ZGlmZiAtLWdpdCBhL0NSRURJVFMgYi9DUkVESVRTCmluZGV4IDA3ZTMyYTguLjQ0ZmNlOTggMTAwNjQ0Ci0tLSBhL0NSRURJVFMKKysrIGIvQ1JFRElUUwpAQCAtNjg4LDEwICs2ODgsMTMgQEAKIAogTjogS2VlcyBDb29rCiBFOiBrZWVzQG91dGZsdXgubmV0Ci1XOiBodHRwOi8vb3V0Zmx1eC5uZXQvCi1QOiAxMDI0RC8xNzA2M0U2RCA5RkEzIEM0OUMgMjNDOSBEMUJDIDJFMzAgIDE5NzUgMUZGRiA0QkE5IDE3MDYgM0U2RAotRDogTWlub3IgdXBkYXRlcyB0byBTQ1NJIHR5cGVzLCBhZGRlZCAvcHJvYy9waWQvbWFwcyBwcm90ZWN0aW9uCitFOiBrZWVzQHVidW50dS5jb20KK0U6IGtlZXNjb29rQGNocm9taXVtLm9yZworVzogaHR0cDovL291dGZsdXgubmV0L2Jsb2cvCitQOiA0MDk2Ui9EQzZEQzAyNiBBNUMzIEY2OEYgMjI5RCBENjBGIDcyM0UgIDZFMTMgODk3MiBGNERGIERDNkQgQzAyNgorRDogVmFyaW91cyBzZWN1cml0eSB0aGluZ3MsIGJ1ZyBmaXhlcywgYW5kIGRvY3VtZW50YXRpb24uCiBTOiAoYXNrIGZvciBjdXJyZW50IGFkZHJlc3MpCitTOiBQb3J0bGFuZCwgT3JlZ29uCiBTOiBVU0EKIAogTjogUm9iaW4gQ29ybmVsaXVzCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1yYmQgYi9Eb2N1bWVudGF0aW9uL0FCSS90ZXN0aW5nL3N5c2ZzLWJ1cy1yYmQKaW5kZXggZmE3MmNjYi4uZGJlZGFmYiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1idXMtcmJkCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtYnVzLXJiZApAQCAtNTcsMTMgKzU3LDYgQEAKIAogCSAkIGVjaG8gPHNuYXAtbmFtZT4gPiAvc3lzL2J1cy9yYmQvZGV2aWNlcy88ZGV2LWlkPi9zbmFwX2NyZWF0ZQogCi1yb2xsYmFja19zbmFwCi0KLQlSb2xscyBiYWNrIGRhdGEgdG8gdGhlIHNwZWNpZmllZCBzbmFwc2hvdC4gVGhpcyBnb2VzIG92ZXIgdGhlIGVudGlyZQotCWxpc3Qgb2YgcmFkb3MgYmxvY2tzIGFuZCBzZW5kcyBhIHJvbGxiYWNrIGNvbW1hbmQgdG8gZWFjaC4KLQotCSAkIGVjaG8gPHNuYXAtbmFtZT4gPiAvc3lzL2J1cy9yYmQvZGV2aWNlcy88ZGV2LWlkPi9zbmFwX3JvbGxiYWNrCi0KIHNuYXBfKgogCiAJQSBkaXJlY3RvcnkgcGVyIGVhY2ggc25hcHNob3QKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kZWJ1Z29iamVjdHMudG1wbCBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9kZWJ1Z29iamVjdHMudG1wbAppbmRleCAwOGZmOTA4Li4yNDk3OWY2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZGVidWdvYmplY3RzLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RlYnVnb2JqZWN0cy50bXBsCkBAIC05Niw2ICs5Niw3IEBACiAJPGxpc3RpdGVtPjxwYXJhPmRlYnVnX29iamVjdF9kZWFjdGl2YXRlPC9wYXJhPjwvbGlzdGl0ZW0+CiAJPGxpc3RpdGVtPjxwYXJhPmRlYnVnX29iamVjdF9kZXN0cm95PC9wYXJhPjwvbGlzdGl0ZW0+CiAJPGxpc3RpdGVtPjxwYXJhPmRlYnVnX29iamVjdF9mcmVlPC9wYXJhPjwvbGlzdGl0ZW0+CisJPGxpc3RpdGVtPjxwYXJhPmRlYnVnX29iamVjdF9hc3NlcnRfaW5pdDwvcGFyYT48L2xpc3RpdGVtPgogICAgICAgPC9pdGVtaXplZGxpc3Q+CiAgICAgICBFYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucyB0YWtlcyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVhbCBvYmplY3QgYW5kCiAgICAgICBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCB0eXBlIHNwZWNpZmljIGRlYnVnIGRlc2NyaXB0aW9uCkBAIC0yNzMsNiArMjc0LDI2IEBACiAJZGVidWcgY2hlY2tzLgogICAgICAgPC9wYXJhPgogICAgIDwvc2VjdDE+CisKKyAgICA8c2VjdDEgaWQ9ImRlYnVnX29iamVjdF9hc3NlcnRfaW5pdCI+CisgICAgICA8dGl0bGU+ZGVidWdfb2JqZWN0X2Fzc2VydF9pbml0PC90aXRsZT4KKyAgICAgIDxwYXJhPgorCVRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGFzc2VydCB0aGF0IGFuIG9iamVjdCBoYXMgYmVlbgorCWluaXRpYWxpemVkLgorICAgICAgPC9wYXJhPgorICAgICAgPHBhcmE+CisJV2hlbiB0aGUgcmVhbCBvYmplY3QgaXMgbm90IHRyYWNrZWQgYnkgZGVidWdvYmplY3RzLCBpdCBjYWxscworCWZpeHVwX2Fzc2VydF9pbml0IG9mIHRoZSBvYmplY3QgdHlwZSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUKKwlwcm92aWRlZCBieSB0aGUgY2FsbGVyLCB3aXRoIHRoZSBoYXJkY29kZWQgb2JqZWN0IHN0YXRlCisJT0RFQlVHX05PVF9BVkFJTEFCTEUuIFRoZSBmaXh1cCBmdW5jdGlvbiBjYW4gY29ycmVjdCB0aGUgcHJvYmxlbQorCWJ5IGNhbGxpbmcgZGVidWdfb2JqZWN0X2luaXQgYW5kIG90aGVyIHNwZWNpZmljIGluaXRpYWxpemluZworCWZ1bmN0aW9ucy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorCVdoZW4gdGhlIHJlYWwgb2JqZWN0IGlzIGFscmVhZHkgdHJhY2tlZCBieSBkZWJ1Z29iamVjdHMgaXQgaXMKKwlpZ25vcmVkLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdDE+CiAgIDwvY2hhcHRlcj4KICAgPGNoYXB0ZXIgaWQ9ImZpeHVwZnVuY3Rpb25zIj4KICAgICA8dGl0bGU+Rml4dXAgZnVuY3Rpb25zPC90aXRsZT4KQEAgLTM4MSw2ICs0MDIsMzUgQEAKIAlzdGF0aXN0aWNzLgogICAgICAgPC9wYXJhPgogICAgIDwvc2VjdDE+CisgICAgPHNlY3QxIGlkPSJmaXh1cF9hc3NlcnRfaW5pdCI+CisgICAgICA8dGl0bGU+Zml4dXBfYXNzZXJ0X2luaXQ8L3RpdGxlPgorICAgICAgPHBhcmE+CisJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZnJvbSB0aGUgZGVidWcgY29kZSB3aGVuZXZlciBhIHByb2JsZW0KKwlpbiBkZWJ1Z19vYmplY3RfYXNzZXJ0X2luaXQgaXMgZGV0ZWN0ZWQuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKwlDYWxsZWQgZnJvbSBkZWJ1Z19vYmplY3RfYXNzZXJ0X2luaXQoKSB3aXRoIGEgaGFyZGNvZGVkIHN0YXRlCisJT0RFQlVHX1NUQVRFX05PVEFWQUlMQUJMRSB3aGVuIHRoZSBvYmplY3QgaXMgbm90IGZvdW5kIGluIHRoZQorCWRlYnVnIGJ1Y2tldC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorCVRoZSBmdW5jdGlvbiByZXR1cm5zIDEgd2hlbiB0aGUgZml4dXAgd2FzIHN1Y2Nlc3NmdWwsCisJb3RoZXJ3aXNlIDAuIFRoZSByZXR1cm4gdmFsdWUgaXMgdXNlZCB0byB1cGRhdGUgdGhlCisJc3RhdGlzdGljcy4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorCU5vdGUsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG1ha2Ugc3VyZSBkZWJ1Z19vYmplY3RfaW5pdCgpIGlzCisJY2FsbGVkIGJlZm9yZSByZXR1cm5pbmcuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKwlUaGUgaGFuZGxpbmcgb2Ygc3RhdGljYWxseSBpbml0aWFsaXplZCBvYmplY3RzIGlzIGEgc3BlY2lhbAorCWNhc2UuIFRoZSBmaXh1cCBmdW5jdGlvbiBzaG91bGQgY2hlY2sgaWYgdGhpcyBpcyBhIGxlZ2l0aW1hdGUKKwljYXNlIG9mIGEgc3RhdGljYWxseSBpbml0aWFsaXplZCBvYmplY3Qgb3Igbm90LiBJbiB0aGlzIGNhc2Ugb25seQorCWRlYnVnX29iamVjdF9pbml0KCkgc2hvdWxkIGJlIGNhbGxlZCB0byBtYWtlIHRoZSBvYmplY3Qga25vd24gdG8KKwl0aGUgdHJhY2tlci4gVGhlbiB0aGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiAwIGJlY2F1c2UgdGhpcyBpcyBub3QKKwlhIHJlYWwgZml4dXAuCisgICAgICA8L3BhcmE+CisgICAgPC9zZWN0MT4KICAgPC9jaGFwdGVyPgogICA8Y2hhcHRlciBpZD0iYnVncyI+CiAgICAgPHRpdGxlPktub3duIEJ1Z3MgQW5kIEFzc3VtcHRpb25zPC90aXRsZT4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9jaGVja2xpc3QudHh0CmluZGV4IDBjMTM0ZjguLmJmZjJkOGIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVL2NoZWNrbGlzdC50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9SQ1UvY2hlY2tsaXN0LnR4dApAQCAtMzI4LDYgKzMyOCwxMiBAQAogCVJDVSByYXRoZXIgdGhhbiBTUkNVLCBiZWNhdXNlIFJDVSBpcyBhbG1vc3QgYWx3YXlzIGZhc3RlciBhbmQKIAllYXNpZXIgdG8gdXNlIHRoYW4gaXMgU1JDVS4KIAorCUlmIHlvdSBuZWVkIHRvIGVudGVyIHlvdXIgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24gaW4gYQorCWhhcmRpcnEgb3IgZXhjZXB0aW9uIGhhbmRsZXIsIGFuZCB0aGVuIGV4aXQgdGhhdCBzYW1lIHJlYWQtc2lkZQorCWNyaXRpY2FsIHNlY3Rpb24gaW4gdGhlIHRhc2sgdGhhdCB3YXMgaW50ZXJydXB0ZWQsIHRoZW4geW91IG5lZWQKKwl0byBzcmN1X3JlYWRfbG9ja19yYXcoKSBhbmQgc3JjdV9yZWFkX3VubG9ja19yYXcoKSwgd2hpY2ggYXZvaWQKKwl0aGUgbG9ja2RlcCBjaGVja2luZyB0aGF0IHdvdWxkIG90aGVyd2lzZSB0aGlzIHByYWN0aWNlIGlsbGVnYWwuCisKIAlBbHNvIHVubGlrZSBvdGhlciBmb3JtcyBvZiBSQ1UsIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uCiAJYW5kIGNsZWFudXAgaXMgcmVxdWlyZWQgdmlhIGluaXRfc3JjdV9zdHJ1Y3QoKSBhbmQKIAljbGVhbnVwX3NyY3Vfc3RydWN0KCkuCVRoZXNlIGFyZSBwYXNzZWQgYSAic3RydWN0IHNyY3Vfc3RydWN0IgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvcmN1LnR4dCBiL0RvY3VtZW50YXRpb24vUkNVL3JjdS50eHQKaW5kZXggMzE4NTI3MC4uYmY3NzgzMyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvcmN1LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS9yY3UudHh0CkBAIC0zOCwxMSArMzgsMTEgQEAKIAogCVByZWVtcHRpYmxlIHZhcmlhbnRzIG9mIFJDVSAoQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UpIGdldCB0aGUKIAlzYW1lIGVmZmVjdCwgYnV0IHJlcXVpcmUgdGhhdCB0aGUgcmVhZGVycyBtYW5pcHVsYXRlIENQVS1sb2NhbAotCWNvdW50ZXJzLiAgVGhlc2UgY291bnRlcnMgYWxsb3cgbGltaXRlZCB0eXBlcyBvZiBibG9ja2luZwotCXdpdGhpbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zLiAgU1JDVSBhbHNvIHVzZXMKLQlDUFUtbG9jYWwgY291bnRlcnMsIGFuZCBwZXJtaXRzIGdlbmVyYWwgYmxvY2tpbmcgd2l0aGluCi0JUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucy4gIFRoZXNlIHR3byB2YXJpYW50cyBvZgotCVJDVSBkZXRlY3QgZ3JhY2UgcGVyaW9kcyBieSBzYW1wbGluZyB0aGVzZSBjb3VudGVycy4KKwljb3VudGVycy4gIFRoZXNlIGNvdW50ZXJzIGFsbG93IGxpbWl0ZWQgdHlwZXMgb2YgYmxvY2tpbmcgd2l0aGluCisJUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucy4gIFNSQ1UgYWxzbyB1c2VzIENQVS1sb2NhbAorCWNvdW50ZXJzLCBhbmQgcGVybWl0cyBnZW5lcmFsIGJsb2NraW5nIHdpdGhpbiBSQ1UgcmVhZC1zaWRlCisJY3JpdGljYWwgc2VjdGlvbnMuICBUaGVzZSB2YXJpYW50cyBvZiBSQ1UgZGV0ZWN0IGdyYWNlIHBlcmlvZHMKKwlieSBzYW1wbGluZyB0aGVzZSBjb3VudGVycy4KIAogbwlJZiBJIGFtIHJ1bm5pbmcgb24gYSB1bmlwcm9jZXNzb3Iga2VybmVsLCB3aGljaCBjYW4gb25seSBkbyBvbmUKIAl0aGluZyBhdCBhIHRpbWUsIHdoeSBzaG91bGQgSSB3YWl0IGZvciBhIGdyYWNlIHBlcmlvZD8KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vUkNVL3N0YWxsd2Fybi50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS9zdGFsbHdhcm4udHh0CmluZGV4IDRlOTU5MjAuLjA4M2Q4OGMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVL3N0YWxsd2Fybi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9SQ1Uvc3RhbGx3YXJuLnR4dApAQCAtMTAxLDYgKzEwMSwxMSBAQAogCUNPTkZJR19UUkVFX1BSRUVNUFRfUkNVIGNhc2UsIHlvdSBtaWdodCBzZWUgc3RhbGwtd2FybmluZwogCW1lc3NhZ2VzLgogCitvCUEgaGFyZHdhcmUgb3Igc29mdHdhcmUgaXNzdWUgc2h1dHMgb2ZmIHRoZSBzY2hlZHVsZXItY2xvY2sKKwlpbnRlcnJ1cHQgb24gYSBDUFUgdGhhdCBpcyBub3QgaW4gZHludGljay1pZGxlIG1vZGUuICBUaGlzCisJcHJvYmxlbSByZWFsbHkgaGFzIGhhcHBlbmVkLCBhbmQgc2VlbXMgdG8gYmUgbW9zdCBsaWtlbHkgdG8KKwlyZXN1bHQgaW4gUkNVIENQVSBzdGFsbCB3YXJuaW5ncyBmb3IgQ09ORklHX05PX0haPW4ga2VybmVscy4KKwogbwlBIGJ1ZyBpbiB0aGUgUkNVIGltcGxlbWVudGF0aW9uLgogCiBvCUEgaGFyZHdhcmUgZmFpbHVyZS4gIFRoaXMgaXMgcXVpdGUgdW5saWtlbHksIGJ1dCBoYXMgb2NjdXJyZWQKQEAgLTEwOSwxMiArMTE0LDExIEBACiAJVGhpcyByZXN1bHRlZCBpbiBhIHNlcmllcyBvZiBSQ1UgQ1BVIHN0YWxsIHdhcm5pbmdzLCBldmVudHVhbGx5CiAJbGVhZGluZyB0aGUgcmVhbGl6YXRpb24gdGhhdCB0aGUgQ1BVIGhhZCBmYWlsZWQuCiAKLVRoZSBSQ1UsIFJDVS1zY2hlZCwgYW5kIFJDVS1iaCBpbXBsZW1lbnRhdGlvbnMgaGF2ZSBDUFUgc3RhbGwKLXdhcm5pbmcuICBTUkNVIGRvZXMgbm90IGhhdmUgaXRzIG93biBDUFUgc3RhbGwgd2FybmluZ3MsIGJ1dCBpdHMKLWNhbGxzIHRvIHN5bmNocm9uaXplX3NjaGVkKCkgd2lsbCByZXN1bHQgaW4gUkNVLXNjaGVkIGRldGVjdGluZwotUkNVLXNjaGVkLXJlbGF0ZWQgQ1BVIHN0YWxscy4gIFBsZWFzZSBub3RlIHRoYXQgUkNVIG9ubHkgZGV0ZWN0cwotQ1BVIHN0YWxscyB3aGVuIHRoZXJlIGlzIGEgZ3JhY2UgcGVyaW9kIGluIHByb2dyZXNzLiAgTm8gZ3JhY2UgcGVyaW9kLAotbm8gQ1BVIHN0YWxsIHdhcm5pbmdzLgorVGhlIFJDVSwgUkNVLXNjaGVkLCBhbmQgUkNVLWJoIGltcGxlbWVudGF0aW9ucyBoYXZlIENQVSBzdGFsbCB3YXJuaW5nLgorU1JDVSBkb2VzIG5vdCBoYXZlIGl0cyBvd24gQ1BVIHN0YWxsIHdhcm5pbmdzLCBidXQgaXRzIGNhbGxzIHRvCitzeW5jaHJvbml6ZV9zY2hlZCgpIHdpbGwgcmVzdWx0IGluIFJDVS1zY2hlZCBkZXRlY3RpbmcgUkNVLXNjaGVkLXJlbGF0ZWQKK0NQVSBzdGFsbHMuICBQbGVhc2Ugbm90ZSB0aGF0IFJDVSBvbmx5IGRldGVjdHMgQ1BVIHN0YWxscyB3aGVuIHRoZXJlIGlzCithIGdyYWNlIHBlcmlvZCBpbiBwcm9ncmVzcy4gIE5vIGdyYWNlIHBlcmlvZCwgbm8gQ1BVIHN0YWxsIHdhcm5pbmdzLgogCiBUbyBkaWFnbm9zZSB0aGUgY2F1c2Ugb2YgdGhlIHN0YWxsLCBpbnNwZWN0IHRoZSBzdGFjayB0cmFjZXMuCiBUaGUgb2ZmZW5kaW5nIGZ1bmN0aW9uIHdpbGwgdXN1YWxseSBiZSBuZWFyIHRoZSB0b3Agb2YgdGhlIHN0YWNrLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvdG9ydHVyZS50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS90b3J0dXJlLnR4dAppbmRleCA3ODNkNmMxLi5kNjcwNjhkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS90b3J0dXJlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS90b3J0dXJlLnR4dApAQCAtNjEsMTEgKzYxLDI0IEBACiAJCVRvIHByb3Blcmx5IGV4ZXJjaXNlIFJDVSBpbXBsZW1lbnRhdGlvbnMgd2l0aCBwcmVlbXB0aWJsZQogCQlyZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMuCiAKK29ub2ZmX2ludGVydmFsCisJCVRoZSBudW1iZXIgb2Ygc2Vjb25kcyBiZXR3ZWVuIGVhY2ggYXR0ZW1wdCB0byBleGVjdXRlIGEKKwkJcmFuZG9tbHkgc2VsZWN0ZWQgQ1BVLWhvdHBsdWcgb3BlcmF0aW9uLiAgRGVmYXVsdHMgdG8KKwkJemVybywgd2hpY2ggZGlzYWJsZXMgQ1BVIGhvdHBsdWdnaW5nLiAgSW4gSE9UUExVR19DUFU9bgorCQlrZXJuZWxzLCByY3V0b3J0dXJlIHdpbGwgc2lsZW50bHkgcmVmdXNlIHRvIGRvIGFueQorCQlDUFUtaG90cGx1ZyBvcGVyYXRpb25zIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB2YWx1ZSBpcworCQlzcGVjaWZpZWQgZm9yIG9ub2ZmX2ludGVydmFsLgorCiBzaHVmZmxlX2ludGVydmFsCiAJCVRoZSBudW1iZXIgb2Ygc2Vjb25kcyB0byBrZWVwIHRoZSB0ZXN0IHRocmVhZHMgYWZmaW5pdGllZAogCQl0byBhIHBhcnRpY3VsYXIgc3Vic2V0IG9mIHRoZSBDUFVzLCBkZWZhdWx0cyB0byAzIHNlY29uZHMuCiAJCVVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0ZXN0X25vX2lkbGVfaHouCiAKK3NodXRkb3duX3NlY3MJVGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHJ1biB0aGUgdGVzdCBiZWZvcmUgdGVybWluYXRpbmcKKwkJdGhlIHRlc3QgYW5kIHBvd2VyaW5nIG9mZiB0aGUgc3lzdGVtLiAgVGhlIGRlZmF1bHQgaXMKKwkJemVybywgd2hpY2ggZGlzYWJsZXMgdGVzdCB0ZXJtaW5hdGlvbiBhbmQgc3lzdGVtIHNodXRkb3duLgorCQlUaGlzIGNhcGFiaWxpdHkgaXMgdXNlZnVsIGZvciBhdXRvbWF0ZWQgdGVzdGluZy4KKwogc3RhdF9pbnRlcnZhbAlUaGUgbnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBvdXRwdXQgb2YgdG9ydHVyZQogCQlzdGF0aXN0aWNzICh2aWEgcHJpbnRrKCkpLiAgUmVnYXJkbGVzcyBvZiB0aGUgaW50ZXJ2YWwsCiAJCXN0YXRpc3RpY3MgYXJlIHByaW50ZWQgd2hlbiB0aGUgbW9kdWxlIGlzIHVubG9hZGVkLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9SQ1UvdHJhY2UudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1UvdHJhY2UudHh0CmluZGV4IGFhZjY1ZjYuLjQ5NTg3YWIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vUkNVL3RyYWNlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL1JDVS90cmFjZS50eHQKQEAgLTEwNSwxNCArMTA1LDEwIEBACiAJb3Igb25lIGdyZWF0ZXIgdGhhbiB0aGUgaW50ZXJydXB0LW5lc3RpbmcgZGVwdGggb3RoZXJ3aXNlLgogCVRoZSBudW1iZXIgYWZ0ZXIgdGhlIHNlY29uZCAiLyIgaXMgdGhlIE5NSSBuZXN0aW5nIGRlcHRoLgogCi0JVGhpcyBmaWVsZCBpcyBkaXNwbGF5ZWQgb25seSBmb3IgQ09ORklHX05PX0haIGtlcm5lbHMuCi0KIG8JImRmIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgc29tZSBvdGhlciBDUFUgaGFzIGZvcmNlZCBhCiAJcXVpZXNjZW50IHN0YXRlIG9uIGJlaGFsZiBvZiB0aGlzIENQVSBkdWUgdG8gdGhpcyBDUFUgYmVpbmcgaW4KIAlkeW50aWNrcy1pZGxlIHN0YXRlLgogCi0JVGhpcyBmaWVsZCBpcyBkaXNwbGF5ZWQgb25seSBmb3IgQ09ORklHX05PX0haIGtlcm5lbHMuCi0KIG8JIm9mIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgc29tZSBvdGhlciBDUFUgaGFzIGZvcmNlZCBhCiAJcXVpZXNjZW50IHN0YXRlIG9uIGJlaGFsZiBvZiB0aGlzIENQVSBkdWUgdG8gdGhpcyBDUFUgYmVpbmcKIAlvZmZsaW5lLiAgSW4gYSBwZXJmZWN0IHdvcmxkLCB0aGlzIG1pZ2h0IG5ldmVyIGhhcHBlbiwgYnV0IGl0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UudHh0IGIvRG9jdW1lbnRhdGlvbi9SQ1Uvd2hhdGlzUkNVLnR4dAppbmRleCA2ZWY2OTI2Li42YmJlOGRjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL1JDVS93aGF0aXNSQ1UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3doYXRpc1JDVS50eHQKQEAgLTQsNiArNCw3IEBACiAxLglXaGF0IGlzIFJDVSwgRnVuZGFtZW50YWxseT8gIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzI2MjQ2NC8KIDIuCVdoYXQgaXMgUkNVPyBQYXJ0IDI6IFVzYWdlICAgaHR0cDovL2x3bi5uZXQvQXJ0aWNsZXMvMjYzMTMwLwogMy4JUkNVIHBhcnQgMzogdGhlIFJDVSBBUEkgICAgICBodHRwOi8vbHduLm5ldC9BcnRpY2xlcy8yNjQwOTAvCis0LglUaGUgUkNVIEFQSSwgMjAxMCBFZGl0aW9uICAgIGh0dHA6Ly9sd24ubmV0L0FydGljbGVzLzQxODg1My8KIAogCiBXaGF0IGlzIFJDVT8KQEAgLTgzNCw2ICs4MzUsOCBAQAogCiAJc3JjdV9yZWFkX2xvY2sJCXN5bmNocm9uaXplX3NyY3UJTi9BCiAJc3JjdV9yZWFkX3VubG9jawlzeW5jaHJvbml6ZV9zcmN1X2V4cGVkaXRlZAorCXNyY3VfcmVhZF9sb2NrX3JhdworCXNyY3VfcmVhZF91bmxvY2tfcmF3CiAJc3JjdV9kZXJlZmVyZW5jZQogCiBTUkNVOglJbml0aWFsaXphdGlvbi9jbGVhbnVwCkBAIC04NTUsMjcgKzg1OCwzMyBAQAogCiBhLglXaWxsIHJlYWRlcnMgbmVlZCB0byBibG9jaz8gIElmIHNvLCB5b3UgbmVlZCBTUkNVLgogCi1iLglXaGF0IGFib3V0IHRoZSAtcnQgcGF0Y2hzZXQ/ICBJZiByZWFkZXJzIHdvdWxkIG5lZWQgdG8gYmxvY2sKK2IuCUlzIGl0IG5lY2Vzc2FyeSB0byBzdGFydCBhIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIGluIGEKKwloYXJkaXJxIGhhbmRsZXIgb3IgZXhjZXB0aW9uIGhhbmRsZXIsIGFuZCB0aGVuIHRvIGNvbXBsZXRlCisJdGhpcyByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiBpbiB0aGUgdGFzayB0aGF0IHdhcworCWludGVycnVwdGVkPyAgSWYgc28sIHlvdSBuZWVkIFNSQ1UncyBzcmN1X3JlYWRfbG9ja19yYXcoKSBhbmQKKwlzcmN1X3JlYWRfdW5sb2NrX3JhdygpIHByaW1pdGl2ZXMuCisKK2MuCVdoYXQgYWJvdXQgdGhlIC1ydCBwYXRjaHNldD8gIElmIHJlYWRlcnMgd291bGQgbmVlZCB0byBibG9jawogCWluIGFuIG5vbi1ydCBrZXJuZWwsIHlvdSBuZWVkIFNSQ1UuICBJZiByZWFkZXJzIHdvdWxkIGJsb2NrCiAJaW4gYSAtcnQga2VybmVsLCBidXQgbm90IGluIGEgbm9uLXJ0IGtlcm5lbCwgU1JDVSBpcyBub3QKIAluZWNlc3NhcnkuCiAKLWMuCURvIHlvdSBuZWVkIHRvIHRyZWF0IE5NSSBoYW5kbGVycywgaGFyZGlycSBoYW5kbGVycywKK2QuCURvIHlvdSBuZWVkIHRvIHRyZWF0IE5NSSBoYW5kbGVycywgaGFyZGlycSBoYW5kbGVycywKIAlhbmQgY29kZSBzZWdtZW50cyB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQgKHdoZXRoZXIKIAl2aWEgcHJlZW1wdF9kaXNhYmxlKCksIGxvY2FsX2lycV9zYXZlKCksIGxvY2FsX2JoX2Rpc2FibGUoKSwKIAlvciBzb21lIG90aGVyIG1lY2hhbmlzbSkgYXMgaWYgdGhleSB3ZXJlIGV4cGxpY2l0IFJDVSByZWFkZXJzPwogCUlmIHNvLCB5b3UgbmVlZCBSQ1Utc2NoZWQuCiAKLWQuCURvIHlvdSBuZWVkIFJDVSBncmFjZSBwZXJpb2RzIHRvIGNvbXBsZXRlIGV2ZW4gaW4gdGhlIGZhY2UKK2UuCURvIHlvdSBuZWVkIFJDVSBncmFjZSBwZXJpb2RzIHRvIGNvbXBsZXRlIGV2ZW4gaW4gdGhlIGZhY2UKIAlvZiBzb2Z0aXJxIG1vbm9wb2xpemF0aW9uIG9mIG9uZSBvciBtb3JlIG9mIHRoZSBDUFVzPyAgRm9yCiAJZXhhbXBsZSwgaXMgeW91ciBjb2RlIHN1YmplY3QgdG8gbmV0d29yay1iYXNlZCBkZW5pYWwtb2Ytc2VydmljZQogCWF0dGFja3M/ICBJZiBzbywgeW91IG5lZWQgUkNVLWJoLgogCi1lLglJcyB5b3VyIHdvcmtsb2FkIHRvbyB1cGRhdGUtaW50ZW5zaXZlIGZvciBub3JtYWwgdXNlIG9mCitmLglJcyB5b3VyIHdvcmtsb2FkIHRvbyB1cGRhdGUtaW50ZW5zaXZlIGZvciBub3JtYWwgdXNlIG9mCiAJUkNVLCBidXQgaW5hcHByb3ByaWF0ZSBmb3Igb3RoZXIgc3luY2hyb25pemF0aW9uIG1lY2hhbmlzbXM/CiAJSWYgc28sIGNvbnNpZGVyIFNMQUJfREVTVFJPWV9CWV9SQ1UuICBCdXQgcGxlYXNlIGJlIGNhcmVmdWwhCiAKLWYuCU90aGVyd2lzZSwgdXNlIFJDVS4KK2cuCU90aGVyd2lzZSwgdXNlIFJDVS4KIAogT2YgY291cnNlLCB0aGlzIGFsbCBhc3N1bWVzIHRoYXQgeW91IGhhdmUgZGV0ZXJtaW5lZCB0aGF0IFJDVSBpcyBpbiBmYWN0CiB0aGUgcmlnaHQgdG9vbCBmb3IgeW91ciBqb2IuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2F0b21pY19vcHMudHh0IGIvRG9jdW1lbnRhdGlvbi9hdG9taWNfb3BzLnR4dAppbmRleCAzYmQ1ODViLi4yN2YyYjIxIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2F0b21pY19vcHMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vYXRvbWljX29wcy50eHQKQEAgLTg0LDYgKzg0LDkzIEBACiAKICoqKiBZT1UgSEFWRSBCRUVOIFdBUk5FRCEgKioqCiAKK1Byb3Blcmx5IGFsaWduZWQgcG9pbnRlcnMsIGxvbmdzLCBpbnRzLCBhbmQgY2hhcnMgKGFuZCB1bnNpZ25lZAorZXF1aXZhbGVudHMpIG1heSBiZSBhdG9taWNhbGx5IGxvYWRlZCBmcm9tIGFuZCBzdG9yZWQgdG8gaW4gdGhlIHNhbWUKK3NlbnNlIGFzIGRlc2NyaWJlZCBmb3IgYXRvbWljX3JlYWQoKSBhbmQgYXRvbWljX3NldCgpLiAgVGhlIEFDQ0VTU19PTkNFKCkKK21hY3JvIHNob3VsZCBiZSB1c2VkIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyIGZyb20gdXNpbmcgb3B0aW1pemF0aW9ucwordGhhdCBtaWdodCBvdGhlcndpc2Ugb3B0aW1pemUgYWNjZXNzZXMgb3V0IG9mIGV4aXN0ZW5jZSBvbiB0aGUgb25lIGhhbmQsCitvciB0aGF0IG1pZ2h0IGNyZWF0ZSB1bnNvbGljaXRlZCBhY2Nlc3NlcyBvbiB0aGUgb3RoZXIuCisKK0ZvciBleGFtcGxlIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgY29kZToKKworCXdoaWxlIChhID4gMCkKKwkJZG9fc29tZXRoaW5nKCk7CisKK0lmIHRoZSBjb21waWxlciBjYW4gcHJvdmUgdGhhdCBkb19zb21ldGhpbmcoKSBkb2VzIG5vdCBzdG9yZSB0byB0aGUKK3ZhcmlhYmxlIGEsIHRoZW4gdGhlIGNvbXBpbGVyIGlzIHdpdGhpbiBpdHMgcmlnaHRzIHRyYW5zZm9ybWluZyB0aGlzIHRvCit0aGUgZm9sbG93aW5nOgorCisJdG1wID0gYTsKKwlpZiAoYSA+IDApCisJCWZvciAoOzspCisJCQlkb19zb21ldGhpbmcoKTsKKworSWYgeW91IGRvbid0IHdhbnQgdGhlIGNvbXBpbGVyIHRvIGRvIHRoaXMgKGFuZCB5b3UgcHJvYmFibHkgZG9uJ3QpLCB0aGVuCit5b3Ugc2hvdWxkIHVzZSBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nOgorCisJd2hpbGUgKEFDQ0VTU19PTkNFKGEpIDwgMCkKKwkJZG9fc29tZXRoaW5nKCk7CisKK0FsdGVybmF0aXZlbHksIHlvdSBjb3VsZCBwbGFjZSBhIGJhcnJpZXIoKSBjYWxsIGluIHRoZSBsb29wLgorCitGb3IgYW5vdGhlciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGNvZGU6CisKKwl0bXBfYSA9IGE7CisJZG9fc29tZXRoaW5nX3dpdGgodG1wX2EpOworCWRvX3NvbWV0aGluZ19lbHNlX3dpdGgodG1wX2EpOworCitJZiB0aGUgY29tcGlsZXIgY2FuIHByb3ZlIHRoYXQgZG9fc29tZXRoaW5nX3dpdGgoKSBkb2VzIG5vdCBzdG9yZSB0byB0aGUKK3ZhcmlhYmxlIGEsIHRoZW4gdGhlIGNvbXBpbGVyIGlzIHdpdGhpbiBpdHMgcmlnaHRzIHRvIG1hbnVmYWN0dXJlIGFuCithZGRpdGlvbmFsIGxvYWQgYXMgZm9sbG93czoKKworCXRtcF9hID0gYTsKKwlkb19zb21ldGhpbmdfd2l0aCh0bXBfYSk7CisJdG1wX2EgPSBhOworCWRvX3NvbWV0aGluZ19lbHNlX3dpdGgodG1wX2EpOworCitUaGlzIGNvdWxkIGZhdGFsbHkgY29uZnVzZSB5b3VyIGNvZGUgaWYgaXQgZXhwZWN0ZWQgdGhlIHNhbWUgdmFsdWUKK3RvIGJlIHBhc3NlZCB0byBkb19zb21ldGhpbmdfd2l0aCgpIGFuZCBkb19zb21ldGhpbmdfZWxzZV93aXRoKCkuCisKK1RoZSBjb21waWxlciB3b3VsZCBiZSBsaWtlbHkgdG8gbWFudWZhY3R1cmUgdGhpcyBhZGRpdGlvbmFsIGxvYWQgaWYKK2RvX3NvbWV0aGluZ193aXRoKCkgd2FzIGFuIGlubGluZSBmdW5jdGlvbiB0aGF0IG1hZGUgdmVyeSBoZWF2eSB1c2UKK29mIHJlZ2lzdGVyczogcmVsb2FkaW5nIGZyb20gdmFyaWFibGUgYSBjb3VsZCBzYXZlIGEgZmx1c2ggdG8gdGhlCitzdGFjayBhbmQgbGF0ZXIgcmVsb2FkLiAgVG8gcHJldmVudCB0aGUgY29tcGlsZXIgZnJvbSBhdHRhY2tpbmcgeW91cgorY29kZSBpbiB0aGlzIG1hbm5lciwgd3JpdGUgdGhlIGZvbGxvd2luZzoKKworCXRtcF9hID0gQUNDRVNTX09OQ0UoYSk7CisJZG9fc29tZXRoaW5nX3dpdGgodG1wX2EpOworCWRvX3NvbWV0aGluZ19lbHNlX3dpdGgodG1wX2EpOworCitGb3IgYSBmaW5hbCBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIGNvZGUsIGFzc3VtaW5nIHRoYXQgdGhlCit2YXJpYWJsZSBhIGlzIHNldCBhdCBib290IHRpbWUgYmVmb3JlIHRoZSBzZWNvbmQgQ1BVIGlzIGJyb3VnaHQgb25saW5lCithbmQgbmV2ZXIgY2hhbmdlZCBsYXRlciwgc28gdGhhdCBtZW1vcnkgYmFycmllcnMgYXJlIG5vdCBuZWVkZWQ6CisKKwlpZiAoYSkKKwkJYiA9IDk7CisJZWxzZQorCQliID0gNDI7CisKK1RoZSBjb21waWxlciBpcyB3aXRoaW4gaXRzIHJpZ2h0cyB0byBtYW51ZmFjdHVyZSBhbiBhZGRpdGlvbmFsIHN0b3JlCitieSB0cmFuc2Zvcm1pbmcgdGhlIGFib3ZlIGNvZGUgaW50byB0aGUgZm9sbG93aW5nOgorCisJYiA9IDQyOworCWlmIChhKQorCQliID0gOTsKKworVGhpcyBjb3VsZCBjb21lIGFzIGEgZmF0YWwgc3VycHJpc2UgdG8gb3RoZXIgY29kZSBydW5uaW5nIGNvbmN1cnJlbnRseQordGhhdCBleHBlY3RlZCBiIHRvIG5ldmVyIGhhdmUgdGhlIHZhbHVlIDQyIGlmIGEgd2FzIHplcm8uICBUbyBwcmV2ZW50Cit0aGUgY29tcGlsZXIgZnJvbSBkb2luZyB0aGlzLCB3cml0ZSBzb21ldGhpbmcgbGlrZToKKworCWlmIChhKQorCQlBQ0NFU1NfT05DRShiKSA9IDk7CisJZWxzZQorCQlBQ0NFU1NfT05DRShiKSA9IDQyOworCitEb24ndCBldmVuIC10aGluay0gYWJvdXQgZG9pbmcgdGhpcyB3aXRob3V0IHByb3BlciB1c2Ugb2YgbWVtb3J5IGJhcnJpZXJzLAorbG9ja3MsIG9yIGF0b21pYyBvcGVyYXRpb25zIGlmIHZhcmlhYmxlIGEgY2FuIGNoYW5nZSBhdCBydW50aW1lIQorCisqKiogV0FSTklORzogQUNDRVNTX09OQ0UoKSBET0VTIE5PVCBJTVBMWSBBIEJBUlJJRVIhICoqKgorCiBOb3csIHdlIG1vdmUgb250byB0aGUgYXRvbWljIG9wZXJhdGlvbiBpbnRlcmZhY2VzIHR5cGljYWxseSBpbXBsZW1lbnRlZCB3aXRoCiB0aGUgaGVscCBvZiBhc3NlbWJseSBjb2RlLgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvbWVtb3J5LnR4dCBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0CmluZGV4IGNjMGViYzUuLjRkODc3NGYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vY2dyb3Vwcy9tZW1vcnkudHh0CkBAIC00NCw4ICs0NCw4IEBACiAgLSBvb20ta2lsbGVyIGRpc2FibGUga25vYiBhbmQgb29tLW5vdGlmaWVyCiAgLSBSb290IGNncm91cCBoYXMgbm8gbGltaXQgY29udHJvbHMuCiAKLSBLZXJuZWwgbWVtb3J5IGFuZCBIdWdlcGFnZXMgYXJlIG5vdCB1bmRlciBjb250cm9sIHlldC4gV2UganVzdCBtYW5hZ2UKLSBwYWdlcyBvbiBMUlUuIFRvIGFkZCBtb3JlIGNvbnRyb2xzLCB3ZSBoYXZlIHRvIHRha2UgY2FyZSBvZiBwZXJmb3JtYW5jZS4KKyBLZXJuZWwgbWVtb3J5IHN1cHBvcnQgaXMgd29yayBpbiBwcm9ncmVzcywgYW5kIHRoZSBjdXJyZW50IHZlcnNpb24gcHJvdmlkZXMKKyBiYXNpY2FsbHkgZnVuY3Rpb25hbGl0eS4gKFNlZSBTZWN0aW9uIDIuNykKIAogQnJpZWYgc3VtbWFyeSBvZiBjb250cm9sIGZpbGVzLgogCkBAIC03Miw2ICs3Miw5IEBACiAgbWVtb3J5Lm9vbV9jb250cm9sCQkgIyBzZXQvc2hvdyBvb20gY29udHJvbHMuCiAgbWVtb3J5Lm51bWFfc3RhdAkJICMgc2hvdyB0aGUgbnVtYmVyIG9mIG1lbW9yeSB1c2FnZSBwZXIgbnVtYSBub2RlCiAKKyBtZW1vcnkua21lbS50Y3AubGltaXRfaW5fYnl0ZXMgICMgc2V0L3Nob3cgaGFyZCBsaW1pdCBmb3IgdGNwIGJ1ZiBtZW1vcnkKKyBtZW1vcnkua21lbS50Y3AudXNhZ2VfaW5fYnl0ZXMgICMgc2hvdyBjdXJyZW50IHRjcCBidWYgbWVtb3J5IGFsbG9jYXRpb24KKwogMS4gSGlzdG9yeQogCiBUaGUgbWVtb3J5IGNvbnRyb2xsZXIgaGFzIGEgbG9uZyBoaXN0b3J5LiBBIHJlcXVlc3QgZm9yIGNvbW1lbnRzIGZvciB0aGUgbWVtb3J5CkBAIC0yNTUsNiArMjU4LDI3IEBACiAgIHBlci16b25lLXBlci1jZ3JvdXAgTFJVIChjZ3JvdXAncyBwcml2YXRlIExSVSkgaXMganVzdCBndWFyZGVkIGJ5CiAgIHpvbmUtPmxydV9sb2NrLCBpdCBoYXMgbm8gbG9jayBvZiBpdHMgb3duLgogCisyLjcgS2VybmVsIE1lbW9yeSBFeHRlbnNpb24gKENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX0tNRU0pCisKK1dpdGggdGhlIEtlcm5lbCBtZW1vcnkgZXh0ZW5zaW9uLCB0aGUgTWVtb3J5IENvbnRyb2xsZXIgaXMgYWJsZSB0byBsaW1pdAordGhlIGFtb3VudCBvZiBrZXJuZWwgbWVtb3J5IHVzZWQgYnkgdGhlIHN5c3RlbS4gS2VybmVsIG1lbW9yeSBpcyBmdW5kYW1lbnRhbGx5CitkaWZmZXJlbnQgdGhhbiB1c2VyIG1lbW9yeSwgc2luY2UgaXQgY2FuJ3QgYmUgc3dhcHBlZCBvdXQsIHdoaWNoIG1ha2VzIGl0Citwb3NzaWJsZSB0byBEb1MgdGhlIHN5c3RlbSBieSBjb25zdW1pbmcgdG9vIG11Y2ggb2YgdGhpcyBwcmVjaW91cyByZXNvdXJjZS4KKworS2VybmVsIG1lbW9yeSBsaW1pdHMgYXJlIG5vdCBpbXBvc2VkIGZvciB0aGUgcm9vdCBjZ3JvdXAuIFVzYWdlIGZvciB0aGUgcm9vdAorY2dyb3VwIG1heSBvciBtYXkgbm90IGJlIGFjY291bnRlZC4KKworQ3VycmVudGx5IG5vIHNvZnQgbGltaXQgaXMgaW1wbGVtZW50ZWQgZm9yIGtlcm5lbCBtZW1vcnkuIEl0IGlzIGZ1dHVyZSB3b3JrCit0byB0cmlnZ2VyIHNsYWIgcmVjbGFpbSB3aGVuIHRob3NlIGxpbWl0cyBhcmUgcmVhY2hlZC4KKworMi43LjEgQ3VycmVudCBLZXJuZWwgTWVtb3J5IHJlc291cmNlcyBhY2NvdW50ZWQKKworKiBzb2NrZXRzIG1lbW9yeSBwcmVzc3VyZTogc29tZSBzb2NrZXRzIHByb3RvY29scyBoYXZlIG1lbW9yeSBwcmVzc3VyZQordGhyZXNob2xkcy4gVGhlIE1lbW9yeSBDb250cm9sbGVyIGFsbG93cyB0aGVtIHRvIGJlIGNvbnRyb2xsZWQgaW5kaXZpZHVhbGx5CitwZXIgY2dyb3VwLCBpbnN0ZWFkIG9mIGdsb2JhbGx5LgorCisqIHRjcCBtZW1vcnkgcHJlc3N1cmU6IHNvY2tldHMgbWVtb3J5IHByZXNzdXJlIGZvciB0aGUgdGNwIHByb3RvY29sLgorCiAzLiBVc2VyIEludGVyZmFjZQogCiAwLiBDb25maWd1cmF0aW9uCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2Nncm91cHMvbmV0X3ByaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL25ldF9wcmlvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWIzMjI2Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9jZ3JvdXBzL25ldF9wcmlvLnR4dApAQCAtMCwwICsxLDUzIEBACitOZXR3b3JrIHByaW9yaXR5IGNncm91cAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgTmV0d29yayBwcmlvcml0eSBjZ3JvdXAgcHJvdmlkZXMgYW4gaW50ZXJmYWNlIHRvIGFsbG93IGFuIGFkbWluaXN0cmF0b3IgdG8KK2R5bmFtaWNhbGx5IHNldCB0aGUgcHJpb3JpdHkgb2YgbmV0d29yayB0cmFmZmljIGdlbmVyYXRlZCBieSB2YXJpb3VzCithcHBsaWNhdGlvbnMKKworTm9taW5hbGx5LCBhbiBhcHBsaWNhdGlvbiB3b3VsZCBzZXQgdGhlIHByaW9yaXR5IG9mIGl0cyB0cmFmZmljIHZpYSB0aGUKK1NPX1BSSU9SSVRZIHNvY2tldCBvcHRpb24uICBUaGlzIGhvd2V2ZXIsIGlzIG5vdCBhbHdheXMgcG9zc2libGUgYmVjYXVzZToKKworMSkgVGhlIGFwcGxpY2F0aW9uIG1heSBub3QgaGF2ZSBiZWVuIGNvZGVkIHRvIHNldCB0aGlzIHZhbHVlCisyKSBUaGUgcHJpb3JpdHkgb2YgYXBwbGljYXRpb24gdHJhZmZpYyBpcyBvZnRlbiBhIHNpdGUtc3BlY2lmaWMgYWRtaW5pc3RyYXRpdmUKKyAgIGRlY2lzaW9uIHJhdGhlciB0aGFuIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgb25lLgorCitUaGlzIGNncm91cCBhbGxvd3MgYW4gYWRtaW5pc3RyYXRvciB0byBhc3NpZ24gYSBwcm9jZXNzIHRvIGEgZ3JvdXAgd2hpY2ggZGVmaW5lcwordGhlIHByaW9yaXR5IG9mIGVncmVzcyB0cmFmZmljIG9uIGEgZ2l2ZW4gaW50ZXJmYWNlLiBOZXR3b3JrIHByaW9yaXR5IGdyb3VwcyBjYW4KK2JlIGNyZWF0ZWQgYnkgZmlyc3QgbW91bnRpbmcgdGhlIGNncm91cCBmaWxlc3lzdGVtLgorCisjIG1vdW50IC10IGNncm91cCAtb25ldF9wcmlvIG5vbmUgL3N5cy9mcy9jZ3JvdXAvbmV0X3ByaW8KKworV2l0aCB0aGUgYWJvdmUgc3RlcCwgdGhlIGluaXRpYWwgZ3JvdXAgYWN0aW5nIGFzIHRoZSBwYXJlbnQgYWNjb3VudGluZyBncm91cAorYmVjb21lcyB2aXNpYmxlIGF0ICcvc3lzL2ZzL2Nncm91cC9uZXRfcHJpbycuICBUaGlzIGdyb3VwIGluY2x1ZGVzIGFsbCB0YXNrcyBpbgordGhlIHN5c3RlbS4gJy9zeXMvZnMvY2dyb3VwL25ldF9wcmlvL3Rhc2tzJyBsaXN0cyB0aGUgdGFza3MgaW4gdGhpcyBjZ3JvdXAuCisKK0VhY2ggbmV0X3ByaW8gY2dyb3VwIGNvbnRhaW5zIHR3byBmaWxlcyB0aGF0IGFyZSBzdWJzeXN0ZW0gc3BlY2lmaWMKKworbmV0X3ByaW8ucHJpb2lkeAorVGhpcyBmaWxlIGlzIHJlYWQtb25seSwgYW5kIGlzIHNpbXBseSBpbmZvcm1hdGl2ZS4gIEl0IGNvbnRhaW5zIGEgdW5pcXVlIGludGVnZXIKK3ZhbHVlIHRoYXQgdGhlIGtlcm5lbCB1c2VzIGFzIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY2dyb3VwLgorCituZXRfcHJpby5pZnByaW9tYXAKK1RoaXMgZmlsZSBjb250YWlucyBhIG1hcCBvZiB0aGUgcHJpb3JpdGllcyBhc3NpZ25lZCB0byB0cmFmZmljIG9yaWdpbmF0aW5nIGZyb20KK3Byb2Nlc3NlcyBpbiB0aGlzIGdyb3VwIGFuZCBlZ3Jlc3NpbmcgdGhlIHN5c3RlbSBvbiB2YXJpb3VzIGludGVyZmFjZXMuIEl0Citjb250YWlucyBhIGxpc3Qgb2YgdHVwbGVzIGluIHRoZSBmb3JtIDxpZm5hbWUgcHJpb3JpdHk+LiAgQ29udGVudHMgb2YgdGhpcyBmaWxlCitjYW4gYmUgbW9kaWZpZWQgYnkgZWNob2luZyBhIHN0cmluZyBpbnRvIHRoZSBmaWxlIHVzaW5nIHRoZSBzYW1lIHR1cGxlIGZvcm1hdC4KK2ZvciBleGFtcGxlOgorCitlY2hvICJldGgwIDUiID4gL3N5cy9mcy9jZ3JvdXBzL25ldF9wcmlvL2lzY3NpL25ldF9wcmlvLmlmcHJpb21hcAorCitUaGlzIGNvbW1hbmQgd291bGQgZm9yY2UgYW55IHRyYWZmaWMgb3JpZ2luYXRpbmcgZnJvbSBwcm9jZXNzZXMgYmVsb25naW5nIHRvIHRoZQoraXNjc2kgbmV0X3ByaW8gY2dyb3VwIGFuZCBlZ3Jlc3Npbmcgb24gaW50ZXJmYWNlIGV0aDAgdG8gaGF2ZSB0aGUgcHJpb3JpdHkgb2YKK3NhaWQgdHJhZmZpYyBzZXQgdG8gdGhlIHZhbHVlIDUuIFRoZSBwYXJlbnQgYWNjb3VudGluZyBncm91cCBhbHNvIGhhcyBhCit3cml0ZWFibGUgJ25ldF9wcmlvLmlmcHJpb21hcCcgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHNldCBhIHN5c3RlbSBkZWZhdWx0Citwcmlvcml0eS4KKworUHJpb3JpdGllcyBhcmUgc2V0IGltbWVkaWF0ZWx5IHByaW9yIHRvIHF1ZXVlaW5nIGEgZnJhbWUgdG8gdGhlIGRldmljZQorcXVldWVpbmcgZGlzY2lwbGluZSAocWRpc2MpIHNvIHByaW9yaXRpZXMgd2lsbCBiZSBhc3NpZ25lZCBwcmlvciB0byB0aGUgaGFyZHdhcmUKK3F1ZXVlIHNlbGVjdGlvbiBiZWluZyBtYWRlLgorCitPbmUgdXNhZ2UgZm9yIHRoZSBuZXRfcHJpbyBjZ3JvdXAgaXMgd2l0aCBtcXByaW8gcWRpc2MgYWxsb3dpbmcgYXBwbGljYXRpb24KK3RyYWZmaWMgdG8gYmUgc3RlZXJlZCB0byBoYXJkd2FyZS9kcml2ZXIgYmFzZWQgdHJhZmZpYyBjbGFzc2VzLiBUaGVzZSBtYXBwaW5ncworY2FuIHRoZW4gYmUgbWFuYWdlZCBieSBhZG1pbmlzdHJhdG9ycyBvciBvdGhlciBuZXR3b3JraW5nIHByb3RvY29scyBzdWNoIGFzCitEQ0JYLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9jYWx4ZWRhLXhnbWFjLnR4dCBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvY2FseGVkYS14Z21hYy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExNzI3YQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvY2FseGVkYS14Z21hYy50eHQKQEAgLTAsMCArMSwxNSBAQAorKiBDYWx4ZWRhIEhpZ2hiYW5rIDEwR2IgWEdNQUMgRXRoZXJuZXQKKworUmVxdWlyZWQgcHJvcGVydGllczoKKy0gY29tcGF0aWJsZSA6IFNob3VsZCBiZSAiY2FseGVkYSxoYi14Z21hYyIKKy0gcmVnIDogQWRkcmVzcyBhbmQgbGVuZ3RoIG9mIHRoZSByZWdpc3RlciBzZXQgZm9yIHRoZSBkZXZpY2UKKy0gaW50ZXJydXB0cyA6IFNob3VsZCBjb250YWluIDMgeGdtYWMgaW50ZXJydXB0cy4gVGhlIDFzdCBpcyBtYWluIGludGVycnVwdC4KKyAgVGhlIDJuZCBpcyBwd3IgbWd0IGludGVycnVwdC4gVGhlIDNyZCBpcyBsb3cgcG93ZXIgc3RhdGUgaW50ZXJydXB0LgorCitFeGFtcGxlOgorCitldGhlcm5ldEBmZmY1MDAwMCB7CisgICAgICAgIGNvbXBhdGlibGUgPSAiY2FseGVkYSxoYi14Z21hYyI7CisgICAgICAgIHJlZyA9IDwweGZmZjUwMDAwIDB4MTAwMD47CisgICAgICAgIGludGVycnVwdHMgPSA8MCA3NyA0ICAwIDc4IDQgIDAgNzkgND47Cit9OwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9jYW4vY2M3NzAudHh0IGIvRG9jdW1lbnRhdGlvbi9kZXZpY2V0cmVlL2JpbmRpbmdzL25ldC9jYW4vY2M3NzAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MDI3YmYKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvbmV0L2Nhbi9jYzc3MC50eHQKQEAgLTAsMCArMSw1MyBAQAorTWVtb3J5IG1hcHBlZCBCb3NjaCBDQzc3MCBhbmQgSW50ZWwgQU44MjUyNyBDQU4gY29udHJvbGxlcgorCitOb3RlOiBUaGUgQ0M3NzAgaXMgYSBDQU4gY29udHJvbGxlciBmcm9tIEJvc2NoLCB3aGljaCBpcyAxMDAlCitjb21wYXRpYmxlIHdpdGggdGhlIG9sZCBBTjgyNTI3IGZyb20gSW50ZWwsIGJ1dCB3aXRoICJidWdzIiBiZWluZyBmaXhlZC4KKworUmVxdWlyZWQgcHJvcGVydGllczoKKworLSBjb21wYXRpYmxlIDogc2hvdWxkIGJlICJib3NjaCxjYzc3MCIgZm9yIHRoZSBDQzc3MCBhbmQgImludGMsODI1MjciCisJZm9yIHRoZSBBTjgyNTI3LgorCistIHJlZyA6IHNob3VsZCBzcGVjaWZ5IHRoZSBjaGlwIHNlbGVjdCwgYWRkcmVzcyBvZmZzZXQgYW5kIHNpemUgcmVxdWlyZWQKKwl0byBtYXAgdGhlIHJlZ2lzdGVycyBvZiB0aGUgY29udHJvbGxlci4gVGhlIHNpemUgaXMgdXN1YWxseSAweDgwLgorCistIGludGVycnVwdHMgOiBwcm9wZXJ0eSB3aXRoIGEgdmFsdWUgZGVzY3JpYmluZyB0aGUgaW50ZXJydXB0IHNvdXJjZQorCShudW1iZXIgYW5kIHNlbnNpdGl2aXR5KSByZXF1aXJlZCBmb3IgdGhlIGNvbnRyb2xsZXIuCisKK09wdGlvbmFsIHByb3BlcnRpZXM6CisKKy0gYm9zY2gsZXh0ZXJuYWwtY2xvY2stZnJlcXVlbmN5IDogZnJlcXVlbmN5IG9mIHRoZSBleHRlcm5hbCBvc2NpbGxhdG9yCisJY2xvY2sgaW4gSHouIE5vdGUgdGhhdCB0aGUgaW50ZXJuYWwgY2xvY2sgZnJlcXVlbmN5IHVzZWQgYnkgdGhlCisJY29udHJvbGxlciBpcyBoYWxmIG9mIHRoYXQgdmFsdWUuIElmIG5vdCBzcGVjaWZpZWQsIGEgZGVmYXVsdAorCXZhbHVlIG9mIDE2MDAwMDAwICgxNiBNSHopIGlzIHVzZWQuCisKKy0gYm9zY2gsY2xvY2stb3V0LWZyZXF1ZW5jeSA6IHNsb2NrIGZyZXF1ZW5jeSBpbiBIeiBvbiB0aGUgQ0xLT1VUIHBpbi4KKwlJZiBub3Qgc3BlY2lmaWVkIG9yIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgMCwgdGhlIENMS09VVCBwaW4KKwl3aWxsIGJlIGRpc2FibGVkLgorCistIGJvc2NoLHNsZXctcmF0ZSA6IHNsZXcgcmF0ZSBvZiB0aGUgQ0xLT1VUIHNpZ25hbC4gSWYgbm90IHNwZWNpZmllZCwKKwlhIHJlc29uYWJsZSB2YWx1ZSB3aWxsIGJlIGNhbGN1bGF0ZWQuCisKKy0gYm9zY2gsZGlzY29ubmVjdC1yeDAtaW5wdXQgOiBzZWUgZGF0YSBzaGVldC4KKworLSBib3NjaCxkaXNjb25uZWN0LXJ4MS1pbnB1dCA6IHNlZSBkYXRhIHNoZWV0LgorCistIGJvc2NoLGRpc2Nvbm5lY3QtdHgxLW91dHB1dCA6IHNlZSBkYXRhIHNoZWV0LgorCistIGJvc2NoLHBvbGFyaXR5LWRvbWluYW50IDogc2VlIGRhdGEgc2hlZXQuCisKKy0gYm9zY2gsZGl2aWRlLW1lbW9yeS1jbG9jayA6IHNlZSBkYXRhIHNoZWV0LgorCistIGJvc2NoLGlzby1sb3ctc3BlZWQtbXV4IDogc2VlIGRhdGEgc2hlZXQuCisKK0ZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBwbGVhc2UgaGF2ZSBhIGxvb2sgdG8gdGhlIENDNzcwIG9yIEFOODI1MjcuCisKK0V4YW1wbGVzOgorCitjYW5AMywxMDAgeworCWNvbXBhdGlibGUgPSAiYm9zY2gsY2M3NzAiOworCXJlZyA9IDwzIDB4MTAwIDB4ODA+OworCWludGVycnVwdHMgPSA8MiAwPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwlib3NjaCxleHRlcm5hbC1jbG9jay1mcmVxdWVuY3kgPSA8MTYwMDAwMDA+OworfTsKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9zcmlvLXJtdS50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvc3Jpby1ybXUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YThhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvc3Jpby1ybXUudHh0CkBAIC0wLDAgKzEsMTYzIEBACitNZXNzYWdlIHVuaXQgbm9kZToKKworRm9yIFNSSU8gY29udHJvbGxlcnMgdGhhdCBpbXBsZW1lbnQgdGhlIG1lc3NhZ2UgdW5pdCBhcyBwYXJ0IG9mIHRoZSBjb250cm9sbGVyCit0aGlzIG5vZGUgaXMgcmVxdWlyZWQuICBGb3IgZGV2aWNlcyB3aXRoIFJNQU4gdGhpcyBub2RlIHNob3VsZCBOT1QgZXhpc3QuICBUaGUKK25vZGUgaXMgY29tcG9zZWQgb2YgdGhyZWUgdHlwZXMgb2Ygc3ViLW5vZGVzICgiZnNsLXNyaW8tbXNnLXVuaXQiLAorImZzbC1zcmlvLWRiZWxsLXVuaXQiIGFuZCAiZnNsLXNyaW8tcG9ydC13cml0ZS11bml0IikuCisKK1NlZSBzcmlvLnR4dCBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IGdlbmVyaWMgU1JJTyBjb250cm9sbGVyIGRldGFpbHMuCisKKyAgIC0gY29tcGF0aWJsZQorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxzdHJpbmc+CisJRGVmaW5pdGlvbjogTXVzdCBpbmNsdWRlICJmc2wsc3Jpby1ybXUtdlguWSIsICJmc2wsc3Jpby1ybXUiLgorCisJVGhlIHZlcnNpb24gWC5ZIHNob3VsZCBtYXRjaCB0aGUgZ2VuZXJhbCBTUklPIGNvbnRyb2xsZXIncyBJUCBCbG9jaworCXJldmlzaW9uIHJlZ2lzdGVyJ3MgTWFqb3IoWCkgYW5kIE1pbm9yIChZKSB2YWx1ZS4KKworICAgLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYW5kCisJCWxlbmd0aCBvZiB0aGUgU1JJTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBmb3IgbWVzc2FnZSB1bml0cworCQlhbmQgZG9vcmJlbGwgdW5pdHMuCisKKyAgIC0gZnNsLGxpb2RuCisJVXNhZ2U6IG9wdGlvbmFsLWJ1dC1yZWNvbW1lbmRlZCAoZm9yIGRldmljZXMgd2l0aCBQQU1VKQorCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogVGhlIGxvZ2ljYWwgSS9PIGRldmljZSBudW1iZXIgZm9yIHRoZSBQQU1VIChJT01NVSkgdG8gYmUKKwkJY29ycmVjdGx5IGNvbmZpZ3VyZWQgZm9yIFNSSU8gYWNjZXNzZXMuICBUaGUgcHJvcGVydHkgc2hvdWxkCisJCW5vdCBleGlzdCBvbiBkZXZpY2VzIHRoYXQgZG8gbm90IHN1cHBvcnQgUEFNVS4KKworCQlUaGUgTElPRE4gdmFsdWUgaXMgYXNzb2NpYXRlZCB3aXRoIGFsbCBSTVUgdHJhbnNhY3Rpb25zCisJCShtc2ctdW5pdCwgZG9vcmJlbGwsIHBvcnQtd3JpdGUpLgorCitTdWItTm9kZXMgZm9yIFJNVTogIFRoZSBSTVUgbm9kZSBpcyBjb21wb3NlZCBvZiBtdWx0aXBsZSBzdWItbm9kZXMgdGhhdAorY29ycmVzcG9uZCB0byB0aGUgYWN0dWFsIHN1Yi1jb250cm9sbGVycyBpbiB0aGUgUk1VLiAgVGhlIG1hbnVhbCBmb3IgYSBnaXZlbgorU29DIHdpbGwgZGV0YWlsIHdoaWNoIGFuZCBob3cgbWFueSBvZiB0aGVzZSBzdWItY29udHJvbGxlcnMgYXJlIGltcGxlbWVudGVkLgorCitNZXNzYWdlIFVuaXQ6CisKKyAgIC0gY29tcGF0aWJsZQorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxzdHJpbmc+CisJRGVmaW5pdGlvbjogTXVzdCBpbmNsdWRlICJmc2wsc3Jpby1tc2ctdW5pdC12WC5ZIiwgImZzbCxzcmlvLW1zZy11bml0Ii4KKworCVRoZSB2ZXJzaW9uIFguWSBzaG91bGQgbWF0Y2ggdGhlIGdlbmVyYWwgU1JJTyBjb250cm9sbGVyJ3MgSVAgQmxvY2sKKwlyZXZpc2lvbiByZWdpc3RlcidzIE1ham9yKFgpIGFuZCBNaW5vciAoWSkgdmFsdWUuCisKKyAgIC0gcmVnCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBBIHN0YW5kYXJkIHByb3BlcnR5LiAgU3BlY2lmaWVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIGFuZAorCQlsZW5ndGggb2YgdGhlIFNSSU8gY29uZmlndXJhdGlvbiByZWdpc3RlcnMgZm9yIG1lc3NhZ2UgdW5pdHMKKwkJYW5kIGRvb3JiZWxsIHVuaXRzLgorCisgICAtIGludGVycnVwdHMKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcF9lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246ICBTcGVjaWZpZXMgdGhlIGludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoaXMgZGV2aWNlLiAgVGhlCisJCXZhbHVlIG9mIHRoZSBpbnRlcnJ1cHRzIHByb3BlcnR5IGNvbnNpc3RzIG9mIG9uZSBpbnRlcnJ1cHQKKwkJc3BlY2lmaWVyLiBUaGUgZm9ybWF0IG9mIHRoZSBzcGVjaWZpZXIgaXMgZGVmaW5lZCBieSB0aGUKKwkJYmluZGluZyBkb2N1bWVudCBkZXNjcmliaW5nIHRoZSBub2RlJ3MgaW50ZXJydXB0IHBhcmVudC4KKworCQlBIHBhaXIgb2YgSVJRcyBhcmUgc3BlY2lmaWVkIGluIHRoaXMgcHJvcGVydHkuICBUaGUgZmlyc3QKKwkJZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zbWl0IChUWCkgaW50ZXJydXB0IGFuZCB0aGUKKwkJc2Vjb25kIGVsZW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNlaXZlIChSWCkgaW50ZXJydXB0LgorCitEb29yYmVsbCBVbml0OgorCisgICAtIGNvbXBhdGlibGUKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8c3RyaW5nPgorCURlZmluaXRpb246IE11c3QgaW5jbHVkZToKKwkJImZzbCxzcmlvLWRiZWxsLXVuaXQtdlguWSIsICJmc2wsc3Jpby1kYmVsbC11bml0IgorCisJVGhlIHZlcnNpb24gWC5ZIHNob3VsZCBtYXRjaCB0aGUgZ2VuZXJhbCBTUklPIGNvbnRyb2xsZXIncyBJUCBCbG9jaworCXJldmlzaW9uIHJlZ2lzdGVyJ3MgTWFqb3IoWCkgYW5kIE1pbm9yIChZKSB2YWx1ZS4KKworICAgLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYW5kCisJCWxlbmd0aCBvZiB0aGUgU1JJTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBmb3IgbWVzc2FnZSB1bml0cworCQlhbmQgZG9vcmJlbGwgdW5pdHMuCisKKyAgIC0gaW50ZXJydXB0cworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wX2VuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogIFNwZWNpZmllcyB0aGUgaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhpcyBkZXZpY2UuICBUaGUKKwkJdmFsdWUgb2YgdGhlIGludGVycnVwdHMgcHJvcGVydHkgY29uc2lzdHMgb2Ygb25lIGludGVycnVwdAorCQlzcGVjaWZpZXIuIFRoZSBmb3JtYXQgb2YgdGhlIHNwZWNpZmllciBpcyBkZWZpbmVkIGJ5IHRoZQorCQliaW5kaW5nIGRvY3VtZW50IGRlc2NyaWJpbmcgdGhlIG5vZGUncyBpbnRlcnJ1cHQgcGFyZW50LgorCisJCUEgcGFpciBvZiBJUlFzIGFyZSBzcGVjaWZpZWQgaW4gdGhpcyBwcm9wZXJ0eS4gIFRoZSBmaXJzdAorCQllbGVtZW50IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNtaXQgKFRYKSBpbnRlcnJ1cHQgYW5kIHRoZQorCQlzZWNvbmQgZWxlbWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY2VpdmUgKFJYKSBpbnRlcnJ1cHQuCisKK1BvcnQtV3JpdGUgVW5pdDoKKworICAgLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGU6CisJCSAiZnNsLHNyaW8tcG9ydC13cml0ZS11bml0LXZYLlkiLCAiZnNsLHNyaW8tcG9ydC13cml0ZS11bml0IgorCisJVGhlIHZlcnNpb24gWC5ZIHNob3VsZCBtYXRjaCB0aGUgZ2VuZXJhbCBTUklPIGNvbnRyb2xsZXIncyBJUCBCbG9jaworCXJldmlzaW9uIHJlZ2lzdGVyJ3MgTWFqb3IoWCkgYW5kIE1pbm9yIChZKSB2YWx1ZS4KKworICAgLSByZWcKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcC1lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246IEEgc3RhbmRhcmQgcHJvcGVydHkuICBTcGVjaWZpZXMgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYW5kCisJCWxlbmd0aCBvZiB0aGUgU1JJTyBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyBmb3IgbWVzc2FnZSB1bml0cworCQlhbmQgZG9vcmJlbGwgdW5pdHMuCisKKyAgIC0gaW50ZXJydXB0cworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wX2VuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogIFNwZWNpZmllcyB0aGUgaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhpcyBkZXZpY2UuICBUaGUKKwkJdmFsdWUgb2YgdGhlIGludGVycnVwdHMgcHJvcGVydHkgY29uc2lzdHMgb2Ygb25lIGludGVycnVwdAorCQlzcGVjaWZpZXIuIFRoZSBmb3JtYXQgb2YgdGhlIHNwZWNpZmllciBpcyBkZWZpbmVkIGJ5IHRoZQorCQliaW5kaW5nIGRvY3VtZW50IGRlc2NyaWJpbmcgdGhlIG5vZGUncyBpbnRlcnJ1cHQgcGFyZW50LgorCisJCUEgc2luZ2xlIElSUSB0aGF0IGhhbmRsZXMgcG9ydC13cml0ZSBjb25kaXRpb25zIGlzCisJCXNwZWNpZmllZCBieSB0aGlzIHByb3BlcnR5LiAgKFR5cGljYWxseSBzaGFyZWQgd2l0aCBlcnJvcikuCisKKyAgIE5vdGU6IEFsbCBvdGhlciBzdGFuZGFyZCBwcm9wZXJ0aWVzIChzZWUgdGhlIGVQQVBSKSBhcmUgYWxsb3dlZAorICAgYnV0IGFyZSBvcHRpb25hbC4KKworRXhhbXBsZToKKwlybXU6IHJtdUBkMzAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8tcm11IjsKKwkJcmVnID0gPDB4ZDMwMDAgMHg0MDA+OworCQlyYW5nZXMgPSA8MHgwIDB4ZDMwMDAgMHg0MDA+OworCQlmc2wsbGlvZG4gPSA8MHhjOD47CisKKwkJbWVzc2FnZS11bml0QDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1tc2ctdW5pdCI7CisJCQlyZWcgPSA8MHgwIDB4MTAwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJNjAgMiAwIDAgIC8qIG1zZzFfdHhfaXJxICovCisJCQkJNjEgMiAwIDA+Oy8qIG1zZzFfcnhfaXJxICovCisJCX07CisJCW1lc3NhZ2UtdW5pdEAxMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1tc2ctdW5pdCI7CisJCQlyZWcgPSA8MHgxMDAgMHgxMDA+OworCQkJaW50ZXJydXB0cyA9IDwKKwkJCQk2MiAyIDAgMCAgLyogbXNnMl90eF9pcnEgKi8KKwkJCQk2MyAyIDAgMD47LyogbXNnMl9yeF9pcnEgKi8KKwkJfTsKKwkJZG9vcmJlbGwtdW5pdEA0MDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1kYmVsbC11bml0IjsKKwkJCXJlZyA9IDwweDQwMCAweDgwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJNTYgMiAwIDAgIC8qIGJlbGxfb3V0Yl9pcnEgKi8KKwkJCQk1NyAyIDAgMD47LyogYmVsbF9pbmJfaXJxICovCisJCX07CisJCXBvcnQtd3JpdGUtdW5pdEA0ZTAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1wb3J0LXdyaXRlLXVuaXQiOworCQkJcmVnID0gPDB4NGUwIDB4MjA+OworCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTE+OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvc3Jpby50eHQgYi9Eb2N1bWVudGF0aW9uL2RldmljZXRyZWUvYmluZGluZ3MvcG93ZXJwYy9mc2wvc3Jpby50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzOWJjYgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9wb3dlcnBjL2ZzbC9zcmlvLnR4dApAQCAtMCwwICsxLDEwMyBAQAorKiBGcmVlc2NhbGUgU2VyaWFsIFJhcGlkSU8gKFNSSU8pIENvbnRyb2xsZXIKKworUmFwaWRJTyBwb3J0IG5vZGU6CitQcm9wZXJ0aWVzOgorICAgLSBjb21wYXRpYmxlCisJVXNhZ2U6IHJlcXVpcmVkCisJVmFsdWUgdHlwZTogPHN0cmluZz4KKwlEZWZpbml0aW9uOiBNdXN0IGluY2x1ZGUgImZzbCxzcmlvIiBmb3IgSVAgYmxvY2tzIHdpdGggSVAgQmxvY2sKKwlSZXZpc2lvbiBSZWdpc3RlciAoU1JJTyBJUEJSUjEpIE1ham9yIElEIGVxdWFsIHRvIDB4MDFjMC4KKworCU9wdGlvbmFsbHksIGEgY29tcGF0aWFibGUgc3RyaW5nIG9mICJmc2wsc3Jpby12WC5ZIiB3aGVyZSBYIGlzIE1ham9yCisJdmVyc2lvbiBpbiBJUCBCbG9jayBSZXZpc2lvbiBSZWdpc3RlciBhbmQgWSBpcyBNaW5vciB2ZXJzaW9uLiAgSWYgdGhpcworCWNvbXBhdGlhYmxlIGlzIHByb3ZpZGVkIGl0IHNob3VsZCBiZSBvcmRlcmVkIGJlZm9yZSAiZnNsLHNyaW8iLgorCisgICAtIHJlZworCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gIFNwZWNpZmllcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBhbmQKKwkJbGVuZ3RoIG9mIHRoZSBTUklPIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzLiAgVGhlIHNpemUgc2hvdWxkCisJCWJlIHNldCB0byAweDExMDAwLgorCisgICAtIGludGVycnVwdHMKKwlVc2FnZTogcmVxdWlyZWQKKwlWYWx1ZSB0eXBlOiA8cHJvcF9lbmNvZGVkLWFycmF5PgorCURlZmluaXRpb246ICBTcGVjaWZpZXMgdGhlIGludGVycnVwdHMgZ2VuZXJhdGVkIGJ5IHRoaXMgZGV2aWNlLiAgVGhlCisJCXZhbHVlIG9mIHRoZSBpbnRlcnJ1cHRzIHByb3BlcnR5IGNvbnNpc3RzIG9mIG9uZSBpbnRlcnJ1cHQKKwkJc3BlY2lmaWVyLiBUaGUgZm9ybWF0IG9mIHRoZSBzcGVjaWZpZXIgaXMgZGVmaW5lZCBieSB0aGUKKwkJYmluZGluZyBkb2N1bWVudCBkZXNjcmliaW5nIHRoZSBub2RlJ3MgaW50ZXJydXB0IHBhcmVudC4KKworCQlBIHNpbmdsZSBJUlEgdGhhdCBoYW5kbGVzIGVycm9yIGNvbmRpdGlvbnMgaXMgc3BlY2lmaWVkIGJ5IHRoaXMKKwkJcHJvcGVydHkuICAoVHlwaWNhbGx5IHNoYXJlZCB3aXRoIHBvcnQtd3JpdGUpLgorCisgICAtIGZzbCxzcmlvLXJtdS1oYW5kbGU6CisJVXNhZ2U6IHJlcXVpcmVkIGlmIHJtdSBub2RlIGlzIGRlZmluZWQKKwlWYWx1ZSB0eXBlOiA8cGhhbmRsZT4KKwlEZWZpbml0aW9uOiBBIHNpbmdsZSA8cGhhbmRsZT4gdmFsdWUgdGhhdCBwb2ludHMgdG8gdGhlIFJNVS4KKwkoU2VlIHNyaW8tcm11LnR4dCBmb3IgbW9yZSBkZXRhaWxzIG9uIFJNVSBub2RlIGJpbmRpbmcpCisKK1BvcnQgQ2hpbGQgTm9kZXM6ICBUaGVyZSBzaG91bGQgYSBwb3J0IGNoaWxkIG5vZGUgZm9yIGVhY2ggcG9ydCB0aGF0IGV4aXN0cyBpbgordGhlIGNvbnRyb2xsZXIuICBUaGUgcG9ydHMgYXJlIG51bWJlcmVkIHN0YXJ0aW5nIGF0IG9uZSAoMSkgYW5kIHNob3VsZCBoYXZlCit0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisKKyAgIC0gY2VsbC1pbmRleAorCVVzYWdlOiByZXF1aXJlZAorCVZhbHVlIHR5cGU6IDx1MzI+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gIE1hdGNoZXMgdGhlIHBvcnQgaWQuCisKKyAgIC0gcmFuZ2VzCisJVXNhZ2U6IHJlcXVpcmVkIGlmIGxvY2FsIGFjY2VzcyB3aW5kb3dzIHByZXNldAorCVZhbHVlIHR5cGU6IDxwcm9wLWVuY29kZWQtYXJyYXk+CisJRGVmaW5pdGlvbjogQSBzdGFuZGFyZCBwcm9wZXJ0eS4gVXRpbGl6ZWQgdG8gZGVzY3JpYmUgdGhlIG1lbW9yeSBtYXBwZWQKKwkJSU8gc3BhY2UgdXRpbGl6ZWQgYnkgdGhlIGNvbnRyb2xsZXIuICBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZQorCQlzZXR0aW5nIG9mIHRoZSBsb2NhbCBhY2Nlc3Mgd2luZG93cyB0aGF0IGFyZSB0YXJnZXRlZCB0byB0aGlzCisJCVNSSU8gcG9ydC4KKworICAgLSBmc2wsbGlvZG4KKwlVc2FnZTogb3B0aW9uYWwtYnV0LXJlY29tbWVuZGVkIChmb3IgZGV2aWNlcyB3aXRoIFBBTVUpCisJVmFsdWUgdHlwZTogPHByb3AtZW5jb2RlZC1hcnJheT4KKwlEZWZpbml0aW9uOiBUaGUgbG9naWNhbCBJL08gZGV2aWNlIG51bWJlciBmb3IgdGhlIFBBTVUgKElPTU1VKSB0byBiZQorCQljb3JyZWN0bHkgY29uZmlndXJlZCBmb3IgU1JJTyBhY2Nlc3Nlcy4gIFRoZSBwcm9wZXJ0eSBzaG91bGQKKwkJbm90IGV4aXN0IG9uIGRldmljZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBQQU1VLgorCisJCUZvciBIVyAoaWUsIHRoZSBQNDA4MCkgdGhhdCBvbmx5IHN1cHBvcnRzIGEgTElPRE4gZm9yIGJvdGgKKwkJbWVtb3J5IGFuZCBtYWludGVuYW5jZSB0cmFuc2FjdGlvbnMgdGhlbiBhIHNpbmdsZSBMSU9ETiBpcworCQlyZXByZXNlbnRlZCBpbiB0aGUgcHJvcGVydHkgZm9yIGJvdGggdHJhbnNhY3Rpb25zLgorCisJCUZvciBIVyAoaWUsIHRoZSBQMzA0eC9QNTAyMCwgZXRjKSB0aGF0IHN1cHBvcnRzIGFuIExJT0ROIGZvcgorCQltZW1vcnkgdHJhbnNhY3Rpb25zIGFuZCBhIHVuaXF1ZSBMSU9ETiBmb3IgbWFpbnRlbmFuY2UKKwkJdHJhbnNhY3Rpb25zIHRoZW4gYSBwYWlyIG9mIExJT0ROcyBhcmUgcmVwcmVzZW50ZWQgaW4gdGhlCisJCXByb3BlcnR5LiAgV2l0aGluIHRoZSBwYWlyLCB0aGUgZmlyc3QgZWxlbWVudCByZXByZXNlbnRzIHRoZQorCQlMSU9ETiBhc3NvY2lhdGVkIHdpdGggbWVtb3J5IHRyYW5zYWN0aW9ucyBhbmQgdGhlIHNlY29uZCBlbGVtZW50CisJCXJlcHJlc2VudHMgdGhlIExJT0ROIGFzc29jaWF0ZWQgd2l0aCBtYWludGVuYW5jZSB0cmFuc2FjdGlvbnMKKwkJZm9yIHRoZSBwb3J0LgorCitOb3RlOiBBbGwgb3RoZXIgc3RhbmRhcmQgcHJvcGVydGllcyAoc2VlIGVQQVBSKSBhcmUgYWxsb3dlZCBidXQgYXJlIG9wdGlvbmFsLgorCitFeGFtcGxlOgorCisJcmFwaWRpbzogcmFwaWRpb0BmZmUwYzAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCXJlZyA9IDwweGYgMHhmZTBjMDAwMCAwIDB4MTEwMDA+OworCQljb21wYXRpYmxlID0gImZzbCxzcmlvIjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTE+OyAvKiBlcnJfaXJxICovCisJCWZzbCxzcmlvLXJtdS1oYW5kbGUgPSA8JnJtdT47CisJCXJhbmdlczsKKworCQlwb3J0MSB7CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCWZzbCxsaW9kbiA9IDwzND47CisJCQlyYW5nZXMgPSA8MCAwIDB4YyAweDIwMDAwMDAwIDAgMHgxMDAwMDAwMD47CisJCX07CisKKwkJcG9ydDIgeworCQkJY2VsbC1pbmRleCA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQlmc2wsbGlvZG4gPSA8NDg+OworCQkJcmFuZ2VzID0gPDAgMCAweGMgMHgzMDAwMDAwMCAwIDB4MTAwMDAwMDA+OworCQl9OworCX07CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKaW5kZXggM2Q4NDkxMi4uMzNmNzMyNyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CisrKyBiL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dApAQCAtMjYzLDggKzI2Myw3IEBACiAKIFdoYXQ6CUNvZGUgdGhhdCBpcyBub3cgdW5kZXIgQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUwogCShpbiBuZXQvY29yZS9uZXQtc3lzZnMuYykKLVdoZW46CUFmdGVyIHRoZSBvbmx5IHVzZXIgKGhhbCkgaGFzIHNlZW4gYSByZWxlYXNlIHdpdGggdGhlIHBhdGNoZXMKLQlmb3IgZW5vdWdoIHRpbWUsIHByb2JhYmx5IHNvbWUgdGltZSBpbiAyMDEwLgorV2hlbjoJMy41CiBXaHk6CU92ZXIgMUsgLnRleHQvLmRhdGEgc2l6ZSByZWR1Y3Rpb24sIGRhdGEgaXMgYXZhaWxhYmxlIGluIG90aGVyCiAJd2F5cyAoaW9jdGxzKQogV2hvOglKb2hhbm5lcyBCZXJnIDxqb2hhbm5lc0BzaXBzb2x1dGlvbnMubmV0PgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCBhMGM1YzVmLi5lMjI5NzY5IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtMzE1LDEyICszMTUsMTIgQEAKIAkJCUNQVS1pbnRlbnNpdmUgc3R5bGUgYmVuY2htYXJrLCBhbmQgaXQgY2FuIHZhcnkgaGlnaGx5IGluCiAJCQlhIG1pY3JvYmVuY2htYXJrIGRlcGVuZGluZyBvbiB3b3JrbG9hZCBhbmQgY29tcGlsZXIuCiAKLQkJCTE6IG9ubHkgZm9yIDMyLWJpdCBwcm9jZXNzZXMKLQkJCTI6IG9ubHkgZm9yIDY0LWJpdCBwcm9jZXNzZXMKKwkJCTMyOiBvbmx5IGZvciAzMi1iaXQgcHJvY2Vzc2VzCisJCQk2NDogb25seSBmb3IgNjQtYml0IHByb2Nlc3NlcwogCQkJb246IGVuYWJsZSBmb3IgYm90aCAzMi0gYW5kIDY0LWJpdCBwcm9jZXNzZXMKIAkJCW9mZjogZGlzYWJsZSBmb3IgYm90aCAzMi0gYW5kIDY0LWJpdCBwcm9jZXNzZXMKIAotCWFtZF9pb21tdT0JW0hXLFg4Ni04NF0KKwlhbWRfaW9tbXU9CVtIVyxYODYtNjRdCiAJCQlQYXNzIHBhcmFtZXRlcnMgdG8gdGhlIEFNRCBJT01NVSBkcml2ZXIgaW4gdGhlIHN5c3RlbS4KIAkJCVBvc3NpYmxlIHZhbHVlcyBhcmU6CiAJCQlmdWxsZmx1c2ggLSBlbmFibGUgZmx1c2hpbmcgb2YgSU8vVExCIGVudHJpZXMgd2hlbgpAQCAtMTg4NSw2ICsxODg1LDExIEBACiAJCQlhcmNoX3BlcmZtb246IFtYODZdIEZvcmNlIHVzZSBvZiBhcmNoaXRlY3R1cmFsCiAJCQkJcGVyZm1vbiBvbiBJbnRlbCBDUFVzIGluc3RlYWQgb2YgdGhlCiAJCQkJQ1BVIHNwZWNpZmljIGV2ZW50IHNldC4KKwkJCXRpbWVyOiBbWDg2XSBGb3JjZSB1c2Ugb2YgYXJjaGl0ZWN0dXJhbCBOTUkKKwkJCQl0aW1lciBtb2RlIChzZWUgYWxzbyBvcHJvZmlsZS50aW1lcgorCQkJCWZvciBnZW5lcmljIGhyIHRpbWVyIG1vZGUpCisJCQkJW3MzOTBdIEZvcmNlIGxlZ2FjeSBiYXNpYyBtb2RlIHNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBvcnQgY3B1X3R5cGUgInRpbWVyIikKIAogCW9vcHM9cGFuaWMJQWx3YXlzIHBhbmljIG9uIG9vcHNlcy4gRGVmYXVsdCBpcyB0byBqdXN0IGtpbGwgdGhlCiAJCQlwcm9jZXNzLCBidXQgdGhlcmUgaXMgYSBzbWFsbCBwcm9iYWJpbGl0eSBvZgpAQCAtMjc1MCwxMSArMjc1NSwxMCBAQAogCQkJZnVuY3Rpb25zIGFyZSBhdCBmaXhlZCBhZGRyZXNzZXMsIHRoZXkgbWFrZSBuaWNlCiAJCQl0YXJnZXRzIGZvciBleHBsb2l0cyB0aGF0IGNhbiBjb250cm9sIFJJUC4KIAotCQkJZW11bGF0ZSAgICAgVnN5c2NhbGxzIHR1cm4gaW50byB0cmFwcyBhbmQgYXJlIGVtdWxhdGVkCi0JCQkgICAgICAgICAgICByZWFzb25hYmx5IHNhZmVseS4KKwkJCWVtdWxhdGUgICAgIFtkZWZhdWx0XSBWc3lzY2FsbHMgdHVybiBpbnRvIHRyYXBzIGFuZCBhcmUKKwkJCSAgICAgICAgICAgIGVtdWxhdGVkIHJlYXNvbmFibHkgc2FmZWx5LgogCi0JCQluYXRpdmUgICAgICBbZGVmYXVsdF0gVnN5c2NhbGxzIGFyZSBuYXRpdmUgc3lzY2FsbAotCQkJICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLgorCQkJbmF0aXZlICAgICAgVnN5c2NhbGxzIGFyZSBuYXRpdmUgc3lzY2FsbCBpbnN0cnVjdGlvbnMuCiAJCQkgICAgICAgICAgICBUaGlzIGlzIGEgbGl0dGxlIGJpdCBmYXN0ZXIgdGhhbiB0cmFwcGluZwogCQkJICAgICAgICAgICAgYW5kIG1ha2VzIGEgZmV3IGR5bmFtaWMgcmVjb21waWxlcnMgd29yawogCQkJICAgICAgICAgICAgYmV0dGVyIHRoYW4gdGhleSB3b3VsZCBpbiBlbXVsYXRpb24gbW9kZS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbG9ja2RlcC1kZXNpZ24udHh0IGIvRG9jdW1lbnRhdGlvbi9sb2NrZGVwLWRlc2lnbi50eHQKaW5kZXggYWJmNzY4Yy4uNWRiYzk5YyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9sb2NrZGVwLWRlc2lnbi50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi9sb2NrZGVwLWRlc2lnbi50eHQKQEAgLTIyMSwzICsyMjEsNjYgQEAKIHRhYmxlLCB3aGljaCBoYXNoLXRhYmxlIGNhbiBiZSBjaGVja2VkIGluIGEgbG9ja2ZyZWUgbWFubmVyLiBJZiB0aGUKIGxvY2tpbmcgY2hhaW4gb2NjdXJzIGFnYWluIGxhdGVyIG9uLCB0aGUgaGFzaCB0YWJsZSB0ZWxscyB1cyB0aGF0IHdlCiBkb250IGhhdmUgdG8gdmFsaWRhdGUgdGhlIGNoYWluIGFnYWluLgorCitUcm91Ymxlc2hvb3Rpbmc6CistLS0tLS0tLS0tLS0tLS0tCisKK1RoZSB2YWxpZGF0b3IgdHJhY2tzIGEgbWF4aW11bSBvZiBNQVhfTE9DS0RFUF9LRVlTIG51bWJlciBvZiBsb2NrIGNsYXNzZXMuCitFeGNlZWRpbmcgdGhpcyBudW1iZXIgd2lsbCB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgbG9ja2RlcCB3YXJuaW5nOgorCisJKERFQlVHX0xPQ0tTX1dBUk5fT04oaWQgPj0gTUFYX0xPQ0tERVBfS0VZUykpCisKK0J5IGRlZmF1bHQsIE1BWF9MT0NLREVQX0tFWVMgaXMgY3VycmVudGx5IHNldCB0byA4MTkxLCBhbmQgdHlwaWNhbAorZGVza3RvcCBzeXN0ZW1zIGhhdmUgbGVzcyB0aGFuIDEsMDAwIGxvY2sgY2xhc3Nlcywgc28gdGhpcyB3YXJuaW5nCitub3JtYWxseSByZXN1bHRzIGZyb20gbG9jay1jbGFzcyBsZWFrYWdlIG9yIGZhaWx1cmUgdG8gcHJvcGVybHkKK2luaXRpYWxpemUgbG9ja3MuICBUaGVzZSB0d28gcHJvYmxlbXMgYXJlIGlsbHVzdHJhdGVkIGJlbG93OgorCisxLglSZXBlYXRlZCBtb2R1bGUgbG9hZGluZyBhbmQgdW5sb2FkaW5nIHdoaWxlIHJ1bm5pbmcgdGhlIHZhbGlkYXRvcgorCXdpbGwgcmVzdWx0IGluIGxvY2stY2xhc3MgbGVha2FnZS4gIFRoZSBpc3N1ZSBoZXJlIGlzIHRoYXQgZWFjaAorCWxvYWQgb2YgdGhlIG1vZHVsZSB3aWxsIGNyZWF0ZSBhIG5ldyBzZXQgb2YgbG9jayBjbGFzc2VzIGZvcgorCXRoYXQgbW9kdWxlJ3MgbG9ja3MsIGJ1dCBtb2R1bGUgdW5sb2FkaW5nIGRvZXMgbm90IHJlbW92ZSBvbGQKKwljbGFzc2VzIChzZWUgYmVsb3cgZGlzY3Vzc2lvbiBvZiByZXVzZSBvZiBsb2NrIGNsYXNzZXMgZm9yIHdoeSkuCisJVGhlcmVmb3JlLCBpZiB0aGF0IG1vZHVsZSBpcyBsb2FkZWQgYW5kIHVubG9hZGVkIHJlcGVhdGVkbHksCisJdGhlIG51bWJlciBvZiBsb2NrIGNsYXNzZXMgd2lsbCBldmVudHVhbGx5IHJlYWNoIHRoZSBtYXhpbXVtLgorCisyLglVc2luZyBzdHJ1Y3R1cmVzIHN1Y2ggYXMgYXJyYXlzIHRoYXQgaGF2ZSBsYXJnZSBudW1iZXJzIG9mCisJbG9ja3MgdGhhdCBhcmUgbm90IGV4cGxpY2l0bHkgaW5pdGlhbGl6ZWQuICBGb3IgZXhhbXBsZSwKKwlhIGhhc2ggdGFibGUgd2l0aCA4MTkyIGJ1Y2tldHMgd2hlcmUgZWFjaCBidWNrZXQgaGFzIGl0cyBvd24KKwlzcGlubG9ja190IHdpbGwgY29uc3VtZSA4MTkyIGxvY2sgY2xhc3NlcyAtdW5sZXNzLSBlYWNoIHNwaW5sb2NrCisJaXMgZXhwbGljaXRseSBpbml0aWFsaXplZCBhdCBydW50aW1lLCBmb3IgZXhhbXBsZSwgdXNpbmcgdGhlCisJcnVuLXRpbWUgc3Bpbl9sb2NrX2luaXQoKSBhcyBvcHBvc2VkIHRvIGNvbXBpbGUtdGltZSBpbml0aWFsaXplcnMKKwlzdWNoIGFzIF9fU1BJTl9MT0NLX1VOTE9DS0VEKCkuICBGYWlsdXJlIHRvIHByb3Blcmx5IGluaXRpYWxpemUKKwl0aGUgcGVyLWJ1Y2tldCBzcGlubG9ja3Mgd291bGQgZ3VhcmFudGVlIGxvY2stY2xhc3Mgb3ZlcmZsb3cuCisJSW4gY29udHJhc3QsIGEgbG9vcCB0aGF0IGNhbGxlZCBzcGluX2xvY2tfaW5pdCgpIG9uIGVhY2ggbG9jaworCXdvdWxkIHBsYWNlIGFsbCA4MTkyIGxvY2tzIGludG8gYSBzaW5nbGUgbG9jayBjbGFzcy4KKworCVRoZSBtb3JhbCBvZiB0aGlzIHN0b3J5IGlzIHRoYXQgeW91IHNob3VsZCBhbHdheXMgZXhwbGljaXRseQorCWluaXRpYWxpemUgeW91ciBsb2Nrcy4KKworT25lIG1pZ2h0IGFyZ3VlIHRoYXQgdGhlIHZhbGlkYXRvciBzaG91bGQgYmUgbW9kaWZpZWQgdG8gYWxsb3cKK2xvY2sgY2xhc3NlcyB0byBiZSByZXVzZWQuICBIb3dldmVyLCBpZiB5b3UgYXJlIHRlbXB0ZWQgdG8gbWFrZSB0aGlzCithcmd1bWVudCwgZmlyc3QgcmV2aWV3IHRoZSBjb2RlIGFuZCB0aGluayB0aHJvdWdoIHRoZSBjaGFuZ2VzIHRoYXQgd291bGQKK2JlIHJlcXVpcmVkLCBrZWVwaW5nIGluIG1pbmQgdGhhdCB0aGUgbG9jayBjbGFzc2VzIHRvIGJlIHJlbW92ZWQgYXJlCitsaWtlbHkgdG8gYmUgbGlua2VkIGludG8gdGhlIGxvY2stZGVwZW5kZW5jeSBncmFwaC4gIFRoaXMgdHVybnMgb3V0IHRvCitiZSBoYXJkZXIgdG8gZG8gdGhhbiB0byBzYXkuCisKK09mIGNvdXJzZSwgaWYgeW91IGRvIHJ1biBvdXQgb2YgbG9jayBjbGFzc2VzLCB0aGUgbmV4dCB0aGluZyB0byBkbyBpcwordG8gZmluZCB0aGUgb2ZmZW5kaW5nIGxvY2sgY2xhc3Nlcy4gIEZpcnN0LCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgZ2l2ZXMKK3lvdSB0aGUgbnVtYmVyIG9mIGxvY2sgY2xhc3NlcyBjdXJyZW50bHkgaW4gdXNlIGFsb25nIHdpdGggdGhlIG1heGltdW06CisKKwlncmVwICJsb2NrLWNsYXNzZXMiIC9wcm9jL2xvY2tkZXBfc3RhdHMKKworVGhpcyBjb21tYW5kIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmcgb3V0cHV0IG9uIGEgbW9kZXN0IHN5c3RlbToKKworCSBsb2NrLWNsYXNzZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICA3NDggW21heDogODE5MV0KKworSWYgdGhlIG51bWJlciBhbGxvY2F0ZWQgKDc0OCBhYm92ZSkgaW5jcmVhc2VzIGNvbnRpbnVhbGx5IG92ZXIgdGltZSwKK3RoZW4gdGhlcmUgaXMgbGlrZWx5IGEgbGVhay4gIFRoZSBmb2xsb3dpbmcgY29tbWFuZCBjYW4gYmUgdXNlZCB0bworaWRlbnRpZnkgdGhlIGxlYWtpbmcgbG9jayBjbGFzc2VzOgorCisJZ3JlcCAiQkQiIC9wcm9jL2xvY2tkZXAKKworUnVuIHRoZSBjb21tYW5kIGFuZCBzYXZlIHRoZSBvdXRwdXQsIHRoZW4gY29tcGFyZSBhZ2FpbnN0IHRoZSBvdXRwdXQgZnJvbQorYSBsYXRlciBydW4gb2YgdGhpcyBjb21tYW5kIHRvIGlkZW50aWZ5IHRoZSBsZWFrZXJzLiAgVGhpcyBzYW1lIG91dHB1dAorY2FuIGFsc28gaGVscCB5b3UgZmluZCBzaXR1YXRpb25zIHdoZXJlIHJ1bnRpbWUgbG9jayBpbml0aWFsaXphdGlvbiBoYXMKK2JlZW4gb21pdHRlZC4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy8wMC1JTkRFWAppbmRleCBiYmNlMTIxLi45YWQ5ZGRlIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvMDAtSU5ERVgKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nLzAwLUlOREVYCkBAIC0xNDQsNiArMTQ0LDggQEAKIAktIFRoZSBMaW51eCBOZWFyIEZpZWxkIENvbW11bmljYXRpb24gKE5GUykgc3Vic3lzdGVtLgogb2x5bXBpYy50eHQKIAktIElCTSBQQ0kgUGl0L1BpdC1QaHkvT2x5bXBpYyBUb2tlbiBSaW5nIGRyaXZlciBpbmZvLgorb3BlbnZzd2l0Y2gudHh0CisJLSBPcGVuIHZTd2l0Y2ggZGV2ZWxvcGVyIGRvY3VtZW50YXRpb24uCiBvcGVyc3RhdGVzLnR4dAogCS0gT3ZlcnZpZXcgb2YgbmV0d29yayBpbnRlcmZhY2Ugb3BlcmF0aW9uYWwgc3RhdGVzLgogcGFja2V0X21tYXAudHh0CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF0bWFuLWFkdi50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYmF0bWFuLWFkdi50eHQKaW5kZXggYzg2ZDAzZi4uMjIxYWQwYyAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JhdG1hbi1hZHYudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9iYXRtYW4tYWR2LnR4dApAQCAtMjAwLDE1ICsyMDAsMTYgQEAKIAogMCAtIEFsbCAgZGVidWcgIG91dHB1dCAgZGlzYWJsZWQKIDEgLSBFbmFibGUgbWVzc2FnZXMgcmVsYXRlZCB0byByb3V0aW5nIC8gZmxvb2RpbmcgLyBicm9hZGNhc3RpbmcKLTIgLSBFbmFibGUgcm91dGUgb3IgdHQgZW50cnkgYWRkZWQgLyBjaGFuZ2VkIC8gZGVsZXRlZAotMyAtIEVuYWJsZSBhbGwgbWVzc2FnZXMKKzIgLSBFbmFibGUgbWVzc2FnZXMgcmVsYXRlZCB0byByb3V0ZSBhZGRlZCAvIGNoYW5nZWQgLyBkZWxldGVkCis0IC0gRW5hYmxlIG1lc3NhZ2VzIHJlbGF0ZWQgdG8gdHJhbnNsYXRpb24gdGFibGUgb3BlcmF0aW9ucworNyAtIEVuYWJsZSBhbGwgbWVzc2FnZXMKIAogVGhlIGRlYnVnIG91dHB1dCBjYW4gYmUgY2hhbmdlZCBhdCBydW50aW1lICB1c2luZyAgdGhlICBmaWxlCiAvc3lzL2NsYXNzL25ldC9iYXQwL21lc2gvbG9nX2xldmVsLiBlLmcuCiAKICMgZWNobyAyID4gL3N5cy9jbGFzcy9uZXQvYmF0MC9tZXNoL2xvZ19sZXZlbAogCi13aWxsIGVuYWJsZSBkZWJ1ZyBtZXNzYWdlcyBmb3Igd2hlbiByb3V0ZXMgb3IgVFRzIGNoYW5nZS4KK3dpbGwgZW5hYmxlIGRlYnVnIG1lc3NhZ2VzIGZvciB3aGVuIHJvdXRlcyBjaGFuZ2UuCiAKIAogQkFUQ1RMCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvYm9uZGluZy50eHQKaW5kZXggOTFkZjY3OC4uMDgwYWQyNiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2JvbmRpbmcudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9ib25kaW5nLnR4dApAQCAtMTk2LDYgKzE5NiwyMyBAQAogCiAJVGhlIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3M6CiAKK2FjdGl2ZV9zbGF2ZQorCisJU3BlY2lmaWVzIHRoZSBuZXcgYWN0aXZlIHNsYXZlIGZvciBtb2RlcyB0aGF0IHN1cHBvcnQgaXQKKwkoYWN0aXZlLWJhY2t1cCwgYmFsYW5jZS1hbGIgYW5kIGJhbGFuY2UtdGxiKS4gIFBvc3NpYmxlIHZhbHVlcworCWFyZSB0aGUgbmFtZSBvZiBhbnkgY3VycmVudGx5IGVuc2xhdmVkIGludGVyZmFjZSwgb3IgYW4gZW1wdHkKKwlzdHJpbmcuICBJZiBhIG5hbWUgaXMgZ2l2ZW4sIHRoZSBzbGF2ZSBhbmQgaXRzIGxpbmsgbXVzdCBiZSB1cCBpbiBvcmRlcgorCXRvIGJlIHNlbGVjdGVkIGFzIHRoZSBuZXcgYWN0aXZlIHNsYXZlLiAgSWYgYW4gZW1wdHkgc3RyaW5nIGlzCisJc3BlY2lmaWVkLCB0aGUgY3VycmVudCBhY3RpdmUgc2xhdmUgaXMgY2xlYXJlZCwgYW5kIGEgbmV3IGFjdGl2ZQorCXNsYXZlIGlzIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkuCisKKwlOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBzeXNmcyBpbnRlcmZhY2UuIE5vIG1vZHVsZQorCXBhcmFtZXRlciBieSB0aGlzIG5hbWUgZXhpc3RzLgorCisJVGhlIG5vcm1hbCB2YWx1ZSBvZiB0aGlzIG9wdGlvbiBpcyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudGx5CisJYWN0aXZlIHNsYXZlLCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBzbGF2ZSBvcgorCXRoZSBjdXJyZW50IG1vZGUgZG9lcyBub3QgdXNlIGFuIGFjdGl2ZSBzbGF2ZS4KKwogYWRfc2VsZWN0CiAKIAlTcGVjaWZpZXMgdGhlIDgwMi4zYWQgYWdncmVnYXRpb24gc2VsZWN0aW9uIGxvZ2ljIHRvIHVzZS4gIFRoZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2llZWU4MDIxNTQudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2llZWU4MDIxNTQudHh0CmluZGV4IGY0MWVhMjQuLjFkYzFjMjQgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pZWVlODAyMTU0LnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaWVlZTgwMjE1NC50eHQKQEAgLTc4LDMgKzc4LDMwIEBACiAKIFNlZSBoZWFkZXIgaW5jbHVkZS9uZXQvbWFjODAyMTU0LmggYW5kIHNldmVyYWwgZHJpdmVycyBpbiBkcml2ZXJzL2llZWU4MDIxNTQvLgogCis2TG9XUEFOIExpbnV4IGltcGxlbWVudGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBJRUVFIDgwMi4xNS40IHN0YW5kYXJkIHNwZWNpZmllcyBhbiBNVFUgb2YgMTI4IGJ5dGVzLCB5aWVsZGluZyBhYm91dCA4MAorb2N0ZXRzIG9mIGFjdHVhbCBNQUMgcGF5bG9hZCBvbmNlIHNlY3VyaXR5IGlzIHR1cm5lZCBvbiwgb24gYSB3aXJlbGVzcyBsaW5rCit3aXRoIGEgbGluayB0aHJvdWdocHV0IG9mIDI1MCBrYnBzIG9yIGxlc3MuICBUaGUgNkxvV1BBTiBhZGFwdGF0aW9uIGZvcm1hdAorW1JGQzQ5NDRdIHdhcyBzcGVjaWZpZWQgdG8gY2FycnkgSVB2NiBkYXRhZ3JhbXMgb3ZlciBzdWNoIGNvbnN0cmFpbmVkIGxpbmtzLAordGFraW5nIGludG8gYWNjb3VudCBsaW1pdGVkIGJhbmR3aWR0aCwgbWVtb3J5LCBvciBlbmVyZ3kgcmVzb3VyY2VzIHRoYXQgYXJlCitleHBlY3RlZCBpbiBhcHBsaWNhdGlvbnMgc3VjaCBhcyB3aXJlbGVzcyBTZW5zb3IgTmV0d29ya3MuICBbUkZDNDk0NF0gZGVmaW5lcworYSBNZXNoIEFkZHJlc3NpbmcgaGVhZGVyIHRvIHN1cHBvcnQgc3ViLUlQIGZvcndhcmRpbmcsIGEgRnJhZ21lbnRhdGlvbiBoZWFkZXIKK3RvIHN1cHBvcnQgdGhlIElQdjYgbWluaW11bSBNVFUgcmVxdWlyZW1lbnQgW1JGQzI0NjBdLCBhbmQgc3RhdGVsZXNzIGhlYWRlcgorY29tcHJlc3Npb24gZm9yIElQdjYgZGF0YWdyYW1zIChMT1dQQU5fSEMxIGFuZCBMT1dQQU5fSEMyKSB0byByZWR1Y2UgdGhlCityZWxhdGl2ZWx5IGxhcmdlIElQdjYgYW5kIFVEUCBoZWFkZXJzIGRvd24gdG8gKGluIHRoZSBiZXN0IGNhc2UpIHNldmVyYWwgYnl0ZXMuCisKK0luIFNlbXB0ZW1iZXIgMjAxMSB0aGUgc3RhbmRhcmQgdXBkYXRlIHdhcyBwdWJsaXNoZWQgLSBbUkZDNjI4Ml0uCitJdCBkZXByZWNhdGVzIEhDMSBhbmQgSEMyIGNvbXByZXNzaW9uIGFuZCBkZWZpbmVzIElQSEMgZW5jb2RpbmcgZm9ybWF0IHdoaWNoIGlzCit1c2VkIGluIHRoaXMgTGludXggaW1wbGVtZW50YXRpb24uCisKK0FsbCB0aGUgY29kZSByZWxhdGVkIHRvIDZsb3dwYW4geW91IG1heSBmaW5kIGluIGZpbGVzOiBuZXQvaWVlZTgwMjE1NC82bG93cGFuLioKKworVG8gc2V0dXAgNmxvd3BhbiBpbnRlcmZhY2UgeW91IG5lZWQgKGJ1c3lib3ggcmVsZWFzZSA+IDEuMTcuMCk6CisxLiBBZGQgSUVFRTgwMi4xNS40IGludGVyZmFjZSBhbmQgaW5pdGlhbGl6ZSBQQU5pZDsKKzIuIEFkZCA2bG93cGFuIGludGVyZmFjZSBieSBjb21tYW5kIGxpa2U6CisgICAjIGlwIGxpbmsgYWRkIGxpbmsgd3BhbjAgbmFtZSBsb3dwYW4wIHR5cGUgbG93cGFuCiszLiBTZXQgTUFDIChpZiBuZWVkcyk6CisgICAjIGlwIGxpbmsgc2V0IGxvd3BhbjAgYWRkcmVzcyBkZTphZDpiZTplZjpjYTpmZTpiYTpiZQorNC4gQnJpbmcgdXAgJ2xvd3BhbjAnIGludGVyZmFjZQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lmZW5zbGF2ZS5jIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL2lmZW5zbGF2ZS5jCmluZGV4IDY1OTY4ZmIuLmFjNWRlYmIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pZmVuc2xhdmUuYworKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaWZlbnNsYXZlLmMKQEAgLTUzOSwxMiArNTM5LDE0IEBACiAJCW1ldHJpYyA9IDA7CiAJfSBlbHNlCiAJCW1ldHJpYyA9IGlmci5pZnJfbWV0cmljOworCXByaW50ZigiVGhlIHJlc3VsdCBvZiBTSU9DR0lGTUVUUklDIGlzICVkXG4iLCBtZXRyaWMpOwogCiAJc3RyY3B5KGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKIAlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRk1UVSwgJmlmcikgPCAwKQogCQltdHUgPSAwOwogCWVsc2UKIAkJbXR1ID0gaWZyLmlmcl9tdHU7CisJcHJpbnRmKCJUaGUgcmVzdWx0IG9mIFNJT0NHSUZNVFUgaXMgJWRcbiIsIG10dSk7CiAKIAlzdHJjcHkoaWZyLmlmcl9uYW1lLCBpZm5hbWUpOwogCWlmIChpb2N0bChza2ZkLCBTSU9DR0lGRFNUQUREUiwgJmlmcikgPCAwKSB7CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvaXAtc3lzY3RsLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CmluZGV4IGYwNDlhMWMuLmFkM2U4MGUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9pcC1zeXNjdGwudHh0CkBAIC0zMSw2ICszMSwxNiBAQAogCXdoZW4gdXNpbmcgbGFyZ2UgbnVtYmVycyBvZiBpbnRlcmZhY2VzIGFuZCB3aGVuIGNvbW11bmljYXRpbmcKIAl3aXRoIGxhcmdlIG51bWJlcnMgb2YgZGlyZWN0bHktY29ubmVjdGVkIHBlZXJzLgogCituZWlnaC9kZWZhdWx0L3VucmVzX3FsZW5fYnl0ZXMgLSBJTlRFR0VSCisJVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHdoaWNoIG1heSBiZSB1c2VkIGJ5IHBhY2tldHMKKwlxdWV1ZWQgZm9yIGVhY2gJdW5yZXNvbHZlZCBhZGRyZXNzIGJ5IG90aGVyIG5ldHdvcmsgbGF5ZXJzLgorCShhZGRlZCBpbiBsaW51eCAzLjMpCisKK25laWdoL2RlZmF1bHQvdW5yZXNfcWxlbiAtIElOVEVHRVIKKwlUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB3aGljaCBtYXkgYmUgcXVldWVkIGZvciBlYWNoCisJdW5yZXNvbHZlZCBhZGRyZXNzIGJ5IG90aGVyIG5ldHdvcmsgbGF5ZXJzLgorCShkZXByZWNhdGVkIGluIGxpbnV4IDMuMykgOiB1c2UgdW5yZXNfcWxlbl9ieXRlcyBpbnN0ZWFkLgorCiBtdHVfZXhwaXJlcyAtIElOVEVHRVIKIAlUaW1lLCBpbiBzZWNvbmRzLCB0aGF0IGNhY2hlZCBQTVRVIGluZm9ybWF0aW9uIGlzIGtlcHQuCiAKQEAgLTE2NSw2ICsxNzUsOSBAQAogCWNvbm5lY3Rpb25zLiBUaGUgYWxnb3JpdGhtICJyZW5vIiBpcyBhbHdheXMgYXZhaWxhYmxlLCBidXQKIAlhZGRpdGlvbmFsIGNob2ljZXMgbWF5IGJlIGF2YWlsYWJsZSBiYXNlZCBvbiBrZXJuZWwgY29uZmlndXJhdGlvbi4KIAlEZWZhdWx0IGlzIHNldCBhcyBwYXJ0IG9mIGtlcm5lbCBjb25maWd1cmF0aW9uLgorCUZvciBwYXNzaXZlIGNvbm5lY3Rpb25zLCB0aGUgbGlzdGVuZXIgY29uZ2VzdGlvbiBjb250cm9sIGNob2ljZQorCWlzIGluaGVyaXRlZC4KKwlbc2VlIHNldHNvY2tvcHQobGlzdGVuZmQsIFNPTF9UQ1AsIFRDUF9DT05HRVNUSU9OLCAibmFtZSIgLi4uKSBdCiAKIHRjcF9jb29raWVfc2l6ZSAtIElOVEVHRVIKIAlEZWZhdWx0IHNpemUgb2YgVENQIENvb2tpZSBUcmFuc2FjdGlvbnMgKFRDUENUKSBvcHRpb24sIHRoYXQgbWF5IGJlCkBAIC0yODIsMTEgKzI5NSwxMSBAQAogCURlZmF1bHQ6IDAgKG9mZikKIAogdGNwX21heF9zeW5fYmFja2xvZyAtIElOVEVHRVIKLQlNYXhpbWFsIG51bWJlciBvZiByZW1lbWJlcmVkIGNvbm5lY3Rpb24gcmVxdWVzdHMsIHdoaWNoIGFyZQotCXN0aWxsIGRpZCBub3QgcmVjZWl2ZSBhbiBhY2tub3dsZWRnbWVudCBmcm9tIGNvbm5lY3RpbmcgY2xpZW50LgotCURlZmF1bHQgdmFsdWUgaXMgMTAyNCBmb3Igc3lzdGVtcyB3aXRoIG1vcmUgdGhhbiAxMjhNYiBvZiBtZW1vcnksCi0JYW5kIDEyOCBmb3IgbG93IG1lbW9yeSBtYWNoaW5lcy4gSWYgc2VydmVyIHN1ZmZlcnMgb2Ygb3ZlcmxvYWQsCi0JdHJ5IHRvIGluY3JlYXNlIHRoaXMgbnVtYmVyLgorCU1heGltYWwgbnVtYmVyIG9mIHJlbWVtYmVyZWQgY29ubmVjdGlvbiByZXF1ZXN0cywgd2hpY2ggaGF2ZSBub3QKKwlyZWNlaXZlZCBhbiBhY2tub3dsZWRnbWVudCBmcm9tIGNvbm5lY3RpbmcgY2xpZW50LgorCVRoZSBtaW5pbWFsIHZhbHVlIGlzIDEyOCBmb3IgbG93IG1lbW9yeSBtYWNoaW5lcywgYW5kIGl0IHdpbGwKKwlpbmNyZWFzZSBpbiBwcm9wb3J0aW9uIHRvIHRoZSBtZW1vcnkgb2YgbWFjaGluZS4KKwlJZiBzZXJ2ZXIgc3VmZmVycyBmcm9tIG92ZXJsb2FkLCB0cnkgaW5jcmVhc2luZyB0aGlzIG51bWJlci4KIAogdGNwX21heF90d19idWNrZXRzIC0gSU5URUdFUgogCU1heGltYWwgbnVtYmVyIG9mIHRpbWV3YWl0IHNvY2tldHMgaGVsZCBieSBzeXN0ZW0gc2ltdWx0YW5lb3VzbHkuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvb3BlbnZzd2l0Y2gudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL29wZW52c3dpdGNoLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGEwNDhiCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL29wZW52c3dpdGNoLnR4dApAQCAtMCwwICsxLDE5NSBAQAorT3BlbiB2U3dpdGNoIGRhdGFwYXRoIGRldmVsb3BlciBkb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIE9wZW4gdlN3aXRjaCBrZXJuZWwgbW9kdWxlIGFsbG93cyBmbGV4aWJsZSB1c2Vyc3BhY2UgY29udHJvbCBvdmVyCitmbG93LWxldmVsIHBhY2tldCBwcm9jZXNzaW5nIG9uIHNlbGVjdGVkIG5ldHdvcmsgZGV2aWNlcy4gIEl0IGNhbiBiZQordXNlZCB0byBpbXBsZW1lbnQgYSBwbGFpbiBFdGhlcm5ldCBzd2l0Y2gsIG5ldHdvcmsgZGV2aWNlIGJvbmRpbmcsCitWTEFOIHByb2Nlc3NpbmcsIG5ldHdvcmsgYWNjZXNzIGNvbnRyb2wsIGZsb3ctYmFzZWQgbmV0d29yayBjb250cm9sLAorYW5kIHNvIG9uLgorCitUaGUga2VybmVsIG1vZHVsZSBpbXBsZW1lbnRzIG11bHRpcGxlICJkYXRhcGF0aHMiIChhbmFsb2dvdXMgdG8KK2JyaWRnZXMpLCBlYWNoIG9mIHdoaWNoIGNhbiBoYXZlIG11bHRpcGxlICJ2cG9ydHMiIChhbmFsb2dvdXMgdG8gcG9ydHMKK3dpdGhpbiBhIGJyaWRnZSkuICBFYWNoIGRhdGFwYXRoIGFsc28gaGFzIGFzc29jaWF0ZWQgd2l0aCBpdCBhICJmbG93Cit0YWJsZSIgdGhhdCB1c2Vyc3BhY2UgcG9wdWxhdGVzIHdpdGggImZsb3dzIiB0aGF0IG1hcCBmcm9tIGtleXMgYmFzZWQKK29uIHBhY2tldCBoZWFkZXJzIGFuZCBtZXRhZGF0YSB0byBzZXRzIG9mIGFjdGlvbnMuICBUaGUgbW9zdCBjb21tb24KK2FjdGlvbiBmb3J3YXJkcyB0aGUgcGFja2V0IHRvIGFub3RoZXIgdnBvcnQ7IG90aGVyIGFjdGlvbnMgYXJlIGFsc28KK2ltcGxlbWVudGVkLgorCitXaGVuIGEgcGFja2V0IGFycml2ZXMgb24gYSB2cG9ydCwgdGhlIGtlcm5lbCBtb2R1bGUgcHJvY2Vzc2VzIGl0IGJ5CitleHRyYWN0aW5nIGl0cyBmbG93IGtleSBhbmQgbG9va2luZyBpdCB1cCBpbiB0aGUgZmxvdyB0YWJsZS4gIElmIHRoZXJlCitpcyBhIG1hdGNoaW5nIGZsb3csIGl0IGV4ZWN1dGVzIHRoZSBhc3NvY2lhdGVkIGFjdGlvbnMuICBJZiB0aGVyZSBpcworbm8gbWF0Y2gsIGl0IHF1ZXVlcyB0aGUgcGFja2V0IHRvIHVzZXJzcGFjZSBmb3IgcHJvY2Vzc2luZyAoYXMgcGFydCBvZgoraXRzIHByb2Nlc3NpbmcsIHVzZXJzcGFjZSB3aWxsIGxpa2VseSBzZXQgdXAgYSBmbG93IHRvIGhhbmRsZSBmdXJ0aGVyCitwYWNrZXRzIG9mIHRoZSBzYW1lIHR5cGUgZW50aXJlbHkgaW4ta2VybmVsKS4KKworCitGbG93IGtleSBjb21wYXRpYmlsaXR5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK05ldHdvcmsgcHJvdG9jb2xzIGV2b2x2ZSBvdmVyIHRpbWUuICBOZXcgcHJvdG9jb2xzIGJlY29tZSBpbXBvcnRhbnQKK2FuZCBleGlzdGluZyBwcm90b2NvbHMgbG9zZSB0aGVpciBwcm9taW5lbmNlLiAgRm9yIHRoZSBPcGVuIHZTd2l0Y2gKK2tlcm5lbCBtb2R1bGUgdG8gcmVtYWluIHJlbGV2YW50LCBpdCBtdXN0IGJlIHBvc3NpYmxlIGZvciBuZXdlcgordmVyc2lvbnMgdG8gcGFyc2UgYWRkaXRpb25hbCBwcm90b2NvbHMgYXMgcGFydCBvZiB0aGUgZmxvdyBrZXkuICBJdAorbWlnaHQgZXZlbiBiZSBkZXNpcmFibGUsIHNvbWVkYXksIHRvIGRyb3Agc3VwcG9ydCBmb3IgcGFyc2luZworcHJvdG9jb2xzIHRoYXQgaGF2ZSBiZWNvbWUgb2Jzb2xldGUuICBUaGVyZWZvcmUsIHRoZSBOZXRsaW5rIGludGVyZmFjZQordG8gT3BlbiB2U3dpdGNoIGlzIGRlc2lnbmVkIHRvIGFsbG93IGNhcmVmdWxseSB3cml0dGVuIHVzZXJzcGFjZQorYXBwbGljYXRpb25zIHRvIHdvcmsgd2l0aCBhbnkgdmVyc2lvbiBvZiB0aGUgZmxvdyBrZXksIHBhc3Qgb3IgZnV0dXJlLgorCitUbyBzdXBwb3J0IHRoaXMgZm9yd2FyZCBhbmQgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgd2hlbmV2ZXIgdGhlCitrZXJuZWwgbW9kdWxlIHBhc3NlcyBhIHBhY2tldCB0byB1c2Vyc3BhY2UsIGl0IGFsc28gcGFzc2VzIGFsb25nIHRoZQorZmxvdyBrZXkgdGhhdCBpdCBwYXJzZWQgZnJvbSB0aGUgcGFja2V0LiAgVXNlcnNwYWNlIHRoZW4gZXh0cmFjdHMgaXRzCitvd24gbm90aW9uIG9mIGEgZmxvdyBrZXkgZnJvbSB0aGUgcGFja2V0IGFuZCBjb21wYXJlcyBpdCBhZ2FpbnN0IHRoZQora2VybmVsLXByb3ZpZGVkIHZlcnNpb246CisKKyAgICAtIElmIHVzZXJzcGFjZSdzIG5vdGlvbiBvZiB0aGUgZmxvdyBrZXkgZm9yIHRoZSBwYWNrZXQgbWF0Y2hlcyB0aGUKKyAgICAgIGtlcm5lbCdzLCB0aGVuIG5vdGhpbmcgc3BlY2lhbCBpcyBuZWNlc3NhcnkuCisKKyAgICAtIElmIHRoZSBrZXJuZWwncyBmbG93IGtleSBpbmNsdWRlcyBtb3JlIGZpZWxkcyB0aGFuIHRoZSB1c2Vyc3BhY2UKKyAgICAgIHZlcnNpb24gb2YgdGhlIGZsb3cga2V5LCBmb3IgZXhhbXBsZSBpZiB0aGUga2VybmVsIGRlY29kZWQgSVB2NgorICAgICAgaGVhZGVycyBidXQgdXNlcnNwYWNlIHN0b3BwZWQgYXQgdGhlIEV0aGVybmV0IHR5cGUgKGJlY2F1c2UgaXQKKyAgICAgIGRvZXMgbm90IHVuZGVyc3RhbmQgSVB2NiksIHRoZW4gYWdhaW4gbm90aGluZyBzcGVjaWFsIGlzCisgICAgICBuZWNlc3NhcnkuICBVc2Vyc3BhY2UgY2FuIHN0aWxsIHNldCB1cCBhIGZsb3cgaW4gdGhlIHVzdWFsIHdheSwKKyAgICAgIGFzIGxvbmcgYXMgaXQgdXNlcyB0aGUga2VybmVsLXByb3ZpZGVkIGZsb3cga2V5IHRvIGRvIGl0LgorCisgICAgLSBJZiB0aGUgdXNlcnNwYWNlIGZsb3cga2V5IGluY2x1ZGVzIG1vcmUgZmllbGRzIHRoYW4gdGhlCisgICAgICBrZXJuZWwncywgZm9yIGV4YW1wbGUgaWYgdXNlcnNwYWNlIGRlY29kZWQgYW4gSVB2NiBoZWFkZXIgYnV0CisgICAgICB0aGUga2VybmVsIHN0b3BwZWQgYXQgdGhlIEV0aGVybmV0IHR5cGUsIHRoZW4gdXNlcnNwYWNlIGNhbgorICAgICAgZm9yd2FyZCB0aGUgcGFja2V0IG1hbnVhbGx5LCB3aXRob3V0IHNldHRpbmcgdXAgYSBmbG93IGluIHRoZQorICAgICAga2VybmVsLiAgVGhpcyBjYXNlIGlzIGJhZCBmb3IgcGVyZm9ybWFuY2UgYmVjYXVzZSBldmVyeSBwYWNrZXQKKyAgICAgIHRoYXQgdGhlIGtlcm5lbCBjb25zaWRlcnMgcGFydCBvZiB0aGUgZmxvdyBtdXN0IGdvIHRvIHVzZXJzcGFjZSwKKyAgICAgIGJ1dCB0aGUgZm9yd2FyZGluZyBiZWhhdmlvciBpcyBjb3JyZWN0LiAgKElmIHVzZXJzcGFjZSBjYW4KKyAgICAgIGRldGVybWluZSB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIGV4dHJhIGZpZWxkcyB3b3VsZCBub3QgYWZmZWN0CisgICAgICBmb3J3YXJkaW5nIGJlaGF2aW9yLCB0aGVuIGl0IGNvdWxkIHNldCB1cCBhIGZsb3cgYW55d2F5LikKKworSG93IGZsb3cga2V5cyBldm9sdmUgb3ZlciB0aW1lIGlzIGltcG9ydGFudCB0byBtYWtpbmcgdGhpcyB3b3JrLCBzbwordGhlIGZvbGxvd2luZyBzZWN0aW9ucyBnbyBpbnRvIGRldGFpbC4KKworCitGbG93IGtleSBmb3JtYXQKKy0tLS0tLS0tLS0tLS0tLQorCitBIGZsb3cga2V5IGlzIHBhc3NlZCBvdmVyIGEgTmV0bGluayBzb2NrZXQgYXMgYSBzZXF1ZW5jZSBvZiBOZXRsaW5rCithdHRyaWJ1dGVzLiAgU29tZSBhdHRyaWJ1dGVzIHJlcHJlc2VudCBwYWNrZXQgbWV0YWRhdGEsIGRlZmluZWQgYXMgYW55CitpbmZvcm1hdGlvbiBhYm91dCBhIHBhY2tldCB0aGF0IGNhbm5vdCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgcGFja2V0CitpdHNlbGYsIGUuZy4gdGhlIHZwb3J0IG9uIHdoaWNoIHRoZSBwYWNrZXQgd2FzIHJlY2VpdmVkLiAgTW9zdAorYXR0cmlidXRlcywgaG93ZXZlciwgYXJlIGV4dHJhY3RlZCBmcm9tIGhlYWRlcnMgd2l0aGluIHRoZSBwYWNrZXQsCitlLmcuIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYWRkcmVzc2VzIGZyb20gRXRoZXJuZXQsIElQLCBvciBUQ1AKK2hlYWRlcnMuCisKK1RoZSA8bGludXgvb3BlbnZzd2l0Y2guaD4gaGVhZGVyIGZpbGUgZGVmaW5lcyB0aGUgZXhhY3QgZm9ybWF0IG9mIHRoZQorZmxvdyBrZXkgYXR0cmlidXRlcy4gIEZvciBpbmZvcm1hbCBleHBsYW5hdG9yeSBwdXJwb3NlcyBoZXJlLCB3ZSB3cml0ZQordGhlbSBhcyBjb21tYS1zZXBhcmF0ZWQgc3RyaW5ncywgd2l0aCBwYXJlbnRoZXNlcyBpbmRpY2F0aW5nIGFyZ3VtZW50cworYW5kIG5lc3RpbmcuICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb3VsZCByZXByZXNlbnQgYSBmbG93IGtleQorY29ycmVzcG9uZGluZyB0byBhIFRDUCBwYWNrZXQgdGhhdCBhcnJpdmVkIG9uIHZwb3J0IDE6CisKKyAgICBpbl9wb3J0KDEpLCBldGgoc3JjPWUwOjkxOmY1OjIxOmQwOmIyLCBkc3Q9MDA6MDI6ZTM6MGY6ODA6YTQpLAorICAgIGV0aF90eXBlKDB4MDgwMCksIGlwdjQoc3JjPTE3Mi4xNi4wLjIwLCBkc3Q9MTcyLjE4LjAuNTIsIHByb3RvPTE3LCB0b3M9MCwKKyAgICBmcmFnPW5vKSwgdGNwKHNyYz00OTE2MywgZHN0PTgwKQorCitPZnRlbiB3ZSBlbGxpcHNpemUgYXJndW1lbnRzIG5vdCBpbXBvcnRhbnQgdG8gdGhlIGRpc2N1c3Npb24sIGUuZy46CisKKyAgICBpbl9wb3J0KDEpLCBldGgoLi4uKSwgZXRoX3R5cGUoMHgwODAwKSwgaXB2NCguLi4pLCB0Y3AoLi4uKQorCisKK0Jhc2ljIHJ1bGUgZm9yIGV2b2x2aW5nIGZsb3cga2V5cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NvbWUgY2FyZSBpcyBuZWVkZWQgdG8gcmVhbGx5IG1haW50YWluIGZvcndhcmQgYW5kIGJhY2t3YXJkCitjb21wYXRpYmlsaXR5IGZvciBhcHBsaWNhdGlvbnMgdGhhdCBmb2xsb3cgdGhlIHJ1bGVzIGxpc3RlZCB1bmRlcgorIkZsb3cga2V5IGNvbXBhdGliaWxpdHkiIGFib3ZlLgorCitUaGUgYmFzaWMgcnVsZSBpcyBvYnZpb3VzOgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgTmV3IG5ldHdvcmsgcHJvdG9jb2wgc3VwcG9ydCBtdXN0IG9ubHkgc3VwcGxlbWVudCBleGlzdGluZyBmbG93CisgICAga2V5IGF0dHJpYnV0ZXMuICBJdCBtdXN0IG5vdCBjaGFuZ2UgdGhlIG1lYW5pbmcgb2YgYWxyZWFkeSBkZWZpbmVkCisgICAgZmxvdyBrZXkgYXR0cmlidXRlcy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBydWxlIGRvZXMgaGF2ZSBsZXNzLW9idmlvdXMgY29uc2VxdWVuY2VzIHNvIGl0IGlzIHdvcnRoIHdvcmtpbmcKK3Rocm91Z2ggYSBmZXcgZXhhbXBsZXMuICBTdXBwb3NlLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGUga2VybmVsIG1vZHVsZQorZGlkIG5vdCBhbHJlYWR5IGltcGxlbWVudCBWTEFOIHBhcnNpbmcuICBJbnN0ZWFkLCBpdCBqdXN0IGludGVycHJldGVkCit0aGUgODAyLjFRIFRQSUQgKDB4ODEwMCkgYXMgdGhlIEV0aGVydHlwZSB0aGVuIHN0b3BwZWQgcGFyc2luZyB0aGUKK3BhY2tldC4gIFRoZSBmbG93IGtleSBmb3IgYW55IHBhY2tldCB3aXRoIGFuIDgwMi4xUSBoZWFkZXIgd291bGQgbG9vaworZXNzZW50aWFsbHkgbGlrZSB0aGlzLCBpZ25vcmluZyBtZXRhZGF0YToKKworICAgIGV0aCguLi4pLCBldGhfdHlwZSgweDgxMDApCisKK05haXZlbHksIHRvIGFkZCBWTEFOIHN1cHBvcnQsIGl0IG1ha2VzIHNlbnNlIHRvIGFkZCBhIG5ldyAidmxhbiIgZmxvdwora2V5IGF0dHJpYnV0ZSB0byBjb250YWluIHRoZSBWTEFOIHRhZywgdGhlbiBjb250aW51ZSB0byBkZWNvZGUgdGhlCitlbmNhcHN1bGF0ZWQgaGVhZGVycyBiZXlvbmQgdGhlIFZMQU4gdGFnIHVzaW5nIHRoZSBleGlzdGluZyBmaWVsZAorZGVmaW5pdGlvbnMuICBXaXRoIHRoaXMgY2hhbmdlLCBhbiBUQ1AgcGFja2V0IGluIFZMQU4gMTAgd291bGQgaGF2ZSBhCitmbG93IGtleSBtdWNoIGxpa2UgdGhpczoKKworICAgIGV0aCguLi4pLCB2bGFuKHZpZD0xMCwgcGNwPTApLCBldGhfdHlwZSgweDA4MDApLCBpcChwcm90bz02LCAuLi4pLCB0Y3AoLi4uKQorCitCdXQgdGhpcyBjaGFuZ2Ugd291bGQgbmVnYXRpdmVseSBhZmZlY3QgYSB1c2Vyc3BhY2UgYXBwbGljYXRpb24gdGhhdAoraGFzIG5vdCBiZWVuIHVwZGF0ZWQgdG8gdW5kZXJzdGFuZCB0aGUgbmV3ICJ2bGFuIiBmbG93IGtleSBhdHRyaWJ1dGUuCitUaGUgYXBwbGljYXRpb24gY291bGQsIGZvbGxvd2luZyB0aGUgZmxvdyBjb21wYXRpYmlsaXR5IHJ1bGVzIGFib3ZlLAoraWdub3JlIHRoZSAidmxhbiIgYXR0cmlidXRlIHRoYXQgaXQgZG9lcyBub3QgdW5kZXJzdGFuZCBhbmQgdGhlcmVmb3JlCithc3N1bWUgdGhhdCB0aGUgZmxvdyBjb250YWluZWQgSVAgcGFja2V0cy4gIFRoaXMgaXMgYSBiYWQgYXNzdW1wdGlvbgorKHRoZSBmbG93IG9ubHkgY29udGFpbnMgSVAgcGFja2V0cyBpZiBvbmUgcGFyc2VzIGFuZCBza2lwcyBvdmVyIHRoZQorODAyLjFRIGhlYWRlcikgYW5kIGl0IGNvdWxkIGNhdXNlIHRoZSBhcHBsaWNhdGlvbidzIGJlaGF2aW9yIHRvIGNoYW5nZQorYWNyb3NzIGtlcm5lbCB2ZXJzaW9ucyBldmVuIHRob3VnaCBpdCBmb2xsb3dzIHRoZSBjb21wYXRpYmlsaXR5IHJ1bGVzLgorCitUaGUgc29sdXRpb24gaXMgdG8gdXNlIGEgc2V0IG9mIG5lc3RlZCBhdHRyaWJ1dGVzLiAgVGhpcyBpcywgZm9yCitleGFtcGxlLCB3aHkgODAyLjFRIHN1cHBvcnQgdXNlcyBuZXN0ZWQgYXR0cmlidXRlcy4gIEEgVENQIHBhY2tldCBpbgorVkxBTiAxMCBpcyBhY3R1YWxseSBleHByZXNzZWQgYXM6CisKKyAgICBldGgoLi4uKSwgZXRoX3R5cGUoMHg4MTAwKSwgdmxhbih2aWQ9MTAsIHBjcD0wKSwgZW5jYXAoZXRoX3R5cGUoMHgwODAwKSwKKyAgICBpcChwcm90bz02LCAuLi4pLCB0Y3AoLi4uKSkpCisKK05vdGljZSBob3cgdGhlICJldGhfdHlwZSIsICJpcCIsIGFuZCAidGNwIiBmbG93IGtleSBhdHRyaWJ1dGVzIGFyZQorbmVzdGVkIGluc2lkZSB0aGUgImVuY2FwIiBhdHRyaWJ1dGUuICBUaHVzLCBhbiBhcHBsaWNhdGlvbiB0aGF0IGRvZXMKK25vdCB1bmRlcnN0YW5kIHRoZSAidmxhbiIga2V5IHdpbGwgbm90IHNlZSBlaXRoZXIgb2YgdGhvc2UgYXR0cmlidXRlcworYW5kIHRoZXJlZm9yZSB3aWxsIG5vdCBtaXNpbnRlcnByZXQgdGhlbS4gIChBbHNvLCB0aGUgb3V0ZXIgZXRoX3R5cGUKK2lzIHN0aWxsIDB4ODEwMCwgbm90IGNoYW5nZWQgdG8gMHgwODAwLikKKworSGFuZGxpbmcgbWFsZm9ybWVkIHBhY2tldHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Rvbid0IGRyb3AgcGFja2V0cyBpbiB0aGUga2VybmVsIGZvciBtYWxmb3JtZWQgcHJvdG9jb2wgaGVhZGVycywgYmFkCitjaGVja3N1bXMsIGV0Yy4gIFRoaXMgd291bGQgcHJldmVudCB1c2Vyc3BhY2UgZnJvbSBpbXBsZW1lbnRpbmcgYQorc2ltcGxlIEV0aGVybmV0IHN3aXRjaCB0aGF0IGZvcndhcmRzIGV2ZXJ5IHBhY2tldC4KKworSW5zdGVhZCwgaW4gc3VjaCBhIGNhc2UsIGluY2x1ZGUgYW4gYXR0cmlidXRlIHdpdGggImVtcHR5IiBjb250ZW50LgorSXQgZG9lc24ndCBtYXR0ZXIgaWYgdGhlIGVtcHR5IGNvbnRlbnQgY291bGQgYmUgdmFsaWQgcHJvdG9jb2wgdmFsdWVzLAorYXMgbG9uZyBhcyB0aG9zZSB2YWx1ZXMgYXJlIHJhcmVseSBzZWVuIGluIHByYWN0aWNlLCBiZWNhdXNlIHVzZXJzcGFjZQorY2FuIGFsd2F5cyBmb3J3YXJkIGFsbCBwYWNrZXRzIHdpdGggdGhvc2UgdmFsdWVzIHRvIHVzZXJzcGFjZSBhbmQKK2hhbmRsZSB0aGVtIGluZGl2aWR1YWxseS4KKworRm9yIGV4YW1wbGUsIGNvbnNpZGVyIGEgcGFja2V0IHRoYXQgY29udGFpbnMgYW4gSVAgaGVhZGVyIHRoYXQKK2luZGljYXRlcyBwcm90b2NvbCA2IGZvciBUQ1AsIGJ1dCB3aGljaCBpcyB0cnVuY2F0ZWQganVzdCBhZnRlciB0aGUgSVAKK2hlYWRlciwgc28gdGhhdCB0aGUgVENQIGhlYWRlciBpcyBtaXNzaW5nLiAgVGhlIGZsb3cga2V5IGZvciB0aGlzCitwYWNrZXQgd291bGQgaW5jbHVkZSBhIHRjcCBhdHRyaWJ1dGUgd2l0aCBhbGwtemVybyBzcmMgYW5kIGRzdCwgbGlrZQordGhpczoKKworICAgIGV0aCguLi4pLCBldGhfdHlwZSgweDA4MDApLCBpcChwcm90bz02LCAuLi4pLCB0Y3Aoc3JjPTAsIGRzdD0wKQorCitBcyBhbm90aGVyIGV4YW1wbGUsIGNvbnNpZGVyIGEgcGFja2V0IHdpdGggYW4gRXRoZXJuZXQgdHlwZSBvZiAweDgxMDAsCitpbmRpY2F0aW5nIHRoYXQgYSBWTEFOIFRDSSBzaG91bGQgZm9sbG93LCBidXQgd2hpY2ggaXMgdHJ1bmNhdGVkIGp1c3QKK2FmdGVyIHRoZSBFdGhlcm5ldCB0eXBlLiAgVGhlIGZsb3cga2V5IGZvciB0aGlzIHBhY2tldCB3b3VsZCBpbmNsdWRlCithbiBhbGwtemVyby1iaXRzIHZsYW4gYW5kIGFuIGVtcHR5IGVuY2FwIGF0dHJpYnV0ZSwgbGlrZSB0aGlzOgorCisgICAgZXRoKC4uLiksIGV0aF90eXBlKDB4ODEwMCksIHZsYW4oMCksIGVuY2FwKCkKKworVW5saWtlIGEgVENQIHBhY2tldCB3aXRoIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gcG9ydHMgMCwgYW4KK2FsbC16ZXJvLWJpdHMgVkxBTiBUQ0kgaXMgbm90IHRoYXQgcmFyZSwgc28gdGhlIENGSSBiaXQgKGFrYQorVkxBTl9UQUdfUFJFU0VOVCBpbnNpZGUgdGhlIGtlcm5lbCkgaXMgb3JkaW5hcmlseSBzZXQgaW4gYSB2bGFuCithdHRyaWJ1dGUgZXhwcmVzc2x5IHRvIGFsbG93IHRoaXMgc2l0dWF0aW9uIHRvIGJlIGRpc3Rpbmd1aXNoZWQuCitUaHVzLCB0aGUgZmxvdyBrZXkgaW4gdGhpcyBzZWNvbmQgZXhhbXBsZSB1bmFtYmlndW91c2x5IGluZGljYXRlcyBhCittaXNzaW5nIG9yIG1hbGZvcm1lZCBWTEFOIFRDSS4KKworT3RoZXIgcnVsZXMKKy0tLS0tLS0tLS0tCisKK1RoZSBvdGhlciBydWxlcyBmb3IgZmxvdyBrZXlzIGFyZSBtdWNoIGxlc3Mgc3VidGxlOgorCisgICAgLSBEdXBsaWNhdGUgYXR0cmlidXRlcyBhcmUgbm90IGFsbG93ZWQgYXQgYSBnaXZlbiBuZXN0aW5nIGxldmVsLgorCisgICAgLSBPcmRlcmluZyBvZiBhdHRyaWJ1dGVzIGlzIG5vdCBzaWduaWZpY2FudC4KKworICAgIC0gV2hlbiB0aGUga2VybmVsIHNlbmRzIGEgZ2l2ZW4gZmxvdyBrZXkgdG8gdXNlcnNwYWNlLCBpdCBhbHdheXMKKyAgICAgIGNvbXBvc2VzIGl0IHRoZSBzYW1lIHdheS4gIFRoaXMgYWxsb3dzIHVzZXJzcGFjZSB0byBoYXNoIGFuZAorICAgICAgY29tcGFyZSBlbnRpcmUgZmxvdyBrZXlzIHRoYXQgaXQgbWF5IG5vdCBiZSBhYmxlIHRvIGZ1bGx5CisgICAgICBpbnRlcnByZXQuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGFja2V0X21tYXAudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3BhY2tldF9tbWFwLnR4dAppbmRleCA0YWNlYTY2Li4xYzA4YTRiIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvcGFja2V0X21tYXAudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9wYWNrZXRfbW1hcC50eHQKQEAgLTE1NSw3ICsxNTUsNyBAQAogCiAgLyogZmlsbCBzb2NrYWRkcl9sbCBzdHJ1Y3QgdG8gcHJlcGFyZSBiaW5kaW5nICovCiAgbXlfYWRkci5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOwotIG15X2FkZHIuc2xsX3Byb3RvY29sID0gRVRIX1BfQUxMOworIG15X2FkZHIuc2xsX3Byb3RvY29sID0gaHRvbnMoRVRIX1BfQUxMKTsKICBteV9hZGRyLnNsbF9pZmluZGV4ID0gIHNfaWZyLmlmcl9pZmluZGV4OwogCiAgLyogYmluZCBzb2NrZXQgdG8gZXRoMCAqLwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NjYWxpbmcudHh0IGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3NjYWxpbmcudHh0CmluZGV4IGExNzdkZTIuLjU3OTk5NGEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy9zY2FsaW5nLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc2NhbGluZy50eHQKQEAgLTIwOCw3ICsyMDgsNyBAQAogQ1BVJ3MgYmFja2xvZyB3aGVuIGEgcGFja2V0IGluIHRoaXMgZmxvdyB3YXMgbGFzdCBlbnF1ZXVlZC4gRWFjaCBiYWNrbG9nCiBxdWV1ZSBoYXMgYSBoZWFkIGNvdW50ZXIgdGhhdCBpcyBpbmNyZW1lbnRlZCBvbiBkZXF1ZXVlLiBBIHRhaWwgY291bnRlcgogaXMgY29tcHV0ZWQgYXMgaGVhZCBjb3VudGVyICsgcXVldWUgbGVuZ3RoLiBJbiBvdGhlciB3b3JkcywgdGhlIGNvdW50ZXIKLWluIHJwc19kZXZfZmxvd190YWJsZVtpXSByZWNvcmRzIHRoZSBsYXN0IGVsZW1lbnQgaW4gZmxvdyBpIHRoYXQgaGFzCitpbiBycHNfZGV2X2Zsb3dbaV0gcmVjb3JkcyB0aGUgbGFzdCBlbGVtZW50IGluIGZsb3cgaSB0aGF0IGhhcwogYmVlbiBlbnF1ZXVlZCBvbnRvIHRoZSBjdXJyZW50bHkgZGVzaWduYXRlZCBDUFUgZm9yIGZsb3cgaSAob2YgY291cnNlLAogZW50cnkgaSBpcyBhY3R1YWxseSBzZWxlY3RlZCBieSBoYXNoIGFuZCBtdWx0aXBsZSBmbG93cyBtYXkgaGFzaCB0byB0aGUKIHNhbWUgZW50cnkgaSkuCkBAIC0yMjQsNyArMjI0LDcgQEAKIAogLSBUaGUgY3VycmVudCBDUFUncyBxdWV1ZSBoZWFkIGNvdW50ZXIgPj0gdGhlIHJlY29yZGVkIHRhaWwgY291bnRlcgogICB2YWx1ZSBpbiBycHNfZGV2X2Zsb3dbaV0KLS0gVGhlIGN1cnJlbnQgQ1BVIGlzIHVuc2V0IChlcXVhbCB0byBOUl9DUFVTKQorLSBUaGUgY3VycmVudCBDUFUgaXMgdW5zZXQgKGVxdWFsIHRvIFJQU19OT19DUFUpCiAtIFRoZSBjdXJyZW50IENQVSBpcyBvZmZsaW5lCiAKIEFmdGVyIHRoaXMgY2hlY2ssIHRoZSBwYWNrZXQgaXMgc2VudCB0byB0aGUgKHBvc3NpYmx5IHVwZGF0ZWQpIGN1cnJlbnQKQEAgLTIzNSw3ICsyMzUsNyBAQAogCiA9PT09IFJGUyBDb25maWd1cmF0aW9uCiAKLVJGUyBpcyBvbmx5IGF2YWlsYWJsZSBpZiB0aGUga2NvbmZpZyBzeW1ib2wgQ09ORklHX1JGUyBpcyBlbmFibGVkIChvbgorUkZTIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHRoZSBrY29uZmlnIHN5bWJvbCBDT05GSUdfUlBTIGlzIGVuYWJsZWQgKG9uCiBieSBkZWZhdWx0IGZvciBTTVApLiBUaGUgZnVuY3Rpb25hbGl0eSByZW1haW5zIGRpc2FibGVkIHVudGlsIGV4cGxpY2l0bHkKIGNvbmZpZ3VyZWQuIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZ2xvYmFsIGZsb3cgdGFibGUgaXMgc2V0IHRocm91Z2g6CiAKQEAgLTI1OCw3ICsyNTgsNyBAQAogd291bGQgbm9ybWFsbHkgYmUgY29uZmlndXJlZCB0byB0aGUgc2FtZSB2YWx1ZSBhcyBycHNfc29ja19mbG93X2VudHJpZXMuCiBGb3IgYSBtdWx0aS1xdWV1ZSBkZXZpY2UsIHRoZSBycHNfZmxvd19jbnQgZm9yIGVhY2ggcXVldWUgbWlnaHQgYmUKIGNvbmZpZ3VyZWQgYXMgcnBzX3NvY2tfZmxvd19lbnRyaWVzIC8gTiwgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mCi1xdWV1ZXMuIFNvIGZvciBpbnN0YW5jZSwgaWYgcnBzX2Zsb3dfZW50cmllcyBpcyBzZXQgdG8gMzI3NjggYW5kIHRoZXJlCitxdWV1ZXMuIFNvIGZvciBpbnN0YW5jZSwgaWYgcnBzX3NvY2tfZmxvd19lbnRyaWVzIGlzIHNldCB0byAzMjc2OCBhbmQgdGhlcmUKIGFyZSAxNiBjb25maWd1cmVkIHJlY2VpdmUgcXVldWVzLCBycHNfZmxvd19jbnQgZm9yIGVhY2ggcXVldWUgbWlnaHQgYmUKIGNvbmZpZ3VyZWQgYXMgMjA0OC4KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3N0bW1hYy50eHQgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc3RtbWFjLnR4dAppbmRleCA4ZDY3OTgwLi5kMGFlZWFkIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc3RtbWFjLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL25ldHdvcmtpbmcvc3RtbWFjLnR4dApAQCAtNCwxNCArNCwxNiBAQAogQXV0aG9yOiBHaXVzZXBwZSBDYXZhbGxhcm8gPHBlcHBlLmNhdmFsbGFyb0BzdC5jb20+CiAKIFRoaXMgaXMgdGhlIGRyaXZlciBmb3IgdGhlIE1BQyAxMC8xMDAvMTAwMCBvbi1jaGlwIEV0aGVybmV0IGNvbnRyb2xsZXJzCi0oU3lub3BzeXMgSVAgYmxvY2tzKTsgaXQgaGFzIGJlZW4gZnVsbHkgdGVzdGVkIG9uIFNUTGludXggcGxhdGZvcm1zLgorKFN5bm9wc3lzIElQIGJsb2NrcykuCiAKIEN1cnJlbnRseSB0aGlzIG5ldHdvcmsgZGV2aWNlIGRyaXZlciBpcyBmb3IgYWxsIFNUTSBlbWJlZGRlZCBNQUMvR01BQwotKGkuZS4gN3h4eC81eHh4IFNvQ3MpIGFuZCBpdCdzIGtub3duIHdvcmtpbmcgb24gb3RoZXIgcGxhdGZvcm1zIGkuZS4gQVJNIFNQRUFyLgorKGkuZS4gN3h4eC81eHh4IFNvQ3MpLCBTUEVBciAoYXJtKSwgTG9vbmdzb24xQiAobWlwcykgYW5kIFhMSU5YIFhDMlYzMDAwCitGRjExNTJBTVQwMjIxIEQxMjE1OTk0QSBWSVJURVggRlBHQSBib2FyZC4KIAotRFdDIEV0aGVyIE1BQyAxMC8xMDAvMTAwMCBVbml2ZXJzYWwgdmVyc2lvbiAzLjQxYSBhbmQgRFdDIEV0aGVyIE1BQyAxMC8xMDAKLVVuaXZlcnNhbCB2ZXJzaW9uIDQuMCBoYXZlIGJlZW4gdXNlZCBmb3IgZGV2ZWxvcGluZyB0aGUgZmlyc3QgY29kZQotaW1wbGVtZW50YXRpb24uCitEV0MgRXRoZXIgTUFDIDEwLzEwMC8xMDAwIFVuaXZlcnNhbCB2ZXJzaW9uIDMuNjBhIChhbmQgb2xkZXIpIGFuZCBEV0MgRXRoZXIgTUFDIDEwLzEwMAorVW5pdmVyc2FsIHZlcnNpb24gNC4wIGhhdmUgYmVlbiB1c2VkIGZvciBkZXZlbG9waW5nIHRoaXMgZHJpdmVyLgorCitUaGlzIGRyaXZlciBzdXBwb3J0cyBib3RoIHRoZSBwbGF0Zm9ybSBidXMgYW5kIFBDSS4KIAogUGxlYXNlLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbHNvIHZpc2l0OiB3d3cuc3RsaW51eC5jb20KIApAQCAtMjc3LDUgKzI3OSw1IEBACiAKIDYpIFRPRE86CiAgbyBYR01BQyBpcyBub3Qgc3VwcG9ydGVkLgotIG8gUmV2aWV3IHRoZSB0aW1lciBvcHRpbWlzYXRpb24gY29kZSB0byB1c2UgYW4gZW1iZWRkZWQgZGV2aWNlIHRoYXQgd2lsbCBiZQotICBhdmFpbGFibGUgaW4gbmV3IGNoaXAgZ2VuZXJhdGlvbnMuCisgbyBBZGQgdGhlIEVFRSAtIEVuZXJneSBFZmZpY2llbnQgRXRoZXJuZXQKKyBvIEFkZCB0aGUgUFRQIC0gcHJlY2lzaW9uIHRpbWUgcHJvdG9jb2wKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90ZWFtLnR4dCBiL0RvY3VtZW50YXRpb24vbmV0d29ya2luZy90ZWFtLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTAxMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9uZXR3b3JraW5nL3RlYW0udHh0CkBAIC0wLDAgKzEsMiBAQAorVGVhbSBkZXZpY2VzIGFyZSBkcml2ZW4gZnJvbSB1c2Vyc3BhY2UgdmlhIGxpYnRlYW0gbGlicmFyeSB3aGljaCBpcyBoZXJlOgorCWh0dHBzOi8vZ2l0aHViLmNvbS9qcGlya28vbGlidGVhbQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9tYWNoaW5lLnR4dCBiL0RvY3VtZW50YXRpb24vc291bmQvYWxzYS9zb2MvbWFjaGluZS50eHQKaW5kZXggM2UyZWM5Yy4uZDUwYzE0ZCAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9zb3VuZC9hbHNhL3NvYy9tYWNoaW5lLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NvdW5kL2Fsc2Evc29jL21hY2hpbmUudHh0CkBAIC01MCw4ICs1MCw3IEBACiBUaGUgbWFjaGluZSBEQUkgY29uZmlndXJhdGlvbiBnbHVlcyBhbGwgdGhlIGNvZGVjIGFuZCBDUFUgREFJcyB0b2dldGhlci4gSXQgY2FuCiBhbHNvIGJlIHVzZWQgdG8gc2V0IHVwIHRoZSBEQUkgc3lzdGVtIGNsb2NrIGFuZCBmb3IgYW55IG1hY2hpbmUgcmVsYXRlZCBEQUkKIGluaXRpYWxpc2F0aW9uIGUuZy4gdGhlIG1hY2hpbmUgYXVkaW8gbWFwIGNhbiBiZSBjb25uZWN0ZWQgdG8gdGhlIGNvZGVjIGF1ZGlvCi1tYXAsIHVuY29ubmVjdGVkIGNvZGVjIHBpbnMgY2FuIGJlIHNldCBhcyBzdWNoLiBQbGVhc2Ugc2VlIGNvcmdpLmMsIHNwaXR6LmMKLWZvciBleGFtcGxlcy4KK21hcCwgdW5jb25uZWN0ZWQgY29kZWMgcGlucyBjYW4gYmUgc2V0IGFzIHN1Y2guCiAKIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIGlzIHVzZWQgdG8gc2V0IHVwIGVhY2ggREFJIGluIHlvdXIgbWFjaGluZS4gZS5nLgogCkBAIC04Myw4ICs4Miw3IEBACiBUaGUgbWFjaGluZSBkcml2ZXIgY2FuIG9wdGlvbmFsbHkgZXh0ZW5kIHRoZSBjb2RlYyBwb3dlciBtYXAgYW5kIHRvIGJlY29tZSBhbgogYXVkaW8gcG93ZXIgbWFwIG9mIHRoZSBhdWRpbyBzdWJzeXN0ZW0uIFRoaXMgYWxsb3dzIGZvciBhdXRvbWF0aWMgcG93ZXIgdXAvZG93bgogb2Ygc3BlYWtlci9IUCBhbXBsaWZpZXJzLCBldGMuIENvZGVjIHBpbnMgY2FuIGJlIGNvbm5lY3RlZCB0byB0aGUgbWFjaGluZXMgamFjawotc29ja2V0cyBpbiB0aGUgbWFjaGluZSBpbml0IGZ1bmN0aW9uLiBTZWUgc29jL3B4YS9zcGl0ei5jIGFuZCBkYXBtLnR4dCBmb3IKLWRldGFpbHMuCitzb2NrZXRzIGluIHRoZSBtYWNoaW5lIGluaXQgZnVuY3Rpb24uCiAKIAogTWFjaGluZSBDb250cm9scwpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi90cmFjZS9ldmVudHMudHh0IGIvRG9jdW1lbnRhdGlvbi90cmFjZS9ldmVudHMudHh0CmluZGV4IGI1MTA1NjQuLmJiMjRjMmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdHJhY2UvZXZlbnRzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2V2ZW50cy50eHQKQEAgLTE5MSw4ICsxOTEsNiBAQAogCiBDdXJyZW50bHksIG9ubHkgZXhhY3Qgc3RyaW5nIG1hdGNoZXMgYXJlIHN1cHBvcnRlZC4KIAotQ3VycmVudGx5LCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcHJlZGljYXRlcyBpbiBhIGZpbHRlciBpcyAxNi4KLQogNS4yIFNldHRpbmcgZmlsdGVycwogLS0tLS0tLS0tLS0tLS0tLS0tLQogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3VzYi9saW51eC1jZGMtYWNtLmluZiBiL0RvY3VtZW50YXRpb24vdXNiL2xpbnV4LWNkYy1hY20uaW5mCmluZGV4IDM3YTAyY2UuLmYwZmZjMjcgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdXNiL2xpbnV4LWNkYy1hY20uaW5mCisrKyBiL0RvY3VtZW50YXRpb24vdXNiL2xpbnV4LWNkYy1hY20uaW5mCkBAIC05MCwxMCArOTAsMTAgQEAKIFtTb3VyY2VEaXNrc0ZpbGVzXQogW1NvdXJjZURpc2tzTmFtZXNdCiBbRGV2aWNlTGlzdF0KLSVERVNDUklQVElPTiU9RHJpdmVySW5zdGFsbCwgVVNCXFZJRF8wNTI1JlBJRF9BNEE3LCBVU0JcVklEXzFENkImUElEXzAxMDQmTUlfMDIKKyVERVNDUklQVElPTiU9RHJpdmVySW5zdGFsbCwgVVNCXFZJRF8wNTI1JlBJRF9BNEE3LCBVU0JcVklEXzFENkImUElEXzAxMDQmTUlfMDIsIFVTQlxWSURfMUQ2QiZQSURfMDEwNiZNSV8wMAogCiBbRGV2aWNlTGlzdC5OVGFtZDY0XQotJURFU0NSSVBUSU9OJT1Ecml2ZXJJbnN0YWxsLCBVU0JcVklEXzA1MjUmUElEX0E0QTcsIFVTQlxWSURfMUQ2QiZQSURfMDEwNCZNSV8wMgorJURFU0NSSVBUSU9OJT1Ecml2ZXJJbnN0YWxsLCBVU0JcVklEXzA1MjUmUElEX0E0QTcsIFVTQlxWSURfMUQ2QiZQSURfMDEwNCZNSV8wMiwgVVNCXFZJRF8xRDZCJlBJRF8wMTA2Jk1JXzAwCiAKIAogOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9hcGkudHh0IGIvRG9jdW1lbnRhdGlvbi92aXJ0dWFsL2t2bS9hcGkudHh0CmluZGV4IDc5NDViMGIuLmUyYTRiNTIgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vdmlydHVhbC9rdm0vYXBpLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3ZpcnR1YWwva3ZtL2FwaS50eHQKQEAgLTExMDAsNiArMTEwMCwxNSBAQAogICAgZWF4LCBlYngsIGVjeCwgZWR4OiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmb3IKICAgICAgICAgIHRoaXMgZnVuY3Rpb24vaW5kZXggY29tYmluYXRpb24KIAorVGhlIFRTQyBkZWFkbGluZSB0aW1lciBmZWF0dXJlIChDUFVJRCBsZWFmIDEsIGVjeFsyNF0pIGlzIGFsd2F5cyByZXR1cm5lZAorYXMgZmFsc2UsIHNpbmNlIHRoZSBmZWF0dXJlIGRlcGVuZHMgb24gS1ZNX0NSRUFURV9JUlFDSElQIGZvciBsb2NhbCBBUElDCitzdXBwb3J0LiAgSW5zdGVhZCBpdCBpcyByZXBvcnRlZCB2aWEKKworICBpb2N0bChLVk1fQ0hFQ0tfRVhURU5TSU9OLCBLVk1fQ0FQX1RTQ19ERUFETElORV9USU1FUikKKworaWYgdGhhdCByZXR1cm5zIHRydWUgYW5kIHlvdSB1c2UgS1ZNX0NSRUFURV9JUlFDSElQLCBvciBpZiB5b3UgZW11bGF0ZSB0aGUKK2ZlYXR1cmUgaW4gdXNlcnNwYWNlLCB0aGVuIHlvdSBjYW4gZW5hYmxlIHRoZSBmZWF0dXJlIGZvciBLVk1fU0VUX0NQVUlEMi4KKwogNC40NyBLVk1fUFBDX0dFVF9QVklORk8KIAogQ2FwYWJpbGl0eTogS1ZNX0NBUF9QUENfR0VUX1BWSU5GTwpAQCAtMTE1MSw2ICsxMTYwLDEzIEBACiAvKiBEZXBlbmRzIG9uIEtWTV9DQVBfSU9NTVUgKi8KICNkZWZpbmUgS1ZNX0RFVl9BU1NJR05fRU5BQkxFX0lPTU1VCSgxIDw8IDApCiAKK1RoZSBLVk1fREVWX0FTU0lHTl9FTkFCTEVfSU9NTVUgZmxhZyBpcyBhIG1hbmRhdG9yeSBvcHRpb24gdG8gZW5zdXJlCitpc29sYXRpb24gb2YgdGhlIGRldmljZS4gIFVzYWdlcyBub3Qgc3BlY2lmeWluZyB0aGlzIGZsYWcgYXJlIGRlcHJlY2F0ZWQuCisKK09ubHkgUENJIGhlYWRlciB0eXBlIDAgZGV2aWNlcyB3aXRoIFBDSSBCQVIgcmVzb3VyY2VzIGFyZSBzdXBwb3J0ZWQgYnkKK2RldmljZSBhc3NpZ25tZW50LiAgVGhlIHVzZXIgcmVxdWVzdGluZyB0aGlzIGlvY3RsIG11c3QgaGF2ZSByZWFkL3dyaXRlCithY2Nlc3MgdG8gdGhlIFBDSSBzeXNmcyByZXNvdXJjZSBmaWxlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS4KKwogNC40OSBLVk1fREVBU1NJR05fUENJX0RFVklDRQogCiBDYXBhYmlsaXR5OiBLVk1fQ0FQX0RFVklDRV9ERUFTU0lHTk1FTlQKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggNDQ3NTYwMi4uMjc0N2E3ZSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTUxMSw4ICs1MTEsOCBAQAogTDoJaW9tbXVAbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKIFQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvam9yby9saW51eC0yLjYtaW9tbXUuZ2l0CiBTOglTdXBwb3J0ZWQKLUY6CWFyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUqLmMKLUY6CWFyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdSouaAorRjoJZHJpdmVycy9pb21tdS9hbWRfaW9tbXUqLltjaF0KK0Y6CWluY2x1ZGUvbGludXgvYW1kLWlvbW11LmgKIAogQU1EIE1JQ1JPQ09ERSBVUERBVEUgU1VQUE9SVAogTToJQW5kcmVhcyBIZXJybWFubiA8YW5kcmVhcy5oZXJybWFubjNAYW1kLmNvbT4KQEAgLTEwNTQsMzUgKzEwNTQsMTggQEAKIE06CUJlbiBEb29rcyA8YmVuLWxpbnV4QGZsdWZmLm9yZz4KIE06CUt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4KIEw6CWxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZyAobW9kZXJhdGVkIGZvciBub24tc3Vic2NyaWJlcnMpCitMOglsaW51eC1zYW1zdW5nLXNvY0B2Z2VyLmtlcm5lbC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQogVzoJaHR0cDovL3d3dy5mbHVmZi5vcmcvYmVuL2xpbnV4LwogUzoJTWFpbnRhaW5lZAogRjoJYXJjaC9hcm0vcGxhdC1zYW1zdW5nLwogRjoJYXJjaC9hcm0vcGxhdC1zM2MyNHh4LwogRjoJYXJjaC9hcm0vcGxhdC1zNXAvCitGOglhcmNoL2FybS9tYWNoLXMzYzI0Ki8KK0Y6CWFyY2gvYXJtL21hY2gtczNjNjR4eC8KIEY6CWRyaXZlcnMvKi8qczNjMjQxMCoKIEY6CWRyaXZlcnMvKi8qLypzM2MyNDEwKgotCi1BUk0vUzNDMjQxMCBBUk0gQVJDSElURUNUVVJFCi1NOglCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+Ci1MOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQotVzoJaHR0cDovL3d3dy5mbHVmZi5vcmcvYmVuL2xpbnV4LwotUzoJTWFpbnRhaW5lZAotRjoJYXJjaC9hcm0vbWFjaC1zM2MyNDEwLwotCi1BUk0vUzNDMjQ0eCBBUk0gQVJDSElURUNUVVJFCi1NOglCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+Ci1MOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQotVzoJaHR0cDovL3d3dy5mbHVmZi5vcmcvYmVuL2xpbnV4LwotUzoJTWFpbnRhaW5lZAotRjoJYXJjaC9hcm0vbWFjaC1zM2MyNDQwLwotRjoJYXJjaC9hcm0vbWFjaC1zM2MyNDQzLwotCi1BUk0vUzNDNjR4eCBBUk0gQVJDSElURUNUVVJFCi1NOglCZW4gRG9va3MgPGJlbi1saW51eEBmbHVmZi5vcmc+Ci1MOglsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQotVzoJaHR0cDovL3d3dy5mbHVmZi5vcmcvYmVuL2xpbnV4LwotUzoJTWFpbnRhaW5lZAotRjoJYXJjaC9hcm0vbWFjaC1zM2M2NHh4LworRjoJZHJpdmVycy9zcGkvc3BpLXMzYyoKK0Y6CXNvdW5kL3NvYy9zYW1zdW5nLyoKIAogQVJNL1M1UCBFWFlOT1MgQVJNIEFSQ0hJVEVDVFVSRVMKIE06CUt1a2ppbiBLaW0gPGtnZW5lLmtpbUBzYW1zdW5nLmNvbT4KQEAgLTE3MTUsMTEgKzE2OTgsOSBAQAogCiBDQU4gTkVUV09SSyBMQVlFUgogTToJT2xpdmVyIEhhcnRrb3BwIDxzb2NrZXRjYW5AaGFydGtvcHAubmV0PgotTToJT2xpdmVyIEhhcnRrb3BwIDxvbGl2ZXIuaGFydGtvcHBAdm9sa3N3YWdlbi5kZT4KLU06CVVycyBUaHVlcm1hbm4gPHVycy50aHVlcm1hbm5Adm9sa3N3YWdlbi5kZT4KIEw6CWxpbnV4LWNhbkB2Z2VyLmtlcm5lbC5vcmcKLUw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKLVc6CWh0dHA6Ly9kZXZlbG9wZXIuYmVybGlvcy5kZS9wcm9qZWN0cy9zb2NrZXRjYW4vCitXOglodHRwOi8vZ2l0b3Jpb3VzLm9yZy9saW51eC1jYW4KK1Q6CWdpdCBnaXQ6Ly9naXRvcmlvdXMub3JnL2xpbnV4LWNhbi9saW51eC1jYW4tbmV4dC5naXQKIFM6CU1haW50YWluZWQKIEY6CW5ldC9jYW4vCiBGOglpbmNsdWRlL2xpbnV4L2Nhbi5oCkBAIC0xNzMwLDkgKzE3MTEsMTAgQEAKIAogQ0FOIE5FVFdPUksgRFJJVkVSUwogTToJV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CitNOglNYXJjIEtsZWluZS1CdWRkZSA8bWtsQHBlbmd1dHJvbml4LmRlPgogTDoJbGludXgtY2FuQHZnZXIua2VybmVsLm9yZwotTDoJbmV0ZGV2QHZnZXIua2VybmVsLm9yZwotVzoJaHR0cDovL2RldmVsb3Blci5iZXJsaW9zLmRlL3Byb2plY3RzL3NvY2tldGNhbi8KK1c6CWh0dHA6Ly9naXRvcmlvdXMub3JnL2xpbnV4LWNhbgorVDoJZ2l0IGdpdDovL2dpdG9yaW91cy5vcmcvbGludXgtY2FuL2xpbnV4LWNhbi1uZXh0LmdpdAogUzoJTWFpbnRhaW5lZAogRjoJZHJpdmVycy9uZXQvY2FuLwogRjoJaW5jbHVkZS9saW51eC9jYW4vZGV2LmgKQEAgLTI3MTcsNyArMjY5OSw3IEBACiBNOglTdGVmYW4gUmljaHRlciA8c3RlZmFuckBzNXI2LmluLWJlcmxpbi5kZT4KIEw6CWxpbnV4MTM5NC1kZXZlbEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKIFc6CWh0dHA6Ly9pZWVlMTM5NC53aWtpLmtlcm5lbC5vcmcvCi1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2llZWUxMzk0L2xpbnV4MTM5NC0yLjYuZ2l0CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2llZWUxMzk0L2xpbnV4MTM5NC5naXQKIFM6CU1haW50YWluZWQKIEY6CWRyaXZlcnMvZmlyZXdpcmUvCiBGOglpbmNsdWRlL2xpbnV4L2ZpcmV3aXJlKi5oCkBAIC0zMTE4LDYgKzMxMDAsNyBAQAogCiBISUdILVJFU09MVVRJT04gVElNRVJTLCBDTE9DS0VWRU5UUywgRFlOVElDS1MKIE06CVRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXAvdGlwLmdpdCB0aW1lcnMvY29yZQogUzoJTWFpbnRhaW5lZAogRjoJRG9jdW1lbnRhdGlvbi90aW1lcnMvCiBGOglrZXJuZWwvaHJ0aW1lci5jCkBAIC0zNjI3LDcgKzM2MTAsNyBAQAogSVJRIFNVQlNZU1RFTQogTToJVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CiBTOglNYWludGFpbmVkCi1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RpcC9saW51eC0yLjYtdGlwLmdpdCBpcnEvY29yZQorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXAvdGlwLmdpdCBpcnEvY29yZQogRjoJa2VybmVsL2lycS8KIAogSVNBUE5QCkBAIC00MDI4LDcgKzQwMTEsNyBAQAogTToJTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KIFc6CWh0dHA6Ly93d3cucGVuZ3VpbnBwYy5vcmcvCiBMOglsaW51eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZwotVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9qd2JveWVyL3Bvd2VycGMtNHh4LmdpdAorVDoJZ2l0IGdpdDovL2dpdC5pbmZyYWRlYWQub3JnL3VzZXJzL2p3Ym95ZXIvcG93ZXJwYy00eHguZ2l0CiBTOglNYWludGFpbmVkCiBGOglhcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC8KIEY6CWFyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4LwpAQCAtNDExNSw3ICs0MDk4LDcgQEAKIExPQ0tERVAgQU5EIExPQ0tTVEFUCiBNOglQZXRlciBaaWpsc3RyYSA8cGV0ZXJ6QGluZnJhZGVhZC5vcmc+CiBNOglJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KLVQ6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvcGV0ZXJ6L2xpbnV4LTIuNi1sb2NrZGVwLmdpdAorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXAvdGlwLmdpdCBjb3JlL2xvY2tpbmcKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vbG9ja2RlcCoudHh0CiBGOglEb2N1bWVudGF0aW9uL2xvY2tzdGF0LnR4dApAQCAtNDI5Nyw3ICs0MjgwLDkgQEAKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24vZHZiLwogRjoJRG9jdW1lbnRhdGlvbi92aWRlbzRsaW51eC8KK0Y6CURvY3VtZW50YXRpb24vRG9jQm9vay9tZWRpYS8KIEY6CWRyaXZlcnMvbWVkaWEvCitGOglkcml2ZXJzL3N0YWdpbmcvbWVkaWEvCiBGOglpbmNsdWRlL21lZGlhLwogRjoJaW5jbHVkZS9saW51eC9kdmIvCiBGOglpbmNsdWRlL2xpbnV4L3ZpZGVvZGV2Ki5oCkBAIC00MzE5LDggKzQzMDQsOSBAQAogRjoJbW0vCiAKIE1FTU9SWSBSRVNPVVJDRSBDT05UUk9MTEVSCitNOglKb2hhbm5lcyBXZWluZXIgPGhhbm5lc0BjbXB4Y2hnLm9yZz4KK006CU1pY2hhbCBIb2NrbyA8bWhvY2tvQHN1c2UuY3o+CiBNOglCYWxiaXIgU2luZ2ggPGJzaW5naGFyb3JhQGdtYWlsLmNvbT4KLU06CURhaXN1a2UgTmlzaGltdXJhIDxuaXNoaW11cmFAbXhwLm5lcy5uZWMuY28uanA+CiBNOglLQU1FWkFXQSBIaXJveXVraSA8a2FtZXphd2EuaGlyb3l1QGpwLmZ1aml0c3UuY29tPgogTDoJY2dyb3Vwc0B2Z2VyLmtlcm5lbC5vcmcKIEw6CWxpbnV4LW1tQGt2YWNrLm9yZwpAQCAtNDg2OCw2ICs0ODU0LDE0IEBACiBUOglnaXQgZ2l0Oi8vb3BlbnJpc2MubmV0L35qb25hcy9saW51eAogRjoJYXJjaC9vcGVucmlzYwogCitPUEVOVlNXSVRDSAorTToJSmVzc2UgR3Jvc3MgPGplc3NlQG5pY2lyYS5jb20+CitMOglkZXZAb3BlbnZzd2l0Y2gub3JnCitXOglodHRwOi8vb3BlbnZzd2l0Y2gub3JnCitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2plc3NlL29wZW52c3dpdGNoLmdpdAorUzoJTWFpbnRhaW5lZAorRjoJbmV0L29wZW52c3dpdGNoLworCiBPUEw0IERSSVZFUgogTToJQ2xlbWVucyBMYWRpc2NoIDxjbGVtZW5zQGxhZGlzY2guZGU+CiBMOglhbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcgKG1vZGVyYXRlZCBmb3Igbm9uLXN1YnNjcmliZXJzKQpAQCAtNTEwMiw2ICs1MDk2LDcgQEAKIE06CVBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgogTToJSW5nbyBNb2xuYXIgPG1pbmdvQGVsdGUuaHU+CiBNOglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAZ2hvc3Rwcm90b2NvbHMubmV0PgorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXAvdGlwLmdpdCBwZXJmL2NvcmUKIFM6CVN1cHBvcnRlZAogRjoJa2VybmVsL2V2ZW50cy8qCiBGOglpbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaApAQCAtNTE4MSw2ICs1MTc2LDcgQEAKIAogUE9TSVggQ0xPQ0tTIGFuZCBUSU1FUlMKIE06CVRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC90aXAvdGlwLmdpdCB0aW1lcnMvY29yZQogUzoJU3VwcG9ydGVkCiBGOglmcy90aW1lcmZkLmMKIEY6CWluY2x1ZGUvbGludXgvdGltZXIqCkBAIC01Mzg1LDYgKzUzODEsNyBAQAogRjoJZHJpdmVycy9zY3NpL3FsYTR4eHgvCiAKIFFMT0dJQyBRTEEzWFhYIE5FVFdPUksgRFJJVkVSCitNOglKaXRlbmRyYSBLYWxzYXJpYSA8aml0ZW5kcmEua2Fsc2FyaWFAcWxvZ2ljLmNvbT4KIE06CVJvbiBNZXJjZXIgPHJvbi5tZXJjZXJAcWxvZ2ljLmNvbT4KIE06CWxpbnV4LWRyaXZlckBxbG9naWMuY29tCiBMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCkBAIC01Njk2LDYgKzU2OTMsNyBAQAogVElNRUtFRVBJTkcsIE5UUAogTToJSm9obiBTdHVsdHogPGpvaG5zdHVsQHVzLmlibS5jb20+CiBNOglUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdGlwL3RpcC5naXQgdGltZXJzL2NvcmUKIFM6CVN1cHBvcnRlZAogRjoJaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCiBGOglpbmNsdWRlL2xpbnV4L3RpbWUuaApAQCAtNTcyMCw2ICs1NzE4LDcgQEAKIFNDSEVEVUxFUgogTToJSW5nbyBNb2xuYXIgPG1pbmdvQGVsdGUuaHU+CiBNOglQZXRlciBaaWpsc3RyYSA8cGV0ZXJ6QGluZnJhZGVhZC5vcmc+CitUOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RpcC90aXAuZ2l0IHNjaGVkL2NvcmUKIFM6CU1haW50YWluZWQKIEY6CWtlcm5lbC9zY2hlZCoKIEY6CWluY2x1ZGUvbGludXgvc2NoZWQuaApAQCAtNTkwMiw3ICs1OTAxLDYgQEAKIAogU0ZDIE5FVFdPUksgRFJJVkVSCiBNOglTb2xhcmZsYXJlIGxpbnV4IG1haW50YWluZXJzIDxsaW51eC1uZXQtZHJpdmVyc0Bzb2xhcmZsYXJlLmNvbT4KLU06CVN0ZXZlIEhvZGdzb24gPHNob2Rnc29uQHNvbGFyZmxhcmUuY29tPgogTToJQmVuIEh1dGNoaW5ncyA8Ymh1dGNoaW5nc0Bzb2xhcmZsYXJlLmNvbT4KIEw6CW5ldGRldkB2Z2VyLmtlcm5lbC5vcmcKIFM6CVN1cHBvcnRlZApAQCAtNjUxMCw2ICs2NTA4LDEzIEBACiBTOglNYWludGFpbmVkCiBGOgluZXQvaXB2NC90Y3BfbHAuYwogCitURUFNIERSSVZFUgorTToJSmlyaSBQaXJrbyA8anBpcmtvQHJlZGhhdC5jb20+CitMOgluZXRkZXZAdmdlci5rZXJuZWwub3JnCitTOglTdXBwb3J0ZWQKK0Y6CWRyaXZlcnMvbmV0L3RlYW0vCitGOglpbmNsdWRlL2xpbnV4L2lmX3RlYW0uaAorCiBURUdSQSBTVVBQT1JUCiBNOglDb2xpbiBDcm9zcyA8Y2Nyb3NzQGFuZHJvaWQuY29tPgogTToJT2xvZiBKb2hhbnNzb24gPG9sb2ZAbGl4b20ubmV0PgpAQCAtNjY0Nyw3ICs2NjUyLDcgQEAKIE06CVN0ZXZlbiBSb3N0ZWR0IDxyb3N0ZWR0QGdvb2RtaXMub3JnPgogTToJRnJlZGVyaWMgV2Vpc2JlY2tlciA8ZndlaXNiZWNAZ21haWwuY29tPgogTToJSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+Ci1UOglnaXQgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L3RpcC9saW51eC0yLjYtdGlwLmdpdCBwZXJmL2NvcmUKK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdGlwL3RpcC5naXQgcGVyZi9jb3JlCiBTOglNYWludGFpbmVkCiBGOglEb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS50eHQKIEY6CWFyY2gvKi8qLyovZnRyYWNlLmgKQEAgLTczOTcsNyArNzQwMiw3IEBACiBNOglJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KIE06CSJILiBQZXRlciBBbnZpbiIgPGhwYUB6eXRvci5jb20+CiBNOgl4ODZAa2VybmVsLm9yZwotVDoJZ2l0IGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC94ODYvbGludXgtMi42LXg4Ni5naXQKK1Q6CWdpdCBnaXQ6Ly9naXQua2VybmVsLm9yZy9wdWIvc2NtL2xpbnV4L2tlcm5lbC9naXQvdGlwL3RpcC5naXQgeDg2L2NvcmUKIFM6CU1haW50YWluZWQKIEY6CURvY3VtZW50YXRpb24veDg2LwogRjoJYXJjaC94ODYvCmRpZmYgLS1naXQgYS9NYWtlZmlsZSBiL01ha2VmaWxlCmluZGV4IDEyYWFmYzIuLmFkZGRkMTEgMTAwNjQ0Ci0tLSBhL01ha2VmaWxlCisrKyBiL01ha2VmaWxlCkBAIC0xLDcgKzEsNyBAQAogVkVSU0lPTiA9IDMKIFBBVENITEVWRUwgPSAyCiBTVUJMRVZFTCA9IDAKLUVYVFJBVkVSU0lPTiA9IC1yYzQKK0VYVFJBVkVSU0lPTiA9CiBOQU1FID0gU2FiZXItdG9vdGhlZCBTcXVpcnJlbAogCiAjICpET0NVTUVOVEFUSU9OKgpkaWZmIC0tZ2l0IGEvYXJjaC9LY29uZmlnIGIvYXJjaC9LY29uZmlnCmluZGV4IDRiMDY2OWMuLjI1MDU3NDAgMTAwNjQ0Ci0tLSBhL2FyY2gvS2NvbmZpZworKysgYi9hcmNoL0tjb25maWcKQEAgLTMwLDYgKzMwLDEwIEBACiBjb25maWcgSEFWRV9PUFJPRklMRQogCWJvb2wKIAorY29uZmlnIE9QUk9GSUxFX05NSV9USU1FUgorCWRlZl9ib29sIHkKKwlkZXBlbmRzIG9uIFBFUkZfRVZFTlRTICYmIEhBVkVfUEVSRl9FVkVOVFNfTk1JCisKIGNvbmZpZyBLUFJPQkVTCiAJYm9vbCAiS3Byb2JlcyIKIAlkZXBlbmRzIG9uIE1PRFVMRVMKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL2FscGhhL2luY2x1ZGUvYXNtL3NvY2tldC5oCmluZGV4IDA2ZWRmZWYuLjA4MjM1NWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYWxwaGEvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9hbHBoYS9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNjksNiArNjksOSBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogLyogT19OT05CTE9DSyBjbGFzaGVzIHdpdGggdGhlIGJpdHMgdXNlZCBmb3Igc29ja2V0IHR5cGVzLiAgVGhlcmVmb3JlIHdlCiAgKiBoYXZlIHRvIGRlZmluZSBTT0NLX05PTkJMT0NLIHRvIGEgZGlmZmVyZW50IHZhbHVlIGhlcmUuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL0tjb25maWcgYi9hcmNoL2FybS9LY29uZmlnCmluZGV4IGUwODRiN2UuLmIyNTljN2MgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL0tjb25maWcKKysrIGIvYXJjaC9hcm0vS2NvbmZpZwpAQCAtMjIwLDggKzIyMCw5IEBACiAJICBiZSBhdm9pZGVkIHdoZW4gcG9zc2libGUuCiAKIGNvbmZpZyBQSFlTX09GRlNFVAotCWhleCAiUGh5c2ljYWwgYWRkcmVzcyBvZiBtYWluIG1lbW9yeSIKKwloZXggIlBoeXNpY2FsIGFkZHJlc3Mgb2YgbWFpbiBtZW1vcnkiIGlmIE1NVQogCWRlcGVuZHMgb24gIUFSTV9QQVRDSF9QSFlTX1ZJUlQgJiYgIU5FRURfTUFDSF9NRU1PUllfSAorCWRlZmF1bHQgRFJBTV9CQVNFIGlmICFNTVUKIAloZWxwCiAJICBQbGVhc2UgcHJvdmlkZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBjb3JyZXNwb25kaW5nIHRvIHRoZQogCSAgbG9jYXRpb24gb2YgbWFpbiBtZW1vcnkgaW4geW91ciBzeXN0ZW0uCkBAIC0xMjQ1LDcgKzEyNDYsNyBAQAogCiBjb25maWcgQVJNX0VSUkFUQV83MjA3ODkKIAlib29sICJBUk0gZXJyYXRhOiBUTEJJQVNJRElTIGFuZCBUTEJJTVZBSVMgb3BlcmF0aW9ucyBjYW4gYnJvYWRjYXN0IGEgZmF1bHR5IEFTSUQiCi0JZGVwZW5kcyBvbiBDUFVfVjcgJiYgU01QCisJZGVwZW5kcyBvbiBDUFVfVjcKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSB3b3JrYXJvdW5kIGZvciB0aGUgNzIwNzg5IENvcnRleC1BOSAocHJpb3IgdG8KIAkgIHIycDApIGVycmF0dW0uIEEgZmF1bHR5IEFTSUQgY2FuIGJlIHNlbnQgdG8gdGhlIG90aGVyIENQVXMgZm9yIHRoZQpAQCAtMTI4MSw3ICsxMjgyLDcgQEAKIAogY29uZmlnIEFSTV9FUlJBVEFfNzUxNDcyCiAJYm9vbCAiQVJNIGVycmF0YTogSW50ZXJydXB0ZWQgSUNJQUxMVUlTIG1heSBwcmV2ZW50IGNvbXBsZXRpb24gb2YgYnJvYWRjYXN0ZWQgb3BlcmF0aW9uIgotCWRlcGVuZHMgb24gQ1BVX1Y3ICYmIFNNUAorCWRlcGVuZHMgb24gQ1BVX1Y3CiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgd29ya2Fyb3VuZCBmb3IgdGhlIDc1MTQ3MiBDb3J0ZXgtQTkgKHByaW9yCiAJICB0byByM3AwKSBlcnJhdHVtLiBBbiBpbnRlcnJ1cHRlZCBJQ0lBTExVSVMgb3BlcmF0aW9uIG1heSBwcmV2ZW50IHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29tbW9uL3BsMzMwLmMgYi9hcmNoL2FybS9jb21tb24vcGwzMzAuYwppbmRleCBmNDA3YTZiLi44ZDhkZjc0IDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb21tb24vcGwzMzAuYworKysgYi9hcmNoL2FybS9jb21tb24vcGwzMzAuYwpAQCAtMjIxLDE3ICsyMjEsNiBAQAogICovCiAjZGVmaW5lIE1DT0RFX0JVRkZfUEVSX1JFUQkyNTYKIAotLyoKLSAqIE1hcmsgYSBfcGwzMzBfcmVxIGFzIGZyZWUuCi0gKiBXZSBkbyBpdCBieSB3cml0aW5nIERNQUVORCBhcyB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24KLSAqIGJlY2F1c2Ugbm8gdmFsaWQgcmVxdWVzdCBpcyBnb2luZyB0byBoYXZlIERNQUVORCBhcwotICogaXRzIGZpcnN0IGluc3RydWN0aW9uIHRvIGV4ZWN1dGUuCi0gKi8KLSNkZWZpbmUgTUFSS19GUkVFKHJlcSkJZG8geyBcCi0JCQkJX2VtaXRfRU5EKDAsIChyZXEpLT5tY19jcHUpOyBcCi0JCQkJKHJlcSktPm1jX2xlbiA9IDA7IFwKLQkJCX0gd2hpbGUgKDApCi0KIC8qIElmIHRoZSBfcGwzMzBfcmVxIGlzIGF2YWlsYWJsZSB0byB0aGUgY2xpZW50ICovCiAjZGVmaW5lIElTX0ZSRUUocmVxKQkoKigodTggKikoKHJlcSktPm1jX2NwdSkpID09IENNRF9ETUFFTkQpCiAKQEAgLTMwMSw4ICsyOTAsMTAgQEAKIAlzdHJ1Y3QgcGwzMzBfZG1hYyAqZG1hYzsKIAkvKiBPbmx5IHR3byBhdCBhIHRpbWUgKi8KIAlzdHJ1Y3QgX3BsMzMwX3JlcSByZXFbMl07Ci0JLyogSW5kZXggb2YgdGhlIGxhc3Qgc3VibWl0dGVkIHJlcXVlc3QgKi8KKwkvKiBJbmRleCBvZiB0aGUgbGFzdCBlbnF1ZXVlZCByZXF1ZXN0ICovCiAJdW5zaWduZWQgbHN0ZW5xOworCS8qIEluZGV4IG9mIHRoZSBsYXN0IHN1Ym1pdHRlZCByZXF1ZXN0IG9yIC0xIGlmIHRoZSBETUEgaXMgc3RvcHBlZCAqLworCWludCByZXFfcnVubmluZzsKIH07CiAKIGVudW0gcGwzMzBfZG1hY19zdGF0ZSB7CkBAIC03NzgsNiArNzY5LDIyIEBACiAJd3JpdGVsKDAsIHJlZ3MgKyBEQkdDTUQpOwogfQogCisvKgorICogTWFyayBhIF9wbDMzMF9yZXEgYXMgZnJlZS4KKyAqIFdlIGRvIGl0IGJ5IHdyaXRpbmcgRE1BRU5EIGFzIHRoZSBmaXJzdCBpbnN0cnVjdGlvbgorICogYmVjYXVzZSBubyB2YWxpZCByZXF1ZXN0IGlzIGdvaW5nIHRvIGhhdmUgRE1BRU5EIGFzCisgKiBpdHMgZmlyc3QgaW5zdHJ1Y3Rpb24gdG8gZXhlY3V0ZS4KKyAqLworc3RhdGljIHZvaWQgbWFya19mcmVlKHN0cnVjdCBwbDMzMF90aHJlYWQgKnRocmQsIGludCBpZHgpCit7CisJc3RydWN0IF9wbDMzMF9yZXEgKnJlcSA9ICZ0aHJkLT5yZXFbaWR4XTsKKworCV9lbWl0X0VORCgwLCByZXEtPm1jX2NwdSk7CisJcmVxLT5tY19sZW4gPSAwOworCisJdGhyZC0+cmVxX3J1bm5pbmcgPSAtMTsKK30KKwogc3RhdGljIGlubGluZSB1MzIgX3N0YXRlKHN0cnVjdCBwbDMzMF90aHJlYWQgKnRocmQpCiB7CiAJdm9pZCBfX2lvbWVtICpyZWdzID0gdGhyZC0+ZG1hYy0+cGluZm8tPmJhc2U7CkBAIC04MzYsMzEgKzg0Myw2IEBACiAJfQogfQogCi0vKiBJZiB0aGUgcmVxdWVzdCAncmVxJyBvZiB0aHJlYWQgJ3RocmQnIGlzIGN1cnJlbnRseSBhY3RpdmUgKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBfcmVxX2FjdGl2ZShzdHJ1Y3QgcGwzMzBfdGhyZWFkICp0aHJkLAotCQlzdHJ1Y3QgX3BsMzMwX3JlcSAqcmVxKQotewotCXZvaWQgX19pb21lbSAqcmVncyA9IHRocmQtPmRtYWMtPnBpbmZvLT5iYXNlOwotCXUzMiBidWYgPSByZXEtPm1jX2J1cywgcGMgPSByZWFkbChyZWdzICsgQ1BDKHRocmQtPmlkKSk7Ci0KLQlpZiAoSVNfRlJFRShyZXEpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlyZXR1cm4gKHBjID49IGJ1ZiAmJiBwYyA8PSBidWYgKyByZXEtPm1jX2xlbikgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLS8qIFJldHVybnMgMCBpZiB0aGUgdGhyZWFkIGlzIGluYWN0aXZlLCBJRCBvZiBhY3RpdmUgcmVxICsgMSBvdGhlcndpc2UgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgX3RocmRfYWN0aXZlKHN0cnVjdCBwbDMzMF90aHJlYWQgKnRocmQpCi17Ci0JaWYgKF9yZXFfYWN0aXZlKHRocmQsICZ0aHJkLT5yZXFbMF0pKQotCQlyZXR1cm4gMTsgLyogRmlyc3QgcmVxIGFjdGl2ZSAqLwotCi0JaWYgKF9yZXFfYWN0aXZlKHRocmQsICZ0aHJkLT5yZXFbMV0pKQotCQlyZXR1cm4gMjsgLyogU2Vjb25kIHJlcSBhY3RpdmUgKi8KLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBfc3RvcChzdHJ1Y3QgcGwzMzBfdGhyZWFkICp0aHJkKQogewogCXZvaWQgX19pb21lbSAqcmVncyA9IHRocmQtPmRtYWMtPnBpbmZvLT5iYXNlOwpAQCAtODkyLDE3ICs4NzQsMjIgQEAKIAlzdHJ1Y3QgX2FyZ19HTyBnbzsKIAl1bnNpZ25lZCBuczsKIAl1OCBpbnNuWzZdID0gezAsIDAsIDAsIDAsIDAsIDB9OworCWludCBpZHg7CiAKIAkvKiBSZXR1cm4gaWYgYWxyZWFkeSBBQ1RJVkUgKi8KIAlpZiAoX3N0YXRlKHRocmQpICE9IFBMMzMwX1NUQVRFX1NUT1BQRUQpCiAJCXJldHVybiB0cnVlOwogCi0JaWYgKCFJU19GUkVFKCZ0aHJkLT5yZXFbMSAtIHRocmQtPmxzdGVucV0pKQotCQlyZXEgPSAmdGhyZC0+cmVxWzEgLSB0aHJkLT5sc3RlbnFdOwotCWVsc2UgaWYgKCFJU19GUkVFKCZ0aHJkLT5yZXFbdGhyZC0+bHN0ZW5xXSkpCi0JCXJlcSA9ICZ0aHJkLT5yZXFbdGhyZC0+bHN0ZW5xXTsKLQllbHNlCi0JCXJlcSA9IE5VTEw7CisJaWR4ID0gMSAtIHRocmQtPmxzdGVucTsKKwlpZiAoIUlTX0ZSRUUoJnRocmQtPnJlcVtpZHhdKSkKKwkJcmVxID0gJnRocmQtPnJlcVtpZHhdOworCWVsc2UgeworCQlpZHggPSB0aHJkLT5sc3RlbnE7CisJCWlmICghSVNfRlJFRSgmdGhyZC0+cmVxW2lkeF0pKQorCQkJcmVxID0gJnRocmQtPnJlcVtpZHhdOworCQllbHNlCisJCQlyZXEgPSBOVUxMOworCX0KIAogCS8qIFJldHVybiBpZiBubyByZXF1ZXN0ICovCiAJaWYgKCFyZXEgfHwgIXJlcS0+cikKQEAgLTkzMyw2ICs5MjAsOCBAQAogCS8qIE9ubHkgbWFuYWdlciBjYW4gZXhlY3V0ZSBHTyAqLwogCV9leGVjdXRlX0RCR0lOU04odGhyZCwgaW5zbiwgdHJ1ZSk7CiAKKwl0aHJkLT5yZXFfcnVubmluZyA9IGlkeDsKKwogCXJldHVybiB0cnVlOwogfQogCkBAIC0xMzgyLDggKzEzNzEsOCBAQAogCiAJCQl0aHJkLT5yZXFbMF0uciA9IE5VTEw7CiAJCQl0aHJkLT5yZXFbMV0uciA9IE5VTEw7Ci0JCQlNQVJLX0ZSRUUoJnRocmQtPnJlcVswXSk7Ci0JCQlNQVJLX0ZSRUUoJnRocmQtPnJlcVsxXSk7CisJCQltYXJrX2ZyZWUodGhyZCwgMCk7CisJCQltYXJrX2ZyZWUodGhyZCwgMSk7CiAKIAkJCS8qIENsZWFyIHRoZSByZXNldCBmbGFnICovCiAJCQlwbDMzMC0+ZG1hY190YmQucmVzZXRfY2hhbiAmPSB+KDEgPDwgaSk7CkBAIC0xNDYxLDE0ICsxNDUwLDEyIEBACiAKIAkJCXRocmQgPSAmcGwzMzAtPmNoYW5uZWxzW2lkXTsKIAotCQkJYWN0aXZlID0gX3RocmRfYWN0aXZlKHRocmQpOwotCQkJaWYgKCFhY3RpdmUpIC8qIEFib3J0ZWQgKi8KKwkJCWFjdGl2ZSA9IHRocmQtPnJlcV9ydW5uaW5nOworCQkJaWYgKGFjdGl2ZSA9PSAtMSkgLyogQWJvcnRlZCAqLwogCQkJCWNvbnRpbnVlOwogCi0JCQlhY3RpdmUgLT0gMTsKLQogCQkJcnFkb25lID0gJnRocmQtPnJlcVthY3RpdmVdOwotCQkJTUFSS19GUkVFKHJxZG9uZSk7CisJCQltYXJrX2ZyZWUodGhyZCwgYWN0aXZlKTsKIAogCQkJLyogR2V0IGdvaW5nIGFnYWluIEFTQVAgKi8KIAkJCV9zdGFydCh0aHJkKTsKQEAgLTE1MDksNyArMTQ5Niw3IEBACiAJc3RydWN0IHBsMzMwX3RocmVhZCAqdGhyZCA9IGNoX2lkOwogCXN0cnVjdCBwbDMzMF9kbWFjICpwbDMzMDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwLCBhY3RpdmU7CisJaW50IHJldCA9IDAsIGFjdGl2ZSA9IHRocmQtPnJlcV9ydW5uaW5nOwogCiAJaWYgKCF0aHJkIHx8IHRocmQtPmZyZWUgfHwgdGhyZC0+ZG1hYy0+c3RhdGUgPT0gRFlJTkcpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTUyNSwyOCArMTUxMiwyNCBAQAogCiAJCXRocmQtPnJlcVswXS5yID0gTlVMTDsKIAkJdGhyZC0+cmVxWzFdLnIgPSBOVUxMOwotCQlNQVJLX0ZSRUUoJnRocmQtPnJlcVswXSk7Ci0JCU1BUktfRlJFRSgmdGhyZC0+cmVxWzFdKTsKKwkJbWFya19mcmVlKHRocmQsIDApOworCQltYXJrX2ZyZWUodGhyZCwgMSk7CiAJCWJyZWFrOwogCiAJY2FzZSBQTDMzMF9PUF9BQk9SVDoKLQkJYWN0aXZlID0gX3RocmRfYWN0aXZlKHRocmQpOwotCiAJCS8qIE1ha2Ugc3VyZSB0aGUgY2hhbm5lbCBpcyBzdG9wcGVkICovCiAJCV9zdG9wKHRocmQpOwogCiAJCS8qIEFCT1JUIGlzIG9ubHkgZm9yIHRoZSBhY3RpdmUgcmVxICovCi0JCWlmICghYWN0aXZlKQorCQlpZiAoYWN0aXZlID09IC0xKQogCQkJYnJlYWs7CiAKLQkJYWN0aXZlLS07Ci0KIAkJdGhyZC0+cmVxW2FjdGl2ZV0uciA9IE5VTEw7Ci0JCU1BUktfRlJFRSgmdGhyZC0+cmVxW2FjdGl2ZV0pOworCQltYXJrX2ZyZWUodGhyZCwgYWN0aXZlKTsKIAogCQkvKiBTdGFydCB0aGUgbmV4dCAqLwogCWNhc2UgUEwzMzBfT1BfU1RBUlQ6Ci0JCWlmICghX3RocmRfYWN0aXZlKHRocmQpICYmICFfc3RhcnQodGhyZCkpCisJCWlmICgoYWN0aXZlID09IC0xKSAmJiAhX3N0YXJ0KHRocmQpKQogCQkJcmV0ID0gLUVJTzsKIAkJYnJlYWs7CiAKQEAgLTE1ODcsMTQgKzE1NzAsMTMgQEAKIAllbHNlCiAJCXBzdGF0dXMtPmZhdWx0aW5nID0gZmFsc2U7CiAKLQlhY3RpdmUgPSBfdGhyZF9hY3RpdmUodGhyZCk7CisJYWN0aXZlID0gdGhyZC0+cmVxX3J1bm5pbmc7CiAKLQlpZiAoIWFjdGl2ZSkgeworCWlmIChhY3RpdmUgPT0gLTEpIHsKIAkJLyogSW5kaWNhdGUgdGhhdCB0aGUgdGhyZWFkIGlzIG5vdCBydW5uaW5nICovCiAJCXBzdGF0dXMtPnRvcF9yZXEgPSBOVUxMOwogCQlwc3RhdHVzLT53YWl0X3JlcSA9IE5VTEw7CiAJfSBlbHNlIHsKLQkJYWN0aXZlLS07CiAJCXBzdGF0dXMtPnRvcF9yZXEgPSB0aHJkLT5yZXFbYWN0aXZlXS5yOwogCQlwc3RhdHVzLT53YWl0X3JlcSA9ICFJU19GUkVFKCZ0aHJkLT5yZXFbMSAtIGFjdGl2ZV0pCiAJCQkJCT8gdGhyZC0+cmVxWzEgLSBhY3RpdmVdLnIgOiBOVUxMOwpAQCAtMTY1OSw5ICsxNjQxLDkgQEAKIAkJCQl0aHJkLT5mcmVlID0gZmFsc2U7CiAJCQkJdGhyZC0+bHN0ZW5xID0gMTsKIAkJCQl0aHJkLT5yZXFbMF0uciA9IE5VTEw7Ci0JCQkJTUFSS19GUkVFKCZ0aHJkLT5yZXFbMF0pOworCQkJCW1hcmtfZnJlZSh0aHJkLCAwKTsKIAkJCQl0aHJkLT5yZXFbMV0uciA9IE5VTEw7Ci0JCQkJTUFSS19GUkVFKCZ0aHJkLT5yZXFbMV0pOworCQkJCW1hcmtfZnJlZSh0aHJkLCAxKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfQpAQCAtMTc2NywxNCArMTc0OSwxNCBAQAogCXRocmQtPnJlcVswXS5tY19idXMgPSBwbDMzMC0+bWNvZGVfYnVzCiAJCQkJKyAodGhyZC0+aWQgKiBwaS0+bWNidWZzeik7CiAJdGhyZC0+cmVxWzBdLnIgPSBOVUxMOwotCU1BUktfRlJFRSgmdGhyZC0+cmVxWzBdKTsKKwltYXJrX2ZyZWUodGhyZCwgMCk7CiAKIAl0aHJkLT5yZXFbMV0ubWNfY3B1ID0gdGhyZC0+cmVxWzBdLm1jX2NwdQogCQkJCSsgcGktPm1jYnVmc3ogLyAyOwogCXRocmQtPnJlcVsxXS5tY19idXMgPSB0aHJkLT5yZXFbMF0ubWNfYnVzCiAJCQkJKyBwaS0+bWNidWZzeiAvIDI7CiAJdGhyZC0+cmVxWzFdLnIgPSBOVUxMOwotCU1BUktfRlJFRSgmdGhyZC0+cmVxWzFdKTsKKwltYXJrX2ZyZWUodGhyZCwgMSk7CiB9CiAKIHN0YXRpYyBpbnQgZG1hY19hbGxvY190aHJlYWRzKHN0cnVjdCBwbDMzMF9kbWFjICpwbDMzMCkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2NvbmZpZ3MvaW14X3Y0X3Y1X2RlZmNvbmZpZyBiL2FyY2gvYXJtL2NvbmZpZ3MvaW14X3Y0X3Y1X2RlZmNvbmZpZwppbmRleCAxMWE0MTkyLi5jZjQ5N2NlIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL2lteF92NF92NV9kZWZjb25maWcKKysrIGIvYXJjaC9hcm0vY29uZmlncy9pbXhfdjRfdjVfZGVmY29uZmlnCkBAIC0xOCw5ICsxOCwxMCBAQAogQ09ORklHX0FSQ0hfSU1YX1Y0X1Y1PXkKIENPTkZJR19BUkNIX01YMUFEUz15CiBDT05GSUdfTUFDSF9TQ0I5MzI4PXkKK0NPTkZJR19NQUNIX0FQRjkzMjg9eQogQ09ORklHX01BQ0hfTVgyMUFEUz15CiBDT05GSUdfTUFDSF9NWDI1XzNEUz15Ci1DT05GSUdfTUFDSF9FVUtSRUFfQ1BVSU1YMjU9eQorQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDI1U0Q9eQogQ09ORklHX01BQ0hfTVgyN0FEUz15CiBDT05GSUdfTUFDSF9QQ00wMzg9eQogQ09ORklHX01BQ0hfQ1BVSU1YMjc9eQpAQCAtNzIsMTcgKzczLDE2IEBACiBDT05GSUdfTVREX0NGSV9JTlRFTEVYVD15CiBDT05GSUdfTVREX1BIWVNNQVA9eQogQ09ORklHX01URF9OQU5EPXkKK0NPTkZJR19NVERfTkFORF9NWEM9eQogQ09ORklHX01URF9VQkk9eQogQ09ORklHX01JU0NfREVWSUNFUz15CiBDT05GSUdfRUVQUk9NX0FUMjQ9eQogQ09ORklHX0VFUFJPTV9BVDI1PXkKIENPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQotQ09ORklHX1NNQzkxWD15CiBDT05GSUdfRE05MDAwPXkKK0NPTkZJR19TTUM5MVg9eQogQ09ORklHX1NNQzkxMVg9eQotIyBDT05GSUdfTkVUREVWXzEwMDAgaXMgbm90IHNldAotIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKK0NPTkZJR19TTVNDX1BIWT15CiAjIENPTkZJR19JTlBVVF9NT1VTRURFViBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfRVZERVY9eQogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldApAQCAtMTAwLDYgKzEwMCw3IEBACiBDT05GSUdfSTJDX0lNWD15CiBDT05GSUdfU1BJPXkKIENPTkZJR19TUElfSU1YPXkKK0NPTkZJR19TUElfU1BJREVWPXkKIENPTkZJR19XMT15CiBDT05GSUdfVzFfTUFTVEVSX01YQz15CiBDT05GSUdfVzFfU0xBVkVfVEhFUk09eQpAQCAtMTM5LDYgKzE0MCw3IEBACiBDT05GSUdfTU1DX01YQz15CiBDT05GSUdfTkVXX0xFRFM9eQogQ09ORklHX0xFRFNfQ0xBU1M9eQorQ09ORklHX0xFRFNfR1BJTz15CiBDT05GSUdfTEVEU19NQzEzNzgzPXkKIENPTkZJR19MRURTX1RSSUdHRVJTPXkKIENPTkZJR19MRURTX1RSSUdHRVJfVElNRVI9eQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vY29uZmlncy9vbWFwMV9kZWZjb25maWcgYi9hcmNoL2FybS9jb25maWdzL29tYXAxX2RlZmNvbmZpZwppbmRleCBhN2U3Nzc1Li45NDVhMzRmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9jb25maWdzL29tYXAxX2RlZmNvbmZpZworKysgYi9hcmNoL2FybS9jb25maWdzL29tYXAxX2RlZmNvbmZpZwpAQCAtNDgsMTIgKzQ4LDcgQEAKIENPTkZJR19NQUNIX05PS0lBNzcwPXkKIENPTkZJR19NQUNIX0FNU19ERUxUQT15CiBDT05GSUdfTUFDSF9PTUFQX0dFTkVSSUM9eQotQ09ORklHX09NQVBfQVJNXzIxNk1IWj15Ci1DT05GSUdfT01BUF9BUk1fMTk1TUhaPXkKLUNPTkZJR19PTUFQX0FSTV8xOTJNSFo9eQogQ09ORklHX09NQVBfQVJNXzE4Mk1IWj15Ci1DT05GSUdfT01BUF9BUk1fMTY4TUhaPXkKLSMgQ09ORklHX09NQVBfQVJNXzYwTUhaIGlzIG5vdCBzZXQKICMgQ09ORklHX0FSTV9USFVNQiBpcyBub3Qgc2V0CiBDT05GSUdfUENDQVJEPXkKIENPTkZJR19PTUFQX0NGPXkKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggOTBmZmQwNC4uZGVjNmY5YSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9hcm0vaW5jbHVkZS9hc20vc29ja2V0LmgKQEAgLTYyLDQgKzYyLDcgQEAKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICA0MAogCisjZGVmaW5lIFNPX1dJRklfU1RBVFVTCQk0MQorI2RlZmluZSBTQ01fV0lGSV9TVEFUVVMJCVNPX1dJRklfU1RBVFVTCisKICNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9pbmNsdWRlL2FzbS91bndpbmQuaCBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Vud2luZC5oCmluZGV4IGE1ZWRmNDIuLmQxYzNmM2EgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Vud2luZC5oCisrKyBiL2FyY2gvYXJtL2luY2x1ZGUvYXNtL3Vud2luZC5oCkBAIC0zMCwxNCArMzAsMTUgQEAKIH07CiAKIHN0cnVjdCB1bndpbmRfaWR4IHsKLQl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBhZGRyX29mZnNldDsKIAl1bnNpZ25lZCBsb25nIGluc247CiB9OwogCiBzdHJ1Y3QgdW53aW5kX3RhYmxlIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3RydWN0IHVud2luZF9pZHggKnN0YXJ0OwotCXN0cnVjdCB1bndpbmRfaWR4ICpzdG9wOworCWNvbnN0IHN0cnVjdCB1bndpbmRfaWR4ICpzdGFydDsKKwljb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCAqb3JpZ2luOworCWNvbnN0IHN0cnVjdCB1bndpbmRfaWR4ICpzdG9wOwogCXVuc2lnbmVkIGxvbmcgYmVnaW5fYWRkcjsKIAl1bnNpZ25lZCBsb25nIGVuZF9hZGRyOwogfTsKQEAgLTQ5LDE1ICs1MCw2IEBACiBleHRlcm4gdm9pZCB1bndpbmRfdGFibGVfZGVsKHN0cnVjdCB1bndpbmRfdGFibGUgKnRhYik7CiBleHRlcm4gdm9pZCB1bndpbmRfYmFja3RyYWNlKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CiAKLSNpZmRlZiBDT05GSUdfQVJNX1VOV0lORAotZXh0ZXJuIGludCBfX2luaXQgdW53aW5kX2luaXQodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgX19pbml0IHVud2luZF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQogI2VuZGlmCS8qICFfX0FTU0VNQkxZX18gKi8KIAogI2lmZGVmIENPTkZJR19BUk1fVU5XSU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jIGIvYXJjaC9hcm0va2VybmVsL3BlcmZfZXZlbnQuYwppbmRleCBjNDc1Mzc5Li44OGIwOTQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wZXJmX2V2ZW50LmMKQEAgLTM1MywxNSArMzUzLDE1IEBACiAJZmFrZV9wbXUudXNlZF9tYXNrID0gZmFrZV91c2VkX21hc2s7CiAKIAlpZiAoIXZhbGlkYXRlX2V2ZW50KCZmYWtlX3BtdSwgbGVhZGVyKSkKLQkJcmV0dXJuIC1FTk9TUEM7CisJCXJldHVybiAtRUlOVkFMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzaWJsaW5nLCAmbGVhZGVyLT5zaWJsaW5nX2xpc3QsIGdyb3VwX2VudHJ5KSB7CiAJCWlmICghdmFsaWRhdGVfZXZlbnQoJmZha2VfcG11LCBzaWJsaW5nKSkKLQkJCXJldHVybiAtRU5PU1BDOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKCF2YWxpZGF0ZV9ldmVudCgmZmFrZV9wbXUsIGV2ZW50KSkKLQkJcmV0dXJuIC1FTk9TUEM7CisJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIDA7CiB9CkBAIC02NDAsNiArNjQwLDkgQEAKIAogc3RhdGljIGludCBfX2RldmluaXQgYXJtcG11X2RldmljZV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogeworCWlmICghY3B1X3BtdSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAljcHVfcG11LT5wbGF0X2RldmljZSA9IHBkZXY7CiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9hcm0va2VybmVsL3Byb2Nlc3MuYwppbmRleCAzZDBjNmZiLi5lOGU4ZmU1IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTE4Myw3ICsxODMsOCBAQAogCiAJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KIAl3aGlsZSAoMSkgewotCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKDEpOworCQl0aWNrX25vaHpfaWRsZV9lbnRlcigpOworCQlyY3VfaWRsZV9lbnRlcigpOwogCQlsZWRzX2V2ZW50KGxlZF9pZGxlX3N0YXJ0KTsKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQpAQCAtMjEzLDcgKzIxNCw4IEBACiAJCQl9CiAJCX0KIAkJbGVkc19ldmVudChsZWRfaWRsZV9lbmQpOwotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCXJjdV9pZGxlX2V4aXQoKTsKKwkJdGlja19ub2h6X2lkbGVfZXhpdCgpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0va2VybmVsL3NldHVwLmMgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwppbmRleCAzNDQ4YTNmLi5jMGI1OWJmIDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL2FybS9rZXJuZWwvc2V0dXAuYwpAQCAtNTIsNiArNTIsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vdW53aW5kLmg+CisjaW5jbHVkZSA8YXNtL21lbWJsb2NrLmg+CiAKICNpZiBkZWZpbmVkKENPTkZJR19ERVBSRUNBVEVEX1BBUkFNX1NUUlVDVCkKICNpbmNsdWRlICJjb21wYXQuaCIKQEAgLTg5NSw4ICs4OTYsNiBAQAogewogCXN0cnVjdCBtYWNoaW5lX2Rlc2MgKm1kZXNjOwogCi0JdW53aW5kX2luaXQoKTsKLQogCXNldHVwX3Byb2Nlc3NvcigpOwogCW1kZXNjID0gc2V0dXBfbWFjaGluZV9mZHQoX19hdGFnc19wb2ludGVyKTsKIAlpZiAoIW1kZXNjKQpAQCAtOTA0LDYgKzkwMywxMiBAQAogCW1hY2hpbmVfZGVzYyA9IG1kZXNjOwogCW1hY2hpbmVfbmFtZSA9IG1kZXNjLT5uYW1lOwogCisjaWZkZWYgQ09ORklHX1pPTkVfRE1BCisJaWYgKG1kZXNjLT5kbWFfem9uZV9zaXplKSB7CisJCWV4dGVybiB1bnNpZ25lZCBsb25nIGFybV9kbWFfem9uZV9zaXplOworCQlhcm1fZG1hX3pvbmVfc2l6ZSA9IG1kZXNjLT5kbWFfem9uZV9zaXplOworCX0KKyNlbmRpZgogCWlmIChtZGVzYy0+c29mdF9yZWJvb3QpCiAJCXJlYm9vdF9zZXR1cCgicyIpOwogCkBAIC05MzQsMTIgKzkzOSw2IEBACiAKIAl0Y21faW5pdCgpOwogCi0jaWZkZWYgQ09ORklHX1pPTkVfRE1BCi0JaWYgKG1kZXNjLT5kbWFfem9uZV9zaXplKSB7Ci0JCWV4dGVybiB1bnNpZ25lZCBsb25nIGFybV9kbWFfem9uZV9zaXplOwotCQlhcm1fZG1hX3pvbmVfc2l6ZSA9IG1kZXNjLT5kbWFfem9uZV9zaXplOwotCX0KLSNlbmRpZgogI2lmZGVmIENPTkZJR19NVUxUSV9JUlFfSEFORExFUgogCWhhbmRsZV9hcmNoX2lycSA9IG1kZXNjLT5oYW5kbGVfaXJxOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL2FybS9rZXJuZWwvdW53aW5kLmMgYi9hcmNoL2FybS9rZXJuZWwvdW53aW5kLmMKaW5kZXggZTdlODM2NS4uMDBkZjAxMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0va2VybmVsL3Vud2luZC5jCisrKyBiL2FyY2gvYXJtL2tlcm5lbC91bndpbmQuYwpAQCAtNjcsNyArNjcsNyBAQAogCiBzdHJ1Y3QgdW53aW5kX2N0cmxfYmxvY2sgewogCXVuc2lnbmVkIGxvbmcgdnJzWzE2XTsJCS8qIHZpcnR1YWwgcmVnaXN0ZXIgc2V0ICovCi0JdW5zaWduZWQgbG9uZyAqaW5zbjsJCS8qIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb25zIHdvcmQgKi8KKwljb25zdCB1bnNpZ25lZCBsb25nICppbnNuOwkvKiBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGluc3RydWN0aW9ucyB3b3JkICovCiAJaW50IGVudHJpZXM7CQkJLyogbnVtYmVyIG9mIGVudHJpZXMgbGVmdCB0byBpbnRlcnByZXQgKi8KIAlpbnQgYnl0ZTsJCQkvKiBjdXJyZW50IGJ5dGUgbnVtYmVyIGluIHRoZSBpbnN0cnVjdGlvbnMgd29yZCAqLwogfTsKQEAgLTgzLDggKzgzLDkgQEAKIAlQQyA9IDE1CiB9OwogCi1leHRlcm4gc3RydWN0IHVud2luZF9pZHggX19zdGFydF91bndpbmRfaWR4W107Ci1leHRlcm4gc3RydWN0IHVud2luZF9pZHggX19zdG9wX3Vud2luZF9pZHhbXTsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCBfX3N0YXJ0X3Vud2luZF9pZHhbXTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCAqX19vcmlnaW5fdW53aW5kX2lkeDsKK2V4dGVybiBjb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCBfX3N0b3BfdW53aW5kX2lkeFtdOwogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHVud2luZF9sb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQodW53aW5kX3RhYmxlcyk7CkBAIC05OCw0NSArOTksOTkgQEAKIH0pCiAKIC8qCi0gKiBCaW5hcnkgc2VhcmNoIGluIHRoZSB1bndpbmQgaW5kZXguIFRoZSBlbnRyaWVzIGVudHJpZXMgYXJlCisgKiBCaW5hcnkgc2VhcmNoIGluIHRoZSB1bndpbmQgaW5kZXguIFRoZSBlbnRyaWVzIGFyZQogICogZ3VhcmFudGVlZCB0byBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRoZSBsaW5rZXIuCisgKgorICogc3RhcnQgPSBmaXJzdCBlbnRyeQorICogb3JpZ2luID0gZmlyc3QgZW50cnkgd2l0aCBwb3NpdGl2ZSBvZmZzZXQgKG9yIHN0b3AgaWYgdGhlcmUgaXMgbm8gc3VjaCBlbnRyeSkKKyAqIHN0b3AgLSAxID0gbGFzdCBlbnRyeQogICovCi1zdGF0aWMgc3RydWN0IHVud2luZF9pZHggKnNlYXJjaF9pbmRleCh1bnNpZ25lZCBsb25nIGFkZHIsCi0JCQkJICAgICAgIHN0cnVjdCB1bndpbmRfaWR4ICpmaXJzdCwKLQkJCQkgICAgICAgc3RydWN0IHVud2luZF9pZHggKmxhc3QpCitzdGF0aWMgY29uc3Qgc3RydWN0IHVud2luZF9pZHggKnNlYXJjaF9pbmRleCh1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCB1bndpbmRfaWR4ICpzdGFydCwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHVud2luZF9pZHggKm9yaWdpbiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IHVud2luZF9pZHggKnN0b3ApCiB7Ci0JcHJfZGVidWcoIiVzKCUwOGx4LCAlcCwgJXApXG4iLCBfX2Z1bmNfXywgYWRkciwgZmlyc3QsIGxhc3QpOworCXVuc2lnbmVkIGxvbmcgYWRkcl9wcmVsMzE7CiAKLQlpZiAoYWRkciA8IGZpcnN0LT5hZGRyKSB7Ci0JCXByX3dhcm5pbmcoInVud2luZDogVW5rbm93biBzeW1ib2wgYWRkcmVzcyAlMDhseFxuIiwgYWRkcik7Ci0JCXJldHVybiBOVUxMOwotCX0gZWxzZSBpZiAoYWRkciA+PSBsYXN0LT5hZGRyKQotCQlyZXR1cm4gbGFzdDsKKwlwcl9kZWJ1ZygiJXMoJTA4bHgsICVwLCAlcCwgJXApXG4iLAorCQkJX19mdW5jX18sIGFkZHIsIHN0YXJ0LCBvcmlnaW4sIHN0b3ApOwogCi0Jd2hpbGUgKGZpcnN0IDwgbGFzdCAtIDEpIHsKLQkJc3RydWN0IHVud2luZF9pZHggKm1pZCA9IGZpcnN0ICsgKChsYXN0IC0gZmlyc3QgKyAxKSA+PiAxKTsKKwkvKgorCSAqIG9ubHkgc2VhcmNoIGluIHRoZSBzZWN0aW9uIHdpdGggdGhlIG1hdGNoaW5nIHNpZ24uIFRoaXMgd2F5IHRoZQorCSAqIHByZWwzMSBudW1iZXJzIGNhbiBiZSBjb21wYXJlZCBhcyB1bnNpZ25lZCBsb25ncy4KKwkgKi8KKwlpZiAoYWRkciA8ICh1bnNpZ25lZCBsb25nKXN0YXJ0KQorCQkvKiBuZWdhdGl2ZSBvZmZzZXRzOiBbc3RhcnQ7IG9yaWdpbikgKi8KKwkJc3RvcCA9IG9yaWdpbjsKKwllbHNlCisJCS8qIHBvc2l0aXZlIG9mZnNldHM6IFtvcmlnaW47IHN0b3ApICovCisJCXN0YXJ0ID0gb3JpZ2luOwogCi0JCWlmIChhZGRyIDwgbWlkLT5hZGRyKQotCQkJbGFzdCA9IG1pZDsKLQkJZWxzZQotCQkJZmlyc3QgPSBtaWQ7CisJLyogcHJlbDMxIGZvciBhZGRyZXNzIHJlbGF2aXZlIHRvIHN0YXJ0ICovCisJYWRkcl9wcmVsMzEgPSAoYWRkciAtICh1bnNpZ25lZCBsb25nKXN0YXJ0KSAmIDB4N2ZmZmZmZmY7CisKKwl3aGlsZSAoc3RhcnQgPCBzdG9wIC0gMSkgeworCQljb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCAqbWlkID0gc3RhcnQgKyAoKHN0b3AgLSBzdGFydCkgPj4gMSk7CisKKwkJLyoKKwkJICogQXMgYWRkcl9wcmVsMzEgaXMgcmVsYXRpdmUgdG8gc3RhcnQgYW4gb2Zmc2V0IGlzIG5lZWRlZCB0bworCQkgKiBtYWtlIGl0IHJlbGF0aXZlIHRvIG1pZC4KKwkJICovCisJCWlmIChhZGRyX3ByZWwzMSAtICgodW5zaWduZWQgbG9uZyltaWQgLSAodW5zaWduZWQgbG9uZylzdGFydCkgPAorCQkJCW1pZC0+YWRkcl9vZmZzZXQpCisJCQlzdG9wID0gbWlkOworCQllbHNlIHsKKwkJCS8qIGtlZXAgYWRkcl9wcmVsMzEgcmVsYXRpdmUgdG8gc3RhcnQgKi8KKwkJCWFkZHJfcHJlbDMxIC09ICgodW5zaWduZWQgbG9uZyltaWQgLQorCQkJCQkodW5zaWduZWQgbG9uZylzdGFydCk7CisJCQlzdGFydCA9IG1pZDsKKwkJfQogCX0KIAotCXJldHVybiBmaXJzdDsKKwlpZiAobGlrZWx5KHN0YXJ0LT5hZGRyX29mZnNldCA8PSBhZGRyX3ByZWwzMSkpCisJCXJldHVybiBzdGFydDsKKwllbHNlIHsKKwkJcHJfd2FybmluZygidW53aW5kOiBVbmtub3duIHN5bWJvbCBhZGRyZXNzICUwOGx4XG4iLCBhZGRyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogfQogCi1zdGF0aWMgc3RydWN0IHVud2luZF9pZHggKnVud2luZF9maW5kX2lkeCh1bnNpZ25lZCBsb25nIGFkZHIpCitzdGF0aWMgY29uc3Qgc3RydWN0IHVud2luZF9pZHggKnVud2luZF9maW5kX29yaWdpbigKKwkJY29uc3Qgc3RydWN0IHVud2luZF9pZHggKnN0YXJ0LCBjb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCAqc3RvcCkKIHsKLQlzdHJ1Y3QgdW53aW5kX2lkeCAqaWR4ID0gTlVMTDsKKwlwcl9kZWJ1ZygiJXMoJXAsICVwKVxuIiwgX19mdW5jX18sIHN0YXJ0LCBzdG9wKTsKKwl3aGlsZSAoc3RhcnQgPCBzdG9wKSB7CisJCWNvbnN0IHN0cnVjdCB1bndpbmRfaWR4ICptaWQgPSBzdGFydCArICgoc3RvcCAtIHN0YXJ0KSA+PiAxKTsKKworCQlpZiAobWlkLT5hZGRyX29mZnNldCA+PSAweDQwMDAwMDAwKQorCQkJLyogbmVnYXRpdmUgb2Zmc2V0ICovCisJCQlzdGFydCA9IG1pZCArIDE7CisJCWVsc2UKKwkJCS8qIHBvc2l0aXZlIG9mZnNldCAqLworCQkJc3RvcCA9IG1pZDsKKwl9CisJcHJfZGVidWcoIiVzIC0+ICVwXG4iLCBfX2Z1bmNfXywgc3RvcCk7CisJcmV0dXJuIHN0b3A7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCAqdW53aW5kX2ZpbmRfaWR4KHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwljb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCAqaWR4ID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcHJfZGVidWcoIiVzKCUwOGx4KVxuIiwgX19mdW5jX18sIGFkZHIpOwogCi0JaWYgKGNvcmVfa2VybmVsX3RleHQoYWRkcikpCisJaWYgKGNvcmVfa2VybmVsX3RleHQoYWRkcikpIHsKKwkJaWYgKHVubGlrZWx5KCFfX29yaWdpbl91bndpbmRfaWR4KSkKKwkJCV9fb3JpZ2luX3Vud2luZF9pZHggPQorCQkJCXVud2luZF9maW5kX29yaWdpbihfX3N0YXJ0X3Vud2luZF9pZHgsCisJCQkJCQlfX3N0b3BfdW53aW5kX2lkeCk7CisKIAkJLyogbWFpbiB1bndpbmQgdGFibGUgKi8KIAkJaWR4ID0gc2VhcmNoX2luZGV4KGFkZHIsIF9fc3RhcnRfdW53aW5kX2lkeCwKLQkJCQkgICBfX3N0b3BfdW53aW5kX2lkeCAtIDEpOwotCWVsc2UgeworCQkJCSAgIF9fb3JpZ2luX3Vud2luZF9pZHgsCisJCQkJICAgX19zdG9wX3Vud2luZF9pZHgpOworCX0gZWxzZSB7CiAJCS8qIG1vZHVsZSB1bndpbmQgdGFibGVzICovCiAJCXN0cnVjdCB1bndpbmRfdGFibGUgKnRhYmxlOwogCkBAIC0xNDUsNyArMjAwLDggQEAKIAkJCWlmIChhZGRyID49IHRhYmxlLT5iZWdpbl9hZGRyICYmCiAJCQkgICAgYWRkciA8IHRhYmxlLT5lbmRfYWRkcikgewogCQkJCWlkeCA9IHNlYXJjaF9pbmRleChhZGRyLCB0YWJsZS0+c3RhcnQsCi0JCQkJCQkgICB0YWJsZS0+c3RvcCAtIDEpOworCQkJCQkJICAgdGFibGUtPm9yaWdpbiwKKwkJCQkJCSAgIHRhYmxlLT5zdG9wKTsKIAkJCQkvKiBNb3ZlLXRvLWZyb250IHRvIGV4cGxvaXQgY29tbW9uIHRyYWNlcyAqLwogCQkJCWxpc3RfbW92ZSgmdGFibGUtPmxpc3QsICZ1bndpbmRfdGFibGVzKTsKIAkJCQlicmVhazsKQEAgLTI3NCw3ICszMzAsNyBAQAogaW50IHVud2luZF9mcmFtZShzdHJ1Y3Qgc3RhY2tmcmFtZSAqZnJhbWUpCiB7CiAJdW5zaWduZWQgbG9uZyBoaWdoLCBsb3c7Ci0Jc3RydWN0IHVud2luZF9pZHggKmlkeDsKKwljb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCAqaWR4OwogCXN0cnVjdCB1bndpbmRfY3RybF9ibG9jayBjdHJsOwogCiAJLyogb25seSBnbyB0byBhIGhpZ2hlciBhZGRyZXNzIG9uIHRoZSBzdGFjayAqLwpAQCAtMzk5LDcgKzQ1NSw2IEBACiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyB0ZXh0X3NpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgdW53aW5kX2lkeCAqaWR4OwogCXN0cnVjdCB1bndpbmRfdGFibGUgKnRhYiA9IGttYWxsb2Moc2l6ZW9mKCp0YWIpLCBHRlBfS0VSTkVMKTsKIAogCXByX2RlYnVnKCIlcyglMDhseCwgJTA4bHgsICUwOGx4LCAlMDhseClcbiIsIF9fZnVuY19fLCBzdGFydCwgc2l6ZSwKQEAgLTQwOCwxNSArNDYzLDEyIEBACiAJaWYgKCF0YWIpCiAJCXJldHVybiB0YWI7CiAKLQl0YWItPnN0YXJ0ID0gKHN0cnVjdCB1bndpbmRfaWR4ICopc3RhcnQ7Ci0JdGFiLT5zdG9wID0gKHN0cnVjdCB1bndpbmRfaWR4ICopKHN0YXJ0ICsgc2l6ZSk7CisJdGFiLT5zdGFydCA9IChjb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCAqKXN0YXJ0OworCXRhYi0+c3RvcCA9IChjb25zdCBzdHJ1Y3QgdW53aW5kX2lkeCAqKShzdGFydCArIHNpemUpOworCXRhYi0+b3JpZ2luID0gdW53aW5kX2ZpbmRfb3JpZ2luKHRhYi0+c3RhcnQsIHRhYi0+c3RvcCk7CiAJdGFiLT5iZWdpbl9hZGRyID0gdGV4dF9hZGRyOwogCXRhYi0+ZW5kX2FkZHIgPSB0ZXh0X2FkZHIgKyB0ZXh0X3NpemU7CiAKLQkvKiBDb252ZXJ0IHRoZSBzeW1ib2wgYWRkcmVzc2VzIHRvIGFic29sdXRlIHZhbHVlcyAqLwotCWZvciAoaWR4ID0gdGFiLT5zdGFydDsgaWR4IDwgdGFiLT5zdG9wOyBpZHgrKykKLQkJaWR4LT5hZGRyID0gcHJlbDMxX3RvX2FkZHIoJmlkeC0+YWRkcik7Ci0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmdW53aW5kX2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZF90YWlsKCZ0YWItPmxpc3QsICZ1bndpbmRfdGFibGVzKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1bndpbmRfbG9jaywgZmxhZ3MpOwpAQCAtNDM3LDE2ICs0ODksMyBAQAogCiAJa2ZyZWUodGFiKTsKIH0KLQotaW50IF9faW5pdCB1bndpbmRfaW5pdCh2b2lkKQotewotCXN0cnVjdCB1bndpbmRfaWR4ICppZHg7Ci0KLQkvKiBDb252ZXJ0IHRoZSBzeW1ib2wgYWRkcmVzc2VzIHRvIGFic29sdXRlIHZhbHVlcyAqLwotCWZvciAoaWR4ID0gX19zdGFydF91bndpbmRfaWR4OyBpZHggPCBfX3N0b3BfdW53aW5kX2lkeDsgaWR4KyspCi0JCWlkeC0+YWRkciA9IHByZWwzMV90b19hZGRyKCZpZHgtPmFkZHIpOwotCi0JcHJfZGVidWcoInVud2luZDogQVJNIHN0YWNrIHVud2luZGluZyBpbml0aWFsaXNlZFxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxcm05MjAwX2RldmljZXMuYwppbmRleCA2NjU5MWZhLi5hZDkzMDY4IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXJtOTIwMF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFybTkyMDBfZGV2aWNlcy5jCkBAIC04Myw3ICs4Myw3IEBACiAgKiAgVVNCIERldmljZSAoR2FkZ2V0KQogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0FUOTEKKyNpZmRlZiBDT05GSUdfVVNCX0FUOTEKIHN0YXRpYyBzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSB1ZGNfZGF0YTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1ZGNfcmVzb3VyY2VzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjAuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCmluZGV4IGI4NGE5ZjYuLjBkMjA2NzcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MC5jCkBAIC0xOTUsOSArMTk1LDkgQEAKIAlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4wIiwgJnRjMF9jbGspLAogCUNMS0RFVl9DT05fREVWX0lEKCJ0MV9jbGsiLCAiYXRtZWxfdGNiLjAiLCAmdGMxX2NsayksCiAJQ0xLREVWX0NPTl9ERVZfSUQoInQyX2NsayIsICJhdG1lbF90Y2IuMCIsICZ0YzJfY2xrKSwKLQlDTEtERVZfQ09OX0RFVl9JRCgidDNfY2xrIiwgImF0bWVsX3RjYi4xIiwgJnRjM19jbGspLAotCUNMS0RFVl9DT05fREVWX0lEKCJ0NF9jbGsiLCAiYXRtZWxfdGNiLjEiLCAmdGM0X2NsayksCi0JQ0xLREVWX0NPTl9ERVZfSUQoInQ1X2NsayIsICJhdG1lbF90Y2IuMSIsICZ0YzVfY2xrKSwKKwlDTEtERVZfQ09OX0RFVl9JRCgidDBfY2xrIiwgImF0bWVsX3RjYi4xIiwgJnRjM19jbGspLAorCUNMS0RFVl9DT05fREVWX0lEKCJ0MV9jbGsiLCAiYXRtZWxfdGNiLjEiLCAmdGM0X2NsayksCisJQ0xLREVWX0NPTl9ERVZfSUQoInQyX2NsayIsICJhdG1lbF90Y2IuMSIsICZ0YzVfY2xrKSwKIAlDTEtERVZfQ09OX0RFVl9JRCgicGNsayIsICJzc2MuMCIsICZzc2NfY2xrKSwKIAkvKiBtb3JlIHVzYXJ0IGxvb2t1cCB0YWJsZSBmb3IgRFQgZW50cmllcyAqLwogCUNMS0RFVl9DT05fREVWX0lEKCJ1c2FydCIsICJmZmZmZjIwMC5zZXJpYWwiLCAmbWNrKSwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjBfZGV2aWNlcy5jCmluZGV4IDI1ZTM0NjQuLjYyOWZhOTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MF9kZXZpY2VzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYwX2RldmljZXMuYwpAQCAtODQsNyArODQsNyBAQAogICogIFVTQiBEZXZpY2UgKEdhZGdldCkKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAKLSNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9BVDkxCisjaWZkZWYgQ09ORklHX1VTQl9BVDkxCiBzdGF0aWMgc3RydWN0IGF0OTFfdWRjX2RhdGEgdWRjX2RhdGE7CiAKIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdWRjX3Jlc291cmNlc1tdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxX2RldmljZXMuYyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2MV9kZXZpY2VzLmMKaW5kZXggYWU3OGY0ZC4uYTE3OGI1OCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYxX2RldmljZXMuYworKysgYi9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjFfZGV2aWNlcy5jCkBAIC04Nyw3ICs4Nyw3IEBACiAgKiAgVVNCIERldmljZSAoR2FkZ2V0KQogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX0FUOTEKKyNpZmRlZiBDT05GSUdfVVNCX0FUOTEKIHN0YXRpYyBzdHJ1Y3QgYXQ5MV91ZGNfZGF0YSB1ZGNfZGF0YTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSB1ZGNfcmVzb3VyY2VzW10gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2F0OTFzYW05MjYzX2RldmljZXMuYwppbmRleCBhZDAxN2ViLi5kNWZiYWM5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWF0OTEvYXQ5MXNhbTkyNjNfZGV2aWNlcy5jCisrKyBiL2FyY2gvYXJtL21hY2gtYXQ5MS9hdDkxc2FtOTI2M19kZXZpY2VzLmMKQEAgLTkyLDcgKzkyLDcgQEAKICAqICBVU0IgRGV2aWNlIChHYWRnZXQpCiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogCi0jaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfQVQ5MQorI2lmZGVmIENPTkZJR19VU0JfQVQ5MQogc3RhdGljIHN0cnVjdCBhdDkxX3VkY19kYXRhIHVkY19kYXRhOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHVkY19yZXNvdXJjZXNbXSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtYXQ5MS9pbmNsdWRlL21hY2gvc3lzdGVtX3Jldi5oIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9zeXN0ZW1fcmV2LmgKaW5kZXggOGY0ODY2MC4uZWMxNjRhNCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9zeXN0ZW1fcmV2LmgKKysrIGIvYXJjaC9hcm0vbWFjaC1hdDkxL2luY2x1ZGUvbWFjaC9zeXN0ZW1fcmV2LmgKQEAgLTE5LDcgKzE5LDcgQEAKICNkZWZpbmUgQk9BUkRfSEFWRV9OQU5EXzE2QklUCSgxIDw8IDMxKQogc3RhdGljIGlubGluZSBpbnQgYm9hcmRfaGF2ZV9uYW5kXzE2Yml0KHZvaWQpCiB7Ci0JcmV0dXJuIHN5c3RlbV9yZXYgJiBCT0FSRF9IQVZFX05BTkRfMTZCSVQ7CisJcmV0dXJuIChzeXN0ZW1fcmV2ICYgQk9BUkRfSEFWRV9OQU5EXzE2QklUKSA/IDEgOiAwOwogfQogCiAjZW5kaWYgLyogX19BUkNIX1NZU1RFTV9SRVZfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4NTAtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZGE4NTAtZXZtLmMKaW5kZXggMWQ3ZDI0OS4uNjY1OWE5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRhODUwLWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kYTg1MC1ldm0uYwpAQCAtNzUzLDcgKzc1Myw3IEBACiAJLm51bV9zZXJpYWxpemVyCT0gQVJSQVlfU0laRShkYTg1MF9paXNfc2VyaWFsaXplcl9kaXJlY3Rpb24pLAogCS50ZG1fc2xvdHMJPSAyLAogCS5zZXJpYWxfZGlyCT0gZGE4NTBfaWlzX3NlcmlhbGl6ZXJfZGlyZWN0aW9uLAotCS5hc3BfY2hhbl9xCT0gRVZFTlRRXzEsCisJLmFzcF9jaGFuX3EJPSBFVkVOVFFfMCwKIAkudmVyc2lvbgk9IE1DQVNQX1ZFUlNJT05fMiwKIAkudHhudW1ldnQJPSAxLAogCS5yeG51bWV2dAk9IDEsCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG0zNjUtZXZtLmMKaW5kZXggMTkxOGFlNy4uNDZlMWY0MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtMzY1LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTM2NS1ldm0uYwpAQCAtMTA3LDcgKzEwNyw3IEBACiAJCS8qIFVCTCAoYSBmZXcgY29waWVzKSBwbHVzIFUtQm9vdCAqLwogCQkubmFtZQkJPSAiYm9vdGxvYWRlciIsCiAJCS5vZmZzZXQJCT0gMCwKLQkJLnNpemUJCT0gMjggKiBOQU5EX0JMT0NLX1NJWkUsCisJCS5zaXplCQk9IDMwICogTkFORF9CTE9DS19TSVpFLAogCQkubWFza19mbGFncwk9IE1URF9XUklURUFCTEUsIC8qIGZvcmNlIHJlYWQtb25seSAqLwogCX0sIHsKIAkJLyogVS1Cb290IGVudmlyb25tZW50ICovCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDZ4LWV2bS5jIGIvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2JvYXJkLWRtNjQ2eC1ldm0uYwppbmRleCBlNTc0ZDdmLi42MzViZjc3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvYm9hcmQtZG02NDZ4LWV2bS5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9ib2FyZC1kbTY0NngtZXZtLmMKQEAgLTU2NCw3ICs1NjQsNyBAQAogCWludCB2YWw7CiAJdTMyIHZhbHVlOwogCi0JaWYgKCF2cGlmX3ZzY2xrZGlzX3JlZyB8fCAhY3BsZF9jbGllbnQpCisJaWYgKCF2cGlmX3ZpZGNsa2N0bF9yZWcgfHwgIWNwbGRfY2xpZW50KQogCQlyZXR1cm4gLUVOWElPOwogCiAJdmFsID0gaTJjX3NtYnVzX3JlYWRfYnl0ZShjcGxkX2NsaWVudCk7CkBAIC01NzIsNyArNTcyLDcgQEAKIAkJcmV0dXJuIHZhbDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2cGlmX3JlZ19sb2NrLCBmbGFncyk7Ci0JdmFsdWUgPSBfX3Jhd19yZWFkbCh2cGlmX3ZzY2xrZGlzX3JlZyk7CisJdmFsdWUgPSBfX3Jhd19yZWFkbCh2cGlmX3ZpZGNsa2N0bF9yZWcpOwogCWlmIChtdXhfbW9kZSkgewogCQl2YWwgJj0gVlBJRl9JTlBVVF9UV09fQ0hBTk5FTDsKIAkJdmFsdWUgfD0gVklEQ0gxQ0xLOwpAQCAtNTgwLDcgKzU4MCw3IEBACiAJCXZhbCB8PSBWUElGX0lOUFVUX09ORV9DSEFOTkVMOwogCQl2YWx1ZSAmPSB+VklEQ0gxQ0xLOwogCX0KLQlfX3Jhd193cml0ZWwodmFsdWUsIHZwaWZfdnNjbGtkaXNfcmVnKTsKKwlfX3Jhd193cml0ZWwodmFsdWUsIHZwaWZfdmlkY2xrY3RsX3JlZyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdnBpZl9yZWdfbG9jaywgZmxhZ3MpOwogCiAJZXJyID0gaTJjX3NtYnVzX3dyaXRlX2J5dGUoY3BsZF9jbGllbnQsIHZhbCk7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG02NDZ4LmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvZG02NDZ4LmMKaW5kZXggMGI2OGVkNS4uYWYyN2MxMyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2RtNjQ2eC5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9kbTY0NnguYwpAQCAtMTYxLDcgKzE2MSw2IEBACiAJLm5hbWUgPSAiZHNwIiwKIAkucGFyZW50ID0gJnBsbDFfc3lzY2xrMSwKIAkubHBzYyA9IERNNjQ2WF9MUFNDX0M2NFhfQ1BVLAotCS5mbGFncyA9IFBTQ19EU1AsCiAJLnVzZWNvdW50ID0gMSwJCQkvKiBSRVZJU0lUIGhvdyB0byBkaXNhYmxlPyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9wc2MuaCBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9pbmNsdWRlL21hY2gvcHNjLmgKaW5kZXggZmE1OWMwOS4uOGJjM2ZjMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL2luY2x1ZGUvbWFjaC9wc2MuaAorKysgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvaW5jbHVkZS9tYWNoL3BzYy5oCkBAIC0yMzMsNyArMjMzLDcgQEAKICNkZWZpbmUgUFRDTUQJCTB4MTIwCiAjZGVmaW5lIFBUU1RBVAkJMHgxMjgKICNkZWZpbmUgUERTVEFUCQkweDIwMAotI2RlZmluZSBQRENUTDEJCTB4MzA0CisjZGVmaW5lIFBEQ1RMCQkweDMwMAogI2RlZmluZSBNRFNUQVQJCTB4ODAwCiAjZGVmaW5lIE1EQ1RMCQkweEEwMAogCkBAIC0yNDQsNyArMjQ0LDEwIEBACiAjZGVmaW5lIFBTQ19TVEFURV9FTkFCTEUJMwogCiAjZGVmaW5lIE1EU1RBVF9TVEFURV9NQVNLCTB4M2YKKyNkZWZpbmUgUERTVEFUX1NUQVRFX01BU0sJMHgxZgogI2RlZmluZSBNRENUTF9GT1JDRQkJQklUKDMxKQorI2RlZmluZSBQRENUTF9ORVhUCQlCSVQoMSkKKyNkZWZpbmUgUERDVExfRVBDR09PRAkJQklUKDgpCiAKICNpZm5kZWYgX19BU1NFTUJMRVJfXwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWRhdmluY2kvcHNjLmMgYi9hcmNoL2FybS9tYWNoLWRhdmluY2kvcHNjLmMKaW5kZXggMWZiNmJkZi4uZDdlMjEwZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1kYXZpbmNpL3BzYy5jCisrKyBiL2FyY2gvYXJtL21hY2gtZGF2aW5jaS9wc2MuYwpAQCAtNTIsNyArNTIsNyBAQAogdm9pZCBkYXZpbmNpX3BzY19jb25maWcodW5zaWduZWQgaW50IGRvbWFpbiwgdW5zaWduZWQgaW50IGN0bHIsCiAJCXVuc2lnbmVkIGludCBpZCwgYm9vbCBlbmFibGUsIHUzMiBmbGFncykKIHsKLQl1MzIgZXBjcHIsIHB0Y21kLCBwdHN0YXQsIHBkc3RhdCwgcGRjdGwxLCBtZHN0YXQsIG1kY3RsOworCXUzMiBlcGNwciwgcHRjbWQsIHB0c3RhdCwgcGRzdGF0LCBwZGN0bCwgbWRzdGF0LCBtZGN0bDsKIAl2b2lkIF9faW9tZW0gKnBzY19iYXNlOwogCXN0cnVjdCBkYXZpbmNpX3NvY19pbmZvICpzb2NfaW5mbyA9ICZkYXZpbmNpX3NvY19pbmZvOwogCXUzMiBuZXh0X3N0YXRlID0gUFNDX1NUQVRFX0VOQUJMRTsKQEAgLTc5LDExICs3OSwxMSBAQAogCQltZGN0bCB8PSBNRENUTF9GT1JDRTsKIAlfX3Jhd193cml0ZWwobWRjdGwsIHBzY19iYXNlICsgTURDVEwgKyA0ICogaWQpOwogCi0JcGRzdGF0ID0gX19yYXdfcmVhZGwocHNjX2Jhc2UgKyBQRFNUQVQpOwotCWlmICgocGRzdGF0ICYgMHgwMDAwMDAwMSkgPT0gMCkgewotCQlwZGN0bDEgPSBfX3Jhd19yZWFkbChwc2NfYmFzZSArIFBEQ1RMMSk7Ci0JCXBkY3RsMSB8PSAweDE7Ci0JCV9fcmF3X3dyaXRlbChwZGN0bDEsIHBzY19iYXNlICsgUERDVEwxKTsKKwlwZHN0YXQgPSBfX3Jhd19yZWFkbChwc2NfYmFzZSArIFBEU1RBVCArIDQgKiBkb21haW4pOworCWlmICgocGRzdGF0ICYgUERTVEFUX1NUQVRFX01BU0spID09IDApIHsKKwkJcGRjdGwgPSBfX3Jhd19yZWFkbChwc2NfYmFzZSArIFBEQ1RMICsgNCAqIGRvbWFpbik7CisJCXBkY3RsIHw9IFBEQ1RMX05FWFQ7CisJCV9fcmF3X3dyaXRlbChwZGN0bCwgcHNjX2Jhc2UgKyBQRENUTCArIDQgKiBkb21haW4pOwogCiAJCXB0Y21kID0gMSA8PCBkb21haW47CiAJCV9fcmF3X3dyaXRlbChwdGNtZCwgcHNjX2Jhc2UgKyBQVENNRCk7CkBAIC05Miw5ICs5Miw5IEBACiAJCQllcGNwciA9IF9fcmF3X3JlYWRsKHBzY19iYXNlICsgRVBDUFIpOwogCQl9IHdoaWxlICgoKChlcGNwciA+PiBkb21haW4pICYgMSkgPT0gMCkpOwogCi0JCXBkY3RsMSA9IF9fcmF3X3JlYWRsKHBzY19iYXNlICsgUERDVEwxKTsKLQkJcGRjdGwxIHw9IDB4MTAwOwotCQlfX3Jhd193cml0ZWwocGRjdGwxLCBwc2NfYmFzZSArIFBEQ1RMMSk7CisJCXBkY3RsID0gX19yYXdfcmVhZGwocHNjX2Jhc2UgKyBQRENUTCArIDQgKiBkb21haW4pOworCQlwZGN0bCB8PSBQRENUTF9FUENHT09EOworCQlfX3Jhd193cml0ZWwocGRjdGwsIHBzY19iYXNlICsgUERDVEwgKyA0ICogZG9tYWluKTsKIAl9IGVsc2UgewogCQlwdGNtZCA9IDEgPDwgZG9tYWluOwogCQlfX3Jhd193cml0ZWwocHRjbWQsIHBzY19iYXNlICsgUFRDTUQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1leHlub3MvY3B1LmMgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9jcHUuYwppbmRleCA5MGVjMjQ3Li5jYzhkNGJkIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWV4eW5vcy9jcHUuYworKysgYi9hcmNoL2FybS9tYWNoLWV4eW5vcy9jcHUuYwpAQCAtMTExLDExICsxMTEsNiBAQAogCQkubGVuZ3RoCQk9IFNaXzRLLAogCQkudHlwZQkJPSBNVF9ERVZJQ0UsCiAJfSwgewotCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVM1UF9WQV9TUk9NQywKLQkJLnBmbgkJPSBfX3BoeXNfdG9fcGZuKEVYWU5PUzRfUEFfU1JPTUMpLAotCQkubGVuZ3RoCQk9IFNaXzRLLAotCQkudHlwZQkJPSBNVF9ERVZJQ0UsCi0JfSwgewogCQkudmlydHVhbAk9ICh1bnNpZ25lZCBsb25nKVMzQ19WQV9VU0JfSFNQSFksCiAJCS5wZm4JCT0gX19waHlzX3RvX3BmbihFWFlOT1M0X1BBX0hTUEhZKSwKIAkJLmxlbmd0aAkJPSBTWl80SywKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtZXh5bm9zL21jdC5jIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWN0LmMKaW5kZXggOTczNDNkZi4uODViNTUyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1leHlub3MvbWN0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1leHlub3MvbWN0LmMKQEAgLTQ0LDggKzQ0LDYgQEAKIAljaGFyIG5hbWVbMTBdOwogfTsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlLCBwZXJjcHVfbWN0X3RpY2spOwotCiBzdGF0aWMgdm9pZCBleHlub3M0X21jdF93cml0ZSh1bnNpZ25lZCBpbnQgdmFsdWUsIHZvaWQgKmFkZHIpCiB7CiAJdm9pZCBfX2lvbWVtICpzdGF0X2FkZHI7CkBAIC0yNjQsNiArMjYyLDkgQEAKIH0KIAogI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlLCBwZXJjcHVfbWN0X3RpY2spOworCiAvKiBDbG9jayBldmVudCBoYW5kbGluZyAqLwogc3RhdGljIHZvaWQgZXh5bm9zNF9tY3RfdGlja19zdG9wKHN0cnVjdCBtY3RfY2xvY2tfZXZlbnRfZGV2aWNlICptZXZ0KQogewpAQCAtNDI4LDkgKzQyOSwxMyBAQAogCiB2b2lkIGxvY2FsX3RpbWVyX3N0b3Aoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogeworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJZXZ0LT5zZXRfbW9kZShDTE9DS19FVlRfTU9ERV9VTlVTRUQsIGV2dCk7CiAJaWYgKG1jdF9pbnRfdHlwZSA9PSBNQ1RfSU5UX1NQSSkKLQkJZGlzYWJsZV9pcnEoZXZ0LT5pcnEpOworCQlpZiAoY3B1ID09IDApCisJCQlyZW1vdmVfaXJxKGV2dC0+aXJxLCAmbWN0X3RpY2swX2V2ZW50X2lycSk7CisJCWVsc2UKKwkJCXJlbW92ZV9pcnEoZXZ0LT5pcnEsICZtY3RfdGljazFfZXZlbnRfaXJxKTsKIAllbHNlCiAJCWRpc2FibGVfcGVyY3B1X2lycShJUlFfTUNUX0xPQ0FMVElNRVIpOwogfQpAQCAtNDQzLDYgKzQ0OCw3IEBACiAKIAljbGtfcmF0ZSA9IGNsa19nZXRfcmF0ZShtY3RfY2xrKTsKIAorI2lmZGVmIENPTkZJR19MT0NBTF9USU1FUlMKIAlpZiAobWN0X2ludF90eXBlID09IE1DVF9JTlRfUFBJKSB7CiAJCWludCBlcnI7CiAKQEAgLTQ1Miw2ICs0NTgsNyBAQAogCQlXQVJOKGVyciwgIk1DVDogY2FuJ3QgcmVxdWVzdCBJUlEgJWQgKCVkKVxuIiwKIAkJICAgICBJUlFfTUNUX0xPQ0FMVElNRVIsIGVycik7CiAJfQorI2VuZGlmIC8qIENPTkZJR19MT0NBTF9USU1FUlMgKi8KIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGV4eW5vczRfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZyBiL2FyY2gvYXJtL21hY2gtaW14L0tjb25maWcKaW5kZXggYzQ0YWE5Ny4uMGU2ZjFhZiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvS2NvbmZpZworKysgYi9hcmNoL2FybS9tYWNoLWlteC9LY29uZmlnCkBAIC0xMzIsNyArMTMyLDcgQEAKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fTVhDX05BTkQKIAlzZWxlY3QgSU1YX0hBVkVfUExBVEZPUk1fU0RIQ0lfRVNESENfSU1YCiAKLWNvbmZpZyBNQUNIX0VVS1JFQV9DUFVJTVgyNQorY29uZmlnIE1BQ0hfRVVLUkVBX0NQVUlNWDI1U0QKIAlib29sICJTdXBwb3J0IEV1a3JlYSBDUFVJTVgyNSBQbGF0Zm9ybSIKIAlzZWxlY3QgU09DX0lNWDI1CiAJc2VsZWN0IElNWF9IQVZFX1BMQVRGT1JNX0ZMRVhDQU4KQEAgLTE0OCw3ICsxNDgsNyBAQAogCiBjaG9pY2UKIAlwcm9tcHQgIkJhc2Vib2FyZCIKLQlkZXBlbmRzIG9uIE1BQ0hfRVVLUkVBX0NQVUlNWDI1CisJZGVwZW5kcyBvbiBNQUNIX0VVS1JFQV9DUFVJTVgyNVNECiAJZGVmYXVsdCBNQUNIX0VVS1JFQV9NQklNWFNEMjVfQkFTRUJPQVJECiAKIGNvbmZpZyBNQUNIX0VVS1JFQV9NQklNWFNEMjVfQkFTRUJPQVJECkBAIC01NDIsNyArNTQyLDcgQEAKIAkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgTVgzNVBESyBwbGF0Zm9ybS4gVGhpcyBpbmNsdWRlcyBzcGVjaWZpYwogCSAgY29uZmlndXJhdGlvbnMgZm9yIHRoZSBib2FyZCBhbmQgaXRzIHBlcmlwaGVyYWxzLgogCi1jb25maWcgTUFDSF9FVUtSRUFfQ1BVSU1YMzUKK2NvbmZpZyBNQUNIX0VVS1JFQV9DUFVJTVgzNVNECiAJYm9vbCAiU3VwcG9ydCBFdWtyZWEgQ1BVSU1YMzUgUGxhdGZvcm0iCiAJc2VsZWN0IFNPQ19JTVgzNQogCXNlbGVjdCBJTVhfSEFWRV9QTEFURk9STV9GTEVYQ0FOCkBAIC01NjAsNyArNTYwLDcgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJCYXNlYm9hcmQiCi0JZGVwZW5kcyBvbiBNQUNIX0VVS1JFQV9DUFVJTVgzNQorCWRlcGVuZHMgb24gTUFDSF9FVUtSRUFfQ1BVSU1YMzVTRAogCWRlZmF1bHQgTUFDSF9FVUtSRUFfTUJJTVhTRDM1X0JBU0VCT0FSRAogCiBjb25maWcgTUFDSF9FVUtSRUFfTUJJTVhTRDM1X0JBU0VCT0FSRApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvTWFrZWZpbGUgYi9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZQppbmRleCBhYmE3MzIxLi5kOTdmNDA5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZQorKysgYi9hcmNoL2FybS9tYWNoLWlteC9NYWtlZmlsZQpAQCAtMjQsNyArMjQsNyBAQAogCiAjIGkuTVgyNSBiYXNlZCBtYWNoaW5lcwogb2JqLSQoQ09ORklHX01BQ0hfTVgyNV8zRFMpICs9IG1hY2gtbXgyNV8zZHMubwotb2JqLSQoQ09ORklHX01BQ0hfRVVLUkVBX0NQVUlNWDI1KSArPSBtYWNoLWV1a3JlYV9jcHVpbXgyNS5vCitvYmotJChDT05GSUdfTUFDSF9FVUtSRUFfQ1BVSU1YMjVTRCkgKz0gbWFjaC1ldWtyZWFfY3B1aW14MjUubwogb2JqLSQoQ09ORklHX01BQ0hfRVVLUkVBX01CSU1YU0QyNV9CQVNFQk9BUkQpICs9IGV1a3JlYV9tYmlteHNkMjUtYmFzZWJvYXJkLm8KIAogIyBpLk1YMjcgYmFzZWQgbWFjaGluZXMKQEAgLTU3LDcgKzU3LDcgQEAKICMgaS5NWDM1IGJhc2VkIG1hY2hpbmVzCiBvYmotJChDT05GSUdfTUFDSF9QQ00wNDMpICs9IG1hY2gtcGNtMDQzLm8KIG9iai0kKENPTkZJR19NQUNIX01YMzVfM0RTKSArPSBtYWNoLW14MzVfM2RzLm8KLW9iai0kKENPTkZJR19NQUNIX0VVS1JFQV9DUFVJTVgzNSkgKz0gbWFjaC1jcHVpbXgzNS5vCitvYmotJChDT05GSUdfTUFDSF9FVUtSRUFfQ1BVSU1YMzVTRCkgKz0gbWFjaC1jcHVpbXgzNS5vCiBvYmotJChDT05GSUdfTUFDSF9FVUtSRUFfTUJJTVhTRDM1X0JBU0VCT0FSRCkgKz0gZXVrcmVhX21iaW14c2QzNS1iYXNlYm9hcmQubwogb2JqLSQoQ09ORklHX01BQ0hfVlBSMjAwKSArPSBtYWNoLXZwcjIwMC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMgYi9hcmNoL2FybS9tYWNoLWlteC9jbG9jay1pbXgzNS5jCmluZGV4IDgxMTZmMTEuLmFjODIzOGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L2Nsb2NrLWlteDM1LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1pbXgvY2xvY2staW14MzUuYwpAQCAtNTA3LDcgKzUwNyw3IEBACiAKIGludCBfX2luaXQgbXgzNV9jbG9ja3NfaW5pdCgpCiB7Ci0JdW5zaWduZWQgaW50IGNncjIgPSAzIDw8IDI2LCBjZ3IzID0gMDsKKwl1bnNpZ25lZCBpbnQgY2dyMiA9IDMgPDwgMjY7CiAKICNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19MTCkgJiYgIWRlZmluZWQoQ09ORklHX0RFQlVHX0lDRURDQykKIAljZ3IyIHw9IDMgPDwgMTY7CkBAIC01MjEsNiArNTIxLDEyIEBACiAJX19yYXdfd3JpdGVsKCgzIDw8IDE4KSwgQ0NNX0JBU0UgKyBDQ01fQ0dSMCk7CiAJX19yYXdfd3JpdGVsKCgzIDw8IDIpIHwgKDMgPDwgNCkgfCAoMyA8PCA2KSB8ICgzIDw8IDgpIHwgKDMgPDwgMTYpLAogCQkJQ0NNX0JBU0UgKyBDQ01fQ0dSMSk7CisJX19yYXdfd3JpdGVsKGNncjIsIENDTV9CQVNFICsgQ0NNX0NHUjIpOworCV9fcmF3X3dyaXRlbCgwLCBDQ01fQkFTRSArIENDTV9DR1IzKTsKKworCWNsa19lbmFibGUoJmlpbV9jbGspOworCWlteF9wcmludF9zaWxpY29uX3JldigiaS5NWDM1IiwgbXgzNV9yZXZpc2lvbigpKTsKKwljbGtfZGlzYWJsZSgmaWltX2Nsayk7CiAKIAkvKgogCSAqIENoZWNrIGlmIHdlIGNhbWUgdXAgaW4gaW50ZXJuYWwgYm9vdCBtb2RlLiBJZiB5ZXMsIHdlIG5lZWQgc29tZQpAQCAtNTI5LDE3ICs1MzUsMTEgQEAKIAkgKi8KIAlpZiAoIShfX3Jhd19yZWFkbChDQ01fQkFTRSArIENDTV9SQ1NSKSAmICgzIDw8IDEwKSkpIHsKIAkJLyogQWRkaXRpb25hbGx5IHR1cm4gb24gVUFSVDEsIFNDQywgYW5kIElJTSBjbG9ja3MgKi8KLQkJY2dyMiB8PSAzIDw8IDE2IHwgMyA8PCA0OwotCQljZ3IzIHw9IDMgPDwgMjsKKwkJY2xrX2VuYWJsZSgmaWltX2Nsayk7CisJCWNsa19lbmFibGUoJnVhcnQxX2Nsayk7CisJCWNsa19lbmFibGUoJnNjY19jbGspOwogCX0KIAotCV9fcmF3X3dyaXRlbChjZ3IyLCBDQ01fQkFTRSArIENDTV9DR1IyKTsKLQlfX3Jhd193cml0ZWwoY2dyMywgQ0NNX0JBU0UgKyBDQ01fQ0dSMyk7Ci0KLQljbGtfZW5hYmxlKCZpaW1fY2xrKTsKLQlpbXhfcHJpbnRfc2lsaWNvbl9yZXYoImkuTVgzNSIsIG14MzVfcmV2aXNpb24oKSk7Ci0JY2xrX2Rpc2FibGUoJmlpbV9jbGspOwotCiAjaWZkZWYgQ09ORklHX01YQ19VU0VfRVBJVAogCWVwaXRfdGltZXJfaW5pdCgmZXBpdDFfY2xrLAogCQkJTVgzNV9JT19BRERSRVNTKE1YMzVfRVBJVDFfQkFTRV9BRERSKSwgTVgzNV9JTlRfRVBJVDEpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1jcHVpbXgzNS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1jcHVpbXgzNS5jCmluZGV4IDY2YWYyZTguLjM2MmFhZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtY3B1aW14MzUuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWNwdWlteDM1LmMKQEAgLTUzLDEyICs1MywxOCBAQAogCS5iaXRyYXRlID0JCTEwMDAwMCwKIH07CiAKKyNkZWZpbmUgVFNDMjAwN19JUlFHUElPCQlJTVhfR1BJT19OUigzLCAyKQorc3RhdGljIGludCB0c2MyMDA3X2dldF9wZW5kb3duX3N0YXRlKHZvaWQpCit7CisJcmV0dXJuICFncGlvX2dldF92YWx1ZShUU0MyMDA3X0lSUUdQSU8pOworfQorCiBzdGF0aWMgc3RydWN0IHRzYzIwMDdfcGxhdGZvcm1fZGF0YSB0c2MyMDA3X2luZm8gPSB7CiAJLm1vZGVsCQkJPSAyMDA3LAogCS54X3BsYXRlX29obXMJCT0gMTgwLAorCS5nZXRfcGVuZG93bl9zdGF0ZSA9IHRzYzIwMDdfZ2V0X3BlbmRvd25fc3RhdGUsCiB9OwogCi0jZGVmaW5lIFRTQzIwMDdfSVJRR1BJTwkJSU1YX0dQSU9fTlIoMywgMikKIHN0YXRpYyBzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gZXVrcmVhX2NwdWlteDM1X2kyY19kZXZpY2VzW10gPSB7CiAJewogCQlJMkNfQk9BUkRfSU5GTygicGNmODU2MyIsIDB4NTEpLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXg2cS5jIGIvYXJjaC9hcm0vbWFjaC1pbXgvbWFjaC1pbXg2cS5jCmluZGV4IDljZDg2MGEuLjhkZWIwMTIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaW14L21hY2gtaW14NnEuYworKysgYi9hcmNoL2FybS9tYWNoLWlteC9tYWNoLWlteDZxLmMKQEAgLTM3LDE0ICszNywxNSBAQAogCWlteDZxX2Nsb2NrX21hcF9pbygpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW14NnFfZ3Bpb19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorc3RhdGljIGludCBfX2luaXQgaW14NnFfZ3Bpb19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW50ZXJydXB0X3BhcmVudCkKIHsKLQlzdGF0aWMgaW50IGdwaW9faXJxX2Jhc2UgPSBNWENfR1BJT19JUlFfU1RBUlQgKyBBUkNIX05SX0dQSU9TIC0KLQkJCQkgICAzMiAqIDc7IC8qIGlteDZxIGdldHMgNyBncGlvIHBvcnRzICovCisJc3RhdGljIGludCBncGlvX2lycV9iYXNlID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgQVJDSF9OUl9HUElPUzsKIAorCWdwaW9faXJxX2Jhc2UgLT0gMzI7CiAJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5wLCBncGlvX2lycV9iYXNlKTsKLQlncGlvX2lycV9iYXNlICs9IDMyOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteDZxX2lycV9tYXRjaFtdIF9faW5pdGNvbnN0ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1tc20vZGV2aWNlcy1pb21tdS5jIGIvYXJjaC9hcm0vbWFjaC1tc20vZGV2aWNlcy1pb21tdS5jCmluZGV4IDI0MDMwZDAuLjBmYjdhMTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXNtL2RldmljZXMtaW9tbXUuYworKysgYi9hcmNoL2FybS9tYWNoLW1zbS9kZXZpY2VzLWlvbW11LmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bWFjaC9pcnFzLmg+CiAjaW5jbHVkZSA8bWFjaC9pb21tdS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUxX2JhYmJhZ2UuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCmluZGV4IDVjODM3NjAuLjI0OTk0YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTFfYmFiYmFnZS5jCkBAIC0zNjIsNyArMzYyLDcgQEAKIHsKIAlpb211eF92M19jZmdfdCB1c2JoMXN0cCA9IE1YNTFfUEFEX1VTQkgxX1NUUF9fVVNCSDFfU1RQOwogCWlvbXV4X3YzX2NmZ190IHBvd2VyX2tleSA9IE5FV19QQURfQ1RSTChNWDUxX1BBRF9FSU1fQTI3X19HUElPMl8yMSwKLQkJUEFEX0NUTF9TUkVfRkFTVCB8IFBBRF9DVExfRFNFX0hJR0ggfCBQQURfQ1RMX1BVU18xMDBLX1VQKTsKKwkJUEFEX0NUTF9TUkVfRkFTVCB8IFBBRF9DVExfRFNFX0hJR0gpOwogCiAJaW14NTFfc29jX2luaXQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19ldmsuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfZXZrLmMKaW5kZXggNmJlYTMxYS4uNjRiYmZjZSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19ldmsuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2V2ay5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAlncGlvX3NldF92YWx1ZShNWDUzX0VWS19GRUNfUEhZX1JTVCwgMSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2RhdGEgbXg1M19ldmtfZmVjX3BkYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1fZGF0YSBteDUzX2V2a19mZWNfcGRhdGEgX19pbml0Y29uc3QgPSB7CiAJLnBoeSA9IFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19sb2NvLmMgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYwppbmRleCA3Njc4Zjc3Li4yMzdiZGVjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX2xvY28uYwpAQCAtMjQyLDcgKzI0Miw3IEBACiAJZ3Bpb19zZXRfdmFsdWUoTE9DT19GRUNfUEhZX1JTVCwgMSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZmVjX3BsYXRmb3JtX2RhdGEgbXg1M19sb2NvX2ZlY19kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1fZGF0YSBteDUzX2xvY29fZmVjX2RhdGEgX19pbml0Y29uc3QgPSB7CiAJLnBoeSA9IFBIWV9JTlRFUkZBQ0VfTU9ERV9STUlJLAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19zbWQuYyBiL2FyY2gvYXJtL21hY2gtbXg1L2JvYXJkLW14NTNfc21kLmMKaW5kZXggNTljMDg0NS4uZDQyMTMyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teDUvYm9hcmQtbXg1M19zbWQuYworKysgYi9hcmNoL2FybS9tYWNoLW14NS9ib2FyZC1teDUzX3NtZC5jCkBAIC0xMDQsNyArMTA0LDcgQEAKIAlncGlvX3NldF92YWx1ZShTTURfRkVDX1BIWV9SU1QsIDEpOwogfQogCi1zdGF0aWMgc3RydWN0IGZlY19wbGF0Zm9ybV9kYXRhIG14NTNfc21kX2ZlY19kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1fZGF0YSBteDUzX3NtZF9mZWNfZGF0YSBfX2luaXRjb25zdCA9IHsKIAkucGh5ID0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUksCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14NS9pbXg1MS1kdC5jIGIvYXJjaC9hcm0vbWFjaC1teDUvaW14NTEtZHQuYwppbmRleCBjY2M2MTU4Li41OTZlZGQ5IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14NS9pbXg1MS1kdC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXg1L2lteDUxLWR0LmMKQEAgLTQ0LDIwICs0NCwyMiBAQAogCXsgLyogc2VudGluZWwgKi8gfQogfTsKIAotc3RhdGljIHZvaWQgX19pbml0IGlteDUxX3R6aWNfYWRkX2lycV9kb21haW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKK3N0YXRpYyBpbnQgX19pbml0IGlteDUxX3R6aWNfYWRkX2lycV9kb21haW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmludGVycnVwdF9wYXJlbnQpCiB7CiAJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5wLCAwKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IGlteDUxX2dwaW9fYWRkX2lycV9kb21haW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKK3N0YXRpYyBpbnQgX19pbml0IGlteDUxX2dwaW9fYWRkX2lycV9kb21haW4oc3RydWN0IGRldmljZV9ub2RlICpucCwKIAkJCQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmludGVycnVwdF9wYXJlbnQpCiB7Ci0Jc3RhdGljIGludCBncGlvX2lycV9iYXNlID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgQVJDSF9OUl9HUElPUyAtCi0JCQkJICAgMzIgKiA0OyAvKiBpbXg1MSBnZXRzIDQgZ3BpbyBwb3J0cyAqLworCXN0YXRpYyBpbnQgZ3Bpb19pcnFfYmFzZSA9IE1YQ19HUElPX0lSUV9TVEFSVCArIEFSQ0hfTlJfR1BJT1M7CiAKKwlncGlvX2lycV9iYXNlIC09IDMyOwogCWlycV9kb21haW5fYWRkX3NpbXBsZShucCwgZ3Bpb19pcnFfYmFzZSk7Ci0JZ3Bpb19pcnFfYmFzZSArPSAzMjsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBpbXg1MV9pcnFfbWF0Y2hbXSBfX2luaXRjb25zdCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXg1L2lteDUzLWR0LmMgYi9hcmNoL2FybS9tYWNoLW14NS9pbXg1My1kdC5jCmluZGV4IGNjYWEwYjguLjg1YmZkNWYgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtbXg1L2lteDUzLWR0LmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teDUvaW14NTMtZHQuYwpAQCAtNDgsMjAgKzQ4LDIyIEBACiAJeyAvKiBzZW50aW5lbCAqLyB9CiB9OwogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW14NTNfdHppY19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorc3RhdGljIGludCBfX2luaXQgaW14NTNfdHppY19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW50ZXJydXB0X3BhcmVudCkKIHsKIAlpcnFfZG9tYWluX2FkZF9zaW1wbGUobnAsIDApOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgaW14NTNfZ3Bpb19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAorc3RhdGljIGludCBfX2luaXQgaW14NTNfZ3Bpb19hZGRfaXJxX2RvbWFpbihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLAogCQkJCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW50ZXJydXB0X3BhcmVudCkKIHsKLQlzdGF0aWMgaW50IGdwaW9faXJxX2Jhc2UgPSBNWENfR1BJT19JUlFfU1RBUlQgKyBBUkNIX05SX0dQSU9TIC0KLQkJCQkgICAzMiAqIDc7IC8qIGlteDUzIGdldHMgNyBncGlvIHBvcnRzICovCisJc3RhdGljIGludCBncGlvX2lycV9iYXNlID0gTVhDX0dQSU9fSVJRX1NUQVJUICsgQVJDSF9OUl9HUElPUzsKIAorCWdwaW9faXJxX2Jhc2UgLT0gMzI7CiAJaXJxX2RvbWFpbl9hZGRfc2ltcGxlKG5wLCBncGlvX2lycV9iYXNlKTsKLQlncGlvX2lycV9iYXNlICs9IDMyOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGlteDUzX2lycV9tYXRjaFtdIF9faW5pdGNvbnN0ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL214MjguaCBiL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9teDI4LmgKaW5kZXggNzVkODYxMS4uMzBjNzk5MCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL214MjguaAorKysgYi9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvbXgyOC5oCkBAIC0xMDQsOCArMTA0LDggQEAKICNkZWZpbmUgTVgyOF9JTlRfQ0FOMQkJCTkKICNkZWZpbmUgTVgyOF9JTlRfTFJBRENfVE9VQ0gJCTEwCiAjZGVmaW5lIE1YMjhfSU5UX0hTQURDCQkJMTMKLSNkZWZpbmUgTVgyOF9JTlRfSVJBRENfVEhSRVNIMAkJMTQKLSNkZWZpbmUgTVgyOF9JTlRfSVJBRENfVEhSRVNIMQkJMTUKKyNkZWZpbmUgTVgyOF9JTlRfTFJBRENfVEhSRVNIMAkJMTQKKyNkZWZpbmUgTVgyOF9JTlRfTFJBRENfVEhSRVNIMQkJMTUKICNkZWZpbmUgTVgyOF9JTlRfTFJBRENfQ0gwCQkxNgogI2RlZmluZSBNWDI4X0lOVF9MUkFEQ19DSDEJCTE3CiAjZGVmaW5lIE1YMjhfSU5UX0xSQURDX0NIMgkJMTgKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9teHMuaCBiL2FyY2gvYXJtL21hY2gtbXhzL2luY2x1ZGUvbWFjaC9teHMuaAppbmRleCAwZDJkMmI0Li5iZGU1ZjY2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9pbmNsdWRlL21hY2gvbXhzLmgKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvaW5jbHVkZS9tYWNoL214cy5oCkBAIC0zMCw2ICszMCw3IEBACiAgKi8KICNkZWZpbmUgY3B1X2lzX214MjMoKQkJKAkJCQkJXAogCQltYWNoaW5lX2lzX214MjNldmsoKSB8fAkJCQkJXAorCQltYWNoaW5lX2lzX3N0bXAzNzh4KCkgfHwJCQkJXAogCQkwKQogI2RlZmluZSBjcHVfaXNfbXgyOCgpCQkoCQkJCQlcCiAJCW1hY2hpbmVfaXNfbXgyOGV2aygpIHx8CQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW0yOGV2ay5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1tMjhldmsuYwppbmRleCAzYjE2ODFlLi42YjAwNTc3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9tYWNoLW0yOGV2ay5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtbTI4ZXZrLmMKQEAgLTM2MSw2ICszNjEsNiBAQAogTUFDSElORV9TVEFSVChNMjhFVkssICJERU5YIE0yOCBFVksiKQogCS5tYXBfaW8JCT0gbXgyOF9tYXBfaW8sCiAJLmluaXRfaXJxCT0gbXgyOF9pbml0X2lycSwKLQkuaW5pdF9tYWNoaW5lCT0gbTI4ZXZrX2luaXQsCiAJLnRpbWVyCQk9ICZtMjhldmtfdGltZXIsCisJLmluaXRfbWFjaGluZQk9IG0yOGV2a19pbml0LAogTUFDSElORV9FTkQKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtbXhzL21hY2gtc3RtcDM3OHhfZGV2Yi5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1zdG1wMzc4eF9kZXZiLmMKaW5kZXggMTc3ZTUzMS4uNjgzNGRlYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1zdG1wMzc4eF9kZXZiLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1teHMvbWFjaC1zdG1wMzc4eF9kZXZiLmMKQEAgLTExNSw2ICsxMTUsNiBAQAogTUFDSElORV9TVEFSVChTVE1QMzc4WCwgIlNUTVAzNzhYIikKIAkubWFwX2lvCQk9IG14MjNfbWFwX2lvLAogCS5pbml0X2lycQk9IG14MjNfaW5pdF9pcnEsCi0JLmluaXRfbWFjaGluZQk9IHN0bXAzNzh4X2R2Yl9pbml0LAogCS50aW1lcgkJPSAmc3RtcDM3OHhfZHZiX3RpbWVyLAorCS5pbml0X21hY2hpbmUJPSBzdG1wMzc4eF9kdmJfaW5pdCwKIE1BQ0hJTkVfRU5ECmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW14cy9tb2R1bGUtdHgyOC5jIGIvYXJjaC9hcm0vbWFjaC1teHMvbW9kdWxlLXR4MjguYwppbmRleCAwZmNmZjQ3Li45YTdiMDhiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW14cy9tb2R1bGUtdHgyOC5jCisrKyBiL2FyY2gvYXJtL21hY2gtbXhzL21vZHVsZS10eDI4LmMKQEAgLTY2LDExICs2NiwxMSBAQAogCU1YMjhfUEFEX0VORVQwX0NSU19fRU5FVDFfUlhfRU4sCiB9OwogCi1zdGF0aWMgc3RydWN0IGZlY19wbGF0Zm9ybV9kYXRhIHR4MjhfZmVjMF9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1fZGF0YSB0eDI4X2ZlYzBfZGF0YSBfX2luaXRjb25zdCA9IHsKIAkucGh5ID0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUksCiB9OwogCi1zdGF0aWMgc3RydWN0IGZlY19wbGF0Zm9ybV9kYXRhIHR4MjhfZmVjMV9kYXRhID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBmZWNfcGxhdGZvcm1fZGF0YSB0eDI4X2ZlYzFfZGF0YSBfX2luaXRjb25zdCA9IHsKIAkucGh5ID0gUEhZX0lOVEVSRkFDRV9NT0RFX1JNSUksCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAxL2Nsb2NrX2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2tfZGF0YS5jCmluZGV4IDEyOTdiYjUuLjlmZjkwYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2tfZGF0YS5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDEvY2xvY2tfZGF0YS5jCkBAIC0xNiw2ICsxNiw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogCiAjaW5jbHVkZSA8YXNtL21hY2gtdHlwZXMuaD4gIC8qIGZvciBtYWNoaW5lX2lzXyogKi8KQEAgLTkyNywxNiArOTI5LDIyIEBACiAKIHZvaWQgX19pbml0IG9tYXAxX2Nsa19sYXRlX2luaXQodm9pZCkKIHsKLQlpZiAoY2tfZHBsbDEucmF0ZSA+PSBPTUFQMV9EUExMMV9TQU5FX1ZBTFVFKQorCXVuc2lnbmVkIGxvbmcgcmF0ZSA9IGNrX2RwbGwxLnJhdGU7CisKKwlpZiAocmF0ZSA+PSBPTUFQMV9EUExMMV9TQU5FX1ZBTFVFKQogCQlyZXR1cm47CiAKKwkvKiBTeXN0ZW0gYm9vdGluZyBhdCB1bnVzYWJsZSByYXRlLCBmb3JjZSByZXByb2dyYW1taW5nIG9mIERQTEwxICovCisJY2tfZHBsbDFfcC0+cmF0ZSA9IDA7CisKIAkvKiBGaW5kIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBmcmVxdWVuY3kgYW5kIGVuYWJsZSBpdCAqLwogCWlmIChvbWFwMV9zZWxlY3RfdGFibGVfcmF0ZSgmdmlydHVhbF9ja19tcHUsIH4wKSkgewogCQlwcl9lcnIoIlN5c3RlbSBmcmVxdWVuY2llcyBub3Qgc2V0LCB1c2luZyBkZWZhdWx0LiBDaGVjayB5b3VyIGNvbmZpZy5cbiIpOwogCQlvbWFwX3dyaXRldygweDIyOTAsIERQTExfQ1RMKTsKLQkJb21hcF93cml0ZXcoY3B1X2lzX29tYXA3eHgoKSA/IDB4MzAwNSA6IDB4MTAwNSwgQVJNX0NLQ1RMKTsKKwkJb21hcF93cml0ZXcoY3B1X2lzX29tYXA3eHgoKSA/IDB4MjAwNSA6IDB4MDAwNSwgQVJNX0NLQ1RMKTsKIAkJY2tfZHBsbDEucmF0ZSA9IE9NQVAxX0RQTEwxX1NBTkVfVkFMVUU7CiAJfQogCXByb3BhZ2F0ZV9yYXRlKCZja19kcGxsMSk7CiAJb21hcDFfc2hvd19yYXRlcygpOworCWxvb3BzX3Blcl9qaWZmeSA9IGNwdWZyZXFfc2NhbGUobG9vcHNfcGVyX2ppZmZ5LCByYXRlLCBja19kcGxsMS5yYXRlKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvYm9hcmQtcng1MS1wZXJpcGhlcmFscy5jIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMKaW5kZXggYmExYWEwNy4uYzE1YzVjOSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9ib2FyZC1yeDUxLXBlcmlwaGVyYWxzLmMKQEAgLTE5Myw3ICsxOTMsNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHJ4NTFfY2hhcmdlcl9pbml0KHZvaWQpCiB7CiAJV0FSTl9PTihncGlvX3JlcXVlc3Rfb25lKFJYNTFfVVNCX1RSQU5TQ0VJVkVSX1JTVF9HUElPLAotCQlHUElPRl9PVVRfSU5JVF9MT1csICJpc3AxNzA0X3Jlc2V0IikpOworCQlHUElPRl9PVVRfSU5JVF9ISUdILCAiaXNwMTcwNF9yZXNldCIpKTsKIAogCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmcng1MV9jaGFyZ2VyX2RldmljZSk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW9tYXAyL21jYnNwLmMgYi9hcmNoL2FybS9tYWNoLW9tYXAyL21jYnNwLmMKaW5kZXggMjkyZWVlMy4uMjhmY2IyNyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1vbWFwMi9tY2JzcC5jCisrKyBiL2FyY2gvYXJtL21hY2gtb21hcDIvbWNic3AuYwpAQCAtMTQ1LDYgKzE0NSw5IEBACiAJCXBkYXRhLT5yZWdfc2l6ZSA9IDQ7CiAJCXBkYXRhLT5oYXNfY2NyID0gdHJ1ZTsKIAl9CisJcGRhdGEtPnNldF9jbGtfc3JjID0gb21hcDJfbWNic3Bfc2V0X2Nsa19zcmM7CisJaWYgKGlkID09IDEpCisJCXBkYXRhLT5tdXhfc2lnbmFsID0gb21hcDJfbWNic3AxX211eF9yeF9jbGs7CiAKIAlpZiAob2gtPmNsYXNzLT5yZXYgPT0gTUNCU1BfQ09ORklHX1RZUEUzKSB7CiAJCWlmIChpZCA9PSAyKQpAQCAtMTc0LDkgKzE3Nyw2IEBACiAJCQkJCW5hbWUsIG9oLT5uYW1lKTsKIAkJcmV0dXJuIFBUUl9FUlIocGRldik7CiAJfQotCXBkYXRhLT5zZXRfY2xrX3NyYyA9IG9tYXAyX21jYnNwX3NldF9jbGtfc3JjOwotCWlmIChpZCA9PSAxKQotCQlwZGF0YS0+bXV4X3NpZ25hbCA9IG9tYXAyX21jYnNwMV9tdXhfcnhfY2xrOwogCW9tYXBfbWNic3BfY291bnQrKzsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYyBiL2FyY2gvYXJtL21hY2gtb21hcDIvb21hcF9od21vZF8zeHh4X2RhdGEuYwppbmRleCA3Zjg5MTVhLi5lZWY0M2UyIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW9tYXAyL29tYXBfaHdtb2RfM3h4eF9kYXRhLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1vbWFwMi9vbWFwX2h3bW9kXzN4eHhfZGF0YS5jCkBAIC0zMjQ3LDE4ICszMjQ3LDE0IEBACiAKIC8qIDM0MzBFUzEtb25seSBod21vZHMgKi8KIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvbWFwX2h3bW9kICpvbWFwMzQzMGVzMV9od21vZHNbXSA9IHsKLQkmb21hcDN4eHhfaXZhX2h3bW9kLAogCSZvbWFwMzQzMGVzMV9kc3NfY29yZV9od21vZCwKLQkmb21hcDN4eHhfbWFpbGJveF9od21vZCwKIAlOVUxMCiB9OwogCiAvKiAzNDMwRVMyKy1vbmx5IGh3bW9kcyAqLwogc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IG9tYXBfaHdtb2QgKm9tYXAzNDMwZXMycGx1c19od21vZHNbXSA9IHsKLQkmb21hcDN4eHhfaXZhX2h3bW9kLAogCSZvbWFwM3h4eF9kc3NfY29yZV9od21vZCwKIAkmb21hcDN4eHhfdXNiaHNvdGdfaHdtb2QsCi0JJm9tYXAzeHh4X21haWxib3hfaHdtb2QsCiAJTlVMTAogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvcG0uYyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3BtLmMKaW5kZXggY2I1MzE2MC4uMjZlYmI1NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1wcmltYTIvcG0uYworKysgYi9hcmNoL2FybS9tYWNoLXByaW1hMi9wbS5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N1c3BlbmQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9hZGRyZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXByaW1hMi9wcmltYTIuYyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3ByaW1hMi5jCmluZGV4IGVmNTU1YzAuLmExMmI2ODkgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtcHJpbWEyL3ByaW1hMi5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHJpbWEyL3ByaW1hMi5jCkBAIC04LDYgKzgsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoLXR5cGVzLmg+CiAjaW5jbHVkZSA8YXNtL21hY2gvYXJjaC5oPgogI2luY2x1ZGUgPGxpbnV4L29mLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LXNwaS5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L2Rldi1zcGkuYwppbmRleCA1ZTZiNDIwLi4zMzQxZmQxIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXMzYzY0eHgvZGV2LXNwaS5jCisrKyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9kZXYtc3BpLmMKQEAgLTEwLDYgKzEwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZ3Bpby5oPgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3MzYzY0MDAuYyBiL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zM2M2NDAwLmMKaW5kZXggN2EzYmMzMi4uNTFjMDBmMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3MzYzY0MDAuYworKysgYi9hcmNoL2FybS9tYWNoLXMzYzY0eHgvczNjNjQwMC5jCkBAIC03MCw3ICs3MCw3IEBACiAJczNjNjR4eF9pbml0X2lycSh+MCAmIH4oMHhmIDw8IDUpLCB+MCk7CiB9CiAKLXN0cnVjdCBzeXNkZXZfY2xhc3MgczNjNjQwMF9zeXNjbGFzcyA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHMzYzY0MDBfc3lzY2xhc3MgPSB7CiAJLm5hbWUJPSAiczNjNjQwMC1jb3JlIiwKIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtczNjNjR4eC9zZXR1cC1mYi0yNGJwcC5jIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3NldHVwLWZiLTI0YnBwLmMKaW5kZXggODNkMmFmYi4uMmNmODAwMiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3NldHVwLWZiLTI0YnBwLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zM2M2NHh4L3NldHVwLWZiLTI0YnBwLmMKQEAgLTIwLDcgKzIwLDcgQEAKICNpbmNsdWRlIDxwbGF0L2ZiLmg+CiAjaW5jbHVkZSA8cGxhdC9ncGlvLWNmZy5oPgogCi1leHRlcm4gdm9pZCBzM2M2NHh4X2ZiX2dwaW9fc2V0dXBfMjRicHAodm9pZCkKK3ZvaWQgczNjNjR4eF9mYl9ncGlvX3NldHVwXzI0YnBwKHZvaWQpCiB7CiAJczNjX2dwaW9fY2ZncmFuZ2Vfbm9wdWxsKFMzQzY0WFhfR1BJKDApLCAxNiwgUzNDX0dQSU9fU0ZOKDIpKTsKIAlzM2NfZ3Bpb19jZmdyYW5nZV9ub3B1bGwoUzNDNjRYWF9HUEooMCksIDEyLCBTM0NfR1BJT19TRk4oMikpOwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtc21ka3YyMTAuYyBiL2FyY2gvYXJtL21hY2gtczVwdjIxMC9tYWNoLXNtZGt2MjEwLmMKaW5kZXggYTkxMDZjMy4uODY2MmVmNiAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zNXB2MjEwL21hY2gtc21ka3YyMTAuYworKysgYi9hcmNoL2FybS9tYWNoLXM1cHYyMTAvbWFjaC1zbWRrdjIxMC5jCkBAIC0yNzMsNiArMjczLDcgQEAKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9wd21fYmFja2xpZ2h0X2RhdGEgc21ka3YyMTBfYmxfZGF0YSA9IHsKIAkucHdtX2lkID0gMywKKwkucHdtX3BlcmlvZF9ucyA9IDEwMDAsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgc21ka3YyMTBfbWFwX2lvKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9NYWtlZmlsZS5ib290IGIvYXJjaC9hcm0vbWFjaC1zYTExMDAvTWFrZWZpbGUuYm9vdAppbmRleCA1YTYxNmY2Li5mNzk1MWFhIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNhMTEwMC9NYWtlZmlsZS5ib290CisrKyBiL2FyY2gvYXJtL21hY2gtc2ExMTAwL01ha2VmaWxlLmJvb3QKQEAgLTEsNSArMSw1IEBACi1pZmVxICgkKENPTkZJR19BUkNIX1NBMTEwMCkseSkKLSAgIHpyZWxhZGRyLSQoQ09ORklHX1NBMTExMSkJCSs9IDB4YzAyMDgwMDAKK2lmZXEgKCQoQ09ORklHX1NBMTExMSkseSkKKyAgIHpyZWxhZGRyLXkJKz0gMHhjMDIwODAwMAogZWxzZQogICAgenJlbGFkZHIteQkrPSAweGMwMDA4MDAwCiBlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hZzVldm0uYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQtYWc1ZXZtLmMKaW5kZXggYjg2MmU5Zi4uNzExOWI4NyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1hZzVldm0uYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWFnNWV2bS5jCkBAIC02MDcsNiArNjA3LDcgQEAKIAogTUFDSElORV9TVEFSVChBRzVFVk0sICJhZzVldm0iKQogCS5tYXBfaW8JCT0gYWc1ZXZtX21hcF9pbywKKwkubnJfaXJxcwk9IE5SX0lSUVNfTEVHQUNZLAogCS5pbml0X2lycQk9IHNoNzNhMF9pbml0X2lycSwKIAkuaGFuZGxlX2lycQk9IHNobW9iaWxlX2hhbmRsZV9pcnFfZ2ljLAogCS5pbml0X21hY2hpbmUJPSBhZzVldm1faW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQta290YTIuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvYm9hcmQta290YTIuYwppbmRleCBiZDlhNzg0Li5mNDQxNTBiIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2JvYXJkLWtvdGEyLmMKKysrIGIvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9ib2FyZC1rb3RhMi5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5wdXQvc2hfa2V5c2MuaD4KICNpbmNsdWRlIDxsaW51eC9ncGlvX2tleXMuaD4KICNpbmNsdWRlIDxsaW51eC9sZWRzLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGF0YS9sZWRzLXJlbmVzYXMtdHB1Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2hfbW1jaWYuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvdG1pby5oPgpAQCAtNTYsNyArNTcsNyBAQAogCQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMV0gPSB7Ci0JCS5zdGFydAkJPSBnaWNfc3BpKDMzKSwgLyogUElOVEEyIEAgUE9SVDE0NCAqLworCQkuc3RhcnQJCT0gU0g3M0EwX1BJTlQwX0lSUSgyKSwgLyogUElOVEEyICovCiAJCS5mbGFncwkJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKQEAgLTE1NywxMCArMTU4LDYgQEAKICNkZWZpbmUgR1BJT19MRUQobiwgZykgeyAubmFtZSA9IG4sIC5ncGlvID0gZyB9CiAKIHN0YXRpYyBzdHJ1Y3QgZ3Bpb19sZWQgZ3Bpb19sZWRzW10gPSB7Ci0JR1BJT19MRUQoIlYyNTEzIiwgR1BJT19QT1JUMTUzKSwgLyogUE9SVDE1MyBbVFBVMVQwMl0gLT4gVjI1MTMgKi8KLQlHUElPX0xFRCgiVjI1MTQiLCBHUElPX1BPUlQxOTkpLCAvKiBQT1JUMTk5IFtUUFU0VE8xXSAtPiBWMjUxNCAqLwotCUdQSU9fTEVEKCJWMjUxNSIsIEdQSU9fUE9SVDE5NyksIC8qIFBPUlQxOTcgW1RQVTJUTzFdIC0+IFYyNTE1ICovCi0JR1BJT19MRUQoIktFWUxFRCIsIEdQSU9fUE9SVDE2MyksIC8qIFBPUlQxNjMgW1RQVTNUTzBdIC0+IEtFWUxFRCAqLwogCUdQSU9fTEVEKCJHIiwgR1BJT19QT1JUMjApLCAvKiBQT1JUMjAgW0dQTzBdIC0+IExFRDcgLT4gIkciICovCiAJR1BJT19MRUQoIkgiLCBHUElPX1BPUlQyMSksIC8qIFBPUlQyMSBbR1BPMV0gLT4gTEVEOCAtPiAiSCIgKi8KIAlHUElPX0xFRCgiSiIsIEdQSU9fUE9SVDIyKSwgLyogUE9SVDIyIFtHUE8yXSAtPiBMRUQ5IC0+ICJKIiAqLwpAQCAtMTc5LDYgKzE3NiwxMTkgQEAKIAl9LAogfTsKIAorLyogVFBVIExFRCAqLworc3RhdGljIHN0cnVjdCBsZWRfcmVuZXNhc190cHVfY29uZmlnIGxlZF9yZW5lc2FzX3RwdTEyX3BkYXRhID0geworCS5uYW1lCQk9ICJWMjUxMyIsCisJLnBpbl9ncGlvX2ZuCT0gR1BJT19GTl9UUFUxVE8yLAorCS5waW5fZ3Bpbwk9IEdQSU9fUE9SVDE1MywKKwkuY2hhbm5lbF9vZmZzZXQgPSAweDkwLAorCS50aW1lcl9iaXQgPSAyLAorCS5tYXhfYnJpZ2h0bmVzcyA9IDEwMDAsCit9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIHRwdTEyX3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLm5hbWUJPSAiVFBVMTIiLAorCQkuc3RhcnQJPSAweGU2NjEwMDkwLAorCQkuZW5kCT0gMHhlNjYxMDBiNSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGxlZHNfdHB1MTJfZGV2aWNlID0geworCS5uYW1lID0gImxlZHMtcmVuZXNhcy10cHUiLAorCS5pZCA9IDEyLAorCS5kZXYgPSB7CisJCS5wbGF0Zm9ybV9kYXRhICA9ICZsZWRfcmVuZXNhc190cHUxMl9wZGF0YSwKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRSh0cHUxMl9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IHRwdTEyX3Jlc291cmNlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgbGVkX3JlbmVzYXNfdHB1X2NvbmZpZyBsZWRfcmVuZXNhc190cHU0MV9wZGF0YSA9IHsKKwkubmFtZQkJPSAiVjI1MTQiLAorCS5waW5fZ3Bpb19mbgk9IEdQSU9fRk5fVFBVNFRPMSwKKwkucGluX2dwaW8JPSBHUElPX1BPUlQxOTksCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHg1MCwKKwkudGltZXJfYml0ID0gMSwKKwkubWF4X2JyaWdodG5lc3MgPSAxMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0cHU0MV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRQVTQxIiwKKwkJLnN0YXJ0CT0gMHhlNjY0MDA1MCwKKwkJLmVuZAk9IDB4ZTY2NDAwNzUsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsZWRzX3RwdTQxX2RldmljZSA9IHsKKwkubmFtZSA9ICJsZWRzLXJlbmVzYXMtdHB1IiwKKwkuaWQgPSA0MSwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmbGVkX3JlbmVzYXNfdHB1NDFfcGRhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodHB1NDFfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSB0cHU0MV9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IGxlZF9yZW5lc2FzX3RwdV9jb25maWcgbGVkX3JlbmVzYXNfdHB1MjFfcGRhdGEgPSB7CisJLm5hbWUJCT0gIlYyNTE1IiwKKwkucGluX2dwaW9fZm4JPSBHUElPX0ZOX1RQVTJUTzEsCisJLnBpbl9ncGlvCT0gR1BJT19QT1JUMTk3LAorCS5jaGFubmVsX29mZnNldCA9IDB4NTAsCisJLnRpbWVyX2JpdCA9IDEsCisJLm1heF9icmlnaHRuZXNzID0gMTAwMCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgdHB1MjFfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkubmFtZQk9ICJUUFUyMSIsCisJCS5zdGFydAk9IDB4ZTY2MjAwNTAsCisJCS5lbmQJPSAweGU2NjIwMDc1LAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgbGVkc190cHUyMV9kZXZpY2UgPSB7CisJLm5hbWUgPSAibGVkcy1yZW5lc2FzLXRwdSIsCisJLmlkID0gMjEsCisJLmRldiA9IHsKKwkJLnBsYXRmb3JtX2RhdGEgID0gJmxlZF9yZW5lc2FzX3RwdTIxX3BkYXRhLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKHRwdTIxX3Jlc291cmNlcyksCisJLnJlc291cmNlCT0gdHB1MjFfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBsZWRfcmVuZXNhc190cHVfY29uZmlnIGxlZF9yZW5lc2FzX3RwdTMwX3BkYXRhID0geworCS5uYW1lCQk9ICJLRVlMRUQiLAorCS5waW5fZ3Bpb19mbgk9IEdQSU9fRk5fVFBVM1RPMCwKKwkucGluX2dwaW8JPSBHUElPX1BPUlQxNjMsCisJLmNoYW5uZWxfb2Zmc2V0ID0gMHgxMCwKKwkudGltZXJfYml0ID0gMCwKKwkubWF4X2JyaWdodG5lc3MgPSAxMDAwLAorfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSB0cHUzMF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gIlRQVTMwIiwKKwkJLnN0YXJ0CT0gMHhlNjYzMDAxMCwKKwkJLmVuZAk9IDB4ZTY2MzAwMzUsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBsZWRzX3RwdTMwX2RldmljZSA9IHsKKwkubmFtZSA9ICJsZWRzLXJlbmVzYXMtdHB1IiwKKwkuaWQgPSAzMCwKKwkuZGV2ID0geworCQkucGxhdGZvcm1fZGF0YSAgPSAmbGVkX3JlbmVzYXNfdHB1MzBfcGRhdGEsCisJfSwKKwkubnVtX3Jlc291cmNlcwk9IEFSUkFZX1NJWkUodHB1MzBfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSB0cHUzMF9yZXNvdXJjZXMsCit9OworCiAvKiBNTUNJRiAqLwogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtbWNpZl9yZXNvdXJjZXNbXSA9IHsKIAlbMF0gPSB7CkBAIC0yOTEsNiArNDAxLDEwIEBACiAJJmtleXNjX2RldmljZSwKIAkmZ3Bpb19rZXlzX2RldmljZSwKIAkmZ3Bpb19sZWRzX2RldmljZSwKKwkmbGVkc190cHUxMl9kZXZpY2UsCisJJmxlZHNfdHB1NDFfZGV2aWNlLAorCSZsZWRzX3RwdTIxX2RldmljZSwKKwkmbGVkc190cHUzMF9kZXZpY2UsCiAJJm1tY2lmX2RldmljZSwKIAkmc2RoaTBfZGV2aWNlLAogCSZzZGhpMV9kZXZpY2UsCkBAIC0zMTcsMTggKzQzMSw2IEBACiAJc2htb2JpbGVfc2V0dXBfY29uc29sZSgpOwogfQogCi0jZGVmaW5lIFBJTlRFUjBBCTB4ZTY5MDAwYTAKLSNkZWZpbmUgUElOVENSMEEJMHhlNjkwMDBiMAotCi12b2lkIF9faW5pdCBrb3RhMl9pbml0X2lycSh2b2lkKQotewotCXNoNzNhMF9pbml0X2lycSgpOwotCi0JLyogc2V0dXAgUElOVDogZW5hYmxlIFBJTlRBMiBhcyBhY3RpdmUgbG93ICovCi0JX19yYXdfd3JpdGVsKDEgPDwgMjksIFBJTlRFUjBBKTsKLQlfX3Jhd193cml0ZXcoMiA8PCAxMCwgUElOVENSMEEpOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQga290YTJfaW5pdCh2b2lkKQogewogCXNoNzNhMF9waW5tdXhfaW5pdCgpOwpAQCAtNDQ3LDcgKzU0OSw4IEBACiAKIE1BQ0hJTkVfU1RBUlQoS09UQTIsICJrb3RhMiIpCiAJLm1hcF9pbwkJPSBrb3RhMl9tYXBfaW8sCi0JLmluaXRfaXJxCT0ga290YTJfaW5pdF9pcnEsCisJLm5yX2lycXMJPSBOUl9JUlFTX0xFR0FDWSwKKwkuaW5pdF9pcnEJPSBzaDczYTBfaW5pdF9pcnEsCiAJLmhhbmRsZV9pcnEJPSBzaG1vYmlsZV9oYW5kbGVfaXJxX2dpYywKIAkuaW5pdF9tYWNoaW5lCT0ga290YTJfaW5pdCwKIAkudGltZXIJCT0gJmtvdGEyX3RpbWVyLApkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczYTAuYyBiL2FyY2gvYXJtL21hY2gtc2htb2JpbGUvY2xvY2stc2g3M2EwLmMKaW5kZXggNjFhODQ2Yi4uMTM3MGE4OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1zaG1vYmlsZS9jbG9jay1zaDczYTAuYworKysgYi9hcmNoL2FybS9tYWNoLXNobW9iaWxlL2Nsb2NrLXNoNzNhMC5jCkBAIC0xMTMsNiArMTEzLDEyIEBACiAJLm9wcwkJPSAmbWFpbl9jbGtfb3BzLAogfTsKIAorLyogRGl2aWRlIE1haW4gY2xvY2sgYnkgdHdvICovCitzdGF0aWMgc3RydWN0IGNsayBtYWluX2RpdjJfY2xrID0geworCS5vcHMJCT0gJmRpdjJfY2xrX29wcywKKwkucGFyZW50CQk9ICZtYWluX2NsaywKK307CisKIC8qIFBMTDAsIFBMTDEsIFBMTDIsIFBMTDMgKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIHBsbF9yZWNhbGMoc3RydWN0IGNsayAqY2xrKQogewpAQCAtMTgxLDYgKzE4Nyw3IEBACiAJJmV4dGFsMV9kaXYyX2NsaywKIAkmZXh0YWwyX2RpdjJfY2xrLAogCSZtYWluX2NsaywKKwkmbWFpbl9kaXYyX2NsaywKIAkmcGxsMF9jbGssCiAJJnBsbDFfY2xrLAogCSZwbGwyX2NsaywKQEAgLTI0Myw3ICsyNTAsNyBAQAogCVtESVY2X1ZDSzFdID0gU0hfQ0xLX0RJVjYoJnBsbDFfZGl2Ml9jbGssIFZDTEtDUjEsIDApLAogCVtESVY2X1ZDSzJdID0gU0hfQ0xLX0RJVjYoJnBsbDFfZGl2Ml9jbGssIFZDTEtDUjIsIDApLAogCVtESVY2X1ZDSzNdID0gU0hfQ0xLX0RJVjYoJnBsbDFfZGl2Ml9jbGssIFZDTEtDUjMsIDApLAotCVtESVY2X1pCMV0gPSBTSF9DTEtfRElWNigmcGxsMV9kaXYyX2NsaywgWkJDS0NSLCAwKSwKKwlbRElWNl9aQjFdID0gU0hfQ0xLX0RJVjYoJnBsbDFfZGl2Ml9jbGssIFpCQ0tDUiwgQ0xLX0VOQUJMRV9PTl9JTklUKSwKIAlbRElWNl9GTENUTF0gPSBTSF9DTEtfRElWNigmcGxsMV9kaXYyX2NsaywgRkxDS0NSLCAwKSwKIAlbRElWNl9TREhJMF0gPSBTSF9DTEtfRElWNigmcGxsMV9kaXYyX2NsaywgU0QwQ0tDUiwgMCksCiAJW0RJVjZfU0RISTFdID0gU0hfQ0xLX0RJVjYoJnBsbDFfZGl2Ml9jbGssIFNEMUNLQ1IsIDApLApAQCAtMjY4LDYgKzI3NSw3IEBACiAJTVNUUDIwNywgTVNUUDIwNiwgTVNUUDIwNCwgTVNUUDIwMywgTVNUUDIwMiwgTVNUUDIwMSwgTVNUUDIwMCwKIAlNU1RQMzMxLCBNU1RQMzI5LCBNU1RQMzI1LCBNU1RQMzIzLCBNU1RQMzE4LAogCU1TVFAzMTQsIE1TVFAzMTMsIE1TVFAzMTIsIE1TVFAzMTEsCisJTVNUUDMwMywgTVNUUDMwMiwgTVNUUDMwMSwgTVNUUDMwMCwKIAlNU1RQNDExLCBNU1RQNDEwLCBNU1RQNDAzLAogCU1TVFBfTlIgfTsKIApAQCAtMzAxLDYgKzMwOSwxMCBAQAogCVtNU1RQMzEzXSA9IE1TVFAoJmRpdjZfY2xrc1tESVY2X1NESEkxXSwgU01TVFBDUjMsIDEzLCAwKSwgLyogU0RISTEgKi8KIAlbTVNUUDMxMl0gPSBNU1RQKCZkaXY0X2Nsa3NbRElWNF9IUF0sIFNNU1RQQ1IzLCAxMiwgMCksIC8qIE1NQ0lGMCAqLwogCVtNU1RQMzExXSA9IE1TVFAoJmRpdjZfY2xrc1tESVY2X1NESEkyXSwgU01TVFBDUjMsIDExLCAwKSwgLyogU0RISTIgKi8KKwlbTVNUUDMwM10gPSBNU1RQKCZtYWluX2RpdjJfY2xrLCBTTVNUUENSMywgMywgMCksIC8qIFRQVTEgKi8KKwlbTVNUUDMwMl0gPSBNU1RQKCZtYWluX2RpdjJfY2xrLCBTTVNUUENSMywgMiwgMCksIC8qIFRQVTIgKi8KKwlbTVNUUDMwMV0gPSBNU1RQKCZtYWluX2RpdjJfY2xrLCBTTVNUUENSMywgMSwgMCksIC8qIFRQVTMgKi8KKwlbTVNUUDMwMF0gPSBNU1RQKCZtYWluX2RpdjJfY2xrLCBTTVNUUENSMywgMCwgMCksIC8qIFRQVTQgKi8KIAlbTVNUUDQxMV0gPSBNU1RQKCZkaXY0X2Nsa3NbRElWNF9IUF0sIFNNU1RQQ1I0LCAxMSwgMCksIC8qIElJQzMgKi8KIAlbTVNUUDQxMF0gPSBNU1RQKCZkaXY0X2Nsa3NbRElWNF9IUF0sIFNNU1RQQ1I0LCAxMCwgMCksIC8qIElJQzQgKi8KIAlbTVNUUDQwM10gPSBNU1RQKCZyX2NsaywgU01TVFBDUjQsIDMsIDApLCAvKiBLRVlTQyAqLwpAQCAtMzUwLDYgKzM2MiwxMCBAQAogCUNMS0RFVl9ERVZfSUQoInNoX21vYmlsZV9zZGhpLjEiLCAmbXN0cF9jbGtzW01TVFAzMTNdKSwgLyogU0RISTEgKi8KIAlDTEtERVZfREVWX0lEKCJzaF9tbWNpZi4wIiwgJm1zdHBfY2xrc1tNU1RQMzEyXSksIC8qIE1NQ0lGMCAqLwogCUNMS0RFVl9ERVZfSUQoInNoX21vYmlsZV9zZGhpLjIiLCAmbXN0cF9jbGtzW01TVFAzMTFdKSwgLyogU0RISTIgKi8KKwlDTEtERVZfREVWX0lEKCJsZWRzLXJlbmVzYXMtdHB1LjEyIiwgJm1zdHBfY2xrc1tNU1RQMzAzXSksIC8qIFRQVTEgKi8KKwlDTEtERVZfREVWX0lEKCJsZWRzLXJlbmVzYXMtdHB1LjIxIiwgJm1zdHBfY2xrc1tNU1RQMzAyXSksIC8qIFRQVTIgKi8KKwlDTEtERVZfREVWX0lEKCJsZWRzLXJlbmVzYXMtdHB1LjMwIiwgJm1zdHBfY2xrc1tNU1RQMzAxXSksIC8qIFRQVTMgKi8KKwlDTEtERVZfREVWX0lEKCJsZWRzLXJlbmVzYXMtdHB1LjQxIiwgJm1zdHBfY2xrc1tNU1RQMzAwXSksIC8qIFRQVTQgKi8KIAlDTEtERVZfREVWX0lEKCJpMmMtc2hfbW9iaWxlLjMiLCAmbXN0cF9jbGtzW01TVFA0MTFdKSwgLyogSTJDMyAqLwogCUNMS0RFVl9ERVZfSUQoImkyYy1zaF9tb2JpbGUuNCIsICZtc3RwX2Nsa3NbTVNUUDQxMF0pLCAvKiBJMkM0ICovCiAJQ0xLREVWX0RFVl9JRCgic2hfa2V5c2MuMCIsICZtc3RwX2Nsa3NbTVNUUDQwM10pLCAvKiBLRVlTQyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vbW0vaW5pdC5jIGIvYXJjaC9hcm0vbW0vaW5pdC5jCmluZGV4IGZiZGQxMmUuLjdjMzg0NzQgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21tL2luaXQuYworKysgYi9hcmNoL2FybS9tbS9pbml0LmMKQEAgLTMyLDYgKzMyLDcgQEAKIAogI2luY2x1ZGUgPGFzbS9tYWNoL2FyY2guaD4KICNpbmNsdWRlIDxhc20vbWFjaC9tYXAuaD4KKyNpbmNsdWRlIDxhc20vbWVtYmxvY2suaD4KIAogI2luY2x1ZGUgIm1tLmgiCiAKQEAgLTMzMiw3ICszMzMsNiBAQAogCiAJc29ydCgmbWVtaW5mby5iYW5rLCBtZW1pbmZvLm5yX2JhbmtzLCBzaXplb2YobWVtaW5mby5iYW5rWzBdKSwgbWVtaW5mb19jbXAsIE5VTEwpOwogCi0JbWVtYmxvY2tfaW5pdCgpOwogCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmFua3M7IGkrKykKIAkJbWVtYmxvY2tfYWRkKG1pLT5iYW5rW2ldLnN0YXJ0LCBtaS0+YmFua1tpXS5zaXplKTsKIApAQCAtMzcxLDcgKzM3MSw3IEBACiAJaWYgKG1kZXNjLT5yZXNlcnZlKQogCQltZGVzYy0+cmVzZXJ2ZSgpOwogCi0JbWVtYmxvY2tfYW5hbHl6ZSgpOworCW1lbWJsb2NrX2FsbG93X3Jlc2l6ZSgpOwogCW1lbWJsb2NrX2R1bXBfYWxsKCk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL21tL3Byb2MtdjcuUyBiL2FyY2gvYXJtL21tL3Byb2MtdjcuUwppbmRleCAyYzU1OWFjLi5lNzBhNzM3IDEwMDY0NAotLS0gYS9hcmNoL2FybS9tbS9wcm9jLXY3LlMKKysrIGIvYXJjaC9hcm0vbW0vcHJvYy12Ny5TCkBAIC0zNjMsMTEgKzM2MywxMyBAQAogCW9ycmVxCXIxMCwgcjEwLCAjMSA8PCA2CQlAIHNldCBiaXQgIzYKIAltY3JlcQlwMTUsIDAsIHIxMCwgYzE1LCBjMCwgMQkJQCB3cml0ZSBkaWFnbm9zdGljIHJlZ2lzdGVyCiAjZW5kaWYKLSNpZmRlZiBDT05GSUdfQVJNX0VSUkFUQV83NTE0NzIKLQljbXAJcjYsICMweDMwCQkJQCBwcmVzZW50IHByaW9yIHRvIHIzcDAKKyNpZiBkZWZpbmVkKENPTkZJR19BUk1fRVJSQVRBXzc1MTQ3MikgJiYgZGVmaW5lZChDT05GSUdfU01QKQorCUFMVF9TTVAoY21wIHI2LCAjMHgzMCkJCQlAIHByZXNlbnQgcHJpb3IgdG8gcjNwMAorCUFMVF9VUF9CKDFmKQogCW1yY2x0CXAxNSwgMCwgcjEwLCBjMTUsIGMwLCAxCQlAIHJlYWQgZGlhZ25vc3RpYyByZWdpc3RlcgogCW9ycmx0CXIxMCwgcjEwLCAjMSA8PCAxMQkJQCBzZXQgYml0ICMxMQogCW1jcmx0CXAxNSwgMCwgcjEwLCBjMTUsIGMwLCAxCQlAIHdyaXRlIGRpYWdub3N0aWMgcmVnaXN0ZXIKKzE6CiAjZW5kaWYKIAogMzoJbW92CXIxMCwgIzAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL29wcm9maWxlL2NvbW1vbi5jIGIvYXJjaC9hcm0vb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggYzA3NGU2Ni4uNGUwYTM3MSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vb3Byb2ZpbGUvY29tbW9uLmMKKysrIGIvYXJjaC9hcm0vb3Byb2ZpbGUvY29tbW9uLmMKQEAgLTExNiw3ICsxMTYsNyBAQAogCXJldHVybiBvcHJvZmlsZV9wZXJmX2luaXQob3BzKTsKIH0KIAotdm9pZCBfX2V4aXQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpCit2b2lkIG9wcm9maWxlX2FyY2hfZXhpdCh2b2lkKQogewogCW9wcm9maWxlX3BlcmZfZXhpdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1teGMvY3B1ZnJlcS5jIGIvYXJjaC9hcm0vcGxhdC1teGMvY3B1ZnJlcS5jCmluZGV4IDc0YWFjOTYuLjczZGIzNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2NwdWZyZXEuYworKysgYi9hcmNoL2FybS9wbGF0LW14Yy9jcHVmcmVxLmMKQEAgLTE3LDYgKzE3LDcgQEAKICAqIHRoZSBDUFUgY2xvY2sgc3BlZWQgb24gdGhlIGZseS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1ZnJlcS5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgpAQCAtOTcsNyArOTgsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IG14Y19jcHVmcmVxX2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitzdGF0aWMgaW50IG14Y19jcHVmcmVxX2luaXQoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJaW50IHJldDsKIAlpbnQgaTsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmggYi9hcmNoL2FybS9wbGF0LW14Yy9pbmNsdWRlL21hY2gvdW5jb21wcmVzcy5oCmluZGV4IDg4ZmQ0MDQuLjQ3Nzk3MWIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL2luY2x1ZGUvbWFjaC91bmNvbXByZXNzLmgKKysrIGIvYXJjaC9hcm0vcGxhdC1teGMvaW5jbHVkZS9tYWNoL3VuY29tcHJlc3MuaApAQCAtOTgsNiArOTgsNyBAQAogCWNhc2UgTUFDSF9UWVBFX1BDTTA0MzoKIAljYXNlIE1BQ0hfVFlQRV9MSUxMWTExMzE6CiAJY2FzZSBNQUNIX1RZUEVfVlBSMjAwOgorCWNhc2UgTUFDSF9UWVBFX0VVS1JFQV9DUFVJTVgzNVNEOgogCQl1YXJ0X2Jhc2UgPSBNWDNYX1VBUlQxX0JBU0VfQUREUjsKIAkJYnJlYWs7CiAJY2FzZSBNQUNIX1RZUEVfTUFHWF9aTjU6CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LW14Yy9wd20uYyBiL2FyY2gvYXJtL3BsYXQtbXhjL3B3bS5jCmluZGV4IDQyZDc0ZWEuLmUwMzI3MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtbXhjL3B3bS5jCisrKyBiL2FyY2gvYXJtL3BsYXQtbXhjL3B3bS5jCkBAIC0zMiw2ICszMiw5IEBACiAjZGVmaW5lIE1YM19QV01TQVIgICAgICAgICAgICAgICAgMHgwQyAgICAvKiBQV00gU2FtcGxlIFJlZ2lzdGVyICovCiAjZGVmaW5lIE1YM19QV01QUiAgICAgICAgICAgICAgICAgMHgxMCAgICAvKiBQV00gUGVyaW9kIFJlZ2lzdGVyICovCiAjZGVmaW5lIE1YM19QV01DUl9QUkVTQ0FMRVIoeCkgICAgKCgoeCAtIDEpICYgMHhGRkYpIDw8IDQpCisjZGVmaW5lIE1YM19QV01DUl9ET1pFRU4gICAgICAgICAgICAgICAgKDEgPDwgMjQpCisjZGVmaW5lIE1YM19QV01DUl9XQUlURU4gICAgICAgICAgICAgICAgKDEgPDwgMjMpCisjZGVmaW5lIE1YM19QV01DUl9EQkdFTgkJCSgxIDw8IDIyKQogI2RlZmluZSBNWDNfUFdNQ1JfQ0xLU1JDX0lQR19ISUdIICgyIDw8IDE2KQogI2RlZmluZSBNWDNfUFdNQ1JfQ0xLU1JDX0lQRyAgICAgICgxIDw8IDE2KQogI2RlZmluZSBNWDNfUFdNQ1JfRU4gICAgICAgICAgICAgICgxIDw8IDApCkBAIC03NCwxMCArNzcsMjEgQEAKIAkJZG9fZGl2KGMsIHBlcmlvZF9ucyk7CiAJCWR1dHlfY3ljbGVzID0gYzsKIAorCQkvKgorCQkgKiBhY2NvcmRpbmcgdG8gaW14IHB3bSBSTSwgdGhlIHJlYWwgcGVyaW9kIHZhbHVlIHNob3VsZCBiZQorCQkgKiBQRVJJT0QgdmFsdWUgaW4gUFdNUFIgcGx1cyAyLgorCQkgKi8KKwkJaWYgKHBlcmlvZF9jeWNsZXMgPiAyKQorCQkJcGVyaW9kX2N5Y2xlcyAtPSAyOworCQllbHNlCisJCQlwZXJpb2RfY3ljbGVzID0gMDsKKwogCQl3cml0ZWwoZHV0eV9jeWNsZXMsIHB3bS0+bW1pb19iYXNlICsgTVgzX1BXTVNBUik7CiAJCXdyaXRlbChwZXJpb2RfY3ljbGVzLCBwd20tPm1taW9fYmFzZSArIE1YM19QV01QUik7CiAKLQkJY3IgPSBNWDNfUFdNQ1JfUFJFU0NBTEVSKHByZXNjYWxlKSB8IE1YM19QV01DUl9FTjsKKwkJY3IgPSBNWDNfUFdNQ1JfUFJFU0NBTEVSKHByZXNjYWxlKSB8CisJCQlNWDNfUFdNQ1JfRE9aRUVOIHwgTVgzX1BXTUNSX1dBSVRFTiB8CisJCQlNWDNfUFdNQ1JfREJHRU4gfCBNWDNfUFdNQ1JfRU47CiAKIAkJaWYgKGNwdV9pc19teDI1KCkpCiAJCQljciB8PSBNWDNfUFdNQ1JfQ0xLU1JDX0lQRzsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtb3Jpb24vZ3Bpby5jIGIvYXJjaC9hcm0vcGxhdC1vcmlvbi9ncGlvLmMKaW5kZXggNDFhYjk3ZS4uMTBkMTYwOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1vcmlvbi9ncGlvLmMKKysrIGIvYXJjaC9hcm0vcGxhdC1vcmlvbi9ncGlvLmMKQEAgLTM4NCwxMiArMzg0LDE2IEBACiAJc3RydWN0IG9yaW9uX2dwaW9fY2hpcCAqb2NoaXA7CiAJc3RydWN0IGlycV9jaGlwX2dlbmVyaWMgKmdjOwogCXN0cnVjdCBpcnFfY2hpcF90eXBlICpjdDsKKwljaGFyIGdjX2xhYmVsWzE2XTsKIAogCWlmIChvcmlvbl9ncGlvX2NoaXBfY291bnQgPT0gQVJSQVlfU0laRShvcmlvbl9ncGlvX2NoaXBzKSkKIAkJcmV0dXJuOwogCisJc25wcmludGYoZ2NfbGFiZWwsIHNpemVvZihnY19sYWJlbCksICJvcmlvbl9ncGlvJWQiLAorCQlvcmlvbl9ncGlvX2NoaXBfY291bnQpOworCiAJb2NoaXAgPSBvcmlvbl9ncGlvX2NoaXBzICsgb3Jpb25fZ3Bpb19jaGlwX2NvdW50OwotCW9jaGlwLT5jaGlwLmxhYmVsID0gIm9yaW9uX2dwaW8iOworCW9jaGlwLT5jaGlwLmxhYmVsID0ga3N0cmR1cChnY19sYWJlbCwgR0ZQX0tFUk5FTCk7CiAJb2NoaXAtPmNoaXAucmVxdWVzdCA9IG9yaW9uX2dwaW9fcmVxdWVzdDsKIAlvY2hpcC0+Y2hpcC5kaXJlY3Rpb25faW5wdXQgPSBvcmlvbl9ncGlvX2RpcmVjdGlvbl9pbnB1dDsKIAlvY2hpcC0+Y2hpcC5nZXQgPSBvcmlvbl9ncGlvX2dldDsKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYmFja2xpZ2h0LmMgYi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvZGV2LWJhY2tsaWdodC5jCmluZGV4IGU2NTczMDUuLmE5NzZjMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9kZXYtYmFja2xpZ2h0LmMKKysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL2Rldi1iYWNrbGlnaHQuYwpAQCAtMTUsNyArMTUsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3B3bV9iYWNrbGlnaHQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlIDxwbGF0L2RldnMuaD4KICNpbmNsdWRlIDxwbGF0L2dwaW8tY2ZnLmg+CmRpZmYgLS1naXQgYS9hcmNoL2FybS9wbGF0LXNhbXN1bmcvaW5jbHVkZS9wbGF0L2NwdS1mcmVxLWNvcmUuaCBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oCmluZGV4IGRhYzQ3NjAuLjk1NTA5ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oCisrKyBiL2FyY2gvYXJtL3BsYXQtc2Ftc3VuZy9pbmNsdWRlL3BsYXQvY3B1LWZyZXEtY29yZS5oCkBAIC0yMDIsMTQgKzIwMiw2IEBACiBleHRlcm4gc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqczNjX2NwdWZyZXFfZ2V0Y29uZmlnKHZvaWQpOwogZXh0ZXJuIHN0cnVjdCBzM2NfaW90aW1pbmdzICpzM2NfY3B1ZnJlcV9nZXRpb3RpbWluZ3Modm9pZCk7CiAKLWV4dGVybiB2b2lkIHMzYzI0MTBfaW90aW1pbmdfZGVidWdmcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKLQkJCQkgICAgIHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKLQkJCQkgICAgIHVuaW9uIHMzY19pb2JhbmsgKmlvYik7Ci0KLWV4dGVybiB2b2lkIHMzYzI0MTJfaW90aW1pbmdfZGVidWdmcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKLQkJCQkgICAgIHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKLQkJCQkgICAgIHVuaW9uIHMzY19pb2JhbmsgKmlvYik7Ci0KICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVFfUzNDMjRYWF9ERUJVR0ZTCiAjZGVmaW5lIHMzY19jcHVmcmVxX2RlYnVnZnNfY2FsbCh4KSB4CiAjZWxzZQpAQCAtMjI2LDYgKzIxOCwxMCBAQAogZXh0ZXJuIHZvaWQgczNjMjQxMF9zZXRfZnZjbyhzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcpOwogCiAjaWZkZWYgQ09ORklHX1MzQzI0MTBfSU9USU1JTkcKK2V4dGVybiB2b2lkIHMzYzI0MTBfaW90aW1pbmdfZGVidWdmcyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwKKwkJCQkgICAgIHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKKwkJCQkgICAgIHVuaW9uIHMzY19pb2JhbmsgKmlvYik7CisKIGV4dGVybiBpbnQgczNjMjQxMF9pb3RpbWluZ19jYWxjKHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKIAkJCQkgc3RydWN0IHMzY19pb3RpbWluZ3MgKmlvdCk7CiAKQEAgLTIzNSw2ICsyMzEsNyBAQAogZXh0ZXJuIHZvaWQgczNjMjQxMF9pb3RpbWluZ19zZXQoc3RydWN0IHMzY19jcHVmcmVxX2NvbmZpZyAqY2ZnLAogCQkJCSBzdHJ1Y3QgczNjX2lvdGltaW5ncyAqaW90KTsKICNlbHNlCisjZGVmaW5lIHMzYzI0MTBfaW90aW1pbmdfZGVidWdmcyBOVUxMCiAjZGVmaW5lIHMzYzI0MTBfaW90aW1pbmdfY2FsYyBOVUxMCiAjZGVmaW5lIHMzYzI0MTBfaW90aW1pbmdfZ2V0IE5VTEwKICNkZWZpbmUgczNjMjQxMF9pb3RpbWluZ19zZXQgTlVMTApAQCAtMjQyLDggKzIzOSwxMCBAQAogCiAvKiBTM0MyNDEyIGNvbXBhdGlibGUgcm91dGluZXMgKi8KIAotZXh0ZXJuIGludCBzM2MyNDEyX2lvdGltaW5nX2dldChzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCi0JCQkJc3RydWN0IHMzY19pb3RpbWluZ3MgKnRpbWluZ3MpOworI2lmZGVmIENPTkZJR19TM0MyNDEyX0lPVElNSU5HCitleHRlcm4gdm9pZCBzM2MyNDEyX2lvdGltaW5nX2RlYnVnZnMoc3RydWN0IHNlcV9maWxlICpzZXEsCisJCQkJICAgICBzdHJ1Y3QgczNjX2NwdWZyZXFfY29uZmlnICpjZmcsCisJCQkJICAgICB1bmlvbiBzM2NfaW9iYW5rICppb2IpOwogCiBleHRlcm4gaW50IHMzYzI0MTJfaW90aW1pbmdfZ2V0KHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKIAkJCQlzdHJ1Y3QgczNjX2lvdGltaW5ncyAqdGltaW5ncyk7CkBAIC0yNTMsNiArMjUyLDEyIEBACiAKIGV4dGVybiB2b2lkIHMzYzI0MTJfaW90aW1pbmdfc2V0KHN0cnVjdCBzM2NfY3B1ZnJlcV9jb25maWcgKmNmZywKIAkJCQkgc3RydWN0IHMzY19pb3RpbWluZ3MgKmlvdCk7CisjZWxzZQorI2RlZmluZSBzM2MyNDEyX2lvdGltaW5nX2RlYnVnZnMgTlVMTAorI2RlZmluZSBzM2MyNDEyX2lvdGltaW5nX2NhbGMgTlVMTAorI2RlZmluZSBzM2MyNDEyX2lvdGltaW5nX2dldCBOVUxMCisjZGVmaW5lIHMzYzI0MTJfaW90aW1pbmdfc2V0IE5VTEwKKyNlbmRpZiAvKiBDT05GSUdfUzNDMjQxMl9JT1RJTUlORyAqLwogCiAjaWZkZWYgQ09ORklHX0NQVV9GUkVRX1MzQzI0WFhfREVCVUcKICNkZWZpbmUgczNjX2ZyZXFfZGJnKHguLi4pIHByaW50ayhLRVJOX0lORk8geCkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL2F2cjMyL2luY2x1ZGUvYXNtL3NvY2tldC5oCmluZGV4IGM4ZDFmYWUuLjI0N2I4OGMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9hdnIzMi9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNjIsNCArNjIsNyBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogI2VuZGlmIC8qIF9fQVNNX0FWUjMyX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL2F2cjMyL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggZWY1YTJhMC4uZWEzMzk1NyAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvYXZyMzIva2VybmVsL3Byb2Nlc3MuYwpAQCAtMzQsMTAgKzM0LDEyIEBACiB7CiAJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KIAl3aGlsZSAoMSkgewotCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKDEpOworCQl0aWNrX25vaHpfaWRsZV9lbnRlcigpOworCQlyY3VfaWRsZV9lbnRlcigpOwogCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQogCQkJY3B1X2lkbGVfc2xlZXAoKTsKLQkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljaygpOworCQlyY3VfaWRsZV9leGl0KCk7CisJCXRpY2tfbm9oel9pZGxlX2V4aXQoKTsKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCQlzY2hlZHVsZSgpOwogCQlwcmVlbXB0X2Rpc2FibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvYmxhY2tmaW4va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvYmxhY2tmaW4va2VybmVsL3Byb2Nlc3MuYwppbmRleCA2YTgwYTllLi44ZGQwNDE2IDEwMDY0NAotLS0gYS9hcmNoL2JsYWNrZmluL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9ibGFja2Zpbi9rZXJuZWwvcHJvY2Vzcy5jCkBAIC04OCwxMCArODgsMTIgQEAKICNlbmRpZgogCQlpZiAoIWlkbGUpCiAJCQlpZGxlID0gZGVmYXVsdF9pZGxlOwotCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKDEpOworCQl0aWNrX25vaHpfaWRsZV9lbnRlcigpOworCQlyY3VfaWRsZV9lbnRlcigpOwogCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKQogCQkJaWRsZSgpOwotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCXJjdV9pZGxlX2V4aXQoKTsKKwkJdGlja19ub2h6X2lkbGVfZXhpdCgpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC90aW1lLmMgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3RpbWUuYwppbmRleCBiYjk3OGVkLi42NzczZmM4IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL3RpbWUuYwpAQCAtNDcsMTQgKzQ3LDEyIEBACiAJLnJhdGluZyA9IDMwMCwKIAkucmVhZCAgID0gcmVhZF9jb250X3JvdGltZSwKIAkubWFzayAgID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCi0JLnNoaWZ0ICA9IDEwLAogCS5mbGFncyAgPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGV0cmF4X2luaXRfY29udF9yb3RpbWUodm9pZCkKIHsKLQljb250X3JvdGltZS5tdWx0ID0gY2xvY2tzb3VyY2Vfa2h6Mm11bHQoMTAwMDAwLCBjb250X3JvdGltZS5zaGlmdCk7Ci0JY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNvbnRfcm90aW1lKTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9raHooJmNvbnRfcm90aW1lLCAxMDAwMDApOwogCXJldHVybiAwOwogfQogYXJjaF9pbml0Y2FsbChldHJheF9pbml0X2NvbnRfcm90aW1lKTsKZGlmZiAtLWdpdCBhL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL2FyY2gvY3Jpcy9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCAxYTRhNjE5Li5lMjY5MjY0IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9jcmlzL2luY2x1ZGUvYXNtL3NvY2tldC5oCkBAIC02NCw2ICs2NCw5IEBACiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAjZW5kaWYgLyogX0FTTV9TT0NLRVRfSCAqLwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvZnJ2L2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggYTZiMjY4OC4uY2U4MGZkYSAxMDA2NDQKLS0tIGEvYXJjaC9mcnYvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9mcnYvaW5jbHVkZS9hc20vc29ja2V0LmgKQEAgLTYyLDUgKzYyLDggQEAKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICA0MAogCisjZGVmaW5lIFNPX1dJRklfU1RBVFVTCQk0MQorI2RlZmluZSBTQ01fV0lGSV9TVEFUVVMJCVNPX1dJRklfU1RBVFVTCisKICNlbmRpZiAvKiBfQVNNX1NPQ0tFVF9IICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL2g4MzAwL2luY2x1ZGUvYXNtL3NvY2tldC5oCmluZGV4IDA0YzBmNDUuLmNmMWRhYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvaDgzMDAvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9oODMwMC9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNjIsNCArNjIsNyBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9LY29uZmlnIGIvYXJjaC9pYTY0L0tjb25maWcKaW5kZXggMjc0ODliNi4uM2I3YTdjNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L0tjb25maWcKKysrIGIvYXJjaC9pYTY0L0tjb25maWcKQEAgLTIzLDYgKzIzLDkgQEAKIAlzZWxlY3QgSEFWRV9BUkNIX1RSQUNFSE9PSwogCXNlbGVjdCBIQVZFX0RNQV9BUElfREVCVUcKIAlzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTCisJc2VsZWN0IEhBVkVfTUVNQkxPQ0sKKwlzZWxlY3QgSEFWRV9NRU1CTE9DS19OT0RFX01BUAorCXNlbGVjdCBBUkNIX0RJU0NBUkRfTUVNQkxPQ0sKIAlzZWxlY3QgR0VORVJJQ19JUlFfUFJPQkUKIAlzZWxlY3QgR0VORVJJQ19QRU5ESU5HX0lSUSBpZiBTTVAKIAlzZWxlY3QgSVJRX1BFUl9DUFUKQEAgLTQ3NCw5ICs0NzcsNiBAQAogCSAgTUFYX05VTU5PREVTIHdpbGwgYmUgMl4oVGhpcyB2YWx1ZSkuCiAJICBJZiBpbiBkb3VidCwgdXNlIHRoZSBkZWZhdWx0LgogCi1jb25maWcgQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKLQlkZWZfYm9vbCB5Ci0KICMgVklSVFVBTF9NRU1fTUFQIGFuZCBGTEFUX05PREVfTUVNX01BUCBhcmUgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQuCiAjIFZJUlRVQUxfTUVNX01BUCBoYXMgYmVlbiByZXRhaW5lZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLgogY29uZmlnIFZJUlRVQUxfTUVNX01BUApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKaW5kZXggNjA3M2IxOC4uM2RlYWM5NSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgYi9hcmNoL2lhNjQvaW5jbHVkZS9hc20vY3B1dGltZS5oCkBAIC0yNiw1OSArMjYsNTMgQEAKICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCi10eXBlZGVmIHU2NCBjcHV0aW1lX3Q7Ci10eXBlZGVmIHU2NCBjcHV0aW1lNjRfdDsKK3R5cGVkZWYgdTY0IF9fbm9jYXN0IGNwdXRpbWVfdDsKK3R5cGVkZWYgdTY0IF9fbm9jYXN0IGNwdXRpbWU2NF90OwogCi0jZGVmaW5lIGNwdXRpbWVfemVybwkJCSgoY3B1dGltZV90KTApCiAjZGVmaW5lIGNwdXRpbWVfb25lX2ppZmZ5CQlqaWZmaWVzX3RvX2NwdXRpbWUoMSkKLSNkZWZpbmUgY3B1dGltZV9tYXgJCQkoKH4oKGNwdXRpbWVfdCkwKSA+PiAxKSAtIDEpCi0jZGVmaW5lIGNwdXRpbWVfYWRkKF9fYSwgX19iKQkJKChfX2EpICsgIChfX2IpKQotI2RlZmluZSBjcHV0aW1lX3N1YihfX2EsIF9fYikJCSgoX19hKSAtICAoX19iKSkKLSNkZWZpbmUgY3B1dGltZV9kaXYoX19hLCBfX24pCQkoKF9fYSkgLyAgKF9fbikpCi0jZGVmaW5lIGNwdXRpbWVfaGFsdmUoX19hKQkJKChfX2EpID4+IDEpCi0jZGVmaW5lIGNwdXRpbWVfZXEoX19hLCBfX2IpCQkoKF9fYSkgPT0gKF9fYikpCi0jZGVmaW5lIGNwdXRpbWVfZ3QoX19hLCBfX2IpCQkoKF9fYSkgPiAgKF9fYikpCi0jZGVmaW5lIGNwdXRpbWVfZ2UoX19hLCBfX2IpCQkoKF9fYSkgPj0gKF9fYikpCi0jZGVmaW5lIGNwdXRpbWVfbHQoX19hLCBfX2IpCQkoKF9fYSkgPCAgKF9fYikpCi0jZGVmaW5lIGNwdXRpbWVfbGUoX19hLCBfX2IpCQkoKF9fYSkgPD0gKF9fYikpCi0KLSNkZWZpbmUgY3B1dGltZTY0X3plcm8JCQkoKGNwdXRpbWU2NF90KTApCi0jZGVmaW5lIGNwdXRpbWU2NF9hZGQoX19hLCBfX2IpCQkoKF9fYSkgKyAoX19iKSkKLSNkZWZpbmUgY3B1dGltZTY0X3N1YihfX2EsIF9fYikJCSgoX19hKSAtIChfX2IpKQotI2RlZmluZSBjcHV0aW1lX3RvX2NwdXRpbWU2NChfX2N0KQkoX19jdCkKIAogLyoKICAqIENvbnZlcnQgY3B1dGltZSA8LT4gamlmZmllcyAoSFopCiAgKi8KLSNkZWZpbmUgY3B1dGltZV90b19qaWZmaWVzKF9fY3QpCSgoX19jdCkgLyAoTlNFQ19QRVJfU0VDIC8gSFopKQotI2RlZmluZSBqaWZmaWVzX3RvX2NwdXRpbWUoX19qaWYpCSgoX19qaWYpICogKE5TRUNfUEVSX1NFQyAvIEhaKSkKLSNkZWZpbmUgY3B1dGltZTY0X3RvX2ppZmZpZXM2NChfX2N0KQkoKF9fY3QpIC8gKE5TRUNfUEVSX1NFQyAvIEhaKSkKLSNkZWZpbmUgamlmZmllczY0X3RvX2NwdXRpbWU2NChfX2ppZikJKChfX2ppZikgKiAoTlNFQ19QRVJfU0VDIC8gSFopKQorI2RlZmluZSBjcHV0aW1lX3RvX2ppZmZpZXMoX19jdCkJXAorCSgoX19mb3JjZSB1NjQpKF9fY3QpIC8gKE5TRUNfUEVSX1NFQyAvIEhaKSkKKyNkZWZpbmUgamlmZmllc190b19jcHV0aW1lKF9famlmKQlcCisJKF9fZm9yY2UgY3B1dGltZV90KSgoX19qaWYpICogKE5TRUNfUEVSX1NFQyAvIEhaKSkKKyNkZWZpbmUgY3B1dGltZTY0X3RvX2ppZmZpZXM2NChfX2N0KQlcCisJKChfX2ZvcmNlIHU2NCkoX19jdCkgLyAoTlNFQ19QRVJfU0VDIC8gSFopKQorI2RlZmluZSBqaWZmaWVzNjRfdG9fY3B1dGltZTY0KF9famlmKQlcCisJKF9fZm9yY2UgY3B1dGltZTY0X3QpKChfX2ppZikgKiAoTlNFQ19QRVJfU0VDIC8gSFopKQogCiAvKgogICogQ29udmVydCBjcHV0aW1lIDwtPiBtaWNyb3NlY29uZHMKICAqLwotI2RlZmluZSBjcHV0aW1lX3RvX3VzZWNzKF9fY3QpCQkoKF9fY3QpIC8gTlNFQ19QRVJfVVNFQykKLSNkZWZpbmUgdXNlY3NfdG9fY3B1dGltZShfX3VzZWNzKQkoKF9fdXNlY3MpICogTlNFQ19QRVJfVVNFQykKKyNkZWZpbmUgY3B1dGltZV90b191c2VjcyhfX2N0KQkJXAorCSgoX19mb3JjZSB1NjQpKF9fY3QpIC8gTlNFQ19QRVJfVVNFQykKKyNkZWZpbmUgdXNlY3NfdG9fY3B1dGltZShfX3VzZWNzKQlcCisJKF9fZm9yY2UgY3B1dGltZV90KSgoX191c2VjcykgKiBOU0VDX1BFUl9VU0VDKQorI2RlZmluZSB1c2Vjc190b19jcHV0aW1lNjQoX191c2VjcykJXAorCShfX2ZvcmNlIGNwdXRpbWU2NF90KSgoX191c2VjcykgKiBOU0VDX1BFUl9VU0VDKQogCiAvKgogICogQ29udmVydCBjcHV0aW1lIDwtPiBzZWNvbmRzCiAgKi8KLSNkZWZpbmUgY3B1dGltZV90b19zZWNzKF9fY3QpCQkoKF9fY3QpIC8gTlNFQ19QRVJfU0VDKQotI2RlZmluZSBzZWNzX3RvX2NwdXRpbWUoX19zZWNzKQkJKChfX3NlY3MpICogTlNFQ19QRVJfU0VDKQorI2RlZmluZSBjcHV0aW1lX3RvX3NlY3MoX19jdCkJCVwKKwkoKF9fZm9yY2UgdTY0KShfX2N0KSAvIE5TRUNfUEVSX1NFQykKKyNkZWZpbmUgc2Vjc190b19jcHV0aW1lKF9fc2VjcykJCVwKKwkoX19mb3JjZSBjcHV0aW1lX3QpKChfX3NlY3MpICogTlNFQ19QRVJfU0VDKQogCiAvKgogICogQ29udmVydCBjcHV0aW1lIDwtPiB0aW1lc3BlYyAobnNlYykKICAqLwogc3RhdGljIGlubGluZSBjcHV0aW1lX3QgdGltZXNwZWNfdG9fY3B1dGltZShjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnZhbCkKIHsKLQljcHV0aW1lX3QgcmV0ID0gdmFsLT50dl9zZWMgKiBOU0VDX1BFUl9TRUM7Ci0JcmV0dXJuIChyZXQgKyB2YWwtPnR2X25zZWMpOworCXU2NCByZXQgPSB2YWwtPnR2X3NlYyAqIE5TRUNfUEVSX1NFQyArIHZhbC0+dHZfbnNlYzsKKwlyZXR1cm4gKF9fZm9yY2UgY3B1dGltZV90KSByZXQ7CiB9CiBzdGF0aWMgaW5saW5lIHZvaWQgY3B1dGltZV90b190aW1lc3BlYyhjb25zdCBjcHV0aW1lX3QgY3QsIHN0cnVjdCB0aW1lc3BlYyAqdmFsKQogewotCXZhbC0+dHZfc2VjICA9IGN0IC8gTlNFQ19QRVJfU0VDOwotCXZhbC0+dHZfbnNlYyA9IGN0ICUgTlNFQ19QRVJfU0VDOworCXZhbC0+dHZfc2VjICA9IChfX2ZvcmNlIHU2NCkgY3QgLyBOU0VDX1BFUl9TRUM7CisJdmFsLT50dl9uc2VjID0gKF9fZm9yY2UgdTY0KSBjdCAlIE5TRUNfUEVSX1NFQzsKIH0KIAogLyoKQEAgLTg2LDI1ICs4MCwyOCBAQAogICovCiBzdGF0aWMgaW5saW5lIGNwdXRpbWVfdCB0aW1ldmFsX3RvX2NwdXRpbWUoc3RydWN0IHRpbWV2YWwgKnZhbCkKIHsKLQljcHV0aW1lX3QgcmV0ID0gdmFsLT50dl9zZWMgKiBOU0VDX1BFUl9TRUM7Ci0JcmV0dXJuIChyZXQgKyB2YWwtPnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDKTsKKwl1NjQgcmV0ID0gdmFsLT50dl9zZWMgKiBOU0VDX1BFUl9TRUMgKyB2YWwtPnR2X3VzZWMgKiBOU0VDX1BFUl9VU0VDOworCXJldHVybiAoX19mb3JjZSBjcHV0aW1lX3QpIHJldDsKIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHV0aW1lX3RvX3RpbWV2YWwoY29uc3QgY3B1dGltZV90IGN0LCBzdHJ1Y3QgdGltZXZhbCAqdmFsKQogewotCXZhbC0+dHZfc2VjID0gY3QgLyBOU0VDX1BFUl9TRUM7Ci0JdmFsLT50dl91c2VjID0gKGN0ICUgTlNFQ19QRVJfU0VDKSAvIE5TRUNfUEVSX1VTRUM7CisJdmFsLT50dl9zZWMgPSAoX19mb3JjZSB1NjQpIGN0IC8gTlNFQ19QRVJfU0VDOworCXZhbC0+dHZfdXNlYyA9ICgoX19mb3JjZSB1NjQpIGN0ICUgTlNFQ19QRVJfU0VDKSAvIE5TRUNfUEVSX1VTRUM7CiB9CiAKIC8qCiAgKiBDb252ZXJ0IGNwdXRpbWUgPC0+IGNsb2NrIChVU0VSX0haKQogICovCi0jZGVmaW5lIGNwdXRpbWVfdG9fY2xvY2tfdChfX2N0KQkoKF9fY3QpIC8gKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKQotI2RlZmluZSBjbG9ja190X3RvX2NwdXRpbWUoX194KQkJKChfX3gpICogKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKQorI2RlZmluZSBjcHV0aW1lX3RvX2Nsb2NrX3QoX19jdCkJXAorCSgoX19mb3JjZSB1NjQpKF9fY3QpIC8gKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKQorI2RlZmluZSBjbG9ja190X3RvX2NwdXRpbWUoX194KQkJXAorCShfX2ZvcmNlIGNwdXRpbWVfdCkoKF9feCkgKiAoTlNFQ19QRVJfU0VDIC8gVVNFUl9IWikpCiAKIC8qCiAgKiBDb252ZXJ0IGNwdXRpbWU2NCB0byBjbG9jay4KICAqLwotI2RlZmluZSBjcHV0aW1lNjRfdG9fY2xvY2tfdChfX2N0KSAgICAgIGNwdXRpbWVfdG9fY2xvY2tfdCgoY3B1dGltZV90KV9fY3QpCisjZGVmaW5lIGNwdXRpbWU2NF90b19jbG9ja190KF9fY3QpCVwKKwljcHV0aW1lX3RvX2Nsb2NrX3QoKF9fZm9yY2UgY3B1dGltZV90KV9fY3QpCiAKICNlbmRpZiAvKiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORyAqLwogI2VuZGlmIC8qIF9fSUE2NF9DUFVUSU1FX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL2FyY2gvaWE2NC9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCA1MTQyN2VhLi40YjAzNjY0IDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9pYTY0L2luY2x1ZGUvYXNtL3NvY2tldC5oCkBAIC03MSw0ICs3MSw3IEBACiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAjZW5kaWYgLyogX0FTTV9JQTY0X1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvbW0vY29udGlnLmMgYi9hcmNoL2lhNjQvbW0vY29udGlnLmMKaW5kZXggZjExNGEzYi4uMTUxNmQxZCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L21tL2NvbnRpZy5jCisrKyBiL2FyY2gvaWE2NC9tbS9jb250aWcuYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9ubWkuaD4KICNpbmNsdWRlIDxsaW51eC9zd2FwLmg+CkBAIC0zNDgsNyArMzQ5LDcgQEAKIAkJcHJpbnRrKCJWaXJ0dWFsIG1lbV9tYXAgc3RhcnRzIGF0IDB4JXBcbiIsIG1lbV9tYXApOwogCX0KICNlbHNlIC8qICFDT05GSUdfVklSVFVBTF9NRU1fTUFQICovCi0JYWRkX2FjdGl2ZV9yYW5nZSgwLCAwLCBtYXhfbG93X3Bmbik7CisJbWVtYmxvY2tfYWRkX25vZGUoMCwgUEZOX1BIWVMobWF4X2xvd19wZm4pLCAwKTsKIAlmcmVlX2FyZWFfaW5pdF9ub2RlcyhtYXhfem9uZV9wZm5zKTsKICNlbmRpZiAvKiAhQ09ORklHX1ZJUlRVQUxfTUVNX01BUCAqLwogCXplcm9fcGFnZV9tZW1tYXBfcHRyID0gdmlydF90b19wYWdlKGlhNjRfaW12YShlbXB0eV96ZXJvX3BhZ2UpKTsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9tbS9pbml0LmMgYi9hcmNoL2lhNjQvbW0vaW5pdC5jCmluZGV4IDAwY2IwZTIuLjEzZGYyMzlkIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvbW0vaW5pdC5jCisrKyBiL2FyY2gvaWE2NC9tbS9pbml0LmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CiAjaW5jbHVkZSA8bGludXgvZWxmLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtNTU3LDggKzU1OCw3IEBACiAjZW5kaWYKIAogCWlmIChzdGFydCA8IGVuZCkKLQkJYWRkX2FjdGl2ZV9yYW5nZShuaWQsIF9fcGEoc3RhcnQpID4+IFBBR0VfU0hJRlQsCi0JCQlfX3BhKGVuZCkgPj4gUEFHRV9TSElGVCk7CisJCW1lbWJsb2NrX2FkZF9ub2RlKF9fcGEoc3RhcnQpLCBlbmQgLSBzdGFydCwgbmlkKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3NvY2tldC5oCmluZGV4IDQ2OTc4N2MzLi5lOGI4YzViIDEwMDY0NAotLS0gYS9hcmNoL20zMnIvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9tMzJyL2luY2x1ZGUvYXNtL3NvY2tldC5oCkBAIC02Miw0ICs2Miw3IEBACiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAjZW5kaWYgLyogX0FTTV9NMzJSX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvS2NvbmZpZyBiL2FyY2gvbTY4ay9LY29uZmlnCmluZGV4IDM2MWQ1NDAuLjgxZmRhYTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnCisrKyBiL2FyY2gvbTY4ay9LY29uZmlnCkBAIC0zLDcgKzMsNiBAQAogCWRlZmF1bHQgeQogCXNlbGVjdCBIQVZFX0lERQogCXNlbGVjdCBIQVZFX0FPVVQgaWYgTU1VCi0Jc2VsZWN0IEdFTkVSSUNfQVRPTUlDNjQgaWYgTU1VCiAJc2VsZWN0IEhBVkVfR0VORVJJQ19IQVJESVJRUwogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCiAJc2VsZWN0IEFSQ0hfSEFWRV9OTUlfU0FGRV9DTVBYQ0hHIGlmIFJNV19JTlNOUwpAQCAtNDEsMTIgKzQwLDE1IEBACiBjb25maWcgR0VORVJJQ19JT01BUAogCWRlZl9ib29sIE1NVQogCitjb25maWcgR0VORVJJQ19DU1VNCisJYm9vbAorCiBjb25maWcgVElNRV9MT1dfUkVTCiAJYm9vbAogCWRlZmF1bHQgeQogCiBjb25maWcgQVJDSF9VU0VTX0dFVFRJTUVPRkZTRVQKLQlkZWZfYm9vbCBNTVUKKwlkZWZfYm9vbCBNTVUgJiYgIUNPTERGSVJFCiAKIGNvbmZpZyBOT19JT1BPUlQKIAlkZWZfYm9vbCB5CkBAIC02MSw2ICs2MywxMiBAQAogY29uZmlnIENQVV9IQVNfTk9fQklURklFTERTCiAJYm9vbAogCitjb25maWcgQ1BVX0hBU19OT19NVUxESVY2NAorCWJvb2wKKworY29uZmlnIENQVV9IQVNfQUREUkVTU19TUEFDRVMKKwlib29sCisKIGNvbmZpZyBIWgogCWludAogCWRlZmF1bHQgMTAwMCBpZiBDTEVPUEFUUkEKQEAgLTgwLDkgKzg4LDEyIEBACiBjb25maWcgTU1VX01PVE9ST0xBCiAJYm9vbAogCitjb25maWcgTU1VX0NPTERGSVJFCisJYm9vbAorCiBjb25maWcgTU1VX1NVTjMKIAlib29sCi0JZGVwZW5kcyBvbiBNTVUgJiYgIU1NVV9NT1RPUk9MQQorCWRlcGVuZHMgb24gTU1VICYmICFNTVVfTU9UT1JPTEEgJiYgIU1NVV9DT0xERklSRQogCiBtZW51ICJQbGF0Zm9ybSBzZXR1cCIKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcuY3B1IGIvYXJjaC9tNjhrL0tjb25maWcuY3B1CmluZGV4IGU2MzJiMmQuLjhhOWM3NjcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9LY29uZmlnLmNwdQorKysgYi9hcmNoL202OGsvS2NvbmZpZy5jcHUKQEAgLTEsOCArMSw0MiBAQAogY29tbWVudCAiUHJvY2Vzc29yIFR5cGUiCiAKK2Nob2ljZQorCXByb21wdCAiQ1BVIGZhbWlseSBzdXBwb3J0IgorCWRlZmF1bHQgTTY4S0NMQVNTSUMgaWYgTU1VCisJZGVmYXVsdCBDT0xERklSRSBpZiAhTU1VCisJaGVscAorCSAgVGhlIEZyZWVzY2FsZSAod2FzIE1vdG9yb2xhKSBNNjhLIGZhbWlseSBvZiBwcm9jZXNzb3JzIGltcGxlbWVudHMKKwkgIHRoZSBmdWxsIDY4MDAwIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBzZXQuCisJICBUaGUgRnJlZXNjYWxlIENvbGRGaXJlIGZhbWlseSBvZiBwcm9jZXNzb3JzIGlzIGEgbW9kZXJuIGRlcml2aXRpdmUKKwkgIG9mIHRoZSA2ODAwMCBwcm9jZXNzb3IgZmFtaWx5LiBUaGV5IGFyZSBtYWlubHkgdGFyZ2V0ZWQgYXQgZW1iZWRkZWQKKwkgIGFwcGxpY2F0aW9ucywgYW5kIGFyZSBhbGwgU3lzdGVtLU9uLUNoaXAgKFNPQykgZGV2aWNlcywgYXMgb3Bwb3NlZAorCSAgdG8gc3RhbmQgYWxvbmUgQ1BVcy4gVGhleSBpbXBsZW1lbnQgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIDY4MDAwCisJICBwcm9jZXNzb3IgaW5zdHJ1Y3Rpb24gc2V0LgorCSAgSWYgeW91IGFudGljaXBhdGUgcnVubmluZyB0aGlzIGtlcm5lbCBvbiBhIGNvbXB1dGVyIHdpdGggYSBjbGFzc2ljCisJICBNQzY4eHh4IHByb2Nlc3Nvciwgc2VsZWN0IE02OEtDTEFTU0lDLgorCSAgSWYgeW91IGFudGljaXBhdGUgcnVubmluZyB0aGlzIGtlcm5lbCBvbiBhIGNvbXB1dGVyIHdpdGggYSBDb2xkRmlyZQorCSAgcHJvY2Vzc29yLCBzZWxlY3QgQ09MREZJUkUuCisKK2NvbmZpZyBNNjhLQ0xBU1NJQworCWJvb2wgIkNsYXNzaWMgTTY4SyBDUFUgZmFtaWx5IHN1cHBvcnQiCisKK2NvbmZpZyBDT0xERklSRQorCWJvb2wgIkNvbGRmaXJlIENQVSBmYW1pbHkgc3VwcG9ydCIKKwlzZWxlY3QgR0VORVJJQ19HUElPCisJc2VsZWN0IEFSQ0hfUkVRVUlSRV9HUElPTElCCisJc2VsZWN0IENQVV9IQVNfTk9fQklURklFTERTCisJc2VsZWN0IENQVV9IQVNfTk9fTVVMRElWNjQKKwlzZWxlY3QgR0VORVJJQ19DU1VNCisKK2VuZGNob2ljZQorCitpZiBNNjhLQ0xBU1NJQworCiBjb25maWcgTTY4MDAwCiAJYm9vbAogCXNlbGVjdCBDUFVfSEFTX05PX0JJVEZJRUxEUworCXNlbGVjdCBDUFVfSEFTX05PX01VTERJVjY0CisJc2VsZWN0IEdFTkVSSUNfQ1NVTQogCWhlbHAKIAkgIFRoZSBGcmVlc2NhbGUgKHdhcyBNb3Rvcm9sYSkgNjgwMDAgQ1BVIGlzIHRoZSBmaXJzdCBnZW5lcmF0aW9uIG9mCiAJICB0aGUgd2VsbCBrbm93biBNNjhLIGZhbWlseSBvZiBwcm9jZXNzb3JzLiBUaGUgQ1BVIGNvcmUgYXMgd2VsbCBhcwpAQCAtMTgsMjEgKzUyLDExIEBACiAJICBiYXNlZCBvbiB0aGUgNjgwMjAgcHJvY2Vzc29yLiBGb3IgdGhlIG1vc3QgcGFydCBpdCBpcyB1c2VkIGluCiAJICBTeXN0ZW0tT24tQ2hpcCBwYXJ0cywgYW5kIGRvZXMgbm90IGNvbnRhaW4gYSBwYWdpbmcgTU1VLgogCi1jb25maWcgQ09MREZJUkUKLQlib29sCi0Jc2VsZWN0IEdFTkVSSUNfR1BJTwotCXNlbGVjdCBBUkNIX1JFUVVJUkVfR1BJT0xJQgotCXNlbGVjdCBDUFVfSEFTX05PX0JJVEZJRUxEUwotCWhlbHAKLQkgIFRoZSBGcmVlc2NhbGUgQ29sZEZpcmUgZmFtaWx5IG9mIHByb2Nlc3NvcnMgaXMgYSBtb2Rlcm4gZGVyaXZpdGl2ZQotCSAgb2YgdGhlIDY4MDAwIHByb2Nlc3NvciBmYW1pbHkuIFRoZXkgYXJlIG1haW5seSB0YXJnZXRlZCBhdCBlbWJlZGRlZAotCSAgYXBwbGljYXRpb25zLCBhbmQgYXJlIGFsbCBTeXN0ZW0tT24tQ2hpcCAoU09DKSBkZXZpY2VzLCBhcyBvcHBvc2VkCi0JICB0byBzdGFuZCBhbG9uZSBDUFVzLiBUaGV5IGltcGxlbWVudCBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgNjgwMDAKLQkgIHByb2Nlc3NvciBpbnN0cnVjdGlvbiBzZXQuCi0KIGNvbmZpZyBNNjgwMjAKIAlib29sICI2ODAyMCBzdXBwb3J0IgogCWRlcGVuZHMgb24gTU1VCisJc2VsZWN0IEdFTkVSSUNfQVRPTUlDNjQKKwlzZWxlY3QgQ1BVX0hBU19BRERSRVNTX1NQQUNFUwogCWhlbHAKIAkgIElmIHlvdSBhbnRpY2lwYXRlIHJ1bm5pbmcgdGhpcyBrZXJuZWwgb24gYSBjb21wdXRlciB3aXRoIGEgTUM2ODAyMAogCSAgcHJvY2Vzc29yLCBzYXkgWS4gT3RoZXJ3aXNlLCBzYXkgTi4gTm90ZSB0aGF0IHRoZSA2ODAyMCByZXF1aXJlcyBhCkBAIC00Miw2ICs2Niw4IEBACiBjb25maWcgTTY4MDMwCiAJYm9vbCAiNjgwMzAgc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1NVSAmJiAhTU1VX1NVTjMKKwlzZWxlY3QgR0VORVJJQ19BVE9NSUM2NAorCXNlbGVjdCBDUFVfSEFTX0FERFJFU1NfU1BBQ0VTCiAJaGVscAogCSAgSWYgeW91IGFudGljaXBhdGUgcnVubmluZyB0aGlzIGtlcm5lbCBvbiBhIGNvbXB1dGVyIHdpdGggYSBNQzY4MDMwCiAJICBwcm9jZXNzb3IsIHNheSBZLiBPdGhlcndpc2UsIHNheSBOLiBOb3RlIHRoYXQgYSBNQzY4RUMwMzAgd2lsbCBub3QKQEAgLTUwLDYgKzc2LDggQEAKIGNvbmZpZyBNNjgwNDAKIAlib29sICI2ODA0MCBzdXBwb3J0IgogCWRlcGVuZHMgb24gTU1VICYmICFNTVVfU1VOMworCXNlbGVjdCBHRU5FUklDX0FUT01JQzY0CisJc2VsZWN0IENQVV9IQVNfQUREUkVTU19TUEFDRVMKIAloZWxwCiAJICBJZiB5b3UgYW50aWNpcGF0ZSBydW5uaW5nIHRoaXMga2VybmVsIG9uIGEgY29tcHV0ZXIgd2l0aCBhIE1DNjhMQzA0MAogCSAgb3IgTUM2ODA0MCBwcm9jZXNzb3IsIHNheSBZLiBPdGhlcndpc2UsIHNheSBOLiBOb3RlIHRoYXQgYW4KQEAgLTU5LDYgKzg3LDggQEAKIGNvbmZpZyBNNjgwNjAKIAlib29sICI2ODA2MCBzdXBwb3J0IgogCWRlcGVuZHMgb24gTU1VICYmICFNTVVfU1VOMworCXNlbGVjdCBHRU5FUklDX0FUT01JQzY0CisJc2VsZWN0IENQVV9IQVNfQUREUkVTU19TUEFDRVMKIAloZWxwCiAJICBJZiB5b3UgYW50aWNpcGF0ZSBydW5uaW5nIHRoaXMga2VybmVsIG9uIGEgY29tcHV0ZXIgd2l0aCBhIE1DNjgwNjAKIAkgIHByb2Nlc3Nvciwgc2F5IFkuIE90aGVyd2lzZSwgc2F5IE4uCkBAIC05MSwxMCArMTIxLDEzIEBACiAJaGVscAogCSAgTW90b3JvbGEgNjgzNjAgcHJvY2Vzc29yIHN1cHBvcnQuCiAKK2VuZGlmICMgTTY4S0NMQVNTSUMKKworaWYgQ09MREZJUkUKKwogY29uZmlnIE01MjA2CiAJYm9vbCAiTUNGNTIwNiIKIAlkZXBlbmRzIG9uICFNTVUKLQlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgQ09MREZJUkVfU1dfQTcKIAlzZWxlY3QgSEFWRV9NQkFSCiAJaGVscApAQCAtMTAzLDcgKzEzNiw2IEBACiBjb25maWcgTTUyMDZlCiAJYm9vbCAiTUNGNTIwNmUiCiAJZGVwZW5kcyBvbiAhTU1VCi0Jc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IENPTERGSVJFX1NXX0E3CiAJc2VsZWN0IEhBVkVfTUJBUgogCWhlbHAKQEAgLTExMiw3ICsxNDQsNiBAQAogY29uZmlnIE01MjB4CiAJYm9vbCAiTUNGNTIweCIKIAlkZXBlbmRzIG9uICFNTVUKLQlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgR0VORVJJQ19DTE9DS0VWRU5UUwogCXNlbGVjdCBIQVZFX0NBQ0hFX1NQTElUCiAJaGVscApAQCAtMTIxLDcgKzE1Miw2IEBACiBjb25maWcgTTUyM3gKIAlib29sICJNQ0Y1MjN4IgogCWRlcGVuZHMgb24gIU1NVQotCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAlzZWxlY3QgSEFWRV9JUFNCQVIKQEAgLTEzMSw3ICsxNjEsNiBAQAogY29uZmlnIE01MjQ5CiAJYm9vbCAiTUNGNTI0OSIKIAlkZXBlbmRzIG9uICFNTVUKLQlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgQ09MREZJUkVfU1dfQTcKIAlzZWxlY3QgSEFWRV9NQkFSCiAJaGVscApAQCAtMTQzLDcgKzE3Miw2IEBACiBjb25maWcgTTUyNzEKIAlib29sICJNQ0Y1MjcxIgogCWRlcGVuZHMgb24gIU1NVQotCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBNNTI3eAogCXNlbGVjdCBIQVZFX0NBQ0hFX1NQTElUCiAJc2VsZWN0IEhBVkVfSVBTQkFSCkBAIC0xNTQsNyArMTgyLDYgQEAKIGNvbmZpZyBNNTI3MgogCWJvb2wgIk1DRjUyNzIiCiAJZGVwZW5kcyBvbiAhTU1VCi0Jc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IENPTERGSVJFX1NXX0E3CiAJc2VsZWN0IEhBVkVfTUJBUgogCWhlbHAKQEAgLTE2Myw3ICsxOTAsNiBAQAogY29uZmlnIE01Mjc1CiAJYm9vbCAiTUNGNTI3NSIKIAlkZXBlbmRzIG9uICFNTVUKLQlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgTTUyN3gKIAlzZWxlY3QgSEFWRV9DQUNIRV9TUExJVAogCXNlbGVjdCBIQVZFX0lQU0JBUgpAQCAtMTc0LDcgKzIwMCw2IEBACiBjb25maWcgTTUyOHgKIAlib29sICJNQ0Y1Mjh4IgogCWRlcGVuZHMgb24gIU1NVQotCXNlbGVjdCBDT0xERklSRQogCXNlbGVjdCBHRU5FUklDX0NMT0NLRVZFTlRTCiAJc2VsZWN0IEhBVkVfQ0FDSEVfU1BMSVQKIAlzZWxlY3QgSEFWRV9JUFNCQVIKQEAgLTE4NCw3ICsyMDksNiBAQAogY29uZmlnIE01MzA3CiAJYm9vbCAiTUNGNTMwNyIKIAlkZXBlbmRzIG9uICFNTVUKLQlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgQ09MREZJUkVfU1dfQTcKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCXNlbGVjdCBIQVZFX01CQVIKQEAgLTE5NCw3ICsyMTgsNiBAQAogY29uZmlnIE01MzJ4CiAJYm9vbCAiTUNGNTMyeCIKIAlkZXBlbmRzIG9uICFNTVUKLQlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCWhlbHAKIAkgIEZyZWVzY2FsZSAoTW90b3JvbGEpIENvbGRGaXJlIDUzMnggcHJvY2Vzc29yIHN1cHBvcnQuCkBAIC0yMDIsNyArMjI1LDYgQEAKIGNvbmZpZyBNNTQwNwogCWJvb2wgIk1DRjU0MDciCiAJZGVwZW5kcyBvbiAhTU1VCi0Jc2VsZWN0IENPTERGSVJFCiAJc2VsZWN0IENPTERGSVJFX1NXX0E3CiAJc2VsZWN0IEhBVkVfQ0FDSEVfQ0IKIAlzZWxlY3QgSEFWRV9NQkFSCkBAIC0yMTQsOSArMjM2LDggQEAKIAogY29uZmlnIE01NDd4CiAJYm9vbCAiTUNGNTQ3eCIKLQlkZXBlbmRzIG9uICFNTVUKLQlzZWxlY3QgQ09MREZJUkUKIAlzZWxlY3QgTTU0eHgKKwlzZWxlY3QgTU1VX0NPTERGSVJFIGlmIE1NVQogCXNlbGVjdCBIQVZFX0NBQ0hFX0NCCiAJc2VsZWN0IEhBVkVfTUJBUgogCWhlbHAKQEAgLTIyNCwxNCArMjQ1LDE1IEBACiAKIGNvbmZpZyBNNTQ4eAogCWJvb2wgIk1DRjU0OHgiCi0JZGVwZW5kcyBvbiAhTU1VCi0Jc2VsZWN0IENPTERGSVJFCisJc2VsZWN0IE1NVV9DT0xERklSRSBpZiBNTVUKIAlzZWxlY3QgTTU0eHgKIAlzZWxlY3QgSEFWRV9DQUNIRV9DQgogCXNlbGVjdCBIQVZFX01CQVIKIAloZWxwCiAJICBGcmVlc2NhbGUgQ29sZEZpcmUgNTQ4MC81NDgxLzU0ODIvNTQ4My81NDg0LzU0ODUgcHJvY2Vzc29yIHN1cHBvcnQuCiAKK2VuZGlmICMgQ09MREZJUkUKKwogCiBjb21tZW50ICJQcm9jZXNzb3IgU3BlY2lmaWMgT3B0aW9ucyIKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcuZGVidWcgYi9hcmNoL202OGsvS2NvbmZpZy5kZWJ1ZwppbmRleCAyYmRiMWIwLi5hZjRmZDVmIDEwMDY0NAotLS0gYS9hcmNoL202OGsvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL202OGsvS2NvbmZpZy5kZWJ1ZwpAQCAtMiw2ICsyLDE0IEBACiAKIHNvdXJjZSAibGliL0tjb25maWcuZGVidWciCiAKK2NvbmZpZyBCT09UUEFSQU0KKwlib29sICdDb21waWxlZC1pbiBLZXJuZWwgQm9vdCBQYXJhbWV0ZXInCisKK2NvbmZpZyBCT09UUEFSQU1fU1RSSU5HCisJc3RyaW5nICdLZXJuZWwgQm9vdCBQYXJhbWV0ZXInCisJZGVmYXVsdCAnY29uc29sZT10dHlTMCwxOTIwMCcKKwlkZXBlbmRzIG9uIEJPT1RQQVJBTQorCiBpZiAhTU1VCiAKIGNvbmZpZyBGVUxMREVCVUcKQEAgLTE1LDE0ICsyMyw2IEBACiAJaGVscAogCSAgVXNlIGEgZmFzdCBzZWNvbmRhcnkgY2xvY2sgdG8gcHJvZHVjZSBwcm9maWxpbmcgaW5mb3JtYXRpb24uCiAKLWNvbmZpZyBCT09UUEFSQU0KLQlib29sICdDb21waWxlZC1pbiBLZXJuZWwgQm9vdCBQYXJhbWV0ZXInCi0KLWNvbmZpZyBCT09UUEFSQU1fU1RSSU5HCi0Jc3RyaW5nICdLZXJuZWwgQm9vdCBQYXJhbWV0ZXInCi0JZGVmYXVsdCAnY29uc29sZT10dHlTMCwxOTIwMCcKLQlkZXBlbmRzIG9uIEJPT1RQQVJBTQotCiBjb25maWcgTk9fS0VSTkVMX01TRwogCWJvb2wgIlN1cHByZXNzIEtlcm5lbCBCVUcgTWVzc2FnZXMiCiAJaGVscApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL0tjb25maWcubWFjaGluZSBiL2FyY2gvbTY4ay9LY29uZmlnLm1hY2hpbmUKaW5kZXggZWY0YTI2YS4uN2NkZjZiMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL0tjb25maWcubWFjaGluZQorKysgYi9hcmNoL202OGsvS2NvbmZpZy5tYWNoaW5lCkBAIC0xLDUgKzEsNyBAQAogY29tbWVudCAiTWFjaGluZSBUeXBlcyIKIAoraWYgTTY4S0NMQVNTSUMKKwogY29uZmlnIEFNSUdBCiAJYm9vbCAiQW1pZ2Egc3VwcG9ydCIKIAlkZXBlbmRzIG9uIE1NVQpAQCAtMTMwLDYgKzEzMiw4IEBACiAKIAkgIElmIHlvdSBkb24ndCB3YW50IHRvIGNvbXBpbGUgYSBrZXJuZWwgZXhjbHVzaXZlbHkgZm9yIGEgU3VuIDMsIHNheSBOLgogCitlbmRpZiAjIE02OEtDTEFTU0lDCisKIGNvbmZpZyBQSUxPVAogCWJvb2wKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2FuY2hvci5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2FuY2hvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzFjMGQ1Li4wMDAwMDAwCi0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hbmNob3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqCWFuY2hvci5oIC0tIEFuY2hvciBDTy1NRU0gTGl0ZSBQQ0kgaG9zdCBicmlkZ2UgcGFydC4KLSAqCi0gKgkoQykgQ29weXJpZ2h0IDIwMDAsIE1vcmV0b24gQmF5ICh3d3cubW9yZXRvbi5jb20uYXUpCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmCWFuY2hvcl9oCi0jZGVmaW5lCWFuY2hvcl9oCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqCURlZmluZSBiYXNpYyBhZGRyZXNzaW5nIGluZm8uCi0gKi8KLSNpZiBkZWZpbmVkKENPTkZJR19NNTQwN0MzKQotI2RlZmluZQlDT01FTV9CQVNFCTB4RkZGRjAwMDAJLyogQmFzZSBvZiBDTy1NRU0gYWRkcmVzcyBzcGFjZSAqLwotI2RlZmluZQlDT01FTV9JUlEJMjUJCS8qIElSUSBvZiBhbmNob3IgcGFydCAqLwotI2Vsc2UKLSNkZWZpbmUJQ09NRU1fQkFTRQkweDgwMDAwMDAwCS8qIEJhc2Ugb2YgQ08tTUVNIGFkZHJlc3Mgc3BhY2UgKi8KLSNkZWZpbmUJQ09NRU1fSVJRCTI1CQkvKiBJUlEgb2YgYW5jaG9yIHBhcnQgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqCTQtYnl0ZSByZWdpc3RlcnMgb2YgQ08tTUVNLCBzbyBhZGp1c3QgcmVnaXN0ZXIgYWRkcmVzc2VzIGZvcgotICoJZWFzeSBhY2Nlc3MuIEhhbmR5IG1hY3JvIGZvciB3b3JkIGFjY2VzcyB0b28uCi0gKi8KLSNkZWZpbmUJTFJFRyhhKQkJKChhKSA+PiAyKQotI2RlZmluZQlXUkVHKGEpCQkoKGEpID4+IDEpCi0KLQotLyoKLSAqCURlZmluZSBiYXNlIGFkZHJlc3NlcyB3aXRoaW4gQ08tTUVNIExpdGUgcmVnaXN0ZXIgYWRkcmVzcyBzcGFjZS4KLSAqLwotI2RlZmluZQlDT01FTV9JMk8JMHgwMDAwCQkvKiBJMk8gcmVnaXN0ZXJzICovCi0jZGVmaW5lCUNPTUVNX09QUkVHUwkweDA0MDAJCS8qIE9wZXJhdGlvbiByZWdpc3RlcnMgKi8KLSNkZWZpbmUJQ09NRU1fUENJQlVTCTB4MjAwMAkJLyogRGlyZWN0IGFjY2VzcyB0byBQQ0kgYnVzICovCi0jZGVmaW5lCUNPTUVNX1NITUVNCTB4NDAwMAkJLyogU2hhcmVkIG1lbW9yeSByZWdpb24gKi8KLQotI2RlZmluZQlDT01FTV9TSE1FTVNJWkUJMHg0MDAwCQkvKiBTaXplIG9mIHNoYXJlZCBtZW1vcnkgKi8KLQotCi0vKgotICoJRGVmaW5lIENPLU1FTSBSZWdpc3RlcnMuCi0gKi8KLSNkZWZpbmUJQ09NRU1fSTJPSElTUgkweDAwMzAJCS8qIEkyTyBob3N0IGludGVycnVwdCBzdGF0dXMgKi8KLSNkZWZpbmUJQ09NRU1fSTJPSElNUgkweDAwMzQJCS8qIEkyTyBob3N0IGludGVycnVwdCBtYXNrICovCi0jZGVmaW5lCUNPTUVNX0kyT0xJU1IJMHgwMDM4CQkvKiBJMk8gbG9jYWwgaW50ZXJydXB0IHN0YXR1cyAqLwotI2RlZmluZQlDT01FTV9JMk9MSU1SCTB4MDAzYwkJLyogSTJPIGxvY2FsIGludGVycnVwdCBtYXNrICovCi0jZGVmaW5lCUNPTUVNX0lCRlBGSUZPCTB4MDA0MAkJLyogSTJPIGluYm91bmQgZnJlZS9wb3N0IEZJRk8gKi8KLSNkZWZpbmUJQ09NRU1fT0JQRkZJRk8JMHgwMDQ0CQkvKiBJMk8gb3V0Ym91bmQgcG9zdC9mcmVlIEZJRk8gKi8KLSNkZWZpbmUJQ09NRU1fSUJQRkZJRk8JMHgwMDQ4CQkvKiBJMk8gaW5ib3VuZCBwb3N0L2ZyZWUgRklGTyAqLwotI2RlZmluZQlDT01FTV9PQkZQRklGTwkweDAwNGMJCS8qIEkyTyBvdXRib3VuZCBmcmVlL3Bvc3QgRklGTyAqLwotCi0jZGVmaW5lCUNPTUVNX0RBSEJBU0UJMHgwNDYwCQkvKiBEaXJlY3QgYWNjZXNzIGJhc2UgYWRkcmVzcyAqLwotCi0jZGVmaW5lCUNPTUVNX05WQ01ECTB4MDRhMAkJLyogSTJDIHNlcmlhbCBjb21tYW5kICovCi0jZGVmaW5lCUNPTUVNX05WUkVBRAkweDA0YTQJCS8qIEkyQyBzZXJpYWwgcmVhZCAqLwotI2RlZmluZQlDT01FTV9OVlNUQVQJMHgwNGE4CQkvKiBJMkMgc3RhdHVzICovCi0KLSNkZWZpbmUJQ09NRU1fRE1BTEJBU0UJMHgwNGIwCQkvKiBETUEgbG9jYWwgYmFzZSBhZGRyZXNzICovCi0jZGVmaW5lCUNPTUVNX0RNQUhCQVNFCTB4MDRiNAkJLyogRE1BIGhvc3QgYmFzZSBhZGRyZXNzICovCi0jZGVmaW5lCUNPTUVNX0RNQVNJWkUJMHgwNGI4CQkvKiBETUEgc2l6ZSAqLwotI2RlZmluZQlDT01FTV9ETUFDVEwJMHgwNGJjCQkvKiBETUEgY29udHJvbCAqLwotCi0jZGVmaW5lCUNPTUVNX0hDVEwJMHgwNGUwCQkvKiBIb3N0IGNvbnRyb2wgKi8KLSNkZWZpbmUJQ09NRU1fSElOVAkweDA0ZTQJCS8qIEhvc3QgaW50ZXJydXB0IGNvbnRyb2wvc3RhdHVzICovCi0jZGVmaW5lCUNPTUVNX0hMREFUQQkweDA0ZTgJCS8qIEhvc3QgdG8gbG9jYWwgZGF0YSBtYWlsYm94ICovCi0jZGVmaW5lCUNPTUVNX0xJTlQJMHgwNGY0CQkvKiBMb2NhbCBpbnRlcnJ1cHQgY29udG9sZSBzdGF0dXMgKi8KLSNkZWZpbmUJQ09NRU1fTEhEQVRBCTB4MDRmOAkJLyogTG9jYWwgdG8gaG9zdCBkYXRhIG1haWxib3ggKi8KLQotI2RlZmluZQlDT01FTV9MQlVTQ0ZHCTB4MDRmYwkJLyogTG9jYWwgYnVzIGNvbmZpZ3VyYXRpb24gKi8KLQotCi0vKgotICoJQ29tbWFuZHMgYW5kIGZsYWdzIGZvciB1c2Ugd2l0aCBEaXJlY3QgQWNjZXNzIFJlZ2lzdGVyLgotICovCi0jZGVmaW5lCUNPTUVNX0RBX0lBQ0sJMHgwMDAwMDAwMAkvKiBJbnRlcnJ1cHQgYWNrbm93bGVkZ2UgKHJlYWQpICovCi0jZGVmaW5lCUNPTUVNX0RBX1NQQ0wJMHgwMDAwMDAxMAkvKiBTcGVjaWFsIGN5Y2xlICh3cml0ZSkgKi8KLSNkZWZpbmUJQ09NRU1fREFfTUVNUkQJMHgwMDAwMDAwNAkvKiBNZW1vcnkgcmVhZCBjeWNsZSAqLwotI2RlZmluZQlDT01FTV9EQV9NRU1XUgkweDAwMDAwMDA0CS8qIE1lbW9yeSB3cml0ZSBjeWNsZSAqLwotI2RlZmluZQlDT01FTV9EQV9JT1JECTB4MDAwMDAwMDIJLyogSS9PIHJlYWQgY3ljbGUgKi8KLSNkZWZpbmUJQ09NRU1fREFfSU9XUgkweDAwMDAwMDAyCS8qIEkvTyB3cml0ZSBjeWNsZSAqLwotI2RlZmluZQlDT01FTV9EQV9DRkdSRAkweDAwMDAwMDA2CS8qIENvbmZpZ3VyYXRpb24gcmVhZCBjeWNsZSAqLwotI2RlZmluZQlDT01FTV9EQV9DRkdXUgkweDAwMDAwMDA2CS8qIENvbmZpZ3VyYXRpb24gd3JpdGUgY3ljbGUgKi8KLQotI2RlZmluZQlDT01FTV9EQV9BRERSKGEpCSgoYSkgJiAweGZmZmZlMDAwKQotCi0jZGVmaW5lCUNPTUVNX0RBX09GRlNFVChhKQkoKGEpICYgMHgwMDAwMWZmZikKLQotCi0vKgotICoJVGhlIFBDSSBidXMgd2lsbCBiZSBsaW1pdGVkIGluIHdoYXQgc2xvdHMgd2lsbCBhY3R1YWxseSBiZSB1c2VkLgotICoJRGVmaW5lIHZhbGlkIGRldmljZSBudW1iZXJzIGZvciBkaWZmZXJlbnQgYm9hcmRzLgotICovCi0jaWYgZGVmaW5lZChDT05GSUdfTTU0MDdDMykKLSNkZWZpbmUJQ09NRU1fTUlOREVWCTE0CQkvKiBNaW5pbXVtIHZhbGlkIERFVklDRSAqLwotI2RlZmluZQlDT01FTV9NQVhERVYJMTQJCS8qIE1heGltdW0gdmFsaWQgREVWSUNFICovCi0jZGVmaW5lCUNPTUVNX0JSSURHRURFVgkxNQkJLyogU2xvdCBicmlkZ2UgaXMgaW4gKi8KLSNlbHNlCi0jZGVmaW5lCUNPTUVNX01JTkRFVgkwCQkvKiBNaW5pbXVtIHZhbGlkIERFVklDRSAqLwotI2RlZmluZQlDT01FTV9NQVhERVYJMwkJLyogTWF4aW11bSB2YWxpZCBERVZJQ0UgKi8KLSNlbmRpZgotCi0jZGVmaW5lCUNPTUVNX01BWFBDSQkoQ09NRU1fTUFYREVWKzEpCS8qIE1heGltdW0gUENJIGRldmljZXMgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNlbmRpZgkvKiBhbmNob3JfaCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0b21pYy5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2F0b21pYy5oCmluZGV4IDY1YzZiZTYuLjRlYmE3OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9hdG9taWMuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vYXRvbWljLmgKQEAgLTU1LDYgKzU1LDE2IEBACiAJcmV0dXJuIGMgIT0gMDsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2RlY19hbmRfdGVzdF9sdChhdG9taWNfdCAqdikKK3sKKwljaGFyIGM7CisJX19hc21fXyBfX3ZvbGF0aWxlX18oCisJCSJzdWJxbCAjMSwlMTsgc2x0ICUwIgorCQk6ICI9ZCIgKGMpLCAiPW0iICgqdikKKwkJOiAibSIgKCp2KSk7CisJcmV0dXJuIGMgIT0gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgYXRvbWljX2luY19hbmRfdGVzdChhdG9taWNfdCAqdikKIHsKIAljaGFyIGM7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vY2FjaGVmbHVzaF9tbS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2NhY2hlZmx1c2hfbW0uaAppbmRleCA3M2RlN2M4Li44MTA0YmQ4IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vY2FjaGVmbHVzaF9tbS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9jYWNoZWZsdXNoX21tLmgKQEAgLTIsMjMgKzIsODkgQEAKICNkZWZpbmUgX002OEtfQ0FDSEVGTFVTSF9ICiAKICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2lmZGVmIENPTkZJR19DT0xERklSRQorI2luY2x1ZGUgPGFzbS9tY2ZzaW0uaD4KKyNlbmRpZgogCiAvKiBjYWNoZSBjb2RlICovCiAjZGVmaW5lIEZMVVNIX0lfQU5EX0QJKDB4MDAwMDA4MDgpCiAjZGVmaW5lIEZMVVNIX0kJCSgweDAwMDAwMDA4KQogCisjaWZuZGVmIElDQUNIRV9NQVhfQUREUgorI2RlZmluZSBJQ0FDSEVfTUFYX0FERFIJMAorI2RlZmluZSBJQ0FDSEVfU0VUX01BU0sJMAorI2RlZmluZSBEQ0FDSEVfTUFYX0FERFIJMAorI2RlZmluZSBEQ0FDSEVfU0VUTUFTSwkwCisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX2NmX2ljYWNoZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3sKKwl1bnNpZ25lZCBsb25nIHNldDsKKworCWZvciAoc2V0ID0gc3RhcnQ7IHNldCA8PSBlbmQ7IHNldCArPSAoMHgxMCAtIDMpKSB7CisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKwkJCSJjcHVzaGwgJSVpYywoJTApXG5cdCIKKwkJCSJhZGRxJS5sICMxLCUwXG5cdCIKKwkJCSJjcHVzaGwgJSVpYywoJTApXG5cdCIKKwkJCSJhZGRxJS5sICMxLCUwXG5cdCIKKwkJCSJjcHVzaGwgJSVpYywoJTApXG5cdCIKKwkJCSJhZGRxJS5sICMxLCUwXG5cdCIKKwkJCSJjcHVzaGwgJSVpYywoJTApIgorCQkJOiAiPWEiIChzZXQpCisJCQk6ICJhIiAoc2V0KSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfY2ZfZGNhY2hlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQoreworCXVuc2lnbmVkIGxvbmcgc2V0OworCisJZm9yIChzZXQgPSBzdGFydDsgc2V0IDw9IGVuZDsgc2V0ICs9ICgweDEwIC0gMykpIHsKKwkJX19hc21fXyBfX3ZvbGF0aWxlX18gKAorCQkJImNwdXNobCAlJWRjLCglMClcblx0IgorCQkJImFkZHElLmwgIzEsJTBcblx0IgorCQkJImNwdXNobCAlJWRjLCglMClcblx0IgorCQkJImFkZHElLmwgIzEsJTBcblx0IgorCQkJImNwdXNobCAlJWRjLCglMClcblx0IgorCQkJImFkZHElLmwgIzEsJTBcblx0IgorCQkJImNwdXNobCAlJWRjLCglMCkiCisJCQk6ICI9YSIgKHNldCkKKwkJCTogImEiIChzZXQpKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9jZl9iY2FjaGUodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBzZXQ7CisKKwlmb3IgKHNldCA9IHN0YXJ0OyBzZXQgPD0gZW5kOyBzZXQgKz0gKDB4MTAgLSAzKSkgeworCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoCisJCQkiY3B1c2hsICUlYmMsKCUwKVxuXHQiCisJCQkiYWRkcSUubCAjMSwlMFxuXHQiCisJCQkiY3B1c2hsICUlYmMsKCUwKVxuXHQiCisJCQkiYWRkcSUubCAjMSwlMFxuXHQiCisJCQkiY3B1c2hsICUlYmMsKCUwKVxuXHQiCisJCQkiYWRkcSUubCAjMSwlMFxuXHQiCisJCQkiY3B1c2hsICUlYmMsKCUwKSIKKwkJCTogIj1hIiAoc2V0KQorCQkJOiAiYSIgKHNldCkpOworCX0KK30KKwogLyoKICAqIENhY2hlIGhhbmRsaW5nIGZ1bmN0aW9ucwogICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9pY2FjaGUodm9pZCkKIHsKLQlpZiAoQ1BVX0lTXzA0MF9PUl8wNjApCisJaWYgKENQVV9JU19DT0xERklSRSkgeworCQlmbHVzaF9jZl9pY2FjaGUoMCwgSUNBQ0hFX01BWF9BRERSKTsKKwl9IGVsc2UgaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7CiAJCWFzbSB2b2xhdGlsZSAoCSJub3BcbiIKIAkJCSIJLmNoaXAJNjgwNDBcbiIKIAkJCSIJY3B1c2hhCSViY1xuIgogCQkJIgkuY2hpcAk2OGsiKTsKLQllbHNlIHsKKwl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nIHRtcDsKIAkJYXNtIHZvbGF0aWxlICgJIm1vdmVjCSUlY2FjciwlMFxuIgogCQkJIglvci53CSUxLCUwXG4iCkBAIC01MSwxMiArMTE3LDE0IEBACiAgICBwcm9jZXNzIGNoYW5nZXMuICAqLwogI2RlZmluZSBfX2ZsdXNoX2NhY2hlX2FsbCgpCQkJCQlcCiAoewkJCQkJCQkJXAotCWlmIChDUFVfSVNfMDQwX09SXzA2MCkJCQkJCVwKKwlpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CQkJCQlcCisJCWZsdXNoX2NmX2RjYWNoZSgwLCBEQ0FDSEVfTUFYX0FERFIpOwkJXAorCX0gZWxzZSBpZiAoQ1BVX0lTXzA0MF9PUl8wNjApIHsJCQkJXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibm9wXG5cdCIJCQlcCiAJCQkJICAgICAiLmNoaXAgNjgwNDBcblx0IgkJXAogCQkJCSAgICAgImNwdXNoYSAlZGNcblx0IgkJXAogCQkJCSAgICAgIi5jaGlwIDY4ayIpOwkJXAotCWVsc2UgewkJCQkJCQlcCisJfSBlbHNlIHsJCQkJCQlcCiAJCXVuc2lnbmVkIGxvbmcgX3RtcDsJCQkJXAogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygibW92ZWMgJSVjYWNyLCUwXG5cdCIJXAogCQkJCSAgICAgIm9ydyAlMSwlMFxuXHQiCQlcCkBAIC0xMTIsNyArMTgwLDE3IEBACiAvKiBSWjogdXNlIGNwdXNoICViYyBpbnN0ZWFkIG9mIGNwdXNoICVkYywgY2ludiAlaWMgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCBfX2ZsdXNoX3BhZ2VfdG9fcmFtKHZvaWQgKnZhZGRyKQogewotCWlmIChDUFVfSVNfMDQwX09SXzA2MCkgeworCWlmIChDUFVfSVNfQ09MREZJUkUpIHsKKwkJdW5zaWduZWQgbG9uZyBhZGRyLCBzdGFydCwgZW5kOworCQlhZGRyID0gKCh1bnNpZ25lZCBsb25nKSB2YWRkcikgJiB+KFBBR0VfU0laRSAtIDEpOworCQlzdGFydCA9IGFkZHIgJiBJQ0FDSEVfU0VUX01BU0s7CisJCWVuZCA9IChhZGRyICsgUEFHRV9TSVpFIC0gMSkgJiBJQ0FDSEVfU0VUX01BU0s7CisJCWlmIChzdGFydCA+IGVuZCkgeworCQkJZmx1c2hfY2ZfYmNhY2hlKDAsIGVuZCk7CisJCQllbmQgPSBJQ0FDSEVfTUFYX0FERFI7CisJCX0KKwkJZmx1c2hfY2ZfYmNhY2hlKHN0YXJ0LCBlbmQpOworCX0gZWxzZSBpZiAoQ1BVX0lTXzA0MF9PUl8wNjApIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oIm5vcFxuXHQiCiAJCQkJICAgICAiLmNoaXAgNjgwNDBcblx0IgogCQkJCSAgICAgImNwdXNocCAlJWJjLCglMClcblx0IgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2NoZWNrc3VtLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vY2hlY2tzdW0uaAppbmRleCBlYzUxNDQ4Li4yZjg4ZDg2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vY2hlY2tzdW0uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vY2hlY2tzdW0uaApAQCAtMyw2ICszLDEwIEBACiAKICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KIAorI2lmZGVmIENPTkZJR19HRU5FUklDX0NTVU0KKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9jaGVja3N1bS5oPgorI2Vsc2UKKwogLyoKICAqIGNvbXB1dGVzIHRoZSBjaGVja3N1bSBvZiBhIG1lbW9yeSBibG9jayBhdCBidWZmLCBsZW5ndGggbGVuLAogICogYW5kIGFkZHMgaW4gInN1bSIgKDMyLWJpdCkKQEAgLTM0LDMwICszOCw2IEBACiAJCQkJCSAgICAgIHZvaWQgKmRzdCwgaW50IGxlbiwKIAkJCQkJICAgICAgX193c3VtIHN1bSk7CiAKLQotI2lmZGVmIENPTkZJR19DT0xERklSRQotCi0vKgotICoJVGhlIENvbGRGaXJlIGNvcmVzIGRvbid0IHN1cHBvcnQgYWxsIHRoZSA2OGsgaW5zdHJ1Y3Rpb25zIHVzZWQKLSAqCWluIHRoZSBvcHRpbWl6ZWQgY2hlY2tzdW0gY29kZSBiZWxvdy4gU28gaXQgcmV2ZXJ0cyBiYWNrIHRvIHVzaW5nCi0gKgltb3JlIHN0YW5kYXJkIEMgY29kZWQgY2hlY2tzdW1zLiBUaGUgZmFzdCBjaGVja3N1bSBjb2RlIGlzCi0gKglzaWduaWZpY2FudGx5IGxhcmdlciB0aGFuIHRoZSBvcHRpbWl6ZWQgdmVyc2lvbiwgc28gaXQgaXMgbm90Ci0gKglpbmxpbmVkIGhlcmUuCi0gKi8KLV9fc3VtMTYgaXBfZmFzdF9jc3VtKGNvbnN0IHZvaWQgKmlwaCwgdW5zaWduZWQgaW50IGlobCk7Ci0KLXN0YXRpYyBpbmxpbmUgX19zdW0xNiBjc3VtX2ZvbGQoX193c3VtIHN1bSkKLXsKLQl1bnNpZ25lZCBpbnQgdG1wID0gKF9fZm9yY2UgdTMyKXN1bTsKLQotCXRtcCA9ICh0bXAgJiAweGZmZmYpICsgKHRtcCA+PiAxNik7Ci0JdG1wID0gKHRtcCAmIDB4ZmZmZikgKyAodG1wID4+IDE2KTsKLQotCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX50bXA7Ci19Ci0KLSNlbHNlCi0KIC8qCiAgKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9mYXN0X2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCiAgKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgpAQCAtOTcsOCArNzcsNiBAQAogCXJldHVybiAoX19mb3JjZSBfX3N1bTE2KX5zdW07CiB9CiAKLSNlbmRpZiAvKiBDT05GSUdfQ09MREZJUkUgKi8KLQogc3RhdGljIGlubGluZSBfX3dzdW0KIGNzdW1fdGNwdWRwX25vZm9sZChfX2JlMzIgc2FkZHIsIF9fYmUzMiBkYWRkciwgdW5zaWduZWQgc2hvcnQgbGVuLAogCQkgIHVuc2lnbmVkIHNob3J0IHByb3RvLCBfX3dzdW0gc3VtKQpAQCAtMTY3LDQgKzE0NSw1IEBACiAJcmV0dXJuIGNzdW1fZm9sZChzdW0pOwogfQogCisjZW5kaWYgLyogQ09ORklHX0dFTkVSSUNfQ1NVTSAqLwogI2VuZGlmIC8qIF9NNjhLX0NIRUNLU1VNX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9kaXY2NC5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2RpdjY0LmgKaW5kZXggZWRiNjYxNC4uNDQ0ZWE4YSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2RpdjY0LmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2RpdjY0LmgKQEAgLTEsNyArMSw5IEBACiAjaWZuZGVmIF9NNjhLX0RJVjY0X0gKICNkZWZpbmUgX002OEtfRElWNjRfSAogCi0jaWZkZWYgQ09ORklHX01NVQorI2lmZGVmIENPTkZJR19DUFVfSEFTX05PX01VTERJVjY0CisjaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGl2NjQuaD4KKyNlbHNlCiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCkBAIC0yNyw4ICsyOSw2IEBACiAJX19yZW07CQkJCQkJCVwKIH0pCiAKLSNlbHNlCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvZGl2NjQuaD4KLSNlbmRpZiAvKiBDT05GSUdfTU1VICovCisjZW5kaWYgLyogQ09ORklHX0NQVV9IQVNfTk9fTVVMRElWNjQgKi8KIAogI2VuZGlmIC8qIF9NNjhLX0RJVjY0X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9lbGYuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9lbGYuaAppbmRleCAwMWMxOTNkLi5lOWI3Y2RhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vZWxmLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2VsZi5oCkBAIC01OSwxMCArNTksMTAgQEAKICAgIGlzIGFjdHVhbGx5IHVzZWQgb24gQVNWLiAgKi8KICNkZWZpbmUgRUxGX1BMQVRfSU5JVChfciwgbG9hZF9hZGRyKQlfci0+YTEgPSAwCiAKLSNpZm5kZWYgQ09ORklHX1NVTjMKLSNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUJNDA5NgotI2Vsc2UKKyNpZiBkZWZpbmVkKENPTkZJR19TVU4zKSB8fCBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKICNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUJODE5MgorI2Vsc2UKKyNkZWZpbmUgRUxGX0VYRUNfUEFHRVNJWkUJNDA5NgogI2VuZGlmCiAKIC8qIFRoaXMgaXMgdGhlIGxvY2F0aW9uIHRoYXQgYW4gRVRfRFlOIHByb2dyYW0gaXMgbG9hZGVkIGlmIGV4ZWMnZWQuICBUeXBpY2FsCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vZW50cnkuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9lbnRyeS5oCmluZGV4IGMzYzVhODYuLjYyMjEzOGQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9lbnRyeS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9lbnRyeS5oCkBAIC0yMjIsMTYgKzIyMiwyNCBAQAogICogTm9uLU1NVSBzeXN0ZW1zIGRvIG5vdCByZXNlcnZlICVhMiBpbiB0aGlzIHdheSwgYW5kIHRoaXMgZGVmaW5pdGlvbiBpcwogICogbm90IHVzZWQgZm9yIHRoZW0uCiAgKi8KKyNpZmRlZiBDT05GSUdfTU1VCisKICNkZWZpbmUgY3VycHRyIGEyCiAKICNkZWZpbmUgR0VUX0NVUlJFTlQodG1wKSBnZXRfY3VycmVudCB0bXAKIC5tYWNybyBnZXRfY3VycmVudCByZWc9JWQwCiAJbW92ZWwJJXNwLFxyZWcKLQlhbmR3CSMtVEhSRUFEX1NJWkUsXHJlZworCWFuZGwJIy1USFJFQURfU0laRSxccmVnCiAJbW92ZWwJXHJlZywlY3VycHRyCiAJbW92ZWwJJWN1cnB0ckAsJWN1cnB0cgogLmVuZG0KIAorI2Vsc2UKKworI2RlZmluZSBHRVRfQ1VSUkVOVCh0bXApCisKKyNlbmRpZiAvKiBDT05GSUdfTU1VICovCisKICNlbHNlIC8qIEMgc291cmNlICovCiAKICNkZWZpbmUgU1RSKFgpIFNUUjEoWCkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9mcHUuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9mcHUuaAppbmRleCBmZmI2YjhjLi41MjZkYjlkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vZnB1LmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2ZwdS5oCkBAIC0xMiw2ICsxMiw4IEBACiAjZGVmaW5lIEZQU1RBVEVTSVpFICg5NikKICNlbGlmIGRlZmluZWQoQ09ORklHX002OEtGUFVfRU1VKQogI2RlZmluZSBGUFNUQVRFU0laRSAoMjgpCisjZWxpZiBkZWZpbmVkKENPTkZJR19DT0xERklSRSkgJiYgZGVmaW5lZChDT05GSUdfTU1VKQorI2RlZmluZSBGUFNUQVRFU0laRSAoMTYpCiAjZWxpZiBkZWZpbmVkKENPTkZJR19NNjgwNjApCiAjZGVmaW5lIEZQU1RBVEVTSVpFICgxMikKICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vZ3Bpby5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2dwaW8uaAppbmRleCBiMjA0NjgzLi4wMGQwMDcxIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vZ3Bpby5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9ncGlvLmgKQEAgLTIyNSw3ICsyMjUsOCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBncGlvX3RvX2lycSh1bnNpZ25lZCBncGlvKQogewotCXJldHVybiAoZ3BpbyA8IE1DRkdQSU9fSVJRX01BWCkgPyBncGlvICsgTUNGR1BJT19JUlFfVkVDQkFTRSA6IC1FSU5WQUw7CisJcmV0dXJuIChncGlvIDwgTUNGR1BJT19JUlFfTUFYKSA/IGdwaW8gKyBNQ0ZHUElPX0lSUV9WRUNCQVNFCisJCTogX19ncGlvX3RvX2lycShncGlvKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXJxX3RvX2dwaW8odW5zaWduZWQgaXJxKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2lycS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL2lycS5oCmluZGV4IDYxOThkZjUuLjBlODlmYTAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9pcnEuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vaXJxLmgKQEAgLTI1LDcgKzI1LDggQEAKICNkZWZpbmUgTlJfSVJRUwkwCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19NTVUKKyNpZiBkZWZpbmVkKENPTkZJR19NNjgwMjApIHx8IGRlZmluZWQoQ09ORklHX002ODAzMCkgfHwgXAorICAgIGRlZmluZWQoQ09ORklHX002ODA0MCkgfHwgZGVmaW5lZChDT05GSUdfTTY4MDYwKQogCiAvKgogICogSW50ZXJydXB0IHNvdXJjZSBkZWZpbml0aW9ucwpAQCAtODAsNyArODEsNyBAQAogCiAjZWxzZQogI2RlZmluZSBpcnFfY2Fub25pY2FsaXplKGlycSkgIChpcnEpCi0jZW5kaWYgLyogQ09ORklHX01NVSAqLworI2VuZGlmIC8qICEoQ09ORklHX002ODAyMCB8fCBDT05GSUdfTTY4MDMwIHx8IENPTkZJR19NNjgwNDAgfHwgQ09ORklHX002ODA2MCkgKi8KIAogYXNtbGlua2FnZSB2b2lkIGRvX0lSUShpbnQgaXJxLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CiBleHRlcm4gYXRvbWljX3QgaXJxX2Vycl9jb3VudDsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tNTR4eGFjci5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4YWNyLmgKaW5kZXggMTZhMTgzNS4uNDc5MDZhYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4YWNyLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL201NHh4YWNyLmgKQEAgLTM5LDggKzM5LDEyIEBACiAjZGVmaW5lIEFDUl9DTV9PRkZfUFJFCTB4MDAwMDAwNDAJLyogTm8gY2FjaGUsIHByZWNpc2UgKi8KICNkZWZpbmUgQUNSX0NNX09GRl9JTVAJMHgwMDAwMDA2MAkvKiBObyBjYWNoZSwgaW1wcmVjaXNlICovCiAjZGVmaW5lIEFDUl9DTQkJMHgwMDAwMDA2MAkvKiBDYWNoZSBtb2RlIG1hc2sgKi8KKyNkZWZpbmUgQUNSX1NQCQkweDAwMDAwMDA4CS8qIFN1cGVydmlzb3IgcHJvdGVjdCAqLwogI2RlZmluZSBBQ1JfV1BST1RFQ1QJMHgwMDAwMDAwNAkvKiBXcml0ZSBwcm90ZWN0ICovCiAKKyNkZWZpbmUgQUNSX0JBKHgpCSgoeCkgJiAweGZmMDAwMDAwKQorI2RlZmluZSBBQ1JfQURNU0soeCkJKCgoKHgpIC0gMSkgJiAweGZmMDAwMDAwKSA+PiA4KQorCiAjaWYgZGVmaW5lZChDT05GSUdfTTU0MDcpCiAKICNkZWZpbmUgSUNBQ0hFX1NJWkUgMHg0MDAwCS8qIGluc3RydWN0aW9uIC0gMTZrICovCkBAIC01Niw2ICs2MCwxMSBAQAogI2RlZmluZSBDQUNIRV9MSU5FX1NJWkUgMHgwMDEwCS8qIDE2IGJ5dGVzICovCiAjZGVmaW5lIENBQ0hFX1dBWVMgNAkJLyogNCB3YXlzICovCiAKKyNkZWZpbmUgSUNBQ0hFX1NFVF9NQVNLCSgoSUNBQ0hFX1NJWkUgLyA2NCAtIDEpIDw8IENBQ0hFX1dBWVMpCisjZGVmaW5lIERDQUNIRV9TRVRfTUFTSwkoKERDQUNIRV9TSVpFIC8gNjQgLSAxKSA8PCBDQUNIRV9XQVlTKQorI2RlZmluZSBJQ0FDSEVfTUFYX0FERFIJSUNBQ0hFX1NFVF9NQVNLCisjZGVmaW5lIERDQUNIRV9NQVhfQUREUglEQ0FDSEVfU0VUX01BU0sKKwogLyoKICAqCVZlcnNpb24gNCBjb3JlcyBoYXZlIGEgdHJ1ZSBoYXJ2YXJkIHN0eWxlIHNlcGFyYXRlIGluc3RydWN0aW9uCiAgKglhbmQgZGF0YSBjYWNoZS4gRW5hYmxlIGRhdGEgYW5kIGluc3RydWN0aW9uIGNhY2hlcywgYWxzbyBlbmFibGUgd3JpdGUKQEAgLTczLDYgKzgyLDI3IEBACiAjZWxzZQogI2RlZmluZSBDQUNIRV9NT0RFIChDQUNSX0RFQytDQUNSX0RFU0IrQ0FDUl9ERENNX1ArQ0FDUl9CRUMrQ0FDUl9JRUMrQ0FDUl9FVVNQKQogI2VuZGlmCisjZGVmaW5lIENBQ0hFX0lOSVQgKENBQ1JfRENJTlZBK0NBQ1JfQkNJTlZBK0NBQ1JfSUNJTlZBKQorCisjaWYgZGVmaW5lZChDT05GSUdfTU1VKQorLyoKKyAqCUlmIHJ1bm5pbmcgd2l0aCB0aGUgTU1VIGVuYWJsZWQgdGhlbiB3ZSBuZWVkIHRvIG1hcCB0aGUgaW50ZXJuYWwKKyAqCXJlZ2lzdGVyIHJlZ2lvbiBhcyBub24tY2FjaGVhYmxlLiBBbmQgdGhlbiB3ZSBtYXAgYWxsIG91ciBSQU0gYXMKKyAqCWNhY2hlYWJsZSBhbmQgc3VwZXJ2aXNvciBhY2Nlc3Mgb25seS4KKyAqLworI2RlZmluZSBBQ1IwX01PREUJKEFDUl9CQShDT05GSUdfTUJBUikrQUNSX0FETVNLKDB4MTAwMDAwMCkrIFwKKwkJCSBBQ1JfRU5BQkxFK0FDUl9TVVBFUitBQ1JfQ01fT0ZGX1BSRStBQ1JfU1ApCisjZGVmaW5lIEFDUjFfTU9ERQkoQUNSX0JBKENPTkZJR19SQU1CQVNFKStBQ1JfQURNU0soQ09ORklHX1JBTVNJWkUpKyBcCisJCQkgQUNSX0VOQUJMRStBQ1JfU1VQRVIrQUNSX1NQKQorI2RlZmluZSBBQ1IyX01PREUJMAorI2RlZmluZSBBQ1IzX01PREUJKEFDUl9CQShDT05GSUdfUkFNQkFTRSkrQUNSX0FETVNLKENPTkZJR19SQU1TSVpFKSsgXAorCQkJIEFDUl9FTkFCTEUrQUNSX1NVUEVSK0FDUl9TUCkKKworI2Vsc2UKKworLyoKKyAqCUZvciB0aGUgbm9uLU1NVSBlbmFibGVkIGNhc2Ugd2UgbWFwIGFsbCBvZiBSQU0gYXMgY2FjaGVhYmxlLgorICovCiAjaWYgZGVmaW5lZChDT05GSUdfQ0FDSEVfQ09QWUJBQ0spCiAjZGVmaW5lIERBVEFfQ0FDSEVfTU9ERSAoQUNSX0VOQUJMRStBQ1JfQU5ZK0FDUl9DTV9DUCkKICNlbHNlCkBAIC04MCw3ICsxMTAsNiBAQAogI2VuZGlmCiAjZGVmaW5lIElOU05fQ0FDSEVfTU9ERSAoQUNSX0VOQUJMRStBQ1JfQU5ZKQogCi0jZGVmaW5lIENBQ0hFX0lOSVQJKENBQ1JfRENJTlZBK0NBQ1JfQkNJTlZBK0NBQ1JfSUNJTlZBKQogI2RlZmluZSBDQUNIRV9JTlZBTElEQVRFICAoQ0FDSEVfTU9ERStDQUNSX0RDSU5WQStDQUNSX0JDSU5WQStDQUNSX0lDSU5WQSkKICNkZWZpbmUgQ0FDSEVfSU5WQUxJREFURUkgKENBQ0hFX01PREUrQ0FDUl9CQ0lOVkErQ0FDUl9JQ0lOVkEpCiAjZGVmaW5lIENBQ0hFX0lOVkFMSURBVEVEIChDQUNIRV9NT0RFK0NBQ1JfRENJTlZBKQpAQCAtOTQsNCArMTIzLDUgQEAKICNkZWZpbmUJQ0FDSEVfUFVTSAogI2VuZGlmCiAKKyNlbmRpZiAvKiBDT05GSUdfTU1VICovCiAjZW5kaWYJLyogbTU0eHhhY3JfaCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21jZl9wZ2FsbG9jLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbWNmX3BnYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTNmM2RkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21jZl9wZ2FsbG9jLmgKQEAgLTAsMCArMSwxMDIgQEAKKyNpZm5kZWYgTTY4S19NQ0ZfUEdBTExPQ19ICisjZGVmaW5lIE02OEtfTUNGX1BHQUxMT0NfSAorCisjaW5jbHVkZSA8YXNtL3RsYi5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCitleHRlcm4gaW5saW5lIHZvaWQgcHRlX2ZyZWVfa2VybmVsKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwdGVfdCAqcHRlKQoreworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgcHRlKTsKK30KKworZXh0ZXJuIGNvbnN0IGNoYXIgYmFkX3BtZF9zdHJpbmdbXTsKKworZXh0ZXJuIGlubGluZSBwdGVfdCAqcHRlX2FsbG9jX29uZV9rZXJuZWwoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXVuc2lnbmVkIGxvbmcgcGFnZSA9IF9fZ2V0X2ZyZWVfcGFnZShHRlBfRE1BfF9fR0ZQX1JFUEVBVCk7CisKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCisJbWVtc2V0KCh2b2lkICopcGFnZSwgMCwgUEFHRV9TSVpFKTsKKwlyZXR1cm4gKHB0ZV90ICopIChwYWdlKTsKK30KKworZXh0ZXJuIGlubGluZSBwbWRfdCAqcG1kX2FsbG9jX2tlcm5lbChwZ2RfdCAqcGdkLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJcmV0dXJuIChwbWRfdCAqKSBwZ2Q7Cit9CisKKyNkZWZpbmUgcG1kX2FsbG9jX29uZV9mYXN0KG1tLCBhZGRyZXNzKSAoeyBCVUcoKTsgKChwbWRfdCAqKTEpOyB9KQorI2RlZmluZSBwbWRfYWxsb2Nfb25lKG1tLCBhZGRyZXNzKSAgICAgICh7IEJVRygpOyAoKHBtZF90ICopMik7IH0pCisKKyNkZWZpbmUgcHRlX2FsbG9jX29uZV9mYXN0KG1tLCBhZGRyKSBwdGVfYWxsb2Nfb25lKG1tLCBhZGRyKQorCisjZGVmaW5lIHBtZF9wb3B1bGF0ZShtbSwgcG1kLCBwYWdlKSAocG1kX3ZhbCgqcG1kKSA9IFwKKwkodW5zaWduZWQgbG9uZykocGFnZV9hZGRyZXNzKHBhZ2UpKSkKKworI2RlZmluZSBwbWRfcG9wdWxhdGVfa2VybmVsKG1tLCBwbWQsIHB0ZSkgKHBtZF92YWwoKnBtZCkgPSAodW5zaWduZWQgbG9uZykocHRlKSkKKworI2RlZmluZSBwbWRfcGd0YWJsZShwbWQpIHBtZF9wYWdlKHBtZCkKKworc3RhdGljIGlubGluZSB2b2lkIF9fcHRlX2ZyZWVfdGxiKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHBndGFibGVfdCBwYWdlLAorCQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCV9fZnJlZV9wYWdlKHBhZ2UpOworfQorCisjZGVmaW5lIF9fcG1kX2ZyZWVfdGxiKHRsYiwgcG1kLCBhZGRyZXNzKSBkbyB7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKnB0ZV9hbGxvY19vbmUoc3RydWN0IG1tX3N0cnVjdCAqbW0sCisJdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXN0cnVjdCBwYWdlICpwYWdlID0gYWxsb2NfcGFnZXMoR0ZQX0RNQXxfX0dGUF9SRVBFQVQsIDApOworCXB0ZV90ICpwdGU7CisKKwlpZiAoIXBhZ2UpCisJCXJldHVybiBOVUxMOworCisJcHRlID0ga21hcChwYWdlKTsKKwlpZiAocHRlKSB7CisJCWNsZWFyX3BhZ2UocHRlKTsKKwkJX19mbHVzaF9wYWdlX3RvX3JhbShwdGUpOworCQlmbHVzaF90bGJfa2VybmVsX3BhZ2UocHRlKTsKKwkJbm9jYWNoZV9wYWdlKHB0ZSk7CisJfQorCWt1bm1hcChwYWdlKTsKKworCXJldHVybiBwYWdlOworfQorCitleHRlcm4gaW5saW5lIHZvaWQgcHRlX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCBwYWdlICpwYWdlKQoreworCV9fZnJlZV9wYWdlKHBhZ2UpOworfQorCisvKgorICogSW4gb3VyIGltcGxlbWVudGF0aW9uLCBlYWNoIHBnZCBlbnRyeSBjb250YWlucyAxIHBtZCB0aGF0IGlzIG5ldmVyIGFsbG9jYXRlZAorICogb3IgZnJlZWQuICBwZ2RfcHJlc2VudCBpcyBhbHdheXMgMSwgc28gdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiAtTkwKKyAqLworI2RlZmluZSBwbWRfZnJlZShtbSwgcG1kKSBCVUcoKQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGdkX2ZyZWUoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHBnZF90ICpwZ2QpCit7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBwZ2QpOworfQorCitzdGF0aWMgaW5saW5lIHBnZF90ICpwZ2RfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJcGdkX3QgKm5ld19wZ2Q7CisKKwluZXdfcGdkID0gKHBnZF90ICopX19nZXRfZnJlZV9wYWdlKEdGUF9ETUEgfCBfX0dGUF9OT1dBUk4pOworCWlmICghbmV3X3BnZCkKKwkJcmV0dXJuIE5VTEw7CisJbWVtY3B5KG5ld19wZ2QsIHN3YXBwZXJfcGdfZGlyLCBQQUdFX1NJWkUpOworCW1lbXNldChuZXdfcGdkLCAwLCBQQUdFX09GRlNFVCA+PiBQR0RJUl9TSElGVCk7CisJcmV0dXJuIG5ld19wZ2Q7Cit9CisKKyNkZWZpbmUgcGdkX3BvcHVsYXRlKG1tLCBwbWQsIHB0ZSkgQlVHKCkKKworI2VuZGlmIC8qIE02OEtfTUNGX1BHQUxMT0NfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21jZl9wZ3RhYmxlLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbWNmX3BndGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTZiZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21jZl9wZ3RhYmxlLmgKQEAgLTAsMCArMSw0MjUgQEAKKyNpZm5kZWYgX01DRl9QR1RBQkxFX0gKKyNkZWZpbmUgX01DRl9QR1RBQkxFX0gKKworI2luY2x1ZGUgPGFzbS9tY2ZtbXUuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisvKgorICogTU1VRFIgYml0cywgaW4gcHJvcGVyIHBsYWNlLiBXZSB3cml0ZSB0aGVzZSBkaXJlY3RseSBpbnRvIHRoZSBNTVVEUgorICogYWZ0ZXIgbWFza2luZyBmcm9tIHRoZSBwdGUuCisgKi8KKyNkZWZpbmUgQ0ZfUEFHRV9MT0NLRUQJCU1NVURSX0xLCS8qIDB4MDAwMDAwMDIgKi8KKyNkZWZpbmUgQ0ZfUEFHRV9FWEVDCQlNTVVEUl9YCQkvKiAweDAwMDAwMDA0ICovCisjZGVmaW5lIENGX1BBR0VfV1JJVEFCTEUJTU1VRFJfVwkJLyogMHgwMDAwMDAwOCAqLworI2RlZmluZSBDRl9QQUdFX1JFQURBQkxFCU1NVURSX1IJCS8qIDB4MDAwMDAwMTAgKi8KKyNkZWZpbmUgQ0ZfUEFHRV9TWVNURU0JCU1NVURSX1NQCS8qIDB4MDAwMDAwMjAgKi8KKyNkZWZpbmUgQ0ZfUEFHRV9DT1BZQkFDSwlNTVVEUl9DTV9DQ0IJLyogMHgwMDAwMDA0MCAqLworI2RlZmluZSBDRl9QQUdFX05PQ0FDSEUJCU1NVURSX0NNX05DUAkvKiAweDAwMDAwMDgwICovCisKKyNkZWZpbmUgQ0ZfQ0FDSEVNQVNLCQkofk1NVURSX0NNX0NDQikKKyNkZWZpbmUgQ0ZfUEFHRV9NTVVEUl9NQVNLCTB4MDAwMDAwZmUKKworI2RlZmluZSBfUEFHRV9OT0NBQ0hFMDMwCUNGX1BBR0VfTk9DQUNIRQorCisvKgorICogTU1VVFIgYml0cywgbmVlZCBzaGlmdGluZyBkb3duLgorICovCisjZGVmaW5lIENGX1BBR0VfTU1VVFJfTUFTSwkweDAwMDAwYzAwCisjZGVmaW5lIENGX1BBR0VfTU1VVFJfU0hJRlQJMTAKKworI2RlZmluZSBDRl9QQUdFX1ZBTElECQkoTU1VVFJfViA8PCBDRl9QQUdFX01NVVRSX1NISUZUKQorI2RlZmluZSBDRl9QQUdFX1NIQVJFRAkJKE1NVVRSX1NHIDw8IENGX1BBR0VfTU1VVFJfU0hJRlQpCisKKy8qCisgKiBGYWtlIGJpdHMsIG5vdCBpbXBsZW1lbnRlZCBpbiBDRiwgd2lsbCBnZXQgbWFza2VkIG91dCBiZWZvcmUKKyAqIGhpdHRpbmcgaGFyZHdhcmUuCisgKi8KKyNkZWZpbmUgQ0ZfUEFHRV9ESVJUWQkJMHgwMDAwMDAwMQorI2RlZmluZSBDRl9QQUdFX0ZJTEUJCTB4MDAwMDAyMDAKKyNkZWZpbmUgQ0ZfUEFHRV9BQ0NFU1NFRAkweDAwMDAxMDAwCisKKyNkZWZpbmUgX1BBR0VfQ0FDSEUwNDAJCTB4MDIwICAgLyogNjgwNDAgY2FjaGUgbW9kZSwgY2FjaGFibGUsIGNvcHliYWNrICovCisjZGVmaW5lIF9QQUdFX05PQ0FDSEVfUwkJMHgwNDAgICAvKiA2ODA0MCBuby1jYWNoZSBtb2RlLCBzZXJpYWxpemVkICovCisjZGVmaW5lIF9QQUdFX05PQ0FDSEUJCTB4MDYwICAgLyogNjgwNDAgY2FjaGUgbW9kZSwgbm9uLXNlcmlhbGl6ZWQgKi8KKyNkZWZpbmUgX1BBR0VfQ0FDSEUwNDBXCQkweDAwMCAgIC8qIDY4MDQwIGNhY2hlIG1vZGUsIGNhY2hhYmxlLCB3cml0ZS10aHJvdWdoICovCisjZGVmaW5lIF9ERVNDVFlQRV9NQVNLCQkweDAwMworI2RlZmluZSBfQ0FDSEVNQVNLMDQwCQkofjB4MDYwKQorI2RlZmluZSBfUEFHRV9HTE9CQUwwNDAJCTB4NDAwICAgLyogNjgwNDAgZ2xvYmFsIGJpdCwgdXNlZCBmb3Iga3ZhIGRlc2NzICovCisKKy8qCisgKiBFeHRlcm5hbGx5IHVzZWQgcGFnZSBwcm90ZWN0aW9uIHZhbHVlcy4KKyAqLworI2RlZmluZSBfUEFHRV9QUkVTRU5UCShDRl9QQUdFX1ZBTElEKQorI2RlZmluZSBfUEFHRV9BQ0NFU1NFRAkoQ0ZfUEFHRV9BQ0NFU1NFRCkKKyNkZWZpbmUgX1BBR0VfRElSVFkJKENGX1BBR0VfRElSVFkpCisjZGVmaW5lIF9QQUdFX1JFQURXUklURSAoQ0ZfUEFHRV9SRUFEQUJMRSBcCisJCQkJfCBDRl9QQUdFX1dSSVRBQkxFIFwKKwkJCQl8IENGX1BBR0VfU1lTVEVNIFwKKwkJCQl8IENGX1BBR0VfU0hBUkVEKQorCisvKgorICogQ29tcG91bmQgcGFnZSBwcm90ZWN0aW9uIHZhbHVlcy4KKyAqLworI2RlZmluZSBQQUdFX05PTkUJX19wZ3Byb3QoQ0ZfUEFHRV9WQUxJRCBcCisJCQkJIHwgQ0ZfUEFHRV9BQ0NFU1NFRCkKKworI2RlZmluZSBQQUdFX1NIQVJFRCAgICAgX19wZ3Byb3QoQ0ZfUEFHRV9WQUxJRCBcCisJCQkJIHwgQ0ZfUEFHRV9BQ0NFU1NFRCBcCisJCQkJIHwgQ0ZfUEFHRV9TSEFSRUQpCisKKyNkZWZpbmUgUEFHRV9JTklUCV9fcGdwcm90KENGX1BBR0VfVkFMSUQgXAorCQkJCSB8IENGX1BBR0VfUkVBREFCTEUgXAorCQkJCSB8IENGX1BBR0VfV1JJVEFCTEUgXAorCQkJCSB8IENGX1BBR0VfRVhFQyBcCisJCQkJIHwgQ0ZfUEFHRV9TWVNURU0pCisKKyNkZWZpbmUgUEFHRV9LRVJORUwJX19wZ3Byb3QoQ0ZfUEFHRV9WQUxJRCBcCisJCQkJIHwgQ0ZfUEFHRV9BQ0NFU1NFRCBcCisJCQkJIHwgQ0ZfUEFHRV9SRUFEQUJMRSBcCisJCQkJIHwgQ0ZfUEFHRV9XUklUQUJMRSBcCisJCQkJIHwgQ0ZfUEFHRV9FWEVDIFwKKwkJCQkgfCBDRl9QQUdFX1NZU1RFTSkKKworI2RlZmluZSBQQUdFX0NPUFkJX19wZ3Byb3QoQ0ZfUEFHRV9WQUxJRCBcCisJCQkJIHwgQ0ZfUEFHRV9BQ0NFU1NFRCBcCisJCQkJIHwgQ0ZfUEFHRV9SRUFEQUJMRSBcCisJCQkJIHwgQ0ZfUEFHRV9ESVJUWSkKKworLyoKKyAqIFBhZ2UgcHJvdGVjdGlvbnMgZm9yIGluaXRpYWxpc2luZyBwcm90ZWN0aW9uX21hcC4gU2VlIG1tL21tYXAuYworICogZm9yIHVzZS4gSW4gZ2VuZXJhbCwgdGhlIGJpdCBwb3NpdGlvbnMgYXJlIHh3ciwgYW5kIFAtaXRlbXMgYXJlCisgKiBwcml2YXRlLCB0aGUgUy1pdGVtcyBhcmUgc2hhcmVkLgorICovCisjZGVmaW5lIF9fUDAwMAkJUEFHRV9OT05FCisjZGVmaW5lIF9fUDAwMQkJX19wZ3Byb3QoQ0ZfUEFHRV9WQUxJRCBcCisJCQkJIHwgQ0ZfUEFHRV9BQ0NFU1NFRCBcCisJCQkJIHwgQ0ZfUEFHRV9SRUFEQUJMRSkKKyNkZWZpbmUgX19QMDEwCQlfX3BncHJvdChDRl9QQUdFX1ZBTElEIFwKKwkJCQkgfCBDRl9QQUdFX0FDQ0VTU0VEIFwKKwkJCQkgfCBDRl9QQUdFX1dSSVRBQkxFKQorI2RlZmluZSBfX1AwMTEJCV9fcGdwcm90KENGX1BBR0VfVkFMSUQgXAorCQkJCSB8IENGX1BBR0VfQUNDRVNTRUQgXAorCQkJCSB8IENGX1BBR0VfUkVBREFCTEUgXAorCQkJCSB8IENGX1BBR0VfV1JJVEFCTEUpCisjZGVmaW5lIF9fUDEwMAkJX19wZ3Byb3QoQ0ZfUEFHRV9WQUxJRCBcCisJCQkJIHwgQ0ZfUEFHRV9BQ0NFU1NFRCBcCisJCQkJIHwgQ0ZfUEFHRV9FWEVDKQorI2RlZmluZSBfX1AxMDEJCV9fcGdwcm90KENGX1BBR0VfVkFMSUQgXAorCQkJCSB8IENGX1BBR0VfQUNDRVNTRUQgXAorCQkJCSB8IENGX1BBR0VfUkVBREFCTEUgXAorCQkJCSB8IENGX1BBR0VfRVhFQykKKyNkZWZpbmUgX19QMTEwCQlfX3BncHJvdChDRl9QQUdFX1ZBTElEIFwKKwkJCQkgfCBDRl9QQUdFX0FDQ0VTU0VEIFwKKwkJCQkgfCBDRl9QQUdFX1dSSVRBQkxFIFwKKwkJCQkgfCBDRl9QQUdFX0VYRUMpCisjZGVmaW5lIF9fUDExMQkJX19wZ3Byb3QoQ0ZfUEFHRV9WQUxJRCBcCisJCQkJIHwgQ0ZfUEFHRV9BQ0NFU1NFRCBcCisJCQkJIHwgQ0ZfUEFHRV9SRUFEQUJMRSBcCisJCQkJIHwgQ0ZfUEFHRV9XUklUQUJMRSBcCisJCQkJIHwgQ0ZfUEFHRV9FWEVDKQorCisjZGVmaW5lIF9fUzAwMAkJUEFHRV9OT05FCisjZGVmaW5lIF9fUzAwMQkJX19wZ3Byb3QoQ0ZfUEFHRV9WQUxJRCBcCisJCQkJIHwgQ0ZfUEFHRV9BQ0NFU1NFRCBcCisJCQkJIHwgQ0ZfUEFHRV9SRUFEQUJMRSkKKyNkZWZpbmUgX19TMDEwCQlQQUdFX1NIQVJFRAorI2RlZmluZSBfX1MwMTEJCV9fcGdwcm90KENGX1BBR0VfVkFMSUQgXAorCQkJCSB8IENGX1BBR0VfQUNDRVNTRUQgXAorCQkJCSB8IENGX1BBR0VfU0hBUkVEIFwKKwkJCQkgfCBDRl9QQUdFX1JFQURBQkxFKQorI2RlZmluZSBfX1MxMDAJCV9fcGdwcm90KENGX1BBR0VfVkFMSUQgXAorCQkJCSB8IENGX1BBR0VfQUNDRVNTRUQgXAorCQkJCSB8IENGX1BBR0VfRVhFQykKKyNkZWZpbmUgX19TMTAxCQlfX3BncHJvdChDRl9QQUdFX1ZBTElEIFwKKwkJCQkgfCBDRl9QQUdFX0FDQ0VTU0VEIFwKKwkJCQkgfCBDRl9QQUdFX1JFQURBQkxFIFwKKwkJCQkgfCBDRl9QQUdFX0VYRUMpCisjZGVmaW5lIF9fUzExMAkJX19wZ3Byb3QoQ0ZfUEFHRV9WQUxJRCBcCisJCQkJIHwgQ0ZfUEFHRV9BQ0NFU1NFRCBcCisJCQkJIHwgQ0ZfUEFHRV9TSEFSRUQgXAorCQkJCSB8IENGX1BBR0VfRVhFQykKKyNkZWZpbmUgX19TMTExCQlfX3BncHJvdChDRl9QQUdFX1ZBTElEIFwKKwkJCQkgfCBDRl9QQUdFX0FDQ0VTU0VEIFwKKwkJCQkgfCBDRl9QQUdFX1NIQVJFRCBcCisJCQkJIHwgQ0ZfUEFHRV9SRUFEQUJMRSBcCisJCQkJIHwgQ0ZfUEFHRV9FWEVDKQorCisjZGVmaW5lIFBURV9NQVNLCVBBR0VfTUFTSworI2RlZmluZSBDRl9QQUdFX0NIR19NQVNLIChQVEVfTUFTSyB8IENGX1BBR0VfQUNDRVNTRUQgfCBDRl9QQUdFX0RJUlRZKQorCisjaWZuZGVmIF9fQVNTRU1CTFlfXworCisvKgorICogQ29udmVyc2lvbiBmdW5jdGlvbnM6IGNvbnZlcnQgYSBwYWdlIGFuZCBwcm90ZWN0aW9uIHRvIGEgcGFnZSBlbnRyeSwKKyAqIGFuZCBhIHBhZ2UgZW50cnkgYW5kIHBhZ2UgZGlyZWN0b3J5IHRvIHRoZSBwYWdlIHRoZXkgcmVmZXIgdG8uCisgKi8KKyNkZWZpbmUgbWtfcHRlKHBhZ2UsIHBncHJvdCkgcGZuX3B0ZShwYWdlX3RvX3BmbihwYWdlKSwgKHBncHJvdCkpCisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21vZGlmeShwdGVfdCBwdGUsIHBncHJvdF90IG5ld3Byb3QpCit7CisJcHRlX3ZhbChwdGUpID0gKHB0ZV92YWwocHRlKSAmIENGX1BBR0VfQ0hHX01BU0spIHwgcGdwcm90X3ZhbChuZXdwcm90KTsKKwlyZXR1cm4gcHRlOworfQorCisjZGVmaW5lIHBtZF9zZXQocG1kcCwgcHRlcCkgZG8ge30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZ2Rfc2V0KHBnZF90ICpwZ2RwLCBwbWRfdCAqcG1kcCkKK3sKKwlwZ2RfdmFsKCpwZ2RwKSA9IHZpcnRfdG9fcGh5cyhwbWRwKTsKK30KKworI2RlZmluZSBfX3B0ZV9wYWdlKHB0ZSkJKCh1bnNpZ25lZCBsb25nKSAocHRlX3ZhbChwdGUpICYgUEFHRV9NQVNLKSkKKyNkZWZpbmUgX19wbWRfcGFnZShwbWQpCSgodW5zaWduZWQgbG9uZykgKHBtZF92YWwocG1kKSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9ub25lKHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gIXB0ZV92YWwocHRlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHRlX3ByZXNlbnQocHRlX3QgcHRlKQoreworCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBDRl9QQUdFX1ZBTElEOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHRlX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJcHRlX3QgKnB0ZXApCit7CisJcHRlX3ZhbCgqcHRlcCkgPSAwOworfQorCisjZGVmaW5lIHB0ZV9wYWdlbnIocHRlKQkoKF9fcHRlX3BhZ2UocHRlKSAtIFBBR0VfT0ZGU0VUKSA+PiBQQUdFX1NISUZUKQorI2RlZmluZSBwdGVfcGFnZShwdGUpCXZpcnRfdG9fcGFnZShfX3B0ZV9wYWdlKHB0ZSkpCisKK3N0YXRpYyBpbmxpbmUgaW50IHBtZF9ub25lMihwbWRfdCAqcG1kKSB7IHJldHVybiAhcG1kX3ZhbCgqcG1kKTsgfQorI2RlZmluZSBwbWRfbm9uZShwbWQpIHBtZF9ub25lMigmKHBtZCkpCitzdGF0aWMgaW5saW5lIGludCBwbWRfYmFkMihwbWRfdCAqcG1kKSB7IHJldHVybiAwOyB9CisjZGVmaW5lIHBtZF9iYWQocG1kKSBwbWRfYmFkMigmKHBtZCkpCisjZGVmaW5lIHBtZF9wcmVzZW50KHBtZCkgKCFwbWRfbm9uZTIoJihwbWQpKSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBwbWRfY2xlYXIocG1kX3QgKnBtZHApIHsgcG1kX3ZhbCgqcG1kcCkgPSAwOyB9CisKK3N0YXRpYyBpbmxpbmUgaW50IHBnZF9ub25lKHBnZF90IHBnZCkgeyByZXR1cm4gMDsgfQorc3RhdGljIGlubGluZSBpbnQgcGdkX2JhZChwZ2RfdCBwZ2QpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IHBnZF9wcmVzZW50KHBnZF90IHBnZCkgeyByZXR1cm4gMTsgfQorc3RhdGljIGlubGluZSB2b2lkIHBnZF9jbGVhcihwZ2RfdCAqcGdkcCkge30KKworI2RlZmluZSBwdGVfRVJST1IoZSkgXAorCXByaW50ayhLRVJOX0VSUiAiJXM6JWQ6IGJhZCBwdGUgJTA4bHguXG4iLAlcCisJX19GSUxFX18sIF9fTElORV9fLCBwdGVfdmFsKGUpKQorI2RlZmluZSBwbWRfRVJST1IoZSkgXAorCXByaW50ayhLRVJOX0VSUiAiJXM6JWQ6IGJhZCBwbWQgJTA4bHguXG4iLAlcCisJX19GSUxFX18sIF9fTElORV9fLCBwbWRfdmFsKGUpKQorI2RlZmluZSBwZ2RfRVJST1IoZSkgXAorCXByaW50ayhLRVJOX0VSUiAiJXM6JWQ6IGJhZCBwZ2QgJTA4bHguXG4iLAlcCisJX19GSUxFX18sIF9fTElORV9fLCBwZ2RfdmFsKGUpKQorCisvKgorICogVGhlIGZvbGxvd2luZyBvbmx5IHdvcmsgaWYgcHRlX3ByZXNlbnQoKSBpcyB0cnVlLgorICogVW5kZWZpbmVkIGJlaGF2aW91ciBpZiBub3QuLi4KKyAqIFt3ZSBoYXZlIHRoZSBmdWxsIHNldCBoZXJlIGV2ZW4gaWYgdGhleSBkb24ndCBjaGFuZ2UgZnJvbSBtNjhrXQorICovCitzdGF0aWMgaW5saW5lIGludCBwdGVfcmVhZChwdGVfdCBwdGUpCit7CisJcmV0dXJuIHB0ZV92YWwocHRlKSAmIENGX1BBR0VfUkVBREFCTEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV93cml0ZShwdGVfdCBwdGUpCit7CisJcmV0dXJuIHB0ZV92YWwocHRlKSAmIENGX1BBR0VfV1JJVEFCTEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHB0ZV9leGVjKHB0ZV90IHB0ZSkKK3sKKwlyZXR1cm4gcHRlX3ZhbChwdGUpICYgQ0ZfUEFHRV9FWEVDOworfQorCitzdGF0aWMgaW5saW5lIGludCBwdGVfZGlydHkocHRlX3QgcHRlKQoreworCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBDRl9QQUdFX0RJUlRZOworfQorCitzdGF0aWMgaW5saW5lIGludCBwdGVfeW91bmcocHRlX3QgcHRlKQoreworCXJldHVybiBwdGVfdmFsKHB0ZSkgJiBDRl9QQUdFX0FDQ0VTU0VEOworfQorCitzdGF0aWMgaW5saW5lIGludCBwdGVfZmlsZShwdGVfdCBwdGUpCit7CisJcmV0dXJuIHB0ZV92YWwocHRlKSAmIENGX1BBR0VfRklMRTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHRlX3NwZWNpYWwocHRlX3QgcHRlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV93cnByb3RlY3QocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+Q0ZfUEFHRV9XUklUQUJMRTsKKwlyZXR1cm4gcHRlOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9yZHByb3RlY3QocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+Q0ZfUEFHRV9SRUFEQUJMRTsKKwlyZXR1cm4gcHRlOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9leHByb3RlY3QocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+Q0ZfUEFHRV9FWEVDOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2xlYW4ocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+Q0ZfUEFHRV9ESVJUWTsKKwlyZXR1cm4gcHRlOworfQorCitzdGF0aWMgaW5saW5lIHB0ZV90IHB0ZV9ta29sZChwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpICY9IH5DRl9QQUdFX0FDQ0VTU0VEOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rd3JpdGUocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBDRl9QQUdFX1dSSVRBQkxFOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rcmVhZChwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpIHw9IENGX1BBR0VfUkVBREFCTEU7CisJcmV0dXJuIHB0ZTsKK30KKworc3RhdGljIGlubGluZSBwdGVfdCBwdGVfbWtleGVjKHB0ZV90IHB0ZSkKK3sKKwlwdGVfdmFsKHB0ZSkgfD0gQ0ZfUEFHRV9FWEVDOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rZGlydHkocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBDRl9QQUdFX0RJUlRZOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21reW91bmcocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSB8PSBDRl9QQUdFX0FDQ0VTU0VEOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rbm9jYWNoZShwdGVfdCBwdGUpCit7CisJcHRlX3ZhbChwdGUpIHw9IDB4ODAgfCAocHRlX3ZhbChwdGUpICYgfjB4NDApOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rY2FjaGUocHRlX3QgcHRlKQoreworCXB0ZV92YWwocHRlKSAmPSB+Q0ZfUEFHRV9OT0NBQ0hFOworCXJldHVybiBwdGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgcHRlX3QgcHRlX21rc3BlY2lhbChwdGVfdCBwdGUpCit7CisJcmV0dXJuIHB0ZTsKK30KKworI2RlZmluZSBzd2FwcGVyX3BnX2RpciBrZXJuZWxfcGdfZGlyCitleHRlcm4gcGdkX3Qga2VybmVsX3BnX2RpcltQVFJTX1BFUl9QR0RdOworCisvKgorICogRmluZCBhbiBlbnRyeSBpbiBhIHBhZ2V0YWJsZSBkaXJlY3RvcnkuCisgKi8KKyNkZWZpbmUgcGdkX2luZGV4KGFkZHJlc3MpCSgoYWRkcmVzcykgPj4gUEdESVJfU0hJRlQpCisjZGVmaW5lIHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpCSgobW0pLT5wZ2QgKyBwZ2RfaW5kZXgoYWRkcmVzcykpCisKKy8qCisgKiBGaW5kIGFuIGVudHJ5IGluIGEga2VybmVsIHBhZ2V0YWJsZSBkaXJlY3RvcnkuCisgKi8KKyNkZWZpbmUgcGdkX29mZnNldF9rKGFkZHJlc3MpCXBnZF9vZmZzZXQoJmluaXRfbW0sIGFkZHJlc3MpCisKKy8qCisgKiBGaW5kIGFuIGVudHJ5IGluIHRoZSBzZWNvbmQtbGV2ZWwgcGFnZXRhYmxlLgorICovCitzdGF0aWMgaW5saW5lIHBtZF90ICpwbWRfb2Zmc2V0KHBnZF90ICpwZ2QsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlyZXR1cm4gKHBtZF90ICopIHBnZDsKK30KKworLyoKKyAqIEZpbmQgYW4gZW50cnkgaW4gdGhlIHRoaXJkLWxldmVsIHBhZ2V0YWJsZS4KKyAqLworI2RlZmluZSBfX3B0ZV9vZmZzZXQoYWRkcmVzcykJKChhZGRyZXNzID4+IFBBR0VfU0hJRlQpICYgKFBUUlNfUEVSX1BURSAtIDEpKQorI2RlZmluZSBwdGVfb2Zmc2V0X2tlcm5lbChkaXIsIGFkZHJlc3MpIFwKKwkoKHB0ZV90ICopIF9fcG1kX3BhZ2UoKihkaXIpKSArIF9fcHRlX29mZnNldChhZGRyZXNzKSkKKworLyoKKyAqIERpc2FibGUgY2FjaGluZyBmb3IgcGFnZSBhdCBnaXZlbiBrZXJuZWwgdmlydHVhbCBhZGRyZXNzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbm9jYWNoZV9wYWdlKHZvaWQgKnZhZGRyKQoreworCXBnZF90ICpkaXI7CisJcG1kX3QgKnBtZHA7CisJcHRlX3QgKnB0ZXA7CisJdW5zaWduZWQgbG9uZyBhZGRyID0gKHVuc2lnbmVkIGxvbmcpIHZhZGRyOworCisJZGlyID0gcGdkX29mZnNldF9rKGFkZHIpOworCXBtZHAgPSBwbWRfb2Zmc2V0KGRpciwgYWRkcik7CisJcHRlcCA9IHB0ZV9vZmZzZXRfa2VybmVsKHBtZHAsIGFkZHIpOworCSpwdGVwID0gcHRlX21rbm9jYWNoZSgqcHRlcCk7Cit9CisKKy8qCisgKiBFbmFibGUgY2FjaGluZyBmb3IgcGFnZSBhdCBnaXZlbiBrZXJuZWwgdmlydHVhbCBhZGRyZXNzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgY2FjaGVfcGFnZSh2b2lkICp2YWRkcikKK3sKKwlwZ2RfdCAqZGlyOworCXBtZF90ICpwbWRwOworCXB0ZV90ICpwdGVwOworCXVuc2lnbmVkIGxvbmcgYWRkciA9ICh1bnNpZ25lZCBsb25nKSB2YWRkcjsKKworCWRpciA9IHBnZF9vZmZzZXRfayhhZGRyKTsKKwlwbWRwID0gcG1kX29mZnNldChkaXIsIGFkZHIpOworCXB0ZXAgPSBwdGVfb2Zmc2V0X2tlcm5lbChwbWRwLCBhZGRyKTsKKwkqcHRlcCA9IHB0ZV9ta2NhY2hlKCpwdGVwKTsKK30KKworI2RlZmluZSBQVEVfRklMRV9NQVhfQklUUwkyMQorI2RlZmluZSBQVEVfRklMRV9TSElGVAkJMTEKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB0ZV90b19wZ29mZihwdGVfdCBwdGUpCit7CisJcmV0dXJuIHB0ZV92YWwocHRlKSA+PiBQVEVfRklMRV9TSElGVDsKK30KKworc3RhdGljIGlubGluZSBwdGVfdCBwZ29mZl90b19wdGUodW5zaWduZWQgcGdvZmYpCit7CisJcmV0dXJuIF9fcHRlKChwZ29mZiA8PCBQVEVfRklMRV9TSElGVCkgKyBDRl9QQUdFX0ZJTEUpOworfQorCisvKgorICogRW5jb2RlIGFuZCBkZS1jb2RlIGEgc3dhcCBlbnRyeSAobXVzdCBiZSAhcHRlX25vbmUoZSkgJiYgIXB0ZV9wcmVzZW50KGUpKQorICovCisjZGVmaW5lIF9fc3dwX3R5cGUoeCkJCSgoeCkudmFsICYgMHhGRikKKyNkZWZpbmUgX19zd3Bfb2Zmc2V0KHgpCQkoKHgpLnZhbCA+PiBQVEVfRklMRV9TSElGVCkKKyNkZWZpbmUgX19zd3BfZW50cnkodHlwLCBvZmYpCSgoc3dwX2VudHJ5X3QpIHsgKHR5cCkgfCBcCisJCQkJCShvZmYgPDwgUFRFX0ZJTEVfU0hJRlQpIH0pCisjZGVmaW5lIF9fcHRlX3RvX3N3cF9lbnRyeShwdGUpCSgoc3dwX2VudHJ5X3QpIHsgcHRlX3ZhbChwdGUpIH0pCisjZGVmaW5lIF9fc3dwX2VudHJ5X3RvX3B0ZSh4KQkoX19wdGUoKHgpLnZhbCkpCisKKyNkZWZpbmUgcG1kX3BhZ2UocG1kKQkJKHBmbl90b19wYWdlKHBtZF92YWwocG1kKSA+PiBQQUdFX1NISUZUKSkKKworI2RlZmluZSBwdGVfb2Zmc2V0X21hcChwbWRwLCBhZGRyKSAoKHB0ZV90ICopX19wbWRfcGFnZSgqcG1kcCkgKyBcCisJCQkJICAgICAgIF9fcHRlX29mZnNldChhZGRyKSkKKyNkZWZpbmUgcHRlX3VubWFwKHB0ZSkJCSgodm9pZCkgMCkKKyNkZWZpbmUgcGZuX3B0ZShwZm4sIHByb3QpCV9fcHRlKCgocGZuKSA8PCBQQUdFX1NISUZUKSB8IHBncHJvdF92YWwocHJvdCkpCisjZGVmaW5lIHB0ZV9wZm4ocHRlKQkJKHB0ZV92YWwocHRlKSA+PiBQQUdFX1NISUZUKQorCisjZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLworI2VuZGlmCS8qIF9NQ0ZfUEdUQUJMRV9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbWNmbW11LmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbWNmbW11LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjYzNkNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tY2ZtbXUuaApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqCW1jZm1tdS5oIC0tIGRlZmluaXRpb25zIGZvciB0aGUgQ29sZEZpcmUgdjRlIE1NVQorICoKKyAqCShDKSBDb3B5cmlnaHQgMjAxMSwgIEdyZWcgVW5nZXJlciA8Z2VyZ0B1Y2xpbnV4Lm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2lmbmRlZglNQ0ZNTVVfSAorI2RlZmluZQlNQ0ZNTVVfSAorCisvKgorICoJVGhlIE1NVSBzdXBwb3J0IHJlZ2lzdGVycyBhcmUgbWFwcGVkIGludG8gdGhlIGFkZHJlc3Mgc3BhY2UgdXNpbmcKKyAqCXRoZSBwcm9jZXNzb3IgTU1VQkFTRSByZWdpc3Rlci4gV2UgdXNlZCBhIGZpeGVkIGFkZHJlc3MgZm9yIG1hcHBpbmcsCisgKgl0aGVyZSBkb2Vzbid0IHNlZW0gYW55IG5lZWQgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSB5ZXQuCisgKi8KKyNkZWZpbmUJTU1VQkFTRQkJMHhmZTAwMDAwMAorCisvKgorICoJVGhlIHN1cHBvcnQgcmVnaXN0ZXJzIG9mIHRoZSBNTVUuIE5hbWVzIGFyZSB0aGUgc2FtZXMgYXMgdGhvc2UKKyAqCXVzZWQgaW4gdGhlIEZyZWVzY2FsZSB2NGUgZG9jdW1lbnRhdGlvbi4KKyAqLworI2RlZmluZQlNTVVDUgkJKE1NVUJBU0UgKyAweDAwKQkvKiBDb250cm9sIHJlZ2lzdGVyICovCisjZGVmaW5lCU1NVU9SCQkoTU1VQkFTRSArIDB4MDQpCS8qIE9wZXJhdGlvbiByZWdpc3RlciAqLworI2RlZmluZQlNTVVTUgkJKE1NVUJBU0UgKyAweDA4KQkvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJTU1VQVIJCShNTVVCQVNFICsgMHgxMCkJLyogVExCIEFkZHJlc3MgcmVnaXN0ZXIgKi8KKyNkZWZpbmUJTU1VVFIJCShNTVVCQVNFICsgMHgxNCkJLyogVExCIFRhZyByZWdpc3RlciAqLworI2RlZmluZQlNTVVEUgkJKE1NVUJBU0UgKyAweDE4KQkvKiBUTEIgRGF0YSByZWdpc3RlciAqLworCisvKgorICoJTU1VIENvbnRyb2wgcmVnaXN0ZXIgYml0IGZsYWdzCisgKi8KKyNkZWZpbmUJTU1VQ1JfRU4JMHgwMDAwMDAwMQkJLyogVmlydHVhbCBtb2RlIGVuYWJsZSAqLworI2RlZmluZQlNTVVDUl9BU00JMHgwMDAwMDAwMgkJLyogQWRkcmVzcyBzcGFjZSBtb2RlICovCisKKy8qCisgKglNTVUgT3BlcmF0aW9uIHJlZ2lzdGVyLgorICovCisjZGVmaW5lCU1NVU9SX1VBQQkweDAwMDAwMDAxCQkvKiBVcGRhdGUgYWxsb2NhdGlvbSBhZGRyZXNzICovCisjZGVmaW5lCU1NVU9SX0FDQwkweDAwMDAwMDAyCQkvKiBUTEIgYWNjZXNzICovCisjZGVmaW5lCU1NVU9SX1JECTB4MDAwMDAwMDQJCS8qIFRMQiBhY2Nlc3MgcmVhZCAqLworI2RlZmluZQlNTVVPUl9XUgkweDAwMDAwMDAwCQkvKiBUTEIgYWNjZXNzIHdyaXRlICovCisjZGVmaW5lCU1NVU9SX0FEUgkweDAwMDAwMDA4CQkvKiBUTEIgYWRkcmVzcyBzZWxlY3QgKi8KKyNkZWZpbmUJTU1VT1JfSVRMQgkweDAwMDAwMDEwCQkvKiBJVExCIG9wZXJhdGlvbiAqLworI2RlZmluZQlNTVVPUl9DQVMJMHgwMDAwMDAyMAkJLyogQ2xlYXIgbm9uLWxvY2tlZCBBU0lEIFRMQnMgKi8KKyNkZWZpbmUJTU1VT1JfQ05MCTB4MDAwMDAwNDAJCS8qIENsZWFyIG5vbi1sb2NrZWQgVExCcyAqLworI2RlZmluZQlNTVVPUl9DQQkweDAwMDAwMDgwCQkvKiBDbGVhciBhbGwgVExCcyAqLworI2RlZmluZQlNTVVPUl9TVExCCTB4MDAwMDAxMDAJCS8qIFNlYXJjaCBUTEJzICovCisjZGVmaW5lCU1NVU9SX0FBTgkxNgkJCS8qIFRMQiBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyNkZWZpbmUJTU1VT1JfQUFNQVNLCTB4ZmZmZjAwMDAJCS8qIEFBIG1hc2sgKi8KKworLyoKKyAqCU1NVSBTdGF0dXMgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUJTU1VU1JfSElUCTB4MDAwMDAwMDIJCS8qIFNlYXJjaCBUTEIgaGl0ICovCisjZGVmaW5lCU1NVVNSX1dGCTB4MDAwMDAwMDgJCS8qIFdyaXRlIGFjY2VzcyBmYXVsdCAqLworI2RlZmluZQlNTVVTUl9SRgkweDAwMDAwMDEwCQkvKiBSZWFkIGFjY2VzcyBmYXVsdCAqLworI2RlZmluZQlNTVVTUl9TUEYJMHgwMDAwMDAyMAkJLyogU3VwZXJ2aXNvciBwcm90ZWN0IGZhdWx0ICovCisKKy8qCisgKglNTVUgUmVhZC9Xcml0ZSBUYWcgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUJTU1VVFJfVgkJMHgwMDAwMDAwMQkJLyogVmFsaWQgKi8KKyNkZWZpbmUJTU1VVFJfU0cJMHgwMDAwMDAwMgkJLyogU2hhcmVkIGdsb2JhbCAqLworI2RlZmluZQlNTVVUUl9JRE4JMgkJCS8qIEFkZHJlc3MgU3BhY2UgSUQgKi8KKyNkZWZpbmUJTU1VVFJfSURNQVNLCTB4MDAwMDAzZmMJCS8qIEFTSUQgbWFzayAqLworI2RlZmluZQlNTVVUUl9WQU4JMTAJCQkvKiBWaXJ0dWFsIEFkZHJlc3MgKi8KKyNkZWZpbmUJTU1VVFJfVkFNQVNLCTB4ZmZmZmZjMDAJCS8qIFZBIG1hc2sgKi8KKworLyoKKyAqCU1NVSBSZWFkL1dyaXRlIERhdGEgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUJTU1VRFJfTEsJMHgwMDAwMDAwMgkJLyogTG9jayBlbnRyeSAqLworI2RlZmluZQlNTVVEUl9YCQkweDAwMDAwMDA0CQkvKiBFeGVjdXRlIGFjY2VzcyBlbmFibGUgKi8KKyNkZWZpbmUJTU1VRFJfVwkJMHgwMDAwMDAwOAkJLyogV3JpdGUgYWNjZXNzIGVuYWJsZSAqLworI2RlZmluZQlNTVVEUl9SCQkweDAwMDAwMDEwCQkvKiBSZWFkIGFjY2VzcyBlbmFibGUgKi8KKyNkZWZpbmUJTU1VRFJfU1AJMHgwMDAwMDAyMAkJLyogU3VwZXJ2aXNvciBhY2Nlc3MgZW5hYmxlICovCisjZGVmaW5lCU1NVURSX0NNX0NXVAkweDAwMDAwMDAwCQkvKiBDYWNoYWJsZSB3cml0ZSB0aHJ1ICovCisjZGVmaW5lCU1NVURSX0NNX0NDQgkweDAwMDAwMDQwCQkvKiBDYWNoYWJsZSBjb3B5IGJhY2sgKi8KKyNkZWZpbmUJTU1VRFJfQ01fTkNQCTB4MDAwMDAwODAJCS8qIE5vbi1jYWNoYWJsZSBwcmVjaXNlICovCisjZGVmaW5lCU1NVURSX0NNX05DSQkweDAwMDAwMGMwCQkvKiBOb24tY2FjaGFibGUgaW1wcmVjaXNlICovCisjZGVmaW5lCU1NVURSX1NaXzFNQgkweDAwMDAwMDAwCQkvKiAxTUIgcGFnZSBzaXplICovCisjZGVmaW5lCU1NVURSX1NaXzRLQgkweDAwMDAwMTAwCQkvKiA0a0IgcGFnZSBzaXplICovCisjZGVmaW5lCU1NVURSX1NaXzhLQgkweDAwMDAwMjAwCQkvKiA4a0IgcGFnZSBzaXplICovCisjZGVmaW5lCU1NVURSX1NaXzFLQgkweDAwMDAwMzAwCQkvKiAxa0IgcGFnZSBzaXplICovCisjZGVmaW5lCU1NVURSX1BBTgkxMAkJCS8qIFBoeXNpY2FsIGFkZHJlc3MgKi8KKyNkZWZpbmUJTU1VRFJfUEFNQVNLCTB4ZmZmZmZjMDAJCS8qIFBBIG1hc2sgKi8KKworI2lmbmRlZiBfX0FTU0VNQkxZX18KKworLyoKKyAqCVNpbXBsZSBhY2Nlc3MgZnVuY3Rpb25zIGZvciB0aGUgTU1VIHJlZ2lzdGVycy4gTm90aGluZyBmYW5jeQorICoJY3VycmVudGx5IHJlcXVpcmVkLCBqdXN0IHNpbXBsZSAzMmJpdCBhY2Nlc3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1tdV9yZWFkKHUzMiBhKQoreworCXJldHVybiAqKCh2b2xhdGlsZSB1MzIgKikgYSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtbXVfd3JpdGUodTMyIGEsIHUzMiB2KQoreworCSooKHZvbGF0aWxlIHUzMiAqKSBhKSA9IHY7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJub3AiKTsKK30KKworaW50IGNmX3RsYl9taXNzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgd3JpdGUsIGludCBkdGxiLCBpbnQgZXh0ZW5zaW9uX3dvcmQpOworCisjZW5kaWYKKworI2VuZGlmCS8qIE1DRk1NVV9IICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vbW11X2NvbnRleHQuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCmluZGV4IDdkNDM0MWUuLmRjM2JlOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tbXVfY29udGV4dC5oCkBAIC04LDcgKzgsMjA2IEBACiB9CiAKICNpZmRlZiBDT05GSUdfTU1VCi0jaWZuZGVmIENPTkZJR19TVU4zCisKKyNpZiBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKworI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKyNpbmNsdWRlIDxhc20vYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL21jZm1tdS5oPgorI2luY2x1ZGUgPGFzbS9tbXUuaD4KKworI2RlZmluZSBOT19DT05URVhUCQkyNTYKKyNkZWZpbmUgTEFTVF9DT05URVhUCQkyNTUKKyNkZWZpbmUgRklSU1RfQ09OVEVYVAkJMQorCitleHRlcm4gdW5zaWduZWQgbG9uZyBjb250ZXh0X21hcFtdOworZXh0ZXJuIG1tX2NvbnRleHRfdCBuZXh0X21tdV9jb250ZXh0OworCitleHRlcm4gYXRvbWljX3QgbnJfZnJlZV9jb250ZXh0czsKK2V4dGVybiBzdHJ1Y3QgbW1fc3RydWN0ICpjb250ZXh0X21tW0xBU1RfQ09OVEVYVCsxXTsKK2V4dGVybiB2b2lkIHN0ZWFsX2NvbnRleHQodm9pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJbW1fY29udGV4dF90IGN0eDsKKworCWlmIChtbS0+Y29udGV4dCAhPSBOT19DT05URVhUKQorCQlyZXR1cm47CisJd2hpbGUgKGF0b21pY19kZWNfYW5kX3Rlc3RfbHQoJm5yX2ZyZWVfY29udGV4dHMpKSB7CisJCWF0b21pY19pbmMoJm5yX2ZyZWVfY29udGV4dHMpOworCQlzdGVhbF9jb250ZXh0KCk7CisJfQorCWN0eCA9IG5leHRfbW11X2NvbnRleHQ7CisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoY3R4LCBjb250ZXh0X21hcCkpIHsKKwkJY3R4ID0gZmluZF9uZXh0X3plcm9fYml0KGNvbnRleHRfbWFwLCBMQVNUX0NPTlRFWFQrMSwgY3R4KTsKKwkJaWYgKGN0eCA+IExBU1RfQ09OVEVYVCkKKwkJCWN0eCA9IDA7CisJfQorCW5leHRfbW11X2NvbnRleHQgPSAoY3R4ICsgMSkgJiBMQVNUX0NPTlRFWFQ7CisJbW0tPmNvbnRleHQgPSBjdHg7CisJY29udGV4dF9tbVtjdHhdID0gbW07Cit9CisKKy8qCisgKiBTZXQgdXAgdGhlIGNvbnRleHQgZm9yIGEgbmV3IGFkZHJlc3Mgc3BhY2UuCisgKi8KKyNkZWZpbmUgaW5pdF9uZXdfY29udGV4dCh0c2ssIG1tKQkoKChtbSktPmNvbnRleHQgPSBOT19DT05URVhUKSwgMCkKKworLyoKKyAqIFdlJ3JlIGZpbmlzaGVkIHVzaW5nIHRoZSBjb250ZXh0IGZvciBhbiBhZGRyZXNzIHNwYWNlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWlmIChtbS0+Y29udGV4dCAhPSBOT19DT05URVhUKSB7CisJCWNsZWFyX2JpdChtbS0+Y29udGV4dCwgY29udGV4dF9tYXApOworCQltbS0+Y29udGV4dCA9IE5PX0NPTlRFWFQ7CisJCWF0b21pY19pbmMoJm5yX2ZyZWVfY29udGV4dHMpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9jb250ZXh0KG1tX2NvbnRleHRfdCBjb250ZXh0LCBwZ2RfdCAqcGdkKQoreworCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZWMgJTAsJSVhc2lkIiA6IDogImQiIChjb250ZXh0KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzd2l0Y2hfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldiwgc3RydWN0IG1tX3N0cnVjdCAqbmV4dCwKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlnZXRfbW11X2NvbnRleHQodHNrLT5tbSk7CisJc2V0X2NvbnRleHQodHNrLT5tbS0+Y29udGV4dCwgbmV4dC0+cGdkKTsKK30KKworLyoKKyAqIEFmdGVyIHdlIGhhdmUgc2V0IGN1cnJlbnQtPm1tIHRvIGEgbmV3IHZhbHVlLCB0aGlzIGFjdGl2YXRlcworICogdGhlIGNvbnRleHQgZm9yIHRoZSBuZXcgbW0gc28gd2Ugc2VlIHRoZSBuZXcgbWFwcGluZ3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICphY3RpdmVfbW0sCisJc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJZ2V0X21tdV9jb250ZXh0KG1tKTsKKwlzZXRfY29udGV4dChtbS0+Y29udGV4dCwgbW0tPnBnZCk7Cit9CisKKyNkZWZpbmUgZGVhY3RpdmF0ZV9tbSh0c2ssIG1tKSBkbyB7IH0gd2hpbGUgKDApCisKK2V4dGVybiB2b2lkIG1tdV9jb250ZXh0X2luaXQodm9pZCk7CisjZGVmaW5lIHByZXBhcmVfYXJjaF9zd2l0Y2gobmV4dCkgbG9hZF9rc3BfbW11KG5leHQpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsb2FkX2tzcF9tbXUoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CisJaW50IGFzaWQ7CisJcGdkX3QgKnBnZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGU7CisJdW5zaWduZWQgbG9uZyBtbXVhcjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwltbXVhciA9IHRhc2stPnRocmVhZC5rc3A7CisKKwkvKiBTZWFyY2ggZm9yIGEgdmFsaWQgVExCIGVudHJ5LCBpZiBvbmUgaXMgZm91bmQsIGRvbid0IHJlbWFwICovCisJbW11X3dyaXRlKE1NVUFSLCBtbXVhcik7CisJbW11X3dyaXRlKE1NVU9SLCBNTVVPUl9TVExCIHwgTU1VT1JfQURSKTsKKwlpZiAobW11X3JlYWQoTU1VU1IpICYgTU1VU1JfSElUKQorCQlnb3RvIGVuZDsKKworCWlmIChtbXVhciA+PSBQQUdFX09GRlNFVCkgeworCQltbSA9ICZpbml0X21tOworCX0gZWxzZSB7CisJCXByX2luZm8oImxvYWRfa3NwX21tdTogbm9uLWtlcm5lbCBtbSBmb3VuZDogMHglcFxuIiwgdGFzay0+bW0pOworCQltbSA9IHRhc2stPm1tOworCX0KKworCWlmICghbW0pCisJCWdvdG8gYnVnOworCisJcGdkID0gcGdkX29mZnNldChtbSwgbW11YXIpOworCWlmIChwZ2Rfbm9uZSgqcGdkKSkKKwkJZ290byBidWc7CisKKwlwbWQgPSBwbWRfb2Zmc2V0KHBnZCwgbW11YXIpOworCWlmIChwbWRfbm9uZSgqcG1kKSkKKwkJZ290byBidWc7CisKKwlwdGUgPSAobW11YXIgPj0gUEFHRV9PRkZTRVQpID8gcHRlX29mZnNldF9rZXJuZWwocG1kLCBtbXVhcikKKwkJCQkgICAgIDogcHRlX29mZnNldF9tYXAocG1kLCBtbXVhcik7CisJaWYgKHB0ZV9ub25lKCpwdGUpIHx8ICFwdGVfcHJlc2VudCgqcHRlKSkKKwkJZ290byBidWc7CisKKwlzZXRfcHRlKHB0ZSwgcHRlX21reW91bmcoKnB0ZSkpOworCWFzaWQgPSBtbS0+Y29udGV4dCAmIDB4ZmY7CisJaWYgKCFwdGVfZGlydHkoKnB0ZSkgJiYgbW11YXIgPD0gUEFHRV9PRkZTRVQpCisJCXNldF9wdGUocHRlLCBwdGVfd3Jwcm90ZWN0KCpwdGUpKTsKKworCW1tdV93cml0ZShNTVVUUiwgKG1tdWFyICYgUEFHRV9NQVNLKSB8IChhc2lkIDw8IE1NVVRSX0lETikgfAorCQkoKChpbnQpKHB0ZS0+cHRlKSAmIChpbnQpQ0ZfUEFHRV9NTVVUUl9NQVNLKQorCQk+PiBDRl9QQUdFX01NVVRSX1NISUZUKSB8IE1NVVRSX1YpOworCisJbW11X3dyaXRlKE1NVURSLCAocHRlX3ZhbCgqcHRlKSAmIFBBR0VfTUFTSykgfAorCQkoKHB0ZS0+cHRlKSAmIENGX1BBR0VfTU1VRFJfTUFTSykgfCBNTVVEUl9TWl84S0IgfCBNTVVEUl9YKTsKKworCW1tdV93cml0ZShNTVVPUiwgTU1VT1JfQUNDIHwgTU1VT1JfVUFBKTsKKworCWdvdG8gZW5kOworCitidWc6CisJcHJfaW5mbygia3NwIGxvYWQgZmFpbGVkOiBtbT0weCVwIGtzcD0weDA4JWx4XG4iLCBtbSwgbW11YXIpOworZW5kOgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2VsaWYgZGVmaW5lZChDT05GSUdfU1VOMykKKyNpbmNsdWRlIDxhc20vc3VuM21tdS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIGdldF9mcmVlX2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIHZvaWQgY2xlYXJfY29udGV4dCh1bnNpZ25lZCBsb25nIGNvbnRleHQpOworCisvKiBzZXQgdGhlIGNvbnRleHQgZm9yIGEgbmV3IHRhc2sgdG8gdW5tYXBwZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJICAgc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJbW0tPmNvbnRleHQgPSBTVU4zX0lOVkFMSURfQ09OVEVYVDsKKwlyZXR1cm4gMDsKK30KKworLyogZmluZCB0aGUgY29udGV4dCBnaXZlbiB0byB0aGlzIHByb2Nlc3MsIGFuZCBpZiBpdCBoYXNuJ3QgYWxyZWFkeQorICAgZ290IG9uZSwgZ28gZ2V0IG9uZSBmb3IgaXQuICovCitzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X21tdV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWlmIChtbS0+Y29udGV4dCA9PSBTVU4zX0lOVkFMSURfQ09OVEVYVCkKKwkJbW0tPmNvbnRleHQgPSBnZXRfZnJlZV9jb250ZXh0KG1tKTsKK30KKworLyogZmx1c2ggY29udGV4dCBpZiBhbGxvY2F0ZWQuLi4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJaWYgKG1tLT5jb250ZXh0ICE9IFNVTjNfSU5WQUxJRF9DT05URVhUKQorCQljbGVhcl9jb250ZXh0KG1tLT5jb250ZXh0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJZ2V0X21tdV9jb250ZXh0KG1tKTsKKwlzdW4zX3B1dF9jb250ZXh0KG1tLT5jb250ZXh0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LAorCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlhY3RpdmF0ZV9jb250ZXh0KHRzay0+bW0pOworfQorCisjZGVmaW5lIGRlYWN0aXZhdGVfbW0odHNrLCBtbSkJZG8geyB9IHdoaWxlICgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqcHJldl9tbSwKKwkJCSAgICAgICBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0X21tKQoreworCWFjdGl2YXRlX2NvbnRleHQobmV4dF9tbSk7Cit9CisKKyNlbHNlCiAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtMTAzLDU1ICszMDIsOCBAQAogCQlzd2l0Y2hfbW1fMDQ2MChuZXh0X21tKTsKIH0KIAotI2Vsc2UgIC8qIENPTkZJR19TVU4zICovCi0jaW5jbHVkZSA8YXNtL3N1bjNtbXUuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi1leHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfZnJlZV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKLWV4dGVybiB2b2lkIGNsZWFyX2NvbnRleHQodW5zaWduZWQgbG9uZyBjb250ZXh0KTsKLQotLyogc2V0IHRoZSBjb250ZXh0IGZvciBhIG5ldyB0YXNrIHRvIHVubWFwcGVkICovCi1zdGF0aWMgaW5saW5lIGludCBpbml0X25ld19jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzdHJ1Y3QgbW1fc3RydWN0ICptbSkKLXsKLQltbS0+Y29udGV4dCA9IFNVTjNfSU5WQUxJRF9DT05URVhUOwotCXJldHVybiAwOwotfQotCi0vKiBmaW5kIHRoZSBjb250ZXh0IGdpdmVuIHRvIHRoaXMgcHJvY2VzcywgYW5kIGlmIGl0IGhhc24ndCBhbHJlYWR5Ci0gICBnb3Qgb25lLCBnbyBnZXQgb25lIGZvciBpdC4gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBnZXRfbW11X2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JaWYobW0tPmNvbnRleHQgPT0gU1VOM19JTlZBTElEX0NPTlRFWFQpCi0JCW1tLT5jb250ZXh0ID0gZ2V0X2ZyZWVfY29udGV4dChtbSk7Ci19Ci0KLS8qIGZsdXNoIGNvbnRleHQgaWYgYWxsb2NhdGVkLi4uICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZGVzdHJveV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCWlmKG1tLT5jb250ZXh0ICE9IFNVTjNfSU5WQUxJRF9DT05URVhUKQotCQljbGVhcl9jb250ZXh0KG1tLT5jb250ZXh0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGFjdGl2YXRlX2NvbnRleHQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JZ2V0X21tdV9jb250ZXh0KG1tKTsKLQlzdW4zX3B1dF9jb250ZXh0KG1tLT5jb250ZXh0KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHN3aXRjaF9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2LCBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQlhY3RpdmF0ZV9jb250ZXh0KHRzay0+bW0pOwotfQotCi0jZGVmaW5lIGRlYWN0aXZhdGVfbW0odHNrLG1tKQlkbyB7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9tbShzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2X21tLAotCQkJICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHRfbW0pCi17Ci0JYWN0aXZhdGVfY29udGV4dChuZXh0X21tKTsKLX0KLQogI2VuZGlmCisKICNlbHNlIC8qICFDT05GSUdfTU1VICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21vdG9yb2xhX3BndGFibGUuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9tb3Rvcm9sYV9wZ3RhYmxlLmgKaW5kZXggNDViZDNmNS4uZTBmZGQ0ZCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL21vdG9yb2xhX3BndGFibGUuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vbW90b3JvbGFfcGd0YWJsZS5oCkBAIC04LDYgKzgsNyBAQAogI2RlZmluZSBfUEFHRV9QUkVTRU5UCTB4MDAxCiAjZGVmaW5lIF9QQUdFX1NIT1JUCTB4MDAyCiAjZGVmaW5lIF9QQUdFX1JPTkxZCTB4MDA0CisjZGVmaW5lIF9QQUdFX1JFQURXUklURQkweDAwMAogI2RlZmluZSBfUEFHRV9BQ0NFU1NFRAkweDAwOAogI2RlZmluZSBfUEFHRV9ESVJUWQkweDAxMAogI2RlZmluZSBfUEFHRV9TVVBFUgkweDA4MAkvKiA2ODA0MCBzdXBlcnZpc29yIG9ubHkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wYWdlLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcGFnZS5oCmluZGV4IGRmZWJiN2MuLjk4YmFhODIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wYWdlLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3BhZ2UuaApAQCAtNiwxMCArNiwxMCBAQAogI2luY2x1ZGUgPGFzbS9wYWdlX29mZnNldC5oPgogCiAvKiBQQUdFX1NISUZUIGRldGVybWluZXMgdGhlIHBhZ2Ugc2l6ZSAqLwotI2lmbmRlZiBDT05GSUdfU1VOMwotI2RlZmluZSBQQUdFX1NISUZUCSgxMikKKyNpZiBkZWZpbmVkKENPTkZJR19TVU4zKSB8fCBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKyNkZWZpbmUgUEFHRV9TSElGVAkxMwogI2Vsc2UKLSNkZWZpbmUgUEFHRV9TSElGVAkoMTMpCisjZGVmaW5lIFBBR0VfU0hJRlQJMTIKICNlbmRpZgogI2RlZmluZSBQQUdFX1NJWkUJKF9BQygxLCBVTCkgPDwgUEFHRV9TSElGVCkKICNkZWZpbmUgUEFHRV9NQVNLCSh+KFBBR0VfU0laRS0xKSkKQEAgLTM2LDYgKzM2LDEwIEBACiAjZGVmaW5lIF9fcGdkKHgpCSgocGdkX3QpIHsgKHgpIH0gKQogI2RlZmluZSBfX3BncHJvdCh4KQkoKHBncHJvdF90KSB7ICh4KSB9ICkKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX3JhbWJhc2U7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfcmFtc3RhcnQ7CitleHRlcm4gdW5zaWduZWQgbG9uZyBfcmFtZW5kOworCiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCiAjaWZkZWYgQ09ORklHX01NVQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3BhZ2Vfbm8uaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wYWdlX25vLmgKaW5kZXggYThkMWM2MC4uOTA1OTU3MiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3BhZ2Vfbm8uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcGFnZV9uby5oCkBAIC01LDkgKzUsNiBAQAogIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtb3J5X3N0YXJ0OwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWVtb3J5X2VuZDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIF9yYW1iYXNlOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX3JhbXN0YXJ0OwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgX3JhbWVuZDsKIAogI2RlZmluZSBnZXRfdXNlcl9wYWdlKHZhZGRyKQkJX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpCiAjZGVmaW5lIGZyZWVfdXNlcl9wYWdlKHBhZ2UsIGFkZHIpCWZyZWVfcGFnZShhZGRyKQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3BhZ2Vfb2Zmc2V0LmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcGFnZV9vZmZzZXQuaAppbmRleCAxNzgwMTUyLi44MjYyNmE4IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vcGFnZV9vZmZzZXQuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcGFnZV9vZmZzZXQuaApAQCAtMSwxMSArMSw5IEBACiAvKiBUaGlzIGhhbmRsZXMgdGhlIG1lbW9yeSBtYXAuLiAqLwogCi0jaWZkZWYgQ09ORklHX01NVQotI2lmbmRlZiBDT05GSUdfU1VOMwotI2RlZmluZSBQQUdFX09GRlNFVF9SQVcJCTB4MDAwMDAwMDAKLSNlbHNlCisjaWYgZGVmaW5lZChDT05GSUdfUkFNQkFTRSkKKyNkZWZpbmUgUEFHRV9PRkZTRVRfUkFXCQlDT05GSUdfUkFNQkFTRQorI2VsaWYgZGVmaW5lZChDT05GSUdfU1VOMykKICNkZWZpbmUgUEFHRV9PRkZTRVRfUkFXCQkweDBFMDAwMDAwCi0jZW5kaWYKICNlbHNlCi0jZGVmaW5lCVBBR0VfT0ZGU0VUX1JBVwkJQ09ORklHX1JBTUJBU0UKKyNkZWZpbmUgUEFHRV9PRkZTRVRfUkFXCQkweDAwMDAwMDAwCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wZ2FsbG9jLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcGdhbGxvYy5oCmluZGV4IGMyOTRhYWQuLjM3YmVlN2UgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wZ2FsbG9jLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3BnYWxsb2MuaApAQCAtNyw3ICs3LDkgQEAKIAogI2lmZGVmIENPTkZJR19NTVUKICNpbmNsdWRlIDxhc20vdmlydGNvbnZlcnQuaD4KLSNpZmRlZiBDT05GSUdfU1VOMworI2lmIGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQorI2luY2x1ZGUgPGFzbS9tY2ZfcGdhbGxvYy5oPgorI2VsaWYgZGVmaW5lZChDT05GSUdfU1VOMykKICNpbmNsdWRlIDxhc20vc3VuM19wZ2FsbG9jLmg+CiAjZWxzZQogI2luY2x1ZGUgPGFzbS9tb3Rvcm9sYV9wZ2FsbG9jLmg+CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vcGd0YWJsZV9tbS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3BndGFibGVfbW0uaAppbmRleCA4NzE3NGM5Li5kYzM1ZTBlIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vcGd0YWJsZV9tbS5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wZ3RhYmxlX21tLmgKQEAgLTQwLDYgKzQwLDggQEAKIC8qIFBHRElSX1NISUZUIGRldGVybWluZXMgd2hhdCBhIHRoaXJkLWxldmVsIHBhZ2UgdGFibGUgZW50cnkgY2FuIG1hcCAqLwogI2lmZGVmIENPTkZJR19TVU4zCiAjZGVmaW5lIFBHRElSX1NISUZUICAgICAxNworI2VsaWYgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCisjZGVmaW5lIFBHRElSX1NISUZUICAgICAyMgogI2Vsc2UKICNkZWZpbmUgUEdESVJfU0hJRlQJMjUKICNlbmRpZgpAQCAtNTQsNiArNTYsMTAgQEAKICNkZWZpbmUgUFRSU19QRVJfUFRFICAgMTYKICNkZWZpbmUgUFRSU19QRVJfUE1EICAgMQogI2RlZmluZSBQVFJTX1BFUl9QR0QgICAyMDQ4CisjZWxpZiBkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKyNkZWZpbmUgUFRSU19QRVJfUFRFCTUxMgorI2RlZmluZSBQVFJTX1BFUl9QTUQJMQorI2RlZmluZSBQVFJTX1BFUl9QR0QJMTAyNAogI2Vsc2UKICNkZWZpbmUgUFRSU19QRVJfUFRFCTEwMjQKICNkZWZpbmUgUFRSU19QRVJfUE1ECTgKQEAgLTY2LDEyICs3MiwyMiBAQAogI2lmZGVmIENPTkZJR19TVU4zCiAjZGVmaW5lIEtNQVBfU1RBUlQgICAgIDB4MERDMDAwMDAKICNkZWZpbmUgS01BUF9FTkQgICAgICAgMHgwRTAwMDAwMAorI2VsaWYgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCisjZGVmaW5lIEtNQVBfU1RBUlQJMHhlMDAwMDAwMAorI2RlZmluZSBLTUFQX0VORAkweGYwMDAwMDAwCiAjZWxzZQogI2RlZmluZQlLTUFQX1NUQVJUCTB4ZDAwMDAwMDAKICNkZWZpbmUJS01BUF9FTkQJMHhmMDAwMDAwMAogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX1NVTjMKKyNpZmRlZiBDT05GSUdfU1VOMworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbTY4a192bWFsbG9jX2VuZDsKKyNkZWZpbmUgVk1BTExPQ19TVEFSVCAweDBmODAwMDAwCisjZGVmaW5lIFZNQUxMT0NfRU5EIG02OGtfdm1hbGxvY19lbmQKKyNlbGlmIGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQorI2RlZmluZSBWTUFMTE9DX1NUQVJUCTB4ZDAwMDAwMDAKKyNkZWZpbmUgVk1BTExPQ19FTkQJMHhlMDAwMDAwMAorI2Vsc2UKIC8qIEp1c3QgYW55IGFyYml0cmFyeSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSB2bWFsbG9jIFZNIGFyZWE6IHRoZQogICogY3VycmVudCA4TUIgdmFsdWUganVzdCBtZWFucyB0aGF0IHRoZXJlIHdpbGwgYmUgYSA4TUIgImhvbGUiIGFmdGVyIHRoZQogICogcGh5c2ljYWwgbWVtb3J5IHVudGlsIHRoZSBrZXJuZWwgdmlydHVhbCBtZW1vcnkgc3RhcnRzLiAgVGhhdCBtZWFucyB0aGF0CkBAIC04MiwxMSArOTgsNyBAQAogI2RlZmluZSBWTUFMTE9DX09GRlNFVAkoOCoxMDI0KjEwMjQpCiAjZGVmaW5lIFZNQUxMT0NfU1RBUlQgKCgodW5zaWduZWQgbG9uZykgaGlnaF9tZW1vcnkgKyBWTUFMTE9DX09GRlNFVCkgJiB+KFZNQUxMT0NfT0ZGU0VULTEpKQogI2RlZmluZSBWTUFMTE9DX0VORCBLTUFQX1NUQVJUCi0jZWxzZQotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbTY4a192bWFsbG9jX2VuZDsKLSNkZWZpbmUgVk1BTExPQ19TVEFSVCAweDBmODAwMDAwCi0jZGVmaW5lIFZNQUxMT0NfRU5EIG02OGtfdm1hbGxvY19lbmQKLSNlbmRpZiAvKiBDT05GSUdfU1VOMyAqLworI2VuZGlmCiAKIC8qIHplcm8gcGFnZSB1c2VkIGZvciB1bmluaXRpYWxpemVkIHN0dWZmICovCiBleHRlcm4gdm9pZCAqZW1wdHlfemVyb19wYWdlOwpAQCAtMTMwLDYgKzE0Miw4IEBACiAKICNpZmRlZiBDT05GSUdfU1VOMwogI2luY2x1ZGUgPGFzbS9zdW4zX3BndGFibGUuaD4KKyNlbGlmIGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQorI2luY2x1ZGUgPGFzbS9tY2ZfcGd0YWJsZS5oPgogI2Vsc2UKICNpbmNsdWRlIDxhc20vbW90b3JvbGFfcGd0YWJsZS5oPgogI2VuZGlmCkBAIC0xMzgsNiArMTUyLDkgQEAKIC8qCiAgKiBNYWNybyB0byBtYXJrIGEgcGFnZSBwcm90ZWN0aW9uIHZhbHVlIGFzICJ1bmNhY2hlYWJsZSIuCiAgKi8KKyNpZmRlZiBDT05GSUdfQ09MREZJUkUKKyMgZGVmaW5lIHBncHJvdF9ub25jYWNoZWQocHJvdCkgKF9fcGdwcm90KHBncHJvdF92YWwocHJvdCkgfCBDRl9QQUdFX05PQ0FDSEUpKQorI2Vsc2UKICNpZmRlZiBTVU4zX1BBR0VfTk9DQUNIRQogIyBkZWZpbmUgX19TVU4zX1BBR0VfTk9DQUNIRQlTVU4zX1BBR0VfTk9DQUNIRQogI2Vsc2UKQEAgLTE1Miw2ICsxNjksNyBAQAogCSAgICA/IChfX3BncHJvdCgocGdwcm90X3ZhbChwcm90KSAmIF9DQUNIRU1BU0swNDApIHwgX1BBR0VfTk9DQUNIRV9TKSkJXAogCSAgICA6IChwcm90KSkpCiAKKyNlbmRpZiAvKiBDT05GSUdfQ09MREZJUkUgKi8KICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9wZ3RhYmxlLmg+CiAjZW5kaWYgLyogIV9fQVNTRU1CTFlfXyAqLwogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggNTY4ZmFjZi4uNDY0NjBmYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaApAQCAtNDgsMTAgKzQ4LDEyIEBACiAgKiBzbyBkb24ndCBjaGFuZ2UgaXQgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KICAqLwogI2lmZGVmIENPTkZJR19NTVUKLSNpZm5kZWYgQ09ORklHX1NVTjMKLSNkZWZpbmUgVEFTS19TSVpFCSgweEYwMDAwMDAwVUwpCi0jZWxzZQorI2lmIGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQorI2RlZmluZSBUQVNLX1NJWkUJKDB4QzAwMDAwMDBVTCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX1NVTjMpCiAjZGVmaW5lIFRBU0tfU0laRQkoMHgwRTAwMDAwMFVMKQorI2Vsc2UKKyNkZWZpbmUgVEFTS19TSVpFCSgweEYwMDAwMDAwVUwpCiAjZW5kaWYKICNlbHNlCiAjZGVmaW5lIFRBU0tfU0laRQkoMHhGRkZGRkZGRlVMKQpAQCAtNjYsMTAgKzY4LDEyIEBACiAgKiBzcGFjZSBkdXJpbmcgbW1hcCdzLgogICovCiAjaWZkZWYgQ09ORklHX01NVQotI2lmbmRlZiBDT05GSUdfU1VOMwotI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJMHhDMDAwMDAwMFVMCi0jZWxzZQorI2lmIGRlZmluZWQoQ09ORklHX0NPTERGSVJFKQorI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJMHg2MDAwMDAwMFVMCisjZWxpZiBkZWZpbmVkKENPTkZJR19TVU4zKQogI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJMHgwQTAwMDAwMFVMCisjZWxzZQorI2RlZmluZSBUQVNLX1VOTUFQUEVEX0JBU0UJMHhDMDAwMDAwMFVMCiAjZW5kaWYKICNkZWZpbmUgVEFTS19VTk1BUFBFRF9BTElHTihhZGRyLCBvZmYpCVBBR0VfQUxJR04oYWRkcikKICNlbHNlCkBAIC04OCwxNCArOTIsMTIgQEAKIAl1bnNpZ25lZCBsb25nICBmcFs4KjNdOwogCXVuc2lnbmVkIGxvbmcgIGZwY250bFszXTsJLyogZnAgY29udHJvbCByZWdzICovCiAJdW5zaWduZWQgY2hhciAgZnBzdGF0ZVtGUFNUQVRFU0laRV07ICAvKiBmbG9hdGluZyBwb2ludCBzdGF0ZSAqLwotCXN0cnVjdCB0aHJlYWRfaW5mbyBpbmZvOwogfTsKIAogI2RlZmluZSBJTklUX1RIUkVBRCAgewkJCQkJCQlcCiAJLmtzcAk9IHNpemVvZihpbml0X3N0YWNrKSArICh1bnNpZ25lZCBsb25nKSBpbml0X3N0YWNrLAlcCiAJLnNyCT0gUFNfUywJCQkJCQkJXAogCS5mcwk9IF9fS0VSTkVMX0RTLAkJCQkJCVwKLQkuaW5mbwk9IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSwJCQkJXAogfQogCiAjaWZkZWYgQ09ORklHX01NVQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3NlZ21lbnQuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zZWdtZW50LmgKaW5kZXggZWU5NTkyMS4uMGZhODBlOSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3NlZ21lbnQuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vc2VnbWVudC5oCkBAIC0yMiwyMyArMjIsMjYgQEAKIH0gbW1fc2VnbWVudF90OwogCiAjZGVmaW5lIE1BS0VfTU1fU0VHKHMpCSgobW1fc2VnbWVudF90KSB7IChzKSB9KQotI2RlZmluZSBVU0VSX0RTCQlNQUtFX01NX1NFRyhfX1VTRVJfRFMpCi0jZGVmaW5lIEtFUk5FTF9EUwlNQUtFX01NX1NFRyhfX0tFUk5FTF9EUykKIAorI2lmZGVmIENPTkZJR19DUFVfSEFTX0FERFJFU1NfU1BBQ0VTCiAvKgogICogR2V0L3NldCB0aGUgU0ZDL0RGQyByZWdpc3RlcnMgZm9yIE1PVkVTIGluc3RydWN0aW9ucwogICovCisjZGVmaW5lIFVTRVJfRFMJCU1BS0VfTU1fU0VHKF9fVVNFUl9EUykKKyNkZWZpbmUgS0VSTkVMX0RTCU1BS0VfTU1fU0VHKF9fS0VSTkVMX0RTKQogCiBzdGF0aWMgaW5saW5lIG1tX3NlZ21lbnRfdCBnZXRfZnModm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfTU1VCiAJbW1fc2VnbWVudF90IF92OwogCV9fYXNtX18gKCJtb3ZlYyAlL2RmYywlMCI6Ij1yIiAoX3Yuc2VnKTopOwotCiAJcmV0dXJuIF92OwotI2Vsc2UKLQlyZXR1cm4gVVNFUl9EUzsKLSNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZzKG1tX3NlZ21lbnRfdCB2YWwpCit7CisJX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZlYyAlMCwlL3NmY1xuXHQiCisJCQkgICAgICAibW92ZWMgJTAsJS9kZmNcblx0IgorCQkJICAgICAgOiAvKiBubyBvdXRwdXRzICovIDogInIiICh2YWwuc2VnKSA6ICJtZW1vcnkiKTsKIH0KIAogc3RhdGljIGlubGluZSBtbV9zZWdtZW50X3QgZ2V0X2RzKHZvaWQpCkBAIC00NywxNCArNTAsMTMgQEAKICAgICByZXR1cm4gS0VSTkVMX0RTOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X2ZzKG1tX3NlZ21lbnRfdCB2YWwpCi17Ci0jaWZkZWYgQ09ORklHX01NVQotCV9fYXNtX18gX192b2xhdGlsZV9fICgibW92ZWMgJTAsJS9zZmNcblx0IgotCQkJICAgICAgIm1vdmVjICUwLCUvZGZjXG5cdCIKLQkJCSAgICAgIDogLyogbm8gb3V0cHV0cyAqLyA6ICJyIiAodmFsLnNlZykgOiAibWVtb3J5Iik7CisjZWxzZQorI2RlZmluZSBVU0VSX0RTCQlNQUtFX01NX1NFRyhUQVNLX1NJWkUpCisjZGVmaW5lIEtFUk5FTF9EUwlNQUtFX01NX1NFRygweEZGRkZGRkZGKQorI2RlZmluZSBnZXRfZHMoKQkoS0VSTkVMX0RTKQorI2RlZmluZSBnZXRfZnMoKQkoY3VycmVudF90aHJlYWRfaW5mbygpLT5hZGRyX2xpbWl0KQorI2RlZmluZSBzZXRfZnMoeCkJKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+YWRkcl9saW1pdCA9ICh4KSkKICNlbmRpZgotfQogCiAjZGVmaW5lIHNlZ21lbnRfZXEoYSxiKQkoKGEpLnNlZyA9PSAoYikuc2VnKQogCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vc2V0dXAuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zZXR1cC5oCmluZGV4IDRkZmIzOTUuLjAwYzJjNTMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zZXR1cC5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zZXR1cC5oCkBAIC00MCw2ICs0MCw3IEBACiAjZGVmaW5lIE1BQ0hfSFAzMDAgICAgOQogI2RlZmluZSBNQUNIX1E0MCAgICAgMTAKICNkZWZpbmUgTUFDSF9TVU4zWCAgIDExCisjZGVmaW5lIE1BQ0hfTTU0WFggICAxMgogCiAjZGVmaW5lIENPTU1BTkRfTElORV9TSVpFIDI1NgogCkBAIC0yMTEsMjMgKzIxMiwyNyBAQAogI2RlZmluZSBDUFVCXzY4MDMwICAgICAxCiAjZGVmaW5lIENQVUJfNjgwNDAgICAgIDIKICNkZWZpbmUgQ1BVQl82ODA2MCAgICAgMworI2RlZmluZSBDUFVCX0NPTERGSVJFICA0CiAKICNkZWZpbmUgQ1BVXzY4MDIwICAgICAgKDE8PENQVUJfNjgwMjApCiAjZGVmaW5lIENQVV82ODAzMCAgICAgICgxPDxDUFVCXzY4MDMwKQogI2RlZmluZSBDUFVfNjgwNDAgICAgICAoMTw8Q1BVQl82ODA0MCkKICNkZWZpbmUgQ1BVXzY4MDYwICAgICAgKDE8PENQVUJfNjgwNjApCisjZGVmaW5lIENQVV9DT0xERklSRSAgICgxPDxDUFVCX0NPTERGSVJFKQogCiAjZGVmaW5lIEZQVUJfNjg4ODEgICAgIDAKICNkZWZpbmUgRlBVQl82ODg4MiAgICAgMQogI2RlZmluZSBGUFVCXzY4MDQwICAgICAyICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5hbCBGUFUgKi8KICNkZWZpbmUgRlBVQl82ODA2MCAgICAgMyAgICAgICAgICAgICAgICAgICAgICAgLyogSW50ZXJuYWwgRlBVICovCiAjZGVmaW5lIEZQVUJfU1VORlBBICAgIDQgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1bi0zIEZQQSAqLworI2RlZmluZSBGUFVCX0NPTERGSVJFICA1ICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2xkRmlyZSBGUFUgKi8KIAogI2RlZmluZSBGUFVfNjg4ODEgICAgICAoMTw8RlBVQl82ODg4MSkKICNkZWZpbmUgRlBVXzY4ODgyICAgICAgKDE8PEZQVUJfNjg4ODIpCiAjZGVmaW5lIEZQVV82ODA0MCAgICAgICgxPDxGUFVCXzY4MDQwKQogI2RlZmluZSBGUFVfNjgwNjAgICAgICAoMTw8RlBVQl82ODA2MCkKICNkZWZpbmUgRlBVX1NVTkZQQSAgICAgKDE8PEZQVUJfU1VORlBBKQorI2RlZmluZSBGUFVfQ09MREZJUkUgICAoMTw8RlBVQl9DT0xERklSRSkKIAogI2RlZmluZSBNTVVCXzY4ODUxICAgICAwCiAjZGVmaW5lIE1NVUJfNjgwMzAgICAgIDEgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIE1NVSAqLwpAQCAtMjM1LDYgKzI0MCw3IEBACiAjZGVmaW5lIE1NVUJfNjgwNjAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIE1NVSAqLwogI2RlZmluZSBNTVVCX0FQT0xMTyAgICA0ICAgICAgICAgICAgICAgICAgICAgICAvKiBDdXN0b20gQXBvbGxvICovCiAjZGVmaW5lIE1NVUJfU1VOMyAgICAgIDUgICAgICAgICAgICAgICAgICAgICAgIC8qIEN1c3RvbSBTdW4tMyAqLworI2RlZmluZSBNTVVCX0NPTERGSVJFICA2ICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnRlcm5hbCBNTVUgKi8KIAogI2RlZmluZSBNTVVfNjg4NTEgICAgICAoMTw8TU1VQl82ODg1MSkKICNkZWZpbmUgTU1VXzY4MDMwICAgICAgKDE8PE1NVUJfNjgwMzApCkBAIC0yNDIsNiArMjQ4LDcgQEAKICNkZWZpbmUgTU1VXzY4MDYwICAgICAgKDE8PE1NVUJfNjgwNjApCiAjZGVmaW5lIE1NVV9TVU4zICAgICAgICgxPDxNTVVCX1NVTjMpCiAjZGVmaW5lIE1NVV9BUE9MTE8gICAgICgxPDxNTVVCX0FQT0xMTykKKyNkZWZpbmUgTU1VX0NPTERGSVJFICAgKDE8PE1NVUJfQ09MREZJUkUpCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKQEAgLTM0MSw2ICszNDgsMTMgQEAKICMgIGVuZGlmCiAjZW5kaWYKIAorI2lmICFkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKyMgIGRlZmluZSBDUFVfSVNfQ09MREZJUkUgKDApCisjZWxzZQorIyAgZGVmaW5lIENQVV9JU19DT0xERklSRSAoMSkKKyMgIGRlZmluZSBNTVVfSVNfQ09MREZJUkUgKDEpCisjZW5kaWYKKwogI2RlZmluZSBDUFVfVFlQRSAobTY4a19jcHV0eXBlKQogCiAjaWZkZWYgQ09ORklHX002OEtGUFVfRU1VCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3NpZ2NvbnRleHQuaAppbmRleCBhMjlkZDc0Li41MjNkYjJhIDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vc2lnY29udGV4dC5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zaWdjb250ZXh0LmgKQEAgLTE1LDExICsxNSw3IEBACiAJdW5zaWduZWQgbG9uZyAgc2NfcGM7CiAJdW5zaWduZWQgc2hvcnQgc2NfZm9ybWF0dmVjOwogI2lmbmRlZiBfX3VDbGludXhfXwotIyBpZmRlZiBfX21jb2xkZmlyZV9fCi0JdW5zaWduZWQgbG9uZyAgc2NfZnByZWdzWzJdWzJdOwkvKiByb29tIGZvciB0d28gZnAgcmVnaXN0ZXJzICovCi0jIGVsc2UKIAl1bnNpZ25lZCBsb25nICBzY19mcHJlZ3NbMiozXTsgIC8qIHJvb20gZm9yIHR3byBmcCByZWdpc3RlcnMgKi8KLSMgZW5kaWYKIAl1bnNpZ25lZCBsb25nICBzY19mcGNudGxbM107CiAJdW5zaWduZWQgY2hhciAgc2NfZnBzdGF0ZVsyMTZdOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggOWJmNDljOC4uZDQ3MDhjZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNjIsNCArNjIsNyBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKaW5kZXggNzkwOTg4OS4uMjlmYTZkYSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTMsNiArMyw3IEBACiAKICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CiAKIC8qCiAgKiBPbiBtYWNoaW5lcyB3aXRoIDRrIHBhZ2VzIHdlIGRlZmF1bHQgdG8gYW4gOGsgdGhyZWFkIHNpemUsIHRob3VnaCB3ZQpAQCAtMjYsNiArMjcsNyBAQAogCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsJCS8qIG1haW4gdGFzayBzdHJ1Y3R1cmUgKi8KIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlzdHJ1Y3QgZXhlY19kb21haW4JKmV4ZWNfZG9tYWluOwkvKiBleGVjdXRpb24gZG9tYWluICovCisJbW1fc2VnbWVudF90CQlhZGRyX2xpbWl0OwkvKiB0aHJlYWQgYWRkcmVzcyBzcGFjZSAqLwogCWludAkJCXByZWVtcHRfY291bnQ7CS8qIDAgPT4gcHJlZW1wdGFibGUsIDwwID0+IEJVRyAqLwogCV9fdTMyCQkJY3B1OwkJLyogc2hvdWxkIGFsd2F5cyBiZSAwIG9uIG02OGsgKi8KIAl1bnNpZ25lZCBsb25nCQl0cF92YWx1ZTsJLyogdGhyZWFkIHBvaW50ZXIgKi8KQEAgLTM5LDYgKzQxLDcgQEAKIHsJCQkJCQlcCiAJLnRhc2sJCT0gJnRzaywJCQlcCiAJLmV4ZWNfZG9tYWluCT0gJmRlZmF1bHRfZXhlY19kb21haW4sCVwKKwkuYWRkcl9saW1pdAk9IEtFUk5FTF9EUywJCVwKIAkucHJlZW1wdF9jb3VudAk9IElOSVRfUFJFRU1QVF9DT1VOVCwJXAogCS5yZXN0YXJ0X2Jsb2NrID0gewkJCVwKIAkJLmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsLAlcCkBAIC00NywzNCArNTAsNiBAQAogCiAjZGVmaW5lIGluaXRfc3RhY2sJCShpbml0X3RocmVhZF91bmlvbi5zdGFjaykKIAotI2lmZGVmIENPTkZJR19NTVUKLQotI2lmbmRlZiBfX0FTU0VNQkxZX18KLSNpbmNsdWRlIDxhc20vY3VycmVudC5oPgotI2VuZGlmCi0KLSNpZmRlZiBBU01fT0ZGU0VUU19DCi0jZGVmaW5lIHRhc2tfdGhyZWFkX2luZm8odHNrKQkoKHN0cnVjdCB0aHJlYWRfaW5mbyAqKSBOVUxMKQotI2Vsc2UKLSNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNkZWZpbmUgdGFza190aHJlYWRfaW5mbyh0c2spCSgoc3RydWN0IHRocmVhZF9pbmZvICopKChjaGFyICopdHNrK1RBU0tfVElORk8pKQotI2VuZGlmCi0KLSNkZWZpbmUgaW5pdF90aHJlYWRfaW5mbwkoaW5pdF90YXNrLnRocmVhZC5pbmZvKQotI2RlZmluZSB0YXNrX3N0YWNrX3BhZ2UodHNrKQkoKHRzayktPnN0YWNrKQotI2RlZmluZSBjdXJyZW50X3RocmVhZF9pbmZvKCkJdGFza190aHJlYWRfaW5mbyhjdXJyZW50KQotCi0jZGVmaW5lIF9fSEFWRV9USFJFQURfRlVOQ1RJT05TCi0KLSNkZWZpbmUgc2V0dXBfdGhyZWFkX3N0YWNrKHAsIG9yZykgKHsJCQlcCi0JKihzdHJ1Y3QgdGFza19zdHJ1Y3QgKiopKHApLT5zdGFjayA9IChwKTsJXAotCXRhc2tfdGhyZWFkX2luZm8ocCktPnRhc2sgPSAocCk7CQlcCi19KQotCi0jZGVmaW5lIGVuZF9vZl9zdGFjayhwKQkJKCh1bnNpZ25lZCBsb25nICopKHApLT5zdGFjayArIDEpCi0KLSNlbHNlIC8qICFDT05GSUdfTU1VICovCi0KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAvKiBob3cgdG8gZ2V0IHRoZSB0aHJlYWQgaW5mb3JtYXRpb24gc3RydWN0IGZyb20gQyAqLwogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGhyZWFkX2luZm8gKmN1cnJlbnRfdGhyZWFkX2luZm8odm9pZCkKQEAgLTkyLDggKzY3LDYgQEAKIAogI2RlZmluZSBpbml0X3RocmVhZF9pbmZvCShpbml0X3RocmVhZF91bmlvbi50aHJlYWRfaW5mbykKIAotI2VuZGlmIC8qIENPTkZJR19NTVUgKi8KLQogLyogZW50cnkuUyByZWxpZXMgb24gdGhlc2UgZGVmaW5pdGlvbnMhCiAgKiBiaXRzIDAtNyBhcmUgdGVzdGVkIGF0IGV2ZXJ5IGV4Y2VwdGlvbiBleGl0CiAgKiBiaXRzIDgtMTUgYXJlIGFsc28gdGVzdGVkIGF0IHN5c2NhbGwgZXhpdApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RsYmZsdXNoLmggYi9hcmNoL202OGsvaW5jbHVkZS9hc20vdGxiZmx1c2guaAppbmRleCBhNmI0ZWQ0Li45NjVlYTM1IDEwMDY0NAotLS0gYS9hcmNoL202OGsvaW5jbHVkZS9hc20vdGxiZmx1c2guaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vdGxiZmx1c2guaApAQCAtNSwxMCArNSwxMyBAQAogI2lmbmRlZiBDT05GSUdfU1VOMwogCiAjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKyNpbmNsdWRlIDxhc20vbWNmbW11Lmg+CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfa2VybmVsX3BhZ2Uodm9pZCAqYWRkcikKIHsKLQlpZiAoQ1BVX0lTXzA0MF9PUl8wNjApIHsKKwlpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CisJCW1tdV93cml0ZShNTVVPUiwgTU1VT1JfQ05MKTsKKwl9IGVsc2UgaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7CiAJCW1tX3NlZ21lbnRfdCBvbGRfZnMgPSBnZXRfZnMoKTsKIAkJc2V0X2ZzKEtFUk5FTF9EUyk7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKCIuY2hpcCA2ODA0MFxuXHQiCkBAIC0yNSwxMiArMjgsMTUgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIF9fZmx1c2hfdGxiKHZvaWQpCiB7Ci0JaWYgKENQVV9JU18wNDBfT1JfMDYwKQorCWlmIChDUFVfSVNfQ09MREZJUkUpIHsKKwkJbW11X3dyaXRlKE1NVU9SLCBNTVVPUl9DTkwpOworCX0gZWxzZSBpZiAoQ1BVX0lTXzA0MF9PUl8wNjApIHsKIAkJX19hc21fXyBfX3ZvbGF0aWxlX18oIi5jaGlwIDY4MDQwXG5cdCIKIAkJCQkgICAgICJwZmx1c2hhblxuXHQiCiAJCQkJICAgICAiLmNoaXAgNjhrIik7Ci0JZWxzZSBpZiAoQ1BVX0lTXzAyMF9PUl8wMzApCisJfSBlbHNlIGlmIChDUFVfSVNfMDIwX09SXzAzMCkgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicGZsdXNoICMwLCM0Iik7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgX19mbHVzaF90bGIwNDBfb25lKHVuc2lnbmVkIGxvbmcgYWRkcikKQEAgLTQzLDcgKzQ5LDkgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIF9fZmx1c2hfdGxiX29uZSh1bnNpZ25lZCBsb25nIGFkZHIpCiB7Ci0JaWYgKENQVV9JU18wNDBfT1JfMDYwKQorCWlmIChDUFVfSVNfQ09MREZJUkUpCisJCW1tdV93cml0ZShNTVVPUiwgTU1VT1JfQ05MKTsKKwllbHNlIGlmIChDUFVfSVNfMDQwX09SXzA2MCkKIAkJX19mbHVzaF90bGIwNDBfb25lKGFkZHIpOwogCWVsc2UgaWYgKENQVV9JU18wMjBfT1JfMDMwKQogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicGZsdXNoICMwLCM0LCglMCkiIDogOiAiYSIgKGFkZHIpKTsKQEAgLTU2LDEyICs2NCwxNSBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKQogewotCWlmIChDUFVfSVNfMDQwX09SXzA2MCkKKwlpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CisJCW1tdV93cml0ZShNTVVPUiwgTU1VT1JfQ05MKTsKKwl9IGVsc2UgaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7CiAJCV9fYXNtX18gX192b2xhdGlsZV9fKCIuY2hpcCA2ODA0MFxuXHQiCiAJCQkJICAgICAicGZsdXNoYVxuXHQiCiAJCQkJICAgICAiLmNoaXAgNjhrIik7Ci0JZWxzZSBpZiAoQ1BVX0lTXzAyMF9PUl8wMzApCisJfSBlbHNlIGlmIChDUFVfSVNfMDIwX09SXzAzMCkgewogCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygicGZsdXNoYSIpOworCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS90cmFwcy5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RyYXBzLmgKaW5kZXggMTUxMDY4Zi4uNGFmZjMzNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RyYXBzLmgKKysrIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3RyYXBzLmgKQEAgLTE4LDYgKzE4LDcgQEAKIAogdHlwZWRlZiB2b2lkICgqZV92ZWN0b3IpKHZvaWQpOwogZXh0ZXJuIGVfdmVjdG9yIHZlY3RvcnNbXTsKK2V4dGVybiBlX3ZlY3RvciAqX3JhbXZlYzsKIAogYXNtbGlua2FnZSB2b2lkIGF1dG9faW50aGFuZGxlcih2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCB1c2VyX2ludGhhbmRsZXIodm9pZCk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vdWFjY2Vzc19tbS5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3VhY2Nlc3NfbW0uaAppbmRleCA3MTA3ZjNmYi4uOWM4MGNkNSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3VhY2Nlc3NfbW0uaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vdWFjY2Vzc19tbS5oCkBAIC0yMSw2ICsyMSwyMiBAQAogfQogCiAvKgorICogTm90IGFsbCB2YXJpZW50cyBvZiB0aGUgNjhrIGZhbWlseSBzdXBwb3J0IHRoZSBub3Rpb24gb2YgYWRkcmVzcyBzcGFjZXMuCisgKiBUaGUgdHJhZGl0aW9uYWwgNjgweDAgcGFydHMgZG8sIGFuZCB0aGV5IHVzZSB0aGUgc2ZjL2RmYyByZWdpc3RlcnMgYW5kCisgKiB0aGUgIm1vdmVzIiBpbnN0cnVjdGlvbiB0byBhY2Nlc3MgdXNlciBzcGFjZSBmcm9tIGtlcm5lbCBzcGFjZS4gT3RoZXIKKyAqIGZhbWlseSBtZW1iZXJzIGxpa2UgQ29sZEZpcmUgZG9uJ3Qgc3VwcG9ydCB0aGlzLCBhbmQgb25seSBoYXZlIGEgc2luZ2xlCisgKiBhZGRyZXNzIHNwYWNlLCBhbmQgdXNlIHRoZSB1c3VhbCAibW92ZSIgaW5zdHJ1Y3Rpb24gZm9yIHVzZXIgc3BhY2UgYWNjZXNzLgorICoKKyAqIE91dHNpZGUgb2YgdGhpcyBkaWZmZXJlbmNlIHRoZSB1c2VyIHNwYWNlIGFjY2VzcyBmdW5jdGlvbnMgYXJlIHRoZSBzYW1lLgorICogU28gbGV0cyBrZWVwIHRoZSBjb2RlIHNpbXBsZSBhbmQganVzdCBkZWZpbmUgaW4gd2hhdCB3ZSBuZWVkIHRvIHVzZS4KKyAqLworI2lmZGVmIENPTkZJR19DUFVfSEFTX0FERFJFU1NfU1BBQ0VTCisjZGVmaW5lCU1PVkVTCSJtb3ZlcyIKKyNlbHNlCisjZGVmaW5lCU1PVkVTCSJtb3ZlIgorI2VuZGlmCisKKy8qCiAgKiBUaGUgZXhjZXB0aW9uIHRhYmxlIGNvbnNpc3RzIG9mIHBhaXJzIG9mIGFkZHJlc3NlczogdGhlIGZpcnN0IGlzIHRoZQogICogYWRkcmVzcyBvZiBhbiBpbnN0cnVjdGlvbiB0aGF0IGlzIGFsbG93ZWQgdG8gZmF1bHQsIGFuZCB0aGUgc2Vjb25kIGlzCiAgKiB0aGUgYWRkcmVzcyBhdCB3aGljaCB0aGUgcHJvZ3JhbSBzaG91bGQgY29udGludWUuICBObyByZWdpc3RlcnMgYXJlCkBAIC00Myw3ICs1OSw3IEBACiAKICNkZWZpbmUgX19wdXRfdXNlcl9hc20ocmVzLCB4LCBwdHIsIGJ3bCwgcmVnLCBlcnIpCVwKIGFzbSB2b2xhdGlsZSAoIlxuIgkJCQkJXAotCSIxOgltb3Zlcy4iI2J3bCIJJTIsJTFcbiIJCVwKKwkiMToJIk1PVkVTIi4iI2J3bCIJJTIsJTFcbiIJCVwKIAkiMjpcbiIJCQkJCQlcCiAJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQlcCiAJIgkuZXZlblxuIgkJCQlcCkBAIC04Myw4ICs5OSw4IEBACiAgCSAgICB7CQkJCQkJCQlcCiAgCQljb25zdCB2b2lkIF9fdXNlciAqX19wdV9wdHIgPSAocHRyKTsJCQlcCiAJCWFzbSB2b2xhdGlsZSAoIlxuIgkJCQkJXAotCQkJIjE6CW1vdmVzLmwJJTIsKCUxKStcbiIJCQlcCi0JCQkiMjoJbW92ZXMubAklUjIsKCUxKVxuIgkJCVwKKwkJCSIxOgkiTU9WRVMiLmwJJTIsKCUxKStcbiIJCVwKKwkJCSIyOgkiTU9WRVMiLmwJJVIyLCglMSlcbiIJCVwKIAkJCSIzOlxuIgkJCQkJCVwKIAkJCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJXAogCQkJIgkuZXZlblxuIgkJCQlcCkBAIC0xMTUsMTIgKzEzMSwxMiBAQAogI2RlZmluZSBfX2dldF91c2VyX2FzbShyZXMsIHgsIHB0ciwgdHlwZSwgYndsLCByZWcsIGVycikgKHsJXAogCXR5cGUgX19ndV92YWw7CQkJCQkJXAogCWFzbSB2b2xhdGlsZSAoIlxuIgkJCQkJXAotCQkiMToJbW92ZXMuIiNid2wiCSUyLCUxXG4iCQlcCisJCSIxOgkiTU9WRVMiLiIjYndsIgklMiwlMVxuIgkJXAogCQkiMjpcbiIJCQkJCQlcCiAJCSIJLnNlY3Rpb24gLmZpeHVwLFwiYXhcIlxuIgkJXAogCQkiCS5ldmVuXG4iCQkJCVwKIAkJIjEwOgltb3ZlLmwJJTMsJTBcbiIJCQlcCi0JCSIJc3ViLiIjYndsIgklMSwlMVxuIgkJXAorCQkiCXN1Yi5sCSUxLCUxXG4iCQkJXAogCQkiCWpyYQkyYlxuIgkJCQlcCiAJCSIJLnByZXZpb3VzXG4iCQkJCVwKIAkJIlxuIgkJCQkJCVwKQEAgLTE1Miw4ICsxNjgsOCBAQAogIAkJY29uc3Qgdm9pZCAqX19ndV9wdHIgPSAocHRyKTsJCQkJXAogIAkJdTY0IF9fZ3VfdmFsOwkJCQkJCVwKIAkJYXNtIHZvbGF0aWxlICgiXG4iCQkJCQlcCi0JCQkiMToJbW92ZXMubAkoJTIpKywlMVxuIgkJCVwKLQkJCSIyOgltb3Zlcy5sCSglMiksJVIxXG4iCQkJXAorCQkJIjE6CSJNT1ZFUyIubAkoJTIpKywlMVxuIgkJXAorCQkJIjI6CSJNT1ZFUyIubAkoJTIpLCVSMVxuIgkJXAogCQkJIjM6XG4iCQkJCQkJXAogCQkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCQlcCiAJCQkiCS5ldmVuXG4iCQkJCVwKQEAgLTE4OCwxMiArMjA0LDEyIEBACiAKICNkZWZpbmUgX19jb25zdGFudF9jb3B5X2Zyb21fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCBuLCBzMSwgczIsIHMzKVwKIAlhc20gdm9sYXRpbGUgKCJcbiIJCQkJCQlcCi0JCSIxOgltb3Zlcy4iI3MxIgkoJTIpKywlM1xuIgkJCVwKKwkJIjE6CSJNT1ZFUyIuIiNzMSIJKCUyKSssJTNcbiIJCQlcCiAJCSIJbW92ZS4iI3MxIgklMywoJTEpK1xuIgkJCVwKLQkJIjI6CW1vdmVzLiIjczIiCSglMikrLCUzXG4iCQkJXAorCQkiMjoJIk1PVkVTIi4iI3MyIgkoJTIpKywlM1xuIgkJCVwKIAkJIgltb3ZlLiIjczIiCSUzLCglMSkrXG4iCQkJXAogCQkiCS5pZm5jCVwiIiNzMyJcIixcIlwiXG4iCQkJXAotCQkiMzoJbW92ZXMuIiNzMyIJKCUyKSssJTNcbiIJCQlcCisJCSIzOgkiTU9WRVMiLiIjczMiCSglMikrLCUzXG4iCQkJXAogCQkiCW1vdmUuIiNzMyIJJTMsKCUxKStcbiIJCQlcCiAJCSIJLmVuZGlmXG4iCQkJCQlcCiAJCSI0OlxuIgkJCQkJCQlcCkBAIC0yNjksMTMgKzI4NSwxMyBAQAogI2RlZmluZSBfX2NvbnN0YW50X2NvcHlfdG9fdXNlcl9hc20ocmVzLCB0bywgZnJvbSwgdG1wLCBuLCBzMSwgczIsIHMzKQlcCiAJYXNtIHZvbGF0aWxlICgiXG4iCQkJCQkJXAogCQkiCW1vdmUuIiNzMSIJKCUyKSssJTNcbiIJCQlcCi0JCSIxMToJbW92ZXMuIiNzMSIJJTMsKCUxKStcbiIJCQlcCisJCSIxMToJIk1PVkVTIi4iI3MxIgklMywoJTEpK1xuIgkJCVwKIAkJIjEyOgltb3ZlLiIjczIiCSglMikrLCUzXG4iCQkJXAotCQkiMjE6CW1vdmVzLiIjczIiCSUzLCglMSkrXG4iCQkJXAorCQkiMjE6CSJNT1ZFUyIuIiNzMiIJJTMsKCUxKStcbiIJCQlcCiAJCSIyMjpcbiIJCQkJCQkJXAogCQkiCS5pZm5jCVwiIiNzMyJcIixcIlwiXG4iCQkJXAogCQkiCW1vdmUuIiNzMyIJKCUyKSssJTNcbiIJCQlcCi0JCSIzMToJbW92ZXMuIiNzMyIJJTMsKCUxKStcbiIJCQlcCisJCSIzMToJIk1PVkVTIi4iI3MzIgklMywoJTEpK1xuIgkJCVwKIAkJIjMyOlxuIgkJCQkJCQlcCiAJCSIJLmVuZGlmXG4iCQkJCQlcCiAJCSI0OlxuIgkJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL202OGsvaW5jbHVkZS9hc20vdWNvbnRleHQuaCBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS91Y29udGV4dC5oCmluZGV4IDAwZGNjNTEuLmU0ZTIyNjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS91Y29udGV4dC5oCisrKyBiL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS91Y29udGV4dC5oCkBAIC03LDExICs3LDcgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgZnByZWdzZXQgewogCWludCBmX2ZwY250bFszXTsKLSNpZmRlZiBfX21jb2xkZmlyZV9fCi0JaW50IGZfZnByZWdzWzhdWzJdOwotI2Vsc2UKIAlpbnQgZl9mcHJlZ3NbOCozXTsKLSNlbmRpZgogfSBmcHJlZ3NldF90OwogCiBzdHJ1Y3QgbWNvbnRleHQgewpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9tNjhrL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IDQzZjk4NGUuLjMwMzE5MmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL202OGsvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTM1MCwxMCArMzUwLDEyIEBACiAjZGVmaW5lIF9fTlJfY2xvY2tfYWRqdGltZQkzNDIKICNkZWZpbmUgX19OUl9zeW5jZnMJCTM0MwogI2RlZmluZSBfX05SX3NldG5zCQkzNDQKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3JlYWR2CTM0NQorI2RlZmluZSBfX05SX3Byb2Nlc3Nfdm1fd3JpdGV2CTM0NgogCiAjaWZkZWYgX19LRVJORUxfXwogCi0jZGVmaW5lIE5SX3N5c2NhbGxzCQkzNDUKKyNkZWZpbmUgTlJfc3lzY2FsbHMJCTM0NwogCiAjZGVmaW5lIF9fQVJDSF9XQU5UX0lQQ19QQVJTRV9WRVJTSU9OCiAjZGVmaW5lIF9fQVJDSF9XQU5UX09MRF9SRUFERElSCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL01ha2VmaWxlIGIvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQppbmRleCBjNTY5NjE5Li40MGQyOWE3OCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9NYWtlZmlsZQorKysgYi9hcmNoL202OGsva2VybmVsL01ha2VmaWxlCkBAIC0yLDE5ICsyLDI0IEBACiAjIE1ha2VmaWxlIGZvciB0aGUgbGludXgga2VybmVsLgogIwogCi1leHRyYS0kKENPTkZJR19NTVUpCTo9IGhlYWQubworZXh0cmEtJChDT05GSUdfQU1JR0EpCTo9IGhlYWQubworZXh0cmEtJChDT05GSUdfQVRBUkkpCTo9IGhlYWQubworZXh0cmEtJChDT05GSUdfTUFDKQk6PSBoZWFkLm8KK2V4dHJhLSQoQ09ORklHX0FQT0xMTykJOj0gaGVhZC5vCitleHRyYS0kKENPTkZJR19WTUUpCTo9IGhlYWQubworZXh0cmEtJChDT05GSUdfSFAzMDApCTo9IGhlYWQubworZXh0cmEtJChDT05GSUdfUTQwKQk6PSBoZWFkLm8KK2V4dHJhLSQoQ09ORklHX1NVTjNYKQk6PSBoZWFkLm8KIGV4dHJhLSQoQ09ORklHX1NVTjMpCTo9IHN1bjMtaGVhZC5vCiBleHRyYS15CQkJKz0gdm1saW51eC5sZHMKIAotb2JqLXkJOj0gZW50cnkubyBpcnEubyBtNjhrX2tzeW1zLm8gbW9kdWxlLm8gcHJvY2Vzcy5vIHB0cmFjZS5vIHNldHVwLm8gXAotCSAgIHNpZ25hbC5vIHN5c19tNjhrLm8gc3lzY2FsbHRhYmxlLm8gdGltZS5vIHRyYXBzLm8KK29iai15CTo9IGVudHJ5Lm8gaW5pdF90YXNrLm8gaXJxLm8gbTY4a19rc3ltcy5vIG1vZHVsZS5vIHByb2Nlc3MubyBwdHJhY2Uubworb2JqLXkJKz0gc2V0dXAubyBzaWduYWwubyBzeXNfbTY4ay5vIHN5c2NhbGx0YWJsZS5vIHRpbWUubyB0cmFwcy5vCiAKLW9iai0kKENPTkZJR19NTVUpCSs9IGludHMubyB2ZWN0b3JzLm8KK29iai0kKENPTkZJR19NTVVfTU9UT1JPTEEpICs9IGludHMubyB2ZWN0b3JzLm8KK29iai0kKENPTkZJR19NTVVfU1VOMykgKz0gaW50cy5vIHZlY3RvcnMubwogCiBpZm5kZWYgQ09ORklHX01NVV9TVU4zCi1vYmoteQkJCSs9IGRtYS5vCi1lbmRpZgotaWZuZGVmIENPTkZJR19NTVUKLW9iai15CQkJKz0gaW5pdF90YXNrLm8KK29iai15CSs9IGRtYS5vCiBlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL2FzbS1vZmZzZXRzLmMgYi9hcmNoL202OGsva2VybmVsL2FzbS1vZmZzZXRzLmMKaW5kZXggOTgzZmVkOS4uYTk3MmIwMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9hc20tb2Zmc2V0cy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvYXNtLW9mZnNldHMuYwpAQCAtMjQsOCArMjQsNyBAQAogCS8qIG9mZnNldHMgaW50byB0aGUgdGFzayBzdHJ1Y3QgKi8KIAlERUZJTkUoVEFTS19USFJFQUQsIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkKSk7CiAJREVGSU5FKFRBU0tfTU0sIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgbW0pKTsKLQlERUZJTkUoVEFTS19JTkZPLCBvZmZzZXRvZihzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZC5pbmZvKSk7Ci0JREVGSU5FKFRBU0tfVElORk8sIG9mZnNldG9mKHN0cnVjdCB0YXNrX3N0cnVjdCwgdGhyZWFkLmluZm8pKTsKKwlERUZJTkUoVEFTS19TVEFDSywgb2Zmc2V0b2Yoc3RydWN0IHRhc2tfc3RydWN0LCBzdGFjaykpOwogCiAJLyogb2Zmc2V0cyBpbnRvIHRoZSB0aHJlYWQgc3RydWN0ICovCiAJREVGSU5FKFRIUkVBRF9LU1AsIG9mZnNldG9mKHN0cnVjdCB0aHJlYWRfc3RydWN0LCBrc3ApKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUyBiL2FyY2gvbTY4ay9rZXJuZWwvZW50cnkuUwppbmRleCAwODFjZjk2Li5iOGRhZjY0IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL2VudHJ5LlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeS5TCkBAIC0xLDQgKzEsNCBAQAotI2lmZGVmIENPTkZJR19NTVUKKyNpZiBkZWZpbmVkKENPTkZJR19NTVUpICYmICFkZWZpbmVkKENPTkZJR19DT0xERklSRSkKICNpbmNsdWRlICJlbnRyeV9tbS5TIgogI2Vsc2UKICNpbmNsdWRlICJlbnRyeV9uby5TIgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeV9tbS5TIGIvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeV9tbS5TCmluZGV4IGM3MTNmNTEuLjY3NWE4NTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvZW50cnlfbW0uUworKysgYi9hcmNoL202OGsva2VybmVsL2VudHJ5X21tLlMKQEAgLTk5LDcgKzk5LDggQEAKIAlqcmEJLkxyZXRfZnJvbV9leGNlcHRpb24KIAogRU5UUlkocmV0X2Zyb21fc2lnbmFsKQotCXRzdGIJJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX0ZMQUdTKzIpCisJbW92ZWwJJWN1cnB0ckAoVEFTS19TVEFDSyksJWExCisJdHN0YgklYTFAKFRJTkZPX0ZMQUdTKzIpCiAJamdlCTFmCiAJamJzcglzeXNjYWxsX3RyYWNlCiAxOglSRVNUT1JFX1NXSVRDSF9TVEFDSwpAQCAtMTIwLDExICsxMjEsMTMgQEAKIAlTQVZFX0FMTF9TWVMKIAogCUdFVF9DVVJSRU5UKCVkMSkKKwltb3ZlbAklZDEsJWExCisKIAl8IHNhdmUgdG9wIG9mIGZyYW1lCiAJbW92ZWwJJXNwLCVjdXJwdHJAKFRBU0tfVEhSRUFEK1RIUkVBRF9FU1AwKQogCiAJfCBzeXNjYWxsIHRyYWNlPwotCXRzdGIJJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX0ZMQUdTKzIpCisJdHN0YgklYTFAKFRJTkZPX0ZMQUdTKzIpCiAJam1pCWRvX3RyYWNlX2VudHJ5CiAJY21wbAkjTlJfc3lzY2FsbHMsJWQwCiAJamNjCWJhZHN5cwpAQCAtMTMzLDcgKzEzNiw4IEBACiAJbW92ZWwJJWQwLCVzcEAoUFRfT0ZGX0QwKQl8IHNhdmUgdGhlIHJldHVybiB2YWx1ZQogcmV0X2Zyb21fc3lzY2FsbDoKIAl8b3JpdwkjMHgwNzAwLCVzcgotCW1vdmV3CSVjdXJwdHJAKFRBU0tfSU5GTytUSU5GT19GTEFHUysyKSwlZDAKKwltb3ZlbAklY3VycHRyQChUQVNLX1NUQUNLKSwlYTEKKwltb3ZldwklYTFAKFRJTkZPX0ZMQUdTKzIpLCVkMAogCWpuZQlzeXNjYWxsX2V4aXRfd29yawogMToJUkVTVE9SRV9BTEwKIApAQCAtMTU5LDcgKzE2Myw4IEBACiAJYW5kdwkjQUxMT1dJTlQsJXNyCiAKIHJlc3VtZV91c2Vyc3BhY2U6Ci0JbW92ZWIJJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX0ZMQUdTKzMpLCVkMAorCW1vdmVsCSVjdXJwdHJAKFRBU0tfU1RBQ0spLCVhMQorCW1vdmViCSVhMUAoVElORk9fRkxBR1MrMyksJWQwCiAJam5lCWV4aXRfd29yawogMToJUkVTVE9SRV9BTEwKIApAQCAtMTk5LDcgKzIwNCw4IEBACiBFTlRSWShhdXRvX2ludGhhbmRsZXIpCiAJU0FWRV9BTExfSU5UCiAJR0VUX0NVUlJFTlQoJWQwKQotCWFkZHFiCSMxLCVjdXJwdHJAKFRBU0tfSU5GTytUSU5GT19QUkVFTVBUKzEpCisJbW92ZWwJJWQwLCVhMQorCWFkZHFiCSMxLCVhMUAoVElORk9fUFJFRU1QVCsxKQogCQkJCQl8ICBwdXQgZXhjZXB0aW9uICMgaW4gZDAKIAliZmV4dHUJJXNwQChQVF9PRkZfRk9STUFUVkVDKXsjNCwjMTB9LCVkMAogCXN1YncJI1ZFQ19TUFVSLCVkMApAQCAtMjExLDcgKzIxNyw4IEBACiAJYWRkcWwJIzgsJXNwCQkJfCAgcG9wIHBhcmFtZXRlcnMgb2ZmIHN0YWNrCiAKIHJldF9mcm9tX2ludGVycnVwdDoKLQlzdWJxYgkjMSwlY3VycHRyQChUQVNLX0lORk8rVElORk9fUFJFRU1QVCsxKQorCW1vdmVsCSVjdXJwdHJAKFRBU0tfU1RBQ0spLCVhMQorCXN1YnFiCSMxLCVhMUAoVElORk9fUFJFRU1QVCsxKQogCWplcQlyZXRfZnJvbV9sYXN0X2ludGVycnVwdAogMjoJUkVTVE9SRV9BTEwKIApAQCAtMjMyLDcgKzIzOSw4IEBACiBFTlRSWSh1c2VyX2ludGhhbmRsZXIpCiAJU0FWRV9BTExfSU5UCiAJR0VUX0NVUlJFTlQoJWQwKQotCWFkZHFiCSMxLCVjdXJwdHJAKFRBU0tfSU5GTytUSU5GT19QUkVFTVBUKzEpCisJbW92ZWwJJWQwLCVhMQorCWFkZHFiCSMxLCVhMUAoVElORk9fUFJFRU1QVCsxKQogCQkJCQl8ICBwdXQgZXhjZXB0aW9uICMgaW4gZDAKIAliZmV4dHUJJXNwQChQVF9PRkZfRk9STUFUVkVDKXsjNCwjMTB9LCVkMAogdXNlcl9pcnF2ZWNfZml4dXAgPSAuICsgMgpAQCAtMjQzLDcgKzI1MSw4IEBACiAJanNyCWRvX0lSUQkJCXwgIHByb2Nlc3MgdGhlIElSUQogCWFkZHFsCSM4LCVzcAkJCXwgIHBvcCBwYXJhbWV0ZXJzIG9mZiBzdGFjawogCi0Jc3VicWIJIzEsJWN1cnB0ckAoVEFTS19JTkZPK1RJTkZPX1BSRUVNUFQrMSkKKwltb3ZlbAklY3VycHRyQChUQVNLX1NUQUNLKSwlYTEKKwlzdWJxYgkjMSwlYTFAKFRJTkZPX1BSRUVNUFQrMSkKIAlqZXEJcmV0X2Zyb21fbGFzdF9pbnRlcnJ1cHQKIAlSRVNUT1JFX0FMTAogCkBAIC0yNTIsMTMgKzI2MSwxNSBAQAogRU5UUlkoYmFkX2ludGhhbmRsZXIpCiAJU0FWRV9BTExfSU5UCiAJR0VUX0NVUlJFTlQoJWQwKQotCWFkZHFiCSMxLCVjdXJwdHJAKFRBU0tfSU5GTytUSU5GT19QUkVFTVBUKzEpCisJbW92ZWwJJWQwLCVhMQorCWFkZHFiCSMxLCVhMUAoVElORk9fUFJFRU1QVCsxKQogCiAJbW92ZWwJJXNwLCVzcEAtCiAJanNyCWhhbmRsZV9iYWRpbnQKIAlhZGRxbAkjNCwlc3AKIAotCXN1YnFiCSMxLCVjdXJwdHJAKFRBU0tfSU5GTytUSU5GT19QUkVFTVBUKzEpCisJbW92ZWwJJWN1cnB0ckAoVEFTS19TVEFDSyksJWExCisJc3VicWIJIzEsJWExQChUSU5GT19QUkVFTVBUKzEpCiAJamVxCXJldF9mcm9tX2xhc3RfaW50ZXJydXB0CiAJUkVTVE9SRV9BTEwKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeV9uby5TIGIvYXJjaC9tNjhrL2tlcm5lbC9lbnRyeV9uby5TCmluZGV4IDFiNDI4OTAuLmQ4MGNiYTQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvZW50cnlfbm8uUworKysgYi9hcmNoL202OGsva2VybmVsL2VudHJ5X25vLlMKQEAgLTQ0LDggKzQ0LDcgQEAKIAogRU5UUlkoYnVzZXJyKQogCVNBVkVfQUxMX0lOVAotCW1vdmVxCSMtMSwlZDAKLQltb3ZlbAklZDAsJXNwQChQVF9PRkZfT1JJR19EMCkKKwlHRVRfQ1VSUkVOVCglZDApCiAJbW92ZWwJJXNwLCVzcEAtIAkJLyogc3RhY2sgZnJhbWUgcG9pbnRlciBhcmd1bWVudCAqLwogCWpzcglidXNlcnJfYwogCWFkZHFsCSM0LCVzcApAQCAtNTMsOCArNTIsNyBAQAogCiBFTlRSWSh0cmFwKQogCVNBVkVfQUxMX0lOVAotCW1vdmVxCSMtMSwlZDAKLQltb3ZlbAklZDAsJXNwQChQVF9PRkZfT1JJR19EMCkKKwlHRVRfQ1VSUkVOVCglZDApCiAJbW92ZWwJJXNwLCVzcEAtIAkJLyogc3RhY2sgZnJhbWUgcG9pbnRlciBhcmd1bWVudCAqLwogCWpzcgl0cmFwX2MKIAlhZGRxbAkjNCwlc3AKQEAgLTY1LDggKzYzLDcgQEAKIC5nbG9ibCBkYmdpbnRlcnJ1cHQKIEVOVFJZKGRiZ2ludGVycnVwdCkKIAlTQVZFX0FMTF9JTlQKLQltb3ZlcQkjLTEsJWQwCi0JbW92ZWwJJWQwLCVzcEAoUFRfT0ZGX09SSUdfRDApCisJR0VUX0NVUlJFTlQoJWQwKQogCW1vdmVsCSVzcCwlc3BALSAJCS8qIHN0YWNrIGZyYW1lIHBvaW50ZXIgYXJndW1lbnQgKi8KIAlqc3IJZGJnaW50ZXJydXB0X2MKIAlhZGRxbAkjNCwlc3AKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvaW5pdF90YXNrLmMgYi9hcmNoL202OGsva2VybmVsL2luaXRfdGFzay5jCmluZGV4IGNiZjlkYzMuLmM3NDRjZmMgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvaW5pdF90YXNrLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9pbml0X3Rhc2suYwpAQCAtMTksNyArMTksNiBAQAogICoKICAqIEFsbCBvdGhlciB0YXNrIHN0cnVjdHMgd2lsbCBiZSBhbGxvY2F0ZWQgb24gc2xhYnMgaW4gZm9yay5jCiAgKi8KLV9fYXNtX18oIi5hbGlnbiA0Iik7CiBzdHJ1Y3QgdGFza19zdHJ1Y3QgaW5pdF90YXNrID0gSU5JVF9UQVNLKGluaXRfdGFzayk7CiAKIEVYUE9SVF9TWU1CT0woaW5pdF90YXNrKTsKQEAgLTI3LDcgKzI2LDcgQEAKIC8qCiAgKiBJbml0aWFsIHRocmVhZCBzdHJ1Y3R1cmUuCiAgKgotICogV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGlzIGlzIDgxOTItYnl0ZSBhbGlnbmVkIGR1ZSB0byB0aGUKKyAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBUSFJFQUQgc2l6ZSBhbGlnbmVkIGR1ZSB0byB0aGUKICAqIHdheSBwcm9jZXNzIHN0YWNrcyBhcmUgaGFuZGxlZC4gVGhpcyBpcyBkb25lIGJ5IGhhdmluZyBhIHNwZWNpYWwKICAqICJpbml0X3Rhc2siIGxpbmtlciBtYXAgZW50cnkuLgogICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL202OGtfa3N5bXMuYyBiL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCmluZGV4IDFiN2ExNGQuLjc3NGMxYmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvbTY4a19rc3ltcy5jCkBAIC0xNCw3ICsxNCw3IEBACiBFWFBPUlRfU1lNQk9MKF9fbHNocmRpMyk7CiBFWFBPUlRfU1lNQk9MKF9fbXVsZGkzKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX002ODAwMCkgfHwgZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCisjaWYgZGVmaW5lZChDT05GSUdfQ1BVX0hBU19OT19NVUxESVY2NCkKIC8qCiAgKiBTaW1wbGVyIDY4ayBhbmQgQ29sZEZpcmUgcGFydHMgYWxzbyBuZWVkIGEgZmV3IG90aGVyIGdjYyBmdW5jdGlvbnMuCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvcHJvY2Vzc19tbS5jIGIvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzX21tLmMKaW5kZXggMWJjMjIzYS4uMTI1ZjM0ZSAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzX21tLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9wcm9jZXNzX21tLmMKQEAgLTMzLDIyICszMyw2IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KIAotLyoKLSAqIEluaXRpYWwgdGFzay90aHJlYWQgc3RydWN0dXJlLiBNYWtlIHRoaXMgYSBwZXItYXJjaGl0ZWN0dXJlIHRoaW5nLAotICogYmVjYXVzZSBkaWZmZXJlbnQgYXJjaGl0ZWN0dXJlcyB0ZW5kIHRvIGhhdmUgZGlmZmVyZW50Ci0gKiBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzIGFuZCBwb3RlbnRpYWxseSBkaWZmZXJlbnQgaW5pdGlhbAotICogc2V0dXAuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCBpbml0X3NpZ25hbHMgPSBJTklUX1NJR05BTFMoaW5pdF9zaWduYWxzKTsKLXN0YXRpYyBzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgaW5pdF9zaWdoYW5kID0gSU5JVF9TSUdIQU5EKGluaXRfc2lnaGFuZCk7Ci11bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90aHJlYWRfdW5pb24gX19pbml0X3Rhc2tfZGF0YQotCV9fYXR0cmlidXRlX18oKGFsaWduZWQoVEhSRUFEX1NJWkUpKSkgPQotCQl7IElOSVRfVEhSRUFEX0lORk8oaW5pdF90YXNrKSB9OwotCi0vKiBpbml0aWFsIHRhc2sgc3RydWN0dXJlICovCi1zdHJ1Y3QgdGFza19zdHJ1Y3QgaW5pdF90YXNrID0gSU5JVF9UQVNLKGluaXRfdGFzayk7Ci0KLUVYUE9SVF9TWU1CT0woaW5pdF90YXNrKTsKIAogYXNtbGlua2FnZSB2b2lkIHJldF9mcm9tX2Zvcmsodm9pZCk7CiAKQEAgLTE4OCw5ICsxNzIsNyBAQAogCiAJY3VycmVudC0+dGhyZWFkLmZzID0gX19VU0VSX0RTOwogCWlmICghRlBVX0lTX0VNVSkKLQkJYXNtIHZvbGF0aWxlICgiLmNoaXAgNjhrLzY4ODgxXG5cdCIKLQkJCSAgICAgICJmcmVzdG9yZSAlMEBcblx0IgotCQkJICAgICAgIi5jaGlwIDY4ayIgOiA6ICJhIiAoJnplcm8pKTsKKwkJYXNtIHZvbGF0aWxlICgiZnJlc3RvcmUgJTBAIiA6IDogImEiICgmemVybykgOiAibWVtb3J5Iik7CiB9CiAKIC8qCkBAIC0yNjQsMTEgKzI0NiwyOCBAQAogCQkvKiBDb3B5IHRoZSBjdXJyZW50IGZwdSBzdGF0ZSAqLwogCQlhc20gdm9sYXRpbGUgKCJmc2F2ZSAlMCIgOiA6ICJtIiAocC0+dGhyZWFkLmZwc3RhdGVbMF0pIDogIm1lbW9yeSIpOwogCi0JCWlmICghQ1BVX0lTXzA2MCA/IHAtPnRocmVhZC5mcHN0YXRlWzBdIDogcC0+dGhyZWFkLmZwc3RhdGVbMl0pCi0JCSAgYXNtIHZvbGF0aWxlICgiZm1vdmVteCAlL2ZwMC0lL2ZwNywlMFxuXHQiCi0JCQkJImZtb3ZlbWwgJS9mcGlhci8lL2ZwY3IvJS9mcHNyLCUxIgotCQkJCTogOiAibSIgKHAtPnRocmVhZC5mcFswXSksICJtIiAocC0+dGhyZWFkLmZwY250bFswXSkKLQkJCQk6ICJtZW1vcnkiKTsKKwkJaWYgKCFDUFVfSVNfMDYwID8gcC0+dGhyZWFkLmZwc3RhdGVbMF0gOiBwLT50aHJlYWQuZnBzdGF0ZVsyXSkgeworCQkJaWYgKENQVV9JU19DT0xERklSRSkgeworCQkJCWFzbSB2b2xhdGlsZSAoImZtb3ZlbWQgJS9mcDAtJS9mcDcsJTBcblx0IgorCQkJCQkgICAgICAiZm1vdmVsICUvZnBpYXIsJTFcblx0IgorCQkJCQkgICAgICAiZm1vdmVsICUvZnBjciwlMlxuXHQiCisJCQkJCSAgICAgICJmbW92ZWwgJS9mcHNyLCUzIgorCQkJCQkgICAgICA6CisJCQkJCSAgICAgIDogIm0iIChwLT50aHJlYWQuZnBbMF0pLAorCQkJCQkJIm0iIChwLT50aHJlYWQuZnBjbnRsWzBdKSwKKwkJCQkJCSJtIiAocC0+dGhyZWFkLmZwY250bFsxXSksCisJCQkJCQkibSIgKHAtPnRocmVhZC5mcGNudGxbMl0pCisJCQkJCSAgICAgIDogIm1lbW9yeSIpOworCQkJfSBlbHNlIHsKKwkJCQlhc20gdm9sYXRpbGUgKCJmbW92ZW14ICUvZnAwLSUvZnA3LCUwXG5cdCIKKwkJCQkJICAgICAgImZtb3ZlbWwgJS9mcGlhci8lL2ZwY3IvJS9mcHNyLCUxIgorCQkJCQkgICAgICA6CisJCQkJCSAgICAgIDogIm0iIChwLT50aHJlYWQuZnBbMF0pLAorCQkJCQkJIm0iIChwLT50aHJlYWQuZnBjbnRsWzBdKQorCQkJCQkgICAgICA6ICJtZW1vcnkiKTsKKwkJCX0KKwkJfQorCiAJCS8qIFJlc3RvcmUgdGhlIHN0YXRlIGluIGNhc2UgdGhlIGZwdSB3YXMgYnVzeSAqLwogCQlhc20gdm9sYXRpbGUgKCJmcmVzdG9yZSAlMCIgOiA6ICJtIiAocC0+dGhyZWFkLmZwc3RhdGVbMF0pKTsKIAl9CkBAIC0zMDEsMTIgKzMwMCwyOCBAQAogCWlmICghQ1BVX0lTXzA2MCA/ICFmcHVzdGF0ZVswXSA6ICFmcHVzdGF0ZVsyXSkKIAkJcmV0dXJuIDA7CiAKLQlhc20gdm9sYXRpbGUgKCJmbW92ZW0gJS9mcGlhci8lL2ZwY3IvJS9mcHNyLCUwIgotCQk6OiAibSIgKGZwdS0+ZnBjbnRsWzBdKQotCQk6ICJtZW1vcnkiKTsKLQlhc20gdm9sYXRpbGUgKCJmbW92ZW14ICUvZnAwLSUvZnA3LCUwIgotCQk6OiAibSIgKGZwdS0+ZnByZWdzWzBdKQotCQk6ICJtZW1vcnkiKTsKKwlpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CisJCWFzbSB2b2xhdGlsZSAoImZtb3ZlbCAlL2ZwaWFyLCUwXG5cdCIKKwkJCSAgICAgICJmbW92ZWwgJS9mcGNyLCUxXG5cdCIKKwkJCSAgICAgICJmbW92ZWwgJS9mcHNyLCUyXG5cdCIKKwkJCSAgICAgICJmbW92ZW1kICUvZnAwLSUvZnA3LCUzIgorCQkJICAgICAgOgorCQkJICAgICAgOiAibSIgKGZwdS0+ZnBjbnRsWzBdKSwKKwkJCQkibSIgKGZwdS0+ZnBjbnRsWzFdKSwKKwkJCQkibSIgKGZwdS0+ZnBjbnRsWzJdKSwKKwkJCQkibSIgKGZwdS0+ZnByZWdzWzBdKQorCQkJICAgICAgOiAibWVtb3J5Iik7CisJfSBlbHNlIHsKKwkJYXNtIHZvbGF0aWxlICgiZm1vdmVtICUvZnBpYXIvJS9mcGNyLyUvZnBzciwlMCIKKwkJCSAgICAgIDoKKwkJCSAgICAgIDogIm0iIChmcHUtPmZwY250bFswXSkKKwkJCSAgICAgIDogIm1lbW9yeSIpOworCQlhc20gdm9sYXRpbGUgKCJmbW92ZW14ICUvZnAwLSUvZnA3LCUwIgorCQkJICAgICAgOgorCQkJICAgICAgOiAibSIgKGZwdS0+ZnByZWdzWzBdKQorCQkJICAgICAgOiAibWVtb3J5Iik7CisJfQorCiAJcmV0dXJuIDE7CiB9CiBFWFBPUlRfU1lNQk9MKGR1bXBfZnB1KTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlX21tLmMgYi9hcmNoL202OGsva2VybmVsL3B0cmFjZV9tbS5jCmluZGV4IDBiMjUyNjguLjdiYzk5OWIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvcHRyYWNlX21tLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9wdHJhY2VfbW0uYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3VzZXIuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZWhvb2suaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KQEAgLTI3NSwzICsyNzYsMjAgQEAKIAkJY3VycmVudC0+ZXhpdF9jb2RlID0gMDsKIAl9CiB9CisKKyNpZmRlZiBDT05GSUdfQ09MREZJUkUKK2FzbWxpbmthZ2UgaW50IHN5c2NhbGxfdHJhY2VfZW50ZXIodm9pZCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICh0ZXN0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMX1RSQUNFKSkKKwkJcmV0ID0gdHJhY2Vob29rX3JlcG9ydF9zeXNjYWxsX2VudHJ5KHRhc2tfcHRfcmVncyhjdXJyZW50KSk7CisJcmV0dXJuIHJldDsKK30KKworYXNtbGlua2FnZSB2b2lkIHN5c2NhbGxfdHJhY2VfbGVhdmUodm9pZCkKK3sKKwlpZiAodGVzdF90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTF9UUkFDRSkpCisJCXRyYWNlaG9va19yZXBvcnRfc3lzY2FsbF9leGl0KHRhc2tfcHRfcmVncyhjdXJyZW50KSwgMCk7Cit9CisjZW5kaWYgLyogQ09ORklHX0NPTERGSVJFICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3NldHVwX21tLmMgYi9hcmNoL202OGsva2VybmVsL3NldHVwX21tLmMKaW5kZXggYzNiNDUwNi4uZDg3MmNlNCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9tbS5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbW0uYwpAQCAtMjIxLDcgKzIyMSw4IEBACiAjZW5kaWYKIAogCS8qIFRoZSBib290aW5mbyBpcyBsb2NhdGVkIHJpZ2h0IGFmdGVyIHRoZSBrZXJuZWwgYnNzICovCi0JbTY4a19wYXJzZV9ib290aW5mbygoY29uc3Qgc3RydWN0IGJpX3JlY29yZCAqKV9lbmQpOworCWlmICghQ1BVX0lTX0NPTERGSVJFKQorCQltNjhrX3BhcnNlX2Jvb3RpbmZvKChjb25zdCBzdHJ1Y3QgYmlfcmVjb3JkICopX2VuZCk7CiAKIAlpZiAoQ1BVX0lTXzA0MCkKIAkJbTY4a19pczA0MG9yMDYwID0gNDsKQEAgLTIzNSw3ICsyMzYsNyBAQAogCSAqICB3aXRoIHRoZW0sIHdlIHNob3VsZCBhZGQgYSB0ZXN0IHRvIGNoZWNrX2J1Z3MoKSBiZWxvd10gKi8KICNpZm5kZWYgQ09ORklHX002OEtGUFVfRU1VX09OTFkKIAkvKiBjbGVhciB0aGUgZnB1IGlmIHdlIGhhdmUgb25lICovCi0JaWYgKG02OGtfZnB1dHlwZSAmIChGUFVfNjg4ODF8RlBVXzY4ODgyfEZQVV82ODA0MHxGUFVfNjgwNjApKSB7CisJaWYgKG02OGtfZnB1dHlwZSAmIChGUFVfNjg4ODF8RlBVXzY4ODgyfEZQVV82ODA0MHxGUFVfNjgwNjB8RlBVX0NPTERGSVJFKSkgewogCQl2b2xhdGlsZSBpbnQgemVybyA9IDA7CiAJCWFzbSB2b2xhdGlsZSAoImZyZXN0b3JlICUwIiA6IDogIm0iICh6ZXJvKSk7CiAJfQpAQCAtMjU4LDYgKzI1OSwxMCBAQAogCWluaXRfbW0uZW5kX2RhdGEgPSAodW5zaWduZWQgbG9uZylfZWRhdGE7CiAJaW5pdF9tbS5icmsgPSAodW5zaWduZWQgbG9uZylfZW5kOwogCisjaWYgZGVmaW5lZChDT05GSUdfQk9PVFBBUkFNKQorCXN0cm5jcHkobTY4a19jb21tYW5kX2xpbmUsIENPTkZJR19CT09UUEFSQU1fU1RSSU5HLCBDTF9TSVpFKTsKKwltNjhrX2NvbW1hbmRfbGluZVtDTF9TSVpFIC0gMV0gPSAwOworI2VuZGlmIC8qIENPTkZJR19CT09UUEFSQU0gKi8KIAkqY21kbGluZV9wID0gbTY4a19jb21tYW5kX2xpbmU7CiAJbWVtY3B5KGJvb3RfY29tbWFuZF9saW5lLCAqY21kbGluZV9wLCBDTF9TSVpFKTsKIApAQCAtMzIzLDYgKzMyOCwxMSBAQAogCQljb25maWdfc3VuM3goKTsKIAkJYnJlYWs7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ09MREZJUkUKKwljYXNlIE1BQ0hfTTU0WFg6CisJCWNvbmZpZ19CU1AoTlVMTCwgMCk7CisJCWJyZWFrOworI2VuZGlmCiAJZGVmYXVsdDoKIAkJcGFuaWMoIk5vIGNvbmZpZ3VyYXRpb24gc2V0dXAiKTsKIAl9CkBAIC0zODQsNiArMzk0LDcgQEAKICNkZWZpbmUgTE9PUF9DWUNMRVNfNjgwMzAJKDgpCiAjZGVmaW5lIExPT1BfQ1lDTEVTXzY4MDQwCSgzKQogI2RlZmluZSBMT09QX0NZQ0xFU182ODA2MAkoMSkKKyNkZWZpbmUgTE9PUF9DWUNMRVNfQ09MREZJUkUJKDIpCiAKIAlpZiAoQ1BVX0lTXzAyMCkgewogCQljcHUgPSAiNjgwMjAiOwpAQCAtMzk3LDYgKzQwOCw5IEBACiAJfSBlbHNlIGlmIChDUFVfSVNfMDYwKSB7CiAJCWNwdSA9ICI2ODA2MCI7CiAJCWNsb2NrZmFjdG9yID0gTE9PUF9DWUNMRVNfNjgwNjA7CisJfSBlbHNlIGlmIChDUFVfSVNfQ09MREZJUkUpIHsKKwkJY3B1ID0gIkNvbGRGaXJlIjsKKwkJY2xvY2tmYWN0b3IgPSBMT09QX0NZQ0xFU19DT0xERklSRTsKIAl9IGVsc2UgewogCQljcHUgPSAiNjgweDAiOwogCQljbG9ja2ZhY3RvciA9IDA7CkBAIC00MTUsNiArNDI5LDggQEAKIAkJZnB1ID0gIjY4MDYwIjsKIAllbHNlIGlmIChtNjhrX2ZwdXR5cGUgJiBGUFVfU1VORlBBKQogCQlmcHUgPSAiU3VuIEZQQSI7CisJZWxzZSBpZiAobTY4a19mcHV0eXBlICYgRlBVX0NPTERGSVJFKQorCQlmcHUgPSAiQ29sZEZpcmUiOwogCWVsc2UKIAkJZnB1ID0gIm5vbmUiOwogI2VuZGlmCkBAIC00MzEsNiArNDQ3LDggQEAKIAkJbW11ID0gIlN1bi0zIjsKIAllbHNlIGlmIChtNjhrX21tdXR5cGUgJiBNTVVfQVBPTExPKQogCQltbXUgPSAiQXBvbGxvIjsKKwllbHNlIGlmIChtNjhrX21tdXR5cGUgJiBNTVVfQ09MREZJUkUpCisJCW1tdSA9ICJDb2xkRmlyZSI7CiAJZWxzZQogCQltbXUgPSAidW5rbm93biI7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbm8uYyBiL2FyY2gvbTY4ay9rZXJuZWwvc2V0dXBfbm8uYwppbmRleCAyZWQ4YzBmLi5jYTNkZjBkIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3NldHVwX25vLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zZXR1cF9uby5jCkBAIC00Nyw3ICs0Nyw2IEBACiBjaGFyIF9faW5pdGRhdGEgY29tbWFuZF9saW5lW0NPTU1BTkRfTElORV9TSVpFXTsKIAogLyogbWFjaGluZSBkZXBlbmRlbnQgdGltZXIgZnVuY3Rpb25zICovCi12b2lkICgqbWFjaF9nZXR0b2QpKGludCosIGludCosIGludCosIGludCosIGludCosIGludCopOwogaW50ICgqbWFjaF9zZXRfY2xvY2tfbW1zcykodW5zaWduZWQgbG9uZyk7CiAKIC8qIG1hY2hpbmUgZGVwZW5kZW50IHJlYm9vdCBmdW5jdGlvbnMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsX21tLmMgYi9hcmNoL202OGsva2VybmVsL3NpZ25hbF9tbS5jCmluZGV4IGEwYWZjMjMuLmNiODU2ZjkgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvc2lnbmFsX21tLmMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC9zaWduYWxfbW0uYwpAQCAtNTYsNyArNTYsMTEgQEAKICAgWzFdCT0gLTEsIC8qIHNpemVvZigoKHN0cnVjdCBmcmFtZSAqKTApLT51bi5mbXQxKSwgKi8KICAgWzJdCT0gc2l6ZW9mKCgoc3RydWN0IGZyYW1lICopMCktPnVuLmZtdDIpLAogICBbM10JPSBzaXplb2YoKChzdHJ1Y3QgZnJhbWUgKikwKS0+dW4uZm10MyksCisjaWZkZWYgQ09ORklHX0NPTERGSVJFCisgIFs0XQk9IDAsCisjZWxzZQogICBbNF0JPSBzaXplb2YoKChzdHJ1Y3QgZnJhbWUgKikwKS0+dW4uZm10NCksCisjZW5kaWYKICAgWzVdCT0gLTEsIC8qIHNpemVvZigoKHN0cnVjdCBmcmFtZSAqKTApLT51bi5mbXQ1KSwgKi8KICAgWzZdCT0gLTEsIC8qIHNpemVvZigoKHN0cnVjdCBmcmFtZSAqKTApLT51bi5mbXQ2KSwgKi8KICAgWzddCT0gc2l6ZW9mKCgoc3RydWN0IGZyYW1lICopMCktPnVuLmZtdDcpLApAQCAtODQsNyArODgsMTEgQEAKIAlyZWdzLT5zdGthZGogPSBmcmFtZV9leHRyYV9zaXplc1tyZWdzLT5mb3JtYXRdOwogCXRyZWdzID0JKHN0cnVjdCBwdF9yZWdzICopKChsb25nKXJlZ3MgKyByZWdzLT5zdGthZGopOwogCXRyZWdzLT52ZWN0b3IgPSByZWdzLT52ZWN0b3I7CisjaWZkZWYgQ09ORklHX0NPTERGSVJFCisJdHJlZ3MtPmZvcm1hdCA9IDQ7CisjZWxzZQogCXRyZWdzLT5mb3JtYXQgPSAwOworI2VuZGlmCiAJdHJlZ3MtPnBjID0gZml4dXAtPmZpeHVwOwogCXRyZWdzLT5zciA9IHJlZ3MtPnNyOwogCkBAIC0xOTUsNyArMjAzLDggQEAKIAogCWlmIChDUFVfSVNfMDYwID8gc2MtPnNjX2Zwc3RhdGVbMl0gOiBzYy0+c2NfZnBzdGF0ZVswXSkgewogCSAgICAvKiBWZXJpZnkgdGhlIGZyYW1lIGZvcm1hdC4gICovCi0JICAgIGlmICghQ1BVX0lTXzA2MCAmJiAoc2MtPnNjX2Zwc3RhdGVbMF0gIT0gZnB1X3ZlcnNpb24pKQorCSAgICBpZiAoIShDUFVfSVNfMDYwIHx8IENQVV9JU19DT0xERklSRSkgJiYKKwkJIChzYy0+c2NfZnBzdGF0ZVswXSAhPSBmcHVfdmVyc2lvbikpCiAJCWdvdG8gb3V0OwogCSAgICBpZiAoQ1BVX0lTXzAyMF9PUl8wMzApIHsKIAkJaWYgKG02OGtfZnB1dHlwZSAmIEZQVV82ODg4MSAmJgpAQCAtMjE0LDE5ICsyMjMsNDMgQEAKICAgICAgICAgICAgICAgICAgICAgICBzYy0+c2NfZnBzdGF0ZVszXSA9PSAweDYwIHx8CiAJCSAgICAgIHNjLT5zY19mcHN0YXRlWzNdID09IDB4ZTApKQogCQkgICAgZ290byBvdXQ7CisJICAgIH0gZWxzZSBpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CisJCWlmICghKHNjLT5zY19mcHN0YXRlWzBdID09IDB4MDAgfHwKKwkJICAgICAgc2MtPnNjX2Zwc3RhdGVbMF0gPT0gMHgwNSB8fAorCQkgICAgICBzYy0+c2NfZnBzdGF0ZVswXSA9PSAweGU1KSkKKwkJICAgIGdvdG8gb3V0OwogCSAgICB9IGVsc2UKIAkJZ290byBvdXQ7CiAKLQkgICAgX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCi0JCQkgICAgICAiZm1vdmVteCAlMCwlJWZwMC0lJWZwMVxuXHQiCi0JCQkgICAgICAiZm1vdmVtbCAlMSwlJWZwY3IvJSVmcHNyLyUlZnBpYXJcblx0IgotCQkJICAgICAgIi5jaGlwIDY4ayIKLQkJCSAgICAgIDogLyogbm8gb3V0cHV0cyAqLwotCQkJICAgICAgOiAibSIgKCpzYy0+c2NfZnByZWdzKSwgIm0iICgqc2MtPnNjX2ZwY250bCkpOworCSAgICBpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CisJCV9fYXNtX18gdm9sYXRpbGUgKCJmbW92ZW1kICUwLCUlZnAwLSUlZnAxXG5cdCIKKwkJCQkgICJmbW92ZWwgJTEsJSVmcGNyXG5cdCIKKwkJCQkgICJmbW92ZWwgJTIsJSVmcHNyXG5cdCIKKwkJCQkgICJmbW92ZWwgJTMsJSVmcGlhciIKKwkJCQkgIDogLyogbm8gb3V0cHV0cyAqLworCQkJCSAgOiAibSIgKHNjLT5zY19mcHJlZ3NbMF0pLAorCQkJCSAgICAibSIgKHNjLT5zY19mcGNudGxbMF0pLAorCQkJCSAgICAibSIgKHNjLT5zY19mcGNudGxbMV0pLAorCQkJCSAgICAibSIgKHNjLT5zY19mcGNudGxbMl0pKTsKKwkgICAgfSBlbHNlIHsKKwkJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCisJCQkJICAiZm1vdmVteCAlMCwlJWZwMC0lJWZwMVxuXHQiCisJCQkJICAiZm1vdmVtbCAlMSwlJWZwY3IvJSVmcHNyLyUlZnBpYXJcblx0IgorCQkJCSAgIi5jaGlwIDY4ayIKKwkJCQkgIDogLyogbm8gb3V0cHV0cyAqLworCQkJCSAgOiAibSIgKCpzYy0+c2NfZnByZWdzKSwKKwkJCQkgICAgIm0iICgqc2MtPnNjX2ZwY250bCkpOworCSAgICB9CiAJfQotCV9fYXNtX18gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgotCQkJICAiZnJlc3RvcmUgJTBcblx0IgotCQkJICAiLmNoaXAgNjhrIiA6IDogIm0iICgqc2MtPnNjX2Zwc3RhdGUpKTsKKworCWlmIChDUFVfSVNfQ09MREZJUkUpIHsKKwkJX19hc21fXyB2b2xhdGlsZSAoImZyZXN0b3JlICUwIiA6IDogIm0iICgqc2MtPnNjX2Zwc3RhdGUpKTsKKwl9IGVsc2UgeworCQlfX2FzbV9fIHZvbGF0aWxlICgiLmNoaXAgNjhrLzY4ODgxXG5cdCIKKwkJCQkgICJmcmVzdG9yZSAlMFxuXHQiCisJCQkJICAiLmNoaXAgNjhrIgorCQkJCSAgOiA6ICJtIiAoKnNjLT5zY19mcHN0YXRlKSk7CisJfQogCWVyciA9IDA7CiAKIG91dDoKQEAgLTI0MSw3ICsyNzQsNyBAQAogc3RhdGljIGlubGluZSBpbnQgcnRfcmVzdG9yZV9mcHVfc3RhdGUoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMpCiB7CiAJdW5zaWduZWQgY2hhciBmcHN0YXRlW0ZQQ09OVEVYVF9TSVpFXTsKLQlpbnQgY29udGV4dF9zaXplID0gQ1BVX0lTXzA2MCA/IDggOiAwOworCWludCBjb250ZXh0X3NpemUgPSBDUFVfSVNfMDYwID8gOCA6IChDUFVfSVNfQ09MREZJUkUgPyAxMiA6IDApOwogCWZwcmVnc2V0X3QgZnByZWdzOwogCWludCBlcnIgPSAxOwogCkBAIC0yNjAsMTAgKzI5MywxMSBAQAogCWlmIChfX2dldF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSkpCiAJCWdvdG8gb3V0OwogCWlmIChDUFVfSVNfMDYwID8gZnBzdGF0ZVsyXSA6IGZwc3RhdGVbMF0pIHsKLQkJaWYgKCFDUFVfSVNfMDYwKQorCQlpZiAoIShDUFVfSVNfMDYwIHx8IENQVV9JU19DT0xERklSRSkpCiAJCQljb250ZXh0X3NpemUgPSBmcHN0YXRlWzFdOwogCQkvKiBWZXJpZnkgdGhlIGZyYW1lIGZvcm1hdC4gICovCi0JCWlmICghQ1BVX0lTXzA2MCAmJiAoZnBzdGF0ZVswXSAhPSBmcHVfdmVyc2lvbikpCisJCWlmICghKENQVV9JU18wNjAgfHwgQ1BVX0lTX0NPTERGSVJFKSAmJgorCQkgICAgIChmcHN0YXRlWzBdICE9IGZwdV92ZXJzaW9uKSkKIAkJCWdvdG8gb3V0OwogCQlpZiAoQ1BVX0lTXzAyMF9PUl8wMzApIHsKIAkJCWlmIChtNjhrX2ZwdXR5cGUgJiBGUFVfNjg4ODEgJiYKQEAgLTI4MiwyNiArMzE2LDUwIEBACiAJCQkgICAgICBmcHN0YXRlWzNdID09IDB4NjAgfHwKIAkJCSAgICAgIGZwc3RhdGVbM10gPT0gMHhlMCkpCiAJCQkJZ290byBvdXQ7CisJCX0gZWxzZSBpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CisJCQlpZiAoIShmcHN0YXRlWzNdID09IDB4MDAgfHwKKwkJCSAgICAgIGZwc3RhdGVbM10gPT0gMHgwNSB8fAorCQkJICAgICAgZnBzdGF0ZVszXSA9PSAweGU1KSkKKwkJCQlnb3RvIG91dDsKIAkJfSBlbHNlCiAJCQlnb3RvIG91dDsKIAkJaWYgKF9fY29weV9mcm9tX3VzZXIoJmZwcmVncywgJnVjLT51Y19tY29udGV4dC5mcHJlZ3MsCiAJCQkJICAgICBzaXplb2YoZnByZWdzKSkpCiAJCQlnb3RvIG91dDsKLQkJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCi0JCQkJICAiZm1vdmVteCAlMCwlJWZwMC0lJWZwN1xuXHQiCi0JCQkJICAiZm1vdmVtbCAlMSwlJWZwY3IvJSVmcHNyLyUlZnBpYXJcblx0IgotCQkJCSAgIi5jaGlwIDY4ayIKLQkJCQkgIDogLyogbm8gb3V0cHV0cyAqLwotCQkJCSAgOiAibSIgKCpmcHJlZ3MuZl9mcHJlZ3MpLAotCQkJCSAgICAibSIgKCpmcHJlZ3MuZl9mcGNudGwpKTsKKworCQlpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CisJCQlfX2FzbV9fIHZvbGF0aWxlICgiZm1vdmVtZCAlMCwlJWZwMC0lJWZwN1xuXHQiCisJCQkJCSAgImZtb3ZlbCAlMSwlJWZwY3Jcblx0IgorCQkJCQkgICJmbW92ZWwgJTIsJSVmcHNyXG5cdCIKKwkJCQkJICAiZm1vdmVsICUzLCUlZnBpYXIiCisJCQkJCSAgOiAvKiBubyBvdXRwdXRzICovCisJCQkJCSAgOiAibSIgKGZwcmVncy5mX2ZwcmVnc1swXSksCisJCQkJCSAgICAibSIgKGZwcmVncy5mX2ZwY250bFswXSksCisJCQkJCSAgICAibSIgKGZwcmVncy5mX2ZwY250bFsxXSksCisJCQkJCSAgICAibSIgKGZwcmVncy5mX2ZwY250bFsyXSkpOworCQl9IGVsc2UgeworCQkJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCisJCQkJCSAgImZtb3ZlbXggJTAsJSVmcDAtJSVmcDdcblx0IgorCQkJCQkgICJmbW92ZW1sICUxLCUlZnBjci8lJWZwc3IvJSVmcGlhclxuXHQiCisJCQkJCSAgIi5jaGlwIDY4ayIKKwkJCQkJICA6IC8qIG5vIG91dHB1dHMgKi8KKwkJCQkJICA6ICJtIiAoKmZwcmVncy5mX2ZwcmVncyksCisJCQkJCSAgICAibSIgKCpmcHJlZ3MuZl9mcGNudGwpKTsKKwkJfQogCX0KIAlpZiAoY29udGV4dF9zaXplICYmCiAJICAgIF9fY29weV9mcm9tX3VzZXIoZnBzdGF0ZSArIDQsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSArIDEsCiAJCQkgICAgIGNvbnRleHRfc2l6ZSkpCiAJCWdvdG8gb3V0OwotCV9fYXNtX18gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgotCQkJICAiZnJlc3RvcmUgJTBcblx0IgotCQkJICAiLmNoaXAgNjhrIiA6IDogIm0iICgqZnBzdGF0ZSkpOworCisJaWYgKENQVV9JU19DT0xERklSRSkgeworCQlfX2FzbV9fIHZvbGF0aWxlICgiZnJlc3RvcmUgJTAiIDogOiAibSIgKCpmcHN0YXRlKSk7CisJfSBlbHNlIHsKKwkJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCisJCQkJICAiZnJlc3RvcmUgJTBcblx0IgorCQkJCSAgIi5jaGlwIDY4ayIKKwkJCQkgIDogOiAibSIgKCpmcHN0YXRlKSk7CisJfQogCWVyciA9IDA7CiAKIG91dDoKQEAgLTMzNiw4ICszOTQsMTIgQEAKIAkJcmVncy0+Zm9ybWF0ID0gZm9ybWF0dmVjID4+IDEyOwogCQlyZWdzLT52ZWN0b3IgPSBmb3JtYXR2ZWMgJiAweGZmZjsKICNkZWZpbmUgZnJhbWVfb2Zmc2V0IChzaXplb2Yoc3RydWN0IHB0X3JlZ3MpK3NpemVvZihzdHJ1Y3Qgc3dpdGNoX3N0YWNrKSkKLQkJX19hc21fXyBfX3ZvbGF0aWxlX18KLQkJCSgiICAgbW92ZWwgJTAsJS9hMFxuXHQiCisJCV9fYXNtX18gX192b2xhdGlsZV9fICgKKyNpZmRlZiBDT05GSUdfQ09MREZJUkUKKwkJCSAiICAgbW92ZWwgJTAsJS9zcFxuXHQiCisJCQkgIiAgIGJyYSByZXRfZnJvbV9zaWduYWxcbiIKKyNlbHNlCisJCQkgIiAgIG1vdmVsICUwLCUvYTBcblx0IgogCQkJICIgICBzdWJsICUxLCUvYTBcblx0IiAgICAgLyogbWFrZSByb29tIG9uIHN0YWNrICovCiAJCQkgIiAgIG1vdmVsICUvYTAsJS9zcFxuXHQiICAvKiBzZXQgc3RhY2sgcG9pbnRlciAqLwogCQkJIC8qIG1vdmUgc3dpdGNoX3N0YWNrIGFuZCBwdF9yZWdzICovCkBAIC0zNTAsNiArNDEyLDcgQEAKIAkJCSAiMjogbW92ZWwgJTRAKywlL2EwQCtcblx0IgogCQkJICIgICBkYnJhICUxLDJiXG5cdCIKIAkJCSAiICAgYnJhbCByZXRfZnJvbV9zaWduYWxcbiIKKyNlbmRpZgogCQkJIDogLyogbm8gb3V0cHV0cywgaXQgZG9lc24ndCBldmVyIHJldHVybiAqLwogCQkJIDogImEiIChzdyksICJkIiAoZnNpemUpLCAiZCIgKGZyYW1lX29mZnNldC80LTEpLAogCQkJICAgIm4iIChmcmFtZV9vZmZzZXQpLCAiYSIgKGJ1ZiArIGZzaXplLzQpCkBAIC01MTYsMTAgKzU3OSwxNSBAQAogCQlyZXR1cm47CiAJfQogCi0JX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCi0JCQkgICJmc2F2ZSAlMFxuXHQiCi0JCQkgICIuY2hpcCA2OGsiCi0JCQkgIDogOiAibSIgKCpzYy0+c2NfZnBzdGF0ZSkgOiAibWVtb3J5Iik7CisJaWYgKENQVV9JU19DT0xERklSRSkgeworCQlfX2FzbV9fIHZvbGF0aWxlICgiZnNhdmUgJTAiCisJCQkJICA6IDogIm0iICgqc2MtPnNjX2Zwc3RhdGUpIDogIm1lbW9yeSIpOworCX0gZWxzZSB7CisJCV9fYXNtX18gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgorCQkJCSAgImZzYXZlICUwXG5cdCIKKwkJCQkgICIuY2hpcCA2OGsiCisJCQkJICA6IDogIm0iICgqc2MtPnNjX2Zwc3RhdGUpIDogIm1lbW9yeSIpOworCX0KIAogCWlmIChDUFVfSVNfMDYwID8gc2MtPnNjX2Zwc3RhdGVbMl0gOiBzYy0+c2NfZnBzdGF0ZVswXSkgewogCQlmcHVfdmVyc2lvbiA9IHNjLT5zY19mcHN0YXRlWzBdOwpAQCAtNTMwLDIxICs1OTgsMzUgQEAKIAkJCWlmICgqKHVuc2lnbmVkIHNob3J0ICopIHNjLT5zY19mcHN0YXRlID09IDB4MWYzOCkKIAkJCQlzYy0+c2NfZnBzdGF0ZVsweDM4XSB8PSAxIDw8IDM7CiAJCX0KLQkJX19hc21fXyB2b2xhdGlsZSAoIi5jaGlwIDY4ay82ODg4MVxuXHQiCi0JCQkJICAiZm1vdmVteCAlJWZwMC0lJWZwMSwlMFxuXHQiCi0JCQkJICAiZm1vdmVtbCAlJWZwY3IvJSVmcHNyLyUlZnBpYXIsJTFcblx0IgotCQkJCSAgIi5jaGlwIDY4ayIKLQkJCQkgIDogIj1tIiAoKnNjLT5zY19mcHJlZ3MpLAotCQkJCSAgICAiPW0iICgqc2MtPnNjX2ZwY250bCkKLQkJCQkgIDogLyogbm8gaW5wdXRzICovCi0JCQkJICA6ICJtZW1vcnkiKTsKKworCQlpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CisJCQlfX2FzbV9fIHZvbGF0aWxlICgiZm1vdmVtZCAlJWZwMC0lJWZwMSwlMFxuXHQiCisJCQkJCSAgImZtb3ZlbCAlJWZwY3IsJTFcblx0IgorCQkJCQkgICJmbW92ZWwgJSVmcHNyLCUyXG5cdCIKKwkJCQkJICAiZm1vdmVsICUlZnBpYXIsJTMiCisJCQkJCSAgOiAiPW0iIChzYy0+c2NfZnByZWdzWzBdKSwKKwkJCQkJICAgICI9bSIgKHNjLT5zY19mcGNudGxbMF0pLAorCQkJCQkgICAgIj1tIiAoc2MtPnNjX2ZwY250bFsxXSksCisJCQkJCSAgICAiPW0iIChzYy0+c2NfZnBjbnRsWzJdKQorCQkJCQkgIDogLyogbm8gaW5wdXRzICovCisJCQkJCSAgOiAibWVtb3J5Iik7CisJCX0gZWxzZSB7CisJCQlfX2FzbV9fIHZvbGF0aWxlICgiLmNoaXAgNjhrLzY4ODgxXG5cdCIKKwkJCQkJICAiZm1vdmVteCAlJWZwMC0lJWZwMSwlMFxuXHQiCisJCQkJCSAgImZtb3ZlbWwgJSVmcGNyLyUlZnBzci8lJWZwaWFyLCUxXG5cdCIKKwkJCQkJICAiLmNoaXAgNjhrIgorCQkJCQkgIDogIj1tIiAoKnNjLT5zY19mcHJlZ3MpLAorCQkJCQkgICAgIj1tIiAoKnNjLT5zY19mcGNudGwpCisJCQkJCSAgOiAvKiBubyBpbnB1dHMgKi8KKwkJCQkJICA6ICJtZW1vcnkiKTsKKwkJfQogCX0KIH0KIAogc3RhdGljIGlubGluZSBpbnQgcnRfc2F2ZV9mcHVfc3RhdGUoc3RydWN0IHVjb250ZXh0IF9fdXNlciAqdWMsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewogCXVuc2lnbmVkIGNoYXIgZnBzdGF0ZVtGUENPTlRFWFRfU0laRV07Ci0JaW50IGNvbnRleHRfc2l6ZSA9IENQVV9JU18wNjAgPyA4IDogMDsKKwlpbnQgY29udGV4dF9zaXplID0gQ1BVX0lTXzA2MCA/IDggOiAoQ1BVX0lTX0NPTERGSVJFID8gMTIgOiAwKTsKIAlpbnQgZXJyID0gMDsKIAogCWlmIChGUFVfSVNfRU1VKSB7CkBAIC01NTcsMTUgKzYzOSwxOSBAQAogCQlyZXR1cm4gZXJyOwogCX0KIAotCV9fYXNtX18gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgotCQkJICAiZnNhdmUgJTBcblx0IgotCQkJICAiLmNoaXAgNjhrIgotCQkJICA6IDogIm0iICgqZnBzdGF0ZSkgOiAibWVtb3J5Iik7CisJaWYgKENQVV9JU19DT0xERklSRSkgeworCQlfX2FzbV9fIHZvbGF0aWxlICgiZnNhdmUgJTAiIDogOiAibSIgKCpmcHN0YXRlKSA6ICJtZW1vcnkiKTsKKwl9IGVsc2UgeworCQlfX2FzbV9fIHZvbGF0aWxlICgiLmNoaXAgNjhrLzY4ODgxXG5cdCIKKwkJCQkgICJmc2F2ZSAlMFxuXHQiCisJCQkJICAiLmNoaXAgNjhrIgorCQkJCSAgOiA6ICJtIiAoKmZwc3RhdGUpIDogIm1lbW9yeSIpOworCX0KIAogCWVyciB8PSBfX3B1dF91c2VyKCoobG9uZyAqKWZwc3RhdGUsIChsb25nIF9fdXNlciAqKSZ1Yy0+dWNfZnBzdGF0ZSk7CiAJaWYgKENQVV9JU18wNjAgPyBmcHN0YXRlWzJdIDogZnBzdGF0ZVswXSkgewogCQlmcHJlZ3NldF90IGZwcmVnczsKLQkJaWYgKCFDUFVfSVNfMDYwKQorCQlpZiAoIShDUFVfSVNfMDYwIHx8IENQVV9JU19DT0xERklSRSkpCiAJCQljb250ZXh0X3NpemUgPSBmcHN0YXRlWzFdOwogCQlmcHVfdmVyc2lvbiA9IGZwc3RhdGVbMF07CiAJCWlmIChDUFVfSVNfMDIwX09SXzAzMCAmJgpAQCAtNTc1LDE0ICs2NjEsMjcgQEAKIAkJCWlmICgqKHVuc2lnbmVkIHNob3J0ICopIGZwc3RhdGUgPT0gMHgxZjM4KQogCQkJCWZwc3RhdGVbMHgzOF0gfD0gMSA8PCAzOwogCQl9Ci0JCV9fYXNtX18gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgotCQkJCSAgImZtb3ZlbXggJSVmcDAtJSVmcDcsJTBcblx0IgotCQkJCSAgImZtb3ZlbWwgJSVmcGNyLyUlZnBzci8lJWZwaWFyLCUxXG5cdCIKLQkJCQkgICIuY2hpcCA2OGsiCi0JCQkJICA6ICI9bSIgKCpmcHJlZ3MuZl9mcHJlZ3MpLAotCQkJCSAgICAiPW0iICgqZnByZWdzLmZfZnBjbnRsKQotCQkJCSAgOiAvKiBubyBpbnB1dHMgKi8KLQkJCQkgIDogIm1lbW9yeSIpOworCQlpZiAoQ1BVX0lTX0NPTERGSVJFKSB7CisJCQlfX2FzbV9fIHZvbGF0aWxlICgiZm1vdmVtZCAlJWZwMC0lJWZwNywlMFxuXHQiCisJCQkJCSAgImZtb3ZlbCAlJWZwY3IsJTFcblx0IgorCQkJCQkgICJmbW92ZWwgJSVmcHNyLCUyXG5cdCIKKwkJCQkJICAiZm1vdmVsICUlZnBpYXIsJTMiCisJCQkJCSAgOiAiPW0iIChmcHJlZ3MuZl9mcHJlZ3NbMF0pLAorCQkJCQkgICAgIj1tIiAoZnByZWdzLmZfZnBjbnRsWzBdKSwKKwkJCQkJICAgICI9bSIgKGZwcmVncy5mX2ZwY250bFsxXSksCisJCQkJCSAgICAiPW0iIChmcHJlZ3MuZl9mcGNudGxbMl0pCisJCQkJCSAgOiAvKiBubyBpbnB1dHMgKi8KKwkJCQkJICA6ICJtZW1vcnkiKTsKKwkJfSBlbHNlIHsKKwkJCV9fYXNtX18gdm9sYXRpbGUgKCIuY2hpcCA2OGsvNjg4ODFcblx0IgorCQkJCQkgICJmbW92ZW14ICUlZnAwLSUlZnA3LCUwXG5cdCIKKwkJCQkJICAiZm1vdmVtbCAlJWZwY3IvJSVmcHNyLyUlZnBpYXIsJTFcblx0IgorCQkJCQkgICIuY2hpcCA2OGsiCisJCQkJCSAgOiAiPW0iICgqZnByZWdzLmZfZnByZWdzKSwKKwkJCQkJICAgICI9bSIgKCpmcHJlZ3MuZl9mcGNudGwpCisJCQkJCSAgOiAvKiBubyBpbnB1dHMgKi8KKwkJCQkJICA6ICJtZW1vcnkiKTsKKwkJfQogCQllcnIgfD0gY29weV90b191c2VyKCZ1Yy0+dWNfbWNvbnRleHQuZnByZWdzLCAmZnByZWdzLAogCQkJCSAgICBzaXplb2YoZnByZWdzKSk7CiAJfQpAQCAtNjc5LDggKzc3OCw3IEBACiAJCQkJICAgICAgImNwdXNobCAlJWJjLCglMClcblx0IgogCQkJCSAgICAgICIuY2hpcCA2OGsiCiAJCQkJICAgICAgOiA6ICJhIiAodGVtcCkpOwotCX0KLQllbHNlIHsKKwl9IGVsc2UgaWYgKCFDUFVfSVNfQ09MREZJUkUpIHsKIAkJLyoKIAkJICogNjgwMzAvNjgwMjAgaGF2ZSBubyB3cml0ZWJhY2sgY2FjaGU7CiAJCSAqIHN0aWxsIG5lZWQgdG8gY2xlYXIgaWNhY2hlLgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC9zeXNjYWxsdGFibGUuUyBiL2FyY2gvbTY4ay9rZXJuZWwvc3lzY2FsbHRhYmxlLlMKaW5kZXggYzQ2OGYyZS4uY2U4MjdiMyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC9zeXNjYWxsdGFibGUuUworKysgYi9hcmNoL202OGsva2VybmVsL3N5c2NhbGx0YWJsZS5TCkBAIC0zNjUsNCArMzY1LDYgQEAKIAkubG9uZyBzeXNfY2xvY2tfYWRqdGltZQogCS5sb25nIHN5c19zeW5jZnMKIAkubG9uZyBzeXNfc2V0bnMKKwkubG9uZyBzeXNfcHJvY2Vzc192bV9yZWFkdgkvKiAzNDUgKi8KKwkubG9uZyBzeXNfcHJvY2Vzc192bV93cml0ZXYKIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC90aW1lLmMgYi9hcmNoL202OGsva2VybmVsL3RpbWUuYwppbmRleCBhNWNmNDBjLi43NWFiNzliIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3RpbWUuYworKysgYi9hcmNoL202OGsva2VybmVsL3RpbWUuYwpAQCAtMSw0ICsxLDQgQEAKLSNpZmRlZiBDT05GSUdfTU1VCisjaWYgZGVmaW5lZChDT05GSUdfTU1VKSAmJiAhZGVmaW5lZChDT05GSUdfQ09MREZJUkUpCiAjaW5jbHVkZSAidGltZV9tbS5jIgogI2Vsc2UKICNpbmNsdWRlICJ0aW1lX25vLmMiCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3RpbWVfbm8uYyBiL2FyY2gvbTY4ay9rZXJuZWwvdGltZV9uby5jCmluZGV4IDY2MjM5MDkuLjNlZjBmNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdGltZV9uby5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvdGltZV9uby5jCkBAIC0yNiw2ICsyNiw5IEBACiAKICNkZWZpbmUJVElDS19TSVpFICh0aWNrX25zZWMgLyAxMDAwKQogCisvKiBtYWNoaW5lIGRlcGVuZGVudCB0aW1lciBmdW5jdGlvbnMgKi8KK3ZvaWQgKCptYWNoX2dldHRvZCkoaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50KiwgaW50Kik7CisKIHN0YXRpYyBpbmxpbmUgaW50IHNldF9ydGNfbW1zcyh1bnNpZ25lZCBsb25nIG5vd3RpbWUpCiB7CiAJaWYgKG1hY2hfc2V0X2Nsb2NrX21tc3MpCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3RyYXBzLmMgYi9hcmNoL202OGsva2VybmVsL3RyYXBzLmMKaW5kZXggODkzNjJmMi4uYTc2NDUyYyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvbTY4ay9rZXJuZWwvdHJhcHMuYwpAQCAtNzA2LDYgKzcwNiw4OCBAQAogI2VuZGlmIC8qIENQVV9NNjgwMjBfT1JfTTY4MDMwICovCiAjZW5kaWYgLyogIUNPTkZJR19TVU4zICovCiAKKyNpZiBkZWZpbmVkKENPTkZJR19DT0xERklSRSkgJiYgZGVmaW5lZChDT05GSUdfTU1VKQorI2luY2x1ZGUgPGFzbS9tY2ZtbXUuaD4KKworLyoKKyAqCVRoZSBmb2xsb3dpbmcgdGFibGUgY29udmVydHMgdGhlIEZTIGVuY29kaW5nIG9mIGEgQ29sZEZpcmUKKyAqCWV4Y2VwdGlvbiBzdGFjayBmcmFtZSBpbnRvIHRoZSBlcnJvcl9jb2RlIHZhbHVlIG5lZWRlZCBieQorICoJZG9fZmF1bHQuCisqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZnNfZXJyX2NvZGVbXSA9IHsKKwkwLCAgLyogMDAwMCAqLworCTAsICAvKiAwMDAxICovCisJMCwgIC8qIDAwMTAgKi8KKwkwLCAgLyogMDAxMSAqLworCTEsICAvKiAwMTAwICovCisJMCwgIC8qIDAxMDEgKi8KKwkwLCAgLyogMDExMCAqLworCTAsICAvKiAwMTExICovCisJMiwgIC8qIDEwMDAgKi8KKwkzLCAgLyogMTAwMSAqLworCTIsICAvKiAxMDEwICovCisJMCwgIC8qIDEwMTEgKi8KKwkxLCAgLyogMTEwMCAqLworCTEsICAvKiAxMTAxICovCisJMCwgIC8qIDExMTAgKi8KKwkwICAgLyogMTExMSAqLworfTsKKworc3RhdGljIGlubGluZSB2b2lkIGFjY2Vzc19lcnJvcmNmKHVuc2lnbmVkIGludCBmcywgc3RydWN0IGZyYW1lICpmcCkKK3sKKwl1bnNpZ25lZCBsb25nIG1tdXNyLCBhZGRyOworCXVuc2lnbmVkIGludCBlcnJfY29kZTsKKwlpbnQgbmVlZF9wYWdlX2ZhdWx0OworCisJbW11c3IgPSBtbXVfcmVhZChNTVVTUik7CisJYWRkciA9IG1tdV9yZWFkKE1NVUFSKTsKKworCS8qCisJICogZXJyb3JfY29kZToKKwkgKgliaXQgMCA9PSAwIG1lYW5zIG5vIHBhZ2UgZm91bmQsIDEgbWVhbnMgcHJvdGVjdGlvbiBmYXVsdAorCSAqCWJpdCAxID09IDAgbWVhbnMgcmVhZCwgMSBtZWFucyB3cml0ZQorCSAqLworCXN3aXRjaCAoZnMpIHsKKwljYXNlICA1OiAgLyogMDEwMSBUTEIgb3B3b3JkIFggbWlzcyAqLworCQluZWVkX3BhZ2VfZmF1bHQgPSBjZl90bGJfbWlzcygmZnAtPnB0cmVncywgMCwgMCwgMCk7CisJCWFkZHIgPSBmcC0+cHRyZWdzLnBjOworCQlicmVhazsKKwljYXNlICA2OiAgLyogMDExMCBUTEIgZXh0ZW5zaW9uIHdvcmQgWCBtaXNzICovCisJCW5lZWRfcGFnZV9mYXVsdCA9IGNmX3RsYl9taXNzKCZmcC0+cHRyZWdzLCAwLCAwLCAxKTsKKwkJYWRkciA9IGZwLT5wdHJlZ3MucGMgKyBzaXplb2YobG9uZyk7CisJCWJyZWFrOworCWNhc2UgMTA6ICAvKiAxMDEwIFRMQiBXIG1pc3MgKi8KKwkJbmVlZF9wYWdlX2ZhdWx0ID0gY2ZfdGxiX21pc3MoJmZwLT5wdHJlZ3MsIDEsIDEsIDApOworCQlicmVhazsKKwljYXNlIDE0OiAvKiAxMTEwIFRMQiBSIG1pc3MgKi8KKwkJbmVlZF9wYWdlX2ZhdWx0ID0gY2ZfdGxiX21pc3MoJmZwLT5wdHJlZ3MsIDAsIDEsIDApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiAwMDAwIE5vcm1hbCAgKi8KKwkJLyogMDAwMSBSZXNlcnZlZCAqLworCQkvKiAwMDEwIEludGVycnVwdCBkdXJpbmcgZGVidWcgc2VydmljZSByb3V0aW5lICovCisJCS8qIDAwMTEgUmVzZXJ2ZWQgKi8KKwkJLyogMDEwMCBYIFByb3RlY3Rpb24gKi8KKwkJLyogMDExMSBJRlAgaW4gZW11bGF0b3IgbW9kZSAqLworCQkvKiAxMDAwIFcgUHJvdGVjdGlvbiovCisJCS8qIDEwMDEgV3JpdGUgZXJyb3IqLworCQkvKiAxMDExIFJlc2VydmVkKi8KKwkJLyogMTEwMCBSIFByb3RlY3Rpb24qLworCQkvKiAxMTAxIFIgUHJvdGVjdGlvbiovCisJCS8qIDExMTEgT0VQIGluIGVtdWxhdG9yIG1vZGUqLworCQluZWVkX3BhZ2VfZmF1bHQgPSAxOworCQlicmVhazsKKwl9CisKKwlpZiAobmVlZF9wYWdlX2ZhdWx0KSB7CisJCWVycl9jb2RlID0gZnNfZXJyX2NvZGVbZnNdOworCQlpZiAoKGZzID09IDEzKSAmJiAobW11c3IgJiBNTVVTUl9XRikpIC8qIHJkLW1vZC13ciBhY2Nlc3MgKi8KKwkJCWVycl9jb2RlIHw9IDI7IC8qIGJpdDEgLSB3cml0ZSwgYml0MCAtIHByb3RlY3Rpb24gKi8KKwkJZG9fcGFnZV9mYXVsdCgmZnAtPnB0cmVncywgYWRkciwgZXJyX2NvZGUpOworCX0KK30KKyNlbmRpZiAvKiBDT05GSUdfQ09MREZJUkUgQ09ORklHX01NVSAqLworCiBhc21saW5rYWdlIHZvaWQgYnVzZXJyX2Moc3RydWN0IGZyYW1lICpmcCkKIHsKIAkvKiBPbmx5IHNldCBlc3AwIGlmIGNvbWluZyBmcm9tIHVzZXIgbW9kZSAqLwpAQCAtNzE2LDYgKzc5OCwyOCBAQAogCXByaW50ayAoIioqKiBCdXMgRXJyb3IgKioqIEZvcm1hdCBpcyAleFxuIiwgZnAtPnB0cmVncy5mb3JtYXQpOwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19DT0xERklSRSkgJiYgZGVmaW5lZChDT05GSUdfTU1VKQorCWlmIChDUFVfSVNfQ09MREZJUkUpIHsKKwkJdW5zaWduZWQgaW50IGZzOworCQlmcyA9IChmcC0+cHRyZWdzLnZlY3RvciAmIDB4MykgfAorCQkJKChmcC0+cHRyZWdzLnZlY3RvciAmIDB4YzAwKSA+PiA4KTsKKwkJc3dpdGNoIChmcykgeworCQljYXNlIDB4NToKKwkJY2FzZSAweDY6CisJCWNhc2UgMHg3OgorCQljYXNlIDB4OToKKwkJY2FzZSAweGE6CisJCWNhc2UgMHhkOgorCQljYXNlIDB4ZToKKwkJY2FzZSAweGY6CisJCQlhY2Nlc3NfZXJyb3JjZihmcywgZnApOworCQkJcmV0dXJuOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX0NPTERGSVJFICYmIENPTkZJR19NTVUgKi8KKwogCXN3aXRjaCAoZnAtPnB0cmVncy5mb3JtYXQpIHsKICNpZiBkZWZpbmVkIChDT05GSUdfTTY4MDYwKQogCWNhc2UgNDoJCQkJLyogNjgwNjAgYWNjZXNzIGVycm9yICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgubGRzX25vLlMgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtbm9tbXUubGRzCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIGFyY2gvbTY4ay9rZXJuZWwvdm1saW51eC5sZHNfbm8uUwpyZW5hbWUgdG8gYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LW5vbW11LmxkcwppbmRleCA0ZTIzODkzLi44ZTY2Y2NiIDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgubGRzX25vLlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LW5vbW11LmxkcwpAQCAtNjksNiArNjksNyBAQAogCQlTQ0hFRF9URVhUCiAJCUxPQ0tfVEVYVAogCQkqKC50ZXh0Li5sb2NrKQorCQkqKC5maXh1cCkKIAogCQkuID0gQUxJR04oMTYpOyAgICAgICAgICAvKiBFeGNlcHRpb24gdGFibGUgICAgICAgICAgICAgICovCiAJCV9fc3RhcnRfX19leF90YWJsZSA9IC47CkBAIC0xNjEsNiArMTYyLDEzIEBACiAJCV9lZGF0YSA9IC4gOwogCX0gPiBEQVRBCiAKKwkubTY4a19maXh1cCA6IHsKKwkJX19zdGFydF9maXh1cCA9IC47CisJCSooLm02OGtfZml4dXApCisJCV9fc3RvcF9maXh1cCA9IC47CisJfSA+IERBVEEKKwlOT1RFUyA+IERBVEEKKwogCS5pbml0LnRleHQgOiB7CiAJCS4gPSBBTElHTihQQUdFX1NJWkUpOwogCQlfX2luaXRfYmVnaW4gPSAuOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN0ZC5sZHMgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3RkLmxkcwppbmRleCBkMDk5MzU5Li42MzQwN2M4IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3RkLmxkcworKysgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3RkLmxkcwpAQCAtMzEsNyArMzEsOSBAQAogCiAgIFJXX0RBVEFfU0VDVElPTigxNiwgUEFHRV9TSVpFLCBUSFJFQURfU0laRSkKIAorICBfc2JzcyA9IC47CiAgIEJTU19TRUNUSU9OKDAsIDAsIDApCisgIF9lYnNzID0gLjsKIAogICBfZWRhdGEgPSAuOwkJCS8qIEVuZCBvZiBkYXRhIHNlY3Rpb24gKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4LXN1bjMubGRzCmluZGV4IDgwODA0NjkuLmFkMGY0NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC1zdW4zLmxkcworKysgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgtc3VuMy5sZHMKQEAgLTQ0LDcgKzQ0LDkgQEAKIAkuID0gQUxJR04oUEFHRV9TSVpFKTsKIAlfX2luaXRfZW5kID0gLjsKIAorICBfc2JzcyA9IC47CiAgIEJTU19TRUNUSU9OKDAsIDAsIDApCisgIF9lYnNzID0gLjsKIAogICBfZW5kID0gLiA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvbTY4ay9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCAwMzBkYWJmLi42OWVjNzk2IDEwMDY0NAotLS0gYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgubGRzLlMKKysrIGIvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC0xLDUgKzEsMTQgQEAKLSNpZmRlZiBDT05GSUdfTU1VCi0jaW5jbHVkZSAidm1saW51eC5sZHNfbW0uUyIKKyNpZiBkZWZpbmVkKENPTkZJR19NTVUpICYmICFkZWZpbmVkKENPTkZJR19DT0xERklSRSkKK1BIRFJTCit7CisgIHRleHQgUFRfTE9BRCBGSUxFSERSIFBIRFJTIEZMQUdTICg3KTsKKyAgZGF0YSBQVF9MT0FEIEZMQUdTICg3KTsKK30KKyNpZmRlZiBDT05GSUdfU1VOMworI2luY2x1ZGUgInZtbGludXgtc3VuMy5sZHMiCiAjZWxzZQotI2luY2x1ZGUgInZtbGludXgubGRzX25vLlMiCisjaW5jbHVkZSAidm1saW51eC1zdGQubGRzIgorI2VuZGlmCisjZWxzZQorI2luY2x1ZGUgInZtbGludXgtbm9tbXUubGRzIgogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL202OGsva2VybmVsL3ZtbGludXgubGRzX21tLlMgYi9hcmNoL202OGsva2VybmVsL3ZtbGludXgubGRzX21tLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YmEzMTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9tNjhrL2tlcm5lbC92bWxpbnV4Lmxkc19tbS5TCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotUEhEUlMKLXsKLSAgdGV4dCBQVF9MT0FEIEZJTEVIRFIgUEhEUlMgRkxBR1MgKDcpOwotICBkYXRhIFBUX0xPQUQgRkxBR1MgKDcpOwotfQotI2lmZGVmIENPTkZJR19TVU4zCi0jaW5jbHVkZSAidm1saW51eC1zdW4zLmxkcyIKLSNlbHNlCi0jaW5jbHVkZSAidm1saW51eC1zdGQubGRzIgotI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbGliL01ha2VmaWxlIGIvYXJjaC9tNjhrL2xpYi9NYWtlZmlsZQppbmRleCAxYTFiZDkwLi5hOWQ3ODJkIDEwMDY0NAotLS0gYS9hcmNoL202OGsvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvbTY4ay9saWIvTWFrZWZpbGUKQEAgLTYsOSArNiwxMSBAQAogbGliLXkJOj0gYXNobGRpMy5vIGFzaHJkaTMubyBsc2hyZGkzLm8gbXVsZGkzLm8gXAogCSAgIG1lbWNweS5vIG1lbXNldC5vIG1lbW1vdmUubwogCi1pZmRlZiBDT05GSUdfTU1VCi1saWIteQkrPSBzdHJpbmcubyB1YWNjZXNzLm8gY2hlY2tzdW1fbW0ubwotZWxzZQotbGliLXkJKz0gbXVsc2kzLm8gZGl2c2kzLm8gdWRpdnNpMy5vIG1vZHNpMy5vIHVtb2RzaTMubyBjaGVja3N1bV9uby5vCitsaWItJChDT05GSUdfTU1VKSArPSBzdHJpbmcubyB1YWNjZXNzLm8KK2xpYi0kKENPTkZJR19DUFVfSEFTX05PX01VTERJVjY0KSArPSBtdWxzaTMubyBkaXZzaTMubyB1ZGl2c2kzLm8KK2xpYi0kKENPTkZJR19DUFVfSEFTX05PX01VTERJVjY0KSArPSBtb2RzaTMubyB1bW9kc2kzLm8KKworaWZuZGVmIENPTkZJR19HRU5FUklDX0NTVU0KK2xpYi15CSs9IGNoZWNrc3VtLm8KIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9saWIvY2hlY2tzdW1fbW0uYyBiL2FyY2gvbTY4ay9saWIvY2hlY2tzdW0uYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gYXJjaC9tNjhrL2xpYi9jaGVja3N1bV9tbS5jCnJlbmFtZSB0byBhcmNoL202OGsvbGliL2NoZWNrc3VtLmMKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9saWIvY2hlY2tzdW1fbm8uYyBiL2FyY2gvbTY4ay9saWIvY2hlY2tzdW1fbm8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjNjM1NC4uMDAwMDAwMAotLS0gYS9hcmNoL202OGsvbGliL2NoZWNrc3VtX25vLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIElORVQJCUFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUQ1AvSVAgcHJvdG9jb2wgc3VpdGUgZm9yIHRoZSBMSU5VWAotICoJCW9wZXJhdGluZyBzeXN0ZW0uICBJTkVUIGlzIGltcGxlbWVudGVkIHVzaW5nIHRoZSAgQlNEIFNvY2tldAotICoJCWludGVyZmFjZSBhcyB0aGUgbWVhbnMgb2YgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSB1c2VyIGxldmVsLgotICoKLSAqCQlJUC9UQ1AvVURQIGNoZWNrc3VtbWluZyByb3V0aW5lcwotICoKLSAqIEF1dGhvcnM6CUpvcmdlIEN3aWssIDxqb3JnZUBsYXNlci5zYXRsaW5rLm5ldD4KLSAqCQlBcm50IEd1bGJyYW5kc2VuLCA8YWd1bGJyYUBudmcudW5pdC5ubz4KLSAqCQlUb20gTWF5LCA8ZnRvbUBuZXRjb20uY29tPgotICoJCUFuZHJlYXMgU2Nod2FiLCA8c2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlPgotICoJCUxvdHMgb2YgY29kZSBtb3ZlZCBmcm9tIHRjcC5jIGFuZCBpcC5jOyBzZWUgdGhvc2UgZmlsZXMKLSAqCQlmb3IgbW9yZSBuYW1lcy4KLSAqCi0gKiAwMy8wMi85NglKZXMgU29yZW5zZW4sIEFuZHJlYXMgU2Nod2FiLCBSb21hbiBIb2RlazoKLSAqCQlGaXhlZCBzb21lIG5hc3R5IGJ1Z3MsIGNhdXNpbmcgc29tZSBob3JyaWJsZSBjcmFzaGVzLgotICoJCUE6IEF0IHNvbWUgcG9pbnRzLCB0aGUgc3VtICglMCkgd2FzIHVzZWQgYXMKLSAqCQlsZW5ndGgtY291bnRlciBpbnN0ZWFkIG9mIHRoZSBsZW5ndGggY291bnRlcgotICoJCSglMSkuIFRoYW5rcyB0byBSb21hbiBIb2RlayBmb3IgcG9pbnRpbmcgdGhpcyBvdXQuCi0gKgkJQjogR0NDIHNlZW1zIHRvIG1lc3MgdXAgaWYgb25lIHVzZXMgdG9vIG1hbnkKLSAqCQlkYXRhLXJlZ2lzdGVycyB0byBob2xkIGlucHV0IHZhbHVlcyBhbmQgb25lIHRyaWVzIHRvCi0gKgkJc3BlY2lmeSBkMCBhbmQgZDEgYXMgc2NyYXRjaCByZWdpc3RlcnMuIExldHRpbmcgZ2NjIGNob29zZSB0aGVzZQotICogICAgICByZWdpc3RlcnMgaXRzZWxmIHNvbHZlcyB0aGUgcHJvYmxlbS4KLSAqCi0gKgkJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCi0gKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotIAotLyogUmV2aXNlZCBieSBLZW5uZXRoIEFsYmFub3dza2kgZm9yIG02OGtub21tdS4gQmFzaWMgcHJvYmxlbTogdW5hbGlnbmVkIGFjY2VzcyBraWxscywgc28gbW9zdAotICAgb2YgdGhlIGFzc2VtYmx5IGhhcyB0byBnby4gKi8KLQotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGZyb20zMnRvMTYodW5zaWduZWQgbG9uZyB4KQotewotCS8qIGFkZCB1cCAxNi1iaXQgYW5kIDE2LWJpdCBmb3IgMTYrYyBiaXQgKi8KLQl4ID0gKHggJiAweGZmZmYpICsgKHggPj4gMTYpOwotCS8qIGFkZCB1cCBjYXJyeS4uICovCi0JeCA9ICh4ICYgMHhmZmZmKSArICh4ID4+IDE2KTsKLQlyZXR1cm4geDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgZG9fY3N1bShjb25zdCB1bnNpZ25lZCBjaGFyICogYnVmZiwgaW50IGxlbikKLXsKLQlpbnQgb2RkLCBjb3VudDsKLQl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7Ci0KLQlpZiAobGVuIDw9IDApCi0JCWdvdG8gb3V0OwotCW9kZCA9IDEgJiAodW5zaWduZWQgbG9uZykgYnVmZjsKLQlpZiAob2RkKSB7Ci0JCXJlc3VsdCA9ICpidWZmOwotCQlsZW4tLTsKLQkJYnVmZisrOwotCX0KLQljb3VudCA9IGxlbiA+PiAxOwkJLyogbnIgb2YgMTYtYml0IHdvcmRzLi4gKi8KLQlpZiAoY291bnQpIHsKLQkJaWYgKDIgJiAodW5zaWduZWQgbG9uZykgYnVmZikgewotCQkJcmVzdWx0ICs9ICoodW5zaWduZWQgc2hvcnQgKikgYnVmZjsKLQkJCWNvdW50LS07Ci0JCQlsZW4gLT0gMjsKLQkJCWJ1ZmYgKz0gMjsKLQkJfQotCQljb3VudCA+Pj0gMTsJCS8qIG5yIG9mIDMyLWJpdCB3b3Jkcy4uICovCi0JCWlmIChjb3VudCkgewotCQkgICAgICAgIHVuc2lnbmVkIGxvbmcgY2FycnkgPSAwOwotCQkJZG8gewotCQkJCXVuc2lnbmVkIGxvbmcgdyA9ICoodW5zaWduZWQgbG9uZyAqKSBidWZmOwotCQkJCWNvdW50LS07Ci0JCQkJYnVmZiArPSA0OwotCQkJCXJlc3VsdCArPSBjYXJyeTsKLQkJCQlyZXN1bHQgKz0gdzsKLQkJCQljYXJyeSA9ICh3ID4gcmVzdWx0KTsKLQkJCX0gd2hpbGUgKGNvdW50KTsKLQkJCXJlc3VsdCArPSBjYXJyeTsKLQkJCXJlc3VsdCA9IChyZXN1bHQgJiAweGZmZmYpICsgKHJlc3VsdCA+PiAxNik7Ci0JCX0KLQkJaWYgKGxlbiAmIDIpIHsKLQkJCXJlc3VsdCArPSAqKHVuc2lnbmVkIHNob3J0ICopIGJ1ZmY7Ci0JCQlidWZmICs9IDI7Ci0JCX0KLQl9Ci0JaWYgKGxlbiAmIDEpCi0JCXJlc3VsdCArPSAoKmJ1ZmYgPDwgOCk7Ci0JcmVzdWx0ID0gZnJvbTMydG8xNihyZXN1bHQpOwotCWlmIChvZGQpCi0JCXJlc3VsdCA9ICgocmVzdWx0ID4+IDgpICYgMHhmZikgfCAoKHJlc3VsdCAmIDB4ZmYpIDw8IDgpOwotb3V0OgotCXJldHVybiByZXN1bHQ7Ci19Ci0KLSNpZmRlZiBDT05GSUdfQ09MREZJUkUKLS8qCi0gKglUaGlzIGlzIGEgdmVyc2lvbiBvZiBpcF9jb21wdXRlX2NzdW0oKSBvcHRpbWl6ZWQgZm9yIElQIGhlYWRlcnMsCi0gKgl3aGljaCBhbHdheXMgY2hlY2tzdW0gb24gNCBvY3RldCBib3VuZGFyaWVzLgotICovCi1fX3N1bTE2IGlwX2Zhc3RfY3N1bShjb25zdCB2b2lkICppcGgsIHVuc2lnbmVkIGludCBpaGwpCi17Ci0JcmV0dXJuIChfX2ZvcmNlIF9fc3VtMTYpfmRvX2NzdW0oaXBoLGlobCo0KTsKLX0KLUVYUE9SVF9TWU1CT0woaXBfZmFzdF9jc3VtKTsKLSNlbmRpZgotCi0vKgotICogY29tcHV0ZXMgdGhlIGNoZWNrc3VtIG9mIGEgbWVtb3J5IGJsb2NrIGF0IGJ1ZmYsIGxlbmd0aCBsZW4sCi0gKiBhbmQgYWRkcyBpbiAic3VtIiAoMzItYml0KQotICoKLSAqIHJldHVybnMgYSAzMi1iaXQgbnVtYmVyIHN1aXRhYmxlIGZvciBmZWVkaW5nIGludG8gaXRzZWxmCi0gKiBvciBjc3VtX3RjcHVkcF9tYWdpYwotICoKLSAqIHRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCBldmVuIGxlbmd0aHMsIGV4Y2VwdAotICogZm9yIHRoZSBsYXN0IGZyYWdtZW50LCB3aGljaCBtYXkgYmUgb2RkCi0gKgotICogaXQncyBiZXN0IHRvIGhhdmUgYnVmZiBhbGlnbmVkIG9uIGEgMzItYml0IGJvdW5kYXJ5Ci0gKi8KLV9fd3N1bSBjc3VtX3BhcnRpYWwoY29uc3Qgdm9pZCAqYnVmZiwgaW50IGxlbiwgX193c3VtIHN1bSkKLXsKLQl1bnNpZ25lZCBpbnQgcmVzdWx0ID0gZG9fY3N1bShidWZmLCBsZW4pOwotCi0JLyogYWRkIGluIG9sZCBzdW0sIGFuZCBjYXJyeS4uICovCi0JcmVzdWx0ICs9IChfX2ZvcmNlIHUzMilzdW07Ci0JaWYgKChfX2ZvcmNlIHUzMilzdW0gPiByZXN1bHQpCi0JCXJlc3VsdCArPSAxOwotCXJldHVybiAoX19mb3JjZSBfX3dzdW0pcmVzdWx0OwotfQotCi1FWFBPUlRfU1lNQk9MKGNzdW1fcGFydGlhbCk7Ci0KLS8qCi0gKiBjb3B5IGZyb20gZnMgd2hpbGUgY2hlY2tzdW1taW5nLCBvdGhlcndpc2UgbGlrZSBjc3VtX3BhcnRpYWwKLSAqLwotCi1fX3dzdW0KLWNzdW1fcGFydGlhbF9jb3B5X2Zyb21fdXNlcihjb25zdCB2b2lkIF9fdXNlciAqc3JjLCB2b2lkICpkc3QsCi0JCQkgICAgaW50IGxlbiwgX193c3VtIHN1bSwgaW50ICpjc3VtX2VycikKLXsKLQlpZiAoY3N1bV9lcnIpICpjc3VtX2VyciA9IDA7Ci0JbWVtY3B5KGRzdCwgKF9fZm9yY2UgY29uc3Qgdm9pZCAqKXNyYywgbGVuKTsKLQlyZXR1cm4gY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pOwotfQotRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9mcm9tX3VzZXIpOwotCi0vKgotICogY29weSBmcm9tIGRzIHdoaWxlIGNoZWNrc3VtbWluZywgb3RoZXJ3aXNlIGxpa2UgY3N1bV9wYXJ0aWFsCi0gKi8KLQotX193c3VtCi1jc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZHN0LCBpbnQgbGVuLCBfX3dzdW0gc3VtKQotewotCW1lbWNweShkc3QsIHNyYywgbGVuKTsKLQlyZXR1cm4gY3N1bV9wYXJ0aWFsKGRzdCwgbGVuLCBzdW0pOwotfQotRVhQT1JUX1NZTUJPTChjc3VtX3BhcnRpYWxfY29weV9ub2NoZWNrKTsKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9saWIvdWFjY2Vzcy5jIGIvYXJjaC9tNjhrL2xpYi91YWNjZXNzLmMKaW5kZXggMTM4NTRlZC4uNTY2NDM4NiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL2xpYi91YWNjZXNzLmMKKysrIGIvYXJjaC9tNjhrL2xpYi91YWNjZXNzLmMKQEAgLTE1LDE3ICsxNSwxNyBAQAogCWFzbSB2b2xhdGlsZSAoIlxuIgogCQkiCXRzdC5sCSUwXG4iCiAJCSIJamVxCTJmXG4iCi0JCSIxOgltb3Zlcy5sCSglMSkrLCUzXG4iCisJCSIxOgkiTU9WRVMiLmwJKCUxKSssJTNcbiIKIAkJIgltb3ZlLmwJJTMsKCUyKStcbiIKIAkJIglzdWJxLmwJIzEsJTBcbiIKIAkJIglqbmUJMWJcbiIKIAkJIjI6CWJ0c3QJIzEsJTVcbiIKIAkJIglqZXEJNGZcbiIKLQkJIjM6CW1vdmVzLncJKCUxKSssJTNcbiIKKwkJIjM6CSJNT1ZFUyIudwkoJTEpKywlM1xuIgogCQkiCW1vdmUudwklMywoJTIpK1xuIgogCQkiNDoJYnRzdAkjMCwlNVxuIgogCQkiCWplcQk2ZlxuIgotCQkiNToJbW92ZXMuYgkoJTEpKywlM1xuIgorCQkiNToJIk1PVkVTIi5iCSglMSkrLCUzXG4iCiAJCSIJbW92ZS5iICAlMywoJTIpK1xuIgogCQkiNjpcbiIKIAkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCkBAIC02OCwxNyArNjgsMTcgQEAKIAkJIgl0c3QubAklMFxuIgogCQkiCWplcQk0ZlxuIgogCQkiMToJbW92ZS5sCSglMSkrLCUzXG4iCi0JCSIyOgltb3Zlcy5sCSUzLCglMikrXG4iCisJCSIyOgkiTU9WRVMiLmwJJTMsKCUyKStcbiIKIAkJIjM6CXN1YnEubAkjMSwlMFxuIgogCQkiCWpuZQkxYlxuIgogCQkiNDoJYnRzdAkjMSwlNVxuIgogCQkiCWplcQk2ZlxuIgogCQkiCW1vdmUudwkoJTEpKywlM1xuIgotCQkiNToJbW92ZXMudwklMywoJTIpK1xuIgorCQkiNToJIk1PVkVTIi53CSUzLCglMikrXG4iCiAJCSI2OglidHN0CSMwLCU1XG4iCiAJCSIJamVxCThmXG4iCiAJCSIJbW92ZS5iCSglMSkrLCUzXG4iCi0JCSI3Ogltb3Zlcy5iICAlMywoJTIpK1xuIgorCQkiNzoJIk1PVkVTIi5iICAlMywoJTIpK1xuIgogCQkiODpcbiIKIAkJIgkuc2VjdGlvbiAuZml4dXAsXCJheFwiXG4iCiAJCSIJLmV2ZW5cbiIKQEAgLTExNSw3ICsxMTUsNyBAQAogCQlyZXR1cm4gY291bnQ7CiAKIAlhc20gdm9sYXRpbGUgKCJcbiIKLQkJIjE6CW1vdmVzLmIJKCUyKSssJTRcbiIKKwkJIjE6CSJNT1ZFUyIuYgkoJTIpKywlNFxuIgogCQkiCW1vdmUuYgklNCwoJTEpK1xuIgogCQkiCWplcQkyZlxuIgogCQkiCXN1YnEubAkjMSwlM1xuIgpAQCAtMTUyLDcgKzE1Miw3IEBACiAJYXNtIHZvbGF0aWxlICgiXG4iCiAJCSIxOglzdWJxLmwJIzEsJTFcbiIKIAkJIglqbWkJM2ZcbiIKLQkJIjI6CW1vdmVzLmIJKCUwKSssJTJcbiIKKwkJIjI6CSJNT1ZFUyIuYgkoJTApKywlMlxuIgogCQkiCXRzdC5iCSUyXG4iCiAJCSIJam5lCTFiXG4iCiAJCSIJanJhCTRmXG4iCkBAIC0xODgsMTUgKzE4OCwxNSBAQAogCWFzbSB2b2xhdGlsZSAoIlxuIgogCQkiCXRzdC5sCSUwXG4iCiAJCSIJamVxCTNmXG4iCi0JCSIxOgltb3Zlcy5sCSUyLCglMSkrXG4iCisJCSIxOgkiTU9WRVMiLmwJJTIsKCUxKStcbiIKIAkJIjI6CXN1YnEubAkjMSwlMFxuIgogCQkiCWpuZQkxYlxuIgogCQkiMzoJYnRzdAkjMSwlNFxuIgogCQkiCWplcQk1ZlxuIgotCQkiNDoJbW92ZXMudwklMiwoJTEpK1xuIgorCQkiNDoJIk1PVkVTIi53CSUyLCglMSkrXG4iCiAJCSI1OglidHN0CSMwLCU0XG4iCiAJCSIJamVxCTdmXG4iCi0JCSI2Ogltb3Zlcy5iCSUyLCglMSlcbiIKKwkJIjY6CSJNT1ZFUyIuYgklMiwoJTEpXG4iCiAJCSI3OlxuIgogCQkiCS5zZWN0aW9uIC5maXh1cCxcImF4XCJcbiIKIAkJIgkuZXZlblxuIgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL01ha2VmaWxlIGIvYXJjaC9tNjhrL21tL01ha2VmaWxlCmluZGV4IDA5Y2FkZjEuLmNmYmYzMjAgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tbS9NYWtlZmlsZQorKysgYi9hcmNoL202OGsvbW0vTWFrZWZpbGUKQEAgLTQsNiArNCw4IEBACiAKIG9iai15CTo9IGluaXQubwogCi1vYmotJChDT05GSUdfTU1VKQkJKz0gY2FjaGUubyBmYXVsdC5vIGh3dGVzdC5vCi1vYmotJChDT05GSUdfTU1VX01PVE9ST0xBKQkrPSBrbWFwLm8gbWVtb3J5Lm8gbW90b3JvbGEubwotb2JqLSQoQ09ORklHX01NVV9TVU4zKQkJKz0gc3VuM2ttYXAubyBzdW4zbW11Lm8KK29iai0kKENPTkZJR19NTVUpCQkrPSBjYWNoZS5vIGZhdWx0Lm8KK29iai0kKENPTkZJR19NTVVfTU9UT1JPTEEpCSs9IGttYXAubyBtZW1vcnkubyBtb3Rvcm9sYS5vIGh3dGVzdC5vCitvYmotJChDT05GSUdfTU1VX1NVTjMpCQkrPSBzdW4za21hcC5vIHN1bjNtbXUubyBod3Rlc3Qubworb2JqLSQoQ09ORklHX01NVV9DT0xERklSRSkJKz0ga21hcC5vIG1lbW9yeS5vIG1jZm1tdS5vCisKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tbS9jYWNoZS5jIGIvYXJjaC9tNjhrL21tL2NhY2hlLmMKaW5kZXggNTQzN2ZmZi4uOTVkMGJmNiAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL2NhY2hlLmMKKysrIGIvYXJjaC9tNjhrL21tL2NhY2hlLmMKQEAgLTc0LDggKzc0LDE2IEBACiAvKiBSWjogdXNlIGNwdXNoICViYyBpbnN0ZWFkIG9mIGNwdXNoICVkYywgY2ludiAlaWMgKi8KIHZvaWQgZmx1c2hfaWNhY2hlX3JhbmdlKHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdW5zaWduZWQgbG9uZyBlbmRhZGRyKQogewotCi0JaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7CisJaWYgKENQVV9JU19DT0xERklSRSkgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisJCXN0YXJ0ID0gYWRkcmVzcyAmIElDQUNIRV9TRVRfTUFTSzsKKwkJZW5kID0gZW5kYWRkciAmIElDQUNIRV9TRVRfTUFTSzsKKwkJaWYgKHN0YXJ0ID4gZW5kKSB7CisJCQlmbHVzaF9jZl9pY2FjaGUoMCwgZW5kKTsKKwkJCWVuZCA9IElDQUNIRV9NQVhfQUREUjsKKwkJfQorCQlmbHVzaF9jZl9pY2FjaGUoc3RhcnQsIGVuZCk7CisJfSBlbHNlIGlmIChDUFVfSVNfMDQwX09SXzA2MCkgewogCQlhZGRyZXNzICY9IFBBR0VfTUFTSzsKIAogCQlkbyB7CkBAIC0xMDAsNyArMTA4LDE3IEBACiB2b2lkIGZsdXNoX2ljYWNoZV91c2VyX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCSAgICAgdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgbGVuKQogewotCWlmIChDUFVfSVNfMDQwX09SXzA2MCkgeworCWlmIChDUFVfSVNfQ09MREZJUkUpIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOworCQlzdGFydCA9IGFkZHIgJiBJQ0FDSEVfU0VUX01BU0s7CisJCWVuZCA9IChhZGRyICsgbGVuKSAmIElDQUNIRV9TRVRfTUFTSzsKKwkJaWYgKHN0YXJ0ID4gZW5kKSB7CisJCQlmbHVzaF9jZl9pY2FjaGUoMCwgZW5kKTsKKwkJCWVuZCA9IElDQUNIRV9NQVhfQUREUjsKKwkJfQorCQlmbHVzaF9jZl9pY2FjaGUoc3RhcnQsIGVuZCk7CisKKwl9IGVsc2UgaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7CiAJCWFzbSB2b2xhdGlsZSAoIm5vcFxuXHQiCiAJCQkgICAgICAiLmNoaXAgNjgwNDBcblx0IgogCQkJICAgICAgImNwdXNocCAlJWJjLCglMClcblx0IgpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL21tL2luaXRfbW0uYyBiL2FyY2gvbTY4ay9tbS9pbml0X21tLmMKaW5kZXggYmJlNTI1NC4uODlmM2IyMCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL2luaXRfbW0uYworKysgYi9hcmNoL202OGsvbW0vaW5pdF9tbS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2lmZGVmIENPTkZJR19BVEFSSQpAQCAtNzUsNiArNzYsMzggQEAKIAogZXh0ZXJuIHBtZF90ICp6ZXJvX3BndGFibGU7CiAKKyNpZiBkZWZpbmVkKENPTkZJR19NTVUpICYmICFkZWZpbmVkKENPTkZJR19DT0xERklSRSkKKyNkZWZpbmUgVkVDVE9SUwkmdmVjdG9yc1swXQorI2Vsc2UKKyNkZWZpbmUgVkVDVE9SUwlfcmFtdmVjCisjZW5kaWYKKwordm9pZCBfX2luaXQgcHJpbnRfbWVtbWFwKHZvaWQpCit7CisjZGVmaW5lIFVMKHgpICgodW5zaWduZWQgbG9uZykgKHgpKQorI2RlZmluZSBNTEsoYiwgdCkgVUwoYiksIFVMKHQpLCAoVUwodCkgLSBVTChiKSkgPj4gMTAKKyNkZWZpbmUgTUxNKGIsIHQpIFVMKGIpLCBVTCh0KSwgKFVMKHQpIC0gVUwoYikpID4+IDIwCisjZGVmaW5lIE1MS19ST1VORFVQKGIsIHQpIGIsIHQsIERJVl9ST1VORF9VUCgoKHQpIC0gKGIpKSwgMTAyNCkKKworCXByX25vdGljZSgiVmlydHVhbCBrZXJuZWwgbWVtb3J5IGxheW91dDpcbiIKKwkJIiAgICB2ZWN0b3IgIDogMHglMDhseCAtIDB4JTA4bHggICAoJTRsZCBLaUIpXG4iCisJCSIgICAga21hcCAgICA6IDB4JTA4bHggLSAweCUwOGx4ICAgKCU0bGQgTWlCKVxuIgorCQkiICAgIHZtYWxsb2MgOiAweCUwOGx4IC0gMHglMDhseCAgICglNGxkIE1pQilcbiIKKwkJIiAgICBsb3dtZW0gIDogMHglMDhseCAtIDB4JTA4bHggICAoJTRsZCBNaUIpXG4iCisJCSIgICAgICAuaW5pdCA6IDB4JXAiICIgLSAweCVwIiAiICAgKCU0ZCBLaUIpXG4iCisJCSIgICAgICAudGV4dCA6IDB4JXAiICIgLSAweCVwIiAiICAgKCU0ZCBLaUIpXG4iCisJCSIgICAgICAuZGF0YSA6IDB4JXAiICIgLSAweCVwIiAiICAgKCU0ZCBLaUIpXG4iCisJCSIgICAgICAuYnNzICA6IDB4JXAiICIgLSAweCVwIiAiICAgKCU0ZCBLaUIpXG4iLAorCQlNTEsoVkVDVE9SUywgVkVDVE9SUyArIDI1NiksCisJCU1MTShLTUFQX1NUQVJULCBLTUFQX0VORCksCisJCU1MTShWTUFMTE9DX1NUQVJULCBWTUFMTE9DX0VORCksCisJCU1MTShQQUdFX09GRlNFVCwgKHVuc2lnbmVkIGxvbmcpaGlnaF9tZW1vcnkpLAorCQlNTEtfUk9VTkRVUChfX2luaXRfYmVnaW4sIF9faW5pdF9lbmQpLAorCQlNTEtfUk9VTkRVUChfc3RleHQsIF9ldGV4dCksCisJCU1MS19ST1VORFVQKF9zZGF0YSwgX2VkYXRhKSwKKwkJTUxLX1JPVU5EVVAoX3Nic3MsIF9lYnNzKSk7Cit9CisKIHZvaWQgX19pbml0IG1lbV9pbml0KHZvaWQpCiB7CiAJcGdfZGF0YV90ICpwZ2RhdDsKQEAgLTEwNiw3ICsxMzksNyBAQAogCQl9CiAJfQogCi0jaWZuZGVmIENPTkZJR19TVU4zCisjaWYgIWRlZmluZWQoQ09ORklHX1NVTjMpICYmICFkZWZpbmVkKENPTkZJR19DT0xERklSRSkKIAkvKiBpbnNlcnQgcG9pbnRlciB0YWJsZXMgYWxsb2NhdGVkIHNvIGZhciBpbnRvIHRoZSB0YWJsZWxpc3QgKi8KIAlpbml0X3BvaW50ZXJfdGFibGUoKHVuc2lnbmVkIGxvbmcpa2VybmVsX3BnX2Rpcik7CiAJZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX1BHRDsgaSsrKSB7CkBAIC0xMjUsNiArMTU4LDcgQEAKIAkgICAgICAgY29kZXBhZ2VzIDw8IChQQUdFX1NISUZULTEwKSwKIAkgICAgICAgZGF0YXBhZ2VzIDw8IChQQUdFX1NISUZULTEwKSwKIAkgICAgICAgaW5pdHBhZ2VzIDw8IChQQUdFX1NISUZULTEwKSk7CisJcHJpbnRfbWVtbWFwKCk7CiB9CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9tbS9rbWFwLmMgYi9hcmNoL202OGsvbW0va21hcC5jCmluZGV4IDY5MzQ1ODQuLjFjYzJiZWQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9tbS9rbWFwLmMKKysrIGIvYXJjaC9tNjhrL21tL2ttYXAuYwpAQCAtMTcxLDcgKzE3MSw4IEBACiAJCQlicmVhazsKIAkJfQogCX0gZWxzZSB7Ci0JCXBoeXNhZGRyIHw9IChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfQUNDRVNTRUQgfCBfUEFHRV9ESVJUWSk7CisJCXBoeXNhZGRyIHw9IChfUEFHRV9QUkVTRU5UIHwgX1BBR0VfQUNDRVNTRUQgfAorCQkJICAgICBfUEFHRV9ESVJUWSB8IF9QQUdFX1JFQURXUklURSk7CiAJCXN3aXRjaCAoY2FjaGVmbGFnKSB7CiAJCWNhc2UgSU9NQVBfTk9DQUNIRV9TRVI6CiAJCWNhc2UgSU9NQVBfTk9DQUNIRV9OT05TRVI6CmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0vbWNmbW11LmMgYi9hcmNoL202OGsvbW0vbWNmbW11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFiZDVhOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvbTY4ay9tbS9tY2ZtbXUuYwpAQCAtMCwwICsxLDE5OCBAQAorLyoKKyAqIEJhc2VkIHVwb24gbGludXgvYXJjaC9tNjhrL21tL3N1bjNtbXUuYworICogQmFzZWQgdXBvbiBsaW51eC9hcmNoL3BwYy9tbS9tbXVfY29udGV4dC5jCisgKgorICogSW1wbGVtZW50YXRpb25zIG9mIG1tIHJvdXRpbmVzIHNwZWNpZmljIHRvIHRoZSBDb2xkZmlyZSBNTVUuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorCisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgorI2luY2x1ZGUgPGFzbS9tY2ZfcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorCisjZGVmaW5lIEtNQVBBUkVBKHgpCSgoeCA+PSBWTUFMTE9DX1NUQVJUKSAmJiAoeCA8IEtNQVBfRU5EKSkKKworbW1fY29udGV4dF90IG5leHRfbW11X2NvbnRleHQ7Cit1bnNpZ25lZCBsb25nIGNvbnRleHRfbWFwW0xBU1RfQ09OVEVYVCAvIEJJVFNfUEVSX0xPTkcgKyAxXTsKK2F0b21pY190IG5yX2ZyZWVfY29udGV4dHM7CitzdHJ1Y3QgbW1fc3RydWN0ICpjb250ZXh0X21tW0xBU1RfQ09OVEVYVCsxXTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG51bV9wYWdlczsKKwordm9pZCBmcmVlX2luaXRtZW0odm9pZCkKK3sKK30KKworLyoKKyAqIENvbGRGaXJlIHBhZ2luZ19pbml0IGRlcml2ZWQgZnJvbSBzdW4zLgorICovCit2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQoreworCXBnZF90ICpwZ19kaXI7CisJcHRlX3QgKnBnX3RhYmxlOworCXVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc2l6ZTsKKwl1bnNpZ25lZCBsb25nIG5leHRfcGd0YWJsZSwgYm9vdG1lbV9lbmQ7CisJdW5zaWduZWQgbG9uZyB6b25lc19zaXplW01BWF9OUl9aT05FU107CisJZW51bSB6b25lX3R5cGUgem9uZTsKKwlpbnQgaTsKKworCWVtcHR5X3plcm9fcGFnZSA9ICh2b2lkICopIGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKKwltZW1zZXQoKHZvaWQgKikgZW1wdHlfemVyb19wYWdlLCAwLCBQQUdFX1NJWkUpOworCisJcGdfZGlyID0gc3dhcHBlcl9wZ19kaXI7CisJbWVtc2V0KHN3YXBwZXJfcGdfZGlyLCAwLCBzaXplb2Yoc3dhcHBlcl9wZ19kaXIpKTsKKworCXNpemUgPSBudW1fcGFnZXMgKiBzaXplb2YocHRlX3QpOworCXNpemUgPSAoc2l6ZSArIFBBR0VfU0laRSkgJiB+KFBBR0VfU0laRS0xKTsKKwluZXh0X3BndGFibGUgPSAodW5zaWduZWQgbG9uZykgYWxsb2NfYm9vdG1lbV9wYWdlcyhzaXplKTsKKworCWJvb3RtZW1fZW5kID0gKG5leHRfcGd0YWJsZSArIHNpemUgKyBQQUdFX1NJWkUpICYgUEFHRV9NQVNLOworCXBnX2RpciArPSBQQUdFX09GRlNFVCA+PiBQR0RJUl9TSElGVDsKKworCWFkZHJlc3MgPSBQQUdFX09GRlNFVDsKKwl3aGlsZSAoYWRkcmVzcyA8ICh1bnNpZ25lZCBsb25nKWhpZ2hfbWVtb3J5KSB7CisJCXBnX3RhYmxlID0gKHB0ZV90ICopIG5leHRfcGd0YWJsZTsKKwkJbmV4dF9wZ3RhYmxlICs9IFBUUlNfUEVSX1BURSAqIHNpemVvZihwdGVfdCk7CisJCXBnZF92YWwoKnBnX2RpcikgPSAodW5zaWduZWQgbG9uZykgcGdfdGFibGU7CisJCXBnX2RpcisrOworCisJCS8qIG5vdyBjaGFuZ2UgcGdfdGFibGUgdG8ga2VybmVsIHZpcnR1YWwgYWRkcmVzc2VzICovCisJCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QVEU7ICsraSwgKytwZ190YWJsZSkgeworCQkJcHRlX3QgcHRlID0gcGZuX3B0ZSh2aXJ0X3RvX3BmbihhZGRyZXNzKSwgUEFHRV9JTklUKTsKKwkJCWlmIChhZGRyZXNzID49ICh1bnNpZ25lZCBsb25nKSBoaWdoX21lbW9yeSkKKwkJCQlwdGVfdmFsKHB0ZSkgPSAwOworCisJCQlzZXRfcHRlKHBnX3RhYmxlLCBwdGUpOworCQkJYWRkcmVzcyArPSBQQUdFX1NJWkU7CisJCX0KKwl9CisKKwljdXJyZW50LT5tbSA9IE5VTEw7CisKKwlmb3IgKHpvbmUgPSAwOyB6b25lIDwgTUFYX05SX1pPTkVTOyB6b25lKyspCisJCXpvbmVzX3NpemVbem9uZV0gPSAweDA7CisJem9uZXNfc2l6ZVtaT05FX0RNQV0gPSBudW1fcGFnZXM7CisJZnJlZV9hcmVhX2luaXQoem9uZXNfc2l6ZSk7Cit9CisKK2ludCBjZl90bGJfbWlzcyhzdHJ1Y3QgcHRfcmVncyAqcmVncywgaW50IHdyaXRlLCBpbnQgZHRsYiwgaW50IGV4dGVuc2lvbl93b3JkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIG1tdWFyOworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworCXBnZF90ICpwZ2Q7CisJcG1kX3QgKnBtZDsKKwlwdGVfdCAqcHRlOworCWludCBhc2lkOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJbW11YXIgPSAoZHRsYikgPyBtbXVfcmVhZChNTVVBUikgOgorCQlyZWdzLT5wYyArIChleHRlbnNpb25fd29yZCAqIHNpemVvZihsb25nKSk7CisKKwltbSA9ICghdXNlcl9tb2RlKHJlZ3MpICYmIEtNQVBBUkVBKG1tdWFyKSkgPyAmaW5pdF9tbSA6IGN1cnJlbnQtPm1tOworCWlmICghbW0pIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJcGdkID0gcGdkX29mZnNldChtbSwgbW11YXIpOworCWlmIChwZ2Rfbm9uZSgqcGdkKSkgIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJcG1kID0gcG1kX29mZnNldChwZ2QsIG1tdWFyKTsKKwlpZiAocG1kX25vbmUoKnBtZCkpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHRlID0gKEtNQVBBUkVBKG1tdWFyKSkgPyBwdGVfb2Zmc2V0X2tlcm5lbChwbWQsIG1tdWFyKQorCQkJCTogcHRlX29mZnNldF9tYXAocG1kLCBtbXVhcik7CisJaWYgKHB0ZV9ub25lKCpwdGUpIHx8ICFwdGVfcHJlc2VudCgqcHRlKSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAod3JpdGUpIHsKKwkJaWYgKCFwdGVfd3JpdGUoKnB0ZSkpIHsKKwkJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlzZXRfcHRlKHB0ZSwgcHRlX21rZGlydHkoKnB0ZSkpOworCX0KKworCXNldF9wdGUocHRlLCBwdGVfbWt5b3VuZygqcHRlKSk7CisJYXNpZCA9IG1tLT5jb250ZXh0ICYgMHhmZjsKKwlpZiAoIXB0ZV9kaXJ0eSgqcHRlKSAmJiAhS01BUEFSRUEobW11YXIpKQorCQlzZXRfcHRlKHB0ZSwgcHRlX3dycHJvdGVjdCgqcHRlKSk7CisKKwltbXVfd3JpdGUoTU1VVFIsIChtbXVhciAmIFBBR0VfTUFTSykgfCAoYXNpZCA8PCBNTVVUUl9JRE4pIHwKKwkJKCgoaW50KShwdGUtPnB0ZSkgJiAoaW50KUNGX1BBR0VfTU1VVFJfTUFTSykKKwkJPj4gQ0ZfUEFHRV9NTVVUUl9TSElGVCkgfCBNTVVUUl9WKTsKKworCW1tdV93cml0ZShNTVVEUiwgKHB0ZV92YWwoKnB0ZSkgJiBQQUdFX01BU0spIHwKKwkJKChwdGUtPnB0ZSkgJiBDRl9QQUdFX01NVURSX01BU0spIHwgTU1VRFJfU1pfOEtCIHwgTU1VRFJfWCk7CisKKwlpZiAoZHRsYikKKwkJbW11X3dyaXRlKE1NVU9SLCBNTVVPUl9BQ0MgfCBNTVVPUl9VQUEpOworCWVsc2UKKwkJbW11X3dyaXRlKE1NVU9SLCBNTVVPUl9JVExCIHwgTU1VT1JfQUNDIHwgTU1VT1JfVUFBKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGNvbnRleHQgbWFuYWdlbWVudCBzdHVmZi4KKyAqIFRoZSBmb2xsb3dpbmcgd2FzIHRha2VuIGZyb20gYXJjaC9wcGMvbW11X2NvbnRleHQuYworICovCit2b2lkIF9faW5pdCBtbXVfY29udGV4dF9pbml0KHZvaWQpCit7CisJLyoKKwkgKiBTb21lIHByb2Nlc3NvcnMgaGF2ZSB0b28gZmV3IGNvbnRleHRzIHRvIHJlc2VydmUgb25lIGZvcgorCSAqIGluaXRfbW0sIGFuZCByZXF1aXJlIHVzaW5nIGNvbnRleHQgMCBmb3IgYSBub3JtYWwgdGFzay4KKwkgKiBPdGhlciBwcm9jZXNzb3JzIHJlc2VydmUgdGhlIHVzZSBvZiBjb250ZXh0IHplcm8gZm9yIHRoZSBrZXJuZWwuCisJICogVGhpcyBjb2RlIGFzc3VtZXMgRklSU1RfQ09OVEVYVCA8IDMyLgorCSAqLworCWNvbnRleHRfbWFwWzBdID0gKDEgPDwgRklSU1RfQ09OVEVYVCkgLSAxOworCW5leHRfbW11X2NvbnRleHQgPSBGSVJTVF9DT05URVhUOworCWF0b21pY19zZXQoJm5yX2ZyZWVfY29udGV4dHMsIExBU1RfQ09OVEVYVCAtIEZJUlNUX0NPTlRFWFQgKyAxKTsKK30KKworLyoKKyAqIFN0ZWFsIGEgY29udGV4dCBmcm9tIGEgdGFzayB0aGF0IGhhcyBvbmUgYXQgdGhlIG1vbWVudC4KKyAqIFRoaXMgaXMgb25seSB1c2VkIG9uIDh4eCBhbmQgNHh4IGFuZCB3ZSBwcmVzZW50bHkgYXNzdW1lIHRoYXQKKyAqIHRoZXkgZG9uJ3QgZG8gU01QLiAgSWYgdGhleSBkbyB0aGVuIHRoaWNmcGdhbGxvYy5ocyB3aWxsIGhhdmUgdG8gY2hlY2sKKyAqIHdoZXRoZXIgdGhlIE1NIHdlIHN0ZWFsIGlzIGluIHVzZS4KKyAqIFdlIGFsc28gYXNzdW1lIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWQgb24gc3lzdGVtcyB0aGF0IGRvbid0CisgKiB1c2UgYW4gTU1VIGhhc2ggdGFibGUgLSB0aGlzIGlzIHRydWUgZm9yIDh4eCBhbmQgNHh4LgorICogVGhpcyBpc24ndCBhbiBMUlUgc3lzdGVtLCBpdCBqdXN0IGZyZWVzIHVwIGVhY2ggY29udGV4dCBpbgorICogdHVybiAoc29ydC1vZiBwc2V1ZG8tcmFuZG9tIHJlcGxhY2VtZW50IDopLiAgVGhpcyB3b3VsZCBiZSB0aGUKKyAqIHBsYWNlIHRvIGltcGxlbWVudCBhbiBMUlUgc2NoZW1lIGlmIGFueW9uZSB3YXMgbW90aXZhdGVkIHRvIGRvIGl0LgorICogIC0tIHBhdWx1cworICovCit2b2lkIHN0ZWFsX2NvbnRleHQodm9pZCkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbTsKKwkvKgorCSAqIGZyZWUgdXAgY29udGV4dCBgbmV4dF9tbXVfY29udGV4dCcKKwkgKiBpZiB3ZSBzaG91bGRuJ3QgZnJlZSBjb250ZXh0IDAsIGRvbid0Li4uCisJICovCisJaWYgKG5leHRfbW11X2NvbnRleHQgPCBGSVJTVF9DT05URVhUKQorCQluZXh0X21tdV9jb250ZXh0ID0gRklSU1RfQ09OVEVYVDsKKwltbSA9IGNvbnRleHRfbW1bbmV4dF9tbXVfY29udGV4dF07CisJZmx1c2hfdGxiX21tKG1tKTsKKwlkZXN0cm95X2NvbnRleHQobW0pOworfQorCmRpZmYgLS1naXQgYS9hcmNoL202OGsvbW0vbWVtb3J5LmMgYi9hcmNoL202OGsvbW0vbWVtb3J5LmMKaW5kZXggMzRjNzdjZS4uYTVkYmI3NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL21tL21lbW9yeS5jCisrKyBiL2FyY2gvbTY4ay9tbS9tZW1vcnkuYwpAQCAtMjAzLDcgKzIwMyw5IEBACiAKIHZvaWQgY2FjaGVfY2xlYXIgKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBsZW4pCiB7Ci0gICAgaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7CisgICAgaWYgKENQVV9JU19DT0xERklSRSkgeworCWZsdXNoX2NmX2JjYWNoZSgwLCBEQ0FDSEVfTUFYX0FERFIpOworICAgIH0gZWxzZSBpZiAoQ1BVX0lTXzA0MF9PUl8wNjApIHsKIAlpbnQgdG1wOwogCiAJLyoKQEAgLTI1MCw3ICsyNTIsOSBAQAogCiB2b2lkIGNhY2hlX3B1c2ggKHVuc2lnbmVkIGxvbmcgcGFkZHIsIGludCBsZW4pCiB7Ci0gICAgaWYgKENQVV9JU18wNDBfT1JfMDYwKSB7CisgICAgaWYgKENQVV9JU19DT0xERklSRSkgeworCWZsdXNoX2NmX2JjYWNoZSgwLCBEQ0FDSEVfTUFYX0FERFIpOworICAgIH0gZWxzZSBpZiAoQ1BVX0lTXzA0MF9PUl8wNjApIHsKIAlpbnQgdG1wID0gUEFHRV9TSVpFOwogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS81NHh4L2NvbmZpZy5jIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzU0eHgvY29uZmlnLmMKaW5kZXggNzgxMzA5OC4uZWUwNDM1NCAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3BsYXRmb3JtLzU0eHgvY29uZmlnLmMKKysrIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzU0eHgvY29uZmlnLmMKQEAgLTEzLDExICsxMywxNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgorI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vY29sZGZpcmUuaD4KICNpbmNsdWRlIDxhc20vbTU0eHhzaW0uaD4KICNpbmNsdWRlIDxhc20vbWNmdWFydC5oPgogI2luY2x1ZGUgPGFzbS9tNTR4eGdwdC5oPgorI2lmZGVmIENPTkZJR19NTVUKKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KKyNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCkBAIC05NSw4ICsxMDEsNDkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2lmZGVmIENPTkZJR19NTVUKKwordW5zaWduZWQgbG9uZyBudW1fcGFnZXM7CisKK3N0YXRpYyB2b2lkIF9faW5pdCBtY2Y1NHh4X2Jvb3RtZW1fYWxsb2Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbjsKKwl1bnNpZ25lZCBsb25nIG1lbXN0YXJ0OworCisJLyogX3JhbWJhc2UgYW5kIF9yYW1lbmQgd2lsbCBiZSBuYXR1cmFsbHkgcGFnZSBhbGlnbmVkICovCisJbTY4a19tZW1vcnlbMF0uYWRkciA9IF9yYW1iYXNlOworCW02OGtfbWVtb3J5WzBdLnNpemUgPSBfcmFtZW5kIC0gX3JhbWJhc2U7CisKKwkvKiBjb21wdXRlIHRvdGFsIHBhZ2VzIGluIHN5c3RlbSAqLworCW51bV9wYWdlcyA9IChfcmFtZW5kIC0gX3JhbWJhc2UpID4+IFBBR0VfU0hJRlQ7CisKKwkvKiBwYWdlIG51bWJlcnMgKi8KKwltZW1zdGFydCA9IFBBR0VfQUxJR04oX3JhbXN0YXJ0KTsKKwltaW5fbG93X3BmbiA9IF9yYW1iYXNlID4+IFBBR0VfU0hJRlQ7CisJc3RhcnRfcGZuID0gbWVtc3RhcnQgPj4gUEFHRV9TSElGVDsKKwltYXhfbG93X3BmbiA9IF9yYW1lbmQgPj4gUEFHRV9TSElGVDsKKwloaWdoX21lbW9yeSA9ICh2b2lkICopX3JhbWVuZDsKKworCW02OGtfdmlydF90b19ub2RlX3NoaWZ0ID0gZmxzKF9yYW1lbmQgLSBfcmFtYmFzZSAtIDEpIC0gNjsKKwltb2R1bGVfZml4dXAoTlVMTCwgX19zdGFydF9maXh1cCwgX19zdG9wX2ZpeHVwKTsKKworCS8qIHNldHVwIGJvb3RtZW0gZGF0YSAqLworCW02OGtfc2V0dXBfbm9kZSgwKTsKKwltZW1zdGFydCArPSBpbml0X2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIHN0YXJ0X3BmbiwKKwkJbWluX2xvd19wZm4sIG1heF9sb3dfcGZuKTsKKwlmcmVlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEoMCksIG1lbXN0YXJ0LCBfcmFtZW5kIC0gbWVtc3RhcnQpOworfQorCisjZW5kaWYgLyogQ09ORklHX01NVSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiB2b2lkIF9faW5pdCBjb25maWdfQlNQKGNoYXIgKmNvbW1hbmRwLCBpbnQgc2l6ZSkKIHsKKyNpZmRlZiBDT05GSUdfTU1VCisJbWNmNTR4eF9ib290bWVtX2FsbG9jKCk7CisJbW11X2NvbnRleHRfaW5pdCgpOworI2VuZGlmCiAJbWFjaF9yZXNldCA9IG1jZjU0eHhfcmVzZXQ7CiAJbTU0eHhfdWFydHNfaW5pdCgpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzI4L01ha2VmaWxlIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzI4L01ha2VmaWxlCmluZGV4IGU0ZGZkOGYuLmVlNjFiZjggMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9NYWtlZmlsZQorKysgYi9hcmNoL202OGsvcGxhdGZvcm0vNjgzMjgvTWFrZWZpbGUKQEAgLTE0LDEyICsxNCw4IEBACiBvYmotJChDT05GSUdfUk9NKQkrPSByb212ZWMubwogCiBleHRyYS15CQkJOj0gaGVhZC5vCi1leHRyYS0kKENPTkZJR19NNjgzMjgpCSs9IGJvb3Rsb2dvLnJoIGhlYWQubwotCi0kKG9iaikvYm9vdGxvZ28ucmg6ICQoc3JjKS9ib290bG9nby5oCi0JcGVybCAkKHNyYykvYm9vdGxvZ28ucGwgPCAkKHNyYykvYm9vdGxvZ28uaCA+ICQob2JqKS9ib290bG9nby5yaAogCiAkKG9iaikvaGVhZC5vOiAkKG9iaikvJChoZWFkLXkpCiAJbG4gLXNmICQoaGVhZC15KSAkKG9iaikvaGVhZC5vCiAKLWNsZWFuLWZpbGVzIDo9ICQob2JqKS9ib290bG9nby5yaCAkKG9iaikvaGVhZC5vICQoaGVhZC15KQorY2xlYW4tZmlsZXMgOj0gJChvYmopL2hlYWQubyAkKGhlYWQteSkKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9ib290bG9nby5oIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzI4L2Jvb3Rsb2dvLmgKaW5kZXggNjdiYzJjMS4uYjg5NmM5MyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzI4L2Jvb3Rsb2dvLmgKKysrIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzI4L2Jvb3Rsb2dvLmgKQEAgLTEsNiArMSw2IEBACiAjZGVmaW5lIGJvb3Rsb2dvX3dpZHRoIDE2MAogI2RlZmluZSBib290bG9nb19oZWlnaHQgMTYwCi1zdGF0aWMgdW5zaWduZWQgY2hhciBib290bG9nb19iaXRzW10gPSB7Cit1bnNpZ25lZCBjaGFyIF9fYXR0cmlidXRlX18gKChhbGlnbmVkKDE2KSkpIGJvb3Rsb2dvX2JpdHNbXSA9IHsKICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKICAgMHgwMCwgMHgwMCwgMHg0MCwgMHg1NSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9ib290bG9nby5wbCBiL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9ib290bG9nby5wbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA0YWUzZi4uMDAwMDAwMAotLS0gYS9hcmNoL202OGsvcGxhdGZvcm0vNjgzMjgvYm9vdGxvZ28ucGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0KLSRfID0gam9pbigiIiwgPD4pOwotCi1zLygweFswLTlhLWZdezJ9KS9zcHJpbnRmKCIweCUuMngiLG9yZChwYWNrKCJiOCIsdW5wYWNrKCJCOCIsY2hyKGhleCgkMSkpKSkpKS9nZWk7Ci0KLXMvXiAvCS5ieXRlIC9nbTsKLXMvWyx9O10rJC8vZ207Ci1zL15zdGF0aWMuKi8vZ207Ci0KLXByaW50ICRfOwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzI4L2NvbmZpZy5jIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzI4L2NvbmZpZy5jCmluZGV4IGE3YmQyMWQuLmQ3MGJmMjYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9jb25maWcuYworKysgYi9hcmNoL202OGsvcGxhdGZvcm0vNjgzMjgvY29uZmlnLmMKQEAgLTIwLDYgKzIwLDkgQEAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20vTUM2ODMyOC5oPgorI2lmIGRlZmluZWQoQ09ORklHX1BJTE9UKSB8fCBkZWZpbmVkKENPTkZJR19JTklUX0xDRCkKKyNpbmNsdWRlICJib290bG9nby5oIgorI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9oZWFkLXBpbG90LlMgYi9hcmNoL202OGsvcGxhdGZvcm0vNjgzMjgvaGVhZC1waWxvdC5TCmluZGV4IGFlY2ZmNTMuLjJlYmZkNjQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9oZWFkLXBpbG90LlMKKysrIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzI4L2hlYWQtcGlsb3QuUwpAQCAtMjQsMTkgKzI0LDcgQEAKIC5nbG9iYWwgX3JhbXN0YXJ0CiAuZ2xvYmFsIF9yYW1lbmQKIAotLmdsb2JhbCBwZW5ndWluX2JpdHMKLQotI2lmZGVmIENPTkZJR19QSUxPVAotCi0jZGVmaW5lIElNUiAweEZGRkZGMzA0Ci0KLQkuZGF0YQotCS5hbGlnbiAxNgotCi1wZW5ndWluX2JpdHM6CQotI2luY2x1ZGUgImJvb3Rsb2dvLnJoIgotCi0jZW5kaWYKKy5nbG9iYWwgYm9vdGxvZ29fYml0cwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKQEAgLTE4NSw5ICsxNzMsNiBAQAogCW1vdmVxCSM3OSwgJWQ3CiAJbW92ZWwJJWQwLCBfcmFtZW5kCiAKLQltb3ZlbAklYTMsICVkMAotCW1vdmVsCSVkMCwgcm9tX2xlbmd0aAotCiAJcGVhCTAKIAlwZWEJZW52CiAJcGVhCSVzcEAoNCkKQEAgLTE5Niw3ICsxODEsNyBAQAogCURCR19QVVRDKCdIJykKIAogI2lmZGVmIENPTkZJR19QSUxPVAotCW1vdmVsCSNwZW5ndWluX2JpdHMsIDB4RkZGRkZBMDAKKwltb3ZlbAkjYm9vdGxvZ29fYml0cywgMHhGRkZGRkEwMAogCW1vdmViCSMxMCwgMHhGRkZGRkEwNQogCW1vdmV3CSMxNjAsIDB4RkZGRkZBMDgKIAltb3ZldwkjMTYwLCAweEZGRkZGQTBBCmRpZmYgLS1naXQgYS9hcmNoL202OGsvcGxhdGZvcm0vNjgzMjgvaGVhZC1yb20uUyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9oZWFkLXJvbS5TCmluZGV4IDZlYzc3ZDMuLmE1ZmY5NmQgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9oZWFkLXJvbS5TCisrKyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC9oZWFkLXJvbS5TCkBAIC04LDcgKzgsNyBAQAogCS5nbG9iYWwgX3JhbWVuZAogCiAjaWZkZWYgQ09ORklHX0lOSVRfTENECi0JLmdsb2JhbCBzcGxhc2hfYml0cworCS5nbG9iYWwgYm9vdGxvZ29fYml0cwogI2VuZGlmCiAKIAkuZGF0YQpAQCAtMjksMTYgKzI5LDExIEBACiAKICNkZWZpbmUJUkFNRU5ECShDT05GSUdfUkFNQkFTRSArIENPTkZJR19SQU1TSVpFKQogCi0jaWZkZWYgQ09ORklHX0lOSVRfTENECi1zcGxhc2hfYml0czoKLSNpbmNsdWRlICJib290bG9nby5yaCIKLSNlbmRpZgotCQogCS50ZXh0CiBfc3RhcnQ6CiBfc3RleHQ6CW1vdmV3CSMweDI3MDAsJXNyCiAjaWZkZWYgQ09ORklHX0lOSVRfTENECi0JbW92ZWwJI3NwbGFzaF9iaXRzLCAweGZmZmZmQTAwIC8qIExTU0EgKi8KKwltb3ZlbAkjYm9vdGxvZ29fYml0cywgMHhmZmZmZkEwMCAvKiBMU1NBICovCiAJbW92ZWIJIzB4MjgsICAgMHhmZmZmZkEwNQkvKiBMVlBXICovCiAJbW92ZXcJIzB4MjgwLCAgMHhGRkZGRmEwOAkvKiBMWE1BWCAqLwogCW1vdmV3CSMweDFkZiwgIDB4RkZGRkZhMGEJLyogTFlNQVggKi8KZGlmZiAtLWdpdCBhL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC90aW1lcnMuYyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS82ODMyOC90aW1lcnMuYwppbmRleCAzMDlmNzI1Li5mMjY3ODg2IDEwMDY0NAotLS0gYS9hcmNoL202OGsvcGxhdGZvcm0vNjgzMjgvdGltZXJzLmMKKysrIGIvYXJjaC9tNjhrL3BsYXRmb3JtLzY4MzI4L3RpbWVycy5jCkBAIC05Myw3ICs5Myw2IEBACiAJLm5hbWUJPSAidGltZXIiLAogCS5yYXRpbmcJPSAyNTAsCiAJLnJlYWQJPSBtNjgzMjhfcmVhZF9jbGssCi0JLnNoaWZ0CT0gMjAsCiAJLm1hc2sJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKIAkuZmxhZ3MJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CkBAIC0xMTUsOCArMTE0LDcgQEAKIAogCS8qIEVuYWJsZSB0aW1lciAxICovCiAJVENUTCB8PSBUQ1RMX1RFTjsKLQltNjgzMjhfY2xrLm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KFRJQ0tTX1BFUl9KSUZGWSpIWiwgbTY4MzI4X2Nsay5zaGlmdCk7Ci0JY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJm02ODMyOF9jbGspOworCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2h6KCZtNjgzMjhfY2xrLCBUSUNLU19QRVJfSklGRlkqSFopOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL2RtYV90aW1lci5jIGIvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL2RtYV90aW1lci5jCmluZGV4IGE1ZjU2MjguLjIzNWFkNTcgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS9kbWFfdGltZXIuYworKysgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvZG1hX3RpbWVyLmMKQEAgLTQ0LDcgKzQ0LDYgQEAKIAkucmF0aW5nCQk9IDIwMCwKIAkucmVhZAkJPSBjZl9kdF9nZXRfY3ljbGVzLAogCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAotCS5zaGlmdAkJPSAyMCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC02MCw5ICs1OSw3IEBACiAJX19yYXdfd3JpdGViKDB4MDAsIERURVIwKTsKIAlfX3Jhd193cml0ZWwoMHgwMDAwMDAwMCwgRFRSUjApOwogCV9fcmF3X3dyaXRldyhETUFfRFRNUl9DTEtfRElWXzE2IHwgRE1BX0RUTVJfRU5BQkxFLCBEVE1SMCk7Ci0JY2xvY2tzb3VyY2VfY2ZfZHQubXVsdCA9IGNsb2Nrc291cmNlX2h6Mm11bHQoRE1BX0ZSRVEsCi0JCQkJCQkgICAgIGNsb2Nrc291cmNlX2NmX2R0LnNoaWZ0KTsKLQlyZXR1cm4gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX2NmX2R0KTsKKwlyZXR1cm4gY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJmNsb2Nrc291cmNlX2NmX2R0LCBETUFfRlJFUSk7CiB9CiAKIGFyY2hfaW5pdGNhbGwoaW5pdF9jZl9kdF9jbG9ja3NvdXJjZSk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvZW50cnkuUyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS9lbnRyeS5TCmluZGV4IDMxNTc0NjEuLjg2Mzg4OWYgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS9lbnRyeS5TCisrKyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS9lbnRyeS5TCkBAIC01NCw3ICs1NCw2IEBACiAuZ2xvYmwgcmV0X2Zyb21fc2lnbmFsCiAuZ2xvYmwgc3lzX2NhbGxfdGFibGUKIC5nbG9ibCBpbnRoYW5kbGVyCi0uZ2xvYmwgZmFzdGhhbmRsZXIKIAogZW5vc3lzOgogCW1vdi5sCSNzeXNfbmlfc3lzY2FsbCwlZDMKQEAgLTYzLDYgKzYyLDcgQEAKIEVOVFJZKHN5c3RlbV9jYWxsKQogCVNBVkVfQUxMX1NZUwogCW1vdmUJIzB4MjAwMCwlc3IJCS8qIGVuYWJsZSBpbnRycyBhZ2FpbiAqLworCUdFVF9DVVJSRU5UKCVkMikKIAogCWNtcGwJI05SX3N5c2NhbGxzLCVkMAogCWpjYwllbm9zeXMKQEAgLTE2Niw2ICsxNjYsNyBAQAogICovCiBFTlRSWShpbnRoYW5kbGVyKQogCVNBVkVfQUxMX0lOVAorCUdFVF9DVVJSRU5UKCVkMikKIAogCW1vdmV3CSVzcEAoUFRfT0ZGX0ZPUk1BVFZFQyksJWQwIC8qIHB1dCBleGNlcHRpb24gIyBpbiBkMCAqLwogCWFuZGwJIzB4MDNmYywlZDAJCS8qIG1hc2sgb3V0IHZlY3RvciBvbmx5ICovCkBAIC0xOTEsNyArMTkyLDkgQEAKIAltb3ZlbAklc3AsJWEwQChUQVNLX1RIUkVBRCtUSFJFQURfS1NQKSAvKiBzYXZlIGtlcm5lbCBzdGFjayBwb2ludGVyICovCiAJUkRVU1AJCQkJCSAvKiBtb3ZlbCAldXNwLCVhMyAqLwogCW1vdmVsCSVhMywlYTBAKFRBU0tfVEhSRUFEK1RIUkVBRF9VU1ApIC8qIHNhdmUgdGhyZWFkIHVzZXIgc3RhY2sgKi8KLQorI2lmZGVmIENPTkZJR19NTVUKKwltb3ZlbAklYTEsJWEyCQkJCSAvKiBzZXQgbmV3IGN1cnJlbnQgKi8KKyNlbmRpZgogCW1vdmVsCSVhMUAoVEFTS19USFJFQUQrVEhSRUFEX1VTUCksJWEzIC8qIHJlc3RvcmUgdGhyZWFkIHVzZXIgc3RhY2sgKi8KIAlXUlVTUAkJCQkJIC8qIG1vdmVsICVhMywldXNwICovCiAJbW92ZWwJJWExQChUQVNLX1RIUkVBRCtUSFJFQURfS1NQKSwlc3AgLyogcmVzdG9yZSBuZXcga2VybmVsIHN0YWNrICovCmRpZmYgLS1naXQgYS9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvaGVhZC5TIGIvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL2hlYWQuUwppbmRleCBjMzM0ODM4Li4zOGYwNGEzIDEwMDY0NAotLS0gYS9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvaGVhZC5TCisrKyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS9oZWFkLlMKQEAgLTMsNyArMyw3IEBACiAvKgogICoJaGVhZC5TIC0tIGNvbW1vbiBzdGFydHVwIGNvZGUgZm9yIENvbGRGaXJlIENQVXMuCiAgKgotICoJKEMpIENvcHlyaWdodCAxOTk5LTIwMTAsIEdyZWcgVW5nZXJlciA8Z2VyZ0BzbmFwZ2Vhci5jb20+LgorICoJKEMpIENvcHlyaWdodCAxOTk5LTIwMTEsIEdyZWcgVW5nZXJlciA8Z2VyZ0BzbmFwZ2Vhci5jb20+LgogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEzLDYgKzEzLDcgQEAKICNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KICNpbmNsdWRlIDxhc20vY29sZGZpcmUuaD4KICNpbmNsdWRlIDxhc20vbWNmc2ltLmg+CisjaW5jbHVkZSA8YXNtL21jZm1tdS5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMzUsNiArMTM2LDE0IEBACiAKIF9fSEVBRAogCisjaWZkZWYgQ09ORklHX01NVQorX3N0YXJ0MDoKKwlqbXAJX3N0YXJ0CisuZ2xvYmFsIGtlcm5lbF9wZ19kaXIKKy5lcXUJa2VybmVsX3BnX2Rpcixfc3RhcnQwCisuZXF1CS4sX3N0YXJ0MCsweDEwMDAKKyNlbmRpZgorCiAvKgogICoJVGhpcyBpcyB0aGUgY29kZXMgZmlyc3QgZW50cnkgcG9pbnQuIFRoaXMgaXMgd2hlcmUgaXQgYWxsCiAgKgliZWdpbnMuLi4KQEAgLTE0Myw2ICsxNTIsOSBAQAogX3N0YXJ0OgogCW5vcAkJCQkJLyogZmlsbGVyICovCiAJbW92ZXcJIzB4MjcwMCwgJXNyCQkJLyogbm8gaW50ZXJydXB0cyAqLworCW1vdmVsCSNDQUNIRV9JTklULCVkMAkJCS8qIGRpc2FibGUgY2FjaGUgKi8KKwltb3ZlYwklZDAsJUNBQ1IKKwlub3AKICNpZiBkZWZpbmVkKENPTkZJR19VQk9PVCkKIAltb3ZlbAklc3AsX2luaXRfc3AJCQkvKiBzYXZlIGluaXRpYWwgc3RhY2sgcG9pbnRlciAqLwogI2VuZGlmCkBAIC0xNzYsOSArMTg4LDYgQEAKIAkgKglpdCBpcyB2ZXJ5IHNpbWlsYXIuIERlZmluZSB0aGUgZXhhY3Qgc2V0dGluZ3MgaW4gdGhlIGhlYWRlcnMKIAkgKgl0aGVuIHRoZSBjb2RlIGhlcmUgaXMgdGhlIHNhbWUgZm9yIGFsbC4KIAkgKi8KLQltb3ZlbAkjQ0FDSEVfSU5JVCwlZDAJCQkvKiBpbnZhbGlkYXRlIHdob2xlIGNhY2hlICovCi0JbW92ZWMJJWQwLCVDQUNSCi0Jbm9wCiAJbW92ZWwJI0FDUjBfTU9ERSwlZDAJCQkvKiBzZXQgUkFNIHJlZ2lvbiBmb3IgY2FjaGluZyAqLwogCW1vdmVjCSVkMCwlQUNSMAogCW1vdmVsCSNBQ1IxX01PREUsJWQwCQkJLyogYW55dGhpbmcgZWxzZSB0byBjYWNoZT8gKi8KQEAgLTE5Myw2ICsyMDIsMjYgQEAKIAltb3ZlYwklZDAsJUNBQ1IKIAlub3AKIAorI2lmZGVmIENPTkZJR19NTVUKKwkvKgorCSAqCUlkZW50aXR5IG1hcHBpbmcgZm9yIHRoZSBrZXJuZWwgcmVnaW9uLgorCSAqLworCW1vdmVsCSMoTU1VQkFTRSsxKSwlZDAJCS8qIGVuYWJsZSBNTVVCQVIgcmVnaXN0ZXJzICovCisJbW92ZWMJJWQwLCVNTVVCQVIKKwltb3ZlbAkjTU1VT1JfQ0EsJWQwCQkJLyogY2xlYXIgVExCIGVudHJpZXMgKi8KKwltb3ZlbAklZDAsTU1VT1IKKwltb3ZlbAkjMCwlZDAJCQkJLyogc2V0IEFTSUQgdG8gMCAqLworCW1vdmVjCSVkMCwlYXNpZAorCisJbW92ZWwJI01NVUNSX0VOLCVkMAkJCS8qIEVuYWJsZSB0aGUgaWRlbnRpdHkgbWFwICovCisJbW92ZWwJJWQwLE1NVUNSCisJbm9wCQkJCQkvKiBzeW5jIGktcGlwZWxpbmUgKi8KKworCW1vdmVsCSNfdnN0YXJ0LCVhMAkJCS8qIGp1bXAgdG8gInZpcnR1YWwiIHNwYWNlICovCisJam1wCSVhMEAKK192c3RhcnQ6CisjZW5kaWYgLyogQ09ORklHX01NVSAqLworCiAjaWZkZWYgQ09ORklHX1JPTUZTX0ZTCiAJLyoKIAkgKglNb3ZlIFJPTSBmaWxlc3lzdGVtIGFib3ZlIGJzcyA6LSkKQEAgLTIzOCw2ICsyNjcsMjIgQEAKIAlsZWEJaW5pdF90aHJlYWRfdW5pb24sJWEwCiAJbGVhCVRIUkVBRF9TSVpFKCVhMCksJXNwCiAKKyNpZmRlZiBDT05GSUdfTU1VCisuZ2xvYmFsIG02OGtfY3B1dHlwZQorLmdsb2JhbCBtNjhrX21tdXR5cGUKKy5nbG9iYWwgbTY4a19mcHV0eXBlCisuZ2xvYmFsIG02OGtfbWFjaHR5cGUKKwltb3ZlbAkjQ1BVX0NPTERGSVJFLCVkMAorCW1vdmVsCSVkMCxtNjhrX2NwdXR5cGUJCS8qIE1hcmsgdXMgYXMgYSBDb2xkRmlyZSAqLworCW1vdmVsCSNNTVVfQ09MREZJUkUsJWQwCisJbW92ZWwJJWQwLG02OGtfbW11dHlwZQorCW1vdmVsCSNGUFVfQ09MREZJUkUsJWQwCisJbW92ZWwJJWQwLG02OGtfZnB1dHlwZQorCW1vdmVsCSNNQUNIX001NFhYLCVkMAorCW1vdmVsCSVkMCxtNjhrX21hY2h0eXBlCQkvKiBNYXJrIHVzIGFzIGEgNTR4eCBtYWNoaW5lICovCisJbGVhCWluaXRfdGFzaywlYTIJCQkvKiBTZXQgImN1cnJlbnQiIGluaXQgdGFzayAqLworI2VuZGlmCisKIAkvKgogCSAqCUFzc2VtYmVyIHN0YXJ0IHVwIGRvbmUsIHN0YXJ0IGNvZGUgcHJvcGVyLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL3BpdC5jIGIvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL3BpdC5jCmluZGV4IGMyYjk4MDkuLjAyNjYzZDIgMTAwNjQ0Ci0tLSBhL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS9waXQuYworKysgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvcGl0LmMKQEAgLTE0NCw3ICsxNDQsNiBAQAogCS5uYW1lCT0gInBpdCIsCiAJLnJhdGluZwk9IDEwMCwKIAkucmVhZAk9IHBpdF9yZWFkX2NsaywKLQkuc2hpZnQJPSAyMCwKIAkubWFzawk9IENMT0NLU09VUkNFX01BU0soMzIpLAogfTsKIApAQCAtMTYyLDggKzE2MSw3IEBACiAKIAlzZXR1cF9pcnEoTUNGSU5UX1ZFQ0JBU0UgKyBNQ0ZJTlRfUElUMSwgJnBpdF9pcnEpOwogCi0JcGl0X2Nsay5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChGUkVRLCBwaXRfY2xrLnNoaWZ0KTsKLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmcGl0X2Nsayk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJnBpdF9jbGssIEZSRVEpOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL3NsdGltZXJzLmMgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvc2x0aW1lcnMuYwppbmRleCA2YTg1ZGFmLi41NGUxNDUyIDEwMDY0NAotLS0gYS9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvc2x0aW1lcnMuYworKysgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvc2x0aW1lcnMuYwpAQCAtOTgsMjMgKzk4LDI1IEBACiBzdGF0aWMgY3ljbGVfdCBtY2ZzbHRfcmVhZF9jbGsoc3RydWN0IGNsb2Nrc291cmNlICpjcykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBjeWNsZXM7Ci0JdTE2IHNjbnQ7CisJdTMyIGN5Y2xlcywgc2NudDsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlzY250ID0gX19yYXdfcmVhZGwoVEEoTUNGU0xUX1NDTlQpKTsKIAljeWNsZXMgPSBtY2ZzbHRfY250OworCWlmIChfX3Jhd19yZWFkbChUQShNQ0ZTTFRfU1NSKSkgJiBNQ0ZTTFRfU1NSX1RFKSB7CisJCWN5Y2xlcyArPSBtY2ZzbHRfY3ljbGVzX3Blcl9qaWZmeTsKKwkJc2NudCA9IF9fcmF3X3JlYWRsKFRBKE1DRlNMVF9TQ05UKSk7CisJfQogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogCS8qIHN1YnRyYWN0IGJlY2F1c2Ugc2xpY2UgdGltZXJzIGNvdW50IGRvd24gKi8KLQlyZXR1cm4gY3ljbGVzIC0gc2NudDsKKwlyZXR1cm4gY3ljbGVzICsgKChtY2ZzbHRfY3ljbGVzX3Blcl9qaWZmeSAtIDEpIC0gc2NudCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgbWNmc2x0X2NsayA9IHsKIAkubmFtZQk9ICJzbHQiLAogCS5yYXRpbmcJPSAyNTAsCiAJLnJlYWQJPSBtY2ZzbHRfcmVhZF9jbGssCi0JLnNoaWZ0CT0gMjAsCiAJLm1hc2sJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKIAkuZmxhZ3MJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CkBAIC0xMzYsOCArMTM4LDcgQEAKIAogCXNldHVwX2lycShNQ0ZfSVJRX1RJTUVSLCAmbWNmc2x0X3RpbWVyX2lycSk7CiAKLQltY2ZzbHRfY2xrLm11bHQgPSBjbG9ja3NvdXJjZV9oejJtdWx0KE1DRl9CVVNDTEssIG1jZnNsdF9jbGsuc2hpZnQpOwotCWNsb2Nrc291cmNlX3JlZ2lzdGVyKCZtY2ZzbHRfY2xrKTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmbWNmc2x0X2NsaywgTUNGX0JVU0NMSyk7CiAKICNpZmRlZiBDT05GSUdfSElHSFBST0ZJTEUKIAltY2ZzbHRfcHJvZmlsZV9pbml0KCk7CmRpZmYgLS1naXQgYS9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvdGltZXJzLmMgYi9hcmNoL202OGsvcGxhdGZvcm0vY29sZGZpcmUvdGltZXJzLmMKaW5kZXggNjAyNDJmNi4uMGQ5MGRhMyAxMDA2NDQKLS0tIGEvYXJjaC9tNjhrL3BsYXRmb3JtL2NvbGRmaXJlL3RpbWVycy5jCisrKyBiL2FyY2gvbTY4ay9wbGF0Zm9ybS9jb2xkZmlyZS90aW1lcnMuYwpAQCAtODgsNyArODgsNiBAQAogCS5uYW1lCT0gInRtciIsCiAJLnJhdGluZwk9IDI1MCwKIAkucmVhZAk9IG1jZnRtcl9yZWFkX2NsaywKLQkuc2hpZnQJPSAyMCwKIAkubWFzawk9IENMT0NLU09VUkNFX01BU0soMzIpLAogCS5mbGFncwk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKQEAgLTEwOSw4ICsxMDgsNyBAQAogCV9fcmF3X3dyaXRldyhNQ0ZUSU1FUl9UTVJfRU5PUkkgfCBNQ0ZUSU1FUl9UTVJfQ0xLMTYgfAogCQlNQ0ZUSU1FUl9UTVJfUkVTVEFSVCB8IE1DRlRJTUVSX1RNUl9FTkFCTEUsIFRBKE1DRlRJTUVSX1RNUikpOwogCi0JbWNmdG1yX2Nsay5tdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChGUkVRLCBtY2Z0bXJfY2xrLnNoaWZ0KTsKLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmbWNmdG1yX2Nsayk7CisJY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJm1jZnRtcl9jbGssIEZSRVEpOwogCiAJc2V0dXBfaXJxKE1DRl9JUlFfVElNRVIsICZtY2Z0bXJfdGltZXJfaXJxKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2luY2x1ZGUvYXNtL21lbWJsb2NrLmggYi9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vbWVtYmxvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhOGUyNS4uMDAwMDAwMAotLS0gYS9hcmNoL21pY3JvYmxhemUvaW5jbHVkZS9hc20vbWVtYmxvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGFsIFNpbWVrIDxtb25zdHJAbW9uc3RyLmV1PgotICoKLSAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKLSAqIGZvciBtb3JlIGRldGFpbHMuCi0gKi8KLQotI2lmbmRlZiBfQVNNX01JQ1JPQkxBWkVfTUVNQkxPQ0tfSAotI2RlZmluZSBfQVNNX01JQ1JPQkxBWkVfTUVNQkxPQ0tfSAotCi0jZW5kaWYgLyogX0FTTV9NSUNST0JMQVpFX01FTUJMT0NLX0ggKi8KLQotCmRpZmYgLS1naXQgYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDk1Y2MyOTUuLjdkY2I1YmYgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0xMDMsMTAgKzEwMywxMiBAQAogCQlpZiAoIWlkbGUpCiAJCQlpZGxlID0gZGVmYXVsdF9pZGxlOwogCi0JCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soMSk7CisJCXRpY2tfbm9oel9pZGxlX2VudGVyKCk7CisJCXJjdV9pZGxlX2VudGVyKCk7CiAJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpCiAJCQlpZGxlKCk7Ci0JCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKKwkJcmN1X2lkbGVfZXhpdCgpOworCQl0aWNrX25vaHpfaWRsZV9leGl0KCk7CiAKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCQlzY2hlZHVsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taWNyb2JsYXplL2tlcm5lbC9wcm9tLmMgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb20uYwppbmRleCA5Nzc0ODRhLi44MGQzMTRlIDEwMDY0NAotLS0gYS9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb20uYworKysgYi9hcmNoL21pY3JvYmxhemUva2VybmVsL3Byb20uYwpAQCAtMTIyLDcgKzEyMiw2IEBACiAJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9jaG9zZW4sIGNtZF9saW5lKTsKIAogCS8qIFNjYW4gbWVtb3J5IG5vZGVzIGFuZCByZWJ1aWxkIE1FTUJMT0NLcyAqLwotCW1lbWJsb2NrX2luaXQoKTsKIAlvZl9zY2FuX2ZsYXRfZHQoZWFybHlfaW5pdF9kdF9zY2FuX3Jvb3QsIE5VTEwpOwogCW9mX3NjYW5fZmxhdF9kdChlYXJseV9pbml0X2R0X3NjYW5fbWVtb3J5LCBOVUxMKTsKIApAQCAtMTMwLDcgKzEyOSw3IEBACiAJc3RybGNweShib290X2NvbW1hbmRfbGluZSwgY21kX2xpbmUsIENPTU1BTkRfTElORV9TSVpFKTsKIAlwYXJzZV9lYXJseV9wYXJhbSgpOwogCi0JbWVtYmxvY2tfYW5hbHl6ZSgpOworCW1lbWJsb2NrX2FsbG93X3Jlc2l6ZSgpOwogCiAJcHJfZGVidWcoIlBoeXMuIG1lbTogJWx4XG4iLCAodW5zaWduZWQgbG9uZykgbWVtYmxvY2tfcGh5c19tZW1fc2l6ZSgpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL0tjb25maWcgYi9hcmNoL21pcHMvS2NvbmZpZwppbmRleCBkNDZmMWRhLi45YzY1MmViIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvS2NvbmZpZworKysgYi9hcmNoL21pcHMvS2NvbmZpZwpAQCAtMjUsNiArMjUsOSBAQAogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCiAJc2VsZWN0IEhBVkVfQVJDSF9KVU1QX0xBQkVMCiAJc2VsZWN0IElSUV9GT1JDRURfVEhSRUFESU5HCisJc2VsZWN0IEhBVkVfTUVNQkxPQ0sKKwlzZWxlY3QgSEFWRV9NRU1CTE9DS19OT0RFX01BUAorCXNlbGVjdCBBUkNIX0RJU0NBUkRfTUVNQkxPQ0sKIAogbWVudSAiTWFjaGluZSBzZWxlY3Rpb24iCiAKQEAgLTIwNjQsOSArMjA2Nyw2IEBACiAJICBvciBoYXZlIGh1Z2UgaG9sZXMgaW4gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgc3BhY2UgZm9yIG90aGVyIHJlYXNvbnMuCiAJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi92bS9udW1hPiBmb3IgbW9yZS4KIAotY29uZmlnIEFSQ0hfUE9QVUxBVEVTX05PREVfTUFQCi0JZGVmX2Jvb2wgeQotCiBjb25maWcgQVJDSF9TUEFSU0VNRU1fRU5BQkxFCiAJYm9vbAogCXNlbGVjdCBTUEFSU0VNRU1fU1RBVElDCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaXAzMi9tYWNlLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaXAzMi9tYWNlLmgKaW5kZXggZDA4ZDdjNi4uYzUyMzEyMyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lwMzIvbWFjZS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pcDMyL21hY2UuaApAQCAtOTUsNyArOTUsNyBAQAogICogRXRoZXJuZXQgaW50ZXJmYWNlCiAgKi8KIHN0cnVjdCBtYWNlX2V0aGVybmV0IHsKLQl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIG1hY19jdHJsOworCXZvbGF0aWxlIHU2NCBtYWNfY3RybDsKIAl2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGludF9zdGF0OwogCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgZG1hX2N0cmw7CiAJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0aW1lcjsKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zb2NrZXQuaCBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCA5ZGU1MTkwLi5hZDVjMGE3IDEwMDY0NAotLS0gYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC9taXBzL2luY2x1ZGUvYXNtL3NvY2tldC5oCkBAIC04Miw2ICs4Miw5IEBACiAKICNkZWZpbmUgU09fUlhRX09WRkwgICAgICAgICAgICAgNDAKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJNDEKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAjaWZkZWYgX19LRVJORUxfXwogCiAvKiogc29ja190eXBlIC0gU29ja2V0IHR5cGVzCmRpZmYgLS1naXQgYS9hcmNoL21pcHMva2VybmVsL3BlcmZfZXZlbnRfbWlwc3h4LmMgYi9hcmNoL21pcHMva2VybmVsL3BlcmZfZXZlbnRfbWlwc3h4LmMKaW5kZXggNGYyOTcxYi4uMzE1ZmMwYiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wZXJmX2V2ZW50X21pcHN4eC5jCisrKyBiL2FyY2gvbWlwcy9rZXJuZWwvcGVyZl9ldmVudF9taXBzeHguYwpAQCAtNjIzLDcgKzYyMyw3IEBACiAJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZhY3RpdmVfZXZlbnRzKSkgewogCQlpZiAoYXRvbWljX3JlYWQoJmFjdGl2ZV9ldmVudHMpID4gTUlQU19NQVhfSFdFVkVOVFMpIHsKIAkJCWF0b21pY19kZWMoJmFjdGl2ZV9ldmVudHMpOwotCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCiAJCW11dGV4X2xvY2soJnBtdV9yZXNlcnZlX211dGV4KTsKQEAgLTczMiwxNSArNzMyLDE1IEBACiAJbWVtc2V0KCZmYWtlX2NwdWMsIDAsIHNpemVvZihmYWtlX2NwdWMpKTsKIAogCWlmICghdmFsaWRhdGVfZXZlbnQoJmZha2VfY3B1YywgbGVhZGVyKSkKLQkJcmV0dXJuIC1FTk9TUEM7CisJCXJldHVybiAtRUlOVkFMOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzaWJsaW5nLCAmbGVhZGVyLT5zaWJsaW5nX2xpc3QsIGdyb3VwX2VudHJ5KSB7CiAJCWlmICghdmFsaWRhdGVfZXZlbnQoJmZha2VfY3B1Yywgc2libGluZykpCi0JCQlyZXR1cm4gLUVOT1NQQzsKKwkJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWlmICghdmFsaWRhdGVfZXZlbnQoJmZha2VfY3B1YywgZXZlbnQpKQotCQlyZXR1cm4gLUVOT1NQQzsKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggYzQ3Zjk2ZS4uNzk1NTQwOSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9taXBzL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTU2LDcgKzU2LDggQEAKIAogCS8qIGVuZGxlc3MgaWRsZSBsb29wIHdpdGggbm8gcHJpb3JpdHkgYXQgYWxsICovCiAJd2hpbGUgKDEpIHsKLQkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygxKTsKKwkJdGlja19ub2h6X2lkbGVfZW50ZXIoKTsKKwkJcmN1X2lkbGVfZW50ZXIoKTsKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiBjcHVfb25saW5lKGNwdSkpIHsKICNpZmRlZiBDT05GSUdfTUlQU19NVF9TTVRDCiAJCQlleHRlcm4gdm9pZCBzbXRjX2lkbGVfbG9vcF9ob29rKHZvaWQpOwpAQCAtNzcsNyArNzgsOCBAQAogCQkgICAgIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fQk9PVElORykpCiAJCQlwbGF5X2RlYWQoKTsKICNlbmRpZgotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCXJjdV9pZGxlX2V4aXQoKTsKKwkJdGlja19ub2h6X2lkbGVfZXhpdCgpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9taXBzL2tlcm5lbC9zZXR1cC5jCmluZGV4IDg0YWYyNmEuLmIxY2I4ZjggMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL21pcHMva2VybmVsL3NldHVwLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9zY3JlZW5faW5mby5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRyZC5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CkBAIC0zNTIsNyArMzUzLDcgQEAKIAkJCWNvbnRpbnVlOwogI2VuZGlmCiAKLQkJYWRkX2FjdGl2ZV9yYW5nZSgwLCBzdGFydCwgZW5kKTsKKwkJbWVtYmxvY2tfYWRkX25vZGUoUEZOX1BIWVMoc3RhcnQpLCBQRk5fUEhZUyhlbmQgLSBzdGFydCksIDApOwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2dpLWlwMjcvaXAyNy1tZW1vcnkuYyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LW1lbW9yeS5jCmluZGV4IGJjMTI5NzEuLmIxMDVlY2EgMTAwNjQ0Ci0tLSBhL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LW1lbW9yeS5jCisrKyBiL2FyY2gvbWlwcy9zZ2ktaXAyNy9pcDI3LW1lbW9yeS5jCkBAIC0xMiw2ICsxMiw3IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L21tem9uZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgpAQCAtMzgxLDggKzM4Miw4IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAJCQludW1fcGh5c3BhZ2VzICs9IHNsb3RfcHNpemU7Ci0JCQlhZGRfYWN0aXZlX3JhbmdlKG5vZGUsIHNsb3RfZ2V0YmFzZXBmbihub2RlLCBzbG90KSwKLQkJCQkJIHNsb3RfZ2V0YmFzZXBmbihub2RlLCBzbG90KSArIHNsb3RfcHNpemUpOworCQkJbWVtYmxvY2tfYWRkX25vZGUoUEZOX1BIWVMoc2xvdF9nZXRiYXNlcGZuKG5vZGUsIHNsb3QpKSwKKwkJCQkJICBQRk5fUEhZUyhzbG90X3BzaXplKSwgbm9kZSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL21uMTAzMDAvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggNGU2MGM0Mi4uODc2MzU2ZCAxMDA2NDQKLS0tIGEvYXJjaC9tbjEwMzAwL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvbW4xMDMwMC9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNjIsNCArNjIsNyBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vbWVtYmxvY2suaCBiL2FyY2gvb3BlbnJpc2MvaW5jbHVkZS9hc20vbWVtYmxvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlNWExYy4uMDAwMDAwMAotLS0gYS9hcmNoL29wZW5yaXNjL2luY2x1ZGUvYXNtL21lbWJsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogT3BlblJJU0MgTGludXgKLSAqCi0gKiBMaW51eCBhcmNoaXRlY3R1cmFsIHBvcnQgYm9ycm93aW5nIGxpYmVyYWxseSBmcm9tIHNpbWlsYXIgd29ya3Mgb2YKLSAqIG90aGVycy4gIEFsbCBvcmlnaW5hbCBjb3B5cmlnaHRzIGFwcGx5IGFzIHBlciB0aGUgb3JpZ2luYWwgc291cmNlCi0gKiBkZWNsYXJhdGlvbi4KLSAqCi0gKiBPcGVuUklTQyBpbXBsZW1lbnRhdGlvbjoKLSAqIENvcHlyaWdodCAoQykgMjAwMyBNYXRqYXogQnJlc2t2YXIgPHBob2VuaXhAYnNlbWkuY29tPgotICogQ29weXJpZ2h0IChDKSAyMDEwLTIwMTEgSm9uYXMgQm9ubiA8am9uYXNAc291dGhwb2xlLnNlPgotICogZXQgYWwuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Ci0gKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgotICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0jaWZuZGVmIF9fQVNNX09QRU5SSVNDX01FTUJMT0NLX0gKLSNkZWZpbmUgX19BU01fT1BFTlJJU0NfTUVNQkxPQ0tfSAotCi0vKiBlbXB0eSAqLwotCi0jZW5kaWYgLyogX19BU01fT1BFTlJJU0NfTUVNQkxPQ0tfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvaWRsZS5jIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvaWRsZS5jCmluZGV4IGQ1YmM1ZjguLmU1ZmM3ODg3IDEwMDY0NAotLS0gYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9pZGxlLmMKKysrIGIvYXJjaC9vcGVucmlzYy9rZXJuZWwvaWRsZS5jCkBAIC01MSw3ICs1MSw4IEBACiAKIAkvKiBlbmRsZXNzIGlkbGUgbG9vcCB3aXRoIG5vIHByaW9yaXR5IGF0IGFsbCAqLwogCXdoaWxlICgxKSB7Ci0JCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soMSk7CisJCXRpY2tfbm9oel9pZGxlX2VudGVyKCk7CisJCXJjdV9pZGxlX2VudGVyKCk7CiAKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewogCQkJY2hlY2tfcGd0X2NhY2hlKCk7CkBAIC02OSw3ICs3MCw4IEBACiAJCQlzZXRfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKIAkJfQogCi0JCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKKwkJcmN1X2lkbGVfZXhpdCgpOworCQl0aWNrX25vaHpfaWRsZV9leGl0KCk7CiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIAkJc2NoZWR1bGUoKTsKIAkJcHJlZW1wdF9kaXNhYmxlKCk7CmRpZmYgLS1naXQgYS9hcmNoL29wZW5yaXNjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL29wZW5yaXNjL2tlcm5lbC9wcm9tLmMKaW5kZXggMWJiNThiYS4uM2Q0NDc4ZiAxMDA2NDQKLS0tIGEvYXJjaC9vcGVucmlzYy9rZXJuZWwvcHJvbS5jCisrKyBiL2FyY2gvb3BlbnJpc2Mva2VybmVsL3Byb20uYwpAQCAtNzYsMTQgKzc2LDEzIEBACiAJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9jaG9zZW4sIGNtZF9saW5lKTsKIAogCS8qIFNjYW4gbWVtb3J5IG5vZGVzIGFuZCByZWJ1aWxkIE1FTUJMT0NLcyAqLwotCW1lbWJsb2NrX2luaXQoKTsKIAlvZl9zY2FuX2ZsYXRfZHQoZWFybHlfaW5pdF9kdF9zY2FuX3Jvb3QsIE5VTEwpOwogCW9mX3NjYW5fZmxhdF9kdChlYXJseV9pbml0X2R0X3NjYW5fbWVtb3J5LCBOVUxMKTsKIAogCS8qIFNhdmUgY29tbWFuZCBsaW5lIGZvciAvcHJvYy9jbWRsaW5lIGFuZCB0aGVuIHBhcnNlIHBhcmFtZXRlcnMgKi8KIAlzdHJsY3B5KGJvb3RfY29tbWFuZF9saW5lLCBjbWRfbGluZSwgQ09NTUFORF9MSU5FX1NJWkUpOwogCi0JbWVtYmxvY2tfYW5hbHl6ZSgpOworCW1lbWJsb2NrX2FsbG93X3Jlc2l6ZSgpOwogCiAJLyogV2UgbXVzdCBjb3B5IHRoZSBmbGF0dGVuZCBkZXZpY2UgdHJlZSBmcm9tIGluaXQgbWVtb3J5IHRvIHJlZ3VsYXIKIAkgKiBtZW1vcnkgYmVjYXVzZSB0aGUgZGV2aWNlIHRyZWUgcmVmZXJlbmNlcyB0aGUgc3RyaW5ncyBpbiBpdApkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2MvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCAyMjViN2Q2Li5kMjhjNTFiIDEwMDY0NAotLS0gYS9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9zb2NrZXQuaAorKysgYi9hcmNoL3BhcmlzYy9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNjEsNiArNjEsOSBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDB4NDAyMQogCisjZGVmaW5lIFNPX1dJRklfU1RBVFVTCQkweDQwMjIKKyNkZWZpbmUgU0NNX1dJRklfU1RBVFVTCQlTT19XSUZJX1NUQVRVUworCiAvKiBPX05PTkJMT0NLIGNsYXNoZXMgd2l0aCB0aGUgYml0cyB1c2VkIGZvciBzb2NrZXQgdHlwZXMuICBUaGVyZWZvcmUgd2UKICAqIGhhdmUgdG8gZGVmaW5lIFNPQ0tfTk9OQkxPQ0sgdG8gYSBkaWZmZXJlbnQgdmFsdWUgaGVyZS4KICAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYyBiL2FyY2gvcGFyaXNjL2tlcm5lbC90aW1lLmMKaW5kZXggNDViNzM4OS4uN2MwNzc0MyAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL3RpbWUuYworKysgYi9hcmNoL3BhcmlzYy9rZXJuZWwvdGltZS5jCkBAIC0xOTgsOCArMTk4LDYgQEAKIAkucmF0aW5nCQkJPSAzMDAsCiAJLnJlYWQJCQk9IHJlYWRfY3IxNiwKIAkubWFzawkJCT0gQ0xPQ0tTT1VSQ0VfTUFTSyhCSVRTX1BFUl9MT05HKSwKLQkubXVsdAkJCT0gMCwgLyogdG8gYmUgc2V0ICovCi0JLnNoaWZ0CQkJPSAyMiwKIAkuZmxhZ3MJCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIApAQCAtMjcwLDcgKzI2OCw1IEBACiAKIAkvKiByZWdpc3RlciBhdCBjbG9ja3NvdXJjZSBmcmFtZXdvcmsgKi8KIAljdXJyZW50X2NyMTZfa2h6ID0gUEFHRTAtPm1lbV8xMG1zZWMvMTA7ICAvKiBrSHogKi8KLQljbG9ja3NvdXJjZV9jcjE2Lm11bHQgPSBjbG9ja3NvdXJjZV9raHoybXVsdChjdXJyZW50X2NyMTZfa2h6LAotCQkJCQkJY2xvY2tzb3VyY2VfY3IxNi5zaGlmdCk7Ci0JY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX2NyMTYpOworCWNsb2Nrc291cmNlX3JlZ2lzdGVyX2toeigmY2xvY2tzb3VyY2VfY3IxNiwgY3VycmVudF9jcjE2X2toeik7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvS2NvbmZpZyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCmluZGV4IDk1MWUxOGYuLjY5MmFjNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9LY29uZmlnCkBAIC04Nyw2ICs4NywxMCBAQAogCWJvb2wKIAlkZWZhdWx0IHkgaWYgNjRCSVQKIAorY29uZmlnIEFSQ0hfSEFTX0NQVV9JRExFX1dBSVQKKwlib29sCisJZGVmYXVsdCB5CisKIGNvbmZpZyBHRU5FUklDX0hXRUlHSFQKIAlib29sCiAJZGVmYXVsdCB5CkBAIC0xMTcsNiArMTIxLDcgQEAKIAlzZWxlY3QgSEFWRV9LUkVUUFJPQkVTCiAJc2VsZWN0IEhBVkVfQVJDSF9UUkFDRUhPT0sKIAlzZWxlY3QgSEFWRV9NRU1CTE9DSworCXNlbGVjdCBIQVZFX01FTUJMT0NLX05PREVfTUFQCiAJc2VsZWN0IEhBVkVfRE1BX0FUVFJTCiAJc2VsZWN0IEhBVkVfRE1BX0FQSV9ERUJVRwogCXNlbGVjdCBVU0VfR0VORVJJQ19TTVBfSEVMUEVSUyBpZiBTTVAKQEAgLTEzMiw2ICsxMzcsNyBAQAogCXNlbGVjdCBJUlFfUEVSX0NQVQogCXNlbGVjdCBHRU5FUklDX0lSUV9TSE9XCiAJc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1dfTEVWRUwKKwlzZWxlY3QgSVJRX0ZPUkNFRF9USFJFQURJTkcKIAlzZWxlY3QgSEFWRV9SQ1VfVEFCTEVfRlJFRSBpZiBTTVAKIAlzZWxlY3QgSEFWRV9TWVNDQUxMX1RSQUNFUE9JTlRTCiAJc2VsZWN0IEhBVkVfQlBGX0pJVCBpZiAoUFBDNjQgJiYgTkVUKQpAQCAtMzYyLDggKzM2OCw5IEBACiAKIGNvbmZpZyBDUkFTSF9EVU1QCiAJYm9vbCAiQnVpbGQgYSBrZHVtcCBjcmFzaCBrZXJuZWwiCi0JZGVwZW5kcyBvbiBQUEM2NCB8fCA2eHggfHwgRlNMX0JPT0tFCi0Jc2VsZWN0IFJFTE9DQVRBQkxFIGlmIFBQQzY0IHx8IEZTTF9CT09LRQorCWRlcGVuZHMgb24gUFBDNjQgfHwgNnh4IHx8IEZTTF9CT09LRSB8fCAoNDR4ICYmICFTTVAgJiYgIVBQQ180N3gpCisJc2VsZWN0IFJFTE9DQVRBQkxFIGlmIFBQQzY0IHx8IDQ0eAorCXNlbGVjdCBEWU5BTUlDX01FTVNUQVJUIGlmIEZTTF9CT09LRQogCWhlbHAKIAkgIEJ1aWxkIGEga2VybmVsIHN1aXRhYmxlIGZvciB1c2UgYXMgYSBrZHVtcCBjYXB0dXJlIGtlcm5lbC4KIAkgIFRoZSBzYW1lIGtlcm5lbCBiaW5hcnkgY2FuIGJlIHVzZWQgYXMgcHJvZHVjdGlvbiBrZXJuZWwgYW5kIGR1bXAKQEAgLTQyMSw5ICs0MjgsNiBAQAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIChTTVAgJiYgUFBDX1BTRVJJRVMpIHx8IFBQQ19QUzMKIAotY29uZmlnIEFSQ0hfUE9QVUxBVEVTX05PREVfTUFQCi0JZGVmX2Jvb2wgeQotCiBjb25maWcgU1lTX1NVUFBPUlRTX0hVR0VUTEJGUwogCWJvb2wKIApAQCAtNjg3LDYgKzY5MSwxMCBAQAogCSAgY29udHJvbGxlci4gIEFsc28gY29udGFpbnMgc29tZSBjb21tb24gY29kZSB1c2VkIGJ5CiAJICBkcml2ZXJzIGZvciBzcGVjaWZpYyBsb2NhbCBidXMgcGVyaXBoZXJhbHMuCiAKK2NvbmZpZyBGU0xfSUZDCisJYm9vbAorICAgICAgICBkZXBlbmRzIG9uIEZTTF9TT0MKKwogY29uZmlnIEZTTF9HVE0KIAlib29sCiAJZGVwZW5kcyBvbiBQUENfODN4eCB8fCBRVUlDQ19FTkdJTkUgfHwgQ1BNMgpAQCAtNzcyLDYgKzc4MCwxMCBAQAogCiBlbmRtZW51CiAKK2NvbmZpZyBOT05TVEFUSUNfS0VSTkVMCisJYm9vbAorCWRlZmF1bHQgbgorCiBtZW51ICJBZHZhbmNlZCBzZXR1cCIKIAlkZXBlbmRzIG9uIFBQQzMyCiAKQEAgLTgyMSwxMyArODMzLDMyIEBACiAJaW50ICJOdW1iZXIgb2YgQ0FNcyB0byB1c2UgdG8gbWFwIGxvdyBtZW1vcnkiIGlmIExPV01FTV9DQU1fTlVNX0JPT0wKIAlkZWZhdWx0IDMKIAorY29uZmlnIERZTkFNSUNfTUVNU1RBUlQKKwlib29sICJFbmFibGUgcGFnZSBhbGlnbmVkIGR5bmFtaWMgbG9hZCBhZGRyZXNzIGZvciBrZXJuZWwgKEVYUEVSSU1FTlRBTCkiCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgQURWQU5DRURfT1BUSU9OUyAmJiBGTEFUTUVNICYmIChGU0xfQk9PS0UgfHwgNDR4KQorCXNlbGVjdCBOT05TVEFUSUNfS0VSTkVMCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUga2VybmVsIHRvIGJlIGxvYWRlZCBhdCBhbnkgcGFnZSBhbGlnbmVkCisJICBwaHlzaWNhbCBhZGRyZXNzLiBUaGUga2VybmVsIGNyZWF0ZXMgYSBtYXBwaW5nIGZyb20gS0VSTkVMQkFTRSB0byAKKwkgIHRoZSBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkLiBUaGUgcGFnZSBzaXplIGhlcmUgaW1wbGllcworCSAgdGhlIFRMQiBwYWdlIHNpemUgb2YgdGhlIG1hcHBpbmcgZm9yIGtlcm5lbCBvbiB0aGUgcGFydGljdWxhciBwbGF0Zm9ybS4KKwkgIFBsZWFzZSByZWZlciB0byB0aGUgaW5pdCBjb2RlIGZvciBmaW5kaW5nIHRoZSBUTEIgcGFnZSBzaXplLgorCisJICBEWU5BTUlDX01FTVNUQVJUIGlzIGFuIGVhc3kgd2F5IG9mIGltcGxlbWVudGluZyBwc2V1ZG8tUkVMT0NBVEFCTEUKKwkgIGtlcm5lbCBpbWFnZSwgd2hlcmUgdGhlIG9ubHkgcmVzdHJpY3Rpb24gaXMgdGhlIHBhZ2UgYWxpZ25lZCBrZXJuZWwKKwkgIGxvYWQgYWRkcmVzcy4gV2hlbiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGUgY29tcGlsZSB0aW1lIHBoeXNpY2FsIAorCSAgYWRkcmVzcyBDT05GSUdfUEhZU0lDQUxfU1RBUlQgaXMgaWdub3JlZC4KKworCSAgVGhpcyBvcHRpb24gaXMgb3ZlcnJpZGRlbiBieSBDT05GSUdfUkVMT0NBVEFCTEUKKwogY29uZmlnIFJFTE9DQVRBQkxFCiAJYm9vbCAiQnVpbGQgYSByZWxvY2F0YWJsZSBrZXJuZWwgKEVYUEVSSU1FTlRBTCkiCi0JZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgQURWQU5DRURfT1BUSU9OUyAmJiBGTEFUTUVNICYmIChGU0xfQk9PS0UgfHwgUFBDXzQ3eCkKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBBRFZBTkNFRF9PUFRJT05TICYmIEZMQVRNRU0gJiYgNDR4CisJc2VsZWN0IE5PTlNUQVRJQ19LRVJORUwKIAloZWxwCiAJICBUaGlzIGJ1aWxkcyBhIGtlcm5lbCBpbWFnZSB0aGF0IGlzIGNhcGFibGUgb2YgcnVubmluZyBhdCB0aGUKLQkgIGxvY2F0aW9uIHRoZSBrZXJuZWwgaXMgbG9hZGVkIGF0IChzb21lIGFsaWdubWVudCByZXN0cmljdGlvbnMgbWF5Ci0JICBleGlzdCkuCisJICBsb2NhdGlvbiB0aGUga2VybmVsIGlzIGxvYWRlZCBhdCwgd2l0aG91dCBhbnkgYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4KKwkgIFRoaXMgZmVhdHVyZSBpcyBhIHN1cGVyc2V0IG9mIERZTkFNSUNfTUVNU1RBUlQgYW5kIGhlbmNlIG92ZXJyaWRlcyBpdC4KIAogCSAgT25lIHVzZSBpcyBmb3IgdGhlIGtleGVjIG9uIHBhbmljIGNhc2Ugd2hlcmUgdGhlIHJlY292ZXJ5IGtlcm5lbAogCSAgbXVzdCBsaXZlIGF0IGEgZGlmZmVyZW50IHBoeXNpY2FsIGFkZHJlc3MgdGhhbiB0aGUgcHJpbWFyeQpAQCAtODM3LDcgKzg2OCwxMSBAQAogCSAgaXQgaGFzIGJlZW4gbG9hZGVkIGF0IGFuZCB0aGUgY29tcGlsZSB0aW1lIHBoeXNpY2FsIGFkZHJlc3NlcwogCSAgQ09ORklHX1BIWVNJQ0FMX1NUQVJUIGlzIGlnbm9yZWQuICBIb3dldmVyIENPTkZJR19QSFlTSUNBTF9TVEFSVAogCSAgc2V0dGluZyBjYW4gc3RpbGwgYmUgdXNlZnVsIHRvIGJvb3R3cmFwcGVycyB0aGF0IG5lZWQgdG8ga25vdyB0aGUKLQkgIGxvYWQgbG9jYXRpb24gb2YgdGhlIGtlcm5lbCAoZWcuIHUtYm9vdC9ta2ltYWdlKS4KKwkgIGxvYWQgYWRkcmVzcyBvZiB0aGUga2VybmVsIChlZy4gdS1ib290L21raW1hZ2UpLgorCitjb25maWcgUkVMT0NBVEFCTEVfUFBDMzIKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBQUEMzMiAmJiBSRUxPQ0FUQUJMRQogCiBjb25maWcgUEFHRV9PRkZTRVRfQk9PTAogCWJvb2wgIlNldCBjdXN0b20gcGFnZSBvZmZzZXQgYWRkcmVzcyIKQEAgLTg2Nyw3ICs5MDIsNyBAQAogY29uZmlnIEtFUk5FTF9TVEFSVAogCWhleCAiVmlydHVhbCBhZGRyZXNzIG9mIGtlcm5lbCBiYXNlIiBpZiBLRVJORUxfU1RBUlRfQk9PTAogCWRlZmF1bHQgUEFHRV9PRkZTRVQgaWYgUEFHRV9PRkZTRVRfQk9PTAotCWRlZmF1bHQgIjB4YzIwMDAwMDAiIGlmIENSQVNIX0RVTVAgJiYgIVJFTE9DQVRBQkxFCisJZGVmYXVsdCAiMHhjMjAwMDAwMCIgaWYgQ1JBU0hfRFVNUCAmJiAhTk9OU1RBVElDX0tFUk5FTAogCWRlZmF1bHQgIjB4YzAwMDAwMDAiCiAKIGNvbmZpZyBQSFlTSUNBTF9TVEFSVF9CT09MCkBAIC04ODAsNyArOTE1LDcgQEAKIAogY29uZmlnIFBIWVNJQ0FMX1NUQVJUCiAJaGV4ICJQaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkIiBpZiBQSFlTSUNBTF9TVEFSVF9CT09MCi0JZGVmYXVsdCAiMHgwMjAwMDAwMCIgaWYgUFBDX1NURF9NTVUgJiYgQ1JBU0hfRFVNUCAmJiAhUkVMT0NBVEFCTEUKKwlkZWZhdWx0ICIweDAyMDAwMDAwIiBpZiBQUENfU1REX01NVSAmJiBDUkFTSF9EVU1QICYmICFOT05TVEFUSUNfS0VSTkVMCiAJZGVmYXVsdCAiMHgwMDAwMDAwMCIKIAogY29uZmlnIFBIWVNJQ0FMX0FMSUdOCkBAIC05MjYsNiArOTYxLDcgQEAKIGlmIFBQQzY0CiBjb25maWcgUkVMT0NBVEFCTEUKIAlib29sICJCdWlsZCBhIHJlbG9jYXRhYmxlIGtlcm5lbCIKKwlzZWxlY3QgTk9OU1RBVElDX0tFUk5FTAogCWhlbHAKIAkgIFRoaXMgYnVpbGRzIGEga2VybmVsIGltYWdlIHRoYXQgaXMgY2FwYWJsZSBvZiBydW5uaW5nIGFueXdoZXJlCiAJICBpbiB0aGUgUk1BIChyZWFsIG1lbW9yeSBhcmVhKSBhdCBhbnkgMTZrLWFsaWduZWQgYmFzZSBhZGRyZXNzLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL0tjb25maWcuZGVidWcgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZwppbmRleCAxYjhhOWM5Li40Y2NiMmEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3Bvd2VycGMvS2NvbmZpZy5kZWJ1ZwpAQCAtMzM2LDQgKzMzNiwxNiBAQAogCSAgcGxhdGZvcm0gcHJvYmluZyBpcyBkb25lLCBhbGwgcGxhdGZvcm1zIHNlbGVjdGVkIG11c3QKIAkgIHNoYXJlIHRoZSBzYW1lIGFkZHJlc3MuCiAKK2NvbmZpZyBTVFJJQ1RfREVWTUVNCisJZGVmX2Jvb2wgeQorCXByb21wdCAiRmlsdGVyIGFjY2VzcyB0byAvZGV2L21lbSIKKwloZWxwCisJICBUaGlzIG9wdGlvbiByZXN0cmljdHMgYWNjZXNzIHRvIC9kZXYvbWVtLiAgSWYgdGhpcyBvcHRpb24gaXMKKwkgIGRpc2FibGVkLCB5b3UgYWxsb3cgdXNlcnNwYWNlIGFjY2VzcyB0byBhbGwgbWVtb3J5LCBpbmNsdWRpbmcKKwkgIGtlcm5lbCBhbmQgdXNlcnNwYWNlIG1lbW9yeS4gQWNjaWRlbnRhbCBtZW1vcnkgYWNjZXNzIGlzIGxpa2VseQorCSAgdG8gYmUgZGlzYXN0cm91cy4KKwkgIE1lbW9yeSBhY2Nlc3MgaXMgcmVxdWlyZWQgZm9yIGV4cGVydHMgd2hvIHdhbnQgdG8gZGVidWcgdGhlIGtlcm5lbC4KKworCSAgSWYgeW91IGFyZSB1bnN1cmUsIHNheSBZLgorCiBlbmRtZW51CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvTWFrZWZpbGUKaW5kZXggNzBiYTBjMC4uYjhiMTA1YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9NYWtlZmlsZQpAQCAtNjMsOSArNjMsOSBAQAogb3ZlcnJpZGUgQVIJOj0gR05VVEFSR0VUPWVsZiQoQ09ORklHX1dPUkRfU0laRSktcG93ZXJwYyAkKEFSKQogZW5kaWYKIAotTERGTEFHU192bWxpbnV4LXl5IDo9IC1Cc3RhdGljCi1MREZMQUdTX3ZtbGludXgtJChDT05GSUdfUFBDNjQpJChDT05GSUdfUkVMT0NBVEFCTEUpIDo9IC1waWUKLUxERkxBR1Nfdm1saW51eAk6PSAkKExERkxBR1Nfdm1saW51eC15eSkKK0xERkxBR1Nfdm1saW51eC15IDo9IC1Cc3RhdGljCitMREZMQUdTX3ZtbGludXgtJChDT05GSUdfUkVMT0NBVEFCTEUpIDo9IC1waWUKK0xERkxBR1Nfdm1saW51eAk6PSAkKExERkxBR1Nfdm1saW51eC15KQogCiBDRkxBR1MtJChDT05GSUdfUFBDNjQpCTo9IC1tbWluaW1hbC10b2MgLW10cmFjZWJhY2s9bm8gLW1jYWxsLWFpeGRlc2MKIENGTEFHUy0kKENPTkZJR19QUEMzMikJOj0gLWZmaXhlZC1yMiAtbW11bHRpcGxlCkBAIC0xMzEsOCArMTMxLDcgQEAKIGVuZGlmCiAKIGNwdS1hcy0kKENPTkZJR180eHgpCQkrPSAtV2EsLW00MDUKLWNwdS1hcy0kKENPTkZJR182eHgpCQkrPSAtV2EsLW1hbHRpdmVjCi1jcHUtYXMtJChDT05GSUdfUE9XRVI0KQkJKz0gLVdhLC1tYWx0aXZlYworY3B1LWFzLSQoQ09ORklHX0FMVElWRUMpCSs9IC1XYSwtbWFsdGl2ZWMKIGNwdS1hcy0kKENPTkZJR19FNTAwKQkJKz0gLVdhLC1tZTUwMAogY3B1LWFzLSQoQ09ORklHX0UyMDApCQkrPSAtV2EsLW1lMjAwCiAKQEAgLTE2Niw3ICsxNjUsNyBAQAogCiAjIFdpdGggbWFrZSAzLjgyIHdlIGNhbm5vdCBtaXggbm9ybWFsIGFuZCB3aWxkY2FyZCB0YXJnZXRzCiBCT09UX1RBUkdFVFMxIDo9IHpJbWFnZSB6SW1hZ2UuaW5pdHJkIHVJbWFnZQotQk9PVF9UQVJHRVRTMiA6PSB6SW1hZ2UlIGR0YkltYWdlJSB0cmVlSW1hZ2UuJSBjdUltYWdlLiUgc2ltcGxlSW1hZ2UuJQorQk9PVF9UQVJHRVRTMiA6PSB6SW1hZ2UlIGR0YkltYWdlJSB0cmVlSW1hZ2UuJSBjdUltYWdlLiUgc2ltcGxlSW1hZ2UuJSB1SW1hZ2UuJQogCiBQSE9OWSArPSAkKEJPT1RfVEFSR0VUUzEpICQoQk9PVF9UQVJHRVRTMikKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQppbmRleCA3MmVlOGMxLi4xNTk4NmU3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9NYWtlZmlsZQpAQCAtNDUsNiArNDUsNyBAQAogJChvYmopL2N1Ym9vdC1hY2FkaWEubzogQk9PVENGTEFHUyArPSAtbWNwdT00MDUKICQob2JqKS90cmVlYm9vdC13YWxudXQubzogQk9PVENGTEFHUyArPSAtbWNwdT00MDUKICQob2JqKS90cmVlYm9vdC1pc3M0eHgubzogQk9PVENGTEFHUyArPSAtbWNwdT00MDUKKyQob2JqKS90cmVlYm9vdC1jdXJyaXR1Y2subzogQk9PVENGTEFHUyArPSAtbWNwdT00MDUKICQob2JqKS92aXJ0ZXg0MDUtaGVhZC5vOiBCT09UQUZMQUdTICs9IC1tY3B1PTQwNQogCiAKQEAgLTc5LDcgKzgwLDggQEAKIAkJY3Vib290LXdhcnAuYyBjdWJvb3QtODV4eC1jcG0yLmMgY3Vib290LXlvc2VtaXRlLmMgc2ltcGxlYm9vdC5jIFwKIAkJdmlydGV4NDA1LWhlYWQuUyB2aXJ0ZXguYyByZWRib290LTgzeHguYyBjdWJvb3Qtc2FtNDQwZXAuYyBcCiAJCWN1Ym9vdC1hY2FkaWEuYyBjdWJvb3QtYW1pZ2FvbmUuYyBjdWJvb3Qta2lsYXVlYS5jIFwKLQkJZ2FtZWN1YmUtaGVhZC5TIGdhbWVjdWJlLmMgd2lpLWhlYWQuUyB3aWkuYyB0cmVlYm9vdC1pc3M0eHguYworCQlnYW1lY3ViZS1oZWFkLlMgZ2FtZWN1YmUuYyB3aWktaGVhZC5TIHdpaS5jIHRyZWVib290LWlzczR4eC5jIFwKKwkJdHJlZWJvb3QtY3Vycml0dWNrLmMKIHNyYy1ib290IDo9ICQoc3JjLXdsaWIpICQoc3JjLXBsYXQpIGVtcHR5LmMKIAogc3JjLWJvb3QgOj0gJChhZGRwcmVmaXggJChvYmopLywgJChzcmMtYm9vdCkpCkBAIC0xOTksNiArMjAxLDcgQEAKIGltYWdlLSQoQ09ORklHX0hPVEZPT1QpCQkJKz0gY3VJbWFnZS5ob3Rmb290CiBpbWFnZS0kKENPTkZJR19XQUxOVVQpCQkJKz0gdHJlZUltYWdlLndhbG51dAogaW1hZ2UtJChDT05GSUdfQUNBRElBKQkJCSs9IGN1SW1hZ2UuYWNhZGlhCitpbWFnZS0kKENPTkZJR19PQlM2MDApCQkJKz0gdUltYWdlLm9iczYwMAogCiAjIEJvYXJkIHBvcnRzIGluIGFyY2gvcG93ZXJwYy9wbGF0Zm9ybS80NHgvS2NvbmZpZwogaW1hZ2UtJChDT05GSUdfRUJPTlkpCQkJKz0gdHJlZUltYWdlLmVib255IGN1SW1hZ2UuZWJvbnkKQEAgLTIxMiw2ICsyMTUsNyBAQAogaW1hZ2UtJChDT05GSUdfWU9TRU1JVEUpCQkrPSBjdUltYWdlLnlvc2VtaXRlCiBpbWFnZS0kKENPTkZJR19JU1M0eHgpCQkJKz0gdHJlZUltYWdlLmlzczR4eCBcCiAJCQkJCSAgIHRyZWVJbWFnZS5pc3M0eHgtbXBpYworaW1hZ2UtJChDT05GSUdfQ1VSUklUVUNLKQkJCSs9IHRyZWVJbWFnZS5jdXJyaXR1Y2sKIAogIyBCb2FyZCBwb3J0cyBpbiBhcmNoL3Bvd2VycGMvcGxhdGZvcm0vOHh4L0tjb25maWcKIGltYWdlLSQoQ09ORklHX01QQzg2WEFEUykJCSs9IGN1SW1hZ2UubXBjODY2YWRzCkBAIC0zMTYsNiArMzIwLDEyIEBACiAkKG9iaikvdUltYWdlOiB2bWxpbnV4ICQod3JhcHBlcmJpdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCx1Ym9vdCkKIAorJChvYmopL3VJbWFnZS5pbml0cmQuJTogdm1saW51eCAkKG9iaikvJS5kdGIgJCh3cmFwcGVyYml0cykKKwkkKGNhbGwgaWZfY2hhbmdlZCx3cmFwLHVib290LSQqLCwkKG9iaikvJCouZHRiLCQob2JqKS9yYW1kaXNrLmltYWdlLmd6KQorCiskKG9iaikvdUltYWdlLiU6IHZtbGludXggJChvYmopLyUuZHRiICQod3JhcHBlcmJpdHMpCisJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCx1Ym9vdC0kKiwsJChvYmopLyQqLmR0YikKKwogJChvYmopL2N1SW1hZ2UuaW5pdHJkLiU6IHZtbGludXggJChvYmopLyUuZHRiICQod3JhcHBlcmJpdHMpCiAJJChjYWxsIGlmX2NoYW5nZWQsd3JhcCxjdWJvb3QtJCosLCQob2JqKS8kKi5kdGIsJChvYmopL3JhbWRpc2suaW1hZ2UuZ3opCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2Rjci5oIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKaW5kZXggNjQ1YTdjOS4uY2M3M2Y3YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGNyLmgKQEAgLTksNiArOSwxMiBAQAogCX0pCiAjZGVmaW5lIG10ZGNyKHJuLCB2YWwpIFwKIAlhc20gdm9sYXRpbGUoIm10ZGNyICUwLCUxIiA6IDogImkiKHJuKSwgInIiKHZhbCkpCisjZGVmaW5lIG1mZGNyeChybikgXAorCSh7CVwKKwkJdW5zaWduZWQgbG9uZyBydmFsOyBcCisJCWFzbSB2b2xhdGlsZSgibWZkY3J4ICUwLCUxIiA6ICI9ciIocnZhbCkgOiAiciIocm4pKTsgXAorCQlydmFsOyBcCisJfSkKIAogLyogNDQwR1AvNDQwR1ggU0RSQU0gY29udHJvbGxlciBEQ1JzICovCiAjZGVmaW5lIERDUk5fU0RSQU0wX0NGR0FERFIJCQkJMHgwMTAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2RpdjY0LlMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kaXY2NC5TCmluZGV4IGQyNzFhYjUuLmJiY2I4YTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2RpdjY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZGl2NjQuUwpAQCAtNTcsMyArNTcsNTUgQEAKIAlzdHcJcjgsNChyMykKIAltcglyMyxyNgkJIyByZXR1cm4gdGhlIHJlbWFpbmRlciBpbiByMwogCWJscgorCisvKgorICogRXh0ZW5kZWQgcHJlY2lzaW9uIHNoaWZ0cy4KKyAqCisgKiBVcGRhdGVkIHRvIGJlIHZhbGlkIGZvciBzaGlmdCBjb3VudHMgZnJvbSAwIHRvIDYzIGluY2x1c2l2ZS4KKyAqIC0tIEdhYnJpZWwKKyAqCisgKiBSMy9SNCBoYXMgNjQgYml0IHZhbHVlCisgKiBSNSAgICBoYXMgc2hpZnQgY291bnQKKyAqIHJlc3VsdCBpbiBSMy9SNAorICoKKyAqICBhc2hyZGkzOiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0IChzaWduIHByb3BhZ2F0aW9uKQkKKyAqICBsc2hyZGkzOiBsb2dpY2FsIHJpZ2h0IHNoaWZ0CisgKiAgYXNobGRpMzogbGVmdCBzaGlmdAorICovCisJLmdsb2JsIF9fYXNocmRpMworX19hc2hyZGkzOgorCXN1YmZpYwlyNixyNSwzMgorCXNydwlyNCxyNCxyNQkjIExTVyA9IGNvdW50ID4gMzEgPyAwIDogTFNXID4+IGNvdW50CisJYWRkaQlyNyxyNSwzMgkjIGNvdWxkIGJlIHhvcmksIG9yIGFkZGkgd2l0aCAtMzIKKwlzbHcJcjYscjMscjYJIyB0MSA9IGNvdW50ID4gMzEgPyAwIDogTVNXIDw8ICgzMi1jb3VudCkKKwlybHdpbm0JcjgscjcsMCwzMgkjIHQzID0gKGNvdW50IDwgMzIpID8gMzIgOiAwCisJc3JhdwlyNyxyMyxyNwkjIHQyID0gTVNXID4+IChjb3VudC0zMikKKwlvcglyNCxyNCxyNgkjIExTVyB8PSB0MQorCXNsdwlyNyxyNyxyOAkjIHQyID0gKGNvdW50IDwgMzIpID8gMCA6IHQyCisJc3JhdwlyMyxyMyxyNQkjIE1TVyA9IE1TVyA+PiBjb3VudAorCW9yCXI0LHI0LHI3CSMgTFNXIHw9IHQyCisJYmxyCisKKwkuZ2xvYmwgX19hc2hsZGkzCitfX2FzaGxkaTM6CisJc3ViZmljCXI2LHI1LDMyCisJc2x3CXIzLHIzLHI1CSMgTVNXID0gY291bnQgPiAzMSA/IDAgOiBNU1cgPDwgY291bnQKKwlhZGRpCXI3LHI1LDMyCSMgY291bGQgYmUgeG9yaSwgb3IgYWRkaSB3aXRoIC0zMgorCXNydwlyNixyNCxyNgkjIHQxID0gY291bnQgPiAzMSA/IDAgOiBMU1cgPj4gKDMyLWNvdW50KQorCXNsdwlyNyxyNCxyNwkjIHQyID0gY291bnQgPCAzMiA/IDAgOiBMU1cgPDwgKGNvdW50LTMyKQorCW9yCXIzLHIzLHI2CSMgTVNXIHw9IHQxCisJc2x3CXI0LHI0LHI1CSMgTFNXID0gTFNXIDw8IGNvdW50CisJb3IJcjMscjMscjcJIyBNU1cgfD0gdDIKKwlibHIKKworCS5nbG9ibCBfX2xzaHJkaTMKK19fbHNocmRpMzoKKwlzdWJmaWMJcjYscjUsMzIKKwlzcncJcjQscjQscjUJIyBMU1cgPSBjb3VudCA+IDMxID8gMCA6IExTVyA+PiBjb3VudAorCWFkZGkJcjcscjUsMzIJIyBjb3VsZCBiZSB4b3JpLCBvciBhZGRpIHdpdGggLTMyCisJc2x3CXI2LHIzLHI2CSMgdDEgPSBjb3VudCA+IDMxID8gMCA6IE1TVyA8PCAoMzItY291bnQpCisJc3J3CXI3LHIzLHI3CSMgdDIgPSBjb3VudCA8IDMyID8gMCA6IE1TVyA+PiAoY291bnQtMzIpCisJb3IJcjQscjQscjYJIyBMU1cgfD0gdDEKKwlzcncJcjMscjMscjUJIyBNU1cgPSBNU1cgPj4gY291bnQKKwlvcglyNCxyNCxyNwkjIExTVyB8PSB0MgorCWJscgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2FzcDgzNHgtcmVkYm9vdC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYXNwODM0eC1yZWRib290LmR0cwppbmRleCAyNjFkMTBjLi4yMjcyOTBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYXNwODM0eC1yZWRib290LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvYXNwODM0eC1yZWRib290LmR0cwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw0MDAwMDAwMDA+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CkBAIC0yNjYsNyArMjY2LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDQwMDAwMDAwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDB4OD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY3Vycml0dWNrLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9jdXJyaXR1Y2suZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDFkZDAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvY3Vycml0dWNrLmR0cwpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIERldmljZSBUcmVlIFNvdXJjZSBmb3IgSUJNIEVtYmVkZGVkIFBQQyA0NzYgUGxhdGZvcm0KKyAqCisgKiBDb3B5cmlnaHQgwqkgMjAxMSBUb255IEJyZWVkcyBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dAorICogYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisvZHRzLXYxLzsKKworL21lbXJlc2VydmUvIDB4MDFmMDAwMDAgMHgwMDEwMDAwMDsJLy8gc3BpbiB0YWJsZQorCisvIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwltb2RlbCA9ICJpYm0sY3Vycml0dWNrIjsKKwljb21wYXRpYmxlID0gImlibSxjdXJyaXR1Y2siOworCWRjci1wYXJlbnQgPSA8JnsvY3B1cy9jcHVAMH0+OworCisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmVUFSVDA7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY3B1QDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCW1vZGVsID0gIlBvd2VyUEMsNDc2IjsKKwkJCXJlZyA9IDwwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxNjAwMDAwMDAwPjsgLy8gMS42IEdIegorCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDEwMDAwMDAwMD47IC8vIDEwME1oegorCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJaS1jYWNoZS1zaXplID0gPDMyNzY4PjsKKwkJCWQtY2FjaGUtc2l6ZSA9IDwzMjc2OD47CisJCQlkY3ItY29udHJvbGxlcjsKKwkJCWRjci1hY2Nlc3MtbWV0aG9kID0gIm5hdGl2ZSI7CisJCQlzdGF0dXMgPSAib2siOworCQl9OworCQljcHVAMSB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJbW9kZWwgPSAiUG93ZXJQQyw0NzYiOworCQkJcmVnID0gPDE+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDE2MDAwMDAwMDA+OyAvLyAxLjYgR0h6CisJCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MTAwMDAwMDAwPjsgLy8gMTAwTWh6CisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLXNpemUgPSA8MzI3Njg+OworCQkJZC1jYWNoZS1zaXplID0gPDMyNzY4PjsKKwkJCWRjci1jb250cm9sbGVyOworCQkJZGNyLWFjY2Vzcy1tZXRob2QgPSAibmF0aXZlIjsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQllbmFibGUtbWV0aG9kID0gInNwaW4tdGFibGUiOworCQkJY3B1LXJlbGVhc2UtYWRkciA9IDwweDAgMHgwMWYwMDAwMD47CisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAgMHgwIDB4MCAweDA+OyAvLyBmaWxsZWQgaW4gYnkgekltYWdlCisJfTsKKworCU1QSUM6IGludGVycnVwdC1jb250cm9sbGVyIHsKKwkJY29tcGF0aWJsZSA9ICJjaHJwLG9wZW4tcGljIjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCWRjci1yZWcgPSA8MHhmZmMwMDAwMCAweDAwMDQwMDAwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCisJfTsKKworCXBsYiB7CisJCWNvbXBhdGlibGUgPSAiaWJtLHBsYjYiOworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCXJhbmdlczsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDIwMDAwMDAwMD47IC8vIDIwME1oegorCisJCVBPQjA6IG9wYiB7CisJCQljb21wYXRpYmxlID0gImlibSxvcGItNHh4IiwgImlibSxvcGIiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCS8qIFdpc2ggdGhlcmUgd2FzIGEgbmljZXIgd2F5IG9mIHNwZWNpZnlpbmcgYSBmdWxsCisJCQkgKiAzMi1iaXQgcmFuZ2UKKwkJCSAqLworCQkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHgwMDAwMDIwMCAweDAwMDAwMDAwIDB4ODAwMDAwMDAKKwkJCQkgIDB4ODAwMDAwMDAgMHgwMDAwMDIwMCAweDgwMDAwMDAwIDB4ODAwMDAwMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEwMDAwMDAwMD47CisKKwkJCVVBUlQwOiBzZXJpYWxAMTAwMDAwMDAgeworCQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQkJY29tcGF0aWJsZSA9ICJuczE2NzUwIiwgIm5zMTY1NTAiOworCQkJCXJlZyA9IDwweDEwMDAwMDAwIDB4MDAwMDAwMDg+OworCQkJCXZpcnR1YWwtcmVnID0gPDB4ZTEwMDAwMDA+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxODUxODUxPjsgLy8gUENJZSByZWZjbGsvTUNHQzBfQ1RMW1VBUlRdCisJCQkJY3VycmVudC1zcGVlZCA9IDwxMTUyMDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1QSUM+OworCQkJCWludGVycnVwdHMgPSA8MzQgMj47CisJCQl9OworCisJCQlJSUMwOiBpMmNAMDAwMDAwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiaWJtLGlpYy1jdXJyaXR1Y2siLCAiaWJtLGlpYyI7CisJCQkJcmVnID0gPDB4MCAweDAwMDAwMDE0PjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZNUElDPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDc5IDI+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGNANjggeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAic3RtLG00MXQ4MCIsICJtNDFzdDg1IjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWcgPSA8MHg2OD47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisJCQl9OworCQl9OworCisJCVBDSUUwOiBwY2lleEAxMDEwMDAwMDAwMCB7CQkvLyA0eEdCSUYxCisJCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQljb21wYXRpYmxlID0gImlibSxwbGItcGNpZXgtNDc2ZnBlIiwgImlibSxwbGItcGNpZXgiOworCQkJcHJpbWFyeTsKKwkJCXBvcnQgPSA8MHgwPjsgLyogcG9ydCBudW1iZXIgKi8KKwkJCXJlZyA9IDwweDAwMDAwMTAxIDB4MDAwMDAwMDAgMHgwIDB4MTAwMDAwMDAJCS8qIENvbmZpZyBzcGFjZSBhY2Nlc3MgKi8KKwkJCSAgICAgICAweDAwMDAwMTAwIDB4MDAwMDAwMDAgMHgwIDB4MDAwMDEwMDA+OwkvKiBVVEwgUmVnaXN0ZXJzIHNwYWNlIGFjY2VzcyAqLworCQkJZGNyLXJlZyA9IDwweDgwIDB4MjA+OworCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3NwYWNlICA8IHBjaV9hZGRyICAgICAgICAgID4gPCBjcHVfYWRkciAgICAgICAgICA+IDwgc2l6ZSAgICAgICA+CisJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAwMDAwMDAwIDB4ODAwMDAwMDAgMHgwMDAwMDExMCAweDgwMDAwMDAwIDB4MCAweDgwMDAwMDAwCisJCQkgICAgICAgICAgMHgwMTAwMDAwMCAweDAgICAgICAgIDB4MCAgICAgICAgMHgwMDAwMDE0MCAweDAgICAgICAgIDB4MCAweDAwMDEwMDAwPjsKKworCQkJLyogSW5ib3VuZCBzdGFydGluZyBhdCAwIHRvIG1lbXNpemUgZmlsbGVkIGluIGJ5IHpJbWFnZSAqLworCQkJZG1hLXJhbmdlcyA9IDwweDQyMDAwMDAwIDB4MCAweDAgMHgwIDB4MCAweDAgMHgwPjsKKworCQkJLyogVGhpcyBkcml2ZXMgYnVzc2VzIDAgdG8gMHhmICovCisJCQlidXMtcmFuZ2UgPSA8MHgwIDB4Zj47CisKKwkJCS8qIExlZ2FjeSBpbnRlcnJ1cHRzIChub3RlIHRoZSB3ZWlyZCBwb2xhcml0eSwgdGhlIGJyaWRnZSBzZWVtcworCQkJICogdG8gaW52ZXJ0IFBDSWUgbGVnYWN5IGludGVycnVwdHMpLgorCQkJICogV2UgYXJlIGRlLXN3aXp6bGluZyBoZXJlIGJlY2F1c2UgdGhlIG51bWJlcnMgYXJlIGFjdHVhbGx5IGZvcgorCQkJICogcG9ydCBvZiB0aGUgcm9vdCBjb21wbGV4IHZpcnR1YWwgUDJQIGJyaWRnZS4gQnV0IEkgd2FudAorCQkJICogdG8gYXZvaWQgcHV0dGluZyBhIG5vZGUgZm9yIGl0IGluIHRoZSB0cmVlLCBzbyB0aGUgbnVtYmVycworCQkJICogYmVsb3cgYXJlIGJhc2ljYWxseSBkZS1zd2l6emxlZCBudW1iZXJzLgorCQkJICogVGhlIHJlYWwgc2xvdCBpcyBvbiBpZHNlbCAwLCBzbyB0aGUgc3dpenpsaW5nIGlzIDE6MQorCQkJICovCisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHgwIDB4MCAweDAgMHg3PjsKKwkJCWludGVycnVwdC1tYXAgPSA8CisJCQkJMHgwIDB4MCAweDAgMHgxICZNUElDIDQ2IDB4MiAvKiBpbnQgQSAqLworCQkJCTB4MCAweDAgMHgwIDB4MiAmTVBJQyA0NyAweDIgLyogaW50IEIgKi8KKwkJCQkweDAgMHgwIDB4MCAweDMgJk1QSUMgNDggMHgyIC8qIGludCBDICovCisJCQkJMHgwIDB4MCAweDAgMHg0ICZNUElDIDQ5IDB4MiAvKiBpbnQgRCAqLz47CisJCX07CisKKwkJUENJRTE6IHBjaWV4QDMwMTAwMDAwMDAwIHsJCS8vIDR4R0JJRjAKKwkJCWRldmljZV90eXBlID0gInBjaSI7CisJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCWNvbXBhdGlibGUgPSAiaWJtLHBsYi1wY2lleC00NzZmcGUiLCAiaWJtLHBsYi1wY2lleCI7CisJCQlwcmltYXJ5OworCQkJcG9ydCA9IDwweDE+OyAvKiBwb3J0IG51bWJlciAqLworCQkJcmVnID0gPDB4MDAwMDAzMDEgMHgwMDAwMDAwMCAweDAgMHgxMDAwMDAwMAkJLyogQ29uZmlnIHNwYWNlIGFjY2VzcyAqLworCQkJICAgICAgIDB4MDAwMDAzMDAgMHgwMDAwMDAwMCAweDAgMHgwMDAwMTAwMD47CS8qIFVUTCBSZWdpc3RlcnMgc3BhY2UgYWNjZXNzICovCisJCQlkY3ItcmVnID0gPDB4NjAgMHgyMD47CisKKwkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MDAwMDAwMDAgMHg4MDAwMDAwMCAweDAwMDAwMzEwIDB4ODAwMDAwMDAgMHgwIDB4ODAwMDAwMDAKKwkJCSAgICAgICAgICAweDAxMDAwMDAwIDB4MCAgICAgICAgMHgwICAgICAgICAweDAwMDAwMzQwIDB4MCAgICAgICAgMHgwIDB4MDAwMTAwMDA+OworCisJCQkvKiBJbmJvdW5kIHN0YXJ0aW5nIGF0IDAgdG8gbWVtc2l6ZSBmaWxsZWQgaW4gYnkgekltYWdlICovCisJCQlkbWEtcmFuZ2VzID0gPDB4NDIwMDAwMDAgMHgwIDB4MCAweDAgMHgwIDB4MCAweDA+OworCisJCQkvKiBUaGlzIGRyaXZlcyBidXNzZXMgMCB0byAweGYgKi8KKwkJCWJ1cy1yYW5nZSA9IDwweDAgMHhmPjsKKworCQkJLyogTGVnYWN5IGludGVycnVwdHMgKG5vdGUgdGhlIHdlaXJkIHBvbGFyaXR5LCB0aGUgYnJpZGdlIHNlZW1zCisJCQkgKiB0byBpbnZlcnQgUENJZSBsZWdhY3kgaW50ZXJydXB0cykuCisJCQkgKiBXZSBhcmUgZGUtc3dpenpsaW5nIGhlcmUgYmVjYXVzZSB0aGUgbnVtYmVycyBhcmUgYWN0dWFsbHkgZm9yCisJCQkgKiBwb3J0IG9mIHRoZSByb290IGNvbXBsZXggdmlydHVhbCBQMlAgYnJpZGdlLiBCdXQgSSB3YW50CisJCQkgKiB0byBhdm9pZCBwdXR0aW5nIGEgbm9kZSBmb3IgaXQgaW4gdGhlIHRyZWUsIHNvIHRoZSBudW1iZXJzCisJCQkgKiBiZWxvdyBhcmUgYmFzaWNhbGx5IGRlLXN3aXp6bGVkIG51bWJlcnMuCisJCQkgKiBUaGUgcmVhbCBzbG90IGlzIG9uIGlkc2VsIDAsIHNvIHRoZSBzd2l6emxpbmcgaXMgMToxCisJCQkgKi8KKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweDAgMHgwIDB4MCAweDc+OworCQkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCQkweDAgMHgwIDB4MCAweDEgJk1QSUMgMzggMHgyIC8qIGludCBBICovCisJCQkJMHgwIDB4MCAweDAgMHgyICZNUElDIDM5IDB4MiAvKiBpbnQgQiAqLworCQkJCTB4MCAweDAgMHgwIDB4MyAmTVBJQyA0MCAweDIgLyogaW50IEMgKi8KKwkJCQkweDAgMHgwIDB4MCAweDQgJk1QSUMgNDEgMHgyIC8qIGludCBEICovPjsKKwkJfTsKKworCQlQQ0lFMjogcGNpZXhAMzgxMDAwMDAwMDAgewkJLy8gMnhHQklGMAorCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJY29tcGF0aWJsZSA9ICJpYm0scGxiLXBjaWV4LTQ3NmZwZSIsICJpYm0scGxiLXBjaWV4IjsKKwkJCXByaW1hcnk7CisJCQlwb3J0ID0gPDB4Mj47IC8qIHBvcnQgbnVtYmVyICovCisJCQlyZWcgPSA8MHgwMDAwMDM4MSAweDAwMDAwMDAwIDB4MCAweDEwMDAwMDAwCQkvKiBDb25maWcgc3BhY2UgYWNjZXNzICovCisJCQkgICAgICAgMHgwMDAwMDM4MCAweDAwMDAwMDAwIDB4MCAweDAwMDAxMDAwPjsJLyogVVRMIFJlZ2lzdGVycyBzcGFjZSBhY2Nlc3MgKi8KKwkJCWRjci1yZWcgPSA8MHhBMCAweDIwPjsKKworCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwMDAwMDAwMCAweDgwMDAwMDAwIDB4MDAwMDAzOTAgMHg4MDAwMDAwMCAweDAgMHg4MDAwMDAwMAorCQkJICAgICAgICAgIDB4MDEwMDAwMDAgMHgwICAgICAgICAweDAgICAgICAgIDB4MDAwMDAzQzAgMHgwICAgICAgICAweDAgMHgwMDAxMDAwMD47CisKKwkJCS8qIEluYm91bmQgc3RhcnRpbmcgYXQgMCB0byBtZW1zaXplIGZpbGxlZCBpbiBieSB6SW1hZ2UgKi8KKwkJCWRtYS1yYW5nZXMgPSA8MHg0MjAwMDAwMCAweDAgMHgwIDB4MCAweDAgMHgwIDB4MD47CisKKwkJCS8qIFRoaXMgZHJpdmVzIGJ1c3NlcyAwIHRvIDB4ZiAqLworCQkJYnVzLXJhbmdlID0gPDB4MCAweGY+OworCisJCQkvKiBMZWdhY3kgaW50ZXJydXB0cyAobm90ZSB0aGUgd2VpcmQgcG9sYXJpdHksIHRoZSBicmlkZ2Ugc2VlbXMKKwkJCSAqIHRvIGludmVydCBQQ0llIGxlZ2FjeSBpbnRlcnJ1cHRzKS4KKwkJCSAqIFdlIGFyZSBkZS1zd2l6emxpbmcgaGVyZSBiZWNhdXNlIHRoZSBudW1iZXJzIGFyZSBhY3R1YWxseSBmb3IKKwkJCSAqIHBvcnQgb2YgdGhlIHJvb3QgY29tcGxleCB2aXJ0dWFsIFAyUCBicmlkZ2UuIEJ1dCBJIHdhbnQKKwkJCSAqIHRvIGF2b2lkIHB1dHRpbmcgYSBub2RlIGZvciBpdCBpbiB0aGUgdHJlZSwgc28gdGhlIG51bWJlcnMKKwkJCSAqIGJlbG93IGFyZSBiYXNpY2FsbHkgZGUtc3dpenpsZWQgbnVtYmVycy4KKwkJCSAqIFRoZSByZWFsIHNsb3QgaXMgb24gaWRzZWwgMCwgc28gdGhlIHN3aXp6bGluZyBpcyAxOjEKKwkJCSAqLworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4MCAweDAgMHgwIDB4Nz47CisJCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJCTB4MCAweDAgMHgwIDB4MSAmTVBJQyA1NCAweDIgLyogaW50IEEgKi8KKwkJCQkweDAgMHgwIDB4MCAweDIgJk1QSUMgNTUgMHgyIC8qIGludCBCICovCisJCQkJMHgwIDB4MCAweDAgMHgzICZNUElDIDU2IDB4MiAvKiBpbnQgQyAqLworCQkJCTB4MCAweDAgMHgwIDB4NCAmTVBJQyA1NyAweDIgLyogaW50IEQgKi8+OworCQl9OworCisJfTsKKworCWNob3NlbiB7CisJCWxpbnV4LHN0ZG91dC1wYXRoID0gJlVBUlQwOworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTM2c2ktcG9zdC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTM2c2ktcG9zdC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YWY2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1MzZzaS1wb3N0LmR0c2kKQEAgLTAsMCArMSwyNDggQEAKKy8qCisgKiBNUEM4NTM2IFNpbGljb24vU29DIERldmljZSBUcmVlIFNvdXJjZSAocG9zdCBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCismbGJjIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7CisJaW50ZXJydXB0cyA9IDwxOSAyIDAgMD47Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4ODAwMCAqLworJnBjaTAgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpIjsKKwlkZXZpY2VfdHlwZSA9ICJwY2kiOworCWludGVycnVwdHMgPSA8MjQgMHgyIDAgMD47CisJYnVzLXJhbmdlID0gPDAgMHhmZj47CisJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHg5MDAwICovCismcGNpMSB7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKKwlkZXZpY2VfdHlwZSA9ICJwY2kiOworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCWJ1cy1yYW5nZSA9IDwwIDI1NT47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKKworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MjUgMiAwIDA+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDB4MCAweDAgMHgxICZtcGljIDB4NCAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDUgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHg2IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4NyAweDEgMHgwIDB4MAorCQkJPjsKKwl9OworfTsKKworLyogY29udHJvbGxlciBhdCAweGEwMDAgKi8KKyZwY2kyIHsKKwljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MjYgMiAwIDA+OworCisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwyNiAyIDAgMD47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDB4MCAweDAgMHgxICZtcGljIDB4MCAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgyIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MyAweDEgMHgwIDB4MAorCQkJPjsKKwl9OworfTsKKworLyogY29udHJvbGxlciBhdCAweGIwMDAgKi8KKyZwY2kzIHsKKwljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MjcgMiAwIDA+OworCisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwyNyAyIDAgMD47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDB4MCAweDAgMHgxICZtcGljIDB4OCAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDkgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHhhIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4YiAweDEgMHgwIDB4MAorCQkJPjsKKwl9OworfTsKKyZzb2MgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWRldmljZV90eXBlID0gInNvYyI7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1pbW1yIiwgInNpbXBsZS1idXMiOworCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgorCisJZWNtLWxhd0AwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7CisJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJZnNsLG51bS1sYXdzID0gPDEyPjsKKwl9OworCisJZWNtQDEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWVjbSIsICJmc2wsZWNtIjsKKwkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE3IDIgMCAwPjsKKwl9OworCisJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTggMiAwIDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWkyYy0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1pMmMtMS5kdHNpIgorL2luY2x1ZGUvICJwcTMtZHVhcnQtMC5kdHNpIgorCisvaW5jbHVkZS8gInBxMy1lc3BpLTAuZHRzaSIKKwlzcGlANzAwMCB7CisJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1ncGlvLTAuZHRzaSIKKworCS8qIG1hcmsgY29tcGF0IHcvODU3MiB0byBnZXQgc29tZSBlcnJhdHVtIHRyZWF0bWVudCAqLworCWdwaW8tY29udHJvbGxlckBmMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1ncGlvIiwgImZzbCxwcTMtZ3BpbyI7CisJfTsKKworCXNhdGFAMTgwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LXNhdGEiLCAiZnNsLHBxLXNhdGEiOworCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQljZWxsLWluZGV4ID0gPDE+OworCQlpbnRlcnJ1cHRzID0gPDc0IDB4MiAwIDA+OworCX07CisKKwlzYXRhQDE5MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1zYXRhIiwgImZzbCxwcS1zYXRhIjsKKwkJcmVnID0gPDB4MTkwMDAgMHgxMDAwPjsKKwkJY2VsbC1pbmRleCA9IDwyPjsKKwkJaW50ZXJydXB0cyA9IDw0MSAweDIgMCAwPjsKKwl9OworCisJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWwyLWNhY2hlLWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OworCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcworCQljYWNoZS1zaXplID0gPDB4ODAwMDA+OyAvLyBMMiwgNTEySworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1kbWEtMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtZXRzZWMxLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWV0c2VjMS10aW1lci0wLmR0c2kiCisKKwl1c2JAMjIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LXVzYjItbXBoIiwgImZzbC11c2IyLW1waCI7CisJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJaW50ZXJydXB0cyA9IDwyOCAweDIgMCAwPjsKKwl9OworCisJdXNiQDIzMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi11c2IyLW1waCIsICJmc2wtdXNiMi1tcGgiOworCQlyZWcgPSA8MHgyMzAwMCAweDEwMDA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCWludGVycnVwdHMgPSA8NDYgMHgyIDAgMD47CisJfTsKKworCXB0cF9jbG9ja0AyNGUwMCB7CisJCWludGVycnVwdHMgPSA8NjggMiAwIDAgNjkgMiAwIDAgNzAgMiAwIDAgNzEgMiAwIDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWV0c2VjMS0yLmR0c2kiCisKKwlldGhlcm5ldEAyNjAwMCB7CisJCWNlbGwtaW5kZXggPSA8MT47CisJfTsKKworCXVzYkAyYjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtdXNiMi1kciIsICJmc2wtdXNiMi1kciI7CisJCXJlZyA9IDwweDJiMDAwIDB4MTAwMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJaW50ZXJydXB0cyA9IDw2MCAweDIgMCAwPjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1lc2RoYy0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1zZWMzLjAtMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtbXBpYy5kdHNpIgorL2luY2x1ZGUvICJwcTMtbXBpYy10aW1lci1CLmR0c2kiCisKKwlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1ndXRzIjsKKwkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJZnNsLGhhcy1yc3RjcjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODUzNnNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTM2c2ktcHJlLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RlNDVhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODUzNnNpLXByZS5kdHNpCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBNUEM4NTM2IFNpbGljb24vU29DIERldmljZSBUcmVlIFNvdXJjZSAocHJlIGluY2x1ZGUpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy9kdHMtdjEvOworLyB7CisJY29tcGF0aWJsZSA9ICJmc2wsTVBDODUzNiI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZzZXJpYWwwOworCQlzZXJpYWwxID0gJnNlcmlhbDE7CisJCWV0aGVybmV0MCA9ICZlbmV0MDsKKwkJZXRoZXJuZXQxID0gJmVuZXQyOworCQlwY2kwID0gJnBjaTA7CisJCXBjaTEgPSAmcGNpMTsKKwkJcGNpMiA9ICZwY2kyOworCQlwY2kzID0gJnBjaTM7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyw4NTM2QDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwweDA+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTQ0c2ktcG9zdC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTQ0c2ktcG9zdC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2OGViMTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NDRzaS1wb3N0LmR0c2kKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBNUEM4NTQ0IFNpbGljb24vU29DIERldmljZSBUcmVlIFNvdXJjZSAocG9zdCBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCismbGJjIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ0LWxiYyIsICJmc2wscHEzLWxvY2FsYnVzIiwgInNpbXBsZS1idXMiOworCWludGVycnVwdHMgPSA8MTkgMiAwIDA+OworfTsKKworLyogY29udHJvbGxlciBhdCAweDgwMDAgKi8KKyZwY2kwIHsKKwljb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLXBjaSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwlpbnRlcnJ1cHRzID0gPDI0IDB4MiAwIDA+OworCWJ1cy1yYW5nZSA9IDwwIDB4ZmY+OworCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4OTAwMCAqLworJnBjaTEgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwyNSAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDQgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg1IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4NiAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDcgMHgxIDB4MCAweDAKKwkJCT47CisJfTsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHhhMDAwICovCismcGNpMiB7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKKwlkZXZpY2VfdHlwZSA9ICJwY2kiOworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCWJ1cy1yYW5nZSA9IDwwIDI1NT47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDI2IDIgMCAwPjsKKworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MjYgMiAwIDA+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxIDB4MCAweDAKKwkJCT47CisJfTsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHhiMDAwICovCismcGNpMyB7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKKwlkZXZpY2VfdHlwZSA9ICJwY2kiOworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCWJ1cy1yYW5nZSA9IDwwIDI1NT47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDI3IDIgMCAwPjsKKworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MjcgMiAwIDA+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDggMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg5IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4YSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweGIgMHgxIDB4MCAweDAKKwkJCT47CisJfTsKK307CisKKyZzb2MgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWRldmljZV90eXBlID0gInNvYyI7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0NC1pbW1yIiwgInNpbXBsZS1idXMiOworCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgorCisJZWNtLWxhd0AwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7CisJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJZnNsLG51bS1sYXdzID0gPDEwPjsKKwl9OworCisJZWNtQDEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ0LWVjbSIsICJmc2wsZWNtIjsKKwkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE3IDIgMCAwPjsKKwl9OworCisJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDQtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTggMiAwIDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWkyYy0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1pMmMtMS5kdHNpIgorL2luY2x1ZGUvICJwcTMtZHVhcnQtMC5kdHNpIgorCisJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ0LWwyLWNhY2hlLWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OworCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcworCQljYWNoZS1zaXplID0gPDB4NDAwMDA+OyAvLyBMMiwgMjU2SworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1kbWEtMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtZXRzZWMxLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWV0c2VjMS0yLmR0c2kiCisKKwlldGhlcm5ldEAyNjAwMCB7CisJCWNlbGwtaW5kZXggPSA8MT47CisJfTsKKworL2luY2x1ZGUvICJwcTMtc2VjMi4xLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLW1waWMuZHRzaSIKKworCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ0LWd1dHMiOworCQlyZWcgPSA8MHhlMDAwMCAweDEwMDA+OworCQlmc2wsaGFzLXJzdGNyOworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTQ0c2ktcHJlLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NDRzaS1wcmUuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzc3ZjkyCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTQ0c2ktcHJlLmR0c2kKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIE1QQzg1NDQgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwcmUgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisvIHsKKwljb21wYXRpYmxlID0gImZzbCxNUEM4NTQ0IjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJZXRoZXJuZXQwID0gJmVuZXQwOworCQlldGhlcm5ldDEgPSAmZW5ldDI7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisJCXBjaTMgPSAmcGNpMzsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlQb3dlclBDLDg1NDRAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDB4MD47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NDhzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NDhzaS1wb3N0LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4MDIzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODU0OHNpLXBvc3QuZHRzaQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIE1QQzg1NDggU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwb3N0IGluY2x1ZGUpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyZsYmMgeworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtbGJjIiwgImZzbCxwcTMtbG9jYWxidXMiLCAic2ltcGxlLWJ1cyI7CisJaW50ZXJydXB0cyA9IDwxOSAyIDAgMD47Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4ODAwMCAqLworJnBjaTAgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpeCIsICJmc2wsbXBjODU0MC1wY2kiOworCWRldmljZV90eXBlID0gInBjaSI7CisJaW50ZXJydXB0cyA9IDwyNCAweDIgMCAwPjsKKwlidXMtcmFuZ2UgPSA8MCAweGZmPjsKKwkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDM+OworfTsKKworLyogY29udHJvbGxlciBhdCAweDkwMDAgKi8KKyZwY2kxIHsKKwljb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLXBjaSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwlpbnRlcnJ1cHRzID0gPDI1IDB4MiAwIDA+OworCWJ1cy1yYW5nZSA9IDwwIDB4ZmY+OworCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4YTAwMCAqLworJnBjaTIgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwyNiAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDI2IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MSAweDAgMHgwCisJCQk+OworCX07Cit9OworCismc29jIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlkZXZpY2VfdHlwZSA9ICJzb2MiOworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtaW1tciIsICJzaW1wbGUtYnVzIjsKKwlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KKworCWVjbS1sYXdAMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOworCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCWZzbCxudW0tbGF3cyA9IDwxMD47CisJfTsKKworCWVjbUAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1lY20iLCAiZnNsLGVjbSI7CisJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNyAyIDAgMD47CisJfTsKKworCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LW1lbW9yeS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE4IDIgMCAwPjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1pMmMtMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtaTJjLTEuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWR1YXJ0LTAuZHRzaSIKKworCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1sMi1jYWNoZS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKKwkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKKwkJY2FjaGUtc2l6ZSA9IDwweDgwMDAwPjsgLy8gTDIsIDUxMksKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisJfTsKKworL2luY2x1ZGUvICJwcTMtZG1hLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWV0c2VjMS0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1ldHNlYzEtMS5kdHNpIgorL2luY2x1ZGUvICJwcTMtZXRzZWMxLTIuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWV0c2VjMS0zLmR0c2kiCisKKy9pbmNsdWRlLyAicHEzLXNlYzIuMS0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1tcGljLmR0c2kiCisKKwlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1ndXRzIjsKKwkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJZnNsLGhhcy1yc3RjcjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODU0OHNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTQ4c2ktcHJlLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5ZjEyMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODU0OHNpLXByZS5kdHNpCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBNUEM4NTQ4IFNpbGljb24vU29DIERldmljZSBUcmVlIFNvdXJjZSAocHJlIGluY2x1ZGUpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy9kdHMtdjEvOworLyB7CisJY29tcGF0aWJsZSA9ICJmc2wsTVBDODU0OCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZzZXJpYWwwOworCQlzZXJpYWwxID0gJnNlcmlhbDE7CisJCWV0aGVybmV0MCA9ICZlbmV0MDsKKwkJZXRoZXJuZXQxID0gJmVuZXQyOworCQlwY2kwID0gJnBjaTA7CisJCXBjaTEgPSAmcGNpMTsKKwkJcGNpMiA9ICZwY2kyOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsODU0OEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODU2OHNpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODU2OHNpLXBvc3QuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGU3MDc1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTY4c2ktcG9zdC5kdHNpCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogTVBDODU2OCBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHBvc3QgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmxiYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1sb2NhbGJ1cyIsICJmc2wscHEzLWxvY2FsYnVzIiwgInNpbXBsZS1idXMiOworCWludGVycnVwdHMgPSA8MTkgMiAwIDA+OworCXNsZWVwID0gPCZwbWMgMHgwODAwMDAwMD47Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4ODAwMCAqLworJnBjaTAgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpIjsKKwlkZXZpY2VfdHlwZSA9ICJwY2kiOworCWludGVycnVwdHMgPSA8MjQgMHgyIDAgMD47CisJYnVzLXJhbmdlID0gPDAgMHhmZj47CisJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlzbGVlcCA9IDwmcG1jIDB4ODAwMDAwMDA+OworfTsKKworLyogY29udHJvbGxlciBhdCAweGEwMDAgKi8KKyZwY2kxIHsKKwljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MjYgMiAwIDA+OworCXNsZWVwID0gPCZwbWMgMHgyMDAwMDAwMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDI2IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MSAweDAgMHgwCisJCQk+OworCX07Cit9OworCismcmlvIHsKKwljb21wYXRpYmxlID0gImZzbCxzcmlvIjsKKwlpbnRlcnJ1cHRzID0gPDQ4IDIgMCAwPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlmc2wsc3Jpby1ybXUtaGFuZGxlID0gPCZybXU+OworCXNsZWVwID0gPCZwbWMgMHgwMDA4MDAwMD47CisJcmFuZ2VzOworCisJcG9ydDEgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCWNlbGwtaW5kZXggPSA8MT47CisJfTsKK307CisKKyZzb2MgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWRldmljZV90eXBlID0gInNvYyI7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1pbW1yIiwgInNpbXBsZS1idXMiOworCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgorCisJZWNtLWxhd0AwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7CisJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJZnNsLG51bS1sYXdzID0gPDEwPjsKKwl9OworCisJZWNtQDEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY4LWVjbSIsICJmc2wsZWNtIjsKKwkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE3IDIgMCAwPjsKKwl9OworCisJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTggMiAwIDA+OworCX07CisKKwlpMmMtc2xlZXAtbmV4dXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXNsZWVwID0gPCZwbWMgMHgwMDAwMDAwND47CisJCXJhbmdlczsKKworL2luY2x1ZGUvICJwcTMtaTJjLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWkyYy0xLmR0c2kiCisKKwl9OworCisJZHVhcnQtc2xlZXAtbmV4dXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJCXNsZWVwID0gPCZwbWMgMHgwMDAwMDAwMj47CisJCXJhbmdlczsKKworL2luY2x1ZGUvICJwcTMtZHVhcnQtMC5kdHNpIgorCisJfTsKKworCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1sMi1jYWNoZS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKKwkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKKwkJY2FjaGUtc2l6ZSA9IDwweDgwMDAwPjsgLy8gTDIsIDUxMksKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisJfTsKKworL2luY2x1ZGUvICJwcTMtZG1hLTAuZHRzaSIKKwlkbWFAMjEzMDAgeworCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDA0MDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWV0c2VjMS0wLmR0c2kiCisJZXRoZXJuZXRAMjQwMDAgeworCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwODA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWV0c2VjMS0xLmR0c2kiCisJZXRoZXJuZXRAMjUwMDAgeworCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwNDA+OworCX07CisKKwlwYXJfaW9AZTAxMDAgeworCQlyZWcgPSA8MHhlMDEwMCAweDEwMD47CisJCWRldmljZV90eXBlID0gInBhcl9pbyI7CisJfTsKKworL2luY2x1ZGUvICJwcTMtc2VjMi4xLTAuZHRzaSIKKwljcnlwdG9AMzAwMDAgeworCQlzbGVlcCA9IDwmcG1jIDB4MDEwMDAwMDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLW1waWMuZHRzaSIKKy9pbmNsdWRlLyAicHEzLXJtdS0wLmR0c2kiCisJcm11QGQzMDAwIHsKKwkJc2xlZXAgPSA8JnBtYyAweDAwMDQwMDAwPjsKKwl9OworCisJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1ndXRzIiwgImZzbCxtcGM4NTQ4LWd1dHMiOworCQlyZWcgPSA8MHhlMDAwMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MCAweGUwMDAwIDB4MTAwMD47CisJCWZzbCxoYXMtcnN0Y3I7CisKKwkJcG1jOiBwb3dlckA3MCB7CisJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY4LXBtYyIsCisJCQkJICAgICAiZnNsLG1wYzg1NDgtcG1jIjsKKwkJCXJlZyA9IDwweDcwIDB4MjA+OworCQl9OworCX07Cit9OworCismcWUgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWRldmljZV90eXBlID0gInFlIjsKKwljb21wYXRpYmxlID0gImZzbCxxZSI7CisJc2xlZXAgPSA8JnBtYyAweDAwMDAwODAwPjsKKwlicmctZnJlcXVlbmN5ID0gPDA+OworCWJ1cy1mcmVxdWVuY3kgPSA8Mzk2MDAwMDAwPjsKKwlmc2wscWUtbnVtLXJpc2NzID0gPDI+OworCWZzbCxxZS1udW0tc251bXMgPSA8Mjg+OworCisJcWVpYzogaW50ZXJydXB0LWNvbnRyb2xsZXJAODAgeworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJY29tcGF0aWJsZSA9ICJmc2wscWUtaWMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4ODAgMHg4MD47CisJCWludGVycnVwdHMgPSA8NDYgMiAwIDAgNDYgMiAwIDA+OyAvL2hpZ2g6MzAgbG93OjMwCisJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCX07CisKKwlzcGlANGMwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljb21wYXRpYmxlID0gImZzbCxzcGkiOworCQlyZWcgPSA8MHg0YzAgMHg0MD47CisJCWNlbGwtaW5kZXggPSA8MD47CisJCWludGVycnVwdHMgPSA8Mj47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCX07CisKKwlzcGlANTAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQljZWxsLWluZGV4ID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxzcGkiOworCQlyZWcgPSA8MHg1MDAgMHg0MD47CisJCWludGVycnVwdHMgPSA8MT47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCX07CisKKwl1Y2NAMjAwMCB7CisJCWNlbGwtaW5kZXggPSA8MT47CisJCXJlZyA9IDwweDIwMDAgMHgyMDA+OworCQlpbnRlcnJ1cHRzID0gPDMyPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CisJfTsKKworCXVjY0AzMDAwIHsKKwkJY2VsbC1pbmRleCA9IDwyPjsKKwkJcmVnID0gPDB4MzAwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8MzM+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKKwl9OworCisJbXVyYW1AMTAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLHFlLW11cmFtIiwgImZzbCxjcG0tbXVyYW0iOworCQlyYW5nZXMgPSA8MHgwIDB4MTAwMDAgMHgxMDAwMD47CisKKwkJZGF0YS1vbmx5QDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscWUtbXVyYW0tZGF0YSIsCisJCQkJICAgICAiZnNsLGNwbS1tdXJhbS1kYXRhIjsKKwkJCXJlZyA9IDwweDAgMHgxMDAwMD47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NjhzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODU2OHNpLXByZS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2Q2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NjhzaS1wcmUuZHRzaQpAQCAtMCwwICsxLDY1IEBACisvKgorICogTVBDODU2OCBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHByZSBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLE1QQzg1NjgiOworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDI+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlldGhlcm5ldDAgPSAmZW5ldDA7CisJCWV0aGVybmV0MSA9ICZlbmV0MTsKKwkJZXRoZXJuZXQyID0gJmVuZXQyOworCQlldGhlcm5ldDMgPSAmZW5ldDM7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsODU2OEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJCXNsZWVwID0gPCZwbWMgMHgwMDAwODAwMAkvLyBjb3JlCisJCQkJICZwbWMgMHgwMDAwNDAwMD47CS8vIHRpbWViYXNlCisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NjlzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NjlzaS1wb3N0LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U2MzQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODU2OXNpLXBvc3QuZHRzaQpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIE1QQzg1NjkgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwb3N0IGluY2x1ZGUpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyZsYmMgeworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjktZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwlpbnRlcnJ1cHRzID0gPDE5IDIgMCAwPjsKKwlzbGVlcCA9IDwmcG1jIDB4MDgwMDAwMDA+OworfTsKKworLyogY29udHJvbGxlciBhdCAweGEwMDAgKi8KKyZwY2kxIHsKKwljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MjYgMiAwIDA+OworCXNsZWVwID0gPCZwbWMgMHgyMDAwMDAwMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDI2IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MSAweDAgMHgwCisJCQk+OworCX07Cit9OworCismcmlvIHsKKwljb21wYXRpYmxlID0gImZzbCxzcmlvIjsKKwlpbnRlcnJ1cHRzID0gPDQ4IDIgMCAwPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlmc2wsc3Jpby1ybXUtaGFuZGxlID0gPCZybXU+OworCXNsZWVwID0gPCZwbWMgMHgwMDA4MDAwMD47CisJcmFuZ2VzOworCisJcG9ydDEgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCWNlbGwtaW5kZXggPSA8MT47CisJfTsKKworCXBvcnQyIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQljZWxsLWluZGV4ID0gPDI+OworCX07Cit9OworCismc29jIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlkZXZpY2VfdHlwZSA9ICJzb2MiOworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjktaW1tciIsICJzaW1wbGUtYnVzIjsKKwlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KKworCWVjbS1sYXdAMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOworCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCWZzbCxudW0tbGF3cyA9IDwxMD47CisJfTsKKworCWVjbUAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1lY20iLCAiZnNsLGVjbSI7CisJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNyAyIDAgMD47CisJfTsKKworCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY5LW1lbW9yeS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE4IDIgMCAwPjsKKwl9OworCisJaTJjLXNsZWVwLW5leHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwMDQ+OworCQlyYW5nZXM7CisKKy9pbmNsdWRlLyAicHEzLWkyYy0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1pMmMtMS5kdHNpIgorCisJfTsKKworCWR1YXJ0LXNsZWVwLW5leHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwMDI+OworCQlyYW5nZXM7CisKKy9pbmNsdWRlLyAicHEzLWR1YXJ0LTAuZHRzaSIKKworCX07CisKKwlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjktbDItY2FjaGUtY29udHJvbGxlciI7CisJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47CisJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCisJCWNhY2hlLXNpemUgPSA8MHg4MDAwMD47IC8vIEwyLCA1MTJLCisJCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWRtYS0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1lc2RoYy0wLmR0c2kiCisJc2RoY0AyZTAwMCB7CisJCXNsZWVwID0gPCZwbWMgMHgwMDIwMDAwMD47CisJfTsKKworCXBhcl9pb0BlMDEwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4ZTAxMDAgMHgxMDA+OworCQlyYW5nZXMgPSA8MHgwIDB4ZTAxMDAgMHgxMDA+OworCQlkZXZpY2VfdHlwZSA9ICJwYXJfaW8iOworCX07CisKKy9pbmNsdWRlLyAicHEzLXNlYzMuMS0wLmR0c2kiCisJY3J5cHRvQDMwMDAwIHsKKwkJc2xlZXAgPSA8JnBtYyAweDAxMDAwMDAwPjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1tcGljLmR0c2kiCisvaW5jbHVkZS8gInBxMy1ybXUtMC5kdHNpIgorCXJtdUBkMzAwMCB7CisJCXNsZWVwID0gPCZwbWMgMHgwMDA0MDAwMD47CisJfTsKKworCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjktZ3V0cyIsICJmc2wsbXBjODU0OC1ndXRzIjsKKwkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDAgMHhlMDAwMCAweDEwMDA+OworCQlmc2wsaGFzLXJzdGNyOworCisJCXBtYzogcG93ZXJANzAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1wbWMiLAorCQkJCSAgICAgImZzbCxtcGM4NTQ4LXBtYyI7CisJCQlyZWcgPSA8MHg3MCAweDIwPjsKKwkJfTsKKwl9OworfTsKKworJnFlIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlkZXZpY2VfdHlwZSA9ICJxZSI7CisJY29tcGF0aWJsZSA9ICJmc2wscWUiOworCXNsZWVwID0gPCZwbWMgMHgwMDAwMDgwMD47CisJYnJnLWZyZXF1ZW5jeSA9IDwwPjsKKwlidXMtZnJlcXVlbmN5ID0gPDA+OworCWZzbCxxZS1udW0tcmlzY3MgPSA8ND47CisJZnNsLHFlLW51bS1zbnVtcyA9IDw0Nj47CisKKwlxZWljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA4MCB7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQljb21wYXRpYmxlID0gImZzbCxxZS1pYyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJaW50ZXJydXB0cyA9IDw0NiAyIDAgMCA0NiAyIDAgMD47IC8vaGlnaDozMCBsb3c6MzAKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJfTsKKworCXRpbWVyQDQ0MCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjktcWUtZ3RtIiwKKwkJCSAgICAgImZzbCxxZS1ndG0iLCAiZnNsLGd0bSI7CisJCXJlZyA9IDwweDQ0MCAweDQwPjsKKwkJaW50ZXJydXB0cyA9IDwxMiAxMyAxNCAxNT47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCQkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwl9OworCisJc3BpQDRjMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1xZS1zcGkiLCAiZnNsLHNwaSI7CisJCXJlZyA9IDwweDRjMCAweDQwPjsKKwkJY2VsbC1pbmRleCA9IDwwPjsKKwkJaW50ZXJydXB0cyA9IDwyPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CisJfTsKKworCXNwaUA1MDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCWNlbGwtaW5kZXggPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLHNwaSI7CisJCXJlZyA9IDwweDUwMCAweDQwPjsKKwkJaW50ZXJydXB0cyA9IDwxPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CisJfTsKKworCXVzYkA2YzAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY5LXFlLXVzYiIsCisJCQkgICAgICJmc2wsbXBjODMyMy1xZS11c2IiOworCQlyZWcgPSA8MHg2YzAgMHg0MCAweDhiMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPDExPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CisJfTsKKworCXVjY0AyMDAwIHsKKwkJY2VsbC1pbmRleCA9IDwxPjsKKwkJcmVnID0gPDB4MjAwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8MzI+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKKwl9OworCisJdWNjQDIyMDAgeworCQljZWxsLWluZGV4ID0gPDM+OworCQlyZWcgPSA8MHgyMjAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDwzND47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCX07CisKKwl1Y2NAMzAwMCB7CisJCWNlbGwtaW5kZXggPSA8Mj47CisJCXJlZyA9IDwweDMwMDAgMHgyMDA+OworCQlpbnRlcnJ1cHRzID0gPDMzPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CisJfTsKKworCXVjY0AzMjAwIHsKKwkJY2VsbC1pbmRleCA9IDw0PjsKKwkJcmVnID0gPDB4MzIwMCAweDIwMD47CisJCWludGVycnVwdHMgPSA8MzU+OworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKKwl9OworCisJdWNjQDM0MDAgeworCQljZWxsLWluZGV4ID0gPDY+OworCQlyZWcgPSA8MHgzNDAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDw0MT47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCX07CisKKwl1Y2NAMzYwMCB7CisJCWNlbGwtaW5kZXggPSA8OD47CisJCXJlZyA9IDwweDM2MDAgMHgyMDA+OworCQlpbnRlcnJ1cHRzID0gPDQzPjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CisJfTsKKworCW11cmFtQDEwMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQljb21wYXRpYmxlID0gImZzbCxxZS1tdXJhbSIsICJmc2wsY3BtLW11cmFtIjsKKwkJcmFuZ2VzID0gPDB4MCAweDEwMDAwIDB4MjAwMDA+OworCisJCWRhdGEtb25seUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFlLW11cmFtLWRhdGEiLAorCQkJCSAgICAgImZzbCxjcG0tbXVyYW0tZGF0YSI7CisJCQlyZWcgPSA8MHgwIDB4MjAwMDA+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTY5c2ktcHJlLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NjlzaS1wcmUuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDcwNjRkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTY5c2ktcHJlLmR0c2kKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIE1QQzg1NjkgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwcmUgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisvIHsKKwljb21wYXRpYmxlID0gImZzbCxNUEM4NTY5IjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJZXRoZXJuZXQwID0gJmVuZXQwOworCQlldGhlcm5ldDEgPSAmZW5ldDE7CisJCWV0aGVybmV0MiA9ICZlbmV0MjsKKwkJZXRoZXJuZXQzID0gJmVuZXQzOworCQlwY2kxID0gJnBjaTE7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyw4NTY5QDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwweDA+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQkJc2xlZXAgPSA8JnBtYyAweDAwMDA4MDAwCS8vIGNvcmUKKwkJCQkgJnBtYyAweDAwMDA0MDAwPjsJLy8gdGltZWJhc2UKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODU3MnNpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODU3MnNpLXBvc3QuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDRlMjVhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9tcGM4NTcyc2ktcG9zdC5kdHNpCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogTVBDODU3MiBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHBvc3QgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmxiYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOworCWludGVycnVwdHMgPSA8MTkgMiAwIDA+OworfTsKKworLyogY29udHJvbGxlciBhdCAweDgwMDAgKi8KKyZwY2kwIHsKKwljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MjQgMiAwIDA+OworCisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwyNCAyIDAgMD47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHg4IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4OSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweGEgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHhiIDB4MSAweDAgMHgwCisJCQk+OworCX07Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4OTAwMCAqLworJnBjaTEgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwyNSAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDQgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg1IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4NiAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDcgMHgxIDB4MCAweDAKKwkJCT47CisJfTsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHhhMDAwICovCismcGNpMiB7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKKwlkZXZpY2VfdHlwZSA9ICJwY2kiOworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCWJ1cy1yYW5nZSA9IDwwIDI1NT47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDI2IDIgMCAwPjsKKworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MjYgMiAwIDA+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxIDB4MCAweDAKKwkJCT47CisJfTsKK307CisKKyZzb2MgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWRldmljZV90eXBlID0gInNvYyI7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1pbW1yIiwgInNpbXBsZS1idXMiOworCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgorCisJZWNtLWxhd0AwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7CisJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJZnNsLG51bS1sYXdzID0gPDEyPjsKKwl9OworCisJZWNtQDEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWVjbSIsICJmc2wsZWNtIjsKKwkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE3IDIgMCAwPjsKKwl9OworCisJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTggMiAwIDA+OworCX07CisKKwltZW1vcnktY29udHJvbGxlckA2MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1tZW1vcnktY29udHJvbGxlciI7CisJCXJlZyA9IDwweDYwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxOCAyIDAgMD47CisJfTsKKworL2luY2x1ZGUvICJwcTMtaTJjLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWkyYy0xLmR0c2kiCisvaW5jbHVkZS8gInBxMy1kdWFydC0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1kbWEtMS5kdHNpIgorL2luY2x1ZGUvICJwcTMtZ3Bpby0wLmR0c2kiCisJZ3Bpby1jb250cm9sbGVyQGYwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWdwaW8iLCAiZnNsLHBxMy1ncGlvIjsKKwl9OworCisJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWwyLWNhY2hlLWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OworCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcworCQljYWNoZS1zaXplID0gPDB4MTAwMDAwPjsgLy8gTDIsMU0KKwkJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisJfTsKKworL2luY2x1ZGUvICJwcTMtZG1hLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWV0c2VjMS0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1ldHNlYzEtdGltZXItMC5kdHNpIgorCisJcHRwX2Nsb2NrQDI0ZTAwIHsKKwkJaW50ZXJydXB0cyA9IDw2OCAyIDAgMCA2OSAyIDAgMCA3MCAyIDAgMCA3MSAyIDAgMD47CisJfTsKKworL2luY2x1ZGUvICJwcTMtZXRzZWMxLTEuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWV0c2VjMS0yLmR0c2kiCisvaW5jbHVkZS8gInBxMy1ldHNlYzEtMy5kdHNpIgorL2luY2x1ZGUvICJwcTMtc2VjMy4wLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLW1waWMuZHRzaSIKKy9pbmNsdWRlLyAicHEzLW1waWMtdGltZXItQi5kdHNpIgorCisJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZ3V0cyI7CisJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47CisJCWZzbCxoYXMtcnN0Y3I7CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NzJzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvbXBjODU3MnNpLXByZS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTg4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL21wYzg1NzJzaS1wcmUuZHRzaQpAQCAtMCwwICsxLDcwIEBACisvKgorICogTVBDODU3MiBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHByZSBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLE1QQzg1NzIiOworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDI+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlldGhlcm5ldDAgPSAmZW5ldDA7CisJCWV0aGVybmV0MSA9ICZlbmV0MTsKKwkJZXRoZXJuZXQyID0gJmVuZXQyOworCQlldGhlcm5ldDMgPSAmZW5ldDM7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyw4NTcyQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwweDA+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCisJCVBvd2VyUEMsODU3MkAxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMTBzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDEwc2ktcG9zdC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOWUxNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDEwc2ktcG9zdC5kdHNpCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogUDEwMTAvUDEwMTQgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwb3N0IGluY2x1ZGUpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyZpZmMgeworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLGlmYyIsICJzaW1wbGUtYnVzIjsKKwlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwIDE5IDIgMCAwPjsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHg5MDAwICovCismcGNpMCB7CisJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4zIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDB4MCAweDAgMHgxICZtcGljIDB4NCAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDUgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHg2IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4NyAweDEgMHgwIDB4MAorCQkJPjsKKwl9OworfTsKKworLyogY29udHJvbGxlciBhdCAweGEwMDAgKi8KKyZwY2kxIHsKKwljb21wYXRpYmxlID0gImZzbCxwMTAxMC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjMiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxIDB4MCAweDAKKwkJCT47CisJfTsKK307CisKKyZzb2MgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWRldmljZV90eXBlID0gInNvYyI7CisJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtaW1tciIsICJzaW1wbGUtYnVzIjsKKwlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KKworCWVjbS1sYXdAMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOworCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCWZzbCxudW0tbGF3cyA9IDwxMj47CisJfTsKKworCWVjbUAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtZWNtIiwgImZzbCxlY20iOworCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCX07CisKKwltZW1vcnktY29udHJvbGxlckAyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWkyYy0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1pMmMtMS5kdHNpIgorL2luY2x1ZGUvICJwcTMtZHVhcnQtMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtZXNwaS0wLmR0c2kiCisJc3BpMDogc3BpQDcwMDAgeworCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8MT47CisJfTsKKworL2luY2x1ZGUvICJwcTMtZ3Bpby0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1zYXRhMi0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1zYXRhMi0xLmR0c2kiCisKKwljYW4wOiBjYW5AMWMwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1mbGV4Y2FuIjsKKwkJcmVnID0gPDB4MWMwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDw0OCAweDIgMCAwPjsKKwl9OworCisJY2FuMTogY2FuQDFkMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtZmxleGNhbiI7CisJCXJlZyA9IDwweDFkMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8NjEgMHgyIDAgMD47CisJfTsKKworCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtbDItY2FjaGUtY29udHJvbGxlciIsCisJCQkJImZzbCxwMTAxNC1sMi1jYWNoZS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKKwkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKKwkJY2FjaGUtc2l6ZSA9IDwweDQwMDAwPjsgLy8gTDIsMjU2SworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1kbWEtMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtdXNiMi1kci0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1lc2RoYy0wLmR0c2kiCisJc2RoY0AyZTAwMCB7CisJCWZzbCxzZGhjaS1hdXRvLWNtZDEyOworCX07CisKKy9pbmNsdWRlLyAicHEzLXNlYzQuNC0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1tcGljLmR0c2kiCisvaW5jbHVkZS8gInBxMy1tcGljLXRpbWVyLUIuZHRzaSIKKworL2luY2x1ZGUvICJwcTMtZXRzZWMyLTAuZHRzaSIKKwllbmV0MDogZXRoZXJuZXRAYjAwMDAgeworCQlxdWV1ZS1ncm91cEBiMDAwMCB7CisJCQlmc2wscngtYml0LW1hcCA9IDwweGZmPjsKKwkJCWZzbCx0eC1iaXQtbWFwID0gPDB4ZmY+OworCQl9OworCX07CisKKy9pbmNsdWRlLyAicHEzLWV0c2VjMi0xLmR0c2kiCisJZW5ldDE6IGV0aGVybmV0QGIxMDAwIHsKKwkJcXVldWUtZ3JvdXBAYjEwMDAgeworCQkJZnNsLHJ4LWJpdC1tYXAgPSA8MHhmZj47CisJCQlmc2wsdHgtYml0LW1hcCA9IDwweGZmPjsKKwkJfTsKKwl9OworCisvaW5jbHVkZS8gInBxMy1ldHNlYzItMi5kdHNpIgorCWVuZXQyOiBldGhlcm5ldEBiMjAwMCB7CisJCXF1ZXVlLWdyb3VwQGIyMDAwIHsKKwkJCWZzbCxyeC1iaXQtbWFwID0gPDB4ZmY+OworCQkJZnNsLHR4LWJpdC1tYXAgPSA8MHhmZj47CisJCX07CisKKwl9OworCisJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLWd1dHMiOworCQlyZWcgPSA8MHhlMDAwMCAweDEwMDA+OworCQlmc2wsaGFzLXJzdGNyOworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMTAxMHNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMTAxMHNpLXByZS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTRhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDEwc2ktcHJlLmR0c2kKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIFAxMDEwL1AxMDE0IFNpbGljb24vU29DIERldmljZSBUcmVlIFNvdXJjZSAocHJlIGluY2x1ZGUpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy9kdHMtdjEvOworLyB7CisJY29tcGF0aWJsZSA9ICJmc2wsUDEwMTAiOworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDI+OworCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCisJYWxpYXNlcyB7CisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlldGhlcm5ldDAgPSAmZW5ldDA7CisJCWV0aGVybmV0MSA9ICZlbmV0MTsKKwkJZXRoZXJuZXQyID0gJmVuZXQyOworCQlwY2kwID0gJnBjaTA7CisJCXBjaTEgPSAmcGNpMTsKKwkJY2FuMCA9ICZjYW4wOworCQljYW4xID0gJmNhbjE7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyxQMTAxMEAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjBzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDIwc2ktcG9zdC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjOTI0YzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDIwc2ktcG9zdC5kdHNpCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogUDEwMjAvUDEwMTEgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwb3N0IGluY2x1ZGUpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyZsYmMgeworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7CisJaW50ZXJydXB0cyA9IDwxOSAyIDAgMD47Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4OTAwMCAqLworJnBjaTAgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHg0IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4NSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDYgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHg3IDB4MSAweDAgMHgwCisJCQk+OworCX07Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4YTAwMCAqLworJnBjaTEgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxIDB4MCAweDAKKwkJCT47CisJfTsKK307CisKKyZzb2MgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWRldmljZV90eXBlID0gInNvYyI7CisJY29tcGF0aWJsZSA9ICJmc2wscDEwMjAtaW1tciIsICJzaW1wbGUtYnVzIjsKKwlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KKworCWVjbS1sYXdAMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOworCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCWZzbCxudW0tbGF3cyA9IDwxMj47CisJfTsKKworCWVjbUAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjAtZWNtIiwgImZzbCxlY20iOworCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCX07CisKKwltZW1vcnktY29udHJvbGxlckAyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjAtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWkyYy0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1pMmMtMS5kdHNpIgorL2luY2x1ZGUvICJwcTMtZHVhcnQtMC5kdHNpIgorCisvaW5jbHVkZS8gInBxMy1lc3BpLTAuZHRzaSIKKwlzcGlANzAwMCB7CisJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1ncGlvLTAuZHRzaSIKKworCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjAtbDItY2FjaGUtY29udHJvbGxlciI7CisJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47CisJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCisJCWNhY2hlLXNpemUgPSA8MHg0MDAwMD47IC8vIEwyLDI1NksKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisJfTsKKworL2luY2x1ZGUvICJwcTMtZG1hLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLXVzYjItZHItMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtdXNiMi1kci0xLmR0c2kiCisKKy9pbmNsdWRlLyAicHEzLWVzZGhjLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLXNlYzMuMy0wLmR0c2kiCisKKy9pbmNsdWRlLyAicHEzLW1waWMuZHRzaSIKKy9pbmNsdWRlLyAicHEzLW1waWMtdGltZXItQi5kdHNpIgorCisvaW5jbHVkZS8gInBxMy1ldHNlYzItMC5kdHNpIgorCWVuZXQwOiBlbmV0MF9ncnAyOiBldGhlcm5ldEBiMDAwMCB7CisJfTsKKworL2luY2x1ZGUvICJwcTMtZXRzZWMyLTEuZHRzaSIKKwllbmV0MTogZW5ldDFfZ3JwMjogZXRoZXJuZXRAYjEwMDAgeworCX07CisKKy9pbmNsdWRlLyAicHEzLWV0c2VjMi0yLmR0c2kiCisJZW5ldDI6IGVuZXQyX2dycDI6IGV0aGVybmV0QGIyMDAwIHsKKwl9OworCisJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLWd1dHMiOworCQlyZWcgPSA8MHhlMDAwMCAweDEwMDA+OworCQlmc2wsaGFzLXJzdGNyOworCX07Cit9OworCisvaW5jbHVkZS8gInBxMy1ldHNlYzItZ3JwMi0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1ldHNlYzItZ3JwMi0xLmR0c2kiCisvaW5jbHVkZS8gInBxMy1ldHNlYzItZ3JwMi0yLmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDIwc2ktcHJlLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDIwc2ktcHJlLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYwMzc2ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjBzaS1wcmUuZHRzaQpAQCAtMCwwICsxLDY4IEBACisvKgorICogUDEwMjAvUDEwMTEgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwcmUgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisvIHsKKwljb21wYXRpYmxlID0gImZzbCxQMTAyMCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZzZXJpYWwwOworCQlzZXJpYWwxID0gJnNlcmlhbDE7CisJCWV0aGVybmV0MCA9ICZlbmV0MDsKKwkJZXRoZXJuZXQxID0gJmVuZXQxOworCQlldGhlcm5ldDIgPSAmZW5ldDI7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsUDEwMjBAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDB4MD47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisKKwkJUG93ZXJQQyxQMTAyMEAxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjFzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDIxc2ktcG9zdC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmE1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDIxc2ktcG9zdC5kdHNpCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogUDEwMjEvUDEwMTIgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwb3N0IGluY2x1ZGUpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyZsYmMgeworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIxLWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7CisJaW50ZXJydXB0cyA9IDwxOSAyIDAgMD47Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4OTAwMCAqLworJnBjaTAgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHg0IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4NSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDYgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHg3IDB4MSAweDAgMHgwCisJCQk+OworCX07Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4YTAwMCAqLworJnBjaTEgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxIDB4MCAweDAKKwkJCT47CisJfTsKK307CisKKyZzb2MgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWRldmljZV90eXBlID0gInNvYyI7CisJY29tcGF0aWJsZSA9ICJmc2wscDEwMjEtaW1tciIsICJzaW1wbGUtYnVzIjsKKwlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KKworCWVjbS1sYXdAMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOworCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJCWZzbCxudW0tbGF3cyA9IDwxMj47CisJfTsKKworCWVjbUAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjEtZWNtIiwgImZzbCxlY20iOworCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCX07CisKKwltZW1vcnktY29udHJvbGxlckAyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWkyYy0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1pMmMtMS5kdHNpIgorL2luY2x1ZGUvICJwcTMtZHVhcnQtMC5kdHNpIgorCisvaW5jbHVkZS8gInBxMy1lc3BpLTAuZHRzaSIKKwlzcGlANzAwMCB7CisJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1ncGlvLTAuZHRzaSIKKworCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjEtbDItY2FjaGUtY29udHJvbGxlciI7CisJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47CisJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCisJCWNhY2hlLXNpemUgPSA8MHg0MDAwMD47IC8vIEwyLDI1NksKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisJfTsKKworL2luY2x1ZGUvICJwcTMtZG1hLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLXVzYjItZHItMC5kdHNpIgorCisvaW5jbHVkZS8gInBxMy1lc2RoYy0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1zZWMzLjMtMC5kdHNpIgorCisvaW5jbHVkZS8gInBxMy1tcGljLmR0c2kiCisvaW5jbHVkZS8gInBxMy1tcGljLXRpbWVyLUIuZHRzaSIKKworL2luY2x1ZGUvICJwcTMtZXRzZWMyLTAuZHRzaSIKKwllbmV0MDogZW5ldDBfZ3JwMjogZXRoZXJuZXRAYjAwMDAgeworCX07CisKKy9pbmNsdWRlLyAicHEzLWV0c2VjMi0xLmR0c2kiCisJZW5ldDE6IGVuZXQxX2dycDI6IGV0aGVybmV0QGIxMDAwIHsKKwl9OworCisvaW5jbHVkZS8gInBxMy1ldHNlYzItMi5kdHNpIgorCWVuZXQyOiBlbmV0Ml9ncnAyOiBldGhlcm5ldEBiMjAwMCB7CisJfTsKKworCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMTAyMS1ndXRzIjsKKwkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJZnNsLGhhcy1yc3RjcjsKKwl9OworfTsKKworJnFlIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlkZXZpY2VfdHlwZSA9ICJxZSI7CisJY29tcGF0aWJsZSA9ICJmc2wscWUiOworCWZzbCxxZS1udW0tcmlzY3MgPSA8MT47CisJZnNsLHFlLW51bS1zbnVtcyA9IDwyOD47CisKKwlxZWljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA4MCB7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQljb21wYXRpYmxlID0gImZzbCxxZS1pYyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJaW50ZXJydXB0cyA9IDw2MyAyIDAgMCA2MCAyIDAgMD47IC8vaGlnaDo0NyBsb3c6NDQKKwl9OworCisJdWNjQDIwMDAgeworCQljZWxsLWluZGV4ID0gPDE+OworCQlyZWcgPSA8MHgyMDAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDwzMj47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCX07CisKKwltZGlvQDIxMjAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCXJlZyA9IDwweDIxMjAgMHgxOD47CisJCWNvbXBhdGlibGUgPSAiZnNsLHVjYy1tZGlvIjsKKwl9OworCisJdWNjQDI0MDAgeworCQljZWxsLWluZGV4ID0gPDU+OworCQlyZWcgPSA8MHgyNDAwIDB4MjAwPjsKKwkJaW50ZXJydXB0cyA9IDw0MD47CisJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OworCX07CisKKwltdXJhbUAxMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wscWUtbXVyYW0iLCAiZnNsLGNwbS1tdXJhbSI7CisJCXJhbmdlcyA9IDwweDAgMHgxMDAwMCAweDYwMDA+OworCisJCWRhdGEtb25seUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHFlLW11cmFtLWRhdGEiLAorCQkJImZzbCxjcG0tbXVyYW0tZGF0YSI7CisJCQlyZWcgPSA8MHgwIDB4NjAwMD47CisJCX07CisJfTsKK307CisKKy9pbmNsdWRlLyAicHEzLWV0c2VjMi1ncnAyLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWV0c2VjMi1ncnAyLTEuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWV0c2VjMi1ncnAyLTIuZHRzaSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjFzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjFzaS1wcmUuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWJkNTRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMTAyMXNpLXByZS5kdHNpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBQMTAyMS9QMTAxMiBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHByZSBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFAxMDIxIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJZXRoZXJuZXQwID0gJmVuZXQwOworCQlldGhlcm5ldDEgPSAmZW5ldDE7CisJCWV0aGVybmV0MiA9ICZlbmV0MjsKKwkJcGNpMCA9ICZwY2kwOworCQlwY2kxID0gJnBjaTE7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyxQMTAyMUAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKworCQlQb3dlclBDLFAxMDIxQDEgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwweDE+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMTAyMnNpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjJzaS1wb3N0LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYyMzliMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjJzaS1wb3N0LmR0c2kKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBQMTAyMi9QMTAxMyBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHBvc3QgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmxiYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY29tcGF0aWJsZSA9ICJmc2wscDEwMjItZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwlpbnRlcnJ1cHRzID0gPDE5IDIgMCAwPjsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHg5MDAwICovCismcGNpMCB7CisJY29tcGF0aWJsZSA9ICJmc2wscDEwMjItcGNpZSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHg0IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4NSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDYgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHg3IDB4MSAweDAgMHgwCisJCQk+OworCX07Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4YTAwMCAqLworJnBjaTEgeworCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLXBjaWUiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MSAweDAgMHgwCisJCQk+OworCX07Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4YjAwMCAqLworJnBjaTIgeworCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLXBjaWUiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMjU1PjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHg4IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4OSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweGEgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHhiIDB4MSAweDAgMHgwCisJCQk+OworCX07Cit9OworCismc29jIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlkZXZpY2VfdHlwZSA9ICJzb2MiOworCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLWltbXIiLCAic2ltcGxlLWJ1cyI7CisJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZpbGxlZCBvdXQgYnkgdWJvb3QuCisKKwllY20tbGF3QDAgeworCQljb21wYXRpYmxlID0gImZzbCxlY20tbGF3IjsKKwkJcmVnID0gPDB4MCAweDEwMDA+OworCQlmc2wsbnVtLWxhd3MgPSA8MTI+OworCX07CisKKwllY21AMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLWVjbSIsICJmc2wsZWNtIjsKKwkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwl9OworCisJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1pMmMtMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtaTJjLTEuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWR1YXJ0LTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWVzcGktMC5kdHNpIgorCXNwaUA3MDAwIHsKKwkJZnNsLGVzcGktbnVtLWNoaXBzZWxlY3RzID0gPDQ+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWRtYS0xLmR0c2kiCisJZG1hQGMzMDAgeworCQlkbWEwMDogZG1hLWNoYW5uZWxAMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzc2ktZG1hLWNoYW5uZWwiOworCQl9OworCQlkbWEwMTogZG1hLWNoYW5uZWxAODAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc3NpLWRtYS1jaGFubmVsIjsKKwkJfTsKKwl9OworCisvaW5jbHVkZS8gInBxMy1ncGlvLTAuZHRzaSIKKworCWRpc3BsYXlAMTAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkaXUiLCAiZnNsLHAxMDIyLWRpdSI7CisJCXJlZyA9IDwweDEwMDAwIDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDY0IDIgMCAwPjsKKwl9OworCisJc3NpQDE1MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODYxMC1zc2kiOworCQljZWxsLWluZGV4ID0gPDA+OworCQlyZWcgPSA8MHgxNTAwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8NzUgMiAwIDA+OworCQlmc2wscGxheWJhY2stZG1hID0gPCZkbWEwMD47CisJCWZzbCxjYXB0dXJlLWRtYSA9IDwmZG1hMDE+OworCQlmc2wsZmlmby1kZXB0aCA9IDwxNT47CisJfTsKKworL2luY2x1ZGUvICJwcTMtc2F0YTItMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtc2F0YTItMS5kdHNpIgorCisJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMTAyMi1sMi1jYWNoZS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKKwkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKKwkJY2FjaGUtc2l6ZSA9IDwweDQwMDAwPjsgLy8gTDIsMjU2SworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1kbWEtMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtdXNiMi1kci0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy11c2IyLWRyLTEuZHRzaSIKKworL2luY2x1ZGUvICJwcTMtZXNkaGMtMC5kdHNpIgorCXNkaGNAMmUwMDAgeworCQlmc2wsc2RoY2ktYXV0by1jbWQxMjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1zZWMzLjMtMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtbXBpYy5kdHNpIgorL2luY2x1ZGUvICJwcTMtbXBpYy10aW1lci1CLmR0c2kiCisKKy9pbmNsdWRlLyAicHEzLWV0c2VjMi0wLmR0c2kiCisJZW5ldDA6IGVuZXQwX2dycDI6IGV0aGVybmV0QGIwMDAwIHsKKwl9OworCisvaW5jbHVkZS8gInBxMy1ldHNlYzItMS5kdHNpIgorCWVuZXQxOiBlbmV0MV9ncnAyOiBldGhlcm5ldEBiMTAwMCB7CisJfTsKKworCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMTAyMi1ndXRzIjsKKwkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJZnNsLGhhcy1yc3RjcjsKKwl9OworCisJcG93ZXJAZTAwNzB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtcG1jIiwgImZzbCxtcGM4NTQ4LXBtYyI7CisJCXJlZyA9IDwweGUwMDcwIDB4MjA+OworCX07CisKK307CisKKy9pbmNsdWRlLyAicHEzLWV0c2VjMi1ncnAyLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWV0c2VjMi1ncnAyLTEuZHRzaSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjJzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjJzaS1wcmUuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTMwZjRmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMTAyMnNpLXByZS5kdHNpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBQMTAyMi9QMTAxMyBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHByZSBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFAxMDIyIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJZXRoZXJuZXQwID0gJmVuZXQwOworCQlldGhlcm5ldDEgPSAmZW5ldDE7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJUG93ZXJQQyxQMTAyMkAwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKworCQlQb3dlclBDLFAxMDIyQDEgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwweDE+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMTAyM3NpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjNzaS1wb3N0LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2YmI0YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjNzaS1wb3N0LmR0c2kKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBQMTAyMy9QMTAxNyBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHBvc3QgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmxiYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY29tcGF0aWJsZSA9ICJmc2wscDEwMjMtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwlpbnRlcnJ1cHRzID0gPDE5IDIgMCAwPjsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHhhMDAwICovCismcGNpMCB7CisJY29tcGF0aWJsZSA9ICJmc2wscDEwMjMtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKKwlkZXZpY2VfdHlwZSA9ICJwY2kiOworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwl9OworfTsKKworLyogY29udHJvbGxlciBhdCAweDkwMDAgKi8KKyZwY2kxIHsKKwljb21wYXRpYmxlID0gImZzbCxwMTAyMy1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMHhmZj47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwl9OworfTsKKworLyogY29udHJvbGxlciBhdCAweGIwMDAgKi8KKyZwY2kyIHsKKwljb21wYXRpYmxlID0gImZzbCxwMTAyMy1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCX07Cit9OworCismc29jIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlkZXZpY2VfdHlwZSA9ICJzb2MiOworCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLWltbXIiLCAic2ltcGxlLWJ1cyI7CisJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZpbGxlZCBvdXQgYnkgdWJvb3QuCisKKwllY20tbGF3QDAgeworCQljb21wYXRpYmxlID0gImZzbCxlY20tbGF3IjsKKwkJcmVnID0gPDB4MCAweDEwMDA+OworCQlmc2wsbnVtLWxhd3MgPSA8MTI+OworCX07CisKKwllY21AMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLWVjbSIsICJmc2wsZWNtIjsKKwkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwl9OworCisJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1pMmMtMC5kdHNpIgorL2luY2x1ZGUvICJwcTMtaTJjLTEuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWR1YXJ0LTAuZHRzaSIKKworL2luY2x1ZGUvICJwcTMtZXNwaS0wLmR0c2kiCisJc3BpQDcwMDAgeworCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47CisJfTsKKworL2luY2x1ZGUvICJwcTMtZ3Bpby0wLmR0c2kiCisKKwlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLWwyLWNhY2hlLWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OworCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcworCQljYWNoZS1zaXplID0gPDB4NDAwMDA+OyAvLyBMMiwyNTZLCisJCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWRtYS0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy11c2IyLWRyLTAuZHRzaSIKKworCWNyeXB0bzogY3J5cHRvQDMwMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yIiwgImZzbCxzZWMtdjQuMCI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47CisJCXJhbmdlcyA9IDwwIDB4MzAwMDAgMHgxMDAwMD47CisJCWludGVycnVwdHMgPSA8NTggMiAwIDA+OworCisJCXNlY19qcjA6IGpyQDEwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDQ1IDIgMCAwPjsKKwkJfTsKKworCQlzZWNfanIxOiBqckAyMDAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKKwkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQkJaW50ZXJydXB0cyA9IDw0NSAyIDAgMD47CisJCX07CisKKwkJc2VjX2pyMjoganJAMzAwMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCisJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJCXJlZyA9IDwweDMwMDAgMHgxMDAwPjsKKwkJCWludGVycnVwdHMgPSA8NTcgMiAwIDA+OworCQl9OworCisJCXNlY19qcjM6IGpyQDQwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCQlyZWcgPSA8MHg0MDAwIDB4MTAwMD47CisJCQlpbnRlcnJ1cHRzID0gPDU3IDIgMCAwPjsKKwkJfTsKKworCQlydGljQDYwMDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYyIsCisJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJlZyA9IDwweDYwMDAgMHgxMDA+OworCQkJcmFuZ2VzID0gPDB4MCAweDYxMDAgMHhlMDA+OworCisJCQlydGljX2E6IHJ0aWMtYUAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJcmVnID0gPDB4MDAgMHgyMCAweDEwMCAweDgwPjsKKwkJCX07CisKKwkJCXJ0aWNfYjogcnRpYy1iQDIwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJcmVnID0gPDB4MjAgMHgyMCAweDIwMCAweDgwPjsKKwkJCX07CisKKwkJCXJ0aWNfYzogcnRpYy1jQDQwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJcmVnID0gPDB4NDAgMHgyMCAweDMwMCAweDgwPjsKKwkJCX07CisKKwkJCXJ0aWNfZDogcnRpYy1kQDYwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQkJcmVnID0gPDB4NjAgMHgyMCAweDUwMCAweDgwPjsKKwkJCX07CisJCX07CisJfTsKKworL2luY2x1ZGUvICJwcTMtbXBpYy5kdHNpIgorL2luY2x1ZGUvICJwcTMtbXBpYy10aW1lci1CLmR0c2kiCisKKwlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjMtZ3V0cyI7CisJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47CisJCWZzbCxoYXMtcnN0Y3I7CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDIzc2ktcHJlLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AxMDIzc2ktcHJlLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM0NWY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDEwMjNzaS1wcmUuZHRzaQpAQCAtMCwwICsxLDc2IEBACisvKgorICogUDEwMjMvUDEwMTcgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwcmUgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisvIHsKKwljb21wYXRpYmxlID0gImZzbCxQMTAyMyI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwlhbGlhc2VzIHsKKwkJc2VyaWFsMCA9ICZzZXJpYWwwOworCQlzZXJpYWwxID0gJnNlcmlhbDE7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisKKwkJY3J5cHRvID0gJmNyeXB0bzsKKwkJc2VjX2pyMCA9ICZzZWNfanIwOworCQlzZWNfanIxID0gJnNlY19qcjE7CisJCXNlY19qcjIgPSAmc2VjX2pyMjsKKwkJc2VjX2pyMyA9ICZzZWNfanIzOworCQlydGljX2EgPSAmcnRpY19hOworCQlydGljX2IgPSAmcnRpY19iOworCQlydGljX2MgPSAmcnRpY19jOworCQlydGljX2QgPSAmcnRpY19kOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCVBvd2VyUEMsUDEwMjNAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDB4MD47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisKKwkJUG93ZXJQQyxQMTAyM0AxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MHgxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDIwMjBzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AyMDIwc2ktcG9zdC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwNDEwNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AyMDIwc2ktcG9zdC5kdHNpCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogUDIwMjAvUDIwMTAgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwb3N0IGluY2x1ZGUpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyZsYmMgeworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLHAyMDIwLWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7CisJaW50ZXJydXB0cyA9IDwxOSAyIDAgMD47Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4YTAwMCAqLworJnBjaTAgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwyNiAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDI2IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MSAweDAgMHgwCisJCQk+OworCX07Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4OTAwMCAqLworJnBjaTEgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MCAyNTU+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwyNSAyIDAgMD47CisKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDQgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg1IDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4NiAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDcgMHgxIDB4MCAweDAKKwkJCT47CisJfTsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHg4MDAwICovCismcGNpMiB7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKKwlkZXZpY2VfdHlwZSA9ICJwY2kiOworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCWJ1cy1yYW5nZSA9IDwwIDI1NT47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDI0IDIgMCAwPjsKKworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MjQgMiAwIDA+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDB4MCAweDAgMHgxICZtcGljIDB4OCAweDEgMHgwIDB4MAorCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDkgMHgxIDB4MCAweDAKKwkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHhhIDB4MSAweDAgMHgwCisJCQkwMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4YiAweDEgMHgwIDB4MAorCQkJPjsKKwl9OworfTsKKworJnNvYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJZGV2aWNlX3R5cGUgPSAic29jIjsKKwljb21wYXRpYmxlID0gImZzbCxwMjAyMC1pbW1yIiwgInNpbXBsZS1idXMiOworCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgorCisJZWNtLWxhd0AwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7CisJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJZnNsLG51bS1sYXdzID0gPDEyPjsKKwl9OworCisJZWNtQDEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1lY20iLCAiZnNsLGVjbSI7CisJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNyAyIDAgMD47CisJfTsKKworCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1tZW1vcnktY29udHJvbGxlciI7CisJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxOCAyIDAgMD47CisJfTsKKworL2luY2x1ZGUvICJwcTMtaTJjLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWkyYy0xLmR0c2kiCisvaW5jbHVkZS8gInBxMy1kdWFydC0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1lc3BpLTAuZHRzaSIKKwlzcGkwOiBzcGlANzAwMCB7CisJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKKwl9OworCisvaW5jbHVkZS8gInBxMy1kbWEtMS5kdHNpIgorL2luY2x1ZGUvICJwcTMtZ3Bpby0wLmR0c2kiCisKKwlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDIwLWwyLWNhY2hlLWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OworCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcworCQljYWNoZS1zaXplID0gPDB4ODAwMDA+OyAvLyBMMiw1MTJLCisJCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OworCX07CisKKy9pbmNsdWRlLyAicHEzLWRtYS0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy11c2IyLWRyLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWV0c2VjMS0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1ldHNlYzEtdGltZXItMC5kdHNpIgorCisJcHRwX2Nsb2NrQDI0ZTAwIHsKKwkJaW50ZXJydXB0cyA9IDw2OCAyIDAgMCA2OSAyIDAgMCA3MCAyIDAgMD47CisJfTsKKworCisvaW5jbHVkZS8gInBxMy1ldHNlYzEtMS5kdHNpIgorL2luY2x1ZGUvICJwcTMtZXRzZWMxLTIuZHRzaSIKKy9pbmNsdWRlLyAicHEzLWVzZGhjLTAuZHRzaSIKKy9pbmNsdWRlLyAicHEzLXNlYzMuMS0wLmR0c2kiCisvaW5jbHVkZS8gInBxMy1tcGljLmR0c2kiCisvaW5jbHVkZS8gInBxMy1tcGljLXRpbWVyLUIuZHRzaSIKKworCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1ndXRzIjsKKwkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKKwkJZnNsLGhhcy1yc3RjcjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDIwMjBzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDIwMjBzaS1wcmUuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjEzMjg4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjAyMHNpLXByZS5kdHNpCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBQMjAyMC9QMjAxMCBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHByZSBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFAyMDIwIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJZXRoZXJuZXQwID0gJmVuZXQwOworCQlldGhlcm5ldDEgPSAmZW5ldDE7CisJCWV0aGVybmV0MiA9ICZlbmV0MjsKKwkJcGNpMCA9ICZwY2kwOworCQlwY2kxID0gJnBjaTE7CisJCXBjaTIgPSAmcGNpMjsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQlQb3dlclBDLFAyMDIwQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwweDA+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OworCQl9OworCisJCVBvd2VyUEMsUDIwMjBAMSB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDB4MT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AyMDQxc2ktcG9zdC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjA0MXNpLXBvc3QuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzRhMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjA0MXNpLXBvc3QuZHRzaQpAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIFAyMDQxL1AyMDQwIFNpbGljb24vU29DIERldmljZSBUcmVlIFNvdXJjZSAocG9zdCBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCismbGJjIHsKKwljb21wYXRpYmxlID0gImZzbCxwMjA0MS1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOworCWludGVycnVwdHMgPSA8MjUgMiAwIDA+OworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDE+OworfTsKKworLyogY29udHJvbGxlciBhdCAweDIwMDAwMCAqLworJnBjaTAgeworCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMCAwIDEgJm1waWMgNDAgMSAwIDAKKwkJCTAwMDAgMCAwIDIgJm1waWMgMSAxIDAgMAorCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEgMCAwCisJCQkwMDAwIDAgMCA0ICZtcGljIDMgMSAwIDAKKwkJCT47CisJfTsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHgyMDEwMDAgKi8KKyZwY2kxIHsKKwljb21wYXRpYmxlID0gImZzbCxwMjA0MS1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMHhmZj47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47CisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAorCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEgMCAwCisJCQkwMDAwIDAgMCAzICZtcGljIDYgMSAwIDAKKwkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAorCQkJPjsKKwl9OworfTsKKworLyogY29udHJvbGxlciBhdCAweDIwMjAwMCAqLworJnBjaTIgeworCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTM+OworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMCAwIDEgJm1waWMgNDIgMSAwIDAKKwkJCTAwMDAgMCAwIDIgJm1waWMgOSAxIDAgMAorCQkJMDAwMCAwIDAgMyAmbXBpYyAxMCAxIDAgMAorCQkJMDAwMCAwIDAgNCAmbXBpYyAxMSAxIDAgMAorCQkJPjsKKwl9OworfTsKKworJnJpbyB7CisJY29tcGF0aWJsZSA9ICJmc2wsc3JpbyI7CisJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTE+OworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDI+OworCXJhbmdlczsKKworCXBvcnQxIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQljZWxsLWluZGV4ID0gPDE+OworCX07CisKKwlwb3J0MiB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJY2VsbC1pbmRleCA9IDwyPjsKKwl9OworfTsKKworJmRjc3IgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLGRjc3IiLCAic2ltcGxlLWJ1cyI7CisKKwlkY3NyLWVwdUAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lcHUiOworCQlpbnRlcnJ1cHRzID0gPDUyIDIgMCAwCisJCQkgICAgICA4NCAyIDAgMAorCQkJICAgICAgODUgMiAwIDA+OworCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJfTsKKwlkY3NyLW5wYyB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnBjIjsKKwkJcmVnID0gPDB4MTAwMCAweDEwMDAgMHgxMDAwMDAwIDB4ODAwMD47CisJfTsKKwlkY3NyLW54Y0AyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ueGMiOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWNvcmVuZXQgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWNvcmVuZXQiOworCQlyZWcgPSA8MHg4MDAwIDB4MTAwMCAweEIwMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWRwYWFAOTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRjc3ItZHBhYSIsICJmc2wsZGNzci1kcGFhIjsKKwkJcmVnID0gPDB4OTAwMCAweDEwMDA+OworCX07CisJZGNzci1vY25AMTEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kY3NyLW9jbiIsICJmc2wsZGNzci1vY24iOworCQlyZWcgPSA8MHgxMTAwMCAweDEwMDA+OworCX07CisJZGNzci1kZHJAMTIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCWRldi1oYW5kbGUgPSA8JmRkcjE+OworCQlyZWcgPSA8MHgxMjAwMCAweDEwMDA+OworCX07CisJZGNzci1uYWxAMTgwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kY3NyLW5hbCIsICJmc2wsZGNzci1uYWwiOworCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCX07CisJZGNzci1yY3BtQDIyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZGNzci1yY3BtIiwgImZzbCxkY3NyLXJjcG0iOworCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OworCX07CisJZGNzci1jcHUtc2ItcHJveHlANDAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKKwkJcmVnID0gPDB4NDAwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJY3B1LWhhbmRsZSA9IDwmY3B1MT47CisJCXJlZyA9IDwweDQxMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWNwdS1zYi1wcm94eUA0MjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCWNwdS1oYW5kbGUgPSA8JmNwdTI+OworCQlyZWcgPSA8MHg0MjAwMCAweDEwMDA+OworCX07CisJZGNzci1jcHUtc2ItcHJveHlANDMwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQljcHUtaGFuZGxlID0gPCZjcHUzPjsKKwkJcmVnID0gPDB4NDMwMDAgMHgxMDAwPjsKKwl9OworfTsKKworJnNvYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJZGV2aWNlX3R5cGUgPSAic29jIjsKKwljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCisJc29jLXNyYW0tZXJyb3IgeworCQljb21wYXRpYmxlID0gImZzbCxzb2Mtc3JhbS1lcnJvciI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDI5PjsKKwl9OworCisJY29yZW5ldC1sYXdAMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtbGF3IjsKKwkJcmVnID0gPDB4MCAweDEwMDA+OworCQlmc2wsbnVtLWxhd3MgPSA8MzI+OworCX07CisKKwlkZHIxOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNSIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKKwl9OworCisJY3BjOiBsMy1jYWNoZS1jb250cm9sbGVyQDEwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtbDMtY2FjaGUtY29udHJvbGxlciIsICJmc2wscDQwODAtbDMtY2FjaGUtY29udHJvbGxlciIsICJjYWNoZSI7CisJCXJlZyA9IDwweDEwMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDI3PjsKKwl9OworCisJY29yZW5ldC1jZkAxODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtY2YiOworCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAzMT47CisJCWZzbCxjY2YtbnVtLWNzZGlkcyA9IDwzMj47CisJCWZzbCxjY2YtbnVtLXNub29waWRzID0gPDMyPjsKKwl9OworCisJaW9tbXVAMjAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwYW11LXYxLjAiLCAiZnNsLHBhbXUiOworCQlyZWcgPSA8MHgyMDAwMCAweDQwMDA+OworCQlpbnRlcnJ1cHRzID0gPAorCQkJMjQgMiAwIDAKKwkJCTE2IDIgMSAzMD47CisJfTsKKworL2luY2x1ZGUvICJxb3JpcS1tcGljLmR0c2kiCisKKwlndXRzOiBnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtZGV2aWNlLWNvbmZpZy0xLjAiOworCQlyZWcgPSA8MHhlMDAwMCAweGUwMD47CisJCWZzbCxoYXMtcnN0Y3I7CisJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwkJZnNsLGxpb2RuLWJpdHMgPSA8MTI+OworCX07CisKKwlwaW5zOiBnbG9iYWwtdXRpbGl0aWVzQGUwZTAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcGluLWNvbnRyb2wtMS4wIjsKKwkJcmVnID0gPDB4ZTBlMDAgMHgyMDA+OworCQkjc2xlZXAtY2VsbHMgPSA8Mj47CisJfTsKKworCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7CisJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwl9OworCisJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXJjcG0tMS4wIjsKKwkJcmVnID0gPDB4ZTIwMDAgMHgxMDAwPjsKKwkJI3NsZWVwLWNlbGxzID0gPDE+OworCX07CisKKwlzZnA6IHNmcEBlODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXNmcCIsICJmc2wscW9yaXEtc2ZwLTEuMCI7CisJCXJlZwkgICA9IDwweGU4MDAwIDB4MTAwMD47CisJfTsKKworCXNlcmRlczogc2VyZGVzQGVhMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtc2VyZGVzIjsKKwkJcmVnCSAgID0gPDB4ZWEwMDAgMHgxMDAwPjsKKwl9OworCisvaW5jbHVkZS8gInFvcmlxLWRtYS0wLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWRtYS0xLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWVzcGktMC5kdHNpIgorCXNwaUAxMTAwMDAgeworCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47CisJfTsKKworL2luY2x1ZGUvICJxb3JpcS1lc2RoYy0wLmR0c2kiCisJc2RoY0AxMTQwMDAgeworCQlzZGhjaSxhdXRvLWNtZDEyOworCX07CisKKy9pbmNsdWRlLyAicW9yaXEtaTJjLTAuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtaTJjLTEuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtZHVhcnQtMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1kdWFydC0xLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWdwaW8tMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS11c2IyLW1waC0wLmR0c2kiCisJCXVzYjA6IHVzYkAyMTAwMDAgeworCQkJcGh5X3R5cGUgPSAidXRtaSI7CisJCQlwb3J0MDsKKwkJfTsKKworL2luY2x1ZGUvICJxb3JpcS11c2IyLWRyLTAuZHRzaSIKKwkJdXNiMTogdXNiQDIxMTAwMCB7CisJCQlkcl9tb2RlID0gImhvc3QiOworCQkJcGh5X3R5cGUgPSAidXRtaSI7CisJCX07CisKKy9pbmNsdWRlLyAicW9yaXEtc2F0YTItMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1zYXRhMi0xLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLXNlYzQuMi0wLmR0c2kiCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjA0MXNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMjA0MXNpLXByZS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMGE0MGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AyMDQxc2ktcHJlLmR0c2kKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBQMjA0MSBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHByZSBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFAyMDQxIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQljY3NyID0gJnNvYzsKKwkJZGNzciA9ICZkY3NyOworCisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlzZXJpYWwyID0gJnNlcmlhbDI7CisJCXNlcmlhbDMgPSAmc2VyaWFsMzsKKwkJcGNpMCA9ICZwY2kwOworCQlwY2kxID0gJnBjaTE7CisJCXBjaTIgPSAmcGNpMjsKKwkJdXNiMCA9ICZ1c2IwOworCQl1c2IxID0gJnVzYjE7CisJCWRtYTAgPSAmZG1hMDsKKwkJZG1hMSA9ICZkbWExOworCQlzZGhjID0gJnNkaGM7CisJCW1zaTAgPSAmbXNpMDsKKwkJbXNpMSA9ICZtc2kxOworCQltc2kyID0gJm1zaTI7CisKKwkJY3J5cHRvID0gJmNyeXB0bzsKKwkJc2VjX2pyMCA9ICZzZWNfanIwOworCQlzZWNfanIxID0gJnNlY19qcjE7CisJCXNlY19qcjIgPSAmc2VjX2pyMjsKKwkJc2VjX2pyMyA9ICZzZWNfanIzOworCQlydGljX2EgPSAmcnRpY19hOworCQlydGljX2IgPSAmcnRpY19iOworCQlydGljX2MgPSAmcnRpY19jOworCQlydGljX2QgPSAmcnRpY19kOworCQlzZWNfbW9uID0gJnNlY19tb247CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY3B1MDogUG93ZXJQQyxlNTAwbWNAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47CisJCQlMMl8wOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTE6IFBvd2VyUEMsZTUwMG1jQDEgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OworCQkJTDJfMTogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUyOiBQb3dlclBDLGU1MDBtY0AyIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8Mj47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKKwkJCUwyXzI6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1MzogUG93ZXJQQyxlNTAwbWNAMyB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDM+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47CisJCQlMMl8zOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AzMDQxc2ktcG9zdC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA0MXNpLXBvc3QuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDFkMDhkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA0MXNpLXBvc3QuZHRzaQpAQCAtMCwwICsxLDM1MiBAQAorLyoKKyAqIFAzMDQxIFNpbGljb24vU29DIERldmljZSBUcmVlIFNvdXJjZSAocG9zdCBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCismbGJjIHsKKwljb21wYXRpYmxlID0gImZzbCxwMzA0MS1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOworCWludGVycnVwdHMgPSA8MjUgMiAwIDA+OworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDE+OworfTsKKworLyogY29udHJvbGxlciBhdCAweDIwMDAwMCAqLworJnBjaTAgeworCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMCAwIDEgJm1waWMgNDAgMSAwIDAKKwkJCTAwMDAgMCAwIDIgJm1waWMgMSAxIDAgMAorCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEgMCAwCisJCQkwMDAwIDAgMCA0ICZtcGljIDMgMSAwIDAKKwkJCT47CisJfTsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHgyMDEwMDAgKi8KKyZwY2kxIHsKKwljb21wYXRpYmxlID0gImZzbCxwMzA0MS1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMHhmZj47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47CisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAorCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEgMCAwCisJCQkwMDAwIDAgMCAzICZtcGljIDYgMSAwIDAKKwkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAorCQkJPjsKKwl9OworfTsKKworLyogY29udHJvbGxlciBhdCAweDIwMjAwMCAqLworJnBjaTIgeworCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTM+OworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMCAwIDEgJm1waWMgNDIgMSAwIDAKKwkJCTAwMDAgMCAwIDIgJm1waWMgOSAxIDAgMAorCQkJMDAwMCAwIDAgMyAmbXBpYyAxMCAxIDAgMAorCQkJMDAwMCAwIDAgNCAmbXBpYyAxMSAxIDAgMAorCQkJPjsKKwl9OworfTsKKworLyogY29udHJvbGxlciBhdCAweDIwMzAwMCAqLworJnBjaTMgeworCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTI+OworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDEyPjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMCAwIDEgJm1waWMgNDMgMSAwIDAKKwkJCTAwMDAgMCAwIDIgJm1waWMgMCAxIDAgMAorCQkJMDAwMCAwIDAgMyAmbXBpYyA0IDEgMCAwCisJCQkwMDAwIDAgMCA0ICZtcGljIDggMSAwIDAKKwkJCT47CisJfTsKK307CisKKyZyaW8geworCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8iOworCWludGVycnVwdHMgPSA8MTYgMiAxIDExPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlyYW5nZXM7CisKKwlwb3J0MSB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJY2VsbC1pbmRleCA9IDwxPjsKKwl9OworCisJcG9ydDIgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCWNlbGwtaW5kZXggPSA8Mj47CisJfTsKK307CisKKyZkY3NyIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwljb21wYXRpYmxlID0gImZzbCxkY3NyIiwgInNpbXBsZS1idXMiOworCisJZGNzci1lcHVAMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZXB1IjsKKwkJaW50ZXJydXB0cyA9IDw1MiAyIDAgMAorCQkJICAgICAgODQgMiAwIDAKKwkJCSAgICAgIDg1IDIgMCAwPjsKKwkJcmVnID0gPDB4MCAweDEwMDA+OworCX07CisJZGNzci1ucGMgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW5wYyI7CisJCXJlZyA9IDwweDEwMDAgMHgxMDAwIDB4MTAwMDAwMCAweDgwMDA+OworCX07CisJZGNzci1ueGNAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnhjIjsKKwkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCX07CisJZGNzci1jb3JlbmV0IHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1jb3JlbmV0IjsKKwkJcmVnID0gPDB4ODAwMCAweDEwMDAgMHhCMDAwMCAweDEwMDA+OworCX07CisJZGNzci1kcGFhQDkwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1kY3NyLWRwYWEiLCAiZnNsLGRjc3ItZHBhYSI7CisJCXJlZyA9IDwweDkwMDAgMHgxMDAwPjsKKwl9OworCWRjc3Itb2NuQDExMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtZGNzci1vY24iLCAiZnNsLGRjc3Itb2NuIjsKKwkJcmVnID0gPDB4MTEwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItZGRyQDEyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1kZHIiOworCQlkZXYtaGFuZGxlID0gPCZkZHIxPjsKKwkJcmVnID0gPDB4MTIwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItbmFsQDE4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtZGNzci1uYWwiLCAiZnNsLGRjc3ItbmFsIjsKKwkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItcmNwbUAyMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWRjc3ItcmNwbSIsICJmc2wsZGNzci1yY3BtIjsKKwkJcmVnID0gPDB4MjIwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItY3B1LXNiLXByb3h5QDQwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJY3B1LWhhbmRsZSA9IDwmY3B1MD47CisJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWNwdS1zYi1wcm94eUA0MTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCWNwdS1oYW5kbGUgPSA8JmNwdTE+OworCQlyZWcgPSA8MHg0MTAwMCAweDEwMDA+OworCX07CisJZGNzci1jcHUtc2ItcHJveHlANDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQljcHUtaGFuZGxlID0gPCZjcHUyPjsKKwkJcmVnID0gPDB4NDIwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItY3B1LXNiLXByb3h5QDQzMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJY3B1LWhhbmRsZSA9IDwmY3B1Mz47CisJCXJlZyA9IDwweDQzMDAwIDB4MTAwMD47CisJfTsKK307CisKKyZzb2MgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWRldmljZV90eXBlID0gInNvYyI7CisJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKworCXNvYy1zcmFtLWVycm9yIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc29jLXNyYW0tZXJyb3IiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyOT47CisJfTsKKworCWNvcmVuZXQtbGF3QDAgeworCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWxhdyI7CisJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJZnNsLG51bS1sYXdzID0gPDMyPjsKKwl9OworCisJZGRyMTogbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjUiLCAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4ODAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMz47CisJfTsKKworCWNwYzogbDMtY2FjaGUtY29udHJvbGxlckAxMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiZnNsLHA0MDgwLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiY2FjaGUiOworCQlyZWcgPSA8MHgxMDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyNz47CisJfTsKKworCWNvcmVuZXQtY2ZAMTgwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWNmIjsKKwkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMzE+OworCQlmc2wsY2NmLW51bS1jc2RpZHMgPSA8MzI+OworCQlmc2wsY2NmLW51bS1zbm9vcGlkcyA9IDwzMj47CisJfTsKKworCWlvbW11QDIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscGFtdS12MS4wIiwgImZzbCxwYW11IjsKKwkJcmVnID0gPDB4MjAwMDAgMHg0MDAwPjsKKwkJaW50ZXJydXB0cyA9IDwKKwkJCTI0IDIgMCAwCisJCQkxNiAyIDEgMzA+OworCX07CisKKy9pbmNsdWRlLyAicW9yaXEtbXBpYy5kdHNpIgorCisJZ3V0czogZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWRldmljZS1jb25maWctMS4wIjsKKwkJcmVnID0gPDB4ZTAwMDAgMHhlMDA+OworCQlmc2wsaGFzLXJzdGNyOworCQkjc2xlZXAtY2VsbHMgPSA8MT47CisJCWZzbCxsaW9kbi1iaXRzID0gPDEyPjsKKwl9OworCisJcGluczogZ2xvYmFsLXV0aWxpdGllc0BlMGUwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXBpbi1jb250cm9sLTEuMCI7CisJCXJlZyA9IDwweGUwZTAwIDB4MjAwPjsKKwkJI3NsZWVwLWNlbGxzID0gPDI+OworCX07CisKKwljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0xLjAiOworCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJfTsKKworCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1yY3BtLTEuMCI7CisJCXJlZyA9IDwweGUyMDAwIDB4MTAwMD47CisJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwl9OworCisJc2ZwOiBzZnBAZTgwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1zZnAiLCAiZnNsLHFvcmlxLXNmcC0xLjAiOworCQlyZWcJICAgPSA8MHhlODAwMCAweDEwMDA+OworCX07CisKKwlzZXJkZXM6IHNlcmRlc0BlYTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXNlcmRlcyI7CisJCXJlZwkgICA9IDwweGVhMDAwIDB4MTAwMD47CisJfTsKKworL2luY2x1ZGUvICJxb3JpcS1kbWEtMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1kbWEtMS5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1lc3BpLTAuZHRzaSIKKwlzcGlAMTEwMDAwIHsKKwkJZnNsLGVzcGktbnVtLWNoaXBzZWxlY3RzID0gPDQ+OworCX07CisKKy9pbmNsdWRlLyAicW9yaXEtZXNkaGMtMC5kdHNpIgorCXNkaGNAMTE0MDAwIHsKKwkJc2RoY2ksYXV0by1jbWQxMjsKKwl9OworCisvaW5jbHVkZS8gInFvcmlxLWkyYy0wLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWkyYy0xLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWR1YXJ0LTAuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtZHVhcnQtMS5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1ncGlvLTAuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtdXNiMi1tcGgtMC5kdHNpIgorCQl1c2IwOiB1c2JAMjEwMDAwIHsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQkJcG9ydDA7CisJCX07CisKKy9pbmNsdWRlLyAicW9yaXEtdXNiMi1kci0wLmR0c2kiCisJCXVzYjE6IHVzYkAyMTEwMDAgeworCQkJZHJfbW9kZSA9ICJob3N0IjsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQl9OworCisvaW5jbHVkZS8gInFvcmlxLXNhdGEyLTAuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtc2F0YTItMS5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1zZWM0LjItMC5kdHNpIgorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDMwNDFzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDMwNDFzaS1wcmUuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzZkZWYzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA0MXNpLXByZS5kdHNpCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogUDMwNDEgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwcmUgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisvIHsKKwljb21wYXRpYmxlID0gImZzbCxQMzA0MSI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwlhbGlhc2VzIHsKKwkJY2NzciA9ICZzb2M7CisJCWRjc3IgPSAmZGNzcjsKKworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJc2VyaWFsMiA9ICZzZXJpYWwyOworCQlzZXJpYWwzID0gJnNlcmlhbDM7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisJCXBjaTMgPSAmcGNpMzsKKwkJdXNiMCA9ICZ1c2IwOworCQl1c2IxID0gJnVzYjE7CisJCWRtYTAgPSAmZG1hMDsKKwkJZG1hMSA9ICZkbWExOworCQlzZGhjID0gJnNkaGM7CisJCW1zaTAgPSAmbXNpMDsKKwkJbXNpMSA9ICZtc2kxOworCQltc2kyID0gJm1zaTI7CisKKwkJY3J5cHRvID0gJmNyeXB0bzsKKwkJc2VjX2pyMCA9ICZzZWNfanIwOworCQlzZWNfanIxID0gJnNlY19qcjE7CisJCXNlY19qcjIgPSAmc2VjX2pyMjsKKwkJc2VjX2pyMyA9ICZzZWNfanIzOworCQlydGljX2EgPSAmcnRpY19hOworCQlydGljX2IgPSAmcnRpY19iOworCQlydGljX2MgPSAmcnRpY19jOworCQlydGljX2QgPSAmcnRpY19kOworCQlzZWNfbW9uID0gJnNlY19tb247CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY3B1MDogUG93ZXJQQyxlNTAwbWNAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDA+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMD47CisJCQlMMl8wOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTE6IFBvd2VyUEMsZTUwMG1jQDEgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OworCQkJTDJfMTogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUyOiBQb3dlclBDLGU1MDBtY0AyIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8Mj47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8yPjsKKwkJCUwyXzI6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1MzogUG93ZXJQQyxlNTAwbWNAMyB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDM+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMz47CisJCQlMMl8zOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AzMDYwc2ktcG9zdC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA2MHNpLXBvc3QuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjNlZGQxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA2MHNpLXBvc3QuZHRzaQpAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIFAzMDYwIFNpbGljb24vU29DIERldmljZSBUcmVlIFNvdXJjZSAocG9zdCBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCismbGJjIHsKKwljb21wYXRpYmxlID0gImZzbCxwMzA2MC1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOworCWludGVycnVwdHMgPSA8MjUgMiAwIDA+OworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDE+OworfTsKKworLyogY29udHJvbGxlciBhdCAweDIwMDAwMCAqLworJnBjaTAgeworCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7CisJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMCAwIDEgJm1waWMgNDAgMSAwIDAKKwkJCTAwMDAgMCAwIDIgJm1waWMgMSAxIDAgMAorCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEgMCAwCisJCQkwMDAwIDAgMCA0ICZtcGljIDMgMSAwIDAKKwkJCT47CisJfTsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHgyMDEwMDAgKi8KKyZwY2kxIHsKKwljb21wYXRpYmxlID0gImZzbCxwMzA2MC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMHhmZj47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47CisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAorCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEgMCAwCisJCQkwMDAwIDAgMCAzICZtcGljIDYgMSAwIDAKKwkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAorCQkJPjsKKwl9OworfTsKKworJnJpbyB7CisJY29tcGF0aWJsZSA9ICJmc2wsc3JpbyI7CisJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTE+OworCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCSNzaXplLWNlbGxzID0gPDI+OworCWZzbCxzcmlvLXJtdS1oYW5kbGUgPSA8JnJtdT47CisJcmFuZ2VzOworCisJcG9ydDEgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCWNlbGwtaW5kZXggPSA8MT47CisJfTsKKworCXBvcnQyIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQljZWxsLWluZGV4ID0gPDI+OworCX07Cit9OworCismZGNzciB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY29tcGF0aWJsZSA9ICJmc2wsZGNzciIsICJzaW1wbGUtYnVzIjsKKworCWRjc3ItZXB1QDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWVwdSI7CisJCWludGVycnVwdHMgPSA8NTIgMiAwIDAKKwkJCSAgICAgIDg0IDIgMCAwCisJCQkgICAgICA4NSAyIDAgMD47CisJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwl9OworCWRjc3ItbnBjIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ucGMiOworCQlyZWcgPSA8MHgxMDAwIDB4MTAwMCAweDEwMDAwMDAgMHg4MDAwPjsKKwl9OworCWRjc3ItbnhjQDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW54YyI7CisJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItY29yZW5ldCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItY29yZW5ldCI7CisJCXJlZyA9IDwweDgwMDAgMHgxMDAwIDB4QjAwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItZHBhYUA5MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZGNzci1kcGFhIiwgImZzbCxkY3NyLWRwYWEiOworCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLW9jbkAxMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRjc3Itb2NuIiwgImZzbCxkY3NyLW9jbiI7CisJCXJlZyA9IDwweDExMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWRkckAxMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKKwkJZGV2LWhhbmRsZSA9IDwmZGRyMT47CisJCXJlZyA9IDwweDEyMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLW5hbEAxODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRjc3ItbmFsIiwgImZzbCxkY3NyLW5hbCI7CisJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLXJjcG1AMjIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kY3NyLXJjcG0iLCAiZnNsLGRjc3ItcmNwbSI7CisJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWNwdS1zYi1wcm94eUA0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCWNwdS1oYW5kbGUgPSA8JmNwdTA+OworCQlyZWcgPSA8MHg0MDAwMCAweDEwMDA+OworCX07CisJZGNzci1jcHUtc2ItcHJveHlANDEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQljcHUtaGFuZGxlID0gPCZjcHUxPjsKKwkJcmVnID0gPDB4NDEwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItY3B1LXNiLXByb3h5QDQ0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJY3B1LWhhbmRsZSA9IDwmY3B1ND47CisJCXJlZyA9IDwweDQ0MDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWNwdS1zYi1wcm94eUA0NTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCWNwdS1oYW5kbGUgPSA8JmNwdTU+OworCQlyZWcgPSA8MHg0NTAwMCAweDEwMDA+OworCX07CisJZGNzci1jcHUtc2ItcHJveHlANDYwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQljcHUtaGFuZGxlID0gPCZjcHU2PjsKKwkJcmVnID0gPDB4NDYwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItY3B1LXNiLXByb3h5QDQ3MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJY3B1LWhhbmRsZSA9IDwmY3B1Nz47CisJCXJlZyA9IDwweDQ3MDAwIDB4MTAwMD47CisJfTsKKworfTsKKworJnNvYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJZGV2aWNlX3R5cGUgPSAic29jIjsKKwljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCisJc29jLXNyYW0tZXJyb3IgeworCQljb21wYXRpYmxlID0gImZzbCxzb2Mtc3JhbS1lcnJvciI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDI5PjsKKwl9OworCisJY29yZW5ldC1sYXdAMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtbGF3IjsKKwkJcmVnID0gPDB4MCAweDEwMDA+OworCQlmc2wsbnVtLWxhd3MgPSA8MzI+OworCX07CisKKwlkZHIxOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNCIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKKwl9OworCisJY3BjOiBsMy1jYWNoZS1jb250cm9sbGVyQDEwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtbDMtY2FjaGUtY29udHJvbGxlciIsICJjYWNoZSI7CisJCXJlZyA9IDwweDEwMDAwIDB4MTAwMAorCQkgICAgICAgMHgxMTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyNworCQkJICAgICAgMTYgMiAxIDI2PjsKKwl9OworCisJY29yZW5ldC1jZkAxODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtY2YiOworCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAzMT47CisJCWZzbCxjY2YtbnVtLWNzZGlkcyA9IDwzMj47CisJCWZzbCxjY2YtbnVtLXNub29waWRzID0gPDMyPjsKKwl9OworCisJaW9tbXVAMjAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwYW11LXYxLjAiLCAiZnNsLHBhbXUiOworCQlyZWcgPSA8MHgyMDAwMCAweDUwMDA+OworCQlpbnRlcnJ1cHRzID0gPAorCQkJMjQgMiAwIDAKKwkJCTE2IDIgMSAzMD47CisJfTsKKworL2luY2x1ZGUvICJxb3JpcS1ybXUtMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1tcGljLmR0c2kiCisKKwlndXRzOiBnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtZGV2aWNlLWNvbmZpZy0xLjAiOworCQlyZWcgPSA8MHhlMDAwMCAweGUwMD47CisJCWZzbCxoYXMtcnN0Y3I7CisJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwkJZnNsLGxpb2RuLWJpdHMgPSA8MTI+OworCX07CisKKwlwaW5zOiBnbG9iYWwtdXRpbGl0aWVzQGUwZTAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcGluLWNvbnRyb2wtMS4wIjsKKwkJcmVnID0gPDB4ZTBlMDAgMHgyMDA+OworCQkjc2xlZXAtY2VsbHMgPSA8Mj47CisJfTsKKworCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7CisJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwl9OworCisJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXJjcG0tMS4wIjsKKwkJcmVnID0gPDB4ZTIwMDAgMHgxMDAwPjsKKwkJI3NsZWVwLWNlbGxzID0gPDE+OworCX07CisKKwlzZnA6IHNmcEBlODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLXNmcCIsICJmc2wscW9yaXEtc2ZwLTEuMCI7CisJCXJlZwkgICA9IDwweGU4MDAwIDB4MTAwMD47CisJfTsKKworCXNlcmRlczogc2VyZGVzQGVhMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtc2VyZGVzIjsKKwkJcmVnCSAgID0gPDB4ZWEwMDAgMHgxMDAwPjsKKwl9OworCisvaW5jbHVkZS8gInFvcmlxLWRtYS0wLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWRtYS0xLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWVzcGktMC5kdHNpIgorCXNwaUAxMTAwMDAgeworCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47CisJfTsKKworL2luY2x1ZGUvICJxb3JpcS1pMmMtMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1pMmMtMS5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1kdWFydC0wLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWR1YXJ0LTEuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtZ3Bpby0wLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLXVzYjItbXBoLTAuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtdXNiMi1kci0wLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLXNlYzQuMS0wLmR0c2kiCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA2MHNpLXByZS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wMzA2MHNpLXByZS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzhlNzAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3AzMDYwc2ktcHJlLmR0c2kKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBQMzA2MCBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHByZSBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFAzMDYwIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQljY3NyID0gJnNvYzsKKwkJZGNzciA9ICZkY3NyOworCisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlzZXJpYWwyID0gJnNlcmlhbDI7CisJCXNlcmlhbDMgPSAmc2VyaWFsMzsKKwkJcGNpMCA9ICZwY2kwOworCQlwY2kxID0gJnBjaTE7CisJCXVzYjAgPSAmdXNiMDsKKwkJdXNiMSA9ICZ1c2IxOworCQlkbWEwID0gJmRtYTA7CisJCWRtYTEgPSAmZG1hMTsKKwkJbXNpMCA9ICZtc2kwOworCQltc2kxID0gJm1zaTE7CisJCW1zaTIgPSAmbXNpMjsKKworCQljcnlwdG8gPSAmY3J5cHRvOworCQlzZWNfanIwID0gJnNlY19qcjA7CisJCXNlY19qcjEgPSAmc2VjX2pyMTsKKwkJc2VjX2pyMiA9ICZzZWNfanIyOworCQlzZWNfanIzID0gJnNlY19qcjM7CisJCXJ0aWNfYSA9ICZydGljX2E7CisJCXJ0aWNfYiA9ICZydGljX2I7CisJCXJ0aWNfYyA9ICZydGljX2M7CisJCXJ0aWNfZCA9ICZydGljX2Q7CisJCXNlY19tb24gPSAmc2VjX21vbjsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHUwOiBQb3dlclBDLGU1MDBtY0AwIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MD47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKKwkJCUwyXzA6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1MTogUG93ZXJQQyxlNTAwbWNAMSB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDE+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47CisJCQlMMl8xOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTQ6IFBvd2VyUEMsZTUwMG1jQDQgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw0PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzQ+OworCQkJTDJfNDogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHU1OiBQb3dlclBDLGU1MDBtY0A1IHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8NT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl81PjsKKwkJCUwyXzU6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1NjogUG93ZXJQQyxlNTAwbWNANiB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDY+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNj47CisJCQlMMl82OiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTc6IFBvd2VyUEMsZTUwMG1jQDcgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw3PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzc+OworCQkJTDJfNzogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNDA4MHNpLXBvc3QuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDQwODBzaS1wb3N0LmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzNWQyYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDQwODBzaS1wb3N0LmR0c2kKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBQNDA4MC9QNDA0MCBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHBvc3QgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmxiYyB7CisJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHgyMDAwMDAgKi8KKyZwY2kwIHsKKwljb21wYXRpYmxlID0gImZzbCxwNDA4MC1wY2llIjsKKwlkZXZpY2VfdHlwZSA9ICJwY2kiOworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47CisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAwIDAgMSAmbXBpYyA0MCAxIDAgMAorCQkJMDAwMCAwIDAgMiAmbXBpYyAxIDEgMCAwCisJCQkwMDAwIDAgMCAzICZtcGljIDIgMSAwIDAKKwkJCTAwMDAgMCAwIDQgJm1waWMgMyAxIDAgMAorCQkJPjsKKwl9OworfTsKKworLyogY29udHJvbGxlciBhdCAweDIwMTAwMCAqLworJnBjaTEgeworCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXBjaWUiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDAgMHhmZj47CisJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKKwlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47CisJcGNpZUAwIHsKKwkJcmVnID0gPDAgMCAwIDAgMD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MCAqLworCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAorCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEgMCAwCisJCQkwMDAwIDAgMCAzICZtcGljIDYgMSAwIDAKKwkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAorCQkJPjsKKwl9OworfTsKKworLyogY29udHJvbGxlciBhdCAweDIwMjAwMCAqLworJnBjaTIgeworCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXBjaWUiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMz47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDAgMCAxICZtcGljIDQyIDEgMCAwCisJCQkwMDAwIDAgMCAyICZtcGljIDkgMSAwIDAKKwkJCTAwMDAgMCAwIDMgJm1waWMgMTAgMSAwIDAKKwkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMSAwIDAKKwkJCT47CisJfTsKK307CisKKyZyaW8geworCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8iOworCWludGVycnVwdHMgPSA8MTYgMiAxIDExPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlmc2wsc3Jpby1ybXUtaGFuZGxlID0gPCZybXU+OworCXJhbmdlczsKKworCXBvcnQxIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQljZWxsLWluZGV4ID0gPDE+OworCX07CisKKwlwb3J0MiB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJY2VsbC1pbmRleCA9IDwyPjsKKwl9OworfTsKKworJmRjc3IgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLGRjc3IiLCAic2ltcGxlLWJ1cyI7CisKKwlkY3NyLWVwdUAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lcHUiOworCQlpbnRlcnJ1cHRzID0gPDUyIDIgMCAwCisJCQkgICAgICA4NCAyIDAgMAorCQkJICAgICAgODUgMiAwIDA+OworCQlyZWcgPSA8MHgwIDB4MTAwMD47CisJfTsKKwlkY3NyLW5wYyB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnBjIjsKKwkJcmVnID0gPDB4MTAwMCAweDEwMDAgMHgxMDAwMDAwIDB4ODAwMD47CisJfTsKKwlkY3NyLW54Y0AyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ueGMiOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWNvcmVuZXQgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWNvcmVuZXQiOworCQlyZWcgPSA8MHg4MDAwIDB4MTAwMCAweEIwMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWRwYWFAOTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRjc3ItZHBhYSIsICJmc2wsZGNzci1kcGFhIjsKKwkJcmVnID0gPDB4OTAwMCAweDEwMDA+OworCX07CisJZGNzci1vY25AMTEwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kY3NyLW9jbiIsICJmc2wsZGNzci1vY24iOworCQlyZWcgPSA8MHgxMTAwMCAweDEwMDA+OworCX07CisJZGNzci1kZHJAMTIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCWRldi1oYW5kbGUgPSA8JmRkcjE+OworCQlyZWcgPSA8MHgxMjAwMCAweDEwMDA+OworCX07CisJZGNzci1kZHJAMTMwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7CisJCWRldi1oYW5kbGUgPSA8JmRkcjI+OworCQlyZWcgPSA8MHgxMzAwMCAweDEwMDA+OworCX07CisJZGNzci1uYWxAMTgwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kY3NyLW5hbCIsICJmc2wsZGNzci1uYWwiOworCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCX07CisJZGNzci1yY3BtQDIyMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZGNzci1yY3BtIiwgImZzbCxkY3NyLXJjcG0iOworCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OworCX07CisJZGNzci1jcHUtc2ItcHJveHlANDAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKKwkJcmVnID0gPDB4NDAwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJY3B1LWhhbmRsZSA9IDwmY3B1MT47CisJCXJlZyA9IDwweDQxMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWNwdS1zYi1wcm94eUA0MjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCWNwdS1oYW5kbGUgPSA8JmNwdTI+OworCQlyZWcgPSA8MHg0MjAwMCAweDEwMDA+OworCX07CisJZGNzci1jcHUtc2ItcHJveHlANDMwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQljcHUtaGFuZGxlID0gPCZjcHUzPjsKKwkJcmVnID0gPDB4NDMwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItY3B1LXNiLXByb3h5QDQ0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJY3B1LWhhbmRsZSA9IDwmY3B1ND47CisJCXJlZyA9IDwweDQ0MDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWNwdS1zYi1wcm94eUA0NTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7CisJCWNwdS1oYW5kbGUgPSA8JmNwdTU+OworCQlyZWcgPSA8MHg0NTAwMCAweDEwMDA+OworCX07CisJZGNzci1jcHUtc2ItcHJveHlANDYwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1MDBtYy1zYi1wcm94eSIsICJmc2wsZGNzci1jcHUtc2ItcHJveHkiOworCQljcHUtaGFuZGxlID0gPCZjcHU2PjsKKwkJcmVnID0gPDB4NDYwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItY3B1LXNiLXByb3h5QDQ3MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJY3B1LWhhbmRsZSA9IDwmY3B1Nz47CisJCXJlZyA9IDwweDQ3MDAwIDB4MTAwMD47CisJfTsKKworfTsKKworJnNvYyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJZGV2aWNlX3R5cGUgPSAic29jIjsKKwljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCisJc29jLXNyYW0tZXJyb3IgeworCQljb21wYXRpYmxlID0gImZzbCxzb2Mtc3JhbS1lcnJvciI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDI5PjsKKwl9OworCisJY29yZW5ldC1sYXdAMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtbGF3IjsKKwkJcmVnID0gPDB4MCAweDEwMDA+OworCQlmc2wsbnVtLWxhd3MgPSA8MzI+OworCX07CisKKwlkZHIxOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNCIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKKwl9OworCisJZGRyMjogbWVtb3J5LWNvbnRyb2xsZXJAOTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjQiLCJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOworCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDIyPjsKKwl9OworCisJY3BjOiBsMy1jYWNoZS1jb250cm9sbGVyQDEwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtbDMtY2FjaGUtY29udHJvbGxlciIsICJjYWNoZSI7CisJCXJlZyA9IDwweDEwMDAwIDB4MTAwMAorCQkgICAgICAgMHgxMTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyNworCQkJICAgICAgMTYgMiAxIDI2PjsKKwl9OworCisJY29yZW5ldC1jZkAxODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtY2YiOworCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAzMT47CisJCWZzbCxjY2YtbnVtLWNzZGlkcyA9IDwzMj47CisJCWZzbCxjY2YtbnVtLXNub29waWRzID0gPDMyPjsKKwl9OworCisJaW9tbXVAMjAwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwYW11LXYxLjAiLCAiZnNsLHBhbXUiOworCQlyZWcgPSA8MHgyMDAwMCAweDUwMDA+OworCQlpbnRlcnJ1cHRzID0gPAorCQkJMjQgMiAwIDAKKwkJCTE2IDIgMSAzMD47CisJfTsKKworL2luY2x1ZGUvICJxb3JpcS1ybXUtMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1tcGljLmR0c2kiCisKKwlndXRzOiBnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtZGV2aWNlLWNvbmZpZy0xLjAiOworCQlyZWcgPSA8MHhlMDAwMCAweGUwMD47CisJCWZzbCxoYXMtcnN0Y3I7CisJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwkJZnNsLGxpb2RuLWJpdHMgPSA8MTI+OworCX07CisKKwlwaW5zOiBnbG9iYWwtdXRpbGl0aWVzQGUwZTAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcGluLWNvbnRyb2wtMS4wIjsKKwkJcmVnID0gPDB4ZTBlMDAgMHgyMDA+OworCQkjc2xlZXAtY2VsbHMgPSA8Mj47CisJfTsKKworCWNsb2NrZ2VuOiBnbG9iYWwtdXRpbGl0aWVzQGUxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtY2xvY2tnZW4iLCAiZnNsLHFvcmlxLWNsb2NrZ2VuLTEuMCI7CisJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwl9OworCisJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXJjcG0tMS4wIjsKKwkJcmVnID0gPDB4ZTIwMDAgMHgxMDAwPjsKKwkJI3NsZWVwLWNlbGxzID0gPDE+OworCX07CisKKwlzZnA6IHNmcEBlODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXNmcCIsICJmc2wscW9yaXEtc2ZwLTEuMCI7CisJCXJlZwkgICA9IDwweGU4MDAwIDB4MTAwMD47CisJfTsKKworCXNlcmRlczogc2VyZGVzQGVhMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtc2VyZGVzIjsKKwkJcmVnCSAgID0gPDB4ZWEwMDAgMHgxMDAwPjsKKwl9OworCisvaW5jbHVkZS8gInFvcmlxLWRtYS0wLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWRtYS0xLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWVzcGktMC5kdHNpIgorCXNwaUAxMTAwMDAgeworCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47CisJfTsKKworL2luY2x1ZGUvICJxb3JpcS1lc2RoYy0wLmR0c2kiCisJc2RoY0AxMTQwMDAgeworCQl2b2x0YWdlLXJhbmdlcyA9IDwzMzAwIDMzMDA+OworCQlzZGhjaSxhdXRvLWNtZDEyOworCX07CisKKy9pbmNsdWRlLyAicW9yaXEtaTJjLTAuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtaTJjLTEuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtZHVhcnQtMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1kdWFydC0xLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWdwaW8tMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS11c2IyLW1waC0wLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLXVzYjItZHItMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1zZWM0LjAtMC5kdHNpIgorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDQwODBzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDQwODBzaS1wcmUuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTU1NmVlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNDA4MHNpLXByZS5kdHNpCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogUDQwODAvUDQwNDAgU2lsaWNvbi9Tb0MgRGV2aWNlIFRyZWUgU291cmNlIChwcmUgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworL2R0cy12MS87CisvIHsKKwljb21wYXRpYmxlID0gImZzbCxQNDA4MCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisKKwlhbGlhc2VzIHsKKwkJY2NzciA9ICZzb2M7CisJCWRjc3IgPSAmZGNzcjsKKworCQlzZXJpYWwwID0gJnNlcmlhbDA7CisJCXNlcmlhbDEgPSAmc2VyaWFsMTsKKwkJc2VyaWFsMiA9ICZzZXJpYWwyOworCQlzZXJpYWwzID0gJnNlcmlhbDM7CisJCXBjaTAgPSAmcGNpMDsKKwkJcGNpMSA9ICZwY2kxOworCQlwY2kyID0gJnBjaTI7CisJCXVzYjAgPSAmdXNiMDsKKwkJdXNiMSA9ICZ1c2IxOworCQlkbWEwID0gJmRtYTA7CisJCWRtYTEgPSAmZG1hMTsKKwkJc2RoYyA9ICZzZGhjOworCQltc2kwID0gJm1zaTA7CisJCW1zaTEgPSAmbXNpMTsKKwkJbXNpMiA9ICZtc2kyOworCisJCWNyeXB0byA9ICZjcnlwdG87CisJCXNlY19qcjAgPSAmc2VjX2pyMDsKKwkJc2VjX2pyMSA9ICZzZWNfanIxOworCQlzZWNfanIyID0gJnNlY19qcjI7CisJCXNlY19qcjMgPSAmc2VjX2pyMzsKKwkJcnRpY19hID0gJnJ0aWNfYTsKKwkJcnRpY19iID0gJnJ0aWNfYjsKKwkJcnRpY19jID0gJnJ0aWNfYzsKKwkJcnRpY19kID0gJnJ0aWNfZDsKKwkJc2VjX21vbiA9ICZzZWNfbW9uOworCX07CisKKwljcHVzIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDA+OworCisJCWNwdTA6IFBvd2VyUEMsZTUwMG1jQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OworCQkJTDJfMDogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUxOiBQb3dlclBDLGU1MDBtY0AxIHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8MT47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKKwkJCUwyXzE6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1MjogUG93ZXJQQyxlNTAwbWNAMiB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDI+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47CisJCQlMMl8yOiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTM6IFBvd2VyUEMsZTUwMG1jQDMgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwzPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzM+OworCQkJTDJfMzogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHU0OiBQb3dlclBDLGU1MDBtY0A0IHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8ND47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl80PjsKKwkJCUwyXzQ6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwkJY3B1NTogUG93ZXJQQyxlNTAwbWNANSB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJcmVnID0gPDU+OworCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNT47CisJCQlMMl81OiBsMi1jYWNoZSB7CisJCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKKwkJCX07CisJCX07CisJCWNwdTY6IFBvd2VyUEMsZTUwMG1jQDYgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDw2PjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzY+OworCQkJTDJfNjogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHU3OiBQb3dlclBDLGU1MDBtY0A3IHsKKwkJCWRldmljZV90eXBlID0gImNwdSI7CisJCQlyZWcgPSA8Nz47CisJCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl83PjsKKwkJCUwyXzc6IGwyLWNhY2hlIHsKKwkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OworCQkJfTsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwMjBzaS1wb3N0LmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDIwc2ktcG9zdC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDA3NGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3A1MDIwc2ktcG9zdC5kdHNpCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogUDUwMjAvNTAxMCBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHBvc3QgaW5jbHVkZSkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmxiYyB7CisJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHgyMDAwMDAgKi8KKyZwY2kwIHsKKwljb21wYXRpYmxlID0gImZzbCxwNTAyMC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDAgMCAxICZtcGljIDQwIDEgMCAwCisJCQkwMDAwIDAgMCAyICZtcGljIDEgMSAwIDAKKwkJCTAwMDAgMCAwIDMgJm1waWMgMiAxIDAgMAorCQkJMDAwMCAwIDAgNCAmbXBpYyAzIDEgMCAwCisJCQk+OworCX07Cit9OworCisvKiBjb250cm9sbGVyIGF0IDB4MjAxMDAwICovCismcGNpMSB7CisJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKKwlkZXZpY2VfdHlwZSA9ICJwY2kiOworCSNzaXplLWNlbGxzID0gPDI+OworCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCWJ1cy1yYW5nZSA9IDwwIDB4ZmY+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OworCXBjaWVAMCB7CisJCXJlZyA9IDwwIDAgMCAwIDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCWRldmljZV90eXBlID0gInBjaSI7CisJCWludGVycnVwdHMgPSA8MTYgMiAxIDE0PjsKKwkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CisJCWludGVycnVwdC1tYXAgPSA8CisJCQkvKiBJRFNFTCAweDAgKi8KKwkJCTAwMDAgMCAwIDEgJm1waWMgNDEgMSAwIDAKKwkJCTAwMDAgMCAwIDIgJm1waWMgNSAxIDAgMAorCQkJMDAwMCAwIDAgMyAmbXBpYyA2IDEgMCAwCisJCQkwMDAwIDAgMCA0ICZtcGljIDcgMSAwIDAKKwkJCT47CisJfTsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHgyMDIwMDAgKi8KKyZwY2kyIHsKKwljb21wYXRpYmxlID0gImZzbCxwNTAyMC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMz47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDAgMCAxICZtcGljIDQyIDEgMCAwCisJCQkwMDAwIDAgMCAyICZtcGljIDkgMSAwIDAKKwkJCTAwMDAgMCAwIDMgJm1waWMgMTAgMSAwIDAKKwkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMSAwIDAKKwkJCT47CisJfTsKK307CisKKy8qIGNvbnRyb2xsZXIgYXQgMHgyMDMwMDAgKi8KKyZwY2kzIHsKKwljb21wYXRpYmxlID0gImZzbCxwNTAyMC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOworCWRldmljZV90eXBlID0gInBjaSI7CisJI3NpemUtY2VsbHMgPSA8Mj47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OworCWludGVycnVwdHMgPSA8MTYgMiAxIDEyPjsKKwlwY2llQDAgeworCQlyZWcgPSA8MCAwIDAgMCAwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMj47CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLyogSURTRUwgMHgwICovCisJCQkwMDAwIDAgMCAxICZtcGljIDQzIDEgMCAwCisJCQkwMDAwIDAgMCAyICZtcGljIDAgMSAwIDAKKwkJCTAwMDAgMCAwIDMgJm1waWMgNCAxIDAgMAorCQkJMDAwMCAwIDAgNCAmbXBpYyA4IDEgMCAwCisJCQk+OworCX07Cit9OworCismcmlvIHsKKwljb21wYXRpYmxlID0gImZzbCxzcmlvIjsKKwlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMT47CisJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJI3NpemUtY2VsbHMgPSA8Mj47CisJcmFuZ2VzOworCisJcG9ydDEgeworCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkJI3NpemUtY2VsbHMgPSA8Mj47CisJCWNlbGwtaW5kZXggPSA8MT47CisJfTsKKworCXBvcnQyIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCSNzaXplLWNlbGxzID0gPDI+OworCQljZWxsLWluZGV4ID0gPDI+OworCX07Cit9OworCismZGNzciB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY29tcGF0aWJsZSA9ICJmc2wsZGNzciIsICJzaW1wbGUtYnVzIjsKKworCWRjc3ItZXB1QDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWVwdSI7CisJCWludGVycnVwdHMgPSA8NTIgMiAwIDAKKwkJCSAgICAgIDg0IDIgMCAwCisJCQkgICAgICA4NSAyIDAgMD47CisJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwl9OworCWRjc3ItbnBjIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ucGMiOworCQlyZWcgPSA8MHgxMDAwIDB4MTAwMCAweDEwMDAwMDAgMHg4MDAwPjsKKwl9OworCWRjc3ItbnhjQDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW54YyI7CisJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItY29yZW5ldCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItY29yZW5ldCI7CisJCXJlZyA9IDwweDgwMDAgMHgxMDAwIDB4QjAwMDAgMHgxMDAwPjsKKwl9OworCWRjc3ItZHBhYUA5MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZGNzci1kcGFhIiwgImZzbCxkY3NyLWRwYWEiOworCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLW9jbkAxMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRjc3Itb2NuIiwgImZzbCxkY3NyLW9jbiI7CisJCXJlZyA9IDwweDExMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWRkckAxMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKKwkJZGV2LWhhbmRsZSA9IDwmZGRyMT47CisJCXJlZyA9IDwweDEyMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWRkckAxMzAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKKwkJZGV2LWhhbmRsZSA9IDwmZGRyMj47CisJCXJlZyA9IDwweDEzMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLW5hbEAxODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRjc3ItbmFsIiwgImZzbCxkY3NyLW5hbCI7CisJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLXJjcG1AMjIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kY3NyLXJjcG0iLCAiZnNsLGRjc3ItcmNwbSI7CisJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWNwdS1zYi1wcm94eUA0MDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTU1MDAtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJY3B1LWhhbmRsZSA9IDwmY3B1MD47CisJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47CisJfTsKKwlkY3NyLWNwdS1zYi1wcm94eUA0MTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTU1MDAtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKKwkJY3B1LWhhbmRsZSA9IDwmY3B1MT47CisJCXJlZyA9IDwweDQxMDAwIDB4MTAwMD47CisJfTsKK307CisKKyZzb2MgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWRldmljZV90eXBlID0gInNvYyI7CisJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKKworCXNvYy1zcmFtLWVycm9yIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc29jLXNyYW0tZXJyb3IiOworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyOT47CisJfTsKKworCWNvcmVuZXQtbGF3QDAgeworCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWxhdyI7CisJCXJlZyA9IDwweDAgMHgxMDAwPjsKKwkJZnNsLG51bS1sYXdzID0gPDMyPjsKKwl9OworCisJZGRyMTogbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjUiLCAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4ODAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMz47CisJfTsKKworCWRkcjI6IG1lbW9yeS1jb250cm9sbGVyQDkwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC41IiwiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKKwkJcmVnID0gPDB4OTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMj47CisJfTsKKworCWNwYzogbDMtY2FjaGUtY29udHJvbGxlckAxMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiZnNsLHA0MDgwLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiY2FjaGUiOworCQlyZWcgPSA8MHgxMDAwMCAweDEwMDAKKwkJICAgICAgIDB4MTEwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjcKKwkJCSAgICAgIDE2IDIgMSAyNj47CisJfTsKKworCWNvcmVuZXQtY2ZAMTgwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWNmIjsKKwkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMzE+OworCQlmc2wsY2NmLW51bS1jc2RpZHMgPSA8MzI+OworCQlmc2wsY2NmLW51bS1zbm9vcGlkcyA9IDwzMj47CisJfTsKKworCWlvbW11QDIwMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscGFtdS12MS4wIiwgImZzbCxwYW11IjsKKwkJcmVnID0gPDB4MjAwMDAgMHg0MDAwPjsKKwkJaW50ZXJydXB0cyA9IDwKKwkJCTI0IDIgMCAwCisJCQkxNiAyIDEgMzA+OworCX07CisKKy9pbmNsdWRlLyAicW9yaXEtbXBpYy5kdHNpIgorCisJZ3V0czogZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWRldmljZS1jb25maWctMS4wIjsKKwkJcmVnID0gPDB4ZTAwMDAgMHhlMDA+OworCQlmc2wsaGFzLXJzdGNyOworCQkjc2xlZXAtY2VsbHMgPSA8MT47CisJCWZzbCxsaW9kbi1iaXRzID0gPDEyPjsKKwl9OworCisJcGluczogZ2xvYmFsLXV0aWxpdGllc0BlMGUwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLXBpbi1jb250cm9sLTEuMCI7CisJCXJlZyA9IDwweGUwZTAwIDB4MjAwPjsKKwkJI3NsZWVwLWNlbGxzID0gPDI+OworCX07CisKKwljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWNsb2NrZ2VuIiwgImZzbCxxb3JpcS1jbG9ja2dlbi0xLjAiOworCQlyZWcgPSA8MHhlMTAwMCAweDEwMDA+OworCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJfTsKKworCXJjcG06IGdsb2JhbC11dGlsaXRpZXNAZTIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1yY3BtLTEuMCI7CisJCXJlZyA9IDwweGUyMDAwIDB4MTAwMD47CisJCSNzbGVlcC1jZWxscyA9IDwxPjsKKwl9OworCisJc2ZwOiBzZnBAZTgwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1zZnAiLCAiZnNsLHFvcmlxLXNmcC0xLjAiOworCQlyZWcJICAgPSA8MHhlODAwMCAweDEwMDA+OworCX07CisKKwlzZXJkZXM6IHNlcmRlc0BlYTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLXNlcmRlcyI7CisJCXJlZwkgICA9IDwweGVhMDAwIDB4MTAwMD47CisJfTsKKworL2luY2x1ZGUvICJxb3JpcS1kbWEtMC5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1kbWEtMS5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1lc3BpLTAuZHRzaSIKKwlzcGlAMTEwMDAwIHsKKwkJZnNsLGVzcGktbnVtLWNoaXBzZWxlY3RzID0gPDQ+OworCX07CisKKy9pbmNsdWRlLyAicW9yaXEtZXNkaGMtMC5kdHNpIgorCXNkaGNAMTE0MDAwIHsKKwkJc2RoY2ksYXV0by1jbWQxMjsKKwl9OworCisvaW5jbHVkZS8gInFvcmlxLWkyYy0wLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWkyYy0xLmR0c2kiCisvaW5jbHVkZS8gInFvcmlxLWR1YXJ0LTAuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtZHVhcnQtMS5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1ncGlvLTAuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtdXNiMi1tcGgtMC5kdHNpIgorCQl1c2IwOiB1c2JAMjEwMDAwIHsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQkJcG9ydDA7CisJCX07CisKKy9pbmNsdWRlLyAicW9yaXEtdXNiMi1kci0wLmR0c2kiCisJCXVzYjE6IHVzYkAyMTEwMDAgeworCQkJZHJfbW9kZSA9ICJob3N0IjsKKwkJCXBoeV90eXBlID0gInV0bWkiOworCQl9OworCisvaW5jbHVkZS8gInFvcmlxLXNhdGEyLTAuZHRzaSIKKy9pbmNsdWRlLyAicW9yaXEtc2F0YTItMS5kdHNpIgorL2luY2x1ZGUvICJxb3JpcS1zZWM0LjItMC5kdHNpIgorfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwMjBzaS1wcmUuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcDUwMjBzaS1wcmUuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTgyM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wNTAyMHNpLXByZS5kdHNpCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBQNTAyMC9QNTAxMCBTaWxpY29uL1NvQyBEZXZpY2UgVHJlZSBTb3VyY2UgKHByZSBpbmNsdWRlKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvZHRzLXYxLzsKKy8geworCWNvbXBhdGlibGUgPSAiZnNsLFA1MDIwIjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKworCWFsaWFzZXMgeworCQljY3NyID0gJnNvYzsKKwkJZGNzciA9ICZkY3NyOworCisJCXNlcmlhbDAgPSAmc2VyaWFsMDsKKwkJc2VyaWFsMSA9ICZzZXJpYWwxOworCQlzZXJpYWwyID0gJnNlcmlhbDI7CisJCXNlcmlhbDMgPSAmc2VyaWFsMzsKKwkJcGNpMCA9ICZwY2kwOworCQlwY2kxID0gJnBjaTE7CisJCXBjaTIgPSAmcGNpMjsKKwkJcGNpMyA9ICZwY2kzOworCQl1c2IwID0gJnVzYjA7CisJCXVzYjEgPSAmdXNiMTsKKwkJZG1hMCA9ICZkbWEwOworCQlkbWExID0gJmRtYTE7CisJCXNkaGMgPSAmc2RoYzsKKwkJbXNpMCA9ICZtc2kwOworCQltc2kxID0gJm1zaTE7CisJCW1zaTIgPSAmbXNpMjsKKworCQljcnlwdG8gPSAmY3J5cHRvOworCQlzZWNfanIwID0gJnNlY19qcjA7CisJCXNlY19qcjEgPSAmc2VjX2pyMTsKKwkJc2VjX2pyMiA9ICZzZWNfanIyOworCQlzZWNfanIzID0gJnNlY19qcjM7CisJCXJ0aWNfYSA9ICZydGljX2E7CisJCXJ0aWNfYiA9ICZydGljX2I7CisJCXJ0aWNfYyA9ICZydGljX2M7CisJCXJ0aWNfZCA9ICZydGljX2Q7CisJCXNlY19tb24gPSAmc2VjX21vbjsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHUwOiBQb3dlclBDLGU1NTAwQDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwwPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OworCQkJTDJfMDogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCQljcHUxOiBQb3dlclBDLGU1NTAwQDEgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCXJlZyA9IDwxPjsKKwkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OworCQkJTDJfMTogbDItY2FjaGUgeworCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47CisJCQl9OworCQl9OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZG1hLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWRtYS0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViMzdhZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWRtYS0wLmR0c2kKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIFBRMyBETUEgZGV2aWNlIHRyZWUgc3R1YiBbIGNvbnRyb2xsZXIgQCBvZmZzZXQgMHgyMTAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2RtYUAyMTMwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEiOworCXJlZyA9IDwweDIxMzAwIDB4ND47CisJcmFuZ2VzID0gPDB4MCAweDIxMTAwIDB4MjAwPjsKKwljZWxsLWluZGV4ID0gPDA+OworCWRtYS1jaGFubmVsQDAgeworCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJcmVnID0gPDB4MCAweDgwPjsKKwkJY2VsbC1pbmRleCA9IDwwPjsKKwkJaW50ZXJydXB0cyA9IDwyMCAyIDAgMD47CisJfTsKKwlkbWEtY2hhbm5lbEA4MCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJY2VsbC1pbmRleCA9IDwxPjsKKwkJaW50ZXJydXB0cyA9IDwyMSAyIDAgMD47CisJfTsKKwlkbWEtY2hhbm5lbEAxMDAgeworCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJcmVnID0gPDB4MTAwIDB4ODA+OworCQljZWxsLWluZGV4ID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPDIyIDIgMCAwPjsKKwl9OworCWRtYS1jaGFubmVsQDE4MCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCWNlbGwtaW5kZXggPSA8Mz47CisJCWludGVycnVwdHMgPSA8MjMgMiAwIDA+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZG1hLTEuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWRtYS0xLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhjYjhhNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWRtYS0xLmR0c2kKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIFBRMyBETUEgZGV2aWNlIHRyZWUgc3R1YiBbIGNvbnRyb2xsZXIgQCBvZmZzZXQgMHhjMzAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworZG1hQGMzMDAgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hIjsKKwlyZWcgPSA8MHhjMzAwIDB4ND47CisJcmFuZ2VzID0gPDB4MCAweGMxMDAgMHgyMDA+OworCWNlbGwtaW5kZXggPSA8MT47CisJZG1hLWNoYW5uZWxAMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQlyZWcgPSA8MHgwIDB4ODA+OworCQljZWxsLWluZGV4ID0gPDA+OworCQlpbnRlcnJ1cHRzID0gPDc2IDIgMCAwPjsKKwl9OworCWRtYS1jaGFubmVsQDgwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCXJlZyA9IDwweDgwIDB4ODA+OworCQljZWxsLWluZGV4ID0gPDE+OworCQlpbnRlcnJ1cHRzID0gPDc3IDIgMCAwPjsKKwl9OworCWRtYS1jaGFubmVsQDEwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQlyZWcgPSA8MHgxMDAgMHg4MD47CisJCWNlbGwtaW5kZXggPSA8Mj47CisJCWludGVycnVwdHMgPSA8NzggMiAwIDA+OworCX07CisJZG1hLWNoYW5uZWxAMTgwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7CisJCXJlZyA9IDwweDE4MCAweDgwPjsKKwkJY2VsbC1pbmRleCA9IDwzPjsKKwkJaW50ZXJydXB0cyA9IDw3OSAyIDAgMD47CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1kdWFydC0wLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1kdWFydC0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyNjhmZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWR1YXJ0LTAuZHRzaQpAQCAtMCwwICsxLDUxIEBACisvKgorICogUFEzIERVQVJUIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4NDAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3NlcmlhbDA6IHNlcmlhbEA0NTAwIHsKKwljZWxsLWluZGV4ID0gPDA+OworCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKKwlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJaW50ZXJydXB0cyA9IDw0MiAyIDAgMD47Cit9OworCitzZXJpYWwxOiBzZXJpYWxANDYwMCB7CisJY2VsbC1pbmRleCA9IDwxPjsKKwlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CisJcmVnID0gPDB4NDYwMCAweDEwMD47CisJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCWludGVycnVwdHMgPSA8NDIgMiAwIDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWVzZGhjLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWVzZGhjLTAuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQzNDMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXNkaGMtMC5kdHNpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBQUTMgZVNESEMgZGV2aWNlIHRyZWUgc3R1YiBbIGNvbnRyb2xsZXIgQCBvZmZzZXQgMHgyZTAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3NkaGNAMmUwMDAgeworCWNvbXBhdGlibGUgPSAiZnNsLGVzZGhjIjsKKwlyZWcgPSA8MHgyZTAwMCAweDEwMDA+OworCWludGVycnVwdHMgPSA8NzIgMHgyIDAgMD47CisJLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLworCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1lc3BpLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWVzcGktMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODU0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1lc3BpLTAuZHRzaQpAQCAtMCwwICsxLDQxIEBACisvKgorICogUFEzIGVTUEkgZGV2aWNlIHRyZWUgc3R1YiBbIGNvbnRyb2xsZXIgQCBvZmZzZXQgMHg3MDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworc3BpQDcwMDAgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZXNwaSI7CisJcmVnID0gPDB4NzAwMCAweDEwMDA+OworCWludGVycnVwdHMgPSA8NTkgMHgyIDAgMD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMxLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMS0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5NzlhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMS0wLmR0c2kKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIFBRMyBlVFNFQyBkZXZpY2UgdHJlZSBzdHViIFsgQCBvZmZzZXRzIDB4MjQwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitldGhlcm5ldEAyNDAwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY2VsbC1pbmRleCA9IDwwPjsKKwlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwltb2RlbCA9ICJlVFNFQyI7CisJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKKwlyZWcgPSA8MHgyNDAwMCAweDEwMDA+OworCXJhbmdlcyA9IDwweDAgMHgyNDAwMCAweDEwMDA+OworCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCWludGVycnVwdHMgPSA8MjkgMiAwIDAgMzAgMiAwIDAgMzQgMiAwIDA+OworfTsKKworbWRpb0AyNDUyMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci1tZGlvIjsKKwlyZWcgPSA8MHgyNDUyMCAweDIwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1ldHNlYzEtMS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMxLTEuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzRmZGRlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMxLTEuZHRzaQpAQCAtMCwwICsxLDUzIEBACisvKgorICogUFEzIGVUU0VDIGRldmljZSB0cmVlIHN0dWIgWyBAIG9mZnNldHMgMHgyNTAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2V0aGVybmV0QDI1MDAwIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwljZWxsLWluZGV4ID0gPDE+OworCWRldmljZV90eXBlID0gIm5ldHdvcmsiOworCW1vZGVsID0gImVUU0VDIjsKKwljb21wYXRpYmxlID0gImdpYW5mYXIiOworCXJlZyA9IDwweDI1MDAwIDB4MTAwMD47CisJcmFuZ2VzID0gPDB4MCAweDI1MDAwIDB4MTAwMD47CisJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJaW50ZXJydXB0cyA9IDwzNSAyIDAgMCAzNiAyIDAgMCA0MCAyIDAgMD47Cit9OworCittZGlvQDI1NTIwIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKKwljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7CisJcmVnID0gPDB4MjU1MjAgMHgyMD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMxLTIuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMS0yLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI4YWI0MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMS0yLmR0c2kKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIFBRMyBlVFNFQyBkZXZpY2UgdHJlZSBzdHViIFsgQCBvZmZzZXRzIDB4MjYwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitldGhlcm5ldEAyNjAwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY2VsbC1pbmRleCA9IDwyPjsKKwlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwltb2RlbCA9ICJlVFNFQyI7CisJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKKwlyZWcgPSA8MHgyNjAwMCAweDEwMDA+OworCXJhbmdlcyA9IDwweDAgMHgyNjAwMCAweDEwMDA+OworCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCWludGVycnVwdHMgPSA8MzEgMiAwIDAgMzIgMiAwIDAgMzMgMiAwIDA+OworfTsKKworbWRpb0AyNjUyMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci10YmkiOworCXJlZyA9IDwweDI2NTIwIDB4MjA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMS0zLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1ldHNlYzEtMy5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYzkxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1ldHNlYzEtMy5kdHNpCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBQUTMgZVRTRUMgZGV2aWNlIHRyZWUgc3R1YiBbIEAgb2Zmc2V0cyAweDI3MDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworZXRoZXJuZXRAMjcwMDAgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNlbGwtaW5kZXggPSA8Mz47CisJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJbW9kZWwgPSAiZVRTRUMiOworCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7CisJcmVnID0gPDB4MjcwMDAgMHgxMDAwPjsKKwlyYW5nZXMgPSA8MHgwIDB4MjcwMDAgMHgxMDAwPjsKKwlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKwlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwIDM4IDIgMCAwIDM5IDIgMCAwPjsKK307CisKK21kaW9AMjc1MjAgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItdGJpIjsKKwlyZWcgPSA8MHgyNzUyMCAweDIwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1ldHNlYzEtdGltZXItMC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMxLXRpbWVyLTAuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmUyY2EwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMxLXRpbWVyLTAuZHRzaQpAQCAtMCwwICsxLDM5IEBACisvKgorICogUFEzIGVUU0VDIFRpbWVyIChJRUVFIDE1ODgpIGRldmljZSB0cmVlIHN0dWIgWyBAIG9mZnNldHMgMHgyNGUwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3B0cF9jbG9ja0AyNGUwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMtcHRwIjsKKwlyZWcgPSA8MHgyNGUwMCAweGIwPjsKKwlpbnRlcnJ1cHRzID0gPDY4IDIgMCAwIDY5IDIgMCAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1ldHNlYzItMC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMyLTAuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzgyZmVjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMyLTAuZHRzaQpAQCAtMCwwICsxLDYwIEBACisvKgorICogUFEzIGVUU0VDMiBkZXZpY2UgdHJlZSBzdHViIFsgQCBvZmZzZXRzIDB4MjQwMDAvMHhiMDAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworbWRpb0AyNDAwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyLW1kaW8iOworCXJlZyA9IDwweDI0MDAwIDB4MTAwMCAweGIwMDMwIDB4ND47Cit9OworCitldGhlcm5ldEBiMDAwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJbW9kZWwgPSAiZVRTRUMiOworCWNvbXBhdGlibGUgPSAiZnNsLGV0c2VjMiI7CisJZnNsLG51bV9yeF9xdWV1ZXMgPSA8MHg4PjsKKwlmc2wsbnVtX3R4X3F1ZXVlcyA9IDwweDg+OworCWZzbCxtYWdpYy1wYWNrZXQ7CisJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisKKwlxdWV1ZS1ncm91cEBiMDAwMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4YjAwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDwyOSAyIDAgMCAzMCAyIDAgMCAzNCAyIDAgMD47CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1ldHNlYzItMS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMyLTEuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFjZDJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMyLTEuZHRzaQpAQCAtMCwwICsxLDYwIEBACisvKgorICogUFEzIGVUU0VDMiBkZXZpY2UgdHJlZSBzdHViIFsgQCBvZmZzZXRzIDB4MjUwMDAvMHhiMTAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKworbWRpb0AyNTAwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyLXRiaSI7CisJcmVnID0gPDB4MjUwMDAgMHgxMDAwIDB4YjEwMzAgMHg0PjsKK307CisKK2V0aGVybmV0QGIxMDAwIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwltb2RlbCA9ICJlVFNFQyI7CisJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyIjsKKwlmc2wsbnVtX3J4X3F1ZXVlcyA9IDwweDg+OworCWZzbCxudW1fdHhfcXVldWVzID0gPDB4OD47CisJZnNsLG1hZ2ljLXBhY2tldDsKKwlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKworCXF1ZXVlLWdyb3VwQGIxMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHhiMTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDM1IDIgMCAwIDM2IDIgMCAwIDQwIDIgMCAwPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMi0yLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1ldHNlYzItMi5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDU2YzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1ldHNlYzItMi5kdHNpCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBQUTMgZVRTRUMyIGRldmljZSB0cmVlIHN0dWIgWyBAIG9mZnNldHMgMHgyNjAwMC8weGIyMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworbWRpb0AyNjAwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyLXRiaSI7CisJcmVnID0gPDB4MjYwMDAgMHgxMDAwIDB4YjEwMzAgMHg0PjsKK307CisKK2V0aGVybmV0QGIyMDAwIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwxPjsKKwlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwltb2RlbCA9ICJlVFNFQyI7CisJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyIjsKKwlmc2wsbnVtX3J4X3F1ZXVlcyA9IDwweDg+OworCWZzbCxudW1fdHhfcXVldWVzID0gPDB4OD47CisJZnNsLG1hZ2ljLXBhY2tldDsKKwlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKKworCXF1ZXVlLWdyb3VwQGIyMDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHhiMjAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDMxIDIgMCAwIDMyIDIgMCAwIDMzIDIgMCAwPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMi1ncnAyLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMi1ncnAyLTAuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzRhYjhmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMyLWdycDItMC5kdHNpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBQUTMgZVRTRUMyIEdyb3VwIDIgZGV2aWNlIHRyZWUgc3R1YiBbIEAgb2Zmc2V0cyAweGI0MDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmVuZXQwX2dycDIgeworCXF1ZXVlLWdyb3VwQGI0MDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHhiNDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDE3IDIgMCAwIDE4IDIgMCAwIDI0IDIgMCAwPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMi1ncnAyLTEuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMi1ncnAyLTEuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmU5YmEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMyLWdycDItMS5kdHNpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBQUTMgZVRTRUMyIEdyb3VwIDIgZGV2aWNlIHRyZWUgc3R1YiBbIEAgb2Zmc2V0cyAweGI1MDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmVuZXQxX2dycDIgeworCXF1ZXVlLWdyb3VwQGI1MDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHhiNTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDUxIDIgMCAwIDUyIDIgMCAwIDY3IDIgMCAwPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMi1ncnAyLTIuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWV0c2VjMi1ncnAyLTIuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmEzMzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZXRzZWMyLWdycDItMi5kdHNpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBQUTMgZVRTRUMyIEdyb3VwIDIgZGV2aWNlIHRyZWUgc3R1YiBbIEAgb2Zmc2V0cyAweGI2MDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmVuZXQyX2dycDIgeworCXF1ZXVlLWdyb3VwQGI2MDAwIHsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCSNzaXplLWNlbGxzID0gPDE+OworCQlyZWcgPSA8MHhiNjAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwIDI2IDIgMCAwIDI3IDIgMCAwPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWdwaW8tMC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtZ3Bpby0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJhM2VmNQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWdwaW8tMC5kdHNpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBQUTMgR1BJTyBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweGYwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitncGlvLWNvbnRyb2xsZXJAZjAwMCB7CisJI2dwaW8tY2VsbHMgPSA8Mj47CisJY29tcGF0aWJsZSA9ICJmc2wscHEzLWdwaW8iOworCXJlZyA9IDwweGYwMDAgMHgxMDA+OworCWludGVycnVwdHMgPSA8NDcgMHgyIDAgMD47CisJZ3Bpby1jb250cm9sbGVyOworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWkyYy0wLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1pMmMtMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZGQ2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1pMmMtMC5kdHNpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBQUTMgSTJDIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4MzAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2kyY0AzMDAwIHsKKwkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkjc2l6ZS1jZWxscyA9IDwwPjsKKwljZWxsLWluZGV4ID0gPDA+OworCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7CisJcmVnID0gPDB4MzAwMCAweDEwMD47CisJaW50ZXJydXB0cyA9IDw0MyAyIDAgMD47CisJZGZzcnI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtaTJjLTEuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWkyYy0xLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliZDgwMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLWkyYy0xLmR0c2kKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIFBRMyBJMkMgZGV2aWNlIHRyZWUgc3R1YiBbIGNvbnRyb2xsZXIgQCBvZmZzZXQgMHgzMTAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworaTJjQDMxMDAgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworCWNlbGwtaW5kZXggPSA8MT47CisJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwlyZWcgPSA8MHgzMTAwIDB4MTAwPjsKKwlpbnRlcnJ1cHRzID0gPDQzIDIgMCAwPjsKKwlkZnNycjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1tcGljLXRpbWVyLUIuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLW1waWMtdGltZXItQi5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MzRjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1tcGljLXRpbWVyLUIuZHRzaQpAQCAtMCwwICsxLDQyIEBACisvKgorICogUFEzIE1QSUMgVGltZXIgKEdyb3VwIEIpIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4NDIxMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit0aW1lckA0MjEwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1nbG9iYWwtdGltZXIiOworCXJlZyA9IDwweDQyMTAwIDB4MTAwIDB4NDIzMDAgND47CisJaW50ZXJydXB0cyA9IDw0IDAgMyAwCisJCSAgICAgIDUgMCAzIDAKKwkJICAgICAgNiAwIDMgMAorCQkgICAgICA3IDAgMyAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1tcGljLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1tcGljLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4MDQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLW1waWMuZHRzaQpAQCAtMCwwICsxLDY2IEBACisvKgorICogUFEzIE1QSUMgZGV2aWNlIHRyZWUgc3R1YiBbIGNvbnRyb2xsZXIgQCBvZmZzZXQgMHg0MDAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK21waWM6IHBpY0A0MDAwMCB7CisJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJI2ludGVycnVwdC1jZWxscyA9IDw0PjsKKwlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKKwljb21wYXRpYmxlID0gImZzbCxtcGljIjsKKwlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7Cit9OworCit0aW1lckA0MTEwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1nbG9iYWwtdGltZXIiOworCXJlZyA9IDwweDQxMTAwIDB4MTAwIDB4NDEzMDAgND47CisJaW50ZXJydXB0cyA9IDwwIDAgMyAwCisJCSAgICAgIDEgMCAzIDAKKwkJICAgICAgMiAwIDMgMAorCQkgICAgICAzIDAgMyAwPjsKK307CisKK21zaUA0MTYwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCXJlZyA9IDwweDQxNjAwIDB4ODA+OworCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OworCWludGVycnVwdHMgPSA8CisJCTB4ZTAgMCAwIDAKKwkJMHhlMSAwIDAgMAorCQkweGUyIDAgMCAwCisJCTB4ZTMgMCAwIDAKKwkJMHhlNCAwIDAgMAorCQkweGU1IDAgMCAwCisJCTB4ZTYgMCAwIDAKKwkJMHhlNyAwIDAgMD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtcm11LTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXJtdS0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3Y2E5ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXJtdS0wLmR0c2kKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIFBRMyBSSU8gTWVzc2FnZSBVbml0IGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4ZDMwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitybXU6IHJtdUBkMzAwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1ybXUiOworCXJlZyA9IDwweGQzMDAwIDB4NTAwPjsKKwlyYW5nZXMgPSA8MHgwIDB4ZDMwMDAgMHg1MDA+OworCisJbWVzc2FnZS11bml0QDAgeworCQljb21wYXRpYmxlID0gImZzbCxzcmlvLW1zZy11bml0IjsKKwkJcmVnID0gPDB4MCAweDEwMD47CisJCWludGVycnVwdHMgPSA8CisJCQk1MyAyIDAgMCAvKiBtc2cxX3R4X2lycSAqLworCQkJNTQgMiAwIDA+Oy8qIG1zZzFfcnhfaXJxICovCisJfTsKKwltZXNzYWdlLXVuaXRAMTAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1tc2ctdW5pdCI7CisJCXJlZyA9IDwweDEwMCAweDEwMD47CisJCWludGVycnVwdHMgPSA8CisJCQk1NSAyIDAgMCAgLyogbXNnMl90eF9pcnEgKi8KKwkJCTU2IDIgMCAwPjsvKiBtc2cyX3J4X2lycSAqLworCX07CisJZG9vcmJlbGwtdW5pdEA0MDAgeworCQljb21wYXRpYmxlID0gImZzbCxzcmlvLWRiZWxsLXVuaXQiOworCQlyZWcgPSA8MHg0MDAgMHg4MD47CisJCWludGVycnVwdHMgPSA8CisJCQk0OSAyIDAgMCAgLyogYmVsbF9vdXRiX2lycSAqLworCQkJNTAgMiAwIDA+Oy8qIGJlbGxfaW5iX2lycSAqLworCX07CisJcG9ydC13cml0ZS11bml0QDRlMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8tcG9ydC13cml0ZS11bml0IjsKKwkJcmVnID0gPDB4NGUwIDB4MjA+OworCQlpbnRlcnJ1cHRzID0gPDQ4IDIgMCAwPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNhdGEyLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNhdGEyLTAuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzI4ZGQwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtc2F0YTItMC5kdHNpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBQUTMgU0FUQXYyIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4MTgwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitzYXRhQDE4MDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxwcS1zYXRhLXYyIjsKKwlyZWcgPSA8MHgxODAwMCAweDEwMDA+OworCWNlbGwtaW5kZXggPSA8MT47CisJaW50ZXJydXB0cyA9IDw3NCAweDIgMCAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1zYXRhMi0xLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1zYXRhMi0xLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmYWYyOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNhdGEyLTEuZHRzaQpAQCAtMCwwICsxLDQwIEBACisvKgorICogUFEzIFNBVEF2MiBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDE5MDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworc2F0YUAxOTAwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wscHEtc2F0YS12MiI7CisJcmVnID0gPDB4MTkwMDAgMHgxMDAwPjsKKwljZWxsLWluZGV4ID0gPDI+OworCWludGVycnVwdHMgPSA8NDEgMHgyIDAgMD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtc2VjMi4xLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNlYzIuMS0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhNWM3YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNlYzIuMS0wLmR0c2kKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIFBRMyBTZWMvQ3J5cHRvIDIuMSBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDMwMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworY3J5cHRvQDMwMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxzZWMyLjEiLCAiZnNsLHNlYzIuMCI7CisJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47CisJaW50ZXJydXB0cyA9IDw0NSAyIDAgMD47CisJZnNsLG51bS1jaGFubmVscyA9IDw0PjsKKwlmc2wsY2hhbm5lbC1maWZvLWxlbiA9IDwyND47CisJZnNsLGV4ZWMtdW5pdHMtbWFzayA9IDwweGZlPjsKKwlmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrID0gPDB4MTJiMGViZj47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtc2VjMy4wLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNlYzMuMC0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhMWJhNAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNlYzMuMC0wLmR0c2kKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIFBRMyBTZWMvQ3J5cHRvIDMuMCBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDMwMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworY3J5cHRvQDMwMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxzZWMzLjAiLAorCQkgICAgICJmc2wsc2VjMi40IiwgImZzbCxzZWMyLjIiLCAiZnNsLHNlYzIuMSIsCisJCSAgICAgImZzbCxzZWMyLjAiOworCXJlZyA9IDwweDMwMDAwIDB4MTAwMDA+OworCWludGVycnVwdHMgPSA8NDUgMiAwIDAgNTggMiAwIDA+OworCWZzbCxudW0tY2hhbm5lbHMgPSA8ND47CisJZnNsLGNoYW5uZWwtZmlmby1sZW4gPSA8MjQ+OworCWZzbCxleGVjLXVuaXRzLW1hc2sgPSA8MHg5ZmU+OworCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgzYWIwZWJmPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy1zZWMzLjEtMC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtc2VjMy4xLTAuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjBhNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtc2VjMy4xLTAuZHRzaQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogUFEzIFNlYy9DcnlwdG8gMy4xIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4MzAwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitjcnlwdG9AMzAwMDAgeworCWNvbXBhdGlibGUgPSAiZnNsLHNlYzMuMSIsICJmc2wsc2VjMy4wIiwKKwkJICAgICAiZnNsLHNlYzIuNCIsICJmc2wsc2VjMi4yIiwgImZzbCxzZWMyLjEiLAorCQkgICAgICJmc2wsc2VjMi4wIjsKKwlyZWcgPSA8MHgzMDAwMCAweDEwMDAwPjsKKwlpbnRlcnJ1cHRzID0gPDQ1IDIgMCAwIDU4IDIgMCAwPjsKKwlmc2wsbnVtLWNoYW5uZWxzID0gPDQ+OworCWZzbCxjaGFubmVsLWZpZm8tbGVuID0gPDI0PjsKKwlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4YmZlPjsKKwlmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrID0gPDB4M2FiMGViZj47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtc2VjMy4zLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNlYzMuMy0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyN2YyNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNlYzMuMy0wLmR0c2kKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIFBRMyBTZWMvQ3J5cHRvIDMuMyBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDMwMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworY3J5cHRvQDMwMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxzZWMzLjMiLCAiZnNsLHNlYzMuMSIsICJmc2wsc2VjMy4wIiwKKwkJICAgICAiZnNsLHNlYzIuNCIsICJmc2wsc2VjMi4yIiwgImZzbCxzZWMyLjEiLAorCQkgICAgICJmc2wsc2VjMi4wIjsKKwlyZWcgPSA8MHgzMDAwMCAweDEwMDAwPjsKKwlpbnRlcnJ1cHRzID0gPDQ1IDIgMCAwIDU4IDIgMCAwPjsKKwlmc2wsbnVtLWNoYW5uZWxzID0gPDQ+OworCWZzbCxjaGFubmVsLWZpZm8tbGVuID0gPDI0PjsKKwlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4OTdjPjsKKwlmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrID0gPDB4M2EzMGFiZj47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtc2VjNC40LTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNlYzQuNC0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY5NTdhNwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXNlYzQuNC0wLmR0c2kKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIFBRMyBTZWMvQ3J5cHRvIDQuNCBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDMwMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworY3J5cHRvQDMwMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxzZWM0LjQiLCAiZnNsLHNlYzQuMCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJcmVnCQkgPSA8MHgzMDAwMCAweDEwMDAwPjsKKwlpbnRlcnJ1cHRzCSA9IDw1OCAyIDAgMD47CisKKwlzZWNfanIwOiBqckAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc2VjNC40LWpvYi1yaW5nIiwgImZzbCxzZWM0LjAtam9iLXJpbmciOworCQlyZWcJICAgPSA8MHgxMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMJID0gPDQ1IDIgMCAwPjsKKwl9OworCisJc2VjX2pyMToganJAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYzQuNC1qb2ItcmluZyIsICJmc2wsc2VjNC4wLWpvYi1yaW5nIjsKKwkJcmVnCSAgID0gPDB4MjAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzCSA9IDw0NSAyIDAgMD47CisJfTsKKworCXNlY19qcjI6IGpyQDMwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxzZWM0LjQtam9iLXJpbmciLCAiZnNsLHNlYzQuMC1qb2ItcmluZyI7CisJCXJlZwkgICA9IDwweDMwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cwkgPSA8NDUgMiAwIDA+OworCX07CisKKwlzZWNfanIzOiBqckA0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc2VjNC40LWpvYi1yaW5nIiwgImZzbCxzZWM0LjAtam9iLXJpbmciOworCQlyZWcJICAgPSA8MHg0MDAwIDB4MTAwMD47CisJCWludGVycnVwdHMJID0gPDQ1IDIgMCAwPjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXVzYjItZHItMC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9wcTMtdXNiMi1kci0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg1YWI5ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXVzYjItZHItMC5kdHNpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBQUTMgVVNCIERSIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4MjIwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit1c2JAMjIwMDAgeworCWNvbXBhdGlibGUgPSAiZnNsLXVzYjItZHIiOworCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJaW50ZXJydXB0cyA9IDwyOCAweDIgMCAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy11c2IyLWRyLTEuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcHEzLXVzYjItZHItMS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMjRjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3BxMy11c2IyLWRyLTEuZHRzaQpAQCAtMCwwICsxLDQxIEBACisvKgorICogUFEzIFVTQiBEUiBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDIzMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwordXNiQDIzMDAwIHsKKwljb21wYXRpYmxlID0gImZzbC11c2IyLWRyIjsKKwlyZWcgPSA8MHgyMzAwMCAweDEwMDA+OworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworCWludGVycnVwdHMgPSA8NDYgMHgyIDAgMD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1kbWEtMC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1kbWEtMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZWJmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWRtYS0wLmR0c2kKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIFFvcklRIERNQSBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDEwMDAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2RtYTA6IGRtYUAxMDAzMDAgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hIjsKKwlyZWcgPSA8MHgxMDAzMDAgMHg0PjsKKwlyYW5nZXMgPSA8MHgwIDB4MTAwMTAwIDB4MjAwPjsKKwljZWxsLWluZGV4ID0gPDA+OworCWRtYS1jaGFubmVsQDAgeworCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJcmVnID0gPDB4MCAweDgwPjsKKwkJY2VsbC1pbmRleCA9IDwwPjsKKwkJaW50ZXJydXB0cyA9IDwyOCAyIDAgMD47CisJfTsKKwlkbWEtY2hhbm5lbEA4MCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJY2VsbC1pbmRleCA9IDwxPjsKKwkJaW50ZXJydXB0cyA9IDwyOSAyIDAgMD47CisJfTsKKwlkbWEtY2hhbm5lbEAxMDAgeworCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJcmVnID0gPDB4MTAwIDB4ODA+OworCQljZWxsLWluZGV4ID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPDMwIDIgMCAwPjsKKwl9OworCWRtYS1jaGFubmVsQDE4MCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCWNlbGwtaW5kZXggPSA8Mz47CisJCWludGVycnVwdHMgPSA8MzEgMiAwIDA+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1kbWEtMS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1kbWEtMS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZjVlMTgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWRtYS0xLmR0c2kKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIFFvcklRIERNQSBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDEwMTAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2RtYTE6IGRtYUAxMDEzMDAgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hIjsKKwlyZWcgPSA8MHgxMDEzMDAgMHg0PjsKKwlyYW5nZXMgPSA8MHgwIDB4MTAxMTAwIDB4MjAwPjsKKwljZWxsLWluZGV4ID0gPDE+OworCWRtYS1jaGFubmVsQDAgeworCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJcmVnID0gPDB4MCAweDgwPjsKKwkJY2VsbC1pbmRleCA9IDwwPjsKKwkJaW50ZXJydXB0cyA9IDwzMiAyIDAgMD47CisJfTsKKwlkbWEtY2hhbm5lbEA4MCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQlyZWcgPSA8MHg4MCAweDgwPjsKKwkJY2VsbC1pbmRleCA9IDwxPjsKKwkJaW50ZXJydXB0cyA9IDwzMyAyIDAgMD47CisJfTsKKwlkbWEtY2hhbm5lbEAxMDAgeworCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKKwkJcmVnID0gPDB4MTAwIDB4ODA+OworCQljZWxsLWluZGV4ID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPDM0IDIgMCAwPjsKKwl9OworCWRtYS1jaGFubmVsQDE4MCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOworCQlyZWcgPSA8MHgxODAgMHg4MD47CisJCWNlbGwtaW5kZXggPSA8Mz47CisJCWludGVycnVwdHMgPSA8MzUgMiAwIDA+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1kdWFydC0wLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWR1YXJ0LTAuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjVjMDdiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1kdWFydC0wLmR0c2kKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIFFvcklRIERVQVJUIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4MTFjMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworc2VyaWFsMDogc2VyaWFsQDExYzUwMCB7CisJY2VsbC1pbmRleCA9IDwwPjsKKwlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CisJcmVnID0gPDB4MTFjNTAwIDB4MTAwPjsKKwljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47Cit9OworCitzZXJpYWwxOiBzZXJpYWxAMTFjNjAwIHsKKwljZWxsLWluZGV4ID0gPDE+OworCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKKwlyZWcgPSA8MHgxMWM2MDAgMHgxMDA+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWR1YXJ0LTEuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtZHVhcnQtMS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyMzIzM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWR1YXJ0LTEuZHRzaQpAQCAtMCwwICsxLDUxIEBACisvKgorICogUW9ySVEgRFVBUlQgZGV2aWNlIHRyZWUgc3R1YiBbIGNvbnRyb2xsZXIgQCBvZmZzZXQgMHgxMWQwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitzZXJpYWwyOiBzZXJpYWxAMTFkNTAwIHsKKwljZWxsLWluZGV4ID0gPDI+OworCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKKwlyZWcgPSA8MHgxMWQ1MDAgMHgxMDA+OworCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKK307CisKK3NlcmlhbDM6IHNlcmlhbEAxMWQ2MDAgeworCWNlbGwtaW5kZXggPSA8Mz47CisJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKKwljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOworCXJlZyA9IDwweDExZDYwMCAweDEwMD47CisJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworCWludGVycnVwdHMgPSA8MzcgMiAwIDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtZXNkaGMtMC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1lc2RoYy0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4MzVhZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtZXNkaGMtMC5kdHNpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBRb3JJUSBlU0RIQyBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDExNDAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3NkaGM6IHNkaGNAMTE0MDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxlc2RoYyI7CisJcmVnID0gPDB4MTE0MDAwIDB4MTAwMD47CisJaW50ZXJydXB0cyA9IDw0OCAyIDAgMD47CisJY2xvY2stZnJlcXVlbmN5ID0gPDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtZXNwaS0wLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWVzcGktMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjA2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWVzcGktMC5kdHNpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBRb3JJUSBlU1BJIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4MTEwMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworc3BpQDExMDAwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1lc3BpIjsKKwlyZWcgPSA8MHgxMTAwMDAgMHgxMDAwPjsKKwlpbnRlcnJ1cHRzID0gPDUzIDB4MiAwIDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtZ3Bpby0wLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWdwaW8tMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzE0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWdwaW8tMC5kdHNpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBRb3JJUSBHUElPIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4MTMwMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworZ3BpbzA6IGdwaW9AMTMwMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxxb3JpcS1ncGlvIjsKKwlyZWcgPSA8MHgxMzAwMDAgMHgxMDAwPjsKKwlpbnRlcnJ1cHRzID0gPDU1IDIgMCAwPjsKKwkjZ3Bpby1jZWxscyA9IDwyPjsKKwlncGlvLWNvbnRyb2xsZXI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1pMmMtMC5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1pMmMtMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOWJmN2QKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWkyYy0wLmR0c2kKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIFFvcklRIEkyQyBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDExODAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2kyY0AxMTgwMDAgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworCWNlbGwtaW5kZXggPSA8MD47CisJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwlyZWcgPSA8MHgxMTgwMDAgMHgxMDA+OworCWludGVycnVwdHMgPSA8MzggMiAwIDA+OworCWRmc3JyOworfTsKKworaTJjQDExODEwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJY2VsbC1pbmRleCA9IDwxPjsKKwljb21wYXRpYmxlID0gImZzbC1pMmMiOworCXJlZyA9IDwweDExODEwMCAweDEwMD47CisJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47CisJZGZzcnI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1pMmMtMS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1pMmMtMS5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ODliZjUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLWkyYy0xLmR0c2kKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIFFvcklRIEkyQyBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDExOTAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK2kyY0AxMTkwMDAgeworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDA+OworCWNlbGwtaW5kZXggPSA8Mj47CisJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKKwlyZWcgPSA8MHgxMTkwMDAgMHgxMDA+OworCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OworCWRmc3JyOworfTsKKworaTJjQDExOTEwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJY2VsbC1pbmRleCA9IDwzPjsKKwljb21wYXRpYmxlID0gImZzbC1pMmMiOworCXJlZyA9IDwweDExOTEwMCAweDEwMD47CisJaW50ZXJydXB0cyA9IDwzOSAyIDAgMD47CisJZGZzcnI7Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1tcGljLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLW1waWMuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWJhZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1tcGljLmR0c2kKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBRb3JJUSBNUElDIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4NDAwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCittcGljOiBwaWNANDAwMDAgeworCWludGVycnVwdC1jb250cm9sbGVyOworCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCSNpbnRlcnJ1cHQtY2VsbHMgPSA8ND47CisJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47CisJY29tcGF0aWJsZSA9ICJmc2wsbXBpYyIsICJjaHJwLG9wZW4tcGljIjsKKwlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJY2xvY2stZnJlcXVlbmN5ID0gPDB4MD47Cit9OworCit0aW1lckA0MTEwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1nbG9iYWwtdGltZXIiOworCXJlZyA9IDwweDQxMTAwIDB4MTAwIDB4NDEzMDAgND47CisJaW50ZXJydXB0cyA9IDwwIDAgMyAwCisJCSAgICAgIDEgMCAzIDAKKwkJICAgICAgMiAwIDMgMAorCQkgICAgICAzIDAgMyAwPjsKK307CisKK21zaTA6IG1zaUA0MTYwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiOworCXJlZyA9IDwweDQxNjAwIDB4MjAwPjsKKwltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKKwlpbnRlcnJ1cHRzID0gPAorCQkweGUwIDAgMCAwCisJCTB4ZTEgMCAwIDAKKwkJMHhlMiAwIDAgMAorCQkweGUzIDAgMCAwCisJCTB4ZTQgMCAwIDAKKwkJMHhlNSAwIDAgMAorCQkweGU2IDAgMCAwCisJCTB4ZTcgMCAwIDA+OworfTsKKworbXNpMTogbXNpQDQxODAwIHsKKwljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7CisJcmVnID0gPDB4NDE4MDAgMHgyMDA+OworCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OworCWludGVycnVwdHMgPSA8CisJCTB4ZTggMCAwIDAKKwkJMHhlOSAwIDAgMAorCQkweGVhIDAgMCAwCisJCTB4ZWIgMCAwIDAKKwkJMHhlYyAwIDAgMAorCQkweGVkIDAgMCAwCisJCTB4ZWUgMCAwIDAKKwkJMHhlZiAwIDAgMD47Cit9OworCittc2kyOiBtc2lANDFhMDAgeworCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKKwlyZWcgPSA8MHg0MWEwMCAweDIwMD47CisJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47CisJaW50ZXJydXB0cyA9IDwKKwkJMHhmMCAwIDAgMAorCQkweGYxIDAgMCAwCisJCTB4ZjIgMCAwIDAKKwkJMHhmMyAwIDAgMAorCQkweGY0IDAgMCAwCisJCTB4ZjUgMCAwIDAKKwkJMHhmNiAwIDAgMAorCQkweGY3IDAgMCAwPjsKK307CisKK3RpbWVyQDQyMTAwIHsKKwljb21wYXRpYmxlID0gImZzbCxtcGljLWdsb2JhbC10aW1lciI7CisJcmVnID0gPDB4NDIxMDAgMHgxMDAgMHg0MjMwMCA0PjsKKwlpbnRlcnJ1cHRzID0gPDQgMCAzIDAKKwkJICAgICAgNSAwIDMgMAorCQkgICAgICA2IDAgMyAwCisJCSAgICAgIDcgMCAzIDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtcm11LTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtcm11LTAuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTdmZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1ybXUtMC5kdHNpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBRb3JJUSBSSU8gTWVzc2FnZSBVbml0IGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4ZDMwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitybXU6IHJtdUBkMzAwMCB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1ybXUiOworCXJlZyA9IDwweGQzMDAwIDB4NTAwPjsKKwlyYW5nZXMgPSA8MHgwIDB4ZDMwMDAgMHg1MDA+OworCisJbWVzc2FnZS11bml0QDAgeworCQljb21wYXRpYmxlID0gImZzbCxzcmlvLW1zZy11bml0IjsKKwkJcmVnID0gPDB4MCAweDEwMD47CisJCWludGVycnVwdHMgPSA8CisJCQk2MCAyIDAgMCAgLyogbXNnMV90eF9pcnEgKi8KKwkJCTYxIDIgMCAwPjsvKiBtc2cxX3J4X2lycSAqLworCX07CisJbWVzc2FnZS11bml0QDEwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8tbXNnLXVuaXQiOworCQlyZWcgPSA8MHgxMDAgMHgxMDA+OworCQlpbnRlcnJ1cHRzID0gPAorCQkJNjIgMiAwIDAgIC8qIG1zZzJfdHhfaXJxICovCisJCQk2MyAyIDAgMD47LyogbXNnMl9yeF9pcnEgKi8KKwl9OworCWRvb3JiZWxsLXVuaXRANDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1kYmVsbC11bml0IjsKKwkJcmVnID0gPDB4NDAwIDB4ODA+OworCQlpbnRlcnJ1cHRzID0gPAorCQkJNTYgMiAwIDAgIC8qIGJlbGxfb3V0Yl9pcnEgKi8KKwkJCTU3IDIgMCAwPjsvKiBiZWxsX2luYl9pcnEgKi8KKwl9OworCXBvcnQtd3JpdGUtdW5pdEA0ZTAgeworCQljb21wYXRpYmxlID0gImZzbCxzcmlvLXBvcnQtd3JpdGUtdW5pdCI7CisJCXJlZyA9IDwweDRlMCAweDIwPjsKKwkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTE+OworCX07Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1zYXRhMi0wLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLXNhdGEyLTAuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjQyMDQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1zYXRhMi0wLmR0c2kKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIFFvcklRIFNBVEF2MiBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDIyMDAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3NhdGFAMjIwMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxwcS1zYXRhLXYyIjsKKwlyZWcgPSA8MHgyMjAwMDAgMHgxMDAwPjsKKwlpbnRlcnJ1cHRzID0gPDY4IDB4MiAwIDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtc2F0YTItMS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1zYXRhMi0xLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU3MzcwMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtc2F0YTItMS5kdHNpCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBRb3JJUSBTQVRBdjIgZGV2aWNlIHRyZWUgc3R1YiBbIGNvbnRyb2xsZXIgQCBvZmZzZXQgMHgyMjEwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitzYXRhQDIyMTAwMCB7CisJY29tcGF0aWJsZSA9ICJmc2wscHEtc2F0YS12MiI7CisJcmVnID0gPDB4MjIxMDAwIDB4MTAwMD47CisJaW50ZXJydXB0cyA9IDw2OSAweDIgMCAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLXNlYzQuMC0wLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLXNlYzQuMC0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNiYmFjMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtc2VjNC4wLTAuZHRzaQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIFFvcklRIFNlYy9DcnlwdG8gNC4wIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4MzAwMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworY3J5cHRvOiBjcnlwdG9AMzAwMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJcmVnID0gPDB4MzAwMDAwIDB4MTAwMDA+OworCXJhbmdlcyA9IDwwIDB4MzAwMDAwIDB4MTAwMDA+OworCWludGVycnVwdHMgPSA8OTIgMiAwIDA+OworCisJc2VjX2pyMDoganJAMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDg4IDIgMCAwPjsKKwl9OworCisJc2VjX2pyMToganJAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJcmVnID0gPDB4MjAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDg5IDIgMCAwPjsKKwl9OworCisJc2VjX2pyMjoganJAMzAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJcmVnID0gPDB4MzAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDkwIDIgMCAwPjsKKwl9OworCisJc2VjX2pyMzoganJANDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJcmVnID0gPDB4NDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDkxIDIgMCAwPjsKKwl9OworCisJcnRpY0A2MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtcnRpYyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4NjAwMCAweDEwMD47CisJCXJhbmdlcyA9IDwweDAgMHg2MTAwIDB4ZTAwPjsKKworCQlydGljX2E6IHJ0aWMtYUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCXJlZyA9IDwweDAwIDB4MjAgMHgxMDAgMHg4MD47CisJCX07CisKKwkJcnRpY19iOiBydGljLWJAMjAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJcmVnID0gPDB4MjAgMHgyMCAweDIwMCAweDgwPjsKKwkJfTsKKworCQlydGljX2M6IHJ0aWMtY0A0MCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQlyZWcgPSA8MHg0MCAweDIwIDB4MzAwIDB4ODA+OworCQl9OworCisJCXJ0aWNfZDogcnRpYy1kQDYwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCXJlZyA9IDwweDYwIDB4MjAgMHg1MDAgMHg4MD47CisJCX07CisJfTsKK307CisKK3NlY19tb246IHNlY19tb25AMzE0MDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMC1tb24iOworCXJlZyA9IDwweDMxNDAwMCAweDEwMDA+OworCWludGVycnVwdHMgPSA8OTMgMiAwIDA+OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtc2VjNC4xLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtc2VjNC4xLTAuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzA4OTg2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS1zZWM0LjEtMC5kdHNpCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogUW9ySVEgU2VjL0NyeXB0byA0LjEgZGV2aWNlIHRyZWUgc3R1YiBbIGNvbnRyb2xsZXIgQCBvZmZzZXQgMHgzMDAwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCitjcnlwdG86IGNyeXB0b0AzMDAwMDAgeworCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xIiwgImZzbCxzZWMtdjQuMCI7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJcmVnCQkgPSA8MHgzMDAwMDAgMHgxMDAwMD47CisJcmFuZ2VzCQkgPSA8MCAweDMwMDAwMCAweDEwMDAwPjsKKwlpbnRlcnJ1cHRzCSA9IDw5MiAyIDAgMD47CisKKwlzZWNfanIwOiBqckAxMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtam9iLXJpbmciLAorCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJcmVnID0gPDB4MTAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDg4IDIgMCAwPjsKKwl9OworCisJc2VjX2pyMToganJAMjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLWpvYi1yaW5nIiwKKwkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDw4OSAyIDAgMD47CisJfTsKKworCXNlY19qcjI6IGpyQDMwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1qb2ItcmluZyIsCisJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQlyZWcgPSA8MHgzMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8OTAgMiAwIDA+OworCX07CisKKwlzZWNfanIzOiBqckA0MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtam9iLXJpbmciLAorCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJcmVnID0gPDB4NDAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDkxIDIgMCAwPjsKKwl9OworCisJcnRpY0A2MDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtcnRpYyIsCisJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYyI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmVnID0gPDB4NjAwMCAweDEwMD47CisJCXJhbmdlcyA9IDwweDAgMHg2MTAwIDB4ZTAwPjsKKworCQlydGljX2E6IHJ0aWMtYUAwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLXJ0aWMtbWVtb3J5IiwKKwkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJcmVnID0gPDB4MDAgMHgyMCAweDEwMCAweDgwPjsKKwkJfTsKKworCQlydGljX2I6IHJ0aWMtYkAyMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1ydGljLW1lbW9yeSIsCisJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCXJlZyA9IDwweDIwIDB4MjAgMHgyMDAgMHg4MD47CisJCX07CisKKwkJcnRpY19jOiBydGljLWNANDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtcnRpYy1tZW1vcnkiLAorCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQlyZWcgPSA8MHg0MCAweDIwIDB4MzAwIDB4ODA+OworCQl9OworCisJCXJ0aWNfZDogcnRpYy1kQDYwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLXJ0aWMtbWVtb3J5IiwKKwkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJcmVnID0gPDB4NjAgMHgyMCAweDUwMCAweDgwPjsKKwkJfTsKKwl9OworfTsKKworc2VjX21vbjogc2VjX21vbkAzMTQwMDAgeworCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLW1vbiIsICJmc2wsc2VjLXY0LjAtbW9uIjsKKwlyZWcgPSA8MHgzMTQwMDAgMHgxMDAwPjsKKwlpbnRlcnJ1cHRzID0gPDkzIDIgMCAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLXNlYzQuMi0wLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLXNlYzQuMi0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5MGUwZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtc2VjNC4yLTAuZHRzaQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIFFvcklRIFNlYy9DcnlwdG8gNC4yIGRldmljZSB0cmVlIHN0dWIgWyBjb250cm9sbGVyIEAgb2Zmc2V0IDB4MzAwMDAwIF0KKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworY3J5cHRvOiBjcnlwdG9AMzAwMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMiIsICJmc2wsc2VjLXY0LjAiOworCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCSNzaXplLWNlbGxzID0gPDE+OworCXJlZwkJID0gPDB4MzAwMDAwIDB4MTAwMDA+OworCXJhbmdlcwkJID0gPDAgMHgzMDAwMDAgMHgxMDAwMD47CisJaW50ZXJydXB0cwkgPSA8OTIgMiAwIDA+OworCisJc2VjX2pyMDoganJAMTAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKKwkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDw4OCAyIDAgMD47CisJfTsKKworCXNlY19qcjE6IGpyQDIwMDAgeworCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCisJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOworCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47CisJCWludGVycnVwdHMgPSA8ODkgMiAwIDA+OworCX07CisKKwlzZWNfanIyOiBqckAzMDAwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAorCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKKwkJcmVnID0gPDB4MzAwMCAweDEwMDA+OworCQlpbnRlcnJ1cHRzID0gPDkwIDIgMCAwPjsKKwl9OworCisJc2VjX2pyMzoganJANDAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKKwkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7CisJCXJlZyA9IDwweDQwMDAgMHgxMDAwPjsKKwkJaW50ZXJydXB0cyA9IDw5MSAyIDAgMD47CisJfTsKKworCXJ0aWNANjAwMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMiLAorCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJlZyA9IDwweDYwMDAgMHgxMDA+OworCQlyYW5nZXMgPSA8MHgwIDB4NjEwMCAweGUwMD47CisKKwkJcnRpY19hOiBydGljLWFAMCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCXJlZyA9IDwweDAwIDB4MjAgMHgxMDAgMHg4MD47CisJCX07CisKKwkJcnRpY19iOiBydGljLWJAMjAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAorCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7CisJCQlyZWcgPSA8MHgyMCAweDIwIDB4MjAwIDB4ODA+OworCQl9OworCisJCXJ0aWNfYzogcnRpYy1jQDQwIHsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKKwkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOworCQkJcmVnID0gPDB4NDAgMHgyMCAweDMwMCAweDgwPjsKKwkJfTsKKworCQlydGljX2Q6IHJ0aWMtZEA2MCB7CisJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCisJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKKwkJCXJlZyA9IDwweDYwIDB4MjAgMHg1MDAgMHg4MD47CisJCX07CisJfTsKK307CisKK3NlY19tb246IHNlY19tb25AMzE0MDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1tb24iLCAiZnNsLHNlYy12NC4wLW1vbiI7CisJcmVnID0gPDB4MzE0MDAwIDB4MTAwMD47CisJaW50ZXJydXB0cyA9IDw5MyAyIDAgMD47Cit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ZzbC9xb3JpcS11c2IyLWRyLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtdXNiMi1kci0wLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkNmY4NAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtdXNiMi1kci0wLmR0c2kKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIFFvcklRIFVTQiBEUiBkZXZpY2UgdHJlZSBzdHViIFsgY29udHJvbGxlciBAIG9mZnNldCAweDIxMTAwMCBdCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKK3VzYkAyMTEwMDAgeworCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1eHgtdXNiMi1kciIsICJmc2wtdXNiMi1kciI7CisJcmVnID0gPDB4MjExMDAwIDB4MTAwMD47CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJaW50ZXJydXB0cyA9IDw0NSAweDIgMCAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLXVzYjItbXBoLTAuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9mc2wvcW9yaXEtdXNiMi1tcGgtMC5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTM4MzUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZnNsL3FvcmlxLXVzYjItbXBoLTAuZHRzaQpAQCAtMCwwICsxLDQxIEBACisvKgorICogUW9ySVEgVVNCIEhvc3QgZGV2aWNlIHRyZWUgc3R1YiBbIGNvbnRyb2xsZXIgQCBvZmZzZXQgMHgyMTAwMDAgXQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCit1c2JAMjEwMDAwIHsKKwljb21wYXRpYmxlID0gImZzbCxtcGM4NXh4LXVzYjItbXBoIiwgImZzbC11c2IyLW1waCI7CisJcmVnID0gPDB4MjEwMDAwIDB4MTAwMD47CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MD47CisJaW50ZXJydXB0cyA9IDw0NCAweDIgMCAwPjsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3BwYzlhLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfcHBjOWEuZHRzCmluZGV4IDIyNjZiYmIuLjM4ZGNiOTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfcHBjOWEuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfcHBjOWEuZHRzCkBAIC0zMzksNyArMzM5LDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwweDJhIDB4Mj47CkBAIC0zNDksNyArMzQ5LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwweDFjIDB4Mj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzMxMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzMxMC5kdHMKaW5kZXggNDI5ZTg3ZC4uNWFiODkzMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmMzMTAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjMzEwLmR0cwpAQCAtMzM3LDcgKzMzNyw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8MHgyYSAweDI+OwpAQCAtMzQ3LDcgKzM0Nyw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8MHgxYyAweDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmM2MTAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2dlZl9zYmM2MTAuZHRzCmluZGV4IGQ4MTIwMWEuLmQ1MzQxZjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9nZWZfc2JjNjEwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvZ2VmX3NiYzYxMC5kdHMKQEAgLTMzNyw3ICszMzcsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDB4MmEgMHgyPjsKQEAgLTM0Nyw3ICszNDcsNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDB4MWMgMHgyPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rbG9uZGlrZS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva2xvbmRpa2UuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOTQyOTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva2xvbmRpa2UuZHRzCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogRGV2aWNlIFRyZWUgZm9yIEtsb25kaWtlIChBUE04MDE4WCkgYm9hcmQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCBBcHBsaWVkIE1pY3JvIENpcmN1aXRzIENvcnBvcmF0aW9uCisgKiBBdXRob3I6IFRhbm1heSBJbmFtZGFyIDx0aW5hbWRhckBhcG0uY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCisgKiBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisvZHRzLXYxLzsKKworLyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJbW9kZWwgPSAiYXBtLGtsb25kaWtlIjsKKwljb21wYXRpYmxlID0gImFwbSxrbG9uZGlrZSI7CisJZGNyLXBhcmVudCA9IDwmey9jcHVzL2NwdUAwfT47CisKKwlhbGlhc2VzIHsKKwkJZXRoZXJuZXQwID0gJkVNQUMwOworCQlldGhlcm5ldDEgPSAmRU1BQzE7CisJfTsKKworCWNwdXMgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisKKwkJY3B1QDAgeworCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKKwkJCW1vZGVsID0gIlBvd2VyUEMsYXBtODAxOHgiOworCQkJcmVnID0gPDB4MDAwMDAwMDA+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDMwMDAwMDAwMD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwzMDAwMDAwMDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQlpLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlkLWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CisJCQlpLWNhY2hlLXNpemUgPSA8MTYzODQ+OyAvKiAxNiBrQiAqLworCQkJZC1jYWNoZS1zaXplID0gPDE2Mzg0PjsgLyogMTYga0IgKi8KKwkJCWRjci1jb250cm9sbGVyOworCQkJZGNyLWFjY2Vzcy1tZXRob2QgPSAibmF0aXZlIjsKKwkJfTsKKwl9OworCisJbWVtb3J5IHsKKwkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKKwkJcmVnID0gPDB4MDAwMDAwMDAgMHgyMDAwMDAwMD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwl9OworCisJVUlDMDogaW50ZXJydXB0LWNvbnRyb2xsZXIgeworCQljb21wYXRpYmxlID0gImlibSx1aWMiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJY2VsbC1pbmRleCA9IDwwPjsKKwkJZGNyLXJlZyA9IDwweDBjMCAweDAxMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwl9OworCisJVUlDMTogaW50ZXJydXB0LWNvbnRyb2xsZXIxIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sdWljIjsKKwkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCWNlbGwtaW5kZXggPSA8MT47CisJCWRjci1yZWcgPSA8MHgwZDAgMHgwMTA+OworCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJI3NpemUtY2VsbHMgPSA8MD47CisJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCWludGVycnVwdHMgPSA8MHgxZSAweDQgMHgxZiAweDQ+OyAvKiBjYXNjYWRlICovCisJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OworCX07CisKKwlVSUMyOiBpbnRlcnJ1cHQtY29udHJvbGxlcjIgeworCQljb21wYXRpYmxlID0gImlibSx1aWMiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJY2VsbC1pbmRleCA9IDwyPjsKKwkJZGNyLXJlZyA9IDwweDBlMCAweDAxMD47CisJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJaW50ZXJydXB0cyA9IDwweDBhIDB4NCAweDBiIDB4ND47IC8qIGNhc2NhZGUgKi8KKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmVUlDMD47CisJfTsKKworCVVJQzM6IGludGVycnVwdC1jb250cm9sbGVyMyB7CisJCWNvbXBhdGlibGUgPSAiaWJtLHVpYyI7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQljZWxsLWluZGV4ID0gPDM+OworCQlkY3ItcmVnID0gPDB4MGYwIDB4MDEwPjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPDB4MTAgMHg0IDB4MTEgMHg0PjsgLyogY2FzY2FkZSAqLworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKKwl9OworCisJcGxiIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0scGxiNCI7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJcmFuZ2VzOworCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKworCQlTRFJBTTA6IG1lbW9yeS1jb250cm9sbGVyIHsKKwkJCWNvbXBhdGlibGUgPSAiaWJtLHNkcmFtLWFwbTgwMTh4IjsKKwkJCWRjci1yZWcgPSA8MHgwMTAgMHgwMDI+OworCQl9OworCisJCU1BTDA6IG1jbWFsIHsKKwkJCWNvbXBhdGlibGUgPSAiaWJtLG1jbWFsMiI7CisJCQlkY3ItcmVnID0gPDB4MTgwIDB4MDYyPjsKKwkJCW51bS10eC1jaGFucyA9IDwyPjsKKwkJCW51bS1yeC1jaGFucyA9IDwxNj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmVUlDMT47CisJCQlpbnRlcnJ1cHRzID0gPC8qVFhFT0IqLyAgIDB4NiAweDQKKwkJCQkJLypSWEVPQiovIDB4NyAweDQKKwkJCQkJLypTRVJSKi8gIDB4MSAweDQKKwkJCQkJLypUWERFKi8gIDB4MiAweDQKKwkJCQkJLypSWERFKi8gIDB4MyAweDQ+OworCQl9OworCisJCVBPQjA6IG9wYiB7CisJCQljb21wYXRpYmxlID0gImlibSxvcGIiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJhbmdlcyA9IDwweDIwMDAwMDAwIDB4MjAwMDAwMDAgMHgzMDAwMDAwMAorCQkJCSAgMHg1MDAwMDAwMCAweDUwMDAwMDAwIDB4MTAwMDAwMDAKKwkJCQkgIDB4NjAwMDAwMDAgMHg2MDAwMDAwMCAweDEwMDAwMDAwCisJCQkJICAweEZFMDAwMDAwIDB4RkUwMDAwMDAgMHgwMDAxMDAwMD47CisJCQlkY3ItcmVnID0gPDB4MTAwIDB4MDIwPjsKKwkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMDAwMDAwMDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisKKwkJCVJHTUlJMDogZW1hYy1yZ21paUA0MDBhMjAwMCB7CisJCQkJY29tcGF0aWJsZSA9ICJpYm0scmdtaWkiOworCQkJCXJlZyA9IDwweDQwMGEyMDAwIDB4MDAwMDAwMTA+OworCQkJCWhhcy1tZGlvOworCQkJfTsKKworCQkJVEFIMDogZW1hYy10YWhANDAwYTMwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiaWJtLHRhaCI7CisJCQkJcmVnID0gPDB4NDAwYTMwMDAgMHgxMDA+OworCQkJfTsKKworCQkJVEFIMTogZW1hYy10YWhANDAwYTQwMDAgeworCQkJCWNvbXBhdGlibGUgPSAiaWJtLHRhaCI7CisJCQkJcmVnID0gPDB4NDAwYTQwMDAgMHgxMDA+OworCQkJfTsKKworCQkJRU1BQzA6IGV0aGVybmV0QDQwMGEwMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImlibSxlbWFjNCIsICJpYm0tZW1hYzRzeW5jIjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZFTUFDMD47CisJCQkJaW50ZXJydXB0cyA9IDwweDA+OworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJaW50ZXJydXB0LW1hcCA9IDwvKlN0YXR1cyovIDB4MCAmVUlDMCAweDEzIDB4ND47CisJCQkJcmVnID0gPDB4NDAwYTAwMDAgMHgwMDAwMDEwMD47CisJCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbMDAwMDAwMDAwMDAwXTsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLworCQkJCW1hbC1kZXZpY2UgPSA8Jk1BTDA+OworCQkJCW1hbC10eC1jaGFubmVsID0gPDB4MD47CisJCQkJbWFsLXJ4LWNoYW5uZWwgPSA8MHgwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCW1heC1mcmFtZS1zaXplID0gPDkwMDA+OworCQkJCXJ4LWZpZm8tc2l6ZSA9IDw0MDk2PjsKKwkJCQl0eC1maWZvLXNpemUgPSA8MjA0OD47CisJCQkJcGh5LW1vZGUgPSAicmdtaWkiOworCQkJCXBoeS1hZGRyZXNzID0gPDB4Mj47CisJCQkJdHVyYm8gPSAibm8iOworCQkJCXBoeS1tYXAgPSA8MHgwMDAwMDAwMD47CisJCQkJcmdtaWktZGV2aWNlID0gPCZSR01JSTA+OworCQkJCXJnbWlpLWNoYW5uZWwgPSA8MD47CisJCQkJdGFoLWRldmljZSA9IDwmVEFIMD47CisJCQkJdGFoLWNoYW5uZWwgPSA8MD47CisJCQkJaGFzLWludmVydGVkLXN0YWNyLW9jOworCQkJCWhhcy1uZXctc3RhY3Itc3Rhb3BjOworCQkJfTsKKworCQkJRU1BQzE6IGV0aGVybmV0QDQwMGExMDAwIHsKKwkJCQljb21wYXRpYmxlID0gImlibSxlbWFjNCIsICJpYm0tZW1hYzRzeW5jIjsKKwkJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkVNQUMxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4MD47CisJCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKKwkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQlpbnRlcnJ1cHQtbWFwID0gPC8qU3RhdHVzKi8gMHgwICZVSUMwIDB4MTQgMHg0PjsKKwkJCQlyZWcgPSA8MHg0MDBhMTAwMCAweDAwMDAwMTAwPjsKKwkJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFswMDAwMDAwMDAwMDBdOyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQkJbWFsLWRldmljZSA9IDwmTUFMMD47CisJCQkJbWFsLXR4LWNoYW5uZWwgPSA8MT47CisJCQkJbWFsLXJ4LWNoYW5uZWwgPSA8OD47CisJCQkJY2VsbC1pbmRleCA9IDwxPjsKKwkJCQltYXgtZnJhbWUtc2l6ZSA9IDw5MDAwPjsKKwkJCQlyeC1maWZvLXNpemUgPSA8NDA5Nj47CisJCQkJdHgtZmlmby1zaXplID0gPDIwNDg+OworCQkJCXBoeS1tb2RlID0gInJnbWlpIjsKKwkJCQlwaHktYWRkcmVzcyA9IDwweDM+OworCQkJCXR1cmJvID0gIm5vIjsKKwkJCQlwaHktbWFwID0gPDB4MDAwMDAwMDA+OworCQkJCXJnbWlpLWRldmljZSA9IDwmUkdNSUkwPjsKKwkJCQlyZ21paS1jaGFubmVsID0gPDE+OworCQkJCXRhaC1kZXZpY2UgPSA8JlRBSDE+OworCQkJCXRhaC1jaGFubmVsID0gPDA+OworCQkJCWhhcy1pbnZlcnRlZC1zdGFjci1vYzsKKwkJCQloYXMtbmV3LXN0YWNyLXN0YW9wYzsKKwkJCQltZGlvLWRldmljZSA9IDwmRU1BQzA+OworCQkJfTsKKwkJfTsKKwl9OworCisJY2hvc2VuIHsKKwkJbGludXgsc3Rkb3V0LXBhdGggPSAiL3BsYi9vcGIvc2VyaWFsQDUwMDAxMDAwIjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rbWV0ZXIxLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rbWV0ZXIxLmR0cwppbmRleCBkMTZiYWUxLi45ODNhZWUxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva21ldGVyMS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL2ttZXRlcjEuZHRzCkBAIC04MCw3ICs4MCw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyNjQwMDAwMDA+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhELmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEQuZHRzCmluZGV4IDhkNzI1ZDEuLjBhNDU0NTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEQuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEQuZHRzCkBAIC04NCw3ICs4NCw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA4MDAwNDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4ODAwMDQ1MDAgMHg4PjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw5NzU1MzgwMD47CiAJCQljdXJyZW50LXNwZWVkID0gPDk2MDA+OwpAQCAtOTUsNyArOTUsNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxAODAwMDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDgwMDA0NjAwIDB4OD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8OTc1NTM4MDA+OwogCQkJY3VycmVudC1zcGVlZCA9IDw1NzYwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMva3Vyb2JveEhHLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCmluZGV4IGIxM2ExMWUuLjBlNzU4YjMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9rdXJvYm94SEcuZHRzCkBAIC04NCw3ICs4NCw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA4MDAwNDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4ODAwMDQ1MDAgMHg4PjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzAwNDEwMDA+OwogCQkJY3VycmVudC1zcGVlZCA9IDw5NjAwPjsKQEAgLTk1LDcgKzk1LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDgwMDA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg4MDAwNDYwMCAweDg+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMDA0MTAwMD47CiAJCQljdXJyZW50LXNwZWVkID0gPDU3NjAwPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzA4X3AxbS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOF9wMW0uZHRzCmluZGV4IDY5N2IzZjYuLjIyYjA4MzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzA4X3AxbS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMDhfcDFtLmR0cwpAQCAtMjMzLDcgKzIzMyw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzMzMzMzMzM+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CkBAIC0yNDMsNyArMjQzLDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMzMzMzMzMz47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDB4OD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOHJkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMwOHJkYi5kdHMKaW5kZXggYTBiZDE4OC4uZjY2ZDEwZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMDhyZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzA4cmRiLmR0cwpAQCAtMjA4LDcgKzIwOCw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzMzMzMzMzM+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CkBAIC0yMTgsNyArMjE4LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDEzMzMzMzMzMz47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDB4OD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxM2VyZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMTNlcmRiLmR0cwppbmRleCBhYzFlYjMyLi4xYzgzNmM2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxM2VyZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzEzZXJkYi5kdHMKQEAgLTI2MSw3ICsyNjEsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDkgMHg4PjsKQEAgLTI3MSw3ICsyNzEsNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDB4OD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxNWVyZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMTVlcmRiLmR0cwppbmRleCA0ZGQwOGMzLi44MTE4NDhlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMxNWVyZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzE1ZXJkYi5kdHMKQEAgLTI2NSw3ICsyNjUsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MTMzMzMzMzMzPjsKIAkJCWludGVycnVwdHMgPSA8OSAweDg+OwpAQCAtMjc1LDcgKzI3NSw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwxMzMzMzMzMzM+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAweDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X21kcy5kdHMKaW5kZXggMDVhZDhjOS4uZGE5YzcyZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9tZHMuZHRzCkBAIC0xMDUsNyArMTA1LDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CkBAIC0xMTUsNyArMTE1LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAweDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzMnhfcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKaW5kZXggZjRmYWRiMjNhLi5mZjdiMTViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODMyeF9yZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzJ4X3JkYi5kdHMKQEAgLTgzLDcgKzgzLDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CkBAIC05Myw3ICs5Myw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8MTAgMHg4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHguZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKaW5kZXggNTA1ZGM4NC4uMjYwODY3OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eC5kdHMKQEAgLTI4Myw3ICsyODMsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKIAkJCWludGVycnVwdHMgPSA8OSAweDg+OwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIGZyb20gYm9vdGxvYWRlcgogCQkJaW50ZXJydXB0cyA9IDwxMCAweDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eGdwLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzQ5ZW1pdHhncC5kdHMKaW5kZXggZWI3MzIxMS4uNmNkMDQ0ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNDllbWl0eGdwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0OWVtaXR4Z3AuZHRzCkBAIC0xODksNyArMTg5LDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkJLy8gZnJvbSBib290bG9hZGVyCiAJCQlpbnRlcnJ1cHRzID0gPDkgMHg4PjsKQEAgLTE5OSw3ICsxOTksNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CQkvLyBmcm9tIGJvb3Rsb2FkZXIKIAkJCWludGVycnVwdHMgPSA8MTAgMHg4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM0eF9tZHMuZHRzCmluZGV4IDIzMGZlYmIuLjQ1NTI4NjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzR4X21kcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNHhfbWRzLmR0cwpAQCAtMjQyLDcgKzI0Miw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8OSAweDg+OwpAQCAtMjUyLDcgKzI1Miw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8MTAgMHg4PjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCmluZGV4IDQ1Y2ZhMWM1Li5jMGU0NTBhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X21kcy5kdHMKQEAgLTEzNiw3ICsxMzYsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MjY0MDAwMDAwPjsKIAkJCWludGVycnVwdHMgPSA8OSAweDg+OwpAQCAtMTQ2LDcgKzE0Niw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwyNjQwMDAwMDA+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAweDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfcmRrLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4MzZ4X3Jkay5kdHMKaW5kZXggYmRmNDQ1OS4uYjZlOWFlYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNnhfcmRrLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM2eF9yZGsuZHRzCkBAIC0xMDIsNyArMTAyLDcgQEAKIAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKIAkJCWludGVycnVwdHMgPSA8OSA4PjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8JmlwaWM+OwpAQCAtMTEyLDcgKzExMiw3IEBACiAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDg+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaXBpYz47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3N19tZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzdfbWRzLmR0cwppbmRleCA4NTU3ODJjLi5jZmNjZWY1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3N19tZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc3X21kcy5kdHMKQEAgLTI3Niw3ICsyNzYsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDkgMHg4PjsKQEAgLTI4Niw3ICsyODYsNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDB4OD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3N19yZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzdfcmRiLmR0cwppbmRleCBkYmMxYjk4Li4zNTNkZWZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3N19yZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc3X3JkYi5kdHMKQEAgLTMyMSw3ICszMjEsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDkgMHg4PjsKQEAgLTMzMSw3ICszMzEsNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDB4OD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3N193bGFuLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc3X3dsYW4uZHRzCmluZGV4IDllYTc4MzAuLmVmNGEzMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc3X3dsYW4uZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc3X3dsYW4uZHRzCkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CkBAIC0zMTQsNyArMzE0LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAweDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzhfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc4X21kcy5kdHMKaW5kZXggZjcwY2Y2MC4uNTM4ZmNiOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzhfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3OF9tZHMuZHRzCkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CkBAIC0zMjUsNyArMzI1LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAweDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzhfcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc4X3JkYi5kdHMKaW5kZXggMzQ0N2ViOS4uMzIzMzNhOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzhfcmRiLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3OF9yZGIuZHRzCkBAIC0zMjEsNyArMzIxLDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CkBAIC0zMzEsNyArMzMxLDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAweDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzlfbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc5X21kcy5kdHMKaW5kZXggNjQ1ZWM1MS4uNTM4NzA5MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzlfbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3OV9tZHMuZHRzCkBAIC0zMTMsNyArMzEzLDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CkBAIC0zMjMsNyArMzIzLDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAweDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzlfcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4Mzc5X3JkYi5kdHMKaW5kZXggMTU1NjBjNi4uNDYyMjRjMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzgzNzlfcmRiLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODM3OV9yZGIuZHRzCkBAIC0zMTksNyArMzE5LDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDw5IDB4OD47CkBAIC0zMjksNyArMzI5LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwxMCAweDg+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1MzZkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODUzNmRzLmR0cwppbmRleCBhNzVjMTBlLi5jMTU4ODE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODUzNmRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODUzNmRzLmR0cwpAQCAtOSwyNCArOSwxMSBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAiZnNsL21wYzg1MzZzaS1wcmUuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiZnNsLG1wYzg1MzZkcyI7CiAJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNmRzIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkjc2l6ZS1jZWxscyA9IDwyPjsKLQotCWFsaWFzZXMgewotCQlldGhlcm5ldDAgPSAmZW5ldDA7Ci0JCWV0aGVybmV0MSA9ICZlbmV0MTsKLQkJc2VyaWFsMCA9ICZzZXJpYWwwOwotCQlzZXJpYWwxID0gJnNlcmlhbDE7Ci0JCXBjaTAgPSAmcGNpMDsKLQkJcGNpMSA9ICZwY2kxOwotCQlwY2kyID0gJnBjaTI7Ci0JCXBjaTMgPSAmcGNpMzsKLQl9OwogCiAJY3B1cyB7CiAJCSNjcHVzID0gPDE+OwpAQCAtNDUsNDAzICszMiwzNCBAQAogCQlyZWcgPSA8MCAwIDAgMD47CS8vIEZpbGxlZCBieSBVLUJvb3QKIAl9OwogCi0Jc29jQGZmZTAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCWxiYzogbG9jYWxidXNAZmZlMDUwMDAgeworCQlyZWcgPSA8MCAweGZmZTA1MDAwIDAgMHgxMDAwPjsKKwl9OworCisJYm9hcmRfc29jOiBzb2M6IHNvY0BmZmUwMDAwMCB7CiAJCXJhbmdlcyA9IDwweDAgMCAweGZmZTAwMDAwIDB4MTAwMDAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZpbGxlZCBvdXQgYnkgdWJvb3QuCi0KLQkJZWNtLWxhd0AwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOwotCQkJcmVnID0gPDB4MCAweDEwMDA+OwotCQkJZnNsLG51bS1sYXdzID0gPDEyPjsKLQkJfTsKLQotCQllY21AMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWVjbSIsICJmc2wsZWNtIjsKLQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTcgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE4IDB4Mj47Ci0JCX07Ci0KLQkJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1sMi1jYWNoZS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMHgyPjsKLQkJfTsKLQotCQlpMmNAMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJaTJjQDMxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzEwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDB4Mj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWRmc3JyOwotCQkJcnRjQDY4IHsKLQkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczMyMzIiOwotCQkJCXJlZyA9IDwweDY4PjsKLQkJCQlpbnRlcnJ1cHRzID0gPDAgMHgxPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCX07Ci0JCX07Ci0KLQkJc3BpQDcwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZXNwaSI7Ci0JCQlyZWcgPSA8MHg3MDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDU5IDB4Mj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKLQotCQkJZmxhc2hAMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzMjVzbDEyODAxIjsKLQkJCQlyZWcgPSA8MD47Ci0JCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OwotCQkJCXBhcnRpdGlvbkB1LWJvb3QgewotCQkJCQlsYWJlbCA9ICJ1LWJvb3QiOwotCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMTAwMDAwPjsKLQkJCQkJcmVhZC1vbmx5OwotCQkJCX07Ci0JCQkJcGFydGl0aW9uQGtlcm5lbCB7Ci0JCQkJCWxhYmVsID0gImtlcm5lbCI7Ci0JCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDA1MDAwMDA+OwotCQkJCQlyZWFkLW9ubHk7Ci0JCQkJfTsKLQkJCQlwYXJ0aXRpb25AZHRiIHsKLQkJCQkJbGFiZWwgPSAiZHRiIjsKLQkJCQkJcmVnID0gPDB4MDA2MDAwMDAgMHgwMDEwMDAwMD47Ci0JCQkJCXJlYWQtb25seTsKLQkJCQl9OwotCQkJCXBhcnRpdGlvbkBmcyB7Ci0JCQkJCWxhYmVsID0gImZpbGUgc3lzdGVtIjsKLQkJCQkJcmVnID0gPDB4MDA3MDAwMDAgMHgwMDkwMDAwMD47Ci0JCQkJfTsKLQkJCX07Ci0JCQlmbGFzaEAxIHsKLQkJCQljb21wYXRpYmxlID0gInNwYW5zaW9uLHMyNXNsMTI4MDEiOwotCQkJCXJlZyA9IDwxPjsKLQkJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw0MDAwMDAwMD47Ci0JCQl9OwotCQkJZmxhc2hAMiB7Ci0JCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzMjVzbDEyODAxIjsKLQkJCQlyZWcgPSA8Mj47Ci0JCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OwotCQkJfTsKLQkJCWZsYXNoQDMgewotCQkJCWNvbXBhdGlibGUgPSAic3BhbnNpb24sczI1c2wxMjgwMSI7Ci0JCQkJcmVnID0gPDM+OwotCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDAwPjsKLQkJCX07Ci0JCX07Ci0KLQkJZG1hQDIxMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MjEzMDAgND47Ci0JCQlyYW5nZXMgPSA8MCAweDIxMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWRtYS1jaGFubmVsIiwKLQkJCQkJICAgICAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIwIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWRtYS1jaGFubmVsIiwKLQkJCQkJICAgICAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMSAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZG1hLWNoYW5uZWwiLAotCQkJCQkgICAgICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTAwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMiAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZG1hLWNoYW5uZWwiLAotCQkJCQkgICAgICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMyAyPjsKLQkJCX07Ci0JCX07Ci0KLQkJdXNiQDIyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtdXNiMi1tcGgiLCAiZnNsLXVzYjItbXBoIjsKLQkJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDI4IDB4Mj47Ci0JCQlwaHlfdHlwZSA9ICJ1bHBpIjsKLQkJfTsKLQotCQl1c2JAMjMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi11c2IyLW1waCIsICJmc2wtdXNiMi1tcGgiOwotCQkJcmVnID0gPDB4MjMwMDAgMHgxMDAwPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8NDYgMHgyPjsKLQkJCXBoeV90eXBlID0gInVscGkiOwotCQl9OwotCi0JCWVuZXQwOiBldGhlcm5ldEAyNDAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI0MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjQwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyOSAyIDMwIDIgMzQgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCXRiaS1oYW5kbGUgPSA8JnRiaTA+OwotCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQotCQkJbWRpb0A1MjAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItbWRpbyI7Ci0JCQkJcmVnID0gPDB4NTIwIDB4MjA+OwotCi0JCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewotCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQkJaW50ZXJydXB0cyA9IDwxMCAweDE+OwotCQkJCQlyZWcgPSA8MD47Ci0JCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7Ci0JCQkJfTsKLQkJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQlpbnRlcnJ1cHRzID0gPDEwIDB4MT47Ci0JCQkJCXJlZyA9IDwxPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQl9OwotCQkJCXRiaTA6IHRiaS1waHlAMTEgewotCQkJCQlyZWcgPSA8MHgxMT47Ci0JCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCWVuZXQxOiBldGhlcm5ldEAyNjAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI2MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjYwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwzMSAyIDMyIDIgMzMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCXRiaS1oYW5kbGUgPSA8JnRiaTE+OwotCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQotCQkJbWRpb0A1MjAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItdGJpIjsKLQkJCQlyZWcgPSA8MHg1MjAgMHgyMD47Ci0KLQkJCQl0YmkxOiB0YmktcGh5QDExIHsKLQkJCQkJcmVnID0gPDB4MTE+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQl1c2JAMmIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi11c2IyLWRyIiwgImZzbC11c2IyLWRyIjsKLQkJCXJlZyA9IDwweDJiMDAwIDB4MTAwMD47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDYwIDB4Mj47Ci0JCQlkcl9tb2RlID0gInBlcmlwaGVyYWwiOwotCQkJcGh5X3R5cGUgPSAidWxwaSI7Ci0JCX07Ci0KLQkJc2RoY2lAMmUwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1lc2RoYyIsICJmc2wsZXNkaGMiOwotCQkJcmVnID0gPDB4MmUwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NzIgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDI1MDAwMDAwMD47Ci0JCX07Ci0KLQkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4NDUwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQyIDB4Mj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCWNyeXB0b0AzMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzZWMzLjAiLCAiZnNsLHNlYzIuNCIsICJmc2wsc2VjMi4yIiwKLQkJCQkgICAgICJmc2wsc2VjMi4xIiwgImZzbCxzZWMyLjAiOwotCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQ1IDIgNTggMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWZzbCxudW0tY2hhbm5lbHMgPSA8ND47Ci0JCQlmc2wsY2hhbm5lbC1maWZvLWxlbiA9IDwyND47Ci0JCQlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4OWZlPjsKLQkJCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgzYWIwZWJmPjsKLQkJfTsKLQotCQlzYXRhQDE4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtc2F0YSIsICJmc2wscHEtc2F0YSI7Ci0JCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWludGVycnVwdHMgPSA8NzQgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCXNhdGFAMTkwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1zYXRhIiwgImZzbCxwcS1zYXRhIjsKLQkJCXJlZyA9IDwweDE5MDAwIDB4MTAwMD47Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJaW50ZXJydXB0cyA9IDw0MSAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CS8vZ2xvYmFsIHV0aWxpdGllcyBibG9jawotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1ndXRzIjsKLQkJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwotCQl9OwotCi0JCW1waWM6IHBpY0A0MDAwMCB7Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OwotCQkJY29tcGF0aWJsZSA9ICJjaHJwLG9wZW4tcGljIjsKLQkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKLQkJCWJpZy1lbmRpYW47Ci0JCX07Ci0KLQkJbXNpQDQxNjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtbXNpIiwgImZzbCxtcGljLW1zaSI7Ci0JCQlyZWcgPSA8MHg0MTYwMCAweDgwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAKLQkJCQkweGUxIDAKLQkJCQkweGUyIDAKLQkJCQkweGUzIDAKLQkJCQkweGU0IDAKLQkJCQkweGU1IDAKLQkJCQkweGU2IDAKLQkJCQkweGU3IDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07CiAJfTsKIAogCXBjaTA6IHBjaUBmZmUwODAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJcmVnID0gPDAgMHhmZmUwODAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHg4MDAwMDAwMCAwIDB4ODAwMDAwMDAgMCAweDEwMDAwMDAwCisJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDAgMHhmZmMwMDAwMCAwIDB4MDAwMTAwMDA+OworCQljbG9jay1mcmVxdWVuY3kgPSA8NjY2NjY2NjY+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJLyogSURTRUwgMHgxMSBKMTcgU2xvdCAxICovCi0JCQkweDg4MDAgMCAwIDEgJm1waWMgMSAxCi0JCQkweDg4MDAgMCAwIDIgJm1waWMgMiAxCi0JCQkweDg4MDAgMCAwIDMgJm1waWMgMyAxCi0JCQkweDg4MDAgMCAwIDQgJm1waWMgNCAxPjsKLQotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNCAweDI+OwotCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKLQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweDgwMDAwMDAwIDAgMHg4MDAwMDAwMCAwIDB4MTAwMDAwMDAKLQkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMCAweGZmYzAwMDAwIDAgMHgwMDAxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDw2NjY2NjY2Nj47Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDAgMHhmZmUwODAwMCAwIDB4MTAwMD47CisJCQkweDg4MDAgMCAwIDEgJm1waWMgMSAxIDAgMAorCQkJMHg4ODAwIDAgMCAyICZtcGljIDIgMSAwIDAKKwkJCTB4ODgwMCAwIDAgMyAmbXBpYyAzIDEgMCAwCisJCQkweDg4MDAgMCAwIDQgJm1waWMgNCAxIDAgMD47CiAJfTsKIAogCXBjaTE6IHBjaWVAZmZlMDkwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCXJlZyA9IDwwIDB4ZmZlMDkwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweDk4MDAwMDAwIDAgMHg5ODAwMDAwMCAwIDB4MDgwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMCAweGZmYzIwMDAwIDAgMHgwMDAxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDI1IDB4Mj47Ci0JCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwotCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJLyogSURTRUwgMHgwICovCi0JCQkwMDAwIDAgMCAxICZtcGljIDQgMQotCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEKLQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxCi0JCQkwMDAwIDAgMCA0ICZtcGljIDcgMQotCQkJPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4OTgwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweDk4MDAwMDAwCiAJCQkJICAwIDB4MDgwMDAwMDAKQEAgLTQ1MywzMSArNzEsMTAgQEAKIAl9OwogCiAJcGNpMjogcGNpZUBmZmUwYTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJcmVnID0gPDAgMHhmZmUwYTAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDB4ZmY+OwogCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4OTAwMDAwMDAgMCAweDkwMDAwMDAwIDAgMHgwODAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAwIDB4ZmZjMTAwMDAgMCAweDAwMDEwMDAwPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MjYgMHgyPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMCAwIDEgJm1waWMgMCAxCi0JCQkwMDAwIDAgMCAyICZtcGljIDEgMQotCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEKLQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxCi0JCQk+OwogCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHg5MDAwMDAwMAogCQkJCSAgMHgwMjAwMDAwMCAwIDB4OTAwMDAwMDAKIAkJCQkgIDAgMHgwODAwMDAwMApAQCAtNDg5LDMyICs4NiwxMCBAQAogCX07CiAKIAlwY2kzOiBwY2llQGZmZTBiMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwogCQlyZWcgPSA8MCAweGZmZTBiMDAwIDAgMHgxMDAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMHhmZj47CiAJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhhMDAwMDAwMCAwIDB4YTAwMDAwMDAgMCAweDIwMDAwMDAwCiAJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDAgMHhmZmMzMDAwMCAwIDB4MDAwMTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNyAweDI+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAwIDAgMSAmbXBpYyA4IDEKLQkJCTAwMDAgMCAwIDIgJm1waWMgOSAxCi0JCQkwMDAwIDAgMCAzICZtcGljIDEwIDEKLQkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMQotCQkJPjsKLQogCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhhMDAwMDAwMAogCQkJCSAgMHgwMjAwMDAwMCAwIDB4YTAwMDAwMDAKIAkJCQkgIDAgMHgyMDAwMDAwMApAQCAtNTI1LDMgKzEwMCw2IEBACiAJCX07CiAJfTsKIH07CisKKy9pbmNsdWRlLyAiZnNsL21wYzg1MzZzaS1wb3N0LmR0c2kiCisvaW5jbHVkZS8gIm1wYzg1MzZkcy5kdHNpIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1MzZkcy5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1MzZkcy5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjJlNGMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODUzNmRzLmR0c2kKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBNUEM4NTM2RFMgRGV2aWNlIFRyZWUgU291cmNlIHN0dWIgKG5vIGFkZHJlc3NlcyBvciB0b3AtbGV2ZWwgcmFuZ2VzKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCismYm9hcmRfc29jIHsKKwlpMmNAMzEwMCB7CisJCXJ0Y0A2OCB7CisJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczMyMzIiOworCQkJcmVnID0gPDB4Njg+OworCQkJaW50ZXJydXB0cyA9IDwwIDB4MSAwIDA+OworCQl9OworCX07CisKKwlzcGlANzAwMCB7CisJCWZsYXNoQDAgeworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCWNvbXBhdGlibGUgPSAic3BhbnNpb24sczI1c2wxMjgwMSI7CisJCQlyZWcgPSA8MD47CisJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw0MDAwMDAwMD47CisJCQlwYXJ0aXRpb25AdS1ib290IHsKKwkJCQlsYWJlbCA9ICJ1LWJvb3QiOworCQkJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAxMDAwMDA+OworCQkJCXJlYWQtb25seTsKKwkJCX07CisJCQlwYXJ0aXRpb25Aa2VybmVsIHsKKwkJCQlsYWJlbCA9ICJrZXJuZWwiOworCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDA1MDAwMDA+OworCQkJCXJlYWQtb25seTsKKwkJCX07CisJCQlwYXJ0aXRpb25AZHRiIHsKKwkJCQlsYWJlbCA9ICJkdGIiOworCQkJCXJlZyA9IDwweDAwNjAwMDAwIDB4MDAxMDAwMDA+OworCQkJCXJlYWQtb25seTsKKwkJCX07CisJCQlwYXJ0aXRpb25AZnMgeworCQkJCWxhYmVsID0gImZpbGUgc3lzdGVtIjsKKwkJCQlyZWcgPSA8MHgwMDcwMDAwMCAweDAwOTAwMDAwPjsKKwkJCX07CisJCX07CisJCWZsYXNoQDEgeworCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzMjVzbDEyODAxIjsKKwkJCXJlZyA9IDwxPjsKKwkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDAwPjsKKwkJfTsKKwkJZmxhc2hAMiB7CisJCQljb21wYXRpYmxlID0gInNwYW5zaW9uLHMyNXNsMTI4MDEiOworCQkJcmVnID0gPDI+OworCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OworCQl9OworCQlmbGFzaEAzIHsKKwkJCWNvbXBhdGlibGUgPSAic3BhbnNpb24sczI1c2wxMjgwMSI7CisJCQlyZWcgPSA8Mz47CisJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw0MDAwMDAwMD47CisJCX07CisJfTsKKworCXVzYkAyMjAwMCB7CisJCXBoeV90eXBlID0gInVscGkiOworCX07CisKKwl1c2JAMjMwMDAgeworCQlwaHlfdHlwZSA9ICJ1bHBpIjsKKwl9OworCisJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKKwkJdGJpLWhhbmRsZSA9IDwmdGJpMD47CisJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OworCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKKwl9OworCisJbWRpb0AyNDUyMCB7CisJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKKwkJCWludGVycnVwdHMgPSA8MTAgMHgxIDAgMD47CisJCQlyZWcgPSA8MD47CisJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQl9OworCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CisJCQlpbnRlcnJ1cHRzID0gPDEwIDB4MSAwIDA+OworCQkJcmVnID0gPDE+OworCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJfTsKKwkJdGJpMDogdGJpLXBoeUAxMSB7CisJCQlyZWcgPSA8MHgxMT47CisJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKKwkJfTsKKwl9OworCisJZW5ldDI6IGV0aGVybmV0QDI2MDAwIHsKKwkJdGJpLWhhbmRsZSA9IDwmdGJpMT47CisJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OworCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKKwl9OworCisJbWRpb0AyNjUyMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci10YmkiOworCQlyZWcgPSA8MHgyNjUyMCAweDIwPjsKKworCQl0YmkxOiB0YmktcGh5QDExIHsKKwkJCXJlZyA9IDwweDExPjsKKwkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQl9OworCX07CisKKwl1c2JAMmIwMDAgeworCQlkcl9tb2RlID0gInBlcmlwaGVyYWwiOworCQlwaHlfdHlwZSA9ICJ1bHBpIjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTM2ZHNfMzZiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTM2ZHNfMzZiLmR0cwppbmRleCBkOTViMjYwLi44ZjRiOTI5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODUzNmRzXzM2Yi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1MzZkc18zNmIuZHRzCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIE1QQzg1MzYgRFMgRGV2aWNlIFRyZWUgU291cmNlCisgKiBNUEM4NTM2RFMgRGV2aWNlIFRyZWUgU291cmNlICgzNi1iaXQgYWRkcmVzcyBtYXApCiAgKgogICogQ29weXJpZ2h0IDIwMDgtMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jLgogICoKQEAgLTksMjQgKzksMTEgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gImZzbC9tcGM4NTM2c2ktcHJlLmR0c2kiCiAKIC8gewogCW1vZGVsID0gImZzbCxtcGM4NTM2ZHMiOwogCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzZkcyI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JI3NpemUtY2VsbHMgPSA8Mj47Ci0KLQlhbGlhc2VzIHsKLQkJZXRoZXJuZXQwID0gJmVuZXQwOwotCQlldGhlcm5ldDEgPSAmZW5ldDE7Ci0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlwY2kwID0gJnBjaTA7Ci0JCXBjaTEgPSAmcGNpMTsKLQkJcGNpMiA9ICZwY2kyOwotCQlwY2kzID0gJnBjaTM7Ci0JfTsKIAogCWNwdXMgewogCQkjY3B1cyA9IDwxPjsKQEAgLTQ1LDM1MSArMzIsMzQgQEAKIAkJcmVnID0gPDAgMCAwIDA+OwkvLyBGaWxsZWQgYnkgVS1Cb290CiAJfTsKIAotCXNvY0BmZmZlMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWRldmljZV90eXBlID0gInNvYyI7Ci0JCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7Ci0JCXJhbmdlcyA9IDwweDAgMHhmIDB4ZmZlMDAwMDAgMHgxMDAwMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KLQotCQllY20tbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MTI+OwotCQl9OwotCi0JCWVjbUAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZWNtIiwgImZzbCxlY20iOwotCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1tZW1vcnktY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTggMHgyPjsKLQkJfTsKLQotCQlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWwyLWNhY2hlLWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAweDI+OwotCQl9OwotCi0JCWkyY0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MyAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMzEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZGZzcnI7Ci0JCQlydGNANjggewotCQkJCWNvbXBhdGlibGUgPSAiZGFsbGFzLGRzMzIzMiI7Ci0JCQkJcmVnID0gPDB4Njg+OwotCQkJCWludGVycnVwdHMgPSA8MCAweDE+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJfTsKLQkJfTsKLQotCQlkbWFAMjEzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHgyMTMwMCA0PjsKLQkJCXJhbmdlcyA9IDwwIDB4MjExMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZG1hLWNoYW5uZWwiLAotCQkJCQkgICAgICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjAgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1MzYtZG1hLWNoYW5uZWwiLAotCQkJCQkgICAgICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIxIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1kbWEtY2hhbm5lbCIsCi0JCQkJCSAgICAgImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIyIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1kbWEtY2hhbm5lbCIsCi0JCQkJCSAgICAgImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIzIDI+OwotCQkJfTsKLQkJfTsKLQotCQl1c2JAMjIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi11c2IyLW1waCIsICJmc2wtdXNiMi1tcGgiOwotCQkJcmVnID0gPDB4MjIwMDAgMHgxMDAwPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MjggMHgyPjsKLQkJCXBoeV90eXBlID0gInVscGkiOwotCQl9OwotCi0JCXVzYkAyMzAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LXVzYjItbXBoIiwgImZzbC11c2IyLW1waCI7Ci0JCQlyZWcgPSA8MHgyMzAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDw0NiAweDI+OwotCQkJcGh5X3R5cGUgPSAidWxwaSI7Ci0JCX07Ci0KLQkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwotCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwPjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyNDAwMCAweDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDI5IDIgMzAgMiAzNCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJdGJpLWhhbmRsZSA9IDwmdGJpMD47Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKLQkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCi0JCQltZGlvQDUyMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci1tZGlvIjsKLQkJCQlyZWcgPSA8MHg1MjAgMHgyMD47Ci0KLQkJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQlpbnRlcnJ1cHRzID0gPDEwIDB4MT47Ci0JCQkJCXJlZyA9IDwwPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQl9OwotCQkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKLQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJCWludGVycnVwdHMgPSA8MTAgMHgxPjsKLQkJCQkJcmVnID0gPDE+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwotCQkJCX07Ci0JCQkJdGJpMDogdGJpLXBoeUAxMSB7Ci0JCQkJCXJlZyA9IDwweDExPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJZW5ldDE6IGV0aGVybmV0QDI2MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwotCQkJcmVnID0gPDB4MjYwMDAgMHgxMDAwPjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyNjAwMCAweDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDMxIDIgMzIgMiAzMyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJdGJpLWhhbmRsZSA9IDwmdGJpMT47Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKLQkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCi0JCQltZGlvQDUyMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci10YmkiOwotCQkJCXJlZyA9IDwweDUyMCAweDIwPjsKLQotCQkJCXRiaTE6IHRiaS1waHlAMTEgewotCQkJCQlyZWcgPSA8MHgxMT47Ci0JCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCXVzYkAyYjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LXVzYjItZHIiLCAiZnNsLXVzYjItZHIiOwotCQkJcmVnID0gPDB4MmIwMDAgMHgxMDAwPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8NjAgMHgyPjsKLQkJCWRyX21vZGUgPSAicGVyaXBoZXJhbCI7Ci0JCQlwaHlfdHlwZSA9ICJ1bHBpIjsKLQkJfTsKLQotCQlzZGhjaUAyZTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LWVzZGhjIiwgImZzbCxlc2RoYyI7Ci0JCQlyZWcgPSA8MHgyZTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw3MiAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MjUwMDAwMDAwPjsKLQkJfTsKLQotCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MiAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJY3J5cHRvQDMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYzMuMCIsICJmc2wsc2VjMi40IiwgImZzbCxzZWMyLjIiLAotCQkJCSAgICAgImZzbCxzZWMyLjEiLCAiZnNsLHNlYzIuMCI7Ci0JCQlyZWcgPSA8MHgzMDAwMCAweDEwMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NDUgMiA1OCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZnNsLG51bS1jaGFubmVscyA9IDw0PjsKLQkJCWZzbCxjaGFubmVsLWZpZm8tbGVuID0gPDI0PjsKLQkJCWZzbCxleGVjLXVuaXRzLW1hc2sgPSA8MHg5ZmU+OwotCQkJZnNsLGRlc2NyaXB0b3ItdHlwZXMtbWFzayA9IDwweDNhYjBlYmY+OwotCQl9OwotCi0JCXNhdGFAMTgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1zYXRhIiwgImZzbCxwcS1zYXRhIjsKLQkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJaW50ZXJydXB0cyA9IDw3NCAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJc2F0YUAxOTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LXNhdGEiLCAiZnNsLHBxLXNhdGEiOwotCQkJcmVnID0gPDB4MTkwMDAgMHgxMDAwPjsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQlpbnRlcnJ1cHRzID0gPDQxIDB4Mj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLy9nbG9iYWwgdXRpbGl0aWVzIGJsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiOwotCQkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKLQkJCWZzbCxoYXMtcnN0Y3I7Ci0JCX07Ci0KLQkJbXBpYzogcGljQDQwMDAwIHsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQkJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47Ci0JCQljb21wYXRpYmxlID0gImNocnAsb3Blbi1waWMiOwotCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOwotCQkJYmlnLWVuZGlhbjsKLQkJfTsKLQotCQltc2lANDE2MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1tc2kiLCAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4ODA+OwotCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTB4ZTAgMAotCQkJCTB4ZTEgMAotCQkJCTB4ZTIgMAotCQkJCTB4ZTMgMAotCQkJCTB4ZTQgMAotCQkJCTB4ZTUgMAotCQkJCTB4ZTYgMAotCQkJCTB4ZTcgMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKKwlsYmM6IGxvY2FsYnVzQGZmZTA1MDAwIHsKKwkJcmVnID0gPDAgMHhmZmUwNTAwMCAwIDB4MTAwMD47CiAJfTsKIAotCXBjaTA6IHBjaUBmZmZlMDgwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLXBjaSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7CisJYm9hcmRfc29jOiBzb2M6IHNvY0BmZmZlMDAwMDAgeworCQlyYW5nZXMgPSA8MHgwIDB4ZiAweGZmZTAwMDAwIDB4MTAwMDAwPjsKKwl9OworCisJcGNpMDogcGNpQGZmZTA4MDAwIHsKKwkJcmVnID0gPDB4ZiAweGZmZTA4MDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGYwMDAwMDAwIDB4YyAweDAwMDAwMDAwIDAgMHgxMDAwMDAwMAorCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmZmMwMDAwMCAwIDB4MDAwMTAwMDA+OworCQljbG9jay1mcmVxdWVuY3kgPSA8NjY2NjY2NjY+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJLyogSURTRUwgMHgxMSBKMTcgU2xvdCAxICovCi0JCQkweDg4MDAgMCAwIDEgJm1waWMgMSAxCi0JCQkweDg4MDAgMCAwIDIgJm1waWMgMiAxCi0JCQkweDg4MDAgMCAwIDMgJm1waWMgMyAxCi0JCQkweDg4MDAgMCAwIDQgJm1waWMgNCAxPjsKLQotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNCAweDI+OwotCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKLQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGYwMDAwMDAwIDB4YyAweDAwMDAwMDAwIDAgMHgxMDAwMDAwMAotCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmZmMwMDAwMCAwIDB4MDAwMTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8NjY2NjY2NjY+OwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwweGYgMHhmZmUwODAwMCAwIDB4MTAwMD47CisJCQkweDg4MDAgMCAwIDEgJm1waWMgMSAxIDAgMAorCQkJMHg4ODAwIDAgMCAyICZtcGljIDIgMSAwIDAKKwkJCTB4ODgwMCAwIDAgMyAmbXBpYyAzIDEgMCAwCisJCQkweDg4MDAgMCAwIDQgJm1waWMgNCAxIDAgMD47CiAJfTsKIAotCXBjaTE6IHBjaWVAZmZmZTA5MDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCXBjaTE6IHBjaWVAZmZlMDkwMDAgewogCQlyZWcgPSA8MHhmIDB4ZmZlMDkwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGY4MDAwMDAwIDB4YyAweDE4MDAwMDAwIDAgMHgwODAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmZmMyMDAwMCAwIDB4MDAwMTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNSAweDI+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAwIDAgMSAmbXBpYyA0IDEKLQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxCi0JCQkwMDAwIDAgMCAzICZtcGljIDYgMQotCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEKLQkJCT47CiAJCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MCAwIDAgMCAwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGY4MDAwMDAwCiAJCQkJICAweDAyMDAwMDAwIDAgMHhmODAwMDAwMAogCQkJCSAgMCAweDA4MDAwMDAwCkBAIC00MDEsMzEgKzcxLDEwIEBACiAJfTsKIAogCXBjaTI6IHBjaWVAZmZmZTBhMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwogCQlyZWcgPSA8MHhmIDB4ZmZlMGEwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGY4MDAwMDAwIDB4YyAweDEwMDAwMDAwIDAgMHgwODAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmZmMxMDAwMCAwIDB4MDAwMTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNiAweDI+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAwIDAgMSAmbXBpYyAwIDEKLQkJCTAwMDAgMCAwIDIgJm1waWMgMSAxCi0JCQkwMDAwIDAgMCAzICZtcGljIDIgMQotCQkJMDAwMCAwIDAgNCAmbXBpYyAzIDEKLQkJCT47CiAJCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MCAwIDAgMCAwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGY4MDAwMDAwCiAJCQkJICAweDAyMDAwMDAwIDAgMHhmODAwMDAwMAogCQkJCSAgMCAweDA4MDAwMDAwCkBAIC00MzcsMzIgKzg2LDEwIEBACiAJfTsKIAogCXBjaTM6IHBjaWVAZmZmZTBiMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwogCQlyZWcgPSA8MHhmIDB4ZmZlMGIwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAweGZmPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDIwMDAwMDAwIDAgMHgyMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmZmMzMDAwMCAwIDB4MDAwMTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNyAweDI+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAwIDAgMSAmbXBpYyA4IDEKLQkJCTAwMDAgMCAwIDIgJm1waWMgOSAxCi0JCQkwMDAwIDAgMCAzICZtcGljIDEwIDEKLQkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMQotCQkJPjsKLQogCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAogCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDAgMHgyMDAwMDAwMApAQCAtNDczLDMgKzEwMCw2IEBACiAJCX07CiAJfTsKIH07CisKKy9pbmNsdWRlLyAiZnNsL21wYzg1MzZzaS1wb3N0LmR0c2kiCisvaW5jbHVkZS8gIm1wYzg1MzZkcy5kdHNpIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDBhZHMuZHRzCmluZGV4IDhkMWJmMGYuLmY5OWZiMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQwYWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MGFkcy5kdHMKQEAgLTI0Myw3ICsyNDMsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47IAkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpAQCAtMjUzLDcgKzI1Myw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwogCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQxY2RzLmR0cwppbmRleCA4N2ZmOTY1Li4wZjVlOTM5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0MWNkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDFjZHMuZHRzCkBAIC0yMDksNyArMjA5LDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwogCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKQEAgLTIxOSw3ICsyMTksNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KIAkJCWludGVycnVwdHMgPSA8NDIgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0NGRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCmluZGV4IGQ3OTM5NjguLmU5MzQ5ODcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzCkBAIC05LDMzOSArOSw1MiBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAiZnNsL21wYzg1NDRzaS1wcmUuZHRzaSIKKwogLyB7CiAJbW9kZWwgPSAiTVBDODU0NERTIjsKIAljb21wYXRpYmxlID0gIk1QQzg1NDREUyIsICJNUEM4NXh4RFMiOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwotCi0JYWxpYXNlcyB7Ci0JCWV0aGVybmV0MCA9ICZlbmV0MDsKLQkJZXRoZXJuZXQxID0gJmVuZXQxOwotCQlzZXJpYWwwID0gJnNlcmlhbDA7Ci0JCXNlcmlhbDEgPSAmc2VyaWFsMTsKLQkJcGNpMCA9ICZwY2kwOwotCQlwY2kxID0gJnBjaTE7Ci0JCXBjaTIgPSAmcGNpMjsKLQkJcGNpMyA9ICZwY2kzOwotCX07Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsODU0NEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MHgwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDgwMDA+OwkJLy8gTDEsIDMySwotCQkJaS1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47Ci0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwotCQl9OwotCX07CiAKIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlyZWcgPSA8MHgwIDB4MD47CS8vIEZpbGxlZCBieSBVLUJvb3QKKwkJcmVnID0gPDAgMCAwIDA+OwkvLyBGaWxsZWQgYnkgVS1Cb290CiAJfTsKIAotCXNvYzg1NDRAZTAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWRldmljZV90eXBlID0gInNvYyI7Ci0JCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJbGJjOiBsb2NhbGJ1c0BlMDAwNTAwMCB7CisJCXJlZyA9IDwwIDB4ZTAwMDUwMDAgMCAweDEwMDA+OworCX07CiAKLQkJcmFuZ2VzID0gPDB4MCAweGUwMDAwMDAwIDB4MTAwMDAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZpbGxlZCBvdXQgYnkgdWJvb3QuCi0KLQkJZWNtLWxhd0AwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOwotCQkJcmVnID0gPDB4MCAweDEwMDA+OwotCQkJZnNsLG51bS1sYXdzID0gPDEwPjsKLQkJfTsKLQotCQllY21AMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ0LWVjbSIsICJmc2wsZWNtIjsKLQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTcgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDQtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwotCQl9OwotCi0JCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDQtbDItY2FjaGUtY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OwotCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWNhY2hlLXNpemUgPSA8MHg0MDAwMD47CS8vIEwyLCAyNTZLCi0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCX07Ci0KLQkJaTJjQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMzEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWRtYUAyMTMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0NC1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKLQkJCXJlZyA9IDwweDIxMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjExMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDQtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMCAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0NC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMSAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDQtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIyIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0NC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjMgMj47Ci0JCQl9OwotCQl9OwotCi0JCWVuZXQwOiBldGhlcm5ldEAyNDAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwotCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwPjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyNDAwMCAweDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDI5IDIgMzAgMiAzNCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47Ci0JCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKLQkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCi0JCQltZGlvQDUyMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci1tZGlvIjsKLQkJCQlyZWcgPSA8MHg1MjAgMHgyMD47Ci0KLQkJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQlpbnRlcnJ1cHRzID0gPDEwIDE+OwotCQkJCQlyZWcgPSA8MHgwPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQl9OwotCQkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKLQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJCWludGVycnVwdHMgPSA8MTAgMT47Ci0JCQkJCXJlZyA9IDwweDE+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwotCQkJCX07Ci0KLQkJCQl0YmkwOiB0YmktcGh5QDExIHsKLQkJCQkJcmVnID0gPDB4MTE+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQllbmV0MTogZXRoZXJuZXRAMjYwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gIlRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI2MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjYwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwzMSAyIDMyIDIgMzMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwotCQkJdGJpLWhhbmRsZSA9IDwmdGJpMT47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQotCQkJbWRpb0A1MjAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItdGJpIjsKLQkJCQlyZWcgPSA8MHg1MjAgMHgyMD47Ci0KLQkJCQl0YmkxOiB0YmktcGh5QDExIHsKLQkJCQkJcmVnID0gPDB4MTE+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLy9nbG9iYWwgdXRpbGl0aWVzIGJsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiOwotCQkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKLQkJCWZzbCxoYXMtcnN0Y3I7Ci0JCX07Ci0KLQkJY3J5cHRvQDMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYzIuMSIsICJmc2wsc2VjMi4wIjsKLQkJCXJlZyA9IDwweDMwMDAwIDB4MTAwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0NSAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZnNsLG51bS1jaGFubmVscyA9IDw0PjsKLQkJCWZzbCxjaGFubmVsLWZpZm8tbGVuID0gPDI0PjsKLQkJCWZzbCxleGVjLXVuaXRzLW1hc2sgPSA8MHhmZT47Ci0JCQlmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrID0gPDB4MTJiMGViZj47Ci0JCX07Ci0KLQkJbXBpYzogcGljQDQwMDAwIHsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQkJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47Ci0JCQljb21wYXRpYmxlID0gImNocnAsb3Blbi1waWMiOwotCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOwotCQl9OwotCi0JCW1zaUA0MTYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ0LW1zaSIsICJmc2wsbXBpYy1tc2kiOwotCQkJcmVnID0gPDB4NDE2MDAgMHg4MD47Ci0JCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8Ci0JCQkJMHhlMCAwCi0JCQkJMHhlMSAwCi0JCQkJMHhlMiAwCi0JCQkJMHhlMyAwCi0JCQkJMHhlNCAwCi0JCQkJMHhlNSAwCi0JCQkJMHhlNiAwCi0JCQkJMHhlNyAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OworCWJvYXJkX3NvYzogc29jOiBzb2M4NTQ0QGUwMDAwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MCAweDAgMHhlMDAwMDAwMCAweDEwMDAwMD47CiAJfTsKIAogCXBjaTA6IHBjaUBlMDAwODAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJcmVnID0gPDAgMHhlMDAwODAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAgMCAweGMwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZTEwMDAwMDAgMHgwIDB4MTAwMDA+OworCQljbG9jay1mcmVxdWVuY3kgPSA8NjY2NjY2NjY+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJLyogSURTRUwgMHgxMSBKMTcgU2xvdCAxICovCi0JCQkweDg4MDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MQotCQkJMHg4ODAwIDB4MCAweDAgMHgyICZtcGljIDB4MyAweDEKLQkJCTB4ODgwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxCi0JCQkweDg4MDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MQorCQkJMHg4ODAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEgMCAwCisJCQkweDg4MDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MSAwIDAKKwkJCTB4ODgwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxIDAgMAorCQkJMHg4ODAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEgMCAwCiAKIAkJCS8qIElEU0VMIDB4MTIgSjE2IFNsb3QgMiAqLwogCi0JCQkweDkwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MQotCQkJMHg5MDAwIDB4MCAweDAgMHgyICZtcGljIDB4NCAweDEKLQkJCTB4OTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCi0JCQkweDkwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MT47Ci0KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MjQgMj47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47Ci0JCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAgMHhjMDAwMDAwMCAweDAgMHgyMDAwMDAwMAotCQkJICAweDEwMDAwMDAgMHgwIDB4MCAweGUxMDAwMDAwIDB4MCAweDEwMDAwPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDY2NjY2NjY2PjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhlMDAwODAwMCAweDEwMDA+OworCQkJMHg5MDAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEgMCAwCisJCQkweDkwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MSAwIDAKKwkJCTB4OTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxIDAgMAorCQkJMHg5MDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEgMCAwPjsKIAl9OwogCiAJcGNpMTogcGNpZUBlMDAwOTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZTAwMDkwMDAgMHgxMDAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMjU1PjsKLQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDB4MCAweDIwMDAwMDAwCi0JCQkgIDB4MTAwMDAwMCAweDAgMHgwIDB4ZTEwMTAwMDAgMHgwIDB4MTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNSAyPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHg0IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDUgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4NiAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHg3IDB4MQotCQkJPjsKKwkJcmVnID0gPDB4MCAweGUwMDA5MDAwIDB4MCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDAgMHg4MDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGUxMDEwMDAwIDB4MCAweDEwMDAwPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtMzUzLDMxICs2NiwxMCBAQAogCX07CiAKIAlwY2kyOiBwY2llQGUwMDBhMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhlMDAwYTAwMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwotCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDB4YTAwMDAwMDAgMHgwIDB4MTAwMDAwMDAKLQkJCSAgMHgxMDAwMDAwIDB4MCAweDAgMHhlMTAyMDAwMCAweDAgMHgxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDI2IDI+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgyIDB4MQotCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxCi0JCQk+OworCQlyZWcgPSA8MHgwIDB4ZTAwMGEwMDAgMHgwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMCAweGEwMDAwMDAwIDB4MCAweDEwMDAwMDAwCisJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZTEwMjAwMDAgMHgwIDB4MTAwMDA+OwogCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCiAJCQkJICAweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAKIAkJCQkgIDB4MCAweDEwMDAwMDAwCkBAIC0zODgsNDQgKzgwLDExIEBACiAJCX07CiAJfTsKIAotCXBjaTM6IHBjaWVAZTAwMGIwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwweGUwMDBiMDAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47Ci0JCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YjAwMDAwMDAgMHhiMDAwMDAwMCAweDAgMHgxMDAwMDAKLQkJCSAgMHgxMDAwMDAwIDB4MCAweDAgMHhiMDEwMDAwMCAweDAgMHgxMDAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNyAyPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZmYwMCAweDAgMHgwIDB4MT47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvLyBJRFNFTCAweDFjICBVU0IKLQkJCTB4ZTAwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHhjIDB4MgotCQkJMHhlMTAwIDB4MCAweDAgMHgyICZpODI1OSAweDkgMHgyCi0JCQkweGUyMDAgMHgwIDB4MCAweDMgJmk4MjU5IDB4YSAweDIKLQkJCTB4ZTMwMCAweDAgMHgwIDB4NCAmaTgyNTkgMHhiIDB4MgotCi0JCQkvLyBJRFNFTCAweDFkICBBdWRpbwotCQkJMHhlODAwIDB4MCAweDAgMHgxICZpODI1OSAweDYgMHgyCi0KLQkJCS8vIElEU0VMIDB4MWUgTGVnYWN5Ci0JCQkweGYwMDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4NyAweDIKLQkJCTB4ZjEwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg3IDB4MgotCi0JCQkvLyBJRFNFTCAweDFmIElERS9TQVRBCi0JCQkweGY4MDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4ZSAweDIKLQkJCTB4ZjkwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg1IDB4MgotCQk+OwotCisJYm9hcmRfcGNpMzogcGNpMzogcGNpZUBlMDAwYjAwMCB7CisJCXJlZyA9IDwweDAgMHhlMDAwYjAwMCAweDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhiMDAwMDAwMCAwIDB4YjAwMDAwMDAgMHgwIDB4MTAwMDAwCisJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4YjAxMDAwMDAgMHgwIDB4MTAwMDAwPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhiMDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweGIwMDAwMDAwCiAJCQkJICAweDAgMHgxMDAwMDAKQEAgLTQzMyw3MCArOTIsMTQgQEAKIAkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCiAJCQkJICAweDEwMDAwMDAgMHgwIDB4MAogCQkJCSAgMHgwIDB4MTAwMDAwPjsKLQotCQkJdWxpMTU3NUAwIHsKLQkJCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhiMDAwMDAwMAotCQkJCQkgIDB4MjAwMDAwMCAweDAgMHhiMDAwMDAwMAotCQkJCQkgIDB4MCAweDEwMDAwMAotCi0JCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKLQkJCQkJICAweDEwMDAwMDAgMHgwIDB4MAotCQkJCQkgIDB4MCAweDEwMDAwMD47Ci0JCQkJaXNhQDFlIHsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiaXNhIjsKLQkJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkJCQlyZWcgPSA8MHhmMDAwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkJCXJhbmdlcyA9IDwweDEgMHgwCi0JCQkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJCQkgIDB4MTAwMD47Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jmk4MjU5PjsKLQotCQkJCQlpODI1OTogaW50ZXJydXB0LWNvbnRyb2xsZXJAMjAgewotCQkJCQkJcmVnID0gPDB4MSAweDIwIDB4MgotCQkJCQkJICAgICAgIDB4MSAweGEwIDB4MgotCQkJCQkJICAgICAgIDB4MSAweDRkMCAweDI+OwotCQkJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkJCQlkZXZpY2VfdHlwZSA9ICJpbnRlcnJ1cHQtY29udHJvbGxlciI7Ci0JCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJCQljb21wYXRpYmxlID0gImNocnAsaWljIjsKLQkJCQkJCWludGVycnVwdHMgPSA8OSAyPjsKLQkJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQl9OwotCi0JCQkJCWk4MDQyQDYwIHsKLQkJCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJCQlyZWcgPSA8MHgxIDB4NjAgMHgxIDB4MSAweDY0IDB4MT47Ci0JCQkJCQlpbnRlcnJ1cHRzID0gPDEgMyAxMiAzPjsKLQkJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jmk4MjU5PjsKLQotCQkJCQkJa2V5Ym9hcmRAMCB7Ci0JCQkJCQkJcmVnID0gPDB4MD47Ci0JCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsMzAzIjsKLQkJCQkJCX07Ci0KLQkJCQkJCW1vdXNlQDEgewotCQkJCQkJCXJlZyA9IDwweDE+OwotCQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGYwMyI7Ci0JCQkJCQl9OwotCQkJCQl9OwotCi0JCQkJCXJ0Y0A3MCB7Ci0JCQkJCQljb21wYXRpYmxlID0gInBucFBOUCxiMDAiOwotCQkJCQkJcmVnID0gPDB4MSAweDcwIDB4Mj47Ci0JCQkJCX07Ci0KLQkJCQkJZ3Bpb0A0MDAgewotCQkJCQkJcmVnID0gPDB4MSAweDQwMCAweDgwPjsKLQkJCQkJfTsKLQkJCQl9OwotCQkJfTsKIAkJfTsKIAl9OwogfTsKKworLyoKKyAqIG1wYzg1NDRkcy5kdHNpIG11c3QgYmUgbGFzdCB0byBlbnN1cmUgYm9hcmRfcGNpMyBvdmVycmlkZXMgcGNpMyBzZXR0aW5ncworICogZm9yIGludGVycnVwdC1tYXAgJiBpbnRlcnJ1cHQtbWFwLW1hc2sKKyAqLworCisvaW5jbHVkZS8gImZzbC9tcGM4NTQ0c2ktcG9zdC5kdHNpIgorL2luY2x1ZGUvICJtcGM4NTQ0ZHMuZHRzaSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ0ZHMuZHRzaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBmNjRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDRkcy5kdHNpCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogTVBDODU0NERTIERldmljZSBUcmVlIFNvdXJjZSBzdHViIChubyBhZGRyZXNzZXMgb3IgdG9wLWxldmVsIHJhbmdlcykKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmJvYXJkX3NvYyB7CisJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKKwkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CisJCXRiaS1oYW5kbGUgPSA8JnRiaTA+OworCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKKwl9OworCisJbWRpb0AyNDUyMCB7CisJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKKwkJCWludGVycnVwdHMgPSA8MTAgMSAwIDA+OworCQkJcmVnID0gPDB4MD47CisJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQl9OworCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CisJCQlpbnRlcnJ1cHRzID0gPDEwIDEgMCAwPjsKKwkJCXJlZyA9IDwweDE+OworCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJfTsKKworCQl0YmkwOiB0YmktcGh5QDExIHsKKwkJCXJlZyA9IDwweDExPjsKKwkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQl9OworCX07CisKKwllbmV0MjogZXRoZXJuZXRAMjYwMDAgeworCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKKwkJdGJpLWhhbmRsZSA9IDwmdGJpMT47CisJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOworCX07CisKKwltZGlvQDI2NTIwIHsKKwkJdGJpMTogdGJpLXBoeUAxMSB7CisJCQlyZWcgPSA8MHgxMT47CisJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKKwkJfTsKKwl9OworfTsKKworJmJvYXJkX3BjaTMgeworCXBjaWVAMCB7CisJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGZmMDAgMHgwIDB4MCAweDc+OworCQlpbnRlcnJ1cHQtbWFwID0gPAorCQkJLy8gSURTRUwgMHgxYyAgVVNCCisJCQkweGUwMDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4YyAweDIKKwkJCTB4ZTEwMCAweDAgMHgwIDB4MiAmaTgyNTkgMHg5IDB4MgorCQkJMHhlMjAwIDB4MCAweDAgMHgzICZpODI1OSAweGEgMHgyCisJCQkweGUzMDAgMHgwIDB4MCAweDQgJmk4MjU5IDB4YiAweDIKKworCQkJLy8gSURTRUwgMHgxZCAgQXVkaW8KKwkJCTB4ZTgwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg2IDB4MgorCisJCQkvLyBJRFNFTCAweDFlIExlZ2FjeQorCQkJMHhmMDAwIDB4MCAweDAgMHgxICZpODI1OSAweDcgMHgyCisJCQkweGYxMDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4NyAweDIKKworCQkJLy8gSURTRUwgMHgxZiBJREUvU0FUQQorCQkJMHhmODAwIDB4MCAweDAgMHgxICZpODI1OSAweGUgMHgyCisJCQkweGY5MDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4NSAweDIKKwkJCT47CisKKworCQl1bGkxNTc1QDAgeworCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwkJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YjAwMDAwMDAKKwkJCQkgIDB4MjAwMDAwMCAweDAgMHhiMDAwMDAwMAorCQkJCSAgMHgwIDB4MTAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDAwPjsKKwkJCWlzYUAxZSB7CisJCQkJZGV2aWNlX3R5cGUgPSAiaXNhIjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJCXJlZyA9IDwweGYwMDAgMHgwIDB4MCAweDAgMHgwPjsKKwkJCQlyYW5nZXMgPSA8MHgxIDB4MCAweDEwMDAwMDAgMHgwIDB4MAorCQkJCQkgIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaTgyNTk+OworCisJCQkJaTgyNTk6IGludGVycnVwdC1jb250cm9sbGVyQDIwIHsKKwkJCQkJcmVnID0gPDB4MSAweDIwIDB4MgorCQkJCQkgICAgICAgMHgxIDB4YTAgMHgyCisJCQkJCSAgICAgICAweDEgMHg0ZDAgMHgyPjsKKwkJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJCWRldmljZV90eXBlID0gImludGVycnVwdC1jb250cm9sbGVyIjsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQkJCWNvbXBhdGlibGUgPSAiY2hycCxpaWMiOworCQkJCQlpbnRlcnJ1cHRzID0gPDkgMiAwIDA+OworCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQl9OworCisJCQkJaTgwNDJANjAgeworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCXJlZyA9IDwweDEgMHg2MCAweDEgMHgxIDB4NjQgMHgxPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwxIDMgMTIgMz47CisJCQkJCWludGVycnVwdC1wYXJlbnQgPQorCQkJCQkJPCZpODI1OT47CisKKwkJCQkJa2V5Ym9hcmRAMCB7CisJCQkJCQlyZWcgPSA8MHgwPjsKKwkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLDMwMyI7CisJCQkJCX07CisKKwkJCQkJbW91c2VAMSB7CisJCQkJCQlyZWcgPSA8MHgxPjsKKwkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGYwMyI7CisJCQkJCX07CisJCQkJfTsKKworCQkJCXJ0Y0A3MCB7CisJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGIwMCI7CisJCQkJCXJlZyA9IDwweDEgMHg3MCAweDI+OworCQkJCX07CisKKwkJCQlncGlvQDQwMCB7CisJCQkJCXJlZyA9IDwweDEgMHg0MDAgMHg4MD47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU0OGNkcy5kdHMKaW5kZXggYTE3YTU1Ny4uMDdiOGRhZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NDhjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTQ4Y2RzLmR0cwpAQCAtOSwxMyArOSwxMSBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAiZnNsL21wYzg1NDhzaS1wcmUuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiTVBDODU0OENEUyI7CiAJY29tcGF0aWJsZSA9ICJNUEM4NTQ4Q0RTIiwgIk1QQzg1eHhDRFMiOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwogCiAJYWxpYXNlcyB7CiAJCWV0aGVybmV0MCA9ICZlbmV0MDsKQEAgLTI5LDc2ICsyNywxOSBAQAogCQlwY2kyID0gJnBjaTI7CiAJfTsKIAotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyw4NTQ4QDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwweDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwotCQkJZC1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg4MDAwPjsJCS8vIEwxLCAzMksKLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsJLy8gIDMzIE1IeiwgZnJvbSB1Ym9vdAotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJLy8gMTY2IE1IegotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkvLyA4MjUgTUh6LCBmcm9tIHVib290Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47Ci0JCX07Ci0JfTsKLQogCW1lbW9yeSB7CiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCXJlZyA9IDwweDAgMHg4MDAwMDAwPjsJLy8gMTI4TSBhdCAweDAKKwkJcmVnID0gPDAgMCAweDAgMHg4MDAwMDAwPjsJLy8gMTI4TSBhdCAweDAKIAl9OwogCi0Jc29jODU0OEBlMDAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKLQkJcmFuZ2VzID0gPDB4MCAweGUwMDAwMDAwIDB4MTAwMDAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKKwlsYmM6IGxvY2FsYnVzQGUwMDA1MDAwIHsKKwkJcmVnID0gPDAgMHhlMDAwNTAwMCAwIDB4MTAwMD47CisJfTsKIAotCQllY20tbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MTA+OwotCQl9OwotCi0JCWVjbUAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtZWNtIiwgImZzbCxlY20iOwotCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1tZW1vcnktY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTggMj47Ci0JCX07Ci0KLQkJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1sMi1jYWNoZS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47Ci0JCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwotCQkJY2FjaGUtc2l6ZSA9IDwweDgwMDAwPjsJLy8gTDIsIDUxMksKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJfTsKKwlzb2M6IHNvYzg1NDhAZTAwMDAwMDAgeworCQlyYW5nZXMgPSA8MCAweDAgMHhlMDAwMDAwMCAweDEwMDAwMD47CiAKIAkJaTJjQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKLQogCQkJZWVwcm9tQDUwIHsKIAkJCQljb21wYXRpYmxlID0gImF0bWVsLDI0YzY0IjsKIAkJCQlyZWcgPSA8MHg1MD47CkBAIC0xMTYsMzUxICs1NywxNzggQEAKIAkJfTsKIAogCQlpMmNAMzEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWRmc3JyOwotCiAJCQllZXByb21ANTAgewogCQkJCWNvbXBhdGlibGUgPSAiYXRtZWwsMjRjNjQiOwogCQkJCXJlZyA9IDwweDUwPjsKIAkJCX07CiAJCX07CiAKLQkJZG1hQDIxMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MjEzMDAgMHg0PjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyMTEwMCAweDIwMD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZG1hLWNoYW5uZWxAMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIwIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIxIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjIgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMyAyPjsKLQkJCX07Ci0JCX07Ci0KIAkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwotCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwPjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyNDAwMCAweDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDI5IDIgMzAgMiAzNCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJdGJpLWhhbmRsZSA9IDwmdGJpMD47CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKKwkJfTsKIAotCQkJbWRpb0A1MjAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItbWRpbyI7Ci0JCQkJcmVnID0gPDB4NTIwIDB4MjA+OwotCi0JCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewotCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwotCQkJCQlyZWcgPSA8MHgwPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQl9OwotCQkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKLQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJCWludGVycnVwdHMgPSA8NSAxPjsKLQkJCQkJcmVnID0gPDB4MT47Ci0JCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7Ci0JCQkJfTsKLQkJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQlpbnRlcnJ1cHRzID0gPDUgMT47Ci0JCQkJCXJlZyA9IDwweDI+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwotCQkJCX07Ci0JCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewotCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQkJaW50ZXJydXB0cyA9IDw1IDE+OwotCQkJCQlyZWcgPSA8MHgzPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQl9OwotCQkJCXRiaTA6IHRiaS1waHlAMTEgewotCQkJCQlyZWcgPSA8MHgxMT47Ci0JCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwotCQkJCX07CisJCW1kaW9AMjQ1MjAgeworCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgeworCQkJCWludGVycnVwdHMgPSA8NSAxIDAgMD47CisJCQkJcmVnID0gPDB4MD47CisJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJCX07CisJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CisJCQkJaW50ZXJydXB0cyA9IDw1IDEgMCAwPjsKKwkJCQlyZWcgPSA8MHgxPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJfTsKKwkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKKwkJCQlpbnRlcnJ1cHRzID0gPDUgMSAwIDA+OworCQkJCXJlZyA9IDwweDI+OworCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQl9OworCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgeworCQkJCWludGVycnVwdHMgPSA8NSAxIDAgMD47CisJCQkJcmVnID0gPDB4Mz47CisJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJCX07CisJCQl0YmkwOiB0YmktcGh5QDExIHsKKwkJCQlyZWcgPSA8MHgxMT47CisJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CiAJCQl9OwogCQl9OwogCiAJCWVuZXQxOiBldGhlcm5ldEAyNTAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI1MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjUwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwzNSAyIDM2IDIgNDAgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXRiaS1oYW5kbGUgPSA8JnRiaTE+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CisJCX07CiAKLQkJCW1kaW9ANTIwIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7Ci0JCQkJcmVnID0gPDB4NTIwIDB4MjA+OwotCi0JCQkJdGJpMTogdGJpLXBoeUAxMSB7Ci0JCQkJCXJlZyA9IDwweDExPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQkJfTsKKwkJbWRpb0AyNTUyMCB7CisJCQl0YmkxOiB0YmktcGh5QDExIHsKKwkJCQlyZWcgPSA8MHgxMT47CisJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CiAJCQl9OwogCQl9OwogCiAJCWVuZXQyOiBldGhlcm5ldEAyNjAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI2MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjYwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwzMSAyIDMyIDIgMzMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXRiaS1oYW5kbGUgPSA8JnRiaTI+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47CisJCX07CiAKLQkJCW1kaW9ANTIwIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7Ci0JCQkJcmVnID0gPDB4NTIwIDB4MjA+OwotCi0JCQkJdGJpMjogdGJpLXBoeUAxMSB7Ci0JCQkJCXJlZyA9IDwweDExPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQkJfTsKKwkJbWRpb0AyNjUyMCB7CisJCQl0YmkyOiB0YmktcGh5QDExIHsKKwkJCQlyZWcgPSA8MHgxMT47CisJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CiAJCQl9OwogCQl9OwogCiAJCWVuZXQzOiBldGhlcm5ldEAyNzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI3MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjcwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwzNyAyIDM4IDIgMzkgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCXRiaS1oYW5kbGUgPSA8JnRiaTM+OwogCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47CisJCX07CiAKLQkJCW1kaW9ANTIwIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7Ci0JCQkJcmVnID0gPDB4NTIwIDB4MjA+OwotCi0JCQkJdGJpMzogdGJpLXBoeUAxMSB7Ci0JCQkJCXJlZyA9IDwweDExPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQkJfTsKKwkJbWRpb0AyNzUyMCB7CisJCQl0YmkzOiB0YmktcGh5QDExIHsKKwkJCQlyZWcgPSA8MHgxMT47CisJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CiAJCQl9OwogCQl9OwotCi0JCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/Ci0JCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CS8vZ2xvYmFsIHV0aWxpdGllcyByZWcKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtZ3V0cyI7Ci0JCQlyZWcgPSA8MHhlMDAwMCAweDEwMDA+OwotCQkJZnNsLGhhcy1yc3RjcjsKLQkJfTsKLQotCQljcnlwdG9AMzAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjMi4xIiwgImZzbCxzZWMyLjAiOwotCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQ1IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlmc2wsbnVtLWNoYW5uZWxzID0gPDQ+OwotCQkJZnNsLGNoYW5uZWwtZmlmby1sZW4gPSA8MjQ+OwotCQkJZnNsLGV4ZWMtdW5pdHMtbWFzayA9IDwweGZlPjsKLQkJCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgxMmIwZWJmPjsKLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7Ci0JCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7Ci0JCX07CiAJfTsKIAogCXBjaTA6IHBjaUBlMDAwODAwMCB7CisJCXJlZyA9IDwwIDB4ZTAwMDgwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDAgMHg4MDAwMDAwMCAweDAgMHgxMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGUyMDAwMDAwIDB4MCAweDgwMDAwMD47CisJCWNsb2NrLWZyZXF1ZW5jeSA9IDw2NjY2NjY2Nj47CiAJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMHgwIDB4MCAweDc+OwogCQlpbnRlcnJ1cHQtbWFwID0gPAogCQkJLyogSURTRUwgMHg0IChQQ0lYIFNsb3QgMikgKi8KLQkJCTB4MjAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxCi0JCQkweDIwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MQotCQkJMHgyMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEKLQkJCTB4MjAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxCisJCQkweDIwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MSAwIDAKKwkJCTB4MjAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHgyMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEgMCAwCisJCQkweDIwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MSAwIDAKIAogCQkJLyogSURTRUwgMHg1IChQQ0lYIFNsb3QgMykgKi8KLQkJCTB4MjgwMCAweDAgMHgwIDB4MSAmbXBpYyAweDEgMHgxCi0JCQkweDI4MDAgMHgwIDB4MCAweDIgJm1waWMgMHgyIDB4MQotCQkJMHgyODAwIDB4MCAweDAgMHgzICZtcGljIDB4MyAweDEKLQkJCTB4MjgwMCAweDAgMHgwIDB4NCAmbXBpYyAweDAgMHgxCisJCQkweDI4MDAgMHgwIDB4MCAweDEgJm1waWMgMHgxIDB4MSAwIDAKKwkJCTB4MjgwMCAweDAgMHgwIDB4MiAmbXBpYyAweDIgMHgxIDAgMAorCQkJMHgyODAwIDB4MCAweDAgMHgzICZtcGljIDB4MyAweDEgMCAwCisJCQkweDI4MDAgMHgwIDB4MCAweDQgJm1waWMgMHgwIDB4MSAwIDAKIAogCQkJLyogSURTRUwgMHg2IChQQ0lYIFNsb3QgNCkgKi8KLQkJCTB4MzAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxCi0JCQkweDMwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MQotCQkJMHgzMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MCAweDEKLQkJCTB4MzAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxCisJCQkweDMwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MSAwIDAKKwkJCTB4MzAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxIDAgMAorCQkJMHgzMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MCAweDEgMCAwCisJCQkweDMwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MSAwIDAKIAogCQkJLyogSURTRUwgMHg4IChQQ0lYIFNsb3QgNSkgKi8KLQkJCTB4NDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxCi0JCQkweDQwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MQotCQkJMHg0MDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEKLQkJCTB4NDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxCisJCQkweDQwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MSAwIDAKKwkJCTB4NDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHg0MDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEgMCAwCisJCQkweDQwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MSAwIDAKIAogCQkJLyogSURTRUwgMHhDIChUc2kzMTAgYnJpZGdlKSAqLwotCQkJMHg2MDAwIDB4MCAweDAgMHgxICZtcGljIDB4MCAweDEKLQkJCTB4NjAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxCi0JCQkweDYwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgyIDB4MQotCQkJMHg2MDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MyAweDEKKwkJCTB4NjAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxIDAgMAorCQkJMHg2MDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEgMCAwCisJCQkweDYwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgyIDB4MSAwIDAKKwkJCTB4NjAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxIDAgMAogCiAJCQkvKiBJRFNFTCAweDE0IChTbG90IDIpICovCi0JCQkweGEwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMHhhMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEKLQkJCTB4YTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCi0JCQkweGEwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQorCQkJMHhhMDAwIDB4MCAweDAgMHgxICZtcGljIDB4MCAweDEgMCAwCisJCQkweGEwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MSAwIDAKKwkJCTB4YTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxIDAgMAorCQkJMHhhMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MyAweDEgMCAwCiAKIAkJCS8qIElEU0VMIDB4MTUgKFNsb3QgMykgKi8KLQkJCTB4YTgwMCAweDAgMHgwIDB4MSAmbXBpYyAweDEgMHgxCi0JCQkweGE4MDAgMHgwIDB4MCAweDIgJm1waWMgMHgyIDB4MQotCQkJMHhhODAwIDB4MCAweDAgMHgzICZtcGljIDB4MyAweDEKLQkJCTB4YTgwMCAweDAgMHgwIDB4NCAmbXBpYyAweDAgMHgxCisJCQkweGE4MDAgMHgwIDB4MCAweDEgJm1waWMgMHgxIDB4MSAwIDAKKwkJCTB4YTgwMCAweDAgMHgwIDB4MiAmbXBpYyAweDIgMHgxIDAgMAorCQkJMHhhODAwIDB4MCAweDAgMHgzICZtcGljIDB4MyAweDEgMCAwCisJCQkweGE4MDAgMHgwIDB4MCAweDQgJm1waWMgMHgwIDB4MSAwIDAKIAogCQkJLyogSURTRUwgMHgxNiAoU2xvdCA0KSAqLwotCQkJMHhiMDAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEKLQkJCTB4YjAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkweGIwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgwIDB4MQotCQkJMHhiMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEKKwkJCTB4YjAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxIDAgMAorCQkJMHhiMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MyAweDEgMCAwCisJCQkweGIwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgwIDB4MSAwIDAKKwkJCTB4YjAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxIDAgMAogCiAJCQkvKiBJRFNFTCAweDE4IChTbG90IDUpICovCi0JCQkweGMwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMHhjMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEKLQkJCTB4YzAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCi0JCQkweGMwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQorCQkJMHhjMDAwIDB4MCAweDAgMHgxICZtcGljIDB4MCAweDEgMCAwCisJCQkweGMwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MSAwIDAKKwkJCTB4YzAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxIDAgMAorCQkJMHhjMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MyAweDEgMCAwCiAKIAkJCS8qIElEU0VMIDB4MUMgKFRzaTMxMCBicmlkZ2UgUENJIHByaW1hcnkpICovCi0JCQkweGUwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMHhlMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEKLQkJCTB4ZTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCi0JCQkweGUwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MT47Ci0KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MjQgMj47Ci0JCWJ1cy1yYW5nZSA9IDwwIDA+OwotCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDB4ODAwMDAwMDAgMHgwIDB4MTAwMDAwMDAKLQkJCSAgMHgxMDAwMDAwIDB4MCAweDAgMHhlMjAwMDAwMCAweDAgMHg4MDAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8NjY2NjY2NjY+OwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwweGUwMDA4MDAwIDB4MTAwMD47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDAtcGNpeCIsICJmc2wsbXBjODU0MC1wY2kiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQkJMHhlMDAwIDB4MCAweDAgMHgxICZtcGljIDB4MCAweDEgMCAwCisJCQkweGUwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MSAwIDAKKwkJCTB4ZTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxIDAgMAorCQkJMHhlMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MyAweDEgMCAwPjsKIAogCQlwY2lfYnJpZGdlQDFjIHsKIAkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMHgwIDB4MCAweDc+OwogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJCS8qIElEU0VMIDB4MDAgKFByUE1DIFNpdGUpICovCi0JCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxCi0JCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxCi0JCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCi0JCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxCisJCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxIDAgMAorCQkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MSAwIDAKKwkJCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEgMCAwCisJCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxIDAgMAogCiAJCQkJLyogSURTRUwgMHgwNCAoVklBIGNoaXApICovCi0JCQkJMHgyMDAwIDB4MCAweDAgMHgxICZtcGljIDB4MCAweDEKLQkJCQkweDIwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MQotCQkJCTB4MjAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCi0JCQkJMHgyMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MyAweDEKKwkJCQkweDIwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MSAwIDAKKwkJCQkweDIwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MSAwIDAKKwkJCQkweDIwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgyIDB4MSAwIDAKKwkJCQkweDIwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MSAwIDAKIAogCQkJCS8qIElEU0VMIDB4MDUgKDgxMzkpICovCi0JCQkJMHgyODAwIDB4MCAweDAgMHgxICZtcGljIDB4MSAweDEKKwkJCQkweDI4MDAgMHgwIDB4MCAweDEgJm1waWMgMHgxIDB4MSAwIDAKIAogCQkJCS8qIElEU0VMIDB4MDYgKFNsb3QgNikgKi8KLQkJCQkweDMwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MQotCQkJCTB4MzAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkJMHgzMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MCAweDEKLQkJCQkweDMwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MQorCQkJCTB4MzAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxIDAgMAorCQkJCTB4MzAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxIDAgMAorCQkJCTB4MzAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDAgMHgxIDAgMAorCQkJCTB4MzAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxIDAgMAogCiAJCQkJLyogSURFU0wgMHgwNyAoU2xvdCA3KSAqLwotCQkJCTB4MzgwMCAweDAgMHgwIDB4MSAmbXBpYyAweDMgMHgxCi0JCQkJMHgzODAwIDB4MCAweDAgMHgyICZtcGljIDB4MCAweDEKLQkJCQkweDM4MDAgMHgwIDB4MCAweDMgJm1waWMgMHgxIDB4MQotCQkJCTB4MzgwMCAweDAgMHgwIDB4NCAmbXBpYyAweDIgMHgxPjsKKwkJCQkweDM4MDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MSAwIDAKKwkJCQkweDM4MDAgMHgwIDB4MCAweDIgJm1waWMgMHgwIDB4MSAwIDAKKwkJCQkweDM4MDAgMHgwIDB4MCAweDMgJm1waWMgMHgxIDB4MSAwIDAKKwkJCQkweDM4MDAgMHgwIDB4MCAweDQgJm1waWMgMHgyIDB4MSAwIDA+OwogCiAJCQlyZWcgPSA8MHhlMDAwIDB4MCAweDAgMHgwIDB4MD47CiAJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwpAQCAtNDkyLDcgKzI2MCw3IEBACiAJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwogCQkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwogCQkJCQljb21wYXRpYmxlID0gImNocnAsaWljIjsKLQkJCQkJaW50ZXJydXB0cyA9IDwwIDE+OworCQkJCQlpbnRlcnJ1cHRzID0gPDAgMSAwIDA+OwogCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCQl9OwogCkBAIC01MDUsNTYgKzI3MywyNSBAQAogCX07CiAKIAlwY2kxOiBwY2lAZTAwMDkwMDAgeworCQlyZWcgPSA8MCAweGUwMDA5MDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg5MDAwMDAwMCAwIDB4OTAwMDAwMDAgMHgwIDB4MTAwMDAwMDAKKwkJCSAgMHgxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDAgMHhlMjgwMDAwMCAweDAgMHg4MDAwMDA+OworCQljbG9jay1mcmVxdWVuY3kgPSA8NjY2NjY2NjY+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwKIAogCQkJLyogSURTRUwgMHgxNSAqLwotCQkJMHhhODAwIDB4MCAweDAgMHgxICZtcGljIDB4YiAweDEKLQkJCTB4YTgwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxCi0JCQkweGE4MDAgMHgwIDB4MCAweDMgJm1waWMgMHgyIDB4MQotCQkJMHhhODAwIDB4MCAweDAgMHg0ICZtcGljIDB4MyAweDE+OwotCi0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDI1IDI+OwotCQlidXMtcmFuZ2UgPSA8MCAwPjsKLQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg5MDAwMDAwMCAweDkwMDAwMDAwIDB4MCAweDEwMDAwMDAwCi0JCQkgIDB4MTAwMDAwMCAweDAgMHgwIDB4ZTI4MDAwMDAgMHgwIDB4ODAwMDAwPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDY2NjY2NjY2PjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhlMDAwOTAwMCAweDEwMDA+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLXBjaSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7CisJCQkweGE4MDAgMHgwIDB4MCAweDEgJm1waWMgMHhiIDB4MSAwIDAKKwkJCTB4YTgwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHhhODAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEgMCAwCisJCQkweGE4MDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MSAwIDA+OwogCX07CiAKIAlwY2kyOiBwY2llQGUwMDBhMDAwIHsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0KLQkJCS8qIElEU0VMIDB4MCAoUEVYKSAqLwotCQkJMDAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMDAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MQotCQkJMDAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgyIDB4MQotCQkJMDAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MT47Ci0KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MjYgMj47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47Ci0JCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAotCQkJICAweDEwMDAwMDAgMHgwIDB4MCAweGUzMDAwMDAwIDB4MCAweDEwMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZTAwMGEwMDAgMHgxMDAwPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKKwkJcmVnID0gPDAgMHhlMDAwYTAwMCAwIDB4MTAwMD47CisJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMCAweGEwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZTMwMDAwMDAgMHgwIDB4MTAwMDAwPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtNTY1LDMgKzMwMiw1IEBACiAJCX07CiAJfTsKIH07CisKKy9pbmNsdWRlLyAiZnNsL21wYzg1NDhzaS1wb3N0LmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU1NWNkcy5kdHMKaW5kZXggNWM1NjE0Zi4uZmUxMDQzOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NTVjZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTU1Y2RzLmR0cwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsgCS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KIAkJCWludGVycnVwdHMgPSA8NDIgMj47CkBAIC0yMTksNyArMjE5LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjhtZHMuZHRzCmluZGV4IDY0N2RhZjguLjA5NTk4YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY4bWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OG1kcy5kdHMKQEAgLTksNjAgKzksMjUgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gImZzbC9tcGM4NTY4c2ktcHJlLmR0c2kiCiAKIC8gewogCW1vZGVsID0gIk1QQzg1NjhFTURTIjsKIAljb21wYXRpYmxlID0gIk1QQzg1NjhFTURTIiwgIk1QQzg1eHhNRFMiOwotCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCSNzaXplLWNlbGxzID0gPDE+OwogCiAJYWxpYXNlcyB7Ci0JCWV0aGVybmV0MCA9ICZlbmV0MDsKLQkJZXRoZXJuZXQxID0gJmVuZXQxOwotCQlldGhlcm5ldDIgPSAmZW5ldDI7Ci0JCWV0aGVybmV0MyA9ICZlbmV0MzsKLQkJc2VyaWFsMCA9ICZzZXJpYWwwOwotCQlzZXJpYWwxID0gJnNlcmlhbDE7CiAJCXBjaTAgPSAmcGNpMDsKIAkJcGNpMSA9ICZwY2kxOwotCQlyYXBpZGlvMCA9ICZyaW8wOwotCX07Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsODU2OEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MHgwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDgwMDA+OwkJLy8gTDEsIDMySwotCQkJaS1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCi0JCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDgwMDAJLy8gY29yZQotCQkJCSAmcG1jIDB4MDAwMDQwMDA+OwkvLyB0aW1lYmFzZQotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKLQkJfTsKKwkJcmFwaWRpbzAgPSAmcmlvOwogCX07CiAKIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwotCQlyZWcgPSA8MHgwIDB4MTAwMDAwMDA+OworCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwPjsKIAl9OwogCi0JbG9jYWxidXNAZTAwMDUwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbG9jYWxidXMiLCAiZnNsLHBxMy1sb2NhbGJ1cyIsCi0JCQkgICAgICJzaW1wbGUtYnVzIjsKLQkJcmVnID0gPDB4ZTAwMDUwMDAgMHgxMDAwPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MTkgMj47Ci0KKwlsYmM6IGxvY2FsYnVzQGUwMDA1MDAwIHsKKwkJcmVnID0gPDB4MCAweGUwMDA1MDAwIDB4MCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MHgwIDB4MCAweGZlMDAwMDAwIDB4MDIwMDAwMDAKIAkJCSAgMHgxIDB4MCAweGY4MDAwMDAwIDB4MDAwMDgwMDAKIAkJCSAgMHgyIDB4MCAweGYwMDAwMDAwIDB4MDQwMDAwMDAKQEAgLTEwNCwyODggKzY5LDY1IEBACiAJCX07CiAJfTsKIAotCXNvYzg1NjhAZTAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWRldmljZV90eXBlID0gInNvYyI7Ci0JCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7Ci0JCXJhbmdlcyA9IDwweDAgMHhlMDAwMDAwMCAweDEwMDAwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47Ci0KLQkJZWNtLWxhd0AwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOwotCQkJcmVnID0gPDB4MCAweDEwMDA+OwotCQkJZnNsLG51bS1sYXdzID0gPDEwPjsKLQkJfTsKLQotCQllY21AMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY4LWVjbSIsICJmc2wsZWNtIjsKLQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTcgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwotCQl9OwotCi0JCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbDItY2FjaGUtY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OwotCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWNhY2hlLXNpemUgPSA8MHg4MDAwMD47CS8vIEwyLCA1MTJLCi0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCX07CisJc29jOiBzb2M4NTY4QGUwMDAwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MCAweDAgMHhlMDAwMDAwMCAweDEwMDAwMD47CiAKIAkJaTJjLXNsZWVwLW5leHVzIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOwotCQkJc2xlZXAgPSA8JnBtYyAweDAwMDAwMDA0PjsKLQkJCXJhbmdlczsKLQogCQkJaTJjQDMwMDAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWRmc3JyOwotCiAJCQkJcnRjQDY4IHsKIAkJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzc0IjsKIAkJCQkJcmVnID0gPDB4Njg+OwotCQkJCQlpbnRlcnJ1cHRzID0gPDMgMT47Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCQlpbnRlcnJ1cHRzID0gPDMgMSAwIDA+OwogCQkJCX07CiAJCQl9OwotCi0JCQlpMmNAMzEwMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJCXJlZyA9IDwweDMxMDAgMHgxMDA+OwotCQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJZGZzcnI7Ci0JCQl9OwotCQl9OwotCi0JCWRtYUAyMTMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKLQkJCXJlZyA9IDwweDIxMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjExMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCXNsZWVwID0gPCZwbWMgMHgwMDAwMDQwMD47Ci0KLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMCAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMSAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIyIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjMgMj47Ci0JCQl9OwogCQl9OwogCiAJCWVuZXQwOiBldGhlcm5ldEAyNDAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI0MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjQwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotIAkJCWludGVycnVwdHMgPSA8MjkgMiAzMCAyIDM0IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OwotCQkJc2xlZXAgPSA8JnBtYyAweDAwMDAwMDgwPjsKKwkJfTsKIAotCQkJbWRpb0A1MjAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItbWRpbyI7Ci0JCQkJcmVnID0gPDB4NTIwIDB4MjA+OwotCi0JCQkJcGh5MDogZXRoZXJuZXQtcGh5QDcgewotCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQkJaW50ZXJydXB0cyA9IDwxIDE+OwotCQkJCQlyZWcgPSA8MHg3PjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQl9OwotCQkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKLQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJCWludGVycnVwdHMgPSA8MiAxPjsKLQkJCQkJcmVnID0gPDB4MT47Ci0JCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7Ci0JCQkJfTsKLQkJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQlpbnRlcnJ1cHRzID0gPDEgMT47Ci0JCQkJCXJlZyA9IDwweDI+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwotCQkJCX07Ci0JCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewotCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQkJaW50ZXJydXB0cyA9IDwyIDE+OwotCQkJCQlyZWcgPSA8MHgzPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKLQkJCQl9OwotCQkJCXRiaTA6IHRiaS1waHlAMTEgewotCQkJCQlyZWcgPSA8MHgxMT47Ci0JCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwotCQkJCX07CisJCW1kaW9AMjQ1MjAgeworCQkJcGh5MDogZXRoZXJuZXQtcGh5QDcgeworCQkJCWludGVycnVwdHMgPSA8MSAxIDAgMD47CisJCQkJcmVnID0gPDB4Nz47CisJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJCX07CisJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7CisJCQkJaW50ZXJydXB0cyA9IDwyIDEgMCAwPjsKKwkJCQlyZWcgPSA8MHgxPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOworCQkJfTsKKwkJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMSAwIDA+OworCQkJCXJlZyA9IDwweDI+OworCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CisJCQl9OworCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgeworCQkJCWludGVycnVwdHMgPSA8MiAxIDAgMD47CisJCQkJcmVnID0gPDB4Mz47CisJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKKwkJCX07CisJCQl0YmkwOiB0YmktcGh5QDExIHsKKwkJCQlyZWcgPSA8MHgxMT47CisJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CiAJCQl9OwogCQl9OwogCiAJCWVuZXQxOiBldGhlcm5ldEAyNTAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI1MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjUwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotIAkJCWludGVycnVwdHMgPSA8MzUgMiAzNiAyIDQwIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAJCQl0YmktaGFuZGxlID0gPCZ0YmkxPjsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTM+OwogCQkJc2xlZXAgPSA8JnBtYyAweDAwMDAwMDQwPjsKKwkJfTsKIAotCQkJbWRpb0A1MjAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItdGJpIjsKLQkJCQlyZWcgPSA8MHg1MjAgMHgyMD47Ci0KLQkJCQl0YmkxOiB0YmktcGh5QDExIHsKLQkJCQkJcmVnID0gPDB4MTE+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKLQkJCQl9OworCQltZGlvQDI1NTIwIHsKKwkJCXRiaTE6IHRiaS1waHlAMTEgeworCQkJCXJlZyA9IDwweDExPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKIAkJCX07CiAJCX07CiAKLQkJZHVhcnQtc2xlZXAtbmV4dXMgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7Ci0JCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwMDI+OwotCQkJcmFuZ2VzOwotCi0JCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQkJcmVnID0gPDB4NDUwMCAweDEwMD47Ci0JCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQl9OwotCi0JCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQkJcmVnID0gPDB4NDYwMCAweDEwMD47Ci0JCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQl9OwotCQl9OwotCi0JCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtZ3V0cyIsICJmc2wsbXBjODU0OC1ndXRzIjsKLQkJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MCAweGUwMDAwIDB4MTAwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwotCi0JCQlwbWM6IHBvd2VyQDcwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY4LXBtYyIsCi0JCQkJCSAgICAgImZzbCxtcGM4NTQ4LXBtYyI7Ci0JCQkJcmVnID0gPDB4NzAgMHgyMD47Ci0JCQl9OwotCQl9OwotCi0JCWNyeXB0b0AzMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzZWMyLjEiLCAiZnNsLHNlYzIuMCI7Ci0JCQlyZWcgPSA8MHgzMDAwMCAweDEwMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NDUgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWZzbCxudW0tY2hhbm5lbHMgPSA8ND47Ci0JCQlmc2wsY2hhbm5lbC1maWZvLWxlbiA9IDwyND47Ci0JCQlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4ZmU+OwotCQkJZnNsLGRlc2NyaXB0b3ItdHlwZXMtbWFzayA9IDwweDEyYjBlYmY+OwotCQkJc2xlZXAgPSA8JnBtYyAweDAxMDAwMDAwPjsKLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7Ci0JCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7Ci0JCX07Ci0KLQkJbXNpQDQxNjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjgtbXNpIiwgImZzbCxtcGljLW1zaSI7Ci0JCQlyZWcgPSA8MHg0MTYwMCAweDgwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAKLQkJCQkweGUxIDAKLQkJCQkweGUyIDAKLQkJCQkweGUzIDAKLQkJCQkweGU0IDAKLQkJCQkweGU1IDAKLQkJCQkweGU2IDAKLQkJCQkweGU3IDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KIAkJcGFyX2lvQGUwMTAwIHsKLQkJCXJlZyA9IDwweGUwMTAwIDB4MTAwPjsKLQkJCWRldmljZV90eXBlID0gInBhcl9pbyI7CiAJCQludW0tcG9ydHMgPSA8Nz47CiAKIAkJCXBpbzE6IHVjY19waW5AMDEgewpAQCAtNDQ4LDU3ICsxOTAsMjEgQEAKIAkJfTsKIAl9OwogCi0JcWVAZTAwODAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWRldmljZV90eXBlID0gInFlIjsKLQkJY29tcGF0aWJsZSA9ICJmc2wscWUiOwotCQlyYW5nZXMgPSA8MHgwIDB4ZTAwODAwMDAgMHg0MDAwMD47Ci0JCXJlZyA9IDwweGUwMDgwMDAwIDB4NDgwPjsKLQkJc2xlZXAgPSA8JnBtYyAweDAwMDAwODAwPjsKLQkJYnJnLWZyZXF1ZW5jeSA9IDwwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwzOTYwMDAwMDA+OwotCQlmc2wscWUtbnVtLXJpc2NzID0gPDI+OwotCQlmc2wscWUtbnVtLXNudW1zID0gPDI4PjsKLQotCQltdXJhbUAxMDAwMCB7Ci0gCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0gCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxxZS1tdXJhbSIsICJmc2wsY3BtLW11cmFtIjsKLQkJCXJhbmdlcyA9IDwweDAgMHgxMDAwMCAweDEwMDAwPjsKLQotCQkJZGF0YS1vbmx5QDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHFlLW11cmFtLWRhdGEiLAotCQkJCQkgICAgICJmc2wsY3BtLW11cmFtLWRhdGEiOwotCQkJCXJlZyA9IDwweDAgMHgxMDAwMD47Ci0JCQl9OwotCQl9OworCXFlOiBxZUBlMDA4MDAwMCB7CisJCXJhbmdlcyA9IDwweDAgMHgwIDB4ZTAwODAwMDAgMHg0MDAwMD47CisJCXJlZyA9IDwweDAgMHhlMDA4MDAwMCAweDAgMHg0ODA+OwogCiAJCXNwaUA0YzAgewotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNwaSI7Ci0JCQlyZWcgPSA8MHg0YzAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CiAJCQltb2RlID0gImNwdSI7CiAJCX07CiAKIAkJc3BpQDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsc3BpIjsKLQkJCXJlZyA9IDwweDUwMCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MT47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKIAkJCW1vZGUgPSAiY3B1IjsKIAkJfTsKIAogCQllbmV0MjogdWNjQDIwMDAgewogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CiAJCQljb21wYXRpYmxlID0gInVjY19nZXRoIjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MjAwPjsKLQkJCWludGVycnVwdHMgPSA8MzI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrLW5hbWUgPSAibm9uZSI7CiAJCQl0eC1jbG9jay1uYW1lID0gImNsazE2IjsKQEAgLTUxMCwxMCArMjE2LDYgQEAKIAkJZW5ldDM6IHVjY0AzMDAwIHsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwogCQkJY29tcGF0aWJsZSA9ICJ1Y2NfZ2V0aCI7Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJcmVnID0gPDB4MzAwMCAweDIwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDMzPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jay1uYW1lID0gIm5vbmUiOwogCQkJdHgtY2xvY2stbmFtZSA9ICJjbGsxNiI7CkBAIC01MzIsMTAyICsyMzQsNTcgQEAKIAkJCSAqIGdpYW5mYXIncyBNRElPIGJ1cyAqLwogCQkJcWVfcGh5MDogZXRoZXJuZXQtcGh5QDA3IHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CisJCQkJaW50ZXJydXB0cyA9IDwxIDEgMCAwPjsKIAkJCQlyZWcgPSA8MHg3PjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXFlX3BoeTE6IGV0aGVybmV0LXBoeUAwMSB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyIDE+OworCQkJCWludGVycnVwdHMgPSA8MiAxIDAgMD47CiAJCQkJcmVnID0gPDB4MT47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlxZV9waHkyOiBldGhlcm5ldC1waHlAMDIgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMSAwIDA+OwogCQkJCXJlZyA9IDwweDI+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcWVfcGh5MzogZXRoZXJuZXQtcGh5QDAzIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIgMT47CisJCQkJaW50ZXJydXB0cyA9IDwyIDEgMCAwPjsKIAkJCQlyZWcgPSA8MHgzPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJfTsKLQotCQlxZWljOiBpbnRlcnJ1cHQtY29udHJvbGxlckA4MCB7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHFlLWljIjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJYmlnLWVuZGlhbjsKLQkJCWludGVycnVwdHMgPSA8NDYgMiA0NiAyPjsgLy9oaWdoOjMwIGxvdzozMAotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KIAl9OwogCiAJcGNpMDogcGNpQGUwMDA4MDAwIHsKKwkJcmVnID0gPDB4MCAweGUwMDA4MDAwIDB4MCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDB4MCAweDgwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweDAgMHhlMjAwMDAwMCAweDAgMHg4MDAwMDA+OworCQljbG9jay1mcmVxdWVuY3kgPSA8NjY2NjY2NjY+OwogCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKIAkJaW50ZXJydXB0LW1hcCA9IDwKIAkJCS8qIElEU0VMIDB4MTIgQUQxOCAqLwotCQkJMHg5MDAwIDB4MCAweDAgMHgxICZtcGljIDB4NSAweDEKLQkJCTB4OTAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDYgMHgxCi0JCQkweDkwMDAgMHgwIDB4MCAweDMgJm1waWMgMHg3IDB4MQotCQkJMHg5MDAwIDB4MCAweDAgMHg0ICZtcGljIDB4NCAweDEKKwkJCTB4OTAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDUgMHgxIDAgMAorCQkJMHg5MDAwIDB4MCAweDAgMHgyICZtcGljIDB4NiAweDEgMCAwCisJCQkweDkwMDAgMHgwIDB4MCAweDMgJm1waWMgMHg3IDB4MSAwIDAKKwkJCTB4OTAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDQgMHgxIDAgMAogCiAJCQkvKiBJRFNFTCAweDEzIEFEMTkgKi8KLQkJCTB4OTgwMCAweDAgMHgwIDB4MSAmbXBpYyAweDYgMHgxCi0JCQkweDk4MDAgMHgwIDB4MCAweDIgJm1waWMgMHg3IDB4MQotCQkJMHg5ODAwIDB4MCAweDAgMHgzICZtcGljIDB4NCAweDEKLQkJCTB4OTgwMCAweDAgMHgwIDB4NCAmbXBpYyAweDUgMHgxPjsKLQotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNCAyPjsKLQkJYnVzLXJhbmdlID0gPDAgMjU1PjsKLQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMCAweDgwMDAwMDAwIDB4MCAweDIwMDAwMDAwCi0JCQkgIDB4MTAwMDAwMCAweDAgMHgwIDB4ZTIwMDAwMDAgMHgwIDB4ODAwMDAwPjsKLQkJc2xlZXAgPSA8JnBtYyAweDgwMDAwMDAwPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDY2NjY2NjY2PjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhlMDAwODAwMCAweDEwMDA+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQwLXBjaSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7CisJCQkweDk4MDAgMHgwIDB4MCAweDEgJm1waWMgMHg2IDB4MSAwIDAKKwkJCTB4OTgwMCAweDAgMHgwIDB4MiAmbXBpYyAweDcgMHgxIDAgMAorCQkJMHg5ODAwIDB4MCAweDAgMHgzICZtcGljIDB4NCAweDEgMCAwCisJCQkweDk4MDAgMHgwIDB4MCAweDQgJm1waWMgMHg1IDB4MSAwIDA+OwogCX07CiAKIAkvKiBQQ0kgRXhwcmVzcyAqLwogCXBjaTE6IHBjaWVAZTAwMGEwMDAgewotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQotCQkJLyogSURTRUwgMHgwIChQRVgpICovCi0JCQkwMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxCi0JCQkwMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxCi0JCQkwMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDIgMHgxCi0JCQkwMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxPjsKLQotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNiAyPjsKLQkJYnVzLXJhbmdlID0gPDAgMjU1PjsKLQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMCAweGEwMDAwMDAwIDB4MCAweDEwMDAwMDAwCi0JCQkgIDB4MTAwMDAwMCAweDAgMHgwIDB4ZTI4MDAwMDAgMHgwIDB4ODAwMDAwPjsKLQkJc2xlZXAgPSA8JnBtYyAweDIwMDAwMDAwPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhlMDAwYTAwMCAweDEwMDA+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDB4MCAweGEwMDAwMDAwIDB4MCAweDEwMDAwMDAwCisJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweDAgMHhlMjgwMDAwMCAweDAgMHg4MDAwMDA+OworCQlyZWcgPSA8MHgwIDB4ZTAwMGEwMDAgMHgwIDB4MTAwMD47CiAJCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAKIAkJCQkgIDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAogCQkJCSAgMHgwIDB4MTAwMDAwMDAKQEAgLTYzOCwyMiArMjk1LDExIEBACiAJCX07CiAJfTsKIAotCXJpbzA6IHJhcGlkaW9AZTAwYzAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY4LXJhcGlkaW8iLCAiZnNsLHJhcGlkaW8tZGVsdGEiOwotCQlyZWcgPSA8MHhlMDBjMDAwMCAweDIwMDAwPjsKLQkJcmFuZ2VzID0gPDB4MCAweDAgMHhjMDAwMDAwMCAweDAgMHgyMDAwMDAwMD47Ci0JCWludGVycnVwdHMgPSA8NDggMiAvKiBlcnJvciAgICAgKi8KLQkJCSAgICAgIDQ5IDIgLyogYmVsbF9vdXRiICovCi0JCQkgICAgICA1MCAyIC8qIGJlbGxfaW5iICAqLwotCQkJICAgICAgNTMgMiAvKiBtc2cxX3R4ICAgKi8KLQkJCSAgICAgIDU0IDIgLyogbXNnMV9yeCAgICovCi0JCQkgICAgICA1NSAyIC8qIG1zZzJfdHggICAqLwotCQkJICAgICAgNTYgMiAvKiBtc2cyX3J4ICAgKi8+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJc2xlZXAgPSA8JnBtYyAweDAwMDgwMDAwICAgLyogY29udHJvbGxlciAqLwotCQkJICZwbWMgMHgwMDA0MDAwMD47IC8qIG1lc3NhZ2UgdW5pdCAqLworCXJpbzogcmFwaWRpb0BlMDBjMDAwMDAgeworCQlyZWcgPSA8MHgwIDB4ZTAwYzAwMDAgMHgwIDB4MjAwMDA+OworCQlwb3J0MSB7CisJCQlyYW5nZXMgPSA8MHgwIDB4MCAweDAgMHhjMDAwMDAwMCAweDAgMHgyMDAwMDAwMD47CisJCX07CiAJfTsKIAogCWxlZHMgewpAQCAtNjcyLDMgKzMxOCw1IEBACiAJCX07CiAJfTsKIH07CisKKy9pbmNsdWRlLyAiZnNsL21wYzg1NjhzaS1wb3N0LmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OW1kcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU2OW1kcy5kdHMKaW5kZXggOGI3MmVhZi4uN2UyODNjOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NjltZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTY5bWRzLmR0cwpAQCAtOSw2NiArOSwzNiBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAiZnNsL21wYzg1NjlzaS1wcmUuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiTVBDODU2OUVNRFMiOwogCWNvbXBhdGlibGUgPSAiZnNsLE1QQzg1NjlFTURTIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkjYWRkcmVzcy1jZWxscyA9IDwyPjsKKwkjc2l6ZS1jZWxscyA9IDwyPjsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAogCWFsaWFzZXMgewotCQlzZXJpYWwwID0gJnNlcmlhbDA7Ci0JCXNlcmlhbDEgPSAmc2VyaWFsMTsKLQkJZXRoZXJuZXQwID0gJmVuZXQwOwotCQlldGhlcm5ldDEgPSAmZW5ldDE7CiAJCWV0aGVybmV0MiA9ICZlbmV0MjsKIAkJZXRoZXJuZXQzID0gJmVuZXQzOwogCQlldGhlcm5ldDUgPSAmZW5ldDU7CiAJCWV0aGVybmV0NyA9ICZlbmV0NzsKLQkJcGNpMSA9ICZwY2kxOwotCQlyYXBpZGlvMCA9ICZyaW8wOwotCX07Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsODU2OUAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MHgwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDgwMDA+OwkJLy8gTDEsIDMySwotCQkJaS1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCi0JCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDgwMDAJLy8gY29yZQotCQkJCSAmcG1jIDB4MDAwMDQwMDA+OwkvLyB0aW1lYmFzZQotCQkJdGltZWJhc2UtZnJlcXVlbmN5ID0gPDA+OwotCQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKLQkJfTsKKwkJcmFwaWRpbzAgPSAmcmlvOwogCX07CiAKIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCX07CiAKLQlsb2NhbGJ1c0BlMDAwNTAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOwotCQlyZWcgPSA8MHhlMDAwNTAwMCAweDEwMDA+OwotCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJc2xlZXAgPSA8JnBtYyAweDA4MDAwMDAwPjsKKwlsYmM6IGxvY2FsYnVzQGUwMDA1MDAwIHsKKwkJcmVnID0gPDB4MCAweGUwMDA1MDAwIDB4MCAweDEwMDA+OwogCi0JCXJhbmdlcyA9IDwweDAgMHgwIDB4ZmUwMDAwMDAgMHgwMjAwMDAwMAotCQkJICAweDEgMHgwIDB4ZjgwMDAwMDAgMHgwMDAwODAwMAotCQkJICAweDIgMHgwIDB4ZjAwMDAwMDAgMHgwNDAwMDAwMAotCQkJICAweDMgMHgwIDB4ZmMwMDAwMDAgMHgwMDAwODAwMAotCQkJICAweDQgMHgwIDB4ZjgwMDgwMDAgMHgwMDAwODAwMAotCQkJICAweDUgMHgwIDB4ZjgwMTAwMDAgMHgwMDAwODAwMD47CisJCXJhbmdlcyA9IDwweDAgMHgwIDB4MCAweGZlMDAwMDAwIDB4MDIwMDAwMDAKKwkJCSAgMHgxIDB4MCAweDAgMHhmODAwMDAwMCAweDAwMDA4MDAwCisJCQkgIDB4MiAweDAgMHgwIDB4ZjAwMDAwMDAgMHgwNDAwMDAwMAorCQkJICAweDMgMHgwIDB4MCAweGZjMDAwMDAwIDB4MDAwMDgwMDAKKwkJCSAgMHg0IDB4MCAweDAgMHhmODAwODAwMCAweDAwMDA4MDAwCisJCQkgIDB4NSAweDAgMHgwIDB4ZjgwMTAwMDAgMHgwMDAwODAwMD47CiAKIAkJbm9yQDAsMCB7CiAJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKQEAgLTEzMywyMjAgKzEwMywyNSBAQAogCQl9OwogCX07CiAKLQlzb2NAZTAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWRldmljZV90eXBlID0gInNvYyI7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjktaW1tciIsICJzaW1wbGUtYnVzIjsKLQkJcmFuZ2VzID0gPDB4MCAweGUwMDAwMDAwIDB4MTAwMDAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKLQotCQllY20tbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MTA+OwotCQl9OwotCi0JCWVjbUAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjktZWNtIiwgImZzbCxlY20iOwotCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1tZW1vcnktY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTggMj47Ci0JCX07CisJc29jOiBzb2NAZTAwMDAwMDAgeworCQlyYW5nZXMgPSA8MHgwIDB4MCAweGUwMDAwMDAwIDB4MTAwMDAwPjsKIAogCQlpMmMtc2xlZXAtbmV4dXMgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7Ci0JCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwMDQ+OwotCQkJcmFuZ2VzOwotCiAJCQlpMmNAMzAwMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJCXJlZyA9IDwweDMwMDAgMHgxMDA+OwotCQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJZGZzcnI7Ci0KIAkJCQlydGNANjggewogCQkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzNzQiOwogCQkJCQlyZWcgPSA8MHg2OD47Ci0JCQkJCWludGVycnVwdHMgPSA8MyAxPjsKLQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQkJCWludGVycnVwdHMgPSA8MyAxIDAgMD47CiAJCQkJfTsKIAkJCX07Ci0KLQkJCWkyY0AzMTAwIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQkJcmVnID0gPDB4MzEwMCAweDEwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlkZnNycjsKLQkJCX07CiAJCX07CiAKLQkJZHVhcnQtc2xlZXAtbmV4dXMgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7Ci0JCQlzbGVlcCA9IDwmcG1jIDB4MDAwMDAwMDI+OwotCQkJcmFuZ2VzOwotCi0JCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQkJcmVnID0gPDB4NDUwMCAweDEwMD47Ci0JCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQl9OwotCi0JCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQkJcmVnID0gPDB4NDYwMCAweDEwMD47Ci0JCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQl9OwotCQl9OwotCi0JCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NjktbDItY2FjaGUtY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OwotCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWNhY2hlLXNpemUgPSA8MHg4MDAwMD47CS8vIEwyLCA1MTJLCi0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCX07Ci0KLQkJZG1hQDIxMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY5LWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MjEzMDAgMHg0PjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyMTEwMCAweDIwMD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZG1hLWNoYW5uZWxAMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIwIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY5LWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIxIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjIgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY5LWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMyAyPjsKLQkJCX07Ci0JCX07Ci0KLQkJc2RoY2lAMmUwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1lc2RoYyIsICJmc2wsZXNkaGMiOwotCQkJcmVnID0gPDB4MmUwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NzIgMHg4PjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJc2xlZXAgPSA8JnBtYyAweDAwMjAwMDAwPjsKLQkJCS8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKKwkJc2RoY0AyZTAwMCB7CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQkJc2RoY2ksMS1iaXQtb25seTsKIAkJfTsKIAotCQljcnlwdG9AMzAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjMy4xIiwgImZzbCxzZWMzLjAiLCAiZnNsLHNlYzIuNCIsCi0JCQkJImZzbCxzZWMyLjIiLCAiZnNsLHNlYzIuMSIsICJmc2wsc2VjMi4wIjsKLQkJCXJlZyA9IDwweDMwMDAwIDB4MTAwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0NSAyIDU4IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlmc2wsbnVtLWNoYW5uZWxzID0gPDQ+OwotCQkJZnNsLGNoYW5uZWwtZmlmby1sZW4gPSA8MjQ+OwotCQkJZnNsLGV4ZWMtdW5pdHMtbWFzayA9IDwweGJmZT47Ci0JCQlmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrID0gPDB4M2FiMGViZj47Ci0JCQlzbGVlcCA9IDwmcG1jIDB4MDEwMDAwMDA+OwotCQl9OwotCi0JCW1waWM6IHBpY0A0MDAwMCB7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OwotCQkJY29tcGF0aWJsZSA9ICJjaHJwLG9wZW4tcGljIjsKLQkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKLQkJfTsKLQotCQltc2lANDE2MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OC1tc2kiLCAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4ODA+OwotCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTB4ZTAgMAotCQkJCTB4ZTEgMAotCQkJCTB4ZTIgMAotCQkJCTB4ZTMgMAotCQkJCTB4ZTQgMAotCQkJCTB4ZTUgMAotCQkJCTB4ZTYgMAotCQkJCTB4ZTcgMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY5LWd1dHMiLCAiZnNsLG1wYzg1NDgtZ3V0cyI7Ci0JCQlyZWcgPSA8MHhlMDAwMCAweDEwMDA+OwotCQkJcmFuZ2VzID0gPDAgMHhlMDAwMCAweDEwMDA+OwotCQkJZnNsLGhhcy1yc3RjcjsKLQotCQkJcG1jOiBwb3dlckA3MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1wbWMiLAotCQkJCQkgICAgICJmc2wsbXBjODU0OC1wbWMiOwotCQkJCXJlZyA9IDwweDcwIDB4MjA+OwotCQkJfTsKLQkJfTsKLQogCQlwYXJfaW9AZTAxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCXJlZyA9IDwweGUwMTAwIDB4MTAwPjsKLQkJCXJhbmdlcyA9IDwweDAgMHhlMDEwMCAweDEwMD47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwYXJfaW8iOwogCQkJbnVtLXBvcnRzID0gPDc+OwogCiAJCQlxZV9waW9fZTogZ3Bpby1jb250cm9sbGVyQDgwIHsKQEAgLTQ0Nyw0NyArMjIyLDExIEBACiAJCX07CiAJfTsKIAotCXFlQGUwMDgwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQlkZXZpY2VfdHlwZSA9ICJxZSI7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHFlIjsKLQkJcmFuZ2VzID0gPDB4MCAweGUwMDgwMDAwIDB4NDAwMDA+OwotCQlyZWcgPSA8MHhlMDA4MDAwMCAweDQ4MD47Ci0JCXNsZWVwID0gPCZwbWMgMHgwMDAwMDgwMD47Ci0JCWJyZy1mcmVxdWVuY3kgPSA8MD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47Ci0JCWZzbCxxZS1udW0tcmlzY3MgPSA8ND47Ci0JCWZzbCxxZS1udW0tc251bXMgPSA8NDY+OwotCi0JCXFlaWM6IGludGVycnVwdC1jb250cm9sbGVyQDgwIHsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJY29tcGF0aWJsZSA9ICJmc2wscWUtaWMiOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQ2IDIgNDYgMj47IC8vaGlnaDozMCBsb3c6MzAKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCXRpbWVyQDQ0MCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY5LXFlLWd0bSIsCi0JCQkJICAgICAiZnNsLHFlLWd0bSIsICJmc2wsZ3RtIjsKLQkJCXJlZyA9IDwweDQ0MCAweDQwPjsKLQkJCWludGVycnVwdHMgPSA8MTIgMTMgMTQgMTU+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47Ci0JCQkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCX07CisJcWU6IHFlQGUwMDgwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MCAweDAgMHhlMDA4MDAwMCAweDQwMDAwPjsKKwkJcmVnID0gPDB4MCAweGUwMDgwMDAwIDB4MCAweDQ4MD47CiAKIAkJc3BpQDRjMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU2OS1xZS1zcGkiLCAiZnNsLHNwaSI7Ci0JCQlyZWcgPSA8MHg0YzAgMHg0MD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OwogCQkJZ3Bpb3MgPSA8JnFlX3Bpb19lIDMwIDA+OwogCQkJbW9kZSA9ICJjcHUtcWUiOwogCkBAIC00OTksMjAgKzIzOCwxMCBAQAogCQl9OwogCiAJCXNwaUA1MDAgewotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNwaSI7Ci0JCQlyZWcgPSA8MHg1MDAgMHg0MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDE+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CiAJCQltb2RlID0gImNwdSI7CiAJCX07CiAKIAkJdXNiQDZjMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY5LXFlLXVzYiIsCi0JCQkJICAgICAiZnNsLG1wYzgzMjMtcWUtdXNiIjsKLQkJCXJlZyA9IDwweDZjMCAweDQwIDB4OGIwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDExPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OwogCQkJZnNsLGZ1bGxzcGVlZC1jbG9jayA9ICJjbGs1IjsKIAkJCWZzbCxsb3dzcGVlZC1jbG9jayA9ICJicmcxMCI7CiAJCQlncGlvcyA9IDwmcWVfcGlvX2YgMyAwICAgLyogVVNCT0UgKi8KQEAgLTUyNywxMCArMjU2LDYgQEAKIAkJZW5ldDA6IHVjY0AyMDAwIHsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwogCQkJY29tcGF0aWJsZSA9ICJ1Y2NfZ2V0aCI7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJcmVnID0gPDB4MjAwMCAweDIwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDMyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jay1uYW1lID0gIm5vbmUiOwogCQkJdHgtY2xvY2stbmFtZSA9ICJjbGsxMiI7CkBAIC01NDgsMzUgKzI3MywzMyBAQAogCiAJCQlxZV9waHkwOiBldGhlcm5ldC1waHlAMDcgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MSAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDEgMSAwIDA+OwogCQkJCXJlZyA9IDwweDc+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcWVfcGh5MTogZXRoZXJuZXQtcGh5QDAxIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIgMT47CisJCQkJaW50ZXJydXB0cyA9IDwyIDEgMCAwPjsKIAkJCQlyZWcgPSA8MHgxPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXFlX3BoeTI6IGV0aGVybmV0LXBoeUAwMiB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzIDE+OworCQkJCWludGVycnVwdHMgPSA8MyAxIDAgMD47CiAJCQkJcmVnID0gPDB4Mj47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlxZV9waHkzOiBldGhlcm5ldC1waHlAMDMgewogCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NCAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQgMSAwIDA+OwogCQkJCXJlZyA9IDwweDM+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwogCQkJcWVfcGh5NTogZXRoZXJuZXQtcGh5QDA0IHsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAkJCQlyZWcgPSA8MHgwND47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CiAJCQlxZV9waHk3OiBldGhlcm5ldC1waHlAMDYgewotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCXJlZyA9IDwweDY+OwogCQkJCWRldmljZV90eXBlID0gImV0aGVybmV0LXBoeSI7CiAJCQl9OwpAQCAtNjEwLDEwICszMzMsNiBAQAogCQllbmV0MjogdWNjQDIyMDAgewogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CiAJCQljb21wYXRpYmxlID0gInVjY19nZXRoIjsKLQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQlyZWcgPSA8MHgyMjAwIDB4MjAwPjsKLQkJCWludGVycnVwdHMgPSA8MzQ+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrLW5hbWUgPSAibm9uZSI7CiAJCQl0eC1jbG9jay1uYW1lID0gImNsazEyIjsKQEAgLTYzNywxMCArMzU2LDYgQEAKIAkJZW5ldDE6IHVjY0AzMDAwIHsKIAkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwogCQkJY29tcGF0aWJsZSA9ICJ1Y2NfZ2V0aCI7Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJcmVnID0gPDB4MzAwMCAweDIwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDMzPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8JnFlaWM+OwogCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CiAJCQlyeC1jbG9jay1uYW1lID0gIm5vbmUiOwogCQkJdHgtY2xvY2stbmFtZSA9ICJjbGsxNyI7CkBAIC02NjQsMTAgKzM3OSw2IEBACiAJCWVuZXQzOiB1Y2NAMzIwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKIAkJCWNvbXBhdGlibGUgPSAidWNjX2dldGgiOwotCQkJY2VsbC1pbmRleCA9IDw0PjsKLQkJCXJlZyA9IDwweDMyMDAgMHgyMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNT47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2stbmFtZSA9ICJub25lIjsKIAkJCXR4LWNsb2NrLW5hbWUgPSAiY2xrMTciOwpAQCAtNjkxLDEwICs0MDIsNiBAQAogCQllbmV0NTogdWNjQDM0MDAgewogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CiAJCQljb21wYXRpYmxlID0gInVjY19nZXRoIjsKLQkJCWNlbGwtaW5kZXggPSA8Nj47Ci0JCQlyZWcgPSA8MHgzNDAwIDB4MjAwPjsKLQkJCWludGVycnVwdHMgPSA8NDE+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrLW5hbWUgPSAibm9uZSI7CiAJCQl0eC1jbG9jay1uYW1lID0gIm5vbmUiOwpAQCAtNzA2LDEwICs0MTMsNiBAQAogCQllbmV0NzogdWNjQDM2MDAgewogCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CiAJCQljb21wYXRpYmxlID0gInVjY19nZXRoIjsKLQkJCWNlbGwtaW5kZXggPSA8OD47Ci0JCQlyZWcgPSA8MHgzNjAwIDB4MjAwPjsKLQkJCWludGVycnVwdHMgPSA8NDM+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmcWVpYz47CiAJCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKIAkJCXJ4LWNsb2NrLW5hbWUgPSAibm9uZSI7CiAJCQl0eC1jbG9jay1uYW1lID0gIm5vbmUiOwpAQCAtNzE3LDUwICs0MjAsMTQgQEAKIAkJCXBoeS1oYW5kbGUgPSA8JnFlX3BoeTc+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJzZ21paSI7CiAJCX07Ci0KLQkJbXVyYW1AMTAwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHFlLW11cmFtIiwgImZzbCxjcG0tbXVyYW0iOwotCQkJcmFuZ2VzID0gPDB4MCAweDEwMDAwIDB4MjAwMDA+OwotCi0JCQlkYXRhLW9ubHlAMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscWUtbXVyYW0tZGF0YSIsCi0JCQkJCSAgICAgImZzbCxjcG0tbXVyYW0tZGF0YSI7Ci0JCQkJcmVnID0gPDB4MCAweDIwMDAwPjsKLQkJCX07Ci0JCX07Ci0KIAl9OwogCiAJLyogUENJIEV4cHJlc3MgKi8KIAlwY2kxOiBwY2llQGUwMDBhMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhlMDAwYTAwMCAweDEwMDA+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAoUEVYKSAqLwotCQkJMDAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMDAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHgxIDB4MQotCQkJMDAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgyIDB4MQotCQkJMDAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MT47Ci0KLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MjYgMj47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47Ci0JCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMHhhMDAwMDAwMCAweDAgMHgxMDAwMDAwMAotCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhlMjgwMDAwMCAweDAgMHgwMDgwMDAwMD47Ci0JCXNsZWVwID0gPCZwbWMgMHgyMDAwMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47CisJCXJlZyA9IDwweDAgMHhlMDAwYTAwMCAweDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMCAwIDB4YTAwMDAwMDAgMHgwIDB4MTAwMDAwMDAKKwkJCSAgMHgxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDAgMHhlMjgwMDAwMCAweDAgMHgwMDgwMDAwMD47CiAJCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAKIAkJCQkgIDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAogCQkJCSAgMHgwIDB4MTAwMDAwMDAKQEAgLTc3MSwyMCArNDM4LDE1IEBACiAJCX07CiAJfTsKIAotCXJpbzA6IHJhcGlkaW9AZTAwYzAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTY5LXJhcGlkaW8iLCAiZnNsLHJhcGlkaW8tZGVsdGEiOwotCQlyZWcgPSA8MHhlMDBjMDAwMCAweDIwMDAwPjsKLQkJcmFuZ2VzID0gPDB4MCAweDAgMHhjMDAwMDAwMCAweDAgMHgyMDAwMDAwMD47Ci0JCWludGVycnVwdHMgPSA8NDggMiAvKiBlcnJvciAgICAgKi8KLQkJCSAgICAgIDQ5IDIgLyogYmVsbF9vdXRiICovCi0JCQkgICAgICA1MCAyIC8qIGJlbGxfaW5iICAqLwotCQkJICAgICAgNTMgMiAvKiBtc2cxX3R4ICAgKi8KLQkJCSAgICAgIDU0IDIgLyogbXNnMV9yeCAgICovCi0JCQkgICAgICA1NSAyIC8qIG1zZzJfdHggICAqLwotCQkJICAgICAgNTYgMiAvKiBtc2cyX3J4ICAgKi8+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJc2xlZXAgPSA8JnBtYyAweDAwMDgwMDAwPjsKKwlyaW86IHJhcGlkaW9AZTAwYzAwMDAwIHsKKwkJcmVnID0gPDB4MCAweGUwMGMwMDAwIDB4MCAweDIwMDAwPjsKKwkJcG9ydDEgeworCQkJcmFuZ2VzID0gPDB4MCAweDAgMHgwIDB4YzAwMDAwMDAgMHgwIDB4MjAwMDAwMDA+OworCQl9OworCQlwb3J0MiB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OwogCX07CiB9OworCisvaW5jbHVkZS8gImZzbC9tcGM4NTY5c2ktcG9zdC5kdHNpIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NzJkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzLmR0cwppbmRleCBmNmMwNGQyLi4wYzlmMjk1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzLmR0cwpAQCAtOSw2NyArOSwxOCBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAiZnNsL21wYzg1NzJzaS1wcmUuZHRzaSIKKwogLyB7CiAJbW9kZWwgPSAiZnNsLE1QQzg1NzJEUyI7CiAJY29tcGF0aWJsZSA9ICJmc2wsTVBDODU3MkRTIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkjc2l6ZS1jZWxscyA9IDwyPjsKLQotCWFsaWFzZXMgewotCQlldGhlcm5ldDAgPSAmZW5ldDA7Ci0JCWV0aGVybmV0MSA9ICZlbmV0MTsKLQkJZXRoZXJuZXQyID0gJmVuZXQyOwotCQlldGhlcm5ldDMgPSAmZW5ldDM7Ci0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlwY2kwID0gJnBjaTA7Ci0JCXBjaTEgPSAmcGNpMTsKLQkJcGNpMiA9ICZwY2kyOwotCX07Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsODU3MkAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MHgwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDgwMDA+OwkJLy8gTDEsIDMySwotCQkJaS1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47Ci0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwotCQl9OwotCi0JCVBvd2VyUEMsODU3MkAxIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MHgxPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDgwMDA+OwkJLy8gTDEsIDMySwotCQkJaS1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47Ci0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwotCQl9OwotCX07CiAKIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCX07CiAKLQlsb2NhbGJ1c0BmZmUwNTAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOworCWJvYXJkX2xiYzogbGJjOiBsb2NhbGJ1c0BmZmUwNTAwMCB7CiAJCXJlZyA9IDwwIDB4ZmZlMDUwMDAgMCAweDEwMDA+OwotCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAogCQlyYW5nZXMgPSA8MHgwIDB4MCAweDAgMHhlODAwMDAwMCAweDA4MDAwMDAwCiAJCQkgIDB4MSAweDAgMHgwIDB4ZTAwMDAwMDAgMHgwODAwMDAwMApAQCAtNzgsNjAxICsyOSwxNyBAQAogCQkJICAweDQgMHgwIDB4MCAweGZmYTQwMDAwIDB4MDAwNDAwMDAKIAkJCSAgMHg1IDB4MCAweDAgMHhmZmE4MDAwMCAweDAwMDQwMDAwCiAJCQkgIDB4NiAweDAgMHgwIDB4ZmZhYzAwMDAgMHgwMDA0MDAwMD47Ci0KLQkJbm9yQDAsMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOwotCQkJcmVnID0gPDB4MCAweDAgMHg4MDAwMDAwPjsKLQkJCWJhbmstd2lkdGggPSA8Mj47Ci0JCQlkZXZpY2Utd2lkdGggPSA8MT47Ci0KLQkJCXJhbWRpc2tAMCB7Ci0JCQkJcmVnID0gPDB4MCAweDAzMDAwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlkaWFnbm9zdGljQDMwMDAwMDAgewotCQkJCXJlZyA9IDwweDAzMDAwMDAwIDB4MDBlMDAwMDA+OwotCQkJCXJlYWQtb25seTsKLQkJCX07Ci0KLQkJCWRpbmtAM2UwMDAwMCB7Ci0JCQkJcmVnID0gPDB4MDNlMDAwMDAgMHgwMDIwMDAwMD47Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQotCQkJa2VybmVsQDQwMDAwMDAgewotCQkJCXJlZyA9IDwweDA0MDAwMDAwIDB4MDA0MDAwMDA+OwotCQkJCXJlYWQtb25seTsKLQkJCX07Ci0KLQkJCWpmZnMyQDQ0MDAwMDAgewotCQkJCXJlZyA9IDwweDA0NDAwMDAwIDB4MDNiMDAwMDA+OwotCQkJfTsKLQotCQkJZHRiQDdmMDAwMDAgewotCQkJCXJlZyA9IDwweDA3ZjAwMDAwIDB4MDAwODAwMDA+OwotCQkJCXJlYWQtb25seTsKLQkJCX07Ci0KLQkJCXUtYm9vdEA3ZjgwMDAwIHsKLQkJCQlyZWcgPSA8MHgwN2Y4MDAwMCAweDAwMDgwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCQl9OwotCi0JCW5hbmRAMiwwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWZjbS1uYW5kIiwKLQkJCQkgICAgICJmc2wsZWxiYy1mY20tbmFuZCI7Ci0JCQlyZWcgPSA8MHgyIDB4MCAweDQwMDAwPjsKLQotCQkJdS1ib290QDAgewotCQkJCXJlZyA9IDwweDAgMHgwMjAwMDAwMD47Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQotCQkJamZmczJAMjAwMDAwMCB7Ci0JCQkJcmVnID0gPDB4MDIwMDAwMDAgMHgxMDAwMDAwMD47Ci0JCQl9OwotCi0JCQlyYW1kaXNrQDEyMDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgxMjAwMDAwMCAweDA4MDAwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlrZXJuZWxAMWEwMDAwMDAgewotCQkJCXJlZyA9IDwweDFhMDAwMDAwIDB4MDQwMDAwMDA+OwotCQkJfTsKLQotCQkJZHRiQDFlMDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgxZTAwMDAwMCAweDAxMDAwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQllbXB0eUAxZjAwMDAwMCB7Ci0JCQkJcmVnID0gPDB4MWYwMDAwMDAgMHgyMTAwMDAwMD47Ci0JCQl9OwotCQl9OwotCi0JCW5hbmRANCwwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZmNtLW5hbmQiLAotCQkJCSAgICAgImZzbCxlbGJjLWZjbS1uYW5kIjsKLQkJCXJlZyA9IDwweDQgMHgwIDB4NDAwMDA+OwotCQl9OwotCi0JCW5hbmRANSwwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZmNtLW5hbmQiLAotCQkJCSAgICAgImZzbCxlbGJjLWZjbS1uYW5kIjsKLQkJCXJlZyA9IDwweDUgMHgwIDB4NDAwMDA+OwotCQl9OwotCi0JCW5hbmRANiwwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZmNtLW5hbmQiLAotCQkJCSAgICAgImZzbCxlbGJjLWZjbS1uYW5kIjsKLQkJCXJlZyA9IDwweDYgMHgwIDB4NDAwMDA+OwotCQl9OwogCX07CiAKLQlzb2M4NTcyQGZmZTAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOworCWJvYXJkX3NvYzogc29jOiBzb2M4NTcyQGZmZTAwMDAwIHsKIAkJcmFuZ2VzID0gPDB4MCAwIDB4ZmZlMDAwMDAgMHgxMDAwMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KLQotCQllY20tbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MTI+OwotCQl9OwotCi0JCWVjbUAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZWNtIiwgImZzbCxlY20iOwotCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1tZW1vcnktY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTggMj47Ci0JCX07Ci0KLQkJbWVtb3J5LWNvbnRyb2xsZXJANjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLW1lbW9yeS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDYwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKLQkJfTsKLQotCQlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWwyLWNhY2hlLWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKLQkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCi0JCQljYWNoZS1zaXplID0gPDB4MTAwMDAwPjsgLy8gTDIsIDFNCi0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCX07Ci0KLQkJaTJjQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMzEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWRtYUBjMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4YzMwMCAweDQ+OwotCQkJcmFuZ2VzID0gPDB4MCAweGMxMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw3NiAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw3NyAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDc4IDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NzkgMj47Ci0JCQl9OwotCQl9OwotCi0JCWRtYUAyMTMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKLQkJCXJlZyA9IDwweDIxMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjExMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMCAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMSAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIyIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjMgMj47Ci0JCQl9OwotCQl9OwotCi0JCXB0cF9jbG9ja0AyNEUwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxldHNlYy1wdHAiOwotCQkJcmVnID0gPDB4MjRFMDAgMHhCMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDY4IDIgNjkgMiA3MCAyIDcxIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwgJm1waWMgPjsKLQkJCWZzbCx0Y2xrLXBlcmlvZCA9IDw1PjsKLQkJCWZzbCx0bXItcHJzYyA9IDwyMDA+OwotCQkJZnNsLHRtci1hZGQgPSA8MHhBQUFBQUFBQj47Ci0JCQlmc2wsdG1yLWZpcGVyMSA9IDwweDNCOUFDOUZCPjsKLQkJCWZzbCx0bXItZmlwZXIyID0gPDB4M0I5QUM5RkI+OwotCQkJZnNsLG1heC1hZGogPSA8NDk5OTk5OTk5PjsKLQkJfTsKLQotCQllbmV0MDogZXRoZXJuZXRAMjQwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKLQkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7Ci0JCQlyZWcgPSA8MHgyNDAwMCAweDEwMDA+OwotCQkJcmFuZ2VzID0gPDB4MCAweDI0MDAwIDB4MTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MjkgMiAzMCAyIDM0IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKLQkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwotCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7Ci0KLQkJCW1kaW9ANTIwIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLW1kaW8iOwotCQkJCXJlZyA9IDwweDUyMCAweDIwPjsKLQotCQkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKLQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJCWludGVycnVwdHMgPSA8MTAgMT47Ci0JCQkJCXJlZyA9IDwweDA+OwotCQkJCX07Ci0JCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewotCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQkJaW50ZXJydXB0cyA9IDwxMCAxPjsKLQkJCQkJcmVnID0gPDB4MT47Ci0JCQkJfTsKLQkJCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQlpbnRlcnJ1cHRzID0gPDEwIDE+OwotCQkJCQlyZWcgPSA8MHgyPjsKLQkJCQl9OwotCQkJCXBoeTM6IGV0aGVybmV0LXBoeUAzIHsKLQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJCWludGVycnVwdHMgPSA8MTAgMT47Ci0JCQkJCXJlZyA9IDwweDM+OwotCQkJCX07Ci0KLQkJCQl0YmkwOiB0YmktcGh5QDExIHsKLQkJCQkJcmVnID0gPDB4MTE+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQllbmV0MTogZXRoZXJuZXRAMjUwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKLQkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7Ci0JCQlyZWcgPSA8MHgyNTAwMCAweDEwMDA+OwotCQkJcmFuZ2VzID0gPDB4MCAweDI1MDAwIDB4MTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MzUgMiAzNiAyIDQwIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQl0YmktaGFuZGxlID0gPCZ0YmkxPjsKLQkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwotCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7Ci0KLQkJCW1kaW9ANTIwIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7Ci0JCQkJcmVnID0gPDB4NTIwIDB4MjA+OwotCi0JCQkJdGJpMTogdGJpLXBoeUAxMSB7Ci0JCQkJCXJlZyA9IDwweDExPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJZW5ldDI6IGV0aGVybmV0QDI2MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwotCQkJcmVnID0gPDB4MjYwMDAgMHgxMDAwPjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyNjAwMCAweDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDMxIDIgMzIgMiAzMyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJdGJpLWhhbmRsZSA9IDwmdGJpMj47Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkyPjsKLQkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCi0JCQltZGlvQDUyMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci10YmkiOwotCQkJCXJlZyA9IDwweDUyMCAweDIwPjsKLQotCQkJCXRiaTI6IHRiaS1waHlAMTEgewotCQkJCQlyZWcgPSA8MHgxMT47Ci0JCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCWVuZXQzOiBldGhlcm5ldEAyNzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI3MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjcwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwzNyAyIDM4IDIgMzkgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCXRiaS1oYW5kbGUgPSA8JnRiaTM+OwotCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQotCQkJbWRpb0A1MjAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItdGJpIjsKLQkJCQlyZWcgPSA8MHg1MjAgMHgyMD47Ci0KLQkJCQl0YmkzOiB0YmktcGh5QDExIHsKLQkJCQkJcmVnID0gPDB4MTE+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLy9nbG9iYWwgdXRpbGl0aWVzIGJsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWd1dHMiOwotCQkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKLQkJCWZzbCxoYXMtcnN0Y3I7Ci0JCX07Ci0KLQkJbXNpQDQxNjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbXNpIiwgImZzbCxtcGljLW1zaSI7Ci0JCQlyZWcgPSA8MHg0MTYwMCAweDgwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAKLQkJCQkweGUxIDAKLQkJCQkweGUyIDAKLQkJCQkweGUzIDAKLQkJCQkweGU0IDAKLQkJCQkweGU1IDAKLQkJCQkweGU2IDAKLQkJCQkweGU3IDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJY3J5cHRvQDMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYzMuMCIsICJmc2wsc2VjMi40IiwgImZzbCxzZWMyLjIiLAotCQkJCSAgICAgImZzbCxzZWMyLjEiLCAiZnNsLHNlYzIuMCI7Ci0JCQlyZWcgPSA8MHgzMDAwMCAweDEwMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NDUgMiA1OCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZnNsLG51bS1jaGFubmVscyA9IDw0PjsKLQkJCWZzbCxjaGFubmVsLWZpZm8tbGVuID0gPDI0PjsKLQkJCWZzbCxleGVjLXVuaXRzLW1hc2sgPSA8MHg5ZmU+OwotCQkJZnNsLGRlc2NyaXB0b3ItdHlwZXMtbWFzayA9IDwweDNhYjBlYmY+OwotCQl9OwotCi0JCW1waWM6IHBpY0A0MDAwMCB7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OwotCQkJY29tcGF0aWJsZSA9ICJjaHJwLG9wZW4tcGljIjsKLQkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKLQkJfTsKIAl9OwogCi0JcGNpMDogcGNpZUBmZmUwODAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKKwlib2FyZF9wY2kwOiBwY2kwOiBwY2llQGZmZTA4MDAwIHsKIAkJcmVnID0gPDAgMHhmZmUwODAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47CiAJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAgMCAweDgwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZmZjMDAwMDAgMHgwIDB4MDAwMTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNCAyPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZmYwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDExIGZ1bmMgMCAtIFBDSSBzbG90IDEgKi8KLQkJCTB4ODgwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxCi0JCQkweDg4MDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MQotCQkJMHg4ODAwIDB4MCAweDAgMHgzICZtcGljIDB4NCAweDEKLQkJCTB4ODgwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTEgZnVuYyAxIC0gUENJIHNsb3QgMSAqLwotCQkJMHg4OTAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEKLQkJCTB4ODkwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkweDg5MDAgMHgwIDB4MCAweDMgJm1waWMgMHg0IDB4MQotCQkJMHg4OTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEKLQotCQkJLyogSURTRUwgMHgxMSBmdW5jIDIgLSBQQ0kgc2xvdCAxICovCi0JCQkweDhhMDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MQotCQkJMHg4YTAwIDB4MCAweDAgMHgyICZtcGljIDB4MyAweDEKLQkJCTB4OGEwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxCi0JCQkweDhhMDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MQotCi0JCQkvKiBJRFNFTCAweDExIGZ1bmMgMyAtIFBDSSBzbG90IDEgKi8KLQkJCTB4OGIwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxCi0JCQkweDhiMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MQotCQkJMHg4YjAwIDB4MCAweDAgMHgzICZtcGljIDB4NCAweDEKLQkJCTB4OGIwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTEgZnVuYyA0IC0gUENJIHNsb3QgMSAqLwotCQkJMHg4YzAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEKLQkJCTB4OGMwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkweDhjMDAgMHgwIDB4MCAweDMgJm1waWMgMHg0IDB4MQotCQkJMHg4YzAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEKLQotCQkJLyogSURTRUwgMHgxMSBmdW5jIDUgLSBQQ0kgc2xvdCAxICovCi0JCQkweDhkMDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MQotCQkJMHg4ZDAwIDB4MCAweDAgMHgyICZtcGljIDB4MyAweDEKLQkJCTB4OGQwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxCi0JCQkweDhkMDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MQotCi0JCQkvKiBJRFNFTCAweDExIGZ1bmMgNiAtIFBDSSBzbG90IDEgKi8KLQkJCTB4OGUwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxCi0JCQkweDhlMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MQotCQkJMHg4ZTAwIDB4MCAweDAgMHgzICZtcGljIDB4NCAweDEKLQkJCTB4OGUwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTEgZnVuYyA3IC0gUENJIHNsb3QgMSAqLwotCQkJMHg4ZjAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEKLQkJCTB4OGYwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkweDhmMDAgMHgwIDB4MCAweDMgJm1waWMgMHg0IDB4MQotCQkJMHg4ZjAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEKLQotCQkJLyogSURTRUwgMHgxMiBmdW5jIDAgLSBQQ0kgc2xvdCAyICovCi0JCQkweDkwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MQotCQkJMHg5MDAwIDB4MCAweDAgMHgyICZtcGljIDB4NCAweDEKLQkJCTB4OTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxCi0JCQkweDkwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgyIDB4MQotCi0JCQkvKiBJRFNFTCAweDEyIGZ1bmMgMSAtIFBDSSBzbG90IDIgKi8KLQkJCTB4OTEwMCAweDAgMHgwIDB4MSAmbXBpYyAweDMgMHgxCi0JCQkweDkxMDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MQotCQkJMHg5MTAwIDB4MCAweDAgMHgzICZtcGljIDB4MSAweDEKLQkJCTB4OTEwMCAweDAgMHgwIDB4NCAmbXBpYyAweDIgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTIgZnVuYyAyIC0gUENJIHNsb3QgMiAqLwotCQkJMHg5MjAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEKLQkJCTB4OTIwMCAweDAgMHgwIDB4MiAmbXBpYyAweDQgMHgxCi0JCQkweDkyMDAgMHgwIDB4MCAweDMgJm1waWMgMHgxIDB4MQotCQkJMHg5MjAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEKLQotCQkJLyogSURTRUwgMHgxMiBmdW5jIDMgLSBQQ0kgc2xvdCAyICovCi0JCQkweDkzMDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MQotCQkJMHg5MzAwIDB4MCAweDAgMHgyICZtcGljIDB4NCAweDEKLQkJCTB4OTMwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxCi0JCQkweDkzMDAgMHgwIDB4MCAweDQgJm1waWMgMHgyIDB4MQotCi0JCQkvKiBJRFNFTCAweDEyIGZ1bmMgNCAtIFBDSSBzbG90IDIgKi8KLQkJCTB4OTQwMCAweDAgMHgwIDB4MSAmbXBpYyAweDMgMHgxCi0JCQkweDk0MDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MQotCQkJMHg5NDAwIDB4MCAweDAgMHgzICZtcGljIDB4MSAweDEKLQkJCTB4OTQwMCAweDAgMHgwIDB4NCAmbXBpYyAweDIgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTIgZnVuYyA1IC0gUENJIHNsb3QgMiAqLwotCQkJMHg5NTAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEKLQkJCTB4OTUwMCAweDAgMHgwIDB4MiAmbXBpYyAweDQgMHgxCi0JCQkweDk1MDAgMHgwIDB4MCAweDMgJm1waWMgMHgxIDB4MQotCQkJMHg5NTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEKLQotCQkJLyogSURTRUwgMHgxMiBmdW5jIDYgLSBQQ0kgc2xvdCAyICovCi0JCQkweDk2MDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MQotCQkJMHg5NjAwIDB4MCAweDAgMHgyICZtcGljIDB4NCAweDEKLQkJCTB4OTYwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxCi0JCQkweDk2MDAgMHgwIDB4MCAweDQgJm1waWMgMHgyIDB4MQotCi0JCQkvKiBJRFNFTCAweDEyIGZ1bmMgNyAtIFBDSSBzbG90IDIgKi8KLQkJCTB4OTcwMCAweDAgMHgwIDB4MSAmbXBpYyAweDMgMHgxCi0JCQkweDk3MDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MQotCQkJMHg5NzAwIDB4MCAweDAgMHgzICZtcGljIDB4MSAweDEKLQkJCTB4OTcwMCAweDAgMHgwIDB4NCAmbXBpYyAweDIgMHgxCi0KLQkJCS8vIElEU0VMIDB4MWMgIFVTQgotCQkJMHhlMDAwIDB4MCAweDAgMHgxICZpODI1OSAweGMgMHgyCi0JCQkweGUxMDAgMHgwIDB4MCAweDIgJmk4MjU5IDB4OSAweDIKLQkJCTB4ZTIwMCAweDAgMHgwIDB4MyAmaTgyNTkgMHhhIDB4MgotCQkJMHhlMzAwIDB4MCAweDAgMHg0ICZpODI1OSAweGIgMHgyCi0KLQkJCS8vIElEU0VMIDB4MWQgIEF1ZGlvCi0JCQkweGU4MDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4NiAweDIKLQotCQkJLy8gSURTRUwgMHgxZSBMZWdhY3kKLQkJCTB4ZjAwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg3IDB4MgotCQkJMHhmMTAwIDB4MCAweDAgMHgxICZpODI1OSAweDcgMHgyCi0KLQkJCS8vIElEU0VMIDB4MWYgSURFL1NBVEEKLQkJCTB4ZjgwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHhlIDB4MgotCQkJMHhmOTAwIDB4MCAweDAgMHgxICZpODI1OSAweDUgMHgyCi0KLQkJCT47Ci0KIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtNjgwLDk5ICs0NywxNCBAQAogCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKIAkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCiAJCQkJICAweDAgMHgxMDAwMD47Ci0JCQl1bGkxNTc1QDAgewotCQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCi0JCQkJCSAgMHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCi0JCQkJCSAgMHgwIDB4MjAwMDAwMDAKLQotCQkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKLQkJCQkJICAweDAgMHgxMDAwMD47Ci0JCQkJaXNhQDFlIHsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiaXNhIjsKLQkJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkJCQlyZWcgPSA8MHhmMDAwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkJCXJhbmdlcyA9IDwweDEgMHgwIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJCQkgIDB4MTAwMD47Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jmk4MjU5PjsKLQotCQkJCQlpODI1OTogaW50ZXJydXB0LWNvbnRyb2xsZXJAMjAgewotCQkJCQkJcmVnID0gPDB4MSAweDIwIDB4MgotCQkJCQkJICAgICAgIDB4MSAweGEwIDB4MgotCQkJCQkJICAgICAgIDB4MSAweDRkMCAweDI+OwotCQkJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkJCQlkZXZpY2VfdHlwZSA9ICJpbnRlcnJ1cHQtY29udHJvbGxlciI7Ci0JCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJCQljb21wYXRpYmxlID0gImNocnAsaWljIjsKLQkJCQkJCWludGVycnVwdHMgPSA8OSAyPjsKLQkJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQl9OwotCi0JCQkJCWk4MDQyQDYwIHsKLQkJCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJCQlyZWcgPSA8MHgxIDB4NjAgMHgxIDB4MSAweDY0IDB4MT47Ci0JCQkJCQlpbnRlcnJ1cHRzID0gPDEgMyAxMiAzPjsKLQkJCQkJCWludGVycnVwdC1wYXJlbnQgPQotCQkJCQkJCTwmaTgyNTk+OwotCi0JCQkJCQlrZXlib2FyZEAwIHsKLQkJCQkJCQlyZWcgPSA8MHgwPjsKLQkJCQkJCQljb21wYXRpYmxlID0gInBucFBOUCwzMDMiOwotCQkJCQkJfTsKLQotCQkJCQkJbW91c2VAMSB7Ci0JCQkJCQkJcmVnID0gPDB4MT47Ci0JCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsZjAzIjsKLQkJCQkJCX07Ci0JCQkJCX07Ci0KLQkJCQkJcnRjQDcwIHsKLQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGIwMCI7Ci0JCQkJCQlyZWcgPSA8MHgxIDB4NzAgMHgyPjsKLQkJCQkJfTsKLQotCQkJCQlncGlvQDQwMCB7Ci0JCQkJCQlyZWcgPSA8MHgxIDB4NDAwIDB4ODA+OwotCQkJCQl9OwotCQkJCX07Ci0JCQl9OwogCQl9OwotCiAJfTsKIAogCXBjaTE6IHBjaWVAZmZlMDkwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCXJlZyA9IDwwIDB4ZmZlMDkwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzEwMDAwIDB4MCAweDAwMDEwMDAwPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MjUgMj47Ci0JCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMHgwIDB4MCAweDc+OwotCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJLyogSURTRUwgMHgwICovCi0JCQkwMDAwIDB4MCAweDAgMHgxICZtcGljIDB4NCAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg1IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDYgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4NyAweDEKLQkJCT47CiAJCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAKIAkJCQkgIDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAogCQkJCSAgMHgwIDB4MjAwMDAwMDAKQEAgLTc4NCwzMSArNjYsMTAgQEAKIAl9OwogCiAJcGNpMjogcGNpZUBmZmUwYTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJcmVnID0gPDAgMHhmZmUwYTAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47CiAJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAgMCAweGMwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZmZjMjAwMDAgMHgwIDB4MDAwMTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNiAyPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQotCQkJPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhjMDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtODE5LDMgKzgwLDExIEBACiAJCX07CiAJfTsKIH07CisKKy8qCisgKiBtcGM4NTcyZHMuZHRzaSBtdXN0IGJlIGxhc3QgdG8gZW5zdXJlIGJvYXJkX3BjaTAgb3ZlcnJpZGVzIHBjaTAgc2V0dGluZ3MKKyAqIGZvciBpbnRlcnJ1cHQtbWFwICYgaW50ZXJydXB0LW1hcC1tYXNrCisgKi8KKworL2luY2x1ZGUvICJmc2wvbXBjODU3MnNpLXBvc3QuZHRzaSIKKy9pbmNsdWRlLyAibXBjODU3MmRzLmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkNGZhYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHMuZHRzaQpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIE1QQzg1NzJEUyBEZXZpY2UgVHJlZSBTb3VyY2Ugc3R1YiAobm8gYWRkcmVzc2VzIG9yIHRvcC1sZXZlbCByYW5nZXMpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyZib2FyZF9sYmMgeworCW5vckAwLDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKKwkJcmVnID0gPDB4MCAweDAgMHg4MDAwMDAwPjsKKwkJYmFuay13aWR0aCA9IDwyPjsKKwkJZGV2aWNlLXdpZHRoID0gPDE+OworCisJCXJhbWRpc2tAMCB7CisJCQlyZWcgPSA8MHgwIDB4MDMwMDAwMDA+OworCQkJcmVhZC1vbmx5OworCQl9OworCisJCWRpYWdub3N0aWNAMzAwMDAwMCB7CisJCQlyZWcgPSA8MHgwMzAwMDAwMCAweDAwZTAwMDAwPjsKKwkJCXJlYWQtb25seTsKKwkJfTsKKworCQlkaW5rQDNlMDAwMDAgeworCQkJcmVnID0gPDB4MDNlMDAwMDAgMHgwMDIwMDAwMD47CisJCQlyZWFkLW9ubHk7CisJCX07CisKKwkJa2VybmVsQDQwMDAwMDAgeworCQkJcmVnID0gPDB4MDQwMDAwMDAgMHgwMDQwMDAwMD47CisJCQlyZWFkLW9ubHk7CisJCX07CisKKwkJamZmczJANDQwMDAwMCB7CisJCQlyZWcgPSA8MHgwNDQwMDAwMCAweDAzYjAwMDAwPjsKKwkJfTsKKworCQlkdGJAN2YwMDAwMCB7CisJCQlyZWcgPSA8MHgwN2YwMDAwMCAweDAwMDgwMDAwPjsKKwkJCXJlYWQtb25seTsKKwkJfTsKKworCQl1LWJvb3RAN2Y4MDAwMCB7CisJCQlyZWcgPSA8MHgwN2Y4MDAwMCAweDAwMDgwMDAwPjsKKwkJCXJlYWQtb25seTsKKwkJfTsKKwl9OworCisJbmFuZEAyLDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZmNtLW5hbmQiLAorCQkJICAgICAiZnNsLGVsYmMtZmNtLW5hbmQiOworCQlyZWcgPSA8MHgyIDB4MCAweDQwMDAwPjsKKworCQl1LWJvb3RAMCB7CisJCQlyZWcgPSA8MHgwIDB4MDIwMDAwMDA+OworCQkJcmVhZC1vbmx5OworCQl9OworCisJCWpmZnMyQDIwMDAwMDAgeworCQkJcmVnID0gPDB4MDIwMDAwMDAgMHgxMDAwMDAwMD47CisJCX07CisKKwkJcmFtZGlza0AxMjAwMDAwMCB7CisJCQlyZWcgPSA8MHgxMjAwMDAwMCAweDA4MDAwMDAwPjsKKwkJCXJlYWQtb25seTsKKwkJfTsKKworCQlrZXJuZWxAMWEwMDAwMDAgeworCQkJcmVnID0gPDB4MWEwMDAwMDAgMHgwNDAwMDAwMD47CisJCX07CisKKwkJZHRiQDFlMDAwMDAwIHsKKwkJCXJlZyA9IDwweDFlMDAwMDAwIDB4MDEwMDAwMDA+OworCQkJcmVhZC1vbmx5OworCQl9OworCisJCWVtcHR5QDFmMDAwMDAwIHsKKwkJCXJlZyA9IDwweDFmMDAwMDAwIDB4MjEwMDAwMDA+OworCQl9OworCX07CisKKwluYW5kQDQsMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZmNtLW5hbmQiLAorCQkJICAgICAiZnNsLGVsYmMtZmNtLW5hbmQiOworCQlyZWcgPSA8MHg0IDB4MCAweDQwMDAwPjsKKwl9OworCisJbmFuZEA1LDAgeworCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWZjbS1uYW5kIiwKKwkJCSAgICAgImZzbCxlbGJjLWZjbS1uYW5kIjsKKwkJcmVnID0gPDB4NSAweDAgMHg0MDAwMD47CisJfTsKKworCW5hbmRANiwwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1mY20tbmFuZCIsCisJCQkgICAgICJmc2wsZWxiYy1mY20tbmFuZCI7CisJCXJlZyA9IDwweDYgMHgwIDB4NDAwMDA+OworCX07Cit9OworCismYm9hcmRfc29jIHsKKwllbmV0MDogZXRoZXJuZXRAMjQwMDAgeworCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKKwkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CisJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOworCX07CisKKwltZGlvQDI0NTIwIHsKKwkJcGh5MDogZXRoZXJuZXQtcGh5QDAgeworCQkJaW50ZXJydXB0cyA9IDwxMCAxIDAgMD47CisJCQlyZWcgPSA8MHgwPjsKKwkJfTsKKwkJcGh5MTogZXRoZXJuZXQtcGh5QDEgeworCQkJaW50ZXJydXB0cyA9IDwxMCAxIDAgMD47CisJCQlyZWcgPSA8MHgxPjsKKwkJfTsKKwkJcGh5MjogZXRoZXJuZXQtcGh5QDIgeworCQkJaW50ZXJydXB0cyA9IDwxMCAxIDAgMD47CisJCQlyZWcgPSA8MHgyPjsKKwkJfTsKKwkJcGh5MzogZXRoZXJuZXQtcGh5QDMgeworCQkJaW50ZXJydXB0cyA9IDwxMCAxIDAgMD47CisJCQlyZWcgPSA8MHgzPjsKKwkJfTsKKworCQl0YmkwOiB0YmktcGh5QDExIHsKKwkJCXJlZyA9IDwweDExPjsKKwkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQl9OworCX07CisKKwlwdHBfY2xvY2tAMjRlMDAgeworCQlmc2wsdGNsay1wZXJpb2QgPSA8NT47CisJCWZzbCx0bXItcHJzYyA9IDwyMDA+OworCQlmc2wsdG1yLWFkZCA9IDwweEFBQUFBQUFCPjsKKwkJZnNsLHRtci1maXBlcjEgPSA8MHgzQjlBQzlGQj47CisJCWZzbCx0bXItZmlwZXIyID0gPDB4M0I5QUM5RkI+OworCQlmc2wsbWF4LWFkaiA9IDw0OTk5OTk5OTk+OworCX07CisKKwllbmV0MTogZXRoZXJuZXRAMjUwMDAgeworCQl0YmktaGFuZGxlID0gPCZ0YmkxPjsKKwkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CisJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOworCisJfTsKKworCW1kaW9AMjU1MjAgeworCQl0YmkxOiB0YmktcGh5QDExIHsKKwkJCXJlZyA9IDwweDExPjsKKwkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQl9OworCX07CisKKwllbmV0MjogZXRoZXJuZXRAMjYwMDAgeworCQl0YmktaGFuZGxlID0gPCZ0YmkyPjsKKwkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47CisJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOworCisJfTsKKwltZGlvQDI2NTIwIHsKKwkJdGJpMjogdGJpLXBoeUAxMSB7CisJCQlyZWcgPSA8MHgxMT47CisJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKKwkJfTsKKwl9OworCisJZW5ldDM6IGV0aGVybmV0QDI3MDAwIHsKKwkJdGJpLWhhbmRsZSA9IDwmdGJpMz47CisJCXBoeS1oYW5kbGUgPSA8JnBoeTM+OworCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKKwl9OworCisJbWRpb0AyNzUyMCB7CisJCXRiaTM6IHRiaS1waHlAMTEgeworCQkJcmVnID0gPDB4MTE+OworCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CisJCX07CisJfTsKK307CisKKyZib2FyZF9wY2kwIHsKKwlwY2llQDAgeworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmZjAwIDB4MCAweDAgMHg3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKwkJCS8qIElEU0VMIDB4MTEgZnVuYyAwIC0gUENJIHNsb3QgMSAqLworCQkJMHg4ODAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEgMCAwCisJCQkweDg4MDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MSAwIDAKKwkJCTB4ODgwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxIDAgMAorCQkJMHg4ODAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTEgZnVuYyAxIC0gUENJIHNsb3QgMSAqLworCQkJMHg4OTAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEgMCAwCisJCQkweDg5MDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MSAwIDAKKwkJCTB4ODkwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxIDAgMAorCQkJMHg4OTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTEgZnVuYyAyIC0gUENJIHNsb3QgMSAqLworCQkJMHg4YTAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEgMCAwCisJCQkweDhhMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MSAwIDAKKwkJCTB4OGEwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxIDAgMAorCQkJMHg4YTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTEgZnVuYyAzIC0gUENJIHNsb3QgMSAqLworCQkJMHg4YjAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEgMCAwCisJCQkweDhiMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MSAwIDAKKwkJCTB4OGIwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxIDAgMAorCQkJMHg4YjAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTEgZnVuYyA0IC0gUENJIHNsb3QgMSAqLworCQkJMHg4YzAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEgMCAwCisJCQkweDhjMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MSAwIDAKKwkJCTB4OGMwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxIDAgMAorCQkJMHg4YzAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTEgZnVuYyA1IC0gUENJIHNsb3QgMSAqLworCQkJMHg4ZDAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEgMCAwCisJCQkweDhkMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MSAwIDAKKwkJCTB4OGQwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxIDAgMAorCQkJMHg4ZDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTEgZnVuYyA2IC0gUENJIHNsb3QgMSAqLworCQkJMHg4ZTAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEgMCAwCisJCQkweDhlMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MSAwIDAKKwkJCTB4OGUwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxIDAgMAorCQkJMHg4ZTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTEgZnVuYyA3IC0gUENJIHNsb3QgMSAqLworCQkJMHg4ZjAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEgMCAwCisJCQkweDhmMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MSAwIDAKKwkJCTB4OGYwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxIDAgMAorCQkJMHg4ZjAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTIgZnVuYyAwIC0gUENJIHNsb3QgMiAqLworCQkJMHg5MDAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEgMCAwCisJCQkweDkwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MSAwIDAKKwkJCTB4OTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHg5MDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTIgZnVuYyAxIC0gUENJIHNsb3QgMiAqLworCQkJMHg5MTAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEgMCAwCisJCQkweDkxMDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MSAwIDAKKwkJCTB4OTEwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHg5MTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTIgZnVuYyAyIC0gUENJIHNsb3QgMiAqLworCQkJMHg5MjAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEgMCAwCisJCQkweDkyMDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MSAwIDAKKwkJCTB4OTIwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHg5MjAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTIgZnVuYyAzIC0gUENJIHNsb3QgMiAqLworCQkJMHg5MzAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEgMCAwCisJCQkweDkzMDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MSAwIDAKKwkJCTB4OTMwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHg5MzAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTIgZnVuYyA0IC0gUENJIHNsb3QgMiAqLworCQkJMHg5NDAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEgMCAwCisJCQkweDk0MDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MSAwIDAKKwkJCTB4OTQwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHg5NDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTIgZnVuYyA1IC0gUENJIHNsb3QgMiAqLworCQkJMHg5NTAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEgMCAwCisJCQkweDk1MDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MSAwIDAKKwkJCTB4OTUwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHg5NTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTIgZnVuYyA2IC0gUENJIHNsb3QgMiAqLworCQkJMHg5NjAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEgMCAwCisJCQkweDk2MDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MSAwIDAKKwkJCTB4OTYwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHg5NjAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEgMCAwCisKKwkJCS8qIElEU0VMIDB4MTIgZnVuYyA3IC0gUENJIHNsb3QgMiAqLworCQkJMHg5NzAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEgMCAwCisJCQkweDk3MDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MSAwIDAKKwkJCTB4OTcwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxIDAgMAorCQkJMHg5NzAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEgMCAwCisKKwkJCS8vIElEU0VMIDB4MWMgIFVTQgorCQkJMHhlMDAwIDB4MCAweDAgMHgxICZpODI1OSAweGMgMHgyCisJCQkweGUxMDAgMHgwIDB4MCAweDIgJmk4MjU5IDB4OSAweDIKKwkJCTB4ZTIwMCAweDAgMHgwIDB4MyAmaTgyNTkgMHhhIDB4MgorCQkJMHhlMzAwIDB4MCAweDAgMHg0ICZpODI1OSAweGIgMHgyCisKKwkJCS8vIElEU0VMIDB4MWQgIEF1ZGlvCisJCQkweGU4MDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4NiAweDIKKworCQkJLy8gSURTRUwgMHgxZSBMZWdhY3kKKwkJCTB4ZjAwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg3IDB4MgorCQkJMHhmMTAwIDB4MCAweDAgMHgxICZpODI1OSAweDcgMHgyCisKKwkJCS8vIElEU0VMIDB4MWYgSURFL1NBVEEKKwkJCTB4ZjgwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHhlIDB4MgorCQkJMHhmOTAwIDB4MCAweDAgMHgxICZpODI1OSAweDUgMHgyCisJCQk+OworCisKKwkJdWxpMTU3NUAwIHsKKwkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKKwkJCSNzaXplLWNlbGxzID0gPDI+OworCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCisJCQkJICAweDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAKKwkJCQkgIDB4MCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDA+OworCQkJaXNhQDFlIHsKKwkJCQlkZXZpY2VfdHlwZSA9ICJpc2EiOworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47CisJCQkJcmVnID0gPDB4ZjAwMCAweDAgMHgwIDB4MCAweDA+OworCQkJCXJhbmdlcyA9IDwweDEgMHgwIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJCSAgMHgxMDAwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpODI1OT47CisKKwkJCQlpODI1OTogaW50ZXJydXB0LWNvbnRyb2xsZXJAMjAgeworCQkJCQlyZWcgPSA8MHgxIDB4MjAgMHgyCisJCQkJCSAgICAgICAweDEgMHhhMCAweDIKKwkJCQkJICAgICAgIDB4MSAweDRkMCAweDI+OworCQkJCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwkJCQkJY29tcGF0aWJsZSA9ICJjaHJwLGlpYyI7CisJCQkJCWludGVycnVwdHMgPSA8OSAyIDAgMD47CisJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJCX07CisKKwkJCQlpODA0MkA2MCB7CisJCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJcmVnID0gPDB4MSAweDYwIDB4MSAweDEgMHg2NCAweDE+OworCQkJCQlpbnRlcnJ1cHRzID0gPDEgMyAxMiAzPjsKKwkJCQkJaW50ZXJydXB0LXBhcmVudCA9CisJCQkJCQk8Jmk4MjU5PjsKKworCQkJCQlrZXlib2FyZEAwIHsKKwkJCQkJCXJlZyA9IDwweDA+OworCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsMzAzIjsKKwkJCQkJfTsKKworCQkJCQltb3VzZUAxIHsKKwkJCQkJCXJlZyA9IDwweDE+OworCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsZjAzIjsKKwkJCQkJfTsKKwkJCQl9OworCisJCQkJcnRjQDcwIHsKKwkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsYjAwIjsKKwkJCQkJcmVnID0gPDB4MSAweDcwIDB4Mj47CisJCQkJfTsKKworCQkJCWdwaW9ANDAwIHsKKwkJCQkJcmVnID0gPDB4MSAweDQwMCAweDgwPjsKKwkJCQl9OworCQkJfTsKKwkJfTsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHNfMzZiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHNfMzZiLmR0cwppbmRleCBmNjM2NWRiLi42YzNkMGIzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzXzM2Yi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NzJkc18zNmIuZHRzCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIE1QQzg1NzIgRFMgRGV2aWNlIFRyZWUgU291cmNlCisgKiBNUEM4NTcyRFMgRGV2aWNlIFRyZWUgU291cmNlICgzNi1iaXQgYWRkcmVzcyBtYXApCiAgKgogICogQ29weXJpZ2h0IDIwMDctMjAwOSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCiAgKgpAQCAtOSw2NyArOSwxOCBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAiZnNsL21wYzg1NzJzaS1wcmUuZHRzaSIKKwogLyB7CiAJbW9kZWwgPSAiZnNsLE1QQzg1NzJEUyI7CiAJY29tcGF0aWJsZSA9ICJmc2wsTVBDODU3MkRTIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkjc2l6ZS1jZWxscyA9IDwyPjsKLQotCWFsaWFzZXMgewotCQlldGhlcm5ldDAgPSAmZW5ldDA7Ci0JCWV0aGVybmV0MSA9ICZlbmV0MTsKLQkJZXRoZXJuZXQyID0gJmVuZXQyOwotCQlldGhlcm5ldDMgPSAmZW5ldDM7Ci0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlwY2kwID0gJnBjaTA7Ci0JCXBjaTEgPSAmcGNpMTsKLQkJcGNpMiA9ICZwY2kyOwotCX07Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsODU3MkAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MHgwPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDgwMDA+OwkJLy8gTDEsIDMySwotCQkJaS1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47Ci0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwotCQl9OwotCi0JCVBvd2VyUEMsODU3MkAxIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MHgxPjsKLQkJCWQtY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWktY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWQtY2FjaGUtc2l6ZSA9IDwweDgwMDA+OwkJLy8gTDEsIDMySwotCQkJaS1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCi0JCQl0aW1lYmFzZS1mcmVxdWVuY3kgPSA8MD47Ci0JCQlidXMtZnJlcXVlbmN5ID0gPDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwotCQl9OwotCX07CiAKIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCX07CiAKLQlsb2NhbGJ1c0BmZmZlMDUwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwlib2FyZF9sYmM6IGxiYzogbG9jYWxidXNAZmZmZTA1MDAwIHsKIAkJcmVnID0gPDB4ZiAweGZmZTA1MDAwIDAgMHgxMDAwPjsKLQkJaW50ZXJydXB0cyA9IDwxOSAyPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CiAKIAkJcmFuZ2VzID0gPDB4MCAweDAgMHhmIDB4ZTgwMDAwMDAgMHgwODAwMDAwMAogCQkJICAweDEgMHgwIDB4ZiAweGUwMDAwMDAwIDB4MDgwMDAwMDAKQEAgLTc4LDU4OCArMjksMTcgQEAKIAkJCSAgMHg0IDB4MCAweGYgMHhmZmE0MDAwMCAweDAwMDQwMDAwCiAJCQkgIDB4NSAweDAgMHhmIDB4ZmZhODAwMDAgMHgwMDA0MDAwMAogCQkJICAweDYgMHgwIDB4ZiAweGZmYWMwMDAwIDB4MDAwNDAwMDA+OwotCi0JCW5vckAwLDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKLQkJCXJlZyA9IDwweDAgMHgwIDB4ODAwMDAwMD47Ci0JCQliYW5rLXdpZHRoID0gPDI+OwotCQkJZGV2aWNlLXdpZHRoID0gPDE+OwotCi0JCQlyYW1kaXNrQDAgewotCQkJCXJlZyA9IDwweDAgMHgwMzAwMDAwMD47Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQotCQkJZGlhZ25vc3RpY0AzMDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgwMzAwMDAwMCAweDAwZTAwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlkaW5rQDNlMDAwMDAgewotCQkJCXJlZyA9IDwweDAzZTAwMDAwIDB4MDAyMDAwMDA+OwotCQkJCXJlYWQtb25seTsKLQkJCX07Ci0KLQkJCWtlcm5lbEA0MDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgwNDAwMDAwMCAweDAwNDAwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlqZmZzMkA0NDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgwNDQwMDAwMCAweDAzYjAwMDAwPjsKLQkJCX07Ci0KLQkJCWR0YkA3ZjAwMDAwIHsKLQkJCQlyZWcgPSA8MHgwN2YwMDAwMCAweDAwMDgwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQl1LWJvb3RAN2Y4MDAwMCB7Ci0JCQkJcmVnID0gPDB4MDdmODAwMDAgMHgwMDA4MDAwMD47Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQkJfTsKLQotCQluYW5kQDIsMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1mY20tbmFuZCIsCi0JCQkJICAgICAiZnNsLGVsYmMtZmNtLW5hbmQiOwotCQkJcmVnID0gPDB4MiAweDAgMHg0MDAwMD47Ci0KLQkJCXUtYm9vdEAwIHsKLQkJCQlyZWcgPSA8MHgwIDB4MDIwMDAwMDA+OwotCQkJCXJlYWQtb25seTsKLQkJCX07Ci0KLQkJCWpmZnMyQDIwMDAwMDAgewotCQkJCXJlZyA9IDwweDAyMDAwMDAwIDB4MTAwMDAwMDA+OwotCQkJfTsKLQotCQkJcmFtZGlza0AxMjAwMDAwMCB7Ci0JCQkJcmVnID0gPDB4MTIwMDAwMDAgMHgwODAwMDAwMD47Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQotCQkJa2VybmVsQDFhMDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgxYTAwMDAwMCAweDA0MDAwMDAwPjsKLQkJCX07Ci0KLQkJCWR0YkAxZTAwMDAwMCB7Ci0JCQkJcmVnID0gPDB4MWUwMDAwMDAgMHgwMTAwMDAwMD47Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQotCQkJZW1wdHlAMWYwMDAwMDAgewotCQkJCXJlZyA9IDwweDFmMDAwMDAwIDB4MjEwMDAwMDA+OwotCQkJfTsKLQkJfTsKLQotCQluYW5kQDQsMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWZjbS1uYW5kIiwKLQkJCQkgICAgICJmc2wsZWxiYy1mY20tbmFuZCI7Ci0JCQlyZWcgPSA8MHg0IDB4MCAweDQwMDAwPjsKLQkJfTsKLQotCQluYW5kQDUsMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWZjbS1uYW5kIiwKLQkJCQkgICAgICJmc2wsZWxiYy1mY20tbmFuZCI7Ci0JCQlyZWcgPSA8MHg1IDB4MCAweDQwMDAwPjsKLQkJfTsKLQotCQluYW5kQDYsMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWZjbS1uYW5kIiwKLQkJCQkgICAgICJmc2wsZWxiYy1mY20tbmFuZCI7Ci0JCQlyZWcgPSA8MHg2IDB4MCAweDQwMDAwPjsKLQkJfTsKIAl9OwogCi0Jc29jODU3MkBmZmZlMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWRldmljZV90eXBlID0gInNvYyI7Ci0JCWNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyI7CisJYm9hcmRfc29jOiBzb2M6IHNvYzg1NzJAZmZmZTAwMDAwIHsKIAkJcmFuZ2VzID0gPDB4MCAweGYgMHhmZmUwMDAwMCAweDEwMDAwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgotCi0JCWVjbS1sYXdAMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxlY20tbGF3IjsKLQkJCXJlZyA9IDwweDAgMHgxMDAwPjsKLQkJCWZzbCxudW0tbGF3cyA9IDwxMj47Ci0JCX07Ci0KLQkJZWNtQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1lY20iLCAiZnNsLGVjbSI7Ci0JCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDE3IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLW1lbW9yeS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwxOCAyPjsKLQkJfTsKLQotCQltZW1vcnktY29udHJvbGxlckA2MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4NjAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwotCQl9OwotCi0JCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbDItY2FjaGUtY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OwotCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWNhY2hlLXNpemUgPSA8MHgxMDAwMDA+OyAvLyBMMiwgMU0KLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJfTsKLQotCQlpMmNAMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWkyY0AzMTAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDMxMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJZG1hQGMzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHhjMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4YzEwMCAweDIwMD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZG1hLWNoYW5uZWxAMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDc2IDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDc3IDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NzggMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw3OSAyPjsKLQkJCX07Ci0JCX07Ci0KLQkJZG1hQDIxMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MjEzMDAgMHg0PjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyMTEwMCAweDIwMD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZG1hLWNoYW5uZWxAMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIwIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIxIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjIgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMyAyPjsKLQkJCX07Ci0JCX07Ci0KLQkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwotCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwPjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyNDAwMCAweDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDI5IDIgMzAgMiAzNCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJdGJpLWhhbmRsZSA9IDwmdGJpMD47Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKLQkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCi0JCQltZGlvQDUyMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci1tZGlvIjsKLQkJCQlyZWcgPSA8MHg1MjAgMHgyMD47Ci0KLQkJCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQlpbnRlcnJ1cHRzID0gPDEwIDE+OwotCQkJCQlyZWcgPSA8MHgwPjsKLQkJCQl9OwotCQkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKLQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJCWludGVycnVwdHMgPSA8MTAgMT47Ci0JCQkJCXJlZyA9IDwweDE+OwotCQkJCX07Ci0JCQkJcGh5MjogZXRoZXJuZXQtcGh5QDIgewotCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQkJaW50ZXJydXB0cyA9IDwxMCAxPjsKLQkJCQkJcmVnID0gPDB4Mj47Ci0JCQkJfTsKLQkJCQlwaHkzOiBldGhlcm5ldC1waHlAMyB7Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQlpbnRlcnJ1cHRzID0gPDEwIDE+OwotCQkJCQlyZWcgPSA8MHgzPjsKLQkJCQl9OwotCi0JCQkJdGJpMDogdGJpLXBoeUAxMSB7Ci0JCQkJCXJlZyA9IDwweDExPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJZW5ldDE6IGV0aGVybmV0QDI1MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwotCQkJcmVnID0gPDB4MjUwMDAgMHgxMDAwPjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyNTAwMCAweDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDM1IDIgMzYgMiA0MCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJdGJpLWhhbmRsZSA9IDwmdGJpMT47Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKLQkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCi0JCQltZGlvQDUyMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci10YmkiOwotCQkJCXJlZyA9IDwweDUyMCAweDIwPjsKLQotCQkJCXRiaTE6IHRiaS1waHlAMTEgewotCQkJCQlyZWcgPSA8MHgxMT47Ci0JCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCWVuZXQyOiBldGhlcm5ldEAyNjAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI2MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjYwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwzMSAyIDMyIDIgMzMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCXRiaS1oYW5kbGUgPSA8JnRiaTI+OwotCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQotCQkJbWRpb0A1MjAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItdGJpIjsKLQkJCQlyZWcgPSA8MHg1MjAgMHgyMD47Ci0KLQkJCQl0YmkyOiB0YmktcGh5QDExIHsKLQkJCQkJcmVnID0gPDB4MTE+OwotCQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQllbmV0MzogZXRoZXJuZXRAMjcwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKLQkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7Ci0JCQlyZWcgPSA8MHgyNzAwMCAweDEwMDA+OwotCQkJcmFuZ2VzID0gPDB4MCAweDI3MDAwIDB4MTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MzcgMiAzOCAyIDM5IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQl0YmktaGFuZGxlID0gPCZ0YmkzPjsKLQkJCXBoeS1oYW5kbGUgPSA8JnBoeTM+OwotCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7Ci0KLQkJCW1kaW9ANTIwIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7Ci0JCQkJcmVnID0gPDB4NTIwIDB4MjA+OwotCi0JCQkJdGJpMzogdGJpLXBoeUAxMSB7Ci0JCQkJCXJlZyA9IDwweDExPjsKLQkJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4NDUwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4NDYwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CS8vZ2xvYmFsIHV0aWxpdGllcyBibG9jawotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1ndXRzIjsKLQkJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwotCQl9OwotCi0JCW1zaUA0MTYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLW1zaSIsICJmc2wsbXBpYy1tc2kiOwotCQkJcmVnID0gPDB4NDE2MDAgMHg4MD47Ci0JCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8Ci0JCQkJMHhlMCAwCi0JCQkJMHhlMSAwCi0JCQkJMHhlMiAwCi0JCQkJMHhlMyAwCi0JCQkJMHhlNCAwCi0JCQkJMHhlNSAwCi0JCQkJMHhlNiAwCi0JCQkJMHhlNyAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCWNyeXB0b0AzMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzZWMzLjAiLCAiZnNsLHNlYzIuNCIsICJmc2wsc2VjMi4yIiwKLQkJCQkgICAgICJmc2wsc2VjMi4xIiwgImZzbCxzZWMyLjAiOwotCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQ1IDIgNTggMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWZzbCxudW0tY2hhbm5lbHMgPSA8ND47Ci0JCQlmc2wsY2hhbm5lbC1maWZvLWxlbiA9IDwyND47Ci0JCQlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4OWZlPjsKLQkJCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgzYWIwZWJmPjsKLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7Ci0JCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7Ci0JCX07CiAJfTsKIAotCXBjaTA6IHBjaWVAZmZmZTA4MDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCWJvYXJkX3BjaTA6IHBjaTA6IHBjaWVAZmZmZTA4MDAwIHsKIAkJcmVnID0gPDB4ZiAweGZmZTA4MDAwIDAgMHgxMDAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMjU1PjsKIAkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhlMDAwMDAwMCAweGMgMHgwMDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmIDB4ZmZjMDAwMDAgMHgwIDB4MDAwMTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNCAyPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZmYwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDExIGZ1bmMgMCAtIFBDSSBzbG90IDEgKi8KLQkJCTB4ODgwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxCi0JCQkweDg4MDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MQotCQkJMHg4ODAwIDB4MCAweDAgMHgzICZtcGljIDB4NCAweDEKLQkJCTB4ODgwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTEgZnVuYyAxIC0gUENJIHNsb3QgMSAqLwotCQkJMHg4OTAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEKLQkJCTB4ODkwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkweDg5MDAgMHgwIDB4MCAweDMgJm1waWMgMHg0IDB4MQotCQkJMHg4OTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEKLQotCQkJLyogSURTRUwgMHgxMSBmdW5jIDIgLSBQQ0kgc2xvdCAxICovCi0JCQkweDhhMDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MQotCQkJMHg4YTAwIDB4MCAweDAgMHgyICZtcGljIDB4MyAweDEKLQkJCTB4OGEwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxCi0JCQkweDhhMDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MQotCi0JCQkvKiBJRFNFTCAweDExIGZ1bmMgMyAtIFBDSSBzbG90IDEgKi8KLQkJCTB4OGIwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxCi0JCQkweDhiMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MQotCQkJMHg4YjAwIDB4MCAweDAgMHgzICZtcGljIDB4NCAweDEKLQkJCTB4OGIwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTEgZnVuYyA0IC0gUENJIHNsb3QgMSAqLwotCQkJMHg4YzAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEKLQkJCTB4OGMwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkweDhjMDAgMHgwIDB4MCAweDMgJm1waWMgMHg0IDB4MQotCQkJMHg4YzAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEKLQotCQkJLyogSURTRUwgMHgxMSBmdW5jIDUgLSBQQ0kgc2xvdCAxICovCi0JCQkweDhkMDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MQotCQkJMHg4ZDAwIDB4MCAweDAgMHgyICZtcGljIDB4MyAweDEKLQkJCTB4OGQwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxCi0JCQkweDhkMDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MQotCi0JCQkvKiBJRFNFTCAweDExIGZ1bmMgNiAtIFBDSSBzbG90IDEgKi8KLQkJCTB4OGUwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxCi0JCQkweDhlMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MQotCQkJMHg4ZTAwIDB4MCAweDAgMHgzICZtcGljIDB4NCAweDEKLQkJCTB4OGUwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTEgZnVuYyA3IC0gUENJIHNsb3QgMSAqLwotCQkJMHg4ZjAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEKLQkJCTB4OGYwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkweDhmMDAgMHgwIDB4MCAweDMgJm1waWMgMHg0IDB4MQotCQkJMHg4ZjAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEKLQotCQkJLyogSURTRUwgMHgxMiBmdW5jIDAgLSBQQ0kgc2xvdCAyICovCi0JCQkweDkwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MQotCQkJMHg5MDAwIDB4MCAweDAgMHgyICZtcGljIDB4NCAweDEKLQkJCTB4OTAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxCi0JCQkweDkwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgyIDB4MQotCi0JCQkvKiBJRFNFTCAweDEyIGZ1bmMgMSAtIFBDSSBzbG90IDIgKi8KLQkJCTB4OTEwMCAweDAgMHgwIDB4MSAmbXBpYyAweDMgMHgxCi0JCQkweDkxMDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MQotCQkJMHg5MTAwIDB4MCAweDAgMHgzICZtcGljIDB4MSAweDEKLQkJCTB4OTEwMCAweDAgMHgwIDB4NCAmbXBpYyAweDIgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTIgZnVuYyAyIC0gUENJIHNsb3QgMiAqLwotCQkJMHg5MjAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEKLQkJCTB4OTIwMCAweDAgMHgwIDB4MiAmbXBpYyAweDQgMHgxCi0JCQkweDkyMDAgMHgwIDB4MCAweDMgJm1waWMgMHgxIDB4MQotCQkJMHg5MjAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEKLQotCQkJLyogSURTRUwgMHgxMiBmdW5jIDMgLSBQQ0kgc2xvdCAyICovCi0JCQkweDkzMDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MQotCQkJMHg5MzAwIDB4MCAweDAgMHgyICZtcGljIDB4NCAweDEKLQkJCTB4OTMwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxCi0JCQkweDkzMDAgMHgwIDB4MCAweDQgJm1waWMgMHgyIDB4MQotCi0JCQkvKiBJRFNFTCAweDEyIGZ1bmMgNCAtIFBDSSBzbG90IDIgKi8KLQkJCTB4OTQwMCAweDAgMHgwIDB4MSAmbXBpYyAweDMgMHgxCi0JCQkweDk0MDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MQotCQkJMHg5NDAwIDB4MCAweDAgMHgzICZtcGljIDB4MSAweDEKLQkJCTB4OTQwMCAweDAgMHgwIDB4NCAmbXBpYyAweDIgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTIgZnVuYyA1IC0gUENJIHNsb3QgMiAqLwotCQkJMHg5NTAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEKLQkJCTB4OTUwMCAweDAgMHgwIDB4MiAmbXBpYyAweDQgMHgxCi0JCQkweDk1MDAgMHgwIDB4MCAweDMgJm1waWMgMHgxIDB4MQotCQkJMHg5NTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEKLQotCQkJLyogSURTRUwgMHgxMiBmdW5jIDYgLSBQQ0kgc2xvdCAyICovCi0JCQkweDk2MDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MQotCQkJMHg5NjAwIDB4MCAweDAgMHgyICZtcGljIDB4NCAweDEKLQkJCTB4OTYwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxCi0JCQkweDk2MDAgMHgwIDB4MCAweDQgJm1waWMgMHgyIDB4MQotCi0JCQkvKiBJRFNFTCAweDEyIGZ1bmMgNyAtIFBDSSBzbG90IDIgKi8KLQkJCTB4OTcwMCAweDAgMHgwIDB4MSAmbXBpYyAweDMgMHgxCi0JCQkweDk3MDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MQotCQkJMHg5NzAwIDB4MCAweDAgMHgzICZtcGljIDB4MSAweDEKLQkJCTB4OTcwMCAweDAgMHgwIDB4NCAmbXBpYyAweDIgMHgxCi0KLQkJCS8vIElEU0VMIDB4MWMgIFVTQgotCQkJMHhlMDAwIDB4MCAweDAgMHgxICZpODI1OSAweGMgMHgyCi0JCQkweGUxMDAgMHgwIDB4MCAweDIgJmk4MjU5IDB4OSAweDIKLQkJCTB4ZTIwMCAweDAgMHgwIDB4MyAmaTgyNTkgMHhhIDB4MgotCQkJMHhlMzAwIDB4MCAweDAgMHg0ICZpODI1OSAweGIgMHgyCi0KLQkJCS8vIElEU0VMIDB4MWQgIEF1ZGlvCi0JCQkweGU4MDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4NiAweDIKLQotCQkJLy8gSURTRUwgMHgxZSBMZWdhY3kKLQkJCTB4ZjAwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg3IDB4MgotCQkJMHhmMTAwIDB4MCAweDAgMHgxICZpODI1OSAweDcgMHgyCi0KLQkJCS8vIElEU0VMIDB4MWYgSURFL1NBVEEKLQkJCTB4ZjgwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHhlIDB4MgotCQkJMHhmOTAwIDB4MCAweDAgMHgxICZpODI1OSAweDUgMHgyCi0KLQkJCT47Ci0KIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhlMDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtNjY3LDk5ICs0NywxNCBAQAogCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKIAkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCiAJCQkJICAweDAgMHgxMDAwMD47Ci0JCQl1bGkxNTc1QDAgewotCQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwCi0JCQkJCSAgMHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwCi0JCQkJCSAgMHgwIDB4MjAwMDAwMDAKLQotCQkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKLQkJCQkJICAweDAgMHgxMDAwMD47Ci0JCQkJaXNhQDFlIHsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiaXNhIjsKLQkJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkJCQlyZWcgPSA8MHhmMDAwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkJCXJhbmdlcyA9IDwweDEgMHgwIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJCQkgIDB4MTAwMD47Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jmk4MjU5PjsKLQotCQkJCQlpODI1OTogaW50ZXJydXB0LWNvbnRyb2xsZXJAMjAgewotCQkJCQkJcmVnID0gPDB4MSAweDIwIDB4MgotCQkJCQkJICAgICAgIDB4MSAweGEwIDB4MgotCQkJCQkJICAgICAgIDB4MSAweDRkMCAweDI+OwotCQkJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkJCQlkZXZpY2VfdHlwZSA9ICJpbnRlcnJ1cHQtY29udHJvbGxlciI7Ci0JCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJCQljb21wYXRpYmxlID0gImNocnAsaWljIjsKLQkJCQkJCWludGVycnVwdHMgPSA8OSAyPjsKLQkJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQl9OwotCi0JCQkJCWk4MDQyQDYwIHsKLQkJCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJCQlyZWcgPSA8MHgxIDB4NjAgMHgxIDB4MSAweDY0IDB4MT47Ci0JCQkJCQlpbnRlcnJ1cHRzID0gPDEgMyAxMiAzPjsKLQkJCQkJCWludGVycnVwdC1wYXJlbnQgPQotCQkJCQkJCTwmaTgyNTk+OwotCi0JCQkJCQlrZXlib2FyZEAwIHsKLQkJCQkJCQlyZWcgPSA8MHgwPjsKLQkJCQkJCQljb21wYXRpYmxlID0gInBucFBOUCwzMDMiOwotCQkJCQkJfTsKLQotCQkJCQkJbW91c2VAMSB7Ci0JCQkJCQkJcmVnID0gPDB4MT47Ci0JCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsZjAzIjsKLQkJCQkJCX07Ci0JCQkJCX07Ci0KLQkJCQkJcnRjQDcwIHsKLQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGIwMCI7Ci0JCQkJCQlyZWcgPSA8MHgxIDB4NzAgMHgyPjsKLQkJCQkJfTsKLQotCQkJCQlncGlvQDQwMCB7Ci0JCQkJCQlyZWcgPSA8MHgxIDB4NDAwIDB4ODA+OwotCQkJCQl9OwotCQkJCX07Ci0JCQl9OwogCQl9OwotCiAJfTsKIAogCXBjaTE6IHBjaWVAZmZmZTA5MDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwogCQlyZWcgPSA8MHhmIDB4ZmZlMDkwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwIDB4YyAweDIwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmZmMxMDAwMCAweDAgMHgwMDAxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDI1IDI+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDQgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4NSAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHg2IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDcgMHgxCi0JCQk+OwogCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwCiAJCQkJICAweDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MCAweDIwMDAwMDAwCkBAIC03NzEsMzEgKzY2LDEwIEBACiAJfTsKIAogCXBjaTI6IHBjaWVAZmZmZTBhMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwogCQlyZWcgPSA8MHhmIDB4ZmZlMGEwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwIDB4YyAweDQwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmZmMyMDAwMCAweDAgMHgwMDAxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDI2IDI+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgyIDB4MQotCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxCi0JCQk+OwogCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwCiAJCQkJICAweDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MCAweDIwMDAwMDAwCkBAIC04MDYsMyArODAsMTEgQEAKIAkJfTsKIAl9OwogfTsKKworLyoKKyAqIG1wYzg1NzJkcy5kdHNpIG11c3QgYmUgbGFzdCB0byBlbnN1cmUgYm9hcmRfcGNpMCBvdmVycmlkZXMgcGNpMCBzZXR0aW5ncworICogZm9yIGludGVycnVwdC1tYXAgJiBpbnRlcnJ1cHQtbWFwLW1hc2sKKyAqLworCisvaW5jbHVkZS8gImZzbC9tcGM4NTcyc2ktcG9zdC5kdHNpIgorL2luY2x1ZGUvICJtcGM4NTcyZHMuZHRzaSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHNfY2FtcF9jb3JlMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzX2NhbXBfY29yZTAuZHRzCmluZGV4IDMzNzVjMmEuLmQzNGQxMjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHNfY2FtcF9jb3JlMC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NzJkc19jYW1wX2NvcmUwLmR0cwpAQCAtMTQsNDk0ICsxNCw2OSBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAibXBjODU3MmRzLmR0cyIKKwogLyB7CiAJbW9kZWwgPSAiZnNsLE1QQzg1NzJEUyI7CiAJY29tcGF0aWJsZSA9ICJmc2wsTVBDODU3MkRTIiwgImZzbCxNUEM4NTcyRFMtQ0FNUCI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JI3NpemUtY2VsbHMgPSA8MT47Ci0KLQlhbGlhc2VzIHsKLQkJZXRoZXJuZXQwID0gJmVuZXQwOwotCQlldGhlcm5ldDEgPSAmZW5ldDE7Ci0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJcGNpMCA9ICZwY2kwOwotCQlwY2kxID0gJnBjaTE7Ci0JfTsKIAogCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KIAkJUG93ZXJQQyw4NTcyQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwweDA+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwotCQkJZC1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg4MDAwPjsJCS8vIEwxLCAzMksKLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CiAJCX07Ci0KKwkJUG93ZXJQQyw4NTcyQDEgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKIAl9OwogCi0JbWVtb3J5IHsKLQkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKLQkJcmVnID0gPDB4MCAweDA+OwkvLyBGaWxsZWQgYnkgVS1Cb290CisJbG9jYWxidXNAZmZlMDUwMDAgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKIAlzb2M4NTcyQGZmZTAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOwotCQlyYW5nZXMgPSA8MHgwIDB4ZmZlMDAwMDAgMHgxMDAwMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KLQotCQllY20tbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MTI+OworCQlzZXJpYWxANDYwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwotCi0JCWVjbUAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZWNtIiwgImZzbCxlY20iOwotCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlkbWFAYzMwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwotCi0JCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1tZW1vcnktY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTggMj47CisJCWdwaW8tY29udHJvbGxlckBmMDAwIHsKIAkJfTsKLQotCQltZW1vcnktY29udHJvbGxlckA2MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4NjAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE4IDI+OwotCQl9OwotCi0JCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItbDItY2FjaGUtY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OwotCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKKwkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CiAJCQljYWNoZS1zaXplID0gPDB4ODAwMDA+OwkvLyBMMiwgNTEySwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwogCQl9OwotCi0JCWkyY0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZGZzcnI7CisJCWV0aGVybmV0QDI2MDAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07Ci0KLQkJaTJjQDMxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzEwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKKwkJbWRpb0AyNjUyMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwotCi0JCWRtYUAyMTMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKLQkJCXJlZyA9IDwweDIxMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjExMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMCAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMSAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIyIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjMgMj47Ci0JCQl9OworCQlldGhlcm5ldEAyNzAwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwotCi0JCWVuZXQwOiBldGhlcm5ldEAyNDAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI0MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjQwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwyOSAyIDMwIDIgMzQgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwotCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7Ci0KLQkJCW1kaW9ANTIwIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLW1kaW8iOwotCQkJCXJlZyA9IDwweDUyMCAweDIwPjsKLQotCQkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKLQkJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJCWludGVycnVwdHMgPSA8MTAgMT47Ci0JCQkJCXJlZyA9IDwweDA+OwotCQkJCX07Ci0JCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewotCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQkJaW50ZXJydXB0cyA9IDwxMCAxPjsKLQkJCQkJcmVnID0gPDB4MT47Ci0JCQkJfTsKLQkJCX07CisJCW1kaW9AMjc1MjAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKLQotCQllbmV0MTogZXRoZXJuZXRAMjUwMDAgewotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI1MDAwIDB4MTAwMD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdHMgPSA8MzUgMiAzNiAyIDQwIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKLQkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCQl9OwotCi0JCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQl9OwotCi0JCW1zaUA0MTYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLW1zaSIsICJmc2wsbXBpYy1tc2kiOwotCQkJcmVnID0gPDB4NDE2MDAgMHg4MD47Ci0JCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4ODA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAKLQkJCQkweGUxIDAKLQkJCQkweGUyIDAKLQkJCQkweGUzIDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CS8vZ2xvYmFsIHV0aWxpdGllcyBibG9jawotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1ndXRzIjsKLQkJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwotCQl9OwotCi0JCWNyeXB0b0AzMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzZWMzLjAiLCAiZnNsLHNlYzIuNCIsICJmc2wsc2VjMi4yIiwKLQkJCQkgICAgICJmc2wsc2VjMi4xIiwgImZzbCxzZWMyLjAiOwotCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQ1IDIgNTggMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWZzbCxudW0tY2hhbm5lbHMgPSA8ND47Ci0JCQlmc2wsY2hhbm5lbC1maWZvLWxlbiA9IDwyND47Ci0JCQlmc2wsZXhlYy11bml0cy1tYXNrID0gPDB4OWZlPjsKLQkJCWZzbCxkZXNjcmlwdG9yLXR5cGVzLW1hc2sgPSA8MHgzYWIwZWJmPjsKLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7Ci0JCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7CisJCXBpY0A0MDAwMCB7CiAJCQlwcm90ZWN0ZWQtc291cmNlcyA9IDwKIAkJCTMxIDMyIDMzIDM3IDM4IDM5ICAgICAgIC8qIGVuZXQyIGVuZXQzICovCiAJCQk3NiA3NyA3OCA3OSAyNiA0MgkvKiBkbWEyIHBjaTIgc2VyaWFsKi8KIAkJCTB4ZTQgMHhlNSAweGU2IDB4ZTcJLyogbXNpICovCiAJCQk+OwogCQl9OwotCX07CiAKLQlwY2kwOiBwY2llQGZmZTA4MDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhmZmUwODAwMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwotCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDB4ODAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKLQkJCSAgMHgxMDAwMDAwIDB4MCAweDAgMHhmZmMwMDAwMCAweDAgMHgxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDI0IDI+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmZjAwIDB4MCAweDAgMHg3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MTEgZnVuYyAwIC0gUENJIHNsb3QgMSAqLwotCQkJMHg4ODAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEKLQkJCTB4ODgwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkweDg4MDAgMHgwIDB4MCAweDMgJm1waWMgMHg0IDB4MQotCQkJMHg4ODAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEKLQotCQkJLyogSURTRUwgMHgxMSBmdW5jIDEgLSBQQ0kgc2xvdCAxICovCi0JCQkweDg5MDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MQotCQkJMHg4OTAwIDB4MCAweDAgMHgyICZtcGljIDB4MyAweDEKLQkJCTB4ODkwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxCi0JCQkweDg5MDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MQotCi0JCQkvKiBJRFNFTCAweDExIGZ1bmMgMiAtIFBDSSBzbG90IDEgKi8KLQkJCTB4OGEwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxCi0JCQkweDhhMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MQotCQkJMHg4YTAwIDB4MCAweDAgMHgzICZtcGljIDB4NCAweDEKLQkJCTB4OGEwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTEgZnVuYyAzIC0gUENJIHNsb3QgMSAqLwotCQkJMHg4YjAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEKLQkJCTB4OGIwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkweDhiMDAgMHgwIDB4MCAweDMgJm1waWMgMHg0IDB4MQotCQkJMHg4YjAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEKLQotCQkJLyogSURTRUwgMHgxMSBmdW5jIDQgLSBQQ0kgc2xvdCAxICovCi0JCQkweDhjMDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MQotCQkJMHg4YzAwIDB4MCAweDAgMHgyICZtcGljIDB4MyAweDEKLQkJCTB4OGMwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxCi0JCQkweDhjMDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MQotCi0JCQkvKiBJRFNFTCAweDExIGZ1bmMgNSAtIFBDSSBzbG90IDEgKi8KLQkJCTB4OGQwMCAweDAgMHgwIDB4MSAmbXBpYyAweDIgMHgxCi0JCQkweDhkMDAgMHgwIDB4MCAweDIgJm1waWMgMHgzIDB4MQotCQkJMHg4ZDAwIDB4MCAweDAgMHgzICZtcGljIDB4NCAweDEKLQkJCTB4OGQwMCAweDAgMHgwIDB4NCAmbXBpYyAweDEgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTEgZnVuYyA2IC0gUENJIHNsb3QgMSAqLwotCQkJMHg4ZTAwIDB4MCAweDAgMHgxICZtcGljIDB4MiAweDEKLQkJCTB4OGUwMCAweDAgMHgwIDB4MiAmbXBpYyAweDMgMHgxCi0JCQkweDhlMDAgMHgwIDB4MCAweDMgJm1waWMgMHg0IDB4MQotCQkJMHg4ZTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MSAweDEKLQotCQkJLyogSURTRUwgMHgxMSBmdW5jIDcgLSBQQ0kgc2xvdCAxICovCi0JCQkweDhmMDAgMHgwIDB4MCAweDEgJm1waWMgMHgyIDB4MQotCQkJMHg4ZjAwIDB4MCAweDAgMHgyICZtcGljIDB4MyAweDEKLQkJCTB4OGYwMCAweDAgMHgwIDB4MyAmbXBpYyAweDQgMHgxCi0JCQkweDhmMDAgMHgwIDB4MCAweDQgJm1waWMgMHgxIDB4MQotCi0JCQkvKiBJRFNFTCAweDEyIGZ1bmMgMCAtIFBDSSBzbG90IDIgKi8KLQkJCTB4OTAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDMgMHgxCi0JCQkweDkwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MQotCQkJMHg5MDAwIDB4MCAweDAgMHgzICZtcGljIDB4MSAweDEKLQkJCTB4OTAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDIgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTIgZnVuYyAxIC0gUENJIHNsb3QgMiAqLwotCQkJMHg5MTAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEKLQkJCTB4OTEwMCAweDAgMHgwIDB4MiAmbXBpYyAweDQgMHgxCi0JCQkweDkxMDAgMHgwIDB4MCAweDMgJm1waWMgMHgxIDB4MQotCQkJMHg5MTAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEKLQotCQkJLyogSURTRUwgMHgxMiBmdW5jIDIgLSBQQ0kgc2xvdCAyICovCi0JCQkweDkyMDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MQotCQkJMHg5MjAwIDB4MCAweDAgMHgyICZtcGljIDB4NCAweDEKLQkJCTB4OTIwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxCi0JCQkweDkyMDAgMHgwIDB4MCAweDQgJm1waWMgMHgyIDB4MQotCi0JCQkvKiBJRFNFTCAweDEyIGZ1bmMgMyAtIFBDSSBzbG90IDIgKi8KLQkJCTB4OTMwMCAweDAgMHgwIDB4MSAmbXBpYyAweDMgMHgxCi0JCQkweDkzMDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MQotCQkJMHg5MzAwIDB4MCAweDAgMHgzICZtcGljIDB4MSAweDEKLQkJCTB4OTMwMCAweDAgMHgwIDB4NCAmbXBpYyAweDIgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTIgZnVuYyA0IC0gUENJIHNsb3QgMiAqLwotCQkJMHg5NDAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEKLQkJCTB4OTQwMCAweDAgMHgwIDB4MiAmbXBpYyAweDQgMHgxCi0JCQkweDk0MDAgMHgwIDB4MCAweDMgJm1waWMgMHgxIDB4MQotCQkJMHg5NDAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEKLQotCQkJLyogSURTRUwgMHgxMiBmdW5jIDUgLSBQQ0kgc2xvdCAyICovCi0JCQkweDk1MDAgMHgwIDB4MCAweDEgJm1waWMgMHgzIDB4MQotCQkJMHg5NTAwIDB4MCAweDAgMHgyICZtcGljIDB4NCAweDEKLQkJCTB4OTUwMCAweDAgMHgwIDB4MyAmbXBpYyAweDEgMHgxCi0JCQkweDk1MDAgMHgwIDB4MCAweDQgJm1waWMgMHgyIDB4MQotCi0JCQkvKiBJRFNFTCAweDEyIGZ1bmMgNiAtIFBDSSBzbG90IDIgKi8KLQkJCTB4OTYwMCAweDAgMHgwIDB4MSAmbXBpYyAweDMgMHgxCi0JCQkweDk2MDAgMHgwIDB4MCAweDIgJm1waWMgMHg0IDB4MQotCQkJMHg5NjAwIDB4MCAweDAgMHgzICZtcGljIDB4MSAweDEKLQkJCTB4OTYwMCAweDAgMHgwIDB4NCAmbXBpYyAweDIgMHgxCi0KLQkJCS8qIElEU0VMIDB4MTIgZnVuYyA3IC0gUENJIHNsb3QgMiAqLwotCQkJMHg5NzAwIDB4MCAweDAgMHgxICZtcGljIDB4MyAweDEKLQkJCTB4OTcwMCAweDAgMHgwIDB4MiAmbXBpYyAweDQgMHgxCi0JCQkweDk3MDAgMHgwIDB4MCAweDMgJm1waWMgMHgxIDB4MQotCQkJMHg5NzAwIDB4MCAweDAgMHg0ICZtcGljIDB4MiAweDEKLQotCQkJLy8gSURTRUwgMHgxYyAgVVNCCi0JCQkweGUwMDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4YyAweDIKLQkJCTB4ZTEwMCAweDAgMHgwIDB4MiAmaTgyNTkgMHg5IDB4MgotCQkJMHhlMjAwIDB4MCAweDAgMHgzICZpODI1OSAweGEgMHgyCi0JCQkweGUzMDAgMHgwIDB4MCAweDQgJmk4MjU5IDB4YiAweDIKLQotCQkJLy8gSURTRUwgMHgxZCAgQXVkaW8KLQkJCTB4ZTgwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg2IDB4MgotCi0JCQkvLyBJRFNFTCAweDFlIExlZ2FjeQotCQkJMHhmMDAwIDB4MCAweDAgMHgxICZpODI1OSAweDcgMHgyCi0JCQkweGYxMDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4NyAweDIKLQotCQkJLy8gSURTRUwgMHgxZiBJREUvU0FUQQotCQkJMHhmODAwIDB4MCAweDAgMHgxICZpODI1OSAweGUgMHgyCi0JCQkweGY5MDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4NSAweDIKLQotCQkJPjsKLQotCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCi0JCQkJICAweDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAKLQkJCQkgIDB4MCAweDIwMDAwMDAwCi0KLQkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJICAweDEwMDAwMDAgMHgwIDB4MAotCQkJCSAgMHgwIDB4MTAwMDA+OwotCQkJdWxpMTU3NUAwIHsKLQkJCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMAotCQkJCQkgIDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMAotCQkJCQkgIDB4MCAweDIwMDAwMDAwCi0KLQkJCQkJICAweDEwMDAwMDAgMHgwIDB4MAotCQkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJCSAgMHgwIDB4MTAwMDA+OwotCQkJCWlzYUAxZSB7Ci0JCQkJCWRldmljZV90eXBlID0gImlzYSI7Ci0JCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJCQkJcmVnID0gPDB4ZjAwMCAweDAgMHgwIDB4MCAweDA+OwotCQkJCQlyYW5nZXMgPSA8MHgxIDB4MCAweDEwMDAwMDAgMHgwIDB4MAotCQkJCQkJICAweDEwMDA+OwotCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZpODI1OT47Ci0KLQkJCQkJaTgyNTk6IGludGVycnVwdC1jb250cm9sbGVyQDIwIHsKLQkJCQkJCXJlZyA9IDwweDEgMHgyMCAweDIKLQkJCQkJCSAgICAgICAweDEgMHhhMCAweDIKLQkJCQkJCSAgICAgICAweDEgMHg0ZDAgMHgyPjsKLQkJCQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJCQkJZGV2aWNlX3R5cGUgPSAiaW50ZXJydXB0LWNvbnRyb2xsZXIiOwotCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQkJCQkJY29tcGF0aWJsZSA9ICJjaHJwLGlpYyI7Ci0JCQkJCQlpbnRlcnJ1cHRzID0gPDkgMj47Ci0JCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQkJfTsKLQotCQkJCQlpODA0MkA2MCB7Ci0JCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCQkJcmVnID0gPDB4MSAweDYwIDB4MSAweDEgMHg2NCAweDE+OwotCQkJCQkJaW50ZXJydXB0cyA9IDwxIDMgMTIgMz47Ci0JCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0KLQkJCQkJCQk8Jmk4MjU5PjsKLQotCQkJCQkJa2V5Ym9hcmRAMCB7Ci0JCQkJCQkJcmVnID0gPDB4MD47Ci0JCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsMzAzIjsKLQkJCQkJCX07Ci0KLQkJCQkJCW1vdXNlQDEgewotCQkJCQkJCXJlZyA9IDwweDE+OwotCQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGYwMyI7Ci0JCQkJCQl9OwotCQkJCQl9OwotCi0JCQkJCXJ0Y0A3MCB7Ci0JCQkJCQljb21wYXRpYmxlID0gInBucFBOUCxiMDAiOwotCQkJCQkJcmVnID0gPDB4MSAweDcwIDB4Mj47Ci0JCQkJCX07Ci0KLQkJCQkJZ3Bpb0A0MDAgewotCQkJCQkJcmVnID0gPDB4MSAweDQwMCAweDgwPjsKLQkJCQkJfTsKLQkJCQl9OwotCQkJfTsKKwkJbXNpQDQxNjAwIHsKKwkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHg4MD47CisJCQlpbnRlcnJ1cHRzID0gPAorCQkJCTB4ZTAgMAorCQkJCTB4ZTEgMAorCQkJCTB4ZTIgMAorCQkJCTB4ZTMgMD47CiAJCX07Ci0KLQl9OwotCi0JcGNpMTogcGNpZUBmZmUwOTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDB4ZmZlMDkwMDAgMHgxMDAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMjU1PjsKLQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMCAweGEwMDAwMDAwIDB4MCAweDIwMDAwMDAwCi0JCQkgIDB4MTAwMDAwMCAweDAgMHgwIDB4ZmZjMTAwMDAgMHgwIDB4MTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNSAyPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHg0IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDUgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4NiAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHg3IDB4MQotCQkJPjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAotCQkJCSAgMHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCi0JCQkJICAweDAgMHgyMDAwMDAwMAotCi0JCQkJICAweDEwMDAwMDAgMHgwIDB4MAotCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKLQkJCQkgIDB4MCAweDEwMDAwPjsKKwkJdGltZXJANDIxMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAl9OworCXBjaWVAZmZlMGEwMDAgeworCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCX07CiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NzJkc19jYW1wX2NvcmUxLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NTcyZHNfY2FtcF9jb3JlMS5kdHMKaW5kZXggZTdiNDc3Zi4uZDZhOGZhZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg1NzJkc19jYW1wX2NvcmUxLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODU3MmRzX2NhbXBfY29yZTEuZHRzCkBAIC0xNSwxNjkgKzE1LDc0IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS9kdHMtdjEvOworL2luY2x1ZGUvICJtcGM4NTcyZHMuZHRzIgorCiAvIHsKIAltb2RlbCA9ICJmc2wsTVBDODU3MkRTIjsKIAljb21wYXRpYmxlID0gImZzbCxNUEM4NTcyRFMiLCAiZnNsLE1QQzg1NzJEUy1DQU1QIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkjc2l6ZS1jZWxscyA9IDwxPjsKLQotCWFsaWFzZXMgewotCQlldGhlcm5ldDIgPSAmZW5ldDI7Ci0JCWV0aGVybmV0MyA9ICZlbmV0MzsKLQkJc2VyaWFsMCA9ICZzZXJpYWwwOwotCQlwY2kyID0gJnBjaTI7Ci0JfTsKIAogCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KKwkJUG93ZXJQQyw4NTcyQDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKIAkJUG93ZXJQQyw4NTcyQDEgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwweDE+OwotCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwotCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwotCQkJZC1jYWNoZS1zaXplID0gPDB4ODAwMD47CQkvLyBMMSwgMzJLCi0JCQlpLWNhY2hlLXNpemUgPSA8MHg4MDAwPjsJCS8vIEwxLCAzMksKLQkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWJ1cy1mcmVxdWVuY3kgPSA8MD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47CiAJCX07CiAJfTsKIAotCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JCXJlZyA9IDwweDAgMHgwPjsJLy8gRmlsbGVkIGJ5IFUtQm9vdAorCWxvY2FsYnVzQGZmZTA1MDAwIHsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogCiAJc29jODU3MkBmZmUwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKLQkJcmFuZ2VzID0gPDB4MCAweGZmZTAwMDAwIDB4MTAwMDAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZpbGxlZCBvdXQgYnkgdWJvb3QuCi0KLQkJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1sMi1jYWNoZS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47Ci0JCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OyAvLyAzMiBieXRlcwotCQkJY2FjaGUtc2l6ZSA9IDwweDgwMDAwPjsgLy8gTDIsIDUxMksKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQllY20tbGF3QDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKLQotCQlkbWFAYzMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1kbWEiLCAiZnNsLGVsb3BsdXMtZG1hIjsKLQkJCXJlZyA9IDwweGMzMDAgMHg0PjsKLQkJCXJhbmdlcyA9IDwweDAgMHhjMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NzYgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NzcgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTAwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw3OCAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDc5IDI+OwotCQkJfTsKKwkJZWNtQDEwMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKLQorCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCX07CisJCW1lbW9yeS1jb250cm9sbGVyQDYwMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKwkJaTJjQDMwMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKwkJaTJjQDMxMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKwkJc2VyaWFsQDQ1MDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKwkJZ3Bpby1jb250cm9sbGVyQGYwMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKwkJbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7CisJCQljYWNoZS1zaXplID0gPDB4ODAwMDA+OwkvLyBMMiwgNTEySworCQl9OworCQlkbWFAMjEzMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKKwkJZXRoZXJuZXRAMjQwMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKIAkJbWRpb0AyNDUyMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZ2lhbmZhci1tZGlvIjsKLQkJCXJlZyA9IDwweDI0NTIwIDB4MjA+OwotCi0JCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJcmVnID0gPDB4Mj47Ci0JCQl9OwotCQkJcGh5MzogZXRoZXJuZXQtcGh5QDMgewotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCXJlZyA9IDwweDM+OwotCQkJfTsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07Ci0KLQkJZW5ldDI6IGV0aGVybmV0QDI2MDAwIHsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKLQkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7Ci0JCQlyZWcgPSA8MHgyNjAwMCAweDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDMxIDIgMzIgMiAzMyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKKwkJcHRwX2Nsb2NrQDI0ZTAwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07Ci0KLQkJZW5ldDM6IGV0aGVybmV0QDI3MDAwIHsKLQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKLQkJCWNvbXBhdGlibGUgPSAiZ2lhbmZhciI7Ci0JCQlyZWcgPSA8MHgyNzAwMCAweDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDM3IDIgMzggMiAzOSAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mz47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKKwkJZXRoZXJuZXRAMjUwMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKLQotCQltc2lANDE2MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1tc2kiLCAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4ODA+OwotCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MHg4MCAweDgwPjsKLQkJCWludGVycnVwdHMgPSA8Ci0JCQkJMHhlNCAwCi0JCQkJMHhlNSAwCi0JCQkJMHhlNiAwCi0JCQkJMHhlNyAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQltZGlvQDI1NTIwIHsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07Ci0KLQkJc2VyaWFsMDogc2VyaWFsQDQ2MDAgewotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4NDYwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CisJCWNyeXB0b0AzMDAwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwotCi0JCW1waWM6IHBpY0A0MDAwMCB7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OwotCQkJY29tcGF0aWJsZSA9ICJjaHJwLG9wZW4tcGljIjsKLQkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKKwkJcGljQDQwMDAwIHsKIAkJCXByb3RlY3RlZC1zb3VyY2VzID0gPAogCQkJMTggMTYgMTAgNDIgNDUgNTgJLyogTUVNIEwyIG1kaW8gc2VyaWFsIGNyeXB0byAqLwogCQkJMjkgMzAgMzQgMzUgMzYgNDAJLyogZW5ldDAgZW5ldDEgKi8KQEAgLTE4OSw0MSArOTQsMjUgQEAKIAkJCTB4ZTAgMHhlMSAweGUyIDB4ZTMJLyogbXNpICovCiAJCQk+OwogCQl9OwotCX07Ci0KLQlwY2kyOiBwY2llQGZmZTBhMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MHhmZmUwYTAwMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwotCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwIDB4YzAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKLQkJCSAgMHgxMDAwMDAwIDB4MCAweDAgMHhmZmMyMDAwMCAweDAgMHgxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDI2IDI+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDAgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4MSAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHgyIDB4MQotCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDMgMHgxCi0JCQk+OwotCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwCi0JCQkJICAweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAKLQkJCQkgIDB4MCAweDIwMDAwMDAwCi0KLQkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJICAweDEwMDAwMDAgMHgwIDB4MAotCQkJCSAgMHgwIDB4MTAwMDA+OworCQl0aW1lckA0MTEwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OworCQltc2lANDE2MDAgeworCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MHg4MCAweDgwPjsKKwkJCWludGVycnVwdHMgPSA8CisJCQkJMHhlNCAwCisJCQkJMHhlNSAwCisJCQkJMHhlNiAwCisJCQkJMHhlNyAwPjsKKwkJfTsKKwkJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQl9OworCX07CisJcGNpZUBmZmUwODAwMCB7CisJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJfTsKKwlwY2llQGZmZTA5MDAwIHsKKwkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjEwX2hwY2QuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2MTBfaHBjZC5kdHMKaW5kZXggODNjMzIxOC4uNmExMDlhMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2MTBfaHBjZC5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2MTBfaHBjZC5kdHMKQEAgLTE3NSw3ICsxNzUsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpAQCAtMTg2LDcgKzE4Niw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8NDIgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY0MV9ocGNuLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCmluZGV4IDg0ODMyMGUuLjFlODY2NmMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY24uZHRzCkBAIC0yNiwxMyArMjYsNiBAQAogCQlzZXJpYWwxID0gJnNlcmlhbDE7CiAJCXBjaTAgPSAmcGNpMDsKIAkJcGNpMSA9ICZwY2kxOwotLyoKLSAqIE9ubHkgb25lIG9mIFJhcGlkIElPIG9yIFBDSSBjYW4gYmUgcHJlc2VudCBkdWUgdG8gSFcgbGltaXRhdGlvbnMgYW5kCi0gKiBkdWUgdG8gdGhlIGZhY3QgdGhhdCB0aGUgMiBub3cgc2hhcmUgYWRkcmVzcyBzcGFjZSBpbiB0aGUgbmV3IG1lbW9yeQotICogbWFwLiAgVGhlIG1vc3QgbGlrZWx5IGNhc2UgaXMgdGhhdCB3ZSBoYXZlIFBDSSwgc28gY29tbWVudCBvdXQgdGhlCi0gKiByYXBpZGlvIG5vZGUuICBMZWF2ZSBpdCBoZXJlIGZvciByZWZlcmVuY2UuCi0gKi8KLQkJLyogcmFwaWRpbzAgPSAmcmFwaWRpbzA7ICovCiAJfTsKIAogCWNwdXMgewpAQCAtMzM1LDcgKzMyOCw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8NDIgMj47CkBAIC0zNDUsNyArMzM4LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDwyOCAyPjsKQEAgLTM2MSw2ICszNTQsNDEgQEAKIAkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKIAkJfTsKIAorCQlybXU6IHJtdUBkMzAwMCB7CisJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1ybXUiOworCQkJcmVnID0gPDB4ZDMwMDAgMHg1MDA+OworCQkJcmFuZ2VzID0gPDB4MCAweGQzMDAwIDB4NTAwPjsKKworCQkJbWVzc2FnZS11bml0QDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8tbXNnLXVuaXQiOworCQkJCXJlZyA9IDwweDAgMHgxMDA+OworCQkJCWludGVycnVwdHMgPSA8CisJCQkJCTUzIDIgLyogbXNnMV90eF9pcnEgKi8KKwkJCQkJNTQgMj47LyogbXNnMV9yeF9pcnEgKi8KKwkJCX07CisJCQltZXNzYWdlLXVuaXRAMTAwIHsKKwkJCQljb21wYXRpYmxlID0gImZzbCxzcmlvLW1zZy11bml0IjsKKwkJCQlyZWcgPSA8MHgxMDAgMHgxMDA+OworCQkJCWludGVycnVwdHMgPSA8CisJCQkJCTU1IDIgIC8qIG1zZzJfdHhfaXJxICovCisJCQkJCTU2IDI+Oy8qIG1zZzJfcnhfaXJxICovCisJCQl9OworCQkJZG9vcmJlbGwtdW5pdEA0MDAgeworCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8tZGJlbGwtdW5pdCI7CisJCQkJcmVnID0gPDB4NDAwIDB4ODA+OworCQkJCWludGVycnVwdHMgPSA8CisJCQkJCTQ5IDIgIC8qIGJlbGxfb3V0Yl9pcnEgKi8KKwkJCQkJNTAgMj47LyogYmVsbF9pbmJfaXJxICovCisJCQl9OworCQkJcG9ydC13cml0ZS11bml0QDRlMCB7CisJCQkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1wb3J0LXdyaXRlLXVuaXQiOworCQkJCXJlZyA9IDwweDRlMCAweDIwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDQ4IDI+OworCQkJfTsKKwkJfTsKKwogCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsKIAkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2NDEtZ3V0cyI7CiAJCQlyZWcgPSA8MHhlMDAwMCAweDEwMDA+OwpAQCAtNjEyLDE2ICs2NDAsMjcgQEAKIAkJfTsKIAl9OwogLyoKLQlyYXBpZGlvMDogcmFwaWRpb0BmZmVjMDAwMCB7CisgKiBPbmx5IG9uZSBvZiBSYXBpZCBJTyBvciBQQ0kgY2FuIGJlIHByZXNlbnQgZHVlIHRvIEhXIGxpbWl0YXRpb25zIGFuZAorICogZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhlIDIgbm93IHNoYXJlIGFkZHJlc3Mgc3BhY2UgaW4gdGhlIG5ldyBtZW1vcnkKKyAqIG1hcC4gIFRoZSBtb3N0IGxpa2VseSBjYXNlIGlzIHRoYXQgd2UgaGF2ZSBQQ0ksIHNvIGNvbW1lbnQgb3V0IHRoZQorICogcmFwaWRpbyBub2RlLiAgTGVhdmUgaXQgaGVyZSBmb3IgcmVmZXJlbmNlLgorCisJcmFwaWRpb0BmZmVjMDAwMCB7CisJCXJlZyA9IDwweGZmZWMwMDAwIDB4MTEwMDA+OworCQljb21wYXRpYmxlID0gImZzbCxzcmlvIjsKKwkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWludGVycnVwdHMgPSA8NDggMj47CiAJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wscmFwaWRpby1kZWx0YSI7Ci0JCXJlZyA9IDwweGZmZWMwMDAwIDB4MjAwMDA+OwotCQlyYW5nZXMgPSA8MCAwIDB4ODAwMDAwMDAgMCAweDIwMDAwMDAwPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCS8vIGVycl9pcnEgYmVsbF9vdXRiX2lycSBiZWxsX2luYl9pcnEKLQkJLy8JbXNnMV90eF9pcnEgbXNnMV9yeF9pcnEJbXNnMl90eF9pcnEgbXNnMl9yeF9pcnEKLQkJaW50ZXJydXB0cyA9IDw0OCAyIDQ5IDIgNTAgMiA1MyAyIDU0IDIgNTUgMiA1NiAyPjsKKwkJZnNsLHNyaW8tcm11LWhhbmRsZSA9IDwmcm11PjsKKwkJcmFuZ2VzOworCisJCXBvcnQxIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJI3NpemUtY2VsbHMgPSA8Mj47CisJCQljZWxsLWluZGV4ID0gPDE+OworCQkJcmFuZ2VzID0gPDAgMCAweDgwMDAwMDAwIDAgMHgyMDAwMDAwMD47CisJCX07CiAJfTsKICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY25fMzZiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9tcGM4NjQxX2hwY25fMzZiLmR0cwppbmRleCA4YmU4ZTcwLi5mZDRjZDRkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvbXBjODY0MV9ocGNuXzM2Yi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL21wYzg2NDFfaHBjbl8zNmIuZHRzCkBAIC0zMjgsNyArMzI4LDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKQEAgLTMzOCw3ICszMzgsNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDI4IDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL29iczYwMC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvb2JzNjAwLmR0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGU3ZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL29iczYwMC5kdHMKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBEZXZpY2UgVHJlZSBTb3VyY2UgZm9yIFBsYXRIb21lIE9wZW5CbG9ja1MgNjAwICg0MDVFWCkKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBCZW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnAuCisgKgorICogQmFzZWQgb24gS2lsYXVlYSBieToKKyAqCisgKiBDb3B5cmlnaHQgMjAwNy0yMDA5IERFTlggU29mdHdhcmUgRW5naW5lZXJpbmcsIFN0ZWZhbiBSb2VzZSA8c3JAZGVueC5kZT4KKyAqCisgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVyc2lvbiAyLiAgVGhpcyBwcm9ncmFtIGlzIGxpY2Vuc2VkICJhcyBpcyIgd2l0aG91dAorICogYW55IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqLworCisvZHRzLXYxLzsKKworLyB7CisJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJI3NpemUtY2VsbHMgPSA8MT47CisJbW9kZWwgPSAiUGxhdEhvbWUsT3BlbkJsb2NrUyA2MDAiOworCWNvbXBhdGlibGUgPSAicGxhdGhvbWUsb2JzNjAwIjsKKwlkY3ItcGFyZW50ID0gPCZ7L2NwdXMvY3B1QDB9PjsKKworCWFsaWFzZXMgeworCQlldGhlcm5ldDAgPSAmRU1BQzA7CisJCWV0aGVybmV0MSA9ICZFTUFDMTsKKwkJc2VyaWFsMCA9ICZVQVJUMDsKKwkJc2VyaWFsMSA9ICZVQVJUMTsKKwl9OworCisJY3B1cyB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKworCQljcHVAMCB7CisJCQlkZXZpY2VfdHlwZSA9ICJjcHUiOworCQkJbW9kZWwgPSAiUG93ZXJQQyw0MDVFWCI7CisJCQlyZWcgPSA8MHgwMDAwMDAwMD47CisJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwkJCXRpbWViYXNlLWZyZXF1ZW5jeSA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLworCQkJaS1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJZC1jYWNoZS1saW5lLXNpemUgPSA8MzI+OworCQkJaS1jYWNoZS1zaXplID0gPDE2Mzg0PjsgLyogMTYga0IgKi8KKwkJCWQtY2FjaGUtc2l6ZSA9IDwxNjM4ND47IC8qIDE2IGtCICovCisJCQlkY3ItY29udHJvbGxlcjsKKwkJCWRjci1hY2Nlc3MtbWV0aG9kID0gIm5hdGl2ZSI7CisJCX07CisJfTsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAwMDAwMDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJfTsKKworCVVJQzA6IGludGVycnVwdC1jb250cm9sbGVyIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sdWljLTQwNWV4IiwgImlibSx1aWMiOworCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKKwkJY2VsbC1pbmRleCA9IDwwPjsKKwkJZGNyLXJlZyA9IDwweDBjMCAweDAwOT47CisJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKKwl9OworCisJVUlDMTogaW50ZXJydXB0LWNvbnRyb2xsZXIxIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sdWljLTQwNWV4IiwiaWJtLHVpYyI7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQljZWxsLWluZGV4ID0gPDE+OworCQlkY3ItcmVnID0gPDB4MGQwIDB4MDA5PjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPDB4MWUgMHg0IDB4MWYgMHg0PjsgLyogY2FzY2FkZSAqLworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKKwl9OworCisJVUlDMjogaW50ZXJydXB0LWNvbnRyb2xsZXIyIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sdWljLTQwNWV4IiwiaWJtLHVpYyI7CisJCWludGVycnVwdC1jb250cm9sbGVyOworCQljZWxsLWluZGV4ID0gPDI+OworCQlkY3ItcmVnID0gPDB4MGUwIDB4MDA5PjsKKwkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCSNzaXplLWNlbGxzID0gPDA+OworCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQlpbnRlcnJ1cHRzID0gPDB4MWMgMHg0IDB4MWQgMHg0PjsgLyogY2FzY2FkZSAqLworCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKKwl9OworCisJQ1BNMDogY3BtIHsKKwkJY29tcGF0aWJsZSA9ICJpYm0sY3BtIjsKKwkJZGNyLWFjY2Vzcy1tZXRob2QgPSAibmF0aXZlIjsKKwkJZGNyLXJlZyA9IDwweDBiMCAweDAwMz47CisJCXVudXNlZC11bml0cyA9IDwweDAwMDAwMDAwPjsKKwkJaWRsZS1kb3plID0gPDB4MDIwMDAwMDA+OworCQlzdGFuZGJ5ID0gPDB4ZTNlNzQ4MDA+OworCX07CisKKwlwbGIgeworCQljb21wYXRpYmxlID0gImlibSxwbGItNDA1ZXgiLCAiaWJtLHBsYjQiOworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCXJhbmdlczsKKwkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisKKwkJU0RSQU0wOiBtZW1vcnktY29udHJvbGxlciB7CisJCQljb21wYXRpYmxlID0gImlibSxzZHJhbS00MDVleCIsICJpYm0sc2RyYW0tNHh4LWRkcjIiOworCQkJZGNyLXJlZyA9IDwweDAxMCAweDAwMj47CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMyPjsKKwkJCWludGVycnVwdHMgPSA8MHg1IDB4NAkvKiBFQ0MgREVEIEVycm9yICovCisJCQkJICAgICAgMHg2IDB4ND47CS8qIEVDQyBTRUMgRXJyb3IgKi8KKwkJfTsKKworCQlDUllQVE86IGNyeXB0b0BlZjcwMDAwMCB7CisJCQljb21wYXRpYmxlID0gImFtY2MscHBjNDA1ZXgtY3J5cHRvIiwgImFtY2MscHBjNHh4LWNyeXB0byI7CisJCQlyZWcgPSA8MHhlZjcwMDAwMCAweDgwNDAwPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OworCQkJaW50ZXJydXB0cyA9IDwweDE3IDB4Mj47CisJCX07CisKKwkJTUFMMDogbWNtYWwgeworCQkJY29tcGF0aWJsZSA9ICJpYm0sbWNtYWwtNDA1ZXgiLCAiaWJtLG1jbWFsMiI7CisJCQlkY3ItcmVnID0gPDB4MTgwIDB4MDYyPjsKKwkJCW51bS10eC1jaGFucyA9IDwyPjsKKwkJCW51bS1yeC1jaGFucyA9IDwyPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jk1BTDA+OworCQkJaW50ZXJydXB0cyA9IDwweDAgMHgxIDB4MiAweDMgMHg0PjsKKwkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKKwkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJaW50ZXJydXB0LW1hcCA9IDwvKlRYRU9CKi8gMHgwICZVSUMwIDB4YSAweDQKKwkJCQkJLypSWEVPQiovIDB4MSAmVUlDMCAweGIgMHg0CisJCQkJCS8qU0VSUiovICAweDIgJlVJQzEgMHgwIDB4NAorCQkJCQkvKlRYREUqLyAgMHgzICZVSUMxIDB4MSAweDQKKwkJCQkJLypSWERFKi8gIDB4NCAmVUlDMSAweDIgMHg0PjsKKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGZmZmZmZmZmPjsKKwkJfTsKKworCQlQT0IwOiBvcGIgeworCQkJY29tcGF0aWJsZSA9ICJpYm0sb3BiLTQwNWV4IiwgImlibSxvcGIiOworCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJCXJhbmdlcyA9IDwweDgwMDAwMDAwIDB4ODAwMDAwMDAgMHgxMDAwMDAwMAorCQkJCSAgMHhlZjYwMDAwMCAweGVmNjAwMDAwIDB4MDBhMDAwMDAKKwkJCQkgIDB4ZjAwMDAwMDAgMHhmMDAwMDAwMCAweDEwMDAwMDAwPjsKKwkJCWRjci1yZWcgPSA8MHgwYTAgMHgwMDU+OworCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisKKwkJCUVCQzA6IGViYyB7CisJCQkJY29tcGF0aWJsZSA9ICJpYm0sZWJjLTQwNWV4IiwgImlibSxlYmMiOworCQkJCWRjci1yZWcgPSA8MHgwMTIgMHgwMDI+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLworCQkJCS8qIHJhbmdlcyBwcm9wZXJ0eSBpcyBzdXBwbGllZCBieSBVLUJvb3QgKi8KKwkJCQlpbnRlcnJ1cHRzID0gPDB4NSAweDE+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzE+OworCisJCQkJbm9yX2ZsYXNoQDAsMCB7CisJCQkJCWNvbXBhdGlibGUgPSAiYW1kLHMyOWdsNTEybiIsICJjZmktZmxhc2giOworCQkJCQliYW5rLXdpZHRoID0gPDI+OworCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMDAwMDAwIDB4MDgwMDAwMDA+OworCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQkJCXBhcnRpdGlvbkAwIHsKKwkJCQkJCWxhYmVsID0gImtlcm5lbCArIGluaXRyZCI7CisJCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAzZGUwMDAwPjsKKwkJCQkJfTsKKwkJCQkJcGFydGl0aW9uQDNkZTAwMDAgeworCQkJCQkJbGFiZWwgPSAidXNlciBjb25maWcgYXJlYSI7CisJCQkJCQlyZWcgPSA8MHgwM2RlMDAwMCAweDAwMDgwMDAwPjsKKwkJCQkJfTsKKwkJCQkJcGFydGl0aW9uQDNlNjAwMDAgeworCQkJCQkJbGFiZWwgPSAidXNlciBwcm9ncmFtIGFyZWEiOworCQkJCQkJcmVnID0gPDB4MDNlNjAwMDAgMHgwNDAwMDAwMD47CisJCQkJCX07CisJCQkJCXBhcnRpdGlvbkA3ZTYwMDAwIHsKKwkJCQkJCWxhYmVsID0gImZsYXQgZGV2aWNlIHRyZWUiOworCQkJCQkJcmVnID0gPDB4MDdlNjAwMDAgMHgwMDA4MDAwMD47CisJCQkJCX07CisJCQkJCXBhcnRpdGlvbkA3ZWUwMDAwIHsKKwkJCQkJCWxhYmVsID0gInRlc3QgcHJvZ3JhbSI7CisJCQkJCQlyZWcgPSA8MHgwN2VlMDAwMCAweDAwMDgwMDAwPjsKKwkJCQkJfTsKKwkJCQkJcGFydGl0aW9uQDdmNjAwMDAgeworCQkJCQkJbGFiZWwgPSAidS1ib290IGVudiI7CisJCQkJCQlyZWcgPSA8MHgwN2Y2MDAwMCAweDAwMDQwMDAwPjsKKwkJCQkJfTsKKwkJCQkJcGFydGl0aW9uQDdmYTAwMDAgeworCQkJCQkJbGFiZWwgPSAidS1ib290IjsKKwkJCQkJCXJlZyA9IDwweDA3ZmEwMDAwIDB4MDAwNjAwMDA+OworCQkJCQl9OworCQkJCX07CisJCQl9OworCisJCQlVQVJUMDogc2VyaWFsQGVmNjAwMjAwIHsKKwkJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOworCQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQkJcmVnID0gPDB4ZWY2MDAyMDAgMHgwMDAwMDAwOD47CisJCQkJdmlydHVhbC1yZWcgPSA8MHhlZjYwMDIwMD47CisJCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCisJCQkJY3VycmVudC1zcGVlZCA9IDwwPjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4MWEgMHg0PjsKKwkJCX07CisKKwkJCVVBUlQxOiBzZXJpYWxAZWY2MDAzMDAgeworCQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7CisJCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCQlyZWcgPSA8MHhlZjYwMDMwMCAweDAwMDAwMDA4PjsKKwkJCQl2aXJ0dWFsLXJlZyA9IDwweGVmNjAwMzAwPjsKKwkJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwkJCQljdXJyZW50LXNwZWVkID0gPDA+OworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JlVJQzA+OworCQkJCWludGVycnVwdHMgPSA8MHgxIDB4ND47CisJCQl9OworCisJCQlJSUMwOiBpMmNAZWY2MDA0MDAgeworCQkJCWNvbXBhdGlibGUgPSAiaWJtLGlpYy00MDVleCIsICJpYm0saWljIjsKKwkJCQlyZWcgPSA8MHhlZjYwMDQwMCAweDAwMDAwMDE0PjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4MiAweDQ+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCisJCQkJcnRjQDY4IHsKKwkJCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzQwIjsKKwkJCQkJcmVnID0gPDB4Njg+OworCQkJCX07CisJCQl9OworCisJCQlJSUMxOiBpMmNAZWY2MDA1MDAgeworCQkJCWNvbXBhdGlibGUgPSAiaWJtLGlpYy00MDVleCIsICJpYm0saWljIjsKKwkJCQlyZWcgPSA8MHhlZjYwMDUwMCAweDAwMDAwMDE0PjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZVSUMwPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4NyAweDQ+OworCQkJfTsKKworCQkJUkdNSUkwOiBlbWFjLXJnbWlpQGVmNjAwYjAwIHsKKwkJCQljb21wYXRpYmxlID0gImlibSxyZ21paS00MDVleCIsICJpYm0scmdtaWkiOworCQkJCXJlZyA9IDwweGVmNjAwYjAwIDB4MDAwMDAxMDQ+OworCQkJCWhhcy1tZGlvOworCQkJfTsKKworCQkJRU1BQzA6IGV0aGVybmV0QGVmNjAwOTAwIHsKKwkJCQlsaW51eCxuZXR3b3JrLWluZGV4ID0gPDB4MD47CisJCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7CisJCQkJY29tcGF0aWJsZSA9ICJpYm0sZW1hYy00MDVleCIsICJpYm0sZW1hYzRzeW5jIjsKKwkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZFTUFDMD47CisJCQkJaW50ZXJydXB0cyA9IDwweDAgMHgxPjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OworCQkJCSNzaXplLWNlbGxzID0gPDA+OworCQkJCWludGVycnVwdC1tYXAgPSA8LypTdGF0dXMqLyAweDAgJlVJQzAgMHgxOCAweDQKKwkJCQkJCS8qV2FrZSovICAweDEgJlVJQzEgMHgxZCAweDQ+OworCQkJCXJlZyA9IDwweGVmNjAwOTAwIDB4MDAwMDAwYzQ+OworCQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWzAwMDAwMDAwMDAwMF07IC8qIEZpbGxlZCBpbiBieSBVLUJvb3QgKi8KKwkJCQltYWwtZGV2aWNlID0gPCZNQUwwPjsKKwkJCQltYWwtdHgtY2hhbm5lbCA9IDwwPjsKKwkJCQltYWwtcngtY2hhbm5lbCA9IDwwPjsKKwkJCQljZWxsLWluZGV4ID0gPDA+OworCQkJCW1heC1mcmFtZS1zaXplID0gPDkwMDA+OworCQkJCXJ4LWZpZm8tc2l6ZSA9IDw0MDk2PjsKKwkJCQl0eC1maWZvLXNpemUgPSA8MjA0OD47CisJCQkJcngtZmlmby1zaXplLWdpZ2UgPSA8MTYzODQ+OworCQkJCXR4LWZpZm8tc2l6ZS1naWdlID0gPDE2Mzg0PjsKKwkJCQlwaHktbW9kZSA9ICJyZ21paSI7CisJCQkJcGh5LW1hcCA9IDwweDAwMDAwMDAwPjsKKwkJCQlyZ21paS1kZXZpY2UgPSA8JlJHTUlJMD47CisJCQkJcmdtaWktY2hhbm5lbCA9IDwwPjsKKwkJCQloYXMtaW52ZXJ0ZWQtc3RhY3Itb2M7CisJCQkJaGFzLW5ldy1zdGFjci1zdGFvcGM7CisJCQl9OworCisJCQlFTUFDMTogZXRoZXJuZXRAZWY2MDBhMDAgeworCQkJCWxpbnV4LG5ldHdvcmstaW5kZXggPSA8MHgxPjsKKwkJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKKwkJCQljb21wYXRpYmxlID0gImlibSxlbWFjLTQwNWV4IiwgImlibSxlbWFjNHN5bmMiOworCQkJCWludGVycnVwdC1wYXJlbnQgPSA8JkVNQUMxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDB4MCAweDE+OworCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47CisJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJI3NpemUtY2VsbHMgPSA8MD47CisJCQkJaW50ZXJydXB0LW1hcCA9IDwvKlN0YXR1cyovIDB4MCAmVUlDMCAweDE5IDB4NAorCQkJCQkJLypXYWtlKi8gIDB4MSAmVUlDMSAweDFmIDB4ND47CisJCQkJcmVnID0gPDB4ZWY2MDBhMDAgMHgwMDAwMDBjND47CisJCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbMDAwMDAwMDAwMDAwXTsgLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLworCQkJCW1hbC1kZXZpY2UgPSA8Jk1BTDA+OworCQkJCW1hbC10eC1jaGFubmVsID0gPDE+OworCQkJCW1hbC1yeC1jaGFubmVsID0gPDE+OworCQkJCWNlbGwtaW5kZXggPSA8MT47CisJCQkJbWF4LWZyYW1lLXNpemUgPSA8OTAwMD47CisJCQkJcngtZmlmby1zaXplID0gPDQwOTY+OworCQkJCXR4LWZpZm8tc2l6ZSA9IDwyMDQ4PjsKKwkJCQlyeC1maWZvLXNpemUtZ2lnZSA9IDwxNjM4ND47CisJCQkJdHgtZmlmby1zaXplLWdpZ2UgPSA8MTYzODQ+OworCQkJCXBoeS1tb2RlID0gInJnbWlpIjsKKwkJCQlwaHktbWFwID0gPDB4MDAwMDAwMDA+OworCQkJCXJnbWlpLWRldmljZSA9IDwmUkdNSUkwPjsKKwkJCQlyZ21paS1jaGFubmVsID0gPDE+OworCQkJCWhhcy1pbnZlcnRlZC1zdGFjci1vYzsKKwkJCQloYXMtbmV3LXN0YWNyLXN0YW9wYzsKKwkJCX07CisKKwkJCUdQSU86IGdwaW9AZWY2MDA4MDAgeworCQkJCWRldmljZV90eXBlID0gImdwaW8iOworCQkJCWNvbXBhdGlibGUgPSAiaWJtLGdwaW8tNDA1ZXgiLCAiaWJtLHBwYzR4eC1ncGlvIjsKKwkJCQlyZWcgPSA8MHhlZjYwMDgwMCAweDUwPjsKKwkJCX07CisJCX07CisJfTsKKyAgICAgICAgY2hvc2VuIHsKKyAgICAgICAgICAgICAgICBsaW51eCxzdGRvdXQtcGF0aCA9ICIvcGxiL29wYi9zZXJpYWxAZWY2MDAyMDAiOworICAgICAgICB9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAxMHJkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMTByZGIuZHRzCmluZGV4IGQ2YzY2OWMuLmI4NjhkMjIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAxMHJkYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDEwcmRiLmR0cwpAQCAtOSwyMzAgKzksMzMgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2luY2x1ZGUvICJwMTAxMHNpLmR0c2kiCisvaW5jbHVkZS8gImZzbC9wMTAxMHNpLXByZS5kdHNpIgogCiAvIHsKIAltb2RlbCA9ICJmc2wsUDEwMTBSREIiOwogCWNvbXBhdGlibGUgPSAiZnNsLFAxMDEwUkRCIjsKIAotCWFsaWFzZXMgewotCQlzZXJpYWwwID0gJnNlcmlhbDA7Ci0JCXNlcmlhbDEgPSAmc2VyaWFsMTsKLQkJZXRoZXJuZXQwID0gJmVuZXQwOwotCQlldGhlcm5ldDEgPSAmZW5ldDE7Ci0JCWV0aGVybmV0MiA9ICZlbmV0MjsKLQkJcGNpMCA9ICZwY2kwOwotCQlwY2kxID0gJnBjaTE7Ci0JCWNhbjAgPSAmY2FuMDsKLQkJY2FuMSA9ICZjYW4xOwotCX07Ci0KIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCX07CiAKLQlpZmNAZmZlMWUwMDAgeworCWJvYXJkX2lmYzogaWZjOiBpZmNAZmZlMWUwMDAgewogCQkvKiBOT1IsIE5BTkQgRmxhc2hlcyBhbmQgQ1BMRCBvbiBib2FyZCAqLwogCQlyYW5nZXMgPSA8MHgwIDB4MCAweDAgMHhlZTAwMDAwMCAweDAyMDAwMDAwCiAJCQkgIDB4MSAweDAgMHgwIDB4ZmY4MDAwMDAgMHgwMDAxMDAwMAogCQkJICAweDMgMHgwIDB4MCAweGZmYjAwMDAwIDB4MDAwMDAwMjA+OwotCi0JCW5vckAwLDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MjAwMDAwMD47Ci0JCQliYW5rLXdpZHRoID0gPDI+OwotCQkJZGV2aWNlLXdpZHRoID0gPDE+OwotCi0JCQlwYXJ0aXRpb25ANDAwMDAgewotCQkJCS8qIDI1NktCIGZvciBEVEIgSW1hZ2UgKi8KLQkJCQlyZWcgPSA8MHgwMDA0MDAwMCAweDAwMDQwMDAwPjsKLQkJCQlsYWJlbCA9ICJOT1IgRFRCIEltYWdlIjsKLQkJCX07Ci0KLQkJCXBhcnRpdGlvbkA4MDAwMCB7Ci0JCQkJLyogNyBNQiBmb3IgTGludXggS2VybmVsIEltYWdlICovCi0JCQkJcmVnID0gPDB4MDAwODAwMDAgMHgwMDcwMDAwMD47Ci0JCQkJbGFiZWwgPSAiTk9SIExpbnV4IEtlcm5lbCBJbWFnZSI7Ci0JCQl9OwotCi0JCQlwYXJ0aXRpb25AODAwMDAwIHsKLQkJCQkvKiAyME1CIGZvciBKRkZTMiBiYXNlZCBSb290IGZpbGUgU3lzdGVtICovCi0JCQkJcmVnID0gPDB4MDA4MDAwMDAgMHgwMTQwMDAwMD47Ci0JCQkJbGFiZWwgPSAiTk9SIEpGRlMyIFJvb3QgRmlsZSBTeXN0ZW0iOwotCQkJfTsKLQotCQkJcGFydGl0aW9uQDFmMDAwMDAgewotCQkJCS8qIFRoaXMgbG9jYXRpb24gbXVzdCBub3QgYmUgYWx0ZXJlZCAgKi8KLQkJCQkvKiA1MTJLQiBmb3IgdS1ib290IEJvb3Rsb2FkZXIgSW1hZ2UgKi8KLQkJCQkvKiA1MTJLQiBmb3IgdS1ib290IEVudmlyb25tZW50IFZhcmlhYmxlcyAqLwotCQkJCXJlZyA9IDwweDAxZjAwMDAwIDB4MDAxMDAwMDA+OwotCQkJCWxhYmVsID0gIk5PUiBVLUJvb3QgSW1hZ2UiOwotCQkJCXJlYWQtb25seTsKLQkJCX07Ci0JCX07Ci0KLQkJbmFuZEAxLDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGlmYy1uYW5kIjsKLQkJCXJlZyA9IDwweDEgMHgwIDB4MTAwMDA+OwotCi0JCQlwYXJ0aXRpb25AMCB7Ci0JCQkJLyogVGhpcyBsb2NhdGlvbiBtdXN0IG5vdCBiZSBhbHRlcmVkICAqLwotCQkJCS8qIDFNQiBmb3IgdS1ib290IEJvb3Rsb2FkZXIgSW1hZ2UgKi8KLQkJCQlyZWcgPSA8MHgwIDB4MDAxMDAwMDA+OwotCQkJCWxhYmVsID0gIk5BTkQgVS1Cb290IEltYWdlIjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlwYXJ0aXRpb25AMTAwMDAwIHsKLQkJCQkvKiAxTUIgZm9yIERUQiBJbWFnZSAqLwotCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDAxMDAwMDA+OwotCQkJCWxhYmVsID0gIk5BTkQgRFRCIEltYWdlIjsKLQkJCX07Ci0KLQkJCXBhcnRpdGlvbkAyMDAwMDAgewotCQkJCS8qIDRNQiBmb3IgTGludXggS2VybmVsIEltYWdlICovCi0JCQkJcmVnID0gPDB4MDAyMDAwMDAgMHgwMDQwMDAwMD47Ci0JCQkJbGFiZWwgPSAiTkFORCBMaW51eCBLZXJuZWwgSW1hZ2UiOwotCQkJfTsKLQotCQkJcGFydGl0aW9uQDYwMDAwMCB7Ci0JCQkJLyogNE1CIGZvciBDb21wcmVzc2VkIFJvb3QgZmlsZSBTeXN0ZW0gSW1hZ2UgKi8KLQkJCQlyZWcgPSA8MHgwMDYwMDAwMCAweDAwNDAwMDAwPjsKLQkJCQlsYWJlbCA9ICJOQU5EIENvbXByZXNzZWQgUkZTIEltYWdlIjsKLQkJCX07Ci0KLQkJCXBhcnRpdGlvbkBhMDAwMDAgewotCQkJCS8qIDE1TUIgZm9yIEpGRlMyIGJhc2VkIFJvb3QgZmlsZSBTeXN0ZW0gKi8KLQkJCQlyZWcgPSA8MHgwMGEwMDAwMCAweDAwZjAwMDAwPjsKLQkJCQlsYWJlbCA9ICJOQU5EIEpGRlMyIFJvb3QgRmlsZSBTeXN0ZW0iOwotCQkJfTsKLQotCQkJcGFydGl0aW9uQDE5MDAwMDAgewotCQkJCS8qIDdNQiBmb3IgVXNlciBBcmVhICovCi0JCQkJcmVnID0gPDB4MDE5MDAwMDAgMHgwMDcwMDAwMD47Ci0JCQkJbGFiZWwgPSAiTkFORCBVc2VyIGFyZWEiOwotCQkJfTsKLQkJfTsKLQotCQljcGxkQDMsMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTByZGItY3BsZCI7Ci0JCQlyZWcgPSA8MHgzIDB4MCAweDAwMDAwMjA+OwotCQkJYmFuay13aWR0aCA9IDwxPjsKLQkJCWRldmljZS13aWR0aCA9IDwxPjsKLQkJfTsKKwkJcmVnID0gPDB4MCAweGZmZTFlMDAwIDAgMHgyMDAwPjsKIAl9OwogCi0Jc29jQGZmZTAwMDAwIHsKLQkJc3BpQDcwMDAgewotCQkJZmxhc2hAMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzMjVzbDEyODAxIjsKLQkJCQlyZWcgPSA8MD47Ci0JCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OwotCi0JCQkJcGFydGl0aW9uQDAgewotCQkJCQkvKiAxTUIgZm9yIHUtYm9vdCBCb290bG9hZGVyIEltYWdlICovCi0JCQkJCS8qIDFNQiBmb3IgRW52aXJvbm1lbnQgKi8KLQkJCQkJcmVnID0gPDB4MCAweDAwMTAwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIEZsYXNoIFUtQm9vdCBJbWFnZSI7Ci0JCQkJCXJlYWQtb25seTsKLQkJCQl9OwotCi0JCQkJcGFydGl0aW9uQDEwMDAwMCB7Ci0JCQkJCS8qIDUxMktCIGZvciBEVEIgSW1hZ2UgKi8KLQkJCQkJcmVnID0gPDB4MDAxMDAwMDAgMHgwMDA4MDAwMD47Ci0JCQkJCWxhYmVsID0gIlNQSSBGbGFzaCBEVEIgSW1hZ2UiOwotCQkJCX07Ci0KLQkJCQlwYXJ0aXRpb25AMTgwMDAwIHsKLQkJCQkJLyogNE1CIGZvciBMaW51eCBLZXJuZWwgSW1hZ2UgKi8KLQkJCQkJcmVnID0gPDB4MDAxODAwMDAgMHgwMDQwMDAwMD47Ci0JCQkJCWxhYmVsID0gIlNQSSBGbGFzaCBMaW51eCBLZXJuZWwgSW1hZ2UiOwotCQkJCX07Ci0KLQkJCQlwYXJ0aXRpb25ANTgwMDAwIHsKLQkJCQkJLyogNE1CIGZvciBDb21wcmVzc2VkIFJGUyBJbWFnZSAqLwotCQkJCQlyZWcgPSA8MHgwMDU4MDAwMCAweDAwNDAwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIEZsYXNoIENvbXByZXNzZWQgUkZTSW1hZ2UiOwotCQkJCX07Ci0KLQkJCQlwYXJ0aXRpb25AOTgwMDAwIHsKLQkJCQkJLyogNi41TUIgZm9yIEpGRlMyIGJhc2VkIFJGUyAqLwotCQkJCQlyZWcgPSA8MHgwMDk4MDAwMCAweDAwNjgwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIEZsYXNoIEpGRlMyIFJGUyI7Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJdXNiQDIyMDAwIHsKLQkJCXBoeV90eXBlID0gInV0bWkiOwotCQl9OwotCi0JCW1kaW9AMjQwMDAgewotCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MyAxPjsKLQkJCQlyZWcgPSA8MHgxPjsKLQkJCX07Ci0KLQkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIgMT47Ci0JCQkJcmVnID0gPDB4MD47Ci0JCQl9OwotCi0JCQlwaHkyOiBldGhlcm5ldC1waHlAMiB7Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyIDE+OwotCQkJCXJlZyA9IDwweDI+OwotCQkJfTsKLQkJfTsKLQotCQllbmV0MDogZXRoZXJuZXRAYjAwMDAgewotCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQkJfTsKLQotCQllbmV0MTogZXRoZXJuZXRAYjEwMDAgewotCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47Ci0JCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKLQkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAic2dtaWkiOwotCQl9OwotCi0JCWVuZXQyOiBldGhlcm5ldEBiMjAwMCB7Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkyPjsKLQkJCXRiaS1oYW5kbGUgPSA8JnRiaTE+OwotCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJzZ21paSI7Ci0JCX07CisJYm9hcmRfc29jOiBzb2M6IHNvY0BmZmUwMDAwMCB7CisJCXJhbmdlcyA9IDwweDAgMHgwIDB4ZmZlMDAwMDAgMHgxMDAwMDA+OwogCX07CiAKIAlwY2kwOiBwY2llQGZmZTA5MDAwIHsKKwkJcmVnID0gPDAgMHhmZmUwOTAwMCAwIDB4MTAwMD47CiAJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMCAweGEwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZmZjMTAwMDAgMHgwIDB4MTAwMDA+OwogCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJLyogSURTRUwgMHgwICovCi0JCQkwMDAwIDB4MCAweDAgMHgxICZtcGljIDB4NCAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg1IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweDYgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4NyAweDEKLQkJCT47Ci0KIAkJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAKIAkJCQkgIDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAogCQkJCSAgMHgwIDB4MjAwMDAwMDAKQEAgLTI0NCwyNCArNDcsMTAgQEAKIAl9OwogCiAJcGNpMTogcGNpZUBmZmUwYTAwMCB7CisJCXJlZyA9IDwwIDB4ZmZlMGEwMDAgMCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDAgMHg4MDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzAwMDAwIDB4MCAweDEwMDAwPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMHgwIDB4MCAweDc+OwotCQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDQgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4NSAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHg2IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDcgMHgxCi0JCQk+OwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtMjcyLDMgKzYxLDYgQEAKIAkJfTsKIAl9OwogfTsKKworL2luY2x1ZGUvICJwMTAxMHJkYi5kdHNpIgorL2luY2x1ZGUvICJmc2wvcDEwMTBzaS1wb3N0LmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMTByZGIuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAxMHJkYi5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YzRhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMTByZGIuZHRzaQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIFAxMDEwIFJEQiBEZXZpY2UgVHJlZSBTb3VyY2Ugc3R1YiAobm8gYWRkcmVzc2VzIG9yIHRvcC1sZXZlbCByYW5nZXMpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyZib2FyZF9pZmMgeworCW5vckAwLDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKKwkJcmVnID0gPDB4MCAweDAgMHgyMDAwMDAwPjsKKwkJYmFuay13aWR0aCA9IDwyPjsKKwkJZGV2aWNlLXdpZHRoID0gPDE+OworCisJCXBhcnRpdGlvbkA0MDAwMCB7CisJCQkvKiAyNTZLQiBmb3IgRFRCIEltYWdlICovCisJCQlyZWcgPSA8MHgwMDA0MDAwMCAweDAwMDQwMDAwPjsKKwkJCWxhYmVsID0gIk5PUiBEVEIgSW1hZ2UiOworCQl9OworCisJCXBhcnRpdGlvbkA4MDAwMCB7CisJCQkvKiA3IE1CIGZvciBMaW51eCBLZXJuZWwgSW1hZ2UgKi8KKwkJCXJlZyA9IDwweDAwMDgwMDAwIDB4MDA3MDAwMDA+OworCQkJbGFiZWwgPSAiTk9SIExpbnV4IEtlcm5lbCBJbWFnZSI7CisJCX07CisKKwkJcGFydGl0aW9uQDgwMDAwMCB7CisJCQkvKiAyME1CIGZvciBKRkZTMiBiYXNlZCBSb290IGZpbGUgU3lzdGVtICovCisJCQlyZWcgPSA8MHgwMDgwMDAwMCAweDAxNDAwMDAwPjsKKwkJCWxhYmVsID0gIk5PUiBKRkZTMiBSb290IEZpbGUgU3lzdGVtIjsKKwkJfTsKKworCQlwYXJ0aXRpb25AMWYwMDAwMCB7CisJCQkvKiBUaGlzIGxvY2F0aW9uIG11c3Qgbm90IGJlIGFsdGVyZWQgICovCisJCQkvKiA1MTJLQiBmb3IgdS1ib290IEJvb3Rsb2FkZXIgSW1hZ2UgKi8KKwkJCS8qIDUxMktCIGZvciB1LWJvb3QgRW52aXJvbm1lbnQgVmFyaWFibGVzICovCisJCQlyZWcgPSA8MHgwMWYwMDAwMCAweDAwMTAwMDAwPjsKKwkJCWxhYmVsID0gIk5PUiBVLUJvb3QgSW1hZ2UiOworCQkJcmVhZC1vbmx5OworCQl9OworCX07CisKKwluYW5kQDEsMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsaWZjLW5hbmQiOworCQlyZWcgPSA8MHgxIDB4MCAweDEwMDAwPjsKKworCQlwYXJ0aXRpb25AMCB7CisJCQkvKiBUaGlzIGxvY2F0aW9uIG11c3Qgbm90IGJlIGFsdGVyZWQgICovCisJCQkvKiAxTUIgZm9yIHUtYm9vdCBCb290bG9hZGVyIEltYWdlICovCisJCQlyZWcgPSA8MHgwIDB4MDAxMDAwMDA+OworCQkJbGFiZWwgPSAiTkFORCBVLUJvb3QgSW1hZ2UiOworCQkJcmVhZC1vbmx5OworCQl9OworCisJCXBhcnRpdGlvbkAxMDAwMDAgeworCQkJLyogMU1CIGZvciBEVEIgSW1hZ2UgKi8KKwkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDAxMDAwMDA+OworCQkJbGFiZWwgPSAiTkFORCBEVEIgSW1hZ2UiOworCQl9OworCisJCXBhcnRpdGlvbkAyMDAwMDAgeworCQkJLyogNE1CIGZvciBMaW51eCBLZXJuZWwgSW1hZ2UgKi8KKwkJCXJlZyA9IDwweDAwMjAwMDAwIDB4MDA0MDAwMDA+OworCQkJbGFiZWwgPSAiTkFORCBMaW51eCBLZXJuZWwgSW1hZ2UiOworCQl9OworCisJCXBhcnRpdGlvbkA2MDAwMDAgeworCQkJLyogNE1CIGZvciBDb21wcmVzc2VkIFJvb3QgZmlsZSBTeXN0ZW0gSW1hZ2UgKi8KKwkJCXJlZyA9IDwweDAwNjAwMDAwIDB4MDA0MDAwMDA+OworCQkJbGFiZWwgPSAiTkFORCBDb21wcmVzc2VkIFJGUyBJbWFnZSI7CisJCX07CisKKwkJcGFydGl0aW9uQGEwMDAwMCB7CisJCQkvKiAxNU1CIGZvciBKRkZTMiBiYXNlZCBSb290IGZpbGUgU3lzdGVtICovCisJCQlyZWcgPSA8MHgwMGEwMDAwMCAweDAwZjAwMDAwPjsKKwkJCWxhYmVsID0gIk5BTkQgSkZGUzIgUm9vdCBGaWxlIFN5c3RlbSI7CisJCX07CisKKwkJcGFydGl0aW9uQDE5MDAwMDAgeworCQkJLyogN01CIGZvciBVc2VyIEFyZWEgKi8KKwkJCXJlZyA9IDwweDAxOTAwMDAwIDB4MDA3MDAwMDA+OworCQkJbGFiZWwgPSAiTkFORCBVc2VyIGFyZWEiOworCQl9OworCX07CisKKwljcGxkQDMsMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTByZGItY3BsZCI7CisJCXJlZyA9IDwweDMgMHgwIDB4MDAwMDAyMD47CisJCWJhbmstd2lkdGggPSA8MT47CisJCWRldmljZS13aWR0aCA9IDwxPjsKKwl9OworfTsKKworJmJvYXJkX3NvYyB7CisJaTJjQDMwMDAgeworCQlydGNANjggeworCQkJY29tcGF0aWJsZSA9ICJwZXJpY29tLHB0N2M0MzM4IjsKKwkJCXJlZyA9IDwweDY4PjsKKwkJfTsKKwl9OworCisJc3BpQDcwMDAgeworCQlmbGFzaEAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gInNwYW5zaW9uLHMyNXNsMTI4MDEiOworCQkJcmVnID0gPDA+OworCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OworCisJCQlwYXJ0aXRpb25AMCB7CisJCQkJLyogMU1CIGZvciB1LWJvb3QgQm9vdGxvYWRlciBJbWFnZSAqLworCQkJCS8qIDFNQiBmb3IgRW52aXJvbm1lbnQgKi8KKwkJCQlyZWcgPSA8MHgwIDB4MDAxMDAwMDA+OworCQkJCWxhYmVsID0gIlNQSSBGbGFzaCBVLUJvb3QgSW1hZ2UiOworCQkJCXJlYWQtb25seTsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxMDAwMDAgeworCQkJCS8qIDUxMktCIGZvciBEVEIgSW1hZ2UgKi8KKwkJCQlyZWcgPSA8MHgwMDEwMDAwMCAweDAwMDgwMDAwPjsKKwkJCQlsYWJlbCA9ICJTUEkgRmxhc2ggRFRCIEltYWdlIjsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkAxODAwMDAgeworCQkJCS8qIDRNQiBmb3IgTGludXggS2VybmVsIEltYWdlICovCisJCQkJcmVnID0gPDB4MDAxODAwMDAgMHgwMDQwMDAwMD47CisJCQkJbGFiZWwgPSAiU1BJIEZsYXNoIExpbnV4IEtlcm5lbCBJbWFnZSI7CisJCQl9OworCisJCQlwYXJ0aXRpb25ANTgwMDAwIHsKKwkJCQkvKiA0TUIgZm9yIENvbXByZXNzZWQgUkZTIEltYWdlICovCisJCQkJcmVnID0gPDB4MDA1ODAwMDAgMHgwMDQwMDAwMD47CisJCQkJbGFiZWwgPSAiU1BJIEZsYXNoIENvbXByZXNzZWQgUkZTSW1hZ2UiOworCQkJfTsKKworCQkJcGFydGl0aW9uQDk4MDAwMCB7CisJCQkJLyogNi41TUIgZm9yIEpGRlMyIGJhc2VkIFJGUyAqLworCQkJCXJlZyA9IDwweDAwOTgwMDAwIDB4MDA2ODAwMDA+OworCQkJCWxhYmVsID0gIlNQSSBGbGFzaCBKRkZTMiBSRlMiOworCQkJfTsKKwkJfTsKKwl9OworCisJdXNiQDIyMDAwIHsKKwkJcGh5X3R5cGUgPSAidXRtaSI7CisJCWRyX21vZGUgPSAiaG9zdCI7CisJfTsKKworCW1kaW9AMjQwMDAgeworCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CisJCQlpbnRlcnJ1cHRzID0gPDMgMSAwIDA+OworCQkJcmVnID0gPDB4MT47CisJCX07CisKKwkJcGh5MTogZXRoZXJuZXQtcGh5QDEgeworCQkJaW50ZXJydXB0cyA9IDwyIDEgMCAwPjsKKwkJCXJlZyA9IDwweDA+OworCQl9OworCisJCXBoeTI6IGV0aGVybmV0LXBoeUAyIHsKKwkJCWludGVycnVwdHMgPSA8MiAxIDAgMD47CisJCQlyZWcgPSA8MHgyPjsKKwkJfTsKKworCQl0YmktcGh5QDMgeworCQkJZGV2aWNlLXR5cGUgPSAidGJpLXBoeSI7CisJCQlyZWcgPSA8MHgzPjsKKwkJfTsKKwl9OworCisJbWRpb0AyNTAwMCB7CisJCXRiaTA6IHRiaS1waHlAMTEgeworCQkJcmVnID0gPDB4MTE+OworCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CisJCX07CisJfTsKKworCW1kaW9AMjYwMDAgeworCQl0YmkxOiB0YmktcGh5QDExIHsKKwkJCXJlZyA9IDwweDExPjsKKwkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQl9OworCX07CisKKwllbmV0MDogZXRoZXJuZXRAYjAwMDAgeworCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKKwkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7CisJfTsKKworCWVuZXQxOiBldGhlcm5ldEBiMTAwMCB7CisJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OworCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKKwkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJzZ21paSI7CisJfTsKKworCWVuZXQyOiBldGhlcm5ldEBiMjAwMCB7CisJCXBoeS1oYW5kbGUgPSA8JnBoeTI+OworCQl0YmktaGFuZGxlID0gPCZ0YmkxPjsKKwkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJzZ21paSI7CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMTByZGJfMzZiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAxMHJkYl8zNmIuZHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Nzc2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMTByZGJfMzZiLmR0cwpAQCAtMCwwICsxLDg5IEBACisvKgorICogUDEwMTAgUkRCIERldmljZSBUcmVlIFNvdXJjZSAoMzYtYml0IGFkZHJlc3MgbWFwKQorICoKKyAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICoKKyAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQorICogbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvaW5jbHVkZS8gImZzbC9wMTAxMHNpLXByZS5kdHNpIgorCisvIHsKKwltb2RlbCA9ICJmc2wsUDEwMTBSREIiOworCWNvbXBhdGlibGUgPSAiZnNsLFAxMDEwUkRCIjsKKworCW1lbW9yeSB7CisJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CisJfTsKKworCWJvYXJkX2lmYzogaWZjOiBpZmNAZmZmZTFlMDAwIHsKKwkJLyogTk9SLCBOQU5EIEZsYXNoZXMgYW5kIENQTEQgb24gYm9hcmQgKi8KKwkJcmFuZ2VzID0gPDB4MCAweDAgMHhmIDB4ZWUwMDAwMDAgMHgwMjAwMDAwMAorCQkJICAweDEgMHgwIDB4ZiAweGZmODAwMDAwIDB4MDAwMTAwMDAKKwkJCSAgMHgzIDB4MCAweGYgMHhmZmIwMDAwMCAweDAwMDAwMDIwPjsKKwkJcmVnID0gPDB4ZiAweGZmZTFlMDAwIDAgMHgyMDAwPjsKKwl9OworCisJYm9hcmRfc29jOiBzb2M6IHNvY0BmZmZlMDAwMDAgeworCQlyYW5nZXMgPSA8MHgwIDB4ZiAweGZmZTAwMDAwIDB4MTAwMDAwPjsKKwl9OworCisJcGNpMDogcGNpZUBmZmZlMDkwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmZlMDkwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwIDB4YyAweDIwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmZmMxMDAwMCAweDAgMHgxMDAwMD47CisJCXBjaWVAMCB7CisJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwCisJCQkJICAweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAKKwkJCQkgIDB4MCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDAwPjsKKwkJfTsKKwl9OworCisJcGNpMTogcGNpZUBmZmZlMGEwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmZlMGEwMDAgMCAweDEwMDA+OworCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwIDB4YyAweDIwMDAwMDAwIDB4MCAweDIwMDAwMDAwCisJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmZmMxMDAwMCAweDAgMHgxMDAwMD47CisJCXBjaWVAMCB7CisJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwCisJCQkJICAweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAKKwkJCQkgIDB4MCAweDIwMDAwMDAwCisKKwkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgwIDB4MTAwMDAwPjsKKwkJfTsKKwl9OworfTsKKworL2luY2x1ZGUvICJwMTAxMHJkYi5kdHNpIgorL2luY2x1ZGUvICJmc2wvcDEwMTBzaS1wb3N0LmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMTBzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDEwc2kuZHRzaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiZTBhNC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMTBzaS5kdHNpCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qCi0gKiBQMTAxMHNpIERldmljZSBUcmVlIFNvdXJjZQotICoKLSAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLS9kdHMtdjEvOwotLyB7Ci0JY29tcGF0aWJsZSA9ICJmc2wsUDEwMTAiOwotCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCSNzaXplLWNlbGxzID0gPDI+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLFAxMDEwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwweDA+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwotCQl9OwotCX07Ci0KLQlpZmNAZmZlMWUwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLGlmYyIsICJzaW1wbGUtYnVzIjsKLQkJcmVnID0gPDB4MCAweGZmZTFlMDAwIDAgMHgyMDAwPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDE5IDI+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQl9OwotCi0Jc29jQGZmZTAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1pbW1yIiwgInNpbXBsZS1idXMiOwotCQlyYW5nZXMgPSA8MHgwICAweDAgMHhmZmUwMDAwMCAweDEwMDAwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgotCi0JCWVjbS1sYXdAMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxlY20tbGF3IjsKLQkJCXJlZyA9IDwweDAgMHgxMDAwPjsKLQkJCWZzbCxudW0tbGF3cyA9IDwxMj47Ci0JCX07Ci0KLQkJZWNtQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtZWNtIiwgImZzbCxlY20iOwotCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwotCQl9OwotCi0JCWkyY0AzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDMwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJaTJjQDMxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzEwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlzcGlANzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1lc3BpIjsKLQkJCXJlZyA9IDwweDcwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NTkgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZnNsLGVzcGktbnVtLWNoaXBzZWxlY3RzID0gPDE+OwotCQl9OwotCi0JCWdwaW86IGdwaW8tY29udHJvbGxlckBmMDAwIHsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1ncGlvIjsKLQkJCXJlZyA9IDwweGYwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0NyAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCX07Ci0KLQkJc2F0YUAxODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwcS1zYXRhLXYyIjsKLQkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJaW50ZXJydXB0cyA9IDw3NCAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJc2F0YUAxOTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwcS1zYXRhLXYyIjsKLQkJCXJlZyA9IDwweDE5MDAwIDB4MTAwMD47Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJaW50ZXJydXB0cyA9IDw0MSAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJY2FuMDogY2FuQDFjMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLWZsZXhjYW4iOwotCQkJcmVnID0gPDB4MWMwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NDggMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCWNhbjE6IGNhbkAxZDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1mbGV4Y2FuIjsKLQkJCXJlZyA9IDwweDFkMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDYxIDB4Mj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1sMi1jYWNoZS1jb250cm9sbGVyIiwKLQkJCQkJImZzbCxwMTAxNC1sMi1jYWNoZS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47Ci0JCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwotCQkJY2FjaGUtc2l6ZSA9IDwweDQwMDAwPjsgLy8gTDIsMjU2SwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwotCQl9OwotCi0JCWRtYUAyMTMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtZG1hIiwgImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHgyMTMwMCAweDQ+OwotCQkJcmFuZ2VzID0gPDB4MCAweDIxMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1kbWEtY2hhbm5lbCIsICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjAgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLWRtYS1jaGFubmVsIiwgImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjEgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1kbWEtY2hhbm5lbCIsICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTAwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMiAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLWRtYS1jaGFubmVsIiwgImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIzIDI+OwotCQkJfTsKLQkJfTsKLQotCQl1c2JAMjIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wtdXNiMi1kciI7Ci0JCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyOCAweDI+OwotCQkJZHJfbW9kZSA9ICJob3N0IjsKLQkJfTsKLQotCQltZGlvQDI0MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxldHNlYzItbWRpbyI7Ci0JCQlyZWcgPSA8MHgyNDAwMCAweDEwMDAgMHhiMDAzMCAweDQ+OwotCQl9OwotCi0JCW1kaW9AMjUwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGV0c2VjMi10YmkiOwotCQkJcmVnID0gPDB4MjUwMDAgMHgxMDAwIDB4YjEwMzAgMHg0PjsKLQkJCXRiaTA6IHRiaS1waHlAMTEgewotCQkJCXJlZyA9IDwweDExPjsKLQkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKLQkJCX07Ci0JCX07Ci0KLQkJbWRpb0AyNjAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyLXRiaSI7Ci0JCQlyZWcgPSA8MHgyNjAwMCAweDEwMDAgMHhiMTAzMCAweDQ+OwotCQkJdGJpMTogdGJpLXBoeUAxMSB7Ci0JCQkJcmVnID0gPDB4MTE+OwotCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwotCQkJfTsKLQkJfTsKLQotCQlzZGhjaUAyZTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxlc2RoYyI7Ci0JCQlyZWcgPSA8MHgyZTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw3MiAweDg+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlmc2wsc2RoY2ktYXV0by1jbWQxMjsKLQkJfTsKLQotCQllbmV0MDogZXRoZXJuZXRAYjAwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyIjsKLQkJCWZzbCxudW1fcnhfcXVldWVzID0gPDB4OD47Ci0JCQlmc2wsbnVtX3R4X3F1ZXVlcyA9IDwweDg+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQotCQkJcXVldWUtZ3JvdXBAMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJcmVnID0gPDB4YjAwMDAgMHgxMDAwPjsKLQkJCQlmc2wscngtYml0LW1hcCA9IDwweGZmPjsKLQkJCQlmc2wsdHgtYml0LW1hcCA9IDwweGZmPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDI5IDIgMzAgMiAzNCAyPjsKLQkJCX07Ci0KLQkJfTsKLQotCQllbmV0MTogZXRoZXJuZXRAYjEwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyIjsKLQkJCWZzbCxudW1fcnhfcXVldWVzID0gPDB4OD47Ci0JCQlmc2wsbnVtX3R4X3F1ZXVlcyA9IDwweDg+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQotCQkJcXVldWUtZ3JvdXBAMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJcmVnID0gPDB4YjEwMDAgMHgxMDAwPjsKLQkJCQlmc2wscngtYml0LW1hcCA9IDwweGZmPjsKLQkJCQlmc2wsdHgtYml0LW1hcCA9IDwweGZmPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM1IDIgMzYgMiA0MCAyPjsKLQkJCX07Ci0KLQkJfTsKLQotCQllbmV0MjogZXRoZXJuZXRAYjIwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyIjsKLQkJCWZzbCxudW1fcnhfcXVldWVzID0gPDB4OD47Ci0JCQlmc2wsbnVtX3R4X3F1ZXVlcyA9IDwweDg+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQotCQkJcXVldWUtZ3JvdXBAMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJcmVnID0gPDB4YjIwMDAgMHgxMDAwPjsKLQkJCQlmc2wscngtYml0LW1hcCA9IDwweGZmPjsKLQkJCQlmc2wsdHgtYml0LW1hcCA9IDwweGZmPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMxIDIgMzIgMiAzMyAyPjsKLQkJCX07Ci0KLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiY2hycCxvcGVuLXBpYyI7Ci0JCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7Ci0JCX07Ci0KLQkJbXNpQDQxNjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLW1zaSIsICJmc2wsbXBpYy1tc2kiOwotCQkJcmVnID0gPDB4NDE2MDAgMHg4MD47Ci0JCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8Ci0JCQkJMHhlMCAwCi0JCQkJMHhlMSAwCi0JCQkJMHhlMiAwCi0JCQkJMHhlMyAwCi0JCQkJMHhlNCAwCi0JCQkJMHhlNSAwCi0JCQkJMHhlNiAwCi0JCQkJMHhlNyAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgYmxvY2sKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDEwLWd1dHMiOwotCQkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKLQkJCWZzbCxoYXMtcnN0Y3I7Ci0JCX07Ci0JfTsKLQotCXBjaTA6IHBjaWVAZmZlMDkwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwMTAxMC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjMiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDAgMHhmZmUwOTAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwotCX07Ci0KLQlwY2kxOiBwY2llQGZmZTBhMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMTAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4zIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwwIDB4ZmZlMGEwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQl9OwotfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMHJkYi5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjByZGIuZHRzCmluZGV4IGQ2YThhZTQuLjUxOGJmOTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMHJkYi5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIwcmRiLmR0cwpAQCAtOSwyNjcgKzksMzMgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2luY2x1ZGUvICJwMTAyMHNpLmR0c2kiCi0KKy9pbmNsdWRlLyAiZnNsL3AxMDIwc2ktcHJlLmR0c2kiCiAvIHsKIAltb2RlbCA9ICJmc2wsUDEwMjBSREIiOwogCWNvbXBhdGlibGUgPSAiZnNsLFAxMDIwUkRCIjsKIAotCWFsaWFzZXMgewotCQlzZXJpYWwwID0gJnNlcmlhbDA7Ci0JCXNlcmlhbDEgPSAmc2VyaWFsMTsKLQkJZXRoZXJuZXQwID0gJmVuZXQwOwotCQlldGhlcm5ldDEgPSAmZW5ldDE7Ci0JCWV0aGVybmV0MiA9ICZlbmV0MjsKLQkJcGNpMCA9ICZwY2kwOwotCQlwY2kxID0gJnBjaTE7Ci0JfTsKLQogCW1lbW9yeSB7CiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJfTsKIAotCWxvY2FsYnVzQGZmZTA1MDAwIHsKKwlib2FyZF9sYmM6IGxiYzogbG9jYWxidXNAZmZlMDUwMDAgeworCQlyZWcgPSA8MCAweGZmZTA1MDAwIDAgMHgxMDAwPjsKIAogCQkvKiBOT1IsIE5BTkQgRmxhc2hlcyBhbmQgVml0ZXNzZSA1IHBvcnQgTDIgc3dpdGNoICovCiAJCXJhbmdlcyA9IDwweDAgMHgwIDB4MCAweGVmMDAwMDAwIDB4MDEwMDAwMDAKIAkJCSAgMHgxIDB4MCAweDAgMHhmZmEwMDAwMCAweDAwMDQwMDAwCiAJCQkgIDB4MiAweDAgMHgwIDB4ZmZiMDAwMDAgMHgwMDAyMDAwMD47Ci0KLQkJbm9yQDAsMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOwotCQkJcmVnID0gPDB4MCAweDAgMHgxMDAwMDAwPjsKLQkJCWJhbmstd2lkdGggPSA8Mj47Ci0JCQlkZXZpY2Utd2lkdGggPSA8MT47Ci0KLQkJCXBhcnRpdGlvbkAwIHsKLQkJCQkvKiBUaGlzIGxvY2F0aW9uIG11c3Qgbm90IGJlIGFsdGVyZWQgICovCi0JCQkJLyogMjU2S0IgZm9yIFZpdGVzc2UgNzM4NSBTd2l0Y2ggZmlybXdhcmUgKi8KLQkJCQlyZWcgPSA8MHgwIDB4MDAwNDAwMDA+OwotCQkJCWxhYmVsID0gIk5PUiAoUk8pIFZpdGVzc2UtNzM4NSBGaXJtd2FyZSI7Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQotCQkJcGFydGl0aW9uQDQwMDAwIHsKLQkJCQkvKiAyNTZLQiBmb3IgRFRCIEltYWdlICovCi0JCQkJcmVnID0gPDB4MDAwNDAwMDAgMHgwMDA0MDAwMD47Ci0JCQkJbGFiZWwgPSAiTk9SIChSTykgRFRCIEltYWdlIjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlwYXJ0aXRpb25AODAwMDAgewotCQkJCS8qIDMuNSBNQiBmb3IgTGludXggS2VybmVsIEltYWdlICovCi0JCQkJcmVnID0gPDB4MDAwODAwMDAgMHgwMDM4MDAwMD47Ci0JCQkJbGFiZWwgPSAiTk9SIChSTykgTGludXggS2VybmVsIEltYWdlIjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlwYXJ0aXRpb25ANDAwMDAwIHsKLQkJCQkvKiAxMU1CIGZvciBKRkZTMiBiYXNlZCBSb290IGZpbGUgU3lzdGVtICovCi0JCQkJcmVnID0gPDB4MDA0MDAwMDAgMHgwMGIwMDAwMD47Ci0JCQkJbGFiZWwgPSAiTk9SIChSVykgSkZGUzIgUm9vdCBGaWxlIFN5c3RlbSI7Ci0JCQl9OwotCi0JCQlwYXJ0aXRpb25AZjAwMDAwIHsKLQkJCQkvKiBUaGlzIGxvY2F0aW9uIG11c3Qgbm90IGJlIGFsdGVyZWQgICovCi0JCQkJLyogNTEyS0IgZm9yIHUtYm9vdCBCb290bG9hZGVyIEltYWdlICovCi0JCQkJLyogNTEyS0IgZm9yIHUtYm9vdCBFbnZpcm9ubWVudCBWYXJpYWJsZXMgKi8KLQkJCQlyZWcgPSA8MHgwMGYwMDAwMCAweDAwMTAwMDAwPjsKLQkJCQlsYWJlbCA9ICJOT1IgKFJPKSBVLUJvb3QgSW1hZ2UiOwotCQkJCXJlYWQtb25seTsKLQkJCX07Ci0JCX07Ci0KLQkJbmFuZEAxLDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLWZjbS1uYW5kIiwKLQkJCQkgICAgICJmc2wsZWxiYy1mY20tbmFuZCI7Ci0JCQlyZWcgPSA8MHgxIDB4MCAweDQwMDAwPjsKLQotCQkJcGFydGl0aW9uQDAgewotCQkJCS8qIFRoaXMgbG9jYXRpb24gbXVzdCBub3QgYmUgYWx0ZXJlZCAgKi8KLQkJCQkvKiAxTUIgZm9yIHUtYm9vdCBCb290bG9hZGVyIEltYWdlICovCi0JCQkJcmVnID0gPDB4MCAweDAwMTAwMDAwPjsKLQkJCQlsYWJlbCA9ICJOQU5EIChSTykgVS1Cb290IEltYWdlIjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlwYXJ0aXRpb25AMTAwMDAwIHsKLQkJCQkvKiAxTUIgZm9yIERUQiBJbWFnZSAqLwotCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDAxMDAwMDA+OwotCQkJCWxhYmVsID0gIk5BTkQgKFJPKSBEVEIgSW1hZ2UiOwotCQkJCXJlYWQtb25seTsKLQkJCX07Ci0KLQkJCXBhcnRpdGlvbkAyMDAwMDAgewotCQkJCS8qIDRNQiBmb3IgTGludXggS2VybmVsIEltYWdlICovCi0JCQkJcmVnID0gPDB4MDAyMDAwMDAgMHgwMDQwMDAwMD47Ci0JCQkJbGFiZWwgPSAiTkFORCAoUk8pIExpbnV4IEtlcm5lbCBJbWFnZSI7Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQotCQkJcGFydGl0aW9uQDYwMDAwMCB7Ci0JCQkJLyogNE1CIGZvciBDb21wcmVzc2VkIFJvb3QgZmlsZSBTeXN0ZW0gSW1hZ2UgKi8KLQkJCQlyZWcgPSA8MHgwMDYwMDAwMCAweDAwNDAwMDAwPjsKLQkJCQlsYWJlbCA9ICJOQU5EIChSTykgQ29tcHJlc3NlZCBSRlMgSW1hZ2UiOwotCQkJCXJlYWQtb25seTsKLQkJCX07Ci0KLQkJCXBhcnRpdGlvbkBhMDAwMDAgewotCQkJCS8qIDdNQiBmb3IgSkZGUzIgYmFzZWQgUm9vdCBmaWxlIFN5c3RlbSAqLwotCQkJCXJlZyA9IDwweDAwYTAwMDAwIDB4MDA3MDAwMDA+OwotCQkJCWxhYmVsID0gIk5BTkQgKFJXKSBKRkZTMiBSb290IEZpbGUgU3lzdGVtIjsKLQkJCX07Ci0KLQkJCXBhcnRpdGlvbkAxMTAwMDAwIHsKLQkJCQkvKiAxNU1CIGZvciBKRkZTMiBiYXNlZCBSb290IGZpbGUgU3lzdGVtICovCi0JCQkJcmVnID0gPDB4MDExMDAwMDAgMHgwMGYwMDAwMD47Ci0JCQkJbGFiZWwgPSAiTkFORCAoUlcpIFdyaXRhYmxlIFVzZXIgYXJlYSI7Ci0JCQl9OwotCQl9OwotCi0JCUwyc3dpdGNoQDIsMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJ2aXRlc3NlLTczODUiOwotCQkJcmVnID0gPDB4MiAweDAgMHgyMDAwMD47Ci0JCX07Ci0KIAl9OwogCi0Jc29jQGZmZTAwMDAwIHsKLQkJaTJjQDMwMDAgewotCQkJcnRjQDY4IHsKLQkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzMzkiOwotCQkJCXJlZyA9IDwweDY4PjsKLQkJCX07Ci0JCX07Ci0KLQkJc3BpQDcwMDAgewotCi0JCQlmc2xfbTI1cDgwQDAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVzcGktZmxhc2giOwotCQkJCXJlZyA9IDwwPjsKLQkJCQlsaW51eCxtb2RhbGlhcyA9ICJmc2xfbTI1cDgwIjsKLQkJCQltb2RhbCA9ICJzMjVzbDEyOGIiOwotCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDUwMDAwMDAwPjsKLQkJCQltb2RlID0gPDA+OwotCi0JCQkJcGFydGl0aW9uQDAgewotCQkJCQkvKiA1MTJLQiBmb3IgdS1ib290IEJvb3Rsb2FkZXIgSW1hZ2UgKi8KLQkJCQkJcmVnID0gPDB4MCAweDAwMDgwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIChSTykgVS1Cb290IEltYWdlIjsKLQkJCQkJcmVhZC1vbmx5OwotCQkJCX07Ci0KLQkJCQlwYXJ0aXRpb25AODAwMDAgewotCQkJCQkvKiA1MTJLQiBmb3IgRFRCIEltYWdlICovCi0JCQkJCXJlZyA9IDwweDAwMDgwMDAwIDB4MDAwODAwMDA+OwotCQkJCQlsYWJlbCA9ICJTUEkgKFJPKSBEVEIgSW1hZ2UiOwotCQkJCQlyZWFkLW9ubHk7Ci0JCQkJfTsKLQotCQkJCXBhcnRpdGlvbkAxMDAwMDAgewotCQkJCQkvKiA0TUIgZm9yIExpbnV4IEtlcm5lbCBJbWFnZSAqLwotCQkJCQlyZWcgPSA8MHgwMDEwMDAwMCAweDAwNDAwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIChSTykgTGludXggS2VybmVsIEltYWdlIjsKLQkJCQkJcmVhZC1vbmx5OwotCQkJCX07Ci0KLQkJCQlwYXJ0aXRpb25ANTAwMDAwIHsKLQkJCQkJLyogNE1CIGZvciBDb21wcmVzc2VkIFJGUyBJbWFnZSAqLwotCQkJCQlyZWcgPSA8MHgwMDUwMDAwMCAweDAwNDAwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIChSTykgQ29tcHJlc3NlZCBSRlMgSW1hZ2UiOwotCQkJCQlyZWFkLW9ubHk7Ci0JCQkJfTsKLQotCQkJCXBhcnRpdGlvbkA5MDAwMDAgewotCQkJCQkvKiA3TUIgZm9yIEpGRlMyIGJhc2VkIFJGUyAqLwotCQkJCQlyZWcgPSA8MHgwMDkwMDAwMCAweDAwNzAwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIChSVykgSkZGUzIgUkZTIjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQltZGlvQDI0MDAwIHsKLQotCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MyAxPjsKLQkJCQlyZWcgPSA8MHgwPjsKLQkJCX07Ci0KLQkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIgMT47Ci0JCQkJcmVnID0gPDB4MT47Ci0JCQl9OwotCQl9OwotCi0JCW1kaW9AMjUwMDAgewotCi0JCQl0YmkwOiB0YmktcGh5QDExIHsKLQkJCQlyZWcgPSA8MHgxMT47Ci0JCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQl9OwotCQl9OwotCi0JCWVuZXQwOiBldGhlcm5ldEBiMDAwMCB7Ci0JCQlmaXhlZC1saW5rID0gPDEgMSAxMDAwIDAgMD47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQotCQl9OwotCi0JCWVuZXQxOiBldGhlcm5ldEBiMTAwMCB7Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKLQkJCXRiaS1oYW5kbGUgPSA8JnRiaTA+OwotCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJzZ21paSI7Ci0KLQkJfTsKLQotCQllbmV0MjogZXRoZXJuZXRAYjIwMDAgewotCQkJcGh5LWhhbmRsZSA9IDwmcGh5MT47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQotCQl9OwotCi0JCXVzYkAyMjAwMCB7Ci0JCQlwaHlfdHlwZSA9ICJ1bHBpIjsKLQkJfTsKLQotCQkvKiBVU0IyIGlzIHNoYXJlZCB3aXRoIGxvY2FsYnVzLCBzbyBpdCBtdXN0IGJlIGRpc2FibGVkCi0JCSAgIGJ5IGRlZmF1bHQuIFdlIGNhbid0IHB1dCAnc3RhdHVzID0gImRpc2FibGVkIjsnIGhlcmUKLQkJICAgc2luY2UgVS1Cb290IGRvZXNuJ3QgY2xlYXIgdGhlIHN0YXR1cyBwcm9wZXJ0eSB3aGVuCi0JCSAgIGl0IGVuYWJsZXMgVVNCMi4gT1RPSCwgVS1Cb290IGRvZXMgY3JlYXRlIGEgbmV3IG5vZGUKLQkJICAgd2hlbiB0aGVyZSBpc24ndCBhbnkuIFNvLCBqdXN0IGNvbW1lbnQgaXQgb3V0LgotCQl1c2JAMjMwMDAgewotCQkJcGh5X3R5cGUgPSAidWxwaSI7Ci0JCX07Ci0JCSovCi0KKwlib2FyZF9zb2M6IHNvYzogc29jQGZmZTAwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MCAweDAgMHhmZmUwMDAwMCAweDEwMDAwMD47CiAJfTsKIAogCXBjaTA6IHBjaWVAZmZlMDkwMDAgewogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzEwMDAwIDB4MCAweDEwMDAwPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHg0IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDUgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4NiAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHg3IDB4MQotCQkJPjsKKwkJcmVnID0gPDAgMHhmZmUwOTAwMCAwIDB4MTAwMD47CiAJCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAKIAkJCQkgIDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAogCQkJCSAgMHgwIDB4MjAwMDAwMDAKQEAgLTI4MSwyMSArNDcsMTAgQEAKIAl9OwogCiAJcGNpMTogcGNpZUBmZmUwYTAwMCB7CisJCXJlZyA9IDwwIDB4ZmZlMGEwMDAgMCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDAgMHg4MDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzAwMDAwIDB4MCAweDEwMDAwPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQotCQkJPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtMzA2LDMgKzYxLDYgQEAKIAkJfTsKIAl9OwogfTsKKworL2luY2x1ZGUvICJwMTAyMHJkYi5kdHNpIgorL2luY2x1ZGUvICJmc2wvcDEwMjBzaS1wb3N0LmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjByZGIuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMHJkYi5kdHNpCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YmQ4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjByZGIuZHRzaQpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIFAxMDIwIFJEQiBEZXZpY2UgVHJlZSBTb3VyY2Ugc3R1YiAobm8gYWRkcmVzc2VzIG9yIHRvcC1sZXZlbCByYW5nZXMpCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKKyAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKgorICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyZib2FyZF9sYmMgeworCW5vckAwLDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKKwkJcmVnID0gPDB4MCAweDAgMHgxMDAwMDAwPjsKKwkJYmFuay13aWR0aCA9IDwyPjsKKwkJZGV2aWNlLXdpZHRoID0gPDE+OworCisJCXBhcnRpdGlvbkAwIHsKKwkJCS8qIFRoaXMgbG9jYXRpb24gbXVzdCBub3QgYmUgYWx0ZXJlZCAgKi8KKwkJCS8qIDI1NktCIGZvciBWaXRlc3NlIDczODUgU3dpdGNoIGZpcm13YXJlICovCisJCQlyZWcgPSA8MHgwIDB4MDAwNDAwMDA+OworCQkJbGFiZWwgPSAiTk9SIChSTykgVml0ZXNzZS03Mzg1IEZpcm13YXJlIjsKKwkJCXJlYWQtb25seTsKKwkJfTsKKworCQlwYXJ0aXRpb25ANDAwMDAgeworCQkJLyogMjU2S0IgZm9yIERUQiBJbWFnZSAqLworCQkJcmVnID0gPDB4MDAwNDAwMDAgMHgwMDA0MDAwMD47CisJCQlsYWJlbCA9ICJOT1IgKFJPKSBEVEIgSW1hZ2UiOworCQkJcmVhZC1vbmx5OworCQl9OworCisJCXBhcnRpdGlvbkA4MDAwMCB7CisJCQkvKiAzLjUgTUIgZm9yIExpbnV4IEtlcm5lbCBJbWFnZSAqLworCQkJcmVnID0gPDB4MDAwODAwMDAgMHgwMDM4MDAwMD47CisJCQlsYWJlbCA9ICJOT1IgKFJPKSBMaW51eCBLZXJuZWwgSW1hZ2UiOworCQkJcmVhZC1vbmx5OworCQl9OworCisJCXBhcnRpdGlvbkA0MDAwMDAgeworCQkJLyogMTFNQiBmb3IgSkZGUzIgYmFzZWQgUm9vdCBmaWxlIFN5c3RlbSAqLworCQkJcmVnID0gPDB4MDA0MDAwMDAgMHgwMGIwMDAwMD47CisJCQlsYWJlbCA9ICJOT1IgKFJXKSBKRkZTMiBSb290IEZpbGUgU3lzdGVtIjsKKwkJfTsKKworCQlwYXJ0aXRpb25AZjAwMDAwIHsKKwkJCS8qIFRoaXMgbG9jYXRpb24gbXVzdCBub3QgYmUgYWx0ZXJlZCAgKi8KKwkJCS8qIDUxMktCIGZvciB1LWJvb3QgQm9vdGxvYWRlciBJbWFnZSAqLworCQkJLyogNTEyS0IgZm9yIHUtYm9vdCBFbnZpcm9ubWVudCBWYXJpYWJsZXMgKi8KKwkJCXJlZyA9IDwweDAwZjAwMDAwIDB4MDAxMDAwMDA+OworCQkJbGFiZWwgPSAiTk9SIChSTykgVS1Cb290IEltYWdlIjsKKwkJCXJlYWQtb25seTsKKwkJfTsKKwl9OworCisJbmFuZEAxLDAgeworCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKKwkJI3NpemUtY2VsbHMgPSA8MT47CisJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLWZjbS1uYW5kIiwKKwkJCSAgICAgImZzbCxlbGJjLWZjbS1uYW5kIjsKKwkJcmVnID0gPDB4MSAweDAgMHg0MDAwMD47CisKKwkJcGFydGl0aW9uQDAgeworCQkJLyogVGhpcyBsb2NhdGlvbiBtdXN0IG5vdCBiZSBhbHRlcmVkICAqLworCQkJLyogMU1CIGZvciB1LWJvb3QgQm9vdGxvYWRlciBJbWFnZSAqLworCQkJcmVnID0gPDB4MCAweDAwMTAwMDAwPjsKKwkJCWxhYmVsID0gIk5BTkQgKFJPKSBVLUJvb3QgSW1hZ2UiOworCQkJcmVhZC1vbmx5OworCQl9OworCisJCXBhcnRpdGlvbkAxMDAwMDAgeworCQkJLyogMU1CIGZvciBEVEIgSW1hZ2UgKi8KKwkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDAxMDAwMDA+OworCQkJbGFiZWwgPSAiTkFORCAoUk8pIERUQiBJbWFnZSI7CisJCQlyZWFkLW9ubHk7CisJCX07CisKKwkJcGFydGl0aW9uQDIwMDAwMCB7CisJCQkvKiA0TUIgZm9yIExpbnV4IEtlcm5lbCBJbWFnZSAqLworCQkJcmVnID0gPDB4MDAyMDAwMDAgMHgwMDQwMDAwMD47CisJCQlsYWJlbCA9ICJOQU5EIChSTykgTGludXggS2VybmVsIEltYWdlIjsKKwkJCXJlYWQtb25seTsKKwkJfTsKKworCQlwYXJ0aXRpb25ANjAwMDAwIHsKKwkJCS8qIDRNQiBmb3IgQ29tcHJlc3NlZCBSb290IGZpbGUgU3lzdGVtIEltYWdlICovCisJCQlyZWcgPSA8MHgwMDYwMDAwMCAweDAwNDAwMDAwPjsKKwkJCWxhYmVsID0gIk5BTkQgKFJPKSBDb21wcmVzc2VkIFJGUyBJbWFnZSI7CisJCQlyZWFkLW9ubHk7CisJCX07CisKKwkJcGFydGl0aW9uQGEwMDAwMCB7CisJCQkvKiA3TUIgZm9yIEpGRlMyIGJhc2VkIFJvb3QgZmlsZSBTeXN0ZW0gKi8KKwkJCXJlZyA9IDwweDAwYTAwMDAwIDB4MDA3MDAwMDA+OworCQkJbGFiZWwgPSAiTkFORCAoUlcpIEpGRlMyIFJvb3QgRmlsZSBTeXN0ZW0iOworCQl9OworCisJCXBhcnRpdGlvbkAxMTAwMDAwIHsKKwkJCS8qIDE1TUIgZm9yIEpGRlMyIGJhc2VkIFJvb3QgZmlsZSBTeXN0ZW0gKi8KKwkJCXJlZyA9IDwweDAxMTAwMDAwIDB4MDBmMDAwMDA+OworCQkJbGFiZWwgPSAiTkFORCAoUlcpIFdyaXRhYmxlIFVzZXIgYXJlYSI7CisJCX07CisJfTsKKworCUwyc3dpdGNoQDIsMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJ2aXRlc3NlLTczODUiOworCQlyZWcgPSA8MHgyIDB4MCAweDIwMDAwPjsKKwl9OworfTsKKworJmJvYXJkX3NvYyB7CisJaTJjQDMwMDAgeworCQlydGNANjggeworCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzM5IjsKKwkJCXJlZyA9IDwweDY4PjsKKwkJfTsKKwl9OworCisJc3BpQDcwMDAgeworCQlmbGFzaEAwIHsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkJI3NpemUtY2VsbHMgPSA8MT47CisJCQljb21wYXRpYmxlID0gInNwYW5zaW9uLHMyNXNsMTI4MDEiOworCQkJcmVnID0gPDA+OworCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLworCisJCQlwYXJ0aXRpb25AdS1ib290IHsKKwkJCQkvKiA1MTJLQiBmb3IgdS1ib290IEJvb3Rsb2FkZXIgSW1hZ2UgKi8KKwkJCQlyZWcgPSA8MHgwIDB4MDAwODAwMDA+OworCQkJCWxhYmVsID0gInUtYm9vdCI7CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKworCQkJcGFydGl0aW9uQGR0YiB7CisJCQkJLyogNTEyS0IgZm9yIERUQiBJbWFnZSAqLworCQkJCXJlZyA9IDwweDAwMDgwMDAwIDB4MDAwODAwMDA+OworCQkJCWxhYmVsID0gImR0YiI7CisJCQkJcmVhZC1vbmx5OworCQkJfTsKKworCQkJcGFydGl0aW9uQGtlcm5lbCB7CisJCQkJLyogNE1CIGZvciBMaW51eCBLZXJuZWwgSW1hZ2UgKi8KKwkJCQlyZWcgPSA8MHgwMDEwMDAwMCAweDAwNDAwMDAwPjsKKwkJCQlsYWJlbCA9ICJrZXJuZWwiOworCQkJCXJlYWQtb25seTsKKwkJCX07CisKKwkJCXBhcnRpdGlvbkBmcyB7CisJCQkJLyogNE1CIGZvciBDb21wcmVzc2VkIFJGUyBJbWFnZSAqLworCQkJCXJlZyA9IDwweDAwNTAwMDAwIDB4MDA0MDAwMDA+OworCQkJCWxhYmVsID0gImZpbGUgc3lzdGVtIjsKKwkJCQlyZWFkLW9ubHk7CisJCQl9OworCisJCQlwYXJ0aXRpb25AamZmcy1mcyB7CisJCQkJLyogN01CIGZvciBKRkZTMiBiYXNlZCBSRlMgKi8KKwkJCQlyZWcgPSA8MHgwMDkwMDAwMCAweDAwNzAwMDAwPjsKKwkJCQlsYWJlbCA9ICJmaWxlIHN5c3RlbSBqZmZzMiI7CisJCQl9OworCQl9OworCX07CisKKwl1c2JAMjIwMDAgeworCQlwaHlfdHlwZSA9ICJ1bHBpIjsKKwl9OworCisJLyogVVNCMiBpcyBzaGFyZWQgd2l0aCBsb2NhbGJ1cywgc28gaXQgbXVzdCBiZSBkaXNhYmxlZAorCSAgIGJ5IGRlZmF1bHQuIFdlIGNhbid0IHB1dCAnc3RhdHVzID0gImRpc2FibGVkIjsnIGhlcmUKKwkgICBzaW5jZSBVLUJvb3QgZG9lc24ndCBjbGVhciB0aGUgc3RhdHVzIHByb3BlcnR5IHdoZW4KKwkgICBpdCBlbmFibGVzIFVTQjIuIE9UT0gsIFUtQm9vdCBkb2VzIGNyZWF0ZSBhIG5ldyBub2RlCisJICAgd2hlbiB0aGVyZSBpc24ndCBhbnkuIFNvLCBqdXN0IGNvbW1lbnQgaXQgb3V0LgorCXVzYkAyMzAwMCB7CisJCXBoeV90eXBlID0gInVscGkiOworCX07CisJKi8KKworCW1kaW9AMjQwMDAgeworCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CisJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWludGVycnVwdHMgPSA8MyAxPjsKKwkJCXJlZyA9IDwweDA+OworCQl9OworCisJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJaW50ZXJydXB0cyA9IDwyIDE+OworCQkJcmVnID0gPDB4MT47CisJCX07CisKKwkJdGJpLXBoeUAyIHsKKwkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQkJcmVnID0gPDB4Mj47CisJCX07CisJfTsKKworCW1kaW9AMjUwMDAgeworCQl0YmkwOiB0YmktcGh5QDExIHsKKwkJCXJlZyA9IDwweDExPjsKKwkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQl9OworCX07CisKKwllbmV0MDogZXRoZXJuZXRAYjAwMDAgeworCQlmaXhlZC1saW5rID0gPDEgMSAxMDAwIDAgMD47CisJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOworCisJfTsKKworCWVuZXQxOiBldGhlcm5ldEBiMTAwMCB7CisJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OworCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKKwkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJzZ21paSI7CisJfTsKKworCWVuZXQyOiBldGhlcm5ldEBiMjAwMCB7CisJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OworCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKKwl9OworfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMHJkYl8zNmIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIwcmRiXzM2Yi5kdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRiZGI2MAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMHJkYl8zNmIuZHRzCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBQMTAyMCBSREIgRGV2aWNlIFRyZWUgU291cmNlICgzNi1iaXQgYWRkcmVzcyBtYXApCisgKgorICogQ29weXJpZ2h0IDIwMDktMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisvaW5jbHVkZS8gImZzbC9wMTAyMHNpLXByZS5kdHNpIgorLyB7CisJbW9kZWwgPSAiZnNsLFAxMDIwUkRCIjsKKwljb21wYXRpYmxlID0gImZzbCxQMTAyMFJEQiI7CisKKwltZW1vcnkgeworCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOworCX07CisKKwlib2FyZF9sYmM6IGxiYzogbG9jYWxidXNAZmZmZTA1MDAwIHsKKwkJcmVnID0gPDB4ZiAweGZmZTA1MDAwIDAgMHgxMDAwPjsKKworCQkvKiBOT1IsIE5BTkQgRmxhc2hlcyBhbmQgVml0ZXNzZSA1IHBvcnQgTDIgc3dpdGNoICovCisJCXJhbmdlcyA9IDwweDAgMHgwIDB4ZiAweGVmMDAwMDAwIDB4MDEwMDAwMDAKKwkJCSAgMHgxIDB4MCAweGYgMHhmZmEwMDAwMCAweDAwMDQwMDAwCisJCQkgIDB4MiAweDAgMHhmIDB4ZmZiMDAwMDAgMHgwMDAyMDAwMD47CisJfTsKKworCWJvYXJkX3NvYzogc29jOiBzb2NAZmZmZTAwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MCAweGYgMHhmZmUwMDAwMCAweDEwMDAwMD47CisJfTsKKworCXBjaTA6IHBjaWVAZmZmZTA5MDAwIHsKKwkJcmVnID0gPDB4ZiAweGZmZTA5MDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhjMDAwMDAwMCAweGMgMHgyMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmIDB4ZmZjMTAwMDAgMHgwIDB4MTAwMDA+OworCQlwY2llQDAgeworCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhjMDAwMDAwMAorCQkJCSAgMHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwCisJCQkJICAweDAgMHgyMDAwMDAwMAorCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKKwkJCQkgIDB4MCAweDEwMDAwMD47CisJCX07CisJfTsKKworCXBjaTE6IHBjaWVAZmZmZTBhMDAwIHsKKwkJcmVnID0gPDB4ZiAweGZmZTBhMDAwIDAgMHgxMDAwPjsKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMCAweGMgMHgwMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmIDB4ZmZjMDAwMDAgMHgwIDB4MTAwMDA+OworCQlwY2llQDAgeworCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMAorCQkJCSAgMHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCisJCQkJICAweDAgMHgyMDAwMDAwMAorCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKKwkJCQkgIDB4MCAweDEwMDAwMD47CisJCX07CisJfTsKK307CisKKy9pbmNsdWRlLyAicDEwMjByZGIuZHRzaSIKKy9pbmNsdWRlLyAiZnNsL3AxMDIwc2ktcG9zdC5kdHNpIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIwcmRiX2NhbXBfY29yZTAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIwcmRiX2NhbXBfY29yZTAuZHRzCmluZGV4IGYwYmY3ZjQuLjQxYjQ1ODUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMHJkYl9jYW1wX2NvcmUwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjByZGJfY2FtcF9jb3JlMC5kdHMKQEAgLTE2LDcgKzE2LDcgQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2luY2x1ZGUvICJwMTAyMHNpLmR0c2kiCisvaW5jbHVkZS8gInAxMDIwcmRiLmR0cyIKIAogLyB7CiAJbW9kZWwgPSAiZnNsLFAxMDIwUkRCIjsKQEAgLTMyLDcgKzMyLDcgQEAKIAogCWNwdXMgewogCQlQb3dlclBDLFAxMDIwQDEgewotCQlzdGF0dXMgPSAiZGlzYWJsZWQiOworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAl9OwogCkBAIC00NSwxNjkgKzQ1LDE5IEBACiAJfTsKIAogCXNvY0BmZmUwMDAwMCB7Ci0JCWkyY0AzMDAwIHsKLQkJCXJ0Y0A2OCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJkYWxsYXMsZHMxMzM5IjsKLQkJCQlyZWcgPSA8MHg2OD47Ci0JCQl9OwotCQl9OwotCiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJc3BpQDcwMDAgewotCQkJZnNsX20yNXA4MEAwIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlc3BpLWZsYXNoIjsKLQkJCQlyZWcgPSA8MD47Ci0JCQkJbGludXgsbW9kYWxpYXMgPSAiZnNsX20yNXA4MCI7Ci0JCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OwotCi0JCQkJcGFydGl0aW9uQDAgewotCQkJCQkvKiA1MTJLQiBmb3IgdS1ib290IEJvb3Rsb2FkZXIgSW1hZ2UgKi8KLQkJCQkJcmVnID0gPDB4MCAweDAwMDgwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIChSTykgVS1Cb290IEltYWdlIjsKLQkJCQkJcmVhZC1vbmx5OwotCQkJCX07Ci0KLQkJCQlwYXJ0aXRpb25AODAwMDAgewotCQkJCQkvKiA1MTJLQiBmb3IgRFRCIEltYWdlICovCi0JCQkJCXJlZyA9IDwweDAwMDgwMDAwIDB4MDAwODAwMDA+OwotCQkJCQlsYWJlbCA9ICJTUEkgKFJPKSBEVEIgSW1hZ2UiOwotCQkJCQlyZWFkLW9ubHk7Ci0JCQkJfTsKLQotCQkJCXBhcnRpdGlvbkAxMDAwMDAgewotCQkJCQkvKiA0TUIgZm9yIExpbnV4IEtlcm5lbCBJbWFnZSAqLwotCQkJCQlyZWcgPSA8MHgwMDEwMDAwMCAweDAwNDAwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIChSTykgTGludXggS2VybmVsIEltYWdlIjsKLQkJCQkJcmVhZC1vbmx5OwotCQkJCX07Ci0KLQkJCQlwYXJ0aXRpb25ANTAwMDAwIHsKLQkJCQkJLyogNE1CIGZvciBDb21wcmVzc2VkIFJGUyBJbWFnZSAqLwotCQkJCQlyZWcgPSA8MHgwMDUwMDAwMCAweDAwNDAwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIChSTykgQ29tcHJlc3NlZCBSRlMgSW1hZ2UiOwotCQkJCQlyZWFkLW9ubHk7Ci0JCQkJfTsKLQotCQkJCXBhcnRpdGlvbkA5MDAwMDAgewotCQkJCQkvKiA3TUIgZm9yIEpGRlMyIGJhc2VkIFJGUyAqLwotCQkJCQlyZWcgPSA8MHgwMDkwMDAwMCAweDAwNzAwMDAwPjsKLQkJCQkJbGFiZWwgPSAiU1BJIChSVykgSkZGUzIgUkZTIjsKLQkJCQl9OwotCQkJfTsKLQkJfTsKLQotCQltZGlvQDI0MDAwIHsKLQkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMgMT47Ci0JCQkJcmVnID0gPDB4MD47Ci0JCQl9OwotCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MiAxPjsKLQkJCQlyZWcgPSA8MHgxPjsKLQkJCX07Ci0JCX07Ci0KLQkJbWRpb0AyNTAwMCB7Ci0JCQl0YmkwOiB0YmktcGh5QDExIHsKLQkJCQlyZWcgPSA8MHgxMT47Ci0JCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQl9OwotCQl9OwotCiAJCWVuZXQwOiBldGhlcm5ldEBiMDAwMCB7CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCWVuZXQxOiBldGhlcm5ldEBiMTAwMCB7Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKLQkJCXRiaS1oYW5kbGUgPSA8JnRiaTA+OwotCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJzZ21paSI7Ci0JCX07Ci0KLQkJZW5ldDI6IGV0aGVybmV0QGIyMDAwIHsKLQkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwotCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7Ci0JCX07Ci0KLQkJdXNiQDIyMDAwIHsKLQkJCXBoeV90eXBlID0gInVscGkiOwotCQl9OwotCi0JCS8qIFVTQjIgaXMgc2hhcmVkIHdpdGggbG9jYWxidXMsIHNvIGl0IG11c3QgYmUgZGlzYWJsZWQKLQkJICAgYnkgZGVmYXVsdC4gV2UgY2FuJ3QgcHV0ICdzdGF0dXMgPSAiZGlzYWJsZWQiOycgaGVyZQotCQkgICBzaW5jZSBVLUJvb3QgZG9lc24ndCBjbGVhciB0aGUgc3RhdHVzIHByb3BlcnR5IHdoZW4KLQkJICAgaXQgZW5hYmxlcyBVU0IyLiBPVE9ILCBVLUJvb3QgZG9lcyBjcmVhdGUgYSBuZXcgbm9kZQotCQkgICB3aGVuIHRoZXJlIGlzbid0IGFueS4gU28sIGp1c3QgY29tbWVudCBpdCBvdXQuCi0JCXVzYkAyMzAwMCB7Ci0JCQlwaHlfdHlwZSA9ICJ1bHBpIjsKLQkJfTsKLQkJKi8KLQogCQltcGljOiBwaWNANDAwMDAgewogCQkJcHJvdGVjdGVkLXNvdXJjZXMgPSA8CiAJCQk0MiAyOSAzMCAzNAkvKiBzZXJpYWwxLCBlbmV0MC1xdWV1ZS1ncm91cDAgKi8KIAkJCTE3IDE4IDI0IDQ1CS8qIGVuZXQwLXF1ZXVlLWdyb3VwMSwgY3J5cHRvICovCiAJCQk+OwogCQl9OwotCi0JfTsKLQotCXBjaTA6IHBjaWVAZmZlMDkwMDAgewotCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAotCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzEwMDAwIDB4MCAweDEwMDAwPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHg0IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDUgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4NiAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHg3IDB4MQotCQkJPjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAotCQkJCSAgMHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCi0JCQkJICAweDAgMHgyMDAwMDAwMAotCi0JCQkJICAweDEwMDAwMDAgMHgwIDB4MAotCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKLQkJCQkgIDB4MCAweDEwMDAwMD47Ci0JCX07Ci0JfTsKLQotCXBjaTE6IHBjaWVAZmZlMGEwMDAgewotCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDAgMHg4MDAwMDAwMCAweDAgMHgyMDAwMDAwMAotCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzAwMDAwIDB4MCAweDEwMDAwPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQotCQkJPjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMAotCQkJCSAgMHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCi0JCQkJICAweDAgMHgyMDAwMDAwMAotCi0JCQkJICAweDEwMDAwMDAgMHgwIDB4MAotCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKLQkJCQkgIDB4MCAweDEwMDAwMD47Ci0JCX07CiAJfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjByZGJfY2FtcF9jb3JlMS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjByZGJfY2FtcF9jb3JlMS5kdHMKaW5kZXggNmVjMDIyMC4uNTE3NDUzOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIwcmRiX2NhbXBfY29yZTEuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMHJkYl9jYW1wX2NvcmUxLmR0cwpAQCAtMTUsNyArMTUsNyBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vaW5jbHVkZS8gInAxMDIwc2kuZHRzaSIKKy9pbmNsdWRlLyAicDEwMjByZGIuZHRzIgogCiAvIHsKIAltb2RlbCA9ICJmc2wsUDEwMjBSREIiOwpAQCAtMjgsNyArMjgsNyBAQAogCiAJY3B1cyB7CiAJCVBvd2VyUEMsUDEwMjBAMCB7Ci0JCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCX07CiAKQEAgLTg1LDEyICs4NSw2IEBACiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCWVuZXQwOiBldGhlcm5ldEBiMDAwMCB7Ci0JCQlmaXhlZC1saW5rID0gPDEgMSAxMDAwIDAgMD47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQotCQl9OwotCiAJCWVuZXQxOiBldGhlcm5ldEBiMTAwMCB7CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwpAQCAtMTM1LDcgKzEyOSw2IEBACiAJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgYmxvY2sKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07Ci0KIAl9OwogCiAJcGNpMDogcGNpZUBmZmUwOTAwMCB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjBzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIwc2kuZHRzaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1YWNiNi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjBzaS5kdHNpCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qCi0gKiBQMTAyMHNpIERldmljZSBUcmVlIFNvdXJjZQotICoKLSAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQotICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCi0gKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgotICovCi0KLS9kdHMtdjEvOwotLyB7Ci0JY29tcGF0aWJsZSA9ICJmc2wsUDEwMjAiOwotCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCSNzaXplLWNlbGxzID0gPDI+OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQlQb3dlclBDLFAxMDIwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwweDA+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwotCQl9OwotCi0JCVBvd2VyUEMsUDEwMjBAMSB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDB4MT47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47Ci0JCX07Ci0JfTsKLQotCWxvY2FsYnVzQGZmZTA1MDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxwMTAyMC1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOwotCQlyZWcgPSA8MCAweGZmZTA1MDAwIDAgMHgxMDAwPjsKLQkJaW50ZXJydXB0cyA9IDwxOSAyPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JfTsKLQotCXNvY0BmZmUwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjAtaW1tciIsICJzaW1wbGUtYnVzIjsKLQkJcmFuZ2VzID0gPDB4MCAgMHgwIDB4ZmZlMDAwMDAgMHgxMDAwMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KLQotCQllY20tbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MTI+OwotCQl9OwotCi0JCWVjbUAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLWVjbSIsICJmc2wsZWNtIjsKLQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLW1lbW9yeS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJfTsKLQotCQlpMmNAMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWkyY0AzMTAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDMxMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MyAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4NDUwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4NDYwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJc3BpQDcwMDAgewotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxlc3BpIjsKLQkJCXJlZyA9IDwweDcwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NTkgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJbW9kZSA9ICJjcHUiOwotCQl9OwotCi0JCWdwaW86IGdwaW8tY29udHJvbGxlckBmMDAwIHsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU3Mi1ncGlvIjsKLQkJCXJlZyA9IDwweGYwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0NyAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCX07Ci0KLQkJTDI6IGwyLWNhY2hlLWNvbnRyb2xsZXJAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjAtbDItY2FjaGUtY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwMCAweDEwMDA+OwotCQkJY2FjaGUtbGluZS1zaXplID0gPDMyPjsJLy8gMzIgYnl0ZXMKLQkJCWNhY2hlLXNpemUgPSA8MHg0MDAwMD47IC8vIEwyLDI1NksKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJfTsKLQotCQlkbWFAMjEzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hIjsKLQkJCXJlZyA9IDwweDIxMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjExMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIwIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjEgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIyIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMyAyPjsKLQkJCX07Ci0JCX07Ci0KLQkJbWRpb0AyNDAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyLW1kaW8iOwotCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwIDB4YjAwMzAgMHg0PjsKLQotCQl9OwotCi0JCW1kaW9AMjUwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGV0c2VjMi10YmkiOwotCQkJcmVnID0gPDB4MjUwMDAgMHgxMDAwIDB4YjEwMzAgMHg0PjsKLQotCQl9OwotCi0JCWVuZXQwOiBldGhlcm5ldEBiMDAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImZzbCxldHNlYzIiOwotCQkJZnNsLG51bV9yeF9xdWV1ZXMgPSA8MHg4PjsKLQkJCWZzbCxudW1fdHhfcXVldWVzID0gPDB4OD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCi0JCQlxdWV1ZS1ncm91cEAwIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCQlyZWcgPSA8MHhiMDAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8MjkgMiAzMCAyIDM0IDI+OwotCQkJfTsKLQotCQkJcXVldWUtZ3JvdXBAMSB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJcmVnID0gPDB4YjQwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDE3IDIgMTggMiAyNCAyPjsKLQkJCX07Ci0JCX07Ci0KLQkJZW5ldDE6IGV0aGVybmV0QGIxMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGV0c2VjMiI7Ci0JCQlmc2wsbnVtX3J4X3F1ZXVlcyA9IDwweDg+OwotCQkJZnNsLG51bV90eF9xdWV1ZXMgPSA8MHg4PjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0KLQkJCXF1ZXVlLWdyb3VwQDAgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCXJlZyA9IDwweGIxMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAyIDM2IDIgNDAgMj47Ci0JCQl9OwotCi0JCQlxdWV1ZS1ncm91cEAxIHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCQlyZWcgPSA8MHhiNTAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8NTEgMiA1MiAyIDY3IDI+OwotCQkJfTsKLQkJfTsKLQotCQllbmV0MjogZXRoZXJuZXRAYjIwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyIjsKLQkJCWZzbCxudW1fcnhfcXVldWVzID0gPDB4OD47Ci0JCQlmc2wsbnVtX3R4X3F1ZXVlcyA9IDwweDg+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQotCQkJcXVldWUtZ3JvdXBAMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJcmVnID0gPDB4YjIwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMxIDIgMzIgMiAzMyAyPjsKLQkJCX07Ci0KLQkJCXF1ZXVlLWdyb3VwQDEgewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCXJlZyA9IDwweGI2MDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDwyNSAyIDI2IDIgMjcgMj47Ci0JCQl9OwotCQl9OwotCi0JCXVzYkAyMjAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtdXNiMi1kciI7Ci0JCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDI4IDB4Mj47Ci0JCX07Ci0KLQkJLyogVVNCMiBpcyBzaGFyZWQgd2l0aCBsb2NhbGJ1cywgc28gaXQgbXVzdCBiZSBkaXNhYmxlZAotCQkgICBieSBkZWZhdWx0LiBXZSBjYW4ndCBwdXQgJ3N0YXR1cyA9ICJkaXNhYmxlZCI7JyBoZXJlCi0JCSAgIHNpbmNlIFUtQm9vdCBkb2Vzbid0IGNsZWFyIHRoZSBzdGF0dXMgcHJvcGVydHkgd2hlbgotCQkgICBpdCBlbmFibGVzIFVTQjIuIE9UT0gsIFUtQm9vdCBkb2VzIGNyZWF0ZSBhIG5ldyBub2RlCi0JCSAgIHdoZW4gdGhlcmUgaXNuJ3QgYW55LiBTbywganVzdCBjb21tZW50IGl0IG91dC4KLQkJdXNiQDIzMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbC11c2IyLWRyIjsKLQkJCXJlZyA9IDwweDIzMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8NDYgMHgyPjsKLQkJCXBoeV90eXBlID0gInVscGkiOwotCQl9OwotCQkqLwotCi0JCXNkaGNpQDJlMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIwLWVzZGhjIiwgImZzbCxlc2RoYyI7Ci0JCQlyZWcgPSA8MHgyZTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw3MiAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCX07Ci0KLQkJY3J5cHRvQDMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYzMuMSIsICJmc2wsc2VjMy4wIiwgImZzbCxzZWMyLjQiLAotCQkJCSAgICAgImZzbCxzZWMyLjIiLCAiZnNsLHNlYzIuMSIsICJmc2wsc2VjMi4wIjsKLQkJCXJlZyA9IDwweDMwMDAwIDB4MTAwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0NSAyIDU4IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlmc2wsbnVtLWNoYW5uZWxzID0gPDQ+OwotCQkJZnNsLGNoYW5uZWwtZmlmby1sZW4gPSA8MjQ+OwotCQkJZnNsLGV4ZWMtdW5pdHMtbWFzayA9IDwweGJmZT47Ci0JCQlmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrID0gPDB4M2FiMGViZj47Ci0JCX07Ci0KLQkJbXBpYzogcGljQDQwMDAwIHsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQkJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47Ci0JCQljb21wYXRpYmxlID0gImNocnAsb3Blbi1waWMiOwotCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOwotCQl9OwotCi0JCW1zaUA0MTYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMTAyMC1tc2kiLCAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4ODA+OwotCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTB4ZTAgMAotCQkJCTB4ZTEgMAotCQkJCTB4ZTIgMAotCQkJCTB4ZTMgMAotCQkJCTB4ZTQgMAotCQkJCTB4ZTUgMAotCQkJCTB4ZTYgMAotCQkJCTB4ZTcgMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLy9nbG9iYWwgdXRpbGl0aWVzIGJsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxwMTAyMC1ndXRzIiwiZnNsLHAyMDIwLWd1dHMiOwotCQkJcmVnID0gPDB4ZTAwMDAgMHgxMDAwPjsKLQkJCWZzbCxoYXMtcnN0Y3I7Ci0JCX07Ci0JfTsKLQotCXBjaTA6IHBjaWVAZmZlMDkwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwwIDB4ZmZlMDkwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQl9OwotCi0JcGNpMTogcGNpZUBmZmUwYTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDAgMHhmZmUwYTAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwotCX07Ci19OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIxbWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMW1kcy5kdHMKaW5kZXggYWQ1Yjg1Mi4uZDk1NDA3OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIxbWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjFtZHMuZHRzCkBAIC05LDUzICs5LDIyIEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS9kdHMtdjEvOworL2luY2x1ZGUvICJmc2wvcDEwMjFzaS1wcmUuZHRzaSIKIC8gewogCW1vZGVsID0gImZzbCxQMTAyMSI7CiAJY29tcGF0aWJsZSA9ICJmc2wsUDEwMjFNRFMiOwotCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCSNzaXplLWNlbGxzID0gPDI+OwogCiAJYWxpYXNlcyB7Ci0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlldGhlcm5ldDAgPSAmZW5ldDA7Ci0JCWV0aGVybmV0MSA9ICZlbmV0MTsKLQkJZXRoZXJuZXQyID0gJmVuZXQyOwogCQlldGhlcm5ldDMgPSAmZW5ldDM7CiAJCWV0aGVybmV0NCA9ICZlbmV0NDsKLQkJcGNpMCA9ICZwY2kwOwotCQlwY2kxID0gJnBjaTE7Ci0JfTsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyxQMTAyMUAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MHgwPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKLQkJfTsKLQotCQlQb3dlclBDLFAxMDIxQDEgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwweDE+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwotCQl9OwogCX07CiAKIAltZW1vcnkgewogCQlkZXZpY2VfdHlwZSA9ICJtZW1vcnkiOwogCX07CiAKLQlsb2NhbGJ1c0BmZmUwNTAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjEtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKLQkJcmVnID0gPDAgMHhmZmUwNTAwMCAwIDB4MTAwMD47Ci0JCWludGVycnVwdHMgPSA8MTkgMj47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCWxiYzogbG9jYWxidXNAZmZlMDUwMDAgeworCQlyZWcgPSA8MHgwIDB4ZmZlMDUwMDAgMHgwIDB4MTAwMD47CiAKIAkJLyogTkFORCBGbGFzaCwgQkNTUiwgUE1DMC8xKi8KIAkJcmFuZ2VzID0gPDB4MCAweDAgMHgwIDB4ZmMwMDAwMDAgMHgwMjAwMDAwMApAQCAtMTM4LDk5ICsxMDcsMjYgQEAKIAkJfTsKIAl9OwogCi0Jc29jQGZmZTAwMDAwIHsKLQotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWRldmljZV90eXBlID0gInNvYyI7CisJc29jOiBzb2NAZmZlMDAwMDAgewogCQljb21wYXRpYmxlID0gImZzbCxwMTAyMS1pbW1yIiwgInNpbXBsZS1idXMiOwotCQlyYW5nZXMgPSA8MHgwICAweDAgMHhmZmUwMDAwMCAweDEwMDAwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgotCi0JCWVjbS1sYXdAMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxlY20tbGF3IjsKLQkJCXJlZyA9IDwweDAgMHgxMDAwPjsKLQkJCWZzbCxudW0tbGF3cyA9IDwxMj47Ci0JCX07Ci0KLQkJZWNtQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjEtZWNtIiwgImZzbCxlY20iOwotCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCW1lbW9yeS1jb250cm9sbGVyQDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjEtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwotCQl9OworCQlyYW5nZXMgPSA8MHgwIDB4MCAweGZmZTAwMDAwIDB4MTAwMDAwPjsKIAogCQlpMmNAMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWRmc3JyOwogCQkJcnRjQDY4IHsKIAkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzNzQiOwogCQkJCXJlZyA9IDwweDY4PjsKIAkJCX07CiAJCX07CiAKLQkJaTJjQDMxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzEwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQogCQlzcGlANzAwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGVzcGkiOwotCQkJcmVnID0gPDB4NzAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw1OSAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQllc3BpLG51bS1zcy1iaXRzID0gPDQ+OwotCQkJbW9kZSA9ICJjcHUiOwogCi0JCQlmc2xfbTI1cDgwQDAgeworCQkJZmxhc2hAMCB7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZXNwaS1mbGFzaCI7CisJCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzMjVzbDEyODAxIjsKIAkJCQlyZWcgPSA8MD47Ci0JCQkJbGludXgsbW9kYWxpYXMgPSAiZnNsX20yNXA4MCI7CiAJCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NDAwMDAwMDA+OyAvKiBpbnB1dCBjbG9jayAqLworCiAJCQkJcGFydGl0aW9uQHUtYm9vdCB7CiAJCQkJCWxhYmVsID0gInUtYm9vdC1zcGkiOwogCQkJCQlyZWcgPSA8MHgwMDAwMDAwMCAweDAwMTAwMDAwPjsKQEAgLTI1MywyMzcgKzE0OSw0OSBAQAogCQkJfTsKIAkJfTsKIAotCQlncGlvOiBncGlvLWNvbnRyb2xsZXJAZjAwMCB7Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NzItZ3BpbyI7Ci0JCQlyZWcgPSA8MHhmMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDcgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQl9OwotCi0JCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIxLWwyLWNhY2hlLWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKLQkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCi0JCQljYWNoZS1zaXplID0gPDB4NDAwMDA+OyAvLyBMMiwyNTZLCi0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCX07Ci0KLQkJZG1hQDIxMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHgyMTMwMCAweDQ+OwotCQkJcmFuZ2VzID0gPDB4MCAweDIxMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMCAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIxIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTAwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMiAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjMgMj47Ci0JCQl9OwotCQl9OwotCiAJCXVzYkAyMjAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtdXNiMi1kciI7Ci0JCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDI4IDB4Mj47CiAJCQlwaHlfdHlwZSA9ICJ1bHBpIjsKIAkJfTsKIAotCQkgbWRpb0AyNDAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyLW1kaW8iOwotCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwIDB4YjAwMzAgMHg0PjsKLQorCQltZGlvQDI0MDAwIHsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDEgMT47CisJCQkJaW50ZXJydXB0cyA9IDwxIDEgMCAwPjsKIAkJCQlyZWcgPSA8MHgwPjsKIAkJCX07CiAJCQlwaHkxOiBldGhlcm5ldC1waHlAMSB7Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyIDE+OworCQkJCWludGVycnVwdHMgPSA8MiAxIDAgMD47CiAJCQkJcmVnID0gPDB4MT47CiAJCQl9OwogCQkJcGh5NDogZXRoZXJuZXQtcGh5QDQgewotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwogCQkJCXJlZyA9IDwweDQ+OwogCQkJfTsKKwkJCXRiaS1waHlANSB7CisJCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7CisJCQkJcmVnID0gPDB4NT47CisJCQl9OwogCQl9OwogCiAJCW1kaW9AMjUwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGV0c2VjMi10YmkiOwotCQkJcmVnID0gPDB4MjUwMDAgMHgxMDAwIDB4YjEwMzAgMHg0PjsKIAkJCXRiaTA6IHRiaS1waHlAMTEgewogCQkJCXJlZyA9IDwweDExPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKIAkJCX07CiAJCX07CiAKLQkJZW5ldDA6IGV0aGVybmV0QEIwMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImZzbCxldHNlYzIiOwotCQkJZnNsLG51bV9yeF9xdWV1ZXMgPSA8MHg4PjsKLQkJCWZzbCxudW1fdHhfcXVldWVzID0gPDB4OD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlldGhlcm5ldEBiMDAwMCB7CiAJCQlwaHktaGFuZGxlID0gPCZwaHkwPjsKIAkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCQkJcXVldWUtZ3JvdXBAMHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCQlyZWcgPSA8MHhCMDAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8MjkgMiAzMCAyIDM0IDI+OwotCQkJfTsKLQkJCXF1ZXVlLWdyb3VwQDF7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJcmVnID0gPDB4QjQwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDE3IDIgMTggMiAyNCAyPjsKLQkJCX07CiAJCX07CiAKLQkJZW5ldDE6IGV0aGVybmV0QEIxMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImZzbCxldHNlYzIiOwotCQkJZnNsLG51bV9yeF9xdWV1ZXMgPSA8MHg4PjsKLQkJCWZzbCxudW1fdHhfcXVldWVzID0gPDB4OD47Ci0JCQlsb2NhbC1tYWMtYWRkcmVzcyA9IFsgMDAgMDAgMDAgMDAgMDAgMDAgXTsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQlldGhlcm5ldEBiMTAwMCB7CiAJCQlwaHktaGFuZGxlID0gPCZwaHk0PjsKIAkJCXRiaS1oYW5kbGUgPSA8JnRiaTA+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJzZ21paSI7Ci0JCQlxdWV1ZS1ncm91cEAwewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCXJlZyA9IDwweEIxMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAyIDM2IDIgNDAgMj47Ci0JCQl9OwotCQkJcXVldWUtZ3JvdXBAMXsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCQlyZWcgPSA8MHhCNTAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8NTEgMiA1MiAyIDY3IDI+OwotCQkJfTsKIAkJfTsKIAotCQllbmV0MjogZXRoZXJuZXRAQjIwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGV0c2VjMiI7Ci0JCQlmc2wsbnVtX3J4X3F1ZXVlcyA9IDwweDg+OwotCQkJZnNsLG51bV90eF9xdWV1ZXMgPSA8MHg4PjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCWV0aGVybmV0QGIyMDAwIHsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7Ci0JCQlxdWV1ZS1ncm91cEAwewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCXJlZyA9IDwweEIyMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAyIDMyIDIgMzMgMj47Ci0JCQl9OwotCQkJcXVldWUtZ3JvdXBAMXsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCQlyZWcgPSA8MHhCNjAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8MjUgMiAyNiAyIDI3IDI+OwotCQkJfTsKLQkJfTsKLQotCQlzZGhjaUAyZTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMTAyMS1lc2RoYyIsICJmc2wsZXNkaGMiOwotCQkJcmVnID0gPDB4MmUwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NzIgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJLyogRmlsbGVkIGluIGJ5IFUtQm9vdCAqLwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQl9OwotCi0JCWNyeXB0b0AzMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzZWMzLjMiLCAiZnNsLHNlYzMuMSIsCi0JCQkJICAgICAiZnNsLHNlYzMuMCIsICJmc2wsc2VjMi40IiwKLQkJCQkgICAgICJmc2wsc2VjMi4yIiwgImZzbCxzZWMyLjEiLCAiZnNsLHNlYzIuMCI7Ci0JCQlyZWcgPSA8MHgzMDAwMCAweDEwMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NDUgMiA1OCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZnNsLG51bS1jaGFubmVscyA9IDw0PjsKLQkJCWZzbCxjaGFubmVsLWZpZm8tbGVuID0gPDI0PjsKLQkJCWZzbCxleGVjLXVuaXRzLW1hc2sgPSA8MHg5N2M+OwotCQkJZnNsLGRlc2NyaXB0b3ItdHlwZXMtbWFzayA9IDwweDNhMzBhYmY+OwotCQl9OwotCi0JCW1waWM6IHBpY0A0MDAwMCB7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OwotCQkJY29tcGF0aWJsZSA9ICJjaHJwLG9wZW4tcGljIjsKLQkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKLQkJfTsKLQotCQltc2lANDE2MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjEtbXNpIiwgImZzbCxtcGljLW1zaSI7Ci0JCQlyZWcgPSA8MHg0MTYwMCAweDgwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAKLQkJCQkweGUxIDAKLQkJCQkweGUyIDAKLQkJCQkweGUzIDAKLQkJCQkweGU0IDAKLQkJCQkweGU1IDAKLQkJCQkweGU2IDAKLQkJCQkweGU3IDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CS8vZ2xvYmFsIHV0aWxpdGllcyBibG9jawotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjEtZ3V0cyI7Ci0JCQlyZWcgPSA8MHhlMDAwMCAweDEwMDA+OwotCQkJZnNsLGhhcy1yc3RjcjsKIAkJfTsKIAogCQlwYXJfaW9AZTAxMDAgewpAQCAtNDk5LDggKzIwNyw3IEBACiAJCQkJCTB4MSAgMHgxMyAweDEgIDB4MCAgMHgxICAweDAgICAgLyogUUVfTVVYX01EQyAqLwogCQkJCQkweDEgIDB4MTQgMHgzICAweDAgIDB4MSAgMHgwICAgIC8qIFFFX01VWF9NRElPICovCiAJCQkJCTB4MCAgMHgxNyAweDIgIDB4MCAgMHgyICAweDAgICAgLyogQ0xLMTIgKi8KLQkJCQkJMHgwICAweDE4IDB4MiAgMHgwICAweDEgIDB4MCAgICAvKiBDTEs5Ci0qLworCQkJCQkweDAgIDB4MTggMHgyICAweDAgIDB4MSAgMHgwICAgIC8qIENMSzkgKi8KIAkJCQkJMHgwICAweDcgIDB4MSAgMHgwICAweDIgIDB4MCAgICAvKiBFTkVUMV9UWEQwX1NFUjFfVFhEMCAqLwogCQkJCQkweDAgIDB4OSAgMHgxICAweDAgIDB4MiAgMHgwICAgIC8qIEVORVQxX1RYRDFfU0VSMV9UWEQxICovCiAJCQkJCTB4MCAgMHhiICAweDEgIDB4MCAgMHgyICAweDAgICAgLyogRU5FVDFfVFhEMl9TRVIxX1RYRDIgKi8KQEAgLTUzNSwzMSArMjQyLDEwIEBACiAJfTsKIAogCXBjaTA6IHBjaWVAZmZlMDkwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCXJlZyA9IDwwIDB4ZmZlMDkwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzEwMDAwIDB4MCAweDEwMDAwPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwotCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJLyogSURTRUwgMHgwICovCi0JCQkwMDAwIDAgMCAxICZtcGljIDQgMQotCQkJMDAwMCAwIDAgMiAmbXBpYyA1IDEKLQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxCi0JCQkwMDAwIDAgMCA0ICZtcGljIDcgMQotCQkJPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtNTcxLDMxICsyNTcsMTAgQEAKIAl9OwogCiAJcGNpMTogcGNpZUBmZmUwYTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJcmVnID0gPDAgMHhmZmUwYTAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47CiAJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAgMCAweGMwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZmZjMjAwMDAgMHgwIDB4MTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMCAwIDEgJm1waWMgMCAxCi0JCQkwMDAwIDAgMCAyICZtcGljIDEgMQotCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEKLQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxCi0JCQk+OwogCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwCiAJCQkJICAweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAKIAkJCQkgIDB4MCAweDIwMDAwMDAwCkBAIC02MDYsMzYgKzI3MSwxNiBAQAogCQl9OwogCX07CiAKLQlxZUBmZmU4MDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZGV2aWNlX3R5cGUgPSAicWUiOwotCQljb21wYXRpYmxlID0gImZzbCxxZSI7CisJcWU6IHFlQGZmZTgwMDAwIHsKIAkJcmFuZ2VzID0gPDB4MCAweDAgMHhmZmU4MDAwMCAweDQwMDAwPjsKIAkJcmVnID0gPDAgMHhmZmU4MDAwMCAwIDB4NDgwPjsKIAkJYnJnLWZyZXF1ZW5jeSA9IDwwPjsKIAkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsKLQkJZnNsLHFlLW51bS1yaXNjcyA9IDwxPjsKLQkJZnNsLHFlLW51bS1zbnVtcyA9IDwyOD47CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7IC8qIG5vIGZpcm13YXJlIGxvYWRlZCAqLwogCi0JCXFlaWM6IGludGVycnVwdC1jb250cm9sbGVyQDgwIHsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJY29tcGF0aWJsZSA9ICJmc2wscWUtaWMiOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDYzIDIgNjAgMj47IC8vaGlnaDo0NyBsb3c6NDQKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCiAJCWVuZXQzOiB1Y2NAMjAwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKIAkJCWNvbXBhdGlibGUgPSAidWNjX2dldGgiOwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCXJlZyA9IDwweDIwMDAgMHgyMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2stbmFtZSA9ICJjbGsxMiI7CiAJCQl0eC1jbG9jay1uYW1lID0gImNsazkiOwpAQCAtNjQ1LDIwICsyOTAsMTUgQEAKIAkJfTsKIAogCQltZGlvQDIxMjAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCXJlZyA9IDwweDIxMjAgMHgxOD47Ci0JCQljb21wYXRpYmxlID0gImZzbCx1Y2MtbWRpbyI7Ci0KIAkJCXFlX3BoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDQgMT47CisJCQkJaW50ZXJydXB0cyA9IDw0IDEgMCAwPjsKIAkJCQlyZWcgPSA8MHgwPjsKIAkJCQlkZXZpY2VfdHlwZSA9ICJldGhlcm5ldC1waHkiOwogCQkJfTsKIAkJCXFlX3BoeTE6IGV0aGVybmV0LXBoeUAwMyB7CiAJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw1IDE+OworCQkJCWludGVycnVwdHMgPSA8NSAxIDAgMD47CiAJCQkJcmVnID0gPDB4Mz47CiAJCQkJZGV2aWNlX3R5cGUgPSAiZXRoZXJuZXQtcGh5IjsKIAkJCX07CkBAIC02NzEsMTAgKzMxMSw2IEBACiAJCWVuZXQ0OiB1Y2NAMjQwMCB7CiAJCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKIAkJCWNvbXBhdGlibGUgPSAidWNjX2dldGgiOwotCQkJY2VsbC1pbmRleCA9IDw1PjsKLQkJCXJlZyA9IDwweDI0MDAgMHgyMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZxZWljPjsKIAkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwogCQkJcngtY2xvY2stbmFtZSA9ICJub25lIjsKIAkJCXR4LWNsb2NrLW5hbWUgPSAiY2xrMTMiOwpAQCAtNjgyLDE4ICszMTgsNyBAQAogCQkJcGh5LWhhbmRsZSA9IDwmcWVfcGh5MT47CiAJCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJtaWkiOwogCQl9OwotCi0JCW11cmFtQDEwMDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxxZS1tdXJhbSIsICJmc2wsY3BtLW11cmFtIjsKLQkJCXJhbmdlcyA9IDwweDAgMHgxMDAwMCAweDYwMDA+OwotCi0JCQlkYXRhLW9ubHlAMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscWUtbXVyYW0tZGF0YSIsCi0JCQkJImZzbCxjcG0tbXVyYW0tZGF0YSI7Ci0JCQkJcmVnID0gPDB4MCAweDYwMDA+OwotCQkJfTsKLQkJfTsKIAl9OwogfTsKKworL2luY2x1ZGUvICJmc2wvcDEwMjFzaS1wb3N0LmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjJkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjJkcy5kdHMKaW5kZXggYjliODcxOS4uZWY5NTcxNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIyZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyMmRzLmR0cwpAQCAtOCw1NyArOCwzNiBAQAogICoga2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgKi8KIAotL2R0cy12MS87CisvaW5jbHVkZS8gImZzbC9wMTAyMnNpLXByZS5kdHNpIgogLyB7Ci0JbW9kZWwgPSAiZnNsLFAxMDIyIjsKKwltb2RlbCA9ICJmc2wsUDEwMjJEUyI7CiAJY29tcGF0aWJsZSA9ICJmc2wsUDEwMjJEUyI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JI3NpemUtY2VsbHMgPSA8Mj47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0KLQlhbGlhc2VzIHsKLQkJZXRoZXJuZXQwID0gJmVuZXQwOwotCQlldGhlcm5ldDEgPSAmZW5ldDE7Ci0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlwY2kwID0gJnBjaTA7Ci0JCXBjaTEgPSAmcGNpMTsKLQkJcGNpMiA9ICZwY2kyOwotCX07Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCVBvd2VyUEMsUDEwMjJAMCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDB4MD47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47Ci0JCX07Ci0KLQkJUG93ZXJQQyxQMTAyMkAxIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MHgxPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKLQkJfTsKLQl9OwogCiAJbWVtb3J5IHsKIAkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKIAl9OwogCi0JbG9jYWxidXNAZmZmZTA1MDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxwMTAyMi1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOwotCQlyZWcgPSA8MCAweGZmZTA1MDAwIDAgMHgxMDAwPjsKLQkJaW50ZXJydXB0cyA9IDwxOSAyIDAgMD47Ci0KKwlsYmM6IGxvY2FsYnVzQGZmZmUwNTAwMCB7CisJCXJlZyA9IDwweGYgMHhmZmUwNTAwMCAwIDB4MTAwMD47CiAJCXJhbmdlcyA9IDwweDAgMHgwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDAKIAkJCSAgMHgxIDB4MCAweGYgMHhlMDAwMDAwMCAweDA4MDAwMDAwCi0JCQkgIDB4MiAweDAgMHgwIDB4ZmZhMDAwMDAgMHgwMDA0MDAwMAorCQkJICAweDIgMHgwIDB4ZiAweGZmODAwMDAwIDB4MDAwNDAwMDAKIAkJCSAgMHgzIDB4MCAweGYgMHhmZmRmMDAwMCAweDAwMDA4MDAwPjsKIAorCQkvKgorCQkgKiBUaGlzIG5vZGUgaXMgdXNlZCB0byBhY2Nlc3MgdGhlIHBpeGlzIHZpYSAiaW5kaXJlY3QiIG1vZGUsCisJCSAqIHdoaWNoIGlzIGRvbmUgYnkgd3JpdGluZyB0aGUgcGl4aXMgcmVnaXN0ZXIgaW5kZXggdG8gY2hpcAorCQkgKiBzZWxlY3QgMCBhbmQgdGhlIHZhbHVlIHRvL2Zyb20gY2hpcCBzZWxlY3QgMS4gIEluZGlyZWN0CisJCSAqIG1vZGUgaXMgdGhlIG9ubHkgd2F5IHRvIGFjY2VzcyB0aGUgcGl4aXMgd2hlbiBESVUgdmlkZW8KKwkJICogaXMgZW5hYmxlZC4gIE5vdGUgdGhhdCB0aGlzIGFzc3VtZXMgdGhhdCB0aGUgZmlyc3QgY29sdW1uCisJCSAqIG9mIHRoZSAncmFuZ2VzJyBwcm9wZXJ0eSBhYm92ZSBpcyB0aGUgY2hpcCBzZWxlY3QgbnVtYmVyLgorCQkgKi8KKwkJYm9hcmQtY29udHJvbEAwLDAgeworCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjJkcy1pbmRpcmVjdC1waXhpcyI7CisJCQlyZWcgPSA8MHgwIDB4MCAxCS8qIENTMCAqLworCQkJICAgICAgIDB4MSAweDAgMT47CS8qIENTMSAqLworCQl9OworCiAJCW5vckAwLDAgewogCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkjc2l6ZS1jZWxscyA9IDwxPjsKQEAgLTE2MSw1MSArMTQwLDEwIEBACiAJCX07CiAJfTsKIAotCXNvY0BmZmZlMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWRldmljZV90eXBlID0gInNvYyI7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLWltbXIiLCAic2ltcGxlLWJ1cyI7CisJc29jOiBzb2NAZmZmZTAwMDAwIHsKIAkJcmFuZ2VzID0gPDB4MCAweGYgMHhmZmUwMDAwMCAweDEwMDAwMD47Ci0JCWJ1cy1mcmVxdWVuY3kgPSA8MD47CQkvLyBGaWxsZWQgb3V0IGJ5IHVib290LgotCi0JCWVjbS1sYXdAMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxlY20tbGF3IjsKLQkJCXJlZyA9IDwweDAgMHgxMDAwPjsKLQkJCWZzbCxudW0tbGF3cyA9IDwxMj47Ci0JCX07Ci0KLQkJZWNtQDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjItZWNtIiwgImZzbCxlY20iOwotCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47Ci0JCX07Ci0KLQkJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMTAyMi1tZW1vcnktY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKLQkJfTsKLQotCQlpMmNAMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07CiAKIAkJaTJjQDMxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzEwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDIgMCAwPjsKLQkJCWRmc3JyOwotCiAJCQl3bTg3NzY6Y29kZWNAMWEgewogCQkJCWNvbXBhdGlibGUgPSAid2xmLHdtODc3NiI7CiAJCQkJcmVnID0gPDB4MWE+OwpAQCAtMjE2LDQxICsxNTQsMTQgQEAKIAkJCX07CiAJCX07CiAKLQkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4NDUwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQyIDIgMCAwPjsKLQkJfTsKLQotCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMiAwIDA+OwotCQl9OwotCiAJCXNwaUA3MDAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZXNwaSI7Ci0JCQlyZWcgPSA8MHg3MDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDU5IDB4MiAwIDA+OwotCQkJZXNwaSxudW0tc3MtYml0cyA9IDw0PjsKLQkJCW1vZGUgPSAiY3B1IjsKLQotCQkJZnNsX20yNXA4MEAwIHsKKwkJCWZsYXNoQDAgewogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwogCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVzcGktZmxhc2giOworCQkJCWNvbXBhdGlibGUgPSAic3BhbnNpb24sczI1c2wxMjgwMSI7CiAJCQkJcmVnID0gPDA+OwotCQkJCWxpbnV4LG1vZGFsaWFzID0gImZzbF9tMjVwODAiOwogCQkJCXNwaS1tYXgtZnJlcXVlbmN5ID0gPDQwMDAwMDAwPjsgLyogaW5wdXQgY2xvY2sgKi8KKwogCQkJCXBhcnRpdGlvbkAwIHsKIAkJCQkJbGFiZWwgPSAidS1ib290LXNwaSI7CiAJCQkJCXJlZyA9IDwweDAwMDAwMDAwIDB4MDAxMDAwMDA+OwpAQCAtMjc0LDExNSArMTg1LDIwIEBACiAJCX07CiAKIAkJc3NpQDE1MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg2MTAtc3NpIjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlyZWcgPSA8MHgxNTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDc1IDIgMCAwPjsKIAkJCWZzbCxtb2RlID0gImkycy1zbGF2ZSI7CiAJCQljb2RlYy1oYW5kbGUgPSA8JndtODc3Nj47Ci0JCQlmc2wscGxheWJhY2stZG1hID0gPCZkbWEwMD47Ci0JCQlmc2wsY2FwdHVyZS1kbWEgPSA8JmRtYTAxPjsKLQkJCWZzbCxmaWZvLWRlcHRoID0gPDE1PjsKIAkJCWZzbCxzc2ktYXN5bmNocm9ub3VzOwogCQl9OwogCi0JCWRtYUBjMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHhjMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4YzEwMCAweDIwMD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZG1hMDA6IGRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNzaS1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJCWludGVycnVwdHMgPSA8NzYgMiAwIDA+OwotCQkJfTsKLQkJCWRtYTAxOiBkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc3NpLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8NzcgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTAwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQkJaW50ZXJydXB0cyA9IDw3OCAyIDAgMD47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDc5IDIgMCAwPjsKLQkJCX07Ci0JCX07Ci0KLQkJZ3BpbzogZ3Bpby1jb250cm9sbGVyQGYwMDAgewotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWdwaW8iOwotCQkJcmVnID0gPDB4ZjAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQ3IDB4MiAwIDA+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQl9OwotCi0JCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLWwyLWNhY2hlLWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKLQkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCi0JCQljYWNoZS1zaXplID0gPDB4NDAwMDA+OyAvLyBMMiwgMjU2SwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDAgMD47Ci0JCX07Ci0KLQkJZG1hQDIxMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHgyMTMwMCAweDQ+OwotCQkJcmFuZ2VzID0gPDB4MCAweDIxMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMCAyIDAgMD47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMSAyIDAgMD47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIyIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDM+OwotCQkJCWludGVycnVwdHMgPSA8MjMgMiAwIDA+OwotCQkJfTsKLQkJfTsKLQogCQl1c2JAMjIwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLXVzYjItZHIiOwotCQkJcmVnID0gPDB4MjIwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MjggMHgyIDAgMD47CiAJCQlwaHlfdHlwZSA9ICJ1bHBpIjsKIAkJfTsKIAotCQltZGlvQDI0MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxldHNlYzItbWRpbyI7Ci0JCQlyZWcgPSA8MHgyNDAwMCAweDEwMDAgMHhiMDAzMCAweDQ+OworCQl1c2JAMjMwMDAgeworCQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJfTsKIAorCQltZGlvQDI0MDAwIHsKIAkJCXBoeTA6IGV0aGVybmV0LXBoeUAwIHsKIAkJCQlpbnRlcnJ1cHRzID0gPDMgMSAwIDA+OwogCQkJCXJlZyA9IDwweDE+OwpAQCAtMzkxLDE4OSArMjA3LDI4IEBACiAJCQkJaW50ZXJydXB0cyA9IDw5IDEgMCAwPjsKIAkJCQlyZWcgPSA8MHgyPjsKIAkJCX07CisJCQl0YmktcGh5QDIgeworCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQkJCXJlZyA9IDwweDI+OworCQkJfTsKIAkJfTsKIAotCQltZGlvQDI1MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxldHNlYzItbWRpbyI7Ci0JCQlyZWcgPSA8MHgyNTAwMCAweDEwMDAgMHhiMTAzMCAweDQ+OwotCQl9OwotCi0JCWVuZXQwOiBldGhlcm5ldEBCMDAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZXRzZWMyIjsKLQkJCWZzbCxudW1fcnhfcXVldWVzID0gPDB4OD47Ci0JCQlmc2wsbnVtX3R4X3F1ZXVlcyA9IDwweDg+OwotCQkJZnNsLG1hZ2ljLXBhY2tldDsKLQkJCWZzbCx3YWtlLW9uLWZpbGVyOwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07CisJCWV0aGVybmV0QGIwMDAwIHsKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTA+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7Ci0JCQlxdWV1ZS1ncm91cEAwewotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCXJlZyA9IDwweEIwMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDwyOSAyIDAgMCAzMCAyIDAgMCAzNCAyIDAgMD47Ci0JCQl9OwotCQkJcXVldWUtZ3JvdXBAMXsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCQlyZWcgPSA8MHhCNDAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8MTcgMiAwIDAgMTggMiAwIDAgMjQgMiAwIDA+OwotCQkJfTsKIAkJfTsKIAotCQllbmV0MTogZXRoZXJuZXRAQjEwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkZXZpY2VfdHlwZSA9ICJuZXR3b3JrIjsKLQkJCW1vZGVsID0gImVUU0VDIjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGV0c2VjMiI7Ci0JCQlmc2wsbnVtX3J4X3F1ZXVlcyA9IDwweDg+OwotCQkJZnNsLG51bV90eF9xdWV1ZXMgPSA8MHg4PjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOworCQlldGhlcm5ldEBiMTAwMCB7CiAJCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKIAkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCQkJcXVldWUtZ3JvdXBAMHsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCQlyZWcgPSA8MHhCMTAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8MzUgMiAwIDAgMzYgMiAwIDAgNDAgMiAwIDA+OwotCQkJfTsKLQkJCXF1ZXVlLWdyb3VwQDF7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJcmVnID0gPDB4QjUwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDUxIDIgMCAwIDUyIDIgMCAwIDY3IDIgMCAwPjsKLQkJCX07Ci0JCX07Ci0KLQkJc2RoY2lAMmUwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjItZXNkaGMiLCAiZnNsLGVzZGhjIjsKLQkJCXJlZyA9IDwweDJlMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDcyIDB4MiAwIDA+OwotCQkJZnNsLHNkaGNpLWF1dG8tY21kMTI7Ci0JCQkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCX07Ci0KLQkJY3J5cHRvQDMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYzMuMyIsICJmc2wsc2VjMy4xIiwgImZzbCxzZWMzLjAiLAotCQkJCSAgICAgImZzbCxzZWMyLjQiLCAiZnNsLHNlYzIuMiIsICJmc2wsc2VjMi4xIiwKLQkJCQkgICAgICJmc2wsc2VjMi4wIjsKLQkJCXJlZyA9IDwweDMwMDAwIDB4MTAwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0NSAyIDAgMCA1OCAyIDAgMD47Ci0JCQlmc2wsbnVtLWNoYW5uZWxzID0gPDQ+OwotCQkJZnNsLGNoYW5uZWwtZmlmby1sZW4gPSA8MjQ+OwotCQkJZnNsLGV4ZWMtdW5pdHMtbWFzayA9IDwweDk3Yz47Ci0JCQlmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrID0gPDB4M2EzMGFiZj47Ci0JCX07Ci0KLQkJc2F0YUAxODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMTAyMi1zYXRhIiwgImZzbCxwcS1zYXRhLXYyIjsKLQkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJaW50ZXJydXB0cyA9IDw3NCAweDIgMCAwPjsKLQkJfTsKLQotCQlzYXRhQDE5MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLXNhdGEiLCAiZnNsLHBxLXNhdGEtdjIiOwotCQkJcmVnID0gPDB4MTkwMDAgMHgxMDAwPjsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQlpbnRlcnJ1cHRzID0gPDQxIDB4MiAwIDA+OwotCQl9OwotCi0JCXBvd2VyQGUwMDcwewotCQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODUzNi1wbWMiLCAiZnNsLG1wYzg1NDgtcG1jIjsKLQkJCXJlZyA9IDwweGUwMDcwIDB4MjA+OwotCQl9OwotCi0JCWRpc3BsYXlAMTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGl1IiwgImZzbCxwMTAyMi1kaXUiOwotCQkJcmVnID0gPDB4MTAwMDAgMTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDY0IDIgMCAwPjsKLQkJfTsKLQotCQl0aW1lckA0MTEwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGljLWdsb2JhbC10aW1lciI7Ci0JCQlyZWcgPSA8MHg0MTEwMCAweDEwMCAweDQxMzAwIDQ+OwotCQkJaW50ZXJydXB0cyA9IDwwIDAgMyAwCi0JCQkgICAgICAgICAgICAgIDEgMCAzIDAKLQkJCSAgICAgICAgICAgICAgMiAwIDMgMAotCQkJICAgICAgICAgICAgICAzIDAgMyAwPjsKLQkJfTsKLQotCQl0aW1lckA0MjEwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGljLWdsb2JhbC10aW1lciI7Ci0JCQlyZWcgPSA8MHg0MjEwMCAweDEwMCAweDQyMzAwIDQ+OwotCQkJaW50ZXJydXB0cyA9IDw0IDAgMyAwCi0JCQkgICAgICAgICAgICAgIDUgMCAzIDAKLQkJCSAgICAgICAgICAgICAgNiAwIDMgMAotCQkJICAgICAgICAgICAgICA3IDAgMyAwPjsKLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8ND47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMiOwotCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOwotCQl9OwotCi0JCW1zaUA0MTYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMTAyMi1tc2kiLCAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4ODA+OwotCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTB4ZTAgMCAwIDAKLQkJCQkweGUxIDAgMCAwCi0JCQkJMHhlMiAwIDAgMAotCQkJCTB4ZTMgMCAwIDAKLQkJCQkweGU0IDAgMCAwCi0JCQkJMHhlNSAwIDAgMAotCQkJCTB4ZTYgMCAwIDAKLQkJCQkweGU3IDAgMCAwPjsKLQkJfTsKLQotCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLy9nbG9iYWwgdXRpbGl0aWVzIGJsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxwMTAyMi1ndXRzIjsKLQkJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwogCQl9OwogCX07CiAKIAlwY2kwOiBwY2llQGZmZmUwOTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCXJlZyA9IDwweGYgMHhmZmUwOTAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47Ci0JCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMHhjIDB4MjAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhlMDAwMDAwMCAweGMgMHgyMDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmIDB4ZmZjMTAwMDAgMHgwIDB4MTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMCAwIDEgJm1waWMgNCAxCi0JCQkwMDAwIDAgMCAyICZtcGljIDUgMQotCQkJMDAwMCAwIDAgMyAmbXBpYyA2IDEKLQkJCTAwMDAgMCAwIDQgJm1waWMgNyAxCi0JCQk+OwogCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwCiAJCQkJICAweDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MCAweDIwMDAwMDAwCkBAIC01ODUsMzAgKzI0MCwxMSBAQAogCX07CiAKIAlwY2kxOiBwY2llQGZmZmUwYTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIyLXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CiAJCXJlZyA9IDwweGYgMHhmZmUwYTAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47Ci0JCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAgMHhjIDB4NDAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKKwkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhlMDAwMDAwMCAweGMgMHg0MDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmIDB4ZmZjMjAwMDAgMHgwIDB4MTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMCAwPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMCAwIDEgJm1waWMgMCAxCi0JCQkwMDAwIDAgMCAyICZtcGljIDEgMQotCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEKLQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxCi0JCQk+OwogCQlwY2llQDAgewogCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwCiAJCQkJICAweDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MCAweDIwMDAwMDAwCkBAIC02MTksMzIgKzI1NSwxMSBAQAogCQl9OwogCX07CiAKLQogCXBjaTI6IHBjaWVAZmZmZTBiMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjItcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJcmVnID0gPDB4ZiAweGZmZTBiMDAwIDAgMHgxMDAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMjU1PjsKLQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMCAweGMgMHgwMDAwMDAwMCAweDAgMHgyMDAwMDAwMAorCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwIDB4YyAweDAwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmZmMwMDAwMCAweDAgMHgxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdHMgPSA8MTYgMiAwIDA+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAwIDAgMSAmbXBpYyA4IDEKLQkJCTAwMDAgMCAwIDIgJm1waWMgOSAxCi0JCQkwMDAwIDAgMCAzICZtcGljIDEwIDEKLQkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMQotCQkJPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhlMDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweGUwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtNjU1LDMgKzI3MCw1IEBACiAJCX07CiAJfTsKIH07CisKKy9pbmNsdWRlLyAiZnNsL3AxMDIyc2ktcG9zdC5kdHNpIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIzcmRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMTAyM3Jkcy5kdHMKaW5kZXggZDNiNDc4Mi4uYmViNmNiMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AxMDIzcmRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDEwMjNyZHMuZHRzCkBAIC0zNCwxMzcgKzM0LDMwIEBACiAgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0vZHRzLXYxLzsKKy9pbmNsdWRlLyAiZnNsL3AxMDIzc2ktcHJlLmR0c2kiCiAKIC8gewogCW1vZGVsID0gImZzbCxQMTAyMyI7CiAJY29tcGF0aWJsZSA9ICJmc2wsUDEwMjNSRFMiOwogCSNhZGRyZXNzLWNlbGxzID0gPDI+OwogCSNzaXplLWNlbGxzID0gPDI+OwotCi0JYWxpYXNlcyB7Ci0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlwY2kwID0gJnBjaTA7Ci0JCXBjaTEgPSAmcGNpMTsKLQkJcGNpMiA9ICZwY2kyOwotCi0JCWNyeXB0byA9ICZjcnlwdG87Ci0JCXNlY19qcjAgPSAmc2VjX2pyMDsKLQkJc2VjX2pyMSA9ICZzZWNfanIxOwotCQlzZWNfanIyID0gJnNlY19qcjI7Ci0JCXNlY19qcjMgPSAmc2VjX2pyMzsKLQkJcnRpY19hID0gJnJ0aWNfYTsKLQkJcnRpY19iID0gJnJ0aWNfYjsKLQkJcnRpY19jID0gJnJ0aWNfYzsKLQkJcnRpY19kID0gJnJ0aWNfZDsKLQl9OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQljcHUwOiBQb3dlclBDLFAxMDIzQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwweDA+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwotCQl9OwotCi0JCWNwdTE6IFBvd2VyUEMsUDEwMjNAMSB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDB4MT47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMj47Ci0JCX07Ci0JfTsKKwlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAogCW1lbW9yeSB7CiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJfTsKIAotCXNvY0BmZjYwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjMtaW1tciIsICJzaW1wbGUtYnVzIjsKKwlzb2M6IHNvY0BmZjYwMDAwMCB7CiAJCXJhbmdlcyA9IDwweDAgMHgwIDB4ZmY2MDAwMDAgMHgyMDAwMDA+OwotCQlidXMtZnJlcXVlbmN5ID0gPDA+OwkJLy8gRmlsbGVkIG91dCBieSB1Ym9vdC4KLQotCQllY20tbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWNtLWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MTI+OwotCQl9OwotCi0JCWVjbUAxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLWVjbSIsICJmc2wsZWNtIjsKLQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQltZW1vcnktY29udHJvbGxlckAyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLW1lbW9yeS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJfTsKIAogCQlpMmNAMzAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWRmc3JyOwogCQkJcnRjQDY4IHsKIAkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzNzQiOwogCQkJCXJlZyA9IDwweDY4PjsKIAkJCX07CiAJCX07CiAKLQkJaTJjQDMxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzEwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDIgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQogCQlzcGlANzAwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLWVzcGkiLCAiZnNsLG1wYzg1MzYtZXNwaSI7Ci0JCQlyZWcgPSA8MHg3MDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDU5IDB4Mj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWZzbCxlc3BpLW51bS1jaGlwc2VsZWN0cyA9IDw0PjsKLQogCQkJZnNsX2RhdGFmbGFzaEAwIHsKIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKIAkJCQkjc2l6ZS1jZWxscyA9IDwxPjsKQEAgLTE4NiwxOTcgKzc5LDE0IEBACiAJCQl9OwogCQl9OwogCi0JCWdwaW86IGdwaW8tY29udHJvbGxlckBmMDAwIHsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtZ3BpbyI7Ci0JCQlyZWcgPSA8MHhmMDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDcgMHgyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQl9OwotCi0JCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLWwyLWNhY2hlLWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKLQkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCi0JCQljYWNoZS1zaXplID0gPDB4NDAwMDA+OyAvLyBMMiwyNTZLCi0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCX07Ci0KLQkJZG1hQDIxMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHgyMTMwMCAweDQ+OwotCQkJcmFuZ2VzID0gPDB4MCAweDIxMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMCAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4ODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIxIDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTAwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMiAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDE4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDM+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjMgMj47Ci0JCQl9OwotCQl9OwotCiAJCXVzYkAyMjAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtdXNiMi1kciI7Ci0JCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDI4IDB4Mj47CiAJCQlkcl9tb2RlID0gImhvc3QiOwogCQkJcGh5X3R5cGUgPSAidWxwaSI7CiAJCX07Ci0KLQkJY3J5cHRvOiBjcnlwdG9AMzAwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yIiwgImZzbCxzZWMtdjQuMCI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJcmVnID0gPDB4MzAwMDAgMHgxMDAwMD47Ci0JCQlyYW5nZXMgPSA8MCAweDMwMDAwIDB4MTAwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDU4IDI+OwotCi0JCQlzZWNfanIwOiBqckAxMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8NDUgMj47Ci0JCQl9OwotCi0JCQlzZWNfanIxOiBqckAyMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8NDUgMj47Ci0JCQl9OwotCi0JCQlzZWNfanIyOiBqckAzMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4MzAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8NTcgMj47Ci0JCQl9OwotCi0JCQlzZWNfanIzOiBqckA0MDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4NDAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8NTcgMj47Ci0JCQl9OwotCi0JCQlydGljQDYwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMiLAotCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYyI7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJcmVnID0gPDB4NjAwMCAweDEwMD47Ci0JCQkJcmFuZ2VzID0gPDB4MCAweDYxMDAgMHhlMDA+OwotCi0JCQkJcnRpY19hOiBydGljLWFAMCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKLQkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDAwIDB4MjAgMHgxMDAgMHg4MD47Ci0JCQkJfTsKLQotCQkJCXJ0aWNfYjogcnRpYy1iQDIwIHsKLQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAotCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4MjAgMHgyMCAweDIwMCAweDgwPjsKLQkJCQl9OwotCi0JCQkJcnRpY19jOiBydGljLWNANDAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCi0JCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHg0MCAweDIwIDB4MzAwIDB4ODA+OwotCQkJCX07Ci0KLQkJCQlydGljX2Q6IHJ0aWMtZEA2MCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKLQkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDYwIDB4MjAgMHg1MDAgMHg4MD47Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJcG93ZXJAZTAwNzB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTM2LXBtYyIsICJmc2wsbXBjODU0OC1wbWMiLAotCQkJICAgICAgICAgICAgICJmc2wscDEwMjItcG1jIjsKLQkJCXJlZyA9IDwweGUwMDcwIDB4MjA+OwotCQkJZXRzZWMxX2Nsazogc29jLWNsa0BCMHsKLQkJCQlmc2wscG1jZHItbWFzayA9IDwweDAwMDAwMDgwPjsKLQkJCX07Ci0JCQlldHNlYzJfY2xrOiBzb2MtY2xrQEIxewotCQkJCWZzbCxwbWNkci1tYXNrID0gPDB4MDAwMDAwNDA+OwotCQkJfTsKLQkJCWV0c2VjM19jbGs6IHNvYy1jbGtAQjJ7Ci0JCQkJZnNsLHBtY2RyLW1hc2sgPSA8MHgwMDAwMDAyMD47Ci0JCQl9OwotCQl9OwotCi0JCW1waWM6IHBpY0A0MDAwMCB7Ci0JCQlpbnRlcnJ1cHQtY29udHJvbGxlcjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCXJlZyA9IDwweDQwMDAwIDB4NDAwMDA+OwotCQkJY29tcGF0aWJsZSA9ICJjaHJwLG9wZW4tcGljIjsKLQkJCWRldmljZV90eXBlID0gIm9wZW4tcGljIjsKLQkJfTsKLQotCQltc2lANDE2MDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjMtbXNpIiwgImZzbCxtcGljLW1zaSI7Ci0JCQlyZWcgPSA8MHg0MTYwMCAweDgwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAKLQkJCQkweGUxIDAKLQkJCQkweGUyIDAKLQkJCQkweGUzIDAKLQkJCQkweGU0IDAKLQkJCQkweGU1IDAKLQkJCQkweGU2IDAKLQkJCQkweGU3IDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7CS8vZ2xvYmFsIHV0aWxpdGllcyBibG9jawotCQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjMtZ3V0cyI7Ci0JCQlyZWcgPSA8MHhlMDAwMCAweDEwMDA+OwotCQkJZnNsLGhhcy1yc3RjcjsKLQkJfTsKIAl9OwogCi0JbG9jYWxidXNAZmY2MDUwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLWVsYmMiLCAiZnNsLGVsYmMiLCAic2ltcGxlLWJ1cyI7CisJbGJjOiBsb2NhbGJ1c0BmZjYwNTAwMCB7CiAJCXJlZyA9IDwwIDB4ZmY2MDUwMDAgMCAweDEwMDA+OwotCQlpbnRlcnJ1cHRzID0gPDE5IDI+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKIAogCQkvKiBOT1IgRmxhc2gsIEJDU1IgKi8KIAkJcmFuZ2VzID0gPDB4MCAweDAgMHgwIDB4ZWUwMDAwMDAgMHgwMjAwMDAwMApAQCAtNDI4LDM0ICsxMzgsMTggQEAKIAl9OwogCiAJcGNpMDogcGNpZUBmZjYwYTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAxMDIzLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7Ci0JCWNlbGwtaW5kZXggPSA8MT47Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKIAkJcmVnID0gPDAgMHhmZjYwYTAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47CiAJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAgMCAweGMwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZmZjMjAwMDAgMHgwIDB4MTAwMDA+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyPjsKLQkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwogCQkJLyogSVJRWzA6M10gYXJlIHB1bGxlZCB1cCBvbiBib2FyZCwgc2V0IHRvIGFjdGl2ZS1sb3cgKi8KKwkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwogCQkJaW50ZXJydXB0LW1hcCA9IDwKIAkJCQkvKiBJRFNFTCAweDAgKi8KLQkJCQkwMDAwIDAgMCAxICZtcGljIDAgMQotCQkJCTAwMDAgMCAwIDIgJm1waWMgMSAxCi0JCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDMgMQorCQkJCTAwMDAgMCAwIDEgJm1waWMgMCAxIDAgMAorCQkJCTAwMDAgMCAwIDIgJm1waWMgMSAxIDAgMAorCQkJCTAwMDAgMCAwIDMgJm1waWMgMiAxIDAgMAorCQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxIDAgMAogCQkJCT47CiAJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwCiAJCQkJICAweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAKQEAgLTQ2NywzOCArMTYxLDIyIEBACiAJCX07CiAJfTsKIAotCXBjaTE6IHBjaWVAZmY2MDkwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwMTAyMy1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOwotCQljZWxsLWluZGV4ID0gPDI+OwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47CisJYm9hcmRfcGNpMTogcGNpMTogcGNpZUBmZjYwOTAwMCB7CiAJCXJlZyA9IDwwIDB4ZmY2MDkwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzEwMDAwIDB4MCAweDEwMDAwPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MTYgMj47CiAJCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMj47Ci0JCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKIAkJCS8qCiAJCQkgKiBJUlFbNDo2XSBvbmx5IGZvciBQQ0llLCBzZXQgdG8gYWN0aXZlLWhpZ2gsCiAJCQkgKiBJUlFbN10gaXMgcHVsbGVkIHVwIG9uIGJvYXJkLCBzZXQgdG8gYWN0aXZlLWxvdwogCQkJICovCisJCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKIAkJCWludGVycnVwdC1tYXAgPSA8CiAJCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0IDIKLQkJCQkwMDAwIDAgMCAyICZtcGljIDUgMgotCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAyCi0JCQkJMDAwMCAwIDAgNCAmbXBpYyA3IDEKKwkJCQkwMDAwIDAgMCAxICZtcGljIDQgMiAwIDAKKwkJCQkwMDAwIDAgMCAyICZtcGljIDUgMiAwIDAKKwkJCQkwMDAwIDAgMCAzICZtcGljIDYgMiAwIDAKKwkJCQkwMDAwIDAgMCA0ICZtcGljIDcgMSAwIDAKIAkJCQk+OwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCkBAIC01MTEsMzcgKzE4OSwyMSBAQAogCX07CiAKIAlwY2kyOiBwY2llQGZmNjBiMDAwIHsKLQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDEwMjMtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwogCQlyZWcgPSA8MCAweGZmNjBiMDAwIDAgMHgxMDAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMjU1PjsKIAkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMCAwIDB4ODAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKIAkJCSAgMHgxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDAgMHhmZmMwMDAwMCAweDAgMHgxMDAwMD47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwogCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CiAJCQkvKgogCQkJICogSVJRWzg6MTBdIGFyZSBwdWxsZWQgdXAgb24gYm9hcmQsIHNldCB0byBhY3RpdmUtbG93CiAJCQkgKiBJUlFbMTFdIG9ubHkgZm9yIFBDSWUsIHNldCB0byBhY3RpdmUtaGlnaCwKIAkJCSAqLworCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47CiAJCQlpbnRlcnJ1cHQtbWFwID0gPAogCQkJCS8qIElEU0VMIDB4MCAqLwotCQkJCTAwMDAgMCAwIDEgJm1waWMgOCAxCi0JCQkJMDAwMCAwIDAgMiAmbXBpYyA5IDEKLQkJCQkwMDAwIDAgMCAzICZtcGljIDEwIDEKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDExIDIKKwkJCQkwMDAwIDAgMCAxICZtcGljIDggMSAwIDAKKwkJCQkwMDAwIDAgMCAyICZtcGljIDkgMSAwIDAKKwkJCQkwMDAwIDAgMCAzICZtcGljIDEwIDEgMCAwCisJCQkJMDAwMCAwIDAgNCAmbXBpYyAxMSAyIDAgMAogCQkJCT47CiAJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCiAJCQkJICAweDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAKQEAgLTU1MywzICsyMTUsNSBAQAogCQl9OwogCX07CiB9OworCisvaW5jbHVkZS8gImZzbC9wMTAyM3NpLXBvc3QuZHRzaSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMGRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMGRzLmR0cwppbmRleCA2NmYwM2Q2Li4yMzczMTBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwMjBkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwZHMuZHRzCkBAIC05LDMwICs5LDE3IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS9pbmNsdWRlLyAicDIwMjBzaS5kdHNpIgorL2luY2x1ZGUvICJmc2wvcDIwMjBzaS1wcmUuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiZnNsLFAyMDIwRFMiOwogCWNvbXBhdGlibGUgPSAiZnNsLFAyMDIwRFMiOwogCi0JYWxpYXNlcyB7Ci0JCWV0aGVybmV0MCA9ICZlbmV0MDsKLQkJZXRoZXJuZXQxID0gJmVuZXQxOwotCQlldGhlcm5ldDIgPSAmZW5ldDI7Ci0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlwY2kwID0gJnBjaTA7Ci0JCXBjaTEgPSAmcGNpMTsKLQkJcGNpMiA9ICZwY2kyOwotCX07Ci0KLQogCW1lbW9yeSB7CiAJCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJfTsKIAotCWxvY2FsYnVzQGZmZTA1MDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKKwlib2FyZF9sYmM6IGxiYzogbG9jYWxidXNAZmZlMDUwMDAgewogCQlyYW5nZXMgPSA8MHgwIDB4MCAweDAgMHhlODAwMDAwMCAweDA4MDAwMDAwCiAJCQkgIDB4MSAweDAgMHgwIDB4ZTAwMDAwMDAgMHgwODAwMDAwMAogCQkJICAweDIgMHgwIDB4MCAweGZmYTAwMDAwIDB4MDAwNDAwMDAKQEAgLTQwLDIwMyArMjcsMTggQEAKIAkJCSAgMHg0IDB4MCAweDAgMHhmZmE0MDAwMCAweDAwMDQwMDAwCiAJCQkgIDB4NSAweDAgMHgwIDB4ZmZhODAwMDAgMHgwMDA0MDAwMAogCQkJICAweDYgMHgwIDB4MCAweGZmYWMwMDAwIDB4MDAwNDAwMDA+OwotCi0JCW5vckAwLDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiY2ZpLWZsYXNoIjsKLQkJCXJlZyA9IDwweDAgMHgwIDB4ODAwMDAwMD47Ci0JCQliYW5rLXdpZHRoID0gPDI+OwotCQkJZGV2aWNlLXdpZHRoID0gPDE+OwotCi0JCQlyYW1kaXNrQDAgewotCQkJCXJlZyA9IDwweDAgMHgwMzAwMDAwMD47Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQotCQkJZGlhZ25vc3RpY0AzMDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgwMzAwMDAwMCAweDAwZTAwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlkaW5rQDNlMDAwMDAgewotCQkJCXJlZyA9IDwweDAzZTAwMDAwIDB4MDAyMDAwMDA+OwotCQkJCXJlYWQtb25seTsKLQkJCX07Ci0KLQkJCWtlcm5lbEA0MDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgwNDAwMDAwMCAweDAwNDAwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlqZmZzMkA0NDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgwNDQwMDAwMCAweDAzYjAwMDAwPjsKLQkJCX07Ci0KLQkJCWR0YkA3ZjAwMDAwIHsKLQkJCQlyZWcgPSA8MHgwN2YwMDAwMCAweDAwMDgwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQl1LWJvb3RAN2Y4MDAwMCB7Ci0JCQkJcmVnID0gPDB4MDdmODAwMDAgMHgwMDA4MDAwMD47Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQkJfTsKLQotCQluYW5kQDIsMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxiYy1mY20tbmFuZCI7Ci0JCQlyZWcgPSA8MHgyIDB4MCAweDQwMDAwPjsKLQotCQkJdS1ib290QDAgewotCQkJCXJlZyA9IDwweDAgMHgwMjAwMDAwMD47Ci0JCQkJcmVhZC1vbmx5OwotCQkJfTsKLQotCQkJamZmczJAMjAwMDAwMCB7Ci0JCQkJcmVnID0gPDB4MDIwMDAwMDAgMHgxMDAwMDAwMD47Ci0JCQl9OwotCi0JCQlyYW1kaXNrQDEyMDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgxMjAwMDAwMCAweDA4MDAwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQlrZXJuZWxAMWEwMDAwMDAgewotCQkJCXJlZyA9IDwweDFhMDAwMDAwIDB4MDQwMDAwMDA+OwotCQkJfTsKLQotCQkJZHRiQDFlMDAwMDAwIHsKLQkJCQlyZWcgPSA8MHgxZTAwMDAwMCAweDAxMDAwMDAwPjsKLQkJCQlyZWFkLW9ubHk7Ci0JCQl9OwotCi0JCQllbXB0eUAxZjAwMDAwMCB7Ci0JCQkJcmVnID0gPDB4MWYwMDAwMDAgMHgyMTAwMDAwMD47Ci0JCQl9OwotCQl9OwotCi0JCWJvYXJkLWNvbnRyb2xAMywwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDIwZHMtZnBnYSIsICJmc2wsZnBnYS1uZ3BpeGlzIjsKLQkJCXJlZyA9IDwweDMgMHgwIDB4MzA+OwotCQl9OwotCi0JCW5hbmRANCwwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsYmMtZmNtLW5hbmQiOwotCQkJcmVnID0gPDB4NCAweDAgMHg0MDAwMD47Ci0JCX07Ci0KLQkJbmFuZEA1LDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxiYy1mY20tbmFuZCI7Ci0JCQlyZWcgPSA8MHg1IDB4MCAweDQwMDAwPjsKLQkJfTsKLQotCQluYW5kQDYsMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxlbGJjLWZjbS1uYW5kIjsKLQkJCXJlZyA9IDwweDYgMHgwIDB4NDAwMDA+OwotCQl9OworCQlyZWcgPSA8MCAweGZmZTA1MDAwIDAgMHgxMDAwPjsKIAl9OwogCi0Jc29jQGZmZTAwMDAwIHsKLQotCQl1c2JAMjIwMDAgewotCQkJcGh5X3R5cGUgPSAidWxwaSI7Ci0JCX07Ci0KLQkJbWRpb0AyNDUyMCB7Ci0JCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzIDE+OwotCQkJCXJlZyA9IDwweDA+OwotCQkJfTsKLQkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMgMT47Ci0JCQkJcmVnID0gPDB4MT47Ci0JCQl9OwotCQkJcGh5MjogZXRoZXJuZXQtcGh5QDIgewotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MyAxPjsKLQkJCQlyZWcgPSA8MHgyPjsKLQkJCX07Ci0JCQl0YmkwOiB0YmktcGh5QDExIHsKLQkJCQlyZWcgPSA8MHgxMT47Ci0JCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQl9OwotCi0JCX07Ci0KLQkJbWRpb0AyNTUyMCB7Ci0JCQl0YmkxOiB0YmktcGh5QDExIHsKLQkJCQlyZWcgPSA8MHgxMT47Ci0JCQkJZGV2aWNlX3R5cGUgPSAidGJpLXBoeSI7Ci0JCQl9OwotCQl9OwotCi0JCW1kaW9AMjY1MjAgewotCQkJdGJpMjogdGJpLXBoeUAxMSB7Ci0JCQkJcmVnID0gPDB4MTE+OwotCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwotCQkJfTsKLQotCQl9OwotCi0JCXB0cF9jbG9ja0AyNEUwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxldHNlYy1wdHAiOwotCQkJcmVnID0gPDB4MjRFMDAgMHhCMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDY4IDIgNjkgMiA3MCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZtcGljID47Ci0JCQlmc2wsdGNsay1wZXJpb2QgPSA8NT47Ci0JCQlmc2wsdG1yLXByc2MgPSA8MjAwPjsKLQkJCWZzbCx0bXItYWRkID0gPDB4Q0NDQ0NDQ0Q+OwotCQkJZnNsLHRtci1maXBlcjEgPSA8MHgzQjlBQzlGQj47Ci0JCQlmc2wsdG1yLWZpcGVyMiA9IDwweDAwMDE4NjlCPjsKLQkJCWZzbCxtYXgtYWRqID0gPDI0OTk5OTk5OT47Ci0JCX07Ci0KLQkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKLQkJCXRiaS1oYW5kbGUgPSA8JnRiaTA+OwotCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQkJfTsKLQotCQllbmV0MTogZXRoZXJuZXRAMjUwMDAgewotCQkJdGJpLWhhbmRsZSA9IDwmdGJpMT47Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKLQkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCi0JCX07Ci0KLQkJZW5ldDI6IGV0aGVybmV0QDI2MDAwIHsKLQkJCXRiaS1oYW5kbGUgPSA8JnRiaTI+OwotCQkJcGh5LWhhbmRsZSA9IDwmcGh5Mj47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInJnbWlpLWlkIjsKLQkJfTsKLQotCi0JCW1zaUA0MTYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGljLW1zaSI7Ci0JCX07CisJYm9hcmRfc29jOiBzb2M6IHNvY0BmZmUwMDAwMCB7CisJCXJhbmdlcyA9IDwweDAgMHgwIDB4ZmZlMDAwMDAgMHgxMDAwMDA+OwogCX07CiAKLQlwY2kwOiBwY2llQGZmZTA4MDAwIHsKKwlwY2kyOiBwY2llQGZmZTA4MDAwIHsKIAkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMCAwIDB4ODAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKIAkJCSAgMHgxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDAgMHhmZmMwMDAwMCAweDAgMHgxMDAwMD47Ci0JCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMHgwIDB4MCAweDc+OwotCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJLyogSURTRUwgMHgwICovCi0JCQkwMDAwIDB4MCAweDAgMHgxICZtcGljIDB4OCAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDIgJm1waWMgMHg5IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MyAmbXBpYyAweGEgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHg0ICZtcGljIDB4YiAweDEKLQkJCT47CisJCXJlZyA9IDwwIDB4ZmZlMDgwMDAgMCAweDEwMDA+OwogCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7CiAJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCiAJCQkJICAweDIwMDAwMDAgMHgwIDB4ODAwMDAwMDAKIAkJCQkgIDB4MCAweDIwMDAwMDAwCkBAIC0yNDcsNjEgKzQ5LDExIEBACiAJCX07CiAJfTsKIAotCXBjaTE6IHBjaWVAZmZlMDkwMDAgeworCWJvYXJkX3BjaTE6IHBjaTE6IHBjaWVAZmZlMDkwMDAgewogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwIDAgMHhhMDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzEwMDAwIDB4MCAweDEwMDAwPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZmYwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0KLQkJCS8vIElEU0VMIDB4MTEgZnVuYyAwIC0gUENJIHNsb3QgMQotCQkJMHg4ODAwIDB4MCAweDAgMHgxICZpODI1OSAweDkgMHgyCi0JCQkweDg4MDAgMHgwIDB4MCAweDIgJmk4MjU5IDB4YSAweDIKLQotCQkJLy8gSURTRUwgMHgxMSBmdW5jIDEgLSBQQ0kgc2xvdCAxCi0JCQkweDg5MDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4OSAweDIKLQkJCTB4ODkwMCAweDAgMHgwIDB4MiAmaTgyNTkgMHhhIDB4MgotCi0JCQkvLyBJRFNFTCAweDExIGZ1bmMgMiAtIFBDSSBzbG90IDEKLQkJCTB4OGEwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg5IDB4MgotCQkJMHg4YTAwIDB4MCAweDAgMHgyICZpODI1OSAweGEgMHgyCi0KLQkJCS8vIElEU0VMIDB4MTEgZnVuYyAzIC0gUENJIHNsb3QgMQotCQkJMHg4YjAwIDB4MCAweDAgMHgxICZpODI1OSAweDkgMHgyCi0JCQkweDhiMDAgMHgwIDB4MCAweDIgJmk4MjU5IDB4YSAweDIKLQotCQkJLy8gSURTRUwgMHgxMSBmdW5jIDQgLSBQQ0kgc2xvdCAxCi0JCQkweDhjMDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4OSAweDIKLQkJCTB4OGMwMCAweDAgMHgwIDB4MiAmaTgyNTkgMHhhIDB4MgotCi0JCQkvLyBJRFNFTCAweDExIGZ1bmMgNSAtIFBDSSBzbG90IDEKLQkJCTB4OGQwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg5IDB4MgotCQkJMHg4ZDAwIDB4MCAweDAgMHgyICZpODI1OSAweGEgMHgyCi0KLQkJCS8vIElEU0VMIDB4MTEgZnVuYyA2IC0gUENJIHNsb3QgMQotCQkJMHg4ZTAwIDB4MCAweDAgMHgxICZpODI1OSAweDkgMHgyCi0JCQkweDhlMDAgMHgwIDB4MCAweDIgJmk4MjU5IDB4YSAweDIKLQotCQkJLy8gSURTRUwgMHgxMSBmdW5jIDcgLSBQQ0kgc2xvdCAxCi0JCQkweDhmMDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4OSAweDIKLQkJCTB4OGYwMCAweDAgMHgwIDB4MiAmaTgyNTkgMHhhIDB4MgotCi0JCQkvLyBJRFNFTCAweDFkICBBdWRpbwotCQkJMHhlODAwIDB4MCAweDAgMHgxICZpODI1OSAweDYgMHgyCi0KLQkJCS8vIElEU0VMIDB4MWUgTGVnYWN5Ci0JCQkweGYwMDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4NyAweDIKLQkJCTB4ZjEwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg3IDB4MgotCi0JCQkvLyBJRFNFTCAweDFmIElERS9TQVRBCi0JCQkweGY4MDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4ZSAweDIKLQkJCTB4ZjkwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg1IDB4MgotCQkJPjsKLQorCQlyZWcgPSA8MCAweGZmZTA5MDAwIDAgMHgxMDAwPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtMzA5LDg5ICs2MSwxNCBAQAogCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKIAkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCiAJCQkJICAweDAgMHgxMDAwMD47Ci0JCQl1bGkxNTc1QDAgewotCQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCi0JCQkJCSAgMHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCi0JCQkJCSAgMHgwIDB4MjAwMDAwMDAKLQotCQkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKLQkJCQkJICAweDAgMHgxMDAwMD47Ci0JCQkJaXNhQDFlIHsKLQkJCQkJZGV2aWNlX3R5cGUgPSAiaXNhIjsKLQkJCQkJI2ludGVycnVwdC1jZWxscyA9IDwyPjsKLQkJCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkJCQlyZWcgPSA8MHhmMDAwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkJCXJhbmdlcyA9IDwweDEgMHgwIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJCQkgIDB4MTAwMD47Ci0JCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jmk4MjU5PjsKLQotCQkJCQlpODI1OTogaW50ZXJydXB0LWNvbnRyb2xsZXJAMjAgewotCQkJCQkJcmVnID0gPDB4MSAweDIwIDB4MgotCQkJCQkJICAgICAgIDB4MSAweGEwIDB4MgotCQkJCQkJICAgICAgIDB4MSAweDRkMCAweDI+OwotCQkJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkJCQlkZXZpY2VfdHlwZSA9ICJpbnRlcnJ1cHQtY29udHJvbGxlciI7Ci0JCQkJCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47Ci0JCQkJCQljb21wYXRpYmxlID0gImNocnAsaWljIjsKLQkJCQkJCWludGVycnVwdHMgPSA8NCAxPjsKLQkJCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCQl9OwotCi0JCQkJCWk4MDQyQDYwIHsKLQkJCQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJCQlyZWcgPSA8MHgxIDB4NjAgMHgxIDB4MSAweDY0IDB4MT47Ci0JCQkJCQlpbnRlcnJ1cHRzID0gPDEgMyAxMiAzPjsKLQkJCQkJCWludGVycnVwdC1wYXJlbnQgPQotCQkJCQkJCTwmaTgyNTk+OwotCi0JCQkJCQlrZXlib2FyZEAwIHsKLQkJCQkJCQlyZWcgPSA8MHgwPjsKLQkJCQkJCQljb21wYXRpYmxlID0gInBucFBOUCwzMDMiOwotCQkJCQkJfTsKLQotCQkJCQkJbW91c2VAMSB7Ci0JCQkJCQkJcmVnID0gPDB4MT47Ci0JCQkJCQkJY29tcGF0aWJsZSA9ICJwbnBQTlAsZjAzIjsKLQkJCQkJCX07Ci0JCQkJCX07Ci0KLQkJCQkJcnRjQDcwIHsKLQkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGIwMCI7Ci0JCQkJCQlyZWcgPSA8MHgxIDB4NzAgMHgyPjsKLQkJCQkJfTsKLQotCQkJCQlncGlvQDQwMCB7Ci0JCQkJCQlyZWcgPSA8MHgxIDB4NDAwIDB4ODA+OwotCQkJCQl9OwotCQkJCX07Ci0JCQl9OwogCQl9OwotCiAJfTsKIAotCXBjaTI6IHBjaWVAZmZlMGEwMDAgeworCXBjaTA6IHBjaWVAZmZlMGEwMDAgewogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGMwMDAwMDAwIDAgMHhjMDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzIwMDAwIDB4MCAweDEwMDAwPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQotCQkJPjsKKwkJcmVnID0gPDAgMHhmZmUwYTAwMCAwIDB4MTAwMD47CiAJCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKIAkJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YzAwMDAwMDAKIAkJCQkgIDB4MjAwMDAwMCAweDAgMHhjMDAwMDAwMAogCQkJCSAgMHgwIDB4MjAwMDAwMDAKQEAgLTQwMiwzICs3OSwxMSBAQAogCQl9OwogCX07CiB9OworCisvKgorICogcDIwMjBkcy5kdHNpIG11c3QgYmUgbGFzdCB0byBlbnN1cmUgYm9hcmRfcGNpMCBvdmVycmlkZXMgcGNpMCBzZXR0aW5ncworICogZm9yIGludGVycnVwdC1tYXAgJiBpbnRlcnJ1cHQtbWFwLW1hc2sKKyAqLworCisvaW5jbHVkZS8gImZzbC9wMjAyMHNpLXBvc3QuZHRzaSIKKy9pbmNsdWRlLyAicDIwMjBkcy5kdHNpIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwZHMuZHRzaSBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMGRzLmR0c2kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjZjZjZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMGRzLmR0c2kKQEAgLTAsMCArMSwzMTYgQEAKKy8qCisgKiBQMjAyMERTIERldmljZSBUcmVlIFNvdXJjZSBzdHViIChubyBhZGRyZXNzZXMgb3IgdG9wLWxldmVsIHJhbmdlcykKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQorICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworJmJvYXJkX2xiYyB7CisJbm9yQDAsMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJjZmktZmxhc2giOworCQlyZWcgPSA8MHgwIDB4MCAweDgwMDAwMDA+OworCQliYW5rLXdpZHRoID0gPDI+OworCQlkZXZpY2Utd2lkdGggPSA8MT47CisKKwkJcmFtZGlza0AwIHsKKwkJCXJlZyA9IDwweDAgMHgwMzAwMDAwMD47CisJCQlyZWFkLW9ubHk7CisJCX07CisKKwkJZGlhZ25vc3RpY0AzMDAwMDAwIHsKKwkJCXJlZyA9IDwweDAzMDAwMDAwIDB4MDBlMDAwMDA+OworCQkJcmVhZC1vbmx5OworCQl9OworCisJCWRpbmtAM2UwMDAwMCB7CisJCQlyZWcgPSA8MHgwM2UwMDAwMCAweDAwMjAwMDAwPjsKKwkJCXJlYWQtb25seTsKKwkJfTsKKworCQlrZXJuZWxANDAwMDAwMCB7CisJCQlyZWcgPSA8MHgwNDAwMDAwMCAweDAwNDAwMDAwPjsKKwkJCXJlYWQtb25seTsKKwkJfTsKKworCQlqZmZzMkA0NDAwMDAwIHsKKwkJCXJlZyA9IDwweDA0NDAwMDAwIDB4MDNiMDAwMDA+OworCQl9OworCisJCWR0YkA3ZjAwMDAwIHsKKwkJCXJlZyA9IDwweDA3ZjAwMDAwIDB4MDAwODAwMDA+OworCQkJcmVhZC1vbmx5OworCQl9OworCisJCXUtYm9vdEA3ZjgwMDAwIHsKKwkJCXJlZyA9IDwweDA3ZjgwMDAwIDB4MDAwODAwMDA+OworCQkJcmVhZC1vbmx5OworCQl9OworCX07CisKKwluYW5kQDIsMCB7CisJCSNhZGRyZXNzLWNlbGxzID0gPDE+OworCQkjc2l6ZS1jZWxscyA9IDwxPjsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZWxiYy1mY20tbmFuZCI7CisJCXJlZyA9IDwweDIgMHgwIDB4NDAwMDA+OworCisJCXUtYm9vdEAwIHsKKwkJCXJlZyA9IDwweDAgMHgwMjAwMDAwMD47CisJCQlyZWFkLW9ubHk7CisJCX07CisKKwkJamZmczJAMjAwMDAwMCB7CisJCQlyZWcgPSA8MHgwMjAwMDAwMCAweDEwMDAwMDAwPjsKKwkJfTsKKworCQlyYW1kaXNrQDEyMDAwMDAwIHsKKwkJCXJlZyA9IDwweDEyMDAwMDAwIDB4MDgwMDAwMDA+OworCQkJcmVhZC1vbmx5OworCQl9OworCisJCWtlcm5lbEAxYTAwMDAwMCB7CisJCQlyZWcgPSA8MHgxYTAwMDAwMCAweDA0MDAwMDAwPjsKKwkJfTsKKworCQlkdGJAMWUwMDAwMDAgeworCQkJcmVnID0gPDB4MWUwMDAwMDAgMHgwMTAwMDAwMD47CisJCQlyZWFkLW9ubHk7CisJCX07CisKKwkJZW1wdHlAMWYwMDAwMDAgeworCQkJcmVnID0gPDB4MWYwMDAwMDAgMHgyMTAwMDAwMD47CisJCX07CisJfTsKKworCWJvYXJkLWNvbnRyb2xAMywwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wscDIwMjBkcy1mcGdhIiwgImZzbCxmcGdhLW5ncGl4aXMiOworCQlyZWcgPSA8MHgzIDB4MCAweDMwPjsKKwl9OworCisJbmFuZEA0LDAgeworCQljb21wYXRpYmxlID0gImZzbCxlbGJjLWZjbS1uYW5kIjsKKwkJcmVnID0gPDB4NCAweDAgMHg0MDAwMD47CisJfTsKKworCW5hbmRANSwwIHsKKwkJY29tcGF0aWJsZSA9ICJmc2wsZWxiYy1mY20tbmFuZCI7CisJCXJlZyA9IDwweDUgMHgwIDB4NDAwMDA+OworCX07CisKKwluYW5kQDYsMCB7CisJCWNvbXBhdGlibGUgPSAiZnNsLGVsYmMtZmNtLW5hbmQiOworCQlyZWcgPSA8MHg2IDB4MCAweDQwMDAwPjsKKwl9OworfTsKKworJmJvYXJkX3NvYyB7CisJdXNiQDIyMDAwIHsKKwkJcGh5X3R5cGUgPSAidWxwaSI7CisJfTsKKworCW1kaW9AMjQ1MjAgeworCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7CisJCQlpbnRlcnJ1cHRzID0gPDMgMSAwIDA+OworCQkJcmVnID0gPDB4MD47CisJCX07CisJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKKwkJCWludGVycnVwdHMgPSA8MyAxIDAgMD47CisJCQlyZWcgPSA8MHgxPjsKKwkJfTsKKwkJcGh5MjogZXRoZXJuZXQtcGh5QDIgeworCQkJaW50ZXJydXB0cyA9IDwzIDEgMCAwPjsKKwkJCXJlZyA9IDwweDI+OworCQl9OworCQl0YmkwOiB0YmktcGh5QDExIHsKKwkJCXJlZyA9IDwweDExPjsKKwkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQl9OworCisJfTsKKworCW1kaW9AMjU1MjAgeworCQl0YmkxOiB0YmktcGh5QDExIHsKKwkJCXJlZyA9IDwweDExPjsKKwkJCWRldmljZV90eXBlID0gInRiaS1waHkiOworCQl9OworCX07CisKKwltZGlvQDI2NTIwIHsKKwkJdGJpMjogdGJpLXBoeUAxMSB7CisJCQlyZWcgPSA8MHgxMT47CisJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKKwkJfTsKKworCX07CisKKwlwdHBfY2xvY2tAMjRlMDAgeworCQlmc2wsdGNsay1wZXJpb2QgPSA8NT47CisJCWZzbCx0bXItcHJzYyA9IDwyMDA+OworCQlmc2wsdG1yLWFkZCA9IDwweENDQ0NDQ0NEPjsKKwkJZnNsLHRtci1maXBlcjEgPSA8MHgzQjlBQzlGQj47CisJCWZzbCx0bXItZmlwZXIyID0gPDB4MDAwMTg2OUI+OworCQlmc2wsbWF4LWFkaiA9IDwyNDk5OTk5OTk+OworCX07CisKKwllbmV0MDogZXRoZXJuZXRAMjQwMDAgeworCQl0YmktaGFuZGxlID0gPCZ0YmkwPjsKKwkJcGh5LWhhbmRsZSA9IDwmcGh5MD47CisJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOworCX07CisKKwllbmV0MTogZXRoZXJuZXRAMjUwMDAgeworCQl0YmktaGFuZGxlID0gPCZ0YmkxPjsKKwkJcGh5LWhhbmRsZSA9IDwmcGh5MT47CisJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOworCisJfTsKKworCWVuZXQyOiBldGhlcm5ldEAyNjAwMCB7CisJCXRiaS1oYW5kbGUgPSA8JnRiaTI+OworCQlwaHktaGFuZGxlID0gPCZwaHkyPjsKKwkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7CisJfTsKK307CisKKyZib2FyZF9wY2kxIHsKKwlwY2llQDAgeworCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmZjAwIDB4MCAweDAgMHg3PjsKKwkJaW50ZXJydXB0LW1hcCA9IDwKKworCQkJLy8gSURTRUwgMHgxMSBmdW5jIDAgLSBQQ0kgc2xvdCAxCisJCQkweDg4MDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4OSAweDIKKwkJCTB4ODgwMCAweDAgMHgwIDB4MiAmaTgyNTkgMHhhIDB4MgorCisJCQkvLyBJRFNFTCAweDExIGZ1bmMgMSAtIFBDSSBzbG90IDEKKwkJCTB4ODkwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg5IDB4MgorCQkJMHg4OTAwIDB4MCAweDAgMHgyICZpODI1OSAweGEgMHgyCisKKwkJCS8vIElEU0VMIDB4MTEgZnVuYyAyIC0gUENJIHNsb3QgMQorCQkJMHg4YTAwIDB4MCAweDAgMHgxICZpODI1OSAweDkgMHgyCisJCQkweDhhMDAgMHgwIDB4MCAweDIgJmk4MjU5IDB4YSAweDIKKworCQkJLy8gSURTRUwgMHgxMSBmdW5jIDMgLSBQQ0kgc2xvdCAxCisJCQkweDhiMDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4OSAweDIKKwkJCTB4OGIwMCAweDAgMHgwIDB4MiAmaTgyNTkgMHhhIDB4MgorCisJCQkvLyBJRFNFTCAweDExIGZ1bmMgNCAtIFBDSSBzbG90IDEKKwkJCTB4OGMwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg5IDB4MgorCQkJMHg4YzAwIDB4MCAweDAgMHgyICZpODI1OSAweGEgMHgyCisKKwkJCS8vIElEU0VMIDB4MTEgZnVuYyA1IC0gUENJIHNsb3QgMQorCQkJMHg4ZDAwIDB4MCAweDAgMHgxICZpODI1OSAweDkgMHgyCisJCQkweDhkMDAgMHgwIDB4MCAweDIgJmk4MjU5IDB4YSAweDIKKworCQkJLy8gSURTRUwgMHgxMSBmdW5jIDYgLSBQQ0kgc2xvdCAxCisJCQkweDhlMDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4OSAweDIKKwkJCTB4OGUwMCAweDAgMHgwIDB4MiAmaTgyNTkgMHhhIDB4MgorCisJCQkvLyBJRFNFTCAweDExIGZ1bmMgNyAtIFBDSSBzbG90IDEKKwkJCTB4OGYwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg5IDB4MgorCQkJMHg4ZjAwIDB4MCAweDAgMHgyICZpODI1OSAweGEgMHgyCisKKwkJCS8vIElEU0VMIDB4MWQgIEF1ZGlvCisJCQkweGU4MDAgMHgwIDB4MCAweDEgJmk4MjU5IDB4NiAweDIKKworCQkJLy8gSURTRUwgMHgxZSBMZWdhY3kKKwkJCTB4ZjAwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHg3IDB4MgorCQkJMHhmMTAwIDB4MCAweDAgMHgxICZpODI1OSAweDcgMHgyCisKKwkJCS8vIElEU0VMIDB4MWYgSURFL1NBVEEKKwkJCTB4ZjgwMCAweDAgMHgwIDB4MSAmaTgyNTkgMHhlIDB4MgorCQkJMHhmOTAwIDB4MCAweDAgMHgxICZpODI1OSAweDUgMHgyCisJCQk+OworCisJCXVsaTE1NzVAMCB7CisJCQlyZWcgPSA8MHgwIDB4MCAweDAgMHgwIDB4MD47CisJCQkjc2l6ZS1jZWxscyA9IDwyPjsKKwkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OworCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAorCQkJCSAgMHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCisJCQkJICAweDAgMHgyMDAwMDAwMAorCisJCQkJICAweDEwMDAwMDAgMHgwIDB4MAorCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKKwkJCQkgIDB4MCAweDEwMDAwPjsKKwkJCWlzYUAxZSB7CisJCQkJZGV2aWNlX3R5cGUgPSAiaXNhIjsKKwkJCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OworCQkJCSNzaXplLWNlbGxzID0gPDE+OworCQkJCSNhZGRyZXNzLWNlbGxzID0gPDI+OworCQkJCXJlZyA9IDwweGYwMDAgMHgwIDB4MCAweDAgMHgwPjsKKwkJCQlyYW5nZXMgPSA8MHgxIDB4MCAweDEwMDAwMDAgMHgwIDB4MAorCQkJCQkgIDB4MTAwMD47CisJCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmaTgyNTk+OworCisJCQkJaTgyNTk6IGludGVycnVwdC1jb250cm9sbGVyQDIwIHsKKwkJCQkJcmVnID0gPDB4MSAweDIwIDB4MgorCQkJCQkgICAgICAgMHgxIDB4YTAgMHgyCisJCQkJCSAgICAgICAweDEgMHg0ZDAgMHgyPjsKKwkJCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7CisJCQkJCWRldmljZV90eXBlID0gImludGVycnVwdC1jb250cm9sbGVyIjsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47CisJCQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8Mj47CisJCQkJCWNvbXBhdGlibGUgPSAiY2hycCxpaWMiOworCQkJCQlpbnRlcnJ1cHRzID0gPDQgMSAwIDA+OworCQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCQl9OworCisJCQkJaTgwNDJANjAgeworCQkJCQkjc2l6ZS1jZWxscyA9IDwwPjsKKwkJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CisJCQkJCXJlZyA9IDwweDEgMHg2MCAweDEgMHgxIDB4NjQgMHgxPjsKKwkJCQkJaW50ZXJydXB0cyA9IDwxIDMgMTIgMz47CisJCQkJCWludGVycnVwdC1wYXJlbnQgPQorCQkJCQkJPCZpODI1OT47CisKKwkJCQkJa2V5Ym9hcmRAMCB7CisJCQkJCQlyZWcgPSA8MHgwPjsKKwkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLDMwMyI7CisJCQkJCX07CisKKwkJCQkJbW91c2VAMSB7CisJCQkJCQlyZWcgPSA8MHgxPjsKKwkJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGYwMyI7CisJCQkJCX07CisJCQkJfTsKKworCQkJCXJ0Y0A3MCB7CisJCQkJCWNvbXBhdGlibGUgPSAicG5wUE5QLGIwMCI7CisJCQkJCXJlZyA9IDwweDEgMHg3MCAweDI+OworCQkJCX07CisKKwkJCQlncGlvQDQwMCB7CisJCQkJCXJlZyA9IDwweDEgMHg0MDAgMHg4MD47CisJCQkJfTsKKwkJCX07CisJCX07CisJfTsKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwMjByZGIuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwcmRiLmR0cwppbmRleCAxZDdhMDVmLi4yNjc1OWE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwMjByZGIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMHJkYi5kdHMKQEAgLTksNyArOSw3IEBACiAgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKLS9pbmNsdWRlLyAicDIwMjBzaS5kdHNpIgorL2luY2x1ZGUvICJmc2wvcDIwMjBzaS1wcmUuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiZnNsLFAyMDIwUkRCIjsKQEAgLTI5LDcgKzI5LDggQEAKIAkJZGV2aWNlX3R5cGUgPSAibWVtb3J5IjsKIAl9OwogCi0JbG9jYWxidXNAZmZlMDUwMDAgeworCWxiYzogbG9jYWxidXNAZmZlMDUwMDAgeworCQlyZWcgPSA8MCAweGZmZTA1MDAwIDAgMHgxMDAwPjsKIAogCQkvKiBOT1IgYW5kIE5BTkQgRmxhc2hlcyAqLwogCQlyYW5nZXMgPSA8MHgwIDB4MCAweDAgMHhlZjAwMDAwMCAweDAxMDAwMDAwCkBAIC0xNDAsNyArMTQxLDkgQEAKIAogCX07CiAKLQlzb2NAZmZlMDAwMDAgeworCXNvYzogc29jQGZmZTAwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MCAweDAgMHhmZmUwMDAwMCAweDEwMDAwMD47CisKIAkJaTJjQDMwMDAgewogCQkJcnRjQDY4IHsKIAkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzMzkiOwpAQCAtMTQ4LDE3ICsxNTEsMTMgQEAKIAkJCX07CiAJCX07CiAKLQlzcGlANzAwMCB7Ci0KLQkJZnNsX20yNXA4MEAwIHsKKwkJc3BpQDcwMDAgeworCQkJZmxhc2hAMCB7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CiAJCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZXNwaS1mbGFzaCI7CisJCQkJY29tcGF0aWJsZSA9ICJzcGFuc2lvbixzMjVzbDEyODAxIjsKIAkJCQlyZWcgPSA8MD47Ci0JCQkJbGludXgsbW9kYWxpYXMgPSAiZnNsX20yNXA4MCI7Ci0JCQkJbW9kYWwgPSAiczI1c2wxMjhiIjsKIAkJCQlzcGktbWF4LWZyZXF1ZW5jeSA9IDw1MDAwMDAwMD47Ci0JCQkJbW9kZSA9IDwwPjsKIAogCQkJCXBhcnRpdGlvbkAwIHsKIAkJCQkJLyogNTEyS0IgZm9yIHUtYm9vdCBCb290bG9hZGVyIEltYWdlICovCkBAIC0yMDIsMTUgKzIwMSwxNyBAQAogCiAJCW1kaW9AMjQ1MjAgewogCQkJcGh5MDogZXRoZXJuZXQtcGh5QDAgewotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MyAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMgMSAwIDA+OwogCQkJCXJlZyA9IDwweDA+OwotCQkJCX07CisJCQl9OwogCQkJcGh5MTogZXRoZXJuZXQtcGh5QDEgewotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MyAxPjsKKwkJCQlpbnRlcnJ1cHRzID0gPDMgMSAwIDA+OwogCQkJCXJlZyA9IDwweDE+OwotCQkJCX07CisJCQl9OworCQkJdGJpLXBoeUAyIHsKKwkJCQlkZXZpY2VfdHlwZSA9ICJ0YmktcGh5IjsKKwkJCQlyZWcgPSA8MHgyPjsKKwkJCX07CiAJCX07CiAKIAkJbWRpb0AyNTUyMCB7CkBAIC0yMjQsMTEgKzIyNSw3IEBACiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCXB0cF9jbG9ja0AyNEUwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxldHNlYy1wdHAiOwotCQkJcmVnID0gPDB4MjRFMDAgMHhCMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDY4IDIgNjkgMiA3MCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8ICZtcGljID47CisJCXB0cF9jbG9ja0AyNGUwMCB7CiAJCQlmc2wsdGNsay1wZXJpb2QgPSA8NT47CiAJCQlmc2wsdG1yLXByc2MgPSA8MjAwPjsKIAkJCWZzbCx0bXItYWRkID0gPDB4Q0NDQ0NDQ0Q+OwpAQCAtMjUyLDI5ICsyNDksMTggQEAKIAkJCXBoeS1oYW5kbGUgPSA8JnBoeTE+OwogCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7CiAJCX07Ci0KIAl9OwogCiAJcGNpMDogcGNpZUBmZmUwODAwMCB7CisJCXJlZyA9IDwwIDB4ZmZlMDgwMDAgMCAweDEwMDA+OwogCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCX07CiAKIAlwY2kxOiBwY2llQGZmZTA5MDAwIHsKKwkJcmVnID0gPDAgMHhmZmUwOTAwMCAwIDB4MTAwMD47CiAJCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMCAweGEwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZmZjMTAwMDAgMHgwIDB4MTAwMDA+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDQgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4NSAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHg2IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDcgMHgxCi0JCQk+OwotCQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOworCQlwY2llQDAgewogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHhhMDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtMjg2LDIxICsyNzIsMTAgQEAKIAl9OwogCiAJcGNpMjogcGNpZUBmZmUwYTAwMCB7CisJCXJlZyA9IDwwIDB4ZmZlMGEwMDAgMCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDAgMHg4MDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzAwMDAwIDB4MCAweDEwMDAwPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQotCQkJPjsKIAkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwogCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMAogCQkJCSAgMHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCiAJCQkJICAweDAgMHgyMDAwMDAwMApAQCAtMzExLDMgKzI4Niw1IEBACiAJCX07CiAJfTsKIH07CisKKy9pbmNsdWRlLyAiZnNsL3AyMDIwc2ktcG9zdC5kdHNpIgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwcmRiX2NhbXBfY29yZTAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwcmRiX2NhbXBfY29yZTAuZHRzCmluZGV4IGZjOGRkZGQuLjY2YWFjODYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMHJkYl9jYW1wX2NvcmUwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwMjByZGJfY2FtcF9jb3JlMC5kdHMKQEAgLTE0LDI4ICsxNCwxNiBAQAogICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICAqLwogCi0vaW5jbHVkZS8gInAyMDIwc2kuZHRzaSIKKy9pbmNsdWRlLyAicDIwMjByZGIuZHRzIgogCiAvIHsKIAltb2RlbCA9ICJmc2wsUDIwMjBSREIiOwogCWNvbXBhdGlibGUgPSAiZnNsLFAyMDIwUkRCIiwgImZzbCxNUEM4NVhYUkRCLUNBTVAiOwogCi0JYWxpYXNlcyB7Ci0JCWV0aGVybmV0MSA9ICZlbmV0MTsKLQkJZXRoZXJuZXQyID0gJmVuZXQyOwotCQlzZXJpYWwwID0gJnNlcmlhbDA7Ci0JCXBjaTAgPSAmcGNpMDsKLQl9OwotCiAJY3B1cyB7CiAJCVBvd2VyUEMsUDIwMjBAMSB7Ci0JCXN0YXR1cyA9ICJkaXNhYmxlZCI7CisJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwotCi0JfTsKLQotCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7CiAJfTsKIAogCWxvY2FsYnVzQGZmZTA1MDAwIHsKQEAgLTQzLDExNSArMzEsMTggQEAKIAl9OwogCiAJc29jQGZmZTAwMDAwIHsKLQkJaTJjQDMwMDAgewotCQkJcnRjQDY4IHsKLQkJCQljb21wYXRpYmxlID0gImRhbGxhcyxkczEzMzkiOwotCQkJCXJlZyA9IDwweDY4PjsKLQkJCX07Ci0JCX07Ci0KIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQlzcGlANzAwMCB7Ci0KLQkJCWZzbF9tMjVwODBAMCB7Ci0JCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZXNwaS1mbGFzaCI7Ci0JCQkJcmVnID0gPDA+OwotCQkJCWxpbnV4LG1vZGFsaWFzID0gImZzbF9tMjVwODAiOwotCQkJCW1vZGFsID0gInMyNXNsMTI4YiI7Ci0JCQkJc3BpLW1heC1mcmVxdWVuY3kgPSA8NTAwMDAwMDA+OwotCQkJCW1vZGUgPSA8MD47Ci0KLQkJCQlwYXJ0aXRpb25AMCB7Ci0JCQkJCS8qIDUxMktCIGZvciB1LWJvb3QgQm9vdGxvYWRlciBJbWFnZSAqLwotCQkJCQlyZWcgPSA8MHgwIDB4MDAwODAwMDA+OwotCQkJCQlsYWJlbCA9ICJTUEkgKFJPKSBVLUJvb3QgSW1hZ2UiOwotCQkJCQlyZWFkLW9ubHk7Ci0JCQkJfTsKLQotCQkJCXBhcnRpdGlvbkA4MDAwMCB7Ci0JCQkJCS8qIDUxMktCIGZvciBEVEIgSW1hZ2UgKi8KLQkJCQkJcmVnID0gPDB4MDAwODAwMDAgMHgwMDA4MDAwMD47Ci0JCQkJCWxhYmVsID0gIlNQSSAoUk8pIERUQiBJbWFnZSI7Ci0JCQkJCXJlYWQtb25seTsKLQkJCQl9OwotCi0JCQkJcGFydGl0aW9uQDEwMDAwMCB7Ci0JCQkJCS8qIDRNQiBmb3IgTGludXggS2VybmVsIEltYWdlICovCi0JCQkJCXJlZyA9IDwweDAwMTAwMDAwIDB4MDA0MDAwMDA+OwotCQkJCQlsYWJlbCA9ICJTUEkgKFJPKSBMaW51eCBLZXJuZWwgSW1hZ2UiOwotCQkJCQlyZWFkLW9ubHk7Ci0JCQkJfTsKLQotCQkJCXBhcnRpdGlvbkA1MDAwMDAgewotCQkJCQkvKiA0TUIgZm9yIENvbXByZXNzZWQgUkZTIEltYWdlICovCi0JCQkJCXJlZyA9IDwweDAwNTAwMDAwIDB4MDA0MDAwMDA+OwotCQkJCQlsYWJlbCA9ICJTUEkgKFJPKSBDb21wcmVzc2VkIFJGUyBJbWFnZSI7Ci0JCQkJCXJlYWQtb25seTsKLQkJCQl9OwotCi0JCQkJcGFydGl0aW9uQDkwMDAwMCB7Ci0JCQkJCS8qIDdNQiBmb3IgSkZGUzIgYmFzZWQgUkZTICovCi0JCQkJCXJlZyA9IDwweDAwOTAwMDAwIDB4MDA3MDAwMDA+OwotCQkJCQlsYWJlbCA9ICJTUEkgKFJXKSBKRkZTMiBSRlMiOwotCQkJCX07Ci0JCQl9OwotCQl9OwotCiAJCWRtYUBjMzAwIHsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJdXNiQDIyMDAwIHsKLQkJCXBoeV90eXBlID0gInVscGkiOwotCQl9OwotCi0JCW1kaW9AMjQ1MjAgewotCi0JCQlwaHkwOiBldGhlcm5ldC1waHlAMCB7Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzIDE+OwotCQkJCXJlZyA9IDwweDA+OwotCQkJfTsKLQkJCXBoeTE6IGV0aGVybmV0LXBoeUAxIHsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMgMT47Ci0JCQkJcmVnID0gPDB4MT47Ci0JCQl9OwotCQl9OwotCi0JCW1kaW9AMjU1MjAgewotCQkJdGJpMDogdGJpLXBoeUAxMSB7Ci0JCQkJcmVnID0gPDB4MTE+OwotCQkJCWRldmljZV90eXBlID0gInRiaS1waHkiOwotCQkJfTsKLQkJfTsKLQotCQltZGlvQDI2NTIwIHsKLQkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7Ci0JCX07Ci0KIAkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAKLQkJZW5ldDE6IGV0aGVybmV0QDI1MDAwIHsKLQkJCXRiaS1oYW5kbGUgPSA8JnRiaTA+OwotCQkJcGh5LWhhbmRsZSA9IDwmcGh5MD47Ci0JCQlwaHktY29ubmVjdGlvbi10eXBlID0gInNnbWlpIjsKLQotCQl9OwotCi0JCWVuZXQyOiBldGhlcm5ldEAyNjAwMCB7Ci0JCQlwaHktaGFuZGxlID0gPCZwaHkxPjsKLQkJCXBoeS1jb25uZWN0aW9uLXR5cGUgPSAicmdtaWktaWQiOwotCQl9OwotCi0KIAkJbXBpYzogcGljQDQwMDAwIHsKIAkJCXByb3RlY3RlZC1zb3VyY2VzID0gPAogCQkJNDIgNzYgNzcgNzggNzkgLyogc2VyaWFsMSAsIGRtYTIgKi8KQEAgLTE2NCw0MCArNTUsMTIgQEAKIAkJbXNpQDQxNjAwIHsKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07Ci0KLQogCX07CiAKIAlwY2kwOiBwY2llQGZmZTA4MDAwIHsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwogCi0JcGNpMTogcGNpZUBmZmUwOTAwMCB7Ci0JCXJhbmdlcyA9IDwweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAgMCAweGEwMDAwMDAwIDB4MCAweDIwMDAwMDAwCi0JCQkgIDB4MTAwMDAwMCAweDAgMHgwMDAwMDAwMCAwIDB4ZmZjMTAwMDAgMHgwIDB4MTAwMDA+OwotCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDB4MCAweDAgMHg3PjsKLQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCS8qIElEU0VMIDB4MCAqLwotCQkJMDAwMCAweDAgMHgwIDB4MSAmbXBpYyAweDQgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgyICZtcGljIDB4NSAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDMgJm1waWMgMHg2IDB4MQotCQkJMDAwMCAweDAgMHgwIDB4NCAmbXBpYyAweDcgMHgxCi0JCQk+OwotCQlwY2llQDAgewotCQkJcmVnID0gPDB4MCAweDAgMHgwIDB4MCAweDA+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweGEwMDAwMDAwCi0JCQkJICAweDIwMDAwMDAgMHgwIDB4YTAwMDAwMDAKLQkJCQkgIDB4MCAweDIwMDAwMDAwCi0KLQkJCQkgIDB4MTAwMDAwMCAweDAgMHgwCi0JCQkJICAweDEwMDAwMDAgMHgwIDB4MAotCQkJCSAgMHgwIDB4MTAwMDAwPjsKLQkJfTsKLQl9OwotCiAJcGNpMjogcGNpZUBmZmUwYTAwMCB7CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMHJkYl9jYW1wX2NvcmUxLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjAyMHJkYl9jYW1wX2NvcmUxLmR0cwppbmRleCAyNjFjMzRiLi45YmQ4ZWY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwMjByZGJfY2FtcF9jb3JlMS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwcmRiX2NhbXBfY29yZTEuZHRzCkBAIC0xNSwyOCArMTUsMTggQEAKICAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAgKi8KIAotL2luY2x1ZGUvICJwMjAyMHNpLmR0c2kiCisvaW5jbHVkZS8gInAyMDIwcmRiLmR0cyIKIAogLyB7CiAJbW9kZWwgPSAiZnNsLFAyMDIwUkRCIjsKIAljb21wYXRpYmxlID0gImZzbCxQMjAyMFJEQiIsICJmc2wsTVBDODVYWFJEQi1DQU1QIjsKIAotCWFsaWFzZXMgewotCQlldGhlcm5ldDAgPSAmZW5ldDA7Ci0JCXNlcmlhbDAgPSAmc2VyaWFsMTsKLQkJcGNpMSA9ICZwY2kxOwotCX07Ci0KIAljcHVzIHsKIAkJUG93ZXJQQyxQMjAyMEAwIHsKLQkJc3RhdHVzID0gImRpc2FibGVkIjsKKwkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CiAJfTsKIAotCW1lbW9yeSB7Ci0JCWRldmljZV90eXBlID0gIm1lbW9yeSI7Ci0JfTsKLQogCWxvY2FsYnVzQGZmZTA1MDAwIHsKIAkJc3RhdHVzID0gImRpc2FibGVkIjsKIAl9OwpAQCAtNzAsNTUgKzYwLDEwIEBACiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCWRtYUBjMzAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYSI7Ci0JCQlyZWcgPSA8MHhjMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4YzEwMCAweDIwMD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZG1hLWNoYW5uZWxAMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NzYgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw3NyAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NzggMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDc5IDI+OwotCQkJfTsKLQkJfTsKLQogCQlncGlvOiBncGlvLWNvbnRyb2xsZXJAZjAwMCB7CiAJCQlzdGF0dXMgPSAiZGlzYWJsZWQiOwogCQl9OwogCi0JCUwyOiBsMi1jYWNoZS1jb250cm9sbGVyQDIwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDIwLWwyLWNhY2hlLWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4MjAwMDAgMHgxMDAwPjsKLQkJCWNhY2hlLWxpbmUtc2l6ZSA9IDwzMj47CS8vIDMyIGJ5dGVzCi0JCQljYWNoZS1zaXplID0gPDB4ODAwMDA+OyAvLyBMMiw1MTJLCi0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQogCQlkbWFAMjEzMDAgewogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKQEAgLTEzOSwxMiArODQsNiBAQAogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKIAotCQllbmV0MDogZXRoZXJuZXRAMjQwMDAgewotCQkJZml4ZWQtbGluayA9IDwxIDEgMTAwMCAwIDA+OwotCQkJcGh5LWNvbm5lY3Rpb24tdHlwZSA9ICJyZ21paS1pZCI7Ci0KLQkJfTsKLQogCQllbmV0MTogZXRoZXJuZXRAMjUwMDAgewogCQkJc3RhdHVzID0gImRpc2FibGVkIjsKIAkJfTsKQEAgLTE3MCwyMiArMTA5LDYgQEAKIAkJCT47CiAJCX07CiAKLQkJbXNpQDQxNjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDIwLW1zaSIsICJmc2wsbXBpYy1tc2kiOwotCQkJcmVnID0gPDB4NDE2MDAgMHg4MD47Ci0JCQltc2ktYXZhaWxhYmxlLXJhbmdlcyA9IDwwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8Ci0JCQkJMHhlMCAwCi0JCQkJMHhlMSAwCi0JCQkJMHhlMiAwCi0JCQkJMHhlMyAwCi0JCQkJMHhlNCAwCi0JCQkJMHhlNSAwCi0JCQkJMHhlNiAwCi0JCQkJMHhlNyAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCiAJCWdsb2JhbC11dGlsaXRpZXNAZTAwMDAgewkvL2dsb2JhbCB1dGlsaXRpZXMgYmxvY2sKIAkJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJCX07CkBAIC0xOTksMzAgKzEyMiw0IEBACiAJcGNpMTogcGNpZUBmZmUwOTAwMCB7CiAJCXN0YXR1cyA9ICJkaXNhYmxlZCI7CiAJfTsKLQotCXBjaTI6IHBjaWVAZmZlMGEwMDAgewotCQlyYW5nZXMgPSA8MHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwIDAgMHg4MDAwMDAwMCAweDAgMHgyMDAwMDAwMAotCQkJICAweDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMCAweGZmYzAwMDAwIDB4MCAweDEwMDAwPjsKLQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAweDAgMHgwIDB4Nz47Ci0JCWludGVycnVwdC1tYXAgPSA8Ci0JCQkvKiBJRFNFTCAweDAgKi8KLQkJCTAwMDAgMHgwIDB4MCAweDEgJm1waWMgMHgwIDB4MQotCQkJMDAwMCAweDAgMHgwIDB4MiAmbXBpYyAweDEgMHgxCi0JCQkwMDAwIDB4MCAweDAgMHgzICZtcGljIDB4MiAweDEKLQkJCTAwMDAgMHgwIDB4MCAweDQgJm1waWMgMHgzIDB4MQotCQkJPjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwweDAgMHgwIDB4MCAweDAgMHgwPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJcmFuZ2VzID0gPDB4MjAwMDAwMCAweDAgMHg4MDAwMDAwMAotCQkJCSAgMHgyMDAwMDAwIDB4MCAweDgwMDAwMDAwCi0JCQkJICAweDAgMHgyMDAwMDAwMAotCi0JCQkJICAweDEwMDAwMDAgMHgwIDB4MAotCQkJCSAgMHgxMDAwMDAwIDB4MCAweDAKLQkJCQkgIDB4MCAweDEwMDAwMD47Ci0JCX07Ci0JfTsKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwMjBzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDIwc2kuZHRzaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRlZjE3Zi4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwMjBzaS5kdHNpCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qCi0gKiBQMjAyMCBEZXZpY2UgVHJlZSBTb3VyY2UKLSAqCi0gKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgotICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqLwotCi0vZHRzLXYxLzsKLS8gewotCWNvbXBhdGlibGUgPSAiZnNsLFAyMDIwIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkjc2l6ZS1jZWxscyA9IDwyPjsKLQotCWNwdXMgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MD47Ci0KLQkJUG93ZXJQQyxQMjAyMEAwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MHgwPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyPjsKLQkJfTsKLQotCQlQb3dlclBDLFAyMDIwQDEgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwweDE+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDI+OwotCQl9OwotCX07Ci0KLQlsb2NhbGJ1c0BmZmUwNTAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDIwMjAtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKLQkJcmVnID0gPDAgMHhmZmUwNTAwMCAwIDB4MTAwMD47Ci0JCWludGVycnVwdHMgPSA8MTkgMj47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCX07Ci0KLQlzb2NAZmZlMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWRldmljZV90eXBlID0gInNvYyI7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAyMDIwLWltbXIiLCAic2ltcGxlLWJ1cyI7Ci0JCXJhbmdlcyA9IDwweDAgIDB4MCAweGZmZTAwMDAwIDB4MTAwMDAwPjsKLQkJYnVzLWZyZXF1ZW5jeSA9IDwwPjsJCS8vIEZpbGxlZCBvdXQgYnkgdWJvb3QuCi0KLQkJZWNtLWxhd0AwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGVjbS1sYXciOwotCQkJcmVnID0gPDB4MCAweDEwMDA+OwotCQkJZnNsLG51bS1sYXdzID0gPDEyPjsKLQkJfTsKLQotCQllY21AMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1lY20iLCAiZnNsLGVjbSI7Ci0JCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDE3IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCX07Ci0KLQkJbWVtb3J5LWNvbnRyb2xsZXJAMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1tZW1vcnktY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWludGVycnVwdHMgPSA8MTggMj47Ci0JCX07Ci0KLQkJaTJjQDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MzAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQzIDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMzEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgzMTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8NDMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCXNwaUA3MDAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZXNwaSI7Ci0JCQlyZWcgPSA8MHg3MDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDU5IDB4Mj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCW1vZGUgPSAiY3B1IjsKLQkJfTsKLQotCQlkbWFAYzMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4YzMwMCAweDQ+OwotCQkJcmFuZ2VzID0gPDB4MCAweGMxMDAgMHgyMDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRtYS1jaGFubmVsQDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDc2IDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8NzcgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDc4IDI+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDE4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw3OSAyPjsKLQkJCX07Ci0JCX07Ci0KLQkJZ3BpbzogZ3Bpby1jb250cm9sbGVyQGYwMDAgewotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTcyLWdwaW8iOwotCQkJcmVnID0gPDB4ZjAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQ3IDB4Mj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJfTsKLQotCQlMMjogbDItY2FjaGUtY29udHJvbGxlckAyMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1sMi1jYWNoZS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDIwMDAwIDB4MTAwMD47Ci0JCQljYWNoZS1saW5lLXNpemUgPSA8MzI+OwkvLyAzMiBieXRlcwotCQkJY2FjaGUtc2l6ZSA9IDwweDgwMDAwPjsgLy8gTDIsNTEySwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDI+OwotCQl9OwotCi0JCWRtYUAyMTMwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MjEzMDAgMHg0PjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyMTEwMCAweDIwMD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZG1hLWNoYW5uZWxAMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDA+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjAgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDwyMSAyPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDEwMCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDI+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8MjIgMj47Ci0JCQl9OwotCQkJZG1hLWNoYW5uZWxAMTgwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxODAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDIzIDI+OwotCQkJfTsKLQkJfTsKLQotCQl1c2JAMjIwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLXVzYjItZHIiOwotCQkJcmVnID0gPDB4MjIwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDwyOCAweDI+OwotCQl9OwotCi0JCW1kaW9AMjQ1MjAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGdpYW5mYXItbWRpbyI7Ci0JCQlyZWcgPSA8MHgyNDUyMCAweDIwPjsKLQkJfTsKLQotCQltZGlvQDI1NTIwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7Ci0JCQlyZWcgPSA8MHgyNjUyMCAweDIwPjsKLQkJfTsKLQotCQltZGlvQDI2NTIwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbCxnaWFuZmFyLXRiaSI7Ci0JCQlyZWcgPSA8MHg1MjAgMHgyMD47Ci0JCX07Ci0KLQkJZW5ldDA6IGV0aGVybmV0QDI0MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAibmV0d29yayI7Ci0JCQltb2RlbCA9ICJlVFNFQyI7Ci0JCQljb21wYXRpYmxlID0gImdpYW5mYXIiOwotCQkJcmVnID0gPDB4MjQwMDAgMHgxMDAwPjsKLQkJCXJhbmdlcyA9IDwweDAgMHgyNDAwMCAweDEwMDA+OwotCQkJbG9jYWwtbWFjLWFkZHJlc3MgPSBbIDAwIDAwIDAwIDAwIDAwIDAwIF07Ci0JCQlpbnRlcnJ1cHRzID0gPDI5IDIgMzAgMiAzNCAyPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQl9OwotCi0JCWVuZXQxOiBldGhlcm5ldEAyNTAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI1MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjUwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwzNSAyIDM2IDIgNDAgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQotCQl9OwotCi0JCWVuZXQyOiBldGhlcm5ldEAyNjAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCWRldmljZV90eXBlID0gIm5ldHdvcmsiOwotCQkJbW9kZWwgPSAiZVRTRUMiOwotCQkJY29tcGF0aWJsZSA9ICJnaWFuZmFyIjsKLQkJCXJlZyA9IDwweDI2MDAwIDB4MTAwMD47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MjYwMDAgMHgxMDAwPjsKLQkJCWxvY2FsLW1hYy1hZGRyZXNzID0gWyAwMCAwMCAwMCAwMCAwMCAwMCBdOwotCQkJaW50ZXJydXB0cyA9IDwzMSAyIDMyIDIgMzMgMj47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQotCQl9OwotCi0JCXNkaGNpQDJlMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDIwLWVzZGhjIiwgImZzbCxlc2RoYyI7Ci0JCQlyZWcgPSA8MHgyZTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw3MiAweDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkvKiBGaWxsZWQgaW4gYnkgVS1Cb290ICovCi0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCX07Ci0KLQkJY3J5cHRvQDMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYzMuMSIsICJmc2wsc2VjMy4wIiwgImZzbCxzZWMyLjQiLAotCQkJCSAgICAgImZzbCxzZWMyLjIiLCAiZnNsLHNlYzIuMSIsICJmc2wsc2VjMi4wIjsKLQkJCXJlZyA9IDwweDMwMDAwIDB4MTAwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0NSAyIDU4IDI+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlmc2wsbnVtLWNoYW5uZWxzID0gPDQ+OwotCQkJZnNsLGNoYW5uZWwtZmlmby1sZW4gPSA8MjQ+OwotCQkJZnNsLGV4ZWMtdW5pdHMtbWFzayA9IDwweGJmZT47Ci0JCQlmc2wsZGVzY3JpcHRvci10eXBlcy1tYXNrID0gPDB4M2FiMGViZj47Ci0JCX07Ci0KLQkJbXBpYzogcGljQDQwMDAwIHsKLQkJCWludGVycnVwdC1jb250cm9sbGVyOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDI+OwotCQkJcmVnID0gPDB4NDAwMDAgMHg0MDAwMD47Ci0JCQljb21wYXRpYmxlID0gImNocnAsb3Blbi1waWMiOwotCQkJZGV2aWNlX3R5cGUgPSAib3Blbi1waWMiOwotCQl9OwotCi0JCW1zaUA0MTYwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1tc2kiLCAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4ODA+OwotCQkJbXNpLWF2YWlsYWJsZS1yYW5nZXMgPSA8MCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTB4ZTAgMAotCQkJCTB4ZTEgMAotCQkJCTB4ZTIgMAotCQkJCTB4ZTMgMAotCQkJCTB4ZTQgMAotCQkJCTB4ZTUgMAotCQkJCTB4ZTYgMAotCQkJCTB4ZTcgMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJfTsKLQotCQlnbG9iYWwtdXRpbGl0aWVzQGUwMDAwIHsJLy9nbG9iYWwgdXRpbGl0aWVzIGJsb2NrCi0JCQljb21wYXRpYmxlID0gImZzbCxwMjAyMC1ndXRzIjsKLQkJCXJlZyA9IDwweGUwMDAwIDB4MTAwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwotCQl9OwotCX07Ci0KLQlwY2kwOiBwY2llQGZmZTA4MDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wsbXBjODU0OC1wY2llIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlyZWcgPSA8MCAweGZmZTA4MDAwIDAgMHgxMDAwPjsKLQkJYnVzLXJhbmdlID0gPDAgMjU1PjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDMzMzMzMzMzPjsKLQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCWludGVycnVwdHMgPSA8MjQgMj47Ci0JfTsKLQotCXBjaTE6IHBjaWVAZmZlMDkwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCXJlZyA9IDwwIDB4ZmZlMDkwMDAgMCAweDEwMDA+OwotCQlidXMtcmFuZ2UgPSA8MCAyNTU+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJaW50ZXJydXB0cyA9IDwyNSAyPjsKLQl9OwotCi0JcGNpMjogcGNpZUBmZmUwYTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLG1wYzg1NDgtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJcmVnID0gPDAgMHhmZmUwYTAwMCAwIDB4MTAwMD47Ci0JCWJ1cy1yYW5nZSA9IDwwIDI1NT47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQlpbnRlcnJ1cHRzID0gPDI2IDI+OwotCX07Ci19OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQxcmRiLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMjA0MXJkYi5kdHMKaW5kZXggNzliNjg5NS4uNGY5NTdkYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQxcmRiLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDFyZGIuZHRzCkBAIC0zMiw3ICszMiw3IEBACiAgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0vaW5jbHVkZS8gInAyMDQxc2kuZHRzaSIKKy9pbmNsdWRlLyAiZnNsL3AyMDQxc2ktcHJlLmR0c2kiCiAKIC8gewogCW1vZGVsID0gImZzbCxQMjA0MVJEQiI7CkBAIC01MCw2ICs1MCw4IEBACiAJfTsKIAogCXNvYzogc29jQGZmZTAwMDAwMCB7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweGZlMDAwMDAwIDB4MTAwMDAwMD47CisJCXJlZyA9IDwweGYgMHhmZTAwMDAwMCAwIDB4MDAwMDEwMDA+OwogCQlzcGlAMTEwMDAwIHsKIAkJCWZsYXNoQDAgewogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwpAQCAtMTA2LDcgKzEwOCwxOCBAQAogCQl9OwogCX07CiAKLQlsb2NhbGJ1c0BmZmUxMjQwMDAgeworCXJpbzogcmFwaWRpb0BmZmUwYzAwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUwYzAwMDAgMCAweDExMDAwPjsKKworCQlwb3J0MSB7CisJCQlyYW5nZXMgPSA8MCAwIDB4YyAweDIwMDAwMDAwIDAgMHgxMDAwMDAwMD47CisJCX07CisJCXBvcnQyIHsKKwkJCXJhbmdlcyA9IDwwIDAgMHhjIDB4MzAwMDAwMDAgMCAweDEwMDAwMDAwPjsKKwkJfTsKKwl9OworCisJbGJjOiBsb2NhbGJ1c0BmZmUxMjQwMDAgewogCQlyZWcgPSA8MHhmIDB4ZmUxMjQwMDAgMCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDA+OwogCkBAIC0xMjIsNiArMTM1LDcgQEAKIAkJcmVnID0gPDB4ZiAweGZlMjAwMDAwIDAgMHgxMDAwPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDAwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4ZiAweGY4MDAwMDAwIDB4MCAweDAwMDEwMDAwPjsKKwkJZnNsLG1zaSA9IDwmbXNpMD47CiAJCXBjaWVAMCB7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCkBAIC0xMzcsNiArMTUxLDcgQEAKIAkJcmVnID0gPDB4ZiAweGZlMjAxMDAwIDAgMHgxMDAwPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAgMHhjIDB4MjAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmODAxMDAwMCAweDAgMHgwMDAxMDAwMD47CisJCWZzbCxtc2kgPSA8Jm1zaTE+OwogCQlwY2llQDAgewogCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCiAJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMApAQCAtMTUyLDYgKzE2Nyw3IEBACiAJCXJlZyA9IDwweGYgMHhmZTIwMjAwMCAwIDB4MTAwMD47CiAJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHg0MDAwMDAwMCAwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMjAwMDAgMCAweDAwMDEwMDAwPjsKKwkJZnNsLG1zaSA9IDwmbXNpMj47CiAJCXBjaWVAMCB7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCkBAIC0xNjMsMyArMTc5LDUgQEAKIAkJfTsKIAl9OwogfTsKKworL2luY2x1ZGUvICJmc2wvcDIwNDFzaS1wb3N0LmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDFzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AyMDQxc2kuZHRzaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc0OTJlZC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDIwNDFzaS5kdHNpCisrKyAvZGV2L251bGwKQEAgLTEsNjkyICswLDAgQEAKLS8qCi0gKiBQMjA0MSBTaWxpY29uIERldmljZSBUcmVlIFNvdXJjZQotICoKLSAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICoKLSAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICogbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vZHRzLXYxLzsKLQotLyB7Ci0JY29tcGF0aWJsZSA9ICJmc2wsUDIwNDEiOwotCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCSNzaXplLWNlbGxzID0gPDI+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCi0JYWxpYXNlcyB7Ci0JCWNjc3IgPSAmc29jOwotCQlkY3NyID0gJmRjc3I7Ci0KLQkJc2VyaWFsMCA9ICZzZXJpYWwwOwotCQlzZXJpYWwxID0gJnNlcmlhbDE7Ci0JCXNlcmlhbDIgPSAmc2VyaWFsMjsKLQkJc2VyaWFsMyA9ICZzZXJpYWwzOwotCQlwY2kwID0gJnBjaTA7Ci0JCXBjaTEgPSAmcGNpMTsKLQkJcGNpMiA9ICZwY2kyOwotCQl1c2IwID0gJnVzYjA7Ci0JCXVzYjEgPSAmdXNiMTsKLQkJZG1hMCA9ICZkbWEwOwotCQlkbWExID0gJmRtYTE7Ci0JCXNkaGMgPSAmc2RoYzsKLQkJbXNpMCA9ICZtc2kwOwotCQltc2kxID0gJm1zaTE7Ci0JCW1zaTIgPSAmbXNpMjsKLQotCQljcnlwdG8gPSAmY3J5cHRvOwotCQlzZWNfanIwID0gJnNlY19qcjA7Ci0JCXNlY19qcjEgPSAmc2VjX2pyMTsKLQkJc2VjX2pyMiA9ICZzZWNfanIyOwotCQlzZWNfanIzID0gJnNlY19qcjM7Ci0JCXJ0aWNfYSA9ICZydGljX2E7Ci0JCXJ0aWNfYiA9ICZydGljX2I7Ci0JCXJ0aWNfYyA9ICZydGljX2M7Ci0JCXJ0aWNfZCA9ICZydGljX2Q7Ci0JCXNlY19tb24gPSAmc2VjX21vbjsKLQl9OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQljcHUwOiBQb3dlclBDLGU1MDBtY0AwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKLQkJCUwyXzA6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQkJY3B1MTogUG93ZXJQQyxlNTAwbWNAMSB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDE+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47Ci0JCQlMMl8xOiBsMi1jYWNoZSB7Ci0JCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKLQkJCX07Ci0JCX07Ci0JCWNwdTI6IFBvd2VyUEMsZTUwMG1jQDIgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwyPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzI+OwotCQkJTDJfMjogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCQljcHUzOiBQb3dlclBDLGU1MDBtY0AzIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8Mz47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKLQkJCUwyXzM6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQl9OwotCi0JZGNzcjogZGNzckBmMDAwMDAwMDAgewotCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCWNvbXBhdGlibGUgPSAiZnNsLGRjc3IiLCAic2ltcGxlLWJ1cyI7Ci0KLQkJZGNzci1lcHVAMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWVwdSI7Ci0JCQlpbnRlcnJ1cHRzID0gPDUyIDIgMCAwCi0JCQkJICAgICAgODQgMiAwIDAKLQkJCQkgICAgICA4NSAyIDAgMD47Ci0JCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCXJlZyA9IDwweDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1ucGMgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ucGMiOwotCQkJcmVnID0gPDB4MTAwMCAweDEwMDAgMHgxMDAwMDAwIDB4ODAwMD47Ci0JCX07Ci0JCWRjc3ItbnhjQDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1ueGMiOwotCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLWNvcmVuZXQgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1jb3JlbmV0IjsKLQkJCXJlZyA9IDwweDgwMDAgMHgxMDAwIDB4QjAwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1kcGFhQDkwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZGNzci1kcGFhIiwgImZzbCxkY3NyLWRwYWEiOwotCQkJcmVnID0gPDB4OTAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLW9jbkAxMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kY3NyLW9jbiIsICJmc2wsZGNzci1vY24iOwotCQkJcmVnID0gPDB4MTEwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1kZHJAMTIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1kZHIiOwotCQkJZGV2LWhhbmRsZSA9IDwmZGRyPjsKLQkJCXJlZyA9IDwweDEyMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItbmFsQDE4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRjc3ItbmFsIiwgImZzbCxkY3NyLW5hbCI7Ci0JCQlyZWcgPSA8MHgxODAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLXJjcG1AMjIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZGNzci1yY3BtIiwgImZzbCxkY3NyLXJjcG0iOwotCQkJcmVnID0gPDB4MjIwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1jcHUtc2ItcHJveHlANDAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKLQkJCWNwdS1oYW5kbGUgPSA8JmNwdTA+OwotCQkJcmVnID0gPDB4NDAwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1jcHUtc2ItcHJveHlANDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKLQkJCWNwdS1oYW5kbGUgPSA8JmNwdTE+OwotCQkJcmVnID0gPDB4NDEwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1jcHUtc2ItcHJveHlANDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKLQkJCWNwdS1oYW5kbGUgPSA8JmNwdTI+OwotCQkJcmVnID0gPDB4NDIwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1jcHUtc2ItcHJveHlANDMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKLQkJCWNwdS1oYW5kbGUgPSA8JmNwdTM+OwotCQkJcmVnID0gPDB4NDMwMDAgMHgxMDAwPjsKLQkJfTsKLQl9OwotCi0Jc29jOiBzb2NAZmZlMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOwotCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHhmZTAwMDAwMCAweDEwMDAwMDA+OwotCQlyZWcgPSA8MHhmIDB4ZmUwMDAwMDAgMCAweDAwMDAxMDAwPjsKLQotCQlzb2Mtc3JhbS1lcnJvciB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzb2Mtc3JhbS1lcnJvciI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyOT47Ci0JCX07Ci0KLQkJY29yZW5ldC1sYXdAMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MzI+OwotCQl9OwotCi0JCWRkcjogbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC41IiwgImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMz47Ci0JCX07Ci0KLQkJY3BjOiBsMy1jYWNoZS1jb250cm9sbGVyQDEwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiZnNsLHA0MDgwLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiY2FjaGUiOwotCQkJcmVnID0gPDB4MTAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI3PjsKLQkJfTsKLQotCQljb3JlbmV0LWNmQDE4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtY2YiOwotCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDMxPjsKLQkJCWZzbCxjY2YtbnVtLWNzZGlkcyA9IDwzMj47Ci0JCQlmc2wsY2NmLW51bS1zbm9vcGlkcyA9IDwzMj47Ci0JCX07Ci0KLQkJaW9tbXVAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscGFtdS12MS4wIiwgImZzbCxwYW11IjsKLQkJCXJlZyA9IDwweDIwMDAwIDB4NDAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTI0IDIgMCAwCi0JCQkJMTYgMiAxIDMwPjsKLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8ND47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMiLCAiY2hycCxvcGVuLXBpYyI7Ci0JCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7Ci0JCX07Ci0KLQkJbXNpMDogbXNpQDQxNjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAgMCAwCi0JCQkJMHhlMSAwIDAgMAotCQkJCTB4ZTIgMCAwIDAKLQkJCQkweGUzIDAgMCAwCi0JCQkJMHhlNCAwIDAgMAotCQkJCTB4ZTUgMCAwIDAKLQkJCQkweGU2IDAgMCAwCi0JCQkJMHhlNyAwIDAgMD47Ci0JCX07Ci0KLQkJbXNpMTogbXNpQDQxODAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxODAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGU4IDAgMCAwCi0JCQkJMHhlOSAwIDAgMAotCQkJCTB4ZWEgMCAwIDAKLQkJCQkweGViIDAgMCAwCi0JCQkJMHhlYyAwIDAgMAotCQkJCTB4ZWQgMCAwIDAKLQkJCQkweGVlIDAgMCAwCi0JCQkJMHhlZiAwIDAgMD47Ci0JCX07Ci0KLQkJbXNpMjogbXNpQDQxYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxYTAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGYwIDAgMCAwCi0JCQkJMHhmMSAwIDAgMAotCQkJCTB4ZjIgMCAwIDAKLQkJCQkweGYzIDAgMCAwCi0JCQkJMHhmNCAwIDAgMAotCQkJCTB4ZjUgMCAwIDAKLQkJCQkweGY2IDAgMCAwCi0JCQkJMHhmNyAwIDAgMD47Ci0JCX07Ci0KLQkJZ3V0czogZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1kZXZpY2UtY29uZmlnLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMDAwMCAweGUwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwotCQkJI3NsZWVwLWNlbGxzID0gPDE+OwotCQkJZnNsLGxpb2RuLWJpdHMgPSA8MTI+OwotCQl9OwotCi0JCXBpbnM6IGdsb2JhbC11dGlsaXRpZXNAZTBlMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcGluLWNvbnRyb2wtMS4wIjsKLQkJCXJlZyA9IDwweGUwZTAwIDB4MjAwPjsKLQkJCSNzbGVlcC1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMS4wIjsKLQkJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCX07Ci0KLQkJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1yY3BtLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMjAwMCAweDEwMDA+OwotCQkJI3NsZWVwLWNlbGxzID0gPDE+OwotCQl9OwotCi0JCXNmcDogc2ZwQGU4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXNmcCIsICJmc2wscW9yaXEtc2ZwLTEuMCI7Ci0JCQlyZWcJICAgPSA8MHhlODAwMCAweDEwMDA+OwotCQl9OwotCi0JCXNlcmRlczogc2VyZGVzQGVhMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLXNlcmRlcyI7Ci0JCQlyZWcJICAgPSA8MHhlYTAwMCAweDEwMDA+OwotCQl9OwotCi0JCWRtYTA6IGRtYUAxMDAzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAwMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAwMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDI4IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8MjkgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMwIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAyIDAgMD47Ci0JCQl9OwotCQl9OwotCi0JCWRtYTE6IGRtYUAxMDEzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAxMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAxMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8MzMgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM0IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAyIDAgMD47Ci0JCQl9OwotCQl9OwotCi0JCXNwaUAxMTAwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWVzcGkiLCAiZnNsLG1wYzg1MzYtZXNwaSI7Ci0JCQlyZWcgPSA8MHgxMTAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NTMgMHgyIDAgMD47Ci0JCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47Ci0JCX07Ci0KLQkJc2RoYzogc2RoY0AxMTQwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZXNkaGMiLCAiZnNsLGVzZGhjIjsKLQkJCXJlZyA9IDwweDExNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0OCAyIDAgMD47Ci0JCQlzZGhjaSxhdXRvLWNtZDEyOwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQl9OwotCi0JCWkyY0AxMTgwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE4MDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzggMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJaTJjQDExODEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTgxMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMTE5MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDExOTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM5IDIgMCAwPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWkyY0AxMTkxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE5MTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJc2VyaWFsMDogc2VyaWFsQDExYzUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWM1MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMTogc2VyaWFsQDExYzYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWM2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMjogc2VyaWFsQDExZDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWQ1MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMzogc2VyaWFsQDExZDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWQ2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47Ci0JCX07Ci0KLQkJZ3BpbzA6IGdwaW9AMTMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAyMDQxLWdwaW8iLCAiZnNsLHFvcmlxLWdwaW8iOwotCQkJcmVnID0gPDB4MTMwMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDU1IDIgMCAwPjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQl9OwotCi0JCXVzYjA6IHVzYkAyMTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtdXNiMi1tcGgiLAotCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1tcGgiLCAiZnNsLXVzYjItbXBoIjsKLQkJCXJlZyA9IDwweDIxMDAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDQgMHgyIDAgMD47Ci0JCQlwaHlfdHlwZSA9ICJ1dG1pIjsKLQkJCXBvcnQwOwotCQl9OwotCi0JCXVzYjE6IHVzYkAyMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtdXNiMi1kciIsCi0JCQkJCSJmc2wsbXBjODV4eC11c2IyLWRyIiwgImZzbC11c2IyLWRyIjsKLQkJCXJlZyA9IDwweDIxMTAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDUgMHgyIDAgMD47Ci0JCQlwaHlfdHlwZSA9ICJ1dG1pIjsKLQkJfTsKLQotCQlzYXRhQDIyMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1zYXRhIiwgImZzbCxwcS1zYXRhLXYyIjsKLQkJCXJlZyA9IDwweDIyMDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw2OCAweDIgMCAwPjsKLQkJfTsKLQotCQlzYXRhQDIyMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1zYXRhIiwgImZzbCxwcS1zYXRhLXYyIjsKLQkJCXJlZyA9IDwweDIyMTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw2OSAweDIgMCAwPjsKLQkJfTsKLQotCQljcnlwdG86IGNyeXB0b0AzMDAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjIiLCAiZnNsLHNlYy12NC4wIjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQlyZWcgPSA8MHgzMDAwMDAgMHgxMDAwMD47Ci0JCQlyYW5nZXMgPSA8MCAweDMwMDAwMCAweDEwMDAwPjsKLQkJCWludGVycnVwdHMgPSA8OTIgMiAwIDA+OwotCi0JCQlzZWNfanIwOiBqckAxMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8ODggMiAwIDA+OwotCQkJfTsKLQotCQkJc2VjX2pyMToganJAMjAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAotCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOwotCQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDg5IDIgMCAwPjsKLQkJCX07Ci0KLQkJCXNlY19qcjI6IGpyQDMwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKLQkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHgzMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDw5MCAyIDAgMD47Ci0JCQl9OwotCi0JCQlzZWNfanIzOiBqckA0MDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4NDAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8OTEgMiAwIDA+OwotCQkJfTsKLQotCQkJcnRpY0A2MDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljIiwKLQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMiOwotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCXJlZyA9IDwweDYwMDAgMHgxMDA+OwotCQkJCXJhbmdlcyA9IDwweDAgMHg2MTAwIDB4ZTAwPjsKLQotCQkJCXJ0aWNfYTogcnRpYy1hQDAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCi0JCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHgwMCAweDIwIDB4MTAwIDB4ODA+OwotCQkJCX07Ci0KLQkJCQlydGljX2I6IHJ0aWMtYkAyMCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKLQkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDIwIDB4MjAgMHgyMDAgMHg4MD47Ci0JCQkJfTsKLQotCQkJCXJ0aWNfYzogcnRpYy1jQDQwIHsKLQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAotCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4NDAgMHgyMCAweDMwMCAweDgwPjsKLQkJCQl9OwotCi0JCQkJcnRpY19kOiBydGljLWRANjAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCi0JCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHg2MCAweDIwIDB4NTAwIDB4ODA+OwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCXNlY19tb246IHNlY19tb25AMzE0MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLW1vbiIsICJmc2wsc2VjLXY0LjAtbW9uIjsKLQkJCXJlZyA9IDwweDMxNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw5MyAyIDAgMD47Ci0JCX07Ci0KLQl9OwotCi0JbG9jYWxidXNAZmZlMTI0MDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKLQkJaW50ZXJydXB0cyA9IDwyNSAyIDAgMD47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQl9OwotCi0JcGNpMDogcGNpZUBmZmUyMDAwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWZzbCxtc2kgPSA8Jm1zaTA+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47Ci0JCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MCAwIDAgMCAwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKLQkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwotCQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCQkvKiBJRFNFTCAweDAgKi8KLQkJCQkwMDAwIDAgMCAxICZtcGljIDQwIDEgMCAwCi0JCQkJMDAwMCAwIDAgMiAmbXBpYyAxIDEgMCAwCi0JCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEgMCAwCi0JCQkJMDAwMCAwIDAgNCAmbXBpYyAzIDEgMCAwCi0JCQkJPjsKLQkJfTsKLQl9OwotCi0JcGNpMTogcGNpZUBmZmUyMDEwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwMjA0MS1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWJ1cy1yYW5nZSA9IDwwIDB4ZmY+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlmc2wsbXNpID0gPCZtc2kxPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OwotCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47Ci0JCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJCWludGVycnVwdC1tYXAgPSA8Ci0JCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAotCQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxIDAgMAotCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxIDAgMAotCQkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAotCQkJCT47Ci0JCX07Ci0JfTsKLQotCXBjaTI6IHBjaWVAZmZlMjAyMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDIwNDEtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlmc2wsbXNpID0gPCZtc2kyPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTM+OwotCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMz47Ci0JCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJCWludGVycnVwdC1tYXAgPSA8Ci0JCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0MiAxIDAgMAotCQkJCTAwMDAgMCAwIDIgJm1waWMgOSAxIDAgMAotCQkJCTAwMDAgMCAwIDMgJm1waWMgMTAgMSAwIDAKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDExIDEgMCAwCi0JCQkJPjsKLQkJfTsKLQl9OwotfTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MWRzLmR0cwppbmRleCBiYmQxMTNiLi5mNDY5MTQ1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNDFkcy5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDQxZHMuZHRzCkBAIC0zMiw3ICszMiw3IEBACiAgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0vaW5jbHVkZS8gInAzMDQxc2kuZHRzaSIKKy9pbmNsdWRlLyAiZnNsL3AzMDQxc2ktcHJlLmR0c2kiCiAKIC8gewogCW1vZGVsID0gImZzbCxQMzA0MURTIjsKQEAgLTUwLDYgKzUwLDggQEAKIAl9OwogCiAJc29jOiBzb2NAZmZlMDAwMDAwIHsKKwkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmIDB4ZmUwMDAwMDAgMHgxMDAwMDAwPjsKKwkJcmVnID0gPDB4ZiAweGZlMDAwMDAwIDAgMHgwMDAwMTAwMD47CiAJCXNwaUAxMTAwMDAgewogCQkJZmxhc2hAMCB7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CkBAIC05OSw3ICsxMDEsMTggQEAKIAkJfTsKIAl9OwogCi0JbG9jYWxidXNAZmZlMTI0MDAwIHsKKwlyaW86IHJhcGlkaW9AZmZlMGMwMDAwIHsKKwkJcmVnID0gPDB4ZiAweGZlMGMwMDAwIDAgMHgxMTAwMD47CisKKwkJcG9ydDEgeworCQkJcmFuZ2VzID0gPDAgMCAweGMgMHgyMDAwMDAwMCAwIDB4MTAwMDAwMDA+OworCQl9OworCQlwb3J0MiB7CisJCQlyYW5nZXMgPSA8MCAwIDB4YyAweDMwMDAwMDAwIDAgMHgxMDAwMDAwMD47CisJCX07CisJfTsKKworCWxiYzogbG9jYWxidXNAZmZlMTI0MDAwIHsKIAkJcmVnID0gPDB4ZiAweGZlMTI0MDAwIDAgMHgxMDAwPjsKIAkJcmFuZ2VzID0gPDAgMCAweGYgMHhlODAwMDAwMCAweDA4MDAwMDAwCiAJCQkgIDIgMCAweGYgMHhmZmEwMDAwMCAweDAwMDQwMDAwCkBAIC0xNjAsNiArMTczLDcgQEAKIAkJcmVnID0gPDB4ZiAweGZlMjAwMDAwIDAgMHgxMDAwPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDAwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4ZiAweGY4MDAwMDAwIDB4MCAweDAwMDEwMDAwPjsKKwkJZnNsLG1zaSA9IDwmbXNpMD47CiAJCXBjaWVAMCB7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCkBAIC0xNzUsNiArMTg5LDcgQEAKIAkJcmVnID0gPDB4ZiAweGZlMjAxMDAwIDAgMHgxMDAwPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAgMHhjIDB4MjAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmODAxMDAwMCAweDAgMHgwMDAxMDAwMD47CisJCWZzbCxtc2kgPSA8Jm1zaTE+OwogCQlwY2llQDAgewogCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCiAJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMApAQCAtMTkwLDYgKzIwNSw3IEBACiAJCXJlZyA9IDwweGYgMHhmZTIwMjAwMCAwIDB4MTAwMD47CiAJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHg0MDAwMDAwMCAwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMjAwMDAgMCAweDAwMDEwMDAwPjsKKwkJZnNsLG1zaSA9IDwmbXNpMj47CiAJCXBjaWVAMCB7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCkBAIC0yMDUsNiArMjIxLDcgQEAKIAkJcmVnID0gPDB4ZiAweGZlMjAzMDAwIDAgMHgxMDAwPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDYwMDAwMDAwIDAgMHgyMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDAgMHgwMDAwMDAwMCAweGYgMHhmODAzMDAwMCAwIDB4MDAwMTAwMDA+OworCQlmc2wsbXNpID0gPCZtc2kyPjsKIAkJcGNpZUAwIHsKIAkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAogCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKQEAgLTIxNiwzICsyMzMsNSBAQAogCQl9OwogCX07CiB9OworCisvaW5jbHVkZS8gImZzbC9wMzA0MXNpLXBvc3QuZHRzaSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MXNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNDFzaS5kdHNpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzEzMGI3Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA0MXNpLmR0c2kKKysrIC9kZXYvbnVsbApAQCAtMSw3MjkgKzAsMCBAQAotLyoKLSAqIFAzMDQxIFNpbGljb24gRGV2aWNlIFRyZWUgU291cmNlCi0gKgotICogQ29weXJpZ2h0IDIwMTAtMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqCi0gKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAqIGxhdGVyIHZlcnNpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotL2R0cy12MS87Ci0KLS8gewotCWNvbXBhdGlibGUgPSAiZnNsLFAzMDQxIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkjc2l6ZS1jZWxscyA9IDwyPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQotCWFsaWFzZXMgewotCQljY3NyID0gJnNvYzsKLQkJZGNzciA9ICZkY3NyOwotCi0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlzZXJpYWwyID0gJnNlcmlhbDI7Ci0JCXNlcmlhbDMgPSAmc2VyaWFsMzsKLQkJcGNpMCA9ICZwY2kwOwotCQlwY2kxID0gJnBjaTE7Ci0JCXBjaTIgPSAmcGNpMjsKLQkJcGNpMyA9ICZwY2kzOwotCQl1c2IwID0gJnVzYjA7Ci0JCXVzYjEgPSAmdXNiMTsKLQkJZG1hMCA9ICZkbWEwOwotCQlkbWExID0gJmRtYTE7Ci0JCXNkaGMgPSAmc2RoYzsKLQkJbXNpMCA9ICZtc2kwOwotCQltc2kxID0gJm1zaTE7Ci0JCW1zaTIgPSAmbXNpMjsKLQotCQljcnlwdG8gPSAmY3J5cHRvOwotCQlzZWNfanIwID0gJnNlY19qcjA7Ci0JCXNlY19qcjEgPSAmc2VjX2pyMTsKLQkJc2VjX2pyMiA9ICZzZWNfanIyOwotCQlzZWNfanIzID0gJnNlY19qcjM7Ci0JCXJ0aWNfYSA9ICZydGljX2E7Ci0JCXJ0aWNfYiA9ICZydGljX2I7Ci0JCXJ0aWNfYyA9ICZydGljX2M7Ci0JCXJ0aWNfZCA9ICZydGljX2Q7Ci0JCXNlY19tb24gPSAmc2VjX21vbjsKLQotLyoKLQkJcmlvMCA9ICZyYXBpZGlvMDsKLSAqLwotCX07Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCWNwdTA6IFBvd2VyUEMsZTUwMG1jQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OwotCQkJTDJfMDogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCQljcHUxOiBQb3dlclBDLGU1MDBtY0AxIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MT47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKLQkJCUwyXzE6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQkJY3B1MjogUG93ZXJQQyxlNTAwbWNAMiB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDI+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMj47Ci0JCQlMMl8yOiBsMi1jYWNoZSB7Ci0JCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKLQkJCX07Ci0JCX07Ci0JCWNwdTM6IFBvd2VyUEMsZTUwMG1jQDMgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwzPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzM+OwotCQkJTDJfMzogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCX07Ci0KLQlkY3NyOiBkY3NyQGYwMDAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzciIsICJzaW1wbGUtYnVzIjsKLQotCQlkY3NyLWVwdUAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZXB1IjsKLQkJCWludGVycnVwdHMgPSA8NTIgMiAwIDAKLQkJCQkgICAgICA4NCAyIDAgMAotCQkJCSAgICAgIDg1IDIgMCAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJcmVnID0gPDB4MCAweDEwMDA+OwotCQl9OwotCQlkY3NyLW5wYyB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW5wYyI7Ci0JCQlyZWcgPSA8MHgxMDAwIDB4MTAwMCAweDEwMDAwMDAgMHg4MDAwPjsKLQkJfTsKLQkJZGNzci1ueGNAMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW54YyI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY29yZW5ldCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWNvcmVuZXQiOwotCQkJcmVnID0gPDB4ODAwMCAweDEwMDAgMHhCMDAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLWRwYWFAOTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNDMwNDEtZGNzci1kcGFhIiwgImZzbCxkY3NyLWRwYWEiOwotCQkJcmVnID0gPDB4OTAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLW9jbkAxMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNDMwNDEtZGNzci1vY24iLCAiZnNsLGRjc3Itb2NuIjsKLQkJCXJlZyA9IDwweDExMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItZGRyQDEyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKLQkJCWRldi1oYW5kbGUgPSA8JmRkcj47Ci0JCQlyZWcgPSA8MHgxMjAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLW5hbEAxODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNDMwNDEtZGNzci1uYWwiLCAiZnNsLGRjc3ItbmFsIjsKLQkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItcmNwbUAyMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNDMwNDEtZGNzci1yY3BtIiwgImZzbCxkY3NyLXJjcG0iOwotCQkJcmVnID0gPDB4MjIwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1jcHUtc2ItcHJveHlANDAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKLQkJCWNwdS1oYW5kbGUgPSA8JmNwdTA+OwotCQkJcmVnID0gPDB4NDAwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1jcHUtc2ItcHJveHlANDEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKLQkJCWNwdS1oYW5kbGUgPSA8JmNwdTE+OwotCQkJcmVnID0gPDB4NDEwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1jcHUtc2ItcHJveHlANDIwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKLQkJCWNwdS1oYW5kbGUgPSA8JmNwdTI+OwotCQkJcmVnID0gPDB4NDIwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1jcHUtc2ItcHJveHlANDMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lNTAwbWMtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKLQkJCWNwdS1oYW5kbGUgPSA8JmNwdTM+OwotCQkJcmVnID0gPDB4NDMwMDAgMHgxMDAwPjsKLQkJfTsKLQl9OwotCi0Jc29jOiBzb2NAZmZlMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOwotCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHhmZTAwMDAwMCAweDEwMDAwMDA+OwotCQlyZWcgPSA8MHhmIDB4ZmUwMDAwMDAgMCAweDAwMDAxMDAwPjsKLQotCQlzb2Mtc3JhbS1lcnJvciB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzb2Mtc3JhbS1lcnJvciI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyOT47Ci0JCX07Ci0KLQkJY29yZW5ldC1sYXdAMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MzI+OwotCQl9OwotCi0JCWRkcjogbWVtb3J5LWNvbnRyb2xsZXJAODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlci12NC41IiwgImZzbCxxb3JpcS1tZW1vcnktY29udHJvbGxlciI7Ci0JCQlyZWcgPSA8MHg4MDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyMz47Ci0JCX07Ci0KLQkJY3BjOiBsMy1jYWNoZS1jb250cm9sbGVyQDEwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiZnNsLHA0MDgwLWwzLWNhY2hlLWNvbnRyb2xsZXIiLCAiY2FjaGUiOwotCQkJcmVnID0gPDB4MTAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI3PjsKLQkJfTsKLQotCQljb3JlbmV0LWNmQDE4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtY2YiOwotCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDMxPjsKLQkJCWZzbCxjY2YtbnVtLWNzZGlkcyA9IDwzMj47Ci0JCQlmc2wsY2NmLW51bS1zbm9vcGlkcyA9IDwzMj47Ci0JCX07Ci0KLQkJaW9tbXVAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscGFtdS12MS4wIiwgImZzbCxwYW11IjsKLQkJCXJlZyA9IDwweDIwMDAwIDB4NDAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTI0IDIgMCAwCi0JCQkJMTYgMiAxIDMwPjsKLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8ND47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMiLCAiY2hycCxvcGVuLXBpYyI7Ci0JCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7Ci0JCX07Ci0KLQkJbXNpMDogbXNpQDQxNjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAgMCAwCi0JCQkJMHhlMSAwIDAgMAotCQkJCTB4ZTIgMCAwIDAKLQkJCQkweGUzIDAgMCAwCi0JCQkJMHhlNCAwIDAgMAotCQkJCTB4ZTUgMCAwIDAKLQkJCQkweGU2IDAgMCAwCi0JCQkJMHhlNyAwIDAgMD47Ci0JCX07Ci0KLQkJbXNpMTogbXNpQDQxODAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxODAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGU4IDAgMCAwCi0JCQkJMHhlOSAwIDAgMAotCQkJCTB4ZWEgMCAwIDAKLQkJCQkweGViIDAgMCAwCi0JCQkJMHhlYyAwIDAgMAotCQkJCTB4ZWQgMCAwIDAKLQkJCQkweGVlIDAgMCAwCi0JCQkJMHhlZiAwIDAgMD47Ci0JCX07Ci0KLQkJbXNpMjogbXNpQDQxYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxYTAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGYwIDAgMCAwCi0JCQkJMHhmMSAwIDAgMAotCQkJCTB4ZjIgMCAwIDAKLQkJCQkweGYzIDAgMCAwCi0JCQkJMHhmNCAwIDAgMAotCQkJCTB4ZjUgMCAwIDAKLQkJCQkweGY2IDAgMCAwCi0JCQkJMHhmNyAwIDAgMD47Ci0JCX07Ci0KLQkJZ3V0czogZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1kZXZpY2UtY29uZmlnLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMDAwMCAweGUwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwotCQkJI3NsZWVwLWNlbGxzID0gPDE+OwotCQkJZnNsLGxpb2RuLWJpdHMgPSA8MTI+OwotCQl9OwotCi0JCXBpbnM6IGdsb2JhbC11dGlsaXRpZXNAZTBlMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcGluLWNvbnRyb2wtMS4wIjsKLQkJCXJlZyA9IDwweGUwZTAwIDB4MjAwPjsKLQkJCSNzbGVlcC1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMS4wIjsKLQkJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCX07Ci0KLQkJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1yY3BtLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMjAwMCAweDEwMDA+OwotCQkJI3NsZWVwLWNlbGxzID0gPDE+OwotCQl9OwotCi0JCXNmcDogc2ZwQGU4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXNmcCIsICJmc2wscW9yaXEtc2ZwLTEuMCI7Ci0JCQlyZWcJICAgPSA8MHhlODAwMCAweDEwMDA+OwotCQl9OwotCi0JCXNlcmRlczogc2VyZGVzQGVhMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXNlcmRlcyI7Ci0JCQlyZWcJICAgPSA8MHhlYTAwMCAweDEwMDA+OwotCQl9OwotCi0JCWRtYTA6IGRtYUAxMDAzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAwMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAwMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDI4IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8MjkgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMwIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAyIDAgMD47Ci0JCQl9OwotCQl9OwotCi0JCWRtYTE6IGRtYUAxMDEzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAxMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAxMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8MzMgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM0IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAyIDAgMD47Ci0JCQl9OwotCQl9OwotCi0JCXNwaUAxMTAwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWVzcGkiLCAiZnNsLG1wYzg1MzYtZXNwaSI7Ci0JCQlyZWcgPSA8MHgxMTAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NTMgMHgyIDAgMD47Ci0JCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47Ci0JCX07Ci0KLQkJc2RoYzogc2RoY0AxMTQwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtZXNkaGMiLCAiZnNsLGVzZGhjIjsKLQkJCXJlZyA9IDwweDExNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0OCAyIDAgMD47Ci0JCQlzZGhjaSxhdXRvLWNtZDEyOwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQl9OwotCi0JCWkyY0AxMTgwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE4MDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzggMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJaTJjQDExODEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTgxMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMTE5MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDExOTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM5IDIgMCAwPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWkyY0AxMTkxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE5MTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJc2VyaWFsMDogc2VyaWFsQDExYzUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWM1MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMTogc2VyaWFsQDExYzYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWM2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMjogc2VyaWFsQDExZDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWQ1MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMzogc2VyaWFsQDExZDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWQ2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47Ci0JCX07Ci0KLQkJZ3BpbzA6IGdwaW9AMTMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLWdwaW8iLCAiZnNsLHFvcmlxLWdwaW8iOwotCQkJcmVnID0gPDB4MTMwMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDU1IDIgMCAwPjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQl9OwotCi0JCXVzYjA6IHVzYkAyMTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtdXNiMi1tcGgiLAotCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1tcGgiLCAiZnNsLXVzYjItbXBoIjsKLQkJCXJlZyA9IDwweDIxMDAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDQgMHgyIDAgMD47Ci0JCQlwaHlfdHlwZSA9ICJ1dG1pIjsKLQkJCXBvcnQwOwotCQl9OwotCi0JCXVzYjE6IHVzYkAyMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtdXNiMi1kciIsCi0JCQkJCSJmc2wsbXBjODV4eC11c2IyLWRyIiwgImZzbC11c2IyLWRyIjsKLQkJCXJlZyA9IDwweDIxMTAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDUgMHgyIDAgMD47Ci0JCQlkcl9tb2RlID0gImhvc3QiOwotCQkJcGh5X3R5cGUgPSAidXRtaSI7Ci0JCX07Ci0KLQkJc2F0YUAyMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtc2F0YSIsICJmc2wscHEtc2F0YS12MiI7Ci0JCQlyZWcgPSA8MHgyMjAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NjggMHgyIDAgMD47Ci0JCX07Ci0KLQkJc2F0YUAyMjEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtc2F0YSIsICJmc2wscHEtc2F0YS12MiI7Ci0JCQlyZWcgPSA8MHgyMjEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NjkgMHgyIDAgMD47Ci0JCX07Ci0KLQkJY3J5cHRvOiBjcnlwdG9AMzAwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yIiwgImZzbCxzZWMtdjQuMCI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJcmVnCQkgPSA8MHgzMDAwMDAgMHgxMDAwMD47Ci0JCQlyYW5nZXMJCSA9IDwwIDB4MzAwMDAwIDB4MTAwMDA+OwotCQkJaW50ZXJydXB0cwkgPSA8OTIgMiAwIDA+OwotCi0JCQlzZWNfanIwOiBqckAxMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8ODggMiAwIDA+OwotCQkJfTsKLQotCQkJc2VjX2pyMToganJAMjAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAotCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOwotCQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDg5IDIgMCAwPjsKLQkJCX07Ci0KLQkJCXNlY19qcjI6IGpyQDMwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKLQkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHgzMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDw5MCAyIDAgMD47Ci0JCQl9OwotCi0JCQlzZWNfanIzOiBqckA0MDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4NDAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8OTEgMiAwIDA+OwotCQkJfTsKLQotCQkJcnRpY0A2MDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljIiwKLQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMiOwotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCXJlZyA9IDwweDYwMDAgMHgxMDA+OwotCQkJCXJhbmdlcyA9IDwweDAgMHg2MTAwIDB4ZTAwPjsKLQotCQkJCXJ0aWNfYTogcnRpYy1hQDAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCi0JCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHgwMCAweDIwIDB4MTAwIDB4ODA+OwotCQkJCX07Ci0KLQkJCQlydGljX2I6IHJ0aWMtYkAyMCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKLQkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDIwIDB4MjAgMHgyMDAgMHg4MD47Ci0JCQkJfTsKLQotCQkJCXJ0aWNfYzogcnRpYy1jQDQwIHsKLQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAotCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4NDAgMHgyMCAweDMwMCAweDgwPjsKLQkJCQl9OwotCi0JCQkJcnRpY19kOiBydGljLWRANjAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCi0JCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHg2MCAweDIwIDB4NTAwIDB4ODA+OwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCXNlY19tb246IHNlY19tb25AMzE0MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLW1vbiIsICJmc2wsc2VjLXY0LjAtbW9uIjsKLQkJCXJlZyA9IDwweDMxNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw5MyAyIDAgMD47Ci0JCX07Ci0JfTsKLQotLyoKLQlyYXBpZGlvMDogcmFwaWRpb0BmZmUwYzAwMDAKLSovCi0KLQlsb2NhbGJ1c0BmZmUxMjQwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwMzA0MS1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOwotCQlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCX07Ci0KLQlwY2kwOiBwY2llQGZmZTIwMDAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47Ci0JCWZzbCxtc2kgPSA8Jm1zaTA+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47Ci0KLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCS8qIElEU0VMIDB4MCAqLwotCQkJCTAwMDAgMCAwIDEgJm1waWMgNDAgMSAwIDAKLQkJCQkwMDAwIDAgMCAyICZtcGljIDEgMSAwIDAKLQkJCQkwMDAwIDAgMCAzICZtcGljIDIgMSAwIDAKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDMgMSAwIDAKLQkJCQk+OwotCQl9OwotCX07Ci0KLQlwY2kxOiBwY2llQGZmZTIwMTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHAzMDQxLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJYnVzLXJhbmdlID0gPDAgMHhmZj47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OwotCQlmc2wsbXNpID0gPCZtc2kxPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OwotCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47Ci0JCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJCWludGVycnVwdC1tYXAgPSA8Ci0JCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAotCQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxIDAgMAotCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxIDAgMAotCQkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAotCQkJCT47Ci0JCX07Ci0JfTsKLQotCXBjaTI6IHBjaWVAZmZlMjAyMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKLQkJZnNsLG1zaSA9IDwmbXNpMj47Ci0JCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTM+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCS8qIElEU0VMIDB4MCAqLwotCQkJCTAwMDAgMCAwIDEgJm1waWMgNDIgMSAwIDAKLQkJCQkwMDAwIDAgMCAyICZtcGljIDkgMSAwIDAKLQkJCQkwMDAwIDAgMCAzICZtcGljIDEwIDEgMCAwCi0JCQkJMDAwMCAwIDAgNCAmbXBpYyAxMSAxIDAgMAotCQkJCT47Ci0JCX07Ci0JfTsKLQotCXBjaTM6IHBjaWVAZmZlMjAzMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNDEtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKLQkJZnNsLG1zaSA9IDwmbXNpMj47Ci0JCWludGVycnVwdHMgPSA8MTYgMiAxIDEyPjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTI+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCS8qIElEU0VMIDB4MCAqLwotCQkJCTAwMDAgMCAwIDEgJm1waWMgNDMgMSAwIDAKLQkJCQkwMDAwIDAgMCAyICZtcGljIDAgMSAwIDAKLQkJCQkwMDAwIDAgMCAzICZtcGljIDQgMSAwIDAKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDggMSAwIDAKLQkJCQk+OwotCQl9OwotCX07Ci19OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDYwcWRzLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wMzA2MHFkcy5kdHMKaW5kZXggMDhiOTE5My4uNTI5MDQyZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDYwcWRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNjBxZHMuZHRzCkBAIC0zMiw3ICszMiw3IEBACiAgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KICAqLwogCi0vaW5jbHVkZS8gInAzMDYwc2kuZHRzaSIKKy9pbmNsdWRlLyAiZnNsL3AzMDYwc2ktcHJlLmR0c2kiCiAKIC8gewogCW1vZGVsID0gImZzbCxQMzA2MFFEUyI7CkBAIC01MCw2ICs1MCw4IEBACiAJfTsKIAogCXNvYzogc29jQGZmZTAwMDAwMCB7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweGZlMDAwMDAwIDB4MTAwMDAwMD47CisJCXJlZyA9IDwweGYgMHhmZTAwMDAwMCAwIDB4MDAwMDEwMDA+OwogCQlzcGlAMTEwMDAwIHsKIAkJCWZsYXNoQDAgewogCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwpAQCAtMTM4LDcgKzE0MCw3IEBACiAJCX07CiAJfTsKIAotCXJhcGlkaW9AZmZlMGMwMDAwIHsKKwlyaW86IHJhcGlkaW9AZmZlMGMwMDAwIHsKIAkJcmVnID0gPDB4ZiAweGZlMGMwMDAwIDAgMHgxMTAwMD47CiAKIAkJcG9ydDEgewpAQCAtMTQ5LDcgKzE1MSw3IEBACiAJCX07CiAJfTsKIAotCWxvY2FsYnVzQGZmZTEyNDAwMCB7CisJbGJjOiBsb2NhbGJ1c0BmZmUxMjQwMDAgewogCQlyZWcgPSA8MHhmIDB4ZmUxMjQwMDAgMCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDAKIAkJCSAgMiAwIDB4ZiAweGZmYTAwMDAwIDB4MDAwNDAwMDAKQEAgLTIxMCw2ICsyMTIsNyBAQAogCQlyZWcgPSA8MHhmIDB4ZmUyMDAwMDAgMCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAgMHhjIDB4MDAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMDAwMDAgMHgwIDB4MDAwMTAwMDA+OworCQlmc2wsbXNpID0gPCZtc2kwPjsKIAkJcGNpZUAwIHsKIAkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAogCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKQEAgLTIyNSw2ICsyMjgsNyBAQAogCQlyZWcgPSA8MHhmIDB4ZmUyMDEwMDAgMCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAweDAgMHhlMDAwMDAwMCAweGMgMHgyMDAwMDAwMCAweDAgMHgyMDAwMDAwMAogCQkJICAweDAxMDAwMDAwIDB4MCAweDAwMDAwMDAwIDB4ZiAweGY4MDEwMDAwIDB4MCAweDAwMDEwMDAwPjsKKwkJZnNsLG1zaSA9IDwmbXNpMT47CiAJCXBjaWVAMCB7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCkBAIC0yMzYsMyArMjQwLDUgQEAKIAkJfTsKIAl9OwogfTsKKworL2luY2x1ZGUvICJmc2wvcDMwNjBzaS1wb3N0LmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNjBzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3AzMDYwc2kuZHRzaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg5NDdlMS4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDMwNjBzaS5kdHNpCisrKyAvZGV2L251bGwKQEAgLTEsNzE5ICswLDAgQEAKLS8qCi0gKiBQMzA2MCBTaWxpY29uIERldmljZSBUcmVlIFNvdXJjZQotICoKLSAqIENvcHlyaWdodCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEluYy4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICoKLSAqIEFMVEVSTkFUSVZFTFksIHRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKLSAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICgiR1BMIikgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoYXQgTGljZW5zZSBvciAoYXQgeW91ciBvcHRpb24pIGFueQotICogbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIGBgQVMgSVMnJyBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0vZHRzLXYxLzsKLQotLyB7Ci0JY29tcGF0aWJsZSA9ICJmc2wsUDMwNjAiOwotCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCSNzaXplLWNlbGxzID0gPDI+OwotCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCi0JYWxpYXNlcyB7Ci0JCWNjc3IgPSAmc29jOwotCQlkY3NyID0gJmRjc3I7Ci0KLQkJc2VyaWFsMCA9ICZzZXJpYWwwOwotCQlzZXJpYWwxID0gJnNlcmlhbDE7Ci0JCXNlcmlhbDIgPSAmc2VyaWFsMjsKLQkJc2VyaWFsMyA9ICZzZXJpYWwzOwotCQlwY2kwID0gJnBjaTA7Ci0JCXBjaTEgPSAmcGNpMTsKLQkJdXNiMCA9ICZ1c2IwOwotCQl1c2IxID0gJnVzYjE7Ci0JCWRtYTAgPSAmZG1hMDsKLQkJZG1hMSA9ICZkbWExOwotCQltc2kwID0gJm1zaTA7Ci0JCW1zaTEgPSAmbXNpMTsKLQkJbXNpMiA9ICZtc2kyOwotCi0JCWNyeXB0byA9ICZjcnlwdG87Ci0JCXNlY19qcjAgPSAmc2VjX2pyMDsKLQkJc2VjX2pyMSA9ICZzZWNfanIxOwotCQlzZWNfanIyID0gJnNlY19qcjI7Ci0JCXNlY19qcjMgPSAmc2VjX2pyMzsKLQkJcnRpY19hID0gJnJ0aWNfYTsKLQkJcnRpY19iID0gJnJ0aWNfYjsKLQkJcnRpY19jID0gJnJ0aWNfYzsKLQkJcnRpY19kID0gJnJ0aWNfZDsKLQkJc2VjX21vbiA9ICZzZWNfbW9uOwotCX07Ci0KLQljcHVzIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDA+OwotCi0JCWNwdTA6IFBvd2VyUEMsZTUwMG1jQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OwotCQkJTDJfMDogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCQljcHUxOiBQb3dlclBDLGU1MDBtY0AxIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MT47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8xPjsKLQkJCUwyXzE6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQkJY3B1NDogUG93ZXJQQyxlNTAwbWNANCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDQ+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfND47Ci0JCQlMMl80OiBsMi1jYWNoZSB7Ci0JCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKLQkJCX07Ci0JCX07Ci0JCWNwdTU6IFBvd2VyUEMsZTUwMG1jQDUgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDw1PjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzU+OwotCQkJTDJfNTogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCQljcHU2OiBQb3dlclBDLGU1MDBtY0A2IHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8Nj47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl82PjsKLQkJCUwyXzY6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQkJY3B1NzogUG93ZXJQQyxlNTAwbWNANyB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDc+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNz47Ci0JCQlMMl83OiBsMi1jYWNoZSB7Ci0JCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKLQkJCX07Ci0JCX07Ci0JfTsKLQotCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxkY3NyIiwgInNpbXBsZS1idXMiOwotCi0JCWRjc3ItZXB1QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lcHUiOwotCQkJaW50ZXJydXB0cyA9IDw1MiAyIDAgMAotCQkJCSAgICAgIDg0IDIgMCAwCi0JCQkJICAgICAgODUgMiAwIDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItbnBjIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnBjIjsKLQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwIDB4MTAwMDAwMCAweDgwMDA+OwotCQl9OwotCQlkY3NyLW54Y0AyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnhjIjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1jb3JlbmV0IHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItY29yZW5ldCI7Ci0JCQlyZWcgPSA8MHg4MDAwIDB4MTAwMCAweEIwMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItZHBhYUA5MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRjc3ItZHBhYSIsICJmc2wsZGNzci1kcGFhIjsKLQkJCXJlZyA9IDwweDkwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1vY25AMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZGNzci1vY24iLCAiZnNsLGRjc3Itb2NuIjsKLQkJCXJlZyA9IDwweDExMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItZGRyQDEyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKLQkJCWRldi1oYW5kbGUgPSA8JmRkcj47Ci0JCQlyZWcgPSA8MHgxMjAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLW5hbEAxODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kY3NyLW5hbCIsICJmc2wsZGNzci1uYWwiOwotCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1yY3BtQDIyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRjc3ItcmNwbSIsICJmc2wsZGNzci1yY3BtIjsKLQkJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKLQkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHUxPjsKLQkJCXJlZyA9IDwweDQxMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQ0MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHU0PjsKLQkJCXJlZyA9IDwweDQ0MDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQ1MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHU1PjsKLQkJCXJlZyA9IDwweDQ1MDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQ2MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHU2PjsKLQkJCXJlZyA9IDwweDQ2MDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQ3MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHU3PjsKLQkJCXJlZyA9IDwweDQ3MDAwIDB4MTAwMD47Ci0JCX07Ci0JfTsKLQotCXNvYzogc29jQGZmZTAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKLQkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmIDB4ZmUwMDAwMDAgMHgxMDAwMDAwPjsKLQkJcmVnID0gPDB4ZiAweGZlMDAwMDAwIDAgMHgwMDAwMTAwMD47Ci0KLQkJc29jLXNyYW0tZXJyb3IgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsc29jLXNyYW0tZXJyb3IiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjk+OwotCQl9OwotCi0JCWNvcmVuZXQtbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1sYXciOwotCQkJcmVnID0gPDB4MCAweDEwMDA+OwotCQkJZnNsLG51bS1sYXdzID0gPDMyPjsKLQkJfTsKLQotCQlkZHI6IG1lbW9yeS1jb250cm9sbGVyQDgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNCIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4ODAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OwotCQl9OwotCi0JCWNwYzogbDMtY2FjaGUtY29udHJvbGxlckAxMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1sMy1jYWNoZS1jb250cm9sbGVyIiwgImNhY2hlIjsKLQkJCXJlZyA9IDwweDEwMDAwIDB4MTAwMAotCQkJICAgICAgIDB4MTEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI3PjsKLQkJfTsKLQotCQljb3JlbmV0LWNmQDE4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtY2YiOwotCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDMxPjsKLQkJCWZzbCxjY2YtbnVtLWNzZGlkcyA9IDwzMj47Ci0JCQlmc2wsY2NmLW51bS1zbm9vcGlkcyA9IDwzMj47Ci0JCX07Ci0KLQkJaW9tbXVAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscGFtdS12MS4wIiwgImZzbCxwYW11IjsKLQkJCXJlZyA9IDwweDIwMDAwIDB4NTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTI0IDIgMCAwCi0JCQkJMTYgMiAxIDMwPjsKLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8ND47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMiLCAiY2hycCxvcGVuLXBpYyI7Ci0JCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7Ci0JCX07Ci0KLQkJbXNpMDogbXNpQDQxNjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAgMCAwCi0JCQkJMHhlMSAwIDAgMAotCQkJCTB4ZTIgMCAwIDAKLQkJCQkweGUzIDAgMCAwCi0JCQkJMHhlNCAwIDAgMAotCQkJCTB4ZTUgMCAwIDAKLQkJCQkweGU2IDAgMCAwCi0JCQkJMHhlNyAwIDAgMD47Ci0JCX07Ci0KLQkJbXNpMTogbXNpQDQxODAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxODAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGU4IDAgMCAwCi0JCQkJMHhlOSAwIDAgMAotCQkJCTB4ZWEgMCAwIDAKLQkJCQkweGViIDAgMCAwCi0JCQkJMHhlYyAwIDAgMAotCQkJCTB4ZWQgMCAwIDAKLQkJCQkweGVlIDAgMCAwCi0JCQkJMHhlZiAwIDAgMD47Ci0JCX07Ci0KLQkJbXNpMjogbXNpQDQxYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxYTAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGYwIDAgMCAwCi0JCQkJMHhmMSAwIDAgMAotCQkJCTB4ZjIgMCAwIDAKLQkJCQkweGYzIDAgMCAwCi0JCQkJMHhmNCAwIDAgMAotCQkJCTB4ZjUgMCAwIDAKLQkJCQkweGY2IDAgMCAwCi0JCQkJMHhmNyAwIDAgMD47Ci0JCX07Ci0KLQkJcm11OiBybXVAZDMwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8tcm11IjsKLQkJCXJlZyA9IDwweGQzMDAwIDB4NTAwPjsKLQkJCXJhbmdlcyA9IDwweDAgMHhkMzAwMCAweDUwMD47Ci0KLQkJCW1lc3NhZ2UtdW5pdEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzcmlvLW1zZy11bml0IjsKLQkJCQlyZWcgPSA8MHgwIDB4MTAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPAotCQkJCQk2MCAyIDAgMCAgLyogbXNnMV90eF9pcnEgKi8KLQkJCQkJNjEgMiAwIDA+Oy8qIG1zZzFfcnhfaXJxICovCi0JCQl9OwotCQkJbWVzc2FnZS11bml0QDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc3Jpby1tc2ctdW5pdCI7Ci0JCQkJcmVnID0gPDB4MTAwIDB4MTAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPAotCQkJCQk2MiAyIDAgMCAgLyogbXNnMl90eF9pcnEgKi8KLQkJCQkJNjMgMiAwIDA+Oy8qIG1zZzJfcnhfaXJxICovCi0JCQl9OwotCQkJZG9vcmJlbGwtdW5pdEA0MDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNyaW8tZGJlbGwtdW5pdCI7Ci0JCQkJcmVnID0gPDB4NDAwIDB4ODA+OwotCQkJCWludGVycnVwdHMgPSA8Ci0JCQkJCTU2IDIgMCAwICAvKiBiZWxsX291dGJfaXJxICovCi0JCQkJCTU3IDIgMCAwPjsvKiBiZWxsX2luYl9pcnEgKi8KLQkJCX07Ci0JCQlwb3J0LXdyaXRlLXVuaXRANGUwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzcmlvLXBvcnQtd3JpdGUtdW5pdCI7Ci0JCQkJcmVnID0gPDB4NGUwIDB4MjA+OwotCQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDExPjsKLQkJCX07Ci0JCX07Ci0KLQkJZ3V0czogZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1kZXZpY2UtY29uZmlnLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMDAwMCAweGUwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwotCQkJI3NsZWVwLWNlbGxzID0gPDE+OwotCQkJZnNsLGxpb2RuLWJpdHMgPSA8MTI+OwotCQl9OwotCi0JCXBpbnM6IGdsb2JhbC11dGlsaXRpZXNAZTBlMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcGluLWNvbnRyb2wtMS4wIjsKLQkJCXJlZyA9IDwweGUwZTAwIDB4MjAwPjsKLQkJCSNzbGVlcC1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMS4wIjsKLQkJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCX07Ci0KLQkJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1yY3BtLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMjAwMCAweDEwMDA+OwotCQkJI3NsZWVwLWNlbGxzID0gPDE+OwotCQl9OwotCi0JCXNmcDogc2ZwQGU4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLXNmcCIsICJmc2wscW9yaXEtc2ZwLTEuMCI7Ci0JCQlyZWcJICAgPSA8MHhlODAwMCAweDEwMDA+OwotCQl9OwotCi0JCXNlcmRlczogc2VyZGVzQGVhMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLXNlcmRlcyI7Ci0JCQlyZWcJICAgPSA8MHhlYTAwMCAweDEwMDA+OwotCQl9OwotCi0JCWRtYTA6IGRtYUAxMDAzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAwMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAwMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDI4IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8MjkgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMwIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAyIDAgMD47Ci0JCQl9OwotCQl9OwotCi0JCWRtYTE6IGRtYUAxMDEzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAxMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAxMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8MzMgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM0IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAyIDAgMD47Ci0JCQl9OwotCQl9OwotCi0JCXNwaUAxMTAwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLWVzcGkiLCAiZnNsLG1wYzg1MzYtZXNwaSI7Ci0JCQlyZWcgPSA8MHgxMTAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NTMgMHgyIDAgMD47Ci0JCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47Ci0JCX07Ci0KLQkJaTJjQDExODAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTgwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMTE4MTAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDExODEwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM4IDIgMCAwPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWkyY0AxMTkwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE5MDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJaTJjQDExOTEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTkxMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOSAyIDAgMD47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlzZXJpYWwwOiBzZXJpYWxAMTFjNTAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDExYzUwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKLQkJfTsKLQotCQlzZXJpYWwxOiBzZXJpYWxAMTFjNjAwIHsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDExYzYwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM2IDIgMCAwPjsKLQkJfTsKLQotCQlzZXJpYWwyOiBzZXJpYWxAMTFkNTAwIHsKLQkJCWNlbGwtaW5kZXggPSA8Mj47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDExZDUwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKLQkJfTsKLQotCQlzZXJpYWwzOiBzZXJpYWxAMTFkNjAwIHsKLQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKLQkJCXJlZyA9IDwweDExZDYwMCAweDEwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM3IDIgMCAwPjsKLQkJfTsKLQotCQlncGlvMDogZ3Bpb0AxMzAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZ3BpbyIsICJmc2wscW9yaXEtZ3BpbyI7Ci0JCQlyZWcgPSA8MHgxMzAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NTUgMiAwIDA+OwotCQkJI2dwaW8tY2VsbHMgPSA8Mj47Ci0JCQlncGlvLWNvbnRyb2xsZXI7Ci0JCX07Ci0KLQkJdXNiMDogdXNiQDIxMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC11c2IyLW1waCIsCi0JCQkJCSJmc2wsbXBjODV4eC11c2IyLW1waCIsICJmc2wtdXNiMi1tcGgiOwotCQkJcmVnID0gPDB4MjEwMDAwIDB4MTAwMD47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDw0NCAweDIgMCAwPjsKLQkJfTsKLQotCQl1c2IxOiB1c2JAMjExMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHAzMDYwLXVzYjItZHIiLAotCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1kciIsICJmc2wtdXNiMi1kciI7Ci0JCQlyZWcgPSA8MHgyMTEwMDAgMHgxMDAwPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQ1IDB4MiAwIDA+OwotCQl9OwotCi0JCWNyeXB0bzogY3J5cHRvQDMwMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMSIsICJmc2wsc2VjLXY0LjAiOwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCXJlZyA9IDwweDMwMDAwMCAweDEwMDAwPjsKLQkJCXJhbmdlcyA9IDwwIDB4MzAwMDAwIDB4MTAwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDkyIDIgMCAwPjsKLQotCQkJc2VjX2pyMDoganJAMTAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtam9iLXJpbmciLCAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw4OCAyIDAgMD47Ci0JCQl9OwotCi0JCQlzZWNfanIxOiBqckAyMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1qb2ItcmluZyIsICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOwotCQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDg5IDIgMCAwPjsKLQkJCX07Ci0KLQkJCXNlY19qcjI6IGpyQDMwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLWpvYi1yaW5nIiwgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4MzAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8OTAgMiAwIDA+OwotCQkJfTsKLQotCQkJc2VjX2pyMzoganJANDAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtam9iLXJpbmciLCAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHg0MDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw5MSAyIDAgMD47Ci0JCQl9OwotCi0JCQlydGljQDYwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLXJ0aWMiLCAiZnNsLHNlYy12NC4wLXJ0aWMiOwotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCXJlZyA9IDwweDYwMDAgMHgxMDA+OwotCQkJCXJhbmdlcyA9IDwweDAgMHg2MTAwIDB4ZTAwPjsKLQotCQkJCXJ0aWNfYTogcnRpYy1hQDAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1ydGljLW1lbW9yeSIsICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHgwMCAweDIwIDB4MTAwIDB4ODA+OwotCQkJCX07Ci0KLQkJCQlydGljX2I6IHJ0aWMtYkAyMCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLXJ0aWMtbWVtb3J5IiwgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDIwIDB4MjAgMHgyMDAgMHg4MD47Ci0JCQkJfTsKLQotCQkJCXJ0aWNfYzogcnRpYy1jQDQwIHsKLQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjEtcnRpYy1tZW1vcnkiLCAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4NDAgMHgyMCAweDMwMCAweDgwPjsKLQkJCQl9OwotCi0JCQkJcnRpY19kOiBydGljLWRANjAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMS1ydGljLW1lbW9yeSIsICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHg2MCAweDIwIDB4NTAwIDB4ODA+OwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCXNlY19tb246IHNlY19tb25AMzE0MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4xLW1vbiIsICJmc2wsc2VjLXY0LjAtbW9uIjsKLQkJCXJlZyA9IDwweDMxNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDkzIDIgMCAwPjsKLQkJfTsKLQl9OwotCi0JcmFwaWRpb0BmZmUwYzAwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxzcmlvIjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTE+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCWZzbCxzcmlvLXJtdS1oYW5kbGUgPSA8JnJtdT47Ci0JCXJhbmdlczsKLQotCQlwb3J0MSB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJfTsKLQotCQlwb3J0MiB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJfTsKLQl9OwotCi0JbG9jYWxidXNAZmZlMTI0MDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDMwNjAtZWxiYyIsICJmc2wsZWxiYyIsICJzaW1wbGUtYnVzIjsKLQkJaW50ZXJydXB0cyA9IDwyNSAyIDAgMD47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDI+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQl9OwotCi0JcGNpMDogcGNpZUBmZmUyMDAwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwzMzMzMzMzMz47Ci0JCWZzbCxtc2kgPSA8Jm1zaTA+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47Ci0JCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MCAwIDAgMCAwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDE1PjsKLQkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwotCQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCQkvKiBJRFNFTCAweDAgKi8KLQkJCQkwMDAwIDAgMCAxICZtcGljIDQwIDEgMCAwCi0JCQkJMDAwMCAwIDAgMiAmbXBpYyAxIDEgMCAwCi0JCQkJMDAwMCAwIDAgMyAmbXBpYyAyIDEgMCAwCi0JCQkJMDAwMCAwIDAgNCAmbXBpYyAzIDEgMCAwCi0JCQkJPjsKLQkJfTsKLQl9OwotCi0JcGNpMTogcGNpZUBmZmUyMDEwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwMzA2MC1wY2llIiwgImZzbCxxb3JpcS1wY2llLXYyLjIiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWJ1cy1yYW5nZSA9IDwwIDB4ZmY+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MzMzMzMzMzM+OwotCQlmc2wsbXNpID0gPCZtc2kxPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OwotCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47Ci0JCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJCWludGVycnVwdC1tYXAgPSA8Ci0JCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAotCQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxIDAgMAotCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxIDAgMAotCQkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAotCQkJCT47Ci0JCX07Ci0JfTsKLX07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBkcy5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBkcy5kdHMKaW5kZXggYzc5MTZkYy4uNmQ2MGU1NCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A0MDgwZHMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MGRzLmR0cwpAQCAtMzIsNyArMzIsNyBAQAogICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8KIAotL2luY2x1ZGUvICJwNDA4MHNpLmR0c2kiCisvaW5jbHVkZS8gImZzbC9wNDA4MHNpLXByZS5kdHNpIgogCiAvIHsKIAltb2RlbCA9ICJmc2wsUDQwODBEUyI7CkBAIC01MCw2ICs1MCw5IEBACiAJfTsKIAogCXNvYzogc29jQGZmZTAwMDAwMCB7CisJCXJhbmdlcyA9IDwweDAwMDAwMDAwIDB4ZiAweGZlMDAwMDAwIDB4MTAwMDAwMD47CisJCXJlZyA9IDwweGYgMHhmZTAwMDAwMCAwIDB4MDAwMDEwMDA+OworCiAJCXNwaUAxMTAwMDAgewogCQkJZmxhc2hAMCB7CiAJCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47CkBAIC0xMDUsMTIgKzEwOCwxOCBAQAogCQl9OwogCX07CiAKLQlyYXBpZGlvMDogcmFwaWRpb0BmZmUwYzAwMDAgewotCQlyZWcgPSA8MHhmIDB4ZmUwYzAwMDAgMCAweDIwMDAwPjsKLQkJcmFuZ2VzID0gPDAgMCAweGMgMHgyMDAwMDAwMCAwIDB4MDEwMDAwMDA+OworCXJpbzogcmFwaWRpb0BmZmUwYzAwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUwYzAwMDAgMCAweDExMDAwPjsKKworCQlwb3J0MSB7CisJCQlyYW5nZXMgPSA8MCAwIDB4YyAweDIwMDAwMDAwIDAgMHgxMDAwMDAwMD47CisJCX07CisJCXBvcnQyIHsKKwkJCXJhbmdlcyA9IDwwIDAgMHhjIDB4MzAwMDAwMDAgMCAweDEwMDAwMDAwPjsKKwkJfTsKIAl9OwogCi0JbG9jYWxidXNAZmZlMTI0MDAwIHsKKwlsYmM6IGxvY2FsYnVzQGZmZTEyNDAwMCB7CiAJCXJlZyA9IDwweGYgMHhmZTEyNDAwMCAwIDB4MTAwMD47CiAJCXJhbmdlcyA9IDwwIDAgMHhmIDB4ZTgwMDAwMDAgMHgwODAwMDAwMAogCQkJICAzIDAgMHhmIDB4ZmZkZjAwMDAgMHgwMDAwODAwMD47CkBAIC0xMzIsNiArMTQxLDcgQEAKIAkJcmVnID0gPDB4ZiAweGZlMjAwMDAwIDAgMHgxMDAwPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwIDB4YyAweDAwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4ZiAweGY4MDAwMDAwIDB4MCAweDAwMDEwMDAwPjsKKwkJZnNsLG1zaSA9IDwmbXNpMD47CiAJCXBjaWVAMCB7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCkBAIC0xNDcsNiArMTU3LDcgQEAKIAkJcmVnID0gPDB4ZiAweGZlMjAxMDAwIDAgMHgxMDAwPjsKIAkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMHgwIDB4ZTAwMDAwMDAgMHhjIDB4MjAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAweDAgMHgwMDAwMDAwMCAweGYgMHhmODAxMDAwMCAweDAgMHgwMDAxMDAwMD47CisJCWZzbCxtc2kgPSA8Jm1zaTE+OwogCQlwY2llQDAgewogCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCiAJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMApAQCAtMTYyLDYgKzE3Myw3IEBACiAJCXJlZyA9IDwweGYgMHhmZTIwMjAwMCAwIDB4MTAwMD47CiAJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHg0MDAwMDAwMCAwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMjAwMDAgMCAweDAwMDEwMDAwPjsKKwkJZnNsLG1zaSA9IDwmbXNpMj47CiAJCXBjaWVAMCB7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCkBAIC0xNzQsMyArMTg2LDUgQEAKIAl9OwogCiB9OworCisvaW5jbHVkZS8gImZzbC9wNDA4MHNpLXBvc3QuZHRzaSIKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MHNpLmR0c2kgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDQwODBzaS5kdHNpCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjBjMDFhLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNDA4MHNpLmR0c2kKKysrIC9kZXYvbnVsbApAQCAtMSw3NTUgKzAsMCBAQAotLyoKLSAqIFA0MDgwIFNpbGljb24gRGV2aWNlIFRyZWUgU291cmNlCi0gKgotICogQ29weXJpZ2h0IDIwMDktMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBJbmMuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICogICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgRnJlZXNjYWxlIFNlbWljb25kdWN0b3Igbm9yIHRoZQotICogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSAqICAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqCi0gKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCi0gKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKLSAqIGxhdGVyIHZlcnNpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQotICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUwotICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotL2R0cy12MS87Ci0KLS8gewotCWNvbXBhdGlibGUgPSAiZnNsLFA0MDgwIjsKLQkjYWRkcmVzcy1jZWxscyA9IDwyPjsKLQkjc2l6ZS1jZWxscyA9IDwyPjsKLQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQotCWFsaWFzZXMgewotCQljY3NyID0gJnNvYzsKLQkJZGNzciA9ICZkY3NyOwotCi0JCXNlcmlhbDAgPSAmc2VyaWFsMDsKLQkJc2VyaWFsMSA9ICZzZXJpYWwxOwotCQlzZXJpYWwyID0gJnNlcmlhbDI7Ci0JCXNlcmlhbDMgPSAmc2VyaWFsMzsKLQkJcGNpMCA9ICZwY2kwOwotCQlwY2kxID0gJnBjaTE7Ci0JCXBjaTIgPSAmcGNpMjsKLQkJdXNiMCA9ICZ1c2IwOwotCQl1c2IxID0gJnVzYjE7Ci0JCWRtYTAgPSAmZG1hMDsKLQkJZG1hMSA9ICZkbWExOwotCQlzZGhjID0gJnNkaGM7Ci0JCW1zaTAgPSAmbXNpMDsKLQkJbXNpMSA9ICZtc2kxOwotCQltc2kyID0gJm1zaTI7Ci0KLQkJY3J5cHRvID0gJmNyeXB0bzsKLQkJc2VjX2pyMCA9ICZzZWNfanIwOwotCQlzZWNfanIxID0gJnNlY19qcjE7Ci0JCXNlY19qcjIgPSAmc2VjX2pyMjsKLQkJc2VjX2pyMyA9ICZzZWNfanIzOwotCQlydGljX2EgPSAmcnRpY19hOwotCQlydGljX2IgPSAmcnRpY19iOwotCQlydGljX2MgPSAmcnRpY19jOwotCQlydGljX2QgPSAmcnRpY19kOwotCQlzZWNfbW9uID0gJnNlY19tb247Ci0KLQkJcmlvMCA9ICZyYXBpZGlvMDsKLQl9OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQljcHUwOiBQb3dlclBDLGU1MDBtY0AwIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8MD47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8wPjsKLQkJCUwyXzA6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQkJY3B1MTogUG93ZXJQQyxlNTAwbWNAMSB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDE+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfMT47Ci0JCQlMMl8xOiBsMi1jYWNoZSB7Ci0JCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKLQkJCX07Ci0JCX07Ci0JCWNwdTI6IFBvd2VyUEMsZTUwMG1jQDIgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwyPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzI+OwotCQkJTDJfMjogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCQljcHUzOiBQb3dlclBDLGU1MDBtY0AzIHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8Mz47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl8zPjsKLQkJCUwyXzM6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQkJY3B1NDogUG93ZXJQQyxlNTAwbWNANCB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDQ+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfND47Ci0JCQlMMl80OiBsMi1jYWNoZSB7Ci0JCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKLQkJCX07Ci0JCX07Ci0JCWNwdTU6IFBvd2VyUEMsZTUwMG1jQDUgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDw1PjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzU+OwotCQkJTDJfNTogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCQljcHU2OiBQb3dlclBDLGU1MDBtY0A2IHsKLQkJCWRldmljZV90eXBlID0gImNwdSI7Ci0JCQlyZWcgPSA8Nj47Ci0JCQluZXh0LWxldmVsLWNhY2hlID0gPCZMMl82PjsKLQkJCUwyXzY6IGwyLWNhY2hlIHsKLQkJCQluZXh0LWxldmVsLWNhY2hlID0gPCZjcGM+OwotCQkJfTsKLQkJfTsKLQkJY3B1NzogUG93ZXJQQyxlNTAwbWNANyB7Ci0JCQlkZXZpY2VfdHlwZSA9ICJjcHUiOwotCQkJcmVnID0gPDc+OwotCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmTDJfNz47Ci0JCQlMMl83OiBsMi1jYWNoZSB7Ci0JCQkJbmV4dC1sZXZlbC1jYWNoZSA9IDwmY3BjPjsKLQkJCX07Ci0JCX07Ci0JfTsKLQotCWRjc3I6IGRjc3JAZjAwMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQljb21wYXRpYmxlID0gImZzbCxkY3NyIiwgInNpbXBsZS1idXMiOwotCi0JCWRjc3ItZXB1QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1lcHUiOwotCQkJaW50ZXJydXB0cyA9IDw1MiAyIDAgMAotCQkJCSAgICAgIDg0IDIgMCAwCi0JCQkJICAgICAgODUgMiAwIDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItbnBjIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnBjIjsKLQkJCXJlZyA9IDwweDEwMDAgMHgxMDAwIDB4MTAwMDAwMCAweDgwMDA+OwotCQl9OwotCQlkY3NyLW54Y0AyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItbnhjIjsKLQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1jb3JlbmV0IHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItY29yZW5ldCI7Ci0JCQlyZWcgPSA8MHg4MDAwIDB4MTAwMCAweEIwMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItZHBhYUA5MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRjc3ItZHBhYSIsICJmc2wsZGNzci1kcGFhIjsKLQkJCXJlZyA9IDwweDkwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1vY25AMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZGNzci1vY24iLCAiZnNsLGRjc3Itb2NuIjsKLQkJCXJlZyA9IDwweDExMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItZGRyQDEyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKLQkJCWRldi1oYW5kbGUgPSA8JmRkcjE+OwotCQkJcmVnID0gPDB4MTIwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1kZHJAMTMwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzci1kZHIiOwotCQkJZGV2LWhhbmRsZSA9IDwmZGRyMj47Ci0JCQlyZWcgPSA8MHgxMzAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLW5hbEAxODAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kY3NyLW5hbCIsICJmc2wsZGNzci1uYWwiOwotCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1yY3BtQDIyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRjc3ItcmNwbSIsICJmc2wsZGNzci1yY3BtIjsKLQkJCXJlZyA9IDwweDIyMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKLQkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHUxPjsKLQkJCXJlZyA9IDwweDQxMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQyMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHUyPjsKLQkJCXJlZyA9IDwweDQyMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHUzPjsKLQkJCXJlZyA9IDwweDQzMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQ0MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHU0PjsKLQkJCXJlZyA9IDwweDQ0MDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQ1MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHU1PjsKLQkJCXJlZyA9IDwweDQ1MDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQ2MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHU2PjsKLQkJCXJlZyA9IDwweDQ2MDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQ3MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTUwMG1jLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHU3PjsKLQkJCXJlZyA9IDwweDQ3MDAwIDB4MTAwMD47Ci0JCX07Ci0JfTsKLQotCXNvYzogc29jQGZmZTAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJZGV2aWNlX3R5cGUgPSAic29jIjsKLQkJY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIjsKLQkJcmFuZ2VzID0gPDB4MDAwMDAwMDAgMHhmIDB4ZmUwMDAwMDAgMHgxMDAwMDAwPjsKLQkJcmVnID0gPDB4ZiAweGZlMDAwMDAwIDAgMHgwMDAwMTAwMD47Ci0KLQkJc29jLXNyYW0tZXJyb3IgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsc29jLXNyYW0tZXJyb3IiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjk+OwotCQl9OwotCi0JCWNvcmVuZXQtbGF3QDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsY29yZW5ldC1sYXciOwotCQkJcmVnID0gPDB4MCAweDEwMDA+OwotCQkJZnNsLG51bS1sYXdzID0gPDMyPjsKLQkJfTsKLQotCQlkZHIxOiBtZW1vcnktY29udHJvbGxlckA4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjQiLCAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyIjsKLQkJCXJlZyA9IDwweDgwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDIzPjsKLQkJfTsKLQotCQlkZHIyOiBtZW1vcnktY29udHJvbGxlckA5MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLW1lbW9yeS1jb250cm9sbGVyLXY0LjQiLCJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4OTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjI+OwotCQl9OwotCi0JCWNwYzogbDMtY2FjaGUtY29udHJvbGxlckAxMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1sMy1jYWNoZS1jb250cm9sbGVyIiwgImNhY2hlIjsKLQkJCXJlZyA9IDwweDEwMDAwIDB4MTAwMAotCQkJICAgICAgIDB4MTEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI3Ci0JCQkJICAgICAgMTYgMiAxIDI2PjsKLQkJfTsKLQotCQljb3JlbmV0LWNmQDE4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtY2YiOwotCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDMxPjsKLQkJCWZzbCxjY2YtbnVtLWNzZGlkcyA9IDwzMj47Ci0JCQlmc2wsY2NmLW51bS1zbm9vcGlkcyA9IDwzMj47Ci0JCX07Ci0KLQkJaW9tbXVAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscGFtdS12MS4wIiwgImZzbCxwYW11IjsKLQkJCXJlZyA9IDwweDIwMDAwIDB4NTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTI0IDIgMCAwCi0JCQkJMTYgMiAxIDMwPjsKLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8ND47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMiLCAiY2hycCxvcGVuLXBpYyI7Ci0JCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7Ci0JCX07Ci0KLQkJbXNpMDogbXNpQDQxNjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAgMCAwCi0JCQkJMHhlMSAwIDAgMAotCQkJCTB4ZTIgMCAwIDAKLQkJCQkweGUzIDAgMCAwCi0JCQkJMHhlNCAwIDAgMAotCQkJCTB4ZTUgMCAwIDAKLQkJCQkweGU2IDAgMCAwCi0JCQkJMHhlNyAwIDAgMD47Ci0JCX07Ci0KLQkJbXNpMTogbXNpQDQxODAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxODAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGU4IDAgMCAwCi0JCQkJMHhlOSAwIDAgMAotCQkJCTB4ZWEgMCAwIDAKLQkJCQkweGViIDAgMCAwCi0JCQkJMHhlYyAwIDAgMAotCQkJCTB4ZWQgMCAwIDAKLQkJCQkweGVlIDAgMCAwCi0JCQkJMHhlZiAwIDAgMD47Ci0JCX07Ci0KLQkJbXNpMjogbXNpQDQxYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxYTAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGYwIDAgMCAwCi0JCQkJMHhmMSAwIDAgMAotCQkJCTB4ZjIgMCAwIDAKLQkJCQkweGYzIDAgMCAwCi0JCQkJMHhmNCAwIDAgMAotCQkJCTB4ZjUgMCAwIDAKLQkJCQkweGY2IDAgMCAwCi0JCQkJMHhmNyAwIDAgMD47Ci0JCX07Ci0KLQkJZ3V0czogZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1kZXZpY2UtY29uZmlnLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMDAwMCAweGUwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwotCQkJI3NsZWVwLWNlbGxzID0gPDE+OwotCQkJZnNsLGxpb2RuLWJpdHMgPSA8MTI+OwotCQl9OwotCi0JCXBpbnM6IGdsb2JhbC11dGlsaXRpZXNAZTBlMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcGluLWNvbnRyb2wtMS4wIjsKLQkJCXJlZyA9IDwweGUwZTAwIDB4MjAwPjsKLQkJCSNzbGVlcC1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMS4wIjsKLQkJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCX07Ci0KLQkJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1yY3BtLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMjAwMCAweDEwMDA+OwotCQkJI3NsZWVwLWNlbGxzID0gPDE+OwotCQl9OwotCi0JCXNmcDogc2ZwQGU4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXNmcCIsICJmc2wscW9yaXEtc2ZwLTEuMCI7Ci0JCQlyZWcJICAgPSA8MHhlODAwMCAweDEwMDA+OwotCQl9OwotCi0JCXNlcmRlczogc2VyZGVzQGVhMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXNlcmRlcyI7Ci0JCQlyZWcJICAgPSA8MHhlYTAwMCAweDEwMDA+OwotCQl9OwotCi0JCWRtYTA6IGRtYUAxMDAzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAwMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAwMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDI4IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8MjkgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMwIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAyIDAgMD47Ci0JCQl9OwotCQl9OwotCi0JCWRtYTE6IGRtYUAxMDEzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAxMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAxMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8MzMgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM0IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAyIDAgMD47Ci0JCQl9OwotCQl9OwotCi0JCXNwaUAxMTAwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLWVzcGkiLCAiZnNsLG1wYzg1MzYtZXNwaSI7Ci0JCQlyZWcgPSA8MHgxMTAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NTMgMHgyIDAgMD47Ci0JCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47Ci0JCX07Ci0KLQkJc2RoYzogc2RoY0AxMTQwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtZXNkaGMiLCAiZnNsLGVzZGhjIjsKLQkJCXJlZyA9IDwweDExNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0OCAyIDAgMD47Ci0JCQl2b2x0YWdlLXJhbmdlcyA9IDwzMzAwIDMzMDA+OwotCQkJc2RoY2ksYXV0by1jbWQxMjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJfTsKLQotCQlpMmNAMTE4MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDExODAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM4IDIgMCAwPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWkyY0AxMTgxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE4MTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzggMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJaTJjQDExOTAwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTkwMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOSAyIDAgMD47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMTE5MTAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDM+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDExOTEwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM5IDIgMCAwPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCXNlcmlhbDA6IHNlcmlhbEAxMWM1MDAgewotCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4MTFjNTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8MzYgMiAwIDA+OwotCQl9OwotCi0JCXNlcmlhbDE6IHNlcmlhbEAxMWM2MDAgewotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4MTFjNjAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8MzYgMiAwIDA+OwotCQl9OwotCi0JCXNlcmlhbDI6IHNlcmlhbEAxMWQ1MDAgewotCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4MTFkNTAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8MzcgMiAwIDA+OwotCQl9OwotCi0JCXNlcmlhbDM6IHNlcmlhbEAxMWQ2MDAgewotCQkJY2VsbC1pbmRleCA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOwotCQkJcmVnID0gPDB4MTFkNjAwIDB4MTAwPjsKLQkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8MzcgMiAwIDA+OwotCQl9OwotCi0JCWdwaW8wOiBncGlvQDEzMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1ncGlvIiwgImZzbCxxb3JpcS1ncGlvIjsKLQkJCXJlZyA9IDwweDEzMDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw1NSAyIDAgMD47Ci0JCQkjZ3Bpby1jZWxscyA9IDwyPjsKLQkJCWdwaW8tY29udHJvbGxlcjsKLQkJfTsKLQotCQl1c2IwOiB1c2JAMjEwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXVzYjItbXBoIiwKLQkJCQkJImZzbCxtcGM4NXh4LXVzYjItbXBoIiwgImZzbC11c2IyLW1waCI7Ci0JCQlyZWcgPSA8MHgyMTAwMDAgMHgxMDAwPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQlpbnRlcnJ1cHRzID0gPDQ0IDB4MiAwIDA+OwotCQl9OwotCi0JCXVzYjE6IHVzYkAyMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtdXNiMi1kciIsCi0JCQkJCSJmc2wsbXBjODV4eC11c2IyLWRyIiwgImZzbC11c2IyLWRyIjsKLQkJCXJlZyA9IDwweDIxMTAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDUgMHgyIDAgMD47Ci0JCX07Ci0KLQkJY3J5cHRvOiBjcnlwdG9AMzAwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wIjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MT47Ci0JCQlyZWcgPSA8MHgzMDAwMDAgMHgxMDAwMD47Ci0JCQlyYW5nZXMgPSA8MCAweDMwMDAwMCAweDEwMDAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJaW50ZXJydXB0cyA9IDw5MiAyIDAgMD47Ci0KLQkJCXNlY19qcjA6IGpyQDEwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHgxMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw4OCAyIDAgMD47Ci0JCQl9OwotCi0JCQlzZWNfanIxOiBqckAyMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4MjAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJCWludGVycnVwdHMgPSA8ODkgMiAwIDA+OwotCQkJfTsKLQotCQkJc2VjX2pyMjoganJAMzAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOwotCQkJCXJlZyA9IDwweDMwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDkwIDIgMCAwPjsKLQkJCX07Ci0KLQkJCXNlY19qcjM6IGpyQDQwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHg0MDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQkJaW50ZXJydXB0cyA9IDw5MSAyIDAgMD47Ci0JCQl9OwotCi0JCQlydGljQDYwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLXJ0aWMiOwotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCXJlZyA9IDwweDYwMDAgMHgxMDA+OwotCQkJCXJhbmdlcyA9IDwweDAgMHg2MTAwIDB4ZTAwPjsKLQotCQkJCXJ0aWNfYTogcnRpYy1hQDAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDAwIDB4MjAgMHgxMDAgMHg4MD47Ci0JCQkJfTsKLQotCQkJCXJ0aWNfYjogcnRpYy1iQDIwIHsKLQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHgyMCAweDIwIDB4MjAwIDB4ODA+OwotCQkJCX07Ci0KLQkJCQlydGljX2M6IHJ0aWMtY0A0MCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4NDAgMHgyMCAweDMwMCAweDgwPjsKLQkJCQl9OwotCi0JCQkJcnRpY19kOiBydGljLWRANjAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDYwIDB4MjAgMHg1MDAgMHg4MD47Ci0JCQkJfTsKLQkJCX07Ci0JCX07Ci0KLQkJc2VjX21vbjogc2VjX21vbkAzMTQwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjAtbW9uIjsKLQkJCXJlZyA9IDwweDMxNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0JCQlpbnRlcnJ1cHRzID0gPDkzIDIgMCAwPjsKLQkJfTsKLQl9OwotCi0JcmFwaWRpbzA6IHJhcGlkaW9AZmZlMGMwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQljb21wYXRpYmxlID0gImZzbCxyYXBpZGlvLWRlbHRhIjsKLQkJaW50ZXJydXB0cyA9IDwKLQkJCTE2IDIgMSAxMSAvKiBlcnJfaXJxICovCi0JCQk1NiAyIDAgMCAgLyogYmVsbF9vdXRiX2lycSAqLwotCQkJNTcgMiAwIDAgIC8qIGJlbGxfaW5iX2lycSAqLwotCQkJNjAgMiAwIDAgIC8qIG1zZzFfdHhfaXJxICovCi0JCQk2MSAyIDAgMCAgLyogbXNnMV9yeF9pcnEgKi8KLQkJCTYyIDIgMCAwICAvKiBtc2cyX3R4X2lycSAqLwotCQkJNjMgMiAwIDA+OyAvKiBtc2cyX3J4X2lycSAqLwotCX07Ci0KLQlsb2NhbGJ1c0BmZmUxMjQwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwNDA4MC1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOwotCQlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCX07Ci0KLQlwY2kwOiBwY2llQGZmZTIwMDAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHA0MDgwLXBjaWUiOwotCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCWJ1cy1yYW5nZSA9IDwweDAgMHhmZj47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OwotCQlmc2wsbXNpID0gPCZtc2kwPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OwotCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47Ci0JCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJCWludGVycnVwdC1tYXAgPSA8Ci0JCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0MCAxIDAgMAotCQkJCTAwMDAgMCAwIDIgJm1waWMgMSAxIDAgMAotCQkJCTAwMDAgMCAwIDMgJm1waWMgMiAxIDAgMAotCQkJCTAwMDAgMCAwIDQgJm1waWMgMyAxIDAgMAotCQkJCT47Ci0JCX07Ci0JfTsKLQotCXBjaTE6IHBjaWVAZmZlMjAxMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJYnVzLXJhbmdlID0gPDAgMHhmZj47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OwotCQlmc2wsbXNpID0gPCZtc2kxPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OwotCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47Ci0JCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJCWludGVycnVwdC1tYXAgPSA8Ci0JCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAotCQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxIDAgMAotCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxIDAgMAotCQkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAotCQkJCT47Ci0JCX07Ci0JfTsKLQotCXBjaTI6IHBjaWVAZmZlMjAyMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDQwODAtcGNpZSI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47Ci0JCWZzbCxtc2kgPSA8Jm1zaTI+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxMz47Ci0JCXBjaWVAMCB7Ci0JCQlyZWcgPSA8MCAwIDAgMCAwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwyPjsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKLQkJCWludGVycnVwdC1tYXAtbWFzayA9IDwweGY4MDAgMCAwIDc+OwotCQkJaW50ZXJydXB0LW1hcCA9IDwKLQkJCQkvKiBJRFNFTCAweDAgKi8KLQkJCQkwMDAwIDAgMCAxICZtcGljIDQyIDEgMCAwCi0JCQkJMDAwMCAwIDAgMiAmbXBpYyA5IDEgMCAwCi0JCQkJMDAwMCAwIDAgMyAmbXBpYyAxMCAxIDAgMAotCQkJCTAwMDAgMCAwIDQgJm1waWMgMTEgMSAwIDAKLQkJCQk+OwotCQl9OwotCX07Ci19OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A1MDIwZHMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A1MDIwZHMuZHRzCmluZGV4IGU2ZDQwOTkuLjFjMjUwNjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9wNTAyMGRzLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBkcy5kdHMKQEAgLTMyLDcgKzMyLDcgQEAKICAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLS9pbmNsdWRlLyAicDUwMjBzaS5kdHNpIgorL2luY2x1ZGUvICJmc2wvcDUwMjBzaS1wcmUuZHRzaSIKIAogLyB7CiAJbW9kZWwgPSAiZnNsLFA1MDIwRFMiOwpAQCAtNTAsNiArNTAsOCBAQAogCX07CiAKIAlzb2M6IHNvY0BmZmUwMDAwMDAgeworCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHhmZTAwMDAwMCAweDEwMDAwMDA+OworCQlyZWcgPSA8MHhmIDB4ZmUwMDAwMDAgMCAweDAwMDAxMDAwPjsKIAkJc3BpQDExMDAwMCB7CiAJCQlmbGFzaEAwIHsKIAkJCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKQEAgLTk5LDcgKzEwMSwxOCBAQAogCQl9OwogCX07CiAKLQlsb2NhbGJ1c0BmZmUxMjQwMDAgeworCXJpbzogcmFwaWRpb0BmZmUwYzAwMDAgeworCQlyZWcgPSA8MHhmIDB4ZmUwYzAwMDAgMCAweDExMDAwPjsKKworCQlwb3J0MSB7CisJCQlyYW5nZXMgPSA8MCAwIDB4YyAweDIwMDAwMDAwIDAgMHgxMDAwMDAwMD47CisJCX07CisJCXBvcnQyIHsKKwkJCXJhbmdlcyA9IDwwIDAgMHhjIDB4MzAwMDAwMDAgMCAweDEwMDAwMDAwPjsKKwkJfTsKKwl9OworCisJbGJjOiBsb2NhbGJ1c0BmZmUxMjQwMDAgewogCQlyZWcgPSA8MHhmIDB4ZmUxMjQwMDAgMCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MCAwIDB4ZiAweGU4MDAwMDAwIDB4MDgwMDAwMDAKIAkJCSAgMiAwIDB4ZiAweGZmYTAwMDAwIDB4MDAwNDAwMDAKQEAgLTE2MCw3ICsxNzMsNyBAQAogCQlyZWcgPSA8MHhmIDB4ZmUyMDAwMDAgMCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAgMHhjIDB4MDAwMDAwMDAgMHgwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMDAwMDAgMHgwIDB4MDAwMTAwMDA+OwotCisJCWZzbCxtc2kgPSA8Jm1zaTA+OwogCQlwY2llQDAgewogCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCiAJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMApAQCAtMTc2LDYgKzE4OSw3IEBACiAJCXJlZyA9IDwweGYgMHhmZTIwMTAwMCAwIDB4MTAwMD47CiAJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDB4MCAweGUwMDAwMDAwIDB4YyAweDIwMDAwMDAwIDB4MCAweDIwMDAwMDAwCiAJCQkgIDB4MDEwMDAwMDAgMHgwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMTAwMDAgMHgwIDB4MDAwMTAwMDA+OworCQlmc2wsbXNpID0gPCZtc2kxPjsKIAkJcGNpZUAwIHsKIAkJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMAogCQkJCSAgMHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKQEAgLTE5MSw2ICsyMDUsNyBAQAogCQlyZWcgPSA8MHhmIDB4ZmUyMDIwMDAgMCAweDEwMDA+OwogCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAgMHhjIDB4NDAwMDAwMDAgMCAweDIwMDAwMDAwCiAJCQkgIDB4MDEwMDAwMDAgMCAweDAwMDAwMDAwIDB4ZiAweGY4MDIwMDAwIDAgMHgwMDAxMDAwMD47CisJCWZzbCxtc2kgPSA8Jm1zaTI+OwogCQlwY2llQDAgewogCQkJcmFuZ2VzID0gPDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCiAJCQkJICAweDAyMDAwMDAwIDAgMHhlMDAwMDAwMApAQCAtMjA2LDYgKzIyMSw3IEBACiAJCXJlZyA9IDwweGYgMHhmZTIwMzAwMCAwIDB4MTAwMD47CiAJCXJhbmdlcyA9IDwweDAyMDAwMDAwIDAgMHhlMDAwMDAwMCAweGMgMHg2MDAwMDAwMCAwIDB4MjAwMDAwMDAKIAkJCSAgMHgwMTAwMDAwMCAwIDB4MDAwMDAwMDAgMHhmIDB4ZjgwMzAwMDAgMCAweDAwMDEwMDAwPjsKKwkJZnNsLG1zaSA9IDwmbXNpMj47CiAJCXBjaWVAMCB7CiAJCQlyYW5nZXMgPSA8MHgwMjAwMDAwMCAwIDB4ZTAwMDAwMDAKIAkJCQkgIDB4MDIwMDAwMDAgMCAweGUwMDAwMDAwCkBAIC0yMTcsMyArMjMzLDUgQEAKIAkJfTsKIAl9OwogfTsKKworL2luY2x1ZGUvICJmc2wvcDUwMjBzaS1wb3N0LmR0c2kiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBzaS5kdHNpIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3A1MDIwc2kuZHRzaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc5NDhhZC4uMDAwMDAwMAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvcDUwMjBzaS5kdHNpCisrKyAvZGV2L251bGwKQEAgLTEsNzE2ICswLDAgQEAKLS8qCi0gKiBQNTAyMCBTaWxpY29uIERldmljZSBUcmVlIFNvdXJjZQotICoKLSAqIENvcHlyaWdodCAyMDEwLTIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgSW5jLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIG5vciB0aGUKLSAqICAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCi0gKiAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKgotICogQUxURVJOQVRJVkVMWSwgdGhpcyBzb2Z0d2FyZSBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQotICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKCJHUEwiKSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhhdCBMaWNlbnNlIG9yIChhdCB5b3VyIG9wdGlvbikgYW55Ci0gKiBsYXRlciB2ZXJzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSAqIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLS9kdHMtdjEvOwotCi0vIHsKLQljb21wYXRpYmxlID0gImZzbCxQNTAyMCI7Ci0JI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JI3NpemUtY2VsbHMgPSA8Mj47Ci0JaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47Ci0KLQlhbGlhc2VzIHsKLQkJY2NzciA9ICZzb2M7Ci0JCWRjc3IgPSAmZGNzcjsKLQotCQlzZXJpYWwwID0gJnNlcmlhbDA7Ci0JCXNlcmlhbDEgPSAmc2VyaWFsMTsKLQkJc2VyaWFsMiA9ICZzZXJpYWwyOwotCQlzZXJpYWwzID0gJnNlcmlhbDM7Ci0JCXBjaTAgPSAmcGNpMDsKLQkJcGNpMSA9ICZwY2kxOwotCQlwY2kyID0gJnBjaTI7Ci0JCXBjaTMgPSAmcGNpMzsKLQkJdXNiMCA9ICZ1c2IwOwotCQl1c2IxID0gJnVzYjE7Ci0JCWRtYTAgPSAmZG1hMDsKLQkJZG1hMSA9ICZkbWExOwotCQlzZGhjID0gJnNkaGM7Ci0JCW1zaTAgPSAmbXNpMDsKLQkJbXNpMSA9ICZtc2kxOwotCQltc2kyID0gJm1zaTI7Ci0KLQkJY3J5cHRvID0gJmNyeXB0bzsKLQkJc2VjX2pyMCA9ICZzZWNfanIwOwotCQlzZWNfanIxID0gJnNlY19qcjE7Ci0JCXNlY19qcjIgPSAmc2VjX2pyMjsKLQkJc2VjX2pyMyA9ICZzZWNfanIzOwotCQlydGljX2EgPSAmcnRpY19hOwotCQlydGljX2IgPSAmcnRpY19iOwotCQlydGljX2MgPSAmcnRpY19jOwotCQlydGljX2QgPSAmcnRpY19kOwotCQlzZWNfbW9uID0gJnNlY19tb247Ci0KLS8qCi0JCXJpbzAgPSAmcmFwaWRpbzA7Ci0gKi8KLQl9OwotCi0JY3B1cyB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQotCQljcHUwOiBQb3dlclBDLGU1NTAwQDAgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwwPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzA+OwotCQkJTDJfMDogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCQljcHUxOiBQb3dlclBDLGU1NTAwQDEgewotCQkJZGV2aWNlX3R5cGUgPSAiY3B1IjsKLQkJCXJlZyA9IDwxPjsKLQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JkwyXzE+OwotCQkJTDJfMTogbDItY2FjaGUgewotCQkJCW5leHQtbGV2ZWwtY2FjaGUgPSA8JmNwYz47Ci0JCQl9OwotCQl9OwotCX07Ci0KLQlkY3NyOiBkY3NyQGYwMDAwMDAwMCB7Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJY29tcGF0aWJsZSA9ICJmc2wsZGNzciIsICJzaW1wbGUtYnVzIjsKLQotCQlkY3NyLWVwdUAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZXB1IjsKLQkJCWludGVycnVwdHMgPSA8NTIgMiAwIDAKLQkJCQkgICAgICA4NCAyIDAgMAotCQkJCSAgICAgIDg1IDIgMCAwPjsKLQkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OwotCQkJcmVnID0gPDB4MCAweDEwMDA+OwotCQl9OwotCQlkY3NyLW5wYyB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW5wYyI7Ci0JCQlyZWcgPSA8MHgxMDAwIDB4MTAwMCAweDEwMDAwMDAgMHg4MDAwPjsKLQkJfTsKLQkJZGNzci1ueGNAMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxkY3NyLW54YyI7Ci0JCQlyZWcgPSA8MHgyMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY29yZW5ldCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWNvcmVuZXQiOwotCQkJcmVnID0gPDB4ODAwMCAweDEwMDAgMHhCMDAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLWRwYWFAOTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kY3NyLWRwYWEiLCAiZnNsLGRjc3ItZHBhYSI7Ci0JCQlyZWcgPSA8MHg5MDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3Itb2NuQDExMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRjc3Itb2NuIiwgImZzbCxkY3NyLW9jbiI7Ci0JCQlyZWcgPSA8MHgxMTAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLWRkckAxMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWRkciI7Ci0JCQlkZXYtaGFuZGxlID0gPCZkZHIxPjsKLQkJCXJlZyA9IDwweDEyMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItZGRyQDEzMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZGRyIjsKLQkJCWRldi1oYW5kbGUgPSA8JmRkcjI+OwotCQkJcmVnID0gPDB4MTMwMDAgMHgxMDAwPjsKLQkJfTsKLQkJZGNzci1uYWxAMTgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZGNzci1uYWwiLCAiZnNsLGRjc3ItbmFsIjsKLQkJCXJlZyA9IDwweDE4MDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItcmNwbUAyMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kY3NyLXJjcG0iLCAiZnNsLGRjc3ItcmNwbSI7Ci0JCQlyZWcgPSA8MHgyMjAwMCAweDEwMDA+OwotCQl9OwotCQlkY3NyLWNwdS1zYi1wcm94eUA0MDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxkY3NyLWU1NTAwLXNiLXByb3h5IiwgImZzbCxkY3NyLWNwdS1zYi1wcm94eSI7Ci0JCQljcHUtaGFuZGxlID0gPCZjcHUwPjsKLQkJCXJlZyA9IDwweDQwMDAwIDB4MTAwMD47Ci0JCX07Ci0JCWRjc3ItY3B1LXNiLXByb3h5QDQxMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGRjc3ItZTU1MDAtc2ItcHJveHkiLCAiZnNsLGRjc3ItY3B1LXNiLXByb3h5IjsKLQkJCWNwdS1oYW5kbGUgPSA8JmNwdTE+OwotCQkJcmVnID0gPDB4NDEwMDAgMHgxMDAwPjsKLQkJfTsKLQl9OwotCi0Jc29jOiBzb2NAZmZlMDAwMDAwIHsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCQlkZXZpY2VfdHlwZSA9ICJzb2MiOwotCQljb21wYXRpYmxlID0gInNpbXBsZS1idXMiOwotCQlyYW5nZXMgPSA8MHgwMDAwMDAwMCAweGYgMHhmZTAwMDAwMCAweDEwMDAwMDA+OwotCQlyZWcgPSA8MHhmIDB4ZmUwMDAwMDAgMCAweDAwMDAxMDAwPjsKLQotCQlzb2Mtc3JhbS1lcnJvciB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxzb2Mtc3JhbS1lcnJvciI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAyOT47Ci0JCX07Ci0KLQkJY29yZW5ldC1sYXdAMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxjb3JlbmV0LWxhdyI7Ci0JCQlyZWcgPSA8MHgwIDB4MTAwMD47Ci0JCQlmc2wsbnVtLWxhd3MgPSA8MzI+OwotCQl9OwotCi0JCWRkcjE6IG1lbW9yeS1jb250cm9sbGVyQDgwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNSIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4ODAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjM+OwotCQl9OwotCi0JCWRkcjI6IG1lbW9yeS1jb250cm9sbGVyQDkwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXItdjQuNSIsICJmc2wscW9yaXEtbWVtb3J5LWNvbnRyb2xsZXIiOwotCQkJcmVnID0gPDB4OTAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMjI+OwotCQl9OwotCi0JCWNwYzogbDMtY2FjaGUtY29udHJvbGxlckAxMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1sMy1jYWNoZS1jb250cm9sbGVyIiwgImZzbCxwNDA4MC1sMy1jYWNoZS1jb250cm9sbGVyIiwgImNhY2hlIjsKLQkJCXJlZyA9IDwweDEwMDAwIDB4MTAwMAotCQkJICAgICAgIDB4MTEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDI3Ci0JCQkJICAgICAgMTYgMiAxIDI2PjsKLQkJfTsKLQotCQljb3JlbmV0LWNmQDE4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLGNvcmVuZXQtY2YiOwotCQkJcmVnID0gPDB4MTgwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8MTYgMiAxIDMxPjsKLQkJCWZzbCxjY2YtbnVtLWNzZGlkcyA9IDwzMj47Ci0JCQlmc2wsY2NmLW51bS1zbm9vcGlkcyA9IDwzMj47Ci0JCX07Ci0KLQkJaW9tbXVAMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscGFtdS12MS4wIiwgImZzbCxwYW11IjsKLQkJCXJlZyA9IDwweDIwMDAwIDB4NDAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPAotCQkJCTI0IDIgMCAwCi0JCQkJMTYgMiAxIDMwPjsKLQkJfTsKLQotCQltcGljOiBwaWNANDAwMDAgewotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0LWNvbnRyb2xsZXI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwwPjsKLQkJCSNpbnRlcnJ1cHQtY2VsbHMgPSA8ND47Ci0JCQlyZWcgPSA8MHg0MDAwMCAweDQwMDAwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMiLCAiY2hycCxvcGVuLXBpYyI7Ci0JCQlkZXZpY2VfdHlwZSA9ICJvcGVuLXBpYyI7Ci0JCX07Ci0KLQkJbXNpMDogbXNpQDQxNjAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxNjAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGUwIDAgMCAwCi0JCQkJMHhlMSAwIDAgMAotCQkJCTB4ZTIgMCAwIDAKLQkJCQkweGUzIDAgMCAwCi0JCQkJMHhlNCAwIDAgMAotCQkJCTB4ZTUgMCAwIDAKLQkJCQkweGU2IDAgMCAwCi0JCQkJMHhlNyAwIDAgMD47Ci0JCX07Ci0KLQkJbXNpMTogbXNpQDQxODAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxODAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGU4IDAgMCAwCi0JCQkJMHhlOSAwIDAgMAotCQkJCTB4ZWEgMCAwIDAKLQkJCQkweGViIDAgMCAwCi0JCQkJMHhlYyAwIDAgMAotCQkJCTB4ZWQgMCAwIDAKLQkJCQkweGVlIDAgMCAwCi0JCQkJMHhlZiAwIDAgMD47Ci0JCX07Ci0KLQkJbXNpMjogbXNpQDQxYTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLG1waWMtbXNpIjsKLQkJCXJlZyA9IDwweDQxYTAwIDB4MjAwPjsKLQkJCW1zaS1hdmFpbGFibGUtcmFuZ2VzID0gPDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwKLQkJCQkweGYwIDAgMCAwCi0JCQkJMHhmMSAwIDAgMAotCQkJCTB4ZjIgMCAwIDAKLQkJCQkweGYzIDAgMCAwCi0JCQkJMHhmNCAwIDAgMAotCQkJCTB4ZjUgMCAwIDAKLQkJCQkweGY2IDAgMCAwCi0JCQkJMHhmNyAwIDAgMD47Ci0JCX07Ci0KLQkJZ3V0czogZ2xvYmFsLXV0aWxpdGllc0BlMDAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1kZXZpY2UtY29uZmlnLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMDAwMCAweGUwMD47Ci0JCQlmc2wsaGFzLXJzdGNyOwotCQkJI3NsZWVwLWNlbGxzID0gPDE+OwotCQkJZnNsLGxpb2RuLWJpdHMgPSA8MTI+OwotCQl9OwotCi0JCXBpbnM6IGdsb2JhbC11dGlsaXRpZXNAZTBlMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtcGluLWNvbnRyb2wtMS4wIjsKLQkJCXJlZyA9IDwweGUwZTAwIDB4MjAwPjsKLQkJCSNzbGVlcC1jZWxscyA9IDwyPjsKLQkJfTsKLQotCQljbG9ja2dlbjogZ2xvYmFsLXV0aWxpdGllc0BlMTAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1jbG9ja2dlbiIsICJmc2wscW9yaXEtY2xvY2tnZW4tMS4wIjsKLQkJCXJlZyA9IDwweGUxMDAwIDB4MTAwMD47Ci0JCQljbG9jay1mcmVxdWVuY3kgPSA8MD47Ci0JCX07Ci0KLQkJcmNwbTogZ2xvYmFsLXV0aWxpdGllc0BlMjAwMCB7Ci0JCQljb21wYXRpYmxlID0gImZzbCxxb3JpcS1yY3BtLTEuMCI7Ci0JCQlyZWcgPSA8MHhlMjAwMCAweDEwMDA+OwotCQkJI3NsZWVwLWNlbGxzID0gPDE+OwotCQl9OwotCi0JCXNmcDogc2ZwQGU4MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLXNmcCIsICJmc2wscW9yaXEtc2ZwLTEuMCI7Ci0JCQlyZWcJICAgPSA8MHhlODAwMCAweDEwMDA+OwotCQl9OwotCi0JCXNlcmRlczogc2VyZGVzQGVhMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLXNlcmRlcyI7Ci0JCQlyZWcJICAgPSA8MHhlYTAwMCAweDEwMDA+OwotCQl9OwotCi0JCWRtYTA6IGRtYUAxMDAzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAwMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAwMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDI4IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8MjkgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMwIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzMSAyIDAgMD47Ci0JCQl9OwotCQl9OwotCi0JCWRtYTE6IGRtYUAxMDEzMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRtYSIsICJmc2wsZWxvcGx1cy1kbWEiOwotCQkJcmVnID0gPDB4MTAxMzAwIDB4ND47Ci0JCQlyYW5nZXMgPSA8MHgwIDB4MTAxMTAwIDB4MjAwPjsKLQkJCWNlbGwtaW5kZXggPSA8MT47Ci0JCQlkbWEtY2hhbm5lbEAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1kbWEtY2hhbm5lbCIsCi0JCQkJCQkiZnNsLGVsb3BsdXMtZG1hLWNoYW5uZWwiOwotCQkJCXJlZyA9IDwweDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDMyIDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEA4MCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHg4MCAweDgwPjsKLQkJCQljZWxsLWluZGV4ID0gPDE+OwotCQkJCWludGVycnVwdHMgPSA8MzMgMiAwIDA+OwotCQkJfTsKLQkJCWRtYS1jaGFubmVsQDEwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZG1hLWNoYW5uZWwiLAotCQkJCQkJImZzbCxlbG9wbHVzLWRtYS1jaGFubmVsIjsKLQkJCQlyZWcgPSA8MHgxMDAgMHg4MD47Ci0JCQkJY2VsbC1pbmRleCA9IDwyPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDM0IDIgMCAwPjsKLQkJCX07Ci0JCQlkbWEtY2hhbm5lbEAxODAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWRtYS1jaGFubmVsIiwKLQkJCQkJCSJmc2wsZWxvcGx1cy1kbWEtY2hhbm5lbCI7Ci0JCQkJcmVnID0gPDB4MTgwIDB4ODA+OwotCQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQkJaW50ZXJydXB0cyA9IDwzNSAyIDAgMD47Ci0JCQl9OwotCQl9OwotCi0JCXNwaUAxMTAwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWVzcGkiLCAiZnNsLG1wYzg1MzYtZXNwaSI7Ci0JCQlyZWcgPSA8MHgxMTAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NTMgMHgyIDAgMD47Ci0JCQlmc2wsZXNwaS1udW0tY2hpcHNlbGVjdHMgPSA8ND47Ci0JCX07Ci0KLQkJc2RoYzogc2RoY0AxMTQwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtZXNkaGMiLCAiZnNsLGVzZGhjIjsKLQkJCXJlZyA9IDwweDExNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw0OCAyIDAgMD47Ci0JCQlzZGhjaSxhdXRvLWNtZDEyOwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQl9OwotCi0JCWkyY0AxMTgwMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8MD47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE4MDAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzggMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJaTJjQDExODEwMCB7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDA+OwotCQkJY2VsbC1pbmRleCA9IDwxPjsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLWkyYyI7Ci0JCQlyZWcgPSA8MHgxMTgxMDAgMHgxMDA+OwotCQkJaW50ZXJydXB0cyA9IDwzOCAyIDAgMD47Ci0JCQlkZnNycjsKLQkJfTsKLQotCQlpMmNAMTE5MDAwIHsKLQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8MD47Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJY29tcGF0aWJsZSA9ICJmc2wtaTJjIjsKLQkJCXJlZyA9IDwweDExOTAwMCAweDEwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDM5IDIgMCAwPjsKLQkJCWRmc3JyOwotCQl9OwotCi0JCWkyY0AxMTkxMDAgewotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWNlbGwtaW5kZXggPSA8Mz47Ci0JCQljb21wYXRpYmxlID0gImZzbC1pMmMiOwotCQkJcmVnID0gPDB4MTE5MTAwIDB4MTAwPjsKLQkJCWludGVycnVwdHMgPSA8MzkgMiAwIDA+OwotCQkJZGZzcnI7Ci0JCX07Ci0KLQkJc2VyaWFsMDogc2VyaWFsQDExYzUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDA+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWM1MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMTogc2VyaWFsQDExYzYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDE+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWM2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNiAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMjogc2VyaWFsQDExZDUwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDI+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWQ1MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47Ci0JCX07Ci0KLQkJc2VyaWFsMzogc2VyaWFsQDExZDYwMCB7Ci0JCQljZWxsLWluZGV4ID0gPDM+OwotCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7Ci0JCQlyZWcgPSA8MHgxMWQ2MDAgMHgxMDA+OwotCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwotCQkJaW50ZXJydXB0cyA9IDwzNyAyIDAgMD47Ci0JCX07Ci0KLQkJZ3BpbzA6IGdwaW9AMTMwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLWdwaW8iLCAiZnNsLHFvcmlxLWdwaW8iOwotCQkJcmVnID0gPDB4MTMwMDAwIDB4MTAwMD47Ci0JCQlpbnRlcnJ1cHRzID0gPDU1IDIgMCAwPjsKLQkJCSNncGlvLWNlbGxzID0gPDI+OwotCQkJZ3Bpby1jb250cm9sbGVyOwotCQl9OwotCi0JCXVzYjA6IHVzYkAyMTAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtdXNiMi1tcGgiLAotCQkJCQkiZnNsLG1wYzg1eHgtdXNiMi1tcGgiLCAiZnNsLXVzYjItbXBoIjsKLQkJCXJlZyA9IDwweDIxMDAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDQgMHgyIDAgMD47Ci0JCQlwaHlfdHlwZSA9ICJ1dG1pIjsKLQkJCXBvcnQwOwotCQl9OwotCi0JCXVzYjE6IHVzYkAyMTEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtdXNiMi1kciIsCi0JCQkJCSJmc2wsbXBjODV4eC11c2IyLWRyIiwgImZzbC11c2IyLWRyIjsKLQkJCXJlZyA9IDwweDIxMTAwMCAweDEwMDA+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8MT47Ci0JCQkjc2l6ZS1jZWxscyA9IDwwPjsKLQkJCWludGVycnVwdHMgPSA8NDUgMHgyIDAgMD47Ci0JCQlkcl9tb2RlID0gImhvc3QiOwotCQkJcGh5X3R5cGUgPSAidXRtaSI7Ci0JCX07Ci0KLQkJc2F0YUAyMjAwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtc2F0YSIsICJmc2wscHEtc2F0YS12MiI7Ci0JCQlyZWcgPSA8MHgyMjAwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NjggMHgyIDAgMD47Ci0JCX07Ci0KLQkJc2F0YUAyMjEwMDAgewotCQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtc2F0YSIsICJmc2wscHEtc2F0YS12MiI7Ci0JCQlyZWcgPSA8MHgyMjEwMDAgMHgxMDAwPjsKLQkJCWludGVycnVwdHMgPSA8NjkgMHgyIDAgMD47Ci0JCX07Ci0KLQkJY3J5cHRvOiBjcnlwdG9AMzAwMDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yIiwgImZzbCxzZWMtdjQuMCI7Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJcmVnCQkgPSA8MHgzMDAwMDAgMHgxMDAwMD47Ci0JCQlyYW5nZXMJCSA9IDwwIDB4MzAwMDAwIDB4MTAwMDA+OwotCQkJaW50ZXJydXB0cwkgPSA8OTIgMiAwIDA+OwotCi0JCQlzZWNfanIwOiBqckAxMDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4MTAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8ODggMiAwIDA+OwotCQkJfTsKLQotCQkJc2VjX2pyMToganJAMjAwMCB7Ci0JCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItam9iLXJpbmciLAotCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtam9iLXJpbmciOwotCQkJCXJlZyA9IDwweDIwMDAgMHgxMDAwPjsKLQkJCQlpbnRlcnJ1cHRzID0gPDg5IDIgMCAwPjsKLQkJCX07Ci0KLQkJCXNlY19qcjI6IGpyQDMwMDAgewotCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLWpvYi1yaW5nIiwKLQkJCQkJICAgICAiZnNsLHNlYy12NC4wLWpvYi1yaW5nIjsKLQkJCQlyZWcgPSA8MHgzMDAwIDB4MTAwMD47Ci0JCQkJaW50ZXJydXB0cyA9IDw5MCAyIDAgMD47Ci0JCQl9OwotCi0JCQlzZWNfanIzOiBqckA0MDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1qb2ItcmluZyIsCi0JCQkJCSAgICAgImZzbCxzZWMtdjQuMC1qb2ItcmluZyI7Ci0JCQkJcmVnID0gPDB4NDAwMCAweDEwMDA+OwotCQkJCWludGVycnVwdHMgPSA8OTEgMiAwIDA+OwotCQkJfTsKLQotCQkJcnRpY0A2MDAwIHsKLQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljIiwKLQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMiOwotCQkJCSNhZGRyZXNzLWNlbGxzID0gPDE+OwotCQkJCSNzaXplLWNlbGxzID0gPDE+OwotCQkJCXJlZyA9IDwweDYwMDAgMHgxMDA+OwotCQkJCXJhbmdlcyA9IDwweDAgMHg2MTAwIDB4ZTAwPjsKLQotCQkJCXJ0aWNfYTogcnRpYy1hQDAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCi0JCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHgwMCAweDIwIDB4MTAwIDB4ODA+OwotCQkJCX07Ci0KLQkJCQlydGljX2I6IHJ0aWMtYkAyMCB7Ci0JCQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLXJ0aWMtbWVtb3J5IiwKLQkJCQkJCSAgICAgImZzbCxzZWMtdjQuMC1ydGljLW1lbW9yeSI7Ci0JCQkJCXJlZyA9IDwweDIwIDB4MjAgMHgyMDAgMHg4MD47Ci0JCQkJfTsKLQotCQkJCXJ0aWNfYzogcnRpYy1jQDQwIHsKLQkJCQkJY29tcGF0aWJsZSA9ICJmc2wsc2VjLXY0LjItcnRpYy1tZW1vcnkiLAotCQkJCQkJICAgICAiZnNsLHNlYy12NC4wLXJ0aWMtbWVtb3J5IjsKLQkJCQkJcmVnID0gPDB4NDAgMHgyMCAweDMwMCAweDgwPjsKLQkJCQl9OwotCi0JCQkJcnRpY19kOiBydGljLWRANjAgewotCQkJCQljb21wYXRpYmxlID0gImZzbCxzZWMtdjQuMi1ydGljLW1lbW9yeSIsCi0JCQkJCQkgICAgICJmc2wsc2VjLXY0LjAtcnRpYy1tZW1vcnkiOwotCQkJCQlyZWcgPSA8MHg2MCAweDIwIDB4NTAwIDB4ODA+OwotCQkJCX07Ci0JCQl9OwotCQl9OwotCi0JCXNlY19tb246IHNlY19tb25AMzE0MDAwIHsKLQkJCWNvbXBhdGlibGUgPSAiZnNsLHNlYy12NC4yLW1vbiIsICJmc2wsc2VjLXY0LjAtbW9uIjsKLQkJCXJlZyA9IDwweDMxNDAwMCAweDEwMDA+OwotCQkJaW50ZXJydXB0cyA9IDw5MyAyIDAgMD47Ci0JCX07Ci0JfTsKLQotLyoKLQlyYXBpZGlvMDogcmFwaWRpb0BmZmUwYzAwMDAKLSovCi0KLQlsb2NhbGJ1c0BmZmUxMjQwMDAgewotCQljb21wYXRpYmxlID0gImZzbCxwNTAyMC1lbGJjIiwgImZzbCxlbGJjIiwgInNpbXBsZS1idXMiOwotCQlpbnRlcnJ1cHRzID0gPDI1IDIgMCAwPjsKLQkJI2FkZHJlc3MtY2VsbHMgPSA8Mj47Ci0JCSNzaXplLWNlbGxzID0gPDE+OwotCX07Ci0KLQlwY2kwOiBwY2llQGZmZTIwMDAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJYnVzLXJhbmdlID0gPDB4MCAweGZmPjsKLQkJY2xvY2stZnJlcXVlbmN5ID0gPDB4MWZjYTA1NT47Ci0JCWZzbCxtc2kgPSA8Jm1zaTA+OwotCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxNT47Ci0KLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTU+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCS8qIElEU0VMIDB4MCAqLwotCQkJCTAwMDAgMCAwIDEgJm1waWMgNDAgMSAwIDAKLQkJCQkwMDAwIDAgMCAyICZtcGljIDEgMSAwIDAKLQkJCQkwMDAwIDAgMCAzICZtcGljIDIgMSAwIDAKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDMgMSAwIDAKLQkJCQk+OwotCQl9OwotCX07Ci0KLQlwY2kxOiBwY2llQGZmZTIwMTAwMCB7Ci0JCWNvbXBhdGlibGUgPSAiZnNsLHA1MDIwLXBjaWUiLCAiZnNsLHFvcmlxLXBjaWUtdjIuMiI7Ci0JCWRldmljZV90eXBlID0gInBjaSI7Ci0JCSNzaXplLWNlbGxzID0gPDI+OwotCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJYnVzLXJhbmdlID0gPDAgMHhmZj47Ci0JCWNsb2NrLWZyZXF1ZW5jeSA9IDwweDFmY2EwNTU+OwotCQlmc2wsbXNpID0gPCZtc2kxPjsKLQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTQ+OwotCQlwY2llQDAgewotCQkJcmVnID0gPDAgMCAwIDAgMD47Ci0JCQkjaW50ZXJydXB0LWNlbGxzID0gPDE+OwotCQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCQkjYWRkcmVzcy1jZWxscyA9IDwzPjsKLQkJCWRldmljZV90eXBlID0gInBjaSI7Ci0JCQlpbnRlcnJ1cHRzID0gPDE2IDIgMSAxND47Ci0JCQlpbnRlcnJ1cHQtbWFwLW1hc2sgPSA8MHhmODAwIDAgMCA3PjsKLQkJCWludGVycnVwdC1tYXAgPSA8Ci0JCQkJLyogSURTRUwgMHgwICovCi0JCQkJMDAwMCAwIDAgMSAmbXBpYyA0MSAxIDAgMAotCQkJCTAwMDAgMCAwIDIgJm1waWMgNSAxIDAgMAotCQkJCTAwMDAgMCAwIDMgJm1waWMgNiAxIDAgMAotCQkJCTAwMDAgMCAwIDQgJm1waWMgNyAxIDAgMAotCQkJCT47Ci0JCX07Ci0JfTsKLQotCXBjaTI6IHBjaWVAZmZlMjAyMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKLQkJZnNsLG1zaSA9IDwmbXNpMj47Ci0JCWludGVycnVwdHMgPSA8MTYgMiAxIDEzPjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTM+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCS8qIElEU0VMIDB4MCAqLwotCQkJCTAwMDAgMCAwIDEgJm1waWMgNDIgMSAwIDAKLQkJCQkwMDAwIDAgMCAyICZtcGljIDkgMSAwIDAKLQkJCQkwMDAwIDAgMCAzICZtcGljIDEwIDEgMCAwCi0JCQkJMDAwMCAwIDAgNCAmbXBpYyAxMSAxIDAgMAotCQkJCT47Ci0JCX07Ci0JfTsKLQotCXBjaTM6IHBjaWVAZmZlMjAzMDAwIHsKLQkJY29tcGF0aWJsZSA9ICJmc2wscDUwMjAtcGNpZSIsICJmc2wscW9yaXEtcGNpZS12Mi4yIjsKLQkJZGV2aWNlX3R5cGUgPSAicGNpIjsKLQkJI3NpemUtY2VsbHMgPSA8Mj47Ci0JCSNhZGRyZXNzLWNlbGxzID0gPDM+OwotCQlidXMtcmFuZ2UgPSA8MHgwIDB4ZmY+OwotCQljbG9jay1mcmVxdWVuY3kgPSA8MHgxZmNhMDU1PjsKLQkJZnNsLG1zaSA9IDwmbXNpMj47Ci0JCWludGVycnVwdHMgPSA8MTYgMiAxIDEyPjsKLQkJcGNpZUAwIHsKLQkJCXJlZyA9IDwwIDAgMCAwIDA+OwotCQkJI2ludGVycnVwdC1jZWxscyA9IDwxPjsKLQkJCSNzaXplLWNlbGxzID0gPDI+OwotCQkJI2FkZHJlc3MtY2VsbHMgPSA8Mz47Ci0JCQlkZXZpY2VfdHlwZSA9ICJwY2kiOwotCQkJaW50ZXJydXB0cyA9IDwxNiAyIDEgMTI+OwotCQkJaW50ZXJydXB0LW1hcC1tYXNrID0gPDB4ZjgwMCAwIDAgNz47Ci0JCQlpbnRlcnJ1cHQtbWFwID0gPAotCQkJCS8qIElEU0VMIDB4MCAqLwotCQkJCTAwMDAgMCAwIDEgJm1waWMgNDMgMSAwIDAKLQkJCQkwMDAwIDAgMCAyICZtcGljIDAgMSAwIDAKLQkJCQkwMDAwIDAgMCAzICZtcGljIDQgMSAwIDAKLQkJCQkwMDAwIDAgMCA0ICZtcGljIDggMSAwIDAKLQkJCQk+OwotCQl9OwotCX07Ci19OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NiYzgzNDkuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NiYzgzNDkuZHRzCmluZGV4IDBkYzkwZjkuLmIxZTQ1YTggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zYmM4MzQ5LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2JjODM0OS5kdHMKQEAgLTIyMiw3ICsyMjIsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDkgMHg4PjsKQEAgLTIzMiw3ICsyMzIsNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDEwIDB4OD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2JjODU0OC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2JjODU0OC5kdHMKaW5kZXggOTRhMzMyMi4uNzdiZTc3MSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NiYzg1NDguZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zYmM4NTQ4LmR0cwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/CiAJCQlpbnRlcnJ1cHRzID0gPDB4MmEgMHgyPjsKQEAgLTMyNiw3ICszMjYsNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwogCQkJaW50ZXJydXB0cyA9IDwweDJhIDB4Mj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2JjODY0MWQuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NiYzg2NDFkLmR0cwppbmRleCBlZTU1MzhmLi41NmJlYmNlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc2JjODY0MWQuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zYmM4NjQxZC5kdHMKQEAgLTM0Nyw3ICszNDcsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpAQCAtMzU3LDcgKzM1Nyw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8MjggMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc29jcmF0ZXMuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3NvY3JhdGVzLmR0cwppbmRleCAzOGMzNTQwLi4xMzRhNWZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc29jcmF0ZXMuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zb2NyYXRlcy5kdHMKQEAgLTE5OSw3ICsxOTksNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpAQCAtMjA5LDcgKzIwOSw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8NDIgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc3RvcmNlbnRlci5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc3RvcmNlbnRlci5kdHMKaW5kZXggZWFiNjgwYy4uMmE1NTU3MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3N0b3JjZW50ZXIuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zdG9yY2VudGVyLmR0cwpAQCAtNzQsNyArNzQsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDIwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDw5NzU1MzgwMD47IC8qIEh6ICovCiAJCQljdXJyZW50LXNwZWVkID0gPDExNTIwMD47CkBAIC04NSw3ICs4NSw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MjA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDk3NTUzODAwPjsgLyogSHogKi8KIAkJCWN1cnJlbnQtc3BlZWQgPSA8OTYwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc3R4c3NhODU1NS5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvc3R4c3NhODU1NS5kdHMKaW5kZXggNDllZmQ0NC4uNGYxNjZiMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3N0eHNzYTg1NTUuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy9zdHhzc2E4NTU1LmR0cwpAQCAtMjEwLDcgKzIxMCw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsgCS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KIAkJCWludGVycnVwdHMgPSA8NDIgMj47CkBAIC0yMjAsNyArMjIwLDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDAuZHRzCmluZGV4IDBhNGNlZGIuLmVkMjY0ZDkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQwLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0MC5kdHMKQEAgLTI1MCw3ICsyNTAsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47IAkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OyAJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpAQCAtMjYwLDcgKzI2MCw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwogCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQxLmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQxLmR0cwppbmRleCBmNDlkMDkxLi45MjUyNDIxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0MS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDEuZHRzCkBAIC0yMjQsNyArMjI0LDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwogCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKQEAgLTIzNCw3ICsyMzQsNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KIAkJCWludGVycnVwdHMgPSA8NDIgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0OC1iaWdmbGFzaC5kdHMgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0OC1iaWdmbGFzaC5kdHMKaW5kZXggOTQ1MmMzYy4uNmUxYWM1MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDgtYmlnZmxhc2guZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQ4LWJpZ2ZsYXNoLmR0cwpAQCAtMzA1LDcgKzMwNSw3IEBACiAJCXNlcmlhbDA6IHNlcmlhbEA0NTAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MD47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NTAwIDB4MTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/CiAJCQljdXJyZW50LXNwZWVkID0gPDExNTIwMD47CkBAIC0zMTYsNyArMzE2LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwkvLyByZWcgYmFzZSwgc2l6ZQogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KIAkJCWN1cnJlbnQtc3BlZWQgPSA8MTE1MjAwPjsKQEAgLTM1Miw3ICszNTIsNyBAQAogCQlyYW5nZXMgPSA8CiAJCQkwIDB4MCAweGZjMDAwMDAwIDB4MDQwMDAwMDAJLy8gTk9SIEZMQVNIIGJhbmsgMQogCQkJMSAweDAgMHhmODAwMDAwMCAweDA4MDAwMDAwCS8vIE5PUiBGTEFTSCBiYW5rIDAKLQkJCTIgMHgwIDB4YTMwMDAwMDAgMHgwMDAwODAwMAkvLyBDQU4gKDIgeCBpODI1MjcpCisJCQkyIDB4MCAweGEzMDAwMDAwIDB4MDAwMDgwMDAJLy8gQ0FOICgyIHggQ0M3NzApCiAJCQkzIDB4MCAweGEzMDEwMDAwIDB4MDAwMDgwMDAJLy8gTkFORCBGTEFTSAogCiAJCT47CkBAIC0zOTMsMTggKzM5MywyNyBAQAogCQl9OwogCiAJCS8qIE5vdGU6IENBTiBzdXBwb3J0IG5lZWRzIGJlIGVuYWJsZWQgaW4gVS1Cb290ICovCi0JCWNhbjBAMiwwIHsKLQkJCWNvbXBhdGlibGUgPSAiaW50ZWwsODI1MjciOyAvLyBCb3NjaCBDQzc3MAorCQljYW5AMiwwIHsKKwkJCWNvbXBhdGlibGUgPSAiYm9zY2gsY2M3NzAiOyAvLyBCb3NjaCBDQzc3MAogCQkJcmVnID0gPDIgMHgwIDB4MTAwPjsKIAkJCWludGVycnVwdHMgPSA8NCAxPjsKIAkJCWludGVycnVwdC1wYXJlbnQgPSA8Jm1waWM+OworCQkJYm9zY2gsZXh0ZXJuYWwtY2xvY2stZnJlcXVlbmN5ID0gPDE2MDAwMDAwPjsKKwkJCWJvc2NoLGRpc2Nvbm5lY3QtcngxLWlucHV0OworCQkJYm9zY2gsZGlzY29ubmVjdC10eDEtb3V0cHV0OworCQkJYm9zY2gsaXNvLWxvdy1zcGVlZC1tdXg7CisJCQlib3NjaCxjbG9jay1vdXQtZnJlcXVlbmN5ID0gPDE2MDAwMDAwPjsKIAkJfTsKIAotCQljYW4xQDIsMTAwIHsKLQkJCWNvbXBhdGlibGUgPSAiaW50ZWwsODI1MjciOyAvLyBCb3NjaCBDQzc3MAorCQljYW5AMiwxMDAgeworCQkJY29tcGF0aWJsZSA9ICJib3NjaCxjYzc3MCI7IC8vIEJvc2NoIENDNzcwCiAJCQlyZWcgPSA8MiAweDEwMCAweDEwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDQgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWJvc2NoLGV4dGVybmFsLWNsb2NrLWZyZXF1ZW5jeSA9IDwxNjAwMDAwMD47CisJCQlib3NjaCxkaXNjb25uZWN0LXJ4MS1pbnB1dDsKKwkJCWJvc2NoLGRpc2Nvbm5lY3QtdHgxLW91dHB1dDsKKwkJCWJvc2NoLGlzby1sb3ctc3BlZWQtbXV4OwogCQl9OwogCiAJCS8qIE5vdGU6IE5BTkQgc3VwcG9ydCBuZWVkcyB0byBiZSBlbmFibGVkIGluIFUtQm9vdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDguZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NDguZHRzCmluZGV4IDYxOTc3NmYuLjE2MWU3NWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTQ4LmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU0OC5kdHMKQEAgLTMwNSw3ICszMDUsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwogCQkJY3VycmVudC1zcGVlZCA9IDwxMTUyMDA+OwpAQCAtMzE2LDcgKzMxNiw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsJLy8gc2hvdWxkIHdlIGZpbGwgaW4gaW4gdWJvb3Q/CiAJCQljdXJyZW50LXNwZWVkID0gPDExNTIwMD47CkBAIC0zNTIsNyArMzUyLDcgQEAKIAkJcmFuZ2VzID0gPAogCQkJMCAweDAgMHhmYzAwMDAwMCAweDA0MDAwMDAwCS8vIE5PUiBGTEFTSCBiYW5rIDEKIAkJCTEgMHgwIDB4ZjgwMDAwMDAgMHgwODAwMDAwMAkvLyBOT1IgRkxBU0ggYmFuayAwCi0JCQkyIDB4MCAweGUzMDAwMDAwIDB4MDAwMDgwMDAJLy8gQ0FOICgyIHggaTgyNTI3KQorCQkJMiAweDAgMHhlMzAwMDAwMCAweDAwMDA4MDAwCS8vIENBTiAoMiB4IENDNzcwKQogCQkJMyAweDAgMHhlMzAxMDAwMCAweDAwMDA4MDAwCS8vIE5BTkQgRkxBU0gKIAogCQk+OwpAQCAtMzkzLDE4ICszOTMsMjcgQEAKIAkJfTsKIAogCQkvKiBOb3RlOiBDQU4gc3VwcG9ydCBuZWVkcyBiZSBlbmFibGVkIGluIFUtQm9vdCAqLwotCQljYW4wQDIsMCB7Ci0JCQljb21wYXRpYmxlID0gImludGVsLDgyNTI3IjsgLy8gQm9zY2ggQ0M3NzAKKwkJY2FuQDIsMCB7CisJCQljb21wYXRpYmxlID0gImJvc2NoLGNjNzcwIjsgLy8gQm9zY2ggQ0M3NzAKIAkJCXJlZyA9IDwyIDB4MCAweDEwMD47CiAJCQlpbnRlcnJ1cHRzID0gPDQgMT47CiAJCQlpbnRlcnJ1cHQtcGFyZW50ID0gPCZtcGljPjsKKwkJCWJvc2NoLGV4dGVybmFsLWNsb2NrLWZyZXF1ZW5jeSA9IDwxNjAwMDAwMD47CisJCQlib3NjaCxkaXNjb25uZWN0LXJ4MS1pbnB1dDsKKwkJCWJvc2NoLGRpc2Nvbm5lY3QtdHgxLW91dHB1dDsKKwkJCWJvc2NoLGlzby1sb3ctc3BlZWQtbXV4OworCQkJYm9zY2gsY2xvY2stb3V0LWZyZXF1ZW5jeSA9IDwxNjAwMDAwMD47CiAJCX07CiAKLQkJY2FuMUAyLDEwMCB7Ci0JCQljb21wYXRpYmxlID0gImludGVsLDgyNTI3IjsgLy8gQm9zY2ggQ0M3NzAKKwkJY2FuQDIsMTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiYm9zY2gsY2M3NzAiOyAvLyBCb3NjaCBDQzc3MAogCQkJcmVnID0gPDIgMHgxMDAgMHgxMDA+OwogCQkJaW50ZXJydXB0cyA9IDw0IDE+OwogCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisJCQlib3NjaCxleHRlcm5hbC1jbG9jay1mcmVxdWVuY3kgPSA8MTYwMDAwMDA+OworCQkJYm9zY2gsZGlzY29ubmVjdC1yeDEtaW5wdXQ7CisJCQlib3NjaCxkaXNjb25uZWN0LXR4MS1vdXRwdXQ7CisJCQlib3NjaCxpc28tbG93LXNwZWVkLW11eDsKIAkJfTsKIAogCQkvKiBOb3RlOiBOQU5EIHN1cHBvcnQgbmVlZHMgdG8gYmUgZW5hYmxlZCBpbiBVLUJvb3QgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTU1LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04NTU1LmR0cwppbmRleCA4MWJhZDhjLi5hYTZmZjBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtODU1NS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3RxbTg1NTUuZHRzCkBAIC0yMjQsNyArMjI0LDcgQEAKIAkJc2VyaWFsMDogc2VyaWFsQDQ1MDAgewogCQkJY2VsbC1pbmRleCA9IDwwPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ1MDAgMHgxMDA+OyAJLy8gcmVnIGJhc2UsIHNpemUKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsgCS8vIHNob3VsZCB3ZSBmaWxsIGluIGluIHVib290PwogCQkJaW50ZXJydXB0cyA9IDw0MiAyPjsKQEAgLTIzNCw3ICsyMzQsNyBAQAogCQlzZXJpYWwxOiBzZXJpYWxANDYwMCB7CiAJCQljZWxsLWluZGV4ID0gPDE+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDYwMCAweDEwMD47CS8vIHJlZyBiYXNlLCBzaXplCiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47IAkvLyBzaG91bGQgd2UgZmlsbCBpbiBpbiB1Ym9vdD8KIAkJCWludGVycnVwdHMgPSA8NDIgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMvdHFtOHh4LmR0cyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04eHguZHRzCmluZGV4IGY2ZGE3ZWMuLmMzZGJhMjUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04eHguZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy90cW04eHguZHRzCkBAIC01Nyw2ICs1Nyw3IEBACiAKIAkJcmFuZ2VzID0gPAogCQkJMHgwIDB4MCAweDQwMDAwMDAwIDB4ODAwMDAwCisJCQkweDMgMHgwIDB4YzAwMDAwMDAgMHgyMDAKIAkJPjsKIAogCQlmbGFzaEAwLDAgewpAQCAtNjcsNiArNjgsMzAgQEAKIAkJCWJhbmstd2lkdGggPSA8ND47CiAJCQlkZXZpY2Utd2lkdGggPSA8Mj47CiAJCX07CisKKwkJLyogTm90ZTogQ0FOIHN1cHBvcnQgbmVlZHMgYmUgZW5hYmxlZCBpbiBVLUJvb3QgKi8KKwkJY2FuQDMsMCB7CisJCQljb21wYXRpYmxlID0gImludGMsODI1MjciOworCQkJcmVnID0gPDMgMHgwIDB4ODA+OworCQkJaW50ZXJydXB0cyA9IDw4IDE+OworCQkJaW50ZXJydXB0LXBhcmVudCA9IDwmUElDPjsKKwkJCWJvc2NoLGV4dGVybmFsLWNsb2NrLWZyZXF1ZW5jeSA9IDwxNjAwMDAwMD47CisJCQlib3NjaCxkaXNjb25uZWN0LXJ4MS1pbnB1dDsKKwkJCWJvc2NoLGRpc2Nvbm5lY3QtdHgxLW91dHB1dDsKKwkJCWJvc2NoLGlzby1sb3ctc3BlZWQtbXV4OworCQkJYm9zY2gsY2xvY2stb3V0LWZyZXF1ZW5jeSA9IDwxNjAwMDAwMD47CisJCX07CisKKwkJY2FuQDMsMTAwIHsKKwkJCWNvbXBhdGlibGUgPSAiaW50Yyw4MjUyNyI7CisJCQlyZWcgPSA8MyAweDEwMCAweDgwPjsKKwkJCWludGVycnVwdHMgPSA8OCAxPjsKKwkJCWludGVycnVwdC1wYXJlbnQgPSA8JlBJQz47CisJCQlib3NjaCxleHRlcm5hbC1jbG9jay1mcmVxdWVuY3kgPSA8MTYwMDAwMDA+OworCQkJYm9zY2gsZGlzY29ubmVjdC1yeDEtaW5wdXQ7CisJCQlib3NjaCxkaXNjb25uZWN0LXR4MS1vdXRwdXQ7CisJCQlib3NjaCxpc28tbG93LXNwZWVkLW11eDsKKwkJfTsKIAl9OwogCiAJc29jQGZmZjAwMDAwIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy94Y2FsaWJ1cjE1MDEuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hjYWxpYnVyMTUwMS5kdHMKaW5kZXggYWMwYTYxNy4uY2MwMGY0ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hjYWxpYnVyMTUwMS5kdHMKKysrIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hjYWxpYnVyMTUwMS5kdHMKQEAgLTUzMSw3ICs1MzEsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpAQCAtNTQyLDcgKzU0Miw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8NDIgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUyMDAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hwZWRpdGU1MjAwLmR0cwppbmRleCBjNDFhODBjLi44ZmQ3YjcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUyMDAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy94cGVkaXRlNTIwMC5kdHMKQEAgLTMzMyw3ICszMzMsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQljdXJyZW50LXNwZWVkID0gPDExNTIwMD47CkBAIC0zNDQsNyArMzQ0LDcgQEAKIAkJc2VyaWFsMTogc2VyaWFsQDQ2MDAgewogCQkJY2VsbC1pbmRleCA9IDwxPjsKIAkJCWRldmljZV90eXBlID0gInNlcmlhbCI7Ci0JCQljb21wYXRpYmxlID0gIm5zMTY1NTAiOworCQkJY29tcGF0aWJsZSA9ICJmc2wsbnMxNjU1MCIsICJuczE2NTUwIjsKIAkJCXJlZyA9IDwweDQ2MDAgMHgxMDA+OwogCQkJY2xvY2stZnJlcXVlbmN5ID0gPDA+OwogCQkJY3VycmVudC1zcGVlZCA9IDwxMTUyMDA+OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hwZWRpdGU1MjAwX3htb24uZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hwZWRpdGU1MjAwX3htb24uZHRzCmluZGV4IGMwZWZjYmIuLjBiYWE4MjggMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9ib290L2R0cy94cGVkaXRlNTIwMF94bW9uLmR0cworKysgYi9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUyMDBfeG1vbi5kdHMKQEAgLTMzNyw3ICszMzcsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQljdXJyZW50LXNwZWVkID0gPDk2MDA+OwpAQCAtMzQ4LDcgKzM0OCw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWN1cnJlbnQtc3BlZWQgPSA8OTYwMD47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUzMDEuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hwZWRpdGU1MzAxLmR0cwppbmRleCBkYjdmYWY1Li41M2MxYzZhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUzMDEuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy94cGVkaXRlNTMwMS5kdHMKQEAgLTQ0MSw3ICs0NDEsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpAQCAtNDUyLDcgKzQ1Miw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8NDIgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUzMzAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hwZWRpdGU1MzMwLmR0cwppbmRleCBjMzY0Y2E2Li4yMTUyMjU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUzMzAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy94cGVkaXRlNTMzMC5kdHMKQEAgLTQ3Nyw3ICs0NzcsNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpAQCAtNDg4LDcgKzQ4OCw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8NDIgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUzNzAuZHRzIGIvYXJjaC9wb3dlcnBjL2Jvb3QvZHRzL3hwZWRpdGU1MzcwLmR0cwppbmRleCA3YThhNGFmLi4xMWRiZGExIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC9kdHMveHBlZGl0ZTUzNzAuZHRzCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L2R0cy94cGVkaXRlNTM3MC5kdHMKQEAgLTQzOSw3ICs0MzksNyBAQAogCQlzZXJpYWwwOiBzZXJpYWxANDUwMCB7CiAJCQljZWxsLWluZGV4ID0gPDA+OwogCQkJZGV2aWNlX3R5cGUgPSAic2VyaWFsIjsKLQkJCWNvbXBhdGlibGUgPSAibnMxNjU1MCI7CisJCQljb21wYXRpYmxlID0gImZzbCxuczE2NTUwIiwgIm5zMTY1NTAiOwogCQkJcmVnID0gPDB4NDUwMCAweDEwMD47CiAJCQljbG9jay1mcmVxdWVuY3kgPSA8MD47CiAJCQlpbnRlcnJ1cHRzID0gPDQyIDI+OwpAQCAtNDUwLDcgKzQ1MCw3IEBACiAJCXNlcmlhbDE6IHNlcmlhbEA0NjAwIHsKIAkJCWNlbGwtaW5kZXggPSA8MT47CiAJCQlkZXZpY2VfdHlwZSA9ICJzZXJpYWwiOwotCQkJY29tcGF0aWJsZSA9ICJuczE2NTUwIjsKKwkJCWNvbXBhdGlibGUgPSAiZnNsLG5zMTY1NTAiLCAibnMxNjU1MCI7CiAJCQlyZWcgPSA8MHg0NjAwIDB4MTAwPjsKIAkJCWNsb2NrLWZyZXF1ZW5jeSA9IDwwPjsKIAkJCWludGVycnVwdHMgPSA8NDIgMj47CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC90cmVlYm9vdC1jdXJyaXR1Y2suYyBiL2FyY2gvcG93ZXJwYy9ib290L3RyZWVib290LWN1cnJpdHVjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWFlNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvYm9vdC90cmVlYm9vdC1jdXJyaXR1Y2suYwpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDExIFRvbnkgQnJlZWRzIElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIEJhc2VkIG9uIGVhcmxpZXIgY29kZToKKyAqICAgQ29weXJpZ2h0IChDKSBQYXVsIE1hY2tlcnJhcyAxOTk3LgorICoKKyAqICAgTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqICAgQ29weXJpZ2h0IDIwMDItMjAwNSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqCisgKiAgIEV1Z2VuZSBTdXJvdmVnaW4gPGV1Z2VuZS5zdXJvdmVnaW5AenVsdHlzLmNvbT4gb3IgPGVic0BlYnNob21lLm5ldD4KKyAqICAgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IFp1bHR5cyBUZWNobm9sb2dpZXMKKyAqCisgKiAgICBDb3B5cmlnaHQgMjAwNyBEYXZpZCBHaWJzb24sIElCTSBDb3Jwb3JhdGlvbi4KKyAqICAgIENvcHlyaWdodCAyMDEwIEJlbi4gSGVycmVuc2NobWlkdCwgSUJNIENvcnBvcmF0aW9uLgorICogICAgQ29weXJpZ2h0IMKpIDIwMTEgRGF2aWQgS2xlaWthbXAgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgInR5cGVzLmgiCisjaW5jbHVkZSAiZWxmLmgiCisjaW5jbHVkZSAic3RyaW5nLmgiCisjaW5jbHVkZSAic3RkaW8uaCIKKyNpbmNsdWRlICJwYWdlLmgiCisjaW5jbHVkZSAib3BzLmgiCisjaW5jbHVkZSAicmVnLmgiCisjaW5jbHVkZSAiaW8uaCIKKyNpbmNsdWRlICJkY3IuaCIKKyNpbmNsdWRlICI0eHguaCIKKyNpbmNsdWRlICI0NHguaCIKKyNpbmNsdWRlICJsaWJmZHQuaCIKKworQlNTX1NUQUNLKDQwOTYpOworCisjZGVmaW5lIE1BWF9SQU5LUwkweDQKKyNkZWZpbmUgRERSM19NUjBDRgkweDgwMDEwMDExVQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGlibV9jdXJyaXR1Y2tfbWVtc2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgaWJtX2N1cnJpdHVja19kZXRlY3RfbWVtc2l6ZSh2b2lkKQoreworCXUzMiByZWc7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbWVtc2l6ZSA9IDA7CisKKwlmb3IoaSA9IDA7IGkgPCBNQVhfUkFOS1M7IGkrKyl7CisJCXJlZyA9IG1mZGNyeChERFIzX01SMENGICsgaSk7CisKKwkJaWYgKCEocmVnICYgMSkpCisJCQljb250aW51ZTsKKworCQlyZWcgJj0gMHgwMDAwZjAwMDsKKwkJcmVnID4+PSAxMjsKKwkJbWVtc2l6ZSArPSAoMHg4MDAwMDBVTEwgPDwgcmVnKTsKKwl9CisKKwlyZXR1cm4gbWVtc2l6ZTsKK30KKworc3RhdGljIHZvaWQgaWJtX2N1cnJpdHVja19maXh1cHModm9pZCkKK3sKKwl2b2lkICpkZXZwID0gZmluZGRldmljZSgiLyIpOworCXUzMiBkbWFfcmFuZ2VzWzddOworCisJZHRfZml4dXBfbWVtb3J5KDB4MFVMTCwgIGlibV9jdXJyaXR1Y2tfbWVtc2l6ZSk7CisKKwl3aGlsZSAoKGRldnAgPSBmaW5kX25vZGVfYnlfZGV2dHlwZShkZXZwLCAicGNpIikpKSB7CisJCWlmIChnZXRwcm9wKGRldnAsICJkbWEtcmFuZ2VzIiwgZG1hX3Jhbmdlcywgc2l6ZW9mKGRtYV9yYW5nZXMpKSA8IDApIHsKKwkJCXByaW50ZigiJXM6IEZhaWxlZCB0byBnZXQgZG1hLXJhbmdlc1xyXG4iLCBfX2Z1bmNfXyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRtYV9yYW5nZXNbNV0gPSBpYm1fY3Vycml0dWNrX21lbXNpemUgPj4gMzI7CisJCWRtYV9yYW5nZXNbNl0gPSBpYm1fY3Vycml0dWNrX21lbXNpemUgJiAweGZmZmZmZmZmVUw7CisKKwkJc2V0cHJvcChkZXZwLCAiZG1hLXJhbmdlcyIsIGRtYV9yYW5nZXMsIHNpemVvZihkbWFfcmFuZ2VzKSk7CisJfQorfQorCisjZGVmaW5lIFNQUk5fUElSCTB4MTFFCS8qIFByb2Nlc3NvciBJbmRlbnRpZmljYXRpb24gUmVnaXN0ZXIgKi8KK3ZvaWQgcGxhdGZvcm1faW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX29mX3JhbSwgYXZhaWxfcmFtOworCXUzMiBwaXJfcmVnOworCWludCBub2RlLCBzaXplOworCWNvbnN0IHUzMiAqdGltZWJhc2U7CisKKwlpYm1fY3Vycml0dWNrX21lbXNpemUgPSBpYm1fY3Vycml0dWNrX2RldGVjdF9tZW1zaXplKCk7CisJaWYgKGlibV9jdXJyaXR1Y2tfbWVtc2l6ZSA+PiAzMikKKwkJZW5kX29mX3JhbSA9IH4wVUw7CisJZWxzZQorCQllbmRfb2ZfcmFtID0gaWJtX2N1cnJpdHVja19tZW1zaXplOworCWF2YWlsX3JhbSA9IGVuZF9vZl9yYW0gLSAodW5zaWduZWQgbG9uZylfZW5kOworCisJc2ltcGxlX2FsbG9jX2luaXQoX2VuZCwgYXZhaWxfcmFtLCAxMjgsIDY0KTsKKwlwbGF0Zm9ybV9vcHMuZml4dXBzID0gaWJtX2N1cnJpdHVja19maXh1cHM7CisJcGxhdGZvcm1fb3BzLmV4aXQgPSBpYm00NHhfZGJjcl9yZXNldDsKKwlwaXJfcmVnID0gbWZzcHIoU1BSTl9QSVIpOworCisJLyogTWFrZSBzdXJlIEZEVCBibG9iIGlzIHNhbmUgKi8KKwlpZiAoZmR0X2NoZWNrX2hlYWRlcihfZHRiX3N0YXJ0KSAhPSAwKQorCQlmYXRhbCgiSW52YWxpZCBkZXZpY2UgdHJlZSBibG9iXG4iKTsKKworCW5vZGUgPSBmZHRfbm9kZV9vZmZzZXRfYnlfcHJvcF92YWx1ZShfZHRiX3N0YXJ0LCAtMSwgImRldmljZV90eXBlIiwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNwdSIsIHNpemVvZigiY3B1IikpOworCWlmICghbm9kZSkKKwkJZmF0YWwoIkNhbm5vdCBmaW5kIGNwdSBub2RlXG4iKTsKKwl0aW1lYmFzZSA9IGZkdF9nZXRwcm9wKF9kdGJfc3RhcnQsIG5vZGUsICJ0aW1lYmFzZS1mcmVxdWVuY3kiLCAmc2l6ZSk7CisJaWYgKHRpbWViYXNlICYmIChzaXplID09IDQpKQorCQl0aW1lYmFzZV9wZXJpb2RfbnMgPSAxMDAwMDAwMDAwIC8gKnRpbWViYXNlOworCisJZmR0X3NldF9ib290X2NwdWlkX3BoeXMoX2R0Yl9zdGFydCwgcGlyX3JlZyk7CisJZmR0X2luaXQoX2R0Yl9zdGFydCk7CisKKwlzZXJpYWxfY29uc29sZV9pbml0KCk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyIGIvYXJjaC9wb3dlcnBjL2Jvb3Qvd3JhcHBlcgppbmRleCBjNzQ1MzFhLi5mMDkwZTZkIDEwMDc1NQotLS0gYS9hcmNoL3Bvd2VycGMvYm9vdC93cmFwcGVyCisrKyBiL2FyY2gvcG93ZXJwYy9ib290L3dyYXBwZXIKQEAgLTE2Myw3ICsxNjMsNyBAQAogICAgIGxpbmtfYWRkcmVzcz0nMHg1MDAwMDAnCiAgICAgcGllPQogICAgIDs7Ci1taWJvb3R8dWJvb3QpCittaWJvb3R8dWJvb3QqKQogICAgICMgbWlib290IGFuZCBVLWJvb3Qgd2FudCBqdXN0IHRoZSBiYXJlIGJpdHMsIG5vdCBhbiBFTEYgYmluYXJ5CiAgICAgZXh0PWJpbgogICAgIG9iamZsYWdzPSItTyBiaW5hcnkiCkBAIC0yNDQsNiArMjQ0LDkgQEAKICAgICBsaW5rX2FkZHJlc3M9JzB4NjAwMDAwJwogICAgIHBsYXRmb3Jtbz0iJG9iamVjdC8kcGxhdGZvcm0taGVhZC5vICRvYmplY3QvJHBsYXRmb3JtLm8iCiAgICAgOzsKK3RyZWVib290LWN1cnJpdHVjaykKKyAgICBsaW5rX2FkZHJlc3M9JzB4MTAwMDAwMCcKKyAgICA7OwogdHJlZWJvb3QtaXNzNHh4LW1waWMpCiAgICAgcGxhdGZvcm1vPSIkb2JqZWN0L3RyZWVib290LWlzczR4eC5vIgogICAgIDs7CkBAIC0yNTcsNiArMjYwLDggQEAKIGlmIFsgLXogIiRjYWNoZWl0IiAtbyAhIC1mICIkdm16JGd6aXAiIC1vICIkdm16JGd6aXAiIC1vdCAiJGtlcm5lbCIgXTsgdGhlbgogICAgICR7Q1JPU1N9b2JqY29weSAkb2JqZmxhZ3MgIiRrZXJuZWwiICIkdm16LiQkIgogCisgICAgc3RyaXBfc2l6ZT0kKHN0YXQgLWMgJXMgJHZtei4kJCkKKwogICAgIGlmIFsgLW4gIiRnemlwIiBdOyB0aGVuCiAgICAgICAgIGd6aXAgLW4gLWYgLTkgIiR2bXouJCQiCiAgICAgZmkKQEAgLTI2Niw2ICsyNzEsMjQgQEAKICAgICBlbHNlCiAJdm16PSIkdm16LiQkIgogICAgIGZpCitlbHNlCisgICAgIyBDYWxjdWxhdGUgdGhlIHZtbGludXguc3RyaXAgc2l6ZQorICAgICR7Q1JPU1N9b2JqY29weSAkb2JqZmxhZ3MgIiRrZXJuZWwiICIkdm16LiQkIgorICAgIHN0cmlwX3NpemU9JChzdGF0IC1jICVzICR2bXouJCQpCisgICAgcm0gLWYgJHZtei4kJAorZmkKKworIyBSb3VuZCB0aGUgc2l6ZSB0byBuZXh0IGhpZ2hlciBNQiBsaW1pdAorcm91bmRfc2l6ZT0kKCgoc3RyaXBfc2l6ZSArIDB4ZmZmZmYpICYgMHhmZmYwMDAwMCkpCisKK3JvdW5kX3NpemU9MHgkKHByaW50ZiAiJXgiICRyb3VuZF9zaXplKQorbGlua19hZGRyPSQocHJpbnRmICIlZCIgJGxpbmtfYWRkcmVzcykKKworaWYgWyAkbGlua19hZGRyIC1sdCAkc3RyaXBfc2l6ZSBdOyB0aGVuCisgICAgZWNobyAiSU5GTzogVW5jb21wcmVzc2VkIGtlcm5lbCAoc2l6ZSAweCQocHJpbnRmICIleFxuIiAkc3RyaXBfc2l6ZSkpIiBcCisJCSJvdmVybGFwcyB0aGUgYWRkcmVzcyBvZiB0aGUgd3JhcHBlcigkbGlua19hZGRyZXNzKSIKKyAgICBlY2hvICJJTkZPOiBGaXhpbmcgdGhlIGxpbmtfYWRkcmVzcyBvZiB3cmFwcGVyIHRvICgkcm91bmRfc2l6ZSkiCisgICAgbGlua19hZGRyZXNzPSRyb3VuZF9zaXplCiBmaQogCiB2bXo9IiR2bXokZ3ppcCIKQEAgLTI5MSw2ICszMTQsMjYgQEAKICAgICBmaQogICAgIGV4aXQgMAogICAgIDs7Cit1Ym9vdC1vYnM2MDApCisgICAgcm0gLWYgIiRvZmlsZSIKKyAgICAjIG9iczYwMCB3YW50cyBhIG11bHRpIGltYWdlIHdpdGggYW4gaW5pdHJkLCBzbyB3ZSBuZWVkIHRvIHB1dCBhIGZha2UKKyAgICAjIG9uZSBpbiBldmVuIHdoZW4gYnVpbGRpbmcgYSAibm9ybWFsIiBpbWFnZS4KKyAgICBpZiBbIC1uICIkaW5pdHJkIiBdOyB0aGVuCisJcmVhbF9yZD0iJGluaXRyZCIKKyAgICBlbHNlCisJcmVhbF9yZD1gbWt0ZW1wYAorCWVjaG8gIlwwIiA+PiIkcmVhbF9yZCIKKyAgICBmaQorICAgICR7TUtJTUFHRX0gLUEgcHBjIC1PIGxpbnV4IC1UIG11bHRpIC1DIGd6aXAgLWEgJG1lbWJhc2UgLWUgJG1lbWJhc2UgXAorCSR1Ym9vdF92ZXJzaW9uIC1kICIkdm16IjoiJHJlYWxfcmQiOiIkZHRiIiAiJG9maWxlIgorICAgIGlmIFsgLXogIiRpbml0cmQiIF07IHRoZW4KKwlybSAtZiAiJHJlYWxfcmQiCisgICAgZmkKKyAgICBpZiBbIC16ICIkY2FjaGVpdCIgXTsgdGhlbgorCXJtIC1mICIkdm16IgorICAgIGZpCisgICAgZXhpdCAwCisgICAgOzsKIGVzYWMKIAogYWRkc2VjKCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDB4L2tsb25kaWtlX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9rbG9uZGlrZV9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBkMjI4ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9rbG9uZGlrZV9kZWZjb25maWcKQEAgLTAsMCArMSw1NSBAQAorQ09ORklHXzQweD15CitDT05GSUdfRVhQRVJJTUVOVEFMPXkKK0NPTkZJR19TWVNWSVBDPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRD15CitDT05GSUdfU1lTRlNfREVQUkVDQVRFRF9WMj15CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMPXkKK0NPTkZJR19FTUJFRERFRD15CitDT05GSUdfU0xBQj15CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19XQUxOVVQgaXMgbm90IHNldAorQ09ORklHX0FQTTgwMThYPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19NQVRIX0VNVUxBVElPTj15CisjIENPTkZJR19NSUdSQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU1VTUEVORCBpcyBub3Qgc2V0CitDT05GSUdfVUVWRU5UX0hFTFBFUl9QQVRIPSIvc2Jpbi9ob3RwbHVnIgorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzUwMDAKK0NPTkZJR19TQ1NJPXkKK0NPTkZJR19CTEtfREVWX1NEPXkKK0NPTkZJR19DSFJfREVWX1NHPXkKK0NPTkZJR19TQ1NJX1NBU19BVFRSUz15CisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklYOThfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZLTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CisjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19JT01NVV9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQyX0ZTPXkKK0NPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CitDT05GSUdfRVhUNF9GUz15CitDT05GSUdfTVNET1NfRlM9eQorQ09ORklHX1ZGQVRfRlM9eQorQ09ORklHX1BST0NfS0NPUkU9eQorQ09ORklHX1RNUEZTPXkKK0NPTkZJR19DUkFNRlM9eQorQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQorQ09ORklHX05MU19BU0NJST15CitDT05GSUdfTkxTX0lTTzg4NTlfMT15CitDT05GSUdfTkxTX1VURjg9eQorQ09ORklHX0FWRVJBR0U9eQorQ09ORklHX01BR0lDX1NZU1JRPXkKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKKyMgQ09ORklHX0ZUUkFDRSBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvb2JzNjAwX2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQweC9vYnM2MDBfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYzExMGQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80MHgvb2JzNjAwX2RlZmNvbmZpZwpAQCAtMCwwICsxLDgzIEBACitDT05GSUdfNDB4PXkKK0NPTkZJR19FWFBFUklNRU5UQUw9eQorQ09ORklHX1NZU1ZJUEM9eQorQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xNAorQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKK0NPTkZJR19FWFBFUlQ9eQorQ09ORklHX0tBTExTWU1TX0FMTD15CitDT05GSUdfTU9EVUxFUz15CitDT05GSUdfTU9EVUxFX1VOTE9BRD15CisjIENPTkZJR19CTEtfREVWX0JTRyBpcyBub3Qgc2V0CisjIENPTkZJR19XQUxOVVQgaXMgbm90IHNldAorQ09ORklHX09CUzYwMD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfTUFUSF9FTVVMQVRJT049eQorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19DT05ORUNUT1I9eQorQ09ORklHX01URD15CitDT05GSUdfTVREX0NNRExJTkVfUEFSVFM9eQorQ09ORklHX01URF9PRl9QQVJUUz15CitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CitDT05GSUdfTVREX0NGST15CitDT05GSUdfTVREX0pFREVDUFJPQkU9eQorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfUEhZU01BUF9PRj15CitDT05GSUdfTVREX05BTkQ9eQorQ09ORklHX01URF9OQU5EX05ERkM9eQorQ09ORklHX1BST0NfREVWSUNFVFJFRT15CitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9MzUwMDAKK0NPTkZJR19ORVRERVZJQ0VTPXkKK0NPTkZJR19JQk1fRU1BQz15CitDT05GSUdfSUJNX0VNQUNfUlhCPTI1NgorQ09ORklHX0lCTV9FTUFDX1RYQj0yNTYKKyMgQ09ORklHX0lOUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFUklPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZUIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MD15CitDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CitDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQorQ09ORklHX1NFUklBTF84MjUwX1NIQVJFX0lSUT15CitDT05GSUdfU0VSSUFMX09GX1BMQVRGT1JNPXkKKyMgQ09ORklHX0hXX1JBTkRPTSBpcyBub3Qgc2V0CitDT05GSUdfSTJDPXkKK0NPTkZJR19JMkNfQ0hBUkRFVj15CitDT05GSUdfSTJDX0lCTV9JSUM9eQorQ09ORklHX1NFTlNPUlNfTE03NT15CitDT05GSUdfVEhFUk1BTD15CisjIENPTkZJR19VU0JfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfRFJWX0RTMTMwNz15CitDT05GSUdfRVhUMl9GUz15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX0NSQU1GUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX1JPT1RfTkZTPXkKK0NPTkZJR19NQUdJQ19TWVNSUT15CitDT05GSUdfREVCVUdfRlM9eQorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19DUllQVE89eQorQ09ORklHX0NSWVBUT19DQkM9eQorQ09ORklHX0NSWVBUT19FQ0I9eQorQ09ORklHX0NSWVBUT19QQ0JDPXkKK0NPTkZJR19DUllQVE9fTUQ1PXkKK0NPTkZJR19DUllQVE9fREVTPXkKKyMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9jdXJyaXR1Y2tfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2N1cnJpdHVja19kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE5MjMyMgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9jdXJyaXR1Y2tfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTEwIEBACitDT05GSUdfNDR4PXkKK0NPTkZJR19TTVA9eQorQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19TUEFSU0VfSVJRPXkKK0NPTkZJR19MT0dfQlVGX1NISUZUPTE0CitDT05GSUdfRVhQRVJUPXkKK0NPTkZJR19LQUxMU1lNU19BTEw9eQorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfT1BST0ZJTEU9eQorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9VTkxPQUQ9eQorIyBDT05GSUdfQkxLX0RFVl9CU0cgaXMgbm90IHNldAorQ09ORklHX1BQQ180N3g9eQorIyBDT05GSUdfRUJPTlkgaXMgbm90IHNldAorQ09ORklHX0NVUlJJVFVDSz15CitDT05GSUdfSElHSE1FTT15CitDT05GSUdfSFpfMTAwPXkKK0NPTkZJR19NQVRIX0VNVUxBVElPTj15CitDT05GSUdfSVJRX0FMTF9DUFVTPXkKK0NPTkZJR19DTURMSU5FX0JPT0w9eQorQ09ORklHX0NNRExJTkU9IiIKKyMgQ09ORklHX1NVU1BFTkQgaXMgbm90IHNldAorQ09ORklHX05FVD15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19JTkVUPXkKK0NPTkZJR19JUF9QTlA9eQorQ09ORklHX0lQX1BOUF9ESENQPXkKK0NPTkZJR19JUF9QTlBfQk9PVFA9eQorIyBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVUX1hGUk1fTU9ERV9CRUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVRfTFJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVjYgaXMgbm90IHNldAorQ09ORklHX1VFVkVOVF9IRUxQRVJfUEFUSD0iL3NiaW4vaG90cGx1ZyIKK0NPTkZJR19ERVZUTVBGUz15CitDT05GSUdfREVWVE1QRlNfTU9VTlQ9eQorQ09ORklHX0NPTk5FQ1RPUj15CitDT05GSUdfTVREPXkKK0NPTkZJR19NVERfQ0hBUj15CitDT05GSUdfTVREX0JMT0NLPXkKK0NPTkZJR19NVERfSkVERUNQUk9CRT15CitDT05GSUdfTVREX0NGSV9BTURTVEQ9eQorQ09ORklHX01URF9QSFlTTUFQX09GPXkKK0NPTkZJR19QUk9DX0RFVklDRVRSRUU9eQorQ09ORklHX0JMS19ERVZfUkFNPXkKK0NPTkZJR19CTEtfREVWX1JBTV9TSVpFPTM1MDAwCisjIENPTkZJR19TQ1NJX1BST0NfRlMgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfU0Q9eQorIyBDT05GSUdfU0NTSV9MT1dMRVZFTCBpcyBub3Qgc2V0CitDT05GSUdfQVRBPXkKKyMgQ09ORklHX1NBVEFfUE1QIGlzIG5vdCBzZXQKK0NPTkZJR19TQVRBX1NJTDI0PXkKKyMgQ09ORklHX0FUQV9TRkYgaXMgbm90IHNldAorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0UxMDAwRT15CisjIENPTkZJR19ORVRERVZfMTAwMDAgaXMgbm90IHNldAorIyBDT05GSUdfSU5QVVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VSSU8gaXMgbm90IHNldAorIyBDT05GSUdfVlQgaXMgbm90IHNldAorQ09ORklHX1NFUklBTF84MjUwPXkKK0NPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFPXkKK0NPTkZJR19TRVJJQUxfODI1MF9FWFRFTkRFRD15CitDT05GSUdfU0VSSUFMXzgyNTBfU0hBUkVfSVJRPXkKK0NPTkZJR19TRVJJQUxfT0ZfUExBVEZPUk09eQorIyBDT05GSUdfSFdfUkFORE9NIGlzIG5vdCBzZXQKK0NPTkZJR19JMkM9eQorQ09ORklHX0kyQ19JQk1fSUlDPXkKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKK0NPTkZJR19USEVSTUFMPXkKK0NPTkZJR19VU0I9eQorQ09ORklHX1VTQl9ERUJVRz15CitDT05GSUdfVVNCX0VIQ0lfSENEPXkKK0NPTkZJR19VU0JfT0hDSV9IQ0Q9eQorQ09ORklHX1JUQ19DTEFTUz15CitDT05GSUdfUlRDX0RSVl9NNDFUODA9eQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKK0NPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CitDT05GSUdfRVhUM19GU19TRUNVUklUWT15CitDT05GSUdfUFJPQ19LQ09SRT15CitDT05GSUdfVE1QRlM9eQorQ09ORklHX0NSQU1GUz15CitDT05GSUdfTkZTX0ZTPXkKK0NPTkZJR19ORlNfVjM9eQorQ09ORklHX05GU19WM19BQ0w9eQorQ09ORklHX05GU19WND15CitDT05GSUdfTkxTX0RFRkFVTFQ9Im4iCitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX0RFQlVHX0ZTPXkKK0NPTkZJR19ERUJVR19LRVJORUw9eQorQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQorQ09ORklHX0RFQlVHX0lORk89eQorQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKK0NPTkZJR19YTU9OPXkKK0NPTkZJR19YTU9OX0RFRkFVTFQ9eQorQ09ORklHX1BQQ19FQVJMWV9ERUJVRz15CitDT05GSUdfUFBDX0VBUkxZX0RFQlVHXzQ0eF9QSFlTTE9XPTB4MTAwMDAwMDAKK0NPTkZJR19QUENfRUFSTFlfREVCVUdfNDR4X1BIWVNISUdIPTB4MjAwCitDT05GSUdfQ1JZUFRPPXkKK0NPTkZJR19DUllQVE9fQ0JDPXkKK0NPTkZJR19DUllQVE9fRUNCPXkKK0NPTkZJR19DUllQVE9fUENCQz15CitDT05GSUdfQ1JZUFRPX01ENT15CitDT05GSUdfQ1JZUFRPX0RFUz15CisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVE9fSFcgaXMgbm90IHNldApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2lzczQ3Ni1zbXBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvNDR4L2lzczQ3Ni1zbXBfZGVmY29uZmlnCmluZGV4IGE2ZWI2YWQuLmNhMDBjZjcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzLzQ0eC9pc3M0NzYtc21wX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy80NHgvaXNzNDc2LXNtcF9kZWZjb25maWcKQEAgLTI1LDcgKzI1LDggQEAKIENPTkZJR19DTURMSU5FPSJyb290PS9kZXYvaXNzYmxrMCIKICMgQ09ORklHX1BDSSBpcyBub3Qgc2V0CiBDT05GSUdfQURWQU5DRURfT1BUSU9OUz15Ci1DT05GSUdfUkVMT0NBVEFCTEU9eQorQ09ORklHX05PTlNUQVRJQ19LRVJORUw9eQorQ09ORklHX0RZTkFNSUNfTUVNU1RBUlQ9eQogQ09ORklHX05FVD15CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19VTklYPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2Nocm9tYV9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jaHJvbWFfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZjdmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jaHJvbWFfZGVmY29uZmlnCkBAIC0wLDAgKzEsMzA3IEBACitDT05GSUdfUFBDNjQ9eQorQ09ORklHX1BQQ19CT09LM0VfNjQ9eQorIyBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORyBpcyBub3Qgc2V0CitDT05GSUdfU01QPXkKK0NPTkZJR19OUl9DUFVTPTI1NgorQ09ORklHX0VYUEVSSU1FTlRBTD15CitDT05GSUdfU1lTVklQQz15CitDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKK0NPTkZJR19UQVNLU1RBVFM9eQorQ09ORklHX1RBU0tfREVMQVlfQUNDVD15CitDT05GSUdfVEFTS19YQUNDVD15CitDT05GSUdfVEFTS19JT19BQ0NPVU5USU5HPXkKK0NPTkZJR19BVURJVD15CitDT05GSUdfQVVESVRTWVNDQUxMPXkKK0NPTkZJR19JS0NPTkZJRz15CitDT05GSUdfSUtDT05GSUdfUFJPQz15CitDT05GSUdfTE9HX0JVRl9TSElGVD0xOQorQ09ORklHX0NHUk9VUFM9eQorQ09ORklHX0NHUk9VUF9ERVZJQ0U9eQorQ09ORklHX0NQVVNFVFM9eQorQ09ORklHX0NHUk9VUF9DUFVBQ0NUPXkKK0NPTkZJR19SRVNPVVJDRV9DT1VOVEVSUz15CitDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUj15CitDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQPXkKK0NPTkZJR19OQU1FU1BBQ0VTPXkKK0NPTkZJR19SRUxBWT15CitDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQorQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19SRF9CWklQMj15CitDT05GSUdfUkRfTFpNQT15CitDT05GSUdfSU5JVFJBTUZTX0NPTVBSRVNTSU9OX0daSVA9eQorQ09ORklHX0tBTExTWU1TX0FMTD15CitDT05GSUdfRU1CRURERUQ9eQorQ09ORklHX1BFUkZfQ09VTlRFUlM9eQorQ09ORklHX1BST0ZJTElORz15CitDT05GSUdfT1BST0ZJTEU9eQorQ09ORklHX0tQUk9CRVM9eQorQ09ORklHX01PRFVMRVM9eQorQ09ORklHX01PRFVMRV9GT1JDRV9MT0FEPXkKK0NPTkZJR19NT0RVTEVfVU5MT0FEPXkKK0NPTkZJR19NT0RVTEVfRk9SQ0VfVU5MT0FEPXkKK0NPTkZJR19NT0RWRVJTSU9OUz15CitDT05GSUdfTU9EVUxFX1NSQ1ZFUlNJT05fQUxMPXkKK0NPTkZJR19TQ09NX0RFQlVHRlM9eQorQ09ORklHX1BQQ19BMl9ERDI9eQorQ09ORklHX0tWTV9HVUVTVD15CitDT05GSUdfTk9fSFo9eQorQ09ORklHX0hJR0hfUkVTX1RJTUVSUz15CitDT05GSUdfSFpfMTAwPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5GTVRfTUlTQz15CitDT05GSUdfTlVNQT15CisjIENPTkZJR19NSUdSQVRJT04gaXMgbm90IHNldAorQ09ORklHX1BQQ182NEtfUEFHRVM9eQorQ09ORklHX1NDSEVEX1NNVD15CitDT05GSUdfQ01ETElORV9CT09MPXkKK0NPTkZJR19DTURMSU5FPSIiCisjIENPTkZJR19TRUNDT01QIGlzIG5vdCBzZXQKK0NPTkZJR19QQ0lFUE9SVEJVUz15CisjIENPTkZJR19QQ0lFQVNQTSBpcyBub3Qgc2V0CitDT05GSUdfUENJX01TST15CitDT05GSUdfUEFDS0VUPXkKK0NPTkZJR19VTklYPXkKK0NPTkZJR19YRlJNX1VTRVI9bQorQ09ORklHX1hGUk1fU1VCX1BPTElDWT15CitDT05GSUdfWEZSTV9TVEFUSVNUSUNTPXkKK0NPTkZJR19ORVRfS0VZPW0KK0NPTkZJR19ORVRfS0VZX01JR1JBVEU9eQorQ09ORklHX0lORVQ9eQorQ09ORklHX0lQX01VTFRJQ0FTVD15CitDT05GSUdfSVBfQURWQU5DRURfUk9VVEVSPXkKK0NPTkZJR19JUF9ST1VURV9NVUxUSVBBVEg9eQorQ09ORklHX0lQX1JPVVRFX1ZFUkJPU0U9eQorQ09ORklHX0lQX1BOUD15CitDT05GSUdfSVBfUE5QX0RIQ1A9eQorQ09ORklHX0lQX1BOUF9CT09UUD15CitDT05GSUdfTkVUX0lQSVA9eQorQ09ORklHX0lQX01ST1VURT15CitDT05GSUdfSVBfUElNU01fVjE9eQorQ09ORklHX0lQX1BJTVNNX1YyPXkKK0NPTkZJR19TWU5fQ09PS0lFUz15CitDT05GSUdfSU5FVF9BSD1tCitDT05GSUdfSU5FVF9FU1A9bQorQ09ORklHX0lORVRfSVBDT01QPW0KK0NPTkZJR19JUFY2PXkKK0NPTkZJR19JUFY2X1BSSVZBQ1k9eQorQ09ORklHX0lQVjZfUk9VVEVSX1BSRUY9eQorQ09ORklHX0lQVjZfUk9VVEVfSU5GTz15CitDT05GSUdfSVBWNl9PUFRJTUlTVElDX0RBRD15CitDT05GSUdfSU5FVDZfQUg9eQorQ09ORklHX0lORVQ2X0VTUD15CitDT05GSUdfSU5FVDZfSVBDT01QPXkKK0NPTkZJR19JUFY2X01JUDY9eQorQ09ORklHX0lORVQ2X1hGUk1fTU9ERV9ST1VURU9QVElNSVpBVElPTj15CitDT05GSUdfSVBWNl9UVU5ORUw9eQorQ09ORklHX0lQVjZfTVVMVElQTEVfVEFCTEVTPXkKK0NPTkZJR19JUFY2X1NVQlRSRUVTPXkKK0NPTkZJR19JUFY2X01ST1VURT15CitDT05GSUdfSVBWNl9QSU1TTV9WMj15CitDT05GSUdfTkVURklMVEVSPXkKK0NPTkZJR19ORl9DT05OVFJBQ0s9bQorQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFM9eQorQ09ORklHX05GX0NUX1BST1RPX1VEUExJVEU9bQorQ09ORklHX05GX0NPTk5UUkFDS19GVFA9bQorQ09ORklHX05GX0NPTk5UUkFDS19JUkM9bQorQ09ORklHX05GX0NPTk5UUkFDS19URlRQPW0KK0NPTkZJR19ORl9DVF9ORVRMSU5LPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NMQVNTSUZZPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX0NPTk5NQVJLPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfVEFSR0VUX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZMT0c9bQorQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfTkZRVUVVRT1tCitDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UQ1BNU1M9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT01NRU5UPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkJZVEVTPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTkxJTUlUPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfQ09OTk1BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9DT05OVFJBQ0s9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EQ0NQPW0KK0NPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRFNDUD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VTUD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hFTFBFUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0lQUkFOR0U9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MRU5HVEg9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BQz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01BUks9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NVUxUSVBPUlQ9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PV05FUj1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BPTElDWT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BLVFRZUEU9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9RVU9UQT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JBVEVFU1Q9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9SRUFMTT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1JFQ0VOVD1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NDVFA9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9TVEFURT1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUQVRJU1RJQz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1NUUklORz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RDUE1TUz1tCitDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1RJTUU9bQorQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9VMzI9bQorQ09ORklHX05GX0NPTk5UUkFDS19JUFY0PW0KK0NPTkZJR19JUF9ORl9RVUVVRT1tCitDT05GSUdfSVBfTkZfSVBUQUJMRVM9bQorQ09ORklHX0lQX05GX01BVENIX0FIPW0KK0NPTkZJR19JUF9ORl9NQVRDSF9FQ049bQorQ09ORklHX0lQX05GX01BVENIX1RUTD1tCitDT05GSUdfSVBfTkZfRklMVEVSPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfUkVKRUNUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTE9HPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfVUxPRz1tCitDT05GSUdfTkZfTkFUPW0KK0NPTkZJR19JUF9ORl9UQVJHRVRfTUFTUVVFUkFERT1tCitDT05GSUdfSVBfTkZfVEFSR0VUX05FVE1BUD1tCitDT05GSUdfSVBfTkZfVEFSR0VUX1JFRElSRUNUPW0KK0NPTkZJR19ORVRfVENQUFJPQkU9eQorIyBDT05GSUdfV0lSRUxFU1MgaXMgbm90IHNldAorQ09ORklHX05FVF85UD15CitDT05GSUdfTkVUXzlQX0RFQlVHPXkKK0NPTkZJR19VRVZFTlRfSEVMUEVSX1BBVEg9Ii9zYmluL2hvdHBsdWciCitDT05GSUdfREVWVE1QRlM9eQorQ09ORklHX01URD15CitDT05GSUdfTVREX0NIQVI9eQorQ09ORklHX01URF9CTE9DSz15CitDT05GSUdfTVREX0NGST15CitDT05GSUdfTVREX0NGSV9BRFZfT1BUSU9OUz15CitDT05GSUdfTVREX0NGSV9MRV9CWVRFX1NXQVA9eQorQ09ORklHX01URF9DRklfSU5URUxFWFQ9eQorQ09ORklHX01URF9DRklfQU1EU1REPXkKK0NPTkZJR19NVERfQ0ZJX1NUQUE9eQorQ09ORklHX01URF9QSFlTTUFQX09GPXkKK0NPTkZJR19QUk9DX0RFVklDRVRSRUU9eQorQ09ORklHX0JMS19ERVZfTE9PUD15CitDT05GSUdfQkxLX0RFVl9DUllQVE9MT09QPXkKK0NPTkZJR19CTEtfREVWX05CRD1tCitDT05GSUdfQkxLX0RFVl9SQU09eQorQ09ORklHX0JMS19ERVZfUkFNX1NJWkU9NjU1MzYKK0NPTkZJR19DRFJPTV9QS1RDRFZEPXkKK0NPTkZJR19NSVNDX0RFVklDRVM9eQorQ09ORklHX0JMS19ERVZfU0Q9eQorQ09ORklHX0JMS19ERVZfU1I9eQorQ09ORklHX0JMS19ERVZfU1JfVkVORE9SPXkKK0NPTkZJR19DSFJfREVWX1NHPXkKK0NPTkZJR19TQ1NJX01VTFRJX0xVTj15CitDT05GSUdfU0NTSV9DT05TVEFOVFM9eQorQ09ORklHX1NDU0lfU1BJX0FUVFJTPXkKK0NPTkZJR19TQ1NJX0ZDX0FUVFJTPXkKK0NPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTPW0KK0NPTkZJR19TQ1NJX1NBU19BVFRSUz1tCitDT05GSUdfU0NTSV9TUlBfQVRUUlM9eQorQ09ORklHX0FUQT15CitDT05GSUdfU0FUQV9BSENJPXkKK0NPTkZJR19TQVRBX1NJTDI0PXkKK0NPTkZJR19TQVRBX01WPXkKK0NPTkZJR19TQVRBX1NJTD15CitDT05GSUdfUEFUQV9DTUQ2NFg9eQorQ09ORklHX1BBVEFfTUFSVkVMTD15CitDT05GSUdfUEFUQV9TSUw2ODA9eQorQ09ORklHX01EPXkKK0NPTkZJR19CTEtfREVWX01EPXkKK0NPTkZJR19NRF9MSU5FQVI9eQorQ09ORklHX0JMS19ERVZfRE09eQorQ09ORklHX0RNX0NSWVBUPXkKK0NPTkZJR19ETV9TTkFQU0hPVD15CitDT05GSUdfRE1fTUlSUk9SPXkKK0NPTkZJR19ETV9aRVJPPXkKK0NPTkZJR19ETV9VRVZFTlQ9eQorQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX1RVTj15CitDT05GSUdfRTEwMDBFPXkKK0NPTkZJR19USUdPTjM9eQorIyBDT05GSUdfV0xBTiBpcyBub3Qgc2V0CisjIENPTkZJR19JTlBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WVCBpcyBub3Qgc2V0CitDT05GSUdfREVWUFRTX01VTFRJUExFX0lOU1RBTkNFUz15CitDT05GSUdfU0VSSUFMXzgyNTA9eQorQ09ORklHX1NFUklBTF84MjUwX0NPTlNPTEU9eQorQ09ORklHX0hXX1JBTkRPTT15CitDT05GSUdfUkFXX0RSSVZFUj15CitDT05GSUdfTUFYX1JBV19ERVZTPTEwMjQKKyMgQ09ORklHX0hXTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZHQV9BUkIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX0VEQUM9eQorQ09ORklHX0VEQUNfTU1fRURBQz15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfRFJWX0RTMTUxMT15CitDT05GSUdfUlRDX0RSVl9EUzE1NTM9eQorQ09ORklHX0VYVDJfRlM9eQorQ09ORklHX0VYVDJfRlNfWEFUVFI9eQorQ09ORklHX0VYVDJfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQyX0ZTX1NFQ1VSSVRZPXkKK0NPTkZJR19FWFQyX0ZTX1hJUD15CitDT05GSUdfRVhUM19GUz15CisjIENPTkZJR19FWFQzX0RFRkFVTFRTX1RPX09SREVSRUQgaXMgbm90IHNldAorQ09ORklHX0VYVDNfRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19FWFQzX0ZTX1NFQ1VSSVRZPXkKK0NPTkZJR19FWFQ0X0ZTPXkKKyMgQ09ORklHX0ROT1RJRlkgaXMgbm90IHNldAorQ09ORklHX0ZVU0VfRlM9eQorQ09ORklHX0lTTzk2NjBfRlM9eQorQ09ORklHX0pPTElFVD15CitDT05GSUdfWklTT0ZTPXkKK0NPTkZJR19VREZfRlM9bQorQ09ORklHX01TRE9TX0ZTPXkKK0NPTkZJR19WRkFUX0ZTPXkKK0NPTkZJR19QUk9DX0tDT1JFPXkKK0NPTkZJR19UTVBGUz15CitDT05GSUdfVE1QRlNfUE9TSVhfQUNMPXkKK0NPTkZJR19DT05GSUdGU19GUz1tCitDT05GSUdfQ1JBTUZTPXkKK0NPTkZJR19ORlNfRlM9eQorQ09ORklHX05GU19WMz15CitDT05GSUdfTkZTX1YzX0FDTD15CitDT05GSUdfTkZTX1Y0PXkKK0NPTkZJR19ORlNfVjRfMT15CitDT05GSUdfUk9PVF9ORlM9eQorQ09ORklHX0NJRlM9eQorQ09ORklHX0NJRlNfV0VBS19QV19IQVNIPXkKK0NPTkZJR19DSUZTX1hBVFRSPXkKK0NPTkZJR19DSUZTX1BPU0lYPXkKK0NPTkZJR19OTFNfQ09ERVBBR0VfNDM3PXkKK0NPTkZJR19OTFNfQVNDSUk9eQorQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX0NSQ19DQ0lUVD1tCitDT05GSUdfQ1JDX1QxMERJRj15CitDT05GSUdfTElCQ1JDMzJDPW0KK0NPTkZJR19QUklOVEtfVElNRT15CitDT05GSUdfTUFHSUNfU1lTUlE9eQorQ09ORklHX1NUUklQX0FTTV9TWU1TPXkKK0NPTkZJR19ERVRFQ1RfSFVOR19UQVNLPXkKKyMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19ERUJVR19JTkZPPXkKK0NPTkZJR19GVFJBQ0VfU1lTQ0FMTFM9eQorQ09ORklHX1BQQ19FTVVMQVRFRF9TVEFUUz15CitDT05GSUdfWE1PTj15CitDT05GSUdfWE1PTl9ERUZBVUxUPXkKK0NPTkZJR19WSVJRX0RFQlVHPXkKK0NPTkZJR19QUENfRUFSTFlfREVCVUc9eQorQ09ORklHX0tFWVNfREVCVUdfUFJPQ19LRVlTPXkKK0NPTkZJR19DUllQVE9fTlVMTD1tCitDT05GSUdfQ1JZUFRPX1RFU1Q9bQorQ09ORklHX0NSWVBUT19DQ009bQorQ09ORklHX0NSWVBUT19HQ009bQorQ09ORklHX0NSWVBUT19QQ0JDPW0KK0NPTkZJR19DUllQVE9fTUlDSEFFTF9NSUM9bQorQ09ORklHX0NSWVBUT19TSEEyNTY9bQorQ09ORklHX0NSWVBUT19TSEE1MTI9bQorQ09ORklHX0NSWVBUT19UR1IxOTI9bQorQ09ORklHX0NSWVBUT19XUDUxMj1tCitDT05GSUdfQ1JZUFRPX0FFUz1tCitDT05GSUdfQ1JZUFRPX0FOVUJJUz1tCitDT05GSUdfQ1JZUFRPX0JMT1dGSVNIPW0KK0NPTkZJR19DUllQVE9fQ0FTVDU9bQorQ09ORklHX0NSWVBUT19DQVNUNj1tCitDT05GSUdfQ1JZUFRPX0tIQVpBRD1tCitDT05GSUdfQ1JZUFRPX1NBTFNBMjA9bQorQ09ORklHX0NSWVBUT19TRVJQRU5UPW0KK0NPTkZJR19DUllQVE9fVEVBPW0KK0NPTkZJR19DUllQVE9fVFdPRklTSD1tCitDT05GSUdfQ1JZUFRPX0xaTz1tCisjIENPTkZJR19DUllQVE9fQU5TSV9DUFJORyBpcyBub3Qgc2V0CitDT05GSUdfVklSVFVBTElaQVRJT049eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDMyX3NtcF9kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jb3JlbmV0MzJfc21wX2RlZmNvbmZpZwppbmRleCBmMDg3ZGU2Li5mOGFlZjIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9jb3JlbmV0MzJfc21wX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9jb3JlbmV0MzJfc21wX2RlZmNvbmZpZwpAQCAtMzcsNiArMzcsOCBAQAogQ09ORklHX1BDST15CiBDT05GSUdfUENJRVBPUlRCVVM9eQogIyBDT05GSUdfUENJRUFTUE0gaXMgbm90IHNldAorQ09ORklHX1JBUElESU89eQorQ09ORklHX0ZTTF9SSU89eQogQ09ORklHX05FVD15CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19VTklYPXkKQEAgLTk0LDE3ICs5NiwxNyBAQAogQ09ORklHX1NBVEFfU0lMPXkKIENPTkZJR19QQVRBX1NJTDY4MD15CiBDT05GSUdfTkVUREVWSUNFUz15Ci1DT05GSUdfVklURVNTRV9QSFk9eQotQ09ORklHX0ZJWEVEX1BIWT15Ci1DT05GSUdfTkVUX0VUSEVSTkVUPXkKK0NPTkZJR19GU0xfUFFfTURJTz15CiBDT05GSUdfRTEwMDA9eQogQ09ORklHX0UxMDAwRT15Ci1DT05GSUdfRlNMX1BRX01ESU89eQorQ09ORklHX1ZJVEVTU0VfUEhZPXkKK0NPTkZJR19GSVhFRF9QSFk9eQogIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfTU9VU0UgaXMgbm90IHNldAogQ09ORklHX1NFUklPX0xJQlBTMj15CiAjIENPTkZJR19MRUdBQ1lfUFRZUyBpcyBub3Qgc2V0CitDT05GSUdfUFBDX0VQQVBSX0hWX0JZVEVDSEFOPXkKIENPTkZJR19TRVJJQUxfODI1MD15CiBDT05GSUdfU0VSSUFMXzgyNTBfQ09OU09MRT15CiBDT05GSUdfU0VSSUFMXzgyNTBfRVhURU5ERUQ9eQpAQCAtMTU1LDYgKzE1Nyw3IEBACiBDT05GSUdfTlRGU19GUz15CiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfVE1QRlM9eQorQ09ORklHX0hVR0VUTEJGUz15CiBDT05GSUdfSkZGUzJfRlM9eQogQ09ORklHX0NSQU1GUz15CiBDT05GSUdfTkZTX0ZTPXkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9jb25maWdzL2NvcmVuZXQ2NF9zbXBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDY0X3NtcF9kZWZjb25maWcKaW5kZXggNzgyODIyYy4uN2VkOGQ0YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDY0X3NtcF9kZWZjb25maWcKKysrIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvY29yZW5ldDY0X3NtcF9kZWZjb25maWcKQEAgLTIzLDYgKzIzLDggQEAKIENPTkZJR19OT19IWj15CiBDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKIENPTkZJR19CSU5GTVRfTUlTQz1tCitDT05GSUdfUkFQSURJTz15CitDT05GSUdfRlNMX1JJTz15CiBDT05GSUdfTkVUPXkKIENPTkZJR19QQUNLRVQ9eQogQ09ORklHX1VOSVg9eQpAQCAtNTcsNyArNTksNiBAQAogQ09ORklHX0VFUFJPTV9MRUdBQ1k9eQogQ09ORklHX05FVERFVklDRVM9eQogQ09ORklHX0RVTU1ZPXkKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQogQ09ORklHX0lOUFVUX0ZGX01FTUxFU1M9bQogIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldApAQCAtODEsNiArODIsNyBAQAogIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKIENPTkZJR19QUk9DX0tDT1JFPXkKIENPTkZJR19UTVBGUz15CitDT05GSUdfSFVHRVRMQkZTPXkKICMgQ09ORklHX01JU0NfRklMRVNZU1RFTVMgaXMgbm90IHNldAogQ09ORklHX1BBUlRJVElPTl9BRFZBTkNFRD15CiBDT05GSUdfTUFDX1BBUlRJVElPTj15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X2RlZmNvbmZpZyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnCmluZGV4IGExZTVhMTcuLmYzN2EyYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfZGVmY29uZmlnCkBAIC0xLDUgKzEsNCBAQAogQ09ORklHX1BQQ184NXh4PXkKLUNPTkZJR19QSFlTXzY0QklUPXkKIENPTkZJR19FWFBFUklNRU5UQUw9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CkBAIC05MywxNSArOTIsMTQgQEAKIENPTkZJR19QQVRBX0FMST15CiBDT05GSUdfTkVUREVWSUNFUz15CiBDT05GSUdfRFVNTVk9eQorQ09ORklHX0ZTX0VORVQ9eQorQ09ORklHX1VDQ19HRVRIPXkKK0NPTkZJR19HSUFORkFSPXkKIENPTkZJR19NQVJWRUxMX1BIWT15CiBDT05GSUdfREFWSUNPTV9QSFk9eQogQ09ORklHX0NJQ0FEQV9QSFk9eQogQ09ORklHX1ZJVEVTU0VfUEhZPXkKIENPTkZJR19GSVhFRF9QSFk9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfRlNfRU5FVD15Ci1DT05GSUdfR0lBTkZBUj15Ci1DT05GSUdfVUNDX0dFVEg9eQogQ09ORklHX0lOUFVUX0ZGX01FTUxFU1M9bQogIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldApAQCAtMTIwLDYgKzExOCw5IEBACiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQ1BNPW0KIENPTkZJR19JMkNfTVBDPXkKK0NPTkZJR19TUEk9eQorQ09ORklHX1NQSV9GU0xfU1BJPXkKK0NPTkZJR19TUElfRlNMX0VTUEk9eQogQ09ORklHX0dQSU9fTVBDOFhYWD15CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9eQpAQCAtMTYzLDYgKzE2NCwxMCBAQAogQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfQkU9eQogQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfTEU9eQogQ09ORklHX1VTQl9TVE9SQUdFPXkKK0NPTkZJR19NTUM9eQorQ09ORklHX01NQ19TREhDST15CitDT05GSUdfTU1DX1NESENJX1BMVEZNPXkKK0NPTkZJR19NTUNfU0RIQ0lfT0ZfRVNESEM9eQogQ09ORklHX0VEQUM9eQogQ09ORklHX0VEQUNfTU1fRURBQz15CiBDT05GSUdfUlRDX0NMQVNTPXkKQEAgLTE4Miw2ICsxODcsNyBAQAogQ09ORklHX05URlNfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1RNUEZTPXkKK0NPTkZJR19IVUdFVExCRlM9eQogQ09ORklHX0FERlNfRlM9bQogQ09ORklHX0FGRlNfRlM9bQogQ09ORklHX0hGU19GUz1tCkBAIC0yMTMsNCArMjE5LDUgQEAKIENPTkZJR19DUllQVE9fU0hBNTEyPXkKIENPTkZJR19DUllQVE9fQUVTPXkKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVWX0ZTTF9DQUFNPXkKIENPTkZJR19DUllQVE9fREVWX1RBTElUT1M9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9zbXBfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvbXBjODV4eF9zbXBfZGVmY29uZmlnCmluZGV4IGRkMWU0MTMuLmFiZGNkMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL21wYzg1eHhfc21wX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9tcGM4NXh4X3NtcF9kZWZjb25maWcKQEAgLTEsNSArMSw0IEBACiBDT05GSUdfUFBDXzg1eHg9eQotQ09ORklHX1BIWVNfNjRCSVQ9eQogQ09ORklHX1NNUD15CiBDT05GSUdfTlJfQ1BVUz04CiBDT05GSUdfRVhQRVJJTUVOVEFMPXkKQEAgLTI2LDYgKzI1LDcgQEAKIENPTkZJR19NUEM4NTM2X0RTPXkKIENPTkZJR19NUEM4NXh4X0RTPXkKIENPTkZJR19NUEM4NXh4X1JEQj15CitDT05GSUdfUDEwMTBfUkRCPXkKIENPTkZJR19QMTAyMl9EUz15CiBDT05GSUdfUDEwMjNfUkRTPXkKIENPTkZJR19TT0NSQVRFUz15CkBAIC05NCwxNSArOTQsMTQgQEAKIENPTkZJR19QQVRBX0FMST15CiBDT05GSUdfTkVUREVWSUNFUz15CiBDT05GSUdfRFVNTVk9eQorQ09ORklHX0ZTX0VORVQ9eQorQ09ORklHX1VDQ19HRVRIPXkKK0NPTkZJR19HSUFORkFSPXkKIENPTkZJR19NQVJWRUxMX1BIWT15CiBDT05GSUdfREFWSUNPTV9QSFk9eQogQ09ORklHX0NJQ0FEQV9QSFk9eQogQ09ORklHX1ZJVEVTU0VfUEhZPXkKIENPTkZJR19GSVhFRF9QSFk9eQotQ09ORklHX05FVF9FVEhFUk5FVD15Ci1DT05GSUdfRlNfRU5FVD15Ci1DT05GSUdfR0lBTkZBUj15Ci1DT05GSUdfVUNDX0dFVEg9eQogQ09ORklHX0lOUFVUX0ZGX01FTUxFU1M9bQogIyBDT05GSUdfSU5QVVRfTU9VU0VERVYgaXMgbm90IHNldAogIyBDT05GSUdfSU5QVVRfS0VZQk9BUkQgaXMgbm90IHNldApAQCAtMTIxLDYgKzEyMCw5IEBACiBDT05GSUdfSTJDPXkKIENPTkZJR19JMkNfQ1BNPW0KIENPTkZJR19JMkNfTVBDPXkKK0NPTkZJR19TUEk9eQorQ09ORklHX1NQSV9GU0xfU1BJPXkKK0NPTkZJR19TUElfRlNMX0VTUEk9eQogQ09ORklHX0dQSU9fTVBDOFhYWD15CiAjIENPTkZJR19IV01PTiBpcyBub3Qgc2V0CiBDT05GSUdfVklERU9fT1VUUFVUX0NPTlRST0w9eQpAQCAtMTY0LDYgKzE2NiwxMCBAQAogQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfQkU9eQogQ09ORklHX1VTQl9PSENJX0hDRF9QUENfT0ZfTEU9eQogQ09ORklHX1VTQl9TVE9SQUdFPXkKK0NPTkZJR19NTUM9eQorQ09ORklHX01NQ19TREhDST15CitDT05GSUdfTU1DX1NESENJX1BMVEZNPXkKK0NPTkZJR19NTUNfU0RIQ0lfT0ZfRVNESEM9eQogQ09ORklHX0VEQUM9eQogQ09ORklHX0VEQUNfTU1fRURBQz15CiBDT05GSUdfUlRDX0NMQVNTPXkKQEAgLTE4Myw2ICsxODksNyBAQAogQ09ORklHX05URlNfRlM9eQogQ09ORklHX1BST0NfS0NPUkU9eQogQ09ORklHX1RNUEZTPXkKK0NPTkZJR19IVUdFVExCRlM9eQogQ09ORklHX0FERlNfRlM9bQogQ09ORklHX0FGRlNfRlM9bQogQ09ORklHX0hGU19GUz1tCkBAIC0yMTQsNCArMjIxLDUgQEAKIENPTkZJR19DUllQVE9fU0hBNTEyPXkKIENPTkZJR19DUllQVE9fQUVTPXkKICMgQ09ORklHX0NSWVBUT19BTlNJX0NQUk5HIGlzIG5vdCBzZXQKK0NPTkZJR19DUllQVE9fREVWX0ZTTF9DQUFNPXkKIENPTkZJR19DUllQVE9fREVWX1RBTElUT1M9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHBjNjRfZGVmY29uZmlnCmluZGV4IDUzNTcxMWYuLjIxNTZlMDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9jb25maWdzL3BwYzY0X2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wcGM2NF9kZWZjb25maWcKQEAgLTM5MCw2ICszOTAsMTEgQEAKIENPTkZJR19IRlNfRlM9bQogQ09ORklHX0hGU1BMVVNfRlM9bQogQ09ORklHX0NSQU1GUz1tCitDT05GSUdfU1FVQVNIRlM9bQorQ09ORklHX1NRVUFTSEZTX1hBVFRSPXkKK0NPTkZJR19TUVVBU0hGU19aTElCPXkKK0NPTkZJR19TUVVBU0hGU19MWk89eQorQ09ORklHX1NRVUFTSEZTX1haPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CiBDT05GSUdfTkZTX1YzX0FDTD15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnIGIvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHMzX2RlZmNvbmZpZwppbmRleCAxODVjMjkyLi5kZWQ4Njc4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wczNfZGVmY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9jb25maWdzL3BzM19kZWZjb25maWcKQEAgLTYsMTAgKzYsMTAgQEAKIENPTkZJR19FWFBFUklNRU5UQUw9eQogQ09ORklHX1NZU1ZJUEM9eQogQ09ORklHX1BPU0lYX01RVUVVRT15Ci1DT05GSUdfTkFNRVNQQUNFUz15CitDT05GSUdfU1BBUlNFX0lSUT15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQotQ09ORklHX0VYUEVSVD15Ci1DT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15CitDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQorQ09ORklHX0VNQkVEREVEPXkKICMgQ09ORklHX1BFUkZfRVZFTlRTIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogQ09ORklHX1NMQUI9eQpAQCAtMTcsNiArMTcsNyBAQAogQ09ORklHX09QUk9GSUxFPW0KIENPTkZJR19NT0RVTEVTPXkKIENPTkZJR19NT0RVTEVfVU5MT0FEPXkKKyMgQ09ORklHX1BQQ19QT1dFUk5WIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19QU0VSSUVTIGlzIG5vdCBzZXQKICMgQ09ORklHX1BQQ19QTUFDIGlzIG5vdCBzZXQKIENPTkZJR19QUENfUFMzPXkKQEAgLTI3LDE0ICsyOCwxNCBAQAogQ09ORklHX1BTM19MUE09bQogIyBDT05GSUdfUFBDX09GX0JPT1RfVFJBTVBPTElORSBpcyBub3Qgc2V0CiBDT05GSUdfSElHSF9SRVNfVElNRVJTPXkKKyMgQ09ORklHX0NPUkVfRFVNUF9ERUZBVUxUX0VMRl9IRUFERVJTIGlzIG5vdCBzZXQKIENPTkZJR19CSU5GTVRfTUlTQz15CiBDT05GSUdfS0VYRUM9eQotQ09ORklHX1NQQVJTRV9JUlE9eQogIyBDT05GSUdfU1BBUlNFTUVNX1ZNRU1NQVAgaXMgbm90IHNldAogQ09ORklHX1NDSEVEX1NNVD15CiBDT05GSUdfQ01ETElORV9CT09MPXkKIENPTkZJR19DTURMSU5FPSIiCi1DT05GSUdfUE09eQorQ09ORklHX1BNX1JVTlRJTUU9eQogQ09ORklHX1BNX0RFQlVHPXkKICMgQ09ORklHX1NFQ0NPTVAgaXMgbm90IHNldAogIyBDT05GSUdfUENJIGlzIG5vdCBzZXQKQEAgLTgxLDIwICs4MiwyMyBAQAogQ09ORklHX01EPXkKIENPTkZJR19CTEtfREVWX0RNPW0KIENPTkZJR19ORVRERVZJQ0VTPXkKLUNPTkZJR19ORVRfRVRIRVJORVQ9eQorIyBDT05GSUdfTkVUX1ZFTkRPUl9CUk9BRENPTSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX0NIRUxTSU8gaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9JTlRFTCBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX01BUlZFTEwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9NSUNSRUwgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX1ZFTkRPUl9OQVRTRU1JIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfU0VFUSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfVkVORE9SX1NUTUlDUk8gaXMgbm90IHNldAogQ09ORklHX0dFTElDX05FVD15CiBDT05GSUdfR0VMSUNfV0lSRUxFU1M9eQotIyBDT05GSUdfTkVUREVWXzEwMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9WRU5ET1JfWElMSU5YIGlzIG5vdCBzZXQKIENPTkZJR19VU0JfVVNCTkVUPW0KICMgQ09ORklHX1VTQl9ORVRfQ0RDRVRIRVIgaXMgbm90IHNldAorIyBDT05GSUdfVVNCX05FVF9DRENfTkNNIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9ORVRfTkVUMTA4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfTkVUX0NEQ19TVUJTRVQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX05FVF9aQVVSVVMgaXMgbm90IHNldAotQ09ORklHX1BQUD1tCi1DT05GSUdfUFBQX01VTFRJTElOSz15Ci1DT05GSUdfUFBQX0FTWU5DPW0KLUNPTkZJR19QUFBfREVGTEFURT1tCi1DT05GSUdfUFBQT0U9bQogQ09ORklHX0lOUFVUX0ZGX01FTUxFU1M9bQogIyBDT05GSUdfSU5QVVRfTU9VU0VERVZfUFNBVVggaXMgbm90IHNldAogQ09ORklHX0lOUFVUX0pPWURFVj1tCkBAIC0xMzUsMjIgKzEzOSwyMSBAQAogQ09ORklHX1VTQl9BTk5PVU5DRV9ORVdfREVWSUNFUz15CiBDT05GSUdfVVNCX0RFVklDRUZTPXkKICMgQ09ORklHX1VTQl9ERVZJQ0VfQ0xBU1MgaXMgbm90IHNldAorQ09ORklHX1VTQl9TVVNQRU5EPXkKIENPTkZJR19VU0JfTU9OPW0KIENPTkZJR19VU0JfRUhDSV9IQ0Q9bQotQ09ORklHX1VTQl9FSENJX1RUX05FV1NDSEVEPXkKICMgQ09ORklHX1VTQl9FSENJX0hDRF9QUENfT0YgaXMgbm90IHNldAogQ09ORklHX1VTQl9PSENJX0hDRD1tCiBDT05GSUdfVVNCX1NUT1JBR0U9bQogQ09ORklHX1JUQ19DTEFTUz15Ci1DT05GSUdfUlRDX0RSVl9QUzM9bQorQ09ORklHX1JUQ19EUlZfUFMzPXkKKyMgQ09ORklHX0lPTU1VX1NVUFBPUlQgaXMgbm90IHNldAogQ09ORklHX0VYVDJfRlM9bQogQ09ORklHX0VYVDNfRlM9bQogIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKIENPTkZJR19FWFQ0X0ZTPXkKLUNPTkZJR19JTk9USUZZPXkKIENPTkZJR19RVU9UQT15CiBDT05GSUdfUUZNVF9WMj15Ci1DT05GSUdfQVVUT0ZTX0ZTPW0KIENPTkZJR19BVVRPRlM0X0ZTPW0KIENPTkZJR19JU085NjYwX0ZTPW0KIENPTkZJR19KT0xJRVQ9eQpAQCAtMTY3LDE5ICsxNzAsMTcgQEAKIENPTkZJR19OTFM9eQogQ09ORklHX05MU19DT0RFUEFHRV80Mzc9eQogQ09ORklHX05MU19JU084ODU5XzE9eQorQ09ORklHX0NSQ19DQ0lUVD1tCiBDT05GSUdfQ1JDX1QxMERJRj15CiBDT05GSUdfTUFHSUNfU1lTUlE9eQogQ09ORklHX0RFQlVHX0ZTPXkKLUNPTkZJR19ERUJVR19LRVJORUw9eQogQ09ORklHX0RFVEVDVF9IVU5HX1RBU0s9eQogQ09ORklHX1BST1ZFX0xPQ0tJTkc9eQogQ09ORklHX0RFQlVHX0xPQ0tERVA9eQotQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQPXkKIENPTkZJR19ERUJVR19JTkZPPXkKIENPTkZJR19ERUJVR19XUklURUNPVU5UPXkKIENPTkZJR19ERUJVR19NRU1PUllfSU5JVD15CiBDT05GSUdfREVCVUdfTElTVD15Ci0jIENPTkZJR19SQ1VfQ1BVX1NUQUxMX0RFVEVDVE9SIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CiAjIENPTkZJR19GVFJBQ0UgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1NUQUNLT1ZFUkZMT1c9eQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2NvbmZpZ3MvcHNlcmllc19kZWZjb25maWcgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwppbmRleCBhNzJmMjQxLi4zMGU3ZDBkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvY29uZmlncy9wc2VyaWVzX2RlZmNvbmZpZwpAQCAtMzA0LDYgKzMwNCwxMSBAQAogQ09ORklHX1RNUEZTPXkKIENPTkZJR19IVUdFVExCRlM9eQogQ09ORklHX0NSQU1GUz1tCitDT05GSUdfU1FVQVNIRlM9bQorQ09ORklHX1NRVUFTSEZTX1hBVFRSPXkKK0NPTkZJR19TUVVBU0hGU19aTElCPXkKK0NPTkZJR19TUVVBU0hGU19MWk89eQorQ09ORklHX1NRVUFTSEZTX1haPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CiBDT05GSUdfTkZTX1YzX0FDTD15CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vS2J1aWxkIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL0tidWlsZAppbmRleCBkNTFkZjE3Li43ZTMxM2YxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vS2J1aWxkCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9LYnVpbGQKQEAgLTM0LDMgKzM0LDUgQEAKIGhlYWRlci15ICs9IHR5cGVzLmgKIGhlYWRlci15ICs9IHVjb250ZXh0LmgKIGhlYWRlci15ICs9IHVuaXN0ZC5oCisKK2dlbmVyaWMteSArPSByd3NlbS5oCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGFibGUuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oCmluZGV4IGUzMDQ0MmMuLmFkNTVhMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0YWJsZS5oCkBAIC0yMDEsNiArMjAxLDcgQEAKICNkZWZpbmUgQ1BVX0ZUUl9QT1BDTlRCCQkJTE9OR19BU01fQ09OU1QoMHgwNDAwMDAwMDAwMDAwMDAwKQogI2RlZmluZSBDUFVfRlRSX1BPUENOVEQJCQlMT05HX0FTTV9DT05TVCgweDA4MDAwMDAwMDAwMDAwMDApCiAjZGVmaW5lIENQVV9GVFJfSUNTV1gJCQlMT05HX0FTTV9DT05TVCgweDEwMDAwMDAwMDAwMDAwMDApCisjZGVmaW5lIENQVV9GVFJfVk1YX0NPUFkJCUxPTkdfQVNNX0NPTlNUKDB4MjAwMDAwMDAwMDAwMDAwMCkKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIApAQCAtNDI1LDcgKzQyNiw3IEBACiAJICAgIENQVV9GVFJfUFVSUiB8IENQVV9GVFJfU1BVUlIgfCBDUFVfRlRSX1JFQUxfTEUgfCBcCiAJICAgIENQVV9GVFJfRFNDUiB8IENQVV9GVFJfU0FPICB8IENQVV9GVFJfQVNZTV9TTVQgfCBcCiAJICAgIENQVV9GVFJfU1RDWF9DSEVDS1NfQUREUkVTUyB8IENQVV9GVFJfUE9QQ05UQiB8IENQVV9GVFJfUE9QQ05URCB8IFwKLQkgICAgQ1BVX0ZUUl9JQ1NXWCB8IENQVV9GVFJfQ0ZBUiB8IENQVV9GVFJfSFZNT0RFKQorCSAgICBDUFVfRlRSX0lDU1dYIHwgQ1BVX0ZUUl9DRkFSIHwgQ1BVX0ZUUl9IVk1PREUgfCBDUFVfRlRSX1ZNWF9DT1BZKQogI2RlZmluZSBDUFVfRlRSU19DRUxMCShDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfTFdTWU5DIHwgXAogCSAgICBDUFVfRlRSX1BQQ0FTX0FSQ0hfVjIgfCBDUFVfRlRSX0NUUkwgfCBcCiAJICAgIENQVV9GVFJfQUxUSVZFQ19DT01QIHwgQ1BVX0ZUUl9NTUNSQSB8IENQVV9GVFJfU01UIHwgXApAQCAtNDM3LDcgKzQzOCw3IEBACiAjZGVmaW5lIENQVV9GVFJTX0NPTVBBVElCTEUJKENQVV9GVFJfVVNFX1RCIHwgQ1BVX0ZUUl9QUENBU19BUkNIX1YyKQogCiAjZGVmaW5lIENQVV9GVFJTX0EyIChDUFVfRlRSX1VTRV9UQiB8IENQVV9GVFJfU01UIHwgQ1BVX0ZUUl9EQkVMTCB8IFwKLQkJICAgICBDUFVfRlRSX05PRVhFQ1VURSB8IENQVV9GVFJfTk9EU0lTUkFMSUdOKQorCQkgICAgIENQVV9GVFJfTk9FWEVDVVRFIHwgQ1BVX0ZUUl9OT0RTSVNSQUxJR04gfCBDUFVfRlRSX0lDU1dYKQogCiAjaWZkZWYgX19wb3dlcnBjNjRfXwogI2lmZGVmIENPTkZJR19QUENfQk9PSzNFCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGltZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAppbmRleCAxY2YyMGJkLi40ODdkNDZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vY3B1dGltZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKQEAgLTI5LDI1ICsyOSw4IEBACiAjaW5jbHVkZSA8YXNtL3RpbWUuaD4KICNpbmNsdWRlIDxhc20vcGFyYW0uaD4KIAotdHlwZWRlZiB1NjQgY3B1dGltZV90OwotdHlwZWRlZiB1NjQgY3B1dGltZTY0X3Q7Ci0KLSNkZWZpbmUgY3B1dGltZV96ZXJvCQkJKChjcHV0aW1lX3QpMCkKLSNkZWZpbmUgY3B1dGltZV9tYXgJCQkoKH4oKGNwdXRpbWVfdCkwKSA+PiAxKSAtIDEpCi0jZGVmaW5lIGNwdXRpbWVfYWRkKF9fYSwgX19iKQkJKChfX2EpICsgIChfX2IpKQotI2RlZmluZSBjcHV0aW1lX3N1YihfX2EsIF9fYikJCSgoX19hKSAtICAoX19iKSkKLSNkZWZpbmUgY3B1dGltZV9kaXYoX19hLCBfX24pCQkoKF9fYSkgLyAgKF9fbikpCi0jZGVmaW5lIGNwdXRpbWVfaGFsdmUoX19hKQkJKChfX2EpID4+IDEpCi0jZGVmaW5lIGNwdXRpbWVfZXEoX19hLCBfX2IpCQkoKF9fYSkgPT0gKF9fYikpCi0jZGVmaW5lIGNwdXRpbWVfZ3QoX19hLCBfX2IpCQkoKF9fYSkgPiAgKF9fYikpCi0jZGVmaW5lIGNwdXRpbWVfZ2UoX19hLCBfX2IpCQkoKF9fYSkgPj0gKF9fYikpCi0jZGVmaW5lIGNwdXRpbWVfbHQoX19hLCBfX2IpCQkoKF9fYSkgPCAgKF9fYikpCi0jZGVmaW5lIGNwdXRpbWVfbGUoX19hLCBfX2IpCQkoKF9fYSkgPD0gKF9fYikpCi0KLSNkZWZpbmUgY3B1dGltZTY0X3plcm8JCQkoKGNwdXRpbWU2NF90KTApCi0jZGVmaW5lIGNwdXRpbWU2NF9hZGQoX19hLCBfX2IpCQkoKF9fYSkgKyAoX19iKSkKLSNkZWZpbmUgY3B1dGltZTY0X3N1YihfX2EsIF9fYikJCSgoX19hKSAtIChfX2IpKQotI2RlZmluZSBjcHV0aW1lX3RvX2NwdXRpbWU2NChfX2N0KQkoX19jdCkKK3R5cGVkZWYgdTY0IF9fbm9jYXN0IGNwdXRpbWVfdDsKK3R5cGVkZWYgdTY0IF9fbm9jYXN0IGNwdXRpbWU2NF90OwogCiAjaWZkZWYgX19LRVJORUxfXwogCkBAIC02NSw3ICs0OCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjcHV0aW1lX3RvX2ppZmZpZXMoY29uc3QgY3B1dGltZV90IGN0KQogewotCXJldHVybiBtdWxoZHUoY3QsIF9fY3B1dGltZV9qaWZmaWVzX2ZhY3Rvcik7CisJcmV0dXJuIG11bGhkdSgoX19mb3JjZSB1NjQpIGN0LCBfX2NwdXRpbWVfamlmZmllc19mYWN0b3IpOwogfQogCiAvKiBFc3RpbWF0ZSB0aGUgc2NhbGVkIGNwdXRpbWUgYnkgc2NhbGluZyB0aGUgcmVhbCBjcHV0aW1lIGJhc2VkIG9uCkBAIC03NCwxNCArNTcsMTUgQEAKIHsKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfU1BVUlIpICYmCiAJICAgIF9fZ2V0X2NwdV92YXIoY3B1dGltZV9sYXN0X2RlbHRhKSkKLQkJcmV0dXJuIGN0ICogX19nZXRfY3B1X3ZhcihjcHV0aW1lX3NjYWxlZF9sYXN0X2RlbHRhKSAvCi0JCQkgICAgX19nZXRfY3B1X3ZhcihjcHV0aW1lX2xhc3RfZGVsdGEpOworCQlyZXR1cm4gKF9fZm9yY2UgdTY0KSBjdCAqCisJCQlfX2dldF9jcHVfdmFyKGNwdXRpbWVfc2NhbGVkX2xhc3RfZGVsdGEpIC8KKwkJCV9fZ2V0X2NwdV92YXIoY3B1dGltZV9sYXN0X2RlbHRhKTsKIAlyZXR1cm4gY3Q7CiB9CiAKIHN0YXRpYyBpbmxpbmUgY3B1dGltZV90IGppZmZpZXNfdG9fY3B1dGltZShjb25zdCB1bnNpZ25lZCBsb25nIGppZikKIHsKLQljcHV0aW1lX3QgY3Q7CisJdTY0IGN0OwogCXVuc2lnbmVkIGxvbmcgc2VjOwogCiAJLyogaGF2ZSB0byBiZSBhIGxpdHRsZSBjYXJlZnVsIGFib3V0IG92ZXJmbG93ICovCkBAIC05Myw3ICs3Nyw3IEBACiAJfQogCWlmIChzZWMpCiAJCWN0ICs9IChjcHV0aW1lX3QpIHNlYyAqIHRiX3RpY2tzX3Blcl9zZWM7Ci0JcmV0dXJuIGN0OworCXJldHVybiAoX19mb3JjZSBjcHV0aW1lX3QpIGN0OwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfY3B1dGltZV9vbmVfamlmZnkodm9pZCkKQEAgLTEwMyw3ICs4Nyw3IEBACiAKIHN0YXRpYyBpbmxpbmUgY3B1dGltZTY0X3QgamlmZmllczY0X3RvX2NwdXRpbWU2NChjb25zdCB1NjQgamlmKQogewotCWNwdXRpbWVfdCBjdDsKKwl1NjQgY3Q7CiAJdTY0IHNlYzsKIAogCS8qIGhhdmUgdG8gYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBvdmVyZmxvdyAqLwpAQCAtMTE0LDI4ICs5OCwyOCBAQAogCQlkb19kaXYoY3QsIEhaKTsKIAl9CiAJaWYgKHNlYykKLQkJY3QgKz0gKGNwdXRpbWVfdCkgc2VjICogdGJfdGlja3NfcGVyX3NlYzsKLQlyZXR1cm4gY3Q7CisJCWN0ICs9ICh1NjQpIHNlYyAqIHRiX3RpY2tzX3Blcl9zZWM7CisJcmV0dXJuIChfX2ZvcmNlIGNwdXRpbWU2NF90KSBjdDsKIH0KIAogc3RhdGljIGlubGluZSB1NjQgY3B1dGltZTY0X3RvX2ppZmZpZXM2NChjb25zdCBjcHV0aW1lX3QgY3QpCiB7Ci0JcmV0dXJuIG11bGhkdShjdCwgX19jcHV0aW1lX2ppZmZpZXNfZmFjdG9yKTsKKwlyZXR1cm4gbXVsaGR1KChfX2ZvcmNlIHU2NCkgY3QsIF9fY3B1dGltZV9qaWZmaWVzX2ZhY3Rvcik7CiB9CiAKIC8qCiAgKiBDb252ZXJ0IGNwdXRpbWUgPC0+IG1pY3Jvc2Vjb25kcwogICovCi1leHRlcm4gdTY0IF9fY3B1dGltZV9tc2VjX2ZhY3RvcjsKK2V4dGVybiB1NjQgX19jcHV0aW1lX3VzZWNfZmFjdG9yOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY3B1dGltZV90b191c2Vjcyhjb25zdCBjcHV0aW1lX3QgY3QpCiB7Ci0JcmV0dXJuIG11bGhkdShjdCwgX19jcHV0aW1lX21zZWNfZmFjdG9yKSAqIFVTRUNfUEVSX01TRUM7CisJcmV0dXJuIG11bGhkdSgoX19mb3JjZSB1NjQpIGN0LCBfX2NwdXRpbWVfdXNlY19mYWN0b3IpOwogfQogCiBzdGF0aWMgaW5saW5lIGNwdXRpbWVfdCB1c2Vjc190b19jcHV0aW1lKGNvbnN0IHVuc2lnbmVkIGxvbmcgdXMpCiB7Ci0JY3B1dGltZV90IGN0OworCXU2NCBjdDsKIAl1bnNpZ25lZCBsb25nIHNlYzsKIAogCS8qIGhhdmUgdG8gYmUgYSBsaXR0bGUgY2FyZWZ1bCBhYm91dCBvdmVyZmxvdyAqLwpAQCAtMTQzLDEzICsxMjcsMTUgQEAKIAlzZWMgPSB1cyAvIDEwMDAwMDA7CiAJaWYgKGN0KSB7CiAJCWN0ICo9IHRiX3RpY2tzX3Blcl9zZWM7Ci0JCWRvX2RpdihjdCwgMTAwMCk7CisJCWRvX2RpdihjdCwgMTAwMDAwMCk7CiAJfQogCWlmIChzZWMpCiAJCWN0ICs9IChjcHV0aW1lX3QpIHNlYyAqIHRiX3RpY2tzX3Blcl9zZWM7Ci0JcmV0dXJuIGN0OworCXJldHVybiAoX19mb3JjZSBjcHV0aW1lX3QpIGN0OwogfQogCisjZGVmaW5lIHVzZWNzX3RvX2NwdXRpbWU2NCh1cykJCXVzZWNzX3RvX2NwdXRpbWUodXMpCisKIC8qCiAgKiBDb252ZXJ0IGNwdXRpbWUgPC0+IHNlY29uZHMKICAqLwpAQCAtMTU3LDEyICsxNDMsMTIgQEAKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGNwdXRpbWVfdG9fc2Vjcyhjb25zdCBjcHV0aW1lX3QgY3QpCiB7Ci0JcmV0dXJuIG11bGhkdShjdCwgX19jcHV0aW1lX3NlY19mYWN0b3IpOworCXJldHVybiBtdWxoZHUoKF9fZm9yY2UgdTY0KSBjdCwgX19jcHV0aW1lX3NlY19mYWN0b3IpOwogfQogCiBzdGF0aWMgaW5saW5lIGNwdXRpbWVfdCBzZWNzX3RvX2NwdXRpbWUoY29uc3QgdW5zaWduZWQgbG9uZyBzZWMpCiB7Ci0JcmV0dXJuIChjcHV0aW1lX3QpIHNlYyAqIHRiX3RpY2tzX3Blcl9zZWM7CisJcmV0dXJuIChfX2ZvcmNlIGNwdXRpbWVfdCkoKHU2NCkgc2VjICogdGJfdGlja3NfcGVyX3NlYyk7CiB9CiAKIC8qCkBAIC0xNzAsNyArMTU2LDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGNwdXRpbWVfdG9fdGltZXNwZWMoY29uc3QgY3B1dGltZV90IGN0LCBzdHJ1Y3QgdGltZXNwZWMgKnApCiB7Ci0JdTY0IHggPSBjdDsKKwl1NjQgeCA9IChfX2ZvcmNlIHU2NCkgY3Q7CiAJdW5zaWduZWQgaW50IGZyYWM7CiAKIAlmcmFjID0gZG9fZGl2KHgsIHRiX3RpY2tzX3Blcl9zZWMpOwpAQCAtMTgyLDExICsxNjgsMTEgQEAKIAogc3RhdGljIGlubGluZSBjcHV0aW1lX3QgdGltZXNwZWNfdG9fY3B1dGltZShjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnApCiB7Ci0JY3B1dGltZV90IGN0OworCXU2NCBjdDsKIAogCWN0ID0gKHU2NCkgcC0+dHZfbnNlYyAqIHRiX3RpY2tzX3Blcl9zZWM7CiAJZG9fZGl2KGN0LCAxMDAwMDAwMDAwKTsKLQlyZXR1cm4gY3QgKyAodTY0KSBwLT50dl9zZWMgKiB0Yl90aWNrc19wZXJfc2VjOworCXJldHVybiAoX19mb3JjZSBjcHV0aW1lX3QpKGN0ICsgKHU2NCkgcC0+dHZfc2VjICogdGJfdGlja3NfcGVyX3NlYyk7CiB9CiAKIC8qCkBAIC0xOTQsNyArMTgwLDcgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGNwdXRpbWVfdG9fdGltZXZhbChjb25zdCBjcHV0aW1lX3QgY3QsIHN0cnVjdCB0aW1ldmFsICpwKQogewotCXU2NCB4ID0gY3Q7CisJdTY0IHggPSAoX19mb3JjZSB1NjQpIGN0OwogCXVuc2lnbmVkIGludCBmcmFjOwogCiAJZnJhYyA9IGRvX2Rpdih4LCB0Yl90aWNrc19wZXJfc2VjKTsKQEAgLTIwNiwxMSArMTkyLDExIEBACiAKIHN0YXRpYyBpbmxpbmUgY3B1dGltZV90IHRpbWV2YWxfdG9fY3B1dGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCAqcCkKIHsKLQljcHV0aW1lX3QgY3Q7CisJdTY0IGN0OwogCiAJY3QgPSAodTY0KSBwLT50dl91c2VjICogdGJfdGlja3NfcGVyX3NlYzsKIAlkb19kaXYoY3QsIDEwMDAwMDApOwotCXJldHVybiBjdCArICh1NjQpIHAtPnR2X3NlYyAqIHRiX3RpY2tzX3Blcl9zZWM7CisJcmV0dXJuIChfX2ZvcmNlIGNwdXRpbWVfdCkoY3QgKyAodTY0KSBwLT50dl9zZWMgKiB0Yl90aWNrc19wZXJfc2VjKTsKIH0KIAogLyoKQEAgLTIyMCwxMiArMjA2LDEyIEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjcHV0aW1lX3RvX2Nsb2NrX3QoY29uc3QgY3B1dGltZV90IGN0KQogewotCXJldHVybiBtdWxoZHUoY3QsIF9fY3B1dGltZV9jbG9ja3RfZmFjdG9yKTsKKwlyZXR1cm4gbXVsaGR1KChfX2ZvcmNlIHU2NCkgY3QsIF9fY3B1dGltZV9jbG9ja3RfZmFjdG9yKTsKIH0KIAogc3RhdGljIGlubGluZSBjcHV0aW1lX3QgY2xvY2tfdF90b19jcHV0aW1lKGNvbnN0IHVuc2lnbmVkIGxvbmcgY2xrKQogewotCWNwdXRpbWVfdCBjdDsKKwl1NjQgY3Q7CiAJdW5zaWduZWQgbG9uZyBzZWM7CiAKIAkvKiBoYXZlIHRvIGJlIGEgbGl0dGxlIGNhcmVmdWwgYWJvdXQgb3ZlcmZsb3cgKi8KQEAgLTIzNiw4ICsyMjIsOCBAQAogCQlkb19kaXYoY3QsIFVTRVJfSFopOwogCX0KIAlpZiAoc2VjKQotCQljdCArPSAoY3B1dGltZV90KSBzZWMgKiB0Yl90aWNrc19wZXJfc2VjOwotCXJldHVybiBjdDsKKwkJY3QgKz0gKHU2NCkgc2VjICogdGJfdGlja3NfcGVyX3NlYzsKKwlyZXR1cm4gKF9fZm9yY2UgY3B1dGltZV90KSBjdDsKIH0KIAogI2RlZmluZSBjcHV0aW1lNjRfdG9fY2xvY2tfdChjdCkJY3B1dGltZV90b19jbG9ja190KChjcHV0aW1lX3QpKGN0KSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9mc2xfaWZjLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsX2lmYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NTUwMTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsX2lmYy5oCkBAIC0wLDAgKzEsODM0IEBACisvKiBGcmVlc2NhbGUgSW50ZWdyYXRlZCBGbGFzaCBDb250cm9sbGVyCisgKgorICogQ29weXJpZ2h0IDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYworICoKKyAqIEF1dGhvcjogRGlwZW4gRHVkaGF0IDxkaXBlbi5kdWRoYXRAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKi8KKworI2lmbmRlZiBfX0FTTV9GU0xfSUZDX0gKKyNkZWZpbmUgX19BU01fRlNMX0lGQ19ICisKKyNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKworI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNkZWZpbmUgRlNMX0lGQ19CQU5LX0NPVU5UIDQKKworLyoKKyAqIENTUFIgLSBDaGlwIFNlbGVjdCBQcm9wZXJ0eSBSZWdpc3RlcgorICovCisjZGVmaW5lIENTUFJfQkEJCQkJMHhGRkZGMDAwMAorI2RlZmluZSBDU1BSX0JBX1NISUZUCQkJMTYKKyNkZWZpbmUgQ1NQUl9QT1JUX1NJWkUJCQkweDAwMDAwMTgwCisjZGVmaW5lIENTUFJfUE9SVF9TSVpFX1NISUZUCQk3CisvKiBQb3J0IFNpemUgOCBiaXQgKi8KKyNkZWZpbmUgQ1NQUl9QT1JUX1NJWkVfOAkJMHgwMDAwMDA4MAorLyogUG9ydCBTaXplIDE2IGJpdCAqLworI2RlZmluZSBDU1BSX1BPUlRfU0laRV8xNgkJMHgwMDAwMDEwMAorLyogUG9ydCBTaXplIDMyIGJpdCAqLworI2RlZmluZSBDU1BSX1BPUlRfU0laRV8zMgkJMHgwMDAwMDE4MAorLyogV3JpdGUgUHJvdGVjdCAqLworI2RlZmluZSBDU1BSX1dQCQkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQ1NQUl9XUF9TSElGVAkJCTYKKy8qIE1hY2hpbmUgU2VsZWN0ICovCisjZGVmaW5lIENTUFJfTVNFTAkJCTB4MDAwMDAwMDYKKyNkZWZpbmUgQ1NQUl9NU0VMX1NISUZUCQkJMQorLyogTk9SICovCisjZGVmaW5lIENTUFJfTVNFTF9OT1IJCQkweDAwMDAwMDAwCisvKiBOQU5EICovCisjZGVmaW5lIENTUFJfTVNFTF9OQU5ECQkJMHgwMDAwMDAwMgorLyogR1BDTSAqLworI2RlZmluZSBDU1BSX01TRUxfR1BDTQkJCTB4MDAwMDAwMDQKKy8qIEJhbmsgVmFsaWQgKi8KKyNkZWZpbmUgQ1NQUl9WCQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQ1NQUl9WX1NISUZUCQkJMAorCisvKgorICogQWRkcmVzcyBNYXNrIFJlZ2lzdGVyCisgKi8KKyNkZWZpbmUgSUZDX0FNQVNLX01BU0sJCQkweEZGRkYwMDAwCisjZGVmaW5lIElGQ19BTUFTS19TSElGVAkJCTE2CisjZGVmaW5lIElGQ19BTUFTSyhuKQkJCShJRkNfQU1BU0tfTUFTSyA8PCBcCisJCQkJCShfX2lsb2cyKG4pIC0gSUZDX0FNQVNLX1NISUZUKSkKKworLyoKKyAqIENoaXAgU2VsZWN0IE9wdGlvbiBSZWdpc3RlciBJRkNfTkFORCBNYWNoaW5lCisgKi8KKy8qIEVuYWJsZSBFQ0MgRW5jb2RlciAqLworI2RlZmluZSBDU09SX05BTkRfRUNDX0VOQ19FTgkJMHg4MDAwMDAwMAorI2RlZmluZSBDU09SX05BTkRfRUNDX01PREVfTUFTSwkJMHgzMDAwMDAwMAorLyogNCBiaXQgY29ycmVjdGlvbiBwZXIgNTIwIEJ5dGUgc2VjdG9yICovCisjZGVmaW5lIENTT1JfTkFORF9FQ0NfTU9ERV80CQkweDAwMDAwMDAwCisvKiA4IGJpdCBjb3JyZWN0aW9uIHBlciA1MjggQnl0ZSBzZWN0b3IgKi8KKyNkZWZpbmUgQ1NPUl9OQU5EX0VDQ19NT0RFXzgJCTB4MTAwMDAwMDAKKy8qIEVuYWJsZSBFQ0MgRGVjb2RlciAqLworI2RlZmluZSBDU09SX05BTkRfRUNDX0RFQ19FTgkJMHgwNDAwMDAwMAorLyogUm93IEFkZHJlc3MgTGVuZ3RoICovCisjZGVmaW5lIENTT1JfTkFORF9SQUxfTUFTSwkJMHgwMTgwMDAwMAorI2RlZmluZSBDU09SX05BTkRfUkFMX1NISUZUCQkyMAorI2RlZmluZSBDU09SX05BTkRfUkFMXzEJCQkweDAwMDAwMDAwCisjZGVmaW5lIENTT1JfTkFORF9SQUxfMgkJCTB4MDA4MDAwMDAKKyNkZWZpbmUgQ1NPUl9OQU5EX1JBTF8zCQkJMHgwMTAwMDAwMAorI2RlZmluZSBDU09SX05BTkRfUkFMXzQJCQkweDAxODAwMDAwCisvKiBQYWdlIFNpemUgNTEyYiwgMmssIDRrICovCisjZGVmaW5lIENTT1JfTkFORF9QR1NfTUFTSwkJMHgwMDE4MDAwMAorI2RlZmluZSBDU09SX05BTkRfUEdTX1NISUZUCQkxNgorI2RlZmluZSBDU09SX05BTkRfUEdTXzUxMgkJMHgwMDAwMDAwMAorI2RlZmluZSBDU09SX05BTkRfUEdTXzJLCQkweDAwMDgwMDAwCisjZGVmaW5lIENTT1JfTkFORF9QR1NfNEsJCTB4MDAxMDAwMDAKKy8qIFNwYXJlIHJlZ2lvbiBTaXplICovCisjZGVmaW5lIENTT1JfTkFORF9TUFJaX01BU0sJCTB4MDAwMEUwMDAKKyNkZWZpbmUgQ1NPUl9OQU5EX1NQUlpfU0hJRlQJCTEzCisjZGVmaW5lIENTT1JfTkFORF9TUFJaXzE2CQkweDAwMDAwMDAwCisjZGVmaW5lIENTT1JfTkFORF9TUFJaXzY0CQkweDAwMDAyMDAwCisjZGVmaW5lIENTT1JfTkFORF9TUFJaXzEyOAkJMHgwMDAwNDAwMAorI2RlZmluZSBDU09SX05BTkRfU1BSWl8yMTAJCTB4MDAwMDYwMDAKKyNkZWZpbmUgQ1NPUl9OQU5EX1NQUlpfMjE4CQkweDAwMDA4MDAwCisjZGVmaW5lIENTT1JfTkFORF9TUFJaXzIyNAkJMHgwMDAwQTAwMAorLyogUGFnZXMgUGVyIEJsb2NrICovCisjZGVmaW5lIENTT1JfTkFORF9QQl9NQVNLCQkweDAwMDAwNzAwCisjZGVmaW5lIENTT1JfTkFORF9QQl9TSElGVAkJOAorI2RlZmluZSBDU09SX05BTkRfUEIobikJCSgoX19pbG9nMihuKSAtIDUpIDw8IENTT1JfTkFORF9QQl9TSElGVCkKKy8qIFRpbWUgZm9yIFJlYWQgRW5hYmxlIEhpZ2ggdG8gT3V0cHV0IEhpZ2ggSW1wZWRhbmNlICovCisjZGVmaW5lIENTT1JfTkFORF9UUkhaX01BU0sJCTB4MDAwMDAwMUMKKyNkZWZpbmUgQ1NPUl9OQU5EX1RSSFpfU0hJRlQJCTIKKyNkZWZpbmUgQ1NPUl9OQU5EX1RSSFpfMjAJCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ1NPUl9OQU5EX1RSSFpfNDAJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ1NPUl9OQU5EX1RSSFpfNjAJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQ1NPUl9OQU5EX1RSSFpfODAJCTB4MDAwMDAwMEMKKyNkZWZpbmUgQ1NPUl9OQU5EX1RSSFpfMTAwCQkweDAwMDAwMDEwCisvKiBCdWZmZXIgY29udHJvbCBkaXNhYmxlICovCisjZGVmaW5lIENTT1JfTkFORF9CQ1RMRAkJCTB4MDAwMDAwMDEKKworLyoKKyAqIENoaXAgU2VsZWN0IE9wdGlvbiBSZWdpc3RlciAtIE5PUiBGbGFzaCBNb2RlCisgKi8KKy8qIEVuYWJsZSBBZGRyZXNzIHNoaWZ0IE1vZGUgKi8KKyNkZWZpbmUgQ1NPUl9OT1JfQURNX1NIRlRfTU9ERV9FTgkweDgwMDAwMDAwCisvKiBQYWdlIFJlYWQgRW5hYmxlIGZyb20gTk9SIGRldmljZSAqLworI2RlZmluZSBDU09SX05PUl9QR1JEX0VOCQkweDEwMDAwMDAwCisvKiBBVkQgVG9nZ2xlIEVuYWJsZSBkdXJpbmcgQnVyc3QgUHJvZ3JhbSAqLworI2RlZmluZSBDU09SX05PUl9BVkRfVEdMX1BHTV9FTgkJMHgwMTAwMDAwMAorLyogQWRkcmVzcyBEYXRhIE11bHRpcGxleGluZyBTaGlmdCAqLworI2RlZmluZSBDU09SX05PUl9BRE1fTUFTSwkJMHgwMDAzRTAwMAorI2RlZmluZSBDU09SX05PUl9BRE1fU0hJRlRfU0hJRlQJMTMKKyNkZWZpbmUgQ1NPUl9OT1JfQURNX1NISUZUKG4pCSgobikgPDwgQ1NPUl9OT1JfQURNX1NISUZUX1NISUZUKQorLyogVHlwZSBvZiB0aGUgTk9SIGRldmljZSBob29rZWQgKi8KKyNkZWZpbmUgQ1NPUl9OT1JfTk9SX01PREVfQVlTTkNfTk9SCTB4MDAwMDAwMDAKKyNkZWZpbmUgQ1NPUl9OT1JfTk9SX01PREVfQVZEX05PUgkweDAwMDAwMDIwCisvKiBUaW1lIGZvciBSZWFkIEVuYWJsZSBIaWdoIHRvIE91dHB1dCBIaWdoIEltcGVkYW5jZSAqLworI2RlZmluZSBDU09SX05PUl9UUkhaX01BU0sJCTB4MDAwMDAwMUMKKyNkZWZpbmUgQ1NPUl9OT1JfVFJIWl9TSElGVAkJMgorI2RlZmluZSBDU09SX05PUl9UUkhaXzIwCQkweDAwMDAwMDAwCisjZGVmaW5lIENTT1JfTk9SX1RSSFpfNDAJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQ1NPUl9OT1JfVFJIWl82MAkJMHgwMDAwMDAwOAorI2RlZmluZSBDU09SX05PUl9UUkhaXzgwCQkweDAwMDAwMDBDCisjZGVmaW5lIENTT1JfTk9SX1RSSFpfMTAwCQkweDAwMDAwMDEwCisvKiBCdWZmZXIgY29udHJvbCBkaXNhYmxlICovCisjZGVmaW5lIENTT1JfTk9SX0JDVExECQkJMHgwMDAwMDAwMQorCisvKgorICogQ2hpcCBTZWxlY3QgT3B0aW9uIFJlZ2lzdGVyIC0gR1BDTSBNb2RlCisgKi8KKy8qIEdQQ00gTW9kZSAtIE5vcm1hbCAqLworI2RlZmluZSBDU09SX0dQQ01fR1BNT0RFX05PUk1BTAkJMHgwMDAwMDAwMAorLyogR1BDTSBNb2RlIC0gR2VuZXJpY0FTSUMgKi8KKyNkZWZpbmUgQ1NPUl9HUENNX0dQTU9ERV9BU0lDCQkweDgwMDAwMDAwCisvKiBQYXJpdHkgTW9kZSBvZGQvZXZlbiAqLworI2RlZmluZSBDU09SX0dQQ01fUEFSSVRZX0VWRU4JCTB4NDAwMDAwMDAKKy8qIFBhcml0eSBDaGVja2luZyBlbmFibGUvZGlzYWJsZSAqLworI2RlZmluZSBDU09SX0dQQ01fUEFSX0VOCQkweDIwMDAwMDAwCisvKiBHUENNIFRpbWVvdXQgQ291bnQgKi8KKyNkZWZpbmUgQ1NPUl9HUENNX0dQVE9fTUFTSwkJMHgwRjAwMDAwMAorI2RlZmluZSBDU09SX0dQQ01fR1BUT19TSElGVAkJMjQKKyNkZWZpbmUgQ1NPUl9HUENNX0dQVE8obikJKChfX2lsb2cyKG4pIC0gOCkgPDwgQ1NPUl9HUENNX0dQVE9fU0hJRlQpCisvKiBHUENNIEV4dGVybmFsIEFjY2VzcyBUZXJtaW5hdGlvbiBtb2RlIGZvciByZWFkIGFjY2VzcyAqLworI2RlZmluZSBDU09SX0dQQ01fUkdFVEFfRVhUCQkweDAwMDgwMDAwCisvKiBHUENNIEV4dGVybmFsIEFjY2VzcyBUZXJtaW5hdGlvbiBtb2RlIGZvciB3cml0ZSBhY2Nlc3MgKi8KKyNkZWZpbmUgQ1NPUl9HUENNX1dHRVRBX0VYVAkJMHgwMDA0MDAwMAorLyogQWRkcmVzcyBEYXRhIE11bHRpcGxleGluZyBTaGlmdCAqLworI2RlZmluZSBDU09SX0dQQ01fQURNX01BU0sJCTB4MDAwM0UwMDAKKyNkZWZpbmUgQ1NPUl9HUENNX0FETV9TSElGVF9TSElGVAkxMworI2RlZmluZSBDU09SX0dQQ01fQURNX1NISUZUKG4pCSgobikgPDwgQ1NPUl9HUENNX0FETV9TSElGVF9TSElGVCkKKy8qIEdlbmVyaWMgQVNJQyBQYXJpdHkgZXJyb3IgaW5kaWNhdGlvbiBkZWxheSAqLworI2RlZmluZSBDU09SX0dQQ01fR0FQRVJSRF9NQVNLCQkweDAwMDAwMTgwCisjZGVmaW5lIENTT1JfR1BDTV9HQVBFUlJEX1NISUZUCQk3CisjZGVmaW5lIENTT1JfR1BDTV9HQVBFUlJEKG4pCSgoKG4pIC0gMSkgPDwgQ1NPUl9HUENNX0dBUEVSUkRfU0hJRlQpCisvKiBUaW1lIGZvciBSZWFkIEVuYWJsZSBIaWdoIHRvIE91dHB1dCBIaWdoIEltcGVkYW5jZSAqLworI2RlZmluZSBDU09SX0dQQ01fVFJIWl9NQVNLCQkweDAwMDAwMDFDCisjZGVmaW5lIENTT1JfR1BDTV9UUkhaXzIwCQkweDAwMDAwMDAwCisjZGVmaW5lIENTT1JfR1BDTV9UUkhaXzQwCQkweDAwMDAwMDA0CisjZGVmaW5lIENTT1JfR1BDTV9UUkhaXzYwCQkweDAwMDAwMDA4CisjZGVmaW5lIENTT1JfR1BDTV9UUkhaXzgwCQkweDAwMDAwMDBDCisjZGVmaW5lIENTT1JfR1BDTV9UUkhaXzEwMAkJMHgwMDAwMDAxMAorLyogQnVmZmVyIGNvbnRyb2wgZGlzYWJsZSAqLworI2RlZmluZSBDU09SX0dQQ01fQkNUTEQJCQkweDAwMDAwMDAxCisKKy8qCisgKiBSZWFkeSBCdXN5IFN0YXR1cyBSZWdpc3RlciAoUkJfU1RBVCkKKyAqLworLyogQ1NuIGlzIFJFQURZICovCisjZGVmaW5lIElGQ19SQl9TVEFUX1JFQURZX0NTMAkJMHg4MDAwMDAwMAorI2RlZmluZSBJRkNfUkJfU1RBVF9SRUFEWV9DUzEJCTB4NDAwMDAwMDAKKyNkZWZpbmUgSUZDX1JCX1NUQVRfUkVBRFlfQ1MyCQkweDIwMDAwMDAwCisjZGVmaW5lIElGQ19SQl9TVEFUX1JFQURZX0NTMwkJMHgxMDAwMDAwMAorCisvKgorICogR2VuZXJhbCBDb250cm9sIFJlZ2lzdGVyIChHQ1IpCisgKi8KKyNkZWZpbmUgSUZDX0dDUl9NQVNLCQkJMHg4MDAwRjgwMAorLyogcmVzZXQgYWxsIElGQyBoYXJkd2FyZSAqLworI2RlZmluZSBJRkNfR0NSX1NPRlRfUlNUX0FMTAkJMHg4MDAwMDAwMAorLyogVHVybmFyb3VkIFRpbWUgb2YgZXh0ZXJuYWwgYnVmZmVyICovCisjZGVmaW5lIElGQ19HQ1JfVEJDVExfVFJOX1RJTUUJCTB4MDAwMEY4MDAKKyNkZWZpbmUgSUZDX0dDUl9UQkNUTF9UUk5fVElNRV9TSElGVAkxMQorCisvKgorICogQ29tbW9uIEV2ZW50IGFuZCBFcnJvciBTdGF0dXMgUmVnaXN0ZXIgKENNX0VWVEVSX1NUQVQpCisgKi8KKy8qIENoaXAgc2VsZWN0IGVycm9yICovCisjZGVmaW5lIElGQ19DTV9FVlRFUl9TVEFUX0NTRVIJCTB4ODAwMDAwMDAKKworLyoKKyAqIENvbW1vbiBFdmVudCBhbmQgRXJyb3IgRW5hYmxlIFJlZ2lzdGVyIChDTV9FVlRFUl9FTikKKyAqLworLyogQ2hpcCBzZWxlY3QgZXJyb3IgY2hlY2tpbmcgZW5hYmxlICovCisjZGVmaW5lIElGQ19DTV9FVlRFUl9FTl9DU0VSRU4JCTB4ODAwMDAwMDAKKworLyoKKyAqIENvbW1vbiBFdmVudCBhbmQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoQ01fRVZURVJfSU5UUl9FTikKKyAqLworLyogQ2hpcCBzZWxlY3QgZXJyb3IgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBJRkNfQ01fRVZURVJfSU5UUl9FTl9DU0VSSVJFTgkweDgwMDAwMDAwCisKKy8qCisgKiBDb21tb24gVHJhbnNmZXIgRXJyb3IgQXR0cmlidXRlIFJlZ2lzdGVyLTAgKENNX0VSQVRUUjApCisgKi8KKy8qIHRyYW5zYWN0aW9uIHR5cGUgb2YgZXJyb3IgUmVhZC9Xcml0ZSAqLworI2RlZmluZSBJRkNfQ01fRVJBVFRSMF9FUlRZUF9SRUFECTB4ODAwMDAwMDAKKyNkZWZpbmUgSUZDX0NNX0VSQVRUUjBfRVJBSUQJCTB4MEZGMDAwMDAKKyNkZWZpbmUgSUZDX0NNX0VSQVRUUjBfRVJBSURfU0hJRlQJMjAKKyNkZWZpbmUgSUZDX0NNX0VSQVRUUjBfRVNSQ0lECQkweDAwMDBGRjAwCisjZGVmaW5lIElGQ19DTV9FUkFUVFIwX0VTUkNJRF9TSElGVAk4CisKKy8qCisgKiBDbG9jayBDb250cm9sIFJlZ2lzdGVyIChDQ1IpCisgKi8KKyNkZWZpbmUgSUZDX0NDUl9NQVNLCQkJMHgwRjBGODgwMAorLyogQ2xvY2sgZGl2aXNpb24gcmF0aW8gKi8KKyNkZWZpbmUgSUZDX0NDUl9DTEtfRElWX01BU0sJCTB4MEYwMDAwMDAKKyNkZWZpbmUgSUZDX0NDUl9DTEtfRElWX1NISUZUCQkyNAorI2RlZmluZSBJRkNfQ0NSX0NMS19ESVYobikJCSgobi0xKSA8PCBJRkNfQ0NSX0NMS19ESVZfU0hJRlQpCisvKiBJRkMgQ2xvY2sgRGVsYXkgKi8KKyNkZWZpbmUgSUZDX0NDUl9DTEtfRExZX01BU0sJCTB4MDAwRjAwMDAKKyNkZWZpbmUgSUZDX0NDUl9DTEtfRExZX1NISUZUCQkxNgorI2RlZmluZSBJRkNfQ0NSX0NMS19ETFkobikJCSgobikgPDwgSUZDX0NDUl9DTEtfRExZX1NISUZUKQorLyogSW52ZXJ0IElGQyBjbG9jayBiZWZvcmUgc2VuZGluZyBvdXQgKi8KKyNkZWZpbmUgSUZDX0NDUl9JTlZfQ0xLX0VOCQkweDAwMDA4MDAwCisvKiBGZWRiYWNrIElGQyBDbG9jayAqLworI2RlZmluZSBJRkNfQ0NSX0ZCX0lGQ19DTEtfU0VMCQkweDAwMDAwODAwCisKKy8qCisgKiBDbG9jayBTdGF0dXMgUmVnaXN0ZXIgKENTUikKKyAqLworLyogQ2xrIGlzIHN0YWJsZSAqLworI2RlZmluZSBJRkNfQ1NSX0NMS19TVEFUX1NUQUJMRQkJMHg4MDAwMDAwMAorCisvKgorICogSUZDX05BTkQgTWFjaGluZSBTcGVjaWZpYyBSZWdpc3RlcnMKKyAqLworLyoKKyAqIE5BTkQgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoTkNGR1IpCisgKi8KKy8qIEF1dG8gQm9vdCBNb2RlICovCisjZGVmaW5lIElGQ19OQU5EX05DRkdSX0JPT1QJCTB4ODAwMDAwMDAKKy8qIEFkZHJlc3NpbmcgTW9kZS1ST1cwK24vQ09MMCAqLworI2RlZmluZSBJRkNfTkFORF9OQ0ZHUl9BRERSX01PREVfUkMwCTB4MDAwMDAwMDAKKy8qIEFkZHJlc3NpbmcgTW9kZS1ST1cwK24vQ09MMCtuICovCisjZGVmaW5lIElGQ19OQU5EX05DRkdSX0FERFJfTU9ERV9SQzEJMHgwMDQwMDAwMAorLyogTnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucyBvZiBGSVIgc2VxdWVuY2VzIGZvciBtdWx0aSBwYWdlIG9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgSUZDX05BTkRfTkNGR1JfTlVNX0xPT1BfTUFTSwkweDAwMDBGMDAwCisjZGVmaW5lIElGQ19OQU5EX05DRkdSX05VTV9MT09QX1NISUZUCTEyCisjZGVmaW5lIElGQ19OQU5EX05DRkdSX05VTV9MT09QKG4pCSgobikgPDwgSUZDX05BTkRfTkNGR1JfTlVNX0xPT1BfU0hJRlQpCisvKiBOdW1iZXIgb2Ygd2FpdCBjeWNsZXMgKi8KKyNkZWZpbmUgSUZDX05BTkRfTkNGR1JfTlVNX1dBSVRfTUFTSwkweDAwMDAwMEZGCisjZGVmaW5lIElGQ19OQU5EX05DRkdSX05VTV9XQUlUX1NISUZUCTAKKworLyoKKyAqIE5BTkQgRmxhc2ggQ29tbWFuZCBSZWdpc3RlcnMgKE5BTkRfRkNSMC9OQU5EX0ZDUjEpCisgKi8KKy8qIEdlbmVyYWwgcHVycG9zZSBGQ00gZmxhc2ggY29tbWFuZCBieXRlcyBDTUQwLUNNRDcgKi8KKyNkZWZpbmUgSUZDX05BTkRfRkNSMF9DTUQwCQkweEZGMDAwMDAwCisjZGVmaW5lIElGQ19OQU5EX0ZDUjBfQ01EMF9TSElGVAkyNAorI2RlZmluZSBJRkNfTkFORF9GQ1IwX0NNRDEJCTB4MDBGRjAwMDAKKyNkZWZpbmUgSUZDX05BTkRfRkNSMF9DTUQxX1NISUZUCTE2CisjZGVmaW5lIElGQ19OQU5EX0ZDUjBfQ01EMgkJMHgwMDAwRkYwMAorI2RlZmluZSBJRkNfTkFORF9GQ1IwX0NNRDJfU0hJRlQJOAorI2RlZmluZSBJRkNfTkFORF9GQ1IwX0NNRDMJCTB4MDAwMDAwRkYKKyNkZWZpbmUgSUZDX05BTkRfRkNSMF9DTUQzX1NISUZUCTAKKyNkZWZpbmUgSUZDX05BTkRfRkNSMV9DTUQ0CQkweEZGMDAwMDAwCisjZGVmaW5lIElGQ19OQU5EX0ZDUjFfQ01ENF9TSElGVAkyNAorI2RlZmluZSBJRkNfTkFORF9GQ1IxX0NNRDUJCTB4MDBGRjAwMDAKKyNkZWZpbmUgSUZDX05BTkRfRkNSMV9DTUQ1X1NISUZUCTE2CisjZGVmaW5lIElGQ19OQU5EX0ZDUjFfQ01ENgkJMHgwMDAwRkYwMAorI2RlZmluZSBJRkNfTkFORF9GQ1IxX0NNRDZfU0hJRlQJOAorI2RlZmluZSBJRkNfTkFORF9GQ1IxX0NNRDcJCTB4MDAwMDAwRkYKKyNkZWZpbmUgSUZDX05BTkRfRkNSMV9DTUQ3X1NISUZUCTAKKworLyoKKyAqIEZsYXNoIFJPVyBhbmQgQ09MIEFkZHJlc3MgUmVnaXN0ZXIgKFJPV24sIENPTG4pCisgKi8KKy8qIE1haW4vc3BhcmUgcmVnaW9uIGxvY2F0b3IgKi8KKyNkZWZpbmUgSUZDX05BTkRfQ09MX01TCQkJMHg4MDAwMDAwMAorLyogQ29sdW1uIEFkZHJlc3MgKi8KKyNkZWZpbmUgSUZDX05BTkRfQ09MX0NBX01BU0sJCTB4MDAwMDBGRkYKKworLyoKKyAqIE5BTkQgRmxhc2ggQnl0ZSBDb3VudCBSZWdpc3RlciAoTkFORF9CQykKKyAqLworLyogQnl0ZSBDb3VudCBmb3IgcmVhZC9Xcml0ZSAqLworI2RlZmluZSBJRkNfTkFORF9CQwkJCTB4MDAwMDAxRkYKKworLyoKKyAqIE5BTkQgRmxhc2ggSW5zdHJ1Y3Rpb24gUmVnaXN0ZXJzIChOQU5EX0ZJUjAvTkFORF9GSVIxL05BTkRfRklSMikKKyAqLworLyogTkFORCBNYWNoaW5lIHNwZWNpZmljIG9wY29kZXMgT1AwLU9QMTQqLworI2RlZmluZSBJRkNfTkFORF9GSVIwX09QMAkJMHhGQzAwMDAwMAorI2RlZmluZSBJRkNfTkFORF9GSVIwX09QMF9TSElGVAkJMjYKKyNkZWZpbmUgSUZDX05BTkRfRklSMF9PUDEJCTB4MDNGMDAwMDAKKyNkZWZpbmUgSUZDX05BTkRfRklSMF9PUDFfU0hJRlQJCTIwCisjZGVmaW5lIElGQ19OQU5EX0ZJUjBfT1AyCQkweDAwMEZDMDAwCisjZGVmaW5lIElGQ19OQU5EX0ZJUjBfT1AyX1NISUZUCQkxNAorI2RlZmluZSBJRkNfTkFORF9GSVIwX09QMwkJMHgwMDAwM0YwMAorI2RlZmluZSBJRkNfTkFORF9GSVIwX09QM19TSElGVAkJOAorI2RlZmluZSBJRkNfTkFORF9GSVIwX09QNAkJMHgwMDAwMDBGQworI2RlZmluZSBJRkNfTkFORF9GSVIwX09QNF9TSElGVAkJMgorI2RlZmluZSBJRkNfTkFORF9GSVIxX09QNQkJMHhGQzAwMDAwMAorI2RlZmluZSBJRkNfTkFORF9GSVIxX09QNV9TSElGVAkJMjYKKyNkZWZpbmUgSUZDX05BTkRfRklSMV9PUDYJCTB4MDNGMDAwMDAKKyNkZWZpbmUgSUZDX05BTkRfRklSMV9PUDZfU0hJRlQJCTIwCisjZGVmaW5lIElGQ19OQU5EX0ZJUjFfT1A3CQkweDAwMEZDMDAwCisjZGVmaW5lIElGQ19OQU5EX0ZJUjFfT1A3X1NISUZUCQkxNAorI2RlZmluZSBJRkNfTkFORF9GSVIxX09QOAkJMHgwMDAwM0YwMAorI2RlZmluZSBJRkNfTkFORF9GSVIxX09QOF9TSElGVAkJOAorI2RlZmluZSBJRkNfTkFORF9GSVIxX09QOQkJMHgwMDAwMDBGQworI2RlZmluZSBJRkNfTkFORF9GSVIxX09QOV9TSElGVAkJMgorI2RlZmluZSBJRkNfTkFORF9GSVIyX09QMTAJCTB4RkMwMDAwMDAKKyNkZWZpbmUgSUZDX05BTkRfRklSMl9PUDEwX1NISUZUCTI2CisjZGVmaW5lIElGQ19OQU5EX0ZJUjJfT1AxMQkJMHgwM0YwMDAwMAorI2RlZmluZSBJRkNfTkFORF9GSVIyX09QMTFfU0hJRlQJMjAKKyNkZWZpbmUgSUZDX05BTkRfRklSMl9PUDEyCQkweDAwMEZDMDAwCisjZGVmaW5lIElGQ19OQU5EX0ZJUjJfT1AxMl9TSElGVAkxNAorI2RlZmluZSBJRkNfTkFORF9GSVIyX09QMTMJCTB4MDAwMDNGMDAKKyNkZWZpbmUgSUZDX05BTkRfRklSMl9PUDEzX1NISUZUCTgKKyNkZWZpbmUgSUZDX05BTkRfRklSMl9PUDE0CQkweDAwMDAwMEZDCisjZGVmaW5lIElGQ19OQU5EX0ZJUjJfT1AxNF9TSElGVAkyCisKKy8qCisgKiBJbnN0cnVjdGlvbiBvcGNvZGVzIHRvIGJlIHByb2dyYW1tZWQKKyAqIGluIEZJUiByZWdpc3RlcnMtIDZiaXRzCisgKi8KK2VudW0gaWZjX25hbmRfZmlyX29wY29kZXMgeworCUlGQ19GSVJfT1BfTk9QLAorCUlGQ19GSVJfT1BfQ0EwLAorCUlGQ19GSVJfT1BfQ0ExLAorCUlGQ19GSVJfT1BfQ0EyLAorCUlGQ19GSVJfT1BfQ0EzLAorCUlGQ19GSVJfT1BfUkEwLAorCUlGQ19GSVJfT1BfUkExLAorCUlGQ19GSVJfT1BfUkEyLAorCUlGQ19GSVJfT1BfUkEzLAorCUlGQ19GSVJfT1BfQ01EMCwKKwlJRkNfRklSX09QX0NNRDEsCisJSUZDX0ZJUl9PUF9DTUQyLAorCUlGQ19GSVJfT1BfQ01EMywKKwlJRkNfRklSX09QX0NNRDQsCisJSUZDX0ZJUl9PUF9DTUQ1LAorCUlGQ19GSVJfT1BfQ01ENiwKKwlJRkNfRklSX09QX0NNRDcsCisJSUZDX0ZJUl9PUF9DVzAsCisJSUZDX0ZJUl9PUF9DVzEsCisJSUZDX0ZJUl9PUF9DVzIsCisJSUZDX0ZJUl9PUF9DVzMsCisJSUZDX0ZJUl9PUF9DVzQsCisJSUZDX0ZJUl9PUF9DVzUsCisJSUZDX0ZJUl9PUF9DVzYsCisJSUZDX0ZJUl9PUF9DVzcsCisJSUZDX0ZJUl9PUF9XQkNELAorCUlGQ19GSVJfT1BfUkJDRCwKKwlJRkNfRklSX09QX0JUUkQsCisJSUZDX0ZJUl9PUF9SRFNUQVQsCisJSUZDX0ZJUl9PUF9OV0FJVCwKKwlJRkNfRklSX09QX1dGUiwKKwlJRkNfRklSX09QX1NCUkQsCisJSUZDX0ZJUl9PUF9VQSwKKwlJRkNfRklSX09QX1JCLAorfTsKKworLyoKKyAqIE5BTkQgQ2hpcCBTZWxlY3QgUmVnaXN0ZXIgKE5BTkRfQ1NFTCkKKyAqLworI2RlZmluZSBJRkNfTkFORF9DU0VMCQkJMHgwQzAwMDAwMAorI2RlZmluZSBJRkNfTkFORF9DU0VMX1NISUZUCQkyNgorI2RlZmluZSBJRkNfTkFORF9DU0VMX0NTMAkJMHgwMDAwMDAwMAorI2RlZmluZSBJRkNfTkFORF9DU0VMX0NTMQkJMHgwNDAwMDAwMAorI2RlZmluZSBJRkNfTkFORF9DU0VMX0NTMgkJMHgwODAwMDAwMAorI2RlZmluZSBJRkNfTkFORF9DU0VMX0NTMwkJMHgwQzAwMDAwMAorCisvKgorICogTkFORCBPcGVyYXRpb24gU2VxdWVuY2UgU3RhcnQgKE5BTkRTRVFfU1RSVCkKKyAqLworLyogTkFORCBGbGFzaCBPcGVyYXRpb24gU3RhcnQgKi8KKyNkZWZpbmUgSUZDX05BTkRfU0VRX1NUUlRfRklSX1NUUlQJMHg4MDAwMDAwMAorLyogQXV0b21hdGljIEVyYXNlICovCisjZGVmaW5lIElGQ19OQU5EX1NFUV9TVFJUX0FVVE9fRVJTCTB4MDA4MDAwMDAKKy8qIEF1dG9tYXRpYyBQcm9ncmFtICovCisjZGVmaW5lIElGQ19OQU5EX1NFUV9TVFJUX0FVVE9fUEdNCTB4MDAxMDAwMDAKKy8qIEF1dG9tYXRpYyBDb3B5YmFjayAqLworI2RlZmluZSBJRkNfTkFORF9TRVFfU1RSVF9BVVRPX0NQQgkweDAwMDIwMDAwCisvKiBBdXRvbWF0aWMgUmVhZCBPcGVyYXRpb24gKi8KKyNkZWZpbmUgSUZDX05BTkRfU0VRX1NUUlRfQVVUT19SRAkweDAwMDA0MDAwCisvKiBBdXRvbWF0aWMgU3RhdHVzIFJlYWQgKi8KKyNkZWZpbmUgSUZDX05BTkRfU0VRX1NUUlRfQVVUT19TVEFUX1JECTB4MDAwMDA4MDAKKworLyoKKyAqIE5BTkQgRXZlbnQgYW5kIEVycm9yIFN0YXR1cyBSZWdpc3RlciAoTkFORF9FVlRFUl9TVEFUKQorICovCisvKiBPcGVyYXRpb24gQ29tcGxldGUgKi8KKyNkZWZpbmUgSUZDX05BTkRfRVZURVJfU1RBVF9PUEMJCTB4ODAwMDAwMDAKKy8qIEZsYXNoIFRpbWVvdXQgRXJyb3IgKi8KKyNkZWZpbmUgSUZDX05BTkRfRVZURVJfU1RBVF9GVE9FUgkweDA4MDAwMDAwCisvKiBXcml0ZSBQcm90ZWN0IEVycm9yICovCisjZGVmaW5lIElGQ19OQU5EX0VWVEVSX1NUQVRfV1BFUgkweDA0MDAwMDAwCisvKiBFQ0MgRXJyb3IgKi8KKyNkZWZpbmUgSUZDX05BTkRfRVZURVJfU1RBVF9FQ0NFUgkweDAyMDAwMDAwCisvKiBSQ1cgTG9hZCBEb25lICovCisjZGVmaW5lIElGQ19OQU5EX0VWVEVSX1NUQVRfUkNXX0ROCTB4MDAwMDgwMDAKKy8qIEJvb3QgTG9hZHIgRG9uZSAqLworI2RlZmluZSBJRkNfTkFORF9FVlRFUl9TVEFUX0JPT1RfRE4JMHgwMDAwNDAwMAorLyogQmFkIEJsb2NrIEluZGljYXRvciBzZWFyY2ggc2VsZWN0ICovCisjZGVmaW5lIElGQ19OQU5EX0VWVEVSX1NUQVRfQkJJX1NSQ0hfU0UJMHgwMDAwMDgwMAorCisvKgorICogTkFORCBGbGFzaCBQYWdlIFJlYWQgQ29tcGxldGlvbiBFdmVudCBTdGF0dXMgUmVnaXN0ZXIKKyAqIChQR1JEQ01QTF9FVlRfU1RBVCkKKyAqLworI2RlZmluZSBQR1JEQ01QTF9FVlRfU1RBVF9NQVNLCQkweEZGRkYwMDAwCisvKiBTbWFsbCBQYWdlIDAtMTUgRG9uZSAqLworI2RlZmluZSBQR1JEQ01QTF9FVlRfU1RBVF9TRUNUSU9OX1NQKG4pCSgxIDw8ICgzMSAtIChuKSkpCisvKiBMYXJnZSBQYWdlKDJLKSAwLTMgRG9uZSAqLworI2RlZmluZSBQR1JEQ01QTF9FVlRfU1RBVF9MUF8ySyhuKQkoMHhGIDw8ICgyOCAtIChuKSo0KSkKKy8qIExhcmdlIFBhZ2UoNEspIDAtMSBEb25lICovCisjZGVmaW5lIFBHUkRDTVBMX0VWVF9TVEFUX0xQXzRLKG4pCSgweEZGIDw8ICgyNCAtIChuKSo4KSkKKworLyoKKyAqIE5BTkQgRXZlbnQgYW5kIEVycm9yIEVuYWJsZSBSZWdpc3RlciAoTkFORF9FVlRFUl9FTikKKyAqLworLyogT3BlcmF0aW9uIGNvbXBsZXRlIGV2ZW50IGVuYWJsZSAqLworI2RlZmluZSBJRkNfTkFORF9FVlRFUl9FTl9PUENfRU4JMHg4MDAwMDAwMAorLyogUGFnZSByZWFkIGNvbXBsZXRlIGV2ZW50IGVuYWJsZSAqLworI2RlZmluZSBJRkNfTkFORF9FVlRFUl9FTl9QR1JEQ01QTF9FTgkweDIwMDAwMDAwCisvKiBGbGFzaCBUaW1lb3V0IGVycm9yIGVuYWJsZSAqLworI2RlZmluZSBJRkNfTkFORF9FVlRFUl9FTl9GVE9FUl9FTgkweDA4MDAwMDAwCisvKiBXcml0ZSBQcm90ZWN0IGVycm9yIGVuYWJsZSAqLworI2RlZmluZSBJRkNfTkFORF9FVlRFUl9FTl9XUEVSX0VOCTB4MDQwMDAwMDAKKy8qIEVDQyBlcnJvciBsb2dnaW5nIGVuYWJsZSAqLworI2RlZmluZSBJRkNfTkFORF9FVlRFUl9FTl9FQ0NFUl9FTgkweDAyMDAwMDAwCisKKy8qCisgKiBOQU5EIEV2ZW50IGFuZCBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyIChOQU5EX0VWVEVSX0lOVFJfRU4pCisgKi8KKy8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIG9wZXJhdGlvbiBjb21wbGV0ZSAqLworI2RlZmluZSBJRkNfTkFORF9FVlRFUl9JTlRSX09QQ0lSX0VOCQkweDgwMDAwMDAwCisvKiBFbmFibGUgaW50ZXJydXB0IGZvciBQYWdlIHJlYWQgY29tcGxldGUgKi8KKyNkZWZpbmUgSUZDX05BTkRfRVZURVJfSU5UUl9QR1JEQ01QTElSX0VOCTB4MjAwMDAwMDAKKy8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIEZsYXNoIHRpbWVvdXQgZXJyb3IgKi8KKyNkZWZpbmUgSUZDX05BTkRfRVZURVJfSU5UUl9GVE9FUklSX0VOCQkweDA4MDAwMDAwCisvKiBFbmFibGUgaW50ZXJydXB0IGZvciBXcml0ZSBwcm90ZWN0IGVycm9yICovCisjZGVmaW5lIElGQ19OQU5EX0VWVEVSX0lOVFJfV1BFUklSX0VOCQkweDA0MDAwMDAwCisvKiBFbmFibGUgaW50ZXJydXB0IGZvciBFQ0MgZXJyb3IqLworI2RlZmluZSBJRkNfTkFORF9FVlRFUl9JTlRSX0VDQ0VSSVJfRU4JCTB4MDIwMDAwMDAKKworLyoKKyAqIE5BTkQgVHJhbnNmZXIgRXJyb3IgQXR0cmlidXRlIFJlZ2lzdGVyLTAgKE5BTkRfRVJBVFRSMCkKKyAqLworI2RlZmluZSBJRkNfTkFORF9FUkFUVFIwX01BU0sJCTB4MEMwODAwMDAKKy8qIEVycm9yIG9uIENTMC0zIGZvciBOQU5EICovCisjZGVmaW5lIElGQ19OQU5EX0VSQVRUUjBfRVJDU19DUzAJMHgwMDAwMDAwMAorI2RlZmluZSBJRkNfTkFORF9FUkFUVFIwX0VSQ1NfQ1MxCTB4MDQwMDAwMDAKKyNkZWZpbmUgSUZDX05BTkRfRVJBVFRSMF9FUkNTX0NTMgkweDA4MDAwMDAwCisjZGVmaW5lIElGQ19OQU5EX0VSQVRUUjBfRVJDU19DUzMJMHgwQzAwMDAwMAorLyogVHJhbnNhY3Rpb24gdHlwZSBvZiBlcnJvciBSZWFkL1dyaXRlICovCisjZGVmaW5lIElGQ19OQU5EX0VSQVRUUjBfRVJUVFlQRV9SRUFECTB4MDAwODAwMDAKKworLyoKKyAqIE5BTkQgRmxhc2ggU3RhdHVzIFJlZ2lzdGVyIChOQU5EX0ZTUikKKyAqLworLyogRmlyc3QgYnl0ZSBvZiBkYXRhIHJlYWQgZnJvbSByZWFkIHN0YXR1cyBvcCAqLworI2RlZmluZSBJRkNfTkFORF9ORlNSX1JTMAkJMHhGRjAwMDAwMAorLyogU2Vjb25kIGJ5dGUgb2YgZGF0YSByZWFkIGZyb20gcmVhZCBzdGF0dXMgb3AgKi8KKyNkZWZpbmUgSUZDX05BTkRfTkZTUl9SUzEJCTB4MDBGRjAwMDAKKworLyoKKyAqIEVDQyBFcnJvciBTdGF0dXMgUmVnaXN0ZXJzIChFQ0NTVEFUMC1FQ0NTVEFUMykKKyAqLworLyogTnVtYmVyIG9mIEVDQyBlcnJvcnMgb24gc2VjdG9yIG4gKG4gPSAwLTE1KSAqLworI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUMF9FUlJDTlRfU0VDVE9SMF9NQVNLCTB4MEYwMDAwMDAKKyNkZWZpbmUgSUZDX05BTkRfRUNDU1RBVDBfRVJSQ05UX1NFQ1RPUjBfU0hJRlQJMjQKKyNkZWZpbmUgSUZDX05BTkRfRUNDU1RBVDBfRVJSQ05UX1NFQ1RPUjFfTUFTSwkweDAwMEYwMDAwCisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQwX0VSUkNOVF9TRUNUT1IxX1NISUZUCTE2CisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQwX0VSUkNOVF9TRUNUT1IyX01BU0sJMHgwMDAwMEYwMAorI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUMF9FUlJDTlRfU0VDVE9SMl9TSElGVAk4CisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQwX0VSUkNOVF9TRUNUT1IzX01BU0sJMHgwMDAwMDAwRgorI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUMF9FUlJDTlRfU0VDVE9SM19TSElGVAkwCisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQxX0VSUkNOVF9TRUNUT1I0X01BU0sJMHgwRjAwMDAwMAorI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUMV9FUlJDTlRfU0VDVE9SNF9TSElGVAkyNAorI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUMV9FUlJDTlRfU0VDVE9SNV9NQVNLCTB4MDAwRjAwMDAKKyNkZWZpbmUgSUZDX05BTkRfRUNDU1RBVDFfRVJSQ05UX1NFQ1RPUjVfU0hJRlQJMTYKKyNkZWZpbmUgSUZDX05BTkRfRUNDU1RBVDFfRVJSQ05UX1NFQ1RPUjZfTUFTSwkweDAwMDAwRjAwCisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQxX0VSUkNOVF9TRUNUT1I2X1NISUZUCTgKKyNkZWZpbmUgSUZDX05BTkRfRUNDU1RBVDFfRVJSQ05UX1NFQ1RPUjdfTUFTSwkweDAwMDAwMDBGCisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQxX0VSUkNOVF9TRUNUT1I3X1NISUZUCTAKKyNkZWZpbmUgSUZDX05BTkRfRUNDU1RBVDJfRVJSQ05UX1NFQ1RPUjhfTUFTSwkweDBGMDAwMDAwCisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQyX0VSUkNOVF9TRUNUT1I4X1NISUZUCTI0CisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQyX0VSUkNOVF9TRUNUT1I5X01BU0sJMHgwMDBGMDAwMAorI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUMl9FUlJDTlRfU0VDVE9SOV9TSElGVAkxNgorI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUMl9FUlJDTlRfU0VDVE9SMTBfTUFTSwkweDAwMDAwRjAwCisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQyX0VSUkNOVF9TRUNUT1IxMF9TSElGVAk4CisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQyX0VSUkNOVF9TRUNUT1IxMV9NQVNLCTB4MDAwMDAwMEYKKyNkZWZpbmUgSUZDX05BTkRfRUNDU1RBVDJfRVJSQ05UX1NFQ1RPUjExX1NISUZUCTAKKyNkZWZpbmUgSUZDX05BTkRfRUNDU1RBVDNfRVJSQ05UX1NFQ1RPUjEyX01BU0sJMHgwRjAwMDAwMAorI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUM19FUlJDTlRfU0VDVE9SMTJfU0hJRlQJMjQKKyNkZWZpbmUgSUZDX05BTkRfRUNDU1RBVDNfRVJSQ05UX1NFQ1RPUjEzX01BU0sJMHgwMDBGMDAwMAorI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUM19FUlJDTlRfU0VDVE9SMTNfU0hJRlQJMTYKKyNkZWZpbmUgSUZDX05BTkRfRUNDU1RBVDNfRVJSQ05UX1NFQ1RPUjE0X01BU0sJMHgwMDAwMEYwMAorI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUM19FUlJDTlRfU0VDVE9SMTRfU0hJRlQJOAorI2RlZmluZSBJRkNfTkFORF9FQ0NTVEFUM19FUlJDTlRfU0VDVE9SMTVfTUFTSwkweDAwMDAwMDBGCisjZGVmaW5lIElGQ19OQU5EX0VDQ1NUQVQzX0VSUkNOVF9TRUNUT1IxNV9TSElGVAkwCisKKy8qCisgKiBOQU5EIENvbnRyb2wgUmVnaXN0ZXIgKE5BTkRDUikKKyAqLworI2RlZmluZSBJRkNfTkFORF9OQ1JfRlRPQ05UX01BU0sJMHgxRTAwMDAwMAorI2RlZmluZSBJRkNfTkFORF9OQ1JfRlRPQ05UX1NISUZUCTI1CisjZGVmaW5lIElGQ19OQU5EX05DUl9GVE9DTlQobikJKChfaWxvZzIobikgLSA4KSAgPDwgSUZDX05BTkRfTkNSX0ZUT0NOVF9TSElGVCkKKworLyoKKyAqIE5BTkRfQVVUT0JPT1RfVFJHUgorICovCisvKiBUcmlnZ2VyIFJDVyBsb2FkICovCisjZGVmaW5lIElGQ19OQU5EX0FVVE9CT09UX1RSR1JfUkNXX0xECTB4ODAwMDAwMDAKKy8qIFRyaWdnZXQgQXV0byBCb290ICovCisjZGVmaW5lIElGQ19OQU5EX0FVVE9CT09UX1RSR1JfQk9PVF9MRAkweDIwMDAwMDAwCisKKy8qCisgKiBOQU5EX01EUgorICovCisvKiAxc3QgcmVhZCBkYXRhIGJ5dGUgd2hlbiBvcGNvZGUgU0JSRCAqLworI2RlZmluZSBJRkNfTkFORF9NRFJfUkRBVEEwCQkweEZGMDAwMDAwCisvKiAybmQgcmVhZCBkYXRhIGJ5dGUgd2hlbiBvcGNvZGUgU0JSRCAqLworI2RlZmluZSBJRkNfTkFORF9NRFJfUkRBVEExCQkweDAwRkYwMDAwCisKKy8qCisgKiBOT1IgTWFjaGluZSBTcGVjaWZpYyBSZWdpc3RlcnMKKyAqLworLyoKKyAqIE5PUiBFdmVudCBhbmQgRXJyb3IgU3RhdHVzIFJlZ2lzdGVyIChOT1JfRVZURVJfU1RBVCkKKyAqLworLyogTk9SIENvbW1hbmQgU2VxdWVuY2UgT3BlcmF0aW9uIENvbXBsZXRlICovCisjZGVmaW5lIElGQ19OT1JfRVZURVJfU1RBVF9PUENfTk9SCTB4ODAwMDAwMDAKKy8qIFdyaXRlIFByb3RlY3QgRXJyb3IgKi8KKyNkZWZpbmUgSUZDX05PUl9FVlRFUl9TVEFUX1dQRVIJCTB4MDQwMDAwMDAKKy8qIENvbW1hbmQgU2VxdWVuY2UgVGltZW91dCBFcnJvciAqLworI2RlZmluZSBJRkNfTk9SX0VWVEVSX1NUQVRfU1RPRVIJMHgwMTAwMDAwMAorCisvKgorICogTk9SIEV2ZW50IGFuZCBFcnJvciBFbmFibGUgUmVnaXN0ZXIgKE5PUl9FVlRFUl9FTikKKyAqLworLyogTk9SIENvbW1hbmQgU2VxIGNvbXBsZXRlIGV2ZW50IGVuYWJsZSAqLworI2RlZmluZSBJRkNfTk9SX0VWVEVSX0VOX09QQ0VOX05PUgkweDgwMDAwMDAwCisvKiBXcml0ZSBQcm90ZWN0IEVycm9yIENoZWNraW5nIEVuYWJsZSAqLworI2RlZmluZSBJRkNfTk9SX0VWVEVSX0VOX1dQRVJFTgkJMHgwNDAwMDAwMAorLyogVGltZW91dCBFcnJvciBFbmFibGUgKi8KKyNkZWZpbmUgSUZDX05PUl9FVlRFUl9FTl9TVE9FUkVOCTB4MDEwMDAwMDAKKworLyoKKyAqIE5PUiBFdmVudCBhbmQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoTk9SX0VWVEVSX0lOVFJfRU4pCisgKi8KKy8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIE9QQyBjb21wbGV0ZSAqLworI2RlZmluZSBJRkNfTk9SX0VWVEVSX0lOVFJfT1BDRU5fTk9SCTB4ODAwMDAwMDAKKy8qIEVuYWJsZSBpbnRlcnJ1cHQgZm9yIHdyaXRlIHByb3RlY3QgZXJyb3IgKi8KKyNkZWZpbmUgSUZDX05PUl9FVlRFUl9JTlRSX1dQRVJFTgkweDA0MDAwMDAwCisvKiBFbmFibGUgaW50ZXJydXB0IGZvciB0aW1lb3V0IGVycm9yICovCisjZGVmaW5lIElGQ19OT1JfRVZURVJfSU5UUl9TVE9FUkVOCTB4MDEwMDAwMDAKKworLyoKKyAqIE5PUiBUcmFuc2ZlciBFcnJvciBBdHRyaWJ1dGUgUmVnaXN0ZXItMCAoTk9SX0VSQVRUUjApCisgKi8KKy8qIFNvdXJjZSBJRCBmb3IgZXJyb3IgdHJhbnNhY3Rpb24gKi8KKyNkZWZpbmUgSUZDX05PUl9FUkFUVFIwX0VSU1JDSUQJCTB4RkYwMDAwMDAKKy8qIEFYSSBJRCBmb3IgZXJyb3IgdHJhbnNhdGlvbiAqLworI2RlZmluZSBJRkNfTk9SX0VSQVRUUjBfRVJBSUQJCTB4MDAwRkYwMDAKKy8qIENoaXAgc2VsZWN0IGNvcnJlc3BvbmRzIHRvIE5PUiBlcnJvciAqLworI2RlZmluZSBJRkNfTk9SX0VSQVRUUjBfRVJDU19DUzAJMHgwMDAwMDAwMAorI2RlZmluZSBJRkNfTk9SX0VSQVRUUjBfRVJDU19DUzEJMHgwMDAwMDAxMAorI2RlZmluZSBJRkNfTk9SX0VSQVRUUjBfRVJDU19DUzIJMHgwMDAwMDAyMAorI2RlZmluZSBJRkNfTk9SX0VSQVRUUjBfRVJDU19DUzMJMHgwMDAwMDAzMAorLyogVHlwZSBvZiB0cmFuc2FjdGlvbiByZWFkL3dyaXRlICovCisjZGVmaW5lIElGQ19OT1JfRVJBVFRSMF9FUlRZUEVfUkVBRAkweDAwMDAwMDAxCisKKy8qCisgKiBOT1IgVHJhbnNmZXIgRXJyb3IgQXR0cmlidXRlIFJlZ2lzdGVyLTIgKE5PUl9FUkFUVFIyKQorICovCisjZGVmaW5lIElGQ19OT1JfRVJBVFRSMl9FUl9OVU1fUEhBU0VfRVhQCTB4MDAwRjAwMDAKKyNkZWZpbmUgSUZDX05PUl9FUkFUVFIyX0VSX05VTV9QSEFTRV9QRVIJMHgwMDAwMEYwMAorCisvKgorICogTk9SIENvbnRyb2wgUmVnaXN0ZXIgKE5PUkNSKQorICovCisjZGVmaW5lIElGQ19OT1JDUl9NQVNLCQkJMHgwRjBGMDAwMAorLyogTm8uIG9mIEFkZHJlc3MvRGF0YSBQaGFzZSAqLworI2RlZmluZSBJRkNfTk9SQ1JfTlVNX1BIQVNFX01BU0sJMHgwRjAwMDAwMAorI2RlZmluZSBJRkNfTk9SQ1JfTlVNX1BIQVNFX1NISUZUCTI0CisjZGVmaW5lIElGQ19OT1JDUl9OVU1fUEhBU0UobikJKChuLTEpIDw8IElGQ19OT1JDUl9OVU1fUEhBU0VfU0hJRlQpCisvKiBTZXF1ZW5jZSBUaW1lb3V0IENvdW50ICovCisjZGVmaW5lIElGQ19OT1JDUl9TVE9DTlRfTUFTSwkJMHgwMDBGMDAwMAorI2RlZmluZSBJRkNfTk9SQ1JfU1RPQ05UX1NISUZUCQkxNgorI2RlZmluZSBJRkNfTk9SQ1JfU1RPQ05UKG4pCSgoX19pbG9nMihuKSAtIDgpIDw8IElGQ19OT1JDUl9TVE9DTlRfU0hJRlQpCisKKy8qCisgKiBHUENNIE1hY2hpbmUgc3BlY2lmaWMgcmVnaXN0ZXJzCisgKi8KKy8qCisgKiBHUENNIEV2ZW50IGFuZCBFcnJvciBTdGF0dXMgUmVnaXN0ZXIgKEdQQ01fRVZURVJfU1RBVCkKKyAqLworLyogVGltZW91dCBlcnJvciAqLworI2RlZmluZSBJRkNfR1BDTV9FVlRFUl9TVEFUX1RPRVIJMHgwNDAwMDAwMAorLyogUGFyaXR5IGVycm9yICovCisjZGVmaW5lIElGQ19HUENNX0VWVEVSX1NUQVRfUEVSCQkweDAxMDAwMDAwCisKKy8qCisgKiBHUENNIEV2ZW50IGFuZCBFcnJvciBFbmFibGUgUmVnaXN0ZXIgKEdQQ01fRVZURVJfRU4pCisgKi8KKy8qIFRpbWVvdXQgZXJyb3IgZW5hYmxlICovCisjZGVmaW5lIElGQ19HUENNX0VWVEVSX0VOX1RPRVJfRU4JMHgwNDAwMDAwMAorLyogUGFyaXR5IGVycm9yIGVuYWJsZSAqLworI2RlZmluZSBJRkNfR1BDTV9FVlRFUl9FTl9QRVJfRU4JMHgwMTAwMDAwMAorCisvKgorICogR1BDTSBFdmVudCBhbmQgRXJyb3IgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAoR1BDTV9FVlRFUl9JTlRSX0VOKQorICovCisvKiBFbmFibGUgSW50ZXJydXB0IGZvciB0aW1lb3V0IGVycm9yICovCisjZGVmaW5lIElGQ19HUENNX0VFSUVSX1RPRVJJUl9FTgkweDA0MDAwMDAwCisvKiBFbmFibGUgSW50ZXJydXB0IGZvciBQYXJpdHkgZXJyb3IgKi8KKyNkZWZpbmUgSUZDX0dQQ01fRUVJRVJfUEVSSVJfRU4JCTB4MDEwMDAwMDAKKworLyoKKyAqIEdQQ00gVHJhbnNmZXIgRXJyb3IgQXR0cmlidXRlIFJlZ2lzdGVyLTAgKEdQQ01fRVJBVFRSMCkKKyAqLworLyogU291cmNlIElEIGZvciBlcnJvciB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBJRkNfR1BDTV9FUkFUVFIwX0VSU1JDSUQJMHhGRjAwMDAwMAorLyogQVhJIElEIGZvciBlcnJvciB0cmFuc2FjdGlvbiAqLworI2RlZmluZSBJRkNfR1BDTV9FUkFUVFIwX0VSQUlECQkweDAwMEZGMDAwCisvKiBDaGlwIHNlbGVjdCBjb3JyZXNwb25kcyB0byBHUENNIGVycm9yICovCisjZGVmaW5lIElGQ19HUENNX0VSQVRUUjBfRVJDU19DUzAJMHgwMDAwMDAwMAorI2RlZmluZSBJRkNfR1BDTV9FUkFUVFIwX0VSQ1NfQ1MxCTB4MDAwMDAwNDAKKyNkZWZpbmUgSUZDX0dQQ01fRVJBVFRSMF9FUkNTX0NTMgkweDAwMDAwMDgwCisjZGVmaW5lIElGQ19HUENNX0VSQVRUUjBfRVJDU19DUzMJMHgwMDAwMDBDMAorLyogVHlwZSBvZiB0cmFuc2FjdGlvbiByZWFkL1dyaXRlICovCisjZGVmaW5lIElGQ19HUENNX0VSQVRUUjBfRVJUWVBFX1JFQUQJMHgwMDAwMDAwMQorCisvKgorICogR1BDTSBUcmFuc2ZlciBFcnJvciBBdHRyaWJ1dGUgUmVnaXN0ZXItMiAoR1BDTV9FUkFUVFIyKQorICovCisvKiBPbiB3aGljaCBiZWF0IG9mIGFkZHJlc3MvZGF0YSBwYXJpdHkgZXJyb3IgaXMgb2JzZXJ2ZWQgKi8KKyNkZWZpbmUgSUZDX0dQQ01fRVJBVFRSMl9QRVJSX0JFQVQJCTB4MDAwMDBDMDAKKy8qIFBhcml0eSBFcnJvciBvbiBieXRlICovCisjZGVmaW5lIElGQ19HUENNX0VSQVRUUjJfUEVSUl9CWVRFCQkweDAwMDAwMEYwCisvKiBQYXJpdHkgRXJyb3IgcmVwb3J0ZWQgaW4gYWRkciBvciBkYXRhIHBoYXNlICovCisjZGVmaW5lIElGQ19HUENNX0VSQVRUUjJfUEVSUl9EQVRBX1BIQVNFCTB4MDAwMDAwMDEKKworLyoKKyAqIEdQQ00gU3RhdHVzIFJlZ2lzdGVyIChHUENNX1NUQVQpCisgKi8KKyNkZWZpbmUgSUZDX0dQQ01fU1RBVF9CU1kJCTB4ODAwMDAwMDAgIC8qIEdQQ00gaXMgYnVzeSAqLworCisvKgorICogSUZDIENvbnRyb2xsZXIgTkFORCBNYWNoaW5lIHJlZ2lzdGVycworICovCitzdHJ1Y3QgZnNsX2lmY19uYW5kIHsKKwlfX2JlMzIgbmNmZ3I7CisJdTMyIHJlczFbMHg0XTsKKwlfX2JlMzIgbmFuZF9mY3IwOworCV9fYmUzMiBuYW5kX2ZjcjE7CisJdTMyIHJlczJbMHg4XTsKKwlfX2JlMzIgcm93MDsKKwl1MzIgcmVzMzsKKwlfX2JlMzIgY29sMDsKKwl1MzIgcmVzNDsKKwlfX2JlMzIgcm93MTsKKwl1MzIgcmVzNTsKKwlfX2JlMzIgY29sMTsKKwl1MzIgcmVzNjsKKwlfX2JlMzIgcm93MjsKKwl1MzIgcmVzNzsKKwlfX2JlMzIgY29sMjsKKwl1MzIgcmVzODsKKwlfX2JlMzIgcm93MzsKKwl1MzIgcmVzOTsKKwlfX2JlMzIgY29sMzsKKwl1MzIgcmVzMTBbMHgyNF07CisJX19iZTMyIG5hbmRfZmJjcjsKKwl1MzIgcmVzMTE7CisJX19iZTMyIG5hbmRfZmlyMDsKKwlfX2JlMzIgbmFuZF9maXIxOworCV9fYmUzMiBuYW5kX2ZpcjI7CisJdTMyIHJlczEyWzB4MTBdOworCV9fYmUzMiBuYW5kX2NzZWw7CisJdTMyIHJlczEzOworCV9fYmUzMiBuYW5kc2VxX3N0cnQ7CisJdTMyIHJlczE0OworCV9fYmUzMiBuYW5kX2V2dGVyX3N0YXQ7CisJdTMyIHJlczE1OworCV9fYmUzMiBwZ3JkY21wbF9ldnRfc3RhdDsKKwl1MzIgcmVzMTZbMHgyXTsKKwlfX2JlMzIgbmFuZF9ldnRlcl9lbjsKKwl1MzIgcmVzMTdbMHgyXTsKKwlfX2JlMzIgbmFuZF9ldnRlcl9pbnRyX2VuOworCXUzMiByZXMxOFsweDJdOworCV9fYmUzMiBuYW5kX2VyYXR0cjA7CisJX19iZTMyIG5hbmRfZXJhdHRyMTsKKwl1MzIgcmVzMTlbMHgxMF07CisJX19iZTMyIG5hbmRfZnNyOworCXUzMiByZXMyMDsKKwlfX2JlMzIgbmFuZF9lY2NzdGF0WzRdOworCXUzMiByZXMyMVsweDIwXTsKKwlfX2JlMzIgbmFubmRjcjsKKwl1MzIgcmVzMjJbMHgyXTsKKwlfX2JlMzIgbmFuZF9hdXRvYm9vdF90cmdyOworCXUzMiByZXMyMzsKKwlfX2JlMzIgbmFuZF9tZHI7CisJdTMyIHJlczI0WzB4NUNdOworfTsKKworLyoKKyAqIElGQyBjb250cm9sbGVyIE5PUiBNYWNoaW5lIHJlZ2lzdGVycworICovCitzdHJ1Y3QgZnNsX2lmY19ub3IgeworCV9fYmUzMiBub3JfZXZ0ZXJfc3RhdDsKKwl1MzIgcmVzMVsweDJdOworCV9fYmUzMiBub3JfZXZ0ZXJfZW47CisJdTMyIHJlczJbMHgyXTsKKwlfX2JlMzIgbm9yX2V2dGVyX2ludHJfZW47CisJdTMyIHJlczNbMHgyXTsKKwlfX2JlMzIgbm9yX2VyYXR0cjA7CisJX19iZTMyIG5vcl9lcmF0dHIxOworCV9fYmUzMiBub3JfZXJhdHRyMjsKKwl1MzIgcmVzNFsweDRdOworCV9fYmUzMiBub3JjcjsKKwl1MzIgcmVzNVsweEVGXTsKK307CisKKy8qCisgKiBJRkMgY29udHJvbGxlciBHUENNIE1hY2hpbmUgcmVnaXN0ZXJzCisgKi8KK3N0cnVjdCBmc2xfaWZjX2dwY20geworCV9fYmUzMiBncGNtX2V2dGVyX3N0YXQ7CisJdTMyIHJlczFbMHgyXTsKKwlfX2JlMzIgZ3BjbV9ldnRlcl9lbjsKKwl1MzIgcmVzMlsweDJdOworCV9fYmUzMiBncGNtX2V2dGVyX2ludHJfZW47CisJdTMyIHJlczNbMHgyXTsKKwlfX2JlMzIgZ3BjbV9lcmF0dHIwOworCV9fYmUzMiBncGNtX2VyYXR0cjE7CisJX19iZTMyIGdwY21fZXJhdHRyMjsKKwlfX2JlMzIgZ3BjbV9zdGF0OworCXUzMiByZXM0WzB4MUYzXTsKK307CisKKy8qCisgKiBJRkMgQ29udHJvbGxlciBSZWdpc3RlcnMKKyAqLworc3RydWN0IGZzbF9pZmNfcmVncyB7CisJX19iZTMyIGlmY19yZXY7CisJdTMyIHJlczFbMHgzXTsKKwlzdHJ1Y3QgeworCQlfX2JlMzIgY3NwcjsKKwkJdTMyIHJlczJbMHgyXTsKKwl9IGNzcHJfY3NbRlNMX0lGQ19CQU5LX0NPVU5UXTsKKwl1MzIgcmVzM1sweDE4XTsKKwlzdHJ1Y3QgeworCQlfX2JlMzIgYW1hc2s7CisJCXUzMiByZXM0WzB4Ml07CisJfSBhbWFza19jc1tGU0xfSUZDX0JBTktfQ09VTlRdOworCXUzMiByZXM1WzB4MThdOworCXN0cnVjdCB7CisJCV9fYmUzMiBjc29yOworCQl1MzIgcmVzNlsweDJdOworCX0gY3Nvcl9jc1tGU0xfSUZDX0JBTktfQ09VTlRdOworCXUzMiByZXM3WzB4MThdOworCXN0cnVjdCB7CisJCV9fYmUzMiBmdGltWzRdOworCQl1MzIgcmVzOFsweDhdOworCX0gZnRpbV9jc1tGU0xfSUZDX0JBTktfQ09VTlRdOworCXUzMiByZXM5WzB4NjBdOworCV9fYmUzMiByYl9zdGF0OworCXUzMiByZXMxMFsweDJdOworCV9fYmUzMiBpZmNfZ2NyOworCXUzMiByZXMxMVsweDJdOworCV9fYmUzMiBjbV9ldnRlcl9zdGF0OworCXUzMiByZXMxMlsweDJdOworCV9fYmUzMiBjbV9ldnRlcl9lbjsKKwl1MzIgcmVzMTNbMHgyXTsKKwlfX2JlMzIgY21fZXZ0ZXJfaW50cl9lbjsKKwl1MzIgcmVzMTRbMHgyXTsKKwlfX2JlMzIgY21fZXJhdHRyMDsKKwlfX2JlMzIgY21fZXJhdHRyMTsKKwl1MzIgcmVzMTVbMHgyXTsKKwlfX2JlMzIgaWZjX2NjcjsKKwlfX2JlMzIgaWZjX2NzcjsKKwl1MzIgcmVzMTZbMHgyRUJdOworCXN0cnVjdCBmc2xfaWZjX25hbmQgaWZjX25hbmQ7CisJc3RydWN0IGZzbF9pZmNfbm9yIGlmY19ub3I7CisJc3RydWN0IGZzbF9pZmNfZ3BjbSBpZmNfZ3BjbTsKK307CisKK2V4dGVybiB1bnNpZ25lZCBpbnQgY29udmVydF9pZmNfYWRkcmVzcyhwaHlzX2FkZHJfdCBhZGRyX2Jhc2UpOworZXh0ZXJuIGludCBmc2xfaWZjX2ZpbmQocGh5c19hZGRyX3QgYWRkcl9iYXNlKTsKKworLyogb3ZlcnZpZXcgb2YgdGhlIGZzbCBpZmMgY29udHJvbGxlciAqLworCitzdHJ1Y3QgZnNsX2lmY19jdHJsIHsKKwkvKiBkZXZpY2UgaW5mbyAqLworCXN0cnVjdCBkZXZpY2UJCQkqZGV2OworCXN0cnVjdCBmc2xfaWZjX3JlZ3MgX19pb21lbQkqcmVnczsKKwlpbnQJCQkJaXJxOworCWludAkJCQluYW5kX2lycTsKKwlzcGlubG9ja190CQkJbG9jazsKKwl2b2lkCQkJCSpuYW5kOworCisJdTMyIG5hbmRfc3RhdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBuYW5kX3dhaXQ7Cit9OworCitleHRlcm4gc3RydWN0IGZzbF9pZmNfY3RybCAqZnNsX2lmY19jdHJsX2RldjsKKworCisjZW5kaWYgLyogX19BU01fRlNMX0lGQ19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsX2xiYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2ZzbF9sYmMuaAppbmRleCA4YTBiNWVjLi40MjBiNDUzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vZnNsX2xiYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9mc2xfbGJjLmgKQEAgLTIzOCw4ICsyMzgsNiBAQAogI2RlZmluZSBGUEFSX0xQX0NJX1NISUZUICAgICAgMAogCV9fYmUzMiBmYmNyOyAgICAgICAgICAgIC8qKjwgRmxhc2ggQnl0ZSBDb3VudCBSZWdpc3RlciAqLwogI2RlZmluZSBGQkNSX0JDICAgICAgMHgwMDAwMEZGRgotCXU4IHJlczExWzB4OF07Ci0JdTggcmVzOFsweEYwMF07CiB9OwogCiAvKgpAQCAtMjk0LDYgKzI5MiwxMSBAQAogCiAJLyogc3RhdHVzIHJlYWQgZnJvbSBMVEVTUiBieSBpcnEgaGFuZGxlciAqLwogCXVuc2lnbmVkIGludAkJCWlycV9zdGF0dXM7CisKKyNpZmRlZiBDT05GSUdfU1VTUEVORAorCS8qIHNhdmUgcmVncyB3aGVuIHN5c3RlbSBnbyB0byBkZWVwLXNsZWVwICovCisJc3RydWN0IGZzbF9sYmNfcmVncwkJKnNhdmVkX3JlZ3M7CisjZW5kaWYKIH07CiAKIGV4dGVybiBpbnQgZnNsX3VwbV9ydW5fcGF0dGVybihzdHJ1Y3QgZnNsX3VwbSAqdXBtLCB2b2lkIF9faW9tZW0gKmlvX2Jhc2UsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHVnZXRsYi5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h1Z2V0bGIuaAppbmRleCA4NjAwNDkzLi5kZmRiOTViIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHVnZXRsYi5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9odWdldGxiLmgKQEAgLTUsNyArNSw2IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KIAogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICpodWdlcHRlX2NhY2hlOwotZXh0ZXJuIHZvaWQgX19pbml0IHJlc2VydmVfaHVnZXRsYl9ncGFnZXModm9pZCk7CiAKIHN0YXRpYyBpbmxpbmUgcHRlX3QgKmh1Z2VwZF9wYWdlKGh1Z2VwZF90IGhwZCkKIHsKQEAgLTIyLDE0ICsyMSwxNCBAQAogCQkJCSAgICB1bnNpZ25lZCBwZHNoaWZ0KQogewogCS8qCi0JICogT24gMzItYml0LCB3ZSBoYXZlIG11bHRpcGxlIGhpZ2hlci1sZXZlbCB0YWJsZSBlbnRyaWVzIHRoYXQgcG9pbnQgdG8KLQkgKiB0aGUgc2FtZSBodWdlcHRlLiAgSnVzdCB1c2UgdGhlIGZpcnN0IG9uZSBzaW5jZSB0aGV5J3JlIGFsbAorCSAqIE9uIEZTTCBCb29rRSwgd2UgaGF2ZSBtdWx0aXBsZSBoaWdoZXItbGV2ZWwgdGFibGUgZW50cmllcyB0aGF0CisJICogcG9pbnQgdG8gdGhlIHNhbWUgaHVnZXB0ZS4gIEp1c3QgdXNlIHRoZSBmaXJzdCBvbmUgc2luY2UgdGhleSdyZSBhbGwKIAkgKiBpZGVudGljYWwuICBTbyBmb3IgdGhhdCBjYXNlLCBpZHg9MC4KIAkgKi8KIAl1bnNpZ25lZCBsb25nIGlkeCA9IDA7CiAKIAlwdGVfdCAqZGlyID0gaHVnZXBkX3BhZ2UoKmhwZHApOwotI2lmZGVmIENPTkZJR19QUEM2NAorI2lmbmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKIAlpZHggPSAoYWRkciAmICgoMVVMIDw8IHBkc2hpZnQpIC0gMSkpID4+IGh1Z2VwZF9zaGlmdCgqaHBkcCk7CiAjZW5kaWYKIApAQCAtNTMsNyArNTIsOCBAQAogfQogI2VuZGlmCiAKLXZvaWQgYm9vazNlX2h1Z2V0bGJfcHJlbG9hZChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBlYSwgcHRlX3QgcHRlKTsKK3ZvaWQgYm9vazNlX2h1Z2V0bGJfcHJlbG9hZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBlYSwKKwkJCSAgICBwdGVfdCBwdGUpOwogdm9pZCBmbHVzaF9odWdldGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgdm1hZGRyKTsKIAogdm9pZCBodWdldGxiX2ZyZWVfcGdkX3JhbmdlKHN0cnVjdCBtbXVfZ2F0aGVyICp0bGIsIHVuc2lnbmVkIGxvbmcgYWRkciwKQEAgLTEyNCw3ICsxMjQsMTcgQEAKIAkJCQkJICAgICB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwLAogCQkJCQkgICAgIHB0ZV90IHB0ZSwgaW50IGRpcnR5KQogeworI2lmZGVmIEhVR0VUTEJfTkVFRF9QUkVMT0FECisJLyoKKwkgKiBUaGUgInJldHVybiAxIiBmb3JjZXMgYSBjYWxsIG9mIHVwZGF0ZV9tbXVfY2FjaGUsIHdoaWNoIHdpbGwgd3JpdGUgYQorCSAqIFRMQiBlbnRyeS4gIFdpdGhvdXQgdGhpcywgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgZG8gYSB3cml0ZSBvZiB0aGUgVExCCisJICogZW50cnkgaW4gdGhlIFRMQiBtaXNzIGhhbmRsZXIgYXNtIHdpbGwgZmF1bHQgYWQgaW5maW5pdHVtLgorCSAqLworCXB0ZXBfc2V0X2FjY2Vzc19mbGFncyh2bWEsIGFkZHIsIHB0ZXAsIHB0ZSwgZGlydHkpOworCXJldHVybiAxOworI2Vsc2UKIAlyZXR1cm4gcHRlcF9zZXRfYWNjZXNzX2ZsYWdzKHZtYSwgYWRkciwgcHRlcCwgcHRlLCBkaXJ0eSk7CisjZW5kaWYKIH0KIAogc3RhdGljIGlubGluZSBwdGVfdCBodWdlX3B0ZXBfZ2V0KHB0ZV90ICpwdGVwKQpAQCAtMTQyLDE0ICsxNTIsMjQgQEAKIH0KIAogI2Vsc2UgLyogISBDT05GSUdfSFVHRVRMQl9QQUdFICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVzZXJ2ZV9odWdldGxiX2dwYWdlcyh2b2lkKQotewotCXByX2VycigiQ2Fubm90IHJlc2VydmUgZ3BhZ2VzIHdpdGhvdXQgaHVnZXRsYiBlbmFibGVkXG4iKTsKLX0KIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF9odWdldGxiX3BhZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyB2bWFkZHIpCiB7CiB9CisjZW5kaWYgLyogQ09ORklHX0hVR0VUTEJfUEFHRSAqLworCisKKy8qCisgKiBGU0wgQm9vazNFIHBsYXRmb3JtcyByZXF1aXJlIHNwZWNpYWwgZ3BhZ2UgaGFuZGxpbmcgLSB0aGUgZ3BhZ2VzCisgKiBhcmUgcmVzZXJ2ZWQgZWFybHkgaW4gdGhlIGJvb3QgcHJvY2VzcyBieSBtZW1ibG9jayBpbnN0ZWFkIG9mIHZpYQorICogdGhlIC5kdHMgYXMgb24gSUJNIHBsYXRmb3Jtcy4KKyAqLworI2lmIGRlZmluZWQoQ09ORklHX0hVR0VUTEJfUEFHRSkgJiYgZGVmaW5lZChDT05GSUdfUFBDX0ZTTF9CT09LM0UpCitleHRlcm4gdm9pZCBfX2luaXQgcmVzZXJ2ZV9odWdldGxiX2dwYWdlcyh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXJ2ZV9odWdldGxiX2dwYWdlcyh2b2lkKQoreworfQogI2VuZGlmCiAKICNlbmRpZiAvKiBfQVNNX1BPV0VSUENfSFVHRVRMQl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va2R1bXAuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZHVtcC5oCmluZGV4IGJmZmQwNjIuLmM5Nzc2MjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZHVtcC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZHVtcC5oCkBAIC0zMiwxMSArMzIsMTEgQEAKIAogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAotI2lmIGRlZmluZWQoQ09ORklHX0NSQVNIX0RVTVApICYmICFkZWZpbmVkKENPTkZJR19SRUxPQ0FUQUJMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19DUkFTSF9EVU1QKSAmJiAhZGVmaW5lZChDT05GSUdfTk9OU1RBVElDX0tFUk5FTCkKIGV4dGVybiB2b2lkIHJlc2VydmVfa2R1bXBfdHJhbXBvbGluZSh2b2lkKTsKIGV4dGVybiB2b2lkIHNldHVwX2tkdW1wX3RyYW1wb2xpbmUodm9pZCk7CiAjZWxzZQotLyogIUNSQVNIX0RVTVAgfHwgUkVMT0NBVEFCTEUgKi8KKy8qICFDUkFTSF9EVU1QIHx8ICFOT05TVEFUSUNfS0VSTkVMICovCiBzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXJ2ZV9rZHVtcF90cmFtcG9saW5lKHZvaWQpIHsgOyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0dXBfa2R1bXBfdHJhbXBvbGluZSh2b2lkKSB7IDsgfQogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va2V4ZWMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5oCmluZGV4IGY5MjFlYjEuLjE2ZDdlMzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5oCkBAIC00OSw3ICs0OSw2IEBACiAjZGVmaW5lIEtFWEVDX1NUQVRFX1JFQUxfTU9ERSAyCiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCi0jaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGFzbS9yZWcuaD4KIAogdHlwZWRlZiB2b2lkICgqY3Jhc2hfc2h1dGRvd25fdCkodm9pZCk7CkBAIC03MywxMSArNzIsNiBAQAogCQkJCQkgIG1hc3RlciB0byBjb3B5IG5ldyBjb2RlIHRvIDAgKi8KIGV4dGVybiBpbnQgY3Jhc2hpbmdfY3B1OwogZXh0ZXJuIHZvaWQgY3Jhc2hfc2VuZF9pcGkodm9pZCAoKmNyYXNoX2lwaV9jYWxsYmFjaykoc3RydWN0IHB0X3JlZ3MgKikpOwotZXh0ZXJuIGNwdW1hc2tfdCBjcHVzX2luX3NyOwotc3RhdGljIGlubGluZSBpbnQga2V4ZWNfc3JfYWN0aXZhdGVkKGludCBjcHUpCi17Ci0JcmV0dXJuIGNwdW1hc2tfdGVzdF9jcHUoY3B1LCAmY3B1c19pbl9zcik7Ci19CiAKIHN0cnVjdCBraW1hZ2U7CiBzdHJ1Y3QgcHRfcmVnczsKQEAgLTk0LDcgKzg4LDYgQEAKIGV4dGVybiB2b2lkIG1hY2hpbmVfa2V4ZWNfbWFza19pbnRlcnJ1cHRzKHZvaWQpOwogCiAjZWxzZSAvKiAhQ09ORklHX0tFWEVDICovCi1zdGF0aWMgaW5saW5lIGludCBrZXhlY19zcl9hY3RpdmF0ZWQoaW50IGNwdSkgeyByZXR1cm4gMDsgfQogc3RhdGljIGlubGluZSB2b2lkIGNyYXNoX2tleGVjX3NlY29uZGFyeShzdHJ1Y3QgcHRfcmVncyAqcmVncykgeyB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IG92ZXJsYXBzX2NyYXNoa2VybmVsKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szcy5oCmluZGV4IGQ0ZGYwMTMuLjY5YzczNzcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3MuaApAQCAtMzgxLDM5ICszODEsNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb21wdXRlX3RsYmllX3JiKHVuc2lnbmVkIGxvbmcgdiwgdW5zaWduZWQgbG9uZyByLAotCQkJCQkgICAgIHVuc2lnbmVkIGxvbmcgcHRlX2luZGV4KQotewotCXVuc2lnbmVkIGxvbmcgcmIsIHZhX2xvdzsKLQotCXJiID0gKHYgJiB+MHg3ZlVMKSA8PCAxNjsJCS8qIEFWQSBmaWVsZCAqLwotCXZhX2xvdyA9IHB0ZV9pbmRleCA+PiAzOwotCWlmICh2ICYgSFBURV9WX1NFQ09OREFSWSkKLQkJdmFfbG93ID0gfnZhX2xvdzsKLQkvKiB4b3IgdnNpZCBmcm9tIEFWQSAqLwotCWlmICghKHYgJiBIUFRFX1ZfMVRCX1NFRykpCi0JCXZhX2xvdyBePSB2ID4+IDEyOwotCWVsc2UKLQkJdmFfbG93IF49IHYgPj4gMjQ7Ci0JdmFfbG93ICY9IDB4N2ZmOwotCWlmICh2ICYgSFBURV9WX0xBUkdFKSB7Ci0JCXJiIHw9IDE7CQkJLyogTCBmaWVsZCAqLwotCQlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfQVJDSF8yMDYpICYmCi0JCSAgICAociAmIDB4ZmYwMDApKSB7Ci0JCQkvKiBub24tMTZNQiBsYXJnZSBwYWdlLCBtdXN0IGJlIDY0ayAqLwotCQkJLyogKG1hc2tzIGRlcGVuZCBvbiBwYWdlIHNpemUpICovCi0JCQlyYiB8PSAweDEwMDA7CQkvKiBwYWdlIGVuY29kaW5nIGluIExQIGZpZWxkICovCi0JCQlyYiB8PSAodmFfbG93ICYgMHg3ZikgPDwgMTY7IC8qIDdiIG9mIFZBIGluIEFWQS9MUCBmaWVsZCAqLwotCQkJcmIgfD0gKHZhX2xvdyAmIDB4ZmUpOwkvKiBBVkFMIGZpZWxkIChQNyBkb2Vzbid0IHNlZW0gdG8gY2FyZSkgKi8KLQkJfQotCX0gZWxzZSB7Ci0JCS8qIDRrQiBwYWdlICovCi0JCXJiIHw9ICh2YV9sb3cgJiAweDdmZikgPDwgMTI7CS8qIHJlbWFpbmluZyAxMWIgb2YgVkEgKi8KLQl9Ci0JcmIgfD0gKHYgPj4gNTQpICYgMHgzMDA7CQkvKiBCIGZpZWxkICovCi0JcmV0dXJuIHJiOwotfQotCiAvKiBNYWdpYyByZWdpc3RlciB2YWx1ZXMgbG9hZGVkIGludG8gcjMgYW5kIHI0IGJlZm9yZSB0aGUgJ3NjJyBhc3NlbWJseQogICogaW5zdHJ1Y3Rpb24gZm9yIHRoZSBPU0kgaHlwZXJjYWxscyAqLwogI2RlZmluZSBPU0lfU0NfTUFHSUNfUjMJCQkweDExMzcyNEZBCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc182NC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2t2bV9ib29rM3NfNjQuaAppbmRleCBlNDNmZTQyLi5kMGFjOTRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20va3ZtX2Jvb2szc182NC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rdm1fYm9vazNzXzY0LmgKQEAgLTI5LDQgKzI5LDM3IEBACiAKICNkZWZpbmUgU1BBUFJfVENFX1NISUZUCQkxMgogCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgY29tcHV0ZV90bGJpZV9yYih1bnNpZ25lZCBsb25nIHYsIHVuc2lnbmVkIGxvbmcgciwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIHB0ZV9pbmRleCkKK3sKKwl1bnNpZ25lZCBsb25nIHJiLCB2YV9sb3c7CisKKwlyYiA9ICh2ICYgfjB4N2ZVTCkgPDwgMTY7CQkvKiBBVkEgZmllbGQgKi8KKwl2YV9sb3cgPSBwdGVfaW5kZXggPj4gMzsKKwlpZiAodiAmIEhQVEVfVl9TRUNPTkRBUlkpCisJCXZhX2xvdyA9IH52YV9sb3c7CisJLyogeG9yIHZzaWQgZnJvbSBBVkEgKi8KKwlpZiAoISh2ICYgSFBURV9WXzFUQl9TRUcpKQorCQl2YV9sb3cgXj0gdiA+PiAxMjsKKwllbHNlCisJCXZhX2xvdyBePSB2ID4+IDI0OworCXZhX2xvdyAmPSAweDdmZjsKKwlpZiAodiAmIEhQVEVfVl9MQVJHRSkgeworCQlyYiB8PSAxOwkJCS8qIEwgZmllbGQgKi8KKwkJaWYgKGNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0FSQ0hfMjA2KSAmJgorCQkgICAgKHIgJiAweGZmMDAwKSkgeworCQkJLyogbm9uLTE2TUIgbGFyZ2UgcGFnZSwgbXVzdCBiZSA2NGsgKi8KKwkJCS8qIChtYXNrcyBkZXBlbmQgb24gcGFnZSBzaXplKSAqLworCQkJcmIgfD0gMHgxMDAwOwkJLyogcGFnZSBlbmNvZGluZyBpbiBMUCBmaWVsZCAqLworCQkJcmIgfD0gKHZhX2xvdyAmIDB4N2YpIDw8IDE2OyAvKiA3YiBvZiBWQSBpbiBBVkEvTFAgZmllbGQgKi8KKwkJCXJiIHw9ICh2YV9sb3cgJiAweGZlKTsJLyogQVZBTCBmaWVsZCAoUDcgZG9lc24ndCBzZWVtIHRvIGNhcmUpICovCisJCX0KKwl9IGVsc2UgeworCQkvKiA0a0IgcGFnZSAqLworCQlyYiB8PSAodmFfbG93ICYgMHg3ZmYpIDw8IDEyOwkvKiByZW1haW5pbmcgMTFiIG9mIFZBICovCisJfQorCXJiIHw9ICh2ID4+IDU0KSAmIDB4MzAwOwkJLyogQiBmaWVsZCAqLworCXJldHVybiByYjsKK30KKwogI2VuZGlmIC8qIF9fQVNNX0tWTV9CT09LM1NfNjRfSF9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbHYxY2FsbC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2x2MWNhbGwuaAppbmRleCBmNzdjNzA4Li4yMzNmOWVjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbHYxY2FsbC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9sdjFjYWxsLmgKQEAgLTIzMSw3ICsyMzEsNyBAQAogTFYxX0NBTEwod3JpdGVfaHRhYl9lbnRyeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAwLCAgIDEgKQogTFYxX0NBTEwoY29uc3RydWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZSwgICAgICAgICAgICAgICAzLCAyLCAgIDIgKQogTFYxX0NBTEwoaW52YWxpZGF0ZV9odGFiX2VudHJpZXMsICAgICAgICAgICAgICAgICAgICAgICA1LCAwLCAgIDMgKQotTFYxX0NBTEwoZ2V0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZV9pZF9vZl9wcGUsICAgICAgICAgICAxLCAxLCAgIDQgKQorTFYxX0NBTEwoZ2V0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZV9pZF9vZl9wcGUsICAgICAgICAgICAwLCAxLCAgIDQgKQogTFYxX0NBTEwocXVlcnlfbG9naWNhbF9wYXJ0aXRpb25fYWRkcmVzc19yZWdpb25faW5mbywgICAxLCA1LCAgIDYgKQogTFYxX0NBTEwoc2VsZWN0X3ZpcnR1YWxfYWRkcmVzc19zcGFjZSwgICAgICAgICAgICAgICAgICAxLCAwLCAgIDcgKQogTFYxX0NBTEwocGF1c2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAgIDkgKQpAQCAtMjY0LDcgKzI2NCw3IEBACiBMVjFfQ0FMTChnZXRfc3BlX2lycV9vdXRsZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDEsICA3OCApCiBMVjFfQ0FMTChzZXRfc3BlX3ByaXZpbGVnZV9zdGF0ZV9hcmVhXzFfcmVnaXN0ZXIsICAgICAgIDMsIDAsICA3OSApCiBMVjFfQ0FMTChjcmVhdGVfcmVwb3NpdG9yeV9ub2RlLCAgICAgICAgICAgICAgICAgICAgICAgIDYsIDAsICA5MCApCi1MVjFfQ0FMTChnZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlLCAgICAgICAgICAgICAgICAgICAgIDUsIDIsICA5MSApCitMVjFfQ0FMTChyZWFkX3JlcG9zaXRvcnlfbm9kZSwgICAgICAgICAgICAgICAgICAgICAgICAgIDUsIDIsICA5MSApCiBMVjFfQ0FMTChtb2RpZnlfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlLCAgICAgICAgICAgICAgICAgIDYsIDAsICA5MiApCiBMVjFfQ0FMTChyZW1vdmVfcmVwb3NpdG9yeV9ub2RlLCAgICAgICAgICAgICAgICAgICAgICAgIDQsIDAsICA5MyApCiBMVjFfQ0FMTChyZWFkX2h0YWJfZW50cmllcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIDUsICA5NSApCkBAIC0yNzYsNyArMjc2LDcgQEAKIExWMV9DQUxMKGRlc3RydWN0X2lvX2lycV9vdXRsZXQsICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMTIxICkKIExWMV9DQUxMKG1hcF9odGFiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgMTIyICkKIExWMV9DQUxMKHVubWFwX2h0YWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMCwgMTIzICkKLUxWMV9DQUxMKGdldF92ZXJzaW9uX2luZm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMTI3ICkKK0xWMV9DQUxMKGdldF92ZXJzaW9uX2luZm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMiwgMTI3ICkKIExWMV9DQUxMKGluc2VydF9odGFiX2VudHJ5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNiwgMywgMTU4ICkKIExWMV9DQUxMKHJlYWRfdmlydHVhbF91YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTYyICkKIExWMV9DQUxMKHdyaXRlX3ZpcnR1YWxfdWFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgMSwgMTYzICkKQEAgLTI5NCw5ICsyOTQsOSBAQAogTFYxX0NBTEwobmV0X2FkZF9tdWx0aWNhc3RfYWRkcmVzcywgICAgICAgICAgICAgICAgICAgICA0LCAwLCAxODUgKQogTFYxX0NBTEwobmV0X3JlbW92ZV9tdWx0aWNhc3RfYWRkcmVzcywgICAgICAgICAgICAgICAgICA0LCAwLCAxODYgKQogTFYxX0NBTEwobmV0X3N0YXJ0X3R4X2RtYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAwLCAxODcgKQotTFYxX0NBTEwobmV0X3N0b3BfdHhfZG1hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCAxODggKQorTFYxX0NBTEwobmV0X3N0b3BfdHhfZG1hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAwLCAxODggKQogTFYxX0NBTEwobmV0X3N0YXJ0X3J4X2RtYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCAwLCAxODkgKQotTFYxX0NBTEwobmV0X3N0b3BfcnhfZG1hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAwLCAxOTAgKQorTFYxX0NBTEwobmV0X3N0b3BfcnhfZG1hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAwLCAxOTAgKQogTFYxX0NBTEwobmV0X3NldF9pbnRlcnJ1cHRfc3RhdHVzX2luZGljYXRvciwgICAgICAgICAgICA0LCAwLCAxOTEgKQogTFYxX0NBTEwobmV0X3NldF9pbnRlcnJ1cHRfbWFzaywgICAgICAgICAgICAgICAgICAgICAgICA0LCAwLCAxOTMgKQogTFYxX0NBTEwobmV0X2NvbnRyb2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2LCAyLCAxOTQgKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tYWNoZGVwLmgKaW5kZXggYjU0MGQ2Zi4uYmYzNzkzMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21hY2hkZXAuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWFjaGRlcC5oCkBAIC0yMTMsNiArMjEzLDkgQEAKIAkgKiBhbGxvdyBhc3NpZ25tZW50L2VuYWJsaW5nIG9mIHRoZSBkZXZpY2UuICovCiAJaW50ICAoKnBjaWJpb3NfZW5hYmxlX2RldmljZV9ob29rKShzdHJ1Y3QgcGNpX2RldiAqKTsKIAorCS8qIENhbGxlZCBhZnRlciBzY2FuIGFuZCBiZWZvcmUgcmVzb3VyY2Ugc3VydmV5ICovCisJdm9pZCAoKnBjaWJpb3NfZml4dXBfcGhiKShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpOworCiAJLyogQ2FsbGVkIHRvIHNodXRkb3duIG1hY2hpbmUgc3BlY2lmaWMgaGFyZHdhcmUgbm90IGFscmVhZHkgY29udHJvbGxlZAogCSAqIGJ5IG90aGVyIGRyaXZlcnMuCiAJICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbWVtYmxvY2suaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tZW1ibG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2VmYzM0Li4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tZW1ibG9jay5oCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi0jaWZuZGVmIF9BU01fUE9XRVJQQ19NRU1CTE9DS19ICi0jZGVmaW5lIF9BU01fUE9XRVJQQ19NRU1CTE9DS19ICi0KLSNpbmNsdWRlIDxhc20vdWRiZy5oPgotCi0jZGVmaW5lIE1FTUJMT0NLX0RCRyhmbXQuLi4pIHVkYmdfcHJpbnRmKGZtdCkKLQotI2VuZGlmIC8qIF9BU01fUE9XRVJQQ19NRU1CTE9DS19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWJvb2szZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1ib29rM2UuaAppbmRleCAwMjYwZWE1Li5mNWY4OWNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWJvb2szZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtYm9vazNlLmgKQEAgLTIxNCw2ICsyMTQsMTAgQEAKIAl1bnNpZ25lZCBpbnQJaWQ7CiAJdW5zaWduZWQgaW50CWFjdGl2ZTsKIAl1bnNpZ25lZCBsb25nCXZkc29fYmFzZTsKKyNpZmRlZiBDT05GSUdfUFBDX0lDU1dYCisJc3RydWN0IHNwaW5sb2NrICpjb3BfbG9ja3A7CS8qIGd1YXJkIGNvcCByZWxhdGVkIHN0dWZmICovCisJdW5zaWduZWQgbG9uZyBhY29wOwkJLyogbWFzayBvZiBlbmFibGVkIGNvcHJvY2Vzc29yIHR5cGVzICovCisjZW5kaWYgLyogQ09ORklHX1BQQ19JQ1NXWCAqLwogI2lmZGVmIENPTkZJR19QUENfTU1fU0xJQ0VTCiAJdTY0IGxvd19zbGljZXNfcHNpemU7ICAgLyogU0xCIHBhZ2Ugc2l6ZSBlbmNvZGluZ3MgKi8KIAl1NjQgaGlnaF9zbGljZXNfcHNpemU7ICAvKiA0IGJpdHMgcGVyIHNsaWNlIGZvciBub3cgKi8KQEAgLTI1NCw2ICsyNTgsMTMgQEAKIAogI2lmZGVmIENPTkZJR19QUEM2NAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbGluZWFyX21hcF90b3A7CisKKy8qCisgKiA2NC1iaXQgYm9va2UgcGxhdGZvcm1zIGRvbid0IGxvYWQgdGhlIHRsYiBpbiB0aGUgdGxiIG1pc3MgaGFuZGxlciBjb2RlLgorICogSFVHRVRMQl9ORUVEX1BSRUxPQUQgaGFuZGxlcyB0aGlzIC0gaXQgY2F1c2VzIGh1Z2VfcHRlcF9zZXRfYWNjZXNzX2ZsYWdzIHRvCisgKiByZXR1cm4gMSwgaW5kaWNhdGluZyB0aGF0IHRoZSB0bGIgcmVxdWlyZXMgcHJlbG9hZGluZy4KKyAqLworI2RlZmluZSBIVUdFVExCX05FRURfUFJFTE9BRAogI2VuZGlmCiAKICNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWhhc2g2NC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21tdS1oYXNoNjQuaAppbmRleCBkYjY0NWVjLi40MTJiYTQ5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbW11LWhhc2g2NC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tbXUtaGFzaDY0LmgKQEAgLTMxMiwxMCArMzEyLDkgQEAKICAqIChpLmUuIGV2ZXJ5dGhpbmcgYWJvdmUgMHhDMDAwMDAwMDAwMDAwMDAwKSwgZXhjZXB0IHRoZSB2ZXJ5IHRvcAogICogc2VnbWVudCwgd2hpY2ggc2ltcGxpZmllcyBzZXZlcmFsIHRoaW5ncy4KICAqCi0gKiAJLSBXZSBhbGxvdyBmb3IgMTUgc2lnbmlmaWNhbnQgYml0cyBvZiBFU0lEIGFuZCAyMCBiaXRzIG9mCi0gKiBjb250ZXh0IGZvciB1c2VyIGFkZHJlc3Nlcy4gIGkuZS4gOFQgKDQzIGJpdHMpIG9mIGFkZHJlc3Mgc3BhY2UgZm9yCi0gKiB1cCB0byAxTSBjb250ZXh0cyAoYWx0aG91Z2ggdGhlIHBhZ2UgdGFibGUgc3RydWN0dXJlIGFuZCBjb250ZXh0Ci0gKiBhbGxvY2F0aW9uIHdpbGwgbmVlZCBjaGFuZ2VzIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMpLgorICoJLSBXZSBhbGxvdyBmb3IgMTYgc2lnbmlmaWNhbnQgYml0cyBvZiBFU0lEIGFuZCAxOSBiaXRzIG9mCisgKiBjb250ZXh0IGZvciB1c2VyIGFkZHJlc3Nlcy4gIGkuZS4gMTZUICg0NCBiaXRzKSBvZiBhZGRyZXNzIHNwYWNlIGZvcgorICogdXAgdG8gaGFsZiBhIG1pbGxpb24gY29udGV4dHMuCiAgKgogICogCS0gVGhlIHNjcmFtYmxlIGZ1bmN0aW9uIGdpdmVzIHJvYnVzdCBzY2F0dGVyaW5nIGluIHRoZSBoYXNoCiAgKiB0YWJsZSAoYXQgbGVhc3QgYmFzZWQgb24gc29tZSBpbml0aWFsIHJlc3VsdHMpLiAgVGhlIHByZXZpb3VzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBpYy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL21waWMuaAppbmRleCBlNmZhZTQ5Li42N2I0ZDk4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vbXBpYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9tcGljLmgKQEAgLTI1MSw2ICsyNTEsOSBAQAogLyogVGhlIGluc3RhbmNlIGRhdGEgb2YgYSBnaXZlbiBNUElDICovCiBzdHJ1Y3QgbXBpYwogeworCS8qIFRoZSBPcGVuRmlybXdhcmUgZHQgbm9kZSBmb3IgdGhpcyBNUElDICovCisJc3RydWN0IGRldmljZV9ub2RlICpub2RlOworCiAJLyogVGhlIHJlbWFwcGVyIGZvciB0aGlzIE1QSUMgKi8KIAlzdHJ1Y3QgaXJxX2hvc3QJCSppcnFob3N0OwogCkBAIC0yOTMsNiArMjk2LDkgQEAKIAkvKiBSZWdpc3RlciBhY2Nlc3MgbWV0aG9kICovCiAJZW51bSBtcGljX3JlZ190eXBlCXJlZ190eXBlOwogCisJLyogVGhlIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiB0aGUgTVBJQyAqLworCXBoeXNfYWRkcl90IHBhZGRyOworCiAJLyogVGhlIHZhcmlvdXMgaW9yZW1hcCdlZCBiYXNlcyAqLwogCXN0cnVjdCBtcGljX3JlZ19iYW5rCWdyZWdzOwogCXN0cnVjdCBtcGljX3JlZ19iYW5rCXRtcmVnczsKQEAgLTMzMSwxMSArMzM3LDExIEBACiAgKiBOb3RlIHNldHRpbmcgYW55IElEIChsZWF2aW5nIHRob3NlIGJpdHMgdG8gMCkgbWVhbnMgc3RhbmRhcmQgTVBJQwogICovCiAKLS8qIFRoaXMgaXMgdGhlIHByaW1hcnkgY29udHJvbGxlciwgb25seSB0aGF0IG9uZSBoYXMgSVBJcyBhbmQKLSAqIGhhcyBhZmluaXR5IGNvbnRyb2wuIEEgbm9uLXByaW1hcnkgTVBJQyBhbHdheXMgdXNlcyBDUFUwCi0gKiByZWdpc3RlcnMgb25seQorLyoKKyAqIFRoaXMgaXMgYSBzZWNvbmRhcnkgKCJjaGFpbmVkIikgY29udHJvbGxlcjsgaXQgb25seSB1c2VzIHRoZSBDUFUwCisgKiByZWdpc3RlcnMuICBQcmltYXJ5IGNvbnRyb2xsZXJzIGhhdmUgSVBJcyBhbmQgYWZmaW5pdHkgY29udHJvbC4KICAqLwotI2RlZmluZSBNUElDX1BSSU1BUlkJCQkweDAwMDAwMDAxCisjZGVmaW5lIE1QSUNfU0VDT05EQVJZCQkJMHgwMDAwMDAwMQogCiAvKiBTZXQgdGhpcyBmb3IgYSBiaWctZW5kaWFuIE1QSUMgKi8KICNkZWZpbmUgTVBJQ19CSUdfRU5ESUFOCQkJMHgwMDAwMDAwMgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9vcGFsLmgKaW5kZXggMjg5M2U4Zi4uYTRiMjhmMSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL29wYWwuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vb3BhbC5oCkBAIC0xMDksNiArMTA5LDE0IEBACiAjZGVmaW5lIE9QQUxfUENJX01BUF9QRV9ETUFfV0lORE9XCQk0NAogI2RlZmluZSBPUEFMX1BDSV9NQVBfUEVfRE1BX1dJTkRPV19SRUFMCQk0NQogI2RlZmluZSBPUEFMX1BDSV9SRVNFVAkJCQk0OQorI2RlZmluZSBPUEFMX1BDSV9HRVRfSFVCX0RJQUdfREFUQQkJNTAKKyNkZWZpbmUgT1BBTF9QQ0lfR0VUX1BIQl9ESUFHX0RBVEEJCTUxCisjZGVmaW5lIE9QQUxfUENJX0ZFTkNFX1BIQgkJCTUyCisjZGVmaW5lIE9QQUxfUENJX1JFSU5JVAkJCQk1MworI2RlZmluZSBPUEFMX1BDSV9NQVNLX1BFX0VSUk9SCQkJNTQKKyNkZWZpbmUgT1BBTF9TRVRfU0xPVF9MRURfU1RBVFVTCQk1NQorI2RlZmluZSBPUEFMX0dFVF9FUE9XX1NUQVRVUwkJCTU2CisjZGVmaW5lIE9QQUxfU0VUX1NZU1RFTV9BVFRFTlRJT05fTEVECQk1NwogCiAjaWZuZGVmIF9fQVNTRU1CTFlfXwogCkBAIC0xNjksNyArMTc3LDExIEBACiAJT1BBTF9FVkVOVF9OVlJBTSA9IDB4MiwKIAlPUEFMX0VWRU5UX1JUQyA9IDB4NCwKIAlPUEFMX0VWRU5UX0NPTlNPTEVfT1VUUFVUID0gMHg4LAotCU9QQUxfRVZFTlRfQ09OU09MRV9JTlBVVCA9IDB4MTAKKwlPUEFMX0VWRU5UX0NPTlNPTEVfSU5QVVQgPSAweDEwLAorCU9QQUxfRVZFTlRfRVJST1JfTE9HX0FWQUlMID0gMHgyMCwKKwlPUEFMX0VWRU5UX0VSUk9SX0xPRyA9IDB4NDAsCisJT1BBTF9FVkVOVF9FUE9XID0gMHg4MCwKKwlPUEFMX0VWRU5UX0xFRF9TVEFUVVMgPSAweDEwMAogfTsKIAogLyogTWFjaGluZSBjaGVjayByZWxhdGVkIGRlZmluaXRpb25zICovCkBAIC0yNTgsMTMgKzI3MCw0OSBAQAogCU9QQUxfTUFQX1BFID0gMQogfTsKIAorZW51bSBPcGFsUGVsdHZBY3Rpb24geworCU9QQUxfUkVNT1ZFX1BFX0ZST01fRE9NQUlOID0gMCwKKwlPUEFMX0FERF9QRV9UT19ET01BSU4gPSAxCit9OworCitlbnVtIE9wYWxNdmVFbmFibGVBY3Rpb24geworCU9QQUxfRElTQUJMRV9NVkUgPSAwLAorCU9QQUxfRU5BQkxFX01WRSA9IDEKK307CisKIGVudW0gT3BhbFBjaVJlc2V0QW5kUmVpbml0U2NvcGUgewogCU9QQUxfUEhCX0NPTVBMRVRFID0gMSwgT1BBTF9QQ0lfTElOSyA9IDIsIE9QQUxfUEhCX0VSUk9SID0gMywKIAlPUEFMX1BDSV9IT1RfUkVTRVQgPSA0LCBPUEFMX1BDSV9GVU5EQU1FTlRBTF9SRVNFVCA9IDUsCi0JT1BBTF9QQ0lfSU9EQV9SRVNFVCA9IDYsCisJT1BBTF9QQ0lfSU9EQV9UQUJMRV9SRVNFVCA9IDYsCiB9OwogCi1lbnVtIE9wYWxQY2lSZXNldFN0YXRlIHsgT1BBTF9ERUFTU0VSVF9SRVNFVCA9IDAsIE9QQUxfQVNTRVJUX1JFU0VUID0gMSB9OworZW51bSBPcGFsUGNpUmVzZXRTdGF0ZSB7CisJT1BBTF9ERUFTU0VSVF9SRVNFVCA9IDAsCisJT1BBTF9BU1NFUlRfUkVTRVQgPSAxCit9OworCitlbnVtIE9wYWxQY2lNYXNrQWN0aW9uIHsKKwlPUEFMX1VOTUFTS19FUlJPUl9UWVBFID0gMCwKKwlPUEFMX01BU0tfRVJST1JfVFlQRSA9IDEKK307CisKK2VudW0gT3BhbFNsb3RMZWRUeXBlIHsKKwlPUEFMX1NMT1RfTEVEX0lEX1RZUEUgPSAwLAorCU9QQUxfU0xPVF9MRURfRkFVTFRfVFlQRSA9IDEKK307CisKK2VudW0gT3BhbExlZEFjdGlvbiB7CisJT1BBTF9UVVJOX09GRl9MRUQgPSAwLAorCU9QQUxfVFVSTl9PTl9MRUQgPSAxLAorCU9QQUxfUVVFUllfTEVEX1NUQVRFX0FGVEVSX0JVU1kgPSAyCit9OworCitlbnVtIE9wYWxFcG93U3RhdHVzIHsKKwlPUEFMX0VQT1dfTk9ORSA9IDAsCisJT1BBTF9FUE9XX1VQUyA9IDEsCisJT1BBTF9FUE9XX09WRVJfQU1CSUVOVF9URU1QID0gMiwKKwlPUEFMX0VQT1dfT1ZFUl9JTlRFUk5BTF9URU1QID0gMworfTsKIAogc3RydWN0IG9wYWxfbWFjaGluZV9jaGVja19ldmVudCB7CiAJZW51bSBPcGFsTUNFX1ZlcnNpb24JdmVyc2lvbjo4OwkvKiAweDAwICovCkBAIC0zMTQsOCArMzYyLDc0IEBACiAJfSB1OwogfTsKIAorLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZWZpbmVzIHRoZSBvdmVybGF5IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzdG9yZSBQSEIgZXJyb3IKKyAqIGRhdGEgdXBvbiByZXF1ZXN0LgorICovCitlbnVtIHsKKwlPUEFMX1A3SU9DX05VTV9QRVNUX1JFR1MgPSAxMjgsCit9OworCitzdHJ1Y3QgT3BhbElvUDdJT0NQaGJFcnJvckRhdGEgeworCXVpbnQzMl90IGJyZGdDdGw7CisKKwkvLyBQN0lPQyB1dGwgcmVncworCXVpbnQzMl90IHBvcnRTdGF0dXNSZWc7CisJdWludDMyX3Qgcm9vdENtcGx4U3RhdHVzOworCXVpbnQzMl90IGJ1c0FnZW50U3RhdHVzOworCisJLy8gUDdJT0MgY2ZnIHJlZ3MKKwl1aW50MzJfdCBkZXZpY2VTdGF0dXM7CisJdWludDMyX3Qgc2xvdFN0YXR1czsKKwl1aW50MzJfdCBsaW5rU3RhdHVzOworCXVpbnQzMl90IGRldkNtZFN0YXR1czsKKwl1aW50MzJfdCBkZXZTZWNTdGF0dXM7CisKKwkvLyBjZmcgQUVSIHJlZ3MKKwl1aW50MzJfdCByb290RXJyb3JTdGF0dXM7CisJdWludDMyX3QgdW5jb3JyRXJyb3JTdGF0dXM7CisJdWludDMyX3QgY29yckVycm9yU3RhdHVzOworCXVpbnQzMl90IHRscEhkcjE7CisJdWludDMyX3QgdGxwSGRyMjsKKwl1aW50MzJfdCB0bHBIZHIzOworCXVpbnQzMl90IHRscEhkcjQ7CisJdWludDMyX3Qgc291cmNlSWQ7CisKKwl1aW50MzJfdCByc3YzOworCisJLy8gUmVjb3JkIGRhdGEgYWJvdXQgdGhlIGNhbGwgdG8gYWxsb2NhdGUgYSBidWZmZXIuCisJdWludDY0X3QgZXJyb3JDbGFzczsKKwl1aW50NjRfdCBjb3JyZWxhdG9yOworCisJLy9QN0lPQyBNTUlPIEVycm9yIFJlZ3MKKwl1aW50NjRfdCBwN2lvY1Bsc3NyOyAgICAgICAgICAgICAgICAvLyBuMTIwCisJdWludDY0X3QgcDdpb2NDc3I7ICAgICAgICAgICAgICAgICAgLy8gbjExMAorCXVpbnQ2NF90IGxlbUZpcjsgICAgICAgICAgICAgICAgICAgIC8vIG5DMDAKKwl1aW50NjRfdCBsZW1FcnJvck1hc2s7ICAgICAgICAgICAgICAvLyBuQzE4CisJdWludDY0X3QgbGVtV09GOyAgICAgICAgICAgICAgICAgICAgLy8gbkM0MAorCXVpbnQ2NF90IHBoYkVycm9yU3RhdHVzOyAgICAgICAgICAgIC8vIG5DODAKKwl1aW50NjRfdCBwaGJGaXJzdEVycm9yU3RhdHVzOyAgICAgICAvLyBuQzg4CisJdWludDY0X3QgcGhiRXJyb3JMb2cwOyAgICAgICAgICAgICAgLy8gbkNDMAorCXVpbnQ2NF90IHBoYkVycm9yTG9nMTsgICAgICAgICAgICAgIC8vIG5DQzgKKwl1aW50NjRfdCBtbWlvRXJyb3JTdGF0dXM7ICAgICAgICAgICAvLyBuRDAwCisJdWludDY0X3QgbW1pb0ZpcnN0RXJyb3JTdGF0dXM7ICAgICAgLy8gbkQwOAorCXVpbnQ2NF90IG1taW9FcnJvckxvZzA7ICAgICAgICAgICAgIC8vIG5ENDAKKwl1aW50NjRfdCBtbWlvRXJyb3JMb2cxOyAgICAgICAgICAgICAvLyBuRDQ4CisJdWludDY0X3QgZG1hMEVycm9yU3RhdHVzOyAgICAgICAgICAgLy8gbkQ4MAorCXVpbnQ2NF90IGRtYTBGaXJzdEVycm9yU3RhdHVzOyAgICAgIC8vIG5EODgKKwl1aW50NjRfdCBkbWEwRXJyb3JMb2cwOyAgICAgICAgICAgICAvLyBuREMwCisJdWludDY0X3QgZG1hMEVycm9yTG9nMTsgICAgICAgICAgICAgLy8gbkRDOAorCXVpbnQ2NF90IGRtYTFFcnJvclN0YXR1czsgICAgICAgICAgIC8vIG5FMDAKKwl1aW50NjRfdCBkbWExRmlyc3RFcnJvclN0YXR1czsgICAgICAvLyBuRTA4CisJdWludDY0X3QgZG1hMUVycm9yTG9nMDsgICAgICAgICAgICAgLy8gbkU0MAorCXVpbnQ2NF90IGRtYTFFcnJvckxvZzE7ICAgICAgICAgICAgIC8vIG5FNDgKKwl1aW50NjRfdCBwZXN0QVtPUEFMX1A3SU9DX05VTV9QRVNUX1JFR1NdOworCXVpbnQ2NF90IHBlc3RCW09QQUxfUDdJT0NfTlVNX1BFU1RfUkVHU107Cit9OworCiB0eXBlZGVmIHN0cnVjdCBvcHBhbmVsX2xpbmUgewotCS8qIFhYWCAqLworCWNvbnN0IGNoYXIgKiAJbGluZTsKKwl1aW50NjRfdCAJbGluZV9sZW47CiB9IG9wcGFuZWxfbGluZV90OwogCiAvKiBBUEkgZnVuY3Rpb25zICovCkBAIC00MTMsNiArNTI3LDE1IEBACiAJCQkJCXVpbnQ2NF90IHBjaV9tZW1fc2l6ZSk7CiBpbnQ2NF90IG9wYWxfcGNpX3Jlc2V0KHVpbnQ2NF90IHBoYl9pZCwgdWludDhfdCByZXNldF9zY29wZSwgdWludDhfdCBhc3NlcnRfc3RhdGUpOwogCitpbnQ2NF90IG9wYWxfcGNpX2dldF9odWJfZGlhZ19kYXRhKHVpbnQ2NF90IGh1Yl9pZCwgdm9pZCAqZGlhZ19idWZmZXIsIHVpbnQ2NF90IGRpYWdfYnVmZmVyX2xlbik7CitpbnQ2NF90IG9wYWxfcGNpX2dldF9waGJfZGlhZ19kYXRhKHVpbnQ2NF90IHBoYl9pZCwgdm9pZCAqZGlhZ19idWZmZXIsIHVpbnQ2NF90IGRpYWdfYnVmZmVyX2xlbik7CitpbnQ2NF90IG9wYWxfcGNpX2ZlbmNlX3BoYih1aW50NjRfdCBwaGJfaWQpOworaW50NjRfdCBvcGFsX3BjaV9yZWluaXQodWludDY0X3QgcGhiX2lkLCB1aW50OF90IHJlaW5pdF9zY29wZSk7CitpbnQ2NF90IG9wYWxfcGNpX21hc2tfcGVfZXJyb3IodWludDY0X3QgcGhiX2lkLCB1aW50MTZfdCBwZV9udW1iZXIsIHVpbnQ4X3QgZXJyb3JfdHlwZSwgdWludDhfdCBtYXNrX2FjdGlvbik7CitpbnQ2NF90IG9wYWxfc2V0X3Nsb3RfbGVkX3N0YXR1cyh1aW50NjRfdCBwaGJfaWQsIHVpbnQ2NF90IHNsb3RfaWQsIHVpbnQ4X3QgbGVkX3R5cGUsIHVpbnQ4X3QgbGVkX2FjdGlvbik7CitpbnQ2NF90IG9wYWxfZ2V0X2Vwb3dfc3RhdHVzKHVpbnQ2NF90ICpzdGF0dXMpOworaW50NjRfdCBvcGFsX3NldF9zeXN0ZW1fYXR0ZW50aW9uX2xlZCh1aW50OF90IGxlZF9hY3Rpb24pOworCiAvKiBJbnRlcm5hbCBmdW5jdGlvbnMgKi8KIGV4dGVybiBpbnQgZWFybHlfaW5pdF9kdF9zY2FuX29wYWwodW5zaWduZWQgbG9uZyBub2RlLCBjb25zdCBjaGFyICp1bmFtZSwgaW50IGRlcHRoLCB2b2lkICpkYXRhKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKaW5kZXggMTc3MjJjNy4uMjY5YzA1YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCkBAIC0xMzUsNiArMTM1LDcgQEAKIAl1OCBoYXJkX2VuYWJsZWQ7CQkvKiBzZXQgaWYgaXJxcyBhcmUgZW5hYmxlZCBpbiBNU1IgKi8KIAl1OCBpb19zeW5jOwkJCS8qIHdyaXRlbCgpIG5lZWRzIHNwaW5fdW5sb2NrIHN5bmMgKi8KIAl1OCBpcnFfd29ya19wZW5kaW5nOwkJLyogSVJRX1dPUksgaW50ZXJydXB0IHdoaWxlIHNvZnQtZGlzYWJsZSAqLworCXU4IG5hcF9zdGF0ZV9sb3N0OwkJLyogTlYgR1BSIHZhbHVlcyBsb3N0IGluIHBvd2VyN19pZGxlICovCiAKICNpZmRlZiBDT05GSUdfUFBDX1BPV0VSTlYKIAkvKiBQb2ludGVyIHRvIE9QQUwgbWFjaGluZSBjaGVjayBldmVudCBzdHJ1Y3R1cmUgc2V0IGJ5IHRoZQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlLmgKaW5kZXggZGQ5YzRmZC4uZjA3MmU5NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2UuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZS5oCkBAIC05MiwyMCArOTIsMzQgQEAKICNkZWZpbmUgUEFHRV9PRkZTRVQJQVNNX0NPTlNUKENPTkZJR19QQUdFX09GRlNFVCkKICNkZWZpbmUgTE9BRF9PRkZTRVQJQVNNX0NPTlNUKChDT05GSUdfS0VSTkVMX1NUQVJULUNPTkZJR19QSFlTSUNBTF9TVEFSVCkpCiAKLSNpZiBkZWZpbmVkKENPTkZJR19SRUxPQ0FUQUJMRSkKKyNpZiBkZWZpbmVkKENPTkZJR19OT05TVEFUSUNfS0VSTkVMKQogI2lmbmRlZiBfX0FTU0VNQkxZX18KIAogZXh0ZXJuIHBoeXNfYWRkcl90IG1lbXN0YXJ0X2FkZHI7CiBleHRlcm4gcGh5c19hZGRyX3Qga2VybnN0YXJ0X2FkZHI7CisKKyNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEVfUFBDMzIKK2V4dGVybiBsb25nIGxvbmcgdmlydF9waHlzX29mZnNldDsKICNlbmRpZgorCisjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAjZGVmaW5lIFBIWVNJQ0FMX1NUQVJUCWtlcm5zdGFydF9hZGRyCi0jZWxzZQorCisjZWxzZQkvKiAhQ09ORklHX05PTlNUQVRJQ19LRVJORUwgKi8KICNkZWZpbmUgUEhZU0lDQUxfU1RBUlQJQVNNX0NPTlNUKENPTkZJR19QSFlTSUNBTF9TVEFSVCkKICNlbmRpZgogCisvKiBTZWUgRGVzY3JpcHRpb24gYmVsb3cgZm9yIFZJUlRfUEhZU19PRkZTRVQgKi8KKyNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEVfUFBDMzIKKyNkZWZpbmUgVklSVF9QSFlTX09GRlNFVCB2aXJ0X3BoeXNfb2Zmc2V0CisjZWxzZQorI2RlZmluZSBWSVJUX1BIWVNfT0ZGU0VUIChLRVJORUxCQVNFIC0gUEhZU0lDQUxfU1RBUlQpCisjZW5kaWYKKworCiAjaWZkZWYgQ09ORklHX1BQQzY0CiAjZGVmaW5lIE1FTU9SWV9TVEFSVAkwVUwKLSNlbGlmIGRlZmluZWQoQ09ORklHX1JFTE9DQVRBQkxFKQorI2VsaWYgZGVmaW5lZChDT05GSUdfTk9OU1RBVElDX0tFUk5FTCkKICNkZWZpbmUgTUVNT1JZX1NUQVJUCW1lbXN0YXJ0X2FkZHIKICNlbHNlCiAjZGVmaW5lIE1FTU9SWV9TVEFSVAkoUEhZU0lDQUxfU1RBUlQgKyBQQUdFX09GRlNFVCAtIEtFUk5FTEJBU0UpCkBAIC0xMjUsMTIgKzEzOSw3NyBAQAogICogZGV0ZXJtaW5lIE1FTU9SWV9TVEFSVCB1bnRpbCB0aGVuLiAgSG93ZXZlciB3ZSBjYW4gZGV0ZXJtaW5lIFBIWVNJQ0FMX1NUQVJUCiAgKiBmcm9tIGluZm9ybWF0aW9uIGF0IGhhbmQgKHByb2dyYW0gY291bnRlciwgVExCIGxvb2t1cCkuCiAgKgorICogT24gQm9va0Ugd2l0aCBSRUxPQ0FUQUJMRSAoUkVMT0NBVEFCTEVfUFBDMzIpCisgKgorICogICBXaXRoIFJFTE9DQVRBQkxFX1BQQzMyLCAgd2Ugc3VwcG9ydCBsb2FkaW5nIHRoZSBrZXJuZWwgYXQgYW55IHBoeXNpY2FsIAorICogICBhZGRyZXNzIHdpdGhvdXQgYW55IHJlc3RyaWN0aW9uIG9uIHRoZSBwYWdlIGFsaWdubWVudC4KKyAqCisgKiAgIFdlIGZpbmQgdGhlIHJ1bnRpbWUgYWRkcmVzcyBvZiBfc3RleHQgYW5kIHJlbG9jYXRlIG91cnNlbHZlcyBiYXNlZCBvbiAKKyAqICAgdGhlIGZvbGxvd2luZyBjYWxjdWxhdGlvbjoKKyAqCisgKiAgCSAgdmlydHVhbF9iYXNlID0gQUxJR05fRE9XTihLRVJORUxCQVNFLDI1Nk0pICsKKyAqICAJCQkJTU9EVUxPKF9zdGV4dC5ydW4sMjU2TSkKKyAqICAgYW5kIGNyZWF0ZSB0aGUgZm9sbG93aW5nIG1hcHBpbmc6CisgKgorICogCSAgQUxJR05fRE9XTihfc3RleHQucnVuLDI1Nk0pID0+IEFMSUdOX0RPV04oS0VSTkVMQkFTRSwyNTZNKQorICoKKyAqICAgV2hlbiB3ZSBwcm9jZXNzIHJlbG9jYXRpb25zLCB3ZSBjYW5ub3QgZGVwZW5kIG9uIHRoZQorICogICBleGlzdGluZyBlcXVhdGlvbiBmb3IgdGhlIF9fdmEoKS9fX3BhKCkgdHJhbnNsYXRpb25zOgorICoKKyAqIAkgICBfX3ZhKHgpID0gKHgpICAtIFBIWVNJQ0FMX1NUQVJUICsgS0VSTkVMQkFTRQorICoKKyAqICAgV2hlcmU6CisgKiAgIAkgUEhZU0lDQUxfU1RBUlQgPSBrZXJuc3RhcnRfYWRkciA9IFBoeXNpY2FsIGFkZHJlc3Mgb2YgX3N0ZXh0CisgKiAgCSBLRVJORUxCQVNFID0gQ29tcGlsZWQgdmlydHVhbCBhZGRyZXNzIG9mIF9zdGV4dC4KKyAqCisgKiAgIFRoaXMgZm9ybXVsYSBob2xkcyB0cnVlIGlmZiwga2VybmVsIGxvYWQgYWRkcmVzcyBpcyBUTEIgcGFnZSBhbGlnbmVkLgorICoKKyAqICAgSW4gb3VyIGNhc2UsIHdlIG5lZWQgdG8gYWxzbyBhY2NvdW50IGZvciB0aGUgc2hpZnQgaW4gdGhlIGtlcm5lbCBWaXJ0dWFsIAorICogICBhZGRyZXNzLgorICoKKyAqICAgRS5nLiwKKyAqCisgKiAgIExldCB0aGUga2VybmVsIGJlIGxvYWRlZCBhdCA2NE1CIGFuZCBLRVJORUxCQVNFIGJlIDB4YzAwMDAwMDAgKHNhbWUgYXMgUEFHRV9PRkZTRVQpLgorICogICBJbiB0aGlzIGNhc2UsIHdlIHdvdWxkIGJlIG1hcHBpbmcgMCB0byAweGMwMDAwMDAwLCBhbmQga2VybnN0YXJ0X2FkZHIgPSA2NE0KKyAqCisgKiAgIE5vdyBfX3ZhKDFNQikgPSAoMHgxMDAwMDApIC0gKDB4NDAwMDAwMCkgKyAweGMwMDAwMDAwCisgKiAgICAgICAgICAgICAgICAgPSAweGJjMTAwMDAwICwgd2hpY2ggaXMgd3JvbmcuCisgKgorICogICBSYXRoZXIsIGl0IHNob3VsZCBiZSA6IDB4YzAwMDAwMDAgKyAweDEwMDAwMCA9IDB4YzAxMDAwMDAKKyAqICAgICAgCWFjY29yZGluZyB0byBvdXIgbWFwcGluZy4KKyAqCisgKiAgIEhlbmNlIHdlIHVzZSB0aGUgZm9sbG93aW5nIGZvcm11bGEgdG8gZ2V0IHRoZSB0cmFuc2xhdGlvbnMgcmlnaHQ6CisgKgorICogCSAgX192YSh4KSA9ICh4KSAtIFsgUEhZU0lDQUxfU1RBUlQgLSBFZmZlY3RpdmUgS0VSTkVMQkFTRSBdCisgKgorICogCSAgV2hlcmUgOgorICogCQlQSFlTSUNBTF9TVEFSVCA9IGR5bmFtaWMgbG9hZCBhZGRyZXNzLihrZXJuc3RhcnRfYWRkciB2YXJpYWJsZSkKKyAqIAkJRWZmZWN0aXZlIEtFUk5FTEJBU0UgPSB2aXJ0dWFsX2Jhc2UgPQorICogCQkJCSAgICAgPSBBTElHTl9ET1dOKEtFUk5FTEJBU0UsMjU2TSkgKworICogCQkJCQkJTU9EVUxPKFBIWVNJQ0FMX1NUQVJULDI1Nk0pCisgKgorICogCVRvIG1ha2UgdGhlIGNvc3Qgb2YgX192YSgpIC8gX19wYSgpIG1vcmUgbGlnaHQgd2VpZ2h0LCB3ZSBpbnRyb2R1Y2UKKyAqIAlhIG5ldyB2YXJpYWJsZSB2aXJ0X3BoeXNfb2Zmc2V0LCB3aGljaCB3aWxsIGhvbGQgOgorICoKKyAqIAl2aXJ0X3BoeXNfb2Zmc2V0ID0gRWZmZWN0aXZlIEtFUk5FTEJBU0UgLSBQSFlTSUNBTF9TVEFSVAorICogCQkJID0gQUxJR05fRE9XTihLRVJORUxCQVNFLDI1Nk0pIC0gCisgKiAJCQkgCUFMSUdOX0RPV04oUEhZU0lDQUxTVEFSVCwyNTZNKQorICoKKyAqIAlIZW5jZSA6CisgKgorICogCV9fdmEoeCkgPSB4IC0gUEhZU0lDQUxfU1RBUlQgKyBFZmZlY3RpdmUgS0VSTkVMQkFTRQorICogCQk9IHggKyB2aXJ0X3BoeXNfb2Zmc2V0CisgKgorICogCQlhbmQKKyAqIAlfX3BhKHgpID0geCArIFBIWVNJQ0FMX1NUQVJUIC0gRWZmZWN0aXZlIEtFUk5FTEJBU0UKKyAqIAkJPSB4IC0gdmlydF9waHlzX29mZnNldAorICogCQkKICAqIE9uIG5vbi1Cb29rLUUgUFBDNjQgUEFHRV9PRkZTRVQgYW5kIE1FTU9SWV9TVEFSVCBhcmUgY29uc3RhbnRzIHNvIHVzZQogICogdGhlIG90aGVyIGRlZmluaXRpb25zIGZvciBfX3ZhICYgX19wYS4KICAqLwogI2lmZGVmIENPTkZJR19CT09LRQotI2RlZmluZSBfX3ZhKHgpICgodm9pZCAqKSh1bnNpZ25lZCBsb25nKSgocGh5c19hZGRyX3QpKHgpIC0gUEhZU0lDQUxfU1RBUlQgKyBLRVJORUxCQVNFKSkKLSNkZWZpbmUgX19wYSh4KSAoKHVuc2lnbmVkIGxvbmcpKHgpICsgUEhZU0lDQUxfU1RBUlQgLSBLRVJORUxCQVNFKQorI2RlZmluZSBfX3ZhKHgpICgodm9pZCAqKSh1bnNpZ25lZCBsb25nKSgocGh5c19hZGRyX3QpKHgpICsgVklSVF9QSFlTX09GRlNFVCkpCisjZGVmaW5lIF9fcGEoeCkgKCh1bnNpZ25lZCBsb25nKSh4KSAtIFZJUlRfUEhZU19PRkZTRVQpCiAjZWxzZQogI2RlZmluZSBfX3ZhKHgpICgodm9pZCAqKSh1bnNpZ25lZCBsb25nKSgocGh5c19hZGRyX3QpKHgpICsgUEFHRV9PRkZTRVQgLSBNRU1PUllfU1RBUlQpKQogI2RlZmluZSBfX3BhKHgpICgodW5zaWduZWQgbG9uZykoeCkgLSBQQUdFX09GRlNFVCArIE1FTU9SWV9TVEFSVCkKQEAgLTI5MCw2ICszNjksNyBAQAogZXh0ZXJuIHZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgdmFkZHIsCiAJCXN0cnVjdCBwYWdlICpwKTsKIGV4dGVybiBpbnQgcGFnZV9pc19yYW0odW5zaWduZWQgbG9uZyBwZm4pOworZXh0ZXJuIGludCBkZXZtZW1faXNfYWxsb3dlZCh1bnNpZ25lZCBsb25nIHBmbik7CiAKICNpZmRlZiBDT05GSUdfUFBDX1NNTFBBUgogdm9pZCBhcmNoX2ZyZWVfcGFnZShzdHJ1Y3QgcGFnZSAqcGFnZSwgaW50IG9yZGVyKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFnZV82NC5oCmluZGV4IGZiNDBlZGUuLmZlZDg1ZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWdlXzY0LmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhZ2VfNjQuaApAQCAtMTMwLDcgKzEzMCw5IEBACiAKICNpZmRlZiBDT05GSUdfSFVHRVRMQl9QQUdFCiAKKyNpZmRlZiBDT05GSUdfUFBDX01NX1NMSUNFUwogI2RlZmluZSBIQVZFX0FSQ0hfSFVHRVRMQl9VTk1BUFBFRF9BUkVBCisjZW5kaWYKIAogI2VuZGlmIC8qICFDT05GSUdfSFVHRVRMQl9QQUdFICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLWJyaWRnZS5oCmluZGV4IDU2Yjg3OWEuLjg4MmI2YWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2UuaApAQCAtMTUzLDggKzE1Myw4IEBACiAKIAlpbnQJcGNpX2V4dF9jb25maWdfc3BhY2U7CS8qIGZvciBwY2kgZGV2aWNlcyAqLwogCi0jaWZkZWYgQ09ORklHX0VFSAogCXN0cnVjdAlwY2lfZGV2ICpwY2lkZXY7CS8qIGJhY2stcG9pbnRlciB0byB0aGUgcGNpIGRldmljZSAqLworI2lmZGVmIENPTkZJR19FRUgKIAlpbnQJY2xhc3NfY29kZTsJCS8qIHBjaSBkZXZpY2UgY2xhc3MgKi8KIAlpbnQJZWVoX21vZGU7CQkvKiBTZWUgZWVoLmggZm9yIHBvc3NpYmxlIEVFSF9NT0RFcyAqLwogCWludAllZWhfY29uZmlnX2FkZHI7CkBAIC0xNjQsNiArMTY0LDEwIEBACiAJaW50CWVlaF9mYWxzZV9wb3NpdGl2ZXM7CS8qICMgdGltZXMgdGhpcyBkZXZpY2UgcmVwb3J0ZWQgI2ZmJ3MgKi8KIAl1MzIJY29uZmlnX3NwYWNlWzE2XTsJLyogc2F2ZWQgUENJIGNvbmZpZyBzcGFjZSAqLwogI2VuZGlmCisjZGVmaW5lIElPREFfSU5WQUxJRF9QRQkJKC0xKQorI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVgorCWludAlwZV9udW1iZXI7CisjZW5kaWYKIH07CiAKIC8qIEdldCB0aGUgcG9pbnRlciB0byBhIGRldmljZV9ub2RlJ3MgcGNpX2RuICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGNpLmgKaW5kZXggNDljM2RlNS4uMWM5MjAxMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BjaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wY2kuaApAQCAtMTg0LDggKzE4NCw2IEBACiBleHRlcm4gdm9pZCBvZl9zY2FuX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBwY2lfYnVzICpidXMpOwogZXh0ZXJuIHZvaWQgb2ZfcmVzY2FuX2J1cyhzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUsIHN0cnVjdCBwY2lfYnVzICpidXMpOwogCi1leHRlcm4gaW50IHBjaV9yZWFkX2lycV9saW5lKHN0cnVjdCBwY2lfZGV2ICpkZXYpOwotCiBzdHJ1Y3QgZmlsZTsKIGV4dGVybiBwZ3Byb3RfdAlwY2lfcGh5c19tZW1fYWNjZXNzX3Byb3Qoc3RydWN0IGZpbGUgKmZpbGUsCiAJCQkJCSB1bnNpZ25lZCBsb25nIHBmbiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGd0YWJsZS5oCmluZGV4IDg4YjBiZDkuLjJlMGU0MTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BndGFibGUuaApAQCAtMTcwLDYgKzE3MCw5IEBACiAjZGVmaW5lIHBncHJvdF9jYWNoZWRfd3RocnUocHJvdCkgKF9fcGdwcm90KChwZ3Byb3RfdmFsKHByb3QpICYgfl9QQUdFX0NBQ0hFX0NUTCkgfCBcCiAJCQkJICAgICAgICAgICAgX1BBR0VfQ09IRVJFTlQgfCBfUEFHRV9XUklURVRIUlUpKQogCisjZGVmaW5lIHBncHJvdF9jYWNoZWRfbm9uY29oZXJlbnQocHJvdCkgXAorCQkoX19wZ3Byb3QocGdwcm90X3ZhbChwcm90KSAmIH5fUEFHRV9DQUNIRV9DVEwpKQorCiAjZGVmaW5lIHBncHJvdF93cml0ZWNvbWJpbmUgcGdwcm90X25vbmNhY2hlZF93YwogCiBzdHJ1Y3QgZmlsZTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wcm9jZXNzb3IuaAppbmRleCBlYjExYTQ0Li5iNTg1YmZmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oCkBAIC0zODIsNiArMzgyLDkgQEAKIH0KICNlbmRpZgogCitleHRlcm4gdW5zaWduZWQgbG9uZyBjcHVpZGxlX2Rpc2FibGU7CitlbnVtIGlkbGVfYm9vdF9vdmVycmlkZSB7SURMRV9OT19PVkVSUklERSA9IDAsIElETEVfUE9XRVJTQVZFX09GRn07CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAjZW5kaWYgLyogX0FTTV9QT1dFUlBDX1BST0NFU1NPUl9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKaW5kZXggNTU5ZGExOS4uN2ZkYzJjMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaApAQCAtOTUxLDYgKzk1MSw3IEBACiAjZGVmaW5lIFBWUl80MDNHQ1gJMHgwMDIwMTQwMAogI2RlZmluZSBQVlJfNDA1R1AJMHg0MDExMDAwMAogI2RlZmluZSBQVlJfNDc2CQkweDExYTUyMDAwCisjZGVmaW5lIFBWUl80NzZGUEUJMHg3ZmY1MDAwMAogI2RlZmluZSBQVlJfU1RCMDNYWFgJMHg0MDMxMDAwMAogI2RlZmluZSBQVlJfTlA0MDVICTB4NDE0MTAwMDAKICNkZWZpbmUgUFZSX05QNDA1TAkweDQxNjEwMDAwCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnX2Jvb2tlLmgKaW5kZXggMDNjNDhlOC4uNTAwZmUxZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZ19ib29rZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWdfYm9va2UuaApAQCAtMTg3LDYgKzE4NywxMCBAQAogI2RlZmluZSBTUFJOX0NTUlIxCVNQUk5fU1JSMyAvKiBDcml0aWNhbCBTYXZlIGFuZCBSZXN0b3JlIFJlZ2lzdGVyIDEgKi8KICNlbmRpZgogCisjaWZkZWYgQ09ORklHX1BQQ19JQ1NXWAorI2RlZmluZSBTUFJOX0hBQ09QCTB4MTVGCS8qIEh5cGVydmlzb3IgQXZhaWxhYmxlIENvcHJvY2Vzc29yIFJlZ2lzdGVyICovCisjZW5kaWYKKwogLyogQml0IGRlZmluaXRpb25zIGZvciBDQ1IxLiAqLwogI2RlZmluZQlDQ1IxX0RQQwkweDAwMDAwMTAwIC8qIERpc2FibGUgTDEgSS1DYWNoZS9ELUNhY2hlIHBhcml0eSBjaGVja2luZyAqLwogI2RlZmluZQlDQ1IxX1RDUwkweDAwMDAwMDgwIC8qIFRpbWVyIENsb2NrIFNlbGVjdCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3J0YXMuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9ydGFzLmgKaW5kZXggNDFmNjlhZS4uMDFjMTQzYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3J0YXMuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcnRhcy5oCkBAIC0yNDUsNiArMjQ1LDEyIEBACiAKIGV4dGVybiB2b2lkIHBTZXJpZXNfbG9nX2Vycm9yKGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGVycl90eXBlLCBpbnQgZmF0YWwpOwogCisjaWZkZWYgQ09ORklHX1BQQ19SVEFTX0RBRU1PTgorZXh0ZXJuIHZvaWQgcnRhc19jYW5jZWxfZXZlbnRfc2Nhbih2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcnRhc19jYW5jZWxfZXZlbnRfc2Nhbih2b2lkKSB7IH0KKyNlbmRpZgorCiAvKiBFcnJvciB0eXBlcyBsb2dnZWQuICAqLwogI2RlZmluZSBFUlJfRkxBR19BTFJFQURZX0xPR0dFRAkweDAKICNkZWZpbmUgRVJSX0ZMQUdfQk9PVAkJMHgxIAkvKiBsb2cgd2FzIHB1bGxlZCBmcm9tIE5WUkFNIG9uIGJvb3QgKi8KQEAgLTMwNyw1ICszMTMsMTcgQEAKIGV4dGVybiB2b2lkIF9fY3B1aW5pdCBydGFzX2dpdmVfdGltZWJhc2Uodm9pZCk7CiBleHRlcm4gdm9pZCBfX2NwdWluaXQgcnRhc190YWtlX3RpbWViYXNlKHZvaWQpOwogCisjaWZkZWYgQ09ORklHX1BQQ19SVEFTCitzdGF0aWMgaW5saW5lIGludCBwYWdlX2lzX3J0YXNfdXNlcl9idWYodW5zaWduZWQgbG9uZyBwZm4pCit7CisJdW5zaWduZWQgbG9uZyBwYWRkciA9IChwZm4gPDwgUEFHRV9TSElGVCk7CisJaWYgKHBhZGRyID49IHJ0YXNfcm1vX2J1ZiAmJiBwYWRkciA8IChydGFzX3Jtb19idWYgKyBSVEFTX1JNT0JVRl9NQVgpKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBwYWdlX2lzX3J0YXNfdXNlcl9idWYodW5zaWduZWQgbG9uZyBwZm4pIHsgcmV0dXJuIDA7fQorI2VuZGlmCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX1BPV0VSUENfUlRBU19IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcndzZW0uaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yd3NlbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjFlMmNkLi4wMDAwMDAwCi0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yd3NlbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLSNpZm5kZWYgX0FTTV9QT1dFUlBDX1JXU0VNX0gKLSNkZWZpbmUgX0FTTV9QT1dFUlBDX1JXU0VNX0gKLQotI2lmbmRlZiBfTElOVVhfUldTRU1fSAotI2Vycm9yICJQbGVhc2UgZG9uJ3QgaW5jbHVkZSA8YXNtL3J3c2VtLmg+IGRpcmVjdGx5LCB1c2UgPGxpbnV4L3J3c2VtLmg+IGluc3RlYWQuIgotI2VuZGlmCi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLS8qCi0gKiBSL1cgc2VtYXBob3JlcyBmb3IgUFBDIHVzaW5nIHRoZSBzdHVmZiBpbiBsaWIvcndzZW0uYy4KLSAqIEFkYXB0ZWQgbGFyZ2VseSBmcm9tIGluY2x1ZGUvYXNtLWkzODYvcndzZW0uaAotICogYnkgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+LgotICovCi0KLS8qCi0gKiB0aGUgc2VtYXBob3JlIGRlZmluaXRpb24KLSAqLwotI2lmZGVmIENPTkZJR19QUEM2NAotIyBkZWZpbmUgUldTRU1fQUNUSVZFX01BU0sJCTB4ZmZmZmZmZmZMCi0jZWxzZQotIyBkZWZpbmUgUldTRU1fQUNUSVZFX01BU0sJCTB4MDAwMGZmZmZMCi0jZW5kaWYKLQotI2RlZmluZSBSV1NFTV9VTkxPQ0tFRF9WQUxVRQkJMHgwMDAwMDAwMEwKLSNkZWZpbmUgUldTRU1fQUNUSVZFX0JJQVMJCTB4MDAwMDAwMDFMCi0jZGVmaW5lIFJXU0VNX1dBSVRJTkdfQklBUwkJKC1SV1NFTV9BQ1RJVkVfTUFTSy0xKQotI2RlZmluZSBSV1NFTV9BQ1RJVkVfUkVBRF9CSUFTCQlSV1NFTV9BQ1RJVkVfQklBUwotI2RlZmluZSBSV1NFTV9BQ1RJVkVfV1JJVEVfQklBUwkJKFJXU0VNX1dBSVRJTkdfQklBUyArIFJXU0VNX0FDVElWRV9CSUFTKQotCi0vKgotICogbG9jayBmb3IgcmVhZGluZwotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX19kb3duX3JlYWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQotewotCWlmICh1bmxpa2VseShhdG9taWNfbG9uZ19pbmNfcmV0dXJuKChhdG9taWNfbG9uZ190ICopJnNlbS0+Y291bnQpIDw9IDApKQotCQlyd3NlbV9kb3duX3JlYWRfZmFpbGVkKHNlbSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IF9fZG93bl9yZWFkX3RyeWxvY2soc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQotewotCWxvbmcgdG1wOwotCi0Jd2hpbGUgKCh0bXAgPSBzZW0tPmNvdW50KSA+PSAwKSB7Ci0JCWlmICh0bXAgPT0gY21weGNoZygmc2VtLT5jb3VudCwgdG1wLAotCQkJCSAgIHRtcCArIFJXU0VNX0FDVElWRV9SRUFEX0JJQVMpKSB7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIGxvY2sgZm9yIHdyaXRpbmcKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fZG93bl93cml0ZV9uZXN0ZWQoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtLCBpbnQgc3ViY2xhc3MpCi17Ci0JbG9uZyB0bXA7Ci0KLQl0bXAgPSBhdG9taWNfbG9uZ19hZGRfcmV0dXJuKFJXU0VNX0FDVElWRV9XUklURV9CSUFTLAotCQkJCSAgICAgKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCk7Ci0JaWYgKHVubGlrZWx5KHRtcCAhPSBSV1NFTV9BQ1RJVkVfV1JJVEVfQklBUykpCi0JCXJ3c2VtX2Rvd25fd3JpdGVfZmFpbGVkKHNlbSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2Rvd25fd3JpdGUoc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQotewotCV9fZG93bl93cml0ZV9uZXN0ZWQoc2VtLCAwKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgX19kb3duX3dyaXRlX3RyeWxvY2soc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQotewotCWxvbmcgdG1wOwotCi0JdG1wID0gY21weGNoZygmc2VtLT5jb3VudCwgUldTRU1fVU5MT0NLRURfVkFMVUUsCi0JCSAgICAgIFJXU0VNX0FDVElWRV9XUklURV9CSUFTKTsKLQlyZXR1cm4gdG1wID09IFJXU0VNX1VOTE9DS0VEX1ZBTFVFOwotfQotCi0vKgotICogdW5sb2NrIGFmdGVyIHJlYWRpbmcKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fdXBfcmVhZChzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCi17Ci0JbG9uZyB0bXA7Ci0KLQl0bXAgPSBhdG9taWNfbG9uZ19kZWNfcmV0dXJuKChhdG9taWNfbG9uZ190ICopJnNlbS0+Y291bnQpOwotCWlmICh1bmxpa2VseSh0bXAgPCAtMSAmJiAodG1wICYgUldTRU1fQUNUSVZFX01BU0spID09IDApKQotCQlyd3NlbV93YWtlKHNlbSk7Ci19Ci0KLS8qCi0gKiB1bmxvY2sgYWZ0ZXIgd3JpdGluZwotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgX191cF93cml0ZShzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCi17Ci0JaWYgKHVubGlrZWx5KGF0b21pY19sb25nX3N1Yl9yZXR1cm4oUldTRU1fQUNUSVZFX1dSSVRFX0JJQVMsCi0JCQkJIChhdG9taWNfbG9uZ190ICopJnNlbS0+Y291bnQpIDwgMCkpCi0JCXJ3c2VtX3dha2Uoc2VtKTsKLX0KLQotLyoKLSAqIGltcGxlbWVudCBhdG9taWMgYWRkIGZ1bmN0aW9uYWxpdHkKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHJ3c2VtX2F0b21pY19hZGQobG9uZyBkZWx0YSwgc3RydWN0IHJ3X3NlbWFwaG9yZSAqc2VtKQotewotCWF0b21pY19sb25nX2FkZChkZWx0YSwgKGF0b21pY19sb25nX3QgKikmc2VtLT5jb3VudCk7Ci19Ci0KLS8qCi0gKiBkb3duZ3JhZGUgd3JpdGUgbG9jayB0byByZWFkIGxvY2sKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIF9fZG93bmdyYWRlX3dyaXRlKHN0cnVjdCByd19zZW1hcGhvcmUgKnNlbSkKLXsKLQlsb25nIHRtcDsKLQotCXRtcCA9IGF0b21pY19sb25nX2FkZF9yZXR1cm4oLVJXU0VNX1dBSVRJTkdfQklBUywKLQkJCQkgICAgIChhdG9taWNfbG9uZ190ICopJnNlbS0+Y291bnQpOwotCWlmICh0bXAgPCAwKQotCQlyd3NlbV9kb3duZ3JhZGVfd2FrZShzZW0pOwotfQotCi0vKgotICogaW1wbGVtZW50IGV4Y2hhbmdlIGFuZCBhZGQgZnVuY3Rpb25hbGl0eQotICovCi1zdGF0aWMgaW5saW5lIGxvbmcgcndzZW1fYXRvbWljX3VwZGF0ZShsb25nIGRlbHRhLCBzdHJ1Y3Qgcndfc2VtYXBob3JlICpzZW0pCi17Ci0JcmV0dXJuIGF0b21pY19sb25nX2FkZF9yZXR1cm4oZGVsdGEsIChhdG9taWNfbG9uZ190ICopJnNlbS0+Y291bnQpOwotfQotCi0jZW5kaWYJLyogX19LRVJORUxfXyAqLwotI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19SV1NFTV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggODY2Zjc2MC4uMmZjMmFmOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNjksNCArNjksNyBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19TT0NLRVRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RlbS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RlbS5oCmluZGV4IGUzMGExM2QuLmMzNzc0NTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0ZW0uaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGVtLmgKQEAgLTE5Myw4ICsxOTMsOCBAQAogZXh0ZXJuIHZvaWQgKmNhY2hlYWJsZV9tZW1jcHkodm9pZCAqLCBjb25zdCB2b2lkICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gaW50IGRvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKiwgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CiBleHRlcm4gdm9pZCBiYWRfcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqLCB1bnNpZ25lZCBsb25nLCBpbnQpOwotZXh0ZXJuIGludCBkaWUoY29uc3QgY2hhciAqLCBzdHJ1Y3QgcHRfcmVncyAqLCBsb25nKTsKIGV4dGVybiB2b2lkIF9leGNlcHRpb24oaW50LCBzdHJ1Y3QgcHRfcmVncyAqLCBpbnQsIHVuc2lnbmVkIGxvbmcpOworZXh0ZXJuIHZvaWQgZGllKGNvbnN0IGNoYXIgKiwgc3RydWN0IHB0X3JlZ3MgKiwgbG9uZyk7CiBleHRlcm4gdm9pZCBfbm1hc2tfYW5kX29yX21zcih1bnNpZ25lZCBsb25nIG5tYXNrLCB1bnNpZ25lZCBsb25nIG9yX3ZhbCk7CiAKICNpZmRlZiBDT05GSUdfQk9PS0VfV0RUCkBAIC0yMjEsNiArMjIxLDE1IEBACiBleHRlcm4gdm9pZCAqemFsbG9jX21heWJlX2Jvb3RtZW0oc2l6ZV90IHNpemUsIGdmcF90IG1hc2spOwogCiBleHRlcm4gaW50IHBvd2Vyc2F2ZV9uYXA7CS8qIHNldCBpZiBuYXAgbW9kZSBjYW4gYmUgdXNlZCBpbiBpZGxlIGxvb3AgKi8KK3ZvaWQgY3B1X2lkbGVfd2FpdCh2b2lkKTsKKworI2lmZGVmIENPTkZJR19QU0VSSUVTX0lETEUKK2V4dGVybiB2b2lkIHVwZGF0ZV9zbXRfc25vb3plX2RlbGF5KGludCBzbm9vemUpOworZXh0ZXJuIGludCBwc2VyaWVzX25vdGlmeV9jcHVpZGxlX2FkZF9jcHUoaW50IGNwdSk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9zbXRfc25vb3plX2RlbGF5KGludCBzbm9vemUpIHt9CitzdGF0aWMgaW5saW5lIGludCBwc2VyaWVzX25vdGlmeV9jcHVpZGxlX2FkZF9jcHUoaW50IGNwdSkgeyByZXR1cm4gMDsgfQorI2VuZGlmCiAKIC8qCiAgKiBBdG9taWMgZXhjaGFuZ2UKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90Y2UuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90Y2UuaAppbmRleCBmNjYzNjM0Li43NDNmMzZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdGNlLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RjZS5oCkBAIC0yNiwxMCArMjYsMTQgQEAKIAogLyoKICAqIFRjZXMgY29tZSBpbiB0d28gZm9ybWF0cywgb25lIGZvciB0aGUgdmlydHVhbCBidXMgYW5kIGEgZGlmZmVyZW50Ci0gKiBmb3JtYXQgZm9yIFBDSQorICogZm9ybWF0IGZvciBQQ0kuICBQQ0kgVENFcyBjYW4gaGF2ZSBoYXJkd2FyZSBvciBzb2Z0d2FyZSBtYWludGlhbmVkCisgKiBjb2hlcmVuY3kuCiAgKi8KLSNkZWZpbmUgVENFX1ZCICAwCi0jZGVmaW5lIFRDRV9QQ0kgMQorI2RlZmluZSBUQ0VfVkIJCQkwCisjZGVmaW5lIFRDRV9QQ0kJCQkxCisjZGVmaW5lIFRDRV9QQ0lfU1dJTlZfQ1JFQVRFCTIKKyNkZWZpbmUgVENFX1BDSV9TV0lOVl9GUkVFCTQKKyNkZWZpbmUgVENFX1BDSV9TV0lOVl9QQUlSCTgKIAogLyogVENFIHBhZ2Ugc2l6ZSBpcyA0MDk2IGJ5dGVzICgxIDw8IDEyKSAqLwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdGltZS5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3RpbWUuaAppbmRleCBmZTZmN2MyLi43ZWIxMGZiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdGltZS5oCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90aW1lLmgKQEAgLTIxOSw1ICsyMTksNyBAQAogZXh0ZXJuIHZvaWQgc2Vjb25kYXJ5X2NwdV90aW1lX2luaXQodm9pZCk7CiBleHRlcm4gdm9pZCBpU2VyaWVzX3RpbWVfaW5pdF9lYXJseSh2b2lkKTsKIAorREVDTEFSRV9QRVJfQ1BVKHU2NCwgZGVjcmVtZW50ZXJzX25leHRfdGIpOworCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fUE9XRVJQQ19USU1FX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS90eXBlcy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3R5cGVzLmgKaW5kZXggODk0N2I5OC4uZDgyZTk0ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3R5cGVzLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3R5cGVzLmgKQEAgLTUsOCArNSwxMSBAQAogICogVGhpcyBpcyBoZXJlIGJlY2F1c2Ugd2UgdXNlZCB0byB1c2UgbDY0IGZvciA2NGJpdCBwb3dlcnBjCiAgKiBhbmQgd2UgZG9uJ3Qgd2FudCB0byBpbXBhY3QgdXNlciBtb2RlIHdpdGggb3VyIGNoYW5nZSB0byBsbDY0CiAgKiBpbiB0aGUga2VybmVsLgorICoKKyAqIEhvd2V2ZXIsIHNvbWUgdXNlciBwcm9ncmFtcyBhcmUgZmluZSB3aXRoIHRoaXMuICBUaGV5IGNhbgorICogZmxhZyBfX1NBTkVfVVNFUlNQQUNFX1RZUEVTX18gdG8gZ2V0IGludC1sbDY0LmggaGVyZS4KICAqLwotI2lmIGRlZmluZWQoX19wb3dlcnBjNjRfXykgJiYgIWRlZmluZWQoX19LRVJORUxfXykKKyNpZiAhZGVmaW5lZChfX1NBTkVfVVNFUlNQQUNFX1RZUEVTX18pICYmIGRlZmluZWQoX19wb3dlcnBjNjRfXykgJiYgIWRlZmluZWQoX19LRVJORUxfXykKICMgaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW50LWw2NC5oPgogI2Vsc2UKICMgaW5jbHVkZSA8YXNtLWdlbmVyaWMvaW50LWxsNjQuaD4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCmluZGV4IGNlNGY3ZjEuLmVlNzI4ZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQpAQCAtODUsNiArODUsOCBAQAogZXh0cmEtJChDT05GSUdfOHh4KQkJOj0gaGVhZF84eHgubwogZXh0cmEteQkJCQkrPSB2bWxpbnV4LmxkcwogCitvYmotJChDT05GSUdfUkVMT0NBVEFCTEVfUFBDMzIpCSs9IHJlbG9jXzMyLm8KKwogb2JqLSQoQ09ORklHX1BQQzMyKQkJKz0gZW50cnlfMzIubyBzZXR1cF8zMi5vCiBvYmotJChDT05GSUdfUFBDNjQpCQkrPSBkbWEtaW9tbXUubyBpb21tdS5vCiBvYmotJChDT05GSUdfS0dEQikJCSs9IGtnZGIubwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCmluZGV4IDdjNTMyNGYuLjA0Y2FlZTcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKQEAgLTIwOCw2ICsyMDgsNyBAQAogCURFRklORShQQUNBX1VTRVJfVElNRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCB1c2VyX3RpbWUpKTsKIAlERUZJTkUoUEFDQV9TWVNURU1fVElNRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzeXN0ZW1fdGltZSkpOwogCURFRklORShQQUNBX1RSQVBfU0FWRSwgb2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCB0cmFwX3NhdmUpKTsKKwlERUZJTkUoUEFDQV9OQVBTVEFURUxPU1QsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgbmFwX3N0YXRlX2xvc3QpKTsKICNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KIAogCS8qIFJUQVMgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX2EyLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdV9zZXR1cF9hMi5TCmluZGV4IDdmODE4ZmUuLmViYzYyZjQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1X3NldHVwX2EyLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHVfc2V0dXBfYTIuUwpAQCAtNDEsMTEgKzQxLDE2IEBACiAJICogY29yZSBsb2NhbCBidXQgZG9pbmcgaXQgYWx3YXlzIHdvbid0IGh1cnQKIAkgKi8KIAotI2lmZGVmIENPTkZJR19QUENfV1NQX0NPUFJPCisjaWZkZWYgQ09ORklHX1BQQ19JQ1NXWAogCS8qIE1ha2Ugc3VyZSBBQ09QIHN0YXJ0cyBvdXQgYXMgemVybyAqLwogCWxpCXIzLDAKIAltdHNwciAgIFNQUk5fQUNPUCxyMwogCisJLyogU2tpcCB0aGUgZm9sbG93aW5nIGlmIHdlIGFyZSBpbiBHdWVzdCBtb2RlICovCisJbWZtc3IJcjMKKwlhbmRpcy4JcjAscjMsTVNSX0dTQGgKKwlibmUJX2ljc3d4X3NraXBfZ3Vlc3QKKwogCS8qIEVuYWJsZSBpY3N3eCBpbnN0cnVjdGlvbiAqLwogCW1mc3ByICAgcjMsU1BSTl9BMl9DQ1IyCiAJb3JpICAgICByMyxyMyxBMl9DQ1IyX0VOQUJMRV9JQ1NXWApAQCAtNTQsNyArNTksOCBAQAogCS8qIFVubWFzayBhbGwgQ1RzIGluIEhBQ09QICovCiAJbGkgICAgICByMywtMQogCW10c3ByICAgU1BSTl9IQUNPUCxyMwotI2VuZGlmIC8qIENPTkZJR19QUENfV1NQX0NPUFJPICovCitfaWNzd3hfc2tpcF9ndWVzdDoKKyNlbmRpZiAvKiBDT05GSUdfUFBDX0lDU1dYICovCiAKIAkvKiBFbmFibGUgZG9vcmJlbGwgKi8KIAltZnNwciAgIHIzLFNQUk5fQTJfQ0NSMgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcHV0YWJsZS5jCmluZGV4IGVkYWU1YmIuLjgxZGI5ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3B1dGFibGUuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NwdXRhYmxlLmMKQEAgLTE1MDUsNiArMTUwNSwxOSBAQAogCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrXzR4eCwKIAkJLnBsYXRmb3JtCQk9ICJwcGM0MDUiLAogCX0sCisJewkvKiBBUE04MDE4WCAqLworCQkucHZyX21hc2sJCT0gMHhmZmZmMDAwMCwKKwkJLnB2cl92YWx1ZQkJPSAweDdmZjExNDMyLAorCQkuY3B1X25hbWUJCT0gIkFQTTgwMThYIiwKKwkJLmNwdV9mZWF0dXJlcwkJPSBDUFVfRlRSU180MFgsCisJCS5jcHVfdXNlcl9mZWF0dXJlcwk9IFBQQ19GRUFUVVJFXzMyIHwKKwkJCVBQQ19GRUFUVVJFX0hBU19NTVUgfCBQUENfRkVBVFVSRV9IQVNfNHh4TUFDLAorCQkubW11X2ZlYXR1cmVzCQk9IE1NVV9GVFJfVFlQRV80MHgsCisJCS5pY2FjaGVfYnNpemUJCT0gMzIsCisJCS5kY2FjaGVfYnNpemUJCT0gMzIsCisJCS5tYWNoaW5lX2NoZWNrCQk9IG1hY2hpbmVfY2hlY2tfNHh4LAorCQkucGxhdGZvcm0JCT0gInBwYzQwNSIsCisJfSwKIAl7CS8qIGRlZmF1bHQgbWF0Y2ggKi8KIAkJLnB2cl9tYXNrCQk9IDB4MDAwMDAwMDAsCiAJCS5wdnJfdmFsdWUJCT0gMHgwMDAwMDAwMCwKQEAgLTE4MzAsNiArMTg0MywyMCBAQAogCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrXzQ3eCwKIAkJLnBsYXRmb3JtCQk9ICJwcGM0NzAiLAogCX0sCisJeyAvKiA0NzZmcGUgKi8KKwkJLnB2cl9tYXNrCQk9IDB4ZmZmZjAwMDAsCisJCS5wdnJfdmFsdWUJCT0gMHg3ZmY1MDAwMCwKKwkJLmNwdV9uYW1lCQk9ICI0NzZmcGUiLAorCQkuY3B1X2ZlYXR1cmVzCQk9IENQVV9GVFJTXzQ3WCB8IENQVV9GVFJfNDc2X0REMiwKKwkJLmNwdV91c2VyX2ZlYXR1cmVzCT0gQ09NTU9OX1VTRVJfQk9PS0UgfAorCQkJUFBDX0ZFQVRVUkVfSEFTX0ZQVSwKKwkJLm1tdV9mZWF0dXJlcwkJPSBNTVVfRlRSX1RZUEVfNDd4IHwKKwkJCU1NVV9GVFJfVVNFX1RMQklWQVhfQkNBU1QgfCBNTVVfRlRSX0xPQ0tfQkNBU1RfSU5WQUwsCisJCS5pY2FjaGVfYnNpemUJCT0gMzIsCisJCS5kY2FjaGVfYnNpemUJCT0gMTI4LAorCQkubWFjaGluZV9jaGVjawkJPSBtYWNoaW5lX2NoZWNrXzQ3eCwKKwkJLnBsYXRmb3JtCQk9ICJwcGM0NzAiLAorCX0sCiAJeyAvKiA0NzYgaXNzICovCiAJCS5wdnJfbWFzawkJPSAweGZmZmYwMDAwLAogCQkucHZyX3ZhbHVlCQk9IDB4MDAwNTAwMDAsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoLmMKaW5kZXggZDg3OTgwOS4uMjhiZTM0NSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9jcmFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2guYwpAQCAtMTAsODUgKzEwLDg1IEBACiAgKgogICovCiAKLSN1bmRlZiBERUJVRwotCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvcmVib290Lmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvY3Jhc2hfZHVtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvZWxmLmg+Ci0jaW5jbHVkZSA8bGludXgvZWxmY29yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL21hY2hkZXAuaD4KICNpbmNsdWRlIDxhc20va2V4ZWMuaD4KICNpbmNsdWRlIDxhc20va2R1bXAuaD4KICNpbmNsdWRlIDxhc20vcHJvbS5oPgotI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9zbXAuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3NldGptcC5oPgogCi0jaWZkZWYgREVCVUcKLSNpbmNsdWRlIDxhc20vdWRiZy5oPgotI2RlZmluZSBEQkcoZm10Li4uKSB1ZGJnX3ByaW50ZihmbXQpCi0jZWxzZQotI2RlZmluZSBEQkcoZm10Li4uKQotI2VuZGlmCisvKgorICogVGhlIHByaW1hcnkgQ1BVIHdhaXRzIGEgd2hpbGUgZm9yIGFsbCBzZWNvbmRhcnkgQ1BVcyB0byBlbnRlci4gVGhpcyBpcyB0bworICogYXZvaWQgc2VuZGluZyBhbiBJUEkgaWYgdGhlIHNlY29uZGFyeSBDUFVzIGFyZSBlbnRlcmluZworICogY3Jhc2hfa2V4ZWNfc2Vjb25kYXJ5IG9uIHRoZWlyIG93biAoZWcgdmlhIGEgc3lzdGVtIHJlc2V0KS4KKyAqCisgKiBUaGUgc2Vjb25kYXJ5IHRpbWVvdXQgaGFzIHRvIGJlIGxvbmdlciB0aGFuIHRoZSBwcmltYXJ5LiBCb3RoIHRpbWVvdXRzIGFyZQorICogaW4gbWlsbGlzZWNvbmRzLgorICovCisjZGVmaW5lIFBSSU1BUllfVElNRU9VVAkJNTAwCisjZGVmaW5lIFNFQ09OREFSWV9USU1FT1VUCTEwMDAKIAotLyogVGhpcyBrZWVwcyBhIHRyYWNrIG9mIHdoaWNoIG9uZSBpcyBjcmFzaGluZyBjcHUuICovCisjZGVmaW5lIElQSV9USU1FT1VUCQkxMDAwMAorI2RlZmluZSBSRUFMX01PREVfVElNRU9VVAkxMDAwMAorCisvKiBUaGlzIGtlZXBzIGEgdHJhY2sgb2Ygd2hpY2ggb25lIGlzIHRoZSBjcmFzaGluZyBjcHUuICovCiBpbnQgY3Jhc2hpbmdfY3B1ID0gLTE7Ci1zdGF0aWMgY3B1bWFza190IGNwdXNfaW5fY3Jhc2ggPSBDUFVfTUFTS19OT05FOwotY3B1bWFza190IGNwdXNfaW5fc3IgPSBDUFVfTUFTS19OT05FOworc3RhdGljIGF0b21pY190IGNwdXNfaW5fY3Jhc2g7CitzdGF0aWMgaW50IHRpbWVfdG9fZHVtcDsKIAogI2RlZmluZSBDUkFTSF9IQU5ETEVSX01BWCAzCiAvKiBOVUxMIHRlcm1pbmF0ZWQgbGlzdCBvZiBzaHV0ZG93biBoYW5kbGVzICovCiBzdGF0aWMgY3Jhc2hfc2h1dGRvd25fdCBjcmFzaF9zaHV0ZG93bl9oYW5kbGVzW0NSQVNIX0hBTkRMRVJfTUFYKzFdOwogc3RhdGljIERFRklORV9TUElOTE9DSyhjcmFzaF9oYW5kbGVyc19sb2NrKTsKIAorc3RhdGljIHVuc2lnbmVkIGxvbmcgY3Jhc2hfc2h1dGRvd25fYnVmW0pNUF9CVUZfTEVOXTsKK3N0YXRpYyBpbnQgY3Jhc2hfc2h1dGRvd25fY3B1ID0gLTE7CisKK3N0YXRpYyBpbnQgaGFuZGxlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCWlmIChjcmFzaF9zaHV0ZG93bl9jcHUgPT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQorCQlsb25nam1wKGNyYXNoX3NodXRkb3duX2J1ZiwgMSk7CisJcmV0dXJuIDA7Cit9CisKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgYXRvbWljX3QgZW50ZXJfb25fc29mdF9yZXNldCA9IEFUT01JQ19JTklUKDApOwogCiB2b2lkIGNyYXNoX2lwaV9jYWxsYmFjayhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKKwlzdGF0aWMgY3B1bWFza190IGNwdXNfc3RhdGVfc2F2ZWQgPSBDUFVfTUFTS19OT05FOworCiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCWlmICghY3B1X29ubGluZShjcHUpKQogCQlyZXR1cm47CiAKIAloYXJkX2lycV9kaXNhYmxlKCk7Ci0JaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgJmNwdXNfaW5fY3Jhc2gpKQorCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsICZjcHVzX3N0YXRlX3NhdmVkKSkgewogCQljcmFzaF9zYXZlX2NwdShyZWdzLCBjcHUpOwotCWNwdW1hc2tfc2V0X2NwdShjcHUsICZjcHVzX2luX2NyYXNoKTsKLQotCS8qCi0JICogRW50ZXJlZCB2aWEgc29mdC1yZXNldCAtIGNvdWxkIGJlIHRoZSBrZHVtcAotCSAqIHByb2Nlc3MgaXMgaW52b2tlZCB1c2luZyBzb2Z0LXJlc2V0IG9yIHVzZXIgYWN0aXZhdGVkCi0JICogaXQgaWYgc29tZSBDUFUgZGlkIG5vdCByZXNwb25kIHRvIGFuIElQSS4KLQkgKiBGb3Igc29mdC1yZXNldCwgdGhlIHNlY29uZGFyeSBDUFUgY2FuIGVudGVyIHRoaXMgZnVuYwotCSAqIHR3aWNlLiAxIC0gdXNpbmcgSVBJLCBhbmQgMi4gc29mdC1yZXNldC4KLQkgKiBUZWxsIHRoZSBrZXhlYyBDUFUgdGhhdCBlbnRlcmVkIHZpYSBzb2Z0LXJlc2V0IGFuZCByZWFkeQotCSAqIHRvIGdvIGRvd24uCi0JICovCi0JaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCAmY3B1c19pbl9zcikpIHsKLQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCAmY3B1c19pbl9zcik7Ci0JCWF0b21pY19pbmMoJmVudGVyX29uX3NvZnRfcmVzZXQpOworCQljcHVtYXNrX3NldF9jcHUoY3B1LCAmY3B1c19zdGF0ZV9zYXZlZCk7CiAJfQogCisJYXRvbWljX2luYygmY3B1c19pbl9jcmFzaCk7CisJc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7CisKIAkvKgogCSAqIFN0YXJ0aW5nIHRoZSBrZHVtcCBib290LgogCSAqIFRoaXMgYmFycmllciBpcyBuZWVkZWQgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIENQVXMgYXJlIHN0b3BwZWQuCi0JICogSWYgbm90LCBzb2Z0LXJlc2V0IHdpbGwgYmUgaW52b2tlZCB0byBicmluZyBvdGhlciBDUFVzLgogCSAqLwotCXdoaWxlICghY3B1bWFza190ZXN0X2NwdShjcmFzaGluZ19jcHUsICZjcHVzX2luX2NyYXNoKSkKKwl3aGlsZSAoIXRpbWVfdG9fZHVtcCkKIAkJY3B1X3JlbGF4KCk7CiAKIAlpZiAocHBjX21kLmtleGVjX2NwdV9kb3duKQpAQCAtMTAzLDEwNiArMTAzLDk5IEBACiAJLyogTk9UUkVBQ0hFRCAqLwogfQogCi0vKgotICogV2FpdCB1bnRpbCBhbGwgQ1BVcyBhcmUgZW50ZXJlZCB2aWEgc29mdC1yZXNldC4KLSAqLwotc3RhdGljIHZvaWQgY3Jhc2hfc29mdF9yZXNldF9jaGVjayhpbnQgY3B1KQotewotCXVuc2lnbmVkIGludCBuY3B1cyA9IG51bV9vbmxpbmVfY3B1cygpIC0gMTsvKiBFeGNsdWRpbmcgdGhlIHBhbmljIGNwdSAqLwotCi0JY3B1bWFza19jbGVhcl9jcHUoY3B1LCAmY3B1c19pbl9zcik7Ci0Jd2hpbGUgKGF0b21pY19yZWFkKCZlbnRlcl9vbl9zb2Z0X3Jlc2V0KSAhPSBuY3B1cykKLQkJY3B1X3JlbGF4KCk7Ci19Ci0KLQogc3RhdGljIHZvaWQgY3Jhc2hfa2V4ZWNfcHJlcGFyZV9jcHVzKGludCBjcHUpCiB7CiAJdW5zaWduZWQgaW50IG1zZWNzOwotCiAJdW5zaWduZWQgaW50IG5jcHVzID0gbnVtX29ubGluZV9jcHVzKCkgLSAxOy8qIEV4Y2x1ZGluZyB0aGUgcGFuaWMgY3B1ICovCisJaW50IHRyaWVzID0gMDsKKwlpbnQgKCpvbGRfaGFuZGxlcikoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisJcHJpbnRrKEtFUk5fRU1FUkcgIlNlbmRpbmcgSVBJIHRvIG90aGVyIENQVXNcbiIpOwogCiAJY3Jhc2hfc2VuZF9pcGkoY3Jhc2hfaXBpX2NhbGxiYWNrKTsKIAlzbXBfd21iKCk7CiAKK2FnYWluOgogCS8qCiAJICogRklYTUU6IFVudGlsIHdlIHdpbGwgaGF2ZSB0aGUgd2F5IHRvIHN0b3Agb3RoZXIgQ1BVcyByZWxpYWJseSwKIAkgKiB0aGUgY3Jhc2ggQ1BVIHdpbGwgc2VuZCBhbiBJUEkgYW5kIHdhaXQgZm9yIG90aGVyIENQVXMgdG8KIAkgKiByZXNwb25kLgotCSAqIERlbGF5IG9mIGF0IGxlYXN0IDEwIHNlY29uZHMuCiAJICovCi0JcHJpbnRrKEtFUk5fRU1FUkcgIlNlbmRpbmcgSVBJIHRvIG90aGVyIGNwdXMuLi5cbiIpOwotCW1zZWNzID0gMTAwMDA7Ci0Jd2hpbGUgKChjcHVtYXNrX3dlaWdodCgmY3B1c19pbl9jcmFzaCkgPCBuY3B1cykgJiYgKC0tbXNlY3MgPiAwKSkgewotCQljcHVfcmVsYXgoKTsKKwltc2VjcyA9IElQSV9USU1FT1VUOworCXdoaWxlICgoYXRvbWljX3JlYWQoJmNwdXNfaW5fY3Jhc2gpIDwgbmNwdXMpICYmICgtLW1zZWNzID4gMCkpCiAJCW1kZWxheSgxKTsKLQl9CiAKIAkvKiBXb3VsZCBpdCBiZSBiZXR0ZXIgdG8gcmVwbGFjZSB0aGUgdHJhcCB2ZWN0b3IgaGVyZT8gKi8KIAorCWlmIChhdG9taWNfcmVhZCgmY3B1c19pbl9jcmFzaCkgPj0gbmNwdXMpIHsKKwkJcHJpbnRrKEtFUk5fRU1FUkcgIklQSSBjb21wbGV0ZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGsoS0VSTl9FTUVSRyAiRVJST1I6ICVkIGNwdShzKSBub3QgcmVzcG9uZGluZ1xuIiwKKwkJbmNwdXMgLSBhdG9taWNfcmVhZCgmY3B1c19pbl9jcmFzaCkpOworCiAJLyoKLQkgKiBGSVhNRTogSW4gY2FzZSBpZiB3ZSBkbyBub3QgZ2V0IGFsbCBDUFVzLCBvbmUgcG9zc2liaWxpdHk6IGFzayB0aGUKLQkgKiB1c2VyIHRvIGRvIHNvZnQgcmVzZXQgc3VjaCB0aGF0IHdlIGdldCBhbGwuCi0JICogU29mdC1yZXNldCB3aWxsIGJlIHVzZWQgdW50aWwgYmV0dGVyIG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZC4KKwkgKiBJZiB3ZSBoYXZlIGEgcGFuaWMgdGltZW91dCBzZXQgdGhlbiB3ZSBjYW4ndCB3YWl0IGluZGVmaW5pdGVseQorCSAqIGZvciBzb21lb25lIHRvIGFjdGl2YXRlIHN5c3RlbSByZXNldC4gV2UgYWxzbyBnaXZlIHVwIG9uIHRoZQorCSAqIHNlY29uZCB0aW1lIHRocm91Z2ggaWYgc3lzdGVtIHJlc2V0IGZhaWwgdG8gd29yay4KIAkgKi8KLQlpZiAoY3B1bWFza193ZWlnaHQoJmNwdXNfaW5fY3Jhc2gpIDwgbmNwdXMpIHsKLQkJcHJpbnRrKEtFUk5fRU1FUkcgImRvbmUgd2FpdGluZzogJWQgY3B1KHMpIG5vdCByZXNwb25kaW5nXG4iLAotCQkJbmNwdXMgLSBjcHVtYXNrX3dlaWdodCgmY3B1c19pbl9jcmFzaCkpOwotCQlwcmludGsoS0VSTl9FTUVSRyAiQWN0aXZhdGUgc29mdC1yZXNldCB0byBzdG9wIG90aGVyIGNwdShzKVxuIik7Ci0JCWNwdW1hc2tfY2xlYXIoJmNwdXNfaW5fc3IpOwotCQlhdG9taWNfc2V0KCZlbnRlcl9vbl9zb2Z0X3Jlc2V0LCAwKTsKLQkJd2hpbGUgKGNwdW1hc2tfd2VpZ2h0KCZjcHVzX2luX2NyYXNoKSA8IG5jcHVzKQorCWlmICgocGFuaWNfdGltZW91dCA+IDApIHx8ICh0cmllcyA+IDApKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEEgc3lzdGVtIHJlc2V0IHdpbGwgY2F1c2UgYWxsIENQVXMgdG8gdGFrZSBhbiAweDEwMCBleGNlcHRpb24uCisJICogVGhlIHByaW1hcnkgQ1BVIHJldHVybnMgaGVyZSB2aWEgc2V0am1wLCBhbmQgdGhlIHNlY29uZGFyeQorCSAqIENQVXMgcmVleGVjdXRlIHRoZSBjcmFzaF9rZXhlY19zZWNvbmRhcnkgcGF0aC4KKwkgKi8KKwlvbGRfaGFuZGxlciA9IF9fZGVidWdnZXI7CisJX19kZWJ1Z2dlciA9IGhhbmRsZV9mYXVsdDsKKwljcmFzaF9zaHV0ZG93bl9jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAoc2V0am1wKGNyYXNoX3NodXRkb3duX2J1ZikgPT0gMCkgeworCQlwcmludGsoS0VSTl9FTUVSRyAiQWN0aXZhdGUgc3lzdGVtIHJlc2V0IChkdW1wcmVzdGFydCkgIgorCQkJCSAgInRvIHN0b3Agb3RoZXIgY3B1KHMpXG4iKTsKKworCQkvKgorCQkgKiBBIHN5c3RlbSByZXNldCB3aWxsIGZvcmNlIGFsbCBDUFVzIHRvIGV4ZWN1dGUgdGhlCisJCSAqIGNyYXNoIGNvZGUgYWdhaW4uIFdlIG5lZWQgdG8gcmVzZXQgY3B1c19pbl9jcmFzaCBzbyB3ZQorCQkgKiB3YWl0IGZvciBldmVyeW9uZSB0byBkbyB0aGlzLgorCQkgKi8KKwkJYXRvbWljX3NldCgmY3B1c19pbl9jcmFzaCwgMCk7CisJCXNtcF9tYigpOworCisJCXdoaWxlIChhdG9taWNfcmVhZCgmY3B1c19pbl9jcmFzaCkgPCBuY3B1cykKIAkJCWNwdV9yZWxheCgpOwogCX0KLQkvKgotCSAqIE1ha2Ugc3VyZSBhbGwgQ1BVcyBhcmUgZW50ZXJlZCB2aWEgc29mdC1yZXNldCBpZiB0aGUga2R1bXAgaXMKLQkgKiBpbnZva2VkIHVzaW5nIHNvZnQtcmVzZXQuCi0JICovCi0JaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCAmY3B1c19pbl9zcikpCi0JCWNyYXNoX3NvZnRfcmVzZXRfY2hlY2soY3B1KTsKLQkvKiBMZWF2ZSB0aGUgSVBJIGNhbGxiYWNrIHNldCAqLworCisJY3Jhc2hfc2h1dGRvd25fY3B1ID0gLTE7CisJX19kZWJ1Z2dlciA9IG9sZF9oYW5kbGVyOworCisJdHJpZXMrKzsKKwlnb3RvIGFnYWluOwogfQogCiAvKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBieSBzZWNvbmRhcnkgY3B1cyBvciBieSBrZXhlYyBjcHUKLSAqIGlmIHNvZnQtcmVzZXQgaXMgYWN0aXZhdGVkIHRvIHN0b3Agc29tZSBDUFVzLgorICogVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBieSBzZWNvbmRhcnkgY3B1cy4KICAqLwogdm9pZCBjcmFzaF9rZXhlY19zZWNvbmRhcnkoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBtc2VjcyA9IDU7CisJaW50IG1zZWNzID0gU0VDT05EQVJZX1RJTUVPVVQ7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JLyogV2FpdCA1bXMgaWYgdGhlIGtleGVjIENQVSBpcyBub3QgZW50ZXJlZCB5ZXQuICovCisKKwkvKiBXYWl0IGZvciB0aGUgcHJpbWFyeSBjcmFzaCBDUFUgdG8gc2lnbmFsIGl0cyBwcm9ncmVzcyAqLwogCXdoaWxlIChjcmFzaGluZ19jcHUgPCAwKSB7CiAJCWlmICgtLW1zZWNzIDwgMCkgewotCQkJLyoKLQkJCSAqIEVpdGhlciBrZHVtcCBpbWFnZSBpcyBub3QgbG9hZGVkIG9yCi0JCQkgKiBrZHVtcCBwcm9jZXNzIGlzIG5vdCBzdGFydGVkIC0gUHJvYmFibHkgeG1vbgotCQkJICogZXhpdGVkIHVzaW5nICd4JyhleGl0IGFuZCByZWNvdmVyKSBvcgotCQkJICoga2V4ZWNfc2hvdWxkX2NyYXNoKCkgZmFpbGVkIGZvciBhbGwgcnVubmluZyB0YXNrcy4KLQkJCSAqLwotCQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCAmY3B1c19pbl9zcik7CisJCQkvKiBObyByZXNwb25zZSwga2R1bXAgaW1hZ2UgbWF5IG5vdCBoYXZlIGJlZW4gbG9hZGVkICovCiAJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCQlyZXR1cm47CiAJCX0KKwogCQltZGVsYXkoMSk7Ci0JCWNwdV9yZWxheCgpOwogCX0KLQlpZiAoY3B1ID09IGNyYXNoaW5nX2NwdSkgewotCQkvKgotCQkgKiBQYW5pYyBDUFUgd2lsbCBlbnRlciB0aGlzIGZ1bmMgb25seSB2aWEgc29mdC1yZXNldC4KLQkJICogV2FpdCB1bnRpbCBhbGwgc2Vjb25kYXJ5IENQVXMgZW50ZXJlZCBhbmQKLQkJICogdGhlbiBzdGFydCBrZXhlYyBib290LgotCQkgKi8KLQkJY3Jhc2hfc29mdF9yZXNldF9jaGVjayhjcHUpOwotCQljcHVtYXNrX3NldF9jcHUoY3Jhc2hpbmdfY3B1LCAmY3B1c19pbl9jcmFzaCk7Ci0JCWlmIChwcGNfbWQua2V4ZWNfY3B1X2Rvd24pCi0JCQlwcGNfbWQua2V4ZWNfY3B1X2Rvd24oMSwgMCk7Ci0JCW1hY2hpbmVfa2V4ZWMoa2V4ZWNfY3Jhc2hfaW1hZ2UpOwotCQkvKiBOT1RSRUFDSEVEICovCi0JfQorCiAJY3Jhc2hfaXBpX2NhbGxiYWNrKHJlZ3MpOwogfQogCkBAIC0yMTEsNyArMjA0LDcgQEAKIHN0YXRpYyB2b2lkIGNyYXNoX2tleGVjX3ByZXBhcmVfY3B1cyhpbnQgY3B1KQogewogCS8qCi0JICogbW92ZSB0aGUgc2Vjb25kYXJ5cyB0byB1cyBzbyB0aGF0IHdlIGNhbiBjb3B5CisJICogbW92ZSB0aGUgc2Vjb25kYXJpZXMgdG8gdXMgc28gdGhhdCB3ZSBjYW4gY29weQogCSAqIHRoZSBuZXcga2VybmVsIDAtMHgxMDAgc2FmZWx5CiAJICoKIAkgKiBkbyB0aGlzIGlmIGtleGVjIGluIHNldHVwLmMgPwpAQCAtMjI1LDcgKzIxOCw2IEBACiAKIHZvaWQgY3Jhc2hfa2V4ZWNfc2Vjb25kYXJ5KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWNwdW1hc2tfY2xlYXIoJmNwdXNfaW5fc3IpOwogfQogI2VuZGlmCS8qIENPTkZJR19TTVAgKi8KIApAQCAtMjM2LDcgKzIyOCw3IEBACiAJdW5zaWduZWQgaW50IG1zZWNzOwogCWludCBpOwogCi0JbXNlY3MgPSAxMDAwMDsKKwltc2VjcyA9IFJFQUxfTU9ERV9USU1FT1VUOwogCWZvciAoaT0wOyBpIDwgbnJfY3B1X2lkcyAmJiBtc2VjcyA+IDA7IGkrKykgewogCQlpZiAoaSA9PSBjcHUpCiAJCQljb250aW51ZTsKQEAgLTMwOCwyMiArMzAwLDExIEBACiB9CiBFWFBPUlRfU1lNQk9MKGNyYXNoX3NodXRkb3duX3VucmVnaXN0ZXIpOwogCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjcmFzaF9zaHV0ZG93bl9idWZbSk1QX0JVRl9MRU5dOwotc3RhdGljIGludCBjcmFzaF9zaHV0ZG93bl9jcHUgPSAtMTsKLQotc3RhdGljIGludCBoYW5kbGVfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JaWYgKGNyYXNoX3NodXRkb3duX2NwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCi0JCWxvbmdqbXAoY3Jhc2hfc2h1dGRvd25fYnVmLCAxKTsKLQlyZXR1cm4gMDsKLX0KLQogdm9pZCBkZWZhdWx0X21hY2hpbmVfY3Jhc2hfc2h1dGRvd24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJaW50ICgqb2xkX2hhbmRsZXIpKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKIAotCiAJLyoKIAkgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGFmdGVyIHRoZSBzeXN0ZW0KIAkgKiBoYXMgcGFuaWNrZWQgb3IgaXMgb3RoZXJ3aXNlIGluIGEgY3JpdGljYWwgc3RhdGUuCkBAIC0zNDEsMTUgKzMyMiwyNiBAQAogCSAqIHN1Y2ggdGhhdCBhbm90aGVyIElQSSB3aWxsIG5vdCBiZSBzZW50LgogCSAqLwogCWNyYXNoaW5nX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQljcmFzaF9zYXZlX2NwdShyZWdzLCBjcmFzaGluZ19jcHUpOworCisJLyoKKwkgKiBJZiB3ZSBjYW1lIGluIHZpYSBzeXN0ZW0gcmVzZXQsIHdhaXQgYSB3aGlsZSBmb3IgdGhlIHNlY29uZGFyeQorCSAqIENQVXMgdG8gZW50ZXIuCisJICovCisJaWYgKFRSQVAocmVncykgPT0gMHgxMDApCisJCW1kZWxheShQUklNQVJZX1RJTUVPVVQpOworCiAJY3Jhc2hfa2V4ZWNfcHJlcGFyZV9jcHVzKGNyYXNoaW5nX2NwdSk7Ci0JY3B1bWFza19zZXRfY3B1KGNyYXNoaW5nX2NwdSwgJmNwdXNfaW5fY3Jhc2gpOworCisJY3Jhc2hfc2F2ZV9jcHUocmVncywgY3Jhc2hpbmdfY3B1KTsKKworCXRpbWVfdG9fZHVtcCA9IDE7CisKIAljcmFzaF9rZXhlY193YWl0X3JlYWxtb2RlKGNyYXNoaW5nX2NwdSk7CiAKIAltYWNoaW5lX2tleGVjX21hc2tfaW50ZXJydXB0cygpOwogCiAJLyoKLQkgKiBDYWxsIHJlZ2lzdGVyZWQgc2h1dGRvd24gcm91dGluZXMgc2F2ZWx5LiAgU3dhcCBvdXQKKwkgKiBDYWxsIHJlZ2lzdGVyZWQgc2h1dGRvd24gcm91dGluZXMgc2FmZWx5LiAgU3dhcCBvdXQKIAkgKiBfX2RlYnVnZ2VyX2ZhdWx0X2hhbmRsZXIsIGFuZCByZXBsYWNlIG9uIGV4aXQuCiAJICovCiAJb2xkX2hhbmRsZXIgPSBfX2RlYnVnZ2VyX2ZhdWx0X2hhbmRsZXI7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2NyYXNoX2R1bXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2hfZHVtcC5jCmluZGV4IDQyNGFmYjYuLmIzYmE1MTYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2hfZHVtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvY3Jhc2hfZHVtcC5jCkBAIC0yOCw3ICsyOCw3IEBACiAjZGVmaW5lIERCRyhmbXQuLi4pCiAjZW5kaWYKIAotI2lmbmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKKyNpZm5kZWYgQ09ORklHX05PTlNUQVRJQ19LRVJORUwKIHZvaWQgX19pbml0IHJlc2VydmVfa2R1bXBfdHJhbXBvbGluZSh2b2lkKQogewogCW1lbWJsb2NrX3Jlc2VydmUoMCwgS0RVTVBfUkVTRVJWRV9MSU1JVCk7CkBAIC02Nyw3ICs2Nyw3IEBACiAKIAlEQkcoIiA8LSBzZXR1cF9rZHVtcF90cmFtcG9saW5lKClcbiIpOwogfQotI2VuZGlmIC8qIENPTkZJR19SRUxPQ0FUQUJMRSAqLworI2VuZGlmIC8qIENPTkZJR19OT05TVEFUSUNfS0VSTkVMICovCiAKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX3NhdmVtYXhtZW0oY2hhciAqcCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZXhjZXB0aW9ucy02NHMuUwppbmRleCBjZjljNjliLi5kNGJlN2JiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2V4Y2VwdGlvbnMtNjRzLlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9leGNlcHRpb25zLTY0cy5TCkBAIC02NSw3ICs2NSw3IEBACiAJbGJ6CXIwLFBBQ0FQUk9DU1RBUlQocjEzKQogCWNtcHdpCXIwLDB4ODAKIAlibmUJMWYKLQlsaQlyMCwwCisJbGkJcjAsMQogCXN0YglyMCxQQUNBUFJPQ1NUQVJUKHIxMykKIAliCWt2bV9zdGFydF9ndWVzdAogMToKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80NHguUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF80NHguUwppbmRleCBiNzI1ZGFiLi43ZGQyOTgxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfNDR4LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkXzQ0eC5TCkBAIC02NCw2ICs2NCwzNSBAQAogCW1yCXIzMSxyMwkJLyogc2F2ZSBkZXZpY2UgdHJlZSBwdHIgKi8KIAlsaQlyMjQsMAkJLyogQ1BVIG51bWJlciAqLwogCisjaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCisvKgorICogUmVsb2NhdGUgb3Vyc2VsdmVzIHRvIHRoZSBjdXJyZW50IHJ1bnRpbWUgYWRkcmVzcy4KKyAqIFRoaXMgaXMgY2FsbGVkIG9ubHkgYnkgdGhlIEJvb3QgQ1BVLgorICogInJlbG9jYXRlIiBpcyBjYWxsZWQgd2l0aCBvdXIgY3VycmVudCBydW50aW1lIHZpcnV0YWwKKyAqIGFkZHJlc3MuCisgKiByMjEgd2lsbCBiZSBsb2FkZWQgd2l0aCB0aGUgcGh5c2ljYWwgcnVudGltZSBhZGRyZXNzIG9mIF9zdGV4dAorICovCisJYmwJMGYJCQkJLyogR2V0IG91ciBydW50aW1lIGFkZHJlc3MgKi8KKzA6CW1mbHIJcjIxCQkJCS8qIE1ha2UgaXQgYWNjZXNzaWJsZSAqLworCWFkZGlzCXIyMSxyMjEsKF9zdGV4dCAtIDBiKUBoYQorCWFkZGkJcjIxLHIyMSwoX3N0ZXh0IC0gMGIpQGwgCS8qIEdldCBvdXIgY3VycmVudCBydW50aW1lIGJhc2UgKi8KKworCS8qCisJICogV2UgaGF2ZSB0aGUgcnVudGltZSAodmlydXRhbCkgYWRkcmVzcyBvZiBvdXIgYmFzZS4KKwkgKiBXZSBjYWxjdWxhdGUgb3VyIHNoaWZ0IG9mIG9mZnNldCBmcm9tIGEgMjU2TSBwYWdlLgorCSAqIFdlIGNvdWxkIG1hcCB0aGUgMjU2TSBwYWdlIHdlIGJlbG9uZyB0byBhdCBQQUdFX09GRlNFVCBhbmQKKwkgKiBnZXQgZ29pbmcgZnJvbSB0aGVyZS4KKwkgKi8KKwlsaXMJcjQsS0VSTkVMQkFTRUBoCisJb3JpCXI0LHI0LEtFUk5FTEJBU0VAbAorCXJsd2lubQlyNixyMjEsMCw0LDMxCQkJLyogcjYgPSBQSFlTX1NUQVJUICUgMjU2TSAqLworCXJsd2lubQlyNSxyNCwwLDQsMzEJCQkvKiByNSA9IEtFUk5FTEJBU0UgJSAyNTZNICovCisJc3ViZglyMyxyNSxyNgkJCS8qIHIzID0gcjYgLSByNSAqLworCWFkZAlyMyxyNCxyMwkJCS8qIFJlcXVpcmVkIFZpcnV0YWwgQWRkcmVzcyAqLworCisJYmwJcmVsb2NhdGUKKyNlbmRpZgorCiAJYmwJaW5pdF9jcHVfc3RhdGUKIAogCS8qCkBAIC04OCw2ICsxMTcsNjUgQEAKIAogI2lmZGVmIENPTkZJR19SRUxPQ0FUQUJMRQogCS8qCisJICogUmVsb2NhdGFibGUga2VybmVsIHN1cHBvcnQgYmFzZWQgb24gcHJvY2Vzc2luZyBvZiBkeW5hbWljCisJICogcmVsb2NhdGlvbiBlbnRyaWVzLgorCSAqCisJICogcjI1IHdpbGwgY29udGFpbiBSUE4vRVJQTiBmb3IgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgbWVtb3J5CisJICogcjIxIHdpbGwgY29udGFpbiB0aGUgY3VycmVudCBvZmZzZXQgb2YgX3N0ZXh0CisJICovCisJbGlzCXIzLGtlcm5zdGFydF9hZGRyQGhhCisJbGEJcjMsa2VybnN0YXJ0X2FkZHJAbChyMykKKworCS8qCisJICogQ29tcHV0ZSB0aGUga2VybnN0YXJ0X2FkZHIuCisJICoga2VybnN0YXJ0X2FkZHIgPT4gKHI2LHI4KQorCSAqIGtlcm5zdGFydF9hZGRyICYgfjB4ZmZmZmZmZiA9PiAocjYscjcpCisJICovCisJcmx3aW5tCXI2LHIyNSwwLDI4LDMxCS8qIEVSUE4uIEJpdHMgMzItMzUgb2YgQWRkcmVzcyAqLworCXJsd2lubQlyNyxyMjUsMCwwLDMJLyogUlBOIC0gYXNzdW1pbmcgMjU2IE1CIHBhZ2Ugc2l6ZSAqLworCXJsd2lubQlyOCxyMjEsMCw0LDMxCS8qIHI4ID0gKF9zdGV4dCAmIDB4ZmZmZmZmZikgKi8KKwlvcglyOCxyNyxyOAkvKiBDb21wdXRlIHRoZSBsb3dlciAzMmJpdCBvZiBrZXJuc3RhcnRfYWRkciAqLworCisJLyogU3RvcmUga2VybnN0YXJ0X2FkZHIgKi8KKwlzdHcJcjYsMChyMykJLyogaGlnaGVyIDMyYml0ICovCisJc3R3CXI4LDQocjMpCS8qIGxvd2VyIDMyYml0ICAqLworCisJLyoKKwkgKiBDb21wdXRlIHRoZSB2aXJ0X3BoeXNfb2Zmc2V0IDoKKwkgKiB2aXJ0X3BoeXNfb2Zmc2V0ID0gc3RleHQucnVuIC0ga2VybnN0YXJ0X2FkZHIKKwkgKgorCSAqIHN0ZXh0LnJ1biA9IChLRVJORUxCQVNFICYgfjB4ZmZmZmZmZikgKyAoa2VybnN0YXJ0X2FkZHIgJiAweGZmZmZmZmYpCisJICogV2hlbiB3ZSByZWxvY2F0ZSwgd2UgaGF2ZSA6CisJICoKKwkgKgkoa2VybnN0YXJ0X2FkZHIgJiAweGZmZmZmZmYpID0gKHN0ZXh0LnJ1biAmIDB4ZmZmZmZmZikKKwkgKgorCSAqIGhlbmNlOgorCSAqICB2aXJ0X3BoeXNfb2Zmc2V0ID0gKEtFUk5FTEJBU0UgJiB+MHhmZmZmZmZmKSAtIChrZXJuc3RhcnRfYWRkciAmIH4weGZmZmZmZmYpCisJICoKKwkgKi8KKworCS8qIEtFUk5FTEJBU0UmfjB4ZmZmZmZmZiA9PiAocjQscjUpICovCisJbGkJcjQsIDAJCS8qIGhpZ2VyIDMyYml0ICovCisJbGlzCXI1LEtFUk5FTEJBU0VAaAorCXJsd2lubQlyNSxyNSwwLDAsMwkvKiBBbGlnbiB0byAyNTZNLCBsb3dlciAzMmJpdCAqLworCisJLyoKKwkgKiA2NGJpdCBzdWJ0cmFjdGlvbi4KKwkgKi8KKwlzdWJmYwlyNSxyNyxyNQorCXN1YmZlCXI0LHI2LHI0CisKKwkvKiBTdG9yZSB2aXJ0X3BoeXNfb2Zmc2V0ICovCisJbGlzCXIzLHZpcnRfcGh5c19vZmZzZXRAaGEKKwlsYQlyMyx2aXJ0X3BoeXNfb2Zmc2V0QGwocjMpCisKKwlzdHcJcjQsMChyMykKKwlzdHcJcjUsNChyMykKKworI2VsaWYgZGVmaW5lZChDT05GSUdfRFlOQU1JQ19NRU1TVEFSVCkKKwkvKgorCSAqIE1hcHBpbmcgYmFzZWQsIHBhZ2UgYWxpZ25lZCBkeW5hbWljIGtlcm5lbCBsb2FkaW5nLgorCSAqCiAJICogcjI1IHdpbGwgY29udGFpbiBSUE4vRVJQTiBmb3IgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgbWVtb3J5CiAJICoKIAkgKiBBZGQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBLRVJORUxCQVNFIGFuZCBQQUdFX09GRlNFVCB0byB0aGUKQEAgLTczMiw2ICs4MjAsOCBAQAogCS8qIFdlIHVzZSB0aGUgUFZSIHRvIGRpZmZlcmVuY2lhdGUgNDR4IGNvcmVzIGZyb20gNDc2ICovCiAJbWZzcHIJcjMsU1BSTl9QVlIKIAlzcndpCXIzLHIzLDE2CisJY21wbHdpCWNyMCxyMyxQVlJfNDc2RlBFQGgKKwliZXEJaGVhZF9zdGFydF80N3gKIAljbXBsd2kJY3IwLHIzLFBWUl80NzZAaAogCWJlcQloZWFkX3N0YXJ0XzQ3eAogCWNtcGx3aQljcjAscjMsUFZSXzQ3Nl9JU1NAaApAQCAtODAwLDEyICs4OTAsMjkgQEAKIC8qCiAgKiBDb25maWd1cmUgYW5kIGxvYWQgcGlubmVkIGVudHJ5IGludG8gVExCIHNsb3QgNjMuCiAgKi8KKyNpZmRlZiBDT05GSUdfTk9OU1RBVElDX0tFUk5FTAorCS8qCisJICogSW4gY2FzZSBvZiBhIE5PTlNUQVRJQ19LRVJORUwgd2UgcmV1c2UgdGhlIFRMQiBYTEFUCisJICogZW50cmllcyBvZiB0aGUgaW5pdGlhbCBtYXBwaW5nIHNldCBieSB0aGUgYm9vdCBsb2FkZXIuCisJICogVGhlIFhMQVQgZW50cnkgaXMgc3RvcmVkIGluIHIyNQorCSAqLworCisJLyogUmVhZCB0aGUgWExBVCBlbnRyeSBmb3Igb3VyIGN1cnJlbnQgbWFwcGluZyAqLworCXRsYnJlCXIyNSxyMjMsUFBDNDR4X1RMQl9YTEFUCisKKwlsaXMJcjMsS0VSTkVMQkFTRUBoCisJb3JpCXIzLHIzLEtFUk5FTEJBU0VAbAorCisJLyogVXNlIG91ciBjdXJyZW50IFJQTiBlbnRyeSAqLworCW1yCXI0LHIyNQorI2Vsc2UKIAogCWxpcwlyMyxQQUdFX09GRlNFVEBoCiAJb3JpCXIzLHIzLFBBR0VfT0ZGU0VUQGwKIAogCS8qIEtlcm5lbCBpcyBhdCB0aGUgYmFzZSBvZiBSQU0gKi8KIAlsaSByNCwgMAkJCS8qIExvYWQgdGhlIGtlcm5lbCBwaHlzaWNhbCBhZGRyZXNzICovCisjZW5kaWYKIAogCS8qIExvYWQgdGhlIGtlcm5lbCBQSUQgPSAwICovCiAJbGkJcjAsMApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9oZWFkX2ZzbF9ib29rZS5TCmluZGV4IDlmNWQyMTAuLmQ1ZDc4YzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaGVhZF9mc2xfYm9va2UuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2hlYWRfZnNsX2Jvb2tlLlMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiAJYmwJZWFybHlfaW5pdAogCi0jaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCisjaWZkZWYgQ09ORklHX0RZTkFNSUNfTUVNU1RBUlQKIAlsaXMJcjMsa2VybnN0YXJ0X2FkZHJAaGEKIAlsYQlyMyxrZXJuc3RhcnRfYWRkckBsKHIzKQogI2lmZGVmIENPTkZJR19QSFlTXzY0QklUCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZS5jCmluZGV4IDM5YTJiYWEuLjdjNjZjZTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZS5jCkBAIC0zOSwxMyArMzksMjMgQEAKICNkZWZpbmUgY3B1X3Nob3VsZF9kaWUoKQkwCiAjZW5kaWYKIAordW5zaWduZWQgbG9uZyBjcHVpZGxlX2Rpc2FibGUgPSBJRExFX05PX09WRVJSSURFOworRVhQT1JUX1NZTUJPTChjcHVpZGxlX2Rpc2FibGUpOworCiBzdGF0aWMgaW50IF9faW5pdCBwb3dlcnNhdmVfb2ZmKGNoYXIgKmFyZykKIHsKIAlwcGNfbWQucG93ZXJfc2F2ZSA9IE5VTEw7CisJY3B1aWRsZV9kaXNhYmxlID0gSURMRV9QT1dFUlNBVkVfT0ZGOwogCXJldHVybiAwOwogfQogX19zZXR1cCgicG93ZXJzYXZlPW9mZiIsIHBvd2Vyc2F2ZV9vZmYpOwogCisjaWYgZGVmaW5lZChDT05GSUdfUFBDX1BTRVJJRVMpICYmIGRlZmluZWQoQ09ORklHX1RSQUNFUE9JTlRTKQorc3RhdGljIGNvbnN0IGJvb2wgaWRsZV91c2VzX3JjdSA9IDE7CisjZWxzZQorc3RhdGljIGNvbnN0IGJvb2wgaWRsZV91c2VzX3JjdTsKKyNlbmRpZgorCiAvKgogICogVGhlIGJvZHkgb2YgdGhlIGlkbGUgdGFzay4KICAqLwpAQCAtNTYsNyArNjYsMTAgQEAKIAogCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwogCXdoaWxlICgxKSB7Ci0JCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soMSk7CisJCXRpY2tfbm9oel9pZGxlX2VudGVyKCk7CisJCWlmICghaWRsZV91c2VzX3JjdSkKKwkJCXJjdV9pZGxlX2VudGVyKCk7CisKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhY3B1X3Nob3VsZF9kaWUoKSkgewogCQkJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CiAKQEAgLTkzLDcgKzEwNiw5IEBACiAKIAkJSE1UX21lZGl1bSgpOwogCQlwcGM2NF9ydW5sYXRjaF9vbigpOwotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCWlmICghaWRsZV91c2VzX3JjdSkKKwkJCXJjdV9pZGxlX2V4aXQoKTsKKwkJdGlja19ub2h6X2lkbGVfZXhpdCgpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCWlmIChjcHVfc2hvdWxkX2RpZSgpKQogCQkJY3B1X2RpZSgpOwpAQCAtMTAyLDYgKzExNywyOSBAQAogCX0KIH0KIAorCisvKgorICogY3B1X2lkbGVfd2FpdCAtIFVzZWQgdG8gZW5zdXJlIHRoYXQgYWxsIHRoZSBDUFVzIGNvbWUgb3V0IG9mIHRoZSBvbGQKKyAqIGlkbGUgbG9vcCBhbmQgc3RhcnQgdXNpbmcgdGhlIG5ldyBpZGxlIGxvb3AuCisgKiBSZXF1aXJlZCB3aGlsZSBjaGFuZ2luZyBpZGxlIGhhbmRsZXIgb24gU01QIHN5c3RlbXMuCisgKiBDYWxsZXIgbXVzdCBoYXZlIGNoYW5nZWQgaWRsZSBoYW5kbGVyIHRvIHRoZSBuZXcgdmFsdWUgYmVmb3JlIHRoZSBjYWxsLgorICogVGhpcyB3aW5kb3cgbWF5IGJlIGxhcmdlciBvbiBzaGFyZWQgc3lzdGVtcy4KKyAqLwordm9pZCBjcHVfaWRsZV93YWl0KHZvaWQpCit7CisJaW50IGNwdTsKKwlzbXBfbWIoKTsKKworCS8qIGtpY2sgYWxsIHRoZSBDUFVzIHNvIHRoYXQgdGhleSBleGl0IG91dCBvZiBvbGQgaWRsZSByb3V0aW5lICovCisJZ2V0X29ubGluZV9jcHVzKCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCQlzbXBfc2VuZF9yZXNjaGVkdWxlKGNwdSk7CisJfQorCXB1dF9vbmxpbmVfY3B1cygpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2lkbGVfd2FpdCk7CisKIGludCBwb3dlcnNhdmVfbmFwOwogCiAjaWZkZWYgQ09ORklHX1NZU0NUTApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNy5TIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pZGxlX3Bvd2VyNy5TCmluZGV4IDNhNzA4NDUuLmZjZGZmMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaWRsZV9wb3dlcjcuUworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lkbGVfcG93ZXI3LlMKQEAgLTU0LDYgKzU0LDcgQEAKIAlsaQlyMCwwCiAJc3RiCXIwLFBBQ0FTT0ZUSVJRRU4ocjEzKQkvKiB3ZSdsbCBoYXJkLWVuYWJsZSBzaG9ydGx5ICovCiAJc3RiCXIwLFBBQ0FIQVJESVJRRU4ocjEzKQorCXN0YglyMCxQQUNBX05BUFNUQVRFTE9TVChyMTMpCiAKIAkvKiBDb250aW51ZSBzYXZpbmcgc3RhdGUgKi8KIAlTQVZFX0dQUigyLCByMSkKQEAgLTg2LDYgKzg3LDkgQEAKIAlyZmlkCiAKIF9HTE9CQUwocG93ZXI3X3dha2V1cF9ub2xvc3MpCisJbGJ6CXIwLFBBQ0FfTkFQU1RBVEVMT1NUKHIxMykKKwljbXB3aQlyMCwwCisJYm5lCS5wb3dlcjdfd2FrZXVwX2xvc3MKIAlsZAlyMSxQQUNBUjEocjEzKQogCWxkCXI0LF9NU1IocjEpCiAJbGQJcjUsX05JUChyMSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCmluZGV4IDVjM2M0NjkuLjcwMWQ0YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYwpAQCAtMTE1LDYgKzExNSwxNSBAQAogCTogOiAiciIgKGVuYWJsZSksICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBzb2Z0X2VuYWJsZWQpKSk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgbm90cmFjZSB2b2lkIGRlY3JlbWVudGVyX2NoZWNrX292ZXJmbG93KHZvaWQpCit7CisJdTY0IG5vdyA9IGdldF90Yl9vcl9ydGMoKTsKKwl1NjQgKm5leHRfdGIgPSAmX19nZXRfY3B1X3ZhcihkZWNyZW1lbnRlcnNfbmV4dF90Yik7CisKKwlpZiAobm93ID49ICpuZXh0X3RiKQorCQlzZXRfZGVjKDEpOworfQorCiBub3RyYWNlIHZvaWQgYXJjaF9sb2NhbF9pcnFfcmVzdG9yZSh1bnNpZ25lZCBsb25nIGVuKQogewogCS8qCkBAIC0xNjQsMjQgKzE3MywyMSBAQAogCSAqLwogCWxvY2FsX3BhY2EtPmhhcmRfZW5hYmxlZCA9IGVuOwogCi0jaWZuZGVmIENPTkZJR19CT09LRQotCS8qIE9uIHNlcnZlciwgcmUtdHJpZ2dlciB0aGUgZGVjcmVtZW50ZXIgaWYgaXQgd2VudCBuZWdhdGl2ZSBzaW5jZQotCSAqIHNvbWUgcHJvY2Vzc29ycyBvbmx5IHRyaWdnZXIgb24gZWRnZSB0cmFuc2l0aW9ucyBvZiB0aGUgc2lnbiBiaXQuCi0JICoKLQkgKiBCb29rRSBoYXMgYSBsZXZlbCBzZW5zaXRpdmUgZGVjcmVtZW50ZXIgKGxhdGNoZXMgaW4gVFNSKSBzbyB3ZQotCSAqIGRvbid0IG5lZWQgdGhhdAorCS8qCisJICogVHJpZ2dlciB0aGUgZGVjcmVtZW50ZXIgaWYgd2UgaGF2ZSBhIHBlbmRpbmcgZXZlbnQuIFNvbWUgcHJvY2Vzc29ycworCSAqIG9ubHkgdHJpZ2dlciBvbiBlZGdlIHRyYW5zaXRpb25zIG9mIHRoZSBzaWduIGJpdC4gV2UgbWlnaHQgYWxzbworCSAqIGhhdmUgZGlzYWJsZWQgaW50ZXJydXB0cyBsb25nIGVub3VnaCB0aGF0IHRoZSBkZWNyZW1lbnRlciB3cmFwcGVkCisJICogdG8gcG9zaXRpdmUuCiAJICovCi0JaWYgKChpbnQpbWZzcHIoU1BSTl9ERUMpIDwgMCkKLQkJbXRzcHIoU1BSTl9ERUMsIDEpOwotI2VuZGlmIC8qIENPTkZJR19CT09LRSAqLworCWRlY3JlbWVudGVyX2NoZWNrX292ZXJmbG93KCk7CiAKIAkvKgogCSAqIEZvcmNlIHRoZSBkZWxpdmVyeSBvZiBwZW5kaW5nIHNvZnQtZGlzYWJsZWQgaW50ZXJydXB0cyBvbiBQUzMuCiAJICogQW55IEhWIGNhbGwgd2lsbCBoYXZlIHRoaXMgc2lkZSBlZmZlY3QuCiAJICovCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfUFMzX0xWMSkpIHsKLQkJdTY0IHRtcDsKLQkJbHYxX2dldF92ZXJzaW9uX2luZm8oJnRtcCk7CisJCXU2NCB0bXAsIHRtcDI7CisJCWx2MV9nZXRfdmVyc2lvbl9pbmZvKCZ0bXAsICZ0bXAyKTsKIAl9CiAKIAlfX2hhcmRfaXJxX2VuYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYwppbmRleCA5Y2UxNjcyLi5jOTU3YjEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL21hY2hpbmVfa2V4ZWMuYwpAQCAtMTA3LDkgKzEwNyw2IEBACiAJdW5zaWduZWQgbG9uZyBsb25nIGNyYXNoX3NpemUsIGNyYXNoX2Jhc2U7CiAJaW50IHJldDsKIAotCS8qIHRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgbWVtYmxvY2tfcGh5c19tZW1fc2l6ZSgpICovCi0JbWVtYmxvY2tfYW5hbHl6ZSgpOwotCiAJLyogdXNlIGNvbW1vbiBwYXJzaW5nICovCiAJcmV0ID0gcGFyc2VfY3Jhc2hrZXJuZWwoYm9vdF9jb21tYW5kX2xpbmUsIG1lbWJsb2NrX3BoeXNfbWVtX3NpemUoKSwKIAkJCSZjcmFzaF9zaXplLCAmY3Jhc2hfYmFzZSk7CkBAIC0xMjgsNyArMTI1LDcgQEAKIAogCWNyYXNoX3NpemUgPSByZXNvdXJjZV9zaXplKCZjcmFzaGtfcmVzKTsKIAotI2lmbmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKKyNpZm5kZWYgQ09ORklHX05PTlNUQVRJQ19LRVJORUwKIAlpZiAoY3Jhc2hrX3Jlcy5zdGFydCAhPSBLRFVNUF9LRVJORUxCQVNFKQogCQlwcmludGsoIkNyYXNoIGtlcm5lbCBsb2NhdGlvbiBtdXN0IGJlIDB4JXhcbiIsCiAJCQkJS0RVTVBfS0VSTkVMQkFTRSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3BjaS1jb21tb24uYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCmluZGV4IDQ1OGVkM2IuLmZhNGE1NzMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpLWNvbW1vbi5jCkBAIC0yMTQsNyArMjE0LDcgQEAKICAqIElmIHRoZSBpbnRlcnJ1cHQgaXMgdXNlZCwgdGhlbiBnZXRzIHRoZSBpbnRlcnJ1cHQgbGluZSBmcm9tIHRoZQogICogb3BlbmZpcm13YXJlIGFuZCBzZXRzIGl0IGluIHRoZSBwY2lfZGV2IGFuZCBwY2lfY29uZmlnIGxpbmUuCiAgKi8KLWludCBwY2lfcmVhZF9pcnFfbGluZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3N0YXRpYyBpbnQgcGNpX3JlYWRfaXJxX2xpbmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCiB7CiAJc3RydWN0IG9mX2lycSBvaXJxOwogCXVuc2lnbmVkIGludCB2aXJxOwpAQCAtMjgzLDcgKzI4Myw2IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0wocGNpX3JlYWRfaXJxX2xpbmUpOwogCiAvKgogICogUGxhdGZvcm0gc3VwcG9ydCBmb3IgL3Byb2MvYnVzL3BjaS9YL1kgbW1hcCgpcywKQEAgLTkyMSwxOCArOTIwLDIyIEBACiAJCXN0cnVjdCByZXNvdXJjZSAqcmVzID0gZGV2LT5yZXNvdXJjZSArIGk7CiAJCWlmICghcmVzLT5mbGFncykKIAkJCWNvbnRpbnVlOwotCQkvKiBPbiBwbGF0Zm9ybXMgdGhhdCBoYXZlIFBDSV9QUk9CRV9PTkxZIHNldCwgd2UgZG9uJ3QKLQkJICogY29uc2lkZXIgMCBhcyBhbiB1bmFzc2lnbmVkIEJBUiB2YWx1ZS4gSXQncyB0ZWNobmljYWxseQotCQkgKiBhIHZhbGlkIHZhbHVlLCBidXQgbGludXggZG9lc24ndCBsaWtlIGl0Li4uIHNvIHdoZW4gd2UgY2FuCi0JCSAqIHJlLWFzc2lnbiB0aGluZ3MsIHdlIGRvIHNvLCBidXQgaWYgd2UgY2FuJ3QsIHdlIGtlZXAgaXQKLQkJICogYXJvdW5kIGFuZCBob3BlIGZvciB0aGUgYmVzdC4uLgorCisJCS8qIElmIHdlJ3JlIGdvaW5nIHRvIHJlLWFzc2lnbiBldmVyeXRoaW5nLCB3ZSBtYXJrIGFsbCByZXNvdXJjZXMKKwkJICogYXMgdW5zZXQgKGFuZCAwLWJhc2UgdGhlbSkuIEluIGFkZGl0aW9uLCB3ZSBtYXJrIEJBUnMgc3RhcnRpbmcKKwkJICogYXQgMCBhcyB1bnNldCBhcyB3ZWxsLCBleGNlcHQgaWYgUENJX1BST0JFX09OTFkgaXMgYWxzbyBzZXQKKwkJICogc2luY2UgaW4gdGhhdCBjYXNlLCB3ZSBkb24ndCB3YW50IHRvIHJlLWFzc2lnbiBhbnl0aGluZwogCQkgKi8KLQkJaWYgKHJlcy0+c3RhcnQgPT0gMCAmJiAhcGNpX2hhc19mbGFnKFBDSV9QUk9CRV9PTkxZKSkgewotCQkJcHJfZGVidWcoIlBDSTolcyBSZXNvdXJjZSAlZCAlMDE2bGx4LSUwMTZsbHggWyV4XSBpcyB1bmFzc2lnbmVkXG4iLAotCQkJCSBwY2lfbmFtZShkZXYpLCBpLAotCQkJCSAodW5zaWduZWQgbG9uZyBsb25nKXJlcy0+c3RhcnQsCi0JCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpcmVzLT5lbmQsCi0JCQkJICh1bnNpZ25lZCBpbnQpcmVzLT5mbGFncyk7CisJCWlmIChwY2lfaGFzX2ZsYWcoUENJX1JFQVNTSUdOX0FMTF9SU1JDKSB8fAorCQkgICAgKHJlcy0+c3RhcnQgPT0gMCAmJiAhcGNpX2hhc19mbGFnKFBDSV9QUk9CRV9PTkxZKSkpIHsKKwkJCS8qIE9ubHkgcHJpbnQgbWVzc2FnZSBpZiBub3QgcmUtYXNzaWduaW5nICovCisJCQlpZiAoIXBjaV9oYXNfZmxhZyhQQ0lfUkVBU1NJR05fQUxMX1JTUkMpKQorCQkJCXByX2RlYnVnKCJQQ0k6JXMgUmVzb3VyY2UgJWQgJTAxNmxseC0lMDE2bGx4IFsleF0gIgorCQkJCQkgImlzIHVuYXNzaWduZWRcbiIsCisJCQkJCSBwY2lfbmFtZShkZXYpLCBpLAorCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LAorCQkJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPmVuZCwKKwkJCQkJICh1bnNpZ25lZCBpbnQpcmVzLT5mbGFncyk7CiAJCQlyZXMtPmVuZCAtPSByZXMtPnN0YXJ0OwogCQkJcmVzLT5zdGFydCA9IDA7CiAJCQlyZXMtPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CkBAIC0xMDQyLDYgKzEwNDUsMTYgQEAKIAkJaWYgKGkgPj0gMyAmJiBidXMtPnNlbGYtPnRyYW5zcGFyZW50KQogCQkJY29udGludWU7CiAKKwkJLyogSWYgd2UgYXJlIGdvaW5nIHRvIHJlLWFzc2lnbiBldmVyeXRoaW5nLCBtYXJrIHRoZSByZXNvdXJjZQorCQkgKiBhcyB1bnNldCBhbmQgbW92ZSBpdCBkb3duIHRvIDAKKwkJICovCisJCWlmIChwY2lfaGFzX2ZsYWcoUENJX1JFQVNTSUdOX0FMTF9SU1JDKSkgeworCQkJcmVzLT5mbGFncyB8PSBJT1JFU09VUkNFX1VOU0VUOworCQkJcmVzLT5lbmQgLT0gcmVzLT5zdGFydDsKKwkJCXJlcy0+c3RhcnQgPSAwOworCQkJY29udGludWU7CisJCX0KKwogCQlwcl9kZWJ1ZygiUENJOiVzIEJ1cyByc3JjICVkICUwMTZsbHgtJTAxNmxseCBbJXhdIGZpeHVwLi4uXG4iLAogCQkJIHBjaV9uYW1lKGRldiksIGksCiAJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZylyZXMtPnN0YXJ0LFwKQEAgLTEyNjIsMTggKzEyNzUsMTUgQEAKIAlwY2lfYnVzX2Zvcl9lYWNoX3Jlc291cmNlKGJ1cywgcmVzLCBpKSB7CiAJCWlmICghcmVzIHx8ICFyZXMtPmZsYWdzIHx8IHJlcy0+c3RhcnQgPiByZXMtPmVuZCB8fCByZXMtPnBhcmVudCkKIAkJCWNvbnRpbnVlOworCisJCS8qIElmIHRoZSByZXNvdXJjZSB3YXMgbGVmdCB1bnNldCBhdCB0aGlzIHBvaW50LCB3ZSBjbGVhciBpdCAqLworCQlpZiAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfVU5TRVQpCisJCQlnb3RvIGNsZWFyX3Jlc291cmNlOworCiAJCWlmIChidXMtPnBhcmVudCA9PSBOVUxMKQogCQkJcHIgPSAocmVzLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pID8KIAkJCQkmaW9wb3J0X3Jlc291cmNlIDogJmlvbWVtX3Jlc291cmNlOwogCQllbHNlIHsKLQkJCS8qIERvbid0IGJvdGhlciB3aXRoIG5vbi1yb290IGJ1c3NlcyB3aGVuCi0JCQkgKiByZS1hc3NpZ25pbmcgYWxsIHJlc291cmNlcy4gV2UgY2xlYXIgdGhlCi0JCQkgKiByZXNvdXJjZSBmbGFncyBhcyBpZiB0aGV5IHdlcmUgY29sbGlkaW5nCi0JCQkgKiBhbmQgYXMgc3VjaCBlbnN1cmUgcHJvcGVyIHJlLWFsbG9jYXRpb24KLQkJCSAqIGxhdGVyLgotCQkJICovCi0JCQlpZiAocGNpX2hhc19mbGFnKFBDSV9SRUFTU0lHTl9BTExfUlNSQykpCi0JCQkJZ290byBjbGVhcl9yZXNvdXJjZTsKIAkJCXByID0gcGNpX2ZpbmRfcGFyZW50X3Jlc291cmNlKGJ1cy0+c2VsZiwgcmVzKTsKIAkJCWlmIChwciA9PSByZXMpIHsKIAkJCQkvKiB0aGlzIGhhcHBlbnMgd2hlbiB0aGUgZ2VuZXJpYyBQQ0kKQEAgLTEzMDQsOSArMTMxNCw5IEBACiAJCQlpZiAocmVwYXJlbnRfcmVzb3VyY2VzKHByLCByZXMpID09IDApCiAJCQkJY29udGludWU7CiAJCX0KLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiUENJOiBDYW5ub3QgYWxsb2NhdGUgcmVzb3VyY2UgcmVnaW9uICIKLQkJICAgICAgICIlZCBvZiBQQ0kgYnJpZGdlICVkLCB3aWxsIHJlbWFwXG4iLCBpLCBidXMtPm51bWJlcik7Ci1jbGVhcl9yZXNvdXJjZToKKwkJcHJfd2FybmluZygiUENJOiBDYW5ub3QgYWxsb2NhdGUgcmVzb3VyY2UgcmVnaW9uICIKKwkJCSAgICIlZCBvZiBQQ0kgYnJpZGdlICVkLCB3aWxsIHJlbWFwXG4iLCBpLCBidXMtPm51bWJlcik7CisJY2xlYXJfcmVzb3VyY2U6CiAJCXJlcy0+c3RhcnQgPSByZXMtPmVuZCA9IDA7CiAJCXJlcy0+ZmxhZ3MgPSAwOwogCX0KQEAgLTE0NTEsMTYgKzE0NjEsMTEgQEAKIHsKIAlzdHJ1Y3QgcGNpX2J1cyAqYjsKIAotCS8qIEFsbG9jYXRlIGFuZCBhc3NpZ24gcmVzb3VyY2VzLiBJZiB3ZSByZS1hc3NpZ24gZXZlcnl0aGluZywgdGhlbgotCSAqIHdlIHNraXAgdGhlIGFsbG9jYXRlIHBoYXNlCi0JICovCisJLyogQWxsb2NhdGUgYW5kIGFzc2lnbiByZXNvdXJjZXMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZwY2lfcm9vdF9idXNlcywgbm9kZSkKIAkJcGNpYmlvc19hbGxvY2F0ZV9idXNfcmVzb3VyY2VzKGIpOwotCi0JaWYgKCFwY2lfaGFzX2ZsYWcoUENJX1JFQVNTSUdOX0FMTF9SU1JDKSkgewotCQlwY2liaW9zX2FsbG9jYXRlX3Jlc291cmNlcygwKTsKLQkJcGNpYmlvc19hbGxvY2F0ZV9yZXNvdXJjZXMoMSk7Ci0JfQorCXBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKDApOworCXBjaWJpb3NfYWxsb2NhdGVfcmVzb3VyY2VzKDEpOwogCiAJLyogQmVmb3JlIHdlIHN0YXJ0IGFzc2lnbmluZyB1bmFzc2lnbmVkIHJlc291cmNlLCB3ZSB0cnkgdG8gcmVzZXJ2ZQogCSAqIHRoZSBsb3cgSU8gYXJlYSBhbmQgdGhlIFZHQSBtZW1vcnkgYXJlYSBpZiB0aGV5IGludGVyc2VjdCB0aGUKQEAgLTE3MzIsNiArMTczNywxMiBAQAogCWlmIChtb2RlID09IFBDSV9QUk9CRV9OT1JNQUwpCiAJCWhvc2UtPmxhc3RfYnVzbm8gPSBidXMtPnN1Ym9yZGluYXRlID0gcGNpX3NjYW5fY2hpbGRfYnVzKGJ1cyk7CiAKKwkvKiBQbGF0Zm9ybSBnZXRzIGEgY2hhbmNlIHRvIGRvIHNvbWUgZ2xvYmFsIGZpeHVwcyBiZWZvcmUKKwkgKiB3ZSBwcm9jZWVkIHRvIHJlc291cmNlIGFsbG9jYXRpb24KKwkgKi8KKwlpZiAocHBjX21kLnBjaWJpb3NfZml4dXBfcGhiKQorCQlwcGNfbWQucGNpYmlvc19maXh1cF9waGIoaG9zZSk7CisKIAkvKiBDb25maWd1cmUgUENJIEV4cHJlc3Mgc2V0dGluZ3MgKi8KIAlpZiAoYnVzICYmICFwY2lfaGFzX2ZsYWcoUENJX1BST0JFX09OTFkpKSB7CiAJCXN0cnVjdCBwY2lfYnVzICpjaGlsZDsKQEAgLTE3NDcsMTAgKzE3NTgsMTMgQEAKIHN0YXRpYyB2b2lkIGZpeHVwX2hpZGVfaG9zdF9yZXNvdXJjZV9mc2woc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlpbnQgaSwgY2xhc3MgPSBkZXYtPmNsYXNzID4+IDg7CisJLyogV2hlbiBjb25maWd1cmVkIGFzIGFnZW50LCBwcm9ncmFtaW5nIGludGVyZmFjZSA9IDEgKi8KKwlpbnQgcHJvZ19pZiA9IGRldi0+Y2xhc3MgJiAweGY7CiAKIAlpZiAoKGNsYXNzID09IFBDSV9DTEFTU19QUk9DRVNTT1JfUE9XRVJQQyB8fAogCSAgICAgY2xhc3MgPT0gUENJX0NMQVNTX0JSSURHRV9PVEhFUikgJiYKIAkJKGRldi0+aGRyX3R5cGUgPT0gUENJX0hFQURFUl9UWVBFX05PUk1BTCkgJiYKKwkJKHByb2dfaWYgPT0gMCkgJiYKIAkJKGRldi0+YnVzLT5wYXJlbnQgPT0gTlVMTCkpIHsKIAkJZm9yIChpID0gMDsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKSB7CiAJCQlkZXYtPnJlc291cmNlW2ldLnN0YXJ0ID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RuLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BjaV9kbi5jCmluZGV4IDRlNjlkZWIuLmRkOWU0YTAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGNpX2RuLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2lfZG4uYwpAQCAtNTAsNiArNTAsOSBAQAogCWRuLT5kYXRhID0gcGRuOwogCXBkbi0+bm9kZSA9IGRuOwogCXBkbi0+cGhiID0gcGhiOworI2lmZGVmIENPTkZJR19QUENfUE9XRVJOVgorCXBkbi0+cGVfbnVtYmVyID0gSU9EQV9JTlZBTElEX1BFOworI2VuZGlmCiAJcmVncyA9IG9mX2dldF9wcm9wZXJ0eShkbiwgInJlZyIsIE5VTEwpOwogCWlmIChyZWdzKSB7CiAJCS8qIEZpcnN0IHJlZ2lzdGVyIGVudHJ5IGlzIGFkZHIgKDAwQkJTUzAwKSAgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNjQ1NzU3NC4uZWJlNTc2NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTU4NCwxNiArNTg0LDMyIEBACiAJdW5zaWduZWQgbG9uZyBiaXQ7CiAJY29uc3QgY2hhciAqbmFtZTsKIH0gbXNyX2JpdHNbXSA9IHsKKyNpZiBkZWZpbmVkKENPTkZJR19QUEM2NCkgJiYgIWRlZmluZWQoQ09ORklHX0JPT0tFKQorCXtNU1JfU0YsCSJTRiJ9LAorCXtNU1JfSFYsCSJIViJ9LAorI2VuZGlmCisJe01TUl9WRUMsCSJWRUMifSwKKwl7TVNSX1ZTWCwJIlZTWCJ9LAorI2lmZGVmIENPTkZJR19CT09LRQorCXtNU1JfQ0UsCSJDRSJ9LAorI2VuZGlmCiAJe01TUl9FRSwJIkVFIn0sCiAJe01TUl9QUiwJIlBSIn0sCiAJe01TUl9GUCwJIkZQIn0sCi0Je01TUl9WRUMsCSJWRUMifSwKLQl7TVNSX1ZTWCwJIlZTWCJ9LAogCXtNU1JfTUUsCSJNRSJ9LAotCXtNU1JfQ0UsCSJDRSJ9LAorI2lmZGVmIENPTkZJR19CT09LRQogCXtNU1JfREUsCSJERSJ9LAorI2Vsc2UKKwl7TVNSX1NFLAkiU0UifSwKKwl7TVNSX0JFLAkiQkUifSwKKyNlbmRpZgogCXtNU1JfSVIsCSJJUiJ9LAogCXtNU1JfRFIsCSJEUiJ9LAorCXtNU1JfUE1NLAkiUE1NIn0sCisjaWZuZGVmIENPTkZJR19CT09LRQorCXtNU1JfUkksCSJSSSJ9LAorCXtNU1JfTEUsCSJMRSJ9LAorI2VuZGlmCiAJezAsCQlOVUxMfQogfTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwppbmRleCBmYTEyMzViLi5hYmU0MDVkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb20uYwpAQCAtNzMzLDggKzczMyw2IEBACiAJb2Zfc2Nhbl9mbGF0X2R0KGVhcmx5X2luaXRfZHRfc2Nhbl9jaG9zZW5fcHBjLCBjbWRfbGluZSk7CiAKIAkvKiBTY2FuIG1lbW9yeSBub2RlcyBhbmQgcmVidWlsZCBNRU1CTE9DS3MgKi8KLQltZW1ibG9ja19pbml0KCk7Ci0KIAlvZl9zY2FuX2ZsYXRfZHQoZWFybHlfaW5pdF9kdF9zY2FuX3Jvb3QsIE5VTEwpOwogCW9mX3NjYW5fZmxhdF9kdChlYXJseV9pbml0X2R0X3NjYW5fbWVtb3J5X3BwYywgTlVMTCk7CiAKQEAgLTc1NiwyMCArNzU0LDE0IEBACiAJZWFybHlfcmVzZXJ2ZV9tZW0oKTsKIAlwaHlwX2R1bXBfcmVzZXJ2ZV9tZW0oKTsKIAotCWxpbWl0ID0gbWVtb3J5X2xpbWl0OwotCWlmICghIGxpbWl0KSB7Ci0JCXBoeXNfYWRkcl90IG1lbXNpemU7Ci0KLQkJLyogRW5zdXJlIHRoYXQgdG90YWwgbWVtb3J5IHNpemUgaXMgcGFnZS1hbGlnbmVkLCBiZWNhdXNlCi0JCSAqIG90aGVyd2lzZSBtYXJrX2Jvb3RtZW0oKSBnZXRzIHVwc2V0LiAqLwotCQltZW1ibG9ja19hbmFseXplKCk7Ci0JCW1lbXNpemUgPSBtZW1ibG9ja19waHlzX21lbV9zaXplKCk7Ci0JCWlmICgobWVtc2l6ZSAmIFBBR0VfTUFTSykgIT0gbWVtc2l6ZSkKLQkJCWxpbWl0ID0gbWVtc2l6ZSAmIFBBR0VfTUFTSzsKLQl9CisJLyoKKwkgKiBFbnN1cmUgdGhhdCB0b3RhbCBtZW1vcnkgc2l6ZSBpcyBwYWdlLWFsaWduZWQsIGJlY2F1c2Ugb3RoZXJ3aXNlCisJICogbWFya19ib290bWVtKCkgZ2V0cyB1cHNldC4KKwkgKi8KKwlsaW1pdCA9IEFMSUdOKG1lbW9yeV9saW1pdCA/OiBtZW1ibG9ja19waHlzX21lbV9zaXplKCksIFBBR0VfU0laRSk7CiAJbWVtYmxvY2tfZW5mb3JjZV9tZW1vcnlfbGltaXQobGltaXQpOwogCi0JbWVtYmxvY2tfYW5hbHl6ZSgpOworCW1lbWJsb2NrX2FsbG93X3Jlc2l6ZSgpOwogCW1lbWJsb2NrX2R1bXBfYWxsKCk7CiAKIAlEQkcoIlBoeXMuIG1lbTogJWxseFxuIiwgbWVtYmxvY2tfcGh5c19tZW1fc2l6ZSgpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Byb21faW5pdC5jCmluZGV4IGNjNTg0ODYuLmVjYTYyNmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcHJvbV9pbml0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcm9tX2luaXQuYwpAQCAtNzQyLDcgKzc0Miw3IEBACiAJVygweGZmZmZmZmZmKSwJCQkvKiB2aXJ0X2Jhc2UgKi8KIAlXKDB4ZmZmZmZmZmYpLAkJCS8qIHZpcnRfc2l6ZSAqLwogCVcoMHhmZmZmZmZmZiksCQkJLyogbG9hZF9iYXNlICovCi0JVyg2NCksCQkJCS8qIDY0TUIgbWluIFJNQSAqLworCVcoMjU2KSwJCQkJLyogMjU2TUIgbWluIFJNQSAqLwogCVcoMHhmZmZmZmZmZiksCQkJLyogZnVsbCBjbGllbnQgbG9hZCAqLwogCTAsCQkJCS8qIG1pbiBSTUEgcGVyY2VudGFnZSBvZiB0b3RhbCBSQU0gKi8KIAk0OCwJCQkJLyogbWF4IGxvZ18yKGhhc2ggdGFibGUgc2l6ZSkgKi8KQEAgLTEyMjQsMTQgKzEyMjQsNiBAQAogCiAJUkVMT0MoYWxsb2NfYm90dG9tKSA9IFBBR0VfQUxJR04oKHVuc2lnbmVkIGxvbmcpJlJFTE9DKF9lbmQpICsgMHg0MDAwKTsKIAotCS8qIENoZWNrIGlmIHdlIGhhdmUgYW4gaW5pdHJkIGFmdGVyIHRoZSBrZXJuZWwsIGlmIHdlIGRvIG1vdmUgb3VyIGJvdHRvbQotCSAqIHBvaW50IHRvIGFmdGVyIGl0Ci0JICovCi0JaWYgKFJFTE9DKHByb21faW5pdHJkX3N0YXJ0KSkgewotCQlpZiAoUkVMT0MocHJvbV9pbml0cmRfZW5kKSA+IFJFTE9DKGFsbG9jX2JvdHRvbSkpCi0JCQlSRUxPQyhhbGxvY19ib3R0b20pID0gUEFHRV9BTElHTihSRUxPQyhwcm9tX2luaXRyZF9lbmQpKTsKLQl9Ci0KIAkvKgogCSAqIElmIHByb21fbWVtb3J5X2xpbWl0IGlzIHNldCB3ZSByZWR1Y2UgdGhlIHVwcGVyIGxpbWl0cyAqZXhjZXB0KiBmb3IKIAkgKiBhbGxvY190b3BfaGlnaC4gVGhpcyBtdXN0IGJlIHRoZSByZWFsIHRvcCBvZiBSQU0gc28gd2UgY2FuIHB1dApAQCAtMTI2OSw2ICsxMjYxLDE1IEBACiAJUkVMT0MoYWxsb2NfdG9wKSA9IFJFTE9DKHJtb190b3ApOwogCVJFTE9DKGFsbG9jX3RvcF9oaWdoKSA9IFJFTE9DKHJhbV90b3ApOwogCisJLyoKKwkgKiBDaGVjayBpZiB3ZSBoYXZlIGFuIGluaXRyZCBhZnRlciB0aGUga2VybmVsIGJ1dCBzdGlsbCBpbnNpZGUKKwkgKiB0aGUgUk1PLiAgSWYgd2UgZG8gbW92ZSBvdXIgYm90dG9tIHBvaW50IHRvIGFmdGVyIGl0LgorCSAqLworCWlmIChSRUxPQyhwcm9tX2luaXRyZF9zdGFydCkgJiYKKwkgICAgUkVMT0MocHJvbV9pbml0cmRfc3RhcnQpIDwgUkVMT0Mocm1vX3RvcCkgJiYKKwkgICAgUkVMT0MocHJvbV9pbml0cmRfZW5kKSA+IFJFTE9DKGFsbG9jX2JvdHRvbSkpCisJCVJFTE9DKGFsbG9jX2JvdHRvbSkgPSBQQUdFX0FMSUdOKFJFTE9DKHByb21faW5pdHJkX2VuZCkpOworCiAJcHJvbV9wcmludGYoIm1lbW9yeSBsYXlvdXQgYXQgaW5pdDpcbiIpOwogCXByb21fcHJpbnRmKCIgIG1lbW9yeV9saW1pdCA6ICV4ICgxNiBNQiBhbGlnbmVkKVxuIiwgUkVMT0MocHJvbV9tZW1vcnlfbGltaXQpKTsKIAlwcm9tX3ByaW50ZigiICBhbGxvY19ib3R0b20gOiAleFxuIiwgUkVMT0MoYWxsb2NfYm90dG9tKSk7CkBAIC0yMDc5LDcgKzIwODAsNyBAQAogCQkvKiBTZXR1cCBhIHVzYWJsZSBjb2xvciB0YWJsZSB3aGVuIHRoZSBhcHByb3ByaWF0ZQogCQkgKiBtZXRob2QgaXMgYXZhaWxhYmxlLiBTaG91bGQgdXBkYXRlIHRoaXMgdG8gc2V0LWNvbG9ycyAqLwogCQljbHV0ID0gUkVMT0MoZGVmYXVsdF9jb2xvcnMpOwotCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKywgY2x1dCArPSAzKQorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKywgY2x1dCArPSAzKQogCQkJaWYgKHByb21fc2V0X2NvbG9yKGloLCBpLCBjbHV0WzBdLCBjbHV0WzFdLAogCQkJCQkgICBjbHV0WzJdKSAhPSAwKQogCQkJCWJyZWFrOwpAQCAtMjg0NCw3ICsyODQ1LDcgQEAKIAlSRUxPQyhvZl9wbGF0Zm9ybSkgPSBwcm9tX2ZpbmRfbWFjaGluZV90eXBlKCk7CiAJcHJvbV9wcmludGYoIkRldGVjdGVkIG1hY2hpbmUgdHlwZTogJXhcbiIsIFJFTE9DKG9mX3BsYXRmb3JtKSk7CiAKLSNpZm5kZWYgQ09ORklHX1JFTE9DQVRBQkxFCisjaWZuZGVmIENPTkZJR19OT05TVEFUSUNfS0VSTkVMCiAJLyogQmFpbCBpZiB0aGlzIGlzIGEga2R1bXAga2VybmVsLiAqLwogCWlmIChQSFlTSUNBTF9TVEFSVCA+IDApCiAJCXByb21fcGFuaWMoIkVycm9yOiBZb3UgY2FuJ3QgYm9vdCBhIGtkdW1wIGtlcm5lbCBmcm9tIE9GIVxuIik7CkBAIC0yOTY5LDkgKzI5NzAsMTEgQEAKIAkvKgogCSAqIGluIGNhc2Ugc3RkaW4gaXMgVVNCIGFuZCBzdGlsbCBhY3RpdmUgb24gSUJNIG1hY2hpbmVzLi4uCiAJICogVW5mb3J0dW5hdGVseSBxdWllc2NlIGNyYXNoZXMgb24gc29tZSBwb3dlcm1hY3MgaWYgd2UgaGF2ZQotCSAqIGNsb3NlZCBzdGRpbiBhbHJlYWR5IChpbiBwYXJ0aWN1bGFyIHRoZSBwb3dlcmJvb2sgMTAxKS4KKwkgKiBjbG9zZWQgc3RkaW4gYWxyZWFkeSAoaW4gcGFydGljdWxhciB0aGUgcG93ZXJib29rIDEwMSkuIEl0CisJICogYXBwZWFycyB0aGF0IHRoZSBPUEFMIHZlcnNpb24gb2YgT0ZXIGRvZXNuJ3QgbGlrZSBpdCBlaXRoZXIuCiAJICovCi0JaWYgKFJFTE9DKG9mX3BsYXRmb3JtKSAhPSBQTEFURk9STV9QT1dFUk1BQykKKwlpZiAoUkVMT0Mob2ZfcGxhdGZvcm0pICE9IFBMQVRGT1JNX1BPV0VSTUFDICYmCisJICAgIFJFTE9DKG9mX3BsYXRmb3JtKSAhPSBQTEFURk9STV9PUEFMKQogCQlwcm9tX2Nsb3NlX3N0ZGluKCk7CiAKIAkvKgpAQCAtMjk4Nyw4ICsyOTkwLDEyIEBACiAJICogaXMgY29tbW9uIHRvIHVzIGFuZCBrZXhlYwogCSAqLwogCWhkciA9IFJFTE9DKGR0X2hlYWRlcl9zdGFydCk7Ci0JcHJvbV9wcmludGYoInJldHVybmluZyBmcm9tIHByb21faW5pdFxuIik7Ci0JcHJvbV9kZWJ1ZygiLT5kdF9oZWFkZXJfc3RhcnQ9MHgleFxuIiwgaGRyKTsKKworCS8qIERvbid0IHByaW50IGFueXRoaW5nIGFmdGVyIHF1aWVzY2UgdW5kZXIgT1BBTCwgaXQgY3Jhc2hlcyBPRlcgKi8KKwlpZiAoUkVMT0Mob2ZfcGxhdGZvcm0pICE9IFBMQVRGT1JNX09QQUwpIHsKKwkJcHJvbV9wcmludGYoInJldHVybmluZyBmcm9tIHByb21faW5pdFxuIik7CisJCXByb21fZGVidWcoIi0+ZHRfaGVhZGVyX3N0YXJ0PTB4JXhcbiIsIGhkcik7CisJfQogCiAjaWZkZWYgQ09ORklHX1BQQzMyCiAJcmVsb2NfZ290Migtb2Zmc2V0KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcmVsb2NfMzIuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcmVsb2NfMzIuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQ2YmE2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9yZWxvY18zMi5TCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29kZSB0byBwcm9jZXNzIGR5bmFtaWMgcmVsb2NhdGlvbnMgZm9yIFBQQzMyLgorICoKKyAqIENvcHlyaWdodHMgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxMS4KKyAqCUF1dGhvcjogU3V6dWtpIFBvdWxvc2UgPHN1enVraUBpbi5pYm0uY29tPgorICoKKyAqICAtIEJhc2VkIG9uIHBwYzY0IGNvZGUgLSByZWxvY182NC5TCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGFzbS9wcGNfYXNtLmg+CisKKy8qIER5bmFtaWMgc2VjdGlvbiB0YWJsZSBlbnRyeSB0YWdzICovCitEVF9SRUxBID0gNwkJCS8qIFRhZyBmb3IgRWxmMzJfUmVsYSBzZWN0aW9uICovCitEVF9SRUxBU1ogPSA4CQkJLyogU2l6ZSBvZiB0aGUgUmVsYSByZWxvY3MgKi8KK0RUX1JFTEFFTlQgPSA5CQkJLyogU2l6ZSBvZiBvbmUgUmVsYSByZWxvYyBlbnRyeSAqLworCitTVE5fVU5ERUYgPSAwCQkJLyogVW5kZWZpbmVkIHN5bWJvbCBpbmRleCAqLworU1RCX0xPQ0FMID0gMAkJCS8qIExvY2FsIGJpbmRpbmcgZm9yIHRoZSBzeW1ib2wgKi8KKworUl9QUENfQUREUjE2X0xPID0gNAkJLyogTG93ZXIgaGFsZiBvZiAoUytBKSAqLworUl9QUENfQUREUjE2X0hJID0gNQkJLyogVXBwZXIgaGFsZiBvZiAoUytBKSAqLworUl9QUENfQUREUjE2X0hBID0gNgkJLyogSGlnaCBBZGp1c3RlZCAoUytBKSAqLworUl9QUENfUkVMQVRJVkUgPSAyMgorCisvKgorICogcjMgPSBkZXNpcmVkIGZpbmFsIGFkZHJlc3MKKyAqLworCitfR0xPQkFMKHJlbG9jYXRlKQorCisJbWZscglyMAkJLyogU2F2ZSBvdXIgTFIgKi8KKwlibAkwZgkJLyogRmluZCBvdXIgY3VycmVudCBydW50aW1lIGFkZHJlc3MgKi8KKzA6CW1mbHIJcjEyCQkvKiBNYWtlIGl0IGFjY2Vzc2libGUgKi8KKwltdGxyCXIwCisKKwlsd3oJcjExLCAocF9keW4gLSAwYikocjEyKQorCWFkZAlyMTEsIHIxMSwgcjEyCS8qIHJ1bnRpbWUgYWRkcmVzcyBvZiAuZHluYW1pYyBzZWN0aW9uICovCisJbHd6CXI5LCAocF9yZWxhIC0gMGIpKHIxMikKKwlhZGQJcjksIHI5LCByMTIJLyogcnVudGltZSBhZGRyZXNzIG9mIC5yZWxhLmR5biBzZWN0aW9uICovCisJbHd6CXIxMCwgKHBfc3QgLSAwYikocjEyKQorCWFkZAlyMTAsIHIxMCwgcjEyCS8qIHJ1bnRpbWUgYWRkcmVzcyBvZiBfc3RleHQgc2VjdGlvbiAqLworCWx3eglyMTMsIChwX3N5bSAtIDBiKShyMTIpCisJYWRkCXIxMywgcjEzLCByMTIJLyogcnVudGltZSBhZGRyZXNzIG9mIC5keW5zeW0gc2VjdGlvbiAqLworCisJLyoKKwkgKiBTY2FuIHRoZSBkeW5hbWljIHNlY3Rpb24gZm9yIFJFTEEsIFJFTEFTWiBlbnRyaWVzCisJICovCisJbGkJcjYsIDAKKwlsaQlyNywgMAorCWxpCXI4LCAwCisxOglsd3oJcjUsIDAocjExKQkvKiBFTEZfRHluLmRfdGFnICovCisJY21wd2kJcjUsIDAJCS8qIEVuZCBvZiBFTEZfRHluW10gKi8KKwliZXEJZW9keW4KKwljbXB3aQlyNSwgRFRfUkVMQQorCWJuZQlyZWxhc3oKKwlsd3oJcjcsIDQocjExKQkvKiByNyA9IHJlbGEubGluayAqLworCWIJc2tpcAorcmVsYXN6OgorCWNtcHdpCXI1LCBEVF9SRUxBU1oKKwlibmUJcmVsYWVudAorCWx3eglyOCwgNChyMTEpCS8qIHI4ID0gVG90YWwgUmVsYSByZWxvY3Mgc2l6ZSAqLworCWIJc2tpcAorcmVsYWVudDoKKwljbXB3aQlyNSwgRFRfUkVMQUVOVAorCWJuZQlza2lwCisJbHd6CXI2LCA0KHIxMSkJLyogcjYgPSBTaXplIG9mIG9uZSBSZWxhIHJlbG9jICovCitza2lwOgorCWFkZGkJcjExLCByMTEsIDgKKwliCTFiCitlb2R5bjoJCQkJLyogRW5kIG9mIER5biBUYWJsZSBzY2FuICovCisKKwkvKiBDaGVjayBpZiB3ZSBoYXZlIGZvdW5kIGFsbCB0aGUgZW50cmllcyAqLworCWNtcHdpCXI3LCAwCisJYmVxCWRvbmUKKwljbXB3aQlyOCwgMAorCWJlcQlkb25lCisJY21wd2kJcjYsIDAKKwliZXEJZG9uZQorCisKKwkvKgorCSAqIFdvcmsgb3V0IHRoZSBjdXJyZW50IG9mZnNldCBmcm9tIHRoZSBsaW5rIHRpbWUgYWRkcmVzcyBvZiAucmVsYQorCSAqIHNlY3Rpb24uCisJICogIGN1cl9vZmZzZXRbcjddID0gcmVsYS5ydW5bcjldIC0gcmVsYS5saW5rIFtyN10KKwkgKiAgX3N0ZXh0LmxpbmtbcjEyXSA9IF9zdGV4dC5ydW5bcjEwXSAtIGN1cl9vZmZzZXRbcjddCisJICogIGZpbmFsX29mZnNldFtyM10gPSBfc3RleHQuZmluYWxbcjNdIC0gX3N0ZXh0LmxpbmtbcjEyXQorCSAqLworCXN1YmYJcjcsIHI3LCByOQkvKiBjdXJfb2Zmc2V0ICovCisJc3ViZglyMTIsIHI3LCByMTAKKwlzdWJmCXIzLCByMTIsIHIzCS8qIGZpbmFsX29mZnNldCAqLworCisJc3ViZglyOCwgcjYsIHI4CS8qIHJlbGF6IC09IHJlbGFlbnQgKi8KKwkvKgorCSAqIFNjYW4gdGhyb3VnaCB0aGUgLnJlbGEgdGFibGUgYW5kIHByb2Nlc3MgZWFjaCBlbnRyeQorCSAqIHI5CS0gcG9pbnRzIHRvIHRoZSBjdXJyZW50IC5yZWxhIHRhYmxlIGVudHJ5CisJICogcjEzCS0gcG9pbnRzIHRvIHRoZSBzeW1ib2wgdGFibGUKKwkgKi8KKworCS8qCisJICogQ2hlY2sgaWYgd2UgaGF2ZSBhIHJlbG9jYXRpb24gYmFzZWQgb24gc3ltYm9sCisJICogcjUgd2lsbCBob2xkIHRoZSB2YWx1ZSBvZiB0aGUgc3ltYm9sLgorCSAqLworYXBwbHlyZWxhOgorCWx3eglyNCwgNChyOSkJCS8qIHI0ID0gcmVsYS5yX2luZm8gKi8KKwlzcndpCXI1LCByNCwgOAkJLyogRUxGMzJfUl9TWU0ocl9pbmZvKSAqLworCWNtcHdpCXI1LCBTVE5fVU5ERUYJLyogc3ltID09IFNUTl9VTkRFRiA/ICovCisJYmVxCWdldF90eXBlCS8qIHZhbHVlID0gMCAqLworCS8qIEZpbmQgdGhlIHZhbHVlIG9mIHRoZSBzeW1ib2wgYXQgaW5kZXgocjUpICovCisJc2x3aQlyNSwgcjUsIDQJCS8qIHI1ID0gcjUgKiBzaXplb2YoRWxmMzJfU3ltKSAqLworCWFkZAlyMTIsIHIxMywgcjUJLyogcjEyID0gJl9fZHluX3N5bVtJbmRleF0gKi8KKworCS8qCisJICogR05VIGxkIGhhcyBhIGJ1Zywgd2hlcmUgZHluYW1pYyByZWxvY3MgYmFzZWQgb24KKwkgKiBTVEJfTE9DQUwgc3ltYm9scywgdGhlIHZhbHVlIHNob3VsZCBiZSBhc3N1bWVkCisJICogdG8gYmUgemVyby4gLSBBbGFuIE1vZHJhCisJICovCisJLyogWFhYOiBEbyB3ZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGFyZSB1c2luZyBHTlUgbGQgPyAqLworCWxieglyNSwgMTIocjEyKQkvKiByNSA9IGR5bl9zeW1bSW5kZXhdLnN0X2luZm8gKi8KKwlleHRyd2kJcjUsIHI1LCA0LCAyNAkvKiByNSA9IEVMRjMyX1NUX0JJTkQocjUpICovCisJY21wd2kJcjUsIFNUQl9MT0NBTAkvKiBzdF92YWx1ZSA9IDAsIGxkIGJ1ZyAqLworCWJlcQlnZXRfdHlwZQkvKiBXZSBoYXZlIHI1ID0gMCAqLworCWx3eglyNSwgNChyMTIpCS8qIHI1ID0gX19keW5fc3ltW0luZGV4XS5zdF92YWx1ZSAqLworCitnZXRfdHlwZToKKwkvKiBMb2FkIHRoZSByZWxvY2F0aW9uIHR5cGUgdG8gcjQgKi8KKwlleHRyd2kJcjQsIHI0LCA4LCAyNAkvKiByNCA9IEVMRjMyX1JfVFlQRShyX2luZm8pID0gKChjaGFyKilyNClbM10gKi8KKworCS8qIFJfUFBDX1JFTEFUSVZFICovCisJY21wd2kJcjQsIFJfUFBDX1JFTEFUSVZFCisJYm5lCWhpMTYKKwlsd3oJcjQsIDAocjkpCS8qIHJfb2Zmc2V0ICovCisJbHd6CXIwLCA4KHI5KQkvKiByX2FkZGVuZCAqLworCWFkZAlyMCwgcjAsIHIzCS8qIGZpbmFsIGFkZGVuZCAqLworCXN0d3gJcjAsIHI0LCByNwkvKiBtZW1vcnlbcjQrcjddKSA9ICh1MzIpcjAgKi8KKwliCW54dHJlbGEJCS8qIGNvbnRpbnVlICovCisKKwkvKiBSX1BQQ19BRERSMTZfSEkgKi8KK2hpMTY6CisJY21wd2kJcjQsIFJfUFBDX0FERFIxNl9ISQorCWJuZQloYTE2CisJbHd6CXI0LCAwKHI5KQkvKiByX29mZnNldCAqLworCWx3eglyMCwgOChyOSkJLyogcl9hZGRlbmQgKi8KKwlhZGQJcjAsIHIwLCByMworCWFkZAlyMCwgcjAsIHI1CS8qIHIwID0gKFMrQStPZmZzZXQpICovCisJZXh0cndpCXIwLCByMCwgMTYsIDAJLyogcjAgPSAocjAgPj4gMTYpICovCisJYglzdG9yZV9oYWxmCisKKwkvKiBSX1BQQ19BRERSMTZfSEEgKi8KK2hhMTY6CisJY21wd2kJcjQsIFJfUFBDX0FERFIxNl9IQQorCWJuZQlsbzE2CisJbHd6CXI0LCAwKHI5KQkvKiByX29mZnNldCAqLworCWx3eglyMCwgOChyOSkJLyogcl9hZGRlbmQgKi8KKwlhZGQJcjAsIHIwLCByMworCWFkZAlyMCwgcjAsIHI1CS8qIHIwID0gKFMrQStPZmZzZXQpICovCisJZXh0cndpCXI1LCByMCwgMSwgMTYJLyogRXh0cmFjdCBiaXQgMTYgKi8KKwlleHRyd2kJcjAsIHIwLCAxNiwgMAkvKiByMCA9IChyMCA+PiAxNikgKi8KKwlhZGQJcjAsIHIwLCByNQkvKiBBZGQgaXQgdG8gcjAgKi8KKwliCXN0b3JlX2hhbGYKKworCS8qIFJfUFBDX0FERFIxNl9MTyAqLworbG8xNjoKKwljbXB3aQlyNCwgUl9QUENfQUREUjE2X0xPCisJYm5lCW54dHJlbGEKKwlsd3oJcjQsIDAocjkpCS8qIHJfb2Zmc2V0ICovCisJbHd6CXIwLCA4KHI5KQkvKiByX2FkZGVuZCAqLworCWFkZAlyMCwgcjAsIHIzCisJYWRkCXIwLCByMCwgcjUJLyogcjAgPSAoUytBK09mZnNldCkgKi8KKwlleHRyd2kJcjAsIHIwLCAxNiwgMTYJLyogcjAgJj0gMHhmZmZmICovCisJLyogRmFsbCB0aHJvdWdoIHRvICovCisKKwkvKiBTdG9yZSBoYWxmIHdvcmQgKi8KK3N0b3JlX2hhbGY6CisJc3RoeAlyMCwgcjQsIHI3CS8qIG1lbW9yeVtyNCtyN10gPSAodTE2KXIwICovCisKK254dHJlbGE6CisJLyoKKwkgKiBXZSBoYXZlIHRvIGZsdXNoIHRoZSBtb2RpZmllZCBpbnN0cnVjdGlvbnMgdG8gdGhlCisJICogbWFpbiBzdG9yYWdlIGZyb20gdGhlIGQtY2FjaGUuIEFuZCBhbHNvLCBpbnZhbGlkYXRlIHRoZQorCSAqIGNhY2hlZCBpbnN0cnVjdGlvbnMgaW4gaS1jYWNoZSB3aGljaCBoYXMgYmVlbiBtb2RpZmllZC4KKwkgKgorCSAqIFdlIGRlbGF5IHRoZSBzeW5jIC8gaXN5bmMgb3BlcmF0aW9uIHRpbGwgdGhlIGVuZCwgc2luY2UKKwkgKiB3ZSB3b24ndCBiZSBleGVjdXRpbmcgdGhlIG1vZGlmaWVkIGluc3RydWN0aW9ucyB1bnRpbAorCSAqIHdlIHJldHVybiBmcm9tIGhlcmUuCisJICovCisJZGNic3QJcjQscjcKKwlzeW5jCQkJLyogRW5zdXJlIHRoZSBkYXRhIGlzIGZsdXNoZWQgYmVmb3JlIGljYmkgKi8KKwlpY2JpCXI0LHI3CisJY21wd2kJcjgsIDAJCS8qIHJlbGFzeiA9IDAgPyAqLworCWJsZQlkb25lCisJYWRkCXI5LCByOSwgcjYJLyogbW92ZSB0byBuZXh0IGVudHJ5IGluIHRoZSAucmVsYSB0YWJsZSAqLworCXN1YmYJcjgsIHI2LCByOAkvKiByZWxhc3ogLT0gcmVsYWVudCAqLworCWIJYXBwbHlyZWxhCisKK2RvbmU6CisJc3luYwkJCS8qIFdhaXQgZm9yIHRoZSBmbHVzaCB0byBmaW5pc2ggKi8KKwlpc3luYwkJCS8qIERpc2NhcmQgcHJlZmV0Y2hlZCBpbnN0cnVjdGlvbnMgKi8KKwlibHIKKworcF9keW46CQkubG9uZwlfX2R5bmFtaWNfc3RhcnQgLSAwYgorcF9yZWxhOgkJLmxvbmcJX19yZWxhX2R5bl9zdGFydCAtIDBiCitwX3N5bToJCS5sb25nCV9fZHluYW1pY19zeW10YWIgLSAwYgorcF9zdDoJCS5sb25nCV9zdGV4dCAtIDBiCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNfZmxhc2guYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19mbGFzaC5jCmluZGV4IGUwMzdjNzQuLjQxNzRiNGIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19mbGFzaC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc19mbGFzaC5jCkBAIC01NjgsNiArNTY4LDEyIEBACiAJfQogCiAJLyoKKwkgKiBKdXN0IGJlZm9yZSBzdGFydGluZyB0aGUgZmlybXdhcmUgZmxhc2gsIGNhbmNlbCB0aGUgZXZlbnQgc2NhbiB3b3JrCisJICogdG8gYXZvaWQgYW55IHNvZnQgbG9ja3VwIGlzc3Vlcy4KKwkgKi8KKwlydGFzX2NhbmNlbF9ldmVudF9zY2FuKCk7CisKKwkvKgogCSAqIE5PVEU6IHRoZSAiZmlyc3QiIGJsb2NrIG11c3QgYmUgdW5kZXIgNEdCLCBzbyB3ZSBjcmVhdGUKIAkgKiBhbiBlbnRyeSB3aXRoIG5vIGRhdGEgYmxvY2tzIGluIHRoZSByZXNlcnZlZCBidWZmZXIgaW4KIAkgKiB0aGUga2VybmVsIGRhdGEgc2VnbWVudC4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc2QuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcnRhc2QuYwppbmRleCA0ODFlZjA2Li4xMDQ1ZmY0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3J0YXNkLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9ydGFzZC5jCkBAIC00NzIsNiArNDcyLDEzIEBACiAJCQkJICZldmVudF9zY2FuX3dvcmssIGV2ZW50X3NjYW5fZGVsYXkpOwogfQogCisvKiBDYW5jZWwgdGhlIHJ0YXMgZXZlbnQgc2NhbiB3b3JrICovCit2b2lkIHJ0YXNfY2FuY2VsX2V2ZW50X3NjYW4odm9pZCkKK3sKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmV2ZW50X3NjYW5fd29yayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChydGFzX2NhbmNlbF9ldmVudF9zY2FuKTsKKwogc3RhdGljIGludCBfX2luaXQgcnRhc19pbml0KHZvaWQpCiB7CiAJc3RydWN0IHByb2NfZGlyX2VudHJ5ICplbnRyeTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc2V0dXBfNjQuYwppbmRleCBmYjliYjQ2Li40Y2I4ZjFlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3NldHVwXzY0LmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9zZXR1cF82NC5jCkBAIC0zNSw2ICszNSw4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaHVnZXRsYi5oPgorCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2tkdW1wLmg+CiAjaW5jbHVkZSA8YXNtL3Byb20uaD4KQEAgLTY0LDYgKzY2LDcgQEAKICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vY29kZS1wYXRjaGluZy5oPgogI2luY2x1ZGUgPGFzbS9rdm1fcHBjLmg+CisjaW5jbHVkZSA8YXNtL2h1Z2V0bGIuaD4KIAogI2luY2x1ZGUgInNldHVwLmgiCiAKQEAgLTIxNyw2ICsyMjAsMTMgQEAKIAkvKiBJbml0aWFsaXplIHRoZSBoYXNoIHRhYmxlIG9yIFRMQiBoYW5kbGluZyAqLwogCWVhcmx5X2luaXRfbW11KCk7CiAKKwkvKgorCSAqIFJlc2VydmUgYW55IGdpZ2FudGljIHBhZ2VzIHJlcXVlc3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorCSAqIG1lbWJsb2NrIG5lZWRzIHRvIGhhdmUgYmVlbiBpbml0aWFsaXplZCBieSB0aGUgdGltZSB0aGlzIGlzCisJICogY2FsbGVkIHNpbmNlIHRoaXMgd2lsbCByZXNlcnZlIG1lbW9yeS4KKwkgKi8KKwlyZXNlcnZlX2h1Z2V0bGJfZ3BhZ2VzKCk7CisKIAlEQkcoIiA8LSBlYXJseV9zZXR1cCgpXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc21wLmMKaW5kZXggNmRmNzA5MC4uZjBhYmU5MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3NtcC5jCkBAIC0xODcsNyArMTg3LDggQEAKIAkJcmV0dXJuIDE7CiAJfQogI2VuZGlmCi0JZXJyID0gcmVxdWVzdF9pcnEodmlycSwgc21wX2lwaV9hY3Rpb25bbXNnXSwgSVJRRl9QRVJDUFUsCisJZXJyID0gcmVxdWVzdF9pcnEodmlycSwgc21wX2lwaV9hY3Rpb25bbXNnXSwKKwkJCSAgSVJRRl9QRVJDUFUgfCBJUlFGX05PX1RIUkVBRCwKIAkJCSAgc21wX2lwaV9uYW1lW21zZ10sIDApOwogCVdBUk4oZXJyIDwgMCwgInVuYWJsZSB0byByZXF1ZXN0X2lycSAlZCBmb3IgJXMgKHJjICVkKVxuIiwKIAkJdmlycSwgc21wX2lwaV9uYW1lW21zZ10sIGVycik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3N5c2ZzLmMKaW5kZXggY2UwMzVjMS4uNmZkZjVmZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9zeXNmcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvc3lzZnMuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3NtcC5oPgogI2luY2x1ZGUgPGFzbS9wbWMuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAKICNpbmNsdWRlICJjYWNoZWluZm8uaCIKIApAQCAtNTEsNiArNTIsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXBlcl9jcHUoc210X3Nub296ZV9kZWxheSwgY3B1LT5zeXNkZXYuaWQpID0gc25vb3plOworCXVwZGF0ZV9zbXRfc25vb3plX2RlbGF5KHNub296ZSk7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xNzcsMTEgKzE3OSwxMyBAQAogU1lTRlNfUE1DU0VUVVAocHVyciwgU1BSTl9QVVJSKTsKIFNZU0ZTX1BNQ1NFVFVQKHNwdXJyLCBTUFJOX1NQVVJSKTsKIFNZU0ZTX1BNQ1NFVFVQKGRzY3IsIFNQUk5fRFNDUik7CitTWVNGU19QTUNTRVRVUChwaXIsIFNQUk5fUElSKTsKIAogc3RhdGljIFNZU0RFVl9BVFRSKG1tY3JhLCAwNjAwLCBzaG93X21tY3JhLCBzdG9yZV9tbWNyYSk7CiBzdGF0aWMgU1lTREVWX0FUVFIoc3B1cnIsIDA2MDAsIHNob3dfc3B1cnIsIE5VTEwpOwogc3RhdGljIFNZU0RFVl9BVFRSKGRzY3IsIDA2MDAsIHNob3dfZHNjciwgc3RvcmVfZHNjcik7CiBzdGF0aWMgU1lTREVWX0FUVFIocHVyciwgMDYwMCwgc2hvd19wdXJyLCBzdG9yZV9wdXJyKTsKK3N0YXRpYyBTWVNERVZfQVRUUihwaXIsIDA0MDAsIHNob3dfcGlyLCBOVUxMKTsKIAogdW5zaWduZWQgbG9uZyBkc2NyX2RlZmF1bHQgPSAwOwogRVhQT1JUX1NZTUJPTChkc2NyX2RlZmF1bHQpOwpAQCAtMzkyLDYgKzM5Niw5IEBACiAKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfRFNDUikpCiAJCXN5c2Rldl9jcmVhdGVfZmlsZShzLCAmYXR0cl9kc2NyKTsKKworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QUENBU19BUkNIX1YyKSkKKwkJc3lzZGV2X2NyZWF0ZV9maWxlKHMsICZhdHRyX3Bpcik7CiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKIAljYWNoZWluZm9fY3B1X29ubGluZShjcHUpOwpAQCAtNDYyLDYgKzQ2OSw5IEBACiAKIAlpZiAoY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfRFNDUikpCiAJCXN5c2Rldl9yZW1vdmVfZmlsZShzLCAmYXR0cl9kc2NyKTsKKworCWlmIChjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9QUENBU19BUkNIX1YyKSkKKwkJc3lzZGV2X3JlbW92ZV9maWxlKHMsICZhdHRyX3Bpcik7CiAjZW5kaWYgLyogQ09ORklHX1BQQzY0ICovCiAKIAljYWNoZWluZm9fY3B1X29mZmxpbmUoY3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdGltZS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKaW5kZXggNTIyYmIxZC4uNTY3ZGQ3YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90aW1lLmMKQEAgLTg2LDggKzg2LDYgQEAKIAkucmF0aW5nICAgICAgID0gNDAwLAogCS5mbGFncyAgICAgICAgPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIAkubWFzayAgICAgICAgID0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksCi0JLnNoaWZ0ICAgICAgICA9IDIyLAotCS5tdWx0ICAgICAgICAgPSAwLAkvKiBUbyBiZSBmaWxsZWQgaW4gKi8KIAkucmVhZCAgICAgICAgID0gcnRjX3JlYWQsCiB9OwogCkBAIC05Nyw4ICs5NSw2IEBACiAJLnJhdGluZyAgICAgICA9IDQwMCwKIAkuZmxhZ3MgICAgICAgID0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiAJLm1hc2sgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soNjQpLAotCS5zaGlmdCAgICAgICAgPSAyMiwKLQkubXVsdCAgICAgICAgID0gMCwJLyogVG8gYmUgZmlsbGVkIGluICovCiAJLnJlYWQgICAgICAgICA9IHRpbWViYXNlX3JlYWQsCiB9OwogCkBAIC0xMTAsMjIgKzEwNiwxNiBAQAogCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOwogCiBzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBkZWNyZW1lbnRlcl9jbG9ja2V2ZW50ID0gewotICAgICAgIC5uYW1lICAgICAgICAgICA9ICJkZWNyZW1lbnRlciIsCi0gICAgICAgLnJhdGluZyAgICAgICAgID0gMjAwLAotICAgICAgIC5zaGlmdCAgICAgICAgICA9IDAsCS8qIFRvIGJlIGZpbGxlZCBpbiAqLwotICAgICAgIC5tdWx0ICAgICAgICAgICA9IDAsCS8qIFRvIGJlIGZpbGxlZCBpbiAqLwotICAgICAgIC5pcnEgICAgICAgICAgICA9IDAsCi0gICAgICAgLnNldF9uZXh0X2V2ZW50ID0gZGVjcmVtZW50ZXJfc2V0X25leHRfZXZlbnQsCi0gICAgICAgLnNldF9tb2RlICAgICAgID0gZGVjcmVtZW50ZXJfc2V0X21vZGUsCi0gICAgICAgLmZlYXR1cmVzICAgICAgID0gQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCwKKwkubmFtZSAgICAgICAgICAgPSAiZGVjcmVtZW50ZXIiLAorCS5yYXRpbmcgICAgICAgICA9IDIwMCwKKwkuaXJxICAgICAgICAgICAgPSAwLAorCS5zZXRfbmV4dF9ldmVudCA9IGRlY3JlbWVudGVyX3NldF9uZXh0X2V2ZW50LAorCS5zZXRfbW9kZSAgICAgICA9IGRlY3JlbWVudGVyX3NldF9tb2RlLAorCS5mZWF0dXJlcyAgICAgICA9IENMT0NLX0VWVF9GRUFUX09ORVNIT1QsCiB9OwogCi1zdHJ1Y3QgZGVjcmVtZW50ZXJfY2xvY2sgewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgZXZlbnQ7Ci0JdTY0IG5leHRfdGI7Ci19OwotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGRlY3JlbWVudGVyX2Nsb2NrLCBkZWNyZW1lbnRlcnMpOworREVGSU5FX1BFUl9DUFUodTY0LCBkZWNyZW1lbnRlcnNfbmV4dF90Yik7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSwgZGVjcmVtZW50ZXJzKTsKIAogI2lmZGVmIENPTkZJR19QUENfSVNFUklFUwogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSBpU2VyaWVzX3JlY2FsX3RpdGFuOwpAQCAtMTY4LDEzICsxNTgsMTMgQEAKICNpZmRlZiBDT05GSUdfVklSVF9DUFVfQUNDT1VOVElORwogLyoKICAqIEZhY3RvcnMgZm9yIGNvbnZlcnRpbmcgZnJvbSBjcHV0aW1lX3QgKHRpbWViYXNlIHRpY2tzKSB0bwotICogamlmZmllcywgbWlsbGlzZWNvbmRzLCBzZWNvbmRzLCBhbmQgY2xvY2tfdCAoMS9VU0VSX0haIHNlY29uZHMpLgorICogamlmZmllcywgbWljcm9zZWNvbmRzLCBzZWNvbmRzLCBhbmQgY2xvY2tfdCAoMS9VU0VSX0haIHNlY29uZHMpLgogICogVGhlc2UgYXJlIGFsbCBzdG9yZWQgYXMgMC42NCBmaXhlZC1wb2ludCBiaW5hcnkgZnJhY3Rpb25zLgogICovCiB1NjQgX19jcHV0aW1lX2ppZmZpZXNfZmFjdG9yOwogRVhQT1JUX1NZTUJPTChfX2NwdXRpbWVfamlmZmllc19mYWN0b3IpOwotdTY0IF9fY3B1dGltZV9tc2VjX2ZhY3RvcjsKLUVYUE9SVF9TWU1CT0woX19jcHV0aW1lX21zZWNfZmFjdG9yKTsKK3U2NCBfX2NwdXRpbWVfdXNlY19mYWN0b3I7CitFWFBPUlRfU1lNQk9MKF9fY3B1dGltZV91c2VjX2ZhY3Rvcik7CiB1NjQgX19jcHV0aW1lX3NlY19mYWN0b3I7CiBFWFBPUlRfU1lNQk9MKF9fY3B1dGltZV9zZWNfZmFjdG9yKTsKIHU2NCBfX2NwdXRpbWVfY2xvY2t0X2ZhY3RvcjsKQEAgLTE5Miw4ICsxODIsOCBAQAogCiAJZGl2MTI4X2J5XzMyKEhaLCAwLCB0Yl90aWNrc19wZXJfc2VjLCAmcmVzKTsKIAlfX2NwdXRpbWVfamlmZmllc19mYWN0b3IgPSByZXMucmVzdWx0X2xvdzsKLQlkaXYxMjhfYnlfMzIoMTAwMCwgMCwgdGJfdGlja3NfcGVyX3NlYywgJnJlcyk7Ci0JX19jcHV0aW1lX21zZWNfZmFjdG9yID0gcmVzLnJlc3VsdF9sb3c7CisJZGl2MTI4X2J5XzMyKDEwMDAwMDAsIDAsIHRiX3RpY2tzX3Blcl9zZWMsICZyZXMpOworCV9fY3B1dGltZV91c2VjX2ZhY3RvciA9IHJlcy5yZXN1bHRfbG93OwogCWRpdjEyOF9ieV8zMigxLCAwLCB0Yl90aWNrc19wZXJfc2VjLCAmcmVzKTsKIAlfX2NwdXRpbWVfc2VjX2ZhY3RvciA9IHJlcy5yZXN1bHRfbG93OwogCWRpdjEyOF9ieV8zMihVU0VSX0haLCAwLCB0Yl90aWNrc19wZXJfc2VjLCAmcmVzKTsKQEAgLTQ0MSw3ICs0MzEsNyBAQAogLyogCiAgKiBUaGlzIGZ1bmN0aW9uIHJlY2FsaWJyYXRlcyB0aGUgdGltZWJhc2UgYmFzZWQgb24gdGhlIDQ5LWJpdCB0aW1lLW9mLWRheQogICogdmFsdWUgaW4gdGhlIFRpdGFuIGNoaXAuICBUaGUgVGl0YW4gaXMgbXVjaCBtb3JlIGFjY3VyYXRlIHRoYW4gdGhlIHZhbHVlCi0gKiByZXR1cm5lZCBieSB0aGUgc2VydmljZSBwcm9jZXNzb3IgZm9yIHRoZSB0aW1lYmFzZSBmcmVxdWVuY3kuICAKKyAqIHJldHVybmVkIGJ5IHRoZSBzZXJ2aWNlIHByb2Nlc3NvciBmb3IgdGhlIHRpbWViYXNlIGZyZXF1ZW5jeS4KICAqLwogCiBzdGF0aWMgaW50IF9faW5pdCBpU2VyaWVzX3RiX3JlY2FsKHZvaWQpCkBAIC01NzYsOSArNTY2LDggQEAKIHZvaWQgdGltZXJfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICogcmVncykKIHsKIAlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3M7Ci0Jc3RydWN0IGRlY3JlbWVudGVyX2Nsb2NrICpkZWNyZW1lbnRlciA9ICAmX19nZXRfY3B1X3ZhcihkZWNyZW1lbnRlcnMpOwotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCA9ICZkZWNyZW1lbnRlci0+ZXZlbnQ7Ci0JdTY0IG5vdzsKKwl1NjQgKm5leHRfdGIgPSAmX19nZXRfY3B1X3ZhcihkZWNyZW1lbnRlcnNfbmV4dF90Yik7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ID0gJl9fZ2V0X2NwdV92YXIoZGVjcmVtZW50ZXJzKTsKIAogCS8qIEVuc3VyZSBhIHBvc2l0aXZlIHZhbHVlIGlzIHdyaXR0ZW4gdG8gdGhlIGRlY3JlbWVudGVyLCBvciBlbHNlCiAJICogc29tZSBDUFVzIHdpbGwgY29udGludWUgdG8gdGFrZSBkZWNyZW1lbnRlciBleGNlcHRpb25zLgpAQCAtNjEzLDE2ICs2MDIsOSBAQAogCQlnZXRfbHBwYWNhKCktPmludF9kd29yZC5maWVsZHMuZGVjcl9pbnQgPSAwOwogI2VuZGlmCiAKLQlub3cgPSBnZXRfdGJfb3JfcnRjKCk7Ci0JaWYgKG5vdyA+PSBkZWNyZW1lbnRlci0+bmV4dF90YikgewotCQlkZWNyZW1lbnRlci0+bmV4dF90YiA9IH4odTY0KTA7Ci0JCWlmIChldnQtPmV2ZW50X2hhbmRsZXIpCi0JCQlldnQtPmV2ZW50X2hhbmRsZXIoZXZ0KTsKLQl9IGVsc2UgewotCQlub3cgPSBkZWNyZW1lbnRlci0+bmV4dF90YiAtIG5vdzsKLQkJaWYgKG5vdyA8PSBERUNSRU1FTlRFUl9NQVgpCi0JCQlzZXRfZGVjKChpbnQpbm93KTsKLQl9CisJKm5leHRfdGIgPSB+KHU2NCkwOworCWlmIChldnQtPmV2ZW50X2hhbmRsZXIpCisJCWV2dC0+ZXZlbnRfaGFuZGxlcihldnQpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JU0VSSUVTCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfSVNFUklFUykgJiYgaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkKQEAgLTY1MCw5ICs2MzIsOSBAQAogCSAqIHdpdGggc3VzcGVuZGluZy4KIAkgKi8KIAotCXNldF9kZWMoMHg3ZmZmZmZmZik7CisJc2V0X2RlYyhERUNSRU1FTlRFUl9NQVgpOwogCWxvY2FsX2lycV9kaXNhYmxlKCk7Ci0Jc2V0X2RlYygweDdmZmZmZmZmKTsKKwlzZXRfZGVjKERFQ1JFTUVOVEVSX01BWCk7CiB9CiAKIHN0YXRpYyB2b2lkIGdlbmVyaWNfc3VzcGVuZF9lbmFibGVfaXJxcyh2b2lkKQpAQCAtODI0LDkgKzgwNiw4IEBACiAJKyt2ZHNvX2RhdGEtPnRiX3VwZGF0ZV9jb3VudDsKIAlzbXBfbWIoKTsKIAotCS8qIFhYWCB0aGlzIGFzc3VtZXMgY2xvY2stPnNoaWZ0ID09IDIyICovCi0JLyogNDYxMTY4NjAxOCB+PSAyXigyMCs2NC0yMikgLyAxZTkgKi8KLQluZXdfdGJfdG9feHMgPSAodTY0KSBtdWx0ICogNDYxMTY4NjAxOFVMTDsKKwkvKiAxOTM0MjgxMzExMzgzNDA2NyB+PSAyXigyMCs2NCkgLyAxZTkgKi8KKwluZXdfdGJfdG9feHMgPSAodTY0KSBtdWx0ICogKDE5MzQyODEzMTEzODM0MDY3VUxMID4+IGNsb2NrLT5zaGlmdCk7CiAJbmV3X3N0YW1wX3hzZWMgPSAodTY0KSB3YWxsX3RpbWUtPnR2X25zZWMgKiBYU0VDX1BFUl9TRUM7CiAJZG9fZGl2KG5ld19zdGFtcF94c2VjLCAxMDAwMDAwMDAwKTsKIAluZXdfc3RhbXBfeHNlYyArPSAodTY0KSB3YWxsX3RpbWUtPnR2X3NlYyAqIFhTRUNfUEVSX1NFQzsKQEAgLTg3Nyw5ICs4NTgsNyBAQAogCWVsc2UKIAkJY2xvY2sgPSAmY2xvY2tzb3VyY2VfdGltZWJhc2U7CiAKLQljbG9jay0+bXVsdCA9IGNsb2Nrc291cmNlX2h6Mm11bHQodGJfdGlja3NfcGVyX3NlYywgY2xvY2stPnNoaWZ0KTsKLQotCWlmIChjbG9ja3NvdXJjZV9yZWdpc3RlcihjbG9jaykpIHsKKwlpZiAoY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooY2xvY2ssIHRiX3RpY2tzX3Blcl9zZWMpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY2xvY2tzb3VyY2U6ICVzIGlzIGFscmVhZHkgcmVnaXN0ZXJlZFxuIiwKIAkJICAgICAgIGNsb2NrLT5uYW1lKTsKIAkJcmV0dXJuOwpAQCAtODkyLDcgKzg3MSw3IEBACiBzdGF0aWMgaW50IGRlY3JlbWVudGVyX3NldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZXZ0LAogCQkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKIHsKLQlfX2dldF9jcHVfdmFyKGRlY3JlbWVudGVycykubmV4dF90YiA9IGdldF90Yl9vcl9ydGMoKSArIGV2dDsKKwlfX2dldF9jcHVfdmFyKGRlY3JlbWVudGVyc19uZXh0X3RiKSA9IGdldF90Yl9vcl9ydGMoKSArIGV2dDsKIAlzZXRfZGVjKGV2dCk7CiAJcmV0dXJuIDA7CiB9CkBAIC05MDQsMzQgKzg4Myw5IEBACiAJCWRlY3JlbWVudGVyX3NldF9uZXh0X2V2ZW50KERFQ1JFTUVOVEVSX01BWCwgZGV2KTsKIH0KIAotc3RhdGljIGlubGluZSB1aW50NjRfdCBkaXZfc2M2NCh1bnNpZ25lZCBsb25nIHRpY2tzLCB1bnNpZ25lZCBsb25nIG5zZWMsCi0JCQkJaW50IHNoaWZ0KQotewotCXVpbnQ2NF90IHRtcCA9ICgodWludDY0X3QpdGlja3MpIDw8IHNoaWZ0OwotCi0JZG9fZGl2KHRtcCwgbnNlYyk7Ci0JcmV0dXJuIHRtcDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2Nsb2NrZXZlbnRfbXVsdGlwbGllcih1bnNpZ25lZCBsb25nIGh6KQotewotCXU2NCBtdWx0LCBzaGlmdCA9IDMyOwotCi0Jd2hpbGUgKDEpIHsKLQkJbXVsdCA9IGRpdl9zYzY0KGh6LCBOU0VDX1BFUl9TRUMsIHNoaWZ0KTsKLQkJaWYgKG11bHQgJiYgKG11bHQgPj4gMzJVTCkgPT0gMFVMKQotCQkJYnJlYWs7Ci0KLQkJc2hpZnQtLTsKLQl9Ci0KLQlkZWNyZW1lbnRlcl9jbG9ja2V2ZW50LnNoaWZ0ID0gc2hpZnQ7Ci0JZGVjcmVtZW50ZXJfY2xvY2tldmVudC5tdWx0ID0gbXVsdDsKLX0KLQogc3RhdGljIHZvaWQgcmVnaXN0ZXJfZGVjcmVtZW50ZXJfY2xvY2tldmVudChpbnQgY3B1KQogewotCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRlYyA9ICZwZXJfY3B1KGRlY3JlbWVudGVycywgY3B1KS5ldmVudDsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZWMgPSAmcGVyX2NwdShkZWNyZW1lbnRlcnMsIGNwdSk7CiAKIAkqZGVjID0gZGVjcmVtZW50ZXJfY2xvY2tldmVudDsKIAlkZWMtPmNwdW1hc2sgPSBjcHVtYXNrX29mKGNwdSk7CkBAIC05NDYsNyArOTAwLDggQEAKIHsKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCi0Jc2V0dXBfY2xvY2tldmVudF9tdWx0aXBsaWVyKHBwY190Yl9mcmVxKTsKKwljbG9ja2V2ZW50c19jYWxjX211bHRfc2hpZnQoJmRlY3JlbWVudGVyX2Nsb2NrZXZlbnQsIHBwY190Yl9mcmVxLCA0KTsKKwogCWRlY3JlbWVudGVyX2Nsb2NrZXZlbnQubWF4X2RlbHRhX25zID0KIAkJY2xvY2tldmVudF9kZWx0YTJucyhERUNSRU1FTlRFUl9NQVgsICZkZWNyZW1lbnRlcl9jbG9ja2V2ZW50KTsKIAlkZWNyZW1lbnRlcl9jbG9ja2V2ZW50Lm1pbl9kZWx0YV9ucyA9CkBAIC0xMDE0LDEwICs5NjksMTAgQEAKIAlib290X3RiID0gZ2V0X3RiX29yX3J0YygpOwogCiAJLyogSWYgcGxhdGZvcm0gcHJvdmlkZWQgYSB0aW1lem9uZSAocG1hYyksIHdlIGNvcnJlY3QgdGhlIHRpbWUgKi8KLSAgICAgICAgaWYgKHRpbWV6b25lX29mZnNldCkgeworCWlmICh0aW1lem9uZV9vZmZzZXQpIHsKIAkJc3lzX3R6LnR6X21pbnV0ZXN3ZXN0ID0gLXRpbWV6b25lX29mZnNldCAvIDYwOwogCQlzeXNfdHoudHpfZHN0dGltZSA9IDA7Ci0gICAgICAgIH0KKwl9CiAKIAl2ZHNvX2RhdGEtPnRiX3VwZGF0ZV9jb3VudCA9IDA7CiAJdmRzb19kYXRhLT50Yl90aWNrc19wZXJfc2VjID0gdGJfdGlja3NfcGVyX3NlYzsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdHJhcHMuYwppbmRleCA1NDU5ZDE0Li5jMDkxNTI3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC90cmFwcy5jCkBAIC05OCwxOCArOTgsMTQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwbWFjX2JhY2tsaWdodF91bmJsYW5rKHZvaWQpIHsgfQogI2VuZGlmCiAKLWludCBkaWUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcHRfcmVncyAqcmVncywgbG9uZyBlcnIpCitzdGF0aWMgYXJjaF9zcGlubG9ja190IGRpZV9sb2NrID0gX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRDsKK3N0YXRpYyBpbnQgZGllX293bmVyID0gLTE7CitzdGF0aWMgdW5zaWduZWQgaW50IGRpZV9uZXN0X2NvdW50Oworc3RhdGljIGludCBkaWVfY291bnRlcjsKKworc3RhdGljIHVuc2lnbmVkIF9fa3Byb2JlcyBsb25nIG9vcHNfYmVnaW4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0Jc3RhdGljIHN0cnVjdCB7Ci0JCXJhd19zcGlubG9ja190IGxvY2s7Ci0JCXUzMiBsb2NrX293bmVyOwotCQlpbnQgbG9ja19vd25lcl9kZXB0aDsKLQl9IGRpZSA9IHsKLQkJLmxvY2sgPQkJCV9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRChkaWUubG9jayksCi0JCS5sb2NrX293bmVyID0JCS0xLAotCQkubG9ja19vd25lcl9kZXB0aCA9CTAKLQl9OwotCXN0YXRpYyBpbnQgZGllX2NvdW50ZXI7CisJaW50IGNwdTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKGRlYnVnZ2VyKHJlZ3MpKQpAQCAtMTE3LDY2ICsxMTMsMTA5IEBACiAKIAlvb3BzX2VudGVyKCk7CiAKLQlpZiAoZGllLmxvY2tfb3duZXIgIT0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSkgewotCQljb25zb2xlX3ZlcmJvc2UoKTsKLQkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkaWUubG9jaywgZmxhZ3MpOwotCQlkaWUubG9ja19vd25lciA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQkJZGllLmxvY2tfb3duZXJfZGVwdGggPSAwOwotCQlidXN0X3NwaW5sb2NrcygxKTsKLQkJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpKQotCQkJcG1hY19iYWNrbGlnaHRfdW5ibGFuaygpOwotCX0gZWxzZSB7Ci0JCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCS8qIHJhY3ksIGJ1dCBiZXR0ZXIgdGhhbiByaXNraW5nIGRlYWRsb2NrLiAqLworCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWlmICghYXJjaF9zcGluX3RyeWxvY2soJmRpZV9sb2NrKSkgeworCQlpZiAoY3B1ID09IGRpZV9vd25lcikKKwkJCS8qIG5lc3RlZCBvb3BzLiBzaG91bGQgc3RvcCBldmVudHVhbGx5ICovOworCQllbHNlCisJCQlhcmNoX3NwaW5fbG9jaygmZGllX2xvY2spOwogCX0KKwlkaWVfbmVzdF9jb3VudCsrOworCWRpZV9vd25lciA9IGNwdTsKKwljb25zb2xlX3ZlcmJvc2UoKTsKKwlidXN0X3NwaW5sb2NrcygxKTsKKwlpZiAobWFjaGluZV9pcyhwb3dlcm1hYykpCisJCXBtYWNfYmFja2xpZ2h0X3VuYmxhbmsoKTsKKwlyZXR1cm4gZmxhZ3M7Cit9CiAKLQlpZiAoKytkaWUubG9ja19vd25lcl9kZXB0aCA8IDMpIHsKLQkJcHJpbnRrKCJPb3BzOiAlcywgc2lnOiAlbGQgWyMlZF1cbiIsIHN0ciwgZXJyLCArK2RpZV9jb3VudGVyKTsKLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCQlwcmludGsoIlBSRUVNUFQgIik7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfU01QCi0JCXByaW50aygiU01QIE5SX0NQVVM9JWQgIiwgTlJfQ1BVUyk7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCi0JCXByaW50aygiREVCVUdfUEFHRUFMTE9DICIpOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX05VTUEKLQkJcHJpbnRrKCJOVU1BICIpOwotI2VuZGlmCi0JCXByaW50aygiJXNcbiIsIHBwY19tZC5uYW1lID8gcHBjX21kLm5hbWUgOiAiIik7Ci0KLQkJaWYgKG5vdGlmeV9kaWUoRElFX09PUFMsIHN0ciwgcmVncywgZXJyLCAyNTUsCi0JCQkgICAgICAgU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCi0JCQlyZXR1cm4gMTsKLQotCQlwcmludF9tb2R1bGVzKCk7Ci0JCXNob3dfcmVncyhyZWdzKTsKLQl9IGVsc2UgewotCQlwcmludGsoIlJlY3Vyc2l2ZSBkaWUoKSBmYWlsdXJlLCBvdXRwdXQgc3VwcHJlc3NlZFxuIik7Ci0JfQotCitzdGF0aWMgdm9pZCBfX2twcm9iZXMgb29wc19lbmQodW5zaWduZWQgbG9uZyBmbGFncywgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkgICAgICAgaW50IHNpZ25yKQorewogCWJ1c3Rfc3BpbmxvY2tzKDApOwotCWRpZS5sb2NrX293bmVyID0gLTE7CisJZGllX293bmVyID0gLTE7CiAJYWRkX3RhaW50KFRBSU5UX0RJRSk7Ci0JcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRpZS5sb2NrLCBmbGFncyk7CisJZGllX25lc3RfY291bnQtLTsKKwlvb3BzX2V4aXQoKTsKKwlwcmludGsoIlxuIik7CisJaWYgKCFkaWVfbmVzdF9jb3VudCkKKwkJLyogTmVzdCBjb3VudCByZWFjaGVzIHplcm8sIHJlbGVhc2UgdGhlIGxvY2suICovCisJCWFyY2hfc3Bpbl91bmxvY2soJmRpZV9sb2NrKTsKKwlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCi0JaWYgKGtleGVjX3Nob3VsZF9jcmFzaChjdXJyZW50KSB8fAotCQlrZXhlY19zcl9hY3RpdmF0ZWQoc21wX3Byb2Nlc3Nvcl9pZCgpKSkKKwkvKgorCSAqIEEgc3lzdGVtIHJlc2V0ICgweDEwMCkgaXMgYSByZXF1ZXN0IHRvIGR1bXAsIHNvIHdlIGFsd2F5cyBzZW5kCisJICogaXQgdGhyb3VnaCB0aGUgY3Jhc2hkdW1wIGNvZGUuCisJICovCisJaWYgKGtleGVjX3Nob3VsZF9jcmFzaChjdXJyZW50KSB8fCAoVFJBUChyZWdzKSA9PSAweDEwMCkpIHsKIAkJY3Jhc2hfa2V4ZWMocmVncyk7Ci0JY3Jhc2hfa2V4ZWNfc2Vjb25kYXJ5KHJlZ3MpOworCisJCS8qCisJCSAqIFdlIGFyZW4ndCB0aGUgcHJpbWFyeSBjcmFzaCBDUFUuIFdlIG5lZWQgdG8gc2VuZCBpdAorCQkgKiB0byBhIGhvbGRpbmcgcGF0dGVybiB0byBhdm9pZCBpdCBlbmRpbmcgdXAgaW4gdGhlIHBhbmljCisJCSAqIGNvZGUuCisJCSAqLworCQljcmFzaF9rZXhlY19zZWNvbmRhcnkocmVncyk7CisJfQorCisJaWYgKCFzaWducikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXaGlsZSBvdXIgb29wcyBvdXRwdXQgaXMgc2VyaWFsaXNlZCBieSBhIHNwaW5sb2NrLCBvdXRwdXQKKwkgKiBmcm9tIHBhbmljKCkgY2FsbGVkIGJlbG93IGNhbiByYWNlIGFuZCBjb3JydXB0IGl0LiBJZiB3ZQorCSAqIGtub3cgd2UgYXJlIGdvaW5nIHRvIHBhbmljLCBkZWxheSBmb3IgMSBzZWNvbmQgc28gd2UgaGF2ZSBhCisJICogY2hhbmNlIHRvIGdldCBjbGVhbiBiYWNrdHJhY2VzIGZyb20gYWxsIENQVXMgdGhhdCBhcmUgb29wc2luZy4KKwkgKi8KKwlpZiAoaW5faW50ZXJydXB0KCkgfHwgcGFuaWNfb25fb29wcyB8fCAhY3VycmVudC0+cGlkIHx8CisJICAgIGlzX2dsb2JhbF9pbml0KGN1cnJlbnQpKSB7CisJCW1kZWxheShNU0VDX1BFUl9TRUMpOworCX0KIAogCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJcGFuaWMoIkZhdGFsIGV4Y2VwdGlvbiBpbiBpbnRlcnJ1cHQiKTsKLQogCWlmIChwYW5pY19vbl9vb3BzKQogCQlwYW5pYygiRmF0YWwgZXhjZXB0aW9uIik7CisJZG9fZXhpdChzaWducik7Cit9CiAKLQlvb3BzX2V4aXQoKTsKLQlkb19leGl0KGVycik7CitzdGF0aWMgaW50IF9fa3Byb2JlcyBfX2RpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKK3sKKwlwcmludGsoIk9vcHM6ICVzLCBzaWc6ICVsZCBbIyVkXVxuIiwgc3RyLCBlcnIsICsrZGllX2NvdW50ZXIpOworI2lmZGVmIENPTkZJR19QUkVFTVBUCisJcHJpbnRrKCJQUkVFTVBUICIpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NNUAorCXByaW50aygiU01QIE5SX0NQVVM9JWQgIiwgTlJfQ1BVUyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfREVCVUdfUEFHRUFMTE9DCisJcHJpbnRrKCJERUJVR19QQUdFQUxMT0MgIik7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTlVNQQorCXByaW50aygiTlVNQSAiKTsKKyNlbmRpZgorCXByaW50aygiJXNcbiIsIHBwY19tZC5uYW1lID8gcHBjX21kLm5hbWUgOiAiIik7CisKKwlpZiAobm90aWZ5X2RpZShESUVfT09QUywgc3RyLCByZWdzLCBlcnIsIDI1NSwgU0lHU0VHVikgPT0gTk9USUZZX1NUT1ApCisJCXJldHVybiAxOworCisJcHJpbnRfbW9kdWxlcygpOworCXNob3dfcmVncyhyZWdzKTsKIAogCXJldHVybiAwOwogfQogCit2b2lkIGRpZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBsb25nIGVycikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gb29wc19iZWdpbihyZWdzKTsKKworCWlmIChfX2RpZShzdHIsIHJlZ3MsIGVycikpCisJCWVyciA9IDA7CisJb29wc19lbmQoZmxhZ3MsIHJlZ3MsIGVycik7Cit9CisKIHZvaWQgdXNlcl9zaW5nbGVfc3RlcF9zaWdpbmZvKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAogCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzLCBzaWdpbmZvX3QgKmluZm8pCiB7CkBAIC0xOTUsMTAgKzIzNCwxMSBAQAogCQkJImF0ICUwMTZseCBuaXAgJTAxNmx4IGxyICUwMTZseCBjb2RlICV4XG4iOwogCiAJaWYgKCF1c2VyX21vZGUocmVncykpIHsKLQkJaWYgKGRpZSgiRXhjZXB0aW9uIGluIGtlcm5lbCBtb2RlIiwgcmVncywgc2lnbnIpKQotCQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoc2hvd191bmhhbmRsZWRfc2lnbmFscyAmJgotCQkgICB1bmhhbmRsZWRfc2lnbmFsKGN1cnJlbnQsIHNpZ25yKSkgeworCQlkaWUoIkV4Y2VwdGlvbiBpbiBrZXJuZWwgbW9kZSIsIHJlZ3MsIHNpZ25yKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChzaG93X3VuaGFuZGxlZF9zaWduYWxzICYmIHVuaGFuZGxlZF9zaWduYWwoY3VycmVudCwgc2lnbnIpKSB7CiAJCXByaW50a19yYXRlbGltaXRlZChyZWdzLT5tc3IgJiBNU1JfNjRCSVQgPyBmbXQ2NCA6IGZtdDMyLAogCQkJCSAgIGN1cnJlbnQtPmNvbW0sIGN1cnJlbnQtPnBpZCwgc2lnbnIsCiAJCQkJICAgYWRkciwgcmVncy0+bmlwLCByZWdzLT5saW5rLCBjb2RlKTsKQEAgLTIyMCwyNSArMjYwLDggQEAKIAkJCXJldHVybjsKIAl9CiAKLSNpZmRlZiBDT05GSUdfS0VYRUMKLQljcHVtYXNrX3NldF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCAmY3B1c19pbl9zcik7Ci0jZW5kaWYKLQogCWRpZSgiU3lzdGVtIFJlc2V0IiwgcmVncywgU0lHQUJSVCk7CiAKLQkvKgotCSAqIFNvbWUgQ1BVcyB3aGVuIHJlbGVhc2VkIGZyb20gdGhlIGRlYnVnZ2VyIHdpbGwgZXhlY3V0ZSB0aGlzIHBhdGguCi0JICogVGhlc2UgQ1BVcyBlbnRlcmVkIHRoZSBkZWJ1Z2dlciB2aWEgYSBzb2Z0LXJlc2V0LiBJZiB0aGUgQ1BVIHdhcwotCSAqIGh1bmcgYmVmb3JlIGVudGVyaW5nIHRoZSBkZWJ1Z2dlciBpdCB3aWxsIHJldHVybiB0byB0aGUgaHVuZwotCSAqIHN0YXRlIHdoZW4gZXhpdGluZyB0aGlzIGZ1bmN0aW9uLiAgVGhpcyBjYXVzZXMgYSBwcm9ibGVtIGluCi0JICoga2R1bXAgc2luY2UgdGhlIGh1bmcgQ1BVKHMpIHdpbGwgbm90IHJlc3BvbmQgdG8gdGhlIElQSSBzZW50Ci0JICogZnJvbSBrZHVtcC4gVG8gcHJldmVudCB0aGUgcHJvYmxlbSB3ZSBjYWxsIGNyYXNoX2tleGVjX3NlY29uZGFyeSgpCi0JICogaGVyZS4gSWYgYSBrZHVtcCBoYWQgbm90IGJlZW4gaW5pdGlhdGVkIG9yIHdlIGV4aXQgdGhlIGRlYnVnZ2VyCi0JICogd2l0aCB0aGUgImV4aXQgYW5kIHJlY292ZXIiIGNvbW1hbmQgKHgpIGNyYXNoX2tleGVjX3NlY29uZGFyeSgpCi0JICogd2lsbCByZXR1cm4gYWZ0ZXIgNW1zIGFuZCB0aGUgQ1BVIHJldHVybnMgdG8gaXRzIHByZXZpb3VzIHN0YXRlLgotCSAqLwotCWNyYXNoX2tleGVjX3NlY29uZGFyeShyZWdzKTsKLQogCS8qIE11c3QgZGllIGlmIHRoZSBpbnRlcnJ1cHQgaXMgbm90IHJlY292ZXJhYmxlICovCiAJaWYgKCEocmVncy0+bXNyICYgTVNSX1JJKSkKIAkJcGFuaWMoIlVucmVjb3ZlcmFibGUgU3lzdGVtIFJlc2V0Iik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3ZtbGludXgubGRzLlMKaW5kZXggOTIwMjc2Yy4uNzEwYTU0MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMTcwLDcgKzE3MCwxMyBAQAogCX0KICNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKIAkuID0gQUxJR04oOCk7Ci0JLmR5bnN5bSA6IEFUKEFERFIoLmR5bnN5bSkgLSBMT0FEX09GRlNFVCkgeyAqKC5keW5zeW0pIH0KKwkuZHluc3ltIDogQVQoQUREUiguZHluc3ltKSAtIExPQURfT0ZGU0VUKQorCXsKKyNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEVfUFBDMzIKKwkJX19keW5hbWljX3N5bXRhYiA9IC47CisjZW5kaWYKKwkJKiguZHluc3ltKQorCX0KIAkuZHluc3RyIDogQVQoQUREUiguZHluc3RyKSAtIExPQURfT0ZGU0VUKSB7ICooLmR5bnN0cikgfQogCS5keW5hbWljIDogQVQoQUREUiguZHluYW1pYykgLSBMT0FEX09GRlNFVCkKIAl7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHYuYwppbmRleCAwY2IxMzdhLi4zMzY5ODNkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odi5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2LmMKQEAgLTUzOCw3ICs1MzgsNyBAQAogCXRwYWNhLT5rdm1faHN0YXRlLm5hcHBpbmcgPSAwOwogCXZjcHUtPmNwdSA9IHZjLT5wY3B1OwogCXNtcF93bWIoKTsKLSNpZmRlZiBDT05GSUdfUFBDX0lDUF9OQVRJVkUKKyNpZiBkZWZpbmVkKENPTkZJR19QUENfSUNQX05BVElWRSkgJiYgZGVmaW5lZChDT05GSUdfU01QKQogCWlmICh2Y3B1LT5hcmNoLnB0aWQpIHsKIAkJdHBhY2EtPmNwdV9zdGFydCA9IDB4ODA7CiAJCXdtYigpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfaHZfcm1oYW5kbGVycy5TCmluZGV4IDQ0ZDg4MjkuLjVjOGIyNjEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX2h2X3JtaGFuZGxlcnMuUworKysgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19odl9ybWhhbmRsZXJzLlMKQEAgLTExMiw2ICsxMTIsOSBAQAogCXN0YmNpeAlyMCwgcjUsIHI2CQkvKiBjbGVhciBpdCAqLwogCXN0d2NpeAlyOCwgcjUsIHI3CQkvKiBFT0kgaXQgKi8KIAorCS8qIE5WIEdQUiB2YWx1ZXMgZnJvbSBwb3dlcjdfaWRsZSgpIHdpbGwgbm8gbG9uZ2VyIGJlIHZhbGlkICovCisJc3RiCXIwLCBQQUNBX05BUFNUQVRFTE9TVChyMTMpCisKIC5nbG9iYWwga3ZtcHBjX2h2X2VudHJ5CiBrdm1wcGNfaHZfZW50cnk6CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMgYi9hcmNoL3Bvd2VycGMva3ZtL2Jvb2szc19wci5jCmluZGV4IDNjNzkxZTEuLmUyY2ZiOWUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vYm9vazNzX3ByLmMKKysrIGIvYXJjaC9wb3dlcnBjL2t2bS9ib29rM3NfcHIuYwpAQCAtNjU4LDEwICs2NTgsMTIgQEAKIAkJCXVsb25nIGNtZCA9IGt2bXBwY19nZXRfZ3ByKHZjcHUsIDMpOwogCQkJaW50IGk7CiAKKyNpZmRlZiBDT05GSUdfS1ZNX0JPT0szU182NF9QUgogCQkJaWYgKGt2bXBwY19oX3ByKHZjcHUsIGNtZCkgPT0gRU1VTEFURV9ET05FKSB7CiAJCQkJciA9IFJFU1VNRV9HVUVTVDsKIAkJCQlicmVhazsKIAkJCX0KKyNlbmRpZgogCiAJCQlydW4tPnBhcHJfaGNhbGwubnIgPSBjbWQ7CiAJCQlmb3IgKGkgPSAwOyBpIDwgOTsgKytpKSB7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva3ZtL2U1MDAuYyBiL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5jCmluZGV4IDI2ZDIwOTAuLjhjMGQ0NWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5jCisrKyBiL2FyY2gvcG93ZXJwYy9rdm0vZTUwMC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgva3ZtX2hvc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAKICNpbmNsdWRlIDxhc20vcmVnLmg+CiAjaW5jbHVkZSA8YXNtL2NwdXRhYmxlLmg+CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2xpYi9NYWtlZmlsZQppbmRleCAxNjZhNmEwLi43NzM1YTJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvTWFrZWZpbGUKQEAgLTE2LDEzICsxNiwxNSBAQAogCiBvYmotJChDT05GSUdfUFBDNjQpCSs9IGNvcHlwYWdlXzY0Lm8gY29weXVzZXJfNjQubyBcCiAJCQkgICBtZW1jcHlfNjQubyB1c2VyY29weV82NC5vIG1lbV82NC5vIHN0cmluZy5vIFwKLQkJCSAgIGNoZWNrc3VtX3dyYXBwZXJzXzY0Lm8gaHdlaWdodF82NC5vCisJCQkgICBjaGVja3N1bV93cmFwcGVyc182NC5vIGh3ZWlnaHRfNjQubyBcCisJCQkgICBjb3B5dXNlcl9wb3dlcjcubwogb2JqLSQoQ09ORklHX1hNT04pCSs9IHNzdGVwLm8gbGRzdGZwLm8KIG9iai0kKENPTkZJR19LUFJPQkVTKQkrPSBzc3RlcC5vIGxkc3RmcC5vCiBvYmotJChDT05GSUdfSEFWRV9IV19CUkVBS1BPSU5UKQkrPSBzc3RlcC5vIGxkc3RmcC5vCiAKIGlmZXEgKCQoQ09ORklHX1BQQzY0KSx5KQogb2JqLSQoQ09ORklHX1NNUCkJKz0gbG9ja3Mubworb2JqLSQoQ09ORklHX0FMVElWRUMpCSs9IGNvcHl1c2VyX3Bvd2VyN192bXgubwogZW5kaWYKIAogb2JqLSQoQ09ORklHX1BQQ19MSUJfUkhFQVApICs9IHJoZWFwLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9saWIvY29weXVzZXJfNjQuUyBiL2FyY2gvcG93ZXJwYy9saWIvY29weXVzZXJfNjQuUwppbmRleCA1NzhiNjI1Li43NzNkMzhmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbGliL2NvcHl1c2VyXzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2xpYi9jb3B5dXNlcl82NC5TCkBAIC0xMSw2ICsxMSwxMiBAQAogCiAJLmFsaWduCTcKIF9HTE9CQUwoX19jb3B5X3RvZnJvbV91c2VyKQorQkVHSU5fRlRSX1NFQ1RJT04KKwlub3AKK0ZUUl9TRUNUSU9OX0VMU0UKKwliCV9fY29weV90b2Zyb21fdXNlcl9wb3dlcjcKK0FMVF9GVFJfU0VDVElPTl9FTkRfSUZDTFIoQ1BVX0ZUUl9WTVhfQ09QWSkKK19HTE9CQUwoX19jb3B5X3RvZnJvbV91c2VyX2Jhc2UpCiAJLyogZmlyc3QgY2hlY2sgZm9yIGEgd2hvbGUgcGFnZSBjb3B5IG9uIGEgcGFnZSBib3VuZGFyeSAqLwogCWNtcGxkaQljcjEscjUsMTYKIAljbXBkaQljcjYscjUsNDA5NgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2xpYi9jb3B5dXNlcl9wb3dlcjcuUyBiL2FyY2gvcG93ZXJwYy9saWIvY29weXVzZXJfcG93ZXI3LlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3ZGI3YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9saWIvY29weXVzZXJfcG93ZXI3LlMKQEAgLTAsMCArMSw2ODMgQEAKKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDExCisgKgorICogQXV0aG9yOiBBbnRvbiBCbGFuY2hhcmQgPGFudG9uQGF1LmlibS5jb20+CisgKi8KKyNpbmNsdWRlIDxhc20vcHBjX2FzbS5oPgorCisjZGVmaW5lIFNUQUNLRlJBTUVTSVpFCTI1NgorI2RlZmluZSBTVEtfUkVHKGkpCSgxMTIgKyAoKGkpLTE0KSo4KQorCisJLm1hY3JvIGVycjEKKzEwMDoKKwkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgorCS5hbGlnbiAzCisJLmxsb25nIDEwMGIsLkxkb19lcnIxCisJLnByZXZpb3VzCisJLmVuZG0KKworCS5tYWNybyBlcnIyCisyMDA6CisJLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkuYWxpZ24gMworCS5sbG9uZyAyMDBiLC5MZG9fZXJyMgorCS5wcmV2aW91cworCS5lbmRtCisKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCS5tYWNybyBlcnIzCiszMDA6CisJLnNlY3Rpb24gX19leF90YWJsZSwiYSIKKwkuYWxpZ24gMworCS5sbG9uZyAzMDBiLC5MZG9fZXJyMworCS5wcmV2aW91cworCS5lbmRtCisKKwkubWFjcm8gZXJyNAorNDAwOgorCS5zZWN0aW9uIF9fZXhfdGFibGUsImEiCisJLmFsaWduIDMKKwkubGxvbmcgNDAwYiwuTGRvX2VycjQKKwkucHJldmlvdXMKKwkuZW5kbQorCisKKy5MZG9fZXJyNDoKKwlsZAlyMTYsU1RLX1JFRyhyMTYpKHIxKQorCWxkCXIxNSxTVEtfUkVHKHIxNSkocjEpCisJbGQJcjE0LFNUS19SRUcocjE0KShyMSkKKy5MZG9fZXJyMzoKKwlibAkuZXhpdF92bXhfY29weQorCWxkCXIwLFNUQUNLRlJBTUVTSVpFKzE2KHIxKQorCW10bHIJcjAKKwliCS5MZXhpdAorI2VuZGlmIC8qIENPTkZJR19BTFRJVkVDICovCisKKy5MZG9fZXJyMjoKKwlsZAlyMjIsU1RLX1JFRyhyMjIpKHIxKQorCWxkCXIyMSxTVEtfUkVHKHIyMSkocjEpCisJbGQJcjIwLFNUS19SRUcocjIwKShyMSkKKwlsZAlyMTksU1RLX1JFRyhyMTkpKHIxKQorCWxkCXIxOCxTVEtfUkVHKHIxOCkocjEpCisJbGQJcjE3LFNUS19SRUcocjE3KShyMSkKKwlsZAlyMTYsU1RLX1JFRyhyMTYpKHIxKQorCWxkCXIxNSxTVEtfUkVHKHIxNSkocjEpCisJbGQJcjE0LFNUS19SRUcocjE0KShyMSkKKy5MZXhpdDoKKwlhZGRpCXIxLHIxLFNUQUNLRlJBTUVTSVpFCisuTGRvX2VycjE6CisJbGQJcjMsNDgocjEpCisJbGQJcjQsNTYocjEpCisJbGQJcjUsNjQocjEpCisJYglfX2NvcHlfdG9mcm9tX3VzZXJfYmFzZQorCisKK19HTE9CQUwoX19jb3B5X3RvZnJvbV91c2VyX3Bvd2VyNykKKyNpZmRlZiBDT05GSUdfQUxUSVZFQworCWNtcGxkaQlyNSwxNgorCWNtcGxkaQljcjEscjUsNDA5NgorCisJc3RkCXIzLDQ4KHIxKQorCXN0ZAlyNCw1NihyMSkKKwlzdGQJcjUsNjQocjEpCisKKwlibHQJLkxzaG9ydF9jb3B5CisJYmd0CWNyMSwuTHZteF9jb3B5CisjZWxzZQorCWNtcGxkaQlyNSwxNgorCisJc3RkCXIzLDQ4KHIxKQorCXN0ZAlyNCw1NihyMSkKKwlzdGQJcjUsNjQocjEpCisKKwlibHQJLkxzaG9ydF9jb3B5CisjZW5kaWYKKworLkxub252bXhfY29weToKKwkvKiBHZXQgdGhlIHNvdXJjZSA4QiBhbGlnbmVkICovCisJbmVnCXI2LHI0CisJbXRvY3JmCTB4MDEscjYKKwljbHJsZGkJcjYscjYsKDY0LTMpCisKKwliZgljcjcqNCszLDFmCitlcnIxOwlsYnoJcjAsMChyNCkKKwlhZGRpCXI0LHI0LDEKK2VycjE7CXN0YglyMCwwKHIzKQorCWFkZGkJcjMscjMsMQorCisxOgliZgljcjcqNCsyLDJmCitlcnIxOwlsaHoJcjAsMChyNCkKKwlhZGRpCXI0LHI0LDIKK2VycjE7CXN0aAlyMCwwKHIzKQorCWFkZGkJcjMscjMsMgorCisyOgliZgljcjcqNCsxLDNmCitlcnIxOwlsd3oJcjAsMChyNCkKKwlhZGRpCXI0LHI0LDQKK2VycjE7CXN0dwlyMCwwKHIzKQorCWFkZGkJcjMscjMsNAorCiszOglzdWIJcjUscjUscjYKKwljbXBsZGkJcjUsMTI4CisJYmx0CTVmCisKKwltZmxyCXIwCisJc3RkdQlyMSwtU1RBQ0tGUkFNRVNJWkUocjEpCisJc3RkCXIxNCxTVEtfUkVHKHIxNCkocjEpCisJc3RkCXIxNSxTVEtfUkVHKHIxNSkocjEpCisJc3RkCXIxNixTVEtfUkVHKHIxNikocjEpCisJc3RkCXIxNyxTVEtfUkVHKHIxNykocjEpCisJc3RkCXIxOCxTVEtfUkVHKHIxOCkocjEpCisJc3RkCXIxOSxTVEtfUkVHKHIxOSkocjEpCisJc3RkCXIyMCxTVEtfUkVHKHIyMCkocjEpCisJc3RkCXIyMSxTVEtfUkVHKHIyMSkocjEpCisJc3RkCXIyMixTVEtfUkVHKHIyMikocjEpCisJc3RkCXIwLFNUQUNLRlJBTUVTSVpFKzE2KHIxKQorCisJc3JkaQlyNixyNSw3CisJbXRjdHIJcjYKKworCS8qIE5vdyBkbyBjYWNoZWxpbmUgKDEyOEIpIHNpemVkIGxvYWRzIGFuZCBzdG9yZXMuICovCisJLmFsaWduCTUKKzQ6CitlcnIyOwlsZAlyMCwwKHI0KQorZXJyMjsJbGQJcjYsOChyNCkKK2VycjI7CWxkCXI3LDE2KHI0KQorZXJyMjsJbGQJcjgsMjQocjQpCitlcnIyOwlsZAlyOSwzMihyNCkKK2VycjI7CWxkCXIxMCw0MChyNCkKK2VycjI7CWxkCXIxMSw0OChyNCkKK2VycjI7CWxkCXIxMiw1NihyNCkKK2VycjI7CWxkCXIxNCw2NChyNCkKK2VycjI7CWxkCXIxNSw3MihyNCkKK2VycjI7CWxkCXIxNiw4MChyNCkKK2VycjI7CWxkCXIxNyw4OChyNCkKK2VycjI7CWxkCXIxOCw5NihyNCkKK2VycjI7CWxkCXIxOSwxMDQocjQpCitlcnIyOwlsZAlyMjAsMTEyKHI0KQorZXJyMjsJbGQJcjIxLDEyMChyNCkKKwlhZGRpCXI0LHI0LDEyOAorZXJyMjsJc3RkCXIwLDAocjMpCitlcnIyOwlzdGQJcjYsOChyMykKK2VycjI7CXN0ZAlyNywxNihyMykKK2VycjI7CXN0ZAlyOCwyNChyMykKK2VycjI7CXN0ZAlyOSwzMihyMykKK2VycjI7CXN0ZAlyMTAsNDAocjMpCitlcnIyOwlzdGQJcjExLDQ4KHIzKQorZXJyMjsJc3RkCXIxMiw1NihyMykKK2VycjI7CXN0ZAlyMTQsNjQocjMpCitlcnIyOwlzdGQJcjE1LDcyKHIzKQorZXJyMjsJc3RkCXIxNiw4MChyMykKK2VycjI7CXN0ZAlyMTcsODgocjMpCitlcnIyOwlzdGQJcjE4LDk2KHIzKQorZXJyMjsJc3RkCXIxOSwxMDQocjMpCitlcnIyOwlzdGQJcjIwLDExMihyMykKK2VycjI7CXN0ZAlyMjEsMTIwKHIzKQorCWFkZGkJcjMscjMsMTI4CisJYmRuegk0YgorCisJY2xybGRpCXI1LHI1LCg2NC03KQorCisJbGQJcjE0LFNUS19SRUcocjE0KShyMSkKKwlsZAlyMTUsU1RLX1JFRyhyMTUpKHIxKQorCWxkCXIxNixTVEtfUkVHKHIxNikocjEpCisJbGQJcjE3LFNUS19SRUcocjE3KShyMSkKKwlsZAlyMTgsU1RLX1JFRyhyMTgpKHIxKQorCWxkCXIxOSxTVEtfUkVHKHIxOSkocjEpCisJbGQJcjIwLFNUS19SRUcocjIwKShyMSkKKwlsZAlyMjEsU1RLX1JFRyhyMjEpKHIxKQorCWxkCXIyMixTVEtfUkVHKHIyMikocjEpCisJYWRkaQlyMSxyMSxTVEFDS0ZSQU1FU0laRQorCisJLyogVXAgdG8gMTI3QiB0byBnbyAqLworNToJc3JkaQlyNixyNSw0CisJbXRvY3JmCTB4MDEscjYKKworNjoJYmYJY3I3KjQrMSw3ZgorZXJyMTsJbGQJcjAsMChyNCkKK2VycjE7CWxkCXI2LDgocjQpCitlcnIxOwlsZAlyNywxNihyNCkKK2VycjE7CWxkCXI4LDI0KHI0KQorZXJyMTsJbGQJcjksMzIocjQpCitlcnIxOwlsZAlyMTAsNDAocjQpCitlcnIxOwlsZAlyMTEsNDgocjQpCitlcnIxOwlsZAlyMTIsNTYocjQpCisJYWRkaQlyNCxyNCw2NAorZXJyMTsJc3RkCXIwLDAocjMpCitlcnIxOwlzdGQJcjYsOChyMykKK2VycjE7CXN0ZAlyNywxNihyMykKK2VycjE7CXN0ZAlyOCwyNChyMykKK2VycjE7CXN0ZAlyOSwzMihyMykKK2VycjE7CXN0ZAlyMTAsNDAocjMpCitlcnIxOwlzdGQJcjExLDQ4KHIzKQorZXJyMTsJc3RkCXIxMiw1NihyMykKKwlhZGRpCXIzLHIzLDY0CisKKwkvKiBVcCB0byA2M0IgdG8gZ28gKi8KKzc6CWJmCWNyNyo0KzIsOGYKK2VycjE7CWxkCXIwLDAocjQpCitlcnIxOwlsZAlyNiw4KHI0KQorZXJyMTsJbGQJcjcsMTYocjQpCitlcnIxOwlsZAlyOCwyNChyNCkKKwlhZGRpCXI0LHI0LDMyCitlcnIxOwlzdGQJcjAsMChyMykKK2VycjE7CXN0ZAlyNiw4KHIzKQorZXJyMTsJc3RkCXI3LDE2KHIzKQorZXJyMTsJc3RkCXI4LDI0KHIzKQorCWFkZGkJcjMscjMsMzIKKworCS8qIFVwIHRvIDMxQiB0byBnbyAqLworODoJYmYJY3I3KjQrMyw5ZgorZXJyMTsJbGQJcjAsMChyNCkKK2VycjE7CWxkCXI2LDgocjQpCisJYWRkaQlyNCxyNCwxNgorZXJyMTsJc3RkCXIwLDAocjMpCitlcnIxOwlzdGQJcjYsOChyMykKKwlhZGRpCXIzLHIzLDE2CisKKzk6CWNscmxkaQlyNSxyNSwoNjQtNCkKKworCS8qIFVwIHRvIDE1QiB0byBnbyAqLworLkxzaG9ydF9jb3B5OgorCW10b2NyZgkweDAxLHI1CisJYmYJY3I3KjQrMCwxMmYKK2VycjE7CWx3eglyMCwwKHI0KQkvKiBMZXNzIGNoYW5jZSBvZiBhIHJlamVjdCB3aXRoIHdvcmQgb3BzICovCitlcnIxOwlsd3oJcjYsNChyNCkKKwlhZGRpCXI0LHI0LDgKK2VycjE7CXN0dwlyMCwwKHIzKQorZXJyMTsJc3R3CXI2LDQocjMpCisJYWRkaQlyMyxyMyw4CisKKzEyOgliZgljcjcqNCsxLDEzZgorZXJyMTsJbHd6CXIwLDAocjQpCisJYWRkaQlyNCxyNCw0CitlcnIxOwlzdHcJcjAsMChyMykKKwlhZGRpCXIzLHIzLDQKKworMTM6CWJmCWNyNyo0KzIsMTRmCitlcnIxOwlsaHoJcjAsMChyNCkKKwlhZGRpCXI0LHI0LDIKK2VycjE7CXN0aAlyMCwwKHIzKQorCWFkZGkJcjMscjMsMgorCisxNDoJYmYJY3I3KjQrMywxNWYKK2VycjE7CWxieglyMCwwKHI0KQorZXJyMTsJc3RiCXIwLDAocjMpCisKKzE1OglsaQlyMywwCisJYmxyCisKKy5MdW53aW5kX3N0YWNrX25vbnZteF9jb3B5OgorCWFkZGkJcjEscjEsU1RBQ0tGUkFNRVNJWkUKKwliCS5Mbm9udm14X2NvcHkKKworI2lmZGVmIENPTkZJR19BTFRJVkVDCisuTHZteF9jb3B5OgorCW1mbHIJcjAKKwlzdGQJcjAsMTYocjEpCisJc3RkdQlyMSwtU1RBQ0tGUkFNRVNJWkUocjEpCisJYmwJLmVudGVyX3ZteF9jb3B5CisJY21wd2kJcjMsMAorCWxkCXIwLFNUQUNLRlJBTUVTSVpFKzE2KHIxKQorCWxkCXIzLFNUQUNLRlJBTUVTSVpFKzQ4KHIxKQorCWxkCXI0LFNUQUNLRlJBTUVTSVpFKzU2KHIxKQorCWxkCXI1LFNUQUNLRlJBTUVTSVpFKzY0KHIxKQorCW10bHIJcjAKKworCWJlcQkuTHVud2luZF9zdGFja19ub252bXhfY29weQorCisJLyoKKwkgKiBJZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFyZSBub3QgcmVsYXRpdmVseSBhbGlnbmVkIHdlIHVzZSBhCisJICogc2xvd2VyIHBlcm11dGUgbG9vcC4KKwkgKi8KKwl4b3IJcjYscjQscjMKKwlybGRpY2wuCXI2LHI2LDAsKDY0LTQpCisJYm5lCS5Mdm14X3VuYWxpZ25lZF9jb3B5CisKKwkvKiBHZXQgdGhlIGRlc3RpbmF0aW9uIDE2QiBhbGlnbmVkICovCisJbmVnCXI2LHIzCisJbXRvY3JmCTB4MDEscjYKKwljbHJsZGkJcjYscjYsKDY0LTQpCisKKwliZgljcjcqNCszLDFmCitlcnIzOwlsYnoJcjAsMChyNCkKKwlhZGRpCXI0LHI0LDEKK2VycjM7CXN0YglyMCwwKHIzKQorCWFkZGkJcjMscjMsMQorCisxOgliZgljcjcqNCsyLDJmCitlcnIzOwlsaHoJcjAsMChyNCkKKwlhZGRpCXI0LHI0LDIKK2VycjM7CXN0aAlyMCwwKHIzKQorCWFkZGkJcjMscjMsMgorCisyOgliZgljcjcqNCsxLDNmCitlcnIzOwlsd3oJcjAsMChyNCkKKwlhZGRpCXI0LHI0LDQKK2VycjM7CXN0dwlyMCwwKHIzKQorCWFkZGkJcjMscjMsNAorCiszOgliZgljcjcqNCswLDRmCitlcnIzOwlsZAlyMCwwKHI0KQorCWFkZGkJcjQscjQsOAorZXJyMzsJc3RkCXIwLDAocjMpCisJYWRkaQlyMyxyMyw4CisKKzQ6CXN1YglyNSxyNSxyNgorCisJLyogR2V0IHRoZSBkZXNpbmF0aW9uIDEyOEIgYWxpZ25lZCAqLworCW5lZwlyNixyMworCXNyZGkJcjcscjYsNAorCW10b2NyZgkweDAxLHI3CisJY2xybGRpCXI2LHI2LCg2NC03KQorCisJbGkJcjksMTYKKwlsaQlyMTAsMzIKKwlsaQlyMTEsNDgKKworCWJmCWNyNyo0KzMsNWYKK2VycjM7CWx2eAl2cjEscjAscjQKKwlhZGRpCXI0LHI0LDE2CitlcnIzOwlzdHZ4CXZyMSxyMCxyMworCWFkZGkJcjMscjMsMTYKKworNToJYmYJY3I3KjQrMiw2ZgorZXJyMzsJbHZ4CXZyMSxyMCxyNAorZXJyMzsJbHZ4CXZyMCxyNCxyOQorCWFkZGkJcjQscjQsMzIKK2VycjM7CXN0dngJdnIxLHIwLHIzCitlcnIzOwlzdHZ4CXZyMCxyMyxyOQorCWFkZGkJcjMscjMsMzIKKworNjoJYmYJY3I3KjQrMSw3ZgorZXJyMzsJbHZ4CXZyMyxyMCxyNAorZXJyMzsJbHZ4CXZyMixyNCxyOQorZXJyMzsJbHZ4CXZyMSxyNCxyMTAKK2VycjM7CWx2eAl2cjAscjQscjExCisJYWRkaQlyNCxyNCw2NAorZXJyMzsJc3R2eAl2cjMscjAscjMKK2VycjM7CXN0dngJdnIyLHIzLHI5CitlcnIzOwlzdHZ4CXZyMSxyMyxyMTAKK2VycjM7CXN0dngJdnIwLHIzLHIxMQorCWFkZGkJcjMscjMsNjQKKworNzoJc3ViCXI1LHI1LHI2CisJc3JkaQlyNixyNSw3CisKKwlzdGQJcjE0LFNUS19SRUcocjE0KShyMSkKKwlzdGQJcjE1LFNUS19SRUcocjE1KShyMSkKKwlzdGQJcjE2LFNUS19SRUcocjE2KShyMSkKKworCWxpCXIxMiw2NAorCWxpCXIxNCw4MAorCWxpCXIxNSw5NgorCWxpCXIxNiwxMTIKKworCW10Y3RyCXI2CisKKwkvKgorCSAqIE5vdyBkbyBjYWNoZWxpbmUgc2l6ZWQgbG9hZHMgYW5kIHN0b3Jlcy4gQnkgdGhpcyBzdGFnZSB0aGUKKwkgKiBjYWNoZWxpbmUgc3RvcmVzIGFyZSBhbHNvIGNhY2hlbGluZSBhbGlnbmVkLgorCSAqLworCS5hbGlnbgk1Cis4OgorZXJyNDsJbHZ4CXZyNyxyMCxyNAorZXJyNDsJbHZ4CXZyNixyNCxyOQorZXJyNDsJbHZ4CXZyNSxyNCxyMTAKK2VycjQ7CWx2eAl2cjQscjQscjExCitlcnI0OwlsdngJdnIzLHI0LHIxMgorZXJyNDsJbHZ4CXZyMixyNCxyMTQKK2VycjQ7CWx2eAl2cjEscjQscjE1CitlcnI0OwlsdngJdnIwLHI0LHIxNgorCWFkZGkJcjQscjQsMTI4CitlcnI0OwlzdHZ4CXZyNyxyMCxyMworZXJyNDsJc3R2eAl2cjYscjMscjkKK2VycjQ7CXN0dngJdnI1LHIzLHIxMAorZXJyNDsJc3R2eAl2cjQscjMscjExCitlcnI0OwlzdHZ4CXZyMyxyMyxyMTIKK2VycjQ7CXN0dngJdnIyLHIzLHIxNAorZXJyNDsJc3R2eAl2cjEscjMscjE1CitlcnI0OwlzdHZ4CXZyMCxyMyxyMTYKKwlhZGRpCXIzLHIzLDEyOAorCWJkbnoJOGIKKworCWxkCXIxNCxTVEtfUkVHKHIxNCkocjEpCisJbGQJcjE1LFNUS19SRUcocjE1KShyMSkKKwlsZAlyMTYsU1RLX1JFRyhyMTYpKHIxKQorCisJLyogVXAgdG8gMTI3QiB0byBnbyAqLworCWNscmxkaQlyNSxyNSwoNjQtNykKKwlzcmRpCXI2LHI1LDQKKwltdG9jcmYJMHgwMSxyNgorCisJYmYJY3I3KjQrMSw5ZgorZXJyMzsJbHZ4CXZyMyxyMCxyNAorZXJyMzsJbHZ4CXZyMixyNCxyOQorZXJyMzsJbHZ4CXZyMSxyNCxyMTAKK2VycjM7CWx2eAl2cjAscjQscjExCisJYWRkaQlyNCxyNCw2NAorZXJyMzsJc3R2eAl2cjMscjAscjMKK2VycjM7CXN0dngJdnIyLHIzLHI5CitlcnIzOwlzdHZ4CXZyMSxyMyxyMTAKK2VycjM7CXN0dngJdnIwLHIzLHIxMQorCWFkZGkJcjMscjMsNjQKKworOToJYmYJY3I3KjQrMiwxMGYKK2VycjM7CWx2eAl2cjEscjAscjQKK2VycjM7CWx2eAl2cjAscjQscjkKKwlhZGRpCXI0LHI0LDMyCitlcnIzOwlzdHZ4CXZyMSxyMCxyMworZXJyMzsJc3R2eAl2cjAscjMscjkKKwlhZGRpCXIzLHIzLDMyCisKKzEwOgliZgljcjcqNCszLDExZgorZXJyMzsJbHZ4CXZyMSxyMCxyNAorCWFkZGkJcjQscjQsMTYKK2VycjM7CXN0dngJdnIxLHIwLHIzCisJYWRkaQlyMyxyMywxNgorCisJLyogVXAgdG8gMTVCIHRvIGdvICovCisxMToJY2xybGRpCXI1LHI1LCg2NC00KQorCW10b2NyZgkweDAxLHI1CisJYmYJY3I3KjQrMCwxMmYKK2VycjM7CWxkCXIwLDAocjQpCisJYWRkaQlyNCxyNCw4CitlcnIzOwlzdGQJcjAsMChyMykKKwlhZGRpCXIzLHIzLDgKKworMTI6CWJmCWNyNyo0KzEsMTNmCitlcnIzOwlsd3oJcjAsMChyNCkKKwlhZGRpCXI0LHI0LDQKK2VycjM7CXN0dwlyMCwwKHIzKQorCWFkZGkJcjMscjMsNAorCisxMzoJYmYJY3I3KjQrMiwxNGYKK2VycjM7CWxoeglyMCwwKHI0KQorCWFkZGkJcjQscjQsMgorZXJyMzsJc3RoCXIwLDAocjMpCisJYWRkaQlyMyxyMywyCisKKzE0OgliZgljcjcqNCszLDE1ZgorZXJyMzsJbGJ6CXIwLDAocjQpCitlcnIzOwlzdGIJcjAsMChyMykKKworMTU6CWFkZGkJcjEscjEsU1RBQ0tGUkFNRVNJWkUKKwliCS5leGl0X3ZteF9jb3B5CQkvKiB0YWlsIGNhbGwgb3B0aW1pc2UgKi8KKworLkx2bXhfdW5hbGlnbmVkX2NvcHk6CisJLyogR2V0IHRoZSBkZXN0aW5hdGlvbiAxNkIgYWxpZ25lZCAqLworCW5lZwlyNixyMworCW10b2NyZgkweDAxLHI2CisJY2xybGRpCXI2LHI2LCg2NC00KQorCisJYmYJY3I3KjQrMywxZgorZXJyMzsJbGJ6CXIwLDAocjQpCisJYWRkaQlyNCxyNCwxCitlcnIzOwlzdGIJcjAsMChyMykKKwlhZGRpCXIzLHIzLDEKKworMToJYmYJY3I3KjQrMiwyZgorZXJyMzsJbGh6CXIwLDAocjQpCisJYWRkaQlyNCxyNCwyCitlcnIzOwlzdGgJcjAsMChyMykKKwlhZGRpCXIzLHIzLDIKKworMjoJYmYJY3I3KjQrMSwzZgorZXJyMzsJbHd6CXIwLDAocjQpCisJYWRkaQlyNCxyNCw0CitlcnIzOwlzdHcJcjAsMChyMykKKwlhZGRpCXIzLHIzLDQKKworMzoJYmYJY3I3KjQrMCw0ZgorZXJyMzsJbHd6CXIwLDAocjQpCS8qIExlc3MgY2hhbmNlIG9mIGEgcmVqZWN0IHdpdGggd29yZCBvcHMgKi8KK2VycjM7CWx3eglyNyw0KHI0KQorCWFkZGkJcjQscjQsOAorZXJyMzsJc3R3CXIwLDAocjMpCitlcnIzOwlzdHcJcjcsNChyMykKKwlhZGRpCXIzLHIzLDgKKworNDoJc3ViCXI1LHI1LHI2CisKKwkvKiBHZXQgdGhlIGRlc2luYXRpb24gMTI4QiBhbGlnbmVkICovCisJbmVnCXI2LHIzCisJc3JkaQlyNyxyNiw0CisJbXRvY3JmCTB4MDEscjcKKwljbHJsZGkJcjYscjYsKDY0LTcpCisKKwlsaQlyOSwxNgorCWxpCXIxMCwzMgorCWxpCXIxMSw0OAorCisJbHZzbAl2cjE2LDAscjQJLyogU2V0dXAgcGVybXV0ZSBjb250cm9sIHZlY3RvciAqLworZXJyMzsJbHZ4CXZyMCwwLHI0CisJYWRkaQlyNCxyNCwxNgorCisJYmYJY3I3KjQrMyw1ZgorZXJyMzsJbHZ4CXZyMSxyMCxyNAorCXZwZXJtCXZyOCx2cjAsdnIxLHZyMTYKKwlhZGRpCXI0LHI0LDE2CitlcnIzOwlzdHZ4CXZyOCxyMCxyMworCWFkZGkJcjMscjMsMTYKKwl2b3IJdnIwLHZyMSx2cjEKKworNToJYmYJY3I3KjQrMiw2ZgorZXJyMzsJbHZ4CXZyMSxyMCxyNAorCXZwZXJtCXZyOCx2cjAsdnIxLHZyMTYKK2VycjM7CWx2eAl2cjAscjQscjkKKwl2cGVybQl2cjksdnIxLHZyMCx2cjE2CisJYWRkaQlyNCxyNCwzMgorZXJyMzsJc3R2eAl2cjgscjAscjMKK2VycjM7CXN0dngJdnI5LHIzLHI5CisJYWRkaQlyMyxyMywzMgorCis2OgliZgljcjcqNCsxLDdmCitlcnIzOwlsdngJdnIzLHIwLHI0CisJdnBlcm0JdnI4LHZyMCx2cjMsdnIxNgorZXJyMzsJbHZ4CXZyMixyNCxyOQorCXZwZXJtCXZyOSx2cjMsdnIyLHZyMTYKK2VycjM7CWx2eAl2cjEscjQscjEwCisJdnBlcm0JdnIxMCx2cjIsdnIxLHZyMTYKK2VycjM7CWx2eAl2cjAscjQscjExCisJdnBlcm0JdnIxMSx2cjEsdnIwLHZyMTYKKwlhZGRpCXI0LHI0LDY0CitlcnIzOwlzdHZ4CXZyOCxyMCxyMworZXJyMzsJc3R2eAl2cjkscjMscjkKK2VycjM7CXN0dngJdnIxMCxyMyxyMTAKK2VycjM7CXN0dngJdnIxMSxyMyxyMTEKKwlhZGRpCXIzLHIzLDY0CisKKzc6CXN1YglyNSxyNSxyNgorCXNyZGkJcjYscjUsNworCisJc3RkCXIxNCxTVEtfUkVHKHIxNCkocjEpCisJc3RkCXIxNSxTVEtfUkVHKHIxNSkocjEpCisJc3RkCXIxNixTVEtfUkVHKHIxNikocjEpCisKKwlsaQlyMTIsNjQKKwlsaQlyMTQsODAKKwlsaQlyMTUsOTYKKwlsaQlyMTYsMTEyCisKKwltdGN0cglyNgorCisJLyoKKwkgKiBOb3cgZG8gY2FjaGVsaW5lIHNpemVkIGxvYWRzIGFuZCBzdG9yZXMuIEJ5IHRoaXMgc3RhZ2UgdGhlCisJICogY2FjaGVsaW5lIHN0b3JlcyBhcmUgYWxzbyBjYWNoZWxpbmUgYWxpZ25lZC4KKwkgKi8KKwkuYWxpZ24JNQorODoKK2VycjQ7CWx2eAl2cjcscjAscjQKKwl2cGVybQl2cjgsdnIwLHZyNyx2cjE2CitlcnI0OwlsdngJdnI2LHI0LHI5CisJdnBlcm0JdnI5LHZyNyx2cjYsdnIxNgorZXJyNDsJbHZ4CXZyNSxyNCxyMTAKKwl2cGVybQl2cjEwLHZyNix2cjUsdnIxNgorZXJyNDsJbHZ4CXZyNCxyNCxyMTEKKwl2cGVybQl2cjExLHZyNSx2cjQsdnIxNgorZXJyNDsJbHZ4CXZyMyxyNCxyMTIKKwl2cGVybQl2cjEyLHZyNCx2cjMsdnIxNgorZXJyNDsJbHZ4CXZyMixyNCxyMTQKKwl2cGVybQl2cjEzLHZyMyx2cjIsdnIxNgorZXJyNDsJbHZ4CXZyMSxyNCxyMTUKKwl2cGVybQl2cjE0LHZyMix2cjEsdnIxNgorZXJyNDsJbHZ4CXZyMCxyNCxyMTYKKwl2cGVybQl2cjE1LHZyMSx2cjAsdnIxNgorCWFkZGkJcjQscjQsMTI4CitlcnI0OwlzdHZ4CXZyOCxyMCxyMworZXJyNDsJc3R2eAl2cjkscjMscjkKK2VycjQ7CXN0dngJdnIxMCxyMyxyMTAKK2VycjQ7CXN0dngJdnIxMSxyMyxyMTEKK2VycjQ7CXN0dngJdnIxMixyMyxyMTIKK2VycjQ7CXN0dngJdnIxMyxyMyxyMTQKK2VycjQ7CXN0dngJdnIxNCxyMyxyMTUKK2VycjQ7CXN0dngJdnIxNSxyMyxyMTYKKwlhZGRpCXIzLHIzLDEyOAorCWJkbnoJOGIKKworCWxkCXIxNCxTVEtfUkVHKHIxNCkocjEpCisJbGQJcjE1LFNUS19SRUcocjE1KShyMSkKKwlsZAlyMTYsU1RLX1JFRyhyMTYpKHIxKQorCisJLyogVXAgdG8gMTI3QiB0byBnbyAqLworCWNscmxkaQlyNSxyNSwoNjQtNykKKwlzcmRpCXI2LHI1LDQKKwltdG9jcmYJMHgwMSxyNgorCisJYmYJY3I3KjQrMSw5ZgorZXJyMzsJbHZ4CXZyMyxyMCxyNAorCXZwZXJtCXZyOCx2cjAsdnIzLHZyMTYKK2VycjM7CWx2eAl2cjIscjQscjkKKwl2cGVybQl2cjksdnIzLHZyMix2cjE2CitlcnIzOwlsdngJdnIxLHI0LHIxMAorCXZwZXJtCXZyMTAsdnIyLHZyMSx2cjE2CitlcnIzOwlsdngJdnIwLHI0LHIxMQorCXZwZXJtCXZyMTEsdnIxLHZyMCx2cjE2CisJYWRkaQlyNCxyNCw2NAorZXJyMzsJc3R2eAl2cjgscjAscjMKK2VycjM7CXN0dngJdnI5LHIzLHI5CitlcnIzOwlzdHZ4CXZyMTAscjMscjEwCitlcnIzOwlzdHZ4CXZyMTEscjMscjExCisJYWRkaQlyMyxyMyw2NAorCis5OgliZgljcjcqNCsyLDEwZgorZXJyMzsJbHZ4CXZyMSxyMCxyNAorCXZwZXJtCXZyOCx2cjAsdnIxLHZyMTYKK2VycjM7CWx2eAl2cjAscjQscjkKKwl2cGVybQl2cjksdnIxLHZyMCx2cjE2CisJYWRkaQlyNCxyNCwzMgorZXJyMzsJc3R2eAl2cjgscjAscjMKK2VycjM7CXN0dngJdnI5LHIzLHI5CisJYWRkaQlyMyxyMywzMgorCisxMDoJYmYJY3I3KjQrMywxMWYKK2VycjM7CWx2eAl2cjEscjAscjQKKwl2cGVybQl2cjgsdnIwLHZyMSx2cjE2CisJYWRkaQlyNCxyNCwxNgorZXJyMzsJc3R2eAl2cjgscjAscjMKKwlhZGRpCXIzLHIzLDE2CisKKwkvKiBVcCB0byAxNUIgdG8gZ28gKi8KKzExOgljbHJsZGkJcjUscjUsKDY0LTQpCisJYWRkaQlyNCxyNCwtMTYJLyogVW53aW5kIHRoZSArMTYgbG9hZCBvZmZzZXQgKi8KKwltdG9jcmYJMHgwMSxyNQorCWJmCWNyNyo0KzAsMTJmCitlcnIzOwlsd3oJcjAsMChyNCkJLyogTGVzcyBjaGFuY2Ugb2YgYSByZWplY3Qgd2l0aCB3b3JkIG9wcyAqLworZXJyMzsJbHd6CXI2LDQocjQpCisJYWRkaQlyNCxyNCw4CitlcnIzOwlzdHcJcjAsMChyMykKK2VycjM7CXN0dwlyNiw0KHIzKQorCWFkZGkJcjMscjMsOAorCisxMjoJYmYJY3I3KjQrMSwxM2YKK2VycjM7CWx3eglyMCwwKHI0KQorCWFkZGkJcjQscjQsNAorZXJyMzsJc3R3CXIwLDAocjMpCisJYWRkaQlyMyxyMyw0CisKKzEzOgliZgljcjcqNCsyLDE0ZgorZXJyMzsJbGh6CXIwLDAocjQpCisJYWRkaQlyNCxyNCwyCitlcnIzOwlzdGgJcjAsMChyMykKKwlhZGRpCXIzLHIzLDIKKworMTQ6CWJmCWNyNyo0KzMsMTVmCitlcnIzOwlsYnoJcjAsMChyNCkKK2VycjM7CXN0YglyMCwwKHIzKQorCisxNToJYWRkaQlyMSxyMSxTVEFDS0ZSQU1FU0laRQorCWIJLmV4aXRfdm14X2NvcHkJCS8qIHRhaWwgY2FsbCBvcHRpbWlzZSAqLworI2VuZGlmIC8qIENPTkZpR19BTFRJVkVDICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbGliL2NvcHl1c2VyX3Bvd2VyN192bXguYyBiL2FyY2gvcG93ZXJwYy9saWIvY29weXVzZXJfcG93ZXI3X3ZteC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMWVmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvbGliL2NvcHl1c2VyX3Bvd2VyN192bXguYwpAQCAtMCwwICsxLDUwIEBACisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIElCTSBDb3Jwb3JhdGlvbiwgMjAxMQorICoKKyAqIEF1dGhvcnM6IFN1a2FkZXYgQmhhdHRpcHJvbHUgPHN1a2FkZXZAbGludXgudm5ldC5pYm0uY29tPgorICogICAgICAgICAgQW50b24gQmxhbmNoYXJkIDxhbnRvbkBhdS5pYm0uY29tPgorICovCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKworaW50IGVudGVyX3ZteF9jb3B5KHZvaWQpCit7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm4gMDsKKworCS8qIFRoaXMgYWN0cyBhcyBwcmVlbXB0X2Rpc2FibGUoKSBhcyB3ZWxsIGFuZCB3aWxsIG1ha2UKKwkgKiBlbmFibGVfa2VybmVsX2FsdGl2ZWMoKS4gV2UgbmVlZCB0byBkaXNhYmxlIHBhZ2UgZmF1bHRzCisJICogYXMgdGhleSBjYW4gY2FsbCBzY2hlZHVsZSBhbmQgdGh1cyBtYWtlIHVzIGxvc2UgdGhlIFZNWAorCSAqIGNvbnRleHQuIFNvIG9uIHBhZ2UgZmF1bHRzLCB3ZSBqdXN0IGZhaWwgd2hpY2ggd2lsbCBjYXVzZQorCSAqIGEgZmFsbGJhY2sgdG8gdGhlIG5vcm1hbCBub24tdm14IGNvcHkuCisJICovCisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKKworCWVuYWJsZV9rZXJuZWxfYWx0aXZlYygpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIG11c3QgcmV0dXJuIDAgYmVjYXVzZSB3ZSB0YWlsIGNhbGwgb3B0aW1pc2Ugd2hlbiBjYWxsaW5nCisgKiBmcm9tIF9fY29weV90b2Zyb21fdXNlcl9wb3dlcjcgd2hpY2ggcmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBleGl0X3ZteF9jb3B5KHZvaWQpCit7CisJcGFnZWZhdWx0X2VuYWJsZSgpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tLzQ0eF9tbXUuYyBiL2FyY2gvcG93ZXJwYy9tbS80NHhfbW11LmMKaW5kZXggZjYwZTAwNi4uMzg4Yjk1ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tLzQ0eF9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vNDR4X21tdS5jCkBAIC03OCwxMSArNzgsNyBAQAogCQkidGxid2UJJTEsJTMsJTVcbiIKIAkJInRsYndlCSUwLCUzLCU2XG4iCiAJOgotI2lmZGVmIENPTkZJR19QUEM0N3gKLQk6ICJyIiAoUFBDNDd4X1RMQjJfU19SV1gpLAotI2Vsc2UKIAk6ICJyIiAoUFBDNDR4X1RMQl9TVyB8IFBQQzQ0eF9UTEJfU1IgfCBQUEM0NHhfVExCX1NYIHwgUFBDNDR4X1RMQl9HKSwKLSNlbmRpZgogCSAgInIiIChwaHlzKSwKIAkgICJyIiAodmlydCB8IFBQQzQ0eF9UTEJfVkFMSUQgfCBQUEM0NHhfVExCXzI1Nk0pLAogCSAgInIiIChlbnRyeSksCkBAIC0yMjEsNyArMjE3LDcgQEAKIHsKIAl1NjQgc2l6ZTsKIAotI2lmbmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKKyNpZm5kZWYgQ09ORklHX05PTlNUQVRJQ19LRVJORUwKIAkvKiBXZSBkb24ndCBjdXJyZW50bHkgc3VwcG9ydCB0aGUgZmlyc3QgTUVNQkxPQ0sgbm90IG1hcHBpbmcgMAogCSAqIHBoeXNpY2FsIG9uIHRob3NlIHByb2Nlc3NvcnMKIAkgKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9tbS9NYWtlZmlsZQppbmRleCA5OTFlZTgxLi4zNzg3YjYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL21tL01ha2VmaWxlCkBAIC0yMSw2ICsyMSw4IEBACiBvYmotJChDT05GSUdfUFBDX1NURF9NTVUpCSs9IGhhc2hfbG93XyQoQ09ORklHX1dPUkRfU0laRSkubyBcCiAJCQkJICAgdGxiX2hhc2gkKENPTkZJR19XT1JEX1NJWkUpLm8gXAogCQkJCSAgIG1tdV9jb250ZXh0X2hhc2gkKENPTkZJR19XT1JEX1NJWkUpLm8KK29iai0kKENPTkZJR19QUENfSUNTV1gpCQkrPSBpY3N3eC5vCitvYmotJChDT05GSUdfUFBDX0lDU1dYX1BJRCkJKz0gaWNzd3hfcGlkLm8KIG9iai0kKENPTkZJR180MHgpCQkrPSA0MHhfbW11Lm8KIG9iai0kKENPTkZJR180NHgpCQkrPSA0NHhfbW11Lm8KIG9iai0kKENPTkZJR19QUENfRlNMX0JPT0szRSkJKz0gZnNsX2Jvb2tlX21tdS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCmluZGV4IDVlZmU4YzkuLjJmMGQxYjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9mYXVsdC5jCkBAIC00NCw2ICs0NCw4IEBACiAjaW5jbHVkZSA8YXNtL3NpZ2luZm8uaD4KICNpbmNsdWRlIDxtbS9tbXVfZGVjbC5oPgogCisjaW5jbHVkZSAiaWNzd3guaCIKKwogI2lmZGVmIENPTkZJR19LUFJPQkVTCiBzdGF0aWMgaW5saW5lIGludCBub3RpZnlfcGFnZV9mYXVsdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKQEAgLTE0Myw2ICsxNDUsMjEgQEAKIAlpc193cml0ZSA9IGVycm9yX2NvZGUgJiBFU1JfRFNUOwogI2VuZGlmIC8qIENPTkZJR180eHggfHwgQ09ORklHX0JPT0tFICovCiAKKyNpZmRlZiBDT05GSUdfUFBDX0lDU1dYCisJLyoKKwkgKiB3ZSBuZWVkIHRvIGRvIHRoaXMgZWFybHkgYmVjYXVzZSB0aGlzICJkYXRhIHN0b3JhZ2UKKwkgKiBpbnRlcnJ1cHQiIGRvZXMgbm90IHVwZGF0ZSB0aGUgREFSL0RFQVIgc28gd2UgZG9uJ3Qgd2FudCB0bworCSAqIGxvb2sgYXQgaXQKKwkgKi8KKwlpZiAoZXJyb3JfY29kZSAmIElDU1dYX0RTSV9VQ1QpIHsKKwkJaW50IHJldDsKKworCQlyZXQgPSBhY29wX2hhbmRsZV9mYXVsdChyZWdzLCBhZGRyZXNzLCBlcnJvcl9jb2RlKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorI2VuZGlmCisKIAlpZiAobm90aWZ5X3BhZ2VfZmF1bHQocmVncykpCiAJCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UtYm9vazNlLmMgYi9hcmNoL3Bvd2VycGMvbW0vaHVnZXRsYnBhZ2UtYm9vazNlLmMKaW5kZXggMzQzYWQwYi4uM2JjNzAwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLWJvb2szZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS1ib29rM2UuYwpAQCAtMzcsMzEgKzM3LDMyIEBACiAJcmV0dXJuIGZvdW5kOwogfQogCi12b2lkIGJvb2szZV9odWdldGxiX3ByZWxvYWQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgZWEsIHB0ZV90IHB0ZSkKK3ZvaWQgYm9vazNlX2h1Z2V0bGJfcHJlbG9hZChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBlYSwKKwkJCSAgICBwdGVfdCBwdGUpCiB7CiAJdW5zaWduZWQgbG9uZyBtYXMxLCBtYXMyOwogCXU2NCBtYXM3XzM7CiAJdW5zaWduZWQgbG9uZyBwc2l6ZSwgdHNpemUsIHNoaWZ0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IG1tX3N0cnVjdCAqbW07CiAKICNpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKLQlpbnQgaW5kZXgsIGx6LCBuY2FtczsKLQlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYTsKKwlpbnQgaW5kZXgsIG5jYW1zOwogI2VuZGlmCiAKIAlpZiAodW5saWtlbHkoaXNfa2VybmVsX2FkZHIoZWEpKSkKIAkJcmV0dXJuOwogCisJbW0gPSB2bWEtPnZtX21tOworCiAjaWZkZWYgQ09ORklHX1BQQ19NTV9TTElDRVMKLQlwc2l6ZSA9IG1tdV9nZXRfdHNpemUoZ2V0X3NsaWNlX3BzaXplKG1tLCBlYSkpOwotCXRzaXplID0gbW11X2dldF9wc2l6ZShwc2l6ZSk7CisJcHNpemUgPSBnZXRfc2xpY2VfcHNpemUobW0sIGVhKTsKKwl0c2l6ZSA9IG1tdV9nZXRfdHNpemUocHNpemUpOwogCXNoaWZ0ID0gbW11X3BzaXplX2RlZnNbcHNpemVdLnNoaWZ0OwogI2Vsc2UKLQl2bWEgPSBmaW5kX3ZtYShtbSwgZWEpOwotCXBzaXplID0gdm1hX21tdV9wYWdlc2l6ZSh2bWEpOwkvKiByZXR1cm5zIGFjdHVhbCBzaXplIGluIGJ5dGVzICovCi0JYXNtIChQUENfQ05UTFpMICIlMCwlMSIgOiAiPXIiIChseikgOiAiciIgKHBzaXplKSk7Ci0Jc2hpZnQgPSAzMSAtIGx6OwotCXRzaXplID0gMjEgLSBsejsKKwlwc2l6ZSA9IHZtYV9tbXVfcGFnZXNpemUodm1hKTsKKwlzaGlmdCA9IF9faWxvZzIocHNpemUpOworCXRzaXplID0gc2hpZnQgLSAxMDsKICNlbmRpZgogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9odWdldGxicGFnZS5jIGIvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMKaW5kZXggODU1OGI1Ny4uYThiM2NjNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL2h1Z2V0bGJwYWdlLmMKQEAgLTI5LDIyICsyOSwyMiBAQAogCiAvKgogICogVHJhY2tzIGdwYWdlcyBhZnRlciB0aGUgZGV2aWNlIHRyZWUgaXMgc2Nhbm5lZCBhbmQgYmVmb3JlIHRoZQotICogaHVnZV9ib290X3BhZ2VzIGxpc3QgaXMgcmVhZHkuICBPbiA2NC1iaXQgaW1wbGVtZW50YXRpb25zLCB0aGlzIGlzCi0gKiBqdXN0IHVzZWQgdG8gdHJhY2sgMTZHIHBhZ2VzIGFuZCBzbyBpcyBhIHNpbmdsZSBhcnJheS4gIDMyLWJpdAotICogaW1wbGVtZW50YXRpb25zIG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgZ3BhZ2Ugc2l6ZSBkdWUgdG8gbGltaXRhdGlvbnMKLSAqIG9mIHRoZSBtZW1vcnkgYWxsb2NhdG9ycywgc28gd2UgbmVlZCBtdWx0aXBsZSBhcnJheXMKKyAqIGh1Z2VfYm9vdF9wYWdlcyBsaXN0IGlzIHJlYWR5LiAgT24gbm9uLUZyZWVzY2FsZSBpbXBsZW1lbnRhdGlvbnMsIHRoaXMgaXMKKyAqIGp1c3QgdXNlZCB0byB0cmFjayAxNkcgcGFnZXMgYW5kIHNvIGlzIGEgc2luZ2xlIGFycmF5LiAgRlNMLWJhc2VkCisgKiBpbXBsZW1lbnRhdGlvbnMgbWF5IGhhdmUgbW9yZSB0aGFuIG9uZSBncGFnZSBzaXplLCBzbyB3ZSBuZWVkIG11bHRpcGxlCisgKiBhcnJheXMKICAqLwotI2lmZGVmIENPTkZJR19QUEM2NAotI2RlZmluZSBNQVhfTlVNQkVSX0dQQUdFUwkxMDI0Ci1zdGF0aWMgdTY0IGdwYWdlX2ZyZWVhcnJheVtNQVhfTlVNQkVSX0dQQUdFU107Ci1zdGF0aWMgdW5zaWduZWQgbnJfZ3BhZ2VzOwotI2Vsc2UKKyNpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKICNkZWZpbmUgTUFYX05VTUJFUl9HUEFHRVMJMTI4CiBzdHJ1Y3QgcHNpemVfZ3BhZ2VzIHsKIAl1NjQgZ3BhZ2VfbGlzdFtNQVhfTlVNQkVSX0dQQUdFU107CiAJdW5zaWduZWQgaW50IG5yX2dwYWdlczsKIH07CiBzdGF0aWMgc3RydWN0IHBzaXplX2dwYWdlcyBncGFnZV9mcmVlYXJyYXlbTU1VX1BBR0VfQ09VTlRdOworI2Vsc2UKKyNkZWZpbmUgTUFYX05VTUJFUl9HUEFHRVMJMTAyNAorc3RhdGljIHU2NCBncGFnZV9mcmVlYXJyYXlbTUFYX05VTUJFUl9HUEFHRVNdOworc3RhdGljIHVuc2lnbmVkIG5yX2dwYWdlczsKICNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBzaGlmdF90b19tbXVfcHNpemUodW5zaWduZWQgaW50IHNoaWZ0KQpAQCAtMTE1LDEyICsxMTUsMTIgQEAKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwogCXB0ZV90ICpuZXc7CiAKLSNpZmRlZiBDT05GSUdfUFBDNjQKLQljYWNoZXAgPSBQR1RfQ0FDSEUocGRzaGlmdCAtIHBzaGlmdCk7Ci0jZWxzZQorI2lmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQogCWludCBpOwogCWludCBudW1faHVnZXBkID0gMSA8PCAocHNoaWZ0IC0gcGRzaGlmdCk7CiAJY2FjaGVwID0gaHVnZXB0ZV9jYWNoZTsKKyNlbHNlCisJY2FjaGVwID0gUEdUX0NBQ0hFKHBkc2hpZnQgLSBwc2hpZnQpOwogI2VuZGlmCiAKIAluZXcgPSBrbWVtX2NhY2hlX3phbGxvYyhjYWNoZXAsIEdGUF9LRVJORUx8X19HRlBfUkVQRUFUKTsKQEAgLTEzMiwxMiArMTMyLDcgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotI2lmZGVmIENPTkZJR19QUEM2NAotCWlmICghaHVnZXBkX25vbmUoKmhwZHApKQotCQlrbWVtX2NhY2hlX2ZyZWUoY2FjaGVwLCBuZXcpOwotCWVsc2UKLQkJaHBkcC0+cGQgPSAoKHVuc2lnbmVkIGxvbmcpbmV3ICYgflBEX0hVR0UpIHwgcHNoaWZ0OwotI2Vsc2UKKyNpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKIAkvKgogCSAqIFdlIGhhdmUgbXVsdGlwbGUgaGlnaGVyLWxldmVsIGVudHJpZXMgdGhhdCBwb2ludCB0byB0aGUgc2FtZQogCSAqIGFjdHVhbCBwdGUgbG9jYXRpb24uICBGaWxsIGluIGVhY2ggYXMgd2UgZ28gYW5kIGJhY2t0cmFjayBvbiBlcnJvci4KQEAgLTE1NiwxMSArMTUxLDI4IEBACiAJCQlocGRwLT5wZCA9IDA7CiAJCWttZW1fY2FjaGVfZnJlZShjYWNoZXAsIG5ldyk7CiAJfQorI2Vsc2UKKwlpZiAoIWh1Z2VwZF9ub25lKCpocGRwKSkKKwkJa21lbV9jYWNoZV9mcmVlKGNhY2hlcCwgbmV3KTsKKwllbHNlCisJCWhwZHAtPnBkID0gKCh1bnNpZ25lZCBsb25nKW5ldyAmIH5QRF9IVUdFKSB8IHBzaGlmdDsKICNlbmRpZgogCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIAorLyoKKyAqIFRoZXNlIG1hY3JvcyBkZWZpbmUgaG93IHRvIGRldGVybWluZSB3aGljaCBsZXZlbCBvZiB0aGUgcGFnZSB0YWJsZSBob2xkcworICogdGhlIGhwZHAuCisgKi8KKyNpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKKyNkZWZpbmUgSFVHRVBEX1BHRF9TSElGVCBQR0RJUl9TSElGVAorI2RlZmluZSBIVUdFUERfUFVEX1NISUZUIFBVRF9TSElGVAorI2Vsc2UKKyNkZWZpbmUgSFVHRVBEX1BHRF9TSElGVCBQVURfU0hJRlQKKyNkZWZpbmUgSFVHRVBEX1BVRF9TSElGVCBQTURfU0hJRlQKKyNlbmRpZgorCiBwdGVfdCAqaHVnZV9wdGVfYWxsb2Moc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzeikKIHsKIAlwZ2RfdCAqcGc7CkBAIC0xNzMsMTIgKzE4NSwxMyBAQAogCWFkZHIgJj0gfihzei0xKTsKIAogCXBnID0gcGdkX29mZnNldChtbSwgYWRkcik7Ci0JaWYgKHBzaGlmdCA+PSBQVURfU0hJRlQpIHsKKworCWlmIChwc2hpZnQgPj0gSFVHRVBEX1BHRF9TSElGVCkgewogCQlocGRwID0gKGh1Z2VwZF90ICopcGc7CiAJfSBlbHNlIHsKIAkJcGRzaGlmdCA9IFBVRF9TSElGVDsKIAkJcHUgPSBwdWRfYWxsb2MobW0sIHBnLCBhZGRyKTsKLQkJaWYgKHBzaGlmdCA+PSBQTURfU0hJRlQpIHsKKwkJaWYgKHBzaGlmdCA+PSBIVUdFUERfUFVEX1NISUZUKSB7CiAJCQlocGRwID0gKGh1Z2VwZF90ICopcHU7CiAJCX0gZWxzZSB7CiAJCQlwZHNoaWZ0ID0gUE1EX1NISUZUOwpAQCAtMTk4LDcgKzIxMSw3IEBACiAJcmV0dXJuIGh1Z2VwdGVfb2Zmc2V0KGhwZHAsIGFkZHIsIHBkc2hpZnQpOwogfQogCi0jaWZkZWYgQ09ORklHX1BQQzMyCisjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCiAvKiBCdWlsZCBsaXN0IG9mIGFkZHJlc3NlcyBvZiBnaWdhbnRpYyBwYWdlcy4gIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBlYXJseQogICogYm9vdCBiZWZvcmUgdGhlIGJ1ZGR5IG9yIGJvb3RtZW0gYWxsb2NhdG9yIGlzIHNldHVwLgogICovCkBAIC0zMTgsNyArMzMxLDcgQEAKIAl9CiB9CiAKLSNlbHNlIC8qIFBQQzY0ICovCisjZWxzZSAvKiAhUFBDX0ZTTF9CT09LM0UgKi8KIAogLyogQnVpbGQgbGlzdCBvZiBhZGRyZXNzZXMgb2YgZ2lnYW50aWMgcGFnZXMuICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gZWFybHkKICAqIGJvb3QgYmVmb3JlIHRoZSBidWRkeSBvciBib290bWVtIGFsbG9jYXRvciBpcyBzZXR1cC4KQEAgLTM1Niw3ICszNjksNyBAQAogCXJldHVybiAwOwogfQogCi0jaWZkZWYgQ09ORklHX1BQQzMyCisjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCiAjZGVmaW5lIEhVR0VQRF9GUkVFTElTVF9TSVpFIFwKIAkoKFBBR0VfU0laRSAtIHNpemVvZihzdHJ1Y3QgaHVnZXBkX2ZyZWVsaXN0KSkgLyBzaXplb2YocHRlX3QpKQogCkBAIC00MTYsMTEgKzQyOSwxMSBAQAogCXVuc2lnbmVkIGxvbmcgcGRtYXNrID0gfigoMVVMIDw8IHBkc2hpZnQpIC0gMSk7CiAJdW5zaWduZWQgaW50IG51bV9odWdlcGQgPSAxOwogCi0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JdW5zaWduZWQgaW50IHNoaWZ0ID0gaHVnZXBkX3NoaWZ0KCpocGRwKTsKLSNlbHNlCi0JLyogTm90ZTogT24gMzItYml0IHRoZSBocGRwIG1heSBiZSB0aGUgZmlyc3Qgb2Ygc2V2ZXJhbCAqLworI2lmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQorCS8qIE5vdGU6IE9uIGZzbCB0aGUgaHBkcCBtYXkgYmUgdGhlIGZpcnN0IG9mIHNldmVyYWwgKi8KIAludW1faHVnZXBkID0gKDEgPDwgKGh1Z2VwZF9zaGlmdCgqaHBkcCkgLSBwZHNoaWZ0KSk7CisjZWxzZQorCXVuc2lnbmVkIGludCBzaGlmdCA9IGh1Z2VwZF9zaGlmdCgqaHBkcCk7CiAjZW5kaWYKIAogCXN0YXJ0ICY9IHBkbWFzazsKQEAgLTQzOCwxMCArNDUxLDExIEBACiAJCWhwZHAtPnBkID0gMDsKIAogCXRsYi0+bmVlZF9mbHVzaCA9IDE7Ci0jaWZkZWYgQ09ORklHX1BQQzY0Ci0JcGd0YWJsZV9mcmVlX3RsYih0bGIsIGh1Z2VwdGUsIHBkc2hpZnQgLSBzaGlmdCk7Ci0jZWxzZQorCisjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCiAJaHVnZXBkX2ZyZWUodGxiLCBodWdlcHRlKTsKKyNlbHNlCisJcGd0YWJsZV9mcmVlX3RsYih0bGIsIGh1Z2VwdGUsIHBkc2hpZnQgLSBzaGlmdCk7CiAjZW5kaWYKIH0KIApAQCAtNDU0LDE0ICs0NjgsMjMgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXJ0OwogCiAJc3RhcnQgPSBhZGRyOwotCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKIAlkbyB7CisJCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyKTsKIAkJbmV4dCA9IHBtZF9hZGRyX2VuZChhZGRyLCBlbmQpOwogCQlpZiAocG1kX25vbmUoKnBtZCkpCiAJCQljb250aW51ZTsKKyNpZmRlZiBDT05GSUdfUFBDX0ZTTF9CT09LM0UKKwkJLyoKKwkJICogSW5jcmVtZW50IG5leHQgYnkgdGhlIHNpemUgb2YgdGhlIGh1Z2UgbWFwcGluZyBzaW5jZQorCQkgKiB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBhdCB0aGlzIGxldmVsIGZvciBhCisJCSAqIHNpbmdsZSBodWdlcGFnZSwgYnV0IGFsbCBvZiB0aGVtIHBvaW50IHRvCisJCSAqIHRoZSBzYW1lIGttZW0gY2FjaGUgdGhhdCBob2xkcyB0aGUgaHVnZXB0ZS4KKwkJICovCisJCW5leHQgPSBhZGRyICsgKDEgPDwgaHVnZXBkX3NoaWZ0KCooaHVnZXBkX3QgKilwbWQpKTsKKyNlbmRpZgogCQlmcmVlX2h1Z2VwZF9yYW5nZSh0bGIsIChodWdlcGRfdCAqKXBtZCwgUE1EX1NISUZULAogCQkJCSAgYWRkciwgbmV4dCwgZmxvb3IsIGNlaWxpbmcpOwotCX0gd2hpbGUgKHBtZCsrLCBhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOworCX0gd2hpbGUgKGFkZHIgPSBuZXh0LCBhZGRyICE9IGVuZCk7CiAKIAlzdGFydCAmPSBQVURfTUFTSzsKIAlpZiAoc3RhcnQgPCBmbG9vcikKQEAgLTQ4OCw4ICs1MTEsOCBAQAogCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CiAKIAlzdGFydCA9IGFkZHI7Ci0JcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOwogCWRvIHsKKwkJcHVkID0gcHVkX29mZnNldChwZ2QsIGFkZHIpOwogCQluZXh0ID0gcHVkX2FkZHJfZW5kKGFkZHIsIGVuZCk7CiAJCWlmICghaXNfaHVnZXBkKHB1ZCkpIHsKIAkJCWlmIChwdWRfbm9uZV9vcl9jbGVhcl9iYWQocHVkKSkKQEAgLTQ5NywxMCArNTIwLDE5IEBACiAJCQlodWdldGxiX2ZyZWVfcG1kX3JhbmdlKHRsYiwgcHVkLCBhZGRyLCBuZXh0LCBmbG9vciwKIAkJCQkJICAgICAgIGNlaWxpbmcpOwogCQl9IGVsc2UgeworI2lmZGVmIENPTkZJR19QUENfRlNMX0JPT0szRQorCQkJLyoKKwkJCSAqIEluY3JlbWVudCBuZXh0IGJ5IHRoZSBzaXplIG9mIHRoZSBodWdlIG1hcHBpbmcgc2luY2UKKwkJCSAqIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGVudHJ5IGF0IHRoaXMgbGV2ZWwgZm9yIGEKKwkJCSAqIHNpbmdsZSBodWdlcGFnZSwgYnV0IGFsbCBvZiB0aGVtIHBvaW50IHRvCisJCQkgKiB0aGUgc2FtZSBrbWVtIGNhY2hlIHRoYXQgaG9sZHMgdGhlIGh1Z2VwdGUuCisJCQkgKi8KKwkJCW5leHQgPSBhZGRyICsgKDEgPDwgaHVnZXBkX3NoaWZ0KCooaHVnZXBkX3QgKilwdWQpKTsKKyNlbmRpZgogCQkJZnJlZV9odWdlcGRfcmFuZ2UodGxiLCAoaHVnZXBkX3QgKilwdWQsIFBVRF9TSElGVCwKIAkJCQkJICBhZGRyLCBuZXh0LCBmbG9vciwgY2VpbGluZyk7CiAJCX0KLQl9IHdoaWxlIChwdWQrKywgYWRkciA9IG5leHQsIGFkZHIgIT0gZW5kKTsKKwl9IHdoaWxlIChhZGRyID0gbmV4dCwgYWRkciAhPSBlbmQpOwogCiAJc3RhcnQgJj0gUEdESVJfTUFTSzsKIAlpZiAoc3RhcnQgPCBmbG9vcikKQEAgLTU1NSwxMiArNTg3LDEyIEBACiAJCQkJY29udGludWU7CiAJCQlodWdldGxiX2ZyZWVfcHVkX3JhbmdlKHRsYiwgcGdkLCBhZGRyLCBuZXh0LCBmbG9vciwgY2VpbGluZyk7CiAJCX0gZWxzZSB7Ci0jaWZkZWYgQ09ORklHX1BQQzMyCisjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCiAJCQkvKgogCQkJICogSW5jcmVtZW50IG5leHQgYnkgdGhlIHNpemUgb2YgdGhlIGh1Z2UgbWFwcGluZyBzaW5jZQotCQkJICogb24gMzItYml0IHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGVudHJ5IGF0IHRoZSBwZ2QKLQkJCSAqIGxldmVsIGZvciBhIHNpbmdsZSBodWdlcGFnZSwgYnV0IGFsbCBvZiB0aGVtIHBvaW50IHRvCi0JCQkgKiB0aGUgc2FtZSBrbWVtIGNhY2hlIHRoYXQgaG9sZHMgdGhlIGh1Z2VwdGUuCisJCQkgKiB0aGVyZSBtYXkgYmUgbW9yZSB0aGFuIG9uZSBlbnRyeSBhdCB0aGUgcGdkIGxldmVsCisJCQkgKiBmb3IgYSBzaW5nbGUgaHVnZXBhZ2UsIGJ1dCBhbGwgb2YgdGhlbSBwb2ludCB0byB0aGUKKwkJCSAqIHNhbWUga21lbSBjYWNoZSB0aGF0IGhvbGRzIHRoZSBodWdlcHRlLgogCQkJICovCiAJCQluZXh0ID0gYWRkciArICgxIDw8IGh1Z2VwZF9zaGlmdCgqKGh1Z2VwZF90ICopcGdkKSk7CiAjZW5kaWYKQEAgLTY5OCwxOSArNzMwLDE3IEBACiAJcmV0dXJuIDE7CiB9CiAKKyNpZmRlZiBDT05GSUdfUFBDX01NX1NMSUNFUwogdW5zaWduZWQgbG9uZyBodWdldGxiX2dldF91bm1hcHBlZF9hcmVhKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBsb25nIGFkZHIsCiAJCQkJCXVuc2lnbmVkIGxvbmcgbGVuLCB1bnNpZ25lZCBsb25nIHBnb2ZmLAogCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzKQogewotI2lmZGVmIENPTkZJR19QUENfTU1fU0xJQ0VTCiAJc3RydWN0IGhzdGF0ZSAqaHN0YXRlID0gaHN0YXRlX2ZpbGUoZmlsZSk7CiAJaW50IG1tdV9wc2l6ZSA9IHNoaWZ0X3RvX21tdV9wc2l6ZShodWdlX3BhZ2Vfc2hpZnQoaHN0YXRlKSk7CiAKIAlyZXR1cm4gc2xpY2VfZ2V0X3VubWFwcGVkX2FyZWEoYWRkciwgbGVuLCBmbGFncywgbW11X3BzaXplLCAxLCAwKTsKLSNlbHNlCi0JcmV0dXJuIGdldF91bm1hcHBlZF9hcmVhKGZpbGUsIGFkZHIsIGxlbiwgcGdvZmYsIGZsYWdzKTsKLSNlbmRpZgogfQorI2VuZGlmCiAKIHVuc2lnbmVkIGxvbmcgdm1hX21tdV9wYWdlc2l6ZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKQEAgLTc4NCw3ICs4MTQsNyBAQAogfQogX19zZXR1cCgiaHVnZXBhZ2Vzej0iLCBodWdlcGFnZV9zZXR1cF9zeik7CiAKLSNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCisjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCiBzdHJ1Y3Qga21lbV9jYWNoZSAqaHVnZXB0ZV9jYWNoZTsKIHN0YXRpYyBpbnQgX19pbml0IGh1Z2V0bGJwYWdlX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pY3N3eC5jIGIvYXJjaC9wb3dlcnBjL21tL2ljc3d4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ5YTU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9pY3N3eC5jCkBAIC0wLDAgKzEsMjczIEBACisvKgorICogIElDU1dYIGFuZCBBQ09QIE1hbmFnZW1lbnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIEFudG9uIEJsYW5jaGFyZCwgSUJNIENvcnAuIDxhbnRvbkBzYW1iYS5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiaWNzd3guaCIKKworLyoKKyAqIFRoZSBwcm9jZXNzb3IgYW5kIGl0cyBMMiBjYWNoZSBjYXVzZSB0aGUgaWNzd3ggaW5zdHJ1Y3Rpb24gdG8KKyAqIGdlbmVyYXRlIGEgQ09QX1JFUSB0cmFuc2FjdGlvbiBvbiBQb3dlckJ1cy4gVGhlIHRyYW5zYWN0aW9uIGhhcyBubworICogYWRkcmVzcywgYW5kIHRoZSBwcm9jZXNzb3IgZG9lcyBub3QgcGVyZm9ybSBhbiBNTVUgYWNjZXNzIHRvCisgKiBhdXRoZW50aWNhdGUgdGhlIHRyYW5zYWN0aW9uLiBUaGUgY29tbWFuZCBwb3J0aW9uIG9mIHRoZSBQb3dlckJ1cworICogQ09QX1JFUSB0cmFuc2FjdGlvbiBpbmNsdWRlcyB0aGUgTFBBUl9JRCAoTFBJRCkgYW5kIHRoZSBjb3Byb2Nlc3NvcgorICogUHJvY2VzcyBJRCAoUElEKSwgd2hpY2ggdGhlIGNvcHJvY2Vzc29yIGNvbXBhcmVzIHRvIHRoZSBhdXRob3JpemVkCisgKiBMUElEIGFuZCBQSUQgaGVsZCBpbiB0aGUgY29wcm9jZXNzb3IsIHRvIGRldGVybWluZSBpZiB0aGUgcHJvY2VzcworICogaXMgYXV0aG9yaXplZCB0byBnZW5lcmF0ZSB0aGUgdHJhbnNhY3Rpb24uICBUaGUgZGF0YSBvZiB0aGUgQ09QX1JFUQorICogdHJhbnNhY3Rpb24gaXMgMTI4LWJ5dGUgb3IgbGVzcyBpbiBzaXplIGFuZCBpcyBwbGFjZWQgaW4gY2FjaGVhYmxlCisgKiBtZW1vcnkgb24gYSAxMjgtYnl0ZSBjYWNoZSBsaW5lIGJvdW5kYXJ5LgorICoKKyAqIFRoZSB0YXNrIHRvIHVzZSBhIGNvcHJvY2Vzc29yIHNob3VsZCB1c2UgdXNlX2NvcCgpIHRvIG1hcmsgdGhlIHVzZQorICogb2YgdGhlIENvcHJvY2Vzc29yIFR5cGUgKENUKSBhbmQgY29udGV4dCBzd2l0Y2hpbmcuIE9uIGEgc2VydmVyCisgKiBjbGFzcyBwcm9jZXNzb3IsIHRoZSBQSUQgcmVnaXN0ZXIgaXMgdXNlZCBvbmx5IGZvciBjb3Byb2Nlc3NvcgorICogbWFuYWdlbWVudCArICogYW5kIHNvIGEgY29wcm9jZXNzb3IgUElEIGlzIGFsbG9jYXRlZCBiZWZvcmUKKyAqIGV4ZWN1dGluZyBpY3N3eCArICogaW5zdHJ1Y3Rpb24uIERyb3BfY29wKCkgaXMgdXNlZCB0byBmcmVlIHRoZQorICogY29wcm9jZXNzb3IgUElELgorICoKKyAqIEV4YW1wbGU6CisgKiBIb3N0IEZhYnJpYyBJbnRlcmZhY2UgKEhGSSkgaXMgYSBQb3dlclBDIG5ldHdvcmsgY29wcm9jZXNzb3IuCisgKiBFYWNoIEhGSSBoYXZlIG11bHRpcGxlIHdpbmRvd3MuIEVhY2ggSEZJIHdpbmRvdyBzZXJ2ZXMgYXMgYQorICogbmV0d29yayBkZXZpY2Ugc2VuZGluZyB0byBhbmQgcmVjZWl2aW5nIGZyb20gSEZJIG5ldHdvcmsuCisgKiBIRkkgaW1tZWRpYXRlIHNlbmQgZnVuY3Rpb24gdXNlcyBpY3N3eCBpbnN0cnVjdGlvbi4gVGhlIGltbWVkaWF0ZQorICogc2VuZCBmdW5jdGlvbiBhbGxvd3Mgc21hbGwgKHNpbmdsZSBjYWNoZS1saW5lKSBwYWNrZXRzIGJlIHNlbnQKKyAqIHdpdGhvdXQgdXNpbmcgdGhlIHJlZ3VsYXIgSEZJIHNlbmQgRklGTyBhbmQgZG9vcmJlbGwsIHdoaWNoIGFyZQorICogbXVjaCBzbG93ZXIgdGhhbiBpbW1lZGlhdGUgc2VuZC4KKyAqCisgKiBGb3IgZWFjaCB0YXNrIGludGVuZGluZyB0byB1c2UgSEZJIGltbWVkaWF0ZSBzZW5kLCB0aGUgSEZJIGRyaXZlcgorICogY2FsbHMgdXNlX2NvcCgpIHRvIG9idGFpbiBhIGNvcHJvY2Vzc29yIFBJRCBmb3IgdGhlIHRhc2suCisgKiBUaGUgSEZJIGRyaXZlciB0aGVuIGFsbG9jYXRlIGEgZnJlZSBIRkkgd2luZG93IGFuZCBzYXZlIHRoZQorICogY29wcm9jZXNzb3IgUElEIHRvIHRoZSBIRkkgd2luZG93IHRvIGFsbG93IHRoZSB0YXNrIHRvIHVzZSB0aGUKKyAqIEhGSSB3aW5kb3cuCisgKgorICogVGhlIEhGSSBkcml2ZXIgcmVwZWF0ZWRseSBjcmVhdGVzIGltbWVkaWF0ZSBzZW5kIHBhY2tldHMgYW5kCisgKiBpc3N1ZXMgaWNzd3ggaW5zdHJ1Y3Rpb24gdG8gc2VuZCBkYXRhIHRocm91Z2ggdGhlIEhGSSB3aW5kb3cuCisgKiBUaGUgSEZJIGNvbXBhcmVzIHRoZSBjb3Byb2Nlc3NvciBQSUQgaW4gdGhlIENQVSBQSUQgcmVnaXN0ZXIKKyAqIHRvIHRoZSBQSUQgaGVsZCBpbiB0aGUgSEZJIHdpbmRvdyB0byBkZXRlcm1pbmUgaWYgdGhlIHRyYW5zYWN0aW9uCisgKiBpcyBhbGxvd2VkLgorICoKKyAqIFdoZW4gdGhlIHRhc2sgdG8gcmVsZWFzZSB0aGUgSEZJIHdpbmRvdywgdGhlIEhGSSBkcml2ZXIgY2FsbHMKKyAqIGRyb3BfY29wKCkgdG8gcmVsZWFzZSB0aGUgY29wcm9jZXNzb3IgUElELgorICovCisKK3ZvaWQgc3dpdGNoX2NvcChzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0KQoreworI2lmZGVmIENPTkZJR19JQ1NXWF9QSUQKKwltdHNwcihTUFJOX1BJRCwgbmV4dC0+Y29udGV4dC5jb3BfcGlkKTsKKyNlbmRpZgorCW10c3ByKFNQUk5fQUNPUCwgbmV4dC0+Y29udGV4dC5hY29wKTsKK30KKworLyoqCisgKiBTdGFydCB1c2luZyBhIGNvcHJvY2Vzc29yLgorICogQGFjb3A6IG1hc2sgb2YgY29wcm9jZXNzb3IgdG8gYmUgdXNlZC4KKyAqIEBtbTogVGhlIG1tIHRoZSBjb3Byb2Nlc3NvciB0byBhc3NvY2lhdGUgd2l0aC4gTW9zdCBsaWtlbHkgY3VycmVudCBtbS4KKyAqCisgKiBSZXR1cm4gYSBwb3NpdGl2ZSBQSUQgaWYgc3VjY2Vzc2Z1bC4gTmVnYXRpdmUgZXJybm8gb3RoZXJ3aXNlLgorICogVGhlIHJldHVybmVkIFBJRCB3aWxsIGJlIGZlZCB0byB0aGUgY29wcm9jZXNzb3IgdG8gZGV0ZXJtaW5lIGlmIGFuCisgKiBpY3N3eCB0cmFuc2FjdGlvbiBpcyBhdXRoZW50aWNhdGVkLgorICovCitpbnQgdXNlX2NvcCh1bnNpZ25lZCBsb25nIGFjb3AsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWludCByZXQ7CisKKwlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0lDU1dYKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIW1tIHx8ICFhY29wKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRoZSBwYWdlX3RhYmxlX2xvY2sgZW5zdXJlcyBtbV91c2VycyB3b24ndCBjaGFuZ2UgdW5kZXIgdXMgKi8KKwlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXNwaW5fbG9jayhtbS0+Y29udGV4dC5jb3BfbG9ja3ApOworCisJcmV0ID0gZ2V0X2NvcF9waWQobW0pOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCS8qIHVwZGF0ZSBhY29wICovCisJbW0tPmNvbnRleHQuYWNvcCB8PSBhY29wOworCisJc3luY19jb3AobW0pOworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgdGhyZWFkZWQgcHJvY2VzcyB0aGVuIHRoZXJlIG1pZ2h0IGJlIG90aGVyIHRocmVhZHMKKwkgKiBydW5uaW5nLiBXZSBuZWVkIHRvIHNlbmQgYW4gSVBJIHRvIGZvcmNlIHRoZW0gdG8gcGljayB1cCBhbnkKKwkgKiBjaGFuZ2UgaW4gUElEIGFuZCBBQ09QLgorCSAqLworCWlmIChhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA+IDEpCisJCXNtcF9jYWxsX2Z1bmN0aW9uKHN5bmNfY29wLCBtbSwgMSk7CisKK291dDoKKwlzcGluX3VubG9jayhtbS0+Y29udGV4dC5jb3BfbG9ja3ApOworCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1c2VfY29wKTsKKworLyoqCisgKiBTdG9wIHVzaW5nIGEgY29wcm9jZXNzb3IuCisgKiBAYWNvcDogbWFzayBvZiBjb3Byb2Nlc3NvciB0byBiZSBzdG9wcGVkLgorICogQG1tOiBUaGUgbW0gdGhlIGNvcHJvY2Vzc29yIGFzc29jaWF0ZWQgd2l0aC4KKyAqLwordm9pZCBkcm9wX2NvcCh1bnNpZ25lZCBsb25nIGFjb3AsIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWludCBmcmVlX3BpZDsKKworCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfSUNTV1gpKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTl9PTkNFKCFtbSkpCisJCXJldHVybjsKKworCS8qIFRoZSBwYWdlX3RhYmxlX2xvY2sgZW5zdXJlcyBtbV91c2VycyB3b24ndCBjaGFuZ2UgdW5kZXIgdXMgKi8KKwlzcGluX2xvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOworCXNwaW5fbG9jayhtbS0+Y29udGV4dC5jb3BfbG9ja3ApOworCisJbW0tPmNvbnRleHQuYWNvcCAmPSB+YWNvcDsKKworCWZyZWVfcGlkID0gZGlzYWJsZV9jb3BfcGlkKG1tKTsKKwlzeW5jX2NvcChtbSk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSB0aHJlYWRlZCBwcm9jZXNzIHRoZW4gdGhlcmUgbWlnaHQgYmUgb3RoZXIgdGhyZWFkcworCSAqIHJ1bm5pbmcuIFdlIG5lZWQgdG8gc2VuZCBhbiBJUEkgdG8gZm9yY2UgdGhlbSB0byBwaWNrIHVwIGFueQorCSAqIGNoYW5nZSBpbiBQSUQgYW5kIEFDT1AuCisJICovCisJaWYgKGF0b21pY19yZWFkKCZtbS0+bW1fdXNlcnMpID4gMSkKKwkJc21wX2NhbGxfZnVuY3Rpb24oc3luY19jb3AsIG1tLCAxKTsKKworCWlmIChmcmVlX3BpZCAhPSBDT1BfUElEX05PTkUpCisJCWZyZWVfY29wX3BpZChmcmVlX3BpZCk7CisKKwlzcGluX3VubG9jayhtbS0+Y29udGV4dC5jb3BfbG9ja3ApOworCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRyb3BfY29wKTsKKworc3RhdGljIGludCBhY29wX3VzZV9jb3AoaW50IGN0KQoreworCS8qIHRvZG8gKi8KKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBHZXQgdGhlIGluc3RydWN0aW9uIHdvcmQgYXQgdGhlIE5JUAorICovCitzdGF0aWMgdTMyIGFjb3BfZ2V0X2luc3Qoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIGluc3Q7CisJdTMyIF9fdXNlciAqcDsKKworCXAgPSAodTMyIF9fdXNlciAqKXJlZ3MtPm5pcDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgcCwgc2l6ZW9mKCpwKSkpCisJCXJldHVybiAwOworCisJaWYgKF9fZ2V0X3VzZXIoaW5zdCwgcCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIGluc3Q7Cit9CisKKy8qKgorICogQHJlZ3M6IHJlZ3NpdGVycyBhdCB0aW1lIG9mIGludGVycnVwdAorICogQGFkZHJlc3M6IHN0b3JhZ2UgYWRkcmVzcworICogQGVycm9yX2NvZGU6IEZhdWx0IGNvZGUsIHVzdWFsbHkgdGhlIERTSVNSIG9yIEVTUiBkZXBlbmRpbmcgb24KKyAqCQlwcm9jZXNzb3IgdHlwZQorICoKKyAqIFJldHVybiAwIGlmIHdlIGFyZSBhYmxlIHRvIHJlc29sdmUgdGhlIGRhdGEgc3RvcmFnZSBmYXVsdCB0aGF0CisgKiByZXN1bHRzIGZyb20gYSBDVCBtaXNzIGluIHRoZSBBQ09QIHJlZ2lzdGVyLgorICovCitpbnQgYWNvcF9oYW5kbGVfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywKKwkJICAgICAgdW5zaWduZWQgbG9uZyBlcnJvcl9jb2RlKQoreworCWludCBjdDsKKwl1MzIgaW5zdCA9IDA7CisKKwlpZiAoIWNwdV9oYXNfZmVhdHVyZShDUFVfRlRSX0lDU1dYKSkgeworCQlwcl9pbmZvKCJObyBjb3Byb2Nlc3NvcnMgYXZhaWxhYmxlIik7CisJCV9leGNlcHRpb24oU0lHSUxMLCByZWdzLCBJTExfSUxMT1BOLCBhZGRyZXNzKTsKKwl9CisKKwlpZiAoIXVzZXJfbW9kZShyZWdzKSkgeworCQkvKiB0aGlzIGNvdWxkIGhhcHBlbiBpZiB0aGUgSFYgZGVuaWVzIHRoZQorCQkgKiBrZXJuZWwgYWNjZXNzLCBmb3Igbm93IHdlIGp1c3QgZGllICovCisJCWRpZSgiSUNTV1ggZnJvbSBrZXJuZWwgZmFpbGVkIiwgcmVncywgU0lHU0VHVik7CisJfQorCisJLyogU29tZSBpbXBsZW1lbnRhdGlvbnMgbGVhdmUgdXMgYSBoaW50IGZvciB0aGUgQ1QgKi8KKwljdCA9IElDU1dYX0dFVF9DVF9ISU5UKGVycm9yX2NvZGUpOworCWlmIChjdCA8IDApIHsKKwkJLyogd2UgaGF2ZSB0byBwZWVrIGF0IHRoZSBpbnN0cnVjdGlvbiB3b3JkIHRvIGZpZ3VyZSBvdXQgQ1QgKi8KKwkJdTMyIGNjdzsKKwkJdTMyIHJzOworCisJCWluc3QgPSBhY29wX2dldF9pbnN0KHJlZ3MpOworCQlpZiAoaW5zdCA9PSAwKQorCQkJcmV0dXJuIC0xOworCisJCXJzID0gKGluc3QgPj4gKDMxIC0gMTApKSAmIDB4MWY7CisJCWNjdyA9IHJlZ3MtPmdwcltyc107CisJCWN0ID0gKGNjdyA+PiAxNikgJiAweDNmOworCX0KKworCWlmICghYWNvcF91c2VfY29wKGN0KSkKKwkJcmV0dXJuIDA7CisKKwkvKiBhdCB0aGlzIHBvaW50IHRoZSBDVCBpcyB1bmtub3duIHRvIHRoZSBzeXN0ZW0gKi8KKwlwcl93YXJuKCIlc1slZF06IENvcHJvY2Vzc29yICVkIGlzIHVuYXZhaWxhYmxlIiwKKwkJY3VycmVudC0+Y29tbSwgY3VycmVudC0+cGlkLCBjdCk7CisKKwkvKiBnZXQgaW5zdCBpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgaXQgKi8KKwlpZiAoaW5zdCA9PSAwKSB7CisJCWluc3QgPSBhY29wX2dldF9pbnN0KHJlZ3MpOworCQlpZiAoaW5zdCA9PSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIENoZWNrIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyB0aGUgInJlY29yZCBmb3JtIiAqLworCWlmIChpbnN0ICYgMSkgeworCQkvKgorCQkgKiB0aGUgaW5zdHJ1Y3Rpb24gaXMgInJlY29yZCIgZm9ybSBzbyB3ZSBjYW4gcmVqZWN0CisJCSAqIHVzaW5nIENSMAorCQkgKi8KKwkJcmVncy0+Y2NyICY9IH4oMHhmdWwgPDwgMjgpOworCQlyZWdzLT5jY3IgfD0gSUNTV1hfUkNfTk9UX0ZPVU5EIDw8IDI4OworCisJCS8qIE1vdmUgb24gdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gKi8KKwkJcmVncy0+bmlwICs9IDQ7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhlcmUgaXMgbm8gYXJjaGl0ZWN0ZWQgbWVjaGFuaXNtIHRvIHJlcG9ydCBhIGJhZAorCQkgKiBDVCBzbyB3ZSBjb3VsZCBlaXRoZXIgU0lHSUxMIG9yIHJlcG9ydCBub3RoaW5nLgorCQkgKiBTaW5jZSB0aGUgbm9uLXJlY29yZCB2ZXJzaW9uIHNob3VsZCBvbmx5IGJ1IHVzZWQKKwkJICogZm9yICJoaW50cyIgb3IgImRvbid0IGNhcmUiIHdlIHNob3VsZCBwcm9iYWJseSBkbworCQkgKiBub3RoaW5nLiAgSG93ZXZlciwgSSBjb3VsZCBzZWUgaG93IHNvbWUgcGVvcGxlCisJCSAqIG1pZ2h0IHdhbnQgYW4gU0lHSUxMIHNvIGl0IGhlcmUgaWYgeW91IHdhbnQgaXQuCisJCSAqLworI2lmZGVmIENPTkZJR19QUENfSUNTV1hfVVNFX1NJR0lMTAorCQlfZXhjZXB0aW9uKFNJR0lMTCwgcmVncywgSUxMX0lMTE9QTiwgYWRkcmVzcyk7CisjZWxzZQorCQlyZWdzLT5uaXAgKz0gNDsKKyNlbmRpZgorCX0KKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWNvcF9oYW5kbGVfZmF1bHQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ljc3d4LmggYi9hcmNoL3Bvd2VycGMvbW0vaWNzd3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjE3NmJkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL21tL2ljc3d4LmgKQEAgLTAsMCArMSw2MiBAQAorI2lmbmRlZiBfQVJDSF9QT1dFUlBDX01NX0lDU1dYX0hfCisjZGVmaW5lIF9BUkNIX1BPV0VSUENfTU1fSUNTV1hfSF8KKworLyoKKyAqICBJQ1NXWCBhbmQgQUNPUCBNYW5hZ2VtZW50CisgKgorICogIENvcHlyaWdodCAoQykgMjAxMSBBbnRvbiBCbGFuY2hhcmQsIElCTSBDb3JwLiA8YW50b25Ac2FtYmEub3JnPgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisKKy8qIGFsc28gdXNlZCB0byBkZW5vdGUgdGhhdCBQSURzIGFyZSBub3QgdXNlZCAqLworI2RlZmluZSBDT1BfUElEX05PTkUgMAorCitzdGF0aWMgaW5saW5lIHZvaWQgc3luY19jb3Aodm9pZCAqYXJnKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gYXJnOworCisJaWYgKG1tID09IGN1cnJlbnQtPmFjdGl2ZV9tbSkKKwkJc3dpdGNoX2NvcChjdXJyZW50LT5hY3RpdmVfbW0pOworfQorCisjaWZkZWYgQ09ORklHX1BQQ19JQ1NXWF9QSUQKK2V4dGVybiBpbnQgZ2V0X2NvcF9waWQoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIGludCBkaXNhYmxlX2NvcF9waWQoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIHZvaWQgZnJlZV9jb3BfcGlkKGludCBmcmVlX3BpZCk7CisjZWxzZQorI2RlZmluZSBnZXRfY29wX3BpZChtKSAoQ09QX1BJRF9OT05FKQorI2RlZmluZSBkaXNhYmxlX2NvcF9waWQobSkgKENPUF9QSURfTk9ORSkKKyNkZWZpbmUgZnJlZV9jb3BfcGlkKHApCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGFyZSBpbXBsZW1lbnRhdGlvbiBiaXRzIGZvciBhcmNoaXRlY3RlZCByZWdpc3RlcnMuICBJZiB0aGlzCisgKiBldmVyIGJlY29tZXMgYXJjaGl0ZWN0dXJlIHRoZSBzaG91bGQgYmUgbW92ZWQgdG8gcmVnLmggZXQuIGFsLgorICovCisvKiBVQ1QgaXMgdGhlIHNhbWUgYml0IGZvciBTZXJ2ZXIgYW5kIEVtYmVkZGVkICovCisjZGVmaW5lIElDU1dYX0RTSV9VQ1QJCTB4MDAwMDQwMDAgIC8qIFVuYXZhaWxhYmxlIENvcHJvY2Vzc29yIFR5cGUgKi8KKworI2lmZGVmIENPTkZJR19QUENfQk9PSzNFCisvKiBFbWJlZGRlZCBpbXBsZW1lbnRhdGlvbiBnaXZlcyB1cyBubyBoaW50cyBhcyB0byB3aGF0IHRoZSBDVCBpcyAqLworI2RlZmluZSBJQ1NXWF9HRVRfQ1RfSElOVCh4KSAoLTEpCisjZWxzZQorLyogU2VydmVyIGltcGxlbWVudGF0aW9uIGNvbnRhaW5zIHRoZSBDVCB2YWx1ZSBpbiB0aGUgRFNJU1IgKi8KKyNkZWZpbmUgSUNTV1hfRFNJU1JfQ1RNQVNLCTB4MDAwMDNmMDAKKyNkZWZpbmUgSUNTV1hfR0VUX0NUX0hJTlQoeCkJKCgoeCkgJiBJQ1NXWF9EU0lTUl9DVE1BU0spID4+IDgpCisjZW5kaWYKKworI2RlZmluZSBJQ1NXWF9SQ19TVEFSVEVECTB4OAkvKiBUaGUgcmVxdWVzdCBoYXMgYmVlbiBzdGFydGVkICovCisjZGVmaW5lIElDU1dYX1JDX05PVF9JRExFCTB4NAkvKiBObyBjb3Byb2Nlc3NvciBmb3VuZCBpZGxlICovCisjZGVmaW5lIElDU1dYX1JDX05PVF9GT1VORAkweDIJLyogTm8gY29wcm9jZXNzb3IgZm91bmQgKi8KKyNkZWZpbmUgSUNTV1hfUkNfVU5ERUZJTkVECTB4MQkvKiBSZXNlcnZlZCAqLworCitleHRlcm4gaW50IGFjb3BfaGFuZGxlX2ZhdWx0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgZXJyb3JfY29kZSk7CisjZW5kaWYgLyogIV9BUkNIX1BPV0VSUENfTU1fSUNTV1hfSF8gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9pY3N3eF9waWQuYyBiL2FyY2gvcG93ZXJwYy9tbS9pY3N3eF9waWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWUzMGViCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL21tL2ljc3d4X3BpZC5jCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiAgSUNTV1ggYW5kIEFDT1AvUElEIE1hbmFnZW1lbnQKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDExIEFudG9uIEJsYW5jaGFyZCwgSUJNIENvcnAuIDxhbnRvbkBzYW1iYS5vcmc+CisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaWRyLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSAiaWNzd3guaCIKKworI2RlZmluZSBDT1BfUElEX01JTiAoQ09QX1BJRF9OT05FICsgMSkKKyNkZWZpbmUgQ09QX1BJRF9NQVggKDB4RkZGRikKKworc3RhdGljIERFRklORV9TUElOTE9DSyhtbXVfY29udGV4dF9hY29wX2xvY2spOworc3RhdGljIERFRklORV9JREEoY29wX2lkYSk7CisKK3N0YXRpYyBpbnQgbmV3X2NvcF9waWQoc3RydWN0IGlkYSAqaWRhLCBpbnQgbWluX2lkLCBpbnQgbWF4X2lkLAorCQkgICAgICAgc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlpbnQgaW5kZXg7CisJaW50IGVycjsKKworYWdhaW46CisJaWYgKCFpZGFfcHJlX2dldChpZGEsIEdGUF9LRVJORUwpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9jayhsb2NrKTsKKwllcnIgPSBpZGFfZ2V0X25ld19hYm92ZShpZGEsIG1pbl9pZCwgJmluZGV4KTsKKwlzcGluX3VubG9jayhsb2NrKTsKKworCWlmIChlcnIgPT0gLUVBR0FJTikKKwkJZ290byBhZ2FpbjsKKwllbHNlIGlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAoaW5kZXggPiBtYXhfaWQpIHsKKwkJc3Bpbl9sb2NrKGxvY2spOworCQlpZGFfcmVtb3ZlKGlkYSwgaW5kZXgpOworCQlzcGluX3VubG9jayhsb2NrKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIGluZGV4OworfQorCitpbnQgZ2V0X2NvcF9waWQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7CisJaW50IHBpZDsKKworCWlmIChtbS0+Y29udGV4dC5jb3BfcGlkID09IENPUF9QSURfTk9ORSkgeworCQlwaWQgPSBuZXdfY29wX3BpZCgmY29wX2lkYSwgQ09QX1BJRF9NSU4sIENPUF9QSURfTUFYLAorCQkJCSAgJm1tdV9jb250ZXh0X2Fjb3BfbG9jayk7CisJCWlmIChwaWQgPj0gMCkKKwkJCW1tLT5jb250ZXh0LmNvcF9waWQgPSBwaWQ7CisJfQorCXJldHVybiBtbS0+Y29udGV4dC5jb3BfcGlkOworfQorCitpbnQgZGlzYWJsZV9jb3BfcGlkKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQoreworCWludCBmcmVlX3BpZCA9IENPUF9QSURfTk9ORTsKKworCWlmICgoIW1tLT5jb250ZXh0LmFjb3ApICYmIChtbS0+Y29udGV4dC5jb3BfcGlkICE9IENPUF9QSURfTk9ORSkpIHsKKwkJZnJlZV9waWQgPSBtbS0+Y29udGV4dC5jb3BfcGlkOworCQltbS0+Y29udGV4dC5jb3BfcGlkID0gQ09QX1BJRF9OT05FOworCX0KKwlyZXR1cm4gZnJlZV9waWQ7Cit9CisKK3ZvaWQgZnJlZV9jb3BfcGlkKGludCBmcmVlX3BpZCkKK3sKKwlzcGluX2xvY2soJm1tdV9jb250ZXh0X2Fjb3BfbG9jayk7CisJaWRhX3JlbW92ZSgmY29wX2lkYSwgZnJlZV9waWQpOworCXNwaW5fdW5sb2NrKCZtbXVfY29udGV4dF9hY29wX2xvY2spOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYyBiL2FyY2gvcG93ZXJwYy9tbS9pbml0XzMyLmMKaW5kZXggMTYxY2VmZC4uNjE1N2JlMiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL2luaXRfMzIuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vaW5pdF8zMi5jCkBAIC02NSw2ICs2NSwxMyBAQAogRVhQT1JUX1NZTUJPTChtZW1zdGFydF9hZGRyKTsKIHBoeXNfYWRkcl90IGtlcm5zdGFydF9hZGRyOwogRVhQT1JUX1NZTUJPTChrZXJuc3RhcnRfYWRkcik7CisKKyNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEVfUFBDMzIKKy8qIFVzZWQgaW4gX192YSgpL19fcGEoKSAqLworbG9uZyBsb25nIHZpcnRfcGh5c19vZmZzZXQ7CitFWFBPUlRfU1lNQk9MKHZpcnRfcGh5c19vZmZzZXQpOworI2VuZGlmCisKIHBoeXNfYWRkcl90IGxvd21lbV9lbmRfYWRkcjsKIAogaW50IGJvb3RfbWFwc2l6ZTsKQEAgLTEzNCw4ICsxNDEsNyBAQAogCiAJaWYgKG1lbWJsb2NrLm1lbW9yeS5jbnQgPiAxKSB7CiAjaWZuZGVmIENPTkZJR19XSUkKLQkJbWVtYmxvY2subWVtb3J5LmNudCA9IDE7Ci0JCW1lbWJsb2NrX2FuYWx5emUoKTsKKwkJbWVtYmxvY2tfZW5mb3JjZV9tZW1vcnlfbGltaXQobWVtYmxvY2subWVtb3J5LnJlZ2lvbnNbMF0uc2l6ZSk7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk9ubHkgdXNpbmcgZmlyc3QgY29udGlndW91cyBtZW1vcnkgcmVnaW9uIik7CiAjZWxzZQogCQl3aWlfbWVtb3J5X2ZpeHVwcygpOwpAQCAtMTU4LDcgKzE2NCw2IEBACiAjaWZuZGVmIENPTkZJR19ISUdITUVNCiAJCXRvdGFsX21lbW9yeSA9IHRvdGFsX2xvd21lbTsKIAkJbWVtYmxvY2tfZW5mb3JjZV9tZW1vcnlfbGltaXQodG90YWxfbG93bWVtKTsKLQkJbWVtYmxvY2tfYW5hbHl6ZSgpOwogI2VuZGlmIC8qIENPTkZJR19ISUdITUVNICovCiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbWVtLmMgYi9hcmNoL3Bvd2VycGMvbW0vbWVtLmMKaW5kZXggMmRkNmJkZC4uZDk3NGI3OSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21lbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tZW0uYwpAQCAtNTEsNiArNTEsNyBAQAogI2luY2x1ZGUgPGFzbS92ZHNvLmg+CiAjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgogI2luY2x1ZGUgPGFzbS9zd2lvdGxiLmg+CisjaW5jbHVkZSA8YXNtL3J0YXMuaD4KIAogI2luY2x1ZGUgIm1tdV9kZWNsLmgiCiAKQEAgLTE5OSw3ICsyMDAsNyBAQAogCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKIAkJc3RhcnRfcGZuID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9iYXNlX3BmbihyZWcpOwogCQllbmRfcGZuID0gbWVtYmxvY2tfcmVnaW9uX21lbW9yeV9lbmRfcGZuKHJlZyk7Ci0JCWFkZF9hY3RpdmVfcmFuZ2UoMCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKKwkJbWVtYmxvY2tfc2V0X25vZGUoMCwgKHBoeXNfYWRkcl90KVVMTE9OR19NQVgsIDApOwogCX0KIAogCS8qIEFkZCBhbGwgcGh5c2ljYWwgbWVtb3J5IHRvIHRoZSBib290bWVtIG1hcCwgbWFyayBlYWNoIGFyZWEKQEAgLTU1Myw3ICs1NTQsNyBAQAogI2lmIChkZWZpbmVkKENPTkZJR19QUENfQk9PSzNFXzY0KSB8fCBkZWZpbmVkKENPTkZJR19QUENfRlNMX0JPT0szRSkpIFwKIAkmJiBkZWZpbmVkKENPTkZJR19IVUdFVExCX1BBR0UpCiAJaWYgKGlzX3ZtX2h1Z2V0bGJfcGFnZSh2bWEpKQotCQlib29rM2VfaHVnZXRsYl9wcmVsb2FkKHZtYS0+dm1fbW0sIGFkZHJlc3MsICpwdGVwKTsKKwkJYm9vazNlX2h1Z2V0bGJfcHJlbG9hZCh2bWEsIGFkZHJlc3MsICpwdGVwKTsKICNlbmRpZgogfQogCkBAIC01ODUsMyArNTg2LDIzIEBACiAJcmV0dXJuIDA7CiB9CiBzdWJzeXNfaW5pdGNhbGwoYWRkX3N5c3RlbV9yYW1fcmVzb3VyY2VzKTsKKworI2lmZGVmIENPTkZJR19TVFJJQ1RfREVWTUVNCisvKgorICogZGV2bWVtX2lzX2FsbG93ZWQoKTogY2hlY2sgdG8gc2VlIGlmIC9kZXYvbWVtIGFjY2VzcyB0byBhIGNlcnRhaW4gYWRkcmVzcworICogaXMgdmFsaWQuIFRoZSBhcmd1bWVudCBpcyBhIHBoeXNpY2FsIHBhZ2UgbnVtYmVyLgorICoKKyAqIEFjY2VzcyBoYXMgdG8gYmUgZ2l2ZW4gdG8gbm9uLWtlcm5lbC1yYW0gYXJlYXMgYXMgd2VsbCwgdGhlc2UgY29udGFpbiB0aGUKKyAqIFBDSSBtbWlvIHJlc291cmNlcyBhcyB3ZWxsIGFzIHBvdGVudGlhbCBiaW9zL2FjcGkgZGF0YSByZWdpb25zLgorICovCitpbnQgZGV2bWVtX2lzX2FsbG93ZWQodW5zaWduZWQgbG9uZyBwZm4pCit7CisJaWYgKGlvbWVtX2lzX2V4Y2x1c2l2ZShwZm4gPDwgUEFHRV9TSElGVCkpCisJCXJldHVybiAwOworCWlmICghcGFnZV9pc19yYW0ocGZuKSkKKwkJcmV0dXJuIDE7CisJaWYgKHBhZ2VfaXNfcnRhc191c2VyX2J1ZihwZm4pKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfU1RSSUNUX0RFVk1FTSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL21tYXBfNjQuYyBiL2FyY2gvcG93ZXJwYy9tbS9tbWFwXzY0LmMKaW5kZXggNWE3ODNkOC4uNjdhNDJlZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21tYXBfNjQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vbW1hcF82NC5jCkBAIC01MywxNCArNTMsNiBAQAogCXJldHVybiBzeXNjdGxfbGVnYWN5X3ZhX2xheW91dDsKIH0KIAotLyoKLSAqIFNpbmNlIGdldF9yYW5kb21faW50KCkgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSB3aXRoaW4gYSAxIGppZmZ5IHdpbmRvdywKLSAqIHdlIHdpbGwgYWxtb3N0IGFsd2F5cyBnZXQgdGhlIHNhbWUgcmFuZG9taXNhdGlvbiBmb3IgdGhlIHN0YWNrIGFuZCBtbWFwCi0gKiByZWdpb24uIFRoaXMgd2lsbCBtZWFuIHRoZSByZWxhdGl2ZSBkaXN0YW5jZSBiZXR3ZWVuIHN0YWNrIGFuZCBtbWFwIHdpbGwKLSAqIGJlIHRoZSBzYW1lLgotICoKLSAqIFRvIGF2b2lkIHRoaXMgd2UgY2FuIHNoaWZ0IHRoZSByYW5kb21uZXNzIGJ5IDEgYml0LgotICovCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBtbWFwX3JuZCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgcm5kID0gMDsKQEAgLTY4LDExICs2MCwxMSBAQAogCWlmIChjdXJyZW50LT5mbGFncyAmIFBGX1JBTkRPTUlaRSkgewogCQkvKiA4TUIgZm9yIDMyYml0LCAxR0IgZm9yIDY0Yml0ICovCiAJCWlmIChpc18zMmJpdF90YXNrKCkpCi0JCQlybmQgPSAobG9uZykoZ2V0X3JhbmRvbV9pbnQoKSAlICgxPDwoMjItUEFHRV9TSElGVCkpKTsKKwkJCXJuZCA9IChsb25nKShnZXRfcmFuZG9tX2ludCgpICUgKDE8PCgyMy1QQUdFX1NISUZUKSkpOwogCQllbHNlCi0JCQlybmQgPSAobG9uZykoZ2V0X3JhbmRvbV9pbnQoKSAlICgxPDwoMjktUEFHRV9TSElGVCkpKTsKKwkJCXJuZCA9IChsb25nKShnZXRfcmFuZG9tX2ludCgpICUgKDE8PCgzMC1QQUdFX1NISUZUKSkpOwogCX0KLQlyZXR1cm4gKHJuZCA8PCBQQUdFX1NISUZUKSAqIDI7CisJcmV0dXJuIHJuZCA8PCBQQUdFX1NISUZUOwogfQogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbW1hcF9iYXNlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfaGFzaDY0LmMgYi9hcmNoL3Bvd2VycGMvbW0vbW11X2NvbnRleHRfaGFzaDY0LmMKaW5kZXggY2E5ODhhMy4uNDA2NzdhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL21tdV9jb250ZXh0X2hhc2g2NC5jCisrKyBiL2FyY2gvcG93ZXJwYy9tbS9tbXVfY29udGV4dF9oYXNoNjQuYwpAQCAtMjQsMjAwICsyNCw3IEBACiAKICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KIAotI2lmZGVmIENPTkZJR19QUENfSUNTV1gKLS8qCi0gKiBUaGUgcHJvY2Vzc29yIGFuZCBpdHMgTDIgY2FjaGUgY2F1c2UgdGhlIGljc3d4IGluc3RydWN0aW9uIHRvCi0gKiBnZW5lcmF0ZSBhIENPUF9SRVEgdHJhbnNhY3Rpb24gb24gUG93ZXJCdXMuIFRoZSB0cmFuc2FjdGlvbiBoYXMKLSAqIG5vIGFkZHJlc3MsIGFuZCB0aGUgcHJvY2Vzc29yIGRvZXMgbm90IHBlcmZvcm0gYW4gTU1VIGFjY2VzcwotICogdG8gYXV0aGVudGljYXRlIHRoZSB0cmFuc2FjdGlvbi4gVGhlIGNvbW1hbmQgcG9ydGlvbiBvZiB0aGUKLSAqIFBvd2VyQnVzIENPUF9SRVEgdHJhbnNhY3Rpb24gaW5jbHVkZXMgdGhlIExQQVJfSUQgKExQSUQpIGFuZAotICogdGhlIGNvcHJvY2Vzc29yIFByb2Nlc3MgSUQgKFBJRCksIHdoaWNoIHRoZSBjb3Byb2Nlc3NvciBjb21wYXJlcwotICogdG8gdGhlIGF1dGhvcml6ZWQgTFBJRCBhbmQgUElEIGhlbGQgaW4gdGhlIGNvcHJvY2Vzc29yLCB0byBkZXRlcm1pbmUKLSAqIGlmIHRoZSBwcm9jZXNzIGlzIGF1dGhvcml6ZWQgdG8gZ2VuZXJhdGUgdGhlIHRyYW5zYWN0aW9uLgotICogVGhlIGRhdGEgb2YgdGhlIENPUF9SRVEgdHJhbnNhY3Rpb24gaXMgMTI4LWJ5dGUgb3IgbGVzcyBhbmQgaXMKLSAqIHBsYWNlZCBpbiBjYWNoZWFibGUgbWVtb3J5IG9uIGEgMTI4LWJ5dGUgY2FjaGUgbGluZSBib3VuZGFyeS4KLSAqCi0gKiBUaGUgdGFzayB0byB1c2UgYSBjb3Byb2Nlc3NvciBzaG91bGQgdXNlIHVzZV9jb3AoKSB0byBhbGxvY2F0ZQotICogYSBjb3Byb2Nlc3NvciBQSUQgYmVmb3JlIGV4ZWN1dGluZyBpY3N3eCBpbnN0cnVjdGlvbi4gdXNlX2NvcCgpCi0gKiBhbHNvIGVuYWJsZXMgdGhlIGNvcHJvY2Vzc29yIGNvbnRleHQgc3dpdGNoaW5nLiBEcm9wX2NvcCgpIGlzCi0gKiB1c2VkIHRvIGZyZWUgdGhlIGNvcHJvY2Vzc29yIFBJRC4KLSAqCi0gKiBFeGFtcGxlOgotICogSG9zdCBGYWJyaWMgSW50ZXJmYWNlIChIRkkpIGlzIGEgUG93ZXJQQyBuZXR3b3JrIGNvcHJvY2Vzc29yLgotICogRWFjaCBIRkkgaGF2ZSBtdWx0aXBsZSB3aW5kb3dzLiBFYWNoIEhGSSB3aW5kb3cgc2VydmVzIGFzIGEKLSAqIG5ldHdvcmsgZGV2aWNlIHNlbmRpbmcgdG8gYW5kIHJlY2VpdmluZyBmcm9tIEhGSSBuZXR3b3JrLgotICogSEZJIGltbWVkaWF0ZSBzZW5kIGZ1bmN0aW9uIHVzZXMgaWNzd3ggaW5zdHJ1Y3Rpb24uIFRoZSBpbW1lZGlhdGUKLSAqIHNlbmQgZnVuY3Rpb24gYWxsb3dzIHNtYWxsIChzaW5nbGUgY2FjaGUtbGluZSkgcGFja2V0cyBiZSBzZW50Ci0gKiB3aXRob3V0IHVzaW5nIHRoZSByZWd1bGFyIEhGSSBzZW5kIEZJRk8gYW5kIGRvb3JiZWxsLCB3aGljaCBhcmUKLSAqIG11Y2ggc2xvd2VyIHRoYW4gaW1tZWRpYXRlIHNlbmQuCi0gKgotICogRm9yIGVhY2ggdGFzayBpbnRlbmRpbmcgdG8gdXNlIEhGSSBpbW1lZGlhdGUgc2VuZCwgdGhlIEhGSSBkcml2ZXIKLSAqIGNhbGxzIHVzZV9jb3AoKSB0byBvYnRhaW4gYSBjb3Byb2Nlc3NvciBQSUQgZm9yIHRoZSB0YXNrLgotICogVGhlIEhGSSBkcml2ZXIgdGhlbiBhbGxvY2F0ZSBhIGZyZWUgSEZJIHdpbmRvdyBhbmQgc2F2ZSB0aGUKLSAqIGNvcHJvY2Vzc29yIFBJRCB0byB0aGUgSEZJIHdpbmRvdyB0byBhbGxvdyB0aGUgdGFzayB0byB1c2UgdGhlCi0gKiBIRkkgd2luZG93LgotICoKLSAqIFRoZSBIRkkgZHJpdmVyIHJlcGVhdGVkbHkgY3JlYXRlcyBpbW1lZGlhdGUgc2VuZCBwYWNrZXRzIGFuZAotICogaXNzdWVzIGljc3d4IGluc3RydWN0aW9uIHRvIHNlbmQgZGF0YSB0aHJvdWdoIHRoZSBIRkkgd2luZG93LgotICogVGhlIEhGSSBjb21wYXJlcyB0aGUgY29wcm9jZXNzb3IgUElEIGluIHRoZSBDUFUgUElEIHJlZ2lzdGVyCi0gKiB0byB0aGUgUElEIGhlbGQgaW4gdGhlIEhGSSB3aW5kb3cgdG8gZGV0ZXJtaW5lIGlmIHRoZSB0cmFuc2FjdGlvbgotICogaXMgYWxsb3dlZC4KLSAqCi0gKiBXaGVuIHRoZSB0YXNrIHRvIHJlbGVhc2UgdGhlIEhGSSB3aW5kb3csIHRoZSBIRkkgZHJpdmVyIGNhbGxzCi0gKiBkcm9wX2NvcCgpIHRvIHJlbGVhc2UgdGhlIGNvcHJvY2Vzc29yIFBJRC4KLSAqLwotCi0jZGVmaW5lIENPUF9QSURfTk9ORSAwCi0jZGVmaW5lIENPUF9QSURfTUlOIChDT1BfUElEX05PTkUgKyAxKQotI2RlZmluZSBDT1BfUElEX01BWCAoMHhGRkZGKQotCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1tdV9jb250ZXh0X2Fjb3BfbG9jayk7Ci1zdGF0aWMgREVGSU5FX0lEQShjb3BfaWRhKTsKLQotdm9pZCBzd2l0Y2hfY29wKHN0cnVjdCBtbV9zdHJ1Y3QgKm5leHQpCi17Ci0JbXRzcHIoU1BSTl9QSUQsIG5leHQtPmNvbnRleHQuY29wX3BpZCk7Ci0JbXRzcHIoU1BSTl9BQ09QLCBuZXh0LT5jb250ZXh0LmFjb3ApOwotfQotCi1zdGF0aWMgaW50IG5ld19jb3BfcGlkKHN0cnVjdCBpZGEgKmlkYSwgaW50IG1pbl9pZCwgaW50IG1heF9pZCwKLQkJICAgICAgIHNwaW5sb2NrX3QgKmxvY2spCi17Ci0JaW50IGluZGV4OwotCWludCBlcnI7Ci0KLWFnYWluOgotCWlmICghaWRhX3ByZV9nZXQoaWRhLCBHRlBfS0VSTkVMKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlzcGluX2xvY2sobG9jayk7Ci0JZXJyID0gaWRhX2dldF9uZXdfYWJvdmUoaWRhLCBtaW5faWQsICZpbmRleCk7Ci0Jc3Bpbl91bmxvY2sobG9jayk7Ci0KLQlpZiAoZXJyID09IC1FQUdBSU4pCi0JCWdvdG8gYWdhaW47Ci0JZWxzZSBpZiAoZXJyKQotCQlyZXR1cm4gZXJyOwotCi0JaWYgKGluZGV4ID4gbWF4X2lkKSB7Ci0JCXNwaW5fbG9jayhsb2NrKTsKLQkJaWRhX3JlbW92ZShpZGEsIGluZGV4KTsKLQkJc3Bpbl91bmxvY2sobG9jayk7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXJldHVybiBpbmRleDsKLX0KLQotc3RhdGljIHZvaWQgc3luY19jb3Aodm9pZCAqYXJnKQotewotCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gYXJnOwotCi0JaWYgKG1tID09IGN1cnJlbnQtPmFjdGl2ZV9tbSkKLQkJc3dpdGNoX2NvcChjdXJyZW50LT5hY3RpdmVfbW0pOwotfQotCi0vKioKLSAqIFN0YXJ0IHVzaW5nIGEgY29wcm9jZXNzb3IuCi0gKiBAYWNvcDogbWFzayBvZiBjb3Byb2Nlc3NvciB0byBiZSB1c2VkLgotICogQG1tOiBUaGUgbW0gdGhlIGNvcHJvY2Vzc29yIHRvIGFzc29jaWF0ZSB3aXRoLiBNb3N0IGxpa2VseSBjdXJyZW50IG1tLgotICoKLSAqIFJldHVybiBhIHBvc2l0aXZlIFBJRCBpZiBzdWNjZXNzZnVsLiBOZWdhdGl2ZSBlcnJubyBvdGhlcndpc2UuCi0gKiBUaGUgcmV0dXJuZWQgUElEIHdpbGwgYmUgZmVkIHRvIHRoZSBjb3Byb2Nlc3NvciB0byBkZXRlcm1pbmUgaWYgYW4KLSAqIGljc3d4IHRyYW5zYWN0aW9uIGlzIGF1dGhlbnRpY2F0ZWQuCi0gKi8KLWludCB1c2VfY29wKHVuc2lnbmVkIGxvbmcgYWNvcCwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JaW50IHJldDsKLQotCWlmICghY3B1X2hhc19mZWF0dXJlKENQVV9GVFJfSUNTV1gpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCWlmICghbW0gfHwgIWFjb3ApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogVGhlIHBhZ2VfdGFibGVfbG9jayBlbnN1cmVzIG1tX3VzZXJzIHdvbid0IGNoYW5nZSB1bmRlciB1cyAqLwotCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7Ci0Jc3Bpbl9sb2NrKG1tLT5jb250ZXh0LmNvcF9sb2NrcCk7Ci0KLQlpZiAobW0tPmNvbnRleHQuY29wX3BpZCA9PSBDT1BfUElEX05PTkUpIHsKLQkJcmV0ID0gbmV3X2NvcF9waWQoJmNvcF9pZGEsIENPUF9QSURfTUlOLCBDT1BfUElEX01BWCwKLQkJCQkgICZtbXVfY29udGV4dF9hY29wX2xvY2spOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCW1tLT5jb250ZXh0LmNvcF9waWQgPSByZXQ7Ci0JfQotCW1tLT5jb250ZXh0LmFjb3AgfD0gYWNvcDsKLQotCXN5bmNfY29wKG1tKTsKLQotCS8qCi0JICogSWYgdGhpcyBpcyBhIHRocmVhZGVkIHByb2Nlc3MgdGhlbiB0aGVyZSBtaWdodCBiZSBvdGhlciB0aHJlYWRzCi0JICogcnVubmluZy4gV2UgbmVlZCB0byBzZW5kIGFuIElQSSB0byBmb3JjZSB0aGVtIHRvIHBpY2sgdXAgYW55Ci0JICogY2hhbmdlIGluIFBJRCBhbmQgQUNPUC4KLQkgKi8KLQlpZiAoYXRvbWljX3JlYWQoJm1tLT5tbV91c2VycykgPiAxKQotCQlzbXBfY2FsbF9mdW5jdGlvbihzeW5jX2NvcCwgbW0sIDEpOwotCi0JcmV0ID0gbW0tPmNvbnRleHQuY29wX3BpZDsKLQotb3V0OgotCXNwaW5fdW5sb2NrKG1tLT5jb250ZXh0LmNvcF9sb2NrcCk7Ci0Jc3Bpbl91bmxvY2soJm1tLT5wYWdlX3RhYmxlX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHVzZV9jb3ApOwotCi0vKioKLSAqIFN0b3AgdXNpbmcgYSBjb3Byb2Nlc3Nvci4KLSAqIEBhY29wOiBtYXNrIG9mIGNvcHJvY2Vzc29yIHRvIGJlIHN0b3BwZWQuCi0gKiBAbW06IFRoZSBtbSB0aGUgY29wcm9jZXNzb3IgYXNzb2NpYXRlZCB3aXRoLgotICovCi12b2lkIGRyb3BfY29wKHVuc2lnbmVkIGxvbmcgYWNvcCwgc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JaW50IGZyZWVfcGlkID0gQ09QX1BJRF9OT05FOwotCi0JaWYgKCFjcHVfaGFzX2ZlYXR1cmUoQ1BVX0ZUUl9JQ1NXWCkpCi0JCXJldHVybjsKLQotCWlmIChXQVJOX09OX09OQ0UoIW1tKSkKLQkJcmV0dXJuOwotCi0JLyogVGhlIHBhZ2VfdGFibGVfbG9jayBlbnN1cmVzIG1tX3VzZXJzIHdvbid0IGNoYW5nZSB1bmRlciB1cyAqLwotCXNwaW5fbG9jaygmbW0tPnBhZ2VfdGFibGVfbG9jayk7Ci0Jc3Bpbl9sb2NrKG1tLT5jb250ZXh0LmNvcF9sb2NrcCk7Ci0KLQltbS0+Y29udGV4dC5hY29wICY9IH5hY29wOwotCi0JaWYgKCghbW0tPmNvbnRleHQuYWNvcCkgJiYgKG1tLT5jb250ZXh0LmNvcF9waWQgIT0gQ09QX1BJRF9OT05FKSkgewotCQlmcmVlX3BpZCA9IG1tLT5jb250ZXh0LmNvcF9waWQ7Ci0JCW1tLT5jb250ZXh0LmNvcF9waWQgPSBDT1BfUElEX05PTkU7Ci0JfQotCi0Jc3luY19jb3AobW0pOwotCi0JLyoKLQkgKiBJZiB0aGlzIGlzIGEgdGhyZWFkZWQgcHJvY2VzcyB0aGVuIHRoZXJlIG1pZ2h0IGJlIG90aGVyIHRocmVhZHMKLQkgKiBydW5uaW5nLiBXZSBuZWVkIHRvIHNlbmQgYW4gSVBJIHRvIGZvcmNlIHRoZW0gdG8gcGljayB1cCBhbnkKLQkgKiBjaGFuZ2UgaW4gUElEIGFuZCBBQ09QLgotCSAqLwotCWlmIChhdG9taWNfcmVhZCgmbW0tPm1tX3VzZXJzKSA+IDEpCi0JCXNtcF9jYWxsX2Z1bmN0aW9uKHN5bmNfY29wLCBtbSwgMSk7Ci0KLQlpZiAoZnJlZV9waWQgIT0gQ09QX1BJRF9OT05FKSB7Ci0JCXNwaW5fbG9jaygmbW11X2NvbnRleHRfYWNvcF9sb2NrKTsKLQkJaWRhX3JlbW92ZSgmY29wX2lkYSwgZnJlZV9waWQpOwotCQlzcGluX3VubG9jaygmbW11X2NvbnRleHRfYWNvcF9sb2NrKTsKLQl9Ci0KLQlzcGluX3VubG9jayhtbS0+Y29udGV4dC5jb3BfbG9ja3ApOwotCXNwaW5fdW5sb2NrKCZtbS0+cGFnZV90YWJsZV9sb2NrKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGRyb3BfY29wKTsKLQotI2VuZGlmIC8qIENPTkZJR19QUENfSUNTV1ggKi8KKyNpbmNsdWRlICJpY3N3eC5oIgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1tdV9jb250ZXh0X2xvY2spOwogc3RhdGljIERFRklORV9JREEobW11X2NvbnRleHRfaWRhKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMgYi9hcmNoL3Bvd2VycGMvbW0vbnVtYS5jCmluZGV4IGIyMmE4M2EuLmMwMTg5YzEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9tbS9udW1hLmMKKysrIGIvYXJjaC9wb3dlcnBjL21tL251bWEuYwpAQCAtMTI3LDQ1ICsxMjcsMjUgQEAKIH0KIAogLyoKLSAqIGdldF9hY3RpdmVfcmVnaW9uX3dvcmtfZm4gLSBBIGhlbHBlciBmdW5jdGlvbiBmb3IgZ2V0X25vZGVfYWN0aXZlX3JlZ2lvbgotICoJUmV0dXJucyBkYXRheCBzZXQgdG8gdGhlIHN0YXJ0X3BmbiBhbmQgZW5kX3BmbiBpZiB0aGV5IGNvbnRhaW4KLSAqCXRoZSBpbml0aWFsIHZhbHVlIG9mIGRhdGF4LT5zdGFydF9wZm4gYmV0d2VlbiB0aGVtCi0gKiBAc3RhcnRfcGZuOiBzdGFydCBwYWdlKGluY2x1c2l2ZSkgb2YgcmVnaW9uIHRvIGNoZWNrCi0gKiBAZW5kX3BmbjogZW5kIHBhZ2UoZXhjbHVzaXZlKSBvZiByZWdpb24gdG8gY2hlY2sKLSAqIEBkYXRheDogY29tZXMgaW4gd2l0aCAtPnN0YXJ0X3BmbiBzZXQgdG8gdmFsdWUgdG8gc2VhcmNoIGZvciBhbmQKLSAqCWdvZXMgb3V0IHdpdGggYWN0aXZlIHJhbmdlIGlmIGl0IGNvbnRhaW5zIGl0Ci0gKiBSZXR1cm5zIDEgaWYgc2VhcmNoIHZhbHVlIGlzIGluIHJhbmdlIGVsc2UgMAotICovCi1zdGF0aWMgaW50IF9faW5pdCBnZXRfYWN0aXZlX3JlZ2lvbl93b3JrX2ZuKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4sIHZvaWQgKmRhdGF4KQotewotCXN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gKmRhdGE7Ci0JZGF0YSA9IChzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uICopZGF0YXg7Ci0KLQlpZiAoc3RhcnRfcGZuIDw9IGRhdGEtPnN0YXJ0X3BmbiAmJiBlbmRfcGZuID4gZGF0YS0+c3RhcnRfcGZuKSB7Ci0JCWRhdGEtPnN0YXJ0X3BmbiA9IHN0YXJ0X3BmbjsKLQkJZGF0YS0+ZW5kX3BmbiA9IGVuZF9wZm47Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gMDsKLQotfQotCi0vKgotICogZ2V0X25vZGVfYWN0aXZlX3JlZ2lvbiAtIFJldHVybiBhY3RpdmUgcmVnaW9uIGNvbnRhaW5pbmcgc3RhcnRfcGZuCisgKiBnZXRfbm9kZV9hY3RpdmVfcmVnaW9uIC0gUmV0dXJuIGFjdGl2ZSByZWdpb24gY29udGFpbmluZyBwZm4KICAqIEFjdGl2ZSByYW5nZSByZXR1cm5lZCBpcyBlbXB0eSBpZiBub25lIGZvdW5kLgotICogQHN0YXJ0X3BmbjogVGhlIHBhZ2UgdG8gcmV0dXJuIHRoZSByZWdpb24gZm9yLgotICogQG5vZGVfYXI6IFJldHVybmVkIHNldCB0byB0aGUgYWN0aXZlIHJlZ2lvbiBjb250YWluaW5nIHN0YXJ0X3BmbgorICogQHBmbjogVGhlIHBhZ2UgdG8gcmV0dXJuIHRoZSByZWdpb24gZm9yCisgKiBAbm9kZV9hcjogUmV0dXJuZWQgc2V0IHRvIHRoZSBhY3RpdmUgcmVnaW9uIGNvbnRhaW5pbmcgQHBmbgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgZ2V0X25vZGVfYWN0aXZlX3JlZ2lvbih1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKLQkJICAgICAgIHN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gKm5vZGVfYXIpCitzdGF0aWMgdm9pZCBfX2luaXQgZ2V0X25vZGVfYWN0aXZlX3JlZ2lvbih1bnNpZ25lZCBsb25nIHBmbiwKKwkJCQkJICBzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uICpub2RlX2FyKQogewotCWludCBuaWQgPSBlYXJseV9wZm5fdG9fbmlkKHN0YXJ0X3Bmbik7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47CisJaW50IGksIG5pZDsKIAotCW5vZGVfYXItPm5pZCA9IG5pZDsKLQlub2RlX2FyLT5zdGFydF9wZm4gPSBzdGFydF9wZm47Ci0Jbm9kZV9hci0+ZW5kX3BmbiA9IHN0YXJ0X3BmbjsKLQl3b3JrX3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkLCBnZXRfYWN0aXZlX3JlZ2lvbl93b3JrX2ZuLCBub2RlX2FyKTsKKwlmb3JfZWFjaF9tZW1fcGZuX3JhbmdlKGksIE1BWF9OVU1OT0RFUywgJnN0YXJ0X3BmbiwgJmVuZF9wZm4sICZuaWQpIHsKKwkJaWYgKHBmbiA+PSBzdGFydF9wZm4gJiYgcGZuIDwgZW5kX3BmbikgeworCQkJbm9kZV9hci0+bmlkID0gbmlkOworCQkJbm9kZV9hci0+c3RhcnRfcGZuID0gc3RhcnRfcGZuOworCQkJbm9kZV9hci0+ZW5kX3BmbiA9IGVuZF9wZm47CisJCQlicmVhazsKKwkJfQorCX0KIH0KIAogc3RhdGljIHZvaWQgbWFwX2NwdV90b19ub2RlKGludCBjcHUsIGludCBub2RlKQpAQCAtNDA2LDcgKzM4Niw3IEBACiAJb2Zfbm9kZV9wdXQobWVtb3J5KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgX19kZXZpbml0IHJlYWRfbl9jZWxscyhpbnQgbiwgY29uc3QgdW5zaWduZWQgaW50ICoqYnVmKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZF9uX2NlbGxzKGludCBuLCBjb25zdCB1bnNpZ25lZCBpbnQgKipidWYpCiB7CiAJdW5zaWduZWQgbG9uZyByZXN1bHQgPSAwOwogCkBAIC03MTAsOSArNjkwLDcgQEAKIAkJCW5vZGVfc2V0X29ubGluZShuaWQpOwogCQkJc3ogPSBudW1hX2VuZm9yY2VfbWVtb3J5X2xpbWl0KGJhc2UsIHNpemUpOwogCQkJaWYgKHN6KQotCQkJCWFkZF9hY3RpdmVfcmFuZ2UobmlkLCBiYXNlID4+IFBBR0VfU0hJRlQsCi0JCQkJCQkgKGJhc2UgPj4gUEFHRV9TSElGVCkKLQkJCQkJCSArIChzeiA+PiBQQUdFX1NISUZUKSk7CisJCQkJbWVtYmxvY2tfc2V0X25vZGUoYmFzZSwgc3osIG5pZCk7CiAJCX0gd2hpbGUgKC0tcmFuZ2VzKTsKIAl9CiB9CkBAIC04MDIsOCArNzgwLDcgQEAKIAkJCQljb250aW51ZTsKIAkJfQogCi0JCWFkZF9hY3RpdmVfcmFuZ2UobmlkLCBzdGFydCA+PiBQQUdFX1NISUZULAotCQkJCShzdGFydCA+PiBQQUdFX1NISUZUKSArIChzaXplID4+IFBBR0VfU0hJRlQpKTsKKwkJbWVtYmxvY2tfc2V0X25vZGUoc3RhcnQsIHNpemUsIG5pZCk7CiAKIAkJaWYgKC0tcmFuZ2VzKQogCQkJZ290byBuZXdfcmFuZ2U7CkBAIC04MzksNyArODE2LDggQEAKIAkJZW5kX3BmbiA9IG1lbWJsb2NrX3JlZ2lvbl9tZW1vcnlfZW5kX3BmbihyZWcpOwogCiAJCWZha2VfbnVtYV9jcmVhdGVfbmV3X25vZGUoZW5kX3BmbiwgJm5pZCk7Ci0JCWFkZF9hY3RpdmVfcmFuZ2UobmlkLCBzdGFydF9wZm4sIGVuZF9wZm4pOworCQltZW1ibG9ja19zZXRfbm9kZShQRk5fUEhZUyhzdGFydF9wZm4pLAorCQkJCSAgUEZOX1BIWVMoZW5kX3BmbiAtIHN0YXJ0X3BmbiksIG5pZCk7CiAJCW5vZGVfc2V0X29ubGluZShuaWQpOwogCX0KIH0KQEAgLTk2OSw3ICs5NDcsNyBAQAogCS5wcmlvcml0eSA9IDEgLyogTXVzdCBydW4gYmVmb3JlIHNjaGVkIGRvbWFpbnMgbm90aWZpZXIuICovCiB9OwogCi1zdGF0aWMgdm9pZCBtYXJrX3Jlc2VydmVkX3JlZ2lvbnNfZm9yX25pZChpbnQgbmlkKQorc3RhdGljIHZvaWQgX19pbml0IG1hcmtfcmVzZXJ2ZWRfcmVnaW9uc19mb3JfbmlkKGludCBuaWQpCiB7CiAJc3RydWN0IHBnbGlzdF9kYXRhICpub2RlID0gTk9ERV9EQVRBKG5pZCk7CiAJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcmVnOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3RsYl9sb3dfNjRlLlMgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUwppbmRleCBkYzRhNWYzLi5mZjY3MmJkIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUworKysgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX2xvd182NGUuUwpAQCAtOTQsMTEgKzk0LDExIEBACiAKIAlzcmRpCXIxNSxyMTYsNjAJCS8qIGdldCByZWdpb24gKi8KIAlybGRpY2wuCXIxMCxyMTYsNjQtUEdUQUJMRV9FQUREUl9TSVpFLFBHVEFCTEVfRUFERFJfU0laRSs0Ci0JYm5lLQlkdGxiX21pc3NfZmF1bHRfYm9sdGVkCisJYm5lLQlkdGxiX21pc3NfZmF1bHRfYm9sdGVkCS8qIEJhaWwgaWYgZmF1bHQgYWRkciBpcyBpbnZhbGlkICovCiAKIAlybHdpbm0JcjEwLHIxMSwzMi0xOSwyNywyNwogCXJsd2ltaQlyMTAscjExLDMyLTE2LDE5LDE5Ci0JY21wd2kJcjE1LDAKKwljbXB3aQlyMTUsMAkJCS8qIHVzZXIgdnMga2VybmVsIGNoZWNrICovCiAJb3JpCXIxMCxyMTAsX1BBR0VfUFJFU0VOVAogCW9yaXMJcjExLHIxMCxfUEFHRV9BQ0NFU1NFREBoCiAKQEAgLTEyMCw0NCArMTIwLDM4IEBACiAJcmxkaWNsCXIxNSxyMTYsNjQtUEdESVJfU0hJRlQrMyw2NC1QR0RfSU5ERVhfU0laRS0zCiAJY21wbGRpCWNyMCxyMTQsMAogCWNscnJkaQlyMTUscjE1LDMKLQliZXEJdGxiX21pc3NfZmF1bHRfYm9sdGVkCisJYmVxCXRsYl9taXNzX2ZhdWx0X2JvbHRlZAkvKiBObyBQR0RJUiwgYmFpbCAqLwogCiBCRUdJTl9NTVVfRlRSX1NFQ1RJT04KIAkvKiBTZXQgdGhlIFRMQiByZXNlcnZhdGlvbiBhbmQgc2VhcmNoIGZvciBleGlzdGluZyBlbnRyeS4gVGhlbiBsb2FkCiAJICogdGhlIGVudHJ5LgogCSAqLwogCVBQQ19UTEJTUlhfRE9UKDAscjE2KQotCWxkeAlyMTQscjE0LHIxNQotCWJlcQlub3JtYWxfdGxiX21pc3NfZG9uZQorCWxkeAlyMTQscjE0LHIxNQkJLyogZ3JhYiBwZ2QgZW50cnkgKi8KKwliZXEJbm9ybWFsX3RsYl9taXNzX2RvbmUJLyogdGxiIGV4aXN0cyBhbHJlYWR5LCBiYWlsICovCiBNTVVfRlRSX1NFQ1RJT05fRUxTRQotCWxkeAlyMTQscjE0LHIxNQorCWxkeAlyMTQscjE0LHIxNQkJLyogZ3JhYiBwZ2QgZW50cnkgKi8KIEFMVF9NTVVfRlRSX1NFQ1RJT05fRU5EX0lGU0VUKE1NVV9GVFJfVVNFX1RMQlJTUlYpCiAKICNpZm5kZWYgQ09ORklHX1BQQ182NEtfUEFHRVMKIAlybGRpY2wJcjE1LHIxNiw2NC1QVURfU0hJRlQrMyw2NC1QVURfSU5ERVhfU0laRS0zCiAJY2xycmRpCXIxNSxyMTUsMwotCi0JY21wbGRpCWNyMCxyMTQsMAotCWJlcQl0bGJfbWlzc19mYXVsdF9ib2x0ZWQKLQotCWxkeAlyMTQscjE0LHIxNQorCWNtcGRpCWNyMCxyMTQsMAorCWJnZQl0bGJfbWlzc19mYXVsdF9ib2x0ZWQJLyogQmFkIHBnZCBlbnRyeSBvciBodWdlcGFnZTsgYmFpbCAqLworCWxkeAlyMTQscjE0LHIxNQkJLyogZ3JhYiBwdWQgZW50cnkgKi8KICNlbmRpZiAvKiBDT05GSUdfUFBDXzY0S19QQUdFUyAqLwogCiAJcmxkaWNsCXIxNSxyMTYsNjQtUE1EX1NISUZUKzMsNjQtUE1EX0lOREVYX1NJWkUtMwogCWNscnJkaQlyMTUscjE1LDMKLQotCWNtcGxkaQljcjAscjE0LDAKLQliZXEJdGxiX21pc3NfZmF1bHRfYm9sdGVkCi0KLQlsZHgJcjE0LHIxNCxyMTUKKwljbXBkaQljcjAscjE0LDAKKwliZ2UJdGxiX21pc3NfZmF1bHRfYm9sdGVkCisJbGR4CXIxNCxyMTQscjE1CQkvKiBHcmFiIHBtZCBlbnRyeSAqLwogCiAJcmxkaWNsCXIxNSxyMTYsNjQtUEFHRV9TSElGVCszLDY0LVBURV9JTkRFWF9TSVpFLTMKIAljbHJyZGkJcjE1LHIxNSwzCi0KLQljbXBsZGkJY3IwLHIxNCwwCi0JYmVxCXRsYl9taXNzX2ZhdWx0X2JvbHRlZAotCi0JbGR4CXIxNCxyMTQscjE1CisJY21wZGkJY3IwLHIxNCwwCisJYmdlCXRsYl9taXNzX2ZhdWx0X2JvbHRlZAorCWxkeAlyMTQscjE0LHIxNQkJLyogR3JhYiBQVEUsIG5vcm1hbCAoIWh1Z2UpIHBhZ2UgKi8KIAogCS8qIENoZWNrIGlmIHJlcXVpcmVkIHBlcm1pc3Npb25zIGFyZSBtZXQgKi8KIAlhbmRjLglyMTUscjExLHIxNApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYyBiL2FyY2gvcG93ZXJwYy9tbS90bGJfbm9oYXNoLmMKaW5kZXggNGUxM2Q2Zi4uZGYzMmE4MyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL21tL3RsYl9ub2hhc2guYworKysgYi9hcmNoL3Bvd2VycGMvbW0vdGxiX25vaGFzaC5jCkBAIC01Miw3ICs1Miw3IEBACiAgKiBpbmRpcmVjdCBwYWdlIHRhYmxlIGVudHJpZXMuCiAgKi8KICNpZmRlZiBDT05GSUdfUFBDX0JPT0szRV9NTVUKLSNpZmRlZiBDT05GSUdfRlNMX0JPT0tFCisjaWZkZWYgQ09ORklHX1BQQ19GU0xfQk9PSzNFCiBzdHJ1Y3QgbW11X3BzaXplX2RlZiBtbXVfcHNpemVfZGVmc1tNTVVfUEFHRV9DT1VOVF0gPSB7CiAJW01NVV9QQUdFXzRLXSA9IHsKIAkJLnNoaWZ0CT0gMTIsCkBAIC02MTUsNyArNjE1LDYgQEAKIAogCQkvKiBsaW1pdCBtZW1vcnkgc28gd2UgZG9udCBoYXZlIGxpbmVhciBmYXVsdHMgKi8KIAkJbWVtYmxvY2tfZW5mb3JjZV9tZW1vcnlfbGltaXQobGluZWFyX21hcF90b3ApOwotCQltZW1ibG9ja19hbmFseXplKCk7CiAKIAkJcGF0Y2hfZXhjZXB0aW9uKDB4MWMwLCBleGNfZGF0YV90bGJfbWlzc19ib2x0ZWRfYm9vazNlKTsKIAkJcGF0Y2hfZXhjZXB0aW9uKDB4MWUwLCBleGNfaW5zdHJ1Y3Rpb25fdGxiX21pc3NfYm9sdGVkX2Jvb2szZSk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvS2NvbmZpZwppbmRleCAxNTMwMjI5Li5iYWFlODU1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L0tjb25maWcKQEAgLTEwMCw2ICsxMDAsMTYgQEAKIAkgIE1vc3QgVmlydGV4IGRlc2lnbnMgc2hvdWxkIHVzZSB0aGlzIHVubGVzcyBpdCBuZWVkcyB0byBkbyBzb21lCiAJICBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gYXQgYm9hcmQgcHJvYmUgdGltZS4KIAorY29uZmlnIE9CUzYwMAorCWJvb2wgIk9wZW5CbG9ja1MgNjAwIgorCWRlcGVuZHMgb24gNDB4CisJZGVmYXVsdCBuCisJc2VsZWN0IDQwNUVYCisJc2VsZWN0IFBQQzQweF9TSU1QTEUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIFBsYXRIb21lIE9wZW5CbG9ja1MgNjAwIHNlcnZlcgorCisKIGNvbmZpZyBQUEM0MHhfU0lNUExFCiAJYm9vbCAiU2ltcGxlIFBvd2VyUEMgNDB4IGJvYXJkIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiA0MHgKQEAgLTE4NiwzICsxOTYsMTQgQEAKICMJYm9vbAogIwlkZXBlbmRzIG9uICFTVEIwM3h4eCAmJiBQUEM0eHhfRE1BCiAjCWRlZmF1bHQgeQorIworCitjb25maWcgQVBNODAxOFgKKwlib29sICJBUE04MDE4WCIKKwlkZXBlbmRzIG9uIDQweAorCWRlZmF1bHQgbgorCXNlbGVjdCBQUEM0MHhfU0lNUExFCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgQXBwbGllZE1pY3JvIEFQTTgwMThYIGV2YWx1YXRpb24KKwkgIGJvYXJkLgorCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9wcGM0MHhfc2ltcGxlLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQweC9wcGM0MHhfc2ltcGxlLmMKaW5kZXggZThkZDVjNS4uOTc2MTIwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80MHgvcHBjNDB4X3NpbXBsZS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDB4L3BwYzQweF9zaW1wbGUuYwpAQCAtNTUsNyArNTUsOSBAQAogCSJhbWNjLGhhbGVha2FsYSIsCiAJImFtY2Msa2lsYXVlYSIsCiAJImFtY2MsbWFrYWx1IiwKLQkiZXN0LGhvdGZvb3QiCisJImFwbSxrbG9uZGlrZSIsCisJImVzdCxob3Rmb290IiwKKwkicGxhdGhvbWUsb2JzNjAwIgogfTsKIAogc3RhdGljIGludCBfX2luaXQgcHBjNDB4X3Byb2JlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvS2NvbmZpZwppbmRleCA3NjIzMjJjLi41ZDVhYWY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L0tjb25maWcKQEAgLTE4Niw2ICsxODYsMTYgQEAKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBJQk0gSVNTIHNpbXVsYXRpb24gZW52aXJvbm1lbnQKIAorY29uZmlnIENVUlJJVFVDSworCWJvb2wgIklCTSBDdXJyaXR1Y2sgKDQ3NmZwZSkgU3VwcG9ydCIKKwlkZXBlbmRzIG9uIFBQQ180N3gKKwlkZWZhdWx0IG4KKwlzZWxlY3QgU1dJT1RMQgorCXNlbGVjdCA0NzZGUEUKKwlzZWxlY3QgUFBDNHh4X1BDSV9FWFBSRVNTCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgSUJNIEN1cnJpdHVjayAoNDc2ZnBlKSBldmFsdWF0aW9uIGJvYXJkCisKIGNvbmZpZyBJQ09OCiAJYm9vbCAiSWNvbiIKIAlkZXBlbmRzIG9uIDQ0eApAQCAtMzA4LDYgKzMxOCwxMCBAQAogCXNlbGVjdCBJQk1fRU1BQ19aTUlJCiAJc2VsZWN0IElCTV9FTUFDX1RBSAogCitjb25maWcgNDc2RlBFCisJYm9vbAorCXNlbGVjdCBQUENfRlBVCisKIGNvbmZpZyBBUE04MjF4eAogCWJvb2wKIAlzZWxlY3QgUFBDX0ZQVQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9NYWtlZmlsZQppbmRleCA1NTNkYjYwLi5kMDM4MzNhIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9NYWtlZmlsZQpAQCAtMTAsMyArMTAsNCBAQAogb2JqLSQoQ09ORklHX1hJTElOWF9NTDUxMCkgKz0gdmlydGV4X21sNTEwLm8KIG9iai0kKENPTkZJR19JU1M0eHgpCSs9IGlzczR4eC5vCiBvYmotJChDT05GSUdfQ0FOWU9OTEFORFMpKz0gY2FueW9ubGFuZHMubworb2JqLSQoQ09ORklHX0NVUlJJVFVDSykJKz0gY3Vycml0dWNrLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L2N1cnJpdHVjay5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvY3Vycml0dWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2MjI5YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvNDR4L2N1cnJpdHVjay5jCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ3Vycml0dWNrIGJvYXJkIHNwZWNpZmljIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IMKpIDIwMTEgVG9ueSBCcmVlZHMgSUJNIENvcnBvcmF0aW9uCisgKgorICogQmFzZWQgb24gZWFybGllciBjb2RlOgorICogICAgTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqICAgIENvcHlyaWdodCAyMDAyLTIwMDUgTW9udGFWaXN0YSBTb2Z0d2FyZSBJbmMuCisgKgorICogICAgRXVnZW5lIFN1cm92ZWdpbiA8ZXVnZW5lLnN1cm92ZWdpbkB6dWx0eXMuY29tPiBvciA8ZWJzQGVic2hvbWUubmV0PgorICogICAgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDUgWnVsdHlzIFRlY2hub2xvZ2llcworICoKKyAqICAgIFJld3JpdHRlbiBhbmQgcG9ydGVkIHRvIHRoZSBtZXJnZWQgcG93ZXJwYyB0cmVlOgorICogICAgQ29weXJpZ2h0IDIwMDcgRGF2aWQgR2lic29uIDxkd2dAYXUxLmlibS5jb20+LCBJQk0gQ29ycG9yYXRpb24uCisgKiAgICBDb3B5cmlnaHQgwqkgMjAxMSBEYXZpZCBLbGlla2FtcCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisjaW5jbHVkZSA8YXNtL3VkYmcuaD4KKyNpbmNsdWRlIDxhc20vdGltZS5oPgorI2luY2x1ZGUgPGFzbS91aWMuaD4KKyNpbmNsdWRlIDxhc20vcHBjNHh4Lmg+CisjaW5jbHVkZSA8YXNtL21waWMuaD4KKyNpbmNsdWRlIDxhc20vbW11Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworc3RhdGljIF9faW5pdGRhdGEgc3RydWN0IG9mX2RldmljZV9pZCBwcGM0N3hfb2ZfYnVzW10gPSB7CisJeyAuY29tcGF0aWJsZSA9ICJpYm0scGxiNCIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJpYm0scGxiNiIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJpYm0sb3BiIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImlibSxlYmMiLCB9LAorCXt9LAorfTsKKworLyogVGhlIEVFUFJPTSBpcyBtaXNzaW5nIGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGJvZ3VzLiAgVGhpcyBmb3JjZXMgVVNCIGluCisgKiB0byBFSENJIG1vZGUgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBxdWlya19wcGNfY3Vycml0dWNrX3VzYl9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmIChvZl9tYWNoaW5lX2lzX2NvbXBhdGlibGUoImlibSxjdXJyaXR1Y2siKSkgeworCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHhlMCwgMHgwMTE0MjMxZik7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweGU0LCAweDAwMDA2YzQwKTsKKwl9Cit9CitERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoMHgxMDMzLCAweDAwMzUsIHF1aXJrX3BwY19jdXJyaXR1Y2tfdXNiX2ZpeHVwKTsKKworc3RhdGljIGludCBfX2luaXQgcHBjNDd4X2RldmljZV9wcm9iZSh2b2lkKQoreworCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBwcGM0N3hfb2ZfYnVzLCBOVUxMKTsKKworCXJldHVybiAwOworfQorbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwocHBjNDd4LCBwcGM0N3hfZGV2aWNlX3Byb2JlKTsKKworLyogV2UgY2FuIGhhdmUgZWl0aGVyIFVJQ3Mgb3IgTVBJQ3MgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBwcGM0N3hfaW5pdF9pcnEodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJLyogRmluZCB0b3AgbGV2ZWwgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8KKwlmb3JfZWFjaF9ub2RlX3dpdGhfcHJvcGVydHkobnAsICJpbnRlcnJ1cHQtY29udHJvbGxlciIpIHsKKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImludGVycnVwdHMiLCBOVUxMKSA9PSBOVUxMKQorCQkJYnJlYWs7CisJfQorCWlmIChucCA9PSBOVUxMKQorCQlwYW5pYygiQ2FuJ3QgZmluZCB0b3AgbGV2ZWwgaW50ZXJydXB0IGNvbnRyb2xsZXIiKTsKKworCS8qIENoZWNrIHR5cGUgYW5kIGRvIGFwcHJvcHJpYXRlIGluaXRpYWxpemF0aW9uICovCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiY2hycCxvcGVuLXBpYyIpKSB7CisJCS8qIFRoZSBNUElDIGRyaXZlciB3aWxsIGdldCBldmVyeXRoaW5nIGl0IG5lZWRzIGZyb20gdGhlCisJCSAqIGRldmljZS10cmVlLCBqdXN0IHBhc3MgMCB0byBhbGwgYXJndW1lbnRzCisJCSAqLworCQlzdHJ1Y3QgbXBpYyAqbXBpYyA9CisJCQltcGljX2FsbG9jKG5wLCAwLCAwLCAwLCAwLCAiIE1QSUMgICAgICIpOworCQlCVUdfT04obXBpYyA9PSBOVUxMKTsKKwkJbXBpY19pbml0KG1waWMpOworCQlwcGNfbWQuZ2V0X2lycSA9IG1waWNfZ2V0X2lycTsKKwl9IGVsc2UKKwkJcGFuaWMoIlVucmVjb2duaXplZCB0b3AgbGV2ZWwgaW50ZXJydXB0IGNvbnRyb2xsZXIiKTsKK30KKworI2lmZGVmIENPTkZJR19TTVAKK3N0YXRpYyB2b2lkIF9fY3B1aW5pdCBzbXBfcHBjNDd4X3NldHVwX2NwdShpbnQgY3B1KQoreworCW1waWNfc2V0dXBfdGhpc19jcHUoKTsKK30KKworc3RhdGljIGludCBfX2NwdWluaXQgc21wX3BwYzQ3eF9raWNrX2NwdShpbnQgY3B1KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqY3B1bm9kZSA9IG9mX2dldF9jcHVfbm9kZShjcHUsIE5VTEwpOworCWNvbnN0IHU2NCAqc3Bpbl90YWJsZV9hZGRyX3Byb3A7CisJdTMyICpzcGluX3RhYmxlOworCWV4dGVybiB2b2lkIHN0YXJ0X3NlY29uZGFyeV80N3godm9pZCk7CisKKwlCVUdfT04oY3B1bm9kZSA9PSBOVUxMKTsKKworCS8qIEFzc3VtZSBzcGluIHRhYmxlLiBXZSBjb3VsZCB0ZXN0IGZvciB0aGUgZW5hYmxlLW1ldGhvZCBpbgorCSAqIHRoZSBkZXZpY2UtdHJlZSBidXQgY3VycmVudGx5IHRoZXJlJ3MgbGl0dGxlIHBvaW50IGFzIGl0J3MKKwkgKiBvdXIgb25seSBzdXBwb3J0ZWQgbWV0aG9kCisJICovCisJc3Bpbl90YWJsZV9hZGRyX3Byb3AgPQorCQlvZl9nZXRfcHJvcGVydHkoY3B1bm9kZSwgImNwdS1yZWxlYXNlLWFkZHIiLCBOVUxMKTsKKworCWlmIChzcGluX3RhYmxlX2FkZHJfcHJvcCA9PSBOVUxMKSB7CisJCXByX2VycigiQ1BVJWQ6IENhbid0IHN0YXJ0LCBtaXNzaW5nIGNwdS1yZWxlYXNlLWFkZHIgIVxuIiwKKwkJICAgICAgIGNwdSk7CisJCXJldHVybiAxOworCX0KKworCS8qIEFzc3VtZSBpdCdzIG1hcHBlZCBhcyBwYXJ0IG9mIHRoZSBsaW5lYXIgbWFwcGluZy4gVGhpcyBpcyBhIGJpdAorCSAqIGZpc2h5IGJ1dCB3aWxsIHdvcmsgZmluZSBmb3Igbm93CisJICoKKwkgKiBYWFg6IElzIHRoZXJlIGFueSByZWFzb24gdG8gYXNzdW1lIGRpZmZlcmVudGx5PworCSAqLworCXNwaW5fdGFibGUgPSAodTMyICopX192YSgqc3Bpbl90YWJsZV9hZGRyX3Byb3ApOworCXByX2RlYnVnKCJDUFUlZDogU3BpbiB0YWJsZSBtYXBwZWQgYXQgJXBcbiIsIGNwdSwgc3Bpbl90YWJsZSk7CisKKwlzcGluX3RhYmxlWzNdID0gY3B1OworCXNtcF93bWIoKTsKKwlzcGluX3RhYmxlWzFdID0gX19wYShzdGFydF9zZWNvbmRhcnlfNDd4KTsKKwltYigpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc21wX29wc190IHBwYzQ3eF9zbXBfb3BzID0geworCS5wcm9iZQkJPSBzbXBfbXBpY19wcm9iZSwKKwkubWVzc2FnZV9wYXNzCT0gc21wX21waWNfbWVzc2FnZV9wYXNzLAorCS5zZXR1cF9jcHUJPSBzbXBfcHBjNDd4X3NldHVwX2NwdSwKKwkua2lja19jcHUJPSBzbXBfcHBjNDd4X2tpY2tfY3B1LAorCS5naXZlX3RpbWViYXNlCT0gc21wX2dlbmVyaWNfZ2l2ZV90aW1lYmFzZSwKKwkudGFrZV90aW1lYmFzZQk9IHNtcF9nZW5lcmljX3Rha2VfdGltZWJhc2UsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgcHBjNDd4X3NtcF9pbml0KHZvaWQpCit7CisJaWYgKG1tdV9oYXNfZmVhdHVyZShNTVVfRlRSX1RZUEVfNDd4KSkKKwkJc21wX29wcyA9ICZwcGM0N3hfc21wX29wczsKK30KKworI2Vsc2UgLyogQ09ORklHX1NNUCAqLworc3RhdGljIHZvaWQgX19pbml0IHBwYzQ3eF9zbXBfaW5pdCh2b2lkKSB7IH0KKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBwcGM0N3hfc2V0dXBfYXJjaCh2b2lkKQoreworCisJLyogTm8gbmVlZCB0byBjaGVjayB0aGUgRE1BIGNvbmZpZyBhcyB3ZSAva25vdy8gb3VyIHdpbmRvd3MgYXJlIGFsbCBvZgorIAkgKiBSQU0uICBMZXRzIGhvcGUgdGhhdCBkb2Vzbid0IGNoYW5nZSAqLworI2lmZGVmIENPTkZJR19TV0lPVExCCisJaWYgKG1lbWJsb2NrX2VuZF9vZl9EUkFNKCkgPiAweGZmZmZmZmZmKSB7CisJCXBwY19zd2lvdGxiX2VuYWJsZSA9IDE7CisJCXNldF9wY2lfZG1hX29wcygmc3dpb3RsYl9kbWFfb3BzKTsKKwkJcHBjX21kLnBjaV9kbWFfZGV2X3NldHVwID0gcGNpX2RtYV9kZXZfc2V0dXBfc3dpb3RsYjsKKwl9CisjZW5kaWYKKwlwcGM0N3hfc21wX2luaXQoKTsKK30KKworLyoKKyAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZAorICovCitzdGF0aWMgaW50IF9faW5pdCBwcGM0N3hfcHJvYmUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHJvb3QgPSBvZl9nZXRfZmxhdF9kdF9yb290KCk7CisKKwlpZiAoIW9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiaWJtLGN1cnJpdHVjayIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBVc2UgVVNCIGNvbnRyb2xsZXIgc2hvdWxkIGhhdmUgYmVlbiBoYXJkd2FyZSBzd2l6emxlZCBidXQgaXQgd2Fzbid0IDooICovCitzdGF0aWMgdm9pZCBwcGM0N3hfcGNpX2lycV9maXh1cChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWlmIChkZXYtPnZlbmRvciA9PSAweDEwMzMgJiYgKGRldi0+ZGV2aWNlID09IDB4MDAzNSB8fAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldi0+ZGV2aWNlID09IDB4MDBlMCkpIHsKKwkJZGV2LT5pcnEgPSBpcnFfY3JlYXRlX21hcHBpbmcoTlVMTCwgNDcpOworCQlwcl9pbmZvKCIlczogTWFwcGluZyBpcnEgNDcgJWRcbiIsIF9fZnVuY19fLCBkZXYtPmlycSk7CisJfQorfQorCitkZWZpbmVfbWFjaGluZShwcGM0N3gpIHsKKwkubmFtZQkJCT0gIlBvd2VyUEMgNDd4IiwKKwkucHJvYmUJCQk9IHBwYzQ3eF9wcm9iZSwKKwkucHJvZ3Jlc3MJCT0gdWRiZ19wcm9ncmVzcywKKwkuaW5pdF9JUlEJCT0gcHBjNDd4X2luaXRfaXJxLAorCS5zZXR1cF9hcmNoCQk9IHBwYzQ3eF9zZXR1cF9hcmNoLAorCS5wY2lfaXJxX2ZpeHVwCQk9IHBwYzQ3eF9wY2lfaXJxX2ZpeHVwLAorCS5yZXN0YXJ0CQk9IHBwYzR4eF9yZXNldF9zeXN0ZW0sCisJLmNhbGlicmF0ZV9kZWNyCQk9IGdlbmVyaWNfY2FsaWJyYXRlX2RlY3IsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy80NHgvaXNzNHh4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9pc3M0eHguYwppbmRleCAxOTM5NWYxLi41YjhjZGJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9pc3M0eHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzQ0eC9pc3M0eHguYwpAQCAtNzEsNyArNzEsNyBAQAogCQkvKiBUaGUgTVBJQyBkcml2ZXIgd2lsbCBnZXQgZXZlcnl0aGluZyBpdCBuZWVkcyBmcm9tIHRoZQogCQkgKiBkZXZpY2UtdHJlZSwganVzdCBwYXNzIDAgdG8gYWxsIGFyZ3VtZW50cwogCQkgKi8KLQkJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2FsbG9jKG5wLCAwLCBNUElDX1BSSU1BUlksIDAsIDAsCisJCXN0cnVjdCBtcGljICptcGljID0gbXBpY19hbGxvYyhucCwgMCwgMCwgMCwgMCwKIAkJCQkJICAgICAgICIgTVBJQyAgICAgIik7CiAJCUJVR19PTihtcGljID09IE5VTEwpOwogCQltcGljX2luaXQobXBpYyk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvYXNwODM0eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L2FzcDgzNHguYwppbmRleCBhYTBkODRkLi40NjRlYThlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvYXNwODM0eC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9hc3A4MzR4LmMKQEAgLTM2LDM4ICszNiw3IEBACiAJbXBjODM0eF91c2JfY2ZnKCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBhc3A4MzR4X2luaXRfSVJRKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImlwaWMiKTsKLQlpZiAoIW5wKQotCQlyZXR1cm47Ci0KLQlpcGljX2luaXQobnAsIDApOwotCi0Jb2Zfbm9kZV9wdXQobnApOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbWFwcGluZyBwcmlvcml0aWVzLAotCSAqIGluIGNhc2UgdGhlIGJvb3Qgcm9tIGNoYW5nZWQgc29tZXRoaW5nIG9uIHVzLgotCSAqLwotCWlwaWNfc2V0X2RlZmF1bHRfcHJpb3JpdHkoKTsKLX0KLQotc3RhdGljIHN0cnVjdCBfX2luaXRkYXRhIG9mX2RldmljZV9pZCBhc3A4MzQ3X2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgYXNwODM0N19kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKLXsKLQlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgYXNwODM0N19pZHMsIE5VTEwpOwotCXJldHVybiAwOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwoYXNwODM0eCwgYXNwODM0N19kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOworbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwoYXNwODM0eCwgbXBjODN4eF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOwogCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIE1NVSBpcyBvZmYsIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCkBAIC04Miw3ICs1MSw3IEBACiAJLm5hbWUJCQk9ICJBU1A4MzQ3RSIsCiAJLnByb2JlCQkJPSBhc3A4MzR4X3Byb2JlLAogCS5zZXR1cF9hcmNoCQk9IGFzcDgzNHhfc2V0dXBfYXJjaCwKLQkuaW5pdF9JUlEJCT0gYXNwODM0eF9pbml0X0lSUSwKKwkuaW5pdF9JUlEJCT0gbXBjODN4eF9pcGljX2luaXRfSVJRLAogCS5nZXRfaXJxCQk9IGlwaWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBtcGM4M3h4X3Jlc3RhcnQsCiAJLnRpbWVfaW5pdAkJPSBtcGM4M3h4X3RpbWVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9rbTgzeHguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9rbTgzeHguYwppbmRleCBjNTUxMjlmLi42NWViNzkyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgva204M3h4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L2ttODN4eC5jCkBAIC01MSwxNSArNTEsMTQgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzeHhfa21fc2V0dXBfYXJjaCh2b2lkKQogeworI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworI2VuZGlmCiAKIAlpZiAocHBjX21kLnByb2dyZXNzKQogCQlwcGNfbWQucHJvZ3Jlc3MoImttcGJlYzgzeHhfc2V0dXBfYXJjaCgpIiwgMCk7CiAKLSNpZmRlZiBDT05GSUdfUENJCi0JZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCAicGNpIiwgImZzbCxtcGM4MzQ5LXBjaSIpCi0JCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7Ci0jZW5kaWYKKwltcGM4M3h4X3NldHVwX3BjaSgpOwogCiAjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQogCXFlX3Jlc2V0KCk7CkBAIC0xMjIsNTQgKzEyMSw3IEBACiAjZW5kaWYJCQkJLyogQ09ORklHX1FVSUNDX0VOR0lORSAqLwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBrbXBiZWM4M3h4X2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7IC50eXBlID0gInFlIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxxZSIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBrbWV0ZXJfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCi17Ci0JLyogUHVibGlzaCB0aGUgUUUgZGV2aWNlcyAqLwotCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBrbXBiZWM4M3h4X2lkcywgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzeHhfa20sIGttZXRlcl9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODN4eF9rbV9pbml0X0lSUSh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscHEycHJvLXBpYyIpOwotCWlmICghbnApIHsKLQkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiaXBpYyIpOwotCQlpZiAoIW5wKQotCQkJcmV0dXJuOwotCX0KLQotCWlwaWNfaW5pdChucCwgMCk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGludGVycnVwdCBtYXBwaW5nIHByaW9yaXRpZXMsCi0JICogaW4gY2FzZSB0aGUgYm9vdCByb20gY2hhbmdlZCBzb21ldGhpbmcgb24gdXMuCi0JICovCi0JaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOwotCW9mX25vZGVfcHV0KG5wKTsKLQotI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKLQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscWUtaWMiKTsKLQlpZiAoIW5wKSB7Ci0JCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInFlaWMiKTsKLQkJaWYgKCFucCkKLQkJCXJldHVybjsKLQl9Ci0JcWVfaWNfaW5pdChucCwgMCwgcWVfaWNfY2FzY2FkZV9sb3dfaXBpYywgcWVfaWNfY2FzY2FkZV9oaWdoX2lwaWMpOwotCW9mX25vZGVfcHV0KG5wKTsKLSNlbmRpZgkJCQkvKiBDT05GSUdfUVVJQ0NfRU5HSU5FICovCi19CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4M3h4X2ttLCBtcGM4M3h4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CiAKIC8qIGxpc3Qgb2YgdGhlIHN1cHBvcnRlZCBib2FyZHMgKi8KIHN0YXRpYyBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CkBAIC0xOTgsNyArMTUwLDcgQEAKIAkubmFtZQkJPSAibXBjODN4eC1rbS1wbGF0Zm9ybSIsCiAJLnByb2JlCQk9IG1wYzgzeHhfa21fcHJvYmUsCiAJLnNldHVwX2FyY2gJPSBtcGM4M3h4X2ttX3NldHVwX2FyY2gsCi0JLmluaXRfSVJRCT0gbXBjODN4eF9rbV9pbml0X0lSUSwKKwkuaW5pdF9JUlEJPSBtcGM4M3h4X2lwaWNfYW5kX3FlX2luaXRfSVJRLAogCS5nZXRfaXJxCT0gaXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CT0gbXBjODN4eF9yZXN0YXJ0LAogCS50aW1lX2luaXQJPSBtcGM4M3h4X3RpbWVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9taXNjLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbWlzYy5jCmluZGV4IGYwMTgwNmMuLjEyNTMzNmYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9taXNjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21pc2MuYwpAQCAtMTEsMTAgKzExLDE1IEBACiAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgorI2luY2x1ZGUgPGFzbS9pcGljLmg+CisjaW5jbHVkZSA8YXNtL3FlX2ljLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KKyNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgogCiAjaW5jbHVkZSAibXBjODN4eC5oIgogCkBAIC02NSwzICs3MCw3NSBAQAogCiAJcmV0dXJuIDA7CiB9CisKK3ZvaWQgX19pbml0IG1wYzgzeHhfaXBpY19pbml0X0lSUSh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwkvKiBsb29raW5nIGZvciBmc2wscHEycHJvLXBpYyB3aGljaCBpcyBhc2wgY29tcGF0aWJsZSB3aXRoIGZzbCxpcGljICovCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLGlwaWMiKTsKKwlpZiAoIW5wKQorCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJpcGljIik7CisJaWYgKCFucCkKKwkJcmV0dXJuOworCisJaXBpY19pbml0KG5wLCAwKTsKKworCW9mX25vZGVfcHV0KG5wKTsKKworCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW50ZXJydXB0IG1hcHBpbmcgcHJpb3JpdGllcywKKwkgKiBpbiBjYXNlIHRoZSBib290IHJvbSBjaGFuZ2VkIHNvbWV0aGluZyBvbiB1cy4KKwkgKi8KKwlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7Cit9CisKKyNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCit2b2lkIF9faW5pdCBtcGM4M3h4X3FlX2luaXRfSVJRKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucDsKKworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxxZS1pYyIpOworCWlmICghbnApIHsKKwkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAicWVpYyIpOworCQlpZiAoIW5wKQorCQkJcmV0dXJuOworCX0KKwlxZV9pY19pbml0KG5wLCAwLCBxZV9pY19jYXNjYWRlX2xvd19pcGljLCBxZV9pY19jYXNjYWRlX2hpZ2hfaXBpYyk7CisJb2Zfbm9kZV9wdXQobnApOworfQorCit2b2lkIF9faW5pdCBtcGM4M3h4X2lwaWNfYW5kX3FlX2luaXRfSVJRKHZvaWQpCit7CisJbXBjODN4eF9pcGljX2luaXRfSVJRKCk7CisJbXBjODN4eF9xZV9pbml0X0lSUSgpOworfQorI2VuZGlmIC8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KKworc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBvZl9idXNfaWRzW10gPSB7CisJeyAudHlwZSA9ICJzb2MiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic29jIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiIH0sCisJeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiB9LAorCXsgLmNvbXBhdGlibGUgPSAiZ3Bpby1sZWRzIiwgfSwKKwl7IC50eXBlID0gInFlIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxxZSIsIH0sCisJe30sCit9OworCitpbnQgX19pbml0IG1wYzgzeHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCit7CisJb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG9mX2J1c19pZHMsIE5VTEwpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BDSQordm9pZCBfX2luaXQgbXBjODN4eF9zZXR1cF9wY2kodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCAicGNpIiwgImZzbCxtcGM4MzQ5LXBjaSIpCisJCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7CisJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCAicGNpIiwgImZzbCxtcGM4MzE0LXBjaWUiKQorCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMweF9yZGIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jCmluZGV4IGQwYzRlMTUuLjRmMmQ5ZmUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzB4X3JkYi5jCkBAIC0yNywzNiArMjcsMTMgQEAKICAqLwogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzMHhfcmRiX3NldHVwX2FyY2godm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfUENJCi0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLSNlbmRpZgotCiAJaWYgKHBwY19tZC5wcm9ncmVzcykKIAkJcHBjX21kLnByb2dyZXNzKCJtcGM4MzB4X3JkYl9zZXR1cF9hcmNoKCkiLCAwKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLQlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2kiLCAiZnNsLG1wYzgzMDgtcGNpZSIpCi0JCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7Ci0jZW5kaWYKKwltcGM4M3h4X3NldHVwX3BjaSgpOwogCW1wYzgzMXhfdXNiX2NmZygpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODMweF9yZGJfaW5pdF9JUlEodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiaXBpYyIpOwotCWlmICghbnApCi0JCXJldHVybjsKLQotCWlwaWNfaW5pdChucCwgMCk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGludGVycnVwdCBtYXBwaW5nIHByaW9yaXRpZXMsCi0JICogaW4gY2FzZSB0aGUgYm9vdCByb20gY2hhbmdlZCBzb21ldGhpbmcgb24gdXMuCi0JICovCi0JaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOwotfQotCiBzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0gewogCSJNUEM4MzA4UkRCIiwKIAkiZnNsLG1wYzgzMDhyZGIiLApAQCAtNzIsMjQgKzQ5LDEzIEBACiAJcmV0dXJuIG9mX2ZsYXRfZHRfbWF0Y2gob2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpLCBib2FyZCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgb2ZfYnVzX2lkc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIgfSwKLQl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBkZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKLXsKLQlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgb2ZfYnVzX2lkcywgTlVMTCk7Ci0JcmV0dXJuIDA7Ci19Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4MzB4X3JkYiwgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzMHhfcmRiLCBtcGM4M3h4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CiAKIGRlZmluZV9tYWNoaW5lKG1wYzgzMHhfcmRiKSB7CiAJLm5hbWUJCQk9ICJNUEM4MzB4IFJEQiIsCiAJLnByb2JlCQkJPSBtcGM4MzB4X3JkYl9wcm9iZSwKIAkuc2V0dXBfYXJjaAkJPSBtcGM4MzB4X3JkYl9zZXR1cF9hcmNoLAotCS5pbml0X0lSUQkJPSBtcGM4MzB4X3JkYl9pbml0X0lSUSwKKwkuaW5pdF9JUlEJCT0gbXBjODN4eF9pcGljX2luaXRfSVJRLAogCS5nZXRfaXJxCQk9IGlwaWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBtcGM4M3h4X3Jlc3RhcnQsCiAJLnRpbWVfaW5pdAkJPSBtcGM4M3h4X3RpbWVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzF4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMXhfcmRiLmMKaW5kZXggZjg1OWVhZC4uZmEyNTk3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMXhfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMXhfcmRiLmMKQEAgLTI4LDM4ICsyOCwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODMxeF9yZGJfc2V0dXBfYXJjaCh2b2lkKQogewotI2lmZGVmIENPTkZJR19QQ0kKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotI2VuZGlmCi0KIAlpZiAocHBjX21kLnByb2dyZXNzKQogCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzgzMXhfcmRiX3NldHVwX2FyY2goKSIsIDApOwogCi0jaWZkZWYgQ09ORklHX1BDSQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wsbXBjODM0OS1wY2kiKQotCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wsbXBjODMxNC1wY2llIikKLQkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKLSNlbmRpZgorCW1wYzgzeHhfc2V0dXBfcGNpKCk7CiAJbXBjODMxeF91c2JfY2ZnKCk7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzF4X3JkYl9pbml0X0lSUSh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJpcGljIik7Ci0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JaXBpY19pbml0KG5wLCAwKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW50ZXJydXB0IG1hcHBpbmcgcHJpb3JpdGllcywKLQkgKiBpbiBjYXNlIHRoZSBib290IHJvbSBjaGFuZ2VkIHNvbWV0aGluZyBvbiB1cy4KLQkgKi8KLQlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7Ci19Ci0KIHN0YXRpYyBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CiAJIk1QQzgzMTNFUkRCIiwKIAkiZnNsLG1wYzgzMTVlcmRiIiwKQEAgLTc0LDI1ICs0OSwxMyBAQAogCXJldHVybiBvZl9mbGF0X2R0X21hdGNoKG9mX2dldF9mbGF0X2R0X3Jvb3QoKSwgYm9hcmQpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG9mX2J1c19pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiB9LAotCXsgLmNvbXBhdGlibGUgPSAiZ3Bpby1sZWRzIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQotewotCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBvZl9idXNfaWRzLCBOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzMXhfcmRiLCBkZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOworbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODMxeF9yZGIsIG1wYzgzeHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKIAogZGVmaW5lX21hY2hpbmUobXBjODMxeF9yZGIpIHsKIAkubmFtZQkJCT0gIk1QQzgzMXggUkRCIiwKIAkucHJvYmUJCQk9IG1wYzgzMXhfcmRiX3Byb2JlLAogCS5zZXR1cF9hcmNoCQk9IG1wYzgzMXhfcmRiX3NldHVwX2FyY2gsCi0JLmluaXRfSVJRCQk9IG1wYzgzMXhfcmRiX2luaXRfSVJRLAorCS5pbml0X0lSUQkJPSBtcGM4M3h4X2lwaWNfaW5pdF9JUlEsCiAJLmdldF9pcnEJCT0gaXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IG1wYzgzeHhfcmVzdGFydCwKIAkudGltZV9pbml0CQk9IG1wYzgzeHhfdGltZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYwppbmRleCAzMmE1Mjg5Li5lMzZiYzYxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODMyeF9tZHMuYwpAQCAtNzIsMTAgKzcyLDcgQEAKIAkJb2Zfbm9kZV9wdXQobnApOwogCX0KIAotI2lmZGVmIENPTkZJR19QQ0kKLQlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2kiLCAiZnNsLG1wYzgzNDktcGNpIikKLQkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKLSNlbmRpZgorCW1wYzgzeHhfc2V0dXBfcGNpKCk7CiAKICNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCiAJcWVfcmVzZXQoKTsKQEAgLTEwMSw1MSArOTgsNyBAQAogI2VuZGlmCQkJCS8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjODMyeF9pZHNbXSA9IHsKLQl7IC50eXBlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0JeyAudHlwZSA9ICJxZSIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJmc2wscWUiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXBjODMyeF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKLXsKLQkvKiBQdWJsaXNoIHRoZSBRRSBkZXZpY2VzICovCi0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG1wYzgzMnhfaWRzLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODMyeF9tZHMsIG1wYzgzMnhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKLQotc3RhdGljIHZvaWQgX19pbml0IG1wYzgzMnhfc3lzX2luaXRfSVJRKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImlwaWMiKTsKLQlpZiAoIW5wKQotCQlyZXR1cm47Ci0KLQlpcGljX2luaXQobnAsIDApOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbWFwcGluZyBwcmlvcml0aWVzLAotCSAqIGluIGNhc2UgdGhlIGJvb3Qgcm9tIGNoYW5nZWQgc29tZXRoaW5nIG9uIHVzLgotCSAqLwotCWlwaWNfc2V0X2RlZmF1bHRfcHJpb3JpdHkoKTsKLQlvZl9ub2RlX3B1dChucCk7Ci0KLSNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCi0JbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLHFlLWljIik7Ci0JaWYgKCFucCkgewotCQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJxZWljIik7Ci0JCWlmICghbnApCi0JCQlyZXR1cm47Ci0JfQotCXFlX2ljX2luaXQobnAsIDAsIHFlX2ljX2Nhc2NhZGVfbG93X2lwaWMsIHFlX2ljX2Nhc2NhZGVfaGlnaF9pcGljKTsKLQlvZl9ub2RlX3B1dChucCk7Ci0jZW5kaWYJCQkJLyogQ09ORklHX1FVSUNDX0VOR0lORSAqLwotfQorbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODMyeF9tZHMsIG1wYzgzeHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKIAogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZApAQCAtMTYxLDcgKzExNCw3IEBACiAJLm5hbWUgCQk9ICJNUEM4MzJ4IE1EUyIsCiAJLnByb2JlIAkJPSBtcGM4MzJ4X3N5c19wcm9iZSwKIAkuc2V0dXBfYXJjaCAJPSBtcGM4MzJ4X3N5c19zZXR1cF9hcmNoLAotCS5pbml0X0lSUSAJPSBtcGM4MzJ4X3N5c19pbml0X0lSUSwKKwkuaW5pdF9JUlEJPSBtcGM4M3h4X2lwaWNfYW5kX3FlX2luaXRfSVJRLAogCS5nZXRfaXJxIAk9IGlwaWNfZ2V0X2lycSwKIAkucmVzdGFydCAJPSBtcGM4M3h4X3Jlc3RhcnQsCiAJLnRpbWVfaW5pdCAJPSBtcGM4M3h4X3RpbWVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzJ4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKaW5kZXggMTdmOTk3NC4uZWZmNWJhYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzMnhfcmRiLmMKQEAgLTE5MywxNyArMTkzLDE0IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4MzJ4X3JkYl9zZXR1cF9hcmNoKHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfUENJKSB8fCBkZWZpbmVkKENPTkZJR19RVUlDQ19FTkdJTkUpCisjaWYgZGVmaW5lZChDT05GSUdfUVVJQ0NfRU5HSU5FKQogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAjZW5kaWYKIAogCWlmIChwcGNfbWQucHJvZ3Jlc3MpCiAJCXBwY19tZC5wcm9ncmVzcygibXBjODMyeF9yZGJfc2V0dXBfYXJjaCgpIiwgMCk7CiAKLSNpZmRlZiBDT05GSUdfUENJCi0JZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCAicGNpIiwgImZzbCxtcGM4MzQ5LXBjaSIpCi0JCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7Ci0jZW5kaWYKKwltcGM4M3h4X3NldHVwX3BjaSgpOwogCiAjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQogCXFlX3Jlc2V0KCk7CkBAIC0yMTgsNTIgKzIxNSw3IEBACiAjZW5kaWYJCQkJLyogQ09ORklHX1FVSUNDX0VOR0lORSAqLwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBtcGM4MzJ4X2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7IC50eXBlID0gInFlIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxxZSIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtcGM4MzJ4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQotewotCS8qIFB1Ymxpc2ggdGhlIFFFIGRldmljZXMgKi8KLQlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgbXBjODMyeF9pZHMsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4MzJ4X3JkYiwgbXBjODMyeF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODMyeF9yZGJfaW5pdF9JUlEodm9pZCkKLXsKLQotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJpcGljIik7Ci0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JaXBpY19pbml0KG5wLCAwKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW50ZXJydXB0IG1hcHBpbmcgcHJpb3JpdGllcywKLQkgKiBpbiBjYXNlIHRoZSBib290IHJvbSBjaGFuZ2VkIHNvbWV0aGluZyBvbiB1cy4KLQkgKi8KLQlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCi0jaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxxZS1pYyIpOwotCWlmICghbnApIHsKLQkJbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAicWVpYyIpOwotCQlpZiAoIW5wKQotCQkJcmV0dXJuOwotCX0KLQlxZV9pY19pbml0KG5wLCAwLCBxZV9pY19jYXNjYWRlX2xvd19pcGljLCBxZV9pY19jYXNjYWRlX2hpZ2hfaXBpYyk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotI2VuZGlmCQkJCS8qIENPTkZJR19RVUlDQ19FTkdJTkUgKi8KLX0KK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzMnhfcmRiLCBtcGM4M3h4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CiAKIC8qCiAgKiBDYWxsZWQgdmVyeSBlYXJseSwgTU1VIGlzIG9mZiwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKQEAgLTI3OSw3ICsyMzEsNyBAQAogCS5uYW1lCQk9ICJNUEM4MzJ4IFJEQiIsCiAJLnByb2JlCQk9IG1wYzgzMnhfcmRiX3Byb2JlLAogCS5zZXR1cF9hcmNoCT0gbXBjODMyeF9yZGJfc2V0dXBfYXJjaCwKLQkuaW5pdF9JUlEJPSBtcGM4MzJ4X3JkYl9pbml0X0lSUSwKKwkuaW5pdF9JUlEJPSBtcGM4M3h4X2lwaWNfYW5kX3FlX2luaXRfSVJRLAogCS5nZXRfaXJxCT0gaXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CT0gbXBjODN4eF9yZXN0YXJ0LAogCS50aW1lX2luaXQJPSBtcGM4M3h4X3RpbWVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X2l0eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKaW5kZXggNmI0NTk2OS4uMzk4NDlkZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfaXR4LmMKQEAgLTQxLDEzICs0MSwxMiBAQAogCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG1wYzgzNHhfaXR4X2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAiZnNsLHBxMnByby1sb2NhbGJ1cyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAogCXt9LAogfTsKIAogc3RhdGljIGludCBfX2luaXQgbXBjODM0eF9pdHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCiB7CisJbXBjODN4eF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMoKTsKIAlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG1wYzgzNHhfaXR4X2lkcywgTlVMTCk7CiB9CiBtYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4MzR4X2l0eCwgbXBjODM0eF9pdHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKQEAgLTU5LDM3ICs1OCwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODM0eF9pdHhfc2V0dXBfYXJjaCh2b2lkKQogewotI2lmZGVmIENPTkZJR19QQ0kKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotI2VuZGlmCi0KIAlpZiAocHBjX21kLnByb2dyZXNzKQogCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzgzNHhfaXR4X3NldHVwX2FyY2goKSIsIDApOwogCi0jaWZkZWYgQ09ORklHX1BDSQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wsbXBjODM0OS1wY2kiKQotCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwotI2VuZGlmCisJbXBjODN4eF9zZXR1cF9wY2koKTsKIAogCW1wYzgzNHhfdXNiX2NmZygpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODM0eF9pdHhfaW5pdF9JUlEodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiaXBpYyIpOwotCWlmICghbnApCi0JCXJldHVybjsKLQotCWlwaWNfaW5pdChucCwgMCk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGludGVycnVwdCBtYXBwaW5nIHByaW9yaXRpZXMsCi0JICogaW4gY2FzZSB0aGUgYm9vdCByb20gY2hhbmdlZCBzb21ldGhpbmcgb24gdXMuCi0JICovCi0JaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOwotfQotCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIE1NVSBpcyBvZmYsIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCiAgKi8KQEAgLTEwNCw3ICs4MCw3IEBACiAJLm5hbWUJCQk9ICJNUEM4MzR4IElUWCIsCiAJLnByb2JlCQkJPSBtcGM4MzR4X2l0eF9wcm9iZSwKIAkuc2V0dXBfYXJjaAkJPSBtcGM4MzR4X2l0eF9zZXR1cF9hcmNoLAotCS5pbml0X0lSUQkJPSBtcGM4MzR4X2l0eF9pbml0X0lSUSwKKwkuaW5pdF9JUlEJCT0gbXBjODN4eF9pcGljX2luaXRfSVJRLAogCS5nZXRfaXJxCQk9IGlwaWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBtcGM4M3h4X3Jlc3RhcnQsCiAJLnRpbWVfaW5pdAkJPSBtcGM4M3h4X3RpbWVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4MzR4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfbWRzLmMKaW5kZXggMDQxYzUxNy4uNTgyOGQ4ZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNHhfbWRzLmMKQEAgLTc3LDUxICs3NywxNSBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODM0eF9tZHNfc2V0dXBfYXJjaCh2b2lkKQogewotI2lmZGVmIENPTkZJR19QQ0kKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotI2VuZGlmCi0KIAlpZiAocHBjX21kLnByb2dyZXNzKQogCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzgzNHhfbWRzX3NldHVwX2FyY2goKSIsIDApOwogCi0jaWZkZWYgQ09ORklHX1BDSQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wsbXBjODM0OS1wY2kiKQotCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwotI2VuZGlmCisJbXBjODN4eF9zZXR1cF9wY2koKTsKIAogCW1wYzgzNHhlbWRzX3VzYl9jZmcoKTsKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNHhfbWRzX2luaXRfSVJRKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgImlwaWMiKTsKLQlpZiAoIW5wKQotCQlyZXR1cm47Ci0KLQlpcGljX2luaXQobnAsIDApOwotCi0JLyogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbWFwcGluZyBwcmlvcml0aWVzLAotCSAqIGluIGNhc2UgdGhlIGJvb3Qgcm9tIGNoYW5nZWQgc29tZXRoaW5nIG9uIHVzLgotCSAqLwotCWlwaWNfc2V0X2RlZmF1bHRfcHJpb3JpdHkoKTsKLX0KLQotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjODM0eF9pZHNbXSA9IHsKLQl7IC50eXBlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1wYzgzNHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCi17Ci0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG1wYzgzNHhfaWRzLCBOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzNHhfbWRzLCBtcGM4MzR4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4MzR4X21kcywgbXBjODN4eF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOwogCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIE1NVSBpcyBvZmYsIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCkBAIC0xMzcsNyArMTAxLDcgQEAKIAkubmFtZQkJCT0gIk1QQzgzNHggTURTIiwKIAkucHJvYmUJCQk9IG1wYzgzNHhfbWRzX3Byb2JlLAogCS5zZXR1cF9hcmNoCQk9IG1wYzgzNHhfbWRzX3NldHVwX2FyY2gsCi0JLmluaXRfSVJRCQk9IG1wYzgzNHhfbWRzX2luaXRfSVJRLAorCS5pbml0X0lSUQkJPSBtcGM4M3h4X2lwaWNfaW5pdF9JUlEsCiAJLmdldF9pcnEJCT0gaXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IG1wYzgzeHhfcmVzdGFydCwKIAkudGltZV9pbml0CQk9IG1wYzgzeHhfdGltZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYwppbmRleCA5MzRjYzhjLi5hZDhlNGJjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9tZHMuYwpAQCAtODAsMTAgKzgwLDcgQEAKIAkJb2Zfbm9kZV9wdXQobnApOwogCX0KIAotI2lmZGVmIENPTkZJR19QQ0kKLQlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2kiLCAiZnNsLG1wYzgzNDktcGNpIikKLQkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKLSNlbmRpZgorCW1wYzgzeHhfc2V0dXBfcGNpKCk7CiAKICNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCiAJcWVfcmVzZXQoKTsKQEAgLTE0NCwyMyArMTQxLDcgQEAKICNlbmRpZgkJCQkvKiBDT05GSUdfUVVJQ0NfRU5HSU5FICovCiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzgzNnhfaWRzW10gPSB7Ci0JeyAudHlwZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAotCXsgLnR5cGUgPSAicWUiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZnNsLHFlIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1wYzgzNnhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCi17Ci0JLyogUHVibGlzaCB0aGUgUUUgZGV2aWNlcyAqLwotCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBtcGM4MzZ4X2lkcywgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzNnhfbWRzLCBtcGM4MzZ4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4MzZ4X21kcywgbXBjODN4eF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOwogCiAjaWZkZWYgQ09ORklHX1FFX1VTQgogc3RhdGljIGludCBfX2luaXQgbXBjODM2eF91c2JfY2ZnKHZvaWQpCkBAIC0yMjYsMzQgKzIwNyw2IEBACiBtYWNoaW5lX2FyY2hfaW5pdGNhbGwobXBjODM2eF9tZHMsIG1wYzgzNnhfdXNiX2NmZyk7CiAjZW5kaWYgLyogQ09ORklHX1FFX1VTQiAqLwogCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODM2eF9tZHNfaW5pdF9JUlEodm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAiaXBpYyIpOwotCWlmICghbnApCi0JCXJldHVybjsKLQotCWlwaWNfaW5pdChucCwgMCk7Ci0KLQkvKiBJbml0aWFsaXplIHRoZSBkZWZhdWx0IGludGVycnVwdCBtYXBwaW5nIHByaW9yaXRpZXMsCi0JICogaW4gY2FzZSB0aGUgYm9vdCByb20gY2hhbmdlZCBzb21ldGhpbmcgb24gdXMuCi0JICovCi0JaXBpY19zZXRfZGVmYXVsdF9wcmlvcml0eSgpOwotCW9mX25vZGVfcHV0KG5wKTsKLQotI2lmZGVmIENPTkZJR19RVUlDQ19FTkdJTkUKLQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wscWUtaWMiKTsKLQlpZiAoIW5wKSB7Ci0JCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgInFlaWMiKTsKLQkJaWYgKCFucCkKLQkJCXJldHVybjsKLQl9Ci0JcWVfaWNfaW5pdChucCwgMCwgcWVfaWNfY2FzY2FkZV9sb3dfaXBpYywgcWVfaWNfY2FzY2FkZV9oaWdoX2lwaWMpOwotCW9mX25vZGVfcHV0KG5wKTsKLSNlbmRpZgkJCQkvKiBDT05GSUdfUVVJQ0NfRU5HSU5FICovCi19Ci0KIC8qCiAgKiBDYWxsZWQgdmVyeSBlYXJseSwgTU1VIGlzIG9mZiwgZGV2aWNlLXRyZWUgaXNuJ3QgdW5mbGF0dGVuZWQKICAqLwpAQCAtMjY4LDcgKzIyMSw3IEBACiAJLm5hbWUJCT0gIk1QQzgzNnggTURTIiwKIAkucHJvYmUJCT0gbXBjODM2eF9tZHNfcHJvYmUsCiAJLnNldHVwX2FyY2gJPSBtcGM4MzZ4X21kc19zZXR1cF9hcmNoLAotCS5pbml0X0lSUQk9IG1wYzgzNnhfbWRzX2luaXRfSVJRLAorCS5pbml0X0lSUQk9IG1wYzgzeHhfaXBpY19hbmRfcWVfaW5pdF9JUlEsCiAJLmdldF9pcnEJPSBpcGljX2dldF9pcnEsCiAJLnJlc3RhcnQJPSBtcGM4M3h4X3Jlc3RhcnQsCiAJLnRpbWVfaW5pdAk9IG1wYzgzeHhfdGltZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzNnhfcmRrLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9yZGsuYwppbmRleCBiMDA5MGFhLi5mODc2OWQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9yZGsuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM2eF9yZGsuYwpAQCAtMjcsNjEgKzI3LDE5IEBACiAKICNpbmNsdWRlICJtcGM4M3h4LmgiCiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgbXBjODM2eF9yZGtfaWRzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1wYzgzNnhfcmRrX2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQotewotCXJldHVybiBvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgbXBjODM2eF9yZGtfaWRzLCBOVUxMKTsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzgzNnhfcmRrLCBtcGM4MzZ4X3Jka19kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOworbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODM2eF9yZGssIG1wYzgzeHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKIAogc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNnhfcmRrX3NldHVwX2FyY2godm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfUENJCi0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLSNlbmRpZgotCiAJaWYgKHBwY19tZC5wcm9ncmVzcykKIAkJcHBjX21kLnByb2dyZXNzKCJtcGM4MzZ4X3Jka19zZXR1cF9hcmNoKCkiLCAwKTsKIAotI2lmZGVmIENPTkZJR19QQ0kKLQlmb3JfZWFjaF9jb21wYXRpYmxlX25vZGUobnAsICJwY2kiLCAiZnNsLG1wYzgzNDktcGNpIikKLQkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKLSNlbmRpZgorCW1wYzgzeHhfc2V0dXBfcGNpKCk7CiAjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQogCXFlX3Jlc2V0KCk7CiAjZW5kaWYKIH0KIAotc3RhdGljIHZvaWQgX19pbml0IG1wYzgzNnhfcmRrX2luaXRfSVJRKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxpcGljIik7Ci0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JaXBpY19pbml0KG5wLCAwKTsKLQotCS8qCi0JICogSW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnRlcnJ1cHQgbWFwcGluZyBwcmlvcml0aWVzLAotCSAqIGluIGNhc2UgdGhlIGJvb3Qgcm9tIGNoYW5nZWQgc29tZXRoaW5nIG9uIHVzLgotCSAqLwotCWlwaWNfc2V0X2RlZmF1bHRfcHJpb3JpdHkoKTsKLQlvZl9ub2RlX3B1dChucCk7Ci0jaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxxZS1pYyIpOwotCWlmICghbnApCi0JCXJldHVybjsKLQotCXFlX2ljX2luaXQobnAsIDAsIHFlX2ljX2Nhc2NhZGVfbG93X2lwaWMsIHFlX2ljX2Nhc2NhZGVfaGlnaF9pcGljKTsKLQlvZl9ub2RlX3B1dChucCk7Ci0jZW5kaWYKLX0KLQogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZC4KICAqLwpAQCAtOTYsNyArNTQsNyBAQAogCS5uYW1lCQk9ICJNUEM4MzZ4IFJESyIsCiAJLnByb2JlCQk9IG1wYzgzNnhfcmRrX3Byb2JlLAogCS5zZXR1cF9hcmNoCT0gbXBjODM2eF9yZGtfc2V0dXBfYXJjaCwKLQkuaW5pdF9JUlEJPSBtcGM4MzZ4X3Jka19pbml0X0lSUSwKKwkuaW5pdF9JUlEJPSBtcGM4M3h4X2lwaWNfYW5kX3FlX2luaXRfSVJRLAogCS5nZXRfaXJxCT0gaXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CT0gbXBjODN4eF9yZXN0YXJ0LAogCS50aW1lX2luaXQJPSBtcGM4M3h4X3RpbWVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4Mzd4X21kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfbWRzLmMKaW5kZXggODMwNjgzMi4uZTUzYTYwYiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfbWRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfbWRzLmMKQEAgLTc5LDU0ICs3OSwxNCBAQAogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODM3eF9tZHNfc2V0dXBfYXJjaCh2b2lkKQogewotI2lmZGVmIENPTkZJR19QQ0kKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotI2VuZGlmCi0KIAlpZiAocHBjX21kLnByb2dyZXNzKQogCQlwcGNfbWQucHJvZ3Jlc3MoIm1wYzgzN3hfbWRzX3NldHVwX2FyY2goKSIsIDApOwogCi0jaWZkZWYgQ09ORklHX1BDSQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wsbXBjODM0OS1wY2kiKQotCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wsbXBjODMxNC1wY2llIikKLQkJbXBjODN4eF9hZGRfYnJpZGdlKG5wKTsKLSNlbmRpZgorCW1wYzgzeHhfc2V0dXBfcGNpKCk7CiAJbXBjODM3eG1kc191c2JfY2ZnKCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIG1wYzgzN3hfaWRzW10gPSB7Ci0JeyAudHlwZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZ2lhbmZhciIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtcGM4Mzd4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQotewotCS8qIFB1Ymxpc2ggcGxhdGZvcm1fZGV2aWNlICovCi0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG1wYzgzN3hfaWRzLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODM3eF9tZHMsIG1wYzgzN3hfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKLQotc3RhdGljIHZvaWQgX19pbml0IG1wYzgzN3hfbWRzX2luaXRfSVJRKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxpcGljIik7Ci0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JaXBpY19pbml0KG5wLCAwKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW50ZXJydXB0IG1hcHBpbmcgcHJpb3JpdGllcywKLQkgKiBpbiBjYXNlIHRoZSBib290IHJvbSBjaGFuZ2VkIHNvbWV0aGluZyBvbiB1cy4KLQkgKi8KLQlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7Ci19CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4Mzd4X21kcywgbXBjODN4eF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOwogCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIE1NVSBpcyBvZmYsIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCkBAIC0xNDIsNyArMTAyLDcgQEAKIAkubmFtZQkJCT0gIk1QQzgzN3ggTURTIiwKIAkucHJvYmUJCQk9IG1wYzgzN3hfbWRzX3Byb2JlLAogCS5zZXR1cF9hcmNoCQk9IG1wYzgzN3hfbWRzX3NldHVwX2FyY2gsCi0JLmluaXRfSVJRCQk9IG1wYzgzN3hfbWRzX2luaXRfSVJRLAorCS5pbml0X0lSUQkJPSBtcGM4M3h4X2lwaWNfaW5pdF9JUlEsCiAJLmdldF9pcnEJCT0gaXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IG1wYzgzeHhfcmVzdGFydCwKIAkudGltZV9pbml0CQk9IG1wYzgzeHhfdGltZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzN3hfcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9yZGIuYwppbmRleCA3YmFmYmYyLi4xNmM5YzljIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9yZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODM3eF9yZGIuYwpAQCAtNTAsNTYgKzUwLDE1IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4Mzd4X3JkYl9zZXR1cF9hcmNoKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX1BDSQotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0jZW5kaWYKLQogCWlmIChwcGNfbWQucHJvZ3Jlc3MpCiAJCXBwY19tZC5wcm9ncmVzcygibXBjODM3eF9yZGJfc2V0dXBfYXJjaCgpIiwgMCk7CiAKLSNpZmRlZiBDT05GSUdfUENJCi0JZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCAicGNpIiwgImZzbCxtcGM4MzQ5LXBjaSIpCi0JCW1wYzgzeHhfYWRkX2JyaWRnZShucCk7Ci0JZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCAicGNpIiwgImZzbCxtcGM4MzE0LXBjaWUiKQotCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwotI2VuZGlmCisJbXBjODN4eF9zZXR1cF9wY2koKTsKIAltcGM4Mzd4X3VzYl9jZmcoKTsKIAltcGM4Mzd4X3JkYl9zZF9jZmcoKTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjODM3eF9pZHNbXSA9IHsKLQl7IC50eXBlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImdwaW8tbGVkcyIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtcGM4Mzd4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQotewotCS8qIFB1Ymxpc2ggcGxhdGZvcm1fZGV2aWNlICovCi0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG1wYzgzN3hfaWRzLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODM3eF9yZGIsIG1wYzgzN3hfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKLQotc3RhdGljIHZvaWQgX19pbml0IG1wYzgzN3hfcmRiX2luaXRfSVJRKHZvaWQpCi17Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxpcGljIik7Ci0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JaXBpY19pbml0KG5wLCAwKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW50ZXJydXB0IG1hcHBpbmcgcHJpb3JpdGllcywKLQkgKiBpbiBjYXNlIHRoZSBib290IHJvbSBjaGFuZ2VkIHNvbWV0aGluZyBvbiB1cy4KLQkgKi8KLQlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7Ci19CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4Mzd4X3JkYiwgbXBjODN4eF9kZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOwogCiBzdGF0aWMgY29uc3QgY2hhciAqYm9hcmRbXSBfX2luaXRkYXRhID0gewogCSJmc2wsbXBjODM3N3JkYiIsCkBAIC0xMjEsNyArODAsNyBAQAogCS5uYW1lCQkJPSAiTVBDODM3eCBSREIvV0xBTiIsCiAJLnByb2JlCQkJPSBtcGM4Mzd4X3JkYl9wcm9iZSwKIAkuc2V0dXBfYXJjaAkJPSBtcGM4Mzd4X3JkYl9zZXR1cF9hcmNoLAotCS5pbml0X0lSUQkJPSBtcGM4Mzd4X3JkYl9pbml0X0lSUSwKKwkuaW5pdF9JUlEJCT0gbXBjODN4eF9pcGljX2luaXRfSVJRLAogCS5nZXRfaXJxCQk9IGlwaWNfZ2V0X2lycSwKIAkucmVzdGFydAkJPSBtcGM4M3h4X3Jlc3RhcnQsCiAJLnRpbWVfaW5pdAkJPSBtcGM4M3h4X3RpbWVfaW5pdCwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvbXBjODN4eC5oCmluZGV4IDgyYTQzNDUuLjBjZjc0ZDcgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9tcGM4M3h4LmgKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L21wYzgzeHguaApAQCAtNzAsNSArNzAsMjEgQEAKIGV4dGVybiBpbnQgbXBjODM3eF91c2JfY2ZnKHZvaWQpOwogZXh0ZXJuIGludCBtcGM4MzR4X3VzYl9jZmcodm9pZCk7CiBleHRlcm4gaW50IG1wYzgzMXhfdXNiX2NmZyh2b2lkKTsKK2V4dGVybiB2b2lkIG1wYzgzeHhfaXBpY19pbml0X0lSUSh2b2lkKTsKKyNpZmRlZiBDT05GSUdfUVVJQ0NfRU5HSU5FCitleHRlcm4gdm9pZCBtcGM4M3h4X3FlX2luaXRfSVJRKHZvaWQpOworZXh0ZXJuIHZvaWQgbXBjODN4eF9pcGljX2FuZF9xZV9pbml0X0lSUSh2b2lkKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgX19pbml0IG1wYzgzeHhfcWVfaW5pdF9JUlEodm9pZCkge30KKyNkZWZpbmUgbXBjODN4eF9pcGljX2FuZF9xZV9pbml0X0lSUSBtcGM4M3h4X2lwaWNfaW5pdF9JUlEKKyNlbmRpZiAvKiBDT05GSUdfUVVJQ0NfRU5HSU5FICovCisKKyNpZmRlZiBDT05GSUdfUENJCitleHRlcm4gdm9pZCBtcGM4M3h4X3NldHVwX3BjaSh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIG1wYzgzeHhfc2V0dXBfcGNpKCkJZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworZXh0ZXJuIGludCBtcGM4M3h4X2RlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKTsKIAogI2VuZGlmCQkJCS8qIF9fTVBDODNYWF9IX18gKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9zYmM4MzR4LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzgzeHgvc2JjODM0eC5jCmluZGV4IGFmNDFkOGMuLjhhODFkNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODN4eC9zYmM4MzR4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84M3h4L3NiYzgzNHguYwpAQCAtNDgsNTIgKzQ4LDEzIEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBzYmM4MzR4X3NldHVwX2FyY2godm9pZCkKIHsKLSNpZmRlZiBDT05GSUdfUENJCi0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLSNlbmRpZgotCiAJaWYgKHBwY19tZC5wcm9ncmVzcykKIAkJcHBjX21kLnByb2dyZXNzKCJzYmM4MzR4X3NldHVwX2FyY2goKSIsIDApOwogCi0jaWZkZWYgQ09ORklHX1BDSQotCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgInBjaSIsICJmc2wsbXBjODM0OS1wY2kiKQotCQltcGM4M3h4X2FkZF9icmlkZ2UobnApOwotI2VuZGlmCi0KKwltcGM4M3h4X3NldHVwX3BjaSgpOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgc2JjODM0eF9pbml0X0lSUSh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJpcGljIik7Ci0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JaXBpY19pbml0KG5wLCAwKTsKLQotCS8qIEluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW50ZXJydXB0IG1hcHBpbmcgcHJpb3JpdGllcywKLQkgKiBpbiBjYXNlIHRoZSBib290IHJvbSBjaGFuZ2VkIHNvbWV0aGluZyBvbiB1cy4KLQkgKi8KLQlpcGljX3NldF9kZWZhdWx0X3ByaW9yaXR5KCk7Ci0KLQlvZl9ub2RlX3B1dChucCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgX19pbml0ZGF0YSBvZl9kZXZpY2VfaWQgc2JjODM0eF9pZHNbXSA9IHsKLQl7IC50eXBlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHNiYzgzNHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCi17Ci0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIHNiYzgzNHhfaWRzLCBOVUxMKTsKLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHNiYzgzNHgsIHNiYzgzNHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHNiYzgzNHgsIG1wYzgzeHhfZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKIAogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBNTVUgaXMgb2ZmLCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZApAQCAtMTAyLDE0ICs2MywxNCBAQAogewogCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKIAotCXJldHVybiBvZl9mbGF0X2R0X2lzX2NvbXBhdGlibGUocm9vdCwgIlNCQzgzNHgiKTsKKwlyZXR1cm4gb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJTQkM4MzR4RSIpOwogfQogCiBkZWZpbmVfbWFjaGluZShzYmM4MzR4KSB7Ci0JLm5hbWUJCQk9ICJTQkM4MzR4IiwKKwkubmFtZQkJCT0gIlNCQzgzNHhFIiwKIAkucHJvYmUJCQk9IHNiYzgzNHhfcHJvYmUsCiAJLnNldHVwX2FyY2gJCT0gc2JjODM0eF9zZXR1cF9hcmNoLAotCS5pbml0X0lSUQkJPSBzYmM4MzR4X2luaXRfSVJRLAorCS5pbml0X0lSUQkJPSBtcGM4M3h4X2lwaWNfaW5pdF9JUlEsCiAJLmdldF9pcnEJCT0gaXBpY19nZXRfaXJxLAogCS5yZXN0YXJ0CQk9IG1wYzgzeHhfcmVzdGFydCwKIAkudGltZV9pbml0CQk9IG1wYzgzeHhfdGltZV9pbml0LApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L01ha2VmaWxlCmluZGV4IGJjNWFjYjkuLjljYjJkNDMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvTWFrZWZpbGUKQEAgLTMsNiArMyw4IEBACiAjCiBvYmotJChDT05GSUdfU01QKSArPSBzbXAubwogCitvYmoteSArPSBjb21tb24ubworCiBvYmotJChDT05GSUdfTVBDODU0MF9BRFMpICs9IG1wYzg1eHhfYWRzLm8KIG9iai0kKENPTkZJR19NUEM4NTYwX0FEUykgKz0gbXBjODV4eF9hZHMubwogb2JqLSQoQ09ORklHX01QQzg1eHhfQ0RTKSArPSBtcGM4NXh4X2Nkcy5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlZjUzMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb21tb24uYwpAQCAtMCwwICsxLDY2IEBACisvKgorICogUm91dGluZXMgY29tbW9uIHRvIG1vc3QgbXBjODV4eC1iYXNlZCBib2FyZHMuCisgKgorICogVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgorCisjaW5jbHVkZSA8c3lzZGV2L2NwbTJfcGljLmg+CisKKyNpbmNsdWRlICJtcGM4NXh4LmgiCisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgbXBjODV4eF9jb21tb25faWRzW10gPSB7CisJeyAudHlwZSA9ICJzb2MiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAic29jIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAorCXsgLm5hbWUgPSAiY3BtIiwgfSwKKwl7IC5uYW1lID0gImxvY2FsYnVzIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAorCXsgLmNvbXBhdGlibGUgPSAiZnNsLHFlIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxjcG0yIiwgfSwKKwl7IC5jb21wYXRpYmxlID0gImZzbCxzcmlvIiwgfSwKKwl7fSwKK307CisKK2ludCBfX2luaXQgbXBjODV4eF9jb21tb25fcHVibGlzaF9kZXZpY2VzKHZvaWQpCit7CisJcmV0dXJuIG9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBtcGM4NXh4X2NvbW1vbl9pZHMsIE5VTEwpOworfQorI2lmZGVmIENPTkZJR19DUE0yCitzdGF0aWMgdm9pZCBjcG0yX2Nhc2NhZGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOworCWludCBjYXNjYWRlX2lycTsKKworCXdoaWxlICgoY2FzY2FkZV9pcnEgPSBjcG0yX2dldF9pcnEoKSkgPj0gMCkKKwkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKKworCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKK30KKworCit2b2lkIF9faW5pdCBtcGM4NXh4X2NwbTJfcGljX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCWludCBpcnE7CisKKwkvKiBTZXR1cCBDUE0yIFBJQyAqLworCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxjcG0yLXBpYyIpOworCWlmIChucCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUElDIGluaXQ6IGNhbiBub3QgZmluZCBmc2wsY3BtMi1waWMgbm9kZVxuIik7CisJCXJldHVybjsKKwl9CisJaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCWlmIChpcnEgPT0gTk9fSVJRKSB7CisJCW9mX25vZGVfcHV0KG5wKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJQSUMgaW5pdDogZ290IG5vIElSUSBmb3IgY3BtIGNhc2NhZGVcbiIpOworCQlyZXR1cm47CisJfQorCisJY3BtMl9waWNfaW5pdChucCk7CisJb2Zfbm9kZV9wdXQobnApOworCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGlycSwgY3BtMl9jYXNjYWRlKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvcmVuZXRfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9jb3JlbmV0X2RzLmMKaW5kZXggODAyYWQxMS4uMDdlM2U2YyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2NvcmVuZXRfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvY29yZW5ldF9kcy5jCkBAIC0zMSwzMiArMzEsMTggQEAKICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlICJzbXAuaCIKIAogdm9pZCBfX2luaXQgY29yZW5ldF9kc19waWNfaW5pdCh2b2lkKQogewogCXN0cnVjdCBtcGljICptcGljOwotCXN0cnVjdCByZXNvdXJjZSByOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOwotCXVuc2lnbmVkIGludCBmbGFncyA9IE1QSUNfUFJJTUFSWSB8IE1QSUNfQklHX0VORElBTiB8CisJdW5zaWduZWQgaW50IGZsYWdzID0gTVBJQ19CSUdfRU5ESUFOIHwKIAkJCQlNUElDX0JST0tFTl9GUlJfTklSUVMgfCBNUElDX1NJTkdMRV9ERVNUX0NQVTsKIAotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJvcGVuLXBpYyIpOwotCi0JaWYgKG5wID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KIAlpZiAocHBjX21kLmdldF9pcnEgPT0gbXBpY19nZXRfY29yZWludF9pcnEpCiAJCWZsYWdzIHw9IE1QSUNfRU5BQkxFX0NPUkVJTlQ7CiAKLQltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwgZmxhZ3MsIDAsIDI1NiwgIiBPcGVuUElDICAiKTsKKwltcGljID0gbXBpY19hbGxvYyhOVUxMLCAwLCBmbGFncywgMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwogCiAJbXBpY19pbml0KG1waWMpOwpAQCAtNjUsMTAgKzUxLDYgQEAKIC8qCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCiAgKi8KLSNpZmRlZiBDT05GSUdfU01QCi12b2lkIF9faW5pdCBtcGM4NXh4X3NtcF9pbml0KHZvaWQpOwotI2VuZGlmCi0KIHZvaWQgX19pbml0IGNvcmVuZXRfZHNfc2V0dXBfYXJjaCh2b2lkKQogewogI2lmZGVmIENPTkZJR19QQ0kKQEAgLTc3LDkgKzU5LDcgQEAKICNlbmRpZgogCWRtYV9hZGRyX3QgbWF4ID0gMHhmZmZmZmZmZjsKIAotI2lmZGVmIENPTkZJR19TTVAKIAltcGM4NXh4X3NtcF9pbml0KCk7Ci0jZW5kaWYKIAogI2lmZGVmIENPTkZJR19QQ0kKIAlmb3JfZWFjaF9ub2RlX2J5X3R5cGUobnAsICJwY2kiKSB7CkBAIC0xMTIsNyArOTIsNyBAQAogCQkuY29tcGF0aWJsZQk9ICJzaW1wbGUtYnVzIgogCX0sCiAJewotCQkuY29tcGF0aWJsZQk9ICJmc2wscmFwaWRpby1kZWx0YSIsCisJCS5jb21wYXRpYmxlCT0gImZzbCxzcmlvIiwKIAl9LAogCXsKIAkJLmNvbXBhdGlibGUJPSAiZnNsLHA0MDgwLXBjaWUiLApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2tzaTg1NjAuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9rc2k4NTYwLmMKaW5kZXggYzQ2ZjkzNS4uMjBmNzVkNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L2tzaTg1NjAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgva3NpODU2MC5jCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8YXNtL2NwbTIuaD4KICNpbmNsdWRlIDxzeXNkZXYvY3BtMl9waWMuaD4KIAorI2luY2x1ZGUgIm1wYzg1eHguaCIKIAogI2RlZmluZSBLU0k4NTYwX0NQTERfSFZSCQkweDA0IC8qIEhhcmR3YXJlIFZlcnNpb24gUmVnaXN0ZXIgKi8KICNkZWZpbmUgS1NJODU2MF9DUExEX1BWUgkJMHgwOCAvKiBQTEQgVmVyc2lvbiBSZWdpc3RlciAqLwpAQCAtNTQsNjAgKzU1LDE1IEBACiAJZm9yICg7Oyk7CiB9CiAKLXN0YXRpYyB2b2lkIGNwbTJfY2FzY2FkZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7Ci0JaW50IGNhc2NhZGVfaXJxOwotCi0Jd2hpbGUgKChjYXNjYWRlX2lycSA9IGNwbTJfZ2V0X2lycSgpKSA+PSAwKQotCQlnZW5lcmljX2hhbmRsZV9pcnEoY2FzY2FkZV9pcnEpOwotCi0JY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQga3NpODU2MF9waWNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBtcGljICptcGljOwotCXN0cnVjdCByZXNvdXJjZSByOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0jaWZkZWYgQ09ORklHX0NQTTIKLQlpbnQgaXJxOwotI2VuZGlmCi0KLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJvcGVuLXBpYyIpOwotCi0JaWYgKG5wID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KLQltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKLQkJCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCisJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2FsbG9jKE5VTEwsIDAsCisJCQlNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAogCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwotCW9mX25vZGVfcHV0KG5wKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAotI2lmZGVmIENPTkZJR19DUE0yCi0JLyogU2V0dXAgQ1BNMiBQSUMgKi8KLQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsY3BtMi1waWMiKTsKLQlpZiAobnAgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlBJQyBpbml0OiBjYW4gbm90IGZpbmQgZnNsLGNwbTItcGljIG5vZGVcbiIpOwotCQlyZXR1cm47Ci0JfQotCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQotCWNwbTJfcGljX2luaXQobnApOwotCW9mX25vZGVfcHV0KG5wKTsKLQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihpcnEsIGNwbTJfY2FzY2FkZSk7Ci0jZW5kaWYKKwltcGM4NXh4X2NwbTJfcGljX2luaXQoKTsKIH0KIAogI2lmZGVmIENPTkZJR19DUE0yCkBAIC0yMTUsMjIgKzE3MSw3IEBACiAJc2VxX3ByaW50ZihtLCAiUExMIHNldHRpbmdcdDogMHgleFxuIiwgKChwaGlkMSA+PiAyNCkgJiAweDNmKSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgb2ZfYnVzX2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC50eXBlID0gInNpbXBsZS1idXMiLCB9LAotCXsgLm5hbWUgPSAiY3BtIiwgfSwKLQl7IC5uYW1lID0gImxvY2FsYnVzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCi17Ci0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG9mX2J1c19pZHMsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChrc2k4NTYwLCBkZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOworbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwoa3NpODU2MCwgbXBjODV4eF9jb21tb25fcHVibGlzaF9kZXZpY2VzKTsKIAogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1MzZfZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NTM2X2RzLmMKaW5kZXggZjc5ZjJmMS4uY2YyNjY4MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1MzZfZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODUzNl9kcy5jCkBAIC0zMiwzMSArMzIsMTUgQEAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CiAKKyNpbmNsdWRlICJtcGM4NXh4LmgiCisKIHZvaWQgX19pbml0IG1wYzg1MzZfZHNfcGljX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbXBpYyAqbXBpYzsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAib3Blbi1waWMiKTsKLQlpZiAobnAgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIG9wZW4tcGljIG5vZGVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBtYXAgbXBpYyByZWdpc3RlciBzcGFjZVxuIik7Ci0JCW9mX25vZGVfcHV0KG5wKTsKLQkJcmV0dXJuOwotCX0KLQotCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LAotCQkJICBNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwKKwlzdHJ1Y3QgbXBpYyAqbXBpYyA9IG1waWNfYWxsb2MoTlVMTCwgMCwKKwkJCSAgTVBJQ19XQU5UU19SRVNFVCB8CiAJCQkgIE1QSUNfQklHX0VORElBTiB8IE1QSUNfQlJPS0VOX0ZSUl9OSVJRUywKIAkJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKLQlvZl9ub2RlX3B1dChucCk7Ci0KIAltcGljX2luaXQobXBpYyk7CiB9CiAKQEAgLTEwNCwxOSArODgsNyBAQAogCXByaW50aygiTVBDODUzNiBEUyBib2FyZCBmcm9tIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yXG4iKTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBtcGM4NTM2X2RzX2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgbXBjODUzNl9kc19wdWJsaXNoX2RldmljZXModm9pZCkKLXsKLQlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG1wYzg1MzZfZHNfaWRzLCBOVUxMKTsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzg1MzZfZHMsIG1wYzg1MzZfZHNfcHVibGlzaF9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzg1MzZfZHMsIG1wYzg1eHhfY29tbW9uX3B1Ymxpc2hfZGV2aWNlcyk7CiAKIG1hY2hpbmVfYXJjaF9pbml0Y2FsbChtcGM4NTM2X2RzLCBzd2lvdGxiX3NldHVwX2J1c19ub3RpZmllcik7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4LmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTdjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eC5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgTVBDODV4eF9ICisjZGVmaW5lIE1QQzg1eHhfSAorZXh0ZXJuIGludCBtcGM4NXh4X2NvbW1vbl9wdWJsaXNoX2RldmljZXModm9pZCk7CisKKyNpZmRlZiBDT05GSUdfQ1BNMgorZXh0ZXJuIHZvaWQgbXBjODV4eF9jcG0yX3BpY19pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2luaXQgbXBjODV4eF9jcG0yX3BpY19pbml0KHZvaWQpIHt9CisjZW5kaWYgLyogQ09ORklHX0NQTTIgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9hZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jCmluZGV4IDNiMmM5YmIuLjNiZWJiNTEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Fkcy5jCkBAIC0zNSw2ICszNSw4IEBACiAjaW5jbHVkZSA8c3lzZGV2L2NwbTJfcGljLmg+CiAjZW5kaWYKIAorI2luY2x1ZGUgIm1wYzg1eHguaCIKKwogI2lmZGVmIENPTkZJR19QQ0kKIHN0YXRpYyBpbnQgbXBjODV4eF9leGNsdWRlX2RldmljZShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UsCiAJCQkJICAgdV9jaGFyIGJ1cywgdV9jaGFyIGRldmZuKQpAQCAtNDYsNjMgKzQ4LDE1IEBACiB9CiAjZW5kaWYgLyogQ09ORklHX1BDSSAqLwogCi0jaWZkZWYgQ09ORklHX0NQTTIKLQotc3RhdGljIHZvaWQgY3BtMl9jYXNjYWRlKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKLQlpbnQgY2FzY2FkZV9pcnE7Ci0KLQl3aGlsZSAoKGNhc2NhZGVfaXJxID0gY3BtMl9nZXRfaXJxKCkpID49IDApCi0JCWdlbmVyaWNfaGFuZGxlX2lycShjYXNjYWRlX2lycSk7Ci0KLQljaGlwLT5pcnFfZW9pKCZkZXNjLT5pcnFfZGF0YSk7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfQ1BNMiAqLwotCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9hZHNfcGljX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbXBpYyAqbXBpYzsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKLSNpZmRlZiBDT05GSUdfQ1BNMgotCWludCBpcnE7Ci0jZW5kaWYKLQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJvcGVuLXBpYyIpOwotCWlmICghbnApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KLQltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKLQkJCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCisJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2FsbG9jKE5VTEwsIDAsCisJCQlNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAogCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwotCW9mX25vZGVfcHV0KG5wKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAotI2lmZGVmIENPTkZJR19DUE0yCi0JLyogU2V0dXAgQ1BNMiBQSUMgKi8KLQlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsY3BtMi1waWMiKTsKLQlpZiAobnAgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlBJQyBpbml0OiBjYW4gbm90IGZpbmQgZnNsLGNwbTItcGljIG5vZGVcbiIpOwotCQlyZXR1cm47Ci0JfQotCWlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5wLCAwKTsKLQotCWNwbTJfcGljX2luaXQobnApOwotCW9mX25vZGVfcHV0KG5wKTsKLQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihpcnEsIGNwbTJfY2FzY2FkZSk7Ci0jZW5kaWYKKwltcGM4NXh4X2NwbTJfcGljX2luaXQoKTsKIH0KIAogLyoKQEAgLTIyMSwyMyArMTc1LDcgQEAKIAlzZXFfcHJpbnRmKG0sICJQTEwgc2V0dGluZ1x0OiAweCV4XG4iLCAoKHBoaWQxID4+IDI0KSAmIDB4M2YpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBvZl9idXNfaWRzW10gPSB7Ci0JeyAubmFtZSA9ICJzb2MiLCB9LAotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5uYW1lID0gImNwbSIsIH0sCi0JeyAubmFtZSA9ICJsb2NhbGJ1cyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCi17Ci0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG9mX2J1c19pZHMsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4NXh4X2FkcywgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzg1eHhfYWRzLCBtcGM4NXh4X2NvbW1vbl9wdWJsaXNoX2RldmljZXMpOwogCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9jZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCmluZGV4IDY2Y2I4ZDYuLjQwZjAzZGEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2Nkcy5jCkBAIC00Niw2ICs0Niw4IEBACiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KICNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgogCisjaW5jbHVkZSAibXBjODV4eC5oIgorCiAvKiBDQURNVVMgaW5mbyAqLwogLyogeHh4IC0gZ2FsYWssIG1vdmUgaW50byBkZXZpY2UgdHJlZSAqLwogI2RlZmluZSBDQURNVVNfQkFTRSAoMHhmODAwNDAwMCkKQEAgLTE3Nyw3ICsxNzksNyBAQAogCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBtcGM4NXh4Y2RzXzgyNTlfaXJxYWN0aW9uID0gewogCS5oYW5kbGVyID0gbXBjODV4eF84MjU5X2Nhc2NhZGVfYWN0aW9uLAotCS5mbGFncyA9IElSUUZfU0hBUkVELAorCS5mbGFncyA9IElSUUZfU0hBUkVEIHwgSVJRRl9OT19USFJFQUQsCiAJLm5hbWUgPSAiODI1OSBjYXNjYWRlIiwKIH07CiAjZW5kaWYgLyogUFBDX0k4MjU5ICovCkBAIC0xODYsMzAgKzE4OCwxMCBAQAogc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfY2RzX3BpY19pbml0KHZvaWQpCiB7CiAJc3RydWN0IG1waWMgKm1waWM7Ci0Jc3RydWN0IHJlc291cmNlIHI7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7Ci0KLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAib3Blbi1waWMiKTsKLQotCWlmIChucCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGZpbmQgb3Blbi1waWMgbm9kZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIHRvIG1hcCBtcGljIHJlZ2lzdGVyIHNwYWNlXG4iKTsKLQkJb2Zfbm9kZV9wdXQobnApOwotCQlyZXR1cm47Ci0JfQotCi0JbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCi0JCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAorCW1waWMgPSBtcGljX2FsbG9jKE5VTEwsIDAsCisJCQlNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAogCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwotCi0JLyogUmV0dXJuIHRoZSBtcGljIG5vZGUgKi8KLQlvZl9ub2RlX3B1dChucCk7Ci0KIAltcGljX2luaXQobXBpYyk7CiB9CiAKQEAgLTMzMCwxOSArMzEyLDcgQEAKICAgICAgICAgcmV0dXJuIG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiTVBDODV4eENEUyIpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG9mX2J1c19pZHNbXSA9IHsKLQl7IC50eXBlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQotewotCXJldHVybiBvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgb2ZfYnVzX2lkcywgTlVMTCk7Ci19Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4NXh4X2NkcywgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzg1eHhfY2RzLCBtcGM4NXh4X2NvbW1vbl9wdWJsaXNoX2RldmljZXMpOwogCiBkZWZpbmVfbWFjaGluZShtcGM4NXh4X2NkcykgewogCS5uYW1lCQk9ICJNUEM4NXh4IENEUyIsCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfZHMuYwppbmRleCAxYjlhOGNmLi5lZWZiYjkxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9kcy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X2RzLmMKQEAgLTM1LDYgKzM1LDkgQEAKIAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlICJzbXAuaCIKKworI2luY2x1ZGUgIm1wYzg1eHguaCIKIAogI3VuZGVmIERFQlVHCiAKQEAgLTYwLDQzICs2MywyNyBAQAogdm9pZCBfX2luaXQgbXBjODV4eF9kc19waWNfaW5pdCh2b2lkKQogewogCXN0cnVjdCBtcGljICptcGljOwotCXN0cnVjdCByZXNvdXJjZSByOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJc3RydWN0IGRldmljZV9ub2RlICpjYXNjYWRlX25vZGUgPSBOVUxMOwogCWludCBjYXNjYWRlX2lycTsKICNlbmRpZgogCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKIAotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7Ci0JaWYgKG5wID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KIAlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsTVBDODU3MkRTLUNBTVAiKSkgewotCQltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKLQkJCU1QSUNfUFJJTUFSWSB8CisJCW1waWMgPSBtcGljX2FsbG9jKE5VTEwsIDAsCiAJCQlNUElDX0JJR19FTkRJQU4gfCBNUElDX0JST0tFTl9GUlJfTklSUVMgfAogCQkJTVBJQ19TSU5HTEVfREVTVF9DUFUsCiAJCQkwLCAyNTYsICIgT3BlblBJQyAgIik7CiAJfSBlbHNlIHsKLQkJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCi0JCQkgIE1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfAorCQltcGljID0gbXBpY19hbGxvYyhOVUxMLCAwLAorCQkJICBNUElDX1dBTlRTX1JFU0VUIHwKIAkJCSAgTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19CUk9LRU5fRlJSX05JUlFTIHwKIAkJCSAgTVBJQ19TSU5HTEVfREVTVF9DUFUsCiAJCQkwLCAyNTYsICIgT3BlblBJQyAgIik7CiAJfQogCiAJQlVHX09OKG1waWMgPT0gTlVMTCk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCiAJbXBpY19pbml0KG1waWMpOwogCiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQpAQCAtMTUyLDkgKzEzOSw2IEBACiAvKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQogICovCi0jaWZkZWYgQ09ORklHX1NNUAotZXh0ZXJuIHZvaWQgX19pbml0IG1wYzg1eHhfc21wX2luaXQodm9pZCk7Ci0jZW5kaWYKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4NXh4X2RzX3NldHVwX2FyY2godm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUENJCkBAIC0xODcsOSArMTcxLDcgQEAKIAlwcGNfbWQucGNpX2V4Y2x1ZGVfZGV2aWNlID0gbXBjODV4eF9leGNsdWRlX2RldmljZTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NNUAogCW1wYzg1eHhfc21wX2luaXQoKTsKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NXSU9UTEIKIAlpZiAobWVtYmxvY2tfZW5kX29mX0RSQU0oKSA+IG1heCkgewpAQCAtMjE5LDIxICsyMDEsOSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG1wYzg1eHhkc19pZHNbXSA9IHsKLQl7IC50eXBlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IG1wYzg1eHhkc19wdWJsaXNoX2RldmljZXModm9pZCkKLXsKLQlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG1wYzg1eHhkc19pZHMsIE5VTEwpOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODU0NF9kcywgbXBjODV4eGRzX3B1Ymxpc2hfZGV2aWNlcyk7Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4NTcyX2RzLCBtcGM4NXh4ZHNfcHVibGlzaF9kZXZpY2VzKTsKLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAyMDIwX2RzLCBtcGM4NXh4ZHNfcHVibGlzaF9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzg1NDRfZHMsIG1wYzg1eHhfY29tbW9uX3B1Ymxpc2hfZGV2aWNlcyk7CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChtcGM4NTcyX2RzLCBtcGM4NXh4X2NvbW1vbl9wdWJsaXNoX2RldmljZXMpOworbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwocDIwMjBfZHMsIG1wYzg1eHhfY29tbW9uX3B1Ymxpc2hfZGV2aWNlcyk7CiAKIG1hY2hpbmVfYXJjaF9pbml0Y2FsbChtcGM4NTQ0X2RzLCBzd2lvdGxiX3NldHVwX2J1c19ub3RpZmllcik7CiBtYWNoaW5lX2FyY2hfaW5pdGNhbGwobXBjODU3Ml9kcywgc3dpb3RsYl9zZXR1cF9idXNfbm90aWZpZXIpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfbWRzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYwppbmRleCBhMjNhM2ZmLi4xZDE1YTBjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvbXBjODV4eF9tZHMuYwpAQCAtNTEsNiArNTEsOSBAQAogI2luY2x1ZGUgPGFzbS9xZV9pYy5oPgogI2luY2x1ZGUgPGFzbS9tcGljLmg+CiAjaW5jbHVkZSA8YXNtL3N3aW90bGIuaD4KKyNpbmNsdWRlICJzbXAuaCIKKworI2luY2x1ZGUgIm1wYzg1eHguaCIKIAogI3VuZGVmIERFQlVHCiAjaWZkZWYgREVCVUcKQEAgLTE1MywzMCArMTU2LDcgQEAKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKICAqCiAgKi8KLSNpZmRlZiBDT05GSUdfU01QCi1leHRlcm4gdm9pZCBfX2luaXQgbXBjODV4eF9zbXBfaW5pdCh2b2lkKTsKLSNlbmRpZgotCiAjaWZkZWYgQ09ORklHX1FVSUNDX0VOR0lORQotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjODV4eF9xZV9pZHNbXSBfX2luaXRkYXRhID0gewotCXsgLnR5cGUgPSAicWUiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZnNsLHFlIiwgfSwKLQl7IH0sCi19OwotCi1zdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9wdWJsaXNoX3FlX2RldmljZXModm9pZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLHFlIik7Ci0JaWYgKCFvZl9kZXZpY2VfaXNfYXZhaWxhYmxlKG5wKSkgewotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgbXBjODV4eF9xZV9pZHMsIE5VTEwpOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9tZHNfcmVzZXRfdWNjX3BoeXModm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwpAQCAtMzQ3LDcgKzMyNyw2IEBACiAJb2Zfbm9kZV9wdXQobnApOwogfQogI2Vsc2UKLXN0YXRpYyB2b2lkIF9faW5pdCBtcGM4NXh4X3B1Ymxpc2hfcWVfZGV2aWNlcyh2b2lkKSB7IH0KIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4NXh4X21kc19xZV9pbml0KHZvaWQpIHsgfQogc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfbWRzX3FlaWNfaW5pdCh2b2lkKSB7IH0KICNlbmRpZgkvKiBDT05GSUdfUVVJQ0NfRU5HSU5FICovCkBAIC0zODEsOSArMzYwLDcgQEAKIAl9CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TTVAKIAltcGM4NXh4X3NtcF9pbml0KCk7Ci0jZW5kaWYKIAogCW1wYzg1eHhfbWRzX3FlX2luaXQoKTsKIApAQCAtNDI5LDI0ICs0MDYsMTEgQEAKIG1hY2hpbmVfYXJjaF9pbml0Y2FsbChtcGM4NTY5X21kcywgYm9hcmRfZml4dXBzKTsKIAogc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgbXBjODV4eF9pZHNbXSA9IHsKLQl7IC50eXBlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImZzbCxyYXBpZGlvLWRlbHRhIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImZzbCxtcGM4NTQ4LWd1dHMiLCB9LAogCXsgLmNvbXBhdGlibGUgPSAiZ3Bpby1sZWRzIiwgfSwKIAl7fSwKIH07CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHAxMDIxX2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAotCXt9LAotfTsKLQogc3RhdGljIGludCBfX2luaXQgbXBjODV4eF9wdWJsaXNoX2RldmljZXModm9pZCkKIHsKIAlpZiAobWFjaGluZV9pcyhtcGM4NTY4X21kcykpCkBAIC00NTQsMjMgKzQxOCwxNSBAQAogCWlmIChtYWNoaW5lX2lzKG1wYzg1NjlfbWRzKSkKIAkJc2ltcGxlX2dwaW9jaGlwX2luaXQoImZzbCxtcGM4NTY5bWRzLWJjc3ItZ3BpbyIpOwogCisJbXBjODV4eF9jb21tb25fcHVibGlzaF9kZXZpY2VzKCk7CiAJb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG1wYzg1eHhfaWRzLCBOVUxMKTsKLQltcGM4NXh4X3B1Ymxpc2hfcWVfZGV2aWNlcygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHAxMDIxX3B1Ymxpc2hfZGV2aWNlcyh2b2lkKQotewotCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBwMTAyMV9pZHMsIE5VTEwpOwotCW1wYzg1eHhfcHVibGlzaF9xZV9kZXZpY2VzKCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwobXBjODU2OF9tZHMsIG1wYzg1eHhfcHVibGlzaF9kZXZpY2VzKTsKIG1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKG1wYzg1NjlfbWRzLCBtcGM4NXh4X3B1Ymxpc2hfZGV2aWNlcyk7Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChwMTAyMV9tZHMsIHAxMDIxX3B1Ymxpc2hfZGV2aWNlcyk7CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChwMTAyMV9tZHMsIG1wYzg1eHhfY29tbW9uX3B1Ymxpc2hfZGV2aWNlcyk7CiAKIG1hY2hpbmVfYXJjaF9pbml0Y2FsbChtcGM4NTY4X21kcywgc3dpb3RsYl9zZXR1cF9idXNfbm90aWZpZXIpOwogbWFjaGluZV9hcmNoX2luaXRjYWxsKG1wYzg1NjlfbWRzLCBzd2lvdGxiX3NldHVwX2J1c19ub3RpZmllcik7CkBAIC00NzgsMjYgKzQzNCwxMSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBjODV4eF9tZHNfcGljX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbXBpYyAqbXBpYzsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKLQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7Ci0JaWYgKCFucCkKLQkJcmV0dXJuOwotCi0JaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBtYXAgbXBpYyByZWdpc3RlciBzcGFjZVxuIik7Ci0JCW9mX25vZGVfcHV0KG5wKTsKLQkJcmV0dXJuOwotCX0KLQotCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LAotCQkJTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiB8CisJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2FsbG9jKE5VTEwsIDAsCisJCQlNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOIHwKIAkJCU1QSUNfQlJPS0VOX0ZSUl9OSVJRUyB8IE1QSUNfU0lOR0xFX0RFU1RfQ1BVLAogCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwotCW9mX25vZGVfcHV0KG5wKTsKIAogCW1waWNfaW5pdChtcGljKTsKIAltcGM4NXh4X21kc19xZWljX2luaXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9tcGM4NXh4X3JkYi5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfcmRiLmMKaW5kZXggZjVmZjkxMS4uY2NmNTIwZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfcmRiLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L21wYzg1eHhfcmRiLmMKQEAgLTI5LDYgKzI5LDkgQEAKIAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlICJzbXAuaCIKKworI2luY2x1ZGUgIm1wYzg1eHguaCIKIAogI3VuZGVmIERFQlVHCiAKQEAgLTQyLDQ5ICs0NSwyOCBAQAogdm9pZCBfX2luaXQgbXBjODV4eF9yZGJfcGljX2luaXQodm9pZCkKIHsKIAlzdHJ1Y3QgbXBpYyAqbXBpYzsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwogCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKIAotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7Ci0JaWYgKG5wID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KIAlpZiAob2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJmc2wsTVBDODVYWFJEQi1DQU1QIikpIHsKLQkJbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCi0JCQlNUElDX1BSSU1BUlkgfAorCQltcGljID0gbXBpY19hbGxvYyhOVUxMLCAwLAogCQkJTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19CUk9LRU5fRlJSX05JUlFTIHwKIAkJCU1QSUNfU0lOR0xFX0RFU1RfQ1BVLAogCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCX0gZWxzZSB7Ci0JCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LAotCQkgIE1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfAorCQltcGljID0gbXBpY19hbGxvYyhOVUxMLCAwLAorCQkgIE1QSUNfV0FOVFNfUkVTRVQgfAogCQkgIE1QSUNfQklHX0VORElBTiB8IE1QSUNfQlJPS0VOX0ZSUl9OSVJRUyB8CiAJCSAgTVBJQ19TSU5HTEVfREVTVF9DUFUsCiAJCSAgMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCX0KIAogCUJVR19PTihtcGljID09IE5VTEwpOwotCW9mX25vZGVfcHV0KG5wKTsKLQogCW1waWNfaW5pdChtcGljKTsKLQogfQogCiAvKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQogICovCi0jaWZkZWYgQ09ORklHX1NNUAotZXh0ZXJuIHZvaWQgX19pbml0IG1wYzg1eHhfc21wX2luaXQodm9pZCk7Ci0jZW5kaWYKIHN0YXRpYyB2b2lkIF9faW5pdCBtcGM4NXh4X3JkYl9zZXR1cF9hcmNoKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1BDSQpAQCAtMTAyLDI3ICs4NCwxMiBAQAogCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19TTVAKIAltcGM4NXh4X3NtcF9pbml0KCk7Ci0jZW5kaWYKLQogCXByaW50ayhLRVJOX0lORk8gIk1QQzg1eHggUkRCIGJvYXJkIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG1wYzg1eHhyZGJfaWRzW10gPSB7Ci0JeyAudHlwZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZ2lhbmZhciIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBtcGM4NXh4cmRiX3B1Ymxpc2hfZGV2aWNlcyh2b2lkKQotewotCXJldHVybiBvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgbXBjODV4eHJkYl9pZHMsIE5VTEwpOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwocDIwMjBfcmRiLCBtcGM4NXh4cmRiX3B1Ymxpc2hfZGV2aWNlcyk7Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChwMTAyMF9yZGIsIG1wYzg1eHhyZGJfcHVibGlzaF9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAyMDIwX3JkYiwgbXBjODV4eF9jb21tb25fcHVibGlzaF9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAxMDIwX3JkYiwgbXBjODV4eF9jb21tb25fcHVibGlzaF9kZXZpY2VzKTsKIAogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDEwcmRiLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMTByZGIuYwppbmRleCBkNzM4N2ZhLi41MzhiYzNmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMTByZGIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMTByZGIuYwpAQCAtMjgsMzMgKzI4LDE4IEBACiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KICNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgogCisjaW5jbHVkZSAibXBjODV4eC5oIgorCiB2b2lkIF9faW5pdCBwMTAxMF9yZGJfcGljX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbXBpYyAqbXBpYzsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAib3Blbi1waWMiKTsKLQlpZiAobnAgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIG9wZW4tcGljIG5vZGVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBtYXAgbXBpYyByZWdpc3RlciBzcGFjZVxuIik7Ci0JCW9mX25vZGVfcHV0KG5wKTsKLQkJcmV0dXJuOwotCX0KLQotCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LCBNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwKLQkgIE1QSUNfQklHX0VORElBTiB8IE1QSUNfQlJPS0VOX0ZSUl9OSVJRUyB8IE1QSUNfU0lOR0xFX0RFU1RfQ1BVLAorCXN0cnVjdCBtcGljICptcGljID0gbXBpY19hbGxvYyhOVUxMLCAwLAorCSAgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiB8CisJICBNUElDX0JST0tFTl9GUlJfTklSUVMgfCBNUElDX1NJTkdMRV9ERVNUX0NQVSwKIAkgIDAsIDI1NiwgIiBPcGVuUElDICAiKTsKIAogCUJVR19PTihtcGljID09IE5VTEwpOwotCW9mX25vZGVfcHV0KG5wKTsKIAogCW1waWNfaW5pdChtcGljKTsKLQogfQogCiAKQEAgLTgxLDE4ICs2Niw3IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAiUDEwMTAgUkRCIGJvYXJkIGZyb20gRnJlZXNjYWxlIFNlbWljb25kdWN0b3JcbiIpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIHAxMDEwcmRiX2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHAxMDEwcmRiX3B1Ymxpc2hfZGV2aWNlcyh2b2lkKQotewotCXJldHVybiBvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgcDEwMTByZGJfaWRzLCBOVUxMKTsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAxMDEwX3JkYiwgcDEwMTByZGJfcHVibGlzaF9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAxMDEwX3JkYiwgbXBjODV4eF9jb21tb25fcHVibGlzaF9kZXZpY2VzKTsKIG1hY2hpbmVfYXJjaF9pbml0Y2FsbChwMTAxMF9yZGIsIHN3aW90bGJfc2V0dXBfYnVzX25vdGlmaWVyKTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyMl9kcy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKaW5kZXggZmRhMTU3MS4uYmIzZDg0ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIyX2RzLmMKQEAgLTI2LDYgKzI2LDkgQEAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2ZzbF9ndXRzLmg+CisjaW5jbHVkZSAic21wLmgiCisKKyNpbmNsdWRlICJtcGM4NXh4LmgiCiAKICNpZiBkZWZpbmVkKENPTkZJR19GQl9GU0xfRElVKSB8fCBkZWZpbmVkKENPTkZJR19GQl9GU0xfRElVX01PRFVMRSkKIApAQCAtMjM4LDM4ICsyNDEsMTUgQEAKIAogdm9pZCBfX2luaXQgcDEwMjJfZHNfcGljX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbXBpYyAqbXBpYzsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAib3Blbi1waWMiKTsKLQlpZiAoIW5wKSB7Ci0JCXByX2VycigiQ291bGQgbm90IGZpbmQgb3Blbi1waWMgbm9kZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnIpKSB7Ci0JCXByX2VycigiRmFpbGVkIHRvIG1hcCBtcGljIHJlZ2lzdGVyIHNwYWNlXG4iKTsKLQkJb2Zfbm9kZV9wdXQobnApOwotCQlyZXR1cm47Ci0JfQotCi0JbXBpYyA9IG1waWNfYWxsb2MobnAsIHIuc3RhcnQsCi0JCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfAorCXN0cnVjdCBtcGljICptcGljID0gbXBpY19hbGxvYyhOVUxMLCAwLAorCQlNUElDX1dBTlRTX1JFU0VUIHwKIAkJTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19CUk9LRU5fRlJSX05JUlFTIHwKIAkJTVBJQ19TSU5HTEVfREVTVF9DUFUsCiAJCTAsIDI1NiwgIiBPcGVuUElDICAiKTsKLQogCUJVR19PTihtcGljID09IE5VTEwpOwotCW9mX25vZGVfcHV0KG5wKTsKLQogCW1waWNfaW5pdChtcGljKTsKIH0KIAotI2lmZGVmIENPTkZJR19TTVAKLXZvaWQgX19pbml0IG1wYzg1eHhfc21wX2luaXQodm9pZCk7Ci0jZW5kaWYKLQogLyoKICAqIFNldHVwIHRoZSBhcmNoaXRlY3R1cmUKICAqLwpAQCAtMzA5LDkgKzI4OSw3IEBACiAJZGl1X29wcy52YWxpZF9tb25pdG9yX3BvcnQJPSBwMTAyMmRzX3ZhbGlkX21vbml0b3JfcG9ydDsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NNUAogCW1wYzg1eHhfc21wX2luaXQoKTsKLSNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NXSU9UTEIKIAlpZiAobWVtYmxvY2tfZW5kX29mX0RSQU0oKSA+IG1heCkgewpAQCAtMzI1LDEwICszMDMsNiBAQAogfQogCiBzdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIHAxMDIyX2RzX2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAogCS8qIFNvIHRoYXQgdGhlIERNQSBjaGFubmVsIG5vZGVzIGNhbiBiZSBwcm9iZWQgaW5kaXZpZHVhbGx5OiAqLwogCXsgLmNvbXBhdGlibGUgPSAiZnNsLGVsb3BsdXMtZG1hIiwgfSwKIAl7fSwKQEAgLTMzNiw2ICszMTAsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwMTAyMl9kc19wdWJsaXNoX2RldmljZXModm9pZCkKIHsKKwltcGM4NXh4X2NvbW1vbl9wdWJsaXNoX2RldmljZXMoKTsKIAlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIHAxMDIyX2RzX2lkcywgTlVMTCk7CiB9CiBtYWNoaW5lX2RldmljZV9pbml0Y2FsbChwMTAyMl9kcywgcDEwMjJfZHNfcHVibGlzaF9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyM19yZHMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9wMTAyM19yZHMuYwppbmRleCA4MzVlMGIzLi5kOTUxZTcwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvcDEwMjNfcmRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3AxMDIzX3Jkcy5jCkBAIC0zMCwxOSArMzAsMTggQEAKICNpbmNsdWRlIDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS91ZGJnLmg+CiAjaW5jbHVkZSA8YXNtL21waWMuaD4KKyNpbmNsdWRlICJzbXAuaCIKIAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KIAorI2luY2x1ZGUgIm1wYzg1eHguaCIKKwogLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogU2V0dXAgdGhlIGFyY2hpdGVjdHVyZQogICoKICAqLwotI2lmZGVmIENPTkZJR19TTVAKLXZvaWQgX19pbml0IG1wYzg1eHhfc21wX2luaXQodm9pZCk7Ci0jZW5kaWYKLQogc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfcmRzX3NldHVwX2FyY2godm9pZCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwpAQCAtODcsNTMgKzg2LDE5IEBACiAJCWZzbF9hZGRfYnJpZGdlKG5wLCAwKTsKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NNUAogCW1wYzg1eHhfc21wX2luaXQoKTsKLSNlbmRpZgogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBwMTAyM19pZHNbXSA9IHsKLQl7IC50eXBlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzb2MiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0Je30sCi19OwotCi0KLXN0YXRpYyBpbnQgX19pbml0IHAxMDIzX3B1Ymxpc2hfZGV2aWNlcyh2b2lkKQotewotCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBwMTAyM19pZHMsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAxMDIzX3JkcywgcDEwMjNfcHVibGlzaF9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHAxMDIzX3JkcywgbXBjODV4eF9jb21tb25fcHVibGlzaF9kZXZpY2VzKTsKIAogc3RhdGljIHZvaWQgX19pbml0IG1wYzg1eHhfcmRzX3BpY19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IG1waWMgKm1waWM7Ci0Jc3RydWN0IHJlc291cmNlIHI7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7Ci0KLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJvcGVuLXBpYyIpOwotCWlmICghbnApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KLQltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKLQkJTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiB8CisJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2FsbG9jKE5VTEwsIDAsCisJCU1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4gfAogCQlNUElDX0JST0tFTl9GUlJfTklSUVMgfCBNUElDX1NJTkdMRV9ERVNUX0NQVSwKIAkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCiAJQlVHX09OKG1waWMgPT0gTlVMTCk7Ci0Jb2Zfbm9kZV9wdXQobnApOwogCiAJbXBpY19pbml0KG1waWMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NDguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTQ4LmMKaW5kZXggMTQ2MzJhOS4uMTg0YTUwNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NDguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU0OC5jCkBAIC00OCwzNSArNDgsMTYgQEAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CiAKKyNpbmNsdWRlICJtcGM4NXh4LmgiCisKIHN0YXRpYyBpbnQgc2JjX3JldjsKIAogc3RhdGljIHZvaWQgX19pbml0IHNiYzg1NDhfcGljX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgbXBpYyAqbXBpYzsKLQlzdHJ1Y3QgcmVzb3VyY2UgcjsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gTlVMTDsKLQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUobnAsICJvcGVuLXBpYyIpOwotCi0JaWYgKG5wID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KLQltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKLQkJCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCisJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2FsbG9jKE5VTEwsIDAsCisJCQlNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAogCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwotCi0JLyogUmV0dXJuIHRoZSBtcGljIG5vZGUgKi8KLQlvZl9ub2RlX3B1dChucCk7Ci0KIAltcGljX2luaXQobXBpYyk7CiB9CiAKQEAgLTE0OSwyMSArMTMwLDcgQEAKIAlzZXFfcHJpbnRmKG0sICJQTEwgc2V0dGluZ1x0OiAweCV4XG4iLCAoKHBoaWQxID4+IDI0KSAmIDB4M2YpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBvZl9idXNfaWRzW10gPSB7Ci0JeyAubmFtZSA9ICJzb2MiLCB9LAotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZ2lhbmZhciIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBkZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKLXsKLQlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgb2ZfYnVzX2lkcywgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHNiYzg1NDgsIGRlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChzYmM4NTQ4LCBtcGM4NXh4X2NvbW1vbl9wdWJsaXNoX2RldmljZXMpOwogCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NiYzg1NjAuYwppbmRleCBjZWJkNzg2Li45NDA3NTJlIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc2JjODU2MC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zYmM4NTYwLmMKQEAgLTMyLDY4ICszMiwyMiBAQAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KIAorI2luY2x1ZGUgIm1wYzg1eHguaCIKKwogI2lmZGVmIENPTkZJR19DUE0yCiAjaW5jbHVkZSA8YXNtL2NwbTIuaD4KICNpbmNsdWRlIDxzeXNkZXYvY3BtMl9waWMuaD4KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX0NQTTIKLQotc3RhdGljIHZvaWQgY3BtMl9jYXNjYWRlKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLQlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKLQlpbnQgY2FzY2FkZV9pcnE7Ci0KLQl3aGlsZSAoKGNhc2NhZGVfaXJxID0gY3BtMl9nZXRfaXJxKCkpID49IDApCi0JCWdlbmVyaWNfaGFuZGxlX2lycShjYXNjYWRlX2lycSk7Ci0KLQljaGlwLT5pcnFfZW9pKCZkZXNjLT5pcnFfZGF0YSk7Ci19Ci0KLSNlbmRpZiAvKiBDT05GSUdfQ1BNMiAqLwotCiBzdGF0aWMgdm9pZCBfX2luaXQgc2JjODU2MF9waWNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBtcGljICptcGljOwotCXN0cnVjdCByZXNvdXJjZSByOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOwotI2lmZGVmIENPTkZJR19DUE0yCi0JaW50IGlycTsKLSNlbmRpZgotCi0JbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShucCwgIm9wZW4tcGljIik7Ci0JaWYgKCFucCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIG9wZW4tcGljIG5vZGVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBtYXAgbXBpYyByZWdpc3RlciBzcGFjZVxuIik7Ci0JCW9mX25vZGVfcHV0KG5wKTsKLQkJcmV0dXJuOwotCX0KLQotCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LAotCQkJTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKKwlzdHJ1Y3QgbXBpYyAqbXBpYyA9IG1waWNfYWxsb2MoTlVMTCwgMCwKKwkJCU1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCiAJCQkwLCAyNTYsICIgT3BlblBJQyAgIik7CiAJQlVHX09OKG1waWMgPT0gTlVMTCk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCiAJbXBpY19pbml0KG1waWMpOwogCi0jaWZkZWYgQ09ORklHX0NQTTIKLQkvKiBTZXR1cCBDUE0yIFBJQyAqLwotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxjcG0yLXBpYyIpOwotCWlmIChucCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUElDIGluaXQ6IGNhbiBub3QgZmluZCBmc2wsY3BtMi1waWMgbm9kZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCi0JY3BtMl9waWNfaW5pdChucCk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCWlycV9zZXRfY2hhaW5lZF9oYW5kbGVyKGlycSwgY3BtMl9jYXNjYWRlKTsKLSNlbmRpZgorCW1wYzg1eHhfY3BtMl9waWNfaW5pdCgpOwogfQogCiAvKgpAQCAtMjA4LDIzICsxNjIsNyBAQAogCXNlcV9wcmludGYobSwgIlBMTCBzZXR0aW5nXHQ6IDB4JXhcbiIsICgocGhpZDEgPj4gMjQpICYgMHgzZikpOwogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIG9mX2J1c19pZHNbXSA9IHsKLQl7IC5uYW1lID0gInNvYyIsIH0sCi0JeyAudHlwZSA9ICJzb2MiLCB9LAotCXsgLm5hbWUgPSAiY3BtIiwgfSwKLQl7IC5uYW1lID0gImxvY2FsYnVzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZ2lhbmZhciIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBkZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXModm9pZCkKLXsKLQlvZl9wbGF0Zm9ybV9idXNfcHJvYmUoTlVMTCwgb2ZfYnVzX2lkcywgTlVMTCk7Ci0KLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHNiYzg1NjAsIGRlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyk7CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChzYmM4NTYwLCBtcGM4NXh4X2NvbW1vbl9wdWJsaXNoX2RldmljZXMpOwogCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmMKaW5kZXggMmRmNDc4NS4uZmY0MjQ5MCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuYwpAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KICNpbmNsdWRlIDxzeXNkZXYvbXBpYy5oPgorI2luY2x1ZGUgInNtcC5oIgogCiBleHRlcm4gdm9pZCBfX2Vhcmx5X3N0YXJ0KHZvaWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc21wLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJiNDQ5MwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zbXAuaApAQCAtMCwwICsxLDE1IEBACisjaWZuZGVmIFBPV0VSUENfODVYWF9TTVBfSF8KKyNkZWZpbmUgUE9XRVJQQ184NVhYX1NNUF9IXyAxCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNpZmRlZiBDT05GSUdfU01QCit2b2lkIF9faW5pdCBtcGM4NXh4X3NtcF9pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGM4NXh4X3NtcF9pbml0KHZvaWQpCit7CisJLyogTm90aGluZyB0byBkbyAqLworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBub3QgUE9XRVJQQ184NVhYX1NNUF9IXyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3NvY3JhdGVzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc29jcmF0ZXMuYwppbmRleCA3NDdkOGZiLi4xOGY2MzU5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc29jcmF0ZXMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc29jcmF0ZXMuYwpAQCAtNDEsMzIgKzQxLDE3IEBACiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9zb2MuaD4KICNpbmNsdWRlIDxzeXNkZXYvZnNsX3BjaS5oPgogCisjaW5jbHVkZSAibXBjODV4eC5oIgogI2luY2x1ZGUgInNvY3JhdGVzX2ZwZ2FfcGljLmgiCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzb2NyYXRlc19waWNfaW5pdCh2b2lkKQogewotCXN0cnVjdCBtcGljICptcGljOwotCXN0cnVjdCByZXNvdXJjZSByOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAKLQlucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJvcGVuLXBpYyIpOwotCWlmICghbnApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KLQltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKLQkJCU1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCisJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2FsbG9jKE5VTEwsIDAsCisJCQlNUElDX1dBTlRTX1JFU0VUIHwgTVBJQ19CSUdfRU5ESUFOLAogCQkJMCwgMjU2LCAiIE9wZW5QSUMgICIpOwogCUJVR19PTihtcGljID09IE5VTEwpOwotCW9mX25vZGVfcHV0KG5wKTsKLQogCW1waWNfaW5pdChtcGljKTsKIAogCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImFiYixzb2NyYXRlcy1mcGdhLXBpYyIpOwpAQCAtOTYsMTcgKzgxLDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIHNvY3JhdGVzX29mX2J1c19pZHNbXSA9IHsKLQl7IC5jb21wYXRpYmxlID0gInNpbXBsZS1idXMiLCB9LAotCXsgLmNvbXBhdGlibGUgPSAiZ2lhbmZhciIsIH0sCi0Je30sCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBzb2NyYXRlc19wdWJsaXNoX2RldmljZXModm9pZCkKLXsKLQlyZXR1cm4gb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIHNvY3JhdGVzX29mX2J1c19pZHMsIE5VTEwpOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwoc29jcmF0ZXMsIHNvY3JhdGVzX3B1Ymxpc2hfZGV2aWNlcyk7CittYWNoaW5lX2RldmljZV9pbml0Y2FsbChzb2NyYXRlcywgbXBjODV4eF9jb21tb25fcHVibGlzaF9kZXZpY2VzKTsKIAogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3N0eF9ncDMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC9zdHhfZ3AzLmMKaW5kZXggNTM4N2U5Zi4uZTllNTIzNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3N0eF9ncDMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvc3R4X2dwMy5jCkBAIC00MCw3MCArNDAsMjEgQEAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CiAKKyNpbmNsdWRlICJtcGM4NXh4LmgiCisKICNpZmRlZiBDT05GSUdfQ1BNMgogI2luY2x1ZGUgPGFzbS9jcG0yLmg+Ci0jaW5jbHVkZSA8c3lzZGV2L2NwbTJfcGljLmg+Ci0KLXN0YXRpYyB2b2lkIGNwbTJfY2FzY2FkZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7Ci0JaW50IGNhc2NhZGVfaXJxOwotCi0Jd2hpbGUgKChjYXNjYWRlX2lycSA9IGNwbTJfZ2V0X2lycSgpKSA+PSAwKQotCQlnZW5lcmljX2hhbmRsZV9pcnEoY2FzY2FkZV9pcnEpOwotCi0JY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwotfQogI2VuZGlmIC8qIENPTkZJR19DUE0yICovCiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzdHhfZ3AzX3BpY19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IG1waWMgKm1waWM7Ci0Jc3RydWN0IHJlc291cmNlIHI7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLSNpZmRlZiBDT05GSUdfQ1BNMgotCWludCBpcnE7Ci0jZW5kaWYKLQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7Ci0JaWYgKCFucCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIG9wZW4tcGljIG5vZGVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBtYXAgbXBpYyByZWdpc3RlciBzcGFjZVxuIik7Ci0JCW9mX25vZGVfcHV0KG5wKTsKLQkJcmV0dXJuOwotCX0KLQotCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LAotCQkJTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKKwlzdHJ1Y3QgbXBpYyAqbXBpYyA9IG1waWNfYWxsb2MoTlVMTCwgMCwKKwkJCU1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCiAJCQkwLCAyNTYsICIgT3BlblBJQyAgIik7CiAJQlVHX09OKG1waWMgPT0gTlVMTCk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCiAJbXBpY19pbml0KG1waWMpOwogCi0jaWZkZWYgQ09ORklHX0NQTTIKLQkvKiBTZXR1cCBDUE0yIFBJQyAqLwotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxjcG0yLXBpYyIpOwotCWlmIChucCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUElDIGluaXQ6IGNhbiBub3QgZmluZCBmc2wsY3BtMi1waWMgbm9kZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCi0JaWYgKGlycSA9PSBOT19JUlEpIHsKLQkJb2Zfbm9kZV9wdXQobnApOwotCQlwcmludGsoS0VSTl9FUlIgIlBJQyBpbml0OiBnb3Qgbm8gSVJRIGZvciBjcG0gY2FzY2FkZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQljcG0yX3BpY19pbml0KG5wKTsKLQlvZl9ub2RlX3B1dChucCk7Ci0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoaXJxLCBjcG0yX2Nhc2NhZGUpOwotI2VuZGlmCisJbXBjODV4eF9jcG0yX3BpY19pbml0KCk7CiB9CiAKIC8qCkBAIC0xNDQsMTkgKzk1LDcgQEAKIAlzZXFfcHJpbnRmKG0sICJQTEwgc2V0dGluZ1x0OiAweCV4XG4iLCAoKHBoaWQxID4+IDI0KSAmIDB4M2YpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBvZl9kZXZpY2VfaWQgX19pbml0ZGF0YSBvZl9idXNfaWRzW10gPSB7Ci0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKHZvaWQpCi17Ci0Jb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIG9mX2J1c19pZHMsIE5VTEwpOwotCi0JcmV0dXJuIDA7Ci19Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbChzdHhfZ3AzLCBkZWNsYXJlX29mX3BsYXRmb3JtX2RldmljZXMpOworbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwoc3R4X2dwMywgbXBjODV4eF9jb21tb25fcHVibGlzaF9kZXZpY2VzKTsKIAogLyoKICAqIENhbGxlZCB2ZXJ5IGVhcmx5LCBkZXZpY2UtdHJlZSBpc24ndCB1bmZsYXR0ZW5lZApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC90cW04NXh4LmMKaW5kZXggMzI1ZGU3Ny4uYmY3Yzg5ZiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3RxbTg1eHguYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg1eHgvdHFtODV4eC5jCkBAIC0zOCw3MCArMzgsMjEgQEAKICNpbmNsdWRlIDxzeXNkZXYvZnNsX3NvYy5oPgogI2luY2x1ZGUgPHN5c2Rldi9mc2xfcGNpLmg+CiAKKyNpbmNsdWRlICJtcGM4NXh4LmgiCisKICNpZmRlZiBDT05GSUdfQ1BNMgogI2luY2x1ZGUgPGFzbS9jcG0yLmg+Ci0jaW5jbHVkZSA8c3lzZGV2L2NwbTJfcGljLmg+Ci0KLXN0YXRpYyB2b2lkIGNwbTJfY2FzY2FkZSh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IGlycV9jaGlwICpjaGlwID0gaXJxX2Rlc2NfZ2V0X2NoaXAoZGVzYyk7Ci0JaW50IGNhc2NhZGVfaXJxOwotCi0Jd2hpbGUgKChjYXNjYWRlX2lycSA9IGNwbTJfZ2V0X2lycSgpKSA+PSAwKQotCQlnZW5lcmljX2hhbmRsZV9pcnEoY2FzY2FkZV9pcnEpOwotCi0JY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwotfQogI2VuZGlmIC8qIENPTkZJR19DUE0yICovCiAKIHN0YXRpYyB2b2lkIF9faW5pdCB0cW04NXh4X3BpY19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IG1waWMgKm1waWM7Ci0Jc3RydWN0IHJlc291cmNlIHI7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLSNpZmRlZiBDT05GSUdfQ1BNMgotCWludCBpcnE7Ci0jZW5kaWYKLQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7Ci0JaWYgKCFucCkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBmaW5kIG9wZW4tcGljIG5vZGVcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBtYXAgbXBpYyByZWdpc3RlciBzcGFjZVxuIik7Ci0JCW9mX25vZGVfcHV0KG5wKTsKLQkJcmV0dXJuOwotCX0KLQotCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LAotCQkJTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8IE1QSUNfQklHX0VORElBTiwKKwlzdHJ1Y3QgbXBpYyAqbXBpYyA9IG1waWNfYWxsb2MoTlVMTCwgMCwKKwkJCU1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4sCiAJCQkwLCAyNTYsICIgT3BlblBJQyAgIik7CiAJQlVHX09OKG1waWMgPT0gTlVMTCk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCiAJbXBpY19pbml0KG1waWMpOwogCi0jaWZkZWYgQ09ORklHX0NQTTIKLQkvKiBTZXR1cCBDUE0yIFBJQyAqLwotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImZzbCxjcG0yLXBpYyIpOwotCWlmIChucCA9PSBOVUxMKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiUElDIGluaXQ6IGNhbiBub3QgZmluZCBmc2wsY3BtMi1waWMgbm9kZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0JaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOwotCi0JaWYgKGlycSA9PSBOT19JUlEpIHsKLQkJb2Zfbm9kZV9wdXQobnApOwotCQlwcmludGsoS0VSTl9FUlIgIlBJQyBpbml0OiBnb3Qgbm8gSVJRIGZvciBjcG0gY2FzY2FkZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQljcG0yX3BpY19pbml0KG5wKTsKLQlvZl9ub2RlX3B1dChucCk7Ci0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoaXJxLCBjcG0yX2Nhc2NhZGUpOwotI2VuZGlmCisJbXBjODV4eF9jcG0yX3BpY19pbml0KCk7CiB9CiAKIC8qCkBAIC0xNzMsMTkgKzEyNCw3IEBACiBERUNMQVJFX1BDSV9GSVhVUF9IRUFERVIoUENJX1ZFTkRPUl9JRF9USSwgUENJX0RFVklDRV9JRF9USV8xNTIwLAogCQl0cW04NXh4X3RpMTUyMF9maXh1cCk7CiAKLXN0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGRhdGEgb2ZfYnVzX2lkc1tdID0gewotCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiwgfSwKLQl7fSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGRlY2xhcmVfb2ZfcGxhdGZvcm1fZGV2aWNlcyh2b2lkKQotewotCW9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCBvZl9idXNfaWRzLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwodHFtODV4eCwgZGVjbGFyZV9vZl9wbGF0Zm9ybV9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHRxbTg1eHgsIG1wYzg1eHhfY29tbW9uX3B1Ymxpc2hfZGV2aWNlcyk7CiAKIHN0YXRpYyBjb25zdCBjaGFyICpib2FyZFtdIF9faW5pdGRhdGEgPSB7CiAJInRxYyx0cW04NTQwIiwKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODV4eC94ZXNfbXBjODV4eC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3hlc19tcGM4NXh4LmMKaW5kZXggYTlkYzVlNy4uM2E2OWY4YiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3hlc19tcGM4NXh4LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84NXh4L3hlc19tcGM4NXh4LmMKQEAgLTMyLDYgKzMyLDkgQEAKIAogI2luY2x1ZGUgPHN5c2Rldi9mc2xfc29jLmg+CiAjaW5jbHVkZSA8c3lzZGV2L2ZzbF9wY2kuaD4KKyNpbmNsdWRlICJzbXAuaCIKKworI2luY2x1ZGUgIm1wYzg1eHguaCIKIAogLyogQSBmZXcgYml0IGRlZmluaXRpb25zIG5lZWRlZCBmb3IgZml4dXBzIG9uIHNvbWUgYm9hcmRzICovCiAjZGVmaW5lIE1QQzg1eHhfTDJDVExfTDJFCQkweDgwMDAwMDAwIC8qIEwyIGVuYWJsZSAqLwpAQCAtNDAsMjkgKzQzLDExIEBACiAKIHZvaWQgX19pbml0IHhlc19tcGM4NXh4X3BpY19pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IG1waWMgKm1waWM7Ci0Jc3RydWN0IHJlc291cmNlIHI7Ci0Jc3RydWN0IGRldmljZV9ub2RlICpucDsKLQotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7Ci0JaWYgKG5wID09IE5VTEwpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDb3VsZCBub3QgZmluZCBvcGVuLXBpYyBub2RlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcikpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIG1waWMgcmVnaXN0ZXIgc3BhY2VcbiIpOwotCQlvZl9ub2RlX3B1dChucCk7Ci0JCXJldHVybjsKLQl9Ci0KLQltcGljID0gbXBpY19hbGxvYyhucCwgci5zdGFydCwKLQkJCSAgTVBJQ19QUklNQVJZIHwgTVBJQ19XQU5UU19SRVNFVCB8CisJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2FsbG9jKE5VTEwsIDAsCisJCQkgIE1QSUNfV0FOVFNfUkVTRVQgfAogCQkJICBNUElDX0JJR19FTkRJQU4gfCBNUElDX0JST0tFTl9GUlJfTklSUVMsCiAJCQkwLCAyNTYsICIgT3BlblBJQyAgIik7CiAJQlVHX09OKG1waWMgPT0gTlVMTCk7Ci0Jb2Zfbm9kZV9wdXQobnApOwotCiAJbXBpY19pbml0KG1waWMpOwogfQogCkBAIC0xMzYsOSArMTIxLDYgQEAKIC8qCiAgKiBTZXR1cCB0aGUgYXJjaGl0ZWN0dXJlCiAgKi8KLSNpZmRlZiBDT05GSUdfU01QCi1leHRlcm4gdm9pZCBfX2luaXQgbXBjODV4eF9zbXBfaW5pdCh2b2lkKTsKLSNlbmRpZgogc3RhdGljIHZvaWQgX19pbml0IHhlc19tcGM4NXh4X3NldHVwX2FyY2godm9pZCkKIHsKICNpZmRlZiBDT05GSUdfUENJCkBAIC0xNzIsMjYgKzE1NCwxMiBAQAogCX0KICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1NNUAogCW1wYzg1eHhfc21wX2luaXQoKTsKLSNlbmRpZgogfQogCi1zdGF0aWMgc3RydWN0IG9mX2RldmljZV9pZCBfX2luaXRkYXRhIHhlc19tcGM4NXh4X2lkc1tdID0gewotCXsgLnR5cGUgPSAic29jIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gInNvYyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJzaW1wbGUtYnVzIiwgfSwKLQl7IC5jb21wYXRpYmxlID0gImdpYW5mYXIiLCB9LAotCXt9LAotfTsKLQotc3RhdGljIGludCBfX2luaXQgeGVzX21wYzg1eHhfcHVibGlzaF9kZXZpY2VzKHZvaWQpCi17Ci0JcmV0dXJuIG9mX3BsYXRmb3JtX2J1c19wcm9iZShOVUxMLCB4ZXNfbXBjODV4eF9pZHMsIE5VTEwpOwotfQotbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwoeGVzX21wYzg1NzIsIHhlc19tcGM4NXh4X3B1Ymxpc2hfZGV2aWNlcyk7Ci1tYWNoaW5lX2RldmljZV9pbml0Y2FsbCh4ZXNfbXBjODU0OCwgeGVzX21wYzg1eHhfcHVibGlzaF9kZXZpY2VzKTsKLW1hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHhlc19tcGM4NTQwLCB4ZXNfbXBjODV4eF9wdWJsaXNoX2RldmljZXMpOworbWFjaGluZV9kZXZpY2VfaW5pdGNhbGwoeGVzX21wYzg1NzIsIG1wYzg1eHhfY29tbW9uX3B1Ymxpc2hfZGV2aWNlcyk7CittYWNoaW5lX2RldmljZV9pbml0Y2FsbCh4ZXNfbXBjODU0OCwgbXBjODV4eF9jb21tb25fcHVibGlzaF9kZXZpY2VzKTsKK21hY2hpbmVfZGV2aWNlX2luaXRjYWxsKHhlc19tcGM4NTQwLCBtcGM4NXh4X2NvbW1vbl9wdWJsaXNoX2RldmljZXMpOwogCiAvKgogICogQ2FsbGVkIHZlcnkgZWFybHksIGRldmljZS10cmVlIGlzbid0IHVuZmxhdHRlbmVkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvbXBjODZ4eF9ocGNuLmMKaW5kZXggYjExYzM1My4uNTY5MjYyYyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L21wYzg2eHhfaHBjbi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9tcGM4Nnh4X2hwY24uYwpAQCAtMTYxLDcgKzE2MSw3IEBACiAKIHN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfYnVzX2lkc1tdID0gewogCXsgLmNvbXBhdGlibGUgPSAic2ltcGxlLWJ1cyIsIH0sCi0JeyAuY29tcGF0aWJsZSA9ICJmc2wscmFwaWRpby1kZWx0YSIsIH0sCisJeyAuY29tcGF0aWJsZSA9ICJmc2wsc3JpbyIsIH0sCiAJeyAuY29tcGF0aWJsZSA9ICJnaWFuZmFyIiwgfSwKIAl7fSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zLzg2eHgvcGljLmMKaW5kZXggOGVmODk2MC4uNTJiYmZhMCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy84Nnh4L3BpYy5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvODZ4eC9waWMuYwpAQCAtMzEsMjYgKzMxLDE2IEBACiAKIHZvaWQgX19pbml0IG1wYzg2eHhfaW5pdF9pcnEodm9pZCkKIHsKLQlzdHJ1Y3QgbXBpYyAqbXBpYzsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOwotCXN0cnVjdCByZXNvdXJjZSByZXM7CiAjaWZkZWYgQ09ORklHX1BQQ19JODI1OQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CiAJc3RydWN0IGRldmljZV9ub2RlICpjYXNjYWRlX25vZGUgPSBOVUxMOwogCWludCBjYXNjYWRlX2lycTsKICNlbmRpZgogCi0JLyogRGV0ZXJtaW5lIFBJQyBhZGRyZXNzLiAqLwotCW5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7Ci0JaWYgKG5wID09IE5VTEwpCi0JCXJldHVybjsKLQlvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcmVzKTsKLQotCW1waWMgPSBtcGljX2FsbG9jKG5wLCByZXMuc3RhcnQsCi0JCQlNUElDX1BSSU1BUlkgfCBNUElDX1dBTlRTX1JFU0VUIHwKLQkJCU1QSUNfQklHX0VORElBTiB8IE1QSUNfQlJPS0VOX0ZSUl9OSVJRUyB8Ci0JCQlNUElDX1NJTkdMRV9ERVNUX0NQVSwKKwlzdHJ1Y3QgbXBpYyAqbXBpYyA9IG1waWNfYWxsb2MoTlVMTCwgMCwKKwkJCU1QSUNfV0FOVFNfUkVTRVQgfCBNUElDX0JJR19FTkRJQU4gfAorCQkJTVBJQ19CUk9LRU5fRlJSX05JUlFTIHwgTVBJQ19TSU5HTEVfREVTVF9DUFUsCiAJCQkwLCAyNTYsICIgTVBJQyAgICAgIik7Ci0Jb2Zfbm9kZV9wdXQobnApOwogCUJVR19PTihtcGljID09IE5VTEwpOwogCiAJbXBpY19pbml0KG1waWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnCmluZGV4IDNmZTZkOTIuLjMxZTFhZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcKQEAgLTIxMSw2ICsyMTEsMTIgQEAKIAogZW5kbWVudQogCittZW51ICJDUFVJZGxlIGRyaXZlciIKKworc291cmNlICJkcml2ZXJzL2NwdWlkbGUvS2NvbmZpZyIKKworZW5kbWVudQorCiBjb25maWcgUFBDNjAxX1NZTkNfRklYCiAJYm9vbCAiV29ya2Fyb3VuZHMgZm9yIFBQQzYwMSBidWdzIgogCWRlcGVuZHMgb24gNnh4ICYmIChQUENfUFJFUCB8fCBQUENfUE1BQykKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKaW5kZXggZmJlY2FlMC4uNDI1ZGIxOCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9LY29uZmlnLmNwdXR5cGUKQEAgLTE3NCw3ICsxNzQsNiBAQAogY29uZmlnIEZTTF9CT09LRQogCWJvb2wKIAlkZXBlbmRzIG9uIChFMjAwIHx8IEU1MDApICYmIFBQQzMyCi0Jc2VsZWN0IFNZU19TVVBQT1JUU19IVUdFVExCRlMgaWYgUEhZU182NEJJVAogCWRlZmF1bHQgeQogCiAjIHRoaXMgaXMgZm9yIGNvbW1vbiBjb2RlIGJldHdlZW4gUFBDMzIgJiBQUEM2NCBGU0wgQk9PS0UKQEAgLTE4Miw2ICsxODEsNyBAQAogCWJvb2wKIAlzZWxlY3QgRlNMX0VNQl9QRVJGTU9OCiAJc2VsZWN0IFBQQ19TTVBfTVVYRURfSVBJCisJc2VsZWN0IFNZU19TVVBQT1JUU19IVUdFVExCRlMgaWYgUEhZU182NEJJVCB8fCBQUEM2NAogCWRlZmF1bHQgeSBpZiBGU0xfQk9PS0UKIAogY29uZmlnIFBURV82NEJJVApAQCAtMjM2LDcgKzIzNiw3IEBACiAKIGNvbmZpZyBQUENfSUNTV1gKIAlib29sICJTdXBwb3J0IGZvciBQb3dlclBDIGljc3d4IGNvcHJvY2Vzc29yIGluc3RydWN0aW9uIgotCWRlcGVuZHMgb24gUE9XRVI0CisJZGVwZW5kcyBvbiBQT1dFUjQgfHwgUFBDX0EyCiAJZGVmYXVsdCBuCiAJLS0taGVscC0tLQogCkBAIC0yNTIsNiArMjUyLDI1IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTiBoZXJlLgogCitjb25maWcgUFBDX0lDU1dYX1BJRAorCWJvb2wgImljc3d4IHJlcXVpcmVzIGRpcmVjdCBQSUQgbWFuYWdlbWVudCIKKwlkZXBlbmRzIG9uIFBQQ19JQ1NXWCAmJiBQT1dFUjQKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBUaGUgUElEIHJlZ2lzdGVyIGluIHNlcnZlciBpcyB1c2VkIGV4cGxpY2l0bHkgZm9yIElDU1dYLiAgSW4KKwkgIGVtYmVkZGVkIHN5c3RlbXMgUElEIG1hbmFnbWVudCBpcyBkb25lIGJ5IHRoZSBzeXN0ZW0uCisKK2NvbmZpZyBQUENfSUNTV1hfVVNFX1NJR0lMTAorCWJvb2wgIlNob3VsZCBhIGJhZCBDVCBjYXVzZSBhIFNJR0lMTD8iCisJZGVwZW5kcyBvbiBQUENfSUNTV1gKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJICBTaG91bGQgYSBiYWQgQ1QgdXNlZCBmb3IgIm5vbi1yZWNvcmQgZm9ybSBJQ1NXWCIgY2F1c2UgYW4KKwkgIGlsbGVnYWwgaW50cnVjdGlvbiBzaWduYWwgb3Igc2hvdWxkIGl0IGJlIHNpbGVudCBhcworCSAgYXJjaGl0ZWN0ZWQuCisKKwkgIElmIGluIGRvdWJ0LCBzYXkgTiBoZXJlLgorCiBjb25maWcgU1BFCiAJYm9vbCAiU1BFIFN1cHBvcnQiCiAJZGVwZW5kcyBvbiBFMjAwIHx8IChFNTAwICYmICFQUENfRTUwME1DKQpAQCAtMjkwLDcgKzMwOSw3IEBACiAKIGNvbmZpZyBQUENfTU1fU0xJQ0VTCiAJYm9vbAotCWRlZmF1bHQgeSBpZiAoUFBDNjQgJiYgSFVHRVRMQl9QQUdFKSB8fCAoUFBDX1NURF9NTVVfNjQgJiYgUFBDXzY0S19QQUdFUykKKwlkZWZhdWx0IHkgaWYgKCFQUENfRlNMX0JPT0szRSAmJiBQUEM2NCAmJiBIVUdFVExCX1BBR0UpIHx8IChQUENfU1REX01NVV82NCAmJiBQUENfNjRLX1BBR0VTKQogCWRlZmF1bHQgbgogCiBjb25maWcgVklSVF9DUFVfQUNDT1VOVElORwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwppbmRleCA1OTJjM2Q1Li5hZTlmYzdiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvaW9tbXUuYwpAQCAtMTAzNyw2ICsxMDM3LDggQEAKIAogCS8qIFRoZSBmaXhlZCBtYXBwaW5nIGlzIG9ubHkgc3VwcG9ydGVkIG9uIGF4b24gbWFjaGluZXMgKi8KIAlucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5VTEwsICJheG9uIik7CisJb2Zfbm9kZV9wdXQobnApOworCiAJaWYgKCFucCkgewogCQlwcl9kZWJ1ZygiaW9tbXU6IGZpeGVkIG1hcHBpbmcgZGlzYWJsZWQsIG5vIGF4b25zIGZvdW5kXG4iKTsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jZWxsL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYwppbmRleCAwZmM5YjcyLi42MjAwMmE3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NlbGwvc2V0dXAuYwpAQCAtMTg0LDI0ICsxODQsMTAgQEAKIH0KIG1hY2hpbmVfc3Vic3lzX2luaXRjYWxsKGNlbGwsIGNlbGxfcHVibGlzaF9kZXZpY2VzKTsKIAotc3RhdGljIHZvaWQgY2VsbF9tcGljX2Nhc2NhZGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQotewotCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOwotCXN0cnVjdCBtcGljICptcGljID0gaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKLQl1bnNpZ25lZCBpbnQgdmlycTsKLQotCXZpcnEgPSBtcGljX2dldF9vbmVfaXJxKG1waWMpOwotCWlmICh2aXJxICE9IE5PX0lSUSkKLQkJZ2VuZXJpY19oYW5kbGVfaXJxKHZpcnEpOwotCi0JY2hpcC0+aXJxX2VvaSgmZGVzYy0+aXJxX2RhdGEpOwotfQotCiBzdGF0aWMgdm9pZCBfX2luaXQgbXBpY19pbml0X0lSUSh2b2lkKQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG47CiAJc3RydWN0IG1waWMgKm1waWM7Ci0JdW5zaWduZWQgaW50IHZpcnE7CiAKIAlmb3IgKGRuID0gTlVMTDsKIAkgICAgIChkbiA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKGRuLCAiaW50ZXJydXB0LWNvbnRyb2xsZXIiKSk7KSB7CkBAIC0yMTEsMTkgKzE5NywxMCBAQAogCQkvKiBUaGUgTVBJQyBkcml2ZXIgd2lsbCBnZXQgZXZlcnl0aGluZyBpdCBuZWVkcyBmcm9tIHRoZQogCQkgKiBkZXZpY2UtdHJlZSwganVzdCBwYXNzIDAgdG8gYWxsIGFyZ3VtZW50cwogCQkgKi8KLQkJbXBpYyA9IG1waWNfYWxsb2MoZG4sIDAsIDAsIDAsIDAsICIgTVBJQyAgICAgIik7CisJCW1waWMgPSBtcGljX2FsbG9jKGRuLCAwLCBNUElDX1NFQ09OREFSWSwgMCwgMCwgIiBNUElDICAgICAiKTsKIAkJaWYgKG1waWMgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCQltcGljX2luaXQobXBpYyk7Ci0KLQkJdmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRuLCAwKTsKLQkJaWYgKHZpcnEgPT0gTk9fSVJRKQotCQkJY29udGludWU7Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXMgOiBob29raW5nIHVwIHRvIElSUSAlZFxuIiwKLQkJICAgICAgIGRuLT5mdWxsX25hbWUsIHZpcnEpOwotCQlpcnFfc2V0X2hhbmRsZXJfZGF0YSh2aXJxLCBtcGljKTsKLQkJaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIodmlycSwgY2VsbF9tcGljX2Nhc2NhZGUpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9jaHJwL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYwppbmRleCAxMjI3ODY0Li5mMWYxN2JiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2NocnAvc2V0dXAuYwpAQCAtNDM1LDggKzQzNSw3IEBACiAJaWYgKGxlbiA+IDEpCiAJCWlzdV9zaXplID0gaXJhbmdlc1szXTsKIAotCWNocnBfbXBpYyA9IG1waWNfYWxsb2MobnAsIG9wYWRkciwgTVBJQ19QUklNQVJZLAotCQkJICAgICAgIGlzdV9zaXplLCAwLCAiIE1QSUMgICAgIik7CisJY2hycF9tcGljID0gbXBpY19hbGxvYyhucCwgb3BhZGRyLCAwLCBpc3Vfc2l6ZSwgMCwgIiBNUElDICAgICIpOwogCWlmIChjaHJwX21waWMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBhbGxvY2F0ZSBNUElDIHN0cnVjdHVyZVxuIik7CiAJCWdvdG8gYmFpbDsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvaG9sbHkuYwppbmRleCAyZTliY2Y2Li45Y2ZjZjIwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2hvbGx5LmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9ob2xseS5jCkBAIC0xNDgsMzAgKzE0OCwxNCBAQAogc3RhdGljIHZvaWQgX19pbml0IGhvbGx5X2luaXRfSVJRKHZvaWQpCiB7CiAJc3RydWN0IG1waWMgKm1waWM7Ci0JcGh5c19hZGRyX3QgbXBpY19wYWRkciA9IDA7Ci0Jc3RydWN0IGRldmljZV9ub2RlICp0c2lfcGljOwogI2lmZGVmIENPTkZJR19QQ0kKIAl1bnNpZ25lZCBpbnQgY2FzY2FkZV9wY2lfaXJxOwogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdHNpX3BjaTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNhc2NhZGVfbm9kZSA9IE5VTEw7CiAjZW5kaWYKIAotCXRzaV9waWMgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAib3Blbi1waWMiKTsKLQlpZiAodHNpX3BpYykgewotCQl1bnNpZ25lZCBpbnQgc2l6ZTsKLQkJY29uc3Qgdm9pZCAqcHJvcCA9IG9mX2dldF9wcm9wZXJ0eSh0c2lfcGljLCAicmVnIiwgJnNpemUpOwotCQltcGljX3BhZGRyID0gb2ZfdHJhbnNsYXRlX2FkZHJlc3ModHNpX3BpYywgcHJvcCk7Ci0JfQotCi0JaWYgKG1waWNfcGFkZHIgPT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIiVzOiBObyB0c2kxMDggUElDIGZvdW5kICFcbiIsIF9fZnVuY19fKTsKLQkJcmV0dXJuOwotCX0KLQotCXByX2RlYnVnKCIlczogdHNpMTA4IHBpYyBwaHlzX2FkZHIgPSAweCV4XG4iLCBfX2Z1bmNfXywgKHUzMikgbXBpY19wYWRkcik7Ci0KLQltcGljID0gbXBpY19hbGxvYyh0c2lfcGljLCBtcGljX3BhZGRyLAotCQkJTVBJQ19QUklNQVJZIHwgTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19XQU5UU19SRVNFVCB8CisJbXBpYyA9IG1waWNfYWxsb2MoTlVMTCwgMCwKKwkJCU1QSUNfQklHX0VORElBTiB8IE1QSUNfV0FOVFNfUkVTRVQgfAogCQkJTVBJQ19TUFZfRU9JIHwgTVBJQ19OT19QVEhST1VfRElTIHwgTVBJQ19SRUdTRVRfVFNJMTA4LAogCQkJMjQsCiAJCQlOUl9JUlFTLTQsIC8qIG51bV9zb3VyY2VzIHVzZWQgKi8KQEAgLTE3OSw3ICsxNjMsNyBAQAogCiAJQlVHX09OKG1waWMgPT0gTlVMTCk7CiAKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMCwgbXBpY19wYWRkciArIDB4MTAwKTsKKwltcGljX2Fzc2lnbl9pc3UobXBpYywgMCwgbXBpYy0+cGFkZHIgKyAweDEwMCk7CiAKIAltcGljX2luaXQobXBpYyk7CiAKQEAgLTIwNCw3ICsxODgsNiBAQAogI2VuZGlmCiAJLyogQ29uZmlndXJlIE1QSUMgb3V0cHV0cyB0byBDUFUwICovCiAJdHNpMTA4X3dyaXRlX3JlZyhUU0kxMDhfTVBJQ19PRkZTRVQgKyAweDMwYywgMCk7Ci0Jb2Zfbm9kZV9wdXQodHNpX3BpYyk7CiB9CiAKIHZvaWQgaG9sbHlfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbGlua3N0YXRpb24uYwppbmRleCAyNDRmOTk3Li5iY2ZhZDkyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L2xpbmtzdGF0aW9uLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9saW5rc3RhdGlvbi5jCkBAIC04MSwyOSArODEsMTkgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBsaW5rc3RhdGlvbl9pbml0X0lSUSh2b2lkKQogewogCXN0cnVjdCBtcGljICptcGljOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZG5wOwotCWNvbnN0IHUzMiAqcHJvcDsKLQlpbnQgc2l6ZTsKLQlwaHlzX2FkZHJfdCBwYWRkcjsKIAotCWRucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKE5VTEwsICJvcGVuLXBpYyIpOwotCWlmIChkbnAgPT0gTlVMTCkKLQkJcmV0dXJuOwotCi0JcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShkbnAsICJyZWciLCAmc2l6ZSk7Ci0JcGFkZHIgPSAocGh5c19hZGRyX3Qpb2ZfdHJhbnNsYXRlX2FkZHJlc3MoZG5wLCBwcm9wKTsKLQotCW1waWMgPSBtcGljX2FsbG9jKGRucCwgcGFkZHIsIE1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQsIDQsIDMyLCAiIEVQSUMgICAgICIpOworCW1waWMgPSBtcGljX2FsbG9jKE5VTEwsIDAsIE1QSUNfV0FOVFNfUkVTRVQsCisJCQk0LCAzMiwgIiBFUElDICAgICAiKTsKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAogCS8qIFBDSSBJUlFzICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHBhZGRyICsgMHgxMDIwMCk7CisJbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIG1waWMtPnBhZGRyICsgMHgxMDIwMCk7CiAKIAkvKiBJMkMgKi8KLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgcGFkZHIgKyAweDExMDAwKTsKKwltcGljX2Fzc2lnbl9pc3UobXBpYywgMSwgbXBpYy0+cGFkZHIgKyAweDExMDAwKTsKIAogCS8qIHR0eVMwLCB0dHlTMSAqLwotCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCBwYWRkciArIDB4MTExMDApOworCW1waWNfYXNzaWduX2lzdShtcGljLCAyLCBtcGljLT5wYWRkciArIDB4MTExMDApOwogCiAJbXBpY19pbml0KG1waWMpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvbXBjNzQ0OF9ocGMyLmMKaW5kZXggZjhmMzNlMS4uZjMzNTBkNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9tcGM3NDQ4X2hwYzIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L21wYzc0NDhfaHBjMi5jCkBAIC0xMDIsMzEgKzEwMiwxNCBAQAogc3RhdGljIHZvaWQgX19pbml0IG1wYzc0NDhfaHBjMl9pbml0X0lSUSh2b2lkKQogewogCXN0cnVjdCBtcGljICptcGljOwotCXBoeXNfYWRkcl90IG1waWNfcGFkZHIgPSAwOwotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqdHNpX3BpYzsKICNpZmRlZiBDT05GSUdfUENJCiAJdW5zaWduZWQgaW50IGNhc2NhZGVfcGNpX2lycTsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKnRzaV9wY2k7CiAJc3RydWN0IGRldmljZV9ub2RlICpjYXNjYWRlX25vZGUgPSBOVUxMOwogI2VuZGlmCiAKLQl0c2lfcGljID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7Ci0JaWYgKHRzaV9waWMpIHsKLQkJdW5zaWduZWQgaW50IHNpemU7Ci0JCWNvbnN0IHZvaWQgKnByb3AgPSBvZl9nZXRfcHJvcGVydHkodHNpX3BpYywgInJlZyIsICZzaXplKTsKLQkJbXBpY19wYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKHRzaV9waWMsIHByb3ApOwotCX0KLQotCWlmIChtcGljX3BhZGRyID09IDApIHsKLQkJcHJpbnRrKCIlczogTm8gdHNpMTA4IFBJQyBmb3VuZCAhXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlEQkcoIiVzOiB0c2kxMDggcGljIHBoeXNfYWRkciA9IDB4JXhcbiIsIF9fZnVuY19fLAotCSAgICAodTMyKSBtcGljX3BhZGRyKTsKLQotCW1waWMgPSBtcGljX2FsbG9jKHRzaV9waWMsIG1waWNfcGFkZHIsCi0JCQlNUElDX1BSSU1BUlkgfCBNUElDX0JJR19FTkRJQU4gfCBNUElDX1dBTlRTX1JFU0VUIHwKKwltcGljID0gbXBpY19hbGxvYyhOVUxMLCAwLAorCQkJTVBJQ19CSUdfRU5ESUFOIHwgTVBJQ19XQU5UU19SRVNFVCB8CiAJCQlNUElDX1NQVl9FT0kgfCBNUElDX05PX1BUSFJPVV9ESVMgfCBNUElDX1JFR1NFVF9UU0kxMDgsCiAJCQkyNCwKIAkJCU5SX0lSUVMtNCwgLyogbnVtX3NvdXJjZXMgdXNlZCAqLwpAQCAtMTM0LDcgKzExNyw3IEBACiAKIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAotCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCBtcGljX3BhZGRyICsgMHgxMDApOworCW1waWNfYXNzaWduX2lzdShtcGljLCAwLCBtcGljLT5wYWRkciArIDB4MTAwKTsKIAogCW1waWNfaW5pdChtcGljKTsKIApAQCAtMTU5LDcgKzE0Miw2IEBACiAjZW5kaWYKIAkvKiBDb25maWd1cmUgTVBJQyBvdXRwdXRzIHRvIENQVTAgKi8KIAl0c2kxMDhfd3JpdGVfcmVnKFRTSTEwOF9NUElDX09GRlNFVCArIDB4MzBjLCAwKTsKLQlvZl9ub2RlX3B1dCh0c2lfcGljKTsKIH0KIAogdm9pZCBtcGM3NDQ4X2hwYzJfc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvc3RvcmNlbnRlci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9zdG9yY2VudGVyLmMKaW5kZXggZjFlZWJjYS4uYWZhNjM4OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9zdG9yY2VudGVyLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC9zdG9yY2VudGVyLmMKQEAgLTgzLDM1ICs4MywxNyBAQAogc3RhdGljIHZvaWQgX19pbml0IHN0b3JjZW50ZXJfaW5pdF9JUlEodm9pZCkKIHsKIAlzdHJ1Y3QgbXBpYyAqbXBpYzsKLQlzdHJ1Y3QgZGV2aWNlX25vZGUgKmRucDsKLQljb25zdCB2b2lkICpwcm9wOwotCWludCBzaXplOwotCXBoeXNfYWRkcl90IHBhZGRyOwogCi0JZG5wID0gb2ZfZmluZF9ub2RlX2J5X3R5cGUoTlVMTCwgIm9wZW4tcGljIik7Ci0JaWYgKGRucCA9PSBOVUxMKQotCQlyZXR1cm47Ci0KLQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KGRucCwgInJlZyIsICZzaXplKTsKLQlpZiAocHJvcCA9PSBOVUxMKSB7Ci0JCW9mX25vZGVfcHV0KGRucCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwYWRkciA9IChwaHlzX2FkZHJfdClvZl90cmFuc2xhdGVfYWRkcmVzcyhkbnAsIHByb3ApOwotCW1waWMgPSBtcGljX2FsbG9jKGRucCwgcGFkZHIsIE1QSUNfUFJJTUFSWSB8IE1QSUNfV0FOVFNfUkVTRVQsCisJbXBpYyA9IG1waWNfYWxsb2MoTlVMTCwgMCwgTVBJQ19XQU5UU19SRVNFVCwKIAkJCTE2LCAzMiwgIiBPcGVuUElDICAiKTsKLQotCW9mX25vZGVfcHV0KGRucCk7Ci0KIAlCVUdfT04obXBpYyA9PSBOVUxMKTsKIAogCS8qCiAJICogMTYgU2VyaWFsIEludGVycnVwdHMgZm9sbG93ZWQgYnkgMTYgSW50ZXJuYWwgSW50ZXJydXB0cy4KIAkgKiBJMkMgaXMgdGhlIHNlY29uZCBpbnRlcm5hbCwgc28gaXQgaXMgYXQgMTcsIDB4MTEwMjAuCiAJICovCi0JbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIHBhZGRyICsgMHgxMDIwMCk7Ci0JbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIHBhZGRyICsgMHgxMTAwMCk7CisJbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIG1waWMtPnBhZGRyICsgMHgxMDIwMCk7CisJbXBpY19hc3NpZ25faXN1KG1waWMsIDEsIG1waWMtPnBhZGRyICsgMHgxMTAwMCk7CiAKIAltcGljX2luaXQobXBpYyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L3dpaS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9lbWJlZGRlZDZ4eC93aWkuYwppbmRleCAxYjVkYzFhLi42ZDhkYWRmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL2VtYmVkZGVkNnh4L3dpaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvZW1iZWRkZWQ2eHgvd2lpLmMKQEAgLTc5LDI0ICs3OSwxOSBAQAogCUJVR19PTihtZW1ibG9jay5tZW1vcnkuY250ICE9IDIpOwogCUJVR19PTighcGFnZV9hbGlnbmVkKHBbMF0uYmFzZSkgfHwgIXBhZ2VfYWxpZ25lZChwWzFdLmJhc2UpKTsKIAotCXBbMF0uc2l6ZSA9IF9BTElHTl9ET1dOKHBbMF0uc2l6ZSwgUEFHRV9TSVpFKTsKLQlwWzFdLnNpemUgPSBfQUxJR05fRE9XTihwWzFdLnNpemUsIFBBR0VfU0laRSk7CisJLyogdHJpbSB1bmFsaWduZWQgdGFpbCAqLworCW1lbWJsb2NrX3JlbW92ZShBTElHTihwWzFdLmJhc2UgKyBwWzFdLnNpemUsIFBBR0VfU0laRSksCisJCQkocGh5c19hZGRyX3QpVUxMT05HX01BWCk7CiAKLQl3aWlfaG9sZV9zdGFydCA9IHBbMF0uYmFzZSArIHBbMF0uc2l6ZTsKKwkvKiBkZXRlcm1pbmUgaG9sZSwgYWRkICYgcmVzZXJ2ZSB0aGVtICovCisJd2lpX2hvbGVfc3RhcnQgPSBBTElHTihwWzBdLmJhc2UgKyBwWzBdLnNpemUsIFBBR0VfU0laRSk7CiAJd2lpX2hvbGVfc2l6ZSA9IHBbMV0uYmFzZSAtIHdpaV9ob2xlX3N0YXJ0OwotCi0JcHJfaW5mbygiTUVNMTogPCUwOGxseCAlMDhsbHg+XG4iLCBwWzBdLmJhc2UsIHBbMF0uc2l6ZSk7Ci0JcHJfaW5mbygiSE9MRTogPCUwOGx4ICUwOGx4PlxuIiwgd2lpX2hvbGVfc3RhcnQsIHdpaV9ob2xlX3NpemUpOwotCXByX2luZm8oIk1FTTI6IDwlMDhsbHggJTA4bGx4PlxuIiwgcFsxXS5iYXNlLCBwWzFdLnNpemUpOwotCi0JcFswXS5zaXplICs9IHdpaV9ob2xlX3NpemUgKyBwWzFdLnNpemU7Ci0KLQltZW1ibG9jay5tZW1vcnkuY250ID0gMTsKLQltZW1ibG9ja19hbmFseXplKCk7Ci0KLQkvKiByZXNlcnZlIHRoZSBob2xlICovCisJbWVtYmxvY2tfYWRkKHdpaV9ob2xlX3N0YXJ0LCB3aWlfaG9sZV9zaXplKTsKIAltZW1ibG9ja19yZXNlcnZlKHdpaV9ob2xlX3N0YXJ0LCB3aWlfaG9sZV9zaXplKTsKIAorCUJVR19PTihtZW1ibG9jay5tZW1vcnkuY250ICE9IDEpOworCV9fbWVtYmxvY2tfZHVtcF9hbGwoKTsKKwogCS8qIGFsbG93IGlvcmVtYXBwaW5nIHRoZSBhZGRyZXNzIHNwYWNlIGluIHRoZSBob2xlICovCiAJX19hbGxvd19pb3JlbWFwX3Jlc2VydmVkID0gMTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvaXNlcmllcy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKaW5kZXggZWEwYWNiZC4uOGZjNjI1OCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9pc2VyaWVzL3NldHVwLmMKQEAgLTU2Myw3ICs1NjMsOCBAQAogc3RhdGljIHZvaWQgaXNlcmllc19zaGFyZWRfaWRsZSh2b2lkKQogewogCXdoaWxlICgxKSB7Ci0JCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soMSk7CisJCXRpY2tfbm9oel9pZGxlX2VudGVyKCk7CisJCXJjdV9pZGxlX2VudGVyKCk7CiAJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkgJiYgIWh2bHBldmVudF9pc19wZW5kaW5nKCkpIHsKIAkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCQlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKQEAgLTU3Nyw3ICs1NzgsOCBAQAogCQl9CiAKIAkJcHBjNjRfcnVubGF0Y2hfb24oKTsKLQkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljaygpOworCQlyY3VfaWRsZV9leGl0KCk7CisJCXRpY2tfbm9oel9pZGxlX2V4aXQoKTsKIAogCQlpZiAoaHZscGV2ZW50X2lzX3BlbmRpbmcoKSkKIAkJCXByb2Nlc3NfaVNlcmllc19ldmVudHMoKTsKQEAgLTU5Myw3ICs1OTUsOCBAQAogCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwogCiAJd2hpbGUgKDEpIHsKLQkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygxKTsKKwkJdGlja19ub2h6X2lkbGVfZW50ZXIoKTsKKwkJcmN1X2lkbGVfZW50ZXIoKTsKIAkJaWYgKCFuZWVkX3Jlc2NoZWQoKSkgewogCQkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewogCQkJCXBwYzY0X3J1bmxhdGNoX29mZigpOwpAQCAtNjEwLDcgKzYxMyw4IEBACiAJCX0KIAogCQlwcGM2NF9ydW5sYXRjaF9vbigpOwotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCXJjdV9pZGxlX2V4aXQoKTsKKwkJdGlja19ub2h6X2lkbGVfZXhpdCgpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvcGNpLmMKaW5kZXggZGQyZTQ4Yi4uNDAxZTNmMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3BjaS5jCkBAIC0yMDcsNiArMjA3LDU0IEBACiAJCXJldHVybiBob3NlLT5jZmdfZGF0YSArIHUzX2h0X2NmYTEoYnVzLCBkZXZmbiwgb2Zmc2V0KTsKIH0KIAorc3RhdGljIGludCB1M19odF9yb290X3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdTggb2Zmc2V0LAorCQkJCSAgaW50IGxlbiwgdTMyICp2YWwpCit7CisJdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyOworCisJYWRkciA9IGhvc2UtPmNmZ19hZGRyOworCWFkZHIgKz0gKChvZmZzZXQgJiB+MykgPDwgMikgKyAoNCAtIGxlbiAtIChvZmZzZXQgJiAzKSk7CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJKnZhbCA9IGluXzgoYWRkcik7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKnZhbCA9IGluX2JlMTYoYWRkcik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCSp2YWwgPSBpbl9iZTMyKGFkZHIpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCitzdGF0aWMgaW50IHUzX2h0X3Jvb3Rfd3JpdGVfY29uZmlnKHN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSwgdTggb2Zmc2V0LAorCQkJCSAgaW50IGxlbiwgdTMyIHZhbCkKK3sKKwl2b2xhdGlsZSB2b2lkIF9faW9tZW0gKmFkZHI7CisKKwlhZGRyID0gaG9zZS0+Y2ZnX2FkZHIgKyAoKG9mZnNldCAmIH4zKSA8PCAyKSArICg0IC0gbGVuIC0gKG9mZnNldCAmIDMpKTsKKworCWlmIChvZmZzZXQgPj0gUENJX0JBU0VfQUREUkVTU18wICYmIG9mZnNldCA8IFBDSV9DQVBBQklMSVRZX0xJU1QpCisJCXJldHVybiBQQ0lCSU9TX1NVQ0NFU1NGVUw7CisKKwlzd2l0Y2ggKGxlbikgeworCWNhc2UgMToKKwkJb3V0XzgoYWRkciwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlvdXRfYmUxNihhZGRyLCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlvdXRfYmUzMihhZGRyLCB2YWwpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gUENJQklPU19TVUNDRVNTRlVMOworfQorCiBzdGF0aWMgaW50IHUzX2h0X3JlYWRfY29uZmlnKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBkZXZmbiwKIAkJCSAgICAgaW50IG9mZnNldCwgaW50IGxlbiwgdTMyICp2YWwpCiB7CkBAIC0yMTcsNiArMjY1LDkgQEAKIAlpZiAoaG9zZSA9PSBOVUxMKQogCQlyZXR1cm4gUENJQklPU19ERVZJQ0VfTk9UX0ZPVU5EOwogCisJaWYgKGJ1cy0+bnVtYmVyID09IGhvc2UtPmZpcnN0X2J1c25vICYmIGRldmZuID09IFBDSV9ERVZGTigwLCAwKSkKKwkJcmV0dXJuIHUzX2h0X3Jvb3RfcmVhZF9jb25maWcoaG9zZSwgb2Zmc2V0LCBsZW4sIHZhbCk7CisKIAlpZiAob2Zmc2V0ID4gMHhmZikKIAkJcmV0dXJuIFBDSUJJT1NfQkFEX1JFR0lTVEVSX05VTUJFUjsKIApAQCAtMjUyLDYgKzMwMyw5IEBACiAJaWYgKGhvc2UgPT0gTlVMTCkKIAkJcmV0dXJuIFBDSUJJT1NfREVWSUNFX05PVF9GT1VORDsKIAorCWlmIChidXMtPm51bWJlciA9PSBob3NlLT5maXJzdF9idXNubyAmJiBkZXZmbiA9PSBQQ0lfREVWRk4oMCwgMCkpCisJCXJldHVybiB1M19odF9yb290X3dyaXRlX2NvbmZpZyhob3NlLCBvZmZzZXQsIGxlbiwgdmFsKTsKKwogCWlmIChvZmZzZXQgPiAweGZmKQogCQlyZXR1cm4gUENJQklPU19CQURfUkVHSVNURVJfTlVNQkVSOwogCkBAIC00MjgsNiArNDgyLDcgQEAKIAkgKiByZWdfcHJvcGVydHkgYW5kIHVzaW5nIHNvbWUgYWNjZXNzb3IgZnVuY3Rpb25zIGluc3RlYWQKIAkgKi8KIAlob3NlLT5jZmdfZGF0YSA9IGlvcmVtYXAoMHhmMjAwMDAwMCwgMHgwMjAwMDAwMCk7CisJaG9zZS0+Y2ZnX2FkZHIgPSBpb3JlbWFwKDB4ZjgwNzAwMDAsIDB4MTAwMCk7CiAKIAlob3NlLT5maXJzdF9idXNubyA9IDA7CiAJaG9zZS0+bGFzdF9idXNubyA9IDB4ZWY7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL21hcGxlL3NldHVwLmMKaW5kZXggNGMzNzIwNC4uMGJjYmZlNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9tYXBsZS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvbWFwbGUvc2V0dXAuYwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJdW5zaWduZWQgbG9uZyBvcGVucGljX2FkZHIgPSAwOwogCWludCBuYWRkciwgbiwgaSwgb3BwbGVuLCBoYXNfaXN1cyA9IDA7CiAJc3RydWN0IG1waWMgKm1waWM7Ci0JdW5zaWduZWQgaW50IGZsYWdzID0gTVBJQ19QUklNQVJZOworCXVuc2lnbmVkIGludCBmbGFncyA9IDA7CiAKIAkvKiBMb2NhdGUgTVBJQyBpbiB0aGUgZGV2aWNlLXRyZWUuIE5vdGUgdGhhdCB0aGVyZSBpcyBhIGJ1ZwogCSAqIGluIE1hcGxlIGRldmljZS10cmVlIHdoZXJlIHRoZSB0eXBlIG9mIHRoZSBjb250cm9sbGVyIGlzCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wYXNlbWkvc2V0dXAuYwppbmRleCA2ZjM1NTgyLi45OGI3YTdjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bhc2VtaS9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcGFzZW1pL3NldHVwLmMKQEAgLTIyNCw3ICsyMjQsNyBAQAogCW9wZW5waWNfYWRkciA9IG9mX3JlYWRfbnVtYmVyKG9wcHJvcCwgbmFkZHIpOwogCXByaW50ayhLRVJOX0RFQlVHICJPcGVuUElDIGFkZHI6ICVseFxuIiwgb3BlbnBpY19hZGRyKTsKIAotCW1waWNfZmxhZ3MgPSBNUElDX1BSSU1BUlkgfCBNUElDX0xBUkdFX1ZFQ1RPUlMgfCBNUElDX05PX0JJQVM7CisJbXBpY19mbGFncyA9IE1QSUNfTEFSR0VfVkVDVE9SUyB8IE1QSUNfTk9fQklBUzsKIAogCW5taXByb3AgPSBvZl9nZXRfcHJvcGVydHkobXBpY19ub2RlLCAibm1pLXNvdXJjZSIsIE5VTEwpOwogCWlmIChubWlwcm9wKQpAQCAtMjM0LDcgKzIzNCw3IEBACiAJCQkgIG1waWNfZmxhZ3MsIDAsIDAsICJQQVNFTUktT1BJQyIpOwogCUJVR19PTighbXBpYyk7CiAKLQltcGljX2Fzc2lnbl9pc3UobXBpYywgMCwgb3BlbnBpY19hZGRyICsgMHgxMDAwMCk7CisJbXBpY19hc3NpZ25faXN1KG1waWMsIDAsIG1waWMtPnBhZGRyICsgMHgxMDAwMCk7CiAJbXBpY19pbml0KG1waWMpOwogCS8qIFRoZSBOTUkvTUNLIHNvdXJjZSBuZWVkcyB0byBiZSBwcmlvIDE1ICovCiAJaWYgKG5taXByb3ApIHsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCmluZGV4IDkwMWJmYmQuLjc3NjFhYWIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYwpAQCAtNTIsMTMgKzUyLDggQEAKIC8qIERlZmF1bHQgYWRkcmVzc2VzICovCiBzdGF0aWMgdm9sYXRpbGUgc3RydWN0IHBtYWNfaXJxX2h3IF9faW9tZW0gKnBtYWNfaXJxX2h3WzRdOwogCi0jZGVmaW5lIEdDX0xFVkVMX01BU0sJCTB4M2ZmMDAwMDAKLSNkZWZpbmUgT0hBUkVfTEVWRUxfTUFTSwkweDFmZjAwMDAwCi0jZGVmaW5lIEhFQVRIUk9XX0xFVkVMX01BU0sJMHgxZmYwMDAwMAotCiBzdGF0aWMgaW50IG1heF9pcnFzOwogc3RhdGljIGludCBtYXhfcmVhbF9pcnFzOwotc3RhdGljIHUzMiBsZXZlbF9tYXNrWzRdOwogCiBzdGF0aWMgREVGSU5FX1JBV19TUElOTE9DSyhwbWFjX3BpY19sb2NrKTsKIApAQCAtMjE3LDggKzIxMiw3IEBACiAJZm9yIChpcnEgPSBtYXhfaXJxczsgKGlycSAtPSAzMikgPj0gbWF4X3JlYWxfaXJxczsgKSB7CiAJCWludCBpID0gaXJxID4+IDU7CiAJCWJpdHMgPSBpbl9sZTMyKCZwbWFjX2lycV9od1tpXS0+ZXZlbnQpIHwgcHBjX2xvc3RfaW50ZXJydXB0c1tpXTsKLQkJLyogV2UgbXVzdCByZWFkIGxldmVsIGludGVycnVwdHMgZnJvbSB0aGUgbGV2ZWwgcmVnaXN0ZXIgKi8KLQkJYml0cyB8PSAoaW5fbGUzMigmcG1hY19pcnFfaHdbaV0tPmxldmVsKSAmIGxldmVsX21hc2tbaV0pOworCQliaXRzIHw9IGluX2xlMzIoJnBtYWNfaXJxX2h3W2ldLT5sZXZlbCk7CiAJCWJpdHMgJj0gcHBjX2NhY2hlZF9pcnFfbWFza1tpXTsKIAkJaWYgKGJpdHMgPT0gMCkKIAkJCWNvbnRpbnVlOwpAQCAtMjQ4LDggKzI0Miw3IEBACiAJZm9yIChpcnEgPSBtYXhfcmVhbF9pcnFzOyAoaXJxIC09IDMyKSA+PSAwOyApIHsKIAkJaW50IGkgPSBpcnEgPj4gNTsKIAkJYml0cyA9IGluX2xlMzIoJnBtYWNfaXJxX2h3W2ldLT5ldmVudCkgfCBwcGNfbG9zdF9pbnRlcnJ1cHRzW2ldOwotCQkvKiBXZSBtdXN0IHJlYWQgbGV2ZWwgaW50ZXJydXB0cyBmcm9tIHRoZSBsZXZlbCByZWdpc3RlciAqLwotCQliaXRzIHw9IChpbl9sZTMyKCZwbWFjX2lycV9od1tpXS0+bGV2ZWwpICYgbGV2ZWxfbWFza1tpXSk7CisJCWJpdHMgfD0gaW5fbGUzMigmcG1hY19pcnFfaHdbaV0tPmxldmVsKTsKIAkJYml0cyAmPSBwcGNfY2FjaGVkX2lycV9tYXNrW2ldOwogCQlpZiAoYml0cyA9PSAwKQogCQkJY29udGludWU7CkBAIC0yODQsMTkgKzI3NywxNCBAQAogc3RhdGljIGludCBwbWFjX3BpY19ob3N0X21hcChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHVuc2lnbmVkIGludCB2aXJxLAogCQkJICAgICBpcnFfaHdfbnVtYmVyX3QgaHcpCiB7Ci0JaW50IGxldmVsOwotCiAJaWYgKGh3ID49IG1heF9pcnFzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIE1hcmsgbGV2ZWwgaW50ZXJydXB0cywgc2V0IGRlbGF5ZWQgZGlzYWJsZSBmb3IgZWRnZSBvbmVzIGFuZCBzZXQKIAkgKiBoYW5kbGVycwogCSAqLwotCWxldmVsID0gISEobGV2ZWxfbWFza1todyA+PiA1XSAmICgxVUwgPDwgKGh3ICYgMHgxZikpKTsKLQlpZiAobGV2ZWwpCi0JCWlycV9zZXRfc3RhdHVzX2ZsYWdzKHZpcnEsIElSUV9MRVZFTCk7Ci0JaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZwbWFjX3BpYywKLQkJCQkgbGV2ZWwgPyBoYW5kbGVfbGV2ZWxfaXJxIDogaGFuZGxlX2VkZ2VfaXJxKTsKKwlpcnFfc2V0X3N0YXR1c19mbGFncyh2aXJxLCBJUlFfTEVWRUwpOworCWlycV9zZXRfY2hpcF9hbmRfaGFuZGxlcih2aXJxLCAmcG1hY19waWMsIGhhbmRsZV9sZXZlbF9pcnEpOwogCXJldHVybiAwOwogfQogCkBAIC0zMzQsMjEgKzMyMiwxNCBAQAogCiAJaWYgKChtYXN0ZXIgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAiZ2MiKSkgIT0gTlVMTCkgewogCQltYXhfaXJxcyA9IG1heF9yZWFsX2lycXMgPSAzMjsKLQkJbGV2ZWxfbWFza1swXSA9IEdDX0xFVkVMX01BU0s7CiAJfSBlbHNlIGlmICgobWFzdGVyID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgIm9oYXJlIikpICE9IE5VTEwpIHsKIAkJbWF4X2lycXMgPSBtYXhfcmVhbF9pcnFzID0gMzI7Ci0JCWxldmVsX21hc2tbMF0gPSBPSEFSRV9MRVZFTF9NQVNLOwotCiAJCS8qIFdlIG1pZ2h0IGhhdmUgYSBzZWNvbmQgY2FzY2FkZWQgb2hhcmUgKi8KIAkJc2xhdmUgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAicGNpMTA2Yiw3Iik7Ci0JCWlmIChzbGF2ZSkgeworCQlpZiAoc2xhdmUpCiAJCQltYXhfaXJxcyA9IDY0OwotCQkJbGV2ZWxfbWFza1sxXSA9IE9IQVJFX0xFVkVMX01BU0s7Ci0JCX0KIAl9IGVsc2UgaWYgKChtYXN0ZXIgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAibWFjLWlvIikpICE9IE5VTEwpIHsKIAkJbWF4X2lycXMgPSBtYXhfcmVhbF9pcnFzID0gNjQ7Ci0JCWxldmVsX21hc2tbMF0gPSBIRUFUSFJPV19MRVZFTF9NQVNLOwotCQlsZXZlbF9tYXNrWzFdID0gMDsKIAogCQkvKiBXZSBtaWdodCBoYXZlIGEgc2Vjb25kIGNhc2NhZGVkIGhlYXRocm93ICovCiAJCXNsYXZlID0gb2ZfZmluZF9ub2RlX2J5X25hbWUobWFzdGVyLCAibWFjLWlvIik7CkBAIC0zNjMsMTEgKzM0NCw4IEBACiAJCX0KIAogCQkvKiBXZSBmb3VuZCBhIHNsYXZlICovCi0JCWlmIChzbGF2ZSkgeworCQlpZiAoc2xhdmUpCiAJCQltYXhfaXJxcyA9IDEyODsKLQkJCWxldmVsX21hc2tbMl0gPSBIRUFUSFJPV19MRVZFTF9NQVNLOwotCQkJbGV2ZWxfbWFza1szXSA9IDA7Ci0JCX0KIAl9CiAJQlVHX09OKG1hc3RlciA9PSBOVUxMKTsKIApAQCAtNDY0LDE4ICs0NDIsNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19QUEMzMiAqLwogCi1zdGF0aWMgdm9pZCBwbWFjX3UzX2Nhc2NhZGUodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjKQotewotCXN0cnVjdCBpcnFfY2hpcCAqY2hpcCA9IGlycV9kZXNjX2dldF9jaGlwKGRlc2MpOwotCXN0cnVjdCBtcGljICptcGljID0gaXJxX2Rlc2NfZ2V0X2hhbmRsZXJfZGF0YShkZXNjKTsKLQl1bnNpZ25lZCBpbnQgY2FzY2FkZV9pcnEgPSBtcGljX2dldF9vbmVfaXJxKG1waWMpOwotCi0JaWYgKGNhc2NhZGVfaXJxICE9IE5PX0lSUSkKLQkJZ2VuZXJpY19oYW5kbGVfaXJxKGNhc2NhZGVfaXJxKTsKLQotCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKLX0KLQogc3RhdGljIHZvaWQgX19pbml0IHBtYWNfcGljX3NldHVwX21waWNfbm1pKHN0cnVjdCBtcGljICptcGljKQogewogI2lmIGRlZmluZWQoQ09ORklHX1hNT04pICYmIGRlZmluZWQoQ09ORklHX1BQQzMyKQpAQCAtNDk4LDE0ICs0NjQsOCBAQAogCQkJCQkJaW50IG1hc3RlcikKIHsKIAljb25zdCBjaGFyICpuYW1lID0gbWFzdGVyID8gIiBNUElDIDEgICAiIDogIiBNUElDIDIgICAiOwotCXN0cnVjdCByZXNvdXJjZSByOwogCXN0cnVjdCBtcGljICptcGljOwotCXVuc2lnbmVkIGludCBmbGFncyA9IG1hc3RlciA/IE1QSUNfUFJJTUFSWSA6IDA7Ci0JaW50IHJjOwotCi0JcmMgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKG5wLCAwLCAmcik7Ci0JaWYgKHJjKQotCQlyZXR1cm4gTlVMTDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBtYXN0ZXIgPyAwIDogTVBJQ19TRUNPTkRBUlk7CiAKIAlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9FTkFCTEVfTVBJQywgbnAsIDAsIDApOwogCkBAIC01MTksNyArNDc5LDcgQEAKIAlpZiAobWFzdGVyICYmIChmbGFncyAmIE1QSUNfQklHX0VORElBTikpCiAJCWZsYWdzIHw9IE1QSUNfVTNfSFRfSVJRUzsKIAotCW1waWMgPSBtcGljX2FsbG9jKG5wLCByLnN0YXJ0LCBmbGFncywgMCwgMCwgbmFtZSk7CisJbXBpYyA9IG1waWNfYWxsb2MobnAsIDAsIGZsYWdzLCAwLCAwLCBuYW1lKTsKIAlpZiAobXBpYyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtNTMyLDcgKzQ5Miw2IEBACiB7CiAJc3RydWN0IG1waWMgKm1waWMxLCAqbXBpYzI7CiAJc3RydWN0IGRldmljZV9ub2RlICpucCwgKm1hc3RlciA9IE5VTEwsICpzbGF2ZSA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGNhc2NhZGU7CiAKIAkvKiBXZSBjYW4gaGF2ZSB1cCB0byAyIE1QSUNzIGNhc2NhZGVkICovCiAJZm9yIChucCA9IE5VTEw7IChucCA9IG9mX2ZpbmRfbm9kZV9ieV90eXBlKG5wLCAib3Blbi1waWMiKSkKQEAgLTU2OCwyNyArNTI3LDE0IEBACiAKIAlvZl9ub2RlX3B1dChtYXN0ZXIpOwogCi0JLyogTm8gc2xhdmUsIGxldCdzIGdvIG91dCAqLwotCWlmIChzbGF2ZSA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQotCS8qIEdldC9NYXAgc2xhdmUgaW50ZXJydXB0ICovCi0JY2FzY2FkZSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKHNsYXZlLCAwKTsKLQlpZiAoY2FzY2FkZSA9PSBOT19JUlEpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gbWFwIGNhc2NhZGUgSVJRXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JbXBpYzIgPSBwbWFjX3NldHVwX29uZV9tcGljKHNsYXZlLCAwKTsKLQlpZiAobXBpYzIgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZXR1cCBzbGF2ZSBNUElDXG4iKTsKKwkvKiBTZXQgdXAgYSBjYXNjYWRlZCBjb250cm9sbGVyLCBpZiBwcmVzZW50ICovCisJaWYgKHNsYXZlKSB7CisJCW1waWMyID0gcG1hY19zZXR1cF9vbmVfbXBpYyhzbGF2ZSwgMCk7CisJCWlmIChtcGljMiA9PSBOVUxMKQorCQkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2V0dXAgc2xhdmUgTVBJQ1xuIik7CiAJCW9mX25vZGVfcHV0KHNsYXZlKTsKLQkJcmV0dXJuIDA7CiAJfQotCWlycV9zZXRfaGFuZGxlcl9kYXRhKGNhc2NhZGUsIG1waWMyKTsKLQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcihjYXNjYWRlLCBwbWFjX3UzX2Nhc2NhZGUpOwogCi0Jb2Zfbm9kZV9wdXQoc2xhdmUpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NldHVwLmMKaW5kZXggOTY1ODBiMS4uOTcwZWExZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zZXR1cC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc2V0dXAuYwpAQCAtNDk0LDExICs0OTQsMTUgQEAKIAkJcmV0dXJuIC0xOwogCiAJbnAgPSBvZl9maW5kX25vZGVfYnlfbmFtZShOVUxMLCAidmFsa3lyaWUiKTsKLQlpZiAobnApCisJaWYgKG5wKSB7CiAJCW9mX3BsYXRmb3JtX2RldmljZV9jcmVhdGUobnAsICJ2YWxreXJpZSIsIE5VTEwpOworCQlvZl9ub2RlX3B1dChucCk7CisJfQogCW5wID0gb2ZfZmluZF9ub2RlX2J5X25hbWUoTlVMTCwgInBsYXRpbnVtIik7Ci0JaWYgKG5wKQorCWlmIChucCkgewogCQlvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCAicGxhdGludW0iLCBOVUxMKTsKKwkJb2Zfbm9kZV9wdXQobnApOworCX0KICAgICAgICAgbnAgPSBvZl9maW5kX25vZGVfYnlfdHlwZShOVUxMLCAic211Iik7CiAgICAgICAgIGlmIChucCkgewogCQlvZl9wbGF0Zm9ybV9kZXZpY2VfY3JlYXRlKG5wLCAic211IiwgTlVMTCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9zbXAuYwppbmRleCA5YjZhODIwLi40NGQ3NjkyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvc21wLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCiAJaWYgKHBzdXJnZV9zZWNvbmRhcnlfdmlycSkKIAkJcmMgPSByZXF1ZXN0X2lycShwc3VyZ2Vfc2Vjb25kYXJ5X3ZpcnEsIHBzdXJnZV9pcGlfaW50ciwKLQkJCUlSUUZfUEVSQ1BVLCAiSVBJIiwgTlVMTCk7CisJCQlJUlFGX1BFUkNQVSB8IElSUUZfTk9fVEhSRUFELCAiSVBJIiwgTlVMTCk7CiAKIAlpZiAocmMpCiAJCXByX2VycigiRmFpbGVkIHRvIHNldHVwIHNlY29uZGFyeSBjcHUgSVBJXG4iKTsKQEAgLTQwOCwxMyArNDA4LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIHBzdXJnZV9pcnFhY3Rpb24gPSB7CiAJLmhhbmRsZXIgPSBwc3VyZ2VfaXBpX2ludHIsCi0JLmZsYWdzID0gSVJRRl9QRVJDUFUsCisJLmZsYWdzID0gSVJRRl9QRVJDUFUgfCBJUlFGX05PX1RIUkVBRCwKIAkubmFtZSA9ICJwcmltYXJ5IElQSSIsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgc21wX3BzdXJnZV9zZXR1cF9jcHUoaW50IGNwdV9ucikKIHsKLQlpZiAoY3B1X25yICE9IDApCisJaWYgKGNwdV9uciAhPSAwIHx8ICFwc3VyZ2Vfc3RhcnQpCiAJCXJldHVybjsKIAogCS8qIHJlc2V0IHRoZSBlbnRyeSBwb2ludCBzbyBpZiB3ZSBnZXQgYW5vdGhlciBpbnRyIHdlIHdvbid0CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvTWFrZWZpbGUKaW5kZXggMzE4NTMwMC4uYmNjM2NiNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9NYWtlZmlsZQpAQCAtMiw0ICsyLDQgQEAKIG9iai15CQkJKz0gb3BhbC1ydGMubyBvcGFsLW52cmFtLm8KIAogb2JqLSQoQ09ORklHX1NNUCkJKz0gc21wLm8KLW9iai0kKENPTkZJR19QQ0kpCSs9IHBjaS5vIHBjaS1wNWlvYzIubworb2JqLSQoQ09ORklHX1BDSSkJKz0gcGNpLm8gcGNpLXA1aW9jMi5vIHBjaS1pb2RhLm8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvb3BhbC13cmFwcGVycy5TCmluZGV4IDRhM2Y0NmQuLjNiYjA3ZTUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9vcGFsLXdyYXBwZXJzLlMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L29wYWwtd3JhcHBlcnMuUwpAQCAtOTksMyArOTksMTEgQEAKIE9QQUxfQ0FMTChvcGFsX3BjaV9tYXBfcGVfZG1hX3dpbmRvdywJCU9QQUxfUENJX01BUF9QRV9ETUFfV0lORE9XKTsKIE9QQUxfQ0FMTChvcGFsX3BjaV9tYXBfcGVfZG1hX3dpbmRvd19yZWFsLAlPUEFMX1BDSV9NQVBfUEVfRE1BX1dJTkRPV19SRUFMKTsKIE9QQUxfQ0FMTChvcGFsX3BjaV9yZXNldCwJCQlPUEFMX1BDSV9SRVNFVCk7CitPUEFMX0NBTEwob3BhbF9wY2lfZ2V0X2h1Yl9kaWFnX2RhdGEsCQlPUEFMX1BDSV9HRVRfSFVCX0RJQUdfREFUQSk7CitPUEFMX0NBTEwob3BhbF9wY2lfZ2V0X3BoYl9kaWFnX2RhdGEsCQlPUEFMX1BDSV9HRVRfUEhCX0RJQUdfREFUQSk7CitPUEFMX0NBTEwob3BhbF9wY2lfZmVuY2VfcGhiLAkJCU9QQUxfUENJX0ZFTkNFX1BIQik7CitPUEFMX0NBTEwob3BhbF9wY2lfcmVpbml0LAkJCU9QQUxfUENJX1JFSU5JVCk7CitPUEFMX0NBTEwob3BhbF9wY2lfbWFza19wZV9lcnJvciwJCU9QQUxfUENJX01BU0tfUEVfRVJST1IpOworT1BBTF9DQUxMKG9wYWxfc2V0X3Nsb3RfbGVkX3N0YXR1cywJCU9QQUxfU0VUX1NMT1RfTEVEX1NUQVRVUyk7CitPUEFMX0NBTEwob3BhbF9nZXRfZXBvd19zdGF0dXMsCQkJT1BBTF9HRVRfRVBPV19TVEFUVVMpOworT1BBTF9DQUxMKG9wYWxfc2V0X3N5c3RlbV9hdHRlbnRpb25fbGVkLAlPUEFMX1NFVF9TWVNURU1fQVRURU5USU9OX0xFRCk7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLWlvZGEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2ktaW9kYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTE2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLWlvZGEuYwpAQCAtMCwwICsxLDEzMzAgQEAKKy8qCisgKiBTdXBwb3J0IFBDSS9QQ0llIG9uIFBvd2VyTlYgcGxhdGZvcm1zCisgKgorICogQ29weXJpZ2h0IDIwMTEgQmVuamFtaW4gSGVycmVuc2NobWlkdCwgSUJNIENvcnAuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjdW5kZWYgREVCVUcKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L21zaS5oPgorCisjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vcGNpLWJyaWRnZS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KKyNpbmNsdWRlIDxhc20vb3BhbC5oPgorI2luY2x1ZGUgPGFzbS9pb21tdS5oPgorI2luY2x1ZGUgPGFzbS90Y2UuaD4KKyNpbmNsdWRlIDxhc20vYWJzX2FkZHIuaD4KKworI2luY2x1ZGUgInBvd2VybnYuaCIKKyNpbmNsdWRlICJwY2kuaCIKKworc3RydWN0IHJlc291cmNlX3dyYXAgeworCXN0cnVjdCBsaXN0X2hlYWQJbGluazsKKwlyZXNvdXJjZV9zaXplX3QJCXNpemU7CisJcmVzb3VyY2Vfc2l6ZV90CQlhbGlnbjsKKwlzdHJ1Y3QgcGNpX2RldgkJKmRldjsJLyogU2V0IGlmIGl0J3MgYSBkZXZpY2UgKi8KKwlzdHJ1Y3QgcGNpX2J1cwkJKmJ1czsJLyogU2V0IGlmIGl0J3MgYSBicmlkZ2UgKi8KK307CisKK3N0YXRpYyBpbnQgX19wZV9wcmludGsoY29uc3QgY2hhciAqbGV2ZWwsIGNvbnN0IHN0cnVjdCBwbnZfaW9kYV9wZSAqcGUsCisJCSAgICAgICBzdHJ1Y3QgdmFfZm9ybWF0ICp2YWYpCit7CisJY2hhciBwZml4WzMyXTsKKworCWlmIChwZS0+cGRldikKKwkJc3RybGNweShwZml4LCBkZXZfbmFtZSgmcGUtPnBkZXYtPmRldiksIHNpemVvZihwZml4KSk7CisJZWxzZQorCQlzcHJpbnRmKHBmaXgsICIlMDR4OiUwMnggICAgICIsCisJCQlwY2lfZG9tYWluX25yKHBlLT5wYnVzKSwgcGUtPnBidXMtPm51bWJlcik7CisJcmV0dXJuIHByaW50aygicGNpICVzJXM6IFtQRSMgJS4zZF0gJXBWIiwgbGV2ZWwsIHBmaXgsIHBlLT5wZV9udW1iZXIsIHZhZik7Cit9CisKKyNkZWZpbmUgZGVmaW5lX3BlX3ByaW50a19sZXZlbChmdW5jLCBrZXJuX2xldmVsKQkJXAorc3RhdGljIGludCBmdW5jKGNvbnN0IHN0cnVjdCBwbnZfaW9kYV9wZSAqcGUsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQlcCit7CQkJCQkJCQlcCisJc3RydWN0IHZhX2Zvcm1hdCB2YWY7CQkJCQlcCisJdmFfbGlzdCBhcmdzOwkJCQkJCVwKKwlpbnQgcjsJCQkJCQkJXAorCQkJCQkJCQlcCisJdmFfc3RhcnQoYXJncywgZm10KTsJCQkJCVwKKwkJCQkJCQkJXAorCXZhZi5mbXQgPSBmbXQ7CQkJCQkJXAorCXZhZi52YSA9ICZhcmdzOwkJCQkJCVwKKwkJCQkJCQkJXAorCXIgPSBfX3BlX3ByaW50ayhrZXJuX2xldmVsLCBwZSwgJnZhZik7CQkJXAorCXZhX2VuZChhcmdzKTsJCQkJCQlcCisJCQkJCQkJCVwKKwlyZXR1cm4gcjsJCQkJCQlcCit9CQkJCQkJCQlcCisKK2RlZmluZV9wZV9wcmludGtfbGV2ZWwocGVfZXJyLCBLRVJOX0VSUik7CitkZWZpbmVfcGVfcHJpbnRrX2xldmVsKHBlX3dhcm4sIEtFUk5fV0FSTklORyk7CitkZWZpbmVfcGVfcHJpbnRrX2xldmVsKHBlX2luZm8sIEtFUk5fSU5GTyk7CisKKworLyogQ2FsY3VsYXRlIHJlc291cmNlIHVzYWdlICYgYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIGEgc2luZ2xlCisgKiBkZXZpY2UuIFRoaXMgd2lsbCBhbHNvIGFzc2lnbiBhbGwgcmVzb3VyY2VzIHdpdGhpbiB0aGUgZGV2aWNlCisgKiBmb3IgYSBnaXZlbiB0eXBlIHN0YXJ0aW5nIGF0IDAgZm9yIHRoZSBiaWdnZXN0IG9uZSBhbmQgdGhlbgorICogYXNzaWduaW5nIGluIGRlY3JlYXNpbmcgb3JkZXIgb2Ygc2l6ZS4KKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9pb2RhX2NhbGNfZGV2KHN0cnVjdCBwY2lfZGV2ICpkZXYsIHVuc2lnbmVkIGludCBmbGFncywKKwkJCQkJcmVzb3VyY2Vfc2l6ZV90ICpzaXplLAorCQkJCQlyZXNvdXJjZV9zaXplX3QgKmFsaWduKQoreworCXJlc291cmNlX3NpemVfdCBzdGFydDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IGk7CisKKwlwcl9kZXZlbCgiICAtPiBDRFIgJXNcbiIsIHBjaV9uYW1lKGRldikpOworCisJKnNpemUgPSAqYWxpZ24gPSAwOworCisJLyogQ2xlYXIgdGhlIHJlc291cmNlcyBvdXQgYW5kIG1hcmsgdGhlbSBhbGwgdW5zZXQgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgeworCQlyID0gJmRldi0+cmVzb3VyY2VbaV07CisJCWlmICghKHItPmZsYWdzICYgZmxhZ3MpKQorCQkgICAgY29udGludWU7CisJCWlmIChyLT5zdGFydCkgeworCQkJci0+ZW5kIC09IHItPnN0YXJ0OworCQkJci0+c3RhcnQgPSAwOworCQl9CisJCXItPmZsYWdzIHw9IElPUkVTT1VSQ0VfVU5TRVQ7CisJfQorCisJLyogV2UgY3VycmVudGx5IGtlZXAgYWxsIG1lbW9yeSByZXNvdXJjZXMgdG9nZXRoZXIsIHdlCisJICogd2lsbCBoYW5kbGUgcHJlZmV0Y2ggJiA2NC1iaXQgc2VwYXJhdGVseSBpbiB0aGUgZnV0dXJlCisJICogYnV0IGZvciBub3cgd2Ugc3RpY2sgZXZlcnlib2R5IGluIE0zMgorCSAqLworCXN0YXJ0ID0gMDsKKwlmb3IgKDs7KSB7CisJCXJlc291cmNlX3NpemVfdCBtYXhfc2l6ZSA9IDA7CisJCWludCBtYXhfbm8gPSAtMTsKKworCQkvKiBGaW5kIG5leHQgYmlnZ2VzdCByZXNvdXJjZSAqLworCQlmb3IgKGkgPSAwOyBpIDw9IFBDSV9ST01fUkVTT1VSQ0U7IGkrKykgeworCQkJciA9ICZkZXYtPnJlc291cmNlW2ldOworCQkJaWYgKCEoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX1VOU0VUKSB8fAorCQkJICAgICEoci0+ZmxhZ3MgJiBmbGFncykpCisJCQkJY29udGludWU7CisJCQlpZiAocmVzb3VyY2Vfc2l6ZShyKSA+IG1heF9zaXplKSB7CisJCQkJbWF4X3NpemUgPSByZXNvdXJjZV9zaXplKHIpOworCQkJCW1heF9ubyA9IGk7CisJCQl9CisJCX0KKwkJaWYgKG1heF9ubyA8IDApCisJCQlicmVhazsKKwkJciA9ICZkZXYtPnJlc291cmNlW21heF9ub107CisJCWlmIChtYXhfc2l6ZSA+ICphbGlnbikKKwkJCSphbGlnbiA9IG1heF9zaXplOworCQkqc2l6ZSArPSBtYXhfc2l6ZTsKKwkJci0+c3RhcnQgPSBzdGFydDsKKwkJc3RhcnQgKz0gbWF4X3NpemU7CisJCXItPmVuZCA9IHItPnN0YXJ0ICsgbWF4X3NpemUgLSAxOworCQlyLT5mbGFncyAmPSB+SU9SRVNPVVJDRV9VTlNFVDsKKwkJcHJfZGV2ZWwoIiAgLT4gICAgIFIlZCAlMDE2bGx4Li4lMDE2bGx4XG4iLAorCQkJIG1heF9ubywgci0+c3RhcnQsIHItPmVuZCk7CisJfQorCXByX2RldmVsKCIgIDwtIENEUiAlcyBzaXplPSVsbHggYWxpZ249JWxseFxuIiwKKwkJIHBjaV9uYW1lKGRldiksICpzaXplLCAqYWxpZ24pOworfQorCisvKiBBbGxvY2F0ZSBhIHJlc291cmNlICJ3cmFwIiBmb3IgYSBnaXZlbiBkZXZpY2Ugb3IgYnJpZGdlIGFuZAorICogaW5zZXJ0IGl0IGF0IHRoZSByaWdodCBwb3NpdGlvbiBpbiB0aGUgc29ydGVkIGxpc3QKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9pb2RhX2FkZF93cmFwKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJCXN0cnVjdCBwY2lfYnVzICpidXMsCisJCQkJCXN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCXJlc291cmNlX3NpemVfdCBzaXplLAorCQkJCQlyZXNvdXJjZV9zaXplX3QgYWxpZ24pCit7CisJc3RydWN0IHJlc291cmNlX3dyYXAgKncxLCAqdyA9IGt6YWxsb2Moc2l6ZW9mKCp3KSwgR0ZQX0tFUk5FTCk7CisKKwl3LT5zaXplID0gc2l6ZTsKKwl3LT5hbGlnbiA9IGFsaWduOworCXctPmRldiA9IGRldjsKKwl3LT5idXMgPSBidXM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHcxLCBsaXN0LCBsaW5rKSB7CisJCWlmICh3MS0+YWxpZ24gPCBhbGlnbikgeworCQkJbGlzdF9hZGRfdGFpbCgmdy0+bGluaywgJncxLT5saW5rKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlsaXN0X2FkZF90YWlsKCZ3LT5saW5rLCBsaXN0KTsKK30KKworLyogT2Zmc2V0IGRldmljZSByZXNvdXJjZXMgb2YgYSBnaXZlbiB0eXBlICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcG52X2lvZGFfb2Zmc2V0X2RldihzdHJ1Y3QgcGNpX2RldiAqZGV2LAorCQkJCQkgIHVuc2lnbmVkIGludCBmbGFncywKKwkJCQkJICByZXNvdXJjZV9zaXplX3Qgb2Zmc2V0KQoreworCXN0cnVjdCByZXNvdXJjZSAqcjsKKwlpbnQgaTsKKworCXByX2RldmVsKCIgIC0+IE9EUiAlcyBbJXhdICslMDE2bGx4XG4iLCBwY2lfbmFtZShkZXYpLCBmbGFncywgb2Zmc2V0KTsKKworCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCXIgPSAmZGV2LT5yZXNvdXJjZVtpXTsKKwkJaWYgKHItPmZsYWdzICYgZmxhZ3MpIHsKKwkJCWRldi0+cmVzb3VyY2VbaV0uc3RhcnQgKz0gb2Zmc2V0OworCQkJZGV2LT5yZXNvdXJjZVtpXS5lbmQgKz0gb2Zmc2V0OworCQl9CisJfQorCisJcHJfZGV2ZWwoIiAgPC0gT0RSICVzIFsleF0gKyUwMTZsbHhcbiIsIHBjaV9uYW1lKGRldiksIGZsYWdzLCBvZmZzZXQpOworfQorCisvKiBPZmZzZXQgYnVzIHJlc291cmNlcyAoJiBhbGwgY2hpbGRyZW4pIG9mIGEgZ2l2ZW4gdHlwZSAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9pb2RhX29mZnNldF9idXMoc3RydWN0IHBjaV9idXMgKmJ1cywKKwkJCQkJICB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQkJCSAgcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJc3RydWN0IHBjaV9kZXYgKmRldjsKKwlzdHJ1Y3QgcGNpX2J1cyAqY2J1czsKKwlpbnQgaTsKKworCXByX2RldmVsKCIgIC0+IE9CUiAlcyBbJXhdICslMDE2bGx4XG4iLAorCQkgYnVzLT5zZWxmID8gcGNpX25hbWUoYnVzLT5zZWxmKSA6ICJyb290IiwgZmxhZ3MsIG9mZnNldCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXIgPSBidXMtPnJlc291cmNlW2ldOworCQlpZiAociAmJiAoci0+ZmxhZ3MgJiBmbGFncykpIHsKKwkJCWJ1cy0+cmVzb3VyY2VbaV0tPnN0YXJ0ICs9IG9mZnNldDsKKwkJCWJ1cy0+cmVzb3VyY2VbaV0tPmVuZCArPSBvZmZzZXQ7CisJCX0KKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KQorCQlwbnZfaW9kYV9vZmZzZXRfZGV2KGRldiwgZmxhZ3MsIG9mZnNldCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYnVzLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkKKwkJcG52X2lvZGFfb2Zmc2V0X2J1cyhjYnVzLCBmbGFncywgb2Zmc2V0KTsKKworCXByX2RldmVsKCIgIDwtIE9CUiAlcyBbJXhdXG4iLAorCQkgYnVzLT5zZWxmID8gcGNpX25hbWUoYnVzLT5zZWxmKSA6ICJyb290IiwgZmxhZ3MpOworfQorCisvKiBUaGlzIGlzIHRoZSBndXRzIG9mIG91ciBJT0RBIHJlc291cmNlIGFsbG9jYXRpb24uIFRoaXMgaXMgY2FsbGVkCisgKiByZWN1cnNpdmVseSBmb3IgZWFjaCBidXMgaW4gdGhlIHN5c3RlbS4gSXQgY2FsY3VsYXRlcyBhbGwgdGhlCisgKiBuZWNlc3Nhcnkgc2l6ZSBhbmQgcmVxdWlyZW1lbnRzIGZvciBjaGlsZHJlbiBhbmQgYXNzaWduIHRoZW0KKyAqIHJlc291cmNlcyBzdWNoIHRoYXQ6CisgKgorICogICAtIEVhY2ggZnVuY3Rpb24gZml0cyBpbiBpdCdzIG93biBjb250aWd1b3VzIHNldCBvZiBJTy9NMzIKKyAqICAgICBzZWdtZW50CisgKgorICogICAtIEFsbCBzZWdtZW50cyBiZWhpbmQgYSBQMlAgYnJpZGdlIGFyZSBjb250aWd1b3VzIGFuZCBvYmV5CisgKiAgICAgYWxpZ25tZW50IGNvbnN0cmFpbnRzIG9mIHRob3NlIGJyaWRnZXMKKyAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9pb2RhX2NhbGNfYnVzKHN0cnVjdCBwY2lfYnVzICpidXMsIHVuc2lnbmVkIGludCBmbGFncywKKwkJCQkJcmVzb3VyY2Vfc2l6ZV90ICpzaXplLAorCQkJCQlyZXNvdXJjZV9zaXplX3QgKmFsaWduKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7CisJcmVzb3VyY2Vfc2l6ZV90IGRldl9zaXplLCBkZXZfYWxpZ24sIHN0YXJ0OworCXJlc291cmNlX3NpemVfdCBtaW5fYWxpZ24sIG1pbl9iYWxpZ247CisJc3RydWN0IHBjaV9kZXYgKmNkZXY7CisJc3RydWN0IHBjaV9idXMgKmNidXM7CisJc3RydWN0IGxpc3RfaGVhZCBoZWFkOworCXN0cnVjdCByZXNvdXJjZV93cmFwICp3OworCXVuc2lnbmVkIGludCBicmVzOworCisJKnNpemUgPSAqYWxpZ24gPSAwOworCisJcHJfZGV2ZWwoIi0+IENCUiAlcyBbJXhdXG4iLAorCQkgYnVzLT5zZWxmID8gcGNpX25hbWUoYnVzLT5zZWxmKSA6ICJyb290IiwgZmxhZ3MpOworCisJLyogQ2FsY3VsYXRlIGFsaWdubWVudCByZXF1aXJlbWVudHMgYmFzZWQgb24gdGhlIHR5cGUKKwkgKiBvZiByZXNvdXJjZSB3ZSBhcmUgd29ya2luZyBvbgorCSAqLworCWlmIChmbGFncyAmIElPUkVTT1VSQ0VfSU8pIHsKKwkJYnJlcyA9IDA7CisJCW1pbl9hbGlnbiA9IHBoYi0+aW9kYS5pb19zZWdzaXplOworCQltaW5fYmFsaWduID0gMHgxMDAwOworCX0gZWxzZSB7CisJCWJyZXMgPSAxOworCQltaW5fYWxpZ24gPSBwaGItPmlvZGEubTMyX3NlZ3NpemU7CisJCW1pbl9iYWxpZ24gPSAweDEwMDAwMDsKKwl9CisKKwkvKiBHYXRoZXIgYWxsIG91ciBjaGlsZHJlbiByZXNvdXJjZXMgb3JkZXJlZCBieSBhbGlnbm1lbnQgKi8KKwlJTklUX0xJU1RfSEVBRCgmaGVhZCk7CisKKwkvKiAgIC0gQnVzc2VzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYnVzLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkgeworCQlwbnZfaW9kYV9jYWxjX2J1cyhjYnVzLCBmbGFncywgJmRldl9zaXplLCAmZGV2X2FsaWduKTsKKwkJcG52X2lvZGFfYWRkX3dyYXAoJmhlYWQsIGNidXMsIE5VTEwsIGRldl9zaXplLCBkZXZfYWxpZ24pOworCX0KKworCS8qICAgLSBEZXZpY2VzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQlwbnZfaW9kYV9jYWxjX2RldihjZGV2LCBmbGFncywgJmRldl9zaXplLCAmZGV2X2FsaWduKTsKKwkJLyogQWxpZ24gdGhlbSB0byBzZWdtZW50IHNpemUgKi8KKwkJaWYgKGRldl9hbGlnbiA8IG1pbl9hbGlnbikKKwkJCWRldl9hbGlnbiA9IG1pbl9hbGlnbjsKKwkJcG52X2lvZGFfYWRkX3dyYXAoJmhlYWQsIE5VTEwsIGNkZXYsIGRldl9zaXplLCBkZXZfYWxpZ24pOworCX0KKwlpZiAobGlzdF9lbXB0eSgmaGVhZCkpCisJCWdvdG8gZW1wdHk7CisKKwkvKiBOb3cgd2UgY2FuIGRvIHR3byB0aGluZ3M6IGFzc2lnbiBvZmZzZXRzIHRvIHRoZW0gd2l0aGluIHRoYXQKKwkgKiBsZXZlbCBhbmQgZ2V0IG91ciB0b3RhbCBhbGlnbm1lbnQgJiBzaXplIHJlcXVpcmVtZW50cy4gVGhlCisJICogYXNzaWdubWVudCBhbGdvcml0aG0gaXMgZ29pbmcgdG8gYmUgdWJlci10cml2aWFsIGZvciBub3csIHdlCisJICogY2FuIHRyeSB0byBiZSBzbWFydGVyIGxhdGVyIGF0IGZpbGxpbmcgb3V0IGhvbGVzLgorCSAqLworCXN0YXJ0ID0gYnVzLT5zZWxmID8gMCA6IGJ1cy0+cmVzb3VyY2VbYnJlc10tPnN0YXJ0OworCisJLyogRG9uJ3QgaGFuZCBvdXQgSU8gMCAqLworCWlmICgoZmxhZ3MgJiBJT1JFU09VUkNFX0lPKSAmJiAhYnVzLT5zZWxmKQorCQlzdGFydCArPSAweDEwMDA7CisKKwl3aGlsZSghbGlzdF9lbXB0eSgmaGVhZCkpIHsKKwkJdyA9IGxpc3RfZmlyc3RfZW50cnkoJmhlYWQsIHN0cnVjdCByZXNvdXJjZV93cmFwLCBsaW5rKTsKKwkJbGlzdF9kZWwoJnctPmxpbmspOworCQlpZiAody0+c2l6ZSkgeworCQkJaWYgKHN0YXJ0KSB7CisJCQkJc3RhcnQgPSBBTElHTihzdGFydCwgdy0+YWxpZ24pOworCQkJCWlmICh3LT5kZXYpCisJCQkJCXBudl9pb2RhX29mZnNldF9kZXYody0+ZGV2LGZsYWdzLHN0YXJ0KTsKKwkJCQllbHNlIGlmICh3LT5idXMpCisJCQkJCXBudl9pb2RhX29mZnNldF9idXMody0+YnVzLGZsYWdzLHN0YXJ0KTsKKwkJCX0KKwkJCWlmICh3LT5hbGlnbiA+ICphbGlnbikKKwkJCQkqYWxpZ24gPSB3LT5hbGlnbjsKKwkJfQorCQlzdGFydCArPSB3LT5zaXplOworCQlrZnJlZSh3KTsKKwl9CisJKnNpemUgPSBzdGFydDsKKworCS8qIEFsaWduIGFuZCBzZXR1cCBicmlkZ2UgcmVzb3VyY2VzICovCisJKmFsaWduID0gbWF4X3QocmVzb3VyY2Vfc2l6ZV90LCAqYWxpZ24sCisJCSAgICAgICBtYXhfdChyZXNvdXJjZV9zaXplX3QsIG1pbl9hbGlnbiwgbWluX2JhbGlnbikpOworCSpzaXplID0gQUxJR04oKnNpemUsCisJCSAgICAgIG1heF90KHJlc291cmNlX3NpemVfdCwgbWluX2FsaWduLCBtaW5fYmFsaWduKSk7CisgZW1wdHk6CisJLyogT25seSBzZXR1cCBQMlAncywgbm90IHRoZSBQSEIgaXRzZWxmICovCisJaWYgKGJ1cy0+c2VsZikgeworCQlXQVJOX09OKGJ1cy0+cmVzb3VyY2VbYnJlc10gPT0gTlVMTCk7CisJCWJ1cy0+cmVzb3VyY2VbYnJlc10tPnN0YXJ0ID0gMDsKKwkJYnVzLT5yZXNvdXJjZVticmVzXS0+ZmxhZ3MgPSAoKnNpemUpID8gZmxhZ3MgOiAwOworCQlidXMtPnJlc291cmNlW2JyZXNdLT5lbmQgPSAoKnNpemUpID8gKCpzaXplIC0gMSkgOiAwOworCisJCS8qIENsZWFyIHByZWZldGNoIGJ1cyByZXNvdXJjZXMgZm9yIG5vdyAqLworCQlidXMtPnJlc291cmNlWzJdLT5mbGFncyA9IDA7CisJfQorCisJcHJfZGV2ZWwoIjwtIENCUiAlcyBbJXhdICpzaXplPSUwMTZsbHggKmFsaWduPSUwMTZsbHhcbiIsCisJCSBidXMtPnNlbGYgPyBwY2lfbmFtZShidXMtPnNlbGYpIDogInJvb3QiLCBmbGFncywqc2l6ZSwqYWxpZ24pOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kbiAqcG52X2lvZGFfZ2V0X3BkbihzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisKKwlucCA9IHBjaV9kZXZpY2VfdG9fT0Zfbm9kZShkZXYpOworCWlmICghbnApCisJCXJldHVybiBOVUxMOworCXJldHVybiBQQ0lfRE4obnApOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcG52X2lvZGFfc2V0dXBfcGVfc2VnbWVudHMoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gcG52X2lvZGFfZ2V0X3BkbihkZXYpOworCXVuc2lnbmVkIGludCBwZSwgaTsKKwlyZXNvdXJjZV9zaXplX3QgcG9zOworCXN0cnVjdCByZXNvdXJjZSBpb19yZXM7CisJc3RydWN0IHJlc291cmNlIG0zMl9yZXM7CisJc3RydWN0IHBjaV9idXNfcmVnaW9uIHJlZ2lvbjsKKwlpbnQgcmM7CisKKwkvKiBBbnl0aGluZyBub3QgcmVmZXJlbmNlZCBpbiB0aGUgZGV2aWNlLXRyZWUgZ2V0cyBQRSMwICovCisJcGUgPSBwZG4gPyBwZG4tPnBlX251bWJlciA6IDA7CisKKwkvKiBDYWxjdWxhdGUgdGhlIGRldmljZSBtaW4vbWF4ICovCisJaW9fcmVzLnN0YXJ0ID0gbTMyX3Jlcy5zdGFydCA9IChyZXNvdXJjZV9zaXplX3QpLTE7CisJaW9fcmVzLmVuZCA9IG0zMl9yZXMuZW5kID0gMDsKKwlpb19yZXMuZmxhZ3MgPSBJT1JFU09VUkNFX0lPOworCW0zMl9yZXMuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKKworCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCXN0cnVjdCByZXNvdXJjZSAqciA9IE5VTEw7CisJCWlmIChkZXYtPnJlc291cmNlW2ldLmZsYWdzICYgSU9SRVNPVVJDRV9JTykKKwkJCXIgPSAmaW9fcmVzOworCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIElPUkVTT1VSQ0VfTUVNKQorCQkJciA9ICZtMzJfcmVzOworCQlpZiAoIXIpCisJCQljb250aW51ZTsKKwkJaWYgKGRldi0+cmVzb3VyY2VbaV0uc3RhcnQgPCByLT5zdGFydCkKKwkJCXItPnN0YXJ0ID0gZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsKKwkJaWYgKGRldi0+cmVzb3VyY2VbaV0uZW5kID4gci0+ZW5kKQorCQkJci0+ZW5kID0gZGV2LT5yZXNvdXJjZVtpXS5lbmQ7CisJfQorCisJLyogU2V0dXAgSU8gc2VnbWVudHMgKi8KKwlpZiAoaW9fcmVzLnN0YXJ0IDwgaW9fcmVzLmVuZCkgeworCQlwY2liaW9zX3Jlc291cmNlX3RvX2J1cyhkZXYsICZyZWdpb24sICZpb19yZXMpOworCQlwb3MgPSByZWdpb24uc3RhcnQ7CisJCWkgPSBwb3MgLyBwaGItPmlvZGEuaW9fc2Vnc2l6ZTsKKwkJd2hpbGUoaSA8IHBoYi0+aW9kYS50b3RhbF9wZSAmJiBwb3MgPD0gcmVnaW9uLmVuZCkgeworCQkJaWYgKHBoYi0+aW9kYS5pb19zZWdtYXBbaV0pIHsKKwkJCQlwcl9lcnIoIiVzOiBUcnlpbmcgdG8gdXNlIElPIHNlZyAjJWQgd2hpY2ggaXMiCisJCQkJICAgICAgICIgYWxyZWFkeSB1c2VkIGJ5IFBFIyAlZFxuIiwKKwkJCQkgICAgICAgcGNpX25hbWUoZGV2KSwgaSwKKwkJCQkgICAgICAgcGhiLT5pb2RhLmlvX3NlZ21hcFtpXSk7CisJCQkJLyogWFhYIERPIFNPTUVUSElORyBUTyBESVNBQkxFIERFVklDRSA/ICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlwaGItPmlvZGEuaW9fc2VnbWFwW2ldID0gcGU7CisJCQlyYyA9IG9wYWxfcGNpX21hcF9wZV9tbWlvX3dpbmRvdyhwaGItPm9wYWxfaWQsIHBlLAorCQkJCQkJCSBPUEFMX0lPX1dJTkRPV19UWVBFLAorCQkJCQkJCSAwLCBpKTsKKwkJCWlmIChyYyAhPSBPUEFMX1NVQ0NFU1MpIHsKKwkJCQlwcl9lcnIoIiVzOiBPUEFMIGVycm9yICVkIHNldHRpbmcgdXAgbWFwcGluZyIKKwkJCQkgICAgICAgIiBmb3IgSU8gc2VnIyAlZFxuIiwKKwkJCQkgICAgICAgcGNpX25hbWUoZGV2KSwgcmMsIGkpOworCQkJCS8qIFhYWCBETyBTT01FVEhJTkcgVE8gRElTQUJMRSBERVZJQ0UgPyAqLworCQkJCWJyZWFrOworCQkJfQorCQkJcG9zICs9IHBoYi0+aW9kYS5pb19zZWdzaXplOworCQkJaSsrOworCQl9OworCX0KKworCS8qIFNldHVwIE0zMiBzZWdtZW50cyAqLworCWlmIChtMzJfcmVzLnN0YXJ0IDwgbTMyX3Jlcy5lbmQpIHsKKwkJcGNpYmlvc19yZXNvdXJjZV90b19idXMoZGV2LCAmcmVnaW9uLCAmbTMyX3Jlcyk7CisJCXBvcyA9IHJlZ2lvbi5zdGFydDsKKwkJaSA9IHBvcyAvIHBoYi0+aW9kYS5tMzJfc2Vnc2l6ZTsKKwkJd2hpbGUoaSA8IHBoYi0+aW9kYS50b3RhbF9wZSAmJiBwb3MgPD0gcmVnaW9uLmVuZCkgeworCQkJaWYgKHBoYi0+aW9kYS5tMzJfc2VnbWFwW2ldKSB7CisJCQkJcHJfZXJyKCIlczogVHJ5aW5nIHRvIHVzZSBNMzIgc2VnICMlZCB3aGljaCBpcyIKKwkJCQkgICAgICAgIiBhbHJlYWR5IHVzZWQgYnkgUEUjICVkXG4iLAorCQkJCSAgICAgICBwY2lfbmFtZShkZXYpLCBpLAorCQkJCSAgICAgICBwaGItPmlvZGEubTMyX3NlZ21hcFtpXSk7CisJCQkJLyogWFhYIERPIFNPTUVUSElORyBUTyBESVNBQkxFIERFVklDRSA/ICovCisJCQkJYnJlYWs7CisJCQl9CisJCQlwaGItPmlvZGEubTMyX3NlZ21hcFtpXSA9IHBlOworCQkJcmMgPSBvcGFsX3BjaV9tYXBfcGVfbW1pb193aW5kb3cocGhiLT5vcGFsX2lkLCBwZSwKKwkJCQkJCQkgT1BBTF9NMzJfV0lORE9XX1RZUEUsCisJCQkJCQkJIDAsIGkpOworCQkJaWYgKHJjICE9IE9QQUxfU1VDQ0VTUykgeworCQkJCXByX2VycigiJXM6IE9QQUwgZXJyb3IgJWQgc2V0dGluZyB1cCBtYXBwaW5nIgorCQkJCSAgICAgICAiIGZvciBNMzIgc2VnIyAlZFxuIiwKKwkJCQkgICAgICAgcGNpX25hbWUoZGV2KSwgcmMsIGkpOworCQkJCS8qIFhYWCBETyBTT01FVEhJTkcgVE8gRElTQUJMRSBERVZJQ0UgPyAqLworCQkJCWJyZWFrOworCQkJfQorCQkJcG9zICs9IHBoYi0+aW9kYS5tMzJfc2Vnc2l6ZTsKKwkJCWkrKzsKKwkJfQorCX0KK30KKworLyogQ2hlY2sgaWYgYSByZXNvdXJjZSBzdGlsbCBmaXRzIGluIHRoZSB0b3RhbCBJTyBvciBNMzIgcmFuZ2UKKyAqIGZvciBhIGdpdmVuIFBIQgorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbnZfaW9kYV9yZXNvdXJjZV9maXQoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAorCQkJCQkgICBzdHJ1Y3QgcmVzb3VyY2UgKnIpCit7CisJc3RydWN0IHJlc291cmNlICpib3VuZHM7CisKKwlpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQorCQlib3VuZHMgPSAmaG9zZS0+aW9fcmVzb3VyY2U7CisJZWxzZSBpZiAoci0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkKKwkJYm91bmRzID0gJmhvc2UtPm1lbV9yZXNvdXJjZXNbMF07CisJZWxzZQorCQlyZXR1cm4gMTsKKworCWlmIChyLT5zdGFydCA+PSBib3VuZHMtPnN0YXJ0ICYmIHItPmVuZCA8PSBib3VuZHMtPmVuZCkKKwkJcmV0dXJuIDE7CisJci0+ZmxhZ3MgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcG52X2lvZGFfdXBkYXRlX3Jlc291cmNlcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOworCXN0cnVjdCBwY2lfYnVzICpjYnVzOworCXN0cnVjdCBwY2lfZGV2ICpjZGV2OworCXVuc2lnbmVkIGludCBpOworCisJLyogV2UgdXNlZCB0byBjbGVhciBhbGwgZGV2aWNlIGVuYWJsZXMgaGVyZS4gSG93ZXZlciBpdCBsb29rcyBsaWtlCisJICogY2xlYXJpbmcgTUVNIGVuYWJsZSBjYXVzZXMgT2JzaWRpYW4gKElQUiBTQ1MpIHRvIGdvIGJvbmtlcnMsCisJICogYW5kIHNob290IGZhdGFsIGVycm9ycyB0byB0aGUgUEhCIHdoaWNoIGluIHR1cm5zIGZlbmNlcyBpdHNlbGYKKwkgKiBhbmQgd2UgY2FuJ3QgcmVjb3ZlciBmcm9tIHRoYXQgLi4uIHlldC4gU28gZm9yIG5vdywgbGV0J3MgbGVhdmUKKwkgKiB0aGUgZW5hYmxlcyBhcy1pcyBhbmQgaG9wZSBmb3IgdGhlIGJlc3QuCisJICovCisKKwkvKiBDaGVjayBpZiBidXMgcmVzb3VyY2VzIGZpdCBpbiBvdXIgSU8gb3IgTTMyIHJhbmdlICovCisJZm9yIChpID0gMDsgYnVzLT5zZWxmICYmIChpIDwgMik7IGkrKykgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSBidXMtPnJlc291cmNlW2ldOworCQlpZiAociAmJiAhcG52X2lvZGFfcmVzb3VyY2VfZml0KGhvc2UsIHIpKQorCQkJcHJfZXJyKCIlczogQnVzICVkIHJlc291cmNlICVkIGRpc2FibGVkLCBubyByb29tXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKGJ1cy0+c2VsZiksIGJ1cy0+bnVtYmVyLCBpKTsKKwl9CisKKwkvKiBVcGRhdGUgc2VsZiBpZiBpdCdzIG5vdCBhIFBIQiAqLworCWlmIChidXMtPnNlbGYpCisJCXBjaV9zZXR1cF9icmlkZ2UoYnVzKTsKKworCS8qIFVwZGF0ZSBjaGlsZCBkZXZpY2VzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQkvKiBDaGVjayBpZiByZXNvdXJjZSBmaXRzLCBpZiBub3QsIGRpc2FibGVkIGl0ICovCisJCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKSB7CisJCQlzdHJ1Y3QgcmVzb3VyY2UgKnIgPSAmY2Rldi0+cmVzb3VyY2VbaV07CisJCQlpZiAoIXBudl9pb2RhX3Jlc291cmNlX2ZpdChob3NlLCByKSkKKwkJCQlwcl9lcnIoIiVzOiBSZXNvdXJjZSAlZCBkaXNhYmxlZCwgbm8gcm9vbVxuIiwKKwkJCQkgICAgICAgcGNpX25hbWUoY2RldiksIGkpOworCQl9CisKKwkJLyogQXNzaWduIHNlZ21lbnRzICovCisJCXBudl9pb2RhX3NldHVwX3BlX3NlZ21lbnRzKGNkZXYpOworCisJCS8qIFVwZGF0ZSBIVyBCQVJzICovCisJCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKQorCQkJcGNpX3VwZGF0ZV9yZXNvdXJjZShjZGV2LCBpKTsKKwl9CisKKwkvKiBVcGRhdGUgY2hpbGQgYnVzc2VzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYnVzLCAmYnVzLT5jaGlsZHJlbiwgbm9kZSkKKwkJcG52X2lvZGFfdXBkYXRlX3Jlc291cmNlcyhjYnVzKTsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgcG52X2lvZGFfYWxsb2NfcGUoc3RydWN0IHBudl9waGIgKnBoYikKK3sKKwl1bnNpZ25lZCBsb25nIHBlOworCisJZG8geworCQlwZSA9IGZpbmRfbmV4dF96ZXJvX2JpdChwaGItPmlvZGEucGVfYWxsb2MsCisJCQkJCXBoYi0+aW9kYS50b3RhbF9wZSwgMCk7CisJCWlmIChwZSA+PSBwaGItPmlvZGEudG90YWxfcGUpCisJCQlyZXR1cm4gSU9EQV9JTlZBTElEX1BFOworCX0gd2hpbGUodGVzdF9hbmRfc2V0X2JpdChwZSwgcGhiLT5pb2RhLnBlX2FsbG9jKSk7CisKKwlwaGItPmlvZGEucGVfYXJyYXlbcGVdLnBlX251bWJlciA9IHBlOworCXJldHVybiBwZTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9pb2RhX2ZyZWVfcGUoc3RydWN0IHBudl9waGIgKnBoYiwgaW50IHBlKQoreworCVdBUk5fT04ocGhiLT5pb2RhLnBlX2FycmF5W3BlXS5wZGV2KTsKKworCW1lbXNldCgmcGhiLT5pb2RhLnBlX2FycmF5W3BlXSwgMCwgc2l6ZW9mKHN0cnVjdCBwbnZfaW9kYV9wZSkpOworCWNsZWFyX2JpdChwZSwgcGhiLT5pb2RhLnBlX2FsbG9jKTsKK30KKworLyogQ3VycmVudGx5IHRob3NlIDIgYXJlIG9ubHkgdXNlZCB3aGVuIE1TSXMgYXJlIGVuYWJsZWQsIHRoaXMgd2lsbCBjaGFuZ2UKKyAqIGJ1dCBpbiB0aGUgbWVhbnRpbWUsIHdlIG5lZWQgdG8gcHJvdGVjdCB0aGVtIHRvIGF2b2lkIHdhcm5pbmdzCisgKi8KKyNpZmRlZiBDT05GSUdfUENJX01TSQorc3RhdGljIHN0cnVjdCBwbnZfaW9kYV9wZSAqIF9fZGV2aW5pdCBfX3Budl9pb2RhX2dldF9vbmVfcGUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gcG52X2lvZGFfZ2V0X3BkbihkZXYpOworCisJaWYgKCFwZG4pCisJCXJldHVybiBOVUxMOworCWlmIChwZG4tPnBlX251bWJlciA9PSBJT0RBX0lOVkFMSURfUEUpCisJCXJldHVybiBOVUxMOworCXJldHVybiAmcGhiLT5pb2RhLnBlX2FycmF5W3Bkbi0+cGVfbnVtYmVyXTsKK30KKworc3RhdGljIHN0cnVjdCBwbnZfaW9kYV9wZSAqIF9fZGV2aW5pdCBwbnZfaW9kYV9nZXRfcGUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcG52X2lvZGFfcGUgKnBlID0gX19wbnZfaW9kYV9nZXRfb25lX3BlKGRldik7CisKKwl3aGlsZSAoIXBlICYmIGRldi0+YnVzLT5zZWxmKSB7CisJCWRldiA9IGRldi0+YnVzLT5zZWxmOworCQlwZSA9IF9fcG52X2lvZGFfZ2V0X29uZV9wZShkZXYpOworCQlpZiAocGUpCisJCQlwZSA9IHBlLT5idXNfcGU7CisJfQorCXJldHVybiBwZTsKK30KKyNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBwbnZfaW9kYV9jb25maWd1cmVfcGUoc3RydWN0IHBudl9waGIgKnBoYiwKKwkJCQkJICAgc3RydWN0IHBudl9pb2RhX3BlICpwZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGFyZW50OworCXVpbnQ4X3QgYmNvbXAsIGRjb21wLCBmY29tcDsKKwlsb25nIHJjLCByaWRfZW5kLCByaWQ7CisKKwkvKiBCdXMgdmFsaWRhdGlvbiA/ICovCisJaWYgKHBlLT5wYnVzKSB7CisJCWludCBjb3VudDsKKworCQlkY29tcCA9IE9QQUxfSUdOT1JFX1JJRF9ERVZJQ0VfTlVNQkVSOworCQlmY29tcCA9IE9QQUxfSUdOT1JFX1JJRF9GVU5DVElPTl9OVU1CRVI7CisJCXBhcmVudCA9IHBlLT5wYnVzLT5zZWxmOworCQljb3VudCA9IHBlLT5wYnVzLT5zdWJvcmRpbmF0ZSAtIHBlLT5wYnVzLT5zZWNvbmRhcnkgKyAxOworCQlzd2l0Y2goY291bnQpIHsKKwkJY2FzZSAgMTogYmNvbXAgPSBPcGFsUGNpQnVzQWxsOwkJYnJlYWs7CisJCWNhc2UgIDI6IGJjb21wID0gT3BhbFBjaUJ1czdCaXRzOwlicmVhazsKKwkJY2FzZSAgNDogYmNvbXAgPSBPcGFsUGNpQnVzNkJpdHM7CWJyZWFrOworCQljYXNlICA4OiBiY29tcCA9IE9wYWxQY2lCdXM1Qml0czsJYnJlYWs7CisJCWNhc2UgMTY6IGJjb21wID0gT3BhbFBjaUJ1czRCaXRzOwlicmVhazsKKwkJY2FzZSAzMjogYmNvbXAgPSBPcGFsUGNpQnVzM0JpdHM7CWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJfZXJyKCIlczogTnVtYmVyIG9mIHN1Ym9yZGluYXRlIGJ1c3NlcyAlZCIKKwkJCSAgICAgICAiIHVuc3VwcG9ydGVkXG4iLAorCQkJICAgICAgIHBjaV9uYW1lKHBlLT5wYnVzLT5zZWxmKSwgY291bnQpOworCQkJLyogRG8gYW4gZXhhY3QgbWF0Y2ggb25seSAqLworCQkJYmNvbXAgPSBPcGFsUGNpQnVzQWxsOworCQl9CisJCXJpZF9lbmQgPSBwZS0+cmlkICsgKGNvdW50IDw8IDgpOworCX0gZWxzZSB7CisJCXBhcmVudCA9IHBlLT5wZGV2LT5idXMtPnNlbGY7CisJCWJjb21wID0gT3BhbFBjaUJ1c0FsbDsKKwkJZGNvbXAgPSBPUEFMX0NPTVBBUkVfUklEX0RFVklDRV9OVU1CRVI7CisJCWZjb21wID0gT1BBTF9DT01QQVJFX1JJRF9GVU5DVElPTl9OVU1CRVI7CisJCXJpZF9lbmQgPSBwZS0+cmlkICsgMTsKKwl9CisKKwkvKiBBc3NvY2lhdGUgUEUgaW4gUEVMVCAqLworCXJjID0gb3BhbF9wY2lfc2V0X3BlKHBoYi0+b3BhbF9pZCwgcGUtPnBlX251bWJlciwgcGUtPnJpZCwKKwkJCSAgICAgYmNvbXAsIGRjb21wLCBmY29tcCwgT1BBTF9NQVBfUEUpOworCWlmIChyYykgeworCQlwZV9lcnIocGUsICJPUEFMIGVycm9yICVsZCB0cnlpbmcgdG8gc2V0dXAgUEVMVCB0YWJsZVxuIiwgcmMpOworCQlyZXR1cm4gLUVOWElPOworCX0KKwlvcGFsX3BjaV9lZWhfZnJlZXplX2NsZWFyKHBoYi0+b3BhbF9pZCwgcGUtPnBlX251bWJlciwKKwkJCQkgIE9QQUxfRUVIX0FDVElPTl9DTEVBUl9GUkVFWkVfQUxMKTsKKworCS8qIEFkZCB0byBhbGwgcGFyZW50cyBQRUxULVYgKi8KKwl3aGlsZSAocGFyZW50KSB7CisJCXN0cnVjdCBwY2lfZG4gKnBkbiA9IHBudl9pb2RhX2dldF9wZG4ocGFyZW50KTsKKwkJaWYgKHBkbiAmJiBwZG4tPnBlX251bWJlciAhPSBJT0RBX0lOVkFMSURfUEUpIHsKKwkJCXJjID0gb3BhbF9wY2lfc2V0X3BlbHR2KHBoYi0+b3BhbF9pZCwgcGRuLT5wZV9udW1iZXIsCisJCQkJCQlwZS0+cGVfbnVtYmVyLCBPUEFMX0FERF9QRV9UT19ET01BSU4pOworCQkJLyogWFhYIFdoYXQgdG8gZG8gaW4gY2FzZSBvZiBlcnJvciA/ICovCisJCX0KKwkJcGFyZW50ID0gcGFyZW50LT5idXMtPnNlbGY7CisJfQorCS8qIFNldHVwIHJldmVyc2UgbWFwICovCisJZm9yIChyaWQgPSBwZS0+cmlkOyByaWQgPCByaWRfZW5kOyByaWQrKykKKwkJcGhiLT5pb2RhLnBlX3JtYXBbcmlkXSA9IHBlLT5wZV9udW1iZXI7CisKKwkvKiBTZXR1cCBvbmUgTVZUcyBvbiBJT0RBMSAqLworCWlmIChwaGItPnR5cGUgPT0gUE5WX1BIQl9JT0RBMSkgeworCQlwZS0+bXZlX251bWJlciA9IHBlLT5wZV9udW1iZXI7CisJCXJjID0gb3BhbF9wY2lfc2V0X212ZShwaGItPm9wYWxfaWQsIHBlLT5tdmVfbnVtYmVyLAorCQkJCSAgICAgIHBlLT5wZV9udW1iZXIpOworCQlpZiAocmMpIHsKKwkJCXBlX2VycihwZSwgIk9QQUwgZXJyb3IgJWxkIHNldHRpbmcgdXAgTVZFICVkXG4iLAorCQkJICAgICAgIHJjLCBwZS0+bXZlX251bWJlcik7CisJCQlwZS0+bXZlX251bWJlciA9IC0xOworCQl9IGVsc2UgeworCQkJcmMgPSBvcGFsX3BjaV9zZXRfbXZlX2VuYWJsZShwaGItPm9wYWxfaWQsCisJCQkJCQkgICAgIHBlLT5tdmVfbnVtYmVyLCBPUEFMX0VOQUJMRV9NVkUpOworCQkJaWYgKHJjKSB7CisJCQkJcGVfZXJyKHBlLCAiT1BBTCBlcnJvciAlbGQgZW5hYmxpbmcgTVZFICVkXG4iLAorCQkJCSAgICAgICByYywgcGUtPm12ZV9udW1iZXIpOworCQkJCXBlLT5tdmVfbnVtYmVyID0gLTE7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHBoYi0+dHlwZSA9PSBQTlZfUEhCX0lPREEyKQorCQlwZS0+bXZlX251bWJlciA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9pb2RhX2xpbmtfcGVfYnlfd2VpZ2h0KHN0cnVjdCBwbnZfcGhiICpwaGIsCisJCQkJCQkgc3RydWN0IHBudl9pb2RhX3BlICpwZSkKK3sKKwlzdHJ1Y3QgcG52X2lvZGFfcGUgKmxwZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobHBlLCAmcGhiLT5pb2RhLnBlX2xpc3QsIGxpbmspIHsKKwkJaWYgKGxwZS0+ZG1hX3dlaWdodCA8IHBlLT5kbWFfd2VpZ2h0KSB7CisJCQlsaXN0X2FkZF90YWlsKCZwZS0+bGluaywgJmxwZS0+bGluayk7CisJCQlyZXR1cm47CisJCX0KKwl9CisJbGlzdF9hZGRfdGFpbCgmcGUtPmxpbmssICZwaGItPmlvZGEucGVfbGlzdCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcG52X2lvZGFfZG1hX3dlaWdodChzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qIFRoaXMgaXMgcXVpdGUgc2ltcGxpc3RpYy4gVGhlICJiYXNlIiB3ZWlnaHQgb2YgYSBkZXZpY2UKKwkgKiBpcyAxMC4gMCBtZWFucyBubyBETUEgaXMgdG8gYmUgYWNjb3VudGVkIGZvciBpdC4KKwkgKi8KKworCS8qIElmIGl0J3MgYSBicmlkZ2UsIG5vIERNQSAqLworCWlmIChkZXYtPmhkcl90eXBlICE9IFBDSV9IRUFERVJfVFlQRV9OT1JNQUwpCisJCXJldHVybiAwOworCisJLyogUmVkdWNlIHRoZSB3ZWlnaHQgb2Ygc2xvdyBVU0IgY29udHJvbGxlcnMgKi8KKwlpZiAoZGV2LT5jbGFzcyA9PSBQQ0lfQ0xBU1NfU0VSSUFMX1VTQl9VSENJIHx8CisJICAgIGRldi0+Y2xhc3MgPT0gUENJX0NMQVNTX1NFUklBTF9VU0JfT0hDSSB8fAorCSAgICBkZXYtPmNsYXNzID09IFBDSV9DTEFTU19TRVJJQUxfVVNCX0VIQ0kpCisJCXJldHVybiAzOworCisJLyogSW5jcmVhc2UgdGhlIHdlaWdodCBvZiBSQUlEIChpbmNsdWRlcyBPYnNpZGlhbikgKi8KKwlpZiAoKGRldi0+Y2xhc3MgPj4gOCkgPT0gUENJX0NMQVNTX1NUT1JBR0VfUkFJRCkKKwkJcmV0dXJuIDE1OworCisJLyogRGVmYXVsdCAqLworCXJldHVybiAxMDsKK30KKworc3RhdGljIHN0cnVjdCBwbnZfaW9kYV9wZSAqIF9fZGV2aW5pdCBwbnZfaW9kYV9zZXR1cF9kZXZfUEUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gcG52X2lvZGFfZ2V0X3BkbihkZXYpOworCXN0cnVjdCBwbnZfaW9kYV9wZSAqcGU7CisJaW50IHBlX251bTsKKworCWlmICghcGRuKSB7CisJCXByX2VycigiJXM6IERldmljZSB0cmVlIG5vZGUgbm90IGFzc29jaWF0ZWQgcHJvcGVybHlcbiIsCisJCQkgICBwY2lfbmFtZShkZXYpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChwZG4tPnBlX251bWJlciAhPSBJT0RBX0lOVkFMSURfUEUpCisJCXJldHVybiBOVUxMOworCisJLyogUEUjMCBoYXMgYmVlbiBwcmUtc2V0ICovCisJaWYgKGRldi0+YnVzLT5udW1iZXIgPT0gMCkKKwkJcGVfbnVtID0gMDsKKwllbHNlCisJCXBlX251bSA9IHBudl9pb2RhX2FsbG9jX3BlKHBoYik7CisJaWYgKHBlX251bSA9PSBJT0RBX0lOVkFMSURfUEUpIHsKKwkJcHJfd2FybmluZygiJXM6IE5vdCBlbm91Z2ggUEUjIGF2YWlsYWJsZSwgZGlzYWJsaW5nIGRldmljZVxuIiwKKwkJCSAgIHBjaV9uYW1lKGRldikpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBOT1RFOiBXZSBnZXQgb25seSBvbmUgcmVmIHRvIHRoZSBwY2lfZGV2IGZvciB0aGUgcGRuLCBub3QgZm9yIHRoZQorCSAqIHBvaW50ZXIgaW4gdGhlIFBFIGRhdGEgc3RydWN0dXJlLCBib3RoIHNob3VsZCBiZSBkZXN0cm95ZWQgYXQgdGhlCisJICogc2FtZSB0aW1lLiBIb3dldmVyLCB0aGlzIG5lZWRzIHRvIGJlIGxvb2tlZCBhdCBtb3JlIGNsb3NlbHkgYWdhaW4KKwkgKiBvbmNlIHdlIGFjdHVhbGx5IHN0YXJ0IHJlbW92aW5nIHRoaW5ncyAoSG90cGx1ZywgU1ItSU9WLCAuLi4pCisJICoKKwkgKiBBdCBzb21lIHBvaW50IHdlIHdhbnQgdG8gcmVtb3ZlIHRoZSBQRE4gY29tcGxldGVseSBhbnl3YXlzCisJICovCisJcGUgPSAmcGhiLT5pb2RhLnBlX2FycmF5W3BlX251bV07CisJcGNpX2Rldl9nZXQoZGV2KTsKKwlwZG4tPnBjaWRldiA9IGRldjsKKwlwZG4tPnBlX251bWJlciA9IHBlX251bTsKKwlwZS0+cGRldiA9IGRldjsKKwlwZS0+cGJ1cyA9IE5VTEw7CisJcGUtPnRjZTMyX3NlZyA9IC0xOworCXBlLT5tdmVfbnVtYmVyID0gLTE7CisJcGUtPnJpZCA9IGRldi0+YnVzLT5udW1iZXIgPDwgOCB8IHBkbi0+ZGV2Zm47CisKKwlwZV9pbmZvKHBlLCAiQXNzb2NpYXRlZCBkZXZpY2UgdG8gUEVcbiIpOworCisJaWYgKHBudl9pb2RhX2NvbmZpZ3VyZV9wZShwaGIsIHBlKSkgeworCQkvKiBYWFggV2hhdCBkbyB3ZSBkbyBoZXJlID8gKi8KKwkJaWYgKHBlX251bSkKKwkJCXBudl9pb2RhX2ZyZWVfcGUocGhiLCBwZV9udW0pOworCQlwZG4tPnBlX251bWJlciA9IElPREFfSU5WQUxJRF9QRTsKKwkJcGUtPnBkZXYgPSBOVUxMOworCQlwY2lfZGV2X3B1dChkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBBc3NpZ24gYSBETUEgd2VpZ2h0IHRvIHRoZSBkZXZpY2UgKi8KKwlwZS0+ZG1hX3dlaWdodCA9IHBudl9pb2RhX2RtYV93ZWlnaHQoZGV2KTsKKwlpZiAocGUtPmRtYV93ZWlnaHQgIT0gMCkgeworCQlwaGItPmlvZGEuZG1hX3dlaWdodCArPSBwZS0+ZG1hX3dlaWdodDsKKwkJcGhiLT5pb2RhLmRtYV9wZV9jb3VudCsrOworCX0KKworCS8qIExpbmsgdGhlIFBFICovCisJcG52X2lvZGFfbGlua19wZV9ieV93ZWlnaHQocGhiLCBwZSk7CisKKwlyZXR1cm4gcGU7Cit9CisKK3N0YXRpYyB2b2lkIHBudl9pb2RhX3NldHVwX3NhbWVfUEUoc3RydWN0IHBjaV9idXMgKmJ1cywgc3RydWN0IHBudl9pb2RhX3BlICpwZSkKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkZXYsICZidXMtPmRldmljZXMsIGJ1c19saXN0KSB7CisJCXN0cnVjdCBwY2lfZG4gKnBkbiA9IHBudl9pb2RhX2dldF9wZG4oZGV2KTsKKworCQlpZiAocGRuID09IE5VTEwpIHsKKwkJCXByX3dhcm4oIiVzOiBObyBkZXZpY2Ugbm9kZSBhc3NvY2lhdGVkIHdpdGggZGV2aWNlICFcbiIsCisJCQkJcGNpX25hbWUoZGV2KSk7CisJCQljb250aW51ZTsKKwkJfQorCQlwY2lfZGV2X2dldChkZXYpOworCQlwZG4tPnBjaWRldiA9IGRldjsKKwkJcGRuLT5wZV9udW1iZXIgPSBwZS0+cGVfbnVtYmVyOworCQlwZS0+ZG1hX3dlaWdodCArPSBwbnZfaW9kYV9kbWFfd2VpZ2h0KGRldik7CisJCWlmIChkZXYtPnN1Ym9yZGluYXRlKQorCQkJcG52X2lvZGFfc2V0dXBfc2FtZV9QRShkZXYtPnN1Ym9yZGluYXRlLCBwZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcG52X2lvZGFfc2V0dXBfYnVzX1BFKHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJCSAgICBzdHJ1Y3QgcG52X2lvZGFfcGUgKnBwZSkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwY2lfYnVzX3RvX2hvc3QoZGV2LT5idXMpOworCXN0cnVjdCBwbnZfcGhiICpwaGIgPSBob3NlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBjaV9idXMgKmJ1cyA9IGRldi0+c3Vib3JkaW5hdGU7CisJc3RydWN0IHBudl9pb2RhX3BlICpwZTsKKwlpbnQgcGVfbnVtOworCisJaWYgKCFidXMpIHsKKwkJcHJfd2FybmluZygiJXM6IEJyaWRnZSB3aXRob3V0IGEgc3Vib3JkaW5hdGUgYnVzICFcbiIsCisJCQkgICBwY2lfbmFtZShkZXYpKTsKKwkJcmV0dXJuOworCX0KKwlwZV9udW0gPSBwbnZfaW9kYV9hbGxvY19wZShwaGIpOworCWlmIChwZV9udW0gPT0gSU9EQV9JTlZBTElEX1BFKSB7CisJCXByX3dhcm5pbmcoIiVzOiBOb3QgZW5vdWdoIFBFIyBhdmFpbGFibGUsIGRpc2FibGluZyBidXNcbiIsCisJCQkgICBwY2lfbmFtZShkZXYpKTsKKwkJcmV0dXJuOworCX0KKworCXBlID0gJnBoYi0+aW9kYS5wZV9hcnJheVtwZV9udW1dOworCXBwZS0+YnVzX3BlID0gcGU7CisJcGUtPnBidXMgPSBidXM7CisJcGUtPnBkZXYgPSBOVUxMOworCXBlLT50Y2UzMl9zZWcgPSAtMTsKKwlwZS0+bXZlX251bWJlciA9IC0xOworCXBlLT5yaWQgPSBidXMtPnNlY29uZGFyeSA8PCA4OworCXBlLT5kbWFfd2VpZ2h0ID0gMDsKKworCXBlX2luZm8ocGUsICJTZWNvbmRhcnkgYnVzc2VzICVkLi4lZCBhc3NvY2lhdGVkIHdpdGggUEVcbiIsCisJCWJ1cy0+c2Vjb25kYXJ5LCBidXMtPnN1Ym9yZGluYXRlKTsKKworCWlmIChwbnZfaW9kYV9jb25maWd1cmVfcGUocGhiLCBwZSkpIHsKKwkJLyogWFhYIFdoYXQgZG8gd2UgZG8gaGVyZSA/ICovCisJCWlmIChwZV9udW0pCisJCQlwbnZfaW9kYV9mcmVlX3BlKHBoYiwgcGVfbnVtKTsKKwkJcGUtPnBidXMgPSBOVUxMOworCQlyZXR1cm47CisJfQorCisJLyogQXNzb2NpYXRlIGl0IHdpdGggYWxsIGNoaWxkIGRldmljZXMgKi8KKwlwbnZfaW9kYV9zZXR1cF9zYW1lX1BFKGJ1cywgcGUpOworCisJLyogQWNjb3VudCBmb3Igb25lIERNQSBQRSBpZiBhdCBsZWFzdCBvbmUgRE1BIGNhcGFibGUgZGV2aWNlIGV4aXN0CisJICogYmVsb3cgdGhlIGJyaWRnZQorCSAqLworCWlmIChwZS0+ZG1hX3dlaWdodCAhPSAwKSB7CisJCXBoYi0+aW9kYS5kbWFfd2VpZ2h0ICs9IHBlLT5kbWFfd2VpZ2h0OworCQlwaGItPmlvZGEuZG1hX3BlX2NvdW50Kys7CisJfQorCisJLyogTGluayB0aGUgUEUgKi8KKwlwbnZfaW9kYV9saW5rX3BlX2J5X3dlaWdodChwaGIsIHBlKTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9pb2RhX3NldHVwX1BFcyhzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJc3RydWN0IHBudl9pb2RhX3BlICpwZTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmYnVzLT5kZXZpY2VzLCBidXNfbGlzdCkgeworCQlwZSA9IHBudl9pb2RhX3NldHVwX2Rldl9QRShkZXYpOworCQlpZiAocGUgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQkvKiBMZWF2aW5nIHRoZSBQQ0llIGRvbWFpbiAuLi4gc2luZ2xlIFBFIyAqLworCQlpZiAoZGV2LT5wY2llX3R5cGUgPT0gUENJX0VYUF9UWVBFX1BDSV9CUklER0UpCisJCQlwbnZfaW9kYV9zZXR1cF9idXNfUEUoZGV2LCBwZSk7CisJCWVsc2UgaWYgKGRldi0+c3Vib3JkaW5hdGUpCisJCQlwbnZfaW9kYV9zZXR1cF9QRXMoZGV2LT5zdWJvcmRpbmF0ZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcG52X3BjaV9pb2RhX2RtYV9kZXZfc2V0dXAoc3RydWN0IHBudl9waGIgKnBoYiwKKwkJCQkJCSBzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCS8qIFdlIGRlbGF5IERNQSBzZXR1cCBhZnRlciB3ZSBoYXZlIGFzc2lnbmVkIGFsbCBQRSMgKi8KK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9pb2RhX3NldHVwX2J1c19kbWEoc3RydWN0IHBudl9pb2RhX3BlICpwZSwKKwkJCQkJICAgICBzdHJ1Y3QgcGNpX2J1cyAqYnVzKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJmJ1cy0+ZGV2aWNlcywgYnVzX2xpc3QpIHsKKwkJc2V0X2lvbW11X3RhYmxlX2Jhc2UoJmRldi0+ZGV2LCAmcGUtPnRjZTMyX3RhYmxlKTsKKwkJaWYgKGRldi0+c3Vib3JkaW5hdGUpCisJCQlwbnZfaW9kYV9zZXR1cF9idXNfZG1hKHBlLCBkZXYtPnN1Ym9yZGluYXRlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbnZfcGNpX2lvZGFfc2V0dXBfZG1hX3BlKHN0cnVjdCBwbnZfcGhiICpwaGIsCisJCQkJCQlzdHJ1Y3QgcG52X2lvZGFfcGUgKnBlLAorCQkJCQkJdW5zaWduZWQgaW50IGJhc2UsCisJCQkJCQl1bnNpZ25lZCBpbnQgc2VncykKK3sKKworCXN0cnVjdCBwYWdlICp0Y2VfbWVtID0gTlVMTDsKKwljb25zdCBfX2JlNjQgKnN3aW52cDsKKwlzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibDsKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQ2NF90IHJjOworCXZvaWQgKmFkZHI7CisKKwkvKiAyNTZNIERNQSB3aW5kb3csIDRLIFRDRSBwYWdlcywgOCBieXRlcyBUQ0UgKi8KKyNkZWZpbmUgVENFMzJfVEFCTEVfU0laRQkoKDB4MTAwMDAwMDAgLyAweDEwMDApICogOCkKKworCS8qIFhYWCBGSVhNRTogSGFuZGxlIDY0LWJpdCBvbmx5IERNQSBkZXZpY2VzICovCisJLyogWFhYIEZJWE1FOiBQcm92aWRlIDY0LWJpdCBETUEgZmFjaWxpdGllcyAmIG5vbi00SyBUQ0UgdGFibGVzIGV0Yy4uICovCisJLyogWFhYIEZJWE1FOiBBbGxvY2F0ZSBtdWx0aS1sZXZlbCB0YWJsZXMgb24gUEhCMyAqLworCisJLyogV2Ugc2hvdWxkbid0IGFscmVhZHkgaGF2ZSBhIDMyLWJpdCBETUEgYXNzb2NpYXRlZCAqLworCWlmIChXQVJOX09OKHBlLT50Y2UzMl9zZWcgPj0gMCkpCisJCXJldHVybjsKKworCS8qIEdyYWIgYSAzMi1iaXQgVENFIHRhYmxlICovCisJcGUtPnRjZTMyX3NlZyA9IGJhc2U7CisJcGVfaW5mbyhwZSwgIiBTZXR0aW5nIHVwIDMyLWJpdCBUQ0UgdGFibGUgYXQgJTA4eC4uJTA4eFxuIiwKKwkJKGJhc2UgPDwgMjgpLCAoKGJhc2UgKyBzZWdzKSA8PCAyOCkgLSAxKTsKKworCS8qIFhYWCBDdXJyZW50bHksIHdlIGFsbG9jYXRlIG9uZSBiaWcgY29udGlndW91cyB0YWJsZSBmb3IgdGhlCisJICogVENFcy4gV2Ugb25seSByZWFsbHkgbmVlZCBvbmUgY2h1bmsgcGVyIDI1Nk0gb2YgVENFIHNwYWNlCisJICogKGllIHBlciBzZWdtZW50KSBidXQgdGhhdCdzIGFuIG9wdGltaXphdGlvbiBmb3IgbGF0ZXIsIGl0CisJICogcmVxdWlyZXMgc29tZSBhZGRlZCBzbWFydHMgd2l0aCBvdXIgZ2V0L3B1dF90Y2UgaW1wbGVtZW50YXRpb24KKwkgKi8KKwl0Y2VfbWVtID0gYWxsb2NfcGFnZXNfbm9kZShwaGItPmhvc2UtPm5vZGUsIEdGUF9LRVJORUwsCisJCQkJICAgZ2V0X29yZGVyKFRDRTMyX1RBQkxFX1NJWkUgKiBzZWdzKSk7CisJaWYgKCF0Y2VfbWVtKSB7CisJCXBlX2VycihwZSwgIiBGYWlsZWQgdG8gYWxsb2NhdGUgYSAzMi1iaXQgVENFIG1lbW9yeVxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJYWRkciA9IHBhZ2VfYWRkcmVzcyh0Y2VfbWVtKTsKKwltZW1zZXQoYWRkciwgMCwgVENFMzJfVEFCTEVfU0laRSAqIHNlZ3MpOworCisJLyogQ29uZmlndXJlIEhXICovCisJZm9yIChpID0gMDsgaSA8IHNlZ3M7IGkrKykgeworCQlyYyA9IG9wYWxfcGNpX21hcF9wZV9kbWFfd2luZG93KHBoYi0+b3BhbF9pZCwKKwkJCQkJICAgICAgcGUtPnBlX251bWJlciwKKwkJCQkJICAgICAgYmFzZSArIGksIDEsCisJCQkJCSAgICAgIF9fcGEoYWRkcikgKyBUQ0UzMl9UQUJMRV9TSVpFICogaSwKKwkJCQkJICAgICAgVENFMzJfVEFCTEVfU0laRSwgMHgxMDAwKTsKKwkJaWYgKHJjKSB7CisJCQlwZV9lcnIocGUsICIgRmFpbGVkIHRvIGNvbmZpZ3VyZSAzMi1iaXQgVENFIHRhYmxlLCIKKwkJCSAgICAgICAiIGVyciAlbGRcbiIsIHJjKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCS8qIFNldHVwIGxpbnV4IGlvbW11IHRhYmxlICovCisJdGJsID0gJnBlLT50Y2UzMl90YWJsZTsKKwlwbnZfcGNpX3NldHVwX2lvbW11X3RhYmxlKHRibCwgYWRkciwgVENFMzJfVEFCTEVfU0laRSAqIHNlZ3MsCisJCQkJICBiYXNlIDw8IDI4KTsKKworCS8qIE9QQUwgdmFyaWFudCBvZiBQN0lPQyBTVyBpbnZhbGlkYXRlZCBUQ0VzICovCisJc3dpbnZwID0gb2ZfZ2V0X3Byb3BlcnR5KHBoYi0+aG9zZS0+ZG4sICJpYm0sb3BhbC10Y2Uta2lsbCIsIE5VTEwpOworCWlmIChzd2ludnApIHsKKwkJLyogV2UgbmVlZCBhIGNvdXBsZSBtb3JlIGZpZWxkcyAtLSBhbiBhZGRyZXNzIGFuZCBhIGRhdGEKKwkJICogdG8gb3IuICBTaW5jZSB0aGUgYnVzIGlzIG9ubHkgcHJpbnRlZCBvdXQgb24gdGFibGUgZnJlZQorCQkgKiBlcnJvcnMsIGFuZCBvbiB0aGUgZmlyc3QgcGFzcyB0aGUgZGF0YSB3aWxsIGJlIGEgcmVsYXRpdmUKKwkJICogYnVzIG51bWJlciwgcHJpbnQgdGhhdCBvdXQgaW5zdGVhZC4KKwkJICovCisJCXRibC0+aXRfYnVzbm8gPSAwOworCQl0YmwtPml0X2luZGV4ID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcChiZTY0X3RvX2NwdXAoc3dpbnZwKSwgOCk7CisJCXRibC0+aXRfdHlwZSA9IFRDRV9QQ0lfU1dJTlZfQ1JFQVRFIHwgVENFX1BDSV9TV0lOVl9GUkVFCisJCQl8IFRDRV9QQ0lfU1dJTlZfUEFJUjsKKwl9CisJaW9tbXVfaW5pdF90YWJsZSh0YmwsIHBoYi0+aG9zZS0+bm9kZSk7CisKKwlpZiAocGUtPnBkZXYpCisJCXNldF9pb21tdV90YWJsZV9iYXNlKCZwZS0+cGRldi0+ZGV2LCB0YmwpOworCWVsc2UKKwkJcG52X2lvZGFfc2V0dXBfYnVzX2RtYShwZSwgcGUtPnBidXMpOworCisJcmV0dXJuOworIGZhaWw6CisJLyogWFhYIEZhaWx1cmU6IFRyeSB0byBmYWxsYmFjayB0byA2NC1iaXQgb25seSA/ICovCisJaWYgKHBlLT50Y2UzMl9zZWcgPj0gMCkKKwkJcGUtPnRjZTMyX3NlZyA9IC0xOworCWlmICh0Y2VfbWVtKQorCQlfX2ZyZWVfcGFnZXModGNlX21lbSwgZ2V0X29yZGVyKFRDRTMyX1RBQkxFX1NJWkUgKiBzZWdzKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBwbnZfaW9kYV9zZXR1cF9kbWEoc3RydWN0IHBudl9waGIgKnBoYikKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UgPSBwaGItPmhvc2U7CisJdW5zaWduZWQgaW50IHJlc2lkdWFsLCByZW1haW5pbmcsIHNlZ3MsIHR3LCBiYXNlOworCXN0cnVjdCBwbnZfaW9kYV9wZSAqcGU7CisKKwkvKiBJZiB3ZSBoYXZlIG1vcmUgUEUjIHRoYW4gc2VnbWVudHMgYXZhaWxhYmxlLCBoYW5kIG91dCBvbmUKKwkgKiBwZXIgUEUgdW50aWwgd2UgcnVuIG91dCBhbmQgbGV0IHRoZSByZXN0IGZhaWwuIElmIG5vdCwKKwkgKiB0aGVuIHdlIGFzc2lnbiBhdCBsZWFzdCBvbmUgc2VnbWVudCBwZXIgUEUsIHBsdXMgbW9yZSBiYXNlZAorCSAqIG9uIHRoZSBhbW91bnQgb2YgZGV2aWNlcyB1bmRlciB0aGF0IFBFCisJICovCisJaWYgKHBoYi0+aW9kYS5kbWFfcGVfY291bnQgPiBwaGItPmlvZGEudGNlMzJfY291bnQpCisJCXJlc2lkdWFsID0gMDsKKwllbHNlCisJCXJlc2lkdWFsID0gcGhiLT5pb2RhLnRjZTMyX2NvdW50IC0KKwkJCXBoYi0+aW9kYS5kbWFfcGVfY291bnQ7CisKKwlwcl9pbmZvKCJQQ0k6IERvbWFpbiAlMDR4IGhhcyAlbGQgYXZhaWxhYmxlIDMyLWJpdCBETUEgc2VnbWVudHNcbiIsCisJCWhvc2UtPmdsb2JhbF9udW1iZXIsIHBoYi0+aW9kYS50Y2UzMl9jb3VudCk7CisJcHJfaW5mbygiUENJOiAlZCBQRSMgZm9yIGEgdG90YWwgd2VpZ2h0IG9mICVkXG4iLAorCQlwaGItPmlvZGEuZG1hX3BlX2NvdW50LCBwaGItPmlvZGEuZG1hX3dlaWdodCk7CisKKwkvKiBXYWxrIG91ciBQRSBsaXN0IGFuZCBjb25maWd1cmUgdGhlaXIgRE1BIHNlZ21lbnRzLCBoYW5kIHRoZW0KKwkgKiBvdXQgb25lIGJhc2Ugc2VnbWVudCBwbHVzIGFueSByZXNpZHVhbCBzZWdtZW50cyBiYXNlZCBvbgorCSAqIHdlaWdodAorCSAqLworCXJlbWFpbmluZyA9IHBoYi0+aW9kYS50Y2UzMl9jb3VudDsKKwl0dyA9IHBoYi0+aW9kYS5kbWFfd2VpZ2h0OworCWJhc2UgPSAwOworCWxpc3RfZm9yX2VhY2hfZW50cnkocGUsICZwaGItPmlvZGEucGVfbGlzdCwgbGluaykgeworCQlpZiAoIXBlLT5kbWFfd2VpZ2h0KQorCQkJY29udGludWU7CisJCWlmICghcmVtYWluaW5nKSB7CisJCQlwZV93YXJuKHBlLCAiTm8gRE1BMzIgcmVzb3VyY2VzIGF2YWlsYWJsZVxuIik7CisJCQljb250aW51ZTsKKwkJfQorCQlzZWdzID0gMTsKKwkJaWYgKHJlc2lkdWFsKSB7CisJCQlzZWdzICs9ICgocGUtPmRtYV93ZWlnaHQgKiByZXNpZHVhbCkgICsgKHR3IC8gMikpIC8gdHc7CisJCQlpZiAoc2VncyA+IHJlbWFpbmluZykKKwkJCQlzZWdzID0gcmVtYWluaW5nOworCQl9CisJCXBlX2luZm8ocGUsICJETUEgd2VpZ2h0ICVkLCBhc3NpZ25lZCAlZCBETUEzMiBzZWdtZW50c1xuIiwKKwkJCXBlLT5kbWFfd2VpZ2h0LCBzZWdzKTsKKwkJcG52X3BjaV9pb2RhX3NldHVwX2RtYV9wZShwaGIsIHBlLCBiYXNlLCBzZWdzKTsKKwkJcmVtYWluaW5nIC09IHNlZ3M7CisJCWJhc2UgKz0gc2VnczsKKwl9Cit9CisKKyNpZmRlZiBDT05GSUdfUENJX01TSQorc3RhdGljIGludCBwbnZfcGNpX2lvZGFfbXNpX3NldHVwKHN0cnVjdCBwbnZfcGhiICpwaGIsIHN0cnVjdCBwY2lfZGV2ICpkZXYsCisJCQkJICB1bnNpZ25lZCBpbnQgaHdpcnEsIHVuc2lnbmVkIGludCBpc182NCwKKwkJCQkgIHN0cnVjdCBtc2lfbXNnICptc2cpCit7CisJc3RydWN0IHBudl9pb2RhX3BlICpwZSA9IHBudl9pb2RhX2dldF9wZShkZXYpOworCXVuc2lnbmVkIGludCB4aXZlX251bSA9IGh3aXJxIC0gcGhiLT5tc2lfYmFzZTsKKwl1aW50NjRfdCBhZGRyNjQ7CisJdWludDMyX3QgYWRkcjMyLCBkYXRhOworCWludCByYzsKKworCS8qIE5vIFBFIGFzc2lnbmVkID8gYmFpbCBvdXQgLi4uIG5vIE1TSSBmb3IgeW91ICEgKi8KKwlpZiAocGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIENoZWNrIGlmIHdlIGhhdmUgYW4gTVZFICovCisJaWYgKHBlLT5tdmVfbnVtYmVyIDwgMCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qIEFzc2lnbiBYSVZFIHRvIFBFICovCisJcmMgPSBvcGFsX3BjaV9zZXRfeGl2ZV9wZShwaGItPm9wYWxfaWQsIHBlLT5wZV9udW1iZXIsIHhpdmVfbnVtKTsKKwlpZiAocmMpIHsKKwkJcHJfd2FybigiJXM6IE9QQUwgZXJyb3IgJWQgc2V0dGluZyBYSVZFICVkIFBFXG4iLAorCQkJcGNpX25hbWUoZGV2KSwgcmMsIHhpdmVfbnVtKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKGlzXzY0KSB7CisJCXJjID0gb3BhbF9nZXRfbXNpXzY0KHBoYi0+b3BhbF9pZCwgcGUtPm12ZV9udW1iZXIsIHhpdmVfbnVtLCAxLAorCQkJCSAgICAgJmFkZHI2NCwgJmRhdGEpOworCQlpZiAocmMpIHsKKwkJCXByX3dhcm4oIiVzOiBPUEFMIGVycm9yICVkIGdldHRpbmcgNjQtYml0IE1TSSBkYXRhXG4iLAorCQkJCXBjaV9uYW1lKGRldiksIHJjKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCW1zZy0+YWRkcmVzc19oaSA9IGFkZHI2NCA+PiAzMjsKKwkJbXNnLT5hZGRyZXNzX2xvID0gYWRkcjY0ICYgMHhmZmZmZmZmZnVsOworCX0gZWxzZSB7CisJCXJjID0gb3BhbF9nZXRfbXNpXzMyKHBoYi0+b3BhbF9pZCwgcGUtPm12ZV9udW1iZXIsIHhpdmVfbnVtLCAxLAorCQkJCSAgICAgJmFkZHIzMiwgJmRhdGEpOworCQlpZiAocmMpIHsKKwkJCXByX3dhcm4oIiVzOiBPUEFMIGVycm9yICVkIGdldHRpbmcgMzItYml0IE1TSSBkYXRhXG4iLAorCQkJCXBjaV9uYW1lKGRldiksIHJjKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCW1zZy0+YWRkcmVzc19oaSA9IDA7CisJCW1zZy0+YWRkcmVzc19sbyA9IGFkZHIzMjsKKwl9CisJbXNnLT5kYXRhID0gZGF0YTsKKworCXByX2RldmVsKCIlczogJXMtYml0IE1TSSBvbiBod2lycSAleCAoeGl2ZSAjJWQpLCIKKwkJICIgYWRkcmVzcz0leF8lMDh4IGRhdGE9JXggUEUjICVkXG4iLAorCQkgcGNpX25hbWUoZGV2KSwgaXNfNjQgPyAiNjQiIDogIjMyIiwgaHdpcnEsIHhpdmVfbnVtLAorCQkgbXNnLT5hZGRyZXNzX2hpLCBtc2ctPmFkZHJlc3NfbG8sIGRhdGEsIHBlLT5wZV9udW1iZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBudl9wY2lfaW5pdF9pb2RhX21zaXMoc3RydWN0IHBudl9waGIgKnBoYikKK3sKKwl1bnNpZ25lZCBpbnQgYm1hcF9zaXplOworCWNvbnN0IF9fYmUzMiAqcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShwaGItPmhvc2UtPmRuLAorCQkJCQkgICAgICJpYm0sb3BhbC1tc2ktcmFuZ2VzIiwgTlVMTCk7CisJaWYgKCFwcm9wKSB7CisJCS8qIEJNTCBGYWxsYmFjayAqLworCQlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KHBoYi0+aG9zZS0+ZG4sICJtc2ktcmFuZ2VzIiwgTlVMTCk7CisJfQorCWlmICghcHJvcCkKKwkJcmV0dXJuOworCisJcGhiLT5tc2lfYmFzZSA9IGJlMzJfdG9fY3B1cChwcm9wKTsKKwlwaGItPm1zaV9jb3VudCA9IGJlMzJfdG9fY3B1cChwcm9wICsgMSk7CisJYm1hcF9zaXplID0gQklUU19UT19MT05HUyhwaGItPm1zaV9jb3VudCkgKiBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJcGhiLT5tc2lfbWFwID0gemFsbG9jX21heWJlX2Jvb3RtZW0oYm1hcF9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBoYi0+bXNpX21hcCkgeworCQlwcl9lcnIoIlBDSSAlZDogRmFpbGVkIHRvIGFsbG9jYXRlIE1TSSBiaXRtYXAgIVxuIiwKKwkJICAgICAgIHBoYi0+aG9zZS0+Z2xvYmFsX251bWJlcik7CisJCXJldHVybjsKKwl9CisJcGhiLT5tc2lfc2V0dXAgPSBwbnZfcGNpX2lvZGFfbXNpX3NldHVwOworCXBoYi0+bXNpMzJfc3VwcG9ydCA9IDE7CisJcHJfaW5mbygiICBBbGxvY2F0ZWQgYml0bWFwIGZvciAlZCBNU0lzIChiYXNlIElSUSAweCV4KVxuIiwKKwkJcGhiLT5tc2lfY291bnQsIHBoYi0+bXNpX2Jhc2UpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHBudl9wY2lfaW5pdF9pb2RhX21zaXMoc3RydWN0IHBudl9waGIgKnBoYikgeyB9CisjZW5kaWYgLyogQ09ORklHX1BDSV9NU0kgKi8KKworLyogVGhpcyBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgb2Ygb3VyIElPREEgc3BlY2lmaWMgcmVzb3VyY2UKKyAqIGFsbG9jYXRpb24gcHJvY2VzcworICovCitzdGF0aWMgdm9pZCBfX2RldmluaXQgcG52X3BjaV9pb2RhX2ZpeHVwX3BoYihzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCit7CisJcmVzb3VyY2Vfc2l6ZV90IHNpemUsIGFsaWduOworCXN0cnVjdCBwY2lfYnVzICpjaGlsZDsKKworCS8qIEFzc29jaWF0ZSBQRXMgcGVyIGZ1bmN0aW9ucyAqLworCXBudl9pb2RhX3NldHVwX1BFcyhob3NlLT5idXMpOworCisJLyogQ2FsY3VsYXRlIGFsbCByZXNvdXJjZXMgKi8KKwlwbnZfaW9kYV9jYWxjX2J1cyhob3NlLT5idXMsIElPUkVTT1VSQ0VfSU8sICZzaXplLCAmYWxpZ24pOworCXBudl9pb2RhX2NhbGNfYnVzKGhvc2UtPmJ1cywgSU9SRVNPVVJDRV9NRU0sICZzaXplLCAmYWxpZ24pOworCisJLyogQXBwbHkgdGhlbiB0byBIVyAqLworCXBudl9pb2RhX3VwZGF0ZV9yZXNvdXJjZXMoaG9zZS0+YnVzKTsKKworCS8qIFNldHVwIERNQSAqLworCXBudl9pb2RhX3NldHVwX2RtYShob3NlLT5wcml2YXRlX2RhdGEpOworCisJLyogQ29uZmlndXJlIFBDSSBFeHByZXNzIHNldHRpbmdzICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmhvc2UtPmJ1cy0+Y2hpbGRyZW4sIG5vZGUpIHsKKwkJc3RydWN0IHBjaV9kZXYgKnNlbGYgPSBjaGlsZC0+c2VsZjsKKwkJaWYgKCFzZWxmKQorCQkJY29udGludWU7CisJCXBjaWVfYnVzX2NvbmZpZ3VyZV9zZXR0aW5ncyhjaGlsZCwgc2VsZi0+cGNpZV9tcHNzKTsKKwl9Cit9CisKKy8qIFByZXZlbnQgZW5hYmxpbmcgZGV2aWNlcyBmb3Igd2hpY2ggd2UgY291bGRuJ3QgcHJvcGVybHkKKyAqIGFzc2lnbiBhIFBFCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IHBudl9wY2lfZW5hYmxlX2RldmljZV9ob29rKHN0cnVjdCBwY2lfZGV2ICpkZXYpCit7CisJc3RydWN0IHBjaV9kbiAqcGRuID0gcG52X2lvZGFfZ2V0X3BkbihkZXYpOworCisJaWYgKCFwZG4gfHwgcGRuLT5wZV9udW1iZXIgPT0gSU9EQV9JTlZBTElEX1BFKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHUzMiBwbnZfaW9kYV9iZGZuX3RvX3BlKHN0cnVjdCBwbnZfcGhiICpwaGIsIHN0cnVjdCBwY2lfYnVzICpidXMsCisJCQkgICAgICAgdTMyIGRldmZuKQoreworCXJldHVybiBwaGItPmlvZGEucGVfcm1hcFsoYnVzLT5udW1iZXIgPDwgOCkgfCBkZXZmbl07Cit9CisKK3ZvaWQgX19pbml0IHBudl9wY2lfaW5pdF9pb2RhMV9waGIoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CisJc3RhdGljIGludCBwcmltYXJ5ID0gMTsKKwlzdHJ1Y3QgcG52X3BoYiAqcGhiOworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgbTMybWFwX29mZiwgaW9tYXBfb2ZmLCBwZW1hcF9vZmY7CisJY29uc3QgdTY0ICpwcm9wNjQ7CisJdTY0IHBoYl9pZDsKKwl2b2lkICphdXg7CisJbG9uZyByYzsKKworCXByX2luZm8oIiBJbml0aWFsaXppbmcgSU9EQSBPUEFMIFBIQiAlc1xuIiwgbnAtPmZ1bGxfbmFtZSk7CisKKwlwcm9wNjQgPSBvZl9nZXRfcHJvcGVydHkobnAsICJpYm0sb3BhbC1waGJpZCIsIE5VTEwpOworCWlmICghcHJvcDY0KSB7CisJCXByX2VycigiICBNaXNzaW5nIFwiaWJtLG9wYWwtcGhiaWRcIiBwcm9wZXJ0eSAhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlwaGJfaWQgPSBiZTY0X3RvX2NwdXAocHJvcDY0KTsKKwlwcl9kZWJ1ZygiICBQSEItSUQgIDogMHglMDE2bGx4XG4iLCBwaGJfaWQpOworCisJcGhiID0gYWxsb2NfYm9vdG1lbShzaXplb2Yoc3RydWN0IHBudl9waGIpKTsKKwlpZiAocGhiKSB7CisJCW1lbXNldChwaGIsIDAsIHNpemVvZihzdHJ1Y3QgcG52X3BoYikpOworCQlwaGItPmhvc2UgPSBob3NlID0gcGNpYmlvc19hbGxvY19jb250cm9sbGVyKG5wKTsKKwl9CisJaWYgKCFwaGIgfHwgIXBoYi0+aG9zZSkgeworCQlwcl9lcnIoIlBDSTogRmFpbGVkIHRvIGFsbG9jYXRlIFBDSSBjb250cm9sbGVyIGZvciAlc1xuIiwKKwkJICAgICAgIG5wLT5mdWxsX25hbWUpOworCQlyZXR1cm47CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJnBoYi0+bG9jayk7CisJLyogWFhYIFVzZSBkZXZpY2UtdHJlZSAqLworCWhvc2UtPmZpcnN0X2J1c25vID0gMDsKKwlob3NlLT5sYXN0X2J1c25vID0gMHhmZjsKKwlob3NlLT5wcml2YXRlX2RhdGEgPSBwaGI7CisJcGhiLT5vcGFsX2lkID0gcGhiX2lkOworCXBoYi0+dHlwZSA9IFBOVl9QSEJfSU9EQTE7CisKKwkvKiBEZXRlY3Qgc3BlY2lmaWMgbW9kZWxzIGZvciBlcnJvciBoYW5kbGluZyAqLworCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImlibSxwN2lvYy1wY2lleCIpKQorCQlwaGItPm1vZGVsID0gUE5WX1BIQl9NT0RFTF9QN0lPQzsKKwllbHNlCisJCXBoYi0+bW9kZWwgPSBQTlZfUEhCX01PREVMX1VOS05PV047CisKKwkvKiBXZSBwYXJzZSAicmFuZ2VzIiBub3cgc2luY2Ugd2UgbmVlZCB0byBkZWR1Y2UgdGhlIHJlZ2lzdGVyIGJhc2UKKwkgKiBmcm9tIHRoZSBJTyBiYXNlCisJICovCisJcGNpX3Byb2Nlc3NfYnJpZGdlX09GX3JhbmdlcyhwaGItPmhvc2UsIG5wLCBwcmltYXJ5KTsKKwlwcmltYXJ5ID0gMDsKKworCS8qIE1hZ2ljIGZvcm11bGEgZnJvbSBNaWx0b24gKi8KKwlwaGItPnJlZ3MgPSBvZl9pb21hcChucCwgMCk7CisJaWYgKHBoYi0+cmVncyA9PSBOVUxMKQorCQlwcl9lcnIoIiAgRmFpbGVkIHRvIG1hcCByZWdpc3RlcnMgIVxuIik7CisKKworCS8qIFhYWCBUaGlzIGlzIGhhY2stYS10aG9uLiBUaGlzIG5lZWRzIHRvIGJlIGNoYW5nZWQgc28gdGhhdDoKKwkgKiAgLSB3ZSBvYnRhaW4gc3R1ZmYgbGlrZSBQRSMgZXRjLi4uIGZyb20gZGV2aWNlLXRyZWUKKwkgKiAgLSB3ZSBwcm9wZXJseSByZS1hbGxvY2F0ZSBNMzIgb3Vyc2VsdmVzCisJICogICAgKHRoZSBPRlcgb25lIGlzbid0IHZlcnkgZ29vZCkKKwkgKi8KKworCS8qIEluaXRpYWxpemUgbW9yZSBJT0RBIHN0dWZmICovCisJcGhiLT5pb2RhLnRvdGFsX3BlID0gMTI4OworCisJcGhiLT5pb2RhLm0zMl9zaXplID0gcmVzb3VyY2Vfc2l6ZSgmaG9zZS0+bWVtX3Jlc291cmNlc1swXSk7CisJLyogT0ZXIEhhcyBhbHJlYWR5IG9mZiB0b3AgNjRrIG9mIE0zMiBzcGFjZSAoTVNJIHNwYWNlKSAqLworCXBoYi0+aW9kYS5tMzJfc2l6ZSArPSAweDEwMDAwOworCisJcGhiLT5pb2RhLm0zMl9zZWdzaXplID0gcGhiLT5pb2RhLm0zMl9zaXplIC8gcGhiLT5pb2RhLnRvdGFsX3BlOworCXBoYi0+aW9kYS5tMzJfcGNpX2Jhc2UgPSBob3NlLT5tZW1fcmVzb3VyY2VzWzBdLnN0YXJ0IC0KKwkJaG9zZS0+cGNpX21lbV9vZmZzZXQ7CisJcGhiLT5pb2RhLmlvX3NpemUgPSBob3NlLT5wY2lfaW9fc2l6ZTsKKwlwaGItPmlvZGEuaW9fc2Vnc2l6ZSA9IHBoYi0+aW9kYS5pb19zaXplIC8gcGhiLT5pb2RhLnRvdGFsX3BlOworCXBoYi0+aW9kYS5pb19wY2lfYmFzZSA9IDA7IC8qIFhYWCBjYWxjdWxhdGUgdGhpcyA/ICovCisKKwkvKiBBbGxvY2F0ZSBhdXggZGF0YSAmIGFycmF5cyAqLworCXNpemUgPSBfQUxJR05fVVAocGhiLT5pb2RhLnRvdGFsX3BlIC8gOCwgc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwltMzJtYXBfb2ZmID0gc2l6ZTsKKwlzaXplICs9IHBoYi0+aW9kYS50b3RhbF9wZTsKKwlpb21hcF9vZmYgPSBzaXplOworCXNpemUgKz0gcGhiLT5pb2RhLnRvdGFsX3BlOworCXBlbWFwX29mZiA9IHNpemU7CisJc2l6ZSArPSBwaGItPmlvZGEudG90YWxfcGUgKiBzaXplb2Yoc3RydWN0IHBudl9pb2RhX3BlKTsKKwlhdXggPSBhbGxvY19ib290bWVtKHNpemUpOworCW1lbXNldChhdXgsIDAsIHNpemUpOworCXBoYi0+aW9kYS5wZV9hbGxvYyA9IGF1eDsKKwlwaGItPmlvZGEubTMyX3NlZ21hcCA9IGF1eCArIG0zMm1hcF9vZmY7CisJcGhiLT5pb2RhLmlvX3NlZ21hcCA9IGF1eCArIGlvbWFwX29mZjsKKwlwaGItPmlvZGEucGVfYXJyYXkgPSBhdXggKyBwZW1hcF9vZmY7CisJc2V0X2JpdCgwLCBwaGItPmlvZGEucGVfYWxsb2MpOworCisJSU5JVF9MSVNUX0hFQUQoJnBoYi0+aW9kYS5wZV9saXN0KTsKKworCS8qIENhbGN1bGF0ZSBob3cgbWFueSAzMi1iaXQgVENFIHNlZ21lbnRzIHdlIGhhdmUgKi8KKwlwaGItPmlvZGEudGNlMzJfY291bnQgPSBwaGItPmlvZGEubTMyX3BjaV9iYXNlID4+IDI4OworCisJLyogQ2xlYXIgdW51c2FibGUgbTY0ICovCisJaG9zZS0+bWVtX3Jlc291cmNlc1sxXS5mbGFncyA9IDA7CisJaG9zZS0+bWVtX3Jlc291cmNlc1sxXS5zdGFydCA9IDA7CisJaG9zZS0+bWVtX3Jlc291cmNlc1sxXS5lbmQgPSAwOworCWhvc2UtPm1lbV9yZXNvdXJjZXNbMl0uZmxhZ3MgPSAwOworCWhvc2UtPm1lbV9yZXNvdXJjZXNbMl0uc3RhcnQgPSAwOworCWhvc2UtPm1lbV9yZXNvdXJjZXNbMl0uZW5kID0gMDsKKworI2lmIDAKKwlyYyA9IG9wYWxfcGNpX3NldF9waGJfbWVtX3dpbmRvdyhvcGFsLT5waGJfaWQsCisJCQkJCSB3aW5kb3dfdHlwZSwKKwkJCQkJIHdpbmRvd19udW0sCisJCQkJCSBzdGFydGluZ19yZWFsX2FkZHJlc3MsCisJCQkJCSBzdGFydGluZ19wY2lfYWRkcmVzcywKKwkJCQkJIHNlZ21lbnRfc2l6ZSk7CisjZW5kaWYKKworCXByX2luZm8oIiAgJWQgUEUncyBNMzI6IDB4JXggW3NlZ21lbnQ9MHgleF0gSU86IDB4JXggW3NlZ21lbnQ9MHgleF1cbiIsCisJCXBoYi0+aW9kYS50b3RhbF9wZSwKKwkJcGhiLT5pb2RhLm0zMl9zaXplLCBwaGItPmlvZGEubTMyX3NlZ3NpemUsCisJCXBoYi0+aW9kYS5pb19zaXplLCBwaGItPmlvZGEuaW9fc2Vnc2l6ZSk7CisKKwlpZiAocGhiLT5yZWdzKSAgeworCQlwcl9kZXZlbCgiIEJVSUQgICAgID0gMHglMDE2bGx4XG4iLCBpbl9iZTY0KHBoYi0+cmVncyArIDB4MTAwKSk7CisJCXByX2RldmVsKCIgUEhCMl9DUiAgPSAweCUwMTZsbHhcbiIsIGluX2JlNjQocGhiLT5yZWdzICsgMHgxNjApKTsKKwkJcHJfZGV2ZWwoIiBJT19CQVIgICA9IDB4JTAxNmxseFxuIiwgaW5fYmU2NChwaGItPnJlZ3MgKyAweDE3MCkpOworCQlwcl9kZXZlbCgiIElPX0JBTVIgID0gMHglMDE2bGx4XG4iLCBpbl9iZTY0KHBoYi0+cmVncyArIDB4MTc4KSk7CisJCXByX2RldmVsKCIgSU9fU0FSICAgPSAweCUwMTZsbHhcbiIsIGluX2JlNjQocGhiLT5yZWdzICsgMHgxODApKTsKKwkJcHJfZGV2ZWwoIiBNMzJfQkFSICA9IDB4JTAxNmxseFxuIiwgaW5fYmU2NChwaGItPnJlZ3MgKyAweDE5MCkpOworCQlwcl9kZXZlbCgiIE0zMl9CQU1SID0gMHglMDE2bGx4XG4iLCBpbl9iZTY0KHBoYi0+cmVncyArIDB4MTk4KSk7CisJCXByX2RldmVsKCIgTTMyX1NBUiAgPSAweCUwMTZsbHhcbiIsIGluX2JlNjQocGhiLT5yZWdzICsgMHgxYTApKTsKKwl9CisJcGhiLT5ob3NlLT5vcHMgPSAmcG52X3BjaV9vcHM7CisKKwkvKiBTZXR1cCBSSUQgLT4gUEUgbWFwcGluZyBmdW5jdGlvbiAqLworCXBoYi0+YmRmbl90b19wZSA9IHBudl9pb2RhX2JkZm5fdG9fcGU7CisKKwkvKiBTZXR1cCBUQ0VzICovCisJcGhiLT5kbWFfZGV2X3NldHVwID0gcG52X3BjaV9pb2RhX2RtYV9kZXZfc2V0dXA7CisKKwkvKiBTZXR1cCBNU0kgc3VwcG9ydCAqLworCXBudl9wY2lfaW5pdF9pb2RhX21zaXMocGhiKTsKKworCS8qIFdlIHNldCBib3RoIHByb2JlX29ubHkgYW5kIFBDSV9SRUFTU0lHTl9BTExfUlNSQy4gVGhpcyBpcyBhbgorCSAqIG9kZCBjb21iaW5hdGlvbiB3aGljaCBlc3NlbnRpYWxseSBtZWFucyB0aGF0IHdlIHNraXAgYWxsIHJlc291cmNlCisJICogZml4dXBzIGFuZCBhc3NpZ25tZW50cyBpbiB0aGUgZ2VuZXJpYyBjb2RlLCBhbmQgZG8gaXQgYWxsCisJICogb3Vyc2VsdmVzIGhlcmUKKwkgKi8KKwlwY2lfcHJvYmVfb25seSA9IDE7CisJcHBjX21kLnBjaWJpb3NfZml4dXBfcGhiID0gcG52X3BjaV9pb2RhX2ZpeHVwX3BoYjsKKwlwcGNfbWQucGNpYmlvc19lbmFibGVfZGV2aWNlX2hvb2sgPSBwbnZfcGNpX2VuYWJsZV9kZXZpY2VfaG9vazsKKwlwY2lfYWRkX2ZsYWdzKFBDSV9SRUFTU0lHTl9BTExfUlNSQyk7CisKKwkvKiBSZXNldCBJT0RBIHRhYmxlcyB0byBhIGNsZWFuIHN0YXRlICovCisJcmMgPSBvcGFsX3BjaV9yZXNldChwaGJfaWQsIE9QQUxfUENJX0lPREFfVEFCTEVfUkVTRVQsIE9QQUxfQVNTRVJUX1JFU0VUKTsKKwlpZiAocmMpCisJCXByX3dhcm5pbmcoIiAgT1BBTCBFcnJvciAlbGQgcGVyZm9ybWluZyBJT0RBIHRhYmxlIHJlc2V0ICFcbiIsIHJjKTsKKwlvcGFsX3BjaV9zZXRfcGUocGhiX2lkLCAwLCAwLCA3LCAxLCAxICwgT1BBTF9NQVBfUEUpOworfQorCit2b2lkIF9faW5pdCBwbnZfcGNpX2luaXRfaW9kYV9odWIoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnBoYm47CisJY29uc3QgdTY0ICpwcm9wNjQ7CisJdTY0IGh1Yl9pZDsKKworCXByX2luZm8oIlByb2JpbmcgSU9EQSBJTy1IdWIgJXNcbiIsIG5wLT5mdWxsX25hbWUpOworCisJcHJvcDY0ID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiaWJtLG9wYWwtaHViaWQiLCBOVUxMKTsKKwlpZiAoIXByb3A2NCkgeworCQlwcl9lcnIoIiBNaXNzaW5nIFwiaWJtLG9wYWwtaHViaWRcIiBwcm9wZXJ0eSAhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlodWJfaWQgPSBiZTY0X3RvX2NwdXAocHJvcDY0KTsKKwlwcl9kZXZlbCgiIEhVQi1JRCA6IDB4JTAxNmxseFxuIiwgaHViX2lkKTsKKworCS8qIENvdW50IGNoaWxkIFBIQnMgKi8KKwlmb3JfZWFjaF9jaGlsZF9vZl9ub2RlKG5wLCBwaGJuKSB7CisJCS8qIExvb2sgZm9yIElPREExIFBIQnMgKi8KKwkJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKHBoYm4sICJpYm0saW9kYS1waGIiKSkKKwkJCXBudl9wY2lfaW5pdF9pb2RhMV9waGIocGhibik7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS1wNWlvYzIuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2ktcDVpb2MyLmMKaW5kZXggNGM4MGY3Yy4uMjY0OTY3NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS1wNWlvYzIuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLXA1aW9jMi5jCkBAIC0xMzcsNiArMTM3LDcgQEAKIAlwaGItPmhvc2UtPnByaXZhdGVfZGF0YSA9IHBoYjsKIAlwaGItPm9wYWxfaWQgPSBwaGJfaWQ7CiAJcGhiLT50eXBlID0gUE5WX1BIQl9QNUlPQzI7CisJcGhiLT5tb2RlbCA9IFBOVl9QSEJfTU9ERUxfUDVJT0MyOwogCiAJcGhiLT5yZWdzID0gb2ZfaW9tYXAobnAsIDApOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLmMKaW5kZXggODViYjY2ZC4uYTcwYmMxZSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2kuYwpAQCAtMTQ0LDYgKzE0NCwxMTIgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLwogCitzdGF0aWMgdm9pZCBwbnZfcGNpX2R1bXBfcDdpb2NfZGlhZ19kYXRhKHN0cnVjdCBwbnZfcGhiICpwaGIpCit7CisJc3RydWN0IE9wYWxJb1A3SU9DUGhiRXJyb3JEYXRhICpkYXRhID0gJnBoYi0+ZGlhZy5wN2lvYzsKKwlpbnQgaTsKKworCXByX2luZm8oIlBIQiAlZCBkaWFnbm9zdGljIGRhdGE6XG4iLCBwaGItPmhvc2UtPmdsb2JhbF9udW1iZXIpOworCisJcHJfaW5mbygiICBicmRnQ3RsICAgICAgICAgICAgICA9IDB4JTA4eFxuIiwgZGF0YS0+YnJkZ0N0bCk7CisKKwlwcl9pbmZvKCIgIHBvcnRTdGF0dXNSZWcgICAgICAgID0gMHglMDh4XG4iLCBkYXRhLT5wb3J0U3RhdHVzUmVnKTsKKwlwcl9pbmZvKCIgIHJvb3RDbXBseFN0YXR1cyAgICAgID0gMHglMDh4XG4iLCBkYXRhLT5yb290Q21wbHhTdGF0dXMpOworCXByX2luZm8oIiAgYnVzQWdlbnRTdGF0dXMgICAgICAgPSAweCUwOHhcbiIsIGRhdGEtPmJ1c0FnZW50U3RhdHVzKTsKKworCXByX2luZm8oIiAgZGV2aWNlU3RhdHVzICAgICAgICAgPSAweCUwOHhcbiIsIGRhdGEtPmRldmljZVN0YXR1cyk7CisJcHJfaW5mbygiICBzbG90U3RhdHVzICAgICAgICAgICA9IDB4JTA4eFxuIiwgZGF0YS0+c2xvdFN0YXR1cyk7CisJcHJfaW5mbygiICBsaW5rU3RhdHVzICAgICAgICAgICA9IDB4JTA4eFxuIiwgZGF0YS0+bGlua1N0YXR1cyk7CisJcHJfaW5mbygiICBkZXZDbWRTdGF0dXMgICAgICAgICA9IDB4JTA4eFxuIiwgZGF0YS0+ZGV2Q21kU3RhdHVzKTsKKwlwcl9pbmZvKCIgIGRldlNlY1N0YXR1cyAgICAgICAgID0gMHglMDh4XG4iLCBkYXRhLT5kZXZTZWNTdGF0dXMpOworCisJcHJfaW5mbygiICByb290RXJyb3JTdGF0dXMgICAgICA9IDB4JTA4eFxuIiwgZGF0YS0+cm9vdEVycm9yU3RhdHVzKTsKKwlwcl9pbmZvKCIgIHVuY29yckVycm9yU3RhdHVzICAgID0gMHglMDh4XG4iLCBkYXRhLT51bmNvcnJFcnJvclN0YXR1cyk7CisJcHJfaW5mbygiICBjb3JyRXJyb3JTdGF0dXMgICAgICA9IDB4JTA4eFxuIiwgZGF0YS0+Y29yckVycm9yU3RhdHVzKTsKKwlwcl9pbmZvKCIgIHRscEhkcjEgICAgICAgICAgICAgID0gMHglMDh4XG4iLCBkYXRhLT50bHBIZHIxKTsKKwlwcl9pbmZvKCIgIHRscEhkcjIgICAgICAgICAgICAgID0gMHglMDh4XG4iLCBkYXRhLT50bHBIZHIyKTsKKwlwcl9pbmZvKCIgIHRscEhkcjMgICAgICAgICAgICAgID0gMHglMDh4XG4iLCBkYXRhLT50bHBIZHIzKTsKKwlwcl9pbmZvKCIgIHRscEhkcjQgICAgICAgICAgICAgID0gMHglMDh4XG4iLCBkYXRhLT50bHBIZHI0KTsKKwlwcl9pbmZvKCIgIHNvdXJjZUlkICAgICAgICAgICAgID0gMHglMDh4XG4iLCBkYXRhLT5zb3VyY2VJZCk7CisKKwlwcl9pbmZvKCIgIGVycm9yQ2xhc3MgICAgICAgICAgID0gMHglMDE2bGx4XG4iLCBkYXRhLT5lcnJvckNsYXNzKTsKKwlwcl9pbmZvKCIgIGNvcnJlbGF0b3IgICAgICAgICAgID0gMHglMDE2bGx4XG4iLCBkYXRhLT5jb3JyZWxhdG9yKTsKKworCXByX2luZm8oIiAgcDdpb2NQbHNzciAgICAgICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPnA3aW9jUGxzc3IpOworCXByX2luZm8oIiAgcDdpb2NDc3IgICAgICAgICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPnA3aW9jQ3NyKTsKKwlwcl9pbmZvKCIgIGxlbUZpciAgICAgICAgICAgICAgID0gMHglMDE2bGx4XG4iLCBkYXRhLT5sZW1GaXIpOworCXByX2luZm8oIiAgbGVtRXJyb3JNYXNrICAgICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPmxlbUVycm9yTWFzayk7CisJcHJfaW5mbygiICBsZW1XT0YgICAgICAgICAgICAgICA9IDB4JTAxNmxseFxuIiwgZGF0YS0+bGVtV09GKTsKKwlwcl9pbmZvKCIgIHBoYkVycm9yU3RhdHVzICAgICAgID0gMHglMDE2bGx4XG4iLCBkYXRhLT5waGJFcnJvclN0YXR1cyk7CisJcHJfaW5mbygiICBwaGJGaXJzdEVycm9yU3RhdHVzICA9IDB4JTAxNmxseFxuIiwgZGF0YS0+cGhiRmlyc3RFcnJvclN0YXR1cyk7CisJcHJfaW5mbygiICBwaGJFcnJvckxvZzAgICAgICAgICA9IDB4JTAxNmxseFxuIiwgZGF0YS0+cGhiRXJyb3JMb2cwKTsKKwlwcl9pbmZvKCIgIHBoYkVycm9yTG9nMSAgICAgICAgID0gMHglMDE2bGx4XG4iLCBkYXRhLT5waGJFcnJvckxvZzEpOworCXByX2luZm8oIiAgbW1pb0Vycm9yU3RhdHVzICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPm1taW9FcnJvclN0YXR1cyk7CisJcHJfaW5mbygiICBtbWlvRmlyc3RFcnJvclN0YXR1cyA9IDB4JTAxNmxseFxuIiwgZGF0YS0+bW1pb0ZpcnN0RXJyb3JTdGF0dXMpOworCXByX2luZm8oIiAgbW1pb0Vycm9yTG9nMCAgICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPm1taW9FcnJvckxvZzApOworCXByX2luZm8oIiAgbW1pb0Vycm9yTG9nMSAgICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPm1taW9FcnJvckxvZzEpOworCXByX2luZm8oIiAgZG1hMEVycm9yU3RhdHVzICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPmRtYTBFcnJvclN0YXR1cyk7CisJcHJfaW5mbygiICBkbWEwRmlyc3RFcnJvclN0YXR1cyA9IDB4JTAxNmxseFxuIiwgZGF0YS0+ZG1hMEZpcnN0RXJyb3JTdGF0dXMpOworCXByX2luZm8oIiAgZG1hMEVycm9yTG9nMCAgICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPmRtYTBFcnJvckxvZzApOworCXByX2luZm8oIiAgZG1hMEVycm9yTG9nMSAgICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPmRtYTBFcnJvckxvZzEpOworCXByX2luZm8oIiAgZG1hMUVycm9yU3RhdHVzICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPmRtYTFFcnJvclN0YXR1cyk7CisJcHJfaW5mbygiICBkbWExRmlyc3RFcnJvclN0YXR1cyA9IDB4JTAxNmxseFxuIiwgZGF0YS0+ZG1hMUZpcnN0RXJyb3JTdGF0dXMpOworCXByX2luZm8oIiAgZG1hMUVycm9yTG9nMCAgICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPmRtYTFFcnJvckxvZzApOworCXByX2luZm8oIiAgZG1hMUVycm9yTG9nMSAgICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPmRtYTFFcnJvckxvZzEpOworCisJZm9yIChpID0gMDsgaSA8IE9QQUxfUDdJT0NfTlVNX1BFU1RfUkVHUzsgaSsrKSB7CisJCWlmICgoZGF0YS0+cGVzdEFbaV0gPj4gNjMpID09IDAgJiYKKwkJICAgIChkYXRhLT5wZXN0QltpXSA+PiA2MykgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlwcl9pbmZvKCIgIFBFWyUzZF0gUEVTVEEgICAgICAgID0gMHglMDE2bGx4XG4iLCBpLCBkYXRhLT5wZXN0QVtpXSk7CisJCXByX2luZm8oIiAgICAgICAgICBQRVNUQiAgICAgICAgPSAweCUwMTZsbHhcbiIsIGRhdGEtPnBlc3RCW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBudl9wY2lfZHVtcF9waGJfZGlhZ19kYXRhKHN0cnVjdCBwbnZfcGhiICpwaGIpCit7CisJc3dpdGNoKHBoYi0+bW9kZWwpIHsKKwljYXNlIFBOVl9QSEJfTU9ERUxfUDdJT0M6CisJCXBudl9wY2lfZHVtcF9wN2lvY19kaWFnX2RhdGEocGhiKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJfd2FybmluZygiUENJICVkOiBDYW4ndCBkZWNvZGUgdGhpcyBQSEIgZGlhZyBkYXRhXG4iLAorCQkJICAgcGhiLT5ob3NlLT5nbG9iYWxfbnVtYmVyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBudl9wY2lfaGFuZGxlX2VlaF9jb25maWcoc3RydWN0IHBudl9waGIgKnBoYiwgdTMyIHBlX25vKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHJjOworCWludCBoYXNfZGlhZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwaGItPmxvY2ssIGZsYWdzKTsKKworCXJjID0gb3BhbF9wY2lfZ2V0X3BoYl9kaWFnX2RhdGEocGhiLT5vcGFsX2lkLCBwaGItPmRpYWcuYmxvYiwgUE5WX1BDSV9ESUFHX0JVRl9TSVpFKTsKKwloYXNfZGlhZyA9IChyYyA9PSBPUEFMX1NVQ0NFU1MpOworCisJcmMgPSBvcGFsX3BjaV9lZWhfZnJlZXplX2NsZWFyKHBoYi0+b3BhbF9pZCwgcGVfbm8sCisJCQkJICAgICAgIE9QQUxfRUVIX0FDVElPTl9DTEVBUl9GUkVFWkVfQUxMKTsKKwlpZiAocmMpIHsKKwkJcHJfd2FybmluZygiUENJICVkOiBGYWlsZWQgdG8gY2xlYXIgRUVIIGZyZWV6ZSBzdGF0ZSIKKwkJCSAgICIgZm9yIFBFIyVkLCBlcnIgJWxkXG4iLAorCQkJICAgcGhiLT5ob3NlLT5nbG9iYWxfbnVtYmVyLCBwZV9ubywgcmMpOworCisJCS8qIEZvciBub3csIGxldCdzIG9ubHkgZGlzcGxheSB0aGUgZGlhZyBidWZmZXIgd2hlbiB3ZSBmYWlsIHRvIGNsZWFyCisJCSAqIHRoZSBFRUggc3RhdHVzLiBXZSdsbCBkbyBtb3JlIHNlbnNpYmxlIHRoaW5ncyBsYXRlciB3aGVuIHdlIGhhdmUKKwkJICogcHJvcGVyIEVFSCBzdXBwb3J0LiBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBwb2xsdXRlIG91cnNlbHZlcworCQkgKiB3aXRoIHRoZSBub3JtYWwgZXJyb3JzIGdlbmVyYXRlZCB3aGVuIHByb2JpbmcgZW1wdHkgc2xvdHMKKwkJICovCisJCWlmIChoYXNfZGlhZykKKwkJCXBudl9wY2lfZHVtcF9waGJfZGlhZ19kYXRhKHBoYik7CisJCWVsc2UKKwkJCXByX3dhcm5pbmcoIlBDSSAlZDogTm8gZGlhZyBkYXRhIGF2YWlsYWJsZVxuIiwKKwkJCQkgICBwaGItPmhvc2UtPmdsb2JhbF9udW1iZXIpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBoYi0+bG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgdm9pZCBwbnZfcGNpX2NvbmZpZ19jaGVja19lZWgoc3RydWN0IHBudl9waGIgKnBoYiwgc3RydWN0IHBjaV9idXMgKmJ1cywKIAkJCQkgICAgIHUzMiBiZGZuKQogewpAQCAtMTY1LDE1ICsyNzEsOCBAQAogCX0KIAljZmdfZGJnKCIgLT4gRUVIIGNoZWNrLCBiZGZuPSUwNHggUEUlZCBmc3RhdGU9JXhcbiIsCiAJCWJkZm4sIHBlX25vLCBmc3RhdGUpOwotCWlmIChmc3RhdGUgIT0gMCkgewotCQlyYyA9IG9wYWxfcGNpX2VlaF9mcmVlemVfY2xlYXIocGhiLT5vcGFsX2lkLCBwZV9ubywKLQkJCQkJICAgICAgT1BBTF9FRUhfQUNUSU9OX0NMRUFSX0ZSRUVaRV9BTEwpOwotCQlpZiAocmMpIHsKLQkJCXByX3dhcm5pbmcoIlBDSSAlZDogRmFpbGVkIHRvIGNsZWFyIEVFSCBmcmVlemUgc3RhdGUiCi0JCQkJICAgIiBmb3IgUEUjJWQsIGVyciAlbGxkXG4iLAotCQkJCSAgIHBoYi0+aG9zZS0+Z2xvYmFsX251bWJlciwgcGVfbm8sIHJjKTsKLQkJfQotCX0KKwlpZiAoZnN0YXRlICE9IDApCisJCXBudl9wY2lfaGFuZGxlX2VlaF9jb25maWcocGhiLCBwZV9ubyk7CiB9CiAKIHN0YXRpYyBpbnQgcG52X3BjaV9yZWFkX2NvbmZpZyhzdHJ1Y3QgcGNpX2J1cyAqYnVzLApAQCAtMjU3LDEyICszNTYsNTQgQEAKIAkud3JpdGUgPSBwbnZfcGNpX3dyaXRlX2NvbmZpZywKIH07CiAKKworc3RhdGljIHZvaWQgcG52X3RjZV9pbnZhbGlkYXRlKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLAorCQkJICAgICAgIHU2NCAqc3RhcnRwLCB1NjQgKmVuZHApCit7CisJdTY0IF9faW9tZW0gKmludmFsaWRhdGUgPSAodTY0IF9faW9tZW0gKil0YmwtPml0X2luZGV4OworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZCwgaW5jOworCisJc3RhcnQgPSBfX3BhKHN0YXJ0cCk7CisJZW5kID0gX19wYShlbmRwKTsKKworCisJLyogQk1MIHVzZXMgdGhpcyBjYXNlIGZvciBwNi9wNy9nYWxheHkyOiBTaGlmdCBhZGRyIGFuZCBwdXQgaW4gbm9kZSAqLworCWlmICh0YmwtPml0X2J1c25vKSB7CisJCXN0YXJ0IDw8PSAxMjsKKwkJZW5kIDw8PSAxMjsKKwkJaW5jID0gMTI4IDw8IDEyOworCQlzdGFydCB8PSB0YmwtPml0X2J1c25vOworCQllbmQgfD0gdGJsLT5pdF9idXNubzsKKwl9CisJLyogcDdpb2Mtc3R5bGUgaW52YWxpZGF0aW9uLCAyIFRDRXMgcGVyIHdyaXRlICovCisJZWxzZSBpZiAodGJsLT5pdF90eXBlICYgVENFX1BDSV9TV0lOVl9QQUlSKSB7CisJCXN0YXJ0IHw9ICgxdWxsIDw8IDYzKTsKKwkJZW5kIHw9ICgxdWxsIDw8IDYzKTsKKwkJaW5jID0gMTY7CisJfQorCS8qIERlZmF1bHQgKG9sZGVyIEhXKSAqLworCWVsc2UKKwkJaW5jID0gMTI4OworCisJZW5kIHw9IGluYyAtIDE7CQkvKiByb3VuZCB1cCBlbmQgdG8gYmUgZGlmZmVyZW50IHRoYW4gc3RhcnQgKi8KKworCW1iKCk7IC8qIEVuc3VyZSBhYm92ZSBzdG9yZXMgYXJlIHZpc2libGUgKi8KKwl3aGlsZSAoc3RhcnQgPD0gZW5kKSB7CisJCV9fcmF3X3dyaXRlcShzdGFydCwgaW52YWxpZGF0ZSk7CisJCXN0YXJ0ICs9IGluYzsKKwl9CisJLyogVGhlIGlvbW11IGxheWVyIHdpbGwgZG8gYW5vdGhlciBtYigpIGZvciB1cyBvbiBidWlsZCgpIGFuZAorCSAqIHdlIGRvbid0IGNhcmUgb24gZnJlZSgpCisJICovCit9CisKKwogc3RhdGljIGludCBwbnZfdGNlX2J1aWxkKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCBsb25nIG5wYWdlcywKIAkJCSB1bnNpZ25lZCBsb25nIHVhZGRyLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXJlY3Rpb24sCiAJCQkgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7CiAJdTY0IHByb3RvX3RjZTsKLQl1NjQgKnRjZXA7CisJdTY0ICp0Y2VwLCAqdGNlczsKIAl1NjQgcnBuOwogCiAJcHJvdG9fdGNlID0gVENFX1BDSV9SRUFEOyAvLyBSZWFkIGFsbG93ZWQKQEAgLTI3MCwyNSArNDExLDMzIEBACiAJaWYgKGRpcmVjdGlvbiAhPSBETUFfVE9fREVWSUNFKQogCQlwcm90b190Y2UgfD0gVENFX1BDSV9XUklURTsKIAotCXRjZXAgPSAoKHU2NCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKKwl0Y2VzID0gdGNlcCA9ICgodTY0ICopdGJsLT5pdF9iYXNlKSArIGluZGV4IC0gdGJsLT5pdF9vZmZzZXQ7CisJcnBuID0gX19wYSh1YWRkcikgPj4gVENFX1NISUZUOwogCi0Jd2hpbGUgKG5wYWdlcy0tKSB7Ci0JCS8qIGNhbid0IG1vdmUgdGhpcyBvdXQgc2luY2Ugd2UgbWlnaHQgY3Jvc3MgTE1CIGJvdW5kYXJ5ICovCi0JCXJwbiA9ICh2aXJ0X3RvX2Ficyh1YWRkcikpID4+IFRDRV9TSElGVDsKLQkJKnRjZXAgPSBwcm90b190Y2UgfCAocnBuICYgVENFX1JQTl9NQVNLKSA8PCBUQ0VfUlBOX1NISUZUOworCXdoaWxlIChucGFnZXMtLSkKKwkJKih0Y2VwKyspID0gcHJvdG9fdGNlIHwgKHJwbisrIDw8IFRDRV9SUE5fU0hJRlQpOwogCi0JCXVhZGRyICs9IFRDRV9QQUdFX1NJWkU7Ci0JCXRjZXArKzsKLQl9CisJLyogU29tZSBpbXBsZW1lbnRhdGlvbnMgd29uJ3QgY2FjaGUgaW52YWxpZCBUQ0VzIGFuZCB0aHVzIG1heSBub3QKKwkgKiBuZWVkIHRoYXQgZmx1c2guIFdlJ2xsIHByb2JhYmx5IHR1cm4gaXRfdHlwZSBpbnRvIGEgYml0IG1hc2sKKwkgKiBvZiBmbGFncyBpZiB0aGF0IGJlY29tZXMgdGhlIGNhc2UKKwkgKi8KKwlpZiAodGJsLT5pdF90eXBlICYgVENFX1BDSV9TV0lOVl9DUkVBVEUpCisJCXBudl90Y2VfaW52YWxpZGF0ZSh0YmwsIHRjZXMsIHRjZXAgLSAxKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBwbnZfdGNlX2ZyZWUoc3RydWN0IGlvbW11X3RhYmxlICp0YmwsIGxvbmcgaW5kZXgsIGxvbmcgbnBhZ2VzKQogewotCXU2NCAqdGNlcCA9ICgodTY0ICopdGJsLT5pdF9iYXNlKSArIGluZGV4OworCXU2NCAqdGNlcCwgKnRjZXM7CisKKwl0Y2VzID0gdGNlcCA9ICgodTY0ICopdGJsLT5pdF9iYXNlKSArIGluZGV4IC0gdGJsLT5pdF9vZmZzZXQ7CiAKIAl3aGlsZSAobnBhZ2VzLS0pCiAJCSoodGNlcCsrKSA9IDA7CisKKwlpZiAodGJsLT5pdF90eXBlICYgVENFX1BDSV9TV0lOVl9GUkVFKQorCQlwbnZfdGNlX2ludmFsaWRhdGUodGJsLCB0Y2VzLCB0Y2VwIC0gMSk7CiB9CiAKIHZvaWQgcG52X3BjaV9zZXR1cF9pb21tdV90YWJsZShzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwKQEAgLTMwOCwxMyArNDU3LDE0IEBACiBwbnZfcGNpX3NldHVwX2JtbF9pb21tdShzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2UpCiB7CiAJc3RydWN0IGlvbW11X3RhYmxlICp0Ymw7Ci0JY29uc3QgX19iZTY0ICpiYXNlcDsKKwljb25zdCBfX2JlNjQgKmJhc2VwLCAqc3dpbnZwOwogCWNvbnN0IF9fYmUzMiAqc2l6ZXA7CiAKIAliYXNlcCA9IG9mX2dldF9wcm9wZXJ0eShob3NlLT5kbiwgImxpbnV4LHRjZS1iYXNlIiwgTlVMTCk7CiAJc2l6ZXAgPSBvZl9nZXRfcHJvcGVydHkoaG9zZS0+ZG4sICJsaW51eCx0Y2Utc2l6ZSIsIE5VTEwpOwogCWlmIChiYXNlcCA9PSBOVUxMIHx8IHNpemVwID09IE5VTEwpIHsKLQkJcHJfZXJyKCJQQ0k6ICVzIGhhcyBtaXNzaW5nIHRjZSBlbnRyaWVzICFcbiIsIGhvc2UtPmRuLT5mdWxsX25hbWUpOworCQlwcl9lcnIoIlBDSTogJXMgaGFzIG1pc3NpbmcgdGNlIGVudHJpZXMgIVxuIiwKKwkJICAgICAgIGhvc2UtPmRuLT5mdWxsX25hbWUpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJdGJsID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgaW9tbXVfdGFibGUpLCBHRlBfS0VSTkVMLCBob3NlLT5ub2RlKTsKQEAgLTMyMyw2ICs0NzMsMTUgQEAKIAlwbnZfcGNpX3NldHVwX2lvbW11X3RhYmxlKHRibCwgX192YShiZTY0X3RvX2NwdXAoYmFzZXApKSwKIAkJCQkgIGJlMzJfdG9fY3B1cChzaXplcCksIDApOwogCWlvbW11X2luaXRfdGFibGUodGJsLCBob3NlLT5ub2RlKTsKKworCS8qIERlYWwgd2l0aCBTVyBpbnZhbGlkYXRlZCBUQ0VzIHdoZW4gbmVlZGVkIChCTUwgd2F5KSAqLworCXN3aW52cCA9IG9mX2dldF9wcm9wZXJ0eShob3NlLT5kbiwgImxpbnV4LHRjZS1zdy1pbnZhbGlkYXRlLWluZm8iLAorCQkJCSBOVUxMKTsKKwlpZiAoc3dpbnZwKSB7CisJCXRibC0+aXRfYnVzbm8gPSBzd2ludnBbMV07CisJCXRibC0+aXRfaW5kZXggPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKHN3aW52cFswXSwgOCk7CisJCXRibC0+aXRfdHlwZSA9IFRDRV9QQ0lfU1dJTlZfQ1JFQVRFIHwgVENFX1BDSV9TV0lOVl9GUkVFOworCX0KIAlyZXR1cm4gdGJsOwogfQogCkBAIC0zNTYsNiArNTE1LDEzIEBACiAJCXBudl9wY2lfZG1hX2ZhbGxiYWNrX3NldHVwKGhvc2UsIHBkZXYpOwogfQogCisvKiBGaXh1cCB3cm9uZyBjbGFzcyBjb2RlIGluIHA3aW9jIHJvb3QgY29tcGxleCAqLworc3RhdGljIHZvaWQgX19kZXZpbml0IHBudl9wN2lvY19yY19xdWlyayhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWRldi0+Y2xhc3MgPSBQQ0lfQ0xBU1NfQlJJREdFX1BDSSA8PCA4OworfQorREVDTEFSRV9QQ0lfRklYVVBfRUFSTFkoUENJX1ZFTkRPUl9JRF9JQk0sIDB4M2I5LCBwbnZfcDdpb2NfcmNfcXVpcmspOworCiBzdGF0aWMgaW50IHBudl9wY2lfcHJvYmVfbW9kZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChidXMpOwpAQCAtNDAwLDEyICs1NjYsMjQgQEAKIAkJaW5pdF9wY2lfY29uZmlnX3Rva2VucygpOwogCQlmaW5kX2FuZF9pbml0X3BoYnMoKTsKICNlbmRpZiAvKiBDT05GSUdfUFBDX1BPV0VSTlZfUlRBUyAqLwotCX0gZWxzZSB7Ci0JCS8qIE9QQUwgaXMgaGVyZSwgZG8gb3VyIG5vcm1hbCBzdHVmZiAqLworCX0KKwkvKiBPUEFMIGlzIGhlcmUsIGRvIG91ciBub3JtYWwgc3R1ZmYgKi8KKwllbHNlIHsKKwkJaW50IGZvdW5kX2lvZGEgPSAwOworCisJCS8qIExvb2sgZm9yIElPREEgSU8tSHVicy4gV2UgZG9uJ3Qgc3VwcG9ydCBtaXhpbmcgSU9EQQorCQkgKiBhbmQgcDVpb2MyIGR1ZSB0byB0aGUgbmVlZCB0byBjaGFuZ2Ugc29tZSBnbG9iYWwKKwkJICogcHJvYmluZyBmbGFncworCQkgKi8KKwkJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiaWJtLGlvZGEtaHViIikgeworCQkJcG52X3BjaV9pbml0X2lvZGFfaHViKG5wKTsKKwkJCWZvdW5kX2lvZGEgPSAxOworCQl9CiAKIAkJLyogTG9vayBmb3IgcDVpb2MyIElPLUh1YnMgKi8KLQkJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiaWJtLHA1aW9jMiIpCi0JCQlwbnZfcGNpX2luaXRfcDVpb2MyX2h1YihucCk7CisJCWlmICghZm91bmRfaW9kYSkKKwkJCWZvcl9lYWNoX2NvbXBhdGlibGVfbm9kZShucCwgTlVMTCwgImlibSxwNWlvYzIiKQorCQkJCXBudl9wY2lfaW5pdF9wNWlvYzJfaHViKG5wKTsKIAl9CiAKIAkvKiBTZXR1cCB0aGUgbGlua2FnZSBiZXR3ZWVuIE9GIG5vZGVzIGFuZCBQSEJzICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvcGNpLmgKaW5kZXggZDRkYmM0OS4uOGJjNDc5NiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3BjaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9wY2kuaApAQCAtOSw5ICs5LDYzIEBACiAJUE5WX1BIQl9JT0RBMiwKIH07CiAKKy8qIFByZWNpc2UgUEhCIG1vZGVsIGZvciBlcnJvciBtYW5hZ2VtZW50ICovCitlbnVtIHBudl9waGJfbW9kZWwgeworCVBOVl9QSEJfTU9ERUxfVU5LTk9XTiwKKwlQTlZfUEhCX01PREVMX1A1SU9DMiwKKwlQTlZfUEhCX01PREVMX1A3SU9DLAorfTsKKworI2RlZmluZSBQTlZfUENJX0RJQUdfQlVGX1NJWkUJNDA5NgorCisvKiBEYXRhIGFzc29jaWF0ZWQgd2l0aCBhIFBFLCBpbmNsdWRpbmcgSU9NTVUgdHJhY2tpbmcgZXRjLi4gKi8KK3N0cnVjdCBwbnZfaW9kYV9wZSB7CisJLyogQSBQRSBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGEgc2luZ2xlIGRldmljZSBvciBhbgorCSAqIGVudGlyZSBidXMgKCYgY2hpbGRyZW4pLiBJbiB0aGUgZm9ybWVyIGNhc2UsIHBkZXYKKwkgKiBpcyBwb3B1bGF0ZWQsIGluIHRoZSBsYXRlciBjYXNlLCBwYnVzIGlzLgorCSAqLworCXN0cnVjdCBwY2lfZGV2CQkqcGRldjsKKwlzdHJ1Y3QgcGNpX2J1cwkJKnBidXM7CisKKwkvKiBFZmZlY3RpdmUgUklEIChkZXZpY2UgUklEIGZvciBhIGRldmljZSBQRSBhbmQgYmFzZSBidXMKKwkgKiBSSUQgd2l0aCBkZXZmbiAwIGZvciBhIGJ1cyBQRSkKKwkgKi8KKwl1bnNpZ25lZCBpbnQJCXJpZDsKKworCS8qIFBFIG51bWJlciAqLworCXVuc2lnbmVkIGludAkJcGVfbnVtYmVyOworCisJLyogIldlaWdodCIgYXNzaWduZWQgdG8gdGhlIFBFIGZvciB0aGUgc2FrZSBvZiBETUEgcmVzb3VyY2UKKwkgKiBhbGxvY2F0aW9ucworCSAqLworCXVuc2lnbmVkIGludAkJZG1hX3dlaWdodDsKKworCS8qIFRoaXMgaXMgYSBQQ0ktRSAtPiBQQ0ktWCBicmlkZ2UsIHRoaXMgcG9pbnRzIHRvIHRoZQorCSAqIGNvcnJlc3BvbmRpbmcgYnVzIFBFCisJICovCisJc3RydWN0IHBudl9pb2RhX3BlCSpidXNfcGU7CisKKwkvKiAiQmFzZSIgaW9tbXUgdGFibGUsIGllLCA0SyBUQ0VzLCAzMi1iaXQgRE1BICovCisJaW50CQkJdGNlMzJfc2VnOworCWludAkJCXRjZTMyX3NlZ2NvdW50OworCXN0cnVjdCBpb21tdV90YWJsZQl0Y2UzMl90YWJsZTsKKworCS8qIFhYWCBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgYWRkaXRpb25hbCA2NC1iaXQgaW9tbXVzICovCisKKwkvKiBNU0lzLiBNVkUgaW5kZXggaXMgaWRlbnRpY2FsIGZvciBmb3IgMzIgYW5kIDY0IGJpdCBNU0kKKwkgKiBhbmQgLTEgaWYgbm90IHN1cHBvcnRlZC4gKEl0J3MgYWN0dWFsbHkgaWRlbnRpY2FsIHRvIHRoZQorCSAqIFBFIG51bWJlcikKKwkgKi8KKwlpbnQJCQltdmVfbnVtYmVyOworCisJLyogTGluayBpbiBsaXN0IG9mIFBFI3MgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpbms7Cit9OworCiBzdHJ1Y3QgcG52X3BoYiB7CiAJc3RydWN0IHBjaV9jb250cm9sbGVyCSpob3NlOwogCWVudW0gcG52X3BoYl90eXBlCXR5cGU7CisJZW51bSBwbnZfcGhiX21vZGVsCW1vZGVsOwogCXU2NAkJCW9wYWxfaWQ7CiAJdm9pZCBfX2lvbWVtCQkqcmVnczsKIAlzcGlubG9ja190CQlsb2NrOwpAQCAtMzQsNyArODgsNTIgQEAKIAkJc3RydWN0IHsKIAkJCXN0cnVjdCBpb21tdV90YWJsZSBpb21tdV90YWJsZTsKIAkJfSBwNWlvYzI7CisKKwkJc3RydWN0IHsKKwkJCS8qIEdsb2JhbCBicmlkZ2UgaW5mbyAqLworCQkJdW5zaWduZWQgaW50CQl0b3RhbF9wZTsKKwkJCXVuc2lnbmVkIGludAkJbTMyX3NpemU7CisJCQl1bnNpZ25lZCBpbnQJCW0zMl9zZWdzaXplOworCQkJdW5zaWduZWQgaW50CQltMzJfcGNpX2Jhc2U7CisJCQl1bnNpZ25lZCBpbnQJCWlvX3NpemU7CisJCQl1bnNpZ25lZCBpbnQJCWlvX3NlZ3NpemU7CisJCQl1bnNpZ25lZCBpbnQJCWlvX3BjaV9iYXNlOworCisJCQkvKiBQRSBhbGxvY2F0aW9uIGJpdG1hcCAqLworCQkJdW5zaWduZWQgbG9uZwkJKnBlX2FsbG9jOworCisJCQkvKiBNMzIgJiBJTyBzZWdtZW50IG1hcHMgKi8KKwkJCXVuc2lnbmVkIGludAkJKm0zMl9zZWdtYXA7CisJCQl1bnNpZ25lZCBpbnQJCSppb19zZWdtYXA7CisJCQlzdHJ1Y3QgcG52X2lvZGFfcGUJKnBlX2FycmF5OworCisJCQkvKiBSZXZlcnNlIG1hcCBvZiBQRXMsIHdpbGwgaGF2ZSB0byBleHRlbmQgaWYKKwkJCSAqIHdlIGFyZSB0byBzdXBwb3J0IG1vcmUgdGhhbiAyNTYgUEVzLCBpbmRleGVkCisJCQkgKiBidXMgeyBidXMsIGRldmZuIH0KKwkJCSAqLworCQkJdW5zaWduZWQgY2hhcgkJcGVfcm1hcFsweDEwMDAwXTsKKworCQkJLyogMzItYml0IFRDRSB0YWJsZXMgYWxsb2NhdGlvbiAqLworCQkJdW5zaWduZWQgbG9uZwkJdGNlMzJfY291bnQ7CisKKwkJCS8qIFRvdGFsICJ3ZWlnaHQiIGZvciB0aGUgc2FrZSBvZiBETUEgcmVzb3VyY2VzCisJCQkgKiBhbGxvY2F0aW9uCisJCQkgKi8KKwkJCXVuc2lnbmVkIGludAkJZG1hX3dlaWdodDsKKwkJCXVuc2lnbmVkIGludAkJZG1hX3BlX2NvdW50OworCisJCQkvKiBTb3J0ZWQgbGlzdCBvZiB1c2VkIFBFJ3MsIHNvcnRlZCBhdAorCQkJICogYm9vdCBmb3IgcmVzb3VyY2UgYWxsb2NhdGlvbiBwdXJwb3NlcworCQkJICovCisJCQlzdHJ1Y3QgbGlzdF9oZWFkCXBlX2xpc3Q7CisJCX0gaW9kYTsKIAl9OworCisJLyogUEhCIHN0YXR1cyBzdHJ1Y3R1cmUgKi8KKwl1bmlvbiB7CisJCXVuc2lnbmVkIGNoYXIJCQlibG9iW1BOVl9QQ0lfRElBR19CVUZfU0laRV07CisJCXN0cnVjdCBPcGFsSW9QN0lPQ1BoYkVycm9yRGF0YQlwN2lvYzsKKwl9IGRpYWc7CiB9OwogCiBleHRlcm4gc3RydWN0IHBjaV9vcHMgcG52X3BjaV9vcHM7CkBAIC00Myw2ICsxNDIsNyBAQAogCQkJCSAgICAgIHZvaWQgKnRjZV9tZW0sIHU2NCB0Y2Vfc2l6ZSwKIAkJCQkgICAgICB1NjQgZG1hX29mZnNldCk7CiBleHRlcm4gdm9pZCBwbnZfcGNpX2luaXRfcDVpb2MyX2h1YihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKK2V4dGVybiB2b2lkIHBudl9wY2lfaW5pdF9pb2RhX2h1YihzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIAogCiAjZW5kaWYgLyogX19QT1dFUk5WX1BDSV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybnYvc21wLmMKaW5kZXggZTg3NzM2Ni4uMTcyMTBjNSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm52L3NtcC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJudi9zbXAuYwpAQCAtNzUsNyArNzUsNyBAQAogCS8qIE9uIE9QQUwgdjIgdGhlIENQVSBhcmUgc3RpbGwgc3Bpbm5pbmcgaW5zaWRlIE9QQUwgaXRzZWxmLAogCSAqIGdldCB0aGVtIGJhY2sgbm93CiAJICovCi0JaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTHYyKSkgeworCWlmICghcGFjYVtucl0uY3B1X3N0YXJ0ICYmIGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfT1BBTHYyKSkgewogCQlwcl9kZXZlbCgiT1BBTDogU3RhcnRpbmcgQ1BVICVkIChIVyAweCV4KS4uLlxuIiwgbnIsIHBjcHUpOwogCQlyYyA9IG9wYWxfc3RhcnRfY3B1KHBjcHUsIHN0YXJ0X2hlcmUpOwogCQlpZiAocmMgIT0gT1BBTF9TVUNDRVNTKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvaW50ZXJydXB0LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwppbmRleCAxZDZmNGY0Li42MTdlZmExIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9pbnRlcnJ1cHQuYwpAQCAtMzEsMTggKzMxLDE4IEBACiAKICNpZiBkZWZpbmVkKERFQlVHKQogI2RlZmluZSBEQkcgdWRiZ19wcmludGYKKyNkZWZpbmUgRkFJTCB1ZGJnX3ByaW50ZgogI2Vsc2UKLSNkZWZpbmUgREJHIHByX2RlYnVnCisjZGVmaW5lIERCRyBwcl9kZXZlbAorI2RlZmluZSBGQUlMIHByX2RlYnVnCiAjZW5kaWYKIAogLyoqCiAgKiBzdHJ1Y3QgcHMzX2JtcCAtIGEgcGVyIGNwdSBpcnEgc3RhdHVzIGFuZCBtYXNrIGJpdG1hcCBzdHJ1Y3R1cmUKICAqIEBzdGF0dXM6IDI1NiBiaXQgc3RhdHVzIGJpdG1hcCBpbmRleGVkIGJ5IHBsdWcKLSAqIEB1bnVzZWRfMToKKyAqIEB1bnVzZWRfMTogQWxpZ25tZW50CiAgKiBAbWFzazogMjU2IGJpdCBtYXNrIGJpdG1hcCBpbmRleGVkIGJ5IHBsdWcKLSAqIEB1bnVzZWRfMjoKLSAqIEBsb2NrOgotICogQGlwaV9kZWJ1Z19icmtfbWFzazoKKyAqIEB1bnVzZWRfMjogQWxpZ25tZW50CiAgKgogICogVGhlIEhWIG1haW50YWlucyBwZXIgU01UIHRocmVhZCBtYXBwaW5ncyBvZiBIViBvdXRsZXQgdG8gSFYgcGx1ZyBvbgogICogYmVoYWxmIG9mIHRoZSBndWVzdC4gIFRoZXNlIG1hcHBpbmdzIGFyZSBpbXBsZW1lbnRlZCBhcyAyNTYgYml0IGd1ZXN0CkBAIC03MywyMSArNzMsMjQgQEAKIAkJdW5zaWduZWQgbG9uZyBtYXNrOwogCQl1NjQgdW51c2VkXzJbM107CiAJfTsKLQl1NjQgaXBpX2RlYnVnX2Jya19tYXNrOwotCXNwaW5sb2NrX3QgbG9jazsKIH07CiAKIC8qKgogICogc3RydWN0IHBzM19wcml2YXRlIC0gYSBwZXIgY3B1IGRhdGEgc3RydWN0dXJlCiAgKiBAYm1wOiBwczNfYm1wIHN0cnVjdHVyZQorICogQGJtcF9sb2NrOiBTeW5jcm9uaXplIGFjY2VzcyB0byBibXAuCisgKiBAaXBpX2RlYnVnX2Jya19tYXNrOiBNYXNrIGZvciBkZWJ1ZyBicmVhayBJUElzCiAgKiBAcHBlX2lkOiBIViBsb2dpY2FsX3BwZV9pZAogICogQHRocmVhZF9pZDogSFYgdGhyZWFkX2lkCisgKiBAaXBpX21hc2s6IE1hc2sgb2YgSVBJIHZpcnFzCiAgKi8KIAogc3RydWN0IHBzM19wcml2YXRlIHsKIAlzdHJ1Y3QgcHMzX2JtcCBibXAgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQgKFBTM19CTVBfTUlOQUxJR04pKSk7CisJc3BpbmxvY2tfdCBibXBfbG9jazsKIAl1NjQgcHBlX2lkOwogCXU2NCB0aHJlYWRfaWQ7CisJdW5zaWduZWQgbG9uZyBpcGlfZGVidWdfYnJrX21hc2s7CiAJdW5zaWduZWQgbG9uZyBpcGlfbWFzazsKIH07CiAKQEAgLTEwNSw3ICsxMDgsNyBAQAogCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JcHJfZGVidWcoIiVzOiVkOiB0aHJlYWRfaWQgJWxsdSwgdmlycSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCURCRygiJXM6JWQ6IHRocmVhZF9pZCAlbGx1LCB2aXJxICVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCXBkLT50aHJlYWRfaWQsIGQtPmlycSk7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CkBAIC0xMjYsNyArMTI5LDcgQEAKIAlzdHJ1Y3QgcHMzX3ByaXZhdGUgKnBkID0gaXJxX2RhdGFfZ2V0X2lycV9jaGlwX2RhdGEoZCk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXByX2RlYnVnKCIlczolZDogdGhyZWFkX2lkICVsbHUsIHZpcnEgJWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwlEQkcoIiVzOiVkOiB0aHJlYWRfaWQgJWxsdSwgdmlycSAlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQlwZC0+dGhyZWFkX2lkLCBkLT5pcnEpOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtMTkwLDE5ICsxOTMsMTkgQEAKIAkqdmlycSA9IGlycV9jcmVhdGVfbWFwcGluZyhOVUxMLCBvdXRsZXQpOwogCiAJaWYgKCp2aXJxID09IE5PX0lSUSkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IGlycV9jcmVhdGVfbWFwcGluZyBmYWlsZWQ6IG91dGxldCAlbHVcbiIsCisJCUZBSUwoIiVzOiVkOiBpcnFfY3JlYXRlX21hcHBpbmcgZmFpbGVkOiBvdXRsZXQgJWx1XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBvdXRsZXQpOwogCQlyZXN1bHQgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxfY3JlYXRlOwogCX0KIAotCXByX2RlYnVnKCIlczolZDogb3V0bGV0ICVsdSA9PiBjcHUgJXUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwlEQkcoIiVzOiVkOiBvdXRsZXQgJWx1ID0+IGNwdSAldSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQlvdXRsZXQsIGNwdSwgKnZpcnEpOwogCiAJcmVzdWx0ID0gaXJxX3NldF9jaGlwX2RhdGEoKnZpcnEsIHBkKTsKIAogCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkOiBpcnFfc2V0X2NoaXBfZGF0YSBmYWlsZWRcbiIsCisJCUZBSUwoIiVzOiVkOiBpcnFfc2V0X2NoaXBfZGF0YSBmYWlsZWRcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18pOwogCQlnb3RvIGZhaWxfc2V0OwogCX0KQEAgLTIyOCwxMyArMjMxLDEzIEBACiB7CiAJY29uc3Qgc3RydWN0IHBzM19wcml2YXRlICpwZCA9IGlycV9nZXRfY2hpcF9kYXRhKHZpcnEpOwogCi0JcHJfZGVidWcoIiVzOiVkOiBwcGVfaWQgJWxsdSwgdGhyZWFkX2lkICVsbHUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLAorCURCRygiJXM6JWQ6IHBwZV9pZCAlbGx1LCB0aHJlYWRfaWQgJWxsdSwgdmlycSAldVxuIiwgX19mdW5jX18sCiAJCV9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLCB2aXJxKTsKIAogCWlycV9zZXRfY2hpcF9kYXRhKHZpcnEsIE5VTEwpOwogCWlycV9kaXNwb3NlX21hcHBpbmcodmlycSk7CiAKLQlwcl9kZWJ1ZygiJXM6JWQgPC1cbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJREJHKCIlczolZCA8LVxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjU3LDcgKzI2MCw3IEBACiAJcmVzdWx0ID0gcHMzX3ZpcnFfc2V0dXAoY3B1LCBvdXRsZXQsIHZpcnEpOwogCiAJaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IHBzM192aXJxX3NldHVwIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJRkFJTCgiJXM6JWQ6IHBzM192aXJxX3NldHVwIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJZ290byBmYWlsX3NldHVwOwogCX0KIApAQCAtMjY5LDcgKzI3Miw3IEBACiAJCW91dGxldCwgMCk7CiAKIAlpZiAocmVzdWx0KSB7Ci0JCXByX2luZm8oIiVzOiVkOiBsdjFfY29ubmVjdF9pcnFfcGx1Z19leHQgZmFpbGVkOiAlc1xuIiwKKwkJRkFJTCgiJXM6JWQ6IGx2MV9jb25uZWN0X2lycV9wbHVnX2V4dCBmYWlsZWQ6ICVzXG4iLAogCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAJCXJlc3VsdCA9IC1FUEVSTTsKIAkJZ290byBmYWlsX2Nvbm5lY3Q7CkBAIC0yOTgsNyArMzAxLDcgQEAKIAlpbnQgcmVzdWx0OwogCWNvbnN0IHN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSBpcnFfZ2V0X2NoaXBfZGF0YSh2aXJxKTsKIAotCXByX2RlYnVnKCIlczolZDogcHBlX2lkICVsbHUsIHRocmVhZF9pZCAlbGx1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywKKwlEQkcoIiVzOiVkOiBwcGVfaWQgJWxsdSwgdGhyZWFkX2lkICVsbHUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLAogCQlfX0xJTkVfXywgcGQtPnBwZV9pZCwgcGQtPnRocmVhZF9pZCwgdmlycSk7CiAKIAlwczNfY2hpcF9tYXNrKGlycV9nZXRfaXJxX2RhdGEodmlycSkpOwpAQCAtMzA2LDcgKzMwOSw3IEBACiAJcmVzdWx0ID0gbHYxX2Rpc2Nvbm5lY3RfaXJxX3BsdWdfZXh0KHBkLT5wcGVfaWQsIHBkLT50aHJlYWRfaWQsIHZpcnEpOwogCiAJaWYgKHJlc3VsdCkKLQkJcHJfaW5mbygiJXM6JWQ6IGx2MV9kaXNjb25uZWN0X2lycV9wbHVnX2V4dCBmYWlsZWQ6ICVzXG4iLAorCQlGQUlMKCIlczolZDogbHYxX2Rpc2Nvbm5lY3RfaXJxX3BsdWdfZXh0IGZhaWxlZDogJXNcbiIsCiAJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAogCXBzM192aXJxX2Rlc3Ryb3kodmlycSk7CkBAIC0zMzQsNyArMzM3LDcgQEAKIAlyZXN1bHQgPSBsdjFfY29uc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCgmb3V0bGV0KTsKIAogCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkOiBsdjFfY29uc3RydWN0X2V2ZW50X3JlY2VpdmVfcG9ydCBmYWlsZWQ6ICVzXG4iLAorCQlGQUlMKCIlczolZDogbHYxX2NvbnN0cnVjdF9ldmVudF9yZWNlaXZlX3BvcnQgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAkJKnZpcnEgPSBOT19JUlE7CiAJCXJldHVybiByZXN1bHQ7CkBAIC0zNjAsMTQgKzM2MywxNCBAQAogewogCWludCByZXN1bHQ7CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgdmlycSk7CisJREJHKCIgLT4gJXM6JWQgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCB2aXJxKTsKIAogCXBzM19jaGlwX21hc2soaXJxX2dldF9pcnFfZGF0YSh2aXJxKSk7CiAKIAlyZXN1bHQgPSBsdjFfZGVzdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0KHZpcnFfdG9faHcodmlycSkpOwogCiAJaWYgKHJlc3VsdCkKLQkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZGVzdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0IGZhaWxlZDogJXNcbiIsCisJCUZBSUwoIiVzOiVkOiBsdjFfZGVzdHJ1Y3RfZXZlbnRfcmVjZWl2ZV9wb3J0IGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKIAkvKgpAQCAtMzc1LDcgKzM3OCw3IEBACiAJICogY2FsbHMgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCAoc21wX2NhbGxfZnVuY3Rpb24pIHdoZW4ga2V4ZWNpbmcuCiAJICovCiAKLQlwcl9kZWJ1ZygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCURCRygiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTQxMSw3ICs0MTQsNyBAQAogCQlkZXYtPmRldl9pZCwgdmlycV90b19odygqdmlycSksIGRldi0+aW50ZXJydXB0X2lkKTsKIAogCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkOiBsdjFfY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0IgorCQlGQUlMKCIlczolZDogbHYxX2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydCIKIAkJCSIgZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAkJcHMzX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KCp2aXJxKTsKQEAgLTQxOSw3ICs0MjIsNyBAQAogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXByX2RlYnVnKCIlczolZDogaW50ZXJydXB0X2lkICV1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJREJHKCIlczolZDogaW50ZXJydXB0X2lkICV1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCWRldi0+aW50ZXJydXB0X2lkLCAqdmlycSk7CiAKIAlyZXR1cm4gMDsKQEAgLTQzMywxNCArNDM2LDE0IEBACiAKIAlpbnQgcmVzdWx0OwogCi0JcHJfZGVidWcoIiAtPiAlczolZDogaW50ZXJydXB0X2lkICV1LCB2aXJxICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJREJHKCIgLT4gJXM6JWQ6IGludGVycnVwdF9pZCAldSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQlkZXYtPmludGVycnVwdF9pZCwgdmlycSk7CiAKIAlyZXN1bHQgPSBsdjFfZGlzY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0KGRldi0+YnVzX2lkLAogCQlkZXYtPmRldl9pZCwgdmlycV90b19odyh2aXJxKSwgZGV2LT5pbnRlcnJ1cHRfaWQpOwogCiAJaWYgKHJlc3VsdCkKLQkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZGlzY29ubmVjdF9pbnRlcnJ1cHRfZXZlbnRfcmVjZWl2ZV9wb3J0IgorCQlGQUlMKCIlczolZDogbHYxX2Rpc2Nvbm5lY3RfaW50ZXJydXB0X2V2ZW50X3JlY2VpdmVfcG9ydCIKIAkJCSIgZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJcHMzX3Jlc3VsdChyZXN1bHQpKTsKIApAQCAtNDU1LDcgKzQ1OCw3IEBACiAJcmVzdWx0ID0gcHMzX3ZpcnFfZGVzdHJveSh2aXJxKTsKIAlCVUdfT04ocmVzdWx0KTsKIAotCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJREJHKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KIEVYUE9SVF9TWU1CT0wocHMzX3NiX2V2ZW50X3JlY2VpdmVfcG9ydF9kZXN0cm95KTsKQEAgLTQ4MCw3ICs0ODMsNyBAQAogCXJlc3VsdCA9IGx2MV9jb25zdHJ1Y3RfaW9faXJxX291dGxldChpbnRlcnJ1cHRfaWQsICZvdXRsZXQpOwogCiAJaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25zdHJ1Y3RfaW9faXJxX291dGxldCBmYWlsZWQ6ICVzXG4iLAorCQlGQUlMKCIlczolZDogbHYxX2NvbnN0cnVjdF9pb19pcnFfb3V0bGV0IGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtNTEwLDcgKzUxMyw3IEBACiAJcmVzdWx0ID0gbHYxX2Rlc3RydWN0X2lvX2lycV9vdXRsZXQob3V0bGV0KTsKIAogCWlmIChyZXN1bHQpCi0JCXByX2RlYnVnKCIlczolZDogbHYxX2Rlc3RydWN0X2lvX2lycV9vdXRsZXQgZmFpbGVkOiAlc1xuIiwKKwkJRkFJTCgiJXM6JWQ6IGx2MV9kZXN0cnVjdF9pb19pcnFfb3V0bGV0IGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtNTQyLDcgKzU0NSw3IEBACiAJcmVzdWx0ID0gbHYxX2NvbmZpZ3VyZV92aXJ0dWFsX3VhcnRfaXJxKGxwYXJfYWRkciwgJm91dGxldCk7CiAKIAlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZDogbHYxX2NvbmZpZ3VyZV92aXJ0dWFsX3VhcnRfaXJxIGZhaWxlZDogJXNcbiIsCisJCUZBSUwoIiVzOiVkOiBsdjFfY29uZmlndXJlX3ZpcnR1YWxfdWFydF9pcnEgZmFpbGVkOiAlc1xuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC01NjIsNyArNTY1LDcgQEAKIAlyZXN1bHQgPSBsdjFfZGVjb25maWd1cmVfdmlydHVhbF91YXJ0X2lycSgpOwogCiAJaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IGx2MV9jb25maWd1cmVfdmlydHVhbF91YXJ0X2lycSBmYWlsZWQ6ICVzXG4iLAorCQlGQUlMKCIlczolZDogbHYxX2NvbmZpZ3VyZV92aXJ0dWFsX3VhcnRfaXJxIGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtNTk1LDcgKzU5OCw3IEBACiAJcmVzdWx0ID0gbHYxX2dldF9zcGVfaXJxX291dGxldChzcGVfaWQsIGNsYXNzLCAmb3V0bGV0KTsKIAogCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkOiBsdjFfZ2V0X3NwZV9pcnFfb3V0bGV0IGZhaWxlZDogJXNcbiIsCisJCUZBSUwoIiVzOiVkOiBsdjFfZ2V0X3NwZV9pcnFfb3V0bGV0IGZhaWxlZDogJXNcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHBzM19yZXN1bHQocmVzdWx0KSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtNjI2LDcgKzYyOSw3IEBACiBzdGF0aWMgdm9pZCBfZHVtcF82NF9ibXAoY29uc3QgY2hhciAqaGVhZGVyLCBjb25zdCB1NjQgKnAsIHVuc2lnbmVkIGNwdSwKIAljb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKLQlwcl9kZWJ1ZygiJXM6JWQ6ICVzICV1IHslMDRseF8lMDRseF8lMDRseF8lMDRseH1cbiIsCisJcHJfZGVidWcoIiVzOiVkOiAlcyAldSB7JTA0bGx4XyUwNGxseF8lMDRsbHhfJTA0bGx4fVxuIiwKIAkJZnVuYywgbGluZSwgaGVhZGVyLCBjcHUsCiAJCSpwID4+IDQ4LCAoKnAgPj4gMzIpICYgMHhmZmZmLCAoKnAgPj4gMTYpICYgMHhmZmZmLAogCQkqcCAmIDB4ZmZmZik7CkBAIC02MzUsNyArNjM4LDcgQEAKIHN0YXRpYyB2b2lkIF9fbWF5YmVfdW51c2VkIF9kdW1wXzI1Nl9ibXAoY29uc3QgY2hhciAqaGVhZGVyLAogCWNvbnN0IHU2NCAqcCwgdW5zaWduZWQgY3B1LCBjb25zdCBjaGFyKiBmdW5jLCBpbnQgbGluZSkKIHsKLQlwcl9kZWJ1ZygiJXM6JWQ6ICVzICV1IHslMDE2bHg6JTAxNmx4OiUwMTZseDolMDE2bHh9XG4iLAorCXByX2RlYnVnKCIlczolZDogJXMgJXUgeyUwMTZsbHg6JTAxNmxseDolMDE2bGx4OiUwMTZsbHh9XG4iLAogCQlmdW5jLCBsaW5lLCBoZWFkZXIsIGNwdSwgcFswXSwgcFsxXSwgcFsyXSwgcFszXSk7CiB9CiAKQEAgLTY0NCwxMCArNjQ3LDEwIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGQtPmJtcF9sb2NrLCBmbGFncyk7CiAJX2R1bXBfNjRfYm1wKCJzdGF0IiwgJnBkLT5ibXAuc3RhdHVzLCBwZC0+dGhyZWFkX2lkLCBmdW5jLCBsaW5lKTsKLQlfZHVtcF82NF9ibXAoIm1hc2siLCAmcGQtPmJtcC5tYXNrLCBwZC0+dGhyZWFkX2lkLCBmdW5jLCBsaW5lKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZC0+Ym1wLmxvY2ssIGZsYWdzKTsKKwlfZHVtcF82NF9ibXAoIm1hc2siLCAodTY0KikmcGQtPmJtcC5tYXNrLCBwZC0+dGhyZWFkX2lkLCBmdW5jLCBsaW5lKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZC0+Ym1wX2xvY2ssIGZsYWdzKTsKIH0KIAogI2RlZmluZSBkdW1wX21hc2soX3gpIF9kdW1wX21hc2soX3gsIF9fZnVuY19fLCBfX0xJTkVfXykKQEAgLTY1Niw5ICs2NTksOSBAQAogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7Ci0JX2R1bXBfNjRfYm1wKCJtYXNrIiwgJnBkLT5ibXAubWFzaywgcGQtPnRocmVhZF9pZCwgZnVuYywgbGluZSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGQtPmJtcC5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBkLT5ibXBfbG9jaywgZmxhZ3MpOworCV9kdW1wXzY0X2JtcCgibWFzayIsICh1NjQqKSZwZC0+Ym1wLm1hc2ssIHBkLT50aHJlYWRfaWQsIGZ1bmMsIGxpbmUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkLT5ibXBfbG9jaywgZmxhZ3MpOwogfQogI2Vsc2UKIHN0YXRpYyB2b2lkIGR1bXBfYm1wKHN0cnVjdCBwczNfcHJpdmF0ZSogcGQpIHt9OwpAQCAtNjY3LDcgKzY3MCw3IEBACiBzdGF0aWMgaW50IHBzM19ob3N0X21hcChzdHJ1Y3QgaXJxX2hvc3QgKmgsIHVuc2lnbmVkIGludCB2aXJxLAogCWlycV9od19udW1iZXJfdCBod2lycSkKIHsKLQlwcl9kZWJ1ZygiJXM6JWQ6IGh3aXJxICVsdSwgdmlycSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBod2lycSwKKwlEQkcoIiVzOiVkOiBod2lycSAlbHUsIHZpcnEgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgaHdpcnEsCiAJCXZpcnEpOwogCiAJaXJxX3NldF9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZwczNfaXJxX2NoaXAsIGhhbmRsZV9mYXN0ZW9pX2lycSk7CkBAIC02OTAsMTAgKzY5MywxMCBAQAogewogCXN0cnVjdCBwczNfcHJpdmF0ZSAqcGQgPSAmcGVyX2NwdShwczNfcHJpdmF0ZSwgY3B1KTsKIAotCXBkLT5ibXAuaXBpX2RlYnVnX2Jya19tYXNrID0gMHg4MDAwMDAwMDAwMDAwMDAwVUwgPj4gdmlycTsKKwlzZXRfYml0KDYzIC0gdmlycSwgJnBkLT5pcGlfZGVidWdfYnJrX21hc2spOwogCi0JcHJfZGVidWcoIiVzOiVkOiBjcHUgJXUsIHZpcnEgJXUsIG1hc2sgJWxseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKLQkJY3B1LCB2aXJxLCBwZC0+Ym1wLmlwaV9kZWJ1Z19icmtfbWFzayk7CisJREJHKCIlczolZDogY3B1ICV1LCB2aXJxICV1LCBtYXNrICVseGhcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJY3B1LCB2aXJxLCBwZC0+aXBpX2RlYnVnX2Jya19tYXNrKTsKIH0KIAogdm9pZCBfX2luaXQgcHMzX3JlZ2lzdGVyX2lwaV9pcnEodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IHZpcnEpCkBAIC03MTQsMTQgKzcxNywxNCBAQAogCiAJLyogY2hlY2sgZm9yIGlwaSBicmVhayBmaXJzdCB0byBzdG9wIHRoaXMgY3B1IEFTQVAgKi8KIAotCWlmICh4ICYgcGQtPmJtcC5pcGlfZGVidWdfYnJrX21hc2spCi0JCXggJj0gcGQtPmJtcC5pcGlfZGVidWdfYnJrX21hc2s7CisJaWYgKHggJiBwZC0+aXBpX2RlYnVnX2Jya19tYXNrKQorCQl4ICY9IHBkLT5pcGlfZGVidWdfYnJrX21hc2s7CiAKIAlhc20gdm9sYXRpbGUoImNudGx6ZCAlMCwlMSIgOiAiPXIiIChwbHVnKSA6ICJyIiAoeCkpOwogCXBsdWcgJj0gMHgzZjsKIAogCWlmICh1bmxpa2VseShwbHVnID09IE5PX0lSUSkpIHsKLQkJcHJfZGVidWcoIiVzOiVkOiBubyBwbHVnIGZvdW5kOiB0aHJlYWRfaWQgJWxsdVxuIiwgX19mdW5jX18sCisJCURCRygiJXM6JWQ6IG5vIHBsdWcgZm91bmQ6IHRocmVhZF9pZCAlbGx1XG4iLCBfX2Z1bmNfXywKIAkJCV9fTElORV9fLCBwZC0+dGhyZWFkX2lkKTsKIAkJZHVtcF9ibXAoJnBlcl9jcHUocHMzX3ByaXZhdGUsIDApKTsKIAkJZHVtcF9ibXAoJnBlcl9jcHUocHMzX3ByaXZhdGUsIDEpKTsKQEAgLTc2MCw5ICs3NjMsOSBAQAogCiAJCWx2MV9nZXRfbG9naWNhbF9wcGVfaWQoJnBkLT5wcGVfaWQpOwogCQlwZC0+dGhyZWFkX2lkID0gZ2V0X2hhcmRfc21wX3Byb2Nlc3Nvcl9pZChjcHUpOwotCQlzcGluX2xvY2tfaW5pdCgmcGQtPmJtcC5sb2NrKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnBkLT5ibXBfbG9jayk7CiAKLQkJcHJfZGVidWcoIiVzOiVkOiBwcGVfaWQgJWxsdSwgdGhyZWFkX2lkICVsbHUsIGJtcCAlbHhoXG4iLAorCQlEQkcoIiVzOiVkOiBwcGVfaWQgJWxsdSwgdGhyZWFkX2lkICVsbHUsIGJtcCAlbHhoXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBwZC0+cHBlX2lkLCBwZC0+dGhyZWFkX2lkLAogCQkJcHMzX21tX3BoeXNfdG9fbHBhcihfX3BhKCZwZC0+Ym1wKSkpOwogCkBAIC03NzAsNyArNzczLDcgQEAKIAkJCXBkLT50aHJlYWRfaWQsIHBzM19tbV9waHlzX3RvX2xwYXIoX19wYSgmcGQtPmJtcCkpKTsKIAogCQlpZiAocmVzdWx0KQotCQkJcHJfZGVidWcoIiVzOiVkOiBsdjFfY29uZmlndXJlX2lycV9zdGF0ZV9iaXRtYXAgZmFpbGVkOiIKKwkJCUZBSUwoIiVzOiVkOiBsdjFfY29uZmlndXJlX2lycV9zdGF0ZV9iaXRtYXAgZmFpbGVkOiIKIAkJCQkiICVzXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCQkJcHMzX3Jlc3VsdChyZXN1bHQpKTsKIAl9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvbW0uYwppbmRleCA3MjcxNGFkLi44YmQ2YmE1IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9tbS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL21tLmMKQEAgLTMxOSw3ICszMTksNiBAQAogCX0KIAogCW1lbWJsb2NrX2FkZChzdGFydF9hZGRyLCBtYXAucjEuc2l6ZSk7Ci0JbWVtYmxvY2tfYW5hbHl6ZSgpOwogCiAJcmVzdWx0ID0gb25saW5lX3BhZ2VzKHN0YXJ0X3BmbiwgbnJfcGFnZXMpOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9yZXBvc2l0b3J5LmMKaW5kZXggY2E0MGY2YS4uN2JkZmVhMyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvcmVwb3NpdG9yeS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3JlcG9zaXRvcnkuYwpAQCAtNDQsNyArNDQsNyBAQAogCQlzW2ldID0gKGluW2ldIDw9IDEyNiAmJiBpbltpXSA+PSAzMikgPyBpbltpXSA6ICcuJzsKIAlzW2ldID0gMDsKIAotCXByX2RlYnVnKCIlczolZDogJXMlMDE2bGx4IDogJXNcbiIsIGZ1bmMsIGxpbmUsIGhkciwgbiwgcyk7CisJcHJfZGV2ZWwoIiVzOiVkOiAlcyUwMTZsbHggOiAlc1xuIiwgZnVuYywgbGluZSwgaGRyLCBuLCBzKTsKICNlbmRpZgogfQogCkBAIC01Myw3ICs1Myw3IEBACiBzdGF0aWMgdm9pZCBfZHVtcF9ub2RlX25hbWUodW5zaWduZWQgaW50IGxwYXJfaWQsIHU2NCBuMSwgdTY0IG4yLCB1NjQgbjMsCiAJdTY0IG40LCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlwcl9kZWJ1ZygiJXM6JWQ6IGxwYXI6ICV1XG4iLCBmdW5jLCBsaW5lLCBscGFyX2lkKTsKKwlwcl9kZXZlbCgiJXM6JWQ6IGxwYXI6ICV1XG4iLCBmdW5jLCBsaW5lLCBscGFyX2lkKTsKIAlfZHVtcF9maWVsZCgibjE6ICIsIG4xLCBmdW5jLCBsaW5lKTsKIAlfZHVtcF9maWVsZCgibjI6ICIsIG4yLCBmdW5jLCBsaW5lKTsKIAlfZHVtcF9maWVsZCgibjM6ICIsIG4zLCBmdW5jLCBsaW5lKTsKQEAgLTY1LDEzICs2NSwxMyBAQAogc3RhdGljIHZvaWQgX2R1bXBfbm9kZSh1bnNpZ25lZCBpbnQgbHBhcl9pZCwgdTY0IG4xLCB1NjQgbjIsIHU2NCBuMywgdTY0IG40LAogCXU2NCB2MSwgdTY0IHYyLCBjb25zdCBjaGFyICpmdW5jLCBpbnQgbGluZSkKIHsKLQlwcl9kZWJ1ZygiJXM6JWQ6IGxwYXI6ICV1XG4iLCBmdW5jLCBsaW5lLCBscGFyX2lkKTsKKwlwcl9kZXZlbCgiJXM6JWQ6IGxwYXI6ICV1XG4iLCBmdW5jLCBsaW5lLCBscGFyX2lkKTsKIAlfZHVtcF9maWVsZCgibjE6ICIsIG4xLCBmdW5jLCBsaW5lKTsKIAlfZHVtcF9maWVsZCgibjI6ICIsIG4yLCBmdW5jLCBsaW5lKTsKIAlfZHVtcF9maWVsZCgibjM6ICIsIG4zLCBmdW5jLCBsaW5lKTsKIAlfZHVtcF9maWVsZCgibjQ6ICIsIG40LCBmdW5jLCBsaW5lKTsKLQlwcl9kZWJ1ZygiJXM6JWQ6IHYxOiAlMDE2bGx4XG4iLCBmdW5jLCBsaW5lLCB2MSk7Ci0JcHJfZGVidWcoIiVzOiVkOiB2MjogJTAxNmxseFxuIiwgZnVuYywgbGluZSwgdjIpOworCXByX2RldmVsKCIlczolZDogdjE6ICUwMTZsbHhcbiIsIGZ1bmMsIGxpbmUsIHYxKTsKKwlwcl9kZXZlbCgiJXM6JWQ6IHYyOiAlMDE2bGx4XG4iLCBmdW5jLCBsaW5lLCB2Mik7CiB9CiAKIC8qKgpAQCAtMTMxLDExICsxMzEsMTEgQEAKIAkJbHBhcl9pZCA9IGlkOwogCX0KIAotCXJlc3VsdCA9IGx2MV9nZXRfcmVwb3NpdG9yeV9ub2RlX3ZhbHVlKGxwYXJfaWQsIG4xLCBuMiwgbjMsIG40LCAmdjEsCisJcmVzdWx0ID0gbHYxX3JlYWRfcmVwb3NpdG9yeV9ub2RlKGxwYXJfaWQsIG4xLCBuMiwgbjMsIG40LCAmdjEsCiAJCSZ2Mik7CiAKIAlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZDogbHYxX2dldF9yZXBvc2l0b3J5X25vZGVfdmFsdWUgZmFpbGVkOiAlc1xuIiwKKwkJcHJfd2FybigiJXM6JWQ6IGx2MV9yZWFkX3JlcG9zaXRvcnlfbm9kZSBmYWlsZWQ6ICVzXG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCBwczNfcmVzdWx0KHJlc3VsdCkpOwogCQlkdW1wX25vZGVfbmFtZShscGFyX2lkLCBuMSwgbjIsIG4zLCBuNCk7CiAJCXJldHVybiAtRU5PRU5UOwpAQCAtMTQ5LDEwICsxNDksMTAgQEAKIAkJKl92MiA9IHYyOwogCiAJaWYgKHYxICYmICFfdjEpCi0JCXByX2RlYnVnKCIlczolZDogd2FybmluZzogZGlzY2FyZGluZyBub24temVybyB2MTogJTAxNmxseFxuIiwKKwkJcHJfZGV2ZWwoIiVzOiVkOiB3YXJuaW5nOiBkaXNjYXJkaW5nIG5vbi16ZXJvIHYxOiAlMDE2bGx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCB2MSk7CiAJaWYgKHYyICYmICFfdjIpCi0JCXByX2RlYnVnKCIlczolZDogd2FybmluZzogZGlzY2FyZGluZyBub24temVybyB2MjogJTAxNmxseFxuIiwKKwkJcHJfZGV2ZWwoIiVzOiVkOiB3YXJuaW5nOiBkaXNjYXJkaW5nIG5vbi16ZXJvIHYyOiAlMDE2bGx4XG4iLAogCQkJX19mdW5jX18sIF9fTElORV9fLCB2Mik7CiAKIAlyZXR1cm4gMDsKQEAgLTMyMywxNiArMzIzLDE2IEBACiAJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfbnVtX2Rldih0bXAuYnVzX2luZGV4LCAmbnVtX2Rldik7CiAKIAlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczolZCByZWFkX2J1c19udW1fZGV2IGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcHJfZGV2ZWwoIiVzOiVkIHJlYWRfYnVzX251bV9kZXYgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCQlyZXR1cm4gcmVzdWx0OwogCX0KIAotCXByX2RlYnVnKCIlczolZDogYnVzX3R5cGUgJXUsIGJ1c19pbmRleCAldSwgYnVzX2lkICVsbHUsIG51bV9kZXYgJXVcbiIsCisJcHJfZGV2ZWwoIiVzOiVkOiBidXNfdHlwZSAldSwgYnVzX2luZGV4ICV1LCBidXNfaWQgJWxsdSwgbnVtX2RldiAldVxuIiwKIAkJX19mdW5jX18sIF9fTElORV9fLCB0bXAuYnVzX3R5cGUsIHRtcC5idXNfaW5kZXgsIHRtcC5idXNfaWQsCiAJCW51bV9kZXYpOwogCiAJaWYgKHRtcC5kZXZfaW5kZXggPj0gbnVtX2RldikgewotCQlwcl9kZWJ1ZygiJXM6JWQ6IG5vIGRldmljZSBmb3VuZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwkJcHJfZGV2ZWwoIiVzOiVkOiBubyBkZXZpY2UgZm91bmRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIApAQCAtMzQwLDcgKzM0MCw3IEBACiAJCSZ0bXAuZGV2X3R5cGUpOwogCiAJaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9kZXZfdHlwZSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXByX2RldmVsKCIlczolZCByZWFkX2Rldl90eXBlIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CiAKQEAgLTM0OCwxMiArMzQ4LDEyIEBACiAJCSZ0bXAuZGV2X2lkKTsKIAogCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2lkIGZhaWxlZFxuIiwgX19mdW5jX18sCisJCXByX2RldmVsKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl9pZCBmYWlsZWRcbiIsIF9fZnVuY19fLAogCQlfX0xJTkVfXyk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JcHJfZGVidWcoIiVzOiVkOiBmb3VuZDogZGV2X3R5cGUgJXUsIGRldl9pbmRleCAldSwgZGV2X2lkICVsbHVcbiIsCisJcHJfZGV2ZWwoIiVzOiVkOiBmb3VuZDogZGV2X3R5cGUgJXUsIGRldl9pbmRleCAldSwgZGV2X2lkICVsbHVcbiIsCiAJCV9fZnVuY19fLCBfX0xJTkVfXywgdG1wLmRldl90eXBlLCB0bXAuZGV2X2luZGV4LCB0bXAuZGV2X2lkKTsKIAogCSpyZXBvID0gdG1wOwpAQCAtMzY3LDE0ICszNjcsMTQgQEAKIAlzdHJ1Y3QgcHMzX3JlcG9zaXRvcnlfZGV2aWNlIHRtcDsKIAl1bnNpZ25lZCBpbnQgbnVtX2RldjsKIAotCXByX2RlYnVnKCIgLT4gJXM6JXU6IGZpbmQgZGV2aWNlIGJ5IGlkICVsbHU6JWxsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCXByX2RldmVsKCIgLT4gJXM6JXU6IGZpbmQgZGV2aWNlIGJ5IGlkICVsbHU6JWxsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkgYnVzX2lkLCBkZXZfaWQpOwogCiAJZm9yICh0bXAuYnVzX2luZGV4ID0gMDsgdG1wLmJ1c19pbmRleCA8IDEwOyB0bXAuYnVzX2luZGV4KyspIHsKIAkJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfaWQodG1wLmJ1c19pbmRleCwKIAkJCQkJCSAgICAmdG1wLmJ1c19pZCk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczoldSByZWFkX2J1c19pZCgldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywKKwkJCXByX2RldmVsKCIlczoldSByZWFkX2J1c19pZCgldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywKIAkJCQkgX19MSU5FX18sIHRtcC5idXNfaW5kZXgpOwogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQpAQCAtMzgyLDIzICszODIsMjMgQEAKIAkJaWYgKHRtcC5idXNfaWQgPT0gYnVzX2lkKQogCQkJZ290byBmb3VuZF9idXM7CiAKLQkJcHJfZGVidWcoIiVzOiV1OiBza2lwLCBidXNfaWQgJWxsdVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlwcl9kZXZlbCgiJXM6JXU6IHNraXAsIGJ1c19pZCAlbGx1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCQkgdG1wLmJ1c19pZCk7CiAJfQotCXByX2RlYnVnKCIgPC0gJXM6JXU6IGJ1cyBub3QgZm91bmRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcHJfZGV2ZWwoIiA8LSAlczoldTogYnVzIG5vdCBmb3VuZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogCiBmb3VuZF9idXM6CiAJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfdHlwZSh0bXAuYnVzX2luZGV4LCAmdG1wLmJ1c190eXBlKTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIlczoldSByZWFkX2J1c190eXBlKCV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLAorCQlwcl9kZXZlbCgiJXM6JXUgcmVhZF9idXNfdHlwZSgldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywKIAkJCSBfX0xJTkVfXywgdG1wLmJ1c19pbmRleCk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfbnVtX2Rldih0bXAuYnVzX2luZGV4LCAmbnVtX2Rldik7CiAJaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JXUgcmVhZF9idXNfbnVtX2RldiBmYWlsZWRcbiIsIF9fZnVuY19fLAorCQlwcl9kZXZlbCgiJXM6JXUgcmVhZF9idXNfbnVtX2RldiBmYWlsZWRcbiIsIF9fZnVuY19fLAogCQkJIF9fTElORV9fKTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC00MDgsNyArNDA4LDcgQEAKIAkJCQkJCSAgICB0bXAuZGV2X2luZGV4LAogCQkJCQkJICAgICZ0bXAuZGV2X2lkKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJcHJfZGVidWcoIiVzOiV1IHJlYWRfZGV2X2lkKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLAorCQkJcHJfZGV2ZWwoIiVzOiV1IHJlYWRfZGV2X2lkKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLAogCQkJCSBfX0xJTkVfXywgdG1wLmJ1c19pbmRleCwgdG1wLmRldl9pbmRleCk7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9CkBAIC00MTYsMjEgKzQxNiwyMSBAQAogCQlpZiAodG1wLmRldl9pZCA9PSBkZXZfaWQpCiAJCQlnb3RvIGZvdW5kX2RldjsKIAotCQlwcl9kZWJ1ZygiJXM6JXU6IHNraXAsIGRldl9pZCAlbGx1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJCXByX2RldmVsKCIlczoldTogc2tpcCwgZGV2X2lkICVsbHVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJCSB0bXAuZGV2X2lkKTsKIAl9Ci0JcHJfZGVidWcoIiA8LSAlczoldTogZGV2IG5vdCBmb3VuZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlwcl9kZXZlbCgiIDwtICVzOiV1OiBkZXYgbm90IGZvdW5kXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiAKIGZvdW5kX2RldjoKIAlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlKHRtcC5idXNfaW5kZXgsIHRtcC5kZXZfaW5kZXgsCiAJCQkJCSAgICAgICZ0bXAuZGV2X3R5cGUpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiV1IHJlYWRfZGV2X3R5cGUgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOworCQlwcl9kZXZlbCgiJXM6JXUgcmVhZF9kZXZfdHlwZSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCi0JcHJfZGVidWcoIiA8LSAlczoldTogZm91bmQ6IHR5cGUgKCV1OiV1KSBpbmRleCAoJXU6JXUpIGlkICglbGx1OiVsbHUpXG4iLAorCXByX2RldmVsKCIgPC0gJXM6JXU6IGZvdW5kOiB0eXBlICgldToldSkgaW5kZXggKCV1OiV1KSBpZCAoJWxsdTolbGx1KVxuIiwKIAkJIF9fZnVuY19fLCBfX0xJTkVfXywgdG1wLmJ1c190eXBlLCB0bXAuZGV2X3R5cGUsIHRtcC5idXNfaW5kZXgsCiAJCSB0bXAuZGV2X2luZGV4LCB0bXAuYnVzX2lkLCB0bXAuZGV2X2lkKTsKIAkqcmVwbyA9IHRtcDsKQEAgLTQ0MywxOCArNDQzLDE4IEBACiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSByZXBvOwogCi0JcHJfZGVidWcoIiAtPiAlczolZDogZmluZCBidXNfdHlwZSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBidXNfdHlwZSk7CisJcHJfZGV2ZWwoIiAtPiAlczolZDogZmluZCBidXNfdHlwZSAldVxuIiwgX19mdW5jX18sIF9fTElORV9fLCBidXNfdHlwZSk7CiAKIAlyZXBvLmJ1c190eXBlID0gYnVzX3R5cGU7CiAJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfZmluZF9idXMocmVwby5idXNfdHlwZSwgMCwgJnJlcG8uYnVzX2luZGV4KTsKIAlpZiAocmVzdWx0KSB7Ci0JCXByX2RlYnVnKCIgPC0gJXM6JXU6IGJ1cyBub3QgZm91bmRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXByX2RldmVsKCIgPC0gJXM6JXU6IGJ1cyBub3QgZm91bmRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQogCiAJcmVzdWx0ID0gcHMzX3JlcG9zaXRvcnlfcmVhZF9idXNfaWQocmVwby5idXNfaW5kZXgsICZyZXBvLmJ1c19pZCk7CiAJaWYgKHJlc3VsdCkgewotCQlwcl9kZWJ1ZygiJXM6JWQgcmVhZF9idXNfaWQoJXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCQlwcl9kZXZlbCgiJXM6JWQgcmVhZF9idXNfaWQoJXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJIHJlcG8uYnVzX2luZGV4KTsKIAkJcmV0dXJuIHJlc3VsdDsKIAl9CkBAIC00NjksMTMgKzQ2OSwxMyBAQAogCiAJCXJlc3VsdCA9IGNhbGxiYWNrKCZyZXBvKTsKIAkJaWYgKHJlc3VsdCkgewotCQkJcHJfZGVidWcoIiVzOiVkOiBhYm9ydCBhdCBjYWxsYmFja1xuIiwgX19mdW5jX18sCisJCQlwcl9kZXZlbCgiJXM6JWQ6IGFib3J0IGF0IGNhbGxiYWNrXG4iLCBfX2Z1bmNfXywKIAkJCQlfX0xJTkVfXyk7CiAJCQlicmVhazsKIAkJfQogCX0KIAotCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcHJfZGV2ZWwoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC00ODksNyArNDg5LDcgQEAKIAlmb3IgKGkgPSBmcm9tOyBpIDwgMTA7IGkrKykgewogCQllcnJvciA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX3R5cGUoaSwgJnR5cGUpOwogCQlpZiAoZXJyb3IpIHsKLQkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlIGZhaWxlZFxuIiwKKwkJCXByX2RldmVsKCIlczolZCByZWFkX2J1c190eXBlIGZhaWxlZFxuIiwKIAkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJKmJ1c19pbmRleCA9IFVJTlRfTUFYOwogCQkJcmV0dXJuIGVycm9yOwpAQCAtNTA5LDcgKzUwOSw3IEBACiAJaW50IHJlc3VsdCA9IDA7CiAJdW5zaWduZWQgaW50IHJlc19pbmRleDsKIAotCXByX2RlYnVnKCIlczolZDogZmluZCBpbnRyX3R5cGUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgaW50cl90eXBlKTsKKwlwcl9kZXZlbCgiJXM6JWQ6IGZpbmQgaW50cl90eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGludHJfdHlwZSk7CiAKIAkqaW50ZXJydXB0X2lkID0gVUlOVF9NQVg7CiAKQEAgLTUyMSw3ICs1MjEsNyBAQAogCQkJcmVwby0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmaWQpOwogCiAJCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9pbnRyIGZhaWxlZFxuIiwKKwkJCXByX2RldmVsKCIlczolZCByZWFkX2Rldl9pbnRyIGZhaWxlZFxuIiwKIAkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwogCQkJcmV0dXJuIHJlc3VsdDsKIAkJfQpAQCAtNTM1LDcgKzUzNSw3IEBACiAJaWYgKHJlc19pbmRleCA9PSAxMCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwcl9kZWJ1ZygiJXM6JWQ6IGZvdW5kIGludHJfdHlwZSAldSBhdCByZXNfaW5kZXggJXVcbiIsCisJcHJfZGV2ZWwoIiVzOiVkOiBmb3VuZCBpbnRyX3R5cGUgJXUgYXQgcmVzX2luZGV4ICV1XG4iLAogCQlfX2Z1bmNfXywgX19MSU5FX18sIGludHJfdHlwZSwgcmVzX2luZGV4KTsKIAogCXJldHVybiByZXN1bHQ7CkBAIC01NDcsNyArNTQ3LDcgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAl1bnNpZ25lZCBpbnQgcmVzX2luZGV4OwogCi0JcHJfZGVidWcoIiVzOiVkOiBmaW5kIHJlZ190eXBlICV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlZ190eXBlKTsKKwlwcl9kZXZlbCgiJXM6JWQ6IGZpbmQgcmVnX3R5cGUgJXVcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywgcmVnX3R5cGUpOwogCiAJKmJ1c19hZGRyID0gKmxlbiA9IDA7CiAKQEAgLTU2MCw3ICs1NjAsNyBAQAogCQkJcmVwby0+ZGV2X2luZGV4LCByZXNfaW5kZXgsICZ0LCAmYSwgJmwpOwogCiAJCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCByZWFkX2Rldl9yZWcgZmFpbGVkXG4iLAorCQkJcHJfZGV2ZWwoIiVzOiVkIHJlYWRfZGV2X3JlZyBmYWlsZWRcbiIsCiAJCQkJX19mdW5jX18sIF9fTElORV9fKTsKIAkJCXJldHVybiByZXN1bHQ7CiAJCX0KQEAgLTU3NSw3ICs1NzUsNyBAQAogCWlmIChyZXNfaW5kZXggPT0gMTApCiAJCXJldHVybiAtRU5PREVWOwogCi0JcHJfZGVidWcoIiVzOiVkOiBmb3VuZCByZWdfdHlwZSAldSBhdCByZXNfaW5kZXggJXVcbiIsCisJcHJfZGV2ZWwoIiVzOiVkOiBmb3VuZCByZWdfdHlwZSAldSBhdCByZXNfaW5kZXggJXVcbiIsCiAJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVnX3R5cGUsIHJlc19pbmRleCk7CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTAwOSw3ICsxMDA5LDcgQEAKIAlpbnQgcmVzdWx0ID0gMDsKIAl1bnNpZ25lZCBpbnQgcmVzX2luZGV4OwogCi0JcHJfZGVidWcoIiAtPiAlczolZDogKCV1OiV1KVxuIiwgX19mdW5jX18sIF9fTElORV9fLAorCXByX2RldmVsKCIgLT4gJXM6JWQ6ICgldToldSlcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOwogCiAJZm9yIChyZXNfaW5kZXggPSAwOyByZXNfaW5kZXggPCAxMDsgcmVzX2luZGV4KyspIHsKQEAgLTEwMjEsMTMgKzEwMjEsMTMgQEAKIAogCQlpZiAocmVzdWx0KSB7CiAJCQlpZiAocmVzdWx0ICE9ICBMVjFfTk9fRU5UUlkpCi0JCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIiCisJCQkJcHJfZGV2ZWwoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X2ludHIiCiAJCQkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJCQkJcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSBpbnRyX3R5cGUgJXUsIGludGVycnVwdF9pZCAldVxuIiwKKwkJcHJfZGV2ZWwoIiVzOiVkICgldToldSkgaW50cl90eXBlICV1LCBpbnRlcnJ1cHRfaWQgJXVcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAogCQkJaW50cl90eXBlLCBpbnRlcnJ1cHRfaWQpOwogCX0KQEAgLTEwNDIsMTggKzEwNDIsMTggQEAKIAogCQlpZiAocmVzdWx0KSB7CiAJCQlpZiAocmVzdWx0ICE9ICBMVjFfTk9fRU5UUlkpCi0JCQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3JlZyIKKwkJCQlwcl9kZXZlbCgiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfcmVnIgogCQkJCQkiICgldToldSkgZmFpbGVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCiAJCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJcHJfZGVidWcoIiVzOiVkICgldToldSkgcmVnX3R5cGUgJXUsIGJ1c19hZGRyICVseGgsIGxlbiAlbHhoXG4iLAorCQlwcl9kZXZlbCgiJXM6JWQgKCV1OiV1KSByZWdfdHlwZSAldSwgYnVzX2FkZHIgJWxseGgsIGxlbiAlbGx4aFxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgsCiAJCQlyZWdfdHlwZSwgYnVzX2FkZHIsIGxlbik7CiAJfQogCi0JcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlwcl9kZXZlbCgiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTEwNjMsMjIgKzEwNjMsMjIgQEAKIAl1bnNpZ25lZCBpbnQgbnVtX3JlZ2lvbnMsIHJlZ2lvbl9pbmRleDsKIAl1NjQgcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3M7CiAKLQlwcl9kZWJ1ZygiIC0+ICVzOiVkOiAoJXU6JXUpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sCisJcHJfZGV2ZWwoIiAtPiAlczolZDogKCV1OiV1KVxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQlyZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCk7CiAKIAlyZXN1bHQgPSBwczNfcmVwb3NpdG9yeV9yZWFkX3N0b3JfZGV2X2luZm8ocmVwby0+YnVzX2luZGV4LAogCQlyZXBvLT5kZXZfaW5kZXgsICZwb3J0LCAmYmxrX3NpemUsICZudW1fYmxvY2tzLCAmbnVtX3JlZ2lvbnMpOwogCWlmIChyZXN1bHQpIHsKLQkJcHJfZGVidWcoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyIKKwkJcHJfZGV2ZWwoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfaW5mbyIKIAkJCSIgKCV1OiV1KSBmYWlsZWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXywKIAkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKIAkJZ290byBvdXQ7CiAJfQogCi0JcHJfZGVidWcoIiVzOiVkICAoJXU6JXUpOiBwb3J0ICVsdSwgYmxrX3NpemUgJWx1LCBudW1fYmxvY2tzICIKLQkJICIlbHUsIG51bV9yZWdpb25zICV1XG4iLAotCQkgX19mdW5jX18sIF9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCwgcG9ydCwKLQkJIGJsa19zaXplLCBudW1fYmxvY2tzLCBudW1fcmVnaW9ucyk7CisJcHJfZGV2ZWwoIiVzOiVkICAoJXU6JXUpOiBwb3J0ICVsbHUsIGJsa19zaXplICVsbHUsIG51bV9ibG9ja3MgIgorCQkgIiVsbHUsIG51bV9yZWdpb25zICV1XG4iLAorCQkgX19mdW5jX18sIF9fTElORV9fLCByZXBvLT5idXNfaW5kZXgsIHJlcG8tPmRldl9pbmRleCwKKwkJcG9ydCwgYmxrX3NpemUsIG51bV9ibG9ja3MsIG51bV9yZWdpb25zKTsKIAogCWZvciAocmVnaW9uX2luZGV4ID0gMDsgcmVnaW9uX2luZGV4IDwgbnVtX3JlZ2lvbnM7IHJlZ2lvbl9pbmRleCsrKSB7CiAJCXVuc2lnbmVkIGludCByZWdpb25faWQ7CkBAIC0xMDg4LDE5ICsxMDg4LDIwIEBACiAJCQlyZXBvLT5kZXZfaW5kZXgsIHJlZ2lvbl9pbmRleCwgJnJlZ2lvbl9pZCwKIAkJCSZyZWdpb25fc3RhcnQsICZyZWdpb25fc2l6ZSk7CiAJCWlmIChyZXN1bHQpIHsKLQkJCSBwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9zdG9yX2Rldl9yZWdpb24iCisJCQkgcHJfZGV2ZWwoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfc3Rvcl9kZXZfcmVnaW9uIgogCQkJCSAgIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJCSAgcmVwby0+YnVzX2luZGV4LCByZXBvLT5kZXZfaW5kZXgpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlwcl9kZWJ1ZygiJXM6JWQgKCV1OiV1KSByZWdpb25faWQgJXUsIHN0YXJ0ICVseGgsIHNpemUgJWx4aFxuIiwKKwkJcHJfZGV2ZWwoIiVzOiVkICgldToldSkgcmVnaW9uX2lkICV1LCBzdGFydCAlbHhoLCBzaXplICVseGhcbiIsCiAJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAotCQkJcmVnaW9uX2lkLCByZWdpb25fc3RhcnQsIHJlZ2lvbl9zaXplKTsKKwkJCXJlZ2lvbl9pZCwgKHVuc2lnbmVkIGxvbmcpcmVnaW9uX3N0YXJ0LAorCQkJKHVuc2lnbmVkIGxvbmcpcmVnaW9uX3NpemUpOwogCX0KIAogb3V0OgotCXByX2RlYnVnKCIgPC0gJXM6JWRcbiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CisJcHJfZGV2ZWwoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0xMTA5LDcgKzExMTAsNyBAQAogewogCWludCByZXN1bHQgPSAwOwogCi0JcHJfZGVidWcoIiAtPiAlczolZDogYnVzXyV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCk7CisJcHJfZGV2ZWwoIiAtPiAlczolZDogYnVzXyV1XG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCk7CiAKIAlmb3IgKHJlcG8tPmRldl9pbmRleCA9IDA7IHJlcG8tPmRldl9pbmRleCA8IG51bV9kZXY7CiAJCXJlcG8tPmRldl9pbmRleCsrKSB7CkBAIC0xMTE4LDcgKzExMTksNyBAQAogCQkJcmVwby0+ZGV2X2luZGV4LCAmcmVwby0+ZGV2X3R5cGUpOwogCiAJCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCBwczNfcmVwb3NpdG9yeV9yZWFkX2Rldl90eXBlIgorCQkJcHJfZGV2ZWwoIiVzOiVkIHBzM19yZXBvc2l0b3J5X3JlYWRfZGV2X3R5cGUiCiAJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKIAkJCWJyZWFrOwpAQCAtMTEyOCwxNSArMTEyOSwxNSBAQAogCQkJcmVwby0+ZGV2X2luZGV4LCAmcmVwby0+ZGV2X2lkKTsKIAogCQlpZiAocmVzdWx0KSB7Ci0JCQlwcl9kZWJ1ZygiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQiCisJCQlwcl9kZXZlbCgiJXM6JWQgcHMzX3JlcG9zaXRvcnlfcmVhZF9kZXZfaWQiCiAJCQkJIiAoJXU6JXUpIGZhaWxlZFxuIiwgX19mdW5jX18sIF9fTElORV9fLAogCQkJCXJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJcHJfZGVidWcoIiVzOiVkICAoJXU6JXUpOiBkZXZfdHlwZSAldSwgZGV2X2lkICVsdVxuIiwgX19mdW5jX18sCisJCXByX2RldmVsKCIlczolZCAgKCV1OiV1KTogZGV2X3R5cGUgJXUsIGRldl9pZCAlbHVcbiIsIF9fZnVuY19fLAogCQkJX19MSU5FX18sIHJlcG8tPmJ1c19pbmRleCwgcmVwby0+ZGV2X2luZGV4LAotCQkJcmVwby0+ZGV2X3R5cGUsIHJlcG8tPmRldl9pZCk7CisJCQlyZXBvLT5kZXZfdHlwZSwgKHVuc2lnbmVkIGxvbmcpcmVwby0+ZGV2X2lkKTsKIAogCQlwczNfcmVwb3NpdG9yeV9kdW1wX3Jlc291cmNlX2luZm8ocmVwbyk7CiAKQEAgLTExNDQsNyArMTE0NSw3IEBACiAJCQlkdW1wX3N0b3JfZGV2X2luZm8ocmVwbyk7CiAJfQogCi0JcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlwcl9kZXZlbCgiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTExNTMsNyArMTE1NCw3IEBACiAJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IHBzM19yZXBvc2l0b3J5X2RldmljZSByZXBvOwogCi0JcHJfZGVidWcoIiAtPiAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlwcl9kZXZlbCgiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCiAJbWVtc2V0KCZyZXBvLCAwLCBzaXplb2YocmVwbykpOwogCkBAIC0xMTY0LDcgKzExNjUsNyBAQAogCQkJJnJlcG8uYnVzX3R5cGUpOwogCiAJCWlmIChyZXN1bHQpIHsKLQkJCXByX2RlYnVnKCIlczolZCByZWFkX2J1c190eXBlKCV1KSBmYWlsZWRcbiIsCisJCQlwcl9kZXZlbCgiJXM6JWQgcmVhZF9idXNfdHlwZSgldSkgZmFpbGVkXG4iLAogCQkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgpOwogCQkJYnJlYWs7CiAJCX0KQEAgLTExNzMsMzIgKzExNzQsMzIgQEAKIAkJCSZyZXBvLmJ1c19pZCk7CiAKIAkJaWYgKHJlc3VsdCkgewotCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX2lkKCV1KSBmYWlsZWRcbiIsCisJCQlwcl9kZXZlbCgiJXM6JWQgcmVhZF9idXNfaWQoJXUpIGZhaWxlZFxuIiwKIAkJCQlfX2Z1bmNfXywgX19MSU5FX18sIHJlcG8uYnVzX2luZGV4KTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKIAkJaWYgKHJlcG8uYnVzX2luZGV4ICE9IHJlcG8uYnVzX2lkKQotCQkJcHJfZGVidWcoIiVzOiVkIGJ1c19pbmRleCAhPSBidXNfaWRcbiIsCisJCQlwcl9kZXZlbCgiJXM6JWQgYnVzX2luZGV4ICE9IGJ1c19pZFxuIiwKIAkJCQlfX2Z1bmNfXywgX19MSU5FX18pOwogCiAJCXJlc3VsdCA9IHBzM19yZXBvc2l0b3J5X3JlYWRfYnVzX251bV9kZXYocmVwby5idXNfaW5kZXgsCiAJCQkmbnVtX2Rldik7CiAKIAkJaWYgKHJlc3VsdCkgewotCQkJcHJfZGVidWcoIiVzOiVkIHJlYWRfYnVzX251bV9kZXYoJXUpIGZhaWxlZFxuIiwKKwkJCXByX2RldmVsKCIlczolZCByZWFkX2J1c19udW1fZGV2KCV1KSBmYWlsZWRcbiIsCiAJCQkJX19mdW5jX18sIF9fTElORV9fLCByZXBvLmJ1c19pbmRleCk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXByX2RlYnVnKCIlczolZCBidXNfJXU6IGJ1c190eXBlICV1LCBidXNfaWQgJWx1LCBudW1fZGV2ICV1XG4iLAorCQlwcl9kZXZlbCgiJXM6JWQgYnVzXyV1OiBidXNfdHlwZSAldSwgYnVzX2lkICVsdSwgbnVtX2RldiAldVxuIiwKIAkJCV9fZnVuY19fLCBfX0xJTkVfXywgcmVwby5idXNfaW5kZXgsIHJlcG8uYnVzX3R5cGUsCi0JCQlyZXBvLmJ1c19pZCwgbnVtX2Rldik7CisJCQkodW5zaWduZWQgbG9uZylyZXBvLmJ1c19pZCwgbnVtX2Rldik7CiAKIAkJZHVtcF9kZXZpY2VfaW5mbygmcmVwbywgbnVtX2Rldik7CiAJfQogCi0JcHJfZGVidWcoIiA8LSAlczolZFxuIiwgX19mdW5jX18sIF9fTElORV9fKTsKKwlwcl9kZXZlbCgiIDwtICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCXJldHVybiByZXN1bHQ7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zZXR1cC5jCmluZGV4IGU4ZWMxYjIuLjJkNjY0YzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc2V0dXAuYwpAQCAtMTkzLDEwICsxOTMsMTIgQEAKIAogc3RhdGljIHZvaWQgX19pbml0IHBzM19zZXR1cF9hcmNoKHZvaWQpCiB7CisJdTY0IHRtcDsKIAogCURCRygiIC0+ICVzOiVkXG4iLCBfX2Z1bmNfXywgX19MSU5FX18pOwogCi0JbHYxX2dldF92ZXJzaW9uX2luZm8oJnBzM19maXJtd2FyZV92ZXJzaW9uLnJhdyk7CisJbHYxX2dldF92ZXJzaW9uX2luZm8oJnBzM19maXJtd2FyZV92ZXJzaW9uLnJhdywgJnRtcCk7CisKIAlwcmludGsoS0VSTl9JTkZPICJQUzMgZmlybXdhcmUgdmVyc2lvbiAldS4ldS4ldVxuIiwKIAkgICAgICAgcHMzX2Zpcm13YXJlX3ZlcnNpb24ubWFqb3IsIHBzM19maXJtd2FyZV92ZXJzaW9uLm1pbm9yLAogCSAgICAgICBwczNfZmlybXdhcmVfdmVyc2lvbi5yZXYpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wczMvc21wLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYwppbmRleCBlZmMxY2Q4Li40YjM1MTY2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zbXAuYwpAQCAtNTcsNyArNTcsNyBAQAogCQkJIiAoJWQpXG4iLCBfX2Z1bmNfXywgX19MSU5FX18sIGNwdSwgbXNnLCByZXN1bHQpOwogfQogCi1zdGF0aWMgaW50IHBzM19zbXBfcHJvYmUodm9pZCkKK3N0YXRpYyBpbnQgX19pbml0IHBzM19zbXBfcHJvYmUodm9pZCkKIHsKIAlpbnQgY3B1OwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzMy9zcHUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCmluZGV4IDQ1MWZhZDEuLmUxN2ZhMTQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHMzL3NwdS5jCkBAIC0xNTQsNyArMTU0LDcgQEAKIAl1NjQgaWQ7CiAKIAlsdjFfZ2V0X2xvZ2ljYWxfcHBlX2lkKCZpZCk7Ci0JbHYxX2dldF92aXJ0dWFsX2FkZHJlc3Nfc3BhY2VfaWRfb2ZfcHBlKGlkLCAmaWQpOworCWx2MV9nZXRfdmlydHVhbF9hZGRyZXNzX3NwYWNlX2lkX29mX3BwZSgmaWQpOwogCiAJcmV0dXJuIGlkOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL0tjb25maWcgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwppbmRleCBjODFmNmJiLi5hZTdiNmQ0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvS2NvbmZpZwpAQCAtMTIwLDMgKzEyMCwxMiBAQAogCSAgd2hpY2ggYXJlIGFjY2Vzc2libGUgdGhyb3VnaCBhIGRlYnVnZnMgZmlsZS4KIAogCSAgU2F5IE4gaWYgeW91IGFyZSB1bnN1cmUuCisKK2NvbmZpZyBQU0VSSUVTX0lETEUKKwl0cmlzdGF0ZSAiQ3B1aWRsZSBkcml2ZXIgZm9yIHBTZXJpZXMgcGxhdGZvcm1zIgorCWRlcGVuZHMgb24gQ1BVX0lETEUKKwlkZXBlbmRzIG9uIFBQQ19QU0VSSUVTCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2VsZWN0IHRoaXMgb3B0aW9uIHRvIGVuYWJsZSBwcm9jZXNzb3IgaWRsZSBzdGF0ZSBtYW5hZ2VtZW50CisJICB0aHJvdWdoIGNwdWlkbGUgc3Vic3lzdGVtLgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL01ha2VmaWxlCmluZGV4IDM1NTZlNDAuLjIzNmRiNDYgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9NYWtlZmlsZQorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvTWFrZWZpbGUKQEAgLTIyLDYgKzIyLDcgQEAKIG9iai0kKENPTkZJR19DTU0pCQkrPSBjbW0ubwogb2JqLSQoQ09ORklHX0RUTCkJCSs9IGR0bC5vCiBvYmotJChDT05GSUdfSU9fRVZFTlRfSVJRKQkrPSBpb19ldmVudF9pcnEubworb2JqLSQoQ09ORklHX1BTRVJJRVNfSURMRSkJKz0gcHJvY2Vzc29yX2lkbGUubwogCiBpZmVxICgkKENPTkZJR19QUENfUFNFUklFUykseSkKIG9iai0kKENPTkZJR19TVVNQRU5EKQkJKz0gc3VzcGVuZC5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaHZDYWxsX2luc3QuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGxfaW5zdC5jCmluZGV4IGYxMDY2NjIuLmM5MzExY2YgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGxfaW5zdC5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9odkNhbGxfaW5zdC5jCkBAIC0xMDksNyArMTA5LDcgQEAKIAlpZiAob3Bjb2RlID4gTUFYX0hDQUxMX09QQ09ERSkKIAkJcmV0dXJuOwogCi0JaCA9ICZnZXRfY3B1X3ZhcihoY2FsbF9zdGF0cylbb3Bjb2RlIC8gNF07CisJaCA9ICZfX2dldF9jcHVfdmFyKGhjYWxsX3N0YXRzKVtvcGNvZGUgLyA0XTsKIAloLT50Yl9zdGFydCA9IG1mdGIoKTsKIAloLT5wdXJyX3N0YXJ0ID0gbWZzcHIoU1BSTl9QVVJSKTsKIH0KQEAgLTEyNiw4ICsxMjYsNiBAQAogCWgtPm51bV9jYWxscysrOwogCWgtPnRiX3RvdGFsICs9IG1mdGIoKSAtIGgtPnRiX3N0YXJ0OwogCWgtPnB1cnJfdG90YWwgKz0gbWZzcHIoU1BSTl9QVVJSKSAtIGgtPnB1cnJfc3RhcnQ7Ci0KLQlwdXRfY3B1X3ZhcihoY2FsbF9zdGF0cyk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGhjYWxsX2luc3RfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2lvbW11LmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwppbmRleCBiNzE5ZDk3Li5jNDQyZjJiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvaW9tbXUuYwpAQCAtNTIsMTMgKzUyLDQyIEBACiAjaW5jbHVkZSAicGxwYXJfd3JhcHBlcnMuaCIKIAogCitzdGF0aWMgdm9pZCB0Y2VfaW52YWxpZGF0ZV9wU2VyaWVzX3N3KHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLAorCQkJCSAgICAgIHU2NCAqc3RhcnRwLCB1NjQgKmVuZHApCit7CisJdTY0IF9faW9tZW0gKmludmFsaWRhdGUgPSAodTY0IF9faW9tZW0gKil0YmwtPml0X2luZGV4OworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZCwgaW5jOworCisJc3RhcnQgPSBfX3BhKHN0YXJ0cCk7CisJZW5kID0gX19wYShlbmRwKTsKKwlpbmMgPSBMMV9DQUNIRV9CWVRFUzsgLyogaW52YWxpZGF0ZSBhIGNhY2hlbGluZSBvZiBUQ0VzIGF0IGEgdGltZSAqLworCisJLyogSWYgdGhpcyBpcyBub24temVybywgY2hhbmdlIHRoZSBmb3JtYXQuICBXZSBzaGlmdCB0aGUKKwkgKiBhZGRyZXNzIGFuZCBvciBpbiB0aGUgbWFnaWMgZnJvbSB0aGUgZGV2aWNlIHRyZWUuICovCisJaWYgKHRibC0+aXRfYnVzbm8pIHsKKwkJc3RhcnQgPDw9IDEyOworCQllbmQgPDw9IDEyOworCQlpbmMgPDw9IDEyOworCQlzdGFydCB8PSB0YmwtPml0X2J1c25vOworCQllbmQgfD0gdGJsLT5pdF9idXNubzsKKwl9CisKKwllbmQgfD0gaW5jIC0gMTsgLyogcm91bmQgdXAgZW5kIHRvIGJlIGRpZmZlcmVudCB0aGFuIHN0YXJ0ICovCisKKwltYigpOyAvKiBNYWtlIHN1cmUgVENFcyBpbiBtZW1vcnkgYXJlIHdyaXR0ZW4gKi8KKwl3aGlsZSAoc3RhcnQgPD0gZW5kKSB7CisJCW91dF9iZTY0KGludmFsaWRhdGUsIHN0YXJ0KTsKKwkJc3RhcnQgKz0gaW5jOworCX0KK30KKwogc3RhdGljIGludCB0Y2VfYnVpbGRfcFNlcmllcyhzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCwKIAkJCSAgICAgIGxvbmcgbnBhZ2VzLCB1bnNpZ25lZCBsb25nIHVhZGRyLAogCQkJICAgICAgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZGlyZWN0aW9uLAogCQkJICAgICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7CiAJdTY0IHByb3RvX3RjZTsKLQl1NjQgKnRjZXA7CisJdTY0ICp0Y2VwLCAqdGNlczsKIAl1NjQgcnBuOwogCiAJcHJvdG9fdGNlID0gVENFX1BDSV9SRUFEOyAvLyBSZWFkIGFsbG93ZWQKQEAgLTY2LDcgKzk1LDcgQEAKIAlpZiAoZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpCiAJCXByb3RvX3RjZSB8PSBUQ0VfUENJX1dSSVRFOwogCi0JdGNlcCA9ICgodTY0ICopdGJsLT5pdF9iYXNlKSArIGluZGV4OworCXRjZXMgPSB0Y2VwID0gKCh1NjQgKil0YmwtPml0X2Jhc2UpICsgaW5kZXg7CiAKIAl3aGlsZSAobnBhZ2VzLS0pIHsKIAkJLyogY2FuJ3QgbW92ZSB0aGlzIG91dCBzaW5jZSB3ZSBtaWdodCBjcm9zcyBNRU1CTE9DSyBib3VuZGFyeSAqLwpAQCAtNzYsMTggKzEwNSwyNCBAQAogCQl1YWRkciArPSBUQ0VfUEFHRV9TSVpFOwogCQl0Y2VwKys7CiAJfQorCisJaWYgKHRibC0+aXRfdHlwZSA9PSBUQ0VfUENJX1NXSU5WX0NSRUFURSkKKwkJdGNlX2ludmFsaWRhdGVfcFNlcmllc19zdyh0YmwsIHRjZXMsIHRjZXAgLSAxKTsKIAlyZXR1cm4gMDsKIH0KIAogCiBzdGF0aWMgdm9pZCB0Y2VfZnJlZV9wU2VyaWVzKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsLCBsb25nIGluZGV4LCBsb25nIG5wYWdlcykKIHsKLQl1NjQgKnRjZXA7CisJdTY0ICp0Y2VwLCAqdGNlczsKIAotCXRjZXAgPSAoKHU2NCAqKXRibC0+aXRfYmFzZSkgKyBpbmRleDsKKwl0Y2VzID0gdGNlcCA9ICgodTY0ICopdGJsLT5pdF9iYXNlKSArIGluZGV4OwogCiAJd2hpbGUgKG5wYWdlcy0tKQogCQkqKHRjZXArKykgPSAwOworCisJaWYgKHRibC0+aXRfdHlwZSA9PSBUQ0VfUENJX1NXSU5WX0ZSRUUpCisJCXRjZV9pbnZhbGlkYXRlX3BTZXJpZXNfc3codGJsLCB0Y2VzLCB0Y2VwIC0gMSk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHRjZV9nZXRfcHNlcmllcyhzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCwgbG9uZyBpbmRleCkKQEAgLTQyNSw3ICs0NjAsNyBAQAogCQkJCSBzdHJ1Y3QgaW9tbXVfdGFibGUgKnRibCkKIHsKIAlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGU7Ci0JY29uc3QgdW5zaWduZWQgbG9uZyAqYmFzZXA7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqYmFzZXAsICpzd19pbnZhbDsKIAljb25zdCB1MzIgKnNpemVwOwogCiAJbm9kZSA9IHBoYi0+ZG47CkBAIC00NjIsNiArNDk3LDIyIEBACiAJdGJsLT5pdF9pbmRleCA9IDA7CiAJdGJsLT5pdF9ibG9ja3NpemUgPSAxNjsKIAl0YmwtPml0X3R5cGUgPSBUQ0VfUENJOworCisJc3dfaW52YWwgPSBvZl9nZXRfcHJvcGVydHkobm9kZSwgImxpbnV4LHRjZS1zdy1pbnZhbGlkYXRlLWluZm8iLCBOVUxMKTsKKwlpZiAoc3dfaW52YWwpIHsKKwkJLyoKKwkJICogVGhpcyBwcm9wZXJ0eSBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBob3cgdG8KKwkJICogaW52YWxpZGF0ZSB0aGUgVENFIGVudHJ5LiAgVGhlIGZpcnN0IHByb3BlcnR5IGlzCisJCSAqIHRoZSBiYXNlIE1NSU8gYWRkcmVzcyB1c2VkIHRvIGludmFsaWRhdGUgZW50cmllcy4KKwkJICogVGhlIHNlY29uZCBwcm9wZXJ0eSB0ZWxscyB1cyB0aGUgZm9ybWF0IG9mIHRoZSBUQ0UKKwkJICogaW52YWxpZGF0ZSAod2hldGhlciBpdCBuZWVkcyB0byBiZSBzaGlmdGVkKSBhbmQKKwkJICogc29tZSBtYWdpYyByb3V0aW5nIGluZm8gdG8gYWRkIHRvIG91ciBpbnZhbGlkYXRlCisJCSAqIGNvbW1hbmQuCisJCSAqLworCQl0YmwtPml0X2luZGV4ID0gKHVuc2lnbmVkIGxvbmcpIGlvcmVtYXAoc3dfaW52YWxbMF0sIDgpOworCQl0YmwtPml0X2J1c25vID0gc3dfaW52YWxbMV07IC8qIG92ZXJsb2FkIHRoaXMgd2l0aCBtYWdpYyAqLworCQl0YmwtPml0X3R5cGUgPSBUQ0VfUENJX1NXSU5WX0NSRUFURSB8IFRDRV9QQ0lfU1dJTlZfRlJFRTsKKwl9CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL2xwYXIuYwppbmRleCAyN2E0OTUwLi45NDhlMGUzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbHBhci5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9scGFyLmMKQEAgLTU1NCw3ICs1NTQsMTAgQEAKIAkJZ290byBvdXQ7CiAKIAkoKmRlcHRoKSsrOworCXByZWVtcHRfZGlzYWJsZSgpOwogCXRyYWNlX2hjYWxsX2VudHJ5KG9wY29kZSwgYXJncyk7CisJaWYgKG9wY29kZSA9PSBIX0NFREUpCisJCXJjdV9pZGxlX2VudGVyKCk7CiAJKCpkZXB0aCktLTsKIAogb3V0OgpAQCAtNTc1LDcgKzU3OCwxMCBAQAogCQlnb3RvIG91dDsKIAogCSgqZGVwdGgpKys7CisJaWYgKG9wY29kZSA9PSBIX0NFREUpCisJCXJjdV9pZGxlX2V4aXQoKTsKIAl0cmFjZV9oY2FsbF9leGl0KG9wY29kZSwgcmV0dmFsLCByZXRidWYpOworCXByZWVtcHRfZW5hYmxlKCk7CiAJKCpkZXB0aCktLTsKIAogb3V0OgpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL252cmFtLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbnZyYW0uYwppbmRleCBhNzZiMjI4Li4zMzBhNTdiIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbnZyYW0uYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvbnZyYW0uYwpAQCAtNjI1LDYgKzYyNSw4IEBACiB7CiAJc3RhdGljIHVuc2lnbmVkIGludCBvb3BzX2NvdW50ID0gMDsKIAlzdGF0aWMgYm9vbCBwYW5pY2tpbmcgPSBmYWxzZTsKKwlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc2l6ZV90IHRleHRfbGVuOwogCXVuc2lnbmVkIGludCBlcnJfdHlwZSA9IEVSUl9UWVBFX0tFUk5FTF9QQU5JQ19HWjsKIAlpbnQgcmMgPSAtMTsKQEAgLTY1NSw2ICs2NTcsOSBAQAogCWlmIChjbG9iYmVyaW5nX3VucmVhZF9ydGFzX2V2ZW50KCkpCiAJCXJldHVybjsKIAorCWlmICghc3Bpbl90cnlsb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKSkKKwkJcmV0dXJuOworCiAJaWYgKGJpZ19vb3BzX2J1ZikgewogCQl0ZXh0X2xlbiA9IGNhcHR1cmVfbGFzdF9tc2dzKG9sZF9tc2dzLCBvbGRfbGVuLAogCQkJbmV3X21zZ3MsIG5ld19sZW4sIGJpZ19vb3BzX2J1ZiwgYmlnX29vcHNfYnVmX3N6KTsKQEAgLTY3MCw0ICs2NzUsNiBAQAogCiAJKHZvaWQpIG52cmFtX3dyaXRlX29zX3BhcnRpdGlvbigmb29wc19sb2dfcGFydGl0aW9uLCBvb3BzX2J1ZiwKIAkJKGludCkgKHNpemVvZigqb29wc19sZW4pICsgKm9vcHNfbGVuKSwgZXJyX3R5cGUsICsrb29wc19jb3VudCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHJvY2Vzc29yX2lkbGUuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wcm9jZXNzb3JfaWRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NWZkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHJvY2Vzc29yX2lkbGUuYwpAQCAtMCwwICsxLDMyOSBAQAorLyoKKyAqICBwcm9jZXNzb3JfaWRsZSAtIGlkbGUgc3RhdGUgY3B1aWRsZSBkcml2ZXIuCisgKiAgQWRhcHRlZCBmcm9tIGRyaXZlcnMvaWRsZS9pbnRlbF9pZGxlLmMgYW5kCisgKiAgZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9pZGxlLmMKKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWlkbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKworI2luY2x1ZGUgPGFzbS9wYWNhLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorCisjaW5jbHVkZSAicGxwYXJfd3JhcHBlcnMuaCIKKyNpbmNsdWRlICJwc2VyaWVzLmgiCisKK3N0cnVjdCBjcHVpZGxlX2RyaXZlciBwc2VyaWVzX2lkbGVfZHJpdmVyID0geworCS5uYW1lID0JCSJwc2VyaWVzX2lkbGUiLAorCS5vd25lciA9CVRISVNfTU9EVUxFLAorfTsKKworI2RlZmluZSBNQVhfSURMRV9TVEFURV9DT1VOVAkyCisKK3N0YXRpYyBpbnQgbWF4X2lkbGVfc3RhdGUgPSBNQVhfSURMRV9TVEFURV9DT1VOVCAtIDE7CitzdGF0aWMgc3RydWN0IGNwdWlkbGVfZGV2aWNlIF9fcGVyY3B1ICpwc2VyaWVzX2NwdWlkbGVfZGV2aWNlczsKK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSAqY3B1aWRsZV9zdGF0ZV90YWJsZTsKKwordm9pZCB1cGRhdGVfc210X3Nub296ZV9kZWxheShpbnQgc25vb3plKQoreworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gY3B1aWRsZV9nZXRfZHJpdmVyKCk7CisJaWYgKGRydikKKwkJZHJ2LT5zdGF0ZXNbMF0udGFyZ2V0X3Jlc2lkZW5jeSA9IHNub296ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlkbGVfbG9vcF9wcm9sb2codW5zaWduZWQgbG9uZyAqaW5fcHVyciwga3RpbWVfdCAqa3RfYmVmb3JlKQoreworCisJKmt0X2JlZm9yZSA9IGt0aW1lX2dldF9yZWFsKCk7CisJKmluX3B1cnIgPSBtZnNwcihTUFJOX1BVUlIpOworCS8qCisJICogSW5kaWNhdGUgdG8gdGhlIEhWIHRoYXQgd2UgYXJlIGlkbGUuIE5vdyB3b3VsZCBiZQorCSAqIGEgZ29vZCB0aW1lIHRvIGZpbmQgb3RoZXIgd29yayB0byBkaXNwYXRjaC4KKwkgKi8KKwlnZXRfbHBwYWNhKCktPmlkbGUgPSAxOworfQorCitzdGF0aWMgaW5saW5lICBzNjQgaWRsZV9sb29wX2VwaWxvZyh1bnNpZ25lZCBsb25nIGluX3B1cnIsIGt0aW1lX3Qga3RfYmVmb3JlKQoreworCWdldF9scHBhY2EoKS0+d2FpdF9zdGF0ZV9jeWNsZXMgKz0gbWZzcHIoU1BSTl9QVVJSKSAtIGluX3B1cnI7CisJZ2V0X2xwcGFjYSgpLT5pZGxlID0gMDsKKworCXJldHVybiBrdGltZV90b191cyhrdGltZV9zdWIoa3RpbWVfZ2V0X3JlYWwoKSwga3RfYmVmb3JlKSk7Cit9CisKK3N0YXRpYyBpbnQgc25vb3plX2xvb3Aoc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCWludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBsb25nIGluX3B1cnI7CisJa3RpbWVfdCBrdF9iZWZvcmU7CisJdW5zaWduZWQgbG9uZyBzdGFydF9zbm9vemU7CisJbG9uZyBzbm9vemUgPSBkcnYtPnN0YXRlc1swXS50YXJnZXRfcmVzaWRlbmN5OworCisJaWRsZV9sb29wX3Byb2xvZygmaW5fcHVyciwgJmt0X2JlZm9yZSk7CisKKwlpZiAoc25vb3plKSB7CisJCXN0YXJ0X3Nub296ZSA9IGdldF90YigpICsgc25vb3plICogdGJfdGlja3NfcGVyX3VzZWM7CisJCWxvY2FsX2lycV9lbmFibGUoKTsKKwkJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CisKKwkJd2hpbGUgKChzbm9vemUgPCAwKSB8fCAoZ2V0X3RiKCkgPCBzdGFydF9zbm9vemUpKSB7CisJCQlpZiAobmVlZF9yZXNjaGVkKCkgfHwgY3B1X2lzX29mZmxpbmUoZGV2LT5jcHUpKQorCQkJCWdvdG8gb3V0OworCQkJcHBjNjRfcnVubGF0Y2hfb2ZmKCk7CisJCQlITVRfbG93KCk7CisJCQlITVRfdmVyeV9sb3coKTsKKwkJfQorCisJCUhNVF9tZWRpdW0oKTsKKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1BPTExJTkdfTlJGTEFHKTsKKwkJc21wX21iKCk7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJfQorCitvdXQ6CisJSE1UX21lZGl1bSgpOworCWRldi0+bGFzdF9yZXNpZGVuY3kgPQorCQkoaW50KWlkbGVfbG9vcF9lcGlsb2coaW5fcHVyciwga3RfYmVmb3JlKTsKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgZGVkaWNhdGVkX2NlZGVfbG9vcChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKwkJCQlzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydiwKKwkJCQlpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgbG9uZyBpbl9wdXJyOworCWt0aW1lX3Qga3RfYmVmb3JlOworCisJaWRsZV9sb29wX3Byb2xvZygmaW5fcHVyciwgJmt0X2JlZm9yZSk7CisJZ2V0X2xwcGFjYSgpLT5kb25hdGVfZGVkaWNhdGVkX2NwdSA9IDE7CisKKwlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKKwlITVRfbWVkaXVtKCk7CisJY2VkZV9wcm9jZXNzb3IoKTsKKworCWdldF9scHBhY2EoKS0+ZG9uYXRlX2RlZGljYXRlZF9jcHUgPSAwOworCWRldi0+bGFzdF9yZXNpZGVuY3kgPQorCQkoaW50KWlkbGVfbG9vcF9lcGlsb2coaW5fcHVyciwga3RfYmVmb3JlKTsKKwlyZXR1cm4gaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgc2hhcmVkX2NlZGVfbG9vcChzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2LAorCQkJaW50IGluZGV4KQoreworCXVuc2lnbmVkIGxvbmcgaW5fcHVycjsKKwlrdGltZV90IGt0X2JlZm9yZTsKKworCWlkbGVfbG9vcF9wcm9sb2coJmluX3B1cnIsICZrdF9iZWZvcmUpOworCisJLyoKKwkgKiBZaWVsZCB0aGUgcHJvY2Vzc29yIHRvIHRoZSBoeXBlcnZpc29yLiAgV2UgcmV0dXJuIGlmCisJICogYW4gZXh0ZXJuYWwgaW50ZXJydXB0IG9jY3VycyAod2hpY2ggYXJlIGRyaXZlbiBwcmlvcgorCSAqIHRvIHJldHVybmluZyBoZXJlKSBvciBpZiBhIHByb2Qgb2NjdXJzIGZyb20gYW5vdGhlcgorCSAqIHByb2Nlc3Nvci4gV2hlbiByZXR1cm5pbmcgaGVyZSwgZXh0ZXJuYWwgaW50ZXJydXB0cworCSAqIGFyZSBlbmFibGVkLgorCSAqLworCWNlZGVfcHJvY2Vzc29yKCk7CisKKwlkZXYtPmxhc3RfcmVzaWRlbmN5ID0KKwkJKGludClpZGxlX2xvb3BfZXBpbG9nKGluX3B1cnIsIGt0X2JlZm9yZSk7CisJcmV0dXJuIGluZGV4OworfQorCisvKgorICogU3RhdGVzIGZvciBkZWRpY2F0ZWQgcGFydGl0aW9uIGNhc2UuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1aWRsZV9zdGF0ZSBkZWRpY2F0ZWRfc3RhdGVzW01BWF9JRExFX1NUQVRFX0NPVU5UXSA9IHsKKwl7IC8qIFNub296ZSAqLworCQkubmFtZSA9ICJzbm9vemUiLAorCQkuZGVzYyA9ICJzbm9vemUiLAorCQkuZmxhZ3MgPSBDUFVJRExFX0ZMQUdfVElNRV9WQUxJRCwKKwkJLmV4aXRfbGF0ZW5jeSA9IDAsCisJCS50YXJnZXRfcmVzaWRlbmN5ID0gMCwKKwkJLmVudGVyID0gJnNub296ZV9sb29wIH0sCisJeyAvKiBDRURFICovCisJCS5uYW1lID0gIkNFREUiLAorCQkuZGVzYyA9ICJDRURFIiwKKwkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsCisJCS5leGl0X2xhdGVuY3kgPSAxLAorCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDEwLAorCQkuZW50ZXIgPSAmZGVkaWNhdGVkX2NlZGVfbG9vcCB9LAorfTsKKworLyoKKyAqIFN0YXRlcyBmb3Igc2hhcmVkIHBhcnRpdGlvbiBjYXNlLgorICovCitzdGF0aWMgc3RydWN0IGNwdWlkbGVfc3RhdGUgc2hhcmVkX3N0YXRlc1tNQVhfSURMRV9TVEFURV9DT1VOVF0gPSB7CisJeyAvKiBTaGFyZWQgQ2VkZSAqLworCQkubmFtZSA9ICJTaGFyZWQgQ2VkZSIsCisJCS5kZXNjID0gIlNoYXJlZCBDZWRlIiwKKwkJLmZsYWdzID0gQ1BVSURMRV9GTEFHX1RJTUVfVkFMSUQsCisJCS5leGl0X2xhdGVuY3kgPSAwLAorCQkudGFyZ2V0X3Jlc2lkZW5jeSA9IDAsCisJCS5lbnRlciA9ICZzaGFyZWRfY2VkZV9sb29wIH0sCit9OworCitpbnQgcHNlcmllc19ub3RpZnlfY3B1aWRsZV9hZGRfY3B1KGludCBjcHUpCit7CisJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXYgPQorCQkJcGVyX2NwdV9wdHIocHNlcmllc19jcHVpZGxlX2RldmljZXMsIGNwdSk7CisJaWYgKGRldiAmJiBjcHVpZGxlX2dldF9kcml2ZXIoKSkgeworCQljcHVpZGxlX2Rpc2FibGVfZGV2aWNlKGRldik7CisJCWNwdWlkbGVfZW5hYmxlX2RldmljZShkZXYpOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHBzZXJpZXNfY3B1aWRsZV9kcml2ZXJfaW5pdCgpCisgKi8KK3N0YXRpYyBpbnQgcHNlcmllc19jcHVpZGxlX2RyaXZlcl9pbml0KHZvaWQpCit7CisJaW50IGlkbGVfc3RhdGU7CisJc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYgPSAmcHNlcmllc19pZGxlX2RyaXZlcjsKKworCWRydi0+c3RhdGVfY291bnQgPSAwOworCisJZm9yIChpZGxlX3N0YXRlID0gMDsgaWRsZV9zdGF0ZSA8IE1BWF9JRExFX1NUQVRFX0NPVU5UOyArK2lkbGVfc3RhdGUpIHsKKworCQlpZiAoaWRsZV9zdGF0ZSA+IG1heF9pZGxlX3N0YXRlKQorCQkJYnJlYWs7CisKKwkJLyogaXMgdGhlIHN0YXRlIG5vdCBlbmFibGVkPyAqLworCQlpZiAoY3B1aWRsZV9zdGF0ZV90YWJsZVtpZGxlX3N0YXRlXS5lbnRlciA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJZHJ2LT5zdGF0ZXNbZHJ2LT5zdGF0ZV9jb3VudF0gPQkvKiBzdHJ1Y3R1cmUgY29weSAqLworCQkJY3B1aWRsZV9zdGF0ZV90YWJsZVtpZGxlX3N0YXRlXTsKKworCQlpZiAoY3B1aWRsZV9zdGF0ZV90YWJsZSA9PSBkZWRpY2F0ZWRfc3RhdGVzKQorCQkJZHJ2LT5zdGF0ZXNbZHJ2LT5zdGF0ZV9jb3VudF0udGFyZ2V0X3Jlc2lkZW5jeSA9CisJCQkJX19nZXRfY3B1X3ZhcihzbXRfc25vb3plX2RlbGF5KTsKKworCQlkcnYtPnN0YXRlX2NvdW50ICs9IDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHBzZXJpZXNfaWRsZV9kZXZpY2VzX3VuaW5pdCh2b2lkKQorICogdW5yZWdpc3RlciBjcHVpZGxlIGRldmljZXMgYW5kIGRlLWFsbG9jYXRlIG1lbW9yeQorICovCitzdGF0aWMgdm9pZCBwc2VyaWVzX2lkbGVfZGV2aWNlc191bmluaXQodm9pZCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UgKmRldjsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCWRldiA9IHBlcl9jcHVfcHRyKHBzZXJpZXNfY3B1aWRsZV9kZXZpY2VzLCBpKTsKKwkJY3B1aWRsZV91bnJlZ2lzdGVyX2RldmljZShkZXYpOworCX0KKworCWZyZWVfcGVyY3B1KHBzZXJpZXNfY3B1aWRsZV9kZXZpY2VzKTsKKwlyZXR1cm47Cit9CisKKy8qIHBzZXJpZXNfaWRsZV9kZXZpY2VzX2luaXQoKQorICogYWxsb2NhdGUsIGluaXRpYWxpemUgYW5kIHJlZ2lzdGVyIGNwdWlkbGUgZGV2aWNlCisgKi8KK3N0YXRpYyBpbnQgcHNlcmllc19pZGxlX2RldmljZXNfaW5pdCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBjcHVpZGxlX2RyaXZlciAqZHJ2ID0gJnBzZXJpZXNfaWRsZV9kcml2ZXI7CisJc3RydWN0IGNwdWlkbGVfZGV2aWNlICpkZXY7CisKKwlwc2VyaWVzX2NwdWlkbGVfZGV2aWNlcyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgY3B1aWRsZV9kZXZpY2UpOworCWlmIChwc2VyaWVzX2NwdWlkbGVfZGV2aWNlcyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCWRldiA9IHBlcl9jcHVfcHRyKHBzZXJpZXNfY3B1aWRsZV9kZXZpY2VzLCBpKTsKKwkJZGV2LT5zdGF0ZV9jb3VudCA9IGRydi0+c3RhdGVfY291bnQ7CisJCWRldi0+Y3B1ID0gaTsKKwkJaWYgKGNwdWlkbGVfcmVnaXN0ZXJfZGV2aWNlKGRldikpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHIFwKKwkJCQkiY3B1aWRsZV9yZWdpc3Rlcl9kZXZpY2UgJWQgZmFpbGVkIVxuIiwgaSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKgorICogcHNlcmllc19pZGxlX3Byb2JlKCkKKyAqIENob29zZSBzdGF0ZSB0YWJsZSBmb3Igc2hhcmVkIHZlcnN1cyBkZWRpY2F0ZWQgcGFydGl0aW9uCisgKi8KK3N0YXRpYyBpbnQgcHNlcmllc19pZGxlX3Byb2JlKHZvaWQpCit7CisKKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfU1BMUEFSKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoY3B1aWRsZV9kaXNhYmxlICE9IElETEVfTk9fT1ZFUlJJREUpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKG1heF9pZGxlX3N0YXRlID09IDApIHsKKwkJcHJpbnRrKEtFUk5fREVCVUcgInBzZXJpZXMgcHJvY2Vzc29yIGlkbGUgZGlzYWJsZWQuXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwlpZiAoZ2V0X2xwcGFjYSgpLT5zaGFyZWRfcHJvYykKKwkJY3B1aWRsZV9zdGF0ZV90YWJsZSA9IHNoYXJlZF9zdGF0ZXM7CisJZWxzZQorCQljcHVpZGxlX3N0YXRlX3RhYmxlID0gZGVkaWNhdGVkX3N0YXRlczsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwc2VyaWVzX3Byb2Nlc3Nvcl9pZGxlX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJcmV0dmFsID0gcHNlcmllc19pZGxlX3Byb2JlKCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXBzZXJpZXNfY3B1aWRsZV9kcml2ZXJfaW5pdCgpOworCXJldHZhbCA9IGNwdWlkbGVfcmVnaXN0ZXJfZHJpdmVyKCZwc2VyaWVzX2lkbGVfZHJpdmVyKTsKKwlpZiAocmV0dmFsKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICJSZWdpc3RyYXRpb24gb2YgcHNlcmllcyBkcml2ZXIgZmFpbGVkLlxuIik7CisJCXJldHVybiByZXR2YWw7CisJfQorCisJcmV0dmFsID0gcHNlcmllc19pZGxlX2RldmljZXNfaW5pdCgpOworCWlmIChyZXR2YWwpIHsKKwkJcHNlcmllc19pZGxlX2RldmljZXNfdW5pbml0KCk7CisJCWNwdWlkbGVfdW5yZWdpc3Rlcl9kcml2ZXIoJnBzZXJpZXNfaWRsZV9kcml2ZXIpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJwc2VyaWVzX2lkbGVfZHJpdmVyIHJlZ2lzdGVyZWRcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBwc2VyaWVzX3Byb2Nlc3Nvcl9pZGxlX2V4aXQodm9pZCkKK3sKKworCXBzZXJpZXNfaWRsZV9kZXZpY2VzX3VuaW5pdCgpOworCWNwdWlkbGVfdW5yZWdpc3Rlcl9kcml2ZXIoJnBzZXJpZXNfaWRsZV9kcml2ZXIpOworCisJcmV0dXJuOworfQorCittb2R1bGVfaW5pdChwc2VyaWVzX3Byb2Nlc3Nvcl9pZGxlX2luaXQpOworbW9kdWxlX2V4aXQocHNlcmllc19wcm9jZXNzb3JfaWRsZV9leGl0KTsKKworTU9EVUxFX0FVVEhPUigiRGVlcHRoaSBEaGFyd2FyIDxkZWVwdGhpQGxpbnV4LnZuZXQuaWJtLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3B1aWRsZSBkcml2ZXIgZm9yIFBPV0VSIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3BzZXJpZXMuaAppbmRleCAyNGM3MTYyLi45YTNkZGEwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvcHNlcmllcy5oCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9wc2VyaWVzLmgKQEAgLTU3LDQgKzU3LDcgQEAKIGV4dGVybiBpbnQgZGxwYXJfYXR0YWNoX25vZGUoc3RydWN0IGRldmljZV9ub2RlICopOwogZXh0ZXJuIGludCBkbHBhcl9kZXRhY2hfbm9kZShzdHJ1Y3QgZGV2aWNlX25vZGUgKik7CiAKKy8qIFNub296ZSBEZWxheSwgcHNlcmllc19pZGxlICovCitERUNMQVJFX1BFUl9DUFUobG9uZywgc210X3Nub296ZV9kZWxheSk7CisKICNlbmRpZiAvKiBfUFNFUklFU19QU0VSSUVTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zZXR1cC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKaW5kZXggYzM0MDhjYS4uZjc5ZjEyNyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NldHVwLmMKQEAgLTM5LDYgKzM5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1aWRsZS5oPgogCiAjaW5jbHVkZSA8YXNtL21tdS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTc0LDkgKzc1LDYgQEAKIAogaW50IGZ3bm1pX2FjdGl2ZTsgIC8qIFRSVUUgaWYgYW4gRldOTUkgaGFuZGxlciBpcyBwcmVzZW50ICovCiAKLXN0YXRpYyB2b2lkIHBzZXJpZXNfc2hhcmVkX2lkbGVfc2xlZXAodm9pZCk7Ci1zdGF0aWMgdm9pZCBwc2VyaWVzX2RlZGljYXRlZF9pZGxlX3NsZWVwKHZvaWQpOwotCiBzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlICpwU2VyaWVzX21waWNfbm9kZTsKIAogc3RhdGljIHZvaWQgcFNlcmllc19zaG93X2NwdWluZm8oc3RydWN0IHNlcV9maWxlICptKQpAQCAtMTkyLDggKzE5MCw3IEBACiAJQlVHX09OKG9wZW5waWNfYWRkciA9PSAwKTsKIAogCS8qIFNldHVwIHRoZSBvcGVucGljIGRyaXZlciAqLwotCW1waWMgPSBtcGljX2FsbG9jKHBTZXJpZXNfbXBpY19ub2RlLCBvcGVucGljX2FkZHIsCi0JCQkgIE1QSUNfUFJJTUFSWSwKKwltcGljID0gbXBpY19hbGxvYyhwU2VyaWVzX21waWNfbm9kZSwgb3BlbnBpY19hZGRyLCAwLAogCQkJICAxNiwgMjUwLCAvKiBpc3Ugc2l6ZSwgaXJxIGNvdW50ICovCiAJCQkgICIgTVBJQyAgICAgIik7CiAJQlVHX09OKG1waWMgPT0gTlVMTCk7CkBAIC0zNTIsOCArMzQ5LDI1IEBACiB9CiBlYXJseV9pbml0Y2FsbChhbGxvY19kaXNwYXRjaF9sb2dfa21lbV9jYWNoZSk7CiAKK3N0YXRpYyB2b2lkIHBTZXJpZXNfaWRsZSh2b2lkKQoreworCS8qIFRoaXMgd291bGQgY2FsbCBvbiB0aGUgY3B1aWRsZSBmcmFtZXdvcmssIGFuZCB0aGUgYmFjay1lbmQgcHNlcmllcworCSAqIGRyaXZlciB0byAgZ28gdG8gaWRsZSBzdGF0ZXMKKwkgKi8KKwlpZiAoY3B1aWRsZV9pZGxlX2NhbGwoKSkgeworCQkvKiBPbiBlcnJvciwgZXhlY3V0ZSBkZWZhdWx0IGhhbmRsZXIKKwkJICogdG8gZ28gaW50byBsb3cgdGhyZWFkIHByaW9yaXR5IGFuZCBwb3NzaWJseQorCQkgKiBsb3cgcG93ZXIgbW9kZS4KKwkJICovCisJCUhNVF9sb3coKTsKKwkJSE1UX3ZlcnlfbG93KCk7CisJfQorfQorCiBzdGF0aWMgdm9pZCBfX2luaXQgcFNlcmllc19zZXR1cF9hcmNoKHZvaWQpCiB7CisJcGFuaWNfdGltZW91dCA9IDEwOworCiAJLyogRGlzY292ZXIgUElDIHR5cGUgYW5kIHNldHVwIHBwY19tZCBhY2NvcmRpbmdseSAqLwogCXBzZXJpZXNfZGlzY292ZXJfcGljKCk7CiAKQEAgLTM3NCwxOCArMzg4LDkgQEAKIAogCXBTZXJpZXNfbnZyYW1faW5pdCgpOwogCi0JLyogQ2hvb3NlIGFuIGlkbGUgbG9vcCAqLwogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX1NQTFBBUikpIHsKIAkJdnBhX2luaXQoYm9vdF9jcHVpZCk7Ci0JCWlmIChnZXRfbHBwYWNhKCktPnNoYXJlZF9wcm9jKSB7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAiVXNpbmcgc2hhcmVkIHByb2Nlc3NvciBpZGxlIGxvb3BcbiIpOwotCQkJcHBjX21kLnBvd2VyX3NhdmUgPSBwc2VyaWVzX3NoYXJlZF9pZGxlX3NsZWVwOwotCQl9IGVsc2UgewotCQkJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIGRlZGljYXRlZCBpZGxlIGxvb3BcbiIpOwotCQkJcHBjX21kLnBvd2VyX3NhdmUgPSBwc2VyaWVzX2RlZGljYXRlZF9pZGxlX3NsZWVwOwotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIlVzaW5nIGRlZmF1bHQgaWRsZSBsb29wXG4iKTsKKwkJcHBjX21kLnBvd2VyX3NhdmUgPSBwU2VyaWVzX2lkbGU7CiAJfQogCiAJaWYgKGZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCkBAIC01ODYsODAgKzU5MSw2IEBACiAJcmV0dXJuIDE7CiB9CiAKLQotREVDTEFSRV9QRVJfQ1BVKGxvbmcsIHNtdF9zbm9vemVfZGVsYXkpOwotCi1zdGF0aWMgdm9pZCBwc2VyaWVzX2RlZGljYXRlZF9pZGxlX3NsZWVwKHZvaWQpCi17IAotCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9zbm9vemU7Ci0JdW5zaWduZWQgbG9uZyBpbl9wdXJyLCBvdXRfcHVycjsKLQlsb25nIHNub296ZSA9IF9fZ2V0X2NwdV92YXIoc210X3Nub296ZV9kZWxheSk7Ci0KLQkvKgotCSAqIEluZGljYXRlIHRvIHRoZSBIViB0aGF0IHdlIGFyZSBpZGxlLiBOb3cgd291bGQgYmUKLQkgKiBhIGdvb2QgdGltZSB0byBmaW5kIG90aGVyIHdvcmsgdG8gZGlzcGF0Y2guCi0JICovCi0JZ2V0X2xwcGFjYSgpLT5pZGxlID0gMTsKLQlnZXRfbHBwYWNhKCktPmRvbmF0ZV9kZWRpY2F0ZWRfY3B1ID0gMTsKLQlpbl9wdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKLQotCS8qCi0JICogV2UgY29tZSBpbiB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQsIGFuZCBuZWVkX3Jlc2NoZWQoKQotCSAqIGhhcyBiZWVuIGNoZWNrZWQgcmVjZW50bHkuICBJZiB3ZSBzaG91bGQgcG9sbCBmb3IgYSBsaXR0bGUKLQkgKiB3aGlsZSwgZG8gc28uCi0JICovCi0JaWYgKHNub296ZSkgewotCQlzdGFydF9zbm9vemUgPSBnZXRfdGIoKSArIHNub296ZSAqIHRiX3RpY2tzX3Blcl91c2VjOwotCQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0JCXNldF90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwotCi0JCXdoaWxlICgoc25vb3plIDwgMCkgfHwgKGdldF90YigpIDwgc3RhcnRfc25vb3plKSkgewotCQkJaWYgKG5lZWRfcmVzY2hlZCgpIHx8IGNwdV9pc19vZmZsaW5lKGNwdSkpCi0JCQkJZ290byBvdXQ7Ci0JCQlwcGM2NF9ydW5sYXRjaF9vZmYoKTsKLQkJCUhNVF9sb3coKTsKLQkJCUhNVF92ZXJ5X2xvdygpOwotCQl9Ci0KLQkJSE1UX21lZGl1bSgpOwotCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfUE9MTElOR19OUkZMQUcpOwotCQlzbXBfbWIoKTsKLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQkJaWYgKG5lZWRfcmVzY2hlZCgpIHx8IGNwdV9pc19vZmZsaW5lKGNwdSkpCi0JCQlnb3RvIG91dDsKLQl9Ci0KLQljZWRlX3Byb2Nlc3NvcigpOwotCi1vdXQ6Ci0JSE1UX21lZGl1bSgpOwotCW91dF9wdXJyID0gbWZzcHIoU1BSTl9QVVJSKTsKLQlnZXRfbHBwYWNhKCktPndhaXRfc3RhdGVfY3ljbGVzICs9IG91dF9wdXJyIC0gaW5fcHVycjsKLQlnZXRfbHBwYWNhKCktPmRvbmF0ZV9kZWRpY2F0ZWRfY3B1ID0gMDsKLQlnZXRfbHBwYWNhKCktPmlkbGUgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBwc2VyaWVzX3NoYXJlZF9pZGxlX3NsZWVwKHZvaWQpCi17Ci0JLyoKLQkgKiBJbmRpY2F0ZSB0byB0aGUgSFYgdGhhdCB3ZSBhcmUgaWRsZS4gTm93IHdvdWxkIGJlCi0JICogYSBnb29kIHRpbWUgdG8gZmluZCBvdGhlciB3b3JrIHRvIGRpc3BhdGNoLgotCSAqLwotCWdldF9scHBhY2EoKS0+aWRsZSA9IDE7Ci0KLQkvKgotCSAqIFlpZWxkIHRoZSBwcm9jZXNzb3IgdG8gdGhlIGh5cGVydmlzb3IuICBXZSByZXR1cm4gaWYKLQkgKiBhbiBleHRlcm5hbCBpbnRlcnJ1cHQgb2NjdXJzICh3aGljaCBhcmUgZHJpdmVuIHByaW9yCi0JICogdG8gcmV0dXJuaW5nIGhlcmUpIG9yIGlmIGEgcHJvZCBvY2N1cnMgZnJvbSBhbm90aGVyCi0JICogcHJvY2Vzc29yLiBXaGVuIHJldHVybmluZyBoZXJlLCBleHRlcm5hbCBpbnRlcnJ1cHRzCi0JICogYXJlIGVuYWJsZWQuCi0JICovCi0JY2VkZV9wcm9jZXNzb3IoKTsKLQotCWdldF9scHBhY2EoKS0+aWRsZSA9IDA7Ci19Ci0KIHN0YXRpYyBpbnQgcFNlcmllc19wY2lfcHJvYmVfbW9kZShzdHJ1Y3QgcGNpX2J1cyAqYnVzKQogewogCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0xQQVIpKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NtcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3NtcC5jCmluZGV4IDI2ZTkzZmQuLmJiYzNjNDIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy9zbXAuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMvc21wLmMKQEAgLTE0OCw2ICsxNDgsNyBAQAogCXNldF9jcHVfY3VycmVudF9zdGF0ZShjcHUsIENQVV9TVEFURV9PTkxJTkUpOwogCXNldF9kZWZhdWx0X29mZmxpbmVfc3RhdGUoY3B1KTsKICNlbmRpZgorCXBzZXJpZXNfbm90aWZ5X2NwdWlkbGVfYWRkX2NwdShjcHUpOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBzbXBfcFNlcmllc19raWNrX2NwdShpbnQgbnIpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9LY29uZmlnIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvS2NvbmZpZwppbmRleCBiZDU2MGM3Li41N2QyMmEyIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9LY29uZmlnCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL0tjb25maWcKQEAgLTEsMjAgKzEsMjggQEAKIGNvbmZpZyBQUENfV1NQCiAJYm9vbAogCXNlbGVjdCBQUENfQTIKKwlzZWxlY3QgR0VORVJJQ19UQlNZTkMKKwlzZWxlY3QgUFBDX0lDU1dYCiAJc2VsZWN0IFBQQ19TQ09NCiAJc2VsZWN0IFBQQ19YSUNTCiAJc2VsZWN0IFBQQ19JQ1BfTkFUSVZFCiAJc2VsZWN0IFBDSQogCXNlbGVjdCBQUENfSU9fV09SS0FST1VORFMgaWYgUENJCiAJc2VsZWN0IFBQQ19JTkRJUkVDVF9QSU8gaWYgUENJCisJc2VsZWN0IFBQQ19XU1BfQ09QUk8KIAlkZWZhdWx0IG4KIAogbWVudSAiV1NQIHBsYXRmb3JtIHNlbGVjdGlvbiIKIAlkZXBlbmRzIG9uIFBQQ19CT09LM0VfNjQKIAogY29uZmlnIFBQQ19QU1IyCi0JYm9vbCAiUFNSLTIgcGxhdGZvcm0iCi0Jc2VsZWN0IEdFTkVSSUNfVEJTWU5DCisJYm9vbCAiUG93ZXJFTiBTeXN0ZW0gUmVmZXJlbmNlIFBsYXRmb3JtIDIiCisJc2VsZWN0IEVQQVBSX0JPT1QKKwlzZWxlY3QgUFBDX1dTUAorCWRlZmF1bHQgeQorCitjb25maWcgUFBDX0NIUk9NQQorCWJvb2wgIlBvd2VyRU4gUENJZSBDaHJvbWEgQ2FyZCIKIAlzZWxlY3QgRVBBUFJfQk9PVAogCXNlbGVjdCBQUENfV1NQCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL01ha2VmaWxlCmluZGV4IGExNDg2YjQuLjU2ODE3YWMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL01ha2VmaWxlCkBAIC0xLDggKzEsMTAgQEAKIGNjZmxhZ3MteQkJCSs9IC1tbm8tbWluaW1hbC10b2MKIAotb2JqLXkJCQkJKz0gc2V0dXAubyBpY3Mubwotb2JqLSQoQ09ORklHX1BQQ19QU1IyKQkJKz0gcHNyMi5vIG9wYl9waWMubworb2JqLXkJCQkJKz0gc2V0dXAubyBpY3MubyB3c3Aubworb2JqLSQoQ09ORklHX1BQQ19QU1IyKQkJKz0gcHNyMi5vCitvYmotJChDT05GSUdfUFBDX0NIUk9NQSkJKz0gY2hyb21hLm8gaDgubworb2JqLSQoQ09ORklHX1BQQ19XU1ApCQkrPSBvcGJfcGljLm8KIG9iai0kKENPTkZJR19QUENfV1NQKQkJKz0gc2NvbV93c3Aubwogb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vIHNjb21fc21wLm8KIG9iai0kKENPTkZJR19QQ0kpCQkrPSB3c3BfcGNpLm8KLW9iai0kKENPTkZJR19QQ0lfTVNJKQkJKz0gbXNpLm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitvYmotJChDT05GSUdfUENJX01TSSkJCSs9IG1zaS5vCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9jaHJvbWEuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL2Nocm9tYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNmZhMjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9jaHJvbWEuYwpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAxMSwgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2luY2x1ZGUgPGFzbS91ZGJnLmg+CisKKyNpbmNsdWRlICJpY3MuaCIKKyNpbmNsdWRlICJ3c3AuaCIKKwordm9pZCBfX2luaXQgY2hyb21hX3NldHVwX2FyY2godm9pZCkKK3sKKwl3c3Bfc2V0dXBfYXJjaCgpOworCXdzcF9zZXR1cF9oOCgpOworCit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNocm9tYV9wcm9iZSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgcm9vdCA9IG9mX2dldF9mbGF0X2R0X3Jvb3QoKTsKKworCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJpYm0sd3NwLWNocm9tYSIpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitkZWZpbmVfbWFjaGluZShjaHJvbWFfbWQpIHsKKwkubmFtZQkJCT0gIkNocm9tYSBQQ0llIiwKKwkucHJvYmUJCQk9IGNocm9tYV9wcm9iZSwKKwkuc2V0dXBfYXJjaAkJPSBjaHJvbWFfc2V0dXBfYXJjaCwKKwkucmVzdGFydAkJPSB3c3BfaDhfcmVzdGFydCwKKwkucG93ZXJfb2ZmCQk9IHdzcF9oOF9wb3dlcl9vZmYsCisJLmhhbHQJCQk9IHdzcF9oYWx0LAorCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAorCS5pbml0X0lSUQkJPSB3c3Bfc2V0dXBfaXJxLAorCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAorCS5wb3dlcl9zYXZlCQk9IGJvb2szZV9pZGxlLAorfTsKKworbWFjaGluZV9hcmNoX2luaXRjYWxsKGNocm9tYV9tZCwgd3NwX3Byb2JlX2RldmljZXMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvaDguYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL2g4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE4ZTZjYwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL2g4LmMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAwOC0yMDExLCBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisKKyNpbmNsdWRlICJ3c3AuaCIKKworLyoKKyAqIFRoZSBVQVJUIGNvbm5lY3Rpb24gdG8gdGhlIEg4IGlzIG92ZXIgdHR5UzEgd2hpY2ggaXMganVzdCBhIDE2NTUwLgorICogV2UgYXNzdW1lIHRoYXQgRlcgaGFzIGl0IHNldHVwIHJpZ2h0IGFuZCBubyBvbmUgbWVzc2VzIHdpdGggaXQuCisgKi8KKworCitzdGF0aWMgdTggX19pb21lbSAqaDg7CisKKyNkZWZpbmUgUkJSIDAJCS8qIFJlY2VpdmVyIEJ1ZmZlciBSZWdpc3RlciAqLworI2RlZmluZSBUSFIgMAkJLyogVHJhbnNtaXR0ZXIgSG9sZGluZyBSZWdpc3RlciAqLworI2RlZmluZSBMU1IgNQkJLyogTGluZSBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgTFNSX0RSIDB4MDEJLyogTFNSIHZhbHVlIGZvciBEYXRhLVJlYWR5ICovCisjZGVmaW5lIExTUl9USFJFIDB4MjAJLyogTFNSIHZhbHVlIGZvciBUcmFuc21pdHRlci1Ib2xkaW5nLVJlZ2lzdGVyLUVtcHR5ICovCitzdGF0aWMgdm9pZCB3c3BfaDhfcHV0YyhpbnQgYykKK3sKKwl1OCBsc3I7CisKKwlkbyB7CisJCWxzciA9IHJlYWRiKGg4ICsgTFNSKTsKKwl9IHdoaWxlICgobHNyICYgTFNSX1RIUkUpICE9IExTUl9USFJFKTsKKwl3cml0ZWIoYywgaDggKyBUSFIpOworfQorCitzdGF0aWMgaW50IHdzcF9oOF9nZXRjKHZvaWQpCit7CisJdTggbHNyOworCisJZG8geworCQlsc3IgPSByZWFkYihoOCArIExTUik7CisJfSB3aGlsZSAoKGxzciAmIExTUl9EUikgIT0gTFNSX0RSKTsKKworCXJldHVybiByZWFkYihoOCArIFJCUik7Cit9CisKK3N0YXRpYyB2b2lkIHdzcF9oOF9wdXRzKGNvbnN0IGNoYXIgKnMsIGludCBzeikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzejsgaSsrKSB7CisJCXdzcF9oOF9wdXRjKHNbaV0pOworCisJCS8qIG5vIGZsb3cgY29udHJvbCBzbyB3YWl0IGZvciBlY2hvICovCisJCXdzcF9oOF9nZXRjKCk7CisJfQorCXdzcF9oOF9wdXRjKCdccicpOworCXdzcF9oOF9wdXRjKCdcbicpOworfQorCitzdGF0aWMgdm9pZCB3c3BfaDhfdGVybWluYWxfY21kKGNvbnN0IGNoYXIgKmNtZCwgaW50IHN6KQoreworCWhhcmRfaXJxX2Rpc2FibGUoKTsKKwl3c3BfaDhfcHV0cyhjbWQsIHN6KTsKKwkvKiBzaG91bGQgbmV2ZXIgcmV0dXJuLCBidXQganVzdCBpbiBjYXNlICovCisJZm9yICg7OykKKwkJY29udGludWU7Cit9CisKKwordm9pZCB3c3BfaDhfcmVzdGFydChjaGFyICpjbWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcmVzdGFydFtdID0gIndhcm0tcmVzZXQiOworCisJKHZvaWQpY21kOworCXdzcF9oOF90ZXJtaW5hbF9jbWQocmVzdGFydCwgc2l6ZW9mKHJlc3RhcnQpIC0gMSk7Cit9CisKK3ZvaWQgd3NwX2g4X3Bvd2VyX29mZih2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG9mZltdID0gInBvd2VyLW9mZiI7CisKKwl3c3BfaDhfdGVybWluYWxfY21kKG9mZiwgc2l6ZW9mKG9mZikgLSAxKTsKK30KKworc3RhdGljIHZvaWQgX19pb21lbSAqd3NwX2g4X2dldGFkZHIodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmFsaWFzZXM7CisJc3RydWN0IGRldmljZV9ub2RlICp1YXJ0OworCXN0cnVjdCBwcm9wZXJ0eSAqcGF0aDsKKwl2b2lkIF9faW9tZW0gKnZhID0gTlVMTDsKKworCS8qCisJICogdGhlcmUgaXMgbm90aGluZyBpbiB0aGUgZGV2dHJlZSB0byB0ZWxsIHVzIHdoaWNoIGlzIG1hcHBlZAorCSAqIHRvIHRoZSBIOCwgYnV0IHNlIGtub3cgaXQgaXMgdGhlIHNlY29uZCBzZXJpYWwgcG9ydC4KKwkgKi8KKworCWFsaWFzZXMgPSBvZl9maW5kX25vZGVfYnlfcGF0aCgiL2FsaWFzZXMiKTsKKwlpZiAoYWxpYXNlcyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXBhdGggPSBvZl9maW5kX3Byb3BlcnR5KGFsaWFzZXMsICJzZXJpYWwxIiwgTlVMTCk7CisJaWYgKHBhdGggPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwl1YXJ0ID0gb2ZfZmluZF9ub2RlX2J5X3BhdGgocGF0aC0+dmFsdWUpOworCWlmICh1YXJ0ID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJdmEgPSBvZl9pb21hcCh1YXJ0LCAwKTsKKworCS8qIHJlbW92ZSBpdCBzbyBubyBvbmUgbWVzc2VzIHdpdGggaXQgKi8KKwlvZl9kZXRhY2hfbm9kZSh1YXJ0KTsKKwlvZl9ub2RlX3B1dCh1YXJ0KTsKKworb3V0OgorCW9mX25vZGVfcHV0KGFsaWFzZXMpOworCisJcmV0dXJuIHZhOworfQorCit2b2lkIF9faW5pdCB3c3Bfc2V0dXBfaDgodm9pZCkKK3sKKwloOCA9IHdzcF9oOF9nZXRhZGRyKCk7CisKKwkvKiBEZXZ0cmVlIGNoYW5nZT8gbGV0cyBoYXJkIG1hcCBpdCBhbnl3YXkgKi8KKwlpZiAoaDggPT0gTlVMTCkgeworCQlwcl93YXJuKCJVQVJUIHRvIEg4IGNvdWxkIG5vdCBiZSBmb3VuZCIpOworCQloOCA9IGlvcmVtYXAoMHhmZmMwMDA4MDAwVUxMLCAweDEwMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avb3BiX3BpYy5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avb3BiX3BpYy5jCmluZGV4IGJlMDU2MzEuLjE5ZjM1M2QgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL29wYl9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9vcGJfcGljLmMKQEAgLTMyMCw3ICszMjAsOCBAQAogCQl9CiAKIAkJLyogQXR0YWNoIG9wYiBpbnRlcnJ1cHQgaGFuZGxlciB0byBuZXcgdmlydHVhbCBJUlEgKi8KLQkJcmMgPSByZXF1ZXN0X2lycSh2aXJxLCBvcGJfaXJxX2hhbmRsZXIsIDAsICJPUEIgTFMgQ2FzY2FkZSIsIG9wYik7CisJCXJjID0gcmVxdWVzdF9pcnEodmlycSwgb3BiX2lycV9oYW5kbGVyLCBJUlFGX05PX1RIUkVBRCwKKwkJCQkgIk9QQiBMUyBDYXNjYWRlIiwgb3BiKTsKIAkJaWYgKHJjKSB7CiAJCQlwcmludGsoIm9wYjogcmVxdWVzdF9pcnEgZmFpbGVkOiAlZFxuIiwgcmMpOwogCQkJY29udGludWU7CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9wc3IyLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC9wc3IyLmMKaW5kZXggMTY2ZjJlNC4uMGMxYWUwNiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3AvcHNyMi5jCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3BzcjIuYwpAQCAtMTQsMTAgKzE0LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9vZi5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS90aW1lLmg+CiAjaW5jbHVkZSA8YXNtL3VkYmcuaD4KIAogI2luY2x1ZGUgImljcy5oIgpAQCAtMjcsNyArMjcsOCBAQAogc3RhdGljIHZvaWQgcHNyMl9zcGluKHZvaWQpCiB7CiAJaGFyZF9pcnFfZGlzYWJsZSgpOwotCWZvciAoOzspIDsKKwlmb3IgKDs7KQorCQljb250aW51ZTsKIH0KIAogc3RhdGljIHZvaWQgcHNyMl9yZXN0YXJ0KGNoYXIgKmNtZCkKQEAgLTM1LDY1ICszNiwzMiBAQAogCXBzcjJfc3BpbigpOwogfQogCi1zdGF0aWMgaW50IHBzcjJfcHJvYmVfZGV2aWNlcyh2b2lkKQotewotCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7Ci0KLQkvKiBPdXIgUlRDIGlzIGEgZHMxNTAwLiBJdCBzZWVtcyB0byBiZSBwcm9ncmFtYXRpY2FsbHkgY29tcGF0aWJsZQotCSAqIHdpdGggdGhlIGRzMTUxMSBmb3Igd2hpY2ggd2UgaGF2ZSBhIGRyaXZlciBzbyBsZXQncyB1c2UgdGhhdAotCSAqLwotCW5wID0gb2ZfZmluZF9jb21wYXRpYmxlX25vZGUoTlVMTCwgTlVMTCwgImRhbGxhcyxkczE1MDAiKTsKLQlpZiAobnAgIT0gTlVMTCkgewotCQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwotCQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShucCwgMCwgJnJlcykgPT0gMCkKLQkJCXBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoImRzMTUxMSIsIDAsICZyZXMsIDEpOwotCX0KLQlyZXR1cm4gMDsKLX0KLW1hY2hpbmVfYXJjaF9pbml0Y2FsbChwc3IyX21kLCBwc3IyX3Byb2JlX2RldmljZXMpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgcHNyMl9zZXR1cF9hcmNoKHZvaWQpCi17Ci0JLyogaW5pdCB0byBzb21lIH5zYW5lIHZhbHVlIHVudGlsIGNhbGlicmF0ZV9kZWxheSgpIHJ1bnMgKi8KLQlsb29wc19wZXJfamlmZnkgPSA1MDAwMDAwMDsKLQotCXNjb21faW5pdF93c3AoKTsKLQotCS8qIFNldHVwIFNNUCBjYWxsYmFjayAqLwotI2lmZGVmIENPTkZJR19TTVAKLQlhMl9zZXR1cF9zbXAoKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QQ0kKLQl3c3Bfc2V0dXBfcGNpKCk7Ci0jZW5kaWYKLQotfQotCiBzdGF0aWMgaW50IF9faW5pdCBwc3IyX3Byb2JlKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyByb290ID0gb2ZfZ2V0X2ZsYXRfZHRfcm9vdCgpOwogCisJaWYgKG9mX2ZsYXRfZHRfaXNfY29tcGF0aWJsZShyb290LCAiaWJtLHdzcC1jaHJvbWEiKSkgeworCQkvKiBjaHJvbWEgc3lzdGVtcyBhbHNvIGNsYWltIHRoZXkgYXJlIHBzcjJzICovCisJCXJldHVybiAwOworCX0KKwogCWlmICghb2ZfZmxhdF9kdF9pc19jb21wYXRpYmxlKHJvb3QsICJpYm0scHNyMiIpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgcHNyMl9pbml0X2lycSh2b2lkKQotewotCXdzcF9pbml0X2lycSgpOwotCW9wYl9waWNfaW5pdCgpOwotfQotCiBkZWZpbmVfbWFjaGluZShwc3IyX21kKSB7CiAJLm5hbWUJCQk9ICJQU1IyIEEyIiwKIAkucHJvYmUJCQk9IHBzcjJfcHJvYmUsCi0JLnNldHVwX2FyY2gJCT0gcHNyMl9zZXR1cF9hcmNoLAorCS5zZXR1cF9hcmNoCQk9IHdzcF9zZXR1cF9hcmNoLAogCS5yZXN0YXJ0CQk9IHBzcjJfcmVzdGFydCwKIAkucG93ZXJfb2ZmCQk9IHBzcjJfc3BpbiwKIAkuaGFsdAkJCT0gcHNyMl9zcGluLAogCS5jYWxpYnJhdGVfZGVjcgkJPSBnZW5lcmljX2NhbGlicmF0ZV9kZWNyLAotCS5pbml0X0lSUQkJPSBwc3IyX2luaXRfaXJxLAorCS5pbml0X0lSUQkJPSB3c3Bfc2V0dXBfaXJxLAogCS5wcm9ncmVzcwkJPSB1ZGJnX3Byb2dyZXNzLAogCS5wb3dlcl9zYXZlCQk9IGJvb2szZV9pZGxlLAogfTsKKworbWFjaGluZV9hcmNoX2luaXRjYWxsKHBzcjJfbWQsIHdzcF9wcm9iZV9kZXZpY2VzKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcC5jIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI1Y2M5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvd3NwL3dzcC5jCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAxMSwgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKworI2luY2x1ZGUgPGFzbS9zY29tLmg+CisKKyNpbmNsdWRlICJ3c3AuaCIKKyNpbmNsdWRlICJpY3MuaCIKKworI2RlZmluZSBXU1BfU09DX0NPTVBBVElCTEUJImlibSx3c3Atc29jIgorI2RlZmluZSBQQklDX0NPTVBBVElCTEUJCSJpYm0sd3NwLXBiaWMiCisjZGVmaW5lIENPUFJPX0NPTVBBVElCTEUJImlibSx3c3AtY29wcm9jZXNzb3IiCisKK3N0YXRpYyBpbnQgX19pbml0IHdzcF9wcm9iZV9idXNlcyh2b2lkKQoreworCXN0YXRpYyBfX2luaXRkYXRhIHN0cnVjdCBvZl9kZXZpY2VfaWQgYnVzX2lkc1tdID0geworCQkvKgorCQkgKiBldmVyeSBub2RlIGluIGJldHdlZW4gbmVlZHMgdG8gYmUgaGVyZSBvciB5b3Ugd29uJ3QKKwkJICogZmluZCBpdAorCQkgKi8KKwkJeyAuY29tcGF0aWJsZSA9IFdTUF9TT0NfQ09NUEFUSUJMRSwgfSwKKwkJeyAuY29tcGF0aWJsZSA9IFBCSUNfQ09NUEFUSUJMRSwgfSwKKwkJeyAuY29tcGF0aWJsZSA9IENPUFJPX0NPTVBBVElCTEUsIH0sCisJCXt9LAorCX07CisJb2ZfcGxhdGZvcm1fYnVzX3Byb2JlKE5VTEwsIGJ1c19pZHMsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IHdzcF9zZXR1cF9hcmNoKHZvaWQpCit7CisJLyogaW5pdCB0byBzb21lIH5zYW5lIHZhbHVlIHVudGlsIGNhbGlicmF0ZV9kZWxheSgpIHJ1bnMgKi8KKwlsb29wc19wZXJfamlmZnkgPSA1MDAwMDAwMDsKKworCXNjb21faW5pdF93c3AoKTsKKworCS8qIFNldHVwIFNNUCBjYWxsYmFjayAqLworI2lmZGVmIENPTkZJR19TTVAKKwlhMl9zZXR1cF9zbXAoKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19QQ0kKKwl3c3Bfc2V0dXBfcGNpKCk7CisjZW5kaWYKK30KKwordm9pZCBfX2luaXQgd3NwX3NldHVwX2lycSh2b2lkKQoreworCXdzcF9pbml0X2lycSgpOworCW9wYl9waWNfaW5pdCgpOworfQorCisKK2ludCBfX2luaXQgd3NwX3Byb2JlX2RldmljZXModm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCisJLyogT3VyIFJUQyBpcyBhIGRzMTUwMC4gSXQgc2VlbXMgdG8gYmUgcHJvZ3JhbWF0aWNhbGx5IGNvbXBhdGlibGUKKwkgKiB3aXRoIHRoZSBkczE1MTEgZm9yIHdoaWNoIHdlIGhhdmUgYSBkcml2ZXIgc28gbGV0J3MgdXNlIHRoYXQKKwkgKi8KKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJkYWxsYXMsZHMxNTAwIik7CisJaWYgKG5wICE9IE5VTEwpIHsKKwkJc3RydWN0IHJlc291cmNlIHJlczsKKwkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpID09IDApCisJCQlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKCJkczE1MTEiLCAwLCAmcmVzLCAxKTsKKwl9CisKKwl3c3BfcHJvYmVfYnVzZXMoKTsKKworCXJldHVybiAwOworfQorCit2b2lkIHdzcF9oYWx0KHZvaWQpCit7CisJdTY0IHZhbDsKKwlzY29tX21hcF90IG07CisJc3RydWN0IGRldmljZV9ub2RlICpkbjsKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm1pbmU7CisJc3RydWN0IGRldmljZV9ub2RlICptZTsKKworCW1lID0gb2ZfZ2V0X2NwdV9ub2RlKHNtcF9wcm9jZXNzb3JfaWQoKSwgTlVMTCk7CisJbWluZSA9IHNjb21fZmluZF9wYXJlbnQobWUpOworCisJLyogVGhpcyB3aWxsIGhhbHQgYWxsIHRoZSBBMnMgYnV0IG5vdCBwb3dlciBvZmYgdGhlIGNoaXAgKi8KKwlmb3JfZWFjaF9ub2RlX3dpdGhfcHJvcGVydHkoZG4sICJzY29tLWNvbnRyb2xsZXIiKSB7CisJCWlmIChkbiA9PSBtaW5lKQorCQkJY29udGludWU7CisJCW0gPSBzY29tX21hcChkbiwgMCwgMSk7CisKKwkJLyogcmVhZC1tb2RpZnktd3JpdGUgaXQgc28gdGhlIEhXIHByb2JlIGRvZXMgbm90IGdldAorCQkgKiBjb25mdXNlZCAqLworCQl2YWwgPSBzY29tX3JlYWQobSwgMCk7CisJCXZhbCB8PSAxOworCQlzY29tX3dyaXRlKG0sIDAsIHZhbCk7CisJCXNjb21fdW5tYXAobSk7CisJfQorCW0gPSBzY29tX21hcChtaW5lLCAwLCAxKTsKKwl2YWwgPSBzY29tX3JlYWQobSwgMCk7CisJdmFsIHw9IDE7CisJc2NvbV93cml0ZShtLCAwLCB2YWwpOworCS8qIHNob3VsZCBuZXZlciByZXR1cm4gKi8KKwlzY29tX3VubWFwKG0pOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy93c3Avd3NwLmggYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3AuaAppbmRleCAzMzQ3OTgxLi4xMGMxZDFmIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3AuaAorKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3dzcC93c3AuaApAQCAtNiwxNSArNiwyNSBAQAogLyogRGV2dHJlZSBjb21wYXRpYmxlIHN0cmluZ3MgZm9yIG1ham9yIGRldmljZXMgKi8KICNkZWZpbmUgUENJRV9DT01QQVRJQkxFICAgICAiaWJtLHdzcC1wY2lleCIKIAorZXh0ZXJuIHZvaWQgd3NwX3NldHVwX2FyY2godm9pZCk7CitleHRlcm4gdm9pZCB3c3Bfc2V0dXBfaXJxKHZvaWQpOworZXh0ZXJuIGludCB3c3BfcHJvYmVfZGV2aWNlcyh2b2lkKTsKK2V4dGVybiB2b2lkIHdzcF9oYWx0KHZvaWQpOworCiBleHRlcm4gdm9pZCB3c3Bfc2V0dXBfcGNpKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2NvbV9pbml0X3dzcCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgYTJfc2V0dXBfc21wKHZvaWQpOwogZXh0ZXJuIGludCBhMl9zY29tX3N0YXJ0dXBfY3B1KHVuc2lnbmVkIGludCBsY3B1LCBpbnQgdGhyX2lkeCwKIAkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKLWludCBzbXBfYTJfY3B1X2Jvb3RhYmxlKHVuc2lnbmVkIGludCBucik7Ci1pbnQgX19kZXZpbml0IHNtcF9hMl9raWNrX2NwdShpbnQgbnIpOworZXh0ZXJuIGludCBzbXBfYTJfY3B1X2Jvb3RhYmxlKHVuc2lnbmVkIGludCBucik7CitleHRlcm4gaW50IF9fZGV2aW5pdCBzbXBfYTJfa2lja19jcHUoaW50IG5yKTsKIAotdm9pZCBvcGJfcGljX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCBvcGJfcGljX2luaXQodm9pZCk7CisKKy8qIGNocm9tYSBzcGVjaWZpYyBtYW5hZ21lbnQgKi8KK2V4dGVybiB2b2lkIHdzcF9oOF9yZXN0YXJ0KGNoYXIgKmNtZCk7CitleHRlcm4gdm9pZCB3c3BfaDhfcG93ZXJfb2ZmKHZvaWQpOworZXh0ZXJuIHZvaWQgX19pbml0IHdzcF9zZXR1cF9oOCh2b2lkKTsKIAogI2VuZGlmIC8qICBfX1dTUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcmVsb2NzX2NoZWNrLnBsIGIvYXJjaC9wb3dlcnBjL3JlbG9jc19jaGVjay5wbAppbmRleCBkMjU3MTA5Li43ZjViODM4IDEwMDc1NQotLS0gYS9hcmNoL3Bvd2VycGMvcmVsb2NzX2NoZWNrLnBsCisrKyBiL2FyY2gvcG93ZXJwYy9yZWxvY3NfY2hlY2sucGwKQEAgLTMyLDggKzMyLDE4IEBACiAJbmV4dCBpZiAoIS9ccytSXy8pOwogCiAJIyBUaGVzZSByZWxvY2F0aW9ucyBhcmUgb2theQotCW5leHQgaWYgKC9SX1BQQzY0X1JFTEFUSVZFLyBvciAvUl9QUEM2NF9OT05FLyBvcgotCSAgICAgICAgIC9SX1BQQzY0X0FERFI2NFxzK21hY2hfLyk7CisJIyBPbiBQUEM2NDoKKwkjIAlSX1BQQzY0X1JFTEFUSVZFLCBSX1BQQzY0X05PTkUsIFJfUFBDNjRfQUREUjY0CisJIyBPbiBQUEM6CisJIyAJUl9QUENfUkVMQVRJVkUsIFJfUFBDX0FERFIxNl9ISSwgCisJIyAJUl9QUENfQUREUjE2X0hBLFJfUFBDX0FERFIxNl9MTywKKwkjIAlSX1BQQ19OT05FCisKKwluZXh0IGlmICgvXGJSX1BQQzY0X1JFTEFUSVZFXGIvIG9yIC9cYlJfUFBDNjRfTk9ORVxiLyBvcgorCSAgICAgICAgIC9cYlJfUFBDNjRfQUREUjY0XHMrbWFjaF8vKTsKKwluZXh0IGlmICgvXGJSX1BQQ19BRERSMTZfTE9cYi8gb3IgL1xiUl9QUENfQUREUjE2X0hJXGIvIG9yCisJCSAvXGJSX1BQQ19BRERSMTZfSEFcYi8gb3IgL1xiUl9QUENfUkVMQVRJVkVcYi8gb3IKKwkJIC9cYlJfUFBDX05PTkVcYi8pOwogCiAJIyBJZiB3ZSBzZWUgdGhpcyB0eXBlIG9mIHJlbGNvYXRpb24gaXQncyBhbiBpZGljYXRpb24gdGhhdAogCSMgd2UgL21heS8gYmUgdXNpbmcgYW4gb2xkIHZlcnNpb24gb2YgYmludXRpbHMuCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9NYWtlZmlsZQppbmRleCA4NGUxMzI1Li41ZTM3YjQ3IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L01ha2VmaWxlCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvTWFrZWZpbGUKQEAgLTE3LDEwICsxNywxMSBAQAogb2JqLSQoQ09ORklHX0ZTTF9QQ0kpCQkrPSBmc2xfcGNpLm8gJChmc2wtbXNpLW9iai15KQogb2JqLSQoQ09ORklHX0ZTTF9QTUMpCQkrPSBmc2xfcG1jLm8KIG9iai0kKENPTkZJR19GU0xfTEJDKQkJKz0gZnNsX2xiYy5vCitvYmotJChDT05GSUdfRlNMX0lGQykJCSs9IGZzbF9pZmMubwogb2JqLSQoQ09ORklHX0ZTTF9HVE0pCQkrPSBmc2xfZ3RtLm8KIG9iai0kKENPTkZJR19GU0xfODVYWF9DQUNIRV9TUkFNKQkrPSBmc2xfODV4eF9sMmN0bHIubyBmc2xfODV4eF9jYWNoZV9zcmFtLm8KIG9iai0kKENPTkZJR19TSU1QTEVfR1BJTykJKz0gc2ltcGxlX2dwaW8ubwotb2JqLSQoQ09ORklHX0ZTTF9SSU8pCQkrPSBmc2xfcmlvLm8KK29iai0kKENPTkZJR19GU0xfUklPKQkJKz0gZnNsX3Jpby5vIGZzbF9ybXUubwogb2JqLSQoQ09ORklHX1RTSTEwOF9CUklER0UpCSs9IHRzaTEwOF9wY2kubyB0c2kxMDhfZGV2Lm8KIG9iai0kKENPTkZJR19RVUlDQ19FTkdJTkUpCSs9IHFlX2xpYi8KIG9iai0kKENPTkZJR19QUENfQkVTVENPTU0pCSs9IGJlc3Rjb21tLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfaWZjLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9pZmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFmMTlmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfaWZjLmMKQEAgLTAsMCArMSwzMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jCisgKgorICogRnJlZXNjYWxlIEludGVncmF0ZWQgRmxhc2ggQ29udHJvbGxlcgorICoKKyAqIEF1dGhvcjogRGlwZW4gRHVkaGF0IDxEaXBlbi5EdWRoYXRAZnJlZXNjYWxlLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vZnNsX2lmYy5oPgorCitzdHJ1Y3QgZnNsX2lmY19jdHJsICpmc2xfaWZjX2N0cmxfZGV2OworRVhQT1JUX1NZTUJPTChmc2xfaWZjX2N0cmxfZGV2KTsKKworLyoKKyAqIGNvbnZlcnRfaWZjX2FkZHJlc3MgLSBjb252ZXJ0IHRoZSBiYXNlIGFkZHJlc3MKKyAqIEBhZGRyX2Jhc2U6CWJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJhbmsKKyAqLwordW5zaWduZWQgaW50IGNvbnZlcnRfaWZjX2FkZHJlc3MocGh5c19hZGRyX3QgYWRkcl9iYXNlKQoreworCXJldHVybiBhZGRyX2Jhc2UgJiBDU1BSX0JBOworfQorRVhQT1JUX1NZTUJPTChjb252ZXJ0X2lmY19hZGRyZXNzKTsKKworLyoKKyAqIGZzbF9pZmNfZmluZCAtIGZpbmQgSUZDIGJhbmsKKyAqIEBhZGRyX2Jhc2U6CWJhc2UgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJhbmsKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdhbGtzIElGQyBiYW5rcyBjb21wYXJpbmcgIkJhc2UgYWRkcmVzcyIgZmllbGQgb2YgdGhlIENTUFIKKyAqIHJlZ2lzdGVycyB3aXRoIHRoZSBzdXBwbGllZCBhZGRyX2Jhc2UgYXJndW1lbnQuIFdoZW4gYmFzZXMgbWF0Y2ggdGhpcworICogZnVuY3Rpb24gcmV0dXJucyBiYW5rIG51bWJlciAoc3RhcnRpbmcgd2l0aCAwKSwgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAqIGFwcHJvcHJpYXRlIGVycm5vIHZhbHVlLgorICovCitpbnQgZnNsX2lmY19maW5kKHBoeXNfYWRkcl90IGFkZHJfYmFzZSkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoIWZzbF9pZmNfY3RybF9kZXYgfHwgIWZzbF9pZmNfY3RybF9kZXYtPnJlZ3MpCisJCXJldHVybiAtRU5PREVWOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZnNsX2lmY19jdHJsX2Rldi0+cmVncy0+Y3Nwcl9jcyk7IGkrKykgeworCQlfX2JlMzIgY3NwciA9IGluX2JlMzIoJmZzbF9pZmNfY3RybF9kZXYtPnJlZ3MtPmNzcHJfY3NbaV0uY3Nwcik7CisJCWlmIChjc3ByICYgQ1NQUl9WICYmIChjc3ByICYgQ1NQUl9CQSkgPT0KKwkJCQljb252ZXJ0X2lmY19hZGRyZXNzKGFkZHJfYmFzZSkpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gLUVOT0VOVDsKK30KK0VYUE9SVF9TWU1CT0woZnNsX2lmY19maW5kKTsKKworc3RhdGljIGludCBfX2RldmluaXQgZnNsX2lmY19jdHJsX2luaXQoc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCkKK3sKKwlzdHJ1Y3QgZnNsX2lmY19yZWdzIF9faW9tZW0gKmlmYyA9IGN0cmwtPnJlZ3M7CisKKwkvKgorCSAqIENsZWFyIGFsbCB0aGUgY29tbW9uIHN0YXR1cyBhbmQgZXZlbnQgcmVnaXN0ZXJzCisJICovCisJaWYgKGluX2JlMzIoJmlmYy0+Y21fZXZ0ZXJfc3RhdCkgJiBJRkNfQ01fRVZURVJfU1RBVF9DU0VSKQorCQlvdXRfYmUzMigmaWZjLT5jbV9ldnRlcl9zdGF0LCBJRkNfQ01fRVZURVJfU1RBVF9DU0VSKTsKKworCS8qIGVuYWJsZSBhbGwgZXJyb3IgYW5kIGV2ZW50cyAqLworCW91dF9iZTMyKCZpZmMtPmNtX2V2dGVyX2VuLCBJRkNfQ01fRVZURVJfRU5fQ1NFUkVOKTsKKworCS8qIGVuYWJsZSBhbGwgZXJyb3IgYW5kIGV2ZW50IGludGVycnVwdHMgKi8KKwlvdXRfYmUzMigmaWZjLT5jbV9ldnRlcl9pbnRyX2VuLCBJRkNfQ01fRVZURVJfSU5UUl9FTl9DU0VSSVJFTik7CisJb3V0X2JlMzIoJmlmYy0+Y21fZXJhdHRyMCwgMHgwKTsKKwlvdXRfYmUzMigmaWZjLT5jbV9lcmF0dHIxLCAweDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnNsX2lmY19jdHJsX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCA9IGRldl9nZXRfZHJ2ZGF0YSgmZGV2LT5kZXYpOworCisJZnJlZV9pcnEoY3RybC0+bmFuZF9pcnEsIGN0cmwpOworCWZyZWVfaXJxKGN0cmwtPmlycSwgY3RybCk7CisKKwlpcnFfZGlzcG9zZV9tYXBwaW5nKGN0cmwtPm5hbmRfaXJxKTsKKwlpcnFfZGlzcG9zZV9tYXBwaW5nKGN0cmwtPmlycSk7CisKKwlpb3VubWFwKGN0cmwtPnJlZ3MpOworCisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgTlVMTCk7CisJa2ZyZWUoY3RybCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE5BTkQgZXZlbnRzIGFyZSBzcGxpdCBiZXR3ZWVuIGFuIG9wZXJhdGlvbmFsIGludGVycnVwdCB3aGljaCBvbmx5CisgKiByZWNlaXZlcyBPUEMsIGFuZCBhbiBlcnJvciBpbnRlcnJ1cHQgdGhhdCByZWNlaXZlcyBldmVyeXRoaW5nIGVsc2UsCisgKiBpbmNsdWRpbmcgbm9uLU5BTkQgZXJyb3JzLiAgV2hpY2hldmVyIGludGVycnVwdCBnZXRzIHRvIGl0IGZpcnN0CisgKiByZWNvcmRzIHRoZSBzdGF0dXMgYW5kIHdha2VzIHRoZSB3YWl0IHF1ZXVlLgorICovCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5hbmRfaXJxX2xvY2spOworCitzdGF0aWMgdTMyIGNoZWNrX25hbmRfc3RhdChzdHJ1Y3QgZnNsX2lmY19jdHJsICpjdHJsKQoreworCXN0cnVjdCBmc2xfaWZjX3JlZ3MgX19pb21lbSAqaWZjID0gY3RybC0+cmVnczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBzdGF0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5hbmRfaXJxX2xvY2ssIGZsYWdzKTsKKworCXN0YXQgPSBpbl9iZTMyKCZpZmMtPmlmY19uYW5kLm5hbmRfZXZ0ZXJfc3RhdCk7CisJaWYgKHN0YXQpIHsKKwkJb3V0X2JlMzIoJmlmYy0+aWZjX25hbmQubmFuZF9ldnRlcl9zdGF0LCBzdGF0KTsKKwkJY3RybC0+bmFuZF9zdGF0ID0gc3RhdDsKKwkJd2FrZV91cCgmY3RybC0+bmFuZF93YWl0KTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZuYW5kX2lycV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gc3RhdDsKK30KKworc3RhdGljIGlycXJldHVybl90IGZzbF9pZmNfbmFuZF9pcnEoaW50IGlycW5vLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBmc2xfaWZjX2N0cmwgKmN0cmwgPSBkYXRhOworCisJaWYgKGNoZWNrX25hbmRfc3RhdChjdHJsKSkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJcmV0dXJuIElSUV9OT05FOworfQorCisvKgorICogTk9URTogVGhpcyBpbnRlcnJ1cHQgaXMgdXNlZCB0byByZXBvcnQgaWZjIGV2ZW50cyBvZiB2YXJpb3VzIGtpbmRzLAorICogc3VjaCBhcyB0cmFuc2FjdGlvbiBlcnJvcnMgb24gdGhlIGNoaXBzZWxlY3RzLgorICovCitzdGF0aWMgaXJxcmV0dXJuX3QgZnNsX2lmY19jdHJsX2lycShpbnQgaXJxbm8sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGZzbF9pZmNfY3RybCAqY3RybCA9IGRhdGE7CisJc3RydWN0IGZzbF9pZmNfcmVncyBfX2lvbWVtICppZmMgPSBjdHJsLT5yZWdzOworCXUzMiBlcnJfYXhpaWQsIGVycl9zcmNpZCwgc3RhdHVzLCBjc19lcnIsIGVycl9hZGRyOworCWlycXJldHVybl90IHJldCA9IElSUV9OT05FOworCisJLyogcmVhZCBmb3IgY2hpcCBzZWxlY3QgZXJyb3IgKi8KKwljc19lcnIgPSBpbl9iZTMyKCZpZmMtPmNtX2V2dGVyX3N0YXQpOworCWlmIChjc19lcnIpIHsKKwkJZGV2X2VycihjdHJsLT5kZXYsICJ0cmFuc2FjdGlvbiBzZW50IHRvIElGQyBpcyBub3QgbWFwcGVkIHRvIgorCQkJCSJhbnkgbWVtb3J5IGJhbmsgMHglMDhYXG4iLCBjc19lcnIpOworCQkvKiBjbGVhciB0aGUgY2hpcCBzZWxlY3QgZXJyb3IgKi8KKwkJb3V0X2JlMzIoJmlmYy0+Y21fZXZ0ZXJfc3RhdCwgSUZDX0NNX0VWVEVSX1NUQVRfQ1NFUik7CisKKwkJLyogcmVhZCBlcnJvciBhdHRyaWJ1dGUgcmVnaXN0ZXJzIHByaW50IHRoZSBlcnJvciBpbmZvcm1hdGlvbiAqLworCQlzdGF0dXMgPSBpbl9iZTMyKCZpZmMtPmNtX2VyYXR0cjApOworCQllcnJfYWRkciA9IGluX2JlMzIoJmlmYy0+Y21fZXJhdHRyMSk7CisKKwkJaWYgKHN0YXR1cyAmIElGQ19DTV9FUkFUVFIwX0VSVFlQX1JFQUQpCisJCQlkZXZfZXJyKGN0cmwtPmRldiwgIlJlYWQgdHJhbnNhY3Rpb24gZXJyb3IiCisJCQkJIkNNX0VSQVRUUjAgMHglMDhYXG4iLCBzdGF0dXMpOworCQllbHNlCisJCQlkZXZfZXJyKGN0cmwtPmRldiwgIldyaXRlIHRyYW5zYWN0aW9uIGVycm9yIgorCQkJCSJDTV9FUkFUVFIwIDB4JTA4WFxuIiwgc3RhdHVzKTsKKworCQllcnJfYXhpaWQgPSAoc3RhdHVzICYgSUZDX0NNX0VSQVRUUjBfRVJBSUQpID4+CisJCQkJCUlGQ19DTV9FUkFUVFIwX0VSQUlEX1NISUZUOworCQlkZXZfZXJyKGN0cmwtPmRldiwgIkFYSSBJRCBvZiB0aGUgZXJyb3IiCisJCQkJCSJ0cmFuc2FjdGlvbiAweCUwOFhcbiIsIGVycl9heGlpZCk7CisKKwkJZXJyX3NyY2lkID0gKHN0YXR1cyAmIElGQ19DTV9FUkFUVFIwX0VTUkNJRCkgPj4KKwkJCQkJSUZDX0NNX0VSQVRUUjBfRVNSQ0lEX1NISUZUOworCQlkZXZfZXJyKGN0cmwtPmRldiwgIlNSQyBJRCBvZiB0aGUgZXJyb3IiCisJCQkJCSJ0cmFuc2FjdGlvbiAweCUwOFhcbiIsIGVycl9zcmNpZCk7CisKKwkJZGV2X2VycihjdHJsLT5kZXYsICJUcmFuc2FjdGlvbiBBZGRyZXNzIGNvcnJlc3BvbmRpbmcgdG8gZXJyb3IiCisJCQkJCSJFUkFERFIgMHglMDhYXG4iLCBlcnJfYWRkcik7CisKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisJfQorCisJaWYgKGNoZWNrX25hbmRfc3RhdChjdHJsKSkKKwkJcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogZnNsX2lmY19jdHJsX3Byb2JlCisgKgorICogY2FsbGVkIGJ5IGRldmljZSBsYXllciB3aGVuIGl0IGZpbmRzIGEgZGV2aWNlIG1hdGNoaW5nCisgKiBvbmUgb3VyIGRyaXZlciBjYW4gaGFuZGxlZC4gVGhpcyBjb2RlIGFsbG9jYXRlcyBhbGwgb2YKKyAqIHRoZSByZXNvdXJjZXMgbmVlZGVkIGZvciB0aGUgY29udHJvbGxlciBvbmx5LiAgVGhlCisgKiByZXNvdXJjZXMgZm9yIHRoZSBOQU5EIGJhbmtzIHRoZW1zZWx2ZXMgYXJlIGFsbG9jYXRlZAorICogaW4gdGhlIGNoaXAgcHJvYmUgZnVuY3Rpb24uCisqLworc3RhdGljIGludCBfX2RldmluaXQgZnNsX2lmY19jdHJsX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3sKKwlpbnQgcmV0ID0gMDsKKworCisJZGV2X2luZm8oJmRldi0+ZGV2LCAiRnJlZXNjYWxlIEludGVncmF0ZWQgRmxhc2ggQ29udHJvbGxlclxuIik7CisKKwlmc2xfaWZjX2N0cmxfZGV2ID0ga3phbGxvYyhzaXplb2YoKmZzbF9pZmNfY3RybF9kZXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZzbF9pZmNfY3RybF9kZXYpCisJCXJldHVybiAtRU5PTUVNOworCisJZGV2X3NldF9kcnZkYXRhKCZkZXYtPmRldiwgZnNsX2lmY19jdHJsX2Rldik7CisKKwkvKiBJT01BUCB0aGUgZW50aXJlIElGQyByZWdpb24gKi8KKwlmc2xfaWZjX2N0cmxfZGV2LT5yZWdzID0gb2ZfaW9tYXAoZGV2LT5kZXYub2Zfbm9kZSwgMCk7CisJaWYgKCFmc2xfaWZjX2N0cmxfZGV2LT5yZWdzKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJLyogZ2V0IHRoZSBDb250cm9sbGVyIGxldmVsIGlycSAqLworCWZzbF9pZmNfY3RybF9kZXYtPmlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRldi0+ZGV2Lm9mX25vZGUsIDApOworCWlmIChmc2xfaWZjX2N0cmxfZGV2LT5pcnEgPT0gTk9fSVJRKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIGdldCBpcnEgcmVzb3VyY2UgIgorCQkJCQkJCSJmb3IgSUZDXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJLyogZ2V0IHRoZSBuYW5kIG1hY2hpbmUgaXJxICovCisJZnNsX2lmY19jdHJsX2Rldi0+bmFuZF9pcnEgPQorCQkJaXJxX29mX3BhcnNlX2FuZF9tYXAoZGV2LT5kZXYub2Zfbm9kZSwgMSk7CisJaWYgKGZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxID09IE5PX0lSUSkgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgImZhaWxlZCB0byBnZXQgaXJxIHJlc291cmNlICIKKwkJCQkJCSJmb3IgTkFORCBNYWNoaW5lXG4iKTsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnI7CisJfQorCisJZnNsX2lmY19jdHJsX2Rldi0+ZGV2ID0gJmRldi0+ZGV2OworCisJcmV0ID0gZnNsX2lmY19jdHJsX2luaXQoZnNsX2lmY19jdHJsX2Rldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZnNsX2lmY19jdHJsX2Rldi0+bmFuZF93YWl0KTsKKworCXJldCA9IHJlcXVlc3RfaXJxKGZzbF9pZmNfY3RybF9kZXYtPmlycSwgZnNsX2lmY19jdHJsX2lycSwgSVJRRl9TSEFSRUQsCisJCQkgICJmc2wtaWZjIiwgZnNsX2lmY19jdHJsX2Rldik7CisJaWYgKHJldCAhPSAwKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiZmFpbGVkIHRvIGluc3RhbGwgaXJxICglZClcbiIsCisJCQlmc2xfaWZjX2N0cmxfZGV2LT5pcnEpOworCQlnb3RvIGVycl9pcnE7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEoZnNsX2lmY19jdHJsX2Rldi0+bmFuZF9pcnEsIGZzbF9pZmNfbmFuZF9pcnEsIDAsCisJCQkgICJmc2wtaWZjLW5hbmQiLCBmc2xfaWZjX2N0cmxfZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJmYWlsZWQgdG8gaW5zdGFsbCBpcnEgKCVkKVxuIiwKKwkJCWZzbF9pZmNfY3RybF9kZXYtPm5hbmRfaXJxKTsKKwkJZ290byBlcnJfbmFuZGlycTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX25hbmRpcnE6CisJZnJlZV9pcnEoZnNsX2lmY19jdHJsX2Rldi0+bmFuZF9pcnEsIGZzbF9pZmNfY3RybF9kZXYpOworCWlycV9kaXNwb3NlX21hcHBpbmcoZnNsX2lmY19jdHJsX2Rldi0+bmFuZF9pcnEpOworZXJyX2lycToKKwlmcmVlX2lycShmc2xfaWZjX2N0cmxfZGV2LT5pcnEsIGZzbF9pZmNfY3RybF9kZXYpOworCWlycV9kaXNwb3NlX21hcHBpbmcoZnNsX2lmY19jdHJsX2Rldi0+aXJxKTsKK2VycjoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBmc2xfaWZjX21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJmc2wsaWZjIiwKKwl9LAorCXt9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgZnNsX2lmY19jdHJsX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJmc2wtaWZjIiwKKwkJLm9mX21hdGNoX3RhYmxlID0gZnNsX2lmY19tYXRjaCwKKwl9LAorCS5wcm9iZSAgICAgICA9IGZzbF9pZmNfY3RybF9wcm9iZSwKKwkucmVtb3ZlICAgICAgPSBmc2xfaWZjX2N0cmxfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihmc2xfaWZjX2N0cmxfZHJpdmVyKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FVVEhPUigiRnJlZXNjYWxlIFNlbWljb25kdWN0b3IiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIEludGVncmF0ZWQgRmxhc2ggQ29udHJvbGxlciBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX2xiYy5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMKaW5kZXggZDVjM2M5MC4uNDgzMTI2ZCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbGJjLmMKQEAgLTMzMiw2ICszMzIsMzggQEAKIAlyZXR1cm4gcmV0OwogfQogCisjaWZkZWYgQ09ORklHX1NVU1BFTkQKKworLyogc2F2ZSBsYmMgcmVnaXN0ZXJzICovCitzdGF0aWMgaW50IGZzbF9sYmNfc3VzcGVuZChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJc3RydWN0IGZzbF9sYmNfY3RybCAqY3RybCA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgZnNsX2xiY19yZWdzIF9faW9tZW0gKmxiYyA9IGN0cmwtPnJlZ3M7CisKKwljdHJsLT5zYXZlZF9yZWdzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZzbF9sYmNfcmVncyksIEdGUF9LRVJORUwpOworCWlmICghY3RybC0+c2F2ZWRfcmVncykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlfbWVtY3B5X2Zyb21pbyhjdHJsLT5zYXZlZF9yZWdzLCBsYmMsIHNpemVvZihzdHJ1Y3QgZnNsX2xiY19yZWdzKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlc3RvcmUgbGJjIHJlZ2lzdGVycyAqLworc3RhdGljIGludCBmc2xfbGJjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBmc2xfbGJjX2N0cmwgKmN0cmwgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CisJc3RydWN0IGZzbF9sYmNfcmVncyBfX2lvbWVtICpsYmMgPSBjdHJsLT5yZWdzOworCisJaWYgKGN0cmwtPnNhdmVkX3JlZ3MpIHsKKwkJX21lbWNweV90b2lvKGxiYywgY3RybC0+c2F2ZWRfcmVncywKKwkJCQlzaXplb2Yoc3RydWN0IGZzbF9sYmNfcmVncykpOworCQlrZnJlZShjdHJsLT5zYXZlZF9yZWdzKTsKKwkJY3RybC0+c2F2ZWRfcmVncyA9IE5VTEw7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19TVVNQRU5EICovCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzbF9sYmNfbWF0Y2hbXSA9IHsKIAl7IC5jb21wYXRpYmxlID0gImZzbCxlbGJjIiwgfSwKIAl7IC5jb21wYXRpYmxlID0gImZzbCxwcTMtbG9jYWxidXMiLCB9LApAQCAtMzQ2LDYgKzM3OCwxMCBAQAogCQkub2ZfbWF0Y2hfdGFibGUgPSBmc2xfbGJjX21hdGNoLAogCX0sCiAJLnByb2JlID0gZnNsX2xiY19jdHJsX3Byb2JlLAorI2lmZGVmIENPTkZJR19TVVNQRU5ECisJLnN1c3BlbmQgICAgID0gZnNsX2xiY19zdXNwZW5kLAorCS5yZXN1bWUgICAgICA9IGZzbF9sYmNfcmVzdW1lLAorI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBmc2xfbGJjX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmMKaW5kZXggZTVjMzQ0ZC4uZWNiNWMxOSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmMKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3BwYy1wY2kuaD4KICNpbmNsdWRlIDxhc20vbXBpYy5oPgorI2luY2x1ZGUgPGFzbS9mc2xfaGNhbGxzLmg+CisKICNpbmNsdWRlICJmc2xfbXNpLmgiCiAjaW5jbHVkZSAiZnNsX3BjaS5oIgogCkBAIC0xNDgsMTQgKzE1MCw0OSBAQAogCiBzdGF0aWMgaW50IGZzbF9zZXR1cF9tc2lfaXJxcyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IG52ZWMsIGludCB0eXBlKQogeworCXN0cnVjdCBwY2lfY29udHJvbGxlciAqaG9zZSA9IHBjaV9idXNfdG9faG9zdChwZGV2LT5idXMpOworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7CisJcGhhbmRsZSBwaGFuZGxlID0gMDsKIAlpbnQgcmMsIGh3aXJxID0gLUVOT01FTTsKIAl1bnNpZ25lZCBpbnQgdmlycTsKIAlzdHJ1Y3QgbXNpX2Rlc2MgKmVudHJ5OwogCXN0cnVjdCBtc2lfbXNnIG1zZzsKIAlzdHJ1Y3QgZnNsX21zaSAqbXNpX2RhdGE7CiAKKwkvKgorCSAqIElmIHRoZSBQQ0kgbm9kZSBoYXMgYW4gZnNsLG1zaSBwcm9wZXJ0eSwgdGhlbiB3ZSBuZWVkIHRvIHVzZSBpdAorCSAqIHRvIGZpbmQgdGhlIHNwZWNpZmljIE1TSS4KKwkgKi8KKwlucCA9IG9mX3BhcnNlX3BoYW5kbGUoaG9zZS0+ZG4sICJmc2wsbXNpIiwgMCk7CisJaWYgKG5wKSB7CisJCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxtcGljLW1zaSIpIHx8CisJCSAgICBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCx2bXBpYy1tc2kiKSkKKwkJCXBoYW5kbGUgPSBucC0+cGhhbmRsZTsKKwkJZWxzZSB7CisJCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkJIm5vZGUgJXMgaGFzIGFuIGludmFsaWQgZnNsLG1zaSBwaGFuZGxlICV1XG4iLAorCQkJCWhvc2UtPmRuLT5mdWxsX25hbWUsIG5wLT5waGFuZGxlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJnBkZXYtPm1zaV9saXN0LCBsaXN0KSB7CisJCS8qCisJCSAqIExvb3Agb3ZlciBhbGwgdGhlIE1TSSBkZXZpY2VzIHVudGlsIHdlIGZpbmQgb25lIHRoYXQgaGFzIGFuCisJCSAqIGF2YWlsYWJsZSBpbnRlcnJ1cHQuCisJCSAqLwogCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG1zaV9kYXRhLCAmbXNpX2hlYWQsIGxpc3QpIHsKKwkJCS8qCisJCQkgKiBJZiB0aGUgUENJIG5vZGUgaGFzIGFuIGZzbCxtc2kgcHJvcGVydHksIHRoZW4gd2UKKwkJCSAqIHJlc3RyaWN0IG91ciBzZWFyY2ggdG8gdGhlIGNvcnJlc3BvbmRpbmcgTVNJIG5vZGUuCisJCQkgKiBUaGUgc2ltcGxlc3Qgd2F5IGlzIHRvIHNraXAgb3ZlciBNU0kgbm9kZXMgd2l0aCB0aGUKKwkJCSAqIHdyb25nIHBoYW5kbGUuIFVuZGVyIHRoZSBGcmVlc2NhbGUgaHlwZXJ2aXNvciwgdGhpcworCQkJICogaGFzIHRoZSBhZGRpdGlvbmFsIGJlbmVmaXQgb2Ygc2tpcHBpbmcgb3ZlciBNU0kKKwkJCSAqIG5vZGVzIHRoYXQgYXJlIG5vdCBtYXBwZWQgaW4gdGhlIFBBTVUuCisJCQkgKi8KKwkJCWlmIChwaGFuZGxlICYmIChwaGFuZGxlICE9IG1zaV9kYXRhLT5waGFuZGxlKSkKKwkJCQljb250aW51ZTsKKwogCQkJaHdpcnEgPSBtc2lfYml0bWFwX2FsbG9jX2h3aXJxcygmbXNpX2RhdGEtPmJpdG1hcCwgMSk7CiAJCQlpZiAoaHdpcnEgPj0gMCkKIAkJCQlicmVhazsKQEAgLTE2MywxNiArMjAwLDE0IEBACiAKIAkJaWYgKGh3aXJxIDwgMCkgewogCQkJcmMgPSBod2lycTsKLQkJCXByX2RlYnVnKCIlczogZmFpbCBhbGxvY2F0aW5nIG1zaSBpbnRlcnJ1cHRcbiIsCi0JCQkJCV9fZnVuY19fKTsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwgImNvdWxkIG5vdCBhbGxvY2F0ZSBNU0kgaW50ZXJydXB0XG4iKTsKIAkJCWdvdG8gb3V0X2ZyZWU7CiAJCX0KIAogCQl2aXJxID0gaXJxX2NyZWF0ZV9tYXBwaW5nKG1zaV9kYXRhLT5pcnFob3N0LCBod2lycSk7CiAKIAkJaWYgKHZpcnEgPT0gTk9fSVJRKSB7Ci0JCQlwcl9kZWJ1ZygiJXM6IGZhaWwgbWFwcGluZyBod2lycSAweCV4XG4iLAotCQkJCQlfX2Z1bmNfXywgaHdpcnEpOworCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiZmFpbCBtYXBwaW5nIGh3aXJxICVpXG4iLCBod2lycSk7CiAJCQltc2lfYml0bWFwX2ZyZWVfaHdpcnFzKCZtc2lfZGF0YS0+Yml0bWFwLCBod2lycSwgMSk7CiAJCQlyYyA9IC1FTk9TUEM7CiAJCQlnb3RvIG91dF9mcmVlOwpAQCAtMjAxLDYgKzIzNiw3IEBACiAJdTMyIGludHJfaW5kZXg7CiAJdTMyIGhhdmVfc2hpZnQgPSAwOwogCXN0cnVjdCBmc2xfbXNpX2Nhc2NhZGVfZGF0YSAqY2FzY2FkZV9kYXRhOworCXVuc2lnbmVkIGludCByZXQ7CiAKIAljYXNjYWRlX2RhdGEgPSBpcnFfZ2V0X2hhbmRsZXJfZGF0YShpcnEpOwogCW1zaV9kYXRhID0gY2FzY2FkZV9kYXRhLT5tc2lfZGF0YTsKQEAgLTIzMiw2ICsyNjgsMTQgQEAKIAljYXNlIEZTTF9QSUNfSVBfSVBJQzoKIAkJbXNpcl92YWx1ZSA9IGZzbF9tc2lfcmVhZChtc2lfZGF0YS0+bXNpX3JlZ3MsIG1zaXJfaW5kZXggKiAweDQpOwogCQlicmVhazsKKwljYXNlIEZTTF9QSUNfSVBfVk1QSUM6CisJCXJldCA9IGZoX3ZtcGljX2dldF9tc2lyKHZpcnFfdG9faHcoaXJxKSwgJm1zaXJfdmFsdWUpOworCQlpZiAocmV0KSB7CisJCQlwcl9lcnIoImZzbC1tc2k6IGZoX3ZtcGljX2dldF9tc2lyKCkgZmFpbGVkIGZvciAiCisJCQkgICAgICAgImlycSAldSAocmV0PSV1KVxuIiwgaXJxLCByZXQpOworCQkJbXNpcl92YWx1ZSA9IDA7CisJCX0KKwkJYnJlYWs7CiAJfQogCiAJd2hpbGUgKG1zaXJfdmFsdWUpIHsKQEAgLTI0OSw2ICsyOTMsNyBAQAogCiAJc3dpdGNoIChtc2lfZGF0YS0+ZmVhdHVyZSAmIEZTTF9QSUNfSVBfTUFTSykgewogCWNhc2UgRlNMX1BJQ19JUF9NUElDOgorCWNhc2UgRlNMX1BJQ19JUF9WTVBJQzoKIAkJY2hpcC0+aXJxX2VvaShpZGF0YSk7CiAJCWJyZWFrOwogCWNhc2UgRlNMX1BJQ19JUF9JUElDOgpAQCAtMjc4LDcgKzMyMyw4IEBACiAJfQogCWlmIChtc2ktPmJpdG1hcC5iaXRtYXApCiAJCW1zaV9iaXRtYXBfZnJlZSgmbXNpLT5iaXRtYXApOwotCWlvdW5tYXAobXNpLT5tc2lfcmVncyk7CisJaWYgKChtc2ktPmZlYXR1cmUgJiBGU0xfUElDX0lQX01BU0spICE9IEZTTF9QSUNfSVBfVk1QSUMpCisJCWlvdW5tYXAobXNpLT5tc2lfcmVncyk7CiAJa2ZyZWUobXNpKTsKIAogCXJldHVybiAwOwpAQCAtMzUwLDI1ICszOTYsMzcgQEAKIAkJZ290byBlcnJvcl9vdXQ7CiAJfQogCi0JLyogR2V0IHRoZSBNU0kgcmVnIGJhc2UgKi8KLQllcnIgPSBvZl9hZGRyZXNzX3RvX3Jlc291cmNlKGRldi0+ZGV2Lm9mX25vZGUsIDAsICZyZXMpOwotCWlmIChlcnIpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICIlcyByZXNvdXJjZSBlcnJvciFcbiIsCisJLyoKKwkgKiBVbmRlciB0aGUgRnJlZXNjYWxlIGh5cGVydmlzb3IsIHRoZSBtc2kgbm9kZXMgZG9uJ3QgaGF2ZSBhICdyZWcnCisJICogcHJvcGVydHkuICBJbnN0ZWFkLCB3ZSB1c2UgaHlwZXJjYWxscyB0byBhY2Nlc3MgdGhlIE1TSS4KKwkgKi8KKwlpZiAoKGZlYXR1cmVzLT5mc2xfcGljX2lwICYgRlNMX1BJQ19JUF9NQVNLKSAhPSBGU0xfUElDX0lQX1ZNUElDKSB7CisJCWVyciA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LT5kZXYub2Zfbm9kZSwgMCwgJnJlcyk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiaW52YWxpZCByZXNvdXJjZSBmb3Igbm9kZSAlc1xuIiwKIAkJCQlkZXYtPmRldi5vZl9ub2RlLT5mdWxsX25hbWUpOwotCQlnb3RvIGVycm9yX291dDsKLQl9CisJCQlnb3RvIGVycm9yX291dDsKKwkJfQogCi0JbXNpLT5tc2lfcmVncyA9IGlvcmVtYXAocmVzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZXMpKTsKLQlpZiAoIW1zaS0+bXNpX3JlZ3MpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJpb3JlbWFwIHByb2JsZW0gZmFpbGVkXG4iKTsKLQkJZ290byBlcnJvcl9vdXQ7CisJCW1zaS0+bXNpX3JlZ3MgPSBpb3JlbWFwKHJlcy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcmVzKSk7CisJCWlmICghbXNpLT5tc2lfcmVncykgeworCQkJZGV2X2VycigmZGV2LT5kZXYsICJjb3VsZCBub3QgbWFwIG5vZGUgJXNcbiIsCisJCQkJZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJCWdvdG8gZXJyb3Jfb3V0OworCQl9CisJCW1zaS0+bXNpaXJfb2Zmc2V0ID0KKwkJCWZlYXR1cmVzLT5tc2lpcl9vZmZzZXQgKyAocmVzLnN0YXJ0ICYgMHhmZmZmZik7CiAJfQogCiAJbXNpLT5mZWF0dXJlID0gZmVhdHVyZXMtPmZzbF9waWNfaXA7CiAKIAltc2ktPmlycWhvc3QtPmhvc3RfZGF0YSA9IG1zaTsKIAotCW1zaS0+bXNpaXJfb2Zmc2V0ID0gZmVhdHVyZXMtPm1zaWlyX29mZnNldCArIChyZXMuc3RhcnQgJiAweGZmZmZmKTsKKwkvKgorCSAqIFJlbWVtYmVyIHRoZSBwaGFuZGxlLCBzbyB0aGF0IHdlIGNhbiBtYXRjaCB3aXRoIGFueSBQQ0kgbm9kZXMKKwkgKiB0aGF0IGhhdmUgYW4gImZzbCxtc2kiIHByb3BlcnR5LgorCSAqLworCW1zaS0+cGhhbmRsZSA9IGRldi0+ZGV2Lm9mX25vZGUtPnBoYW5kbGU7CiAKIAlyYyA9IGZzbF9tc2lfaW5pdF9hbGxvY2F0b3IobXNpKTsKIAlpZiAocmMpIHsKQEAgLTQzNyw2ICs0OTUsMTEgQEAKIAkubXNpaXJfb2Zmc2V0ID0gMHgzOCwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZnNsX21zaV9mZWF0dXJlIHZtcGljX21zaV9mZWF0dXJlID0geworCS5mc2xfcGljX2lwID0gRlNMX1BJQ19JUF9WTVBJQywKKwkubXNpaXJfb2Zmc2V0ID0gMCwKK307CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzbF9vZl9tc2lfaWRzW10gPSB7CiAJewogCQkuY29tcGF0aWJsZSA9ICJmc2wsbXBpYy1tc2kiLApAQCAtNDQ2LDYgKzUwOSwxMCBAQAogCQkuY29tcGF0aWJsZSA9ICJmc2wsaXBpYy1tc2kiLAogCQkuZGF0YSA9ICh2b2lkICopJmlwaWNfbXNpX2ZlYXR1cmUsCiAJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gImZzbCx2bXBpYy1tc2kiLAorCQkuZGF0YSA9ICh2b2lkICopJnZtcGljX21zaV9mZWF0dXJlLAorCX0sCiAJe30KIH07CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX21zaS5oIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmgKaW5kZXggMTMxM2FiYi4uZjZjNjQ2YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmgKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfbXNpLmgKQEAgLTEzLDE1ICsxMywxNyBAQAogI2lmbmRlZiBfUE9XRVJQQ19TWVNERVZfRlNMX01TSV9ICiAjZGVmaW5lIF9QT1dFUlBDX1NZU0RFVl9GU0xfTVNJX0gKIAorI2luY2x1ZGUgPGxpbnV4L29mLmg+CiAjaW5jbHVkZSA8YXNtL21zaV9iaXRtYXAuaD4KIAogI2RlZmluZSBOUl9NU0lfUkVHCQk4CiAjZGVmaW5lIElSUVNfUEVSX01TSV9SRUcJMzIKICNkZWZpbmUgTlJfTVNJX0lSUVMJKE5SX01TSV9SRUcgKiBJUlFTX1BFUl9NU0lfUkVHKQogCi0jZGVmaW5lIEZTTF9QSUNfSVBfTUFTSwkweDAwMDAwMDBGCi0jZGVmaW5lIEZTTF9QSUNfSVBfTVBJQwkweDAwMDAwMDAxCi0jZGVmaW5lIEZTTF9QSUNfSVBfSVBJQwkweDAwMDAwMDAyCisjZGVmaW5lIEZTTF9QSUNfSVBfTUFTSyAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgRlNMX1BJQ19JUF9NUElDICAgMHgwMDAwMDAwMQorI2RlZmluZSBGU0xfUElDX0lQX0lQSUMgICAweDAwMDAwMDAyCisjZGVmaW5lIEZTTF9QSUNfSVBfVk1QSUMgIDB4MDAwMDAwMDMKIAogc3RydWN0IGZzbF9tc2kgewogCXN0cnVjdCBpcnFfaG9zdCAqaXJxaG9zdDsKQEAgLTM2LDYgKzM4LDggQEAKIAlzdHJ1Y3QgbXNpX2JpdG1hcCBiaXRtYXA7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7ICAgICAgICAgIC8qIHN1cHBvcnQgbXVsdGlwbGUgTVNJIGJhbmtzICovCisKKwlwaGFuZGxlIHBoYW5kbGU7CiB9OwogCiAjZW5kaWYgLyogX1BPV0VSUENfU1lTREVWX0ZTTF9NU0lfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcGNpLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYwppbmRleCA0Y2U1NDdlLi4zYjYxZThjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9wY2kuYwpAQCAtNjUsNiArNjUsMzAgQEAKIH0KIAogI2lmIGRlZmluZWQoQ09ORklHX0ZTTF9TT0NfQk9PS0UpIHx8IGRlZmluZWQoQ09ORklHX1BQQ184Nnh4KQorCisjZGVmaW5lIE1BWF9QSFlTX0FERFJfQklUUwk0MAorc3RhdGljIHU2NCBwY2k2NF9kbWFfb2Zmc2V0ID0gMXVsbCA8PCBNQVhfUEhZU19BRERSX0JJVFM7CisKK3N0YXRpYyBpbnQgZnNsX3BjaV9kbWFfc2V0X21hc2soc3RydWN0IGRldmljZSAqZGV2LCB1NjQgZG1hX21hc2spCit7CisJaWYgKCFkZXYtPmRtYV9tYXNrIHx8ICFkbWFfc3VwcG9ydGVkKGRldiwgZG1hX21hc2spKQorCQlyZXR1cm4gLUVJTzsKKworCS8qCisJICogRml4dXAgUENJIGRldmljZXMgdGhhdCBhcmUgYWJsZSB0byBETUEgdG8gYWJvdmUgdGhlIHBoeXNpY2FsCisJICogYWRkcmVzcyB3aWR0aCBvZiB0aGUgU29DIHN1Y2ggdGhhdCB3ZSBjYW4gYWRkcmVzcyBhbnkgaW50ZXJuYWwKKwkgKiBTb0MgYWRkcmVzcyBmcm9tIGFjcm9zcyBQQ0kgaWYgbmVlZGVkCisJICovCisJaWYgKChkZXYtPmJ1cyA9PSAmcGNpX2J1c190eXBlKSAmJgorCSAgICBkbWFfbWFzayA+PSBETUFfQklUX01BU0soTUFYX1BIWVNfQUREUl9CSVRTKSkgeworCQlzZXRfZG1hX29wcyhkZXYsICZkbWFfZGlyZWN0X29wcyk7CisJCXNldF9kbWFfb2Zmc2V0KGRldiwgcGNpNjRfZG1hX29mZnNldCk7CisJfQorCisJKmRldi0+ZG1hX21hc2sgPSBkbWFfbWFzazsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2luaXQgc2V0dXBfb25lX2F0bXUoc3RydWN0IGNjc3JfcGNpIF9faW9tZW0gKnBjaSwKIAl1bnNpZ25lZCBpbnQgaW5kZXgsIGNvbnN0IHN0cnVjdCByZXNvdXJjZSAqcmVzLAogCXJlc291cmNlX3NpemVfdCBvZmZzZXQpCkBAIC0xMTMsNiArMTM3LDggQEAKIAl1MzIgcGl3YXIgPSBQSVdBUl9FTiB8IFBJV0FSX1BGIHwgUElXQVJfVEdJX0xPQ0FMIHwKIAkJCVBJV0FSX1JFQURfU05PT1AgfCBQSVdBUl9XUklURV9TTk9PUDsKIAljaGFyICpuYW1lID0gaG9zZS0+ZG4tPmZ1bGxfbmFtZTsKKwljb25zdCB1NjQgKnJlZzsKKwlpbnQgbGVuOwogCiAJcHJfZGVidWcoIlBDSSBtZW1vcnkgbWFwIHN0YXJ0IDB4JTAxNmxseCwgc2l6ZSAweCUwMTZsbHhcbiIsCiAJCSAodTY0KXJzcmMtPnN0YXJ0LCAodTY0KXJlc291cmNlX3NpemUocnNyYykpOwpAQCAtMjA1LDYgKzIzMSwzMyBAQAogCiAJLyogU2V0dXAgaW5ib3VuZCBtZW0gd2luZG93ICovCiAJbWVtID0gbWVtYmxvY2tfZW5kX29mX0RSQU0oKTsKKworCS8qCisJICogVGhlIG1zaS1hZGRyZXNzLTY0IHByb3BlcnR5LCBpZiBpdCBleGlzdHMsIGluZGljYXRlcyB0aGUgcGh5c2ljYWwKKwkgKiBhZGRyZXNzIG9mIHRoZSBNU0lJUiByZWdpc3Rlci4gIE5vcm1hbGx5LCB0aGlzIHJlZ2lzdGVyIGlzIGxvY2F0ZWQKKwkgKiBpbnNpZGUgQ0NTUiwgc28gdGhlIEFUTVUgdGhhdCBjb3ZlcnMgYWxsIG9mIENDU1IgaXMgdXNlZC4gQnV0IGlmCisJICogdGhpcyBwcm9wZXJ0eSBleGlzdHMsIHRoZW4gd2Ugbm9ybWFsbHkgbmVlZCB0byBjcmVhdGUgYSBuZXcgQVRNVQorCSAqIGZvciBpdC4gIEZvciBub3csIGhvd2V2ZXIsIHdlIGNoZWF0LiAgVGhlIG9ubHkgZW50aXR5IHRoYXQgY3JlYXRlcworCSAqIHRoaXMgcHJvcGVydHkgaXMgdGhlIEZyZWVzY2FsZSBoeXBlcnZpc29yLCBhbmQgdGhlIGFkZHJlc3MgaXMKKwkgKiBzcGVjaWZpZWQgaW4gdGhlIHBhcnRpdGlvbiBjb25maWd1cmF0aW9uLiAgVHlwaWNhbGx5LCB0aGUgYWRkcmVzcworCSAqIGlzIGxvY2F0ZWQgaW4gdGhlIHBhZ2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGVuZCBvZiBERFIuICBJZiBzbywgd2UKKwkgKiBjYW4gYXZvaWQgYWxsb2NhdGluZyBhIG5ldyBBVE1VIGJ5IGV4dGVuZGluZyB0aGUgRERSIEFUTVUgYnkgb25lCisJICogcGFnZS4KKwkgKi8KKwlyZWcgPSBvZl9nZXRfcHJvcGVydHkoaG9zZS0+ZG4sICJtc2ktYWRkcmVzcy02NCIsICZsZW4pOworCWlmIChyZWcgJiYgKGxlbiA9PSBzaXplb2YodTY0KSkpIHsKKwkJdTY0IGFkZHJlc3MgPSBiZTY0X3RvX2NwdXAocmVnKTsKKworCQlpZiAoKGFkZHJlc3MgPj0gbWVtKSAmJiAoYWRkcmVzcyA8IChtZW0gKyBQQUdFX1NJWkUpKSkgeworCQkJcHJfaW5mbygiJXM6IGV4dGVuZGluZyBERFIgQVRNVSB0byBjb3ZlciBNU0lJUiIsIG5hbWUpOworCQkJbWVtICs9IFBBR0VfU0laRTsKKwkJfSBlbHNlIHsKKwkJCS8qIFRPRE86IENyZWF0ZSBhIG5ldyBBVE1VIGZvciBNU0lJUiAqLworCQkJcHJfd2FybigiJXM6IG1zaS1hZGRyZXNzLTY0IGFkZHJlc3Mgb2YgJWxseCBpcyAiCisJCQkJInVuc3VwcG9ydGVkXG4iLCBuYW1lLCBhZGRyZXNzKTsKKwkJfQorCX0KKwogCXN6ID0gbWluKG1lbSwgcGFkZHJfbG8pOwogCW1lbV9sb2cgPSBfX2lsb2cyX3U2NChzeik7CiAKQEAgLTIyOCw2ICsyODEsMzcgQEAKIAogCQlob3NlLT5kbWFfd2luZG93X2Jhc2VfY3VyID0gMHgwMDAwMDAwMDsKIAkJaG9zZS0+ZG1hX3dpbmRvd19zaXplID0gKHJlc291cmNlX3NpemVfdClzejsKKworCQkvKgorCQkgKiBpZiB3ZSBoYXZlID40RyBvZiBtZW1vcnkgc2V0dXAgc2Vjb25kIFBDSSBpbmJvdW5kIHdpbmRvdyB0bworCQkgKiBsZXQgZGV2aWNlcyB0aGF0IGFyZSA2NC1iaXQgYWRkcmVzcyBjYXBhYmxlIHRvIHdvcmsgdy9vCisJCSAqIFNXSU9UTEIgYW5kIGFjY2VzcyB0aGUgZnVsbCByYW5nZSBvZiBtZW1vcnkKKwkJICovCisJCWlmIChzeiAhPSBtZW0pIHsKKwkJCW1lbV9sb2cgPSBfX2lsb2cyX3U2NChtZW0pOworCisJCQkvKiBTaXplIHdpbmRvdyB1cCBpZiB3ZSBkb250IGZpdCBpbiBleGFjdCBwb3dlci1vZi0yICovCisJCQlpZiAoKDF1bGwgPDwgbWVtX2xvZykgIT0gbWVtKQorCQkJCW1lbV9sb2crKzsKKworCQkJcGl3YXIgPSAocGl3YXIgJiB+UElXQVJfU1pfTUFTSykgfCAobWVtX2xvZyAtIDEpOworCisJCQkvKiBTZXR1cCBpbmJvdW5kIG1lbW9yeSB3aW5kb3cgKi8KKwkJCW91dF9iZTMyKCZwY2ktPnBpd1t3aW5faWR4XS5waXRhciwgIDB4MDAwMDAwMDApOworCQkJb3V0X2JlMzIoJnBjaS0+cGl3W3dpbl9pZHhdLnBpd2JlYXIsCisJCQkJCXBjaTY0X2RtYV9vZmZzZXQgPj4gNDQpOworCQkJb3V0X2JlMzIoJnBjaS0+cGl3W3dpbl9pZHhdLnBpd2JhciwKKwkJCQkJcGNpNjRfZG1hX29mZnNldCA+PiAxMik7CisJCQlvdXRfYmUzMigmcGNpLT5waXdbd2luX2lkeF0ucGl3YXIsICBwaXdhcik7CisKKwkJCS8qCisJCQkgKiBpbnN0YWxsIG91ciBvd24gZG1hX3NldF9tYXNrIGhhbmRsZXIgdG8gZml4dXAgZG1hX29wcworCQkJICogYW5kIGRtYV9vZmZzZXQKKwkJCSAqLworCQkJcHBjX21kLmRtYV9zZXRfbWFzayA9IGZzbF9wY2lfZG1hX3NldF9tYXNrOworCisJCQlwcl9pbmZvKCIlczogU2V0dXAgNjQtYml0IFBDSSBETUEgd2luZG93XG4iLCBuYW1lKTsKKwkJfQogCX0gZWxzZSB7CiAJCXU2NCBwYWRkciA9IDA7CiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKaW5kZXggMjJmZmNjZC4uYTRjNGY0YSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcmlvLmMKQEAgLTEwLDcgKzEwLDcgQEAKICAqIC0gQWRkZWQgUG9ydC1Xcml0ZSBtZXNzYWdlIGhhbmRsaW5nCiAgKiAtIEFkZGVkIE1hY2hpbmUgQ2hlY2sgZXhjZXB0aW9uIGhhbmRsaW5nCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDEwIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMTAsIDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KICAqIFpoYW5nIFdlaSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20+CiAgKgogICogQ29weXJpZ2h0IDIwMDUgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgpAQCAtMjgsMjQwICsyOCwzMyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmlvLmg+Ci0jaW5jbHVkZSA8bGludXgvcmlvX2Rydi5oPgogI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgva2ZpZm8uaD4KIAotI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgImZzbF9yaW8uaCIKIAogI3VuZGVmIERFQlVHX1BXCS8qIFBvcnQtV3JpdGUgZGVidWdnaW5nICovCiAKLS8qIFJhcGlkSU8gZGVmaW5pdGlvbiBpcnEsIHdoaWNoIHJlYWQgZnJvbSBPRi10cmVlICovCi0jZGVmaW5lIElSUV9SSU9fQkVMTChtKQkJKCgoc3RydWN0IHJpb19wcml2ICopKG0tPnByaXYpKS0+YmVsbGlycSkKLSNkZWZpbmUgSVJRX1JJT19UWChtKQkJKCgoc3RydWN0IHJpb19wcml2ICopKG0tPnByaXYpKS0+dHhpcnEpCi0jZGVmaW5lIElSUV9SSU9fUlgobSkJCSgoKHN0cnVjdCByaW9fcHJpdiAqKShtLT5wcml2KSktPnJ4aXJxKQotI2RlZmluZSBJUlFfUklPX1BXKG0pCQkoKChzdHJ1Y3QgcmlvX3ByaXYgKikobS0+cHJpdikpLT5wd2lycSkKLQotI2RlZmluZSBJUFdTUl9DTEVBUgkJMHg5OAotI2RlZmluZSBPTVNSX0NMRUFSCQkweDFjYjMKLSNkZWZpbmUgSU1TUl9DTEVBUgkJMHg0OTEKLSNkZWZpbmUgSURTUl9DTEVBUgkJMHg5MQotI2RlZmluZSBPRFNSX0NMRUFSCQkweDFjMDAKLSNkZWZpbmUgTFRMRUVDU1JfRU5BQkxFX0FMTAkweEZGQzAwMEZDCi0jZGVmaW5lIEVTQ1NSX0NMRUFSCQkweDA3MTIwMjA0Ci0jZGVmaW5lIElFQ1NSX0NMRUFSCQkweDgwMDAwMDAwCi0KICNkZWZpbmUgUklPX1BPUlQxX0VEQ1NSCQkweDA2NDAKICNkZWZpbmUgUklPX1BPUlQyX0VEQ1NSCQkweDA2ODAKICNkZWZpbmUgUklPX1BPUlQxX0lFQ1NSCQkweDEwMTMwCiAjZGVmaW5lIFJJT19QT1JUMl9JRUNTUgkJMHgxMDFCMAotI2RlZmluZSBSSU9fSU0wU1IJCTB4MTMwNjQKLSNkZWZpbmUgUklPX0lNMVNSCQkweDEzMTY0Ci0jZGVmaW5lIFJJT19PTTBTUgkJMHgxMzAwNAotI2RlZmluZSBSSU9fT00xU1IJCTB4MTMxMDQKIAotI2RlZmluZSBSSU9fQVRNVV9SRUdTX09GRlNFVAkweDEwYzAwCi0jZGVmaW5lIFJJT19QX01TR19SRUdTX09GRlNFVAkweDExMDAwCi0jZGVmaW5lIFJJT19TX01TR19SRUdTX09GRlNFVAkweDEzMDAwCiAjZGVmaW5lIFJJT19HQ0NTUgkJMHgxM2MKICNkZWZpbmUgUklPX0VTQ1NSCQkweDE1OAorI2RlZmluZSBFU0NTUl9DTEVBUgkJMHgwNzEyMDIwNAogI2RlZmluZSBSSU9fUE9SVDJfRVNDU1IJCTB4MTc4CiAjZGVmaW5lIFJJT19DQ1NSCQkweDE1YwotI2RlZmluZSBSSU9fTFRMRURDU1IJCTB4MDYwOAogI2RlZmluZSBSSU9fTFRMRURDU1JfSUVSCTB4ODAwMDAwMDAKICNkZWZpbmUgUklPX0xUTEVEQ1NSX1BSVAkweDAxMDAwMDAwCi0jZGVmaW5lIFJJT19MVExFRUNTUgkJMHgwNjBjCi0jZGVmaW5lIFJJT19FUFdJU1IJCTB4MTAwMTAKKyNkZWZpbmUgSUVDU1JfQ0xFQVIJCTB4ODAwMDAwMDAKICNkZWZpbmUgUklPX0lTUl9BQUNSCQkweDEwMTIwCiAjZGVmaW5lIFJJT19JU1JfQUFDUl9BQQkJMHgxCS8qIEFjY2VwdCBBbGwgSUQgKi8KLSNkZWZpbmUgUklPX01BSU5UX1dJTl9TSVpFCTB4NDAwMDAwCi0jZGVmaW5lIFJJT19EQkVMTF9XSU5fU0laRQkweDEwMDAKLQotI2RlZmluZSBSSU9fTVNHX09NUl9NVUkJCTB4MDAwMDAwMDIKLSNkZWZpbmUgUklPX01TR19PU1JfVEUJCTB4MDAwMDAwODAKLSNkZWZpbmUgUklPX01TR19PU1JfUU9JCQkweDAwMDAwMDIwCi0jZGVmaW5lIFJJT19NU0dfT1NSX1FGSQkJMHgwMDAwMDAxMAotI2RlZmluZSBSSU9fTVNHX09TUl9NVUIJCTB4MDAwMDAwMDQKLSNkZWZpbmUgUklPX01TR19PU1JfRU9NSQkweDAwMDAwMDAyCi0jZGVmaW5lIFJJT19NU0dfT1NSX1FFSQkJMHgwMDAwMDAwMQotCi0jZGVmaW5lIFJJT19NU0dfSU1SX01JCQkweDAwMDAwMDAyCi0jZGVmaW5lIFJJT19NU0dfSVNSX1RFCQkweDAwMDAwMDgwCi0jZGVmaW5lIFJJT19NU0dfSVNSX1FGSQkJMHgwMDAwMDAxMAotI2RlZmluZSBSSU9fTVNHX0lTUl9ESVFJCTB4MDAwMDAwMDEKLQotI2RlZmluZSBSSU9fSVBXTVJfU0VOCQkweDAwMTAwMDAwCi0jZGVmaW5lIFJJT19JUFdNUl9RRklFCQkweDAwMDAwMTAwCi0jZGVmaW5lIFJJT19JUFdNUl9FSUUJCTB4MDAwMDAwMjAKLSNkZWZpbmUgUklPX0lQV01SX0NRCQkweDAwMDAwMDAyCi0jZGVmaW5lIFJJT19JUFdNUl9QV0UJCTB4MDAwMDAwMDEKLQotI2RlZmluZSBSSU9fSVBXU1JfUUYJCTB4MDAxMDAwMDAKLSNkZWZpbmUgUklPX0lQV1NSX1RFCQkweDAwMDAwMDgwCi0jZGVmaW5lIFJJT19JUFdTUl9RRkkJCTB4MDAwMDAwMTAKLSNkZWZpbmUgUklPX0lQV1NSX1BXRAkJMHgwMDAwMDAwOAotI2RlZmluZSBSSU9fSVBXU1JfUFdCCQkweDAwMDAwMDA0Ci0KLS8qIEVQV0lTUiBFcnJvciBtYXRjaCB2YWx1ZSAqLwotI2RlZmluZSBSSU9fRVBXSVNSX1BJTlQxCTB4ODAwMDAwMDAKLSNkZWZpbmUgUklPX0VQV0lTUl9QSU5UMgkweDQwMDAwMDAwCi0jZGVmaW5lIFJJT19FUFdJU1JfTVUJCTB4MDAwMDAwMDIKLSNkZWZpbmUgUklPX0VQV0lTUl9QVwkJMHgwMDAwMDAwMQotCi0jZGVmaW5lIFJJT19NU0dfREVTQ19TSVpFCTMyCi0jZGVmaW5lIFJJT19NU0dfQlVGRkVSX1NJWkUJNDA5NgotI2RlZmluZSBSSU9fTUlOX1RYX1JJTkdfU0laRQkyCi0jZGVmaW5lIFJJT19NQVhfVFhfUklOR19TSVpFCTIwNDgKLSNkZWZpbmUgUklPX01JTl9SWF9SSU5HX1NJWkUJMgotI2RlZmluZSBSSU9fTUFYX1JYX1JJTkdfU0laRQkyMDQ4Ci0KLSNkZWZpbmUgRE9PUkJFTExfRE1SX0RJCQkweDAwMDAwMDAyCi0jZGVmaW5lIERPT1JCRUxMX0RTUl9URQkJMHgwMDAwMDA4MAotI2RlZmluZSBET09SQkVMTF9EU1JfUUZJCTB4MDAwMDAwMTAKLSNkZWZpbmUgRE9PUkJFTExfRFNSX0RJUUkJMHgwMDAwMDAwMQotI2RlZmluZSBET09SQkVMTF9USURfT0ZGU0VUCTB4MDIKLSNkZWZpbmUgRE9PUkJFTExfU0lEX09GRlNFVAkweDA0Ci0jZGVmaW5lIERPT1JCRUxMX0lORk9fT0ZGU0VUCTB4MDYKLQotI2RlZmluZSBET09SQkVMTF9NRVNTQUdFX1NJWkUJMHgwOAotI2RlZmluZSBEQkVMTF9TSUQoeCkJCSgqKHUxNiAqKSh4ICsgRE9PUkJFTExfU0lEX09GRlNFVCkpCi0jZGVmaW5lIERCRUxMX1RJRCh4KQkJKCoodTE2ICopKHggKyBET09SQkVMTF9USURfT0ZGU0VUKSkKLSNkZWZpbmUgREJFTExfSU5GKHgpCQkoKih1MTYgKikoeCArIERPT1JCRUxMX0lORk9fT0ZGU0VUKSkKLQotc3RydWN0IHJpb19hdG11X3JlZ3MgewotCXUzMiByb3d0YXI7Ci0JdTMyIHJvd3RlYXI7Ci0JdTMyIHJvd2JhcjsKLQl1MzIgcGFkMjsKLQl1MzIgcm93YXI7Ci0JdTMyIHBhZDNbM107Ci19OwotCi1zdHJ1Y3QgcmlvX21zZ19yZWdzIHsKLQl1MzIgb21yOwkvKiAweERfMzAwMCAtIE91dGJvdW5kIG1lc3NhZ2UgMCBtb2RlIHJlZ2lzdGVyICovCi0JdTMyIG9zcjsJLyogMHhEXzMwMDQgLSBPdXRib3VuZCBtZXNzYWdlIDAgc3RhdHVzIHJlZ2lzdGVyICovCi0JdTMyIHBhZDE7Ci0JdTMyIG9kcWRwYXI7CS8qIDB4RF8zMDBDIC0gT3V0Ym91bmQgbWVzc2FnZSAwIGRlc2NyaXB0b3IgcXVldWUKLQkJCSAgIGRlcXVldWUgcG9pbnRlciBhZGRyZXNzIHJlZ2lzdGVyICovCi0JdTMyIHBhZDI7Ci0JdTMyIG9zYXI7CS8qIDB4RF8zMDE0IC0gT3V0Ym91bmQgbWVzc2FnZSAwIHNvdXJjZSBhZGRyZXNzCi0JCQkgICByZWdpc3RlciAqLwotCXUzMiBvZHByOwkvKiAweERfMzAxOCAtIE91dGJvdW5kIG1lc3NhZ2UgMCBkZXN0aW5hdGlvbiBwb3J0Ci0JCQkgICByZWdpc3RlciAqLwotCXUzMiBvZGF0cjsJLyogMHhEXzMwMUMgLSBPdXRib3VuZCBtZXNzYWdlIDAgZGVzdGluYXRpb24gYXR0cmlidXRlcwotCQkJICAgUmVnaXN0ZXIqLwotCXUzMiBvZGNyOwkvKiAweERfMzAyMCAtIE91dGJvdW5kIG1lc3NhZ2UgMCBkb3VibGUtd29yZCBjb3VudAotCQkJICAgcmVnaXN0ZXIgKi8KLQl1MzIgcGFkMzsKLQl1MzIgb2RxZXBhcjsJLyogMHhEXzMwMjggLSBPdXRib3VuZCBtZXNzYWdlIDAgZGVzY3JpcHRvciBxdWV1ZQotCQkJICAgZW5xdWV1ZSBwb2ludGVyIGFkZHJlc3MgcmVnaXN0ZXIgKi8KLQl1MzIgcGFkNFsxM107Ci0JdTMyIGltcjsJLyogMHhEXzMwNjAgLSBJbmJvdW5kIG1lc3NhZ2UgMCBtb2RlIHJlZ2lzdGVyICovCi0JdTMyIGlzcjsJLyogMHhEXzMwNjQgLSBJbmJvdW5kIG1lc3NhZ2UgMCBzdGF0dXMgcmVnaXN0ZXIgKi8KLQl1MzIgcGFkNTsKLQl1MzIgaWZxZHBhcjsJLyogMHhEXzMwNkMgLSBJbmJvdW5kIG1lc3NhZ2UgMCBmcmFtZSBxdWV1ZSBkZXF1ZXVlCi0JCQkgICBwb2ludGVyIGFkZHJlc3MgcmVnaXN0ZXIqLwotCXUzMiBwYWQ2OwotCXUzMiBpZnFlcGFyOwkvKiAweERfMzA3NCAtIEluYm91bmQgbWVzc2FnZSAwIGZyYW1lIHF1ZXVlIGVucXVldWUKLQkJCSAgIHBvaW50ZXIgYWRkcmVzcyByZWdpc3RlciAqLwotCXUzMiBwYWQ3WzIyNl07Ci0JdTMyIG9kbXI7CS8qIDB4RF8zNDAwIC0gT3V0Ym91bmQgZG9vcmJlbGwgbW9kZSByZWdpc3RlciAqLwotCXUzMiBvZHNyOwkvKiAweERfMzQwNCAtIE91dGJvdW5kIGRvb3JiZWxsIHN0YXR1cyByZWdpc3RlciAqLwotCXUzMiByZXMwWzRdOwotCXUzMiBvZGRwcjsJLyogMHhEXzM0MTggLSBPdXRib3VuZCBkb29yYmVsbCBkZXN0aW5hdGlvbiBwb3J0Ci0JCQkgICByZWdpc3RlciAqLwotCXUzMiBvZGRhdHI7CS8qIDB4RF8zNDFjIC0gT3V0Ym91bmQgZG9vcmJlbGwgZGVzdGluYXRpb24gYXR0cmlidXRlcwotCQkJICAgcmVnaXN0ZXIgKi8KLQl1MzIgcmVzMVszXTsKLQl1MzIgb2RyZXRjcjsJLyogMHhEXzM0MkMgLSBPdXRib3VuZCBkb29yYmVsbCByZXRyeSBlcnJvciB0aHJlc2hvbGQKLQkJCSAgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKi8KLQl1MzIgcmVzMlsxMl07Ci0JdTMyIGRtcjsJLyogMHhEXzM0NjAgLSBJbmJvdW5kIGRvb3JiZWxsIG1vZGUgcmVnaXN0ZXIgKi8KLQl1MzIgZHNyOwkvKiAweERfMzQ2NCAtIEluYm91bmQgZG9vcmJlbGwgc3RhdHVzIHJlZ2lzdGVyICovCi0JdTMyIHBhZDg7Ci0JdTMyIGRxZHBhcjsJLyogMHhEXzM0NkMgLSBJbmJvdW5kIGRvb3JiZWxsIHF1ZXVlIGRlcXVldWUgUG9pbnRlcgotCQkJICAgYWRkcmVzcyByZWdpc3RlciAqLwotCXUzMiBwYWQ5OwotCXUzMiBkcWVwYXI7CS8qIDB4RF8zNDc0IC0gSW5ib3VuZCBkb29yYmVsbCBRdWV1ZSBlbnF1ZXVlIHBvaW50ZXIKLQkJCSAgIGFkZHJlc3MgcmVnaXN0ZXIgKi8KLQl1MzIgcGFkMTBbMjZdOwotCXUzMiBwd21yOwkvKiAweERfMzRFMCAtIEluYm91bmQgcG9ydC13cml0ZSBtb2RlIHJlZ2lzdGVyICovCi0JdTMyIHB3c3I7CS8qIDB4RF8zNEU0IC0gSW5ib3VuZCBwb3J0LXdyaXRlIHN0YXR1cyByZWdpc3RlciAqLwotCXUzMiBlcHdxYmFyOwkvKiAweERfMzRFOCAtIEV4dGVuZGVkIFBvcnQtV3JpdGUgUXVldWUgQmFzZSBBZGRyZXNzCi0JCQkgICByZWdpc3RlciAqLwotCXUzMiBwd3FiYXI7CS8qIDB4RF8zNEVDIC0gSW5ib3VuZCBwb3J0LXdyaXRlIHF1ZXVlIGJhc2UgYWRkcmVzcwotCQkJICAgcmVnaXN0ZXIgKi8KLX07Ci0KLXN0cnVjdCByaW9fdHhfZGVzYyB7Ci0JdTMyIHJlczE7Ci0JdTMyIHNhZGRyOwotCXUzMiBkcG9ydDsKLQl1MzIgZGF0dHI7Ci0JdTMyIHJlczI7Ci0JdTMyIHJlczM7Ci0JdTMyIGR3Y250OwotCXUzMiByZXM0OwotfTsKLQotc3RydWN0IHJpb19kYmVsbF9yaW5nIHsKLQl2b2lkICp2aXJ0OwotCWRtYV9hZGRyX3QgcGh5czsKLX07Ci0KLXN0cnVjdCByaW9fbXNnX3R4X3JpbmcgewotCXZvaWQgKnZpcnQ7Ci0JZG1hX2FkZHJfdCBwaHlzOwotCXZvaWQgKnZpcnRfYnVmZmVyW1JJT19NQVhfVFhfUklOR19TSVpFXTsKLQlkbWFfYWRkcl90IHBoeXNfYnVmZmVyW1JJT19NQVhfVFhfUklOR19TSVpFXTsKLQlpbnQgdHhfc2xvdDsKLQlpbnQgc2l6ZTsKLQl2b2lkICpkZXZfaWQ7Ci19OwotCi1zdHJ1Y3QgcmlvX21zZ19yeF9yaW5nIHsKLQl2b2lkICp2aXJ0OwotCWRtYV9hZGRyX3QgcGh5czsKLQl2b2lkICp2aXJ0X2J1ZmZlcltSSU9fTUFYX1JYX1JJTkdfU0laRV07Ci0JaW50IHJ4X3Nsb3Q7Ci0JaW50IHNpemU7Ci0Jdm9pZCAqZGV2X2lkOwotfTsKLQotc3RydWN0IHJpb19wb3J0X3dyaXRlX21zZyB7Ci0Jdm9pZCAqdmlydDsKLQlkbWFfYWRkcl90IHBoeXM7Ci0JdTMyIG1zZ19jb3VudDsKLQl1MzIgZXJyX2NvdW50OwotCXUzMiBkaXNjYXJkX2NvdW50OwotfTsKLQotc3RydWN0IHJpb19wcml2IHsKLQlzdHJ1Y3QgZGV2aWNlICpkZXY7Ci0Jdm9pZCBfX2lvbWVtICpyZWdzX3dpbjsKLQlzdHJ1Y3QgcmlvX2F0bXVfcmVncyBfX2lvbWVtICphdG11X3JlZ3M7Ci0Jc3RydWN0IHJpb19hdG11X3JlZ3MgX19pb21lbSAqbWFpbnRfYXRtdV9yZWdzOwotCXN0cnVjdCByaW9fYXRtdV9yZWdzIF9faW9tZW0gKmRiZWxsX2F0bXVfcmVnczsKLQl2b2lkIF9faW9tZW0gKmRiZWxsX3dpbjsKLQl2b2lkIF9faW9tZW0gKm1haW50X3dpbjsKLQlzdHJ1Y3QgcmlvX21zZ19yZWdzIF9faW9tZW0gKm1zZ19yZWdzOwotCXN0cnVjdCByaW9fZGJlbGxfcmluZyBkYmVsbF9yaW5nOwotCXN0cnVjdCByaW9fbXNnX3R4X3JpbmcgbXNnX3R4X3Jpbmc7Ci0Jc3RydWN0IHJpb19tc2dfcnhfcmluZyBtc2dfcnhfcmluZzsKLQlzdHJ1Y3QgcmlvX3BvcnRfd3JpdGVfbXNnIHBvcnRfd3JpdGVfbXNnOwotCWludCBiZWxsaXJxOwotCWludCB0eGlycTsKLQlpbnQgcnhpcnE7Ci0JaW50IHB3aXJxOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBwd193b3JrOwotCXN0cnVjdCBrZmlmbyBwd19maWZvOwotCXNwaW5sb2NrX3QgcHdfZmlmb19sb2NrOwotfTsKIAogI2RlZmluZSBfX2ZzbF9yZWFkX3Jpb19jb25maWcoeCwgYWRkciwgZXJyLCBvcCkJCVwKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygJCQkJXApAQCAtMjc5LDcgKzcyLDEyIEBACiAJCTogIj1yIiAoZXJyKSwgIj1yIiAoeCkJCQlcCiAJCTogImIiIChhZGRyKSwgImkiICgtRUZBVUxUKSwgIjAiIChlcnIpKQogCi1zdGF0aWMgdm9pZCBfX2lvbWVtICpyaW9fcmVnc193aW47Cit2b2lkIF9faW9tZW0gKnJpb19yZWdzX3dpbjsKK3ZvaWQgX19pb21lbSAqcm11X3JlZ3Nfd2luOworcmVzb3VyY2Vfc2l6ZV90IHJpb19sYXdfc3RhcnQ7CisKK3N0cnVjdCBmc2xfcmlvX2RiZWxsICpkYmVsbDsKK3N0cnVjdCBmc2xfcmlvX3B3ICpwdzsKIAogI2lmZGVmIENPTkZJR19FNTAwCiBpbnQgZnNsX3Jpb19tY2hlY2tfZXhjZXB0aW9uKHN0cnVjdCBwdF9yZWdzICpyZWdzKQpAQCAtMzExLDQyICsxMDksNiBAQAogI2VuZGlmCiAKIC8qKgotICogZnNsX3Jpb19kb29yYmVsbF9zZW5kIC0gU2VuZCBhIE1QQzg1eHggZG9vcmJlbGwgbWVzc2FnZQotICogQG1wb3J0OiBSYXBpZElPIG1hc3RlciBwb3J0IGluZm8KLSAqIEBpbmRleDogSUQgb2YgUmFwaWRJTyBpbnRlcmZhY2UKLSAqIEBkZXN0aWQ6IERlc3RpbmF0aW9uIElEIG9mIHRhcmdldCBkZXZpY2UKLSAqIEBkYXRhOiAxNi1iaXQgaW5mbyBmaWVsZCBvZiBSYXBpZElPIGRvb3JiZWxsIG1lc3NhZ2UKLSAqCi0gKiBTZW5kcyBhIE1QQzg1eHggZG9vcmJlbGwgbWVzc2FnZS4gUmV0dXJucyAlMCBvbiBzdWNjZXNzIG9yCi0gKiAlLUVJTlZBTCBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50IGZzbF9yaW9fZG9vcmJlbGxfc2VuZChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwKLQkJCQlpbnQgaW5kZXgsIHUxNiBkZXN0aWQsIHUxNiBkYXRhKQotewotCXN0cnVjdCByaW9fcHJpdiAqcHJpdiA9IG1wb3J0LT5wcml2OwotCXByX2RlYnVnKCJmc2xfZG9vcmJlbGxfc2VuZDogaW5kZXggJWQgZGVzdGlkICU0LjR4IGRhdGEgJTQuNHhcbiIsCi0JCSBpbmRleCwgZGVzdGlkLCBkYXRhKTsKLQlzd2l0Y2ggKG1wb3J0LT5waHlfdHlwZSkgewotCWNhc2UgUklPX1BIWV9QQVJBTExFTDoKLQkJb3V0X2JlMzIoJnByaXYtPmRiZWxsX2F0bXVfcmVncy0+cm93dGFyLCBkZXN0aWQgPDwgMjIpOwotCQlvdXRfYmUxNihwcml2LT5kYmVsbF93aW4sIGRhdGEpOwotCQlicmVhazsKLQljYXNlIFJJT19QSFlfU0VSSUFMOgotCQkvKiBJbiB0aGUgc2VyaWFsIHZlcnNpb24gc2lsaWNvbnMsIHN1Y2ggYXMgTVBDODU0OCwgTVBDODY0MSwKLQkJICogYmVsb3cgb3BlcmF0aW9ucyBpcyBtdXN0IGJlLgotCQkgKi8KLQkJb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5vZG1yLCAweDAwMDAwMDAwKTsKLQkJb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5vZHJldGNyLCAweDAwMDAwMDA0KTsKLQkJb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5vZGRwciwgZGVzdGlkIDw8IDE2KTsKLQkJb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5vZGRhdHIsIGRhdGEpOwotCQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPm9kbXIsIDB4MDAwMDAwMDEpOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCiAgKiBmc2xfbG9jYWxfY29uZmlnX3JlYWQgLSBHZW5lcmF0ZSBhIE1QQzg1eHggbG9jYWwgY29uZmlnIHNwYWNlIHJlYWQKICAqIEBtcG9ydDogUmFwaWRJTyBtYXN0ZXIgcG9ydCBpbmZvCiAgKiBAaW5kZXg6IElEIG9mIFJhcGRpSU8gaW50ZXJmYWNlCkBAIC0zODQsOCArMTQ2LDggQEAKIHsKIAlzdHJ1Y3QgcmlvX3ByaXYgKnByaXYgPSBtcG9ydC0+cHJpdjsKIAlwcl9kZWJ1ZwotCSAgICAoImZzbF9sb2NhbF9jb25maWdfd3JpdGU6IGluZGV4ICVkIG9mZnNldCAlOC44eCBkYXRhICU4Ljh4XG4iLAotCSAgICAgaW5kZXgsIG9mZnNldCwgZGF0YSk7CisJCSgiZnNsX2xvY2FsX2NvbmZpZ193cml0ZTogaW5kZXggJWQgb2Zmc2V0ICU4Ljh4IGRhdGEgJTguOHhcbiIsCisJCWluZGV4LCBvZmZzZXQsIGRhdGEpOwogCW91dF9iZTMyKHByaXYtPnJlZ3Nfd2luICsgb2Zmc2V0LCBkYXRhKTsKIAogCXJldHVybiAwOwpAQCAtNDEzLDggKzE3NSw5IEBACiAJdTMyIHJ2YWwsIGVyciA9IDA7CiAKIAlwcl9kZWJ1ZwotCSAgICAoImZzbF9yaW9fY29uZmlnX3JlYWQ6IGluZGV4ICVkIGRlc3RpZCAlZCBob3Bjb3VudCAlZCBvZmZzZXQgJTguOHggbGVuICVkXG4iLAotCSAgICAgaW5kZXgsIGRlc3RpZCwgaG9wY291bnQsIG9mZnNldCwgbGVuKTsKKwkJKCJmc2xfcmlvX2NvbmZpZ19yZWFkOiIKKwkJIiBpbmRleCAlZCBkZXN0aWQgJWQgaG9wY291bnQgJWQgb2Zmc2V0ICU4Ljh4IGxlbiAlZFxuIiwKKwkJaW5kZXgsIGRlc3RpZCwgaG9wY291bnQsIG9mZnNldCwgbGVuKTsKIAogCS8qIDE2TUIgbWFpbnRlbmFuY2Ugd2luZG93IHBvc3NpYmxlICovCiAJLyogYWxsb3cgb25seSBhbGlnbmVkIGFjY2VzcyB0byBtYWludGVuYW5jZSByZWdpc3RlcnMgKi8KQEAgLTQyMyw3ICsxODYsNyBAQAogCiAJb3V0X2JlMzIoJnByaXYtPm1haW50X2F0bXVfcmVncy0+cm93dGFyLAogCQkgKGRlc3RpZCA8PCAyMikgfCAoaG9wY291bnQgPDwgMTIpIHwgKG9mZnNldCA+PiAxMikpOwotCW91dF9iZTMyKCZwcml2LT5tYWludF9hdG11X3JlZ3MtPnJvd3RlYXIsICAoZGVzdGlkID4+IDEwKSk7CisJb3V0X2JlMzIoJnByaXYtPm1haW50X2F0bXVfcmVncy0+cm93dGVhciwgKGRlc3RpZCA+PiAxMCkpOwogCiAJZGF0YSA9ICh1OCAqKSBwcml2LT5tYWludF93aW4gKyAob2Zmc2V0ICYgKFJJT19NQUlOVF9XSU5fU0laRSAtIDEpKTsKIAlzd2l0Y2ggKGxlbikgewpAQCAtNDcwLDggKzIzMyw5IEBACiAJc3RydWN0IHJpb19wcml2ICpwcml2ID0gbXBvcnQtPnByaXY7CiAJdTggKmRhdGE7CiAJcHJfZGVidWcKLQkgICAgKCJmc2xfcmlvX2NvbmZpZ193cml0ZTogaW5kZXggJWQgZGVzdGlkICVkIGhvcGNvdW50ICVkIG9mZnNldCAlOC44eCBsZW4gJWQgdmFsICU4Ljh4XG4iLAotCSAgICAgaW5kZXgsIGRlc3RpZCwgaG9wY291bnQsIG9mZnNldCwgbGVuLCB2YWwpOworCQkoImZzbF9yaW9fY29uZmlnX3dyaXRlOiIKKwkJIiBpbmRleCAlZCBkZXN0aWQgJWQgaG9wY291bnQgJWQgb2Zmc2V0ICU4Ljh4IGxlbiAlZCB2YWwgJTguOHhcbiIsCisJCWluZGV4LCBkZXN0aWQsIGhvcGNvdW50LCBvZmZzZXQsIGxlbiwgdmFsKTsKIAogCS8qIDE2TUIgbWFpbnRlbmFuY2Ugd2luZG93cyBwb3NzaWJsZSAqLwogCS8qIGFsbG93IG9ubHkgYWxpZ25lZCBhY2Nlc3MgdG8gbWFpbnRlbmFuY2UgcmVnaXN0ZXJzICovCkBAIC00ODAsNyArMjQ0LDcgQEAKIAogCW91dF9iZTMyKCZwcml2LT5tYWludF9hdG11X3JlZ3MtPnJvd3RhciwKIAkJIChkZXN0aWQgPDwgMjIpIHwgKGhvcGNvdW50IDw8IDEyKSB8IChvZmZzZXQgPj4gMTIpKTsKLQlvdXRfYmUzMigmcHJpdi0+bWFpbnRfYXRtdV9yZWdzLT5yb3d0ZWFyLCAgKGRlc3RpZCA+PiAxMCkpOworCW91dF9iZTMyKCZwcml2LT5tYWludF9hdG11X3JlZ3MtPnJvd3RlYXIsIChkZXN0aWQgPj4gMTApKTsKIAogCWRhdGEgPSAodTggKikgcHJpdi0+bWFpbnRfd2luICsgKG9mZnNldCAmIChSSU9fTUFJTlRfV0lOX1NJWkUgLSAxKSk7CiAJc3dpdGNoIChsZW4pIHsKQEAgLTUwMCw1OTAgKzI2NCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qKgotICogZnNsX2FkZF9vdXRiX21lc3NhZ2UgLSBBZGQgbWVzc2FnZSB0byB0aGUgTVBDODV4eCBvdXRib3VuZCBtZXNzYWdlIHF1ZXVlCi0gKiBAbXBvcnQ6IE1hc3RlciBwb3J0IHdpdGggb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZQotICogQHJkZXY6IFRhcmdldCBvZiBvdXRib3VuZCBtZXNzYWdlCi0gKiBAbWJveDogT3V0Ym91bmQgbWFpbGJveAotICogQGJ1ZmZlcjogTWVzc2FnZSB0byBhZGQgdG8gb3V0Ym91bmQgcXVldWUKLSAqIEBsZW46IExlbmd0aCBvZiBtZXNzYWdlCi0gKgotICogQWRkcyB0aGUgQGJ1ZmZlciBtZXNzYWdlIHRvIHRoZSBNUEM4NXh4IG91dGJvdW5kIG1lc3NhZ2UgcXVldWUuIFJldHVybnMKLSAqICUwIG9uIHN1Y2Nlc3Mgb3IgJS1FSU5WQUwgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludAotZnNsX2FkZF9vdXRiX21lc3NhZ2Uoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIHN0cnVjdCByaW9fZGV2ICpyZGV2LCBpbnQgbWJveCwKLQkJCXZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikKLXsKLQlzdHJ1Y3QgcmlvX3ByaXYgKnByaXYgPSBtcG9ydC0+cHJpdjsKLQl1MzIgb21yOwotCXN0cnVjdCByaW9fdHhfZGVzYyAqZGVzYyA9IChzdHJ1Y3QgcmlvX3R4X2Rlc2MgKilwcml2LT5tc2dfdHhfcmluZy52aXJ0Ci0JCQkJCSsgcHJpdi0+bXNnX3R4X3JpbmcudHhfc2xvdDsKLQlpbnQgcmV0ID0gMDsKLQotCXByX2RlYnVnKCJSSU86IGZzbF9hZGRfb3V0Yl9tZXNzYWdlKCk6IGRlc3RpZCAlNC40eCBtYm94ICVkIGJ1ZmZlciAiIFwKLQkJICIlOC44eCBsZW4gJTguOHhcbiIsIHJkZXYtPmRlc3RpZCwgbWJveCwgKGludClidWZmZXIsIGxlbik7Ci0KLQlpZiAoKGxlbiA8IDgpIHx8IChsZW4gPiBSSU9fTUFYX01TR19TSVpFKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBDb3B5IGFuZCBjbGVhciByZXN0IG9mIGJ1ZmZlciAqLwotCW1lbWNweShwcml2LT5tc2dfdHhfcmluZy52aXJ0X2J1ZmZlcltwcml2LT5tc2dfdHhfcmluZy50eF9zbG90XSwgYnVmZmVyLAotCQkJbGVuKTsKLQlpZiAobGVuIDwgKFJJT19NQVhfTVNHX1NJWkUgLSA0KSkKLQkJbWVtc2V0KHByaXYtPm1zZ190eF9yaW5nLnZpcnRfYnVmZmVyW3ByaXYtPm1zZ190eF9yaW5nLnR4X3Nsb3RdCi0JCQkJKyBsZW4sIDAsIFJJT19NQVhfTVNHX1NJWkUgLSBsZW4pOwotCi0Jc3dpdGNoIChtcG9ydC0+cGh5X3R5cGUpIHsKLQljYXNlIFJJT19QSFlfUEFSQUxMRUw6Ci0JCS8qIFNldCBtYm94IGZpZWxkIGZvciBtZXNzYWdlICovCi0JCWRlc2MtPmRwb3J0ID0gbWJveCAmIDB4MzsKLQotCQkvKiBFbmFibGUgRU9NSSBpbnRlcnJ1cHQsIHNldCBwcmlvcml0eSwgYW5kIHNldCBkZXN0aWQgKi8KLQkJZGVzYy0+ZGF0dHIgPSAweDI4MDAwMDAwIHwgKHJkZXYtPmRlc3RpZCA8PCAyKTsKLQkJYnJlYWs7Ci0JY2FzZSBSSU9fUEhZX1NFUklBTDoKLQkJLyogU2V0IG1ib3ggZmllbGQgZm9yIG1lc3NhZ2UsIGFuZCBzZXQgZGVzdGlkICovCi0JCWRlc2MtPmRwb3J0ID0gKHJkZXYtPmRlc3RpZCA8PCAxNikgfCAobWJveCAmIDB4Myk7Ci0KLQkJLyogRW5hYmxlIEVPTUkgaW50ZXJydXB0IGFuZCBwcmlvcml0eSAqLwotCQlkZXNjLT5kYXR0ciA9IDB4MjgwMDAwMDA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIFNldCB0cmFuc2ZlciBzaXplIGFsaWduZWQgdG8gbmV4dCBwb3dlciBvZiAyIChpbiBkb3VibGUgd29yZHMpICovCi0JZGVzYy0+ZHdjbnQgPSBpc19wb3dlcl9vZl8yKGxlbikgPyBsZW4gOiAxIDw8IGdldF9iaXRtYXNrX29yZGVyKGxlbik7Ci0KLQkvKiBTZXQgc25vb3BpbmcgYW5kIHNvdXJjZSBidWZmZXIgYWRkcmVzcyAqLwotCWRlc2MtPnNhZGRyID0gMHgwMDAwMDAwNAotCQl8IHByaXYtPm1zZ190eF9yaW5nLnBoeXNfYnVmZmVyW3ByaXYtPm1zZ190eF9yaW5nLnR4X3Nsb3RdOwotCi0JLyogSW5jcmVtZW50IGVucXVldWUgcG9pbnRlciAqLwotCW9tciA9IGluX2JlMzIoJnByaXYtPm1zZ19yZWdzLT5vbXIpOwotCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+b21yLCBvbXIgfCBSSU9fTVNHX09NUl9NVUkpOwotCi0JLyogR28gdG8gbmV4dCBkZXNjcmlwdG9yICovCi0JaWYgKCsrcHJpdi0+bXNnX3R4X3JpbmcudHhfc2xvdCA9PSBwcml2LT5tc2dfdHhfcmluZy5zaXplKQotCQlwcml2LT5tc2dfdHhfcmluZy50eF9zbG90ID0gMDsKLQotICAgICAgb3V0OgotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogZnNsX3Jpb190eF9oYW5kbGVyIC0gTVBDODV4eCBvdXRib3VuZCBtZXNzYWdlIGludGVycnVwdCBoYW5kbGVyCi0gKiBAaXJxOiBMaW51eCBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAZGV2X2luc3RhbmNlOiBQb2ludGVyIHRvIGludGVycnVwdC1zcGVjaWZpYyBkYXRhCi0gKgotICogSGFuZGxlcyBvdXRib3VuZCBtZXNzYWdlIGludGVycnVwdHMuIEV4ZWN1dGVzIGEgcmVnaXN0ZXIgb3V0Ym91bmQKLSAqIG1haWxib3ggZXZlbnQgaGFuZGxlciBhbmQgYWNrcyB0aGUgaW50ZXJydXB0IG9jY3VycmVuY2UuCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdAotZnNsX3Jpb190eF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKLXsKLQlpbnQgb3NyOwotCXN0cnVjdCByaW9fbXBvcnQgKnBvcnQgPSAoc3RydWN0IHJpb19tcG9ydCAqKWRldl9pbnN0YW5jZTsKLQlzdHJ1Y3QgcmlvX3ByaXYgKnByaXYgPSBwb3J0LT5wcml2OwotCi0Jb3NyID0gaW5fYmUzMigmcHJpdi0+bXNnX3JlZ3MtPm9zcik7Ci0KLQlpZiAob3NyICYgUklPX01TR19PU1JfVEUpIHsKLQkJcHJfaW5mbygiUklPOiBvdXRib3VuZCBtZXNzYWdlIHRyYW5zbWlzc2lvbiBlcnJvclxuIik7Ci0JCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+b3NyLCBSSU9fTVNHX09TUl9URSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChvc3IgJiBSSU9fTVNHX09TUl9RT0kpIHsKLQkJcHJfaW5mbygiUklPOiBvdXRib3VuZCBtZXNzYWdlIHF1ZXVlIG92ZXJmbG93XG4iKTsKLQkJb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5vc3IsIFJJT19NU0dfT1NSX1FPSSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChvc3IgJiBSSU9fTVNHX09TUl9FT01JKSB7Ci0JCXUzMiBkcXAgPSBpbl9iZTMyKCZwcml2LT5tc2dfcmVncy0+b2RxZHBhcik7Ci0JCWludCBzbG90ID0gKGRxcCAtIHByaXYtPm1zZ190eF9yaW5nLnBoeXMpID4+IDU7Ci0JCXBvcnQtPm91dGJfbXNnWzBdLm1jYmFjayhwb3J0LCBwcml2LT5tc2dfdHhfcmluZy5kZXZfaWQsIC0xLAotCQkJCXNsb3QpOwotCi0JCS8qIEFjayB0aGUgZW5kLW9mLW1lc3NhZ2UgaW50ZXJydXB0ICovCi0JCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+b3NyLCBSSU9fTVNHX09TUl9FT01JKTsKLQl9Ci0KLSAgICAgIG91dDoKLQlyZXR1cm4gSVJRX0hBTkRMRUQ7Ci19Ci0KLS8qKgotICogZnNsX29wZW5fb3V0Yl9tYm94IC0gSW5pdGlhbGl6ZSBNUEM4NXh4IG91dGJvdW5kIG1haWxib3gKLSAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBvdXRib3VuZCBtZXNzYWdlIHVuaXQKLSAqIEBkZXZfaWQ6IERldmljZSBzcGVjaWZpYyBwb2ludGVyIHRvIHBhc3Mgb24gZXZlbnQKLSAqIEBtYm94OiBNYWlsYm94IHRvIG9wZW4KLSAqIEBlbnRyaWVzOiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgb3V0Ym91bmQgbWFpbGJveCByaW5nCi0gKgotICogSW5pdGlhbGl6ZXMgYnVmZmVyIHJpbmcsIHJlcXVlc3QgdGhlIG91dGJvdW5kIG1lc3NhZ2UgaW50ZXJydXB0LAotICogYW5kIGVuYWJsZXMgdGhlIG91dGJvdW5kIG1lc3NhZ2UgdW5pdC4gUmV0dXJucyAlMCBvbiBzdWNjZXNzIGFuZAotICogJS1FSU5WQUwgb3IgJS1FTk9NRU0gb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludAotZnNsX29wZW5fb3V0Yl9tYm94KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCB2b2lkICpkZXZfaWQsIGludCBtYm94LCBpbnQgZW50cmllcykKLXsKLQlpbnQgaSwgaiwgcmMgPSAwOwotCXN0cnVjdCByaW9fcHJpdiAqcHJpdiA9IG1wb3J0LT5wcml2OwotCi0JaWYgKChlbnRyaWVzIDwgUklPX01JTl9UWF9SSU5HX1NJWkUpIHx8Ci0JICAgIChlbnRyaWVzID4gUklPX01BWF9UWF9SSU5HX1NJWkUpIHx8ICghaXNfcG93ZXJfb2ZfMihlbnRyaWVzKSkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIHNoYWRvdyBjb3B5IHJpbmcgKi8KLQlwcml2LT5tc2dfdHhfcmluZy5kZXZfaWQgPSBkZXZfaWQ7Ci0JcHJpdi0+bXNnX3R4X3Jpbmcuc2l6ZSA9IGVudHJpZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bXNnX3R4X3Jpbmcuc2l6ZTsgaSsrKSB7Ci0JCXByaXYtPm1zZ190eF9yaW5nLnZpcnRfYnVmZmVyW2ldID0KLQkJCWRtYV9hbGxvY19jb2hlcmVudChwcml2LT5kZXYsIFJJT19NU0dfQlVGRkVSX1NJWkUsCi0JCQkJJnByaXYtPm1zZ190eF9yaW5nLnBoeXNfYnVmZmVyW2ldLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwcml2LT5tc2dfdHhfcmluZy52aXJ0X2J1ZmZlcltpXSkgewotCQkJcmMgPSAtRU5PTUVNOwotCQkJZm9yIChqID0gMDsgaiA8IHByaXYtPm1zZ190eF9yaW5nLnNpemU7IGorKykKLQkJCQlpZiAocHJpdi0+bXNnX3R4X3JpbmcudmlydF9idWZmZXJbal0pCi0JCQkJCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmRldiwKLQkJCQkJCQlSSU9fTVNHX0JVRkZFUl9TSVpFLAotCQkJCQkJCXByaXYtPm1zZ190eF9yaW5nLgotCQkJCQkJCXZpcnRfYnVmZmVyW2pdLAotCQkJCQkJCXByaXYtPm1zZ190eF9yaW5nLgotCQkJCQkJCXBoeXNfYnVmZmVyW2pdKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBvdXRib3VuZCBtZXNzYWdlIGRlc2NyaXB0b3IgcmluZyAqLwotCXByaXYtPm1zZ190eF9yaW5nLnZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQocHJpdi0+ZGV2LAotCQkJCXByaXYtPm1zZ190eF9yaW5nLnNpemUgKiBSSU9fTVNHX0RFU0NfU0laRSwKLQkJCQkmcHJpdi0+bXNnX3R4X3JpbmcucGh5cywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT5tc2dfdHhfcmluZy52aXJ0KSB7Ci0JCXJjID0gLUVOT01FTTsKLQkJZ290byBvdXRfZG1hOwotCX0KLQltZW1zZXQocHJpdi0+bXNnX3R4X3JpbmcudmlydCwgMCwKLQkJCXByaXYtPm1zZ190eF9yaW5nLnNpemUgKiBSSU9fTVNHX0RFU0NfU0laRSk7Ci0JcHJpdi0+bXNnX3R4X3JpbmcudHhfc2xvdCA9IDA7Ci0KLQkvKiBQb2ludCBkZXF1ZXVlL2VucXVldWUgcG9pbnRlcnMgYXQgZmlyc3QgZW50cnkgaW4gcmluZyAqLwotCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+b2RxZHBhciwgcHJpdi0+bXNnX3R4X3JpbmcucGh5cyk7Ci0Jb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5vZHFlcGFyLCBwcml2LT5tc2dfdHhfcmluZy5waHlzKTsKLQotCS8qIENvbmZpZ3VyZSBmb3Igc25vb3BpbmcgKi8KLQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPm9zYXIsIDB4MDAwMDAwMDQpOwotCi0JLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+b3NyLCAweDAwMDAwMGIzKTsKLQotCS8qIEhvb2sgdXAgb3V0Ym91bmQgbWVzc2FnZSBoYW5kbGVyICovCi0JcmMgPSByZXF1ZXN0X2lycShJUlFfUklPX1RYKG1wb3J0KSwgZnNsX3Jpb190eF9oYW5kbGVyLCAwLAotCQkJICJtc2dfdHgiLCAodm9pZCAqKW1wb3J0KTsKLQlpZiAocmMgPCAwKQotCQlnb3RvIG91dF9pcnE7Ci0KLQkvKgotCSAqIENvbmZpZ3VyZSBvdXRib3VuZCBtZXNzYWdlIHVuaXQKLQkgKiAgICAgIFNub29waW5nCi0JICogICAgICBJbnRlcnJ1cHRzIChhbGwgZW5hYmxlZCwgZXhjZXB0IFFFSUUpCi0JICogICAgICBDaGFpbmluZyBtb2RlCi0JICogICAgICBEaXNhYmxlCi0JICovCi0Jb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5vbXIsIDB4MDAxMDAyMjApOwotCi0JLyogU2V0IG51bWJlciBvZiBlbnRyaWVzICovCi0Jb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5vbXIsCi0JCSBpbl9iZTMyKCZwcml2LT5tc2dfcmVncy0+b21yKSB8Ci0JCSAoKGdldF9iaXRtYXNrX29yZGVyKGVudHJpZXMpIC0gMikgPDwgMTIpKTsKLQotCS8qIE5vdyBlbmFibGUgdGhlIHVuaXQgKi8KLQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPm9tciwgaW5fYmUzMigmcHJpdi0+bXNnX3JlZ3MtPm9tcikgfCAweDEpOwotCi0gICAgICBvdXQ6Ci0JcmV0dXJuIHJjOwotCi0gICAgICBvdXRfaXJxOgotCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmRldiwKLQkJCSAgcHJpdi0+bXNnX3R4X3Jpbmcuc2l6ZSAqIFJJT19NU0dfREVTQ19TSVpFLAotCQkJICBwcml2LT5tc2dfdHhfcmluZy52aXJ0LCBwcml2LT5tc2dfdHhfcmluZy5waHlzKTsKLQotICAgICAgb3V0X2RtYToKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bXNnX3R4X3Jpbmcuc2l6ZTsgaSsrKQotCQlkbWFfZnJlZV9jb2hlcmVudChwcml2LT5kZXYsIFJJT19NU0dfQlVGRkVSX1NJWkUsCi0JCQkJICBwcml2LT5tc2dfdHhfcmluZy52aXJ0X2J1ZmZlcltpXSwKLQkJCQkgIHByaXYtPm1zZ190eF9yaW5nLnBoeXNfYnVmZmVyW2ldKTsKLQotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKiBmc2xfY2xvc2Vfb3V0Yl9tYm94IC0gU2h1dCBkb3duIE1QQzg1eHggb3V0Ym91bmQgbWFpbGJveAotICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIG91dGJvdW5kIG1lc3NhZ2UgdW5pdAotICogQG1ib3g6IE1haWxib3ggdG8gY2xvc2UKLSAqCi0gKiBEaXNhYmxlcyB0aGUgb3V0Ym91bmQgbWVzc2FnZSB1bml0LCBmcmVlIGFsbCBidWZmZXJzLCBhbmQKLSAqIGZyZWVzIHRoZSBvdXRib3VuZCBtZXNzYWdlIGludGVycnVwdC4KLSAqLwotc3RhdGljIHZvaWQgZnNsX2Nsb3NlX291dGJfbWJveChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgaW50IG1ib3gpCi17Ci0Jc3RydWN0IHJpb19wcml2ICpwcml2ID0gbXBvcnQtPnByaXY7Ci0JLyogRGlzYWJsZSBpbmJvdW5kIG1lc3NhZ2UgdW5pdCAqLwotCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+b21yLCAwKTsKLQotCS8qIEZyZWUgcmluZyAqLwotCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmRldiwKLQkJCSAgcHJpdi0+bXNnX3R4X3Jpbmcuc2l6ZSAqIFJJT19NU0dfREVTQ19TSVpFLAotCQkJICBwcml2LT5tc2dfdHhfcmluZy52aXJ0LCBwcml2LT5tc2dfdHhfcmluZy5waHlzKTsKLQotCS8qIEZyZWUgaW50ZXJydXB0ICovCi0JZnJlZV9pcnEoSVJRX1JJT19UWChtcG9ydCksICh2b2lkICopbXBvcnQpOwotfQotCi0vKioKLSAqIGZzbF9yaW9fcnhfaGFuZGxlciAtIE1QQzg1eHggaW5ib3VuZCBtZXNzYWdlIGludGVycnVwdCBoYW5kbGVyCi0gKiBAaXJxOiBMaW51eCBpbnRlcnJ1cHQgbnVtYmVyCi0gKiBAZGV2X2luc3RhbmNlOiBQb2ludGVyIHRvIGludGVycnVwdC1zcGVjaWZpYyBkYXRhCi0gKgotICogSGFuZGxlcyBpbmJvdW5kIG1lc3NhZ2UgaW50ZXJydXB0cy4gRXhlY3V0ZXMgYSByZWdpc3RlcmVkIGluYm91bmQKLSAqIG1haWxib3ggZXZlbnQgaGFuZGxlciBhbmQgYWNrcyB0aGUgaW50ZXJydXB0IG9jY3VycmVuY2UuCi0gKi8KLXN0YXRpYyBpcnFyZXR1cm5fdAotZnNsX3Jpb19yeF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pbnN0YW5jZSkKLXsKLQlpbnQgaXNyOwotCXN0cnVjdCByaW9fbXBvcnQgKnBvcnQgPSAoc3RydWN0IHJpb19tcG9ydCAqKWRldl9pbnN0YW5jZTsKLQlzdHJ1Y3QgcmlvX3ByaXYgKnByaXYgPSBwb3J0LT5wcml2OwotCi0JaXNyID0gaW5fYmUzMigmcHJpdi0+bXNnX3JlZ3MtPmlzcik7Ci0KLQlpZiAoaXNyICYgUklPX01TR19JU1JfVEUpIHsKLQkJcHJfaW5mbygiUklPOiBpbmJvdW5kIG1lc3NhZ2UgcmVjZXB0aW9uIGVycm9yXG4iKTsKLQkJb3V0X2JlMzIoKHZvaWQgKikmcHJpdi0+bXNnX3JlZ3MtPmlzciwgUklPX01TR19JU1JfVEUpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBYWFggTmVlZCB0byBjaGVjay9kaXNwYXRjaCB1bnRpbCBxdWV1ZSBlbXB0eSAqLwotCWlmIChpc3IgJiBSSU9fTVNHX0lTUl9ESVFJKSB7Ci0JCS8qCi0JCSAqIFdlIGltcGxlbWVudCAqb25seSogbWFpbGJveCAwLCBidXQgY2FuIHJlY2VpdmUgbWVzc2FnZXMKLQkJICogZm9yIGFueSBtYWlsYm94L2xldHRlciB0byB0aGF0IG1haWxib3ggZGVzdGluYXRpb24uIFNvLAotCQkgKiBtYWtlIHRoZSBjYWxsYmFjayB3aXRoIGFuIHVua25vd24vaW52YWxpZCBtYWlsYm94IG51bWJlcgotCQkgKiBhcmd1bWVudC4KLQkJICovCi0JCXBvcnQtPmluYl9tc2dbMF0ubWNiYWNrKHBvcnQsIHByaXYtPm1zZ19yeF9yaW5nLmRldl9pZCwgLTEsIC0xKTsKLQotCQkvKiBBY2sgdGhlIHF1ZXVlaW5nIGludGVycnVwdCAqLwotCQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPmlzciwgUklPX01TR19JU1JfRElRSSk7Ci0JfQotCi0gICAgICBvdXQ6Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGZzbF9vcGVuX2luYl9tYm94IC0gSW5pdGlhbGl6ZSBNUEM4NXh4IGluYm91bmQgbWFpbGJveAotICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIGluYm91bmQgbWVzc2FnZSB1bml0Ci0gKiBAZGV2X2lkOiBEZXZpY2Ugc3BlY2lmaWMgcG9pbnRlciB0byBwYXNzIG9uIGV2ZW50Ci0gKiBAbWJveDogTWFpbGJveCB0byBvcGVuCi0gKiBAZW50cmllczogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGluYm91bmQgbWFpbGJveCByaW5nCi0gKgotICogSW5pdGlhbGl6ZXMgYnVmZmVyIHJpbmcsIHJlcXVlc3QgdGhlIGluYm91bmQgbWVzc2FnZSBpbnRlcnJ1cHQsCi0gKiBhbmQgZW5hYmxlcyB0aGUgaW5ib3VuZCBtZXNzYWdlIHVuaXQuIFJldHVybnMgJTAgb24gc3VjY2VzcwotICogYW5kICUtRUlOVkFMIG9yICUtRU5PTUVNIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQKLWZzbF9vcGVuX2luYl9tYm94KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCB2b2lkICpkZXZfaWQsIGludCBtYm94LCBpbnQgZW50cmllcykKLXsKLQlpbnQgaSwgcmMgPSAwOwotCXN0cnVjdCByaW9fcHJpdiAqcHJpdiA9IG1wb3J0LT5wcml2OwotCi0JaWYgKChlbnRyaWVzIDwgUklPX01JTl9SWF9SSU5HX1NJWkUpIHx8Ci0JICAgIChlbnRyaWVzID4gUklPX01BWF9SWF9SSU5HX1NJWkUpIHx8ICghaXNfcG93ZXJfb2ZfMihlbnRyaWVzKSkpIHsKLQkJcmMgPSAtRUlOVkFMOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBJbml0aWFsaXplIGNsaWVudCBidWZmZXIgcmluZyAqLwotCXByaXYtPm1zZ19yeF9yaW5nLmRldl9pZCA9IGRldl9pZDsKLQlwcml2LT5tc2dfcnhfcmluZy5zaXplID0gZW50cmllczsKLQlwcml2LT5tc2dfcnhfcmluZy5yeF9zbG90ID0gMDsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+bXNnX3J4X3Jpbmcuc2l6ZTsgaSsrKQotCQlwcml2LT5tc2dfcnhfcmluZy52aXJ0X2J1ZmZlcltpXSA9IE5VTEw7Ci0KLQkvKiBJbml0aWFsaXplIGluYm91bmQgbWVzc2FnZSByaW5nICovCi0JcHJpdi0+bXNnX3J4X3JpbmcudmlydCA9IGRtYV9hbGxvY19jb2hlcmVudChwcml2LT5kZXYsCi0JCQkJcHJpdi0+bXNnX3J4X3Jpbmcuc2l6ZSAqIFJJT19NQVhfTVNHX1NJWkUsCi0JCQkJJnByaXYtPm1zZ19yeF9yaW5nLnBoeXMsIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+bXNnX3J4X3JpbmcudmlydCkgewotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIFBvaW50IGRlcXVldWUvZW5xdWV1ZSBwb2ludGVycyBhdCBmaXJzdCBlbnRyeSBpbiByaW5nICovCi0Jb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5pZnFkcGFyLCAodTMyKSBwcml2LT5tc2dfcnhfcmluZy5waHlzKTsKLQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPmlmcWVwYXIsICh1MzIpIHByaXYtPm1zZ19yeF9yaW5nLnBoeXMpOwotCi0JLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+aXNyLCAweDAwMDAwMDkxKTsKLQotCS8qIEhvb2sgdXAgaW5ib3VuZCBtZXNzYWdlIGhhbmRsZXIgKi8KLQlyYyA9IHJlcXVlc3RfaXJxKElSUV9SSU9fUlgobXBvcnQpLCBmc2xfcmlvX3J4X2hhbmRsZXIsIDAsCi0JCQkgIm1zZ19yeCIsICh2b2lkICopbXBvcnQpOwotCWlmIChyYyA8IDApIHsKLQkJZG1hX2ZyZWVfY29oZXJlbnQocHJpdi0+ZGV2LCBSSU9fTVNHX0JVRkZFUl9TSVpFLAotCQkJCSAgcHJpdi0+bXNnX3R4X3JpbmcudmlydF9idWZmZXJbaV0sCi0JCQkJICBwcml2LT5tc2dfdHhfcmluZy5waHlzX2J1ZmZlcltpXSk7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogQ29uZmlndXJlIGluYm91bmQgbWVzc2FnZSB1bml0OgotCSAqICAgICAgU25vb3BpbmcKLQkgKiAgICAgIDRLQiBtYXggbWVzc2FnZSBzaXplCi0JICogICAgICBVbm1hc2sgYWxsIGludGVycnVwdCBzb3VyY2VzCi0JICogICAgICBEaXNhYmxlCi0JICovCi0Jb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5pbXIsIDB4MDAxYjAwNjApOwotCi0JLyogU2V0IG51bWJlciBvZiBxdWV1ZSBlbnRyaWVzICovCi0Jc2V0Yml0czMyKCZwcml2LT5tc2dfcmVncy0+aW1yLCAoZ2V0X2JpdG1hc2tfb3JkZXIoZW50cmllcykgLSAyKSA8PCAxMik7Ci0KLQkvKiBOb3cgZW5hYmxlIHRoZSB1bml0ICovCi0Jc2V0Yml0czMyKCZwcml2LT5tc2dfcmVncy0+aW1yLCAweDEpOwotCi0gICAgICBvdXQ6Ci0JcmV0dXJuIHJjOwotfQotCi0vKioKLSAqIGZzbF9jbG9zZV9pbmJfbWJveCAtIFNodXQgZG93biBNUEM4NXh4IGluYm91bmQgbWFpbGJveAotICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIGluYm91bmQgbWVzc2FnZSB1bml0Ci0gKiBAbWJveDogTWFpbGJveCB0byBjbG9zZQotICoKLSAqIERpc2FibGVzIHRoZSBpbmJvdW5kIG1lc3NhZ2UgdW5pdCwgZnJlZSBhbGwgYnVmZmVycywgYW5kCi0gKiBmcmVlcyB0aGUgaW5ib3VuZCBtZXNzYWdlIGludGVycnVwdC4KLSAqLwotc3RhdGljIHZvaWQgZnNsX2Nsb3NlX2luYl9tYm94KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgbWJveCkKLXsKLQlzdHJ1Y3QgcmlvX3ByaXYgKnByaXYgPSBtcG9ydC0+cHJpdjsKLQkvKiBEaXNhYmxlIGluYm91bmQgbWVzc2FnZSB1bml0ICovCi0Jb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5pbXIsIDApOwotCi0JLyogRnJlZSByaW5nICovCi0JZG1hX2ZyZWVfY29oZXJlbnQocHJpdi0+ZGV2LCBwcml2LT5tc2dfcnhfcmluZy5zaXplICogUklPX01BWF9NU0dfU0laRSwKLQkJCSAgcHJpdi0+bXNnX3J4X3JpbmcudmlydCwgcHJpdi0+bXNnX3J4X3JpbmcucGh5cyk7Ci0KLQkvKiBGcmVlIGludGVycnVwdCAqLwotCWZyZWVfaXJxKElSUV9SSU9fUlgobXBvcnQpLCAodm9pZCAqKW1wb3J0KTsKLX0KLQotLyoqCi0gKiBmc2xfYWRkX2luYl9idWZmZXIgLSBBZGQgYnVmZmVyIHRvIHRoZSBNUEM4NXh4IGluYm91bmQgbWVzc2FnZSBxdWV1ZQotICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIGluYm91bmQgbWVzc2FnZSB1bml0Ci0gKiBAbWJveDogSW5ib3VuZCBtYWlsYm94IG51bWJlcgotICogQGJ1ZjogQnVmZmVyIHRvIGFkZCB0byBpbmJvdW5kIHF1ZXVlCi0gKgotICogQWRkcyB0aGUgQGJ1ZiBidWZmZXIgdG8gdGhlIE1QQzg1eHggaW5ib3VuZCBtZXNzYWdlIHF1ZXVlLiBSZXR1cm5zCi0gKiAlMCBvbiBzdWNjZXNzIG9yICUtRUlOVkFMIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQgZnNsX2FkZF9pbmJfYnVmZmVyKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgbWJveCwgdm9pZCAqYnVmKQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IHJpb19wcml2ICpwcml2ID0gbXBvcnQtPnByaXY7Ci0KLQlwcl9kZWJ1ZygiUklPOiBmc2xfYWRkX2luYl9idWZmZXIoKSwgbXNnX3J4X3Jpbmcucnhfc2xvdCAlZFxuIiwKLQkJIHByaXYtPm1zZ19yeF9yaW5nLnJ4X3Nsb3QpOwotCi0JaWYgKHByaXYtPm1zZ19yeF9yaW5nLnZpcnRfYnVmZmVyW3ByaXYtPm1zZ19yeF9yaW5nLnJ4X3Nsb3RdKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIlJJTzogZXJyb3IgYWRkaW5nIGluYm91bmQgYnVmZmVyICVkLCBidWZmZXIgZXhpc3RzXG4iLAotCQkgICAgICAgcHJpdi0+bXNnX3J4X3Jpbmcucnhfc2xvdCk7Ci0JCXJjID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcHJpdi0+bXNnX3J4X3JpbmcudmlydF9idWZmZXJbcHJpdi0+bXNnX3J4X3Jpbmcucnhfc2xvdF0gPSBidWY7Ci0JaWYgKCsrcHJpdi0+bXNnX3J4X3Jpbmcucnhfc2xvdCA9PSBwcml2LT5tc2dfcnhfcmluZy5zaXplKQotCQlwcml2LT5tc2dfcnhfcmluZy5yeF9zbG90ID0gMDsKLQotICAgICAgb3V0OgotCXJldHVybiByYzsKLX0KLQotLyoqCi0gKiBmc2xfZ2V0X2luYl9tZXNzYWdlIC0gRmV0Y2ggaW5ib3VuZCBtZXNzYWdlIGZyb20gdGhlIE1QQzg1eHggbWVzc2FnZSB1bml0Ci0gKiBAbXBvcnQ6IE1hc3RlciBwb3J0IGltcGxlbWVudGluZyB0aGUgaW5ib3VuZCBtZXNzYWdlIHVuaXQKLSAqIEBtYm94OiBJbmJvdW5kIG1haWxib3ggbnVtYmVyCi0gKgotICogR2V0cyB0aGUgbmV4dCBhdmFpbGFibGUgaW5ib3VuZCBtZXNzYWdlIGZyb20gdGhlIGluYm91bmQgbWVzc2FnZSBxdWV1ZS4KLSAqIEEgcG9pbnRlciB0byB0aGUgbWVzc2FnZSBpcyByZXR1cm5lZCBvbiBzdWNjZXNzIG9yIE5VTEwgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIHZvaWQgKmZzbF9nZXRfaW5iX21lc3NhZ2Uoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBtYm94KQotewotCXN0cnVjdCByaW9fcHJpdiAqcHJpdiA9IG1wb3J0LT5wcml2OwotCXUzMiBwaHlzX2J1ZiwgdmlydF9idWY7Ci0Jdm9pZCAqYnVmID0gTlVMTDsKLQlpbnQgYnVmX2lkeDsKLQotCXBoeXNfYnVmID0gaW5fYmUzMigmcHJpdi0+bXNnX3JlZ3MtPmlmcWRwYXIpOwotCi0JLyogSWYgbm8gbW9yZSBtZXNzYWdlcywgdGhlbiBiYWlsIG91dCAqLwotCWlmIChwaHlzX2J1ZiA9PSBpbl9iZTMyKCZwcml2LT5tc2dfcmVncy0+aWZxZXBhcikpCi0JCWdvdG8gb3V0MjsKLQotCXZpcnRfYnVmID0gKHUzMikgcHJpdi0+bXNnX3J4X3JpbmcudmlydCArIChwaHlzX2J1ZgotCQkJCQkJLSBwcml2LT5tc2dfcnhfcmluZy5waHlzKTsKLQlidWZfaWR4ID0gKHBoeXNfYnVmIC0gcHJpdi0+bXNnX3J4X3JpbmcucGh5cykgLyBSSU9fTUFYX01TR19TSVpFOwotCWJ1ZiA9IHByaXYtPm1zZ19yeF9yaW5nLnZpcnRfYnVmZmVyW2J1Zl9pZHhdOwotCi0JaWYgKCFidWYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiUklPOiBpbmJvdW5kIG1lc3NhZ2UgY29weSBmYWlsZWQsIG5vIGJ1ZmZlcnNcbiIpOwotCQlnb3RvIG91dDE7Ci0JfQotCi0JLyogQ29weSBtYXggbWVzc2FnZSBzaXplLCBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYWxsb2NhdGUgdGhhdCBiaWcgKi8KLQltZW1jcHkoYnVmLCAodm9pZCAqKXZpcnRfYnVmLCBSSU9fTUFYX01TR19TSVpFKTsKLQotCS8qIENsZWFyIHRoZSBhdmFpbGFibGUgYnVmZmVyICovCi0JcHJpdi0+bXNnX3J4X3JpbmcudmlydF9idWZmZXJbYnVmX2lkeF0gPSBOVUxMOwotCi0gICAgICBvdXQxOgotCXNldGJpdHMzMigmcHJpdi0+bXNnX3JlZ3MtPmltciwgUklPX01TR19JTVJfTUkpOwotCi0gICAgICBvdXQyOgotCXJldHVybiBidWY7Ci19Ci0KLS8qKgotICogZnNsX3Jpb19kYmVsbF9oYW5kbGVyIC0gTVBDODV4eCBkb29yYmVsbCBpbnRlcnJ1cHQgaGFuZGxlcgotICogQGlycTogTGludXggaW50ZXJydXB0IG51bWJlcgotICogQGRldl9pbnN0YW5jZTogUG9pbnRlciB0byBpbnRlcnJ1cHQtc3BlY2lmaWMgZGF0YQotICoKLSAqIEhhbmRsZXMgZG9vcmJlbGwgaW50ZXJydXB0cy4gUGFyc2VzIGEgbGlzdCBvZiByZWdpc3RlcmVkCi0gKiBkb29yYmVsbCBldmVudCBoYW5kbGVycyBhbmQgZXhlY3V0ZXMgYSBtYXRjaGluZyBldmVudCBoYW5kbGVyLgotICovCi1zdGF0aWMgaXJxcmV0dXJuX3QKLWZzbF9yaW9fZGJlbGxfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCi17Ci0JaW50IGRzcjsKLQlzdHJ1Y3QgcmlvX21wb3J0ICpwb3J0ID0gKHN0cnVjdCByaW9fbXBvcnQgKilkZXZfaW5zdGFuY2U7Ci0Jc3RydWN0IHJpb19wcml2ICpwcml2ID0gcG9ydC0+cHJpdjsKLQotCWRzciA9IGluX2JlMzIoJnByaXYtPm1zZ19yZWdzLT5kc3IpOwotCi0JaWYgKGRzciAmIERPT1JCRUxMX0RTUl9URSkgewotCQlwcl9pbmZvKCJSSU86IGRvb3JiZWxsIHJlY2VwdGlvbiBlcnJvclxuIik7Ci0JCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+ZHNyLCBET09SQkVMTF9EU1JfVEUpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoZHNyICYgRE9PUkJFTExfRFNSX1FGSSkgewotCQlwcl9pbmZvKCJSSU86IGRvb3JiZWxsIHF1ZXVlIGZ1bGxcbiIpOwotCQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPmRzciwgRE9PUkJFTExfRFNSX1FGSSk7Ci0JfQotCi0JLyogWFhYIE5lZWQgdG8gY2hlY2svZGlzcGF0Y2ggdW50aWwgcXVldWUgZW1wdHkgKi8KLQlpZiAoZHNyICYgRE9PUkJFTExfRFNSX0RJUUkpIHsKLQkJdTMyIGRtc2cgPQotCQkgICAgKHUzMikgcHJpdi0+ZGJlbGxfcmluZy52aXJ0ICsKLQkJICAgIChpbl9iZTMyKCZwcml2LT5tc2dfcmVncy0+ZHFkcGFyKSAmIDB4ZmZmKTsKLQkJc3RydWN0IHJpb19kYmVsbCAqZGJlbGw7Ci0JCWludCBmb3VuZCA9IDA7Ci0KLQkJcHJfZGVidWcKLQkJICAgICgiUklPOiBwcm9jZXNzaW5nIGRvb3JiZWxsLCBzaWQgJTIuMnggdGlkICUyLjJ4IGluZm8gJTQuNHhcbiIsCi0JCSAgICAgREJFTExfU0lEKGRtc2cpLCBEQkVMTF9USUQoZG1zZyksIERCRUxMX0lORihkbXNnKSk7Ci0KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShkYmVsbCwgJnBvcnQtPmRiZWxscywgbm9kZSkgewotCQkJaWYgKChkYmVsbC0+cmVzLT5zdGFydCA8PSBEQkVMTF9JTkYoZG1zZykpICYmCi0JCQkgICAgKGRiZWxsLT5yZXMtPmVuZCA+PSBEQkVMTF9JTkYoZG1zZykpKSB7Ci0JCQkJZm91bmQgPSAxOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChmb3VuZCkgewotCQkJZGJlbGwtPmRpbmIocG9ydCwgZGJlbGwtPmRldl9pZCwgREJFTExfU0lEKGRtc2cpLCBEQkVMTF9USUQoZG1zZyksCi0JCQkJICAgIERCRUxMX0lORihkbXNnKSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcl9kZWJ1ZwotCQkJICAgICgiUklPOiBzcHVyaW91cyBkb29yYmVsbCwgc2lkICUyLjJ4IHRpZCAlMi4yeCBpbmZvICU0LjR4XG4iLAotCQkJICAgICBEQkVMTF9TSUQoZG1zZyksIERCRUxMX1RJRChkbXNnKSwgREJFTExfSU5GKGRtc2cpKTsKLQkJfQotCQlzZXRiaXRzMzIoJnByaXYtPm1zZ19yZWdzLT5kbXIsIERPT1JCRUxMX0RNUl9ESSk7Ci0JCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+ZHNyLCBET09SQkVMTF9EU1JfRElRSSk7Ci0JfQotCi0gICAgICBvdXQ6Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi0vKioKLSAqIGZzbF9yaW9fZG9vcmJlbGxfaW5pdCAtIE1QQzg1eHggZG9vcmJlbGwgaW50ZXJmYWNlIGluaXQKLSAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBpbmJvdW5kIGRvb3JiZWxsIHVuaXQKLSAqCi0gKiBJbml0aWFsaXplcyBkb29yYmVsbCB1bml0IGhhcmR3YXJlIGFuZCBpbmJvdW5kIERNQSBidWZmZXIKLSAqIHJpbmcuIENhbGxlZCBmcm9tIGZzbF9yaW9fc2V0dXAoKS4gUmV0dXJucyAlMCBvbiBzdWNjZXNzCi0gKiBvciAlLUVOT01FTSBvbiBmYWlsdXJlLgotICovCi1zdGF0aWMgaW50IGZzbF9yaW9fZG9vcmJlbGxfaW5pdChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCkKLXsKLQlzdHJ1Y3QgcmlvX3ByaXYgKnByaXYgPSBtcG9ydC0+cHJpdjsKLQlpbnQgcmMgPSAwOwotCi0JLyogTWFwIG91dGJvdW5kIGRvb3JiZWxsIHdpbmRvdyBpbW1lZGlhdGVseSBhZnRlciBtYWludGVuYW5jZSB3aW5kb3cgKi8KLQlwcml2LT5kYmVsbF93aW4gPSBpb3JlbWFwKG1wb3J0LT5pb3Jlcy5zdGFydCArIFJJT19NQUlOVF9XSU5fU0laRSwKLQkJCSAgICBSSU9fREJFTExfV0lOX1NJWkUpOwotCWlmICghcHJpdi0+ZGJlbGxfd2luKSB7Ci0JCXByaW50ayhLRVJOX0VSUgotCQkgICAgICAgIlJJTzogdW5hYmxlIHRvIG1hcCBvdXRib3VuZCBkb29yYmVsbCB3aW5kb3dcbiIpOwotCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIEluaXRpYWxpemUgaW5ib3VuZCBkb29yYmVsbHMgKi8KLQlwcml2LT5kYmVsbF9yaW5nLnZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQocHJpdi0+ZGV2LCA1MTIgKgotCQkgICAgRE9PUkJFTExfTUVTU0FHRV9TSVpFLCAmcHJpdi0+ZGJlbGxfcmluZy5waHlzLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYtPmRiZWxsX3JpbmcudmlydCkgewotCQlwcmludGsoS0VSTl9FUlIgIlJJTzogdW5hYmxlIGFsbG9jYXRlIGluYm91bmQgZG9vcmJlbGwgcmluZ1xuIik7Ci0JCXJjID0gLUVOT01FTTsKLQkJaW91bm1hcChwcml2LT5kYmVsbF93aW4pOwotCQlnb3RvIG91dDsKLQl9Ci0KLQkvKiBQb2ludCBkZXF1ZXVlL2VucXVldWUgcG9pbnRlcnMgYXQgZmlyc3QgZW50cnkgaW4gcmluZyAqLwotCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+ZHFkcGFyLCAodTMyKSBwcml2LT5kYmVsbF9yaW5nLnBoeXMpOwotCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+ZHFlcGFyLCAodTMyKSBwcml2LT5kYmVsbF9yaW5nLnBoeXMpOwotCi0JLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLwotCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+ZHNyLCAweDAwMDAwMDkxKTsKLQotCS8qIEhvb2sgdXAgZG9vcmJlbGwgaGFuZGxlciAqLwotCXJjID0gcmVxdWVzdF9pcnEoSVJRX1JJT19CRUxMKG1wb3J0KSwgZnNsX3Jpb19kYmVsbF9oYW5kbGVyLCAwLAotCQkJICJkYmVsbF9yeCIsICh2b2lkICopbXBvcnQpOwotCWlmIChyYyA8IDApIHsKLQkJaW91bm1hcChwcml2LT5kYmVsbF93aW4pOwotCQlkbWFfZnJlZV9jb2hlcmVudChwcml2LT5kZXYsIDUxMiAqIERPT1JCRUxMX01FU1NBR0VfU0laRSwKLQkJCQkgIHByaXYtPmRiZWxsX3JpbmcudmlydCwgcHJpdi0+ZGJlbGxfcmluZy5waHlzKTsKLQkJcHJpbnRrKEtFUk5fRVJSCi0JCSAgICAgICAiTVBDODV4eCBSSU86IHVuYWJsZSB0byByZXF1ZXN0IGluYm91bmQgZG9vcmJlbGwgaXJxIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIENvbmZpZ3VyZSBkb29yYmVsbHMgZm9yIHNub29waW5nLCA1MTIgZW50cmllcywgYW5kIGVuYWJsZSAqLwotCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+ZG1yLCAweDAwMTA4MTYxKTsKLQotICAgICAgb3V0OgotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgcG9ydF9lcnJvcl9oYW5kbGVyKHN0cnVjdCByaW9fbXBvcnQgKnBvcnQsIGludCBvZmZzZXQpCit2b2lkIGZzbF9yaW9fcG9ydF9lcnJvcl9oYW5kbGVyKGludCBvZmZzZXQpCiB7CiAJLypYWFg6IEVycm9yIHJlY292ZXJ5IGlzIG5vdCBpbXBsZW1lbnRlZCwgd2UganVzdCBjbGVhciBlcnJvcnMgKi8KIAlvdXRfYmUzMigodTMyICopKHJpb19yZWdzX3dpbiArIFJJT19MVExFRENTUiksIDApOwpAQCAtMTA5OCwyNjMgKzI3OSw2IEBACiAJCW91dF9iZTMyKCh1MzIgKikocmlvX3JlZ3Nfd2luICsgUklPX1BPUlQyX0VTQ1NSKSwgRVNDU1JfQ0xFQVIpOwogCX0KIH0KLQotc3RhdGljIHZvaWQgbXNnX3VuaXRfZXJyb3JfaGFuZGxlcihzdHJ1Y3QgcmlvX21wb3J0ICpwb3J0KQotewotCXN0cnVjdCByaW9fcHJpdiAqcHJpdiA9IHBvcnQtPnByaXY7Ci0KLQkvKlhYWDogRXJyb3IgcmVjb3ZlcnkgaXMgbm90IGltcGxlbWVudGVkLCB3ZSBqdXN0IGNsZWFyIGVycm9ycyAqLwotCW91dF9iZTMyKCh1MzIgKikocmlvX3JlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKSwgMCk7Ci0KLQlvdXRfYmUzMigodTMyICopKHJpb19yZWdzX3dpbiArIFJJT19JTTBTUiksIElNU1JfQ0xFQVIpOwotCW91dF9iZTMyKCh1MzIgKikocmlvX3JlZ3Nfd2luICsgUklPX0lNMVNSKSwgSU1TUl9DTEVBUik7Ci0Jb3V0X2JlMzIoKHUzMiAqKShyaW9fcmVnc193aW4gKyBSSU9fT00wU1IpLCBPTVNSX0NMRUFSKTsKLQlvdXRfYmUzMigodTMyICopKHJpb19yZWdzX3dpbiArIFJJT19PTTFTUiksIE9NU1JfQ0xFQVIpOwotCi0Jb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5vZHNyLCBPRFNSX0NMRUFSKTsKLQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPmRzciwgSURTUl9DTEVBUik7Ci0KLQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPnB3c3IsIElQV1NSX0NMRUFSKTsKLX0KLQotLyoqCi0gKiBmc2xfcmlvX3BvcnRfd3JpdGVfaGFuZGxlciAtIE1QQzg1eHggcG9ydCB3cml0ZSBpbnRlcnJ1cHQgaGFuZGxlcgotICogQGlycTogTGludXggaW50ZXJydXB0IG51bWJlcgotICogQGRldl9pbnN0YW5jZTogUG9pbnRlciB0byBpbnRlcnJ1cHQtc3BlY2lmaWMgZGF0YQotICoKLSAqIEhhbmRsZXMgcG9ydCB3cml0ZSBpbnRlcnJ1cHRzLiBQYXJzZXMgYSBsaXN0IG9mIHJlZ2lzdGVyZWQKLSAqIHBvcnQgd3JpdGUgZXZlbnQgaGFuZGxlcnMgYW5kIGV4ZWN1dGVzIGEgbWF0Y2hpbmcgZXZlbnQgaGFuZGxlci4KLSAqLwotc3RhdGljIGlycXJldHVybl90Ci1mc2xfcmlvX3BvcnRfd3JpdGVfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaW5zdGFuY2UpCi17Ci0JdTMyIGlwd21yLCBpcHdzcjsKLQlzdHJ1Y3QgcmlvX21wb3J0ICpwb3J0ID0gKHN0cnVjdCByaW9fbXBvcnQgKilkZXZfaW5zdGFuY2U7Ci0Jc3RydWN0IHJpb19wcml2ICpwcml2ID0gcG9ydC0+cHJpdjsKLQl1MzIgZXB3aXNyLCB0bXA7Ci0KLQllcHdpc3IgPSBpbl9iZTMyKHByaXYtPnJlZ3Nfd2luICsgUklPX0VQV0lTUik7Ci0JaWYgKCEoZXB3aXNyICYgUklPX0VQV0lTUl9QVykpCi0JCWdvdG8gcHdfZG9uZTsKLQotCWlwd21yID0gaW5fYmUzMigmcHJpdi0+bXNnX3JlZ3MtPnB3bXIpOwotCWlwd3NyID0gaW5fYmUzMigmcHJpdi0+bXNnX3JlZ3MtPnB3c3IpOwotCi0jaWZkZWYgREVCVUdfUFcKLQlwcl9kZWJ1ZygiUFcgSW50LT5JUFdNUjogMHglMDh4IElQV1NSOiAweCUwOHggKCIsIGlwd21yLCBpcHdzcik7Ci0JaWYgKGlwd3NyICYgUklPX0lQV1NSX1FGKQotCQlwcl9kZWJ1ZygiIFFGIik7Ci0JaWYgKGlwd3NyICYgUklPX0lQV1NSX1RFKQotCQlwcl9kZWJ1ZygiIFRFIik7Ci0JaWYgKGlwd3NyICYgUklPX0lQV1NSX1FGSSkKLQkJcHJfZGVidWcoIiBRRkkiKTsKLQlpZiAoaXB3c3IgJiBSSU9fSVBXU1JfUFdEKQotCQlwcl9kZWJ1ZygiIFBXRCIpOwotCWlmIChpcHdzciAmIFJJT19JUFdTUl9QV0IpCi0JCXByX2RlYnVnKCIgUFdCIik7Ci0JcHJfZGVidWcoIiApXG4iKTsKLSNlbmRpZgotCS8qIFNjaGVkdWxlIGRlZmVycmVkIHByb2Nlc3NpbmcgaWYgUFcgd2FzIHJlY2VpdmVkICovCi0JaWYgKGlwd3NyICYgUklPX0lQV1NSX1FGSSkgewotCQkvKiBTYXZlIFBXIG1lc3NhZ2UgKGlmIHRoZXJlIGlzIHJvb20gaW4gRklGTyksCi0JCSAqIG90aGVyd2lzZSBkaXNjYXJkIGl0LgotCQkgKi8KLQkJaWYgKGtmaWZvX2F2YWlsKCZwcml2LT5wd19maWZvKSA+PSBSSU9fUFdfTVNHX1NJWkUpIHsKLQkJCXByaXYtPnBvcnRfd3JpdGVfbXNnLm1zZ19jb3VudCsrOwotCQkJa2ZpZm9faW4oJnByaXYtPnB3X2ZpZm8sIHByaXYtPnBvcnRfd3JpdGVfbXNnLnZpcnQsCi0JCQkJIFJJT19QV19NU0dfU0laRSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcml2LT5wb3J0X3dyaXRlX21zZy5kaXNjYXJkX2NvdW50Kys7Ci0JCQlwcl9kZWJ1ZygiUklPOiBJU1IgRGlzY2FyZGVkIFBvcnQtV3JpdGUgTXNnKHMpICglZClcbiIsCi0JCQkJIHByaXYtPnBvcnRfd3JpdGVfbXNnLmRpc2NhcmRfY291bnQpOwotCQl9Ci0JCS8qIENsZWFyIGludGVycnVwdCBhbmQgaXNzdWUgQ2xlYXIgUXVldWUgY29tbWFuZC4gVGhpcyBhbGxvd3MKLQkJICogYW5vdGhlciBwb3J0LXdyaXRlIHRvIGJlIHJlY2VpdmVkLgotCQkgKi8KLQkJb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5wd3NyLAlSSU9fSVBXU1JfUUZJKTsKLQkJb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5wd21yLCBpcHdtciB8IFJJT19JUFdNUl9DUSk7Ci0KLQkJc2NoZWR1bGVfd29yaygmcHJpdi0+cHdfd29yayk7Ci0JfQotCi0JaWYgKChpcHdtciAmIFJJT19JUFdNUl9FSUUpICYmIChpcHdzciAmIFJJT19JUFdTUl9URSkpIHsKLQkJcHJpdi0+cG9ydF93cml0ZV9tc2cuZXJyX2NvdW50Kys7Ci0JCXByX2RlYnVnKCJSSU86IFBvcnQtV3JpdGUgVHJhbnNhY3Rpb24gRXJyICglZClcbiIsCi0JCQkgcHJpdi0+cG9ydF93cml0ZV9tc2cuZXJyX2NvdW50KTsKLQkJLyogQ2xlYXIgVHJhbnNhY3Rpb24gRXJyb3I6IHBvcnQtd3JpdGUgY29udHJvbGxlciBzaG91bGQgYmUKLQkJICogZGlzYWJsZWQgd2hlbiBjbGVhcmluZyB0aGlzIGVycm9yCi0JCSAqLwotCQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPnB3bXIsIGlwd21yICYgflJJT19JUFdNUl9QV0UpOwotCQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPnB3c3IsCVJJT19JUFdTUl9URSk7Ci0JCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+cHdtciwgaXB3bXIpOwotCX0KLQotCWlmIChpcHdzciAmIFJJT19JUFdTUl9QV0QpIHsKLQkJcHJpdi0+cG9ydF93cml0ZV9tc2cuZGlzY2FyZF9jb3VudCsrOwotCQlwcl9kZWJ1ZygiUklPOiBQb3J0IERpc2NhcmRlZCBQb3J0LVdyaXRlIE1zZyhzKSAoJWQpXG4iLAotCQkJIHByaXYtPnBvcnRfd3JpdGVfbXNnLmRpc2NhcmRfY291bnQpOwotCQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPnB3c3IsIFJJT19JUFdTUl9QV0QpOwotCX0KLQotcHdfZG9uZToKLQlpZiAoZXB3aXNyICYgUklPX0VQV0lTUl9QSU5UMSkgewotCQl0bXAgPSBpbl9iZTMyKHByaXYtPnJlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKTsKLQkJcHJfZGVidWcoIlJJT19MVExFRENTUiA9IDB4JXhcbiIsIHRtcCk7Ci0JCXBvcnRfZXJyb3JfaGFuZGxlcihwb3J0LCAwKTsKLQl9Ci0KLQlpZiAoZXB3aXNyICYgUklPX0VQV0lTUl9QSU5UMikgewotCQl0bXAgPSBpbl9iZTMyKHByaXYtPnJlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKTsKLQkJcHJfZGVidWcoIlJJT19MVExFRENTUiA9IDB4JXhcbiIsIHRtcCk7Ci0JCXBvcnRfZXJyb3JfaGFuZGxlcihwb3J0LCAxKTsKLQl9Ci0KLQlpZiAoZXB3aXNyICYgUklPX0VQV0lTUl9NVSkgewotCQl0bXAgPSBpbl9iZTMyKHByaXYtPnJlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKTsKLQkJcHJfZGVidWcoIlJJT19MVExFRENTUiA9IDB4JXhcbiIsIHRtcCk7Ci0JCW1zZ191bml0X2Vycm9yX2hhbmRsZXIocG9ydCk7Ci0JfQotCi0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotCi1zdGF0aWMgdm9pZCBmc2xfcHdfZHBjKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKLXsKLQlzdHJ1Y3QgcmlvX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHJpb19wcml2LCBwd193b3JrKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBtc2dfYnVmZmVyW1JJT19QV19NU0dfU0laRS9zaXplb2YodTMyKV07Ci0KLQkvKgotCSAqIFByb2Nlc3MgcG9ydC13cml0ZSBtZXNzYWdlcwotCSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5wd19maWZvX2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoa2ZpZm9fb3V0KCZwcml2LT5wd19maWZvLCAodW5zaWduZWQgY2hhciAqKW1zZ19idWZmZXIsCi0JCQkgUklPX1BXX01TR19TSVpFKSkgewotCQkvKiBQcm9jZXNzIG9uZSBtZXNzYWdlICovCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnB3X2ZpZm9fbG9jaywgZmxhZ3MpOwotI2lmZGVmIERFQlVHX1BXCi0JCXsKLQkJdTMyIGk7Ci0JCXByX2RlYnVnKCIlcyA6IFBvcnQtV3JpdGUgTWVzc2FnZToiLCBfX2Z1bmNfXyk7Ci0JCWZvciAoaSA9IDA7IGkgPCBSSU9fUFdfTVNHX1NJWkUvc2l6ZW9mKHUzMik7IGkrKykgewotCQkJaWYgKChpJTQpID09IDApCi0JCQkJcHJfZGVidWcoIlxuMHglMDJ4OiAweCUwOHgiLCBpKjQsCi0JCQkJCSBtc2dfYnVmZmVyW2ldKTsKLQkJCWVsc2UKLQkJCQlwcl9kZWJ1ZygiIDB4JTA4eCIsIG1zZ19idWZmZXJbaV0pOwotCQl9Ci0JCXByX2RlYnVnKCJcbiIpOwotCQl9Ci0jZW5kaWYKLQkJLyogUGFzcyB0aGUgcG9ydC13cml0ZSBtZXNzYWdlIHRvIFJJTyBjb3JlIGZvciBwcm9jZXNzaW5nICovCi0JCXJpb19pbmJfcHdyaXRlX2hhbmRsZXIoKHVuaW9uIHJpb19wd19tc2cgKiltc2dfYnVmZmVyKTsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnB3X2ZpZm9fbG9jaywgZmxhZ3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5wd19maWZvX2xvY2ssIGZsYWdzKTsKLX0KLQotLyoqCi0gKiBmc2xfcmlvX3B3X2VuYWJsZSAtIGVuYWJsZS9kaXNhYmxlIHBvcnQtd3JpdGUgaW50ZXJmYWNlIGluaXQKLSAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBwb3J0IHdyaXRlIHVuaXQKLSAqIEBlbmFibGU6ICAgIDE9ZW5hYmxlOyAwPWRpc2FibGUgcG9ydC13cml0ZSBtZXNzYWdlIGhhbmRsaW5nCi0gKi8KLXN0YXRpYyBpbnQgZnNsX3Jpb19wd19lbmFibGUoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBlbmFibGUpCi17Ci0Jc3RydWN0IHJpb19wcml2ICpwcml2ID0gbXBvcnQtPnByaXY7Ci0JdTMyIHJ2YWw7Ci0KLQlydmFsID0gaW5fYmUzMigmcHJpdi0+bXNnX3JlZ3MtPnB3bXIpOwotCi0JaWYgKGVuYWJsZSkKLQkJcnZhbCB8PSBSSU9fSVBXTVJfUFdFOwotCWVsc2UKLQkJcnZhbCAmPSB+UklPX0lQV01SX1BXRTsKLQotCW91dF9iZTMyKCZwcml2LT5tc2dfcmVncy0+cHdtciwgcnZhbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBmc2xfcmlvX3BvcnRfd3JpdGVfaW5pdCAtIE1QQzg1eHggcG9ydCB3cml0ZSBpbnRlcmZhY2UgaW5pdAotICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIHBvcnQgd3JpdGUgdW5pdAotICoKLSAqIEluaXRpYWxpemVzIHBvcnQgd3JpdGUgdW5pdCBoYXJkd2FyZSBhbmQgRE1BIGJ1ZmZlcgotICogcmluZy4gQ2FsbGVkIGZyb20gZnNsX3Jpb19zZXR1cCgpLiBSZXR1cm5zICUwIG9uIHN1Y2Nlc3MKLSAqIG9yICUtRU5PTUVNIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQgZnNsX3Jpb19wb3J0X3dyaXRlX2luaXQoc3RydWN0IHJpb19tcG9ydCAqbXBvcnQpCi17Ci0Jc3RydWN0IHJpb19wcml2ICpwcml2ID0gbXBvcnQtPnByaXY7Ci0JaW50IHJjID0gMDsKLQotCS8qIEZvbGxvd2luZyBjb25maWd1cmF0aW9ucyByZXF1aXJlIGEgZGlzYWJsZWQgcG9ydCB3cml0ZSBjb250cm9sbGVyICovCi0Jb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5wd21yLAotCQkgaW5fYmUzMigmcHJpdi0+bXNnX3JlZ3MtPnB3bXIpICYgflJJT19JUFdNUl9QV0UpOwotCi0JLyogSW5pdGlhbGl6ZSBwb3J0IHdyaXRlICovCi0JcHJpdi0+cG9ydF93cml0ZV9tc2cudmlydCA9IGRtYV9hbGxvY19jb2hlcmVudChwcml2LT5kZXYsCi0JCQkJCVJJT19QV19NU0dfU0laRSwKLQkJCQkJJnByaXYtPnBvcnRfd3JpdGVfbXNnLnBoeXMsIEdGUF9LRVJORUwpOwotCWlmICghcHJpdi0+cG9ydF93cml0ZV9tc2cudmlydCkgewotCQlwcl9lcnIoIlJJTzogdW5hYmxlIGFsbG9jYXRlIHBvcnQgd3JpdGUgcXVldWVcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwcml2LT5wb3J0X3dyaXRlX21zZy5lcnJfY291bnQgPSAwOwotCXByaXYtPnBvcnRfd3JpdGVfbXNnLmRpc2NhcmRfY291bnQgPSAwOwotCi0JLyogUG9pbnQgZGVxdWV1ZS9lbnF1ZXVlIHBvaW50ZXJzIGF0IGZpcnN0IGVudHJ5ICovCi0Jb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5lcHdxYmFyLCAwKTsKLQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPnB3cWJhciwgKHUzMikgcHJpdi0+cG9ydF93cml0ZV9tc2cucGh5cyk7Ci0KLQlwcl9kZWJ1ZygiRUlQV1FCQVI6IDB4JTA4eCBJUFdRQkFSOiAweCUwOHhcbiIsCi0JCSBpbl9iZTMyKCZwcml2LT5tc2dfcmVncy0+ZXB3cWJhciksCi0JCSBpbl9iZTMyKCZwcml2LT5tc2dfcmVncy0+cHdxYmFyKSk7Ci0KLQkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzIElQV1NSICovCi0Jb3V0X2JlMzIoJnByaXYtPm1zZ19yZWdzLT5wd3NyLAotCQkgKFJJT19JUFdTUl9URSB8IFJJT19JUFdTUl9RRkkgfCBSSU9fSVBXU1JfUFdEKSk7Ci0KLQkvKiBDb25maWd1cmUgcG9ydCB3cml0ZSBjb250b2xsZXIgZm9yIHNub29waW5nIGVuYWJsZSBhbGwgcmVwb3J0aW5nLAotCSAgIGNsZWFyIHF1ZXVlIGZ1bGwgKi8KLQlvdXRfYmUzMigmcHJpdi0+bXNnX3JlZ3MtPnB3bXIsCi0JCSBSSU9fSVBXTVJfU0VOIHwgUklPX0lQV01SX1FGSUUgfCBSSU9fSVBXTVJfRUlFIHwgUklPX0lQV01SX0NRKTsKLQotCi0JLyogSG9vayB1cCBwb3J0LXdyaXRlIGhhbmRsZXIgKi8KLQlyYyA9IHJlcXVlc3RfaXJxKElSUV9SSU9fUFcobXBvcnQpLCBmc2xfcmlvX3BvcnRfd3JpdGVfaGFuZGxlciwKLQkJCUlSUUZfU0hBUkVELCAicG9ydC13cml0ZSIsICh2b2lkICopbXBvcnQpOwotCWlmIChyYyA8IDApIHsKLQkJcHJfZXJyKCJNUEM4NXh4IFJJTzogdW5hYmxlIHRvIHJlcXVlc3QgaW5ib3VuZCBkb29yYmVsbCBpcnEiKTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQkvKiBFbmFibGUgRXJyb3IgSW50ZXJydXB0ICovCi0Jb3V0X2JlMzIoKHUzMiAqKShyaW9fcmVnc193aW4gKyBSSU9fTFRMRUVDU1IpLCBMVExFRUNTUl9FTkFCTEVfQUxMKTsKLQotCUlOSVRfV09SSygmcHJpdi0+cHdfd29yaywgZnNsX3B3X2RwYyk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPnB3X2ZpZm9fbG9jayk7Ci0JaWYgKGtmaWZvX2FsbG9jKCZwcml2LT5wd19maWZvLCBSSU9fUFdfTVNHX1NJWkUgKiAzMiwgR0ZQX0tFUk5FTCkpIHsKLQkJcHJfZXJyKCJGSUZPIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLQkJcmMgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXRfaXJxOwotCX0KLQotCXByX2RlYnVnKCJJUFdNUjogMHglMDh4IElQV1NSOiAweCUwOHhcbiIsCi0JCSBpbl9iZTMyKCZwcml2LT5tc2dfcmVncy0+cHdtciksCi0JCSBpbl9iZTMyKCZwcml2LT5tc2dfcmVncy0+cHdzcikpOwotCi0JcmV0dXJuIHJjOwotCi1lcnJfb3V0X2lycToKLQlmcmVlX2lycShJUlFfUklPX1BXKG1wb3J0KSwgKHZvaWQgKiltcG9ydCk7Ci1lcnJfb3V0OgotCWRtYV9mcmVlX2NvaGVyZW50KHByaXYtPmRldiwgUklPX1BXX01TR19TSVpFLAotCQkJICBwcml2LT5wb3J0X3dyaXRlX21zZy52aXJ0LAotCQkJICBwcml2LT5wb3J0X3dyaXRlX21zZy5waHlzKTsKLQlyZXR1cm4gcmM7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCBmc2xfcmlvX2luZm8oc3RydWN0IGRldmljZSAqZGV2LCB1MzIgY2NzcikKIHsKIAljb25zdCBjaGFyICpzdHI7CkBAIC0xNDExLDE2ICszMzUsMjEgQEAKIAlzdHJ1Y3QgcmlvX21wb3J0ICpwb3J0OwogCXN0cnVjdCByaW9fcHJpdiAqcHJpdjsKIAlpbnQgcmMgPSAwOwotCWNvbnN0IHUzMiAqZHRfcmFuZ2UsICpjZWxsOwotCXN0cnVjdCByZXNvdXJjZSByZWdzOworCWNvbnN0IHUzMiAqZHRfcmFuZ2UsICpjZWxsLCAqcG9ydF9pbmRleDsKKwl1MzIgYWN0aXZlX3BvcnRzID0gMDsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVncywgcm11X3JlZ3M7CisJc3RydWN0IGRldmljZV9ub2RlICpucCwgKnJtdV9ub2RlOwogCWludCBybGVuOwogCXUzMiBjY3NyOwotCXU2NCBsYXdfc3RhcnQsIGxhd19zaXplOworCXU2NCByYW5nZV9zdGFydCwgcmFuZ2Vfc2l6ZTsKIAlpbnQgcGF3LCBhdywgc3c7CisJdTMyIGk7CisJc3RhdGljIGludCB0bXA7CisJc3RydWN0IGRldmljZV9ub2RlICpybXVfbnBbTUFYX01TR19VTklUX05VTV0gPSB7TlVMTH07CiAKIAlpZiAoIWRldi0+ZGV2Lm9mX25vZGUpIHsKIAkJZGV2X2VycigmZGV2LT5kZXYsICJEZXZpY2UgT0YtTm9kZSBpcyBOVUxMIik7Ci0JCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKIAlyYyA9IG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UoZGV2LT5kZXYub2Zfbm9kZSwgMCwgJnJlZ3MpOwpAQCAtMTQyOSwzNyArMzU4LDE3IEBACiAJCQkJZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJfQotCWRldl9pbmZvKCZkZXYtPmRldiwgIk9mLWRldmljZSBmdWxsIG5hbWUgJXNcbiIsIGRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7CisJZGV2X2luZm8oJmRldi0+ZGV2LCAiT2YtZGV2aWNlIGZ1bGwgbmFtZSAlc1xuIiwKKwkJCWRldi0+ZGV2Lm9mX25vZGUtPmZ1bGxfbmFtZSk7CiAJZGV2X2luZm8oJmRldi0+ZGV2LCAiUmVnczogJXBSXG4iLCAmcmVncyk7CiAKLQlkdF9yYW5nZSA9IG9mX2dldF9wcm9wZXJ0eShkZXYtPmRldi5vZl9ub2RlLCAicmFuZ2VzIiwgJnJsZW4pOwotCWlmICghZHRfcmFuZ2UpIHsKLQkJZGV2X2VycigmZGV2LT5kZXYsICJDYW4ndCBnZXQgJXMgcHJvcGVydHkgJ3JhbmdlcydcbiIsCi0JCQkJZGV2LT5kZXYub2Zfbm9kZS0+ZnVsbF9uYW1lKTsKLQkJcmV0dXJuIC1FRkFVTFQ7CisJcmlvX3JlZ3Nfd2luID0gaW9yZW1hcChyZWdzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZWdzKSk7CisJaWYgKCFyaW9fcmVnc193aW4pIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJVbmFibGUgdG8gbWFwIHJpbyByZWdpc3RlciB3aW5kb3dcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3Jpb19yZWdzOwogCX0KIAotCS8qIEdldCBub2RlIGFkZHJlc3Mgd2lkZSAqLwotCWNlbGwgPSBvZl9nZXRfcHJvcGVydHkoZGV2LT5kZXYub2Zfbm9kZSwgIiNhZGRyZXNzLWNlbGxzIiwgTlVMTCk7Ci0JaWYgKGNlbGwpCi0JCWF3ID0gKmNlbGw7Ci0JZWxzZQotCQlhdyA9IG9mX25fYWRkcl9jZWxscyhkZXYtPmRldi5vZl9ub2RlKTsKLQkvKiBHZXQgbm9kZSBzaXplIHdpZGUgKi8KLQljZWxsID0gb2ZfZ2V0X3Byb3BlcnR5KGRldi0+ZGV2Lm9mX25vZGUsICIjc2l6ZS1jZWxscyIsIE5VTEwpOwotCWlmIChjZWxsKQotCQlzdyA9ICpjZWxsOwotCWVsc2UKLQkJc3cgPSBvZl9uX3NpemVfY2VsbHMoZGV2LT5kZXYub2Zfbm9kZSk7Ci0JLyogR2V0IHBhcmVudCBhZGRyZXNzIHdpZGUgd2lkZSAqLwotCXBhdyA9IG9mX25fYWRkcl9jZWxscyhkZXYtPmRldi5vZl9ub2RlKTsKLQotCWxhd19zdGFydCA9IG9mX3JlYWRfbnVtYmVyKGR0X3JhbmdlICsgYXcsIHBhdyk7Ci0JbGF3X3NpemUgPSBvZl9yZWFkX251bWJlcihkdF9yYW5nZSArIGF3ICsgcGF3LCBzdyk7Ci0KLQlkZXZfaW5mbygmZGV2LT5kZXYsICJMQVcgc3RhcnQgMHglMDE2bGx4LCBzaXplIDB4JTAxNmxseC5cbiIsCi0JCQlsYXdfc3RhcnQsIGxhd19zaXplKTsKLQogCW9wcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByaW9fb3BzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFvcHMpIHsKIAkJcmMgPSAtRU5PTUVNOwpAQCAtMTQ3OSwxNDMgKzM4OCwyNTcgQEAKIAlvcHMtPmFkZF9pbmJfYnVmZmVyID0gZnNsX2FkZF9pbmJfYnVmZmVyOwogCW9wcy0+Z2V0X2luYl9tZXNzYWdlID0gZnNsX2dldF9pbmJfbWVzc2FnZTsKIAotCXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmlvX21wb3J0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwb3J0KSB7CisJcm11X25vZGUgPSBvZl9wYXJzZV9waGFuZGxlKGRldi0+ZGV2Lm9mX25vZGUsICJmc2wsc3Jpby1ybXUtaGFuZGxlIiwgMCk7CisJaWYgKCFybXVfbm9kZSkKKwkJZ290byBlcnJfcm11OworCXJjID0gb2ZfYWRkcmVzc190b19yZXNvdXJjZShybXVfbm9kZSwgMCwgJnJtdV9yZWdzKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJDYW4ndCBnZXQgJXMgcHJvcGVydHkgJ3JlZydcbiIsCisJCQkJcm11X25vZGUtPmZ1bGxfbmFtZSk7CisJCWdvdG8gZXJyX3JtdTsKKwl9CisJcm11X3JlZ3Nfd2luID0gaW9yZW1hcChybXVfcmVncy5zdGFydCwgcmVzb3VyY2Vfc2l6ZSgmcm11X3JlZ3MpKTsKKwlpZiAoIXJtdV9yZWdzX3dpbikgeworCQlkZXZfZXJyKCZkZXYtPmRldiwgIlVuYWJsZSB0byBtYXAgcm11IHJlZ2lzdGVyIHdpbmRvd1xuIik7CiAJCXJjID0gLUVOT01FTTsKLQkJZ290byBlcnJfcG9ydDsKKwkJZ290byBlcnJfcm11OwogCX0KLQlwb3J0LT5pbmRleCA9IDA7CisJZm9yX2VhY2hfY29tcGF0aWJsZV9ub2RlKG5wLCBOVUxMLCAiZnNsLHNyaW8tbXNnLXVuaXQiKSB7CisJCXJtdV9ucFt0bXBdID0gbnA7CisJCXRtcCsrOworCX0KIAotCXByaXYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmlvX3ByaXYpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXByaXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBhbGxvYyBtZW1vcnkgZm9yICdwcml2J1xuIik7CisJLypzZXQgdXAgZG9vYmVsbCBub2RlKi8KKwlucCA9IG9mX2ZpbmRfY29tcGF0aWJsZV9ub2RlKE5VTEwsIE5VTEwsICJmc2wsc3Jpby1kYmVsbC11bml0Iik7CisJaWYgKCFucCkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX2RiZWxsOworCX0KKwlkYmVsbCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBmc2xfcmlvX2RiZWxsKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCEoZGJlbGwpKSB7CisJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2MgbWVtb3J5IGZvciAnZnNsX3Jpb19kYmVsbCdcbiIpOwogCQlyYyA9IC1FTk9NRU07Ci0JCWdvdG8gZXJyX3ByaXY7CisJCWdvdG8gZXJyX2RiZWxsOwogCX0KKwlkYmVsbC0+ZGV2ID0gJmRldi0+ZGV2OworCWRiZWxsLT5iZWxsaXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDEpOworCWRldl9pbmZvKCZkZXYtPmRldiwgImJlbGxpcnE6ICVkXG4iLCBkYmVsbC0+YmVsbGlycSk7CiAKLQlJTklUX0xJU1RfSEVBRCgmcG9ydC0+ZGJlbGxzKTsKLQlwb3J0LT5pb3Jlcy5zdGFydCA9IGxhd19zdGFydDsKLQlwb3J0LT5pb3Jlcy5lbmQgPSBsYXdfc3RhcnQgKyBsYXdfc2l6ZSAtIDE7Ci0JcG9ydC0+aW9yZXMuZmxhZ3MgPSBJT1JFU09VUkNFX01FTTsKLQlwb3J0LT5pb3Jlcy5uYW1lID0gInJpb19pb193aW4iOwotCi0JaWYgKHJlcXVlc3RfcmVzb3VyY2UoJmlvbWVtX3Jlc291cmNlLCAmcG9ydC0+aW9yZXMpIDwgMCkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIlJJTzogRXJyb3IgcmVxdWVzdGluZyBtYXN0ZXIgcG9ydCByZWdpb24iCi0JCQkiIDB4JTAxNmxseC0weCUwMTZsbHhcbiIsCi0JCQkodTY0KXBvcnQtPmlvcmVzLnN0YXJ0LCAodTY0KXBvcnQtPmlvcmVzLmVuZCk7Ci0JCQlyYyA9IC1FTk9NRU07Ci0JCQlnb3RvIGVycl9yZXM7CisJYXcgPSBvZl9uX2FkZHJfY2VsbHMobnApOworCWR0X3JhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmVnIiwgJnJsZW4pOworCWlmICghZHRfcmFuZ2UpIHsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGZpbmQgJ3JlZycgcHJvcGVydHlcbiIsCisJCQlucC0+ZnVsbF9uYW1lKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9wdzsKIAl9CisJcmFuZ2Vfc3RhcnQgPSBvZl9yZWFkX251bWJlcihkdF9yYW5nZSwgYXcpOworCWRiZWxsLT5kYmVsbF9yZWdzID0gKHN0cnVjdCByaW9fZGJlbGxfcmVncyAqKShybXVfcmVnc193aW4gKworCQkJCSh1MzIpcmFuZ2Vfc3RhcnQpOwogCi0JcHJpdi0+cHdpcnEgICA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRldi0+ZGV2Lm9mX25vZGUsIDApOwotCXByaXYtPmJlbGxpcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChkZXYtPmRldi5vZl9ub2RlLCAyKTsKLQlwcml2LT50eGlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKGRldi0+ZGV2Lm9mX25vZGUsIDMpOwotCXByaXYtPnJ4aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAoZGV2LT5kZXYub2Zfbm9kZSwgNCk7Ci0JZGV2X2luZm8oJmRldi0+ZGV2LCAicHdpcnE6ICVkLCBiZWxsaXJxOiAlZCwgdHhpcnE6ICVkLCByeGlycSAlZFxuIiwKLQkJIHByaXYtPnB3aXJxLCBwcml2LT5iZWxsaXJxLCBwcml2LT50eGlycSwgcHJpdi0+cnhpcnEpOwotCi0JcmlvX2luaXRfZGJlbGxfcmVzKCZwb3J0LT5yaW9yZXNbUklPX0RPT1JCRUxMX1JFU09VUkNFXSwgMCwgMHhmZmZmKTsKLQlyaW9faW5pdF9tYm94X3JlcygmcG9ydC0+cmlvcmVzW1JJT19JTkJfTUJPWF9SRVNPVVJDRV0sIDAsIDApOwotCXJpb19pbml0X21ib3hfcmVzKCZwb3J0LT5yaW9yZXNbUklPX09VVEJfTUJPWF9SRVNPVVJDRV0sIDAsIDApOwotCXN0cmNweShwb3J0LT5uYW1lLCAiUklPMCBtcG9ydCIpOwotCi0JcHJpdi0+ZGV2ID0gJmRldi0+ZGV2OwotCi0JcG9ydC0+b3BzID0gb3BzOwotCXBvcnQtPnByaXYgPSBwcml2OwotCXBvcnQtPnBoeXNfZWZwdHIgPSAweDEwMDsKLQotCXByaXYtPnJlZ3Nfd2luID0gaW9yZW1hcChyZWdzLnN0YXJ0LCByZXNvdXJjZV9zaXplKCZyZWdzKSk7Ci0JcmlvX3JlZ3Nfd2luID0gcHJpdi0+cmVnc193aW47Ci0KLQkvKiBQcm9iZSB0aGUgbWFzdGVyIHBvcnQgcGh5IHR5cGUgKi8KLQljY3NyID0gaW5fYmUzMihwcml2LT5yZWdzX3dpbiArIFJJT19DQ1NSKTsKLQlwb3J0LT5waHlfdHlwZSA9IChjY3NyICYgMSkgPyBSSU9fUEhZX1NFUklBTCA6IFJJT19QSFlfUEFSQUxMRUw7Ci0JZGV2X2luZm8oJmRldi0+ZGV2LCAiUmFwaWRJTyBQSFkgdHlwZTogJXNcbiIsCi0JCQkocG9ydC0+cGh5X3R5cGUgPT0gUklPX1BIWV9QQVJBTExFTCkgPyAicGFyYWxsZWwiIDoKLQkJCSgocG9ydC0+cGh5X3R5cGUgPT0gUklPX1BIWV9TRVJJQUwpID8gInNlcmlhbCIgOgotCQkJICJ1bmtub3duIikpOwotCS8qIENoZWNraW5nIHRoZSBwb3J0IHRyYWluaW5nIHN0YXR1cyAqLwotCWlmIChpbl9iZTMyKChwcml2LT5yZWdzX3dpbiArIFJJT19FU0NTUikpICYgMSkgewotCQlkZXZfZXJyKCZkZXYtPmRldiwgIlBvcnQgaXMgbm90IHJlYWR5LiAiCi0JCQkJICAgIlRyeSB0byByZXN0YXJ0IGNvbm5lY3Rpb24uLi5cbiIpOwotCQlzd2l0Y2ggKHBvcnQtPnBoeV90eXBlKSB7Ci0JCWNhc2UgUklPX1BIWV9TRVJJQUw6Ci0JCQkvKiBEaXNhYmxlIHBvcnRzICovCi0JCQlvdXRfYmUzMihwcml2LT5yZWdzX3dpbiArIFJJT19DQ1NSLCAwKTsKLQkJCS8qIFNldCAxeCBsYW5lICovCi0JCQlzZXRiaXRzMzIocHJpdi0+cmVnc193aW4gKyBSSU9fQ0NTUiwgMHgwMjAwMDAwMCk7Ci0JCQkvKiBFbmFibGUgcG9ydHMgKi8KLQkJCXNldGJpdHMzMihwcml2LT5yZWdzX3dpbiArIFJJT19DQ1NSLCAweDAwNjAwMDAwKTsKLQkJCWJyZWFrOwotCQljYXNlIFJJT19QSFlfUEFSQUxMRUw6Ci0JCQkvKiBEaXNhYmxlIHBvcnRzICovCi0JCQlvdXRfYmUzMihwcml2LT5yZWdzX3dpbiArIFJJT19DQ1NSLCAweDIyMDAwMDAwKTsKLQkJCS8qIEVuYWJsZSBwb3J0cyAqLwotCQkJb3V0X2JlMzIocHJpdi0+cmVnc193aW4gKyBSSU9fQ0NTUiwgMHg0NDAwMDAwMCk7Ci0JCQlicmVhazsKLQkJfQotCQltc2xlZXAoMTAwKTsKLQkJaWYgKGluX2JlMzIoKHByaXYtPnJlZ3Nfd2luICsgUklPX0VTQ1NSKSkgJiAxKSB7Ci0JCQlkZXZfZXJyKCZkZXYtPmRldiwgIlBvcnQgcmVzdGFydCBmYWlsZWQuXG4iKTsKLQkJCXJjID0gLUVOT0xJTks7Ci0JCQlnb3RvIGVycjsKLQkJfQotCQlkZXZfaW5mbygmZGV2LT5kZXYsICJQb3J0IHJlc3RhcnQgc3VjY2VzcyFcbiIpOworCS8qc2V0IHVwIHBvcnQgd3JpdGUgbm9kZSovCisJbnAgPSBvZl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLHNyaW8tcG9ydC13cml0ZS11bml0Iik7CisJaWYgKCFucCkgeworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX3B3OwogCX0KLQlmc2xfcmlvX2luZm8oJmRldi0+ZGV2LCBjY3NyKTsKLQotCXBvcnQtPnN5c19zaXplID0gKGluX2JlMzIoKHByaXYtPnJlZ3Nfd2luICsgUklPX1BFRl9DQVIpKQotCQkJCQkmIFJJT19QRUZfQ1RMUykgPj4gNDsKLQlkZXZfaW5mbygmZGV2LT5kZXYsICJSYXBpZElPIENvbW1vbiBUcmFuc3BvcnQgU3lzdGVtIHNpemU6ICVkXG4iLAotCQkJcG9ydC0+c3lzX3NpemUgPyA2NTUzNiA6IDI1Nik7Ci0KLQlpZiAocmlvX3JlZ2lzdGVyX21wb3J0KHBvcnQpKQorCXB3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZzbF9yaW9fcHcpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIShwdykpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJDYW4ndCBhbGxvYyBtZW1vcnkgZm9yICdmc2xfcmlvX3B3J1xuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfcHc7CisJfQorCXB3LT5kZXYgPSAmZGV2LT5kZXY7CisJcHctPnB3aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobnAsIDApOworCWRldl9pbmZvKCZkZXYtPmRldiwgInB3aXJxOiAlZFxuIiwgcHctPnB3aXJxKTsKKwlhdyA9IG9mX25fYWRkcl9jZWxscyhucCk7CisJZHRfcmFuZ2UgPSBvZl9nZXRfcHJvcGVydHkobnAsICJyZWciLCAmcmxlbik7CisJaWYgKCFkdF9yYW5nZSkgeworCQlwcl9lcnIoIiVzOiB1bmFibGUgdG8gZmluZCAncmVnJyBwcm9wZXJ0eVxuIiwKKwkJCW5wLT5mdWxsX25hbWUpOworCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyOworCX0KKwlyYW5nZV9zdGFydCA9IG9mX3JlYWRfbnVtYmVyKGR0X3JhbmdlLCBhdyk7CisJcHctPnB3X3JlZ3MgPSAoc3RydWN0IHJpb19wd19yZWdzICopKHJtdV9yZWdzX3dpbiArICh1MzIpcmFuZ2Vfc3RhcnQpOwogCi0JaWYgKHBvcnQtPmhvc3RfZGV2aWNlaWQgPj0gMCkKLQkJb3V0X2JlMzIocHJpdi0+cmVnc193aW4gKyBSSU9fR0NDU1IsIFJJT19QT1JUX0dFTl9IT1NUIHwKLQkJCVJJT19QT1JUX0dFTl9NQVNURVIgfCBSSU9fUE9SVF9HRU5fRElTQ09WRVJFRCk7Ci0JZWxzZQotCQlvdXRfYmUzMihwcml2LT5yZWdzX3dpbiArIFJJT19HQ0NTUiwgMHgwMDAwMDAwMCk7CisJLypzZXQgdXAgcG9ydHMgbm9kZSovCisJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShkZXYtPmRldi5vZl9ub2RlLCBucCkgeworCQlwb3J0X2luZGV4ID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiY2VsbC1pbmRleCIsIE5VTEwpOworCQlpZiAoIXBvcnRfaW5kZXgpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ2FuJ3QgZ2V0ICVzIHByb3BlcnR5ICdjZWxsLWluZGV4J1xuIiwKKwkJCQkJbnAtPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQogCi0JcHJpdi0+YXRtdV9yZWdzID0gKHN0cnVjdCByaW9fYXRtdV9yZWdzICopKHByaXYtPnJlZ3Nfd2luCi0JCQkJCSsgUklPX0FUTVVfUkVHU19PRkZTRVQpOwotCXByaXYtPm1haW50X2F0bXVfcmVncyA9IHByaXYtPmF0bXVfcmVncyArIDE7Ci0JcHJpdi0+ZGJlbGxfYXRtdV9yZWdzID0gcHJpdi0+YXRtdV9yZWdzICsgMjsKLQlwcml2LT5tc2dfcmVncyA9IChzdHJ1Y3QgcmlvX21zZ19yZWdzICopKHByaXYtPnJlZ3Nfd2luICsKLQkJCQkoKHBvcnQtPnBoeV90eXBlID09IFJJT19QSFlfU0VSSUFMKSA/Ci0JCQkJUklPX1NfTVNHX1JFR1NfT0ZGU0VUIDogUklPX1BfTVNHX1JFR1NfT0ZGU0VUKSk7CisJCWR0X3JhbmdlID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAicmFuZ2VzIiwgJnJsZW4pOworCQlpZiAoIWR0X3JhbmdlKSB7CisJCQlkZXZfZXJyKCZkZXYtPmRldiwgIkNhbid0IGdldCAlcyBwcm9wZXJ0eSAncmFuZ2VzJ1xuIiwKKwkJCQkJbnAtPmZ1bGxfbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQogCi0JLyogU2V0IHRvIHJlY2VpdmUgYW55IGRpc3QgSUQgZm9yIHNlcmlhbCBSYXBpZElPIGNvbnRyb2xsZXIuICovCi0JaWYgKHBvcnQtPnBoeV90eXBlID09IFJJT19QSFlfU0VSSUFMKQotCQlvdXRfYmUzMigocHJpdi0+cmVnc193aW4gKyBSSU9fSVNSX0FBQ1IpLCBSSU9fSVNSX0FBQ1JfQUEpOworCQkvKiBHZXQgbm9kZSBhZGRyZXNzIHdpZGUgKi8KKwkJY2VsbCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIiNhZGRyZXNzLWNlbGxzIiwgTlVMTCk7CisJCWlmIChjZWxsKQorCQkJYXcgPSAqY2VsbDsKKwkJZWxzZQorCQkJYXcgPSBvZl9uX2FkZHJfY2VsbHMobnApOworCQkvKiBHZXQgbm9kZSBzaXplIHdpZGUgKi8KKwkJY2VsbCA9IG9mX2dldF9wcm9wZXJ0eShucCwgIiNzaXplLWNlbGxzIiwgTlVMTCk7CisJCWlmIChjZWxsKQorCQkJc3cgPSAqY2VsbDsKKwkJZWxzZQorCQkJc3cgPSBvZl9uX3NpemVfY2VsbHMobnApOworCQkvKiBHZXQgcGFyZW50IGFkZHJlc3Mgd2lkZSB3aWRlICovCisJCXBhdyA9IG9mX25fYWRkcl9jZWxscyhucCk7CisJCXJhbmdlX3N0YXJ0ID0gb2ZfcmVhZF9udW1iZXIoZHRfcmFuZ2UgKyBhdywgcGF3KTsKKwkJcmFuZ2Vfc2l6ZSA9IG9mX3JlYWRfbnVtYmVyKGR0X3JhbmdlICsgYXcgKyBwYXcsIHN3KTsKIAotCS8qIENvbmZpZ3VyZSBtYWludGVuYW5jZSB0cmFuc2FjdGlvbiB3aW5kb3cgKi8KLQlvdXRfYmUzMigmcHJpdi0+bWFpbnRfYXRtdV9yZWdzLT5yb3diYXIsIGxhd19zdGFydCA+PiAxMik7Ci0Jb3V0X2JlMzIoJnByaXYtPm1haW50X2F0bXVfcmVncy0+cm93YXIsCi0JCSAweDgwMDc3MDAwIHwgKGlsb2cyKFJJT19NQUlOVF9XSU5fU0laRSkgLSAxKSk7CisJCWRldl9pbmZvKCZkZXYtPmRldiwgIiVzOiBMQVcgc3RhcnQgMHglMDE2bGx4LCBzaXplIDB4JTAxNmxseC5cbiIsCisJCQkJbnAtPmZ1bGxfbmFtZSwgcmFuZ2Vfc3RhcnQsIHJhbmdlX3NpemUpOwogCi0JcHJpdi0+bWFpbnRfd2luID0gaW9yZW1hcChsYXdfc3RhcnQsIFJJT19NQUlOVF9XSU5fU0laRSk7CisJCXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgcmlvX21wb3J0KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcG9ydCkKKwkJCWNvbnRpbnVlOwogCi0JLyogQ29uZmlndXJlIG91dGJvdW5kIGRvb3JiZWxsIHdpbmRvdyAqLwotCW91dF9iZTMyKCZwcml2LT5kYmVsbF9hdG11X3JlZ3MtPnJvd2JhciwKLQkJCShsYXdfc3RhcnQgKyBSSU9fTUFJTlRfV0lOX1NJWkUpID4+IDEyKTsKLQlvdXRfYmUzMigmcHJpdi0+ZGJlbGxfYXRtdV9yZWdzLT5yb3dhciwgMHg4MDA0MjAwYik7CS8qIDRrICovCi0JZnNsX3Jpb19kb29yYmVsbF9pbml0KHBvcnQpOwotCWZzbF9yaW9fcG9ydF93cml0ZV9pbml0KHBvcnQpOworCQlpID0gKnBvcnRfaW5kZXggLSAxOworCQlwb3J0LT5pbmRleCA9ICh1bnNpZ25lZCBjaGFyKWk7CisKKwkJcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByaW9fcHJpdiksIEdGUF9LRVJORUwpOworCQlpZiAoIXByaXYpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiQ2FuJ3QgYWxsb2MgbWVtb3J5IGZvciAncHJpdidcbiIpOworCQkJa2ZyZWUocG9ydCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCUlOSVRfTElTVF9IRUFEKCZwb3J0LT5kYmVsbHMpOworCQlwb3J0LT5pb3Jlcy5zdGFydCA9IHJhbmdlX3N0YXJ0OworCQlwb3J0LT5pb3Jlcy5lbmQgPSBwb3J0LT5pb3Jlcy5zdGFydCArIHJhbmdlX3NpemUgLSAxOworCQlwb3J0LT5pb3Jlcy5mbGFncyA9IElPUkVTT1VSQ0VfTUVNOworCQlwb3J0LT5pb3Jlcy5uYW1lID0gInJpb19pb193aW4iOworCisJCWlmIChyZXF1ZXN0X3Jlc291cmNlKCZpb21lbV9yZXNvdXJjZSwgJnBvcnQtPmlvcmVzKSA8IDApIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiUklPOiBFcnJvciByZXF1ZXN0aW5nIG1hc3RlciBwb3J0IHJlZ2lvbiIKKwkJCQkiIDB4JTAxNmxseC0weCUwMTZsbHhcbiIsCisJCQkJKHU2NClwb3J0LT5pb3Jlcy5zdGFydCwgKHU2NClwb3J0LT5pb3Jlcy5lbmQpOworCQkJCWtmcmVlKHByaXYpOworCQkJCWtmcmVlKHBvcnQpOworCQkJCWNvbnRpbnVlOworCQl9CisJCXNwcmludGYocG9ydC0+bmFtZSwgIlJJTyBtcG9ydCAlZCIsIGkpOworCisJCXByaXYtPmRldiA9ICZkZXYtPmRldjsKKwkJcG9ydC0+b3BzID0gb3BzOworCQlwb3J0LT5wcml2ID0gcHJpdjsKKwkJcG9ydC0+cGh5c19lZnB0ciA9IDB4MTAwOworCQlwcml2LT5yZWdzX3dpbiA9IHJpb19yZWdzX3dpbjsKKworCQkvKiBQcm9iZSB0aGUgbWFzdGVyIHBvcnQgcGh5IHR5cGUgKi8KKwkJY2NzciA9IGluX2JlMzIocHJpdi0+cmVnc193aW4gKyBSSU9fQ0NTUiArIGkqMHgyMCk7CisJCXBvcnQtPnBoeV90eXBlID0gKGNjc3IgJiAxKSA/IFJJT19QSFlfU0VSSUFMIDogUklPX1BIWV9QQVJBTExFTDsKKwkJaWYgKHBvcnQtPnBoeV90eXBlID09IFJJT19QSFlfUEFSQUxMRUwpIHsKKwkJCWRldl9lcnIoJmRldi0+ZGV2LCAiUklPOiBQYXJhbGxlbCBQSFkgdHlwZSwgdW5zdXBwb3J0ZWQgcG9ydCB0eXBlIVxuIik7CisJCQlyZWxlYXNlX3Jlc291cmNlKCZwb3J0LT5pb3Jlcyk7CisJCQlrZnJlZShwcml2KTsKKwkJCWtmcmVlKHBvcnQpOworCQkJY29udGludWU7CisJCX0KKwkJZGV2X2luZm8oJmRldi0+ZGV2LCAiUmFwaWRJTyBQSFkgdHlwZTogU2VyaWFsXG4iKTsKKwkJLyogQ2hlY2tpbmcgdGhlIHBvcnQgdHJhaW5pbmcgc3RhdHVzICovCisJCWlmIChpbl9iZTMyKChwcml2LT5yZWdzX3dpbiArIFJJT19FU0NTUiArIGkqMHgyMCkpICYgMSkgeworCQkJZGV2X2VycigmZGV2LT5kZXYsICJQb3J0ICVkIGlzIG5vdCByZWFkeS4gIgorCQkJIlRyeSB0byByZXN0YXJ0IGNvbm5lY3Rpb24uLi5cbiIsIGkpOworCQkJLyogRGlzYWJsZSBwb3J0cyAqLworCQkJb3V0X2JlMzIocHJpdi0+cmVnc193aW4KKwkJCQkrIFJJT19DQ1NSICsgaSoweDIwLCAwKTsKKwkJCS8qIFNldCAxeCBsYW5lICovCisJCQlzZXRiaXRzMzIocHJpdi0+cmVnc193aW4KKwkJCQkrIFJJT19DQ1NSICsgaSoweDIwLCAweDAyMDAwMDAwKTsKKwkJCS8qIEVuYWJsZSBwb3J0cyAqLworCQkJc2V0Yml0czMyKHByaXYtPnJlZ3Nfd2luCisJCQkJKyBSSU9fQ0NTUiArIGkqMHgyMCwgMHgwMDYwMDAwMCk7CisJCQltc2xlZXAoMTAwKTsKKwkJCWlmIChpbl9iZTMyKChwcml2LT5yZWdzX3dpbgorCQkJCQkrIFJJT19FU0NTUiArIGkqMHgyMCkpICYgMSkgeworCQkJCWRldl9lcnIoJmRldi0+ZGV2LAorCQkJCQkiUG9ydCAlZCByZXN0YXJ0IGZhaWxlZC5cbiIsIGkpOworCQkJCXJlbGVhc2VfcmVzb3VyY2UoJnBvcnQtPmlvcmVzKTsKKwkJCQlrZnJlZShwcml2KTsKKwkJCQlrZnJlZShwb3J0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWRldl9pbmZvKCZkZXYtPmRldiwgIlBvcnQgJWQgcmVzdGFydCBzdWNjZXNzIVxuIiwgaSk7CisJCX0KKwkJZnNsX3Jpb19pbmZvKCZkZXYtPmRldiwgY2Nzcik7CisKKwkJcG9ydC0+c3lzX3NpemUgPSAoaW5fYmUzMigocHJpdi0+cmVnc193aW4gKyBSSU9fUEVGX0NBUikpCisJCQkJCSYgUklPX1BFRl9DVExTKSA+PiA0OworCQlkZXZfaW5mbygmZGV2LT5kZXYsICJSYXBpZElPIENvbW1vbiBUcmFuc3BvcnQgU3lzdGVtIHNpemU6ICVkXG4iLAorCQkJCXBvcnQtPnN5c19zaXplID8gNjU1MzYgOiAyNTYpOworCisJCWlmIChyaW9fcmVnaXN0ZXJfbXBvcnQocG9ydCkpIHsKKwkJCXJlbGVhc2VfcmVzb3VyY2UoJnBvcnQtPmlvcmVzKTsKKwkJCWtmcmVlKHByaXYpOworCQkJa2ZyZWUocG9ydCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocG9ydC0+aG9zdF9kZXZpY2VpZCA+PSAwKQorCQkJb3V0X2JlMzIocHJpdi0+cmVnc193aW4gKyBSSU9fR0NDU1IsIFJJT19QT1JUX0dFTl9IT1NUIHwKKwkJCQlSSU9fUE9SVF9HRU5fTUFTVEVSIHwgUklPX1BPUlRfR0VOX0RJU0NPVkVSRUQpOworCQllbHNlCisJCQlvdXRfYmUzMihwcml2LT5yZWdzX3dpbiArIFJJT19HQ0NTUiwKKwkJCQlSSU9fUE9SVF9HRU5fTUFTVEVSKTsKKworCQlwcml2LT5hdG11X3JlZ3MgPSAoc3RydWN0IHJpb19hdG11X3JlZ3MgKikocHJpdi0+cmVnc193aW4KKwkJCSsgKChpID09IDApID8gUklPX0FUTVVfUkVHU19QT1JUMV9PRkZTRVQgOgorCQkJUklPX0FUTVVfUkVHU19QT1JUMl9PRkZTRVQpKTsKKworCQlwcml2LT5tYWludF9hdG11X3JlZ3MgPSBwcml2LT5hdG11X3JlZ3MgKyAxOworCisJCS8qIFNldCB0byByZWNlaXZlIGFueSBkaXN0IElEIGZvciBzZXJpYWwgUmFwaWRJTyBjb250cm9sbGVyLiAqLworCQlpZiAocG9ydC0+cGh5X3R5cGUgPT0gUklPX1BIWV9TRVJJQUwpCisJCQlvdXRfYmUzMigocHJpdi0+cmVnc193aW4KKwkJCQkrIFJJT19JU1JfQUFDUiArIGkqMHg4MCksIFJJT19JU1JfQUFDUl9BQSk7CisKKwkJLyogQ29uZmlndXJlIG1haW50ZW5hbmNlIHRyYW5zYWN0aW9uIHdpbmRvdyAqLworCQlvdXRfYmUzMigmcHJpdi0+bWFpbnRfYXRtdV9yZWdzLT5yb3diYXIsCisJCQlwb3J0LT5pb3Jlcy5zdGFydCA+PiAxMik7CisJCW91dF9iZTMyKCZwcml2LT5tYWludF9hdG11X3JlZ3MtPnJvd2FyLAorCQkJIDB4ODAwNzcwMDAgfCAoaWxvZzIoUklPX01BSU5UX1dJTl9TSVpFKSAtIDEpKTsKKworCQlwcml2LT5tYWludF93aW4gPSBpb3JlbWFwKHBvcnQtPmlvcmVzLnN0YXJ0LAorCQkJCVJJT19NQUlOVF9XSU5fU0laRSk7CisKKwkJcmlvX2xhd19zdGFydCA9IHJhbmdlX3N0YXJ0OworCisJCWZzbF9yaW9fc2V0dXBfcm11KHBvcnQsIHJtdV9ucFtpXSk7CisKKwkJZGJlbGwtPm1wb3J0W2ldID0gcG9ydDsKKworCQlhY3RpdmVfcG9ydHMrKzsKKwl9CisKKwlpZiAoIWFjdGl2ZV9wb3J0cykgeworCQlyYyA9IC1FTk9MSU5LOworCQlnb3RvIGVycjsKKwl9CisKKwlmc2xfcmlvX2Rvb3JiZWxsX2luaXQoZGJlbGwpOworCWZzbF9yaW9fcG9ydF93cml0ZV9pbml0KHB3KTsKIAogCXJldHVybiAwOwogZXJyOgotCWlvdW5tYXAocHJpdi0+cmVnc193aW4pOwotCXJlbGVhc2VfcmVzb3VyY2UoJnBvcnQtPmlvcmVzKTsKLWVycl9yZXM6Ci0Ja2ZyZWUocHJpdik7Ci1lcnJfcHJpdjoKLQlrZnJlZShwb3J0KTsKLWVycl9wb3J0OgorCWtmcmVlKHB3KTsKK2Vycl9wdzoKKwlrZnJlZShkYmVsbCk7CitlcnJfZGJlbGw6CisJaW91bm1hcChybXVfcmVnc193aW4pOworZXJyX3JtdToKIAlrZnJlZShvcHMpOwogZXJyX29wczoKKwlpb3VubWFwKHJpb19yZWdzX3dpbik7CitlcnJfcmlvX3JlZ3M6CiAJcmV0dXJuIHJjOwogfQogCkBAIC0xNjMxLDcgKzY1NCw3IEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGZzbF9vZl9yaW9fcnBuX2lkc1tdID0gewogCXsKLQkJLmNvbXBhdGlibGUgPSAiZnNsLHJhcGlkaW8tZGVsdGEiLAorCQkuY29tcGF0aWJsZSA9ICJmc2wsc3JpbyIsCiAJfSwKIAl7fSwKIH07CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3Jpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOGUyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L2ZzbF9yaW8uaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIEZyZWVzY2FsZSBNUEM4NXh4L01QQzg2eHggUmFwaWRJTyBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IDIwMDkgU3lzZ28gQUcKKyAqIFRob21hcyBNb2xsIDx0aG9tYXMubW9sbEBzeXNnby5jb20+CisgKiAtIGZpeGVkIG1haW50ZW5hbmNlIGFjY2VzcyByb3V0aW5lcywgY2hlY2sgZm9yIGFsaWduZWQgYWNjZXNzCisgKgorICogQ29weXJpZ2h0IDIwMDkgSW50ZWdyYXRlZCBEZXZpY2UgVGVjaG5vbG9neSwgSW5jLgorICogQWxleCBCb3VuaW5lIDxhbGV4YW5kcmUuYm91bmluZUBpZHQuY29tPgorICogLSBBZGRlZCBQb3J0LVdyaXRlIG1lc3NhZ2UgaGFuZGxpbmcKKyAqIC0gQWRkZWQgTWFjaGluZSBDaGVjayBleGNlcHRpb24gaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMTAsIDIwMTEgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4KKyAqIFpoYW5nIFdlaSA8d2VpLnpoYW5nQGZyZWVzY2FsZS5jb20+CisgKiBMaWFuIE1pbmdodWFuLUIzMTkzOSA8TWluZ2h1YW4uTGlhbkBmcmVlc2NhbGUuY29tPgorICogTGl1IEdhbmcgPEdhbmcuTGl1QGZyZWVzY2FsZS5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDUgTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyICB0aGUgdGVybXMgb2YgIHRoZSBHTlUgR2VuZXJhbCAgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX19GU0xfUklPX0gKKyNkZWZpbmUgX19GU0xfUklPX0gKKworI2luY2x1ZGUgPGxpbnV4L3Jpby5oPgorI2luY2x1ZGUgPGxpbnV4L3Jpb19kcnYuaD4KKyNpbmNsdWRlIDxsaW51eC9rZmlmby5oPgorCisjZGVmaW5lIFJJT19SRUdTX1dJTihtcG9ydCkJKCgoc3RydWN0IHJpb19wcml2ICopKG1wb3J0LT5wcml2KSktPnJlZ3Nfd2luKQorCisjZGVmaW5lIFJJT19NQUlOVF9XSU5fU0laRQkweDQwMDAwMAorI2RlZmluZSBSSU9fTFRMRURDU1IJCTB4MDYwOAorCisjZGVmaW5lIERPT1JCRUxMX1JPV0FSX0VOCTB4ODAwMDAwMDAKKyNkZWZpbmUgRE9PUkJFTExfUk9XQVJfVEZMT1dMVgkweDA4MDAwMDAwIC8qIGhpZ2hlc3QgcHJpb3JpdHkgbGV2ZWwgKi8KKyNkZWZpbmUgRE9PUkJFTExfUk9XQVJfUENJCTB4MDIwMDAwMDAgLyogUENJIHdpbmRvdyAqLworI2RlZmluZSBET09SQkVMTF9ST1dBUl9OUkVBRAkweDAwMDQwMDAwIC8qIE5SRUFEICovCisjZGVmaW5lIERPT1JCRUxMX1JPV0FSX01BSU5UUkQJMHgwMDA3MDAwMCAgLyogbWFpbnRlbmFuY2UgcmVhZCAqLworI2RlZmluZSBET09SQkVMTF9ST1dBUl9SRVMJMHgwMDAwMjAwMCAvKiB3cnRweTogcmVzZXJ2ZXJkICovCisjZGVmaW5lIERPT1JCRUxMX1JPV0FSX01BSU5UV0QJMHgwMDAwNzAwMAorI2RlZmluZSBET09SQkVMTF9ST1dBUl9TSVpFCTB4MDAwMDAwMGIgLyogd2luZG93IHNpemUgaXMgNGsgKi8KKworI2RlZmluZSBSSU9fQVRNVV9SRUdTX1BPUlQxX09GRlNFVAkweDEwYzAwCisjZGVmaW5lIFJJT19BVE1VX1JFR1NfUE9SVDJfT0ZGU0VUCTB4MTBlMDAKKyNkZWZpbmUgUklPX1NfREJFTExfUkVHU19PRkZTRVQJMHgxMzQwMAorI2RlZmluZSBSSU9fU19QV19SRUdTX09GRlNFVAkweDEzNGUwCisjZGVmaW5lIFJJT19BVE1VX1JFR1NfREJFTExfT0ZGU0VUCTB4MTBDNDAKKworI2RlZmluZSBNQVhfTVNHX1VOSVRfTlVNCTIKKyNkZWZpbmUgTUFYX1BPUlRfTlVNCQk0CisKK3N0cnVjdCByaW9fYXRtdV9yZWdzIHsKKwkgdTMyIHJvd3RhcjsKKwkgdTMyIHJvd3RlYXI7CisJIHUzMiByb3diYXI7CisJIHUzMiBwYWQxOworCSB1MzIgcm93YXI7CisJIHUzMiBwYWQyWzNdOworfTsKKworc3RydWN0IHJpb19kYmVsbF9yaW5nIHsKKwl2b2lkICp2aXJ0OworCWRtYV9hZGRyX3QgcGh5czsKK307CisKK3N0cnVjdCByaW9fcG9ydF93cml0ZV9tc2cgeworCSB2b2lkICp2aXJ0OworCSBkbWFfYWRkcl90IHBoeXM7CisJIHUzMiBtc2dfY291bnQ7CisJIHUzMiBlcnJfY291bnQ7CisJIHUzMiBkaXNjYXJkX2NvdW50OworfTsKKworc3RydWN0IGZzbF9yaW9fZGJlbGwgeworCXN0cnVjdCByaW9fbXBvcnQgKm1wb3J0W01BWF9QT1JUX05VTV07CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCByaW9fZGJlbGxfcmVncyBfX2lvbWVtICpkYmVsbF9yZWdzOworCXN0cnVjdCByaW9fZGJlbGxfcmluZyBkYmVsbF9yaW5nOworCWludCBiZWxsaXJxOworfTsKKworc3RydWN0IGZzbF9yaW9fcHcgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgcmlvX3B3X3JlZ3MgX19pb21lbSAqcHdfcmVnczsKKwlzdHJ1Y3QgcmlvX3BvcnRfd3JpdGVfbXNnIHBvcnRfd3JpdGVfbXNnOworCWludCBwd2lycTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHdfd29yazsKKwlzdHJ1Y3Qga2ZpZm8gcHdfZmlmbzsKKwlzcGlubG9ja190IHB3X2ZpZm9fbG9jazsKK307CisKK3N0cnVjdCByaW9fcHJpdiB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21lbSAqcmVnc193aW47CisJc3RydWN0IHJpb19hdG11X3JlZ3MgX19pb21lbSAqYXRtdV9yZWdzOworCXN0cnVjdCByaW9fYXRtdV9yZWdzIF9faW9tZW0gKm1haW50X2F0bXVfcmVnczsKKwl2b2lkIF9faW9tZW0gKm1haW50X3dpbjsKKwl2b2lkICpybW1faGFuZGxlOyAvKiBSYXBpZElPIG1lc3NhZ2UgbWFuYWdlcih1bml0KSBIYW5kbGUgKi8KK307CisKK2V4dGVybiB2b2lkIF9faW9tZW0gKnJpb19yZWdzX3dpbjsKK2V4dGVybiB2b2lkIF9faW9tZW0gKnJtdV9yZWdzX3dpbjsKKworZXh0ZXJuIHJlc291cmNlX3NpemVfdCByaW9fbGF3X3N0YXJ0OworCitleHRlcm4gc3RydWN0IGZzbF9yaW9fZGJlbGwgKmRiZWxsOworZXh0ZXJuIHN0cnVjdCBmc2xfcmlvX3B3ICpwdzsKKworZXh0ZXJuIGludCBmc2xfcmlvX3NldHVwX3JtdShzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5vZGUpOworZXh0ZXJuIGludCBmc2xfcmlvX3BvcnRfd3JpdGVfaW5pdChzdHJ1Y3QgZnNsX3Jpb19wdyAqcHcpOworZXh0ZXJuIGludCBmc2xfcmlvX3B3X2VuYWJsZShzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgaW50IGVuYWJsZSk7CitleHRlcm4gdm9pZCBmc2xfcmlvX3BvcnRfZXJyb3JfaGFuZGxlcihpbnQgb2Zmc2V0KTsKK2V4dGVybiBpbnQgZnNsX3Jpb19kb29yYmVsbF9pbml0KHN0cnVjdCBmc2xfcmlvX2RiZWxsICpkYmVsbCk7CisKK2V4dGVybiBpbnQgZnNsX3Jpb19kb29yYmVsbF9zZW5kKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LAorCQkJCWludCBpbmRleCwgdTE2IGRlc3RpZCwgdTE2IGRhdGEpOworZXh0ZXJuIGludCBmc2xfYWRkX291dGJfbWVzc2FnZShzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwKKwlzdHJ1Y3QgcmlvX2RldiAqcmRldiwKKwlpbnQgbWJveCwgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuKTsKK2V4dGVybiBpbnQgZnNsX29wZW5fb3V0Yl9tYm94KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LAorCXZvaWQgKmRldl9pZCwgaW50IG1ib3gsIGludCBlbnRyaWVzKTsKK2V4dGVybiB2b2lkIGZzbF9jbG9zZV9vdXRiX21ib3goc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBtYm94KTsKK2V4dGVybiBpbnQgZnNsX29wZW5faW5iX21ib3goc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsCisJdm9pZCAqZGV2X2lkLCBpbnQgbWJveCwgaW50IGVudHJpZXMpOworZXh0ZXJuIHZvaWQgZnNsX2Nsb3NlX2luYl9tYm94KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgbWJveCk7CitleHRlcm4gaW50IGZzbF9hZGRfaW5iX2J1ZmZlcihzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgaW50IG1ib3gsIHZvaWQgKmJ1Zik7CitleHRlcm4gdm9pZCAqZnNsX2dldF9pbmJfbWVzc2FnZShzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgaW50IG1ib3gpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3JtdS5jIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi9mc2xfcm11LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0ODU3OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvZnNsX3JtdS5jCkBAIC0wLDAgKzEsMTEwNCBAQAorLyoKKyAqIEZyZWVzY2FsZSBNUEM4NXh4L01QQzg2eHggUmFwaWRJTyBSTVUgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDA5IFN5c2dvIEFHCisgKiBUaG9tYXMgTW9sbCA8dGhvbWFzLm1vbGxAc3lzZ28uY29tPgorICogLSBmaXhlZCBtYWludGVuYW5jZSBhY2Nlc3Mgcm91dGluZXMsIGNoZWNrIGZvciBhbGlnbmVkIGFjY2VzcworICoKKyAqIENvcHlyaWdodCAyMDA5IEludGVncmF0ZWQgRGV2aWNlIFRlY2hub2xvZ3ksIEluYy4KKyAqIEFsZXggQm91bmluZSA8YWxleGFuZHJlLmJvdW5pbmVAaWR0LmNvbT4KKyAqIC0gQWRkZWQgUG9ydC1Xcml0ZSBtZXNzYWdlIGhhbmRsaW5nCisgKiAtIEFkZGVkIE1hY2hpbmUgQ2hlY2sgZXhjZXB0aW9uIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDEwLCAyMDExIEZyZWVzY2FsZSBTZW1pY29uZHVjdG9yLCBJbmMuCisgKiBaaGFuZyBXZWkgPHdlaS56aGFuZ0BmcmVlc2NhbGUuY29tPgorICogTGlhbiBNaW5naHVhbi1CMzE5MzkgPE1pbmdodWFuLkxpYW5AZnJlZXNjYWxlLmNvbT4KKyAqIExpdSBHYW5nIDxHYW5nLkxpdUBmcmVlc2NhbGUuY29tPgorICoKKyAqIENvcHlyaWdodCAyMDA1IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4KKyAqIE1hdHQgUG9ydGVyIDxtcG9ydGVyQGtlcm5lbC5jcmFzaGluZy5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlICBMaWNlbnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L29mX3BsYXRmb3JtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiZnNsX3Jpby5oIgorCisjZGVmaW5lIEdFVF9STU1fSEFORExFKG1wb3J0KSBcCisJCSgoKHN0cnVjdCByaW9fcHJpdiAqKShtcG9ydC0+cHJpdikpLT5ybW1faGFuZGxlKQorCisvKiBSYXBpZElPIGRlZmluaXRpb24gaXJxLCB3aGljaCByZWFkIGZyb20gT0YtdHJlZSAqLworI2RlZmluZSBJUlFfUklPX1BXKG0pCQkoKChzdHJ1Y3QgZnNsX3Jpb19wdyAqKShtKSktPnB3aXJxKQorI2RlZmluZSBJUlFfUklPX0JFTEwobSkgKCgoc3RydWN0IGZzbF9yaW9fZGJlbGwgKikobSkpLT5iZWxsaXJxKQorI2RlZmluZSBJUlFfUklPX1RYKG0pICgoKHN0cnVjdCBmc2xfcm11ICopKEdFVF9STU1fSEFORExFKG0pKSktPnR4aXJxKQorI2RlZmluZSBJUlFfUklPX1JYKG0pICgoKHN0cnVjdCBmc2xfcm11ICopKEdFVF9STU1fSEFORExFKG0pKSktPnJ4aXJxKQorCisjZGVmaW5lIFJJT19NSU5fVFhfUklOR19TSVpFCTIKKyNkZWZpbmUgUklPX01BWF9UWF9SSU5HX1NJWkUJMjA0OAorI2RlZmluZSBSSU9fTUlOX1JYX1JJTkdfU0laRQkyCisjZGVmaW5lIFJJT19NQVhfUlhfUklOR19TSVpFCTIwNDgKKworI2RlZmluZSBSSU9fSVBXTVJfU0VOCQkweDAwMTAwMDAwCisjZGVmaW5lIFJJT19JUFdNUl9RRklFCQkweDAwMDAwMTAwCisjZGVmaW5lIFJJT19JUFdNUl9FSUUJCTB4MDAwMDAwMjAKKyNkZWZpbmUgUklPX0lQV01SX0NRCQkweDAwMDAwMDAyCisjZGVmaW5lIFJJT19JUFdNUl9QV0UJCTB4MDAwMDAwMDEKKworI2RlZmluZSBSSU9fSVBXU1JfUUYJCTB4MDAxMDAwMDAKKyNkZWZpbmUgUklPX0lQV1NSX1RFCQkweDAwMDAwMDgwCisjZGVmaW5lIFJJT19JUFdTUl9RRkkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgUklPX0lQV1NSX1BXRAkJMHgwMDAwMDAwOAorI2RlZmluZSBSSU9fSVBXU1JfUFdCCQkweDAwMDAwMDA0CisKKyNkZWZpbmUgUklPX0VQV0lTUgkJMHgxMDAxMAorLyogRVBXSVNSIEVycm9yIG1hdGNoIHZhbHVlICovCisjZGVmaW5lIFJJT19FUFdJU1JfUElOVDEJMHg4MDAwMDAwMAorI2RlZmluZSBSSU9fRVBXSVNSX1BJTlQyCTB4NDAwMDAwMDAKKyNkZWZpbmUgUklPX0VQV0lTUl9NVQkJMHgwMDAwMDAwMgorI2RlZmluZSBSSU9fRVBXSVNSX1BXCQkweDAwMDAwMDAxCisKKyNkZWZpbmUgSVBXU1JfQ0xFQVIJCTB4OTgKKyNkZWZpbmUgT01TUl9DTEVBUgkJMHgxY2IzCisjZGVmaW5lIElNU1JfQ0xFQVIJCTB4NDkxCisjZGVmaW5lIElEU1JfQ0xFQVIJCTB4OTEKKyNkZWZpbmUgT0RTUl9DTEVBUgkJMHgxYzAwCisjZGVmaW5lIExUTEVFQ1NSX0VOQUJMRV9BTEwJMHhGRkMwMDBGQworI2RlZmluZSBSSU9fTFRMRUVDU1IJCTB4MDYwYworCisjZGVmaW5lIFJJT19JTTBTUgkJMHg2NAorI2RlZmluZSBSSU9fSU0xU1IJCTB4MTY0CisjZGVmaW5lIFJJT19PTTBTUgkJMHg0CisjZGVmaW5lIFJJT19PTTFTUgkJMHgxMDQKKworI2RlZmluZSBSSU9fREJFTExfV0lOX1NJWkUJMHgxMDAwCisKKyNkZWZpbmUgUklPX01TR19PTVJfTVVJCQkweDAwMDAwMDAyCisjZGVmaW5lIFJJT19NU0dfT1NSX1RFCQkweDAwMDAwMDgwCisjZGVmaW5lIFJJT19NU0dfT1NSX1FPSQkJMHgwMDAwMDAyMAorI2RlZmluZSBSSU9fTVNHX09TUl9RRkkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgUklPX01TR19PU1JfTVVCCQkweDAwMDAwMDA0CisjZGVmaW5lIFJJT19NU0dfT1NSX0VPTUkJMHgwMDAwMDAwMgorI2RlZmluZSBSSU9fTVNHX09TUl9RRUkJCTB4MDAwMDAwMDEKKworI2RlZmluZSBSSU9fTVNHX0lNUl9NSQkJMHgwMDAwMDAwMgorI2RlZmluZSBSSU9fTVNHX0lTUl9URQkJMHgwMDAwMDA4MAorI2RlZmluZSBSSU9fTVNHX0lTUl9RRkkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgUklPX01TR19JU1JfRElRSQkweDAwMDAwMDAxCisKKyNkZWZpbmUgUklPX01TR19ERVNDX1NJWkUJMzIKKyNkZWZpbmUgUklPX01TR19CVUZGRVJfU0laRQk0MDk2CisKKyNkZWZpbmUgRE9PUkJFTExfRE1SX0RJCQkweDAwMDAwMDAyCisjZGVmaW5lIERPT1JCRUxMX0RTUl9URQkJMHgwMDAwMDA4MAorI2RlZmluZSBET09SQkVMTF9EU1JfUUZJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRE9PUkJFTExfRFNSX0RJUUkJMHgwMDAwMDAwMQorI2RlZmluZSBET09SQkVMTF9USURfT0ZGU0VUCTB4MDIKKyNkZWZpbmUgRE9PUkJFTExfU0lEX09GRlNFVAkweDA0CisjZGVmaW5lIERPT1JCRUxMX0lORk9fT0ZGU0VUCTB4MDYKKworI2RlZmluZSBET09SQkVMTF9NRVNTQUdFX1NJWkUJMHgwOAorI2RlZmluZSBEQkVMTF9TSUQoeCkJCSgqKHUxNiAqKSh4ICsgRE9PUkJFTExfU0lEX09GRlNFVCkpCisjZGVmaW5lIERCRUxMX1RJRCh4KQkJKCoodTE2ICopKHggKyBET09SQkVMTF9USURfT0ZGU0VUKSkKKyNkZWZpbmUgREJFTExfSU5GKHgpCQkoKih1MTYgKikoeCArIERPT1JCRUxMX0lORk9fT0ZGU0VUKSkKKworc3RydWN0IHJpb19tc2dfcmVncyB7CisJdTMyIG9tcjsKKwl1MzIgb3NyOworCXUzMiBwYWQxOworCXUzMiBvZHFkcGFyOworCXUzMiBwYWQyOworCXUzMiBvc2FyOworCXUzMiBvZHByOworCXUzMiBvZGF0cjsKKwl1MzIgb2RjcjsKKwl1MzIgcGFkMzsKKwl1MzIgb2RxZXBhcjsKKwl1MzIgcGFkNFsxM107CisJdTMyIGltcjsKKwl1MzIgaXNyOworCXUzMiBwYWQ1OworCXUzMiBpZnFkcGFyOworCXUzMiBwYWQ2OworCXUzMiBpZnFlcGFyOworfTsKKworc3RydWN0IHJpb19kYmVsbF9yZWdzIHsKKwl1MzIgb2RtcjsKKwl1MzIgb2RzcjsKKwl1MzIgcGFkMVs0XTsKKwl1MzIgb2RkcHI7CisJdTMyIG9kZGF0cjsKKwl1MzIgcGFkMlszXTsKKwl1MzIgb2RyZXRjcjsKKwl1MzIgcGFkM1sxMl07CisJdTMyIGRtcjsKKwl1MzIgZHNyOworCXUzMiBwYWQ0OworCXUzMiBkcWRwYXI7CisJdTMyIHBhZDU7CisJdTMyIGRxZXBhcjsKK307CisKK3N0cnVjdCByaW9fcHdfcmVncyB7CisJdTMyIHB3bXI7CisJdTMyIHB3c3I7CisJdTMyIGVwd3FiYXI7CisJdTMyIHB3cWJhcjsKK307CisKKworc3RydWN0IHJpb190eF9kZXNjIHsKKwl1MzIgcGFkMTsKKwl1MzIgc2FkZHI7CisJdTMyIGRwb3J0OworCXUzMiBkYXR0cjsKKwl1MzIgcGFkMjsKKwl1MzIgcGFkMzsKKwl1MzIgZHdjbnQ7CisJdTMyIHBhZDQ7Cit9OworCitzdHJ1Y3QgcmlvX21zZ190eF9yaW5nIHsKKwl2b2lkICp2aXJ0OworCWRtYV9hZGRyX3QgcGh5czsKKwl2b2lkICp2aXJ0X2J1ZmZlcltSSU9fTUFYX1RYX1JJTkdfU0laRV07CisJZG1hX2FkZHJfdCBwaHlzX2J1ZmZlcltSSU9fTUFYX1RYX1JJTkdfU0laRV07CisJaW50IHR4X3Nsb3Q7CisJaW50IHNpemU7CisJdm9pZCAqZGV2X2lkOworfTsKKworc3RydWN0IHJpb19tc2dfcnhfcmluZyB7CisJdm9pZCAqdmlydDsKKwlkbWFfYWRkcl90IHBoeXM7CisJdm9pZCAqdmlydF9idWZmZXJbUklPX01BWF9SWF9SSU5HX1NJWkVdOworCWludCByeF9zbG90OworCWludCBzaXplOworCXZvaWQgKmRldl9pZDsKK307CisKK3N0cnVjdCBmc2xfcm11IHsKKwlzdHJ1Y3QgcmlvX21zZ19yZWdzIF9faW9tZW0gKm1zZ19yZWdzOworCXN0cnVjdCByaW9fbXNnX3R4X3JpbmcgbXNnX3R4X3Jpbmc7CisJc3RydWN0IHJpb19tc2dfcnhfcmluZyBtc2dfcnhfcmluZzsKKwlpbnQgdHhpcnE7CisJaW50IHJ4aXJxOworfTsKKworLyoqCisgKiBmc2xfcmlvX3R4X2hhbmRsZXIgLSBNUEM4NXh4IG91dGJvdW5kIG1lc3NhZ2UgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpcnE6IExpbnV4IGludGVycnVwdCBudW1iZXIKKyAqIEBkZXZfaW5zdGFuY2U6IFBvaW50ZXIgdG8gaW50ZXJydXB0LXNwZWNpZmljIGRhdGEKKyAqCisgKiBIYW5kbGVzIG91dGJvdW5kIG1lc3NhZ2UgaW50ZXJydXB0cy4gRXhlY3V0ZXMgYSByZWdpc3RlciBvdXRib3VuZAorICogbWFpbGJveCBldmVudCBoYW5kbGVyIGFuZCBhY2tzIHRoZSBpbnRlcnJ1cHQgb2NjdXJyZW5jZS4KKyAqLworc3RhdGljIGlycXJldHVybl90Citmc2xfcmlvX3R4X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCWludCBvc3I7CisJc3RydWN0IHJpb19tcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlvX21wb3J0ICopZGV2X2luc3RhbmNlOworCXN0cnVjdCBmc2xfcm11ICpybXUgPSBHRVRfUk1NX0hBTkRMRShwb3J0KTsKKworCW9zciA9IGluX2JlMzIoJnJtdS0+bXNnX3JlZ3MtPm9zcik7CisKKwlpZiAob3NyICYgUklPX01TR19PU1JfVEUpIHsKKwkJcHJfaW5mbygiUklPOiBvdXRib3VuZCBtZXNzYWdlIHRyYW5zbWlzc2lvbiBlcnJvclxuIik7CisJCW91dF9iZTMyKCZybXUtPm1zZ19yZWdzLT5vc3IsIFJJT19NU0dfT1NSX1RFKTsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKG9zciAmIFJJT19NU0dfT1NSX1FPSSkgeworCQlwcl9pbmZvKCJSSU86IG91dGJvdW5kIG1lc3NhZ2UgcXVldWUgb3ZlcmZsb3dcbiIpOworCQlvdXRfYmUzMigmcm11LT5tc2dfcmVncy0+b3NyLCBSSU9fTVNHX09TUl9RT0kpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAob3NyICYgUklPX01TR19PU1JfRU9NSSkgeworCQl1MzIgZHFwID0gaW5fYmUzMigmcm11LT5tc2dfcmVncy0+b2RxZHBhcik7CisJCWludCBzbG90ID0gKGRxcCAtIHJtdS0+bXNnX3R4X3JpbmcucGh5cykgPj4gNTsKKwkJaWYgKHBvcnQtPm91dGJfbXNnWzBdLm1jYmFjayAhPSBOVUxMKSB7CisJCQlwb3J0LT5vdXRiX21zZ1swXS5tY2JhY2socG9ydCwgcm11LT5tc2dfdHhfcmluZy5kZXZfaWQsCisJCQkJCS0xLAorCQkJCQlzbG90KTsKKwkJfQorCQkvKiBBY2sgdGhlIGVuZC1vZi1tZXNzYWdlIGludGVycnVwdCAqLworCQlvdXRfYmUzMigmcm11LT5tc2dfcmVncy0+b3NyLCBSSU9fTVNHX09TUl9FT01JKTsKKwl9CisKK291dDoKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qKgorICogZnNsX3Jpb19yeF9oYW5kbGVyIC0gTVBDODV4eCBpbmJvdW5kIG1lc3NhZ2UgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpcnE6IExpbnV4IGludGVycnVwdCBudW1iZXIKKyAqIEBkZXZfaW5zdGFuY2U6IFBvaW50ZXIgdG8gaW50ZXJydXB0LXNwZWNpZmljIGRhdGEKKyAqCisgKiBIYW5kbGVzIGluYm91bmQgbWVzc2FnZSBpbnRlcnJ1cHRzLiBFeGVjdXRlcyBhIHJlZ2lzdGVyZWQgaW5ib3VuZAorICogbWFpbGJveCBldmVudCBoYW5kbGVyIGFuZCBhY2tzIHRoZSBpbnRlcnJ1cHQgb2NjdXJyZW5jZS4KKyAqLworc3RhdGljIGlycXJldHVybl90Citmc2xfcmlvX3J4X2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCWludCBpc3I7CisJc3RydWN0IHJpb19tcG9ydCAqcG9ydCA9IChzdHJ1Y3QgcmlvX21wb3J0ICopZGV2X2luc3RhbmNlOworCXN0cnVjdCBmc2xfcm11ICpybXUgPSBHRVRfUk1NX0hBTkRMRShwb3J0KTsKKworCWlzciA9IGluX2JlMzIoJnJtdS0+bXNnX3JlZ3MtPmlzcik7CisKKwlpZiAoaXNyICYgUklPX01TR19JU1JfVEUpIHsKKwkJcHJfaW5mbygiUklPOiBpbmJvdW5kIG1lc3NhZ2UgcmVjZXB0aW9uIGVycm9yXG4iKTsKKwkJb3V0X2JlMzIoKHZvaWQgKikmcm11LT5tc2dfcmVncy0+aXNyLCBSSU9fTVNHX0lTUl9URSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFhYWCBOZWVkIHRvIGNoZWNrL2Rpc3BhdGNoIHVudGlsIHF1ZXVlIGVtcHR5ICovCisJaWYgKGlzciAmIFJJT19NU0dfSVNSX0RJUUkpIHsKKwkJLyoKKwkJKiBDYW4gcmVjZWl2ZSBtZXNzYWdlcyBmb3IgYW55IG1haWxib3gvbGV0dGVyIHRvIHRoYXQKKwkJKiBtYWlsYm94IGRlc3RpbmF0aW9uLiBTbywgbWFrZSB0aGUgY2FsbGJhY2sgd2l0aCBhbgorCQkqIHVua25vd24vaW52YWxpZCBtYWlsYm94IG51bWJlciBhcmd1bWVudC4KKwkJKi8KKwkJaWYgKHBvcnQtPmluYl9tc2dbMF0ubWNiYWNrICE9IE5VTEwpCisJCQlwb3J0LT5pbmJfbXNnWzBdLm1jYmFjayhwb3J0LCBybXUtPm1zZ19yeF9yaW5nLmRldl9pZCwKKwkJCQktMSwKKwkJCQktMSk7CisKKwkJLyogQWNrIHRoZSBxdWV1ZWluZyBpbnRlcnJ1cHQgKi8KKwkJb3V0X2JlMzIoJnJtdS0+bXNnX3JlZ3MtPmlzciwgUklPX01TR19JU1JfRElRSSk7CisJfQorCitvdXQ6CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioKKyAqIGZzbF9yaW9fZGJlbGxfaGFuZGxlciAtIE1QQzg1eHggZG9vcmJlbGwgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpcnE6IExpbnV4IGludGVycnVwdCBudW1iZXIKKyAqIEBkZXZfaW5zdGFuY2U6IFBvaW50ZXIgdG8gaW50ZXJydXB0LXNwZWNpZmljIGRhdGEKKyAqCisgKiBIYW5kbGVzIGRvb3JiZWxsIGludGVycnVwdHMuIFBhcnNlcyBhIGxpc3Qgb2YgcmVnaXN0ZXJlZAorICogZG9vcmJlbGwgZXZlbnQgaGFuZGxlcnMgYW5kIGV4ZWN1dGVzIGEgbWF0Y2hpbmcgZXZlbnQgaGFuZGxlci4KKyAqLworc3RhdGljIGlycXJldHVybl90Citmc2xfcmlvX2RiZWxsX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCWludCBkc3I7CisJc3RydWN0IGZzbF9yaW9fZGJlbGwgKmZzbF9kYmVsbCA9IChzdHJ1Y3QgZnNsX3Jpb19kYmVsbCAqKWRldl9pbnN0YW5jZTsKKwlpbnQgaTsKKworCWRzciA9IGluX2JlMzIoJmZzbF9kYmVsbC0+ZGJlbGxfcmVncy0+ZHNyKTsKKworCWlmIChkc3IgJiBET09SQkVMTF9EU1JfVEUpIHsKKwkJcHJfaW5mbygiUklPOiBkb29yYmVsbCByZWNlcHRpb24gZXJyb3JcbiIpOworCQlvdXRfYmUzMigmZnNsX2RiZWxsLT5kYmVsbF9yZWdzLT5kc3IsIERPT1JCRUxMX0RTUl9URSk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChkc3IgJiBET09SQkVMTF9EU1JfUUZJKSB7CisJCXByX2luZm8oIlJJTzogZG9vcmJlbGwgcXVldWUgZnVsbFxuIik7CisJCW91dF9iZTMyKCZmc2xfZGJlbGwtPmRiZWxsX3JlZ3MtPmRzciwgRE9PUkJFTExfRFNSX1FGSSk7CisJfQorCisJLyogWFhYIE5lZWQgdG8gY2hlY2svZGlzcGF0Y2ggdW50aWwgcXVldWUgZW1wdHkgKi8KKwlpZiAoZHNyICYgRE9PUkJFTExfRFNSX0RJUUkpIHsKKwkJdTMyIGRtc2cgPQorCQkJKHUzMikgZnNsX2RiZWxsLT5kYmVsbF9yaW5nLnZpcnQgKworCQkJKGluX2JlMzIoJmZzbF9kYmVsbC0+ZGJlbGxfcmVncy0+ZHFkcGFyKSAmIDB4ZmZmKTsKKwkJc3RydWN0IHJpb19kYmVsbCAqZGJlbGw7CisJCWludCBmb3VuZCA9IDA7CisKKwkJcHJfZGVidWcKKwkJCSgiUklPOiBwcm9jZXNzaW5nIGRvb3JiZWxsLCIKKwkJCSIgc2lkICUyLjJ4IHRpZCAlMi4yeCBpbmZvICU0LjR4XG4iLAorCQkJREJFTExfU0lEKGRtc2cpLCBEQkVMTF9USUQoZG1zZyksIERCRUxMX0lORihkbXNnKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9QT1JUX05VTTsgaSsrKSB7CisJCQlpZiAoZnNsX2RiZWxsLT5tcG9ydFtpXSkgeworCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGJlbGwsCisJCQkJCSZmc2xfZGJlbGwtPm1wb3J0W2ldLT5kYmVsbHMsIG5vZGUpIHsKKwkJCQkJaWYgKChkYmVsbC0+cmVzLT5zdGFydAorCQkJCQkJPD0gREJFTExfSU5GKGRtc2cpKQorCQkJCQkJJiYgKGRiZWxsLT5yZXMtPmVuZAorCQkJCQkJPj0gREJFTExfSU5GKGRtc2cpKSkgeworCQkJCQkJZm91bmQgPSAxOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGZvdW5kICYmIGRiZWxsLT5kaW5iKSB7CisJCQkJCWRiZWxsLT5kaW5iKGZzbF9kYmVsbC0+bXBvcnRbaV0sCisJCQkJCQlkYmVsbC0+ZGV2X2lkLCBEQkVMTF9TSUQoZG1zZyksCisJCQkJCQlEQkVMTF9USUQoZG1zZyksCisJCQkJCQlEQkVMTF9JTkYoZG1zZykpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoIWZvdW5kKSB7CisJCQlwcl9kZWJ1ZworCQkJCSgiUklPOiBzcHVyaW91cyBkb29yYmVsbCwiCisJCQkJIiBzaWQgJTIuMnggdGlkICUyLjJ4IGluZm8gJTQuNHhcbiIsCisJCQkJREJFTExfU0lEKGRtc2cpLCBEQkVMTF9USUQoZG1zZyksCisJCQkJREJFTExfSU5GKGRtc2cpKTsKKwkJfQorCQlzZXRiaXRzMzIoJmZzbF9kYmVsbC0+ZGJlbGxfcmVncy0+ZG1yLCBET09SQkVMTF9ETVJfREkpOworCQlvdXRfYmUzMigmZnNsX2RiZWxsLT5kYmVsbF9yZWdzLT5kc3IsIERPT1JCRUxMX0RTUl9ESVFJKTsKKwl9CisKK291dDoKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3ZvaWQgbXNnX3VuaXRfZXJyb3JfaGFuZGxlcih2b2lkKQoreworCisJLypYWFg6IEVycm9yIHJlY292ZXJ5IGlzIG5vdCBpbXBsZW1lbnRlZCwgd2UganVzdCBjbGVhciBlcnJvcnMgKi8KKwlvdXRfYmUzMigodTMyICopKHJpb19yZWdzX3dpbiArIFJJT19MVExFRENTUiksIDApOworCisJb3V0X2JlMzIoKHUzMiAqKShybXVfcmVnc193aW4gKyBSSU9fSU0wU1IpLCBJTVNSX0NMRUFSKTsKKwlvdXRfYmUzMigodTMyICopKHJtdV9yZWdzX3dpbiArIFJJT19JTTFTUiksIElNU1JfQ0xFQVIpOworCW91dF9iZTMyKCh1MzIgKikocm11X3JlZ3Nfd2luICsgUklPX09NMFNSKSwgT01TUl9DTEVBUik7CisJb3V0X2JlMzIoKHUzMiAqKShybXVfcmVnc193aW4gKyBSSU9fT00xU1IpLCBPTVNSX0NMRUFSKTsKKworCW91dF9iZTMyKCZkYmVsbC0+ZGJlbGxfcmVncy0+b2RzciwgT0RTUl9DTEVBUik7CisJb3V0X2JlMzIoJmRiZWxsLT5kYmVsbF9yZWdzLT5kc3IsIElEU1JfQ0xFQVIpOworCisJb3V0X2JlMzIoJnB3LT5wd19yZWdzLT5wd3NyLCBJUFdTUl9DTEVBUik7Cit9CisKKy8qKgorICogZnNsX3Jpb19wb3J0X3dyaXRlX2hhbmRsZXIgLSBNUEM4NXh4IHBvcnQgd3JpdGUgaW50ZXJydXB0IGhhbmRsZXIKKyAqIEBpcnE6IExpbnV4IGludGVycnVwdCBudW1iZXIKKyAqIEBkZXZfaW5zdGFuY2U6IFBvaW50ZXIgdG8gaW50ZXJydXB0LXNwZWNpZmljIGRhdGEKKyAqCisgKiBIYW5kbGVzIHBvcnQgd3JpdGUgaW50ZXJydXB0cy4gUGFyc2VzIGEgbGlzdCBvZiByZWdpc3RlcmVkCisgKiBwb3J0IHdyaXRlIGV2ZW50IGhhbmRsZXJzIGFuZCBleGVjdXRlcyBhIG1hdGNoaW5nIGV2ZW50IGhhbmRsZXIuCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAorZnNsX3Jpb19wb3J0X3dyaXRlX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKQoreworCXUzMiBpcHdtciwgaXB3c3I7CisJc3RydWN0IGZzbF9yaW9fcHcgKnB3ID0gKHN0cnVjdCBmc2xfcmlvX3B3ICopZGV2X2luc3RhbmNlOworCXUzMiBlcHdpc3IsIHRtcDsKKworCWVwd2lzciA9IGluX2JlMzIocmlvX3JlZ3Nfd2luICsgUklPX0VQV0lTUik7CisJaWYgKCEoZXB3aXNyICYgUklPX0VQV0lTUl9QVykpCisJCWdvdG8gcHdfZG9uZTsKKworCWlwd21yID0gaW5fYmUzMigmcHctPnB3X3JlZ3MtPnB3bXIpOworCWlwd3NyID0gaW5fYmUzMigmcHctPnB3X3JlZ3MtPnB3c3IpOworCisjaWZkZWYgREVCVUdfUFcKKwlwcl9kZWJ1ZygiUFcgSW50LT5JUFdNUjogMHglMDh4IElQV1NSOiAweCUwOHggKCIsIGlwd21yLCBpcHdzcik7CisJaWYgKGlwd3NyICYgUklPX0lQV1NSX1FGKQorCQlwcl9kZWJ1ZygiIFFGIik7CisJaWYgKGlwd3NyICYgUklPX0lQV1NSX1RFKQorCQlwcl9kZWJ1ZygiIFRFIik7CisJaWYgKGlwd3NyICYgUklPX0lQV1NSX1FGSSkKKwkJcHJfZGVidWcoIiBRRkkiKTsKKwlpZiAoaXB3c3IgJiBSSU9fSVBXU1JfUFdEKQorCQlwcl9kZWJ1ZygiIFBXRCIpOworCWlmIChpcHdzciAmIFJJT19JUFdTUl9QV0IpCisJCXByX2RlYnVnKCIgUFdCIik7CisJcHJfZGVidWcoIiApXG4iKTsKKyNlbmRpZgorCS8qIFNjaGVkdWxlIGRlZmVycmVkIHByb2Nlc3NpbmcgaWYgUFcgd2FzIHJlY2VpdmVkICovCisJaWYgKGlwd3NyICYgUklPX0lQV1NSX1FGSSkgeworCQkvKiBTYXZlIFBXIG1lc3NhZ2UgKGlmIHRoZXJlIGlzIHJvb20gaW4gRklGTyksCisJCSAqIG90aGVyd2lzZSBkaXNjYXJkIGl0LgorCQkgKi8KKwkJaWYgKGtmaWZvX2F2YWlsKCZwdy0+cHdfZmlmbykgPj0gUklPX1BXX01TR19TSVpFKSB7CisJCQlwdy0+cG9ydF93cml0ZV9tc2cubXNnX2NvdW50Kys7CisJCQlrZmlmb19pbigmcHctPnB3X2ZpZm8sIHB3LT5wb3J0X3dyaXRlX21zZy52aXJ0LAorCQkJCSBSSU9fUFdfTVNHX1NJWkUpOworCQl9IGVsc2UgeworCQkJcHctPnBvcnRfd3JpdGVfbXNnLmRpc2NhcmRfY291bnQrKzsKKwkJCXByX2RlYnVnKCJSSU86IElTUiBEaXNjYXJkZWQgUG9ydC1Xcml0ZSBNc2cocykgKCVkKVxuIiwKKwkJCQkgcHctPnBvcnRfd3JpdGVfbXNnLmRpc2NhcmRfY291bnQpOworCQl9CisJCS8qIENsZWFyIGludGVycnVwdCBhbmQgaXNzdWUgQ2xlYXIgUXVldWUgY29tbWFuZC4gVGhpcyBhbGxvd3MKKwkJICogYW5vdGhlciBwb3J0LXdyaXRlIHRvIGJlIHJlY2VpdmVkLgorCQkgKi8KKwkJb3V0X2JlMzIoJnB3LT5wd19yZWdzLT5wd3NyLAlSSU9fSVBXU1JfUUZJKTsKKwkJb3V0X2JlMzIoJnB3LT5wd19yZWdzLT5wd21yLCBpcHdtciB8IFJJT19JUFdNUl9DUSk7CisKKwkJc2NoZWR1bGVfd29yaygmcHctPnB3X3dvcmspOworCX0KKworCWlmICgoaXB3bXIgJiBSSU9fSVBXTVJfRUlFKSAmJiAoaXB3c3IgJiBSSU9fSVBXU1JfVEUpKSB7CisJCXB3LT5wb3J0X3dyaXRlX21zZy5lcnJfY291bnQrKzsKKwkJcHJfZGVidWcoIlJJTzogUG9ydC1Xcml0ZSBUcmFuc2FjdGlvbiBFcnIgKCVkKVxuIiwKKwkJCSBwdy0+cG9ydF93cml0ZV9tc2cuZXJyX2NvdW50KTsKKwkJLyogQ2xlYXIgVHJhbnNhY3Rpb24gRXJyb3I6IHBvcnQtd3JpdGUgY29udHJvbGxlciBzaG91bGQgYmUKKwkJICogZGlzYWJsZWQgd2hlbiBjbGVhcmluZyB0aGlzIGVycm9yCisJCSAqLworCQlvdXRfYmUzMigmcHctPnB3X3JlZ3MtPnB3bXIsIGlwd21yICYgflJJT19JUFdNUl9QV0UpOworCQlvdXRfYmUzMigmcHctPnB3X3JlZ3MtPnB3c3IsCVJJT19JUFdTUl9URSk7CisJCW91dF9iZTMyKCZwdy0+cHdfcmVncy0+cHdtciwgaXB3bXIpOworCX0KKworCWlmIChpcHdzciAmIFJJT19JUFdTUl9QV0QpIHsKKwkJcHctPnBvcnRfd3JpdGVfbXNnLmRpc2NhcmRfY291bnQrKzsKKwkJcHJfZGVidWcoIlJJTzogUG9ydCBEaXNjYXJkZWQgUG9ydC1Xcml0ZSBNc2cocykgKCVkKVxuIiwKKwkJCSBwdy0+cG9ydF93cml0ZV9tc2cuZGlzY2FyZF9jb3VudCk7CisJCW91dF9iZTMyKCZwdy0+cHdfcmVncy0+cHdzciwgUklPX0lQV1NSX1BXRCk7CisJfQorCitwd19kb25lOgorCWlmIChlcHdpc3IgJiBSSU9fRVBXSVNSX1BJTlQxKSB7CisJCXRtcCA9IGluX2JlMzIocmlvX3JlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKTsKKwkJcHJfZGVidWcoIlJJT19MVExFRENTUiA9IDB4JXhcbiIsIHRtcCk7CisJCWZzbF9yaW9fcG9ydF9lcnJvcl9oYW5kbGVyKDApOworCX0KKworCWlmIChlcHdpc3IgJiBSSU9fRVBXSVNSX1BJTlQyKSB7CisJCXRtcCA9IGluX2JlMzIocmlvX3JlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKTsKKwkJcHJfZGVidWcoIlJJT19MVExFRENTUiA9IDB4JXhcbiIsIHRtcCk7CisJCWZzbF9yaW9fcG9ydF9lcnJvcl9oYW5kbGVyKDEpOworCX0KKworCWlmIChlcHdpc3IgJiBSSU9fRVBXSVNSX01VKSB7CisJCXRtcCA9IGluX2JlMzIocmlvX3JlZ3Nfd2luICsgUklPX0xUTEVEQ1NSKTsKKwkJcHJfZGVidWcoIlJJT19MVExFRENTUiA9IDB4JXhcbiIsIHRtcCk7CisJCW1zZ191bml0X2Vycm9yX2hhbmRsZXIoKTsKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIGZzbF9wd19kcGMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBmc2xfcmlvX3B3ICpwdyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZnNsX3Jpb19wdywgcHdfd29yayk7CisJdTMyIG1zZ19idWZmZXJbUklPX1BXX01TR19TSVpFL3NpemVvZih1MzIpXTsKKworCS8qCisJICogUHJvY2VzcyBwb3J0LXdyaXRlIG1lc3NhZ2VzCisJICovCisJd2hpbGUgKGtmaWZvX291dF9zcGlubG9ja2VkKCZwdy0+cHdfZmlmbywgKHVuc2lnbmVkIGNoYXIgKiltc2dfYnVmZmVyLAorCQkJIFJJT19QV19NU0dfU0laRSwgJnB3LT5wd19maWZvX2xvY2spKSB7CisJCS8qIFByb2Nlc3Mgb25lIG1lc3NhZ2UgKi8KKyNpZmRlZiBERUJVR19QVworCQl7CisJCXUzMiBpOworCQlwcl9kZWJ1ZygiJXMgOiBQb3J0LVdyaXRlIE1lc3NhZ2U6IiwgX19mdW5jX18pOworCQlmb3IgKGkgPSAwOyBpIDwgUklPX1BXX01TR19TSVpFL3NpemVvZih1MzIpOyBpKyspIHsKKwkJCWlmICgoaSU0KSA9PSAwKQorCQkJCXByX2RlYnVnKCJcbjB4JTAyeDogMHglMDh4IiwgaSo0LAorCQkJCQkgbXNnX2J1ZmZlcltpXSk7CisJCQllbHNlCisJCQkJcHJfZGVidWcoIiAweCUwOHgiLCBtc2dfYnVmZmVyW2ldKTsKKwkJfQorCQlwcl9kZWJ1ZygiXG4iKTsKKwkJfQorI2VuZGlmCisJCS8qIFBhc3MgdGhlIHBvcnQtd3JpdGUgbWVzc2FnZSB0byBSSU8gY29yZSBmb3IgcHJvY2Vzc2luZyAqLworCQlyaW9faW5iX3B3cml0ZV9oYW5kbGVyKCh1bmlvbiByaW9fcHdfbXNnICopbXNnX2J1ZmZlcik7CisJfQorfQorCisvKioKKyAqIGZzbF9yaW9fcHdfZW5hYmxlIC0gZW5hYmxlL2Rpc2FibGUgcG9ydC13cml0ZSBpbnRlcmZhY2UgaW5pdAorICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIHBvcnQgd3JpdGUgdW5pdAorICogQGVuYWJsZTogICAgMT1lbmFibGU7IDA9ZGlzYWJsZSBwb3J0LXdyaXRlIG1lc3NhZ2UgaGFuZGxpbmcKKyAqLworaW50IGZzbF9yaW9fcHdfZW5hYmxlKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgZW5hYmxlKQoreworCXUzMiBydmFsOworCisJcnZhbCA9IGluX2JlMzIoJnB3LT5wd19yZWdzLT5wd21yKTsKKworCWlmIChlbmFibGUpCisJCXJ2YWwgfD0gUklPX0lQV01SX1BXRTsKKwllbHNlCisJCXJ2YWwgJj0gflJJT19JUFdNUl9QV0U7CisKKwlvdXRfYmUzMigmcHctPnB3X3JlZ3MtPnB3bXIsIHJ2YWwpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZnNsX3Jpb19wb3J0X3dyaXRlX2luaXQgLSBNUEM4NXh4IHBvcnQgd3JpdGUgaW50ZXJmYWNlIGluaXQKKyAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBwb3J0IHdyaXRlIHVuaXQKKyAqCisgKiBJbml0aWFsaXplcyBwb3J0IHdyaXRlIHVuaXQgaGFyZHdhcmUgYW5kIERNQSBidWZmZXIKKyAqIHJpbmcuIENhbGxlZCBmcm9tIGZzbF9yaW9fc2V0dXAoKS4gUmV0dXJucyAlMCBvbiBzdWNjZXNzCisgKiBvciAlLUVOT01FTSBvbiBmYWlsdXJlLgorICovCisKK2ludCBmc2xfcmlvX3BvcnRfd3JpdGVfaW5pdChzdHJ1Y3QgZnNsX3Jpb19wdyAqcHcpCit7CisJaW50IHJjID0gMDsKKworCS8qIEZvbGxvd2luZyBjb25maWd1cmF0aW9ucyByZXF1aXJlIGEgZGlzYWJsZWQgcG9ydCB3cml0ZSBjb250cm9sbGVyICovCisJb3V0X2JlMzIoJnB3LT5wd19yZWdzLT5wd21yLAorCQkgaW5fYmUzMigmcHctPnB3X3JlZ3MtPnB3bXIpICYgflJJT19JUFdNUl9QV0UpOworCisJLyogSW5pdGlhbGl6ZSBwb3J0IHdyaXRlICovCisJcHctPnBvcnRfd3JpdGVfbXNnLnZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQocHctPmRldiwKKwkJCQkJUklPX1BXX01TR19TSVpFLAorCQkJCQkmcHctPnBvcnRfd3JpdGVfbXNnLnBoeXMsIEdGUF9LRVJORUwpOworCWlmICghcHctPnBvcnRfd3JpdGVfbXNnLnZpcnQpIHsKKwkJcHJfZXJyKCJSSU86IHVuYWJsZSBhbGxvY2F0ZSBwb3J0IHdyaXRlIHF1ZXVlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcHctPnBvcnRfd3JpdGVfbXNnLmVycl9jb3VudCA9IDA7CisJcHctPnBvcnRfd3JpdGVfbXNnLmRpc2NhcmRfY291bnQgPSAwOworCisJLyogUG9pbnQgZGVxdWV1ZS9lbnF1ZXVlIHBvaW50ZXJzIGF0IGZpcnN0IGVudHJ5ICovCisJb3V0X2JlMzIoJnB3LT5wd19yZWdzLT5lcHdxYmFyLCAwKTsKKwlvdXRfYmUzMigmcHctPnB3X3JlZ3MtPnB3cWJhciwgKHUzMikgcHctPnBvcnRfd3JpdGVfbXNnLnBoeXMpOworCisJcHJfZGVidWcoIkVJUFdRQkFSOiAweCUwOHggSVBXUUJBUjogMHglMDh4XG4iLAorCQkgaW5fYmUzMigmcHctPnB3X3JlZ3MtPmVwd3FiYXIpLAorCQkgaW5fYmUzMigmcHctPnB3X3JlZ3MtPnB3cWJhcikpOworCisJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyBJUFdTUiAqLworCW91dF9iZTMyKCZwdy0+cHdfcmVncy0+cHdzciwKKwkJIChSSU9fSVBXU1JfVEUgfCBSSU9fSVBXU1JfUUZJIHwgUklPX0lQV1NSX1BXRCkpOworCisJLyogQ29uZmlndXJlIHBvcnQgd3JpdGUgY29udG9sbGVyIGZvciBzbm9vcGluZyBlbmFibGUgYWxsIHJlcG9ydGluZywKKwkgICBjbGVhciBxdWV1ZSBmdWxsICovCisJb3V0X2JlMzIoJnB3LT5wd19yZWdzLT5wd21yLAorCQkgUklPX0lQV01SX1NFTiB8IFJJT19JUFdNUl9RRklFIHwgUklPX0lQV01SX0VJRSB8IFJJT19JUFdNUl9DUSk7CisKKworCS8qIEhvb2sgdXAgcG9ydC13cml0ZSBoYW5kbGVyICovCisJcmMgPSByZXF1ZXN0X2lycShJUlFfUklPX1BXKHB3KSwgZnNsX3Jpb19wb3J0X3dyaXRlX2hhbmRsZXIsCisJCQlJUlFGX1NIQVJFRCwgInBvcnQtd3JpdGUiLCAodm9pZCAqKXB3KTsKKwlpZiAocmMgPCAwKSB7CisJCXByX2VycigiTVBDODV4eCBSSU86IHVuYWJsZSB0byByZXF1ZXN0IGluYm91bmQgZG9vcmJlbGwgaXJxIik7CisJCWdvdG8gZXJyX291dDsKKwl9CisJLyogRW5hYmxlIEVycm9yIEludGVycnVwdCAqLworCW91dF9iZTMyKCh1MzIgKikocmlvX3JlZ3Nfd2luICsgUklPX0xUTEVFQ1NSKSwgTFRMRUVDU1JfRU5BQkxFX0FMTCk7CisKKwlJTklUX1dPUksoJnB3LT5wd193b3JrLCBmc2xfcHdfZHBjKTsKKwlzcGluX2xvY2tfaW5pdCgmcHctPnB3X2ZpZm9fbG9jayk7CisJaWYgKGtmaWZvX2FsbG9jKCZwdy0+cHdfZmlmbywgUklPX1BXX01TR19TSVpFICogMzIsIEdGUF9LRVJORUwpKSB7CisJCXByX2VycigiRklGTyBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJjID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0X2lycTsKKwl9CisKKwlwcl9kZWJ1ZygiSVBXTVI6IDB4JTA4eCBJUFdTUjogMHglMDh4XG4iLAorCQkgaW5fYmUzMigmcHctPnB3X3JlZ3MtPnB3bXIpLAorCQkgaW5fYmUzMigmcHctPnB3X3JlZ3MtPnB3c3IpKTsKKworCXJldHVybiByYzsKKworZXJyX291dF9pcnE6CisJZnJlZV9pcnEoSVJRX1JJT19QVyhwdyksICh2b2lkICopcHcpOworZXJyX291dDoKKwlkbWFfZnJlZV9jb2hlcmVudChwdy0+ZGV2LCBSSU9fUFdfTVNHX1NJWkUsCisJCXB3LT5wb3J0X3dyaXRlX21zZy52aXJ0LAorCQlwdy0+cG9ydF93cml0ZV9tc2cucGh5cyk7CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGZzbF9yaW9fZG9vcmJlbGxfc2VuZCAtIFNlbmQgYSBNUEM4NXh4IGRvb3JiZWxsIG1lc3NhZ2UKKyAqIEBtcG9ydDogUmFwaWRJTyBtYXN0ZXIgcG9ydCBpbmZvCisgKiBAaW5kZXg6IElEIG9mIFJhcGlkSU8gaW50ZXJmYWNlCisgKiBAZGVzdGlkOiBEZXN0aW5hdGlvbiBJRCBvZiB0YXJnZXQgZGV2aWNlCisgKiBAZGF0YTogMTYtYml0IGluZm8gZmllbGQgb2YgUmFwaWRJTyBkb29yYmVsbCBtZXNzYWdlCisgKgorICogU2VuZHMgYSBNUEM4NXh4IGRvb3JiZWxsIG1lc3NhZ2UuIFJldHVybnMgJTAgb24gc3VjY2VzcyBvcgorICogJS1FSU5WQUwgb24gZmFpbHVyZS4KKyAqLworaW50IGZzbF9yaW9fZG9vcmJlbGxfc2VuZChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwKKwkJCQlpbnQgaW5kZXgsIHUxNiBkZXN0aWQsIHUxNiBkYXRhKQoreworCXByX2RlYnVnKCJmc2xfZG9vcmJlbGxfc2VuZDogaW5kZXggJWQgZGVzdGlkICU0LjR4IGRhdGEgJTQuNHhcbiIsCisJCSBpbmRleCwgZGVzdGlkLCBkYXRhKTsKKworCS8qIEluIHRoZSBzZXJpYWwgdmVyc2lvbiBzaWxpY29ucywgc3VjaCBhcyBNUEM4NTQ4LCBNUEM4NjQxLAorCSAqIGJlbG93IG9wZXJhdGlvbnMgaXMgbXVzdCBiZS4KKwkgKi8KKwlvdXRfYmUzMigmZGJlbGwtPmRiZWxsX3JlZ3MtPm9kbXIsIDB4MDAwMDAwMDApOworCW91dF9iZTMyKCZkYmVsbC0+ZGJlbGxfcmVncy0+b2RyZXRjciwgMHgwMDAwMDAwNCk7CisJb3V0X2JlMzIoJmRiZWxsLT5kYmVsbF9yZWdzLT5vZGRwciwgZGVzdGlkIDw8IDE2KTsKKwlvdXRfYmUzMigmZGJlbGwtPmRiZWxsX3JlZ3MtPm9kZGF0ciwgKGluZGV4IDw8IDIwKSB8IGRhdGEpOworCW91dF9iZTMyKCZkYmVsbC0+ZGJlbGxfcmVncy0+b2RtciwgMHgwMDAwMDAwMSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBmc2xfYWRkX291dGJfbWVzc2FnZSAtIEFkZCBtZXNzYWdlIHRvIHRoZSBNUEM4NXh4IG91dGJvdW5kIG1lc3NhZ2UgcXVldWUKKyAqIEBtcG9ydDogTWFzdGVyIHBvcnQgd2l0aCBvdXRib3VuZCBtZXNzYWdlIHF1ZXVlCisgKiBAcmRldjogVGFyZ2V0IG9mIG91dGJvdW5kIG1lc3NhZ2UKKyAqIEBtYm94OiBPdXRib3VuZCBtYWlsYm94CisgKiBAYnVmZmVyOiBNZXNzYWdlIHRvIGFkZCB0byBvdXRib3VuZCBxdWV1ZQorICogQGxlbjogTGVuZ3RoIG9mIG1lc3NhZ2UKKyAqCisgKiBBZGRzIHRoZSBAYnVmZmVyIG1lc3NhZ2UgdG8gdGhlIE1QQzg1eHggb3V0Ym91bmQgbWVzc2FnZSBxdWV1ZS4gUmV0dXJucworICogJTAgb24gc3VjY2VzcyBvciAlLUVJTlZBTCBvbiBmYWlsdXJlLgorICovCitpbnQKK2ZzbF9hZGRfb3V0Yl9tZXNzYWdlKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBzdHJ1Y3QgcmlvX2RldiAqcmRldiwgaW50IG1ib3gsCisJCQl2b2lkICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGZzbF9ybXUgKnJtdSA9IEdFVF9STU1fSEFORExFKG1wb3J0KTsKKwl1MzIgb21yOworCXN0cnVjdCByaW9fdHhfZGVzYyAqZGVzYyA9IChzdHJ1Y3QgcmlvX3R4X2Rlc2MgKilybXUtPm1zZ190eF9yaW5nLnZpcnQKKwkJCQkJKyBybXUtPm1zZ190eF9yaW5nLnR4X3Nsb3Q7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1ZygiUklPOiBmc2xfYWRkX291dGJfbWVzc2FnZSgpOiBkZXN0aWQgJTQuNHggbWJveCAlZCBidWZmZXIgIiBcCisJCSAiJTguOHggbGVuICU4Ljh4XG4iLCByZGV2LT5kZXN0aWQsIG1ib3gsIChpbnQpYnVmZmVyLCBsZW4pOworCWlmICgobGVuIDwgOCkgfHwgKGxlbiA+IFJJT19NQVhfTVNHX1NJWkUpKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIENvcHkgYW5kIGNsZWFyIHJlc3Qgb2YgYnVmZmVyICovCisJbWVtY3B5KHJtdS0+bXNnX3R4X3JpbmcudmlydF9idWZmZXJbcm11LT5tc2dfdHhfcmluZy50eF9zbG90XSwgYnVmZmVyLAorCQkJbGVuKTsKKwlpZiAobGVuIDwgKFJJT19NQVhfTVNHX1NJWkUgLSA0KSkKKwkJbWVtc2V0KHJtdS0+bXNnX3R4X3JpbmcudmlydF9idWZmZXJbcm11LT5tc2dfdHhfcmluZy50eF9zbG90XQorCQkJCSsgbGVuLCAwLCBSSU9fTUFYX01TR19TSVpFIC0gbGVuKTsKKworCS8qIFNldCBtYm94IGZpZWxkIGZvciBtZXNzYWdlLCBhbmQgc2V0IGRlc3RpZCAqLworCWRlc2MtPmRwb3J0ID0gKHJkZXYtPmRlc3RpZCA8PCAxNikgfCAobWJveCAmIDB4Myk7CisKKwkvKiBFbmFibGUgRU9NSSBpbnRlcnJ1cHQgYW5kIHByaW9yaXR5ICovCisJZGVzYy0+ZGF0dHIgPSAweDI4MDAwMDAwIHwgKChtcG9ydC0+aW5kZXgpIDw8IDIwKTsKKworCS8qIFNldCB0cmFuc2ZlciBzaXplIGFsaWduZWQgdG8gbmV4dCBwb3dlciBvZiAyIChpbiBkb3VibGUgd29yZHMpICovCisJZGVzYy0+ZHdjbnQgPSBpc19wb3dlcl9vZl8yKGxlbikgPyBsZW4gOiAxIDw8IGdldF9iaXRtYXNrX29yZGVyKGxlbik7CisKKwkvKiBTZXQgc25vb3BpbmcgYW5kIHNvdXJjZSBidWZmZXIgYWRkcmVzcyAqLworCWRlc2MtPnNhZGRyID0gMHgwMDAwMDAwNAorCQl8IHJtdS0+bXNnX3R4X3JpbmcucGh5c19idWZmZXJbcm11LT5tc2dfdHhfcmluZy50eF9zbG90XTsKKworCS8qIEluY3JlbWVudCBlbnF1ZXVlIHBvaW50ZXIgKi8KKwlvbXIgPSBpbl9iZTMyKCZybXUtPm1zZ19yZWdzLT5vbXIpOworCW91dF9iZTMyKCZybXUtPm1zZ19yZWdzLT5vbXIsIG9tciB8IFJJT19NU0dfT01SX01VSSk7CisKKwkvKiBHbyB0byBuZXh0IGRlc2NyaXB0b3IgKi8KKwlpZiAoKytybXUtPm1zZ190eF9yaW5nLnR4X3Nsb3QgPT0gcm11LT5tc2dfdHhfcmluZy5zaXplKQorCQlybXUtPm1zZ190eF9yaW5nLnR4X3Nsb3QgPSAwOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBmc2xfb3Blbl9vdXRiX21ib3ggLSBJbml0aWFsaXplIE1QQzg1eHggb3V0Ym91bmQgbWFpbGJveAorICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIG91dGJvdW5kIG1lc3NhZ2UgdW5pdAorICogQGRldl9pZDogRGV2aWNlIHNwZWNpZmljIHBvaW50ZXIgdG8gcGFzcyBvbiBldmVudAorICogQG1ib3g6IE1haWxib3ggdG8gb3BlbgorICogQGVudHJpZXM6IE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBvdXRib3VuZCBtYWlsYm94IHJpbmcKKyAqCisgKiBJbml0aWFsaXplcyBidWZmZXIgcmluZywgcmVxdWVzdCB0aGUgb3V0Ym91bmQgbWVzc2FnZSBpbnRlcnJ1cHQsCisgKiBhbmQgZW5hYmxlcyB0aGUgb3V0Ym91bmQgbWVzc2FnZSB1bml0LiBSZXR1cm5zICUwIG9uIHN1Y2Nlc3MgYW5kCisgKiAlLUVJTlZBTCBvciAlLUVOT01FTSBvbiBmYWlsdXJlLgorICovCitpbnQKK2ZzbF9vcGVuX291dGJfbWJveChzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgdm9pZCAqZGV2X2lkLCBpbnQgbWJveCwgaW50IGVudHJpZXMpCit7CisJaW50IGksIGosIHJjID0gMDsKKwlzdHJ1Y3QgcmlvX3ByaXYgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgZnNsX3JtdSAqcm11ID0gR0VUX1JNTV9IQU5ETEUobXBvcnQpOworCisJaWYgKChlbnRyaWVzIDwgUklPX01JTl9UWF9SSU5HX1NJWkUpIHx8CisJCShlbnRyaWVzID4gUklPX01BWF9UWF9SSU5HX1NJWkUpIHx8ICghaXNfcG93ZXJfb2ZfMihlbnRyaWVzKSkpIHsKKwkJcmMgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHNoYWRvdyBjb3B5IHJpbmcgKi8KKwlybXUtPm1zZ190eF9yaW5nLmRldl9pZCA9IGRldl9pZDsKKwlybXUtPm1zZ190eF9yaW5nLnNpemUgPSBlbnRyaWVzOworCisJZm9yIChpID0gMDsgaSA8IHJtdS0+bXNnX3R4X3Jpbmcuc2l6ZTsgaSsrKSB7CisJCXJtdS0+bXNnX3R4X3JpbmcudmlydF9idWZmZXJbaV0gPQorCQkJZG1hX2FsbG9jX2NvaGVyZW50KHByaXYtPmRldiwgUklPX01TR19CVUZGRVJfU0laRSwKKwkJCQkmcm11LT5tc2dfdHhfcmluZy5waHlzX2J1ZmZlcltpXSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcm11LT5tc2dfdHhfcmluZy52aXJ0X2J1ZmZlcltpXSkgeworCQkJcmMgPSAtRU5PTUVNOworCQkJZm9yIChqID0gMDsgaiA8IHJtdS0+bXNnX3R4X3Jpbmcuc2l6ZTsgaisrKQorCQkJCWlmIChybXUtPm1zZ190eF9yaW5nLnZpcnRfYnVmZmVyW2pdKQorCQkJCQlkbWFfZnJlZV9jb2hlcmVudChwcml2LT5kZXYsCisJCQkJCQkJUklPX01TR19CVUZGRVJfU0laRSwKKwkJCQkJCQlybXUtPm1zZ190eF9yaW5nLgorCQkJCQkJCXZpcnRfYnVmZmVyW2pdLAorCQkJCQkJCXJtdS0+bXNnX3R4X3JpbmcuCisJCQkJCQkJcGh5c19idWZmZXJbal0pOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwkvKiBJbml0aWFsaXplIG91dGJvdW5kIG1lc3NhZ2UgZGVzY3JpcHRvciByaW5nICovCisJcm11LT5tc2dfdHhfcmluZy52aXJ0ID0gZG1hX2FsbG9jX2NvaGVyZW50KHByaXYtPmRldiwKKwkJCQlybXUtPm1zZ190eF9yaW5nLnNpemUgKiBSSU9fTVNHX0RFU0NfU0laRSwKKwkJCQkmcm11LT5tc2dfdHhfcmluZy5waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJtdS0+bXNnX3R4X3JpbmcudmlydCkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2RtYTsKKwl9CisJbWVtc2V0KHJtdS0+bXNnX3R4X3JpbmcudmlydCwgMCwKKwkJCXJtdS0+bXNnX3R4X3Jpbmcuc2l6ZSAqIFJJT19NU0dfREVTQ19TSVpFKTsKKwlybXUtPm1zZ190eF9yaW5nLnR4X3Nsb3QgPSAwOworCisJLyogUG9pbnQgZGVxdWV1ZS9lbnF1ZXVlIHBvaW50ZXJzIGF0IGZpcnN0IGVudHJ5IGluIHJpbmcgKi8KKwlvdXRfYmUzMigmcm11LT5tc2dfcmVncy0+b2RxZHBhciwgcm11LT5tc2dfdHhfcmluZy5waHlzKTsKKwlvdXRfYmUzMigmcm11LT5tc2dfcmVncy0+b2RxZXBhciwgcm11LT5tc2dfdHhfcmluZy5waHlzKTsKKworCS8qIENvbmZpZ3VyZSBmb3Igc25vb3BpbmcgKi8KKwlvdXRfYmUzMigmcm11LT5tc2dfcmVncy0+b3NhciwgMHgwMDAwMDAwNCk7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJb3V0X2JlMzIoJnJtdS0+bXNnX3JlZ3MtPm9zciwgMHgwMDAwMDBiMyk7CisKKwkvKiBIb29rIHVwIG91dGJvdW5kIG1lc3NhZ2UgaGFuZGxlciAqLworCXJjID0gcmVxdWVzdF9pcnEoSVJRX1JJT19UWChtcG9ydCksIGZzbF9yaW9fdHhfaGFuZGxlciwgMCwKKwkJCSAibXNnX3R4IiwgKHZvaWQgKiltcG9ydCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfaXJxOworCisJLyoKKwkgKiBDb25maWd1cmUgb3V0Ym91bmQgbWVzc2FnZSB1bml0CisJICogICAgICBTbm9vcGluZworCSAqICAgICAgSW50ZXJydXB0cyAoYWxsIGVuYWJsZWQsIGV4Y2VwdCBRRUlFKQorCSAqICAgICAgQ2hhaW5pbmcgbW9kZQorCSAqICAgICAgRGlzYWJsZQorCSAqLworCW91dF9iZTMyKCZybXUtPm1zZ19yZWdzLT5vbXIsIDB4MDAxMDAyMjApOworCisJLyogU2V0IG51bWJlciBvZiBlbnRyaWVzICovCisJb3V0X2JlMzIoJnJtdS0+bXNnX3JlZ3MtPm9tciwKKwkJIGluX2JlMzIoJnJtdS0+bXNnX3JlZ3MtPm9tcikgfAorCQkgKChnZXRfYml0bWFza19vcmRlcihlbnRyaWVzKSAtIDIpIDw8IDEyKSk7CisKKwkvKiBOb3cgZW5hYmxlIHRoZSB1bml0ICovCisJb3V0X2JlMzIoJnJtdS0+bXNnX3JlZ3MtPm9tciwgaW5fYmUzMigmcm11LT5tc2dfcmVncy0+b21yKSB8IDB4MSk7CisKK291dDoKKwlyZXR1cm4gcmM7CisKK291dF9pcnE6CisJZG1hX2ZyZWVfY29oZXJlbnQocHJpdi0+ZGV2LAorCQlybXUtPm1zZ190eF9yaW5nLnNpemUgKiBSSU9fTVNHX0RFU0NfU0laRSwKKwkJcm11LT5tc2dfdHhfcmluZy52aXJ0LCBybXUtPm1zZ190eF9yaW5nLnBoeXMpOworCitvdXRfZG1hOgorCWZvciAoaSA9IDA7IGkgPCBybXUtPm1zZ190eF9yaW5nLnNpemU7IGkrKykKKwkJZG1hX2ZyZWVfY29oZXJlbnQocHJpdi0+ZGV2LCBSSU9fTVNHX0JVRkZFUl9TSVpFLAorCQlybXUtPm1zZ190eF9yaW5nLnZpcnRfYnVmZmVyW2ldLAorCQlybXUtPm1zZ190eF9yaW5nLnBoeXNfYnVmZmVyW2ldKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBmc2xfY2xvc2Vfb3V0Yl9tYm94IC0gU2h1dCBkb3duIE1QQzg1eHggb3V0Ym91bmQgbWFpbGJveAorICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIG91dGJvdW5kIG1lc3NhZ2UgdW5pdAorICogQG1ib3g6IE1haWxib3ggdG8gY2xvc2UKKyAqCisgKiBEaXNhYmxlcyB0aGUgb3V0Ym91bmQgbWVzc2FnZSB1bml0LCBmcmVlIGFsbCBidWZmZXJzLCBhbmQKKyAqIGZyZWVzIHRoZSBvdXRib3VuZCBtZXNzYWdlIGludGVycnVwdC4KKyAqLwordm9pZCBmc2xfY2xvc2Vfb3V0Yl9tYm94KHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgbWJveCkKK3sKKwlzdHJ1Y3QgcmlvX3ByaXYgKnByaXYgPSBtcG9ydC0+cHJpdjsKKwlzdHJ1Y3QgZnNsX3JtdSAqcm11ID0gR0VUX1JNTV9IQU5ETEUobXBvcnQpOworCisJLyogRGlzYWJsZSBpbmJvdW5kIG1lc3NhZ2UgdW5pdCAqLworCW91dF9iZTMyKCZybXUtPm1zZ19yZWdzLT5vbXIsIDApOworCisJLyogRnJlZSByaW5nICovCisJZG1hX2ZyZWVfY29oZXJlbnQocHJpdi0+ZGV2LAorCXJtdS0+bXNnX3R4X3Jpbmcuc2l6ZSAqIFJJT19NU0dfREVTQ19TSVpFLAorCXJtdS0+bXNnX3R4X3JpbmcudmlydCwgcm11LT5tc2dfdHhfcmluZy5waHlzKTsKKworCS8qIEZyZWUgaW50ZXJydXB0ICovCisJZnJlZV9pcnEoSVJRX1JJT19UWChtcG9ydCksICh2b2lkICopbXBvcnQpOworfQorCisvKioKKyAqIGZzbF9vcGVuX2luYl9tYm94IC0gSW5pdGlhbGl6ZSBNUEM4NXh4IGluYm91bmQgbWFpbGJveAorICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIGluYm91bmQgbWVzc2FnZSB1bml0CisgKiBAZGV2X2lkOiBEZXZpY2Ugc3BlY2lmaWMgcG9pbnRlciB0byBwYXNzIG9uIGV2ZW50CisgKiBAbWJveDogTWFpbGJveCB0byBvcGVuCisgKiBAZW50cmllczogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGluYm91bmQgbWFpbGJveCByaW5nCisgKgorICogSW5pdGlhbGl6ZXMgYnVmZmVyIHJpbmcsIHJlcXVlc3QgdGhlIGluYm91bmQgbWVzc2FnZSBpbnRlcnJ1cHQsCisgKiBhbmQgZW5hYmxlcyB0aGUgaW5ib3VuZCBtZXNzYWdlIHVuaXQuIFJldHVybnMgJTAgb24gc3VjY2VzcworICogYW5kICUtRUlOVkFMIG9yICUtRU5PTUVNIG9uIGZhaWx1cmUuCisgKi8KK2ludAorZnNsX29wZW5faW5iX21ib3goc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIHZvaWQgKmRldl9pZCwgaW50IG1ib3gsIGludCBlbnRyaWVzKQoreworCWludCBpLCByYyA9IDA7CisJc3RydWN0IHJpb19wcml2ICpwcml2ID0gbXBvcnQtPnByaXY7CisJc3RydWN0IGZzbF9ybXUgKnJtdSA9IEdFVF9STU1fSEFORExFKG1wb3J0KTsKKworCWlmICgoZW50cmllcyA8IFJJT19NSU5fUlhfUklOR19TSVpFKSB8fAorCQkoZW50cmllcyA+IFJJT19NQVhfUlhfUklOR19TSVpFKSB8fCAoIWlzX3Bvd2VyX29mXzIoZW50cmllcykpKSB7CisJCXJjID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSBjbGllbnQgYnVmZmVyIHJpbmcgKi8KKwlybXUtPm1zZ19yeF9yaW5nLmRldl9pZCA9IGRldl9pZDsKKwlybXUtPm1zZ19yeF9yaW5nLnNpemUgPSBlbnRyaWVzOworCXJtdS0+bXNnX3J4X3Jpbmcucnhfc2xvdCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHJtdS0+bXNnX3J4X3Jpbmcuc2l6ZTsgaSsrKQorCQlybXUtPm1zZ19yeF9yaW5nLnZpcnRfYnVmZmVyW2ldID0gTlVMTDsKKworCS8qIEluaXRpYWxpemUgaW5ib3VuZCBtZXNzYWdlIHJpbmcgKi8KKwlybXUtPm1zZ19yeF9yaW5nLnZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQocHJpdi0+ZGV2LAorCQkJCXJtdS0+bXNnX3J4X3Jpbmcuc2l6ZSAqIFJJT19NQVhfTVNHX1NJWkUsCisJCQkJJnJtdS0+bXNnX3J4X3JpbmcucGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFybXUtPm1zZ19yeF9yaW5nLnZpcnQpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBQb2ludCBkZXF1ZXVlL2VucXVldWUgcG9pbnRlcnMgYXQgZmlyc3QgZW50cnkgaW4gcmluZyAqLworCW91dF9iZTMyKCZybXUtPm1zZ19yZWdzLT5pZnFkcGFyLCAodTMyKSBybXUtPm1zZ19yeF9yaW5nLnBoeXMpOworCW91dF9iZTMyKCZybXUtPm1zZ19yZWdzLT5pZnFlcGFyLCAodTMyKSBybXUtPm1zZ19yeF9yaW5nLnBoeXMpOworCisJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCW91dF9iZTMyKCZybXUtPm1zZ19yZWdzLT5pc3IsIDB4MDAwMDAwOTEpOworCisJLyogSG9vayB1cCBpbmJvdW5kIG1lc3NhZ2UgaGFuZGxlciAqLworCXJjID0gcmVxdWVzdF9pcnEoSVJRX1JJT19SWChtcG9ydCksIGZzbF9yaW9fcnhfaGFuZGxlciwgMCwKKwkJCSAibXNnX3J4IiwgKHZvaWQgKiltcG9ydCk7CisJaWYgKHJjIDwgMCkgeworCQlkbWFfZnJlZV9jb2hlcmVudChwcml2LT5kZXYsIFJJT19NU0dfQlVGRkVSX1NJWkUsCisJCQlybXUtPm1zZ190eF9yaW5nLnZpcnRfYnVmZmVyW2ldLAorCQkJcm11LT5tc2dfdHhfcmluZy5waHlzX2J1ZmZlcltpXSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQ29uZmlndXJlIGluYm91bmQgbWVzc2FnZSB1bml0OgorCSAqICAgICAgU25vb3BpbmcKKwkgKiAgICAgIDRLQiBtYXggbWVzc2FnZSBzaXplCisJICogICAgICBVbm1hc2sgYWxsIGludGVycnVwdCBzb3VyY2VzCisJICogICAgICBEaXNhYmxlCisJICovCisJb3V0X2JlMzIoJnJtdS0+bXNnX3JlZ3MtPmltciwgMHgwMDFiMDA2MCk7CisKKwkvKiBTZXQgbnVtYmVyIG9mIHF1ZXVlIGVudHJpZXMgKi8KKwlzZXRiaXRzMzIoJnJtdS0+bXNnX3JlZ3MtPmltciwgKGdldF9iaXRtYXNrX29yZGVyKGVudHJpZXMpIC0gMikgPDwgMTIpOworCisJLyogTm93IGVuYWJsZSB0aGUgdW5pdCAqLworCXNldGJpdHMzMigmcm11LT5tc2dfcmVncy0+aW1yLCAweDEpOworCitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGZzbF9jbG9zZV9pbmJfbWJveCAtIFNodXQgZG93biBNUEM4NXh4IGluYm91bmQgbWFpbGJveAorICogQG1wb3J0OiBNYXN0ZXIgcG9ydCBpbXBsZW1lbnRpbmcgdGhlIGluYm91bmQgbWVzc2FnZSB1bml0CisgKiBAbWJveDogTWFpbGJveCB0byBjbG9zZQorICoKKyAqIERpc2FibGVzIHRoZSBpbmJvdW5kIG1lc3NhZ2UgdW5pdCwgZnJlZSBhbGwgYnVmZmVycywgYW5kCisgKiBmcmVlcyB0aGUgaW5ib3VuZCBtZXNzYWdlIGludGVycnVwdC4KKyAqLwordm9pZCBmc2xfY2xvc2VfaW5iX21ib3goc3RydWN0IHJpb19tcG9ydCAqbXBvcnQsIGludCBtYm94KQoreworCXN0cnVjdCByaW9fcHJpdiAqcHJpdiA9IG1wb3J0LT5wcml2OworCXN0cnVjdCBmc2xfcm11ICpybXUgPSBHRVRfUk1NX0hBTkRMRShtcG9ydCk7CisKKwkvKiBEaXNhYmxlIGluYm91bmQgbWVzc2FnZSB1bml0ICovCisJb3V0X2JlMzIoJnJtdS0+bXNnX3JlZ3MtPmltciwgMCk7CisKKwkvKiBGcmVlIHJpbmcgKi8KKwlkbWFfZnJlZV9jb2hlcmVudChwcml2LT5kZXYsIHJtdS0+bXNnX3J4X3Jpbmcuc2l6ZSAqIFJJT19NQVhfTVNHX1NJWkUsCisJcm11LT5tc2dfcnhfcmluZy52aXJ0LCBybXUtPm1zZ19yeF9yaW5nLnBoeXMpOworCisJLyogRnJlZSBpbnRlcnJ1cHQgKi8KKwlmcmVlX2lycShJUlFfUklPX1JYKG1wb3J0KSwgKHZvaWQgKiltcG9ydCk7Cit9CisKKy8qKgorICogZnNsX2FkZF9pbmJfYnVmZmVyIC0gQWRkIGJ1ZmZlciB0byB0aGUgTVBDODV4eCBpbmJvdW5kIG1lc3NhZ2UgcXVldWUKKyAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBpbmJvdW5kIG1lc3NhZ2UgdW5pdAorICogQG1ib3g6IEluYm91bmQgbWFpbGJveCBudW1iZXIKKyAqIEBidWY6IEJ1ZmZlciB0byBhZGQgdG8gaW5ib3VuZCBxdWV1ZQorICoKKyAqIEFkZHMgdGhlIEBidWYgYnVmZmVyIHRvIHRoZSBNUEM4NXh4IGluYm91bmQgbWVzc2FnZSBxdWV1ZS4gUmV0dXJucworICogJTAgb24gc3VjY2VzcyBvciAlLUVJTlZBTCBvbiBmYWlsdXJlLgorICovCitpbnQgZnNsX2FkZF9pbmJfYnVmZmVyKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgbWJveCwgdm9pZCAqYnVmKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGZzbF9ybXUgKnJtdSA9IEdFVF9STU1fSEFORExFKG1wb3J0KTsKKworCXByX2RlYnVnKCJSSU86IGZzbF9hZGRfaW5iX2J1ZmZlcigpLCBtc2dfcnhfcmluZy5yeF9zbG90ICVkXG4iLAorCQkgcm11LT5tc2dfcnhfcmluZy5yeF9zbG90KTsKKworCWlmIChybXUtPm1zZ19yeF9yaW5nLnZpcnRfYnVmZmVyW3JtdS0+bXNnX3J4X3Jpbmcucnhfc2xvdF0pIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiUklPOiBlcnJvciBhZGRpbmcgaW5ib3VuZCBidWZmZXIgJWQsIGJ1ZmZlciBleGlzdHNcbiIsCisJCQlybXUtPm1zZ19yeF9yaW5nLnJ4X3Nsb3QpOworCQlyYyA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJtdS0+bXNnX3J4X3JpbmcudmlydF9idWZmZXJbcm11LT5tc2dfcnhfcmluZy5yeF9zbG90XSA9IGJ1ZjsKKwlpZiAoKytybXUtPm1zZ19yeF9yaW5nLnJ4X3Nsb3QgPT0gcm11LT5tc2dfcnhfcmluZy5zaXplKQorCQlybXUtPm1zZ19yeF9yaW5nLnJ4X3Nsb3QgPSAwOworCitvdXQ6CisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGZzbF9nZXRfaW5iX21lc3NhZ2UgLSBGZXRjaCBpbmJvdW5kIG1lc3NhZ2UgZnJvbSB0aGUgTVBDODV4eCBtZXNzYWdlIHVuaXQKKyAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBpbmJvdW5kIG1lc3NhZ2UgdW5pdAorICogQG1ib3g6IEluYm91bmQgbWFpbGJveCBudW1iZXIKKyAqCisgKiBHZXRzIHRoZSBuZXh0IGF2YWlsYWJsZSBpbmJvdW5kIG1lc3NhZ2UgZnJvbSB0aGUgaW5ib3VuZCBtZXNzYWdlIHF1ZXVlLgorICogQSBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3Mgb3IgTlVMTCBvbiBmYWlsdXJlLgorICovCit2b2lkICpmc2xfZ2V0X2luYl9tZXNzYWdlKHN0cnVjdCByaW9fbXBvcnQgKm1wb3J0LCBpbnQgbWJveCkKK3sKKwlzdHJ1Y3QgZnNsX3JtdSAqcm11ID0gR0VUX1JNTV9IQU5ETEUobXBvcnQpOworCXUzMiBwaHlzX2J1ZiwgdmlydF9idWY7CisJdm9pZCAqYnVmID0gTlVMTDsKKwlpbnQgYnVmX2lkeDsKKworCXBoeXNfYnVmID0gaW5fYmUzMigmcm11LT5tc2dfcmVncy0+aWZxZHBhcik7CisKKwkvKiBJZiBubyBtb3JlIG1lc3NhZ2VzLCB0aGVuIGJhaWwgb3V0ICovCisJaWYgKHBoeXNfYnVmID09IGluX2JlMzIoJnJtdS0+bXNnX3JlZ3MtPmlmcWVwYXIpKQorCQlnb3RvIG91dDI7CisKKwl2aXJ0X2J1ZiA9ICh1MzIpIHJtdS0+bXNnX3J4X3JpbmcudmlydCArIChwaHlzX2J1ZgorCQkJCQkJLSBybXUtPm1zZ19yeF9yaW5nLnBoeXMpOworCWJ1Zl9pZHggPSAocGh5c19idWYgLSBybXUtPm1zZ19yeF9yaW5nLnBoeXMpIC8gUklPX01BWF9NU0dfU0laRTsKKwlidWYgPSBybXUtPm1zZ19yeF9yaW5nLnZpcnRfYnVmZmVyW2J1Zl9pZHhdOworCisJaWYgKCFidWYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSCisJCQkiUklPOiBpbmJvdW5kIG1lc3NhZ2UgY29weSBmYWlsZWQsIG5vIGJ1ZmZlcnNcbiIpOworCQlnb3RvIG91dDE7CisJfQorCisJLyogQ29weSBtYXggbWVzc2FnZSBzaXplLCBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gYWxsb2NhdGUgdGhhdCBiaWcgKi8KKwltZW1jcHkoYnVmLCAodm9pZCAqKXZpcnRfYnVmLCBSSU9fTUFYX01TR19TSVpFKTsKKworCS8qIENsZWFyIHRoZSBhdmFpbGFibGUgYnVmZmVyICovCisJcm11LT5tc2dfcnhfcmluZy52aXJ0X2J1ZmZlcltidWZfaWR4XSA9IE5VTEw7CisKK291dDE6CisJc2V0Yml0czMyKCZybXUtPm1zZ19yZWdzLT5pbXIsIFJJT19NU0dfSU1SX01JKTsKKworb3V0MjoKKwlyZXR1cm4gYnVmOworfQorCisvKioKKyAqIGZzbF9yaW9fZG9vcmJlbGxfaW5pdCAtIE1QQzg1eHggZG9vcmJlbGwgaW50ZXJmYWNlIGluaXQKKyAqIEBtcG9ydDogTWFzdGVyIHBvcnQgaW1wbGVtZW50aW5nIHRoZSBpbmJvdW5kIGRvb3JiZWxsIHVuaXQKKyAqCisgKiBJbml0aWFsaXplcyBkb29yYmVsbCB1bml0IGhhcmR3YXJlIGFuZCBpbmJvdW5kIERNQSBidWZmZXIKKyAqIHJpbmcuIENhbGxlZCBmcm9tIGZzbF9yaW9fc2V0dXAoKS4gUmV0dXJucyAlMCBvbiBzdWNjZXNzCisgKiBvciAlLUVOT01FTSBvbiBmYWlsdXJlLgorICovCitpbnQgZnNsX3Jpb19kb29yYmVsbF9pbml0KHN0cnVjdCBmc2xfcmlvX2RiZWxsICpkYmVsbCkKK3sKKwlpbnQgcmMgPSAwOworCisJLyogSW5pdGlhbGl6ZSBpbmJvdW5kIGRvb3JiZWxscyAqLworCWRiZWxsLT5kYmVsbF9yaW5nLnZpcnQgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGJlbGwtPmRldiwgNTEyICoKKwkJRE9PUkJFTExfTUVTU0FHRV9TSVpFLCAmZGJlbGwtPmRiZWxsX3JpbmcucGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYmVsbC0+ZGJlbGxfcmluZy52aXJ0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiUklPOiB1bmFibGUgYWxsb2NhdGUgaW5ib3VuZCBkb29yYmVsbCByaW5nXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBQb2ludCBkZXF1ZXVlL2VucXVldWUgcG9pbnRlcnMgYXQgZmlyc3QgZW50cnkgaW4gcmluZyAqLworCW91dF9iZTMyKCZkYmVsbC0+ZGJlbGxfcmVncy0+ZHFkcGFyLCAodTMyKSBkYmVsbC0+ZGJlbGxfcmluZy5waHlzKTsKKwlvdXRfYmUzMigmZGJlbGwtPmRiZWxsX3JlZ3MtPmRxZXBhciwgKHUzMikgZGJlbGwtPmRiZWxsX3JpbmcucGh5cyk7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJb3V0X2JlMzIoJmRiZWxsLT5kYmVsbF9yZWdzLT5kc3IsIDB4MDAwMDAwOTEpOworCisJLyogSG9vayB1cCBkb29yYmVsbCBoYW5kbGVyICovCisJcmMgPSByZXF1ZXN0X2lycShJUlFfUklPX0JFTEwoZGJlbGwpLCBmc2xfcmlvX2RiZWxsX2hhbmRsZXIsIDAsCisJCQkgImRiZWxsX3J4IiwgKHZvaWQgKilkYmVsbCk7CisJaWYgKHJjIDwgMCkgeworCQlkbWFfZnJlZV9jb2hlcmVudChkYmVsbC0+ZGV2LCA1MTIgKiBET09SQkVMTF9NRVNTQUdFX1NJWkUsCisJCQkgZGJlbGwtPmRiZWxsX3JpbmcudmlydCwgZGJlbGwtPmRiZWxsX3JpbmcucGh5cyk7CisJCXByaW50ayhLRVJOX0VSUgorCQkJIk1QQzg1eHggUklPOiB1bmFibGUgdG8gcmVxdWVzdCBpbmJvdW5kIGRvb3JiZWxsIGlycSIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBDb25maWd1cmUgZG9vcmJlbGxzIGZvciBzbm9vcGluZywgNTEyIGVudHJpZXMsIGFuZCBlbmFibGUgKi8KKwlvdXRfYmUzMigmZGJlbGwtPmRiZWxsX3JlZ3MtPmRtciwgMHgwMDEwODE2MSk7CisKK291dDoKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBmc2xfcmlvX3NldHVwX3JtdShzdHJ1Y3QgcmlvX21wb3J0ICptcG9ydCwgc3RydWN0IGRldmljZV9ub2RlICpub2RlKQoreworCXN0cnVjdCByaW9fcHJpdiAqcHJpdjsKKwlzdHJ1Y3QgZnNsX3JtdSAqcm11OworCXU2NCBtc2dfc3RhcnQ7CisJY29uc3QgdTMyICptc2dfYWRkcjsKKwlpbnQgbWxlbjsKKwlpbnQgYXc7CisKKwlpZiAoIW1wb3J0IHx8ICFtcG9ydC0+cHJpdikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcml2ID0gbXBvcnQtPnByaXY7CisKKwlpZiAoIW5vZGUpIHsKKwkJZGV2X3dhcm4ocHJpdi0+ZGV2LCAiQ2FuJ3QgZ2V0ICVzIHByb3BlcnR5ICdmc2wscm11J1xuIiwKKwkJCXByaXYtPmRldi0+b2Zfbm9kZS0+ZnVsbF9uYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcm11ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZzbF9ybXUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJtdSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhdyA9IG9mX25fYWRkcl9jZWxscyhub2RlKTsKKwltc2dfYWRkciA9IG9mX2dldF9wcm9wZXJ0eShub2RlLCAicmVnIiwgJm1sZW4pOworCWlmICghbXNnX2FkZHIpIHsKKwkJcHJfZXJyKCIlczogdW5hYmxlIHRvIGZpbmQgJ3JlZycgcHJvcGVydHkgb2YgbWVzc2FnZS11bml0XG4iLAorCQkJbm9kZS0+ZnVsbF9uYW1lKTsKKwkJa2ZyZWUocm11KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1zZ19zdGFydCA9IG9mX3JlYWRfbnVtYmVyKG1zZ19hZGRyLCBhdyk7CisKKwlybXUtPm1zZ19yZWdzID0gKHN0cnVjdCByaW9fbXNnX3JlZ3MgKikKKwkJCShybXVfcmVnc193aW4gKyAodTMyKW1zZ19zdGFydCk7CisKKwlybXUtPnR4aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobm9kZSwgMCk7CisJcm11LT5yeGlycSA9IGlycV9vZl9wYXJzZV9hbmRfbWFwKG5vZGUsIDEpOworCXByaW50ayhLRVJOX0lORk8gIiVzOiB0eGlycTogJWQsIHJ4aXJxICVkXG4iLAorCQlub2RlLT5mdWxsX25hbWUsIHJtdS0+dHhpcnEsIHJtdS0+cnhpcnEpOworCisJcHJpdi0+cm1tX2hhbmRsZSA9IHJtdTsKKworCXJpb19pbml0X2RiZWxsX3JlcygmbXBvcnQtPnJpb3Jlc1tSSU9fRE9PUkJFTExfUkVTT1VSQ0VdLCAwLCAweGZmZmYpOworCXJpb19pbml0X21ib3hfcmVzKCZtcG9ydC0+cmlvcmVzW1JJT19JTkJfTUJPWF9SRVNPVVJDRV0sIDAsIDApOworCXJpb19pbml0X21ib3hfcmVzKCZtcG9ydC0+cmlvcmVzW1JJT19PVVRCX01CT1hfUkVTT1VSQ0VdLCAwLCAwKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwppbmRleCA4YzdlODUyLi40ZTljY2IxIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwpAQCAtMTU0LDcgKzE1NCw3IEBACiB7CiAJdW5zaWduZWQgaW50IGNwdSA9IDA7CiAKLQlpZiAobXBpYy0+ZmxhZ3MgJiBNUElDX1BSSU1BUlkpCisJaWYgKCEobXBpYy0+ZmxhZ3MgJiBNUElDX1NFQ09OREFSWSkpCiAJCWNwdSA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCiAJcmV0dXJuIGNwdTsKQEAgLTMxNSwyOSArMzE1LDI1IEBACiB9CiAKICNpZmRlZiBDT05GSUdfUFBDX0RDUgotc3RhdGljIHZvaWQgX21waWNfbWFwX2RjcihzdHJ1Y3QgbXBpYyAqbXBpYywgc3RydWN0IGRldmljZV9ub2RlICpub2RlLAotCQkJICBzdHJ1Y3QgbXBpY19yZWdfYmFuayAqcmIsCitzdGF0aWMgdm9pZCBfbXBpY19tYXBfZGNyKHN0cnVjdCBtcGljICptcGljLCBzdHJ1Y3QgbXBpY19yZWdfYmFuayAqcmIsCiAJCQkgIHVuc2lnbmVkIGludCBvZmZzZXQsIHVuc2lnbmVkIGludCBzaXplKQogewotCWNvbnN0IHUzMiAqZGJhc2VwOwotCi0JZGJhc2VwID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJkY3ItcmVnIiwgTlVMTCk7Ci0KLQlyYi0+ZGhvc3QgPSBkY3JfbWFwKG5vZGUsICpkYmFzZXAgKyBvZmZzZXQsIHNpemUpOworCXBoeXNfYWRkcl90IHBoeXNfYWRkciA9IGRjcl9yZXNvdXJjZV9zdGFydChtcGljLT5ub2RlLCAwKTsKKwlyYi0+ZGhvc3QgPSBkY3JfbWFwKG1waWMtPm5vZGUsIHBoeXNfYWRkciArIG9mZnNldCwgc2l6ZSk7CiAJQlVHX09OKCFEQ1JfTUFQX09LKHJiLT5kaG9zdCkpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbXBpY19tYXAoc3RydWN0IG1waWMgKm1waWMsIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZSwKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcGljX21hcChzdHJ1Y3QgbXBpYyAqbXBpYywKIAkJCSAgICBwaHlzX2FkZHJfdCBwaHlzX2FkZHIsIHN0cnVjdCBtcGljX3JlZ19iYW5rICpyYiwKIAkJCSAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKIAlpZiAobXBpYy0+ZmxhZ3MgJiBNUElDX1VTRVNfRENSKQotCQlfbXBpY19tYXBfZGNyKG1waWMsIG5vZGUsIHJiLCBvZmZzZXQsIHNpemUpOworCQlfbXBpY19tYXBfZGNyKG1waWMsIHJiLCBvZmZzZXQsIHNpemUpOwogCWVsc2UKIAkJX21waWNfbWFwX21taW8obXBpYywgcGh5c19hZGRyLCByYiwgb2Zmc2V0LCBzaXplKTsKIH0KICNlbHNlIC8qIENPTkZJR19QUENfRENSICovCi0jZGVmaW5lIG1waWNfbWFwKG0sbixwLGIsbyxzKQlfbXBpY19tYXBfbW1pbyhtLHAsYixvLHMpCisjZGVmaW5lIG1waWNfbWFwKG0scCxiLG8scykJX21waWNfbWFwX21taW8obSxwLGIsbyxzKQogI2VuZGlmIC8qICFDT05GSUdfUFBDX0RDUiAqLwogCiAKQEAgLTkwMSw3ICs4OTcsNyBAQAogCWlmICh2b2xkICE9IHZuZXcpCiAJCW1waWNfaXJxX3dyaXRlKHNyYywgTVBJQ19JTkZPKElSUV9WRUNUT1JfUFJJKSwgdm5ldyk7CiAKLQlyZXR1cm4gSVJRX1NFVF9NQVNLX09LX05PQ09QWTs7CisJcmV0dXJuIElSUV9TRVRfTUFTS19PS19OT0NPUFk7CiB9CiAKIHZvaWQgbXBpY19zZXRfdmVjdG9yKHVuc2lnbmVkIGludCB2aXJxLCB1bnNpZ25lZCBpbnQgdmVjdG9yKQpAQCAtOTkwLDcgKzk4Niw3IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJZWxzZSBpZiAoaHcgPj0gbXBpYy0+aXBpX3ZlY3NbMF0pIHsKLQkJV0FSTl9PTighKG1waWMtPmZsYWdzICYgTVBJQ19QUklNQVJZKSk7CisJCVdBUk5fT04obXBpYy0+ZmxhZ3MgJiBNUElDX1NFQ09OREFSWSk7CiAKIAkJREJHKCJtcGljOiBtYXBwaW5nIGFzIElQSVxuIik7CiAJCWlycV9zZXRfY2hpcF9kYXRhKHZpcnEsIG1waWMpOwpAQCAtMTAwMSw3ICs5OTcsNyBAQAogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogCWlmIChodyA+PSBtcGljLT50aW1lcl92ZWNzWzBdICYmIGh3IDw9IG1waWMtPnRpbWVyX3ZlY3NbN10pIHsKLQkJV0FSTl9PTighKG1waWMtPmZsYWdzICYgTVBJQ19QUklNQVJZKSk7CisJCVdBUk5fT04obXBpYy0+ZmxhZ3MgJiBNUElDX1NFQ09OREFSWSk7CiAKIAkJREJHKCJtcGljOiBtYXBwaW5nIGFzIHRpbWVyXG4iKTsKIAkJaXJxX3NldF9jaGlwX2RhdGEodmlycSwgbXBpYyk7CkBAIC0xMTE1LDE3ICsxMTExLDI4IEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qIElSUSBoYW5kbGVyIGZvciBhIHNlY29uZGFyeSBNUElDIGNhc2NhZGVkIGZyb20gYW5vdGhlciBJUlEgY29udHJvbGxlciAqLworc3RhdGljIHZvaWQgbXBpY19jYXNjYWRlKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3sKKwlzdHJ1Y3QgaXJxX2NoaXAgKmNoaXAgPSBpcnFfZGVzY19nZXRfY2hpcChkZXNjKTsKKwlzdHJ1Y3QgbXBpYyAqbXBpYyA9IGlycV9kZXNjX2dldF9oYW5kbGVyX2RhdGEoZGVzYyk7CisJdW5zaWduZWQgaW50IHZpcnE7CisKKwlCVUdfT04oIShtcGljLT5mbGFncyAmIE1QSUNfU0VDT05EQVJZKSk7CisKKwl2aXJxID0gbXBpY19nZXRfb25lX2lycShtcGljKTsKKwlpZiAodmlycSAhPSBOT19JUlEpCisJCWdlbmVyaWNfaGFuZGxlX2lycSh2aXJxKTsKKworCWNoaXAtPmlycV9lb2koJmRlc2MtPmlycV9kYXRhKTsKK30KKwogc3RhdGljIHN0cnVjdCBpcnFfaG9zdF9vcHMgbXBpY19ob3N0X29wcyA9IHsKIAkubWF0Y2ggPSBtcGljX2hvc3RfbWF0Y2gsCiAJLm1hcCA9IG1waWNfaG9zdF9tYXAsCiAJLnhsYXRlID0gbXBpY19ob3N0X3hsYXRlLAogfTsKIAotc3RhdGljIGludCBtcGljX3Jlc2V0X3Byb2hpYml0ZWQoc3RydWN0IGRldmljZV9ub2RlICpub2RlKQotewotCXJldHVybiBub2RlICYmIG9mX2dldF9wcm9wZXJ0eShub2RlLCAicGljLW5vLXJlc2V0IiwgTlVMTCk7Ci19Ci0KIC8qCiAgKiBFeHBvcnRlZCBmdW5jdGlvbnMKICAqLwpAQCAtMTEzNywyNyArMTE0NCw2MCBAQAogCQkJCXVuc2lnbmVkIGludCBpcnFfY291bnQsCiAJCQkJY29uc3QgY2hhciAqbmFtZSkKIHsKLQlzdHJ1Y3QgbXBpYwkqbXBpYzsKLQl1MzIJCWdyZWdfZmVhdHVyZTsKLQljb25zdCBjaGFyCSp2ZXJzOwotCWludAkJaTsKLQlpbnQJCWludHZlY190b3A7Ci0JdTY0CQlwYWRkciA9IHBoeXNfYWRkcjsKKwlpbnQgaSwgcHNpemUsIGludHZlY190b3A7CisJc3RydWN0IG1waWMgKm1waWM7CisJdTMyIGdyZWdfZmVhdHVyZTsKKwljb25zdCBjaGFyICp2ZXJzOworCWNvbnN0IHUzMiAqcHNyYzsKKworCS8qIERlZmF1bHQgTVBJQyBzZWFyY2ggcGFyYW1ldGVycyAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9faW5pdGNvbnN0IG1waWNfZGV2aWNlX2lkW10gPSB7CisJCXsgLnR5cGUJICAgICAgPSAib3Blbi1waWMiLCB9LAorCQl7IC5jb21wYXRpYmxlID0gIm9wZW4tcGljIiwgfSwKKwkJe30sCisJfTsKKworCS8qCisJICogSWYgd2Ugd2VyZSBub3QgcGFzc2VkIGEgZGV2aWNlLXRyZWUgbm9kZSwgdGhlbiBwZXJmb3JtIHRoZSBkZWZhdWx0CisJICogc2VhcmNoIGZvciBzdGFuZGFyZGl6ZWQgYSBzdGFuZGFyZGl6ZWQgT3BlblBJQy4KKwkgKi8KKwlpZiAobm9kZSkgeworCQlub2RlID0gb2Zfbm9kZV9nZXQobm9kZSk7CisJfSBlbHNlIHsKKwkJbm9kZSA9IG9mX2ZpbmRfbWF0Y2hpbmdfbm9kZShOVUxMLCBtcGljX2RldmljZV9pZCk7CisJCWlmICghbm9kZSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qIFBpY2sgdGhlIHBoeXNpY2FsIGFkZHJlc3MgZnJvbSB0aGUgZGV2aWNlIHRyZWUgaWYgdW5zcGVjaWZpZWQgKi8KKwlpZiAoIXBoeXNfYWRkcikgeworCQkvKiBDaGVjayBpZiBpdCBpcyBEQ1ItYmFzZWQgKi8KKwkJaWYgKG9mX2dldF9wcm9wZXJ0eShub2RlLCAiZGNyLXJlZyIsIE5VTEwpKSB7CisJCQlmbGFncyB8PSBNUElDX1VTRVNfRENSOworCQl9IGVsc2UgeworCQkJc3RydWN0IHJlc291cmNlIHI7CisJCQlpZiAob2ZfYWRkcmVzc190b19yZXNvdXJjZShub2RlLCAwLCAmcikpCisJCQkJZ290byBlcnJfb2Zfbm9kZV9wdXQ7CisJCQlwaHlzX2FkZHIgPSByLnN0YXJ0OworCQl9CisJfQogCiAJbXBpYyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtcGljKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKG1waWMgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7CisJCWdvdG8gZXJyX29mX25vZGVfcHV0OwogCiAJbXBpYy0+bmFtZSA9IG5hbWU7CisJbXBpYy0+bm9kZSA9IG5vZGU7CisJbXBpYy0+cGFkZHIgPSBwaHlzX2FkZHI7CiAKIAltcGljLT5oY19pcnEgPSBtcGljX2lycV9jaGlwOwogCW1waWMtPmhjX2lycS5uYW1lID0gbmFtZTsKLQlpZiAoZmxhZ3MgJiBNUElDX1BSSU1BUlkpCisJaWYgKCEoZmxhZ3MgJiBNUElDX1NFQ09OREFSWSkpCiAJCW1waWMtPmhjX2lycS5pcnFfc2V0X2FmZmluaXR5ID0gbXBpY19zZXRfYWZmaW5pdHk7CiAjaWZkZWYgQ09ORklHX01QSUNfVTNfSFRfSVJRUwogCW1waWMtPmhjX2h0X2lycSA9IG1waWNfaXJxX2h0X2NoaXA7CiAJbXBpYy0+aGNfaHRfaXJxLm5hbWUgPSBuYW1lOwotCWlmIChmbGFncyAmIE1QSUNfUFJJTUFSWSkKKwlpZiAoIShmbGFncyAmIE1QSUNfU0VDT05EQVJZKSkKIAkJbXBpYy0+aGNfaHRfaXJxLmlycV9zZXRfYWZmaW5pdHkgPSBtcGljX3NldF9hZmZpbml0eTsKICNlbmRpZiAvKiBDT05GSUdfTVBJQ19VM19IVF9JUlFTICovCiAKQEAgLTExOTQsMjggKzEyMzQsMjIgQEAKIAltcGljLT5zcHVyaW91c192ZWMgID0gaW50dmVjX3RvcDsKIAogCS8qIENoZWNrIGZvciAiYmlnLWVuZGlhbiIgaW4gZGV2aWNlLXRyZWUgKi8KLQlpZiAobm9kZSAmJiBvZl9nZXRfcHJvcGVydHkobm9kZSwgImJpZy1lbmRpYW4iLCBOVUxMKSAhPSBOVUxMKQorCWlmIChvZl9nZXRfcHJvcGVydHkobXBpYy0+bm9kZSwgImJpZy1lbmRpYW4iLCBOVUxMKSAhPSBOVUxMKQogCQltcGljLT5mbGFncyB8PSBNUElDX0JJR19FTkRJQU47Ci0JaWYgKG5vZGUgJiYgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobm9kZSwgImZzbCxtcGljIikpCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG1waWMtPm5vZGUsICJmc2wsbXBpYyIpKQogCQltcGljLT5mbGFncyB8PSBNUElDX0ZTTDsKIAogCS8qIExvb2sgZm9yIHByb3RlY3RlZCBzb3VyY2VzICovCi0JaWYgKG5vZGUpIHsKLQkJaW50IHBzaXplOwotCQl1bnNpZ25lZCBpbnQgYml0cywgbWFwc2l6ZTsKLQkJY29uc3QgdTMyICpwc3JjID0KLQkJCW9mX2dldF9wcm9wZXJ0eShub2RlLCAicHJvdGVjdGVkLXNvdXJjZXMiLCAmcHNpemUpOwotCQlpZiAocHNyYykgewotCQkJcHNpemUgLz0gNDsKLQkJCWJpdHMgPSBpbnR2ZWNfdG9wICsgMTsKLQkJCW1hcHNpemUgPSBCSVRTX1RPX0xPTkdTKGJpdHMpICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOwotCQkJbXBpYy0+cHJvdGVjdGVkID0ga3phbGxvYyhtYXBzaXplLCBHRlBfS0VSTkVMKTsKLQkJCUJVR19PTihtcGljLT5wcm90ZWN0ZWQgPT0gTlVMTCk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgcHNpemU7IGkrKykgewotCQkJCWlmIChwc3JjW2ldID4gaW50dmVjX3RvcCkKLQkJCQkJY29udGludWU7Ci0JCQkJX19zZXRfYml0KHBzcmNbaV0sIG1waWMtPnByb3RlY3RlZCk7Ci0JCQl9CisJcHNyYyA9IG9mX2dldF9wcm9wZXJ0eShtcGljLT5ub2RlLCAicHJvdGVjdGVkLXNvdXJjZXMiLCAmcHNpemUpOworCWlmIChwc3JjKSB7CisJCS8qIEFsbG9jYXRlIGEgYml0bWFwIHdpdGggb25lIGJpdCBwZXIgaW50ZXJydXB0ICovCisJCXVuc2lnbmVkIGludCBtYXBzaXplID0gQklUU19UT19MT05HUyhpbnR2ZWNfdG9wICsgMSk7CisJCW1waWMtPnByb3RlY3RlZCA9IGt6YWxsb2MobWFwc2l6ZSpzaXplb2YobG9uZyksIEdGUF9LRVJORUwpOworCQlCVUdfT04obXBpYy0+cHJvdGVjdGVkID09IE5VTEwpOworCQlmb3IgKGkgPSAwOyBpIDwgcHNpemUvc2l6ZW9mKHUzMik7IGkrKykgeworCQkJaWYgKHBzcmNbaV0gPiBpbnR2ZWNfdG9wKQorCQkJCWNvbnRpbnVlOworCQkJX19zZXRfYml0KHBzcmNbaV0sIG1waWMtPnByb3RlY3RlZCk7CiAJCX0KIAl9CiAKQEAgLTEyMjQsNDIgKzEyNTgsMzIgQEAKICNlbmRpZgogCiAJLyogZGVmYXVsdCByZWdpc3RlciB0eXBlICovCi0JbXBpYy0+cmVnX3R5cGUgPSAoZmxhZ3MgJiBNUElDX0JJR19FTkRJQU4pID8KLQkJbXBpY19hY2Nlc3NfbW1pb19iZSA6IG1waWNfYWNjZXNzX21taW9fbGU7CisJaWYgKGZsYWdzICYgTVBJQ19CSUdfRU5ESUFOKQorCQltcGljLT5yZWdfdHlwZSA9IG1waWNfYWNjZXNzX21taW9fYmU7CisJZWxzZQorCQltcGljLT5yZWdfdHlwZSA9IG1waWNfYWNjZXNzX21taW9fbGU7CiAKLQkvKiBJZiBubyBwaHlzaWNhbCBhZGRyZXNzIGlzIHBhc3NlZCBpbiwgYSBkZXZpY2Utbm9kZSBpcyBtYW5kYXRvcnkgKi8KLQlCVUdfT04ocGFkZHIgPT0gMCAmJiBub2RlID09IE5VTEwpOwotCi0JLyogSWYgbm8gcGh5c2ljYWwgYWRkcmVzcyBwYXNzZWQgaW4sIGNoZWNrIGlmIGl0J3MgZGNyIGJhc2VkICovCi0JaWYgKHBhZGRyID09IDAgJiYgb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJkY3ItcmVnIiwgTlVMTCkgIT0gTlVMTCkgeworCS8qCisJICogQW4gTVBJQyB3aXRoIGEgImRjci1yZWciIHByb3BlcnR5IG11c3QgYmUgYWNjZXNzZWQgdGhhdCB3YXksIGJ1dAorCSAqIG9ubHkgaWYgdGhlIGtlcm5lbCBpbmNsdWRlcyBEQ1Igc3VwcG9ydC4KKwkgKi8KICNpZmRlZiBDT05GSUdfUFBDX0RDUgotCQltcGljLT5mbGFncyB8PSBNUElDX1VTRVNfRENSOworCWlmIChmbGFncyAmIE1QSUNfVVNFU19EQ1IpCiAJCW1waWMtPnJlZ190eXBlID0gbXBpY19hY2Nlc3NfZGNyOwogI2Vsc2UKLQkJQlVHKCk7Ci0jZW5kaWYgLyogQ09ORklHX1BQQ19EQ1IgKi8KLQl9Ci0KLQkvKiBJZiB0aGUgTVBJQyBpcyBub3QgRENSIGJhc2VkLCBhbmQgbm8gcGh5c2ljYWwgYWRkcmVzcyB3YXMgcGFzc2VkCi0JICogaW4sIHRyeSB0byBvYnRhaW4gb25lCi0JICovCi0JaWYgKHBhZGRyID09IDAgJiYgIShtcGljLT5mbGFncyAmIE1QSUNfVVNFU19EQ1IpKSB7Ci0JCWNvbnN0IHUzMiAqcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5vZGUsICJyZWciLCBOVUxMKTsKLQkJQlVHX09OKHJlZyA9PSBOVUxMKTsKLQkJcGFkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhub2RlLCByZWcpOwotCQlCVUdfT04ocGFkZHIgPT0gT0ZfQkFEX0FERFIpOwotCX0KKwlCVUdfT04oZmxhZ3MgJiBNUElDX1VTRVNfRENSKTsKKyNlbmRpZgogCiAJLyogTWFwIHRoZSBnbG9iYWwgcmVnaXN0ZXJzICovCi0JbXBpY19tYXAobXBpYywgbm9kZSwgcGFkZHIsICZtcGljLT5ncmVncywgTVBJQ19JTkZPKEdSRUdfQkFTRSksIDB4MTAwMCk7Ci0JbXBpY19tYXAobXBpYywgbm9kZSwgcGFkZHIsICZtcGljLT50bXJlZ3MsIE1QSUNfSU5GTyhUSU1FUl9CQVNFKSwgMHgxMDAwKTsKKwltcGljX21hcChtcGljLCBtcGljLT5wYWRkciwgJm1waWMtPmdyZWdzLCBNUElDX0lORk8oR1JFR19CQVNFKSwgMHgxMDAwKTsKKwltcGljX21hcChtcGljLCBtcGljLT5wYWRkciwgJm1waWMtPnRtcmVncywgTVBJQ19JTkZPKFRJTUVSX0JBU0UpLCAweDEwMDApOwogCiAJLyogUmVzZXQgKi8KIAogCS8qIFdoZW4gdXNpbmcgYSBkZXZpY2Utbm9kZSwgcmVzZXQgcmVxdWVzdHMgYXJlIG9ubHkgaG9ub3JlZCBpZiB0aGUgTVBJQwogCSAqIGlzIGFsbG93ZWQgdG8gcmVzZXQuCiAJICovCi0JaWYgKG1waWNfcmVzZXRfcHJvaGliaXRlZChub2RlKSkKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG1waWMtPm5vZGUsICJwaWMtbm8tcmVzZXQiLCBOVUxMKSkKIAkJbXBpYy0+ZmxhZ3MgfD0gTVBJQ19OT19SRVNFVDsKIAogCWlmICgoZmxhZ3MgJiBNUElDX1dBTlRTX1JFU0VUKSAmJiAhKG1waWMtPmZsYWdzICYgTVBJQ19OT19SRVNFVCkpIHsKQEAgLTEzMDcsNyArMTMzMSw3IEBACiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJdW5zaWduZWQgaW50IGNwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQoaSk7CiAKLQkJbXBpY19tYXAobXBpYywgbm9kZSwgcGFkZHIsICZtcGljLT5jcHVyZWdzW2NwdV0sCisJCW1waWNfbWFwKG1waWMsIG1waWMtPnBhZGRyLCAmbXBpYy0+Y3B1cmVnc1tjcHVdLAogCQkJIE1QSUNfSU5GTyhDUFVfQkFTRSkgKyBjcHUgKiBNUElDX0lORk8oQ1BVX1NUUklERSksCiAJCQkgMHgxMDAwKTsKIAl9CkBAIC0xMzE1LDE2ICsxMzM5LDIxIEBACiAJLyogSW5pdGlhbGl6ZSBtYWluIElTVSBpZiBub25lIHByb3ZpZGVkICovCiAJaWYgKG1waWMtPmlzdV9zaXplID09IDApIHsKIAkJbXBpYy0+aXN1X3NpemUgPSBtcGljLT5udW1fc291cmNlczsKLQkJbXBpY19tYXAobXBpYywgbm9kZSwgcGFkZHIsICZtcGljLT5pc3VzWzBdLAorCQltcGljX21hcChtcGljLCBtcGljLT5wYWRkciwgJm1waWMtPmlzdXNbMF0sCiAJCQkgTVBJQ19JTkZPKElSUV9CQVNFKSwgTVBJQ19JTkZPKElSUV9TVFJJREUpICogbXBpYy0+aXN1X3NpemUpOwogCX0KIAltcGljLT5pc3Vfc2hpZnQgPSAxICsgX19pbG9nMihtcGljLT5pc3Vfc2l6ZSAtIDEpOwogCW1waWMtPmlzdV9tYXNrID0gKDEgPDwgbXBpYy0+aXN1X3NoaWZ0KSAtIDE7CiAKLQltcGljLT5pcnFob3N0ID0gaXJxX2FsbG9jX2hvc3Qobm9kZSwgSVJRX0hPU1RfTUFQX0xJTkVBUiwKKwltcGljLT5pcnFob3N0ID0gaXJxX2FsbG9jX2hvc3QobXBpYy0+bm9kZSwgSVJRX0hPU1RfTUFQX0xJTkVBUiwKIAkJCQkgICAgICAgaXN1X3NpemUgPyBpc3Vfc2l6ZSA6IG1waWMtPm51bV9zb3VyY2VzLAogCQkJCSAgICAgICAmbXBpY19ob3N0X29wcywKIAkJCQkgICAgICAgZmxhZ3MgJiBNUElDX0xBUkdFX1ZFQ1RPUlMgPyAyMDQ4IDogMjU2KTsKKworCS8qCisJICogRklYTUU6IFRoZSBjb2RlIGxlYWtzIHRoZSBNUElDIG9iamVjdCBhbmQgbWFwcGluZ3MgaGVyZTsgdGhpcworCSAqIGlzIHZlcnkgdW5saWtlbHkgdG8gZmFpbCBidXQgaXQgb3VnaHQgdG8gYmUgZml4ZWQgYW55d2F5cy4KKwkgKi8KIAlpZiAobXBpYy0+aXJxaG9zdCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIApAQCAtMTM0NywxOSArMTM3NiwyMyBAQAogCX0KIAlwcmludGsoS0VSTl9JTkZPICJtcGljOiBTZXR0aW5nIHVwIE1QSUMgXCIlc1wiIHZlcnNpb24gJXMgYXQgJWxseCwiCiAJICAgICAgICIgbWF4ICVkIENQVXNcbiIsCi0JICAgICAgIG5hbWUsIHZlcnMsICh1bnNpZ25lZCBsb25nIGxvbmcpcGFkZHIsIG51bV9wb3NzaWJsZV9jcHVzKCkpOworCSAgICAgICBuYW1lLCB2ZXJzLCAodW5zaWduZWQgbG9uZyBsb25nKW1waWMtPnBhZGRyLCBudW1fcG9zc2libGVfY3B1cygpKTsKIAlwcmludGsoS0VSTl9JTkZPICJtcGljOiBJU1Ugc2l6ZTogJWQsIHNoaWZ0OiAlZCwgbWFzazogJXhcbiIsCiAJICAgICAgIG1waWMtPmlzdV9zaXplLCBtcGljLT5pc3Vfc2hpZnQsIG1waWMtPmlzdV9tYXNrKTsKIAogCW1waWMtPm5leHQgPSBtcGljczsKIAltcGljcyA9IG1waWM7CiAKLQlpZiAoZmxhZ3MgJiBNUElDX1BSSU1BUlkpIHsKKwlpZiAoIShmbGFncyAmIE1QSUNfU0VDT05EQVJZKSkgewogCQltcGljX3ByaW1hcnkgPSBtcGljOwogCQlpcnFfc2V0X2RlZmF1bHRfaG9zdChtcGljLT5pcnFob3N0KTsKIAl9CiAKIAlyZXR1cm4gbXBpYzsKKworZXJyX29mX25vZGVfcHV0OgorCW9mX25vZGVfcHV0KG5vZGUpOworCXJldHVybiBOVUxMOwogfQogCiB2b2lkIF9faW5pdCBtcGljX2Fzc2lnbl9pc3Uoc3RydWN0IG1waWMgKm1waWMsIHVuc2lnbmVkIGludCBpc3VfbnVtLApAQCAtMTM2OSw3ICsxNDAyLDcgQEAKIAogCUJVR19PTihpc3VfbnVtID49IE1QSUNfTUFYX0lTVSk7CiAKLQltcGljX21hcChtcGljLCBtcGljLT5pcnFob3N0LT5vZl9ub2RlLAorCW1waWNfbWFwKG1waWMsCiAJCSBwYWRkciwgJm1waWMtPmlzdXNbaXN1X251bV0sIDAsCiAJCSBNUElDX0lORk8oSVJRX1NUUklERSkgKiBtcGljLT5pc3Vfc2l6ZSk7CiAKQEAgLTEzODUsOCArMTQxOCw3IEBACiAKIHZvaWQgX19pbml0IG1waWNfaW5pdChzdHJ1Y3QgbXBpYyAqbXBpYykKIHsKLQlpbnQgaTsKLQlpbnQgY3B1OworCWludCBpLCBjcHU7CiAKIAlCVUdfT04obXBpYy0+bnVtX3NvdXJjZXMgPT0gMCk7CiAKQEAgLTE0MjQsNyArMTQ1Niw3IEBACiAKIAkvKiBEbyB0aGUgSFQgUElDIGZpeHVwcyBvbiBVMyBicm9rZW4gbXBpYyAqLwogCURCRygiTVBJQyBmbGFnczogJXhcbiIsIG1waWMtPmZsYWdzKTsKLQlpZiAoKG1waWMtPmZsYWdzICYgTVBJQ19VM19IVF9JUlFTKSAmJiAobXBpYy0+ZmxhZ3MgJiBNUElDX1BSSU1BUlkpKSB7CisJaWYgKChtcGljLT5mbGFncyAmIE1QSUNfVTNfSFRfSVJRUykgJiYgIShtcGljLT5mbGFncyAmIE1QSUNfU0VDT05EQVJZKSkgewogCQltcGljX3NjYW5faHRfcGljcyhtcGljKTsKIAkJbXBpY191M21zaV9pbml0KG1waWMpOwogCX0KQEAgLTE0NzEsNiArMTUwMywxNyBAQAogCQkJCSAgR0ZQX0tFUk5FTCk7CiAJQlVHX09OKG1waWMtPnNhdmVfZGF0YSA9PSBOVUxMKTsKICNlbmRpZgorCisJLyogQ2hlY2sgaWYgdGhpcyBNUElDIGlzIGNoYWluZWQgZnJvbSBhIHBhcmVudCBpbnRlcnJ1cHQgY29udHJvbGxlciAqLworCWlmIChtcGljLT5mbGFncyAmIE1QSUNfU0VDT05EQVJZKSB7CisJCWludCB2aXJxID0gaXJxX29mX3BhcnNlX2FuZF9tYXAobXBpYy0+bm9kZSwgMCk7CisJCWlmICh2aXJxICE9IE5PX0lSUSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGhvb2tpbmcgdXAgdG8gSVJRICVkXG4iLAorCQkJCQltcGljLT5ub2RlLT5mdWxsX25hbWUsIHZpcnEpOworCQkJaXJxX3NldF9oYW5kbGVyX2RhdGEodmlycSwgbXBpYyk7CisJCQlpcnFfc2V0X2NoYWluZWRfaGFuZGxlcih2aXJxLCAmbXBpY19jYXNjYWRlKTsKKwkJfQorCX0KIH0KIAogdm9pZCBfX2luaXQgbXBpY19zZXRfY2xrX3JhdGlvKHN0cnVjdCBtcGljICptcGljLCB1MzIgY2xvY2tfcmF0aW8pCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9wY2kuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jCmluZGV4IDg2MmYxMWIuLjRmMDVmNzUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5jCkBAIC0xODUsOSArMTg1LDE1IEBACiAgb3V0OgogCWRtYV9vZmZzZXRfc2V0ID0gMTsKIAlwY2lfZHJhbV9vZmZzZXQgPSByZXMtPnN0YXJ0OworCWhvc2UtPmRtYV93aW5kb3dfYmFzZV9jdXIgPSByZXMtPnN0YXJ0OworCWhvc2UtPmRtYV93aW5kb3dfc2l6ZSA9IHJlc291cmNlX3NpemUocmVzKTsKIAogCXByaW50ayhLRVJOX0lORk8gIjR4eCBQQ0kgRE1BIG9mZnNldCBzZXQgdG8gMHglMDhseFxuIiwKIAkgICAgICAgcGNpX2RyYW1fb2Zmc2V0KTsKKwlwcmludGsoS0VSTl9JTkZPICI0eHggUENJIERNQSB3aW5kb3cgYmFzZSB0byAweCUwMTZsbHhcbiIsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpaG9zZS0+ZG1hX3dpbmRvd19iYXNlX2N1cik7CisJcHJpbnRrKEtFUk5fSU5GTyAiRE1BIHdpbmRvdyBzaXplIDB4JTAxNmxseFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylob3NlLT5kbWFfd2luZG93X3NpemUpOwogCXJldHVybiAwOwogfQogCkBAIC02NDcsNiArNjUzLDcgQEAKIAogc3RydWN0IHBwYzR4eF9wY2lleF9od29wcwogeworCWJvb2wgd2FudF9zZHI7CiAJaW50ICgqY29yZV9pbml0KShzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wKTsKIAlpbnQgKCpwb3J0X2luaXRfaHcpKHN0cnVjdCBwcGM0eHhfcGNpZXhfcG9ydCAqcG9ydCk7CiAJaW50ICgqc2V0dXBfdXRsKShzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpOwpAQCAtOTE2LDYgKzkyMyw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcHBjNHh4X3BjaWV4X2h3b3BzIHBwYzQ0MHNwZUFfcGNpZV9od29wcyBfX2luaXRkYXRhID0KIHsKKwkud2FudF9zZHIJPSB0cnVlLAogCS5jb3JlX2luaXQJPSBwcGM0NDBzcGVfcGNpZXhfY29yZV9pbml0LAogCS5wb3J0X2luaXRfaHcJPSBwcGM0NDBzcGVBX3BjaWV4X2luaXRfcG9ydF9odywKIAkuc2V0dXBfdXRsCT0gcHBjNDQwc3BlQV9wY2lleF9pbml0X3V0bCwKQEAgLTkyNCw2ICs5MzIsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBwYzR4eF9wY2lleF9od29wcyBwcGM0NDBzcGVCX3BjaWVfaHdvcHMgX19pbml0ZGF0YSA9CiB7CisJLndhbnRfc2RyCT0gdHJ1ZSwKIAkuY29yZV9pbml0CT0gcHBjNDQwc3BlX3BjaWV4X2NvcmVfaW5pdCwKIAkucG9ydF9pbml0X2h3CT0gcHBjNDQwc3BlQl9wY2lleF9pbml0X3BvcnRfaHcsCiAJLnNldHVwX3V0bAk9IHBwYzQ0MHNwZUJfcGNpZXhfaW5pdF91dGwsCkBAIC0xMDM0LDYgKzEwNDMsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBwYzR4eF9wY2lleF9od29wcyBwcGM0NjBleF9wY2llX2h3b3BzIF9faW5pdGRhdGEgPQogeworCS53YW50X3Nkcgk9IHRydWUsCiAJLmNvcmVfaW5pdAk9IHBwYzQ2MGV4X3BjaWV4X2NvcmVfaW5pdCwKIAkucG9ydF9pbml0X2h3CT0gcHBjNDYwZXhfcGNpZXhfaW5pdF9wb3J0X2h3LAogCS5zZXR1cF91dGwJPSBwcGM0NjBleF9wY2lleF9pbml0X3V0bCwKQEAgLTExODEsNiArMTE5MSw3IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcHBjNHh4X3BjaWV4X2h3b3BzIHBwYzQ2MHN4X3BjaWVfaHdvcHMgX19pbml0ZGF0YSA9IHsKKwkud2FudF9zZHIJPSB0cnVlLAogCS5jb3JlX2luaXQJPSBwcGM0NjBzeF9wY2lleF9jb3JlX2luaXQsCiAJLnBvcnRfaW5pdF9odwk9IHBwYzQ2MHN4X3BjaWV4X2luaXRfcG9ydF9odywKIAkuc2V0dXBfdXRsCT0gcHBjNDYwc3hfcGNpZXhfaW5pdF91dGwsCkBAIC0xMjc2LDYgKzEyODcsNyBAQAogCiBzdGF0aWMgc3RydWN0IHBwYzR4eF9wY2lleF9od29wcyBwcGM0MDVleF9wY2llX2h3b3BzIF9faW5pdGRhdGEgPQogeworCS53YW50X3Nkcgk9IHRydWUsCiAJLmNvcmVfaW5pdAk9IHBwYzQwNWV4X3BjaWV4X2NvcmVfaW5pdCwKIAkucG9ydF9pbml0X2h3CT0gcHBjNDA1ZXhfcGNpZXhfaW5pdF9wb3J0X2h3LAogCS5zZXR1cF91dGwJPSBwcGM0MDVleF9wY2lleF9pbml0X3V0bCwKQEAgLTEyODQsNiArMTI5Niw1MiBAQAogCiAjZW5kaWYgLyogQ09ORklHXzQweCAqLwogCisjaWZkZWYgQ09ORklHXzQ3NkZQRQorc3RhdGljIGludCBfX2luaXQgcHBjXzQ3NmZwZV9wY2lleF9jb3JlX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKK3sKKwlyZXR1cm4gNDsKK30KKworc3RhdGljIHZvaWQgX19pbml0IHBwY180NzZmcGVfcGNpZXhfY2hlY2tfbGluayhzdHJ1Y3QgcHBjNHh4X3BjaWV4X3BvcnQgKnBvcnQpCit7CisJdTMyIHRpbWVvdXRfbXMgPSAyMDsKKwl1MzIgdmFsID0gMCwgbWFzayA9IChQRUNGR19UTERMUF9MTktVUHxQRUNGR19UTERMUF9QUkVTRU5UKTsKKwl2b2lkIF9faW9tZW0gKm1iYXNlID0gaW9yZW1hcChwb3J0LT5jZmdfc3BhY2Uuc3RhcnQgKyAweDEwMDAwMDAwLAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJQQ0lFJWQ6IENoZWNraW5nIGxpbmsuLi5cbiIsIHBvcnQtPmluZGV4KTsKKworCWlmIChtYmFzZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSUUlZDogZmFpbGVkIHRvIGdldCBjZmcgc3BhY2VcbiIsCisJCSAgICAgICAgICAgICAgICAgICAgcG9ydC0+aW5kZXgpOworCQlyZXR1cm47CisJfQorCQkKKwl3aGlsZSAodGltZW91dF9tcy0tKSB7CisJCXZhbCA9IGluX2xlMzIobWJhc2UgKyBQRUNGR19UTERMUCk7CisKKwkJaWYgKCh2YWwgJiBtYXNrKSA9PSBtYXNrKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxMCk7CisJfQorCisJaWYgKHZhbCAmIFBFQ0ZHX1RMRExQX1BSRVNFTlQpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJRSVkOiBsaW5rIGlzIHVwICFcbiIsIHBvcnQtPmluZGV4KTsKKwkJcG9ydC0+bGluayA9IDE7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBDSUUlZDogTGluayB1cCBmYWlsZWRcbiIsIHBvcnQtPmluZGV4KTsKKworCWlvdW5tYXAobWJhc2UpOworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBwcGM0eHhfcGNpZXhfaHdvcHMgcHBjXzQ3NmZwZV9wY2llX2h3b3BzIF9faW5pdGRhdGEgPQoreworCS5jb3JlX2luaXQJPSBwcGNfNDc2ZnBlX3BjaWV4X2NvcmVfaW5pdCwKKwkuY2hlY2tfbGluawk9IHBwY180NzZmcGVfcGNpZXhfY2hlY2tfbGluaywKK307CisjZW5kaWYgLyogQ09ORklHXzQ3NkZQRSAqLworCiAvKiBDaGVjayB0aGF0IHRoZSBjb3JlIGhhcyBiZWVuIGluaXRpZWQgYW5kIGlmIG5vdCwgZG8gaXQgKi8KIHN0YXRpYyBpbnQgX19pbml0IHBwYzR4eF9wY2lleF9jaGVja19jb3JlX2luaXQoc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKQEAgLTEzMDksNiArMTM2NywxMCBAQAogCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImlibSxwbGItcGNpZXgtNDA1ZXgiKSkKIAkJcHBjNHh4X3BjaWV4X2h3b3BzID0gJnBwYzQwNWV4X3BjaWVfaHdvcHM7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfNDc2RlBFCisJaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiaWJtLHBsYi1wY2lleC00NzZmcGUiKSkKKwkJcHBjNHh4X3BjaWV4X2h3b3BzID0gJnBwY180NzZmcGVfcGNpZV9od29wczsKKyNlbmRpZgogCWlmIChwcGM0eHhfcGNpZXhfaHdvcHMgPT0gTlVMTCkgewogCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQ0lFOiB1bmtub3duIGhvc3QgdHlwZSAlc1xuIiwKIAkJICAgICAgIG5wLT5mdWxsX25hbWUpOwpAQCAtMTYxNyw2ICsxNjc5LDEwIEBACiAJCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIxTVNLTCwKIAkJCQlzYSB8IERDUk9fUEVHUExfNDYwU1hfT01SMU1TS0xfVU9UCiAJCQkJCXwgRENST19QRUdQTF9PTVJ4TVNLTF9WQUwpOworCQllbHNlIGlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwb3J0LT5ub2RlLCAiaWJtLHBsYi1wY2lleC00NzZmcGUiKSkKKwkJCWRjcl93cml0ZShwb3J0LT5kY3JzLCBEQ1JPX1BFR1BMX09NUjFNU0tMLAorCQkJCXNhIHwgRENST19QRUdQTF80NzZGUEVfT01SMU1TS0xfVU9UCisJCQkJCXwgRENST19QRUdQTF9PTVJ4TVNLTF9WQUwpOwogCQllbHNlCiAJCQlkY3Jfd3JpdGUocG9ydC0+ZGNycywgRENST19QRUdQTF9PTVIxTVNLTCwKIAkJCQlzYSB8IERDUk9fUEVHUExfT01SMU1TS0xfVU9UCkBAIC0xNzM5LDkgKzE4MDUsMTAgQEAKIAkJLyogQ2FsY3VsYXRlIHdpbmRvdyBzaXplICovCiAJCXNhID0gKDB4ZmZmZmZmZmZmZmZmZmZmZnVsbCA8PCBpbG9nMihzaXplKSk7CiAJCWlmIChyZXMtPmZsYWdzICYgSU9SRVNPVVJDRV9QUkVGRVRDSCkKLQkJCXNhIHw9IDB4ODsKKwkJCXNhIHw9IFBDSV9CQVNFX0FERFJFU1NfTUVNX1BSRUZFVENIOwogCi0JCWlmIChvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShwb3J0LT5ub2RlLCAiaWJtLHBsYi1wY2lleC00NjBzeCIpKQorCQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocG9ydC0+bm9kZSwgImlibSxwbGItcGNpZXgtNDYwc3giKSB8fAorCQkgICAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUocG9ydC0+bm9kZSwgImlibSxwbGItcGNpZXgtNDc2ZnBlIikpCiAJCQlzYSB8PSBQQ0lfQkFTRV9BRERSRVNTX01FTV9UWVBFXzY0OwogCiAJCW91dF9sZTMyKG1iYXNlICsgUEVDRkdfQkFSMEhNUEEsIFJFU19UT19VMzJfSElHSChzYSkpOwpAQCAtMTk3MiwxMyArMjAzOSwxNSBAQAogCX0KIAogCXBvcnQtPm5vZGUgPSBvZl9ub2RlX2dldChucCk7Ci0JcHZhbCA9IG9mX2dldF9wcm9wZXJ0eShucCwgInNkci1iYXNlIiwgTlVMTCk7Ci0JaWYgKHB2YWwgPT0gTlVMTCkgewotCQlwcmludGsoS0VSTl9FUlIgIlBDSUU6IG1pc3Npbmcgc2RyLWJhc2UgZm9yICVzXG4iLAotCQkgICAgICAgbnAtPmZ1bGxfbmFtZSk7Ci0JCXJldHVybjsKKwlpZiAocHBjNHh4X3BjaWV4X2h3b3BzLT53YW50X3NkcikgeworCQlwdmFsID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAic2RyLWJhc2UiLCBOVUxMKTsKKwkJaWYgKHB2YWwgPT0gTlVMTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJQQ0lFOiBtaXNzaW5nIHNkci1iYXNlIGZvciAlc1xuIiwKKwkJCSAgICAgICBucC0+ZnVsbF9uYW1lKTsKKwkJCXJldHVybjsKKwkJfQorCQlwb3J0LT5zZHJfYmFzZSA9ICpwdmFsOwogCX0KLQlwb3J0LT5zZHJfYmFzZSA9ICpwdmFsOwogCiAJLyogQ2hlY2sgaWYgZGV2aWNlX3R5cGUgcHJvcGVydHkgaXMgc2V0IHRvICJwY2kiIG9yICJwY2ktZW5kcG9pbnQiLgogCSAqIFJlc3VsdGluZyBmcm9tIHRoaXMgc2V0dXAgdGhpcyBQQ0llIHBvcnQgd2lsbCBiZSBjb25maWd1cmVkCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3BwYzR4eF9wY2kuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5oCmluZGV4IDMyY2U3NjMuLmJiNDgyMTkgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcHBjNHh4X3BjaS5oCkBAIC00NzYsNiArNDc2LDEzIEBACiAjZGVmaW5lIERDUk9fUEVHUExfT01SMU1TS0xfVU9UCSAweDAwMDAwMDAyCiAjZGVmaW5lIERDUk9fUEVHUExfT01SM01TS0xfSU8JIDB4MDAwMDAwMDIKIAorLyogNDc2RlBFICovCisjZGVmaW5lIFBDQ0ZHX0xDUEEJCQkweDI3MAorI2RlZmluZSBQRUNGR19UTERMUAkJCTB4M0Y4CisjZGVmaW5lIFBFQ0ZHX1RMRExQX0xOS1VQCQkweDAwMDAwMDA4CisjZGVmaW5lIFBFQ0ZHX1RMRExQX1BSRVNFTlQJCTB4MDAwMDAwMTAKKyNkZWZpbmUgRENST19QRUdQTF80NzZGUEVfT01SMU1TS0xfVU9UCSAweDAwMDAwMDA0CisKIC8qIFNEUiBCaXQgTWFwcGluZ3MgKi8KICNkZWZpbmUgUEVTRFJ4X1JDU1NFVF9ITERQTEIJMHgxMDAwMDAwMAogI2RlZmluZSBQRVNEUnhfUkNTU0VUX1JTVEdVCTB4MDEwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3AtaHYuYyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYveGljcy9pY3AtaHYuYwppbmRleCA5NTE4ZDM2Li4yNTNkY2U5IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MvaWNwLWh2LmMKKysrIGIvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL2ljcC1odi5jCkBAIC0yNywzMyArMjcsNTAgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHJldGJ1ZltQTFBBUl9IQ0FMTF9CVUZTSVpFXTsKIAlsb25nIHJjOworCXVuc2lnbmVkIGludCByZXQgPSBYSUNTX0lSUV9TUFVSSU9VUzsKIAogCXJjID0gcGxwYXJfaGNhbGwoSF9YSVJSLCByZXRidWYsIGNwcHIpOwotCWlmIChyYyAhPSBIX1NVQ0NFU1MpCi0JCXBhbmljKCIgYmFkIHJldHVybiBjb2RlIHhpcnIgLSByYyA9ICVseFxuIiwgcmMpOwotCXJldHVybiAodW5zaWduZWQgaW50KXJldGJ1ZlswXTsKLX0KKwlpZiAocmMgPT0gSF9TVUNDRVNTKSB7CisJCXJldCA9ICh1bnNpZ25lZCBpbnQpcmV0YnVmWzBdOworCX0gZWxzZSB7CisJCXByX2VycigiJXM6IGJhZCByZXR1cm4gY29kZSB4aXJyIGNwcHI9MHgleCByZXR1cm5lZCAlbGRcbiIsCisJCQlfX2Z1bmNfXywgY3BwciwgcmMpOworCQlXQVJOX09OX09OQ0UoMSk7CisJfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaWNwX2h2X3NldF94aXJyKHVuc2lnbmVkIGludCB2YWx1ZSkKLXsKLQlsb25nIHJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfRU9JLCB2YWx1ZSk7Ci0JaWYgKHJjICE9IEhfU1VDQ0VTUykKLQkJcGFuaWMoImJhZCByZXR1cm4gY29kZSBFT0kgLSByYyA9ICVsZCwgdmFsdWU9JXhcbiIsIHJjLCB2YWx1ZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGljcF9odl9zZXRfY3Bwcih1OCB2YWx1ZSkKIHsKIAlsb25nIHJjID0gcGxwYXJfaGNhbGxfbm9yZXRzKEhfQ1BQUiwgdmFsdWUpOwotCWlmIChyYyAhPSBIX1NVQ0NFU1MpCi0JCXBhbmljKCJiYWQgcmV0dXJuIGNvZGUgY3BwciAtIHJjID0gJWx4XG4iLCByYyk7CisJaWYgKHJjICE9IEhfU1VDQ0VTUykgeworCQlwcl9lcnIoIiVzOiBiYWQgcmV0dXJuIGNvZGUgY3BwciBjcHByPTB4JXggcmV0dXJuZWQgJWxkXG4iLAorCQkJX19mdW5jX18sIHZhbHVlLCByYyk7CisJCVdBUk5fT05fT05DRSgxKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpY3BfaHZfc2V0X3hpcnIodW5zaWduZWQgaW50IHZhbHVlKQoreworCWxvbmcgcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9FT0ksIHZhbHVlKTsKKwlpZiAocmMgIT0gSF9TVUNDRVNTKSB7CisJCXByX2VycigiJXM6IGJhZCByZXR1cm4gY29kZSBlb2kgeGlycj0weCV4IHJldHVybmVkICVsZFxuIiwKKwkJCV9fZnVuY19fLCB2YWx1ZSwgcmMpOworCQlXQVJOX09OX09OQ0UoMSk7CisJCWljcF9odl9zZXRfY3Bwcih2YWx1ZSA+PiAyNCk7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaWNwX2h2X3NldF9xaXJyKGludCBuX2NwdSAsIHU4IHZhbHVlKQogewotCWxvbmcgcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9JUEksIGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQobl9jcHUpLAotCQkJCSAgICAgdmFsdWUpOwotCWlmIChyYyAhPSBIX1NVQ0NFU1MpCi0JCXBhbmljKCJiYWQgcmV0dXJuIGNvZGUgcWlyciAtIHJjID0gJWx4XG4iLCByYyk7CisJaW50IGh3X2NwdSA9IGdldF9oYXJkX3NtcF9wcm9jZXNzb3JfaWQobl9jcHUpOworCWxvbmcgcmMgPSBwbHBhcl9oY2FsbF9ub3JldHMoSF9JUEksIGh3X2NwdSwgdmFsdWUpOworCWlmIChyYyAhPSBIX1NVQ0NFU1MpIHsKKwkJcHJfZXJyKCIlczogYmFkIHJldHVybiBjb2RlIHFpcnIgY3B1PSVkIGh3X2NwdT0lZCBtZnJyPTB4JXggIgorCQkJInJldHVybmVkICVsZFxuIiwgX19mdW5jX18sIG5fY3B1LCBod19jcHUsIHZhbHVlLCByYyk7CisJCVdBUk5fT05fT05DRSgxKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGljcF9odl9lb2koc3RydWN0IGlycV9kYXRhICpkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi94aWNzL3hpY3MtY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MveGljcy1jb21tb24uYwppbmRleCA2Mzc2MmM2Li5kNzJlZGE2IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MveGljcy1jb21tb24uYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L3hpY3MveGljcy1jb21tb24uYwpAQCAtMTM3LDcgKzEzNyw3IEBACiAJICogSVBJcyBhcmUgbWFya2VkIElSUUZfUEVSQ1BVLiBUaGUgaGFuZGxlciB3YXMgc2V0IGluIG1hcC4KIAkgKi8KIAlCVUdfT04ocmVxdWVzdF9pcnEoaXBpLCBpY3Bfb3BzLT5pcGlfYWN0aW9uLAotCQkJICAgSVJRRl9QRVJDUFUsICJJUEkiLCBOVUxMKSk7CisJCQkgICBJUlFGX1BFUkNQVSB8IElSUUZfTk9fVEhSRUFELCAiSVBJIiwgTlVMTCkpOwogfQogCiBpbnQgX19pbml0IHhpY3Nfc21wX3Byb2JlKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMgYi9hcmNoL3Bvd2VycGMveG1vbi94bW9uLmMKaW5kZXggMDNhMjE3YS4uY2I5NWVlYSAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3htb24veG1vbi5jCisrKyBiL2FyY2gvcG93ZXJwYy94bW9uL3htb24uYwpAQCAtMjI4LDEzICsyMjgsMTEgQEAKICAgdAlwcmludCBiYWNrdHJhY2VcblwKICAgeAlleGl0IG1vbml0b3IgYW5kIHJlY292ZXJcblwKICAgWAlleGl0IG1vbml0b3IgYW5kIGRvbnQgcmVjb3ZlclxuIgotI2lmZGVmIENPTkZJR19QUEM2NAorI2lmIGRlZmluZWQoQ09ORklHX1BQQzY0KSAmJiAhZGVmaW5lZChDT05GSUdfUFBDX0JPT0szRSkKICIgIHUJZHVtcCBzZWdtZW50IHRhYmxlIG9yIFNMQlxuIgotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BQQ19TVERfTU1VXzMyCisjZWxpZiBkZWZpbmVkKENPTkZJR19QUENfU1REX01NVV8zMikKICIgIHUJZHVtcCBzZWdtZW50IHJlZ2lzdGVyc1xuIgotI2VuZGlmCi0jaWZkZWYgQ09ORklHXzQ0eAorI2VsaWYgZGVmaW5lZChDT05GSUdfNDR4KSB8fCBkZWZpbmVkKENPTkZJR19QUENfQk9PSzNFKQogIiAgdQlkdW1wIFRMQlxuIgogI2VuZGlmCiAiICA/CWhlbHBcbiIKQEAgLTM0MCw3ICszMzgsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCB1bnJlY292ZXJhYmxlX2V4Y3Aoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfNHh4KSB8fCBkZWZpbmVkKENPTkZJR19CT09LM0UpCisjaWYgZGVmaW5lZChDT05GSUdfNHh4KSB8fCBkZWZpbmVkKENPTkZJR19QUENfQk9PSzNFKQogCS8qIFdlIGhhdmUgbm8gTVNSX1JJIGJpdCBvbiA0eHggb3IgQm9vazNlLCBzbyB3ZSBzaW1wbHkgcmV0dXJuIGZhbHNlICovCiAJcmV0dXJuIDA7CiAjZWxzZQpAQCAtODg1LDEzICs4ODMsMTEgQEAKIAkJY2FzZSAndSc6CiAJCQlkdW1wX3NlZ21lbnRzKCk7CiAJCQlicmVhazsKLSNlbmRpZgotI2lmZGVmIENPTkZJR180eHgKKyNlbGlmIGRlZmluZWQoQ09ORklHXzR4eCkKIAkJY2FzZSAndSc6CiAJCQlkdW1wX3RsYl80NHgoKTsKIAkJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1BQQ19CT09LM0UKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BQQ19CT09LM0UpCiAJCWNhc2UgJ3UnOgogCQkJZHVtcF90bGJfYm9vazNlKCk7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9LY29uZmlnIGIvYXJjaC9zMzkwL0tjb25maWcKaW5kZXggMzczNjc5Yi4uZDQ4ZWRlMyAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL0tjb25maWcKKysrIGIvYXJjaC9zMzkwL0tjb25maWcKQEAgLTkyLDYgKzkyLDkgQEAKIAlzZWxlY3QgSEFWRV9BUkNIX0pVTVBfTEFCRUwgaWYgIU1BUkNIX0c1CiAJc2VsZWN0IEhBVkVfUkNVX1RBQkxFX0ZSRUUgaWYgU01QCiAJc2VsZWN0IEFSQ0hfU0FWRV9QQUdFX0tFWVMgaWYgSElCRVJOQVRJT04KKwlzZWxlY3QgSEFWRV9NRU1CTE9DSworCXNlbGVjdCBIQVZFX01FTUJMT0NLX05PREVfTUFQCisJc2VsZWN0IEFSQ0hfRElTQ0FSRF9NRU1CTE9DSwogCXNlbGVjdCBBUkNIX0lOTElORV9TUElOX1RSWUxPQ0sKIAlzZWxlY3QgQVJDSF9JTkxJTkVfU1BJTl9UUllMT0NLX0JICiAJc2VsZWN0IEFSQ0hfSU5MSU5FX1NQSU5fTE9DSwpAQCAtMzQ1LDkgKzM0OCw2IEBACiAKIAkgIFNheSBOIGlmIHlvdSBhcmUgdW5zdXJlLgogCi1jb25maWcgQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKLQlkZWZfYm9vbCB5Ci0KIGNvbW1lbnQgIktlcm5lbCBwcmVlbXB0aW9uIgogCiBzb3VyY2UgImtlcm5lbC9LY29uZmlnLnByZWVtcHQiCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvYXBwbGRhdGEvYXBwbGRhdGFfb3MuYyBiL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9vcy5jCmluZGV4IDkyZjFjYjcuLjRkZTAzMWQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9vcy5jCisrKyBiL2FyY2gvczM5MC9hcHBsZGF0YS9hcHBsZGF0YV9vcy5jCkBAIC0xMTUsMjEgKzExNSwyMSBAQAogCWogPSAwOwogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewogCQlvc19kYXRhLT5vc19jcHVbal0ucGVyX2NwdV91c2VyID0KLQkJCWNwdXRpbWVfdG9famlmZmllcyhrc3RhdF9jcHUoaSkuY3B1c3RhdC51c2VyKTsKKwkJCWNwdXRpbWVfdG9famlmZmllcyhrY3B1c3RhdF9jcHUoaSkuY3B1c3RhdFtDUFVUSU1FX1VTRVJdKTsKIAkJb3NfZGF0YS0+b3NfY3B1W2pdLnBlcl9jcHVfbmljZSA9Ci0JCQljcHV0aW1lX3RvX2ppZmZpZXMoa3N0YXRfY3B1KGkpLmNwdXN0YXQubmljZSk7CisJCQljcHV0aW1lX3RvX2ppZmZpZXMoa2NwdXN0YXRfY3B1KGkpLmNwdXN0YXRbQ1BVVElNRV9OSUNFXSk7CiAJCW9zX2RhdGEtPm9zX2NwdVtqXS5wZXJfY3B1X3N5c3RlbSA9Ci0JCQljcHV0aW1lX3RvX2ppZmZpZXMoa3N0YXRfY3B1KGkpLmNwdXN0YXQuc3lzdGVtKTsKKwkJCWNwdXRpbWVfdG9famlmZmllcyhrY3B1c3RhdF9jcHUoaSkuY3B1c3RhdFtDUFVUSU1FX1NZU1RFTV0pOwogCQlvc19kYXRhLT5vc19jcHVbal0ucGVyX2NwdV9pZGxlID0KLQkJCWNwdXRpbWVfdG9famlmZmllcyhrc3RhdF9jcHUoaSkuY3B1c3RhdC5pZGxlKTsKKwkJCWNwdXRpbWVfdG9famlmZmllcyhrY3B1c3RhdF9jcHUoaSkuY3B1c3RhdFtDUFVUSU1FX0lETEVdKTsKIAkJb3NfZGF0YS0+b3NfY3B1W2pdLnBlcl9jcHVfaXJxID0KLQkJCWNwdXRpbWVfdG9famlmZmllcyhrc3RhdF9jcHUoaSkuY3B1c3RhdC5pcnEpOworCQkJY3B1dGltZV90b19qaWZmaWVzKGtjcHVzdGF0X2NwdShpKS5jcHVzdGF0W0NQVVRJTUVfSVJRXSk7CiAJCW9zX2RhdGEtPm9zX2NwdVtqXS5wZXJfY3B1X3NvZnRpcnEgPQotCQkJY3B1dGltZV90b19qaWZmaWVzKGtzdGF0X2NwdShpKS5jcHVzdGF0LnNvZnRpcnEpOworCQkJY3B1dGltZV90b19qaWZmaWVzKGtjcHVzdGF0X2NwdShpKS5jcHVzdGF0W0NQVVRJTUVfU09GVElSUV0pOwogCQlvc19kYXRhLT5vc19jcHVbal0ucGVyX2NwdV9pb3dhaXQgPQotCQkJY3B1dGltZV90b19qaWZmaWVzKGtzdGF0X2NwdShpKS5jcHVzdGF0Lmlvd2FpdCk7CisJCQljcHV0aW1lX3RvX2ppZmZpZXMoa2NwdXN0YXRfY3B1KGkpLmNwdXN0YXRbQ1BVVElNRV9JT1dBSVRdKTsKIAkJb3NfZGF0YS0+b3NfY3B1W2pdLnBlcl9jcHVfc3RlYWwgPQotCQkJY3B1dGltZV90b19qaWZmaWVzKGtzdGF0X2NwdShpKS5jcHVzdGF0LnN0ZWFsKTsKKwkJCWNwdXRpbWVfdG9famlmZmllcyhrY3B1c3RhdF9jcHUoaSkuY3B1c3RhdFtDUFVUSU1FX1NURUFMXSk7CiAJCW9zX2RhdGEtPm9zX2NwdVtqXS5jcHVfaWQgPSBpOwogCQlqKys7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwdXRpbWUuaCBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9jcHV0aW1lLmgKaW5kZXggMDgxNDM0OC4uYzIzYzM5MCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL2NwdXRpbWUuaAorKysgYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vY3B1dGltZS5oCkBAIC0xNiwxMTQgKzE2LDEwMCBAQAogCiAvKiBXZSB3YW50IHRvIHVzZSBmdWxsIHJlc29sdXRpb24gb2YgdGhlIENQVSB0aW1lcjogMioqLTEyIG1pY3JvLXNlY29uZHMuICovCiAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGNwdXRpbWVfdDsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGNwdXRpbWU2NF90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX19ub2Nhc3QgY3B1dGltZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgX19ub2Nhc3QgY3B1dGltZTY0X3Q7CiAKLSNpZm5kZWYgX19zMzkweF9fCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1fX2Rpdih1bnNpZ25lZCBsb25nIGxvbmcgbiwgdW5zaWduZWQgaW50IGJhc2UpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgX19kaXYodW5zaWduZWQgbG9uZyBsb25nIG4sIHVuc2lnbmVkIGxvbmcgYmFzZSkKIHsKKyNpZm5kZWYgX19zMzkweF9fCiAJcmVnaXN0ZXJfcGFpciBycDsKIAogCXJwLnBhaXIgPSBuID4+IDE7CiAJYXNtICgiZHIgJTAsJTEiIDogIitkIiAocnApIDogImQiIChiYXNlID4+IDEpKTsKIAlyZXR1cm4gcnAuc3VicmVnLm9kZDsKLX0KLQogI2Vsc2UgLyogX19zMzkweF9fICovCi0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1fX2Rpdih1bnNpZ25lZCBsb25nIGxvbmcgbiwgdW5zaWduZWQgaW50IGJhc2UpCi17CiAJcmV0dXJuIG4gLyBiYXNlOworI2VuZGlmIC8qIF9fczM5MHhfXyAqLwogfQogCi0jZW5kaWYgLyogX19zMzkweF9fICovCi0KLSNkZWZpbmUgY3B1dGltZV96ZXJvCQkJKDBVTEwpCiAjZGVmaW5lIGNwdXRpbWVfb25lX2ppZmZ5CQlqaWZmaWVzX3RvX2NwdXRpbWUoMSkKLSNkZWZpbmUgY3B1dGltZV9tYXgJCQkoKH4wVUwgPj4gMSkgLSAxKQotI2RlZmluZSBjcHV0aW1lX2FkZChfX2EsIF9fYikJCSgoX19hKSArICAoX19iKSkKLSNkZWZpbmUgY3B1dGltZV9zdWIoX19hLCBfX2IpCQkoKF9fYSkgLSAgKF9fYikpCi0jZGVmaW5lIGNwdXRpbWVfZGl2KF9fYSwgX19uKSAoewkJXAotCXVuc2lnbmVkIGxvbmcgbG9uZyBfX2RpdiA9IChfX2EpOwlcCi0JZG9fZGl2KF9fZGl2LF9fbik7CQkJXAotCV9fZGl2OwkJCQkJXAotfSkKLSNkZWZpbmUgY3B1dGltZV9oYWx2ZShfX2EpCQkoKF9fYSkgPj4gMSkKLSNkZWZpbmUgY3B1dGltZV9lcShfX2EsIF9fYikJCSgoX19hKSA9PSAoX19iKSkKLSNkZWZpbmUgY3B1dGltZV9ndChfX2EsIF9fYikJCSgoX19hKSA+ICAoX19iKSkKLSNkZWZpbmUgY3B1dGltZV9nZShfX2EsIF9fYikJCSgoX19hKSA+PSAoX19iKSkKLSNkZWZpbmUgY3B1dGltZV9sdChfX2EsIF9fYikJCSgoX19hKSA8ICAoX19iKSkKLSNkZWZpbmUgY3B1dGltZV9sZShfX2EsIF9fYikJCSgoX19hKSA8PSAoX19iKSkKLSNkZWZpbmUgY3B1dGltZV90b19qaWZmaWVzKF9fY3QpCShfX2RpdigoX19jdCksIDQwOTYwMDAwMDBVTEwgLyBIWikpCi0jZGVmaW5lIGNwdXRpbWVfdG9fc2NhbGVkKF9fY3QpCQkoX19jdCkKLSNkZWZpbmUgamlmZmllc190b19jcHV0aW1lKF9faHopCSgoY3B1dGltZV90KShfX2h6KSAqICg0MDk2MDAwMDAwVUxMIC8gSFopKQogCi0jZGVmaW5lIGNwdXRpbWU2NF96ZXJvCQkJKDBVTEwpCi0jZGVmaW5lIGNwdXRpbWU2NF9hZGQoX19hLCBfX2IpCQkoKF9fYSkgKyAoX19iKSkKLSNkZWZpbmUgY3B1dGltZV90b19jcHV0aW1lNjQoX19jdCkJKF9fY3QpCi0KLXN0YXRpYyBpbmxpbmUgdTY0Ci1jcHV0aW1lNjRfdG9famlmZmllczY0KGNwdXRpbWU2NF90IGNwdXRpbWUpCisvKgorICogQ29udmVydCBjcHV0aW1lIHRvIGppZmZpZXMgYW5kIGJhY2suCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjcHV0aW1lX3RvX2ppZmZpZXMoY29uc3QgY3B1dGltZV90IGNwdXRpbWUpCiB7Ci0JZG9fZGl2KGNwdXRpbWUsIDQwOTYwMDAwMDBVTEwgLyBIWik7Ci0JcmV0dXJuIGNwdXRpbWU7CisJcmV0dXJuIF9fZGl2KChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcgbG9uZykgY3B1dGltZSwgNDA5NjAwMDAwMFVMTCAvIEhaKTsKK30KKworc3RhdGljIGlubGluZSBjcHV0aW1lX3QgamlmZmllc190b19jcHV0aW1lKGNvbnN0IHVuc2lnbmVkIGludCBqaWYpCit7CisJcmV0dXJuIChfX2ZvcmNlIGNwdXRpbWVfdCkoamlmICogKDQwOTYwMDAwMDBVTEwgLyBIWikpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBjcHV0aW1lNjRfdG9famlmZmllczY0KGNwdXRpbWU2NF90IGNwdXRpbWUpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGppZiA9IChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcgbG9uZykgY3B1dGltZTsKKwlkb19kaXYoamlmLCA0MDk2MDAwMDAwVUxMIC8gSFopOworCXJldHVybiBqaWY7Cit9CisKK3N0YXRpYyBpbmxpbmUgY3B1dGltZTY0X3QgamlmZmllczY0X3RvX2NwdXRpbWU2NChjb25zdCB1NjQgamlmKQoreworCXJldHVybiAoX19mb3JjZSBjcHV0aW1lNjRfdCkoamlmICogKDQwOTYwMDAwMDBVTEwgLyBIWikpOwogfQogCiAvKgogICogQ29udmVydCBjcHV0aW1lIHRvIG1pY3Jvc2Vjb25kcyBhbmQgYmFjay4KICAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKLWNwdXRpbWVfdG9fdXNlY3MoY29uc3QgY3B1dGltZV90IGNwdXRpbWUpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHV0aW1lX3RvX3VzZWNzKGNvbnN0IGNwdXRpbWVfdCBjcHV0aW1lKQogewotCXJldHVybiBjcHV0aW1lX2RpdihjcHV0aW1lLCA0MDk2KTsKKwlyZXR1cm4gKF9fZm9yY2UgdW5zaWduZWQgbG9uZyBsb25nKSBjcHV0aW1lID4+IDEyOwogfQogCi1zdGF0aWMgaW5saW5lIGNwdXRpbWVfdAotdXNlY3NfdG9fY3B1dGltZShjb25zdCB1bnNpZ25lZCBpbnQgbSkKK3N0YXRpYyBpbmxpbmUgY3B1dGltZV90IHVzZWNzX3RvX2NwdXRpbWUoY29uc3QgdW5zaWduZWQgaW50IG0pCiB7Ci0JcmV0dXJuIChjcHV0aW1lX3QpIG0gKiA0MDk2OworCXJldHVybiAoX19mb3JjZSBjcHV0aW1lX3QpKG0gKiA0MDk2VUxMKTsKIH0KIAorI2RlZmluZSB1c2Vjc190b19jcHV0aW1lNjQobSkJCXVzZWNzX3RvX2NwdXRpbWUobSkKKwogLyoKICAqIENvbnZlcnQgY3B1dGltZSB0byBtaWxsaXNlY29uZHMgYW5kIGJhY2suCiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Ci1jcHV0aW1lX3RvX3NlY3MoY29uc3QgY3B1dGltZV90IGNwdXRpbWUpCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcHV0aW1lX3RvX3NlY3MoY29uc3QgY3B1dGltZV90IGNwdXRpbWUpCiB7Ci0JcmV0dXJuIF9fZGl2KGNwdXRpbWUsIDIwNDgwMDAwMDApID4+IDE7CisJcmV0dXJuIF9fZGl2KChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcgbG9uZykgY3B1dGltZSwgMjA0ODAwMDAwMCkgPj4gMTsKIH0KIAotc3RhdGljIGlubGluZSBjcHV0aW1lX3QKLXNlY3NfdG9fY3B1dGltZShjb25zdCB1bnNpZ25lZCBpbnQgcykKK3N0YXRpYyBpbmxpbmUgY3B1dGltZV90IHNlY3NfdG9fY3B1dGltZShjb25zdCB1bnNpZ25lZCBpbnQgcykKIHsKLQlyZXR1cm4gKGNwdXRpbWVfdCkgcyAqIDQwOTYwMDAwMDBVTEw7CisJcmV0dXJuIChfX2ZvcmNlIGNwdXRpbWVfdCkocyAqIDQwOTYwMDAwMDBVTEwpOwogfQogCiAvKgogICogQ29udmVydCBjcHV0aW1lIHRvIHRpbWVzcGVjIGFuZCBiYWNrLgogICovCi1zdGF0aWMgaW5saW5lIGNwdXRpbWVfdAotdGltZXNwZWNfdG9fY3B1dGltZShjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnZhbHVlKQorc3RhdGljIGlubGluZSBjcHV0aW1lX3QgdGltZXNwZWNfdG9fY3B1dGltZShjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnZhbHVlKQogewotCXJldHVybiB2YWx1ZS0+dHZfbnNlYyAqIDQwOTYgLyAxMDAwICsgKHU2NCkgdmFsdWUtPnR2X3NlYyAqIDQwOTYwMDAwMDBVTEw7CisJdW5zaWduZWQgbG9uZyBsb25nIHJldCA9IHZhbHVlLT50dl9zZWMgKiA0MDk2MDAwMDAwVUxMOworCXJldHVybiAoX19mb3JjZSBjcHV0aW1lX3QpKHJldCArIHZhbHVlLT50dl9uc2VjICogNDA5NiAvIDEwMDApOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLWNwdXRpbWVfdG9fdGltZXNwZWMoY29uc3QgY3B1dGltZV90IGNwdXRpbWUsIHN0cnVjdCB0aW1lc3BlYyAqdmFsdWUpCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1dGltZV90b190aW1lc3BlYyhjb25zdCBjcHV0aW1lX3QgY3B1dGltZSwKKwkJCQkgICAgICAgc3RydWN0IHRpbWVzcGVjICp2YWx1ZSkKIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgX19jcHV0aW1lID0gKF9fZm9yY2UgdW5zaWduZWQgbG9uZyBsb25nKSBjcHV0aW1lOwogI2lmbmRlZiBfX3MzOTB4X18KIAlyZWdpc3Rlcl9wYWlyIHJwOwogCi0JcnAucGFpciA9IGNwdXRpbWUgPj4gMTsKKwlycC5wYWlyID0gX19jcHV0aW1lID4+IDE7CiAJYXNtICgiZHIgJTAsJTEiIDogIitkIiAocnApIDogImQiICgyMDQ4MDAwMDAwVUwpKTsKIAl2YWx1ZS0+dHZfbnNlYyA9IHJwLnN1YnJlZy5ldmVuICogMTAwMCAvIDQwOTY7CiAJdmFsdWUtPnR2X3NlYyA9IHJwLnN1YnJlZy5vZGQ7CiAjZWxzZQotCXZhbHVlLT50dl9uc2VjID0gKGNwdXRpbWUgJSA0MDk2MDAwMDAwVUxMKSAqIDEwMDAgLyA0MDk2OwotCXZhbHVlLT50dl9zZWMgPSBjcHV0aW1lIC8gNDA5NjAwMDAwMFVMTDsKKwl2YWx1ZS0+dHZfbnNlYyA9IChfX2NwdXRpbWUgJSA0MDk2MDAwMDAwVUxMKSAqIDEwMDAgLyA0MDk2OworCXZhbHVlLT50dl9zZWMgPSBfX2NwdXRpbWUgLyA0MDk2MDAwMDAwVUxMOwogI2VuZGlmCiB9CiAKQEAgLTEzMiw1MCArMTE4LDUyIEBACiAgKiBTaW5jZSBjcHV0aW1lIGFuZCB0aW1ldmFsIGhhdmUgdGhlIHNhbWUgcmVzb2x1dGlvbiAobWljcm9zZWNvbmRzKQogICogdGhpcyBpcyBlYXN5LgogICovCi1zdGF0aWMgaW5saW5lIGNwdXRpbWVfdAotdGltZXZhbF90b19jcHV0aW1lKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp2YWx1ZSkKK3N0YXRpYyBpbmxpbmUgY3B1dGltZV90IHRpbWV2YWxfdG9fY3B1dGltZShjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCiB7Ci0JcmV0dXJuIHZhbHVlLT50dl91c2VjICogNDA5NiArICh1NjQpIHZhbHVlLT50dl9zZWMgKiA0MDk2MDAwMDAwVUxMOworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXQgPSB2YWx1ZS0+dHZfc2VjICogNDA5NjAwMDAwMFVMTDsKKwlyZXR1cm4gKF9fZm9yY2UgY3B1dGltZV90KShyZXQgKyB2YWx1ZS0+dHZfdXNlYyAqIDQwOTZVTEwpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQKLWNwdXRpbWVfdG9fdGltZXZhbChjb25zdCBjcHV0aW1lX3QgY3B1dGltZSwgc3RydWN0IHRpbWV2YWwgKnZhbHVlKQorc3RhdGljIGlubGluZSB2b2lkIGNwdXRpbWVfdG9fdGltZXZhbChjb25zdCBjcHV0aW1lX3QgY3B1dGltZSwKKwkJCQkgICAgICBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCiB7CisJdW5zaWduZWQgbG9uZyBsb25nIF9fY3B1dGltZSA9IChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcgbG9uZykgY3B1dGltZTsKICNpZm5kZWYgX19zMzkweF9fCiAJcmVnaXN0ZXJfcGFpciBycDsKIAotCXJwLnBhaXIgPSBjcHV0aW1lID4+IDE7CisJcnAucGFpciA9IF9fY3B1dGltZSA+PiAxOwogCWFzbSAoImRyICUwLCUxIiA6ICIrZCIgKHJwKSA6ICJkIiAoMjA0ODAwMDAwMFVMKSk7CiAJdmFsdWUtPnR2X3VzZWMgPSBycC5zdWJyZWcuZXZlbiAvIDQwOTY7CiAJdmFsdWUtPnR2X3NlYyA9IHJwLnN1YnJlZy5vZGQ7CiAjZWxzZQotCXZhbHVlLT50dl91c2VjID0gKGNwdXRpbWUgJSA0MDk2MDAwMDAwVUxMKSAvIDQwOTY7Ci0JdmFsdWUtPnR2X3NlYyA9IGNwdXRpbWUgLyA0MDk2MDAwMDAwVUxMOworCXZhbHVlLT50dl91c2VjID0gKF9fY3B1dGltZSAlIDQwOTYwMDAwMDBVTEwpIC8gNDA5NjsKKwl2YWx1ZS0+dHZfc2VjID0gX19jcHV0aW1lIC8gNDA5NjAwMDAwMFVMTDsKICNlbmRpZgogfQogCiAvKgogICogQ29udmVydCBjcHV0aW1lIHRvIGNsb2NrIGFuZCBiYWNrLgogICovCi1zdGF0aWMgaW5saW5lIGNsb2NrX3QKLWNwdXRpbWVfdG9fY2xvY2tfdChjcHV0aW1lX3QgY3B1dGltZSkKK3N0YXRpYyBpbmxpbmUgY2xvY2tfdCBjcHV0aW1lX3RvX2Nsb2NrX3QoY3B1dGltZV90IGNwdXRpbWUpCiB7Ci0JcmV0dXJuIGNwdXRpbWVfZGl2KGNwdXRpbWUsIDQwOTYwMDAwMDBVTEwgLyBVU0VSX0haKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY2xvY2sgPSAoX19mb3JjZSB1bnNpZ25lZCBsb25nIGxvbmcpIGNwdXRpbWU7CisJZG9fZGl2KGNsb2NrLCA0MDk2MDAwMDAwVUxMIC8gVVNFUl9IWik7CisJcmV0dXJuIGNsb2NrOwogfQogCi1zdGF0aWMgaW5saW5lIGNwdXRpbWVfdAotY2xvY2tfdF90b19jcHV0aW1lKHVuc2lnbmVkIGxvbmcgeCkKK3N0YXRpYyBpbmxpbmUgY3B1dGltZV90IGNsb2NrX3RfdG9fY3B1dGltZSh1bnNpZ25lZCBsb25nIHgpCiB7Ci0JcmV0dXJuIChjcHV0aW1lX3QpIHggKiAoNDA5NjAwMDAwMFVMTCAvIFVTRVJfSFopOworCXJldHVybiAoX19mb3JjZSBjcHV0aW1lX3QpKHggKiAoNDA5NjAwMDAwMFVMTCAvIFVTRVJfSFopKTsKIH0KIAogLyoKICAqIENvbnZlcnQgY3B1dGltZTY0IHRvIGNsb2NrLgogICovCi1zdGF0aWMgaW5saW5lIGNsb2NrX3QKLWNwdXRpbWU2NF90b19jbG9ja190KGNwdXRpbWU2NF90IGNwdXRpbWUpCitzdGF0aWMgaW5saW5lIGNsb2NrX3QgY3B1dGltZTY0X3RvX2Nsb2NrX3QoY3B1dGltZTY0X3QgY3B1dGltZSkKIHsKLSAgICAgICByZXR1cm4gY3B1dGltZV9kaXYoY3B1dGltZSwgNDA5NjAwMDAwMFVMTCAvIFVTRVJfSFopOworCXVuc2lnbmVkIGxvbmcgbG9uZyBjbG9jayA9IChfX2ZvcmNlIHVuc2lnbmVkIGxvbmcgbG9uZykgY3B1dGltZTsKKwlkb19kaXYoY2xvY2ssIDQwOTYwMDAwMDBVTEwgLyBVU0VSX0haKTsKKwlyZXR1cm4gY2xvY2s7CiB9CiAKIHN0cnVjdCBzMzkwX2lkbGVfZGF0YSB7CmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oIGIvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCA1MjRkMjNiLi40ZjI4OWZmIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vcGd0YWJsZS5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKQEAgLTU5OSwxMCArNTk5LDEwIEBACiAJc2tleSA9IHBhZ2VfZ2V0X3N0b3JhZ2Vfa2V5KGFkZHJlc3MpOwogCWJpdHMgPSBza2V5ICYgKF9QQUdFX0NIQU5HRUQgfCBfUEFHRV9SRUZFUkVOQ0VEKTsKIAkvKiBDbGVhciBwYWdlIGNoYW5nZWQgJiByZWZlcmVuY2VkIGJpdCBpbiB0aGUgc3RvcmFnZSBrZXkgKi8KLQlpZiAoYml0cykgewotCQlza2V5IF49IGJpdHM7Ci0JCXBhZ2Vfc2V0X3N0b3JhZ2Vfa2V5KGFkZHJlc3MsIHNrZXksIDEpOwotCX0KKwlpZiAoYml0cyAmIF9QQUdFX0NIQU5HRUQpCisJCXBhZ2Vfc2V0X3N0b3JhZ2Vfa2V5KGFkZHJlc3MsIHNrZXkgXiBiaXRzLCAxKTsKKwllbHNlIGlmIChiaXRzKQorCQlwYWdlX3Jlc2V0X3JlZmVyZW5jZWQoYWRkcmVzcyk7CiAJLyogVHJhbnNmZXIgcGFnZSBjaGFuZ2VkICYgcmVmZXJlbmNlZCBiaXQgdG8gZ3Vlc3QgYml0cyBpbiBwZ3N0ZSAqLwogCXBnc3RlX3ZhbChwZ3N0ZSkgfD0gYml0cyA8PCA0ODsJCS8qIFJDUF9HUl9CSVQgJiBSQ1BfR0NfQklUICovCiAJLyogR2V0IGhvc3QgY2hhbmdlZCAmIHJlZmVyZW5jZWQgYml0cyBmcm9tIHBnc3RlICovCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc29ja2V0LmggYi9hcmNoL3MzOTAvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggZmRmZjFlOS4uNjdiNWMxYiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvczM5MC9pbmNsdWRlL2FzbS9zb2NrZXQuaApAQCAtNzAsNCArNzAsNyBAQAogCiAjZGVmaW5lIFNPX1JYUV9PVkZMICAgICAgICAgICAgIDQwCiAKKyNkZWZpbmUgU09fV0lGSV9TVEFUVVMJCTQxCisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogI2VuZGlmIC8qIF9BU01fU09DS0VUX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggOTQ1MWIyMS4uMzIwMWFlNCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTkxLDEwICs5MSwxMiBAQAogdm9pZCBjcHVfaWRsZSh2b2lkKQogewogCWZvciAoOzspIHsKLQkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygxKTsKKwkJdGlja19ub2h6X2lkbGVfZW50ZXIoKTsKKwkJcmN1X2lkbGVfZW50ZXIoKTsKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkKIAkJCWRlZmF1bHRfaWRsZSgpOwotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCXJjdV9pZGxlX2V4aXQoKTsKKwkJdGlja19ub2h6X2lkbGVfZXhpdCgpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYyBiL2FyY2gvczM5MC9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNDUwOTMxYS4uNTczYmMyOSAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3MzOTAva2VybmVsL3B0cmFjZS5jCkBAIC0yOTYsMTMgKzI5Niw2IEBACiAJCSAgICAgKChkYXRhICYgUFNXX01BU0tfRUEpICYmICEoZGF0YSAmIFBTV19NQVNLX0JBKSkpKQogCQkJLyogSW52YWxpZCBwc3cgbWFzay4gKi8KIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoYWRkciA9PSAoYWRkcl90KSAmZHVtbXktPnJlZ3MucHN3LmFkZHIpCi0JCQkvKgotCQkJICogVGhlIGRlYnVnZ2VyIGNoYW5nZWQgdGhlIGluc3RydWN0aW9uIGFkZHJlc3MsCi0JCQkgKiByZXNldCBzeXN0ZW0gY2FsbCByZXN0YXJ0LCBzZWUgc2lnbmFsLmM6ZG9fc2lnbmFsCi0JCQkgKi8KLQkJCXRhc2tfdGhyZWFkX2luZm8oY2hpbGQpLT5zeXN0ZW1fY2FsbCA9IDA7Ci0KIAkJKihhZGRyX3QgKikoKGFkZHJfdCkgJnRhc2tfcHRfcmVncyhjaGlsZCktPnBzdyArIGFkZHIpID0gZGF0YTsKIAogCX0gZWxzZSBpZiAoYWRkciA8IChhZGRyX3QpICgmZHVtbXktPnJlZ3Mub3JpZ19ncHIyKSkgewpAQCAtNjE0LDExICs2MDcsNiBAQAogCQkJLyogVHJhbnNmZXIgMzEgYml0IGFtb2RlIGJpdCB0byBwc3cgbWFzay4gKi8KIAkJCXJlZ3MtPnBzdy5tYXNrID0gKHJlZ3MtPnBzdy5tYXNrICYgflBTV19NQVNLX0JBKSB8CiAJCQkJKF9fdTY0KSh0bXAgJiBQU1czMl9BRERSX0FNT0RFKTsKLQkJCS8qCi0JCQkgKiBUaGUgZGVidWdnZXIgY2hhbmdlZCB0aGUgaW5zdHJ1Y3Rpb24gYWRkcmVzcywKLQkJCSAqIHJlc2V0IHN5c3RlbSBjYWxsIHJlc3RhcnQsIHNlZSBzaWduYWwuYzpkb19zaWduYWwKLQkJCSAqLwotCQkJdGFza190aHJlYWRfaW5mbyhjaGlsZCktPnN5c3RlbV9jYWxsID0gMDsKIAkJfSBlbHNlIHsKIAkJCS8qIGdwciAwLTE1ICovCiAJCQkqKF9fdTMyKikoKGFkZHJfdCkgJnJlZ3MtPnBzdyArIGFkZHIqMiArIDQpID0gdG1wOwpAQCAtOTA1LDYgKzg5MywxNCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IHMzOTBfbGFzdF9icmVha19zZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCQkgICAgICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkJICAgICAgIGNvbnN0IHZvaWQgKmtidWYsIGNvbnN0IHZvaWQgX191c2VyICp1YnVmKQoreworCXJldHVybiAwOworfQorCiAjZW5kaWYKIAogc3RhdGljIGludCBzMzkwX3N5c3RlbV9jYWxsX2dldChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhcmdldCwKQEAgLTk1MSw2ICs5NDcsNyBAQAogCQkuc2l6ZSA9IHNpemVvZihsb25nKSwKIAkJLmFsaWduID0gc2l6ZW9mKGxvbmcpLAogCQkuZ2V0ID0gczM5MF9sYXN0X2JyZWFrX2dldCwKKwkJLnNldCA9IHMzOTBfbGFzdF9icmVha19zZXQsCiAJfSwKICNlbmRpZgogCVtSRUdTRVRfU1lTVEVNX0NBTExdID0gewpAQCAtMTExNiw2ICsxMTEzLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgczM5MF9jb21wYXRfbGFzdF9icmVha19zZXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXJnZXQsCisJCQkJICAgICAgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0ICpyZWdzZXQsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHBvcywgdW5zaWduZWQgaW50IGNvdW50LAorCQkJCSAgICAgIGNvbnN0IHZvaWQgKmtidWYsIGNvbnN0IHZvaWQgX191c2VyICp1YnVmKQoreworCXJldHVybiAwOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IHVzZXJfcmVnc2V0IHMzOTBfY29tcGF0X3JlZ3NldHNbXSA9IHsKIAlbUkVHU0VUX0dFTkVSQUxdID0gewogCQkuY29yZV9ub3RlX3R5cGUgPSBOVF9QUlNUQVRVUywKQEAgLTExMzksNiArMTE0NCw3IEBACiAJCS5zaXplID0gc2l6ZW9mKGxvbmcpLAogCQkuYWxpZ24gPSBzaXplb2YobG9uZyksCiAJCS5nZXQgPSBzMzkwX2NvbXBhdF9sYXN0X2JyZWFrX2dldCwKKwkJLnNldCA9IHMzOTBfY29tcGF0X2xhc3RfYnJlYWtfc2V0LAogCX0sCiAJW1JFR1NFVF9TWVNURU1fQ0FMTF0gPSB7CiAJCS5jb3JlX25vdGVfdHlwZSA9IE5UX1MzOTBfU1lTVEVNX0NBTEwsCmRpZmYgLS1naXQgYS9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMgYi9hcmNoL3MzOTAva2VybmVsL3NldHVwLmMKaW5kZXggZTU4YTQ2Mi4uZjExZDFiMCAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvczM5MC9rZXJuZWwvc2V0dXAuYwpAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgpAQCAtNTc5LDcgKzU4MCw3IEBACiAJCSptc2cgPSAiZmlyc3QgbWVtb3J5IGNodW5rIG11c3QgYmUgYXQgbGVhc3QgY3Jhc2hrZXJuZWwgc2l6ZSI7CiAJCXJldHVybiAwOwogCX0KLQlpZiAoaXNfa2R1bXBfa2VybmVsKCkgJiYgKGNyYXNoX3NpemUgPT0gT0xETUVNX1NJWkUpKQorCWlmIChPTERNRU1fQkFTRSAmJiBjcmFzaF9zaXplID09IE9MRE1FTV9TSVpFKQogCQlyZXR1cm4gT0xETUVNX0JBU0U7CiAKIAlmb3IgKGkgPSBNRU1PUllfQ0hVTktTIC0gMTsgaSA+PSAwOyBpLS0pIHsKQEAgLTgyMCw3ICs4MjEsOCBAQAogCQllbmRfY2h1bmsgPSBtaW4oZW5kX2NodW5rLCBlbmRfcGZuKTsKIAkJaWYgKHN0YXJ0X2NodW5rID49IGVuZF9jaHVuaykKIAkJCWNvbnRpbnVlOwotCQlhZGRfYWN0aXZlX3JhbmdlKDAsIHN0YXJ0X2NodW5rLCBlbmRfY2h1bmspOworCQltZW1ibG9ja19hZGRfbm9kZShQRk5fUEhZUyhzdGFydF9jaHVuayksCisJCQkJICBQRk5fUEhZUyhlbmRfY2h1bmsgLSBzdGFydF9jaHVuayksIDApOwogCQlwZm4gPSBtYXgoc3RhcnRfY2h1bmssIHN0YXJ0X3Bmbik7CiAJCWZvciAoOyBwZm4gPCBlbmRfY2h1bms7IHBmbisrKQogCQkJcGFnZV9zZXRfc3RvcmFnZV9rZXkoUEZOX1BIWVMocGZuKSwKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3MzOTAva2VybmVsL3NpZ25hbC5jCmluZGV4IDA1YTg1YmMuLjdmNmY5ZjMgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC9zaWduYWwuYwpAQCAtNDYwLDkgKzQ2MCw5IEBACiAJCQkJCQkgICAgIHJlZ3MtPnN2Y19jb2RlID4+IDE2KTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCS8qIE5vIGxvbmdlciBpbiBhIHN5c3RlbSBjYWxsICovCi0JCQljbGVhcl90aHJlYWRfZmxhZyhUSUZfU1lTQ0FMTCk7CiAJCX0KKwkJLyogTm8gbG9uZ2VyIGluIGEgc3lzdGVtIGNhbGwgKi8KKwkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTEwpOwogCiAJCWlmICgoaXNfY29tcGF0X3Rhc2soKSA/CiAJCSAgICAgaGFuZGxlX3NpZ25hbDMyKHNpZ25yLCAma2EsICZpbmZvLCBvbGRzZXQsIHJlZ3MpIDoKQEAgLTQ4Niw2ICs0ODYsNyBAQAogCX0KIAogCS8qIE5vIGhhbmRsZXJzIHByZXNlbnQgLSBjaGVjayBmb3Igc3lzdGVtIGNhbGwgcmVzdGFydCAqLworCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMKTsKIAlpZiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5zeXN0ZW1fY2FsbCkgewogCQlyZWdzLT5zdmNfY29kZSA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3lzdGVtX2NhbGw7CiAJCXN3aXRjaCAocmVncy0+Z3Byc1syXSkgewpAQCAtNTAwLDkgKzUwMSw2IEBACiAJCQlyZWdzLT5ncHJzWzJdID0gcmVncy0+b3JpZ19ncHIyOwogCQkJc2V0X3RocmVhZF9mbGFnKFRJRl9TWVNDQUxMKTsKIAkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJY2xlYXJfdGhyZWFkX2ZsYWcoVElGX1NZU0NBTEwpOwotCQkJYnJlYWs7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9vcHJvZmlsZS9od3NhbXBsZXIuYyBiL2FyY2gvczM5MC9vcHJvZmlsZS9od3NhbXBsZXIuYwppbmRleCBmNDNjMGU0Li45ZGFlZTkxIDEwMDY0NAotLS0gYS9hcmNoL3MzOTAvb3Byb2ZpbGUvaHdzYW1wbGVyLmMKKysrIGIvYXJjaC9zMzkwL29wcm9maWxlL2h3c2FtcGxlci5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCiAjaW5jbHVkZSAiaHdzYW1wbGVyLmgiCisjaW5jbHVkZSAib3BfY291bnRlci5oIgogCiAjZGVmaW5lIE1BWF9OVU1fU0RCIDUxMQogI2RlZmluZSBNSU5fTlVNX1NEQiAxCkBAIC04OTYsNiArODk3LDggQEAKIAkJaWYgKHNhbXBsZV9kYXRhX3B0ci0+UCA9PSAxKSB7CiAJCQkvKiB1c2Vyc3BhY2Ugc2FtcGxlICovCiAJCQl1bnNpZ25lZCBpbnQgcGlkID0gc2FtcGxlX2RhdGFfcHRyLT5wcmltX2FzbjsKKwkJCWlmICghY291bnRlcl9jb25maWcudXNlcikKKwkJCQlnb3RvIHNraXBfc2FtcGxlOwogCQkJcmN1X3JlYWRfbG9jaygpOwogCQkJdHNrID0gcGlkX3Rhc2soZmluZF92cGlkKHBpZCksIFBJRFRZUEVfUElEKTsKIAkJCWlmICh0c2spCkBAIC05MDMsNiArOTA2LDggQEAKIAkJCXJjdV9yZWFkX3VubG9jaygpOwogCQl9IGVsc2UgewogCQkJLyoga2VybmVsc3BhY2Ugc2FtcGxlICovCisJCQlpZiAoIWNvdW50ZXJfY29uZmlnLmtlcm5lbCkKKwkJCQlnb3RvIHNraXBfc2FtcGxlOwogCQkJcmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKIAkJfQogCkBAIC05MTAsNyArOTE1LDcgQEAKIAkJb3Byb2ZpbGVfYWRkX2V4dF9od19zYW1wbGUoc2FtcGxlX2RhdGFfcHRyLT5pYSwgcmVncywgMCwKIAkJCQkhc2FtcGxlX2RhdGFfcHRyLT5QLCB0c2spOwogCQltdXRleF91bmxvY2soJmh3c19zZW0pOwotCisJc2tpcF9zYW1wbGU6CiAJCXNhbXBsZV9kYXRhX3B0cisrOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9vcHJvZmlsZS9pbml0LmMgYi9hcmNoL3MzOTAvb3Byb2ZpbGUvaW5pdC5jCmluZGV4IDZlZmMxOGIuLjIyOTdiZTQgMTAwNjQ0Ci0tLSBhL2FyY2gvczM5MC9vcHJvZmlsZS9pbml0LmMKKysrIGIvYXJjaC9zMzkwL29wcm9maWxlL2luaXQuYwpAQCAtMiwxMCArMiwxMSBAQAogICogYXJjaC9zMzkwL29wcm9maWxlL2luaXQuYwogICoKICAqIFMzOTAgVmVyc2lvbgotICogICBDb3B5cmlnaHQgKEMpIDIwMDMgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICBDb3B5cmlnaHQgKEMpIDIwMDItMjAxMSBJQk0gRGV1dHNjaGxhbmQgRW50d2lja2x1bmcgR21iSCwgSUJNIENvcnBvcmF0aW9uCiAgKiAgIEF1dGhvcihzKTogVGhvbWFzIFNwYXR6aWVyICh0c3BhdEBkZS5pYm0uY29tKQogICogICBBdXRob3Iocyk6IE1haGVzaCBTYWxnYW9ua2FyIChtYWhlc2hAbGludXgudm5ldC5pYm0uY29tKQogICogICBBdXRob3Iocyk6IEhlaW56IEdyYWFsZnMgKGdyYWFsZnNAbGludXgudm5ldC5pYm0uY29tKQorICogICBBdXRob3Iocyk6IEFuZHJlYXMgS3JlYmJlbCAoa3JlYmJlbEBsaW51eC52bmV0LmlibS5jb20pCiAgKgogICogQHJlbWFyayBDb3B5cmlnaHQgMjAwMi0yMDExIE9Qcm9maWxlIGF1dGhvcnMKICAqLwpAQCAtMTQsNiArMTUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogCiAjaW5jbHVkZSAiLi4vLi4vLi4vZHJpdmVycy9vcHJvZmlsZS9vcHJvZi5oIgogCkBAIC0yMiw2ICsyNSw3IEBACiAjaWZkZWYgQ09ORklHXzY0QklUCiAKICNpbmNsdWRlICJod3NhbXBsZXIuaCIKKyNpbmNsdWRlICJvcF9jb3VudGVyLmgiCiAKICNkZWZpbmUgREVGQVVMVF9JTlRFUlZBTAk0MTI3NTE4CiAKQEAgLTM1LDE2ICszOSw0MSBAQAogc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Byb2ZpbGVfc2RidF9ibG9ja3MgPSBERUZBVUxUX1NEQlRfQkxPQ0tTOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgb3Byb2ZpbGVfc2RiX2Jsb2NrcyA9IERFRkFVTFRfU0RCX0JMT0NLUzsKIAotc3RhdGljIGludCBod3NhbXBsZXJfZmlsZTsKK3N0YXRpYyBpbnQgaHdzYW1wbGVyX2VuYWJsZWQ7CiBzdGF0aWMgaW50IGh3c2FtcGxlcl9ydW5uaW5nOwkvKiBzdGFydF9tdXRleCBtdXN0IGJlIGhlbGQgdG8gY2hhbmdlICovCitzdGF0aWMgaW50IGh3c2FtcGxlcl9hdmFpbGFibGU7CiAKIHN0YXRpYyBzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyB0aW1lcl9vcHM7CiAKK3N0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyBjb3VudGVyX2NvbmZpZzsKKworZW51bSBfX2ZvcmNlX2NwdV90eXBlIHsKKwlyZXNlcnZlZCA9IDAsCQkvKiBkbyBub3QgZm9yY2UgKi8KKwl0aW1lciwKK307CitzdGF0aWMgaW50IGZvcmNlX2NwdV90eXBlOworCitzdGF0aWMgaW50IHNldF9jcHVfdHlwZShjb25zdCBjaGFyICpzdHIsIHN0cnVjdCBrZXJuZWxfcGFyYW0gKmtwKQoreworCWlmICghc3RyY21wKHN0ciwgInRpbWVyIikpIHsKKwkJZm9yY2VfY3B1X3R5cGUgPSB0aW1lcjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IGZvcmNpbmcgdGltZXIgdG8gYmUgcmV0dXJuZWQgIgorCQkgICAgICAgICAgICAgICAgICJhcyBjcHUgdHlwZVxuIik7CisJfSBlbHNlIHsKKwkJZm9yY2VfY3B1X3R5cGUgPSAwOworCX0KKworCXJldHVybiAwOworfQorbW9kdWxlX3BhcmFtX2NhbGwoY3B1X3R5cGUsIHNldF9jcHVfdHlwZSwgTlVMTCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGNwdV90eXBlLCAiRm9yY2UgbGVnYWN5IGJhc2ljIG1vZGUgc2FtcGxpbmciCisJCSAgICAgICAgICAgIihyZXBvcnQgY3B1X3R5cGUgXCJ0aW1lclwiIik7CisKIHN0YXRpYyBpbnQgb3Byb2ZpbGVfaHdzYW1wbGVyX3N0YXJ0KHZvaWQpCiB7CiAJaW50IHJldHZhbDsKIAotCWh3c2FtcGxlcl9ydW5uaW5nID0gaHdzYW1wbGVyX2ZpbGU7CisJaHdzYW1wbGVyX3J1bm5pbmcgPSBod3NhbXBsZXJfZW5hYmxlZDsKIAogCWlmICghaHdzYW1wbGVyX3J1bm5pbmcpCiAJCXJldHVybiB0aW1lcl9vcHMuc3RhcnQoKTsKQEAgLTcyLDEwICsxMDEsMTYgQEAKIAlyZXR1cm47CiB9CiAKKy8qCisgKiBGaWxlIG9wcyB1c2VkIGZvcjoKKyAqIC9kZXYvb3Byb2ZpbGUvMC9lbmFibGVkCisgKiAvZGV2L29wcm9maWxlL2h3c2FtcGxpbmcvaHdzYW1wbGVyICAoY3B1X3R5cGUgPSB0aW1lcikKKyAqLworCiBzdGF0aWMgc3NpemVfdCBod3NhbXBsZXJfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKIAkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKIHsKLQlyZXR1cm4gb3Byb2ZpbGVmc191bG9uZ190b191c2VyKGh3c2FtcGxlcl9maWxlLCBidWYsIGNvdW50LCBvZmZzZXQpOworCXJldHVybiBvcHJvZmlsZWZzX3Vsb25nX3RvX3VzZXIoaHdzYW1wbGVyX2VuYWJsZWQsIGJ1ZiwgY291bnQsIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IGh3c2FtcGxlcl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBjb25zdCBfX3VzZXIgKmJ1ZiwKQEAgLTg4LDkgKzEyMywxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHZhbCA9IG9wcm9maWxlZnNfdWxvbmdfZnJvbV91c2VyKCZ2YWwsIGJ1ZiwgY291bnQpOwotCWlmIChyZXR2YWwpCisJaWYgKHJldHZhbCA8PSAwKQogCQlyZXR1cm4gcmV0dmFsOwogCisJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmIChvcHJvZmlsZV9zdGFydGVkKQogCQkvKgogCQkgKiBzYXZlIHRvIGRvIHdpdGhvdXQgbG9ja2luZyBhcyB3ZSBzZXQKQEAgLTk5LDcgKzEzNyw3IEBACiAJCSAqLwogCQlyZXR1cm4gLUVCVVNZOwogCi0JaHdzYW1wbGVyX2ZpbGUgPSB2YWw7CisJaHdzYW1wbGVyX2VuYWJsZWQgPSB2YWw7CiAKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0xMDksMzggKzE0NywzMTEgQEAKIAkud3JpdGUJCT0gaHdzYW1wbGVyX3dyaXRlLAogfTsKIAotc3RhdGljIGludCBvcHJvZmlsZV9jcmVhdGVfaHdzYW1wbGluZ19maWxlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLAotCQkJCQkJc3RydWN0IGRlbnRyeSAqcm9vdCkKKy8qCisgKiBGaWxlIG9wcyB1c2VkIGZvcjoKKyAqIC9kZXYvb3Byb2ZpbGUvMC9jb3VudAorICogL2Rldi9vcHJvZmlsZS9od3NhbXBsaW5nL2h3X2ludGVydmFsICAoY3B1X3R5cGUgPSB0aW1lcikKKyAqCisgKiBNYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWUgaXMgd2l0aGluIHRoZSBoYXJkd2FyZSByYW5nZS4KKyAqLworCitzdGF0aWMgc3NpemVfdCBod19pbnRlcnZhbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqaHdfZGlyOworCXJldHVybiBvcHJvZmlsZWZzX3Vsb25nX3RvX3VzZXIob3Byb2ZpbGVfaHdfaW50ZXJ2YWwsIGJ1ZiwKKwkJCQkJY291bnQsIG9mZnNldCk7Cit9CiAKLQkvKiByZWluaXRpYWxpemUgZGVmYXVsdCB2YWx1ZXMgKi8KLQlod3NhbXBsZXJfZmlsZSA9IDE7CitzdGF0aWMgc3NpemVfdCBod19pbnRlcnZhbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBjb25zdCBfX3VzZXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgcmV0dmFsOwogCi0JaHdfZGlyID0gb3Byb2ZpbGVmc19ta2RpcihzYiwgcm9vdCwgImh3c2FtcGxpbmciKTsKLQlpZiAoIWh3X2RpcikKKwlpZiAoKm9mZnNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dmFsID0gb3Byb2ZpbGVmc191bG9uZ19mcm9tX3VzZXIoJnZhbCwgYnVmLCBjb3VudCk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKwlpZiAodmFsIDwgb3Byb2ZpbGVfbWluX2ludGVydmFsKQorCQlvcHJvZmlsZV9od19pbnRlcnZhbCA9IG9wcm9maWxlX21pbl9pbnRlcnZhbDsKKwllbHNlIGlmICh2YWwgPiBvcHJvZmlsZV9tYXhfaW50ZXJ2YWwpCisJCW9wcm9maWxlX2h3X2ludGVydmFsID0gb3Byb2ZpbGVfbWF4X2ludGVydmFsOworCWVsc2UKKwkJb3Byb2ZpbGVfaHdfaW50ZXJ2YWwgPSB2YWw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGh3X2ludGVydmFsX2ZvcHMgPSB7CisJLnJlYWQJCT0gaHdfaW50ZXJ2YWxfcmVhZCwKKwkud3JpdGUJCT0gaHdfaW50ZXJ2YWxfd3JpdGUsCit9OworCisvKgorICogRmlsZSBvcHMgdXNlZCBmb3I6CisgKiAvZGV2L29wcm9maWxlLzAvZXZlbnQKKyAqIE9ubHkgYSBzaW5nbGUgZXZlbnQgd2l0aCBudW1iZXIgMCBpcyBzdXBwb3J0ZWQgd2l0aCB0aGlzIGNvdW50ZXIuCisgKgorICogL2Rldi9vcHJvZmlsZS8wL3VuaXRfbWFzaworICogVGhpcyBpcyBhIGR1bW15IGZpbGUgbmVlZGVkIGJ5IHRoZSB1c2VyIHNwYWNlIHRvb2xzLgorICogTm8gdmFsdWUgb3RoZXIgdGhhbiAwIGlzIGFjY2VwdGVkIG9yIHJldHVybmVkLgorICovCisKK3N0YXRpYyBzc2l6ZV90IGh3c2FtcGxlcl96ZXJvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpCit7CisJcmV0dXJuIG9wcm9maWxlZnNfdWxvbmdfdG9fdXNlcigwLCBidWYsIGNvdW50LCBvZmZzZXQpOworfQorCitzdGF0aWMgc3NpemVfdCBod3NhbXBsZXJfemVyb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBjb25zdCBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpvZmZzZXQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldHZhbDsKKworCWlmICgqb2Zmc2V0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCW9wcm9maWxlZnNfY3JlYXRlX2ZpbGUoc2IsIGh3X2RpciwgImh3c2FtcGxlciIsICZod3NhbXBsZXJfZm9wcyk7Ci0Jb3Byb2ZpbGVmc19jcmVhdGVfdWxvbmcoc2IsIGh3X2RpciwgImh3X2ludGVydmFsIiwKLQkJCQkmb3Byb2ZpbGVfaHdfaW50ZXJ2YWwpOwotCW9wcm9maWxlZnNfY3JlYXRlX3JvX3Vsb25nKHNiLCBod19kaXIsICJod19taW5faW50ZXJ2YWwiLAotCQkJCSZvcHJvZmlsZV9taW5faW50ZXJ2YWwpOwotCW9wcm9maWxlZnNfY3JlYXRlX3JvX3Vsb25nKHNiLCBod19kaXIsICJod19tYXhfaW50ZXJ2YWwiLAotCQkJCSZvcHJvZmlsZV9tYXhfaW50ZXJ2YWwpOwotCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBod19kaXIsICJod19zZGJ0X2Jsb2NrcyIsCi0JCQkJJm9wcm9maWxlX3NkYnRfYmxvY2tzKTsKKwlyZXR2YWwgPSBvcHJvZmlsZWZzX3Vsb25nX2Zyb21fdXNlcigmdmFsLCBidWYsIGNvdW50KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCWlmICh2YWwgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGNvdW50OworfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB6ZXJvX2ZvcHMgPSB7CisJLnJlYWQJCT0gaHdzYW1wbGVyX3plcm9fcmVhZCwKKwkud3JpdGUJCT0gaHdzYW1wbGVyX3plcm9fd3JpdGUsCit9OworCisvKiAvZGV2L29wcm9maWxlLzAva2VybmVsIGZpbGUgb3BzLiAgKi8KKworc3RhdGljIHNzaXplX3QgaHdzYW1wbGVyX2tlcm5lbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlyZXR1cm4gb3Byb2ZpbGVmc191bG9uZ190b191c2VyKGNvdW50ZXJfY29uZmlnLmtlcm5lbCwKKwkJCQkJYnVmLCBjb3VudCwgb2Zmc2V0KTsKK30KKworc3RhdGljIHNzaXplX3QgaHdzYW1wbGVyX2tlcm5lbF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBjb25zdCBfX3VzZXIgKmJ1ZiwKKwkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXR2YWw7CisKKwlpZiAoKm9mZnNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR2YWwgPSBvcHJvZmlsZWZzX3Vsb25nX2Zyb21fdXNlcigmdmFsLCBidWYsIGNvdW50KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvdW50ZXJfY29uZmlnLmtlcm5lbCA9IHZhbDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMga2VybmVsX2ZvcHMgPSB7CisJLnJlYWQJCT0gaHdzYW1wbGVyX2tlcm5lbF9yZWFkLAorCS53cml0ZQkJPSBod3NhbXBsZXJfa2VybmVsX3dyaXRlLAorfTsKKworLyogL2Rldi9vcHJvZmlsZS8wL3VzZXIgZmlsZSBvcHMuICovCisKK3N0YXRpYyBzc2l6ZV90IGh3c2FtcGxlcl91c2VyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlyZXR1cm4gb3Byb2ZpbGVmc191bG9uZ190b191c2VyKGNvdW50ZXJfY29uZmlnLnVzZXIsCisJCQkJCWJ1ZiwgY291bnQsIG9mZnNldCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGh3c2FtcGxlcl91c2VyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIGNvbnN0IF9fdXNlciAqYnVmLAorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXR2YWw7CisKKwlpZiAoKm9mZnNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR2YWwgPSBvcHJvZmlsZWZzX3Vsb25nX2Zyb21fdXNlcigmdmFsLCBidWYsIGNvdW50KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNvdW50ZXJfY29uZmlnLnVzZXIgPSB2YWw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHVzZXJfZm9wcyA9IHsKKwkucmVhZAkJPSBod3NhbXBsZXJfdXNlcl9yZWFkLAorCS53cml0ZQkJPSBod3NhbXBsZXJfdXNlcl93cml0ZSwKK307CisKKworLyoKKyAqIEZpbGUgb3BzIHVzZWQgZm9yOiAvZGV2L29wcm9maWxlL3RpbWVyL2VuYWJsZWQKKyAqIFRoZSB2YWx1ZSBhbHdheXMgaGFzIHRvIGJlIHRoZSBpbnZlcnRlZCB2YWx1ZSBvZiBod3NhbXBsZXJfZW5hYmxlZC4gU28KKyAqIG5vIHNlcGFyYXRlIHZhcmlhYmxlIGlzIGNyZWF0ZWQuIFRoYXQgd2F5IHdlIGRvIG5vdCBuZWVkIGxvY2tpbmcuCisgKi8KKworc3RhdGljIHNzaXplX3QgdGltZXJfZW5hYmxlZF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZnNldCkKK3sKKwlyZXR1cm4gb3Byb2ZpbGVmc191bG9uZ190b191c2VyKCFod3NhbXBsZXJfZW5hYmxlZCwgYnVmLCBjb3VudCwgb2Zmc2V0KTsKK30KKworc3RhdGljIHNzaXplX3QgdGltZXJfZW5hYmxlZF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBjb25zdCBfX3VzZXIgKmJ1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXR2YWw7CisKKwlpZiAoKm9mZnNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR2YWwgPSBvcHJvZmlsZWZzX3Vsb25nX2Zyb21fdXNlcigmdmFsLCBidWYsIGNvdW50KTsKKwlpZiAocmV0dmFsKQorCQlyZXR1cm4gcmV0dmFsOworCisJaWYgKHZhbCAhPSAwICYmIHZhbCAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFRpbWVyIGNhbm5vdCBiZSBkaXNhYmxlZCB3aXRob3V0IGhhdmluZyBoYXJkd2FyZSBzYW1wbGluZy4gICovCisJaWYgKHZhbCA9PSAwICYmICFod3NhbXBsZXJfYXZhaWxhYmxlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvcHJvZmlsZV9zdGFydGVkKQorCQkvKgorCQkgKiBzYXZlIHRvIGRvIHdpdGhvdXQgbG9ja2luZyBhcyB3ZSBzZXQKKwkJICogaHdzYW1wbGVyX3J1bm5pbmcgaW4gc3RhcnQoKSB3aGVuIHN0YXJ0X211dGV4IGlzCisJCSAqIGhlbGQKKwkJICovCisJCXJldHVybiAtRUJVU1k7CisKKwlod3NhbXBsZXJfZW5hYmxlZCA9ICF2YWw7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHRpbWVyX2VuYWJsZWRfZm9wcyA9IHsKKwkucmVhZAkJPSB0aW1lcl9lbmFibGVkX3JlYWQsCisJLndyaXRlCQk9IHRpbWVyX2VuYWJsZWRfd3JpdGUsCit9OworCisKK3N0YXRpYyBpbnQgb3Byb2ZpbGVfY3JlYXRlX2h3c2FtcGxpbmdfZmlsZXMoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwKKwkJCQkJICAgIHN0cnVjdCBkZW50cnkgKnJvb3QpCit7CisJc3RydWN0IGRlbnRyeSAqZGlyOworCisJZGlyID0gb3Byb2ZpbGVmc19ta2RpcihzYiwgcm9vdCwgInRpbWVyIik7CisJaWYgKCFkaXIpCisJCXJldHVybiAtRUlOVkFMOworCisJb3Byb2ZpbGVmc19jcmVhdGVfZmlsZShzYiwgZGlyLCAiZW5hYmxlZCIsICZ0aW1lcl9lbmFibGVkX2ZvcHMpOworCisJaWYgKCFod3NhbXBsZXJfYXZhaWxhYmxlKQorCQlyZXR1cm4gMDsKKworCS8qIHJlaW5pdGlhbGl6ZSBkZWZhdWx0IHZhbHVlcyAqLworCWh3c2FtcGxlcl9lbmFibGVkID0gMTsKKwljb3VudGVyX2NvbmZpZy5rZXJuZWwgPSAxOworCWNvdW50ZXJfY29uZmlnLnVzZXIgPSAxOworCisJaWYgKCFmb3JjZV9jcHVfdHlwZSkgeworCQkvKgorCQkgKiBDcmVhdGUgdGhlIGNvdW50ZXIgZmlsZSBzeXN0ZW0uICBBIHNpbmdsZSB2aXJ0dWFsCisJCSAqIGNvdW50ZXIgaXMgY3JlYXRlZCB3aGljaCBjYW4gYmUgdXNlZCB0bworCQkgKiBlbmFibGUvZGlzYWJsZSBoYXJkd2FyZSBzYW1wbGluZyBkeW5hbWljYWxseSBmcm9tCisJCSAqIHVzZXIgc3BhY2UuICBUaGUgdXNlciBzcGFjZSB3aWxsIGNvbmZpZ3VyZSBhIHNpbmdsZQorCQkgKiBjb3VudGVyIHdpdGggYSBzaW5nbGUgZXZlbnQuICBUaGUgdmFsdWUgb2YgJ2V2ZW50JworCQkgKiBhbmQgJ3VuaXRfbWFzaycgYXJlIG5vdCBldmFsdWF0ZWQgYnkgdGhlIGtlcm5lbCBjb2RlCisJCSAqIGFuZCBjYW4gb25seSBiZSBzZXQgdG8gMC4KKwkJICovCisKKwkJZGlyID0gb3Byb2ZpbGVmc19ta2RpcihzYiwgcm9vdCwgIjAiKTsKKwkJaWYgKCFkaXIpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlvcHJvZmlsZWZzX2NyZWF0ZV9maWxlKHNiLCBkaXIsICJlbmFibGVkIiwgJmh3c2FtcGxlcl9mb3BzKTsKKwkJb3Byb2ZpbGVmc19jcmVhdGVfZmlsZShzYiwgZGlyLCAiZXZlbnQiLCAmemVyb19mb3BzKTsKKwkJb3Byb2ZpbGVmc19jcmVhdGVfZmlsZShzYiwgZGlyLCAiY291bnQiLCAmaHdfaW50ZXJ2YWxfZm9wcyk7CisJCW9wcm9maWxlZnNfY3JlYXRlX2ZpbGUoc2IsIGRpciwgInVuaXRfbWFzayIsICZ6ZXJvX2ZvcHMpOworCQlvcHJvZmlsZWZzX2NyZWF0ZV9maWxlKHNiLCBkaXIsICJrZXJuZWwiLCAma2VybmVsX2ZvcHMpOworCQlvcHJvZmlsZWZzX2NyZWF0ZV9maWxlKHNiLCBkaXIsICJ1c2VyIiwgJnVzZXJfZm9wcyk7CisJCW9wcm9maWxlZnNfY3JlYXRlX3Vsb25nKHNiLCBkaXIsICJod19zZGJ0X2Jsb2NrcyIsCisJCQkJCSZvcHJvZmlsZV9zZGJ0X2Jsb2Nrcyk7CisKKwl9IGVsc2UgeworCQkvKgorCQkgKiBIYXJkd2FyZSBzYW1wbGluZyBjYW4gYmUgdXNlZCBidXQgdGhlIGNwdV90eXBlIGlzCisJCSAqIGZvcmNlZCB0byB0aW1lciBpbiBvcmRlciB0byBkZWFsIHdpdGggbGVnYWN5IHVzZXIKKwkJICogc3BhY2UgdG9vbHMuICBUaGUgL2Rldi9vcHJvZmlsZS9od3NhbXBsaW5nIGZzIGlzCisJCSAqIHByb3ZpZGVkIGluIHRoYXQgY2FzZS4KKwkJICovCisJCWRpciA9IG9wcm9maWxlZnNfbWtkaXIoc2IsIHJvb3QsICJod3NhbXBsaW5nIik7CisJCWlmICghZGlyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJb3Byb2ZpbGVmc19jcmVhdGVfZmlsZShzYiwgZGlyLCAiaHdzYW1wbGVyIiwKKwkJCQkgICAgICAgJmh3c2FtcGxlcl9mb3BzKTsKKwkJb3Byb2ZpbGVmc19jcmVhdGVfZmlsZShzYiwgZGlyLCAiaHdfaW50ZXJ2YWwiLAorCQkJCSAgICAgICAmaHdfaW50ZXJ2YWxfZm9wcyk7CisJCW9wcm9maWxlZnNfY3JlYXRlX3JvX3Vsb25nKHNiLCBkaXIsICJod19taW5faW50ZXJ2YWwiLAorCQkJCQkgICAmb3Byb2ZpbGVfbWluX2ludGVydmFsKTsKKwkJb3Byb2ZpbGVmc19jcmVhdGVfcm9fdWxvbmcoc2IsIGRpciwgImh3X21heF9pbnRlcnZhbCIsCisJCQkJCSAgICZvcHJvZmlsZV9tYXhfaW50ZXJ2YWwpOworCQlvcHJvZmlsZWZzX2NyZWF0ZV91bG9uZyhzYiwgZGlyLCAiaHdfc2RidF9ibG9ja3MiLAorCQkJCQkmb3Byb2ZpbGVfc2RidF9ibG9ja3MpOworCX0KIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBvcHJvZmlsZV9od3NhbXBsZXJfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQogeworCS8qCisJICogSW5pdGlhbGl6ZSB0aGUgdGltZXIgbW9kZSBpbmZyYXN0cnVjdHVyZSBhcyB3ZWxsIGluIG9yZGVyCisJICogdG8gYmUgYWJsZSB0byBzd2l0Y2ggYmFjayBkeW5hbWljYWxseS4gIG9wcm9maWxlX3RpbWVyX2luaXQKKwkgKiBpcyBub3Qgc3VwcG9zZWQgdG8gZmFpbC4KKwkgKi8KKwlpZiAob3Byb2ZpbGVfdGltZXJfaW5pdChvcHMpKQorCQlCVUcoKTsKKworCW1lbWNweSgmdGltZXJfb3BzLCBvcHMsIHNpemVvZih0aW1lcl9vcHMpKTsKKwlvcHMtPmNyZWF0ZV9maWxlcyA9IG9wcm9maWxlX2NyZWF0ZV9od3NhbXBsaW5nX2ZpbGVzOworCisJLyoKKwkgKiBJZiB0aGUgdXNlciBzcGFjZSB0b29scyBkbyBub3Qgc3VwcG9ydCBuZXdlciBjcHUgdHlwZXMsCisJICogdGhlIGZvcmNlX2NwdV90eXBlIG1vZHVsZSBwYXJhbWV0ZXIKKwkgKiBjYW4gYmUgdXNlZCB0byBhbHdheXMgcmV0dXJuIFwidGltZXJcIiBhcyBjcHUgdHlwZS4KKwkgKi8KKwlpZiAoZm9yY2VfY3B1X3R5cGUgIT0gdGltZXIpIHsKKwkJc3RydWN0IGNwdWlkIGlkOworCisJCWdldF9jcHVfaWQgKCZpZCk7CisKKwkJc3dpdGNoIChpZC5tYWNoaW5lKSB7CisJCWNhc2UgMHgyMDk3OiBjYXNlIDB4MjA5ODogb3BzLT5jcHVfdHlwZSA9ICJzMzkwL3oxMCI7IGJyZWFrOworCQljYXNlIDB4MjgxNzogY2FzZSAweDI4MTg6IG9wcy0+Y3B1X3R5cGUgPSAiczM5MC96MTk2IjsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldHVybiAtRU5PREVWOworCQl9CisJfQorCiAJaWYgKGh3c2FtcGxlcl9zZXR1cCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCS8qCi0JICogY3JlYXRlIGh3c2FtcGxlciBmaWxlcyBvbmx5IGlmIGh3c2FtcGxlcl9zZXR1cCgpIHN1Y2NlZWRzLgorCSAqIFF1ZXJ5IHRoZSByYW5nZSBmb3IgdGhlIHNhbXBsaW5nIGludGVydmFsIGZyb20gdGhlCisJICogaGFyZHdhcmUuCiAJICovCiAJb3Byb2ZpbGVfbWluX2ludGVydmFsID0gaHdzYW1wbGVyX3F1ZXJ5X21pbl9pbnRlcnZhbCgpOwogCWlmIChvcHJvZmlsZV9taW5faW50ZXJ2YWwgPT0gMCkKQEAgLTE1NSwyMyArNDY2LDE3IEBACiAJaWYgKG9wcm9maWxlX2h3X2ludGVydmFsID4gb3Byb2ZpbGVfbWF4X2ludGVydmFsKQogCQlvcHJvZmlsZV9od19pbnRlcnZhbCA9IG9wcm9maWxlX21heF9pbnRlcnZhbDsKIAotCWlmIChvcHJvZmlsZV90aW1lcl9pbml0KG9wcykpCi0JCXJldHVybiAtRU5PREVWOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IHVzaW5nIGhhcmR3YXJlIHNhbXBsaW5nXG4iKTsKLQotCW1lbWNweSgmdGltZXJfb3BzLCBvcHMsIHNpemVvZih0aW1lcl9vcHMpKTsKKwlwcmludGsoS0VSTl9JTkZPICJvcHJvZmlsZTogU3lzdGVtIHogaGFyZHdhcmUgc2FtcGxpbmcgIgorCSAgICAgICAiZmFjaWxpdHkgZm91bmQuXG4iKTsKIAogCW9wcy0+c3RhcnQgPSBvcHJvZmlsZV9od3NhbXBsZXJfc3RhcnQ7CiAJb3BzLT5zdG9wID0gb3Byb2ZpbGVfaHdzYW1wbGVyX3N0b3A7Ci0Jb3BzLT5jcmVhdGVfZmlsZXMgPSBvcHJvZmlsZV9jcmVhdGVfaHdzYW1wbGluZ19maWxlczsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBvcHJvZmlsZV9od3NhbXBsZXJfZXhpdCh2b2lkKQogewotCW9wcm9maWxlX3RpbWVyX2V4aXQoKTsKIAlod3NhbXBsZXJfc2h1dGRvd24oKTsKIH0KIApAQCAtMTgyLDcgKzQ4NywxNSBAQAogCW9wcy0+YmFja3RyYWNlID0gczM5MF9iYWNrdHJhY2U7CiAKICNpZmRlZiBDT05GSUdfNjRCSVQKLQlyZXR1cm4gb3Byb2ZpbGVfaHdzYW1wbGVyX2luaXQob3BzKTsKKworCS8qCisJICogLUVOT0RFViBpcyBub3QgcmVwb3J0ZWQgdG8gdGhlIGNhbGxlci4gIFRoZSBtb2R1bGUgaXRzZWxmCisgICAgICAgICAqIHdpbGwgdXNlIHRoZSB0aW1lciBtb2RlIHNhbXBsaW5nIGFzIGZhbGxiYWNrIGFuZCB0aGlzIGlzCisgICAgICAgICAqIGFsd2F5cyBhdmFpbGFibGUuCisJICovCisJaHdzYW1wbGVyX2F2YWlsYWJsZSA9IG9wcm9maWxlX2h3c2FtcGxlcl9pbml0KG9wcykgPT0gMDsKKworCXJldHVybiAwOwogI2Vsc2UKIAlyZXR1cm4gLUVOT0RFVjsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9zMzkwL29wcm9maWxlL29wX2NvdW50ZXIuaCBiL2FyY2gvczM5MC9vcHJvZmlsZS9vcF9jb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE4ZDNjYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvczM5MC9vcHJvZmlsZS9vcF9jb3VudGVyLmgKQEAgLTAsMCArMSwyMyBAQAorLyoqCisgKiBhcmNoL3MzOTAvb3Byb2ZpbGUvb3BfY291bnRlci5oCisgKgorICogICBDb3B5cmlnaHQgKEMpIDIwMTEgSUJNIERldXRzY2hsYW5kIEVudHdpY2tsdW5nIEdtYkgsIElCTSBDb3Jwb3JhdGlvbgorICogICBBdXRob3Iocyk6IEFuZHJlYXMgS3JlYmJlbCAoa3JlYmJlbEBsaW51eC52bmV0LmlibS5jb20pCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAxMSBPUHJvZmlsZSBhdXRob3JzCisgKi8KKworI2lmbmRlZiBPUF9DT1VOVEVSX0gKKyNkZWZpbmUgT1BfQ09VTlRFUl9ICisKK3N0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyB7CisJLyogYGVuYWJsZWQnIG1hcHMgdG8gdGhlIGh3c2FtcGxlcl9maWxlIHZhcmlhYmxlLiAgKi8KKwkvKiBgY291bnQnIG1hcHMgdG8gdGhlIG9wcm9maWxlX2h3X2ludGVydmFsIHZhcmlhYmxlLiAgKi8KKwkvKiBgZXZlbnQnIGFuZCBgdW5pdF9tYXNrJyBhcmUgdW51c2VkLiAqLworCXVuc2lnbmVkIGxvbmcga2VybmVsOworCXVuc2lnbmVkIGxvbmcgdXNlcjsKK307CisKK2V4dGVybiBzdHJ1Y3Qgb3BfY291bnRlcl9jb25maWcgY291bnRlcl9jb25maWc7CisKKyNlbmRpZiAvKiBPUF9DT1VOVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2NvcmUvS2NvbmZpZyBiL2FyY2gvc2NvcmUvS2NvbmZpZwppbmRleCBkZjE2OWU4Li44YjBjOTQ2IDEwMDY0NAotLS0gYS9hcmNoL3Njb3JlL0tjb25maWcKKysrIGIvYXJjaC9zY29yZS9LY29uZmlnCkBAIC00LDYgKzQsOSBAQAogICAgICAgIGRlZl9ib29sIHkKICAgICAgICBzZWxlY3QgSEFWRV9HRU5FUklDX0hBUkRJUlFTCiAgICAgICAgc2VsZWN0IEdFTkVSSUNfSVJRX1NIT1cKKyAgICAgICBzZWxlY3QgSEFWRV9NRU1CTE9DSworICAgICAgIHNlbGVjdCBIQVZFX01FTUJMT0NLX05PREVfTUFQCisgICAgICAgc2VsZWN0IEFSQ0hfRElTQ0FSRF9NRU1CTE9DSwogCiBjaG9pY2UKIAlwcm9tcHQgIlN5c3RlbSB0eXBlIgpAQCAtNjAsOSArNjMsNiBAQAogY29uZmlnIEFSQ0hfRkxBVE1FTV9FTkFCTEUKIAlkZWZfYm9vbCB5CiAKLWNvbmZpZyBBUkNIX1BPUFVMQVRFU19OT0RFX01BUAotCWRlZl9ib29sIHkKLQogc291cmNlICJtbS9LY29uZmlnIgogCiBjb25maWcgTUVNT1JZX1NUQVJUCmRpZmYgLS1naXQgYS9hcmNoL3Njb3JlL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zY29yZS9rZXJuZWwvc2V0dXAuYwppbmRleCA2Zjg5OGMwLi5iNDg0NTlhIDEwMDY0NAotLS0gYS9hcmNoL3Njb3JlL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc2NvcmUva2VybmVsL3NldHVwLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2NyZWVuX2luZm8uaD4KQEAgLTU0LDcgKzU1LDggQEAKIAkvKiBJbml0aWFsaXplIHRoZSBib290LXRpbWUgYWxsb2NhdG9yIHdpdGggbG93IG1lbW9yeSBvbmx5LiAqLwogCWJvb3RtYXBfc2l6ZSA9IGluaXRfYm9vdG1lbV9ub2RlKE5PREVfREFUQSgwKSwgc3RhcnRfcGZuLAogCQkJCQkgbWluX2xvd19wZm4sIG1heF9sb3dfcGZuKTsKLQlhZGRfYWN0aXZlX3JhbmdlKDAsIG1pbl9sb3dfcGZuLCBtYXhfbG93X3Bmbik7CisJbWVtYmxvY2tfYWRkX25vZGUoUEZOX1BIWVMobWluX2xvd19wZm4pLAorCQkJICBQRk5fUEhZUyhtYXhfbG93X3BmbiAtIG1pbl9sb3dfcGZuKSwgMCk7CiAKIAlmcmVlX2Jvb3RtZW0oUEZOX1BIWVMoc3RhcnRfcGZuKSwKIAkJICAgICAobWF4X2xvd19wZm4gLSBzdGFydF9wZm4pIDw8IFBBR0VfU0hJRlQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9LY29uZmlnIGIvYXJjaC9zaC9LY29uZmlnCmluZGV4IDU2MjllMjAuLjQ3YTJmMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvS2NvbmZpZworKysgYi9hcmNoL3NoL0tjb25maWcKQEAgLTQsNiArNCw3IEBACiAJc2VsZWN0IENMS0RFVl9MT09LVVAKIAlzZWxlY3QgSEFWRV9JREUgaWYgSEFTX0lPUE9SVAogCXNlbGVjdCBIQVZFX01FTUJMT0NLCisJc2VsZWN0IEhBVkVfTUVNQkxPQ0tfTk9ERV9NQVAKIAlzZWxlY3QgSEFWRV9PUFJPRklMRQogCXNlbGVjdCBIQVZFX0dFTkVSSUNfRE1BX0NPSEVSRU5UCiAJc2VsZWN0IEhBVkVfQVJDSF9UUkFDRUhPT0sKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2JvYXJkLXNoNzc1N2xjci5jIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3NzU3bGNyLmMKaW5kZXggZWM4Yzg0Yy4uODk1ZTMzNyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3NzU3bGNyLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvYm9hcmQtc2g3NzU3bGNyLmMKQEAgLTUwLDkgKzUwLDkgQEAKICNkZWZpbmUgR0JFQ09OVAkJMHhmZmMxMDEwMAogI2RlZmluZSBHQkVDT05UX1JNSUkxCUJJVCgxNykKICNkZWZpbmUgR0JFQ09OVF9STUlJMAlCSVQoMTYpCi1zdGF0aWMgdm9pZCBzaDc3NTdfZXRoX3NldF9tZGlvX2dhdGUodW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIHZvaWQgc2g3NzU3X2V0aF9zZXRfbWRpb19nYXRlKHZvaWQgKmFkZHIpCiB7Ci0JaWYgKChhZGRyICYgMHgwMDAwMGZmZikgPCAweDA4MDApCisJaWYgKCgodW5zaWduZWQgbG9uZylhZGRyICYgMHgwMDAwMGZmZikgPCAweDA4MDApCiAJCXdyaXRlbChyZWFkbChHQkVDT05UKSB8IEdCRUNPTlRfUk1JSTAsIEdCRUNPTlQpOwogCWVsc2UKIAkJd3JpdGVsKHJlYWRsKEdCRUNPTlQpIHwgR0JFQ09OVF9STUlJMSwgR0JFQ09OVCk7CkBAIC0xMTYsOSArMTE2LDkgQEAKIAl9LAogfTsKIAotc3RhdGljIHZvaWQgc2g3NzU3X2V0aF9naWdhX3NldF9tZGlvX2dhdGUodW5zaWduZWQgbG9uZyBhZGRyKQorc3RhdGljIHZvaWQgc2g3NzU3X2V0aF9naWdhX3NldF9tZGlvX2dhdGUodm9pZCAqYWRkcikKIHsKLQlpZiAoKGFkZHIgJiAweDAwMDAwZmZmKSA8IDB4MDgwMCkgeworCWlmICgoKHVuc2lnbmVkIGxvbmcpYWRkciAmIDB4MDAwMDBmZmYpIDwgMHgwODAwKSB7CiAJCWdwaW9fc2V0X3ZhbHVlKEdQSU9fUFRUNCwgMSk7CiAJCXdyaXRlbChyZWFkbChHQkVDT05UKSAmIH5HQkVDT05UX1JNSUkwLCBHQkVDT05UKTsKIAl9IGVsc2UgewpAQCAtMjEwLDggKzIxMCwxMiBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBzaF9tbWNpZl9kbWEgc2g3NzU3bGNyX21tY2lmX2RtYSA9IHsKLQkuY2hhbl9wcml2X3R4CT0gU0hETUFfU0xBVkVfTU1DSUZfVFgsCi0JLmNoYW5fcHJpdl9yeAk9IFNIRE1BX1NMQVZFX01NQ0lGX1JYLAorCS5jaGFuX3ByaXZfdHgJPSB7CisJCS5zbGF2ZV9pZCA9IFNIRE1BX1NMQVZFX01NQ0lGX1RYLAorCX0sCisJLmNoYW5fcHJpdl9yeAk9IHsKKwkJLnNsYXZlX2lkID0gU0hETUFfU0xBVkVfTU1DSUZfUlgsCisJfQogfTsKIAogc3RhdGljIHN0cnVjdCBzaF9tbWNpZl9wbGF0X2RhdGEgc2hfbW1jaWZfcGxhdCA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvaW5jbHVkZS9hc20vbWVtYmxvY2suaCBiL2FyY2gvc2gvaW5jbHVkZS9hc20vbWVtYmxvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg3MDYzZi4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2luY2x1ZGUvYXNtL21lbWJsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNpZm5kZWYgX19BU01fU0hfTUVNQkxPQ0tfSAotI2RlZmluZSBfX0FTTV9TSF9NRU1CTE9DS19ICi0KLSNlbmRpZiAvKiBfX0FTTV9TSF9NRU1CTE9DS19IICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9pZGxlLmMgYi9hcmNoL3NoL2tlcm5lbC9pZGxlLmMKaW5kZXggZGI0ZWNkNy4uNDA2NTA4ZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvaWRsZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2lkbGUuYwpAQCAtODksNyArODksOCBAQAogCiAJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KIAl3aGlsZSAoMSkgewotCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKDEpOworCQl0aWNrX25vaHpfaWRsZV9lbnRlcigpOworCQlyY3VfaWRsZV9lbnRlcigpOwogCiAJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKIAkJCWNoZWNrX3BndF9jYWNoZSgpOwpAQCAtMTExLDcgKzExMiw4IEBACiAJCQlzdGFydF9jcml0aWNhbF90aW1pbmdzKCk7CiAJCX0KIAotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCXJjdV9pZGxlX2V4aXQoKTsKKwkJdGlja19ub2h6X2lkbGVfZXhpdCgpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jIGIvYXJjaC9zaC9rZXJuZWwvbWFjaGluZV9rZXhlYy5jCmluZGV4IGM1YTMzZjAuLjlmZWE0OWYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL21hY2hpbmVfa2V4ZWMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9tYWNoaW5lX2tleGVjLmMKQEAgLTE1Nyw5ICsxNTcsNiBAQAogCXVuc2lnbmVkIGxvbmcgbG9uZyBjcmFzaF9zaXplLCBjcmFzaF9iYXNlOwogCWludCByZXQ7CiAKLQkvKiB0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIG1lbWJsb2NrX3BoeXNfbWVtX3NpemUoKSAqLwotCW1lbWJsb2NrX2FuYWx5emUoKTsKLQogCXJldCA9IHBhcnNlX2NyYXNoa2VybmVsKGJvb3RfY29tbWFuZF9saW5lLCBtZW1ibG9ja19waHlzX21lbV9zaXplKCksCiAJCQkmY3Jhc2hfc2l6ZSwgJmNyYXNoX2Jhc2UpOwogCWlmIChyZXQgPT0gMCAmJiBjcmFzaF9zaXplID4gMCkgewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKaW5kZXggMWEwZTk0Ni4uN2I1N2JmMSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCkBAIC0yMzAsNyArMjMwLDggQEAKIAlwbWJfYm9sdF9tYXBwaW5nKCh1bnNpZ25lZCBsb25nKV9fdmEoc3RhcnQpLCBzdGFydCwgZW5kIC0gc3RhcnQsCiAJCQkgUEFHRV9LRVJORUwpOwogCi0JYWRkX2FjdGl2ZV9yYW5nZShuaWQsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisJbWVtYmxvY2tfc2V0X25vZGUoUEZOX1BIWVMoc3RhcnRfcGZuKSwKKwkJCSAgUEZOX1BIWVMoZW5kX3BmbiAtIHN0YXJ0X3BmbiksIG5pZCk7CiB9CiAKIHZvaWQgX19pbml0IF9fd2VhayBwbGF0X2Vhcmx5X2RldmljZV9zZXR1cCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9LY29uZmlnIGIvYXJjaC9zaC9tbS9LY29uZmlnCmluZGV4IGMzZTYxYjMuLmNiOGY5OTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vS2NvbmZpZworKysgYi9hcmNoL3NoL21tL0tjb25maWcKQEAgLTE0Myw5ICsxNDMsNiBAQAogCQkgICAgICAgQ1BVX1NVQlRZUEVfU0g3Nzg1KQogCWRlZmF1bHQgIjEiCiAKLWNvbmZpZyBBUkNIX1BPUFVMQVRFU19OT0RFX01BUAotCWRlZl9ib29sIHkKLQogY29uZmlnIEFSQ0hfU0VMRUNUX01FTU9SWV9NT0RFTAogCWRlZl9ib29sIHkKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9pbml0LmMgYi9hcmNoL3NoL21tL2luaXQuYwppbmRleCA5MzljYTBmLi44MmNjNTc2IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2luaXQuYworKysgYi9hcmNoL3NoL21tL2luaXQuYwpAQCAtMzI0LDcgKzMyNCw2IEBACiAJdW5zaWduZWQgbG9uZyB2YWRkciwgZW5kOwogCWludCBuaWQ7CiAKLQltZW1ibG9ja19pbml0KCk7CiAJc2hfbXYubXZfbWVtX2luaXQoKTsKIAogCWVhcmx5X3Jlc2VydmVfbWVtKCk7CkBAIC0zMzcsNyArMzM2LDcgQEAKIAkJc2hfbXYubXZfbWVtX3Jlc2VydmUoKTsKIAogCW1lbWJsb2NrX2VuZm9yY2VfbWVtb3J5X2xpbWl0KG1lbW9yeV9saW1pdCk7Ci0JbWVtYmxvY2tfYW5hbHl6ZSgpOworCW1lbWJsb2NrX2FsbG93X3Jlc2l6ZSgpOwogCiAJbWVtYmxvY2tfZHVtcF9hbGwoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9vcHJvZmlsZS9jb21tb24uYyBiL2FyY2gvc2gvb3Byb2ZpbGUvY29tbW9uLmMKaW5kZXggYjRjMmQyYi4uZTRkZDVkNSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9vcHJvZmlsZS9jb21tb24uYworKysgYi9hcmNoL3NoL29wcm9maWxlL2NvbW1vbi5jCkBAIC00OSw3ICs0OSw3IEBACiAJcmV0dXJuIG9wcm9maWxlX3BlcmZfaW5pdChvcHMpOwogfQogCi12b2lkIF9fZXhpdCBvcHJvZmlsZV9hcmNoX2V4aXQodm9pZCkKK3ZvaWQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpCiB7CiAJb3Byb2ZpbGVfcGVyZl9leGl0KCk7CiAJa2ZyZWUoc2hfcG11X29wX25hbWUpOwpAQCAtNjAsNSArNjAsNSBAQAogCW9wcy0+YmFja3RyYWNlID0gc2hfYmFja3RyYWNlOwogCXJldHVybiAtRU5PREVWOwogfQotdm9pZCBfX2V4aXQgb3Byb2ZpbGVfYXJjaF9leGl0KHZvaWQpIHt9Cit2b2lkIG9wcm9maWxlX2FyY2hfZXhpdCh2b2lkKSB7fQogI2VuZGlmIC8qIENPTkZJR19IV19QRVJGX0VWRU5UUyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9LY29uZmlnIGIvYXJjaC9zcGFyYy9LY29uZmlnCmluZGV4IGY5MjYwMmUuLjcwYWU5ZDggMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvS2NvbmZpZworKysgYi9hcmNoL3NwYXJjL0tjb25maWcKQEAgLTQzLDYgKzQzLDcgQEAKIAlzZWxlY3QgSEFWRV9LUFJPQkVTCiAJc2VsZWN0IEhBVkVfUkNVX1RBQkxFX0ZSRUUgaWYgU01QCiAJc2VsZWN0IEhBVkVfTUVNQkxPQ0sKKwlzZWxlY3QgSEFWRV9NRU1CTE9DS19OT0RFX01BUAogCXNlbGVjdCBIQVZFX1NZU0NBTExfV1JBUFBFUlMKIAlzZWxlY3QgSEFWRV9EWU5BTUlDX0ZUUkFDRQogCXNlbGVjdCBIQVZFX0ZUUkFDRV9NQ09VTlRfUkVDT1JECkBAIC0zNTIsOSArMzUzLDYgQEAKIAlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBORUVEX01VTFRJUExFX05PREVTCiAKLWNvbmZpZyBBUkNIX1BPUFVMQVRFU19OT0RFX01BUAotCWRlZl9ib29sIHkgaWYgU1BBUkM2NAotCiBjb25maWcgQVJDSF9TRUxFQ1RfTUVNT1JZX01PREVMCiAJZGVmX2Jvb2wgeSBpZiBTUEFSQzY0CiAKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbWVtYmxvY2suaCBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vbWVtYmxvY2suaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3YjA0Ny4uMDAwMDAwMAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL21lbWJsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLSNpZm5kZWYgX1NQQVJDNjRfTUVNQkxPQ0tfSAotI2RlZmluZSBfU1BBUkM2NF9NRU1CTE9DS19ICi0KLSNpbmNsdWRlIDxhc20vb3BsaWIuaD4KLQotI2RlZmluZSBNRU1CTE9DS19EQkcoZm10Li4uKSBwcm9tX3ByaW50ZihmbXQpCi0KLSNlbmRpZiAvKiAhKF9TUEFSQzY0X01FTUJMT0NLX0gpICovCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS9zb2NrZXQuaAppbmRleCA5ZDNmZWZjLi44YWYxYjY0IDEwMDY0NAotLS0gYS9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3NvY2tldC5oCisrKyBiL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vc29ja2V0LmgKQEAgLTU4LDYgKzU4LDkgQEAKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICAweDAwMjQKIAorI2RlZmluZSBTT19XSUZJX1NUQVRVUwkJMHgwMDI1CisjZGVmaW5lIFNDTV9XSUZJX1NUQVRVUwkJU09fV0lGSV9TVEFUVVMKKwogLyogU2VjdXJpdHkgbGV2ZWxzIC0gYXMgcGVyIE5STCBJUHY2IC0gZG9uJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcgKi8KICNkZWZpbmUgU09fU0VDVVJJVFlfQVVUSEVOVElDQVRJT04JCTB4NTAwMQogI2RlZmluZSBTT19TRUNVUklUWV9FTkNSWVBUSU9OX1RSQU5TUE9SVAkweDUwMDIKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2RzLmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9kcy5jCmluZGV4IDc0MjliNDcuLjM4MWVkY2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMva2VybmVsL2RzLmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvZHMuYwpAQCAtMTE4MSwxMyArMTE4MSwxMSBAQAogCiAJZHAtPnJjdl9idWZfbGVuID0gNDA5NjsKIAotCWRwLT5kc19zdGF0ZXMgPSBremFsbG9jKHNpemVvZihkc19zdGF0ZXNfdGVtcGxhdGUpLAotCQkJCUdGUF9LRVJORUwpOworCWRwLT5kc19zdGF0ZXMgPSBrbWVtZHVwKGRzX3N0YXRlc190ZW1wbGF0ZSwKKwkJCQlzaXplb2YoZHNfc3RhdGVzX3RlbXBsYXRlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkcC0+ZHNfc3RhdGVzKQogCQlnb3RvIG91dF9mcmVlX3Jjdl9idWY7CiAKLQltZW1jcHkoZHAtPmRzX3N0YXRlcywgZHNfc3RhdGVzX3RlbXBsYXRlLAotCSAgICAgICBzaXplb2YoZHNfc3RhdGVzX3RlbXBsYXRlKSk7CiAJZHAtPm51bV9kc19zdGF0ZXMgPSBBUlJBWV9TSVpFKGRzX3N0YXRlc190ZW1wbGF0ZSk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZHAtPm51bV9kc19zdGF0ZXM7IGkrKykKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3BjaV9zdW40di5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKaW5kZXggYjI3MmNkYS4uYWY1NzU1ZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvcGNpX3N1bjR2LmMKQEAgLTg0OSwxMCArODQ5LDEwIEBACiAJaWYgKCFpcnEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKHBjaV9zdW40dl9tc2lxX3NldHN0YXRlKHBibS0+ZGV2aGFuZGxlLCBtc2lxaWQsIEhWX01TSVFTVEFURV9JRExFKSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHBjaV9zdW40dl9tc2lxX3NldHZhbGlkKHBibS0+ZGV2aGFuZGxlLCBtc2lxaWQsIEhWX01TSVFfVkFMSUQpKQogCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAocGNpX3N1bjR2X21zaXFfc2V0c3RhdGUocGJtLT5kZXZoYW5kbGUsIG1zaXFpZCwgSFZfTVNJUVNUQVRFX0lETEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHVybiBpcnE7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzY0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9jZXNzXzY0LmMKaW5kZXggMzczOWEwNi4uMzlkOGIwNSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb2Nlc3NfNjQuYwpAQCAtOTUsMTIgKzk1LDE0IEBACiAJc2V0X3RocmVhZF9mbGFnKFRJRl9QT0xMSU5HX05SRkxBRyk7CiAKIAl3aGlsZSgxKSB7Ci0JCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soMSk7CisJCXRpY2tfbm9oel9pZGxlX2VudGVyKCk7CisJCXJjdV9pZGxlX2VudGVyKCk7CiAKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSAmJiAhY3B1X2lzX29mZmxpbmUoY3B1KSkKIAkJCXNwYXJjNjRfeWllbGQoY3B1KTsKIAotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCXJjdV9pZGxlX2V4aXQoKTsKKwkJdGlja19ub2h6X2lkbGVfZXhpdCgpOwogCiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9jb21tb24uYyBiL2FyY2gvc3BhcmMva2VybmVsL3Byb21fY29tbW9uLmMKaW5kZXggNDY2MTQ4MC4uNzQxZGY5MSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvcHJvbV9jb21tb24uYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9wcm9tX2NvbW1vbi5jCkBAIC01OCwxMiArNTgsMTAgQEAKIAl2b2lkICpuZXdfdmFsOwogCWludCBlcnI7CiAKLQluZXdfdmFsID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCW5ld192YWwgPSBrbWVtZHVwKHZhbCwgbGVuLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld192YWwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWVtY3B5KG5ld192YWwsIHZhbCwgbGVuKTsKLQogCWVyciA9IC1FTk9ERVY7CiAKIAltdXRleF9sb2NrKCZvZl9zZXRfcHJvcGVydHlfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfMzIuYyBiL2FyY2gvc3BhcmMva2VybmVsL3NldHVwXzMyLmMKaW5kZXggZmUxZTNmYy4uZmZiODgzZCAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc2V0dXBfMzIuYworKysgYi9hcmNoL3NwYXJjL2tlcm5lbC9zZXR1cF8zMi5jCkBAIC04NCw3ICs4NCw3IEBACiAKIAlwcm9tX3ByaW50ZigiUFJPTSBTWU5DIENPTU1BTkQuLi5cbiIpOwogCXNob3dfZnJlZV9hcmVhcygwKTsKLQlpZihjdXJyZW50LT5waWQgIT0gMCkgeworCWlmICghaXNfaWRsZV90YXNrKGN1cnJlbnQpKSB7CiAJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJc3lzX3N5bmMoKTsKIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL3N5c19zcGFyY182NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKaW5kZXggNDQxNTIxYS4uMjMyZGY5OSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvc3lzX3NwYXJjXzY0LmMKQEAgLTM2OCwxMSArMzY4LDExIEBACiAJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfUkFORE9NSVpFKSB7CiAJCXVuc2lnbmVkIGxvbmcgdmFsID0gZ2V0X3JhbmRvbV9pbnQoKTsKIAkJaWYgKHRlc3RfdGhyZWFkX2ZsYWcoVElGXzMyQklUKSkKLQkJCXJuZCA9ICh2YWwgJSAoMVVMIDw8ICgyMlVMLVBBR0VfU0hJRlQpKSk7CisJCQlybmQgPSAodmFsICUgKDFVTCA8PCAoMjNVTC1QQUdFX1NISUZUKSkpOwogCQllbHNlCi0JCQlybmQgPSAodmFsICUgKDFVTCA8PCAoMjlVTC1QQUdFX1NISUZUKSkpOworCQkJcm5kID0gKHZhbCAlICgxVUwgPDwgKDMwVUwtUEFHRV9TSElGVCkpKTsKIAl9Ci0JcmV0dXJuIChybmQgPDwgUEFHRV9TSElGVCkgKiAyOworCXJldHVybiBybmQgPDwgUEFHRV9TSElGVDsKIH0KIAogdm9pZCBhcmNoX3BpY2tfbW1hcF9sYXlvdXQoc3RydWN0IG1tX3N0cnVjdCAqbW0pCmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2J0Zml4dXAuYyBiL2FyY2gvc3BhcmMvbW0vYnRmaXh1cC5jCmluZGV4IDUxNzVhYzIuLjhhN2Y4MTcgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vYnRmaXh1cC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vYnRmaXh1cC5jCkBAIC0zMDIsOCArMzAyLDcgQEAKIAkJCQljYXNlICdpJzoJLyogSU5UICovCiAJCQkJCWlmICgoaW5zbiAmIDB4YzFjMDAwMDApID09IDB4MDEwMDAwMDApIC8qICVISSAqLwogCQkJCQkJc2V0X2FkZHIoYWRkciwgcVsxXSwgZm1hbmdsZWQsIChpbnNuICYgMHhmZmMwMDAwMCkgfCAocFsxXSA+PiAxMCkpOwotCQkJCQllbHNlIGlmICgoaW5zbiAmIDB4ODAwMDIwMDApID09IDB4ODAwMDIwMDAgJiYKLQkJCQkJICAgICAgICAgKGluc24gJiAweDAxODAwMDAwKSAhPSAweDAxODAwMDAwKSAvKiAlTE8gKi8KKwkJCQkJZWxzZSBpZiAoKGluc24gJiAweDgwMDAyMDAwKSA9PSAweDgwMDAyMDAwKSAvKiAlTE8gKi8KIAkJCQkJCXNldF9hZGRyKGFkZHIsIHFbMV0sIGZtYW5nbGVkLCAoaW5zbiAmIDB4ZmZmZmUwMDApIHwgKHBbMV0gJiAweDNmZikpOwogCQkJCQllbHNlIHsKIAkJCQkJCXByb21fcHJpbnRmKGluc25faSwgcCwgYWRkciwgaW5zbik7CmRpZmYgLS1naXQgYS9hcmNoL3NwYXJjL21tL2luaXRfNjQuYyBiL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCmluZGV4IDhlMDczZDguLmIzZjVlN2QgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCisrKyBiL2FyY2gvc3BhcmMvbW0vaW5pdF82NC5jCkBAIC03OTAsNyArNzkwLDcgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXU2NCBtZW1ibG9ja19uaWRfcmFuZ2UodTY0IHN0YXJ0LCB1NjQgZW5kLCBpbnQgKm5pZCkKK3N0YXRpYyB1NjQgbWVtYmxvY2tfbmlkX3JhbmdlKHU2NCBzdGFydCwgdTY0IGVuZCwgaW50ICpuaWQpCiB7CiAJKm5pZCA9IGZpbmRfbm9kZShzdGFydCk7CiAJc3RhcnQgKz0gUEFHRV9TSVpFOwpAQCAtODA4LDcgKzgwOCw3IEBACiAJcmV0dXJuIHN0YXJ0OwogfQogI2Vsc2UKLXU2NCBtZW1ibG9ja19uaWRfcmFuZ2UodTY0IHN0YXJ0LCB1NjQgZW5kLCBpbnQgKm5pZCkKK3N0YXRpYyB1NjQgbWVtYmxvY2tfbmlkX3JhbmdlKHU2NCBzdGFydCwgdTY0IGVuZCwgaW50ICpuaWQpCiB7CiAJKm5pZCA9IDA7CiAJcmV0dXJuIGVuZDsKQEAgLTgxNiw3ICs4MTYsNyBAQAogI2VuZGlmCiAKIC8qIFRoaXMgbXVzdCBiZSBpbnZva2VkIGFmdGVyIHBlcmZvcm1pbmcgYWxsIG9mIHRoZSBuZWNlc3NhcnkKLSAqIGFkZF9hY3RpdmVfcmFuZ2UoKSBjYWxscyBmb3IgJ25pZCcuICBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZ2V0CisgKiBtZW1ibG9ja19zZXRfbm9kZSgpIGNhbGxzIGZvciAnbmlkJy4gIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBnZXQKICAqIGNvcnJlY3QgZGF0YSBmcm9tIGdldF9wZm5fcmFuZ2VfZm9yX25pZCgpLgogICovCiBzdGF0aWMgdm9pZCBfX2luaXQgYWxsb2NhdGVfbm9kZV9kYXRhKGludCBuaWQpCkBAIC05ODcsMTQgKzk4NywxMSBAQAogCiAJCQl0aGlzX2VuZCA9IG1lbWJsb2NrX25pZF9yYW5nZShzdGFydCwgZW5kLCAmbmlkKTsKIAotCQkJbnVtYWRiZygiQWRkaW5nIGFjdGl2ZSByYW5nZSBuaWRbJWRdICIKKwkJCW51bWFkYmcoIlNldHRpbmcgbWVtYmxvY2sgTlVNQSBub2RlIG5pZFslZF0gIgogCQkJCSJzdGFydFslbHhdIGVuZFslbHhdXG4iLAogCQkJCW5pZCwgc3RhcnQsIHRoaXNfZW5kKTsKIAotCQkJYWRkX2FjdGl2ZV9yYW5nZShuaWQsCi0JCQkJCSBzdGFydCA+PiBQQUdFX1NISUZULAotCQkJCQkgdGhpc19lbmQgPj4gUEFHRV9TSElGVCk7Ci0KKwkJCW1lbWJsb2NrX3NldF9ub2RlKHN0YXJ0LCB0aGlzX2VuZCAtIHN0YXJ0LCBuaWQpOwogCQkJc3RhcnQgPSB0aGlzX2VuZDsKIAkJfQogCX0KQEAgLTEyODIsNyArMTI3OSw2IEBACiB7CiAJdW5zaWduZWQgbG9uZyB0b3Bfb2ZfcmFtID0gbWVtYmxvY2tfZW5kX29mX0RSQU0oKTsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX3JhbSA9IG1lbWJsb2NrX3BoeXNfbWVtX3NpemUoKTsKLQlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyZWc7CiAKIAludW1hZGJnKCJib290bWVtX2luaXRfbm9ubnVtYSgpXG4iKTsKIApAQCAtMTI5MiwyMCArMTI4OCw4IEBACiAJICAgICAgICh0b3Bfb2ZfcmFtIC0gdG90YWxfcmFtKSA+PiAyMCk7CiAKIAlpbml0X25vZGVfbWFza3Nfbm9ubnVtYSgpOwotCi0JZm9yX2VhY2hfbWVtYmxvY2sobWVtb3J5LCByZWcpIHsKLQkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47Ci0KLQkJaWYgKCFyZWctPnNpemUpCi0JCQljb250aW51ZTsKLQotCQlzdGFydF9wZm4gPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2Jhc2VfcGZuKHJlZyk7Ci0JCWVuZF9wZm4gPSBtZW1ibG9ja19yZWdpb25fbWVtb3J5X2VuZF9wZm4ocmVnKTsKLQkJYWRkX2FjdGl2ZV9yYW5nZSgwLCBzdGFydF9wZm4sIGVuZF9wZm4pOwotCX0KLQorCW1lbWJsb2NrX3NldF9ub2RlKDAsIChwaHlzX2FkZHJfdClVTExPTkdfTUFYLCAwKTsKIAlhbGxvY2F0ZV9ub2RlX2RhdGEoMCk7Ci0KIAlub2RlX3NldF9vbmxpbmUoMCk7CiB9CiAKQEAgLTE3NjksOCArMTc1Myw2IEBACiAJCXN1bjR2X2t0c2JfaW5pdCgpOwogCX0KIAotCW1lbWJsb2NrX2luaXQoKTsKLQogCS8qIEZpbmQgYXZhaWxhYmxlIHBoeXNpY2FsIG1lbW9yeS4uLgogCSAqCiAJICogUmVhZCBpdCB0d2ljZSBpbiBvcmRlciB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBvcGVuZmlybXdhcmUuCkBAIC0xNzk2LDcgKzE3NzgsNyBAQAogCiAJbWVtYmxvY2tfZW5mb3JjZV9tZW1vcnlfbGltaXQoY21kbGluZV9tZW1vcnlfc2l6ZSk7CiAKLQltZW1ibG9ja19hbmFseXplKCk7CisJbWVtYmxvY2tfYWxsb3dfcmVzaXplKCk7CiAJbWVtYmxvY2tfZHVtcF9hbGwoKTsKIAogCXNldF9iaXQoMCwgbW11X2NvbnRleHRfYm1hcCk7CmRpZmYgLS1naXQgYS9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL3RpbGUvaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggOTRlOWE1MS4uZjgwZjhjZSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2luY2x1ZGUvYXNtL2lycS5oCisrKyBiL2FyY2gvdGlsZS9pbmNsdWRlL2FzbS9pcnEuaApAQCAtNzQsMTYgKzc0LDYgQEAKICAqLwogdm9pZCB0aWxlX2lycV9hY3RpdmF0ZSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgdGlsZV9pcnFfdHlwZSk7CiAKLS8qCi0gKiBGb3Igb25ib2FyZCwgbm9uLVBDSSAoZS5nLiBUSUxFX0lSUV9QRVJDUFUpIGRldmljZXMsIGRyaXZlcnMga25vdwotICogaG93IHRvIHVzZSBlbmFibGUvZGlzYWJsZV9wZXJjcHVfaXJxKCkgdG8gbWFuYWdlIGludGVycnVwdHMgb24gZWFjaAotICogY29yZS4gIFdlIGNhbid0IHVzZSB0aGUgZ2VuZXJpYyBlbmFibGUvZGlzYWJsZV9pcnEoKSBiZWNhdXNlIHRoZXkKLSAqIHVzZSBhIHNpbmdsZSByZWZlcmVuY2UgY291bnQgcGVyIGlycSwgcmF0aGVyIHRoYW4gcGVyIGNwdSBwZXIgaXJxLgotICovCi12b2lkIGVuYWJsZV9wZXJjcHVfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotdm9pZCBkaXNhYmxlX3BlcmNwdV9pcnEodW5zaWduZWQgaW50IGlycSk7Ci0KLQogdm9pZCBzZXR1cF9pcnFfcmVncyh2b2lkKTsKIAogI2VuZGlmIC8qIF9BU01fVElMRV9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9pcnEuYyBiL2FyY2gvdGlsZS9rZXJuZWwvaXJxLmMKaW5kZXggYWEwMTM0ZC4uMDJlNjI4MCAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3RpbGUva2VybmVsL2lycS5jCkBAIC0xNTIsMTQgKzE1MiwxMyBAQAogICogUmVtb3ZlIGFuIGlycSBmcm9tIHRoZSBkaXNhYmxlZCBtYXNrLiAgSWYgd2UncmUgaW4gYW4gaW50ZXJydXB0CiAgKiBjb250ZXh0LCBkZWZlciBlbmFibGluZyB0aGUgSFcgaW50ZXJydXB0IHVudGlsIHdlIGxlYXZlLgogICovCi12b2lkIGVuYWJsZV9wZXJjcHVfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCB0aWxlX2lycV9jaGlwX2VuYWJsZShzdHJ1Y3QgaXJxX2RhdGEgKmQpCiB7Ci0JZ2V0X2NwdV92YXIoaXJxX2Rpc2FibGVfbWFzaykgJj0gfigxVUwgPDwgaXJxKTsKKwlnZXRfY3B1X3ZhcihpcnFfZGlzYWJsZV9tYXNrKSAmPSB+KDFVTCA8PCBkLT5pcnEpOwogCWlmIChfX2dldF9jcHVfdmFyKGlycV9kZXB0aCkgPT0gMCkKLQkJdW5tYXNrX2lycXMoMVVMIDw8IGlycSk7CisJCXVubWFza19pcnFzKDFVTCA8PCBkLT5pcnEpOwogCXB1dF9jcHVfdmFyKGlycV9kaXNhYmxlX21hc2spOwogfQotRVhQT1JUX1NZTUJPTChlbmFibGVfcGVyY3B1X2lycSk7CiAKIC8qCiAgKiBBZGQgYW4gaXJxIHRvIHRoZSBkaXNhYmxlZCBtYXNrLiAgV2UgZGlzYWJsZSB0aGUgSFcgaW50ZXJydXB0CkBAIC0xNjcsMTMgKzE2NiwxMiBAQAogICogaW4gYW4gaW50ZXJydXB0IGNvbnRleHQsIHRoZSByZXR1cm4gcGF0aCBpcyBjYXJlZnVsIHRvIGF2b2lkCiAgKiB1bm1hc2tpbmcgYSBuZXdseSBkaXNhYmxlZCBpbnRlcnJ1cHQuCiAgKi8KLXZvaWQgZGlzYWJsZV9wZXJjcHVfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCB0aWxlX2lycV9jaGlwX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkKQogewotCWdldF9jcHVfdmFyKGlycV9kaXNhYmxlX21hc2spIHw9ICgxVUwgPDwgaXJxKTsKLQltYXNrX2lycXMoMVVMIDw8IGlycSk7CisJZ2V0X2NwdV92YXIoaXJxX2Rpc2FibGVfbWFzaykgfD0gKDFVTCA8PCBkLT5pcnEpOworCW1hc2tfaXJxcygxVUwgPDwgZC0+aXJxKTsKIAlwdXRfY3B1X3ZhcihpcnFfZGlzYWJsZV9tYXNrKTsKIH0KLUVYUE9SVF9TWU1CT0woZGlzYWJsZV9wZXJjcHVfaXJxKTsKIAogLyogTWFzayBhbiBpbnRlcnJ1cHQuICovCiBzdGF0aWMgdm9pZCB0aWxlX2lycV9jaGlwX21hc2soc3RydWN0IGlycV9kYXRhICpkKQpAQCAtMjA5LDYgKzIwNyw4IEBACiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgdGlsZV9pcnFfY2hpcCA9IHsKIAkubmFtZSA9ICJ0aWxlX2lycV9jaGlwIiwKKwkuaXJxX2VuYWJsZSA9IHRpbGVfaXJxX2NoaXBfZW5hYmxlLAorCS5pcnFfZGlzYWJsZSA9IHRpbGVfaXJxX2NoaXBfZGlzYWJsZSwKIAkuaXJxX2FjayA9IHRpbGVfaXJxX2NoaXBfYWNrLAogCS5pcnFfZW9pID0gdGlsZV9pcnFfY2hpcF9lb2ksCiAJLmlycV9tYXNrID0gdGlsZV9pcnFfY2hpcF9tYXNrLApkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9wY2ktZG1hLmMgYi9hcmNoL3RpbGUva2VybmVsL3BjaS1kbWEuYwppbmRleCA2NThmMmNlLi5iM2VkMTlmIDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL3BjaS1kbWEuYworKysgYi9hcmNoL3RpbGUva2VybmVsL3BjaS1kbWEuYwpAQCAtMTUsNiArMTUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2hvbWVjYWNoZS5oPgogCmRpZmYgLS1naXQgYS9hcmNoL3RpbGUva2VybmVsL3BjaS5jIGIvYXJjaC90aWxlL2tlcm5lbC9wY2kuYwppbmRleCAyYTgwMTRjLi45ZDYxMGQzIDEwMDY0NAotLS0gYS9hcmNoL3RpbGUva2VybmVsL3BjaS5jCisrKyBiL2FyY2gvdGlsZS9rZXJuZWwvcGNpLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc2VjdGlvbnMuaD4KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC90aWxlL2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggOWM0NWQ4Yi4uNGMxYWM2ZSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC90aWxlL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTg1LDcgKzg1LDggQEAKIAogCS8qIGVuZGxlc3MgaWRsZSBsb29wIHdpdGggbm8gcHJpb3JpdHkgYXQgYWxsICovCiAJd2hpbGUgKDEpIHsKLQkJdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljaygxKTsKKwkJdGlja19ub2h6X2lkbGVfZW50ZXIoKTsKKwkJcmN1X2lkbGVfZW50ZXIoKTsKIAkJd2hpbGUgKCFuZWVkX3Jlc2NoZWQoKSkgewogCQkJaWYgKGNwdV9pc19vZmZsaW5lKGNwdSkpCiAJCQkJQlVHKCk7ICAvKiBubyBIT1RQTFVHX0NQVSAqLwpAQCAtMTA1LDcgKzEwNiw4IEBACiAJCQkJbG9jYWxfaXJxX2VuYWJsZSgpOwogCQkJY3VycmVudF90aHJlYWRfaW5mbygpLT5zdGF0dXMgfD0gVFNfUE9MTElORzsKIAkJfQotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCXJjdV9pZGxlX2V4aXQoKTsKKwkJdGlja19ub2h6X2lkbGVfZXhpdCgpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC90aWxlL2tlcm5lbC9zeXNmcy5jIGIvYXJjaC90aWxlL2tlcm5lbC9zeXNmcy5jCmluZGV4IGI2NzFhODYuLjYwMjkwODIgMTAwNjQ0Ci0tLSBhL2FyY2gvdGlsZS9rZXJuZWwvc3lzZnMuYworKysgYi9hcmNoL3RpbGUva2VybmVsL3N5c2ZzLmMKQEAgLTE4LDYgKzE4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvc3RhdC5oPgogI2luY2x1ZGUgPGh2L2h5cGVydmlzb3IuaD4KIAogLyogUmV0dXJuIGEgc3RyaW5nIHF1ZXJpZWQgZnJvbSB0aGUgaHlwZXJ2aXNvciwgdHJ1bmNhdGVkIHRvIHBhZ2Ugc2l6ZS4gKi8KZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9saWIvZXhwb3J0cy5jIGIvYXJjaC90aWxlL2xpYi9leHBvcnRzLmMKaW5kZXggYTg3ZDJhOC4uMmE4MWQzMiAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL2xpYi9leHBvcnRzLmMKKysrIGIvYXJjaC90aWxlL2xpYi9leHBvcnRzLmMKQEAgLTM5LDYgKzM5LDkgQEAKIEVYUE9SVF9TWU1CT0woY3VycmVudF90ZXh0X2FkZHIpOwogRVhQT1JUX1NZTUJPTChkdW1wX3N0YWNrKTsKIAorLyogYXJjaC90aWxlL2tlcm5lbC9oZWFkLlMgKi8KK0VYUE9SVF9TWU1CT0woZW1wdHlfemVyb19wYWdlKTsKKwogLyogYXJjaC90aWxlL2xpYi8sIHZhcmlvdXMgbWVtY3B5IGZpbGVzICovCiBFWFBPUlRfU1lNQk9MKG1lbWNweSk7CiBFWFBPUlRfU1lNQk9MKF9fY29weV90b191c2VyX2luYXRvbWljKTsKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9tbS9mYXVsdC5jIGIvYXJjaC90aWxlL21tL2ZhdWx0LmMKaW5kZXggMjViN2I5MC4uYzFlYWFhMSAxMDA2NDQKLS0tIGEvYXJjaC90aWxlL21tL2ZhdWx0LmMKKysrIGIvYXJjaC90aWxlL21tL2ZhdWx0LmMKQEAgLTU0LDcgKzU0LDcgQEAKIAlpZiAodW5saWtlbHkodHNrLT5waWQgPCAyKSkgewogCQlwYW5pYygiU2lnbmFsICVkIChjb2RlICVkKSBhdCAlI2x4IHNlbnQgdG8gJXMhIiwKIAkJICAgICAgc2lfc2lnbm8sIHNpX2NvZGUgJiAweGZmZmYsIGFkZHJlc3MsCi0JCSAgICAgIHRzay0+cGlkID8gImluaXQiIDogInRoZSBpZGxlIHRhc2siKTsKKwkJICAgICAgaXNfaWRsZV90YXNrKHRzaykgPyAidGhlIGlkbGUgdGFzayIgOiAiaW5pdCIpOwogCX0KIAogCWluZm8uc2lfc2lnbm8gPSBzaV9zaWdubzsKQEAgLTUxNSw3ICs1MTUsNyBAQAogCiAJaWYgKHVubGlrZWx5KHRzay0+cGlkIDwgMikpIHsKIAkJcGFuaWMoIktlcm5lbCBwYWdlIGZhdWx0IHJ1bm5pbmcgJXMhIiwKLQkJICAgICAgdHNrLT5waWQgPyAiaW5pdCIgOiAidGhlIGlkbGUgdGFzayIpOworCQkgICAgICBpc19pZGxlX3Rhc2sodHNrKSA/ICJ0aGUgaWRsZSB0YXNrIiA6ICJpbml0Iik7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvdGlsZS9tbS9ob21lY2FjaGUuYyBiL2FyY2gvdGlsZS9tbS9ob21lY2FjaGUuYwppbmRleCBjYmU2ZjRmLi4xY2M2YWU0IDEwMDY0NAotLS0gYS9hcmNoL3RpbGUvbW0vaG9tZWNhY2hlLmMKKysrIGIvYXJjaC90aWxlL21tL2hvbWVjYWNoZS5jCkBAIC00NDksOSArNDQ5LDEyIEBACiAJVk1fQlVHX09OKCF2aXJ0X2FkZHJfdmFsaWQoKHZvaWQgKilhZGRyKSk7CiAJcGFnZSA9IHZpcnRfdG9fcGFnZSgodm9pZCAqKWFkZHIpOwogCWlmIChwdXRfcGFnZV90ZXN0emVybyhwYWdlKSkgewotCQlpbnQgcGFnZXMgPSAoMSA8PCBvcmRlcik7CiAJCWhvbWVjYWNoZV9jaGFuZ2VfcGFnZV9ob21lKHBhZ2UsIG9yZGVyLCBpbml0aWFsX3BhZ2VfaG9tZSgpKTsKLQkJd2hpbGUgKHBhZ2VzLS0pCi0JCQlfX2ZyZWVfcGFnZShwYWdlKyspOworCQlpZiAob3JkZXIgPT0gMCkgeworCQkJZnJlZV9ob3RfY29sZF9wYWdlKHBhZ2UsIDApOworCQl9IGVsc2UgeworCQkJaW5pdF9wYWdlX2NvdW50KHBhZ2UpOworCQkJX19mcmVlX3BhZ2VzKHBhZ2UsIG9yZGVyKTsKKwkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvdW0va2VybmVsL3Byb2Nlc3MuYwppbmRleCBjNTMzODM1Li42OWYyNDkwIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvcHJvY2Vzcy5jCkBAIC0yNDYsMTAgKzI0NiwxMiBAQAogCQlpZiAobmVlZF9yZXNjaGVkKCkpCiAJCQlzY2hlZHVsZSgpOwogCi0JCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soMSk7CisJCXRpY2tfbm9oel9pZGxlX2VudGVyKCk7CisJCXJjdV9pZGxlX2VudGVyKCk7CiAJCW5zZWNzID0gZGlzYWJsZV90aW1lcigpOwogCQlpZGxlX3NsZWVwKG5zZWNzKTsKLQkJdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljaygpOworCQlyY3VfaWRsZV9leGl0KCk7CisJCXRpY2tfbm9oel9pZGxlX2V4aXQoKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvdW0va2VybmVsL3RpbWUuYyBiL2FyY2gvdW0va2VybmVsL3RpbWUuYwppbmRleCBhMDhkOWZhLi44MmE2ZTIyIDEwMDY0NAotLS0gYS9hcmNoL3VtL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC91bS9rZXJuZWwvdGltZS5jCkBAIC03NSw4ICs3NSw2IEBACiAJLnJhdGluZwkJPSAzMDAsCiAJLnJlYWQJCT0gaXRpbWVyX3JlYWQsCiAJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksCi0JLm11bHQJCT0gMTAwMCwKLQkuc2hpZnQJCT0gMCwKIAkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCkBAIC05NCw5ICs5Miw5IEBACiAJCWNsb2NrZXZlbnRfZGVsdGEybnMoNjAgKiBIWiwgJml0aW1lcl9jbG9ja2V2ZW50KTsKIAlpdGltZXJfY2xvY2tldmVudC5taW5fZGVsdGFfbnMgPQogCQljbG9ja2V2ZW50X2RlbHRhMm5zKDEsICZpdGltZXJfY2xvY2tldmVudCk7Ci0JZXJyID0gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJml0aW1lcl9jbG9ja3NvdXJjZSk7CisJZXJyID0gY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHooJml0aW1lcl9jbG9ja3NvdXJjZSwgVVNFQ19QRVJfU0VDKTsKIAlpZiAoZXJyKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiY2xvY2tzb3VyY2VfcmVnaXN0ZXIgcmV0dXJuZWQgJWRcbiIsIGVycik7CisJCXByaW50ayhLRVJOX0VSUiAiY2xvY2tzb3VyY2VfcmVnaXN0ZXJfaHogcmV0dXJuZWQgJWRcbiIsIGVycik7CiAJCXJldHVybjsKIAl9CiAJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKCZpdGltZXJfY2xvY2tldmVudCk7CmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC91bmljb3JlMzIva2VybmVsL3Byb2Nlc3MuYwppbmRleCBiYTQwMWRmLi41MmVkYzJiIDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvcHJvY2Vzcy5jCisrKyBiL2FyY2gvdW5pY29yZTMyL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTU1LDcgKzU1LDggQEAKIHsKIAkvKiBlbmRsZXNzIGlkbGUgbG9vcCB3aXRoIG5vIHByaW9yaXR5IGF0IGFsbCAqLwogCXdoaWxlICgxKSB7Ci0JCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soMSk7CisJCXRpY2tfbm9oel9pZGxlX2VudGVyKCk7CisJCXJjdV9pZGxlX2VudGVyKCk7CiAJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKIAkJCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJCQlzdG9wX2NyaXRpY2FsX3RpbWluZ3MoKTsKQEAgLTYzLDcgKzY0LDggQEAKIAkJCWxvY2FsX2lycV9lbmFibGUoKTsKIAkJCXN0YXJ0X2NyaXRpY2FsX3RpbWluZ3MoKTsKIAkJfQotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCXJjdV9pZGxlX2V4aXQoKTsKKwkJdGlja19ub2h6X2lkbGVfZXhpdCgpOwogCQlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CiAJCXNjaGVkdWxlKCk7CiAJCXByZWVtcHRfZGlzYWJsZSgpOwpkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIva2VybmVsL3NldHVwLmMgYi9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvc2V0dXAuYwppbmRleCA0NzFiNmJjLi42NzNkN2E4IDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvc2V0dXAuYworKysgYi9hcmNoL3VuaWNvcmUzMi9rZXJuZWwvc2V0dXAuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CisjaW5jbHVkZSA8YXNtL21lbWJsb2NrLmg+CiAKICNpbmNsdWRlICJzZXR1cC5oIgogCmRpZmYgLS1naXQgYS9hcmNoL3VuaWNvcmUzMi9tbS9pbml0LmMgYi9hcmNoL3VuaWNvcmUzMi9tbS9pbml0LmMKaW5kZXggM2IzNzljZC4uZGUxODZiZCAxMDA2NDQKLS0tIGEvYXJjaC91bmljb3JlMzIvbW0vaW5pdC5jCisrKyBiL2FyY2gvdW5pY29yZTMyL21tL2luaXQuYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vbWVtYmxvY2suaD4KICNpbmNsdWRlIDxtYWNoL21hcC5oPgogCiAjaW5jbHVkZSAibW0uaCIKQEAgLTI0NSw3ICsyNDYsNiBAQAogCXNvcnQoJm1lbWluZm8uYmFuaywgbWVtaW5mby5ucl9iYW5rcywgc2l6ZW9mKG1lbWluZm8uYmFua1swXSksCiAJCW1lbWluZm9fY21wLCBOVUxMKTsKIAotCW1lbWJsb2NrX2luaXQoKTsKIAlmb3IgKGkgPSAwOyBpIDwgbWktPm5yX2JhbmtzOyBpKyspCiAJCW1lbWJsb2NrX2FkZChtaS0+YmFua1tpXS5zdGFydCwgbWktPmJhbmtbaV0uc2l6ZSk7CiAKQEAgLTI2NCw3ICsyNjQsNyBAQAogCiAJdWMzMl9tbV9tZW1ibG9ja19yZXNlcnZlKCk7CiAKLQltZW1ibG9ja19hbmFseXplKCk7CisJbWVtYmxvY2tfYWxsb3dfcmVzaXplKCk7CiAJbWVtYmxvY2tfZHVtcF9hbGwoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC91bmljb3JlMzIvbW0vbW11LmMgYi9hcmNoL3VuaWNvcmUzMi9tbS9tbXUuYwppbmRleCAzZTVjM2U1Li40M2MyMGI0IDEwMDY0NAotLS0gYS9hcmNoL3VuaWNvcmUzMi9tbS9tbXUuYworKysgYi9hcmNoL3VuaWNvcmUzMi9tbS9tbXUuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgogI2luY2x1ZGUgPGFzbS9zaXplcy5oPgogI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNsdWRlIDxhc20vbWVtYmxvY2suaD4KIAogI2luY2x1ZGUgPG1hY2gvbWFwLmg+CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tjb25maWcgYi9hcmNoL3g4Ni9LY29uZmlnCmluZGV4IGNiOWExMDQuLjU3MzFlYjcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L0tjb25maWcKKysrIGIvYXJjaC94ODYvS2NvbmZpZwpAQCAtMjYsNiArMjYsOCBAQAogCXNlbGVjdCBIQVZFX0lPUkVNQVBfUFJPVAogCXNlbGVjdCBIQVZFX0tQUk9CRVMKIAlzZWxlY3QgSEFWRV9NRU1CTE9DSworCXNlbGVjdCBIQVZFX01FTUJMT0NLX05PREVfTUFQCisJc2VsZWN0IEFSQ0hfRElTQ0FSRF9NRU1CTE9DSwogCXNlbGVjdCBBUkNIX1dBTlRfT1BUSU9OQUxfR1BJT0xJQgogCXNlbGVjdCBBUkNIX1dBTlRfRlJBTUVfUE9JTlRFUlMKIAlzZWxlY3QgSEFWRV9ETUFfQVRUUlMKQEAgLTIwNCw5ICsyMDYsNiBAQAogCWJvb2wKIAlkZWZhdWx0IFg4Nl82NAogCi1jb25maWcgQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKLQlkZWZfYm9vbCB5Ci0KIGNvbmZpZyBBVURJVF9BUkNICiAJYm9vbAogCWRlZmF1bHQgWDg2XzY0CkBAIC0zNDMsNiArMzQyLDcgQEAKIAogCSAgSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiB0aGVuIHlvdSdsbCBiZSBhYmxlIHRvIHNlbGVjdCBzdXBwb3J0CiAJICBmb3IgdGhlIGZvbGxvd2luZyAobm9uLVBDKSA2NCBiaXQgeDg2IHBsYXRmb3JtczoKKwkJTnVtYXNjYWxlIE51bWFDaGlwCiAJCVNjYWxlTVAgdlNNUAogCQlTR0kgVWx0cmF2aW9sZXQKIApAQCAtMzUxLDYgKzM1MSwxOCBAQAogZW5kaWYKICMgVGhpcyBpcyBhbiBhbHBoYWJldGljYWxseSBzb3J0ZWQgbGlzdCBvZiA2NCBiaXQgZXh0ZW5kZWQgcGxhdGZvcm1zCiAjIFBsZWFzZSBtYWludGFpbiB0aGUgYWxwaGFiZXRpYyBvcmRlciBpZiBhbmQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zCitjb25maWcgWDg2X05VTUFDSElQCisJYm9vbCAiTnVtYXNjYWxlIE51bWFDaGlwIgorCWRlcGVuZHMgb24gWDg2XzY0CisJZGVwZW5kcyBvbiBYODZfRVhURU5ERURfUExBVEZPUk0KKwlkZXBlbmRzIG9uIE5VTUEKKwlkZXBlbmRzIG9uIFNNUAorCWRlcGVuZHMgb24gWDg2X1gyQVBJQworCWRlcGVuZHMgb24gIUVEQUNfQU1ENjQKKwktLS1oZWxwLS0tCisJICBBZGRzIHN1cHBvcnQgZm9yIE51bWFzY2FsZSBOdW1hQ2hpcCBsYXJnZS1TTVAgc3lzdGVtcy4gTmVlZGVkIHRvCisJICBlbmFibGUgbW9yZSB0aGFuIH4xNjggY29yZXMuCisJICBJZiB5b3UgZG9uJ3QgaGF2ZSBvbmUgb2YgdGhlc2UsIHlvdSBzaG91bGQgc2F5IE4gaGVyZS4KIAogY29uZmlnIFg4Nl9WU01QCiAJYm9vbCAiU2NhbGVNUCB2U01QIgpAQCAtMzkwLDcgKzQwMiw3IEBACiAJICBUaGlzIG9wdGlvbiBjb21waWxlcyBpbiBzdXBwb3J0IGZvciB0aGUgQ0U0MTAwIFNPQyBmb3Igc2V0dG9wCiAJICBib3hlcyBhbmQgbWVkaWEgZGV2aWNlcy4KIAotY29uZmlnIFg4Nl9JTlRFTF9NSUQKK2NvbmZpZyBYODZfV0FOVF9JTlRFTF9NSUQKIAlib29sICJJbnRlbCBNSUQgcGxhdGZvcm0gc3VwcG9ydCIKIAlkZXBlbmRzIG9uIFg4Nl8zMgogCWRlcGVuZHMgb24gWDg2X0VYVEVOREVEX1BMQVRGT1JNCkBAIC0zOTksNyArNDExLDEwIEBACiAJICBzeXN0ZW1zIHdoaWNoIGRvIG5vdCBoYXZlIHRoZSBQQ0kgbGVnYWN5IGludGVyZmFjZXMgKE1vb3Jlc3Rvd24sCiAJICBNZWRmaWVsZCkuIElmIHlvdSBhcmUgYnVpbGRpbmcgZm9yIGEgUEMgY2xhc3Mgc3lzdGVtIHNheSBOIGhlcmUuCiAKLWlmIFg4Nl9JTlRFTF9NSUQKK2lmIFg4Nl9XQU5UX0lOVEVMX01JRAorCitjb25maWcgWDg2X0lOVEVMX01JRAorCWJvb2wKIAogY29uZmlnIFg4Nl9NUlNUCiAgICAgICAgYm9vbCAiTW9vcmVzdG93biBNSUQgcGxhdGZvcm0iCkBAIC00MTEsNiArNDI2LDcgQEAKIAlzZWxlY3QgU1BJCiAJc2VsZWN0IElOVEVMX1NDVV9JUEMKIAlzZWxlY3QgWDg2X1BMQVRGT1JNX0RFVklDRVMKKwlzZWxlY3QgWDg2X0lOVEVMX01JRAogCS0tLWhlbHAtLS0KIAkgIE1vb3Jlc3Rvd24gaXMgSW50ZWwncyBMb3cgUG93ZXIgSW50ZWwgQXJjaGl0ZWN0dXJlIChMUElBKSBiYXNlZCBNb2JsaW4KIAkgIEludGVybmV0IERldmljZShNSUQpIHBsYXRmb3JtLiBNb29yZXN0b3duIGNvbnNpc3RzIG9mIHR3byBjaGlwczoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMgYi9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TCmluZGV4IGE2MjUzZWMuLjNlMjc0NTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKKysrIGIvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJQ0ZJX1JFTF9PRkZTRVQgcnNwLDAKIAlwdXNoZnFfY2ZpCiAJLypDRklfUkVMX09GRlNFVCByZmxhZ3MsMCovCi0JbW92bAk4KjMtVEhSRUFEX1NJWkUrVElfc3lzZW50ZXJfcmV0dXJuKCVyc3ApLCAlcjEwZAorCW1vdmwJVElfc3lzZW50ZXJfcmV0dXJuK1RIUkVBRF9JTkZPKCVyc3AsMyo4LUtFUk5FTF9TVEFDS19PRkZTRVQpLCVyMTBkCiAJQ0ZJX1JFR0lTVEVSIHJpcCxyMTAKIAlwdXNocV9jZmkgJF9fVVNFUjMyX0NTCiAJLypDRklfUkVMX09GRlNFVCBjcywwKi8KQEAgLTE1MCw5ICsxNTAsOCBAQAogIAkuc2VjdGlvbiBfX2V4X3RhYmxlLCJhIgogIAkucXVhZCAxYixpYTMyX2JhZGFyZwogIAkucHJldmlvdXMJCi0JR0VUX1RIUkVBRF9JTkZPKCVyMTApCi0Jb3JsICAgICRUU19DT01QQVQsVElfc3RhdHVzKCVyMTApCi0JdGVzdGwgICRfVElGX1dPUktfU1lTQ0FMTF9FTlRSWSxUSV9mbGFncyglcjEwKQorCW9ybCAgICAgJFRTX0NPTVBBVCxUSV9zdGF0dXMrVEhSRUFEX0lORk8oJXJzcCxSSVAtQVJHT0ZGU0VUKQorCXRlc3RsICAgJF9USUZfV09SS19TWVNDQUxMX0VOVFJZLFRJX2ZsYWdzK1RIUkVBRF9JTkZPKCVyc3AsUklQLUFSR09GRlNFVCkKIAlDRklfUkVNRU1CRVJfU1RBVEUKIAlqbnogIHN5c2VudGVyX3RyYWNlc3lzCiAJY21wcQkkKElBMzJfTlJfc3lzY2FsbHMtMSksJXJheApAQCAtMTYyLDEzICsxNjEsMTIgQEAKIHN5c2VudGVyX2Rpc3BhdGNoOgogCWNhbGwJKmlhMzJfc3lzX2NhbGxfdGFibGUoLCVyYXgsOCkKIAltb3ZxCSVyYXgsUkFYLUFSR09GRlNFVCglcnNwKQotCUdFVF9USFJFQURfSU5GTyglcjEwKQogCURJU0FCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCiAJVFJBQ0VfSVJRU19PRkYKLQl0ZXN0bAkkX1RJRl9BTExXT1JLX01BU0ssVElfZmxhZ3MoJXIxMCkKKwl0ZXN0bAkkX1RJRl9BTExXT1JLX01BU0ssVElfZmxhZ3MrVEhSRUFEX0lORk8oJXJzcCxSSVAtQVJHT0ZGU0VUKQogCWpueglzeXNleGl0X2F1ZGl0CiBzeXNleGl0X2Zyb21fc3lzX2NhbGw6Ci0JYW5kbCAgICAkflRTX0NPTVBBVCxUSV9zdGF0dXMoJXIxMCkKKwlhbmRsICAgICR+VFNfQ09NUEFULFRJX3N0YXR1cytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCiAJLyogY2xlYXIgSUYsIHRoYXQgcG9wZnEgZG9lc24ndCBlbmFibGUgaW50ZXJydXB0cyBlYXJseSAqLwogCWFuZGwgICR+MHgyMDAsRUZMQUdTLVIxMSglcnNwKSAKIAltb3ZsCVJJUC1SMTEoJXJzcCksJWVkeAkJLyogVXNlciAlZWlwICovCkBAIC0yMDUsNyArMjAzLDcgQEAKIAkuZW5kbQogCiAJLm1hY3JvIGF1ZGl0c3lzX2V4aXQgZXhpdAotCXRlc3RsICQoX1RJRl9BTExXT1JLX01BU0sgJiB+X1RJRl9TWVNDQUxMX0FVRElUKSxUSV9mbGFncyglcjEwKQorCXRlc3RsICQoX1RJRl9BTExXT1JLX01BU0sgJiB+X1RJRl9TWVNDQUxMX0FVRElUKSxUSV9mbGFncytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCiAJam56IGlhMzJfcmV0X2Zyb21fc3lzX2NhbGwKIAlUUkFDRV9JUlFTX09OCiAJc3RpCkBAIC0yMTUsMTIgKzIxMywxMSBAQAogCW1vdnpibCAlYWwsJWVkaQkJLyogemVyby1leHRlbmQgdGhhdCBpbnRvICVlZGkgKi8KIAlpbmMgJWVkaSAvKiBmaXJzdCBhcmcsIDAtPjEoQVVESVRTQ19TVUNDRVNTKSwgMS0+MihBVURJVFNDX0ZBSUxVUkUpICovCiAJY2FsbCBhdWRpdF9zeXNjYWxsX2V4aXQKLQlHRVRfVEhSRUFEX0lORk8oJXIxMCkKIAltb3ZsIFJBWC1BUkdPRkZTRVQoJXJzcCksJWVheAkvKiByZWxvYWQgc3lzY2FsbCByZXR1cm4gdmFsdWUgKi8KIAltb3ZsICQoX1RJRl9BTExXT1JLX01BU0sgJiB+X1RJRl9TWVNDQUxMX0FVRElUKSwlZWRpCiAJY2xpCiAJVFJBQ0VfSVJRU19PRkYKLQl0ZXN0bCAlZWRpLFRJX2ZsYWdzKCVyMTApCisJdGVzdGwgJWVkaSxUSV9mbGFncytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCiAJanogXGV4aXQKIAlDTEVBUl9SUkVHUyAtQVJHT0ZGU0VUCiAJam1wIGludF93aXRoX2NoZWNrCkBAIC0yMzgsNyArMjM1LDcgQEAKIAogc3lzZW50ZXJfdHJhY2VzeXM6CiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAotCXRlc3RsCSQoX1RJRl9XT1JLX1NZU0NBTExfRU5UUlkgJiB+X1RJRl9TWVNDQUxMX0FVRElUKSxUSV9mbGFncyglcjEwKQorCXRlc3RsCSQoX1RJRl9XT1JLX1NZU0NBTExfRU5UUlkgJiB+X1RJRl9TWVNDQUxMX0FVRElUKSxUSV9mbGFncytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCiAJanoJc3lzZW50ZXJfYXVkaXRzeXMKICNlbmRpZgogCVNBVkVfUkVTVApAQCAtMzA5LDkgKzMwNiw4IEBACiAJLnNlY3Rpb24gX19leF90YWJsZSwiYSIKIAkucXVhZCAxYixpYTMyX2JhZGFyZwogCS5wcmV2aW91cwkKLQlHRVRfVEhSRUFEX0lORk8oJXIxMCkKLQlvcmwgICAkVFNfQ09NUEFULFRJX3N0YXR1cyglcjEwKQotCXRlc3RsICRfVElGX1dPUktfU1lTQ0FMTF9FTlRSWSxUSV9mbGFncyglcjEwKQorCW9ybCAgICAgJFRTX0NPTVBBVCxUSV9zdGF0dXMrVEhSRUFEX0lORk8oJXJzcCxSSVAtQVJHT0ZGU0VUKQorCXRlc3RsICAgJF9USUZfV09SS19TWVNDQUxMX0VOVFJZLFRJX2ZsYWdzK1RIUkVBRF9JTkZPKCVyc3AsUklQLUFSR09GRlNFVCkKIAlDRklfUkVNRU1CRVJfU1RBVEUKIAlqbnogICBjc3Rhcl90cmFjZXN5cwogCWNtcHEgJElBMzJfTlJfc3lzY2FsbHMtMSwlcmF4CkBAIC0zMjEsMTMgKzMxNywxMiBAQAogY3N0YXJfZGlzcGF0Y2g6CiAJY2FsbCAqaWEzMl9zeXNfY2FsbF90YWJsZSgsJXJheCw4KQogCW1vdnEgJXJheCxSQVgtQVJHT0ZGU0VUKCVyc3ApCi0JR0VUX1RIUkVBRF9JTkZPKCVyMTApCiAJRElTQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKIAlUUkFDRV9JUlFTX09GRgotCXRlc3RsICRfVElGX0FMTFdPUktfTUFTSyxUSV9mbGFncyglcjEwKQorCXRlc3RsICRfVElGX0FMTFdPUktfTUFTSyxUSV9mbGFncytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCiAJam56IHN5c3JldGxfYXVkaXQKIHN5c3JldGxfZnJvbV9zeXNfY2FsbDoKLQlhbmRsICR+VFNfQ09NUEFULFRJX3N0YXR1cyglcjEwKQorCWFuZGwgJH5UU19DT01QQVQsVElfc3RhdHVzK1RIUkVBRF9JTkZPKCVyc3AsUklQLUFSR09GRlNFVCkKIAlSRVNUT1JFX0FSR1MgMCwtQVJHX1NLSVAsMCwwLDAKIAltb3ZsIFJJUC1BUkdPRkZTRVQoJXJzcCksJWVjeAogCUNGSV9SRUdJU1RFUiByaXAscmN4CkBAIC0zNTUsNyArMzUwLDcgQEAKIAogY3N0YXJfdHJhY2VzeXM6CiAjaWZkZWYgQ09ORklHX0FVRElUU1lTQ0FMTAotCXRlc3RsICQoX1RJRl9XT1JLX1NZU0NBTExfRU5UUlkgJiB+X1RJRl9TWVNDQUxMX0FVRElUKSxUSV9mbGFncyglcjEwKQorCXRlc3RsICQoX1RJRl9XT1JLX1NZU0NBTExfRU5UUlkgJiB+X1RJRl9TWVNDQUxMX0FVRElUKSxUSV9mbGFncytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCiAJanogY3N0YXJfYXVkaXRzeXMKICNlbmRpZgogCXhjaGdsICVyOWQsJWVicApAQCAtNDIwLDkgKzQxNSw4IEBACiAJLyogbm90ZSB0aGUgcmVnaXN0ZXJzIGFyZSBub3QgemVybyBleHRlbmRlZCB0byB0aGUgc2YuCiAJICAgdGhpcyBjb3VsZCBiZSBhIHByb2JsZW0uICovCiAJU0FWRV9BUkdTIDAsMSwwCi0JR0VUX1RIUkVBRF9JTkZPKCVyMTApCi0Jb3JsICAgJFRTX0NPTVBBVCxUSV9zdGF0dXMoJXIxMCkKLQl0ZXN0bCAkX1RJRl9XT1JLX1NZU0NBTExfRU5UUlksVElfZmxhZ3MoJXIxMCkKKwlvcmwgJFRTX0NPTVBBVCxUSV9zdGF0dXMrVEhSRUFEX0lORk8oJXJzcCxSSVAtQVJHT0ZGU0VUKQorCXRlc3RsICRfVElGX1dPUktfU1lTQ0FMTF9FTlRSWSxUSV9mbGFncytUSFJFQURfSU5GTyglcnNwLFJJUC1BUkdPRkZTRVQpCiAJam56IGlhMzJfdHJhY2VzeXMKIAljbXBxICQoSUEzMl9OUl9zeXNjYWxscy0xKSwlcmF4CiAJamEgaWEzMl9iYWRzeXMKQEAgLTQ1OSw4ICs0NTMsOCBAQAogCUNGSV9FTkRQUk9DCiAJCiAJLm1hY3JvIFBUUkVHU0NBTEwgbGFiZWwsIGZ1bmMsIGFyZwotCS5nbG9ibCBcbGFiZWwKLVxsYWJlbDoKKwlBTElHTgorR0xPQkFMKFxsYWJlbCkKIAlsZWFxIFxmdW5jKCVyaXApLCVyYXgKIAlsZWFxIC1BUkdPRkZTRVQrOCglcnNwKSxcYXJnCS8qIDggZm9yIHJldHVybiBhZGRyZXNzICovCiAJam1wICBpYTMyX3B0cmVnc19jb21tb24JCkBAIC00NzcsNyArNDcxLDggQEAKIAlQVFJFR1NDQUxMIHN0dWIzMl92Zm9yaywgc3lzX3Zmb3JrLCAlcmRpCiAJUFRSRUdTQ0FMTCBzdHViMzJfaW9wbCwgc3lzX2lvcGwsICVyc2kKIAotRU5UUlkoaWEzMl9wdHJlZ3NfY29tbW9uKQorCUFMSUdOCitpYTMyX3B0cmVnc19jb21tb246CiAJcG9wcSAlcjExCiAJQ0ZJX0VORFBST0MKIAlDRklfU1RBUlRQUk9DMzIJc2ltcGxlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS1hc20uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLWFzbS5oCmluZGV4IDA5MTUwOGIuLjk1MmJkMDEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLWFzbS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLWFzbS5oCkBAIC00LDEwICs0LDEwIEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAJLm1hY3JvIExPQ0tfUFJFRklYCi0xOglsb2NrCis2NzI6CWxvY2sKIAkuc2VjdGlvbiAuc21wX2xvY2tzLCJhIgogCS5iYWxpZ24gNAotCS5sb25nIDFiIC0gLgorCS5sb25nIDY3MmIgLSAuCiAJLnByZXZpb3VzCiAJLmVuZG0KICNlbHNlCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmgKaW5kZXggMWE2YzA5YS4uM2FiOWJkZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaApAQCAtMTc2LDYgKzE3Niw3IEBACiB9CiAKIGV4dGVybiBpbnQgeDJhcGljX3BoeXM7CitleHRlcm4gaW50IHgyYXBpY19wcmVlbmFibGVkOwogZXh0ZXJuIHZvaWQgY2hlY2tfeDJhcGljKHZvaWQpOwogZXh0ZXJuIHZvaWQgZW5hYmxlX3gyYXBpYyh2b2lkKTsKIGV4dGVybiB2b2lkIHgyYXBpY19pY3Jfd3JpdGUodTMyIGxvdywgdTMyIGlkKTsKQEAgLTE5OCw2ICsxOTksOSBAQAogCXgyYXBpY19waHlzID0gMTsKIH0KICNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV94MmFwaWModm9pZCkKK3sKK30KIHN0YXRpYyBpbmxpbmUgdm9pZCBjaGVja194MmFwaWModm9pZCkKIHsKIH0KQEAgLTIxMiw2ICsyMTYsNyBAQAogewogfQogCisjZGVmaW5lCW5veDJhcGljCTAKICNkZWZpbmUJeDJhcGljX3ByZWVuYWJsZWQgMAogI2RlZmluZQl4MmFwaWNfc3VwcG9ydGVkKCkJMAogI2VuZGlmCkBAIC00MTAsNiArNDE1LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisKIHN0YXRpYyBpbmxpbmUgdTMyIGFwaWNfcmVhZCh1MzIgcmVnKQogewogCXJldHVybiBhcGljLT5yZWFkKHJlZyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljX2ZsYXRfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWNfZmxhdF82NC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZDMxMjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljX2ZsYXRfNjQuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgX0FTTV9YODZfQVBJQ19GTEFUXzY0X0gKKyNkZWZpbmUgX0FTTV9YODZfQVBJQ19GTEFUXzY0X0gKKworZXh0ZXJuIHZvaWQgZmxhdF9pbml0X2FwaWNfbGRyKHZvaWQpOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpY2RlZi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpY2RlZi5oCmluZGV4IDM5MjVkODAuLjEzNGJiYTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWNkZWYuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljZGVmLmgKQEAgLTE0NCw2ICsxNDQsNyBAQAogCiAjZGVmaW5lIEFQSUNfQkFTRSAoZml4X3RvX3ZpcnQoRklYX0FQSUNfQkFTRSkpCiAjZGVmaW5lIEFQSUNfQkFTRV9NU1IJMHg4MDAKKyNkZWZpbmUgWEFQSUNfRU5BQkxFCSgxVUwgPDwgMTEpCiAjZGVmaW5lIFgyQVBJQ19FTkFCTEUJKDFVTCA8PCAxMCkKIAogI2lmZGVmIENPTkZJR19YODZfMzIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2JpdG9wcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYml0b3BzLmgKaW5kZXggMTc3NWQ2ZS4uYjk3NTk2ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYml0b3BzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYml0b3BzLmgKQEAgLTM4MCw2ICszODAsOCBAQAogCXJldHVybiB3b3JkOwogfQogCisjdW5kZWYgQUREUgorCiAjaWZkZWYgX19LRVJORUxfXwogLyoqCiAgKiBmZnMgLSBmaW5kIGZpcnN0IHNldCBiaXQgaW4gd29yZApAQCAtMzk1LDEwICszOTcsMjUgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGZmcyhpbnQgeCkKIHsKIAlpbnQgcjsKLSNpZmRlZiBDT05GSUdfWDg2X0NNT1YKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwkvKgorCSAqIEFNRDY0IHNheXMgQlNGTCB3b24ndCBjbG9iYmVyIHRoZSBkZXN0IHJlZyBpZiB4PT0wOyBJbnRlbDY0IHNheXMgdGhlCisJICogZGVzdCByZWcgaXMgdW5kZWZpbmVkIGlmIHg9PTAsIGJ1dCB0aGVpciBDUFUgYXJjaGl0ZWN0IHNheXMgaXRzCisJICogdmFsdWUgaXMgd3JpdHRlbiB0byBzZXQgaXQgdG8gdGhlIHNhbWUgYXMgYmVmb3JlLCBleGNlcHQgdGhhdCB0aGUKKwkgKiB0b3AgMzIgYml0cyB3aWxsIGJlIGNsZWFyZWQuCisJICoKKwkgKiBXZSBjYW5ub3QgZG8gdGhpcyBvbiAzMiBiaXRzIGJlY2F1c2UgYXQgdGhlIHZlcnkgbGVhc3Qgc29tZQorCSAqIDQ4NiBDUFVzIGRpZCBub3QgYmVoYXZlIHRoaXMgd2F5LgorCSAqLworCWxvbmcgdG1wID0gLTE7CisJYXNtKCJic2ZsICUxLCUwIgorCSAgICA6ICI9ciIgKHIpCisJICAgIDogInJtIiAoeCksICIwIiAodG1wKSk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19YODZfQ01PVikKIAlhc20oImJzZmwgJTEsJTBcblx0IgogCSAgICAiY21vdnpsICUyLCUwIgotCSAgICA6ICI9ciIgKHIpIDogInJtIiAoeCksICJyIiAoLTEpKTsKKwkgICAgOiAiPSZyIiAocikgOiAicm0iICh4KSwgInIiICgtMSkpOwogI2Vsc2UKIAlhc20oImJzZmwgJTEsJTBcblx0IgogCSAgICAiam56IDFmXG5cdCIKQEAgLTQyMiw3ICs0MzksMjIgQEAKIHN0YXRpYyBpbmxpbmUgaW50IGZscyhpbnQgeCkKIHsKIAlpbnQgcjsKLSNpZmRlZiBDT05GSUdfWDg2X0NNT1YKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwkvKgorCSAqIEFNRDY0IHNheXMgQlNSTCB3b24ndCBjbG9iYmVyIHRoZSBkZXN0IHJlZyBpZiB4PT0wOyBJbnRlbDY0IHNheXMgdGhlCisJICogZGVzdCByZWcgaXMgdW5kZWZpbmVkIGlmIHg9PTAsIGJ1dCB0aGVpciBDUFUgYXJjaGl0ZWN0IHNheXMgaXRzCisJICogdmFsdWUgaXMgd3JpdHRlbiB0byBzZXQgaXQgdG8gdGhlIHNhbWUgYXMgYmVmb3JlLCBleGNlcHQgdGhhdCB0aGUKKwkgKiB0b3AgMzIgYml0cyB3aWxsIGJlIGNsZWFyZWQuCisJICoKKwkgKiBXZSBjYW5ub3QgZG8gdGhpcyBvbiAzMiBiaXRzIGJlY2F1c2UgYXQgdGhlIHZlcnkgbGVhc3Qgc29tZQorCSAqIDQ4NiBDUFVzIGRpZCBub3QgYmVoYXZlIHRoaXMgd2F5LgorCSAqLworCWxvbmcgdG1wID0gLTE7CisJYXNtKCJic3JsICUxLCUwIgorCSAgICA6ICI9ciIgKHIpCisJICAgIDogInJtIiAoeCksICIwIiAodG1wKSk7CisjZWxpZiBkZWZpbmVkKENPTkZJR19YODZfQ01PVikKIAlhc20oImJzcmwgJTEsJTBcblx0IgogCSAgICAiY21vdnpsICUyLCUwIgogCSAgICA6ICI9JnIiIChyKSA6ICJybSIgKHgpLCAicm0iICgtMSkpOwpAQCAtNDM0LDExICs0NjYsMzUgQEAKICNlbmRpZgogCXJldHVybiByICsgMTsKIH0KLSNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKLSN1bmRlZiBBRERSCi0KLSNpZmRlZiBfX0tFUk5FTF9fCisvKioKKyAqIGZsczY0IC0gZmluZCBsYXN0IHNldCBiaXQgaW4gYSA2NC1iaXQgd29yZAorICogQHg6IHRoZSB3b3JkIHRvIHNlYXJjaAorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBpbiBhIHNpbWlsYXIgd2F5IGFzIHRoZSBsaWJjIGFuZCBjb21waWxlciBidWlsdGluCisgKiBmZnNsbCwgYnV0IHJldHVybnMgdGhlIHBvc2l0aW9uIG9mIHRoZSBtb3N0IHNpZ25pZmljYW50IHNldCBiaXQuCisgKgorICogZmxzNjQodmFsdWUpIHJldHVybnMgMCBpZiB2YWx1ZSBpcyAwIG9yIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdAorICogc2V0IGJpdCBpZiB2YWx1ZSBpcyBub256ZXJvLiBUaGUgbGFzdCAobW9zdCBzaWduaWZpY2FudCkgYml0IGlzCisgKiBhdCBwb3NpdGlvbiA2NC4KKyAqLworI2lmZGVmIENPTkZJR19YODZfNjQKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IGZsczY0KF9fdTY0IHgpCit7CisJbG9uZyBiaXRwb3MgPSAtMTsKKwkvKgorCSAqIEFNRDY0IHNheXMgQlNSUSB3b24ndCBjbG9iYmVyIHRoZSBkZXN0IHJlZyBpZiB4PT0wOyBJbnRlbDY0IHNheXMgdGhlCisJICogZGVzdCByZWcgaXMgdW5kZWZpbmVkIGlmIHg9PTAsIGJ1dCB0aGVpciBDUFUgYXJjaGl0ZWN0IHNheXMgaXRzCisJICogdmFsdWUgaXMgd3JpdHRlbiB0byBzZXQgaXQgdG8gdGhlIHNhbWUgYXMgYmVmb3JlLgorCSAqLworCWFzbSgiYnNycSAlMSwlMCIKKwkgICAgOiAiK3IiIChiaXRwb3MpCisJICAgIDogInJtIiAoeCkpOworCXJldHVybiBiaXRwb3MgKyAxOworfQorI2Vsc2UKKyNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZmxzNjQuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2ZpbmQuaD4KIApAQCAtNDUwLDEyICs1MDYsNiBAQAogCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2NvbnN0X2h3ZWlnaHQuaD4KIAotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2luY2x1ZGUgPGFzbS1nZW5lcmljL2JpdG9wcy9mbHM2NC5oPgotCi0jaWZkZWYgX19LRVJORUxfXwotCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYml0b3BzL2xlLmg+CiAKICNpbmNsdWRlIDxhc20tZ2VuZXJpYy9iaXRvcHMvZXh0Mi1hdG9taWMtc2V0Yml0Lmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnLmgKaW5kZXggNWQzYWNkZi4uMGM5ZmEyNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGcuaApAQCAtMTQsNiArMTQsOCBAQAogCV9fY29tcGlsZXRpbWVfZXJyb3IoIkJhZCBhcmd1bWVudCBzaXplIGZvciBjbXB4Y2hnIik7CiBleHRlcm4gdm9pZCBfX3hhZGRfd3Jvbmdfc2l6ZSh2b2lkKQogCV9fY29tcGlsZXRpbWVfZXJyb3IoIkJhZCBhcmd1bWVudCBzaXplIGZvciB4YWRkIik7CitleHRlcm4gdm9pZCBfX2FkZF93cm9uZ19zaXplKHZvaWQpCisJX19jb21waWxldGltZV9lcnJvcigiQmFkIGFyZ3VtZW50IHNpemUgZm9yIGFkZCIpOwogCiAvKgogICogQ29uc3RhbnRzIGZvciBvcGVyYXRpb24gc2l6ZXMuIE9uIDMyLWJpdCwgdGhlIDY0LWJpdCBzaXplIGl0IHNldCB0bwpAQCAtMzEsNjAgKzMzLDQ3IEBACiAjZGVmaW5lCV9fWDg2X0NBU0VfUQktMQkJLyogc2l6ZW9mIHdpbGwgbmV2ZXIgcmV0dXJuIC0xICovCiAjZW5kaWYKIAorLyogCisgKiBBbiBleGNoYW5nZS10eXBlIG9wZXJhdGlvbiwgd2hpY2ggdGFrZXMgYSB2YWx1ZSBhbmQgYSBwb2ludGVyLCBhbmQKKyAqIHJldHVybnMgYSB0aGUgb2xkIHZhbHVlLgorICovCisjZGVmaW5lIF9feGNoZ19vcChwdHIsIGFyZywgb3AsIGxvY2spCQkJCQlcCisJKHsJCQkJCQkJCVwKKwkgICAgICAgIF9fdHlwZW9mX18gKCoocHRyKSkgX19yZXQgPSAoYXJnKTsJCQlcCisJCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJXAorCQljYXNlIF9fWDg2X0NBU0VfQjoJCQkJCVwKKwkJCWFzbSB2b2xhdGlsZSAobG9jayAjb3AgImIgJWIwLCAlMVxuIgkJXAorCQkJCSAgICAgIDogIityIiAoX19yZXQpLCAiK20iICgqKHB0cikpCVwKKwkJCQkgICAgICA6IDogIm1lbW9yeSIsICJjYyIpOwkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQljYXNlIF9fWDg2X0NBU0VfVzoJCQkJCVwKKwkJCWFzbSB2b2xhdGlsZSAobG9jayAjb3AgIncgJXcwLCAlMVxuIgkJXAorCQkJCSAgICAgIDogIityIiAoX19yZXQpLCAiK20iICgqKHB0cikpCVwKKwkJCQkgICAgICA6IDogIm1lbW9yeSIsICJjYyIpOwkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQljYXNlIF9fWDg2X0NBU0VfTDoJCQkJCVwKKwkJCWFzbSB2b2xhdGlsZSAobG9jayAjb3AgImwgJTAsICUxXG4iCQlcCisJCQkJICAgICAgOiAiK3IiIChfX3JldCksICIrbSIgKCoocHRyKSkJXAorCQkJCSAgICAgIDogOiAibWVtb3J5IiwgImNjIik7CQlcCisJCQlicmVhazsJCQkJCQlcCisJCWNhc2UgX19YODZfQ0FTRV9ROgkJCQkJXAorCQkJYXNtIHZvbGF0aWxlIChsb2NrICNvcCAicSAlcTAsICUxXG4iCQlcCisJCQkJICAgICAgOiAiK3IiIChfX3JldCksICIrbSIgKCoocHRyKSkJXAorCQkJCSAgICAgIDogOiAibWVtb3J5IiwgImNjIik7CQlcCisJCQlicmVhazsJCQkJCQlcCisJCWRlZmF1bHQ6CQkJCQkJXAorCQkJX18gIyMgb3AgIyMgX3dyb25nX3NpemUoKTsJCQlcCisJCX0JCQkJCQkJXAorCQlfX3JldDsJCQkJCQkJXAorCX0pCisKIC8qCiAgKiBOb3RlOiBubyAibG9jayIgcHJlZml4IGV2ZW4gb24gU01QOiB4Y2hnIGFsd2F5cyBpbXBsaWVzIGxvY2sgYW55d2F5LgogICogU2luY2UgdGhpcyBpcyBnZW5lcmFsbHkgdXNlZCB0byBwcm90ZWN0IG90aGVyIG1lbW9yeSBpbmZvcm1hdGlvbiwgd2UKICAqIHVzZSAiYXNtIHZvbGF0aWxlIiBhbmQgIm1lbW9yeSIgY2xvYmJlcnMgdG8gcHJldmVudCBnY2MgZnJvbSBtb3ZpbmcKICAqIGluZm9ybWF0aW9uIGFyb3VuZC4KICAqLwotI2RlZmluZSBfX3hjaGcoeCwgcHRyLCBzaXplKQkJCQkJCVwKLSh7CQkJCQkJCQkJXAotCV9fdHlwZW9mKCoocHRyKSkgX194ID0gKHgpOwkJCQkJXAotCXN3aXRjaCAoc2l6ZSkgewkJCQkJCQlcCi0JY2FzZSBfX1g4Nl9DQVNFX0I6CQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJdm9sYXRpbGUgdTggKl9fcHRyID0gKHZvbGF0aWxlIHU4ICopKHB0cik7CQlcCi0JCWFzbSB2b2xhdGlsZSgieGNoZ2IgJTAsJTEiCQkJCVwKLQkJCSAgICAgOiAiPXEiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCi0JCQkgICAgIDogIjAiIChfX3gpCQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JY2FzZSBfX1g4Nl9DQVNFX1c6CQkJCQkJXAotCXsJCQkJCQkJCVwKLQkJdm9sYXRpbGUgdTE2ICpfX3B0ciA9ICh2b2xhdGlsZSB1MTYgKikocHRyKTsJCVwKLQkJYXNtIHZvbGF0aWxlKCJ4Y2hndyAlMCwlMSIJCQkJXAotCQkJICAgICA6ICI9ciIgKF9feCksICIrbSIgKCpfX3B0cikJCVwKLQkJCSAgICAgOiAiMCIgKF9feCkJCQkJXAotCQkJICAgICA6ICJtZW1vcnkiKTsJCQkJXAotCQlicmVhazsJCQkJCQkJXAotCX0JCQkJCQkJCVwKLQljYXNlIF9fWDg2X0NBU0VfTDoJCQkJCQlcCi0JewkJCQkJCQkJXAotCQl2b2xhdGlsZSB1MzIgKl9fcHRyID0gKHZvbGF0aWxlIHUzMiAqKShwdHIpOwkJXAotCQlhc20gdm9sYXRpbGUoInhjaGdsICUwLCUxIgkJCQlcCi0JCQkgICAgIDogIj1yIiAoX194KSwgIittIiAoKl9fcHRyKQkJXAotCQkJICAgICA6ICIwIiAoX194KQkJCQlcCi0JCQkgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JCWJyZWFrOwkJCQkJCQlcCi0JfQkJCQkJCQkJXAotCWNhc2UgX19YODZfQ0FTRV9ROgkJCQkJCVwKLQl7CQkJCQkJCQlcCi0JCXZvbGF0aWxlIHU2NCAqX19wdHIgPSAodm9sYXRpbGUgdTY0ICopKHB0cik7CQlcCi0JCWFzbSB2b2xhdGlsZSgieGNoZ3EgJTAsJTEiCQkJCVwKLQkJCSAgICAgOiAiPXIiIChfX3gpLCAiK20iICgqX19wdHIpCQlcCi0JCQkgICAgIDogIjAiIChfX3gpCQkJCVwKLQkJCSAgICAgOiAibWVtb3J5Iik7CQkJCVwKLQkJYnJlYWs7CQkJCQkJCVwKLQl9CQkJCQkJCQlcCi0JZGVmYXVsdDoJCQkJCQkJXAotCQlfX3hjaGdfd3Jvbmdfc2l6ZSgpOwkJCQkJXAotCX0JCQkJCQkJCVwKLQlfX3g7CQkJCQkJCQlcCi19KQotCi0jZGVmaW5lIHhjaGcocHRyLCB2KQkJCQkJCQlcCi0JX194Y2hnKCh2KSwgKHB0ciksIHNpemVvZigqcHRyKSkKKyNkZWZpbmUgeGNoZyhwdHIsIHYpCV9feGNoZ19vcCgocHRyKSwgKHYpLCB4Y2hnLCAiIikKIAogLyoKICAqIEF0b21pYyBjb21wYXJlIGFuZCBleGNoYW5nZS4gIENvbXBhcmUgT0xEIHdpdGggTUVNLCBpZiBpZGVudGljYWwsCkBAIC0xNjUsMzYgKzE1NCw2IEBACiAJX19jbXB4Y2hnX2xvY2FsKChwdHIpLCAob2xkKSwgKG5ldyksIHNpemVvZigqcHRyKSkKICNlbmRpZgogCi0jZGVmaW5lIF9feGFkZChwdHIsIGluYywgbG9jaykJCQkJCQlcCi0JKHsJCQkJCQkJCVwKLQkgICAgICAgIF9fdHlwZW9mX18gKCoocHRyKSkgX19yZXQgPSAoaW5jKTsJCQlcCi0JCXN3aXRjaCAoc2l6ZW9mKCoocHRyKSkpIHsJCQkJXAotCQljYXNlIF9fWDg2X0NBU0VfQjoJCQkJCVwKLQkJCWFzbSB2b2xhdGlsZSAobG9jayAieGFkZGIgJWIwLCAlMVxuIgkJXAotCQkJCSAgICAgIDogIityIiAoX19yZXQpLCAiK20iICgqKHB0cikpCVwKLQkJCQkgICAgICA6IDogIm1lbW9yeSIsICJjYyIpOwkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIF9fWDg2X0NBU0VfVzoJCQkJCVwKLQkJCWFzbSB2b2xhdGlsZSAobG9jayAieGFkZHcgJXcwLCAlMVxuIgkJXAotCQkJCSAgICAgIDogIityIiAoX19yZXQpLCAiK20iICgqKHB0cikpCVwKLQkJCQkgICAgICA6IDogIm1lbW9yeSIsICJjYyIpOwkJXAotCQkJYnJlYWs7CQkJCQkJXAotCQljYXNlIF9fWDg2X0NBU0VfTDoJCQkJCVwKLQkJCWFzbSB2b2xhdGlsZSAobG9jayAieGFkZGwgJTAsICUxXG4iCQlcCi0JCQkJICAgICAgOiAiK3IiIChfX3JldCksICIrbSIgKCoocHRyKSkJXAotCQkJCSAgICAgIDogOiAibWVtb3J5IiwgImNjIik7CQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWNhc2UgX19YODZfQ0FTRV9ROgkJCQkJXAotCQkJYXNtIHZvbGF0aWxlIChsb2NrICJ4YWRkcSAlcTAsICUxXG4iCQlcCi0JCQkJICAgICAgOiAiK3IiIChfX3JldCksICIrbSIgKCoocHRyKSkJXAotCQkJCSAgICAgIDogOiAibWVtb3J5IiwgImNjIik7CQlcCi0JCQlicmVhazsJCQkJCQlcCi0JCWRlZmF1bHQ6CQkJCQkJXAotCQkJX194YWRkX3dyb25nX3NpemUoKTsJCQkJXAotCQl9CQkJCQkJCVwKLQkJX19yZXQ7CQkJCQkJCVwKLQl9KQotCiAvKgogICogeGFkZCgpIGFkZHMgImluYyIgdG8gIipwdHIiIGFuZCBhdG9taWNhbGx5IHJldHVybnMgdGhlIHByZXZpb3VzCiAgKiB2YWx1ZSBvZiAiKnB0ciIuCkBAIC0yMDMsOCArMTYyLDcyIEBACiAgKiB4YWRkX3N5bmMoKSBpcyBhbHdheXMgbG9ja2VkCiAgKiB4YWRkX2xvY2FsKCkgaXMgbmV2ZXIgbG9ja2VkCiAgKi8KKyNkZWZpbmUgX194YWRkKHB0ciwgaW5jLCBsb2NrKQlfX3hjaGdfb3AoKHB0ciksIChpbmMpLCB4YWRkLCBsb2NrKQogI2RlZmluZSB4YWRkKHB0ciwgaW5jKQkJX194YWRkKChwdHIpLCAoaW5jKSwgTE9DS19QUkVGSVgpCiAjZGVmaW5lIHhhZGRfc3luYyhwdHIsIGluYykJX194YWRkKChwdHIpLCAoaW5jKSwgImxvY2s7ICIpCiAjZGVmaW5lIHhhZGRfbG9jYWwocHRyLCBpbmMpCV9feGFkZCgocHRyKSwgKGluYyksICIiKQogCisjZGVmaW5lIF9fYWRkKHB0ciwgaW5jLCBsb2NrKQkJCQkJCVwKKwkoewkJCQkJCQkJXAorCSAgICAgICAgX190eXBlb2ZfXyAoKihwdHIpKSBfX3JldCA9IChpbmMpOwkJCVwKKwkJc3dpdGNoIChzaXplb2YoKihwdHIpKSkgewkJCQlcCisJCWNhc2UgX19YODZfQ0FTRV9COgkJCQkJXAorCQkJYXNtIHZvbGF0aWxlIChsb2NrICJhZGRiICViMSwgJTBcbiIJCVwKKwkJCQkgICAgICA6ICIrbSIgKCoocHRyKSkgOiAicmkiIChpbmMpCVwKKwkJCQkgICAgICA6ICJtZW1vcnkiLCAiY2MiKTsJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJY2FzZSBfX1g4Nl9DQVNFX1c6CQkJCQlcCisJCQlhc20gdm9sYXRpbGUgKGxvY2sgImFkZHcgJXcxLCAlMFxuIgkJXAorCQkJCSAgICAgIDogIittIiAoKihwdHIpKSA6ICJyaSIgKGluYykJXAorCQkJCSAgICAgIDogIm1lbW9yeSIsICJjYyIpOwkJXAorCQkJYnJlYWs7CQkJCQkJXAorCQljYXNlIF9fWDg2X0NBU0VfTDoJCQkJCVwKKwkJCWFzbSB2b2xhdGlsZSAobG9jayAiYWRkbCAlMSwgJTBcbiIJCVwKKwkJCQkgICAgICA6ICIrbSIgKCoocHRyKSkgOiAicmkiIChpbmMpCVwKKwkJCQkgICAgICA6ICJtZW1vcnkiLCAiY2MiKTsJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJY2FzZSBfX1g4Nl9DQVNFX1E6CQkJCQlcCisJCQlhc20gdm9sYXRpbGUgKGxvY2sgImFkZHEgJTEsICUwXG4iCQlcCisJCQkJICAgICAgOiAiK20iICgqKHB0cikpIDogInJpIiAoaW5jKQlcCisJCQkJICAgICAgOiAibWVtb3J5IiwgImNjIik7CQlcCisJCQlicmVhazsJCQkJCQlcCisJCWRlZmF1bHQ6CQkJCQkJXAorCQkJX19hZGRfd3Jvbmdfc2l6ZSgpOwkJCQlcCisJCX0JCQkJCQkJXAorCQlfX3JldDsJCQkJCQkJXAorCX0pCisKKy8qCisgKiBhZGRfKigpIGFkZHMgImluYyIgdG8gIipwdHIiCisgKgorICogX19hZGQoKSB0YWtlcyBhIGxvY2sgcHJlZml4CisgKiBhZGRfc21wKCkgaXMgbG9ja2VkIHdoZW4gbXVsdGlwbGUgQ1BVcyBhcmUgb25saW5lCisgKiBhZGRfc3luYygpIGlzIGFsd2F5cyBsb2NrZWQKKyAqLworI2RlZmluZSBhZGRfc21wKHB0ciwgaW5jKQlfX2FkZCgocHRyKSwgKGluYyksIExPQ0tfUFJFRklYKQorI2RlZmluZSBhZGRfc3luYyhwdHIsIGluYykJX19hZGQoKHB0ciksIChpbmMpLCAibG9jazsgIikKKworI2RlZmluZSBfX2NtcHhjaGdfZG91YmxlKHBmeCwgcDEsIHAyLCBvMSwgbzIsIG4xLCBuMikJCQlcCisoewkJCQkJCQkJCVwKKwlib29sIF9fcmV0OwkJCQkJCQlcCisJX190eXBlb2ZfXygqKHAxKSkgX19vbGQxID0gKG8xKSwgX19uZXcxID0gKG4xKTsJCQlcCisJX190eXBlb2ZfXygqKHAyKSkgX19vbGQyID0gKG8yKSwgX19uZXcyID0gKG4yKTsJCQlcCisJQlVJTERfQlVHX09OKHNpemVvZigqKHAxKSkgIT0gc2l6ZW9mKGxvbmcpKTsJCQlcCisJQlVJTERfQlVHX09OKHNpemVvZigqKHAyKSkgIT0gc2l6ZW9mKGxvbmcpKTsJCQlcCisJVk1fQlVHX09OKCh1bnNpZ25lZCBsb25nKShwMSkgJSAoMiAqIHNpemVvZihsb25nKSkpOwkJXAorCVZNX0JVR19PTigodW5zaWduZWQgbG9uZykoKHAxKSArIDEpICE9ICh1bnNpZ25lZCBsb25nKShwMikpOwlcCisJYXNtIHZvbGF0aWxlKHBmeCAiY21weGNoZyVjNGIgJTI7IHNldGUgJTAiCQkJXAorCQkgICAgIDogIj1hIiAoX19yZXQpLCAiK2QiIChfX29sZDIpLAkJCVwKKwkJICAgICAgICIrbSIgKCoocDEpKSwgIittIiAoKihwMikpCQkJXAorCQkgICAgIDogImkiICgyICogc2l6ZW9mKGxvbmcpKSwgImEiIChfX29sZDEpLAkJXAorCQkgICAgICAgImIiIChfX25ldzEpLCAiYyIgKF9fbmV3MikpOwkJCVwKKwlfX3JldDsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgY21weGNoZ19kb3VibGUocDEsIHAyLCBvMSwgbzIsIG4xLCBuMikgXAorCV9fY21weGNoZ19kb3VibGUoTE9DS19QUkVGSVgsIHAxLCBwMiwgbzEsIG8yLCBuMSwgbjIpCisKKyNkZWZpbmUgY21weGNoZ19kb3VibGVfbG9jYWwocDEsIHAyLCBvMSwgbzIsIG4xLCBuMikgXAorCV9fY21weGNoZ19kb3VibGUoLCBwMSwgcDIsIG8xLCBvMiwgbjEsIG4yKQorCiAjZW5kaWYJLyogQVNNX1g4Nl9DTVBYQ0hHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfMzIuaAppbmRleCBmYmViYjA3Li41M2Y0YjIxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ18zMi5oCkBAIC0xNjYsNTIgKzE2Niw2IEBACiAKICNlbmRpZgogCi0jZGVmaW5lIGNtcHhjaGc4YihwdHIsIG8xLCBvMiwgbjEsIG4yKQkJCQlcCi0oewkJCQkJCQkJXAotCWNoYXIgX19yZXQ7CQkJCQkJXAotCV9fdHlwZW9mX18obzIpIF9fZHVtbXk7CQkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9fb2xkMSA9IChvMSk7CQkJXAotCV9fdHlwZW9mX18obzIpIF9fb2xkMiA9IChvMik7CQkJCVwKLQlfX3R5cGVvZl9fKCoocHRyKSkgX19uZXcxID0gKG4xKTsJCQlcCi0JX190eXBlb2ZfXyhvMikgX19uZXcyID0gKG4yKTsJCQkJXAotCWFzbSB2b2xhdGlsZShMT0NLX1BSRUZJWCAiY21weGNoZzhiICUyOyBzZXR6ICUxIglcCi0JCSAgICAgICA6ICI9ZCIoX19kdW1teSksICI9YSIgKF9fcmV0KSwgIittIiAoKnB0cilcCi0JCSAgICAgICA6ICJhIiAoX19vbGQxKSwgImQiKF9fb2xkMiksCQlcCi0JCSAgICAgICAgICJiIiAoX19uZXcxKSwgImMiIChfX25ldzIpCQlcCi0JCSAgICAgICA6ICJtZW1vcnkiKTsJCQkJXAotCV9fcmV0OyB9KQotCi0KLSNkZWZpbmUgY21weGNoZzhiX2xvY2FsKHB0ciwgbzEsIG8yLCBuMSwgbjIpCQkJXAotKHsJCQkJCQkJCVwKLQljaGFyIF9fcmV0OwkJCQkJCVwKLQlfX3R5cGVvZl9fKG8yKSBfX2R1bW15OwkJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX29sZDEgPSAobzEpOwkJCVwKLQlfX3R5cGVvZl9fKG8yKSBfX29sZDIgPSAobzIpOwkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9fbmV3MSA9IChuMSk7CQkJXAotCV9fdHlwZW9mX18obzIpIF9fbmV3MiA9IChuMik7CQkJCVwKLQlhc20gdm9sYXRpbGUoImNtcHhjaGc4YiAlMjsgc2V0eiAlMSIJCQlcCi0JCSAgICAgICA6ICI9ZCIoX19kdW1teSksICI9YSIoX19yZXQpLCAiK20iICgqcHRyKVwKLQkJICAgICAgIDogImEiIChfX29sZCksICJkIihfX29sZDIpLAkJXAotCQkgICAgICAgICAiYiIgKF9fbmV3MSksICJjIiAoX19uZXcyKSwJCVwKLQkJICAgICAgIDogIm1lbW9yeSIpOwkJCQlcCi0JX19yZXQ7IH0pCi0KLQotI2RlZmluZSBjbXB4Y2hnX2RvdWJsZShwdHIsIG8xLCBvMiwgbjEsIG4yKQkJCQlcCi0oewkJCQkJCQkJCVwKLQlCVUlMRF9CVUdfT04oc2l6ZW9mKCoocHRyKSkgIT0gNCk7CQkJCVwKLQlWTV9CVUdfT04oKHVuc2lnbmVkIGxvbmcpKHB0cikgJSA4KTsJCQkJXAotCWNtcHhjaGc4YigocHRyKSwgKG8xKSwgKG8yKSwgKG4xKSwgKG4yKSk7CQkJXAotfSkKLQotI2RlZmluZSBjbXB4Y2hnX2RvdWJsZV9sb2NhbChwdHIsIG8xLCBvMiwgbjEsIG4yKQkJCVwKLSh7CQkJCQkJCQkJXAotICAgICAgIEJVSUxEX0JVR19PTihzaXplb2YoKihwdHIpKSAhPSA0KTsJCQkJXAotICAgICAgIFZNX0JVR19PTigodW5zaWduZWQgbG9uZykocHRyKSAlIDgpOwkJCQlcCi0gICAgICAgY21weGNoZzE2Yl9sb2NhbCgocHRyKSwgKG8xKSwgKG8yKSwgKG4xKSwgKG4yKSk7CQkJXAotfSkKLQogI2RlZmluZSBzeXN0ZW1faGFzX2NtcHhjaGdfZG91YmxlKCkgY3B1X2hhc19jeDgKIAogI2VuZGlmIC8qIF9BU01fWDg2X0NNUFhDSEdfMzJfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ182NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY21weGNoZ182NC5oCmluZGV4IDI4NWRhMDIuLjYxNGJlODcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NtcHhjaGdfNjQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jbXB4Y2hnXzY0LmgKQEAgLTIwLDQ5ICsyMCw2IEBACiAJY21weGNoZ19sb2NhbCgocHRyKSwgKG8pLCAobikpOwkJCQkJXAogfSkKIAotI2RlZmluZSBjbXB4Y2hnMTZiKHB0ciwgbzEsIG8yLCBuMSwgbjIpCQkJCVwKLSh7CQkJCQkJCQlcCi0JY2hhciBfX3JldDsJCQkJCQlcCi0JX190eXBlb2ZfXyhvMikgX19qdW5rOwkJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX29sZDEgPSAobzEpOwkJCVwKLQlfX3R5cGVvZl9fKG8yKSBfX29sZDIgPSAobzIpOwkJCQlcCi0JX190eXBlb2ZfXygqKHB0cikpIF9fbmV3MSA9IChuMSk7CQkJXAotCV9fdHlwZW9mX18obzIpIF9fbmV3MiA9IChuMik7CQkJCVwKLQlhc20gdm9sYXRpbGUoTE9DS19QUkVGSVggImNtcHhjaGcxNmIgJTI7c2V0eiAlMSIJXAotCQkgICAgICAgOiAiPWQiKF9fanVuayksICI9YSIoX19yZXQpLCAiK20iICgqcHRyKQlcCi0JCSAgICAgICA6ICJiIihfX25ldzEpLCAiYyIoX19uZXcyKSwJCVwKLQkJICAgICAgICAgImEiKF9fb2xkMSksICJkIihfX29sZDIpKTsJCVwKLQlfX3JldDsgfSkKLQotCi0jZGVmaW5lIGNtcHhjaGcxNmJfbG9jYWwocHRyLCBvMSwgbzIsIG4xLCBuMikJCQlcCi0oewkJCQkJCQkJXAotCWNoYXIgX19yZXQ7CQkJCQkJXAotCV9fdHlwZW9mX18obzIpIF9fanVuazsJCQkJCVwKLQlfX3R5cGVvZl9fKCoocHRyKSkgX19vbGQxID0gKG8xKTsJCQlcCi0JX190eXBlb2ZfXyhvMikgX19vbGQyID0gKG8yKTsJCQkJXAotCV9fdHlwZW9mX18oKihwdHIpKSBfX25ldzEgPSAobjEpOwkJCVwKLQlfX3R5cGVvZl9fKG8yKSBfX25ldzIgPSAobjIpOwkJCQlcCi0JYXNtIHZvbGF0aWxlKCJjbXB4Y2hnMTZiICUyO3NldHogJTEiCQkJXAotCQkgICAgICAgOiAiPWQiKF9fanVuayksICI9YSIoX19yZXQpLCAiK20iICgqcHRyKQlcCi0JCSAgICAgICA6ICJiIihfX25ldzEpLCAiYyIoX19uZXcyKSwJCVwKLQkJICAgICAgICAgImEiKF9fb2xkMSksICJkIihfX29sZDIpKTsJCVwKLQlfX3JldDsgfSkKLQotI2RlZmluZSBjbXB4Y2hnX2RvdWJsZShwdHIsIG8xLCBvMiwgbjEsIG4yKQkJCQlcCi0oewkJCQkJCQkJCVwKLQlCVUlMRF9CVUdfT04oc2l6ZW9mKCoocHRyKSkgIT0gOCk7CQkJCVwKLQlWTV9CVUdfT04oKHVuc2lnbmVkIGxvbmcpKHB0cikgJSAxNik7CQkJCVwKLQljbXB4Y2hnMTZiKChwdHIpLCAobzEpLCAobzIpLCAobjEpLCAobjIpKTsJCQlcCi19KQotCi0jZGVmaW5lIGNtcHhjaGdfZG91YmxlX2xvY2FsKHB0ciwgbzEsIG8yLCBuMSwgbjIpCQkJXAotKHsJCQkJCQkJCQlcCi0JQlVJTERfQlVHX09OKHNpemVvZigqKHB0cikpICE9IDgpOwkJCQlcCi0JVk1fQlVHX09OKCh1bnNpZ25lZCBsb25nKShwdHIpICUgMTYpOwkJCQlcCi0JY21weGNoZzE2Yl9sb2NhbCgocHRyKSwgKG8xKSwgKG8yKSwgKG4xKSwgKG4yKSk7CQlcCi19KQotCiAjZGVmaW5lIHN5c3RlbV9oYXNfY21weGNoZ19kb3VibGUoKSBjcHVfaGFzX2N4MTYKIAogI2VuZGlmIC8qIF9BU01fWDg2X0NNUFhDSEdfNjRfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZGl2NjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2RpdjY0LmgKaW5kZXggOWEyZDY0NC4uY2VkMjgzYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZGl2NjQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kaXY2NC5oCkBAIC00LDYgKzQsNyBAQAogI2lmZGVmIENPTkZJR19YODZfMzIKIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgogCiAvKgogICogZG9fZGl2KCkgaXMgTk9UIGEgQyBmdW5jdGlvbi4gSXQgd2FudHMgdG8gcmV0dXJuCkBAIC0yMSwxNSArMjIsMjAgQEAKICh7CQkJCQkJCQlcCiAJdW5zaWduZWQgbG9uZyBfX3VwcGVyLCBfX2xvdywgX19oaWdoLCBfX21vZCwgX19iYXNlOwlcCiAJX19iYXNlID0gKGJhc2UpOwkJCQkJXAotCWFzbSgiIjoiPWEiIChfX2xvdyksICI9ZCIgKF9faGlnaCkgOiAiQSIgKG4pKTsJCVwKLQlfX3VwcGVyID0gX19oaWdoOwkJCQkJXAotCWlmIChfX2hpZ2gpIHsJCQkJCQlcCi0JCV9fdXBwZXIgPSBfX2hpZ2ggJSAoX19iYXNlKTsJCQlcCi0JCV9faGlnaCA9IF9faGlnaCAvIChfX2Jhc2UpOwkJCVwKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoX19iYXNlKSAmJiBpc19wb3dlcl9vZl8yKF9fYmFzZSkpIHsgXAorCQlfX21vZCA9IG4gJiAoX19iYXNlIC0gMSk7CQkJXAorCQluID4+PSBpbG9nMihfX2Jhc2UpOwkJCQlcCisJfSBlbHNlIHsJCQkJCQlcCisJCWFzbSgiIiA6ICI9YSIgKF9fbG93KSwgIj1kIiAoX19oaWdoKSA6ICJBIiAobikpO1wKKwkJX191cHBlciA9IF9faGlnaDsJCQkJXAorCQlpZiAoX19oaWdoKSB7CQkJCQlcCisJCQlfX3VwcGVyID0gX19oaWdoICUgKF9fYmFzZSk7CQlcCisJCQlfX2hpZ2ggPSBfX2hpZ2ggLyAoX19iYXNlKTsJCVwKKwkJfQkJCQkJCVwKKwkJYXNtKCJkaXZsICUyIiA6ICI9YSIgKF9fbG93KSwgIj1kIiAoX19tb2QpCVwKKwkJCTogInJtIiAoX19iYXNlKSwgIjAiIChfX2xvdyksICIxIiAoX191cHBlcikpOwlcCisJCWFzbSgiIiA6ICI9QSIgKG4pIDogImEiIChfX2xvdyksICJkIiAoX19oaWdoKSk7CVwKIAl9CQkJCQkJCVwKLQlhc20oImRpdmwgJTIiOiI9YSIgKF9fbG93KSwgIj1kIiAoX19tb2QpCQlcCi0JICAgIDogInJtIiAoX19iYXNlKSwgIjAiIChfX2xvdyksICIxIiAoX191cHBlcikpOwlcCi0JYXNtKCIiOiI9QSIgKG4pIDogImEiIChfX2xvdyksICJkIiAoX19oaWdoKSk7CQlcCiAJX19tb2Q7CQkJCQkJCVwKIH0pCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2U4MjAuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2U4MjAuaAppbmRleCA5MDhiOTY5Li4zNzc4MjU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lODIwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZTgyMC5oCkBAIC0xMTcsNyArMTE3LDcgQEAKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZTgyMF9lbmRfb2ZfcmFtX3Bmbih2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGU4MjBfZW5kX29mX2xvd19yYW1fcGZuKHZvaWQpOwotZXh0ZXJuIHU2NCBlYXJseV9yZXNlcnZlX2U4MjAodTY0IHN0YXJ0dCwgdTY0IHNpemV0LCB1NjQgYWxpZ24pOworZXh0ZXJuIHU2NCBlYXJseV9yZXNlcnZlX2U4MjAodTY0IHNpemV0LCB1NjQgYWxpZ24pOwogCiB2b2lkIG1lbWJsb2NrX3g4Nl9maWxsKHZvaWQpOwogdm9pZCBtZW1ibG9ja19maW5kX2RtYV9yZXNlcnZlKHZvaWQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaGFyZGlycS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaGFyZGlycS5oCmluZGV4IDU1ZTRkZTYuLmRhMGIzY2EgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKQEAgLTExLDYgKzExLDcgQEAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAl1bnNpZ25lZCBpbnQgYXBpY190aW1lcl9pcnFzOwkvKiBhcmNoIGRlcGVuZGVudCAqLwogCXVuc2lnbmVkIGludCBpcnFfc3B1cmlvdXNfY291bnQ7CisJdW5zaWduZWQgaW50IGljcl9yZWFkX3JldHJ5X2NvdW50OwogI2VuZGlmCiAJdW5zaWduZWQgaW50IHg4Nl9wbGF0Zm9ybV9pcGlzOwkvKiBhcmNoIGRlcGVuZGVudCAqLwogCXVuc2lnbmVkIGludCBhcGljX3BlcmZfaXJxczsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2kzODcuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2kzODcuaAppbmRleCBjOWUwOWVhLi42OTE5ZTkzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pMzg3LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaTM4Ny5oCkBAIC0yMTgsNyArMjE4LDcgQEAKICNpZmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIHNhZmVfYWRkcmVzcyAoX19wZXJfY3B1X29mZnNldFswXSkKICNlbHNlCi0jZGVmaW5lIHNhZmVfYWRkcmVzcyAoa3N0YXRfY3B1KDApLmNwdXN0YXQudXNlcikKKyNkZWZpbmUgc2FmZV9hZGRyZXNzIChfX2dldF9jcHVfdmFyKGtlcm5lbF9jcHVzdGF0KS5jcHVzdGF0W0NQVVRJTUVfVVNFUl0pCiAjZW5kaWYKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2luc24uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2luc24uaAppbmRleCA4OGM3NjVlLi43NGRmM2YxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnNuLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW5zbi5oCkBAIC0xMzcsNiArMTM3LDEzIEBACiAJcmV0dXJuIChpbnNuLT52ZXhfcHJlZml4LnZhbHVlICE9IDApOwogfQogCisvKiBFbnN1cmUgdGhpcyBpbnN0cnVjdGlvbiBpcyBkZWNvZGVkIGNvbXBsZXRlbHkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGluc25fY29tcGxldGUoc3RydWN0IGluc24gKmluc24pCit7CisJcmV0dXJuIGluc24tPm9wY29kZS5nb3QgJiYgaW5zbi0+bW9kcm0uZ290ICYmIGluc24tPnNpYi5nb3QgJiYKKwkJaW5zbi0+ZGlzcGxhY2VtZW50LmdvdCAmJiBpbnNuLT5pbW1lZGlhdGUuZ290OworfQorCiBzdGF0aWMgaW5saW5lIGluc25fYnl0ZV90IGluc25fdmV4X21fYml0cyhzdHJ1Y3QgaW5zbiAqaW5zbikKIHsKIAlpZiAoaW5zbi0+dmV4X3ByZWZpeC5uYnl0ZXMgPT0gMikJLyogMiBieXRlcyBWRVggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX3NjdV9pcGMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2ludGVsX3NjdV9pcGMuaAppbmRleCA0NDIwOTkzLi45MjViNjA1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9zY3VfaXBjLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWxfc2N1X2lwYy5oCkBAIC0zLDExICszLDE1IEBACiAKICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogCi0jZGVmaW5lIElQQ01TR19WUlRDCTB4RkEJIC8qIFNldCB2UlRDIGRldmljZSAqLworI2RlZmluZSBJUENNU0dfV0FSTV9SRVNFVAkweEYwCisjZGVmaW5lIElQQ01TR19DT0xEX1JFU0VUCTB4RjEKKyNkZWZpbmUgSVBDTVNHX1NPRlRfUkVTRVQJMHhGMgorI2RlZmluZSBJUENNU0dfQ09MRF9CT09UCTB4RjMKIAotLyogQ29tbWFuZCBpZCBhc3NvY2lhdGVkIHdpdGggbWVzc2FnZSBJUENNU0dfVlJUQyAqLwotI2RlZmluZSBJUENfQ01EX1ZSVENfU0VUVElNRSAgICAgIDEgLyogU2V0IHRpbWUgKi8KLSNkZWZpbmUgSVBDX0NNRF9WUlRDX1NFVEFMQVJNICAgICAyIC8qIFNldCBhbGFybSAqLworI2RlZmluZSBJUENNU0dfVlJUQwkJMHhGQQkgLyogU2V0IHZSVEMgZGV2aWNlICovCisJLyogQ29tbWFuZCBpZCBhc3NvY2lhdGVkIHdpdGggbWVzc2FnZSBJUENNU0dfVlJUQyAqLworCSNkZWZpbmUgSVBDX0NNRF9WUlRDX1NFVFRJTUUgICAgICAxIC8qIFNldCB0aW1lICovCisJI2RlZmluZSBJUENfQ01EX1ZSVENfU0VUQUxBUk0gICAgIDIgLyogU2V0IGFsYXJtICovCiAKIC8qIFJlYWQgc2luZ2xlIHJlZ2lzdGVyICovCiBpbnQgaW50ZWxfc2N1X2lwY19pb3JlYWQ4KHUxNiBhZGRyLCB1OCAqZGF0YSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYWNoX3RpbWVyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYWNoX3RpbWVyLmgKaW5kZXggODUzNzI4NS4uODhkMGMzYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWFjaF90aW1lci5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21hY2hfdGltZXIuaApAQCAtMTUsNyArMTUsNyBAQAogCiAjZGVmaW5lIENBTElCUkFURV9USU1FX01TRUMgMzAgLyogMzAgbXNlY3MgKi8KICNkZWZpbmUgQ0FMSUJSQVRFX0xBVENICVwKLQkoKENMT0NLX1RJQ0tfUkFURSAqIENBTElCUkFURV9USU1FX01TRUMgKyAxMDAwLzIpLzEwMDApCisJKChQSVRfVElDS19SQVRFICogQ0FMSUJSQVRFX1RJTUVfTVNFQyArIDEwMDAvMikvMTAwMCkKIAogc3RhdGljIGlubGluZSB2b2lkIG1hY2hfcHJlcGFyZV9jb3VudGVyKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYzE0NjgxOHJ0Yy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWMxNDY4MThydGMuaAppbmRleCAwMWZkZjU2Li4wZThlODViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tYzE0NjgxOHJ0Yy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21jMTQ2ODE4cnRjLmgKQEAgLTgxLDggKzgxLDggQEAKICNlbHNlCiAjZGVmaW5lIGxvY2tfY21vc19wcmVmaXgocmVnKSBkbyB7fSB3aGlsZSAoMCkKICNkZWZpbmUgbG9ja19jbW9zX3N1ZmZpeChyZWcpIGRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBsb2NrX2Ntb3MocmVnKQotI2RlZmluZSB1bmxvY2tfY21vcygpCisjZGVmaW5lIGxvY2tfY21vcyhyZWcpIGRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdW5sb2NrX2Ntb3MoKSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIGRvX2lfaGF2ZV9sb2NrX2Ntb3MoKSAwCiAjZGVmaW5lIGN1cnJlbnRfbG9ja19jbW9zX3JlZygpIDAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWNlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tY2UuaAppbmRleCAwZThhZTU3Li42YWRkODI3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tY2UuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tY2UuaApAQCAtNTAsMTAgKzUwLDExIEBACiAjZGVmaW5lIE1DSl9DVFhfTUFTSwkJMwogI2RlZmluZSBNQ0pfQ1RYKGZsYWdzKQkJKChmbGFncykgJiBNQ0pfQ1RYX01BU0spCiAjZGVmaW5lIE1DSl9DVFhfUkFORE9NCQkwICAgIC8qIGluamVjdCBjb250ZXh0OiByYW5kb20gKi8KLSNkZWZpbmUgTUNKX0NUWF9QUk9DRVNTCQkxICAgIC8qIGluamVjdCBjb250ZXh0OiBwcm9jZXNzICovCi0jZGVmaW5lIE1DSl9DVFhfSVJRCQkyICAgIC8qIGluamVjdCBjb250ZXh0OiBJUlEgKi8KLSNkZWZpbmUgTUNKX05NSV9CUk9BRENBU1QJNCAgICAvKiBkbyBOTUkgYnJvYWRjYXN0aW5nICovCi0jZGVmaW5lIE1DSl9FWENFUFRJT04JCTggICAgLyogcmFpc2UgYXMgZXhjZXB0aW9uICovCisjZGVmaW5lIE1DSl9DVFhfUFJPQ0VTUwkJMHgxICAvKiBpbmplY3QgY29udGV4dDogcHJvY2VzcyAqLworI2RlZmluZSBNQ0pfQ1RYX0lSUQkJMHgyICAvKiBpbmplY3QgY29udGV4dDogSVJRICovCisjZGVmaW5lIE1DSl9OTUlfQlJPQURDQVNUCTB4NCAgLyogZG8gTk1JIGJyb2FkY2FzdGluZyAqLworI2RlZmluZSBNQ0pfRVhDRVBUSU9OCQkweDggIC8qIHJhaXNlIGFzIGV4Y2VwdGlvbiAqLworI2RlZmluZSBNQ0pfSVJRX0JSQU9EQ0FTVAkweDEwIC8qIGRvIElSUSBicm9hZGNhc3RpbmcgKi8KIAogLyogRmllbGRzIGFyZSB6ZXJvIHdoZW4gbm90IGF2YWlsYWJsZSAqLwogc3RydWN0IG1jZSB7CkBAIC0xMjAsNyArMTIxLDggQEAKIAogI2lmZGVmIF9fS0VSTkVMX18KIAotZXh0ZXJuIHN0cnVjdCBhdG9taWNfbm90aWZpZXJfaGVhZCB4ODZfbWNlX2RlY29kZXJfY2hhaW47CitleHRlcm4gdm9pZCBtY2VfcmVnaXN0ZXJfZGVjb2RlX2NoYWluKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworZXh0ZXJuIHZvaWQgbWNlX3VucmVnaXN0ZXJfZGVjb2RlX2NoYWluKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOwogCiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWVtYmxvY2suaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21lbWJsb2NrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZDM4MDAuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWVtYmxvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSNpZm5kZWYgX1g4Nl9NRU1CTE9DS19ICi0jZGVmaW5lIF9YODZfTUVNQkxPQ0tfSAotCi0jZGVmaW5lIEFSQ0hfRElTQ0FSRF9NRU1CTE9DSwotCi11NjQgbWVtYmxvY2tfeDg2X2ZpbmRfaW5fcmFuZ2Vfc2l6ZSh1NjQgc3RhcnQsIHU2NCAqc2l6ZXAsIHU2NCBhbGlnbik7Ci0KLXZvaWQgbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UodTY0IHN0YXJ0LCB1NjQgZW5kLCBjaGFyICpuYW1lKTsKLXZvaWQgbWVtYmxvY2tfeDg2X2ZyZWVfcmFuZ2UodTY0IHN0YXJ0LCB1NjQgZW5kKTsKLXN0cnVjdCByYW5nZTsKLWludCBfX2dldF9mcmVlX2FsbF9tZW1vcnlfcmFuZ2Uoc3RydWN0IHJhbmdlICoqcmFuZ2UsIGludCBub2RlaWQsCi0JCQkgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7Ci1pbnQgZ2V0X2ZyZWVfYWxsX21lbW9yeV9yYW5nZShzdHJ1Y3QgcmFuZ2UgKipyYW5nZXAsIGludCBub2RlaWQpOwotCi12b2lkIG1lbWJsb2NrX3g4Nl9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucyhpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKLQkJCQkJIHVuc2lnbmVkIGxvbmcgbGFzdF9wZm4pOwotdTY0IG1lbWJsb2NrX3g4Nl9ob2xlX3NpemUodTY0IHN0YXJ0LCB1NjQgZW5kKTsKLXU2NCBtZW1ibG9ja194ODZfZmluZF9pbl9yYW5nZV9ub2RlKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IGVuZCwgdTY0IHNpemUsIHU2NCBhbGlnbik7Ci11NjQgbWVtYmxvY2tfeDg2X2ZyZWVfbWVtb3J5X2luX3JhbmdlKHU2NCBhZGRyLCB1NjQgbGltaXQpOwotdTY0IG1lbWJsb2NrX3g4Nl9tZW1vcnlfaW5fcmFuZ2UodTY0IGFkZHIsIHU2NCBsaW1pdCk7Ci1ib29sIG1lbWJsb2NrX3g4Nl9jaGVja19yZXNlcnZlZF9zaXplKHU2NCAqYWRkcnAsIHU2NCAqc2l6ZXAsIHU2NCBhbGlnbik7Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWljcm9jb2RlLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9taWNyb2NvZGUuaAppbmRleCAyNDIxNTA3Li40ZWJlMTU3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9taWNyb2NvZGUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9taWNyb2NvZGUuaApAQCAtNDgsNiArNDgsNyBAQAogCiAjaWZkZWYgQ09ORklHX01JQ1JPQ09ERV9BTUQKIGV4dGVybiBzdHJ1Y3QgbWljcm9jb2RlX29wcyAqIF9faW5pdCBpbml0X2FtZF9taWNyb2NvZGUodm9pZCk7CitleHRlcm4gdm9pZCBfX2V4aXQgZXhpdF9hbWRfbWljcm9jb2RlKHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZ2V0X3Vjb2RlX2RhdGEodm9pZCAqdG8sIGNvbnN0IHU4ICpmcm9tLCBzaXplX3QgbikKIHsKQEAgLTU5LDYgKzYwLDcgQEAKIHsKIAlyZXR1cm4gTlVMTDsKIH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQgZXhpdF9hbWRfbWljcm9jb2RlKHZvaWQpIHt9CiAjZW5kaWYKIAogI2VuZGlmIC8qIF9BU01fWDg2X01JQ1JPQ09ERV9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcnN0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcnN0LmgKaW5kZXggZTYyODMxMi4uOTNmNzkwOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXJzdC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21yc3QuaApAQCAtMzEsMTEgKzMxLDIwIEBACiB9OwogCiBleHRlcm4gZW51bSBtcnN0X2NwdV90eXBlIF9fbXJzdF9jcHVfY2hpcDsKKworI2lmZGVmIENPTkZJR19YODZfSU5URUxfTUlECisKIHN0YXRpYyBpbmxpbmUgZW51bSBtcnN0X2NwdV90eXBlIG1yc3RfaWRlbnRpZnlfY3B1KHZvaWQpCiB7CiAJcmV0dXJuIF9fbXJzdF9jcHVfY2hpcDsKIH0KIAorI2Vsc2UgLyogIUNPTkZJR19YODZfSU5URUxfTUlEICovCisKKyNkZWZpbmUgbXJzdF9pZGVudGlmeV9jcHUoKSAgICAoMCkKKworI2VuZGlmIC8qICFDT05GSUdfWDg2X0lOVEVMX01JRCAqLworCiBlbnVtIG1yc3RfdGltZXJfb3B0aW9ucyB7CiAJTVJTVF9USU1FUl9ERUZBVUxULAogCU1SU1RfVElNRVJfQVBCVF9PTkxZLApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3IuaAppbmRleCAwODRlZjk1Li45NTIwM2Q0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3IuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3IuaApAQCAtMTY5LDcgKzE2OSwxNCBAQAogCXJldHVybiBuYXRpdmVfd3JpdGVfbXNyX3NhZmUobXNyLCBsb3csIGhpZ2gpOwogfQogCi0vKiByZG1zciB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZyAqLworLyoKKyAqIHJkbXNyIHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nLgorICoKKyAqIFBsZWFzZSBub3RlIHRoYXQgdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyB3b3JrcyBvbmx5IGFmdGVyIHdlJ3ZlCisgKiBzd2l0Y2hlZCB0byB0aGUgInNtYXJ0IiAjR1AgaGFuZGxlciBpbiB0cmFwX2luaXQoKSB3aGljaCBrbm93cyBhYm91dAorICogZXhjZXB0aW9uIHRhYmxlcyAtIHVzaW5nIHRoaXMgbWFjcm8gZWFybGllciB0aGFuIHRoYXQgY2F1c2VzIG1hY2hpbmUKKyAqIGhhbmdzIG9uIGJveGVzIHdoaWNoIGRvIG5vdCBpbXBsZW1lbnQgdGhlIEBtc3IgaW4gdGhlIGZpcnN0IGFyZ3VtZW50LgorICovCiAjZGVmaW5lIHJkbXNyX3NhZmUobXNyLCBwMSwgcDIpCQkJCQlcCiAoewkJCQkJCQkJXAogCWludCBfX2VycjsJCQkJCQlcCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hY2hpcC9udW1hY2hpcF9jc3IuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFjaGlwL251bWFjaGlwX2Nzci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MGY4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hY2hpcC9udW1hY2hpcF9jc3IuaApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE51bWFzY2FsZSBOdW1hQ29ubmVjdC1TcGVjaWZpYyBIZWFkZXIgZmlsZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBOdW1hc2NhbGUgQVMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogU2VuZCBmZWVkYmFjayB0byA8c3VwcG9ydEBudW1hc2NhbGUuY29tPgorICoKKyAqLworCisjaWZuZGVmIF9BU01fWDg2X05VTUFDSElQX05VTUFDSElQX0NTUl9ICisjZGVmaW5lIF9BU01fWDg2X05VTUFDSElQX05VTUFDSElQX0NTUl9ICisKKyNpbmNsdWRlIDxsaW51eC9udW1hLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zd2FiLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgorCisjZGVmaW5lIENTUl9OT0RFX1NISUZUCQkxNgorI2RlZmluZSBDU1JfTk9ERV9CSVRTKHApCSgoKHVuc2lnbmVkIGxvbmcpKHApKSA8PCBDU1JfTk9ERV9TSElGVCkKKyNkZWZpbmUgQ1NSX05PREVfTUFTSwkJMHgwZmZmCQkvKiA0SyBub2RlcyAqLworCisvKiAzMksgQ1NSIHNwYWNlLCBiMTUgaW5kaWNhdGVzIGdlby9ub24tZ2VvICovCisjZGVmaW5lIENTUl9PRkZTRVRfTUFTSwkweDdmZmZVTAorCisvKiBHbG9iYWwgQ1NSIHNwYWNlIGNvdmVycyBhbGwgNEsgcG9zc2libGUgbm9kZXMgd2l0aCA2NEsgQ1NSIHNwYWNlIHBlciBub2RlICovCisjZGVmaW5lIE5VTUFDSElQX0dDU1JfQkFTRQkweDNmZmYwMDAwMDAwMFVMTAorI2RlZmluZSBOVU1BQ0hJUF9HQ1NSX0xJTQkweDNmZmYwZmZmZmZmZlVMTAorI2RlZmluZSBOVU1BQ0hJUF9HQ1NSX1NJWkUJKE5VTUFDSElQX0dDU1JfTElNIC0gTlVNQUNISVBfR0NTUl9CQVNFICsgMSkKKworLyoKKyAqIExvY2FsIENTUiBzcGFjZSBzdGFydHMgaW4gZ2xvYmFsIENTUiBzcGFjZSB3aXRoICJub2RlaWQiID0gMHhmZmYwLCBob3dldmVyCisgKiB3aGVuIHVzaW5nIHRoZSBkaXJlY3QgbWFwcGluZyBvbiB4ODZfNjQsIGJvdGggc3RhcnQgYW5kIHNpemUgbmVlZHMgdG8gYmUKKyAqIGFsaWduZWQgd2l0aCBQTURfU0laRSB3aGljaCBpcyAyTQorICovCisjZGVmaW5lIE5VTUFDSElQX0xDU1JfQkFTRQkweDNmZmZmZTAwMDAwMFVMTAorI2RlZmluZSBOVU1BQ0hJUF9MQ1NSX0xJTQkweDNmZmZmZmZmZmZmZlVMTAorI2RlZmluZSBOVU1BQ0hJUF9MQ1NSX1NJWkUJKE5VTUFDSElQX0xDU1JfTElNIC0gTlVNQUNISVBfTENTUl9CQVNFICsgMSkKKworc3RhdGljIGlubGluZSB2b2lkICpnY3NyX2FkZHJlc3MoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiBfX3ZhKE5VTUFDSElQX0dDU1JfQkFTRSB8ICgxVUwgPDwgMTUpIHwKKwkJQ1NSX05PREVfQklUUyhub2RlICYgQ1NSX05PREVfTUFTSykgfCAob2Zmc2V0ICYgQ1NSX09GRlNFVF9NQVNLKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCAqbGNzcl9hZGRyZXNzKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiBfX3ZhKE5VTUFDSElQX0xDU1JfQkFTRSB8ICgxVUwgPDwgMTUpIHwKKwkJQ1NSX05PREVfQklUUygweGZmZjApIHwgKG9mZnNldCAmIENTUl9PRkZTRVRfTUFTSykpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkX2djc3IoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXJldHVybiBzd2FiMzIocmVhZGwoZ2Nzcl9hZGRyZXNzKG5vZGUsIG9mZnNldCkpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2djc3IoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgdmFsKQoreworCXdyaXRlbChzd2FiMzIodmFsKSwgZ2Nzcl9hZGRyZXNzKG5vZGUsIG9mZnNldCkpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCByZWFkX2xjc3IodW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJcmV0dXJuIHN3YWIzMihyZWFkbChsY3NyX2FkZHJlc3Mob2Zmc2V0KSkpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGVfbGNzcih1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl3cml0ZWwoc3dhYjMyKHZhbCksIGxjc3JfYWRkcmVzcyhvZmZzZXQpKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgQ1NSX0cwX1NUQVRFX0NMRUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjZGVmaW5lIENTUl9HMF9TVEFURV9DTEVBUiAoMHgwMDAgKyAoMCA8PCAxMikpCit1bmlvbiBudW1hY2hpcF9jc3JfZzBfc3RhdGVfY2xlYXIgeworCXVuc2lnbmVkIGludCB2OworCXN0cnVjdCBudW1hY2hpcF9jc3JfZzBfc3RhdGVfY2xlYXJfcyB7CisJCXVuc2lnbmVkIGludCBfc3RhdGU6MjsKKwkJdW5zaWduZWQgaW50IF9yc3ZkXzJfNjo1OworCQl1bnNpZ25lZCBpbnQgX2xvc3Q6MTsKKwkJdW5zaWduZWQgaW50IF9yc3ZkXzhfMzE6MjQ7CisJfSBzOworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgQ1NSX0cwX05PREVfSURTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjZGVmaW5lIENTUl9HMF9OT0RFX0lEUyAoMHgwMDggKyAoMCA8PCAxMikpCit1bmlvbiBudW1hY2hpcF9jc3JfZzBfbm9kZV9pZHMgeworCXVuc2lnbmVkIGludCB2OworCXN0cnVjdCBudW1hY2hpcF9jc3JfZzBfbm9kZV9pZHNfcyB7CisJCXVuc2lnbmVkIGludCBfaW5pdGlhbGlkOjE2OworCQl1bnNpZ25lZCBpbnQgX25vZGVpZDoxMjsKKwkJdW5zaWduZWQgaW50IF9yc3ZkXzI4XzMxOjQ7CisJfSBzOworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgQ1NSX0czX0VYVF9JUlFfR0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjZGVmaW5lIENTUl9HM19FWFRfSVJRX0dFTiAoMHgwMzAgKyAoMyA8PCAxMikpCit1bmlvbiBudW1hY2hpcF9jc3JfZzNfZXh0X2lycV9nZW4geworCXVuc2lnbmVkIGludCB2OworCXN0cnVjdCBudW1hY2hpcF9jc3JfZzNfZXh0X2lycV9nZW5fcyB7CisJCXVuc2lnbmVkIGludCBfdmVjdG9yOjg7CisJCXVuc2lnbmVkIGludCBfbXNndHlwZTozOworCQl1bnNpZ25lZCBpbnQgX2luZGV4OjU7CisJCXVuc2lnbmVkIGludCBfZGVzdGluYXRpb25fYXBpY19pZDoxNjsKKwl9IHM7Cit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICBDU1JfRzNfRVhUX0lSUV9TVEFUVVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyNkZWZpbmUgQ1NSX0czX0VYVF9JUlFfU1RBVFVTICgweDAzNCArICgzIDw8IDEyKSkKK3VuaW9uIG51bWFjaGlwX2Nzcl9nM19leHRfaXJxX3N0YXR1cyB7CisJdW5zaWduZWQgaW50IHY7CisJc3RydWN0IG51bWFjaGlwX2Nzcl9nM19leHRfaXJxX3N0YXR1c19zIHsKKwkJdW5zaWduZWQgaW50IF9yZXN1bHQ6MzI7CisJfSBzOworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgQ1NSX0czX0VYVF9JUlFfREVTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjZGVmaW5lIENTUl9HM19FWFRfSVJRX0RFU1QgKDB4MDM4ICsgKDMgPDwgMTIpKQordW5pb24gbnVtYWNoaXBfY3NyX2czX2V4dF9pcnFfZGVzdCB7CisJdW5zaWduZWQgaW50IHY7CisJc3RydWN0IG51bWFjaGlwX2Nzcl9nM19leHRfaXJxX2Rlc3RfcyB7CisJCXVuc2lnbmVkIGludCBfaXJxOjg7CisJCXVuc2lnbmVkIGludCBfcnN2ZF84XzMxOjI0OworCX0gczsKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgIENTUl9HM19OQ19BVFRfTUFQX1NFTEVDVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworI2RlZmluZSBDU1JfRzNfTkNfQVRUX01BUF9TRUxFQ1QgKDB4N2ZjICsgKDMgPDwgMTIpKQordW5pb24gbnVtYWNoaXBfY3NyX2czX25jX2F0dF9tYXBfc2VsZWN0IHsKKwl1bnNpZ25lZCBpbnQgdjsKKwlzdHJ1Y3QgbnVtYWNoaXBfY3NyX2czX25jX2F0dF9tYXBfc2VsZWN0X3MgeworCQl1bnNpZ25lZCBpbnQgX3VwcGVyX2FkZHJlc3NfYml0czo0OworCQl1bnNpZ25lZCBpbnQgX3NlbGVjdF9yYW06NDsKKwkJdW5zaWduZWQgaW50IF9yc3ZkXzhfMzE6MjQ7CisJfSBzOworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgQ1NSX0czX05DX0FUVF9NQVBfU0VMRUNUXzAtMjU1ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjZGVmaW5lIENTUl9HM19OQ19BVFRfTUFQX1NFTEVDVF8wICgweDgwMCArICgzIDw8IDEyKSkKKworI2VuZGlmIC8qIF9BU01fWDg2X05VTUFDSElQX05VTUFDSElQX0NTUl9IICovCisKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmNwdS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyY3B1LmgKaW5kZXggMzQ3MGM5ZC4uNTI5YmYwN2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmNwdS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmNwdS5oCkBAIC00NTEsMjMgKzQ1MSwyMCBAQAogI2VuZGlmIC8qICFDT05GSUdfTTM4NiAqLwogCiAjaWZkZWYgQ09ORklHX1g4Nl9DTVBYQ0hHNjQKLSNkZWZpbmUgcGVyY3B1X2NtcHhjaGc4Yl9kb3VibGUocGNwMSwgbzEsIG8yLCBuMSwgbjIpCQkJXAorI2RlZmluZSBwZXJjcHVfY21weGNoZzhiX2RvdWJsZShwY3AxLCBwY3AyLCBvMSwgbzIsIG4xLCBuMikJCVwKICh7CQkJCQkJCQkJXAotCWNoYXIgX19yZXQ7CQkJCQkJCVwKLQl0eXBlb2YobzEpIF9fbzEgPSBvMTsJCQkJCQlcCi0JdHlwZW9mKG8xKSBfX24xID0gbjE7CQkJCQkJXAotCXR5cGVvZihvMikgX19vMiA9IG8yOwkJCQkJCVwKLQl0eXBlb2YobzIpIF9fbjIgPSBuMjsJCQkJCQlcCi0JdHlwZW9mKG8yKSBfX2R1bW15ID0gbjI7CQkJCQlcCisJYm9vbCBfX3JldDsJCQkJCQkJXAorCXR5cGVvZihwY3AxKSBfX28xID0gKG8xKSwgX19uMSA9IChuMSk7CQkJCVwKKwl0eXBlb2YocGNwMikgX19vMiA9IChvMiksIF9fbjIgPSAobjIpOwkJCQlcCiAJYXNtIHZvbGF0aWxlKCJjbXB4Y2hnOGIgIl9fcGVyY3B1X2FyZygxKSJcblx0c2V0eiAlMFxuXHQiCVwKLQkJICAgIDogIj1hIihfX3JldCksICI9bSIgKHBjcDEpLCAiPWQiKF9fZHVtbXkpCQlcCi0JCSAgICA6ICAiYiIoX19uMSksICJjIihfX24yKSwgImEiKF9fbzEpLCAiZCIoX19vMikpOwlcCisJCSAgICA6ICI9YSIgKF9fcmV0KSwgIittIiAocGNwMSksICIrbSIgKHBjcDIpLCAiK2QiIChfX28yKSBcCisJCSAgICA6ICAiYiIgKF9fbjEpLCAiYyIgKF9fbjIpLCAiYSIgKF9fbzEpKTsJCVwKIAlfX3JldDsJCQkJCQkJCVwKIH0pCiAKLSNkZWZpbmUgX190aGlzX2NwdV9jbXB4Y2hnX2RvdWJsZV80KHBjcDEsIHBjcDIsIG8xLCBvMiwgbjEsIG4yKQkJcGVyY3B1X2NtcHhjaGc4Yl9kb3VibGUocGNwMSwgbzEsIG8yLCBuMSwgbjIpCi0jZGVmaW5lIHRoaXNfY3B1X2NtcHhjaGdfZG91YmxlXzQocGNwMSwgcGNwMiwgbzEsIG8yLCBuMSwgbjIpCQlwZXJjcHVfY21weGNoZzhiX2RvdWJsZShwY3AxLCBvMSwgbzIsIG4xLCBuMikKLSNkZWZpbmUgaXJxc2FmZV9jcHVfY21weGNoZ19kb3VibGVfNChwY3AxLCBwY3AyLCBvMSwgbzIsIG4xLCBuMikJcGVyY3B1X2NtcHhjaGc4Yl9kb3VibGUocGNwMSwgbzEsIG8yLCBuMSwgbjIpCisjZGVmaW5lIF9fdGhpc19jcHVfY21weGNoZ19kb3VibGVfNAlwZXJjcHVfY21weGNoZzhiX2RvdWJsZQorI2RlZmluZSB0aGlzX2NwdV9jbXB4Y2hnX2RvdWJsZV80CXBlcmNwdV9jbXB4Y2hnOGJfZG91YmxlCisjZGVmaW5lIGlycXNhZmVfY3B1X2NtcHhjaGdfZG91YmxlXzQJcGVyY3B1X2NtcHhjaGc4Yl9kb3VibGUKICNlbmRpZiAvKiBDT05GSUdfWDg2X0NNUFhDSEc2NCAqLwogCiAvKgpAQCAtNTA4LDMxICs1MDUsMjMgQEAKICAqIGl0IGluIHNvZnR3YXJlLiAgVGhlIGFkZHJlc3MgdXNlZCBpbiB0aGUgY21weGNoZzE2IGluc3RydWN0aW9uIG11c3QgYmUKICAqIGFsaWduZWQgdG8gYSAxNiBieXRlIGJvdW5kYXJ5LgogICovCi0jaWZkZWYgQ09ORklHX1NNUAotI2RlZmluZSBDTVBYQ0hHMTZCX0VNVV9DQUxMICJjYWxsIHRoaXNfY3B1X2NtcHhjaGcxNmJfZW11XG5cdCIgQVNNX05PUDMKLSNlbHNlCi0jZGVmaW5lIENNUFhDSEcxNkJfRU1VX0NBTEwgImNhbGwgdGhpc19jcHVfY21weGNoZzE2Yl9lbXVcblx0IiBBU01fTk9QMgotI2VuZGlmCi0jZGVmaW5lIHBlcmNwdV9jbXB4Y2hnMTZiX2RvdWJsZShwY3AxLCBvMSwgbzIsIG4xLCBuMikJCQlcCisjZGVmaW5lIHBlcmNwdV9jbXB4Y2hnMTZiX2RvdWJsZShwY3AxLCBwY3AyLCBvMSwgbzIsIG4xLCBuMikJCVwKICh7CQkJCQkJCQkJXAotCWNoYXIgX19yZXQ7CQkJCQkJCVwKLQl0eXBlb2YobzEpIF9fbzEgPSBvMTsJCQkJCQlcCi0JdHlwZW9mKG8xKSBfX24xID0gbjE7CQkJCQkJXAotCXR5cGVvZihvMikgX19vMiA9IG8yOwkJCQkJCVwKLQl0eXBlb2YobzIpIF9fbjIgPSBuMjsJCQkJCQlcCi0JdHlwZW9mKG8yKSBfX2R1bW15OwkJCQkJCVwKLQlhbHRlcm5hdGl2ZV9pbyhDTVBYQ0hHMTZCX0VNVV9DQUxMLAkJCQlcCi0JCSAgICAgICAiY21weGNoZzE2YiAiIF9fcGVyY3B1X3ByZWZpeCAiKCUlcnNpKVxuXHRzZXR6ICUwXG5cdCIsCVwKKwlib29sIF9fcmV0OwkJCQkJCQlcCisJdHlwZW9mKHBjcDEpIF9fbzEgPSAobzEpLCBfX24xID0gKG4xKTsJCQkJXAorCXR5cGVvZihwY3AyKSBfX28yID0gKG8yKSwgX19uMiA9IChuMik7CQkJCVwKKwlhbHRlcm5hdGl2ZV9pbygibGVhcSAlUDEsJSVyc2lcblx0Y2FsbCB0aGlzX2NwdV9jbXB4Y2hnMTZiX2VtdVxuXHQiLCBcCisJCSAgICAgICAiY21weGNoZzE2YiAiIF9fcGVyY3B1X2FyZygxKSAiXG5cdHNldHogJTBcblx0IiwJXAogCQkgICAgICAgWDg2X0ZFQVRVUkVfQ1gxNiwJCQkJXAotCQkgICAgICAgQVNNX09VVFBVVDIoIj1hIihfX3JldCksICI9ZCIoX19kdW1teSkpLAkJXAotCQkgICAgICAgIlMiICgmcGNwMSksICJiIihfX24xKSwgImMiKF9fbjIpLAkJXAotCQkgICAgICAgImEiKF9fbzEpLCAiZCIoX19vMikgOiAibWVtb3J5Iik7CQlcCisJCSAgICAgICBBU01fT1VUUFVUMigiPWEiIChfX3JldCksICIrbSIgKHBjcDEpLAkJXAorCQkJCSAgICIrbSIgKHBjcDIpLCAiK2QiIChfX28yKSksCQlcCisJCSAgICAgICAiYiIgKF9fbjEpLCAiYyIgKF9fbjIpLCAiYSIgKF9fbzEpIDogInJzaSIpOwlcCiAJX19yZXQ7CQkJCQkJCQlcCiB9KQogCi0jZGVmaW5lIF9fdGhpc19jcHVfY21weGNoZ19kb3VibGVfOChwY3AxLCBwY3AyLCBvMSwgbzIsIG4xLCBuMikJCXBlcmNwdV9jbXB4Y2hnMTZiX2RvdWJsZShwY3AxLCBvMSwgbzIsIG4xLCBuMikKLSNkZWZpbmUgdGhpc19jcHVfY21weGNoZ19kb3VibGVfOChwY3AxLCBwY3AyLCBvMSwgbzIsIG4xLCBuMikJCXBlcmNwdV9jbXB4Y2hnMTZiX2RvdWJsZShwY3AxLCBvMSwgbzIsIG4xLCBuMikKLSNkZWZpbmUgaXJxc2FmZV9jcHVfY21weGNoZ19kb3VibGVfOChwY3AxLCBwY3AyLCBvMSwgbzIsIG4xLCBuMikJcGVyY3B1X2NtcHhjaGcxNmJfZG91YmxlKHBjcDEsIG8xLCBvMiwgbjEsIG4yKQorI2RlZmluZSBfX3RoaXNfY3B1X2NtcHhjaGdfZG91YmxlXzgJcGVyY3B1X2NtcHhjaGcxNmJfZG91YmxlCisjZGVmaW5lIHRoaXNfY3B1X2NtcHhjaGdfZG91YmxlXzgJcGVyY3B1X2NtcHhjaGcxNmJfZG91YmxlCisjZGVmaW5lIGlycXNhZmVfY3B1X2NtcHhjaGdfZG91YmxlXzgJcGVyY3B1X2NtcHhjaGcxNmJfZG91YmxlCiAKICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZXJmX2V2ZW50LmgKaW5kZXggZjYxYzYyZi4uMDk2Yzk3NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9ldmVudC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmZfZXZlbnQuaApAQCAtNTcsNiArNTcsNyBAQAogCQkoMSA8PCAoQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX0lOREVYKSkKIAogI2RlZmluZSBBUkNIX1BFUkZNT05fQlJBTkNIX01JU1NFU19SRVRJUkVECQk2CisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9FVkVOVFNfQ09VTlQJCQk3CiAKIC8qCiAgKiBJbnRlbCAiQXJjaGl0ZWN0dXJhbCBQZXJmb3JtYW5jZSBNb25pdG9yaW5nIiBDUFVJRApAQCAtNzIsNiArNzMsMTkgQEAKIAl1bnNpZ25lZCBpbnQgZnVsbDsKIH07CiAKK3VuaW9uIGNwdWlkMTBfZWJ4IHsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgbm9fdW5oYWx0ZWRfY29yZV9jeWNsZXM6MTsKKwkJdW5zaWduZWQgaW50IG5vX2luc3RydWN0aW9uc19yZXRpcmVkOjE7CisJCXVuc2lnbmVkIGludCBub191bmhhbHRlZF9yZWZlcmVuY2VfY3ljbGVzOjE7CisJCXVuc2lnbmVkIGludCBub19sbGNfcmVmZXJlbmNlOjE7CisJCXVuc2lnbmVkIGludCBub19sbGNfbWlzc2VzOjE7CisJCXVuc2lnbmVkIGludCBub19icmFuY2hfaW5zdHJ1Y3Rpb25fcmV0aXJlZDoxOworCQl1bnNpZ25lZCBpbnQgbm9fYnJhbmNoX21pc3Nlc19yZXRpcmVkOjE7CisJfSBzcGxpdDsKKwl1bnNpZ25lZCBpbnQgZnVsbDsKK307CisKIHVuaW9uIGNwdWlkMTBfZWR4IHsKIAlzdHJ1Y3QgewogCQl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzX2ZpeGVkOjU7CkBAIC04MSw2ICs5NSwxNSBAQAogCXVuc2lnbmVkIGludCBmdWxsOwogfTsKIAorc3RydWN0IHg4Nl9wbXVfY2FwYWJpbGl0eSB7CisJaW50CQl2ZXJzaW9uOworCWludAkJbnVtX2NvdW50ZXJzX2dwOworCWludAkJbnVtX2NvdW50ZXJzX2ZpeGVkOworCWludAkJYml0X3dpZHRoX2dwOworCWludAkJYml0X3dpZHRoX2ZpeGVkOworCXVuc2lnbmVkIGludAlldmVudHNfbWFzazsKKwlpbnQJCWV2ZW50c19tYXNrX2xlbjsKK307CiAKIC8qCiAgKiBGaXhlZC1wdXJwb3NlIHBlcmZvcm1hbmNlIGV2ZW50czoKQEAgLTg5LDIzICsxMTIsMjQgQEAKIC8qCiAgKiBBbGwgMyBmaXhlZC1tb2RlIFBNQ3MgYXJlIGNvbmZpZ3VyZWQgdmlhIHRoaXMgc2luZ2xlIE1TUjoKICAqLwotI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUl9DVFJMCQkJMHgzOGQKKyNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFJfQ1RSTAkweDM4ZAogCiAvKgogICogVGhlIGNvdW50cyBhcmUgYXZhaWxhYmxlIGluIHRocmVlIHNlcGFyYXRlIE1TUnM6CiAgKi8KIAogLyogSW5zdHJfUmV0aXJlZC5Bbnk6ICovCi0jZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSMAkJCTB4MzA5Ci0jZGVmaW5lIFg4Nl9QTUNfSURYX0ZJWEVEX0lOU1RSVUNUSU9OUwkJCShYODZfUE1DX0lEWF9GSVhFRCArIDApCisjZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSMAkweDMwOQorI2RlZmluZSBYODZfUE1DX0lEWF9GSVhFRF9JTlNUUlVDVElPTlMJKFg4Nl9QTUNfSURYX0ZJWEVEICsgMCkKIAogLyogQ1BVX0NMS19VbmhhbHRlZC5Db3JlOiAqLwotI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUjEJCQkweDMwYQotI2RlZmluZSBYODZfUE1DX0lEWF9GSVhFRF9DUFVfQ1lDTEVTCQkJKFg4Nl9QTUNfSURYX0ZJWEVEICsgMSkKKyNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFIxCTB4MzBhCisjZGVmaW5lIFg4Nl9QTUNfSURYX0ZJWEVEX0NQVV9DWUNMRVMJKFg4Nl9QTUNfSURYX0ZJWEVEICsgMSkKIAogLyogQ1BVX0NMS19VbmhhbHRlZC5SZWY6ICovCi0jZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSMgkJCTB4MzBiCi0jZGVmaW5lIFg4Nl9QTUNfSURYX0ZJWEVEX0JVU19DWUNMRVMJCQkoWDg2X1BNQ19JRFhfRklYRUQgKyAyKQorI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUjIJMHgzMGIKKyNkZWZpbmUgWDg2X1BNQ19JRFhfRklYRURfUkVGX0NZQ0xFUwkoWDg2X1BNQ19JRFhfRklYRUQgKyAyKQorI2RlZmluZSBYODZfUE1DX01TS19GSVhFRF9SRUZfQ1lDTEVTCSgxVUxMIDw8IFg4Nl9QTUNfSURYX0ZJWEVEX1JFRl9DWUNMRVMpCiAKIC8qCiAgKiBXZSBtb2RlbCBCVFMgdHJhY2luZyBhcyBhbm90aGVyIGZpeGVkLW1vZGUgUE1DLgpAQCAtMjAyLDYgKzIyNiw3IEBACiB9OwogCiBleHRlcm4gc3RydWN0IHBlcmZfZ3Vlc3Rfc3dpdGNoX21zciAqcGVyZl9ndWVzdF9nZXRfbXNycyhpbnQgKm5yKTsKK2V4dGVybiB2b2lkIHBlcmZfZ2V0X3g4Nl9wbXVfY2FwYWJpbGl0eShzdHJ1Y3QgeDg2X3BtdV9jYXBhYmlsaXR5ICpjYXApOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgcGVyZl9ndWVzdF9zd2l0Y2hfbXNyICpwZXJmX2d1ZXN0X2dldF9tc3JzKGludCAqbnIpCiB7CkBAIC0yMDksNiArMjM0LDExIEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2dldF94ODZfcG11X2NhcGFiaWxpdHkoc3RydWN0IHg4Nl9wbXVfY2FwYWJpbGl0eSAqY2FwKQoreworCW1lbXNldChjYXAsIDAsIHNpemVvZigqY2FwKSk7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2V2ZW50c19sYXBpY19pbml0KHZvaWQpCXsgfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCAxODYwMWM4Li40OWFmYjNmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC03MDMsNyArNzAzLDcgQEAKIAlwdGVfdXBkYXRlKG1tLCBhZGRyLCBwdGVwKTsKIH0KIAotI2RlZmluZSBmbHVzaF90bGJfZml4X3NwdXJpb3VzX2ZhdWx0KHZtYSwgYWRkcmVzcykKKyNkZWZpbmUgZmx1c2hfdGxiX2ZpeF9zcHVyaW91c19mYXVsdCh2bWEsIGFkZHJlc3MpIGRvIHsgfSB3aGlsZSAoMCkKIAogI2RlZmluZSBta19wbWQocGFnZSwgcGdwcm90KSAgIHBmbl9wbWQocGFnZV90b19wZm4ocGFnZSksIChwZ3Byb3QpKQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wcm9jZXNzb3ItZmxhZ3MuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci1mbGFncy5oCmluZGV4IDJkZGRiMzEuLmY4YWIzZWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci1mbGFncy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci1mbGFncy5oCkBAIC02LDYgKzYsNyBAQAogICogRUZMQUdTIGJpdHMKICAqLwogI2RlZmluZSBYODZfRUZMQUdTX0NGCTB4MDAwMDAwMDEgLyogQ2FycnkgRmxhZyAqLworI2RlZmluZSBYODZfRUZMQUdTX0JJVDEJMHgwMDAwMDAwMiAvKiBCaXQgMSAtIGFsd2F5cyBvbiAqLwogI2RlZmluZSBYODZfRUZMQUdTX1BGCTB4MDAwMDAwMDQgLyogUGFyaXR5IEZsYWcgKi8KICNkZWZpbmUgWDg2X0VGTEFHU19BRgkweDAwMDAwMDEwIC8qIEF1eGlsaWFyeSBjYXJyeSBGbGFnICovCiAjZGVmaW5lIFg4Nl9FRkxBR1NfWkYJMHgwMDAwMDA0MCAvKiBaZXJvIEZsYWcgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggYjY1MDQzNS4uYWE5MDg4YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTk5LDcgKzk5LDYgQEAKIAl1MTYJCQlhcGljaWQ7CiAJdTE2CQkJaW5pdGlhbF9hcGljaWQ7CiAJdTE2CQkJeDg2X2NsZmx1c2hfc2l6ZTsKLSNpZmRlZiBDT05GSUdfU01QCiAJLyogbnVtYmVyIG9mIGNvcmVzIGFzIHNlZW4gYnkgdGhlIE9TOiAqLwogCXUxNgkJCWJvb3RlZF9jb3JlczsKIAkvKiBQaHlzaWNhbCBwcm9jZXNzb3IgaWQ6ICovCkBAIC0xMTAsNyArMTA5LDYgQEAKIAl1OAkJCWNvbXB1dGVfdW5pdF9pZDsKIAkvKiBJbmRleCBpbnRvIHBlcl9jcHUgbGlzdDogKi8KIAl1MTYJCQljcHVfaW5kZXg7Ci0jZW5kaWYKIAl1MzIJCQltaWNyb2NvZGU7CiB9IF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKFNNUF9DQUNIRV9CWVRFUykpKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NwaW5sb2NrLmgKaW5kZXggOTcyYzI2MC4uYTgyYzJiZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BpbmxvY2suaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGlubG9jay5oCkBAIC03OSwyMyArNzksMTAgQEAKIAlyZXR1cm4gY21weGNoZygmbG9jay0+aGVhZF90YWlsLCBvbGQuaGVhZF90YWlsLCBuZXcuaGVhZF90YWlsKSA9PSBvbGQuaGVhZF90YWlsOwogfQogCi0jaWYgKE5SX0NQVVMgPCAyNTYpCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX190aWNrZXRfc3Bpbl91bmxvY2soYXJjaF9zcGlubG9ja190ICpsb2NrKQogewotCWFzbSB2b2xhdGlsZShVTkxPQ0tfTE9DS19QUkVGSVggImluY2IgJTAiCi0JCSAgICAgOiAiK20iIChsb2NrLT5oZWFkX3RhaWwpCi0JCSAgICAgOgotCQkgICAgIDogIm1lbW9yeSIsICJjYyIpOworCV9fYWRkKCZsb2NrLT50aWNrZXRzLmhlYWQsIDEsIFVOTE9DS19MT0NLX1BSRUZJWCk7CiB9Ci0jZWxzZQotc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIF9fdGlja2V0X3NwaW5fdW5sb2NrKGFyY2hfc3BpbmxvY2tfdCAqbG9jaykKLXsKLQlhc20gdm9sYXRpbGUoVU5MT0NLX0xPQ0tfUFJFRklYICJpbmN3ICUwIgotCQkgICAgIDogIittIiAobG9jay0+aGVhZF90YWlsKQotCQkgICAgIDoKLQkJICAgICA6ICJtZW1vcnkiLCAiY2MiKTsKLX0KLSNlbmRpZgogCiBzdGF0aWMgaW5saW5lIGludCBfX3RpY2tldF9zcGluX2lzX2xvY2tlZChhcmNoX3NwaW5sb2NrX3QgKmxvY2spCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXN0ZW0uaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c3RlbS5oCmluZGV4IGMyZmYyYTEuLjJkMmYwMWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c3RlbS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c3RlbS5oCkBAIC00MDEsNiArNDAxLDcgQEAKIGV4dGVybiB2b2lkIGZyZWVfaW5pdF9wYWdlcyhjaGFyICp3aGF0LCB1bnNpZ25lZCBsb25nIGJlZ2luLCB1bnNpZ25lZCBsb25nIGVuZCk7CiAKIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpOworYm9vbCBzZXRfcG1faWRsZV90b19kZWZhdWx0KHZvaWQpOwogCiB2b2lkIHN0b3BfdGhpc19jcHUodm9pZCAqZHVtbXkpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCBhMWZlNWMxLi4xODViNzE5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTQwLDcgKzQwLDggQEAKIAkJCQkJCSovCiAJX191OAkJCXN1cGVydmlzb3Jfc3RhY2tbMF07CiAjZW5kaWYKLQlpbnQJCQl1YWNjZXNzX2VycjsKKwlpbnQJCQlzaWdfb25fdWFjY2Vzc19lcnJvcjoxOworCWludAkJCXVhY2Nlc3NfZXJyOjE7CS8qIHVhY2Nlc3MgZmFpbGVkICovCiB9OwogCiAjZGVmaW5lIElOSVRfVEhSRUFEX0lORk8odHNrKQkJCVwKQEAgLTIzMSw2ICsyMzIsMTIgQEAKIAltb3ZxIFBFUl9DUFVfVkFSKGtlcm5lbF9zdGFjaykscmVnIDsgXAogCXN1YnEgJChUSFJFQURfU0laRS1LRVJORUxfU1RBQ0tfT0ZGU0VUKSxyZWcKIAorLyoKKyAqIFNhbWUgaWYgUEVSX0NQVV9WQVIoa2VybmVsX3N0YWNrKSBpcywgcGVyaGFwcyB3aXRoIHNvbWUgb2Zmc2V0LCBhbHJlYWR5IGluCisgKiBhIGNlcnRhaW4gcmVnaXN0ZXIgKHRvIGJlIHVzZWQgaW4gYXNzZW1ibGVyIG1lbW9yeSBvcGVyYW5kcykuCisgKi8KKyNkZWZpbmUgVEhSRUFEX0lORk8ocmVnLCBvZmYpIEtFUk5FTF9TVEFDS19PRkZTRVQrKG9mZiktVEhSRUFEX1NJWkUocmVnKQorCiAjZW5kaWYKIAogI2VuZGlmIC8qICFYODZfMzIgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RpbWVyLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aW1lci5oCmluZGV4IGZhN2I5MTcuLjQzMTc5M2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RpbWVyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGltZXIuaApAQCAtMzIsNiArMzIsMjIgQEAKICAqICAobWF0aGlldS5kZXNub3llcnNAcG9seW10bC5jYSkKICAqCiAgKgkJCS1qb2huc3R1bEB1cy5pYm0uY29tICJtYXRoIGlzIGhhcmQsIGxldHMgZ28gc2hvcHBpbmchIgorICoKKyAqIEluOgorICoKKyAqIG5zID0gY3ljbGVzICogY3ljMm5zX3NjYWxlIC8gU0MKKyAqCisgKiBBbHRob3VnaCB3ZSBtYXkgc3RpbGwgaGF2ZSBlbm91Z2ggYml0cyB0byBzdG9yZSB0aGUgdmFsdWUgb2YgbnMsCisgKiBpbiBzb21lIGNhc2VzLCB3ZSBtYXkgbm90IGhhdmUgZW5vdWdoIGJpdHMgdG8gc3RvcmUgY3ljbGVzICogY3ljMm5zX3NjYWxlLAorICogbGVhZGluZyB0byBhbiBpbmNvcnJlY3QgcmVzdWx0LgorICoKKyAqIFRvIGF2b2lkIHRoaXMsIHdlIGNhbiBkZWNvbXBvc2UgJ2N5Y2xlcycgaW50byBxdW90aWVudCBhbmQgcmVtYWluZGVyCisgKiBvZiBkaXZpc2lvbiBieSBTQy4gIFRoZW4sCisgKgorICogbnMgPSAocXVvdCAqIFNDICsgcmVtKSAqIGN5YzJuc19zY2FsZSAvIFNDCisgKiAgICA9IHF1b3QgKiBjeWMybnNfc2NhbGUgKyAocmVtICogY3ljMm5zX3NjYWxlKSAvIFNDCisgKgorICoJCQktIHNxYXppQGdvb2dsZS5jb20KICAqLwogCiBERUNMQVJFX1BFUl9DUFUodW5zaWduZWQgbG9uZywgY3ljMm5zKTsKQEAgLTQxLDkgKzU3LDE0IEBACiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIF9fY3ljbGVzXzJfbnModW5zaWduZWQgbG9uZyBsb25nIGN5YykKIHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcXVvdDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmVtOwogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJdW5zaWduZWQgbG9uZyBsb25nIG5zID0gcGVyX2NwdShjeWMybnNfb2Zmc2V0LCBjcHUpOwotCW5zICs9IGN5YyAqIHBlcl9jcHUoY3ljMm5zLCBjcHUpID4+IENZQzJOU19TQ0FMRV9GQUNUT1I7CisJcXVvdCA9IChjeWMgPj4gQ1lDMk5TX1NDQUxFX0ZBQ1RPUik7CisJcmVtID0gY3ljICYgKCgxVUxMIDw8IENZQzJOU19TQ0FMRV9GQUNUT1IpIC0gMSk7CisJbnMgKz0gcXVvdCAqIHBlcl9jcHUoY3ljMm5zLCBjcHUpICsKKwkJKChyZW0gKiBwZXJfY3B1KGN5YzJucywgY3B1KSkgPj4gQ1lDMk5TX1NDQUxFX0ZBQ1RPUik7CiAJcmV0dXJuIG5zOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaAppbmRleCBjMDA2OTI0Li44MDBmNzdjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKQEAgLTEzMCwxMCArMTMwLDggQEAKIAkuYmFsYW5jZV9pbnRlcnZhbAk9IDEsCQkJCQlcCiB9CiAKLSNpZmRlZiBDT05GSUdfWDg2XzY0CiBleHRlcm4gaW50IF9fbm9kZV9kaXN0YW5jZShpbnQsIGludCk7CiAjZGVmaW5lIG5vZGVfZGlzdGFuY2UoYSwgYikgX19ub2RlX2Rpc3RhbmNlKGEsIGIpCi0jZW5kaWYKIAogI2Vsc2UgLyogIUNPTkZJR19OVU1BICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RzYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdHNjLmgKaW5kZXggODNlMmVmZC4uMTVkOTkxNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdHNjLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdHNjLmgKQEAgLTUxLDYgKzUxLDggQEAKIGV4dGVybiBpbnQgY2hlY2tfdHNjX3Vuc3RhYmxlKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbmF0aXZlX2NhbGlicmF0ZV90c2Modm9pZCk7CiAKK2V4dGVybiBpbnQgdHNjX2Nsb2Nrc291cmNlX3JlbGlhYmxlOworCiAvKgogICogQm9vdC10aW1lIGNoZWNrIHdoZXRoZXIgdGhlIFRTQ3MgYXJlIHN5bmNocm9uaXplZCBhY3Jvc3MKICAqIGFsbCBDUFVzL2NvcmVzOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdWFjY2Vzcy5oCmluZGV4IDM2MzYxYmYuLjhiZTVmNTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VhY2Nlc3MuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91YWNjZXNzLmgKQEAgLTQ2Miw3ICs0NjIsNyBAQAogCWJhcnJpZXIoKTsKIAogI2RlZmluZSB1YWNjZXNzX2NhdGNoKGVycikJCQkJCQlcCi0JKGVycikgfD0gY3VycmVudF90aHJlYWRfaW5mbygpLT51YWNjZXNzX2VycjsJCQlcCisJKGVycikgfD0gKGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+dWFjY2Vzc19lcnIgPyAtRUZBVUxUIDogMCk7CVwKIAljdXJyZW50X3RocmVhZF9pbmZvKCktPnVhY2Nlc3NfZXJyID0gcHJldl9lcnI7CQkJXAogfSB3aGlsZSAoMCkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfbW1ycy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfbW1ycy5oCmluZGV4IDEwNDc0ZmIuLmNmMWQ3MzYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3V2L3V2X21tcnMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9tbXJzLmgKQEAgLTU3LDYgKzU3LDcgQEAKIAogI2RlZmluZSBVVjFfSFVCX1BBUlRfTlVNQkVSCTB4ODhhNQogI2RlZmluZSBVVjJfSFVCX1BBUlRfTlVNQkVSCTB4OGViOAorI2RlZmluZSBVVjJfSFVCX1BBUlRfTlVNQkVSX1gJMHgxMTExCiAKIC8qIENvbXBhdDogaWYgdGhpcyAjZGVmaW5lIGlzIHByZXNlbnQsIFVWIGhlYWRlcnMgc3VwcG9ydCBVVjIgKi8KICNkZWZpbmUgVVYyX0hVQl9JU19TVVBQT1JURUQJMQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20veDg2X2luaXQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3g4Nl9pbml0LmgKaW5kZXggMTk3MWU2NS4uMWFjODYwYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20veDg2X2luaXQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS94ODZfaW5pdC5oCkBAIC03LDYgKzcsNyBAQAogc3RydWN0IG1wY19idXM7CiBzdHJ1Y3QgbXBjX2NwdTsKIHN0cnVjdCBtcGNfdGFibGU7CitzdHJ1Y3QgY3B1aW5mb194ODY7CiAKIC8qKgogICogc3RydWN0IHg4Nl9pbml0X21wcGFyc2UgLSBwbGF0Zm9ybSBzcGVjaWZpYyBtcHBhcnNlIG9wcwpAQCAtMTQ3LDYgKzE0OCw3IEBACiAgKi8KIHN0cnVjdCB4ODZfY3B1aW5pdF9vcHMgewogCXZvaWQgKCpzZXR1cF9wZXJjcHVfY2xvY2tldikodm9pZCk7CisJdm9pZCAoKmZpeHVwX2NwdV9pZCkoc3RydWN0IGNwdWluZm9feDg2ICpjLCBpbnQgbm9kZSk7CiB9OwogCiAvKioKQEAgLTE4Niw1ICsxODgsNiBAQAogCiBleHRlcm4gdm9pZCB4ODZfaW5pdF9ub29wKHZvaWQpOwogZXh0ZXJuIHZvaWQgeDg2X2luaXRfdWludF9ub29wKHVuc2lnbmVkIGludCB1bnVzZWQpOworZXh0ZXJuIHZvaWQgeDg2X2RlZmF1bHRfZml4dXBfY3B1X2lkKHN0cnVjdCBjcHVpbmZvX3g4NiAqYywgaW50IG5vZGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYwppbmRleCA0NTU4ZjBkLi5jZTY2NGYzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC0yMTksNiArMjE5LDggQEAKIGFjcGlfcGFyc2VfeDJhcGljKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqaGVhZGVyLCBjb25zdCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAlzdHJ1Y3QgYWNwaV9tYWR0X2xvY2FsX3gyYXBpYyAqcHJvY2Vzc29yID0gTlVMTDsKKwlpbnQgYXBpY19pZDsKKwl1OCBlbmFibGVkOwogCiAJcHJvY2Vzc29yID0gKHN0cnVjdCBhY3BpX21hZHRfbG9jYWxfeDJhcGljICopaGVhZGVyOwogCkBAIC0yMjcsNiArMjI5LDggQEAKIAogCWFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeShoZWFkZXIpOwogCisJYXBpY19pZCA9IHByb2Nlc3Nvci0+bG9jYWxfYXBpY19pZDsKKwllbmFibGVkID0gcHJvY2Vzc29yLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEOwogI2lmZGVmIENPTkZJR19YODZfWDJBUElDCiAJLyoKIAkgKiBXZSBuZWVkIHRvIHJlZ2lzdGVyIGRpc2FibGVkIENQVSBhcyB3ZWxsIHRvIHBlcm1pdApAQCAtMjM1LDggKzIzOSwxMCBAQAogCSAqIHRvIG5vdCBwcmVhbGxvY2F0aW5nIG1lbW9yeSBmb3IgYWxsIE5SX0NQVVMKIAkgKiB3aGVuIHdlIHVzZSBDUFUgaG90cGx1Zy4KIAkgKi8KLQlhY3BpX3JlZ2lzdGVyX2xhcGljKHByb2Nlc3Nvci0+bG9jYWxfYXBpY19pZCwJLyogQVBJQyBJRCAqLwotCQkJICAgIHByb2Nlc3Nvci0+bGFwaWNfZmxhZ3MgJiBBQ1BJX01BRFRfRU5BQkxFRCk7CisJaWYgKCFjcHVfaGFzX3gyYXBpYyAmJiAoYXBpY19pZCA+PSAweGZmKSAmJiBlbmFibGVkKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAieDJhcGljIGVudHJ5IGlnbm9yZWRcbiIpOworCWVsc2UKKwkJYWNwaV9yZWdpc3Rlcl9sYXBpYyhhcGljX2lkLCBlbmFibGVkKTsKICNlbHNlCiAJcHJpbnRrKEtFUk5fV0FSTklORyBQUkVGSVggIngyYXBpYyBlbnRyeSBpZ25vcmVkXG4iKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jIGIvYXJjaC94ODYva2VybmVsL2FtZF9uYi5jCmluZGV4IDRjMzliYWEuLjAxM2MxODEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hbWRfbmIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYW1kX25iLmMKQEAgLTEyMywxNiArMTIzLDE0IEBACiB7CiAJc3RydWN0IHBjaV9kZXYgKmxpbmsgPSBub2RlX3RvX2FtZF9uYihhbWRfZ2V0X25iX2lkKGNwdSkpLT5saW5rOwogCXVuc2lnbmVkIGludCBtYXNrOwotCWludCBjdWlkID0gMDsKKwlpbnQgY3VpZDsKIAogCWlmICghYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19QQVJUSVRJT05JTkcpKQogCQlyZXR1cm4gMDsKIAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChsaW5rLCAweDFkNCwgJm1hc2spOwogCi0jaWZkZWYgQ09ORklHX1NNUAogCWN1aWQgPSBjcHVfZGF0YShjcHUpLmNvbXB1dGVfdW5pdF9pZDsKLSNlbmRpZgogCXJldHVybiAobWFzayA+PiAoNCAqIGN1aWQpKSAmIDB4ZjsKIH0KIApAQCAtMTQxLDcgKzEzOSw3IEBACiAJc3RhdGljIHVuc2lnbmVkIGludCByZXNldCwgYmFuOwogCXN0cnVjdCBhbWRfbm9ydGhicmlkZ2UgKm5iID0gbm9kZV90b19hbWRfbmIoYW1kX2dldF9uYl9pZChjcHUpKTsKIAl1bnNpZ25lZCBpbnQgcmVnOwotCWludCBjdWlkID0gMDsKKwlpbnQgY3VpZDsKIAogCWlmICghYW1kX25iX2hhc19mZWF0dXJlKEFNRF9OQl9MM19QQVJUSVRJT05JTkcpIHx8IG1hc2sgPiAweGYpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMTU5LDkgKzE1Nyw3IEBACiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQobmItPm1pc2MsIDB4MWI4LCByZWcgJiB+MHgxODAwMDApOwogCX0KIAotI2lmZGVmIENPTkZJR19TTVAKIAljdWlkID0gY3B1X2RhdGEoY3B1KS5jb21wdXRlX3VuaXRfaWQ7Ci0jZW5kaWYKIAltYXNrIDw8PSA0ICogY3VpZDsKIAltYXNrIHw9ICgweGYgXiAoMSA8PCBjdWlkKSkgPDwgMjY7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGVydHVyZV82NC5jIGIvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMKaW5kZXggM2QyNjYxYy4uNmU3NmMxOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwZXJ0dXJlXzY0LmMKQEAgLTg4LDEzICs4OCwxMyBAQAogCSAqLwogCWFkZHIgPSBtZW1ibG9ja19maW5kX2luX3JhbmdlKEdBUlRfTUlOX0FERFIsIEdBUlRfTUFYX0FERFIsCiAJCQkJICAgICAgYXBlcl9zaXplLCBhcGVyX3NpemUpOwotCWlmIChhZGRyID09IE1FTUJMT0NLX0VSUk9SIHx8IGFkZHIgKyBhcGVyX3NpemUgPiBHQVJUX01BWF9BRERSKSB7CisJaWYgKCFhZGRyIHx8IGFkZHIgKyBhcGVyX3NpemUgPiBHQVJUX01BWF9BRERSKSB7CiAJCXByaW50ayhLRVJOX0VSUgogCQkJIkNhbm5vdCBhbGxvY2F0ZSBhcGVydHVyZSBtZW1vcnkgaG9sZSAoJWx4LCV1SylcbiIsCiAJCQkJYWRkciwgYXBlcl9zaXplPj4xMCk7CiAJCXJldHVybiAwOwogCX0KLQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShhZGRyLCBhZGRyICsgYXBlcl9zaXplLCAiYXBlcnR1cmU2NCIpOworCW1lbWJsb2NrX3Jlc2VydmUoYWRkciwgYXBlcl9zaXplKTsKIAkvKgogCSAqIEttZW1sZWFrIHNob3VsZCBub3Qgc2NhbiB0aGlzIGJsb2NrIGFzIGl0IG1heSBub3QgYmUgbWFwcGVkIHZpYSB0aGUKIAkgKiBrZXJuZWwgZGlyZWN0IG1hcHBpbmcuCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9hcGljL01ha2VmaWxlCmluZGV4IDc2N2ZkMDQuLjBhZTAzMjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL01ha2VmaWxlCkBAIC0xMCw2ICsxMCw3IEBACiAKIGlmZXEgKCQoQ09ORklHX1g4Nl82NCkseSkKICMgQVBJQyBwcm9iZSB3aWxsIGRlcGVuZCBvbiB0aGUgbGlzdGluZyBvcmRlciBoZXJlCitvYmotJChDT05GSUdfWDg2X05VTUFDSElQKQkrPSBhcGljX251bWFjaGlwLm8KIG9iai0kKENPTkZJR19YODZfVVYpCQkrPSB4MmFwaWNfdXZfeC5vCiBvYmotJChDT05GSUdfWDg2X1gyQVBJQykJKz0geDJhcGljX3BoeXMubwogb2JqLSQoQ09ORklHX1g4Nl9YMkFQSUMpCSs9IHgyYXBpY19jbHVzdGVyLm8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwppbmRleCBmOThkODRjLi4yZWVjMDViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCkBAIC0xNDYsMTYgKzE0NiwyNiBAQAogaW50IHgyYXBpY19tb2RlOwogI2lmZGVmIENPTkZJR19YODZfWDJBUElDCiAvKiB4MmFwaWMgZW5hYmxlZCBiZWZvcmUgT1MgaGFuZG92ZXIgKi8KLXN0YXRpYyBpbnQgeDJhcGljX3ByZWVuYWJsZWQ7CitpbnQgeDJhcGljX3ByZWVuYWJsZWQ7CitzdGF0aWMgaW50IHgyYXBpY19kaXNhYmxlZDsKK3N0YXRpYyBpbnQgbm94MmFwaWM7CiBzdGF0aWMgX19pbml0IGludCBzZXR1cF9ub3gyYXBpYyhjaGFyICpzdHIpCiB7CiAJaWYgKHgyYXBpY19lbmFibGVkKCkpIHsKLQkJcHJfd2FybmluZygiQmlvcyBhbHJlYWR5IGVuYWJsZWQgeDJhcGljLCAiCi0JCQkgICAiY2FuJ3QgZW5mb3JjZSBub3gyYXBpYyIpOwotCQlyZXR1cm4gMDsKLQl9CisJCWludCBhcGljaWQgPSBuYXRpdmVfYXBpY19tc3JfcmVhZChBUElDX0lEKTsKIAotCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfWDJBUElDKTsKKwkJaWYgKGFwaWNpZCA+PSAyNTUpIHsKKwkJCXByX3dhcm5pbmcoIkFwaWNpZDogJTA4eCwgY2Fubm90IGVuZm9yY2Ugbm94MmFwaWNcbiIsCisJCQkJICAgYXBpY2lkKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJcHJfd2FybmluZygieDJhcGljIGFscmVhZHkgZW5hYmxlZC4gd2lsbCBkaXNhYmxlIGl0XG4iKTsKKwl9IGVsc2UKKwkJc2V0dXBfY2xlYXJfY3B1X2NhcChYODZfRkVBVFVSRV9YMkFQSUMpOworCisJbm94MmFwaWMgPSAxOworCiAJcmV0dXJuIDA7CiB9CiBlYXJseV9wYXJhbSgibm94MmFwaWMiLCBzZXR1cF9ub3gyYXBpYyk7CkBAIC0yNTAsNiArMjYwLDcgQEAKIAkJc2VuZF9zdGF0dXMgPSBhcGljX3JlYWQoQVBJQ19JQ1IpICYgQVBJQ19JQ1JfQlVTWTsKIAkJaWYgKCFzZW5kX3N0YXR1cykKIAkJCWJyZWFrOworCQlpbmNfaXJxX3N0YXQoaWNyX3JlYWRfcmV0cnlfY291bnQpOwogCQl1ZGVsYXkoMTAwKTsKIAl9IHdoaWxlICh0aW1lb3V0KysgPCAxMDAwKTsKIApAQCAtODc2LDggKzg4Nyw4IEBACiAJICogQmVzaWRlcywgaWYgd2UgZG9uJ3QgdGltZXIgaW50ZXJydXB0cyBpZ25vcmUgdGhlIGdsb2JhbAogCSAqIGludGVycnVwdCBsb2NrLCB3aGljaCBpcyB0aGUgV3JvbmdUaGluZyAodG0pIHRvIGRvLgogCSAqLwotCWV4aXRfaWRsZSgpOwogCWlycV9lbnRlcigpOworCWV4aXRfaWRsZSgpOwogCWxvY2FsX2FwaWNfdGltZXJfaW50ZXJydXB0KCk7CiAJaXJxX2V4aXQoKTsKIApAQCAtMTQzMSw2ICsxNDQyLDQ1IEBACiB9CiAKICNpZmRlZiBDT05GSUdfWDg2X1gyQVBJQworLyoKKyAqIE5lZWQgdG8gZGlzYWJsZSB4YXBpYyBhbmQgeDJhcGljIGF0IHRoZSBzYW1lIHRpbWUgYW5kIHRoZW4gZW5hYmxlIHhhcGljIG1vZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fZGlzYWJsZV94MmFwaWModTY0IG1zcikKK3sKKwl3cm1zcmwoTVNSX0lBMzJfQVBJQ0JBU0UsCisJICAgICAgIG1zciAmIH4oWDJBUElDX0VOQUJMRSB8IFhBUElDX0VOQUJMRSkpOworCXdybXNybChNU1JfSUEzMl9BUElDQkFTRSwgbXNyICYgflgyQVBJQ19FTkFCTEUpOworfQorCitzdGF0aWMgX19pbml0IHZvaWQgZGlzYWJsZV94MmFwaWModm9pZCkKK3sKKwl1NjQgbXNyOworCisJaWYgKCFjcHVfaGFzX3gyYXBpYykKKwkJcmV0dXJuOworCisJcmRtc3JsKE1TUl9JQTMyX0FQSUNCQVNFLCBtc3IpOworCWlmIChtc3IgJiBYMkFQSUNfRU5BQkxFKSB7CisJCXUzMiB4MmFwaWNfaWQgPSByZWFkX2FwaWNfaWQoKTsKKworCQlpZiAoeDJhcGljX2lkID49IDI1NSkKKwkJCXBhbmljKCJDYW5ub3QgZGlzYWJsZSB4MmFwaWMsIGlkOiAlMDh4XG4iLCB4MmFwaWNfaWQpOworCisJCXByX2luZm8oIkRpc2FibGluZyB4MmFwaWNcbiIpOworCQlfX2Rpc2FibGVfeDJhcGljKG1zcik7CisKKwkJaWYgKG5veDJhcGljKSB7CisJCQljbGVhcl9jcHVfY2FwKCZjcHVfZGF0YSgwKSwgWDg2X0ZFQVRVUkVfWDJBUElDKTsKKwkJCXNldHVwX2NsZWFyX2NwdV9jYXAoWDg2X0ZFQVRVUkVfWDJBUElDKTsKKwkJfQorCisJCXgyYXBpY19kaXNhYmxlZCA9IDE7CisJCXgyYXBpY19tb2RlID0gMDsKKworCQlyZWdpc3Rlcl9sYXBpY19hZGRyZXNzKG1wX2xhcGljX2FkZHIpOworCX0KK30KKwogdm9pZCBjaGVja194MmFwaWModm9pZCkKIHsKIAlpZiAoeDJhcGljX2VuYWJsZWQoKSkgewpAQCAtMTQ0MSwxNSArMTQ5MSwyMCBAQAogCiB2b2lkIGVuYWJsZV94MmFwaWModm9pZCkKIHsKLQlpbnQgbXNyLCBtc3IyOworCXU2NCBtc3I7CisKKwlyZG1zcmwoTVNSX0lBMzJfQVBJQ0JBU0UsIG1zcik7CisJaWYgKHgyYXBpY19kaXNhYmxlZCkgeworCQlfX2Rpc2FibGVfeDJhcGljKG1zcik7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoIXgyYXBpY19tb2RlKQogCQlyZXR1cm47CiAKLQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbXNyLCBtc3IyKTsKIAlpZiAoIShtc3IgJiBYMkFQSUNfRU5BQkxFKSkgewogCQlwcmludGtfb25jZShLRVJOX0lORk8gIkVuYWJsaW5nIHgyYXBpY1xuIik7Ci0JCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBtc3IgfCBYMkFQSUNfRU5BQkxFLCBtc3IyKTsKKwkJd3Jtc3JsKE1TUl9JQTMyX0FQSUNCQVNFLCBtc3IgfCBYMkFQSUNfRU5BQkxFKTsKIAl9CiB9CiAjZW5kaWYgLyogQ09ORklHX1g4Nl9YMkFQSUMgKi8KQEAgLTE0ODYsMjUgKzE1NDEsMzQgQEAKIAlyZXQgPSBzYXZlX2lvYXBpY19lbnRyaWVzKCk7CiAJaWYgKHJldCkgewogCQlwcl9pbmZvKCJTYXZpbmcgSU8tQVBJQyBzdGF0ZSBmYWlsZWQ6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dDsKKwkJcmV0dXJuOwogCX0KIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlsZWdhY3lfcGljLT5tYXNrX2FsbCgpOwogCW1hc2tfaW9hcGljX2VudHJpZXMoKTsKIAorCWlmICh4MmFwaWNfcHJlZW5hYmxlZCAmJiBub3gyYXBpYykKKwkJZGlzYWJsZV94MmFwaWMoKTsKKwogCWlmIChkbWFyX3RhYmxlX2luaXRfcmV0KQogCQlyZXQgPSAtMTsKIAllbHNlCiAJCXJldCA9IGVuYWJsZV9JUigpOwogCisJaWYgKCF4MmFwaWNfc3VwcG9ydGVkKCkpCisJCWdvdG8gc2tpcF94MmFwaWM7CisKIAlpZiAocmV0IDwgMCkgewogCQkvKiBJUiBpcyByZXF1aXJlZCBpZiB0aGVyZSBpcyBBUElDIElEID4gMjU1IGV2ZW4gd2hlbiBydW5uaW5nCiAJCSAqIHVuZGVyIEtWTQogCQkgKi8KIAkJaWYgKG1heF9waHlzaWNhbF9hcGljaWQgPiAyNTUgfHwKLQkJICAgICFoeXBlcnZpc29yX3gyYXBpY19hdmFpbGFibGUoKSkKLQkJCWdvdG8gbm94MmFwaWM7CisJCSAgICAhaHlwZXJ2aXNvcl94MmFwaWNfYXZhaWxhYmxlKCkpIHsKKwkJCWlmICh4MmFwaWNfcHJlZW5hYmxlZCkKKwkJCQlkaXNhYmxlX3gyYXBpYygpOworCQkJZ290byBza2lwX3gyYXBpYzsKKwkJfQogCQkvKgogCQkgKiB3aXRob3V0IElSIGFsbCBDUFVzIGNhbiBiZSBhZGRyZXNzZWQgYnkgSU9BUElDL01TSQogCQkgKiBvbmx5IGluIHBoeXNpY2FsIG1vZGUKQEAgLTE1MTIsOCArMTU3NiwxMCBAQAogCQl4MmFwaWNfZm9yY2VfcGh5cygpOwogCX0KIAotCWlmIChyZXQgPT0gSVJRX1JFTUFQX1hBUElDX01PREUpCi0JCWdvdG8gbm94MmFwaWM7CisJaWYgKHJldCA9PSBJUlFfUkVNQVBfWEFQSUNfTU9ERSkgeworCQlwcl9pbmZvKCJ4MmFwaWMgbm90IGVuYWJsZWQsIElSUSByZW1hcHBpbmcgaXMgaW4geGFwaWMgbW9kZVxuIik7CisJCWdvdG8gc2tpcF94MmFwaWM7CisJfQogCiAJeDJhcGljX2VuYWJsZWQgPSAxOwogCkBAIC0xNTIzLDIyICsxNTg5LDExIEBACiAJCXByX2luZm8oIkVuYWJsZWQgeDJhcGljXG4iKTsKIAl9CiAKLW5veDJhcGljOgorc2tpcF94MmFwaWM6CiAJaWYgKHJldCA8IDApIC8qIElSIGVuYWJsaW5nIGZhaWxlZCAqLwogCQlyZXN0b3JlX2lvYXBpY19lbnRyaWVzKCk7CiAJbGVnYWN5X3BpYy0+cmVzdG9yZV9tYXNrKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi1vdXQ6Ci0JaWYgKHgyYXBpY19lbmFibGVkIHx8ICF4MmFwaWNfc3VwcG9ydGVkKCkpCi0JCXJldHVybjsKLQotCWlmICh4MmFwaWNfcHJlZW5hYmxlZCkKLQkJcGFuaWMoIngyYXBpYzogZW5hYmxlZCBieSBCSU9TIGJ1dCBrZXJuZWwgaW5pdCBmYWlsZWQuIik7Ci0JZWxzZSBpZiAocmV0ID09IElSUV9SRU1BUF9YQVBJQ19NT0RFKQotCQlwcl9pbmZvKCJ4MmFwaWMgbm90IGVuYWJsZWQsIElSUSByZW1hcHBpbmcgaXMgaW4geGFwaWMgbW9kZVxuIik7Ci0JZWxzZSBpZiAocmV0IDwgMCkKLQkJcHJfaW5mbygieDJhcGljIG5vdCBlbmFibGVkLCBJUlEgcmVtYXBwaW5nIGluaXQgZmFpbGVkXG4iKTsKIH0KIAogI2lmZGVmIENPTkZJR19YODZfNjQKQEAgLTE4MDksOCArMTg2NCw4IEBACiB7CiAJdTMyIHY7CiAKLQlleGl0X2lkbGUoKTsKIAlpcnFfZW50ZXIoKTsKKwlleGl0X2lkbGUoKTsKIAkvKgogCSAqIENoZWNrIGlmIHRoaXMgcmVhbGx5IGlzIGEgc3B1cmlvdXMgaW50ZXJydXB0IGFuZCBBQ0sgaXQKIAkgKiBpZiBpdCBpcyBhIHZlY3RvcmVkIG9uZS4gIEp1c3QgaW4gY2FzZS4uLgpAQCAtMTg0Niw4ICsxOTAxLDggQEAKIAkJIklsbGVnYWwgcmVnaXN0ZXIgYWRkcmVzcyIsCS8qIEFQSUMgRXJyb3IgQml0IDcgKi8KIAl9OwogCi0JZXhpdF9pZGxlKCk7CiAJaXJxX2VudGVyKCk7CisJZXhpdF9pZGxlKCk7CiAJLyogRmlyc3QgdGlja2xlIHRoZSBoYXJkd2FyZSwgb25seSB0aGVuIHJlcG9ydCB3aGF0IHdlbnQgb24uIC0tIFJFVyAqLwogCXYwID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKIAlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19mbGF0XzY0LmMKaW5kZXggZjdhNDFlNC4uOGMzY2RkZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19mbGF0XzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpY19mbGF0XzY0LmMKQEAgLTYyLDcgKzYyLDcgQEAKICAqIGFuIEFQSUMuICBTZWUgZS5nLiAiQVAtMzg4IDgyNDg5RFggVXNlcidzIE1hbnVhbCIgKEludGVsCiAgKiBkb2N1bWVudCBudW1iZXIgMjkyMTE2KS4gIFNvIGhlcmUgaXQgZ29lcy4uLgogICovCi1zdGF0aWMgdm9pZCBmbGF0X2luaXRfYXBpY19sZHIodm9pZCkKK3ZvaWQgZmxhdF9pbml0X2FwaWNfbGRyKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJdW5zaWduZWQgbG9uZyBudW0sIGlkOwpAQCAtMTcxLDkgKzE3MSwxNCBAQAogCXJldHVybiBpbml0aWFsX2FwaWNfaWQgPj4gaW5kZXhfbXNiOwogfQogCitzdGF0aWMgaW50IGZsYXRfcHJvYmUodm9pZCkKK3sKKwlyZXR1cm4gMTsKK30KKwogc3RhdGljIHN0cnVjdCBhcGljIGFwaWNfZmxhdCA9ICB7CiAJLm5hbWUJCQkJPSAiZmxhdCIsCi0JLnByb2JlCQkJCT0gTlVMTCwKKwkucHJvYmUJCQkJPSBmbGF0X3Byb2JlLAogCS5hY3BpX21hZHRfb2VtX2NoZWNrCQk9IGZsYXRfYWNwaV9tYWR0X29lbV9jaGVjaywKIAkuYXBpY19pZF9yZWdpc3RlcmVkCQk9IGZsYXRfYXBpY19pZF9yZWdpc3RlcmVkLAogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX251bWFjaGlwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX251bWFjaGlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkM2Q4YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfbnVtYWNoaXAuYwpAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE51bWFzY2FsZSBOdW1hQ29ubmVjdC1TcGVjaWZpYyBBUElDIENvZGUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgTnVtYXNjYWxlIEFTLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFNlbmQgZmVlZGJhY2sgdG8gPHN1cHBvcnRAbnVtYXNjYWxlLmNvbT4KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgPGFzbS9udW1hY2hpcC9udW1hY2hpcF9jc3IuaD4KKyNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vaXBpLmg+CisjaW5jbHVkZSA8YXNtL2FwaWNfZmxhdF82NC5oPgorCitzdGF0aWMgaW50IG51bWFjaGlwX3N5c3RlbSBfX3JlYWRfbW9zdGx5OworCitzdGF0aWMgc3RydWN0IGFwaWMgYXBpY19udW1hY2hpcCBfX3JlYWRfbW9zdGx5OworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF9hcGljX2lkKHVuc2lnbmVkIGxvbmcgeCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGludCBpZDsKKworCXJkbXNybChNU1JfRkFNMTBIX05PREVfSUQsIHZhbHVlKTsKKwlpZCA9ICgoeCA+PiAyNCkgJiAweGZmVSkgfCAoKHZhbHVlIDw8IDIpICYgMHgzZjAwVSk7CisKKwlyZXR1cm4gaWQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9hcGljX2lkKHVuc2lnbmVkIGludCBpZCkKK3sKKwl1bnNpZ25lZCBsb25nIHg7CisKKwl4ID0gKChpZCAmIDB4ZmZVKSA8PCAyNCk7CisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcmVhZF94YXBpY19pZCh2b2lkKQoreworCXJldHVybiBnZXRfYXBpY19pZChhcGljX3JlYWQoQVBJQ19JRCkpOworfQorCitzdGF0aWMgaW50IG51bWFjaGlwX2FwaWNfaWRfcmVnaXN0ZXJlZCh2b2lkKQoreworCXJldHVybiBwaHlzaWRfaXNzZXQocmVhZF94YXBpY19pZCgpLCBwaHlzX2NwdV9wcmVzZW50X21hcCk7Cit9CisKK3N0YXRpYyBpbnQgbnVtYWNoaXBfcGh5c19wa2dfaWQoaW50IGluaXRpYWxfYXBpY19pZCwgaW50IGluZGV4X21zYikKK3sKKwlyZXR1cm4gaW5pdGlhbF9hcGljX2lkID4+IGluZGV4X21zYjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpudW1hY2hpcF90YXJnZXRfY3B1cyh2b2lkKQoreworCXJldHVybiBjcHVfb25saW5lX21hc2s7Cit9CisKK3N0YXRpYyB2b2lkIG51bWFjaGlwX3ZlY3Rvcl9hbGxvY2F0aW9uX2RvbWFpbihpbnQgY3B1LCBzdHJ1Y3QgY3B1bWFzayAqcmV0bWFzaykKK3sKKwljcHVtYXNrX2NsZWFyKHJldG1hc2spOworCWNwdW1hc2tfc2V0X2NwdShjcHUsIHJldG1hc2spOworfQorCitzdGF0aWMgaW50IF9fY3B1aW5pdCBudW1hY2hpcF93YWtldXBfc2Vjb25kYXJ5KGludCBwaHlzX2FwaWNpZCwgdW5zaWduZWQgbG9uZyBzdGFydF9yaXApCit7CisJdW5pb24gbnVtYWNoaXBfY3NyX2czX2V4dF9pcnFfZ2VuIGludF9nZW47CisKKwlpbnRfZ2VuLnMuX2Rlc3RpbmF0aW9uX2FwaWNfaWQgPSBwaHlzX2FwaWNpZDsKKwlpbnRfZ2VuLnMuX3ZlY3RvciA9IDA7CisJaW50X2dlbi5zLl9tc2d0eXBlID0gQVBJQ19ETV9JTklUID4+IDg7CisJaW50X2dlbi5zLl9pbmRleCA9IDA7CisKKwl3cml0ZV9sY3NyKENTUl9HM19FWFRfSVJRX0dFTiwgaW50X2dlbi52KTsKKworCWludF9nZW4ucy5fbXNndHlwZSA9IEFQSUNfRE1fU1RBUlRVUCA+PiA4OworCWludF9nZW4ucy5fdmVjdG9yID0gc3RhcnRfcmlwID4+IDEyOworCisJd3JpdGVfbGNzcihDU1JfRzNfRVhUX0lSUV9HRU4sIGludF9nZW4udik7CisKKwlhdG9taWNfc2V0KCZpbml0X2RlYXNzZXJ0ZWQsIDEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBudW1hY2hpcF9zZW5kX0lQSV9vbmUoaW50IGNwdSwgaW50IHZlY3RvcikKK3sKKwl1bmlvbiBudW1hY2hpcF9jc3JfZzNfZXh0X2lycV9nZW4gaW50X2dlbjsKKwlpbnQgYXBpY2lkID0gcGVyX2NwdSh4ODZfY3B1X3RvX2FwaWNpZCwgY3B1KTsKKworCWludF9nZW4ucy5fZGVzdGluYXRpb25fYXBpY19pZCA9IGFwaWNpZDsKKwlpbnRfZ2VuLnMuX3ZlY3RvciA9IHZlY3RvcjsKKwlpbnRfZ2VuLnMuX21zZ3R5cGUgPSAodmVjdG9yID09IE5NSV9WRUNUT1IgPyBBUElDX0RNX05NSSA6IEFQSUNfRE1fRklYRUQpID4+IDg7CisJaW50X2dlbi5zLl9pbmRleCA9IDA7CisKKwl3cml0ZV9sY3NyKENTUl9HM19FWFRfSVJRX0dFTiwgaW50X2dlbi52KTsKK30KKworc3RhdGljIHZvaWQgbnVtYWNoaXBfc2VuZF9JUElfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywgaW50IHZlY3RvcikKK3sKKwl1bnNpZ25lZCBpbnQgY3B1OworCisJZm9yX2VhY2hfY3B1KGNwdSwgbWFzaykKKwkJbnVtYWNoaXBfc2VuZF9JUElfb25lKGNwdSwgdmVjdG9yKTsKK30KKworc3RhdGljIHZvaWQgbnVtYWNoaXBfc2VuZF9JUElfbWFza19hbGxidXRzZWxmKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrLAorCQkJCQkJaW50IHZlY3RvcikKK3sKKwl1bnNpZ25lZCBpbnQgdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdW5zaWduZWQgaW50IGNwdTsKKworCWZvcl9lYWNoX2NwdShjcHUsIG1hc2spIHsKKwkJaWYgKGNwdSAhPSB0aGlzX2NwdSkKKwkJCW51bWFjaGlwX3NlbmRfSVBJX29uZShjcHUsIHZlY3Rvcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBudW1hY2hpcF9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2ZWN0b3IpCit7CisJdW5zaWduZWQgaW50IHRoaXNfY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuc2lnbmVkIGludCBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlpZiAoY3B1ICE9IHRoaXNfY3B1KQorCQkJbnVtYWNoaXBfc2VuZF9JUElfb25lKGNwdSwgdmVjdG9yKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG51bWFjaGlwX3NlbmRfSVBJX2FsbChpbnQgdmVjdG9yKQoreworCW51bWFjaGlwX3NlbmRfSVBJX21hc2soY3B1X29ubGluZV9tYXNrLCB2ZWN0b3IpOworfQorCitzdGF0aWMgdm9pZCBudW1hY2hpcF9zZW5kX0lQSV9zZWxmKGludCB2ZWN0b3IpCit7CisJX19kZWZhdWx0X3NlbmRfSVBJX3Nob3J0Y3V0KEFQSUNfREVTVF9TRUxGLCB2ZWN0b3IsIEFQSUNfREVTVF9QSFlTSUNBTCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbnVtYWNoaXBfY3B1X21hc2tfdG9fYXBpY2lkKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKQoreworCWludCBjcHU7CisKKwkvKgorCSAqIFdlJ3JlIHVzaW5nIGZpeGVkIElSUSBkZWxpdmVyeSwgY2FuIG9ubHkgcmV0dXJuIG9uZSBwaHlzIEFQSUMgSUQuCisJICogTWF5IGFzIHdlbGwgYmUgdGhlIGZpcnN0LgorCSAqLworCWNwdSA9IGNwdW1hc2tfZmlyc3QoY3B1bWFzayk7CisJaWYgKGxpa2VseSgodW5zaWduZWQpY3B1IDwgbnJfY3B1X2lkcykpCisJCXJldHVybiBwZXJfY3B1KHg4Nl9jcHVfdG9fYXBpY2lkLCBjcHUpOworCisJcmV0dXJuIEJBRF9BUElDSUQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK251bWFjaGlwX2NwdV9tYXNrX3RvX2FwaWNpZF9hbmQoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2ssCisJCQkJY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFuZG1hc2spCit7CisJaW50IGNwdTsKKworCS8qCisJICogV2UncmUgdXNpbmcgZml4ZWQgSVJRIGRlbGl2ZXJ5LCBjYW4gb25seSByZXR1cm4gb25lIHBoeXMgQVBJQyBJRC4KKwkgKiBNYXkgYXMgd2VsbCBiZSB0aGUgZmlyc3QuCisJICovCisJZm9yX2VhY2hfY3B1X2FuZChjcHUsIGNwdW1hc2ssIGFuZG1hc2spIHsKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBjcHVfb25saW5lX21hc2spKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBwZXJfY3B1KHg4Nl9jcHVfdG9fYXBpY2lkLCBjcHUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBudW1hY2hpcF9wcm9iZSh2b2lkKQoreworCXJldHVybiBhcGljID09ICZhcGljX251bWFjaGlwOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgbWFwX2NzcnModm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJOdW1hQ2hpcDogTWFwcGluZyBsb2NhbCBDU1Igc3BhY2UgKCUwMTZsbHggLSAlMDE2bGx4KVxuIiwKKwkJTlVNQUNISVBfTENTUl9CQVNFLCBOVU1BQ0hJUF9MQ1NSX0JBU0UgKyBOVU1BQ0hJUF9MQ1NSX1NJWkUgLSAxKTsKKwlpbml0X2V4dHJhX21hcHBpbmdfdWMoTlVNQUNISVBfTENTUl9CQVNFLCBOVU1BQ0hJUF9MQ1NSX1NJWkUpOworCisJcHJpbnRrKEtFUk5fSU5GTyAiTnVtYUNoaXA6IE1hcHBpbmcgZ2xvYmFsIENTUiBzcGFjZSAoJTAxNmxseCAtICUwMTZsbHgpXG4iLAorCQlOVU1BQ0hJUF9HQ1NSX0JBU0UsIE5VTUFDSElQX0dDU1JfQkFTRSArIE5VTUFDSElQX0dDU1JfU0laRSAtIDEpOworCWluaXRfZXh0cmFfbWFwcGluZ191YyhOVU1BQ0hJUF9HQ1NSX0JBU0UsIE5VTUFDSElQX0dDU1JfU0laRSk7Cit9CisKK3N0YXRpYyB2b2lkIGZpeHVwX2NwdV9pZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMsIGludCBub2RlKQoreworCWMtPnBoeXNfcHJvY19pZCA9IG5vZGU7CisJcGVyX2NwdShjcHVfbGxjX2lkLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0gbm9kZTsKK30KKworc3RhdGljIGludCBfX2luaXQgbnVtYWNoaXBfc3lzdGVtX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCisJaWYgKCFudW1hY2hpcF9zeXN0ZW0pCisJCXJldHVybiAwOworCisJeDg2X2NwdWluaXQuZml4dXBfY3B1X2lkID0gZml4dXBfY3B1X2lkOworCisJbWFwX2NzcnMoKTsKKworCXZhbCA9IHJlYWRfbGNzcihDU1JfRzBfTk9ERV9JRFMpOworCXByaW50ayhLRVJOX0lORk8gIk51bWFDaGlwOiBMb2NhbCBOb2RlSUQgPSAlMDh4XG4iLCB2YWwpOworCisJcmV0dXJuIDA7Cit9CitlYXJseV9pbml0Y2FsbChudW1hY2hpcF9zeXN0ZW1faW5pdCk7CisKK3N0YXRpYyBpbnQgbnVtYWNoaXBfYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKK3sKKwlpZiAoIXN0cm5jbXAob2VtX2lkLCAiTlVNQVNDIiwgNikpIHsKKwkJbnVtYWNoaXBfc3lzdGVtID0gMTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXBpYyBhcGljX251bWFjaGlwIF9fcmVmY29uc3QgPSB7CisKKwkubmFtZQkJCQk9ICJOdW1hQ29ubmVjdCBzeXN0ZW0iLAorCS5wcm9iZQkJCQk9IG51bWFjaGlwX3Byb2JlLAorCS5hY3BpX21hZHRfb2VtX2NoZWNrCQk9IG51bWFjaGlwX2FjcGlfbWFkdF9vZW1fY2hlY2ssCisJLmFwaWNfaWRfcmVnaXN0ZXJlZAkJPSBudW1hY2hpcF9hcGljX2lkX3JlZ2lzdGVyZWQsCisKKwkuaXJxX2RlbGl2ZXJ5X21vZGUJCT0gZGVzdF9GaXhlZCwKKwkuaXJxX2Rlc3RfbW9kZQkJCT0gMCwgLyogcGh5c2ljYWwgKi8KKworCS50YXJnZXRfY3B1cwkJCT0gbnVtYWNoaXBfdGFyZ2V0X2NwdXMsCisJLmRpc2FibGVfZXNyCQkJPSAwLAorCS5kZXN0X2xvZ2ljYWwJCQk9IDAsCisJLmNoZWNrX2FwaWNpZF91c2VkCQk9IE5VTEwsCisJLmNoZWNrX2FwaWNpZF9wcmVzZW50CQk9IE5VTEwsCisKKwkudmVjdG9yX2FsbG9jYXRpb25fZG9tYWluCT0gbnVtYWNoaXBfdmVjdG9yX2FsbG9jYXRpb25fZG9tYWluLAorCS5pbml0X2FwaWNfbGRyCQkJPSBmbGF0X2luaXRfYXBpY19sZHIsCisKKwkuaW9hcGljX3BoeXNfaWRfbWFwCQk9IE5VTEwsCisJLnNldHVwX2FwaWNfcm91dGluZwkJPSBOVUxMLAorCS5tdWx0aV90aW1lcl9jaGVjawkJPSBOVUxMLAorCS5jcHVfcHJlc2VudF90b19hcGljaWQJCT0gZGVmYXVsdF9jcHVfcHJlc2VudF90b19hcGljaWQsCisJLmFwaWNpZF90b19jcHVfcHJlc2VudAkJPSBOVUxMLAorCS5zZXR1cF9wb3J0aW9fcmVtYXAJCT0gTlVMTCwKKwkuY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudAk9IGRlZmF1bHRfY2hlY2tfcGh5c19hcGljaWRfcHJlc2VudCwKKwkuZW5hYmxlX2FwaWNfbW9kZQkJPSBOVUxMLAorCS5waHlzX3BrZ19pZAkJCT0gbnVtYWNoaXBfcGh5c19wa2dfaWQsCisJLm1wc19vZW1fY2hlY2sJCQk9IE5VTEwsCisKKwkuZ2V0X2FwaWNfaWQJCQk9IGdldF9hcGljX2lkLAorCS5zZXRfYXBpY19pZAkJCT0gc2V0X2FwaWNfaWQsCisJLmFwaWNfaWRfbWFzawkJCT0gMHhmZlUgPDwgMjQsCisKKwkuY3B1X21hc2tfdG9fYXBpY2lkCQk9IG51bWFjaGlwX2NwdV9tYXNrX3RvX2FwaWNpZCwKKwkuY3B1X21hc2tfdG9fYXBpY2lkX2FuZAkJPSBudW1hY2hpcF9jcHVfbWFza190b19hcGljaWRfYW5kLAorCisJLnNlbmRfSVBJX21hc2sJCQk9IG51bWFjaGlwX3NlbmRfSVBJX21hc2ssCisJLnNlbmRfSVBJX21hc2tfYWxsYnV0c2VsZgk9IG51bWFjaGlwX3NlbmRfSVBJX21hc2tfYWxsYnV0c2VsZiwKKwkuc2VuZF9JUElfYWxsYnV0c2VsZgkJPSBudW1hY2hpcF9zZW5kX0lQSV9hbGxidXRzZWxmLAorCS5zZW5kX0lQSV9hbGwJCQk9IG51bWFjaGlwX3NlbmRfSVBJX2FsbCwKKwkuc2VuZF9JUElfc2VsZgkJCT0gbnVtYWNoaXBfc2VuZF9JUElfc2VsZiwKKworCS53YWtldXBfc2Vjb25kYXJ5X2NwdQkJPSBudW1hY2hpcF93YWtldXBfc2Vjb25kYXJ5LAorCS50cmFtcG9saW5lX3BoeXNfbG93CQk9IERFRkFVTFRfVFJBTVBPTElORV9QSFlTX0xPVywKKwkudHJhbXBvbGluZV9waHlzX2hpZ2gJCT0gREVGQVVMVF9UUkFNUE9MSU5FX1BIWVNfSElHSCwKKwkud2FpdF9mb3JfaW5pdF9kZWFzc2VydAkJPSBOVUxMLAorCS5zbXBfY2FsbGluX2NsZWFyX2xvY2FsX2FwaWMJPSBOVUxMLAorCS5pbnF1aXJlX3JlbW90ZV9hcGljCQk9IE5VTEwsIC8qIFJFTVJEIG5vdCBzdXBwb3J0ZWQgKi8KKworCS5yZWFkCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3JlYWQsCisJLndyaXRlCQkJCT0gbmF0aXZlX2FwaWNfbWVtX3dyaXRlLAorCS5pY3JfcmVhZAkJCT0gbmF0aXZlX2FwaWNfaWNyX3JlYWQsCisJLmljcl93cml0ZQkJCT0gbmF0aXZlX2FwaWNfaWNyX3dyaXRlLAorCS53YWl0X2ljcl9pZGxlCQkJPSBuYXRpdmVfYXBpY193YWl0X2ljcl9pZGxlLAorCS5zYWZlX3dhaXRfaWNyX2lkbGUJCT0gbmF0aXZlX3NhZmVfYXBpY193YWl0X2ljcl9pZGxlLAorfTsKK2FwaWNfZHJpdmVyKGFwaWNfbnVtYWNoaXApOworCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKaW5kZXggNmQ5MzlkNy4uZmIwNzI3NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwpAQCAtMjQyMSw4ICsyNDIxLDggQEAKIAl1bnNpZ25lZCB2ZWN0b3IsIG1lOwogCiAJYWNrX0FQSUNfaXJxKCk7Ci0JZXhpdF9pZGxlKCk7CiAJaXJxX2VudGVyKCk7CisJZXhpdF9pZGxlKCk7CiAKIAltZSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlmb3IgKHZlY3RvciA9IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUjsgdmVjdG9yIDwgTlJfVkVDVE9SUzsgdmVjdG9yKyspIHsKQEAgLTI5NDgsNiArMjk0OCwxMCBAQAogCX0KIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWFwaWNfcHJpbnRrKEFQSUNfUVVJRVQsIEtFUk5fSU5GTyAiLi4uLi4gZmFpbGVkIDooLlxuIik7CisJaWYgKHgyYXBpY19wcmVlbmFibGVkKQorCQlhcGljX3ByaW50ayhBUElDX1FVSUVULCBLRVJOX0lORk8KKwkJCSAgICAiUGVyaGFwcyBwcm9ibGVtIHdpdGggdGhlIHByZS1lbmFibGVkIHgyYXBpYyBtb2RlXG4iCisJCQkgICAgIlRyeSBib290aW5nIHdpdGggeDJhcGljIGFuZCBpbnRlcnJ1cHQtcmVtYXBwaW5nIGRpc2FibGVkIGluIHRoZSBiaW9zLlxuIik7CiAJcGFuaWMoIklPLUFQSUMgKyB0aW1lciBkb2Vzbid0IHdvcmshICBCb290IHdpdGggYXBpYz1kZWJ1ZyBhbmQgc2VuZCBhICIKIAkJInJlcG9ydC4gIFRoZW4gdHJ5IGJvb3Rpbmcgd2l0aCB0aGUgJ25vYXBpYycgb3B0aW9uLlxuIik7CiBvdXQ6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwppbmRleCA2MmFlMzAwLi45ZDU5YmJhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKQEAgLTkzLDYgKzkzLDggQEAKIAogCWlmIChub2RlX2lkLnMucGFydF9udW1iZXIgPT0gVVYyX0hVQl9QQVJUX05VTUJFUikKIAkJdXZfbWluX2h1Yl9yZXZpc2lvbl9pZCArPSBVVjJfSFVCX1JFVklTSU9OX0JBU0UgLSAxOworCWlmIChub2RlX2lkLnMucGFydF9udW1iZXIgPT0gVVYyX0hVQl9QQVJUX05VTUJFUl9YKQorCQl1dl9taW5faHViX3JldmlzaW9uX2lkICs9IFVWMl9IVUJfUkVWSVNJT05fQkFTRSAtIDE7CiAKIAl1dl9odWJfaW5mby0+aHViX3JldmlzaW9uID0gdXZfbWluX2h1Yl9yZXZpc2lvbl9pZDsKIAlwbm9kZSA9IChub2RlX2lkLnMubm9kZV9pZCA+PiAxKSAmICgoMSA8PCBtX25fY29uZmlnLnMubl9za3QpIC0gMSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY2hlY2suYyBiL2FyY2gveDg2L2tlcm5lbC9jaGVjay5jCmluZGV4IDQ1MjkzMmQuLjVkYTEyNjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jaGVjay5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jaGVjay5jCkBAIC02Miw3ICs2Miw4IEBACiAKIHZvaWQgX19pbml0IHNldHVwX2Jpb3NfY29ycnVwdGlvbl9jaGVjayh2b2lkKQogewotCXU2NCBhZGRyID0gUEFHRV9TSVpFOwkvKiBhc3N1bWUgZmlyc3QgcGFnZSBpcyByZXNlcnZlZCBhbnl3YXkgKi8KKwlwaHlzX2FkZHJfdCBzdGFydCwgZW5kOworCXU2NCBpOwogCiAJaWYgKG1lbW9yeV9jb3JydXB0aW9uX2NoZWNrID09IC0xKSB7CiAJCW1lbW9yeV9jb3JydXB0aW9uX2NoZWNrID0KQEAgLTgyLDI4ICs4MywyMyBAQAogCiAJY29ycnVwdGlvbl9jaGVja19zaXplID0gcm91bmRfdXAoY29ycnVwdGlvbl9jaGVja19zaXplLCBQQUdFX1NJWkUpOwogCi0Jd2hpbGUgKGFkZHIgPCBjb3JydXB0aW9uX2NoZWNrX3NpemUgJiYgbnVtX3NjYW5fYXJlYXMgPCBNQVhfU0NBTl9BUkVBUykgewotCQl1NjQgc2l6ZTsKLQkJYWRkciA9IG1lbWJsb2NrX3g4Nl9maW5kX2luX3JhbmdlX3NpemUoYWRkciwgJnNpemUsIFBBR0VfU0laRSk7CisJZm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UoaSwgTUFYX05VTU5PREVTLCAmc3RhcnQsICZlbmQsIE5VTEwpIHsKKwkJc3RhcnQgPSBjbGFtcF90KHBoeXNfYWRkcl90LCByb3VuZF91cChzdGFydCwgUEFHRV9TSVpFKSwKKwkJCQlQQUdFX1NJWkUsIGNvcnJ1cHRpb25fY2hlY2tfc2l6ZSk7CisJCWVuZCA9IGNsYW1wX3QocGh5c19hZGRyX3QsIHJvdW5kX2Rvd24oZW5kLCBQQUdFX1NJWkUpLAorCQkJICAgICAgUEFHRV9TSVpFLCBjb3JydXB0aW9uX2NoZWNrX3NpemUpOworCQlpZiAoc3RhcnQgPj0gZW5kKQorCQkJY29udGludWU7CiAKLQkJaWYgKGFkZHIgPT0gTUVNQkxPQ0tfRVJST1IpCi0JCQlicmVhazsKLQotCQlpZiAoYWRkciA+PSBjb3JydXB0aW9uX2NoZWNrX3NpemUpCi0JCQlicmVhazsKLQotCQlpZiAoKGFkZHIgKyBzaXplKSA+IGNvcnJ1cHRpb25fY2hlY2tfc2l6ZSkKLQkJCXNpemUgPSBjb3JydXB0aW9uX2NoZWNrX3NpemUgLSBhZGRyOwotCi0JCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKGFkZHIsIGFkZHIgKyBzaXplLCAiU0NBTiBSQU0iKTsKLQkJc2Nhbl9hcmVhc1tudW1fc2Nhbl9hcmVhc10uYWRkciA9IGFkZHI7Ci0JCXNjYW5fYXJlYXNbbnVtX3NjYW5fYXJlYXNdLnNpemUgPSBzaXplOwotCQludW1fc2Nhbl9hcmVhcysrOworCQltZW1ibG9ja19yZXNlcnZlKHN0YXJ0LCBlbmQgLSBzdGFydCk7CisJCXNjYW5fYXJlYXNbbnVtX3NjYW5fYXJlYXNdLmFkZHIgPSBzdGFydDsKKwkJc2Nhbl9hcmVhc1tudW1fc2Nhbl9hcmVhc10uc2l6ZSA9IGVuZCAtIHN0YXJ0OwogCiAJCS8qIEFzc3VtZSB3ZSd2ZSBhbHJlYWR5IG1hcHBlZCB0aGlzIGVhcmx5IG1lbW9yeSAqLwotCQltZW1zZXQoX192YShhZGRyKSwgMCwgc2l6ZSk7CisJCW1lbXNldChfX3ZhKHN0YXJ0KSwgMCwgZW5kIC0gc3RhcnQpOwogCi0JCWFkZHIgKz0gc2l6ZTsKKwkJaWYgKCsrbnVtX3NjYW5fYXJlYXMgPj0gTUFYX1NDQU5fQVJFQVMpCisJCQlicmVhazsKIAl9CiAKIAlpZiAobnVtX3NjYW5fYXJlYXMpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwppbmRleCBjN2U0NmNiLi5mNDc3M2Y0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKQEAgLTE0OCw3ICsxNDgsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgYW1kX2s3X3NtcF9jaGVjayhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7Ci0jaWZkZWYgQ09ORklHX1NNUAogCS8qIGNhbGxpbmcgaXMgZnJvbSBpZGVudGlmeV9zZWNvbmRhcnlfY3B1KCkgPyAqLwogCWlmICghYy0+Y3B1X2luZGV4KQogCQlyZXR1cm47CkBAIC0xOTIsNyArMTkxLDYgQEAKIAogdmFsaWRfazc6CiAJOwotI2VuZGlmCiB9CiAKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCBpbml0X2FtZF9rNyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCkBAIC0zNTMsNiArMzUxLDEzIEBACiAJaWYgKG5vZGUgPT0gTlVNQV9OT19OT0RFKQogCQlub2RlID0gcGVyX2NwdShjcHVfbGxjX2lkLCBjcHUpOwogCisJLyoKKwkgKiBJZiBjb3JlIG51bWJlcnMgYXJlIGluY29uc2lzdGVudCwgaXQncyBsaWtlbHkgYSBtdWx0aS1mYWJyaWMgcGxhdGZvcm0sCisJICogc28gaW52b2tlIHBsYXRmb3JtLXNwZWNpZmljIGhhbmRsZXIKKwkgKi8KKwlpZiAoYy0+cGh5c19wcm9jX2lkICE9IG5vZGUpCisJCXg4Nl9jcHVpbml0LmZpeHVwX2NwdV9pZChjLCBub2RlKTsKKwogCWlmICghbm9kZV9vbmxpbmUobm9kZSkpIHsKIAkJLyoKIAkJICogVHdvIHBvc3NpYmlsaXRpZXMgaGVyZToKQEAgLTQ0Miw4ICs0NDcsNiBAQAogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgZWFybHlfaW5pdF9hbWQoc3RydWN0IGNwdWluZm9feDg2ICpjKQogewotCXUzMiBkdW1teTsKLQogCWVhcmx5X2luaXRfYW1kX21jKGMpOwogCiAJLyoKQEAgLTQ3MywxMiArNDc2LDEyIEBACiAJCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9FWFREX0FQSUNJRCk7CiAJfQogI2VuZGlmCi0KLQlyZG1zcl9zYWZlKE1TUl9BTUQ2NF9QQVRDSF9MRVZFTCwgJmMtPm1pY3JvY29kZSwgJmR1bW15KTsKIH0KIAogc3RhdGljIHZvaWQgX19jcHVpbml0IGluaXRfYW1kKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKIHsKKwl1MzIgZHVtbXk7CisKICNpZmRlZiBDT05GSUdfU01QCiAJdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlOwogCkBAIC02NTcsNiArNjYwLDggQEAKIAkJCWNoZWNraW5nX3dybXNybChNU1JfQU1ENjRfTUN4X01BU0soNCksIG1hc2spOwogCQl9CiAJfQorCisJcmRtc3Jfc2FmZShNU1JfQU1ENjRfUEFUQ0hfTEVWRUwsICZjLT5taWNyb2NvZGUsICZkdW1teSk7CiB9CiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NlbnRhdXIuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY2VudGF1ci5jCmluZGV4IGU1OGQ5NzguLjE1OTEwM2MgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY2VudGF1ci5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY2VudGF1ci5jCkBAIC0yNzgsNyArMjc4LDcgQEAKIAl9CiAjaWZkZWYgQ09ORklHX1g4Nl8zMgogCS8qIEN5cml4IElJSSBmYW1pbHkgbmVlZHMgQ1g4ICYgUEdFIGV4cGxpY2l0bHkgZW5hYmxlZC4gKi8KLQlpZiAoYy0+eDg2X21vZGVsID49IDYgJiYgYy0+eDg2X21vZGVsIDw9IDkpIHsKKwlpZiAoYy0+eDg2X21vZGVsID49IDYgJiYgYy0+eDg2X21vZGVsIDw9IDEzKSB7CiAJCXJkbXNyKE1TUl9WSUFfRkNSLCBsbywgaGkpOwogCQlsbyB8PSAoMTw8MSB8IDE8PDcpOwogCQl3cm1zcihNU1JfVklBX0ZDUiwgbG8sIGhpKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCmluZGV4IGFhMDAzYjEuLjg1MGYyOTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYwpAQCAtNjc2LDkgKzY3Niw3IEBACiAJaWYgKHRoaXNfY3B1LT5jX2Vhcmx5X2luaXQpCiAJCXRoaXNfY3B1LT5jX2Vhcmx5X2luaXQoYyk7CiAKLSNpZmRlZiBDT05GSUdfU01QCiAJYy0+Y3B1X2luZGV4ID0gMDsKLSNlbmRpZgogCWZpbHRlcl9jcHVpZF9mZWF0dXJlcyhjLCBmYWxzZSk7CiAKIAlzZXR1cF9zbWVwKGMpOwpAQCAtNzY0LDEwICs3NjIsNyBAQAogCQljLT5hcGljaWQgPSBjLT5pbml0aWFsX2FwaWNpZDsKICMgZW5kaWYKICNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1g4Nl9IVAogCQljLT5waHlzX3Byb2NfaWQgPSBjLT5pbml0aWFsX2FwaWNpZDsKLSNlbmRpZgogCX0KIAogCXNldHVwX3NtZXAoYyk7CkBAIC0xMTQxLDYgKzExMzYsMTUgQEAKICNlbmRpZiAvKiAhIENPTkZJR19LR0RCICovCiAKIC8qCisgKiBQcmludHMgYW4gZXJyb3Igd2hlcmUgdGhlIE5VTUEgYW5kIGNvbmZpZ3VyZWQgY29yZS1udW1iZXIgbWlzbWF0Y2ggYW5kIHRoZQorICogcGxhdGZvcm0gZGlkbid0IG92ZXJyaWRlIHRoaXMgdG8gZml4IGl0IHVwCisgKi8KK3ZvaWQgX19jcHVpbml0IHg4Nl9kZWZhdWx0X2ZpeHVwX2NwdV9pZChzdHJ1Y3QgY3B1aW5mb194ODYgKmMsIGludCBub2RlKQoreworCXByX2VycigiTlVNQSBjb3JlIG51bWJlciAlZCBkaWZmZXJzIGZyb20gY29uZmlndXJlZCBjb3JlIG51bWJlciAlZFxuIiwgbm9kZSwgYy0+cGh5c19wcm9jX2lkKTsKK30KKworLyoKICAqIGNwdV9pbml0KCkgaW5pdGlhbGl6ZXMgc3RhdGUgdGhhdCBpcyBwZXItQ1BVLiBTb21lIGRhdGEgaXMgYWxyZWFkeQogICogaW5pdGlhbGl6ZWQgKG5hdHVyYWxseSkgaW4gdGhlIGJvb3RzdHJhcCBwcm9jZXNzLCBzdWNoIGFzIHRoZSBHRFQKICAqIGFuZCBJRFQuIFdlIHJlbG9hZCB0aGVtIG5ldmVydGhlbGVzcywgdGhpcyBmdW5jdGlvbiBhY3RzIGFzIGEKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1LmggYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdS5oCmluZGV4IDFiMjJkY2MuLjhiYWNjNzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1LmgKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHUuaApAQCAtMSw1ICsxLDQgQEAKICNpZm5kZWYgQVJDSF9YODZfQ1BVX0gKLQogI2RlZmluZSBBUkNIX1g4Nl9DUFVfSAogCiBzdHJ1Y3QgY3B1X21vZGVsX2luZm8gewpAQCAtMzUsNiArMzQsNCBAQAogCiBleHRlcm4gdm9pZCBnZXRfY3B1X2NhcChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwogZXh0ZXJuIHZvaWQgY3B1X2RldGVjdF9jYWNoZV9zaXplcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpOwotZXh0ZXJuIHZvaWQgZ2V0X2NwdV9jYXAoc3RydWN0IGNwdWluZm9feDg2ICpjKTsKLQotI2VuZGlmCisjZW5kaWYgLyogQVJDSF9YODZfQ1BVX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYwppbmRleCA1MjMxMzEyLi4zZTZmZjZjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCkBAIC0xODEsNyArMTgxLDYgQEAKIAogc3RhdGljIHZvaWQgX19jcHVpbml0IGludGVsX3NtcF9jaGVjayhzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7Ci0jaWZkZWYgQ09ORklHX1NNUAogCS8qIGNhbGxpbmcgaXMgZnJvbSBpZGVudGlmeV9zZWNvbmRhcnlfY3B1KCkgPyAqLwogCWlmICghYy0+Y3B1X2luZGV4KQogCQlyZXR1cm47CkBAIC0xOTgsNyArMTk3LDYgQEAKIAkJV0FSTl9PTkNFKDEsICJXQVJOSU5HOiBTTVAgb3BlcmF0aW9uIG1heSBiZSB1bnJlbGlhYmxlIgogCQkJCSAgICAid2l0aCBCIHN0ZXBwaW5nIHByb2Nlc3NvcnMuXG4iKTsKIAl9Ci0jZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgX19jcHVpbml0IGludGVsX3dvcmthcm91bmRzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1pbmplY3QuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZS1pbmplY3QuYwppbmRleCAzMTk4ODJlLi5mYzRiZWIzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UtaW5qZWN0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLWluamVjdC5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVlbXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CiAjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KQEAgLTkyLDYgKzkzLDE4IEBACiAJcmV0dXJuIE5NSV9IQU5ETEVEOwogfQogCitzdGF0aWMgdm9pZCBtY2VfaXJxX2lwaSh2b2lkICppbmZvKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IG1jZSAqbSA9ICZfX2dldF9jcHVfdmFyKGluamVjdG0pOworCisJaWYgKGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBtY2VfaW5qZWN0X2NwdW1hc2spICYmCisJCQltLT5pbmplY3RfZmxhZ3MgJiBNQ0pfRVhDRVBUSU9OKSB7CisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbWNlX2luamVjdF9jcHVtYXNrKTsKKwkJcmFpc2VfZXhjZXB0aW9uKG0sIE5VTEwpOworCX0KK30KKwogLyogSW5qZWN0IG1jZSBvbiBjdXJyZW50IENQVSAqLwogc3RhdGljIGludCByYWlzZV9sb2NhbCh2b2lkKQogewpAQCAtMTM5LDkgKzE1MiwxMCBAQAogCQlyZXR1cm47CiAKICNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLQlpZiAobS0+aW5qZWN0X2ZsYWdzICYgTUNKX05NSV9CUk9BRENBU1QpIHsKKwlpZiAobS0+aW5qZWN0X2ZsYWdzICYgKE1DSl9JUlFfQlJBT0RDQVNUIHwgTUNKX05NSV9CUk9BRENBU1QpKSB7CiAJCXVuc2lnbmVkIGxvbmcgc3RhcnQ7CiAJCWludCBjcHU7CisKIAkJZ2V0X29ubGluZV9jcHVzKCk7CiAJCWNwdW1hc2tfY29weShtY2VfaW5qZWN0X2NwdW1hc2ssIGNwdV9vbmxpbmVfbWFzayk7CiAJCWNwdW1hc2tfY2xlYXJfY3B1KGdldF9jcHUoKSwgbWNlX2luamVjdF9jcHVtYXNrKTsKQEAgLTE1MSwxMyArMTY1LDI1IEBACiAJCQkgICAgTUNKX0NUWChtY3B1LT5pbmplY3RfZmxhZ3MpICE9IE1DSl9DVFhfUkFORE9NKQogCQkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbWNlX2luamVjdF9jcHVtYXNrKTsKIAkJfQotCQlpZiAoIWNwdW1hc2tfZW1wdHkobWNlX2luamVjdF9jcHVtYXNrKSkKLQkJCWFwaWMtPnNlbmRfSVBJX21hc2sobWNlX2luamVjdF9jcHVtYXNrLCBOTUlfVkVDVE9SKTsKKwkJaWYgKCFjcHVtYXNrX2VtcHR5KG1jZV9pbmplY3RfY3B1bWFzaykpIHsKKwkJCWlmIChtLT5pbmplY3RfZmxhZ3MgJiBNQ0pfSVJRX0JSQU9EQ0FTVCkgeworCQkJCS8qCisJCQkJICogZG9uJ3Qgd2FpdCBiZWNhdXNlIG1jZV9pcnFfaXBpIGlzIG5lY2Vzc2FyeQorCQkJCSAqIHRvIGJlIHN5bmMgd2l0aCBmb2xsb3dpbmcgcmFpc2VfbG9jYWwKKwkJCQkgKi8KKwkJCQlwcmVlbXB0X2Rpc2FibGUoKTsKKwkJCQlzbXBfY2FsbF9mdW5jdGlvbl9tYW55KG1jZV9pbmplY3RfY3B1bWFzaywKKwkJCQkJbWNlX2lycV9pcGksIE5VTEwsIDApOworCQkJCXByZWVtcHRfZW5hYmxlKCk7CisJCQl9IGVsc2UgaWYgKG0tPmluamVjdF9mbGFncyAmIE1DSl9OTUlfQlJPQURDQVNUKQorCQkJCWFwaWMtPnNlbmRfSVBJX21hc2sobWNlX2luamVjdF9jcHVtYXNrLAorCQkJCQkJTk1JX1ZFQ1RPUik7CisJCX0KIAkJc3RhcnQgPSBqaWZmaWVzOwogCQl3aGlsZSAoIWNwdW1hc2tfZW1wdHkobWNlX2luamVjdF9jcHVtYXNrKSkgewogCQkJaWYgKCF0aW1lX2JlZm9yZShqaWZmaWVzLCBzdGFydCArIDIqSFopKSB7CiAJCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJIlRpbWVvdXQgd2FpdGluZyBmb3IgbWNlIGluamVjdCBOTUkgJWx4XG4iLAorCQkJCSJUaW1lb3V0IHdhaXRpbmcgZm9yIG1jZSBpbmplY3QgJWx4XG4iLAogCQkJCQkqY3B1bWFza19iaXRzKG1jZV9pbmplY3RfY3B1bWFzaykpOwogCQkJCWJyZWFrOwogCQkJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYwppbmRleCAyYWYxMjdkLi5jYmU4MmI1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2UuYwpAQCAtOTUsMTMgKzk1LDYgQEAKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgbWNlLCBtY2VzX3NlZW4pOwogc3RhdGljIGludAkJCWNwdV9taXNzaW5nOwogCi0vKgotICogQ1BVL2NoaXBzZXQgc3BlY2lmaWMgRURBQyBjb2RlIGNhbiByZWdpc3RlciBhIG5vdGlmaWVyIGNhbGwgaGVyZSB0byBwcmludAotICogTUNFIGVycm9ycyBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm0uCi0gKi8KLUFUT01JQ19OT1RJRklFUl9IRUFEKHg4Nl9tY2VfZGVjb2Rlcl9jaGFpbik7Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ODZfbWNlX2RlY29kZXJfY2hhaW4pOwotCiAvKiBNQ0EgYmFua3MgcG9sbGVkIGJ5IHRoZSBwZXJpb2QgcG9sbGluZyB0aW1lciBmb3IgY29ycmVjdGVkIGV2ZW50cyAqLwogREVGSU5FX1BFUl9DUFUobWNlX2JhbmtzX3QsIG1jZV9wb2xsX2JhbmtzKSA9IHsKIAlbMCAuLi4gQklUU19UT19MT05HUyhNQVhfTlJfQkFOS1MpLTFdID0gfjBVTApAQCAtMTA5LDYgKzEwMiwxMiBAQAogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHdvcmtfc3RydWN0LCBtY2Vfd29yayk7CiAKKy8qCisgKiBDUFUvY2hpcHNldCBzcGVjaWZpYyBFREFDIGNvZGUgY2FuIHJlZ2lzdGVyIGEgbm90aWZpZXIgY2FsbCBoZXJlIHRvIHByaW50CisgKiBNQ0UgZXJyb3JzIGluIGEgaHVtYW4tcmVhZGFibGUgZm9ybS4KKyAqLworQVRPTUlDX05PVElGSUVSX0hFQUQoeDg2X21jZV9kZWNvZGVyX2NoYWluKTsKKwogLyogRG8gaW5pdGlhbCBpbml0aWFsaXphdGlvbiBvZiBhIHN0cnVjdCBtY2UgKi8KIHZvaWQgbWNlX3NldHVwKHN0cnVjdCBtY2UgKm0pCiB7CkBAIC0xMTksOSArMTE4LDcgQEAKIAltLT50aW1lID0gZ2V0X3NlY29uZHMoKTsKIAltLT5jcHV2ZW5kb3IgPSBib290X2NwdV9kYXRhLng4Nl92ZW5kb3I7CiAJbS0+Y3B1aWQgPSBjcHVpZF9lYXgoMSk7Ci0jaWZkZWYgQ09ORklHX1NNUAogCW0tPnNvY2tldGlkID0gY3B1X2RhdGEobS0+ZXh0Y3B1KS5waHlzX3Byb2NfaWQ7Ci0jZW5kaWYKIAltLT5hcGljaWQgPSBjcHVfZGF0YShtLT5leHRjcHUpLmluaXRpYWxfYXBpY2lkOwogCXJkbXNybChNU1JfSUEzMl9NQ0dfQ0FQLCBtLT5tY2djYXApOwogfQpAQCAtMTkwLDYgKzE4Nyw1NyBAQAogCXNldF9iaXQoMCwgJm1jZV9uZWVkX25vdGlmeSk7CiB9CiAKK3N0YXRpYyB2b2lkIGRyYWluX21jZWxvZ19idWZmZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgbmV4dCwgaSwgcHJldiA9IDA7CisKKwluZXh0ID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrX21jZShtY2Vsb2cubmV4dCk7CisKKwlkbyB7CisJCXN0cnVjdCBtY2UgKm07CisKKwkJLyogZHJhaW4gd2hhdCB3YXMgbG9nZ2VkIGR1cmluZyBib290ICovCisJCWZvciAoaSA9IHByZXY7IGkgPCBuZXh0OyBpKyspIHsKKwkJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBqaWZmaWVzOworCQkJdW5zaWduZWQgcmV0cmllcyA9IDE7CisKKwkJCW0gPSAmbWNlbG9nLmVudHJ5W2ldOworCisJCQl3aGlsZSAoIW0tPmZpbmlzaGVkKSB7CisJCQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgc3RhcnQgKyAyKnJldHJpZXMpKQorCQkJCQlyZXRyaWVzKys7CisKKwkJCQljcHVfcmVsYXgoKTsKKworCQkJCWlmICghbS0+ZmluaXNoZWQgJiYgcmV0cmllcyA+PSA0KSB7CisJCQkJCXByX2VycigiTUNFOiBza2lwcGluZyBlcnJvciBiZWluZyBsb2dnZWQgY3VycmVudGx5IVxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXNtcF9ybWIoKTsKKwkJCWF0b21pY19ub3RpZmllcl9jYWxsX2NoYWluKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sIDAsIG0pOworCQl9CisKKwkJbWVtc2V0KG1jZWxvZy5lbnRyeSArIHByZXYsIDAsIChuZXh0IC0gcHJldikgKiBzaXplb2YoKm0pKTsKKwkJcHJldiA9IG5leHQ7CisJCW5leHQgPSBjbXB4Y2hnKCZtY2Vsb2cubmV4dCwgcHJldiwgMCk7CisJfSB3aGlsZSAobmV4dCAhPSBwcmV2KTsKK30KKworCit2b2lkIG1jZV9yZWdpc3Rlcl9kZWNvZGVfY2hhaW4oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJng4Nl9tY2VfZGVjb2Rlcl9jaGFpbiwgbmIpOworCWRyYWluX21jZWxvZ19idWZmZXIoKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jZV9yZWdpc3Rlcl9kZWNvZGVfY2hhaW4pOworCit2b2lkIG1jZV91bnJlZ2lzdGVyX2RlY29kZV9jaGFpbihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sIG5iKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1jZV91bnJlZ2lzdGVyX2RlY29kZV9jaGFpbik7CisKIHN0YXRpYyB2b2lkIHByaW50X21jZShzdHJ1Y3QgbWNlICptKQogewogCWludCByZXQgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svbWNlX2FtZC5jCmluZGV4IGY1NDc0MjEuLjFkNzY4NzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9hbWQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfYW1kLmMKQEAgLTY0LDExICs2NCw5IEBACiB9Owogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB0aHJlc2hvbGRfYmFuayAqIFtOUl9CQU5LU10sIHRocmVzaG9sZF9iYW5rcyk7CiAKLSNpZmRlZiBDT05GSUdfU01QCiBzdGF0aWMgdW5zaWduZWQgY2hhciBzaGFyZWRfYmFua1tOUl9CQU5LU10gPSB7CiAJMCwgMCwgMCwgMCwgMQogfTsKLSNlbmRpZgogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgY2hhciwgYmFua19tYXApOwkvKiBzZWUgd2hpY2ggYmFua3MgYXJlIG9uICovCiAKQEAgLTIwMiwxMCArMjAwLDkgQEAKIAogCQkJaWYgKCFibG9jaykKIAkJCQlwZXJfY3B1KGJhbmtfbWFwLCBjcHUpIHw9ICgxIDw8IGJhbmspOwotI2lmZGVmIENPTkZJR19TTVAKIAkJCWlmIChzaGFyZWRfYmFua1tiYW5rXSAmJiBjLT5jcHVfY29yZV9pZCkKIAkJCQlicmVhazsKLSNlbmRpZgorCiAJCQlvZmZzZXQgPSBzZXR1cF9BUElDX21jZShvZmZzZXQsCiAJCQkJCQkoaGlnaCAmIE1BU0tfTFZUT0ZGX0hJKSA+PiAyMCk7CiAKQEAgLTUzMSw3ICs1MjgsNiBAQAogCiAJc3ByaW50ZihuYW1lLCAidGhyZXNob2xkX2JhbmslaSIsIGJhbmspOwogCi0jaWZkZWYgQ09ORklHX1NNUAogCWlmIChjcHVfZGF0YShjcHUpLmNwdV9jb3JlX2lkICYmIHNoYXJlZF9iYW5rW2JhbmtdKSB7CS8qIHN5bWxpbmsgKi8KIAkJaSA9IGNwdW1hc2tfZmlyc3QoY3B1X2xsY19zaGFyZWRfbWFzayhjcHUpKTsKIApAQCAtNTU4LDcgKzU1NCw2IEBACiAKIAkJZ290byBvdXQ7CiAJfQotI2VuZGlmCiAKIAliID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRocmVzaG9sZF9iYW5rKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFiKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svdGhlcm1fdGhyb3QuYwppbmRleCA3ODdlMDZjLi4zOWM2MDg5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay90aGVybV90aHJvdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3RoZXJtX3Rocm90LmMKQEAgLTMyMywxNyArMzIzLDYgQEAKIAogI2VuZGlmIC8qIENPTkZJR19TWVNGUyAqLwogCi0vKgotICogU2V0IHVwIHRoZSBtb3N0IHR3byBzaWduaWZpY2FudCBiaXQgdG8gbm90aWZ5IG1jZSBsb2cgdGhhdCB0aGlzIHRoZXJtYWwKLSAqIGV2ZW50IHR5cGUuCi0gKiBUaGlzIGlzIGEgdGVtcCBzb2x1dGlvbi4gTWF5IGJlIGNoYW5nZWQgaW4gdGhlIGZ1dHVyZSB3aXRoIG1jZSBsb2cKLSAqIGluZnJhc3R1cmUuCi0gKi8KLSNkZWZpbmUgQ09SRV9USFJPVFRMRUQJCSgwKQotI2RlZmluZSBDT1JFX1BPV0VSX0xJTUlUCSgoX191NjQpMSA8PCA2MikKLSNkZWZpbmUgUEFDS0FHRV9USFJPVFRMRUQJKChfX3U2NCkyIDw8IDYyKQotI2RlZmluZSBQQUNLQUdFX1BPV0VSX0xJTUlUCSgoX191NjQpMyA8PCA2MikKLQogc3RhdGljIHZvaWQgbm90aWZ5X3RocmVzaG9sZHMoX191NjQgbXNyX3ZhbCkKIHsKIAkvKiBjaGVjayB3aGV0aGVyIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciBpcyBkZWZpbmVkOwpAQCAtMzYzLDI3ICszNTIsMjMgQEAKIAlpZiAodGhlcm1fdGhyb3RfcHJvY2Vzcyhtc3JfdmFsICYgVEhFUk1fU1RBVFVTX1BST0NIT1QsCiAJCQkJVEhFUk1BTF9USFJPVFRMSU5HX0VWRU5ULAogCQkJCUNPUkVfTEVWRUwpICE9IDApCi0JCW1jZV9sb2dfdGhlcm1fdGhyb3RfZXZlbnQoQ09SRV9USFJPVFRMRUQgfCBtc3JfdmFsKTsKKwkJbWNlX2xvZ190aGVybV90aHJvdF9ldmVudChtc3JfdmFsKTsKIAogCWlmICh0aGlzX2NwdV9oYXMoWDg2X0ZFQVRVUkVfUExOKSkKLQkJaWYgKHRoZXJtX3Rocm90X3Byb2Nlc3MobXNyX3ZhbCAmIFRIRVJNX1NUQVRVU19QT1dFUl9MSU1JVCwKKwkJdGhlcm1fdGhyb3RfcHJvY2Vzcyhtc3JfdmFsICYgVEhFUk1fU1RBVFVTX1BPV0VSX0xJTUlULAogCQkJCQlQT1dFUl9MSU1JVF9FVkVOVCwKLQkJCQkJQ09SRV9MRVZFTCkgIT0gMCkKLQkJCW1jZV9sb2dfdGhlcm1fdGhyb3RfZXZlbnQoQ09SRV9QT1dFUl9MSU1JVCB8IG1zcl92YWwpOworCQkJCQlDT1JFX0xFVkVMKTsKIAogCWlmICh0aGlzX2NwdV9oYXMoWDg2X0ZFQVRVUkVfUFRTKSkgewogCQlyZG1zcmwoTVNSX0lBMzJfUEFDS0FHRV9USEVSTV9TVEFUVVMsIG1zcl92YWwpOwotCQlpZiAodGhlcm1fdGhyb3RfcHJvY2Vzcyhtc3JfdmFsICYgUEFDS0FHRV9USEVSTV9TVEFUVVNfUFJPQ0hPVCwKKwkJdGhlcm1fdGhyb3RfcHJvY2Vzcyhtc3JfdmFsICYgUEFDS0FHRV9USEVSTV9TVEFUVVNfUFJPQ0hPVCwKIAkJCQkJVEhFUk1BTF9USFJPVFRMSU5HX0VWRU5ULAotCQkJCQlQQUNLQUdFX0xFVkVMKSAhPSAwKQotCQkJbWNlX2xvZ190aGVybV90aHJvdF9ldmVudChQQUNLQUdFX1RIUk9UVExFRCB8IG1zcl92YWwpOworCQkJCQlQQUNLQUdFX0xFVkVMKTsKIAkJaWYgKHRoaXNfY3B1X2hhcyhYODZfRkVBVFVSRV9QTE4pKQotCQkJaWYgKHRoZXJtX3Rocm90X3Byb2Nlc3MobXNyX3ZhbCAmCisJCQl0aGVybV90aHJvdF9wcm9jZXNzKG1zcl92YWwgJgogCQkJCQlQQUNLQUdFX1RIRVJNX1NUQVRVU19QT1dFUl9MSU1JVCwKIAkJCQkJUE9XRVJfTElNSVRfRVZFTlQsCi0JCQkJCVBBQ0tBR0VfTEVWRUwpICE9IDApCi0JCQkJbWNlX2xvZ190aGVybV90aHJvdF9ldmVudChQQUNLQUdFX1BPV0VSX0xJTUlUCi0JCQkJCQkJICB8IG1zcl92YWwpOworCQkJCQlQQUNLQUdFX0xFVkVMKTsKIAl9CiB9CiAKQEAgLTM5Nyw4ICszODIsOCBAQAogCiBhc21saW5rYWdlIHZvaWQgc21wX3RoZXJtYWxfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQogewotCWV4aXRfaWRsZSgpOwogCWlycV9lbnRlcigpOworCWV4aXRfaWRsZSgpOwogCWluY19pcnFfc3RhdChpcnFfdGhlcm1hbF9jb3VudCk7CiAJc21wX3RoZXJtYWxfdmVjdG9yKCk7CiAJaXJxX2V4aXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL3RocmVzaG9sZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svdGhyZXNob2xkLmMKaW5kZXggZDc0NmRmMi4uYWE1NzhjYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svdGhyZXNob2xkLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tY2hlY2svdGhyZXNob2xkLmMKQEAgLTE5LDggKzE5LDggQEAKIAogYXNtbGlua2FnZSB2b2lkIHNtcF90aHJlc2hvbGRfaW50ZXJydXB0KHZvaWQpCiB7Ci0JZXhpdF9pZGxlKCk7CiAJaXJxX2VudGVyKCk7CisJZXhpdF9pZGxlKCk7CiAJaW5jX2lycV9zdGF0KGlycV90aHJlc2hvbGRfY291bnQpOwogCW1jZV90aHJlc2hvbGRfdmVjdG9yKCk7CiAJaXJxX2V4aXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCmluZGV4IGE3MWVmY2RiLi45N2IyNjM1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMKQEAgLTU0Nyw2ICs1NDcsNyBAQAogCiAJCWlmICh0bXAgIT0gbWFza19sbykgewogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXRycjogeW91ciBCSU9TIGhhcyBjb25maWd1cmVkIGFuIGluY29ycmVjdCBtYXNrLCBmaXhpbmcgaXQuXG4iKTsKKwkJCWFkZF90YWludChUQUlOVF9GSVJNV0FSRV9XT1JLQVJPVU5EKTsKIAkJCW1hc2tfbG8gPSB0bXA7CiAJCX0KIAl9CkBAIC02OTMsNiArNjk0LDcgQEAKIAogCS8qIERpc2FibGUgTVRSUnMsIGFuZCBzZXQgdGhlIGRlZmF1bHQgdHlwZSB0byB1bmNhY2hlZCAqLwogCW10cnJfd3Jtc3IoTVNSX01UUlJkZWZUeXBlLCBkZWZ0eXBlX2xvICYgfjB4Y2ZmLCBkZWZ0eXBlX2hpKTsKKwl3YmludmQoKTsKIH0KIAogc3RhdGljIHZvaWQgcG9zdF9zZXQodm9pZCkgX19yZWxlYXNlcyhzZXRfYXRvbWljaXR5X2xvY2spCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCmluZGV4IDY0MDg5MTAuLjVhZGNlMTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5jCkBAIC0zMTIsMTIgKzMxMiw4IEBACiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0JLyoKLQkgKiBEbyBub3QgYWxsb3cgY29uZmlnMSAoZXh0ZW5kZWQgcmVnaXN0ZXJzKSB0byBwcm9wYWdhdGUsCi0JICogdGhlcmUncyBubyBzYW5lIHVzZXItc3BhY2UgZ2VuZXJhbGl6YXRpb24geWV0OgotCSAqLwogCWlmIChhdHRyLT50eXBlID09IFBFUkZfVFlQRV9SQVcpCi0JCXJldHVybiAwOworCQlyZXR1cm4geDg2X3BtdV9leHRyYV9yZWdzKGV2ZW50LT5hdHRyLmNvbmZpZywgZXZlbnQpOwogCiAJaWYgKGF0dHItPnR5cGUgPT0gUEVSRl9UWVBFX0hXX0NBQ0hFKQogCQlyZXR1cm4gc2V0X2V4dF9od19hdHRyKGh3YywgZXZlbnQpOwpAQCAtNDg4LDE4ICs0ODQsMTk1IEBACiAJcmV0dXJuIGV2ZW50LT5wbXUgPT0gJnBtdTsKIH0KIAorLyoKKyAqIEV2ZW50IHNjaGVkdWxlciBzdGF0ZToKKyAqCisgKiBBc3NpZ24gZXZlbnRzIGl0ZXJhdGluZyBvdmVyIGFsbCBldmVudHMgYW5kIGNvdW50ZXJzLCBiZWdpbm5pbmcKKyAqIHdpdGggZXZlbnRzIHdpdGggbGVhc3Qgd2VpZ2h0cyBmaXJzdC4gS2VlcCB0aGUgY3VycmVudCBpdGVyYXRvcgorICogc3RhdGUgaW4gc3RydWN0IHNjaGVkX3N0YXRlLgorICovCitzdHJ1Y3Qgc2NoZWRfc3RhdGUgeworCWludAl3ZWlnaHQ7CisJaW50CWV2ZW50OwkJLyogZXZlbnQgaW5kZXggKi8KKwlpbnQJY291bnRlcjsJLyogY291bnRlciBpbmRleCAqLworCWludAl1bmFzc2lnbmVkOwkvKiBudW1iZXIgb2YgZXZlbnRzIHRvIGJlIGFzc2lnbmVkIGxlZnQgKi8KKwl1bnNpZ25lZCBsb25nIHVzZWRbQklUU19UT19MT05HUyhYODZfUE1DX0lEWF9NQVgpXTsKK307CisKKy8qIFRvdGFsIG1heCBpcyBYODZfUE1DX0lEWF9NQVgsIGJ1dCB3ZSBhcmUgTyhuISkgbGltaXRlZCAqLworI2RlZmluZQlTQ0hFRF9TVEFURVNfTUFYCTIKKworc3RydWN0IHBlcmZfc2NoZWQgeworCWludAkJCW1heF93ZWlnaHQ7CisJaW50CQkJbWF4X2V2ZW50czsKKwlzdHJ1Y3QgZXZlbnRfY29uc3RyYWludAkqKmNvbnN0cmFpbnRzOworCXN0cnVjdCBzY2hlZF9zdGF0ZQlzdGF0ZTsKKwlpbnQJCQlzYXZlZF9zdGF0ZXM7CisJc3RydWN0IHNjaGVkX3N0YXRlCXNhdmVkW1NDSEVEX1NUQVRFU19NQVhdOworfTsKKworLyoKKyAqIEluaXRpYWxpemUgaW50ZXJhdG9yIHRoYXQgcnVucyB0aHJvdWdoIGFsbCBldmVudHMgYW5kIGNvdW50ZXJzLgorICovCitzdGF0aWMgdm9pZCBwZXJmX3NjaGVkX2luaXQoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkLCBzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqKmMsCisJCQkgICAgaW50IG51bSwgaW50IHdtaW4sIGludCB3bWF4KQoreworCWludCBpZHg7CisKKwltZW1zZXQoc2NoZWQsIDAsIHNpemVvZigqc2NoZWQpKTsKKwlzY2hlZC0+bWF4X2V2ZW50cwk9IG51bTsKKwlzY2hlZC0+bWF4X3dlaWdodAk9IHdtYXg7CisJc2NoZWQtPmNvbnN0cmFpbnRzCT0gYzsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgbnVtOyBpZHgrKykgeworCQlpZiAoY1tpZHhdLT53ZWlnaHQgPT0gd21pbikKKwkJCWJyZWFrOworCX0KKworCXNjaGVkLT5zdGF0ZS5ldmVudAk9IGlkeDsJCS8qIHN0YXJ0IHdpdGggbWluIHdlaWdodCAqLworCXNjaGVkLT5zdGF0ZS53ZWlnaHQJPSB3bWluOworCXNjaGVkLT5zdGF0ZS51bmFzc2lnbmVkCT0gbnVtOworfQorCitzdGF0aWMgdm9pZCBwZXJmX3NjaGVkX3NhdmVfc3RhdGUoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkKQoreworCWlmIChXQVJOX09OX09OQ0Uoc2NoZWQtPnNhdmVkX3N0YXRlcyA+PSBTQ0hFRF9TVEFURVNfTUFYKSkKKwkJcmV0dXJuOworCisJc2NoZWQtPnNhdmVkW3NjaGVkLT5zYXZlZF9zdGF0ZXNdID0gc2NoZWQtPnN0YXRlOworCXNjaGVkLT5zYXZlZF9zdGF0ZXMrKzsKK30KKworc3RhdGljIGJvb2wgcGVyZl9zY2hlZF9yZXN0b3JlX3N0YXRlKHN0cnVjdCBwZXJmX3NjaGVkICpzY2hlZCkKK3sKKwlpZiAoIXNjaGVkLT5zYXZlZF9zdGF0ZXMpCisJCXJldHVybiBmYWxzZTsKKworCXNjaGVkLT5zYXZlZF9zdGF0ZXMtLTsKKwlzY2hlZC0+c3RhdGUgPSBzY2hlZC0+c2F2ZWRbc2NoZWQtPnNhdmVkX3N0YXRlc107CisKKwkvKiBjb250aW51ZSB3aXRoIG5leHQgY291bnRlcjogKi8KKwljbGVhcl9iaXQoc2NoZWQtPnN0YXRlLmNvdW50ZXIrKywgc2NoZWQtPnN0YXRlLnVzZWQpOworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBTZWxlY3QgYSBjb3VudGVyIGZvciB0aGUgY3VycmVudCBldmVudCB0byBzY2hlZHVsZS4gUmV0dXJuIHRydWUgb24KKyAqIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBib29sIF9fcGVyZl9zY2hlZF9maW5kX2NvdW50ZXIoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkKQoreworCXN0cnVjdCBldmVudF9jb25zdHJhaW50ICpjOworCWludCBpZHg7CisKKwlpZiAoIXNjaGVkLT5zdGF0ZS51bmFzc2lnbmVkKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoc2NoZWQtPnN0YXRlLmV2ZW50ID49IHNjaGVkLT5tYXhfZXZlbnRzKQorCQlyZXR1cm4gZmFsc2U7CisKKwljID0gc2NoZWQtPmNvbnN0cmFpbnRzW3NjaGVkLT5zdGF0ZS5ldmVudF07CisKKwkvKiBQcmVmZXIgZml4ZWQgcHVycG9zZSBjb3VudGVycyAqLworCWlmICh4ODZfcG11Lm51bV9jb3VudGVyc19maXhlZCkgeworCQlpZHggPSBYODZfUE1DX0lEWF9GSVhFRDsKKwkJZm9yX2VhY2hfc2V0X2JpdF9jb250KGlkeCwgYy0+aWR4bXNrLCBYODZfUE1DX0lEWF9NQVgpIHsKKwkJCWlmICghX190ZXN0X2FuZF9zZXRfYml0KGlkeCwgc2NoZWQtPnN0YXRlLnVzZWQpKQorCQkJCWdvdG8gZG9uZTsKKwkJfQorCX0KKwkvKiBHcmFiIHRoZSBmaXJzdCB1bnVzZWQgY291bnRlciBzdGFydGluZyB3aXRoIGlkeCAqLworCWlkeCA9IHNjaGVkLT5zdGF0ZS5jb3VudGVyOworCWZvcl9lYWNoX3NldF9iaXRfY29udChpZHgsIGMtPmlkeG1zaywgWDg2X1BNQ19JRFhfRklYRUQpIHsKKwkJaWYgKCFfX3Rlc3RfYW5kX3NldF9iaXQoaWR4LCBzY2hlZC0+c3RhdGUudXNlZCkpCisJCQlnb3RvIGRvbmU7CisJfQorCisJcmV0dXJuIGZhbHNlOworCitkb25lOgorCXNjaGVkLT5zdGF0ZS5jb3VudGVyID0gaWR4OworCisJaWYgKGMtPm92ZXJsYXApCisJCXBlcmZfc2NoZWRfc2F2ZV9zdGF0ZShzY2hlZCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgcGVyZl9zY2hlZF9maW5kX2NvdW50ZXIoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkKQoreworCXdoaWxlICghX19wZXJmX3NjaGVkX2ZpbmRfY291bnRlcihzY2hlZCkpIHsKKwkJaWYgKCFwZXJmX3NjaGVkX3Jlc3RvcmVfc3RhdGUoc2NoZWQpKQorCQkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKgorICogR28gdGhyb3VnaCBhbGwgdW5hc3NpZ25lZCBldmVudHMgYW5kIGZpbmQgdGhlIG5leHQgb25lIHRvIHNjaGVkdWxlLgorICogVGFrZSBldmVudHMgd2l0aCB0aGUgbGVhc3Qgd2VpZ2h0IGZpcnN0LiBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLgorICovCitzdGF0aWMgYm9vbCBwZXJmX3NjaGVkX25leHRfZXZlbnQoc3RydWN0IHBlcmZfc2NoZWQgKnNjaGVkKQoreworCXN0cnVjdCBldmVudF9jb25zdHJhaW50ICpjOworCisJaWYgKCFzY2hlZC0+c3RhdGUudW5hc3NpZ25lZCB8fCAhLS1zY2hlZC0+c3RhdGUudW5hc3NpZ25lZCkKKwkJcmV0dXJuIGZhbHNlOworCisJZG8geworCQkvKiBuZXh0IGV2ZW50ICovCisJCXNjaGVkLT5zdGF0ZS5ldmVudCsrOworCQlpZiAoc2NoZWQtPnN0YXRlLmV2ZW50ID49IHNjaGVkLT5tYXhfZXZlbnRzKSB7CisJCQkvKiBuZXh0IHdlaWdodCAqLworCQkJc2NoZWQtPnN0YXRlLmV2ZW50ID0gMDsKKwkJCXNjaGVkLT5zdGF0ZS53ZWlnaHQrKzsKKwkJCWlmIChzY2hlZC0+c3RhdGUud2VpZ2h0ID4gc2NoZWQtPm1heF93ZWlnaHQpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWMgPSBzY2hlZC0+Y29uc3RyYWludHNbc2NoZWQtPnN0YXRlLmV2ZW50XTsKKwl9IHdoaWxlIChjLT53ZWlnaHQgIT0gc2NoZWQtPnN0YXRlLndlaWdodCk7CisKKwlzY2hlZC0+c3RhdGUuY291bnRlciA9IDA7CS8qIHN0YXJ0IHdpdGggZmlyc3QgY291bnRlciAqLworCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBBc3NpZ24gYSBjb3VudGVyIGZvciBlYWNoIGV2ZW50LgorICovCitzdGF0aWMgaW50IHBlcmZfYXNzaWduX2V2ZW50cyhzdHJ1Y3QgZXZlbnRfY29uc3RyYWludCAqKmNvbnN0cmFpbnRzLCBpbnQgbiwKKwkJCSAgICAgIGludCB3bWluLCBpbnQgd21heCwgaW50ICphc3NpZ24pCit7CisJc3RydWN0IHBlcmZfc2NoZWQgc2NoZWQ7CisKKwlwZXJmX3NjaGVkX2luaXQoJnNjaGVkLCBjb25zdHJhaW50cywgbiwgd21pbiwgd21heCk7CisKKwlkbyB7CisJCWlmICghcGVyZl9zY2hlZF9maW5kX2NvdW50ZXIoJnNjaGVkKSkKKwkJCWJyZWFrOwkvKiBmYWlsZWQgKi8KKwkJaWYgKGFzc2lnbikKKwkJCWFzc2lnbltzY2hlZC5zdGF0ZS5ldmVudF0gPSBzY2hlZC5zdGF0ZS5jb3VudGVyOworCX0gd2hpbGUgKHBlcmZfc2NoZWRfbmV4dF9ldmVudCgmc2NoZWQpKTsKKworCXJldHVybiBzY2hlZC5zdGF0ZS51bmFzc2lnbmVkOworfQorCiBpbnQgeDg2X3NjaGVkdWxlX2V2ZW50cyhzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqY3B1YywgaW50IG4sIGludCAqYXNzaWduKQogewogCXN0cnVjdCBldmVudF9jb25zdHJhaW50ICpjLCAqY29uc3RyYWludHNbWDg2X1BNQ19JRFhfTUFYXTsKIAl1bnNpZ25lZCBsb25nIHVzZWRfbWFza1tCSVRTX1RPX0xPTkdTKFg4Nl9QTUNfSURYX01BWCldOwotCWludCBpLCBqLCB3LCB3bWF4LCBudW0gPSAwOworCWludCBpLCB3bWluLCB3bWF4LCBudW0gPSAwOwogCXN0cnVjdCBod19wZXJmX2V2ZW50ICpod2M7CiAKIAliaXRtYXBfemVybyh1c2VkX21hc2ssIFg4Nl9QTUNfSURYX01BWCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJZm9yIChpID0gMCwgd21pbiA9IFg4Nl9QTUNfSURYX01BWCwgd21heCA9IDA7IGkgPCBuOyBpKyspIHsKIAkJYyA9IHg4Nl9wbXUuZ2V0X2V2ZW50X2NvbnN0cmFpbnRzKGNwdWMsIGNwdWMtPmV2ZW50X2xpc3RbaV0pOwogCQljb25zdHJhaW50c1tpXSA9IGM7CisJCXdtaW4gPSBtaW4od21pbiwgYy0+d2VpZ2h0KTsKKwkJd21heCA9IG1heCh3bWF4LCBjLT53ZWlnaHQpOwogCX0KIAogCS8qCkBAIC01MjUsNTkgKzY5OCwxMSBAQAogCQlpZiAoYXNzaWduKQogCQkJYXNzaWduW2ldID0gaHdjLT5pZHg7CiAJfQotCWlmIChpID09IG4pCi0JCWdvdG8gZG9uZTsKIAotCS8qCi0JICogYmVnaW4gc2xvdyBwYXRoCi0JICovCisJLyogc2xvdyBwYXRoICovCisJaWYgKGkgIT0gbikKKwkJbnVtID0gcGVyZl9hc3NpZ25fZXZlbnRzKGNvbnN0cmFpbnRzLCBuLCB3bWluLCB3bWF4LCBhc3NpZ24pOwogCi0JYml0bWFwX3plcm8odXNlZF9tYXNrLCBYODZfUE1DX0lEWF9NQVgpOwotCi0JLyoKLQkgKiB3ZWlnaHQgPSBudW1iZXIgb2YgcG9zc2libGUgY291bnRlcnMKLQkgKgotCSAqIDEgICAgPSBtb3N0IGNvbnN0cmFpbmVkLCBvbmx5IHdvcmtzIG9uIG9uZSBjb3VudGVyCi0JICogd21heCA9IGxlYXN0IGNvbnN0cmFpbmVkLCB3b3JrcyBvbiBhbnkgY291bnRlcgotCSAqCi0JICogYXNzaWduIGV2ZW50cyB0byBjb3VudGVycyBzdGFydGluZyB3aXRoIG1vc3QKLQkgKiBjb25zdHJhaW5lZCBldmVudHMuCi0JICovCi0Jd21heCA9IHg4Nl9wbXUubnVtX2NvdW50ZXJzOwotCi0JLyoKLQkgKiB3aGVuIGZpeGVkIGV2ZW50IGNvdW50ZXJzIGFyZSBwcmVzZW50LAotCSAqIHdtYXggaXMgaW5jcmVtZW50ZWQgYnkgMSB0byBhY2NvdW50Ci0JICogZm9yIG9uZSBtb3JlIGNob2ljZQotCSAqLwotCWlmICh4ODZfcG11Lm51bV9jb3VudGVyc19maXhlZCkKLQkJd21heCsrOwotCi0JZm9yICh3ID0gMSwgbnVtID0gbjsgbnVtICYmIHcgPD0gd21heDsgdysrKSB7Ci0JCS8qIGZvciBlYWNoIGV2ZW50ICovCi0JCWZvciAoaSA9IDA7IG51bSAmJiBpIDwgbjsgaSsrKSB7Ci0JCQljID0gY29uc3RyYWludHNbaV07Ci0JCQlod2MgPSAmY3B1Yy0+ZXZlbnRfbGlzdFtpXS0+aHc7Ci0KLQkJCWlmIChjLT53ZWlnaHQgIT0gdykKLQkJCQljb250aW51ZTsKLQotCQkJZm9yX2VhY2hfc2V0X2JpdChqLCBjLT5pZHhtc2ssIFg4Nl9QTUNfSURYX01BWCkgewotCQkJCWlmICghdGVzdF9iaXQoaiwgdXNlZF9tYXNrKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmIChqID09IFg4Nl9QTUNfSURYX01BWCkKLQkJCQlicmVhazsKLQotCQkJX19zZXRfYml0KGosIHVzZWRfbWFzayk7Ci0KLQkJCWlmIChhc3NpZ24pCi0JCQkJYXNzaWduW2ldID0gajsKLQkJCW51bS0tOwotCQl9Ci0JfQotZG9uZToKIAkvKgogCSAqIHNjaGVkdWxpbmcgZmFpbGVkIG9yIGlzIGp1c3QgYSBzaW11bGF0aW9uLAogCSAqIGZyZWUgcmVzb3VyY2VzIGlmIG5lY2Vzc2FyeQpAQCAtNTg4LDcgKzcxMyw3IEBACiAJCQkJeDg2X3BtdS5wdXRfZXZlbnRfY29uc3RyYWludHMoY3B1YywgY3B1Yy0+ZXZlbnRfbGlzdFtpXSk7CiAJCX0KIAl9Ci0JcmV0dXJuIG51bSA/IC1FTk9TUEMgOiAwOworCXJldHVybiBudW0gPyAtRUlOVkFMIDogMDsKIH0KIAogLyoKQEAgLTYwNyw3ICs3MzIsNyBAQAogCiAJaWYgKGlzX3g4Nl9ldmVudChsZWFkZXIpKSB7CiAJCWlmIChuID49IG1heF9jb3VudCkKLQkJCXJldHVybiAtRU5PU1BDOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWNwdWMtPmV2ZW50X2xpc3Rbbl0gPSBsZWFkZXI7CiAJCW4rKzsKIAl9CkBAIC02MjAsNyArNzQ1LDcgQEAKIAkJCWNvbnRpbnVlOwogCiAJCWlmIChuID49IG1heF9jb3VudCkKLQkJCXJldHVybiAtRU5PU1BDOworCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJY3B1Yy0+ZXZlbnRfbGlzdFtuXSA9IGV2ZW50OwogCQluKys7CkBAIC0xMTIzLDYgKzEyNDgsNyBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2h3X3BlcmZfZXZlbnRzKHZvaWQpCiB7CisJc3RydWN0IHg4Nl9wbXVfcXVpcmsgKnF1aXJrOwogCXN0cnVjdCBldmVudF9jb25zdHJhaW50ICpjOwogCWludCBlcnI7CiAKQEAgLTExNTEsOCArMTI3Nyw4IEBACiAKIAlwcl9jb250KCIlcyBQTVUgZHJpdmVyLlxuIiwgeDg2X3BtdS5uYW1lKTsKIAotCWlmICh4ODZfcG11LnF1aXJrcykKLQkJeDg2X3BtdS5xdWlya3MoKTsKKwlmb3IgKHF1aXJrID0geDg2X3BtdS5xdWlya3M7IHF1aXJrOyBxdWlyayA9IHF1aXJrLT5uZXh0KQorCQlxdWlyay0+ZnVuYygpOwogCiAJaWYgKHg4Nl9wbXUubnVtX2NvdW50ZXJzID4gWDg2X1BNQ19NQVhfR0VORVJJQykgewogCQlXQVJOKDEsIEtFUk5fRVJSICJodyBwZXJmIGV2ZW50cyAlZCA+IG1heCglZCksIGNsaXBwaW5nISIsCkBAIC0xMTc1LDEyICsxMzAxLDE4IEBACiAKIAl1bmNvbnN0cmFpbmVkID0gKHN0cnVjdCBldmVudF9jb25zdHJhaW50KQogCQlfX0VWRU5UX0NPTlNUUkFJTlQoMCwgKDFVTEwgPDwgeDg2X3BtdS5udW1fY291bnRlcnMpIC0gMSwKLQkJCQkgICAwLCB4ODZfcG11Lm51bV9jb3VudGVycyk7CisJCQkJICAgMCwgeDg2X3BtdS5udW1fY291bnRlcnMsIDApOwogCiAJaWYgKHg4Nl9wbXUuZXZlbnRfY29uc3RyYWludHMpIHsKKwkJLyoKKwkJICogZXZlbnQgb24gZml4ZWQgY291bnRlcjIgKFJFRl9DWUNMRVMpIG9ubHkgd29ya3Mgb24gdGhpcworCQkgKiBjb3VudGVyLCBzbyBkbyBub3QgZXh0ZW5kIG1hc2sgdG8gZ2VuZXJpYyBjb3VudGVycworCQkgKi8KIAkJZm9yX2VhY2hfZXZlbnRfY29uc3RyYWludChjLCB4ODZfcG11LmV2ZW50X2NvbnN0cmFpbnRzKSB7Ci0JCQlpZiAoYy0+Y21hc2sgIT0gWDg2X1JBV19FVkVOVF9NQVNLKQorCQkJaWYgKGMtPmNtYXNrICE9IFg4Nl9SQVdfRVZFTlRfTUFTSworCQkJICAgIHx8IGMtPmlkeG1zazY0ID09IFg4Nl9QTUNfTVNLX0ZJWEVEX1JFRl9DWUNMRVMpIHsKIAkJCQljb250aW51ZTsKKwkJCX0KIAogCQkJYy0+aWR4bXNrNjQgfD0gKDFVTEwgPDwgeDg2X3BtdS5udW1fY291bnRlcnMpIC0gMTsKIAkJCWMtPndlaWdodCArPSB4ODZfcG11Lm51bV9jb3VudGVyczsKQEAgLTEzMTYsNyArMTQ0OCw3IEBACiAJYyA9IHg4Nl9wbXUuZ2V0X2V2ZW50X2NvbnN0cmFpbnRzKGZha2VfY3B1YywgZXZlbnQpOwogCiAJaWYgKCFjIHx8ICFjLT53ZWlnaHQpCi0JCXJldCA9IC1FTk9TUEM7CisJCXJldCA9IC1FSU5WQUw7CiAKIAlpZiAoeDg2X3BtdS5wdXRfZXZlbnRfY29uc3RyYWludHMpCiAJCXg4Nl9wbXUucHV0X2V2ZW50X2NvbnN0cmFpbnRzKGZha2VfY3B1YywgZXZlbnQpOwpAQCAtMTM0MSw3ICsxNDczLDcgQEAKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqbGVhZGVyID0gZXZlbnQtPmdyb3VwX2xlYWRlcjsKIAlzdHJ1Y3QgY3B1X2h3X2V2ZW50cyAqZmFrZV9jcHVjOwotCWludCByZXQgPSAtRU5PU1BDLCBuOworCWludCByZXQgPSAtRUlOVkFMLCBuOwogCiAJZmFrZV9jcHVjID0gYWxsb2NhdGVfZmFrZV9jcHVjKCk7CiAJaWYgKElTX0VSUihmYWtlX2NwdWMpKQpAQCAtMTU3MCwzICsxNzAyLDE1IEBACiAKIAlyZXR1cm4gbWlzYzsKIH0KKwordm9pZCBwZXJmX2dldF94ODZfcG11X2NhcGFiaWxpdHkoc3RydWN0IHg4Nl9wbXVfY2FwYWJpbGl0eSAqY2FwKQoreworCWNhcC0+dmVyc2lvbgkJPSB4ODZfcG11LnZlcnNpb247CisJY2FwLT5udW1fY291bnRlcnNfZ3AJPSB4ODZfcG11Lm51bV9jb3VudGVyczsKKwljYXAtPm51bV9jb3VudGVyc19maXhlZAk9IHg4Nl9wbXUubnVtX2NvdW50ZXJzX2ZpeGVkOworCWNhcC0+Yml0X3dpZHRoX2dwCT0geDg2X3BtdS5jbnR2YWxfYml0czsKKwljYXAtPmJpdF93aWR0aF9maXhlZAk9IHg4Nl9wbXUuY250dmFsX2JpdHM7CisJY2FwLT5ldmVudHNfbWFzawk9ICh1bnNpZ25lZCBpbnQpeDg2X3BtdS5ldmVudHNfbWFza2w7CisJY2FwLT5ldmVudHNfbWFza19sZW4JPSB4ODZfcG11LmV2ZW50c19tYXNrX2xlbjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHBlcmZfZ2V0X3g4Nl9wbXVfY2FwYWJpbGl0eSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnQuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5oCmluZGV4IGI5Njk4ZDQuLjg5NDQwNjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5oCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudC5oCkBAIC00NSw2ICs0NSw3IEBACiAJdTY0CWNvZGU7CiAJdTY0CWNtYXNrOwogCWludAl3ZWlnaHQ7CisJaW50CW92ZXJsYXA7CiB9OwogCiBzdHJ1Y3QgYW1kX25iIHsKQEAgLTE1MSwxNSArMTUyLDQwIEBACiAJdm9pZAkJCQkqa2ZyZWVfb25fb25saW5lOwogfTsKIAotI2RlZmluZSBfX0VWRU5UX0NPTlNUUkFJTlQoYywgbiwgbSwgdykge1wKKyNkZWZpbmUgX19FVkVOVF9DT05TVFJBSU5UKGMsIG4sIG0sIHcsIG8pIHtcCiAJeyAuaWR4bXNrNjQgPSAobikgfSwJCVwKIAkuY29kZSA9IChjKSwJCQlcCiAJLmNtYXNrID0gKG0pLAkJCVwKIAkud2VpZ2h0ID0gKHcpLAkJCVwKKwkub3ZlcmxhcCA9IChvKSwJCQlcCiB9CiAKICNkZWZpbmUgRVZFTlRfQ09OU1RSQUlOVChjLCBuLCBtKQlcCi0JX19FVkVOVF9DT05TVFJBSU5UKGMsIG4sIG0sIEhXRUlHSFQobikpCisJX19FVkVOVF9DT05TVFJBSU5UKGMsIG4sIG0sIEhXRUlHSFQobiksIDApCisKKy8qCisgKiBUaGUgb3ZlcmxhcCBmbGFnIG1hcmtzIGV2ZW50IGNvbnN0cmFpbnRzIHdpdGggb3ZlcmxhcHBpbmcgY291bnRlcgorICogbWFza3MuIFRoaXMgaXMgdGhlIGNhc2UgaWYgdGhlIGNvdW50ZXIgbWFzayBvZiBzdWNoIGFuIGV2ZW50IGlzIG5vdAorICogYSBzdWJzZXQgb2YgYW55IG90aGVyIGNvdW50ZXIgbWFzayBvZiBhIGNvbnN0cmFpbnQgd2l0aCBhbiBlcXVhbCBvcgorICogaGlnaGVyIHdlaWdodCwgZS5nLjoKKyAqCisgKiAgY19vdmVybGFwcyA9IEVWRU5UX0NPTlNUUkFJTlRfT1ZFUkxBUCgwLCAweDA5LCAwKTsKKyAqICBjX2Fub3RoZXIxID0gRVZFTlRfQ09OU1RSQUlOVCgwLCAweDA3LCAwKTsKKyAqICBjX2Fub3RoZXIyID0gRVZFTlRfQ09OU1RSQUlOVCgwLCAweDM4LCAwKTsKKyAqCisgKiBUaGUgZXZlbnQgc2NoZWR1bGVyIG1heSBub3Qgc2VsZWN0IHRoZSBjb3JyZWN0IGNvdW50ZXIgaW4gdGhlIGZpcnN0CisgKiBjeWNsZSBiZWNhdXNlIGl0IG5lZWRzIHRvIGtub3cgd2hpY2ggc3Vic2VxdWVudCBldmVudHMgd2lsbCBiZQorICogc2NoZWR1bGVkLiBJdCBtYXkgZmFpbCB0byBzY2hlZHVsZSB0aGUgZXZlbnRzIHRoZW4uIFNvIHdlIHNldCB0aGUKKyAqIG92ZXJsYXAgZmxhZyBmb3Igc3VjaCBjb25zdHJhaW50cyB0byBnaXZlIHRoZSBzY2hlZHVsZXIgYSBoaW50IHdoaWNoCisgKiBldmVudHMgdG8gc2VsZWN0IGZvciBjb3VudGVyIHJlc2NoZWR1bGluZy4KKyAqCisgKiBDYXJlIG11c3QgYmUgdGFrZW4gYXMgdGhlIHJlc2NoZWR1bGluZyBhbGdvcml0aG0gaXMgTyhuISkgd2hpY2gKKyAqIHdpbGwgaW5jcmVhc2Ugc2NoZWR1bGluZyBjeWNsZXMgZm9yIGFuIG92ZXItY29tbWl0ZWQgc3lzdGVtCisgKiBkcmFtYXRpY2FsbHkuICBUaGUgbnVtYmVyIG9mIHN1Y2ggRVZFTlRfQ09OU1RSQUlOVF9PVkVSTEFQKCkgbWFjcm9zCisgKiBhbmQgaXRzIGNvdW50ZXIgbWFza3MgbXVzdCBiZSBrZXB0IGF0IGEgbWluaW11bS4KKyAqLworI2RlZmluZSBFVkVOVF9DT05TVFJBSU5UX09WRVJMQVAoYywgbiwgbSkJXAorCV9fRVZFTlRfQ09OU1RSQUlOVChjLCBuLCBtLCBIV0VJR0hUKG4pLCAxKQogCiAvKgogICogQ29uc3RyYWludCBvbiB0aGUgRXZlbnQgY29kZS4KQEAgLTIzNSw2ICsyNjEsMTEgQEAKIAl1NjQJY2FwYWJpbGl0aWVzOwogfTsKIAorc3RydWN0IHg4Nl9wbXVfcXVpcmsgeworCXN0cnVjdCB4ODZfcG11X3F1aXJrICpuZXh0OworCXZvaWQgKCpmdW5jKSh2b2lkKTsKK307CisKIC8qCiAgKiBzdHJ1Y3QgeDg2X3BtdSAtIGdlbmVyaWMgeDg2IHBtdQogICovCkBAIC0yNTksNiArMjkwLDExIEBACiAJaW50CQludW1fY291bnRlcnNfZml4ZWQ7CiAJaW50CQljbnR2YWxfYml0czsKIAl1NjQJCWNudHZhbF9tYXNrOworCXVuaW9uIHsKKwkJCXVuc2lnbmVkIGxvbmcgZXZlbnRzX21hc2tsOworCQkJdW5zaWduZWQgbG9uZyBldmVudHNfbWFza1tCSVRTX1RPX0xPTkdTKEFSQ0hfUEVSRk1PTl9FVkVOVFNfQ09VTlQpXTsKKwl9OworCWludAkJZXZlbnRzX21hc2tfbGVuOwogCWludAkJYXBpYzsKIAl1NjQJCW1heF9wZXJpb2Q7CiAJc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKgpAQCAtMjY4LDcgKzMwNCw3IEBACiAJdm9pZAkJKCpwdXRfZXZlbnRfY29uc3RyYWludHMpKHN0cnVjdCBjcHVfaHdfZXZlbnRzICpjcHVjLAogCQkJCQkJIHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCk7CiAJc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgKmV2ZW50X2NvbnN0cmFpbnRzOwotCXZvaWQJCSgqcXVpcmtzKSh2b2lkKTsKKwlzdHJ1Y3QgeDg2X3BtdV9xdWlyayAqcXVpcmtzOwogCWludAkJcGVyZmN0cl9zZWNvbmRfd3JpdGU7CiAKIAlpbnQJCSgqY3B1X3ByZXBhcmUpKGludCBjcHUpOwpAQCAtMzA5LDYgKzM0NSwxNSBAQAogCXN0cnVjdCBwZXJmX2d1ZXN0X3N3aXRjaF9tc3IgKigqZ3Vlc3RfZ2V0X21zcnMpKGludCAqbnIpOwogfTsKIAorI2RlZmluZSB4ODZfYWRkX3F1aXJrKGZ1bmNfKQkJCQkJCVwKK2RvIHsJCQkJCQkJCQlcCisJc3RhdGljIHN0cnVjdCB4ODZfcG11X3F1aXJrIF9fcXVpcmsgX19pbml0ZGF0YSA9IHsJCVwKKwkJLmZ1bmMgPSBmdW5jXywJCQkJCQlcCisJfTsJCQkJCQkJCVwKKwlfX3F1aXJrLm5leHQgPSB4ODZfcG11LnF1aXJrczsJCQkJCVwKKwl4ODZfcG11LnF1aXJrcyA9ICZfX3F1aXJrOwkJCQkJXAorfSB3aGlsZSAoMCkKKwogI2RlZmluZSBFUkZfTk9fSFRfU0hBUklORwkxCiAjZGVmaW5lIEVSRl9IQVNfUlNQXzEJCTIKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2FtZC5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2FtZC5jCmluZGV4IGFlZWZkNDUuLjAzOTdiMjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfYW1kLmMKQEAgLTQ5Miw3ICs0OTIsNyBAQAogc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGFtZF9mMTVfUE1DMCAgPSBFVkVOVF9DT05TVFJBSU5UKDAsIDB4MDEsIDApOwogc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGFtZF9mMTVfUE1DMjAgPSBFVkVOVF9DT05TVFJBSU5UKDAsIDB4MDcsIDApOwogc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGFtZF9mMTVfUE1DMyAgPSBFVkVOVF9DT05TVFJBSU5UKDAsIDB4MDgsIDApOwotc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGFtZF9mMTVfUE1DMzAgPSBFVkVOVF9DT05TVFJBSU5UKDAsIDB4MDksIDApOworc3RhdGljIHN0cnVjdCBldmVudF9jb25zdHJhaW50IGFtZF9mMTVfUE1DMzAgPSBFVkVOVF9DT05TVFJBSU5UX09WRVJMQVAoMCwgMHgwOSwgMCk7CiBzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgYW1kX2YxNV9QTUM1MCA9IEVWRU5UX0NPTlNUUkFJTlQoMCwgMHgzRiwgMCk7CiBzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgYW1kX2YxNV9QTUM1MyA9IEVWRU5UX0NPTlNUUkFJTlQoMCwgMHgzOCwgMCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWRfaWJzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfYW1kX2licy5jCmluZGV4IGFiNjM0M2QuLjNiOGEyZDMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9hbWRfaWJzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2FtZF9pYnMuYwpAQCAtMTk5LDggKzE5OSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXByX2VycihGV19CVUcgInVzaW5nIG9mZnNldCAlZCBmb3IgSUJTIGludGVycnVwdHNcbiIsIG9mZnNldCk7Ci0JcHJfZXJyKEZXX0JVRyAid29ya2Fyb3VuZCBlbmFibGVkIGZvciBJQlMgTFZUIG9mZnNldFxuIik7CisJcHJfaW5mbygiSUJTOiBMVlQgb2Zmc2V0ICVkIGFzc2lnbmVkXG4iLCBvZmZzZXQpOwogCiAJcmV0dXJuIDA7CiBvdXQ6CkBAIC0yNjUsMTkgKzI2NCwyMyBAQAogc3RhdGljIF9faW5pdCBpbnQgYW1kX2lic19pbml0KHZvaWQpCiB7CiAJdTMyIGNhcHM7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKIAogCWNhcHMgPSBfX2dldF9pYnNfY2FwcygpOwogCWlmICghY2FwcykKIAkJcmV0dXJuIC1FTk9ERVY7CS8qIGlicyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjcHUgKi8KIAotCWlmICghaWJzX2VpbHZ0X3ZhbGlkKCkpIHsKLQkJcmV0ID0gZm9yY2VfaWJzX2VpbHZ0X3NldHVwKCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByX2VycigiRmFpbGVkIHRvIHNldHVwIElCUywgJWRcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQorCS8qCisJICogRm9yY2UgTFZUIG9mZnNldCBhc3NpZ25tZW50IGZvciBmYW1pbHkgMTBoOiBUaGUgb2Zmc2V0cyBhcmUKKwkgKiBub3QgYXNzaWduZWQgYnkgdGhlIEJJT1MgZm9yIHRoaXMgZmFtaWx5LCBzbyB0aGUgT1MgaXMKKwkgKiByZXNwb25zaWJsZSBmb3IgZG9pbmcgaXQuIElmIHRoZSBPUyBhc3NpZ25tZW50IGZhaWxzLCBmYWxsCisJICogYmFjayB0byBCSU9TIHNldHRpbmdzIGFuZCB0cnkgdG8gc2V0dXAgdGhpcy4KKwkgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHgxMCkKKwkJZm9yY2VfaWJzX2VpbHZ0X3NldHVwKCk7CisKKwlpZiAoIWlic19laWx2dF92YWxpZCgpKQorCQlnb3RvIG91dDsKIAogCWdldF9vbmxpbmVfY3B1cygpOwogCWlic19jYXBzID0gY2FwczsKQEAgLTI4Nyw3ICsyOTAsMTEgQEAKIAlzbXBfY2FsbF9mdW5jdGlvbihzZXR1cF9BUElDX2licywgTlVMTCwgMSk7CiAJcHV0X29ubGluZV9jcHVzKCk7CiAKLQlyZXR1cm4gcGVyZl9ldmVudF9pYnNfaW5pdCgpOworCXJldCA9IHBlcmZfZXZlbnRfaWJzX2luaXQoKTsKK291dDoKKwlpZiAocmV0KQorCQlwcl9lcnIoIkZhaWxlZCB0byBzZXR1cCBJQlMsICVkXG4iLCByZXQpOworCXJldHVybiByZXQ7CiB9CiAKIC8qIFNpbmNlIHdlIG5lZWQgdGhlIHBjaSBzdWJzeXN0ZW0gdG8gaW5pdCBpYnMgd2UgY2FuJ3QgZG8gdGhpcyBlYXJsaWVyOiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYwppbmRleCAyYmU1ZWJlLi4zYmQzN2JkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfaW50ZWwuYwpAQCAtMjgsNiArMjgsNyBAQAogICBbUEVSRl9DT1VOVF9IV19CUkFOQ0hfSU5TVFJVQ1RJT05TXQk9IDB4MDBjNCwKICAgW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10JCT0gMHgwMGM1LAogICBbUEVSRl9DT1VOVF9IV19CVVNfQ1lDTEVTXQkJPSAweDAxM2MsCisgIFtQRVJGX0NPVU5UX0hXX1JFRl9DUFVfQ1lDTEVTXQk9IDB4MDMwMCwgLyogcHNldWRvLWVuY29kaW5nICovCiB9OwogCiBzdGF0aWMgc3RydWN0IGV2ZW50X2NvbnN0cmFpbnQgaW50ZWxfY29yZV9ldmVudF9jb25zdHJhaW50c1tdIF9fcmVhZF9tb3N0bHkgPQpAQCAtNDUsMTIgKzQ2LDcgQEAKIHsKIAlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDBjMCwgMCksIC8qIElOU1RfUkVUSVJFRC5BTlkgKi8KIAlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDAzYywgMSksIC8qIENQVV9DTEtfVU5IQUxURUQuQ09SRSAqLwotCS8qCi0JICogQ29yZTIgaGFzIEZpeGVkIENvdW50ZXIgMiBsaXN0ZWQgYXMgQ1BVX0NMS19VTkhBTFRFRC5SRUYgYW5kIGV2ZW50Ci0JICogMHgwMTNjIGFzIENQVV9DTEtfVU5IQUxURUQuQlVTIGFuZCBzcGVjaWZpZXMgdGhlcmUgaXMgYSBmaXhlZAotCSAqIHJhdGlvIGJldHdlZW4gdGhlc2UgY291bnRlcnMuCi0JICovCi0JLyogRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAxM2MsIDIpLCAgQ1BVX0NMS19VTkhBTFRFRC5SRUYgKi8KKwlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDMwMCwgMiksIC8qIENQVV9DTEtfVU5IQUxURUQuUkVGICovCiAJSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweDEwLCAweDEpLCAvKiBGUF9DT01QX09QU19FWEUgKi8KIAlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4MTEsIDB4MiksIC8qIEZQX0FTU0lTVCAqLwogCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHgxMiwgMHgyKSwgLyogTVVMICovCkBAIC02OCw3ICs2NCw3IEBACiB7CiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwYzAsIDApLCAvKiBJTlNUX1JFVElSRUQuQU5ZICovCiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwM2MsIDEpLCAvKiBDUFVfQ0xLX1VOSEFMVEVELkNPUkUgKi8KLQkvKiBGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDEzYywgMiksIENQVV9DTEtfVU5IQUxURUQuUkVGICovCisJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAzMDAsIDIpLCAvKiBDUFVfQ0xLX1VOSEFMVEVELlJFRiAqLwogCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHg0MCwgMHgzKSwgLyogTDFEX0NBQ0hFX0xEICovCiAJSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweDQxLCAweDMpLCAvKiBMMURfQ0FDSEVfU1QgKi8KIAlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4NDIsIDB4MyksIC8qIEwxRF9DQUNIRV9MT0NLICovCkBAIC05MCw3ICs4Niw3IEBACiB7CiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwYzAsIDApLCAvKiBJTlNUX1JFVElSRUQuQU5ZICovCiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwM2MsIDEpLCAvKiBDUFVfQ0xLX1VOSEFMVEVELkNPUkUgKi8KLQkvKiBGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDEzYywgMiksIENQVV9DTEtfVU5IQUxURUQuUkVGICovCisJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAzMDAsIDIpLCAvKiBDUFVfQ0xLX1VOSEFMVEVELlJFRiAqLwogCUlOVEVMX0VWRU5UX0NPTlNUUkFJTlQoMHg1MSwgMHgzKSwgLyogTDFEICovCiAJSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweDYwLCAweDEpLCAvKiBPRkZDT1JFX1JFUVVFU1RTX09VVFNUQU5ESU5HICovCiAJSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweDYzLCAweDMpLCAvKiBDQUNIRV9MT0NLX0NZQ0xFUyAqLwpAQCAtMTAyLDcgKzk4LDcgQEAKIHsKIAlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDBjMCwgMCksIC8qIElOU1RfUkVUSVJFRC5BTlkgKi8KIAlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDAzYywgMSksIC8qIENQVV9DTEtfVU5IQUxURUQuQ09SRSAqLwotCS8qIEZJWEVEX0VWRU5UX0NPTlNUUkFJTlQoMHgwMTNjLCAyKSwgQ1BVX0NMS19VTkhBTFRFRC5SRUYgKi8KKwlGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDMwMCwgMiksIC8qIENQVV9DTEtfVU5IQUxURUQuUkVGICovCiAJSU5URUxfRVZFTlRfQ09OU1RSQUlOVCgweDQ4LCAweDQpLCAvKiBMMURfUEVORF9NSVNTLlBFTkRJTkcgKi8KIAlJTlRFTF9VRVZFTlRfQ09OU1RSQUlOVCgweDAxYzAsIDB4MiksIC8qIElOU1RfUkVUSVJFRC5QUkVDX0RJU1QgKi8KIAlJTlRFTF9FVkVOVF9DT05TVFJBSU5UKDB4Y2QsIDB4OCksIC8qIE1FTV9UUkFOU19SRVRJUkVELkxPQURfTEFURU5DWSAqLwpAQCAtMTI1LDcgKzEyMSw3IEBACiB7CiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwYzAsIDApLCAvKiBJTlNUX1JFVElSRUQuQU5ZICovCiAJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAwM2MsIDEpLCAvKiBDUFVfQ0xLX1VOSEFMVEVELkNPUkUgKi8KLQkvKiBGSVhFRF9FVkVOVF9DT05TVFJBSU5UKDB4MDEzYywgMiksIENQVV9DTEtfVU5IQUxURUQuUkVGICovCisJRklYRURfRVZFTlRfQ09OU1RSQUlOVCgweDAzMDAsIDIpLCAvKiBDUFVfQ0xLX1VOSEFMVEVELlJFRiAqLwogCUVWRU5UX0NPTlNUUkFJTlRfRU5ECiB9OwogCkBAIC0xMTY5LDcgKzExNjUsNyBAQAogCQkgKi8KIAkJYyA9ICZ1bmNvbnN0cmFpbmVkOwogCX0gZWxzZSBpZiAoaW50ZWxfdHJ5X2FsdF9lcihldmVudCwgb3JpZ19pZHgpKSB7Ci0JCXJhd19zcGluX3VubG9jaygmZXJhLT5sb2NrKTsKKwkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVyYS0+bG9jaywgZmxhZ3MpOwogCQlnb3RvIGFnYWluOwogCX0KIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZXJhLT5sb2NrLCBmbGFncyk7CkBAIC0xNTE5LDcgKzE1MTUsNyBAQAogCS5ndWVzdF9nZXRfbXNycwkJPSBpbnRlbF9ndWVzdF9nZXRfbXNycywKIH07CiAKLXN0YXRpYyB2b2lkIGludGVsX2Nsb3ZlcnRvd25fcXVpcmtzKHZvaWQpCitzdGF0aWMgX19pbml0IHZvaWQgaW50ZWxfY2xvdmVydG93bl9xdWlyayh2b2lkKQogewogCS8qCiAJICogUEVCUyBpcyB1bnJlbGlhYmxlIGR1ZSB0bzoKQEAgLTE1NDUsMTIgKzE1NDEsNjAgQEAKIAl4ODZfcG11LnBlYnNfY29uc3RyYWludHMgPSBOVUxMOwogfQogCitzdGF0aWMgX19pbml0IHZvaWQgaW50ZWxfc2FuZHlicmlkZ2VfcXVpcmsodm9pZCkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICJQRUJTIGRpc2FibGVkIGR1ZSB0byBDUFUgZXJyYXRhLlxuIik7CisJeDg2X3BtdS5wZWJzID0gMDsKKwl4ODZfcG11LnBlYnNfY29uc3RyYWludHMgPSBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsgaW50IGlkOyBjaGFyICpuYW1lOyB9IGludGVsX2FyY2hfZXZlbnRzX21hcFtdIF9faW5pdGNvbnN0ID0geworCXsgUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTLCAiY3B1IGN5Y2xlcyIgfSwKKwl7IFBFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TLCAiaW5zdHJ1Y3Rpb25zIiB9LAorCXsgUEVSRl9DT1VOVF9IV19CVVNfQ1lDTEVTLCAiYnVzIGN5Y2xlcyIgfSwKKwl7IFBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFUywgImNhY2hlIHJlZmVyZW5jZXMiIH0sCisJeyBQRVJGX0NPVU5UX0hXX0NBQ0hFX01JU1NFUywgImNhY2hlIG1pc3NlcyIgfSwKKwl7IFBFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OUywgImJyYW5jaCBpbnN0cnVjdGlvbnMiIH0sCisJeyBQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVMsICJicmFuY2ggbWlzc2VzIiB9LAorfTsKKworc3RhdGljIF9faW5pdCB2b2lkIGludGVsX2FyY2hfZXZlbnRzX3F1aXJrKHZvaWQpCit7CisJaW50IGJpdDsKKworCS8qIGRpc2FibGUgZXZlbnQgdGhhdCByZXBvcnRlZCBhcyBub3QgcHJlc2VuZCBieSBjcHVpZCAqLworCWZvcl9lYWNoX3NldF9iaXQoYml0LCB4ODZfcG11LmV2ZW50c19tYXNrLCBBUlJBWV9TSVpFKGludGVsX2FyY2hfZXZlbnRzX21hcCkpIHsKKwkJaW50ZWxfcGVyZm1vbl9ldmVudF9tYXBbaW50ZWxfYXJjaF9ldmVudHNfbWFwW2JpdF0uaWRdID0gMDsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQ1BVSUQgbWFya2VkIGV2ZW50OiBcJyVzXCcgdW5hdmFpbGFibGVcbiIsCisJCQkJaW50ZWxfYXJjaF9ldmVudHNfbWFwW2JpdF0ubmFtZSk7CisJfQorfQorCitzdGF0aWMgX19pbml0IHZvaWQgaW50ZWxfbmVoYWxlbV9xdWlyayh2b2lkKQoreworCXVuaW9uIGNwdWlkMTBfZWJ4IGVieDsKKworCWVieC5mdWxsID0geDg2X3BtdS5ldmVudHNfbWFza2w7CisJaWYgKGVieC5zcGxpdC5ub19icmFuY2hfbWlzc2VzX3JldGlyZWQpIHsKKwkJLyoKKwkJICogRXJyYXR1bSBBQUo4MCBkZXRlY3RlZCwgd2Ugd29yayBpdCBhcm91bmQgYnkgdXNpbmcKKwkJICogdGhlIEJSX01JU1BfRVhFQy5BTlkgZXZlbnQuIFRoaXMgd2lsbCBvdmVyLWNvdW50CisJCSAqIGJyYW5jaC1taXNzZXMsIGJ1dCBpdCdzIHN0aWxsIG11Y2ggYmV0dGVyIHRoYW4gdGhlCisJCSAqIGFyY2hpdGVjdHVyYWwgZXZlbnQgd2hpY2ggaXMgb2Z0ZW4gY29tcGxldGVseSBib2d1czoKKwkJICovCisJCWludGVsX3BlcmZtb25fZXZlbnRfbWFwW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10gPSAweDdmODk7CisJCWVieC5zcGxpdC5ub19icmFuY2hfbWlzc2VzX3JldGlyZWQgPSAwOworCQl4ODZfcG11LmV2ZW50c19tYXNrbCA9IGVieC5mdWxsOworCQlwcmludGsoS0VSTl9JTkZPICJDUFUgZXJyYXR1bSBBQUo4MCB3b3JrZWQgYXJvdW5kXG4iKTsKKwl9Cit9CisKIF9faW5pdCBpbnQgaW50ZWxfcG11X2luaXQodm9pZCkKIHsKIAl1bmlvbiBjcHVpZDEwX2VkeCBlZHg7CiAJdW5pb24gY3B1aWQxMF9lYXggZWF4OworCXVuaW9uIGNwdWlkMTBfZWJ4IGVieDsKIAl1bnNpZ25lZCBpbnQgdW51c2VkOwotCXVuc2lnbmVkIGludCBlYng7CiAJaW50IHZlcnNpb247CiAKIAlpZiAoIWNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTikpIHsKQEAgLTE1NjcsOCArMTYxMSw4IEBACiAJICogQ2hlY2sgd2hldGhlciB0aGUgQXJjaGl0ZWN0dXJhbCBQZXJmTW9uIHN1cHBvcnRzCiAJICogQnJhbmNoIE1pc3NlcyBSZXRpcmVkIGh3X2V2ZW50IG9yIG5vdC4KIAkgKi8KLQljcHVpZCgxMCwgJmVheC5mdWxsLCAmZWJ4LCAmdW51c2VkLCAmZWR4LmZ1bGwpOwotCWlmIChlYXguc3BsaXQubWFza19sZW5ndGggPD0gQVJDSF9QRVJGTU9OX0JSQU5DSF9NSVNTRVNfUkVUSVJFRCkKKwljcHVpZCgxMCwgJmVheC5mdWxsLCAmZWJ4LmZ1bGwsICZ1bnVzZWQsICZlZHguZnVsbCk7CisJaWYgKGVheC5zcGxpdC5tYXNrX2xlbmd0aCA8IEFSQ0hfUEVSRk1PTl9FVkVOVFNfQ09VTlQpCiAJCXJldHVybiAtRU5PREVWOwogCiAJdmVyc2lvbiA9IGVheC5zcGxpdC52ZXJzaW9uX2lkOwpAQCAtMTU4Miw2ICsxNjI2LDkgQEAKIAl4ODZfcG11LmNudHZhbF9iaXRzCQk9IGVheC5zcGxpdC5iaXRfd2lkdGg7CiAJeDg2X3BtdS5jbnR2YWxfbWFzawkJPSAoMVVMTCA8PCBlYXguc3BsaXQuYml0X3dpZHRoKSAtIDE7CiAKKwl4ODZfcG11LmV2ZW50c19tYXNrbAkJPSBlYnguZnVsbDsKKwl4ODZfcG11LmV2ZW50c19tYXNrX2xlbgkJPSBlYXguc3BsaXQubWFza19sZW5ndGg7CisKIAkvKgogCSAqIFF1aXJrOiB2MiBwZXJmbW9uIGRvZXMgbm90IHJlcG9ydCBmaXhlZC1wdXJwb3NlIGV2ZW50cywgc28KIAkgKiBhc3N1bWUgYXQgbGVhc3QgMyBldmVudHM6CkBAIC0xNjAxLDYgKzE2NDgsOCBAQAogCiAJaW50ZWxfZHNfaW5pdCgpOwogCisJeDg2X2FkZF9xdWlyayhpbnRlbF9hcmNoX2V2ZW50c19xdWlyayk7IC8qIEluc3RhbGwgZmlyc3QsIHNvIGl0IHJ1bnMgbGFzdCAqLworCiAJLyoKIAkgKiBJbnN0YWxsIHRoZSBody1jYWNoZS1ldmVudHMgdGFibGU6CiAJICovCkBAIC0xNjEwLDcgKzE2NTksNyBAQAogCQlicmVhazsKIAogCWNhc2UgMTU6IC8qIG9yaWdpbmFsIDY1IG5tIGNlbGVyb24vcGVudGl1bS9jb3JlMi94ZW9uLCAiTWVyb20iLyJDb25yb2UiICovCi0JCXg4Nl9wbXUucXVpcmtzID0gaW50ZWxfY2xvdmVydG93bl9xdWlya3M7CisJCXg4Nl9hZGRfcXVpcmsoaW50ZWxfY2xvdmVydG93bl9xdWlyayk7CiAJY2FzZSAyMjogLyogc2luZ2xlLWNvcmUgNjUgbm0gY2VsZXJvbi9jb3JlMnNvbG8gIk1lcm9tLUwiLyJDb25yb2UtTCIgKi8KIAljYXNlIDIzOiAvKiBjdXJyZW50IDQ1IG5tIGNlbGVyb24vY29yZTIveGVvbiAiUGVucnluIi8iV29sZmRhbGUiICovCiAJY2FzZSAyOTogLyogc2l4LWNvcmUgNDUgbm0geGVvbiAiRHVubmluZ3RvbiIgKi8KQEAgLTE2NDQsMTcgKzE2OTMsOCBAQAogCQkvKiBVT1BTX0VYRUNVVEVELkNPUkVfQUNUSVZFX0NZQ0xFUyxjPTEsaT0xICovCiAJCWludGVsX3BlcmZtb25fZXZlbnRfbWFwW1BFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfQkFDS0VORF0gPSAweDE4MDNmYjE7CiAKLQkJaWYgKGVieCAmIDB4NDApIHsKLQkJCS8qCi0JCQkgKiBFcnJhdHVtIEFBSjgwIGRldGVjdGVkLCB3ZSB3b3JrIGl0IGFyb3VuZCBieSB1c2luZwotCQkJICogdGhlIEJSX01JU1BfRVhFQy5BTlkgZXZlbnQuIFRoaXMgd2lsbCBvdmVyLWNvdW50Ci0JCQkgKiBicmFuY2gtbWlzc2VzLCBidXQgaXQncyBzdGlsbCBtdWNoIGJldHRlciB0aGFuIHRoZQotCQkJICogYXJjaGl0ZWN0dXJhbCBldmVudCB3aGljaCBpcyBvZnRlbiBjb21wbGV0ZWx5IGJvZ3VzOgotCQkJICovCi0JCQlpbnRlbF9wZXJmbW9uX2V2ZW50X21hcFtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdID0gMHg3Zjg5OworCQl4ODZfYWRkX3F1aXJrKGludGVsX25laGFsZW1fcXVpcmspOwogCi0JCQlwcl9jb250KCJlcnJhdHVtIEFBSjgwIHdvcmtlZCBhcm91bmQsICIpOwotCQl9CiAJCXByX2NvbnQoIk5laGFsZW0gZXZlbnRzLCAiKTsKIAkJYnJlYWs7CiAKQEAgLTE2OTQsNiArMTczNCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSA0MjogLyogU2FuZHlCcmlkZ2UgKi8KKwkJeDg2X2FkZF9xdWlyayhpbnRlbF9zYW5keWJyaWRnZV9xdWlyayk7CiAJY2FzZSA0NTogLyogU2FuZHlCcmlkZ2UsICJSb21lbHktRVAiICovCiAJCW1lbWNweShod19jYWNoZV9ldmVudF9pZHMsIHNuYl9od19jYWNoZV9ldmVudF9pZHMsCiAJCSAgICAgICBzaXplb2YoaHdfY2FjaGVfZXZlbnRfaWRzKSk7CkBAIC0xNzMwLDUgKzE3NzEsNiBAQAogCQkJYnJlYWs7CiAJCX0KIAl9CisKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9ldmVudF9pbnRlbF9kcy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2RzLmMKaW5kZXggYzBkMjM4Zi4uNzNkYTZiNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2RzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X2ludGVsX2RzLmMKQEAgLTQ5Myw2ICs0OTMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZnJvbSA9IGNwdWMtPmxicl9lbnRyaWVzWzBdLmZyb207CiAJdW5zaWduZWQgbG9uZyBvbGRfdG8sIHRvID0gY3B1Yy0+bGJyX2VudHJpZXNbMF0udG87CiAJdW5zaWduZWQgbG9uZyBpcCA9IHJlZ3MtPmlwOworCWludCBpc182NGJpdCA9IDA7CiAKIAkvKgogCSAqIFdlIGRvbid0IG5lZWQgdG8gZml4dXAgaWYgdGhlIFBFQlMgYXNzaXN0IGlzIGZhdWx0IGxpa2UKQEAgLTU0NCw3ICs1NDUsMTAgQEAKIAkJfSBlbHNlCiAJCQlrYWRkciA9ICh2b2lkICopdG87CiAKLQkJa2VybmVsX2luc25faW5pdCgmaW5zbiwga2FkZHIpOworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJaXNfNjRiaXQgPSBrZXJuZWxfaXAodG8pIHx8ICF0ZXN0X3RocmVhZF9mbGFnKFRJRl9JQTMyKTsKKyNlbmRpZgorCQlpbnNuX2luaXQoJmluc24sIGthZGRyLCBpc182NGJpdCk7CiAJCWluc25fZ2V0X2xlbmd0aCgmaW5zbik7CiAJCXRvICs9IGluc24ubGVuZ3RoOwogCX0gd2hpbGUgKHRvIDwgaXApOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmX2V2ZW50X3A0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYwppbmRleCA0OTJiZjEzLi5lZjQ4NGQ5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfZXZlbnRfcDQuYwpAQCAtMTI2OCw3ICsxMjY4LDcgQEAKIAl9CiAKIGRvbmU6Ci0JcmV0dXJuIG51bSA/IC1FTk9TUEMgOiAwOworCXJldHVybiBudW0gPyAtRUlOVkFMIDogMDsKIH0KIAogc3RhdGljIF9faW5pdGNvbnN0IGNvbnN0IHN0cnVjdCB4ODZfcG11IHA0X3BtdSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcG93ZXJmbGFncy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wb3dlcmZsYWdzLmMKaW5kZXggNWFiYmVhMi4uN2IzZmU1NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wb3dlcmZsYWdzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wb3dlcmZsYWdzLmMKQEAgLTE2LDUgKzE2LDYgQEAKIAkiMTAwbWh6c3RlcHMiLAogCSJod3BzdGF0ZSIsCiAJIiIsCS8qIHRzYyBpbnZhcmlhbnQgbWFwcGVkIHRvIGNvbnN0YW50X3RzYyAqLwotCQkvKiBub3RoaW5nICovCisJImNwYiIsICAvKiBjb3JlIHBlcmZvcm1hbmNlIGJvb3N0ICovCisJImVmZl9mcmVxX3JvIiwgLyogUmVhZG9ubHkgYXBlcmYvbXBlcmYgKi8KIH07CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L3Byb2MuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcHJvYy5jCmluZGV4IDE0YjIzMTQuLjgwMjJjNjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcHJvYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvcHJvYy5jCkBAIC02NCwxMiArNjQsMTAgQEAKIHN0YXRpYyBpbnQgc2hvd19jcHVpbmZvKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSB2OwotCXVuc2lnbmVkIGludCBjcHUgPSAwOworCXVuc2lnbmVkIGludCBjcHU7CiAJaW50IGk7CiAKLSNpZmRlZiBDT05GSUdfU01QCiAJY3B1ID0gYy0+Y3B1X2luZGV4OwotI2VuZGlmCiAJc2VxX3ByaW50ZihtLCAicHJvY2Vzc29yXHQ6ICV1XG4iCiAJCSAgICJ2ZW5kb3JfaWRcdDogJXNcbiIKIAkJICAgImNwdSBmYW1pbHlcdDogJWRcbiIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfMzIuYwppbmRleCAzYjk3YTgwLi5jOTlmOWVkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja18zMi5jCkBAIC0xMTYsMTYgKzExNiwxNiBAQAogCQlmb3IgKGkgPSAwOyBpIDwgY29kZV9sZW47IGkrKywgaXArKykgewogCQkJaWYgKGlwIDwgKHU4ICopUEFHRV9PRkZTRVQgfHwKIAkJCQkJcHJvYmVfa2VybmVsX2FkZHJlc3MoaXAsIGMpKSB7Ci0JCQkJcHJpbnRrKCIgQmFkIEVJUCB2YWx1ZS4iKTsKKwkJCQlwcmludGsoS0VSTl9DT05UICIgQmFkIEVJUCB2YWx1ZS4iKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChpcCA9PSAodTggKilyZWdzLT5pcCkKLQkJCQlwcmludGsoIjwlMDJ4PiAiLCBjKTsKKwkJCQlwcmludGsoS0VSTl9DT05UICI8JTAyeD4gIiwgYyk7CiAJCQllbHNlCi0JCQkJcHJpbnRrKCIlMDJ4ICIsIGMpOworCQkJCXByaW50ayhLRVJOX0NPTlQgIiUwMnggIiwgYyk7CiAJCX0KIAl9Ci0JcHJpbnRrKCJcbiIpOworCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiB9CiAKIGludCBpc192YWxpZF9idWdhZGRyKHVuc2lnbmVkIGxvbmcgaXApCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrXzY0LmMKaW5kZXggMTk4NTNhZC4uNmQ3MjhkOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2R1bXBzdGFja182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2tfNjQuYwpAQCAtMjg0LDE2ICsyODQsMTYgQEAKIAkJZm9yIChpID0gMDsgaSA8IGNvZGVfbGVuOyBpKyssIGlwKyspIHsKIAkJCWlmIChpcCA8ICh1OCAqKVBBR0VfT0ZGU0VUIHx8CiAJCQkJCXByb2JlX2tlcm5lbF9hZGRyZXNzKGlwLCBjKSkgewotCQkJCXByaW50aygiIEJhZCBSSVAgdmFsdWUuIik7CisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiIEJhZCBSSVAgdmFsdWUuIik7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAoaXAgPT0gKHU4ICopcmVncy0+aXApCi0JCQkJcHJpbnRrKCI8JTAyeD4gIiwgYyk7CisJCQkJcHJpbnRrKEtFUk5fQ09OVCAiPCUwMng+ICIsIGMpOwogCQkJZWxzZQotCQkJCXByaW50aygiJTAyeCAiLCBjKTsKKwkJCQlwcmludGsoS0VSTl9DT05UICIlMDJ4ICIsIGMpOwogCQl9CiAJfQotCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9DT05UICJcbiIpOwogfQogCiBpbnQgaXNfdmFsaWRfYnVnYWRkcih1bnNpZ25lZCBsb25nIGlwKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2U4MjAuYyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKaW5kZXggMzAzYTBlNC4uODA3MWUyZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2U4MjAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCkBAIC03MzgsMzUgKzczOCwxNyBAQAogLyoKICAqIHByZSBhbGxvY2F0ZWQgNGsgYW5kIHJlc2VydmVkIGl0IGluIG1lbWJsb2NrIGFuZCBlODIwX3NhdmVkCiAgKi8KLXU2NCBfX2luaXQgZWFybHlfcmVzZXJ2ZV9lODIwKHU2NCBzdGFydHQsIHU2NCBzaXpldCwgdTY0IGFsaWduKQordTY0IF9faW5pdCBlYXJseV9yZXNlcnZlX2U4MjAodTY0IHNpemUsIHU2NCBhbGlnbikKIHsKLQl1NjQgc2l6ZSA9IDA7CiAJdTY0IGFkZHI7Ci0JdTY0IHN0YXJ0OwogCi0JZm9yIChzdGFydCA9IHN0YXJ0dDsgOyBzdGFydCArPSBzaXplKSB7Ci0JCXN0YXJ0ID0gbWVtYmxvY2tfeDg2X2ZpbmRfaW5fcmFuZ2Vfc2l6ZShzdGFydCwgJnNpemUsIGFsaWduKTsKLQkJaWYgKHN0YXJ0ID09IE1FTUJMT0NLX0VSUk9SKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChzaXplID49IHNpemV0KQotCQkJYnJlYWs7CisJYWRkciA9IF9fbWVtYmxvY2tfYWxsb2NfYmFzZShzaXplLCBhbGlnbiwgTUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRSk7CisJaWYgKGFkZHIpIHsKKwkJZTgyMF91cGRhdGVfcmFuZ2Vfc2F2ZWQoYWRkciwgc2l6ZSwgRTgyMF9SQU0sIEU4MjBfUkVTRVJWRUQpOworCQlwcmludGsoS0VSTl9JTkZPICJ1cGRhdGUgZTgyMF9zYXZlZCBmb3IgZWFybHlfcmVzZXJ2ZV9lODIwXG4iKTsKKwkJdXBkYXRlX2U4MjBfc2F2ZWQoKTsKIAl9CiAKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JaWYgKHN0YXJ0ID49IE1BWE1FTSkKLQkJcmV0dXJuIDA7Ci0JaWYgKHN0YXJ0ICsgc2l6ZSA+IE1BWE1FTSkKLQkJc2l6ZSA9IE1BWE1FTSAtIHN0YXJ0OwotI2VuZGlmCi0KLQlhZGRyID0gcm91bmRfZG93bihzdGFydCArIHNpemUgLSBzaXpldCwgYWxpZ24pOwotCWlmIChhZGRyIDwgc3RhcnQpCi0JCXJldHVybiAwOwotCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKGFkZHIsIGFkZHIgKyBzaXpldCwgIm5ldyBuZXh0Iik7Ci0JZTgyMF91cGRhdGVfcmFuZ2Vfc2F2ZWQoYWRkciwgc2l6ZXQsIEU4MjBfUkFNLCBFODIwX1JFU0VSVkVEKTsKLQlwcmludGsoS0VSTl9JTkZPICJ1cGRhdGUgZTgyMF9zYXZlZCBmb3IgZWFybHlfcmVzZXJ2ZV9lODIwXG4iKTsKLQl1cGRhdGVfZTgyMF9zYXZlZCgpOwotCiAJcmV0dXJuIGFkZHI7CiB9CiAKQEAgLTEwOTAsNyArMTA3Miw3IEBACiAJICogV2UgYXJlIHNhZmUgdG8gZW5hYmxlIHJlc2l6aW5nLCBiZWF1c2UgbWVtYmxvY2tfeDg2X2ZpbGwoKQogCSAqIGlzIHJhdGhlciBsYXRlciBmb3IgeDg2CiAJICovCi0JbWVtYmxvY2tfY2FuX3Jlc2l6ZSA9IDE7CisJbWVtYmxvY2tfYWxsb3dfcmVzaXplKCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgZTgyMC5ucl9tYXA7IGkrKykgewogCQlzdHJ1Y3QgZTgyMGVudHJ5ICplaSA9ICZlODIwLm1hcFtpXTsKQEAgLTExMDUsMjIgKzEwODcsMzYgQEAKIAkJbWVtYmxvY2tfYWRkKGVpLT5hZGRyLCBlaS0+c2l6ZSk7CiAJfQogCi0JbWVtYmxvY2tfYW5hbHl6ZSgpOwogCW1lbWJsb2NrX2R1bXBfYWxsKCk7CiB9CiAKIHZvaWQgX19pbml0IG1lbWJsb2NrX2ZpbmRfZG1hX3Jlc2VydmUodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JdTY0IGZyZWVfc2l6ZV9wZm47Ci0JdTY0IG1lbV9zaXplX3BmbjsKKwl1NjQgbnJfcGFnZXMgPSAwLCBucl9mcmVlX3BhZ2VzID0gMDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKKwlwaHlzX2FkZHJfdCBzdGFydCwgZW5kOworCWludCBpOworCXU2NCB1OworCiAJLyoKIAkgKiBuZWVkIHRvIGZpbmQgb3V0IHVzZWQgYXJlYSBiZWxvdyBNQVhfRE1BX1BGTgogCSAqIG5lZWQgdG8gdXNlIG1lbWJsb2NrIHRvIGdldCBmcmVlIHNpemUgaW4gWzAsIE1BWF9ETUFfUEZOXQogCSAqIGF0IGZpcnN0LCBhbmQgYXNzdW1lIGJvb3RfbWVtIHdpbGwgbm90IHRha2UgYmVsb3cgTUFYX0RNQV9QRk4KIAkgKi8KLQltZW1fc2l6ZV9wZm4gPSBtZW1ibG9ja194ODZfbWVtb3J5X2luX3JhbmdlKDAsIE1BWF9ETUFfUEZOIDw8IFBBR0VfU0hJRlQpID4+IFBBR0VfU0hJRlQ7Ci0JZnJlZV9zaXplX3BmbiA9IG1lbWJsb2NrX3g4Nl9mcmVlX21lbW9yeV9pbl9yYW5nZSgwLCBNQVhfRE1BX1BGTiA8PCBQQUdFX1NISUZUKSA+PiBQQUdFX1NISUZUOwotCXNldF9kbWFfcmVzZXJ2ZShtZW1fc2l6ZV9wZm4gLSBmcmVlX3NpemVfcGZuKTsKKwlmb3JfZWFjaF9tZW1fcGZuX3JhbmdlKGksIE1BWF9OVU1OT0RFUywgJnN0YXJ0X3BmbiwgJmVuZF9wZm4sIE5VTEwpIHsKKwkJc3RhcnRfcGZuID0gbWluX3QodW5zaWduZWQgbG9uZywgc3RhcnRfcGZuLCBNQVhfRE1BX1BGTik7CisJCWVuZF9wZm4gPSBtaW5fdCh1bnNpZ25lZCBsb25nLCBlbmRfcGZuLCBNQVhfRE1BX1BGTik7CisJCW5yX3BhZ2VzICs9IGVuZF9wZm4gLSBzdGFydF9wZm47CisJfQorCisJZm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UodSwgTUFYX05VTU5PREVTLCAmc3RhcnQsICZlbmQsIE5VTEwpIHsKKwkJc3RhcnRfcGZuID0gbWluX3QodW5zaWduZWQgbG9uZywgUEZOX1VQKHN0YXJ0KSwgTUFYX0RNQV9QRk4pOworCQllbmRfcGZuID0gbWluX3QodW5zaWduZWQgbG9uZywgUEZOX0RPV04oZW5kKSwgTUFYX0RNQV9QRk4pOworCQlpZiAoc3RhcnRfcGZuIDwgZW5kX3BmbikKKwkJCW5yX2ZyZWVfcGFnZXMgKz0gZW5kX3BmbiAtIHN0YXJ0X3BmbjsKKwl9CisKKwlzZXRfZG1hX3Jlc2VydmUobnJfcGFnZXMgLSBucl9mcmVlX3BhZ2VzKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzMyLlMgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUwppbmRleCBmM2Y2ZjUzLi4yMmQwZTIxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfMzIuUwpAQCAtNjI1LDYgKzYyNSw4IEBACiAJbW92bCAlZXNwLCAlZWF4CiAJam5lIHdvcmtfbm90aWZ5c2lnX3Y4NgkJIyByZXR1cm5pbmcgdG8ga2VybmVsLXNwYWNlIG9yCiAJCQkJCSMgdm04Ni1zcGFjZQorCVRSQUNFX0lSUVNfT04KKwlFTkFCTEVfSU5URVJSVVBUUyhDTEJSX05PTkUpCiAJeG9ybCAlZWR4LCAlZWR4CiAJY2FsbCBkb19ub3RpZnlfcmVzdW1lCiAJam1wIHJlc3VtZV91c2Vyc3BhY2Vfc2lnCkBAIC02MzgsNiArNjQwLDggQEAKICNlbHNlCiAJbW92bCAlZXNwLCAlZWF4CiAjZW5kaWYKKwlUUkFDRV9JUlFTX09OCisJRU5BQkxFX0lOVEVSUlVQVFMoQ0xCUl9OT05FKQogCXhvcmwgJWVkeCwgJWVkeAogCWNhbGwgZG9fbm90aWZ5X3Jlc3VtZQogCWptcCByZXN1bWVfdXNlcnNwYWNlX3NpZwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUwppbmRleCBmYWY4ZDVlLi5hMjBlMWNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZW50cnlfNjQuUwpAQCAtMjIxLDcgKzIyMSw3IEBACiAJLypDRklfUkVMX09GRlNFVAlzcywwKi8KIAlwdXNocV9jZmkgJXJheCAvKiByc3AgKi8KIAlDRklfUkVMX09GRlNFVAlyc3AsMAotCXB1c2hxX2NmaSAkWDg2X0VGTEFHU19JRiAvKiBlZmxhZ3MgLSBpbnRlcnJ1cHRzIG9uICovCisJcHVzaHFfY2ZpICQoWDg2X0VGTEFHU19JRnxYODZfRUZMQUdTX0JJVDEpIC8qIGVmbGFncyAtIGludGVycnVwdHMgb24gKi8KIAkvKkNGSV9SRUxfT0ZGU0VUCXJmbGFncywwKi8KIAlwdXNocV9jZmkgJF9fS0VSTkVMX0NTIC8qIGNzICovCiAJLypDRklfUkVMX09GRlNFVAljcywwKi8KQEAgLTQxMSw3ICs0MTEsNyBAQAogCVJFU1RPUkVfUkVTVAogCiAJdGVzdGwgJDMsIENTLUFSR09GRlNFVCglcnNwKQkJIyBmcm9tIGtlcm5lbF90aHJlYWQ/Ci0JamUgICBpbnRfcmV0X2Zyb21fc3lzX2NhbGwKKwlqeiAgIHJldGludF9yZXN0b3JlX2FyZ3MKIAogCXRlc3RsICRfVElGX0lBMzIsIFRJX2ZsYWdzKCVyY3gpCSMgMzItYml0IGNvbXBhdCB0YXNrIG5lZWRzIElSRVQKIAlqbnogIGludF9yZXRfZnJvbV9zeXNfY2FsbApAQCAtNDY1LDcgKzQ2NSw3IEBACiAJICogYWZ0ZXIgdGhlIHN3YXBncywgc28gdGhhdCBpdCBjYW4gZG8gdGhlIHN3YXBncwogCSAqIGZvciB0aGUgZ3Vlc3QgYW5kIGp1bXAgaGVyZSBvbiBzeXNjYWxsLgogCSAqLwotRU5UUlkoc3lzdGVtX2NhbGxfYWZ0ZXJfc3dhcGdzKQorR0xPQkFMKHN5c3RlbV9jYWxsX2FmdGVyX3N3YXBncykKIAogCW1vdnEJJXJzcCxQRVJfQ1BVX1ZBUihvbGRfcnNwKQogCW1vdnEJUEVSX0NQVV9WQVIoa2VybmVsX3N0YWNrKSwlcnNwCkBAIC00NzgsOCArNDc4LDcgQEAKIAltb3ZxICAlcmF4LE9SSUdfUkFYLUFSR09GRlNFVCglcnNwKQogCW1vdnEgICVyY3gsUklQLUFSR09GRlNFVCglcnNwKQogCUNGSV9SRUxfT0ZGU0VUIHJpcCxSSVAtQVJHT0ZGU0VUCi0JR0VUX1RIUkVBRF9JTkZPKCVyY3gpCi0JdGVzdGwgJF9USUZfV09SS19TWVNDQUxMX0VOVFJZLFRJX2ZsYWdzKCVyY3gpCisJdGVzdGwgJF9USUZfV09SS19TWVNDQUxMX0VOVFJZLFRJX2ZsYWdzK1RIUkVBRF9JTkZPKCVyc3AsUklQLUFSR09GRlNFVCkKIAlqbnogdHJhY2VzeXMKIHN5c3RlbV9jYWxsX2Zhc3RwYXRoOgogCWNtcHEgJF9fTlJfc3lzY2FsbF9tYXgsJXJheApAQCAtNDk2LDEwICs0OTUsOSBAQAogCS8qIGVkaToJZmxhZ21hc2sgKi8KIHN5c3JldF9jaGVjazoKIAlMT0NLREVQX1NZU19FWElUCi0JR0VUX1RIUkVBRF9JTkZPKCVyY3gpCiAJRElTQUJMRV9JTlRFUlJVUFRTKENMQlJfTk9ORSkKIAlUUkFDRV9JUlFTX09GRgotCW1vdmwgVElfZmxhZ3MoJXJjeCksJWVkeAorCW1vdmwgVElfZmxhZ3MrVEhSRUFEX0lORk8oJXJzcCxSSVAtQVJHT0ZGU0VUKSwlZWR4CiAJYW5kbCAlZWRpLCVlZHgKIAlqbnogIHN5c3JldF9jYXJlZnVsCiAJQ0ZJX1JFTUVNQkVSX1NUQVRFCkBAIC01ODMsNyArNTgxLDcgQEAKIAkvKiBEbyBzeXNjYWxsIHRyYWNpbmcgKi8KIHRyYWNlc3lzOgogI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKLQl0ZXN0bCAkKF9USUZfV09SS19TWVNDQUxMX0VOVFJZICYgfl9USUZfU1lTQ0FMTF9BVURJVCksVElfZmxhZ3MoJXJjeCkKKwl0ZXN0bCAkKF9USUZfV09SS19TWVNDQUxMX0VOVFJZICYgfl9USUZfU1lTQ0FMTF9BVURJVCksVElfZmxhZ3MrVEhSRUFEX0lORk8oJXJzcCxSSVAtQVJHT0ZGU0VUKQogCWp6IGF1ZGl0c3lzCiAjZW5kaWYKIAlTQVZFX1JFU1QKQEAgLTYxMiw4ICs2MTAsNiBAQAogR0xPQkFMKGludF9yZXRfZnJvbV9zeXNfY2FsbCkKIAlESVNBQkxFX0lOVEVSUlVQVFMoQ0xCUl9OT05FKQogCVRSQUNFX0lSUVNfT0ZGCi0JdGVzdGwgJDMsQ1MtQVJHT0ZGU0VUKCVyc3ApCi0JamUgcmV0aW50X3Jlc3RvcmVfYXJncwogCW1vdmwgJF9USUZfQUxMV09SS19NQVNLLCVlZGkKIAkvKiBlZGk6CW1hc2sgdG8gY2hlY2sgKi8KIEdMT0JBTChpbnRfd2l0aF9jaGVjaykKQEAgLTk1Myw2ICs5NDksNyBAQAogRU5UUlkoXHN5bSkKIAlJTlRSX0ZSQU1FCiAJcHVzaHFfY2ZpICR+KFxudW0pCisuTGNvbW1vbl9cc3ltOgogCWludGVycnVwdCBcZG9fc3ltCiAJam1wIHJldF9mcm9tX2ludHIKIAlDRklfRU5EUFJPQwpAQCAtOTc2LDEzICs5NzMsMjEgQEAKIAl4ODZfcGxhdGZvcm1faXBpIHNtcF94ODZfcGxhdGZvcm1faXBpCiAKICNpZmRlZiBDT05GSUdfU01QCi0uaXJwIGlkeCwwLDEsMiwzLDQsNSw2LDcsOCw5LDEwLDExLDEyLDEzLDE0LDE1LCBcCisJQUxJR04KKwlJTlRSX0ZSQU1FCisuaXJwIGlkeCwxLDIsMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiwxMywxNCwxNSwgXAogCTE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxCiAuaWYgTlVNX0lOVkFMSURBVEVfVExCX1ZFQ1RPUlMgPiBcaWR4Ci1hcGljaW50ZXJydXB0IChJTlZBTElEQVRFX1RMQl9WRUNUT1JfU1RBUlQpK1xpZHggXAotCWludmFsaWRhdGVfaW50ZXJydXB0XGlkeCBzbXBfaW52YWxpZGF0ZV9pbnRlcnJ1cHQKK0VOVFJZKGludmFsaWRhdGVfaW50ZXJydXB0XGlkeCkKKwlwdXNocV9jZmkgJH4oSU5WQUxJREFURV9UTEJfVkVDVE9SX1NUQVJUK1xpZHgpCisJam1wIC5MY29tbW9uX2ludmFsaWRhdGVfaW50ZXJydXB0MAorCUNGSV9BREpVU1RfQ0ZBX09GRlNFVCAtOAorRU5EKGludmFsaWRhdGVfaW50ZXJydXB0XGlkeCkKIC5lbmRpZgogLmVuZHIKKwlDRklfRU5EUFJPQworYXBpY2ludGVycnVwdCBJTlZBTElEQVRFX1RMQl9WRUNUT1JfU1RBUlQsIFwKKwlpbnZhbGlkYXRlX2ludGVycnVwdDAsIHNtcF9pbnZhbGlkYXRlX2ludGVycnVwdAogI2VuZGlmCiAKIGFwaWNpbnRlcnJ1cHQgVEhSRVNIT0xEX0FQSUNfVkVDVE9SIFwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9oZWFkLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZC5jCmluZGV4IGFmMDY5OWIuLjQ4ZDlkNGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9oZWFkLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hlYWQuYwpAQCAtNTIsNSArNTIsNSBAQAogCQlsb3dtZW0gPSAweDlmMDAwOwogCiAJLyogcmVzZXJ2ZSBhbGwgbWVtb3J5IGJldHdlZW4gbG93bWVtIGFuZCB0aGUgMU1CIG1hcmsgKi8KLQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShsb3dtZW0sIDB4MTAwMDAwLCAiKiBCSU9TIHJlc2VydmVkIik7CisJbWVtYmxvY2tfcmVzZXJ2ZShsb3dtZW0sIDB4MTAwMDAwIC0gbG93bWVtKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9oZWFkMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkMzIuYwppbmRleCAzYmIwODUwLi41MWZmMTg2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZDMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hlYWQzMi5jCkBAIC0zMSw5ICszMSw4IEBACiAKIHZvaWQgX19pbml0IGkzODZfc3RhcnRfa2VybmVsKHZvaWQpCiB7Ci0JbWVtYmxvY2tfaW5pdCgpOwotCi0JbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UoX19wYV9zeW1ib2woJl90ZXh0KSwgX19wYV9zeW1ib2woJl9fYnNzX3N0b3ApLCAiVEVYVCBEQVRBIEJTUyIpOworCW1lbWJsb2NrX3Jlc2VydmUoX19wYV9zeW1ib2woJl90ZXh0KSwKKwkJCSBfX3BhX3N5bWJvbCgmX19ic3Nfc3RvcCkgLSBfX3BhX3N5bWJvbCgmX3RleHQpKTsKIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCS8qIFJlc2VydmUgSU5JVFJEICovCkBAIC00Miw3ICs0MSw3IEBACiAJCXU2NCByYW1kaXNrX2ltYWdlID0gYm9vdF9wYXJhbXMuaGRyLnJhbWRpc2tfaW1hZ2U7CiAJCXU2NCByYW1kaXNrX3NpemUgID0gYm9vdF9wYXJhbXMuaGRyLnJhbWRpc2tfc2l6ZTsKIAkJdTY0IHJhbWRpc2tfZW5kICAgPSBQQUdFX0FMSUdOKHJhbWRpc2tfaW1hZ2UgKyByYW1kaXNrX3NpemUpOwotCQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShyYW1kaXNrX2ltYWdlLCByYW1kaXNrX2VuZCwgIlJBTURJU0siKTsKKwkJbWVtYmxvY2tfcmVzZXJ2ZShyYW1kaXNrX2ltYWdlLCByYW1kaXNrX2VuZCAtIHJhbWRpc2tfaW1hZ2UpOwogCX0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZDY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaGVhZDY0LmMKaW5kZXggNTY1NWMyMi4uM2EzYjc3OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2hlYWQ2NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkNjQuYwpAQCAtOTgsOSArOTgsOCBAQAogewogCWNvcHlfYm9vdGRhdGEoX192YShyZWFsX21vZGVfZGF0YSkpOwogCi0JbWVtYmxvY2tfaW5pdCgpOwotCi0JbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UoX19wYV9zeW1ib2woJl90ZXh0KSwgX19wYV9zeW1ib2woJl9fYnNzX3N0b3ApLCAiVEVYVCBEQVRBIEJTUyIpOworCW1lbWJsb2NrX3Jlc2VydmUoX19wYV9zeW1ib2woJl90ZXh0KSwKKwkJCSBfX3BhX3N5bWJvbCgmX19ic3Nfc3RvcCkgLSBfX3BhX3N5bWJvbCgmX3RleHQpKTsKIAogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRSRAogCS8qIFJlc2VydmUgSU5JVFJEICovCkBAIC0xMDksNyArMTA4LDcgQEAKIAkJdW5zaWduZWQgbG9uZyByYW1kaXNrX2ltYWdlID0gYm9vdF9wYXJhbXMuaGRyLnJhbWRpc2tfaW1hZ2U7CiAJCXVuc2lnbmVkIGxvbmcgcmFtZGlza19zaXplICA9IGJvb3RfcGFyYW1zLmhkci5yYW1kaXNrX3NpemU7CiAJCXVuc2lnbmVkIGxvbmcgcmFtZGlza19lbmQgICA9IFBBR0VfQUxJR04ocmFtZGlza19pbWFnZSArIHJhbWRpc2tfc2l6ZSk7Ci0JCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHJhbWRpc2tfaW1hZ2UsIHJhbWRpc2tfZW5kLCAiUkFNRElTSyIpOworCQltZW1ibG9ja19yZXNlcnZlKHJhbWRpc2tfaW1hZ2UsIHJhbWRpc2tfZW5kIC0gcmFtZGlza19pbWFnZSk7CiAJfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaHBldC5jCmluZGV4IGI5NDZhOWUuLjA3YjBhNTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9ocGV0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2hwZXQuYwpAQCAtMzIsOCArMzIsNiBAQAogI2RlZmluZSBIUEVUX01JTl9DWUNMRVMJCQkxMjgKICNkZWZpbmUgSFBFVF9NSU5fUFJPR19ERUxUQQkJKEhQRVRfTUlOX0NZQ0xFUyArIChIUEVUX01JTl9DWUNMRVMgPj4gMSkpCiAKLSNkZWZpbmUgRVZUX1RPX0hQRVRfREVWKGV2dCkgY29udGFpbmVyX29mKGV2dCwgc3RydWN0IGhwZXRfZGV2LCBldnQpCi0KIC8qCiAgKiBIUEVUIGFkZHJlc3MgaXMgc2V0IGluIGFjcGkvYm9vdC5jLCB3aGVuIGFuIEFDUEkgZW50cnkgZXhpc3RzCiAgKi8KQEAgLTU1LDYgKzUzLDExIEBACiAJY2hhcgkJCQluYW1lWzEwXTsKIH07CiAKK2lubGluZSBzdHJ1Y3QgaHBldF9kZXYgKkVWVF9UT19IUEVUX0RFVihzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnRkZXYpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihldnRkZXYsIHN0cnVjdCBocGV0X2RldiwgZXZ0KTsKK30KKwogaW5saW5lIHVuc2lnbmVkIGludCBocGV0X3JlYWRsKHVuc2lnbmVkIGludCBhKQogewogCXJldHVybiByZWFkbChocGV0X3ZpcnRfYWRkcmVzcyArIGEpOwpAQCAtMTA0OSw2ICsxMDUyLDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocGV0X3J0Y190aW1lcl9pbml0KTsKIAorc3RhdGljIHZvaWQgaHBldF9kaXNhYmxlX3J0Y19jaGFubmVsKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjZmc7CisJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7CisJY2ZnICY9IH5IUEVUX1ROX0VOQUJMRTsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDFfQ0ZHKTsKK30KKwogLyoKICAqIFRoZSBmdW5jdGlvbnMgYmVsb3cgYXJlIGNhbGxlZCBmcm9tIHJ0YyBkcml2ZXIuCiAgKiBSZXR1cm4gMCBpZiBIUEVUIGlzIG5vdCBiZWluZyB1c2VkLgpAQCAtMTA2MCw2ICsxMDcxLDkgQEAKIAkJcmV0dXJuIDA7CiAKIAlocGV0X3J0Y19mbGFncyAmPSB+Yml0X21hc2s7CisJaWYgKHVubGlrZWx5KCFocGV0X3J0Y19mbGFncykpCisJCWhwZXRfZGlzYWJsZV9ydGNfY2hhbm5lbCgpOworCiAJcmV0dXJuIDE7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocGV0X21hc2tfcnRjX2lycV9iaXQpOwpAQCAtMTEyNSwxNSArMTEzOSwxMSBAQAogCiBzdGF0aWMgdm9pZCBocGV0X3J0Y190aW1lcl9yZWluaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbnQgY2ZnLCBkZWx0YTsKKwl1bnNpZ25lZCBpbnQgZGVsdGE7CiAJaW50IGxvc3RfaW50cyA9IC0xOwogCi0JaWYgKHVubGlrZWx5KCFocGV0X3J0Y19mbGFncykpIHsKLQkJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7Ci0JCWNmZyAmPSB+SFBFVF9UTl9FTkFCTEU7Ci0JCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOwotCQlyZXR1cm47Ci0JfQorCWlmICh1bmxpa2VseSghaHBldF9ydGNfZmxhZ3MpKQorCQlocGV0X2Rpc2FibGVfcnRjX2NoYW5uZWwoKTsKIAogCWlmICghKGhwZXRfcnRjX2ZsYWdzICYgUlRDX1BJRSkgfHwgaHBldF9waWVfbGltaXQpCiAJCWRlbHRhID0gaHBldF9kZWZhdWx0X2RlbHRhOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycS5jIGIvYXJjaC94ODYva2VybmVsL2lycS5jCmluZGV4IDQyOWUwYzkuLjc5NDNlMGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKQEAgLTc0LDYgKzc0LDEwIEBACiAJZm9yX2VhY2hfb25saW5lX2NwdShqKQogCQlzZXFfcHJpbnRmKHAsICIlMTB1ICIsIGlycV9zdGF0cyhqKS0+YXBpY19pcnFfd29ya19pcnFzKTsKIAlzZXFfcHJpbnRmKHAsICIgIElSUSB3b3JrIGludGVycnVwdHNcbiIpOworCXNlcV9wcmludGYocCwgIiUqczogIiwgcHJlYywgIlJUUiIpOworCWZvcl9lYWNoX29ubGluZV9jcHUoaikKKwkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBpcnFfc3RhdHMoaiktPmljcl9yZWFkX3JldHJ5X2NvdW50KTsKKwlzZXFfcHJpbnRmKHAsICIgIEFQSUMgSUNSIHJlYWQgcmV0cmllc1xuIik7CiAjZW5kaWYKIAlpZiAoeDg2X3BsYXRmb3JtX2lwaV9jYWxsYmFjaykgewogCQlzZXFfcHJpbnRmKHAsICIlKnM6ICIsIHByZWMsICJQTFQiKTsKQEAgLTEzNiw2ICsxNDAsNyBAQAogCXN1bSArPSBpcnFfc3RhdHMoY3B1KS0+aXJxX3NwdXJpb3VzX2NvdW50OwogCXN1bSArPSBpcnFfc3RhdHMoY3B1KS0+YXBpY19wZXJmX2lycXM7CiAJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5hcGljX2lycV93b3JrX2lycXM7CisJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5pY3JfcmVhZF9yZXRyeV9jb3VudDsKICNlbmRpZgogCWlmICh4ODZfcGxhdGZvcm1faXBpX2NhbGxiYWNrKQogCQlzdW0gKz0gaXJxX3N0YXRzKGNwdSktPng4Nl9wbGF0Zm9ybV9pcGlzOwpAQCAtMTgxLDggKzE4Niw4IEBACiAJdW5zaWduZWQgdmVjdG9yID0gfnJlZ3MtPm9yaWdfYXg7CiAJdW5zaWduZWQgaXJxOwogCi0JZXhpdF9pZGxlKCk7CiAJaXJxX2VudGVyKCk7CisJZXhpdF9pZGxlKCk7CiAKIAlpcnEgPSBfX3RoaXNfY3B1X3JlYWQodmVjdG9yX2lycVt2ZWN0b3JdKTsKIApAQCAtMjA5LDEwICsyMTQsMTAgQEAKIAogCWFja19BUElDX2lycSgpOwogCi0JZXhpdF9pZGxlKCk7Ci0KIAlpcnFfZW50ZXIoKTsKIAorCWV4aXRfaWRsZSgpOworCiAJaW5jX2lycV9zdGF0KHg4Nl9wbGF0Zm9ybV9pcGlzKTsKIAogCWlmICh4ODZfcGxhdGZvcm1faXBpX2NhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2lycV82NC5jIGIvYXJjaC94ODYva2VybmVsL2lycV82NC5jCmluZGV4IGFjZjhmYmYuLjY5YmNhNDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxXzY0LmMKQEAgLTM4LDYgKzM4LDkgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVwogCXU2NCBjdXJiYXNlID0gKHU2NCl0YXNrX3N0YWNrX3BhZ2UoY3VycmVudCk7CiAKKwlpZiAodXNlcl9tb2RlX3ZtKHJlZ3MpKQorCQlyZXR1cm47CisKIAlXQVJOX09OQ0UocmVncy0+c3AgPj0gY3VyYmFzZSAmJgogCQkgIHJlZ3MtPnNwIDw9IGN1cmJhc2UgKyBUSFJFQURfU0laRSAmJgogCQkgIHJlZ3MtPnNwIDwgIGN1cmJhc2UgKyBzaXplb2Yoc3RydWN0IHRocmVhZF9pbmZvKSArCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvanVtcF9sYWJlbC5jIGIvYXJjaC94ODYva2VybmVsL2p1bXBfbGFiZWwuYwppbmRleCBlYTlkNWYyZi4uMjg4OWIzZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2p1bXBfbGFiZWwuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvanVtcF9sYWJlbC5jCkBAIC01MCw3ICs1MCw3IEBACiAJcHV0X29ubGluZV9jcHVzKCk7CiB9CiAKLXZvaWQgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAorX19pbml0X29yX21vZHVsZSB2b2lkIGFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm1fc3RhdGljKHN0cnVjdCBqdW1wX2VudHJ5ICplbnRyeSwKIAkJCQkgICAgICBlbnVtIGp1bXBfbGFiZWxfdHlwZSB0eXBlKQogewogCV9fanVtcF9sYWJlbF90cmFuc2Zvcm0oZW50cnksIHR5cGUsIHRleHRfcG9rZV9lYXJseSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9hbWQuYwppbmRleCBkNDk0Nzk5Li5mZTg2NDkzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMKQEAgLTEsMTQgKzEsMTggQEAKIC8qCiAgKiAgQU1EIENQVSBNaWNyb2NvZGUgVXBkYXRlIERyaXZlciBmb3IgTGludXgKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDggQWR2YW5jZWQgTWljcm8gRGV2aWNlcyBJbmMuCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgQWR2YW5jZWQgTWljcm8gRGV2aWNlcyBJbmMuCiAgKgogICogIEF1dGhvcjogUGV0ZXIgT3J1YmEgPHBldGVyLm9ydWJhQGFtZC5jb20+CiAgKgogICogIEJhc2VkIG9uIHdvcmsgYnk6CiAgKiAgVGlncmFuIEFpdmF6aWFuIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+CiAgKgotICogIFRoaXMgZHJpdmVyIGFsbG93cyB0byB1cGdyYWRlIG1pY3JvY29kZSBvbiBBTUQKLSAqICBmYW1pbHkgMHgxMCBhbmQgMHgxMSBwcm9jZXNzb3JzLgorICogIE1haW50YWluZXJzOgorICogIEFuZHJlYXMgSGVycm1hbm4gPGFuZHJlYXMuaGVycm1hbm4zQGFtZC5jb20+CisgKiAgQm9yaXNsYXYgUGV0a292IDxib3Jpc2xhdi5wZXRrb3ZAYW1kLmNvbT4KKyAqCisgKiAgVGhpcyBkcml2ZXIgYWxsb3dzIHRvIHVwZ3JhZGUgbWljcm9jb2RlIG9uIEYxMGggQU1ECisgKiAgQ1BVcyBhbmQgbGF0ZXIuCiAgKgogICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiAgTGljZW5zZSB2ZXJzaW9uIDIuIFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMuCkBAIC03MSw2ICs3NSw5IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZXF1aXZfY3B1X2VudHJ5ICplcXVpdl9jcHVfdGFibGU7CiAKKy8qIHBhZ2Utc2l6ZWQgdWNvZGUgcGF0Y2ggYnVmZmVyICovCit2b2lkICpwYXRjaDsKKwogc3RhdGljIGludCBjb2xsZWN0X2NwdV9pbmZvX2FtZChpbnQgY3B1LCBzdHJ1Y3QgY3B1X3NpZ25hdHVyZSAqY3NpZykKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKQEAgLTg2LDI3ICs5Myw3NiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGdldF9tYXRjaGluZ19taWNyb2NvZGUoaW50IGNwdSwgc3RydWN0IG1pY3JvY29kZV9oZWFkZXJfYW1kICptY19oZHIsCi0JCQkJICBpbnQgcmV2KQorc3RhdGljIHVuc2lnbmVkIGludCB2ZXJpZnlfdWNvZGVfc2l6ZShpbnQgY3B1LCB1MzIgcGF0Y2hfc2l6ZSwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSkKIHsKLQl1bnNpZ25lZCBpbnQgY3VycmVudF9jcHVfaWQ7Ci0JdTE2IGVxdWl2X2NwdV9pZCA9IDA7Ci0JdW5zaWduZWQgaW50IGkgPSAwOworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9ICZjcHVfZGF0YShjcHUpOworCXUzMiBtYXhfc2l6ZTsKKworI2RlZmluZSBGMVhIX01QQl9NQVhfU0laRSAyMDQ4CisjZGVmaW5lIEYxNEhfTVBCX01BWF9TSVpFIDE4MjQKKyNkZWZpbmUgRjE1SF9NUEJfTUFYX1NJWkUgNDA5NgorCisJc3dpdGNoIChjLT54ODYpIHsKKwljYXNlIDB4MTQ6CisJCW1heF9zaXplID0gRjE0SF9NUEJfTUFYX1NJWkU7CisJCWJyZWFrOworCWNhc2UgMHgxNToKKwkJbWF4X3NpemUgPSBGMTVIX01QQl9NQVhfU0laRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWF4X3NpemUgPSBGMVhIX01QQl9NQVhfU0laRTsKKwkJYnJlYWs7CisJfQorCisJaWYgKHBhdGNoX3NpemUgPiBtaW5fdCh1MzIsIHNpemUsIG1heF9zaXplKSkgeworCQlwcl9lcnIoInBhdGNoIHNpemUgbWlzbWF0Y2hcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gcGF0Y2hfc2l6ZTsKK30KKworc3RhdGljIHUxNiBmaW5kX2VxdWl2X2lkKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGN1cnJlbnRfY3B1X2lkLCBpID0gMDsKIAogCUJVR19PTihlcXVpdl9jcHVfdGFibGUgPT0gTlVMTCk7CisKIAljdXJyZW50X2NwdV9pZCA9IGNwdWlkX2VheCgweDAwMDAwMDAxKTsKIAogCXdoaWxlIChlcXVpdl9jcHVfdGFibGVbaV0uaW5zdGFsbGVkX2NwdSAhPSAwKSB7Ci0JCWlmIChjdXJyZW50X2NwdV9pZCA9PSBlcXVpdl9jcHVfdGFibGVbaV0uaW5zdGFsbGVkX2NwdSkgewotCQkJZXF1aXZfY3B1X2lkID0gZXF1aXZfY3B1X3RhYmxlW2ldLmVxdWl2X2NwdTsKLQkJCWJyZWFrOwotCQl9CisJCWlmIChjdXJyZW50X2NwdV9pZCA9PSBlcXVpdl9jcHVfdGFibGVbaV0uaW5zdGFsbGVkX2NwdSkKKwkJCXJldHVybiBlcXVpdl9jcHVfdGFibGVbaV0uZXF1aXZfY3B1OworCiAJCWkrKzsKIAl9CisJcmV0dXJuIDA7Cit9CiAKKy8qCisgKiB3ZSBzaWduYWwgYSBnb29kIHBhdGNoIGlzIGZvdW5kIGJ5IHJldHVybmluZyBpdHMgc2l6ZSA+IDAKKyAqLworc3RhdGljIGludCBnZXRfbWF0Y2hpbmdfbWljcm9jb2RlKGludCBjcHUsIGNvbnN0IHU4ICp1Y29kZV9wdHIsCisJCQkJICB1bnNpZ25lZCBpbnQgbGVmdG92ZXJfc2l6ZSwgaW50IHJldiwKKwkJCQkgIHVuc2lnbmVkIGludCAqY3VycmVudF9zaXplKQoreworCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2FtZCAqbWNfaGRyOworCXVuc2lnbmVkIGludCBhY3R1YWxfc2l6ZTsKKwl1MTYgZXF1aXZfY3B1X2lkOworCisJLyogc2l6ZSBvZiB0aGUgY3VycmVudCBwYXRjaCB3ZSdyZSBzdGFyaW5nIGF0ICovCisJKmN1cnJlbnRfc2l6ZSA9ICoodTMyICopKHVjb2RlX3B0ciArIDQpICsgU0VDVElPTl9IRFJfU0laRTsKKworCWVxdWl2X2NwdV9pZCA9IGZpbmRfZXF1aXZfaWQoKTsKIAlpZiAoIWVxdWl2X2NwdV9pZCkKIAkJcmV0dXJuIDA7CiAKKwkvKgorCSAqIGxldCdzIGxvb2sgYXQgdGhlIHBhdGNoIGhlYWRlciBpdHNlbGYgbm93CisJICovCisJbWNfaGRyID0gKHN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2FtZCAqKSh1Y29kZV9wdHIgKyBTRUNUSU9OX0hEUl9TSVpFKTsKKwogCWlmIChtY19oZHItPnByb2Nlc3Nvcl9yZXZfaWQgIT0gZXF1aXZfY3B1X2lkKQogCQlyZXR1cm4gMDsKIApAQCAtMTIwLDcgKzE3NiwyMCBAQAogCWlmIChtY19oZHItPnBhdGNoX2lkIDw9IHJldikKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gMTsKKwkvKgorCSAqIG5vdyB0aGF0IHRoZSBoZWFkZXIgbG9va3Mgc2FuZSwgdmVyaWZ5IGl0cyBzaXplCisJICovCisJYWN0dWFsX3NpemUgPSB2ZXJpZnlfdWNvZGVfc2l6ZShjcHUsICpjdXJyZW50X3NpemUsIGxlZnRvdmVyX3NpemUpOworCWlmICghYWN0dWFsX3NpemUpCisJCXJldHVybiAwOworCisJLyogY2xlYXIgdGhlIHBhdGNoIGJ1ZmZlciAqLworCW1lbXNldChwYXRjaCwgMCwgUEFHRV9TSVpFKTsKKworCS8qIGFsbCBsb29rcyBvaywgZ2V0IHRoZSBiaW5hcnkgcGF0Y2ggKi8KKwlnZXRfdWNvZGVfZGF0YShwYXRjaCwgdWNvZGVfcHRyICsgU0VDVElPTl9IRFJfU0laRSwgYWN0dWFsX3NpemUpOworCisJcmV0dXJuIGFjdHVhbF9zaXplOwogfQogCiBzdGF0aWMgaW50IGFwcGx5X21pY3JvY29kZV9hbWQoaW50IGNwdSkKQEAgLTE1NSw2MyArMjI0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHVuc2lnbmVkIGludCB2ZXJpZnlfdWNvZGVfc2l6ZShpbnQgY3B1LCBjb25zdCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSkKLXsKLQlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKLQl1MzIgbWF4X3NpemUsIGFjdHVhbF9zaXplOwotCi0jZGVmaW5lIEYxWEhfTVBCX01BWF9TSVpFIDIwNDgKLSNkZWZpbmUgRjE0SF9NUEJfTUFYX1NJWkUgMTgyNAotI2RlZmluZSBGMTVIX01QQl9NQVhfU0laRSA0MDk2Ci0KLQlzd2l0Y2ggKGMtPng4NikgewotCWNhc2UgMHgxNDoKLQkJbWF4X3NpemUgPSBGMTRIX01QQl9NQVhfU0laRTsKLQkJYnJlYWs7Ci0JY2FzZSAweDE1OgotCQltYXhfc2l6ZSA9IEYxNUhfTVBCX01BWF9TSVpFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQltYXhfc2l6ZSA9IEYxWEhfTVBCX01BWF9TSVpFOwotCQlicmVhazsKLQl9Ci0KLQlhY3R1YWxfc2l6ZSA9ICoodTMyICopKGJ1ZiArIDQpOwotCi0JaWYgKGFjdHVhbF9zaXplICsgU0VDVElPTl9IRFJfU0laRSA+IHNpemUgfHwgYWN0dWFsX3NpemUgPiBtYXhfc2l6ZSkgewotCQlwcl9lcnIoInNlY3Rpb24gc2l6ZSBtaXNtYXRjaFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXJldHVybiBhY3R1YWxfc2l6ZTsKLX0KLQotc3RhdGljIHN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2FtZCAqCi1nZXRfbmV4dF91Y29kZShpbnQgY3B1LCBjb25zdCB1OCAqYnVmLCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgaW50ICptY19zaXplKQotewotCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2FtZCAqbWMgPSBOVUxMOwotCXVuc2lnbmVkIGludCBhY3R1YWxfc2l6ZSA9IDA7Ci0KLQlpZiAoKih1MzIgKilidWYgIT0gVUNPREVfVUNPREVfVFlQRSkgewotCQlwcl9lcnIoImludmFsaWQgdHlwZSBmaWVsZCBpbiBjb250YWluZXIgZmlsZSBzZWN0aW9uIGhlYWRlclxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWFjdHVhbF9zaXplID0gdmVyaWZ5X3Vjb2RlX3NpemUoY3B1LCBidWYsIHNpemUpOwotCWlmICghYWN0dWFsX3NpemUpCi0JCWdvdG8gb3V0OwotCi0JbWMgPSB2emFsbG9jKGFjdHVhbF9zaXplKTsKLQlpZiAoIW1jKQotCQlnb3RvIG91dDsKLQotCWdldF91Y29kZV9kYXRhKG1jLCBidWYgKyBTRUNUSU9OX0hEUl9TSVpFLCBhY3R1YWxfc2l6ZSk7Ci0JKm1jX3NpemUgPSBhY3R1YWxfc2l6ZSArIFNFQ1RJT05fSERSX1NJWkU7Ci0KLW91dDoKLQlyZXR1cm4gbWM7Ci19Ci0KIHN0YXRpYyBpbnQgaW5zdGFsbF9lcXVpdl9jcHVfdGFibGUoY29uc3QgdTggKmJ1ZikKIHsKIAl1bnNpZ25lZCBpbnQgKmlidWYgPSAodW5zaWduZWQgaW50ICopYnVmOwpAQCAtMjQ3LDM2ICsyNTksMzggQEAKIHsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCXN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2FtZCAqbWNfaGRyID0gTlVMTDsKLQl1bnNpZ25lZCBpbnQgbWNfc2l6ZSwgbGVmdG92ZXI7CisJdW5zaWduZWQgaW50IG1jX3NpemUsIGxlZnRvdmVyLCBjdXJyZW50X3NpemUgPSAwOwogCWludCBvZmZzZXQ7CiAJY29uc3QgdTggKnVjb2RlX3B0ciA9IGRhdGE7CiAJdm9pZCAqbmV3X21jID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgbmV3X3JldiA9IHVjaS0+Y3B1X3NpZy5yZXY7Ci0JZW51bSB1Y29kZV9zdGF0ZSBzdGF0ZSA9IFVDT0RFX09LOworCWVudW0gdWNvZGVfc3RhdGUgc3RhdGUgPSBVQ09ERV9FUlJPUjsKIAogCW9mZnNldCA9IGluc3RhbGxfZXF1aXZfY3B1X3RhYmxlKHVjb2RlX3B0cik7CiAJaWYgKG9mZnNldCA8IDApIHsKIAkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIGVxdWl2YWxlbnQgY3B1IHRhYmxlXG4iKTsKLQkJcmV0dXJuIFVDT0RFX0VSUk9SOworCQlnb3RvIG91dDsKIAl9Ci0KIAl1Y29kZV9wdHIgKz0gb2Zmc2V0OwogCWxlZnRvdmVyID0gc2l6ZSAtIG9mZnNldDsKIAorCWlmICgqKHUzMiAqKXVjb2RlX3B0ciAhPSBVQ09ERV9VQ09ERV9UWVBFKSB7CisJCXByX2VycigiaW52YWxpZCB0eXBlIGZpZWxkIGluIGNvbnRhaW5lciBmaWxlIHNlY3Rpb24gaGVhZGVyXG4iKTsKKwkJZ290byBmcmVlX3RhYmxlOworCX0KKwogCXdoaWxlIChsZWZ0b3ZlcikgewotCQltY19oZHIgPSBnZXRfbmV4dF91Y29kZShjcHUsIHVjb2RlX3B0ciwgbGVmdG92ZXIsICZtY19zaXplKTsKLQkJaWYgKCFtY19oZHIpCi0JCQlicmVhazsKLQotCQlpZiAoZ2V0X21hdGNoaW5nX21pY3JvY29kZShjcHUsIG1jX2hkciwgbmV3X3JldikpIHsKLQkJCXZmcmVlKG5ld19tYyk7CisJCW1jX3NpemUgPSBnZXRfbWF0Y2hpbmdfbWljcm9jb2RlKGNwdSwgdWNvZGVfcHRyLCBsZWZ0b3ZlciwKKwkJCQkJCSBuZXdfcmV2LCAmY3VycmVudF9zaXplKTsKKwkJaWYgKG1jX3NpemUpIHsKKwkJCW1jX2hkciAgPSBwYXRjaDsKKwkJCW5ld19tYyAgPSBwYXRjaDsKIAkJCW5ld19yZXYgPSBtY19oZHItPnBhdGNoX2lkOwotCQkJbmV3X21jICA9IG1jX2hkcjsKLQkJfSBlbHNlCi0JCQl2ZnJlZShtY19oZHIpOworCQkJZ290byBvdXRfb2s7CisJCX0KIAotCQl1Y29kZV9wdHIgKz0gbWNfc2l6ZTsKLQkJbGVmdG92ZXIgIC09IG1jX3NpemU7CisJCXVjb2RlX3B0ciArPSBjdXJyZW50X3NpemU7CisJCWxlZnRvdmVyICAtPSBjdXJyZW50X3NpemU7CiAJfQogCiAJaWYgKCFuZXdfbWMpIHsKQEAgLTI4NCwxOSArMjk4LDE2IEBACiAJCWdvdG8gZnJlZV90YWJsZTsKIAl9CiAKLQlpZiAoIWxlZnRvdmVyKSB7Ci0JCXZmcmVlKHVjaS0+bWMpOwotCQl1Y2ktPm1jID0gbmV3X21jOwotCQlwcl9kZWJ1ZygiQ1BVJWQgdXBkYXRlIHVjb2RlICgweCUwOHggLT4gMHglMDh4KVxuIiwKLQkJCSBjcHUsIHVjaS0+Y3B1X3NpZy5yZXYsIG5ld19yZXYpOwotCX0gZWxzZSB7Ci0JCXZmcmVlKG5ld19tYyk7Ci0JCXN0YXRlID0gVUNPREVfRVJST1I7Ci0JfQorb3V0X29rOgorCXVjaS0+bWMgPSBuZXdfbWM7CisJc3RhdGUgPSBVQ09ERV9PSzsKKwlwcl9kZWJ1ZygiQ1BVJWQgdXBkYXRlIHVjb2RlICgweCUwOHggLT4gMHglMDh4KVxuIiwKKwkJIGNwdSwgdWNpLT5jcHVfc2lnLnJldiwgbmV3X3Jldik7CiAKIGZyZWVfdGFibGU6CiAJZnJlZV9lcXVpdl9jcHVfdGFibGUoKTsKIAorb3V0OgogCXJldHVybiBzdGF0ZTsKIH0KIApAQCAtMzM3LDcgKzM0OCw2IEBACiB7CiAJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKIAotCXZmcmVlKHVjaS0+bWMpOwogCXVjaS0+bWMgPSBOVUxMOwogfQogCkBAIC0zNTEsNSArMzYxLDE0IEBACiAKIHN0cnVjdCBtaWNyb2NvZGVfb3BzICogX19pbml0IGluaXRfYW1kX21pY3JvY29kZSh2b2lkKQogeworCXBhdGNoID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXRjaCkKKwkJcmV0dXJuIE5VTEw7CisKIAlyZXR1cm4gJm1pY3JvY29kZV9hbWRfb3BzOwogfQorCit2b2lkIF9fZXhpdCBleGl0X2FtZF9taWNyb2NvZGUodm9pZCkKK3sKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGF0Y2gpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9jb3JlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYwppbmRleCBmMmQyYTY2Li45MzAyZTJkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYwpAQCAtMjU2LDcgKzI1Niw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1pY3JvY29kZV9kZXZfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgX19leGl0IG1pY3JvY29kZV9kZXZfZXhpdCh2b2lkKQogewogCW1pc2NfZGVyZWdpc3RlcigmbWljcm9jb2RlX2Rldik7CiB9CkBAIC01MTksMTAgKzUxOSw4IEBACiAKIAltaWNyb2NvZGVfcGRldiA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUoIm1pY3JvY29kZSIsIC0xLAogCQkJCQkJCSBOVUxMLCAwKTsKLQlpZiAoSVNfRVJSKG1pY3JvY29kZV9wZGV2KSkgewotCQltaWNyb2NvZGVfZGV2X2V4aXQoKTsKKwlpZiAoSVNfRVJSKG1pY3JvY29kZV9wZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIobWljcm9jb2RlX3BkZXYpOwotCX0KIAogCWdldF9vbmxpbmVfY3B1cygpOwogCW11dGV4X2xvY2soJm1pY3JvY29kZV9tdXRleCk7CkBAIC01MzIsMTQgKzUzMCwxMiBAQAogCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKIAlwdXRfb25saW5lX2NwdXMoKTsKIAotCWlmIChlcnJvcikgewotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihtaWNyb2NvZGVfcGRldik7Ci0JCXJldHVybiBlcnJvcjsKLQl9CisJaWYgKGVycm9yKQorCQlnb3RvIG91dF9wZGV2OwogCiAJZXJyb3IgPSBtaWNyb2NvZGVfZGV2X2luaXQoKTsKIAlpZiAoZXJyb3IpCi0JCXJldHVybiBlcnJvcjsKKwkJZ290byBvdXRfc3lzZGV2X2RyaXZlcjsKIAogCXJlZ2lzdGVyX3N5c2NvcmVfb3BzKCZtY19zeXNjb3JlX29wcyk7CiAJcmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZtY19jcHVfbm90aWZpZXIpOwpAQCAtNTQ4LDExICs1NDQsMjcgQEAKIAkJIiA8dGlncmFuQGFpdmF6aWFuLmZzbmV0LmNvLnVrPiwgUGV0ZXIgT3J1YmFcbiIpOwogCiAJcmV0dXJuIDA7CisKK291dF9zeXNkZXZfZHJpdmVyOgorCWdldF9vbmxpbmVfY3B1cygpOworCW11dGV4X2xvY2soJm1pY3JvY29kZV9tdXRleCk7CisKKwlzeXNkZXZfZHJpdmVyX3VucmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsICZtY19zeXNkZXZfZHJpdmVyKTsKKworCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKKwlwdXRfb25saW5lX2NwdXMoKTsKKworb3V0X3BkZXY6CisJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobWljcm9jb2RlX3BkZXYpOworCXJldHVybiBlcnJvcjsKKwogfQogbW9kdWxlX2luaXQobWljcm9jb2RlX2luaXQpOwogCiBzdGF0aWMgdm9pZCBfX2V4aXQgbWljcm9jb2RlX2V4aXQodm9pZCkKIHsKKwlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoMCk7CisKIAltaWNyb2NvZGVfZGV2X2V4aXQoKTsKIAogCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZtY19jcHVfbm90aWZpZXIpOwpAQCAtNTcwLDYgKzU4Miw5IEBACiAKIAltaWNyb2NvZGVfb3BzID0gTlVMTDsKIAorCWlmIChjLT54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKQorCQlleGl0X2FtZF9taWNyb2NvZGUoKTsKKwogCXByX2luZm8oIk1pY3JvY29kZSBVcGRhdGUgRHJpdmVyOiB2IiBNSUNST0NPREVfVkVSU0lPTiAiIHJlbW92ZWQuXG4iKTsKIH0KIG1vZHVsZV9leGl0KG1pY3JvY29kZV9leGl0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jCmluZGV4IDkxMDNiODkuLmNhNDcwZTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMKKysrIGIvYXJjaC94ODYva2VybmVsL21wcGFyc2UuYwpAQCAtOTUsOCArOTUsOCBAQAogCX0KICNlbmRpZgogCisJc2V0X2JpdChtLT5idXNpZCwgbXBfYnVzX25vdF9wY2kpOwogCWlmIChzdHJuY21wKHN0ciwgQlVTVFlQRV9JU0EsIHNpemVvZihCVVNUWVBFX0lTQSkgLSAxKSA9PSAwKSB7Ci0JCXNldF9iaXQobS0+YnVzaWQsIG1wX2J1c19ub3RfcGNpKTsKICNpZiBkZWZpbmVkKENPTkZJR19FSVNBKSB8fCBkZWZpbmVkKENPTkZJR19NQ0EpCiAJCW1wX2J1c19pZF90b190eXBlW20tPmJ1c2lkXSA9IE1QX0JVU19JU0E7CiAjZW5kaWYKQEAgLTU2NCw5ICs1NjQsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgc21wX3Jlc2VydmVfbWVtb3J5KHN0cnVjdCBtcGZfaW50ZWwgKm1wZikKIHsKLQl1bnNpZ25lZCBsb25nIHNpemUgPSBnZXRfbXBjX3NpemUobXBmLT5waHlzcHRyKTsKLQotCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKG1wZi0+cGh5c3B0ciwgbXBmLT5waHlzcHRyK3NpemUsICIqIE1QLXRhYmxlIG1wYyIpOworCW1lbWJsb2NrX3Jlc2VydmUobXBmLT5waHlzcHRyLCBnZXRfbXBjX3NpemUobXBmLT5waHlzcHRyKSk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHNtcF9zY2FuX2NvbmZpZyh1bnNpZ25lZCBsb25nIGJhc2UsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKQpAQCAtNTk1LDcgKzU5Myw3IEBACiAJCQkgICAgICAgbXBmLCAodTY0KXZpcnRfdG9fcGh5cyhtcGYpKTsKIAogCQkJbWVtID0gdmlydF90b19waHlzKG1wZik7Ci0JCQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShtZW0sIG1lbSArIHNpemVvZigqbXBmKSwgIiogTVAtdGFibGUgbXBmIik7CisJCQltZW1ibG9ja19yZXNlcnZlKG1lbSwgc2l6ZW9mKCptcGYpKTsKIAkJCWlmIChtcGYtPnBoeXNwdHIpCiAJCQkJc21wX3Jlc2VydmVfbWVtb3J5KG1wZik7CiAKQEAgLTgzNiwxMCArODM0LDggQEAKIAogdm9pZCBfX2luaXQgZWFybHlfcmVzZXJ2ZV9lODIwX21wY19uZXcodm9pZCkKIHsKLQlpZiAoZW5hYmxlX3VwZGF0ZV9tcHRhYmxlICYmIGFsbG9jX21wdGFibGUpIHsKLQkJdTY0IHN0YXJ0dCA9IDA7Ci0JCW1wY19uZXdfcGh5cyA9IGVhcmx5X3Jlc2VydmVfZTgyMChzdGFydHQsIG1wY19uZXdfbGVuZ3RoLCA0KTsKLQl9CisJaWYgKGVuYWJsZV91cGRhdGVfbXB0YWJsZSAmJiBhbGxvY19tcHRhYmxlKQorCQltcGNfbmV3X3BoeXMgPSBlYXJseV9yZXNlcnZlX2U4MjAobXBjX25ld19sZW5ndGgsIDQpOwogfQogCiBzdGF0aWMgaW50IF9faW5pdCB1cGRhdGVfbXBfdGFibGUodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGI5YjNiMWEuLjE1NzYzYWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtMjkzLDcgKzI5Myw3IEBACiAJcmVncy5vcmlnX2F4ID0gLTE7CiAJcmVncy5pcCA9ICh1bnNpZ25lZCBsb25nKSBrZXJuZWxfdGhyZWFkX2hlbHBlcjsKIAlyZWdzLmNzID0gX19LRVJORUxfQ1MgfCBnZXRfa2VybmVsX3JwbCgpOwotCXJlZ3MuZmxhZ3MgPSBYODZfRUZMQUdTX0lGIHwgMHgyOworCXJlZ3MuZmxhZ3MgPSBYODZfRUZMQUdTX0lGIHwgWDg2X0VGTEFHU19CSVQxOwogCiAJLyogT2ssIGNyZWF0ZSB0aGUgbmV3IHByb2Nlc3MuLiAqLwogCXJldHVybiBkb19mb3JrKGZsYWdzIHwgQ0xPTkVfVk0gfCBDTE9ORV9VTlRSQUNFRCwgMCwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOwpAQCAtNDAzLDYgKzQwMywxNCBAQAogRVhQT1JUX1NZTUJPTChkZWZhdWx0X2lkbGUpOwogI2VuZGlmCiAKK2Jvb2wgc2V0X3BtX2lkbGVfdG9fZGVmYXVsdCh2b2lkKQoreworCWJvb2wgcmV0ID0gISFwbV9pZGxlOworCisJcG1faWRsZSA9IGRlZmF1bHRfaWRsZTsKKworCXJldHVybiByZXQ7Cit9CiB2b2lkIHN0b3BfdGhpc19jcHUodm9pZCAqZHVtbXkpCiB7CiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCmluZGV4IDc5NWI3OWYuLjQ4NTIwNGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYwpAQCAtOTksNyArOTksOCBAQAogCiAJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KIAl3aGlsZSAoMSkgewotCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKDEpOworCQl0aWNrX25vaHpfaWRsZV9lbnRlcigpOworCQlyY3VfaWRsZV9lbnRlcigpOwogCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CiAKIAkJCWNoZWNrX3BndF9jYWNoZSgpOwpAQCAtMTE2LDcgKzExNyw4IEBACiAJCQkJcG1faWRsZSgpOwogCQkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOwogCQl9Ci0JCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKKwkJcmN1X2lkbGVfZXhpdCgpOworCQl0aWNrX25vaHpfaWRsZV9leGl0KCk7CiAJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIAkJc2NoZWR1bGUoKTsKIAkJcHJlZW1wdF9kaXNhYmxlKCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCAzYmQ3ZTZlLi45YjlmZTRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTEyMiw3ICsxMjIsNyBAQAogCiAJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KIAl3aGlsZSAoMSkgewotCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKDEpOworCQl0aWNrX25vaHpfaWRsZV9lbnRlcigpOwogCQl3aGlsZSAoIW5lZWRfcmVzY2hlZCgpKSB7CiAKIAkJCXJtYigpOwpAQCAtMTM5LDggKzEzOSwxNCBAQAogCQkJZW50ZXJfaWRsZSgpOwogCQkJLyogRG9uJ3QgdHJhY2UgaXJxcyBvZmYgZm9yIGlkbGUgKi8KIAkJCXN0b3BfY3JpdGljYWxfdGltaW5ncygpOworCisJCQkvKiBlbnRlcl9pZGxlKCkgbmVlZHMgcmN1IGZvciBub3RpZmllcnMgKi8KKwkJCXJjdV9pZGxlX2VudGVyKCk7CisKIAkJCWlmIChjcHVpZGxlX2lkbGVfY2FsbCgpKQogCQkJCXBtX2lkbGUoKTsKKworCQkJcmN1X2lkbGVfZXhpdCgpOwogCQkJc3RhcnRfY3JpdGljYWxfdGltaW5ncygpOwogCiAJCQkvKiBJbiBtYW55IGNhc2VzIHRoZSBpbnRlcnJ1cHQgdGhhdCBlbmRlZCBpZGxlCkBAIC0xNDksNyArMTU1LDcgQEAKIAkJCV9fZXhpdF9pZGxlKCk7CiAJCX0KIAotCQl0aWNrX25vaHpfcmVzdGFydF9zY2hlZF90aWNrKCk7CisJCXRpY2tfbm9oel9pZGxlX2V4aXQoKTsKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCQlzY2hlZHVsZSgpOwogCQlwcmVlbXB0X2Rpc2FibGUoKTsKQEAgLTI5MywxMyArMjk5LDEyIEBACiAJbWVtc2V0KHAtPnRocmVhZC5wdHJhY2VfYnBzLCAwLCBzaXplb2YocC0+dGhyZWFkLnB0cmFjZV9icHMpKTsKIAogCWlmICh1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhtZSwgVElGX0lPX0JJVE1BUCkpKSB7Ci0JCXAtPnRocmVhZC5pb19iaXRtYXBfcHRyID0ga21hbGxvYyhJT19CSVRNQVBfQllURVMsIEdGUF9LRVJORUwpOworCQlwLT50aHJlYWQuaW9fYml0bWFwX3B0ciA9IGttZW1kdXAobWUtPnRocmVhZC5pb19iaXRtYXBfcHRyLAorCQkJCQkJICBJT19CSVRNQVBfQllURVMsIEdGUF9LRVJORUwpOwogCQlpZiAoIXAtPnRocmVhZC5pb19iaXRtYXBfcHRyKSB7CiAJCQlwLT50aHJlYWQuaW9fYml0bWFwX21heCA9IDA7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQotCQltZW1jcHkocC0+dGhyZWFkLmlvX2JpdG1hcF9wdHIsIG1lLT50aHJlYWQuaW9fYml0bWFwX3B0ciwKLQkJCQlJT19CSVRNQVBfQllURVMpOwogCQlzZXRfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9JT19CSVRNQVApOwogCX0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCmluZGV4IDgyNTI4NzkuLjg5YTA0YzcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTc0OSw3ICs3NDksOCBAQAogLyoKICAqIEhhbmRsZSBQVFJBQ0VfUE9LRVVTUiBjYWxscyBmb3IgdGhlIGRlYnVnIHJlZ2lzdGVyIGFyZWEuCiAgKi8KLWludCBwdHJhY2Vfc2V0X2RlYnVncmVnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgbiwgdW5zaWduZWQgbG9uZyB2YWwpCitzdGF0aWMgaW50IHB0cmFjZV9zZXRfZGVidWdyZWcoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBuLAorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsKQogewogCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQgPSAmKHRzay0+dGhyZWFkKTsKIAlpbnQgcmMgPSAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jIGIvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jCmluZGV4IGI3ODY0M2QuLjAzOTIwYTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMKQEAgLTU1Myw0ICs1NTMsMTcgQEAKIAkJCXF1aXJrX2FtZF9uYl9ub2RlKTsKIERFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xMEhfTkJfTElOSywKIAkJCXF1aXJrX2FtZF9uYl9ub2RlKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xNUhfTkJfRjAsCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTVIX05CX0YxLAorCQkJcXVpcmtfYW1kX25iX25vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzE1SF9OQl9GMiwKKwkJCXF1aXJrX2FtZF9uYl9ub2RlKTsKK0RFQ0xBUkVfUENJX0ZJWFVQX0ZJTkFMKFBDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF8xNUhfTkJfRjMsCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTVIX05CX0Y0LAorCQkJcXVpcmtfYW1kX25iX25vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzE1SF9OQl9GNSwKKwkJCXF1aXJrX2FtZF9uYl9ub2RlKTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKaW5kZXggZTMzNGJlMS4uMzdhNDU4YiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwpAQCAtMTI0LDcgKzEyNCw3IEBACiAgKi8KIAogLyoKLSAqIFNvbWUgbWFjaGluZXMgcmVxdWlyZSB0aGUgInJlYm9vdD1iIiAgY29tbWFuZGxpbmUgb3B0aW9uLAorICogU29tZSBtYWNoaW5lcyByZXF1aXJlIHRoZSAicmVib290PWIiIG9yICJyZWJvb3Q9ayIgIGNvbW1hbmRsaW5lIG9wdGlvbnMsCiAgKiB0aGlzIHF1aXJrIG1ha2VzIHRoYXQgYXV0b21hdGljLgogICovCiBzdGF0aWMgaW50IF9faW5pdCBzZXRfYmlvc19yZWJvb3QoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmQpCkBAIC0xMzYsNiArMTM2LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgX19pbml0IHNldF9rYmRfcmVib290KGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChyZWJvb3RfdHlwZSAhPSBCT09UX0tCRCkgeworCQlyZWJvb3RfdHlwZSA9IEJPT1RfS0JEOworCQlwcmludGsoS0VSTl9JTkZPICIlcyBzZXJpZXMgYm9hcmQgZGV0ZWN0ZWQuIFNlbGVjdGluZyBLQkQtbWV0aG9kIGZvciByZWJvb3QuXG4iLCBkLT5pZGVudCk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IGRtaV9zeXN0ZW1faWQgX19pbml0ZGF0YSByZWJvb3RfZG1pX3RhYmxlW10gPSB7CiAJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gRGVsbCBFNTIwJ3MgKi8KIAkJLmNhbGxiYWNrID0gc2V0X2Jpb3NfcmVib290LApAQCAtMjk1LDcgKzMwNCw3IEBACiAJCX0sCiAJfSwKIAl7IC8qIEhhbmRsZSByZWJvb3QgaXNzdWUgb24gQWNlciBBc3BpcmUgb25lICovCi0JCS5jYWxsYmFjayA9IHNldF9iaW9zX3JlYm9vdCwKKwkJLmNhbGxiYWNrID0gc2V0X2tiZF9yZWJvb3QsCiAJCS5pZGVudCA9ICJBY2VyIEFzcGlyZSBPbmUgQTExMCIsCiAJCS5tYXRjaGVzID0gewogCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiQWNlciIpLApAQCAtNDQzLDYgKzQ1MiwxNCBAQAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJMYXRpdHVkZSBFNjQyMCIpLAogCQl9LAogCX0sCisJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gdGhlIE9wdGlQbGV4IDk5MC4gKi8KKwkJLmNhbGxiYWNrID0gc2V0X3BjaV9yZWJvb3QsCisJCS5pZGVudCA9ICJEZWxsIE9wdGlQbGV4IDk5MCIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiRGVsbCBJbmMuIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIk9wdGlQbGV4IDk5MCIpLAorCQl9LAorCX0sCiAJeyB9CiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcnRjLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcnRjLmMKaW5kZXggMzQ4Y2UwMS4uYWY2ZGI2ZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3J0Yy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9ydGMuYwpAQCAtMTIsNiArMTIsNyBAQAogI2luY2x1ZGUgPGFzbS92c3lzY2FsbC5oPgogI2luY2x1ZGUgPGFzbS94ODZfaW5pdC5oPgogI2luY2x1ZGUgPGFzbS90aW1lLmg+CisjaW5jbHVkZSA8YXNtL21yc3QuaD4KIAogI2lmZGVmIENPTkZJR19YODZfMzIKIC8qCkBAIC0yNDIsNiArMjQzLDEwIEBACiAJaWYgKG9mX2hhdmVfcG9wdWxhdGVkX2R0KCkpCiAJCXJldHVybiAwOwogCisJLyogSW50ZWwgTUlEIHBsYXRmb3JtcyBkb24ndCBoYXZlIGlvcG9ydCBydGMgKi8KKwlpZiAobXJzdF9pZGVudGlmeV9jcHUoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXIoJnJ0Y19kZXZpY2UpOwogCWRldl9pbmZvKCZydGNfZGV2aWNlLmRldiwKIAkJICJyZWdpc3RlcmVkIHBsYXRmb3JtIFJUQyBkZXZpY2UgKG5vIFBOUCBkZXZpY2UgZm91bmQpXG4iKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jIGIvYXJjaC94ODYva2VybmVsL3NldHVwLmMKaW5kZXggY2YwZWY5OC4uZDA1NDQ0YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NldHVwLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NldHVwLmMKQEAgLTMwNiw3ICszMDYsOCBAQAogc3RhdGljIHZvaWQgX19pbml0IHJlc2VydmVfYnJrKHZvaWQpCiB7CiAJaWYgKF9icmtfZW5kID4gX2Jya19zdGFydCkKLQkJbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UoX19wYShfYnJrX3N0YXJ0KSwgX19wYShfYnJrX2VuZCksICJCUksiKTsKKwkJbWVtYmxvY2tfcmVzZXJ2ZShfX3BhKF9icmtfc3RhcnQpLAorCQkJCSBfX3BhKF9icmtfZW5kKSAtIF9fcGEoX2Jya19zdGFydCkpOwogCiAJLyogTWFyayBicmsgYXJlYSBhcyBsb2NrZWQgZG93biBhbmQgbm8gbG9uZ2VyIHRha2luZyBhbnkKIAkgICBuZXcgYWxsb2NhdGlvbnMgKi8KQEAgLTMzMSwxMyArMzMyLDEzIEBACiAJcmFtZGlza19oZXJlID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZSgwLCBlbmRfb2ZfbG93bWVtLCBhcmVhX3NpemUsCiAJCQkJCSBQQUdFX1NJWkUpOwogCi0JaWYgKHJhbWRpc2tfaGVyZSA9PSBNRU1CTE9DS19FUlJPUikKKwlpZiAoIXJhbWRpc2tfaGVyZSkKIAkJcGFuaWMoIkNhbm5vdCBmaW5kIHBsYWNlIGZvciBuZXcgUkFNRElTSyBvZiBzaXplICVsbGRcbiIsCiAJCQkgcmFtZGlza19zaXplKTsKIAogCS8qIE5vdGU6IHRoaXMgaW5jbHVkZXMgYWxsIHRoZSBsb3dtZW0gY3VycmVudGx5IG9jY3VwaWVkIGJ5CiAJICAgdGhlIGluaXRyZCwgd2UgcmVseSBvbiB0aGF0IGZhY3QgdG8ga2VlcCB0aGUgZGF0YSBpbnRhY3QuICovCi0JbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UocmFtZGlza19oZXJlLCByYW1kaXNrX2hlcmUgKyBhcmVhX3NpemUsICJORVcgUkFNRElTSyIpOworCW1lbWJsb2NrX3Jlc2VydmUocmFtZGlza19oZXJlLCBhcmVhX3NpemUpOwogCWluaXRyZF9zdGFydCA9IHJhbWRpc2tfaGVyZSArIFBBR0VfT0ZGU0VUOwogCWluaXRyZF9lbmQgICA9IGluaXRyZF9zdGFydCArIHJhbWRpc2tfc2l6ZTsKIAlwcmludGsoS0VSTl9JTkZPICJBbGxvY2F0ZWQgbmV3IFJBTURJU0s6ICUwOGxseCAtICUwOGxseFxuIiwKQEAgLTM5Myw3ICszOTQsNyBAQAogCWluaXRyZF9zdGFydCA9IDA7CiAKIAlpZiAocmFtZGlza19zaXplID49IChlbmRfb2ZfbG93bWVtPj4xKSkgewotCQltZW1ibG9ja194ODZfZnJlZV9yYW5nZShyYW1kaXNrX2ltYWdlLCByYW1kaXNrX2VuZCk7CisJCW1lbWJsb2NrX2ZyZWUocmFtZGlza19pbWFnZSwgcmFtZGlza19lbmQgLSByYW1kaXNrX2ltYWdlKTsKIAkJcHJpbnRrKEtFUk5fRVJSICJpbml0cmQgdG9vIGxhcmdlIHRvIGhhbmRsZSwgIgogCQkgICAgICAgImRpc2FibGluZyBpbml0cmRcbiIpOwogCQlyZXR1cm47CkBAIC00MTYsNyArNDE3LDcgQEAKIAogCXJlbG9jYXRlX2luaXRyZCgpOwogCi0JbWVtYmxvY2tfeDg2X2ZyZWVfcmFuZ2UocmFtZGlza19pbWFnZSwgcmFtZGlza19lbmQpOworCW1lbWJsb2NrX2ZyZWUocmFtZGlza19pbWFnZSwgcmFtZGlza19lbmQgLSByYW1kaXNrX2ltYWdlKTsKIH0KICNlbHNlCiBzdGF0aWMgdm9pZCBfX2luaXQgcmVzZXJ2ZV9pbml0cmQodm9pZCkKQEAgLTQ5MCwxNSArNDkxLDEzIEBACiB7CiAJc3RydWN0IHNldHVwX2RhdGEgKmRhdGE7CiAJdTY0IHBhX2RhdGE7Ci0JY2hhciBidWZbMzJdOwogCiAJaWYgKGJvb3RfcGFyYW1zLmhkci52ZXJzaW9uIDwgMHgwMjA5KQogCQlyZXR1cm47CiAJcGFfZGF0YSA9IGJvb3RfcGFyYW1zLmhkci5zZXR1cF9kYXRhOwogCXdoaWxlIChwYV9kYXRhKSB7CiAJCWRhdGEgPSBlYXJseV9tZW1yZW1hcChwYV9kYXRhLCBzaXplb2YoKmRhdGEpKTsKLQkJc3ByaW50ZihidWYsICJzZXR1cCBkYXRhICV4IiwgZGF0YS0+dHlwZSk7Ci0JCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHBhX2RhdGEsIHBhX2RhdGErc2l6ZW9mKCpkYXRhKStkYXRhLT5sZW4sIGJ1Zik7CisJCW1lbWJsb2NrX3Jlc2VydmUocGFfZGF0YSwgc2l6ZW9mKCpkYXRhKSArIGRhdGEtPmxlbik7CiAJCXBhX2RhdGEgPSBkYXRhLT5uZXh0OwogCQllYXJseV9pb3VubWFwKGRhdGEsIHNpemVvZigqZGF0YSkpOwogCX0KQEAgLTU1NCw3ICs1NTMsNyBAQAogCQljcmFzaF9iYXNlID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZShhbGlnbm1lbnQsCiAJCQkgICAgICAgQ1JBU0hfS0VSTkVMX0FERFJfTUFYLCBjcmFzaF9zaXplLCBhbGlnbm1lbnQpOwogCi0JCWlmIChjcmFzaF9iYXNlID09IE1FTUJMT0NLX0VSUk9SKSB7CisJCWlmICghY3Jhc2hfYmFzZSkgewogCQkJcHJfaW5mbygiY3Jhc2hrZXJuZWwgcmVzZXJ2YXRpb24gZmFpbGVkIC0gTm8gc3VpdGFibGUgYXJlYSBmb3VuZC5cbiIpOwogCQkJcmV0dXJuOwogCQl9CkBAIC01NjgsNyArNTY3LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCX0KLQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShjcmFzaF9iYXNlLCBjcmFzaF9iYXNlICsgY3Jhc2hfc2l6ZSwgIkNSQVNIIEtFUk5FTCIpOworCW1lbWJsb2NrX3Jlc2VydmUoY3Jhc2hfYmFzZSwgY3Jhc2hfc2l6ZSk7CiAKIAlwcmludGsoS0VSTl9JTkZPICJSZXNlcnZpbmcgJWxkTUIgb2YgbWVtb3J5IGF0ICVsZE1CICIKIAkJCSJmb3IgY3Jhc2hrZXJuZWwgKFN5c3RlbSBSQU06ICVsZE1CKVxuIiwKQEAgLTYyNiw3ICs2MjUsNyBAQAogCWFkZHIgPSBmaW5kX2liZnRfcmVnaW9uKCZzaXplKTsKIAogCWlmIChzaXplKQotCQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShhZGRyLCBhZGRyICsgc2l6ZSwgIiogaWJmdCIpOworCQltZW1ibG9ja19yZXNlcnZlKGFkZHIsIHNpemUpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgcmVzZXJ2ZV9sb3cgPSBDT05GSUdfWDg2X1JFU0VSVkVfTE9XIDw8IDEwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggOWY1NDhjYi4uZTM4ZTIxNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCkBAIC04NDAsNyArODQwLDggQEAKIAlwcl9kZWJ1ZygiKysrKysrKysrKysrKysrKysrKys9Xy0tLUNQVSBVUCAgJXVcbiIsIGNwdSk7CiAKIAlpZiAoYXBpY2lkID09IEJBRF9BUElDSUQgfHwgYXBpY2lkID09IGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCB8fAotCSAgICAhcGh5c2lkX2lzc2V0KGFwaWNpZCwgcGh5c19jcHVfcHJlc2VudF9tYXApKSB7CisJICAgICFwaHlzaWRfaXNzZXQoYXBpY2lkLCBwaHlzX2NwdV9wcmVzZW50X21hcCkgfHwKKwkgICAgKCF4MmFwaWNfbW9kZSAmJiBhcGljaWQgPj0gMjU1KSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBiYWQgY3B1ICVkXG4iLCBfX2Z1bmNfXywgY3B1KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RyYW1wb2xpbmUuYyBiL2FyY2gveDg2L2tlcm5lbC90cmFtcG9saW5lLmMKaW5kZXggYTkxYWU3Ny4uYTczYjYxMCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYW1wb2xpbmUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHJhbXBvbGluZS5jCkBAIC0xNCwxMSArMTQsMTEgQEAKIAogCS8qIEhhcyB0byBiZSBpbiB2ZXJ5IGxvdyBtZW1vcnkgc28gd2UgY2FuIGV4ZWN1dGUgcmVhbC1tb2RlIEFQIGNvZGUuICovCiAJbWVtID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZSgwLCAxPDwyMCwgc2l6ZSwgUEFHRV9TSVpFKTsKLQlpZiAobWVtID09IE1FTUJMT0NLX0VSUk9SKQorCWlmICghbWVtKQogCQlwYW5pYygiQ2Fubm90IGFsbG9jYXRlIHRyYW1wb2xpbmVcbiIpOwogCiAJeDg2X3RyYW1wb2xpbmVfYmFzZSA9IF9fdmEobWVtKTsKLQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShtZW0sIG1lbSArIHNpemUsICJUUkFNUE9MSU5FIik7CisJbWVtYmxvY2tfcmVzZXJ2ZShtZW0sIHNpemUpOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIkJhc2UgbWVtb3J5IHRyYW1wb2xpbmUgYXQgWyVwXSAlbGx4IHNpemUgJXp1XG4iLAogCSAgICAgICB4ODZfdHJhbXBvbGluZV9iYXNlLCAodW5zaWduZWQgbG9uZyBsb25nKW1lbSwgc2l6ZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdHJhcHMuYyBiL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCmluZGV4IGE4ZTNlYjguLmZhMTE5MWYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jCkBAIC0zMDYsMTUgKzMwNiwxMCBAQAogCQkJPT0gTk9USUZZX1NUT1ApCiAJCXJldHVybjsKICNlbmRpZiAvKiBDT05GSUdfS0dEQl9MT1dfTEVWRUxfVFJBUCAqLwotI2lmZGVmIENPTkZJR19LUFJPQkVTCisKIAlpZiAobm90aWZ5X2RpZShESUVfSU5UMywgImludDMiLCByZWdzLCBlcnJvcl9jb2RlLCAzLCBTSUdUUkFQKQogCQkJPT0gTk9USUZZX1NUT1ApCiAJCXJldHVybjsKLSNlbHNlCi0JaWYgKG5vdGlmeV9kaWUoRElFX1RSQVAsICJpbnQzIiwgcmVncywgZXJyb3JfY29kZSwgMywgU0lHVFJBUCkKLQkJCT09IE5PVElGWV9TVE9QKQotCQlyZXR1cm47Ci0jZW5kaWYKIAogCXByZWVtcHRfY29uZGl0aW9uYWxfc3RpKHJlZ3MpOwogCWRvX3RyYXAoMywgU0lHVFJBUCwgImludDMiLCByZWdzLCBlcnJvcl9jb2RlLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2MuYyBiL2FyY2gveDg2L2tlcm5lbC90c2MuYwppbmRleCBkYjQ4MzM2Li4yYzljZjBmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCkBAIC0zNSw3ICszNSw3IEBACiAgICBlcnJvbmVvdXMgcmR0c2MgdXNhZ2Ugb24gIWNwdV9oYXNfdHNjIHByb2Nlc3NvcnMgKi8KIHN0YXRpYyBpbnQgX19yZWFkX21vc3RseSB0c2NfZGlzYWJsZWQgPSAtMTsKIAotc3RhdGljIGludCB0c2NfY2xvY2tzb3VyY2VfcmVsaWFibGU7CitpbnQgdHNjX2Nsb2Nrc291cmNlX3JlbGlhYmxlOwogLyoKICAqIFNjaGVkdWxlciBjbG9jayAtIHJldHVybnMgY3VycmVudCB0aW1lIGluIG5hbm9zZWMgdW5pdHMuCiAgKi8KQEAgLTE3OCwxMSArMTc4LDExIEBACiB9CiAKICNkZWZpbmUgQ0FMX01TCQkxMAotI2RlZmluZSBDQUxfTEFUQ0gJKENMT0NLX1RJQ0tfUkFURSAvICgxMDAwIC8gQ0FMX01TKSkKKyNkZWZpbmUgQ0FMX0xBVENICShQSVRfVElDS19SQVRFIC8gKDEwMDAgLyBDQUxfTVMpKQogI2RlZmluZSBDQUxfUElUX0xPT1BTCTEwMDAKIAogI2RlZmluZSBDQUwyX01TCQk1MAotI2RlZmluZSBDQUwyX0xBVENICShDTE9DS19USUNLX1JBVEUgLyAoMTAwMCAvIENBTDJfTVMpKQorI2RlZmluZSBDQUwyX0xBVENICShQSVRfVElDS19SQVRFIC8gKDEwMDAgLyBDQUwyX01TKSkKICNkZWZpbmUgQ0FMMl9QSVRfTE9PUFMJNTAwMAogCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2Nfc3luYy5jIGIvYXJjaC94ODYva2VybmVsL3RzY19zeW5jLmMKaW5kZXggMGFhNWZlZDguLjllYmEyOWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90c2Nfc3luYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC90c2Nfc3luYy5jCkBAIC0xMTMsNyArMTEzLDcgQEAKIAlpZiAodW5zeW5jaHJvbml6ZWRfdHNjKCkpCiAJCXJldHVybjsKIAotCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfVFNDX1JFTElBQkxFKSkgeworCWlmICh0c2NfY2xvY2tzb3VyY2VfcmVsaWFibGUpIHsKIAkJaWYgKGNwdSA9PSAobnJfY3B1X2lkcy0xKSB8fCBzeXN0ZW1fc3RhdGUgIT0gU1lTVEVNX0JPT1RJTkcpCiAJCQlwcl9pbmZvKAogCQkJIlNraXBwZWQgc3luY2hyb25pemF0aW9uIGNoZWNrcyBhcyBUU0MgaXMgcmVsaWFibGUuXG4iKTsKQEAgLTE3Miw3ICsxNzIsNyBAQAogewogCWludCBjcHVzID0gMjsKIAotCWlmICh1bnN5bmNocm9uaXplZF90c2MoKSB8fCBib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfVFNDX1JFTElBQkxFKSkKKwlpZiAodW5zeW5jaHJvbml6ZWRfdHNjKCkgfHwgdHNjX2Nsb2Nrc291cmNlX3JlbGlhYmxlKQogCQlyZXR1cm47CiAKIAkvKgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwppbmRleCBlNGQ0YTIyLi5iMDdiYTkzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwpAQCAtNTcsNyArNTcsNyBAQAogCS5sb2NrID0gX19TRVFMT0NLX1VOTE9DS0VEKF9fdnN5c2NhbGxfZ3RvZF9kYXRhLmxvY2spLAogfTsKIAotc3RhdGljIGVudW0geyBFTVVMQVRFLCBOQVRJVkUsIE5PTkUgfSB2c3lzY2FsbF9tb2RlID0gTkFUSVZFOworc3RhdGljIGVudW0geyBFTVVMQVRFLCBOQVRJVkUsIE5PTkUgfSB2c3lzY2FsbF9tb2RlID0gRU1VTEFURTsKIAogc3RhdGljIGludCBfX2luaXQgdnN5c2NhbGxfc2V0dXAoY2hhciAqc3RyKQogewpAQCAtMTQwLDExICsxNDAsNDAgQEAKIAlyZXR1cm4gbnI7CiB9CiAKK3N0YXRpYyBib29sIHdyaXRlX29rX29yX3NlZ3YodW5zaWduZWQgbG9uZyBwdHIsIHNpemVfdCBzaXplKQoreworCS8qCisJICogWFhYOiBpZiBhY2Nlc3Nfb2ssIGdldF91c2VyLCBhbmQgcHV0X3VzZXIgaGFuZGxlZAorCSAqIHNpZ19vbl91YWNjZXNzX2Vycm9yLCB0aGlzIGNvdWxkIGdvIGF3YXkuCisJICovCisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkIF9fdXNlciAqKXB0ciwgc2l6ZSkpIHsKKwkJc2lnaW5mb190IGluZm87CisJCXN0cnVjdCB0aHJlYWRfc3RydWN0ICp0aHJlYWQgPSAmY3VycmVudC0+dGhyZWFkOworCisJCXRocmVhZC0+ZXJyb3JfY29kZQk9IDY7ICAvKiB1c2VyIGZhdWx0LCBubyBwYWdlLCB3cml0ZSAqLworCQl0aHJlYWQtPmNyMgkJPSBwdHI7CisJCXRocmVhZC0+dHJhcF9ubwkJPSAxNDsKKworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCWluZm8uc2lfc2lnbm8JCT0gU0lHU0VHVjsKKwkJaW5mby5zaV9lcnJubwkJPSAwOworCQlpbmZvLnNpX2NvZGUJCT0gU0VHVl9NQVBFUlI7CisJCWluZm8uc2lfYWRkcgkJPSAodm9pZCBfX3VzZXIgKilwdHI7CisKKwkJZm9yY2Vfc2lnX2luZm8oU0lHU0VHViwgJmluZm8sIGN1cnJlbnQpOworCQlyZXR1cm4gZmFsc2U7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRydWU7CisJfQorfQorCiBib29sIGVtdWxhdGVfdnN5c2NhbGwoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKIHsKIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsKIAl1bnNpZ25lZCBsb25nIGNhbGxlcjsKIAlpbnQgdnN5c2NhbGxfbnI7CisJaW50IHByZXZfc2lnX29uX3VhY2Nlc3NfZXJyb3I7CiAJbG9uZyByZXQ7CiAKIAkvKgpAQCAtMTgwLDM1ICsyMDksNjUgQEAKIAlpZiAoc2VjY29tcF9tb2RlKCZ0c2stPnNlY2NvbXApKQogCQlkb19leGl0KFNJR0tJTEwpOwogCisJLyoKKwkgKiBXaXRoIGEgcmVhbCB2c3lzY2FsbCwgcGFnZSBmYXVsdHMgY2F1c2UgU0lHU0VHVi4gIFdlIHdhbnQgdG8KKwkgKiBwcmVzZXJ2ZSB0aGF0IGJlaGF2aW9yIHRvIG1ha2Ugd3JpdGluZyBleHBsb2l0cyBoYXJkZXIuCisJICovCisJcHJldl9zaWdfb25fdWFjY2Vzc19lcnJvciA9IGN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c2lnX29uX3VhY2Nlc3NfZXJyb3I7CisJY3VycmVudF90aHJlYWRfaW5mbygpLT5zaWdfb25fdWFjY2Vzc19lcnJvciA9IDE7CisKKwkvKgorCSAqIDAgaXMgYSB2YWxpZCB1c2VyIHBvaW50ZXIgKGluIHRoZSBhY2Nlc3Nfb2sgc2Vuc2UpIG9uIDMyLWJpdCBhbmQKKwkgKiA2NC1iaXQsIHNvIHdlIGRvbid0IG5lZWQgdG8gc3BlY2lhbC1jYXNlIGl0IGhlcmUuICBGb3IgYWxsIHRoZQorCSAqIHZzeXNjYWxscywgMCBtZWFucyAiZG9uJ3Qgd3JpdGUgYW55dGhpbmciIG5vdCAid3JpdGUgaXQgYXQKKwkgKiBhZGRyZXNzIDAiLgorCSAqLworCXJldCA9IC1FRkFVTFQ7CiAJc3dpdGNoICh2c3lzY2FsbF9ucikgewogCWNhc2UgMDoKKwkJaWYgKCF3cml0ZV9va19vcl9zZWd2KHJlZ3MtPmRpLCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKSB8fAorCQkgICAgIXdyaXRlX29rX29yX3NlZ3YocmVncy0+c2ksIHNpemVvZihzdHJ1Y3QgdGltZXpvbmUpKSkKKwkJCWJyZWFrOworCiAJCXJldCA9IHN5c19nZXR0aW1lb2ZkYXkoCiAJCQkoc3RydWN0IHRpbWV2YWwgX191c2VyICopcmVncy0+ZGksCiAJCQkoc3RydWN0IHRpbWV6b25lIF9fdXNlciAqKXJlZ3MtPnNpKTsKIAkJYnJlYWs7CiAKIAljYXNlIDE6CisJCWlmICghd3JpdGVfb2tfb3Jfc2VndihyZWdzLT5kaSwgc2l6ZW9mKHRpbWVfdCkpKQorCQkJYnJlYWs7CisKIAkJcmV0ID0gc3lzX3RpbWUoKHRpbWVfdCBfX3VzZXIgKilyZWdzLT5kaSk7CiAJCWJyZWFrOwogCiAJY2FzZSAyOgorCQlpZiAoIXdyaXRlX29rX29yX3NlZ3YocmVncy0+ZGksIHNpemVvZih1bnNpZ25lZCkpIHx8CisJCSAgICAhd3JpdGVfb2tfb3Jfc2VndihyZWdzLT5zaSwgc2l6ZW9mKHVuc2lnbmVkKSkpCisJCQlicmVhazsKKwogCQlyZXQgPSBzeXNfZ2V0Y3B1KCh1bnNpZ25lZCBfX3VzZXIgKilyZWdzLT5kaSwKIAkJCQkgKHVuc2lnbmVkIF9fdXNlciAqKXJlZ3MtPnNpLAogCQkJCSAwKTsKIAkJYnJlYWs7CiAJfQogCisJY3VycmVudF90aHJlYWRfaW5mbygpLT5zaWdfb25fdWFjY2Vzc19lcnJvciA9IHByZXZfc2lnX29uX3VhY2Nlc3NfZXJyb3I7CisKIAlpZiAocmV0ID09IC1FRkFVTFQpIHsKLQkJLyoKLQkJICogQmFkIG5ld3MgLS0gdXNlcnNwYWNlIGZlZCBhIGJhZCBwb2ludGVyIHRvIGEgdnN5c2NhbGwuCi0JCSAqCi0JCSAqIFdpdGggYSByZWFsIHZzeXNjYWxsLCB0aGF0IHdvdWxkIGhhdmUgY2F1c2VkIFNJR1NFR1YuCi0JCSAqIFRvIG1ha2Ugd3JpdGluZyByZWxpYWJsZSBleHBsb2l0cyB1c2luZyB0aGUgZW11bGF0ZWQKLQkJICogdnN5c2NhbGxzIGhhcmRlciwgZ2VuZXJhdGUgU0lHU0VHViBoZXJlIGFzIHdlbGwuCi0JCSAqLworCQkvKiBCYWQgbmV3cyAtLSB1c2Vyc3BhY2UgZmVkIGEgYmFkIHBvaW50ZXIgdG8gYSB2c3lzY2FsbC4gKi8KIAkJd2Fybl9iYWRfdnN5c2NhbGwoS0VSTl9JTkZPLCByZWdzLAogCQkJCSAgInZzeXNjYWxsIGZhdWx0IChleHBsb2l0IGF0dGVtcHQ/KSIpOwotCQlnb3RvIHNpZ3NlZ3Y7CisKKwkJLyoKKwkJICogSWYgd2UgZmFpbGVkIHRvIGdlbmVyYXRlIGEgc2lnbmFsIGZvciBhbnkgcmVhc29uLAorCQkgKiBnZW5lcmF0ZSBvbmUgaGVyZS4gIChUaGlzIHNob3VsZCBiZSBpbXBvc3NpYmxlLikKKwkJICovCisJCWlmIChXQVJOX09OX09OQ0UoIXNpZ2lzbWVtYmVyKCZ0c2stPnBlbmRpbmcuc2lnbmFsLCBTSUdCVVMpICYmCisJCQkJICFzaWdpc21lbWJlcigmdHNrLT5wZW5kaW5nLnNpZ25hbCwgU0lHU0VHVikpKQorCQkJZ290byBzaWdzZWd2OworCisJCXJldHVybiB0cnVlOyAgLyogRG9uJ3QgZW11bGF0ZSB0aGUgcmV0LiAqLwogCX0KIAogCXJlZ3MtPmF4ID0gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3g4Nl9pbml0LmMgYi9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYwppbmRleCBjMWQ2Y2Q1Li45MWY4M2UyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwveDg2X2luaXQuYwpAQCAtOTIsNiArOTIsNyBAQAogCiBzdHJ1Y3QgeDg2X2NwdWluaXRfb3BzIHg4Nl9jcHVpbml0IF9fY3B1aW5pdGRhdGEgPSB7CiAJLnNldHVwX3BlcmNwdV9jbG9ja2V2CQk9IHNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrLAorCS5maXh1cF9jcHVfaWQJCQk9IHg4Nl9kZWZhdWx0X2ZpeHVwX2NwdV9pZCwKIH07CiAKIHN0YXRpYyB2b2lkIGRlZmF1bHRfbm1pX2luaXQodm9pZCkgeyB9OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL2k4MjU0LmMgYi9hcmNoL3g4Ni9rdm0vaTgyNTQuYwppbmRleCA3NmUzZjFjLi40MDVmMjYyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rdm0vaTgyNTQuYworKysgYi9hcmNoL3g4Ni9rdm0vaTgyNTQuYwpAQCAtMzM4LDExICszMzgsMTUgQEAKIAkJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwogfQogCi1zdGF0aWMgdm9pZCBjcmVhdGVfcGl0X3RpbWVyKHN0cnVjdCBrdm1fa3BpdF9zdGF0ZSAqcHMsIHUzMiB2YWwsIGludCBpc19wZXJpb2QpCitzdGF0aWMgdm9pZCBjcmVhdGVfcGl0X3RpbWVyKHN0cnVjdCBrdm0gKmt2bSwgdTMyIHZhbCwgaW50IGlzX3BlcmlvZCkKIHsKKwlzdHJ1Y3Qga3ZtX2twaXRfc3RhdGUgKnBzID0gJmt2bS0+YXJjaC52cGl0LT5waXRfc3RhdGU7CiAJc3RydWN0IGt2bV90aW1lciAqcHQgPSAmcHMtPnBpdF90aW1lcjsKIAlzNjQgaW50ZXJ2YWw7CiAKKwlpZiAoIWlycWNoaXBfaW5fa2VybmVsKGt2bSkpCisJCXJldHVybjsKKwogCWludGVydmFsID0gbXVsZGl2NjQodmFsLCBOU0VDX1BFUl9TRUMsIEtWTV9QSVRfRlJFUSk7CiAKIAlwcl9kZWJ1ZygiY3JlYXRlIHBpdCB0aW1lciwgaW50ZXJ2YWwgaXMgJWxsdSBuc2VjXG4iLCBpbnRlcnZhbCk7CkBAIC0zOTQsMTMgKzM5OCwxMyBAQAogICAgICAgICAvKiBGSVhNRTogZW5oYW5jZSBtb2RlIDQgcHJlY2lzaW9uICovCiAJY2FzZSA0OgogCQlpZiAoIShwcy0+ZmxhZ3MgJiBLVk1fUElUX0ZMQUdTX0hQRVRfTEVHQUNZKSkgewotCQkJY3JlYXRlX3BpdF90aW1lcihwcywgdmFsLCAwKTsKKwkJCWNyZWF0ZV9waXRfdGltZXIoa3ZtLCB2YWwsIDApOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgMjoKIAljYXNlIDM6CiAJCWlmICghKHBzLT5mbGFncyAmIEtWTV9QSVRfRkxBR1NfSFBFVF9MRUdBQ1kpKXsKLQkJCWNyZWF0ZV9waXRfdGltZXIocHMsIHZhbCwgMSk7CisJCQljcmVhdGVfcGl0X3RpbWVyKGt2bSwgdmFsLCAxKTsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva3ZtL3g4Ni5jIGIvYXJjaC94ODYva3ZtL3g4Ni5jCmluZGV4IGMzOGVmZDcuLjRjOTM4ZGEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2t2bS94ODYuYworKysgYi9hcmNoL3g4Ni9rdm0veDg2LmMKQEAgLTYwMiw3ICs2MDIsNiBAQAogewogCXN0cnVjdCBrdm1fY3B1aWRfZW50cnkyICpiZXN0OwogCXN0cnVjdCBrdm1fbGFwaWMgKmFwaWMgPSB2Y3B1LT5hcmNoLmFwaWM7Ci0JdTMyIHRpbWVyX21vZGVfbWFzazsKIAogCWJlc3QgPSBrdm1fZmluZF9jcHVpZF9lbnRyeSh2Y3B1LCAxLCAwKTsKIAlpZiAoIWJlc3QpCkBAIC02MTUsMTUgKzYxNCwxMiBAQAogCQkJYmVzdC0+ZWN4IHw9IGJpdChYODZfRkVBVFVSRV9PU1hTQVZFKTsKIAl9CiAKLQlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwgJiYKLQkJYmVzdC0+ZnVuY3Rpb24gPT0gMHgxKSB7Ci0JCWJlc3QtPmVjeCB8PSBiaXQoWDg2X0ZFQVRVUkVfVFNDX0RFQURMSU5FX1RJTUVSKTsKLQkJdGltZXJfbW9kZV9tYXNrID0gMyA8PCAxNzsKLQl9IGVsc2UKLQkJdGltZXJfbW9kZV9tYXNrID0gMSA8PCAxNzsKLQotCWlmIChhcGljKQotCQlhcGljLT5sYXBpY190aW1lci50aW1lcl9tb2RlX21hc2sgPSB0aW1lcl9tb2RlX21hc2s7CisJaWYgKGFwaWMpIHsKKwkJaWYgKGJlc3QtPmVjeCAmIGJpdChYODZfRkVBVFVSRV9UU0NfREVBRExJTkVfVElNRVIpKQorCQkJYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrID0gMyA8PCAxNzsKKwkJZWxzZQorCQkJYXBpYy0+bGFwaWNfdGltZXIudGltZXJfbW9kZV9tYXNrID0gMSA8PCAxNzsKKwl9CiB9CiAKIGludCBrdm1fc2V0X2NyNChzdHJ1Y3Qga3ZtX3ZjcHUgKnZjcHUsIHVuc2lnbmVkIGxvbmcgY3I0KQpAQCAtMjEzNSw2ICsyMTMxLDkgQEAKIAljYXNlIEtWTV9DQVBfVFNDX0NPTlRST0w6CiAJCXIgPSBrdm1faGFzX3RzY19jb250cm9sOwogCQlicmVhazsKKwljYXNlIEtWTV9DQVBfVFNDX0RFQURMSU5FX1RJTUVSOgorCQlyID0gYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX1RTQ19ERUFETElORV9USU1FUik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXIgPSAwOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2xpYi9pbmF0LmMgYi9hcmNoL3g4Ni9saWIvaW5hdC5jCmluZGV4IDQ2ZmM0ZWUuLjg4YWQ1ZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2xpYi9pbmF0LmMKKysrIGIvYXJjaC94ODYvbGliL2luYXQuYwpAQCAtODIsOSArODIsMTYgQEAKIAljb25zdCBpbnNuX2F0dHJfdCAqdGFibGU7CiAJaWYgKHZleF9tID4gWDg2X1ZFWF9NX01BWCB8fCB2ZXhfcCA+IElOQVRfTFNUUEZYX01BWCkKIAkJcmV0dXJuIDA7Ci0JdGFibGUgPSBpbmF0X2F2eF90YWJsZXNbdmV4X21dW3ZleF9wXTsKKwkvKiBBdCBmaXJzdCwgdGhpcyBjaGVja3MgdGhlIG1hc3RlciB0YWJsZSAqLworCXRhYmxlID0gaW5hdF9hdnhfdGFibGVzW3ZleF9tXVswXTsKIAlpZiAoIXRhYmxlKQogCQlyZXR1cm4gMDsKKwlpZiAoIWluYXRfaXNfZ3JvdXAodGFibGVbb3Bjb2RlXSkgJiYgdmV4X3ApIHsKKwkJLyogSWYgdGhpcyBpcyBub3QgYSBncm91cCwgZ2V0IGF0dHJpYnV0ZSBkaXJlY3RseSAqLworCQl0YWJsZSA9IGluYXRfYXZ4X3RhYmxlc1t2ZXhfbV1bdmV4X3BdOworCQlpZiAoIXRhYmxlKQorCQkJcmV0dXJuIDA7CisJfQogCXJldHVybiB0YWJsZVtvcGNvZGVdOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvaW5zbi5jIGIvYXJjaC94ODYvbGliL2luc24uYwppbmRleCAzNzQ1NjJlLi41YTFmOWYzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIvaW5zbi5jCisrKyBiL2FyY2gveDg2L2xpYi9pbnNuLmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCQltID0gaW5zbl92ZXhfbV9iaXRzKGluc24pOwogCQlwID0gaW5zbl92ZXhfcF9iaXRzKGluc24pOwogCQlpbnNuLT5hdHRyID0gaW5hdF9nZXRfYXZ4X2F0dHJpYnV0ZShvcCwgbSwgcCk7Ci0JCWlmICghaW5hdF9hY2NlcHRfdmV4KGluc24tPmF0dHIpKQorCQlpZiAoIWluYXRfYWNjZXB0X3ZleChpbnNuLT5hdHRyKSAmJiAhaW5hdF9pc19ncm91cChpbnNuLT5hdHRyKSkKIAkJCWluc24tPmF0dHIgPSAwOwkvKiBUaGlzIGluc3RydWN0aW9uIGlzIGJhZCAqLwogCQlnb3RvIGVuZDsJLyogVkVYIGhhcyBvbmx5IDEgYnl0ZSBmb3Igb3Bjb2RlICovCiAJfQpAQCAtMjQ5LDYgKzI0OSw4IEBACiAJCQlwZnggPSBpbnNuX2xhc3RfcHJlZml4KGluc24pOwogCQkJaW5zbi0+YXR0ciA9IGluYXRfZ2V0X2dyb3VwX2F0dHJpYnV0ZShtb2QsIHBmeCwKIAkJCQkJCQkgICAgICBpbnNuLT5hdHRyKTsKKwkJCWlmIChpbnNuX2lzX2F2eChpbnNuKSAmJiAhaW5hdF9hY2NlcHRfdmV4KGluc24tPmF0dHIpKQorCQkJCWluc24tPmF0dHIgPSAwOwkvKiBUaGlzIGlzIGJhZCAqLwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIvc3RyaW5nXzMyLmMgYi9hcmNoL3g4Ni9saWIvc3RyaW5nXzMyLmMKaW5kZXggODIwMDRkMi4uYmQ1OTA5MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGliL3N0cmluZ18zMi5jCisrKyBiL2FyY2gveDg2L2xpYi9zdHJpbmdfMzIuYwpAQCAtMTY0LDE1ICsxNjQsMTMgQEAKIHNpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqcykKIHsKIAlpbnQgZDA7Ci0JaW50IHJlczsKKwlzaXplX3QgcmVzOwogCWFzbSB2b2xhdGlsZSgicmVwbmVcblx0IgotCQkic2Nhc2Jcblx0IgotCQkibm90bCAlMFxuXHQiCi0JCSJkZWNsICUwIgorCQkic2Nhc2IiCiAJCTogIj1jIiAocmVzKSwgIj0mRCIgKGQwKQogCQk6ICIxIiAocyksICJhIiAoMCksICIwIiAoMHhmZmZmZmZmZnUpCiAJCTogIm1lbW9yeSIpOwotCXJldHVybiByZXM7CisJcmV0dXJuIH5yZXMgLSAxOwogfQogRVhQT1JUX1NZTUJPTChzdHJsZW4pOwogI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9saWIveDg2LW9wY29kZS1tYXAudHh0IGIvYXJjaC94ODYvbGliL3g4Ni1vcGNvZGUtbWFwLnR4dAppbmRleCBhNzkzZGE1Li41YjgzYzUxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9saWIveDg2LW9wY29kZS1tYXAudHh0CisrKyBiL2FyY2gveDg2L2xpYi94ODYtb3Bjb2RlLW1hcC50eHQKQEAgLTEsNSArMSwxMSBAQAogIyB4ODYgT3Bjb2RlIE1hcHMKICMKKyMgVGhpcyBpcyAobW9zdGx5KSBiYXNlZCBvbiBmb2xsb3dpbmcgZG9jdW1lbnRhdGlvbnMuCisjIC0gSW50ZWwoUikgNjQgYW5kIElBLTMyIEFyY2hpdGVjdHVyZXMgU29mdHdhcmUgRGV2ZWxvcGVyJ3MgTWFudWFsIFZvbC4yCisjICAgKCMzMjUzODMtMDQwVVMsIE9jdG9iZXIgMjAxMSkKKyMgLSBJbnRlbChSKSBBZHZhbmNlZCBWZWN0b3IgRXh0ZW5zaW9ucyBQcm9ncmFtbWluZyBSZWZlcmVuY2UKKyMgICAoIzMxOTQzMy0wMTEsSlVORSAyMDExKS4KKyMKICM8T3Bjb2RlIG1hcHM+CiAjIFRhYmxlOiB0YWJsZS1uYW1lCiAjIFJlZmVycmVyOiBlc2NhcGVkLW5hbWUKQEAgLTE1LDEwICsyMSwxMyBAQAogIyBFbmRUYWJsZQogIwogIyBBVlggU3VwZXJzY3JpcHRzCi0jICAoVkVYKTogdGhpcyBvcGNvZGUgY2FuIGFjY2VwdCBWRVggcHJlZml4LgotIyAgKG9WRVgpOiB0aGlzIG9wY29kZSByZXF1aXJlcyBWRVggcHJlZml4LgotIyAgKG8xMjgpOiB0aGlzIG9wY29kZSBvbmx5IHN1cHBvcnRzIDEyOGJpdCBWRVguCi0jICAobzI1Nik6IHRoaXMgb3Bjb2RlIG9ubHkgc3VwcG9ydHMgMjU2Yml0IFZFWC4KKyMgICh2KTogdGhpcyBvcGNvZGUgcmVxdWlyZXMgVkVYIHByZWZpeC4KKyMgICh2MSk6IHRoaXMgb3Bjb2RlIG9ubHkgc3VwcG9ydHMgMTI4Yml0IFZFWC4KKyMKKyMgTGFzdCBQcmVmaXggU3VwZXJzY3JpcHRzCisjICAtICg2Nik6IHRoZSBsYXN0IHByZWZpeCBpcyAweDY2CisjICAtIChGMyk6IHRoZSBsYXN0IHByZWZpeCBpcyAweEYzCisjICAtIChGMik6IHRoZSBsYXN0IHByZWZpeCBpcyAweEYyCiAjCiAKIFRhYmxlOiBvbmUgYnl0ZSBvcGNvZGUKQEAgLTE5OSw4ICsyMDgsOCBAQAogYTE6IE1PViByQVgsT3YKIGEyOiBNT1YgT2IsQUwKIGEzOiBNT1YgT3YsckFYCi1hNDogTU9WUy9CIFhiLFliCi1hNTogTU9WUy9XL0QvUSBYdixZdgorYTQ6IE1PVlMvQiBZYixYYgorYTU6IE1PVlMvVy9EL1EgWXYsWHYKIGE2OiBDTVBTL0IgWGIsWWIKIGE3OiBDTVBTL1cvRCBYdixZdgogYTg6IFRFU1QgQUwsSWIKQEAgLTIzMyw4ICsyNDIsOCBAQAogYzE6IEdycDIgRXYsSWIgKDFBKQogYzI6IFJFVE4gSXcgKGY2NCkKIGMzOiBSRVROCi1jNDogTEVTIEd6LE1wIChpNjQpIHwgM2J5dGVzLVZFWCAoUHJlZml4KQotYzU6IExEUyBHeixNcCAoaTY0KSB8IDJieXRlcy1WRVggKFByZWZpeCkKK2M0OiBMRVMgR3osTXAgKGk2NCkgfCBWRVgrMmJ5dGUgKFByZWZpeCkKK2M1OiBMRFMgR3osTXAgKGk2NCkgfCBWRVgrMWJ5dGUgKFByZWZpeCkKIGM2OiBHcnAxMSBFYixJYiAoMUEpCiBjNzogR3JwMTEgRXYsSXogKDFBKQogYzg6IEVOVEVSIEl3LEliCkBAIC0zMjAsMTQgKzMyOSwxOSBAQAogIyAzRE5vdyEgdXNlcyB0aGUgbGFzdCBpbW0gYnl0ZSBhcyBvcGNvZGUgZXh0ZW5zaW9uLgogMGY6IDNETm93ISBQcSxRcSxJYgogIyAweDBmIDB4MTAtMHgxZgotMTA6IG1vdnVwcyBWcHMsV3BzIChWRVgpIHwgbW92c3MgVnNzLFdzcyAoRjMpLChWRVgpLChvMTI4KSB8IG1vdnVwZCBWcGQsV3BkICg2NiksKFZFWCkgfCBtb3ZzZCBWc2QsV3NkIChGMiksKFZFWCksKG8xMjgpCi0xMTogbW92dXBzIFdwcyxWcHMgKFZFWCkgfCBtb3ZzcyBXc3MsVnNzIChGMyksKFZFWCksKG8xMjgpIHwgbW92dXBkIFdwZCxWcGQgKDY2KSwoVkVYKSB8IG1vdnNkIFdzZCxWc2QgKEYyKSwoVkVYKSwobzEyOCkKLTEyOiBtb3ZscHMgVnEsTXEgKFZFWCksKG8xMjgpIHwgbW92bHBkIFZxLE1xICg2NiksKFZFWCksKG8xMjgpIHwgbW92aGxwcyBWcSxVcSAoVkVYKSwobzEyOCkgfCBtb3ZkZHVwIFZxLFdxIChGMiksKFZFWCkgfCBtb3ZzbGR1cCBWcSxXcSAoRjMpLChWRVgpCi0xMzogbXB2bHBzIE1xLFZxIChWRVgpLChvMTI4KSB8IG1vdmxwZCBNcSxWcSAoNjYpLChWRVgpLChvMTI4KQotMTQ6IHVucGNrbHBzIFZwcyxXcSAoVkVYKSB8IHVucGNrbHBkIFZwZCxXcSAoNjYpLChWRVgpCi0xNTogdW5wY2tocHMgVnBzLFdxIChWRVgpIHwgdW5wY2tocGQgVnBkLFdxICg2NiksKFZFWCkKLTE2OiBtb3ZocHMgVnEsTXEgKFZFWCksKG8xMjgpIHwgbW92aHBkIFZxLE1xICg2NiksKFZFWCksKG8xMjgpIHwgbW92bHNwcyBWcSxVcSAoVkVYKSwobzEyOCkgfCBtb3ZzaGR1cCBWcSxXcSAoRjMpLChWRVgpCi0xNzogbW92aHBzIE1xLFZxIChWRVgpLChvMTI4KSB8IG1vdmhwZCBNcSxWcSAoNjYpLChWRVgpLChvMTI4KQorIyBOT1RFOiBBY2NvcmRpbmcgdG8gSW50ZWwgU0RNIG9wY29kZSBtYXAsIHZtb3Z1cHMgYW5kIHZtb3Z1cGQgaGFzIG5vIG9wZXJhbmRzCisjIGJ1dCBpdCBhY3R1YWxseSBoYXMgb3BlcmFuZHMuIEFuZCBhbHNvLCB2bW92c3MgYW5kIHZtb3ZzZCBvbmx5IGFjY2VwdCAxMjhiaXQuCisjIE1PVlNTL01PVlNEIGhhcyB0b28gbWFueSBmb3JtcygzKSBvbiBTRE0uIFRoaXMgbWFwIGp1c3Qgc2hvd3MgYSB0eXBpY2FsIGZvcm0uCisjIE1hbnkgQVZYIGluc3RydWN0aW9ucyBsYWNrIHYxIHN1cGVyc2NyaXB0LCBhY2NvcmRpbmcgdG8gSW50ZWwgQVZYLVByZ3JhbW1pbmcKKyMgUmVmZXJlbmNlIEEuMQorMTA6IHZtb3Z1cHMgVnBzLFdwcyB8IHZtb3Z1cGQgVnBkLFdwZCAoNjYpIHwgdm1vdnNzIFZ4LEh4LFdzcyAoRjMpLCh2MSkgfCB2bW92c2QgVngsSHgsV3NkIChGMiksKHYxKQorMTE6IHZtb3Z1cHMgV3BzLFZwcyB8IHZtb3Z1cGQgV3BkLFZwZCAoNjYpIHwgdm1vdnNzIFdzcyxIeCxWc3MgKEYzKSwodjEpIHwgdm1vdnNkIFdzZCxIeCxWc2QgKEYyKSwodjEpCisxMjogdm1vdmxwcyBWcSxIcSxNcSAodjEpIHwgdm1vdmhscHMgVnEsSHEsVXEgKHYxKSB8IHZtb3ZscGQgVnEsSHEsTXEgKDY2KSwodjEpIHwgdm1vdnNsZHVwIFZ4LFd4IChGMykgfCB2bW92ZGR1cCBWeCxXeCAoRjIpCisxMzogdm1vdmxwcyBNcSxWcSAodjEpIHwgdm1vdmxwZCBNcSxWcSAoNjYpLCh2MSkKKzE0OiB2dW5wY2tscHMgVngsSHgsV3ggfCB2dW5wY2tscGQgVngsSHgsV3ggKDY2KQorMTU6IHZ1bnBja2hwcyBWeCxIeCxXeCB8IHZ1bnBja2hwZCBWeCxIeCxXeCAoNjYpCisxNjogdm1vdmhwcyBWZHEsSHEsTXEgKHYxKSB8IHZtb3ZsaHBzIFZkcSxIcSxVcSAodjEpIHwgdm1vdmhwZCBWZHEsSHEsTXEgKDY2KSwodjEpIHwgdm1vdnNoZHVwIFZ4LFd4IChGMykKKzE3OiB2bW92aHBzIE1xLFZxICh2MSkgfCB2bW92aHBkIE1xLFZxICg2NiksKHYxKQogMTg6IEdycDE2ICgxQSkKIDE5OgogMWE6CkBAIC0zNDUsMTQgKzM1OSwxNCBAQAogMjU6CiAyNjoKIDI3OgotMjg6IG1vdmFwcyBWcHMsV3BzIChWRVgpIHwgbW92YXBkIFZwZCxXcGQgKDY2KSwoVkVYKQotMjk6IG1vdmFwcyBXcHMsVnBzIChWRVgpIHwgbW92YXBkIFdwZCxWcGQgKDY2KSwoVkVYKQotMmE6IGN2dHBpMnBzIFZwcyxRcGkgfCBjdnRzaTJzcyBWc3MsRWQvcSAoRjMpLChWRVgpLChvMTI4KSB8IGN2dHBpMnBkIFZwZCxRcGkgKDY2KSB8IGN2dHNpMnNkIFZzZCxFZC9xIChGMiksKFZFWCksKG8xMjgpCi0yYjogbW92bnRwcyBNcHMsVnBzIChWRVgpIHwgbW92bnRwZCBNcGQsVnBkICg2NiksKFZFWCkKLTJjOiBjdnR0cHMycGkgUHBpLFdwcyB8IGN2dHRzczJzaSAgR2QvcSxXc3MgKEYzKSwoVkVYKSwobzEyOCkgfCBjdnR0cGQycGkgUHBpLFdwZCAoNjYpIHwgY3Z0dHNkMnNpIEdkL3EsV3NkIChGMiksKFZFWCksKG8xMjgpCi0yZDogY3Z0cHMycGkgUHBpLFdwcyB8IGN2dHNzMnNpIEdkL3EsV3NzIChGMyksKFZFWCksKG8xMjgpIHwgY3Z0cGQycGkgUXBpLFdwZCAoNjYpIHwgY3Z0c2Qyc2kgR2QvcSxXc2QgKEYyKSwoVkVYKSwobzEyOCkKLTJlOiB1Y29taXNzIFZzcyxXc3MgKFZFWCksKG8xMjgpIHwgdWNvbWlzZCAgVnNkLFdzZCAoNjYpLChWRVgpLChvMTI4KQotMmY6IGNvbWlzcyBWc3MsV3NzIChWRVgpLChvMTI4KSB8IGNvbWlzZCAgVnNkLFdzZCAoNjYpLChWRVgpLChvMTI4KQorMjg6IHZtb3ZhcHMgVnBzLFdwcyB8IHZtb3ZhcGQgVnBkLFdwZCAoNjYpCisyOTogdm1vdmFwcyBXcHMsVnBzIHwgdm1vdmFwZCBXcGQsVnBkICg2NikKKzJhOiBjdnRwaTJwcyBWcHMsUXBpIHwgY3Z0cGkycGQgVnBkLFFwaSAoNjYpIHwgdmN2dHNpMnNzIFZzcyxIc3MsRXkgKEYzKSwodjEpIHwgdmN2dHNpMnNkIFZzZCxIc2QsRXkgKEYyKSwodjEpCisyYjogdm1vdm50cHMgTXBzLFZwcyB8IHZtb3ZudHBkIE1wZCxWcGQgKDY2KQorMmM6IGN2dHRwczJwaSBQcGksV3BzIHwgY3Z0dHBkMnBpIFBwaSxXcGQgKDY2KSB8IHZjdnR0c3Myc2kgR3ksV3NzIChGMyksKHYxKSB8IHZjdnR0c2Qyc2kgR3ksV3NkIChGMiksKHYxKQorMmQ6IGN2dHBzMnBpIFBwaSxXcHMgfCBjdnRwZDJwaSBRcGksV3BkICg2NikgfCB2Y3Z0c3Myc2kgR3ksV3NzIChGMyksKHYxKSB8IHZjdnRzZDJzaSBHeSxXc2QgKEYyKSwodjEpCisyZTogdnVjb21pc3MgVnNzLFdzcyAodjEpIHwgdnVjb21pc2QgIFZzZCxXc2QgKDY2KSwodjEpCisyZjogdmNvbWlzcyBWc3MsV3NzICh2MSkgfCB2Y29taXNkICBWc2QsV3NkICg2NiksKHYxKQogIyAweDBmIDB4MzAtMHgzZgogMzA6IFdSTVNSCiAzMTogUkRUU0MKQEAgLTM4OCw2NSArNDAyLDY2IEBACiA0ZTogQ01PVkxFL05HIEd2LEV2CiA0ZjogQ01PVk5MRS9HIEd2LEV2CiAjIDB4MGYgMHg1MC0weDVmCi01MDogbW92bXNrcHMgR2QvcSxVcHMgKFZFWCkgfCBtb3Ztc2twZCBHZC9xLFVwZCAoNjYpLChWRVgpCi01MTogc3FydHBzIFZwcyxXcHMgKFZFWCkgfCBzcXJ0c3MgVnNzLFdzcyAoRjMpLChWRVgpLChvMTI4KSB8IHNxcnRwZCBWcGQsV3BkICg2NiksKFZFWCkgfCBzcXJ0c2QgVnNkLFdzZCAoRjIpLChWRVgpLChvMTI4KQotNTI6IHJzcXJ0cHMgVnBzLFdwcyAoVkVYKSB8IHJzcXJ0c3MgVnNzLFdzcyAoRjMpLChWRVgpLChvMTI4KQotNTM6IHJjcHBzIFZwcyxXcHMgKFZFWCkgfCByY3BzcyBWc3MsV3NzIChGMyksKFZFWCksKG8xMjgpCi01NDogYW5kcHMgVnBzLFdwcyAoVkVYKSB8IGFuZHBkIFZwZCxXcGQgKDY2KSwoVkVYKQotNTU6IGFuZG5wcyBWcHMsV3BzIChWRVgpIHwgYW5kbnBkIFZwZCxXcGQgKDY2KSwoVkVYKQotNTY6IG9ycHMgVnBzLFdwcyAoVkVYKSB8IG9ycGQgVnBkLFdwZCAoNjYpLChWRVgpCi01NzogeG9ycHMgVnBzLFdwcyAoVkVYKSB8IHhvcnBkIFZwZCxXcGQgKDY2KSwoVkVYKQotNTg6IGFkZHBzIFZwcyxXcHMgKFZFWCkgfCBhZGRzcyBWc3MsV3NzIChGMyksKFZFWCksKG8xMjgpIHwgYWRkcGQgVnBkLFdwZCAoNjYpLChWRVgpIHwgYWRkc2QgVnNkLFdzZCAoRjIpLChWRVgpLChvMTI4KQotNTk6IG11bHBzIFZwcyxXcHMgKFZFWCkgfCBtdWxzcyBWc3MsV3NzIChGMyksKFZFWCksKG8xMjgpIHwgbXVscGQgVnBkLFdwZCAoNjYpLChWRVgpIHwgbXVsc2QgVnNkLFdzZCAoRjIpLChWRVgpLChvMTI4KQotNWE6IGN2dHBzMnBkIFZwZCxXcHMgKFZFWCkgfCBjdnRzczJzZCBWc2QsV3NzIChGMyksKFZFWCksKG8xMjgpIHwgY3Z0cGQycHMgVnBzLFdwZCAoNjYpLChWRVgpIHwgY3Z0c2Qyc3MgVnNkLFdzZCAoRjIpLChWRVgpLChvMTI4KQotNWI6IGN2dGRxMnBzIFZwcyxXZHEgKFZFWCkgfCBjdnRwczJkcSBWZHEsV3BzICg2NiksKFZFWCkgfCBjdnR0cHMyZHEgVmRxLFdwcyAoRjMpLChWRVgpCi01Yzogc3VicHMgVnBzLFdwcyAoVkVYKSB8IHN1YnNzIFZzcyxXc3MgKEYzKSwoVkVYKSwobzEyOCkgfCBzdWJwZCBWcGQsV3BkICg2NiksKFZFWCkgfCBzdWJzZCBWc2QsV3NkIChGMiksKFZFWCksKG8xMjgpCi01ZDogbWlucHMgVnBzLFdwcyAoVkVYKSB8IG1pbnNzIFZzcyxXc3MgKEYzKSwoVkVYKSwobzEyOCkgfCBtaW5wZCBWcGQsV3BkICg2NiksKFZFWCkgfCBtaW5zZCBWc2QsV3NkIChGMiksKFZFWCksKG8xMjgpCi01ZTogZGl2cHMgVnBzLFdwcyAoVkVYKSB8IGRpdnNzIFZzcyxXc3MgKEYzKSwoVkVYKSwobzEyOCkgfCBkaXZwZCBWcGQsV3BkICg2NiksKFZFWCkgfCBkaXZzZCBWc2QsV3NkIChGMiksKFZFWCksKG8xMjgpCi01ZjogbWF4cHMgVnBzLFdwcyAoVkVYKSB8IG1heHNzIFZzcyxXc3MgKEYzKSwoVkVYKSwobzEyOCkgfCBtYXhwZCBWcGQsV3BkICg2NiksKFZFWCkgfCBtYXhzZCBWc2QsV3NkIChGMiksKFZFWCksKG8xMjgpCis1MDogdm1vdm1za3BzIEd5LFVwcyB8IHZtb3Ztc2twZCBHeSxVcGQgKDY2KQorNTE6IHZzcXJ0cHMgVnBzLFdwcyB8IHZzcXJ0cGQgVnBkLFdwZCAoNjYpIHwgdnNxcnRzcyBWc3MsSHNzLFdzcyAoRjMpLCh2MSkgfCB2c3FydHNkIFZzZCxIc2QsV3NkIChGMiksKHYxKQorNTI6IHZyc3FydHBzIFZwcyxXcHMgfCB2cnNxcnRzcyBWc3MsSHNzLFdzcyAoRjMpLCh2MSkKKzUzOiB2cmNwcHMgVnBzLFdwcyB8IHZyY3BzcyBWc3MsSHNzLFdzcyAoRjMpLCh2MSkKKzU0OiB2YW5kcHMgVnBzLEhwcyxXcHMgfCB2YW5kcGQgVnBkLEhwZCxXcGQgKDY2KQorNTU6IHZhbmRucHMgVnBzLEhwcyxXcHMgfCB2YW5kbnBkIFZwZCxIcGQsV3BkICg2NikKKzU2OiB2b3JwcyBWcHMsSHBzLFdwcyB8IHZvcnBkIFZwZCxIcGQsV3BkICg2NikKKzU3OiB2eG9ycHMgVnBzLEhwcyxXcHMgfCB2eG9ycGQgVnBkLEhwZCxXcGQgKDY2KQorNTg6IHZhZGRwcyBWcHMsSHBzLFdwcyB8IHZhZGRwZCBWcGQsSHBkLFdwZCAoNjYpIHwgdmFkZHNzIFZzcyxIc3MsV3NzIChGMyksKHYxKSB8IHZhZGRzZCBWc2QsSHNkLFdzZCAoRjIpLCh2MSkKKzU5OiB2bXVscHMgVnBzLEhwcyxXcHMgfCB2bXVscGQgVnBkLEhwZCxXcGQgKDY2KSB8IHZtdWxzcyBWc3MsSHNzLFdzcyAoRjMpLCh2MSkgfCB2bXVsc2QgVnNkLEhzZCxXc2QgKEYyKSwodjEpCis1YTogdmN2dHBzMnBkIFZwZCxXcHMgfCB2Y3Z0cGQycHMgVnBzLFdwZCAoNjYpIHwgdmN2dHNzMnNkIFZzZCxIeCxXc3MgKEYzKSwodjEpIHwgdmN2dHNkMnNzIFZzcyxIeCxXc2QgKEYyKSwodjEpCis1YjogdmN2dGRxMnBzIFZwcyxXZHEgfCB2Y3Z0cHMyZHEgVmRxLFdwcyAoNjYpIHwgdmN2dHRwczJkcSBWZHEsV3BzIChGMykKKzVjOiB2c3VicHMgVnBzLEhwcyxXcHMgfCB2c3VicGQgVnBkLEhwZCxXcGQgKDY2KSB8IHZzdWJzcyBWc3MsSHNzLFdzcyAoRjMpLCh2MSkgfCB2c3Vic2QgVnNkLEhzZCxXc2QgKEYyKSwodjEpCis1ZDogdm1pbnBzIFZwcyxIcHMsV3BzIHwgdm1pbnBkIFZwZCxIcGQsV3BkICg2NikgfCB2bWluc3MgVnNzLEhzcyxXc3MgKEYzKSwodjEpIHwgdm1pbnNkIFZzZCxIc2QsV3NkIChGMiksKHYxKQorNWU6IHZkaXZwcyBWcHMsSHBzLFdwcyB8IHZkaXZwZCBWcGQsSHBkLFdwZCAoNjYpIHwgdmRpdnNzIFZzcyxIc3MsV3NzIChGMyksKHYxKSB8IHZkaXZzZCBWc2QsSHNkLFdzZCAoRjIpLCh2MSkKKzVmOiB2bWF4cHMgVnBzLEhwcyxXcHMgfCB2bWF4cGQgVnBkLEhwZCxXcGQgKDY2KSB8IHZtYXhzcyBWc3MsSHNzLFdzcyAoRjMpLCh2MSkgfCB2bWF4c2QgVnNkLEhzZCxXc2QgKEYyKSwodjEpCiAjIDB4MGYgMHg2MC0weDZmCi02MDogcHVucGNrbGJ3IFBxLFFkIHwgcHVucGNrbGJ3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTYxOiBwdW5wY2tsd2QgUHEsUWQgfCBwdW5wY2tsd2QgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotNjI6IHB1bnBja2xkcSBQcSxRZCB8IHB1bnBja2xkcSBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi02MzogcGFja3Nzd2IgUHEsUXEgfCBwYWNrc3N3YiBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi02NDogcGNtcGd0YiBQcSxRcSB8IHBjbXBndGIgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotNjU6IHBjbXBndHcgUHEsUXEgfCBwY21wZ3R3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTY2OiBwY21wZ3RkIFBxLFFxIHwgcGNtcGd0ZCBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi02NzogcGFja3Vzd2IgUHEsUXEgfCBwYWNrdXN3YiBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi02ODogcHVucGNraGJ3IFBxLFFkIHwgcHVucGNraGJ3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTY5OiBwdW5wY2tod2QgUHEsUWQgfCBwdW5wY2tod2QgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotNmE6IHB1bnBja2hkcSBQcSxRZCB8IHB1bnBja2hkcSBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi02YjogcGFja3NzZHcgUHEsUWQgfCBwYWNrc3NkdyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi02YzogcHVucGNrbHFkcSBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi02ZDogcHVucGNraHFkcSBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi02ZTogbW92ZC9xLyBQZCxFZC9xIHwgbW92ZC9xIFZkcSxFZC9xICg2NiksKFZFWCksKG8xMjgpCi02ZjogbW92cSBQcSxRcSB8IG1vdmRxYSBWZHEsV2RxICg2NiksKFZFWCkgfCBtb3ZkcXUgVmRxLFdkcSAoRjMpLChWRVgpCis2MDogcHVucGNrbGJ3IFBxLFFkIHwgdnB1bnBja2xidyBWeCxIeCxXeCAoNjYpLCh2MSkKKzYxOiBwdW5wY2tsd2QgUHEsUWQgfCB2cHVucGNrbHdkIFZ4LEh4LFd4ICg2NiksKHYxKQorNjI6IHB1bnBja2xkcSBQcSxRZCB8IHZwdW5wY2tsZHEgVngsSHgsV3ggKDY2KSwodjEpCis2MzogcGFja3Nzd2IgUHEsUXEgfCB2cGFja3Nzd2IgVngsSHgsV3ggKDY2KSwodjEpCis2NDogcGNtcGd0YiBQcSxRcSB8IHZwY21wZ3RiIFZ4LEh4LFd4ICg2NiksKHYxKQorNjU6IHBjbXBndHcgUHEsUXEgfCB2cGNtcGd0dyBWeCxIeCxXeCAoNjYpLCh2MSkKKzY2OiBwY21wZ3RkIFBxLFFxIHwgdnBjbXBndGQgVngsSHgsV3ggKDY2KSwodjEpCis2NzogcGFja3Vzd2IgUHEsUXEgfCB2cGFja3Vzd2IgVngsSHgsV3ggKDY2KSwodjEpCis2ODogcHVucGNraGJ3IFBxLFFkIHwgdnB1bnBja2hidyBWeCxIeCxXeCAoNjYpLCh2MSkKKzY5OiBwdW5wY2tod2QgUHEsUWQgfCB2cHVucGNraHdkIFZ4LEh4LFd4ICg2NiksKHYxKQorNmE6IHB1bnBja2hkcSBQcSxRZCB8IHZwdW5wY2toZHEgVngsSHgsV3ggKDY2KSwodjEpCis2YjogcGFja3NzZHcgUHEsUWQgfCB2cGFja3NzZHcgVngsSHgsV3ggKDY2KSwodjEpCis2YzogdnB1bnBja2xxZHEgVngsSHgsV3ggKDY2KSwodjEpCis2ZDogdnB1bnBja2hxZHEgVngsSHgsV3ggKDY2KSwodjEpCis2ZTogbW92ZC9xIFBkLEV5IHwgdm1vdmQvcSBWeSxFeSAoNjYpLCh2MSkKKzZmOiBtb3ZxIFBxLFFxIHwgdm1vdmRxYSBWeCxXeCAoNjYpIHwgdm1vdmRxdSBWeCxXeCAoRjMpCiAjIDB4MGYgMHg3MC0weDdmCi03MDogcHNodWZ3IFBxLFFxLEliIHwgcHNodWZkIFZkcSxXZHEsSWIgKDY2KSwoVkVYKSwobzEyOCkgfCBwc2h1Zmh3IFZkcSxXZHEsSWIgKEYzKSwoVkVYKSwobzEyOCkgfCBwc2h1Zmx3IFZkcVdkcSxJYiAoRjIpLChWRVgpLChvMTI4KQorNzA6IHBzaHVmdyBQcSxRcSxJYiB8IHZwc2h1ZmQgVngsV3gsSWIgKDY2KSwodjEpIHwgdnBzaHVmaHcgVngsV3gsSWIgKEYzKSwodjEpIHwgdnBzaHVmbHcgVngsV3gsSWIgKEYyKSwodjEpCiA3MTogR3JwMTIgKDFBKQogNzI6IEdycDEzICgxQSkKIDczOiBHcnAxNCAoMUEpCi03NDogcGNtcGVxYiBQcSxRcSB8IHBjbXBlcWIgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotNzU6IHBjbXBlcXcgUHEsUXEgfCBwY21wZXF3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTc2OiBwY21wZXFkIFBxLFFxIHwgcGNtcGVxZCBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi03NzogZW1tcy92emVyb3VwcGVyL3Z6ZXJvYWxsIChWRVgpCi03ODogVk1SRUFEIEVkL3EsR2QvcQotNzk6IFZNV1JJVEUgR2QvcSxFZC9xCis3NDogcGNtcGVxYiBQcSxRcSB8IHZwY21wZXFiIFZ4LEh4LFd4ICg2NiksKHYxKQorNzU6IHBjbXBlcXcgUHEsUXEgfCB2cGNtcGVxdyBWeCxIeCxXeCAoNjYpLCh2MSkKKzc2OiBwY21wZXFkIFBxLFFxIHwgdnBjbXBlcWQgVngsSHgsV3ggKDY2KSwodjEpCisjIE5vdGU6IFJlbW92ZSAodiksIGJlY2F1c2Ugdnplcm9hbGwgYW5kIHZ6ZXJvdXBwZXIgYmVjb21lcyBlbW1zIHdpdGhvdXQgVkVYLgorNzc6IGVtbXMgfCB2emVyb3VwcGVyIHwgdnplcm9hbGwKKzc4OiBWTVJFQUQgRXksR3kKKzc5OiBWTVdSSVRFIEd5LEV5CiA3YToKIDdiOgotN2M6IGhhZGRwcyBWcHMsV3BzIChGMiksKFZFWCkgfCBoYWRkcGQgVnBkLFdwZCAoNjYpLChWRVgpCi03ZDogaHN1YnBzIFZwcyxXcHMgKEYyKSwoVkVYKSB8IGhzdWJwZCBWcGQsV3BkICg2NiksKFZFWCkKLTdlOiBtb3ZkL3EgRWQvcSxQZCB8IG1vdmQvcSBFZC9xLFZkcSAoNjYpLChWRVgpLChvMTI4KSB8IG1vdnEgVnEsV3EgKEYzKSwoVkVYKSwobzEyOCkKLTdmOiBtb3ZxIFFxLFBxIHwgbW92ZHFhIFdkcSxWZHEgKDY2KSwoVkVYKSB8IG1vdmRxdSBXZHEsVmRxIChGMyksKFZFWCkKKzdjOiB2aGFkZHBkIFZwZCxIcGQsV3BkICg2NikgfCB2aGFkZHBzIFZwcyxIcHMsV3BzIChGMikKKzdkOiB2aHN1YnBkIFZwZCxIcGQsV3BkICg2NikgfCB2aHN1YnBzIFZwcyxIcHMsV3BzIChGMikKKzdlOiBtb3ZkL3EgRXksUGQgfCB2bW92ZC9xIEV5LFZ5ICg2NiksKHYxKSB8IHZtb3ZxIFZxLFdxIChGMyksKHYxKQorN2Y6IG1vdnEgUXEsUHEgfCB2bW92ZHFhIFd4LFZ4ICg2NikgfCB2bW92ZHF1IFd4LFZ4IChGMykKICMgMHgwZiAweDgwLTB4OGYKIDgwOiBKTyBKeiAoZjY0KQogODE6IEpOTyBKeiAoZjY0KQotODI6IEpCL0pOQUUvSkMgSnogKGY2NCkKLTgzOiBKTkIvSkFFL0pOQyBKeiAoZjY0KQotODQ6IEpaL0pFIEp6IChmNjQpCi04NTogSk5aL0pORSBKeiAoZjY0KQorODI6IEpCL0pDL0pOQUUgSnogKGY2NCkKKzgzOiBKQUUvSk5CL0pOQyBKeiAoZjY0KQorODQ6IEpFL0paIEp6IChmNjQpCis4NTogSk5FL0pOWiBKeiAoZjY0KQogODY6IEpCRS9KTkEgSnogKGY2NCkKLTg3OiBKTkJFL0pBIEp6IChmNjQpCis4NzogSkEvSk5CRSBKeiAoZjY0KQogODg6IEpTIEp6IChmNjQpCiA4OTogSk5TIEp6IChmNjQpCiA4YTogSlAvSlBFIEp6IChmNjQpCkBAIC01MDIsMTggKzUxNywxOCBAQAogYjk6IEdycDEwICgxQSkKIGJhOiBHcnA4IEV2LEliICgxQSkKIGJiOiBCVEMgRXYsR3YKLWJjOiBCU0YgR3YsRXYKLWJkOiBCU1IgR3YsRXYKK2JjOiBCU0YgR3YsRXYgfCBUWkNOVCBHdixFdiAoRjMpCitiZDogQlNSIEd2LEV2IHwgTFpDTlQgR3YsRXYgKEYzKQogYmU6IE1PVlNYIEd2LEViCiBiZjogTU9WU1ggR3YsRXcKICMgMHgwZiAweGMwLTB4Y2YKIGMwOiBYQUREIEViLEdiCiBjMTogWEFERCBFdixHdgotYzI6IGNtcHBzIFZwcyxXcHMsSWIgKFZFWCkgfCBjbXBzcyBWc3MsV3NzLEliIChGMyksKFZFWCksKG8xMjgpIHwgY21wcGQgVnBkLFdwZCxJYiAoNjYpLChWRVgpIHwgY21wc2QgVnNkLFdzZCxJYiAoRjIpLChWRVgpCi1jMzogbW92bnRpIE1kL3EsR2QvcQotYzQ6IHBpbnNydyBQcSxSZC9xL013LEliIHwgcGluc3J3IFZkcSxSZC9xL013LEliICg2NiksKFZFWCksKG8xMjgpCi1jNTogcGV4dHJ3IEdkLE5xLEliIHwgcGV4dHJ3IEdkLFVkcSxJYiAoNjYpLChWRVgpLChvMTI4KQotYzY6IHNodWZwcyBWcHMsV3BzLEliIChWRVgpIHwgc2h1ZnBkIFZwZCxXcGQsSWIgKDY2KSwoVkVYKQorYzI6IHZjbXBwcyBWcHMsSHBzLFdwcyxJYiB8IHZjbXBwZCBWcGQsSHBkLFdwZCxJYiAoNjYpIHwgdmNtcHNzIFZzcyxIc3MsV3NzLEliIChGMyksKHYxKSB8IHZjbXBzZCBWc2QsSHNkLFdzZCxJYiAoRjIpLCh2MSkKK2MzOiBtb3ZudGkgTXksR3kKK2M0OiBwaW5zcncgUHEsUnkvTXcsSWIgfCB2cGluc3J3IFZkcSxIZHEsUnkvTXcsSWIgKDY2KSwodjEpCitjNTogcGV4dHJ3IEdkLE5xLEliIHwgdnBleHRydyBHZCxVZHEsSWIgKDY2KSwodjEpCitjNjogdnNodWZwcyBWcHMsSHBzLFdwcyxJYiB8IHZzaHVmcGQgVnBkLEhwZCxXcGQsSWIgKDY2KQogYzc6IEdycDkgKDFBKQogYzg6IEJTV0FQIFJBWC9FQVgvUjgvUjhECiBjOTogQlNXQVAgUkNYL0VDWC9SOS9SOUQKQEAgLTUyNCw1NSArNTM5LDU1IEBACiBjZTogQlNXQVAgUlNJL0VTSS9SMTQvUjE0RAogY2Y6IEJTV0FQIFJESS9FREkvUjE1L1IxNUQKICMgMHgwZiAweGQwLTB4ZGYKLWQwOiBhZGRzdWJwcyBWcHMsV3BzIChGMiksKFZFWCkgfCBhZGRzdWJwZCBWcGQsV3BkICg2NiksKFZFWCkKLWQxOiBwc3JsdyBQcSxRcSB8IHBzcmx3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWQyOiBwc3JsZCBQcSxRcSB8IHBzcmxkIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWQzOiBwc3JscSBQcSxRcSB8IHBzcmxxIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWQ0OiBwYWRkcSBQcSxRcSB8IHBhZGRxIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWQ1OiBwbXVsbHcgUHEsUXEgfCBwbXVsbHcgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotZDY6IG1vdnEgV3EsVnEgKDY2KSwoVkVYKSwobzEyOCkgfCBtb3ZxMmRxIFZkcSxOcSAoRjMpIHwgbW92ZHEycSBQcSxVcSAoRjIpCi1kNzogcG1vdm1za2IgR2QsTnEgfCBwbW92bXNrYiBHZCxVZHEgKDY2KSwoVkVYKSwobzEyOCkKLWQ4OiBwc3VidXNiIFBxLFFxIHwgcHN1YnVzYiBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1kOTogcHN1YnVzdyBQcSxRcSB8IHBzdWJ1c3cgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotZGE6IHBtaW51YiBQcSxRcSB8IHBtaW51YiBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1kYjogcGFuZCBQcSxRcSB8IHBhbmQgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotZGM6IHBhZGR1c2IgUHEsUXEgfCBwYWRkdXNiIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWRkOiBwYWRkdXN3IFBxLFFxIHwgcGFkZHVzdyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1kZTogcG1heHViIFBxLFFxIHwgcG1heHViIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWRmOiBwYW5kbiBQcSxRcSB8IHBhbmRuIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKK2QwOiB2YWRkc3VicGQgVnBkLEhwZCxXcGQgKDY2KSB8IHZhZGRzdWJwcyBWcHMsSHBzLFdwcyAoRjIpCitkMTogcHNybHcgUHEsUXEgfCB2cHNybHcgVngsSHgsV3ggKDY2KSwodjEpCitkMjogcHNybGQgUHEsUXEgfCB2cHNybGQgVngsSHgsV3ggKDY2KSwodjEpCitkMzogcHNybHEgUHEsUXEgfCB2cHNybHEgVngsSHgsV3ggKDY2KSwodjEpCitkNDogcGFkZHEgUHEsUXEgfCB2cGFkZHEgVngsSHgsV3ggKDY2KSwodjEpCitkNTogcG11bGx3IFBxLFFxIHwgdnBtdWxsdyBWeCxIeCxXeCAoNjYpLCh2MSkKK2Q2OiB2bW92cSBXcSxWcSAoNjYpLCh2MSkgfCBtb3ZxMmRxIFZkcSxOcSAoRjMpIHwgbW92ZHEycSBQcSxVcSAoRjIpCitkNzogcG1vdm1za2IgR2QsTnEgfCB2cG1vdm1za2IgR2QsVXggKDY2KSwodjEpCitkODogcHN1YnVzYiBQcSxRcSB8IHZwc3VidXNiIFZ4LEh4LFd4ICg2NiksKHYxKQorZDk6IHBzdWJ1c3cgUHEsUXEgfCB2cHN1YnVzdyBWeCxIeCxXeCAoNjYpLCh2MSkKK2RhOiBwbWludWIgUHEsUXEgfCB2cG1pbnViIFZ4LEh4LFd4ICg2NiksKHYxKQorZGI6IHBhbmQgUHEsUXEgfCB2cGFuZCBWeCxIeCxXeCAoNjYpLCh2MSkKK2RjOiBwYWRkdXNiIFBxLFFxIHwgdnBhZGR1c2IgVngsSHgsV3ggKDY2KSwodjEpCitkZDogcGFkZHVzdyBQcSxRcSB8IHZwYWRkdXN3IFZ4LEh4LFd4ICg2NiksKHYxKQorZGU6IHBtYXh1YiBQcSxRcSB8IHZwbWF4dWIgVngsSHgsV3ggKDY2KSwodjEpCitkZjogcGFuZG4gUHEsUXEgfCB2cGFuZG4gVngsSHgsV3ggKDY2KSwodjEpCiAjIDB4MGYgMHhlMC0weGVmCi1lMDogcGF2Z2IgUHEsUXEgfCBwYXZnYiBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1lMTogcHNyYXcgUHEsUXEgfCBwc3JhdyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1lMjogcHNyYWQgUHEsUXEgfCBwc3JhZCBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1lMzogcGF2Z3cgUHEsUXEgfCBwYXZndyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1lNDogcG11bGh1dyBQcSxRcSB8IHBtdWxodXcgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotZTU6IHBtdWxodyBQcSxRcSB8IHBtdWxodyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1lNjogY3Z0cGQyZHEgVmRxLFdwZCAoRjIpLChWRVgpIHwgY3Z0dHBkMmRxIFZkcSxXcGQgKDY2KSwoVkVYKSB8IGN2dGRxMnBkIFZwZCxXZHEgKEYzKSwoVkVYKQotZTc6IG1vdm50cSBNcSxQcSB8IG1vdm50ZHEgTWRxLFZkcSAoNjYpLChWRVgpCi1lODogcHN1YnNiIFBxLFFxIHwgcHN1YnNiIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWU5OiBwc3Vic3cgUHEsUXEgfCBwc3Vic3cgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotZWE6IHBtaW5zdyBQcSxRcSB8IHBtaW5zdyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1lYjogcG9yIFBxLFFxIHwgcG9yIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWVjOiBwYWRkc2IgUHEsUXEgfCBwYWRkc2IgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotZWQ6IHBhZGRzdyBQcSxRcSB8IHBhZGRzdyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1lZTogcG1heHN3IFBxLFFxIHwgcG1heHN3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWVmOiBweG9yIFBxLFFxIHwgcHhvciBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCitlMDogcGF2Z2IgUHEsUXEgfCB2cGF2Z2IgVngsSHgsV3ggKDY2KSwodjEpCitlMTogcHNyYXcgUHEsUXEgfCB2cHNyYXcgVngsSHgsV3ggKDY2KSwodjEpCitlMjogcHNyYWQgUHEsUXEgfCB2cHNyYWQgVngsSHgsV3ggKDY2KSwodjEpCitlMzogcGF2Z3cgUHEsUXEgfCB2cGF2Z3cgVngsSHgsV3ggKDY2KSwodjEpCitlNDogcG11bGh1dyBQcSxRcSB8IHZwbXVsaHV3IFZ4LEh4LFd4ICg2NiksKHYxKQorZTU6IHBtdWxodyBQcSxRcSB8IHZwbXVsaHcgVngsSHgsV3ggKDY2KSwodjEpCitlNjogdmN2dHRwZDJkcSBWeCxXcGQgKDY2KSB8IHZjdnRkcTJwZCBWeCxXZHEgKEYzKSB8IHZjdnRwZDJkcSBWeCxXcGQgKEYyKQorZTc6IG1vdm50cSBNcSxQcSB8IHZtb3ZudGRxIE14LFZ4ICg2NikKK2U4OiBwc3Vic2IgUHEsUXEgfCB2cHN1YnNiIFZ4LEh4LFd4ICg2NiksKHYxKQorZTk6IHBzdWJzdyBQcSxRcSB8IHZwc3Vic3cgVngsSHgsV3ggKDY2KSwodjEpCitlYTogcG1pbnN3IFBxLFFxIHwgdnBtaW5zdyBWeCxIeCxXeCAoNjYpLCh2MSkKK2ViOiBwb3IgUHEsUXEgfCB2cG9yIFZ4LEh4LFd4ICg2NiksKHYxKQorZWM6IHBhZGRzYiBQcSxRcSB8IHZwYWRkc2IgVngsSHgsV3ggKDY2KSwodjEpCitlZDogcGFkZHN3IFBxLFFxIHwgdnBhZGRzdyBWeCxIeCxXeCAoNjYpLCh2MSkKK2VlOiBwbWF4c3cgUHEsUXEgfCB2cG1heHN3IFZ4LEh4LFd4ICg2NiksKHYxKQorZWY6IHB4b3IgUHEsUXEgfCB2cHhvciBWeCxIeCxXeCAoNjYpLCh2MSkKICMgMHgwZiAweGYwLTB4ZmYKLWYwOiBsZGRxdSBWZHEsTWRxIChGMiksKFZFWCkKLWYxOiBwc2xsdyBQcSxRcSB8IHBzbGx3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWYyOiBwc2xsZCBQcSxRcSB8IHBzbGxkIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWYzOiBwc2xscSBQcSxRcSB8IHBzbGxxIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWY0OiBwbXVsdWRxIFBxLFFxIHwgcG11bHVkcSBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1mNTogcG1hZGR3ZCBQcSxRcSB8IHBtYWRkd2QgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotZjY6IHBzYWRidyBQcSxRcSB8IHBzYWRidyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1mNzogbWFza21vdnEgUHEsTnEgfCBtYXNrbW92ZHF1IFZkcSxVZHEgKDY2KSwoVkVYKSwobzEyOCkKLWY4OiBwc3ViYiBQcSxRcSB8IHBzdWJiIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWY5OiBwc3VidyBQcSxRcSB8IHBzdWJ3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWZhOiBwc3ViZCBQcSxRcSB8IHBzdWJkIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWZiOiBwc3VicSBQcSxRcSB8IHBzdWJxIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWZjOiBwYWRkYiBQcSxRcSB8IHBhZGRiIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWZkOiBwYWRkdyBQcSxRcSB8IHBhZGR3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWZlOiBwYWRkZCBQcSxRcSB8IHBhZGRkIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKK2YwOiB2bGRkcXUgVngsTXggKEYyKQorZjE6IHBzbGx3IFBxLFFxIHwgdnBzbGx3IFZ4LEh4LFd4ICg2NiksKHYxKQorZjI6IHBzbGxkIFBxLFFxIHwgdnBzbGxkIFZ4LEh4LFd4ICg2NiksKHYxKQorZjM6IHBzbGxxIFBxLFFxIHwgdnBzbGxxIFZ4LEh4LFd4ICg2NiksKHYxKQorZjQ6IHBtdWx1ZHEgUHEsUXEgfCB2cG11bHVkcSBWeCxIeCxXeCAoNjYpLCh2MSkKK2Y1OiBwbWFkZHdkIFBxLFFxIHwgdnBtYWRkd2QgVngsSHgsV3ggKDY2KSwodjEpCitmNjogcHNhZGJ3IFBxLFFxIHwgdnBzYWRidyBWeCxIeCxXeCAoNjYpLCh2MSkKK2Y3OiBtYXNrbW92cSBQcSxOcSB8IHZtYXNrbW92ZHF1IFZ4LFV4ICg2NiksKHYxKQorZjg6IHBzdWJiIFBxLFFxIHwgdnBzdWJiIFZ4LEh4LFd4ICg2NiksKHYxKQorZjk6IHBzdWJ3IFBxLFFxIHwgdnBzdWJ3IFZ4LEh4LFd4ICg2NiksKHYxKQorZmE6IHBzdWJkIFBxLFFxIHwgdnBzdWJkIFZ4LEh4LFd4ICg2NiksKHYxKQorZmI6IHBzdWJxIFBxLFFxIHwgdnBzdWJxIFZ4LEh4LFd4ICg2NiksKHYxKQorZmM6IHBhZGRiIFBxLFFxIHwgdnBhZGRiIFZ4LEh4LFd4ICg2NiksKHYxKQorZmQ6IHBhZGR3IFBxLFFxIHwgdnBhZGR3IFZ4LEh4LFd4ICg2NiksKHYxKQorZmU6IHBhZGRkIFBxLFFxIHwgdnBhZGRkIFZ4LEh4LFd4ICg2NiksKHYxKQogZmY6CiBFbmRUYWJsZQogCkBAIC01ODAsMTU1ICs1OTUsMTkzIEBACiBSZWZlcnJlcjogMy1ieXRlIGVzY2FwZSAxCiBBVlhjb2RlOiAyCiAjIDB4MGYgMHgzOCAweDAwLTB4MGYKLTAwOiBwc2h1ZmIgUHEsUXEgfCBwc2h1ZmIgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotMDE6IHBoYWRkdyBQcSxRcSB8IHBoYWRkdyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi0wMjogcGhhZGRkIFBxLFFxIHwgcGhhZGRkIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTAzOiBwaGFkZHN3IFBxLFFxIHwgcGhhZGRzdyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi0wNDogcG1hZGR1YnN3IFBxLFFxIHwgcG1hZGR1YnN3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTA1OiBwaHN1YncgUHEsUXEgfCBwaHN1YncgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotMDY6IHBoc3ViZCBQcSxRcSB8IHBoc3ViZCBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi0wNzogcGhzdWJzdyBQcSxRcSB8IHBoc3Vic3cgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotMDg6IHBzaWduYiBQcSxRcSB8IHBzaWduYiBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi0wOTogcHNpZ253IFBxLFFxIHwgcHNpZ253IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTBhOiBwc2lnbmQgUHEsUXEgfCBwc2lnbmQgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotMGI6IHBtdWxocnN3IFBxLFFxIHwgcG11bGhyc3cgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotMGM6IFZwZXJtaWxwcyAvciAoNjYpLChvVkVYKQotMGQ6IFZwZXJtaWxwZCAvciAoNjYpLChvVkVYKQotMGU6IHZ0ZXN0cHMgL3IgKDY2KSwob1ZFWCkKLTBmOiB2dGVzdHBkIC9yICg2NiksKG9WRVgpCiswMDogcHNodWZiIFBxLFFxIHwgdnBzaHVmYiBWeCxIeCxXeCAoNjYpLCh2MSkKKzAxOiBwaGFkZHcgUHEsUXEgfCB2cGhhZGR3IFZ4LEh4LFd4ICg2NiksKHYxKQorMDI6IHBoYWRkZCBQcSxRcSB8IHZwaGFkZGQgVngsSHgsV3ggKDY2KSwodjEpCiswMzogcGhhZGRzdyBQcSxRcSB8IHZwaGFkZHN3IFZ4LEh4LFd4ICg2NiksKHYxKQorMDQ6IHBtYWRkdWJzdyBQcSxRcSB8IHZwbWFkZHVic3cgVngsSHgsV3ggKDY2KSwodjEpCiswNTogcGhzdWJ3IFBxLFFxIHwgdnBoc3VidyBWeCxIeCxXeCAoNjYpLCh2MSkKKzA2OiBwaHN1YmQgUHEsUXEgfCB2cGhzdWJkIFZ4LEh4LFd4ICg2NiksKHYxKQorMDc6IHBoc3Vic3cgUHEsUXEgfCB2cGhzdWJzdyBWeCxIeCxXeCAoNjYpLCh2MSkKKzA4OiBwc2lnbmIgUHEsUXEgfCB2cHNpZ25iIFZ4LEh4LFd4ICg2NiksKHYxKQorMDk6IHBzaWdudyBQcSxRcSB8IHZwc2lnbncgVngsSHgsV3ggKDY2KSwodjEpCiswYTogcHNpZ25kIFBxLFFxIHwgdnBzaWduZCBWeCxIeCxXeCAoNjYpLCh2MSkKKzBiOiBwbXVsaHJzdyBQcSxRcSB8IHZwbXVsaHJzdyBWeCxIeCxXeCAoNjYpLCh2MSkKKzBjOiB2cGVybWlscHMgVngsSHgsV3ggKDY2KSwodikKKzBkOiB2cGVybWlscGQgVngsSHgsV3ggKDY2KSwodikKKzBlOiB2dGVzdHBzIFZ4LFd4ICg2NiksKHYpCiswZjogdnRlc3RwZCBWeCxXeCAoNjYpLCh2KQogIyAweDBmIDB4MzggMHgxMC0weDFmCiAxMDogcGJsZW5kdmIgVmRxLFdkcSAoNjYpCiAxMToKIDEyOgotMTM6CisxMzogdmN2dHBoMnBzIFZ4LFd4LEliICg2NiksKHYpCiAxNDogYmxlbmR2cHMgVmRxLFdkcSAoNjYpCiAxNTogYmxlbmR2cGQgVmRxLFdkcSAoNjYpCi0xNjoKLTE3OiBwdGVzdCBWZHEsV2RxICg2NiksKFZFWCkKLTE4OiB2YnJvYWRjYXN0c3MgL3IgKDY2KSwob1ZFWCkKLTE5OiB2YnJvYWRjYXN0c2QgL3IgKDY2KSwob1ZFWCksKG8yNTYpCi0xYTogdmJyb2FkY2FzdGYxMjggL3IgKDY2KSwob1ZFWCksKG8yNTYpCisxNjogdnBlcm1wcyBWcXEsSHFxLFdxcSAoNjYpLCh2KQorMTc6IHZwdGVzdCBWeCxXeCAoNjYpCisxODogdmJyb2FkY2FzdHNzIFZ4LFdkICg2NiksKHYpCisxOTogdmJyb2FkY2FzdHNkIFZxcSxXcSAoNjYpLCh2KQorMWE6IHZicm9hZGNhc3RmMTI4IFZxcSxNZHEgKDY2KSwodikKIDFiOgotMWM6IHBhYnNiIFBxLFFxIHwgcGFic2IgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotMWQ6IHBhYnN3IFBxLFFxIHwgcGFic3cgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotMWU6IHBhYnNkIFBxLFFxIHwgcGFic2QgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQorMWM6IHBhYnNiIFBxLFFxIHwgdnBhYnNiIFZ4LFd4ICg2NiksKHYxKQorMWQ6IHBhYnN3IFBxLFFxIHwgdnBhYnN3IFZ4LFd4ICg2NiksKHYxKQorMWU6IHBhYnNkIFBxLFFxIHwgdnBhYnNkIFZ4LFd4ICg2NiksKHYxKQogMWY6CiAjIDB4MGYgMHgzOCAweDIwLTB4MmYKLTIwOiBwbW92c3hidyBWZHEsVWRxL01xICg2NiksKFZFWCksKG8xMjgpCi0yMTogcG1vdnN4YmQgVmRxLFVkcS9NZCAoNjYpLChWRVgpLChvMTI4KQotMjI6IHBtb3ZzeGJxIFZkcSxVZHEvTXcgKDY2KSwoVkVYKSwobzEyOCkKLTIzOiBwbW92c3h3ZCBWZHEsVWRxL01xICg2NiksKFZFWCksKG8xMjgpCi0yNDogcG1vdnN4d3EgVmRxLFVkcS9NZCAoNjYpLChWRVgpLChvMTI4KQotMjU6IHBtb3ZzeGRxIFZkcSxVZHEvTXEgKDY2KSwoVkVYKSwobzEyOCkKKzIwOiB2cG1vdnN4YncgVngsVXgvTXEgKDY2KSwodjEpCisyMTogdnBtb3ZzeGJkIFZ4LFV4L01kICg2NiksKHYxKQorMjI6IHZwbW92c3hicSBWeCxVeC9NdyAoNjYpLCh2MSkKKzIzOiB2cG1vdnN4d2QgVngsVXgvTXEgKDY2KSwodjEpCisyNDogdnBtb3ZzeHdxIFZ4LFV4L01kICg2NiksKHYxKQorMjU6IHZwbW92c3hkcSBWeCxVeC9NcSAoNjYpLCh2MSkKIDI2OgogMjc6Ci0yODogcG11bGRxIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTI5OiBwY21wZXFxIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTJhOiBtb3ZudGRxYSBWZHEsTWRxICg2NiksKFZFWCksKG8xMjgpCi0yYjogcGFja3VzZHcgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotMmM6IHZtYXNrbW92cHMobGQpIC9yICg2NiksKG9WRVgpCi0yZDogdm1hc2ttb3ZwZChsZCkgL3IgKDY2KSwob1ZFWCkKLTJlOiB2bWFza21vdnBzKHN0KSAvciAoNjYpLChvVkVYKQotMmY6IHZtYXNrbW92cGQoc3QpIC9yICg2NiksKG9WRVgpCisyODogdnBtdWxkcSBWeCxIeCxXeCAoNjYpLCh2MSkKKzI5OiB2cGNtcGVxcSBWeCxIeCxXeCAoNjYpLCh2MSkKKzJhOiB2bW92bnRkcWEgVngsTXggKDY2KSwodjEpCisyYjogdnBhY2t1c2R3IFZ4LEh4LFd4ICg2NiksKHYxKQorMmM6IHZtYXNrbW92cHMgVngsSHgsTXggKDY2KSwodikKKzJkOiB2bWFza21vdnBkIFZ4LEh4LE14ICg2NiksKHYpCisyZTogdm1hc2ttb3ZwcyBNeCxIeCxWeCAoNjYpLCh2KQorMmY6IHZtYXNrbW92cGQgTXgsSHgsVnggKDY2KSwodikKICMgMHgwZiAweDM4IDB4MzAtMHgzZgotMzA6IHBtb3Z6eGJ3IFZkcSxVZHEvTXEgKDY2KSwoVkVYKSwobzEyOCkKLTMxOiBwbW92enhiZCBWZHEsVWRxL01kICg2NiksKFZFWCksKG8xMjgpCi0zMjogcG1vdnp4YnEgVmRxLFVkcS9NdyAoNjYpLChWRVgpLChvMTI4KQotMzM6IHBtb3Z6eHdkIFZkcSxVZHEvTXEgKDY2KSwoVkVYKSwobzEyOCkKLTM0OiBwbW92enh3cSBWZHEsVWRxL01kICg2NiksKFZFWCksKG8xMjgpCi0zNTogcG1vdnp4ZHEgVmRxLFVkcS9NcSAoNjYpLChWRVgpLChvMTI4KQotMzY6Ci0zNzogcGNtcGd0cSBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi0zODogcG1pbnNiIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTM5OiBwbWluc2QgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotM2E6IHBtaW51dyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi0zYjogcG1pbnVkIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTNjOiBwbWF4c2IgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotM2Q6IHBtYXhzZCBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi0zZTogcG1heHV3IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLTNmOiBwbWF4dWQgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQorMzA6IHZwbW92enhidyBWeCxVeC9NcSAoNjYpLCh2MSkKKzMxOiB2cG1vdnp4YmQgVngsVXgvTWQgKDY2KSwodjEpCiszMjogdnBtb3Z6eGJxIFZ4LFV4L013ICg2NiksKHYxKQorMzM6IHZwbW92enh3ZCBWeCxVeC9NcSAoNjYpLCh2MSkKKzM0OiB2cG1vdnp4d3EgVngsVXgvTWQgKDY2KSwodjEpCiszNTogdnBtb3Z6eGRxIFZ4LFV4L01xICg2NiksKHYxKQorMzY6IHZwZXJtZCBWcXEsSHFxLFdxcSAoNjYpLCh2KQorMzc6IHZwY21wZ3RxIFZ4LEh4LFd4ICg2NiksKHYxKQorMzg6IHZwbWluc2IgVngsSHgsV3ggKDY2KSwodjEpCiszOTogdnBtaW5zZCBWeCxIeCxXeCAoNjYpLCh2MSkKKzNhOiB2cG1pbnV3IFZ4LEh4LFd4ICg2NiksKHYxKQorM2I6IHZwbWludWQgVngsSHgsV3ggKDY2KSwodjEpCiszYzogdnBtYXhzYiBWeCxIeCxXeCAoNjYpLCh2MSkKKzNkOiB2cG1heHNkIFZ4LEh4LFd4ICg2NiksKHYxKQorM2U6IHZwbWF4dXcgVngsSHgsV3ggKDY2KSwodjEpCiszZjogdnBtYXh1ZCBWeCxIeCxXeCAoNjYpLCh2MSkKICMgMHgwZiAweDM4IDB4NDAtMHg4ZgotNDA6IHBtdWxsZCBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi00MTogcGhtaW5wb3N1dyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi04MDogSU5WRVBUIEdkL3EsTWRxICg2NikKLTgxOiBJTlZQSUQgR2QvcSxNZHEgKDY2KQorNDA6IHZwbXVsbGQgVngsSHgsV3ggKDY2KSwodjEpCis0MTogdnBobWlucG9zdXcgVmRxLFdkcSAoNjYpLCh2MSkKKzQyOgorNDM6Cis0NDoKKzQ1OiB2cHNybHZkL3EgVngsSHgsV3ggKDY2KSwodikKKzQ2OiB2cHNyYXZkIFZ4LEh4LFd4ICg2NiksKHYpCis0NzogdnBzbGx2ZC9xIFZ4LEh4LFd4ICg2NiksKHYpCisjIFNraXAgMHg0OC0weDU3Cis1ODogdnBicm9hZGNhc3RkIFZ4LFd4ICg2NiksKHYpCis1OTogdnBicm9hZGNhc3RxIFZ4LFd4ICg2NiksKHYpCis1YTogdmJyb2FkY2FzdGkxMjggVnFxLE1kcSAoNjYpLCh2KQorIyBTa2lwIDB4NWItMHg3NworNzg6IHZwYnJvYWRjYXN0YiBWeCxXeCAoNjYpLCh2KQorNzk6IHZwYnJvYWRjYXN0dyBWeCxXeCAoNjYpLCh2KQorIyBTa2lwIDB4N2EtMHg3ZgorODA6IElOVkVQVCBHeSxNZHEgKDY2KQorODE6IElOVlBJRCBHeSxNZHEgKDY2KQorODI6IElOVlBDSUQgR3ksTWRxICg2NikKKzhjOiB2cG1hc2ttb3ZkL3EgVngsSHgsTXggKDY2KSwodikKKzhlOiB2cG1hc2ttb3ZkL3EgTXgsVngsSHggKDY2KSwodikKICMgMHgwZiAweDM4IDB4OTAtMHhiZiAoRk1BKQotOTY6IHZmbWFkZHN1YjEzMnBkL3BzIC9yICg2NiksKFZFWCkKLTk3OiB2Zm1zdWJhZGQxMzJwZC9wcyAvciAoNjYpLChWRVgpCi05ODogdmZtYWRkMTMycGQvcHMgL3IgKDY2KSwoVkVYKQotOTk6IHZmbWFkZDEzMnNkL3NzIC9yICg2NiksKFZFWCksKG8xMjgpCi05YTogdmZtc3ViMTMycGQvcHMgL3IgKDY2KSwoVkVYKQotOWI6IHZmbXN1YjEzMnNkL3NzIC9yICg2NiksKFZFWCksKG8xMjgpCi05YzogdmZubWFkZDEzMnBkL3BzIC9yICg2NiksKFZFWCkKLTlkOiB2Zm5tYWRkMTMyc2Qvc3MgL3IgKDY2KSwoVkVYKSwobzEyOCkKLTllOiB2Zm5tc3ViMTMycGQvcHMgL3IgKDY2KSwoVkVYKQotOWY6IHZmbm1zdWIxMzJzZC9zcyAvciAoNjYpLChWRVgpLChvMTI4KQotYTY6IHZmbWFkZHN1YjIxM3BkL3BzIC9yICg2NiksKFZFWCkKLWE3OiB2Zm1zdWJhZGQyMTNwZC9wcyAvciAoNjYpLChWRVgpCi1hODogdmZtYWRkMjEzcGQvcHMgL3IgKDY2KSwoVkVYKQotYTk6IHZmbWFkZDIxM3NkL3NzIC9yICg2NiksKFZFWCksKG8xMjgpCi1hYTogdmZtc3ViMjEzcGQvcHMgL3IgKDY2KSwoVkVYKQotYWI6IHZmbXN1YjIxM3NkL3NzIC9yICg2NiksKFZFWCksKG8xMjgpCi1hYzogdmZubWFkZDIxM3BkL3BzIC9yICg2NiksKFZFWCkKLWFkOiB2Zm5tYWRkMjEzc2Qvc3MgL3IgKDY2KSwoVkVYKSwobzEyOCkKLWFlOiB2Zm5tc3ViMjEzcGQvcHMgL3IgKDY2KSwoVkVYKQotYWY6IHZmbm1zdWIyMTNzZC9zcyAvciAoNjYpLChWRVgpLChvMTI4KQotYjY6IHZmbWFkZHN1YjIzMXBkL3BzIC9yICg2NiksKFZFWCkKLWI3OiB2Zm1zdWJhZGQyMzFwZC9wcyAvciAoNjYpLChWRVgpCi1iODogdmZtYWRkMjMxcGQvcHMgL3IgKDY2KSwoVkVYKQotYjk6IHZmbWFkZDIzMXNkL3NzIC9yICg2NiksKFZFWCksKG8xMjgpCi1iYTogdmZtc3ViMjMxcGQvcHMgL3IgKDY2KSwoVkVYKQotYmI6IHZmbXN1YjIzMXNkL3NzIC9yICg2NiksKFZFWCksKG8xMjgpCi1iYzogdmZubWFkZDIzMXBkL3BzIC9yICg2NiksKFZFWCkKLWJkOiB2Zm5tYWRkMjMxc2Qvc3MgL3IgKDY2KSwoVkVYKSwobzEyOCkKLWJlOiB2Zm5tc3ViMjMxcGQvcHMgL3IgKDY2KSwoVkVYKQotYmY6IHZmbm1zdWIyMzFzZC9zcyAvciAoNjYpLChWRVgpLChvMTI4KQorOTA6IHZnYXRoZXJkZC9xIFZ4LEh4LFd4ICg2NiksKHYpCis5MTogdmdhdGhlcnFkL3EgVngsSHgsV3ggKDY2KSwodikKKzkyOiB2Z2F0aGVyZHBzL2QgVngsSHgsV3ggKDY2KSwodikKKzkzOiB2Z2F0aGVycXBzL2QgVngsSHgsV3ggKDY2KSwodikKKzk0OgorOTU6Cis5NjogdmZtYWRkc3ViMTMycHMvZCBWeCxIeCxXeCAoNjYpLCh2KQorOTc6IHZmbXN1YmFkZDEzMnBzL2QgVngsSHgsV3ggKDY2KSwodikKKzk4OiB2Zm1hZGQxMzJwcy9kIFZ4LEh4LFd4ICg2NiksKHYpCis5OTogdmZtYWRkMTMyc3MvZCBWeCxIeCxXeCAoNjYpLCh2KSwodjEpCis5YTogdmZtc3ViMTMycHMvZCBWeCxIeCxXeCAoNjYpLCh2KQorOWI6IHZmbXN1YjEzMnNzL2QgVngsSHgsV3ggKDY2KSwodiksKHYxKQorOWM6IHZmbm1hZGQxMzJwcy9kIFZ4LEh4LFd4ICg2NiksKHYpCis5ZDogdmZubWFkZDEzMnNzL2QgVngsSHgsV3ggKDY2KSwodiksKHYxKQorOWU6IHZmbm1zdWIxMzJwcy9kIFZ4LEh4LFd4ICg2NiksKHYpCis5ZjogdmZubXN1YjEzMnNzL2QgVngsSHgsV3ggKDY2KSwodiksKHYxKQorYTY6IHZmbWFkZHN1YjIxM3BzL2QgVngsSHgsV3ggKDY2KSwodikKK2E3OiB2Zm1zdWJhZGQyMTNwcy9kIFZ4LEh4LFd4ICg2NiksKHYpCithODogdmZtYWRkMjEzcHMvZCBWeCxIeCxXeCAoNjYpLCh2KQorYTk6IHZmbWFkZDIxM3NzL2QgVngsSHgsV3ggKDY2KSwodiksKHYxKQorYWE6IHZmbXN1YjIxM3BzL2QgVngsSHgsV3ggKDY2KSwodikKK2FiOiB2Zm1zdWIyMTNzcy9kIFZ4LEh4LFd4ICg2NiksKHYpLCh2MSkKK2FjOiB2Zm5tYWRkMjEzcHMvZCBWeCxIeCxXeCAoNjYpLCh2KQorYWQ6IHZmbm1hZGQyMTNzcy9kIFZ4LEh4LFd4ICg2NiksKHYpLCh2MSkKK2FlOiB2Zm5tc3ViMjEzcHMvZCBWeCxIeCxXeCAoNjYpLCh2KQorYWY6IHZmbm1zdWIyMTNzcy9kIFZ4LEh4LFd4ICg2NiksKHYpLCh2MSkKK2I2OiB2Zm1hZGRzdWIyMzFwcy9kIFZ4LEh4LFd4ICg2NiksKHYpCitiNzogdmZtc3ViYWRkMjMxcHMvZCBWeCxIeCxXeCAoNjYpLCh2KQorYjg6IHZmbWFkZDIzMXBzL2QgVngsSHgsV3ggKDY2KSwodikKK2I5OiB2Zm1hZGQyMzFzcy9kIFZ4LEh4LFd4ICg2NiksKHYpLCh2MSkKK2JhOiB2Zm1zdWIyMzFwcy9kIFZ4LEh4LFd4ICg2NiksKHYpCitiYjogdmZtc3ViMjMxc3MvZCBWeCxIeCxXeCAoNjYpLCh2KSwodjEpCitiYzogdmZubWFkZDIzMXBzL2QgVngsSHgsV3ggKDY2KSwodikKK2JkOiB2Zm5tYWRkMjMxc3MvZCBWeCxIeCxXeCAoNjYpLCh2KSwodjEpCitiZTogdmZubXN1YjIzMXBzL2QgVngsSHgsV3ggKDY2KSwodikKK2JmOiB2Zm5tc3ViMjMxc3MvZCBWeCxIeCxXeCAoNjYpLCh2KSwodjEpCiAjIDB4MGYgMHgzOCAweGMwLTB4ZmYKLWRiOiBhZXNpbWMgVmRxLFdkcSAoNjYpLChWRVgpLChvMTI4KQotZGM6IGFlc2VuYyBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1kZDogYWVzZW5jbGFzdCBWZHEsV2RxICg2NiksKFZFWCksKG8xMjgpCi1kZTogYWVzZGVjIFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWRmOiBhZXNkZWNsYXN0IFZkcSxXZHEgKDY2KSwoVkVYKSwobzEyOCkKLWYwOiBNT1ZCRSBHdixNdiB8IENSQzMyIEdkLEViIChGMikKLWYxOiBNT1ZCRSBNdixHdiB8IENSQzMyIEdkLEV2IChGMikKK2RiOiBWQUVTSU1DIFZkcSxXZHEgKDY2KSwodjEpCitkYzogVkFFU0VOQyBWZHEsSGRxLFdkcSAoNjYpLCh2MSkKK2RkOiBWQUVTRU5DTEFTVCBWZHEsSGRxLFdkcSAoNjYpLCh2MSkKK2RlOiBWQUVTREVDIFZkcSxIZHEsV2RxICg2NiksKHYxKQorZGY6IFZBRVNERUNMQVNUIFZkcSxIZHEsV2RxICg2NiksKHYxKQorZjA6IE1PVkJFIEd5LE15IHwgTU9WQkUgR3csTXcgKDY2KSB8IENSQzMyIEdkLEViIChGMikKK2YxOiBNT1ZCRSBNeSxHeSB8IE1PVkJFIE13LEd3ICg2NikgfCBDUkMzMiBHZCxFeSAoRjIpCitmMzogQU5ETiBHeSxCeSxFeSAodikKK2Y0OiBHcnAxNyAoMUEpCitmNTogQlpISSBHeSxFeSxCeSAodikgfCBQRVhUIEd5LEJ5LEV5IChGMyksKHYpIHwgUERFUCBHeSxCeSxFeSAoRjIpLCh2KQorZjY6IE1VTFggQnksR3ksckRYLEV5IChGMiksKHYpCitmNzogQkVYVFIgR3ksRXksQnkgKHYpIHwgU0hMWCBHeSxFeSxCeSAoNjYpLCh2KSB8IFNBUlggR3ksRXksQnkgKEYzKSwodikgfCBTSFJYIEd5LEV5LEJ5IChGMiksKHYpCiBFbmRUYWJsZQogCiBUYWJsZTogMy1ieXRlIG9wY29kZSAyICgweDBmIDB4M2EpCiBSZWZlcnJlcjogMy1ieXRlIGVzY2FwZSAyCiBBVlhjb2RlOiAzCiAjIDB4MGYgMHgzYSAweDAwLTB4ZmYKLTA0OiB2cGVybWlscHMgL3IsSWIgKDY2KSwob1ZFWCkKLTA1OiB2cGVybWlscGQgL3IsSWIgKDY2KSwob1ZFWCkKLTA2OiB2cGVybTJmMTI4IC9yLEliICg2NiksKG9WRVgpLChvMjU2KQotMDg6IHJvdW5kcHMgVmRxLFdkcSxJYiAoNjYpLChWRVgpCi0wOTogcm91bmRwZCBWZHEsV2RxLEliICg2NiksKFZFWCkKLTBhOiByb3VuZHNzIFZzcyxXc3MsSWIgKDY2KSwoVkVYKSwobzEyOCkKLTBiOiByb3VuZHNkIFZzZCxXc2QsSWIgKDY2KSwoVkVYKSwobzEyOCkKLTBjOiBibGVuZHBzIFZkcSxXZHEsSWIgKDY2KSwoVkVYKQotMGQ6IGJsZW5kcGQgVmRxLFdkcSxJYiAoNjYpLChWRVgpCi0wZTogcGJsZW5kdyBWZHEsV2RxLEliICg2NiksKFZFWCksKG8xMjgpCi0wZjogcGFsaWduciBQcSxRcSxJYiB8IHBhbGlnbnIgVmRxLFdkcSxJYiAoNjYpLChWRVgpLChvMTI4KQotMTQ6IHBleHRyYiBSZC9NYixWZHEsSWIgKDY2KSwoVkVYKSwobzEyOCkKLTE1OiBwZXh0cncgUmQvTXcsVmRxLEliICg2NiksKFZFWCksKG8xMjgpCi0xNjogcGV4dHJkL3BleHRycSBFZC9xLFZkcSxJYiAoNjYpLChWRVgpLChvMTI4KQotMTc6IGV4dHJhY3RwcyBFZCxWZHEsSWIgKDY2KSwoVkVYKSwobzEyOCkKLTE4OiB2aW5zZXJ0ZjEyOCAvcixJYiAoNjYpLChvVkVYKSwobzI1NikKLTE5OiB2ZXh0cmFjdGYxMjggL3IsSWIgKDY2KSwob1ZFWCksKG8yNTYpCi0yMDogcGluc3JiIFZkcSxSZC9xL01iLEliICg2NiksKFZFWCksKG8xMjgpCi0yMTogaW5zZXJ0cHMgVmRxLFVkcS9NZCxJYiAoNjYpLChWRVgpLChvMTI4KQotMjI6IHBpbnNyZC9waW5zcnEgVmRxLEVkL3EsSWIgKDY2KSwoVkVYKSwobzEyOCkKLTQwOiBkcHBzIFZkcSxXZHEsSWIgKDY2KSwoVkVYKQotNDE6IGRwcGQgVmRxLFdkcSxJYiAoNjYpLChWRVgpLChvMTI4KQotNDI6IG1wc2FkYncgVmRxLFdkcSxJYiAoNjYpLChWRVgpLChvMTI4KQotNDQ6IHBjbG11bHEgVmRxLFdkcSxJYiAoNjYpLChWRVgpLChvMTI4KQotNGE6IHZibGVuZHZwcyAvcixJYiAoNjYpLChvVkVYKQotNGI6IHZibGVuZHZwZCAvcixJYiAoNjYpLChvVkVYKQotNGM6IHZwYmxlbmR2YiAvcixJYiAoNjYpLChvVkVYKSwobzEyOCkKLTYwOiBwY21wZXN0cm0gVmRxLFdkcSxJYiAoNjYpLChWRVgpLChvMTI4KQotNjE6IHBjbXBlc3RyaSBWZHEsV2RxLEliICg2NiksKFZFWCksKG8xMjgpCi02MjogcGNtcGlzdHJtIFZkcSxXZHEsSWIgKDY2KSwoVkVYKSwobzEyOCkKLTYzOiBwY21waXN0cmkgVmRxLFdkcSxJYiAoNjYpLChWRVgpLChvMTI4KQotZGY6IGFlc2tleWdlbmFzc2lzdCBWZHEsV2RxLEliICg2NiksKFZFWCksKG8xMjgpCiswMDogdnBlcm1xIFZxcSxXcXEsSWIgKDY2KSwodikKKzAxOiB2cGVybXBkIFZxcSxXcXEsSWIgKDY2KSwodikKKzAyOiB2cGJsZW5kZCBWeCxIeCxXeCxJYiAoNjYpLCh2KQorMDM6CiswNDogdnBlcm1pbHBzIFZ4LFd4LEliICg2NiksKHYpCiswNTogdnBlcm1pbHBkIFZ4LFd4LEliICg2NiksKHYpCiswNjogdnBlcm0yZjEyOCBWcXEsSHFxLFdxcSxJYiAoNjYpLCh2KQorMDc6CiswODogdnJvdW5kcHMgVngsV3gsSWIgKDY2KQorMDk6IHZyb3VuZHBkIFZ4LFd4LEliICg2NikKKzBhOiB2cm91bmRzcyBWc3MsV3NzLEliICg2NiksKHYxKQorMGI6IHZyb3VuZHNkIFZzZCxXc2QsSWIgKDY2KSwodjEpCiswYzogdmJsZW5kcHMgVngsSHgsV3gsSWIgKDY2KQorMGQ6IHZibGVuZHBkIFZ4LEh4LFd4LEliICg2NikKKzBlOiB2cGJsZW5kdyBWeCxIeCxXeCxJYiAoNjYpLCh2MSkKKzBmOiBwYWxpZ25yIFBxLFFxLEliIHwgdnBhbGlnbnIgVngsSHgsV3gsSWIgKDY2KSwodjEpCisxNDogdnBleHRyYiBSZC9NYixWZHEsSWIgKDY2KSwodjEpCisxNTogdnBleHRydyBSZC9NdyxWZHEsSWIgKDY2KSwodjEpCisxNjogdnBleHRyZC9xIEV5LFZkcSxJYiAoNjYpLCh2MSkKKzE3OiB2ZXh0cmFjdHBzIEVkLFZkcSxJYiAoNjYpLCh2MSkKKzE4OiB2aW5zZXJ0ZjEyOCBWcXEsSHFxLFdxcSxJYiAoNjYpLCh2KQorMTk6IHZleHRyYWN0ZjEyOCBXZHEsVnFxLEliICg2NiksKHYpCisxZDogdmN2dHBzMnBoIFd4LFZ4LEliICg2NiksKHYpCisyMDogdnBpbnNyYiBWZHEsSGRxLFJ5L01iLEliICg2NiksKHYxKQorMjE6IHZpbnNlcnRwcyBWZHEsSGRxLFVkcS9NZCxJYiAoNjYpLCh2MSkKKzIyOiB2cGluc3JkL3EgVmRxLEhkcSxFeSxJYiAoNjYpLCh2MSkKKzM4OiB2aW5zZXJ0aTEyOCBWcXEsSHFxLFdxcSxJYiAoNjYpLCh2KQorMzk6IHZleHRyYWN0aTEyOCBXZHEsVnFxLEliICg2NiksKHYpCis0MDogdmRwcHMgVngsSHgsV3gsSWIgKDY2KQorNDE6IHZkcHBkIFZkcSxIZHEsV2RxLEliICg2NiksKHYxKQorNDI6IHZtcHNhZGJ3IFZ4LEh4LFd4LEliICg2NiksKHYxKQorNDQ6IHZwY2xtdWxxZHEgVmRxLEhkcSxXZHEsSWIgKDY2KSwodjEpCis0NjogdnBlcm0yaTEyOCBWcXEsSHFxLFdxcSxJYiAoNjYpLCh2KQorNGE6IHZibGVuZHZwcyBWeCxIeCxXeCxMeCAoNjYpLCh2KQorNGI6IHZibGVuZHZwZCBWeCxIeCxXeCxMeCAoNjYpLCh2KQorNGM6IHZwYmxlbmR2YiBWeCxIeCxXeCxMeCAoNjYpLCh2MSkKKzYwOiB2cGNtcGVzdHJtIFZkcSxXZHEsSWIgKDY2KSwodjEpCis2MTogdnBjbXBlc3RyaSBWZHEsV2RxLEliICg2NiksKHYxKQorNjI6IHZwY21waXN0cm0gVmRxLFdkcSxJYiAoNjYpLCh2MSkKKzYzOiB2cGNtcGlzdHJpIFZkcSxXZHEsSWIgKDY2KSwodjEpCitkZjogVkFFU0tFWUdFTiBWZHEsV2RxLEliICg2NiksKHYxKQorZjA6IFJPUlggR3ksRXksSWIgKEYyKSwodikKIEVuZFRhYmxlCiAKIEdycFRhYmxlOiBHcnAxCkBAIC03OTAsNyArODQzLDcgQEAKIDI6IENBTExOIEV2IChmNjQpCiAzOiBDQUxMRiBFcAogNDogSk1QTiBFdiAoZjY0KQotNTogSk1QRiBFcAorNTogSk1QRiBNcAogNjogUFVTSCBFdiAoZDY0KQogNzoKIEVuZFRhYmxlCkBAIC04MDcsNyArODYwLDcgQEAKIEdycFRhYmxlOiBHcnA3CiAwOiBTR0RUIE1zIHwgVk1DQUxMICgwMDEpLCgxMUIpIHwgVk1MQVVOQ0ggKDAxMCksKDExQikgfCBWTVJFU1VNRSAoMDExKSwoMTFCKSB8IFZNWE9GRiAoMTAwKSwoMTFCKQogMTogU0lEVCBNcyB8IE1PTklUT1IgKDAwMCksKDExQikgfCBNV0FJVCAoMDAxKQotMjogTEdEVCBNcyB8IFhHRVRCViAoMDAwKSwoMTFCKSB8IFhTRVRCViAoMDAxKSwoMTFCKQorMjogTEdEVCBNcyB8IFhHRVRCViAoMDAwKSwoMTFCKSB8IFhTRVRCViAoMDAxKSwoMTFCKSB8IFZNRlVOQyAoMTAwKSwoMTFCKQogMzogTElEVCBNcwogNDogU01TVyBNdy9SdgogNToKQEAgLTgyNCw0NCArODc3LDQ1IEBACiAKIEdycFRhYmxlOiBHcnA5CiAxOiBDTVBYQ0hHOEIvMTZCIE1xL01kcQotNjogVk1QVFJMRCBNcSB8IFZNQ0xFQVIgTXEgKDY2KSB8IFZNWE9OIE1xIChGMykKLTc6IFZNUFRSU1QgTXEKKzY6IFZNUFRSTEQgTXEgfCBWTUNMRUFSIE1xICg2NikgfCBWTVhPTiBNcSAoRjMpIHwgUkRSQU5EIFJ2ICgxMUIpCis3OiBWTVBUUlNUIE1xIHwgVk1QVFJTVCBNcSAoRjMpCiBFbmRUYWJsZQogCiBHcnBUYWJsZTogR3JwMTAKIEVuZFRhYmxlCiAKIEdycFRhYmxlOiBHcnAxMQorIyBOb3RlOiB0aGUgb3BlcmFuZHMgYXJlIGdpdmVuIGJ5IGdyb3VwIG9wY29kZQogMDogTU9WCiBFbmRUYWJsZQogCiBHcnBUYWJsZTogR3JwMTIKLTI6IHBzcmx3IE5xLEliICgxMUIpIHwgcHNybHcgVWRxLEliICg2NiksKDExQiksKFZFWCksKG8xMjgpCi00OiBwc3JhdyBOcSxJYiAoMTFCKSB8IHBzcmF3IFVkcSxJYiAoNjYpLCgxMUIpLChWRVgpLChvMTI4KQotNjogcHNsbHcgTnEsSWIgKDExQikgfCBwc2xsdyBVZHEsSWIgKDY2KSwoMTFCKSwoVkVYKSwobzEyOCkKKzI6IHBzcmx3IE5xLEliICgxMUIpIHwgdnBzcmx3IEh4LFV4LEliICg2NiksKDExQiksKHYxKQorNDogcHNyYXcgTnEsSWIgKDExQikgfCB2cHNyYXcgSHgsVXgsSWIgKDY2KSwoMTFCKSwodjEpCis2OiBwc2xsdyBOcSxJYiAoMTFCKSB8IHZwc2xsdyBIeCxVeCxJYiAoNjYpLCgxMUIpLCh2MSkKIEVuZFRhYmxlCiAKIEdycFRhYmxlOiBHcnAxMwotMjogcHNybGQgTnEsSWIgKDExQikgfCBwc3JsZCBVZHEsSWIgKDY2KSwoMTFCKSwoVkVYKSwobzEyOCkKLTQ6IHBzcmFkIE5xLEliICgxMUIpIHwgcHNyYWQgVWRxLEliICg2NiksKDExQiksKFZFWCksKG8xMjgpCi02OiBwc2xsZCBOcSxJYiAoMTFCKSB8IHBzbGxkIFVkcSxJYiAoNjYpLCgxMUIpLChWRVgpLChvMTI4KQorMjogcHNybGQgTnEsSWIgKDExQikgfCB2cHNybGQgSHgsVXgsSWIgKDY2KSwoMTFCKSwodjEpCis0OiBwc3JhZCBOcSxJYiAoMTFCKSB8IHZwc3JhZCBIeCxVeCxJYiAoNjYpLCgxMUIpLCh2MSkKKzY6IHBzbGxkIE5xLEliICgxMUIpIHwgdnBzbGxkIEh4LFV4LEliICg2NiksKDExQiksKHYxKQogRW5kVGFibGUKIAogR3JwVGFibGU6IEdycDE0Ci0yOiBwc3JscSBOcSxJYiAoMTFCKSB8IHBzcmxxIFVkcSxJYiAoNjYpLCgxMUIpLChWRVgpLChvMTI4KQotMzogcHNybGRxIFVkcSxJYiAoNjYpLCgxMUIpLChWRVgpLChvMTI4KQotNjogcHNsbHEgTnEsSWIgKDExQikgfCBwc2xscSBVZHEsSWIgKDY2KSwoMTFCKSwoVkVYKSwobzEyOCkKLTc6IHBzbGxkcSBVZHEsSWIgKDY2KSwoMTFCKSwoVkVYKSwobzEyOCkKKzI6IHBzcmxxIE5xLEliICgxMUIpIHwgdnBzcmxxIEh4LFV4LEliICg2NiksKDExQiksKHYxKQorMzogdnBzcmxkcSBIeCxVeCxJYiAoNjYpLCgxMUIpLCh2MSkKKzY6IHBzbGxxIE5xLEliICgxMUIpIHwgdnBzbGxxIEh4LFV4LEliICg2NiksKDExQiksKHYxKQorNzogdnBzbGxkcSBIeCxVeCxJYiAoNjYpLCgxMUIpLCh2MSkKIEVuZFRhYmxlCiAKIEdycFRhYmxlOiBHcnAxNQotMDogZnhzYXZlCi0xOiBmeHN0b3IKLTI6IGxkbXhjc3IgKFZFWCkKLTM6IHN0bXhjc3IgKFZFWCkKKzA6IGZ4c2F2ZSB8IFJERlNCQVNFIFJ5IChGMyksKDExQikKKzE6IGZ4c3RvciB8IFJER1NCQVNFIFJ5IChGMyksKDExQikKKzI6IHZsZG14Y3NyIE1kICh2MSkgfCBXUkZTQkFTRSBSeSAoRjMpLCgxMUIpCiszOiB2c3RteGNzciBNZCAodjEpIHwgV1JHU0JBU0UgUnkgKEYzKSwoMTFCKQogNDogWFNBVkUKIDU6IFhSU1RPUiB8IGxmZW5jZSAoMTFCKQotNjogbWZlbmNlICgxMUIpCis2OiBYU0FWRU9QVCB8IG1mZW5jZSAoMTFCKQogNzogY2xmbHVzaCB8IHNmZW5jZSAoMTFCKQogRW5kVGFibGUKIApAQCAtODcyLDYgKzkyNiwxMiBAQAogMzogcHJlZmV0Y2ggVDIKIEVuZFRhYmxlCiAKK0dycFRhYmxlOiBHcnAxNworMTogQkxTUiBCeSxFeSAodikKKzI6IEJMU01TSyBCeSxFeSAodikKKzM6IEJMU0kgQnksRXkgKHYpCitFbmRUYWJsZQorCiAjIEFNRCdzIFByZWZldGNoIEdyb3VwCiBHcnBUYWJsZTogR3JwUAogMDogUFJFRkVUQ0gKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL01ha2VmaWxlIGIvYXJjaC94ODYvbW0vTWFrZWZpbGUKaW5kZXggM2QxMTMyNy4uMjNkOGU1ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vTWFrZWZpbGUKKysrIGIvYXJjaC94ODYvbW0vTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDQgQEAKIG9iai0kKENPTkZJR19BQ1BJX05VTUEpCQkrPSBzcmF0Lm8KIG9iai0kKENPTkZJR19OVU1BX0VNVSkJCSs9IG51bWFfZW11bGF0aW9uLm8KIAotb2JqLSQoQ09ORklHX0hBVkVfTUVNQkxPQ0spCQkrPSBtZW1ibG9jay5vCi0KIG9iai0kKENPTkZJR19NRU1URVNUKQkJKz0gbWVtdGVzdC5vCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9leHRhYmxlLmMgYi9hcmNoL3g4Ni9tbS9leHRhYmxlLmMKaW5kZXggZDA0NzRhZC4uMWZiODVkYiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZXh0YWJsZS5jCisrKyBiL2FyY2gveDg2L21tL2V4dGFibGUuYwpAQCAtMjUsNyArMjUsNyBAQAogCWlmIChmaXh1cCkgewogCQkvKiBJZiBmaXh1cCBpcyBsZXNzIHRoYW4gMTYsIGl0IG1lYW5zIHVhY2Nlc3MgZXJyb3IgKi8KIAkJaWYgKGZpeHVwLT5maXh1cCA8IDE2KSB7Ci0JCQljdXJyZW50X3RocmVhZF9pbmZvKCktPnVhY2Nlc3NfZXJyID0gLUVGQVVMVDsKKwkJCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+dWFjY2Vzc19lcnIgPSAxOwogCQkJcmVncy0+aXAgKz0gZml4dXAtPmZpeHVwOwogCQkJcmV0dXJuIDE7CiAJCX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2ZhdWx0LmMgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCmluZGV4IDVkYjA0OTAuLjlkNzQ4MjQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2ZhdWx0LmMKKysrIGIvYXJjaC94ODYvbW0vZmF1bHQuYwpAQCAtNjI2LDcgKzYyNiw3IEBACiAKIHN0YXRpYyBub2lubGluZSB2b2lkCiBub19jb250ZXh0KHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGVycm9yX2NvZGUsCi0JICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQorCSAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50IHNpZ25hbCwgaW50IHNpX2NvZGUpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCXVuc2lnbmVkIGxvbmcgKnN0YWNrZW5kOwpAQCAtNjM0LDggKzYzNCwxNyBAQAogCWludCBzaWc7CiAKIAkvKiBBcmUgd2UgcHJlcGFyZWQgdG8gaGFuZGxlIHRoaXMga2VybmVsIGZhdWx0PyAqLwotCWlmIChmaXh1cF9leGNlcHRpb24ocmVncykpCisJaWYgKGZpeHVwX2V4Y2VwdGlvbihyZWdzKSkgeworCQlpZiAoY3VycmVudF90aHJlYWRfaW5mbygpLT5zaWdfb25fdWFjY2Vzc19lcnJvciAmJiBzaWduYWwpIHsKKwkJCXRzay0+dGhyZWFkLnRyYXBfbm8gPSAxNDsKKwkJCXRzay0+dGhyZWFkLmVycm9yX2NvZGUgPSBlcnJvcl9jb2RlIHwgUEZfVVNFUjsKKwkJCXRzay0+dGhyZWFkLmNyMiA9IGFkZHJlc3M7CisKKwkJCS8qIFhYWDogaHdwb2lzb24gZmF1bHRzIHdpbGwgc2V0IHRoZSB3cm9uZyBjb2RlLiAqLworCQkJZm9yY2Vfc2lnX2luZm9fZmF1bHQoc2lnbmFsLCBzaV9jb2RlLCBhZGRyZXNzLCB0c2ssIDApOworCQl9CiAJCXJldHVybjsKKwl9CiAKIAkvKgogCSAqIDMyLWJpdDoKQEAgLTc1NSw3ICs3NjQsNyBAQAogCWlmIChpc19mMDBmX2J1ZyhyZWdzLCBhZGRyZXNzKSkKIAkJcmV0dXJuOwogCi0Jbm9fY29udGV4dChyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKTsKKwlub19jb250ZXh0KHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MsIFNJR1NFR1YsIHNpX2NvZGUpOwogfQogCiBzdGF0aWMgbm9pbmxpbmUgdm9pZApAQCAtODE5LDcgKzgyOCw3IEBACiAKIAkvKiBLZXJuZWwgbW9kZT8gSGFuZGxlIGV4Y2VwdGlvbnMgb3IgZGllOiAqLwogCWlmICghKGVycm9yX2NvZGUgJiBQRl9VU0VSKSkgewotCQlub19jb250ZXh0KHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MpOworCQlub19jb250ZXh0KHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MsIFNJR0JVUywgQlVTX0FEUkVSUik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTg1NCw3ICs4NjMsNyBAQAogCQlpZiAoIShmYXVsdCAmIFZNX0ZBVUxUX1JFVFJZKSkKIAkJCXVwX3JlYWQoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7CiAJCWlmICghKGVycm9yX2NvZGUgJiBQRl9VU0VSKSkKLQkJCW5vX2NvbnRleHQocmVncywgZXJyb3JfY29kZSwgYWRkcmVzcyk7CisJCQlub19jb250ZXh0KHJlZ3MsIGVycm9yX2NvZGUsIGFkZHJlc3MsIDAsIDApOwogCQlyZXR1cm4gMTsKIAl9CiAJaWYgKCEoZmF1bHQgJiBWTV9GQVVMVF9FUlJPUikpCkBAIC04NjQsNyArODczLDggQEAKIAkJLyogS2VybmVsIG1vZGU/IEhhbmRsZSBleGNlcHRpb25zIG9yIGRpZTogKi8KIAkJaWYgKCEoZXJyb3JfY29kZSAmIFBGX1VTRVIpKSB7CiAJCQl1cF9yZWFkKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCQkJbm9fY29udGV4dChyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKTsKKwkJCW5vX2NvbnRleHQocmVncywgZXJyb3JfY29kZSwgYWRkcmVzcywKKwkJCQkgICBTSUdTRUdWLCBTRUdWX01BUEVSUik7CiAJCQlyZXR1cm4gMTsKIAkJfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9ndXAuYyBiL2FyY2gveDg2L21tL2d1cC5jCmluZGV4IGVhMzA1ODUuLmRkNzRlNDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2d1cC5jCisrKyBiL2FyY2gveDg2L21tL2d1cC5jCkBAIC0yMDEsNiArMjAxLDggQEAKIAlkbyB7CiAJCVZNX0JVR19PTihjb21wb3VuZF9oZWFkKHBhZ2UpICE9IGhlYWQpOwogCQlwYWdlc1sqbnJdID0gcGFnZTsKKwkJaWYgKFBhZ2VUYWlsKHBhZ2UpKQorCQkJZ2V0X2h1Z2VfcGFnZV90YWlsKHBhZ2UpOwogCQkoKm5yKSsrOwogCQlwYWdlKys7CiAJCXJlZnMrKzsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2hpZ2htZW1fMzIuYyBiL2FyY2gveDg2L21tL2hpZ2htZW1fMzIuYwppbmRleCBiNDk5NjI2Li5mNGYyOWIxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9oaWdobWVtXzMyLmMKKysrIGIvYXJjaC94ODYvbW0vaGlnaG1lbV8zMi5jCkBAIC00NSw2ICs0NSw3IEBACiAJdmFkZHIgPSBfX2ZpeF90b192aXJ0KEZJWF9LTUFQX0JFR0lOICsgaWR4KTsKIAlCVUdfT04oIXB0ZV9ub25lKCooa21hcF9wdGUtaWR4KSkpOwogCXNldF9wdGUoa21hcF9wdGUtaWR4LCBta19wdGUocGFnZSwgcHJvdCkpOworCWFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpOwogCiAJcmV0dXJuICh2b2lkICopdmFkZHI7CiB9CkBAIC04OCw2ICs4OSw3IEBACiAJCSAqLwogCQlrcHRlX2NsZWFyX2ZsdXNoKGttYXBfcHRlLWlkeCwgdmFkZHIpOwogCQlrbWFwX2F0b21pY19pZHhfcG9wKCk7CisJCWFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpOwogCX0KICNpZmRlZiBDT05GSUdfREVCVUdfSElHSE1FTQogCWVsc2UgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdC5jIGIvYXJjaC94ODYvbW0vaW5pdC5jCmluZGV4IDg3NDg4YjkuLmEyOTg5MTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXQuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0LmMKQEAgLTY3LDcgKzY3LDcgQEAKIAlnb29kX2VuZCA9IG1heF9wZm5fbWFwcGVkIDw8IFBBR0VfU0hJRlQ7CiAKIAliYXNlID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZShzdGFydCwgZ29vZF9lbmQsIHRhYmxlcywgUEFHRV9TSVpFKTsKLQlpZiAoYmFzZSA9PSBNRU1CTE9DS19FUlJPUikKKwlpZiAoIWJhc2UpCiAJCXBhbmljKCJDYW5ub3QgZmluZCBzcGFjZSBmb3IgdGhlIGtlcm5lbCBwYWdlIHRhYmxlcyIpOwogCiAJcGd0X2J1Zl9zdGFydCA9IGJhc2UgPj4gUEFHRV9TSElGVDsKQEAgLTgwLDcgKzgwLDcgQEAKIAogdm9pZCBfX2luaXQgbmF0aXZlX3BhZ2V0YWJsZV9yZXNlcnZlKHU2NCBzdGFydCwgdTY0IGVuZCkKIHsKLQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShzdGFydCwgZW5kLCAiUEdUQUJMRSIpOworCW1lbWJsb2NrX3Jlc2VydmUoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKIH0KIAogc3RydWN0IG1hcF9yYW5nZSB7CkBAIC0yNzksOCArMjc5LDggQEAKIAkgKiBwZ3RfYnVmX2VuZCkgYW5kIGZyZWUgdGhlIG90aGVyIG9uZXMgKHBndF9idWZfZW5kIC0gcGd0X2J1Zl90b3ApCiAJICogc28gdGhhdCB0aGV5IGNhbiBiZSByZXVzZWQgZm9yIG90aGVyIHB1cnBvc2VzLgogCSAqCi0JICogT24gbmF0aXZlIGl0IGp1c3QgbWVhbnMgY2FsbGluZyBtZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZSwgb24gWGVuIGl0Ci0JICogYWxzbyBtZWFucyBtYXJraW5nIFJXIHRoZSBwYWdldGFibGUgcGFnZXMgdGhhdCB3ZSBhbGxvY2F0ZWQgYmVmb3JlCisJICogT24gbmF0aXZlIGl0IGp1c3QgbWVhbnMgY2FsbGluZyBtZW1ibG9ja19yZXNlcnZlLCBvbiBYZW4gaXQgYWxzbworCSAqIG1lYW5zIG1hcmtpbmcgUlcgdGhlIHBhZ2V0YWJsZSBwYWdlcyB0aGF0IHdlIGFsbG9jYXRlZCBiZWZvcmUKIAkgKiBidXQgdGhhdCBoYXZlbid0IGJlZW4gdXNlZC4KIAkgKgogCSAqIEluIGZhY3Qgb24geGVuIHdlIG1hcmsgUk8gdGhlIHdob2xlIHJhbmdlIHBndF9idWZfc3RhcnQgLQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdF8zMi5jIGIvYXJjaC94ODYvbW0vaW5pdF8zMi5jCmluZGV4IDI5ZjdjNmQuLjBjMWRhMzkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKQEAgLTQyNywyMyArNDI3LDE3IEBACiB2b2lkIF9faW5pdCBhZGRfaGlnaHBhZ2VzX3dpdGhfYWN0aXZlX3JlZ2lvbnMoaW50IG5pZCwKIAkJCSB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQogewotCXN0cnVjdCByYW5nZSAqcmFuZ2U7Ci0JaW50IG5yX3JhbmdlOwotCWludCBpOworCXBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7CisJdTY0IGk7CiAKLQlucl9yYW5nZSA9IF9fZ2V0X2ZyZWVfYWxsX21lbW9yeV9yYW5nZSgmcmFuZ2UsIG5pZCwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9yYW5nZTsgaSsrKSB7Ci0JCXN0cnVjdCBwYWdlICpwYWdlOwotCQlpbnQgbm9kZV9wZm47Ci0KLQkJZm9yIChub2RlX3BmbiA9IHJhbmdlW2ldLnN0YXJ0OyBub2RlX3BmbiA8IHJhbmdlW2ldLmVuZDsKLQkJICAgICBub2RlX3BmbisrKSB7Ci0JCQlpZiAoIXBmbl92YWxpZChub2RlX3BmbikpCi0JCQkJY29udGludWU7Ci0JCQlwYWdlID0gcGZuX3RvX3BhZ2Uobm9kZV9wZm4pOwotCQkJYWRkX29uZV9oaWdocGFnZV9pbml0KHBhZ2UpOwotCQl9CisJZm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UoaSwgbmlkLCAmc3RhcnQsICZlbmQsIE5VTEwpIHsKKwkJdW5zaWduZWQgbG9uZyBwZm4gPSBjbGFtcF90KHVuc2lnbmVkIGxvbmcsIFBGTl9VUChzdGFydCksCisJCQkJCSAgICBzdGFydF9wZm4sIGVuZF9wZm4pOworCQl1bnNpZ25lZCBsb25nIGVfcGZuID0gY2xhbXBfdCh1bnNpZ25lZCBsb25nLCBQRk5fRE9XTihlbmQpLAorCQkJCQkgICAgICBzdGFydF9wZm4sIGVuZF9wZm4pOworCQlmb3IgKCA7IHBmbiA8IGVfcGZuOyBwZm4rKykKKwkJCWlmIChwZm5fdmFsaWQocGZuKSkKKwkJCQlhZGRfb25lX2hpZ2hwYWdlX2luaXQocGZuX3RvX3BhZ2UocGZuKSk7CiAJfQogfQogI2Vsc2UKQEAgLTY1MCwxOCArNjQ0LDE4IEBACiAJaGlnaHN0YXJ0X3BmbiA9IGhpZ2hlbmRfcGZuID0gbWF4X3BmbjsKIAlpZiAobWF4X3BmbiA+IG1heF9sb3dfcGZuKQogCQloaWdoc3RhcnRfcGZuID0gbWF4X2xvd19wZm47Ci0JbWVtYmxvY2tfeDg2X3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKDAsIDAsIGhpZ2hlbmRfcGZuKTsKLQlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucygwKTsKIAlwcmludGsoS0VSTl9OT1RJQ0UgIiVsZE1CIEhJR0hNRU0gYXZhaWxhYmxlLlxuIiwKIAkJcGFnZXNfdG9fbWIoaGlnaGVuZF9wZm4gLSBoaWdoc3RhcnRfcGZuKSk7CiAJbnVtX3BoeXNwYWdlcyA9IGhpZ2hlbmRfcGZuOwogCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKikgX192YShoaWdoc3RhcnRfcGZuICogUEFHRV9TSVpFIC0gMSkgKyAxOwogI2Vsc2UKLQltZW1ibG9ja194ODZfcmVnaXN0ZXJfYWN0aXZlX3JlZ2lvbnMoMCwgMCwgbWF4X2xvd19wZm4pOwotCXNwYXJzZV9tZW1vcnlfcHJlc2VudF93aXRoX2FjdGl2ZV9yZWdpb25zKDApOwogCW51bV9waHlzcGFnZXMgPSBtYXhfbG93X3BmbjsKIAloaWdoX21lbW9yeSA9ICh2b2lkICopIF9fdmEobWF4X2xvd19wZm4gKiBQQUdFX1NJWkUgLSAxKSArIDE7CiAjZW5kaWYKKworCW1lbWJsb2NrX3NldF9ub2RlKDAsIChwaHlzX2FkZHJfdClVTExPTkdfTUFYLCAwKTsKKwlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucygwKTsKKwogI2lmZGVmIENPTkZJR19GTEFUTUVNCiAJbWF4X21hcG5yID0gbnVtX3BoeXNwYWdlczsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdF82NC5jIGIvYXJjaC94ODYvbW0vaW5pdF82NC5jCmluZGV4IGJiYWFhMDAuLmE4YTU2Y2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfNjQuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKQEAgLTYwOCw3ICs2MDgsNyBAQAogI2lmbmRlZiBDT05GSUdfTlVNQQogdm9pZCBfX2luaXQgaW5pdG1lbV9pbml0KHZvaWQpCiB7Ci0JbWVtYmxvY2tfeDg2X3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKDAsIDAsIG1heF9wZm4pOworCW1lbWJsb2NrX3NldF9ub2RlKDAsIChwaHlzX2FkZHJfdClVTExPTkdfTUFYLCAwKTsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9tZW1ibG9jay5jIGIvYXJjaC94ODYvbW0vbWVtYmxvY2suYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyZGE1ZS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9tbS9tZW1ibG9jay5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KLSNpbmNsdWRlIDxsaW51eC9tZW1ibG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmdlLmg+Ci0KLS8qIENoZWNrIGZvciBhbHJlYWR5IHJlc2VydmVkIGFyZWFzICovCi1ib29sIF9faW5pdCBtZW1ibG9ja194ODZfY2hlY2tfcmVzZXJ2ZWRfc2l6ZSh1NjQgKmFkZHJwLCB1NjQgKnNpemVwLCB1NjQgYWxpZ24pCi17Ci0Jc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjsKLQl1NjQgYWRkciA9ICphZGRycCwgbGFzdDsKLQl1NjQgc2l6ZSA9ICpzaXplcDsKLQlib29sIGNoYW5nZWQgPSBmYWxzZTsKLQotYWdhaW46Ci0JbGFzdCA9IGFkZHIgKyBzaXplOwotCWZvcl9lYWNoX21lbWJsb2NrKHJlc2VydmVkLCByKSB7Ci0JCWlmIChsYXN0ID4gci0+YmFzZSAmJiBhZGRyIDwgci0+YmFzZSkgewotCQkJc2l6ZSA9IHItPmJhc2UgLSBhZGRyOwotCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQlnb3RvIGFnYWluOwotCQl9Ci0JCWlmIChsYXN0ID4gKHItPmJhc2UgKyByLT5zaXplKSAmJiBhZGRyIDwgKHItPmJhc2UgKyByLT5zaXplKSkgewotCQkJYWRkciA9IHJvdW5kX3VwKHItPmJhc2UgKyByLT5zaXplLCBhbGlnbik7Ci0JCQlzaXplID0gbGFzdCAtIGFkZHI7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCWdvdG8gYWdhaW47Ci0JCX0KLQkJaWYgKGxhc3QgPD0gKHItPmJhc2UgKyByLT5zaXplKSAmJiBhZGRyID49IHItPmJhc2UpIHsKLQkJCSpzaXplcCA9IDA7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JaWYgKGNoYW5nZWQpIHsKLQkJKmFkZHJwID0gYWRkcjsKLQkJKnNpemVwID0gc2l6ZTsKLQl9Ci0JcmV0dXJuIGNoYW5nZWQ7Ci19Ci0KLS8qCi0gKiBGaW5kIG5leHQgZnJlZSByYW5nZSBhZnRlciBzdGFydCwgYW5kIHNpemUgaXMgcmV0dXJuZWQgaW4gKnNpemVwCi0gKi8KLXU2NCBfX2luaXQgbWVtYmxvY2tfeDg2X2ZpbmRfaW5fcmFuZ2Vfc2l6ZSh1NjQgc3RhcnQsIHU2NCAqc2l6ZXAsIHU2NCBhbGlnbikKLXsKLQlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyOwotCi0JZm9yX2VhY2hfbWVtYmxvY2sobWVtb3J5LCByKSB7Ci0JCXU2NCBlaV9zdGFydCA9IHItPmJhc2U7Ci0JCXU2NCBlaV9sYXN0ID0gZWlfc3RhcnQgKyByLT5zaXplOwotCQl1NjQgYWRkcjsKLQotCQlhZGRyID0gcm91bmRfdXAoZWlfc3RhcnQsIGFsaWduKTsKLQkJaWYgKGFkZHIgPCBzdGFydCkKLQkJCWFkZHIgPSByb3VuZF91cChzdGFydCwgYWxpZ24pOwotCQlpZiAoYWRkciA+PSBlaV9sYXN0KQotCQkJY29udGludWU7Ci0JCSpzaXplcCA9IGVpX2xhc3QgLSBhZGRyOwotCQl3aGlsZSAobWVtYmxvY2tfeDg2X2NoZWNrX3Jlc2VydmVkX3NpemUoJmFkZHIsIHNpemVwLCBhbGlnbikpCi0JCQk7Ci0KLQkJaWYgKCpzaXplcCkKLQkJCXJldHVybiBhZGRyOwotCX0KLQotCXJldHVybiBNRU1CTE9DS19FUlJPUjsKLX0KLQotc3RhdGljIF9faW5pdCBzdHJ1Y3QgcmFuZ2UgKmZpbmRfcmFuZ2VfYXJyYXkoaW50IGNvdW50KQotewotCXU2NCBlbmQsIHNpemUsIG1lbTsKLQlzdHJ1Y3QgcmFuZ2UgKnJhbmdlOwotCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcmFuZ2UpICogY291bnQ7Ci0JZW5kID0gbWVtYmxvY2suY3VycmVudF9saW1pdDsKLQotCW1lbSA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2UoMCwgZW5kLCBzaXplLCBzaXplb2Yoc3RydWN0IHJhbmdlKSk7Ci0JaWYgKG1lbSA9PSBNRU1CTE9DS19FUlJPUikKLQkJcGFuaWMoImNhbiBub3QgZmluZCBtb3JlIHNwYWNlIGZvciByYW5nZSBhcnJheSIpOwotCi0JLyoKLQkgKiBUaGlzIHJhbmdlIGlzIHRlbXBvYXJheSwgc28gZG9uJ3QgcmVzZXJ2ZSBpdCwgaXQgd2lsbCBub3QgYmUKLQkgKiBvdmVybGFwcGVkIGJlY2F1c2UgV2Ugd2lsbCBub3QgYWxsb2NjYXRlIG5ldyBidWZmZXIgYmVmb3JlCi0JICogV2UgZGlzY2FyZCB0aGlzIG9uZQotCSAqLwotCXJhbmdlID0gX192YShtZW0pOwotCW1lbXNldChyYW5nZSwgMCwgc2l6ZSk7Ci0KLQlyZXR1cm4gcmFuZ2U7Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCBtZW1ibG9ja194ODZfc3VidHJhY3RfcmVzZXJ2ZWQoc3RydWN0IHJhbmdlICpyYW5nZSwgaW50IGF6KQotewotCXU2NCBmaW5hbF9zdGFydCwgZmluYWxfZW5kOwotCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnI7Ci0KLQkvKiBUYWtlIG91dCByZWdpb24gYXJyYXkgaXRzZWxmIGF0IGZpcnN0Ki8KLQltZW1ibG9ja19mcmVlX3Jlc2VydmVkX3JlZ2lvbnMoKTsKLQotCW1lbWJsb2NrX2RiZygiU3VidHJhY3QgKCVsZCBlYXJseSByZXNlcnZhdGlvbnMpXG4iLCBtZW1ibG9jay5yZXNlcnZlZC5jbnQpOwotCi0JZm9yX2VhY2hfbWVtYmxvY2socmVzZXJ2ZWQsIHIpIHsKLQkJbWVtYmxvY2tfZGJnKCIgIFslMDEwbGx4LSUwMTBsbHhdXG4iLCAodTY0KXItPmJhc2UsICh1NjQpci0+YmFzZSArIHItPnNpemUgLSAxKTsKLQkJZmluYWxfc3RhcnQgPSBQRk5fRE9XTihyLT5iYXNlKTsKLQkJZmluYWxfZW5kID0gUEZOX1VQKHItPmJhc2UgKyByLT5zaXplKTsKLQkJaWYgKGZpbmFsX3N0YXJ0ID49IGZpbmFsX2VuZCkKLQkJCWNvbnRpbnVlOwotCQlzdWJ0cmFjdF9yYW5nZShyYW5nZSwgYXosIGZpbmFsX3N0YXJ0LCBmaW5hbF9lbmQpOwotCX0KLQotCS8qIFB1dCByZWdpb24gYXJyYXkgYmFjayA/ICovCi0JbWVtYmxvY2tfcmVzZXJ2ZV9yZXNlcnZlZF9yZWdpb25zKCk7Ci19Ci0KLXN0cnVjdCBjb3VudF9kYXRhIHsKLQlpbnQgbnI7Ci19OwotCi1zdGF0aWMgaW50IF9faW5pdCBjb3VudF93b3JrX2ZuKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3Bmbiwgdm9pZCAqZGF0YXgpCi17Ci0Jc3RydWN0IGNvdW50X2RhdGEgKmRhdGEgPSBkYXRheDsKLQotCWRhdGEtPm5yKys7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2luaXQgY291bnRfZWFybHlfbm9kZV9tYXAoaW50IG5vZGVpZCkKLXsKLQlzdHJ1Y3QgY291bnRfZGF0YSBkYXRhOwotCi0JZGF0YS5uciA9IDA7Ci0Jd29ya193aXRoX2FjdGl2ZV9yZWdpb25zKG5vZGVpZCwgY291bnRfd29ya19mbiwgJmRhdGEpOwotCi0JcmV0dXJuIGRhdGEubnI7Ci19Ci0KLWludCBfX2luaXQgX19nZXRfZnJlZV9hbGxfbWVtb3J5X3JhbmdlKHN0cnVjdCByYW5nZSAqKnJhbmdlcCwgaW50IG5vZGVpZCwKLQkJCSB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKQotewotCWludCBjb3VudDsKLQlzdHJ1Y3QgcmFuZ2UgKnJhbmdlOwotCWludCBucl9yYW5nZTsKLQotCWNvdW50ID0gKG1lbWJsb2NrLnJlc2VydmVkLmNudCArIGNvdW50X2Vhcmx5X25vZGVfbWFwKG5vZGVpZCkpICogMjsKLQotCXJhbmdlID0gZmluZF9yYW5nZV9hcnJheShjb3VudCk7Ci0JbnJfcmFuZ2UgPSAwOwotCi0JLyoKLQkgKiBVc2UgZWFybHlfbm9kZV9tYXBbXSBhbmQgbWVtYmxvY2sucmVzZXJ2ZWQucmVnaW9uIHRvIGdldCByYW5nZSBhcnJheQotCSAqIGF0IGZpcnN0Ci0JICovCi0JbnJfcmFuZ2UgPSBhZGRfZnJvbV9lYXJseV9ub2RlX21hcChyYW5nZSwgY291bnQsIG5yX3JhbmdlLCBub2RlaWQpOwotCXN1YnRyYWN0X3JhbmdlKHJhbmdlLCBjb3VudCwgMCwgc3RhcnRfcGZuKTsKLQlzdWJ0cmFjdF9yYW5nZShyYW5nZSwgY291bnQsIGVuZF9wZm4sIC0xVUxMKTsKLQotCW1lbWJsb2NrX3g4Nl9zdWJ0cmFjdF9yZXNlcnZlZChyYW5nZSwgY291bnQpOwotCW5yX3JhbmdlID0gY2xlYW5fc29ydF9yYW5nZShyYW5nZSwgY291bnQpOwotCi0JKnJhbmdlcCA9IHJhbmdlOwotCXJldHVybiBucl9yYW5nZTsKLX0KLQotaW50IF9faW5pdCBnZXRfZnJlZV9hbGxfbWVtb3J5X3JhbmdlKHN0cnVjdCByYW5nZSAqKnJhbmdlcCwgaW50IG5vZGVpZCkKLXsKLQl1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSAtMVVMOwotCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCWVuZF9wZm4gPSBtYXhfbG93X3BmbjsKLSNlbmRpZgotCXJldHVybiBfX2dldF9mcmVlX2FsbF9tZW1vcnlfcmFuZ2UocmFuZ2VwLCBub2RlaWQsIDAsIGVuZF9wZm4pOwotfQotCi1zdGF0aWMgdTY0IF9faW5pdCBfX21lbWJsb2NrX3g4Nl9tZW1vcnlfaW5fcmFuZ2UodTY0IGFkZHIsIHU2NCBsaW1pdCwgYm9vbCBnZXRfZnJlZSkKLXsKLQlpbnQgaSwgY291bnQ7Ci0Jc3RydWN0IHJhbmdlICpyYW5nZTsKLQlpbnQgbnJfcmFuZ2U7Ci0JdTY0IGZpbmFsX3N0YXJ0LCBmaW5hbF9lbmQ7Ci0JdTY0IGZyZWVfc2l6ZTsKLQlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyOwotCi0JY291bnQgPSAobWVtYmxvY2sucmVzZXJ2ZWQuY250ICsgbWVtYmxvY2subWVtb3J5LmNudCkgKiAyOwotCi0JcmFuZ2UgPSBmaW5kX3JhbmdlX2FycmF5KGNvdW50KTsKLQlucl9yYW5nZSA9IDA7Ci0KLQlhZGRyID0gUEZOX1VQKGFkZHIpOwotCWxpbWl0ID0gUEZOX0RPV04obGltaXQpOwotCi0JZm9yX2VhY2hfbWVtYmxvY2sobWVtb3J5LCByKSB7Ci0JCWZpbmFsX3N0YXJ0ID0gUEZOX1VQKHItPmJhc2UpOwotCQlmaW5hbF9lbmQgPSBQRk5fRE9XTihyLT5iYXNlICsgci0+c2l6ZSk7Ci0JCWlmIChmaW5hbF9zdGFydCA+PSBmaW5hbF9lbmQpCi0JCQljb250aW51ZTsKLQkJaWYgKGZpbmFsX3N0YXJ0ID49IGxpbWl0IHx8IGZpbmFsX2VuZCA8PSBhZGRyKQotCQkJY29udGludWU7Ci0KLQkJbnJfcmFuZ2UgPSBhZGRfcmFuZ2UocmFuZ2UsIGNvdW50LCBucl9yYW5nZSwgZmluYWxfc3RhcnQsIGZpbmFsX2VuZCk7Ci0JfQotCXN1YnRyYWN0X3JhbmdlKHJhbmdlLCBjb3VudCwgMCwgYWRkcik7Ci0Jc3VidHJhY3RfcmFuZ2UocmFuZ2UsIGNvdW50LCBsaW1pdCwgLTFVTEwpOwotCi0JLyogU3VidHJhY3QgbWVtYmxvY2sucmVzZXJ2ZWQucmVnaW9uIGluIHJhbmdlID8gKi8KLQlpZiAoIWdldF9mcmVlKQotCQlnb3RvIHNvcnRfYW5kX2NvdW50X3RoZW07Ci0JZm9yX2VhY2hfbWVtYmxvY2socmVzZXJ2ZWQsIHIpIHsKLQkJZmluYWxfc3RhcnQgPSBQRk5fRE9XTihyLT5iYXNlKTsKLQkJZmluYWxfZW5kID0gUEZOX1VQKHItPmJhc2UgKyByLT5zaXplKTsKLQkJaWYgKGZpbmFsX3N0YXJ0ID49IGZpbmFsX2VuZCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZmluYWxfc3RhcnQgPj0gbGltaXQgfHwgZmluYWxfZW5kIDw9IGFkZHIpCi0JCQljb250aW51ZTsKLQotCQlzdWJ0cmFjdF9yYW5nZShyYW5nZSwgY291bnQsIGZpbmFsX3N0YXJ0LCBmaW5hbF9lbmQpOwotCX0KLQotc29ydF9hbmRfY291bnRfdGhlbToKLQlucl9yYW5nZSA9IGNsZWFuX3NvcnRfcmFuZ2UocmFuZ2UsIGNvdW50KTsKLQotCWZyZWVfc2l6ZSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG5yX3JhbmdlOyBpKyspCi0JCWZyZWVfc2l6ZSArPSByYW5nZVtpXS5lbmQgLSByYW5nZVtpXS5zdGFydDsKLQotCXJldHVybiBmcmVlX3NpemUgPDwgUEFHRV9TSElGVDsKLX0KLQotdTY0IF9faW5pdCBtZW1ibG9ja194ODZfZnJlZV9tZW1vcnlfaW5fcmFuZ2UodTY0IGFkZHIsIHU2NCBsaW1pdCkKLXsKLQlyZXR1cm4gX19tZW1ibG9ja194ODZfbWVtb3J5X2luX3JhbmdlKGFkZHIsIGxpbWl0LCB0cnVlKTsKLX0KLQotdTY0IF9faW5pdCBtZW1ibG9ja194ODZfbWVtb3J5X2luX3JhbmdlKHU2NCBhZGRyLCB1NjQgbGltaXQpCi17Ci0JcmV0dXJuIF9fbWVtYmxvY2tfeDg2X21lbW9yeV9pbl9yYW5nZShhZGRyLCBsaW1pdCwgZmFsc2UpOwotfQotCi12b2lkIF9faW5pdCBtZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZSh1NjQgc3RhcnQsIHU2NCBlbmQsIGNoYXIgKm5hbWUpCi17Ci0JaWYgKHN0YXJ0ID09IGVuZCkKLQkJcmV0dXJuOwotCi0JaWYgKFdBUk5fT05DRShzdGFydCA+IGVuZCwgIm1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlOiB3cm9uZyByYW5nZSBbJSNsbHgsICUjbGx4KVxuIiwgc3RhcnQsIGVuZCkpCi0JCXJldHVybjsKLQotCW1lbWJsb2NrX2RiZygiICAgIG1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlOiBbJSMwMTBsbHgtJSMwMTBsbHhdICUxNnNcbiIsIHN0YXJ0LCBlbmQgLSAxLCBuYW1lKTsKLQotCW1lbWJsb2NrX3Jlc2VydmUoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLX0KLQotdm9pZCBfX2luaXQgbWVtYmxvY2tfeDg2X2ZyZWVfcmFuZ2UodTY0IHN0YXJ0LCB1NjQgZW5kKQotewotCWlmIChzdGFydCA9PSBlbmQpCi0JCXJldHVybjsKLQotCWlmIChXQVJOX09OQ0Uoc3RhcnQgPiBlbmQsICJtZW1ibG9ja194ODZfZnJlZV9yYW5nZTogd3JvbmcgcmFuZ2UgWyUjbGx4LCAlI2xseClcbiIsIHN0YXJ0LCBlbmQpKQotCQlyZXR1cm47Ci0KLQltZW1ibG9ja19kYmcoIiAgICAgICBtZW1ibG9ja194ODZfZnJlZV9yYW5nZTogWyUjMDEwbGx4LSUjMDEwbGx4XVxuIiwgc3RhcnQsIGVuZCAtIDEpOwotCi0JbWVtYmxvY2tfZnJlZShzdGFydCwgZW5kIC0gc3RhcnQpOwotfQotCi0vKgotICogTmVlZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgbWVtYmxvY2tfeDg2X3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zLAotICogc28gZWFybHlfbm9kZV9tYXBbXSBpcyBmaWxsZWQgYWxyZWFkeS4KLSAqLwotdTY0IF9faW5pdCBtZW1ibG9ja194ODZfZmluZF9pbl9yYW5nZV9ub2RlKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IGVuZCwgdTY0IHNpemUsIHU2NCBhbGlnbikKLXsKLQl1NjQgYWRkcjsKLQlhZGRyID0gZmluZF9tZW1vcnlfY29yZV9lYXJseShuaWQsIHNpemUsIGFsaWduLCBzdGFydCwgZW5kKTsKLQlpZiAoYWRkciAhPSBNRU1CTE9DS19FUlJPUikKLQkJcmV0dXJuIGFkZHI7Ci0KLQkvKiBGYWxsYmFjaywgc2hvdWxkIGFscmVhZHkgaGF2ZSBzdGFydCBlbmQgd2l0aGluIG5vZGUgcmFuZ2UgKi8KLQlyZXR1cm4gbWVtYmxvY2tfZmluZF9pbl9yYW5nZShzdGFydCwgZW5kLCBzaXplLCBhbGlnbik7Ci19Ci0KLS8qCi0gKiBGaW5kcyBhbiBhY3RpdmUgcmVnaW9uIGluIHRoZSBhZGRyZXNzIHJhbmdlIGZyb20gc3RhcnRfcGZuIHRvIGxhc3RfcGZuIGFuZAotICogcmV0dXJucyBpdHMgcmFuZ2UgaW4gZWlfc3RhcnRwZm4gYW5kIGVpX2VuZHBmbiBmb3IgdGhlIG1lbWJsb2NrIGVudHJ5LgotICovCi1zdGF0aWMgaW50IF9faW5pdCBtZW1ibG9ja194ODZfZmluZF9hY3RpdmVfcmVnaW9uKGNvbnN0IHN0cnVjdCBtZW1ibG9ja19yZWdpb24gKmVpLAotCQkJCSAgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCi0JCQkJICB1bnNpZ25lZCBsb25nIGxhc3RfcGZuLAotCQkJCSAgdW5zaWduZWQgbG9uZyAqZWlfc3RhcnRwZm4sCi0JCQkJICB1bnNpZ25lZCBsb25nICplaV9lbmRwZm4pCi17Ci0JdTY0IGFsaWduID0gUEFHRV9TSVpFOwotCi0JKmVpX3N0YXJ0cGZuID0gcm91bmRfdXAoZWktPmJhc2UsIGFsaWduKSA+PiBQQUdFX1NISUZUOwotCSplaV9lbmRwZm4gPSByb3VuZF9kb3duKGVpLT5iYXNlICsgZWktPnNpemUsIGFsaWduKSA+PiBQQUdFX1NISUZUOwotCi0JLyogU2tpcCBtYXAgZW50cmllcyBzbWFsbGVyIHRoYW4gYSBwYWdlICovCi0JaWYgKCplaV9zdGFydHBmbiA+PSAqZWlfZW5kcGZuKQotCQlyZXR1cm4gMDsKLQotCS8qIFNraXAgaWYgbWFwIGlzIG91dHNpZGUgdGhlIG5vZGUgKi8KLQlpZiAoKmVpX2VuZHBmbiA8PSBzdGFydF9wZm4gfHwgKmVpX3N0YXJ0cGZuID49IGxhc3RfcGZuKQotCQlyZXR1cm4gMDsKLQotCS8qIENoZWNrIGZvciBvdmVybGFwcyAqLwotCWlmICgqZWlfc3RhcnRwZm4gPCBzdGFydF9wZm4pCi0JCSplaV9zdGFydHBmbiA9IHN0YXJ0X3BmbjsKLQlpZiAoKmVpX2VuZHBmbiA+IGxhc3RfcGZuKQotCQkqZWlfZW5kcGZuID0gbGFzdF9wZm47Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyogV2FsayB0aGUgbWVtYmxvY2subWVtb3J5IG1hcCBhbmQgcmVnaXN0ZXIgYWN0aXZlIHJlZ2lvbnMgd2l0aGluIGEgbm9kZSAqLwotdm9pZCBfX2luaXQgbWVtYmxvY2tfeDg2X3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCQkgdW5zaWduZWQgbG9uZyBsYXN0X3BmbikKLXsKLQl1bnNpZ25lZCBsb25nIGVpX3N0YXJ0cGZuOwotCXVuc2lnbmVkIGxvbmcgZWlfZW5kcGZuOwotCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnI7Ci0KLQlmb3JfZWFjaF9tZW1ibG9jayhtZW1vcnksIHIpCi0JCWlmIChtZW1ibG9ja194ODZfZmluZF9hY3RpdmVfcmVnaW9uKHIsIHN0YXJ0X3BmbiwgbGFzdF9wZm4sCi0JCQkJCSAgICZlaV9zdGFydHBmbiwgJmVpX2VuZHBmbikpCi0JCQlhZGRfYWN0aXZlX3JhbmdlKG5pZCwgZWlfc3RhcnRwZm4sIGVpX2VuZHBmbik7Ci19Ci0KLS8qCi0gKiBGaW5kIHRoZSBob2xlIHNpemUgKGluIGJ5dGVzKSBpbiB0aGUgbWVtb3J5IHJhbmdlLgotICogQHN0YXJ0OiBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgcmFuZ2UgdG8gc2NhbgotICogQGVuZDogZW5kaW5nIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSByYW5nZSB0byBzY2FuCi0gKi8KLXU2NCBfX2luaXQgbWVtYmxvY2tfeDg2X2hvbGVfc2l6ZSh1NjQgc3RhcnQsIHU2NCBlbmQpCi17Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBzdGFydCA+PiBQQUdFX1NISUZUOwotCXVuc2lnbmVkIGxvbmcgbGFzdF9wZm4gPSBlbmQgPj4gUEFHRV9TSElGVDsKLQl1bnNpZ25lZCBsb25nIGVpX3N0YXJ0cGZuLCBlaV9lbmRwZm4sIHJhbSA9IDA7Ci0Jc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjsKLQotCWZvcl9lYWNoX21lbWJsb2NrKG1lbW9yeSwgcikKLQkJaWYgKG1lbWJsb2NrX3g4Nl9maW5kX2FjdGl2ZV9yZWdpb24ociwgc3RhcnRfcGZuLCBsYXN0X3BmbiwKLQkJCQkJICAgJmVpX3N0YXJ0cGZuLCAmZWlfZW5kcGZuKSkKLQkJCXJhbSArPSBlaV9lbmRwZm4gLSBlaV9zdGFydHBmbjsKLQotCXJldHVybiBlbmQgLSBzdGFydCAtICgodTY0KXJhbSA8PCBQQUdFX1NISUZUKTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL21lbXRlc3QuYyBiL2FyY2gveDg2L21tL21lbXRlc3QuYwppbmRleCA5MmZhZjNhLi5jODBiOWZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9tZW10ZXN0LmMKKysrIGIvYXJjaC94ODYvbW0vbWVtdGVzdC5jCkBAIC0zNCw3ICszNCw3IEBACiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHBhdHRlcm4sCiAJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXJ0X2JhZCwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgZW5kX2JhZCk7Ci0JbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2Uoc3RhcnRfYmFkLCBlbmRfYmFkLCAiQkFEIFJBTSIpOworCW1lbWJsb2NrX3Jlc2VydmUoc3RhcnRfYmFkLCBlbmRfYmFkIC0gc3RhcnRfYmFkKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IG1lbXRlc3QodTY0IHBhdHRlcm4sIHU2NCBzdGFydF9waHlzLCB1NjQgc2l6ZSkKQEAgLTcwLDI0ICs3MCwxOSBAQAogCiBzdGF0aWMgdm9pZCBfX2luaXQgZG9fb25lX3Bhc3ModTY0IHBhdHRlcm4sIHU2NCBzdGFydCwgdTY0IGVuZCkKIHsKLQl1NjQgc2l6ZSA9IDA7CisJdTY0IGk7CisJcGh5c19hZGRyX3QgdGhpc19zdGFydCwgdGhpc19lbmQ7CiAKLQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQkJc3RhcnQgPSBtZW1ibG9ja194ODZfZmluZF9pbl9yYW5nZV9zaXplKHN0YXJ0LCAmc2l6ZSwgMSk7Ci0KLQkJLyogZG9uZSA/ICovCi0JCWlmIChzdGFydCA+PSBlbmQpCi0JCQlicmVhazsKLQkJaWYgKHN0YXJ0ICsgc2l6ZSA+IGVuZCkKLQkJCXNpemUgPSBlbmQgLSBzdGFydDsKLQotCQlwcmludGsoS0VSTl9JTkZPICIgICUwMTBsbHggLSAlMDEwbGx4IHBhdHRlcm4gJTAxNmxseFxuIiwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXJ0LAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhcnQgKyBzaXplLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgY3B1X3RvX2JlNjQocGF0dGVybikpOwotCQltZW10ZXN0KHBhdHRlcm4sIHN0YXJ0LCBzaXplKTsKLQotCQlzdGFydCArPSBzaXplOworCWZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlKGksIE1BWF9OVU1OT0RFUywgJnRoaXNfc3RhcnQsICZ0aGlzX2VuZCwgTlVMTCkgeworCQl0aGlzX3N0YXJ0ID0gY2xhbXBfdChwaHlzX2FkZHJfdCwgdGhpc19zdGFydCwgc3RhcnQsIGVuZCk7CisJCXRoaXNfZW5kID0gY2xhbXBfdChwaHlzX2FkZHJfdCwgdGhpc19lbmQsIHN0YXJ0LCBlbmQpOworCQlpZiAodGhpc19zdGFydCA8IHRoaXNfZW5kKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICIgICUwMTBsbHggLSAlMDEwbGx4IHBhdHRlcm4gJTAxNmxseFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXRoaXNfc3RhcnQsCisJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0aGlzX2VuZCwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWNwdV90b19iZTY0KHBhdHRlcm4pKTsKKwkJCW1lbXRlc3QocGF0dGVybiwgdGhpc19zdGFydCwgdGhpc19lbmQgLSB0aGlzX3N0YXJ0KTsKKwkJfQogCX0KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vbnVtYS5jIGIvYXJjaC94ODYvbW0vbnVtYS5jCmluZGV4IGZiZWFhZjQuLjQ5NmY0OTQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL251bWEuYworKysgYi9hcmNoL3g4Ni9tbS9udW1hLmMKQEAgLTE5Miw4ICsxOTIsNiBAQAogLyogSW5pdGlhbGl6ZSBOT0RFX0RBVEEgZm9yIGEgbm9kZSBvbiB0aGUgbG9jYWwgbWVtb3J5ICovCiBzdGF0aWMgdm9pZCBfX2luaXQgc2V0dXBfbm9kZV9kYXRhKGludCBuaWQsIHU2NCBzdGFydCwgdTY0IGVuZCkKIHsKLQljb25zdCB1NjQgbmRfbG93ID0gUEZOX1BIWVMoTUFYX0RNQV9QRk4pOwotCWNvbnN0IHU2NCBuZF9oaWdoID0gUEZOX1BIWVMobWF4X3Bmbl9tYXBwZWQpOwogCWNvbnN0IHNpemVfdCBuZF9zaXplID0gcm91bmR1cChzaXplb2YocGdfZGF0YV90KSwgUEFHRV9TSVpFKTsKIAlib29sIHJlbWFwcGVkID0gZmFsc2U7CiAJdTY0IG5kX3BhOwpAQCAtMjI0LDE3ICsyMjIsMTIgQEAKIAkJbmRfcGEgPSBfX3BhKG5kKTsKIAkJcmVtYXBwZWQgPSB0cnVlOwogCX0gZWxzZSB7Ci0JCW5kX3BhID0gbWVtYmxvY2tfeDg2X2ZpbmRfaW5fcmFuZ2Vfbm9kZShuaWQsIG5kX2xvdywgbmRfaGlnaCwKLQkJCQkJCW5kX3NpemUsIFNNUF9DQUNIRV9CWVRFUyk7Ci0JCWlmIChuZF9wYSA9PSBNRU1CTE9DS19FUlJPUikKLQkJCW5kX3BhID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZShuZF9sb3csIG5kX2hpZ2gsCi0JCQkJCQluZF9zaXplLCBTTVBfQ0FDSEVfQllURVMpOwotCQlpZiAobmRfcGEgPT0gTUVNQkxPQ0tfRVJST1IpIHsKKwkJbmRfcGEgPSBtZW1ibG9ja19hbGxvY19uaWQobmRfc2l6ZSwgU01QX0NBQ0hFX0JZVEVTLCBuaWQpOworCQlpZiAoIW5kX3BhKSB7CiAJCQlwcl9lcnIoIkNhbm5vdCBmaW5kICV6dSBieXRlcyBpbiBub2RlICVkXG4iLAogCQkJICAgICAgIG5kX3NpemUsIG5pZCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UobmRfcGEsIG5kX3BhICsgbmRfc2l6ZSwgIk5PREVfREFUQSIpOwogCQluZCA9IF9fdmEobmRfcGEpOwogCX0KIApAQCAtMzcxLDggKzM2NCw3IEBACiAKIAkvKiBudW1hX2Rpc3RhbmNlIGNvdWxkIGJlIDFMVSBtYXJraW5nIGFsbG9jYXRpb24gZmFpbHVyZSwgdGVzdCBjbnQgKi8KIAlpZiAobnVtYV9kaXN0YW5jZV9jbnQpCi0JCW1lbWJsb2NrX3g4Nl9mcmVlX3JhbmdlKF9fcGEobnVtYV9kaXN0YW5jZSksCi0JCQkJCV9fcGEobnVtYV9kaXN0YW5jZSkgKyBzaXplKTsKKwkJbWVtYmxvY2tfZnJlZShfX3BhKG51bWFfZGlzdGFuY2UpLCBzaXplKTsKIAludW1hX2Rpc3RhbmNlX2NudCA9IDA7CiAJbnVtYV9kaXN0YW5jZSA9IE5VTEw7CS8qIGVuYWJsZSB0YWJsZSBjcmVhdGlvbiAqLwogfQpAQCAtMzk1LDEzICszODcsMTMgQEAKIAogCXBoeXMgPSBtZW1ibG9ja19maW5kX2luX3JhbmdlKDAsIFBGTl9QSFlTKG1heF9wZm5fbWFwcGVkKSwKIAkJCQkgICAgICBzaXplLCBQQUdFX1NJWkUpOwotCWlmIChwaHlzID09IE1FTUJMT0NLX0VSUk9SKSB7CisJaWYgKCFwaHlzKSB7CiAJCXByX3dhcm5pbmcoIk5VTUE6IFdhcm5pbmc6IGNhbid0IGFsbG9jYXRlIGRpc3RhbmNlIHRhYmxlIVxuIik7CiAJCS8qIGRvbid0IHJldHJ5IHVudGlsIGV4cGxpY2l0bHkgcmVzZXQgKi8KIAkJbnVtYV9kaXN0YW5jZSA9ICh2b2lkICopMUxVOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9Ci0JbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UocGh5cywgcGh5cyArIHNpemUsICJOVU1BIERJU1QiKTsKKwltZW1ibG9ja19yZXNlcnZlKHBoeXMsIHNpemUpOwogCiAJbnVtYV9kaXN0YW5jZSA9IF9fdmEocGh5cyk7CiAJbnVtYV9kaXN0YW5jZV9jbnQgPSBjbnQ7CkBAIC00ODIsOCArNDc0LDggQEAKIAkJCW51bWFyYW0gPSAwOwogCX0KIAotCWU4MjByYW0gPSBtYXhfcGZuIC0gKG1lbWJsb2NrX3g4Nl9ob2xlX3NpemUoMCwKLQkJCQkJUEZOX1BIWVMobWF4X3BmbikpID4+IFBBR0VfU0hJRlQpOworCWU4MjByYW0gPSBtYXhfcGZuIC0gYWJzZW50X3BhZ2VzX2luX3JhbmdlKDAsIG1heF9wZm4pOworCiAJLyogV2Ugc2VlbSB0byBsb3NlIDMgcGFnZXMgc29tZXdoZXJlLiBBbGxvdyAxTSBvZiBzbGFjay4gKi8KIAlpZiAoKHM2NCkoZTgyMHJhbSAtIG51bWFyYW0pID49ICgxIDw8ICgyMCAtIFBBR0VfU0hJRlQpKSkgewogCQlwcmludGsoS0VSTl9FUlIgIk5VTUE6IG5vZGVzIG9ubHkgY292ZXIgJUx1TUIgb2YgeW91ciAlTHVNQiBlODIwIFJBTS4gTm90IHVzZWQuXG4iLApAQCAtNTA1LDEzICs0OTcsMTAgQEAKIAlpZiAoV0FSTl9PTihub2Rlc19lbXB0eShub2RlX3Bvc3NpYmxlX21hcCkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWZvciAoaSA9IDA7IGkgPCBtaS0+bnJfYmxrczsgaSsrKQotCQltZW1ibG9ja194ODZfcmVnaXN0ZXJfYWN0aXZlX3JlZ2lvbnMobWktPmJsa1tpXS5uaWQsCi0JCQkJCW1pLT5ibGtbaV0uc3RhcnQgPj4gUEFHRV9TSElGVCwKLQkJCQkJbWktPmJsa1tpXS5lbmQgPj4gUEFHRV9TSElGVCk7Ci0KLQkvKiBmb3Igb3V0IG9mIG9yZGVyIGVudHJpZXMgKi8KLQlzb3J0X25vZGVfbWFwKCk7CisJZm9yIChpID0gMDsgaSA8IG1pLT5ucl9ibGtzOyBpKyspIHsKKwkJc3RydWN0IG51bWFfbWVtYmxrICptYiA9ICZtaS0+YmxrW2ldOworCQltZW1ibG9ja19zZXRfbm9kZShtYi0+c3RhcnQsIG1iLT5lbmQgLSBtYi0+c3RhcnQsIG1iLT5uaWQpOworCX0KIAogCS8qCiAJICogSWYgc2VjdGlvbnMgYXJyYXkgaXMgZ29ubmEgYmUgdXNlZCBmb3IgcGZuIC0+IG5pZCBtYXBwaW5nLCBjaGVjawpAQCAtNTQ1LDYgKzUzNCw4IEBACiAJCQlzZXR1cF9ub2RlX2RhdGEobmlkLCBzdGFydCwgZW5kKTsKIAl9CiAKKwkvKiBEdW1wIG1lbWJsb2NrIHdpdGggbm9kZSBpbmZvIGFuZCByZXR1cm4uICovCisJbWVtYmxvY2tfZHVtcF9hbGwoKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTgyLDcgKzU3Myw3IEBACiAJbm9kZXNfY2xlYXIobm9kZV9wb3NzaWJsZV9tYXApOwogCW5vZGVzX2NsZWFyKG5vZGVfb25saW5lX21hcCk7CiAJbWVtc2V0KCZudW1hX21lbWluZm8sIDAsIHNpemVvZihudW1hX21lbWluZm8pKTsKLQlyZW1vdmVfYWxsX2FjdGl2ZV9yYW5nZXMoKTsKKwlXQVJOX09OKG1lbWJsb2NrX3NldF9ub2RlKDAsIFVMTE9OR19NQVgsIE1BWF9OVU1OT0RFUykpOwogCW51bWFfcmVzZXRfZGlzdGFuY2UoKTsKIAogCXJldCA9IGluaXRfZnVuYygpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vbnVtYV8zMi5jIGIvYXJjaC94ODYvbW0vbnVtYV8zMi5jCmluZGV4IDNhZGViZTcuLjUzNDI1NWEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL251bWFfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9udW1hXzMyLmMKQEAgLTE5OSwyMyArMTk5LDIzIEBACiAKIAkvKiBhbGxvY2F0ZSBub2RlIG1lbW9yeSBhbmQgdGhlIGxvd21lbSByZW1hcCBhcmVhICovCiAJbm9kZV9wYSA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2Uoc3RhcnQsIGVuZCwgc2l6ZSwgTEFSR0VfUEFHRV9CWVRFUyk7Ci0JaWYgKG5vZGVfcGEgPT0gTUVNQkxPQ0tfRVJST1IpIHsKKwlpZiAoIW5vZGVfcGEpIHsKIAkJcHJfd2FybmluZygicmVtYXBfYWxsb2M6IGZhaWxlZCB0byBhbGxvY2F0ZSAlbHUgYnl0ZXMgZm9yIG5vZGUgJWRcbiIsCiAJCQkgICBzaXplLCBuaWQpOwogCQlyZXR1cm47CiAJfQotCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKG5vZGVfcGEsIG5vZGVfcGEgKyBzaXplLCAiS1ZBIFJBTSIpOworCW1lbWJsb2NrX3Jlc2VydmUobm9kZV9wYSwgc2l6ZSk7CiAKIAlyZW1hcF9wYSA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2UobWluX2xvd19wZm4gPDwgUEFHRV9TSElGVCwKIAkJCQkJICBtYXhfbG93X3BmbiA8PCBQQUdFX1NISUZULAogCQkJCQkgIHNpemUsIExBUkdFX1BBR0VfQllURVMpOwotCWlmIChyZW1hcF9wYSA9PSBNRU1CTE9DS19FUlJPUikgeworCWlmICghcmVtYXBfcGEpIHsKIAkJcHJfd2FybmluZygicmVtYXBfYWxsb2M6IGZhaWxlZCB0byBhbGxvY2F0ZSAlbHUgYnl0ZXMgcmVtYXAgYXJlYSBmb3Igbm9kZSAlZFxuIiwKIAkJCSAgIHNpemUsIG5pZCk7Ci0JCW1lbWJsb2NrX3g4Nl9mcmVlX3JhbmdlKG5vZGVfcGEsIG5vZGVfcGEgKyBzaXplKTsKKwkJbWVtYmxvY2tfZnJlZShub2RlX3BhLCBzaXplKTsKIAkJcmV0dXJuOwogCX0KLQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShyZW1hcF9wYSwgcmVtYXBfcGEgKyBzaXplLCAiS1ZBIFBHIik7CisJbWVtYmxvY2tfcmVzZXJ2ZShyZW1hcF9wYSwgc2l6ZSk7CiAJcmVtYXBfdmEgPSBwaHlzX3RvX3ZpcnQocmVtYXBfcGEpOwogCiAJLyogcGVyZm9ybSBhY3R1YWwgcmVtYXAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL251bWFfNjQuYyBiL2FyY2gveDg2L21tL251bWFfNjQuYwppbmRleCBkZDI3ZjQwLi45MmUyNzExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9udW1hXzY0LmMKKysrIGIvYXJjaC94ODYvbW0vbnVtYV82NC5jCkBAIC0xOSw3ICsxOSw3IEBACiAJZm9yX2VhY2hfb25saW5lX25vZGUoaSkKIAkJcGFnZXMgKz0gZnJlZV9hbGxfYm9vdG1lbV9ub2RlKE5PREVfREFUQShpKSk7CiAKLQlwYWdlcyArPSBmcmVlX2FsbF9tZW1vcnlfY29yZV9lYXJseShNQVhfTlVNTk9ERVMpOworCXBhZ2VzICs9IGZyZWVfbG93X21lbW9yeV9jb3JlX2Vhcmx5KE1BWF9OVU1OT0RFUyk7CiAKIAlyZXR1cm4gcGFnZXM7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9udW1hX2VtdWxhdGlvbi5jIGIvYXJjaC94ODYvbW0vbnVtYV9lbXVsYXRpb24uYwppbmRleCBkMGVkMDg2Li40NmRiNTY4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9udW1hX2VtdWxhdGlvbi5jCisrKyBiL2FyY2gveDg2L21tL251bWFfZW11bGF0aW9uLmMKQEAgLTI4LDYgKzI4LDE2IEBACiAJcmV0dXJuIC1FTk9FTlQ7CiB9CiAKK3N0YXRpYyB1NjQgbWVtX2hvbGVfc2l6ZSh1NjQgc3RhcnQsIHU2NCBlbmQpCit7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBQRk5fVVAoc3RhcnQpOworCXVuc2lnbmVkIGxvbmcgZW5kX3BmbiA9IFBGTl9ET1dOKGVuZCk7CisKKwlpZiAoc3RhcnRfcGZuIDwgZW5kX3BmbikKKwkJcmV0dXJuIFBGTl9QSFlTKGFic2VudF9wYWdlc19pbl9yYW5nZShzdGFydF9wZm4sIGVuZF9wZm4pKTsKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFNldHMgdXAgbmlkIHRvIHJhbmdlIGZyb20gQHN0YXJ0IHRvIEBlbmQuICBUaGUgcmV0dXJuIHZhbHVlIGlzIC1lcnJubyBpZgogICogc29tZXRoaW5nIHdlbnQgd3JvbmcsIDAgb3RoZXJ3aXNlLgpAQCAtODksNyArOTksNyBAQAogCSAqIENhbGN1bGF0ZSB0YXJnZXQgbm9kZSBzaXplLiAgeDg2XzMyIGZyZWFrcyBvbiBfX3VkaXZkaTMoKSBzbyBkbwogCSAqIHRoZSBkaXZpc2lvbiBpbiB1bG9uZyBudW1iZXIgb2YgcGFnZXMgYW5kIGNvbnZlcnQgYmFjay4KIAkgKi8KLQlzaXplID0gbWF4X2FkZHIgLSBhZGRyIC0gbWVtYmxvY2tfeDg2X2hvbGVfc2l6ZShhZGRyLCBtYXhfYWRkcik7CisJc2l6ZSA9IG1heF9hZGRyIC0gYWRkciAtIG1lbV9ob2xlX3NpemUoYWRkciwgbWF4X2FkZHIpOwogCXNpemUgPSBQRk5fUEhZUygodW5zaWduZWQgbG9uZykoc2l6ZSA+PiBQQUdFX1NISUZUKSAvIG5yX25vZGVzKTsKIAogCS8qCkBAIC0xMzUsOCArMTQ1LDcgQEAKIAkJCSAqIENvbnRpbnVlIHRvIGFkZCBtZW1vcnkgdG8gdGhpcyBmYWtlIG5vZGUgaWYgaXRzCiAJCQkgKiBub24tcmVzZXJ2ZWQgbWVtb3J5IGlzIGxlc3MgdGhhbiB0aGUgcGVyLW5vZGUgc2l6ZS4KIAkJCSAqLwotCQkJd2hpbGUgKGVuZCAtIHN0YXJ0IC0KLQkJCSAgICAgICBtZW1ibG9ja194ODZfaG9sZV9zaXplKHN0YXJ0LCBlbmQpIDwgc2l6ZSkgeworCQkJd2hpbGUgKGVuZCAtIHN0YXJ0IC0gbWVtX2hvbGVfc2l6ZShzdGFydCwgZW5kKSA8IHNpemUpIHsKIAkJCQllbmQgKz0gRkFLRV9OT0RFX01JTl9TSVpFOwogCQkJCWlmIChlbmQgPiBsaW1pdCkgewogCQkJCQllbmQgPSBsaW1pdDsKQEAgLTE1MCw3ICsxNTksNyBAQAogCQkJICogdGhpcyBvbmUgbXVzdCBleHRlbmQgdG8gdGhlIGJvdW5kYXJ5LgogCQkJICovCiAJCQlpZiAoZW5kIDwgZG1hMzJfZW5kICYmIGRtYTMyX2VuZCAtIGVuZCAtCi0JCQkgICAgbWVtYmxvY2tfeDg2X2hvbGVfc2l6ZShlbmQsIGRtYTMyX2VuZCkgPCBGQUtFX05PREVfTUlOX1NJWkUpCisJCQkgICAgbWVtX2hvbGVfc2l6ZShlbmQsIGRtYTMyX2VuZCkgPCBGQUtFX05PREVfTUlOX1NJWkUpCiAJCQkJZW5kID0gZG1hMzJfZW5kOwogCiAJCQkvKgpAQCAtMTU4LDggKzE2Nyw3IEBACiAJCQkgKiBuZXh0IG5vZGUsIHRoaXMgb25lIG11c3QgZXh0ZW5kIHRvIHRoZSBlbmQgb2YgdGhlCiAJCQkgKiBwaHlzaWNhbCBub2RlLgogCQkJICovCi0JCQlpZiAobGltaXQgLSBlbmQgLQotCQkJICAgIG1lbWJsb2NrX3g4Nl9ob2xlX3NpemUoZW5kLCBsaW1pdCkgPCBzaXplKQorCQkJaWYgKGxpbWl0IC0gZW5kIC0gbWVtX2hvbGVfc2l6ZShlbmQsIGxpbWl0KSA8IHNpemUpCiAJCQkJZW5kID0gbGltaXQ7CiAKIAkJCXJldCA9IGVtdV9zZXR1cF9tZW1ibGsoZWksIHBpLCBuaWQrKyAlIG5yX25vZGVzLApAQCAtMTgwLDcgKzE4OCw3IEBACiB7CiAJdTY0IGVuZCA9IHN0YXJ0ICsgc2l6ZTsKIAotCXdoaWxlIChlbmQgLSBzdGFydCAtIG1lbWJsb2NrX3g4Nl9ob2xlX3NpemUoc3RhcnQsIGVuZCkgPCBzaXplKSB7CisJd2hpbGUgKGVuZCAtIHN0YXJ0IC0gbWVtX2hvbGVfc2l6ZShzdGFydCwgZW5kKSA8IHNpemUpIHsKIAkJZW5kICs9IEZBS0VfTk9ERV9NSU5fU0laRTsKIAkJaWYgKGVuZCA+IG1heF9hZGRyKSB7CiAJCQllbmQgPSBtYXhfYWRkcjsKQEAgLTIxMSw4ICsyMTksNyBAQAogCSAqIGNyZWF0ZXMgYSB1bmlmb3JtIGRpc3RyaWJ1dGlvbiBvZiBub2RlIHNpemVzIGFjcm9zcyB0aGUgZW50aXJlCiAJICogbWFjaGluZSAoYnV0IG5vdCBuZWNlc3NhcmlseSBvdmVyIHBoeXNpY2FsIG5vZGVzKS4KIAkgKi8KLQltaW5fc2l6ZSA9IChtYXhfYWRkciAtIGFkZHIgLSBtZW1ibG9ja194ODZfaG9sZV9zaXplKGFkZHIsIG1heF9hZGRyKSkgLwotCQkJCQkJTUFYX05VTU5PREVTOworCW1pbl9zaXplID0gKG1heF9hZGRyIC0gYWRkciAtIG1lbV9ob2xlX3NpemUoYWRkciwgbWF4X2FkZHIpKSAvIE1BWF9OVU1OT0RFUzsKIAltaW5fc2l6ZSA9IG1heChtaW5fc2l6ZSwgRkFLRV9OT0RFX01JTl9TSVpFKTsKIAlpZiAoKG1pbl9zaXplICYgRkFLRV9OT0RFX01JTl9IQVNIX01BU0spIDwgbWluX3NpemUpCiAJCW1pbl9zaXplID0gKG1pbl9zaXplICsgRkFLRV9OT0RFX01JTl9TSVpFKSAmCkBAIC0yNTIsNyArMjU5LDcgQEAKIAkJCSAqIHRoaXMgb25lIG11c3QgZXh0ZW5kIHRvIHRoZSBib3VuZGFyeS4KIAkJCSAqLwogCQkJaWYgKGVuZCA8IGRtYTMyX2VuZCAmJiBkbWEzMl9lbmQgLSBlbmQgLQotCQkJICAgIG1lbWJsb2NrX3g4Nl9ob2xlX3NpemUoZW5kLCBkbWEzMl9lbmQpIDwgRkFLRV9OT0RFX01JTl9TSVpFKQorCQkJICAgIG1lbV9ob2xlX3NpemUoZW5kLCBkbWEzMl9lbmQpIDwgRkFLRV9OT0RFX01JTl9TSVpFKQogCQkJCWVuZCA9IGRtYTMyX2VuZDsKIAogCQkJLyoKQEAgLTI2MCw4ICsyNjcsNyBAQAogCQkJICogbmV4dCBub2RlLCB0aGlzIG9uZSBtdXN0IGV4dGVuZCB0byB0aGUgZW5kIG9mIHRoZQogCQkJICogcGh5c2ljYWwgbm9kZS4KIAkJCSAqLwotCQkJaWYgKGxpbWl0IC0gZW5kIC0KLQkJCSAgICBtZW1ibG9ja194ODZfaG9sZV9zaXplKGVuZCwgbGltaXQpIDwgc2l6ZSkKKwkJCWlmIChsaW1pdCAtIGVuZCAtIG1lbV9ob2xlX3NpemUoZW5kLCBsaW1pdCkgPCBzaXplKQogCQkJCWVuZCA9IGxpbWl0OwogCiAJCQlyZXQgPSBlbXVfc2V0dXBfbWVtYmxrKGVpLCBwaSwgbmlkKysgJSBNQVhfTlVNTk9ERVMsCkBAIC0zNTEsMTEgKzM1NywxMSBAQAogCiAJCXBoeXMgPSBtZW1ibG9ja19maW5kX2luX3JhbmdlKDAsIFBGTl9QSFlTKG1heF9wZm5fbWFwcGVkKSwKIAkJCQkJICAgICAgcGh5c19zaXplLCBQQUdFX1NJWkUpOwotCQlpZiAocGh5cyA9PSBNRU1CTE9DS19FUlJPUikgeworCQlpZiAoIXBoeXMpIHsKIAkJCXByX3dhcm5pbmcoIk5VTUE6IFdhcm5pbmc6IGNhbid0IGFsbG9jYXRlIGNvcHkgb2YgZGlzdGFuY2UgdGFibGUsIGRpc2FibGluZyBlbXVsYXRpb25cbiIpOwogCQkJZ290byBub19lbXU7CiAJCX0KLQkJbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2UocGh5cywgcGh5cyArIHBoeXNfc2l6ZSwgIlRNUCBOVU1BIERJU1QiKTsKKwkJbWVtYmxvY2tfcmVzZXJ2ZShwaHlzLCBwaHlzX3NpemUpOwogCQlwaHlzX2Rpc3QgPSBfX3ZhKHBoeXMpOwogCiAJCWZvciAoaSA9IDA7IGkgPCBudW1hX2Rpc3RfY250OyBpKyspCkBAIC00MjQsNyArNDMwLDcgQEAKIAogCS8qIGZyZWUgdGhlIGNvcGllZCBwaHlzaWNhbCBkaXN0YW5jZSB0YWJsZSAqLwogCWlmIChwaHlzX2Rpc3QpCi0JCW1lbWJsb2NrX3g4Nl9mcmVlX3JhbmdlKF9fcGEocGh5c19kaXN0KSwgX19wYShwaHlzX2Rpc3QpICsgcGh5c19zaXplKTsKKwkJbWVtYmxvY2tfZnJlZShfX3BhKHBoeXNfZGlzdCksIHBoeXNfc2l6ZSk7CiAJcmV0dXJuOwogCiBub19lbXU6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jIGIvYXJjaC94ODYvbW0vcGFnZWF0dHIuYwppbmRleCBmOWU1MjY3Li5lZGEyYWNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCisrKyBiL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKQEAgLTk5OCw3ICs5OTgsNyBAQAogfQogRVhQT1JUX1NZTUJPTChzZXRfbWVtb3J5X3VjKTsKIAotaW50IF9zZXRfbWVtb3J5X2FycmF5KHVuc2lnbmVkIGxvbmcgKmFkZHIsIGludCBhZGRyaW5hcnJheSwKK3N0YXRpYyBpbnQgX3NldF9tZW1vcnlfYXJyYXkodW5zaWduZWQgbG9uZyAqYWRkciwgaW50IGFkZHJpbmFycmF5LAogCQl1bnNpZ25lZCBsb25nIG5ld190eXBlKQogewogCWludCBpLCBqOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vc3JhdC5jIGIvYXJjaC94ODYvbW0vc3JhdC5jCmluZGV4IDgxZGJmZGUuLmZkNjFiM2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL3NyYXQuYworKysgYi9hcmNoL3g4Ni9tbS9zcmF0LmMKQEAgLTY5LDYgKzY5LDEyIEBACiAJaWYgKChwYS0+ZmxhZ3MgJiBBQ1BJX1NSQVRfQ1BVX0VOQUJMRUQpID09IDApCiAJCXJldHVybjsKIAlweG0gPSBwYS0+cHJveGltaXR5X2RvbWFpbjsKKwlhcGljX2lkID0gcGEtPmFwaWNfaWQ7CisJaWYgKCFjcHVfaGFzX3gyYXBpYyAmJiAoYXBpY19pZCA+PSAweGZmKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJTUkFUOiBQWE0gJXUgLT4gWDJBUElDIDB4JTA0eCBpZ25vcmVkXG4iLAorCQkJIHB4bSwgYXBpY19pZCk7CisJCXJldHVybjsKKwl9CiAJbm9kZSA9IHNldHVwX25vZGUocHhtKTsKIAlpZiAobm9kZSA8IDApIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJTUkFUOiBUb28gbWFueSBwcm94aW1pdHkgZG9tYWlucyAleFxuIiwgcHhtKTsKQEAgLTc2LDcgKzgyLDYgQEAKIAkJcmV0dXJuOwogCX0KIAotCWFwaWNfaWQgPSBwYS0+YXBpY19pZDsKIAlpZiAoYXBpY19pZCA+PSBNQVhfTE9DQUxfQVBJQykgewogCQlwcmludGsoS0VSTl9JTkZPICJTUkFUOiBQWE0gJXUgLT4gQVBJQyAweCUwNHggLT4gTm9kZSAldSBza2lwcGVkIGFwaWNpZCB0aGF0IGlzIHRvbyBiaWdcbiIsIHB4bSwgYXBpY19pZCwgbm9kZSk7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L25ldC9icGZfaml0X2NvbXAuYyBiL2FyY2gveDg2L25ldC9icGZfaml0X2NvbXAuYwppbmRleCBiZmFiM2ZhLi43YjY1Zjc1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9uZXQvYnBmX2ppdF9jb21wLmMKKysrIGIvYXJjaC94ODYvbmV0L2JwZl9qaXRfY29tcC5jCkBAIC01NjgsOCArNTY4LDggQEAKIAkJCQkJYnJlYWs7CiAJCQkJfQogCQkJCWlmIChmaWx0ZXJbaV0uanQgIT0gMCkgewotCQkJCQlpZiAoZmlsdGVyW2ldLmpmKQotCQkJCQkJdF9vZmZzZXQgKz0gaXNfbmVhcihmX29mZnNldCkgPyAyIDogNjsKKwkJCQkJaWYgKGZpbHRlcltpXS5qZiAmJiBmX29mZnNldCkKKwkJCQkJCXRfb2Zmc2V0ICs9IGlzX25lYXIoZl9vZmZzZXQpID8gMiA6IDU7CiAJCQkJCUVNSVRfQ09ORF9KTVAodF9vcCwgdF9vZmZzZXQpOwogCQkJCQlpZiAoZmlsdGVyW2ldLmpmKQogCQkJCQkJRU1JVF9KTVAoZl9vZmZzZXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvb3Byb2ZpbGUvTWFrZWZpbGUgYi9hcmNoL3g4Ni9vcHJvZmlsZS9NYWtlZmlsZQppbmRleCA0NDY5MDJiLi4xNTk5ZjU2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9vcHJvZmlsZS9NYWtlZmlsZQpAQCAtNCw5ICs0LDggQEAKIAkJb3Byb2YubyBjcHVfYnVmZmVyLm8gYnVmZmVyX3N5bmMubyBcCiAJCWV2ZW50X2J1ZmZlci5vIG9wcm9maWxlX2ZpbGVzLm8gXAogCQlvcHJvZmlsZWZzLm8gb3Byb2ZpbGVfc3RhdHMubyAgXAotCQl0aW1lcl9pbnQubyApCisJCXRpbWVyX2ludC5vIG5taV90aW1lcl9pbnQubyApCiAKIG9wcm9maWxlLXkJCQkJOj0gJChEUklWRVJfT0JKUykgaW5pdC5vIGJhY2t0cmFjZS5vCiBvcHJvZmlsZS0kKENPTkZJR19YODZfTE9DQUxfQVBJQykgCSs9IG5taV9pbnQubyBvcF9tb2RlbF9hbWQubyBcCiAJCQkJCSAgIG9wX21vZGVsX3Bwcm8ubyBvcF9tb2RlbF9wNC5vCi1vcHJvZmlsZS0kKENPTkZJR19YODZfSU9fQVBJQykJCSs9IG5taV90aW1lcl9pbnQubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvb3Byb2ZpbGUvaW5pdC5jIGIvYXJjaC94ODYvb3Byb2ZpbGUvaW5pdC5jCmluZGV4IGNkZmU0YzUuLjllMTM4ZDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL2luaXQuYworKysgYi9hcmNoL3g4Ni9vcHJvZmlsZS9pbml0LmMKQEAgLTE2LDM0ICsxNiwyMyBAQAogICogd2l0aCB0aGUgTk1JIG1vZGUgZHJpdmVyLgogICovCiAKKyNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIGV4dGVybiBpbnQgb3Bfbm1pX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcyk7Ci1leHRlcm4gaW50IG9wX25taV90aW1lcl9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpOwogZXh0ZXJuIHZvaWQgb3Bfbm1pX2V4aXQodm9pZCk7Ci1leHRlcm4gdm9pZCB4ODZfYmFja3RyYWNlKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywgdW5zaWduZWQgaW50IGRlcHRoKTsKKyNlbHNlCitzdGF0aWMgaW50IG9wX25taV9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpIHsgcmV0dXJuIC1FTk9ERVY7IH0KK3N0YXRpYyB2b2lkIG9wX25taV9leGl0KHZvaWQpIHsgfQorI2VuZGlmCiAKK2V4dGVybiB2b2lkIHg4Nl9iYWNrdHJhY2Uoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLCB1bnNpZ25lZCBpbnQgZGVwdGgpOwogCiBpbnQgX19pbml0IG9wcm9maWxlX2FyY2hfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQogewotCWludCByZXQ7Ci0KLQlyZXQgPSAtRU5PREVWOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0JcmV0ID0gb3Bfbm1pX2luaXQob3BzKTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwotCWlmIChyZXQgPCAwKQotCQlyZXQgPSBvcF9ubWlfdGltZXJfaW5pdChvcHMpOwotI2VuZGlmCiAJb3BzLT5iYWNrdHJhY2UgPSB4ODZfYmFja3RyYWNlOwotCi0JcmV0dXJuIHJldDsKKwlyZXR1cm4gb3Bfbm1pX2luaXQob3BzKTsKIH0KIAotCiB2b2lkIG9wcm9maWxlX2FyY2hfZXhpdCh2b2lkKQogewotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogCW9wX25taV9leGl0KCk7Ci0jZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYyBiL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYwppbmRleCA3NWY5NTI4Li4yNmI4YTg1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCkBAIC01OTUsMjQgKzU5NSwzNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGZvcmNlX2FyY2hfcGVyZm1vbjsKLXN0YXRpYyBpbnQgZm9yY2VfY3B1X3R5cGUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK2VudW0gX19mb3JjZV9jcHVfdHlwZSB7CisJcmVzZXJ2ZWQgPSAwLAkJLyogZG8gbm90IGZvcmNlICovCisJdGltZXIsCisJYXJjaF9wZXJmbW9uLAorfTsKKworc3RhdGljIGludCBmb3JjZV9jcHVfdHlwZTsKKworc3RhdGljIGludCBzZXRfY3B1X3R5cGUoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKIHsKLQlpZiAoIXN0cmNtcChzdHIsICJhcmNoX3BlcmZtb24iKSkgewotCQlmb3JjZV9hcmNoX3BlcmZtb24gPSAxOworCWlmICghc3RyY21wKHN0ciwgInRpbWVyIikpIHsKKwkJZm9yY2VfY3B1X3R5cGUgPSB0aW1lcjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IGZvcmNpbmcgTk1JIHRpbWVyIG1vZGVcbiIpOworCX0gZWxzZSBpZiAoIXN0cmNtcChzdHIsICJhcmNoX3BlcmZtb24iKSkgeworCQlmb3JjZV9jcHVfdHlwZSA9IGFyY2hfcGVyZm1vbjsKIAkJcHJpbnRrKEtFUk5fSU5GTyAib3Byb2ZpbGU6IGZvcmNpbmcgYXJjaGl0ZWN0dXJhbCBwZXJmbW9uXG4iKTsKKwl9IGVsc2UgeworCQlmb3JjZV9jcHVfdHlwZSA9IDA7CiAJfQogCiAJcmV0dXJuIDA7CiB9Ci1tb2R1bGVfcGFyYW1fY2FsbChjcHVfdHlwZSwgZm9yY2VfY3B1X3R5cGUsIE5VTEwsIE5VTEwsIDApOworbW9kdWxlX3BhcmFtX2NhbGwoY3B1X3R5cGUsIHNldF9jcHVfdHlwZSwgTlVMTCwgTlVMTCwgMCk7CiAKIHN0YXRpYyBpbnQgX19pbml0IHBwcm9faW5pdChjaGFyICoqY3B1X3R5cGUpCiB7CiAJX191OCBjcHVfbW9kZWwgPSBib290X2NwdV9kYXRhLng4Nl9tb2RlbDsKIAlzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgKnNwZWMgPSAmb3BfcHByb19zcGVjOwkvKiBkZWZhdWx0ICovCiAKLQlpZiAoZm9yY2VfYXJjaF9wZXJmbW9uICYmIGNwdV9oYXNfYXJjaF9wZXJmbW9uKQorCWlmIChmb3JjZV9jcHVfdHlwZSA9PSBhcmNoX3BlcmZtb24gJiYgY3B1X2hhc19hcmNoX3BlcmZtb24pCiAJCXJldHVybiAwOwogCiAJLyoKQEAgLTY3OSw2ICs2OTEsOSBAQAogCWlmICghY3B1X2hhc19hcGljKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCWlmIChmb3JjZV9jcHVfdHlwZSA9PSB0aW1lcikKKwkJcmV0dXJuIC1FTk9ERVY7CisKIAlzd2l0Y2ggKHZlbmRvcikgewogCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6CiAJCS8qIE5lZWRzIHRvIGJlIGF0IGxlYXN0IGFuIEF0aGxvbiAob3IgaGFtbWVyIGluIDMyYml0IG1vZGUpICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmODA1MmMuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX3RpbWVyX2ludC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqCi0gKiBAZmlsZSBubWlfdGltZXJfaW50LmMKLSAqCi0gKiBAcmVtYXJrIENvcHlyaWdodCAyMDAzIE9Qcm9maWxlIGF1dGhvcnMKLSAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCi0gKgotICogQGF1dGhvciBad2FuZSBNd2Fpa2FtYm8gPHp3YW5lQGxpbnV4cG93ZXIuY2E+Ci0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L29wcm9maWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KLQotI2luY2x1ZGUgPGFzbS9ubWkuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KLQotc3RhdGljIGludCBwcm9maWxlX3RpbWVyX2V4Y2VwdGlvbnNfbm90aWZ5KHVuc2lnbmVkIGludCB2YWwsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgMCk7Ci0JcmV0dXJuIE5NSV9IQU5ETEVEOwotfQotCi1zdGF0aWMgaW50IHRpbWVyX3N0YXJ0KHZvaWQpCi17Ci0JaWYgKHJlZ2lzdGVyX25taV9oYW5kbGVyKE5NSV9MT0NBTCwgcHJvZmlsZV90aW1lcl9leGNlcHRpb25zX25vdGlmeSwKLQkJCQkJMCwgIm9wcm9maWxlLXRpbWVyIikpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIHRpbWVyX3N0b3Aodm9pZCkKLXsKLQl1bnJlZ2lzdGVyX25taV9oYW5kbGVyKE5NSV9MT0NBTCwgIm9wcm9maWxlLXRpbWVyIik7Ci0Jc3luY2hyb25pemVfc2NoZWQoKTsgIC8qIEFsbG93IGFscmVhZHktc3RhcnRlZCBOTUlzIHRvIGNvbXBsZXRlLiAqLwotfQotCi0KLWludCBfX2luaXQgb3Bfbm1pX3RpbWVyX2luaXQoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcykKLXsKLQlvcHMtPnN0YXJ0ID0gdGltZXJfc3RhcnQ7Ci0Jb3BzLT5zdG9wID0gdGltZXJfc3RvcDsKLQlvcHMtPmNwdV90eXBlID0gInRpbWVyIjsKLQlwcmludGsoS0VSTl9JTkZPICJvcHJvZmlsZTogdXNpbmcgTk1JIHRpbWVyIGludGVycnVwdC5cbiIpOwotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jIGIvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaS5jCmluZGV4IDM3NzE4ZjAuLjRjZjliZDAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmkuYworKysgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpLmMKQEAgLTIzOCw3ICsyMzgsOCBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0Y19sb2NrLCBmbGFncyk7CiAJZWZpX2NhbGxfcGh5c19wcmVsb2coKTsKLQlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMihlZmlfcGh5cy5nZXRfdGltZSwgdG0sIHRjKTsKKwlzdGF0dXMgPSBlZmlfY2FsbF9waHlzMihlZmlfcGh5cy5nZXRfdGltZSwgdmlydF90b19waHlzKHRtKSwKKwkJCQl2aXJ0X3RvX3BoeXModGMpKTsKIAllZmlfY2FsbF9waHlzX2VwaWxvZygpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ0Y19sb2NrLCBmbGFncyk7CiAJcmV0dXJuIHN0YXR1czsKQEAgLTM1Miw4ICszNTMsNyBAQAogCQlib290X3BhcmFtcy5lZmlfaW5mby5lZmlfbWVtZGVzY19zaXplOwogCW1lbW1hcC5kZXNjX3ZlcnNpb24gPSBib290X3BhcmFtcy5lZmlfaW5mby5lZmlfbWVtZGVzY192ZXJzaW9uOwogCW1lbW1hcC5kZXNjX3NpemUgPSBib290X3BhcmFtcy5lZmlfaW5mby5lZmlfbWVtZGVzY19zaXplOwotCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHBtYXAsIHBtYXAgKyBtZW1tYXAubnJfbWFwICogbWVtbWFwLmRlc2Nfc2l6ZSwKLQkJICAgICAgIkVGSSBtZW1tYXAiKTsKKwltZW1ibG9ja19yZXNlcnZlKHBtYXAsIG1lbW1hcC5ucl9tYXAgKiBtZW1tYXAuZGVzY19zaXplKTsKIH0KIAogI2lmIEVGSV9ERUJVRwpAQCAtMzk3LDE2ICszOTcsMTQgQEAKIAkJaWYgKChzdGFydCtzaXplID49IHZpcnRfdG9fcGh5cyhfdGV4dCkKIAkJCQkmJiBzdGFydCA8PSB2aXJ0X3RvX3BoeXMoX2VuZCkpIHx8CiAJCQkhZTgyMF9hbGxfbWFwcGVkKHN0YXJ0LCBzdGFydCtzaXplLCBFODIwX1JBTSkgfHwKLQkJCW1lbWJsb2NrX3g4Nl9jaGVja19yZXNlcnZlZF9zaXplKCZzdGFydCwgJnNpemUsCi0JCQkJCQkJMTw8RUZJX1BBR0VfU0hJRlQpKSB7CisJCQltZW1ibG9ja19pc19yZWdpb25fcmVzZXJ2ZWQoc3RhcnQsIHNpemUpKSB7CiAJCQkvKiBDb3VsZCBub3QgcmVzZXJ2ZSwgc2tpcCBpdCAqLwogCQkJbWQtPm51bV9wYWdlcyA9IDA7CiAJCQltZW1ibG9ja19kYmcoUEZYICJDb3VsZCBub3QgcmVzZXJ2ZSBib290IHJhbmdlICIKIAkJCQkJIlsweCUwMTBsbHgtMHglMDEwbGx4XVxuIiwKIAkJCQkJCXN0YXJ0LCBzdGFydCtzaXplLTEpOwogCQl9IGVsc2UKLQkJCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKHN0YXJ0LCBzdGFydCtzaXplLAotCQkJCQkJCSJFRkkgQm9vdCIpOworCQkJbWVtYmxvY2tfcmVzZXJ2ZShzdGFydCwgc2l6ZSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzMyLmMgYi9hcmNoL3g4Ni9wbGF0Zm9ybS9lZmkvZWZpXzMyLmMKaW5kZXggZTM2YmY3MS4uNDBlNDQ2OSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvcGxhdGZvcm0vZWZpL2VmaV8zMi5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL2VmaS9lZmlfMzIuYwpAQCAtMzksNDMgKzM5LDE0IEBACiAgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgZWZpX3J0X2VmbGFnczsKLXN0YXRpYyBwZ2RfdCBlZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzJdOwogCiB2b2lkIGVmaV9jYWxsX3BoeXNfcHJlbG9nKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBjcjQ7Ci0JdW5zaWduZWQgbG9uZyB0ZW1wOwogCXN0cnVjdCBkZXNjX3B0ciBnZHRfZGVzY3I7CiAKIAlsb2NhbF9pcnFfc2F2ZShlZmlfcnRfZWZsYWdzKTsKIAotCS8qCi0JICogSWYgSSBkb24ndCBoYXZlIFBBRSwgSSBzaG91bGQganVzdCBkdXBsaWNhdGUgdHdvIGVudHJpZXMgaW4gcGFnZQotCSAqIGRpcmVjdG9yeS4gSWYgSSBoYXZlIFBBRSwgSSBqdXN0IG5lZWQgdG8gZHVwbGljYXRlIG9uZSBlbnRyeSBpbgotCSAqIHBhZ2UgZGlyZWN0b3J5LgotCSAqLwotCWNyNCA9IHJlYWRfY3I0X3NhZmUoKTsKLQotCWlmIChjcjQgJiBYODZfQ1I0X1BBRSkgewotCQllZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzBdLnBnZCA9Ci0JCSAgICBzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZDsKLQkJc3dhcHBlcl9wZ19kaXJbMF0ucGdkID0KLQkJICAgIHN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleChQQUdFX09GRlNFVCldLnBnZDsKLQl9IGVsc2UgewotCQllZmlfYmFrX3BnX2Rpcl9wb2ludGVyWzBdLnBnZCA9Ci0JCSAgICBzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZDsKLQkJZWZpX2Jha19wZ19kaXJfcG9pbnRlclsxXS5wZ2QgPQotCQkgICAgc3dhcHBlcl9wZ19kaXJbcGdkX2luZGV4KDB4NDAwMDAwKV0ucGdkOwotCQlzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMCldLnBnZCA9Ci0JCSAgICBzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoUEFHRV9PRkZTRVQpXS5wZ2Q7Ci0JCXRlbXAgPSBQQUdFX09GRlNFVCArIDB4NDAwMDAwOwotCQlzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMHg0MDAwMDApXS5wZ2QgPQotCQkgICAgc3dhcHBlcl9wZ19kaXJbcGdkX2luZGV4KHRlbXApXS5wZ2Q7Ci0JfQotCi0JLyoKLQkgKiBBZnRlciB0aGUgbG9jayBpcyByZWxlYXNlZCwgdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUgaXMgcmVzdG9yZWQuCi0JICovCisJbG9hZF9jcjMoaW5pdGlhbF9wYWdlX3RhYmxlKTsKIAlfX2ZsdXNoX3RsYl9hbGwoKTsKIAogCWdkdF9kZXNjci5hZGRyZXNzID0gX19wYShnZXRfY3B1X2dkdF90YWJsZSgwKSk7CkBAIC04NSwyOCArNTYsMTMgQEAKIAogdm9pZCBlZmlfY2FsbF9waHlzX2VwaWxvZyh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgY3I0OwogCXN0cnVjdCBkZXNjX3B0ciBnZHRfZGVzY3I7CiAKIAlnZHRfZGVzY3IuYWRkcmVzcyA9ICh1bnNpZ25lZCBsb25nKWdldF9jcHVfZ2R0X3RhYmxlKDApOwogCWdkdF9kZXNjci5zaXplID0gR0RUX1NJWkUgLSAxOwogCWxvYWRfZ2R0KCZnZHRfZGVzY3IpOwogCi0JY3I0ID0gcmVhZF9jcjRfc2FmZSgpOwotCi0JaWYgKGNyNCAmIFg4Nl9DUjRfUEFFKSB7Ci0JCXN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgwKV0ucGdkID0KLQkJICAgIGVmaV9iYWtfcGdfZGlyX3BvaW50ZXJbMF0ucGdkOwotCX0gZWxzZSB7Ci0JCXN3YXBwZXJfcGdfZGlyW3BnZF9pbmRleCgwKV0ucGdkID0KLQkJICAgIGVmaV9iYWtfcGdfZGlyX3BvaW50ZXJbMF0ucGdkOwotCQlzd2FwcGVyX3BnX2RpcltwZ2RfaW5kZXgoMHg0MDAwMDApXS5wZ2QgPQotCQkgICAgZWZpX2Jha19wZ19kaXJfcG9pbnRlclsxXS5wZ2Q7Ci0JfQotCi0JLyoKLQkgKiBBZnRlciB0aGUgbG9jayBpcyByZWxlYXNlZCwgdGhlIG9yaWdpbmFsIHBhZ2UgdGFibGUgaXMgcmVzdG9yZWQuCi0JICovCisJbG9hZF9jcjMoc3dhcHBlcl9wZ19kaXIpOwogCV9fZmx1c2hfdGxiX2FsbCgpOwogCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZWZpX3J0X2VmbGFncyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9wbGF0Zm9ybS9tcnN0L21yc3QuYyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvbXJzdC5jCmluZGV4IGIxNDg5YTAuLmFkNGVjMWMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvbXJzdC5jCisrKyBiL2FyY2gveDg2L3BsYXRmb3JtL21yc3QvbXJzdC5jCkBAIC03Niw2ICs3NiwyMCBAQAogRVhQT1JUX1NZTUJPTF9HUEwoc2ZpX21ydGNfYXJyYXkpOwogaW50IHNmaV9tcnRjX251bTsKIAorc3RhdGljIHZvaWQgbXJzdF9wb3dlcl9vZmYodm9pZCkKK3sKKwlpZiAoX19tcnN0X2NwdV9jaGlwID09IE1SU1RfQ1BVX0NISVBfTElOQ1JPRlQpCisJCWludGVsX3NjdV9pcGNfc2ltcGxlX2NvbW1hbmQoSVBDTVNHX0NPTERfUkVTRVQsIDEpOworfQorCitzdGF0aWMgdm9pZCBtcnN0X3JlYm9vdCh2b2lkKQoreworCWlmIChfX21yc3RfY3B1X2NoaXAgPT0gTVJTVF9DUFVfQ0hJUF9MSU5DUk9GVCkKKwkJaW50ZWxfc2N1X2lwY19zaW1wbGVfY29tbWFuZChJUENNU0dfQ09MRF9SRVNFVCwgMCk7CisJZWxzZQorCQlpbnRlbF9zY3VfaXBjX3NpbXBsZV9jb21tYW5kKElQQ01TR19DT0xEX0JPT1QsIDApOworfQorCiAvKiBwYXJzZSBhbGwgdGhlIG10aW1lciBpbmZvIHRvIGEgc3RhdGljIG10aW1lciBhcnJheSAqLwogc3RhdGljIGludCBfX2luaXQgc2ZpX3BhcnNlX210bXIoc3RydWN0IHNmaV90YWJsZV9oZWFkZXIgKnRhYmxlKQogewpAQCAtMjY1LDE3ICsyNzksNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBSZWJvb3QgYW5kIHBvd2VyIG9mZiBhcmUgaGFuZGxlZCBieSB0aGUgU0NVIG9uIGEgTUlEIGRldmljZSAqLwotc3RhdGljIHZvaWQgbXJzdF9wb3dlcl9vZmYodm9pZCkKLXsKLQlpbnRlbF9zY3VfaXBjX3NpbXBsZV9jb21tYW5kKDB4ZjEsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBtcnN0X3JlYm9vdCh2b2lkKQotewotCWludGVsX3NjdV9pcGNfc2ltcGxlX2NvbW1hbmQoMHhmMSwgMCk7Ci19Ci0KIC8qCiAgKiBNb29yZXN0b3duIGRvZXMgbm90IGhhdmUgZXh0ZXJuYWwgTk1JIHNvdXJjZSBub3IgcG9ydCAweDYxIHRvIHJlcG9ydAogICogTk1JIHN0YXR1cy4gVGhlIHBvc3NpYmxlIE5NSSBzb3VyY2VzIGFyZSBmcm9tIHBtdSBhcyBhIHJlc3VsdCBvZiBOTUkKQEAgLTQ4NCw2ICs0ODcsNDYgQEAKIAlyZXR1cm4gbWF4NzMxNTsKIH0KIAorc3RhdGljIHZvaWQgKnRjYTY0MTZfcGxhdGZvcm1fZGF0YSh2b2lkICppbmZvKQoreworCXN0YXRpYyBzdHJ1Y3QgcGNhOTUzeF9wbGF0Zm9ybV9kYXRhIHRjYTY0MTY7CisJc3RydWN0IGkyY19ib2FyZF9pbmZvICppMmNfaW5mbyA9IGluZm87CisJaW50IGdwaW9fYmFzZSwgaW50cjsKKwljaGFyIGJhc2VfcGluX25hbWVbU0ZJX05BTUVfTEVOICsgMV07CisJY2hhciBpbnRyX3Bpbl9uYW1lW1NGSV9OQU1FX0xFTiArIDFdOworCisJc3RyY3B5KGkyY19pbmZvLT50eXBlLCAidGNhNjQxNiIpOworCXN0cmNweShiYXNlX3Bpbl9uYW1lLCAidGNhNjQxNl9iYXNlIik7CisJc3RyY3B5KGludHJfcGluX25hbWUsICJ0Y2E2NDE2X2ludCIpOworCisJZ3Bpb19iYXNlID0gZ2V0X2dwaW9fYnlfbmFtZShiYXNlX3Bpbl9uYW1lKTsKKwlpbnRyID0gZ2V0X2dwaW9fYnlfbmFtZShpbnRyX3Bpbl9uYW1lKTsKKworCWlmIChncGlvX2Jhc2UgPT0gLTEpCisJCXJldHVybiBOVUxMOworCXRjYTY0MTYuZ3Bpb19iYXNlID0gZ3Bpb19iYXNlOworCWlmIChpbnRyICE9IC0xKSB7CisJCWkyY19pbmZvLT5pcnEgPSBpbnRyICsgTVJTVF9JUlFfT0ZGU0VUOworCQl0Y2E2NDE2LmlycV9iYXNlID0gZ3Bpb19iYXNlICsgTVJTVF9JUlFfT0ZGU0VUOworCX0gZWxzZSB7CisJCWkyY19pbmZvLT5pcnEgPSAtMTsKKwkJdGNhNjQxNi5pcnFfYmFzZSA9IC0xOworCX0KKwlyZXR1cm4gJnRjYTY0MTY7Cit9CisKK3N0YXRpYyB2b2lkICptcHUzMDUwX3BsYXRmb3JtX2RhdGEodm9pZCAqaW5mbykKK3sKKwlzdHJ1Y3QgaTJjX2JvYXJkX2luZm8gKmkyY19pbmZvID0gaW5mbzsKKwlpbnQgaW50ciA9IGdldF9ncGlvX2J5X25hbWUoIm1wdTMwNTBfaW50Iik7CisKKwlpZiAoaW50ciA9PSAtMSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpMmNfaW5mby0+aXJxID0gaW50ciArIE1SU1RfSVJRX09GRlNFVDsKKwlyZXR1cm4gTlVMTDsKK30KKwogc3RhdGljIHZvaWQgX19pbml0ICplbWMxNDAzX3BsYXRmb3JtX2RhdGEodm9pZCAqaW5mbykKIHsKIAlzdGF0aWMgc2hvcnQgaW50cjJuZF9wZGF0YTsKQEAgLTY0NiwxMiArNjg5LDE1IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGRldnNfaWQgX19pbml0Y29uc3QgZGV2aWNlX2lkc1tdID0gewogCXsiYm1hMDIzIiwgU0ZJX0RFVl9UWVBFX0kyQywgMSwgJm5vX3BsYXRmb3JtX2RhdGF9LAogCXsicG1pY19ncGlvIiwgU0ZJX0RFVl9UWVBFX1NQSSwgMSwgJnBtaWNfZ3Bpb19wbGF0Zm9ybV9kYXRhfSwKKwl7InBtaWNfZ3BpbyIsIFNGSV9ERVZfVFlQRV9JUEMsIDEsICZwbWljX2dwaW9fcGxhdGZvcm1fZGF0YX0sCiAJeyJzcGlfbWF4MzExMSIsIFNGSV9ERVZfVFlQRV9TUEksIDAsICZtYXgzMTExX3BsYXRmb3JtX2RhdGF9LAogCXsiaTJjX21heDczMTUiLCBTRklfREVWX1RZUEVfSTJDLCAxLCAmbWF4NzMxNV9wbGF0Zm9ybV9kYXRhfSwKIAl7ImkyY19tYXg3MzE1XzIiLCBTRklfREVWX1RZUEVfSTJDLCAxLCAmbWF4NzMxNV9wbGF0Zm9ybV9kYXRhfSwKKwl7InRjYTY0MTYiLCBTRklfREVWX1RZUEVfSTJDLCAxLCAmdGNhNjQxNl9wbGF0Zm9ybV9kYXRhfSwKIAl7ImVtYzE0MDMiLCBTRklfREVWX1RZUEVfSTJDLCAxLCAmZW1jMTQwM19wbGF0Zm9ybV9kYXRhfSwKIAl7ImkyY19hY2NlbCIsIFNGSV9ERVZfVFlQRV9JMkMsIDAsICZsaXMzMzFkbF9wbGF0Zm9ybV9kYXRhfSwKIAl7InBtaWNfYXVkaW8iLCBTRklfREVWX1RZUEVfSVBDLCAxLCAmbm9fcGxhdGZvcm1fZGF0YX0sCisJeyJtcHUzMDUwIiwgU0ZJX0RFVl9UWVBFX0kyQywgMSwgJm1wdTMwNTBfcGxhdGZvcm1fZGF0YX0sCiAKIAkvKiBNU0lDIHN1YmRldmljZXMgKi8KIAl7Im1zaWNfYmF0dGVyeSIsIFNGSV9ERVZfVFlQRV9JUEMsIDEsICZtc2ljX2JhdHRlcnlfcGxhdGZvcm1fZGF0YX0sCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni90b29scy9NYWtlZmlsZSBiL2FyY2gveDg2L3Rvb2xzL01ha2VmaWxlCmluZGV4IGY4MjA4MjYuLmQ1MTFhYTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Rvb2xzL01ha2VmaWxlCisrKyBiL2FyY2gveDg2L3Rvb2xzL01ha2VmaWxlCkBAIC0xOCwxNCArMTgsMjEgQEAKIHF1aWV0X2NtZF9wb3N0dGVzdCA9IFRFU1QgICAgJEAKICAgICAgIGNtZF9wb3N0dGVzdCA9ICgkKE9CSkRVTVApIC12IHwgJChBV0spIC1mICQoY2hrb2JqZHVtcCkpIHx8ICQoT0JKRFVNUCkgLWQgLWogLnRleHQgJChvYmp0cmVlKS92bWxpbnV4IHwgJChBV0spIC1mICQoZGlzdGlsbF9hd2spIHwgJChvYmopL3Rlc3RfZ2V0X2xlbiAkKHBvc3R0ZXN0XzY0Yml0KSAkKHBvc3R0ZXN0X3ZlcmJvc2UpCiAKLXBvc3R0ZXN0OiAkKG9iaikvdGVzdF9nZXRfbGVuIHZtbGludXgKLQkkKGNhbGwgY21kLHBvc3R0ZXN0KQorcXVpZXRfY21kX3Nhbml0eXRlc3QgPSBURVNUICAgICRACisgICAgICBjbWRfc2FuaXR5dGVzdCA9ICQob2JqKS9pbnNuX3Nhbml0eSAkKHBvc3R0ZXN0XzY0Yml0KSAtbSAxMDAwMDAwCiAKLWhvc3Rwcm9ncy15CTo9IHRlc3RfZ2V0X2xlbgorcG9zdHRlc3Q6ICQob2JqKS90ZXN0X2dldF9sZW4gdm1saW51eCAkKG9iaikvaW5zbl9zYW5pdHkKKwkkKGNhbGwgY21kLHBvc3R0ZXN0KQorCSQoY2FsbCBjbWQsc2FuaXR5dGVzdCkKKworaG9zdHByb2dzLXkJKz0gdGVzdF9nZXRfbGVuIGluc25fc2FuaXR5CiAKICMgLUkgbmVlZGVkIGZvciBnZW5lcmF0ZWQgQyBzb3VyY2UgYW5kIEMgc291cmNlIHdoaWNoIGluIHRoZSBrZXJuZWwgdHJlZS4KIEhPU1RDRkxBR1NfdGVzdF9nZXRfbGVuLm8gOj0gLVdhbGwgLUkkKG9ianRyZWUpL2FyY2gveDg2L2xpYi8gLUkkKHNyY3RyZWUpL2FyY2gveDg2L2luY2x1ZGUvIC1JJChzcmN0cmVlKS9hcmNoL3g4Ni9saWIvIC1JJChzcmN0cmVlKS9pbmNsdWRlLwogCitIT1NUQ0ZMQUdTX2luc25fc2FuaXR5Lm8gOj0gLVdhbGwgLUkkKG9ianRyZWUpL2FyY2gveDg2L2xpYi8gLUkkKHNyY3RyZWUpL2FyY2gveDg2L2luY2x1ZGUvIC1JJChzcmN0cmVlKS9hcmNoL3g4Ni9saWIvIC1JJChzcmN0cmVlKS9pbmNsdWRlLworCiAjIERlcGVuZGVuY2llcyBhcmUgYWxzbyBuZWVkZWQuCiAkKG9iaikvdGVzdF9nZXRfbGVuLm86ICQoc3JjdHJlZSkvYXJjaC94ODYvbGliL2luc24uYyAkKHNyY3RyZWUpL2FyY2gveDg2L2xpYi9pbmF0LmMgJChzcmN0cmVlKS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbmF0X3R5cGVzLmggJChzcmN0cmVlKS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbmF0LmggJChzcmN0cmVlKS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnNuLmggJChvYmp0cmVlKS9hcmNoL3g4Ni9saWIvaW5hdC10YWJsZXMuYwogCiskKG9iaikvaW5zbl9zYW5pdHkubzogJChzcmN0cmVlKS9hcmNoL3g4Ni9saWIvaW5zbi5jICQoc3JjdHJlZSkvYXJjaC94ODYvbGliL2luYXQuYyAkKHNyY3RyZWUpL2FyY2gveDg2L2luY2x1ZGUvYXNtL2luYXRfdHlwZXMuaCAkKHNyY3RyZWUpL2FyY2gveDg2L2luY2x1ZGUvYXNtL2luYXQuaCAkKHNyY3RyZWUpL2FyY2gveDg2L2luY2x1ZGUvYXNtL2luc24uaCAkKG9ianRyZWUpL2FyY2gveDg2L2xpYi9pbmF0LXRhYmxlcy5jCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni90b29scy9nZW4taW5zbi1hdHRyLXg4Ni5hd2sgYi9hcmNoL3g4Ni90b29scy9nZW4taW5zbi1hdHRyLXg4Ni5hd2sKaW5kZXggZWFmMTFmNS4uNWY2YTViNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvdG9vbHMvZ2VuLWluc24tYXR0ci14ODYuYXdrCisrKyBiL2FyY2gveDg2L3Rvb2xzL2dlbi1pbnNuLWF0dHIteDg2LmF3awpAQCAtNDcsNyArNDcsNyBAQAogCXNlcF9leHByID0gIl5cXHwkIgogCWdyb3VwX2V4cHIgPSAiXkdycFswLTlBLVphLXpdKyIKIAotCWltbV9leHByID0gIl5bSUpBT11bYS16XSIKKwlpbW1fZXhwciA9ICJeW0lKQU9MXVthLXpdIgogCWltbV9mbGFnWyJJYiJdID0gIklOQVRfTUFLRV9JTU0oSU5BVF9JTU1fQllURSkiCiAJaW1tX2ZsYWdbIkpiIl0gPSAiSU5BVF9NQUtFX0lNTShJTkFUX0lNTV9CWVRFKSIKIAlpbW1fZmxhZ1siSXciXSA9ICJJTkFUX01BS0VfSU1NKElOQVRfSU1NX1dPUkQpIgpAQCAtNTksNiArNTksNyBAQAogCWltbV9mbGFnWyJJdiJdID0gIklOQVRfTUFLRV9JTU0oSU5BVF9JTU1fVldPUkQpIgogCWltbV9mbGFnWyJPYiJdID0gIklOQVRfTU9GRlNFVCIKIAlpbW1fZmxhZ1siT3YiXSA9ICJJTkFUX01PRkZTRVQiCisJaW1tX2ZsYWdbIkx4Il0gPSAiSU5BVF9NQUtFX0lNTShJTkFUX0lNTV9CWVRFKSIKIAogCW1vZHJtX2V4cHIgPSAiXihbQ0RFR01OUFFSU1VWVy9dW2Etel0rfE5UQXxUWzAxMl0pIgogCWZvcmNlNjRfZXhwciA9ICJcXChbZGZdNjRcXCkiCkBAIC03MCw4ICs3MSwxMiBAQAogCWxwcmVmaXgzX2V4cHIgPSAiXFwoRjJcXCkiCiAJbWF4X2xwcmVmaXggPSA0CiAKLQl2ZXhva19leHByID0gIlxcKFZFWFxcKSIKLQl2ZXhvbmx5X2V4cHIgPSAiXFwob1ZFWFxcKSIKKwkjIEFsbCBvcGNvZGVzIHN0YXJ0aW5nIHdpdGggbG93ZXItY2FzZSAndicgb3Igd2l0aCAodjEpIHN1cGVyc2NyaXB0CisJIyBhY2NlcHRzIFZFWCBwcmVmaXgKKwl2ZXhva19vcGNvZGVfZXhwciA9ICJedi4qIgorCXZleG9rX2V4cHIgPSAiXFwodjFcXCkiCisJIyBBbGwgb3Bjb2RlcyB3aXRoICh2KSBzdXBlcnNjcmlwdCBzdXBwb3J0cyAqb25seSogVkVYIHByZWZpeAorCXZleG9ubHlfZXhwciA9ICJcXCh2XFwpIgogCiAJcHJlZml4X2V4cHIgPSAiXFwoUHJlZml4XFwpIgogCXByZWZpeF9udW1bIk9wZXJhbmQtU2l6ZSJdID0gIklOQVRfUEZYX09QTkRTWiIKQEAgLTg1LDggKzkwLDggQEAKIAlwcmVmaXhfbnVtWyJTRUc9R1MiXSA9ICJJTkFUX1BGWF9HUyIKIAlwcmVmaXhfbnVtWyJTRUc9U1MiXSA9ICJJTkFUX1BGWF9TUyIKIAlwcmVmaXhfbnVtWyJBZGRyZXNzLVNpemUiXSA9ICJJTkFUX1BGWF9BRERSU1oiCi0JcHJlZml4X251bVsiMmJ5dGVzLVZFWCJdID0gIklOQVRfUEZYX1ZFWDIiCi0JcHJlZml4X251bVsiM2J5dGVzLVZFWCJdID0gIklOQVRfUEZYX1ZFWDMiCisJcHJlZml4X251bVsiVkVYKzFieXRlIl0gPSAiSU5BVF9QRlhfVkVYMiIKKwlwcmVmaXhfbnVtWyJWRVgrMmJ5dGUiXSA9ICJJTkFUX1BGWF9WRVgzIgogCiAJY2xlYXJfdmFycygpCiB9CkBAIC0zMTAsMTIgKzMxNSwxMCBAQAogCQlpZiAobWF0Y2gob3Bjb2RlLCBmcHVfZXhwcikpCiAJCQlmbGFncyA9IGFkZF9mbGFncyhmbGFncywgIklOQVRfTU9EUk0iKQogCi0JCSMgY2hlY2sgVkVYIG9ubHkgY29kZQorCQkjIGNoZWNrIFZFWCBjb2RlcwogCQlpZiAobWF0Y2goZXh0LCB2ZXhvbmx5X2V4cHIpKQogCQkJZmxhZ3MgPSBhZGRfZmxhZ3MoZmxhZ3MsICJJTkFUX1ZFWE9LIHwgSU5BVF9WRVhPTkxZIikKLQotCQkjIGNoZWNrIFZFWCBvbmx5IGNvZGUKLQkJaWYgKG1hdGNoKGV4dCwgdmV4b2tfZXhwcikpCisJCWVsc2UgaWYgKG1hdGNoKGV4dCwgdmV4b2tfZXhwcikgfHwgbWF0Y2gob3Bjb2RlLCB2ZXhva19vcGNvZGVfZXhwcikpCiAJCQlmbGFncyA9IGFkZF9mbGFncyhmbGFncywgIklOQVRfVkVYT0siKQogCiAJCSMgY2hlY2sgcHJlZml4ZXMKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Rvb2xzL2luc25fc2FuaXR5LmMgYi9hcmNoL3g4Ni90b29scy9pbnNuX3Nhbml0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMmY4YzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni90b29scy9pbnNuX3Nhbml0eS5jCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogeDg2IGRlY29kZXIgc2FuaXR5IHRlc3QgLSBiYXNlZCBvbiB0ZXN0X2dldF9pbnNuLmMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA5CisgKiBDb3B5cmlnaHQgKEMpIEhpdGFjaGksIEx0ZC4sIDIwMTEKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNkZWZpbmUgdW5saWtlbHkoY29uZCkgKGNvbmQpCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkJKHNpemVvZihhKS9zaXplb2YoYVswXSkpCisKKyNpbmNsdWRlIDxhc20vaW5zbi5oPgorI2luY2x1ZGUgPGluYXQuYz4KKyNpbmNsdWRlIDxpbnNuLmM+CisKKy8qCisgKiBUZXN0IG9mIGluc3RydWN0aW9uIGFuYWx5c2lzIGFnYWluc3QgdGFtcGVyaW5nLgorICogRmVlZCByYW5kb20gYmluYXJ5IHRvIGluc3RydWN0aW9uIGRlY29kZXIgYW5kIGVuc3VyZSBub3QgdG8KKyAqIGFjY2VzcyBvdXQtb2YtaW5zdHJ1Y3Rpb24tYnVmZmVyLgorICovCisKKyNkZWZpbmUgREVGQVVMVF9NQVhfSVRFUgkxMDAwMAorI2RlZmluZSBJTlNOX05PUCAweDkwCisKK3N0YXRpYyBjb25zdCBjaGFyCSpwcm9nOwkJLyogUHJvZ3JhbSBuYW1lICovCitzdGF0aWMgaW50CQl2ZXJib3NlOwkvKiBWZXJib3NpdHkgKi8KK3N0YXRpYyBpbnQJCXg4Nl82NDsJCS8qIHg4Ni02NCBiaXQgbW9kZSBmbGFnICovCitzdGF0aWMgdW5zaWduZWQgaW50CXNlZWQ7CQkvKiBSYW5kb20gc2VlZCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcJaXRlcl9zdGFydDsJLyogU3RhcnQgb2YgaXRlcmF0aW9uIG51bWJlciAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcJaXRlcl9lbmQgPSBERUZBVUxUX01BWF9JVEVSOwkvKiBFbmQgb2YgaXRlcmF0aW9uIG51bWJlciAqLworc3RhdGljIEZJTEUJCSppbnB1dF9maWxlOwkvKiBJbnB1dCBmaWxlIG5hbWUgKi8KKworc3RhdGljIHZvaWQgdXNhZ2UoY29uc3QgY2hhciAqZXJyKQoreworCWlmIChlcnIpCisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6ICVzXG5cbiIsIGVycik7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogJXMgWy15fC1ufC12XSBbLXMgc2VlZFssbm9dXSBbLW0gbWF4XSBbLWkgaW5wdXRdXG4iLCBwcm9nKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlx0LXkJNjRiaXQgbW9kZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1uCTMyYml0IG1vZGVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtdglWZXJib3NpdHkoLXZ2IGR1bXBzIGFueSBkZWNvZGVkIHJlc3VsdClcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtcwlHaXZlIGEgcmFuZG9tIHNlZWQgKGFuZCBpdGVyYXRpb24gbnVtYmVyKVxuIik7CisJZnByaW50ZihzdGRlcnIsICJcdC1tCUdpdmUgYSBtYXhpbXVtIGl0ZXJhdGlvbiBudW1iZXJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiXHQtaQlHaXZlIGFuIGlucHV0IGZpbGUgd2l0aCBkZWNvZGVkIGJpbmFyeVxuIik7CisJZXhpdCgxKTsKK30KKworc3RhdGljIHZvaWQgZHVtcF9maWVsZChGSUxFICpmcCwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqaW5kZW50LAorCQkgICAgICAgc3RydWN0IGluc25fZmllbGQgKmZpZWxkKQoreworCWZwcmludGYoZnAsICIlcy4lcyA9IHtcbiIsIGluZGVudCwgbmFtZSk7CisJZnByaW50ZihmcCwgIiVzXHQudmFsdWUgPSAlZCwgYnl0ZXNbXSA9IHsleCwgJXgsICV4LCAleH0sXG4iLAorCQlpbmRlbnQsIGZpZWxkLT52YWx1ZSwgZmllbGQtPmJ5dGVzWzBdLCBmaWVsZC0+Ynl0ZXNbMV0sCisJCWZpZWxkLT5ieXRlc1syXSwgZmllbGQtPmJ5dGVzWzNdKTsKKwlmcHJpbnRmKGZwLCAiJXNcdC5nb3QgPSAlZCwgLm5ieXRlcyA9ICVkfSxcbiIsIGluZGVudCwKKwkJZmllbGQtPmdvdCwgZmllbGQtPm5ieXRlcyk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfaW5zbihGSUxFICpmcCwgc3RydWN0IGluc24gKmluc24pCit7CisJZnByaW50ZihmcCwgIkluc3RydWN0aW9uID0ge1xuIik7CisJZHVtcF9maWVsZChmcCwgInByZWZpeGVzIiwgIlx0IiwJJmluc24tPnByZWZpeGVzKTsKKwlkdW1wX2ZpZWxkKGZwLCAicmV4X3ByZWZpeCIsICJcdCIsCSZpbnNuLT5yZXhfcHJlZml4KTsKKwlkdW1wX2ZpZWxkKGZwLCAidmV4X3ByZWZpeCIsICJcdCIsCSZpbnNuLT52ZXhfcHJlZml4KTsKKwlkdW1wX2ZpZWxkKGZwLCAib3Bjb2RlIiwgIlx0IiwJCSZpbnNuLT5vcGNvZGUpOworCWR1bXBfZmllbGQoZnAsICJtb2RybSIsICJcdCIsCQkmaW5zbi0+bW9kcm0pOworCWR1bXBfZmllbGQoZnAsICJzaWIiLCAiXHQiLAkJJmluc24tPnNpYik7CisJZHVtcF9maWVsZChmcCwgImRpc3BsYWNlbWVudCIsICJcdCIsCSZpbnNuLT5kaXNwbGFjZW1lbnQpOworCWR1bXBfZmllbGQoZnAsICJpbW1lZGlhdGUxIiwgIlx0IiwJJmluc24tPmltbWVkaWF0ZTEpOworCWR1bXBfZmllbGQoZnAsICJpbW1lZGlhdGUyIiwgIlx0IiwJJmluc24tPmltbWVkaWF0ZTIpOworCWZwcmludGYoZnAsICJcdC5hdHRyID0gJXgsIC5vcG5kX2J5dGVzID0gJWQsIC5hZGRyX2J5dGVzID0gJWQsXG4iLAorCQlpbnNuLT5hdHRyLCBpbnNuLT5vcG5kX2J5dGVzLCBpbnNuLT5hZGRyX2J5dGVzKTsKKwlmcHJpbnRmKGZwLCAiXHQubGVuZ3RoID0gJWQsIC54ODZfNjQgPSAlZCwgLmthZGRyID0gJXB9XG4iLAorCQlpbnNuLT5sZW5ndGgsIGluc24tPng4Nl82NCwgaW5zbi0+a2FkZHIpOworfQorCitzdGF0aWMgdm9pZCBkdW1wX3N0cmVhbShGSUxFICpmcCwgY29uc3QgY2hhciAqbXNnLCB1bnNpZ25lZCBsb25nIG5yX2l0ZXIsCisJCQl1bnNpZ25lZCBjaGFyICppbnNuX2J1Ziwgc3RydWN0IGluc24gKmluc24pCit7CisJaW50IGk7CisKKwlmcHJpbnRmKGZwLCAiJXM6XG4iLCBtc2cpOworCisJZHVtcF9pbnNuKGZwLCBpbnNuKTsKKworCWZwcmludGYoZnAsICJZb3UgY2FuIHJlcHJvZHVjZSB0aGlzIHdpdGggYmVsb3cgY29tbWFuZChzKTtcbiIpOworCisJLyogSW5wdXQgYSBkZWNvZGVkIGluc3RydWN0aW9uIHNlcXVlbmNlIGRpcmVjdGx5ICovCisJZnByaW50ZihmcCwgIiAkIGVjaG8gIik7CisJZm9yIChpID0gMDsgaSA8IE1BWF9JTlNOX1NJWkU7IGkrKykKKwkJZnByaW50ZihmcCwgIiAlMDJ4IiwgaW5zbl9idWZbaV0pOworCWZwcmludGYoZnAsICIgfCAlcyAtaSAtXG4iLCBwcm9nKTsKKworCWlmICghaW5wdXRfZmlsZSkgeworCQlmcHJpbnRmKGZwLCAiT3IgXG4iKTsKKwkJLyogR2l2ZSBhIHNlZWQgYW5kIGl0ZXJhdGlvbiBudW1iZXIgKi8KKwkJZnByaW50ZihmcCwgIiAkICVzIC1zIDB4JXgsJWx1XG4iLCBwcm9nLCBzZWVkLCBucl9pdGVyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcmFuZG9tX3NlZWQodm9pZCkKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlnb3RvIGZhaWw7CisKKwlpZiAocmVhZChmZCwgJnNlZWQsIHNpemVvZihzZWVkKSkgIT0gc2l6ZW9mKHNlZWQpKQorCQlnb3RvIGZhaWw7CisKKwljbG9zZShmZCk7CisJcmV0dXJuOworZmFpbDoKKwl1c2FnZSgiRmFpbGVkIHRvIG9wZW4gL2Rldi91cmFuZG9tIik7Cit9CisKKy8qIFJlYWQgZ2l2ZW4gaW5zdHJ1Y3Rpb24gc2VxdWVuY2UgZnJvbSB0aGUgaW5wdXQgZmlsZSAqLworc3RhdGljIGludCByZWFkX25leHRfaW5zbih1bnNpZ25lZCBjaGFyICppbnNuX2J1ZikKK3sKKwljaGFyIGJ1ZlsyNTZdICA9ICIiLCAqdG1wOworCWludCBpOworCisJdG1wID0gZmdldHMoYnVmLCBBUlJBWV9TSVpFKGJ1ZiksIGlucHV0X2ZpbGUpOworCWlmICh0bXAgPT0gTlVMTCB8fCBmZW9mKGlucHV0X2ZpbGUpKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSU5TTl9TSVpFOyBpKyspIHsKKwkJaW5zbl9idWZbaV0gPSAodW5zaWduZWQgY2hhcilzdHJ0b3VsKHRtcCwgJnRtcCwgMTYpOworCQlpZiAoKnRtcCAhPSAnICcpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9pbnNuKHVuc2lnbmVkIGNoYXIgKmluc25fYnVmKQoreworCWludCBpOworCisJaWYgKGlucHV0X2ZpbGUpCisJCXJldHVybiByZWFkX25leHRfaW5zbihpbnNuX2J1Zik7CisKKwkvKiBGaWxscyBidWZmZXIgd2l0aCByYW5kb20gYmluYXJ5IHVwIHRvIE1BWF9JTlNOX1NJWkUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0lOU05fU0laRSAtIDE7IGkgKz0gMikKKwkJKih1bnNpZ25lZCBzaG9ydCAqKSgmaW5zbl9idWZbaV0pID0gcmFuZG9tKCkgJiAweGZmZmY7CisKKwl3aGlsZSAoaSA8IE1BWF9JTlNOX1NJWkUpCisJCWluc25fYnVmW2krK10gPSByYW5kb20oKSAmIDB4ZmY7CisKKwlyZXR1cm4gaTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGM7CisJY2hhciAqdG1wID0gTlVMTDsKKwlpbnQgc2V0X3NlZWQgPSAwOworCisJcHJvZyA9IGFyZ3ZbMF07CisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICJ5bnZzOm06aToiKSkgIT0gLTEpIHsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ3knOgorCQkJeDg2XzY0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXg4Nl82NCA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQl2ZXJib3NlKys7CisJCQlicmVhazsKKwkJY2FzZSAnaSc6CisJCQlpZiAoc3RyY21wKCItIiwgb3B0YXJnKSA9PSAwKQorCQkJCWlucHV0X2ZpbGUgPSBzdGRpbjsKKwkJCWVsc2UKKwkJCQlpbnB1dF9maWxlID0gZm9wZW4ob3B0YXJnLCAiciIpOworCQkJaWYgKCFpbnB1dF9maWxlKQorCQkJCXVzYWdlKCJGYWlsZWQgdG8gb3BlbiBpbnB1dCBmaWxlIik7CisJCQlicmVhazsKKwkJY2FzZSAncyc6CisJCQlzZWVkID0gKHVuc2lnbmVkIGludClzdHJ0b3VsKG9wdGFyZywgJnRtcCwgMCk7CisJCQlpZiAoKnRtcCA9PSAnLCcpIHsKKwkJCQlvcHRhcmcgPSB0bXAgKyAxOworCQkJCWl0ZXJfc3RhcnQgPSBzdHJ0b3VsKG9wdGFyZywgJnRtcCwgMCk7CisJCQl9CisJCQlpZiAoKnRtcCAhPSAnXDAnIHx8IHRtcCA9PSBvcHRhcmcpCisJCQkJdXNhZ2UoIkZhaWxlZCB0byBwYXJzZSBzZWVkIik7CisJCQlzZXRfc2VlZCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlpdGVyX2VuZCA9IHN0cnRvdWwob3B0YXJnLCAmdG1wLCAwKTsKKwkJCWlmICgqdG1wICE9ICdcMCcgfHwgdG1wID09IG9wdGFyZykKKwkJCQl1c2FnZSgiRmFpbGVkIHRvIHBhcnNlIG1heF9pdGVyIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXVzYWdlKE5VTEwpOworCQl9CisJfQorCisJLyogQ2hlY2sgZXJyb3JzICovCisJaWYgKGl0ZXJfZW5kIDwgaXRlcl9zdGFydCkKKwkJdXNhZ2UoIk1heCBpdGVyYXRpb24gbnVtYmVyIG11c3QgYmUgYmlnZ2VyIHRoYW4gaXRlci1udW0iKTsKKworCWlmIChzZXRfc2VlZCAmJiBpbnB1dF9maWxlKQorCQl1c2FnZSgiRG9uJ3QgdXNlIGlucHV0IGZpbGUgKC1pKSB3aXRoIHJhbmRvbSBzZWVkICgtcykiKTsKKworCS8qIEluaXRpYWxpemUgcmFuZG9tIHNlZWQgKi8KKwlpZiAoIWlucHV0X2ZpbGUpIHsKKwkJaWYgKCFzZXRfc2VlZCkJLyogTm8gc2VlZCBpcyBnaXZlbiAqLworCQkJaW5pdF9yYW5kb21fc2VlZCgpOworCQlzcmFuZChzZWVkKTsKKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaW5zbiBpbnNuOworCWludCBpbnNucyA9IDA7CisJaW50IGVycm9ycyA9IDA7CisJdW5zaWduZWQgbG9uZyBpOworCXVuc2lnbmVkIGNoYXIgaW5zbl9idWZbTUFYX0lOU05fU0laRSAqIDJdOworCisJcGFyc2VfYXJncyhhcmdjLCBhcmd2KTsKKworCS8qIFByZXBhcmUgc3RvcCBieXRlcyB3aXRoIE5PUHMgKi8KKwltZW1zZXQoaW5zbl9idWYgKyBNQVhfSU5TTl9TSVpFLCBJTlNOX05PUCwgTUFYX0lOU05fU0laRSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaXRlcl9lbmQ7IGkrKykgeworCQlpZiAoZ2VuZXJhdGVfaW5zbihpbnNuX2J1ZikgPD0gMCkKKwkJCWJyZWFrOworCisJCWlmIChpIDwgaXRlcl9zdGFydCkJLyogU2tpcCB0byBnaXZlbiBpdGVyYXRpb24gbnVtYmVyICovCisJCQljb250aW51ZTsKKworCQkvKiBEZWNvZGUgYW4gaW5zdHJ1Y3Rpb24gKi8KKwkJaW5zbl9pbml0KCZpbnNuLCBpbnNuX2J1ZiwgeDg2XzY0KTsKKwkJaW5zbl9nZXRfbGVuZ3RoKCZpbnNuKTsKKworCQlpZiAoaW5zbi5uZXh0X2J5dGUgPD0gaW5zbi5rYWRkciB8fAorCQkgICAgaW5zbi5rYWRkciArIE1BWF9JTlNOX1NJWkUgPCBpbnNuLm5leHRfYnl0ZSkgeworCQkJLyogQWNjZXNzIG91dC1vZi1yYW5nZSBtZW1vcnkgKi8KKwkJCWR1bXBfc3RyZWFtKHN0ZGVyciwgIkVycm9yOiBGb3VuZCBhbiBhY2Nlc3MgdmlvbGF0aW9uIiwgaSwgaW5zbl9idWYsICZpbnNuKTsKKwkJCWVycm9ycysrOworCQl9IGVsc2UgaWYgKHZlcmJvc2UgJiYgIWluc25fY29tcGxldGUoJmluc24pKQorCQkJZHVtcF9zdHJlYW0oc3Rkb3V0LCAiSW5mbzogRm91bmQgYW4gdW5kZWNvZGFibGUgaW5wdXQiLCBpLCBpbnNuX2J1ZiwgJmluc24pOworCQllbHNlIGlmICh2ZXJib3NlID49IDIpCisJCQlkdW1wX2luc24oc3Rkb3V0LCAmaW5zbik7CisJCWluc25zKys7CisJfQorCisJZnByaW50ZihzdGRvdXQsICIlczogZGVjb2RlZCBhbmQgY2hlY2tlZCAlZCAlcyBpbnN0cnVjdGlvbnMgd2l0aCAlZCBlcnJvcnMgKHNlZWQ6MHgleClcbiIsIChlcnJvcnMpID8gIkZhaWx1cmUiIDogIlN1Y2Nlc3MiLCBpbnNucywgKGlucHV0X2ZpbGUpID8gImdpdmVuIiA6ICJyYW5kb20iLCBlcnJvcnMsIHNlZWQpOworCisJcmV0dXJuIGVycm9ycyA/IDEgOiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCmluZGV4IDFmOTI4NjUuLjEyZWIwN2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKQEAgLTEyMTUsOCArMTIxNSw2IEBACiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKIAllYXJseV9ib290X2lycXNfZGlzYWJsZWQgPSB0cnVlOwogCi0JbWVtYmxvY2tfaW5pdCgpOwotCiAJeGVuX3Jhd19jb25zb2xlX3dyaXRlKCJtYXBwaW5nIGtlcm5lbCBpbnRvIHBoeXNpY2FsIG1lbW9yeVxuIik7CiAJcGdkID0geGVuX3NldHVwX2tlcm5lbF9wYWdldGFibGUocGdkLCB4ZW5fc3RhcnRfaW5mby0+bnJfcGFnZXMpOwogCXhlbl9pZGVudF9tYXBfSVNBKCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vbW11LmMgYi9hcmNoL3g4Ni94ZW4vbW11LmMKaW5kZXggODdmNjY3My4uZjRiZjhhYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL21tdS5jCisrKyBiL2FyY2gveDg2L3hlbi9tbXUuYwpAQCAtMTc3NCwxMCArMTc3NCw4IEBACiAJX194ZW5fd3JpdGVfY3IzKHRydWUsIF9fcGEocGdkKSk7CiAJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfQ1BVKTsKIAotCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKF9fcGEoeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UpLAotCQkgICAgICBfX3BhKHhlbl9zdGFydF9pbmZvLT5wdF9iYXNlICsKLQkJCSAgIHhlbl9zdGFydF9pbmZvLT5ucl9wdF9mcmFtZXMgKiBQQUdFX1NJWkUpLAotCQkgICAgICAiWEVOIFBBR0VUQUJMRVMiKTsKKwltZW1ibG9ja19yZXNlcnZlKF9fcGEoeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UpLAorCQkJIHhlbl9zdGFydF9pbmZvLT5ucl9wdF9mcmFtZXMgKiBQQUdFX1NJWkUpOwogCiAJcmV0dXJuIHBnZDsKIH0KQEAgLTE4NTMsMTAgKzE4NTEsOCBAQAogCQkJICBQRk5fRE9XTihfX3BhKGluaXRpYWxfcGFnZV90YWJsZSkpKTsKIAl4ZW5fd3JpdGVfY3IzKF9fcGEoaW5pdGlhbF9wYWdlX3RhYmxlKSk7CiAKLQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShfX3BhKHhlbl9zdGFydF9pbmZvLT5wdF9iYXNlKSwKLQkJICAgICAgX19wYSh4ZW5fc3RhcnRfaW5mby0+cHRfYmFzZSArCi0JCQkgICB4ZW5fc3RhcnRfaW5mby0+bnJfcHRfZnJhbWVzICogUEFHRV9TSVpFKSwKLQkJICAgICAgIlhFTiBQQUdFVEFCTEVTIik7CisJbWVtYmxvY2tfcmVzZXJ2ZShfX3BhKHhlbl9zdGFydF9pbmZvLT5wdF9iYXNlKSwKKwkJCSB4ZW5fc3RhcnRfaW5mby0+bnJfcHRfZnJhbWVzICogUEFHRV9TSVpFKSk7CiAKIAlyZXR1cm4gaW5pdGlhbF9wYWdlX3RhYmxlOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NldHVwLmMgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwppbmRleCAzOGQwYWY0Li5lMDNjNjM2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc2V0dXAuYwpAQCAtNzUsNyArNzUsNyBAQAogCWlmIChpID09IFhFTl9FWFRSQV9NRU1fTUFYX1JFR0lPTlMpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmc6IG5vdCBlbm91Z2ggZXh0cmEgbWVtb3J5IHJlZ2lvbnNcbiIpOwogCi0JbWVtYmxvY2tfeDg2X3Jlc2VydmVfcmFuZ2Uoc3RhcnQsIHN0YXJ0ICsgc2l6ZSwgIlhFTiBFWFRSQSIpOworCW1lbWJsb2NrX3Jlc2VydmUoc3RhcnQsIHNpemUpOwogCiAJeGVuX21heF9wMm1fcGZuID0gUEZOX0RPV04oc3RhcnQgKyBzaXplKTsKIApAQCAtMTczLDkgKzE3MywyMSBAQAogCWRvbWlkX3QgZG9taWQgPSBET01JRF9TRUxGOwogCWludCByZXQ7CiAKLQlyZXQgPSBIWVBFUlZJU09SX21lbW9yeV9vcChYRU5NRU1fbWF4aW11bV9yZXNlcnZhdGlvbiwgJmRvbWlkKTsKLQlpZiAocmV0ID4gMCkKLQkJbWF4X3BhZ2VzID0gcmV0OworCS8qCisJICogRm9yIHRoZSBpbml0aWFsIGRvbWFpbiB3ZSB1c2UgdGhlIG1heGltdW0gcmVzZXJ2YXRpb24gYXMKKwkgKiB0aGUgbWF4aW11bSBwYWdlLgorCSAqCisJICogRm9yIGd1ZXN0IGRvbWFpbnMgdGhlIGN1cnJlbnQgbWF4aW11bSByZXNlcnZhdGlvbiByZWZsZWN0cworCSAqIHRoZSBjdXJyZW50IG1heGltdW0gcmF0aGVyIHRoYW4gdGhlIHN0YXRpYyBtYXhpbXVtLiBJbiB0aGlzCisJICogY2FzZSB0aGUgZTgyMCBtYXAgcHJvdmlkZWQgdG8gdXMgd2lsbCBjb3ZlciB0aGUgc3RhdGljCisJICogbWF4aW11bSByZWdpb24uCisJICovCisJaWYgKHhlbl9pbml0aWFsX2RvbWFpbigpKSB7CisJCXJldCA9IEhZUEVSVklTT1JfbWVtb3J5X29wKFhFTk1FTV9tYXhpbXVtX3Jlc2VydmF0aW9uLCAmZG9taWQpOworCQlpZiAocmV0ID4gMCkKKwkJCW1heF9wYWdlcyA9IHJldDsKKwl9CisKIAlyZXR1cm4gbWluKG1heF9wYWdlcywgTUFYX0RPTUFJTl9QQUdFUyk7CiB9CiAKQEAgLTI5OSw5ICszMTEsOCBAQAogCSAqICAtIHhlbl9zdGFydF9pbmZvCiAJICogU2VlIGNvbW1lbnQgYWJvdmUgInN0cnVjdCBzdGFydF9pbmZvIiBpbiA8eGVuL2ludGVyZmFjZS94ZW4uaD4KIAkgKi8KLQltZW1ibG9ja194ODZfcmVzZXJ2ZV9yYW5nZShfX3BhKHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCksCi0JCSAgICAgIF9fcGEoeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UpLAotCQkJIlhFTiBTVEFSVCBJTkZPIik7CisJbWVtYmxvY2tfcmVzZXJ2ZShfX3BhKHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCksCisJCQkgeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UgLSB4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QpOwogCiAJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLCAmZTgyMC5ucl9tYXApOwogCkBAIC00MTAsNiArNDIxLDYgQEAKICNlbmRpZgogCWRpc2FibGVfY3B1aWRsZSgpOwogCWJvb3Rfb3B0aW9uX2lkbGVfb3ZlcnJpZGUgPSBJRExFX0hBTFQ7Ci0KKwlXQVJOX09OKHNldF9wbV9pZGxlX3RvX2RlZmF1bHQoKSk7CiAJZmlkZGxlX3Zkc28oKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3NvY2tldC5oIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc29ja2V0LmgKaW5kZXggY2JkZjJmZi4uYmIwNjk2OCAxMDA2NDQKLS0tIGEvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc29ja2V0LmgKKysrIGIvYXJjaC94dGVuc2EvaW5jbHVkZS9hc20vc29ja2V0LmgKQEAgLTczLDQgKzczLDcgQEAKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICA0MAogCisjZGVmaW5lIFNPX1dJRklfU1RBVFVTCQk0MQorI2RlZmluZSBTQ01fV0lGSV9TVEFUVVMJCVNPX1dJRklfU1RBVFVTCisKICNlbmRpZgkvKiBfWFRFTlNBX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jIGIvYXJjaC94dGVuc2Eva2VybmVsL3RpbWUuYwppbmRleCBmM2U1ZWI0Li5hYzYyZjljIDEwMDY0NAotLS0gYS9hcmNoL3h0ZW5zYS9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gveHRlbnNhL2tlcm5lbC90aW1lLmMKQEAgLTQxLDE0ICs0MSw2IEBACiAJLnJhdGluZyA9IDIwMCwKIAkucmVhZCA9IGNjb3VudF9yZWFkLAogCS5tYXNrID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCi0JLyoKLQkgKiBXaXRoIGEgc2hpZnQgb2YgMjIgdGhlIGxvd2VyIGxpbWl0IG9mIHRoZSBjcHUgY2xvY2sgaXMKLQkgKiAxTUh6LCB3aGVyZSBOU0VDX1BFUl9DQ09VTlQgaXMgMTAwMCBvciBhIGJpdCBsZXNzIHRoYW4KLQkgKiAyXjEwOiBTaW5jZSB3ZSBoYXZlIDMyIGJpdHMgYW5kIHRoZSBtdWx0aXBsaWNhdG9yIGNhbgotCSAqIGFscmVhZHkgdGFrZSB1cCBhcyBtdWNoIGFzIDEwIGJpdHMsIHRoaXMgbGVhdmVzIHVzIHdpdGgKLQkgKiByZW1haW5pbmcgdXBwZXIgMjIgYml0cy4KLQkgKi8KLQkuc2hpZnQgPSAyMiwKIH07CiAKIHN0YXRpYyBpcnFyZXR1cm5fdCB0aW1lcl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKQEAgLTY2LDEwICs1OCw3IEBACiAJcHJpbnRrKCIlZC4lMDJkIE1IelxuIiwgKGludCljY291bnRfcGVyX2ppZmZ5LygxMDAwMDAwL0haKSwKIAkJCShpbnQpKGNjb3VudF9wZXJfamlmZnkvKDEwMDAwL0haKSklMTAwKTsKICNlbmRpZgotCWNjb3VudF9jbG9ja3NvdXJjZS5tdWx0ID0KLQkJY2xvY2tzb3VyY2VfaHoybXVsdChDQ09VTlRfUEVSX0pJRkZZICogSFosCi0JCQkJY2NvdW50X2Nsb2Nrc291cmNlLnNoaWZ0KTsKLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2NvdW50X2Nsb2Nrc291cmNlKTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2NvdW50X2Nsb2Nrc291cmNlLCBDQ09VTlRfUEVSX0pJRkZZICogSFopOwogCiAJLyogSW5pdGlhbGl6ZSB0aGUgbGludXggdGltZXIgaW50ZXJydXB0LiAqLwogCmRpZmYgLS1naXQgYS9ibG9jay9ibGstY29yZS5jIGIvYmxvY2svYmxrLWNvcmUuYwppbmRleCBlYTcwZTZjLi4xNWRlMjIzIDEwMDY0NAotLS0gYS9ibG9jay9ibGstY29yZS5jCisrKyBiL2Jsb2NrL2Jsay1jb3JlLmMKQEAgLTM2Niw3ICszNjYsMTQgQEAKIAkJaWYgKGRyYWluX2FsbCkKIAkJCWJsa190aHJvdGxfZHJhaW4ocSk7CiAKLQkJX19ibGtfcnVuX3F1ZXVlKHEpOworCQkvKgorCQkgKiBUaGlzIGZ1bmN0aW9uIG1pZ2h0IGJlIGNhbGxlZCBvbiBhIHF1ZXVlIHdoaWNoIGZhaWxlZAorCQkgKiBkcml2ZXIgaW5pdCBhZnRlciBxdWV1ZSBjcmVhdGlvbi4gIFNvbWUgZHJpdmVycworCQkgKiAoZS5nLiBmZCkgZ2V0IHVuaGFwcHkgaW4gc3VjaCBjYXNlcy4gIEtpY2sgcXVldWUgaWZmCisJCSAqIGRpc3BhdGNoIHF1ZXVlIGhhcyBzb21ldGhpbmcgb24gaXQuCisJCSAqLworCQlpZiAoIWxpc3RfZW1wdHkoJnEtPnF1ZXVlX2hlYWQpKQorCQkJX19ibGtfcnVuX3F1ZXVlKHEpOwogCiAJCWlmIChkcmFpbl9hbGwpCiAJCQlucl9ycXMgPSBxLT5ycS5jb3VudFswXSArIHEtPnJxLmNvdW50WzFdOwpAQCAtNDY3LDYgKzQ3NCw3IEBACiAJcS0+YmFja2luZ19kZXZfaW5mby5zdGF0ZSA9IDA7CiAJcS0+YmFja2luZ19kZXZfaW5mby5jYXBhYmlsaXRpZXMgPSBCRElfQ0FQX01BUF9DT1BZOwogCXEtPmJhY2tpbmdfZGV2X2luZm8ubmFtZSA9ICJibG9jayI7CisJcS0+bm9kZSA9IG5vZGVfaWQ7CiAKIAllcnIgPSBiZGlfaW5pdCgmcS0+YmFja2luZ19kZXZfaW5mbyk7CiAJaWYgKGVycikgewpAQCAtNTUxLDcgKzU1OSw3IEBACiAJaWYgKCF1bmluaXRfcSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlxID0gYmxrX2luaXRfYWxsb2NhdGVkX3F1ZXVlX25vZGUodW5pbml0X3EsIHJmbiwgbG9jaywgbm9kZV9pZCk7CisJcSA9IGJsa19pbml0X2FsbG9jYXRlZF9xdWV1ZSh1bmluaXRfcSwgcmZuLCBsb2NrKTsKIAlpZiAoIXEpCiAJCWJsa19jbGVhbnVwX3F1ZXVlKHVuaW5pdF9xKTsKIApAQCAtNTYzLDE4ICs1NzEsOSBAQAogYmxrX2luaXRfYWxsb2NhdGVkX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCByZXF1ZXN0X2ZuX3Byb2MgKnJmbiwKIAkJCSBzcGlubG9ja190ICpsb2NrKQogewotCXJldHVybiBibGtfaW5pdF9hbGxvY2F0ZWRfcXVldWVfbm9kZShxLCByZm4sIGxvY2ssIC0xKTsKLX0KLUVYUE9SVF9TWU1CT0woYmxrX2luaXRfYWxsb2NhdGVkX3F1ZXVlKTsKLQotc3RydWN0IHJlcXVlc3RfcXVldWUgKgotYmxrX2luaXRfYWxsb2NhdGVkX3F1ZXVlX25vZGUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHJlcXVlc3RfZm5fcHJvYyAqcmZuLAotCQkJICAgICAgc3BpbmxvY2tfdCAqbG9jaywgaW50IG5vZGVfaWQpCi17CiAJaWYgKCFxKQogCQlyZXR1cm4gTlVMTDsKIAotCXEtPm5vZGUgPSBub2RlX2lkOwogCWlmIChibGtfaW5pdF9mcmVlX2xpc3QocSkpCiAJCXJldHVybiBOVUxMOwogCkBAIC02MDQsNyArNjAzLDcgQEAKIAogCXJldHVybiBOVUxMOwogfQotRVhQT1JUX1NZTUJPTChibGtfaW5pdF9hbGxvY2F0ZWRfcXVldWVfbm9kZSk7CitFWFBPUlRfU1lNQk9MKGJsa19pbml0X2FsbG9jYXRlZF9xdWV1ZSk7CiAKIGludCBibGtfZ2V0X3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogewpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLW1hcC5jIGIvYmxvY2svYmxrLW1hcC5jCmluZGV4IDE2NGNkMDAuLjYyM2UxY2QgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1tYXAuYworKysgYi9ibG9jay9ibGstbWFwLmMKQEAgLTMxMSw3ICszMTEsNyBAQAogCWlmIChJU19FUlIoYmlvKSkKIAkJcmV0dXJuIFBUUl9FUlIoYmlvKTsKIAotCWlmIChycV9kYXRhX2RpcihycSkgPT0gV1JJVEUpCisJaWYgKCFyZWFkaW5nKQogCQliaW8tPmJpX3J3IHw9IFJFUV9XUklURTsKIAogCWlmIChkb19jb3B5KQpkaWZmIC0tZ2l0IGEvYmxvY2svYmxrLXRhZy5jIGIvYmxvY2svYmxrLXRhZy5jCmluZGV4IGU3NGQ2ZDEuLjRhZjZmNWMgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay10YWcuYworKysgYi9ibG9jay9ibGstdGFnLmMKQEAgLTI4MiwxOCArMjgyLDkgQEAKIHZvaWQgYmxrX3F1ZXVlX2VuZF90YWcoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSkKIHsKIAlzdHJ1Y3QgYmxrX3F1ZXVlX3RhZyAqYnF0ID0gcS0+cXVldWVfdGFnczsKLQlpbnQgdGFnID0gcnEtPnRhZzsKKwl1bnNpZ25lZCB0YWcgPSBycS0+dGFnOyAvKiBuZWdhdGl2ZSB0YWdzIGludmFsaWQgKi8KIAotCUJVR19PTih0YWcgPT0gLTEpOwotCi0JaWYgKHVubGlrZWx5KHRhZyA+PSBicXQtPm1heF9kZXB0aCkpIHsKLQkJLyoKLQkJICogVGhpcyBjYW4gaGFwcGVuIGFmdGVyIHRhZyBkZXB0aCBoYXMgYmVlbiByZWR1Y2VkLgotCQkgKiBCdXQgdGFnIHNob3VsZG4ndCBiZSBsYXJnZXIgdGhhbiByZWFsX21heF9kZXB0aC4KLQkJICovCi0JCVdBUk5fT04odGFnID49IGJxdC0+cmVhbF9tYXhfZGVwdGgpOwotCQlyZXR1cm47Ci0JfQorCUJVR19PTih0YWcgPj0gYnF0LT5yZWFsX21heF9kZXB0aCk7CiAKIAlsaXN0X2RlbF9pbml0KCZycS0+cXVldWVsaXN0KTsKIAlycS0+Y21kX2ZsYWdzICY9IH5SRVFfUVVFVUVEOwpkaWZmIC0tZ2l0IGEvYmxvY2svY2ZxLWlvc2NoZWQuYyBiL2Jsb2NrL2NmcS1pb3NjaGVkLmMKaW5kZXggMTZhY2U4OS4uMzU0ODcwNSAxMDA2NDQKLS0tIGEvYmxvY2svY2ZxLWlvc2NoZWQuYworKysgYi9ibG9jay9jZnEtaW9zY2hlZC5jCkBAIC0xNjU1LDYgKzE2NTUsOCBAQAogCQkgICAgc3RydWN0IHJlcXVlc3QgKm5leHQpCiB7CiAJc3RydWN0IGNmcV9xdWV1ZSAqY2ZxcSA9IFJRX0NGUVEocnEpOworCXN0cnVjdCBjZnFfZGF0YSAqY2ZxZCA9IHEtPmVsZXZhdG9yLT5lbGV2YXRvcl9kYXRhOworCiAJLyoKIAkgKiByZXBvc2l0aW9uIGluIGZpZm8gaWYgbmV4dCBpcyBvbGRlciB0aGFuIHJxCiAJICovCkBAIC0xNjY5LDYgKzE2NzEsMTYgQEAKIAljZnFfcmVtb3ZlX3JlcXVlc3QobmV4dCk7CiAJY2ZxX2Jsa2lvY2dfdXBkYXRlX2lvX21lcmdlZF9zdGF0cygmKFJRX0NGUUcocnEpKS0+YmxrZywKIAkJCQkJcnFfZGF0YV9kaXIobmV4dCksIHJxX2lzX3N5bmMobmV4dCkpOworCisJY2ZxcSA9IFJRX0NGUVEobmV4dCk7CisJLyoKKwkgKiBhbGwgcmVxdWVzdHMgb2YgdGhpcyBxdWV1ZSBhcmUgbWVyZ2VkIHRvIG90aGVyIHF1ZXVlcywgZGVsZXRlIGl0CisJICogZnJvbSB0aGUgc2VydmljZSB0cmVlLiBJZiBpdCdzIHRoZSBhY3RpdmVfcXVldWUsCisJICogY2ZxX2Rpc3BhdGNoX3JlcXVlc3RzKCkgd2lsbCBjaG9vc2UgdG8gZXhwaXJlIGl0IG9yIGRvIGlkbGUKKwkgKi8KKwlpZiAoY2ZxX2NmcXFfb25fcnIoY2ZxcSkgJiYgUkJfRU1QVFlfUk9PVCgmY2ZxcS0+c29ydF9saXN0KSAmJgorCSAgICBjZnFxICE9IGNmcWQtPmFjdGl2ZV9xdWV1ZSkKKwkJY2ZxX2RlbF9jZnFxX3JyKGNmcWQsIGNmcXEpOwogfQogCiBzdGF0aWMgaW50IGNmcV9hbGxvd19tZXJnZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxLApAQCAtMzE4NCw3ICszMTk2LDcgQEAKIAkJfQogCX0KIAotCWlmIChyZXQpCisJaWYgKHJldCAmJiByZXQgIT0gLUVFWElTVCkKIAkJcHJpbnRrKEtFUk5fRVJSICJjZnE6IGNpYyBsaW5rIGZhaWxlZCFcbiIpOwogCiAJcmV0dXJuIHJldDsKQEAgLTMyMDAsNiArMzIxMiw3IEBACiB7CiAJc3RydWN0IGlvX2NvbnRleHQgKmlvYyA9IE5VTEw7CiAJc3RydWN0IGNmcV9pb19jb250ZXh0ICpjaWM7CisJaW50IHJldDsKIAogCW1pZ2h0X3NsZWVwX2lmKGdmcF9tYXNrICYgX19HRlBfV0FJVCk7CiAKQEAgLTMyMDcsNiArMzIyMCw3IEBACiAJaWYgKCFpb2MpCiAJCXJldHVybiBOVUxMOwogCityZXRyeToKIAljaWMgPSBjZnFfY2ljX2xvb2t1cChjZnFkLCBpb2MpOwogCWlmIChjaWMpCiAJCWdvdG8gb3V0OwpAQCAtMzIxNSw3ICszMjI5LDEyIEBACiAJaWYgKGNpYyA9PSBOVUxMKQogCQlnb3RvIGVycjsKIAotCWlmIChjZnFfY2ljX2xpbmsoY2ZxZCwgaW9jLCBjaWMsIGdmcF9tYXNrKSkKKwlyZXQgPSBjZnFfY2ljX2xpbmsoY2ZxZCwgaW9jLCBjaWMsIGdmcF9tYXNrKTsKKwlpZiAocmV0ID09IC1FRVhJU1QpIHsKKwkJLyogc29tZW9uZSBoYXMgbGlua2VkIGNpYyB0byBpb2MgYWxyZWFkeSAqLworCQljZnFfY2ljX2ZyZWUoY2ljKTsKKwkJZ290byByZXRyeTsKKwl9IGVsc2UgaWYgKHJldCkKIAkJZ290byBlcnJfZnJlZTsKIAogb3V0OgpAQCAtNDAzNiw2ICs0MDU1LDExIEBACiAKIAlpZiAoYmxraW9fYWxsb2NfYmxrZ19zdGF0cygmY2ZxZy0+YmxrZykpIHsKIAkJa2ZyZWUoY2ZxZyk7CisKKwkJc3Bpbl9sb2NrKCZjaWNfaW5kZXhfbG9jayk7CisJCWlkYV9yZW1vdmUoJmNpY19pbmRleF9pZGEsIGNmcWQtPmNpY19pbmRleCk7CisJCXNwaW5fdW5sb2NrKCZjaWNfaW5kZXhfbG9jayk7CisKIAkJa2ZyZWUoY2ZxZCk7CiAJCXJldHVybiBOVUxMOwogCX0KZGlmZiAtLWdpdCBhL2Jsb2NrL2lvY3RsLmMgYi9ibG9jay9pb2N0bC5jCmluZGV4IGNhOTM5ZmMuLmQ1MTBjMmEgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2lvY3RsLmMKKysrIGIvYmxvY2svaW9jdGwuYwpAQCAtMTgwLDYgKzE4MCwyNiBAQAogRVhQT1JUX1NZTUJPTF9HUEwoX19ibGtkZXZfZHJpdmVyX2lvY3RsKTsKIAogLyoKKyAqIElzIGl0IGFuIHVucmVjb2duaXplZCBpb2N0bD8gVGhlIGNvcnJlY3QgcmV0dXJucyBhcmUgZWl0aGVyCisgKiBFTk9UVFkgKGZpbmFsKSBvciBFTk9JT0NUTENNRCAoIkkgZG9uJ3Qga25vdyB0aGlzIG9uZSwgdHJ5IGEKKyAqIGZhbGxiYWNrIikuIEVOT0lPQ1RMQ01EIGdldHMgdHVybmVkIGludG8gRU5PVFRZIGJ5IHRoZSBpb2N0bAorICogY29kZSBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIENvbmZ1c2VkIGRyaXZlcnMgc29tZXRpbWVzIHJldHVybiBFSU5WQUwsIHdoaWNoIGlzIHdyb25nLiBJdAorICogbWVhbnMgIkkgdW5kZXJzdG9vZCB0aGUgaW9jdGwgY29tbWFuZCwgYnV0IHRoZSBwYXJhbWV0ZXJzIHRvCisgKiBpdCB3ZXJlIHdyb25nIi4KKyAqCisgKiBXZSBzaG91bGQgYWltIHRvIGp1c3QgZml4IHRoZSBicm9rZW4gZHJpdmVycywgdGhlIEVJTlZBTCBjYXNlCisgKiBzaG91bGQgZ28gYXdheS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfdW5yZWNvZ25pemVkX2lvY3RsKGludCByZXQpCit7CisJcmV0dXJuCXJldCA9PSAtRUlOVkFMIHx8CisJCXJldCA9PSAtRU5PVFRZIHx8CisJCXJldCA9PSAtRU5PSU9DVExDTUQ7Cit9CisKKy8qCiAgKiBhbHdheXMga2VlcCB0aGlzIGluIHN5bmMgd2l0aCBjb21wYXRfYmxrZGV2X2lvY3RsKCkKICAqLwogaW50IGJsa2Rldl9pb2N0bChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsIHVuc2lnbmVkIGNtZCwKQEAgLTE5Niw4ICsyMTYsNyBAQAogCQkJcmV0dXJuIC1FQUNDRVM7CiAKIAkJcmV0ID0gX19ibGtkZXZfZHJpdmVyX2lvY3RsKGJkZXYsIG1vZGUsIGNtZCwgYXJnKTsKLQkJLyogLUVJTlZBTCB0byBoYW5kbGUgb2xkIHVuY29ycmVjdGVkIGRyaXZlcnMgKi8KLQkJaWYgKHJldCAhPSAtRUlOVkFMICYmIHJldCAhPSAtRU5PVFRZKQorCQlpZiAoIWlzX3VucmVjb2duaXplZF9pb2N0bChyZXQpKQogCQkJcmV0dXJuIHJldDsKIAogCQlmc3luY19iZGV2KGJkZXYpOwpAQCAtMjA2LDggKzIyNSw3IEBACiAKIAljYXNlIEJMS1JPU0VUOgogCQlyZXQgPSBfX2Jsa2Rldl9kcml2ZXJfaW9jdGwoYmRldiwgbW9kZSwgY21kLCBhcmcpOwotCQkvKiAtRUlOVkFMIHRvIGhhbmRsZSBvbGQgdW5jb3JyZWN0ZWQgZHJpdmVycyAqLwotCQlpZiAocmV0ICE9IC1FSU5WQUwgJiYgcmV0ICE9IC1FTk9UVFkpCisJCWlmICghaXNfdW5yZWNvZ25pemVkX2lvY3RsKHJldCkpCiAJCQlyZXR1cm4gcmV0OwogCQlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCQlyZXR1cm4gLUVBQ0NFUzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL0tjb25maWcgYi9kcml2ZXJzL2F0YS9LY29uZmlnCmluZGV4IDZiZGVkZDcuLmNmMDQ3YzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL0tjb25maWcKKysrIGIvZHJpdmVycy9hdGEvS2NvbmZpZwpAQCAtODIwLDcgKzgyMCw3IEBACiAKIGNvbmZpZyBQQVRBX09GX1BMQVRGT1JNCiAJdHJpc3RhdGUgIk9wZW5GaXJtd2FyZSBwbGF0Zm9ybSBkZXZpY2UgUEFUQSBzdXBwb3J0IgotCWRlcGVuZHMgb24gUEFUQV9QTEFURk9STSAmJiBPRgorCWRlcGVuZHMgb24gUEFUQV9QTEFURk9STSAmJiBPRiAmJiBPRl9JUlEKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yIGdlbmVyaWMgZGlyZWN0bHkgY29ubmVjdGVkIEFUQQogCSAgZGV2aWNlcyBjb21tb25seSBmb3VuZCBvbiBlbWJlZGRlZCBzeXN0ZW1zIHdpdGggT3BlbkZpcm13YXJlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0bS9pcGhhc2UuYyBiL2RyaXZlcnMvYXRtL2lwaGFzZS5jCmluZGV4IDNkMGMyYjAuLjllMzczYmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRtL2lwaGFzZS5jCisrKyBiL2RyaXZlcnMvYXRtL2lwaGFzZS5jCkBAIC0xMzIwLDggKzEzMjAsOCBAQAogICAgICAgICAgIGlmIChpYV92Y2MgPT0gTlVMTCkKICAgICAgICAgICB7CiAgICAgICAgICAgICAgYXRvbWljX2luYygmdmNjLT5zdGF0cy0+cnhfZXJyKTsKKyAgICAgICAgICAgICBhdG1fcmV0dXJuKHZjYywgc2tiLT50cnVlc2l6ZSk7CiAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLSAgICAgICAgICAgICBhdG1fcmV0dXJuKHZjYywgYXRtX2d1ZXNzX3BkdTJ0cnVlc2l6ZShsZW4pKTsKICAgICAgICAgICAgICBnb3RvIElOQ1JfRExFOwogICAgICAgICAgICB9CiAgICAgICAgICAgLy8gZ2V0IHJlYWwgcGt0IGxlbmd0aCAgcHdhbmdfdGVzdApAQCAtMTMzNCw4ICsxMzM0LDggQEAKICAgICAgICAgICAgICBhdG9taWNfaW5jKCZ2Y2MtPnN0YXRzLT5yeF9lcnIpOwogICAgICAgICAgICAgIElGX0VSUihwcmludGsoInJ4X2RsZV9pbnRyOiBCYWQgIEFBTDUgdHJhaWxlciAlZCAoc2tiIGxlbiAlZCkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgc2tiLT5sZW4pOykKKyAgICAgICAgICAgICBhdG1fcmV0dXJuKHZjYywgc2tiLT50cnVlc2l6ZSk7CiAgICAgICAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLSAgICAgICAgICAgICBhdG1fcmV0dXJuKHZjYywgYXRtX2d1ZXNzX3BkdTJ0cnVlc2l6ZShsZW4pKTsKICAgICAgICAgICAgICBnb3RvIElOQ1JfRExFOwogICAgICAgICAgIH0KICAgICAgICAgICBza2JfdHJpbShza2IsIGxlbmd0aCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY29yZS5jIGIvZHJpdmVycy9iYXNlL2NvcmUuYwppbmRleCBkOGIzZDg5Li45MTlkYWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jhc2UvY29yZS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jb3JlLmMKQEAgLTE3NDMsOCArMTc0MywxMCBAQAogCQkgKi8KIAkJbGlzdF9kZWxfaW5pdCgmZGV2LT5rb2JqLmVudHJ5KTsKIAkJc3Bpbl91bmxvY2soJmRldmljZXNfa3NldC0+bGlzdF9sb2NrKTsKLQkJLyogRGlzYWJsZSBhbGwgZGV2aWNlJ3MgcnVudGltZSBwb3dlciBtYW5hZ2VtZW50ICovCi0JCXBtX3J1bnRpbWVfZGlzYWJsZShkZXYpOworCisJCS8qIERvbid0IGFsbG93IGFueSBtb3JlIHJ1bnRpbWUgc3VzcGVuZHMgKi8KKwkJcG1fcnVudGltZV9nZXRfbm9yZXN1bWUoZGV2KTsKKwkJcG1fcnVudGltZV9iYXJyaWVyKGRldik7CiAKIAkJaWYgKGRldi0+YnVzICYmIGRldi0+YnVzLT5zaHV0ZG93bikgewogCQkJZGV2X2RiZyhkZXYsICJzaHV0ZG93blxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jhc2UvY3B1LmMgYi9kcml2ZXJzL2Jhc2UvY3B1LmMKaW5kZXggMjUxYWNlYS4uMzk5MTUwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9iYXNlL2NwdS5jCisrKyBiL2RyaXZlcnMvYmFzZS9jcHUuYwpAQCAtMjQ3LDYgKzI0NywxMyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoZ2V0X2NwdV9zeXNkZXYpOwogCitib29sIGNwdV9pc19ob3RwbHVnZ2FibGUodW5zaWduZWQgY3B1KQoreworCXN0cnVjdCBzeXNfZGV2aWNlICpkZXYgPSBnZXRfY3B1X3N5c2RldihjcHUpOworCXJldHVybiBkZXYgJiYgY29udGFpbmVyX29mKGRldiwgc3RydWN0IGNwdSwgc3lzZGV2KS0+aG90cGx1Z2dhYmxlOworfQorRVhQT1JUX1NZTUJPTF9HUEwoY3B1X2lzX2hvdHBsdWdnYWJsZSk7CisKIGludCBfX2luaXQgY3B1X2Rldl9pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9iY21hX3ByaXZhdGUuaCBiL2RyaXZlcnMvYmNtYS9iY21hX3ByaXZhdGUuaAppbmRleCAzMGEzMDg1Li5mZGE1NmJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvYmNtYV9wcml2YXRlLmgKKysrIGIvZHJpdmVycy9iY21hL2JjbWFfcHJpdmF0ZS5oCkBAIC0xOCw2ICsxOCw5IEBACiBpbnQgX19pbml0IGJjbWFfYnVzX2Vhcmx5X3JlZ2lzdGVyKHN0cnVjdCBiY21hX2J1cyAqYnVzLAogCQkJCSAgIHN0cnVjdCBiY21hX2RldmljZSAqY29yZV9jYywKIAkJCQkgICBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmVfbWlwcyk7CisjaWZkZWYgQ09ORklHX1BNCitpbnQgYmNtYV9idXNfcmVzdW1lKHN0cnVjdCBiY21hX2J1cyAqYnVzKTsKKyNlbmRpZgogCiAvKiBzY2FuLmMgKi8KIGludCBiY21hX2J1c19zY2FuKHN0cnVjdCBiY21hX2J1cyAqYnVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmNtYS9ob3N0X3BjaS5jIGIvZHJpdmVycy9iY21hL2hvc3RfcGNpLmMKaW5kZXggMWI1MWQ4Yi4uNDQzYjgzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL2hvc3RfcGNpLmMKKysrIGIvZHJpdmVycy9iY21hL2hvc3RfcGNpLmMKQEAgLTIxLDQ4ICsyMSw1OCBAQAogCXByX2RlYnVnKCJTd2l0Y2hlZCB0byBjb3JlOiAweCVYXG4iLCBjb3JlLT5pZC5pZCk7CiB9CiAKLXN0YXRpYyB1OCBiY21hX2hvc3RfcGNpX3JlYWQ4KHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKKy8qIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgcmVxdWVzdGVkIGNvcmUuIFJldHVybnMgYmFzZSBvZmZzZXQgdGhhdCBoYXMgdG8gYmUKKyAqIHVzZWQuIEl0IG1ha2VzIHVzZSBvZiBmaXhlZCB3aW5kb3dzIHdoZW4gcG9zc2libGUuICovCitzdGF0aWMgdTE2IGJjbWFfaG9zdF9wY2lfcHJvdmlkZV9hY2Nlc3NfdG9fY29yZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUpCiB7CisJc3dpdGNoIChjb3JlLT5pZC5pZCkgeworCWNhc2UgQkNNQV9DT1JFX0NISVBDT01NT046CisJCXJldHVybiAzICogQkNNQV9DT1JFX1NJWkU7CisJY2FzZSBCQ01BX0NPUkVfUENJRToKKwkJcmV0dXJuIDIgKiBCQ01BX0NPUkVfU0laRTsKKwl9CisKIAlpZiAoY29yZS0+YnVzLT5tYXBwZWRfY29yZSAhPSBjb3JlKQogCQliY21hX2hvc3RfcGNpX3N3aXRjaF9jb3JlKGNvcmUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdTggYmNtYV9ob3N0X3BjaV9yZWFkOChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCit7CisJb2Zmc2V0ICs9IGJjbWFfaG9zdF9wY2lfcHJvdmlkZV9hY2Nlc3NfdG9fY29yZShjb3JlKTsKIAlyZXR1cm4gaW9yZWFkOChjb3JlLT5idXMtPm1taW8gKyBvZmZzZXQpOwogfQogCiBzdGF0aWMgdTE2IGJjbWFfaG9zdF9wY2lfcmVhZDE2KHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKIHsKLQlpZiAoY29yZS0+YnVzLT5tYXBwZWRfY29yZSAhPSBjb3JlKQotCQliY21hX2hvc3RfcGNpX3N3aXRjaF9jb3JlKGNvcmUpOworCW9mZnNldCArPSBiY21hX2hvc3RfcGNpX3Byb3ZpZGVfYWNjZXNzX3RvX2NvcmUoY29yZSk7CiAJcmV0dXJuIGlvcmVhZDE2KGNvcmUtPmJ1cy0+bW1pbyArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyB1MzIgYmNtYV9ob3N0X3BjaV9yZWFkMzIoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0KQogewotCWlmIChjb3JlLT5idXMtPm1hcHBlZF9jb3JlICE9IGNvcmUpCi0JCWJjbWFfaG9zdF9wY2lfc3dpdGNoX2NvcmUoY29yZSk7CisJb2Zmc2V0ICs9IGJjbWFfaG9zdF9wY2lfcHJvdmlkZV9hY2Nlc3NfdG9fY29yZShjb3JlKTsKIAlyZXR1cm4gaW9yZWFkMzIoY29yZS0+YnVzLT5tbWlvICsgb2Zmc2V0KTsKIH0KIAogc3RhdGljIHZvaWQgYmNtYV9ob3N0X3BjaV93cml0ZTgoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0LAogCQkJCSB1OCB2YWx1ZSkKIHsKLQlpZiAoY29yZS0+YnVzLT5tYXBwZWRfY29yZSAhPSBjb3JlKQotCQliY21hX2hvc3RfcGNpX3N3aXRjaF9jb3JlKGNvcmUpOworCW9mZnNldCArPSBiY21hX2hvc3RfcGNpX3Byb3ZpZGVfYWNjZXNzX3RvX2NvcmUoY29yZSk7CiAJaW93cml0ZTgodmFsdWUsIGNvcmUtPmJ1cy0+bW1pbyArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyB2b2lkIGJjbWFfaG9zdF9wY2lfd3JpdGUxNihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQsCiAJCQkJIHUxNiB2YWx1ZSkKIHsKLQlpZiAoY29yZS0+YnVzLT5tYXBwZWRfY29yZSAhPSBjb3JlKQotCQliY21hX2hvc3RfcGNpX3N3aXRjaF9jb3JlKGNvcmUpOworCW9mZnNldCArPSBiY21hX2hvc3RfcGNpX3Byb3ZpZGVfYWNjZXNzX3RvX2NvcmUoY29yZSk7CiAJaW93cml0ZTE2KHZhbHVlLCBjb3JlLT5idXMtPm1taW8gKyBvZmZzZXQpOwogfQogCiBzdGF0aWMgdm9pZCBiY21hX2hvc3RfcGNpX3dyaXRlMzIoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0LAogCQkJCSB1MzIgdmFsdWUpCiB7Ci0JaWYgKGNvcmUtPmJ1cy0+bWFwcGVkX2NvcmUgIT0gY29yZSkKLQkJYmNtYV9ob3N0X3BjaV9zd2l0Y2hfY29yZShjb3JlKTsKKwlvZmZzZXQgKz0gYmNtYV9ob3N0X3BjaV9wcm92aWRlX2FjY2Vzc190b19jb3JlKGNvcmUpOwogCWlvd3JpdGUzMih2YWx1ZSwgY29yZS0+YnVzLT5tbWlvICsgb2Zmc2V0KTsKIH0KIApAQCAtMjI0LDYgKzIzNCw0MSBAQAogCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOwogfQogCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGJjbWFfaG9zdF9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCit7CisJLyogSG9zdCBzcGVjaWZpYyAqLworCXBjaV9zYXZlX3N0YXRlKGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKGRldik7CisJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIHBjaV9jaG9vc2Vfc3RhdGUoZGV2LCBzdGF0ZSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmNtYV9ob3N0X3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgYmNtYV9idXMgKmJ1cyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCWludCBlcnI7CisKKwkvKiBIb3N0IHNwZWNpZmljICovCisJcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIDApOworCWVyciA9IHBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlwY2lfcmVzdG9yZV9zdGF0ZShkZXYpOworCisJLyogQnVzIHNwZWNpZmljICovCisJZXJyID0gYmNtYV9idXNfcmVzdW1lKGJ1cyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiAwOworfQorI2Vsc2UgLyogQ09ORklHX1BNICovCisjIGRlZmluZSBiY21hX2hvc3RfcGNpX3N1c3BlbmQJTlVMTAorIyBkZWZpbmUgYmNtYV9ob3N0X3BjaV9yZXN1bWUJTlVMTAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworCiBzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoYmNtYV9wY2lfYnJpZGdlX3RibCkgPSB7CiAJeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4MDU3NikgfSwKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9CUk9BRENPTSwgMHg0MzMxKSB9LApAQCAtMjM5LDYgKzI4NCw4IEBACiAJLmlkX3RhYmxlID0gYmNtYV9wY2lfYnJpZGdlX3RibCwKIAkucHJvYmUgPSBiY21hX2hvc3RfcGNpX3Byb2JlLAogCS5yZW1vdmUgPSBiY21hX2hvc3RfcGNpX3JlbW92ZSwKKwkuc3VzcGVuZCA9IGJjbWFfaG9zdF9wY2lfc3VzcGVuZCwKKwkucmVzdW1lID0gYmNtYV9ob3N0X3BjaV9yZXN1bWUsCiB9OwogCiBpbnQgX19pbml0IGJjbWFfaG9zdF9wY2lfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL21haW4uYyBiL2RyaXZlcnMvYmNtYS9tYWluLmMKaW5kZXggNzBjODRiOS4uMTBmOTJiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9iY21hL21haW4uYworKysgYi9kcml2ZXJzL2JjbWEvbWFpbi5jCkBAIC0yNDAsNiArMjQwLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKKyNpZmRlZiBDT05GSUdfUE0KK2ludCBiY21hX2J1c19yZXN1bWUoc3RydWN0IGJjbWFfYnVzICpidXMpCit7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlOworCisJLyogSW5pdCBDQyBjb3JlICovCisJY29yZSA9IGJjbWFfZmluZF9jb3JlKGJ1cywgQkNNQV9DT1JFX0NISVBDT01NT04pOworCWlmIChjb3JlKSB7CisJCWJ1cy0+ZHJ2X2NjLnNldHVwX2RvbmUgPSBmYWxzZTsKKwkJYmNtYV9jb3JlX2NoaXBjb21tb25faW5pdCgmYnVzLT5kcnZfY2MpOworCX0KKworCXJldHVybiAwOworfQorI2VuZGlmCisKIGludCBfX2JjbWFfZHJpdmVyX3JlZ2lzdGVyKHN0cnVjdCBiY21hX2RyaXZlciAqZHJ2LCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKIHsKIAlkcnYtPmRydi5uYW1lID0gZHJ2LT5uYW1lOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9iY21hL3Nwcm9tLmMgYi9kcml2ZXJzL2JjbWEvc3Byb20uYwppbmRleCBkNzI5MjM5Li42ZjIzMGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JjbWEvc3Byb20uYworKysgYi9kcml2ZXJzL2JjbWEvc3Byb20uYwpAQCAtMTI5LDYgKzEyOSw5IEBACiAJdTE2IHY7CiAJaW50IGk7CiAKKwlidXMtPnNwcm9tLnJldmlzaW9uID0gc3Byb21bU1NCX1NQUk9NU0laRV9XT1JEU19SNCAtIDFdICYKKwkJU1NCX1NQUk9NX1JFVklTSU9OX1JFVjsKKwogCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKIAkJdiA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfSUwwTUFDKSArIGldOwogCQkqKCgoX19iZTE2ICopYnVzLT5zcHJvbS5pbDBtYWMpICsgaSkgPSBjcHVfdG9fYmUxNih2KTsKQEAgLTEzNiwxMiArMTM5LDcwIEBACiAKIAlidXMtPnNwcm9tLmJvYXJkX3JldiA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfQk9BUkRSRVYpXTsKIAorCWJ1cy0+c3Byb20udHhwaWQyZ1swXSA9IChzcHJvbVtTUE9GRihTU0JfU1BST000X1RYUElEMkcwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQyRzApID4+IFNTQl9TUFJPTTRfVFhQSUQyRzBfU0hJRlQ7CisJYnVzLT5zcHJvbS50eHBpZDJnWzFdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQyRzAxKV0gJgorCSAgICAgU1NCX1NQUk9NNF9UWFBJRDJHMSkgPj4gU1NCX1NQUk9NNF9UWFBJRDJHMV9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkMmdbMl0gPSAoc3Byb21bU1BPRkYoU1NCX1NQUk9NNF9UWFBJRDJHMjMpXSAmCisJICAgICBTU0JfU1BST000X1RYUElEMkcyKSA+PiBTU0JfU1BST000X1RYUElEMkcyX1NISUZUOworCWJ1cy0+c3Byb20udHhwaWQyZ1szXSA9IChzcHJvbVtTUE9GRihTU0JfU1BST000X1RYUElEMkcyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQyRzMpID4+IFNTQl9TUFJPTTRfVFhQSUQyRzNfU0hJRlQ7CisKKwlidXMtPnNwcm9tLnR4cGlkNWdsWzBdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0wwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0wwKSA+PiBTU0JfU1BST000X1RYUElENUdMMF9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdsWzFdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0wwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0wxKSA+PiBTU0JfU1BST000X1RYUElENUdMMV9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdsWzJdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0wyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0wyKSA+PiBTU0JfU1BST000X1RYUElENUdMMl9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdsWzNdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0wyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0wzKSA+PiBTU0JfU1BST000X1RYUElENUdMM19TSElGVDsKKworCWJ1cy0+c3Byb20udHhwaWQ1Z1swXSA9IChzcHJvbVtTUE9GRihTU0JfU1BST000X1RYUElENUcwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1RzApID4+IFNTQl9TUFJPTTRfVFhQSUQ1RzBfU0hJRlQ7CisJYnVzLT5zcHJvbS50eHBpZDVnWzFdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1RzAxKV0gJgorCSAgICAgU1NCX1NQUk9NNF9UWFBJRDVHMSkgPj4gU1NCX1NQUk9NNF9UWFBJRDVHMV9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdbMl0gPSAoc3Byb21bU1BPRkYoU1NCX1NQUk9NNF9UWFBJRDVHMjMpXSAmCisJICAgICBTU0JfU1BST000X1RYUElENUcyKSA+PiBTU0JfU1BST000X1RYUElENUcyX1NISUZUOworCWJ1cy0+c3Byb20udHhwaWQ1Z1szXSA9IChzcHJvbVtTUE9GRihTU0JfU1BST000X1RYUElENUcyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1RzMpID4+IFNTQl9TUFJPTTRfVFhQSUQ1RzNfU0hJRlQ7CisKKwlidXMtPnNwcm9tLnR4cGlkNWdoWzBdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0gwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0gwKSA+PiBTU0JfU1BST000X1RYUElENUdIMF9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdoWzFdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0gwMSldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0gxKSA+PiBTU0JfU1BST000X1RYUElENUdIMV9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdoWzJdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0gyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0gyKSA+PiBTU0JfU1BST000X1RYUElENUdIMl9TSElGVDsKKwlidXMtPnNwcm9tLnR4cGlkNWdoWzNdID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTTRfVFhQSUQ1R0gyMyldICYKKwkgICAgIFNTQl9TUFJPTTRfVFhQSUQ1R0gzKSA+PiBTU0JfU1BST000X1RYUElENUdIM19TSElGVDsKKwogCWJ1cy0+c3Byb20uYm9hcmRmbGFnc19sbyA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfQkZMTE8pXTsKIAlidXMtPnNwcm9tLmJvYXJkZmxhZ3NfaGkgPSBzcHJvbVtTUE9GRihTU0JfU1BST004X0JGTEhJKV07CiAJYnVzLT5zcHJvbS5ib2FyZGZsYWdzMl9sbyA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfQkZMMkxPKV07CiAJYnVzLT5zcHJvbS5ib2FyZGZsYWdzMl9oaSA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfQkZMMkhJKV07CiAKIAlidXMtPnNwcm9tLmNvdW50cnlfY29kZSA9IHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfQ0NPREUpXTsKKworCWJ1cy0+c3Byb20uZmVtLmdoejIudHNzaXBvcyA9IChzcHJvbVtTUE9GRihTU0JfU1BST004X0ZFTTJHKV0gJgorCQlTU0JfU1JPTThfRkVNX1RTU0lQT1MpID4+IFNTQl9TUk9NOF9GRU1fVFNTSVBPU19TSElGVDsKKwlidXMtPnNwcm9tLmZlbS5naHoyLmV4dHBhX2dhaW4gPSAoc3Byb21bU1BPRkYoU1NCX1NQUk9NOF9GRU0yRyldICYKKwkJU1NCX1NST004X0ZFTV9FWFRQQV9HQUlOKSA+PiBTU0JfU1JPTThfRkVNX0VYVFBBX0dBSU5fU0hJRlQ7CisJYnVzLT5zcHJvbS5mZW0uZ2h6Mi5wZGV0X3JhbmdlID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfRkVNMkcpXSAmCisJCVNTQl9TUk9NOF9GRU1fUERFVF9SQU5HRSkgPj4gU1NCX1NST004X0ZFTV9QREVUX1JBTkdFX1NISUZUOworCWJ1cy0+c3Byb20uZmVtLmdoejIudHJfaXNvID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfRkVNMkcpXSAmCisJCVNTQl9TUk9NOF9GRU1fVFJfSVNPKSA+PiBTU0JfU1JPTThfRkVNX1RSX0lTT19TSElGVDsKKwlidXMtPnNwcm9tLmZlbS5naHoyLmFudHN3bHV0ID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfRkVNMkcpXSAmCisJCVNTQl9TUk9NOF9GRU1fQU5UU1dMVVQpID4+IFNTQl9TUk9NOF9GRU1fQU5UU1dMVVRfU0hJRlQ7CisKKwlidXMtPnNwcm9tLmZlbS5naHo1LnRzc2lwb3MgPSAoc3Byb21bU1BPRkYoU1NCX1NQUk9NOF9GRU01RyldICYKKwkJU1NCX1NST004X0ZFTV9UU1NJUE9TKSA+PiBTU0JfU1JPTThfRkVNX1RTU0lQT1NfU0hJRlQ7CisJYnVzLT5zcHJvbS5mZW0uZ2h6NS5leHRwYV9nYWluID0gKHNwcm9tW1NQT0ZGKFNTQl9TUFJPTThfRkVNNUcpXSAmCisJCVNTQl9TUk9NOF9GRU1fRVhUUEFfR0FJTikgPj4gU1NCX1NST004X0ZFTV9FWFRQQV9HQUlOX1NISUZUOworCWJ1cy0+c3Byb20uZmVtLmdoejUucGRldF9yYW5nZSA9IChzcHJvbVtTUE9GRihTU0JfU1BST004X0ZFTTVHKV0gJgorCQlTU0JfU1JPTThfRkVNX1BERVRfUkFOR0UpID4+IFNTQl9TUk9NOF9GRU1fUERFVF9SQU5HRV9TSElGVDsKKwlidXMtPnNwcm9tLmZlbS5naHo1LnRyX2lzbyA9IChzcHJvbVtTUE9GRihTU0JfU1BST004X0ZFTTVHKV0gJgorCQlTU0JfU1JPTThfRkVNX1RSX0lTTykgPj4gU1NCX1NST004X0ZFTV9UUl9JU09fU0hJRlQ7CisJYnVzLT5zcHJvbS5mZW0uZ2h6NS5hbnRzd2x1dCA9IChzcHJvbVtTUE9GRihTU0JfU1BST004X0ZFTTVHKV0gJgorCQlTU0JfU1JPTThfRkVNX0FOVFNXTFVUKSA+PiBTU0JfU1JPTThfRkVNX0FOVFNXTFVUX1NISUZUOwogfQogCiBpbnQgYmNtYV9zcHJvbV9nZXQoc3RydWN0IGJjbWFfYnVzICpidXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMgYi9kcml2ZXJzL2Jsb2NrL2NjaXNzLmMKaW5kZXggODAwNGFjMy4uNTg3Y2NlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9jY2lzcy5jCisrKyBiL2RyaXZlcnMvYmxvY2svY2Npc3MuYwpAQCAtMjYwMSw2ICsyNjAxLDggQEAKIAkJCWMtPlJlcXVlc3QuVGltZW91dCA9IDA7CiAJCQljLT5SZXF1ZXN0LkNEQlswXSA9IEJNSUNfV1JJVEU7CiAJCQljLT5SZXF1ZXN0LkNEQls2XSA9IEJNSUNfQ0FDSEVfRkxVU0g7CisJCQljLT5SZXF1ZXN0LkNEQls3XSA9IChzaXplID4+IDgpICYgMHhGRjsKKwkJCWMtPlJlcXVlc3QuQ0RCWzhdID0gc2l6ZSAmIDB4RkY7CiAJCQlicmVhazsKIAkJY2FzZSBURVNUX1VOSVRfUkVBRFk6CiAJCQljLT5SZXF1ZXN0LkNEQkxlbiA9IDY7CkBAIC00ODgwLDcgKzQ4ODIsNyBAQAogewogCWlmIChoLT5tc2l4X3ZlY3RvciB8fCBoLT5tc2lfdmVjdG9yKSB7CiAJCWlmICghcmVxdWVzdF9pcnEoaC0+aW50cltoLT5pbnRyX21vZGVdLCBtc2l4aGFuZGxlciwKLQkJCQlJUlFGX0RJU0FCTEVELCBoLT5kZXZuYW1lLCBoKSkKKwkJCQkwLCBoLT5kZXZuYW1lLCBoKSkKIAkJCXJldHVybiAwOwogCQlkZXZfZXJyKCZoLT5wZGV2LT5kZXYsICJVbmFibGUgdG8gZ2V0IG1zaSBpcnEgJWQiCiAJCQkiIGZvciAlc1xuIiwgaC0+aW50cltoLT5pbnRyX21vZGVdLApAQCAtNDg4OSw3ICs0ODkxLDcgQEAKIAl9CiAKIAlpZiAoIXJlcXVlc3RfaXJxKGgtPmludHJbaC0+aW50cl9tb2RlXSwgaW50eGhhbmRsZXIsCi0JCQlJUlFGX0RJU0FCTEVELCBoLT5kZXZuYW1lLCBoKSkKKwkJCUlSUUZfU0hBUkVELCBoLT5kZXZuYW1lLCBoKSkKIAkJcmV0dXJuIDA7CiAJZGV2X2VycigmaC0+cGRldi0+ZGV2LCAiVW5hYmxlIHRvIGdldCBpcnEgJWQgZm9yICVzXG4iLAogCQloLT5pbnRyW2gtPmludHJfbW9kZV0sIGgtPmRldm5hbWUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9sb29wLmMgYi9kcml2ZXJzL2Jsb2NrL2xvb3AuYwppbmRleCA2OGIyMDVhLi4xZTg4OGM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL2xvb3AuYworKysgYi9kcml2ZXJzL2Jsb2NrL2xvb3AuYwpAQCAtNDIyLDcgKzQyMiw3IEBACiAKIAkJLyoKIAkJICogV2UgdXNlIHB1bmNoIGhvbGUgdG8gcmVjbGFpbSB0aGUgZnJlZSBzcGFjZSB1c2VkIGJ5IHRoZQotCQkgKiBpbWFnZSBhLmsuYS4gZGlzY2FyZC4gSG93ZXZlciB3ZSBkbyBzdXBwb3J0IGRpc2NhcmQgaWYKKwkJICogaW1hZ2UgYS5rLmEuIGRpc2NhcmQuIEhvd2V2ZXIgd2UgZG8gbm90IHN1cHBvcnQgZGlzY2FyZCBpZgogCQkgKiBlbmNyeXB0aW9uIGlzIGVuYWJsZWQsIGJlY2F1c2UgaXQgbWF5IGdpdmUgYW4gYXR0YWNrZXIKIAkJICogdXNlZnVsIGluZm9ybWF0aW9uLgogCQkgKi8KQEAgLTc5Nyw3ICs3OTcsNyBAQAogCX0KIAogCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplOwotCXEtPmxpbWl0cy5kaXNjYXJkX2FsaWdubWVudCA9IGlub2RlLT5pX3NiLT5zX2Jsb2Nrc2l6ZTsKKwlxLT5saW1pdHMuZGlzY2FyZF9hbGlnbm1lbnQgPSAwOwogCXEtPmxpbWl0cy5tYXhfZGlzY2FyZF9zZWN0b3JzID0gVUlOVF9NQVggPj4gOTsKIAlxLT5saW1pdHMuZGlzY2FyZF96ZXJvZXNfZGF0YSA9IDE7CiAJcXVldWVfZmxhZ19zZXRfdW5sb2NrZWQoUVVFVUVfRkxBR19ESVNDQVJELCBxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2svcmJkLmMgYi9kcml2ZXJzL2Jsb2NrL3JiZC5jCmluZGV4IDY1Y2M0MjQuLjE0OGFiOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2svcmJkLmMKKysrIGIvZHJpdmVycy9ibG9jay9yYmQuYwpAQCAtMTgzLDEwICsxODMsNiBAQAogCiBzdGF0aWMgaW50IF9fcmJkX2luaXRfc25hcHNfaGVhZGVyKHN0cnVjdCByYmRfZGV2aWNlICpyYmRfZGV2KTsKIHN0YXRpYyB2b2lkIHJiZF9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpOwotc3RhdGljIHNzaXplX3QgcmJkX3NuYXBfcm9sbGJhY2soc3RydWN0IGRldmljZSAqZGV2LAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY29uc3QgY2hhciAqYnVmLAotCQkJCSBzaXplX3Qgc2l6ZSk7CiBzdGF0aWMgc3NpemVfdCByYmRfc25hcF9hZGQoc3RydWN0IGRldmljZSAqZGV2LAogCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJICAgIGNvbnN0IGNoYXIgKmJ1ZiwKQEAgLTQ2MSw2ICs0NTcsMTAgQEAKIAl1MzIgc25hcF9jb3VudCA9IGxlMzJfdG9fY3B1KG9uZGlzay0+c25hcF9jb3VudCk7CiAJaW50IHJldCA9IC1FTk9NRU07CiAKKwlpZiAobWVtY21wKG9uZGlzaywgUkJEX0hFQURFUl9URVhULCBzaXplb2YoUkJEX0hFQURFUl9URVhUKSkpIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKIAlpbml0X3J3c2VtKCZoZWFkZXItPnNuYXBfcndzZW0pOwogCWhlYWRlci0+c25hcF9uYW1lc19sZW4gPSBsZTY0X3RvX2NwdShvbmRpc2stPnNuYXBfbmFtZXNfbGVuKTsKIAloZWFkZXItPnNuYXBjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNlcGhfc25hcF9jb250ZXh0KSArCkBAIC0xMzU2LDMyICsxMzU2LDYgQEAKIH0KIAogLyoKLSAqIFJlcXVlc3Qgc3luYyBvc2Qgcm9sbGJhY2sKLSAqLwotc3RhdGljIGludCByYmRfcmVxX3N5bmNfcm9sbGJhY2tfb2JqKHN0cnVjdCByYmRfZGV2aWNlICpkZXYsCi0JCQkJICAgICB1NjQgc25hcGlkLAotCQkJCSAgICAgY29uc3QgY2hhciAqb2JqKQotewotCXN0cnVjdCBjZXBoX29zZF9yZXFfb3AgKm9wczsKLQlpbnQgcmV0ID0gcmJkX2NyZWF0ZV9yd19vcHMoJm9wcywgMSwgQ0VQSF9PU0RfT1BfUk9MTEJBQ0ssIDApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0Jb3BzWzBdLnNuYXAuc25hcGlkID0gc25hcGlkOwotCi0JcmV0ID0gcmJkX3JlcV9zeW5jX29wKGRldiwgTlVMTCwKLQkJCSAgICAgICBDRVBIX05PU05BUCwKLQkJCSAgICAgICAwLAotCQkJICAgICAgIENFUEhfT1NEX0ZMQUdfV1JJVEUgfCBDRVBIX09TRF9GTEFHX09ORElTSywKLQkJCSAgICAgICBvcHMsCi0JCQkgICAgICAgMSwgb2JqLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMKTsKLQotCXJiZF9kZXN0cm95X29wcyhvcHMpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoKICAqIFJlcXVlc3Qgc3luYyBvc2QgcmVhZAogICovCiBzdGF0aWMgaW50IHJiZF9yZXFfc3luY19leGVjKHN0cnVjdCByYmRfZGV2aWNlICpkZXYsCkBAIC0xNjEwLDggKzE1ODQsMTMgQEAKIAkJCWdvdG8gb3V0X2RoOwogCiAJCXJjID0gcmJkX2hlYWRlcl9mcm9tX2Rpc2soaGVhZGVyLCBkaCwgc25hcF9jb3VudCwgR0ZQX0tFUk5FTCk7Ci0JCWlmIChyYyA8IDApCisJCWlmIChyYyA8IDApIHsKKwkJCWlmIChyYyA9PSAtRU5YSU8pIHsKKwkJCQlwcl93YXJuaW5nKCJ1bnJlY29nbml6ZWQgaGVhZGVyIGZvcm1hdCIKKwkJCQkJICAgIiBmb3IgaW1hZ2UgJXMiLCByYmRfZGV2LT5vYmopOworCQkJfQogCQkJZ290byBvdXRfZGg7CisJCX0KIAogCQlpZiAoc25hcF9jb3VudCAhPSBoZWFkZXItPnRvdGFsX3NuYXBzKSB7CiAJCQlzbmFwX2NvdW50ID0gaGVhZGVyLT50b3RhbF9zbmFwczsKQEAgLTE4ODIsNyArMTg2MSw2IEBACiBzdGF0aWMgREVWSUNFX0FUVFIocmVmcmVzaCwgU19JV1VTUiwgTlVMTCwgcmJkX2ltYWdlX3JlZnJlc2gpOwogc3RhdGljIERFVklDRV9BVFRSKGN1cnJlbnRfc25hcCwgU19JUlVHTywgcmJkX3NuYXBfc2hvdywgTlVMTCk7CiBzdGF0aWMgREVWSUNFX0FUVFIoY3JlYXRlX3NuYXAsIFNfSVdVU1IsIE5VTEwsIHJiZF9zbmFwX2FkZCk7Ci1zdGF0aWMgREVWSUNFX0FUVFIocm9sbGJhY2tfc25hcCwgU19JV1VTUiwgTlVMTCwgcmJkX3NuYXBfcm9sbGJhY2spOwogCiBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqcmJkX2F0dHJzW10gPSB7CiAJJmRldl9hdHRyX3NpemUuYXR0ciwKQEAgLTE4OTMsNyArMTg3MSw2IEBACiAJJmRldl9hdHRyX2N1cnJlbnRfc25hcC5hdHRyLAogCSZkZXZfYXR0cl9yZWZyZXNoLmF0dHIsCiAJJmRldl9hdHRyX2NyZWF0ZV9zbmFwLmF0dHIsCi0JJmRldl9hdHRyX3JvbGxiYWNrX3NuYXAuYXR0ciwKIAlOVUxMCiB9OwogCkBAIC0yNDI0LDY0ICsyNDAxLDYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgc3NpemVfdCByYmRfc25hcF9yb2xsYmFjayhzdHJ1Y3QgZGV2aWNlICpkZXYsCi0JCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAotCQkJCSBjb25zdCBjaGFyICpidWYsCi0JCQkJIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgcmJkX2RldmljZSAqcmJkX2RldiA9IGRldl90b19yYmQoZGV2KTsKLQlpbnQgcmV0OwotCXU2NCBzbmFwaWQ7Ci0JdTY0IGN1cl9vZnM7Ci0JY2hhciAqc2VnX25hbWUgPSBOVUxMOwotCWNoYXIgKnNuYXBfbmFtZSA9IGttYWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKLQlyZXQgPSAtRU5PTUVNOwotCWlmICghc25hcF9uYW1lKQotCQlyZXR1cm4gcmV0OwotCi0JLyogcGFyc2Ugc25hcHMgYWRkIGNvbW1hbmQgKi8KLQlzbnByaW50ZihzbmFwX25hbWUsIGNvdW50LCAiJXMiLCBidWYpOwotCXNlZ19uYW1lID0ga21hbGxvYyhSQkRfTUFYX1NFR19OQU1FX0xFTiArIDEsIEdGUF9OT0lPKTsKLQlpZiAoIXNlZ19uYW1lKQotCQlnb3RvIGRvbmU7Ci0KLQltdXRleF9sb2NrX25lc3RlZCgmY3RsX211dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7Ci0KLQlyZXQgPSBzbmFwX2J5X25hbWUoJnJiZF9kZXYtPmhlYWRlciwgc25hcF9uYW1lLCAmc25hcGlkLCBOVUxMKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBkb25lX3VubG9jazsKLQotCWRvdXQoInNuYXBpZD0lbGxkXG4iLCBzbmFwaWQpOwotCi0JY3VyX29mcyA9IDA7Ci0Jd2hpbGUgKGN1cl9vZnMgPCByYmRfZGV2LT5oZWFkZXIuaW1hZ2Vfc2l6ZSkgewotCQljdXJfb2ZzICs9IHJiZF9nZXRfc2VnbWVudCgmcmJkX2Rldi0+aGVhZGVyLAotCQkJCQkgICByYmRfZGV2LT5vYmosCi0JCQkJCSAgIGN1cl9vZnMsICh1NjQpLTEsCi0JCQkJCSAgIHNlZ19uYW1lLCBOVUxMKTsKLQkJZG91dCgic2VnX25hbWU9JXNcbiIsIHNlZ19uYW1lKTsKLQotCQlyZXQgPSByYmRfcmVxX3N5bmNfcm9sbGJhY2tfb2JqKHJiZF9kZXYsIHNuYXBpZCwgc2VnX25hbWUpOwotCQlpZiAocmV0IDwgMCkKLQkJCXByX3dhcm5pbmcoImNvdWxkIG5vdCByb2xsIGJhY2sgb2JqICVzIGVycj0lZFxuIiwKLQkJCQkgICBzZWdfbmFtZSwgcmV0KTsKLQl9Ci0KLQlyZXQgPSBfX3JiZF91cGRhdGVfc25hcHMocmJkX2Rldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gZG9uZV91bmxvY2s7Ci0KLQlyZXQgPSBjb3VudDsKLQotZG9uZV91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZjdGxfbXV0ZXgpOwotZG9uZToKLQlrZnJlZShzZWdfbmFtZSk7Ci0Ja2ZyZWUoc25hcF9uYW1lKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgYnVzX2F0dHJpYnV0ZSByYmRfYnVzX2F0dHJzW10gPSB7CiAJX19BVFRSKGFkZCwgU19JV1VTUiwgTlVMTCwgcmJkX2FkZCksCiAJX19BVFRSKHJlbW92ZSwgU19JV1VTUiwgTlVMTCwgcmJkX3JlbW92ZSksCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMgYi9kcml2ZXJzL2Jsb2NrL3N3aW0zLmMKaW5kZXggYWUzZTE2Ny4uODlkZGFiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9zd2ltMy5jCisrKyBiL2RyaXZlcnMvYmxvY2svc3dpbTMuYwpAQCAtMTYsNiArMTYsOCBAQAogICogaGFuZGxlIEdDUiBkaXNrcwogICovCiAKKyN1bmRlZiBERUJVRworCiAjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KQEAgLTM2LDEzICszOCwxMSBAQAogI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiAjaW5jbHVkZSA8YXNtL3BtYWNfZmVhdHVyZS5oPgogCi1zdGF0aWMgREVGSU5FX01VVEVYKHN3aW0zX211dGV4KTsKLXN0YXRpYyBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqc3dpbTNfcXVldWU7Ci1zdGF0aWMgc3RydWN0IGdlbmRpc2sgKmRpc2tzWzJdOwotc3RhdGljIHN0cnVjdCByZXF1ZXN0ICpmZF9yZXE7Ci0KICNkZWZpbmUgTUFYX0ZMT1BQSUVTCTIKIAorc3RhdGljIERFRklORV9NVVRFWChzd2ltM19tdXRleCk7CitzdGF0aWMgc3RydWN0IGdlbmRpc2sgKmRpc2tzW01BWF9GTE9QUElFU107CisKIGVudW0gc3dpbV9zdGF0ZSB7CiAJaWRsZSwKIAlsb2NhdGluZywKQEAgLTE3Nyw3ICsxNzcsNiBAQAogCiBzdHJ1Y3QgZmxvcHB5X3N0YXRlIHsKIAllbnVtIHN3aW1fc3RhdGUJc3RhdGU7Ci0Jc3BpbmxvY2tfdCBsb2NrOwogCXN0cnVjdCBzd2ltMyBfX2lvbWVtICpzd2ltMzsJLyogaGFyZHdhcmUgcmVnaXN0ZXJzICovCiAJc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZG1hOwkvKiBETUEgY29udHJvbGxlciByZWdpc3RlcnMgKi8KIAlpbnQJc3dpbTNfaW50cjsJLyogaW50ZXJydXB0IG51bWJlciBmb3IgU1dJTTMgKi8KQEAgLTIwNCw4ICsyMDMsMjAgQEAKIAlpbnQJd2FudGVkOwogCXN0cnVjdCBtYWNpb19kZXYgKm1kZXY7CiAJY2hhcglkYmRtYV9jbWRfc3BhY2VbNSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKV07CisJaW50CWluZGV4OworCXN0cnVjdCByZXF1ZXN0ICpjdXJfcmVxOwogfTsKIAorI2RlZmluZSBzd2ltM19lcnIoZm10LCBhcmcuLi4pCWRldl9lcnIoJmZzLT5tZGV2LT5vZmRldi5kZXYsICJbZmQlZF0gIiBmbXQsIGZzLT5pbmRleCwgYXJnKQorI2RlZmluZSBzd2ltM193YXJuKGZtdCwgYXJnLi4uKQlkZXZfd2FybigmZnMtPm1kZXYtPm9mZGV2LmRldiwgIltmZCVkXSAiIGZtdCwgZnMtPmluZGV4LCBhcmcpCisjZGVmaW5lIHN3aW0zX2luZm8oZm10LCBhcmcuLi4pCWRldl9pbmZvKCZmcy0+bWRldi0+b2ZkZXYuZGV2LCAiW2ZkJWRdICIgZm10LCBmcy0+aW5kZXgsIGFyZykKKworI2lmZGVmIERFQlVHCisjZGVmaW5lIHN3aW0zX2RiZyhmbXQsIGFyZy4uLikJZGV2X2RiZygmZnMtPm1kZXYtPm9mZGV2LmRldiwgIltmZCVkXSAiIGZtdCwgZnMtPmluZGV4LCBhcmcpCisjZWxzZQorI2RlZmluZSBzd2ltM19kYmcoZm10LCBhcmcuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgZmxvcHB5X3N0YXRlIGZsb3BweV9zdGF0ZXNbTUFYX0ZMT1BQSUVTXTsKIHN0YXRpYyBpbnQgZmxvcHB5X2NvdW50ID0gMDsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc3dpbTNfbG9jayk7CkBAIC0yMjQsMTcgKzIzNSw4IEBACiAJMCwgMCwgMCwgMCwgMCwgMAogfTsKIAotc3RhdGljIHZvaWQgc3dpbTNfc2VsZWN0KHN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzLCBpbnQgc2VsKTsKLXN0YXRpYyB2b2lkIHN3aW0zX2FjdGlvbihzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcywgaW50IGFjdGlvbik7Ci1zdGF0aWMgaW50IHN3aW0zX3JlYWRiaXQoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMsIGludCBiaXQpOwotc3RhdGljIHZvaWQgZG9fZmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpOwotc3RhdGljIHZvaWQgc3RhcnRfcmVxdWVzdChzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyk7Ci1zdGF0aWMgdm9pZCBzZXRfdGltZW91dChzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcywgaW50IG50aWNrcywKLQkJCXZvaWQgKCpwcm9jKSh1bnNpZ25lZCBsb25nKSk7Ci1zdGF0aWMgdm9pZCBzY2FuX3RyYWNrKHN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzKTsKIHN0YXRpYyB2b2lkIHNlZWtfdHJhY2soc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMsIGludCBuKTsKIHN0YXRpYyB2b2lkIGluaXRfZG1hKHN0cnVjdCBkYmRtYV9jbWQgKmNwLCBpbnQgY21kLCB2b2lkICpidWYsIGludCBjb3VudCk7Ci1zdGF0aWMgdm9pZCBzZXR1cF90cmFuc2ZlcihzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyk7CiBzdGF0aWMgdm9pZCBhY3Qoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMpOwogc3RhdGljIHZvaWQgc2Nhbl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBzdGF0aWMgdm9pZCBzZWVrX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKTsKQEAgLTI1NCwyMCArMjU2LDIzIEBACiAJCQkJCXVuc2lnbmVkIGludCBjbGVhcmluZyk7CiBzdGF0aWMgaW50IGZsb3BweV9yZXZhbGlkYXRlKHN0cnVjdCBnZW5kaXNrICpkaXNrKTsKIAotc3RhdGljIGJvb2wgc3dpbTNfZW5kX3JlcXVlc3QoaW50IGVyciwgdW5zaWduZWQgaW50IG5yX2J5dGVzKQorc3RhdGljIGJvb2wgc3dpbTNfZW5kX3JlcXVlc3Qoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMsIGludCBlcnIsIHVuc2lnbmVkIGludCBucl9ieXRlcykKIHsKLQlpZiAoX19ibGtfZW5kX3JlcXVlc3QoZmRfcmVxLCBlcnIsIG5yX2J5dGVzKSkKKwlzdHJ1Y3QgcmVxdWVzdCAqcmVxID0gZnMtPmN1cl9yZXE7CisJaW50IHJjOworCisJc3dpbTNfZGJnKCIgIGVuZCByZXF1ZXN0LCBlcnI9JWQgbnJfYnl0ZXM9JWQsIGN1cl9yZXE9JXBcbiIsCisJCSAgZXJyLCBucl9ieXRlcywgcmVxKTsKKworCWlmIChlcnIpCisJCW5yX2J5dGVzID0gYmxrX3JxX2N1cl9ieXRlcyhyZXEpOworCXJjID0gX19ibGtfZW5kX3JlcXVlc3QocmVxLCBlcnIsIG5yX2J5dGVzKTsKKwlpZiAocmMpCiAJCXJldHVybiB0cnVlOwotCi0JZmRfcmVxID0gTlVMTDsKKwlmcy0+Y3VyX3JlcSA9IE5VTEw7CiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBzd2ltM19lbmRfcmVxdWVzdF9jdXIoaW50IGVycikKLXsKLQlyZXR1cm4gc3dpbTNfZW5kX3JlcXVlc3QoZXJyLCBibGtfcnFfY3VyX2J5dGVzKGZkX3JlcSkpOwotfQotCiBzdGF0aWMgdm9pZCBzd2ltM19zZWxlY3Qoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMsIGludCBzZWwpCiB7CiAJc3RydWN0IHN3aW0zIF9faW9tZW0gKnN3ID0gZnMtPnN3aW0zOwpAQCAtMzAzLDUwICszMDgsNTMgQEAKIAlyZXR1cm4gKHN0YXQgJiBEQVRBKSA9PSAwOwogfQogCi1zdGF0aWMgdm9pZCBkb19mZF9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICogcSkKLXsKLQlpbnQgaTsKLQotCWZvcihpPTA7IGk8ZmxvcHB5X2NvdW50OyBpKyspIHsKLQkJc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMgPSAmZmxvcHB5X3N0YXRlc1tpXTsKLQkJaWYgKGZzLT5tZGV2LT5tZWRpYV9iYXkgJiYKLQkJICAgIGNoZWNrX21lZGlhX2JheShmcy0+bWRldi0+bWVkaWFfYmF5KSAhPSBNQl9GRCkKLQkJCWNvbnRpbnVlOwotCQlzdGFydF9yZXF1ZXN0KGZzKTsKLQl9Ci19Ci0KIHN0YXRpYyB2b2lkIHN0YXJ0X3JlcXVlc3Qoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMpCiB7CiAJc3RydWN0IHJlcXVlc3QgKnJlcTsKIAl1bnNpZ25lZCBsb25nIHg7CiAKKwlzd2ltM19kYmcoInN0YXJ0IHJlcXVlc3QsIGluaXRpYWwgc3RhdGU9JWRcbiIsIGZzLT5zdGF0ZSk7CisKIAlpZiAoZnMtPnN0YXRlID09IGlkbGUgJiYgZnMtPndhbnRlZCkgewogCQlmcy0+c3RhdGUgPSBhdmFpbGFibGU7CiAJCXdha2VfdXAoJmZzLT53YWl0KTsKIAkJcmV0dXJuOwogCX0KIAl3aGlsZSAoZnMtPnN0YXRlID09IGlkbGUpIHsKLQkJaWYgKCFmZF9yZXEpIHsKLQkJCWZkX3JlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KHN3aW0zX3F1ZXVlKTsKLQkJCWlmICghZmRfcmVxKQorCQlzd2ltM19kYmcoInN0YXJ0IHJlcXVlc3QsIGlkbGUgbG9vcCwgY3VyX3JlcT0lcFxuIiwgZnMtPmN1cl9yZXEpOworCQlpZiAoIWZzLT5jdXJfcmVxKSB7CisJCQlmcy0+Y3VyX3JlcSA9IGJsa19mZXRjaF9yZXF1ZXN0KGRpc2tzW2ZzLT5pbmRleF0tPnF1ZXVlKTsKKwkJCXN3aW0zX2RiZygiICBmZXRjaGVkIHJlcXVlc3QgJXBcbiIsIGZzLT5jdXJfcmVxKTsKKwkJCWlmICghZnMtPmN1cl9yZXEpCiAJCQkJYnJlYWs7CiAJCX0KLQkJcmVxID0gZmRfcmVxOwotI2lmIDAKLQkJcHJpbnRrKCJkb19mZF9yZXE6IGRldj0lcyBjbWQ9JWQgc2VjPSVsZCBucl9zZWM9JXUgYnVmPSVwXG4iLAotCQkgICAgICAgcmVxLT5ycV9kaXNrLT5kaXNrX25hbWUsIHJlcS0+Y21kLAotCQkgICAgICAgKGxvbmcpYmxrX3JxX3BvcyhyZXEpLCBibGtfcnFfc2VjdG9ycyhyZXEpLCByZXEtPmJ1ZmZlcik7Ci0JCXByaW50aygiICAgICAgICAgICBlcnJvcnM9JWQgY3VycmVudF9ucl9zZWN0b3JzPSV1XG4iLAotCQkgICAgICAgcmVxLT5lcnJvcnMsIGJsa19ycV9jdXJfc2VjdG9ycyhyZXEpKTsKKwkJcmVxID0gZnMtPmN1cl9yZXE7CisKKwkJaWYgKGZzLT5tZGV2LT5tZWRpYV9iYXkgJiYKKwkJICAgIGNoZWNrX21lZGlhX2JheShmcy0+bWRldi0+bWVkaWFfYmF5KSAhPSBNQl9GRCkgeworCQkJc3dpbTNfZGJnKCIlcyIsICIgIG1lZGlhIGJheSBhYnNlbnQsIGRyb3BwaW5nIHJlcVxuIik7CisJCQlzd2ltM19lbmRfcmVxdWVzdChmcywgLUVOT0RFViwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCisjaWYgMCAvKiBUaGlzIGlzIHJlYWxseSB0b28gdmVyYm9zZSAqLworCQlzd2ltM19kYmcoImRvX2ZkX3JlcTogZGV2PSVzIGNtZD0lZCBzZWM9JWxkIG5yX3NlYz0ldSBidWY9JXBcbiIsCisJCQkgIHJlcS0+cnFfZGlzay0+ZGlza19uYW1lLCByZXEtPmNtZCwKKwkJCSAgKGxvbmcpYmxrX3JxX3BvcyhyZXEpLCBibGtfcnFfc2VjdG9ycyhyZXEpLAorCQkJICByZXEtPmJ1ZmZlcik7CisJCXN3aW0zX2RiZygiICAgICAgICAgICBlcnJvcnM9JWQgY3VycmVudF9ucl9zZWN0b3JzPSV1XG4iLAorCQkJICByZXEtPmVycm9ycywgYmxrX3JxX2N1cl9zZWN0b3JzKHJlcSkpOwogI2VuZGlmCiAKIAkJaWYgKGJsa19ycV9wb3MocmVxKSA+PSBmcy0+dG90YWxfc2VjcykgewotCQkJc3dpbTNfZW5kX3JlcXVlc3RfY3VyKC1FSU8pOworCQkJc3dpbTNfZGJnKCIgIHBvcyBvdXQgb2YgYm91bmRzICglbGQsIG1heCBpcyAlbGQpXG4iLAorCQkJCSAgKGxvbmcpYmxrX3JxX3BvcyhyZXEpLCAobG9uZylmcy0+dG90YWxfc2Vjcyk7CisJCQlzd2ltM19lbmRfcmVxdWVzdChmcywgLUVJTywgMCk7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoZnMtPmVqZWN0ZWQpIHsKLQkJCXN3aW0zX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKKwkJCXN3aW0zX2RiZygiJXMiLCAiICBkaXNrIGVqZWN0ZWRcbiIpOworCQkJc3dpbTNfZW5kX3JlcXVlc3QoZnMsIC1FSU8sIDApOwogCQkJY29udGludWU7CiAJCX0KIApAQCAtMzU0LDcgKzM2Miw4IEBACiAJCQlpZiAoZnMtPndyaXRlX3Byb3QgPCAwKQogCQkJCWZzLT53cml0ZV9wcm90ID0gc3dpbTNfcmVhZGJpdChmcywgV1JJVEVfUFJPVCk7CiAJCQlpZiAoZnMtPndyaXRlX3Byb3QpIHsKLQkJCQlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CisJCQkJc3dpbTNfZGJnKCIlcyIsICIgIHRyeSB0byB3cml0ZSwgZGlzayB3cml0ZSBwcm90ZWN0ZWRcbiIpOworCQkJCXN3aW0zX2VuZF9yZXF1ZXN0KGZzLCAtRUlPLCAwKTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJfQpAQCAtMzY5LDcgKzM3OCw2IEBACiAJCXggPSAoKGxvbmcpYmxrX3JxX3BvcyhyZXEpKSAlIGZzLT5zZWNwZXJjeWw7CiAJCWZzLT5oZWFkID0geCAvIGZzLT5zZWNwZXJ0cmFjazsKIAkJZnMtPnJlcV9zZWN0b3IgPSB4ICUgZnMtPnNlY3BlcnRyYWNrICsgMTsKLQkJZmRfcmVxID0gcmVxOwogCQlmcy0+c3RhdGUgPSBkb190cmFuc2ZlcjsKIAkJZnMtPnJldHJpZXMgPSAwOwogCkBAIC0zNzcsMTIgKzM4NSwxNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgZG9fZmRfcmVxdWVzdChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqIHEpCit7CisJc3RhcnRfcmVxdWVzdChxLT5xdWV1ZWRhdGEpOworfQorCiBzdGF0aWMgdm9pZCBzZXRfdGltZW91dChzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcywgaW50IG50aWNrcywKIAkJCXZvaWQgKCpwcm9jKSh1bnNpZ25lZCBsb25nKSkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmZzLT5sb2NrLCBmbGFncyk7CiAJaWYgKGZzLT50aW1lb3V0X3BlbmRpbmcpCiAJCWRlbF90aW1lcigmZnMtPnRpbWVvdXQpOwogCWZzLT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgbnRpY2tzOwpAQCAtMzkwLDcgKzQwMCw2IEBACiAJZnMtPnRpbWVvdXQuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBmczsKIAlhZGRfdGltZXIoJmZzLT50aW1lb3V0KTsKIAlmcy0+dGltZW91dF9wZW5kaW5nID0gMTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcy0+bG9jaywgZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2Nhbl90cmFjayhzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcykKQEAgLTQ0Miw0MCArNDUxLDQ1IEBACiAJc3RydWN0IHN3aW0zIF9faW9tZW0gKnN3ID0gZnMtPnN3aW0zOwogCXN0cnVjdCBkYmRtYV9jbWQgKmNwID0gZnMtPmRtYV9jbWQ7CiAJc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqZHIgPSBmcy0+ZG1hOworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBmcy0+Y3VyX3JlcTsKIAotCWlmIChibGtfcnFfY3VyX3NlY3RvcnMoZmRfcmVxKSA8PSAwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAic3dpbTM6IHRyYW5zZmVyIDAgc2VjdG9ycz9cbiIpOworCWlmIChibGtfcnFfY3VyX3NlY3RvcnMocmVxKSA8PSAwKSB7CisJCXN3aW0zX3dhcm4oIiVzIiwgIlRyYW5zZmVyIDAgc2VjdG9ycyA/XG4iKTsKIAkJcmV0dXJuOwogCX0KLQlpZiAocnFfZGF0YV9kaXIoZmRfcmVxKSA9PSBXUklURSkKKwlpZiAocnFfZGF0YV9kaXIocmVxKSA9PSBXUklURSkKIAkJbiA9IDE7CiAJZWxzZSB7CiAJCW4gPSBmcy0+c2VjcGVydHJhY2sgLSBmcy0+cmVxX3NlY3RvciArIDE7Ci0JCWlmIChuID4gYmxrX3JxX2N1cl9zZWN0b3JzKGZkX3JlcSkpCi0JCQluID0gYmxrX3JxX2N1cl9zZWN0b3JzKGZkX3JlcSk7CisJCWlmIChuID4gYmxrX3JxX2N1cl9zZWN0b3JzKHJlcSkpCisJCQluID0gYmxrX3JxX2N1cl9zZWN0b3JzKHJlcSk7CiAJfQorCisJc3dpbTNfZGJnKCIgIHNldHVwIHhmZXIgYXQgc2VjdCAlZCAob2YgJWQpIGhlYWQgJWQgZm9yICVkXG4iLAorCQkgIGZzLT5yZXFfc2VjdG9yLCBmcy0+c2VjcGVydHJhY2ssIGZzLT5oZWFkLCBuKTsKKwogCWZzLT5zY291bnQgPSBuOwogCXN3aW0zX3NlbGVjdChmcywgZnMtPmhlYWQ/IFJFQURfREFUQV8xOiBSRUFEX0RBVEFfMCk7CiAJb3V0XzgoJnN3LT5zZWN0b3IsIGZzLT5yZXFfc2VjdG9yKTsKIAlvdXRfOCgmc3ctPm5zZWN0LCBuKTsKIAlvdXRfOCgmc3ctPmdhcDMsIDApOwogCW91dF9sZTMyKCZkci0+Y21kcHRyLCB2aXJ0X3RvX2J1cyhjcCkpOwotCWlmIChycV9kYXRhX2RpcihmZF9yZXEpID09IFdSSVRFKSB7CisJaWYgKHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEUpIHsKIAkJLyogU2V0IHVwIDMgZG1hIGNvbW1hbmRzOiB3cml0ZSBwcmVhbWJsZSwgZGF0YSwgcG9zdGFtYmxlICovCiAJCWluaXRfZG1hKGNwLCBPVVRQVVRfTU9SRSwgd3JpdGVfcHJlYW1ibGUsIHNpemVvZih3cml0ZV9wcmVhbWJsZSkpOwogCQkrK2NwOwotCQlpbml0X2RtYShjcCwgT1VUUFVUX01PUkUsIGZkX3JlcS0+YnVmZmVyLCA1MTIpOworCQlpbml0X2RtYShjcCwgT1VUUFVUX01PUkUsIHJlcS0+YnVmZmVyLCA1MTIpOwogCQkrK2NwOwogCQlpbml0X2RtYShjcCwgT1VUUFVUX0xBU1QsIHdyaXRlX3Bvc3RhbWJsZSwgc2l6ZW9mKHdyaXRlX3Bvc3RhbWJsZSkpOwogCX0gZWxzZSB7Ci0JCWluaXRfZG1hKGNwLCBJTlBVVF9MQVNULCBmZF9yZXEtPmJ1ZmZlciwgbiAqIDUxMik7CisJCWluaXRfZG1hKGNwLCBJTlBVVF9MQVNULCByZXEtPmJ1ZmZlciwgbiAqIDUxMik7CiAJfQogCSsrY3A7CiAJb3V0X2xlMTYoJmNwLT5jb21tYW5kLCBEQkRNQV9TVE9QKTsKIAlvdXRfOCgmc3ctPmNvbnRyb2xfYmljLCBET19BQ1RJT04gfCBXUklURV9TRUNUT1JTKTsKIAlpbl84KCZzdy0+ZXJyb3IpOwogCW91dF84KCZzdy0+Y29udHJvbF9iaWMsIERPX0FDVElPTiB8IFdSSVRFX1NFQ1RPUlMpOwotCWlmIChycV9kYXRhX2RpcihmZF9yZXEpID09IFdSSVRFKQorCWlmIChycV9kYXRhX2RpcihyZXEpID09IFdSSVRFKQogCQlvdXRfOCgmc3ctPmNvbnRyb2xfYmlzLCBXUklURV9TRUNUT1JTKTsKIAlpbl84KCZzdy0+aW50cik7CiAJb3V0X2xlMzIoJmRyLT5jb250cm9sLCAoUlVOIDw8IDE2KSB8IFJVTik7CkBAIC00ODgsMTIgKzUwMiwxNiBAQAogc3RhdGljIHZvaWQgYWN0KHN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzKQogewogCWZvciAoOzspIHsKKwkJc3dpbTNfZGJnKCIgIGFjdCBsb29wLCBzdGF0ZT0lZCwgcmVxX2N5bD0lZCwgY3VyX2N5bD0lZFxuIiwKKwkJCSAgZnMtPnN0YXRlLCBmcy0+cmVxX2N5bCwgZnMtPmN1cl9jeWwpOworCiAJCXN3aXRjaCAoZnMtPnN0YXRlKSB7CiAJCWNhc2UgaWRsZToKIAkJCXJldHVybjsJCS8qIFhYWCBzaG91bGRuJ3QgZ2V0IGhlcmUgKi8KIAogCQljYXNlIGxvY2F0aW5nOgogCQkJaWYgKHN3aW0zX3JlYWRiaXQoZnMsIFRSQUNLX1pFUk8pKSB7CisJCQkJc3dpbTNfZGJnKCIlcyIsICIgICAgbG9jYXRlIHRyYWNrIDBcbiIpOwogCQkJCWZzLT5jdXJfY3lsID0gMDsKIAkJCQlpZiAoZnMtPnJlcV9jeWwgPT0gMCkKIAkJCQkJZnMtPnN0YXRlID0gZG9fdHJhbnNmZXI7CkBAIC01MTEsNyArNTI5LDcgQEAKIAkJCQlicmVhazsKIAkJCX0KIAkJCWlmIChmcy0+cmVxX2N5bCA9PSBmcy0+Y3VyX2N5bCkgewotCQkJCXByaW50aygid2hvb3BzLCBzZWVraW5nIDBcbiIpOworCQkJCXN3aW0zX3dhcm4oIiVzIiwgIldob29wcywgc2Vla2luZyAwXG4iKTsKIAkJCQlmcy0+c3RhdGUgPSBkb190cmFuc2ZlcjsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTUyNyw3ICs1NDUsOSBAQAogCQljYXNlIGRvX3RyYW5zZmVyOgogCQkJaWYgKGZzLT5jdXJfY3lsICE9IGZzLT5yZXFfY3lsKSB7CiAJCQkJaWYgKGZzLT5yZXRyaWVzID4gNSkgewotCQkJCQlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CisJCQkJCXN3aW0zX2VycigiV3JvbmcgY3lsaW5kZXIgaW4gdHJhbnNmZXIsIHdhbnQ6ICVkIGdvdCAlZFxuIiwKKwkJCQkJCSAgZnMtPnJlcV9jeWwsIGZzLT5jdXJfY3lsKTsKKwkJCQkJc3dpbTNfZW5kX3JlcXVlc3QoZnMsIC1FSU8sIDApOwogCQkJCQlmcy0+c3RhdGUgPSBpZGxlOwogCQkJCQlyZXR1cm47CiAJCQkJfQpAQCAtNTQyLDcgKzU2Miw3IEBACiAJCQlyZXR1cm47CiAKIAkJZGVmYXVsdDoKLQkJCXByaW50ayhLRVJOX0VSUiJzd2ltMzogdW5rbm93biBzdGF0ZSAlZFxuIiwgZnMtPnN0YXRlKTsKKwkJCXN3aW0zX2VycigiVW5rbm93biBzdGF0ZSAlZFxuIiwgZnMtPnN0YXRlKTsKIAkJCXJldHVybjsKIAkJfQogCX0KQEAgLTU1Miw1OSArNTcyLDc1IEBACiB7CiAJc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMgPSAoc3RydWN0IGZsb3BweV9zdGF0ZSAqKSBkYXRhOwogCXN0cnVjdCBzd2ltMyBfX2lvbWVtICpzdyA9IGZzLT5zd2ltMzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3dpbTNfZGJnKCIqIHNjYW4gdGltZW91dCwgc3RhdGU9JWRcbiIsIGZzLT5zdGF0ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3dpbTNfbG9jaywgZmxhZ3MpOwogCWZzLT50aW1lb3V0X3BlbmRpbmcgPSAwOwogCW91dF84KCZzdy0+Y29udHJvbF9iaWMsIERPX0FDVElPTiB8IFdSSVRFX1NFQ1RPUlMpOwogCW91dF84KCZzdy0+c2VsZWN0LCBSRUxBWCk7CiAJb3V0XzgoJnN3LT5pbnRyX2VuYWJsZSwgMCk7CiAJZnMtPmN1cl9jeWwgPSAtMTsKIAlpZiAoZnMtPnJldHJpZXMgPiA1KSB7Ci0JCXN3aW0zX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKKwkJc3dpbTNfZW5kX3JlcXVlc3QoZnMsIC1FSU8sIDApOwogCQlmcy0+c3RhdGUgPSBpZGxlOwogCQlzdGFydF9yZXF1ZXN0KGZzKTsKIAl9IGVsc2UgewogCQlmcy0+c3RhdGUgPSBqb2dnaW5nOwogCQlhY3QoZnMpOwogCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzd2ltM19sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyB2b2lkIHNlZWtfdGltZW91dCh1bnNpZ25lZCBsb25nIGRhdGEpCiB7CiAJc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMgPSAoc3RydWN0IGZsb3BweV9zdGF0ZSAqKSBkYXRhOwogCXN0cnVjdCBzd2ltMyBfX2lvbWVtICpzdyA9IGZzLT5zd2ltMzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCisJc3dpbTNfZGJnKCIqIHNlZWsgdGltZW91dCwgc3RhdGU9JWRcbiIsIGZzLT5zdGF0ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3dpbTNfbG9jaywgZmxhZ3MpOwogCWZzLT50aW1lb3V0X3BlbmRpbmcgPSAwOwogCW91dF84KCZzdy0+Y29udHJvbF9iaWMsIERPX1NFRUspOwogCW91dF84KCZzdy0+c2VsZWN0LCBSRUxBWCk7CiAJb3V0XzgoJnN3LT5pbnRyX2VuYWJsZSwgMCk7Ci0JcHJpbnRrKEtFUk5fRVJSICJzd2ltMzogc2VlayB0aW1lb3V0XG4iKTsKLQlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CisJc3dpbTNfZXJyKCIlcyIsICJTZWVrIHRpbWVvdXRcbiIpOworCXN3aW0zX2VuZF9yZXF1ZXN0KGZzLCAtRUlPLCAwKTsKIAlmcy0+c3RhdGUgPSBpZGxlOwogCXN0YXJ0X3JlcXVlc3QoZnMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN3aW0zX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgc2V0dGxlX3RpbWVvdXQodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzID0gKHN0cnVjdCBmbG9wcHlfc3RhdGUgKikgZGF0YTsKIAlzdHJ1Y3Qgc3dpbTMgX19pb21lbSAqc3cgPSBmcy0+c3dpbTM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXN3aW0zX2RiZygiKiBzZXR0bGUgdGltZW91dCwgc3RhdGU9JWRcbiIsIGZzLT5zdGF0ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3dpbTNfbG9jaywgZmxhZ3MpOwogCWZzLT50aW1lb3V0X3BlbmRpbmcgPSAwOwogCWlmIChzd2ltM19yZWFkYml0KGZzLCBTRUVLX0NPTVBMRVRFKSkgewogCQlvdXRfOCgmc3ctPnNlbGVjdCwgUkVMQVgpOwogCQlmcy0+c3RhdGUgPSBsb2NhdGluZzsKIAkJYWN0KGZzKTsKLQkJcmV0dXJuOworCQlnb3RvIHVubG9jazsKIAl9CiAJb3V0XzgoJnN3LT5zZWxlY3QsIFJFTEFYKTsKIAlpZiAoZnMtPnNldHRsZV90aW1lIDwgMipIWikgewogCQkrK2ZzLT5zZXR0bGVfdGltZTsKIAkJc2V0X3RpbWVvdXQoZnMsIDEsIHNldHRsZV90aW1lb3V0KTsKLQkJcmV0dXJuOworCQlnb3RvIHVubG9jazsKIAl9Ci0JcHJpbnRrKEtFUk5fRVJSICJzd2ltMzogc2VlayBzZXR0bGUgdGltZW91dFxuIik7Ci0Jc3dpbTNfZW5kX3JlcXVlc3RfY3VyKC1FSU8pOworCXN3aW0zX2VycigiJXMiLCAiU2VlayBzZXR0bGUgdGltZW91dFxuIik7CisJc3dpbTNfZW5kX3JlcXVlc3QoZnMsIC1FSU8sIDApOwogCWZzLT5zdGF0ZSA9IGlkbGU7CiAJc3RhcnRfcmVxdWVzdChmcyk7CisgdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN3aW0zX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgeGZlcl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgZGF0YSkKQEAgLTYxMiw4ICs2NDgsMTIgQEAKIAlzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcyA9IChzdHJ1Y3QgZmxvcHB5X3N0YXRlICopIGRhdGE7CiAJc3RydWN0IHN3aW0zIF9faW9tZW0gKnN3ID0gZnMtPnN3aW0zOwogCXN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKmRyID0gZnMtPmRtYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBuOwogCisJc3dpbTNfZGJnKCIqIHhmZXIgdGltZW91dCwgc3RhdGU9JWRcbiIsIGZzLT5zdGF0ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3dpbTNfbG9jaywgZmxhZ3MpOwogCWZzLT50aW1lb3V0X3BlbmRpbmcgPSAwOwogCW91dF9sZTMyKCZkci0+Y29udHJvbCwgUlVOIDw8IDE2KTsKIAkvKiBXZSBtdXN0IHdhaXQgYSBiaXQgZm9yIGRiZG1hIHRvIHN0b3AgKi8KQEAgLTYyMiwxMiArNjYyLDEzIEBACiAJb3V0XzgoJnN3LT5pbnRyX2VuYWJsZSwgMCk7CiAJb3V0XzgoJnN3LT5jb250cm9sX2JpYywgV1JJVEVfU0VDVE9SUyB8IERPX0FDVElPTik7CiAJb3V0XzgoJnN3LT5zZWxlY3QsIFJFTEFYKTsKLQlwcmludGsoS0VSTl9FUlIgInN3aW0zOiB0aW1lb3V0ICVzaW5nIHNlY3RvciAlbGRcbiIsCi0JICAgICAgIChycV9kYXRhX2RpcihmZF9yZXEpPT1XUklURT8gIndyaXQiOiAicmVhZCIpLAotCSAgICAgICAobG9uZylibGtfcnFfcG9zKGZkX3JlcSkpOwotCXN3aW0zX2VuZF9yZXF1ZXN0X2N1cigtRUlPKTsKKwlzd2ltM19lcnIoIlRpbWVvdXQgJXNpbmcgc2VjdG9yICVsZFxuIiwKKwkgICAgICAgKHJxX2RhdGFfZGlyKGZzLT5jdXJfcmVxKT09V1JJVEU/ICJ3cml0IjogInJlYWQiKSwKKwkgICAgICAgKGxvbmcpYmxrX3JxX3Bvcyhmcy0+Y3VyX3JlcSkpOworCXN3aW0zX2VuZF9yZXF1ZXN0KGZzLCAtRUlPLCAwKTsKIAlmcy0+c3RhdGUgPSBpZGxlOwogCXN0YXJ0X3JlcXVlc3QoZnMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN3aW0zX2xvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIGlycXJldHVybl90IHN3aW0zX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCkBAIC02MzgsMTIgKzY3OSwxNyBAQAogCWludCBzdGF0LCByZXNpZDsKIAlzdHJ1Y3QgZGJkbWFfcmVncyBfX2lvbWVtICpkcjsKIAlzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCByZXF1ZXN0ICpyZXEgPSBmcy0+Y3VyX3JlcTsKIAorCXN3aW0zX2RiZygiKiBpbnRlcnJ1cHQsIHN0YXRlPSVkXG4iLCBmcy0+c3RhdGUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN3aW0zX2xvY2ssIGZsYWdzKTsKIAlpbnRyID0gaW5fOCgmc3ctPmludHIpOwogCWVyciA9IChpbnRyICYgRVJST1JfSU5UUik/IGluXzgoJnN3LT5lcnJvcik6IDA7CiAJaWYgKChpbnRyICYgRVJST1JfSU5UUikgJiYgZnMtPnN0YXRlICE9IGRvX3RyYW5zZmVyKQotCQlwcmludGsoS0VSTl9FUlIgInN3aW0zX2ludGVycnVwdCwgc3RhdGU9JWQsIGRpcj0leCwgaW50cj0leCwgZXJyPSV4XG4iLAotCQkgICAgICAgZnMtPnN0YXRlLCBycV9kYXRhX2RpcihmZF9yZXEpLCBpbnRyLCBlcnIpOworCQlzd2ltM19lcnIoIk5vbi10cmFuc2ZlciBlcnJvciBpbnRlcnJ1cHQ6IHN0YXRlPSVkLCBkaXI9JXgsIGludHI9JXgsIGVycj0leFxuIiwKKwkJCSAgZnMtPnN0YXRlLCBycV9kYXRhX2RpcihyZXEpLCBpbnRyLCBlcnIpOwogCXN3aXRjaCAoZnMtPnN0YXRlKSB7CiAJY2FzZSBsb2NhdGluZzoKIAkJaWYgKGludHIgJiBTRUVOX1NFQ1RPUikgewpAQCAtNjUzLDEwICs2OTksMTAgQEAKIAkJCWRlbF90aW1lcigmZnMtPnRpbWVvdXQpOwogCQkJZnMtPnRpbWVvdXRfcGVuZGluZyA9IDA7CiAJCQlpZiAoc3ctPmN0cmFjayA9PSAweGZmKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJzd2ltMzogc2VlbiBzZWN0b3IgYnV0IGN5bD1mZj9cbiIpOworCQkJCXN3aW0zX2VycigiJXMiLCAiU2VlbiBzZWN0b3IgYnV0IGN5bD1mZj9cbiIpOwogCQkJCWZzLT5jdXJfY3lsID0gLTE7CiAJCQkJaWYgKGZzLT5yZXRyaWVzID4gNSkgewotCQkJCQlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CisJCQkJCXN3aW0zX2VuZF9yZXF1ZXN0KGZzLCAtRUlPLCAwKTsKIAkJCQkJZnMtPnN0YXRlID0gaWRsZTsKIAkJCQkJc3RhcnRfcmVxdWVzdChmcyk7CiAJCQkJfSBlbHNlIHsKQEAgLTY2OCw4ICs3MTQsOCBAQAogCQkJZnMtPmN1cl9jeWwgPSBzdy0+Y3RyYWNrOwogCQkJZnMtPmN1cl9zZWN0b3IgPSBzdy0+Y3NlY3Q7CiAJCQlpZiAoZnMtPmV4cGVjdF9jeWwgIT0gLTEgJiYgZnMtPmV4cGVjdF9jeWwgIT0gZnMtPmN1cl9jeWwpCi0JCQkJcHJpbnRrKEtFUk5fRVJSICJzd2ltMzogZXhwZWN0ZWQgY3lsICVkLCBnb3QgJWRcbiIsCi0JCQkJICAgICAgIGZzLT5leHBlY3RfY3lsLCBmcy0+Y3VyX2N5bCk7CisJCQkJc3dpbTNfZXJyKCJFeHBlY3RlZCBjeWwgJWQsIGdvdCAlZFxuIiwKKwkJCQkJICBmcy0+ZXhwZWN0X2N5bCwgZnMtPmN1cl9jeWwpOwogCQkJZnMtPnN0YXRlID0gZG9fdHJhbnNmZXI7CiAJCQlhY3QoZnMpOwogCQl9CkBAIC03MDQsNyArNzUwLDcgQEAKIAkJZnMtPnRpbWVvdXRfcGVuZGluZyA9IDA7CiAJCWRyID0gZnMtPmRtYTsKIAkJY3AgPSBmcy0+ZG1hX2NtZDsKLQkJaWYgKHJxX2RhdGFfZGlyKGZkX3JlcSkgPT0gV1JJVEUpCisJCWlmIChycV9kYXRhX2RpcihyZXEpID09IFdSSVRFKQogCQkJKytjcDsKIAkJLyoKIAkJICogQ2hlY2sgdGhhdCB0aGUgbWFpbiBkYXRhIHRyYW5zZmVyIGhhcyBmaW5pc2hlZC4KQEAgLTcyOSwzMSArNzc1LDMyIEBACiAJCWlmIChpbnRyICYgRVJST1JfSU5UUikgewogCQkJbiA9IGZzLT5zY291bnQgLSAxIC0gcmVzaWQgLyA1MTI7CiAJCQlpZiAobiA+IDApIHsKLQkJCQlibGtfdXBkYXRlX3JlcXVlc3QoZmRfcmVxLCAwLCBuIDw8IDkpOworCQkJCWJsa191cGRhdGVfcmVxdWVzdChyZXEsIDAsIG4gPDwgOSk7CiAJCQkJZnMtPnJlcV9zZWN0b3IgKz0gbjsKIAkJCX0KIAkJCWlmIChmcy0+cmV0cmllcyA8IDUpIHsKIAkJCQkrK2ZzLT5yZXRyaWVzOwogCQkJCWFjdChmcyk7CiAJCQl9IGVsc2UgewotCQkJCXByaW50aygic3dpbTM6IGVycm9yICVzaW5nIGJsb2NrICVsZCAoZXJyPSV4KVxuIiwKLQkJCQkgICAgICAgcnFfZGF0YV9kaXIoZmRfcmVxKSA9PSBXUklURT8gIndyaXQiOiAicmVhZCIsCi0JCQkJICAgICAgIChsb25nKWJsa19ycV9wb3MoZmRfcmVxKSwgZXJyKTsKLQkJCQlzd2ltM19lbmRfcmVxdWVzdF9jdXIoLUVJTyk7CisJCQkJc3dpbTNfZXJyKCJFcnJvciAlc2luZyBibG9jayAlbGQgKGVycj0leClcbiIsCisJCQkJICAgICAgIHJxX2RhdGFfZGlyKHJlcSkgPT0gV1JJVEU/ICJ3cml0IjogInJlYWQiLAorCQkJCSAgICAgICAobG9uZylibGtfcnFfcG9zKHJlcSksIGVycik7CisJCQkJc3dpbTNfZW5kX3JlcXVlc3QoZnMsIC1FSU8sIDApOwogCQkJCWZzLT5zdGF0ZSA9IGlkbGU7CiAJCQl9CiAJCX0gZWxzZSB7CiAJCQlpZiAoKHN0YXQgJiBBQ1RJVkUpID09IDAgfHwgcmVzaWQgIT0gMCkgewogCQkJCS8qIG11c3RhIGJlZW4gYW4gZXJyb3IgKi8KLQkJCQlwcmludGsoS0VSTl9FUlIgInN3aW0zOiBmZCBkbWE6IHN0YXQ9JXggcmVzaWQ9JWRcbiIsIHN0YXQsIHJlc2lkKTsKLQkJCQlwcmludGsoS0VSTl9FUlIgIiAgc3RhdGU9JWQsIGRpcj0leCwgaW50cj0leCwgZXJyPSV4XG4iLAotCQkJCSAgICAgICBmcy0+c3RhdGUsIHJxX2RhdGFfZGlyKGZkX3JlcSksIGludHIsIGVycik7Ci0JCQkJc3dpbTNfZW5kX3JlcXVlc3RfY3VyKC1FSU8pOworCQkJCXN3aW0zX2VycigiZmQgZG1hIGVycm9yOiBzdGF0PSV4IHJlc2lkPSVkXG4iLCBzdGF0LCByZXNpZCk7CisJCQkJc3dpbTNfZXJyKCIgIHN0YXRlPSVkLCBkaXI9JXgsIGludHI9JXgsIGVycj0leFxuIiwKKwkJCQkJICBmcy0+c3RhdGUsIHJxX2RhdGFfZGlyKHJlcSksIGludHIsIGVycik7CisJCQkJc3dpbTNfZW5kX3JlcXVlc3QoZnMsIC1FSU8sIDApOwogCQkJCWZzLT5zdGF0ZSA9IGlkbGU7CiAJCQkJc3RhcnRfcmVxdWVzdChmcyk7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlpZiAoc3dpbTNfZW5kX3JlcXVlc3QoMCwgZnMtPnNjb3VudCA8PCA5KSkgeworCQkJZnMtPnJldHJpZXMgPSAwOworCQkJaWYgKHN3aW0zX2VuZF9yZXF1ZXN0KGZzLCAwLCBmcy0+c2NvdW50IDw8IDkpKSB7CiAJCQkJZnMtPnJlcV9zZWN0b3IgKz0gZnMtPnNjb3VudDsKIAkJCQlpZiAoZnMtPnJlcV9zZWN0b3IgPiBmcy0+c2VjcGVydHJhY2spIHsKIAkJCQkJZnMtPnJlcV9zZWN0b3IgLT0gZnMtPnNlY3BlcnRyYWNrOwpAQCAtNzcwLDggKzgxNyw5IEBACiAJCQlzdGFydF9yZXF1ZXN0KGZzKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fRVJSICJzd2ltMzogZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGluIHN0YXRlICVkXG4iLCBmcy0+c3RhdGUpOworCQlzd2ltM19lcnIoIkRvbid0IGtub3cgd2hhdCB0byBkbyBpbiBzdGF0ZSAlZFxuIiwgZnMtPnN0YXRlKTsKIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3dpbTNfbG9jaywgZmxhZ3MpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtNzgxLDI2ICs4MjksMzEgQEAKIH0KICovCiAKKy8qIENhbGxlZCB1bmRlciB0aGUgbXV0ZXggdG8gZ3JhYiBleGNsdXNpdmUgYWNjZXNzIHRvIGEgZHJpdmUgKi8KIHN0YXRpYyBpbnQgZ3JhYl9kcml2ZShzdHJ1Y3QgZmxvcHB5X3N0YXRlICpmcywgZW51bSBzd2ltX3N0YXRlIHN0YXRlLAogCQkgICAgICBpbnQgaW50ZXJydXB0aWJsZSkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmZzLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGZzLT5zdGF0ZSAhPSBpZGxlKSB7CisJc3dpbTNfZGJnKCIlcyIsICItPiBncmFiIGRyaXZlXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzd2ltM19sb2NrLCBmbGFncyk7CisJaWYgKGZzLT5zdGF0ZSAhPSBpZGxlICYmIGZzLT5zdGF0ZSAhPSBhdmFpbGFibGUpIHsKIAkJKytmcy0+d2FudGVkOwogCQl3aGlsZSAoZnMtPnN0YXRlICE9IGF2YWlsYWJsZSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3dpbTNfbG9jaywgZmxhZ3MpOwogCQkJaWYgKGludGVycnVwdGlibGUgJiYgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCQktLWZzLT53YW50ZWQ7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnMtPmxvY2ssIGZsYWdzKTsKIAkJCQlyZXR1cm4gLUVJTlRSOwogCQkJfQogCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmZnMtPndhaXQpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN3aW0zX2xvY2ssIGZsYWdzKTsKIAkJfQogCQktLWZzLT53YW50ZWQ7CiAJfQogCWZzLT5zdGF0ZSA9IHN0YXRlOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZzLT5sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3dpbTNfbG9jaywgZmxhZ3MpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTgwOCwxMCArODYxLDEyIEBACiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZmcy0+bG9jaywgZmxhZ3MpOworCXN3aW0zX2RiZygiJXMiLCAiLT4gcmVsZWFzZSBkcml2ZVxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3dpbTNfbG9jaywgZmxhZ3MpOwogCWZzLT5zdGF0ZSA9IGlkbGU7CiAJc3RhcnRfcmVxdWVzdChmcyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnMtPmxvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzd2ltM19sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBpbnQgZmRfZWplY3Qoc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMpCkBAIC05NjYsNiArMTAyMSw3IEBACiB7CiAJc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMgPSBkaXNrLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IHN3aW0zIF9faW9tZW0gKnN3ID0gZnMtPnN3aW0zOworCiAJbXV0ZXhfbG9jaygmc3dpbTNfbXV0ZXgpOwogCWlmIChmcy0+cmVmX2NvdW50ID4gMCAmJiAtLWZzLT5yZWZfY291bnQgPT0gMCkgewogCQlzd2ltM19hY3Rpb24oZnMsIE1PVE9SX09GRik7CkBAIC0xMDMxLDMwICsxMDg3LDQ4IEBACiAJLnJldmFsaWRhdGVfZGlzaz0gZmxvcHB5X3JldmFsaWRhdGUsCiB9OwogCitzdGF0aWMgdm9pZCBzd2ltM19tYl9ldmVudChzdHJ1Y3QgbWFjaW9fZGV2KiBtZGV2LCBpbnQgbWJfc3RhdGUpCit7CisJc3RydWN0IGZsb3BweV9zdGF0ZSAqZnMgPSBtYWNpb19nZXRfZHJ2ZGF0YShtZGV2KTsKKwlzdHJ1Y3Qgc3dpbTMgX19pb21lbSAqc3cgPSBmcy0+c3dpbTM7CisKKwlpZiAoIWZzKQorCQlyZXR1cm47CisJaWYgKG1iX3N0YXRlICE9IE1CX0ZEKQorCQlyZXR1cm47CisKKwkvKiBDbGVhciBzdGF0ZSAqLworCW91dF84KCZzdy0+aW50cl9lbmFibGUsIDApOworCWluXzgoJnN3LT5pbnRyKTsKKwlpbl84KCZzdy0+ZXJyb3IpOworfQorCiBzdGF0aWMgaW50IHN3aW0zX2FkZF9kZXZpY2Uoc3RydWN0IG1hY2lvX2RldiAqbWRldiwgaW50IGluZGV4KQogewogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqc3dpbSA9IG1kZXYtPm9mZGV2LmRldi5vZl9ub2RlOwogCXN0cnVjdCBmbG9wcHlfc3RhdGUgKmZzID0gJmZsb3BweV9zdGF0ZXNbaW5kZXhdOwogCWludCByYyA9IC1FQlVTWTsKIAorCS8qIERvIHRoaXMgZmlyc3QgZm9yIG1lc3NhZ2UgbWFjcm9zICovCisJbWVtc2V0KGZzLCAwLCBzaXplb2YoKmZzKSk7CisJZnMtPm1kZXYgPSBtZGV2OworCWZzLT5pbmRleCA9IGluZGV4OworCiAJLyogQ2hlY2sgJiBSZXF1ZXN0IHJlc291cmNlcyAqLwogCWlmIChtYWNpb19yZXNvdXJjZV9jb3VudChtZGV2KSA8IDIpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaWZkJWQ6IG5vIGFkZHJlc3MgZm9yICVzXG4iLAotCQkgICAgICAgaW5kZXgsIHN3aW0tPmZ1bGxfbmFtZSk7CisJCXN3aW0zX2VycigiJXMiLCAiTm8gYWRkcmVzcyBpbiBkZXZpY2UtdHJlZVxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQotCWlmIChtYWNpb19pcnFfY291bnQobWRldikgPCAyKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgImZkJWQ6IG5vIGludHJzIGZvciBkZXZpY2UgJXNcbiIsCi0JCQlpbmRleCwgc3dpbS0+ZnVsbF9uYW1lKTsKKwlpZiAobWFjaW9faXJxX2NvdW50KG1kZXYpIDwgMSkgeworCQlzd2ltM19lcnIoIiVzIiwgIk5vIGludGVycnVwdCBpbiBkZXZpY2UtdHJlZVxuIik7CisJCXJldHVybiAtRU5YSU87CiAJfQogCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlKG1kZXYsIDAsICJzd2ltMyAobW1pbykiKSkgewotCQlwcmludGsoS0VSTl9FUlIgImZkJWQ6IGNhbid0IHJlcXVlc3QgbW1pbyByZXNvdXJjZSBmb3IgJXNcbiIsCi0JCSAgICAgICBpbmRleCwgc3dpbS0+ZnVsbF9uYW1lKTsKKwkJc3dpbTNfZXJyKCIlcyIsICJDYW4ndCByZXF1ZXN0IG1taW8gcmVzb3VyY2VcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAlpZiAobWFjaW9fcmVxdWVzdF9yZXNvdXJjZShtZGV2LCAxLCAic3dpbTMgKGRtYSkiKSkgewotCQlwcmludGsoS0VSTl9FUlIgImZkJWQ6IGNhbid0IHJlcXVlc3QgZG1hIHJlc291cmNlIGZvciAlc1xuIiwKLQkJICAgICAgIGluZGV4LCBzd2ltLT5mdWxsX25hbWUpOworCQlzd2ltM19lcnIoIiVzIiwgIkNhbid0IHJlcXVlc3QgZG1hIHJlc291cmNlXG4iKTsKIAkJbWFjaW9fcmVsZWFzZV9yZXNvdXJjZShtZGV2LCAwKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CkBAIC0xMDYzLDIyICsxMTM3LDE4IEBACiAJaWYgKG1kZXYtPm1lZGlhX2JheSA9PSBOVUxMKQogCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9TV0lNM19FTkFCTEUsIHN3aW0sIDAsIDEpOwogCQotCW1lbXNldChmcywgMCwgc2l6ZW9mKCpmcykpOwotCXNwaW5fbG9ja19pbml0KCZmcy0+bG9jayk7CiAJZnMtPnN0YXRlID0gaWRsZTsKIAlmcy0+c3dpbTMgPSAoc3RydWN0IHN3aW0zIF9faW9tZW0gKikKIAkJaW9yZW1hcChtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAwKSwgMHgyMDApOwogCWlmIChmcy0+c3dpbTMgPT0gTlVMTCkgewotCQlwcmludGsoImZkJWQ6IGNvdWxkbid0IG1hcCByZWdpc3RlcnMgZm9yICVzXG4iLAotCQkgICAgICAgaW5kZXgsIHN3aW0tPmZ1bGxfbmFtZSk7CisJCXN3aW0zX2VycigiJXMiLCAiQ291bGRuJ3QgbWFwIG1taW8gcmVnaXN0ZXJzXG4iKTsKIAkJcmMgPSAtRU5PTUVNOwogCQlnb3RvIG91dF9yZWxlYXNlOwogCX0KIAlmcy0+ZG1hID0gKHN0cnVjdCBkYmRtYV9yZWdzIF9faW9tZW0gKikKIAkJaW9yZW1hcChtYWNpb19yZXNvdXJjZV9zdGFydChtZGV2LCAxKSwgMHgyMDApOwogCWlmIChmcy0+ZG1hID09IE5VTEwpIHsKLQkJcHJpbnRrKCJmZCVkOiBjb3VsZG4ndCBtYXAgRE1BIGZvciAlc1xuIiwKLQkJICAgICAgIGluZGV4LCBzd2ltLT5mdWxsX25hbWUpOworCQlzd2ltM19lcnIoIiVzIiwgIkNvdWxkbid0IG1hcCBkbWEgcmVnaXN0ZXJzXG4iKTsKIAkJaW91bm1hcChmcy0+c3dpbTMpOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X3JlbGVhc2U7CkBAIC0xMDkwLDMxICsxMTYwLDI1IEBACiAJZnMtPnNlY3BlcmN5bCA9IDM2OwogCWZzLT5zZWNwZXJ0cmFjayA9IDE4OwogCWZzLT50b3RhbF9zZWNzID0gMjg4MDsKLQlmcy0+bWRldiA9IG1kZXY7CiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZnMtPndhaXQpOwogCiAJZnMtPmRtYV9jbWQgPSAoc3RydWN0IGRiZG1hX2NtZCAqKSBEQkRNQV9BTElHTihmcy0+ZGJkbWFfY21kX3NwYWNlKTsKIAltZW1zZXQoZnMtPmRtYV9jbWQsIDAsIDIgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkpOwogCXN0X2xlMTYoJmZzLT5kbWFfY21kWzFdLmNvbW1hbmQsIERCRE1BX1NUT1ApOwogCisJaWYgKG1kZXYtPm1lZGlhX2JheSA9PSBOVUxMIHx8IGNoZWNrX21lZGlhX2JheShtZGV2LT5tZWRpYV9iYXkpID09IE1CX0ZEKQorCQlzd2ltM19tYl9ldmVudChtZGV2LCBNQl9GRCk7CisKIAlpZiAocmVxdWVzdF9pcnEoZnMtPnN3aW0zX2ludHIsIHN3aW0zX2ludGVycnVwdCwgMCwgIlNXSU0zIiwgZnMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiZmQlZDogY291bGRuJ3QgcmVxdWVzdCBpcnEgJWQgZm9yICVzXG4iLAotCQkgICAgICAgaW5kZXgsIGZzLT5zd2ltM19pbnRyLCBzd2ltLT5mdWxsX25hbWUpOworCQlzd2ltM19lcnIoIiVzIiwgIkNvdWxkbid0IHJlcXVlc3QgaW50ZXJydXB0XG4iKTsKIAkJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfU1dJTTNfRU5BQkxFLCBzd2ltLCAwLCAwKTsKIAkJZ290byBvdXRfdW5tYXA7CiAJCXJldHVybiAtRUJVU1k7CiAJfQotLyoKLQlpZiAocmVxdWVzdF9pcnEoZnMtPmRtYV9pbnRyLCBmZF9kbWFfaW50ZXJydXB0LCAwLCAiU1dJTTMtZG1hIiwgZnMpKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQ291bGRuJ3QgZ2V0IGlycSAlZCBmb3IgU1dJTTMgRE1BIiwKLQkJICAgICAgIGZzLT5kbWFfaW50cik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotKi8KIAogCWluaXRfdGltZXIoJmZzLT50aW1lb3V0KTsKIAotCXByaW50ayhLRVJOX0lORk8gImZkJWQ6IFNXSU0zIGZsb3BweSBjb250cm9sbGVyICVzXG4iLCBmbG9wcHlfY291bnQsCisJc3dpbTNfaW5mbygiU1dJTTMgZmxvcHB5IGNvbnRyb2xsZXIgJXNcbiIsCiAJCW1kZXYtPm1lZGlhX2JheSA/ICJpbiBtZWRpYSBiYXkiIDogIiIpOwogCiAJcmV0dXJuIDA7CkBAIC0xMTMyLDQxICsxMTk2LDQyIEBACiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IHN3aW0zX2F0dGFjaChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICptYXRjaCkKIHsKLQlpbnQgaSwgcmM7CiAJc3RydWN0IGdlbmRpc2sgKmRpc2s7CisJaW50IGluZGV4LCByYzsKKworCWluZGV4ID0gZmxvcHB5X2NvdW50Kys7CisJaWYgKGluZGV4ID49IE1BWF9GTE9QUElFUykKKwkJcmV0dXJuIC1FTlhJTzsKIAogCS8qIEFkZCB0aGUgZHJpdmUgKi8KLQlyYyA9IHN3aW0zX2FkZF9kZXZpY2UobWRldiwgZmxvcHB5X2NvdW50KTsKKwlyYyA9IHN3aW0zX2FkZF9kZXZpY2UobWRldiwgaW5kZXgpOwogCWlmIChyYykKIAkJcmV0dXJuIHJjOworCS8qIE5vdyByZWdpc3RlciB0aGF0IGRpc2suIFNhbWUgY29tbWVudCBhYm91dCBmYWlsdXJlIGhhbmRsaW5nICovCisJZGlzayA9IGRpc2tzW2luZGV4XSA9IGFsbG9jX2Rpc2soMSk7CisJaWYgKGRpc2sgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJZGlzay0+cXVldWUgPSBibGtfaW5pdF9xdWV1ZShkb19mZF9yZXF1ZXN0LCAmc3dpbTNfbG9jayk7CisJaWYgKGRpc2stPnF1ZXVlID09IE5VTEwpIHsKKwkJcHV0X2Rpc2soZGlzayk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlkaXNrLT5xdWV1ZS0+cXVldWVkYXRhID0gJmZsb3BweV9zdGF0ZXNbaW5kZXhdOwogCi0JLyogTm93IGNyZWF0ZSB0aGUgcXVldWUgaWYgbm90IHRoZXJlIHlldCAqLwotCWlmIChzd2ltM19xdWV1ZSA9PSBOVUxMKSB7CisJaWYgKGluZGV4ID09IDApIHsKIAkJLyogSWYgd2UgZmFpbGVkLCB0aGVyZSBpc24ndCBtdWNoIHdlIGNhbiBkbyBhcyB0aGUgZHJpdmVyIGlzIHN0aWxsCiAJCSAqIHRvbyBkdW1iIHRvIHJlbW92ZSB0aGUgZGV2aWNlLCBqdXN0IGJhaWwgb3V0CiAJCSAqLwogCQlpZiAocmVnaXN0ZXJfYmxrZGV2KEZMT1BQWV9NQUpPUiwgImZkIikpCiAJCQlyZXR1cm4gMDsKLQkJc3dpbTNfcXVldWUgPSBibGtfaW5pdF9xdWV1ZShkb19mZF9yZXF1ZXN0LCAmc3dpbTNfbG9jayk7Ci0JCWlmIChzd2ltM19xdWV1ZSA9PSBOVUxMKSB7Ci0JCQl1bnJlZ2lzdGVyX2Jsa2RldihGTE9QUFlfTUFKT1IsICJmZCIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KIAl9CiAKLQkvKiBOb3cgcmVnaXN0ZXIgdGhhdCBkaXNrLiBTYW1lIGNvbW1lbnQgYWJvdXQgZmFpbHVyZSBoYW5kbGluZyAqLwotCWkgPSBmbG9wcHlfY291bnQrKzsKLQlkaXNrID0gZGlza3NbaV0gPSBhbGxvY19kaXNrKDEpOwotCWlmIChkaXNrID09IE5VTEwpCi0JCXJldHVybiAwOwotCiAJZGlzay0+bWFqb3IgPSBGTE9QUFlfTUFKT1I7Ci0JZGlzay0+Zmlyc3RfbWlub3IgPSBpOworCWRpc2stPmZpcnN0X21pbm9yID0gaW5kZXg7CiAJZGlzay0+Zm9wcyA9ICZmbG9wcHlfZm9wczsKLQlkaXNrLT5wcml2YXRlX2RhdGEgPSAmZmxvcHB5X3N0YXRlc1tpXTsKLQlkaXNrLT5xdWV1ZSA9IHN3aW0zX3F1ZXVlOworCWRpc2stPnByaXZhdGVfZGF0YSA9ICZmbG9wcHlfc3RhdGVzW2luZGV4XTsKIAlkaXNrLT5mbGFncyB8PSBHRU5IRF9GTF9SRU1PVkFCTEU7Ci0Jc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJmZCVkIiwgaSk7CisJc3ByaW50ZihkaXNrLT5kaXNrX25hbWUsICJmZCVkIiwgaW5kZXgpOwogCXNldF9jYXBhY2l0eShkaXNrLCAyODgwKTsKIAlhZGRfZGlzayhkaXNrKTsKIApAQCAtMTE5NCw2ICsxMjU5LDkgQEAKIAkJLm9mX21hdGNoX3RhYmxlCT0gc3dpbTNfbWF0Y2gsCiAJfSwKIAkucHJvYmUJCT0gc3dpbTNfYXR0YWNoLAorI2lmZGVmIENPTkZJR19QTUFDX01FRElBQkFZCisJLm1lZGlhYmF5X2V2ZW50CT0gc3dpbTNfbWJfZXZlbnQsCisjZW5kaWYKICNpZiAwCiAJLnN1c3BlbmQJPSBzd2ltM19zdXNwZW5kLAogCS5yZXN1bWUJCT0gc3dpbTNfcmVzdW1lLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvS2NvbmZpZyBiL2RyaXZlcnMvYmx1ZXRvb3RoL0tjb25maWcKaW5kZXggMTFiNDFmZC4uNWNjZjE0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvS2NvbmZpZworKysgYi9kcml2ZXJzL2JsdWV0b290aC9LY29uZmlnCkBAIC0xODgsNyArMTg4LDcgQEAKIAkgIFRoZSBjb3JlIGRyaXZlciB0byBzdXBwb3J0IE1hcnZlbGwgQmx1ZXRvb3RoIGRldmljZXMuCiAKIAkgIFRoaXMgZHJpdmVyIGlzIHJlcXVpcmVkIGlmIHlvdSB3YW50IHRvIHN1cHBvcnQKLQkgIE1hcnZlbGwgQmx1ZXRvb3RoIGRldmljZXMsIHN1Y2ggYXMgODY4OC84Nzg3LgorCSAgTWFydmVsbCBCbHVldG9vdGggZGV2aWNlcywgc3VjaCBhcyA4Njg4Lzg3ODcvODc5Ny4KIAogCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIE1hcnZlbGwgQmx1ZXRvb3RoIGRyaXZlcgogCSAgaW50byB0aGUga2VybmVsIG9yIHNheSBNIHRvIGNvbXBpbGUgaXQgYXMgbW9kdWxlLgpAQCAtMjAxLDggKzIwMSw4IEBACiAJICBUaGUgZHJpdmVyIGZvciBNYXJ2ZWxsIEJsdWV0b290aCBjaGlwc2V0cyB3aXRoIFNESU8gaW50ZXJmYWNlLgogCiAJICBUaGlzIGRyaXZlciBpcyByZXF1aXJlZCBpZiB5b3Ugd2FudCB0byB1c2UgTWFydmVsbCBCbHVldG9vdGgKLQkgIGRldmljZXMgd2l0aCBTRElPIGludGVyZmFjZS4gQ3VycmVudGx5IFNEODY4OC9TRDg3ODcgY2hpcHNldHMgYXJlCi0JICBzdXBwb3J0ZWQuCisJICBkZXZpY2VzIHdpdGggU0RJTyBpbnRlcmZhY2UuIEN1cnJlbnRseSBTRDg2ODgvU0Q4Nzg3L1NEODc5NworCSAgY2hpcHNldHMgYXJlIHN1cHBvcnRlZC4KIAogCSAgU2F5IFkgaGVyZSB0byBjb21waWxlIHN1cHBvcnQgZm9yIE1hcnZlbGwgQlQtb3Zlci1TRElPIGRyaXZlcgogCSAgaW50byB0aGUga2VybmVsIG9yIHNheSBNIHRvIGNvbXBpbGUgaXQgYXMgbW9kdWxlLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYXRoM2suYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2F0aDNrLmMKaW5kZXggMTA2YmViMS4uMTYyMjc3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYXRoM2suYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9hdGgzay5jCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KIAogI2RlZmluZSBWRVJTSU9OICIxLjAiCisjZGVmaW5lIEFUSDNLX0ZJUk1XQVJFCSJhdGgzay0xLmZ3IgogCiAjZGVmaW5lIEFUSDNLX0ROTE9BRAkJCQkweDAxCiAjZGVmaW5lIEFUSDNLX0dFVFNUQVRFCQkJCTB4MDUKQEAgLTQwMCw5ICs0MDEsMTUgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCAiYXRoM2stMS5mdyIsICZ1ZGV2LT5kZXYpIDwgMCkgewotCQlCVF9FUlIoIkVycm9yIGxvYWRpbmcgZmlybXdhcmUiKTsKLQkJcmV0dXJuIC1FSU87CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIEFUSDNLX0ZJUk1XQVJFLCAmdWRldi0+ZGV2KTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAocmV0ID09IC1FTk9FTlQpCisJCQlCVF9FUlIoIkZpcm13YXJlIGZpbGUgXCIlc1wiIG5vdCBmb3VuZCIsCisJCQkJCQkJQVRIM0tfRklSTVdBUkUpOworCQllbHNlCisJCQlCVF9FUlIoIkZpcm13YXJlIGZpbGUgXCIlc1wiIHJlcXVlc3QgZmFpbGVkIChlcnI9JWQpIiwKKwkJCQkJCQlBVEgzS19GSVJNV0FSRSwgcmV0KTsKKwkJcmV0dXJuIHJldDsKIAl9CiAKIAlyZXQgPSBhdGgza19sb2FkX2Zpcm13YXJlKHVkZXYsIGZpcm13YXJlKTsKQEAgLTQ0MSw0ICs0NDgsNCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJBdGhlcm9zIEFSMzB4eCBmaXJtd2FyZSBkcml2ZXIiKTsKIE1PRFVMRV9WRVJTSU9OKFZFUlNJT04pOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotTU9EVUxFX0ZJUk1XQVJFKCJhdGgzay0xLmZ3Iik7CitNT0RVTEVfRklSTVdBUkUoQVRIM0tfRklSTVdBUkUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYmZ1c2IuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JmdXNiLmMKaW5kZXggNjFiNTkxNC4uYTkzNjc2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYmZ1c2IuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9iZnVzYi5jCkBAIC03NTEsOSArNzUxLDcgQEAKIAogCWJmdXNiX2Nsb3NlKGhkZXYpOwogCi0JaWYgKGhjaV91bnJlZ2lzdGVyX2RldihoZGV2KSA8IDApCi0JCUJUX0VSUigiQ2FuJ3QgdW5yZWdpc3RlciBIQ0kgZGV2aWNlICVzIiwgaGRldi0+bmFtZSk7Ci0KKwloY2lfdW5yZWdpc3Rlcl9kZXYoaGRldik7CiAJaGNpX2ZyZWVfZGV2KGhkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvYmx1ZWNhcmRfY3MuYwppbmRleCBhZWQxOTA0Li5jNmEwYzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9ibHVlY2FyZF9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2JsdWVjYXJkX2NzLmMKQEAgLTg0NCw5ICs4NDQsNyBAQAogCS8qIFR1cm4gRlBHQSBvZmYgKi8KIAlvdXRiKDB4ODAsIGlvYmFzZSArIDB4MzApOwogCi0JaWYgKGhjaV91bnJlZ2lzdGVyX2RldihoZGV2KSA8IDApCi0JCUJUX0VSUigiQ2FuJ3QgdW5yZWdpc3RlciBIQ0kgZGV2aWNlICVzIiwgaGRldi0+bmFtZSk7Ci0KKwloY2lfdW5yZWdpc3Rlcl9kZXYoaGRldik7CiAJaGNpX2ZyZWVfZGV2KGhkZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMgYi9kcml2ZXJzL2JsdWV0b290aC9idDNjX2NzLmMKaW5kZXggNGZjMDE5NC4uMGM5N2U1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnQzY19jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0M2NfY3MuYwpAQCAtNjM2LDkgKzYzNiw3IEBACiAKIAlidDNjX2hjaV9jbG9zZShoZGV2KTsKIAotCWlmIChoY2lfdW5yZWdpc3Rlcl9kZXYoaGRldikgPCAwKQotCQlCVF9FUlIoIkNhbid0IHVucmVnaXN0ZXIgSENJIGRldmljZSAlcyIsIGhkZXYtPm5hbWUpOwotCisJaGNpX3VucmVnaXN0ZXJfZGV2KGhkZXYpOwogCWhjaV9mcmVlX2RldihoZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0bXJ2bF9zZGlvLmMKaW5kZXggOWVmNDgxNi4uMjdiNzRiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibHVldG9vdGgvYnRtcnZsX3NkaW8uYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9idG1ydmxfc2Rpby5jCkBAIC02NSw3ICs2NSw3IEBACiAJLmlvX3BvcnRfMSA9IDB4MDEsCiAJLmlvX3BvcnRfMiA9IDB4MDIsCiB9Owotc3RhdGljIGNvbnN0IHN0cnVjdCBidG1ydmxfc2Rpb19jYXJkX3JlZyBidG1ydmxfcmVnXzg3ODcgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGJ0bXJ2bF9zZGlvX2NhcmRfcmVnIGJ0bXJ2bF9yZWdfODd4eCA9IHsKIAkuY2ZnID0gMHgwMCwKIAkuaG9zdF9pbnRfbWFzayA9IDB4MDIsCiAJLmhvc3RfaW50c3RhdHVzID0gMHgwMywKQEAgLTkyLDcgKzkyLDE0IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGJ0bXJ2bF9zZGlvX2RldmljZSBidG1ydmxfc2Rpb19zZDg3ODcgPSB7CiAJLmhlbHBlcgkJPSBOVUxMLAogCS5maXJtd2FyZQk9ICJtcnZsL3NkODc4N191YXBzdGEuYmluIiwKLQkucmVnCQk9ICZidG1ydmxfcmVnXzg3ODcsCisJLnJlZwkJPSAmYnRtcnZsX3JlZ184N3h4LAorCS5zZF9ibGtzel9md19kbAk9IDI1NiwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYnRtcnZsX3NkaW9fZGV2aWNlIGJ0bXJ2bF9zZGlvX3NkODc5NyA9IHsKKwkuaGVscGVyCQk9IE5VTEwsCisJLmZpcm13YXJlCT0gIm1ydmwvc2Q4Nzk3X3VhcHN0YS5iaW4iLAorCS5yZWcJCT0gJmJ0bXJ2bF9yZWdfODd4eCwKIAkuc2RfYmxrc3pfZndfZGwJPSAyNTYsCiB9OwogCkBAIC0xMDMsNiArMTEwLDkgQEAKIAkvKiBNYXJ2ZWxsIFNEODc4NyBCbHVldG9vdGggZGV2aWNlICovCiAJeyBTRElPX0RFVklDRShTRElPX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDkxMUEpLAogCQkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZidG1ydmxfc2Rpb19zZDg3ODcgfSwKKwkvKiBNYXJ2ZWxsIFNEODc5NyBCbHVldG9vdGggZGV2aWNlICovCisJeyBTRElPX0RFVklDRShTRElPX1ZFTkRPUl9JRF9NQVJWRUxMLCAweDkxMkEpLAorCQkJLmRyaXZlcl9kYXRhID0gKHVuc2lnbmVkIGxvbmcpICZidG1ydmxfc2Rpb19zZDg3OTcgfSwKIAogCXsgfQkvKiBUZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKQEAgLTEwNzYsMyArMTA4Niw0IEBACiBNT0RVTEVfRklSTVdBUkUoInNkODY4OF9oZWxwZXIuYmluIik7CiBNT0RVTEVfRklSTVdBUkUoInNkODY4OC5iaW4iKTsKIE1PRFVMRV9GSVJNV0FSRSgibXJ2bC9zZDg3ODdfdWFwc3RhLmJpbiIpOworTU9EVUxFX0ZJUk1XQVJFKCJtcnZsL3NkODc5N191YXBzdGEuYmluIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idHVhcnRfY3MuYyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCmluZGV4IDUyNmI2MTguLjIwMGIzYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dWFydF9jcy5jCkBAIC01NjUsOSArNTY1LDcgQEAKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihpbmZvLT5sb2NrKSwgZmxhZ3MpOwogCi0JaWYgKGhjaV91bnJlZ2lzdGVyX2RldihoZGV2KSA8IDApCi0JCUJUX0VSUigiQ2FuJ3QgdW5yZWdpc3RlciBIQ0kgZGV2aWNlICVzIiwgaGRldi0+bmFtZSk7Ci0KKwloY2lfdW5yZWdpc3Rlcl9kZXYoaGRldik7CiAJaGNpX2ZyZWVfZGV2KGhkZXYpOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jIGIvZHJpdmVycy9ibHVldG9vdGgvYnR1c2IuYwppbmRleCBmZTRlYmMzLi5mYmZiYTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2JsdWV0b290aC9idHVzYi5jCisrKyBiL2RyaXZlcnMvYmx1ZXRvb3RoL2J0dXNiLmMKQEAgLTEwMSw2ICsxMDEsNyBAQAogCXsgVVNCX0RFVklDRSgweDBjMTAsIDB4MDAwMCkgfSwKIAogCS8qIEJyb2FkY29tIEJDTTIwNzAyQTAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgwYTVjLCAweDIxZTMpIH0sCiAJeyBVU0JfREVWSUNFKDB4NDEzYywgMHg4MTk3KSB9LAogCiAJeyB9CS8qIFRlcm1pbmF0aW5nIGVudHJ5ICovCkBAIC0zMTUsNyArMzE2LDggQEAKIAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgbWVtX2ZsYWdzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKKwkJaWYgKGVyciAhPSAtRVBFUk0gJiYgZXJyICE9IC1FTk9ERVYpCisJCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKIAkJCQkJCWhkZXYtPm5hbWUsIHVyYiwgLWVycik7CiAJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKIAl9CkBAIC00MDAsNyArNDAyLDggQEAKIAogCWVyciA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgbWVtX2ZsYWdzKTsKIAlpZiAoZXJyIDwgMCkgewotCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKKwkJaWYgKGVyciAhPSAtRVBFUk0gJiYgZXJyICE9IC1FTk9ERVYpCisJCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCAoJWQpIiwKIAkJCQkJCWhkZXYtPm5hbWUsIHVyYiwgLWVycik7CiAJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKIAl9CkBAIC01MDYsMTUgKzUwOSwxMCBAQAogCiAJcGlwZSA9IHVzYl9yY3Zpc29jcGlwZShkYXRhLT51ZGV2LCBkYXRhLT5pc29jX3J4X2VwLT5iRW5kcG9pbnRBZGRyZXNzKTsKIAotCXVyYi0+ZGV2ICAgICAgPSBkYXRhLT51ZGV2OwotCXVyYi0+cGlwZSAgICAgPSBwaXBlOwotCXVyYi0+Y29udGV4dCAgPSBoZGV2OwotCXVyYi0+Y29tcGxldGUgPSBidHVzYl9pc29jX2NvbXBsZXRlOwotCXVyYi0+aW50ZXJ2YWwgPSBkYXRhLT5pc29jX3J4X2VwLT5iSW50ZXJ2YWw7CisJdXNiX2ZpbGxfaW50X3VyYih1cmIsIGRhdGEtPnVkZXYsIHBpcGUsIGJ1Ziwgc2l6ZSwgYnR1c2JfaXNvY19jb21wbGV0ZSwKKwkJCQloZGV2LCBkYXRhLT5pc29jX3J4X2VwLT5iSW50ZXJ2YWwpOwogCiAJdXJiLT50cmFuc2Zlcl9mbGFncyAgPSBVUkJfRlJFRV9CVUZGRVIgfCBVUkJfSVNPX0FTQVA7Ci0JdXJiLT50cmFuc2Zlcl9idWZmZXIgPSBidWY7Ci0JdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoID0gc2l6ZTsKIAogCV9fZmlsbF9pc29jX2Rlc2NyaXB0b3IodXJiLCBzaXplLAogCQkJbGUxNl90b19jcHUoZGF0YS0+aXNvY19yeF9lcC0+d01heFBhY2tldFNpemUpKTsKQEAgLTUyMyw3ICs1MjEsOCBAQAogCiAJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBtZW1fZmxhZ3MpOwogCWlmIChlcnIgPCAwKSB7Ci0JCUJUX0VSUigiJXMgdXJiICVwIHN1Ym1pc3Npb24gZmFpbGVkICglZCkiLAorCQlpZiAoZXJyICE9IC1FUEVSTSAmJiBlcnIgIT0gLUVOT0RFVikKKwkJCUJUX0VSUigiJXMgdXJiICVwIHN1Ym1pc3Npb24gZmFpbGVkICglZCkiLAogCQkJCQkJaGRldi0+bmFtZSwgdXJiLCAtZXJyKTsKIAkJdXNiX3VuYW5jaG9yX3VyYih1cmIpOwogCX0KQEAgLTcyNyw2ICs3MjYsOSBAQAogCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIGRhdGEtPnVkZXYsIHBpcGUsCiAJCQkJc2tiLT5kYXRhLCBza2ItPmxlbiwgYnR1c2JfdHhfY29tcGxldGUsIHNrYik7CiAKKwkJaWYgKHNrYi0+cHJpb3JpdHkgPj0gSENJX1BSSU9fTUFYIC0gMSkKKwkJCXVyYi0+dHJhbnNmZXJfZmxhZ3MgID0gVVJCX0lTT19BU0FQOworCiAJCWhkZXYtPnN0YXQuYWNsX3R4Kys7CiAJCWJyZWFrOwogCkBAIC03NzAsMTYgKzc3MiwxNyBAQAogCiAJZXJyID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKIAlpZiAoZXJyIDwgMCkgewotCQlCVF9FUlIoIiVzIHVyYiAlcCBzdWJtaXNzaW9uIGZhaWxlZCIsIGhkZXYtPm5hbWUsIHVyYik7CisJCWlmIChlcnIgIT0gLUVQRVJNICYmIGVyciAhPSAtRU5PREVWKQorCQkJQlRfRVJSKCIlcyB1cmIgJXAgc3VibWlzc2lvbiBmYWlsZWQgKCVkKSIsCisJCQkJCQloZGV2LT5uYW1lLCB1cmIsIC1lcnIpOwogCQlrZnJlZSh1cmItPnNldHVwX3BhY2tldCk7CiAJCXVzYl91bmFuY2hvcl91cmIodXJiKTsKIAl9IGVsc2UgewogCQl1c2JfbWFya19sYXN0X2J1c3koZGF0YS0+dWRldik7CiAJfQogCi0JdXNiX2ZyZWVfdXJiKHVyYik7Ci0KIGRvbmU6CisJdXNiX2ZyZWVfdXJiKHVyYik7CiAJcmV0dXJuIGVycjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jIGIvZHJpdmVycy9ibHVldG9vdGgvZHRsMV9jcy5jCmluZGV4IDVlNGMyZGUuLjk2OWJiMjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2R0bDFfY3MuYworKysgYi9kcml2ZXJzL2JsdWV0b290aC9kdGwxX2NzLmMKQEAgLTU1MSw5ICs1NTEsNyBAQAogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmKGluZm8tPmxvY2spLCBmbGFncyk7CiAKLQlpZiAoaGNpX3VucmVnaXN0ZXJfZGV2KGhkZXYpIDwgMCkKLQkJQlRfRVJSKCJDYW4ndCB1bnJlZ2lzdGVyIEhDSSBkZXZpY2UgJXMiLCBoZGV2LT5uYW1lKTsKLQorCWhjaV91bnJlZ2lzdGVyX2RldihoZGV2KTsKIAloY2lfZnJlZV9kZXYoaGRldik7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV92aGNpLmMgYi9kcml2ZXJzL2JsdWV0b290aC9oY2lfdmhjaS5jCmluZGV4IDY3YzE4MGMuLjJlZDZhYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmx1ZXRvb3RoL2hjaV92aGNpLmMKKysrIGIvZHJpdmVycy9ibHVldG9vdGgvaGNpX3ZoY2kuYwpAQCAtNDEsNiArNDEsOCBAQAogCiAjZGVmaW5lIFZFUlNJT04gIjEuMyIKIAorc3RhdGljIGJvb2wgYW1wOworCiBzdHJ1Y3QgdmhjaV9kYXRhIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKIApAQCAtMjM5LDYgKzI0MSw5IEBACiAJaGRldi0+YnVzID0gSENJX1ZJUlRVQUw7CiAJaGRldi0+ZHJpdmVyX2RhdGEgPSBkYXRhOwogCisJaWYgKGFtcCkKKwkJaGRldi0+ZGV2X3R5cGUgPSBIQ0lfQU1QOworCiAJaGRldi0+b3BlbiAgICAgPSB2aGNpX29wZW5fZGV2OwogCWhkZXYtPmNsb3NlICAgID0gdmhjaV9jbG9zZV9kZXY7CiAJaGRldi0+Zmx1c2ggICAgPSB2aGNpX2ZsdXNoOwpAQCAtMjY0LDEwICsyNjksNyBAQAogCXN0cnVjdCB2aGNpX2RhdGEgKmRhdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBkYXRhLT5oZGV2OwogCi0JaWYgKGhjaV91bnJlZ2lzdGVyX2RldihoZGV2KSA8IDApIHsKLQkJQlRfRVJSKCJDYW4ndCB1bnJlZ2lzdGVyIEhDSSBkZXZpY2UgJXMiLCBoZGV2LT5uYW1lKTsKLQl9Ci0KKwloY2lfdW5yZWdpc3Rlcl9kZXYoaGRldik7CiAJaGNpX2ZyZWVfZGV2KGhkZXYpOwogCiAJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKQEAgLTMwNiw2ICszMDgsOSBAQAogbW9kdWxlX2luaXQodmhjaV9pbml0KTsKIG1vZHVsZV9leGl0KHZoY2lfZXhpdCk7CiAKK21vZHVsZV9wYXJhbShhbXAsIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhhbXAsICJDcmVhdGUgQU1QIGNvbnRyb2xsZXIgZGV2aWNlIik7CisKIE1PRFVMRV9BVVRIT1IoIk1hcmNlbCBIb2x0bWFubiA8bWFyY2VsQGhvbHRtYW5uLm9yZz4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQmx1ZXRvb3RoIHZpcnR1YWwgSENJIGRyaXZlciB2ZXIgIiBWRVJTSU9OKTsKIE1PRFVMRV9WRVJTSU9OKFZFUlNJT04pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCmluZGV4IGMyOTE3ZmZhLi4zNDc2N2E2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaXBtaS9pcG1pX3dhdGNoZG9nLmMKKysrIGIvZHJpdmVycy9jaGFyL2lwbWkvaXBtaV93YXRjaGRvZy5jCkBAIC0xMzksNiArMTM5LDggQEAKICNkZWZpbmUgSVBNSV9XRE9HX1NFVF9USU1FUgkJMHgyNAogI2RlZmluZSBJUE1JX1dET0dfR0VUX1RJTUVSCQkweDI1CiAKKyNkZWZpbmUgSVBNSV9XRE9HX1RJTUVSX05PVF9JTklUX1JFU1AJMHg4MAorCiAvKiBUaGVzZSBhcmUgaGVyZSB1bnRpbCB0aGUgcmVhbCBvbmVzIGdldCBpbnRvIHRoZSB3YXRjaGRvZy5oIGludGVyZmFjZS4gKi8KICNpZm5kZWYgV0RJT0NfR0VUVElNRU9VVAogI2RlZmluZQlXRElPQ19HRVRUSU1FT1VUICAgICAgICBfSU9XKFdBVENIRE9HX0lPQ1RMX0JBU0UsIDIwLCBpbnQpCkBAIC01OTYsNiArNTk4LDcgQEAKIAlzdHJ1Y3Qga2VybmVsX2lwbWlfbXNnICAgICAgICAgICAgbXNnOwogCWludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydjsKIAlzdHJ1Y3QgaXBtaV9zeXN0ZW1faW50ZXJmYWNlX2FkZHIgYWRkcjsKKwlpbnQJCQkJICB0aW1lb3V0X3JldHJpZXMgPSAwOwogCiAJaWYgKGlwbWlfaWdub3JlX2hlYXJ0YmVhdCkKIAkJcmV0dXJuIDA7CkBAIC02MTYsNiArNjE5LDcgQEAKIAogCW11dGV4X2xvY2soJmhlYXJ0YmVhdF9sb2NrKTsKIAorcmVzdGFydDoKIAlhdG9taWNfc2V0KCZoZWFydGJlYXRfdG9mcmVlLCAyKTsKIAogCS8qCkBAIC02NTMsNyArNjU3LDMzIEBACiAJLyogV2FpdCBmb3IgdGhlIGhlYXJ0YmVhdCB0byBiZSBzZW50LiAqLwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmhlYXJ0YmVhdF93YWl0KTsKIAotCWlmIChoZWFydGJlYXRfcmVjdl9tc2cubXNnLmRhdGFbMF0gIT0gMCkgeworCWlmIChoZWFydGJlYXRfcmVjdl9tc2cubXNnLmRhdGFbMF0gPT0gSVBNSV9XRE9HX1RJTUVSX05PVF9JTklUX1JFU1ApICB7CisJCXRpbWVvdXRfcmV0cmllcysrOworCQlpZiAodGltZW91dF9yZXRyaWVzID4gMykgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiOiBVbmFibGUgdG8gcmVzdG9yZSB0aGUgSVBNSSIKKwkJCSAgICAgICAiIHdhdGNoZG9nJ3Mgc2V0dGluZ3MsIGdpdmluZyB1cC5cbiIpOworCQkJcnYgPSAtRUlPOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJLyoKKwkJICogVGhlIHRpbWVyIHdhcyBub3QgaW5pdGlhbGl6ZWQsIHRoYXQgbWVhbnMgdGhlIEJNQyB3YXMKKwkJICogcHJvYmFibHkgcmVzZXQgYW5kIGxvc3QgdGhlIHdhdGNoZG9nIGluZm9ybWF0aW9uLiAgQXR0ZW1wdAorCQkgKiB0byByZXN0b3JlIHRoZSB0aW1lcidzIGluZm8uICBOb3RlIHRoYXQgd2Ugc3RpbGwgaG9sZAorCQkgKiB0aGUgaGVhcnRiZWF0IGxvY2ssIHRvIGtlZXAgYSBoZWFydGJlYXQgZnJvbSBoYXBwZW5pbmcKKwkJICogaW4gdGhpcyBwcm9jZXNzLCBzbyBtdXN0IHNheSBubyBoZWFydGJlYXQgdG8gYXZvaWQgYQorCQkgKiBkZWFkbG9jayBvbiB0aGlzIG11dGV4LgorCQkgKi8KKwkJcnYgPSBpcG1pX3NldF90aW1lb3V0KElQTUlfU0VUX1RJTUVPVVRfTk9fSEIpOworCQlpZiAocnYpIHsKKwkJCXByaW50ayhLRVJOX0VSUiBQRlggIjogVW5hYmxlIHRvIHNlbmQgdGhlIGNvbW1hbmQgdG8iCisJCQkgICAgICAgIiBzZXQgdGhlIHdhdGNoZG9nJ3Mgc2V0dGluZ3MsIGdpdmluZyB1cC5cbiIpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJLyogV2UgbWlnaHQgbmVlZCBhIG5ldyBoZWFydGJlYXQsIHNvIGRvIGl0IG5vdyAqLworCQlnb3RvIHJlc3RhcnQ7CisJfSBlbHNlIGlmIChoZWFydGJlYXRfcmVjdl9tc2cubXNnLmRhdGFbMF0gIT0gMCkgewogCQkvKgogCQkgKiBHb3QgYW4gZXJyb3IgaW4gdGhlIGhlYXJ0YmVhdCByZXNwb25zZS4gIEl0IHdhcyBhbHJlYWR5CiAJCSAqIHJlcG9ydGVkIGluIGlwbWlfd2RvZ19tc2dfaGFuZGxlciwgYnV0IHdlIHNob3VsZCByZXR1cm4KQEAgLTY2Miw2ICs2OTIsNyBAQAogCQlydiA9IC1FSU5WQUw7CiAJfQogCitvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmaGVhcnRiZWF0X2xvY2spOwogCiAJcmV0dXJuIHJ2OwpAQCAtOTIyLDExICs5NTMsMTUgQEAKIHN0YXRpYyB2b2lkIGlwbWlfd2RvZ19tc2dfaGFuZGxlcihzdHJ1Y3QgaXBtaV9yZWN2X21zZyAqbXNnLAogCQkJCSAgdm9pZCAgICAgICAgICAgICAgICAgKmhhbmRsZXJfZGF0YSkKIHsKLQlpZiAobXNnLT5tc2cuZGF0YVswXSAhPSAwKSB7CisJaWYgKG1zZy0+bXNnLmNtZCA9PSBJUE1JX1dET0dfUkVTRVRfVElNRVIgJiYKKwkJCW1zZy0+bXNnLmRhdGFbMF0gPT0gSVBNSV9XRE9HX1RJTUVSX05PVF9JTklUX1JFU1ApCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJyZXNwb25zZTogVGhlIElQTUkgY29udHJvbGxlciBhcHBlYXJzIgorCQkgICAgICAgIiB0byBoYXZlIGJlZW4gcmVzZXQsIHdpbGwgYXR0ZW1wdCB0byByZWluaXRpYWxpemUiCisJCSAgICAgICAiIHRoZSB3YXRjaGRvZyB0aW1lclxuIik7CisJZWxzZSBpZiAobXNnLT5tc2cuZGF0YVswXSAhPSAwKQogCQlwcmludGsoS0VSTl9FUlIgUEZYICJyZXNwb25zZTogRXJyb3IgJXggb24gY21kICV4XG4iLAogCQkgICAgICAgbXNnLT5tc2cuZGF0YVswXSwKIAkJICAgICAgIG1zZy0+bXNnLmNtZCk7Ci0JfQogCiAJaXBtaV9mcmVlX3JlY3ZfbXNnKG1zZyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvcmFuZG9tLmMgYi9kcml2ZXJzL2NoYXIvcmFuZG9tLmMKaW5kZXggNjAzNWFiOC4uODVkYTg3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL3JhbmRvbS5jCisrKyBiL2RyaXZlcnMvY2hhci9yYW5kb20uYwpAQCAtNjI0LDggKzYyNCw4IEBACiBzdGF0aWMgdm9pZCBhZGRfdGltZXJfcmFuZG9tbmVzcyhzdHJ1Y3QgdGltZXJfcmFuZF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIG51bSkKIHsKIAlzdHJ1Y3QgewotCQljeWNsZXNfdCBjeWNsZXM7CiAJCWxvbmcgamlmZmllczsKKwkJdW5zaWduZWQgY3ljbGVzOwogCQl1bnNpZ25lZCBudW07CiAJfSBzYW1wbGU7CiAJbG9uZyBkZWx0YSwgZGVsdGEyLCBkZWx0YTM7CkBAIC02MzcsNyArNjM3LDExIEBACiAJCWdvdG8gb3V0OwogCiAJc2FtcGxlLmppZmZpZXMgPSBqaWZmaWVzOwotCXNhbXBsZS5jeWNsZXMgPSBnZXRfY3ljbGVzKCk7CisKKwkvKiBVc2UgYXJjaCByYW5kb20gdmFsdWUsIGZhbGwgYmFjayB0byBjeWNsZXMgKi8KKwlpZiAoIWFyY2hfZ2V0X3JhbmRvbV9pbnQoJnNhbXBsZS5jeWNsZXMpKQorCQlzYW1wbGUuY3ljbGVzID0gZ2V0X2N5Y2xlcygpOworCiAJc2FtcGxlLm51bSA9IG51bTsKIAltaXhfcG9vbF9ieXRlcygmaW5wdXRfcG9vbCwgJnNhbXBsZSwgc2l6ZW9mKHNhbXBsZSkpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvYWNwaV9wbS5jCmluZGV4IGVmZmU3OTcuLjZiNWNmMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2UvYWNwaV9wbS5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvYWNwaV9wbS5jCkBAIC0xNDMsNyArMTQzLDcgQEAKICNpZm5kZWYgQ09ORklHX1g4Nl82NAogI2luY2x1ZGUgPGFzbS9tYWNoX3RpbWVyLmg+CiAjZGVmaW5lIFBNVE1SX0VYUEVDVEVEX1JBVEUgXAotICAoKENBTElCUkFURV9MQVRDSCAqIChQTVRNUl9USUNLU19QRVJfU0VDID4+IDEwKSkgLyAoQ0xPQ0tfVElDS19SQVRFPj4xMCkpCisgICgoQ0FMSUJSQVRFX0xBVENIICogKFBNVE1SX1RJQ0tTX1BFUl9TRUMgPj4gMTApKSAvIChQSVRfVElDS19SQVRFPj4xMCkpCiAvKgogICogU29tZSBib2FyZHMgaGF2ZSB0aGUgUE1UTVIgcnVubmluZyB3YXkgdG9vIGZhc3QuIFdlIGNoZWNrCiAgKiB0aGUgUE1UTVIgcmF0ZSBhZ2FpbnN0IFBJVCBjaGFubmVsIDIgdG8gY2F0Y2ggdGhlc2UgY2FzZXMuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2k4MjUzLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2k4MjUzLmMKaW5kZXggMjdjNDllNi4uZTdjYWIyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jbG9ja3NvdXJjZS9pODI1My5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2UvaTgyNTMuYwpAQCAtNTMsNyArNTMsNyBAQAogCWNvdW50IHw9IGluYl9wKFBJVF9DSDApIDw8IDg7CiAKIAkvKiBWSUE2ODZhIHRlc3QgY29kZS4uLiByZXNldCB0aGUgbGF0Y2ggaWYgY291bnQgPiBtYXggKyAxICovCi0JaWYgKGNvdW50ID4gTEFUQ0gpIHsKKwlpZiAoY291bnQgPiBQSVRfTEFUQ0gpIHsKIAkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKIAkJb3V0Yl9wKFBJVF9MQVRDSCAmIDB4ZmYsIFBJVF9DSDApOwogCQlvdXRiX3AoUElUX0xBVENIID4+IDgsIFBJVF9DSDApOwpAQCAtMTE0LDggKzExNCw4IEBACiAJY2FzZSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQzoKIAkJLyogYmluYXJ5LCBtb2RlIDIsIExTQi9NU0IsIGNoIDAgKi8KIAkJb3V0Yl9wKDB4MzQsIFBJVF9NT0RFKTsKLQkJb3V0Yl9wKExBVENIICYgMHhmZiAsIFBJVF9DSDApOwkvKiBMU0IgKi8KLQkJb3V0Yl9wKExBVENIID4+IDggLCBQSVRfQ0gwKTsJCS8qIE1TQiAqLworCQlvdXRiX3AoUElUX0xBVENIICYgMHhmZiAsIFBJVF9DSDApOwkvKiBMU0IgKi8KKwkJb3V0Yl9wKFBJVF9MQVRDSCA+PiA4ICwgUElUX0NIMCk7CQkvKiBNU0IgKi8KIAkJYnJlYWs7CiAKIAljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS90Y2JfY2xrc3JjLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RjYl9jbGtzcmMuYwppbmRleCA3OWM0N2U4Li41NWQwZjk1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3RjYl9jbGtzcmMuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL3RjYl9jbGtzcmMuYwpAQCAtNTksNyArNTksNiBAQAogCS5yYXRpbmcgICAgICAgICA9IDIwMCwKIAkucmVhZCAgICAgICAgICAgPSB0Y19nZXRfY3ljbGVzLAogCS5tYXNrICAgICAgICAgICA9IENMT0NLU09VUkNFX01BU0soMzIpLAotCS5zaGlmdCAgICAgICAgICA9IDE4LAogCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKQEAgLTI1Niw3ICsyNTUsNiBAQAogCQliZXN0X2Rpdmlzb3JfaWR4ID0gaTsKIAl9CiAKLQljbGtzcmMubXVsdCA9IGNsb2Nrc291cmNlX2h6Mm11bHQoZGl2aWRlZF9yYXRlLCBjbGtzcmMuc2hpZnQpOwogCiAJcHJpbnRrKGJvb3RpbmZvLCBjbGtzcmMubmFtZSwgQ09ORklHX0FUTUVMX1RDQl9DTEtTUkNfQkxPQ0ssCiAJCQlkaXZpZGVkX3JhdGUgLyAxMDAwMDAwLApAQCAtMjkyLDcgKzI5MCw3IEBACiAJX19yYXdfd3JpdGVsKEFUTUVMX1RDX1NZTkMsIHRjYWRkciArIEFUTUVMX1RDX0JDUik7CiAKIAkvKiBhbmQgYXdheSB3ZSBnbyEgKi8KLQljbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xrc3JjKTsKKwljbG9ja3NvdXJjZV9yZWdpc3Rlcl9oeigmY2xrc3JjLCBkaXZpZGVkX3JhdGUpOwogCiAJLyogY2hhbm5lbCAyOiAgcGVyaW9kaWMgYW5kIG9uZXNob3QgdGltZXIgc3VwcG9ydCAqLwogCXNldHVwX2Nsa2V2ZW50cyh0YywgY2xrMzJrX2Rpdmlzb3JfaWR4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX2NvbnNlcnZhdGl2ZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKaW5kZXggYzk3YjQ2OC4uMjM1YTM0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMKQEAgLTk1LDI3ICs5NSwyNiBAQAogCS5mcmVxX3N0ZXAgPSA1LAogfTsKIAotc3RhdGljIGlubGluZSBjcHV0aW1lNjRfdCBnZXRfY3B1X2lkbGVfdGltZV9qaWZmeSh1bnNpZ25lZCBpbnQgY3B1LAotCQkJCQkJCWNwdXRpbWU2NF90ICp3YWxsKQorc3RhdGljIGlubGluZSB1NjQgZ2V0X2NwdV9pZGxlX3RpbWVfamlmZnkodW5zaWduZWQgaW50IGNwdSwgdTY0ICp3YWxsKQogewotCWNwdXRpbWU2NF90IGlkbGVfdGltZTsKLQljcHV0aW1lNjRfdCBjdXJfd2FsbF90aW1lOwotCWNwdXRpbWU2NF90IGJ1c3lfdGltZTsKKwl1NjQgaWRsZV90aW1lOworCXU2NCBjdXJfd2FsbF90aW1lOworCXU2NCBidXN5X3RpbWU7CiAKIAljdXJfd2FsbF90aW1lID0gamlmZmllczY0X3RvX2NwdXRpbWU2NChnZXRfamlmZmllc182NCgpKTsKLQlidXN5X3RpbWUgPSBjcHV0aW1lNjRfYWRkKGtzdGF0X2NwdShjcHUpLmNwdXN0YXQudXNlciwKLQkJCWtzdGF0X2NwdShjcHUpLmNwdXN0YXQuc3lzdGVtKTsKIAotCWJ1c3lfdGltZSA9IGNwdXRpbWU2NF9hZGQoYnVzeV90aW1lLCBrc3RhdF9jcHUoY3B1KS5jcHVzdGF0LmlycSk7Ci0JYnVzeV90aW1lID0gY3B1dGltZTY0X2FkZChidXN5X3RpbWUsIGtzdGF0X2NwdShjcHUpLmNwdXN0YXQuc29mdGlycSk7Ci0JYnVzeV90aW1lID0gY3B1dGltZTY0X2FkZChidXN5X3RpbWUsIGtzdGF0X2NwdShjcHUpLmNwdXN0YXQuc3RlYWwpOwotCWJ1c3lfdGltZSA9IGNwdXRpbWU2NF9hZGQoYnVzeV90aW1lLCBrc3RhdF9jcHUoY3B1KS5jcHVzdGF0Lm5pY2UpOworCWJ1c3lfdGltZSAgPSBrY3B1c3RhdF9jcHUoY3B1KS5jcHVzdGF0W0NQVVRJTUVfVVNFUl07CisJYnVzeV90aW1lICs9IGtjcHVzdGF0X2NwdShjcHUpLmNwdXN0YXRbQ1BVVElNRV9TWVNURU1dOworCWJ1c3lfdGltZSArPSBrY3B1c3RhdF9jcHUoY3B1KS5jcHVzdGF0W0NQVVRJTUVfSVJRXTsKKwlidXN5X3RpbWUgKz0ga2NwdXN0YXRfY3B1KGNwdSkuY3B1c3RhdFtDUFVUSU1FX1NPRlRJUlFdOworCWJ1c3lfdGltZSArPSBrY3B1c3RhdF9jcHUoY3B1KS5jcHVzdGF0W0NQVVRJTUVfU1RFQUxdOworCWJ1c3lfdGltZSArPSBrY3B1c3RhdF9jcHUoY3B1KS5jcHVzdGF0W0NQVVRJTUVfTklDRV07CiAKLQlpZGxlX3RpbWUgPSBjcHV0aW1lNjRfc3ViKGN1cl93YWxsX3RpbWUsIGJ1c3lfdGltZSk7CisJaWRsZV90aW1lID0gY3VyX3dhbGxfdGltZSAtIGJ1c3lfdGltZTsKIAlpZiAod2FsbCkKLQkJKndhbGwgPSAoY3B1dGltZTY0X3QpamlmZmllc190b191c2VjcyhjdXJfd2FsbF90aW1lKTsKKwkJKndhbGwgPSBqaWZmaWVzX3RvX3VzZWNzKGN1cl93YWxsX3RpbWUpOwogCi0JcmV0dXJuIChjcHV0aW1lNjRfdClqaWZmaWVzX3RvX3VzZWNzKGlkbGVfdGltZSk7CisJcmV0dXJuIGppZmZpZXNfdG9fdXNlY3MoaWRsZV90aW1lKTsKIH0KIAogc3RhdGljIGlubGluZSBjcHV0aW1lNjRfdCBnZXRfY3B1X2lkbGVfdGltZSh1bnNpZ25lZCBpbnQgY3B1LCBjcHV0aW1lNjRfdCAqd2FsbCkKQEAgLTI3Miw3ICsyNzEsNyBAQAogCQlkYnNfaW5mby0+cHJldl9jcHVfaWRsZSA9IGdldF9jcHVfaWRsZV90aW1lKGosCiAJCQkJCQkmZGJzX2luZm8tPnByZXZfY3B1X3dhbGwpOwogCQlpZiAoZGJzX3R1bmVyc19pbnMuaWdub3JlX25pY2UpCi0JCQlkYnNfaW5mby0+cHJldl9jcHVfbmljZSA9IGtzdGF0X2NwdShqKS5jcHVzdGF0Lm5pY2U7CisJCQlkYnNfaW5mby0+cHJldl9jcHVfbmljZSA9IGtjcHVzdGF0X2NwdShqKS5jcHVzdGF0W0NQVVRJTUVfTklDRV07CiAJfQogCXJldHVybiBjb3VudDsKIH0KQEAgLTM1MywyMCArMzUyLDIwIEBACiAKIAkJY3VyX2lkbGVfdGltZSA9IGdldF9jcHVfaWRsZV90aW1lKGosICZjdXJfd2FsbF90aW1lKTsKIAotCQl3YWxsX3RpbWUgPSAodW5zaWduZWQgaW50KSBjcHV0aW1lNjRfc3ViKGN1cl93YWxsX3RpbWUsCi0JCQkJal9kYnNfaW5mby0+cHJldl9jcHVfd2FsbCk7CisJCXdhbGxfdGltZSA9ICh1bnNpZ25lZCBpbnQpCisJCQkoY3VyX3dhbGxfdGltZSAtIGpfZGJzX2luZm8tPnByZXZfY3B1X3dhbGwpOwogCQlqX2Ric19pbmZvLT5wcmV2X2NwdV93YWxsID0gY3VyX3dhbGxfdGltZTsKIAotCQlpZGxlX3RpbWUgPSAodW5zaWduZWQgaW50KSBjcHV0aW1lNjRfc3ViKGN1cl9pZGxlX3RpbWUsCi0JCQkJal9kYnNfaW5mby0+cHJldl9jcHVfaWRsZSk7CisJCWlkbGVfdGltZSA9ICh1bnNpZ25lZCBpbnQpCisJCQkoY3VyX2lkbGVfdGltZSAtIGpfZGJzX2luZm8tPnByZXZfY3B1X2lkbGUpOwogCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlID0gY3VyX2lkbGVfdGltZTsKIAogCQlpZiAoZGJzX3R1bmVyc19pbnMuaWdub3JlX25pY2UpIHsKLQkJCWNwdXRpbWU2NF90IGN1cl9uaWNlOworCQkJdTY0IGN1cl9uaWNlOwogCQkJdW5zaWduZWQgbG9uZyBjdXJfbmljZV9qaWZmaWVzOwogCi0JCQljdXJfbmljZSA9IGNwdXRpbWU2NF9zdWIoa3N0YXRfY3B1KGopLmNwdXN0YXQubmljZSwKLQkJCQkJIGpfZGJzX2luZm8tPnByZXZfY3B1X25pY2UpOworCQkJY3VyX25pY2UgPSBrY3B1c3RhdF9jcHUoaikuY3B1c3RhdFtDUFVUSU1FX05JQ0VdIC0KKwkJCQkJIGpfZGJzX2luZm8tPnByZXZfY3B1X25pY2U7CiAJCQkvKgogCQkJICogQXNzdW1wdGlvbjogbmljZSB0aW1lIGJldHdlZW4gc2FtcGxpbmcgcGVyaW9kcyB3aWxsCiAJCQkgKiBiZSBsZXNzIHRoYW4gMl4zMiBqaWZmaWVzIGZvciAzMiBiaXQgc3lzCkBAIC0zNzQsNyArMzczLDcgQEAKIAkJCWN1cl9uaWNlX2ppZmZpZXMgPSAodW5zaWduZWQgbG9uZykKIAkJCQkJY3B1dGltZTY0X3RvX2ppZmZpZXM2NChjdXJfbmljZSk7CiAKLQkJCWpfZGJzX2luZm8tPnByZXZfY3B1X25pY2UgPSBrc3RhdF9jcHUoaikuY3B1c3RhdC5uaWNlOworCQkJal9kYnNfaW5mby0+cHJldl9jcHVfbmljZSA9IGtjcHVzdGF0X2NwdShqKS5jcHVzdGF0W0NQVVRJTUVfTklDRV07CiAJCQlpZGxlX3RpbWUgKz0gamlmZmllc190b191c2VjcyhjdXJfbmljZV9qaWZmaWVzKTsKIAkJfQogCkBAIC01MDEsMTAgKzUwMCw5IEBACiAKIAkJCWpfZGJzX2luZm8tPnByZXZfY3B1X2lkbGUgPSBnZXRfY3B1X2lkbGVfdGltZShqLAogCQkJCQkJJmpfZGJzX2luZm8tPnByZXZfY3B1X3dhbGwpOwotCQkJaWYgKGRic190dW5lcnNfaW5zLmlnbm9yZV9uaWNlKSB7CisJCQlpZiAoZGJzX3R1bmVyc19pbnMuaWdub3JlX25pY2UpCiAJCQkJal9kYnNfaW5mby0+cHJldl9jcHVfbmljZSA9Ci0JCQkJCQlrc3RhdF9jcHUoaikuY3B1c3RhdC5uaWNlOwotCQkJfQorCQkJCQkJa2NwdXN0YXRfY3B1KGopLmNwdXN0YXRbQ1BVVElNRV9OSUNFXTsKIAkJfQogCQl0aGlzX2Ric19pbmZvLT5kb3duX3NraXAgPSAwOwogCQl0aGlzX2Ric19pbmZvLT5yZXF1ZXN0ZWRfZnJlcSA9IHBvbGljeS0+Y3VyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKaW5kZXggZmE4YWY0ZS4uM2Q2NzllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCkBAIC0xMTksMjcgKzExOSwyNiBAQAogCS5wb3dlcnNhdmVfYmlhcyA9IDAsCiB9OwogCi1zdGF0aWMgaW5saW5lIGNwdXRpbWU2NF90IGdldF9jcHVfaWRsZV90aW1lX2ppZmZ5KHVuc2lnbmVkIGludCBjcHUsCi0JCQkJCQkJY3B1dGltZTY0X3QgKndhbGwpCitzdGF0aWMgaW5saW5lIHU2NCBnZXRfY3B1X2lkbGVfdGltZV9qaWZmeSh1bnNpZ25lZCBpbnQgY3B1LCB1NjQgKndhbGwpCiB7Ci0JY3B1dGltZTY0X3QgaWRsZV90aW1lOwotCWNwdXRpbWU2NF90IGN1cl93YWxsX3RpbWU7Ci0JY3B1dGltZTY0X3QgYnVzeV90aW1lOworCXU2NCBpZGxlX3RpbWU7CisJdTY0IGN1cl93YWxsX3RpbWU7CisJdTY0IGJ1c3lfdGltZTsKIAogCWN1cl93YWxsX3RpbWUgPSBqaWZmaWVzNjRfdG9fY3B1dGltZTY0KGdldF9qaWZmaWVzXzY0KCkpOwotCWJ1c3lfdGltZSA9IGNwdXRpbWU2NF9hZGQoa3N0YXRfY3B1KGNwdSkuY3B1c3RhdC51c2VyLAotCQkJa3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5zeXN0ZW0pOwogCi0JYnVzeV90aW1lID0gY3B1dGltZTY0X2FkZChidXN5X3RpbWUsIGtzdGF0X2NwdShjcHUpLmNwdXN0YXQuaXJxKTsKLQlidXN5X3RpbWUgPSBjcHV0aW1lNjRfYWRkKGJ1c3lfdGltZSwga3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5zb2Z0aXJxKTsKLQlidXN5X3RpbWUgPSBjcHV0aW1lNjRfYWRkKGJ1c3lfdGltZSwga3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5zdGVhbCk7Ci0JYnVzeV90aW1lID0gY3B1dGltZTY0X2FkZChidXN5X3RpbWUsIGtzdGF0X2NwdShjcHUpLmNwdXN0YXQubmljZSk7CisJYnVzeV90aW1lICA9IGtjcHVzdGF0X2NwdShjcHUpLmNwdXN0YXRbQ1BVVElNRV9VU0VSXTsKKwlidXN5X3RpbWUgKz0ga2NwdXN0YXRfY3B1KGNwdSkuY3B1c3RhdFtDUFVUSU1FX1NZU1RFTV07CisJYnVzeV90aW1lICs9IGtjcHVzdGF0X2NwdShjcHUpLmNwdXN0YXRbQ1BVVElNRV9JUlFdOworCWJ1c3lfdGltZSArPSBrY3B1c3RhdF9jcHUoY3B1KS5jcHVzdGF0W0NQVVRJTUVfU09GVElSUV07CisJYnVzeV90aW1lICs9IGtjcHVzdGF0X2NwdShjcHUpLmNwdXN0YXRbQ1BVVElNRV9TVEVBTF07CisJYnVzeV90aW1lICs9IGtjcHVzdGF0X2NwdShjcHUpLmNwdXN0YXRbQ1BVVElNRV9OSUNFXTsKIAotCWlkbGVfdGltZSA9IGNwdXRpbWU2NF9zdWIoY3VyX3dhbGxfdGltZSwgYnVzeV90aW1lKTsKKwlpZGxlX3RpbWUgPSBjdXJfd2FsbF90aW1lIC0gYnVzeV90aW1lOwogCWlmICh3YWxsKQotCQkqd2FsbCA9IChjcHV0aW1lNjRfdClqaWZmaWVzX3RvX3VzZWNzKGN1cl93YWxsX3RpbWUpOworCQkqd2FsbCA9IGppZmZpZXNfdG9fdXNlY3MoY3VyX3dhbGxfdGltZSk7CiAKLQlyZXR1cm4gKGNwdXRpbWU2NF90KWppZmZpZXNfdG9fdXNlY3MoaWRsZV90aW1lKTsKKwlyZXR1cm4gamlmZmllc190b191c2VjcyhpZGxlX3RpbWUpOwogfQogCiBzdGF0aWMgaW5saW5lIGNwdXRpbWU2NF90IGdldF9jcHVfaWRsZV90aW1lKHVuc2lnbmVkIGludCBjcHUsIGNwdXRpbWU2NF90ICp3YWxsKQpAQCAtMzQ1LDcgKzM0NCw3IEBACiAJCWRic19pbmZvLT5wcmV2X2NwdV9pZGxlID0gZ2V0X2NwdV9pZGxlX3RpbWUoaiwKIAkJCQkJCSZkYnNfaW5mby0+cHJldl9jcHVfd2FsbCk7CiAJCWlmIChkYnNfdHVuZXJzX2lucy5pZ25vcmVfbmljZSkKLQkJCWRic19pbmZvLT5wcmV2X2NwdV9uaWNlID0ga3N0YXRfY3B1KGopLmNwdXN0YXQubmljZTsKKwkJCWRic19pbmZvLT5wcmV2X2NwdV9uaWNlID0ga2NwdXN0YXRfY3B1KGopLmNwdXN0YXRbQ1BVVElNRV9OSUNFXTsKIAogCX0KIAlyZXR1cm4gY291bnQ7CkBAIC00NDIsMjQgKzQ0MSwyNCBAQAogCQljdXJfaWRsZV90aW1lID0gZ2V0X2NwdV9pZGxlX3RpbWUoaiwgJmN1cl93YWxsX3RpbWUpOwogCQljdXJfaW93YWl0X3RpbWUgPSBnZXRfY3B1X2lvd2FpdF90aW1lKGosICZjdXJfd2FsbF90aW1lKTsKIAotCQl3YWxsX3RpbWUgPSAodW5zaWduZWQgaW50KSBjcHV0aW1lNjRfc3ViKGN1cl93YWxsX3RpbWUsCi0JCQkJal9kYnNfaW5mby0+cHJldl9jcHVfd2FsbCk7CisJCXdhbGxfdGltZSA9ICh1bnNpZ25lZCBpbnQpCisJCQkoY3VyX3dhbGxfdGltZSAtIGpfZGJzX2luZm8tPnByZXZfY3B1X3dhbGwpOwogCQlqX2Ric19pbmZvLT5wcmV2X2NwdV93YWxsID0gY3VyX3dhbGxfdGltZTsKIAotCQlpZGxlX3RpbWUgPSAodW5zaWduZWQgaW50KSBjcHV0aW1lNjRfc3ViKGN1cl9pZGxlX3RpbWUsCi0JCQkJal9kYnNfaW5mby0+cHJldl9jcHVfaWRsZSk7CisJCWlkbGVfdGltZSA9ICh1bnNpZ25lZCBpbnQpCisJCQkoY3VyX2lkbGVfdGltZSAtIGpfZGJzX2luZm8tPnByZXZfY3B1X2lkbGUpOwogCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlID0gY3VyX2lkbGVfdGltZTsKIAotCQlpb3dhaXRfdGltZSA9ICh1bnNpZ25lZCBpbnQpIGNwdXRpbWU2NF9zdWIoY3VyX2lvd2FpdF90aW1lLAotCQkJCWpfZGJzX2luZm8tPnByZXZfY3B1X2lvd2FpdCk7CisJCWlvd2FpdF90aW1lID0gKHVuc2lnbmVkIGludCkKKwkJCShjdXJfaW93YWl0X3RpbWUgLSBqX2Ric19pbmZvLT5wcmV2X2NwdV9pb3dhaXQpOwogCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pb3dhaXQgPSBjdXJfaW93YWl0X3RpbWU7CiAKIAkJaWYgKGRic190dW5lcnNfaW5zLmlnbm9yZV9uaWNlKSB7Ci0JCQljcHV0aW1lNjRfdCBjdXJfbmljZTsKKwkJCXU2NCBjdXJfbmljZTsKIAkJCXVuc2lnbmVkIGxvbmcgY3VyX25pY2VfamlmZmllczsKIAotCQkJY3VyX25pY2UgPSBjcHV0aW1lNjRfc3ViKGtzdGF0X2NwdShqKS5jcHVzdGF0Lm5pY2UsCi0JCQkJCSBqX2Ric19pbmZvLT5wcmV2X2NwdV9uaWNlKTsKKwkJCWN1cl9uaWNlID0ga2NwdXN0YXRfY3B1KGopLmNwdXN0YXRbQ1BVVElNRV9OSUNFXSAtCisJCQkJCSBqX2Ric19pbmZvLT5wcmV2X2NwdV9uaWNlOwogCQkJLyoKIAkJCSAqIEFzc3VtcHRpb246IG5pY2UgdGltZSBiZXR3ZWVuIHNhbXBsaW5nIHBlcmlvZHMgd2lsbAogCQkJICogYmUgbGVzcyB0aGFuIDJeMzIgamlmZmllcyBmb3IgMzIgYml0IHN5cwpAQCAtNDY3LDcgKzQ2Niw3IEBACiAJCQljdXJfbmljZV9qaWZmaWVzID0gKHVuc2lnbmVkIGxvbmcpCiAJCQkJCWNwdXRpbWU2NF90b19qaWZmaWVzNjQoY3VyX25pY2UpOwogCi0JCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9uaWNlID0ga3N0YXRfY3B1KGopLmNwdXN0YXQubmljZTsKKwkJCWpfZGJzX2luZm8tPnByZXZfY3B1X25pY2UgPSBrY3B1c3RhdF9jcHUoaikuY3B1c3RhdFtDUFVUSU1FX05JQ0VdOwogCQkJaWRsZV90aW1lICs9IGppZmZpZXNfdG9fdXNlY3MoY3VyX25pY2VfamlmZmllcyk7CiAJCX0KIApAQCAtNjQ2LDEwICs2NDUsOSBAQAogCiAJCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlID0gZ2V0X2NwdV9pZGxlX3RpbWUoaiwKIAkJCQkJCSZqX2Ric19pbmZvLT5wcmV2X2NwdV93YWxsKTsKLQkJCWlmIChkYnNfdHVuZXJzX2lucy5pZ25vcmVfbmljZSkgeworCQkJaWYgKGRic190dW5lcnNfaW5zLmlnbm9yZV9uaWNlKQogCQkJCWpfZGJzX2luZm8tPnByZXZfY3B1X25pY2UgPQotCQkJCQkJa3N0YXRfY3B1KGopLmNwdXN0YXQubmljZTsKLQkJCX0KKwkJCQkJCWtjcHVzdGF0X2NwdShqKS5jcHVzdGF0W0NQVVRJTUVfTklDRV07CiAJCX0KIAkJdGhpc19kYnNfaW5mby0+Y3B1ID0gY3B1OwogCQl0aGlzX2Ric19pbmZvLT5yYXRlX211bHQgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKaW5kZXggYzUwNzJhOS4uMmE1MDhlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCkBAIC02MSw5ICs2MSw4IEBACiAJc3Bpbl9sb2NrKCZjcHVmcmVxX3N0YXRzX2xvY2spOwogCXN0YXQgPSBwZXJfY3B1KGNwdWZyZXFfc3RhdHNfdGFibGUsIGNwdSk7CiAJaWYgKHN0YXQtPnRpbWVfaW5fc3RhdGUpCi0JCXN0YXQtPnRpbWVfaW5fc3RhdGVbc3RhdC0+bGFzdF9pbmRleF0gPQotCQkJY3B1dGltZTY0X2FkZChzdGF0LT50aW1lX2luX3N0YXRlW3N0YXQtPmxhc3RfaW5kZXhdLAotCQkJCSAgICAgIGNwdXRpbWVfc3ViKGN1cl90aW1lLCBzdGF0LT5sYXN0X3RpbWUpKTsKKwkJc3RhdC0+dGltZV9pbl9zdGF0ZVtzdGF0LT5sYXN0X2luZGV4XSArPQorCQkJY3VyX3RpbWUgLSBzdGF0LT5sYXN0X3RpbWU7CiAJc3RhdC0+bGFzdF90aW1lID0gY3VyX3RpbWU7CiAJc3Bpbl91bmxvY2soJmNwdWZyZXFfc3RhdHNfbG9jayk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2RtYS9LY29uZmlnIGIvZHJpdmVycy9kbWEvS2NvbmZpZwppbmRleCBhYjhmNDY5Li41YTk5YmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2RtYS9LY29uZmlnCisrKyBiL2RyaXZlcnMvZG1hL0tjb25maWcKQEAgLTEyNCw3ICsxMjQsNyBAQAogCiBjb25maWcgTVgzX0lQVQogCWJvb2wgIk1YM3ggSW1hZ2UgUHJvY2Vzc2luZyBVbml0IHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX01YMworCWRlcGVuZHMgb24gU09DX0lNWDMxIHx8wqBTT0NfSU1YMzUKIAlzZWxlY3QgRE1BX0VOR0lORQogCWRlZmF1bHQgeQogCWhlbHAKQEAgLTIxNiw3ICsyMTYsNyBAQAogCiBjb25maWcgSU1YX1NETUEKIAl0cmlzdGF0ZSAiaS5NWCBTRE1BIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBBUkNIX01YMjUgfHwgQVJDSF9NWDMgfHwgQVJDSF9NWDUKKwlkZXBlbmRzIG9uIEFSQ0hfTVgyNSB8fCBTT0NfSU1YMzEgfHzCoFNPQ19JTVgzNSB8fCBBUkNIX01YNQogCXNlbGVjdCBETUFfRU5HSU5FCiAJaGVscAogCSAgU3VwcG9ydCB0aGUgaS5NWCBTRE1BIGVuZ2luZS4gVGhpcyBlbmdpbmUgaXMgaW50ZWdyYXRlZCBpbnRvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2VkYWMvaTdjb3JlX2VkYWMuYyBiL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCmluZGV4IDcwYWQ4OTIuLjg1NjhkOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCisrKyBiL2RyaXZlcnMvZWRhYy9pN2NvcmVfZWRhYy5jCkBAIC0yMjM0LDcgKzIyMzQsNyBAQAogCWlmIChwdnQtPmVuYWJsZV9zY3J1YikKIAkJZGlzYWJsZV9zZHJhbV9zY3J1Yl9zZXR0aW5nKG1jaSk7CiAKLQlhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmeDg2X21jZV9kZWNvZGVyX2NoYWluLCAmaTdfbWNlX2RlYyk7CisJbWNlX3VucmVnaXN0ZXJfZGVjb2RlX2NoYWluKCZpN19tY2VfZGVjKTsKIAogCS8qIERpc2FibGUgRURBQyBwb2xsaW5nICovCiAJaTdjb3JlX3BjaV9jdGxfcmVsZWFzZShwdnQpOwpAQCAtMjMzNiw3ICsyMzM2LDcgQEAKIAkvKiBEQ0xLIGZvciBzY3J1YiByYXRlIHNldHRpbmcgKi8KIAlwdnQtPmRjbGtfZnJlcSA9IGdldF9kY2xrX2ZyZXEoKTsKIAotCWF0b21pY19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmeDg2X21jZV9kZWNvZGVyX2NoYWluLCAmaTdfbWNlX2RlYyk7CisJbWNlX3JlZ2lzdGVyX2RlY29kZV9jaGFpbigmaTdfbWNlX2RlYyk7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9lZGFjL21jZV9hbWQuYyBiL2RyaXZlcnMvZWRhYy9tY2VfYW1kLmMKaW5kZXggZDA4NjRkOS4uYmQ5MjZlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9lZGFjL21jZV9hbWQuYworKysgYi9kcml2ZXJzL2VkYWMvbWNlX2FtZC5jCkBAIC04ODQsNyArODg0LDcgQEAKIAogCXByX2luZm8oIk1DRTogSW4ta2VybmVsIE1DRSBkZWNvZGluZyBlbmFibGVkLlxuIik7CiAKLQlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJng4Nl9tY2VfZGVjb2Rlcl9jaGFpbiwgJmFtZF9tY2VfZGVjX25iKTsKKwltY2VfcmVnaXN0ZXJfZGVjb2RlX2NoYWluKCZhbWRfbWNlX2RlY19uYik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTg5Myw3ICs4OTMsNyBAQAogI2lmZGVmIE1PRFVMRQogc3RhdGljIHZvaWQgX19leGl0IG1jZV9hbWRfZXhpdCh2b2lkKQogewotCWF0b21pY19ub3RpZmllcl9jaGFpbl91bnJlZ2lzdGVyKCZ4ODZfbWNlX2RlY29kZXJfY2hhaW4sICZhbWRfbWNlX2RlY19uYik7CisJbWNlX3VucmVnaXN0ZXJfZGVjb2RlX2NoYWluKCZhbWRfbWNlX2RlY19uYik7CiAJa2ZyZWUoZmFtX29wcyk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMgYi9kcml2ZXJzL2VkYWMvc2JfZWRhYy5jCmluZGV4IDdhNDAyYmYuLjFkYzExOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZWRhYy9zYl9lZGFjLmMKKysrIGIvZHJpdmVycy9lZGFjL3NiX2VkYWMuYwpAQCAtMTYwOSwxMSArMTYwOSw5IEBACiAJCW1jZS0+Y3B1dmVuZG9yLCBtY2UtPmNwdWlkLCBtY2UtPnRpbWUsCiAJCW1jZS0+c29ja2V0aWQsIG1jZS0+YXBpY2lkKTsKIAotI2lmZGVmIENPTkZJR19TTVAKIAkvKiBPbmx5IGhhbmRsZSBpZiBpdCBpcyB0aGUgcmlnaHQgbWMgY29udHJvbGxlciAqLwogCWlmIChjcHVfZGF0YShtY2UtPmNwdSkucGh5c19wcm9jX2lkICE9IHB2dC0+c2JyaWRnZV9kZXYtPm1jKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7Ci0jZW5kaWYKIAogCXNtcF9ybWIoKTsKIAlpZiAoKHB2dC0+bWNlX291dCArIDEpICUgTUNFX0xPR19MRU4gPT0gcHZ0LT5tY2VfaW4pIHsKQEAgLTE2NjEsOCArMTY1OSw3IEBACiAJZGVidWdmMCgiTUM6ICIgX19GSUxFX18gIjogJXMoKTogbWNpID0gJXAsIGRldiA9ICVwXG4iLAogCQlfX2Z1bmNfXywgbWNpLCAmc2JyaWRnZV9kZXYtPnBkZXZbMF0tPmRldik7CiAKLQlhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmeDg2X21jZV9kZWNvZGVyX2NoYWluLAotCQkJCQkgJnNicmlkZ2VfbWNlX2RlYyk7CisJbWNlX3VucmVnaXN0ZXJfZGVjb2RlX2NoYWluKCZzYnJpZGdlX21jZV9kZWMpOwogCiAJLyogUmVtb3ZlIE1DIHN5c2ZzIG5vZGVzICovCiAJZWRhY19tY19kZWxfbWMobWNpLT5kZXYpOwpAQCAtMTczMSw4ICsxNzI4LDcgQEAKIAkJZ290byBmYWlsMDsKIAl9CiAKLQlhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJng4Nl9tY2VfZGVjb2Rlcl9jaGFpbiwKLQkJCQkgICAgICAgJnNicmlkZ2VfbWNlX2RlYyk7CisJbWNlX3JlZ2lzdGVyX2RlY29kZV9jaGFpbigmc2JyaWRnZV9tY2VfZGVjKTsKIAlyZXR1cm4gMDsKIAogZmFpbDA6CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnQuYyBiL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdC5jCmluZGV4IGM4MTFjYjEuLjJjY2U0NGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdC5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdC5jCkBAIC03NDYsNiArNzQ2LDM3IEBACiAJaWJmdF9jbGVhbnVwKCk7CiB9CiAKKyNpZmRlZiBDT05GSUdfQUNQSQorc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJY2hhciAqc2lnbjsKK30gaWJmdF9zaWduc1tdID0geworCS8qCisJICogT25lIHNwZWMgc2F5cyAiSUJGVCIsIHRoZSBvdGhlciBzYXlzICJpQkZUIi4gV2UgaGF2ZSB0byBjaGVjaworCSAqIGZvciBib3RoLgorCSAqLworCXsgQUNQSV9TSUdfSUJGVCB9LAorCXsgImlCRlQiIH0sCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYWNwaV9maW5kX2liZnRfcmVnaW9uKHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSA9IE5VTEw7CisKKwlpZiAoYWNwaV9kaXNhYmxlZCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWJmdF9zaWducykgJiYgIWliZnRfYWRkcjsgaSsrKSB7CisJCWFjcGlfZ2V0X3RhYmxlKGliZnRfc2lnbnNbaV0uc2lnbiwgMCwgJnRhYmxlKTsKKwkJaWJmdF9hZGRyID0gKHN0cnVjdCBhY3BpX3RhYmxlX2liZnQgKil0YWJsZTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgX19pbml0IGFjcGlfZmluZF9pYmZ0X3JlZ2lvbih2b2lkKQoreworfQorI2VuZGlmCisKIC8qCiAgKiBpYmZ0X2luaXQoKSAtIGNyZWF0ZXMgc3lzZnMgdHJlZSBlbnRyaWVzIGZvciB0aGUgaUJGVCBkYXRhLgogICovCkBAIC03NTMsOSArNzg0LDE2IEBACiB7CiAJaW50IHJjID0gMDsKIAorCS8qCisJICAgQXMgb24gVUVGSSBzeXN0ZW1zIHRoZSBzZXR1cF9hcmNoKCkvZmluZF9pYmZ0X3JlZ2lvbigpCisJICAgaXMgY2FsbGVkIGJlZm9yZSBBQ1BJIHRhYmxlcyBhcmUgcGFyc2VkIGFuZCBpdCBvbmx5IGRvZXMKKwkgICBsZWdhY3kgZmluZGluZy4KKwkqLworCWlmICghaWJmdF9hZGRyKQorCQlhY3BpX2ZpbmRfaWJmdF9yZWdpb24oKTsKKwogCWlmIChpYmZ0X2FkZHIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiaUJGVCBkZXRlY3RlZCBhdCAweCVsbHguXG4iLAotCQkgICAgICAgKHU2NClpc2FfdmlydF90b19idXMoaWJmdF9hZGRyKSk7CisJCXByX2luZm8oImlCRlQgZGV0ZWN0ZWQuXG4iKTsKIAogCQlyYyA9IGliZnRfY2hlY2tfZGV2aWNlKCk7CiAJCWlmIChyYykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMgYi9kcml2ZXJzL2Zpcm13YXJlL2lzY3NpX2liZnRfZmluZC5jCmluZGV4IGJmZTcyMzIuLjRkYTRlYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZmlybXdhcmUvaXNjc2lfaWJmdF9maW5kLmMKKysrIGIvZHJpdmVycy9maXJtd2FyZS9pc2NzaV9pYmZ0X2ZpbmQuYwpAQCAtNDUsMTMgKzQ1LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCWNoYXIgKnNpZ247CiB9IGliZnRfc2lnbnNbXSA9IHsKLSNpZmRlZiBDT05GSUdfQUNQSQotCS8qCi0JICogT25lIHNwZWMgc2F5cyAiSUJGVCIsIHRoZSBvdGhlciBzYXlzICJpQkZUIi4gV2UgaGF2ZSB0byBjaGVjawotCSAqIGZvciBib3RoLgotCSAqLwotCXsgQUNQSV9TSUdfSUJGVCB9LAotI2VuZGlmCiAJeyAiaUJGVCIgfSwKIAl7ICJCSUZUIiB9LAkvKiBCcm9hZGNvbSBpU0NTSSBPZmZsb2FkICovCiB9OwpAQCAtNjIsMTQgKzU1LDYgQEAKICNkZWZpbmUgVkdBX01FTSAweEEwMDAwIC8qIFZHQSBidWZmZXIgKi8KICNkZWZpbmUgVkdBX1NJWkUgMHgyMDAwMCAvKiAxMjhrQiAqLwogCi0jaWZkZWYgQ09ORklHX0FDUEkKLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfZmluZF9pYmZ0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqaGVhZGVyKQotewotCWliZnRfYWRkciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9pYmZ0ICopaGVhZGVyOwotCXJldHVybiAwOwotfQotI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCi0KIHN0YXRpYyBpbnQgX19pbml0IGZpbmRfaWJmdF9pbl9tZW0odm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIHBvczsKQEAgLTk0LDYgKzc5LDcgQEAKIAkJCQkgKiB0aGUgdGFibGUgY2Fubm90IGJlIHZhbGlkLiAqLwogCQkJCWlmIChwb3MgKyBsZW4gPD0gKElCRlRfRU5ELTEpKSB7CiAJCQkJCWliZnRfYWRkciA9IChzdHJ1Y3QgYWNwaV90YWJsZV9pYmZ0ICopdmlydDsKKwkJCQkJcHJfaW5mbygiaUJGVCBmb3VuZCBhdCAweCVseC5cbiIsIHBvcyk7CiAJCQkJCWdvdG8gZG9uZTsKIAkJCQl9CiAJCQl9CkBAIC0xMDgsMjAgKzk0LDEyIEBACiAgKi8KIHVuc2lnbmVkIGxvbmcgX19pbml0IGZpbmRfaWJmdF9yZWdpb24odW5zaWduZWQgbG9uZyAqc2l6ZXApCiB7Ci0jaWZkZWYgQ09ORklHX0FDUEkKLQlpbnQgaTsKLSNlbmRpZgogCWliZnRfYWRkciA9IE5VTEw7CiAKLSNpZmRlZiBDT05GSUdfQUNQSQotCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGliZnRfc2lnbnMpICYmICFpYmZ0X2FkZHI7IGkrKykKLQkJYWNwaV90YWJsZV9wYXJzZShpYmZ0X3NpZ25zW2ldLnNpZ24sIGFjcGlfZmluZF9pYmZ0KTsKLSNlbmRpZiAvKiBDT05GSUdfQUNQSSAqLwotCiAJLyogaUJGVCAxLjAzIHNlY3Rpb24gMS40LjMuMSBtYW5kYXRlcyB0aGF0IFVFRkkgbWFjaGluZXMgd2lsbAogCSAqIG9ubHkgdXNlIEFDUEkgZm9yIHRoaXMgKi8KIAotCWlmICghaWJmdF9hZGRyICYmICFlZmlfZW5hYmxlZCkKKwlpZiAoIWVmaV9lbmFibGVkKQogCQlmaW5kX2liZnRfaW5fbWVtKCk7CiAKIAlpZiAoaWJmdF9hZGRyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Zpcm13YXJlL3NpZ21hLmMgYi9kcml2ZXJzL2Zpcm13YXJlL3NpZ21hLmMKaW5kZXggZjEwZmM1Mi4uMWVlZGI2ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9maXJtd2FyZS9zaWdtYS5jCisrKyBiL2RyaXZlcnMvZmlybXdhcmUvc2lnbWEuYwpAQCAtMTQsMTMgKzE0LDM0IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbWEuaD4KIAotLyogUmV0dXJuOiAwPT1PSywgPDA9PWVycm9yLCA9MSA9PW5vIG1vcmUgYWN0aW9ucyAqLwotc3RhdGljIGludAotcHJvY2Vzc19zaWdtYV9hY3Rpb24oc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgc3RydWN0IHNpZ21hX2Zpcm13YXJlICpzc2Z3KQorc3RhdGljIHNpemVfdCBzaWdtYV9hY3Rpb25fc2l6ZShzdHJ1Y3Qgc2lnbWFfYWN0aW9uICpzYSkKIHsKLQlzdHJ1Y3Qgc2lnbWFfYWN0aW9uICpzYSA9ICh2b2lkICopKHNzZnctPmZ3LT5kYXRhICsgc3Nmdy0+cG9zKTsKKwlzaXplX3QgcGF5bG9hZCA9IDA7CisKKwlzd2l0Y2ggKHNhLT5pbnN0cikgeworCWNhc2UgU0lHTUFfQUNUSU9OX1dSSVRFWEJZVEVTOgorCWNhc2UgU0lHTUFfQUNUSU9OX1dSSVRFU0lOR0xFOgorCWNhc2UgU0lHTUFfQUNUSU9OX1dSSVRFU0FGRUxPQUQ6CisJCXBheWxvYWQgPSBzaWdtYV9hY3Rpb25fbGVuKHNhKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcGF5bG9hZCA9IEFMSUdOKHBheWxvYWQsIDIpOworCisJcmV0dXJuIHBheWxvYWQgKyBzaXplb2Yoc3RydWN0IHNpZ21hX2FjdGlvbik7Cit9CisKKy8qCisgKiBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgdmFsdWUgaW4gY2FzZSBvZiBhbiBlcnJvciwgMCBpZiBwcm9jZXNzaW5nIG9mCisgKiB0aGUgZmlybXdhcmUgc2hvdWxkIGJlIHN0b3BwZWQgYWZ0ZXIgdGhpcyBhY3Rpb24sIDEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50Citwcm9jZXNzX3NpZ21hX2FjdGlvbihzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3Qgc2lnbWFfYWN0aW9uICpzYSkKK3sKIAlzaXplX3QgbGVuID0gc2lnbWFfYWN0aW9uX2xlbihzYSk7Ci0JaW50IHJldCA9IDA7CisJaW50IHJldDsKIAogCXByX2RlYnVnKCIlczogaW5zdHI6JWkgYWRkcjolI3ggbGVuOiV6dVxuIiwgX19mdW5jX18sCiAJCXNhLT5pbnN0ciwgc2EtPmFkZHIsIGxlbik7CkBAIC0yOSw0NCArNTAsNTAgQEAKIAljYXNlIFNJR01BX0FDVElPTl9XUklURVhCWVRFUzoKIAljYXNlIFNJR01BX0FDVElPTl9XUklURVNJTkdMRToKIAljYXNlIFNJR01BX0FDVElPTl9XUklURVNBRkVMT0FEOgotCQlpZiAoc3Nmdy0+ZnctPnNpemUgPCBzc2Z3LT5wb3MgKyBsZW4pCi0JCQlyZXR1cm4gLUVJTlZBTDsKIAkJcmV0ID0gaTJjX21hc3Rlcl9zZW5kKGNsaWVudCwgKHZvaWQgKikmc2EtPmFkZHIsIGxlbik7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwotCiAJY2FzZSBTSUdNQV9BQ1RJT05fREVMQVk6Ci0JCXJldCA9IDA7CiAJCXVkZWxheShsZW4pOwogCQlsZW4gPSAwOwogCQlicmVhazsKLQogCWNhc2UgU0lHTUFfQUNUSU9OX0VORDoKLQkJcmV0dXJuIDE7Ci0KKwkJcmV0dXJuIDA7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JLyogd2hlbiBhcnJpdmUgaGVyZSByZXQ9MCBvciBzZW50IGRhdGEgKi8KLQlzc2Z3LT5wb3MgKz0gc2lnbWFfYWN0aW9uX3NpemUoc2EsIGxlbik7Ci0JcmV0dXJuIHNzZnctPnBvcyA9PSBzc2Z3LT5mdy0+c2l6ZTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogcHJvY2Vzc19zaWdtYV9hY3Rpb25zKHN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQsIHN0cnVjdCBzaWdtYV9maXJtd2FyZSAqc3NmdykKIHsKLQlwcl9kZWJ1ZygiJXM6IHByb2Nlc3NpbmcgJXBcbiIsIF9fZnVuY19fLCBzc2Z3KTsKKwlzdHJ1Y3Qgc2lnbWFfYWN0aW9uICpzYTsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgcmV0OwogCi0Jd2hpbGUgKDEpIHsKLQkJaW50IHJldCA9IHByb2Nlc3Nfc2lnbWFfYWN0aW9uKGNsaWVudCwgc3Nmdyk7CisJd2hpbGUgKHNzZnctPnBvcyArIHNpemVvZigqc2EpIDw9IHNzZnctPmZ3LT5zaXplKSB7CisJCXNhID0gKHN0cnVjdCBzaWdtYV9hY3Rpb24gKikoc3Nmdy0+ZnctPmRhdGEgKyBzc2Z3LT5wb3MpOworCisJCXNpemUgPSBzaWdtYV9hY3Rpb25fc2l6ZShzYSk7CisJCXNzZnctPnBvcyArPSBzaXplOworCQlpZiAoc3Nmdy0+cG9zID4gc3Nmdy0+ZnctPnNpemUgfHwgc2l6ZSA9PSAwKQorCQkJYnJlYWs7CisKKwkJcmV0ID0gcHJvY2Vzc19zaWdtYV9hY3Rpb24oY2xpZW50LCBzYSk7CisKIAkJcHJfZGVidWcoIiVzOiBhY3Rpb24gcmV0dXJuZWQgJWlcbiIsIF9fZnVuY19fLCByZXQpOwotCQlpZiAocmV0ID09IDEpCi0JCQlyZXR1cm4gMDsKLQkJZWxzZSBpZiAocmV0KQorCisJCWlmIChyZXQgPD0gMCkKIAkJCXJldHVybiByZXQ7CiAJfQorCisJaWYgKHNzZnctPnBvcyAhPSBzc2Z3LT5mdy0+c2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKIH0KIAogaW50IHByb2Nlc3Nfc2lnbWFfZmlybXdhcmUoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCwgY29uc3QgY2hhciAqbmFtZSkKQEAgLTg5LDE2ICsxMTYsMjQgQEAKIAogCS8qIHRoZW4gdmVyaWZ5IHRoZSBoZWFkZXIgKi8KIAlyZXQgPSAtRUlOVkFMOwotCWlmIChmdy0+c2l6ZSA8IHNpemVvZigqc3Nmd19oZWFkKSkKKworCS8qCisJICogUmVqZWN0IHRvbyBzbWFsbCBvciB1bnJlYXNvbmFibGUgbGFyZ2UgZmlsZXMuIFRoZSB1cHBlciBsaW1pdCBoYXMgYmVlbgorCSAqIGNob3NlbiBhIGJpdCBhcmJpdHJhcmlseSwgYnV0IGl0IHNob3VsZCBiZSBlbm91Z2ggZm9yIGFsbCBwcmFjdGljYWwKKwkgKiBwdXJwb3NlcyBhbmQgaGF2aW5nIHRoZSBsaW1pdCBtYWtlcyBpdCBlYXNpZXIgdG8gYXZvaWQgaW50ZWdlcgorCSAqIG92ZXJmbG93cyBsYXRlciBpbiB0aGUgbG9hZGluZyBwcm9jZXNzLgorCSAqLworCWlmIChmdy0+c2l6ZSA8IHNpemVvZigqc3Nmd19oZWFkKSB8fCBmdy0+c2l6ZSA+PSAweDQwMDAwMDApCiAJCWdvdG8gZG9uZTsKIAogCXNzZndfaGVhZCA9ICh2b2lkICopZnctPmRhdGE7CiAJaWYgKG1lbWNtcChzc2Z3X2hlYWQtPm1hZ2ljLCBTSUdNQV9NQUdJQywgQVJSQVlfU0laRShzc2Z3X2hlYWQtPm1hZ2ljKSkpCiAJCWdvdG8gZG9uZTsKIAotCWNyYyA9IGNyYzMyKDAsIGZ3LT5kYXRhLCBmdy0+c2l6ZSk7CisJY3JjID0gY3JjMzIoMCwgZnctPmRhdGEgKyBzaXplb2YoKnNzZndfaGVhZCksCisJCQlmdy0+c2l6ZSAtIHNpemVvZigqc3Nmd19oZWFkKSk7CiAJcHJfZGVidWcoIiVzOiBjcmM9JXhcbiIsIF9fZnVuY19fLCBjcmMpOwotCWlmIChjcmMgIT0gc3Nmd19oZWFkLT5jcmMpCisJaWYgKGNyYyAhPSBsZTMyX3RvX2NwdShzc2Z3X2hlYWQtPmNyYykpCiAJCWdvdG8gZG9uZTsKIAogCXNzZncucG9zID0gc2l6ZW9mKCpzc2Z3X2hlYWQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncGlvL01ha2VmaWxlIGIvZHJpdmVycy9ncGlvL01ha2VmaWxlCmluZGV4IGRiY2IwYmMuLjRlMDE4ZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwaW8vTWFrZWZpbGUKQEAgLTE4LDcgKzE4LDcgQEAKIG9iai0kKENPTkZJR19HUElPX0VQOTNYWCkJKz0gZ3Bpby1lcDkzeHgubwogb2JqLSQoQ09ORklHX0dQSU9fSVQ4NzYxRSkJKz0gZ3Bpby1pdDg3NjFlLm8KIG9iai0kKENPTkZJR19HUElPX0pBTlpfVFRMKQkrPSBncGlvLWphbnotdHRsLm8KLW9iai0kKENPTkZJR19NQUNIX0tTODY5NSkJKz0gZ3Bpby1rczg2OTUubworb2JqLSQoQ09ORklHX0FSQ0hfS1M4Njk1KQkrPSBncGlvLWtzODY5NS5vCiBvYmotJChDT05GSUdfR1BJT19MQU5HV0VMTCkJKz0gZ3Bpby1sYW5nd2VsbC5vCiBvYmotJChDT05GSUdfQVJDSF9MUEMzMlhYKQkrPSBncGlvLWxwYzMyeHgubwogb2JqLSQoQ09ORklHX0dQSU9fTUFYNzMwWCkJKz0gZ3Bpby1tYXg3MzB4Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLWRhOTA1Mi5jIGIvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDUyLmMKaW5kZXggMDM4ZjVlYi4uZjhjZTI5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDUyLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tZGE5MDUyLmMKQEAgLTIyLDcgKzIyLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tZmQvZGE5MDUyL2RhOTA1Mi5oPgogI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwNTIvcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvbWZkL2RhOTA1Mi9wZGF0YS5oPgotI2luY2x1ZGUgPGxpbnV4L21mZC9kYTkwNTIvZ3Bpby5oPgogCiAjZGVmaW5lIERBOTA1Ml9JTlBVVAkJCQkxCiAjZGVmaW5lIERBOTA1Ml9PVVRQVVRfT1BFTkRSQUlOCQkyCkBAIC00Myw2ICs0Miw5IEBACiAjZGVmaW5lIERBOTA1Ml9HUElPX01BU0tfVVBQRVJfTklCQkxFCQkweEYwCiAjZGVmaW5lIERBOTA1Ml9HUElPX01BU0tfTE9XRVJfTklCQkxFCQkweDBGCiAjZGVmaW5lIERBOTA1Ml9HUElPX05JQkJMRV9TSElGVAkJNAorI2RlZmluZSBEQTkwNTJfSVJRX0dQSTAJCQkxNgorI2RlZmluZSBEQTkwNTJfR1BJT19PRERfU0hJRlQJCQk3CisjZGVmaW5lIERBOTA1Ml9HUElPX0VWRU5fU0hJRlQJCQkzCiAKIHN0cnVjdCBkYTkwNTJfZ3BpbyB7CiAJc3RydWN0IGRhOTA1MiAqZGE5MDUyOwpAQCAtMTA0LDMzICsxMDYsMjYgQEAKIHN0YXRpYyB2b2lkIGRhOTA1Ml9ncGlvX3NldChzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0LCBpbnQgdmFsdWUpCiB7CiAJc3RydWN0IGRhOTA1Ml9ncGlvICpncGlvID0gdG9fZGE5MDUyX2dwaW8oZ2MpOwotCXVuc2lnbmVkIGNoYXIgcmVnaXN0ZXJfdmFsdWUgPSAwOwogCWludCByZXQ7CiAKIAlpZiAoZGE5MDUyX2dwaW9fcG9ydF9vZGQob2Zmc2V0KSkgewotCQlpZiAodmFsdWUpIHsKLQkJCXJlZ2lzdGVyX3ZhbHVlID0gREE5MDUyX0dQSU9fT0REX1BPUlRfTU9ERTsKIAkJCXJldCA9IGRhOTA1Ml9yZWdfdXBkYXRlKGdwaW8tPmRhOTA1MiwgKG9mZnNldCA+PiAxKSArCiAJCQkJCQlEQTkwNTJfR1BJT18wXzFfUkVHLAogCQkJCQkJREE5MDUyX0dQSU9fT0REX1BPUlRfTU9ERSwKLQkJCQkJCXJlZ2lzdGVyX3ZhbHVlKTsKKwkJCQkJCXZhbHVlIDw8IERBOTA1Ml9HUElPX09ERF9TSElGVCk7CiAJCQlpZiAocmV0ICE9IDApCiAJCQkJZGV2X2VycihncGlvLT5kYTkwNTItPmRldiwKIAkJCQkJIkZhaWxlZCB0byB1cGRhdGVkIGdwaW8gb2RkIHJlZywlZCIsCiAJCQkJCXJldCk7Ci0JCX0KIAl9IGVsc2UgewotCQlpZiAodmFsdWUpIHsKLQkJCXJlZ2lzdGVyX3ZhbHVlID0gREE5MDUyX0dQSU9fRVZFTl9QT1JUX01PREU7CiAJCQlyZXQgPSBkYTkwNTJfcmVnX3VwZGF0ZShncGlvLT5kYTkwNTIsIChvZmZzZXQgPj4gMSkgKwogCQkJCQkJREE5MDUyX0dQSU9fMF8xX1JFRywKIAkJCQkJCURBOTA1Ml9HUElPX0VWRU5fUE9SVF9NT0RFLAotCQkJCQkJcmVnaXN0ZXJfdmFsdWUpOworCQkJCQkJdmFsdWUgPDwgREE5MDUyX0dQSU9fRVZFTl9TSElGVCk7CiAJCQlpZiAocmV0ICE9IDApCiAJCQkJZGV2X2VycihncGlvLT5kYTkwNTItPmRldiwKIAkJCQkJIkZhaWxlZCB0byB1cGRhdGVkIGdwaW8gZXZlbiByZWcsJWQiLAogCQkJCQlyZXQpOwotCQl9CiAJfQogfQogCkBAIC0yMDEsOSArMTk2LDkgQEAKIAkuZGlyZWN0aW9uX2lucHV0ID0gZGE5MDUyX2dwaW9fZGlyZWN0aW9uX2lucHV0LAogCS5kaXJlY3Rpb25fb3V0cHV0ID0gZGE5MDUyX2dwaW9fZGlyZWN0aW9uX291dHB1dCwKIAkudG9faXJxID0gZGE5MDUyX2dwaW9fdG9faXJxLAotCS5jYW5fc2xlZXAgPSAxOwotCS5uZ3BpbyA9IDE2OwotCS5iYXNlID0gLTE7CisJLmNhbl9zbGVlcCA9IDEsCisJLm5ncGlvID0gMTYsCisJLmJhc2UgPSAtMSwKIH07CiAKIHN0YXRpYyBpbnQgX19kZXZpbml0IGRhOTA1Ml9ncGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwaW8vZ3Bpby1tbC1pb2guYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1sLWlvaC5jCmluZGV4IGVhOGU3MzguLjQ2MTk1OGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1sLWlvaC5jCisrKyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1sLWlvaC5jCkBAIC0zMzIsNiArMzMyLDM0IEBACiAJCSAgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0uaW1hc2spOwogfQogCitzdGF0aWMgdm9pZCBpb2hfaXJxX2Rpc2FibGUoc3RydWN0IGlycV9kYXRhICpkKQoreworCXN0cnVjdCBpcnFfY2hpcF9nZW5lcmljICpnYyA9IGlycV9kYXRhX2dldF9pcnFfY2hpcF9kYXRhKGQpOworCXN0cnVjdCBpb2hfZ3BpbyAqY2hpcCA9IGdjLT5wcml2YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGllbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGlwLT5zcGlubG9jaywgZmxhZ3MpOworCWllbiA9IGlvcmVhZDMyKCZjaGlwLT5yZWctPnJlZ3NbY2hpcC0+Y2hdLmllbik7CisJaWVuICY9IH4oMSA8PCAoZC0+aXJxIC0gY2hpcC0+aXJxX2Jhc2UpKTsKKwlpb3dyaXRlMzIoaWVuLCAmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNoaXAtPnNwaW5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGlvaF9pcnFfZW5hYmxlKHN0cnVjdCBpcnFfZGF0YSAqZCkKK3sKKwlzdHJ1Y3QgaXJxX2NoaXBfZ2VuZXJpYyAqZ2MgPSBpcnFfZGF0YV9nZXRfaXJxX2NoaXBfZGF0YShkKTsKKwlzdHJ1Y3QgaW9oX2dwaW8gKmNoaXAgPSBnYy0+cHJpdmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpZW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2hpcC0+c3BpbmxvY2ssIGZsYWdzKTsKKwlpZW4gPSBpb3JlYWQzMigmY2hpcC0+cmVnLT5yZWdzW2NoaXAtPmNoXS5pZW4pOworCWllbiB8PSAxIDw8IChkLT5pcnEgLSBjaGlwLT5pcnFfYmFzZSk7CisJaW93cml0ZTMyKGllbiwgJmNoaXAtPnJlZy0+cmVnc1tjaGlwLT5jaF0uaWVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjaGlwLT5zcGlubG9jaywgZmxhZ3MpOworfQorCiBzdGF0aWMgaXJxcmV0dXJuX3QgaW9oX2dwaW9faGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJc3RydWN0IGlvaF9ncGlvICpjaGlwID0gZGV2X2lkOwpAQCAtMzM5LDcgKzM2Nyw3IEBACiAJaW50IGksIGo7CiAJaW50IHJldCA9IElSUV9OT05FOwogCi0JZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyssIGNoaXArKykgewogCQlyZWdfdmFsID0gaW9yZWFkMzIoJmNoaXAtPnJlZy0+cmVnc1tpXS5pc3RhdHVzKTsKIAkJZm9yIChqID0gMDsgaiA8IG51bV9wb3J0c1tpXTsgaisrKSB7CiAJCQlpZiAocmVnX3ZhbCAmIEJJVChqKSkgewpAQCAtMzcwLDYgKzM5OCw4IEBACiAJY3QtPmNoaXAuaXJxX21hc2sgPSBpb2hfaXJxX21hc2s7CiAJY3QtPmNoaXAuaXJxX3VubWFzayA9IGlvaF9pcnFfdW5tYXNrOwogCWN0LT5jaGlwLmlycV9zZXRfdHlwZSA9IGlvaF9pcnFfdHlwZTsKKwljdC0+Y2hpcC5pcnFfZGlzYWJsZSA9IGlvaF9pcnFfZGlzYWJsZTsKKwljdC0+Y2hpcC5pcnFfZW5hYmxlID0gaW9oX2lycV9lbmFibGU7CiAKIAlpcnFfc2V0dXBfZ2VuZXJpY19jaGlwKGdjLCBJUlFfTVNLKG51bSksIElSUV9HQ19JTklUX01BU0tfQ0FDSEUsCiAJCQkgICAgICAgSVJRX05PUkVRVUVTVCB8IElSUV9OT1BST0JFLCAwKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLW1wYzh4eHguYyBiL2RyaXZlcnMvZ3Bpby9ncGlvLW1wYzh4eHguYwppbmRleCBlYzNmY2YwLi41Y2QwNGI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwaW8vZ3Bpby1tcGM4eHh4LmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tbXBjOHh4eC5jCkBAIC0xMzIsNiArMTMyLDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbXBjNTEyMV9ncGlvX2Rpcl9vdXQoc3RydWN0IGdwaW9fY2hpcCAqZ2MsIHVuc2lnbmVkIGludCBncGlvLCBpbnQgdmFsKQoreworCS8qIEdQSU8gMjguLjMxIGFyZSBpbnB1dCBvbmx5IG9uIE1QQzUxMjEgKi8KKwlpZiAoZ3BpbyA+PSAyOCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gbXBjOHh4eF9ncGlvX2Rpcl9vdXQoZ2MsIGdwaW8sIHZhbCk7Cit9CisKIHN0YXRpYyBpbnQgbXBjOHh4eF9ncGlvX3RvX2lycShzdHJ1Y3QgZ3Bpb19jaGlwICpnYywgdW5zaWduZWQgb2Zmc2V0KQogewogCXN0cnVjdCBvZl9tbV9ncGlvX2NoaXAgKm1tID0gdG9fb2ZfbW1fZ3Bpb19jaGlwKGdjKTsKQEAgLTM0MCwxMSArMzQ5LDEwIEBACiAJbW1fZ2MtPnNhdmVfcmVncyA9IG1wYzh4eHhfZ3Bpb19zYXZlX3JlZ3M7CiAJZ2MtPm5ncGlvID0gTVBDOFhYWF9HUElPX1BJTlM7CiAJZ2MtPmRpcmVjdGlvbl9pbnB1dCA9IG1wYzh4eHhfZ3Bpb19kaXJfaW47Ci0JZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBtcGM4eHh4X2dwaW9fZGlyX291dDsKLQlpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsbXBjODU3Mi1ncGlvIikpCi0JCWdjLT5nZXQgPSBtcGM4NTcyX2dwaW9fZ2V0OwotCWVsc2UKLQkJZ2MtPmdldCA9IG1wYzh4eHhfZ3Bpb19nZXQ7CisJZ2MtPmRpcmVjdGlvbl9vdXRwdXQgPSBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShucCwgImZzbCxtcGM1MTIxLWdwaW8iKSA/CisJCW1wYzUxMjFfZ3Bpb19kaXJfb3V0IDogbXBjOHh4eF9ncGlvX2Rpcl9vdXQ7CisJZ2MtPmdldCA9IG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLG1wYzg1NzItZ3BpbyIpID8KKwkJbXBjODU3Ml9ncGlvX2dldCA6IG1wYzh4eHhfZ3Bpb19nZXQ7CiAJZ2MtPnNldCA9IG1wYzh4eHhfZ3Bpb19zZXQ7CiAJZ2MtPnRvX2lycSA9IG1wYzh4eHhfZ3Bpb190b19pcnE7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBsMDYxLmMgYi9kcml2ZXJzL2dwaW8vZ3Bpby1wbDA2MS5jCmluZGV4IDA5M2M5MGIuLjQxMDJmNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3Bpby9ncGlvLXBsMDYxLmMKKysrIGIvZHJpdmVycy9ncGlvL2dwaW8tcGwwNjEuYwpAQCAtMjM4LDEwICsyMzgsNiBAQAogCWludCByZXQsIGlycSwgaTsKIAlzdGF0aWMgREVDTEFSRV9CSVRNQVAoaW5pdF9pcnEsIE5SX0lSUVMpOwogCi0JcGRhdGEgPSBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCWlmIChwZGF0YSA9PSBOVUxMKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCWNoaXAgPSBremFsbG9jKHNpemVvZigqY2hpcCksIEdGUF9LRVJORUwpOwogCWlmIChjaGlwID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9jcnRjX2hlbHBlci5jCmluZGV4IDM5NjlmNzUuLmQyNjE5ZDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fY3J0Y19oZWxwZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2NydGNfaGVscGVyLmMKQEAgLTQ1Niw2ICs0NTYsMzAgQEAKIEVYUE9SVF9TWU1CT0woZHJtX2NydGNfaGVscGVyX3NldF9tb2RlKTsKIAogCitzdGF0aWMgaW50Citkcm1fY3J0Y19oZWxwZXJfZGlzYWJsZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKworCS8qIERlY291cGxlIGFsbCBlbmNvZGVycyBhbmQgdGhlaXIgYXR0YWNoZWQgY29ubmVjdG9ycyBmcm9tIHRoaXMgY3J0YyAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW5jb2RlciwgJmRldi0+bW9kZV9jb25maWcuZW5jb2Rlcl9saXN0LCBoZWFkKSB7CisJCWlmIChlbmNvZGVyLT5jcnRjICE9IGNydGMpCisJCQljb250aW51ZTsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJmRldi0+bW9kZV9jb25maWcuY29ubmVjdG9yX2xpc3QsIGhlYWQpIHsKKwkJCWlmIChjb25uZWN0b3ItPmVuY29kZXIgIT0gZW5jb2RlcikKKwkJCQljb250aW51ZTsKKworCQkJY29ubmVjdG9yLT5lbmNvZGVyID0gTlVMTDsKKwkJfQorCX0KKworCWRybV9oZWxwZXJfZGlzYWJsZV91bnVzZWRfZnVuY3Rpb25zKGRldik7CisJcmV0dXJuIDA7Cit9CisKIC8qKgogICogZHJtX2NydGNfaGVscGVyX3NldF9jb25maWcgLSBzZXQgYSBuZXcgY29uZmlnIGZyb20gdXNlcnNwYWNlCiAgKiBAY3J0YzogQ1JUQyB0byBzZXR1cApAQCAtNTEwLDggKzUzNCw3IEBACiAJCQkJKGludClzZXQtPm51bV9jb25uZWN0b3JzLCBzZXQtPngsIHNldC0+eSk7CiAJfSBlbHNlIHsKIAkJRFJNX0RFQlVHX0tNUygiW0NSVEM6JWRdIFtOT0ZCXVxuIiwgc2V0LT5jcnRjLT5iYXNlLmlkKTsKLQkJc2V0LT5tb2RlID0gTlVMTDsKLQkJc2V0LT5udW1fY29ubmVjdG9ycyA9IDA7CisJCXJldHVybiBkcm1fY3J0Y19oZWxwZXJfZGlzYWJsZShzZXQtPmNydGMpOwogCX0KIAogCWRldiA9IHNldC0+Y3J0Yy0+ZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwppbmRleCBkMDlhNmUwLi4wMDRiMDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RlYnVnZnMuYwpAQCAtNjIsNiArNjIsNyBAQAogCWNvbnN0IHN0cnVjdCBpbnRlbF9kZXZpY2VfaW5mbyAqaW5mbyA9IElOVEVMX0lORk8oZGV2KTsKIAogCXNlcV9wcmludGYobSwgImdlbjogJWRcbiIsIGluZm8tPmdlbik7CisJc2VxX3ByaW50ZihtLCAicGNoOiAlZFxuIiwgSU5URUxfUENIX1RZUEUoZGV2KSk7CiAjZGVmaW5lIEIoeCkgc2VxX3ByaW50ZihtLCAjeCAiOiAlc1xuIiwgeWVzbm8oaW5mby0+eCkpCiAJQihpc19tb2JpbGUpOwogCUIoaXNfaTg1eCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kbWEuYwppbmRleCBhOTUzM2M1Li5hOWFlMzc0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2RtYS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZG1hLmMKQEAgLTE0NTQsNiArMTQ1NCwxNCBAQAogCiAJZGlmZjEgPSBub3cgLSBkZXZfcHJpdi0+bGFzdF90aW1lMTsKIAorCS8qIFByZXZlbnQgZGl2aXNpb24tYnktemVybyBpZiB3ZSBhcmUgYXNraW5nIHRvbyBmYXN0LgorCSAqIEFsc28sIHdlIGRvbid0IGdldCBpbnRlcmVzdGluZyByZXN1bHRzIGlmIHdlIGFyZSBwb2xsaW5nCisJICogZmFzdGVyIHRoYW4gb25jZSBpbiAxMG1zLCBzbyBqdXN0IHJldHVybiB0aGUgc2F2ZWQgdmFsdWUKKwkgKiBpbiBzdWNoIGNhc2VzLgorCSAqLworCWlmIChkaWZmMSA8PSAxMCkKKwkJcmV0dXJuIGRldl9wcml2LT5jaGlwc2V0X3Bvd2VyOworCiAJY291bnQxID0gSTkxNV9SRUFEKERNSUVDKTsKIAljb3VudDIgPSBJOTE1X1JFQUQoRERSRUMpOwogCWNvdW50MyA9IEk5MTVfUkVBRChDU0lFQyk7CkBAIC0xNDg0LDYgKzE0OTIsOCBAQAogCWRldl9wcml2LT5sYXN0X2NvdW50MSA9IHRvdGFsX2NvdW50OwogCWRldl9wcml2LT5sYXN0X3RpbWUxID0gbm93OwogCisJZGV2X3ByaXYtPmNoaXBzZXRfcG93ZXIgPSByZXQ7CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuYwppbmRleCAxNWJmYTkxLi5hMTEwM2ZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmMKQEAgLTU4LDE1ICs1OCwxNSBAQAogTU9EVUxFX1BBUk1fREVTQyhwb3dlcnNhdmUsCiAJCSJFbmFibGUgcG93ZXJzYXZpbmdzLCBmYmMsIGRvd25jbG9ja2luZywgZXRjLiAoZGVmYXVsdDogdHJ1ZSkiKTsKIAotdW5zaWduZWQgaW50IGk5MTVfc2VtYXBob3JlcyBfX3JlYWRfbW9zdGx5ID0gMDsKK2ludCBpOTE1X3NlbWFwaG9yZXMgX19yZWFkX21vc3RseSA9IC0xOwogbW9kdWxlX3BhcmFtX25hbWVkKHNlbWFwaG9yZXMsIGk5MTVfc2VtYXBob3JlcywgaW50LCAwNjAwKTsKIE1PRFVMRV9QQVJNX0RFU0Moc2VtYXBob3JlcywKLQkJIlVzZSBzZW1hcGhvcmVzIGZvciBpbnRlci1yaW5nIHN5bmMgKGRlZmF1bHQ6IGZhbHNlKSIpOworCQkiVXNlIHNlbWFwaG9yZXMgZm9yIGludGVyLXJpbmcgc3luYyAoZGVmYXVsdDogLTEgKHVzZSBwZXItY2hpcCBkZWZhdWx0cykpIik7CiAKLXVuc2lnbmVkIGludCBpOTE1X2VuYWJsZV9yYzYgX19yZWFkX21vc3RseSA9IDA7CitpbnQgaTkxNV9lbmFibGVfcmM2IF9fcmVhZF9tb3N0bHkgPSAtMTsKIG1vZHVsZV9wYXJhbV9uYW1lZChpOTE1X2VuYWJsZV9yYzYsIGk5MTVfZW5hYmxlX3JjNiwgaW50LCAwNjAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaTkxNV9lbmFibGVfcmM2LAotCQkiRW5hYmxlIHBvd2VyLXNhdmluZyByZW5kZXIgQy1zdGF0ZSA2IChkZWZhdWx0OiB0cnVlKSIpOworCQkiRW5hYmxlIHBvd2VyLXNhdmluZyByZW5kZXIgQy1zdGF0ZSA2IChkZWZhdWx0OiAtMSAodXNlIHBlci1jaGlwIGRlZmF1bHQpIik7CiAKIGludCBpOTE1X2VuYWJsZV9mYmMgX19yZWFkX21vc3RseSA9IC0xOwogbW9kdWxlX3BhcmFtX25hbWVkKGk5MTVfZW5hYmxlX2ZiYywgaTkxNV9lbmFibGVfZmJjLCBpbnQsIDA2MDApOwpAQCAtMzI4LDcgKzMyOCw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2dlbjZfZ3RfZm9yY2Vfd2FrZV9nZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQordm9pZCBfX2dlbjZfZ3RfZm9yY2Vfd2FrZV9nZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewogCWludCBjb3VudDsKIApAQCAtMzQ0LDYgKzM0NCwyMiBAQAogCQl1ZGVsYXkoMTApOwogfQogCit2b2lkIF9fZ2VuNl9ndF9mb3JjZV93YWtlX210X2dldChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaW50IGNvdW50OworCisJY291bnQgPSAwOworCXdoaWxlIChjb3VudCsrIDwgNTAgJiYgKEk5MTVfUkVBRF9OT1RSQUNFKEZPUkNFV0FLRV9NVF9BQ0spICYgMSkpCisJCXVkZWxheSgxMCk7CisKKwlJOTE1X1dSSVRFX05PVFJBQ0UoRk9SQ0VXQUtFX01ULCAoMTw8MTYpIHwgMSk7CisJUE9TVElOR19SRUFEKEZPUkNFV0FLRV9NVCk7CisKKwljb3VudCA9IDA7CisJd2hpbGUgKGNvdW50KysgPCA1MCAmJiAoSTkxNV9SRUFEX05PVFJBQ0UoRk9SQ0VXQUtFX01UX0FDSykgJiAxKSA9PSAwKQorCQl1ZGVsYXkoMTApOworfQorCiAvKgogICogR2VuZXJhbGx5IHRoaXMgaXMgY2FsbGVkIGltcGxpY2l0bHkgYnkgdGhlIHJlZ2lzdGVyIHJlYWQgZnVuY3Rpb24uIEhvd2V2ZXIsCiAgKiBpZiBzb21lIHNlcXVlbmNlIHJlcXVpcmVzIHRoZSBHVCB0byBub3QgcG93ZXIgZG93biB0aGVuIHRoaXMgZnVuY3Rpb24gc2hvdWxkCkBAIC0zNTYsMTUgKzM3MiwyMSBAQAogCiAJLyogRm9yY2V3YWtlIGlzIGF0b21pYyBpbiBjYXNlIHdlIGdldCBpbiBoZXJlIHdpdGhvdXQgdGhlIGxvY2sgKi8KIAlpZiAoYXRvbWljX2FkZF9yZXR1cm4oMSwgJmRldl9wcml2LT5mb3JjZXdha2VfY291bnQpID09IDEpCi0JCV9fZ2VuNl9ndF9mb3JjZV93YWtlX2dldChkZXZfcHJpdik7CisJCWRldl9wcml2LT5kaXNwbGF5LmZvcmNlX3dha2VfZ2V0KGRldl9wcml2KTsKIH0KIAotc3RhdGljIHZvaWQgX19nZW42X2d0X2ZvcmNlX3dha2VfcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3ZvaWQgX19nZW42X2d0X2ZvcmNlX3dha2VfcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKIHsKIAlJOTE1X1dSSVRFX05PVFJBQ0UoRk9SQ0VXQUtFLCAwKTsKIAlQT1NUSU5HX1JFQUQoRk9SQ0VXQUtFKTsKIH0KIAordm9pZCBfX2dlbjZfZ3RfZm9yY2Vfd2FrZV9tdF9wdXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCUk5MTVfV1JJVEVfTk9UUkFDRShGT1JDRVdBS0VfTVQsICgxPDwxNikgfCAwKTsKKwlQT1NUSU5HX1JFQUQoRk9SQ0VXQUtFX01UKTsKK30KKwogLyoKICAqIHNlZSBnZW42X2d0X2ZvcmNlX3dha2VfZ2V0KCkKICAqLwpAQCAtMzczLDcgKzM5NSw3IEBACiAJV0FSTl9PTighbXV0ZXhfaXNfbG9ja2VkKCZkZXZfcHJpdi0+ZGV2LT5zdHJ1Y3RfbXV0ZXgpKTsKIAogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZkZXZfcHJpdi0+Zm9yY2V3YWtlX2NvdW50KSkKLQkJX19nZW42X2d0X2ZvcmNlX3dha2VfcHV0KGRldl9wcml2KTsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZm9yY2Vfd2FrZV9wdXQoZGV2X3ByaXYpOwogfQogCiB2b2lkIF9fZ2VuNl9ndF93YWl0X2Zvcl9maWZvKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKQEAgLTkwMyw4ICs5MjUsOSBAQAogLyogV2UgZ2l2ZSBmYXN0IHBhdGhzIGZvciB0aGUgcmVhbGx5IGNvb2wgcmVnaXN0ZXJzICovCiAjZGVmaW5lIE5FRURTX0ZPUkNFX1dBS0UoZGV2X3ByaXYsIHJlZykgXAogCSgoKGRldl9wcml2KS0+aW5mby0+Z2VuID49IDYpICYmIFwKLQkoKHJlZykgPCAweDQwMDAwKSAmJiBcCi0JKChyZWcpICE9IEZPUkNFV0FLRSkpCisJICgocmVnKSA8IDB4NDAwMDApICYmCQkgXAorCSAoKHJlZykgIT0gRk9SQ0VXQUtFKSAmJgkgXAorCSAoKHJlZykgIT0gRUNPQlVTKSkKIAogI2RlZmluZSBfX2k5MTVfcmVhZCh4LCB5KSBcCiB1IyN4IGk5MTVfcmVhZCMjeChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIHUzMiByZWcpIHsgXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZHJ2LmgKaW5kZXggNGE5YzFiOS4uNTU0YmVmNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Rydi5oCkBAIC0xMDcsNiArMTA3LDcgQEAKIHN0cnVjdCBvcHJlZ2lvbl9hY3BpOwogc3RydWN0IG9wcmVnaW9uX3N3c2NpOwogc3RydWN0IG9wcmVnaW9uX2FzbGU7CitzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZTsKIAogc3RydWN0IGludGVsX29wcmVnaW9uIHsKIAlzdHJ1Y3Qgb3ByZWdpb25faGVhZGVyICpoZWFkZXI7CkBAIC0yMjEsNiArMjIyLDggQEAKIAkJCSAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaik7CiAJaW50ICgqdXBkYXRlX3BsYW5lKShzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAogCQkJICAgIGludCB4LCBpbnQgeSk7CisJdm9pZCAoKmZvcmNlX3dha2VfZ2V0KShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOworCXZvaWQgKCpmb3JjZV93YWtlX3B1dCkoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKIAkvKiBjbG9jayB1cGRhdGVzIGZvciBtb2RlIHNldCAqLwogCS8qIGN1cnNvciB1cGRhdGVzICovCiAJLyogcmVuZGVyIGNsb2NrIGluY3JlYXNlL2RlY3JlYXNlICovCkBAIC03MTAsNiArNzEzLDcgQEAKIAogCXU2NCBsYXN0X2NvdW50MTsKIAl1bnNpZ25lZCBsb25nIGxhc3RfdGltZTE7CisJdW5zaWduZWQgbG9uZyBjaGlwc2V0X3Bvd2VyOwogCXU2NCBsYXN0X2NvdW50MjsKIAlzdHJ1Y3QgdGltZXNwZWMgbGFzdF90aW1lMjsKIAl1bnNpZ25lZCBsb25nIGdmeF9wb3dlcjsKQEAgLTk5OCwxMSArMTAwMiwxMSBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBpOTE1X2ZicGVyY3J0YyBfX2Fsd2F5c191bnVzZWQ7CiBleHRlcm4gaW50IGk5MTVfcGFuZWxfaWdub3JlX2xpZCBfX3JlYWRfbW9zdGx5OwogZXh0ZXJuIHVuc2lnbmVkIGludCBpOTE1X3Bvd2Vyc2F2ZSBfX3JlYWRfbW9zdGx5OwotZXh0ZXJuIHVuc2lnbmVkIGludCBpOTE1X3NlbWFwaG9yZXMgX19yZWFkX21vc3RseTsKK2V4dGVybiBpbnQgaTkxNV9zZW1hcGhvcmVzIF9fcmVhZF9tb3N0bHk7CiBleHRlcm4gdW5zaWduZWQgaW50IGk5MTVfbHZkc19kb3duY2xvY2sgX19yZWFkX21vc3RseTsKIGV4dGVybiBpbnQgaTkxNV9wYW5lbF91c2Vfc3NjIF9fcmVhZF9tb3N0bHk7CiBleHRlcm4gaW50IGk5MTVfdmJ0X3Nkdm9fcGFuZWxfdHlwZSBfX3JlYWRfbW9zdGx5OwotZXh0ZXJuIHVuc2lnbmVkIGludCBpOTE1X2VuYWJsZV9yYzYgX19yZWFkX21vc3RseTsKK2V4dGVybiBpbnQgaTkxNV9lbmFibGVfcmM2IF9fcmVhZF9tb3N0bHk7CiBleHRlcm4gaW50IGk5MTVfZW5hYmxlX2ZiYyBfX3JlYWRfbW9zdGx5OwogZXh0ZXJuIGJvb2wgaTkxNV9lbmFibGVfaGFuZ2NoZWNrIF9fcmVhZF9tb3N0bHk7CiAKQEAgLTEzMDgsNiArMTMxMiwxMSBAQAogZXh0ZXJuIHZvaWQgaW50ZWxfZGV0ZWN0X3BjaChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIGV4dGVybiBpbnQgaW50ZWxfdHJhbnNfZHBfcG9ydF9zZWwoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKIAorZXh0ZXJuIHZvaWQgX19nZW42X2d0X2ZvcmNlX3dha2VfZ2V0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CitleHRlcm4gdm9pZCBfX2dlbjZfZ3RfZm9yY2Vfd2FrZV9tdF9nZXQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsKK2V4dGVybiB2b2lkIF9fZ2VuNl9ndF9mb3JjZV93YWtlX3B1dChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOworZXh0ZXJuIHZvaWQgX19nZW42X2d0X2ZvcmNlX3dha2VfbXRfcHV0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CisKIC8qIG92ZXJsYXkgKi8KICNpZmRlZiBDT05GSUdfREVCVUdfRlMKIGV4dGVybiBzdHJ1Y3QgaW50ZWxfb3ZlcmxheV9lcnJvcl9zdGF0ZSAqaW50ZWxfb3ZlcmxheV9jYXB0dXJlX2Vycm9yX3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwpAQCAtMTM1Miw4ICsxMzYxLDkgQEAKIC8qIFdlIGdpdmUgZmFzdCBwYXRocyBmb3IgdGhlIHJlYWxseSBjb29sIHJlZ2lzdGVycyAqLwogI2RlZmluZSBORUVEU19GT1JDRV9XQUtFKGRldl9wcml2LCByZWcpIFwKIAkoKChkZXZfcHJpdiktPmluZm8tPmdlbiA+PSA2KSAmJiBcCi0JKChyZWcpIDwgMHg0MDAwMCkgJiYgXAotCSgocmVnKSAhPSBGT1JDRVdBS0UpKQorCSAoKHJlZykgPCAweDQwMDAwKSAmJgkJIFwKKwkgKChyZWcpICE9IEZPUkNFV0FLRSkgJiYJIFwKKwkgKChyZWcpICE9IEVDT0JVUykpCiAKICNkZWZpbmUgX19pOTE1X3JlYWQoeCwgeSkgXAogCXUjI3ggaTkxNV9yZWFkIyN4KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgdTMyIHJlZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9leGVjYnVmZmVyLmMKaW5kZXggMzY5M2U4My4uYjlkYTg5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fZXhlY2J1ZmZlci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX2V4ZWNidWZmZXIuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgImk5MTVfZHJ2LmgiCiAjaW5jbHVkZSAiaTkxNV90cmFjZS5oIgogI2luY2x1ZGUgImludGVsX2Rydi5oIgorI2luY2x1ZGUgPGxpbnV4L2RtYV9yZW1hcHBpbmcuaD4KIAogc3RydWN0IGNoYW5nZV9kb21haW5zIHsKIAl1aW50MzJfdCBpbnZhbGlkYXRlX2RvbWFpbnM7CkBAIC03NDYsNiArNzQ3LDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBib29sCitpbnRlbF9lbmFibGVfc2VtYXBob3JlcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDYpCisJCXJldHVybiAwOworCisJaWYgKGk5MTVfc2VtYXBob3JlcyA+PSAwKQorCQlyZXR1cm4gaTkxNV9zZW1hcGhvcmVzOworCisJLyogRGlzYWJsZSBzZW1hcGhvcmVzIG9uIFNOQiAqLworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA9PSA2KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCiBzdGF0aWMgaW50CiBpOTE1X2dlbV9leGVjYnVmZmVyX3N5bmNfcmluZ3Moc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKIAkJCSAgICAgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIgKnRvKQpAQCAtNzU4LDcgKzc3NSw3IEBACiAJCXJldHVybiAwOwogCiAJLyogWFhYIGdwdSBzZW1hcGhvcmVzIGFyZSBpbXBsaWNhdGVkIGluIHZhcmlvdXMgaGFyZCBoYW5ncyBvbiBTTkIgKi8KLQlpZiAoSU5URUxfSU5GTyhvYmotPmJhc2UuZGV2KS0+Z2VuIDwgNiB8fCAhaTkxNV9zZW1hcGhvcmVzKQorCWlmICghaW50ZWxfZW5hYmxlX3NlbWFwaG9yZXMob2JqLT5iYXNlLmRldikpCiAJCXJldHVybiBpOTE1X2dlbV9vYmplY3Rfd2FpdF9yZW5kZXJpbmcob2JqKTsKIAogCWlkeCA9IGludGVsX3Jpbmdfc3luY19pbmRleChmcm9tLCB0byk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9yZWcuaAppbmRleCBiMDgwY2M4Li5hMjZkNWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X3JlZy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfcmVnLmgKQEAgLTMzMDMsMTAgKzMzMDMsMTAgQEAKIC8qIG9yIFNEVk9CICovCiAjZGVmaW5lIEhETUlCICAgMHhlMTE0MAogI2RlZmluZSAgUE9SVF9FTkFCTEUgICAgKDEgPDwgMzEpCi0jZGVmaW5lICBUUkFOU0NPREVSX0EgICAoMCkKLSNkZWZpbmUgIFRSQU5TQ09ERVJfQiAgICgxIDw8IDMwKQotI2RlZmluZSAgVFJBTlNDT0RFUihwaXBlKQkoKHBpcGUpIDw8IDMwKQotI2RlZmluZSAgVFJBTlNDT0RFUl9NQVNLICAgKDEgPDwgMzApCisjZGVmaW5lICBUUkFOU0NPREVSKHBpcGUpICAgICAgICgocGlwZSkgPDwgMzApCisjZGVmaW5lICBUUkFOU0NPREVSX0NQVChwaXBlKSAgICgocGlwZSkgPDwgMjkpCisjZGVmaW5lICBUUkFOU0NPREVSX01BU0sgICAgICAgICgxIDw8IDMwKQorI2RlZmluZSAgVFJBTlNDT0RFUl9NQVNLX0NQVCAgICAoMyA8PCAyOSkKICNkZWZpbmUgIENPTE9SX0ZPUk1BVF84YnBjICAgICAgKDApCiAjZGVmaW5lICBDT0xPUl9GT1JNQVRfMTJicGMgICAgICgzIDw8IDI2KQogI2RlZmluZSAgU0RWT0JfSE9UUExVR19FTkFCTEUgICAoMSA8PCAyMykKQEAgLTM0NDcsOCArMzQ0NywzMCBAQAogI2RlZmluZSAgRURQX0xJTktfVFJBSU5fODAwXzEyMDBNVl8wREJfU05CX0IJKDB4Mzg8PDIyKQogI2RlZmluZSAgRURQX0xJTktfVFJBSU5fVk9MX0VNUF9NQVNLX1NOQgkoMHgzZjw8MjIpCiAKKy8qIElWQiAqLworI2RlZmluZSBFRFBfTElOS19UUkFJTl80MDBNVl8wREJfSVZCCQkoMHgyNCA8PDIyKQorI2RlZmluZSBFRFBfTElOS19UUkFJTl80MDBNVl8zXzVEQl9JVkIJCSgweDJhIDw8MjIpCisjZGVmaW5lIEVEUF9MSU5LX1RSQUlOXzQwME1WXzZEQl9JVkIJCSgweDJmIDw8MjIpCisjZGVmaW5lIEVEUF9MSU5LX1RSQUlOXzYwME1WXzBEQl9JVkIJCSgweDMwIDw8MjIpCisjZGVmaW5lIEVEUF9MSU5LX1RSQUlOXzYwME1WXzNfNURCX0lWQgkJKDB4MzYgPDwyMikKKyNkZWZpbmUgRURQX0xJTktfVFJBSU5fODAwTVZfMERCX0lWQgkJKDB4MzggPDwyMikKKyNkZWZpbmUgRURQX0xJTktfVFJBSU5fODAwTVZfM181REJfSVZCCQkoMHgzMyA8PDIyKQorCisvKiBsZWdhY3kgdmFsdWVzICovCisjZGVmaW5lIEVEUF9MSU5LX1RSQUlOXzUwME1WXzBEQl9JVkIJCSgweDAwIDw8MjIpCisjZGVmaW5lIEVEUF9MSU5LX1RSQUlOXzEwMDBNVl8wREJfSVZCCQkoMHgyMCA8PDIyKQorI2RlZmluZSBFRFBfTElOS19UUkFJTl81MDBNVl8zXzVEQl9JVkIJCSgweDAyIDw8MjIpCisjZGVmaW5lIEVEUF9MSU5LX1RSQUlOXzEwMDBNVl8zXzVEQl9JVkIJCSgweDIyIDw8MjIpCisjZGVmaW5lIEVEUF9MSU5LX1RSQUlOXzEwMDBNVl82REJfSVZCCQkoMHgyMyA8PDIyKQorCisjZGVmaW5lICBFRFBfTElOS19UUkFJTl9WT0xfRU1QX01BU0tfSVZCCSgweDNmPDwyMikKKwogI2RlZmluZSAgRk9SQ0VXQUtFCQkJCTB4QTE4QwogI2RlZmluZSAgRk9SQ0VXQUtFX0FDSwkJCQkweDEzMDA5MAorI2RlZmluZSAgRk9SQ0VXQUtFX01UCQkJCTB4YTE4OCAvKiBtdWx0aS10aHJlYWRlZCAqLworI2RlZmluZSAgRk9SQ0VXQUtFX01UX0FDSwkJCTB4MTMwMDQwCisjZGVmaW5lICBFQ09CVVMJCQkJCTB4YTE4MAorI2RlZmluZSAgICBGT1JDRVdBS0VfTVRfRU5BQkxFCQkJKDE8PDUpCiAKICNkZWZpbmUgIEdUX0ZJRk9fRlJFRV9FTlRSSUVTCQkJMHgxMjAwMDgKICNkZWZpbmUgICAgR1RfRklGT19OVU1fUkVTRVJWRURfRU5UUklFUwkJMjAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCBlNzdhODYzLi5kYWE1NzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCkBAIC0zOCw4ICszOCw4IEBACiAjaW5jbHVkZSAiaTkxNV9kcnYuaCIKICNpbmNsdWRlICJpOTE1X3RyYWNlLmgiCiAjaW5jbHVkZSAiZHJtX2RwX2hlbHBlci5oIgotCiAjaW5jbHVkZSAiZHJtX2NydGNfaGVscGVyLmgiCisjaW5jbHVkZSA8bGludXgvZG1hX3JlbWFwcGluZy5oPgogCiAjZGVmaW5lIEhBU19lRFAgKGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0VEUCkpCiAKQEAgLTQ2NzAsNiArNDY3MCw3IEBACiAvKioKICAqIGludGVsX2Nob29zZV9waXBlX2JwcF9kaXRoZXIgLSBmaWd1cmUgb3V0IHdoYXQgY29sb3IgZGVwdGggdGhlIHBpcGUgc2hvdWxkIHNlbmQKICAqIEBjcnRjOiBDUlRDIHN0cnVjdHVyZQorICogQG1vZGU6IHJlcXVlc3RlZCBtb2RlCiAgKgogICogQSBwaXBlIG1heSBiZSBjb25uZWN0ZWQgdG8gb25lIG9yIG1vcmUgb3V0cHV0cy4gIEJhc2VkIG9uIHRoZSBkZXB0aCBvZiB0aGUKICAqIGF0dGFjaGVkIGZyYW1lYnVmZmVyLCBjaG9vc2UgYSBnb29kIGNvbG9yIGRlcHRoIHRvIHVzZSBvbiB0aGUgcGlwZS4KQEAgLTQ2ODEsMTMgKzQ2ODIsMTUgQEAKICAqICAgIEhETUkgc3VwcG9ydHMgb25seSA4YnBjIG9yIDEyYnBjLCBzbyBjbGFtcCB0byA4YnBjIHdpdGggZGl0aGVyIGZvciAxMGJwYwogICogICAgRGlzcGxheXMgbWF5IHN1cHBvcnQgYSByZXN0cmljdGVkIHNldCBhcyB3ZWxsLCBjaGVjayBFRElEIGFuZCBjbGFtcCBhcwogICogICAgICBhcHByb3ByaWF0ZS4KKyAqICAgIERQIG1heSB3YW50IHRvIGRpdGhlciBkb3duIHRvIDZicGMgdG8gZml0IGxhcmdlciBtb2RlcwogICoKICAqIFJFVFVSTlM6CiAgKiBEaXRoZXJpbmcgcmVxdWlyZW1lbnQgKGkuZS4gZmFsc2UgaWYgZGlzcGxheSBicGMgYW5kIHBpcGUgYnBjIG1hdGNoLAogICogdHJ1ZSBpZiB0aGV5IGRvbid0IG1hdGNoKS4KICAqLwogc3RhdGljIGJvb2wgaW50ZWxfY2hvb3NlX3BpcGVfYnBwX2RpdGhlcihzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCi0JCQkJCSB1bnNpZ25lZCBpbnQgKnBpcGVfYnBwKQorCQkJCQkgdW5zaWduZWQgaW50ICpwaXBlX2JwcCwKKwkJCQkJIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQogewogCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CiAJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKQEAgLTQ3NTgsNiArNDc2MSwxMSBAQAogCQl9CiAJfQogCisJaWYgKG1vZGUtPnByaXZhdGVfZmxhZ3MgJiBJTlRFTF9NT0RFX0RQX0ZPUkNFXzZCUEMpIHsKKwkJRFJNX0RFQlVHX0tNUygiRGl0aGVyaW5nIERQIHRvIDZicGNcbiIpOworCQlkaXNwbGF5X2JwYyA9IDY7CisJfQorCiAJLyoKIAkgKiBXZSBjb3VsZCBqdXN0IGRyaXZlIHRoZSBwaXBlIGF0IHRoZSBoaWdoZXN0IGJwYyBhbGwgdGhlIHRpbWUgYW5kCiAJICogZW5hYmxlIGRpdGhlcmluZyBhcyBuZWVkZWQsIGJ1dCB0aGF0IGNvc3RzIGJhbmR3aWR0aC4gIFNvIGNob29zZQpAQCAtNTAxOSw2ICs1MDI3LDE2IEBACiAJCQlwaXBlY29uZiAmPSB+UElQRUNPTkZfRE9VQkxFX1dJREU7CiAJfQogCisJLyogZGVmYXVsdCB0byA4YnBjICovCisJcGlwZWNvbmYgJj0gfihQSVBFQ09ORl9CUFBfTUFTSyB8IFBJUEVDT05GX0RJVEhFUl9FTik7CisJaWYgKGlzX2RwKSB7CisJCWlmIChtb2RlLT5wcml2YXRlX2ZsYWdzICYgSU5URUxfTU9ERV9EUF9GT1JDRV82QlBDKSB7CisJCQlwaXBlY29uZiB8PSBQSVBFQ09ORl9CUFBfNiB8CisJCQkJICAgIFBJUEVDT05GX0RJVEhFUl9FTiB8CisJCQkJICAgIFBJUEVDT05GX0RJVEhFUl9UWVBFX1NQOworCQl9CisJfQorCiAJZHBsbCB8PSBEUExMX1ZDT19FTkFCTEU7CiAKIAlEUk1fREVCVUdfS01TKCJNb2RlIGZvciBwaXBlICVjOlxuIiwgcGlwZSA9PSAwID8gJ0EnIDogJ0InKTsKQEAgLTU0ODAsNyArNTQ5OCw3IEBACiAJLyogZGV0ZXJtaW5lIHBhbmVsIGNvbG9yIGRlcHRoICovCiAJdGVtcCA9IEk5MTVfUkVBRChQSVBFQ09ORihwaXBlKSk7CiAJdGVtcCAmPSB+UElQRV9CUENfTUFTSzsKLQlkaXRoZXIgPSBpbnRlbF9jaG9vc2VfcGlwZV9icHBfZGl0aGVyKGNydGMsICZwaXBlX2JwcCk7CisJZGl0aGVyID0gaW50ZWxfY2hvb3NlX3BpcGVfYnBwX2RpdGhlcihjcnRjLCAmcGlwZV9icHAsIG1vZGUpOwogCXN3aXRjaCAocGlwZV9icHApIHsKIAljYXNlIDE4OgogCQl0ZW1wIHw9IFBJUEVfNkJQQzsKQEAgLTcxODksMTEgKzcyMDcsMTYgQEAKIAl3b3JrLT5vbGRfZmJfb2JqID0gaW50ZWxfZmItPm9iajsKIAlJTklUX1dPUksoJndvcmstPndvcmssIGludGVsX3VucGluX3dvcmtfZm4pOwogCisJcmV0ID0gZHJtX3ZibGFua19nZXQoZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKKwlpZiAocmV0KQorCQlnb3RvIGZyZWVfd29yazsKKwogCS8qIFdlIGJvcnJvdyB0aGUgZXZlbnQgc3BpbiBsb2NrIGZvciBwcm90ZWN0aW5nIHVucGluX3dvcmsgKi8KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAJaWYgKGludGVsX2NydGMtPnVucGluX3dvcmspIHsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAJCWtmcmVlKHdvcmspOworCQlkcm1fdmJsYW5rX3B1dChkZXYsIGludGVsX2NydGMtPnBpcGUpOwogCiAJCURSTV9ERUJVR19EUklWRVIoImZsaXAgcXVldWU6IGNydGMgYWxyZWFkeSBidXN5XG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKQEAgLTcyMTIsMTAgKzcyMzUsNiBAQAogCiAJY3J0Yy0+ZmIgPSBmYjsKIAotCXJldCA9IGRybV92YmxhbmtfZ2V0KGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7Ci0JaWYgKHJldCkKLQkJZ290byBjbGVhbnVwX29ianM7Ci0KIAl3b3JrLT5wZW5kaW5nX2ZsaXBfb2JqID0gb2JqOwogCiAJd29yay0+ZW5hYmxlX3N0YWxsX2NoZWNrID0gdHJ1ZTsKQEAgLTcyMzgsNyArNzI1Nyw2IEBACiAKIGNsZWFudXBfcGVuZGluZzoKIAlhdG9taWNfc3ViKDEgPDwgaW50ZWxfY3J0Yy0+cGxhbmUsICZ3b3JrLT5vbGRfZmJfb2JqLT5wZW5kaW5nX2ZsaXApOwotY2xlYW51cF9vYmpzOgogCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZ3b3JrLT5vbGRfZmJfb2JqLT5iYXNlKTsKIAlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKIAltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKQEAgLTcyNDcsNiArNzI2NSw4IEBACiAJaW50ZWxfY3J0Yy0+dW5waW5fd29yayA9IE5VTEw7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAKKwlkcm1fdmJsYW5rX3B1dChkZXYsIGludGVsX2NydGMtPnBpcGUpOworZnJlZV93b3JrOgogCWtmcmVlKHdvcmspOwogCiAJcmV0dXJuIHJldDsKQEAgLTc4ODcsNiArNzkwNywzMSBAQAogCWRldl9wcml2LT5jb3JyID0gKGxjZnVzZSAmIExDRlVTRV9ISVZfTUFTSyk7CiB9CiAKK3N0YXRpYyBib29sIGludGVsX2VuYWJsZV9yYzYoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwkvKgorCSAqIFJlc3BlY3QgdGhlIGtlcm5lbCBwYXJhbWV0ZXIgaWYgaXQgaXMgc2V0CisJICovCisJaWYgKGk5MTVfZW5hYmxlX3JjNiA+PSAwKQorCQlyZXR1cm4gaTkxNV9lbmFibGVfcmM2OworCisJLyoKKwkgKiBEaXNhYmxlIFJDNiBvbiBJcm9ubGFrZQorCSAqLworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA9PSA1KQorCQlyZXR1cm4gMDsKKworCS8qCisJICogRGlzYWJsZSByYzYgb24gU2FuZHlicmlkZ2UKKwkgKi8KKwlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPT0gNikgeworCQlEUk1fREVCVUdfRFJJVkVSKCJTYW5keWJyaWRnZTogUkM2IGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCURSTV9ERUJVR19EUklWRVIoIlJDNiBlbmFibGVkXG4iKTsKKwlyZXR1cm4gMTsKK30KKwogdm9pZCBnZW42X2VuYWJsZV9ycHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewogCXUzMiBycF9zdGF0ZV9jYXAgPSBJOTE1X1JFQUQoR0VONl9SUF9TVEFURV9DQVApOwpAQCAtNzkyMyw3ICs3OTY4LDcgQEAKIAlJOTE1X1dSSVRFKEdFTjZfUkM2cF9USFJFU0hPTEQsIDEwMDAwMCk7CiAJSTkxNV9XUklURShHRU42X1JDNnBwX1RIUkVTSE9MRCwgNjQwMDApOyAvKiB1bnVzZWQgKi8KIAotCWlmIChpOTE1X2VuYWJsZV9yYzYpCisJaWYgKGludGVsX2VuYWJsZV9yYzYoZGV2X3ByaXYtPmRldikpCiAJCXJjNl9tYXNrID0gR0VONl9SQ19DVExfUkM2cF9FTkFCTEUgfAogCQkJR0VONl9SQ19DVExfUkM2X0VOQUJMRTsKIApAQCAtODM3Miw3ICs4NDE3LDcgQEAKIAkvKiByYzYgZGlzYWJsZWQgYnkgZGVmYXVsdCBkdWUgdG8gcmVwZWF0ZWQgcmVwb3J0cyBvZiBoYW5naW5nIGR1cmluZwogCSAqIGJvb3QgYW5kIHJlc3VtZS4KIAkgKi8KLQlpZiAoIWk5MTVfZW5hYmxlX3JjNikKKwlpZiAoIWludGVsX2VuYWJsZV9yYzYoZGV2KSkKIAkJcmV0dXJuOwogCiAJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwpAQCAtODQ5MSw2ICs4NTM2LDI4IEBACiAKIAkvKiBGb3IgRklGTyB3YXRlcm1hcmsgdXBkYXRlcyAqLwogCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZm9yY2Vfd2FrZV9nZXQgPSBfX2dlbjZfZ3RfZm9yY2Vfd2FrZV9nZXQ7CisJCWRldl9wcml2LT5kaXNwbGF5LmZvcmNlX3dha2VfcHV0ID0gX19nZW42X2d0X2ZvcmNlX3dha2VfcHV0OworCisJCS8qIElWQiBjb25maWdzIG1heSB1c2UgbXVsdGktdGhyZWFkZWQgZm9yY2V3YWtlICovCisJCWlmIChJU19JVllCUklER0UoZGV2KSkgeworCQkJdTMyCWVjb2J1czsKKworCQkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCQkJX19nZW42X2d0X2ZvcmNlX3dha2VfbXRfZ2V0KGRldl9wcml2KTsKKwkJCWVjb2J1cyA9IEk5MTVfUkVBRChFQ09CVVMpOworCQkJX19nZW42X2d0X2ZvcmNlX3dha2VfbXRfcHV0KGRldl9wcml2KTsKKwkJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOworCisJCQlpZiAoZWNvYnVzICYgRk9SQ0VXQUtFX01UX0VOQUJMRSkgeworCQkJCURSTV9ERUJVR19LTVMoIlVzaW5nIE1UIHZlcnNpb24gb2YgZm9yY2V3YWtlXG4iKTsKKwkJCQlkZXZfcHJpdi0+ZGlzcGxheS5mb3JjZV93YWtlX2dldCA9CisJCQkJCV9fZ2VuNl9ndF9mb3JjZV93YWtlX210X2dldDsKKwkJCQlkZXZfcHJpdi0+ZGlzcGxheS5mb3JjZV93YWtlX3B1dCA9CisJCQkJCV9fZ2VuNl9ndF9mb3JjZV93YWtlX210X3B1dDsKKwkJCX0KKwkJfQorCiAJCWlmIChIQVNfUENIX0lCWChkZXYpKQogCQkJZGV2X3ByaXYtPmRpc3BsYXkuaW5pdF9wY2hfY2xvY2tfZ2F0aW5nID0gaWJ4X2luaXRfY2xvY2tfZ2F0aW5nOwogCQllbHNlIGlmIChIQVNfUENIX0NQVChkZXYpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2RwLmMKaW5kZXggNGQwMzU4Zi4uOTJiMDQxYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcC5jCkBAIC0yMDgsMTMgKzIwOCwxNSBAQAogICovCiAKIHN0YXRpYyBpbnQKLWludGVsX2RwX2xpbmtfcmVxdWlyZWQoc3RydWN0IGludGVsX2RwICppbnRlbF9kcCwgaW50IHBpeGVsX2Nsb2NrKQoraW50ZWxfZHBfbGlua19yZXF1aXJlZChzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLCBpbnQgcGl4ZWxfY2xvY2ssIGludCBjaGVja19icHApCiB7CiAJc3RydWN0IGRybV9jcnRjICpjcnRjID0gaW50ZWxfZHAtPmJhc2UuYmFzZS5jcnRjOwogCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKIAlpbnQgYnBwID0gMjQ7CiAKLQlpZiAoaW50ZWxfY3J0YykKKwlpZiAoY2hlY2tfYnBwKQorCQlicHAgPSBjaGVja19icHA7CisJZWxzZSBpZiAoaW50ZWxfY3J0YykKIAkJYnBwID0gaW50ZWxfY3J0Yy0+YnBwOwogCiAJcmV0dXJuIChwaXhlbF9jbG9jayAqIGJwcCArIDkpIC8gMTA7CkBAIC0yMzMsNiArMjM1LDcgQEAKIAlzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwID0gaW50ZWxfYXR0YWNoZWRfZHAoY29ubmVjdG9yKTsKIAlpbnQgbWF4X2xpbmtfY2xvY2sgPSBpbnRlbF9kcF9saW5rX2Nsb2NrKGludGVsX2RwX21heF9saW5rX2J3KGludGVsX2RwKSk7CiAJaW50IG1heF9sYW5lcyA9IGludGVsX2RwX21heF9sYW5lX2NvdW50KGludGVsX2RwKTsKKwlpbnQgbWF4X3JhdGUsIG1vZGVfcmF0ZTsKIAogCWlmIChpc19lZHAoaW50ZWxfZHApICYmIGludGVsX2RwLT5wYW5lbF9maXhlZF9tb2RlKSB7CiAJCWlmIChtb2RlLT5oZGlzcGxheSA+IGludGVsX2RwLT5wYW5lbF9maXhlZF9tb2RlLT5oZGlzcGxheSkKQEAgLTI0Miw5ICsyNDUsMTcgQEAKIAkJCXJldHVybiBNT0RFX1BBTkVMOwogCX0KIAotCWlmIChpbnRlbF9kcF9saW5rX3JlcXVpcmVkKGludGVsX2RwLCBtb2RlLT5jbG9jaykKLQkgICAgPiBpbnRlbF9kcF9tYXhfZGF0YV9yYXRlKG1heF9saW5rX2Nsb2NrLCBtYXhfbGFuZXMpKQotCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCW1vZGVfcmF0ZSA9IGludGVsX2RwX2xpbmtfcmVxdWlyZWQoaW50ZWxfZHAsIG1vZGUtPmNsb2NrLCAwKTsKKwltYXhfcmF0ZSA9IGludGVsX2RwX21heF9kYXRhX3JhdGUobWF4X2xpbmtfY2xvY2ssIG1heF9sYW5lcyk7CisKKwlpZiAobW9kZV9yYXRlID4gbWF4X3JhdGUpIHsKKwkJCW1vZGVfcmF0ZSA9IGludGVsX2RwX2xpbmtfcmVxdWlyZWQoaW50ZWxfZHAsCisJCQkJCQkJICAgbW9kZS0+Y2xvY2ssIDE4KTsKKwkJCWlmIChtb2RlX3JhdGUgPiBtYXhfcmF0ZSkKKwkJCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCQkJZWxzZQorCQkJCW1vZGUtPnByaXZhdGVfZmxhZ3MgfD0gSU5URUxfTU9ERV9EUF9GT1JDRV82QlBDOworCX0KIAogCWlmIChtb2RlLT5jbG9jayA8IDEwMDAwKQogCQlyZXR1cm4gTU9ERV9DTE9DS19MT1c7CkBAIC0zNjIsOCArMzczLDggQEAKIAkgKiBjbG9jayBkaXZpZGVyLgogCSAqLwogCWlmIChpc19jcHVfZWRwKGludGVsX2RwKSkgewotCQlpZiAoSVNfR0VONihkZXYpKQotCQkJYXV4X2Nsb2NrX2RpdmlkZXIgPSAyMDA7IC8qIFNOQiBlRFAgaW5wdXQgY2xvY2sgYXQgNDAwTWh6ICovCisJCWlmIChJU19HRU42KGRldikgfHwgSVNfR0VONyhkZXYpKQorCQkJYXV4X2Nsb2NrX2RpdmlkZXIgPSAyMDA7IC8qIFNOQiAmIElWQiBlRFAgaW5wdXQgY2xvY2sgYXQgNDAwTWh6ICovCiAJCWVsc2UKIAkJCWF1eF9jbG9ja19kaXZpZGVyID0gMjI1OyAvKiBlRFAgaW5wdXQgY2xvY2sgYXQgNDUwTWh6ICovCiAJfSBlbHNlIGlmIChIQVNfUENIX1NQTElUKGRldikpCkBAIC02NzIsNiArNjgzLDcgQEAKIAlpbnQgbGFuZV9jb3VudCwgY2xvY2s7CiAJaW50IG1heF9sYW5lX2NvdW50ID0gaW50ZWxfZHBfbWF4X2xhbmVfY291bnQoaW50ZWxfZHApOwogCWludCBtYXhfY2xvY2sgPSBpbnRlbF9kcF9tYXhfbGlua19idyhpbnRlbF9kcCkgPT0gRFBfTElOS19CV18yXzcgPyAxIDogMDsKKwlpbnQgYnBwID0gbW9kZS0+cHJpdmF0ZV9mbGFncyAmIElOVEVMX01PREVfRFBfRk9SQ0VfNkJQQyA/IDE4IDogMDsKIAlzdGF0aWMgaW50IGJ3c1syXSA9IHsgRFBfTElOS19CV18xXzYyLCBEUF9MSU5LX0JXXzJfNyB9OwogCiAJaWYgKGlzX2VkcChpbnRlbF9kcCkgJiYgaW50ZWxfZHAtPnBhbmVsX2ZpeGVkX21vZGUpIHsKQEAgLTY4OSw3ICs3MDEsNyBAQAogCQlmb3IgKGNsb2NrID0gMDsgY2xvY2sgPD0gbWF4X2Nsb2NrOyBjbG9jaysrKSB7CiAJCQlpbnQgbGlua19hdmFpbCA9IGludGVsX2RwX21heF9kYXRhX3JhdGUoaW50ZWxfZHBfbGlua19jbG9jayhid3NbY2xvY2tdKSwgbGFuZV9jb3VudCk7CiAKLQkJCWlmIChpbnRlbF9kcF9saW5rX3JlcXVpcmVkKGludGVsX2RwLCBtb2RlLT5jbG9jaykKKwkJCWlmIChpbnRlbF9kcF9saW5rX3JlcXVpcmVkKGludGVsX2RwLCBtb2RlLT5jbG9jaywgYnBwKQogCQkJCQk8PSBsaW5rX2F2YWlsKSB7CiAJCQkJaW50ZWxfZHAtPmxpbmtfYncgPSBid3NbY2xvY2tdOwogCQkJCWludGVsX2RwLT5sYW5lX2NvdW50ID0gbGFuZV9jb3VudDsKQEAgLTgxNywxMCArODI5LDExIEBACiAJfQogCiAJLyoKLQkgKiBUaGVyZSBhcmUgdGhyZWUga2luZHMgb2YgRFAgcmVnaXN0ZXJzOgorCSAqIFRoZXJlIGFyZSBmb3VyIGtpbmRzIG9mIERQIHJlZ2lzdGVyczoKIAkgKgogCSAqIAlJQlggUENICi0JICogCUNQVQorCSAqIAlTTkIgQ1BVCisJICoJSVZCIENQVQogCSAqIAlDUFQgUENICiAJICoKIAkgKiBJQlggUENIIGFuZCBDUFUgYXJlIHRoZSBzYW1lIGZvciBhbG1vc3QgZXZlcnl0aGluZywKQEAgLTg3Myw3ICs4ODYsMjUgQEAKIAogCS8qIFNwbGl0IG91dCB0aGUgSUJYL0NQVSB2cyBDUFQgc2V0dGluZ3MgKi8KIAotCWlmICghSEFTX1BDSF9DUFQoZGV2KSB8fCBpc19jcHVfZWRwKGludGVsX2RwKSkgeworCWlmIChpc19jcHVfZWRwKGludGVsX2RwKSAmJiBJU19HRU43KGRldikpIHsKKwkJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QSFNZTkMpCisJCQlpbnRlbF9kcC0+RFAgfD0gRFBfU1lOQ19IU19ISUdIOworCQlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BWU1lOQykKKwkJCWludGVsX2RwLT5EUCB8PSBEUF9TWU5DX1ZTX0hJR0g7CisJCWludGVsX2RwLT5EUCB8PSBEUF9MSU5LX1RSQUlOX09GRl9DUFQ7CisKKwkJaWYgKGludGVsX2RwLT5saW5rX2NvbmZpZ3VyYXRpb25bMV0gJiBEUF9MQU5FX0NPVU5UX0VOSEFOQ0VEX0ZSQU1FX0VOKQorCQkJaW50ZWxfZHAtPkRQIHw9IERQX0VOSEFOQ0VEX0ZSQU1JTkc7CisKKwkJaW50ZWxfZHAtPkRQIHw9IGludGVsX2NydGMtPnBpcGUgPDwgMjk7CisKKwkJLyogZG9uJ3QgbWlzcyBvdXQgcmVxdWlyZWQgc2V0dGluZyBmb3IgZURQICovCisJCWludGVsX2RwLT5EUCB8PSBEUF9QTExfRU5BQkxFOworCQlpZiAoYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgPCAyMDAwMDApCisJCQlpbnRlbF9kcC0+RFAgfD0gRFBfUExMX0ZSRVFfMTYwTUhaOworCQllbHNlCisJCQlpbnRlbF9kcC0+RFAgfD0gRFBfUExMX0ZSRVFfMjcwTUhaOworCX0gZWxzZSBpZiAoIUhBU19QQ0hfQ1BUKGRldikgfHwgaXNfY3B1X2VkcChpbnRlbF9kcCkpIHsKIAkJaW50ZWxfZHAtPkRQIHw9IGludGVsX2RwLT5jb2xvcl9yYW5nZTsKIAogCQlpZiAoYWRqdXN0ZWRfbW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX1BIU1lOQykKQEAgLTEzNzUsMzQgKzE0MDYsNTkgQEAKICAqIFRoZXNlIGFyZSBzb3VyY2Utc3BlY2lmaWMgdmFsdWVzOyBjdXJyZW50IEludGVsIGhhcmR3YXJlIHN1cHBvcnRzCiAgKiBhIG1heGltdW0gdm9sdGFnZSBvZiA4MDBtViBhbmQgYSBtYXhpbXVtIHByZS1lbXBoYXNpcyBvZiA2ZEIKICAqLwotI2RlZmluZSBJODMwX0RQX1ZPTFRBR0VfTUFYCSAgICBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzgwMAotI2RlZmluZSBJODMwX0RQX1ZPTFRBR0VfTUFYX0NQVAkgICAgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR18xMjAwCiAKIHN0YXRpYyB1aW50OF90Ci1pbnRlbF9kcF9wcmVfZW1waGFzaXNfbWF4KHVpbnQ4X3Qgdm9sdGFnZV9zd2luZykKK2ludGVsX2RwX3ZvbHRhZ2VfbWF4KHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHApCiB7Ci0Jc3dpdGNoICh2b2x0YWdlX3N3aW5nICYgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19NQVNLKSB7Ci0JY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzQwMDoKLQkJcmV0dXJuIERQX1RSQUlOX1BSRV9FTVBIQVNJU182OwotCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR182MDA6Ci0JCXJldHVybiBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfNjsKLQljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfODAwOgotCQlyZXR1cm4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzNfNTsKLQljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfMTIwMDoKLQlkZWZhdWx0OgotCQlyZXR1cm4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzA7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RwLT5iYXNlLmJhc2UuZGV2OworCisJaWYgKElTX0dFTjcoZGV2KSAmJiBpc19jcHVfZWRwKGludGVsX2RwKSkKKwkJcmV0dXJuIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfODAwOworCWVsc2UgaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2NwdV9lZHAoaW50ZWxfZHApKQorCQlyZXR1cm4gRFBfVFJBSU5fVk9MVEFHRV9TV0lOR18xMjAwOworCWVsc2UKKwkJcmV0dXJuIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfODAwOworfQorCitzdGF0aWMgdWludDhfdAoraW50ZWxfZHBfcHJlX2VtcGhhc2lzX21heChzdHJ1Y3QgaW50ZWxfZHAgKmludGVsX2RwLCB1aW50OF90IHZvbHRhZ2Vfc3dpbmcpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RwLT5iYXNlLmJhc2UuZGV2OworCisJaWYgKElTX0dFTjcoZGV2KSAmJiBpc19jcHVfZWRwKGludGVsX2RwKSkgeworCQlzd2l0Y2ggKHZvbHRhZ2Vfc3dpbmcgJiBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0spIHsKKwkJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzQwMDoKKwkJCXJldHVybiBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfNjsKKwkJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzYwMDoKKwkJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzgwMDoKKwkJCXJldHVybiBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfM181OworCQlkZWZhdWx0OgorCQkJcmV0dXJuIERQX1RSQUlOX1BSRV9FTVBIQVNJU18wOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoICh2b2x0YWdlX3N3aW5nICYgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR19NQVNLKSB7CisJCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR180MDA6CisJCQlyZXR1cm4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzY7CisJCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR182MDA6CisJCQlyZXR1cm4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzY7CisJCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR184MDA6CisJCQlyZXR1cm4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzNfNTsKKwkJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzEyMDA6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzA7CisJCX0KIAl9CiB9CiAKIHN0YXRpYyB2b2lkCiBpbnRlbF9nZXRfYWRqdXN0X3RyYWluKHN0cnVjdCBpbnRlbF9kcCAqaW50ZWxfZHAsIHVpbnQ4X3QgbGlua19zdGF0dXNbRFBfTElOS19TVEFUVVNfU0laRV0pCiB7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGludGVsX2RwLT5iYXNlLmJhc2UuZGV2OwogCXVpbnQ4X3QgdiA9IDA7CiAJdWludDhfdCBwID0gMDsKIAlpbnQgbGFuZTsKIAl1aW50OF90CSphZGp1c3RfcmVxdWVzdCA9IGxpbmtfc3RhdHVzICsgKERQX0FESlVTVF9SRVFVRVNUX0xBTkUwXzEgLSBEUF9MQU5FMF8xX1NUQVRVUyk7Ci0JaW50IHZvbHRhZ2VfbWF4OworCXVpbnQ4X3Qgdm9sdGFnZV9tYXg7CisJdWludDhfdCBwcmVlbXBoX21heDsKIAogCWZvciAobGFuZSA9IDA7IGxhbmUgPCBpbnRlbF9kcC0+bGFuZV9jb3VudDsgbGFuZSsrKSB7CiAJCXVpbnQ4X3QgdGhpc192ID0gaW50ZWxfZ2V0X2FkanVzdF9yZXF1ZXN0X3ZvbHRhZ2UoYWRqdXN0X3JlcXVlc3QsIGxhbmUpOwpAQCAtMTQxNCwxNSArMTQ3MCwxMyBAQAogCQkJcCA9IHRoaXNfcDsKIAl9CiAKLQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfY3B1X2VkcChpbnRlbF9kcCkpCi0JCXZvbHRhZ2VfbWF4ID0gSTgzMF9EUF9WT0xUQUdFX01BWF9DUFQ7Ci0JZWxzZQotCQl2b2x0YWdlX21heCA9IEk4MzBfRFBfVk9MVEFHRV9NQVg7CisJdm9sdGFnZV9tYXggPSBpbnRlbF9kcF92b2x0YWdlX21heChpbnRlbF9kcCk7CiAJaWYgKHYgPj0gdm9sdGFnZV9tYXgpCiAJCXYgPSB2b2x0YWdlX21heCB8IERQX1RSQUlOX01BWF9TV0lOR19SRUFDSEVEOwogCi0JaWYgKHAgPj0gaW50ZWxfZHBfcHJlX2VtcGhhc2lzX21heCh2KSkKLQkJcCA9IGludGVsX2RwX3ByZV9lbXBoYXNpc19tYXgodikgfCBEUF9UUkFJTl9NQVhfUFJFX0VNUEhBU0lTX1JFQUNIRUQ7CisJcHJlZW1waF9tYXggPSBpbnRlbF9kcF9wcmVfZW1waGFzaXNfbWF4KGludGVsX2RwLCB2KTsKKwlpZiAocCA+PSBwcmVlbXBoX21heCkKKwkJcCA9IHByZWVtcGhfbWF4IHwgRFBfVFJBSU5fTUFYX1BSRV9FTVBIQVNJU19SRUFDSEVEOwogCiAJZm9yIChsYW5lID0gMDsgbGFuZSA8IDQ7IGxhbmUrKykKIAkJaW50ZWxfZHAtPnRyYWluX3NldFtsYW5lXSA9IHYgfCBwOwpAQCAtMTQ5NCw2ICsxNTQ4LDM3IEBACiAJfQogfQogCisvKiBHZW43J3MgRFAgdm9sdGFnZSBzd2luZyBhbmQgcHJlLWVtcGhhc2lzIGNvbnRyb2wgKi8KK3N0YXRpYyB1aW50MzJfdAoraW50ZWxfZ2VuN19lZHBfc2lnbmFsX2xldmVscyh1aW50OF90IHRyYWluX3NldCkKK3sKKwlpbnQgc2lnbmFsX2xldmVscyA9IHRyYWluX3NldCAmIChEUF9UUkFJTl9WT0xUQUdFX1NXSU5HX01BU0sgfAorCQkJCQkgRFBfVFJBSU5fUFJFX0VNUEhBU0lTX01BU0spOworCXN3aXRjaCAoc2lnbmFsX2xldmVscykgeworCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR180MDAgfCBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfMDoKKwkJcmV0dXJuIEVEUF9MSU5LX1RSQUlOXzQwME1WXzBEQl9JVkI7CisJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzQwMCB8IERQX1RSQUlOX1BSRV9FTVBIQVNJU18zXzU6CisJCXJldHVybiBFRFBfTElOS19UUkFJTl80MDBNVl8zXzVEQl9JVkI7CisJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzQwMCB8IERQX1RSQUlOX1BSRV9FTVBIQVNJU182OgorCQlyZXR1cm4gRURQX0xJTktfVFJBSU5fNDAwTVZfNkRCX0lWQjsKKworCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR182MDAgfCBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfMDoKKwkJcmV0dXJuIEVEUF9MSU5LX1RSQUlOXzYwME1WXzBEQl9JVkI7CisJY2FzZSBEUF9UUkFJTl9WT0xUQUdFX1NXSU5HXzYwMCB8IERQX1RSQUlOX1BSRV9FTVBIQVNJU18zXzU6CisJCXJldHVybiBFRFBfTElOS19UUkFJTl82MDBNVl8zXzVEQl9JVkI7CisKKwljYXNlIERQX1RSQUlOX1ZPTFRBR0VfU1dJTkdfODAwIHwgRFBfVFJBSU5fUFJFX0VNUEhBU0lTXzA6CisJCXJldHVybiBFRFBfTElOS19UUkFJTl84MDBNVl8wREJfSVZCOworCWNhc2UgRFBfVFJBSU5fVk9MVEFHRV9TV0lOR184MDAgfCBEUF9UUkFJTl9QUkVfRU1QSEFTSVNfM181OgorCQlyZXR1cm4gRURQX0xJTktfVFJBSU5fODAwTVZfM181REJfSVZCOworCisJZGVmYXVsdDoKKwkJRFJNX0RFQlVHX0tNUygiVW5zdXBwb3J0ZWQgdm9sdGFnZSBzd2luZy9wcmUtZW1waGFzaXMgbGV2ZWw6IgorCQkJICAgICAgIjB4JXhcbiIsIHNpZ25hbF9sZXZlbHMpOworCQlyZXR1cm4gRURQX0xJTktfVFJBSU5fNTAwTVZfMERCX0lWQjsKKwl9Cit9CisKIHN0YXRpYyB1aW50OF90CiBpbnRlbF9nZXRfbGFuZV9zdGF0dXModWludDhfdCBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXSwKIAkJICAgICAgaW50IGxhbmUpCkBAIC0xNTk5LDcgKzE2ODQsOCBAQAogCQkJCSAgRFBfTElOS19DT05GSUdVUkFUSU9OX1NJWkUpOwogCiAJRFAgfD0gRFBfUE9SVF9FTjsKLQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfY3B1X2VkcChpbnRlbF9kcCkpCisKKwlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAoSVNfR0VONyhkZXYpIHx8ICFpc19jcHVfZWRwKGludGVsX2RwKSkpCiAJCURQICY9IH5EUF9MSU5LX1RSQUlOX01BU0tfQ1BUOwogCWVsc2UKIAkJRFAgJj0gfkRQX0xJTktfVFJBSU5fTUFTSzsKQEAgLTE2MTMsNyArMTY5OSwxMSBAQAogCQl1aW50OF90CSAgICBsaW5rX3N0YXR1c1tEUF9MSU5LX1NUQVRVU19TSVpFXTsKIAkJdWludDMyX3QgICAgc2lnbmFsX2xldmVsczsKIAotCQlpZiAoSVNfR0VONihkZXYpICYmIGlzX2NwdV9lZHAoaW50ZWxfZHApKSB7CisKKwkJaWYgKElTX0dFTjcoZGV2KSAmJiBpc19jcHVfZWRwKGludGVsX2RwKSkgeworCQkJc2lnbmFsX2xldmVscyA9IGludGVsX2dlbjdfZWRwX3NpZ25hbF9sZXZlbHMoaW50ZWxfZHAtPnRyYWluX3NldFswXSk7CisJCQlEUCA9IChEUCAmIH5FRFBfTElOS19UUkFJTl9WT0xfRU1QX01BU0tfSVZCKSB8IHNpZ25hbF9sZXZlbHM7CisJCX0gZWxzZSBpZiAoSVNfR0VONihkZXYpICYmIGlzX2NwdV9lZHAoaW50ZWxfZHApKSB7CiAJCQlzaWduYWxfbGV2ZWxzID0gaW50ZWxfZ2VuNl9lZHBfc2lnbmFsX2xldmVscyhpbnRlbF9kcC0+dHJhaW5fc2V0WzBdKTsKIAkJCURQID0gKERQICYgfkVEUF9MSU5LX1RSQUlOX1ZPTF9FTVBfTUFTS19TTkIpIHwgc2lnbmFsX2xldmVsczsKIAkJfSBlbHNlIHsKQEAgLTE2MjIsNyArMTcxMiw3IEBACiAJCQlEUCA9IChEUCAmIH4oRFBfVk9MVEFHRV9NQVNLfERQX1BSRV9FTVBIQVNJU19NQVNLKSkgfCBzaWduYWxfbGV2ZWxzOwogCQl9CiAKLQkJaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2NwdV9lZHAoaW50ZWxfZHApKQorCQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAoSVNfR0VONyhkZXYpIHx8ICFpc19jcHVfZWRwKGludGVsX2RwKSkpCiAJCQlyZWcgPSBEUCB8IERQX0xJTktfVFJBSU5fUEFUXzFfQ1BUOwogCQllbHNlCiAJCQlyZWcgPSBEUCB8IERQX0xJTktfVFJBSU5fUEFUXzE7CkBAIC0xNzAzLDcgKzE3OTMsMTAgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKElTX0dFTjYoZGV2KSAmJiBpc19jcHVfZWRwKGludGVsX2RwKSkgeworCQlpZiAoSVNfR0VONyhkZXYpICYmIGlzX2NwdV9lZHAoaW50ZWxfZHApKSB7CisJCQlzaWduYWxfbGV2ZWxzID0gaW50ZWxfZ2VuN19lZHBfc2lnbmFsX2xldmVscyhpbnRlbF9kcC0+dHJhaW5fc2V0WzBdKTsKKwkJCURQID0gKERQICYgfkVEUF9MSU5LX1RSQUlOX1ZPTF9FTVBfTUFTS19JVkIpIHwgc2lnbmFsX2xldmVsczsKKwkJfSBlbHNlIGlmIChJU19HRU42KGRldikgJiYgaXNfY3B1X2VkcChpbnRlbF9kcCkpIHsKIAkJCXNpZ25hbF9sZXZlbHMgPSBpbnRlbF9nZW42X2VkcF9zaWduYWxfbGV2ZWxzKGludGVsX2RwLT50cmFpbl9zZXRbMF0pOwogCQkJRFAgPSAoRFAgJiB+RURQX0xJTktfVFJBSU5fVk9MX0VNUF9NQVNLX1NOQikgfCBzaWduYWxfbGV2ZWxzOwogCQl9IGVsc2UgewpAQCAtMTcxMSw3ICsxODA0LDcgQEAKIAkJCURQID0gKERQICYgfihEUF9WT0xUQUdFX01BU0t8RFBfUFJFX0VNUEhBU0lTX01BU0spKSB8IHNpZ25hbF9sZXZlbHM7CiAJCX0KIAotCQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAhaXNfY3B1X2VkcChpbnRlbF9kcCkpCisJCWlmIChIQVNfUENIX0NQVChkZXYpICYmIChJU19HRU43KGRldikgfHwgIWlzX2NwdV9lZHAoaW50ZWxfZHApKSkKIAkJCXJlZyA9IERQIHwgRFBfTElOS19UUkFJTl9QQVRfMl9DUFQ7CiAJCWVsc2UKIAkJCXJlZyA9IERQIHwgRFBfTElOS19UUkFJTl9QQVRfMjsKQEAgLTE3NTIsNyArMTg0NSw3IEBACiAJCSsrdHJpZXM7CiAJfQogCi0JaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2NwdV9lZHAoaW50ZWxfZHApKQorCWlmIChIQVNfUENIX0NQVChkZXYpICYmIChJU19HRU43KGRldikgfHwgIWlzX2NwdV9lZHAoaW50ZWxfZHApKSkKIAkJcmVnID0gRFAgfCBEUF9MSU5LX1RSQUlOX09GRl9DUFQ7CiAJZWxzZQogCQlyZWcgPSBEUCB8IERQX0xJTktfVFJBSU5fT0ZGOwpAQCAtMTc4Miw3ICsxODc1LDcgQEAKIAkJdWRlbGF5KDEwMCk7CiAJfQogCi0JaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2NwdV9lZHAoaW50ZWxfZHApKSB7CisJaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgKElTX0dFTjcoZGV2KSB8fCAhaXNfY3B1X2VkcChpbnRlbF9kcCkpKSB7CiAJCURQICY9IH5EUF9MSU5LX1RSQUlOX01BU0tfQ1BUOwogCQlJOTE1X1dSSVRFKGludGVsX2RwLT5vdXRwdXRfcmVnLCBEUCB8IERQX0xJTktfVFJBSU5fUEFUX0lETEVfQ1BUKTsKIAl9IGVsc2UgewpAQCAtMTc5NCw3ICsxODg3LDcgQEAKIAltc2xlZXAoMTcpOwogCiAJaWYgKGlzX2VkcChpbnRlbF9kcCkpIHsKLQkJaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYgIWlzX2NwdV9lZHAoaW50ZWxfZHApKQorCQlpZiAoSEFTX1BDSF9DUFQoZGV2KSAmJiAoSVNfR0VONyhkZXYpIHx8ICFpc19jcHVfZWRwKGludGVsX2RwKSkpCiAJCQlEUCB8PSBEUF9MSU5LX1RSQUlOX09GRl9DUFQ7CiAJCWVsc2UKIAkJCURQIHw9IERQX0xJTktfVFJBSU5fT0ZGOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaAppbmRleCBiZDlhNjA0Li5hMWI0MzQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaApAQCAtMTEwLDYgKzExMCw3IEBACiAvKiBkcm1fZGlzcGxheV9tb2RlLT5wcml2YXRlX2ZsYWdzICovCiAjZGVmaW5lIElOVEVMX01PREVfUElYRUxfTVVMVElQTElFUl9TSElGVCAoMHgwKQogI2RlZmluZSBJTlRFTF9NT0RFX1BJWEVMX01VTFRJUExJRVJfTUFTSyAoMHhmIDw8IElOVEVMX01PREVfUElYRUxfTVVMVElQTElFUl9TSElGVCkKKyNkZWZpbmUgSU5URUxfTU9ERV9EUF9GT1JDRV82QlBDICgweDEwKQogCiBzdGF0aWMgaW5saW5lIHZvaWQKIGludGVsX21vZGVfc2V0X3BpeGVsX211bHRpcGxpZXIoc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9sdmRzLmMKaW5kZXggNDJmMTY1YS4uZTQ0MTkxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfbHZkcy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2x2ZHMuYwpAQCAtNzE1LDYgKzcxNSwxNCBAQAogCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJFQjEwMDciKSwKIAkJfSwKIAl9LAorCXsKKwkJLmNhbGxiYWNrID0gaW50ZWxfbm9fbHZkc19kbWlfY2FsbGJhY2ssCisJCS5pZGVudCA9ICJBc3VzIEFUNU5NMTBULUkiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfVkVORE9SLCAiQVNVU1RlSyBDb21wdXRlciBJTkMuIiksCisJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICJBVDVOTTEwVC1JIiksCisJCX0sCisJfSwKIAogCXsgfQkvKiB0ZXJtaW5hdGluZyBlbnRyeSAqLwogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9wYW5lbC5jCmluZGV4IDIxZjYwYjcuLjA0ZDc5ZmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3BhbmVsLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcGFuZWwuYwpAQCAtMTc4LDEzICsxNzgsMTAgQEAKIAlpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CiAJCW1heCA+Pj0gMTY7CiAJfSBlbHNlIHsKLQkJaWYgKElTX1BJTkVWSUVXKGRldikpIHsKKwkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuIDwgNCkKIAkJCW1heCA+Pj0gMTc7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCW1heCA+Pj0gMTY7Ci0JCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA0KQotCQkJCW1heCAmPSB+MTsKLQkJfQogCiAJCWlmIChpc19iYWNrbGlnaHRfY29tYmluYXRpb25fbW9kZShkZXYpKQogCQkJbWF4ICo9IDB4ZmY7CkBAIC0yMDMsMTMgKzIwMCwxMiBAQAogCQl2YWwgPSBJOTE1X1JFQUQoQkxDX1BXTV9DUFVfQ1RMKSAmIEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7CiAJfSBlbHNlIHsKIAkJdmFsID0gSTkxNV9SRUFEKEJMQ19QV01fQ1RMKSAmIEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX01BU0s7Ci0JCWlmIChJU19QSU5FVklFVyhkZXYpKQorCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPCA0KQogCQkJdmFsID4+PSAxOwogCiAJCWlmIChpc19iYWNrbGlnaHRfY29tYmluYXRpb25fbW9kZShkZXYpKSB7CiAJCQl1OCBsYnBjOwogCi0JCQl2YWwgJj0gfjE7CiAJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYtPnBkZXYsIFBDSV9MQlBDLCAmbGJwYyk7CiAJCQl2YWwgKj0gbGJwYzsKIAkJfQpAQCAtMjQ2LDExICsyNDIsOSBAQAogCX0KIAogCXRtcCA9IEk5MTVfUkVBRChCTENfUFdNX0NUTCk7Ci0JaWYgKElTX1BJTkVWSUVXKGRldikpIHsKLQkJdG1wICY9IH4oQkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSyAtIDEpOworCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA8IDQpIAogCQlsZXZlbCA8PD0gMTsKLQl9IGVsc2UKLQkJdG1wICY9IH5CQUNLTElHSFRfRFVUWV9DWUNMRV9NQVNLOworCXRtcCAmPSB+QkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSzsKIAlJOTE1X1dSSVRFKEJMQ19QV01fQ1RMLCB0bXAgfCBsZXZlbCk7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Nkdm8uYwppbmRleCAzMDAzZmIyLi5mN2I5MjY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9zZHZvLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfc2R2by5jCkBAIC01MCw2ICs1MCw3IEBACiAjZGVmaW5lIElTX1RNRFMoYykJKGMtPm91dHB1dF9mbGFnICYgU0RWT19UTURTX01BU0spCiAjZGVmaW5lIElTX0xWRFMoYykJKGMtPm91dHB1dF9mbGFnICYgU0RWT19MVkRTX01BU0spCiAjZGVmaW5lIElTX1RWX09SX0xWRFMoYykgKGMtPm91dHB1dF9mbGFnICYgKFNEVk9fVFZfTUFTSyB8IFNEVk9fTFZEU19NQVNLKSkKKyNkZWZpbmUgSVNfRElHSVRBTChjKSAoYy0+b3V0cHV0X2ZsYWcgJiAoU0RWT19UTURTX01BU0sgfCBTRFZPX0xWRFNfTUFTSykpCiAKIAogc3RhdGljIGNvbnN0IGNoYXIgKnR2X2Zvcm1hdF9uYW1lc1tdID0gewpAQCAtMTA4Niw4ICsxMDg3LDEyIEBACiAJCX0KIAkJc2R2b3ggfD0gKDkgPDwgMTkpIHwgU0RWT19CT1JERVJfRU5BQkxFOwogCX0KLQlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAxKQotCQlzZHZveCB8PSBTRFZPX1BJUEVfQl9TRUxFQ1Q7CisKKwlpZiAoSU5URUxfUENIX1RZUEUoZGV2KSA+PSBQQ0hfQ1BUKQorCQlzZHZveCB8PSBUUkFOU0NPREVSX0NQVChpbnRlbF9jcnRjLT5waXBlKTsKKwllbHNlCisJCXNkdm94IHw9IFRSQU5TQ09ERVIoaW50ZWxfY3J0Yy0+cGlwZSk7CisKIAlpZiAoaW50ZWxfc2R2by0+aGFzX2hkbWlfYXVkaW8pCiAJCXNkdm94IHw9IFNEVk9fQVVESU9fRU5BQkxFOwogCkBAIC0xMzE0LDYgKzEzMTksMTggQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgYm9vbAoraW50ZWxfc2R2b19jb25uZWN0b3JfbWF0Y2hlc19lZGlkKHN0cnVjdCBpbnRlbF9zZHZvX2Nvbm5lY3RvciAqc2R2bywKKwkJCQkgIHN0cnVjdCBlZGlkICplZGlkKQoreworCWJvb2wgbW9uaXRvcl9pc19kaWdpdGFsID0gISEoZWRpZC0+aW5wdXQgJiBEUk1fRURJRF9JTlBVVF9ESUdJVEFMKTsKKwlib29sIGNvbm5lY3Rvcl9pc19kaWdpdGFsID0gISFJU19ESUdJVEFMKHNkdm8pOworCisJRFJNX0RFQlVHX0tNUygiY29ubmVjdG9yX2lzX2RpZ2l0YWw/ICVkLCBtb25pdG9yX2lzX2RpZ2l0YWw/ICVkXG4iLAorCQkgICAgICBjb25uZWN0b3JfaXNfZGlnaXRhbCwgbW9uaXRvcl9pc19kaWdpdGFsKTsKKwlyZXR1cm4gY29ubmVjdG9yX2lzX2RpZ2l0YWwgPT0gbW9uaXRvcl9pc19kaWdpdGFsOworfQorCiBzdGF0aWMgZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cwogaW50ZWxfc2R2b19kZXRlY3Qoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvciwgYm9vbCBmb3JjZSkKIHsKQEAgLTEzNTgsMTAgKzEzNzUsMTIgQEAKIAkJaWYgKGVkaWQgPT0gTlVMTCkKIAkJCWVkaWQgPSBpbnRlbF9zZHZvX2dldF9hbmFsb2dfZWRpZChjb25uZWN0b3IpOwogCQlpZiAoZWRpZCAhPSBOVUxMKSB7Ci0JCQlpZiAoZWRpZC0+aW5wdXQgJiBEUk1fRURJRF9JTlBVVF9ESUdJVEFMKQotCQkJCXJldCA9IGNvbm5lY3Rvcl9zdGF0dXNfZGlzY29ubmVjdGVkOwotCQkJZWxzZQorCQkJaWYgKGludGVsX3Nkdm9fY29ubmVjdG9yX21hdGNoZXNfZWRpZChpbnRlbF9zZHZvX2Nvbm5lY3RvciwKKwkJCQkJCQkgICAgICBlZGlkKSkKIAkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Nvbm5lY3RlZDsKKwkJCWVsc2UKKwkJCQlyZXQgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKwogCQkJY29ubmVjdG9yLT5kaXNwbGF5X2luZm8ucmF3X2VkaWQgPSBOVUxMOwogCQkJa2ZyZWUoZWRpZCk7CiAJCX0gZWxzZQpAQCAtMTQwMiwxMSArMTQyMSw4IEBACiAJCWVkaWQgPSBpbnRlbF9zZHZvX2dldF9hbmFsb2dfZWRpZChjb25uZWN0b3IpOwogCiAJaWYgKGVkaWQgIT0gTlVMTCkgewotCQlzdHJ1Y3QgaW50ZWxfc2R2b19jb25uZWN0b3IgKmludGVsX3Nkdm9fY29ubmVjdG9yID0gdG9faW50ZWxfc2R2b19jb25uZWN0b3IoY29ubmVjdG9yKTsKLQkJYm9vbCBtb25pdG9yX2lzX2RpZ2l0YWwgPSAhIShlZGlkLT5pbnB1dCAmIERSTV9FRElEX0lOUFVUX0RJR0lUQUwpOwotCQlib29sIGNvbm5lY3Rvcl9pc19kaWdpdGFsID0gISFJU19UTURTKGludGVsX3Nkdm9fY29ubmVjdG9yKTsKLQotCQlpZiAoY29ubmVjdG9yX2lzX2RpZ2l0YWwgPT0gbW9uaXRvcl9pc19kaWdpdGFsKSB7CisJCWlmIChpbnRlbF9zZHZvX2Nvbm5lY3Rvcl9tYXRjaGVzX2VkaWQodG9faW50ZWxfc2R2b19jb25uZWN0b3IoY29ubmVjdG9yKSwKKwkJCQkJCSAgICAgIGVkaWQpKSB7CiAJCQlkcm1fbW9kZV9jb25uZWN0b3JfdXBkYXRlX2VkaWRfcHJvcGVydHkoY29ubmVjdG9yLCBlZGlkKTsKIAkJCWRybV9hZGRfZWRpZF9tb2Rlcyhjb25uZWN0b3IsIGVkaWQpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jCmluZGV4IGRkYmFiZWYuLmIxMmZkMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZGlzcGxheS5jCkBAIC0zNjksMyArMzY5LDQ4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CiAJcmV0dXJuIDA7CiB9CisKK2ludAorbm91dmVhdV9kaXNwbGF5X2R1bWJfY3JlYXRlKHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2LCBzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkcm1fbW9kZV9jcmVhdGVfZHVtYiAqYXJncykKK3sKKwlzdHJ1Y3Qgbm91dmVhdV9ibyAqYm87CisJaW50IHJldDsKKworCWFyZ3MtPnBpdGNoID0gcm91bmR1cChhcmdzLT53aWR0aCAqIChhcmdzLT5icHAgLyA4KSwgMjU2KTsKKwlhcmdzLT5zaXplID0gYXJncy0+cGl0Y2ggKiBhcmdzLT5oZWlnaHQ7CisJYXJncy0+c2l6ZSA9IHJvdW5kdXAoYXJncy0+c2l6ZSwgUEFHRV9TSVpFKTsKKworCXJldCA9IG5vdXZlYXVfZ2VtX25ldyhkZXYsIGFyZ3MtPnNpemUsIDAsIFRUTV9QTF9GTEFHX1ZSQU0sIDAsIDAsICZibyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGRybV9nZW1faGFuZGxlX2NyZWF0ZShmaWxlX3ByaXYsIGJvLT5nZW0sICZhcmdzLT5oYW5kbGUpOworCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKGJvLT5nZW0pOworCXJldHVybiByZXQ7Cit9CisKK2ludAorbm91dmVhdV9kaXNwbGF5X2R1bWJfZGVzdHJveShzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwgc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCSAgICAgdWludDMyX3QgaGFuZGxlKQoreworCXJldHVybiBkcm1fZ2VtX2hhbmRsZV9kZWxldGUoZmlsZV9wcml2LCBoYW5kbGUpOworfQorCitpbnQKK25vdXZlYXVfZGlzcGxheV9kdW1iX21hcF9vZmZzZXQoc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYsCisJCQkJc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQl1aW50MzJfdCBoYW5kbGUsIHVpbnQ2NF90ICpwb2Zmc2V0KQoreworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqZ2VtOworCisJZ2VtID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBoYW5kbGUpOworCWlmIChnZW0pIHsKKwkJc3RydWN0IG5vdXZlYXVfYm8gKmJvID0gZ2VtLT5kcml2ZXJfcHJpdmF0ZTsKKwkJKnBvZmZzZXQgPSBiby0+Ym8uYWRkcl9zcGFjZV9vZmZzZXQ7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9ja2VkKGdlbSk7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtRU5PRU5UOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmMKaW5kZXggOWY3YmIxMi4uOTc5MWQxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5jCkBAIC00MzMsNiArNDMzLDEwIEBACiAJLmdlbV9vcGVuX29iamVjdCA9IG5vdXZlYXVfZ2VtX29iamVjdF9vcGVuLAogCS5nZW1fY2xvc2Vfb2JqZWN0ID0gbm91dmVhdV9nZW1fb2JqZWN0X2Nsb3NlLAogCisJLmR1bWJfY3JlYXRlID0gbm91dmVhdV9kaXNwbGF5X2R1bWJfY3JlYXRlLAorCS5kdW1iX21hcF9vZmZzZXQgPSBub3V2ZWF1X2Rpc3BsYXlfZHVtYl9tYXBfb2Zmc2V0LAorCS5kdW1iX2Rlc3Ryb3kgPSBub3V2ZWF1X2Rpc3BsYXlfZHVtYl9kZXN0cm95LAorCiAJLm5hbWUgPSBEUklWRVJfTkFNRSwKIAkuZGVzYyA9IERSSVZFUl9ERVNDLAogI2lmZGVmIEdJVF9SRVZJU0lPTgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZHJ2LmgKaW5kZXggMjk4MzdkYS4uNGMwYmUzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rydi5oCkBAIC0xNDE4LDYgKzE0MTgsMTIgQEAKIAkJCSAgIHN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmV2ZW50KTsKIGludCBub3V2ZWF1X2ZpbmlzaF9wYWdlX2ZsaXAoc3RydWN0IG5vdXZlYXVfY2hhbm5lbCAqLAogCQkJICAgICBzdHJ1Y3Qgbm91dmVhdV9wYWdlX2ZsaXBfc3RhdGUgKik7CitpbnQgbm91dmVhdV9kaXNwbGF5X2R1bWJfY3JlYXRlKHN0cnVjdCBkcm1fZmlsZSAqLCBzdHJ1Y3QgZHJtX2RldmljZSAqLAorCQkJCXN0cnVjdCBkcm1fbW9kZV9jcmVhdGVfZHVtYiAqYXJncyk7CitpbnQgbm91dmVhdV9kaXNwbGF5X2R1bWJfbWFwX29mZnNldChzdHJ1Y3QgZHJtX2ZpbGUgKiwgc3RydWN0IGRybV9kZXZpY2UgKiwKKwkJCQkgICAgdWludDMyX3QgaGFuZGxlLCB1aW50NjRfdCAqb2Zmc2V0KTsKK2ludCBub3V2ZWF1X2Rpc3BsYXlfZHVtYl9kZXN0cm95KHN0cnVjdCBkcm1fZmlsZSAqLCBzdHJ1Y3QgZHJtX2RldmljZSAqLAorCQkJCSB1aW50MzJfdCBoYW5kbGUpOwogCiAvKiBudjEwX2dwaW8uYyAqLwogaW50IG52MTBfZ3Bpb19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgZW51bSBkY2JfZ3Bpb190YWcgdGFnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X29iamVjdC5jCmluZGV4IDAyMjIyYzUuLjk2MGMwYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfb2JqZWN0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9vYmplY3QuYwpAQCAtNjgwLDcgKzY4MCw3IEBACiAJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0ID0gZHJtX21tX2luaXQoJmNoYW4tPnJhbWluX2hlYXAsIGJhc2UsIHNpemUpOworCXJldCA9IGRybV9tbV9pbml0KCZjaGFuLT5yYW1pbl9oZWFwLCBiYXNlLCBzaXplIC0gYmFzZSk7CiAJaWYgKHJldCkgewogCQlOVl9FUlJPUihkZXYsICJFcnJvciBjcmVhdGluZyBQUkFNSU4gaGVhcDogJWRcbiIsIHJldCk7CiAJCW5vdXZlYXVfZ3B1b2JqX3JlZihOVUxMLCAmY2hhbi0+cmFtaW4pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zZ2RtYS5jCmluZGV4IGI3NTI1OGEuLmM4YTQ2M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc2dkbWEuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X3NnZG1hLmMKQEAgLTY3LDcgKzY3LDEwIEBACiAJCQlwY2lfdW5tYXBfcGFnZShkZXYtPnBkZXYsIG52YmUtPnBhZ2VzW252YmUtPm5yX3BhZ2VzXSwKIAkJCQkgICAgICAgUEFHRV9TSVpFLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwogCQl9CisJCW52YmUtPnVubWFwX3BhZ2VzID0gZmFsc2U7CiAJfQorCisJbnZiZS0+cGFnZXMgPSBOVUxMOwogfQogCiBzdGF0aWMgdm9pZApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnY1MF9kaXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYwppbmRleCBkMjNjYTAwLi4wNmRlMjUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udjUwX2Rpc3BsYXkuYwpAQCAtNjE2LDcgKzYxNiw3IEBACiAJc3RydWN0IGRybV9ub3V2ZWF1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKIAlzdHJ1Y3QgbnY1MF9kaXNwbGF5ICpkaXNwID0gbnY1MF9kaXNwbGF5KGRldik7CiAJdTMyIHVuazMwID0gbnZfcmQzMihkZXYsIDB4NjEwMDMwKSwgbWM7Ci0JaW50IGksIGNydGMsIG9yLCB0eXBlID0gT1VUUFVUX0FOWTsKKwlpbnQgaSwgY3J0Yywgb3IgPSAwLCB0eXBlID0gT1VUUFVUX0FOWTsKIAogCU5WX0RFQlVHX0tNUyhkZXYsICIweDYxMDAzMDogMHglMDh4XG4iLCB1bmszMCk7CiAJZGlzcC0+aXJxLmRjYiA9IE5VTEw7CkBAIC03MDgsNyArNzA4LDcgQEAKIAlzdHJ1Y3QgbnY1MF9kaXNwbGF5ICpkaXNwID0gbnY1MF9kaXNwbGF5KGRldik7CiAJdTMyIHVuazMwID0gbnZfcmQzMihkZXYsIDB4NjEwMDMwKSwgdG1wLCBwY2xrLCBzY3JpcHQsIG1jID0gMDsKIAlzdHJ1Y3QgZGNiX2VudHJ5ICpkY2I7Ci0JaW50IGksIGNydGMsIG9yLCB0eXBlID0gT1VUUFVUX0FOWTsKKwlpbnQgaSwgY3J0Yywgb3IgPSAwLCB0eXBlID0gT1VUUFVUX0FOWTsKIAogCU5WX0RFQlVHX0tNUyhkZXYsICIweDYxMDAzMDogMHglMDh4XG4iLCB1bmszMCk7CiAJZGNiID0gZGlzcC0+aXJxLmRjYjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguYyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252YzBfZ3JhcGguYwppbmRleCBhNzRlNTAxLi5lY2ZhZmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9udmMwX2dyYXBoLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZjMF9ncmFwaC5jCkBAIC0zODEsNiArMzgxLDggQEAKIAl1OCAgdHBucltHUENfTUFYXTsKIAlpbnQgaSwgZ3BjLCB0cGM7CiAKKwludl93cjMyKGRldiwgVFBfVU5JVCgwLCAwLCAweDVjKSwgMSk7IC8qIGFmZmVjdHMgVEZCIG9mZnNldCBxdWVyaWVzICovCisKIAkvKgogCSAqICAgICAgVFAgICAgICBST1AgVU5LVkFMKG1hZ2ljX25vdF9yb3BfbnIpCiAJICogNDUwOiA0LzAvMC8wIDIgICAgICAgIDMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L252ZDBfZGlzcGxheS5jIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZkMF9kaXNwbGF5LmMKaW5kZXggMjNkNjNiNC4uY2IwMDZhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZkMF9kaXNwbGF5LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbnZkMF9kaXNwbGF5LmMKQEAgLTc4MCw3ICs3ODAsNyBAQAogCQkJY29udGludWU7CiAKIAkJaWYgKG52X3BhcnRuZXIgIT0gbnZfZW5jb2RlciAmJgotCQkgICAgbnZfcGFydG5lci0+ZGNiLT5vciA9PSBudl9lbmNvZGVyLT5vcikgeworCQkgICAgbnZfcGFydG5lci0+ZGNiLT5vciA9PSBudl9lbmNvZGVyLT5kY2ItPm9yKSB7CiAJCQlpZiAobnZfcGFydG5lci0+bGFzdF9kcG1zID09IERSTV9NT0RFX0RQTVNfT04pCiAJCQkJcmV0dXJuOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2F0b21iaW9zX2NydGMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jCmluZGV4IDg3NjMxZmUuLjJiOTcyNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vYXRvbWJpb3NfY3J0Yy5jCkBAIC0xMTA3LDkgKzExMDcsNDAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKHRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUFDUk8pCisJaWYgKHRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUFDUk8pIHsKKwkJaWYgKHJkZXYtPmZhbWlseSA+PSBDSElQX0NBWU1BTikKKwkJCXRtcCA9IHJkZXYtPmNvbmZpZy5jYXltYW4udGlsZV9jb25maWc7CisJCWVsc2UKKwkJCXRtcCA9IHJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4udGlsZV9jb25maWc7CisKKwkJc3dpdGNoICgodG1wICYgMHhmMCkgPj4gNCkgeworCQljYXNlIDA6IC8qIDQgYmFua3MgKi8KKwkJCWZiX2Zvcm1hdCB8PSBFVkVSR1JFRU5fR1JQSF9OVU1fQkFOS1MoRVZFUkdSRUVOX0FERFJfU1VSRl80X0JBTkspOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogOCBiYW5rcyAqLworCQlkZWZhdWx0OgorCQkJZmJfZm9ybWF0IHw9IEVWRVJHUkVFTl9HUlBIX05VTV9CQU5LUyhFVkVSR1JFRU5fQUREUl9TVVJGXzhfQkFOSyk7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiAxNiBiYW5rcyAqLworCQkJZmJfZm9ybWF0IHw9IEVWRVJHUkVFTl9HUlBIX05VTV9CQU5LUyhFVkVSR1JFRU5fQUREUl9TVVJGXzE2X0JBTkspOworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKCh0bXAgJiAweGYwMDApID4+IDEyKSB7CisJCWNhc2UgMDogLyogMUtCIHJvd3MgKi8KKwkJZGVmYXVsdDoKKwkJCWZiX2Zvcm1hdCB8PSBFVkVSR1JFRU5fR1JQSF9USUxFX1NQTElUKEVWRVJHUkVFTl9BRERSX1NVUkZfVElMRV9TUExJVF8xS0IpOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogMktCIHJvd3MgKi8KKwkJCWZiX2Zvcm1hdCB8PSBFVkVSR1JFRU5fR1JQSF9USUxFX1NQTElUKEVWRVJHUkVFTl9BRERSX1NVUkZfVElMRV9TUExJVF8yS0IpOworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogNEtCIHJvd3MgKi8KKwkJCWZiX2Zvcm1hdCB8PSBFVkVSR1JFRU5fR1JQSF9USUxFX1NQTElUKEVWRVJHUkVFTl9BRERSX1NVUkZfVElMRV9TUExJVF80S0IpOworCQkJYnJlYWs7CisJCX0KKwogCQlmYl9mb3JtYXQgfD0gRVZFUkdSRUVOX0dSUEhfQVJSQVlfTU9ERShFVkVSR1JFRU5fR1JQSF9BUlJBWV8yRF9USUxFRF9USElOMSk7Ci0JZWxzZSBpZiAodGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykKKwl9IGVsc2UgaWYgKHRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUlDUk8pCiAJCWZiX2Zvcm1hdCB8PSBFVkVSR1JFRU5fR1JQSF9BUlJBWV9NT0RFKEVWRVJHUkVFTl9HUlBIX0FSUkFZXzFEX1RJTEVEX1RISU4xKTsKIAogCXN3aXRjaCAocmFkZW9uX2NydGMtPmNydGNfaWQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbi5jCmluZGV4IDFkNjAzYTMuLjkyYzk2MjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW4uYwpAQCAtODIsNiArODIsNyBAQAogewogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF07CiAJdTMyIHRtcCA9IFJSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpOworCWludCBpOwogCiAJLyogTG9jayB0aGUgZ3JhcGhpY3MgdXBkYXRlIGxvY2sgKi8KIAl0bXAgfD0gRVZFUkdSRUVOX0dSUEhfVVBEQVRFX0xPQ0s7CkBAIC05OSw3ICsxMDAsMTEgQEAKIAkgICAgICAgKHUzMiljcnRjX2Jhc2UpOwogCiAJLyogV2FpdCBmb3IgdXBkYXRlX3BlbmRpbmcgdG8gZ28gaGlnaC4gKi8KLQl3aGlsZSAoIShSUkVHMzIoRVZFUkdSRUVOX0dSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmIEVWRVJHUkVFTl9HUlBIX1NVUkZBQ0VfVVBEQVRFX1BFTkRJTkcpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmRldi0+dXNlY190aW1lb3V0OyBpKyspIHsKKwkJaWYgKFJSRUczMihFVkVSR1JFRU5fR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpICYgRVZFUkdSRUVOX0dSUEhfU1VSRkFDRV9VUERBVEVfUEVORElORykKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQogCURSTV9ERUJVRygiVXBkYXRlIHBlbmRpbmcgbm93IGhpZ2guIFVubG9ja2luZyB2dXBkYXRlX2xvY2suXG4iKTsKIAogCS8qIFVubG9jayB0aGUgbG9jaywgc28gZG91YmxlLWJ1ZmZlcmluZyBjYW4gdGFrZSBwbGFjZSBpbnNpZGUgdmJsYW5rICovCkBAIC0zMjcxLDYgKzMyNzYsMTggQEAKIAkJCXJkZXYtPmFjY2VsX3dvcmtpbmcgPSBmYWxzZTsKIAkJfQogCX0KKworCS8qIERvbid0IHN0YXJ0IHVwIGlmIHRoZSBNQyB1Y29kZSBpcyBtaXNzaW5nIG9uIEJUQyBwYXJ0cy4KKwkgKiBUaGUgZGVmYXVsdCBjbG9ja3MgYW5kIHZvbHRhZ2VzIGJlZm9yZSB0aGUgTUMgdWNvZGUKKwkgKiBpcyBsb2FkZWQgYXJlIG5vdCBzdWZmaWVudCBmb3IgYWR2YW5jZWQgb3BlcmF0aW9ucy4KKwkgKi8KKwlpZiAoQVNJQ19JU19EQ0U1KHJkZXYpKSB7CisJCWlmICghcmRldi0+bWNfZncgJiYgIShyZGV2LT5mbGFncyAmIFJBREVPTl9JU19JR1ApKSB7CisJCQlEUk1fRVJST1IoInJhZGVvbjogTUMgdWNvZGUgcmVxdWlyZWQgZm9yIE5JKy5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fY3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX2NzLmMKaW5kZXggMzhlMWJkYS4uY2Q0NTkwYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbl9jcy5jCkBAIC0zOCw2ICszOCw3IEBACiAJdTMyCQkJZ3JvdXBfc2l6ZTsKIAl1MzIJCQluYmFua3M7CiAJdTMyCQkJbnBpcGVzOworCXUzMgkJCXJvd19zaXplOwogCS8qIHZhbHVlIHdlIHRyYWNrICovCiAJdTMyCQkJbnNhbXBsZXM7CiAJdTMyCQkJY2JfY29sb3JfYmFzZV9sYXN0WzEyXTsKQEAgLTc3LDYgKzc4LDQ0IEBACiAJc3RydWN0IHJhZGVvbl9ibwkqZGJfc193cml0ZV9ibzsKIH07CiAKK3N0YXRpYyB1MzIgZXZlcmdyZWVuX2NzX2dldF9hcmF5X21vZGUodTMyIHRpbGluZ19mbGFncykKK3sKKwlpZiAodGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NQUNSTykKKwkJcmV0dXJuIEFSUkFZXzJEX1RJTEVEX1RISU4xOworCWVsc2UgaWYgKHRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUlDUk8pCisJCXJldHVybiBBUlJBWV8xRF9USUxFRF9USElOMTsKKwllbHNlCisJCXJldHVybiBBUlJBWV9MSU5FQVJfR0VORVJBTDsKK30KKworc3RhdGljIHUzMiBldmVyZ3JlZW5fY3NfZ2V0X251bV9iYW5rcyh1MzIgbmJhbmtzKQoreworCXN3aXRjaCAobmJhbmtzKSB7CisJY2FzZSAyOgorCQlyZXR1cm4gQUREUl9TVVJGXzJfQkFOSzsKKwljYXNlIDQ6CisJCXJldHVybiBBRERSX1NVUkZfNF9CQU5LOworCWNhc2UgODoKKwlkZWZhdWx0OgorCQlyZXR1cm4gQUREUl9TVVJGXzhfQkFOSzsKKwljYXNlIDE2OgorCQlyZXR1cm4gQUREUl9TVVJGXzE2X0JBTks7CisJfQorfQorCitzdGF0aWMgdTMyIGV2ZXJncmVlbl9jc19nZXRfdGlsZV9zcGxpdCh1MzIgcm93X3NpemUpCit7CisJc3dpdGNoIChyb3dfc2l6ZSkgeworCWNhc2UgMToKKwlkZWZhdWx0OgorCQlyZXR1cm4gQUREUl9TVVJGX1RJTEVfU1BMSVRfMUtCOworCWNhc2UgMjoKKwkJcmV0dXJuIEFERFJfU1VSRl9USUxFX1NQTElUXzJLQjsKKwljYXNlIDQ6CisJCXJldHVybiBBRERSX1NVUkZfVElMRV9TUExJVF80S0I7CisJfQorfQorCiBzdGF0aWMgdm9pZCBldmVyZ3JlZW5fY3NfdHJhY2tfaW5pdChzdHJ1Y3QgZXZlcmdyZWVuX2NzX3RyYWNrICp0cmFjaykKIHsKIAlpbnQgaTsKQEAgLTQ5MCwxMiArNTI5LDExIEBACiAJCQl9CiAJCQlpYltpZHhdICY9IH5aX0FSUkFZX01PREUoMHhmKTsKIAkJCXRyYWNrLT5kYl96X2luZm8gJj0gflpfQVJSQVlfTU9ERSgweGYpOworCQkJaWJbaWR4XSB8PSBaX0FSUkFZX01PREUoZXZlcmdyZWVuX2NzX2dldF9hcmF5X21vZGUocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzKSk7CisJCQl0cmFjay0+ZGJfel9pbmZvIHw9IFpfQVJSQVlfTU9ERShldmVyZ3JlZW5fY3NfZ2V0X2FyYXlfbW9kZShyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MpKTsKIAkJCWlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01BQ1JPKSB7Ci0JCQkJaWJbaWR4XSB8PSBaX0FSUkFZX01PREUoQVJSQVlfMkRfVElMRURfVEhJTjEpOwotCQkJCXRyYWNrLT5kYl96X2luZm8gfD0gWl9BUlJBWV9NT0RFKEFSUkFZXzJEX1RJTEVEX1RISU4xKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWJbaWR4XSB8PSBaX0FSUkFZX01PREUoQVJSQVlfMURfVElMRURfVEhJTjEpOwotCQkJCXRyYWNrLT5kYl96X2luZm8gfD0gWl9BUlJBWV9NT0RFKEFSUkFZXzFEX1RJTEVEX1RISU4xKTsKKwkJCQlpYltpZHhdIHw9IERCX05VTV9CQU5LUyhldmVyZ3JlZW5fY3NfZ2V0X251bV9iYW5rcyh0cmFjay0+bmJhbmtzKSk7CisJCQkJaWJbaWR4XSB8PSBEQl9USUxFX1NQTElUKGV2ZXJncmVlbl9jc19nZXRfdGlsZV9zcGxpdCh0cmFjay0+cm93X3NpemUpKTsKIAkJCX0KIAkJfQogCQlicmVhazsKQEAgLTYxOCwxMyArNjU2LDggQEAKIAkJCQkJCSIweCUwNFhcbiIsIHJlZyk7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9Ci0JCQlpZiAocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NQUNSTykgewotCQkJCWliW2lkeF0gfD0gQ0JfQVJSQVlfTU9ERShBUlJBWV8yRF9USUxFRF9USElOMSk7Ci0JCQkJdHJhY2stPmNiX2NvbG9yX2luZm9bdG1wXSB8PSBDQl9BUlJBWV9NT0RFKEFSUkFZXzJEX1RJTEVEX1RISU4xKTsKLQkJCX0gZWxzZSBpZiAocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzICYgUkFERU9OX1RJTElOR19NSUNSTykgewotCQkJCWliW2lkeF0gfD0gQ0JfQVJSQVlfTU9ERShBUlJBWV8xRF9USUxFRF9USElOMSk7Ci0JCQkJdHJhY2stPmNiX2NvbG9yX2luZm9bdG1wXSB8PSBDQl9BUlJBWV9NT0RFKEFSUkFZXzFEX1RJTEVEX1RISU4xKTsKLQkJCX0KKwkJCWliW2lkeF0gfD0gQ0JfQVJSQVlfTU9ERShldmVyZ3JlZW5fY3NfZ2V0X2FyYXlfbW9kZShyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MpKTsKKwkJCXRyYWNrLT5jYl9jb2xvcl9pbmZvW3RtcF0gfD0gQ0JfQVJSQVlfTU9ERShldmVyZ3JlZW5fY3NfZ2V0X2FyYXlfbW9kZShyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MpKTsKIAkJfQogCQlicmVhazsKIAljYXNlIENCX0NPTE9SOF9JTkZPOgpAQCAtNjQwLDEzICs2NzMsOCBAQAogCQkJCQkJIjB4JTA0WFxuIiwgcmVnKTsKIAkJCQlyZXR1cm4gLUVJTlZBTDsKIAkJCX0KLQkJCWlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01BQ1JPKSB7Ci0JCQkJaWJbaWR4XSB8PSBDQl9BUlJBWV9NT0RFKEFSUkFZXzJEX1RJTEVEX1RISU4xKTsKLQkJCQl0cmFjay0+Y2JfY29sb3JfaW5mb1t0bXBdIHw9IENCX0FSUkFZX01PREUoQVJSQVlfMkRfVElMRURfVEhJTjEpOwotCQkJfSBlbHNlIGlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01JQ1JPKSB7Ci0JCQkJaWJbaWR4XSB8PSBDQl9BUlJBWV9NT0RFKEFSUkFZXzFEX1RJTEVEX1RISU4xKTsKLQkJCQl0cmFjay0+Y2JfY29sb3JfaW5mb1t0bXBdIHw9IENCX0FSUkFZX01PREUoQVJSQVlfMURfVElMRURfVEhJTjEpOwotCQkJfQorCQkJaWJbaWR4XSB8PSBDQl9BUlJBWV9NT0RFKGV2ZXJncmVlbl9jc19nZXRfYXJheV9tb2RlKHJlbG9jLT5sb2JqLnRpbGluZ19mbGFncykpOworCQkJdHJhY2stPmNiX2NvbG9yX2luZm9bdG1wXSB8PSBDQl9BUlJBWV9NT0RFKGV2ZXJncmVlbl9jc19nZXRfYXJheV9tb2RlKHJlbG9jLT5sb2JqLnRpbGluZ19mbGFncykpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgQ0JfQ09MT1IwX1BJVENIOgpAQCAtNzAxLDYgKzcyOSwxNiBAQAogCWNhc2UgQ0JfQ09MT1I5X0FUVFJJQjoKIAljYXNlIENCX0NPTE9SMTBfQVRUUklCOgogCWNhc2UgQ0JfQ09MT1IxMV9BVFRSSUI6CisJCXIgPSBldmVyZ3JlZW5fY3NfcGFja2V0X25leHRfcmVsb2MocCwgJnJlbG9jKTsKKwkJaWYgKHIpIHsKKwkJCWRldl93YXJuKHAtPmRldiwgImJhZCBTRVRfQ09OVEVYVF9SRUcgIgorCQkJCQkiMHglMDRYXG4iLCByZWcpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHJlbG9jLT5sb2JqLnRpbGluZ19mbGFncyAmIFJBREVPTl9USUxJTkdfTUFDUk8pIHsKKwkJCWliW2lkeF0gfD0gQ0JfTlVNX0JBTktTKGV2ZXJncmVlbl9jc19nZXRfbnVtX2JhbmtzKHRyYWNrLT5uYmFua3MpKTsKKwkJCWliW2lkeF0gfD0gQ0JfVElMRV9TUExJVChldmVyZ3JlZW5fY3NfZ2V0X3RpbGVfc3BsaXQodHJhY2stPnJvd19zaXplKSk7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBDQl9DT0xPUjBfRElNOgogCWNhc2UgQ0JfQ09MT1IxX0RJTToKQEAgLTEzMTgsMTAgKzEzNTYsMTQgQEAKIAkJCQl9CiAJCQkJaWJbaWR4KzErKGkqOCkrMl0gKz0gKHUzMikoKHJlbG9jLT5sb2JqLmdwdV9vZmZzZXQgPj4gOCkgJiAweGZmZmZmZmZmKTsKIAkJCQlpZiAoIXAtPmtlZXBfdGlsaW5nX2ZsYWdzKSB7Ci0JCQkJCWlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01BQ1JPKQotCQkJCQkJaWJbaWR4KzErKGkqOCkrMV0gfD0gVEVYX0FSUkFZX01PREUoQVJSQVlfMkRfVElMRURfVEhJTjEpOwotCQkJCQllbHNlIGlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01JQ1JPKQotCQkJCQkJaWJbaWR4KzErKGkqOCkrMV0gfD0gVEVYX0FSUkFZX01PREUoQVJSQVlfMURfVElMRURfVEhJTjEpOworCQkJCQlpYltpZHgrMSsoaSo4KSsxXSB8PQorCQkJCQkJVEVYX0FSUkFZX01PREUoZXZlcmdyZWVuX2NzX2dldF9hcmF5X21vZGUocmVsb2MtPmxvYmoudGlsaW5nX2ZsYWdzKSk7CisJCQkJCWlmIChyZWxvYy0+bG9iai50aWxpbmdfZmxhZ3MgJiBSQURFT05fVElMSU5HX01BQ1JPKSB7CisJCQkJCQlpYltpZHgrMSsoaSo4KSs2XSB8PQorCQkJCQkJCVRFWF9USUxFX1NQTElUKGV2ZXJncmVlbl9jc19nZXRfdGlsZV9zcGxpdCh0cmFjay0+cm93X3NpemUpKTsKKwkJCQkJCWliW2lkeCsxKyhpKjgpKzddIHw9CisJCQkJCQkJVEVYX05VTV9CQU5LUyhldmVyZ3JlZW5fY3NfZ2V0X251bV9iYW5rcyh0cmFjay0+bmJhbmtzKSk7CisJCQkJCX0KIAkJCQl9CiAJCQkJdGV4dHVyZSA9IHJlbG9jLT5yb2JqOwogCQkJCS8qIHRleCBtaXAgYmFzZSAqLwpAQCAtMTQyMiw2ICsxNDY0LDcgQEAKIHsKIAlzdHJ1Y3QgcmFkZW9uX2NzX3BhY2tldCBwa3Q7CiAJc3RydWN0IGV2ZXJncmVlbl9jc190cmFjayAqdHJhY2s7CisJdTMyIHRtcDsKIAlpbnQgcjsKIAogCWlmIChwLT50cmFjayA9PSBOVUxMKSB7CkBAIC0xNDMwLDkgKzE0NzMsNjMgQEAKIAkJaWYgKHRyYWNrID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJZXZlcmdyZWVuX2NzX3RyYWNrX2luaXQodHJhY2spOwotCQl0cmFjay0+bnBpcGVzID0gcC0+cmRldi0+Y29uZmlnLmV2ZXJncmVlbi50aWxpbmdfbnBpcGVzOwotCQl0cmFjay0+bmJhbmtzID0gcC0+cmRldi0+Y29uZmlnLmV2ZXJncmVlbi50aWxpbmdfbmJhbmtzOwotCQl0cmFjay0+Z3JvdXBfc2l6ZSA9IHAtPnJkZXYtPmNvbmZpZy5ldmVyZ3JlZW4udGlsaW5nX2dyb3VwX3NpemU7CisJCWlmIChwLT5yZGV2LT5mYW1pbHkgPj0gQ0hJUF9DQVlNQU4pCisJCQl0bXAgPSBwLT5yZGV2LT5jb25maWcuY2F5bWFuLnRpbGVfY29uZmlnOworCQllbHNlCisJCQl0bXAgPSBwLT5yZGV2LT5jb25maWcuZXZlcmdyZWVuLnRpbGVfY29uZmlnOworCisJCXN3aXRjaCAodG1wICYgMHhmKSB7CisJCWNhc2UgMDoKKwkJCXRyYWNrLT5ucGlwZXMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJZGVmYXVsdDoKKwkJCXRyYWNrLT5ucGlwZXMgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXRyYWNrLT5ucGlwZXMgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXRyYWNrLT5ucGlwZXMgPSA4OworCQkJYnJlYWs7CisJCX0KKworCQlzd2l0Y2ggKCh0bXAgJiAweGYwKSA+PiA0KSB7CisJCWNhc2UgMDoKKwkJCXRyYWNrLT5uYmFua3MgPSA0OworCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJZGVmYXVsdDoKKwkJCXRyYWNrLT5uYmFua3MgPSA4OworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXRyYWNrLT5uYmFua3MgPSAxNjsKKwkJCWJyZWFrOworCQl9CisKKwkJc3dpdGNoICgodG1wICYgMHhmMDApID4+IDgpIHsKKwkJY2FzZSAwOgorCQkJdHJhY2stPmdyb3VwX3NpemUgPSAyNTY7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQlkZWZhdWx0OgorCQkJdHJhY2stPmdyb3VwX3NpemUgPSA1MTI7CisJCQlicmVhazsKKwkJfQorCisJCXN3aXRjaCAoKHRtcCAmIDB4ZjAwMCkgPj4gMTIpIHsKKwkJY2FzZSAwOgorCQkJdHJhY2stPnJvd19zaXplID0gMTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCWRlZmF1bHQ6CisJCQl0cmFjay0+cm93X3NpemUgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXRyYWNrLT5yb3dfc2l6ZSA9IDQ7CisJCQlicmVhazsKKwkJfQorCiAJCXAtPnRyYWNrID0gdHJhY2s7CiAJfQogCWRvIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuX3JlZy5oIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmgKaW5kZXggYzc4MWM5Mi4uN2Q3ZjIxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ldmVyZ3JlZW5fcmVnLmgKQEAgLTQyLDYgKzQyLDE3IEBACiAjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9ERVBUSF84QlBQICAgICAgICAgICAgICAgIDAKICMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9HUlBIX0RFUFRIXzE2QlBQICAgICAgICAgICAgICAgMQogIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfREVQVEhfMzJCUFAgICAgICAgICAgICAgICAyCisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9OVU1fQkFOS1MoeCkgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAyKQorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0FERFJfU1VSRl8yX0JBTksgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fQUREUl9TVVJGXzRfQkFOSyAgICAgICAgICAgICAgIDEKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9BRERSX1NVUkZfOF9CQU5LICAgICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0FERFJfU1VSRl8xNl9CQU5LICAgICAgICAgICAgICAzCisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9aKHgpICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCA0KQorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfQkFOS19XSURUSCh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgNikKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9BRERSX1NVUkZfQkFOS19XSURUSF8xICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0FERFJfU1VSRl9CQU5LX1dJRFRIXzIgICAgICAgICAxCisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fQUREUl9TVVJGX0JBTktfV0lEVEhfNCAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9BRERSX1NVUkZfQkFOS19XSURUSF84ICAgICAgICAgMwogIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfRk9STUFUKHgpICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4NykgPDwgOCkKIC8qIDggQlBQICovCiAjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9GT1JNQVRfSU5ERVhFRCAgICAgICAgICAgIDAKQEAgLTYxLDYgKzcyLDI0IEBACiAjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9GT1JNQVRfOEJfQkdSQTEwMTAxMDIgICAgIDUKICMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9HUlBIX0ZPUk1BVF9SR0IxMTExMTAgICAgICAgICAgNgogIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfRk9STUFUX0JHUjEwMTExMSAgICAgICAgICA3CisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9CQU5LX0hFSUdIVCh4KSAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAxMSkKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9BRERSX1NVUkZfQkFOS19IRUlHSFRfMSAgICAgICAgMAorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0FERFJfU1VSRl9CQU5LX0hFSUdIVF8yICAgICAgICAxCisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fQUREUl9TVVJGX0JBTktfSEVJR0hUXzQgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9BRERSX1NVUkZfQkFOS19IRUlHSFRfOCAgICAgICAgMworIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfVElMRV9TUExJVCh4KSAgICAgICAgICAgICAoKCh4KSAmIDB4NykgPDwgMTMpCisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fQUREUl9TVVJGX1RJTEVfU1BMSVRfNjRCICAgICAgIDAKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9BRERSX1NVUkZfVElMRV9TUExJVF8xMjhCICAgICAgMQorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0FERFJfU1VSRl9USUxFX1NQTElUXzI1NkIgICAgICAyCisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fQUREUl9TVVJGX1RJTEVfU1BMSVRfNTEyQiAgICAgIDMKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9BRERSX1NVUkZfVElMRV9TUExJVF8xS0IgICAgICAgNAorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0FERFJfU1VSRl9USUxFX1NQTElUXzJLQiAgICAgICA1CisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fQUREUl9TVVJGX1RJTEVfU1BMSVRfNEtCICAgICAgIDYKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9HUlBIX01BQ1JPX1RJTEVfQVNQRUNUKHgpICAgICAgKCgoeCkgJiAweDMpIDw8IDE4KQorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0FERFJfU1VSRl9NQUNST19USUxFX0FTUEVDVF8xICAwCisjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fQUREUl9TVVJGX01BQ1JPX1RJTEVfQVNQRUNUXzIgIDEKKyMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9BRERSX1NVUkZfTUFDUk9fVElMRV9BU1BFQ1RfNCAgMgorIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0FERFJfU1VSRl9NQUNST19USUxFX0FTUEVDVF84ICAzCiAjICAgICAgIGRlZmluZSBFVkVSR1JFRU5fR1JQSF9BUlJBWV9NT0RFKHgpICAgICAgICAgICAgICgoKHgpICYgMHg3KSA8PCAyMCkKICMgICAgICAgZGVmaW5lIEVWRVJHUkVFTl9HUlBIX0FSUkFZX0xJTkVBUl9HRU5FUkFMICAgICAgMAogIyAgICAgICBkZWZpbmUgRVZFUkdSRUVOX0dSUEhfQVJSQVlfTElORUFSX0FMSUdORUQgICAgICAxCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL2V2ZXJncmVlbmQuaCBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCmluZGV4IGI5MzdjNDkuLmUwMDAzOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vZXZlcmdyZWVuZC5oCkBAIC04OTksNiArODk5LDEwIEBACiAjZGVmaW5lIERCX0hUSUxFX0RBVEFfQkFTRQkJCQkweDI4MDE0CiAjZGVmaW5lIERCX1pfSU5GTwkJCQkJMHgyODA0MAogIyAgICAgICBkZWZpbmUgWl9BUlJBWV9NT0RFKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKHgpIDw8IDQpCisjICAgICAgIGRlZmluZSBEQl9USUxFX1NQTElUKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHg3KSA8PCA4KQorIyAgICAgICBkZWZpbmUgREJfTlVNX0JBTktTKHgpICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMTIpCisjICAgICAgIGRlZmluZSBEQl9CQU5LX1dJRFRIKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAxNikKKyMgICAgICAgZGVmaW5lIERCX0JBTktfSEVJR0hUKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDIwKQogI2RlZmluZSBEQl9TVEVOQ0lMX0lORk8JCQkJCTB4MjgwNDQKICNkZWZpbmUgREJfWl9SRUFEX0JBU0UJCQkJCTB4MjgwNDgKICNkZWZpbmUgREJfU1RFTkNJTF9SRUFEX0JBU0UJCQkJMHgyODA0YwpAQCAtOTUxLDYgKzk1NSwyOSBAQAogIwlkZWZpbmUgQ0JfU0ZfRVhQT1JUX0ZVTEwJCQkwCiAjCWRlZmluZSBDQl9TRl9FWFBPUlRfTk9STQkJCTEKICNkZWZpbmUJQ0JfQ09MT1IwX0FUVFJJQgkJCQkweDI4Yzc0CisjICAgICAgIGRlZmluZSBDQl9USUxFX1NQTElUKHgpICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHg3KSA8PCA1KQorIyAgICAgICBkZWZpbmUgQUREUl9TVVJGX1RJTEVfU1BMSVRfNjRCICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBBRERSX1NVUkZfVElMRV9TUExJVF8xMjhCICAgICAgICAgICAgICAgIDEKKyMgICAgICAgZGVmaW5lIEFERFJfU1VSRl9USUxFX1NQTElUXzI1NkIgICAgICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgQUREUl9TVVJGX1RJTEVfU1BMSVRfNTEyQiAgICAgICAgICAgICAgICAzCisjICAgICAgIGRlZmluZSBBRERSX1NVUkZfVElMRV9TUExJVF8xS0IgICAgICAgICAgICAgICAgIDQKKyMgICAgICAgZGVmaW5lIEFERFJfU1VSRl9USUxFX1NQTElUXzJLQiAgICAgICAgICAgICAgICAgNQorIyAgICAgICBkZWZpbmUgQUREUl9TVVJGX1RJTEVfU1BMSVRfNEtCICAgICAgICAgICAgICAgICA2CisjICAgICAgIGRlZmluZSBDQl9OVU1fQkFOS1MoeCkgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHgzKSA8PCAxMCkKKyMgICAgICAgZGVmaW5lIEFERFJfU1VSRl8yX0JBTksgICAgICAgICAgICAgICAgICAgICAgICAgMAorIyAgICAgICBkZWZpbmUgQUREUl9TVVJGXzRfQkFOSyAgICAgICAgICAgICAgICAgICAgICAgICAxCisjICAgICAgIGRlZmluZSBBRERSX1NVUkZfOF9CQU5LICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyMgICAgICAgZGVmaW5lIEFERFJfU1VSRl8xNl9CQU5LICAgICAgICAgICAgICAgICAgICAgICAgMworIyAgICAgICBkZWZpbmUgQ0JfQkFOS19XSURUSCh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMTMpCisjICAgICAgIGRlZmluZSBBRERSX1NVUkZfQkFOS19XSURUSF8xICAgICAgICAgICAgICAgICAgIDAKKyMgICAgICAgZGVmaW5lIEFERFJfU1VSRl9CQU5LX1dJRFRIXzIgICAgICAgICAgICAgICAgICAgMQorIyAgICAgICBkZWZpbmUgQUREUl9TVVJGX0JBTktfV0lEVEhfNCAgICAgICAgICAgICAgICAgICAyCisjICAgICAgIGRlZmluZSBBRERSX1NVUkZfQkFOS19XSURUSF84ICAgICAgICAgICAgICAgICAgIDMKKyMgICAgICAgZGVmaW5lIENCX0JBTktfSEVJR0hUKHgpICAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDE2KQorIyAgICAgICBkZWZpbmUgQUREUl9TVVJGX0JBTktfSEVJR0hUXzEgICAgICAgICAgICAgICAgICAwCisjICAgICAgIGRlZmluZSBBRERSX1NVUkZfQkFOS19IRUlHSFRfMiAgICAgICAgICAgICAgICAgIDEKKyMgICAgICAgZGVmaW5lIEFERFJfU1VSRl9CQU5LX0hFSUdIVF80ICAgICAgICAgICAgICAgICAgMgorIyAgICAgICBkZWZpbmUgQUREUl9TVVJGX0JBTktfSEVJR0hUXzggICAgICAgICAgICAgICAgICAzCiAjZGVmaW5lCUNCX0NPTE9SMF9ESU0JCQkJCTB4MjhjNzgKIC8qIG9ubHkgQ0IwLTcgYmxvY2tzIGhhdmUgdGhlc2UgcmVncyAqLwogI2RlZmluZQlDQl9DT0xPUjBfQ01BU0sJCQkJCTB4MjhjN2MKQEAgLTExMzcsNyArMTE2NCwxMSBAQAogIwlkZWZpbmUgU1FfU0VMXzEJCQkJCTUKICNkZWZpbmUgU1FfVEVYX1JFU09VUkNFX1dPUkQ1XzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAxNAogI2RlZmluZSBTUV9URVhfUkVTT1VSQ0VfV09SRDZfMCAgICAgICAgICAgICAgICAgICAgICAgICAweDMwMDE4CisjICAgICAgIGRlZmluZSBURVhfVElMRV9TUExJVCh4KSAgICAgICAgICAgICAgICAgICAgICAgICgoKHgpICYgMHg3KSA8PCAyOSkKICNkZWZpbmUgU1FfVEVYX1JFU09VUkNFX1dPUkQ3XzAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzMDAxYworIyAgICAgICBkZWZpbmUgVEVYX0JBTktfV0lEVEgoeCkgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgOCkKKyMgICAgICAgZGVmaW5lIFRFWF9CQU5LX0hFSUdIVCh4KSAgICAgICAgICAgICAgICAgICAgICAgKCgoeCkgJiAweDMpIDw8IDEwKQorIyAgICAgICBkZWZpbmUgVEVYX05VTV9CQU5LUyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAoKCh4KSAmIDB4MykgPDwgMTYpCiAKICNkZWZpbmUgU1FfVlRYX0NPTlNUQU5UX1dPUkQwXzAJCQkJMHgzMDAwMAogI2RlZmluZSBTUV9WVFhfQ09OU1RBTlRfV09SRDFfMAkJCQkweDMwMDA0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3IxMDAuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCmluZGV4IGFkMTU4ZWEuLmJmYzA4ZjYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcjEwMC5jCkBAIC0xODcsMTMgKzE4NywxOCBAQAogewogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF07CiAJdTMyIHRtcCA9ICgodTMyKWNydGNfYmFzZSkgfCBSQURFT05fQ1JUQ19PRkZTRVRfX09GRlNFVF9MT0NLOworCWludCBpOwogCiAJLyogTG9jayB0aGUgZ3JhcGhpY3MgdXBkYXRlIGxvY2sgKi8KIAkvKiB1cGRhdGUgdGhlIHNjYW5vdXQgYWRkcmVzc2VzICovCiAJV1JFRzMyKFJBREVPTl9DUlRDX09GRlNFVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCwgdG1wKTsKIAogCS8qIFdhaXQgZm9yIHVwZGF0ZV9wZW5kaW5nIHRvIGdvIGhpZ2guICovCi0Jd2hpbGUgKCEoUlJFRzMyKFJBREVPTl9DUlRDX09GRlNFVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBSQURFT05fQ1JUQ19PRkZTRVRfX0dVSV9UUklHX09GRlNFVCkpOworCWZvciAoaSA9IDA7IGkgPCByZGV2LT51c2VjX3RpbWVvdXQ7IGkrKykgeworCQlpZiAoUlJFRzMyKFJBREVPTl9DUlRDX09GRlNFVCArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBSQURFT05fQ1JUQ19PRkZTRVRfX0dVSV9UUklHX09GRlNFVCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQogCURSTV9ERUJVRygiVXBkYXRlIHBlbmRpbmcgbm93IGhpZ2guIFVubG9ja2luZyB2dXBkYXRlX2xvY2suXG4iKTsKIAogCS8qIFVubG9jayB0aGUgbG9jaywgc28gZG91YmxlLWJ1ZmZlcmluZyBjYW4gdGFrZSBwbGFjZSBpbnNpZGUgdmJsYW5rICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hY3BpLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hY3BpLmMKaW5kZXggM2Y2NjM2Yi4uMzUxNmE2MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYWNwaS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2FjcGkuYwpAQCAtMzUsNyArMzUsOCBAQAogCiAJLyogRmFpbCBvbmx5IGlmIGNhbGxpbmcgdGhlIG1ldGhvZCBmYWlscyBhbmQgQVRJRiBpcyBzdXBwb3J0ZWQgKi8KIAlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykgJiYgc3RhdHVzICE9IEFFX05PVF9GT1VORCkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiZmFpbGVkIHRvIGV2YWx1YXRlIEFUSUYgZ290ICVzXG4iLCBhY3BpX2Zvcm1hdF9leGNlcHRpb24oc3RhdHVzKSk7CisJCURSTV9ERUJVR19EUklWRVIoImZhaWxlZCB0byBldmFsdWF0ZSBBVElGIGdvdCAlc1xuIiwKKwkJCQkgYWNwaV9mb3JtYXRfZXhjZXB0aW9uKHN0YXR1cykpOwogCQlrZnJlZShidWZmZXIucG9pbnRlcik7CiAJCXJldHVybiAxOwogCX0KQEAgLTUwLDEzICs1MSwxMyBAQAogCWFjcGlfaGFuZGxlIGhhbmRsZTsKIAlpbnQgcmV0OwogCi0JLyogTm8gbmVlZCB0byBwcm9jZWVkIGlmIHdlJ3JlIHN1cmUgdGhhdCBBVElGIGlzIG5vdCBzdXBwb3J0ZWQgKi8KLQlpZiAoIUFTSUNfSVNfQVZJVk8ocmRldikgfHwgIXJkZXYtPmJpb3MpCi0JCXJldHVybiAwOwotCiAJLyogR2V0IHRoZSBkZXZpY2UgaGFuZGxlICovCiAJaGFuZGxlID0gREVWSUNFX0FDUElfSEFORExFKCZyZGV2LT5wZGV2LT5kZXYpOwogCisJLyogTm8gbmVlZCB0byBwcm9jZWVkIGlmIHdlJ3JlIHN1cmUgdGhhdCBBVElGIGlzIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoIUFTSUNfSVNfQVZJVk8ocmRldikgfHwgIXJkZXYtPmJpb3MgfHwgIWhhbmRsZSkKKwkJcmV0dXJuIDA7CisKIAkvKiBDYWxsIHRoZSBBVElGIG1ldGhvZCAqLwogCXJldCA9IHJhZGVvbl9hdGlmX2NhbGwoaGFuZGxlKTsKIAlpZiAocmV0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2F0b21iaW9zLmMKaW5kZXggZDI0YmFmMy4uNTA4MmQxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fYXRvbWJpb3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9hdG9tYmlvcy5jCkBAIC0yNTYwLDcgKzI1NjAsMTEgQEAKIAogCXJkZXYtPnBtLmN1cnJlbnRfcG93ZXJfc3RhdGVfaW5kZXggPSByZGV2LT5wbS5kZWZhdWx0X3Bvd2VyX3N0YXRlX2luZGV4OwogCXJkZXYtPnBtLmN1cnJlbnRfY2xvY2tfbW9kZV9pbmRleCA9IDA7Ci0JcmRldi0+cG0uY3VycmVudF92ZGRjID0gcmRldi0+cG0ucG93ZXJfc3RhdGVbcmRldi0+cG0uZGVmYXVsdF9wb3dlcl9zdGF0ZV9pbmRleF0uY2xvY2tfaW5mb1swXS52b2x0YWdlLnZvbHRhZ2U7CisJaWYgKHJkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXggPj0gMCkKKwkJcmRldi0+cG0uY3VycmVudF92ZGRjID0KKwkJCXJkZXYtPnBtLnBvd2VyX3N0YXRlW3JkZXYtPnBtLmRlZmF1bHRfcG93ZXJfc3RhdGVfaW5kZXhdLmNsb2NrX2luZm9bMF0udm9sdGFnZS52b2x0YWdlOworCWVsc2UKKwkJcmRldi0+cG0uY3VycmVudF92ZGRjID0gMDsKIH0KIAogdm9pZCByYWRlb25fYXRvbV9zZXRfY2xvY2tfZ2F0aW5nKHN0cnVjdCByYWRlb25fZGV2aWNlICpyZGV2LCBpbnQgZW5hYmxlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcmFkZW9uX2VuY29kZXJzLmMKaW5kZXggMDZlNDEzZS4uNGIyN2VmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yYWRlb25fZW5jb2RlcnMuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JhZGVvbl9lbmNvZGVycy5jCkBAIC0yMzMsMTMgKzIzMywxMiBAQAogCQlzd2l0Y2ggKHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkKSB7CiAJCWNhc2UgRU5DT0RFUl9PQkpFQ1RfSURfVFJBVklTOgogCQljYXNlIEVOQ09ERVJfT0JKRUNUX0lEX05VVE1FRzoKLQkJCXJldHVybiB0cnVlOworCQkJcmV0dXJuIHJhZGVvbl9lbmNvZGVyLT5lbmNvZGVyX2lkOwogCQlkZWZhdWx0OgotCQkJcmV0dXJuIGZhbHNlOworCQkJcmV0dXJuIEVOQ09ERVJfT0JKRUNUX0lEX05PTkU7CiAJCX0KIAl9Ci0KLQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIEVOQ09ERVJfT0JKRUNUX0lEX05PTkU7CiB9CiAKIHZvaWQgcmFkZW9uX3BhbmVsX21vZGVfZml4dXAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jIGIvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9yczYwMC5jCmluZGV4IDQ4MWI5OWUuLmIxMDUzZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnM2MDAuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3JzNjAwLmMKQEAgLTYyLDYgKzYyLDcgQEAKIHsKIAlzdHJ1Y3QgcmFkZW9uX2NydGMgKnJhZGVvbl9jcnRjID0gcmRldi0+bW9kZV9pbmZvLmNydGNzW2NydGNfaWRdOwogCXUzMiB0bXAgPSBSUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCk7CisJaW50IGk7CiAKIAkvKiBMb2NrIHRoZSBncmFwaGljcyB1cGRhdGUgbG9jayAqLwogCXRtcCB8PSBBVklWT19EMUdSUEhfVVBEQVRFX0xPQ0s7CkBAIC03NCw3ICs3NSwxMSBAQAogCSAgICAgICAodTMyKWNydGNfYmFzZSk7CiAKIAkvKiBXYWl0IGZvciB1cGRhdGVfcGVuZGluZyB0byBnbyBoaWdoLiAqLwotCXdoaWxlICghKFJSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmIEFWSVZPX0QxR1JQSF9TVVJGQUNFX1VQREFURV9QRU5ESU5HKSk7CisJZm9yIChpID0gMDsgaSA8IHJkZXYtPnVzZWNfdGltZW91dDsgaSsrKSB7CisJCWlmIChSUkVHMzIoQVZJVk9fRDFHUlBIX1VQREFURSArIHJhZGVvbl9jcnRjLT5jcnRjX29mZnNldCkgJiBBVklWT19EMUdSUEhfU1VSRkFDRV9VUERBVEVfUEVORElORykKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQogCURSTV9ERUJVRygiVXBkYXRlIHBlbmRpbmcgbm93IGhpZ2guIFVubG9ja2luZyB2dXBkYXRlX2xvY2suXG4iKTsKIAogCS8qIFVubG9jayB0aGUgbG9jaywgc28gZG91YmxlLWJ1ZmZlcmluZyBjYW4gdGFrZSBwbGFjZSBpbnNpZGUgdmJsYW5rICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMgYi9kcml2ZXJzL2dwdS9kcm0vcmFkZW9uL3J2NzcwLmMKaW5kZXggYTk4M2Y0MS4uMjNhZTFjNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3JhZGVvbi9ydjc3MC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9yYWRlb24vcnY3NzAuYwpAQCAtNDcsNiArNDcsNyBAQAogewogCXN0cnVjdCByYWRlb25fY3J0YyAqcmFkZW9uX2NydGMgPSByZGV2LT5tb2RlX2luZm8uY3J0Y3NbY3J0Y19pZF07CiAJdTMyIHRtcCA9IFJSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KTsKKwlpbnQgaTsKIAogCS8qIExvY2sgdGhlIGdyYXBoaWNzIHVwZGF0ZSBsb2NrICovCiAJdG1wIHw9IEFWSVZPX0QxR1JQSF9VUERBVEVfTE9DSzsKQEAgLTY2LDcgKzY3LDExIEBACiAJICAgICAgICh1MzIpY3J0Y19iYXNlKTsKIAogCS8qIFdhaXQgZm9yIHVwZGF0ZV9wZW5kaW5nIHRvIGdvIGhpZ2guICovCi0Jd2hpbGUgKCEoUlJFRzMyKEFWSVZPX0QxR1JQSF9VUERBVEUgKyByYWRlb25fY3J0Yy0+Y3J0Y19vZmZzZXQpICYgQVZJVk9fRDFHUlBIX1NVUkZBQ0VfVVBEQVRFX1BFTkRJTkcpKTsKKwlmb3IgKGkgPSAwOyBpIDwgcmRldi0+dXNlY190aW1lb3V0OyBpKyspIHsKKwkJaWYgKFJSRUczMihBVklWT19EMUdSUEhfVVBEQVRFICsgcmFkZW9uX2NydGMtPmNydGNfb2Zmc2V0KSAmIEFWSVZPX0QxR1JQSF9TVVJGQUNFX1VQREFURV9QRU5ESU5HKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CiAJRFJNX0RFQlVHKCJVcGRhdGUgcGVuZGluZyBub3cgaGlnaC4gVW5sb2NraW5nIHZ1cGRhdGVfbG9jay5cbiIpOwogCiAJLyogVW5sb2NrIHRoZSBsb2NrLCBzbyBkb3VibGUtYnVmZmVyaW5nIGNhbiB0YWtlIHBsYWNlIGluc2lkZSB2YmxhbmsgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2Rydi5oIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKaW5kZXggOGNjYTkxYS4uZGMyNzk3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZHJ2LmgKQEAgLTM5MCw2ICszOTAsMTEgQEAKIAkJCSAgICAgc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCiAJCQkgICAgIGludCBpZCwKIAkJCSAgICAgc3RydWN0IHZtd19yZXNvdXJjZSAqKnBfcmVzKTsKK2V4dGVybiBpbnQgdm13X3VzZXJfbG9va3VwX2hhbmRsZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCSAgc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCisJCQkJICB1aW50MzJfdCBoYW5kbGUsCisJCQkJICBzdHJ1Y3Qgdm13X3N1cmZhY2UgKipvdXRfc3VyZiwKKwkJCQkgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqKm91dF9idWYpOwogZXh0ZXJuIHZvaWQgdm13X3N1cmZhY2VfcmVzX2ZyZWUoc3RydWN0IHZtd19yZXNvdXJjZSAqcmVzKTsKIGV4dGVybiBpbnQgdm13X3N1cmZhY2VfaW5pdChzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAogCQkJICAgIHN0cnVjdCB2bXdfc3VyZmFjZSAqc3JmLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmlmby5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfZmlmby5jCmluZGV4IDAzYmJjMmEuLmEwYzJmMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ZpZm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9maWZvLmMKQEAgLTMzLDYgKzMzLDcgQEAKIHsKIAlfX2xlMzIgX19pb21lbSAqZmlmb19tZW0gPSBkZXZfcHJpdi0+bW1pb192aXJ0OwogCXVpbnQzMl90IGZpZm9fbWluLCBod3ZlcnNpb247CisJY29uc3Qgc3RydWN0IHZtd19maWZvX3N0YXRlICpmaWZvID0gJmRldl9wcml2LT5maWZvOwogCiAJaWYgKCEoZGV2X3ByaXYtPmNhcGFiaWxpdGllcyAmIFNWR0FfQ0FQX0VYVEVOREVEX0ZJRk8pKQogCQlyZXR1cm4gZmFsc2U7CkBAIC00MSw3ICs0MiwxMiBAQAogCWlmIChmaWZvX21pbiA8PSBTVkdBX0ZJRk9fM0RfSFdWRVJTSU9OICogc2l6ZW9mKHVuc2lnbmVkIGludCkpCiAJCXJldHVybiBmYWxzZTsKIAotCWh3dmVyc2lvbiA9IGlvcmVhZDMyKGZpZm9fbWVtICsgU1ZHQV9GSUZPXzNEX0hXVkVSU0lPTik7CisJaHd2ZXJzaW9uID0gaW9yZWFkMzIoZmlmb19tZW0gKworCQkJICAgICAoKGZpZm8tPmNhcGFiaWxpdGllcyAmCisJCQkgICAgICAgU1ZHQV9GSUZPX0NBUF8zRF9IV1ZFUlNJT05fUkVWSVNFRCkgPworCQkJICAgICAgU1ZHQV9GSUZPXzNEX0hXVkVSU0lPTl9SRVZJU0VEIDoKKwkJCSAgICAgIFNWR0FfRklGT18zRF9IV1ZFUlNJT04pKTsKKwogCWlmIChod3ZlcnNpb24gPT0gMCkKIAkJcmV0dXJuIGZhbHNlOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pb2N0bC5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfaW9jdGwuYwppbmRleCAzZjYzNDM1Li42NjkxN2M2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2lvY3RsLmMKQEAgLTU4LDggKzU4LDE0IEBACiAJY2FzZSBEUk1fVk1XX1BBUkFNX0ZJRk9fSFdfVkVSU0lPTjoKIAl7CiAJCV9fbGUzMiBfX2lvbWVtICpmaWZvX21lbSA9IGRldl9wcml2LT5tbWlvX3ZpcnQ7CisJCWNvbnN0IHN0cnVjdCB2bXdfZmlmb19zdGF0ZSAqZmlmbyA9ICZkZXZfcHJpdi0+ZmlmbzsKIAotCQlwYXJhbS0+dmFsdWUgPSBpb3JlYWQzMihmaWZvX21lbSArIFNWR0FfRklGT18zRF9IV1ZFUlNJT04pOworCQlwYXJhbS0+dmFsdWUgPQorCQkJaW9yZWFkMzIoZmlmb19tZW0gKworCQkJCSAoKGZpZm8tPmNhcGFiaWxpdGllcyAmCisJCQkJICAgU1ZHQV9GSUZPX0NBUF8zRF9IV1ZFUlNJT05fUkVWSVNFRCkgPworCQkJCSAgU1ZHQV9GSUZPXzNEX0hXVkVSU0lPTl9SRVZJU0VEIDoKKwkJCQkgIFNWR0FfRklGT18zRF9IV1ZFUlNJT04pKTsKIAkJYnJlYWs7CiAJfQogCWRlZmF1bHQ6CkBAIC0xNDAsNyArMTQ2LDcgQEAKIAkJZ290byBvdXRfY2xpcHM7CiAJfQogCi0JY2xpcHMgPSBremFsbG9jKG51bV9jbGlwcyAqIHNpemVvZigqY2xpcHMpLCBHRlBfS0VSTkVMKTsKKwljbGlwcyA9IGtjYWxsb2MobnVtX2NsaXBzLCBzaXplb2YoKmNsaXBzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNsaXBzID09IE5VTEwpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgY2xpcCByZWN0IGxpc3QuXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTE2NiwxMyArMTcyLDcgQEAKIAkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXRfbm9fZmI7CiAJfQotCiAJdmZiID0gdm13X2ZyYW1lYnVmZmVyX3RvX3ZmYihvYmpfdG9fZmIob2JqKSk7Ci0JaWYgKCF2ZmItPmRtYWJ1ZikgewotCQlEUk1fRVJST1IoIkZyYW1lYnVmZmVyIG5vdCBkbWFidWYgYmFja2VkLlxuIik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0X25vX2ZiOwotCX0KIAogCXJldCA9IHR0bV9yZWFkX2xvY2soJnZtYXN0ZXItPmxvY2ssIHRydWUpOwogCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCkBAIC0yMzIsNyArMjMyLDcgQEAKIAkJZ290byBvdXRfY2xpcHM7CiAJfQogCi0JY2xpcHMgPSBremFsbG9jKG51bV9jbGlwcyAqIHNpemVvZigqY2xpcHMpLCBHRlBfS0VSTkVMKTsKKwljbGlwcyA9IGtjYWxsb2MobnVtX2NsaXBzLCBzaXplb2YoKmNsaXBzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGNsaXBzID09IE5VTEwpIHsKIAkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gYWxsb2NhdGUgY2xpcCByZWN0IGxpc3QuXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ttcy5jIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmMKaW5kZXggODgwZTI4NS4uZjk0YjMzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmMKQEAgLTMxLDYgKzMxLDQ0IEBACiAvKiBNaWdodCBuZWVkIGEgaHJ0aW1lciBoZXJlPyAqLwogI2RlZmluZSBWTVdHRlhfUFJFU0VOVF9SQVRFICgoSFogLyA2MCA+IDApID8gSFogLyA2MCA6IDEpCiAKKworc3RydWN0IHZtd19jbGlwX3JlY3QgeworCWludCB4MSwgeDIsIHkxLCB5MjsKK307CisKKy8qKgorICogQ2xpcCBAbnVtX3JlY3RzIG51bWJlciBvZiBAcmVjdHMgYWdhaW5zdCBAY2xpcCBzdG9yaW5nIHRoZQorICogcmVzdWx0cyBpbiBAb3V0X3JlY3RzIGFuZCB0aGUgbnVtYmVyIG9mIHBhc3NlZCByZWN0cyBpbiBAb3V0X251bS4KKyAqLwordm9pZCB2bXdfY2xpcF9jbGlwcmVjdHMoc3RydWN0IGRybV9jbGlwX3JlY3QgKnJlY3RzLAorCQkJaW50IG51bV9yZWN0cywKKwkJCXN0cnVjdCB2bXdfY2xpcF9yZWN0IGNsaXAsCisJCQlTVkdBU2lnbmVkUmVjdCAqb3V0X3JlY3RzLAorCQkJaW50ICpvdXRfbnVtKQoreworCWludCBpLCBrOworCisJZm9yIChpID0gMCwgayA9IDA7IGkgPCBudW1fcmVjdHM7IGkrKykgeworCQlpbnQgeDEgPSBtYXhfdChpbnQsIGNsaXAueDEsIHJlY3RzW2ldLngxKTsKKwkJaW50IHkxID0gbWF4X3QoaW50LCBjbGlwLnkxLCByZWN0c1tpXS55MSk7CisJCWludCB4MiA9IG1pbl90KGludCwgY2xpcC54MiwgcmVjdHNbaV0ueDIpOworCQlpbnQgeTIgPSBtaW5fdChpbnQsIGNsaXAueTIsIHJlY3RzW2ldLnkyKTsKKworCQlpZiAoeDEgPj0geDIpCisJCQljb250aW51ZTsKKwkJaWYgKHkxID49IHkyKQorCQkJY29udGludWU7CisKKwkJb3V0X3JlY3RzW2tdLmxlZnQgICA9IHgxOworCQlvdXRfcmVjdHNba10udG9wICAgID0geTE7CisJCW91dF9yZWN0c1trXS5yaWdodCAgPSB4MjsKKwkJb3V0X3JlY3RzW2tdLmJvdHRvbSA9IHkyOworCQlrKys7CisJfQorCisJKm91dF9udW0gPSBrOworfQorCiB2b2lkIHZtd19kaXNwbGF5X3VuaXRfY2xlYW51cChzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqZHUpCiB7CiAJaWYgKGR1LT5jdXJzb3Jfc3VyZmFjZSkKQEAgLTgyLDYgKzEyMCw0MyBAQAogCXJldHVybiAwOwogfQogCitpbnQgdm13X2N1cnNvcl91cGRhdGVfZG1hYnVmKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqZG1hYnVmLAorCQkJICAgICB1MzIgd2lkdGgsIHUzMiBoZWlnaHQsCisJCQkgICAgIHUzMiBob3RzcG90WCwgdTMyIGhvdHNwb3RZKQoreworCXN0cnVjdCB0dG1fYm9fa21hcF9vYmogbWFwOworCXVuc2lnbmVkIGxvbmcga21hcF9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBrbWFwX251bTsKKwl2b2lkICp2aXJ0dWFsOworCWJvb2wgZHVtbXk7CisJaW50IHJldDsKKworCWttYXBfb2Zmc2V0ID0gMDsKKwlrbWFwX251bSA9ICh3aWR0aCpoZWlnaHQqNCArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisKKwlyZXQgPSB0dG1fYm9fcmVzZXJ2ZSgmZG1hYnVmLT5iYXNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIDApOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKKwkJRFJNX0VSUk9SKCJyZXNlcnZlIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldCA9IHR0bV9ib19rbWFwKCZkbWFidWYtPmJhc2UsIGttYXBfb2Zmc2V0LCBrbWFwX251bSwgJm1hcCk7CisJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKKwkJZ290byBlcnJfdW5yZXNlcnZlOworCisJdmlydHVhbCA9IHR0bV9rbWFwX29ial92aXJ0dWFsKCZtYXAsICZkdW1teSk7CisJcmV0ID0gdm13X2N1cnNvcl91cGRhdGVfaW1hZ2UoZGV2X3ByaXYsIHZpcnR1YWwsIHdpZHRoLCBoZWlnaHQsCisJCQkJICAgICAgaG90c3BvdFgsIGhvdHNwb3RZKTsKKworCXR0bV9ib19rdW5tYXAoJm1hcCk7CitlcnJfdW5yZXNlcnZlOgorCXR0bV9ib191bnJlc2VydmUoJmRtYWJ1Zi0+YmFzZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKIHZvaWQgdm13X2N1cnNvcl91cGRhdGVfcG9zaXRpb24oc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCQlib29sIHNob3csIGludCB4LCBpbnQgeSkKIHsKQEAgLTExMCwyNCArMTg1LDIxIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKGhhbmRsZSkgewotCQlyZXQgPSB2bXdfdXNlcl9zdXJmYWNlX2xvb2t1cF9oYW5kbGUoZGV2X3ByaXYsIHRmaWxlLAotCQkJCQkJICAgICBoYW5kbGUsICZzdXJmYWNlKTsKLQkJaWYgKCFyZXQpIHsKLQkJCWlmICghc3VyZmFjZS0+c25vb3Blci5pbWFnZSkgewotCQkJCURSTV9FUlJPUigic3VyZmFjZSBub3Qgc3VpdGFibGUgZm9yIGN1cnNvclxuIik7Ci0JCQkJdm13X3N1cmZhY2VfdW5yZWZlcmVuY2UoJnN1cmZhY2UpOwotCQkJCXJldHVybiAtRUlOVkFMOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0ID0gdm13X3VzZXJfZG1hYnVmX2xvb2t1cCh0ZmlsZSwKLQkJCQkJCSAgICAgaGFuZGxlLCAmZG1hYnVmKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlEUk1fRVJST1IoImZhaWxlZCB0byBmaW5kIHN1cmZhY2Ugb3IgZG1hYnVmOiAlaVxuIiwgcmV0KTsKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KKwkJcmV0ID0gdm13X3VzZXJfbG9va3VwX2hhbmRsZShkZXZfcHJpdiwgdGZpbGUsCisJCQkJCSAgICAgaGFuZGxlLCAmc3VyZmFjZSwgJmRtYWJ1Zik7CisJCWlmIChyZXQpIHsKKwkJCURSTV9FUlJPUigiZmFpbGVkIHRvIGZpbmQgc3VyZmFjZSBvciBkbWFidWY6ICVpXG4iLCByZXQpOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAl9CiAKKwkvKiBuZWVkIHRvIGRvIHRoaXMgYmVmb3JlIHRha2luZyBkb3duIG9sZCBpbWFnZSAqLworCWlmIChzdXJmYWNlICYmICFzdXJmYWNlLT5zbm9vcGVyLmltYWdlKSB7CisJCURSTV9FUlJPUigic3VyZmFjZSBub3Qgc3VpdGFibGUgZm9yIGN1cnNvclxuIik7CisJCXZtd19zdXJmYWNlX3VucmVmZXJlbmNlKCZzdXJmYWNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJLyogdGFrZWRvd24gb2xkIGN1cnNvciAqLwogCWlmIChkdS0+Y3Vyc29yX3N1cmZhY2UpIHsKIAkJZHUtPmN1cnNvcl9zdXJmYWNlLT5zbm9vcGVyLmNydGMgPSBOVUxMOwpAQCAtMTQ2LDM2ICsyMTgsMTEgQEAKIAkJdm13X2N1cnNvcl91cGRhdGVfaW1hZ2UoZGV2X3ByaXYsIHN1cmZhY2UtPnNub29wZXIuaW1hZ2UsCiAJCQkJCTY0LCA2NCwgZHUtPmhvdHNwb3RfeCwgZHUtPmhvdHNwb3RfeSk7CiAJfSBlbHNlIGlmIChkbWFidWYpIHsKLQkJc3RydWN0IHR0bV9ib19rbWFwX29iaiBtYXA7Ci0JCXVuc2lnbmVkIGxvbmcga21hcF9vZmZzZXQ7Ci0JCXVuc2lnbmVkIGxvbmcga21hcF9udW07Ci0JCXZvaWQgKnZpcnR1YWw7Ci0JCWJvb2wgZHVtbXk7Ci0KIAkJLyogdm13X3VzZXJfc3VyZmFjZV9sb29rdXAgdGFrZXMgb25lIHJlZmVyZW5jZSAqLwogCQlkdS0+Y3Vyc29yX2RtYWJ1ZiA9IGRtYWJ1ZjsKIAotCQlrbWFwX29mZnNldCA9IDA7Ci0JCWttYXBfbnVtID0gKDY0KjY0KjQpID4+IFBBR0VfU0hJRlQ7Ci0KLQkJcmV0ID0gdHRtX2JvX3Jlc2VydmUoJmRtYWJ1Zi0+YmFzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCAwKTsKLQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewotCQkJRFJNX0VSUk9SKCJyZXNlcnZlIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCXJldCA9IHR0bV9ib19rbWFwKCZkbWFidWYtPmJhc2UsIGttYXBfb2Zmc2V0LCBrbWFwX251bSwgJm1hcCk7Ci0JCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCQlnb3RvIGVycl91bnJlc2VydmU7Ci0KLQkJdmlydHVhbCA9IHR0bV9rbWFwX29ial92aXJ0dWFsKCZtYXAsICZkdW1teSk7Ci0JCXZtd19jdXJzb3JfdXBkYXRlX2ltYWdlKGRldl9wcml2LCB2aXJ0dWFsLCA2NCwgNjQsCi0JCQkJCWR1LT5ob3RzcG90X3gsIGR1LT5ob3RzcG90X3kpOwotCi0JCXR0bV9ib19rdW5tYXAoJm1hcCk7Ci1lcnJfdW5yZXNlcnZlOgotCQl0dG1fYm9fdW5yZXNlcnZlKCZkbWFidWYtPmJhc2UpOwotCisJCXJldCA9IHZtd19jdXJzb3JfdXBkYXRlX2RtYWJ1ZihkZXZfcHJpdiwgZG1hYnVmLCB3aWR0aCwgaGVpZ2h0LAorCQkJCQkgICAgICAgZHUtPmhvdHNwb3RfeCwgZHUtPmhvdHNwb3RfeSk7CiAJfSBlbHNlIHsKIAkJdm13X2N1cnNvcl91cGRhdGVfcG9zaXRpb24oZGV2X3ByaXYsIGZhbHNlLCAwLCAwKTsKIAkJcmV0dXJuIDA7CkBAIC0zNzcsOCArNDI0LDkgQEAKIAkJCQlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqY2xpcHMsCiAJCQkJdW5zaWduZWQgbnVtX2NsaXBzLCBpbnQgaW5jKQogewotCXN0cnVjdCBkcm1fY2xpcF9yZWN0ICpjbGlwc19wdHI7CiAJc3RydWN0IHZtd19kaXNwbGF5X3VuaXQgKnVuaXRzW1ZNV0dGWF9OVU1fRElTUExBWV9VTklUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKmNsaXBzX3B0cjsKKwlzdHJ1Y3QgZHJtX2NsaXBfcmVjdCAqdG1wOwogCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKIAlzaXplX3QgZmlmb19zaXplOwogCWludCBpLCBudW1fdW5pdHM7CkBAIC0zOTEsNyArNDM5LDYgQEAKIAl9ICpjbWQ7CiAJU1ZHQVNpZ25lZFJlY3QgKmJsaXRzOwogCi0KIAludW1fdW5pdHMgPSAwOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldl9wcml2LT5kZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwKIAkJCSAgICBoZWFkKSB7CkBAIC00MDIsMTMgKzQ0OSwyNCBAQAogCiAJQlVHX09OKCFjbGlwcyB8fCAhbnVtX2NsaXBzKTsKIAorCXRtcCA9IGt6YWxsb2Moc2l6ZW9mKCp0bXApICogbnVtX2NsaXBzLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkodG1wID09IE5VTEwpKSB7CisJCURSTV9FUlJPUigiVGVtcG9yYXJ5IGNsaXByZWN0IG1lbW9yeSBhbGxvYyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCiAJZmlmb19zaXplID0gc2l6ZW9mKCpjbWQpICsgc2l6ZW9mKFNWR0FTaWduZWRSZWN0KSAqIG51bV9jbGlwczsKIAljbWQgPSBremFsbG9jKGZpZm9fc2l6ZSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHVubGlrZWx5KGNtZCA9PSBOVUxMKSkgewogCQlEUk1fRVJST1IoIlRlbXBvcmFyeSBmaWZvIG1lbW9yeSBhbGxvYyBmYWlsZWQuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfdG1wOwogCX0KIAorCS8qIHNldHVwIGJsaXRzIHBvaW50ZXIgKi8KKwlibGl0cyA9IChTVkdBU2lnbmVkUmVjdCAqKSZjbWRbMV07CisKKwkvKiBpbml0aWFsIGNsaXAgcmVnaW9uICovCiAJbGVmdCA9IGNsaXBzLT54MTsKIAlyaWdodCA9IGNsaXBzLT54MjsKIAl0b3AgPSBjbGlwcy0+eTE7CkBAIC00MzQsNDUgKzQ5Miw2MCBAQAogCWNtZC0+Ym9keS5zcmNSZWN0LmJvdHRvbSA9IGJvdHRvbTsKIAogCWNsaXBzX3B0ciA9IGNsaXBzOwotCWJsaXRzID0gKFNWR0FTaWduZWRSZWN0ICopJmNtZFsxXTsKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NsaXBzOyBpKyssIGNsaXBzX3B0ciArPSBpbmMpIHsKLQkJYmxpdHNbaV0ubGVmdCAgID0gY2xpcHNfcHRyLT54MSAtIGxlZnQ7Ci0JCWJsaXRzW2ldLnJpZ2h0ICA9IGNsaXBzX3B0ci0+eDIgLSBsZWZ0OwotCQlibGl0c1tpXS50b3AgICAgPSBjbGlwc19wdHItPnkxIC0gdG9wOwotCQlibGl0c1tpXS5ib3R0b20gPSBjbGlwc19wdHItPnkyIC0gdG9wOworCQl0bXBbaV0ueDEgPSBjbGlwc19wdHItPngxIC0gbGVmdDsKKwkJdG1wW2ldLngyID0gY2xpcHNfcHRyLT54MiAtIGxlZnQ7CisJCXRtcFtpXS55MSA9IGNsaXBzX3B0ci0+eTEgLSB0b3A7CisJCXRtcFtpXS55MiA9IGNsaXBzX3B0ci0+eTIgLSB0b3A7CiAJfQogCiAJLyogZG8gcGVyIHVuaXQgd3JpdGluZywgcmV1c2UgZmlmbyBmb3IgZWFjaCAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fdW5pdHM7IGkrKykgewogCQlzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqdW5pdCA9IHVuaXRzW2ldOwotCQlpbnQgY2xpcF94MSA9IGxlZnQgLSB1bml0LT5jcnRjLng7Ci0JCWludCBjbGlwX3kxID0gdG9wIC0gdW5pdC0+Y3J0Yy55OwotCQlpbnQgY2xpcF94MiA9IHJpZ2h0IC0gdW5pdC0+Y3J0Yy54OwotCQlpbnQgY2xpcF95MiA9IGJvdHRvbSAtIHVuaXQtPmNydGMueTsKKwkJc3RydWN0IHZtd19jbGlwX3JlY3QgY2xpcDsKKwkJaW50IG51bTsKKworCQljbGlwLngxID0gbGVmdCAtIHVuaXQtPmNydGMueDsKKwkJY2xpcC55MSA9IHRvcCAtIHVuaXQtPmNydGMueTsKKwkJY2xpcC54MiA9IHJpZ2h0IC0gdW5pdC0+Y3J0Yy54OworCQljbGlwLnkyID0gYm90dG9tIC0gdW5pdC0+Y3J0Yy55OwogCiAJCS8qIHNraXAgYW55IGNydGNzIHRoYXQgbWlzc2VzIHRoZSBjbGlwIHJlZ2lvbiAqLwotCQlpZiAoY2xpcF94MSA+PSB1bml0LT5jcnRjLm1vZGUuaGRpc3BsYXkgfHwKLQkJICAgIGNsaXBfeTEgPj0gdW5pdC0+Y3J0Yy5tb2RlLnZkaXNwbGF5IHx8Ci0JCSAgICBjbGlwX3gyIDw9IDAgfHwgY2xpcF95MiA8PSAwKQorCQlpZiAoY2xpcC54MSA+PSB1bml0LT5jcnRjLm1vZGUuaGRpc3BsYXkgfHwKKwkJICAgIGNsaXAueTEgPj0gdW5pdC0+Y3J0Yy5tb2RlLnZkaXNwbGF5IHx8CisJCSAgICBjbGlwLngyIDw9IDAgfHwgY2xpcC55MiA8PSAwKQogCQkJY29udGludWU7CiAKKwkJLyoKKwkJICogSW4gb3JkZXIgZm9yIHRoZSBjbGlwIHJlY3RzIHRvIGJlIGNvcnJlY3RseSBzY2FsZWQKKwkJICogdGhlIHNyYyBhbmQgZGVzdCByZWN0cyBuZWVkcyB0byBiZSB0aGUgc2FtZSBzaXplLgorCQkgKi8KKwkJY21kLT5ib2R5LmRlc3RSZWN0LmxlZnQgPSBjbGlwLngxOworCQljbWQtPmJvZHkuZGVzdFJlY3QucmlnaHQgPSBjbGlwLngyOworCQljbWQtPmJvZHkuZGVzdFJlY3QudG9wID0gY2xpcC55MTsKKwkJY21kLT5ib2R5LmRlc3RSZWN0LmJvdHRvbSA9IGNsaXAueTI7CisKKwkJLyogY3JlYXRlIGEgY2xpcCByZWN0IG9mIHRoZSBjcnRjIGluIGRlc3QgY29vcmRzICovCisJCWNsaXAueDIgPSB1bml0LT5jcnRjLm1vZGUuaGRpc3BsYXkgLSBjbGlwLngxOworCQljbGlwLnkyID0gdW5pdC0+Y3J0Yy5tb2RlLnZkaXNwbGF5IC0gY2xpcC55MTsKKwkJY2xpcC54MSA9IDAgLSBjbGlwLngxOworCQljbGlwLnkxID0gMCAtIGNsaXAueTE7CisKIAkJLyogbmVlZCB0byByZXNldCBzaWQgYXMgaXQgaXMgY2hhbmdlZCBieSBleGVjYnVmICovCiAJCWNtZC0+Ym9keS5zcmNJbWFnZS5zaWQgPSBjcHVfdG9fbGUzMihmcmFtZWJ1ZmZlci0+dXNlcl9oYW5kbGUpOwotCiAJCWNtZC0+Ym9keS5kZXN0U2NyZWVuSWQgPSB1bml0LT51bml0OwogCi0JCS8qCi0JCSAqIFRoZSBibGl0IGNvbW1hbmQgaXMgYSBsb3QgbW9yZSByZXNpbGllbnQgdGhlbiB0aGUKLQkJICogcmVhZGJhY2sgY29tbWFuZCB3aGVuIGl0IGNvbWVzIHRvIGNsaXAgcmVjdHMuIFNvIGl0cwotCQkgKiBva2F5IHRvIGdvIG91dCBvZiBib3VuZHMuCi0JCSAqLworCQkvKiBjbGlwIGFuZCB3cml0ZSBibGl0cyB0byBjbWQgc3RyZWFtICovCisJCXZtd19jbGlwX2NsaXByZWN0cyh0bXAsIG51bV9jbGlwcywgY2xpcCwgYmxpdHMsICZudW0pOwogCi0JCWNtZC0+Ym9keS5kZXN0UmVjdC5sZWZ0ID0gY2xpcF94MTsKLQkJY21kLT5ib2R5LmRlc3RSZWN0LnJpZ2h0ID0gY2xpcF94MjsKLQkJY21kLT5ib2R5LmRlc3RSZWN0LnRvcCA9IGNsaXBfeTE7Ci0JCWNtZC0+Ym9keS5kZXN0UmVjdC5ib3R0b20gPSBjbGlwX3kyOworCQkvKiBpZiBubyBjbGlwcmVjdHMgaGl0IHNraXAgdGhpcyAqLworCQlpZiAobnVtID09IDApCisJCQljb250aW51ZTsKIAogCisJCS8qIHJlY2FsY3VsYXRlIHBhY2thZ2UgbGVuZ3RoICovCisJCWZpZm9fc2l6ZSA9IHNpemVvZigqY21kKSArIHNpemVvZihTVkdBU2lnbmVkUmVjdCkgKiBudW07CisJCWNtZC0+aGVhZGVyLnNpemUgPSBjcHVfdG9fbGUzMihmaWZvX3NpemUgLSBzaXplb2YoY21kLT5oZWFkZXIpKTsKIAkJcmV0ID0gdm13X2V4ZWNidWZfcHJvY2VzcyhmaWxlX3ByaXYsIGRldl9wcml2LCBOVUxMLCBjbWQsCiAJCQkJCSAgZmlmb19zaXplLCAwLCBOVUxMKTsKIApAQCAtNDgwLDcgKzU1MywxMCBAQAogCQkJYnJlYWs7CiAJfQogCisKIAlrZnJlZShjbWQpOworb3V0X2ZyZWVfdG1wOgorCWtmcmVlKHRtcCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNTU2LDYgKzYzMiwxMCBAQAogCSAqIFNhbml0eSBjaGVja3MuCiAJICovCiAKKwkvKiBTdXJmYWNlIG11c3QgYmUgbWFya2VkIGFzIGEgc2Nhbm91dC4gKi8KKwlpZiAodW5saWtlbHkoIXN1cmZhY2UtPnNjYW5vdXQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlmICh1bmxpa2VseShzdXJmYWNlLT5taXBfbGV2ZWxzWzBdICE9IDEgfHwKIAkJICAgICBzdXJmYWNlLT5udW1fc2l6ZXMgIT0gMSB8fAogCQkgICAgIHN1cmZhY2UtPnNpemVzWzBdLndpZHRoIDwgbW9kZV9jbWQtPndpZHRoIHx8CkBAIC03ODIsNiArODYyLDcgQEAKIAkJCWludCBjbGlwX3kxID0gY2xpcHNfcHRyLT55MSAtIHVuaXQtPmNydGMueTsKIAkJCWludCBjbGlwX3gyID0gY2xpcHNfcHRyLT54MiAtIHVuaXQtPmNydGMueDsKIAkJCWludCBjbGlwX3kyID0gY2xpcHNfcHRyLT55MiAtIHVuaXQtPmNydGMueTsKKwkJCWludCBtb3ZlX3gsIG1vdmVfeTsKIAogCQkJLyogc2tpcCBhbnkgY3J0Y3MgdGhhdCBtaXNzZXMgdGhlIGNsaXAgcmVnaW9uICovCiAJCQlpZiAoY2xpcF94MSA+PSB1bml0LT5jcnRjLm1vZGUuaGRpc3BsYXkgfHwKQEAgLTc4OSwxMiArODcwLDIxIEBACiAJCQkgICAgY2xpcF94MiA8PSAwIHx8IGNsaXBfeTIgPD0gMCkKIAkJCQljb250aW51ZTsKIAorCQkJLyogY2xpcCBzaXplIHRvIGNydGMgc2l6ZSAqLworCQkJY2xpcF94MiA9IG1pbl90KGludCwgY2xpcF94MiwgdW5pdC0+Y3J0Yy5tb2RlLmhkaXNwbGF5KTsKKwkJCWNsaXBfeTIgPSBtaW5fdChpbnQsIGNsaXBfeTIsIHVuaXQtPmNydGMubW9kZS52ZGlzcGxheSk7CisKKwkJCS8qIHRyYW5zbGF0ZSBib3RoIHNyYyBhbmQgZGVzdCB0byBicmluZyBjbGlwIGludG8gc2NyZWVuICovCisJCQltb3ZlX3ggPSBtaW5fdChpbnQsIGNsaXBfeDEsIDApOworCQkJbW92ZV95ID0gbWluX3QoaW50LCBjbGlwX3kxLCAwKTsKKworCQkJLyogYWN0dWFsIHRyYW5zbGF0ZSBkb25lIGhlcmUgKi8KIAkJCWJsaXRzW2hpdF9udW1dLmhlYWRlciA9IFNWR0FfQ01EX0JMSVRfR01SRkJfVE9fU0NSRUVOOwogCQkJYmxpdHNbaGl0X251bV0uYm9keS5kZXN0U2NyZWVuSWQgPSB1bml0LT51bml0OwotCQkJYmxpdHNbaGl0X251bV0uYm9keS5zcmNPcmlnaW4ueCA9IGNsaXBzX3B0ci0+eDE7Ci0JCQlibGl0c1toaXRfbnVtXS5ib2R5LnNyY09yaWdpbi55ID0gY2xpcHNfcHRyLT55MTsKLQkJCWJsaXRzW2hpdF9udW1dLmJvZHkuZGVzdFJlY3QubGVmdCA9IGNsaXBfeDE7Ci0JCQlibGl0c1toaXRfbnVtXS5ib2R5LmRlc3RSZWN0LnRvcCA9IGNsaXBfeTE7CisJCQlibGl0c1toaXRfbnVtXS5ib2R5LnNyY09yaWdpbi54ID0gY2xpcHNfcHRyLT54MSAtIG1vdmVfeDsKKwkJCWJsaXRzW2hpdF9udW1dLmJvZHkuc3JjT3JpZ2luLnkgPSBjbGlwc19wdHItPnkxIC0gbW92ZV95OworCQkJYmxpdHNbaGl0X251bV0uYm9keS5kZXN0UmVjdC5sZWZ0ID0gY2xpcF94MSAtIG1vdmVfeDsKKwkJCWJsaXRzW2hpdF9udW1dLmJvZHkuZGVzdFJlY3QudG9wID0gY2xpcF95MSAtIG1vdmVfeTsKIAkJCWJsaXRzW2hpdF9udW1dLmJvZHkuZGVzdFJlY3QucmlnaHQgPSBjbGlwX3gyOwogCQkJYmxpdHNbaGl0X251bV0uYm9keS5kZXN0UmVjdC5ib3R0b20gPSBjbGlwX3kyOwogCQkJaGl0X251bSsrOwpAQCAtMTAwMyw3ICsxMDkzLDYgQEAKIAlzdHJ1Y3Qgdm13X3N1cmZhY2UgKnN1cmZhY2UgPSBOVUxMOwogCXN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqYm8gPSBOVUxMOwogCXN0cnVjdCB0dG1fYmFzZV9vYmplY3QgKnVzZXJfb2JqOwotCXU2NCByZXF1aXJlZF9zaXplOwogCWludCByZXQ7CiAKIAkvKioKQEAgLTEwMTIsOCArMTEwMSw5IEBACiAJICogcmVxdWVzdGVkIGZyYW1lYnVmZmVyLgogCSAqLwogCi0JcmVxdWlyZWRfc2l6ZSA9IG1vZGVfY21kLT5waXRjaCAqIG1vZGVfY21kLT5oZWlnaHQ7Ci0JaWYgKHVubGlrZWx5KHJlcXVpcmVkX3NpemUgPiAodTY0KSBkZXZfcHJpdi0+dnJhbV9zaXplKSkgeworCWlmICghdm13X2ttc192YWxpZGF0ZV9tb2RlX3ZyYW0oZGV2X3ByaXYsCisJCQkJCW1vZGVfY21kLT5waXRjaCwKKwkJCQkJbW9kZV9jbWQtPmhlaWdodCkpIHsKIAkJRFJNX0VSUk9SKCJWUkFNIHNpemUgaXMgdG9vIHNtYWxsIGZvciByZXF1ZXN0ZWQgbW9kZS5cbiIpOwogCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAl9CkBAIC0xMDMzLDQ2ICsxMTIzLDI5IEBACiAJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCX0KIAotCS8qKgotCSAqIEVuZCBjb25kaXRpb25lZCBjb2RlLgotCSAqLwotCi0JcmV0ID0gdm13X3VzZXJfc3VyZmFjZV9sb29rdXBfaGFuZGxlKGRldl9wcml2LCB0ZmlsZSwKLQkJCQkJICAgICBtb2RlX2NtZC0+aGFuZGxlLCAmc3VyZmFjZSk7CisJLyogcmV0dXJucyBlaXRoZXIgYSBkbWFidWYgb3Igc3VyZmFjZSAqLworCXJldCA9IHZtd191c2VyX2xvb2t1cF9oYW5kbGUoZGV2X3ByaXYsIHRmaWxlLAorCQkJCSAgICAgbW9kZV9jbWQtPmhhbmRsZSwKKwkJCQkgICAgICZzdXJmYWNlLCAmYm8pOwogCWlmIChyZXQpCi0JCWdvdG8gdHJ5X2RtYWJ1ZjsKKwkJZ290byBlcnJfb3V0OwogCi0JaWYgKCFzdXJmYWNlLT5zY2Fub3V0KQotCQlnb3RvIGVycl9ub3Rfc2Nhbm91dDsKKwkvKiBDcmVhdGUgdGhlIG5ldyBmcmFtZWJ1ZmZlciBkZXBlbmRpbmcgb25lIHdoYXQgd2UgZ290IGJhY2sgKi8KKwlpZiAoYm8pCisJCXJldCA9IHZtd19rbXNfbmV3X2ZyYW1lYnVmZmVyX2RtYWJ1ZihkZXZfcHJpdiwgYm8sICZ2ZmIsCisJCQkJCQkgICAgIG1vZGVfY21kKTsKKwllbHNlIGlmIChzdXJmYWNlKQorCQlyZXQgPSB2bXdfa21zX25ld19mcmFtZWJ1ZmZlcl9zdXJmYWNlKGRldl9wcml2LCBmaWxlX3ByaXYsCisJCQkJCQkgICAgICBzdXJmYWNlLCAmdmZiLCBtb2RlX2NtZCk7CisJZWxzZQorCQlCVUcoKTsKIAotCXJldCA9IHZtd19rbXNfbmV3X2ZyYW1lYnVmZmVyX3N1cmZhY2UoZGV2X3ByaXYsIGZpbGVfcHJpdiwgc3VyZmFjZSwKLQkJCQkJICAgICAgJnZmYiwgbW9kZV9jbWQpOwotCi0JLyogdm13X3VzZXJfc3VyZmFjZV9sb29rdXAgdGFrZXMgb25lIHJlZiBzbyBkb2VzIG5ld19mYiAqLwotCXZtd19zdXJmYWNlX3VucmVmZXJlbmNlKCZzdXJmYWNlKTsKLQotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIHZtd19mcmFtZWJ1ZmZlcjogJWlcbiIsIHJldCk7Ci0JCXR0bV9iYXNlX29iamVjdF91bnJlZigmdXNlcl9vYmopOwotCQlyZXR1cm4gRVJSX1BUUihyZXQpOwotCX0gZWxzZQotCQl2ZmItPnVzZXJfb2JqID0gdXNlcl9vYmo7Ci0JcmV0dXJuICZ2ZmItPmJhc2U7Ci0KLXRyeV9kbWFidWY6Ci0JRFJNX0lORk8oIiVzOiB0cnlpbmcgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7Ci0KLQlyZXQgPSB2bXdfdXNlcl9kbWFidWZfbG9va3VwKHRmaWxlLCBtb2RlX2NtZC0+aGFuZGxlLCAmYm8pOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZmluZCBidWZmZXI6ICVpXG4iLCByZXQpOwotCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKLQl9Ci0KLQlyZXQgPSB2bXdfa21zX25ld19mcmFtZWJ1ZmZlcl9kbWFidWYoZGV2X3ByaXYsIGJvLCAmdmZiLAotCQkJCQkgICAgIG1vZGVfY21kKTsKLQotCS8qIHZtd191c2VyX2RtYWJ1Zl9sb29rdXAgdGFrZXMgb25lIHJlZiBzbyBkb2VzIG5ld19mYiAqLwotCXZtd19kbWFidWZfdW5yZWZlcmVuY2UoJmJvKTsKK2Vycl9vdXQ6CisJLyogdm13X3VzZXJfbG9va3VwX2hhbmRsZSB0YWtlcyBvbmUgcmVmIHNvIGRvZXMgbmV3X2ZiICovCisJaWYgKGJvKQorCQl2bXdfZG1hYnVmX3VucmVmZXJlbmNlKCZibyk7CisJaWYgKHN1cmZhY2UpCisJCXZtd19zdXJmYWNlX3VucmVmZXJlbmNlKCZzdXJmYWNlKTsKIAogCWlmIChyZXQpIHsKIAkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gY3JlYXRlIHZtd19mcmFtZWJ1ZmZlcjogJWlcbiIsIHJldCk7CkBAIC0xMDgyLDE0ICsxMTU1LDYgQEAKIAkJdmZiLT51c2VyX29iaiA9IHVzZXJfb2JqOwogCiAJcmV0dXJuICZ2ZmItPmJhc2U7Ci0KLWVycl9ub3Rfc2Nhbm91dDoKLQlEUk1fRVJST1IoInN1cmZhY2Ugbm90IG1hcmtlZCBhcyBzY2Fub3V0XG4iKTsKLQkvKiB2bXdfdXNlcl9zdXJmYWNlX2xvb2t1cCB0YWtlcyBvbmUgcmVmICovCi0Jdm13X3N1cmZhY2VfdW5yZWZlcmVuY2UoJnN1cmZhY2UpOwotCXR0bV9iYXNlX29iamVjdF91bnJlZigmdXNlcl9vYmopOwotCi0JcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZHJtX21vZGVfY29uZmlnX2Z1bmNzIHZtd19rbXNfZnVuY3MgPSB7CkBAIC0xMTA2LDEwICsxMTcxLDEyIEBACiAJCSAgICB1aW50MzJfdCBudW1fY2xpcHMpCiB7CiAJc3RydWN0IHZtd19kaXNwbGF5X3VuaXQgKnVuaXRzW1ZNV0dGWF9OVU1fRElTUExBWV9VTklUU107CisJc3RydWN0IGRybV9jbGlwX3JlY3QgKnRtcDsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CiAJc2l6ZV90IGZpZm9fc2l6ZTsKIAlpbnQgaSwgaywgbnVtX3VuaXRzOwogCWludCByZXQgPSAwOyAvKiBzaWxlbmNlIHdhcm5pbmcgKi8KKwlpbnQgbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tOwogCiAJc3RydWN0IHsKIAkJU1ZHQTNkQ21kSGVhZGVyIGhlYWRlcjsKQEAgLTExMjcsNjAgKzExOTQsOTUgQEAKIAlCVUdfT04oc3VyZmFjZSA9PSBOVUxMKTsKIAlCVUdfT04oIWNsaXBzIHx8ICFudW1fY2xpcHMpOwogCisJdG1wID0ga3phbGxvYyhzaXplb2YoKnRtcCkgKiBudW1fY2xpcHMsIEdGUF9LRVJORUwpOworCWlmICh1bmxpa2VseSh0bXAgPT0gTlVMTCkpIHsKKwkJRFJNX0VSUk9SKCJUZW1wb3JhcnkgY2xpcHJlY3QgbWVtb3J5IGFsbG9jIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlmaWZvX3NpemUgPSBzaXplb2YoKmNtZCkgKyBzaXplb2YoU1ZHQVNpZ25lZFJlY3QpICogbnVtX2NsaXBzOwogCWNtZCA9IGttYWxsb2MoZmlmb19zaXplLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkoY21kID09IE5VTEwpKSB7CiAJCURSTV9FUlJPUigiRmFpbGVkIHRvIGFsbG9jYXRlIHRlbXBvcmFyeSBmaWZvIG1lbW9yeS5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV90bXA7CisJfQorCisJbGVmdCA9IGNsaXBzLT54OworCXJpZ2h0ID0gY2xpcHMtPnggKyBjbGlwcy0+dzsKKwl0b3AgPSBjbGlwcy0+eTsKKwlib3R0b20gPSBjbGlwcy0+eSArIGNsaXBzLT5oOworCisJZm9yIChpID0gMTsgaSA8IG51bV9jbGlwczsgaSsrKSB7CisJCWxlZnQgPSBtaW5fdChpbnQsIGxlZnQsIChpbnQpY2xpcHNbaV0ueCk7CisJCXJpZ2h0ID0gbWF4X3QoaW50LCByaWdodCwgKGludCljbGlwc1tpXS54ICsgY2xpcHNbaV0udyk7CisJCXRvcCA9IG1pbl90KGludCwgdG9wLCAoaW50KWNsaXBzW2ldLnkpOworCQlib3R0b20gPSBtYXhfdChpbnQsIGJvdHRvbSwgKGludCljbGlwc1tpXS55ICsgY2xpcHNbaV0uaCk7CiAJfQogCiAJLyogb25seSBuZWVkIHRvIGRvIHRoaXMgb25jZSAqLwogCW1lbXNldChjbWQsIDAsIGZpZm9fc2l6ZSk7CiAJY21kLT5oZWFkZXIuaWQgPSBjcHVfdG9fbGUzMihTVkdBXzNEX0NNRF9CTElUX1NVUkZBQ0VfVE9fU0NSRUVOKTsKLQljbWQtPmhlYWRlci5zaXplID0gY3B1X3RvX2xlMzIoZmlmb19zaXplIC0gc2l6ZW9mKGNtZC0+aGVhZGVyKSk7Ci0KLQljbWQtPmJvZHkuc3JjUmVjdC5sZWZ0ID0gMDsKLQljbWQtPmJvZHkuc3JjUmVjdC5yaWdodCA9IHN1cmZhY2UtPnNpemVzWzBdLndpZHRoOwotCWNtZC0+Ym9keS5zcmNSZWN0LnRvcCA9IDA7Ci0JY21kLT5ib2R5LnNyY1JlY3QuYm90dG9tID0gc3VyZmFjZS0+c2l6ZXNbMF0uaGVpZ2h0OwogCiAJYmxpdHMgPSAoU1ZHQVNpZ25lZFJlY3QgKikmY21kWzFdOworCisJY21kLT5ib2R5LnNyY1JlY3QubGVmdCA9IGxlZnQ7CisJY21kLT5ib2R5LnNyY1JlY3QucmlnaHQgPSByaWdodDsKKwljbWQtPmJvZHkuc3JjUmVjdC50b3AgPSB0b3A7CisJY21kLT5ib2R5LnNyY1JlY3QuYm90dG9tID0gYm90dG9tOworCiAJZm9yIChpID0gMDsgaSA8IG51bV9jbGlwczsgaSsrKSB7Ci0JCWJsaXRzW2ldLmxlZnQgICA9IGNsaXBzW2ldLng7Ci0JCWJsaXRzW2ldLnJpZ2h0ICA9IGNsaXBzW2ldLnggKyBjbGlwc1tpXS53OwotCQlibGl0c1tpXS50b3AgICAgPSBjbGlwc1tpXS55OwotCQlibGl0c1tpXS5ib3R0b20gPSBjbGlwc1tpXS55ICsgY2xpcHNbaV0uaDsKKwkJdG1wW2ldLngxID0gY2xpcHNbaV0ueCAtIGxlZnQ7CisJCXRtcFtpXS54MiA9IGNsaXBzW2ldLnggKyBjbGlwc1tpXS53IC0gbGVmdDsKKwkJdG1wW2ldLnkxID0gY2xpcHNbaV0ueSAtIHRvcDsKKwkJdG1wW2ldLnkyID0gY2xpcHNbaV0ueSArIGNsaXBzW2ldLmggLSB0b3A7CiAJfQogCiAJZm9yIChrID0gMDsgayA8IG51bV91bml0czsgaysrKSB7CiAJCXN0cnVjdCB2bXdfZGlzcGxheV91bml0ICp1bml0ID0gdW5pdHNba107Ci0JCWludCBjbGlwX3gxID0gZGVzdFggLSB1bml0LT5jcnRjLng7Ci0JCWludCBjbGlwX3kxID0gZGVzdFkgLSB1bml0LT5jcnRjLnk7Ci0JCWludCBjbGlwX3gyID0gY2xpcF94MSArIHN1cmZhY2UtPnNpemVzWzBdLndpZHRoOwotCQlpbnQgY2xpcF95MiA9IGNsaXBfeTEgKyBzdXJmYWNlLT5zaXplc1swXS5oZWlnaHQ7CisJCXN0cnVjdCB2bXdfY2xpcF9yZWN0IGNsaXA7CisJCWludCBudW07CisKKwkJY2xpcC54MSA9IGxlZnQgKyBkZXN0WCAtIHVuaXQtPmNydGMueDsKKwkJY2xpcC55MSA9IHRvcCArIGRlc3RZIC0gdW5pdC0+Y3J0Yy55OworCQljbGlwLngyID0gcmlnaHQgKyBkZXN0WCAtIHVuaXQtPmNydGMueDsKKwkJY2xpcC55MiA9IGJvdHRvbSArIGRlc3RZIC0gdW5pdC0+Y3J0Yy55OwogCiAJCS8qIHNraXAgYW55IGNydGNzIHRoYXQgbWlzc2VzIHRoZSBjbGlwIHJlZ2lvbiAqLwotCQlpZiAoY2xpcF94MSA+PSB1bml0LT5jcnRjLm1vZGUuaGRpc3BsYXkgfHwKLQkJICAgIGNsaXBfeTEgPj0gdW5pdC0+Y3J0Yy5tb2RlLnZkaXNwbGF5IHx8Ci0JCSAgICBjbGlwX3gyIDw9IDAgfHwgY2xpcF95MiA8PSAwKQorCQlpZiAoY2xpcC54MSA+PSB1bml0LT5jcnRjLm1vZGUuaGRpc3BsYXkgfHwKKwkJICAgIGNsaXAueTEgPj0gdW5pdC0+Y3J0Yy5tb2RlLnZkaXNwbGF5IHx8CisJCSAgICBjbGlwLngyIDw9IDAgfHwgY2xpcC55MiA8PSAwKQogCQkJY29udGludWU7CiAKKwkJLyoKKwkJICogSW4gb3JkZXIgZm9yIHRoZSBjbGlwIHJlY3RzIHRvIGJlIGNvcnJlY3RseSBzY2FsZWQKKwkJICogdGhlIHNyYyBhbmQgZGVzdCByZWN0cyBuZWVkcyB0byBiZSB0aGUgc2FtZSBzaXplLgorCQkgKi8KKwkJY21kLT5ib2R5LmRlc3RSZWN0LmxlZnQgPSBjbGlwLngxOworCQljbWQtPmJvZHkuZGVzdFJlY3QucmlnaHQgPSBjbGlwLngyOworCQljbWQtPmJvZHkuZGVzdFJlY3QudG9wID0gY2xpcC55MTsKKwkJY21kLT5ib2R5LmRlc3RSZWN0LmJvdHRvbSA9IGNsaXAueTI7CisKKwkJLyogY3JlYXRlIGEgY2xpcCByZWN0IG9mIHRoZSBjcnRjIGluIGRlc3QgY29vcmRzICovCisJCWNsaXAueDIgPSB1bml0LT5jcnRjLm1vZGUuaGRpc3BsYXkgLSBjbGlwLngxOworCQljbGlwLnkyID0gdW5pdC0+Y3J0Yy5tb2RlLnZkaXNwbGF5IC0gY2xpcC55MTsKKwkJY2xpcC54MSA9IDAgLSBjbGlwLngxOworCQljbGlwLnkxID0gMCAtIGNsaXAueTE7CisKIAkJLyogbmVlZCB0byByZXNldCBzaWQgYXMgaXQgaXMgY2hhbmdlZCBieSBleGVjYnVmICovCiAJCWNtZC0+Ym9keS5zcmNJbWFnZS5zaWQgPSBzaWQ7Ci0KIAkJY21kLT5ib2R5LmRlc3RTY3JlZW5JZCA9IHVuaXQtPnVuaXQ7CiAKLQkJLyoKLQkJICogVGhlIGJsaXQgY29tbWFuZCBpcyBhIGxvdCBtb3JlIHJlc2lsaWVudCB0aGVuIHRoZQotCQkgKiByZWFkYmFjayBjb21tYW5kIHdoZW4gaXQgY29tZXMgdG8gY2xpcCByZWN0cy4gU28gaXRzCi0JCSAqIG9rYXkgdG8gZ28gb3V0IG9mIGJvdW5kcy4KLQkJICovCisJCS8qIGNsaXAgYW5kIHdyaXRlIGJsaXRzIHRvIGNtZCBzdHJlYW0gKi8KKwkJdm13X2NsaXBfY2xpcHJlY3RzKHRtcCwgbnVtX2NsaXBzLCBjbGlwLCBibGl0cywgJm51bSk7CiAKLQkJY21kLT5ib2R5LmRlc3RSZWN0LmxlZnQgPSBjbGlwX3gxOwotCQljbWQtPmJvZHkuZGVzdFJlY3QucmlnaHQgPSBjbGlwX3gyOwotCQljbWQtPmJvZHkuZGVzdFJlY3QudG9wID0gY2xpcF95MTsKLQkJY21kLT5ib2R5LmRlc3RSZWN0LmJvdHRvbSA9IGNsaXBfeTI7CisJCS8qIGlmIG5vIGNsaXByZWN0cyBoaXQgc2tpcCB0aGlzICovCisJCWlmIChudW0gPT0gMCkKKwkJCWNvbnRpbnVlOwogCisJCS8qIHJlY2FsY3VsYXRlIHBhY2thZ2UgbGVuZ3RoICovCisJCWZpZm9fc2l6ZSA9IHNpemVvZigqY21kKSArIHNpemVvZihTVkdBU2lnbmVkUmVjdCkgKiBudW07CisJCWNtZC0+aGVhZGVyLnNpemUgPSBjcHVfdG9fbGUzMihmaWZvX3NpemUgLSBzaXplb2YoY21kLT5oZWFkZXIpKTsKIAkJcmV0ID0gdm13X2V4ZWNidWZfcHJvY2VzcyhmaWxlX3ByaXYsIGRldl9wcml2LCBOVUxMLCBjbWQsCiAJCQkJCSAgZmlmb19zaXplLCAwLCBOVUxMKTsKIApAQCAtMTE4OSw2ICsxMjkxLDggQEAKIAl9CiAKIAlrZnJlZShjbWQpOworb3V0X2ZyZWVfdG1wOgorCWtmcmVlKHRtcCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTgwOSw3ICsxOTEzLDggQEAKIAl9CiAKIAlyZWN0c19zaXplID0gYXJnLT5udW1fb3V0cHV0cyAqIHNpemVvZihzdHJ1Y3QgZHJtX3Ztd19yZWN0KTsKLQlyZWN0cyA9IGt6YWxsb2MocmVjdHNfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJcmVjdHMgPSBrY2FsbG9jKGFyZy0+bnVtX291dHB1dHMsIHNpemVvZihzdHJ1Y3QgZHJtX3Ztd19yZWN0KSwKKwkJCUdGUF9LRVJORUwpOwogCWlmICh1bmxpa2VseSghcmVjdHMpKSB7CiAJCXJldCA9IC1FTk9NRU07CiAJCWdvdG8gb3V0X3VubG9jazsKQEAgLTE4MjQsMTAgKzE5MjksMTAgQEAKIAl9CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXJnLT5udW1fb3V0cHV0czsgKytpKSB7Ci0JCWlmIChyZWN0cy0+eCA8IDAgfHwKLQkJICAgIHJlY3RzLT55IDwgMCB8fAotCQkgICAgcmVjdHMtPnggKyByZWN0cy0+dyA+IG1vZGVfY29uZmlnLT5tYXhfd2lkdGggfHwKLQkJICAgIHJlY3RzLT55ICsgcmVjdHMtPmggPiBtb2RlX2NvbmZpZy0+bWF4X2hlaWdodCkgeworCQlpZiAocmVjdHNbaV0ueCA8IDAgfHwKKwkJICAgIHJlY3RzW2ldLnkgPCAwIHx8CisJCSAgICByZWN0c1tpXS54ICsgcmVjdHNbaV0udyA+IG1vZGVfY29uZmlnLT5tYXhfd2lkdGggfHwKKwkJICAgIHJlY3RzW2ldLnkgKyByZWN0c1tpXS5oID4gbW9kZV9jb25maWctPm1heF9oZWlnaHQpIHsKIAkJCURSTV9FUlJPUigiSW52YWxpZCBHVUkgbGF5b3V0LlxuIik7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBvdXRfZnJlZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X2ttcy5oIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmgKaW5kZXggYWY4ZTZlNS4uZTFjYjg1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfa21zLmgKQEAgLTYyLDkgKzYyLDE0IEBACiBpbnQgdm13X2N1cnNvcl91cGRhdGVfaW1hZ2Uoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCSAgICB1MzIgKmltYWdlLCB1MzIgd2lkdGgsIHUzMiBoZWlnaHQsCiAJCQkgICAgdTMyIGhvdHNwb3RYLCB1MzIgaG90c3BvdFkpOworaW50IHZtd19jdXJzb3JfdXBkYXRlX2RtYWJ1ZihzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgICBzdHJ1Y3Qgdm13X2RtYV9idWZmZXIgKmRtYWJ1ZiwKKwkJCSAgICAgdTMyIHdpZHRoLCB1MzIgaGVpZ2h0LAorCQkJICAgICB1MzIgaG90c3BvdFgsIHUzMiBob3RzcG90WSk7CiB2b2lkIHZtd19jdXJzb3JfdXBkYXRlX3Bvc2l0aW9uKHN0cnVjdCB2bXdfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCQkJYm9vbCBzaG93LCBpbnQgeCwgaW50IHkpOwogCisKIC8qKgogICogQmFzZSBjbGFzcyBkaXNwbGF5IHVuaXQuCiAgKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfbGR1LmMgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9sZHUuYwppbmRleCA5MGM1ZTM5Li44ZjhkYmQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9sZHUuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9sZHUuYwpAQCAtNzQsOSArNzQsMTAgQEAKIHsKIAlzdHJ1Y3Qgdm13X2xlZ2FjeV9kaXNwbGF5ICpsZHMgPSBkZXZfcHJpdi0+bGR1X3ByaXY7CiAJc3RydWN0IHZtd19sZWdhY3lfZGlzcGxheV91bml0ICplbnRyeTsKKwlzdHJ1Y3Qgdm13X2Rpc3BsYXlfdW5pdCAqZHUgPSBOVUxMOwogCXN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiID0gTlVMTDsKIAlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBOVUxMOwotCWludCBpID0gMDsKKwlpbnQgaSA9IDAsIHJldDsKIAogCS8qIElmIHRoZXJlIGlzIG5vIGRpc3BsYXkgdG9wb2xvZ3kgdGhlIGhvc3QganVzdCBhc3N1bWVzCiAJICogdGhhdCB0aGUgZ3Vlc3Qgd2lsbCBzZXQgdGhlIHNhbWUgbGF5b3V0IGFzIHRoZSBob3N0LgpAQCAtMTI5LDYgKzEzMCwyNSBAQAogCiAJbGRzLT5sYXN0X251bV9hY3RpdmUgPSBsZHMtPm51bV9hY3RpdmU7CiAKKworCS8qIEZpbmQgdGhlIGZpcnN0IGR1IHdpdGggYSBjdXJzb3IuICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmxkcy0+YWN0aXZlLCBhY3RpdmUpIHsKKwkJZHUgPSAmZW50cnktPmJhc2U7CisKKwkJaWYgKCFkdS0+Y3Vyc29yX2RtYWJ1ZikKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IHZtd19jdXJzb3JfdXBkYXRlX2RtYWJ1ZihkZXZfcHJpdiwKKwkJCQkJICAgICAgIGR1LT5jdXJzb3JfZG1hYnVmLAorCQkJCQkgICAgICAgNjQsIDY0LAorCQkJCQkgICAgICAgZHUtPmhvdHNwb3RfeCwKKwkJCQkJICAgICAgIGR1LT5ob3RzcG90X3kpOworCQlpZiAocmV0ID09IDApCisJCQlicmVhazsKKworCQlEUk1fRVJST1IoIkNvdWxkIG5vdCB1cGRhdGUgY3Vyc29yIGltYWdlXG4iKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfcmVzb3VyY2UuYyBiL2RyaXZlcnMvZ3B1L2RybS92bXdnZngvdm13Z2Z4X3Jlc291cmNlLmMKaW5kZXggODZjNWU0Yy4uMWM3ZjA5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3Ztd2dmeC92bXdnZnhfcmVzb3VyY2UuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdm13Z2Z4L3Ztd2dmeF9yZXNvdXJjZS5jCkBAIC0xMTkwLDYgKzExOTAsMjkgQEAKIAkJd3JpdGVfdW5sb2NrKGxvY2spOwogfQogCisvKioKKyAqIEhlbHBlciBmdW5jdGlvbiB0aGF0IGxvb2tzIGVpdGhlciBhIHN1cmZhY2Ugb3IgZG1hYnVmLgorICoKKyAqIFRoZSBwb2ludGVyIHRoaXMgcG9pbnRlZCBhdCBieSBvdXRfc3VyZiBhbmQgb3V0X2J1ZiBuZWVkcyB0byBiZSBudWxsLgorICovCitpbnQgdm13X3VzZXJfbG9va3VwX2hhbmRsZShzdHJ1Y3Qgdm13X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgc3RydWN0IHR0bV9vYmplY3RfZmlsZSAqdGZpbGUsCisJCQkgICB1aW50MzJfdCBoYW5kbGUsCisJCQkgICBzdHJ1Y3Qgdm13X3N1cmZhY2UgKipvdXRfc3VyZiwKKwkJCSAgIHN0cnVjdCB2bXdfZG1hX2J1ZmZlciAqKm91dF9idWYpCit7CisJaW50IHJldDsKKworCUJVR19PTigqb3V0X3N1cmYgfHwgKm91dF9idWYpOworCisJcmV0ID0gdm13X3VzZXJfc3VyZmFjZV9sb29rdXBfaGFuZGxlKGRldl9wcml2LCB0ZmlsZSwgaGFuZGxlLCBvdXRfc3VyZik7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJcmV0ID0gdm13X3VzZXJfZG1hYnVmX2xvb2t1cCh0ZmlsZSwgaGFuZGxlLCBvdXRfYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCiAKIGludCB2bXdfdXNlcl9zdXJmYWNlX2xvb2t1cF9oYW5kbGUoc3RydWN0IHZtd19wcml2YXRlICpkZXZfcHJpdiwKIAkJCQkgICBzdHJ1Y3QgdHRtX29iamVjdF9maWxlICp0ZmlsZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMgYi9kcml2ZXJzL2hpZC9oaWQtY29yZS5jCmluZGV4IDg0OGE1NmMuLmFmMzUzODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaGlkL2hpZC1jb3JlLmMKKysrIGIvZHJpdmVycy9oaWQvaGlkLWNvcmUuYwpAQCAtMTc3MSw4ICsxNzcxLDggQEAKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVNTRU5USUFMX1JFQUxJVFksIFVTQl9ERVZJQ0VfSURfRVNTRU5USUFMX1JFQUxJVFlfUDUpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0VUVCwgVVNCX0RFVklDRV9JRF9UQzVVSCkgfSwKIAl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfRVRULCBVU0JfREVWSUNFX0lEX1RDNFVNKSB9LAorCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNILCAweDAwMDEpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dFTkVSQUxfVE9VQ0gsIDB4MDAwMikgfSwKLQl7IEhJRF9VU0JfREVWSUNFKFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSCwgMHgwMDAzKSB9LAogCXsgSElEX1VTQl9ERVZJQ0UoVVNCX1ZFTkRPUl9JRF9HRU5FUkFMX1RPVUNILCAweDAwMDQpIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfNF9QSElER0VUU0VSVk9fMzApIH0sCiAJeyBISURfVVNCX0RFVklDRShVU0JfVkVORE9SX0lEX0dMQUIsIFVTQl9ERVZJQ0VfSURfMV9QSElER0VUU0VSVk9fMzApIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL2hpZC9oaWQtaWRzLmggYi9kcml2ZXJzL2hpZC9oaWQtaWRzLmgKaW5kZXggMDZjZTk5Ni4uNGE0NDFhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9oaWQvaGlkLWlkcy5oCisrKyBiL2RyaXZlcnMvaGlkL2hpZC1pZHMuaApAQCAtMjY2LDcgKzI2Niw3IEBACiAjZGVmaW5lIFVTQl9ERVZJQ0VfSURfR0FNRVJPTl9EVUFMX1BDU19BREFQVE9SCTB4MDAwMgogCiAjZGVmaW5lIFVTQl9WRU5ET1JfSURfR0VORVJBTF9UT1VDSAkweDBkZmMKLSNkZWZpbmUgVVNCX0RFVklDRV9JRF9HRU5FUkFMX1RPVUNIX1dJTjdfVFdPRklOR0VSUyAweDAwMDEKKyNkZWZpbmUgVVNCX0RFVklDRV9JRF9HRU5FUkFMX1RPVUNIX1dJTjdfVFdPRklOR0VSUyAweDAwMDMKIAogI2RlZmluZSBVU0JfVkVORE9SX0lEX0dMQUIJCTB4MDZjMgogI2RlZmluZSBVU0JfREVWSUNFX0lEXzRfUEhJREdFVFNFUlZPXzMwCTB4MDAzOApkaWZmIC0tZ2l0IGEvZHJpdmVycy9od21vbi9jb3JldGVtcC5jIGIvZHJpdmVycy9od21vbi9jb3JldGVtcC5jCmluZGV4IDEwNGIzNzYuLjFmZGVmODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vY29yZXRlbXAuYworKysgYi9kcml2ZXJzL2h3bW9uL2NvcmV0ZW1wLmMKQEAgLTU3LDE2ICs1NywxNSBAQAogI2RlZmluZSBUT1RBTF9BVFRSUwkJKE1BWF9DT1JFX0FUVFJTICsgMSkKICNkZWZpbmUgTUFYX0NPUkVfREFUQQkJKE5VTV9SRUFMX0NPUkVTICsgQkFTRV9TWVNGU19BVFRSX05PKQogCi0jaWZkZWYgQ09ORklHX1NNUAogI2RlZmluZSBUT19QSFlTX0lEKGNwdSkJCWNwdV9kYXRhKGNwdSkucGh5c19wcm9jX2lkCiAjZGVmaW5lIFRPX0NPUkVfSUQoY3B1KQkJY3B1X2RhdGEoY3B1KS5jcHVfY29yZV9pZAorI2RlZmluZSBUT19BVFRSX05PKGNwdSkJCShUT19DT1JFX0lEKGNwdSkgKyBCQVNFX1NZU0ZTX0FUVFJfTk8pCisKKyNpZmRlZiBDT05GSUdfU01QCiAjZGVmaW5lIGZvcl9lYWNoX3NpYmxpbmcoaSwgY3B1KQlmb3JfZWFjaF9jcHUoaSwgY3B1X3NpYmxpbmdfbWFzayhjcHUpKQogI2Vsc2UKLSNkZWZpbmUgVE9fUEhZU19JRChjcHUpCQkoY3B1KQotI2RlZmluZSBUT19DT1JFX0lEKGNwdSkJCShjcHUpCiAjZGVmaW5lIGZvcl9lYWNoX3NpYmxpbmcoaSwgY3B1KQlmb3IgKGkgPSAwOyBmYWxzZTsgKQogI2VuZGlmCi0jZGVmaW5lIFRPX0FUVFJfTk8oY3B1KQkJKFRPX0NPUkVfSUQoY3B1KSArIEJBU0VfU1lTRlNfQVRUUl9OTykKIAogLyoKICAqIFBlci1Db3JlIFRlbXBlcmF0dXJlIERhdGEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHdtb24vano0NzQwLWh3bW9uLmMgYi9kcml2ZXJzL2h3bW9uL2p6NDc0MC1od21vbi5jCmluZGV4IDdhNDhiMWUuLjUyNTNkMjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaHdtb24vano0NzQwLWh3bW9uLmMKKysrIGIvZHJpdmVycy9od21vbi9qejQ3NDAtaHdtb24uYwpAQCAtNTksNyArNTksNyBAQAogewogCXN0cnVjdCBqejQ3NDBfaHdtb24gKmh3bW9uID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAJc3RydWN0IGNvbXBsZXRpb24gKmNvbXBsZXRpb24gPSAmaHdtb24tPnJlYWRfY29tcGxldGlvbjsKLQl1bnNpZ25lZCBsb25nIHQ7CisJbG9uZyB0OwogCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCByZXQ7CiAKQEAgLTIwMyw3ICsyMDMsNyBAQAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGp6NDc0MF9od21vbl9kcml2ZXIgPSB7CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBqejQ3NDBfaHdtb25fZHJpdmVyID0gewogCS5wcm9iZQk9IGp6NDc0MF9od21vbl9wcm9iZSwKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoano0NzQwX2h3bW9uX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtZWcyMHQuYwppbmRleCA4Y2ViZWY0Li4xODkzNmFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLWVnMjB0LmMKKysrIGIvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lZzIwdC5jCkBAIC04OTMsNiArODkzLDEzIEBACiAJLyogU2V0IHRoZSBudW1iZXIgb2YgSTJDIGNoYW5uZWwgaW5zdGFuY2UgKi8KIAlhZGFwX2luZm8tPmNoX251bSA9IGlkLT5kcml2ZXJfZGF0YTsKIAorCXJldCA9IHJlcXVlc3RfaXJxKHBkZXYtPmlycSwgcGNoX2kyY19oYW5kbGVyLCBJUlFGX1NIQVJFRCwKKwkJICBLQlVJTERfTU9ETkFNRSwgYWRhcF9pbmZvKTsKKwlpZiAocmV0KSB7CisJCXBjaF9wY2lfZXJyKHBkZXYsICJyZXF1ZXN0X2lycSBGQUlMRURcbiIpOworCQlnb3RvIGVycl9yZXF1ZXN0X2lycTsKKwl9CisKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcF9pbmZvLT5jaF9udW07IGkrKykgewogCQlwY2hfYWRhcCA9ICZhZGFwX2luZm8tPnBjaF9kYXRhW2ldLnBjaF9hZGFwdGVyOwogCQlhZGFwX2luZm8tPnBjaF9pMmNfc3VzcGVuZGVkID0gZmFsc2U7CkBAIC05MTAsMjggKzkxNywyMyBAQAogCiAJCXBjaF9hZGFwLT5kZXYucGFyZW50ID0gJnBkZXYtPmRldjsKIAorCQlwY2hfaTJjX2luaXQoJmFkYXBfaW5mby0+cGNoX2RhdGFbaV0pOwogCQlyZXQgPSBpMmNfYWRkX2FkYXB0ZXIocGNoX2FkYXApOwogCQlpZiAocmV0KSB7CiAJCQlwY2hfcGNpX2VycihwZGV2LCAiaTJjX2FkZF9hZGFwdGVyW2NoOiVkXSBGQUlMRURcbiIsIGkpOwotCQkJZ290byBlcnJfaTJjX2FkZF9hZGFwdGVyOworCQkJZ290byBlcnJfYWRkX2FkYXB0ZXI7CiAJCX0KLQotCQlwY2hfaTJjX2luaXQoJmFkYXBfaW5mby0+cGNoX2RhdGFbaV0pOwotCX0KLQlyZXQgPSByZXF1ZXN0X2lycShwZGV2LT5pcnEsIHBjaF9pMmNfaGFuZGxlciwgSVJRRl9TSEFSRUQsCi0JCSAgS0JVSUxEX01PRE5BTUUsIGFkYXBfaW5mbyk7Ci0JaWYgKHJldCkgewotCQlwY2hfcGNpX2VycihwZGV2LCAicmVxdWVzdF9pcnEgRkFJTEVEXG4iKTsKLQkJZ290byBlcnJfaTJjX2FkZF9hZGFwdGVyOwogCX0KIAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBhZGFwX2luZm8pOwogCXBjaF9wY2lfZGJnKHBkZXYsICJyZXR1cm5zICVkLlxuIiwgcmV0KTsKIAlyZXR1cm4gMDsKIAotZXJyX2kyY19hZGRfYWRhcHRlcjoKK2Vycl9hZGRfYWRhcHRlcjoKIAlmb3IgKGogPSAwOyBqIDwgaTsgaisrKQogCQlpMmNfZGVsX2FkYXB0ZXIoJmFkYXBfaW5mby0+cGNoX2RhdGFbal0ucGNoX2FkYXB0ZXIpOworCWZyZWVfaXJxKHBkZXYtPmlycSwgYWRhcF9pbmZvKTsKK2Vycl9yZXF1ZXN0X2lycToKIAlwY2lfaW91bm1hcChwZGV2LCBiYXNlX2FkZHIpOwogZXJyX3BjaV9pb21hcDoKIAlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1vbWFwLmMgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYwppbmRleCBhNDNkMDAyLi5mYTIzZmFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYworKysgYi9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLW9tYXAuYwpAQCAtMTA0NywxMyArMTA0NywxNCBAQAogCQkgKiBzaXplLiBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHdlIGNhbiBoYW5kbGUgdGhlIHN0YXR1cyBvbiBpbnQKIAkJICogY2FsbCBiYWNrIGxhdGVuY2llcy4KIAkJICovCi0JCWlmIChkZXYtPnJldiA+PSBPTUFQX0kyQ19SRVZfT05fMzUzMF80NDMwKSB7Ci0JCQlkZXYtPmZpZm9fc2l6ZSA9IDA7CisKKwkJZGV2LT5maWZvX3NpemUgPSAoZGV2LT5maWZvX3NpemUgLyAyKTsKKworCQlpZiAoZGV2LT5yZXYgPj0gT01BUF9JMkNfUkVWX09OXzM1MzBfNDQzMCkKIAkJCWRldi0+Yl9odyA9IDA7IC8qIERpc2FibGUgaGFyZHdhcmUgZml4ZXMgKi8KLQkJfSBlbHNlIHsKLQkJCWRldi0+Zmlmb19zaXplID0gKGRldi0+Zmlmb19zaXplIC8gMik7CisJCWVsc2UKIAkJCWRldi0+Yl9odyA9IDE7IC8qIEVuYWJsZSBoYXJkd2FyZSBmaXhlcyAqLwotCQl9CisKIAkJLyogY2FsY3VsYXRlIHdha2V1cCBsYXRlbmN5IGNvbnN0cmFpbnQgZm9yIE1QVSAqLwogCQlpZiAoZGV2LT5zZXRfbXB1X3drdXBfbGF0ICE9IE5VTEwpCiAJCQlkZXYtPmxhdGVuY3kgPSAoMTAwMDAwMCAqIGRldi0+Zmlmb19zaXplKSAvCmRpZmYgLS1naXQgYS9kcml2ZXJzL2kyYy9idXNzZXMvaTJjLXMzYzI0MTAuYyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCmluZGV4IDI3NTRjZWYuLjRjMTcxODAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCisrKyBiL2RyaXZlcnMvaTJjL2J1c3Nlcy9pMmMtczNjMjQxMC5jCkBAIC01MzQsNiArNTM0LDcgQEAKIAogCS8qIGZpcnN0LCB0cnkgYnVzeSB3YWl0aW5nIGJyaWVmbHkgKi8KIAlkbyB7CisJCWNwdV9yZWxheCgpOwogCQlpaWNzdGF0ID0gcmVhZGwoaTJjLT5yZWdzICsgUzNDMjQxMF9JSUNTVEFUKTsKIAl9IHdoaWxlICgoaWljc3RhdCAmIFMzQzI0MTBfSUlDU1RBVF9TVEFSVCkgJiYgLS1zcGlucyk7CiAKQEAgLTc4Niw3ICs3ODcsNyBAQAogI2Vsc2UKIHN0YXRpYyBpbnQgczNjMjR4eF9pMmNfcGFyc2VfZHRfZ3BpbyhzdHJ1Y3QgczNjMjR4eF9pMmMgKmkyYykKIHsKLQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgczNjMjR4eF9pMmNfZHRfZ3Bpb19mcmVlKHN0cnVjdCBzM2MyNHh4X2kyYyAqaTJjKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pZWVlODAyMTU0L2Zha2VoYXJkLmMgYi9kcml2ZXJzL2llZWU4MDIxNTQvZmFrZWhhcmQuYwppbmRleCBlYjBlMmNjLi43M2Q0NTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2llZWU4MDIxNTQvZmFrZWhhcmQuYworKysgYi9kcml2ZXJzL2llZWU4MDIxNTQvZmFrZWhhcmQuYwpAQCAtMzQzLDcgKzM0Myw3IEBACiB7CiAJZGV2LT5hZGRyX2xlbgkJPSBJRUVFODAyMTU0X0FERFJfTEVOOwogCW1lbXNldChkZXYtPmJyb2FkY2FzdCwgMHhmZiwgSUVFRTgwMjE1NF9BRERSX0xFTik7Ci0JZGV2LT5mZWF0dXJlcwkJPSBORVRJRl9GX05PX0NTVU07CisJZGV2LT5mZWF0dXJlcwkJPSBORVRJRl9GX0hXX0NTVU07CiAJZGV2LT5uZWVkZWRfdGFpbHJvb20JPSAyOyAvKiBGQ1MgKi8KIAlkZXYtPm10dQkJPSAxMjc7CiAJZGV2LT50eF9xdWV1ZV9sZW4JPSAxMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9jb3JlL2FkZHIuYwppbmRleCBlOWNmNTFiLi4xNjEyY2ZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9hZGRyLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvYWRkci5jCkBAIC0xNzgsNiArMTc4LDI1IEBACiAJbXV0ZXhfdW5sb2NrKCZsb2NrKTsKIH0KIAorc3RhdGljIGludCBkc3RfZmV0Y2hfaGEoc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgcmRtYV9kZXZfYWRkciAqYWRkcikKK3sKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuOworCWludCByZXQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbiA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKGRzdCk7CisJaWYgKCFuIHx8ICEobi0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSkgeworCQlpZiAobikKKwkJCW5laWdoX2V2ZW50X3NlbmQobiwgTlVMTCk7CisJCXJldCA9IC1FTk9EQVRBOworCX0gZWxzZSB7CisJCXJldCA9IHJkbWFfY29weV9hZGRyKGFkZHIsIGRzdC0+ZGV2LCBuLT5oYSk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIGludCBhZGRyNF9yZXNvbHZlKHN0cnVjdCBzb2NrYWRkcl9pbiAqc3JjX2luLAogCQkJIHN0cnVjdCBzb2NrYWRkcl9pbiAqZHN0X2luLAogCQkJIHN0cnVjdCByZG1hX2Rldl9hZGRyICphZGRyKQpAQCAtMTg1LDcgKzIwNCw2IEBACiAJX19iZTMyIHNyY19pcCA9IHNyY19pbi0+c2luX2FkZHIuc19hZGRyOwogCV9fYmUzMiBkc3RfaXAgPSBkc3RfaW4tPnNpbl9hZGRyLnNfYWRkcjsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKIAlzdHJ1Y3QgZmxvd2k0IGZsNDsKIAlpbnQgcmV0OwogCkBAIC0yMTQsMjAgKzIzMiw3IEBACiAJCWdvdG8gcHV0OwogCX0KIAotCW5laWdoID0gbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCAmcnQtPnJ0X2dhdGV3YXksIHJ0LT5kc3QuZGV2KTsKLQlpZiAoIW5laWdoIHx8ICEobmVpZ2gtPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkpIHsKLQkJcmN1X3JlYWRfbG9jaygpOwotCQluZWlnaF9ldmVudF9zZW5kKGRzdF9nZXRfbmVpZ2hib3VyKCZydC0+ZHN0KSwgTlVMTCk7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXQgPSAtRU5PREFUQTsKLQkJaWYgKG5laWdoKQotCQkJZ290byByZWxlYXNlOwotCQlnb3RvIHB1dDsKLQl9Ci0KLQlyZXQgPSByZG1hX2NvcHlfYWRkcihhZGRyLCBuZWlnaC0+ZGV2LCBuZWlnaC0+aGEpOwotcmVsZWFzZToKLQluZWlnaF9yZWxlYXNlKG5laWdoKTsKKwlyZXQgPSBkc3RfZmV0Y2hfaGEoJnJ0LT5kc3QsIGFkZHIpOwogcHV0OgogCWlwX3J0X3B1dChydCk7CiBvdXQ6CkBAIC0yNDAsMTMgKzI0NSwxMiBAQAogCQkJIHN0cnVjdCByZG1hX2Rldl9hZGRyICphZGRyKQogewogCXN0cnVjdCBmbG93aTYgZmw2OwotCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdDsKIAlpbnQgcmV0OwogCiAJbWVtc2V0KCZmbDYsIDAsIHNpemVvZiBmbDYpOwotCWlwdjZfYWRkcl9jb3B5KCZmbDYuZGFkZHIsICZkc3RfaW4tPnNpbjZfYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi5zYWRkciwgJnNyY19pbi0+c2luNl9hZGRyKTsKKwlmbDYuZGFkZHIgPSBkc3RfaW4tPnNpbjZfYWRkcjsKKwlmbDYuc2FkZHIgPSBzcmNfaW4tPnNpbjZfYWRkcjsKIAlmbDYuZmxvd2k2X29pZiA9IGFkZHItPmJvdW5kX2Rldl9pZjsKIAogCWRzdCA9IGlwNl9yb3V0ZV9vdXRwdXQoJmluaXRfbmV0LCBOVUxMLCAmZmw2KTsKQEAgLTI2MCw3ICsyNjQsNyBAQAogCQkJZ290byBwdXQ7CiAKIAkJc3JjX2luLT5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwotCQlpcHY2X2FkZHJfY29weSgmc3JjX2luLT5zaW42X2FkZHIsICZmbDYuc2FkZHIpOworCQlzcmNfaW4tPnNpbjZfYWRkciA9IGZsNi5zYWRkcjsKIAl9CiAKIAlpZiAoZHN0LT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSB7CkBAIC0yNzYsMTYgKzI4MCw3IEBACiAJCWdvdG8gcHV0OwogCX0KIAotCXJjdV9yZWFkX2xvY2soKTsKLQluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7Ci0JaWYgKCFuZWlnaCB8fCAhKG5laWdoLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSB7Ci0JCWlmIChuZWlnaCkKLQkJCW5laWdoX2V2ZW50X3NlbmQobmVpZ2gsIE5VTEwpOwotCQlyZXQgPSAtRU5PREFUQTsKLQl9IGVsc2UgewotCQlyZXQgPSByZG1hX2NvcHlfYWRkcihhZGRyLCBkc3QtPmRldiwgbmVpZ2gtPmhhKTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0ID0gZHN0X2ZldGNoX2hhKGRzdCwgYWRkcik7CiBwdXQ6CiAJZHN0X3JlbGVhc2UoZHN0KTsKIAlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2NvcmUvY21hLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYwppbmRleCA3NWZmODIxLi4yMzZhODhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvY29yZS9jbWEuYwpAQCAtMjAwNSwxMSArMjAwNSwxMSBAQAogCWlmIChjbWFfemVyb19hZGRyKHNyYykpIHsKIAkJZHN0ID0gKHN0cnVjdCBzb2NrYWRkciAqKSAmaWRfcHJpdi0+aWQucm91dGUuYWRkci5kc3RfYWRkcjsKIAkJaWYgKChzcmMtPnNhX2ZhbWlseSA9IGRzdC0+c2FfZmFtaWx5KSA9PSBBRl9JTkVUKSB7Ci0JCQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzcmMpLT5zaW5fYWRkci5zX2FkZHIgPQotCQkJCSgoc3RydWN0IHNvY2thZGRyX2luICopIGRzdCktPnNpbl9hZGRyLnNfYWRkcjsKKwkJCSgoc3RydWN0IHNvY2thZGRyX2luICopc3JjKS0+c2luX2FkZHIgPQorCQkJCSgoc3RydWN0IHNvY2thZGRyX2luICopZHN0KS0+c2luX2FkZHI7CiAJCX0gZWxzZSB7Ci0JCQlpcHY2X2FkZHJfY29weSgmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHNyYyktPnNpbjZfYWRkciwKLQkJCQkgICAgICAgJigoc3RydWN0IHNvY2thZGRyX2luNiAqKSBkc3QpLT5zaW42X2FkZHIpOworCQkJKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc3JjKS0+c2luNl9hZGRyID0KKwkJCQkoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilkc3QpLT5zaW42X2FkZHI7CiAJCX0KIAl9CiAKQEAgLTI1MTMsNiArMjUxMyw5IEBACiAKIAlyZXEucHJpdmF0ZV9kYXRhX2xlbiA9IHNpemVvZihzdHJ1Y3QgY21hX2hkcikgKwogCQkJICAgICAgIGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW47CisJaWYgKHJlcS5wcml2YXRlX2RhdGFfbGVuIDwgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlyZXEucHJpdmF0ZV9kYXRhID0ga3phbGxvYyhyZXEucHJpdmF0ZV9kYXRhX2xlbiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFyZXEucHJpdmF0ZV9kYXRhKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTI1NjIsNiArMjU2NSw5IEBACiAJbWVtc2V0KCZyZXEsIDAsIHNpemVvZiByZXEpOwogCW9mZnNldCA9IGNtYV91c2VyX2RhdGFfb2Zmc2V0KGlkX3ByaXYtPmlkLnBzKTsKIAlyZXEucHJpdmF0ZV9kYXRhX2xlbiA9IG9mZnNldCArIGNvbm5fcGFyYW0tPnByaXZhdGVfZGF0YV9sZW47CisJaWYgKHJlcS5wcml2YXRlX2RhdGFfbGVuIDwgY29ubl9wYXJhbS0+cHJpdmF0ZV9kYXRhX2xlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlwcml2YXRlX2RhdGEgPSBremFsbG9jKHJlcS5wcml2YXRlX2RhdGFfbGVuLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXByaXZhdGVfZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2IzL2l3Y2hfY20uYwppbmRleCBjODhiMTJiLi43NDBkY2MwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvY3hnYjMvaXdjaF9jbS5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiMy9pd2NoX2NtLmMKQEAgLTEzMzgsNyArMTMzOCw2IEBACiAJc3RydWN0IGl3Y2hfZXAgKmNoaWxkX2VwLCAqcGFyZW50X2VwID0gY3R4OwogCXN0cnVjdCBjcGxfcGFzc19hY2NlcHRfcmVxICpyZXEgPSBjcGxoZHIoc2tiKTsKIAl1bnNpZ25lZCBpbnQgaHd0aWQgPSBHRVRfVElEKHJlcSk7Ci0Jc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwogCXN0cnVjdCBsMnRfZW50cnkgKmwydDsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKQEAgLTEzNzUsMTAgKzEzNzQsNyBAQAogCQlnb3RvIHJlamVjdDsKIAl9CiAJZHN0ID0gJnJ0LT5kc3Q7Ci0JcmN1X3JlYWRfbG9jaygpOwotCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKLQlsMnQgPSB0M19sMnRfZ2V0KHRkZXYsIG5laWdoLCBuZWlnaC0+ZGV2KTsKLQlyY3VfcmVhZF91bmxvY2soKTsKKwlsMnQgPSB0M19sMnRfZ2V0KHRkZXYsIGRzdCwgTlVMTCk7CiAJaWYgKCFsMnQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIE1PRCAiJXMgLSBmYWlsZWQgdG8gYWxsb2NhdGUgbDJ0IGVudHJ5IVxuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKQEAgLTE4ODksNyArMTg4NSw2IEBACiBpbnQgaXdjaF9jb25uZWN0KHN0cnVjdCBpd19jbV9pZCAqY21faWQsIHN0cnVjdCBpd19jbV9jb25uX3BhcmFtICpjb25uX3BhcmFtKQogewogCXN0cnVjdCBpd2NoX2RldiAqaCA9IHRvX2l3Y2hfZGV2KGNtX2lkLT5kZXZpY2UpOwotCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOwogCXN0cnVjdCBpd2NoX2VwICplcDsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIAlpbnQgZXJyID0gMDsKQEAgLTE5NDcsMTMgKzE5NDIsNyBAQAogCQlnb3RvIGZhaWwzOwogCX0KIAllcC0+ZHN0ID0gJnJ0LT5kc3Q7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cihlcC0+ZHN0KTsKLQotCS8qIGdldCBhIGwydCBlbnRyeSAqLwotCWVwLT5sMnQgPSB0M19sMnRfZ2V0KGVwLT5jb20udGRldiwgbmVpZ2gsIG5laWdoLT5kZXYpOwotCXJjdV9yZWFkX3VubG9jaygpOworCWVwLT5sMnQgPSB0M19sMnRfZ2V0KGVwLT5jb20udGRldiwgZXAtPmRzdCwgTlVMTCk7CiAJaWYgKCFlcC0+bDJ0KSB7CiAJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gY2Fubm90IGFsbG9jIGwyZS5cbiIsIF9fZnVuY19fKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9jeGdiNC9jbS5jIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMKaW5kZXggMDc0NzAwNC4uMDY2OGJiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L2N4Z2I0L2NtLmMKQEAgLTE1NTYsNiArMTU1Niw2NyBAQAogCXJldHVybjsKIH0KIAorc3RhdGljIGludCBpbXBvcnRfZXAoc3RydWN0IGM0aXdfZXAgKmVwLCBfX2JlMzIgcGVlcl9pcCwgc3RydWN0IGRzdF9lbnRyeSAqZHN0LAorCQkgICAgIHN0cnVjdCBjNGl3X2RldiAqY2RldiwgYm9vbCBjbGVhcl9tcGFfdjEpCit7CisJc3RydWN0IG5laWdoYm91ciAqbjsKKwlpbnQgZXJyLCBzdGVwOworCisJcmN1X3JlYWRfbG9jaygpOworCW4gPSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZihkc3QpOworCWVyciA9IC1FTk9ERVY7CisJaWYgKCFuKQorCQlnb3RvIG91dDsKKwllcnIgPSAtRU5PTUVNOworCWlmIChuLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSB7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpwZGV2OworCisJCXBkZXYgPSBpcF9kZXZfZmluZCgmaW5pdF9uZXQsIHBlZXJfaXApOworCQllcC0+bDJ0ID0gY3hnYjRfbDJ0X2dldChjZGV2LT5yZGV2LmxsZGkubDJ0LAorCQkJCQluLCBwZGV2LCAwKTsKKwkJaWYgKCFlcC0+bDJ0KQorCQkJZ290byBvdXQ7CisJCWVwLT5tdHUgPSBwZGV2LT5tdHU7CisJCWVwLT50eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKHBkZXYpOworCQllcC0+c21hY19pZHggPSAoY3hnYjRfcG9ydF92aWlkKHBkZXYpICYgMHg3RikgPDwgMTsKKwkJc3RlcCA9IGNkZXYtPnJkZXYubGxkaS5udHhxIC8KKwkJCWNkZXYtPnJkZXYubGxkaS5uY2hhbjsKKwkJZXAtPnR4cV9pZHggPSBjeGdiNF9wb3J0X2lkeChwZGV2KSAqIHN0ZXA7CisJCXN0ZXAgPSBjZGV2LT5yZGV2LmxsZGkubnJ4cSAvCisJCQljZGV2LT5yZGV2LmxsZGkubmNoYW47CisJCWVwLT5jdHJscV9pZHggPSBjeGdiNF9wb3J0X2lkeChwZGV2KTsKKwkJZXAtPnJzc19xaWQgPSBjZGV2LT5yZGV2LmxsZGkucnhxX2lkc1sKKwkJCWN4Z2I0X3BvcnRfaWR4KHBkZXYpICogc3RlcF07CisJCWRldl9wdXQocGRldik7CisJfSBlbHNlIHsKKwkJZXAtPmwydCA9IGN4Z2I0X2wydF9nZXQoY2Rldi0+cmRldi5sbGRpLmwydCwKKwkJCQkJbiwgbi0+ZGV2LCAwKTsKKwkJaWYgKCFlcC0+bDJ0KQorCQkJZ290byBvdXQ7CisJCWVwLT5tdHUgPSBkc3RfbXR1KGVwLT5kc3QpOworCQllcC0+dHhfY2hhbiA9IGN4Z2I0X3BvcnRfY2hhbihuLT5kZXYpOworCQllcC0+c21hY19pZHggPSAoY3hnYjRfcG9ydF92aWlkKG4tPmRldikgJiAweDdGKSA8PCAxOworCQlzdGVwID0gY2Rldi0+cmRldi5sbGRpLm50eHEgLworCQkJY2Rldi0+cmRldi5sbGRpLm5jaGFuOworCQllcC0+dHhxX2lkeCA9IGN4Z2I0X3BvcnRfaWR4KG4tPmRldikgKiBzdGVwOworCQllcC0+Y3RybHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgobi0+ZGV2KTsKKwkJc3RlcCA9IGNkZXYtPnJkZXYubGxkaS5ucnhxIC8KKwkJCWNkZXYtPnJkZXYubGxkaS5uY2hhbjsKKwkJZXAtPnJzc19xaWQgPSBjZGV2LT5yZGV2LmxsZGkucnhxX2lkc1sKKwkJCWN4Z2I0X3BvcnRfaWR4KG4tPmRldikgKiBzdGVwXTsKKworCQlpZiAoY2xlYXJfbXBhX3YxKSB7CisJCQllcC0+cmV0cnlfd2l0aF9tcGFfdjEgPSAwOworCQkJZXAtPnRyaWVkX3dpdGhfbXBhX3YxID0gMDsKKwkJfQorCX0KKwllcnIgPSAwOworb3V0OgorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBwYXNzX2FjY2VwdF9yZXEoc3RydWN0IGM0aXdfZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGM0aXdfZXAgKmNoaWxkX2VwLCAqcGFyZW50X2VwOwpAQCAtMTU2MywxOCArMTYyNCwxMSBAQAogCXVuc2lnbmVkIGludCBzdGlkID0gR0VUX1BPUEVOX1RJRChudG9obChyZXEtPnRvc19zdGlkKSk7CiAJc3RydWN0IHRpZF9pbmZvICp0ID0gZGV2LT5yZGV2LmxsZGkudGlkczsKIAl1bnNpZ25lZCBpbnQgaHd0aWQgPSBHRVRfVElEKHJlcSk7Ci0Jc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAJc3RydWN0IGRzdF9lbnRyeSAqZHN0OwotCXN0cnVjdCBsMnRfZW50cnkgKmwydDsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKIAlfX2JlMzIgbG9jYWxfaXAsIHBlZXJfaXA7CiAJX19iZTE2IGxvY2FsX3BvcnQsIHBlZXJfcG9ydDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcGRldjsKLQl1MzIgdHhfY2hhbiwgc21hY19pZHg7Ci0JdTE2IHJzc19xaWQ7Ci0JdTMyIG10dTsKLQlpbnQgc3RlcDsKLQlpbnQgdHhxX2lkeCwgY3RybHFfaWR4OworCWludCBlcnI7CiAKIAlwYXJlbnRfZXAgPSBsb29rdXBfc3RpZCh0LCBzdGlkKTsKIAlQREJHKCIlcyBwYXJlbnQgZXAgJXAgdGlkICV1XG4iLCBfX2Z1bmNfXywgcGFyZW50X2VwLCBod3RpZCk7CkBAIC0xNTk2LDQ5ICsxNjUwLDI0IEBACiAJCWdvdG8gcmVqZWN0OwogCX0KIAlkc3QgPSAmcnQtPmRzdDsKLQlyY3VfcmVhZF9sb2NrKCk7Ci0JbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOwotCWlmIChuZWlnaC0+ZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgewotCQlwZGV2ID0gaXBfZGV2X2ZpbmQoJmluaXRfbmV0LCBwZWVyX2lwKTsKLQkJQlVHX09OKCFwZGV2KTsKLQkJbDJ0ID0gY3hnYjRfbDJ0X2dldChkZXYtPnJkZXYubGxkaS5sMnQsIG5laWdoLCBwZGV2LCAwKTsKLQkJbXR1ID0gcGRldi0+bXR1OwotCQl0eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKHBkZXYpOwotCQlzbWFjX2lkeCA9IChjeGdiNF9wb3J0X3ZpaWQocGRldikgJiAweDdGKSA8PCAxOwotCQlzdGVwID0gZGV2LT5yZGV2LmxsZGkubnR4cSAvIGRldi0+cmRldi5sbGRpLm5jaGFuOwotCQl0eHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgocGRldikgKiBzdGVwOwotCQljdHJscV9pZHggPSBjeGdiNF9wb3J0X2lkeChwZGV2KTsKLQkJc3RlcCA9IGRldi0+cmRldi5sbGRpLm5yeHEgLyBkZXYtPnJkZXYubGxkaS5uY2hhbjsKLQkJcnNzX3FpZCA9IGRldi0+cmRldi5sbGRpLnJ4cV9pZHNbY3hnYjRfcG9ydF9pZHgocGRldikgKiBzdGVwXTsKLQkJZGV2X3B1dChwZGV2KTsKLQl9IGVsc2UgewotCQlsMnQgPSBjeGdiNF9sMnRfZ2V0KGRldi0+cmRldi5sbGRpLmwydCwgbmVpZ2gsIG5laWdoLT5kZXYsIDApOwotCQltdHUgPSBkc3RfbXR1KGRzdCk7Ci0JCXR4X2NoYW4gPSBjeGdiNF9wb3J0X2NoYW4obmVpZ2gtPmRldik7Ci0JCXNtYWNfaWR4ID0gKGN4Z2I0X3BvcnRfdmlpZChuZWlnaC0+ZGV2KSAmIDB4N0YpIDw8IDE7Ci0JCXN0ZXAgPSBkZXYtPnJkZXYubGxkaS5udHhxIC8gZGV2LT5yZGV2LmxsZGkubmNoYW47Ci0JCXR4cV9pZHggPSBjeGdiNF9wb3J0X2lkeChuZWlnaC0+ZGV2KSAqIHN0ZXA7Ci0JCWN0cmxxX2lkeCA9IGN4Z2I0X3BvcnRfaWR4KG5laWdoLT5kZXYpOwotCQlzdGVwID0gZGV2LT5yZGV2LmxsZGkubnJ4cSAvIGRldi0+cmRldi5sbGRpLm5jaGFuOwotCQlyc3NfcWlkID0gZGV2LT5yZGV2LmxsZGkucnhxX2lkc1sKLQkJCSAgY3hnYjRfcG9ydF9pZHgobmVpZ2gtPmRldikgKiBzdGVwXTsKLQl9Ci0JcmN1X3JlYWRfdW5sb2NrKCk7Ci0JaWYgKCFsMnQpIHsKLQkJcHJpbnRrKEtFUk5fRVJSIE1PRCAiJXMgLSBmYWlsZWQgdG8gYWxsb2NhdGUgbDJ0IGVudHJ5IVxuIiwKLQkJICAgICAgIF9fZnVuY19fKTsKLQkJZHN0X3JlbGVhc2UoZHN0KTsKLQkJZ290byByZWplY3Q7Ci0JfQogCiAJY2hpbGRfZXAgPSBhbGxvY19lcChzaXplb2YoKmNoaWxkX2VwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGlsZF9lcCkgewogCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyAtIGZhaWxlZCB0byBhbGxvY2F0ZSBlcCBlbnRyeSFcbiIsCiAJCSAgICAgICBfX2Z1bmNfXyk7Ci0JCWN4Z2I0X2wydF9yZWxlYXNlKGwydCk7CiAJCWRzdF9yZWxlYXNlKGRzdCk7CiAJCWdvdG8gcmVqZWN0OwogCX0KKworCWVyciA9IGltcG9ydF9lcChjaGlsZF9lcCwgcGVlcl9pcCwgZHN0LCBkZXYsIGZhbHNlKTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gZmFpbGVkIHRvIGFsbG9jYXRlIGwydCBlbnRyeSFcbiIsCisJCSAgICAgICBfX2Z1bmNfXyk7CisJCWRzdF9yZWxlYXNlKGRzdCk7CisJCWtmcmVlKGNoaWxkX2VwKTsKKwkJZ290byByZWplY3Q7CisJfQorCiAJc3RhdGVfc2V0KCZjaGlsZF9lcC0+Y29tLCBDT05ORUNUSU5HKTsKIAljaGlsZF9lcC0+Y29tLmRldiA9IGRldjsKIAljaGlsZF9lcC0+Y29tLmNtX2lkID0gTlVMTDsKQEAgLTE2NTEsMTggKzE2ODAsMTEgQEAKIAljNGl3X2dldF9lcCgmcGFyZW50X2VwLT5jb20pOwogCWNoaWxkX2VwLT5wYXJlbnRfZXAgPSBwYXJlbnRfZXA7CiAJY2hpbGRfZXAtPnRvcyA9IEdFVF9QT1BFTl9UT1MobnRvaGwocmVxLT50b3Nfc3RpZCkpOwotCWNoaWxkX2VwLT5sMnQgPSBsMnQ7CiAJY2hpbGRfZXAtPmRzdCA9IGRzdDsKIAljaGlsZF9lcC0+aHd0aWQgPSBod3RpZDsKLQljaGlsZF9lcC0+dHhfY2hhbiA9IHR4X2NoYW47Ci0JY2hpbGRfZXAtPnNtYWNfaWR4ID0gc21hY19pZHg7Ci0JY2hpbGRfZXAtPnJzc19xaWQgPSByc3NfcWlkOwotCWNoaWxkX2VwLT5tdHUgPSBtdHU7Ci0JY2hpbGRfZXAtPnR4cV9pZHggPSB0eHFfaWR4OwotCWNoaWxkX2VwLT5jdHJscV9pZHggPSBjdHJscV9pZHg7CiAKIAlQREJHKCIlcyB0eF9jaGFuICV1IHNtYWNfaWR4ICV1IHJzc19xaWQgJXVcbiIsIF9fZnVuY19fLAotCSAgICAgdHhfY2hhbiwgc21hY19pZHgsIHJzc19xaWQpOworCSAgICAgY2hpbGRfZXAtPnR4X2NoYW4sIGNoaWxkX2VwLT5zbWFjX2lkeCwgY2hpbGRfZXAtPnJzc19xaWQpOwogCiAJaW5pdF90aW1lcigmY2hpbGRfZXAtPnRpbWVyKTsKIAljeGdiNF9pbnNlcnRfdGlkKHQsIGNoaWxkX2VwLCBod3RpZCk7CkBAIC0xNzkyLDExICsxODE0LDggQEAKIAogc3RhdGljIGludCBjNGl3X3JlY29ubmVjdChzdHJ1Y3QgYzRpd19lcCAqZXApCiB7Ci0JaW50IGVyciA9IDA7CiAJc3RydWN0IHJ0YWJsZSAqcnQ7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnBkZXY7Ci0Jc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7Ci0JaW50IHN0ZXA7CisJaW50IGVyciA9IDA7CiAKIAlQREJHKCIlcyBxcCAlcCBjbV9pZCAlcFxuIiwgX19mdW5jX18sIGVwLT5jb20ucXAsIGVwLT5jb20uY21faWQpOwogCWluaXRfdGltZXIoJmVwLT50aW1lcik7CkBAIC0xODI0LDQ3ICsxODQzLDEwIEBACiAJfQogCWVwLT5kc3QgPSAmcnQtPmRzdDsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKGVwLT5kc3QpOwotCi0JLyogZ2V0IGEgbDJ0IGVudHJ5ICovCi0JaWYgKG5laWdoLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSB7Ci0JCVBEQkcoIiVzIExPT1BCQUNLXG4iLCBfX2Z1bmNfXyk7Ci0JCXBkZXYgPSBpcF9kZXZfZmluZCgmaW5pdF9uZXQsCi0JCQkJICAgZXAtPmNvbS5jbV9pZC0+cmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKLQkJZXAtPmwydCA9IGN4Z2I0X2wydF9nZXQoZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5sMnQsCi0JCQkJCW5laWdoLCBwZGV2LCAwKTsKLQkJZXAtPm10dSA9IHBkZXYtPm10dTsKLQkJZXAtPnR4X2NoYW4gPSBjeGdiNF9wb3J0X2NoYW4ocGRldik7Ci0JCWVwLT5zbWFjX2lkeCA9IChjeGdiNF9wb3J0X3ZpaWQocGRldikgJiAweDdGKSA8PCAxOwotCQlzdGVwID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5udHhxIC8KLQkJCWVwLT5jb20uZGV2LT5yZGV2LmxsZGkubmNoYW47Ci0JCWVwLT50eHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgocGRldikgKiBzdGVwOwotCQlzdGVwID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5ucnhxIC8KLQkJCWVwLT5jb20uZGV2LT5yZGV2LmxsZGkubmNoYW47Ci0JCWVwLT5jdHJscV9pZHggPSBjeGdiNF9wb3J0X2lkeChwZGV2KTsKLQkJZXAtPnJzc19xaWQgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLnJ4cV9pZHNbCi0JCQljeGdiNF9wb3J0X2lkeChwZGV2KSAqIHN0ZXBdOwotCQlkZXZfcHV0KHBkZXYpOwotCX0gZWxzZSB7Ci0JCWVwLT5sMnQgPSBjeGdiNF9sMnRfZ2V0KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubDJ0LAotCQkJCQluZWlnaCwgbmVpZ2gtPmRldiwgMCk7Ci0JCWVwLT5tdHUgPSBkc3RfbXR1KGVwLT5kc3QpOwotCQllcC0+dHhfY2hhbiA9IGN4Z2I0X3BvcnRfY2hhbihuZWlnaC0+ZGV2KTsKLQkJZXAtPnNtYWNfaWR4ID0gKGN4Z2I0X3BvcnRfdmlpZChuZWlnaC0+ZGV2KSAmIDB4N0YpIDw8IDE7Ci0JCXN0ZXAgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLm50eHEgLwotCQkJZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5uY2hhbjsKLQkJZXAtPnR4cV9pZHggPSBjeGdiNF9wb3J0X2lkeChuZWlnaC0+ZGV2KSAqIHN0ZXA7Ci0JCWVwLT5jdHJscV9pZHggPSBjeGdiNF9wb3J0X2lkeChuZWlnaC0+ZGV2KTsKLQkJc3RlcCA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubnJ4cSAvCi0JCQllcC0+Y29tLmRldi0+cmRldi5sbGRpLm5jaGFuOwotCQllcC0+cnNzX3FpZCA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkucnhxX2lkc1sKLQkJCWN4Z2I0X3BvcnRfaWR4KG5laWdoLT5kZXYpICogc3RlcF07Ci0JfQotCXJjdV9yZWFkX3VubG9jaygpOwotCWlmICghZXAtPmwydCkgeworCWVyciA9IGltcG9ydF9lcChlcCwgZXAtPmNvbS5jbV9pZC0+cmVtb3RlX2FkZHIuc2luX2FkZHIuc19hZGRyLAorCQkJZXAtPmRzdCwgZXAtPmNvbS5kZXYsIGZhbHNlKTsKKwlpZiAoZXJyKSB7CiAJCXByaW50ayhLRVJOX0VSUiBNT0QgIiVzIC0gY2Fubm90IGFsbG9jIGwyZS5cbiIsIF9fZnVuY19fKTsKLQkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsNDsKIAl9CiAKQEAgLTIyNDAsMTMgKzIyMjIsMTAgQEAKIAogaW50IGM0aXdfY29ubmVjdChzdHJ1Y3QgaXdfY21faWQgKmNtX2lkLCBzdHJ1Y3QgaXdfY21fY29ubl9wYXJhbSAqY29ubl9wYXJhbSkKIHsKLQlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgYzRpd19kZXYgKmRldiA9IHRvX2M0aXdfZGV2KGNtX2lkLT5kZXZpY2UpOwogCXN0cnVjdCBjNGl3X2VwICplcDsKIAlzdHJ1Y3QgcnRhYmxlICpydDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcGRldjsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKLQlpbnQgc3RlcDsKKwlpbnQgZXJyID0gMDsKIAogCWlmICgoY29ubl9wYXJhbS0+b3JkID4gYzRpd19tYXhfcmVhZF9kZXB0aCkgfHwKIAkgICAgKGNvbm5fcGFyYW0tPmlyZCA+IGM0aXdfbWF4X3JlYWRfZGVwdGgpKSB7CkBAIC0yMzA3LDQ5ICsyMjg2LDEwIEBACiAJfQogCWVwLT5kc3QgPSAmcnQtPmRzdDsKIAotCXJjdV9yZWFkX2xvY2soKTsKLQluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKGVwLT5kc3QpOwotCi0JLyogZ2V0IGEgbDJ0IGVudHJ5ICovCi0JaWYgKG5laWdoLT5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSB7Ci0JCVBEQkcoIiVzIExPT1BCQUNLXG4iLCBfX2Z1bmNfXyk7Ci0JCXBkZXYgPSBpcF9kZXZfZmluZCgmaW5pdF9uZXQsCi0JCQkJICAgY21faWQtPnJlbW90ZV9hZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0JCWVwLT5sMnQgPSBjeGdiNF9sMnRfZ2V0KGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubDJ0LAotCQkJCQluZWlnaCwgcGRldiwgMCk7Ci0JCWVwLT5tdHUgPSBwZGV2LT5tdHU7Ci0JCWVwLT50eF9jaGFuID0gY3hnYjRfcG9ydF9jaGFuKHBkZXYpOwotCQllcC0+c21hY19pZHggPSAoY3hnYjRfcG9ydF92aWlkKHBkZXYpICYgMHg3RikgPDwgMTsKLQkJc3RlcCA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubnR4cSAvCi0JCSAgICAgICBlcC0+Y29tLmRldi0+cmRldi5sbGRpLm5jaGFuOwotCQllcC0+dHhxX2lkeCA9IGN4Z2I0X3BvcnRfaWR4KHBkZXYpICogc3RlcDsKLQkJc3RlcCA9IGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubnJ4cSAvCi0JCSAgICAgICBlcC0+Y29tLmRldi0+cmRldi5sbGRpLm5jaGFuOwotCQllcC0+Y3RybHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgocGRldik7Ci0JCWVwLT5yc3NfcWlkID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5yeHFfaWRzWwotCQkJICAgICAgY3hnYjRfcG9ydF9pZHgocGRldikgKiBzdGVwXTsKLQkJZGV2X3B1dChwZGV2KTsKLQl9IGVsc2UgewotCQllcC0+bDJ0ID0gY3hnYjRfbDJ0X2dldChlcC0+Y29tLmRldi0+cmRldi5sbGRpLmwydCwKLQkJCQkJbmVpZ2gsIG5laWdoLT5kZXYsIDApOwotCQllcC0+bXR1ID0gZHN0X210dShlcC0+ZHN0KTsKLQkJZXAtPnR4X2NoYW4gPSBjeGdiNF9wb3J0X2NoYW4obmVpZ2gtPmRldik7Ci0JCWVwLT5zbWFjX2lkeCA9IChjeGdiNF9wb3J0X3ZpaWQobmVpZ2gtPmRldikgJiAweDdGKSA8PCAxOwotCQlzdGVwID0gZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5udHhxIC8KLQkJICAgICAgIGVwLT5jb20uZGV2LT5yZGV2LmxsZGkubmNoYW47Ci0JCWVwLT50eHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgobmVpZ2gtPmRldikgKiBzdGVwOwotCQllcC0+Y3RybHFfaWR4ID0gY3hnYjRfcG9ydF9pZHgobmVpZ2gtPmRldik7Ci0JCXN0ZXAgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLm5yeHEgLwotCQkgICAgICAgZXAtPmNvbS5kZXYtPnJkZXYubGxkaS5uY2hhbjsKLQkJZXAtPnJzc19xaWQgPSBlcC0+Y29tLmRldi0+cmRldi5sbGRpLnJ4cV9pZHNbCi0JCQkgICAgICBjeGdiNF9wb3J0X2lkeChuZWlnaC0+ZGV2KSAqIHN0ZXBdOwotCQllcC0+cmV0cnlfd2l0aF9tcGFfdjEgPSAwOwotCQllcC0+dHJpZWRfd2l0aF9tcGFfdjEgPSAwOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQlpZiAoIWVwLT5sMnQpIHsKKwllcnIgPSBpbXBvcnRfZXAoZXAsIGNtX2lkLT5yZW1vdGVfYWRkci5zaW5fYWRkci5zX2FkZHIsCisJCQllcC0+ZHN0LCBlcC0+Y29tLmRldiwgdHJ1ZSk7CisJaWYgKGVycikgewogCQlwcmludGsoS0VSTl9FUlIgTU9EICIlcyAtIGNhbm5vdCBhbGxvYyBsMmUuXG4iLCBfX2Z1bmNfXyk7Ci0JCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZmFpbDQ7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWQuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCmluZGV4IGYzNmRhOTkuLjk1Yzk0ZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21hZC5jCkBAIC0xMDksNyArMTA5LDggQEAKIAogCWVyciA9IG1seDRfY21kX2JveChkZXYtPmRldiwgaW5tYWlsYm94LT5kbWEsIG91dG1haWxib3gtPmRtYSwKIAkJCSAgIGluX21vZGlmaWVyLCBvcF9tb2RpZmllciwKLQkJCSAgIE1MWDRfQ01EX01BRF9JRkMsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQyk7CisJCQkgICBNTFg0X0NNRF9NQURfSUZDLCBNTFg0X0NNRF9USU1FX0NMQVNTX0MsCisJCQkgICBNTFg0X0NNRF9OQVRJVkUpOwogCiAJaWYgKCFlcnIpCiAJCW1lbWNweShyZXNwb25zZV9tYWQsIG91dG1haWxib3gtPmJ1ZiwgMjU2KTsKQEAgLTMzMCw3ICszMzEsOCBAQAogCQlyZXR1cm4gSUJfTUFEX1JFU1VMVF9GQUlMVVJFOwogCiAJZXJyID0gbWx4NF9jbWRfYm94KGRldi0+ZGV2LCAwLCBtYWlsYm94LT5kbWEsIGlubW9kLCAwLAotCQkJICAgTUxYNF9DTURfUVVFUllfSUZfU1RBVCwgTUxYNF9DTURfVElNRV9DTEFTU19DKTsKKwkJCSAgIE1MWDRfQ01EX1FVRVJZX0lGX1NUQVQsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQywKKwkJCSAgIE1MWDRfQ01EX1dSQVBQRUQpOwogCWlmIChlcnIpCiAJCWVyciA9IElCX01BRF9SRVNVTFRfRkFJTFVSRTsKIAllbHNlIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9tbHg0L21haW4uYwppbmRleCA3N2YzZGJjLi43YjQ0NWRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbWx4NC9tYWluLmMKKysrIGIvZHJpdmVycy9pbmZpbmliYW5kL2h3L21seDQvbWFpbi5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIHsKIAlzdHJ1Y3QgbWx4NF9kZXYgKmRldiA9IHRvX21kZXYoZGV2aWNlKS0+ZGV2OwogCi0JcmV0dXJuIGRldi0+Y2Fwcy5wb3J0X21hc2sgJiAoMSA8PCAocG9ydF9udW0gLSAxKSkgPworCXJldHVybiBkZXYtPmNhcHMucG9ydF9tYXNrW3BvcnRfbnVtXSA9PSBNTFg0X1BPUlRfVFlQRV9JQiA/CiAJCUlCX0xJTktfTEFZRVJfSU5GSU5JQkFORCA6IElCX0xJTktfTEFZRVJfRVRIRVJORVQ7CiB9CiAKQEAgLTQzNCw3ICs0MzQsNyBAQAogCW1lbXNldChtYWlsYm94LT5idWYsIDAsIDI1Nik7CiAJbWVtY3B5KG1haWxib3gtPmJ1ZiwgcHJvcHMtPm5vZGVfZGVzYywgNjQpOwogCW1seDRfY21kKHRvX21kZXYoaWJkZXYpLT5kZXYsIG1haWxib3gtPmRtYSwgMSwgMCwKLQkJIE1MWDRfQ01EX1NFVF9OT0RFLCBNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCQkgTUxYNF9DTURfU0VUX05PREUsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfV1JBUFBFRCk7CiAKIAltbHg0X2ZyZWVfY21kX21haWxib3godG9fbWRldihpYmRldiktPmRldiwgbWFpbGJveCk7CiAKQEAgLTQ2Myw3ICs0NjMsNyBAQAogCX0KIAogCWVyciA9IG1seDRfY21kKGRldi0+ZGV2LCBtYWlsYm94LT5kbWEsIHBvcnQsIGlzX2V0aCwgTUxYNF9DTURfU0VUX1BPUlQsCi0JCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0IpOworCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19CLCBNTFg0X0NNRF9OQVRJVkUpOwogCiAJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldi0+ZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwpAQCAtODk5LDcgKzg5OSw4IEBACiAJbWVtY3B5KGdpZHMsIGd3LT5naWRzLCBzaXplb2YgZ3ctPmdpZHMpOwogCiAJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIE1MWDRfU0VUX1BPUlRfR0lEX1RBQkxFIDw8IDggfCBndy0+cG9ydCwKLQkJICAgICAgIDEsIE1MWDRfQ01EX1NFVF9QT1JULCBNTFg0X0NNRF9USU1FX0NMQVNTX0IpOworCQkgICAgICAgMSwgTUxYNF9DTURfU0VUX1BPUlQsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwKKwkJICAgICAgIE1MWDRfQ01EX05BVElWRSk7CiAJaWYgKGVycikKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAic2V0IHBvcnQgY29tbWFuZCBmYWlsZWRcbiIpOwogCWVsc2UgewpAQCAtMTA3NCw2ICsxMDc1LDExIEBACiAKIAlwcmludGtfb25jZShLRVJOX0lORk8gIiVzIiwgbWx4NF9pYl92ZXJzaW9uKTsKIAorCWlmIChtbHg0X2lzX21mdW5jKGRldikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiSUIgbm90IHlldCBzdXBwb3J0ZWQgaW4gU1JJT1ZcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKIAltbHg0X2ZvcmVhY2hfaWJfdHJhbnNwb3J0X3BvcnQoaSwgZGV2KQogCQludW1fcG9ydHMrKzsKIApAQCAtMTI0NCw3ICsxMjUwLDggQEAKIAogZXJyX2NvdW50ZXI6CiAJZm9yICg7IGk7IC0taSkKLQkJbWx4NF9jb3VudGVyX2ZyZWUoaWJkZXYtPmRldiwgaWJkZXYtPmNvdW50ZXJzW2kgLSAxXSk7CisJCWlmIChpYmRldi0+Y291bnRlcnNbaSAtIDFdICE9IC0xKQorCQkJbWx4NF9jb3VudGVyX2ZyZWUoaWJkZXYtPmRldiwgaWJkZXYtPmNvdW50ZXJzW2kgLSAxXSk7CiAKIGVycl9tYXA6CiAJaW91bm1hcChpYmRldi0+dWFyX21hcCk7CkBAIC0xMjc1LDcgKzEyODIsOCBAQAogCX0KIAlpb3VubWFwKGliZGV2LT51YXJfbWFwKTsKIAlmb3IgKHAgPSAwOyBwIDwgaWJkZXYtPm51bV9wb3J0czsgKytwKQotCQltbHg0X2NvdW50ZXJfZnJlZShpYmRldi0+ZGV2LCBpYmRldi0+Y291bnRlcnNbcF0pOworCQlpZiAoaWJkZXYtPmNvdW50ZXJzW3BdICE9IC0xKQorCQkJbWx4NF9jb3VudGVyX2ZyZWUoaWJkZXYtPmRldiwgaWJkZXYtPmNvdW50ZXJzW3BdKTsKIAltbHg0X2ZvcmVhY2hfcG9ydChwLCBkZXYsIE1MWDRfUE9SVF9UWVBFX0lCKQogCQltbHg0X0NMT1NFX1BPUlQoZGV2LCBwKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9uZXMvbmVzX2NtLmMKaW5kZXggMGE1MmQ3Mi4uYjFlNmNhZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfY20uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19jbS5jCkBAIC0xMzQ4LDcgKzEzNDgsOCBAQAogCWVsc2UKIAkJbmV0ZGV2ID0gbmVzdm5pYy0+bmV0ZGV2OwogCi0JbmVpZ2ggPSBuZWlnaF9sb29rdXAoJmFycF90YmwsICZydC0+cnRfZ2F0ZXdheSwgbmV0ZGV2KTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZigmcnQtPmRzdCk7CiAJaWYgKG5laWdoKSB7CiAJCWlmIChuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSB7CiAJCQluZXNfZGVidWcoTkVTX0RCR19DTSwgIk5laWdoYm9yIE1BQyBhZGRyZXNzIGZvciAweCUwOFgiCkBAIC0xMzU5LDcgKzEzNjAsNiBAQAogCQkJCWlmICghbWVtY21wKG5lc2FkYXB0ZXItPmFycF90YWJsZVthcnBpbmRleF0ubWFjX2FkZHIsCiAJCQkJCSAgICBuZWlnaC0+aGEsIEVUSF9BTEVOKSkgewogCQkJCQkvKiBNYWMgYWRkcmVzcyBzYW1lIGFzIGluIG5lc19hcnBfdGFibGUgKi8KLQkJCQkJbmVpZ2hfcmVsZWFzZShuZWlnaCk7CiAJCQkJCWlwX3J0X3B1dChydCk7CiAJCQkJCXJldHVybiByYzsKIAkJCQl9CkBAIC0xMzczLDE1ICsxMzczLDExIEBACiAJCQkJCSAgICAgZHN0X2lwLCBORVNfQVJQX0FERCk7CiAJCQlyYyA9IG5lc19hcnBfdGFibGUobmVzdm5pYy0+bmVzZGV2LCBkc3RfaXAsIE5VTEwsCiAJCQkJCSAgIE5FU19BUlBfUkVTT0xWRSk7CisJCX0gZWxzZSB7CisJCQluZWlnaF9ldmVudF9zZW5kKG5laWdoLCBOVUxMKTsKIAkJfQotCQluZWlnaF9yZWxlYXNlKG5laWdoKTsKIAl9Ci0KLQlpZiAoKG5laWdoID09IE5VTEwpIHx8ICghKG5laWdoLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSkgewotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW5laWdoX2V2ZW50X3NlbmQoZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpLCBOVUxMKTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JfQorCXJjdV9yZWFkX3VubG9jaygpOwogCWlwX3J0X3B1dChydCk7CiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L25lcy9uZXNfbmljLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYwppbmRleCBjMDBkMmYzLi40YjNmYTcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvbmVzL25lc19uaWMuYwpAQCAtMTU4OSw3ICsxNTg5LDcgQEAKIAkuc2V0X3BhdXNlcGFyYW0gPSBuZXNfbmV0ZGV2X3NldF9wYXVzZXBhcmFtLAogfTsKIAotc3RhdGljIHZvaWQgbmVzX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgdm9pZCBuZXNfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBuZXNfZGV2aWNlICpuZXNkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBuZXNfYWRhcHRlciAqbmVzYWRhcHRlciA9IG5lc2Rldi0+bmVzYWRhcHRlcjsKIAl1MzIgdTMydGVtcDsKQEAgLTE2MTAsNyArMTYxMCw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbmVzYWRhcHRlci0+cGh5X2xvY2ssIGZsYWdzKTsKIH0KIAotc3RhdGljIHUzMiBuZXNfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBuZXNfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCS8qCiAJICogU2luY2UgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2VwYXJhdGUgcngvdHggdmxhbiBhY2NlbApAQCAtMTYyNCw3ICsxNjI0LDcgQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLXN0YXRpYyBpbnQgbmVzX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgaW50IG5lc19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IG5lc192bmljICpuZXN2bmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgbmVzX2RldmljZSAqbmVzZGV2ID0gbmVzdm5pYy0+bmVzZGV2OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYyBiL2RyaXZlcnMvaW5maW5pYmFuZC9ody9xaWIvcWliX2ZpbGVfb3BzLmMKaW5kZXggNTc0NjAwZS4uYTc0MDMyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbmZpbmliYW5kL2h3L3FpYi9xaWJfZmlsZV9vcHMuYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvaHcvcWliL3FpYl9maWxlX29wcy5jCkBAIC0xMjg1LDcgKzEyODUsNyBAQAogCXN0cmxjcHkocmNkLT5jb21tLCBjdXJyZW50LT5jb21tLCBzaXplb2YocmNkLT5jb21tKSk7CiAJY3R4dF9mcChmcCkgPSByY2Q7CiAJcWliX3N0YXRzLnNwc19jdHh0cysrOwotCWRkLT5mcmVlY3R4dHMrKzsKKwlkZC0+ZnJlZWN0eHRzLS07CiAJcmV0ID0gMDsKIAlnb3RvIGJhaWw7CiAKQEAgLTE3OTQsNyArMTc5NCw3IEBACiAJCWlmIChkZC0+cGFnZXNoYWRvdykKIAkJCXVubG9ja19leHBlY3RlZF90aWRzKHJjZCk7CiAJCXFpYl9zdGF0cy5zcHNfY3R4dHMtLTsKLQkJZGQtPmZyZWVjdHh0cy0tOworCQlkZC0+ZnJlZWN0eHRzKys7CiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZxaWJfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tYWluLmMgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwppbmRleCA4MzY5NWI0Li4zNTE0Y2EwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYworKysgYi9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX21haW4uYwpAQCAtMTcxLDcgKzE3MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgaXBvaWJfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBpcG9pYl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtNTU2LDE1ICs1NTYsMTMgQEAKIH0KIAogLyogY2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayAqLwotc3RhdGljIHZvaWQgbmVpZ2hfYWRkX3BhdGgoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIG5laWdoX2FkZF9wYXRoKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZWlnaGJvdXIgKm4sIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGlwb2liX2Rldl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaXBvaWJfcGF0aCAqcGF0aDsKIAlzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoOwotCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCW4gPSBkc3RfZ2V0X25laWdoYm91cihza2JfZHN0KHNrYikpOwogCW5laWdoID0gaXBvaWJfbmVpZ2hfYWxsb2Mobiwgc2tiLT5kZXYpOwogCWlmICghbmVpZ2gpIHsKIAkJKytkZXYtPnN0YXRzLnR4X2Ryb3BwZWQ7CkBAIC02MzgsMTYgKzYzNiwxMyBAQAogfQogCiAvKiBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrICovCi1zdGF0aWMgdm9pZCBpcG9pYl9wYXRoX2xvb2t1cChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIHZvaWQgaXBvaWJfcGF0aF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5laWdoYm91ciAqbiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgaXBvaWJfZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihza2ItPmRldik7Ci0Jc3RydWN0IGRzdF9lbnRyeSAqZHN0ID0gc2tiX2RzdChza2IpOwotCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAKIAkvKiBMb29rIHVwIHBhdGggcmVjb3JkIGZvciB1bmljYXN0cyAqLwotCW4gPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOwogCWlmIChuLT5oYVs0XSAhPSAweGZmKSB7Ci0JCW5laWdoX2FkZF9wYXRoKHNrYiwgZGV2KTsKKwkJbmVpZ2hfYWRkX3BhdGgoc2tiLCBuLCBkZXYpOwogCQlyZXR1cm47CiAJfQogCkBAIC03MjMsMTIgKzcxOCwxNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JaWYgKGxpa2VseShza2JfZHN0KHNrYikpKQotCQluID0gZHN0X2dldF9uZWlnaGJvdXIoc2tiX2RzdChza2IpKTsKLQorCWlmIChsaWtlbHkoc2tiX2RzdChza2IpKSkgeworCQluID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoc2tiX2RzdChza2IpKTsKKwkJaWYgKCFuKSB7CisJCQkrK2Rldi0+c3RhdHMudHhfZHJvcHBlZDsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCX0KIAlpZiAobGlrZWx5KG4pKSB7CiAJCWlmICh1bmxpa2VseSghKnRvX2lwb2liX25laWdoKG4pKSkgewotCQkJaXBvaWJfcGF0aF9sb29rdXAoc2tiLCBkZXYpOworCQkJaXBvaWJfcGF0aF9sb29rdXAoc2tiLCBuLCBkZXYpOwogCQkJZ290byB1bmxvY2s7CiAJCX0KIApAQCAtNzUxLDcgKzc1MSw3IEBACiAJCQlsaXN0X2RlbCgmbmVpZ2gtPmxpc3QpOwogCQkJaXBvaWJfbmVpZ2hfZnJlZShkZXYsIG5laWdoKTsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCWlwb2liX3BhdGhfbG9va3VwKHNrYiwgZGV2KTsKKwkJCWlwb2liX3BhdGhfbG9va3VwKHNrYiwgbiwgZGV2KTsKIAkJCWdvdG8gdW5sb2NrOwogCQl9CiAKQEAgLTg0MSw3ICs4NDEsNyBAQAogCWRzdCA9IHNrYl9kc3Qoc2tiKTsKIAluID0gTlVMTDsKIAlpZiAoZHN0KQotCQluID0gZHN0X2dldF9uZWlnaGJvdXJfcmF3KGRzdCk7CisJCW4gPSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZl9yYXcoZHN0KTsKIAlpZiAoKCFkc3QgfHwgIW4pICYmIGRhZGRyKSB7CiAJCXN0cnVjdCBpcG9pYl9wc2V1ZG9oZWFkZXIgKnBoZHIgPQogCQkJKHN0cnVjdCBpcG9pYl9wc2V1ZG9oZWFkZXIgKikgc2tiX3B1c2goc2tiLCBzaXplb2YgKnBoZHIpOwpAQCAtMTIyMiw2ICsxMjIyLDggQEAKIAlwcml2LT5kZXYtPm10dSAgPSBJUE9JQl9VRF9NVFUocHJpdi0+bWF4X2liX210dSk7CiAJcHJpdi0+bWNhc3RfbXR1ICA9IHByaXYtPmFkbWluX210dSA9IHByaXYtPmRldi0+bXR1OwogCisJcHJpdi0+ZGV2LT5uZWlnaF9wcml2X2xlbiA9IHNpemVvZihzdHJ1Y3QgaXBvaWJfbmVpZ2gpOworCiAJcmVzdWx0ID0gaWJfcXVlcnlfcGtleShoY2EsIHBvcnQsIDAsICZwcml2LT5wa2V5KTsKIAlpZiAocmVzdWx0KSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiBpYl9xdWVyeV9wa2V5IHBvcnQgJWQgZmFpbGVkIChyZXQgPSAlZClcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jIGIvZHJpdmVycy9pbmZpbmliYW5kL3VscC9pcG9pYi9pcG9pYl9tdWx0aWNhc3QuYwppbmRleCA4NzNiZmY5Li5mN2ZmOWRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2luZmluaWJhbmQvdWxwL2lwb2liL2lwb2liX211bHRpY2FzdC5jCisrKyBiL2RyaXZlcnMvaW5maW5pYmFuZC91bHAvaXBvaWIvaXBvaWJfbXVsdGljYXN0LmMKQEAgLTI2OSw3ICsyNjksNyBAQAogCiAJCXNrYi0+ZGV2ID0gZGV2OwogCQlpZiAoZHN0KQotCQkJbiA9IGRzdF9nZXRfbmVpZ2hib3VyX3Jhdyhkc3QpOworCQkJbiA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmX3Jhdyhkc3QpOwogCQlpZiAoIWRzdCB8fCAhbikgewogCQkJLyogcHV0IHBzZXVkb2hlYWRlciBiYWNrIG9uIGZvciBuZXh0IHRpbWUgKi8KIAkJCXNrYl9wdXNoKHNrYiwgc2l6ZW9mIChzdHJ1Y3QgaXBvaWJfcHNldWRvaGVhZGVyKSk7CkBAIC03MjgsNyArNzI4LDcgQEAKIAogCQlyY3VfcmVhZF9sb2NrKCk7CiAJCWlmIChkc3QpCi0JCQluID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwkJCW4gPSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZihkc3QpOwogCQlpZiAobiAmJiAhKnRvX2lwb2liX25laWdoKG4pKSB7CiAJCQlzdHJ1Y3QgaXBvaWJfbmVpZ2ggKm5laWdoID0gaXBvaWJfbmVpZ2hfYWxsb2MobiwKIAkJCQkJCQkJICAgICAgc2tiLT5kZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pbnB1dC9taXNjL2NtYTMwMDBfZDB4LmMgYi9kcml2ZXJzL2lucHV0L21pc2MvY21hMzAwMF9kMHguYwppbmRleCA4MDc5M2YxLi4wNjUxN2U2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21pc2MvY21hMzAwMF9kMHguYworKysgYi9kcml2ZXJzL2lucHV0L21pc2MvY21hMzAwMF9kMHguYwpAQCAtMTE1LDggKzExNSw4IEBACiBzdGF0aWMgaXJxcmV0dXJuX3QgY21hMzAwMF90aHJlYWRfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKIHsKIAlzdHJ1Y3QgY21hMzAwMF9hY2NsX2RhdGEgKmRhdGEgPSBkZXZfaWQ7Ci0JaW50IGRhdGF4LCBkYXRheSwgZGF0YXo7Ci0JdTggY3RybCwgbW9kZSwgcmFuZ2UsIGludHJfc3RhdHVzOworCWludCBkYXRheCwgZGF0YXksIGRhdGF6LCBpbnRyX3N0YXR1czsKKwl1OCBjdHJsLCBtb2RlLCByYW5nZTsKIAogCWludHJfc3RhdHVzID0gQ01BMzAwMF9SRUFEKGRhdGEsIENNQTMwMDBfSU5UU1RBVFVTLCAiaW50ZXJydXB0IHN0YXR1cyIpOwogCWlmIChpbnRyX3N0YXR1cyA8IDApCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3NlbnRlbGljLmMgYi9kcml2ZXJzL2lucHV0L21vdXNlL3NlbnRlbGljLmMKaW5kZXggYzViMTJkMi4uODZkNmYzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zZW50ZWxpYy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VudGVsaWMuYwpAQCAtMiw3ICsyLDcgQEAKICAqIEZpbmdlciBTZW5zaW5nIFBhZCBQUy8yIG1vdXNlIGRyaXZlci4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBBc2lhIFZpdGFsIENvbXBvbmVudHMgQ28uLCBMdGQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAxMCBUYWktaHdhIExpYW5nLCBTZW50ZWxpYyBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDExIFRhaS1od2EgTGlhbmcsIFNlbnRlbGljIENvcnBvcmF0aW9uLgogICoKICAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtMTYyLDcgKzE2Miw3IEBACiAJcHMyX3NlbmRieXRlKHBzMmRldiwgdiwgRlNQX0NNRF9USU1FT1VUMik7CiAKIAlpZiAocHMyX3NlbmRieXRlKHBzMmRldiwgMHhmMywgRlNQX0NNRF9USU1FT1VUKSA8IDApCi0JCXJldHVybiAtMTsKKwkJZ290byBvdXQ7CiAKIAlpZiAoKHYgPSBmc3BfdGVzdF9pbnZlcnRfY21kKHJlZ192YWwpKSAhPSByZWdfdmFsKSB7CiAJCS8qIGludmVyc2lvbiBpcyByZXF1aXJlZCAqLwpAQCAtMjYxLDcgKzI2MSw3IEBACiAJcHMyX3NlbmRieXRlKHBzMmRldiwgMHg4OCwgRlNQX0NNRF9USU1FT1VUMik7CiAKIAlpZiAocHMyX3NlbmRieXRlKHBzMmRldiwgMHhmMywgRlNQX0NNRF9USU1FT1VUKSA8IDApCi0JCXJldHVybiAtMTsKKwkJZ290byBvdXQ7CiAKIAlpZiAoKHYgPSBmc3BfdGVzdF9pbnZlcnRfY21kKHJlZ192YWwpKSAhPSByZWdfdmFsKSB7CiAJCXBzMl9zZW5kYnl0ZShwczJkZXYsIDB4NDcsIEZTUF9DTURfVElNRU9VVDIpOwpAQCAtMzA5LDcgKzMwOSw3IEBACiAJfTsKIAlpbnQgdmFsOwogCi0JaWYgKGZzcF9yZWdfcmVhZChwc21vdXNlLCBGU1BfUkVHX1RNT0RfU1RBVFVTMSwgJnZhbCkgPT0gLTEpCisJaWYgKGZzcF9yZWdfcmVhZChwc21vdXNlLCBGU1BfUkVHX1RNT0RfU1RBVFVTLCAmdmFsKSA9PSAtMSkKIAkJcmV0dXJuIC1FSU87CiAKIAkqYnRuID0gYnV0dG9uc1sodmFsICYgMHgzMCkgPj4gNF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3NlbnRlbGljLmggYi9kcml2ZXJzL2lucHV0L21vdXNlL3NlbnRlbGljLmgKaW5kZXggZWQxMzk1YS4uMmU0YWYyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC9tb3VzZS9zZW50ZWxpYy5oCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc2VudGVsaWMuaApAQCAtMiw3ICsyLDcgQEAKICAqIEZpbmdlciBTZW5zaW5nIFBhZCBQUy8yIG1vdXNlIGRyaXZlci4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNyBBc2lhIFZpdGFsIENvbXBvbmVudHMgQ28uLCBMdGQuCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwOSBUYWktaHdhIExpYW5nLCBTZW50ZWxpYyBDb3Jwb3JhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAwNS0yMDExIFRhaS1od2EgTGlhbmcsIFNlbnRlbGljIENvcnBvcmF0aW9uLgogICoKICAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQpAQCAtMzMsNiArMzMsNyBAQAogLyogRmluZ2VyLXNlbnNpbmcgUGFkIGNvbnRyb2wgcmVnaXN0ZXJzICovCiAjZGVmaW5lCUZTUF9SRUdfU1lTQ1RMMQkJMHgxMAogI2RlZmluZQlGU1BfQklUX0VOX1JFR19DTEsJQklUKDUpCisjZGVmaW5lCUZTUF9SRUdfVE1PRF9TVEFUVVMJMHgyMAogI2RlZmluZQlGU1BfUkVHX09QQ19RRE9XTgkweDMxCiAjZGVmaW5lCUZTUF9CSVRfRU5fT1BDX1RBRwlCSVQoNykKICNkZWZpbmUJRlNQX1JFR19PUFRaX1hMTwkweDM0CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jIGIvZHJpdmVycy9pbnB1dC9tb3VzZS9zeW5hcHRpY3MuYwppbmRleCBjMDgwYjgyLi5hNmRjZDE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lucHV0L21vdXNlL3N5bmFwdGljcy5jCisrKyBiL2RyaXZlcnMvaW5wdXQvbW91c2Uvc3luYXB0aWNzLmMKQEAgLTI0LDYgKzI0LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9pbnB1dC9tdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcmlvLmg+CkBAIC0xMjIwLDYgKzEyMjEsMTYgQEAKIAogCWRvIHsKIAkJcHNtb3VzZV9yZXNldChwc21vdXNlKTsKKwkJaWYgKHJldHJ5KSB7CisJCQkvKgorCQkJICogT24gc29tZSBib3hlcywgcmlnaHQgYWZ0ZXIgcmVzdW1pbmcsIHRoZSB0b3VjaHBhZAorCQkJICogbmVlZHMgc29tZSB0aW1lIHRvIGZpbmlzaCBpbml0aWFsaXppbmcgKEkgYXNzdW1lCisJCQkgKiBpdCBuZWVkcyB0aW1lIHRvIGNhbGlicmF0ZSkgYW5kIHN0YXJ0IHJlc3BvbmRpbmcKKwkJCSAqIHRvIFN5bmFwdGljcy1zcGVjaWZpYyBxdWVyaWVzLCBzbyBsZXQncyB3YWl0IGEKKwkJCSAqIGJpdC4KKwkJCSAqLworCQkJc3NsZWVwKDEpOworCQl9CiAJCWVycm9yID0gc3luYXB0aWNzX2RldGVjdChwc21vdXNlLCAwKTsKIAl9IHdoaWxlIChlcnJvciAmJiArK3JldHJ5IDwgMyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdGFibGV0L3dhY29tX3dhYy5jIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKaW5kZXggZGEwZDg3Ni4uMmVlNDdkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKKysrIGIvZHJpdmVycy9pbnB1dC90YWJsZXQvd2Fjb21fd2FjLmMKQEAgLTE0NzAsNiArMTQ3MCw5IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHdhY29tX2ZlYXR1cmVzIHdhY29tX2ZlYXR1cmVzXzB4RTYgPQogCXsgIldhY29tIElTRHY0IEU2IiwgICAgICAgV0FDT01fUEtHTEVOX1RQQzJGRywgICAgMjc3NjAsIDE1Njk0LCAgMjU1LAogCSAgMCwgVEFCTEVUUEMyRkcsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2Fjb21fZmVhdHVyZXMgd2Fjb21fZmVhdHVyZXNfMHhFQyA9CisJeyAiV2Fjb20gSVNEdjQgRUMiLCAgICAgICBXQUNPTV9QS0dMRU5fR1JBUEhJUkUsICAyNTcxMCwgMTQ1MDAsICAyNTUsCisJICAwLCBUQUJMRVRQQywgICAgV0FDT01fSU5UVU9TX1JFUywgV0FDT01fSU5UVU9TX1JFUyB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCB3YWNvbV9mZWF0dXJlcyB3YWNvbV9mZWF0dXJlc18weDQ3ID0KIAl7ICJXYWNvbSBJbnR1b3MyIDZ4OCIsICAgIFdBQ09NX1BLR0xFTl9JTlRVT1MsICAgIDIwMzIwLCAxNjI0MCwgMTAyMywKIAkgIDMxLCBJTlRVT1MsIFdBQ09NX0lOVFVPU19SRVMsIFdBQ09NX0lOVFVPU19SRVMgfTsKQEAgLTE2MTEsNiArMTYxNCw3IEBACiAJeyBVU0JfREVWSUNFX1dBQ09NKDB4RTIpIH0sCiAJeyBVU0JfREVWSUNFX1dBQ09NKDB4RTMpIH0sCiAJeyBVU0JfREVWSUNFX1dBQ09NKDB4RTYpIH0sCisJeyBVU0JfREVWSUNFX1dBQ09NKDB4RUMpIH0sCiAJeyBVU0JfREVWSUNFX1dBQ09NKDB4NDcpIH0sCiAJeyBVU0JfREVWSUNFX0xFTk9WTygweDYwMDQpIH0sCiAJeyB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2ludGVsLWlvbW11LmMgYi9kcml2ZXJzL2lvbW11L2ludGVsLWlvbW11LmMKaW5kZXggYzBjNzgyMC4uMzEwNTNhOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9pbnRlbC1pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvaW50ZWwtaW9tbXUuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3Rib290Lmg+CiAjaW5jbHVkZSA8bGludXgvZG1pLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLWF0cy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vaW9tbXUuaD4KIApAQCAtNDA1LDYgKzQwNiw5IEBACiBpbnQgZG1hcl9kaXNhYmxlZCA9IDE7CiAjZW5kaWYgLypDT05GSUdfSU5URUxfSU9NTVVfREVGQVVMVF9PTiovCiAKK2ludCBpbnRlbF9pb21tdV9lbmFibGVkID0gMDsKK0VYUE9SVF9TWU1CT0xfR1BMKGludGVsX2lvbW11X2VuYWJsZWQpOworCiBzdGF0aWMgaW50IGRtYXJfbWFwX2dmeCA9IDE7CiBzdGF0aWMgaW50IGRtYXJfZm9yY2VkYWM7CiBzdGF0aWMgaW50IGludGVsX2lvbW11X3N0cmljdDsKQEAgLTIxODUsMTggKzIxODksNiBAQAogCiBzdGF0aWMgaW50IG1kX2RvbWFpbl9pbml0KHN0cnVjdCBkbWFyX2RvbWFpbiAqZG9tYWluLCBpbnQgZ3Vlc3Rfd2lkdGgpOwogCi1zdGF0aWMgaW50IF9faW5pdCBzaV9kb21haW5fd29ya19mbih1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKLQkJCQkgICAgdW5zaWduZWQgbG9uZyBlbmRfcGZuLCB2b2lkICpkYXRheCkKLXsKLQlpbnQgKnJldCA9IGRhdGF4OwotCi0JKnJldCA9IGlvbW11X2RvbWFpbl9pZGVudGl0eV9tYXAoc2lfZG9tYWluLAotCQkJCQkgKHVpbnQ2NF90KXN0YXJ0X3BmbiA8PCBQQUdFX1NISUZULAotCQkJCQkgKHVpbnQ2NF90KWVuZF9wZm4gPDwgUEFHRV9TSElGVCk7Ci0JcmV0dXJuICpyZXQ7Ci0KLX0KLQogc3RhdGljIGludCBfX2luaXQgc2lfZG9tYWluX2luaXQoaW50IGh3KQogewogCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKQEAgLTIyMjgsOSArMjIyMCwxNSBAQAogCQlyZXR1cm4gMDsKIAogCWZvcl9lYWNoX29ubGluZV9ub2RlKG5pZCkgewotCQl3b3JrX3dpdGhfYWN0aXZlX3JlZ2lvbnMobmlkLCBzaV9kb21haW5fd29ya19mbiwgJnJldCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OworCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKKwkJaW50IGk7CisKKwkJZm9yX2VhY2hfbWVtX3Bmbl9yYW5nZShpLCBuaWQsICZzdGFydF9wZm4sICZlbmRfcGZuLCBOVUxMKSB7CisJCQlyZXQgPSBpb21tdV9kb21haW5faWRlbnRpdHlfbWFwKHNpX2RvbWFpbiwKKwkJCQkJUEZOX1BIWVMoc3RhcnRfcGZuKSwgUEZOX1BIWVMoZW5kX3BmbikpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0zNTI0LDcgKzM1MjIsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgZG1hcl9wYXJzZV9ybXJyX2F0c3JfZGV2KHZvaWQpCitpbnQgX19pbml0IGRtYXJfcGFyc2Vfcm1ycl9hdHNyX2Rldih2b2lkKQogewogCXN0cnVjdCBkbWFyX3JtcnJfdW5pdCAqcm1yciwgKnJtcnJfbjsKIAlzdHJ1Y3QgZG1hcl9hdHNyX3VuaXQgKmF0c3IsICphdHNyX247CkBAIC0zNjQ3LDYgKzM2NDUsOCBAQAogCiAJYnVzX3JlZ2lzdGVyX25vdGlmaWVyKCZwY2lfYnVzX3R5cGUsICZkZXZpY2VfbmIpOwogCisJaW50ZWxfaW9tbXVfZW5hYmxlZCA9IDE7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9pbnRyX3JlbWFwcGluZy5jIGIvZHJpdmVycy9pb21tdS9pbnRyX3JlbWFwcGluZy5jCmluZGV4IDA3YzlmMTguLjY3NzdjYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaW9tbXUvaW50cl9yZW1hcHBpbmcuYworKysgYi9kcml2ZXJzL2lvbW11L2ludHJfcmVtYXBwaW5nLmMKQEAgLTc3Myw3ICs3NzMsNyBAQAogCXJldHVybiBpcl9zdXBwb3J0ZWQ7CiB9CiAKLWludCBpcl9kZXZfc2NvcGVfaW5pdCh2b2lkKQoraW50IF9faW5pdCBpcl9kZXZfc2NvcGVfaW5pdCh2b2lkKQogewogCWlmICghaW50cl9yZW1hcHBpbmdfZW5hYmxlZCkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2lvbW11LmMgYi9kcml2ZXJzL2lvbW11L2lvbW11LmMKaW5kZXggMmZiMjk2My4uNWI1ZmE1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9pb21tdS9pb21tdS5jCisrKyBiL2RyaXZlcnMvaW9tbXUvaW9tbXUuYwpAQCAtOTAsNyArOTAsNyBAQAogCWlmIChidXMgPT0gTlVMTCB8fCBidXMtPmlvbW11X29wcyA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWRvbWFpbiA9IGttYWxsb2Moc2l6ZW9mKCpkb21haW4pLCBHRlBfS0VSTkVMKTsKKwlkb21haW4gPSBremFsbG9jKHNpemVvZigqZG9tYWluKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFkb21haW4pCiAJCXJldHVybiBOVUxMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2lzZG4vZGl2ZXJ0L2RpdmVydF9wcm9jZnMuYyBiL2RyaXZlcnMvaXNkbi9kaXZlcnQvZGl2ZXJ0X3Byb2Nmcy5jCmluZGV4IDMzZWM5ZTQuLjkwMjExODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9kaXZlcnQvZGl2ZXJ0X3Byb2Nmcy5jCisrKyBiL2RyaXZlcnMvaXNkbi9kaXZlcnQvZGl2ZXJ0X3Byb2Nmcy5jCkBAIC0yNDIsNiArMjQyLDEyIEBACiAJCWNhc2UgSUlPQ0RPQ0ZJTlQ6CiAJCQlpZiAoIWRpdmVydF9pZi5kcnZfdG9fbmFtZShkaW9jdGwuY2ZfY3RybC5kcnZpZCkpCiAJCQkJcmV0dXJuICgtRUlOVkFMKTsJLyogaW52YWxpZCBkcml2ZXIgKi8KKwkJCWlmIChzdHJubGVuKGRpb2N0bC5jZl9jdHJsLm1zbiwgc2l6ZW9mKGRpb2N0bC5jZl9jdHJsLm1zbikpID09CisJCQkJCXNpemVvZihkaW9jdGwuY2ZfY3RybC5tc24pKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHN0cm5sZW4oZGlvY3RsLmNmX2N0cmwuZndkX25yLCBzaXplb2YoZGlvY3RsLmNmX2N0cmwuZndkX25yKSkgPT0KKwkJCQkJc2l6ZW9mKGRpb2N0bC5jZl9jdHJsLmZ3ZF9ucikpCisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQlpZiAoKGkgPSBjZl9jb21tYW5kKGRpb2N0bC5jZl9jdHJsLmRydmlkLAogCQkJCQkgICAgKGNtZCA9PSBJSU9DRE9DRkFDVCkgPyAxIDogKGNtZCA9PSBJSU9DRE9DRkRJUykgPyAwIDogMiwKIAkJCQkJICAgIGRpb2N0bC5jZl9jdHJsLmNmcHJvYywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9naWdhc2V0L2k0bC5jIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMKaW5kZXggMDQyMzFjYi4uMTc5M2JhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMKKysrIGIvZHJpdmVycy9pc2RuL2dpZ2FzZXQvaTRsLmMKQEAgLTYyNCw4ICs2MjQsNiBAQAogewogCWlzZG5faWYgKmlpZjsKIAotCXByX2luZm8oIklTRE40TGludXggaW50ZXJmYWNlXG4iKTsKLQogCWlpZiA9IGttYWxsb2Moc2l6ZW9mICppaWYsIEdGUF9LRVJORUwpOwogCWlmICghaWlmKSB7CiAJCXByX2Vycigib3V0IG9mIG1lbW9yeVxuIik7CkBAIC02ODQsNiArNjgyLDcgQEAKICAqLwogdm9pZCBnaWdhc2V0X2lzZG5fcmVnZHJ2KHZvaWQpCiB7CisJcHJfaW5mbygiSVNETjRMaW51eCBpbnRlcmZhY2VcbiIpOwogCS8qIG5vdGhpbmcgdG8gZG8gKi8KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jIGIvZHJpdmVycy9pc2RuL2k0bC9pc2RuX25ldC5jCmluZGV4IDFmNzNkN2YuLjIzMzlkNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvaXNkbi9pNGwvaXNkbl9uZXQuYworKysgYi9kcml2ZXJzL2lzZG4vaTRsL2lzZG5fbmV0LmMKQEAgLTI3NTYsNiArMjc1Niw5IEBACiAJCQljaGFyICpjLAogCQkJKmU7CiAKKwkJCWlmIChzdHJubGVuKGNmZy0+ZHJ2aWQsIHNpemVvZihjZmctPmRydmlkKSkgPT0KKwkJCQkJc2l6ZW9mKGNmZy0+ZHJ2aWQpKQorCQkJCXJldHVybiAtRUlOVkFMOwogCQkJZHJ2aWR4ID0gLTE7CiAJCQljaGlkeCA9IC0xOwogCQkJc3RyY3B5KGRydmlkLCBjZmctPmRydmlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYyBiL2RyaXZlcnMvbGd1ZXN0L2xndWVzdF9kZXZpY2UuYwppbmRleCAwZGMzMGZmLi41OTVkNzMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC9sZ3Vlc3RfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9sZ3Vlc3QvbGd1ZXN0X2RldmljZS5jCkBAIC0zODEsNiArMzgxLDExIEBACiAJcmV0dXJuIFBUUl9FUlIodnFzW2ldKTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmxnX2J1c19uYW1lKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KQoreworCXJldHVybiAiIjsKK30KKwogLyogVGhlIG9wcyBzdHJ1Y3R1cmUgd2hpY2ggaG9va3MgZXZlcnl0aGluZyB0b2dldGhlci4gKi8KIHN0YXRpYyBzdHJ1Y3QgdmlydGlvX2NvbmZpZ19vcHMgbGd1ZXN0X2NvbmZpZ19vcHMgPSB7CiAJLmdldF9mZWF0dXJlcyA9IGxnX2dldF9mZWF0dXJlcywKQEAgLTM5Miw2ICszOTcsNyBAQAogCS5yZXNldCA9IGxnX3Jlc2V0LAogCS5maW5kX3ZxcyA9IGxnX2ZpbmRfdnFzLAogCS5kZWxfdnFzID0gbGdfZGVsX3ZxcywKKwkuYnVzX25hbWUgPSBsZ19idXNfbmFtZSwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL2xndWVzdC94ODYvY29yZS5jIGIvZHJpdmVycy9sZ3Vlc3QveDg2L2NvcmUuYwppbmRleCA2NWFmNDJmLi4zOTgwOTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2xndWVzdC94ODYvY29yZS5jCisrKyBiL2RyaXZlcnMvbGd1ZXN0L3g4Ni9jb3JlLmMKQEAgLTY5Nyw3ICs2OTcsNyBAQAogCSAqIGludGVycnVwdHMgYXJlIGVuYWJsZWQuICBXZSBhbHdheXMgbGVhdmUgaW50ZXJydXB0cyBlbmFibGVkIHdoaWxlCiAJICogcnVubmluZyB0aGUgR3Vlc3QuCiAJICovCi0JcmVncy0+ZWZsYWdzID0gWDg2X0VGTEFHU19JRiB8IDB4MjsKKwlyZWdzLT5lZmxhZ3MgPSBYODZfRUZMQUdTX0lGIHwgWDg2X0VGTEFHU19CSVQxOwogCiAJLyoKIAkgKiBUaGUgIkV4dGVuZGVkIEluc3RydWN0aW9uIFBvaW50ZXIiIHJlZ2lzdGVyIHNheXMgd2hlcmUgdGhlIEd1ZXN0IGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL21hY2ludG9zaC9yYWNrLW1ldGVyLmMgYi9kcml2ZXJzL21hY2ludG9zaC9yYWNrLW1ldGVyLmMKaW5kZXggMjYzN2MxMy4uNmRjMjZiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tYWNpbnRvc2gvcmFjay1tZXRlci5jCisrKyBiL2RyaXZlcnMvbWFjaW50b3NoL3JhY2stbWV0ZXIuYwpAQCAtODEsMTMgKzgxLDEzIEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgY3B1dGltZTY0X3QgZ2V0X2NwdV9pZGxlX3RpbWUodW5zaWduZWQgaW50IGNwdSkKIHsKLQljcHV0aW1lNjRfdCByZXR2YWw7CisJdTY0IHJldHZhbDsKIAotCXJldHZhbCA9IGNwdXRpbWU2NF9hZGQoa3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5pZGxlLAotCQkJa3N0YXRfY3B1KGNwdSkuY3B1c3RhdC5pb3dhaXQpOworCXJldHZhbCA9IGtjcHVzdGF0X2NwdShjcHUpLmNwdXN0YXRbQ1BVVElNRV9JRExFXSArCisJCSBrY3B1c3RhdF9jcHUoY3B1KS5jcHVzdGF0W0NQVVRJTUVfSU9XQUlUXTsKIAogCWlmIChyYWNrbWV0ZXJfaWdub3JlX25pY2UpCi0JCXJldHZhbCA9IGNwdXRpbWU2NF9hZGQocmV0dmFsLCBrc3RhdF9jcHUoY3B1KS5jcHVzdGF0Lm5pY2UpOworCQlyZXR2YWwgKz0ga2NwdXN0YXRfY3B1KGNwdSkuY3B1c3RhdFtDUFVUSU1FX05JQ0VdOwogCiAJcmV0dXJuIHJldHZhbDsKIH0KQEAgLTIyMCwxMyArMjIwLDExIEBACiAJaW50IGksIG9mZnNldCwgbG9hZCwgY3VtbSwgcGF1c2U7CiAKIAljdXJfamlmZmllcyA9IGppZmZpZXM2NF90b19jcHV0aW1lNjQoZ2V0X2ppZmZpZXNfNjQoKSk7Ci0JdG90YWxfdGlja3MgPSAodW5zaWduZWQgaW50KWNwdXRpbWU2NF9zdWIoY3VyX2ppZmZpZXMsCi0JCQkJCQkgIHJjcHUtPnByZXZfd2FsbCk7CisJdG90YWxfdGlja3MgPSAodW5zaWduZWQgaW50KSAoY3VyX2ppZmZpZXMgLSByY3B1LT5wcmV2X3dhbGwpOwogCXJjcHUtPnByZXZfd2FsbCA9IGN1cl9qaWZmaWVzOwogCiAJdG90YWxfaWRsZV90aWNrcyA9IGdldF9jcHVfaWRsZV90aW1lKGNwdSk7Ci0JaWRsZV90aWNrcyA9ICh1bnNpZ25lZCBpbnQpIGNwdXRpbWU2NF9zdWIodG90YWxfaWRsZV90aWNrcywKLQkJCQlyY3B1LT5wcmV2X2lkbGUpOworCWlkbGVfdGlja3MgPSAodW5zaWduZWQgaW50KSAodG90YWxfaWRsZV90aWNrcyAtIHJjcHUtPnByZXZfaWRsZSk7CiAJcmNwdS0+cHJldl9pZGxlID0gdG90YWxfaWRsZV90aWNrczsKIAogCS8qIFdlIGRvIGEgdmVyeSBkdW1iIGNhbGN1bGF0aW9uIHRvIHVwZGF0ZSB0aGUgTEVEcyBmb3Igbm93LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iaXRtYXAuYyBiL2RyaXZlcnMvbWQvYml0bWFwLmMKaW5kZXggNzg3ODcxMi4uNmQwMzc3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iaXRtYXAuYworKysgYi9kcml2ZXJzL21kL2JpdG1hcC5jCkBAIC0xMTA2LDEwICsxMTA2LDEyIEBACiAJICovCiAJaW50IGk7CiAKKwlzcGluX2xvY2tfaXJxKCZiaXRtYXAtPmxvY2spOwogCWZvciAoaSA9IDA7IGkgPCBiaXRtYXAtPmZpbGVfcGFnZXM7IGkrKykKIAkJc2V0X3BhZ2VfYXR0cihiaXRtYXAsIGJpdG1hcC0+ZmlsZW1hcFtpXSwKIAkJCSAgICAgIEJJVE1BUF9QQUdFX05FRURXUklURSk7CiAJYml0bWFwLT5hbGxjbGVhbiA9IDA7CisJc3Bpbl91bmxvY2tfaXJxKCZiaXRtYXAtPmxvY2spOwogfQogCiBzdGF0aWMgdm9pZCBiaXRtYXBfY291bnRfcGFnZShzdHJ1Y3QgYml0bWFwICpiaXRtYXAsIHNlY3Rvcl90IG9mZnNldCwgaW50IGluYykKQEAgLTEzOTEsOSArMTM5Myw2IEBACiAJCQkgYXRvbWljX3JlYWQoJmJpdG1hcC0+YmVoaW5kX3dyaXRlcyksCiAJCQkgYml0bWFwLT5tZGRldi0+Yml0bWFwX2luZm8ubWF4X3dyaXRlX2JlaGluZCk7CiAJfQotCWlmIChiaXRtYXAtPm1kZGV2LT5kZWdyYWRlZCkKLQkJLyogTmV2ZXIgY2xlYXIgYml0cyBvciB1cGRhdGUgZXZlbnRzX2NsZWFyZWQgd2hlbiBkZWdyYWRlZCAqLwotCQlzdWNjZXNzID0gMDsKIAogCXdoaWxlIChzZWN0b3JzKSB7CiAJCXNlY3Rvcl90IGJsb2NrczsKQEAgLTE0MDcsNyArMTQwNiw3IEBACiAJCQlyZXR1cm47CiAJCX0KIAotCQlpZiAoc3VjY2VzcyAmJgorCQlpZiAoc3VjY2VzcyAmJiAhYml0bWFwLT5tZGRldi0+ZGVncmFkZWQgJiYKIAkJICAgIGJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQgPCBiaXRtYXAtPm1kZGV2LT5ldmVudHMpIHsKIAkJCWJpdG1hcC0+ZXZlbnRzX2NsZWFyZWQgPSBiaXRtYXAtPm1kZGV2LT5ldmVudHM7CiAJCQliaXRtYXAtPm5lZWRfc3luYyA9IDE7CkBAIC0xNjA1LDcgKzE2MDQsOSBAQAogCWZvciAoY2h1bmsgPSBzOyBjaHVuayA8PSBlOyBjaHVuaysrKSB7CiAJCXNlY3Rvcl90IHNlYyA9IChzZWN0b3JfdCljaHVuayA8PCBDSFVOS19CTE9DS19TSElGVChiaXRtYXApOwogCQliaXRtYXBfc2V0X21lbW9yeV9iaXRzKGJpdG1hcCwgc2VjLCAxKTsKKwkJc3Bpbl9sb2NrX2lycSgmYml0bWFwLT5sb2NrKTsKIAkJYml0bWFwX2ZpbGVfc2V0X2JpdChiaXRtYXAsIHNlYyk7CisJCXNwaW5fdW5sb2NrX2lycSgmYml0bWFwLT5sb2NrKTsKIAkJaWYgKHNlYyA8IGJpdG1hcC0+bWRkZXYtPnJlY292ZXJ5X2NwKQogCQkJLyogV2UgYXJlIGFzc2VydGluZyB0aGF0IHRoZSBhcnJheSBpcyBkaXJ0eSwKIAkJCSAqIHNvIG1vdmUgdGhlIHJlY292ZXJ5X2NwIGFkZHJlc3MgYmFjayBzbwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9saW5lYXIuYyBiL2RyaXZlcnMvbWQvbGluZWFyLmMKaW5kZXggYzMyNzNlZi4uNjI3NDU2NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9saW5lYXIuYworKysgYi9kcml2ZXJzL21kL2xpbmVhci5jCkBAIC0yMzAsNiArMjMwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlyZGV2LT5yYWlkX2Rpc2sgPSByZGV2LT5zYXZlZF9yYWlkX2Rpc2s7CisJcmRldi0+c2F2ZWRfcmFpZF9kaXNrID0gLTE7CiAKIAluZXdjb25mID0gbGluZWFyX2NvbmYobWRkZXYsbWRkZXYtPnJhaWRfZGlza3MrMSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwppbmRleCA4NGFjZmU3Li5mNDdmMWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC01NzAsNyArNTcwLDcgQEAKIAkgICAgbWRkZXYtPmN0aW1lID09IDAgJiYgIW1kZGV2LT5ob2xkX2FjdGl2ZSkgewogCQkvKiBBcnJheSBpcyBub3QgY29uZmlndXJlZCBhdCBhbGwsIGFuZCBub3QgaGVsZCBhY3RpdmUsCiAJCSAqIHNvIGRlc3Ryb3kgaXQgKi8KLQkJbGlzdF9kZWwoJm1kZGV2LT5hbGxfbWRkZXZzKTsKKwkJbGlzdF9kZWxfaW5pdCgmbWRkZXYtPmFsbF9tZGRldnMpOwogCQlicyA9IG1kZGV2LT5iaW9fc2V0OwogCQltZGRldi0+YmlvX3NldCA9IE5VTEw7CiAJCWlmIChtZGRldi0+Z2VuZGlzaykgewpAQCAtMjU0Niw3ICsyNTQ2LDggQEAKIAkJc2VwID0gIiwiOwogCX0KIAlpZiAodGVzdF9iaXQoQmxvY2tlZCwgJnJkZXYtPmZsYWdzKSB8fAotCSAgICByZGV2LT5iYWRibG9ja3MudW5hY2tlZF9leGlzdCkgeworCSAgICAocmRldi0+YmFkYmxvY2tzLnVuYWNrZWRfZXhpc3QKKwkgICAgICYmICF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpKSB7CiAJCWxlbiArPSBzcHJpbnRmKHBhZ2UrbGVuLCAiJXNibG9ja2VkIiwgc2VwKTsKIAkJc2VwID0gIiwiOwogCX0KQEAgLTM3ODgsNiArMzc4OSw4IEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAllbHNlIHsKKwkJaWYgKG1kZGV2LT5ob2xkX2FjdGl2ZSA9PSBVTlRJTF9JT0NUTCkKKwkJCW1kZGV2LT5ob2xkX2FjdGl2ZSA9IDA7CiAJCXN5c2ZzX25vdGlmeV9kaXJlbnRfc2FmZShtZGRldi0+c3lzZnNfc3RhdGUpOwogCQlyZXR1cm4gbGVuOwogCX0KQEAgLTQ0ODcsMTEgKzQ0OTAsMjAgQEAKIAogCWlmICghZW50cnktPnNob3cpCiAJCXJldHVybiAtRUlPOworCXNwaW5fbG9jaygmYWxsX21kZGV2c19sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmbWRkZXYtPmFsbF9tZGRldnMpKSB7CisJCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwltZGRldl9nZXQobWRkZXYpOworCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOworCiAJcnYgPSBtZGRldl9sb2NrKG1kZGV2KTsKIAlpZiAoIXJ2KSB7CiAJCXJ2ID0gZW50cnktPnNob3cobWRkZXYsIHBhZ2UpOwogCQltZGRldl91bmxvY2sobWRkZXYpOwogCX0KKwltZGRldl9wdXQobWRkZXYpOwogCXJldHVybiBydjsKIH0KIApAQCAtNDUwNywxMyArNDUxOSwxOSBAQAogCQlyZXR1cm4gLUVJTzsKIAlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCiAJCXJldHVybiAtRUFDQ0VTOworCXNwaW5fbG9jaygmYWxsX21kZGV2c19sb2NrKTsKKwlpZiAobGlzdF9lbXB0eSgmbWRkZXYtPmFsbF9tZGRldnMpKSB7CisJCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwltZGRldl9nZXQobWRkZXYpOworCXNwaW5fdW5sb2NrKCZhbGxfbWRkZXZzX2xvY2spOwogCXJ2ID0gbWRkZXZfbG9jayhtZGRldik7Ci0JaWYgKG1kZGV2LT5ob2xkX2FjdGl2ZSA9PSBVTlRJTF9JT0NUTCkKLQkJbWRkZXYtPmhvbGRfYWN0aXZlID0gMDsKIAlpZiAoIXJ2KSB7CiAJCXJ2ID0gZW50cnktPnN0b3JlKG1kZGV2LCBwYWdlLCBsZW5ndGgpOwogCQltZGRldl91bmxvY2sobWRkZXYpOwogCX0KKwltZGRldl9wdXQobWRkZXYpOwogCXJldHVybiBydjsKIH0KIApAQCAtNzM0Miw4ICs3MzYwLDcgQEAKIAkJCQkJc3BhcmVzKys7CiAJCQkJCW1kX25ld19ldmVudChtZGRldik7CiAJCQkJCXNldF9iaXQoTURfQ0hBTkdFX0RFVlMsICZtZGRldi0+ZmxhZ3MpOwotCQkJCX0gZWxzZQotCQkJCQlicmVhazsKKwkJCQl9CiAJCQl9CiAJCX0KIAl9CkBAIC03ODQwLDYgKzc4NTcsNyBAQAogCQkJCSAgcyArIHJkZXYtPmRhdGFfb2Zmc2V0LCBzZWN0b3JzLCBhY2tub3dsZWRnZWQpOwogCWlmIChydikgewogCQkvKiBNYWtlIHN1cmUgdGhleSBnZXQgd3JpdHRlbiBvdXQgcHJvbXB0bHkgKi8KKwkJc3lzZnNfbm90aWZ5X2RpcmVudF9zYWZlKHJkZXYtPnN5c2ZzX3N0YXRlKTsKIAkJc2V0X2JpdChNRF9DSEFOR0VfQ0xFQU4sICZyZGV2LT5tZGRldi0+ZmxhZ3MpOwogCQltZF93YWtldXBfdGhyZWFkKHJkZXYtPm1kZGV2LT50aHJlYWQpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvcmFpZDUuYyBiL2RyaXZlcnMvbWQvcmFpZDUuYwppbmRleCAyOTdlMjYwLi44NThmZGJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21kL3JhaWQ1LmMKKysrIGIvZHJpdmVycy9tZC9yYWlkNS5jCkBAIC0zMDM2LDYgKzMwMzYsOCBAQAogCQlpZiAoZGV2LT53cml0dGVuKQogCQkJcy0+d3JpdHRlbisrOwogCQlyZGV2ID0gcmN1X2RlcmVmZXJlbmNlKGNvbmYtPmRpc2tzW2ldLnJkZXYpOworCQlpZiAocmRldiAmJiB0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpCisJCQlyZGV2ID0gTlVMTDsKIAkJaWYgKHJkZXYpIHsKIAkJCWlzX2JhZCA9IGlzX2JhZGJsb2NrKHJkZXYsIHNoLT5zZWN0b3IsIFNUUklQRV9TRUNUT1JTLAogCQkJCQkgICAgICZmaXJzdF9iYWQsICZiYWRfc2VjdG9ycyk7CkBAIC0zMDYzLDEyICszMDY1LDE4IEBACiAJCQl9CiAJCX0gZWxzZSBpZiAodGVzdF9iaXQoSW5fc3luYywgJnJkZXYtPmZsYWdzKSkKIAkJCXNldF9iaXQoUjVfSW5zeW5jLCAmZGV2LT5mbGFncyk7Ci0JCWVsc2UgaWYgKCF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpIHsKKwkJZWxzZSBpZiAoc2gtPnNlY3RvciArIFNUUklQRV9TRUNUT1JTIDw9IHJkZXYtPnJlY292ZXJ5X29mZnNldCkKIAkJCS8qIGluIHN5bmMgaWYgYmVmb3JlIHJlY292ZXJ5X29mZnNldCAqLwotCQkJaWYgKHNoLT5zZWN0b3IgKyBTVFJJUEVfU0VDVE9SUyA8PSByZGV2LT5yZWNvdmVyeV9vZmZzZXQpCi0JCQkJc2V0X2JpdChSNV9JbnN5bmMsICZkZXYtPmZsYWdzKTsKLQkJfQotCQlpZiAodGVzdF9iaXQoUjVfV3JpdGVFcnJvciwgJmRldi0+ZmxhZ3MpKSB7CisJCQlzZXRfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpOworCQllbHNlIGlmICh0ZXN0X2JpdChSNV9VUFRPREFURSwgJmRldi0+ZmxhZ3MpICYmCisJCQkgdGVzdF9iaXQoUjVfRXhwYW5kZWQsICZkZXYtPmZsYWdzKSkKKwkJCS8qIElmIHdlJ3ZlIHJlc2hhcGVkIGludG8gaGVyZSwgd2UgYXNzdW1lIGl0IGlzIEluc3luYy4KKwkJCSAqIFdlIHdpbGwgc2hvcnRseSB1cGRhdGUgcmVjb3Zlcnlfb2Zmc2V0IHRvIG1ha2UKKwkJCSAqIGl0IG9mZmljaWFsLgorCQkJICovCisJCQlzZXRfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpOworCisJCWlmIChyZGV2ICYmIHRlc3RfYml0KFI1X1dyaXRlRXJyb3IsICZkZXYtPmZsYWdzKSkgewogCQkJY2xlYXJfYml0KFI1X0luc3luYywgJmRldi0+ZmxhZ3MpOwogCQkJaWYgKCF0ZXN0X2JpdChGYXVsdHksICZyZGV2LT5mbGFncykpIHsKIAkJCQlzLT5oYW5kbGVfYmFkX2Jsb2NrcyA9IDE7CkBAIC0zMDc2LDcgKzMwODQsNyBAQAogCQkJfSBlbHNlCiAJCQkJY2xlYXJfYml0KFI1X1dyaXRlRXJyb3IsICZkZXYtPmZsYWdzKTsKIAkJfQotCQlpZiAodGVzdF9iaXQoUjVfTWFkZUdvb2QsICZkZXYtPmZsYWdzKSkgeworCQlpZiAocmRldiAmJiB0ZXN0X2JpdChSNV9NYWRlR29vZCwgJmRldi0+ZmxhZ3MpKSB7CiAJCQlpZiAoIXRlc3RfYml0KEZhdWx0eSwgJnJkZXYtPmZsYWdzKSkgewogCQkJCXMtPmhhbmRsZV9iYWRfYmxvY2tzID0gMTsKIAkJCQlhdG9taWNfaW5jKCZyZGV2LT5ucl9wZW5kaW5nKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy9teGw1MDA3dC5jIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDd0LmMKaW5kZXggN2ViMWJmNy4uNWQwMjIyMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDd0LmMKKysrIGIvZHJpdmVycy9tZWRpYS9jb21tb24vdHVuZXJzL214bDUwMDd0LmMKQEAgLTQ4OCw5ICs0ODgsMTAgQEAKIAogc3RhdGljIGludCBteGw1MDA3dF9yZWFkX3JlZyhzdHJ1Y3QgbXhsNTAwN3Rfc3RhdGUgKnN0YXRlLCB1OCByZWcsIHU4ICp2YWwpCiB7CisJdTggYnVmWzJdID0geyAweGZiLCByZWcgfTsKIAlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKIAkJeyAuYWRkciA9IHN0YXRlLT5pMmNfcHJvcHMuYWRkciwgLmZsYWdzID0gMCwKLQkJICAuYnVmID0gJnJlZywgLmxlbiA9IDEgfSwKKwkJICAuYnVmID0gYnVmLCAubGVuID0gMiB9LAogCQl7IC5hZGRyID0gc3RhdGUtPmkyY19wcm9wcy5hZGRyLCAuZmxhZ3MgPSBJMkNfTV9SRCwKIAkJICAuYnVmID0gdmFsLCAubGVuID0gMSB9LAogCX07CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL2NvbW1vbi90dW5lcnMvdGRhMTgyMTguYyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODIxOC5jCmluZGV4IGFhY2ZlMjMuLjRmYzI5NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODIxOC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvY29tbW9uL3R1bmVycy90ZGExODIxOC5jCkBAIC0xNDEsNyArMTQxLDcgQEAKIAlzd2l0Y2ggKHBhcmFtcy0+dS5vZmRtLmJhbmR3aWR0aCkgewogCWNhc2UgQkFORFdJRFRIXzZfTUhaOgogCQlMUF9GYyA9IDA7Ci0JCUxPX0ZyYWMgPSBwYXJhbXMtPmZyZXF1ZW5jeSArIDQwMDAwMDA7CisJCUxPX0ZyYWMgPSBwYXJhbXMtPmZyZXF1ZW5jeSArIDMwMDAwMDA7CiAJCWJyZWFrOwogCWNhc2UgQkFORFdJRFRIXzdfTUhaOgogCQlMUF9GYyA9IDE7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2F0aV9yZW1vdGUuYyBiL2RyaXZlcnMvbWVkaWEvcmMvYXRpX3JlbW90ZS5jCmluZGV4IDMwM2YyMmUuLjAxYmI4ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMvYXRpX3JlbW90ZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMvYXRpX3JlbW90ZS5jCkBAIC0xODksNyArMTg5LDcgQEAKIAlkbWFfYWRkcl90IGluYnVmX2RtYTsKIAlkbWFfYWRkcl90IG91dGJ1Zl9kbWE7CiAKLQl1bnNpZ25lZCBjaGFyIG9sZF9kYXRhWzJdOyAgLyogRGV0ZWN0IGR1cGxpY2F0ZSBldmVudHMgKi8KKwl1bnNpZ25lZCBjaGFyIG9sZF9kYXRhOyAgICAgLyogRGV0ZWN0IGR1cGxpY2F0ZSBldmVudHMgKi8KIAl1bnNpZ25lZCBsb25nIG9sZF9qaWZmaWVzOwogCXVuc2lnbmVkIGxvbmcgYWNjX2ppZmZpZXM7ICAvKiBoYW5kbGUgYWNjZWxlcmF0aW9uICovCiAJdW5zaWduZWQgbG9uZyBmaXJzdF9qaWZmaWVzOwpAQCAtMjIxLDM1ICsyMjEsMzUgQEAKIC8qIFRyYW5zbGF0aW9uIHRhYmxlIGZyb20gaGFyZHdhcmUgbWVzc2FnZXMgdG8gaW5wdXQgZXZlbnRzLiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB7CiAJc2hvcnQga2luZDsKLQl1bnNpZ25lZCBjaGFyIGRhdGExLCBkYXRhMjsKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CiAJaW50IHR5cGU7CiAJdW5zaWduZWQgaW50IGNvZGU7CiAJaW50IHZhbHVlOwogfSAgYXRpX3JlbW90ZV90YmxbXSA9IHsKIAkvKiBEaXJlY3Rpb25hbCBjb250cm9sIHBhZCBheGVzICovCi0Je0tJTkRfQUNDRUwsICAgMHgzNSwgMHg3MCwgRVZfUkVMLCBSRUxfWCwgLTF9LAkgLyogbGVmdCAqLwotCXtLSU5EX0FDQ0VMLCAgIDB4MzYsIDB4NzEsIEVWX1JFTCwgUkVMX1gsIDF9LCAgICAvKiByaWdodCAqLwotCXtLSU5EX0FDQ0VMLCAgIDB4MzcsIDB4NzIsIEVWX1JFTCwgUkVMX1ksIC0xfSwJIC8qIHVwICovCi0Je0tJTkRfQUNDRUwsICAgMHgzOCwgMHg3MywgRVZfUkVMLCBSRUxfWSwgMX0sICAgIC8qIGRvd24gKi8KKwl7S0lORF9BQ0NFTCwgICAweDcwLCBFVl9SRUwsIFJFTF9YLCAtMX0sICAgLyogbGVmdCAqLworCXtLSU5EX0FDQ0VMLCAgIDB4NzEsIEVWX1JFTCwgUkVMX1gsIDF9LCAgICAvKiByaWdodCAqLworCXtLSU5EX0FDQ0VMLCAgIDB4NzIsIEVWX1JFTCwgUkVMX1ksIC0xfSwgICAvKiB1cCAqLworCXtLSU5EX0FDQ0VMLCAgIDB4NzMsIEVWX1JFTCwgUkVMX1ksIDF9LCAgICAvKiBkb3duICovCiAJLyogRGlyZWN0aW9uYWwgY29udHJvbCBwYWQgZGlhZ29uYWxzICovCi0Je0tJTkRfTFUsICAgICAgMHgzOSwgMHg3NCwgRVZfUkVMLCAwLCAwfSwgICAgICAgIC8qIGxlZnQgdXAgKi8KLQl7S0lORF9SVSwgICAgICAweDNhLCAweDc1LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogcmlnaHQgdXAgKi8KLQl7S0lORF9MRCwgICAgICAweDNjLCAweDc3LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogbGVmdCBkb3duICovCi0Je0tJTkRfUkQsICAgICAgMHgzYiwgMHg3NiwgRVZfUkVMLCAwLCAwfSwgICAgICAgIC8qIHJpZ2h0IGRvd24gKi8KKwl7S0lORF9MVSwgICAgICAweDc0LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogbGVmdCB1cCAqLworCXtLSU5EX1JVLCAgICAgIDB4NzUsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiByaWdodCB1cCAqLworCXtLSU5EX0xELCAgICAgIDB4NzcsIEVWX1JFTCwgMCwgMH0sICAgICAgICAvKiBsZWZ0IGRvd24gKi8KKwl7S0lORF9SRCwgICAgICAweDc2LCBFVl9SRUwsIDAsIDB9LCAgICAgICAgLyogcmlnaHQgZG93biAqLwogCiAJLyogIk1vdXNlIGJ1dHRvbiIgYnV0dG9ucyAqLwotCXtLSU5EX0xJVEVSQUwsIDB4M2QsIDB4NzgsIEVWX0tFWSwgQlROX0xFRlQsIDF9LCAvKiBsZWZ0IGJ0biBkb3duICovCi0Je0tJTkRfTElURVJBTCwgMHgzZSwgMHg3OSwgRVZfS0VZLCBCVE5fTEVGVCwgMH0sIC8qIGxlZnQgYnRuIHVwICovCi0Je0tJTkRfTElURVJBTCwgMHg0MSwgMHg3YywgRVZfS0VZLCBCVE5fUklHSFQsIDF9LC8qIHJpZ2h0IGJ0biBkb3duICovCi0Je0tJTkRfTElURVJBTCwgMHg0MiwgMHg3ZCwgRVZfS0VZLCBCVE5fUklHSFQsIDB9LC8qIHJpZ2h0IGJ0biB1cCAqLworCXtLSU5EX0xJVEVSQUwsIDB4NzgsIEVWX0tFWSwgQlROX0xFRlQsIDF9LCAvKiBsZWZ0IGJ0biBkb3duICovCisJe0tJTkRfTElURVJBTCwgMHg3OSwgRVZfS0VZLCBCVE5fTEVGVCwgMH0sIC8qIGxlZnQgYnRuIHVwICovCisJe0tJTkRfTElURVJBTCwgMHg3YywgRVZfS0VZLCBCVE5fUklHSFQsIDF9LC8qIHJpZ2h0IGJ0biBkb3duICovCisJe0tJTkRfTElURVJBTCwgMHg3ZCwgRVZfS0VZLCBCVE5fUklHSFQsIDB9LC8qIHJpZ2h0IGJ0biB1cCAqLwogCiAJLyogQXJ0aWZpY2lhbCAiZG91YmxlY2xpY2siIGV2ZW50cyBhcmUgZ2VuZXJhdGVkIGJ5IHRoZSBoYXJkd2FyZS4KIAkgKiBUaGV5IGFyZSBtYXBwZWQgdG8gdGhlICJzaWRlIiBhbmQgImV4dHJhIiBtb3VzZSBidXR0b25zIGhlcmUuICovCi0Je0tJTkRfRklMVEVSRUQsIDB4M2YsIDB4N2EsIEVWX0tFWSwgQlROX1NJREUsIDF9LCAvKiBsZWZ0IGRibGNsaWNrICovCi0Je0tJTkRfRklMVEVSRUQsIDB4NDMsIDB4N2UsIEVWX0tFWSwgQlROX0VYVFJBLCAxfSwvKiByaWdodCBkYmxjbGljayAqLworCXtLSU5EX0ZJTFRFUkVELCAweDdhLCBFVl9LRVksIEJUTl9TSURFLCAxfSwgLyogbGVmdCBkYmxjbGljayAqLworCXtLSU5EX0ZJTFRFUkVELCAweDdlLCBFVl9LRVksIEJUTl9FWFRSQSwgMX0sLyogcmlnaHQgZGJsY2xpY2sgKi8KIAogCS8qIE5vbi1tb3VzZSBldmVudHMgYXJlIGhhbmRsZWQgYnkgcmMtY29yZSAqLwotCXtLSU5EX0VORCwgMHgwMCwgMHgwMCwgRVZfTUFYICsgMSwgMCwgMH0KKwl7S0lORF9FTkQsIDB4MDAsIEVWX01BWCArIDEsIDAsIDB9CiB9OwogCiAvKiBMb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzICovCkBAIC0zOTcsMjUgKzM5Nyw2IEBACiB9CiAKIC8qCi0gKglhdGlfcmVtb3RlX2V2ZW50X2xvb2t1cAotICovCi1zdGF0aWMgaW50IGF0aV9yZW1vdGVfZXZlbnRfbG9va3VwKGludCByZW0sIHVuc2lnbmVkIGNoYXIgZDEsIHVuc2lnbmVkIGNoYXIgZDIpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBhdGlfcmVtb3RlX3RibFtpXS5raW5kICE9IEtJTkRfRU5EOyBpKyspIHsKLQkJLyoKLQkJICogRGVjaWRlIGlmIHRoZSB0YWJsZSBlbnRyeSBtYXRjaGVzIHRoZSByZW1vdGUgaW5wdXQuCi0JCSAqLwotCQlpZiAoYXRpX3JlbW90ZV90YmxbaV0uZGF0YTEgPT0gZDEgJiYKLQkJICAgIGF0aV9yZW1vdGVfdGJsW2ldLmRhdGEyID09IGQyKQotCQkJcmV0dXJuIGk7Ci0KLQl9Ci0JcmV0dXJuIC0xOwotfQotCi0vKgogICoJYXRpX3JlbW90ZV9jb21wdXRlX2FjY2VsCiAgKgogICogSW1wbGVtZW50cyBhY2NlbGVyYXRpb24gY3VydmUgZm9yIGRpcmVjdGlvbmFsIGNvbnRyb2wgcGFkCkBAIC00NjMsNyArNDQ0LDE1IEBACiAJaW50IGluZGV4ID0gLTE7CiAJaW50IGFjYzsKIAlpbnQgcmVtb3RlX251bTsKLQl1bnNpZ25lZCBjaGFyIHNjYW5jb2RlWzJdOworCXVuc2lnbmVkIGNoYXIgc2NhbmNvZGU7CisJaW50IGk7CisKKwkvKgorCSAqIGRhdGFbMF0gPSAweDE0CisJICogZGF0YVsxXSA9IGRhdGFbMl0gKyBkYXRhWzNdICsgMHhkNSAoYSBjaGVja3N1bSBieXRlKQorCSAqIGRhdGFbMl0gPSB0aGUga2V5IGNvZGUgKHdpdGggdG9nZ2xlIGJpdCBpbiBNU0Igd2l0aCBzb21lIG1vZGVscykKKwkgKiBkYXRhWzNdID0gY2hhbm5lbCA8PCA0ICh0aGUgbG93IDQgYml0cyBtdXN0IGJlIHplcm8pCisJICovCiAKIAkvKiBEZWFsIHdpdGggc3RyYW5nZSBsb29raW5nIGlucHV0cyAqLwogCWlmICggKHVyYi0+YWN0dWFsX2xlbmd0aCAhPSA0KSB8fCAoZGF0YVswXSAhPSAweDE0KSB8fApAQCAtNDcyLDYgKzQ2MSwxMyBAQAogCQlyZXR1cm47CiAJfQogCisJaWYgKGRhdGFbMV0gIT0gKChkYXRhWzJdICsgZGF0YVszXSArIDB4ZDUpICYgMHhmZikpIHsKKwkJZGJnaW5mbygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCisJCQkid3JvbmcgY2hlY2tzdW0gaW4gaW5wdXQ6ICUwMnggJTAyeCAlMDJ4ICUwMnhcbiIsCisJCQlkYXRhWzBdLCBkYXRhWzFdLCBkYXRhWzJdLCBkYXRhWzNdKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIE1hc2sgdW53YW50ZWQgcmVtb3RlIGNoYW5uZWxzLiAgKi8KIAkvKiBub3RlOiByZW1vdGVfbnVtIGlzIDAtYmFzZWQsIGNoYW5uZWwgMSBvbiByZW1vdGUgPT0gMCBoZXJlICovCiAJcmVtb3RlX251bSA9IChkYXRhWzNdID4+IDQpICYgMHgwZjsKQEAgLTQ4MiwzMSArNDc4LDMwIEBACiAJCXJldHVybjsKIAl9CiAKLQlzY2FuY29kZVswXSA9ICgoKGRhdGFbMV0gLSAoKHJlbW90ZV9udW0gKyAxKSA8PCA0KSkgJiAweGYwKSB8IChkYXRhWzFdICYgMHgwZikpOwotCiAJLyoKLQkgKiBTb21lIGRldmljZXMgKGUuZy4gU25hcFN0cmVhbSBGaXJlZmx5KSB1c2UgODA4MCBhcyB0b2dnbGUgY29kZSwKLQkgKiBzbyB3ZSBoYXZlIHRvIGNsZWFyIHRoZW0uIFRoZSBmaXJzdCBiaXQgaXMgYSBiaXQgdHJpY2t5IGFzIHRoZQotCSAqICJub24tdG9nZ2xlZCIgc3RhdGUgZGVwZW5kcyBvbiByZW1vdGVfbnVtLCBzbyB3ZSB4b3IgaXQgd2l0aCB0aGUKLQkgKiBzZWNvbmQgYml0IHdoaWNoIGlzIG9ubHkgdXNlZCBmb3IgdG9nZ2xlLgorCSAqIE1TQiBpcyBhIHRvZ2dsZSBjb2RlLCB0aG91Z2ggb25seSB1c2VkIGJ5IHNvbWUgZGV2aWNlcworCSAqIChlLmcuIFNuYXBTdHJlYW0gRmlyZWZseSkKIAkgKi8KLQlzY2FuY29kZVswXSBePSAoZGF0YVsyXSAmIDB4ODApOworCXNjYW5jb2RlID0gZGF0YVsyXSAmIDB4N2Y7CiAKLQlzY2FuY29kZVsxXSA9IGRhdGFbMl0gJiB+MHg4MDsKLQotCS8qIExvb2sgdXAgZXZlbnQgY29kZSBpbmRleCBpbiBtb3VzZSB0cmFuc2xhdGlvbiB0YWJsZS4gKi8KLQlpbmRleCA9IGF0aV9yZW1vdGVfZXZlbnRfbG9va3VwKHJlbW90ZV9udW0sIHNjYW5jb2RlWzBdLCBzY2FuY29kZVsxXSk7CisJLyogTG9vayB1cCBldmVudCBjb2RlIGluZGV4IGluIHRoZSBtb3VzZSB0cmFuc2xhdGlvbiB0YWJsZS4gKi8KKwlmb3IgKGkgPSAwOyBhdGlfcmVtb3RlX3RibFtpXS5raW5kICE9IEtJTkRfRU5EOyBpKyspIHsKKwkJaWYgKHNjYW5jb2RlID09IGF0aV9yZW1vdGVfdGJsW2ldLmRhdGEpIHsKKwkJCWluZGV4ID0gaTsKKwkJCWJyZWFrOworCQl9CisJfQogCiAJaWYgKGluZGV4ID49IDApIHsKIAkJZGJnaW5mbygmYXRpX3JlbW90ZS0+aW50ZXJmYWNlLT5kZXYsCi0JCQkiY2hhbm5lbCAweCUwMng7IG1vdXNlIGRhdGEgJTAyeCwlMDJ4OyBpbmRleCAlZDsga2V5Y29kZSAlZFxuIiwKLQkJCXJlbW90ZV9udW0sIGRhdGFbMV0sIGRhdGFbMl0sIGluZGV4LCBhdGlfcmVtb3RlX3RibFtpbmRleF0uY29kZSk7CisJCQkiY2hhbm5lbCAweCUwMng7IG1vdXNlIGRhdGEgJTAyeDsgaW5kZXggJWQ7IGtleWNvZGUgJWRcbiIsCisJCQlyZW1vdGVfbnVtLCBkYXRhWzJdLCBpbmRleCwgYXRpX3JlbW90ZV90YmxbaW5kZXhdLmNvZGUpOwogCQlpZiAoIWRldikKIAkJCXJldHVybjsgLyogbm8gbW91c2UgZGV2aWNlICovCiAJfSBlbHNlCiAJCWRiZ2luZm8oJmF0aV9yZW1vdGUtPmludGVyZmFjZS0+ZGV2LAotCQkJImNoYW5uZWwgMHglMDJ4OyBrZXkgZGF0YSAlMDJ4LCUwMngsIHNjYW5jb2RlICUwMngsJTAyeFxuIiwKLQkJCXJlbW90ZV9udW0sIGRhdGFbMV0sIGRhdGFbMl0sIHNjYW5jb2RlWzBdLCBzY2FuY29kZVsxXSk7CisJCQkiY2hhbm5lbCAweCUwMng7IGtleSBkYXRhICUwMngsIHNjYW5jb2RlICUwMnhcbiIsCisJCQlyZW1vdGVfbnVtLCBkYXRhWzJdLCBzY2FuY29kZSk7CiAKIAogCWlmIChpbmRleCA+PSAwICYmIGF0aV9yZW1vdGVfdGJsW2luZGV4XS5raW5kID09IEtJTkRfTElURVJBTCkgewpAQCAtNTIzLDggKzUxOCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbm93ID0gamlmZmllczsKIAogCQkvKiBGaWx0ZXIgZHVwbGljYXRlIGV2ZW50cyB3aGljaCBoYXBwZW4gInRvbyBjbG9zZSIgdG9nZXRoZXIuICovCi0JCWlmIChhdGlfcmVtb3RlLT5vbGRfZGF0YVswXSA9PSBkYXRhWzFdICYmCi0JCSAgICBhdGlfcmVtb3RlLT5vbGRfZGF0YVsxXSA9PSBkYXRhWzJdICYmCisJCWlmIChhdGlfcmVtb3RlLT5vbGRfZGF0YSA9PSBkYXRhWzJdICYmCiAJCSAgICB0aW1lX2JlZm9yZShub3csIGF0aV9yZW1vdGUtPm9sZF9qaWZmaWVzICsKIAkJCQkgICAgIG1zZWNzX3RvX2ppZmZpZXMocmVwZWF0X2ZpbHRlcikpKSB7CiAJCQlhdGlfcmVtb3RlLT5yZXBlYXRfY291bnQrKzsKQEAgLTUzMyw4ICs1MjcsNyBAQAogCQkJYXRpX3JlbW90ZS0+Zmlyc3RfamlmZmllcyA9IG5vdzsKIAkJfQogCi0JCWF0aV9yZW1vdGUtPm9sZF9kYXRhWzBdID0gZGF0YVsxXTsKLQkJYXRpX3JlbW90ZS0+b2xkX2RhdGFbMV0gPSBkYXRhWzJdOworCQlhdGlfcmVtb3RlLT5vbGRfZGF0YSA9IGRhdGFbMl07CiAJCWF0aV9yZW1vdGUtPm9sZF9qaWZmaWVzID0gbm93OwogCiAJCS8qIEVuc3VyZSB3ZSBza2lwIGF0IGxlYXN0IHRoZSA0IGZpcnN0IGR1cGxpY2F0ZSBldmVudHMgKGdlbmVyYXRlZApAQCAtNTQ5LDE0ICs1NDIsMTMgQEAKIAogCQlpZiAoaW5kZXggPCAwKSB7CiAJCQkvKiBOb3QgYSBtb3VzZSBldmVudCwgaGFuZCBpdCB0byByYy1jb3JlLiAqLwotCQkJdTMyIHJjX2NvZGUgPSAoc2NhbmNvZGVbMF0gPDwgOCkgfCBzY2FuY29kZVsxXTsKIAogCQkJLyoKIAkJCSAqIFdlIGRvbid0IHVzZSB0aGUgcmMtY29yZSByZXBlYXQgaGFuZGxpbmcgeWV0IGFzCiAJCQkgKiBpdCB3b3VsZCBjYXVzZSBnaG9zdCByZXBlYXRzIHdoaWNoIHdvdWxkIGJlIGEKIAkJCSAqIHJlZ3Jlc3Npb24gZm9yIHRoaXMgZHJpdmVyLgogCQkJICovCi0JCQlyY19rZXlkb3duX25vdGltZW91dChhdGlfcmVtb3RlLT5yZGV2LCByY19jb2RlLAorCQkJcmNfa2V5ZG93bl9ub3RpbWVvdXQoYXRpX3JlbW90ZS0+cmRldiwgc2NhbmNvZGUsCiAJCQkJCSAgICAgZGF0YVsyXSk7CiAJCQlyY19rZXl1cChhdGlfcmVtb3RlLT5yZGV2KTsKIAkJCXJldHVybjsKQEAgLTYwNyw4ICs1OTksNyBAQAogCQlpbnB1dF9zeW5jKGRldik7CiAKIAkJYXRpX3JlbW90ZS0+b2xkX2ppZmZpZXMgPSBqaWZmaWVzOwotCQlhdGlfcmVtb3RlLT5vbGRfZGF0YVswXSA9IGRhdGFbMV07Ci0JCWF0aV9yZW1vdGUtPm9sZF9kYXRhWzFdID0gZGF0YVsyXTsKKwkJYXRpX3JlbW90ZS0+b2xkX2RhdGEgPSBkYXRhWzJdOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF0aS14MTAuYyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1hdGkteDEwLmMKaW5kZXggZTFiOGIyNi4uODE1MDY0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLWF0aS14MTAuYworKysgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtYXRpLXgxMC5jCkBAIC0yNyw1NSArMjcsNTUgQEAKICNpbmNsdWRlIDxtZWRpYS9yYy1tYXAuaD4KIAogc3RhdGljIHN0cnVjdCByY19tYXBfdGFibGUgYXRpX3gxMFtdID0gewotCXsgMHhkMjBkLCBLRVlfMSB9LAotCXsgMHhkMzBlLCBLRVlfMiB9LAotCXsgMHhkNDBmLCBLRVlfMyB9LAotCXsgMHhkNTEwLCBLRVlfNCB9LAotCXsgMHhkNjExLCBLRVlfNSB9LAotCXsgMHhkNzEyLCBLRVlfNiB9LAotCXsgMHhkODEzLCBLRVlfNyB9LAotCXsgMHhkOTE0LCBLRVlfOCB9LAotCXsgMHhkYTE1LCBLRVlfOSB9LAotCXsgMHhkYzE3LCBLRVlfMCB9LAotCXsgMHhjNTAwLCBLRVlfQSB9LAotCXsgMHhjNjAxLCBLRVlfQiB9LAotCXsgMHhkZTE5LCBLRVlfQyB9LAotCXsgMHhlMDFiLCBLRVlfRCB9LAotCXsgMHhlNjIxLCBLRVlfRSB9LAotCXsgMHhlODIzLCBLRVlfRiB9LAorCXsgMHgwZCwgS0VZXzEgfSwKKwl7IDB4MGUsIEtFWV8yIH0sCisJeyAweDBmLCBLRVlfMyB9LAorCXsgMHgxMCwgS0VZXzQgfSwKKwl7IDB4MTEsIEtFWV81IH0sCisJeyAweDEyLCBLRVlfNiB9LAorCXsgMHgxMywgS0VZXzcgfSwKKwl7IDB4MTQsIEtFWV84IH0sCisJeyAweDE1LCBLRVlfOSB9LAorCXsgMHgxNywgS0VZXzAgfSwKKwl7IDB4MDAsIEtFWV9BIH0sCisJeyAweDAxLCBLRVlfQiB9LAorCXsgMHgxOSwgS0VZX0MgfSwKKwl7IDB4MWIsIEtFWV9EIH0sCisJeyAweDIxLCBLRVlfRSB9LAorCXsgMHgyMywgS0VZX0YgfSwKIAotCXsgMHhkZDE4LCBLRVlfS1BFTlRFUiB9LCAgICAvKiAiY2hlY2siICovCi0JeyAweGRiMTYsIEtFWV9NRU5VIH0sICAgICAgIC8qICJtZW51IiAqLwotCXsgMHhjNzAyLCBLRVlfUE9XRVIgfSwgICAgICAvKiBQb3dlciAqLwotCXsgMHhjODAzLCBLRVlfVFYgfSwgICAgICAgICAvKiBUViAqLwotCXsgMHhjOTA0LCBLRVlfRFZEIH0sICAgICAgICAvKiBEVkQgKi8KLQl7IDB4Y2EwNSwgS0VZX1dXVyB9LCAgICAgICAgLyogV0VCICovCi0JeyAweGNiMDYsIEtFWV9CT09LTUFSS1MgfSwgIC8qICJib29rIiAqLwotCXsgMHhjYzA3LCBLRVlfRURJVCB9LCAgICAgICAvKiAiaGFuZCIgKi8KLQl7IDB4ZTExYywgS0VZX0NPRkZFRSB9LCAgICAgLyogInRpbWVyIiAqLwotCXsgMHhlNTIwLCBLRVlfRlJPTlQgfSwgICAgICAvKiAibWF4IiAqLwotCXsgMHhlMjFkLCBLRVlfTEVGVCB9LCAgICAgICAvKiBsZWZ0ICovCi0JeyAweGU0MWYsIEtFWV9SSUdIVCB9LCAgICAgIC8qIHJpZ2h0ICovCi0JeyAweGU3MjIsIEtFWV9ET1dOIH0sICAgICAgIC8qIGRvd24gKi8KLQl7IDB4ZGYxYSwgS0VZX1VQIH0sICAgICAgICAgLyogdXAgKi8KLQl7IDB4ZTMxZSwgS0VZX09LIH0sICAgICAgICAgLyogIk9LIiAqLwotCXsgMHhjZTA5LCBLRVlfVk9MVU1FRE9XTiB9LCAvKiBWT0wgKyAqLwotCXsgMHhjZDA4LCBLRVlfVk9MVU1FVVAgfSwgICAvKiBWT0wgLSAqLwotCXsgMHhjZjBhLCBLRVlfTVVURSB9LCAgICAgICAvKiBNVVRFICAqLwotCXsgMHhkMDBiLCBLRVlfQ0hBTk5FTFVQIH0sICAvKiBDSCArICovCi0JeyAweGQxMGMsIEtFWV9DSEFOTkVMRE9XTiB9LC8qIENIIC0gKi8KLQl7IDB4ZWMyNywgS0VZX1JFQ09SRCB9LCAgICAgLyogKCBvKSByZWQgKi8KLQl7IDB4ZWEyNSwgS0VZX1BMQVkgfSwgICAgICAgLyogKCA+KSAqLwotCXsgMHhlOTI0LCBLRVlfUkVXSU5EIH0sICAgICAvKiAoPDwpICovCi0JeyAweGViMjYsIEtFWV9GT1JXQVJEIH0sICAgIC8qICg+PikgKi8KLQl7IDB4ZWQyOCwgS0VZX1NUT1AgfSwgICAgICAgLyogKFtdKSAqLwotCXsgMHhlZTI5LCBLRVlfUEFVU0UgfSwgICAgICAvKiAoJycpICovCi0JeyAweGYwMmIsIEtFWV9QUkVWSU9VUyB9LCAgIC8qICg8LSkgKi8KLQl7IDB4ZWYyYSwgS0VZX05FWFQgfSwgICAgICAgLyogKD4rKSAqLwotCXsgMHhmMjJkLCBLRVlfSU5GTyB9LCAgICAgICAvKiBQTEFZSU5HICovCi0JeyAweGYzMmUsIEtFWV9IT01FIH0sICAgICAgIC8qIFRPUCAqLwotCXsgMHhmNDJmLCBLRVlfRU5EIH0sICAgICAgICAvKiBFTkQgKi8KLQl7IDB4ZjUzMCwgS0VZX1NFTEVDVCB9LCAgICAgLyogU0VMRUNUICovCisJeyAweDE4LCBLRVlfS1BFTlRFUiB9LCAgICAvKiAiY2hlY2siICovCisJeyAweDE2LCBLRVlfTUVOVSB9LCAgICAgICAvKiAibWVudSIgKi8KKwl7IDB4MDIsIEtFWV9QT1dFUiB9LCAgICAgIC8qIFBvd2VyICovCisJeyAweDAzLCBLRVlfVFYgfSwgICAgICAgICAvKiBUViAqLworCXsgMHgwNCwgS0VZX0RWRCB9LCAgICAgICAgLyogRFZEICovCisJeyAweDA1LCBLRVlfV1dXIH0sICAgICAgICAvKiBXRUIgKi8KKwl7IDB4MDYsIEtFWV9CT09LTUFSS1MgfSwgIC8qICJib29rIiAqLworCXsgMHgwNywgS0VZX0VESVQgfSwgICAgICAgLyogImhhbmQiICovCisJeyAweDFjLCBLRVlfQ09GRkVFIH0sICAgICAvKiAidGltZXIiICovCisJeyAweDIwLCBLRVlfRlJPTlQgfSwgICAgICAvKiAibWF4IiAqLworCXsgMHgxZCwgS0VZX0xFRlQgfSwgICAgICAgLyogbGVmdCAqLworCXsgMHgxZiwgS0VZX1JJR0hUIH0sICAgICAgLyogcmlnaHQgKi8KKwl7IDB4MjIsIEtFWV9ET1dOIH0sICAgICAgIC8qIGRvd24gKi8KKwl7IDB4MWEsIEtFWV9VUCB9LCAgICAgICAgIC8qIHVwICovCisJeyAweDFlLCBLRVlfT0sgfSwgICAgICAgICAvKiAiT0siICovCisJeyAweDA5LCBLRVlfVk9MVU1FRE9XTiB9LCAvKiBWT0wgKyAqLworCXsgMHgwOCwgS0VZX1ZPTFVNRVVQIH0sICAgLyogVk9MIC0gKi8KKwl7IDB4MGEsIEtFWV9NVVRFIH0sICAgICAgIC8qIE1VVEUgICovCisJeyAweDBiLCBLRVlfQ0hBTk5FTFVQIH0sICAvKiBDSCArICovCisJeyAweDBjLCBLRVlfQ0hBTk5FTERPV04gfSwvKiBDSCAtICovCisJeyAweDI3LCBLRVlfUkVDT1JEIH0sICAgICAvKiAoIG8pIHJlZCAqLworCXsgMHgyNSwgS0VZX1BMQVkgfSwgICAgICAgLyogKCA+KSAqLworCXsgMHgyNCwgS0VZX1JFV0lORCB9LCAgICAgLyogKDw8KSAqLworCXsgMHgyNiwgS0VZX0ZPUldBUkQgfSwgICAgLyogKD4+KSAqLworCXsgMHgyOCwgS0VZX1NUT1AgfSwgICAgICAgLyogKFtdKSAqLworCXsgMHgyOSwgS0VZX1BBVVNFIH0sICAgICAgLyogKCcnKSAqLworCXsgMHgyYiwgS0VZX1BSRVZJT1VTIH0sICAgLyogKDwtKSAqLworCXsgMHgyYSwgS0VZX05FWFQgfSwgICAgICAgLyogKD4rKSAqLworCXsgMHgyZCwgS0VZX0lORk8gfSwgICAgICAgLyogUExBWUlORyAqLworCXsgMHgyZSwgS0VZX0hPTUUgfSwgICAgICAgLyogVE9QICovCisJeyAweDJmLCBLRVlfRU5EIH0sICAgICAgICAvKiBFTkQgKi8KKwl7IDB4MzAsIEtFWV9TRUxFQ1QgfSwgICAgIC8qIFNFTEVDVCAqLwogfTsKIAogc3RhdGljIHN0cnVjdCByY19tYXBfbGlzdCBhdGlfeDEwX21hcCA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tZWRpb24teDEwLmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtbWVkaW9uLXgxMC5jCmluZGV4IDA5ZTJjYzAuLjQ3OWNkYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1tZWRpb24teDEwLmMKKysrIGIvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLW1lZGlvbi14MTAuYwpAQCAtMjUsNzAgKzI1LDcwIEBACiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIG1lZGlvbl94MTBbXSA9IHsKLQl7IDB4ZjEyYywgS0VZX1RWIH0sICAgIC8qIFRWICovCi0JeyAweGYyMmQsIEtFWV9WQ1IgfSwgICAvKiBWQ1IgKi8KLQl7IDB4YzkwNCwgS0VZX0RWRCB9LCAgIC8qIERWRCAqLwotCXsgMHhjYjA2LCBLRVlfQVVESU8gfSwgLyogTVVTSUMgKi8KKwl7IDB4MmMsIEtFWV9UViB9LCAgICAvKiBUViAqLworCXsgMHgyZCwgS0VZX1ZDUiB9LCAgIC8qIFZDUiAqLworCXsgMHgwNCwgS0VZX0RWRCB9LCAgIC8qIERWRCAqLworCXsgMHgwNiwgS0VZX0FVRElPIH0sIC8qIE1VU0lDICovCiAKLQl7IDB4ZjMyZSwgS0VZX1JBRElPIH0sICAgICAvKiBSQURJTyAqLwotCXsgMHhjYTA1LCBLRVlfRElSRUNUT1JZIH0sIC8qIFBIT1RPICovCi0JeyAweGY0MmYsIEtFWV9JTkZPIH0sICAgICAgLyogVFYtUFJFVklFVyAqLwotCXsgMHhmNTMwLCBLRVlfTElTVCB9LCAgICAgIC8qIENIQU5ORUwtTFNUICovCisJeyAweDJlLCBLRVlfUkFESU8gfSwgICAgIC8qIFJBRElPICovCisJeyAweDA1LCBLRVlfRElSRUNUT1JZIH0sIC8qIFBIT1RPICovCisJeyAweDJmLCBLRVlfSU5GTyB9LCAgICAgIC8qIFRWLVBSRVZJRVcgKi8KKwl7IDB4MzAsIEtFWV9MSVNUIH0sICAgICAgLyogQ0hBTk5FTC1MU1QgKi8KIAotCXsgMHhlMDFiLCBLRVlfU0VUVVAgfSwgLyogU0VUVVAgKi8KLQl7IDB4ZjYzMSwgS0VZX1ZJREVPIH0sIC8qIFZJREVPIERFU0tUT1AgKi8KKwl7IDB4MWIsIEtFWV9TRVRVUCB9LCAvKiBTRVRVUCAqLworCXsgMHgzMSwgS0VZX1ZJREVPIH0sIC8qIFZJREVPIERFU0tUT1AgKi8KIAotCXsgMHhjZDA4LCBLRVlfVk9MVU1FRE9XTiB9LCAgLyogVk9MIC0gKi8KLQl7IDB4Y2UwOSwgS0VZX1ZPTFVNRVVQIH0sICAgIC8qIFZPTCArICovCi0JeyAweGQwMGIsIEtFWV9DSEFOTkVMVVAgfSwgICAvKiBDSEFOICsgKi8KLQl7IDB4ZDEwYywgS0VZX0NIQU5ORUxET1dOIH0sIC8qIENIQU4gLSAqLwotCXsgMHhjNTAwLCBLRVlfTVVURSB9LCAgICAgICAgLyogTVVURSAqLworCXsgMHgwOCwgS0VZX1ZPTFVNRURPV04gfSwgIC8qIFZPTCAtICovCisJeyAweDA5LCBLRVlfVk9MVU1FVVAgfSwgICAgLyogVk9MICsgKi8KKwl7IDB4MGIsIEtFWV9DSEFOTkVMVVAgfSwgICAvKiBDSEFOICsgKi8KKwl7IDB4MGMsIEtFWV9DSEFOTkVMRE9XTiB9LCAvKiBDSEFOIC0gKi8KKwl7IDB4MDAsIEtFWV9NVVRFIH0sICAgICAgICAvKiBNVVRFICovCiAKLQl7IDB4ZjczMiwgS0VZX1JFRCB9LCAvKiByZWQgKi8KLQl7IDB4ZjgzMywgS0VZX0dSRUVOIH0sIC8qIGdyZWVuICovCi0JeyAweGY5MzQsIEtFWV9ZRUxMT1cgfSwgLyogeWVsbG93ICovCi0JeyAweGZhMzUsIEtFWV9CTFVFIH0sIC8qIGJsdWUgKi8KLQl7IDB4ZGIxNiwgS0VZX1RFWFQgfSwgLyogVFhUICovCisJeyAweDMyLCBLRVlfUkVEIH0sIC8qIHJlZCAqLworCXsgMHgzMywgS0VZX0dSRUVOIH0sIC8qIGdyZWVuICovCisJeyAweDM0LCBLRVlfWUVMTE9XIH0sIC8qIHllbGxvdyAqLworCXsgMHgzNSwgS0VZX0JMVUUgfSwgLyogYmx1ZSAqLworCXsgMHgxNiwgS0VZX1RFWFQgfSwgLyogVFhUICovCiAKLQl7IDB4ZDIwZCwgS0VZXzEgfSwKLQl7IDB4ZDMwZSwgS0VZXzIgfSwKLQl7IDB4ZDQwZiwgS0VZXzMgfSwKLQl7IDB4ZDUxMCwgS0VZXzQgfSwKLQl7IDB4ZDYxMSwgS0VZXzUgfSwKLQl7IDB4ZDcxMiwgS0VZXzYgfSwKLQl7IDB4ZDgxMywgS0VZXzcgfSwKLQl7IDB4ZDkxNCwgS0VZXzggfSwKLQl7IDB4ZGExNSwgS0VZXzkgfSwKLQl7IDB4ZGMxNywgS0VZXzAgfSwKLQl7IDB4ZTExYywgS0VZX1NFQVJDSCB9LCAvKiBUVi9SQUQsIENIIFNSQyAqLwotCXsgMHhlNTIwLCBLRVlfREVMRVRFIH0sIC8qIERFTEVURSAqLworCXsgMHgwZCwgS0VZXzEgfSwKKwl7IDB4MGUsIEtFWV8yIH0sCisJeyAweDBmLCBLRVlfMyB9LAorCXsgMHgxMCwgS0VZXzQgfSwKKwl7IDB4MTEsIEtFWV81IH0sCisJeyAweDEyLCBLRVlfNiB9LAorCXsgMHgxMywgS0VZXzcgfSwKKwl7IDB4MTQsIEtFWV84IH0sCisJeyAweDE1LCBLRVlfOSB9LAorCXsgMHgxNywgS0VZXzAgfSwKKwl7IDB4MWMsIEtFWV9TRUFSQ0ggfSwgLyogVFYvUkFELCBDSCBTUkMgKi8KKwl7IDB4MjAsIEtFWV9ERUxFVEUgfSwgLyogREVMRVRFICovCiAKLQl7IDB4ZmIzNiwgS0VZX0tFWUJPQVJEIH0sIC8qIFJFTkFNRSAqLwotCXsgMHhkZDE4LCBLRVlfU0NSRUVOIH0sICAgLyogU05BUFNIT1QgKi8KKwl7IDB4MzYsIEtFWV9LRVlCT0FSRCB9LCAvKiBSRU5BTUUgKi8KKwl7IDB4MTgsIEtFWV9TQ1JFRU4gfSwgICAvKiBTTkFQU0hPVCAqLwogCi0JeyAweGRmMWEsIEtFWV9VUCB9LCAgICAvKiB1cCAqLwotCXsgMHhlNzIyLCBLRVlfRE9XTiB9LCAgLyogZG93biAqLwotCXsgMHhlMjFkLCBLRVlfTEVGVCB9LCAgLyogbGVmdCAqLwotCXsgMHhlNDFmLCBLRVlfUklHSFQgfSwgLyogcmlnaHQgKi8KLQl7IDB4ZTMxZSwgS0VZX09LIH0sICAgIC8qIE9LICovCisJeyAweDFhLCBLRVlfVVAgfSwgICAgLyogdXAgKi8KKwl7IDB4MjIsIEtFWV9ET1dOIH0sICAvKiBkb3duICovCisJeyAweDFkLCBLRVlfTEVGVCB9LCAgLyogbGVmdCAqLworCXsgMHgxZiwgS0VZX1JJR0hUIH0sIC8qIHJpZ2h0ICovCisJeyAweDFlLCBLRVlfT0sgfSwgICAgLyogT0sgKi8KIAotCXsgMHhmYzM3LCBLRVlfU0VMRUNUIH0sIC8qIEFDUVVJUkUgSU1BR0UgKi8KLQl7IDB4ZmQzOCwgS0VZX0VESVQgfSwgICAvKiBFRElUIElNQUdFICovCisJeyAweDM3LCBLRVlfU0VMRUNUIH0sIC8qIEFDUVVJUkUgSU1BR0UgKi8KKwl7IDB4MzgsIEtFWV9FRElUIH0sICAgLyogRURJVCBJTUFHRSAqLwogCi0JeyAweGU5MjQsIEtFWV9SRVdJTkQgfSwgICAvKiByZXdpbmQgICg8PCkgKi8KLQl7IDB4ZWEyNSwgS0VZX1BMQVkgfSwgICAgIC8qIHBsYXkgICAgKCA+KSAqLwotCXsgMHhlYjI2LCBLRVlfRk9SV0FSRCB9LCAgLyogZm9yd2FyZCAoPj4pICovCi0JeyAweGVjMjcsIEtFWV9SRUNPUkQgfSwgICAvKiByZWNvcmQgICggbykgKi8KLQl7IDB4ZWQyOCwgS0VZX1NUT1AgfSwgICAgIC8qIHN0b3AgICAgKFtdKSAqLwotCXsgMHhlZTI5LCBLRVlfUEFVU0UgfSwgICAgLyogcGF1c2UgICAoJycpICovCisJeyAweDI0LCBLRVlfUkVXSU5EIH0sICAgLyogcmV3aW5kICAoPDwpICovCisJeyAweDI1LCBLRVlfUExBWSB9LCAgICAgLyogcGxheSAgICAoID4pICovCisJeyAweDI2LCBLRVlfRk9SV0FSRCB9LCAgLyogZm9yd2FyZCAoPj4pICovCisJeyAweDI3LCBLRVlfUkVDT1JEIH0sICAgLyogcmVjb3JkICAoIG8pICovCisJeyAweDI4LCBLRVlfU1RPUCB9LCAgICAgLyogc3RvcCAgICAoW10pICovCisJeyAweDI5LCBLRVlfUEFVU0UgfSwgICAgLyogcGF1c2UgICAoJycpICovCiAKLQl7IDB4ZTYyMSwgS0VZX1BSRVZJT1VTIH0sICAgICAgICAvKiBwcmV2ICovCi0JeyAweGZlMzksIEtFWV9TV0lUQ0hWSURFT01PREUgfSwgLyogRiBTQ1IgKi8KLQl7IDB4ZTgyMywgS0VZX05FWFQgfSwgICAgICAgICAgICAvKiBuZXh0ICovCi0JeyAweGRlMTksIEtFWV9NRU5VIH0sICAgICAgICAgICAgLyogTUVOVSAqLwotCXsgMHhmZjNhLCBLRVlfTEFOR1VBR0UgfSwgICAgICAgIC8qIEFVRElPICovCisJeyAweDIxLCBLRVlfUFJFVklPVVMgfSwgICAgICAgIC8qIHByZXYgKi8KKwl7IDB4MzksIEtFWV9TV0lUQ0hWSURFT01PREUgfSwgLyogRiBTQ1IgKi8KKwl7IDB4MjMsIEtFWV9ORVhUIH0sICAgICAgICAgICAgLyogbmV4dCAqLworCXsgMHgxOSwgS0VZX01FTlUgfSwgICAgICAgICAgICAvKiBNRU5VICovCisJeyAweDNhLCBLRVlfTEFOR1VBR0UgfSwgICAgICAgIC8qIEFVRElPICovCiAKLQl7IDB4YzcwMiwgS0VZX1BPV0VSIH0sIC8qIFBPV0VSICovCisJeyAweDAyLCBLRVlfUE9XRVIgfSwgLyogUE9XRVIgKi8KIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX2xpc3QgbWVkaW9uX3gxMF9tYXAgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtc25hcHN0cmVhbS1maXJlZmx5LmMgYi9kcml2ZXJzL21lZGlhL3JjL2tleW1hcHMvcmMtc25hcHN0cmVhbS1maXJlZmx5LmMKaW5kZXggZWYxNDY1Mi4uYzdmMzNlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS9yYy9rZXltYXBzL3JjLXNuYXBzdHJlYW0tZmlyZWZseS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvcmMva2V5bWFwcy9yYy1zbmFwc3RyZWFtLWZpcmVmbHkuYwpAQCAtMjIsNjMgKzIyLDYzIEBACiAjaW5jbHVkZSA8bWVkaWEvcmMtbWFwLmg+CiAKIHN0YXRpYyBzdHJ1Y3QgcmNfbWFwX3RhYmxlIHNuYXBzdHJlYW1fZmlyZWZseVtdID0gewotCXsgMHhmMTJjLCBLRVlfWk9PTSB9LCAgICAgICAvKiBNYXhpbWl6ZSAqLwotCXsgMHhjNzAyLCBLRVlfQ0xPU0UgfSwKKwl7IDB4MmMsIEtFWV9aT09NIH0sICAgICAgIC8qIE1heGltaXplICovCisJeyAweDAyLCBLRVlfQ0xPU0UgfSwKIAotCXsgMHhkMjBkLCBLRVlfMSB9LAotCXsgMHhkMzBlLCBLRVlfMiB9LAotCXsgMHhkNDBmLCBLRVlfMyB9LAotCXsgMHhkNTEwLCBLRVlfNCB9LAotCXsgMHhkNjExLCBLRVlfNSB9LAotCXsgMHhkNzEyLCBLRVlfNiB9LAotCXsgMHhkODEzLCBLRVlfNyB9LAotCXsgMHhkOTE0LCBLRVlfOCB9LAotCXsgMHhkYTE1LCBLRVlfOSB9LAotCXsgMHhkYzE3LCBLRVlfMCB9LAotCXsgMHhkYjE2LCBLRVlfQkFDSyB9LAotCXsgMHhkZDE4LCBLRVlfS1BFTlRFUiB9LCAgICAvKiBlbnQgKi8KKwl7IDB4MGQsIEtFWV8xIH0sCisJeyAweDBlLCBLRVlfMiB9LAorCXsgMHgwZiwgS0VZXzMgfSwKKwl7IDB4MTAsIEtFWV80IH0sCisJeyAweDExLCBLRVlfNSB9LAorCXsgMHgxMiwgS0VZXzYgfSwKKwl7IDB4MTMsIEtFWV83IH0sCisJeyAweDE0LCBLRVlfOCB9LAorCXsgMHgxNSwgS0VZXzkgfSwKKwl7IDB4MTcsIEtFWV8wIH0sCisJeyAweDE2LCBLRVlfQkFDSyB9LAorCXsgMHgxOCwgS0VZX0tQRU5URVIgfSwgICAgLyogZW50ICovCiAKLQl7IDB4Y2UwOSwgS0VZX1ZPTFVNRVVQIH0sCi0JeyAweGNkMDgsIEtFWV9WT0xVTUVET1dOIH0sCi0JeyAweGNmMGEsIEtFWV9NVVRFIH0sCi0JeyAweGQwMGIsIEtFWV9DSEFOTkVMVVAgfSwKLQl7IDB4ZDEwYywgS0VZX0NIQU5ORUxET1dOIH0sCi0JeyAweGM1MDAsIEtFWV9WRU5ET1IgfSwgICAgIC8qIGZpcmVmbHkgKi8KKwl7IDB4MDksIEtFWV9WT0xVTUVVUCB9LAorCXsgMHgwOCwgS0VZX1ZPTFVNRURPV04gfSwKKwl7IDB4MGEsIEtFWV9NVVRFIH0sCisJeyAweDBiLCBLRVlfQ0hBTk5FTFVQIH0sCisJeyAweDBjLCBLRVlfQ0hBTk5FTERPV04gfSwKKwl7IDB4MDAsIEtFWV9WRU5ET1IgfSwgICAgIC8qIGZpcmVmbHkgKi8KIAotCXsgMHhmMzJlLCBLRVlfSU5GTyB9LAotCXsgMHhmNDJmLCBLRVlfT1BUSU9OIH0sCisJeyAweDJlLCBLRVlfSU5GTyB9LAorCXsgMHgyZiwgS0VZX09QVElPTiB9LAogCi0JeyAweGUyMWQsIEtFWV9MRUZUIH0sCi0JeyAweGU0MWYsIEtFWV9SSUdIVCB9LAotCXsgMHhlNzIyLCBLRVlfRE9XTiB9LAotCXsgMHhkZjFhLCBLRVlfVVAgfSwKLQl7IDB4ZTMxZSwgS0VZX09LIH0sCisJeyAweDFkLCBLRVlfTEVGVCB9LAorCXsgMHgxZiwgS0VZX1JJR0hUIH0sCisJeyAweDIyLCBLRVlfRE9XTiB9LAorCXsgMHgxYSwgS0VZX1VQIH0sCisJeyAweDFlLCBLRVlfT0sgfSwKIAotCXsgMHhlMTFjLCBLRVlfTUVOVSB9LAotCXsgMHhlNTIwLCBLRVlfRVhJVCB9LAorCXsgMHgxYywgS0VZX01FTlUgfSwKKwl7IDB4MjAsIEtFWV9FWElUIH0sCiAKLQl7IDB4ZWMyNywgS0VZX1JFQ09SRCB9LAotCXsgMHhlYTI1LCBLRVlfUExBWSB9LAotCXsgMHhlZDI4LCBLRVlfU1RPUCB9LAotCXsgMHhlOTI0LCBLRVlfUkVXSU5EIH0sCi0JeyAweGViMjYsIEtFWV9GT1JXQVJEIH0sCi0JeyAweGVlMjksIEtFWV9QQVVTRSB9LAotCXsgMHhmMDJiLCBLRVlfUFJFVklPVVMgfSwKLQl7IDB4ZWYyYSwgS0VZX05FWFQgfSwKKwl7IDB4MjcsIEtFWV9SRUNPUkQgfSwKKwl7IDB4MjUsIEtFWV9QTEFZIH0sCisJeyAweDI4LCBLRVlfU1RPUCB9LAorCXsgMHgyNCwgS0VZX1JFV0lORCB9LAorCXsgMHgyNiwgS0VZX0ZPUldBUkQgfSwKKwl7IDB4MjksIEtFWV9QQVVTRSB9LAorCXsgMHgyYiwgS0VZX1BSRVZJT1VTIH0sCisJeyAweDJhLCBLRVlfTkVYVCB9LAogCi0JeyAweGNiMDYsIEtFWV9BVURJTyB9LCAgICAgIC8qIE11c2ljICovCi0JeyAweGNhMDUsIEtFWV9JTUFHRVMgfSwgICAgIC8qIFBob3RvcyAqLwotCXsgMHhjOTA0LCBLRVlfRFZEIH0sCi0JeyAweGM4MDMsIEtFWV9UViB9LAotCXsgMHhjYzA3LCBLRVlfVklERU8gfSwKKwl7IDB4MDYsIEtFWV9BVURJTyB9LCAgICAgIC8qIE11c2ljICovCisJeyAweDA1LCBLRVlfSU1BR0VTIH0sICAgICAvKiBQaG90b3MgKi8KKwl7IDB4MDQsIEtFWV9EVkQgfSwKKwl7IDB4MDMsIEtFWV9UViB9LAorCXsgMHgwNywgS0VZX1ZJREVPIH0sCiAKLQl7IDB4YzYwMSwgS0VZX0hFTFAgfSwKLQl7IDB4ZjIyZCwgS0VZX01PREUgfSwgICAgICAgLyogTW91c2UgKi8KKwl7IDB4MDEsIEtFWV9IRUxQIH0sCisJeyAweDJkLCBLRVlfTU9ERSB9LCAgICAgICAvKiBNb3VzZSAqLwogCi0JeyAweGRlMTksIEtFWV9BIH0sCi0JeyAweGUwMWIsIEtFWV9CIH0sCi0JeyAweGU2MjEsIEtFWV9DIH0sCi0JeyAweGU4MjMsIEtFWV9EIH0sCisJeyAweDE5LCBLRVlfQSB9LAorCXsgMHgxYiwgS0VZX0IgfSwKKwl7IDB4MjEsIEtFWV9DIH0sCisJeyAweDIzLCBLRVlfRCB9LAogfTsKIAogc3RhdGljIHN0cnVjdCByY19tYXBfbGlzdCBzbmFwc3RyZWFtX2ZpcmVmbHlfbWFwID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9hdTA4MjgvYXUwODI4LWNhcmRzLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtY2FyZHMuYwppbmRleCAzOWZjOTIzLi4xYzYwMTVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtY2FyZHMuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL2F1MDgyOC9hdTA4MjgtY2FyZHMuYwpAQCAtMTYyLDExICsxNjIsMTQgQEAKIAlzd2l0Y2ggKHR2Lm1vZGVsKSB7CiAJY2FzZSA3MjAwMDogLyogV2luVFYtSFZSOTUwcSAoUmV0YWlsLCBJUiwgQVRTQy9RQU0gKi8KIAljYXNlIDcyMDAxOiAvKiBXaW5UVi1IVlI5NTBxIChSZXRhaWwsIElSLCBBVFNDL1FBTSBhbmQgYW5hbG9nIHZpZGVvICovCisJY2FzZSA3MjEwMTogLyogV2luVFYtSFZSOTUwcSAoUmV0YWlsLCBJUiwgQVRTQy9RQU0gYW5kIGFuYWxvZyB2aWRlbyAqLworCWNhc2UgNzIyMDE6IC8qIFdpblRWLUhWUjk1MHEgKE9FTSwgSVIsIEFUU0MvUUFNIGFuZCBhbmFsb2cgdmlkZW8gKi8KIAljYXNlIDcyMjExOiAvKiBXaW5UVi1IVlI5NTBxIChPRU0sIElSLCBBVFNDL1FBTSBhbmQgYW5hbG9nIHZpZGVvICovCiAJY2FzZSA3MjIyMTogLyogV2luVFYtSFZSOTUwcSAoT0VNLCBJUiwgQVRTQy9RQU0gYW5kIGFuYWxvZyB2aWRlbyAqLwogCWNhc2UgNzIyMzE6IC8qIFdpblRWLUhWUjk1MHEgKE9FTSwgSVIsIEFUU0MvUUFNIGFuZCBhbmFsb2cgdmlkZW8gKi8KIAljYXNlIDcyMjQxOiAvKiBXaW5UVi1IVlI5NTBxIChPRU0sIE5vIElSLCBBVFNDL1FBTSBhbmQgYW5hbG9nIHZpZGVvICovCiAJY2FzZSA3MjI1MTogLyogV2luVFYtSFZSOTUwcSAoUmV0YWlsLCBJUiwgQVRTQy9RQU0gYW5kIGFuYWxvZyB2aWRlbyAqLworCWNhc2UgNzIyNjE6IC8qIFdpblRWLUhWUjk1MHEgKE9FTSwgSVIsIEFUU0MvUUFNIGFuZCBhbmFsb2cgdmlkZW8gKi8KIAljYXNlIDcyMzAxOiAvKiBXaW5UVi1IVlI4NTAgKFJldGFpbCwgSVIsIEFUU0MgYW5kIGFuYWxvZyB2aWRlbyAqLwogCWNhc2UgNzI1MDA6IC8qIFdpblRWLUhWUjk1MHEgKE9FTSwgTm8gSVIsIEFUU0MvUUFNICovCiAJCWJyZWFrOwpAQCAtMzI0LDYgKzMyNywxMCBAQAogCQkuZHJpdmVyX2luZm8gPSBBVTA4MjhfQk9BUkRfSEFVUFBBVUdFX0hWUjk1MFFfTVhMIH0sCiAJeyBVU0JfREVWSUNFKDB4MjA0MCwgMHg4MjAwKSwKIAkJLmRyaXZlcl9pbmZvID0gQVUwODI4X0JPQVJEX0hBVVBQQVVHRV9XT09EQlVSWSB9LAorCXsgVVNCX0RFVklDRSgweDIwNDAsIDB4NzI2MCksCisJCS5kcml2ZXJfaW5mbyA9IEFVMDgyOF9CT0FSRF9IQVVQUEFVR0VfSFZSOTUwUSB9LAorCXsgVVNCX0RFVklDRSgweDIwNDAsIDB4NzIxMyksCisJCS5kcml2ZXJfaW5mbyA9IEFVMDgyOF9CT0FSRF9IQVVQUEFVR0VfSFZSOTUwUSB9LAogCXsgfSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vZ3NwY2EvZ3NwY2EuYwppbmRleCA4ODFlMDRjLi4yY2ExMGRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL2dzcGNhL2dzcGNhLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9nc3BjYS9nc3BjYS5jCkBAIC04MzgsMTMgKzgzOCwxMyBAQAogCWdzcGNhX2Rldi0+dXNiX2VyciA9IDA7CiAKIAkvKiBkbyB0aGUgc3BlY2lmaWMgc3ViZHJpdmVyIHN0dWZmIGJlZm9yZSBlbmRwb2ludCBzZWxlY3Rpb24gKi8KLQlnc3BjYV9kZXYtPmFsdCA9IDA7CisJaW50ZiA9IHVzYl9pZm51bV90b19pZihnc3BjYV9kZXYtPmRldiwgZ3NwY2FfZGV2LT5pZmFjZSk7CisJZ3NwY2FfZGV2LT5hbHQgPSBnc3BjYV9kZXYtPmNhbS5idWxrID8gaW50Zi0+bnVtX2FsdHNldHRpbmcgOiAwOwogCWlmIChnc3BjYV9kZXYtPnNkX2Rlc2MtPmlzb2NfaW5pdCkgewogCQlyZXQgPSBnc3BjYV9kZXYtPnNkX2Rlc2MtPmlzb2NfaW5pdChnc3BjYV9kZXYpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gdW5sb2NrOwogCX0KLQlpbnRmID0gdXNiX2lmbnVtX3RvX2lmKGdzcGNhX2Rldi0+ZGV2LCBnc3BjYV9kZXYtPmlmYWNlKTsKIAl4ZmVyID0gZ3NwY2FfZGV2LT5jYW0uYnVsayA/IFVTQl9FTkRQT0lOVF9YRkVSX0JVTEsKIAkJCQkgICA6IFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M7CiAKQEAgLTk1Nyw3ICs5NTcsNyBAQAogCQkJCXJldCA9IC1FSU87CiAJCQkJZ290byBvdXQ7CiAJCQl9Ci0JCQlhbHQgPSBlcF90YlstLWFsdF9pZHhdLmFsdDsKKwkJCWdzcGNhX2Rldi0+YWx0ID0gZXBfdGJbLS1hbHRfaWR4XS5hbHQ7CiAJCX0KIAl9CiBvdXQ6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHMuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9scy5oCmluZGV4IDg5ZDA5YTguLjgyYzg4MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9scy5oCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9scy5oCkBAIC0xNjIsNyArMTYyLDYgQEAKICAqIEBwYWQ6IG1lZGlhIHBhZAogICogQGZmbXQ6IGN1cnJlbnQgZm10IGFjY29yZGluZyB0byByZXNvbHV0aW9uIHR5cGUKICAqIEByZXNfdHlwZTogY3VycmVudCByZXNvbHV0aW9uIHR5cGUKLSAqIEBjb2RlOiBjdXJyZW50IGNvZGUKICAqIEBpcnFfd2FpdHE6IHdhaXRxdWV1ZSBmb3IgdGhlIGNhcHR1cmUKICAqIEB3b3JrX2lycTogd29ya3F1ZXVlIGZvciB0aGUgSVJRCiAgKiBAZmxhZ3M6IHN0YXRlIHZhcmlhYmxlIGZvciB0aGUgaW50ZXJydXB0IGhhbmRsZXIKQEAgLTE5Miw3ICsxOTEsNiBAQAogCXN0cnVjdCBtZWRpYV9wYWQgcGFkOwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgZmZtdFtNNU1PTFNfUkVTVFlQRV9NQVhdOwogCWludCByZXNfdHlwZTsKLQllbnVtIHY0bDJfbWJ1c19waXhlbGNvZGUgY29kZTsKIAl3YWl0X3F1ZXVlX2hlYWRfdCBpcnFfd2FpdHE7CiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfaXJxOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9tNW1vbHMvbTVtb2xzX2NvcmUuYwppbmRleCAwNWFiMzcwLi5lMGYwOWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL201bW9scy9tNW1vbHNfY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbTVtb2xzL201bW9sc19jb3JlLmMKQEAgLTMzNCw3ICszMzQsNyBAQAogCWludCByZXQgPSAtRUlOVkFMOwogCXU4IHJlZzsKIAotCWlmIChtb2RlIDwgUkVHX1BBUkFNRVRFUiAmJiBtb2RlID4gUkVHX0NBUFRVUkUpCisJaWYgKG1vZGUgPCBSRUdfUEFSQU1FVEVSIHx8IG1vZGUgPiBSRUdfQ0FQVFVSRSkKIAkJcmV0dXJuIHJldDsKIAogCXJldCA9IG01bW9sc19yZWFkX3U4KHNkLCBTWVNURU1fU1lTTU9ERSwgJnJlZyk7CkBAIC01MTEsOSArNTExLDYgQEAKIAlzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8gPSB0b19tNW1vbHMoc2QpOwogCXN0cnVjdCB2NGwyX21idXNfZnJhbWVmbXQgKmZvcm1hdDsKIAotCWlmIChmbXQtPnBhZCAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCWZvcm1hdCA9IF9fZmluZF9mb3JtYXQoaW5mbywgZmgsIGZtdC0+d2hpY2gsIGluZm8tPnJlc190eXBlKTsKIAlpZiAoIWZvcm1hdCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01MzIsOSArNTI5LDYgQEAKIAl1MzIgcmVzb2x1dGlvbiA9IDA7CiAJaW50IHJldDsKIAotCWlmIChmbXQtPnBhZCAhPSAwKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCXJldCA9IF9fZmluZF9yZXNvbHV0aW9uKHNkLCBmb3JtYXQsICZ0eXBlLCAmcmVzb2x1dGlvbik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC01NDMsMTMgKzUzNywxNCBAQAogCWlmICghc2ZtdCkKIAkJcmV0dXJuIDA7CiAKLQkqc2ZtdAkJPSBtNW1vbHNfZGVmYXVsdF9mZm10W3R5cGVdOwotCXNmbXQtPndpZHRoCT0gZm9ybWF0LT53aWR0aDsKLQlzZm10LT5oZWlnaHQJPSBmb3JtYXQtPmhlaWdodDsKKworCWZvcm1hdC0+Y29kZSA9IG01bW9sc19kZWZhdWx0X2ZmbXRbdHlwZV0uY29kZTsKKwlmb3JtYXQtPmNvbG9yc3BhY2UgPSBWNEwyX0NPTE9SU1BBQ0VfSlBFRzsKKwlmb3JtYXQtPmZpZWxkID0gVjRMMl9GSUVMRF9OT05FOwogCiAJaWYgKGZtdC0+d2hpY2ggPT0gVjRMMl9TVUJERVZfRk9STUFUX0FDVElWRSkgeworCQkqc2ZtdCA9ICpmb3JtYXQ7CiAJCWluZm8tPnJlc29sdXRpb24gPSByZXNvbHV0aW9uOwotCQlpbmZvLT5jb2RlID0gZm9ybWF0LT5jb2RlOwogCQlpbmZvLT5yZXNfdHlwZSA9IHR5cGU7CiAJfQogCkBAIC02MjYsMTMgKzYyMSwxNCBAQAogc3RhdGljIGludCBtNW1vbHNfc19zdHJlYW0oc3RydWN0IHY0bDJfc3ViZGV2ICpzZCwgaW50IGVuYWJsZSkKIHsKIAlzdHJ1Y3QgbTVtb2xzX2luZm8gKmluZm8gPSB0b19tNW1vbHMoc2QpOworCXUzMiBjb2RlID0gaW5mby0+ZmZtdFtpbmZvLT5yZXNfdHlwZV0uY29kZTsKIAogCWlmIChlbmFibGUpIHsKIAkJaW50IHJldCA9IC1FSU5WQUw7CiAKLQkJaWYgKGlzX2NvZGUoaW5mby0+Y29kZSwgTTVNT0xTX1JFU1RZUEVfTU9OSVRPUikpCisJCWlmIChpc19jb2RlKGNvZGUsIE01TU9MU19SRVNUWVBFX01PTklUT1IpKQogCQkJcmV0ID0gbTVtb2xzX3N0YXJ0X21vbml0b3IoaW5mbyk7Ci0JCWlmIChpc19jb2RlKGluZm8tPmNvZGUsIE01TU9MU19SRVNUWVBFX0NBUFRVUkUpKQorCQlpZiAoaXNfY29kZShjb2RlLCBNNU1PTFNfUkVTVFlQRV9DQVBUVVJFKSkKIAkJCXJldCA9IG01bW9sc19zdGFydF9jYXB0dXJlKGluZm8pOwogCiAJCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OW0xMTEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jCmluZGV4IGNmMmMwZmIuLjM5OGY5NmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5bTExMS5jCkBAIC05NTUsNiArOTU1LDcgQEAKIAltdDltMTExLT5yZWN0LmhlaWdodAk9IE1UOU0xMTFfTUFYX0hFSUdIVDsKIAltdDltMTExLT5mbXQJCT0gJm10OW0xMTFfY29sb3VyX2ZtdHNbMF07CiAJbXQ5bTExMS0+bGFzdHBhZ2UJPSAtMTsKKwltdXRleF9pbml0KCZtdDltMTExLT5wb3dlcl9sb2NrKTsKIAogCXJldCA9IG10OW0xMTFfdmlkZW9fcHJvYmUoY2xpZW50KTsKIAlpZiAocmV0KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL210OXQxMTIuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDExMi5jCmluZGV4IDMyMTE0YTMuLjdiMzRiMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDExMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vbXQ5dDExMi5jCkBAIC0xMDgzLDggKzEwODMsMTAgQEAKIAl2NGwyX2kyY19zdWJkZXZfaW5pdCgmcHJpdi0+c3ViZGV2LCBjbGllbnQsICZtdDl0MTEyX3N1YmRldl9vcHMpOwogCiAJcmV0ID0gbXQ5dDExMl9jYW1lcmFfcHJvYmUoY2xpZW50KTsKLQlpZiAocmV0KQorCWlmIChyZXQpIHsKIAkJa2ZyZWUocHJpdik7CisJCXJldHVybiByZXQ7CisJfQogCiAJLyogQ2Fubm90IGZhaWw6IHVzaW5nIHRoZSBkZWZhdWx0IHN1cHBvcnRlZCBwaXhlbCBjb2RlICovCiAJbXQ5dDExMl9zZXRfcGFyYW1zKHByaXYsICZyZWN0LCBWNEwyX01CVVNfRk1UX1VZVlk4XzJYOCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAvb21hcF92b3V0LmMKaW5kZXggOWM1YzE5Zi4uZWUwZDBiMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwL29tYXBfdm91dC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcC9vbWFwX3ZvdXQuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZpZGVvZGV2Mi5oPgogI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSA8bWVkaWEvdmlkZW9idWYtZG1hLWNvbnRpZy5oPgogI2luY2x1ZGUgPG1lZGlhL3Y0bDItZGV2aWNlLmg+CkBAIC0yMTY5LDYgKzIxNzAsMTQgQEAKIAl2aWRfZGV2LT5udW1fZGlzcGxheXMgPSAwOwogCWZvcl9lYWNoX2Rzc19kZXYoZHNzZGV2KSB7CiAJCW9tYXBfZHNzX2dldF9kZXZpY2UoZHNzZGV2KTsKKworCQlpZiAoIWRzc2Rldi0+ZHJpdmVyKSB7CisJCQlkZXZfd2FybigmcGRldi0+ZGV2LCAibm8gZHJpdmVyIGZvciBkaXNwbGF5OiAlc1xuIiwKKwkJCQkJZHNzZGV2LT5uYW1lKTsKKwkJCW9tYXBfZHNzX3B1dF9kZXZpY2UoZHNzZGV2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKIAkJdmlkX2Rldi0+ZGlzcGxheXNbdmlkX2Rldi0+bnVtX2Rpc3BsYXlzKytdID0gZHNzZGV2OwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMV9jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDFfY2FtZXJhLmMKaW5kZXggZTg3YWUyZi4uNmE2Y2YzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMV9jYW1lcmEuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAxX2NhbWVyYS5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0tZG1hLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAyNHh4Y2FtLWRtYS5jCmluZGV4IDFkNTRiODYuLjNlYTM4YTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDI0eHhjYW0tZG1hLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwMjR4eGNhbS1kbWEuYwpAQCAtNTA2LDcgKzUwNiw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgc2dkbWFfc3RhdGUgKnNnX3N0YXRlOwogCi0JaWYgKChzZ2xlbiA8IDApIHx8ICgoc2dsZW4gPiAwKSAmICFzZ2xpc3QpKQorCWlmICgoc2dsZW4gPCAwKSB8fCAoKHNnbGVuID4gMCkgJiYgIXNnbGlzdCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnNnZG1hLT5sb2NrLCBmbGFncyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcGNjZGMuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NkYy5jCmluZGV4IGIwYjBmYTUuLjU0YTRhM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NkYy5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwY2NkYy5jCkBAIC0xNDA4LDcgKzE0MDgsNyBAQAogewogCXN0cnVjdCBpc3BfcGlwZWxpbmUgKnBpcGUgPQogCQl0b19pc3BfcGlwZWxpbmUoJmNjZGMtPnZpZGVvX291dC52aWRlby5lbnRpdHkpOwotCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXYgPSAmY2NkYy0+c3ViZGV2LmRldm5vZGU7CisJc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9IGNjZGMtPnN1YmRldi5kZXZub2RlOwogCXN0cnVjdCB2NGwyX2V2ZW50IGV2ZW50OwogCiAJbWVtc2V0KCZldmVudCwgMCwgc2l6ZW9mKGV2ZW50KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHN0YXQuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5jCmluZGV4IDY4ZDUzOTQuLmJjMGIyYzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwc3RhdC5jCkBAIC00OTYsNyArNDk2LDcgQEAKIAogc3RhdGljIHZvaWQgaXNwX3N0YXRfcXVldWVfZXZlbnQoc3RydWN0IGlzcHN0YXQgKnN0YXQsIGludCBlcnIpCiB7Ci0Jc3RydWN0IHZpZGVvX2RldmljZSAqdmRldiA9ICZzdGF0LT5zdWJkZXYuZGV2bm9kZTsKKwlzdHJ1Y3QgdmlkZW9fZGV2aWNlICp2ZGV2ID0gc3RhdC0+c3ViZGV2LmRldm5vZGU7CiAJc3RydWN0IHY0bDJfZXZlbnQgZXZlbnQ7CiAJc3RydWN0IG9tYXAzaXNwX3N0YXRfZXZlbnRfc3RhdHVzICpzdGF0dXMgPSAodm9pZCAqKWV2ZW50LnUuZGF0YTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9vbWFwM2lzcC9pc3B2aWRlby5jCmluZGV4IGQxMDAwNzIuLmYyMjkwNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb21hcDNpc3AvaXNwdmlkZW8uYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL29tYXAzaXNwL2lzcHZpZGVvLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcGFnZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y2NjUwLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL292NjY1MC5jCmluZGV4IDlmMmQyNmIuLjY4MDYzNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vb3Y2NjUwLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9vdjY2NTAuYwpAQCAtNTQwLDcgKzU0MCw3IEBACiBzdGF0aWMgaW50IG92NjY1MF9zX2ZtdChzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkLCBzdHJ1Y3QgdjRsMl9tYnVzX2ZyYW1lZm10ICptZikKIHsKIAlzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YShzZCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopc2QtPmdycF9pZDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YShzZCk7CiAJc3RydWN0IHNvY19jYW1lcmFfc2Vuc2UgKnNlbnNlID0gaWNkLT5zZW5zZTsKIAlzdHJ1Y3Qgb3Y2NjUwICpwcml2ID0gdG9fb3Y2NjUwKGNsaWVudCk7CiAJYm9vbCBoYWxmX3NjYWxlID0gIWlzX3Vuc2NhbGVkX29rKG1mLT53aWR0aCwgbWYtPmhlaWdodCwgJnByaXYtPnJlY3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNhcHR1cmUuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jYXB0dXJlLmMKaW5kZXggYzhkOTFiMC4uMmNjM2I5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNhcHR1cmUuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY2FwdHVyZS5jCkBAIC05OCw2ICs5OCwxMCBAQAogCQkJdmIyX2J1ZmZlcl9kb25lKCZidWYtPnZiLCBWQjJfQlVGX1NUQVRFX0VSUk9SKTsKIAl9CiAJc2V0X2JpdChTVF9DQVBUX1NVU1BFTkRFRCwgJmZpbWMtPnN0YXRlKTsKKworCWZpbWNfaHdfcmVzZXQoZmltYyk7CisJY2FwLT5idWZfaW5kZXggPSAwOworCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZmltYy0+c2xvY2ssIGZsYWdzKTsKIAogCWlmIChzdHJlYW1pbmcpCkBAIC0xMzcsNyArMTQxLDcgQEAKIAlzdHJ1Y3QgZmltY19kZXYgKmZpbWMgPSBjdHgtPmZpbWNfZGV2OwogCWludCByZXQ7CiAKLQlpZiAodGVzdF9iaXQoU1RfQ0FQVF9BUFBMWV9DRkcsICZmaW1jLT5zdGF0ZSkpCisJaWYgKCF0ZXN0X2JpdChTVF9DQVBUX0FQUExZX0NGRywgJmZpbWMtPnN0YXRlKSkKIAkJcmV0dXJuIDA7CiAKIAlzcGluX2xvY2soJmN0eC0+c2xvY2spOwpAQCAtMTUwLDcgKzE1NCw3IEBACiAJCWZpbWNfaHdfc2V0X3JvdGF0aW9uKGN0eCk7CiAJCWZpbWNfcHJlcGFyZV9kbWFfb2Zmc2V0KGN0eCwgJmN0eC0+ZF9mcmFtZSk7CiAJCWZpbWNfaHdfc2V0X291dF9kbWEoY3R4KTsKLQkJc2V0X2JpdChTVF9DQVBUX0FQUExZX0NGRywgJmZpbWMtPnN0YXRlKTsKKwkJY2xlYXJfYml0KFNUX0NBUFRfQVBQTFlfQ0ZHLCAmZmltYy0+c3RhdGUpOwogCX0KIAlzcGluX3VubG9jaygmY3R4LT5zbG9jayk7CiAJcmV0dXJuIHJldDsKQEAgLTE2NCw3ICsxNjgsNiBAQAogCWludCBtaW5fYnVmczsKIAlpbnQgcmV0OwogCi0JZmltY19od19yZXNldChmaW1jKTsKIAl2aWRfY2FwLT5mcmFtZV9jb3VudCA9IDA7CiAKIAlyZXQgPSBmaW1jX2luaXRfY2FwdHVyZShmaW1jKTsKQEAgLTUyMyw3ICs1MjYsNyBAQAogCW1heF93ID0gcm90YXRpb24gPyBwbC0+b3V0X3JvdF9lbl93IDogcGwtPm91dF9yb3RfZGlzX3c7CiAJbWluX3cgPSBjdHgtPnN0YXRlICYgRklNQ19EU1RfQ1JPUCA/IGRzdC0+d2lkdGggOiB2YXItPm1pbl9vdXRfcGl4c2l6ZTsKIAltaW5faCA9IGN0eC0+c3RhdGUgJiBGSU1DX0RTVF9DUk9QID8gZHN0LT5oZWlnaHQgOiB2YXItPm1pbl9vdXRfcGl4c2l6ZTsKLQlpZiAoZmltYy0+aWQgPT0gMSAmJiB2YXItPnBpeF9ob2ZmKQorCWlmICh2YXItPm1pbl92c2l6ZV9hbGlnbiA9PSAxICYmICFyb3RhdGlvbikKIAkJYWxpZ25faCA9IGZpbWNfZm10X2lzX3JnYihmZm10LT5jb2xvcikgPyAwIDogMTsKIAogCWRlcHRoID0gZmltY19nZXRfZm9ybWF0X2RlcHRoKGZmbXQpOwpAQCAtMTIzOSw2ICsxMjQyLDcgQEAKIAogCW11dGV4X2xvY2soJmZpbWMtPmxvY2spOwogCXNldF9mcmFtZV9ib3VuZHMoZmYsIG1mLT53aWR0aCwgbWYtPmhlaWdodCk7CisJZmltYy0+dmlkX2NhcC5tZiA9ICptZjsKIAlmZi0+Zm10ID0gZmZtdDsKIAogCS8qIFJlc2V0IHRoZSBjcm9wIHJlY3RhbmdsZSBpZiByZXF1aXJlZC4gKi8KQEAgLTEzNzUsNyArMTM3OSw3IEBACiAJbWVkaWFfZW50aXR5X2NsZWFudXAoJnNkLT5lbnRpdHkpOwogCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKIAlrZnJlZShzZCk7Ci0Jc2QgPSBOVUxMOworCWZpbWMtPnZpZF9jYXAuc3ViZGV2ID0gTlVMTDsKIH0KIAogLyogU2V0IGRlZmF1bHQgZm9ybWF0IGF0IHRoZSBzZW5zb3IgYW5kIGhvc3QgaW50ZXJmYWNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuYwppbmRleCAxOWNhNmRiLi4wN2M2MjU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmMKQEAgLTM3LDcgKzM3LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgZmltY19mbXQgZmltY19mb3JtYXRzW10gPSB7CiAJewogCQkubmFtZQkJPSAiUkdCNTY1IiwKLQkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfUkdCNTY1WCwKKwkJLmZvdXJjYwkJPSBWNEwyX1BJWF9GTVRfUkdCNTY1LAogCQkuZGVwdGgJCT0geyAxNiB9LAogCQkuY29sb3IJCT0gUzVQX0ZJTUNfUkdCNTY1LAogCQkubWVtcGxhbmVzCT0gMSwKQEAgLTEwMzgsMTIgKzEwMzgsMTEgQEAKIAkJbW9kX3ggPSA2OyAvKiA2NCB4IDMyIHBpeGVscyB0aWxlICovCiAJCW1vZF95ID0gNTsKIAl9IGVsc2UgewotCQlpZiAoZmltYy0+aWQgPT0gMSAmJiB2YXJpYW50LT5waXhfaG9mZikKKwkJaWYgKHZhcmlhbnQtPm1pbl92c2l6ZV9hbGlnbiA9PSAxKQogCQkJbW9kX3kgPSBmaW1jX2ZtdF9pc19yZ2IoZm10LT5jb2xvcikgPyAwIDogMTsKIAkJZWxzZQotCQkJbW9kX3kgPSBtb2RfeDsKKwkJCW1vZF95ID0gZmZzKHZhcmlhbnQtPm1pbl92c2l6ZV9hbGlnbikgLSAxOwogCX0KLQlkYmcoIm1vZF94OiAlZCwgbW9kX3k6ICVkLCBtYXhfdzogJWQiLCBtb2RfeCwgbW9kX3ksIG1heF93KTsKIAogCXY0bF9ib3VuZF9hbGlnbl9pbWFnZSgmcGl4LT53aWR0aCwgMTYsIG1heF93LCBtb2RfeCwKIAkJJnBpeC0+aGVpZ2h0LCA4LCB2YXJpYW50LT5waXhfbGltaXQtPnNjYWxlcl9kaXNfdywgbW9kX3ksIDApOwpAQCAtMTIyNiwxMCArMTIyNSwxMCBAQAogCQlmaW1jLT52YXJpYW50LT5taW5faW5wX3BpeHNpemUgOiBmaW1jLT52YXJpYW50LT5taW5fb3V0X3BpeHNpemU7CiAKIAkvKiBHZXQgcGl4ZWwgYWxpZ25tZW50IGNvbnN0cmFpbnRzLiAqLwotCWlmIChmaW1jLT5pZCA9PSAxICYmIGZpbWMtPnZhcmlhbnQtPnBpeF9ob2ZmKQorCWlmIChmaW1jLT52YXJpYW50LT5taW5fdnNpemVfYWxpZ24gPT0gMSkKIAkJaGFsaWduID0gZmltY19mbXRfaXNfcmdiKGYtPmZtdC0+Y29sb3IpID8gMCA6IDE7CiAJZWxzZQotCQloYWxpZ24gPSBmZnMobWluX3NpemUpIC0gMTsKKwkJaGFsaWduID0gZmZzKGZpbWMtPnZhcmlhbnQtPm1pbl92c2l6ZV9hbGlnbikgLSAxOwogCiAJZm9yIChpID0gMDsgaSA8IGYtPmZtdC0+Y29scGxhbmVzOyBpKyspCiAJCWRlcHRoICs9IGYtPmZtdC0+ZGVwdGhbaV07CkBAIC0xNjE1LDcgKzE2MTQsNiBAQAogCXBkYXRhID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7CiAJZmltYy0+cGRhdGEgPSBwZGF0YTsKIAotCXNldF9iaXQoU1RfTFBNLCAmZmltYy0+c3RhdGUpOwogCiAJaW5pdF93YWl0cXVldWVfaGVhZCgmZmltYy0+aXJxX3F1ZXVlKTsKIAlzcGluX2xvY2tfaW5pdCgmZmltYy0+c2xvY2spOwpAQCAtMTcwNyw4ICsxNzA1LDYgQEAKIAkvKiBFbmFibGUgY2xvY2tzIGFuZCBwZXJmb3JtIGJhc2ljIGluaXRhbGl6YXRpb24gKi8KIAljbGtfZW5hYmxlKGZpbWMtPmNsb2NrW0NMS19HQVRFXSk7CiAJZmltY19od19yZXNldChmaW1jKTsKLQlpZiAoZmltYy0+dmFyaWFudC0+b3V0X2J1Zl9jb3VudCA+IDQpCi0JCWZpbWNfaHdfc2V0X2RtYV9zZXEoZmltYywgMHhGKTsKIAogCS8qIFJlc3VtZSB0aGUgY2FwdHVyZSBvciBtZW0tdG8tbWVtIGRldmljZSAqLwogCWlmIChmaW1jX2NhcHR1cmVfYnVzeShmaW1jKSkKQEAgLTE3NTAsOCArMTc0Niw2IEBACiAJCXJldHVybiAwOwogCX0KIAlmaW1jX2h3X3Jlc2V0KGZpbWMpOwotCWlmIChmaW1jLT52YXJpYW50LT5vdXRfYnVmX2NvdW50ID4gNCkKLQkJZmltY19od19zZXRfZG1hX3NlcShmaW1jLCAweEYpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZpbWMtPnNsb2NrLCBmbGFncyk7CiAKIAlpZiAoZmltY19jYXB0dXJlX2J1c3koZmltYykpCkBAIC0xNzgwLDcgKzE3NzQsNiBAQAogCXN0cnVjdCBmaW1jX2RldiAqZmltYyA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCiAJcG1fcnVudGltZV9kaXNhYmxlKCZwZGV2LT5kZXYpOwotCWZpbWNfcnVudGltZV9zdXNwZW5kKCZwZGV2LT5kZXYpOwogCXBtX3J1bnRpbWVfc2V0X3N1c3BlbmRlZCgmcGRldi0+ZGV2KTsKIAogCXZiMl9kbWFfY29udGlnX2NsZWFudXBfY3R4KGZpbWMtPmFsbG9jX2N0eCk7CkBAIC0xODQwLDYgKzE4MzMsNyBAQAogCS5taW5faW5wX3BpeHNpemUgPSAxNiwKIAkubWluX291dF9waXhzaXplID0gMTYsCiAJLmhvcl9vZmZzX2FsaWduCSA9IDgsCisJLm1pbl92c2l6ZV9hbGlnbiA9IDE2LAogCS5vdXRfYnVmX2NvdW50CSA9IDQsCiAJLnBpeF9saW1pdAkgPSAmczVwX3BpeF9saW1pdFswXSwKIH07CkBAIC0xODQ5LDYgKzE4NDMsNyBAQAogCS5taW5faW5wX3BpeHNpemUgPSAxNiwKIAkubWluX291dF9waXhzaXplID0gMTYsCiAJLmhvcl9vZmZzX2FsaWduCSA9IDgsCisJLm1pbl92c2l6ZV9hbGlnbiA9IDE2LAogCS5vdXRfYnVmX2NvdW50CSA9IDQsCiAJLnBpeF9saW1pdCA9ICZzNXBfcGl4X2xpbWl0WzFdLAogfTsKQEAgLTE4NjEsNiArMTg1Niw3IEBACiAJLm1pbl9pbnBfcGl4c2l6ZSA9IDE2LAogCS5taW5fb3V0X3BpeHNpemUgPSAxNiwKIAkuaG9yX29mZnNfYWxpZ24JID0gOCwKKwkubWluX3ZzaXplX2FsaWduID0gMTYsCiAJLm91dF9idWZfY291bnQJID0gNCwKIAkucGl4X2xpbWl0CSA9ICZzNXBfcGl4X2xpbWl0WzFdLAogfTsKQEAgLTE4NzQsNiArMTg3MCw3IEBACiAJLm1pbl9pbnBfcGl4c2l6ZSA9IDE2LAogCS5taW5fb3V0X3BpeHNpemUgPSAxNiwKIAkuaG9yX29mZnNfYWxpZ24JID0gMSwKKwkubWluX3ZzaXplX2FsaWduID0gMSwKIAkub3V0X2J1Zl9jb3VudAkgPSA0LAogCS5waXhfbGltaXQJID0gJnM1cF9waXhfbGltaXRbMl0sCiB9OwpAQCAtMTg4NCw2ICsxODgxLDcgQEAKIAkubWluX2lucF9waXhzaXplID0gMTYsCiAJLm1pbl9vdXRfcGl4c2l6ZSA9IDE2LAogCS5ob3Jfb2Zmc19hbGlnbgkgPSA4LAorCS5taW5fdnNpemVfYWxpZ24gPSAxNiwKIAkub3V0X2J1Zl9jb3VudAkgPSA0LAogCS5waXhfbGltaXQJID0gJnM1cF9waXhfbGltaXRbMl0sCiB9OwpAQCAtMTg5OCw2ICsxODk2LDcgQEAKIAkubWluX2lucF9waXhzaXplID0gMTYsCiAJLm1pbl9vdXRfcGl4c2l6ZSA9IDE2LAogCS5ob3Jfb2Zmc19hbGlnbgkgPSAyLAorCS5taW5fdnNpemVfYWxpZ24gPSAxLAogCS5vdXRfYnVmX2NvdW50CSA9IDMyLAogCS5waXhfbGltaXQJID0gJnM1cF9waXhfbGltaXRbMV0sCiB9OwpAQCAtMTkxMCw2ICsxOTA5LDcgQEAKIAkubWluX2lucF9waXhzaXplID0gMTYsCiAJLm1pbl9vdXRfcGl4c2l6ZSA9IDE2LAogCS5ob3Jfb2Zmc19hbGlnbgkgPSAyLAorCS5taW5fdnNpemVfYWxpZ24gPSAxLAogCS5vdXRfYnVmX2NvdW50CSA9IDMyLAogCS5waXhfbGltaXQJID0gJnM1cF9waXhfbGltaXRbM10sCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuaCBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1jb3JlLmgKaW5kZXggYTY5MzZkYS4uYzdmMDFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLWNvcmUuaAorKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtY29yZS5oCkBAIC0zNzcsNiArMzc3LDcgQEAKICAqIEBtaW5faW5wX3BpeHNpemU6IG1pbmltdW0gaW5wdXQgcGl4ZWwgc2l6ZQogICogQG1pbl9vdXRfcGl4c2l6ZTogbWluaW11bSBvdXRwdXQgcGl4ZWwgc2l6ZQogICogQGhvcl9vZmZzX2FsaWduOiBob3Jpem9udGFsIHBpeGVsIG9mZnNldCBhbGlnbWVudAorICogQG1pbl92c2l6ZV9hbGlnbjogbWluaW11bSB2ZXJ0aWNhbCBwaXhlbCBzaXplIGFsaWdubWVudAogICogQG91dF9idWZfY291bnQ6IHRoZSBudW1iZXIgb2YgYnVmZmVycyBpbiBvdXRwdXQgRE1BIHNlcXVlbmNlCiAgKi8KIHN0cnVjdCBzYW1zdW5nX2ZpbWNfdmFyaWFudCB7CkBAIC0zOTAsNiArMzkxLDcgQEAKIAl1MTYJCW1pbl9pbnBfcGl4c2l6ZTsKIAl1MTYJCW1pbl9vdXRfcGl4c2l6ZTsKIAl1MTYJCWhvcl9vZmZzX2FsaWduOworCXUxNgkJbWluX3ZzaXplX2FsaWduOwogCXUxNgkJb3V0X2J1Zl9jb3VudDsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1tZGV2aWNlLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtbWRldmljZS5jCmluZGV4IGNjMzM3YjEuLjYxNWM4NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1tZGV2aWNlLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLW1kZXZpY2UuYwpAQCAtMjIwLDYgKzIyMCw3IEBACiAJc2QgPSB2NGwyX2kyY19uZXdfc3ViZGV2X2JvYXJkKCZmbWQtPnY0bDJfZGV2LCBhZGFwdGVyLAogCQkJCSAgICAgICBzX2luZm8tPnBkYXRhLT5ib2FyZF9pbmZvLCBOVUxMKTsKIAlpZiAoSVNfRVJSX09SX05VTEwoc2QpKSB7CisJCWkyY19wdXRfYWRhcHRlcihhZGFwdGVyKTsKIAkJdjRsMl9lcnIoJmZtZC0+djRsMl9kZXYsICJGYWlsZWQgdG8gYWNxdWlyZSBzdWJkZXZcbiIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yMzQsMTIgKzIzNSwxNSBAQAogc3RhdGljIHZvaWQgZmltY19tZF91bnJlZ2lzdGVyX3NlbnNvcihzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkKQogewogCXN0cnVjdCBpMmNfY2xpZW50ICpjbGllbnQgPSB2NGwyX2dldF9zdWJkZXZkYXRhKHNkKTsKKwlzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXI7CiAKIAlpZiAoIWNsaWVudCkKIAkJcmV0dXJuOwogCXY0bDJfZGV2aWNlX3VucmVnaXN0ZXJfc3ViZGV2KHNkKTsKKwlhZGFwdGVyID0gY2xpZW50LT5hZGFwdGVyOwogCWkyY191bnJlZ2lzdGVyX2RldmljZShjbGllbnQpOwotCWkyY19wdXRfYWRhcHRlcihjbGllbnQtPmFkYXB0ZXIpOworCWlmIChhZGFwdGVyKQorCQlpMmNfcHV0X2FkYXB0ZXIoYWRhcHRlcik7CiB9CiAKIHN0YXRpYyBpbnQgZmltY19tZF9yZWdpc3Rlcl9zZW5zb3JfZW50aXRpZXMoc3RydWN0IGZpbWNfbWQgKmZtZCkKQEAgLTM4MSwyMCArMzg1LDI4IEBACiAKIHN0YXRpYyBpbnQgZmltY19tZF9yZWdpc3Rlcl92aWRlb19ub2RlcyhzdHJ1Y3QgZmltY19tZCAqZm1kKQogeworCXN0cnVjdCB2aWRlb19kZXZpY2UgKnZkZXY7CiAJaW50IGksIHJldCA9IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgRklNQ19NQVhfREVWUyAmJiAhcmV0OyBpKyspIHsKIAkJaWYgKCFmbWQtPmZpbWNbaV0pCiAJCQljb250aW51ZTsKIAotCQlpZiAoZm1kLT5maW1jW2ldLT5tMm0udmZkKQotCQkJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKGZtZC0+ZmltY1tpXS0+bTJtLnZmZCwKLQkJCQkJCSAgICBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7Ci0JCWlmIChyZXQpCi0JCQlicmVhazsKLQkJaWYgKGZtZC0+ZmltY1tpXS0+dmlkX2NhcC52ZmQpCi0JCQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UoZm1kLT5maW1jW2ldLT52aWRfY2FwLnZmZCwKLQkJCQkJCSAgICBWRkxfVFlQRV9HUkFCQkVSLCAtMSk7CisJCXZkZXYgPSBmbWQtPmZpbWNbaV0tPm0ybS52ZmQ7CisJCWlmICh2ZGV2KSB7CisJCQlyZXQgPSB2aWRlb19yZWdpc3Rlcl9kZXZpY2UodmRldiwgVkZMX1RZUEVfR1JBQkJFUiwgLTEpOworCQkJaWYgKHJldCkKKwkJCQlicmVhazsKKwkJCXY0bDJfaW5mbygmZm1kLT52NGwyX2RldiwgIlJlZ2lzdGVyZWQgJXMgYXMgL2Rldi8lc1xuIiwKKwkJCQkgIHZkZXYtPm5hbWUsIHZpZGVvX2RldmljZV9ub2RlX25hbWUodmRldikpOworCQl9CisKKwkJdmRldiA9IGZtZC0+ZmltY1tpXS0+dmlkX2NhcC52ZmQ7CisJCWlmICh2ZGV2ID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJcmV0ID0gdmlkZW9fcmVnaXN0ZXJfZGV2aWNlKHZkZXYsIFZGTF9UWVBFX0dSQUJCRVIsIC0xKTsKKwkJdjRsMl9pbmZvKCZmbWQtPnY0bDJfZGV2LCAiUmVnaXN0ZXJlZCAlcyBhcyAvZGV2LyVzXG4iLAorCQkJICB2ZGV2LT5uYW1lLCB2aWRlb19kZXZpY2Vfbm9kZV9uYW1lKHZkZXYpKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtNTAyLDcgKzUxNCw3IEBACiAJCQlpZiAoV0FSTihjc2lzID09IE5VTEwsCiAJCQkJICJNSVBJLUNTSSBpbnRlcmZhY2Ugc3BlY2lmaWVkICIKIAkJCQkgImJ1dCBzNXAtY3NpcyBtb2R1bGUgaXMgbm90IGxvYWRlZCFcbiIpKQotCQkJCWNvbnRpbnVlOworCQkJCXJldHVybiAtRUlOVkFMOwogCiAJCQlyZXQgPSBtZWRpYV9lbnRpdHlfY3JlYXRlX2xpbmsoJnNlbnNvci0+ZW50aXR5LCAwLAogCQkJCQkgICAgICAmY3Npcy0+ZW50aXR5LCBDU0lTX1BBRF9TSU5LLApAQCAtNzQyLDkgKzc1NCw2IEBACiAJc3RydWN0IGZpbWNfbWQgKmZtZDsKIAlpbnQgcmV0OwogCi0JaWYgKFdBUk4oIXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhLCAiUGxhdGZvcm0gZGF0YSBub3Qgc3BlY2lmaWVkIVxuIikpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJZm1kID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGZpbWNfbWQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZtZCkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC03ODIsOSArNzkxLDExIEBACiAJaWYgKHJldCkKIAkJZ290byBlcnIzOwogCi0JcmV0ID0gZmltY19tZF9yZWdpc3Rlcl9zZW5zb3JfZW50aXRpZXMoZm1kKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjM7CisJaWYgKHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhKSB7CisJCXJldCA9IGZpbWNfbWRfcmVnaXN0ZXJfc2Vuc29yX2VudGl0aWVzKGZtZCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycjM7CisJfQogCXJldCA9IGZpbWNfbWRfY3JlYXRlX2xpbmtzKGZtZCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnIzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLXJlZy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtZmltYy9maW1jLXJlZy5jCmluZGV4IDIwZTY2NGUuLjQ0ZjVjMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLWZpbWMvZmltYy1yZWcuYworKysgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC1maW1jL2ZpbWMtcmVnLmMKQEAgLTM1LDYgKzM1LDkgQEAKIAljZmcgPSByZWFkbChkZXYtPnJlZ3MgKyBTNVBfQ0lHQ1RSTCk7CiAJY2ZnICY9IH5TNVBfQ0lHQ1RSTF9TV1JTVDsKIAl3cml0ZWwoY2ZnLCBkZXYtPnJlZ3MgKyBTNVBfQ0lHQ1RSTCk7CisKKwlpZiAoZGV2LT52YXJpYW50LT5vdXRfYnVmX2NvdW50ID4gNCkKKwkJZmltY19od19zZXRfZG1hX3NlcShkZXYsIDB4Rik7CiB9CiAKIHN0YXRpYyB1MzIgZmltY19od19nZXRfaW5fZmxpcChzdHJ1Y3QgZmltY19jdHggKmN0eCkKQEAgLTI1MSw3ICsyNTQsMTQgQEAKIAlzdHJ1Y3QgZmltY19zY2FsZXIgKnNjID0gJmN0eC0+c2NhbGVyOwogCXN0cnVjdCBmaW1jX2ZyYW1lICpzcmNfZnJhbWUgPSAmY3R4LT5zX2ZyYW1lOwogCXN0cnVjdCBmaW1jX2ZyYW1lICpkc3RfZnJhbWUgPSAmY3R4LT5kX2ZyYW1lOwotCXUzMiBjZmcgPSAwOworCisJdTMyIGNmZyA9IHJlYWRsKGRldi0+cmVncyArIFM1UF9DSVNDQ1RSTCk7CisKKwljZmcgJj0gfihTNVBfQ0lTQ0NUUkxfQ1NDUjJZX1dJREUgfCBTNVBfQ0lTQ0NUUkxfQ1NDWTJSX1dJREUgfAorCQkgUzVQX0NJU0NDVFJMX1NDQUxFVVBfSCB8IFM1UF9DSVNDQ1RSTF9TQ0FMRVVQX1YgfAorCQkgUzVQX0NJU0NDVFJMX1NDQUxFUkJZUEFTUyB8IFM1UF9DSVNDQ1RSTF9PTkUyT05FIHwKKwkJIFM1UF9DSVNDQ1RSTF9JTlJHQl9GTVRfTUFTSyB8IFM1UF9DSVNDQ1RSTF9PVVRSR0JfRk1UX01BU0sgfAorCQkgUzVQX0NJU0NDVFJMX0lOVEVSTEFDRSB8IFM1UF9DSVNDQ1RSTF9SR0JfRVhUKTsKIAogCWlmICghKGN0eC0+ZmxhZ3MgJiBGSU1DX0NPTE9SX1JBTkdFX05BUlJPVykpCiAJCWNmZyB8PSAoUzVQX0NJU0NDVFJMX0NTQ1IyWV9XSURFIHwgUzVQX0NJU0NDVFJMX0NTQ1kyUl9XSURFKTsKQEAgLTMwOCw5ICszMTgsOSBAQAogCWZpbWNfaHdfc2V0X3NjYWxlcihjdHgpOwogCiAJY2ZnID0gcmVhZGwoZGV2LT5yZWdzICsgUzVQX0NJU0NDVFJMKTsKKwljZmcgJj0gfihTNVBfQ0lTQ0NUUkxfTUhSQVRJT19NQVNLIHwgUzVQX0NJU0NDVFJMX01WUkFUSU9fTUFTSyk7CiAKIAlpZiAodmFyaWFudC0+aGFzX21haW5zY2FsZXJfZXh0KSB7Ci0JCWNmZyAmPSB+KFM1UF9DSVNDQ1RSTF9NSFJBVElPX01BU0sgfCBTNVBfQ0lTQ0NUUkxfTVZSQVRJT19NQVNLKTsKIAkJY2ZnIHw9IFM1UF9DSVNDQ1RSTF9NSFJBVElPX0VYVChzYy0+bWFpbl9ocmF0aW8pOwogCQljZmcgfD0gUzVQX0NJU0NDVFJMX01WUkFUSU9fRVhUKHNjLT5tYWluX3ZyYXRpbyk7CiAJCXdyaXRlbChjZmcsIGRldi0+cmVncyArIFM1UF9DSVNDQ1RSTCk7CkBAIC0zMjMsNyArMzMzLDYgQEAKIAkJY2ZnIHw9IFM1UF9DSUVYVEVOX01WUkFUSU9fRVhUKHNjLT5tYWluX3ZyYXRpbyk7CiAJCXdyaXRlbChjZmcsIGRldi0+cmVncyArIFM1UF9DSUVYVEVOKTsKIAl9IGVsc2UgewotCQljZmcgJj0gfihTNVBfQ0lTQ0NUUkxfTUhSQVRJT19NQVNLIHwgUzVQX0NJU0NDVFJMX01WUkFUSU9fTUFTSyk7CiAJCWNmZyB8PSBTNVBfQ0lTQ0NUUkxfTUhSQVRJTyhzYy0+bWFpbl9ocmF0aW8pOwogCQljZmcgfD0gUzVQX0NJU0NDVFJMX01WUkFUSU8oc2MtPm1haW5fdnJhdGlvKTsKIAkJd3JpdGVsKGNmZywgZGV2LT5yZWdzICsgUzVQX0NJU0NDVFJMKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLW1mYy9zNXBfbWZjX2VuYy5jIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmMKaW5kZXggMWU4Y2RiNy4uZGZmOWRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtbWZjL3M1cF9tZmNfZW5jLmMKQEAgLTYxLDcgKzYxLDcgQEAKIAkJLm51bV9wbGFuZXMgPSAxLAogCX0sCiAJewotCQkubmFtZSA9ICJIMjY0IEVuY29kZWQgU3RyZWFtIiwKKwkJLm5hbWUgPSAiSDI2MyBFbmNvZGVkIFN0cmVhbSIsCiAJCS5mb3VyY2MgPSBWNEwyX1BJWF9GTVRfSDI2MywKIAkJLmNvZGVjX21vZGUgPSBTNVBfRklNVl9DT0RFQ19IMjYzX0VOQywKIAkJLnR5cGUgPSBNRkNfRk1UX0VOQywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3ZpZGVvLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3M1cC10di9taXhlcl92aWRlby5jCmluZGV4IGUxNmQzYTQuLmI0N2QwYzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vczVwLXR2L21peGVyX3ZpZGVvLmMKKysrIGIvZHJpdmVycy9tZWRpYS92aWRlby9zNXAtdHYvbWl4ZXJfdmlkZW8uYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3Y0bDItaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC90aW1lci5oPgogI2luY2x1ZGUgPG1lZGlhL3ZpZGVvYnVmMi1kbWEtY29udGlnLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jZXVfY2FtZXJhLmMKaW5kZXggZjM5MDY4Mi4uYzUxZGVjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY2V1X2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NldV9jYW1lcmEuYwpAQCAtNTY2LDggKzU2NiwxMCBAQAogCXJldCA9IHNoX21vYmlsZV9jZXVfc29mdF9yZXNldChwY2Rldik7CiAKIAljc2kyX3NkID0gZmluZF9jc2kyKHBjZGV2KTsKLQlpZiAoY3NpMl9zZCkKLQkJY3NpMl9zZC0+Z3JwX2lkID0gKGxvbmcpaWNkOworCWlmIChjc2kyX3NkKSB7CisJCWNzaTJfc2QtPmdycF9pZCA9IHNvY19jYW1lcmFfZ3JwX2lkKGljZCk7CisJCXY0bDJfc2V0X3N1YmRldl9ob3N0ZGF0YShjc2kyX3NkLCBpY2QpOworCX0KIAogCXJldCA9IHY0bDJfc3ViZGV2X2NhbGwoY3NpMl9zZCwgY29yZSwgc19wb3dlciwgMSk7CiAJaWYgKHJldCA8IDAgJiYgcmV0ICE9IC1FTk9JT0NUTENNRCAmJiByZXQgIT0gLUVOT0RFVikgewpAQCAtNzY4LDcgKzc3MCw3IEBACiB7CiAJaWYgKHBjZGV2LT5jc2kyX3BkZXYpIHsKIAkJc3RydWN0IHY0bDJfc3ViZGV2ICpjc2kyX3NkID0gZmluZF9jc2kyKHBjZGV2KTsKLQkJaWYgKGNzaTJfc2QgJiYgY3NpMl9zZC0+Z3JwX2lkID09ICh1MzIpaWNkKQorCQlpZiAoY3NpMl9zZCAmJiBjc2kyX3NkLT5ncnBfaWQgPT0gc29jX2NhbWVyYV9ncnBfaWQoaWNkKSkKIAkJCXJldHVybiBjc2kyX3NkOwogCX0KIApAQCAtMTA4OSw4ICsxMDkxLDkgQEAKIAkJCS8qIFRyeSAyNTYweDE5MjAsIDEyODB4OTYwLCA2NDB4NDgwLCAzMjB4MjQwICovCiAJCQltZi53aWR0aAk9IDI1NjAgPj4gc2hpZnQ7CiAJCQltZi5oZWlnaHQJPSAxOTIwID4+IHNoaWZ0OwotCQkJcmV0ID0gdjRsMl9kZXZpY2VfY2FsbF91bnRpbF9lcnIoc2QtPnY0bDJfZGV2LCAobG9uZylpY2QsIHZpZGVvLAotCQkJCQkJCSBzX21idXNfZm10LCAmbWYpOworCQkJcmV0ID0gdjRsMl9kZXZpY2VfY2FsbF91bnRpbF9lcnIoc2QtPnY0bDJfZGV2LAorCQkJCQlzb2NfY2FtZXJhX2dycF9pZChpY2QpLCB2aWRlbywKKwkJCQkJc19tYnVzX2ZtdCwgJm1mKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAJCQlzaGlmdCsrOwpAQCAtMTM4OSw3ICsxMzkyLDggQEAKIAlib29sIGNldV8xdG8xOwogCWludCByZXQ7CiAKLQlyZXQgPSB2NGwyX2RldmljZV9jYWxsX3VudGlsX2VycihzZC0+djRsMl9kZXYsIChsb25nKWljZCwgdmlkZW8sCisJcmV0ID0gdjRsMl9kZXZpY2VfY2FsbF91bnRpbF9lcnIoc2QtPnY0bDJfZGV2LAorCQkJCQkgc29jX2NhbWVyYV9ncnBfaWQoaWNkKSwgdmlkZW8sCiAJCQkJCSBzX21idXNfZm10LCBtZik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CkBAIC0xNDI2LDggKzE0MzAsOSBAQAogCQl0bXBfaCA9IG1pbigyICogdG1wX2gsIG1heF9oZWlnaHQpOwogCQltZi0+d2lkdGggPSB0bXBfdzsKIAkJbWYtPmhlaWdodCA9IHRtcF9oOwotCQlyZXQgPSB2NGwyX2RldmljZV9jYWxsX3VudGlsX2VycihzZC0+djRsMl9kZXYsIChsb25nKWljZCwgdmlkZW8sCi0JCQkJCQkgc19tYnVzX2ZtdCwgbWYpOworCQlyZXQgPSB2NGwyX2RldmljZV9jYWxsX3VudGlsX2VycihzZC0+djRsMl9kZXYsCisJCQkJCXNvY19jYW1lcmFfZ3JwX2lkKGljZCksIHZpZGVvLAorCQkJCQlzX21idXNfZm10LCBtZik7CiAJCWRldl9nZW8oZGV2LCAiQ2FtZXJhIHNjYWxlZCB0byAldXgldVxuIiwKIAkJCW1mLT53aWR0aCwgbWYtPmhlaWdodCk7CiAJCWlmIChyZXQgPCAwKSB7CkBAIC0xNTgwLDggKzE1ODUsOSBAQAogCX0KIAogCWlmIChpbnRlcm1fd2lkdGggPCBpY2QtPnVzZXJfd2lkdGggfHwgaW50ZXJtX2hlaWdodCA8IGljZC0+dXNlcl9oZWlnaHQpIHsKLQkJcmV0ID0gdjRsMl9kZXZpY2VfY2FsbF91bnRpbF9lcnIoc2QtPnY0bDJfZGV2LCAoaW50KWljZCwgdmlkZW8sCi0JCQkJCQkgc19tYnVzX2ZtdCwgJm1mKTsKKwkJcmV0ID0gdjRsMl9kZXZpY2VfY2FsbF91bnRpbF9lcnIoc2QtPnY0bDJfZGV2LAorCQkJCQlzb2NfY2FtZXJhX2dycF9pZChpY2QpLCB2aWRlbywKKwkJCQkJc19tYnVzX2ZtdCwgJm1mKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCkBAIC0xODY3LDcgKzE4NzMsOCBAQAogCW1mLmNvZGUJCT0geGxhdGUtPmNvZGU7CiAJbWYuY29sb3JzcGFjZQk9IHBpeC0+Y29sb3JzcGFjZTsKIAotCXJldCA9IHY0bDJfZGV2aWNlX2NhbGxfdW50aWxfZXJyKHNkLT52NGwyX2RldiwgKGxvbmcpaWNkLCB2aWRlbywgdHJ5X21idXNfZm10LCAmbWYpOworCXJldCA9IHY0bDJfZGV2aWNlX2NhbGxfdW50aWxfZXJyKHNkLT52NGwyX2Rldiwgc29jX2NhbWVyYV9ncnBfaWQoaWNkKSwKKwkJCQkJIHZpZGVvLCB0cnlfbWJ1c19mbXQsICZtZik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTE4OTEsOCArMTg5OCw5IEBACiAJCQkgKi8KIAkJCW1mLndpZHRoID0gMjU2MDsKIAkJCW1mLmhlaWdodCA9IDE5MjA7Ci0JCQlyZXQgPSB2NGwyX2RldmljZV9jYWxsX3VudGlsX2VycihzZC0+djRsMl9kZXYsIChsb25nKWljZCwgdmlkZW8sCi0JCQkJCQkJIHRyeV9tYnVzX2ZtdCwgJm1mKTsKKwkJCXJldCA9IHY0bDJfZGV2aWNlX2NhbGxfdW50aWxfZXJyKHNkLT52NGwyX2RldiwKKwkJCQkJc29jX2NhbWVyYV9ncnBfaWQoaWNkKSwgdmlkZW8sCisJCQkJCXRyeV9tYnVzX2ZtdCwgJm1mKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJLyogU2hvdWxkbid0IGFjdHVhbGx5IGhhcHBlbi4uLiAqLwogCQkJCWRldl9lcnIoaWNkLT5wYXJlbnQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jc2kyLmMgYi9kcml2ZXJzL21lZGlhL3ZpZGVvL3NoX21vYmlsZV9jc2kyLmMKaW5kZXggZWE0ZjA0Ny4uOGE2NTJiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZWRpYS92aWRlby9zaF9tb2JpbGVfY3NpMi5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc2hfbW9iaWxlX2NzaTIuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJCQkJIGNvbnN0IHN0cnVjdCB2NGwyX21idXNfY29uZmlnICpjZmcpCiB7CiAJc3RydWN0IHNoX2NzaTIgKnByaXYgPSBjb250YWluZXJfb2Yoc2QsIHN0cnVjdCBzaF9jc2kyLCBzdWJkZXYpOwotCXN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqaWNkID0gKHN0cnVjdCBzb2NfY2FtZXJhX2RldmljZSAqKXNkLT5ncnBfaWQ7CisJc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSB2NGwyX2dldF9zdWJkZXZfaG9zdGRhdGEoc2QpOwogCXN0cnVjdCB2NGwyX3N1YmRldiAqY2xpZW50X3NkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjbGllbnRfY2ZnID0gey50eXBlID0gVjRMMl9NQlVTX0NTSTIsCiAJCQkJCSAgICAgIC5mbGFncyA9IHByaXYtPm1pcGlfZmxhZ3N9OwpAQCAtMjAyLDcgKzIwMiw3IEBACiBzdGF0aWMgaW50IHNoX2NzaTJfY2xpZW50X2Nvbm5lY3Qoc3RydWN0IHNoX2NzaTIgKnByaXYpCiB7CiAJc3RydWN0IHNoX2NzaTJfcGRhdGEgKnBkYXRhID0gcHJpdi0+cGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopcHJpdi0+c3ViZGV2LmdycF9pZDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YSgmcHJpdi0+c3ViZGV2KTsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKmNsaWVudF9zZCA9IHNvY19jYW1lcmFfdG9fc3ViZGV2KGljZCk7CiAJc3RydWN0IGRldmljZSAqZGV2ID0gdjRsMl9nZXRfc3ViZGV2ZGF0YSgmcHJpdi0+c3ViZGV2KTsKIAlzdHJ1Y3QgdjRsMl9tYnVzX2NvbmZpZyBjZmc7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21lZGlhL3ZpZGVvL3NvY19jYW1lcmEuYyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jCmluZGV4IGI3MjU4MGMuLjYyZTQzMTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jCisrKyBiL2RyaXZlcnMvbWVkaWEvdmlkZW8vc29jX2NhbWVyYS5jCkBAIC0xMTAzLDcgKzExMDMsOCBAQAogCX0KIAogCXNkID0gc29jX2NhbWVyYV90b19zdWJkZXYoaWNkKTsKLQlzZC0+Z3JwX2lkID0gKGxvbmcpaWNkOworCXNkLT5ncnBfaWQgPSBzb2NfY2FtZXJhX2dycF9pZChpY2QpOworCXY0bDJfc2V0X3N1YmRldl9ob3N0ZGF0YShzZCwgaWNkKTsKIAogCWlmICh2NGwyX2N0cmxfYWRkX2hhbmRsZXIoJmljZC0+Y3RybF9oYW5kbGVyLCBzZC0+Y3RybF9oYW5kbGVyKSkKIAkJZ290byBlY3RybDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2FiNTUwMC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL21mZC9hYjU1MDAtZGVidWdmcy5jCmluZGV4IDQzYzBlYmIuLmI3YjJkMzQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9hYjU1MDAtZGVidWdmcy5jCisrKyBiL2RyaXZlcnMvbWZkL2FiNTUwMC1kZWJ1Z2ZzLmMKQEAgLTQsNyArNCw3IEBACiAgKiBEZWJ1Z2ZzIHN1cHBvcnQgZm9yIHRoZSBBQjU1MDAgTUZEIGRyaXZlcgogICovCiAKLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9tZmQvYWI1NTAwL2FiNTUwMC5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvYWI4NTAwLWNvcmUuYyBiL2RyaXZlcnMvbWZkL2FiODUwMC1jb3JlLmMKaW5kZXggMWU5MTczOC4uZDNkNTcyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWI4NTAwLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC9hYjg1MDAtY29yZS5jCkBAIC02MjAsNiArNjIwLDcgQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBfX2RldmluaXRkYXRhIGFiODUwMF9jaGFyZ2FsZ19yZXNvdXJjZXNbXSA9IHt9OwogCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX2RlYnVnX3Jlc291cmNlc1tdID0gewogCXsKIAkJLm5hbWUJPSAiSVJRX0ZJUlNUIiwKQEAgLTYzNCw2ICs2MzUsNyBAQAogCQkuZmxhZ3MJPSBJT1JFU09VUkNFX0lSUSwKIAl9LAogfTsKKyNlbmRpZgogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIF9fZGV2aW5pdGRhdGEgYWI4NTAwX3VzYl9yZXNvdXJjZXNbXSA9IHsKIAl7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC9hZHA1NTIwLmMgYi9kcml2ZXJzL21mZC9hZHA1NTIwLmMKaW5kZXggZjFkODg0OC4uOGQ4MTZjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvYWRwNTUyMC5jCisrKyBiL2RyaXZlcnMvbWZkL2FkcDU1MjAuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiAKIAlyZXQgPSBfX2FkcDU1MjBfcmVhZChjaGlwLT5jbGllbnQsIHJlZywgJnJlZ192YWwpOwogCi0JaWYgKCFyZXQgJiYgKChyZWdfdmFsICYgYml0X21hc2spID09IDApKSB7CisJaWYgKCFyZXQgJiYgKChyZWdfdmFsICYgYml0X21hc2spICE9IGJpdF9tYXNrKSkgewogCQlyZWdfdmFsIHw9IGJpdF9tYXNrOwogCQlyZXQgPSBfX2FkcDU1MjBfd3JpdGUoY2hpcC0+Y2xpZW50LCByZWcsIHJlZ192YWwpOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2RhOTAzeC5jIGIvZHJpdmVycy9tZmQvZGE5MDN4LmMKaW5kZXggMWI3OWMzNy4uMTkyNGI4NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvZGE5MDN4LmMKKysrIGIvZHJpdmVycy9tZmQvZGE5MDN4LmMKQEAgLTE4Miw3ICsxODIsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JaWYgKChyZWdfdmFsICYgYml0X21hc2spID09IDApIHsKKwlpZiAoKHJlZ192YWwgJiBiaXRfbWFzaykgIT0gYml0X21hc2spIHsKIAkJcmVnX3ZhbCB8PSBiaXRfbWFzazsKIAkJcmV0ID0gX19kYTkwM3hfd3JpdGUoY2hpcC0+Y2xpZW50LCByZWcsIHJlZ192YWwpOwogCX0KQEAgLTU0OSw2ICs1NDksNyBAQAogCXN0cnVjdCBkYTkwM3hfY2hpcCAqY2hpcCA9IGkyY19nZXRfY2xpZW50ZGF0YShjbGllbnQpOwogCiAJZGE5MDN4X3JlbW92ZV9zdWJkZXZzKGNoaXApOworCWZyZWVfaXJxKGNsaWVudC0+aXJxLCBjaGlwKTsKIAlrZnJlZShjaGlwKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL2p6NDc0MC1hZGMuYyBiL2RyaXZlcnMvbWZkL2p6NDc0MC1hZGMuYwppbmRleCAxZTllZTUzLi5lZjM5NTI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC9qejQ3NDAtYWRjLmMKKysrIGIvZHJpdmVycy9tZmQvano0NzQwLWFkYy5jCkBAIC0xNiw2ICsxNiw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL21mZC90cHM2NTg2eC5jIGIvZHJpdmVycy9tZmQvdHBzNjU4NnguYwppbmRleCBiYmEyNmQ5Li5hNWRkZjMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL21mZC90cHM2NTg2eC5jCisrKyBiL2RyaXZlcnMvbWZkL3RwczY1ODZ4LmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCWlmIChyZXQpCiAJCWdvdG8gb3V0OwogCi0JaWYgKChyZWdfdmFsICYgYml0X21hc2spID09IDApIHsKKwlpZiAoKHJlZ192YWwgJiBiaXRfbWFzaykgIT0gYml0X21hc2spIHsKIAkJcmVnX3ZhbCB8PSBiaXRfbWFzazsKIAkJcmV0ID0gX190cHM2NTg2eF93cml0ZSh0b19pMmNfY2xpZW50KGRldiksIHJlZywgcmVnX3ZhbCk7CiAJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHBzNjU5MTAuYyBiL2RyaXZlcnMvbWZkL3RwczY1OTEwLmMKaW5kZXggNmY1YjhjZi4uYzFkYTg0YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHBzNjU5MTAuYworKysgYi9kcml2ZXJzL21mZC90cHM2NTkxMC5jCkBAIC0xMjAsNyArMTIwLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZGF0YSAmPSBtYXNrOworCWRhdGEgJj0gfm1hc2s7CiAJZXJyID0gdHBzNjU5MTBfaTJjX3dyaXRlKHRwczY1OTEwLCByZWcsIDEsICZkYXRhKTsKIAlpZiAoZXJyKQogCQlkZXZfZXJyKHRwczY1OTEwLT5kZXYsICJ3cml0ZSB0byByZWcgJXggZmFpbGVkXG4iLCByZWcpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZmQvdHdsLWNvcmUuYyBiL2RyaXZlcnMvbWZkL3R3bC1jb3JlLmMKaW5kZXggYmZiZDY2MC4uNjFlNzBjZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZmQvdHdsLWNvcmUuYworKysgYi9kcml2ZXJzL21mZC90d2wtY29yZS5jCkBAIC0zNjMsMTMgKzM2MywxMyBAQAogCQlwcl9lcnIoIiVzOiBpbnZhbGlkIG1vZHVsZSBudW1iZXIgJWRcbiIsIERSSVZFUl9OQU1FLCBtb2Rfbm8pOwogCQlyZXR1cm4gLUVQRVJNOwogCX0KKwlpZiAodW5saWtlbHkoIWludXNlKSkgeworCQlwcl9lcnIoIiVzOiBub3QgaW5pdGlhbGl6ZWRcbiIsIERSSVZFUl9OQU1FKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CiAJc2lkID0gdHdsX21hcFttb2Rfbm9dLnNpZDsKIAl0d2wgPSAmdHdsX21vZHVsZXNbc2lkXTsKIAotCWlmICh1bmxpa2VseSghaW51c2UpKSB7Ci0JCXByX2VycigiJXM6IGNsaWVudCAlZCBpcyBub3QgaW5pdGlhbGl6ZWRcbiIsIERSSVZFUl9OQU1FLCBzaWQpOwotCQlyZXR1cm4gLUVQRVJNOwotCX0KIAltdXRleF9sb2NrKCZ0d2wtPnhmZXJfbG9jayk7CiAJLyoKIAkgKiBbTVNHMV06IGZpbGwgdGhlIHJlZ2lzdGVyIGFkZHJlc3MgZGF0YQpAQCAtNDIwLDEzICs0MjAsMTMgQEAKIAkJcHJfZXJyKCIlczogaW52YWxpZCBtb2R1bGUgbnVtYmVyICVkXG4iLCBEUklWRVJfTkFNRSwgbW9kX25vKTsKIAkJcmV0dXJuIC1FUEVSTTsKIAl9CisJaWYgKHVubGlrZWx5KCFpbnVzZSkpIHsKKwkJcHJfZXJyKCIlczogbm90IGluaXRpYWxpemVkXG4iLCBEUklWRVJfTkFNRSk7CisJCXJldHVybiAtRVBFUk07CisJfQogCXNpZCA9IHR3bF9tYXBbbW9kX25vXS5zaWQ7CiAJdHdsID0gJnR3bF9tb2R1bGVzW3NpZF07CiAKLQlpZiAodW5saWtlbHkoIWludXNlKSkgewotCQlwcl9lcnIoIiVzOiBjbGllbnQgJWQgaXMgbm90IGluaXRpYWxpemVkXG4iLCBEUklWRVJfTkFNRSwgc2lkKTsKLQkJcmV0dXJuIC1FUEVSTTsKLQl9CiAJbXV0ZXhfbG9jaygmdHdsLT54ZmVyX2xvY2spOwogCS8qIFtNU0cxXSBmaWxsIHRoZSByZWdpc3RlciBhZGRyZXNzIGRhdGEgKi8KIAltc2cgPSAmdHdsLT54ZmVyX21zZ1swXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtaXJxLmMgYi9kcml2ZXJzL21mZC90d2w0MDMwLWlycS5jCmluZGV4IGYwNjJjOGMuLjI5ZjExZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3R3bDQwMzAtaXJxLmMKKysrIGIvZHJpdmVycy9tZmQvdHdsNDAzMC1pcnEuYwpAQCAtNDMyLDYgKzQzMiw3IEBACiAJdTMyCQkJZWRnZV9jaGFuZ2U7CiAKIAlzdHJ1Y3QgbXV0ZXgJCWlycV9sb2NrOworCWNoYXIJCQkqaXJxX25hbWU7CiB9OwogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNTg5LDcgKzU5MCw3IEBACiAgKiBHZW5lcmljIGhhbmRsZXIgZm9yIFNJSCBpbnRlcnJ1cHRzIC4uLiB3ZSAia25vdyIgdGhpcyBpcyBjYWxsZWQKICAqIGluIHRhc2sgY29udGV4dCwgd2l0aCBJUlFzIGVuYWJsZWQuCiAgKi8KLXN0YXRpYyB2b2lkIGhhbmRsZV90d2w0MDMwX3NpaCh1bnNpZ25lZCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKK3N0YXRpYyBpcnFyZXR1cm5fdCBoYW5kbGVfdHdsNDAzMF9zaWgoaW50IGlycSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3Qgc2loX2FnZW50ICphZ2VudCA9IGlycV9nZXRfaGFuZGxlcl9kYXRhKGlycSk7CiAJY29uc3Qgc3RydWN0IHNpaCAqc2loID0gYWdlbnQtPnNpaDsKQEAgLTYwMiw3ICs2MDMsNyBAQAogCQlwcl9lcnIoInR3bDQwMzA6ICVzIFNJSCwgcmVhZCBJU1IgZXJyb3IgJWRcbiIsCiAJCQlzaWgtPm5hbWUsIGlzcik7CiAJCS8qIFJFVklTSVQ6ICByZWNvdmVyOyBldmVudHVhbGx5IG1hc2sgaXQgYWxsLCBldGMgKi8KLQkJcmV0dXJuOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CiAJfQogCiAJd2hpbGUgKGlzcikgewpAQCAtNjE2LDYgKzYxNyw3IEBACiAJCQlwcl9lcnIoInR3bDQwMzA6ICVzIFNJSCwgaW52YWxpZCBJU1IgYml0ICVkXG4iLAogCQkJCXNpaC0+bmFtZSwgaXJxKTsKIAl9CisJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiBzdGF0aWMgdW5zaWduZWQgdHdsNDAzMF9pcnFfbmV4dDsKQEAgLTY2OCwxOCArNjcwLDE5IEBACiAJCWFjdGl2YXRlX2lycShpcnEpOwogCX0KIAotCXN0YXR1cyA9IGlycV9iYXNlOwogCXR3bDQwMzBfaXJxX25leHQgKz0gaTsKIAogCS8qIHJlcGxhY2UgZ2VuZXJpYyBQSUggaGFuZGxlciAoaGFuZGxlX3NpbXBsZV9pcnEpICovCiAJaXJxID0gc2loX21vZCArIHR3bDQwMzBfaXJxX2Jhc2U7CiAJaXJxX3NldF9oYW5kbGVyX2RhdGEoaXJxLCBhZ2VudCk7Ci0JaXJxX3NldF9jaGFpbmVkX2hhbmRsZXIoaXJxLCBoYW5kbGVfdHdsNDAzMF9zaWgpOworCWFnZW50LT5pcnFfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAidHdsNDAzMF8lcyIsIHNpaC0+bmFtZSk7CisJc3RhdHVzID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxLCBOVUxMLCBoYW5kbGVfdHdsNDAzMF9zaWgsIDAsCisJCQkJICAgICAgYWdlbnQtPmlycV9uYW1lID86IHNpaC0+bmFtZSwgTlVMTCk7CiAKIAlwcl9pbmZvKCJ0d2w0MDMwOiAlcyAoaXJxICVkKSBjaGFpbmluZyBJUlFzICVkLi4lZFxuIiwgc2loLT5uYW1lLAogCQkJaXJxLCBpcnFfYmFzZSwgdHdsNDAzMF9pcnFfbmV4dCAtIDEpOwogCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gc3RhdHVzIDwgMCA/IHN0YXR1cyA6IGlycV9iYXNlOwogfQogCiAvKiBGSVhNRSBuZWVkIGEgY2FsbCB0byByZXZlcnNlIHR3bDQwMzBfc2loX3NldHVwKCkgLi4uICovCkBAIC03MzMsOCArNzM2LDkgQEAKIAl9CiAKIAkvKiBpbnN0YWxsIGFuIGlycSBoYW5kbGVyIHRvIGRlbXVsdGlwbGV4IHRoZSBUV0w0MDMwIGludGVycnVwdCAqLwotCXN0YXR1cyA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKGlycV9udW0sIE5VTEwsIGhhbmRsZV90d2w0MDMwX3BpaCwgMCwKLQkJCQkJIlRXTDQwMzAtUElIIiwgTlVMTCk7CisJc3RhdHVzID0gcmVxdWVzdF90aHJlYWRlZF9pcnEoaXJxX251bSwgTlVMTCwgaGFuZGxlX3R3bDQwMzBfcGloLAorCQkJCSAgICAgIElSUUZfT05FU0hPVCwKKwkJCQkgICAgICAiVFdMNDAzMC1QSUgiLCBOVUxMKTsKIAlpZiAoc3RhdHVzIDwgMCkgewogCQlwcl9lcnIoInR3bDQwMzA6IGNvdWxkIG5vdCBjbGFpbSBpcnElZDogJWRcbiIsIGlycV9udW0sIHN0YXR1cyk7CiAJCWdvdG8gZmFpbF9ycWlycTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWZkL3dtODk5NC1jb3JlLmMgYi9kcml2ZXJzL21mZC93bTg5OTQtY29yZS5jCmluZGV4IDVkNmJhMTMuLjYxODk0ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWZkL3dtODk5NC1jb3JlLmMKKysrIGIvZHJpdmVycy9tZmQvd204OTk0LWNvcmUuYwpAQCAtMjM5LDYgKzIzOSw3IEBACiAKIAlzd2l0Y2ggKHdtODk5NC0+dHlwZSkgewogCWNhc2UgV004OTU4OgorCWNhc2UgV00xODExOgogCQlyZXQgPSB3bTg5OTRfcmVnX3JlYWQod204OTk0LCBXTTg5NThfTUlDX0RFVEVDVF8xKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlYWQgcG93ZXIgc3RhdHVzOiAlZFxuIiwgcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tXzkzY3g2LmMgYi9kcml2ZXJzL21pc2MvZWVwcm9tL2VlcHJvbV85M2N4Ni5jCmluZGV4IDdiMzNkZTkuLjBmZjRiMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbWlzYy9lZXByb20vZWVwcm9tXzkzY3g2LmMKKysrIGIvZHJpdmVycy9taXNjL2VlcHJvbS9lZXByb21fOTNjeDYuYwpAQCAtNjMsNiArNjMsNyBAQAogCWVlcHJvbS0+cmVnX2RhdGFfb3V0ID0gMDsKIAllZXByb20tPnJlZ19kYXRhX2Nsb2NrID0gMDsKIAllZXByb20tPnJlZ19jaGlwX3NlbGVjdCA9IDE7CisJZWVwcm9tLT5kcml2ZV9kYXRhID0gMTsKIAllZXByb20tPnJlZ2lzdGVyX3dyaXRlKGVlcHJvbSk7CiAKIAkvKgpAQCAtMTAxLDYgKzEwMiw3IEBACiAJICovCiAJZWVwcm9tLT5yZWdfZGF0YV9pbiA9IDA7CiAJZWVwcm9tLT5yZWdfZGF0YV9vdXQgPSAwOworCWVlcHJvbS0+ZHJpdmVfZGF0YSA9IDE7CiAKIAkvKgogCSAqIFN0YXJ0IHdyaXRpbmcgYWxsIGJpdHMuCkBAIC0xNDAsNiArMTQyLDcgQEAKIAkgKi8KIAllZXByb20tPnJlZ19kYXRhX2luID0gMDsKIAllZXByb20tPnJlZ19kYXRhX291dCA9IDA7CisJZWVwcm9tLT5kcml2ZV9kYXRhID0gMDsKIAogCS8qCiAJICogU3RhcnQgcmVhZGluZyBhbGwgYml0cy4KQEAgLTIzMSwzICsyMzQsODggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGVlcHJvbV85M2N4Nl9tdWx0aXJlYWQpOwogCisvKioKKyAqIGVlcHJvbV85M2N4Nl93cmVuIC0gc2V0IHRoZSB3cml0ZSBlbmFibGUgc3RhdGUKKyAqIEBlZXByb206IFBvaW50ZXIgdG8gZWVwcm9tIHN0cnVjdHVyZQorICogQGVuYWJsZTogdHJ1ZSB0byBlbmFibGUgd3JpdGVzLCBvdGhlcndpc2UgZGlzYWJsZSB3cml0ZXMKKyAqCisgKiBTZXQgdGhlIEVFUFJPTSB3cml0ZSBlbmFibGUgc3RhdGUgdG8gZWl0aGVyIGFsbG93IG9yIGRlbnkKKyAqIHdyaXRlcyBkZXBlbmRpbmcgb24gdGhlIEBlbmFibGUgdmFsdWUuCisgKi8KK3ZvaWQgZWVwcm9tXzkzY3g2X3dyZW4oc3RydWN0IGVlcHJvbV85M2N4NiAqZWVwcm9tLCBib29sIGVuYWJsZSkKK3sKKwl1MTYgY29tbWFuZDsKKworCS8qIHN0YXJ0IHRoZSBjb21tYW5kICovCisJZWVwcm9tXzkzY3g2X3N0YXJ0dXAoZWVwcm9tKTsKKworCS8qIGNyZWF0ZSBjb21tYW5kIHRvIGVuYWJsZS9kaXNhYmxlICovCisKKwljb21tYW5kID0gZW5hYmxlID8gUENJX0VFUFJPTV9FV0VOX09QQ09ERSA6IFBDSV9FRVBST01fRVdEU19PUENPREU7CisJY29tbWFuZCA8PD0gKGVlcHJvbS0+d2lkdGggLSAyKTsKKworCWVlcHJvbV85M2N4Nl93cml0ZV9iaXRzKGVlcHJvbSwgY29tbWFuZCwKKwkJCQlQQ0lfRUVQUk9NX1dJRFRIX09QQ09ERSArIGVlcHJvbS0+d2lkdGgpOworCisJZWVwcm9tXzkzY3g2X2NsZWFudXAoZWVwcm9tKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVlcHJvbV85M2N4Nl93cmVuKTsKKworLyoqCisgKiBlZXByb21fOTNjeDZfd3JpdGUgLSB3cml0ZSBkYXRhIHRvIHRoZSBFRVBST00KKyAqIEBlZXByb206IFBvaW50ZXIgdG8gZWVwcm9tIHN0cnVjdHVyZQorICogQGFkZHI6IEFkZHJlc3MgdG8gd3JpdGUgZGF0YSB0by4KKyAqIEBkYXRhOiBUaGUgZGF0YSB0byB3cml0ZSB0byBhZGRyZXNzIEBhZGRyLgorICoKKyAqIFdyaXRlIHRoZSBAZGF0YSB0byB0aGUgc3BlY2lmaWVkIEBhZGRyIGluIHRoZSBFRVBST00gYW5kCisgKiB3YWl0aW5nIGZvciB0aGUgZGV2aWNlIHRvIGZpbmlzaCB3cml0aW5nLgorICoKKyAqIE5vdGUsIHNpbmNlIHdlIGRvIG5vdCBleHBlY3QgbGFyZ2UgbnVtYmVyIG9mIHdyaXRlIG9wZXJhdGlvbnMKKyAqIHdlIGRlbGF5IGluIGJldHdlZW4gcGFydHMgb2YgdGhlIG9wZXJhdGlvbiB0byBhdm9pZCB1c2luZyBleGNlc3NpdmUKKyAqIGFtb3VudHMgb2YgQ1BVIHRpbWUgYnVzeSB3YWl0aW5nLgorICovCit2b2lkIGVlcHJvbV85M2N4Nl93cml0ZShzdHJ1Y3QgZWVwcm9tXzkzY3g2ICplZXByb20sIHU4IGFkZHIsIHUxNiBkYXRhKQoreworCWludCB0aW1lb3V0ID0gMTAwOworCXUxNiBjb21tYW5kOworCisJLyogc3RhcnQgdGhlIGNvbW1hbmQgKi8KKwllZXByb21fOTNjeDZfc3RhcnR1cChlZXByb20pOworCisJY29tbWFuZCA9IFBDSV9FRVBST01fV1JJVEVfT1BDT0RFIDw8IGVlcHJvbS0+d2lkdGg7CisJY29tbWFuZCB8PSBhZGRyOworCisJLyogc2VuZCB3cml0ZSBjb21tYW5kICovCisJZWVwcm9tXzkzY3g2X3dyaXRlX2JpdHMoZWVwcm9tLCBjb21tYW5kLAorCQkJCVBDSV9FRVBST01fV0lEVEhfT1BDT0RFICsgZWVwcm9tLT53aWR0aCk7CisKKwkvKiBzZW5kIGRhdGEgKi8KKwllZXByb21fOTNjeDZfd3JpdGVfYml0cyhlZXByb20sIGRhdGEsIDE2KTsKKworCS8qIGdldCByZWFkeSB0byBjaGVjayBmb3IgYnVzeSAqLworCWVlcHJvbS0+ZHJpdmVfZGF0YSA9IDA7CisJZWVwcm9tLT5yZWdfY2hpcF9zZWxlY3QgPSAxOworCWVlcHJvbS0+cmVnaXN0ZXJfd3JpdGUoZWVwcm9tKTsKKworCS8qIHdhaXQgYXQtbGVhc3QgMjUwbnMgdG8gZ2V0IERPIHRvIGJlIHRoZSBidXN5IHNpZ25hbCAqLworCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKworCS8qIHdhaXQgZm9yIERPIHRvIGdvIGhpZ2ggdG8gc2lnbmlmeSBmaW5pc2ggKi8KKworCXdoaWxlICh0cnVlKSB7CisJCWVlcHJvbS0+cmVnaXN0ZXJfcmVhZChlZXByb20pOworCisJCWlmIChlZXByb20tPnJlZ19kYXRhX291dCkKKwkJCWJyZWFrOworCisJCXVzbGVlcF9yYW5nZSgxMDAwLCAyMDAwKTsKKworCQlpZiAoLS10aW1lb3V0IDw9IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IHRpbWVvdXRcbiIsIF9fZnVuY19fKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJZWVwcm9tXzkzY3g2X2NsZWFudXAoZWVwcm9tKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGVlcHJvbV85M2N4Nl93cml0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMgYi9kcml2ZXJzL21pc2Mvc2dpLXhwL3hwbmV0LmMKaW5kZXggNDJmMDY3My4uM2ZhYzY3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL3NnaS14cC94cG5ldC5jCisrKyBiL2RyaXZlcnMvbWlzYy9zZ2kteHAveHBuZXQuYwpAQCAtNTc2LDcgKzU3Niw3IEBACiAJICogcmVwb3J0IGFuIGVycm9yIGlmIHRoZSBkYXRhIGlzIG5vdCByZXRyaWV2YWJsZSBhbmQgdGhlCiAJICogcGFja2V0IHdpbGwgYmUgZHJvcHBlZC4KIAkgKi8KLQl4cG5ldF9kZXZpY2UtPmZlYXR1cmVzID0gTkVUSUZfRl9OT19DU1VNOworCXhwbmV0X2RldmljZS0+ZmVhdHVyZXMgPSBORVRJRl9GX0hXX0NTVU07CiAKIAlyZXN1bHQgPSByZWdpc3Rlcl9uZXRkZXYoeHBuZXRfZGV2aWNlKTsKIAlpZiAocmVzdWx0ICE9IDApIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYyBiL2RyaXZlcnMvbW1jL2NhcmQvYmxvY2suYwppbmRleCBhMWNiMjFmLi4xZTBlMjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jYXJkL2Jsb2NrLmMKKysrIGIvZHJpdmVycy9tbWMvY2FyZC9ibG9jay5jCkBAIC0xNjA2LDYgKzE2MDYsMTQgQEAKIAkJICBNTUNfUVVJUktfQkxLX05PX0NNRDIzKSwKIAlNTUNfRklYVVAoIk1NQzMyRyIsIDB4MTEsIENJRF9PRU1JRF9BTlksIGFkZF9xdWlya19tbWMsCiAJCSAgTU1DX1FVSVJLX0JMS19OT19DTUQyMyksCisKKwkvKgorCSAqIFNvbWUgTWljcm9uIE1NQyBjYXJkcyBuZWVkcyBsb25nZXIgZGF0YSByZWFkIHRpbWVvdXQgdGhhbgorCSAqIGluZGljYXRlZCBpbiBDU0QuCisJICovCisJTU1DX0ZJWFVQKENJRF9OQU1FX0FOWSwgMHgxMywgMHgyMDAsIGFkZF9xdWlya19tbWMsCisJCSAgTU1DX1FVSVJLX0xPTkdfUkVBRF9USU1FKSwKKwogCUVORF9GSVhVUAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvY29yZS9jb3JlLmMgYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYwppbmRleCA1Mjc4ZmZiLi45NTBiOTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYworKysgYi9kcml2ZXJzL21tYy9jb3JlL2NvcmUuYwpAQCAtNTI5LDYgKzUyOSwxOCBAQAogCQkJZGF0YS0+dGltZW91dF9jbGtzID0gMDsKIAkJfQogCX0KKworCS8qCisJICogU29tZSBjYXJkcyByZXF1aXJlIGxvbmdlciBkYXRhIHJlYWQgdGltZW91dCB0aGFuIGluZGljYXRlZCBpbiBDU0QuCisJICogQWRkcmVzcyB0aGlzIGJ5IHNldHRpbmcgdGhlIHJlYWQgdGltZW91dCB0byBhICJyZWFzb25hYmx5IGhpZ2giCisJICogdmFsdWUuIEZvciB0aGUgY2FyZHMgdGVzdGVkLCAzMDBtcyBoYXMgcHJvdmVuIGVub3VnaC4gSWYgbmVjZXNzYXJ5LAorCSAqIHRoaXMgdmFsdWUgY2FuIGJlIGluY3JlYXNlZCBpZiBvdGhlciBwcm9ibGVtYXRpYyBjYXJkcyByZXF1aXJlIHRoaXMuCisJICovCisJaWYgKG1tY19jYXJkX2xvbmdfcmVhZF90aW1lKGNhcmQpICYmIGRhdGEtPmZsYWdzICYgTU1DX0RBVEFfUkVBRCkgeworCQlkYXRhLT50aW1lb3V0X25zID0gMzAwMDAwMDAwOworCQlkYXRhLT50aW1lb3V0X2Nsa3MgPSAwOworCX0KKwogCS8qCiAJICogU29tZSBjYXJkcyBuZWVkIHZlcnkgaGlnaCB0aW1lb3V0cyBpZiBkcml2ZW4gaW4gU1BJIG1vZGUuCiAJICogVGhlIHdvcnN0IG9ic2VydmVkIHRpbWVvdXQgd2FzIDkwMG1zIGFmdGVyIHdyaXRpbmcgYQpAQCAtMTIxMyw2ICsxMjI1LDQ2IEBACiAJbW1jX2hvc3RfY2xrX3JlbGVhc2UoaG9zdCk7CiB9CiAKK3N0YXRpYyB2b2lkIG1tY19wb3dlcm9mZl9ub3RpZnkoc3RydWN0IG1tY19ob3N0ICpob3N0KQoreworCXN0cnVjdCBtbWNfY2FyZCAqY2FyZDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dDsKKwl1bnNpZ25lZCBpbnQgbm90aWZ5X3R5cGUgPSBFWFRfQ1NEX05PX1BPV0VSX05PVElGSUNBVElPTjsKKwlpbnQgZXJyID0gMDsKKworCWNhcmQgPSBob3N0LT5jYXJkOworCisJLyoKKwkgKiBTZW5kIHBvd2VyIG5vdGlmeSBjb21tYW5kIG9ubHkgaWYgY2FyZAorCSAqIGlzIG1tYyBhbmQgbm90aWZ5IHN0YXRlIGlzIHBvd2VyZWQgT04KKwkgKi8KKwlpZiAoY2FyZCAmJiBtbWNfY2FyZF9tbWMoY2FyZCkgJiYKKwkgICAgKGNhcmQtPnBvd2Vyb2ZmX25vdGlmeV9zdGF0ZSA9PSBNTUNfUE9XRVJFRF9PTikpIHsKKworCQlpZiAoaG9zdC0+cG93ZXJfbm90aWZ5X3R5cGUgPT0gTU1DX0hPU1RfUFdfTk9USUZZX1NIT1JUKSB7CisJCQlub3RpZnlfdHlwZSA9IEVYVF9DU0RfUE9XRVJfT0ZGX1NIT1JUOworCQkJdGltZW91dCA9IGNhcmQtPmV4dF9jc2QuZ2VuZXJpY19jbWQ2X3RpbWU7CisJCQljYXJkLT5wb3dlcm9mZl9ub3RpZnlfc3RhdGUgPSBNTUNfUE9XRVJPRkZfU0hPUlQ7CisJCX0gZWxzZSB7CisJCQlub3RpZnlfdHlwZSA9IEVYVF9DU0RfUE9XRVJfT0ZGX0xPTkc7CisJCQl0aW1lb3V0ID0gY2FyZC0+ZXh0X2NzZC5wb3dlcl9vZmZfbG9uZ3RpbWU7CisJCQljYXJkLT5wb3dlcm9mZl9ub3RpZnlfc3RhdGUgPSBNTUNfUE9XRVJPRkZfTE9ORzsKKwkJfQorCisJCWVyciA9IG1tY19zd2l0Y2goY2FyZCwgRVhUX0NTRF9DTURfU0VUX05PUk1BTCwKKwkJCQkgRVhUX0NTRF9QT1dFUl9PRkZfTk9USUZJQ0FUSU9OLAorCQkJCSBub3RpZnlfdHlwZSwgdGltZW91dCk7CisKKwkJaWYgKGVyciAmJiBlcnIgIT0gLUVCQURNU0cpCisJCQlwcl9lcnIoIkRldmljZSBmYWlsZWQgdG8gcmVzcG9uZCB3aXRoaW4gJWQgcG93ZXJvZmYgIgorCQkJICAgICAgICJ0aW1lLiBGb3JjZWZ1bGx5IHBvd2VyaW5nIGRvd24gdGhlIGRldmljZVxuIiwKKwkJCSAgICAgICB0aW1lb3V0KTsKKworCQkvKiBTZXQgdGhlIGNhcmQgc3RhdGUgdG8gbm8gbm90aWZpY2F0aW9uIGFmdGVyIHRoZSBwb3dlcm9mZiAqLworCQljYXJkLT5wb3dlcm9mZl9ub3RpZnlfc3RhdGUgPSBNTUNfTk9fUE9XRVJfTk9USUZJQ0FUSU9OOworCX0KK30KKwogLyoKICAqIEFwcGx5IHBvd2VyIHRvIHRoZSBNTUMgc3RhY2suICBUaGlzIGlzIGEgdHdvLXN0YWdlIHByb2Nlc3MuCiAgKiBGaXJzdCwgd2UgZW5hYmxlIHBvd2VyIHRvIHRoZSBjYXJkIHdpdGhvdXQgdGhlIGNsb2NrIHJ1bm5pbmcuCkBAIC0xMjY5LDQyICsxMzIxLDEyIEBACiAKIHZvaWQgbW1jX3Bvd2VyX29mZihzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCiB7Ci0Jc3RydWN0IG1tY19jYXJkICpjYXJkOwotCXVuc2lnbmVkIGludCBub3RpZnlfdHlwZTsKLQl1bnNpZ25lZCBpbnQgdGltZW91dDsKLQlpbnQgZXJyOwotCiAJbW1jX2hvc3RfY2xrX2hvbGQoaG9zdCk7CiAKLQljYXJkID0gaG9zdC0+Y2FyZDsKIAlob3N0LT5pb3MuY2xvY2sgPSAwOwogCWhvc3QtPmlvcy52ZGQgPSAwOwogCi0JaWYgKGNhcmQgJiYgbW1jX2NhcmRfbW1jKGNhcmQpICYmCi0JICAgIChjYXJkLT5wb3dlcm9mZl9ub3RpZnlfc3RhdGUgPT0gTU1DX1BPV0VSRURfT04pKSB7Ci0KLQkJaWYgKGhvc3QtPnBvd2VyX25vdGlmeV90eXBlID09IE1NQ19IT1NUX1BXX05PVElGWV9TSE9SVCkgewotCQkJbm90aWZ5X3R5cGUgPSBFWFRfQ1NEX1BPV0VSX09GRl9TSE9SVDsKLQkJCXRpbWVvdXQgPSBjYXJkLT5leHRfY3NkLmdlbmVyaWNfY21kNl90aW1lOwotCQkJY2FyZC0+cG93ZXJvZmZfbm90aWZ5X3N0YXRlID0gTU1DX1BPV0VST0ZGX1NIT1JUOwotCQl9IGVsc2UgewotCQkJbm90aWZ5X3R5cGUgPSBFWFRfQ1NEX1BPV0VSX09GRl9MT05HOwotCQkJdGltZW91dCA9IGNhcmQtPmV4dF9jc2QucG93ZXJfb2ZmX2xvbmd0aW1lOwotCQkJY2FyZC0+cG93ZXJvZmZfbm90aWZ5X3N0YXRlID0gTU1DX1BPV0VST0ZGX0xPTkc7Ci0JCX0KLQotCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCi0JCQkJIEVYVF9DU0RfUE9XRVJfT0ZGX05PVElGSUNBVElPTiwKLQkJCQkgbm90aWZ5X3R5cGUsIHRpbWVvdXQpOwotCi0JCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQotCQkJcHJfZXJyKCJEZXZpY2UgZmFpbGVkIHRvIHJlc3BvbmQgd2l0aGluICVkIHBvd2Vyb2ZmICIKLQkJCSAgICAgICAidGltZS4gRm9yY2VmdWxseSBwb3dlcmluZyBkb3duIHRoZSBkZXZpY2VcbiIsCi0JCQkgICAgICAgdGltZW91dCk7Ci0KLQkJLyogU2V0IHRoZSBjYXJkIHN0YXRlIHRvIG5vIG5vdGlmaWNhdGlvbiBhZnRlciB0aGUgcG93ZXJvZmYgKi8KLQkJY2FyZC0+cG93ZXJvZmZfbm90aWZ5X3N0YXRlID0gTU1DX05PX1BPV0VSX05PVElGSUNBVElPTjsKLQl9CisJbW1jX3Bvd2Vyb2ZmX25vdGlmeShob3N0KTsKIAogCS8qCiAJICogUmVzZXQgb2NyIG1hc2sgdG8gYmUgdGhlIGhpZ2hlc3QgcG9zc2libGUgdm9sdGFnZSBzdXBwb3J0ZWQgZm9yCkBAIC0yMTk2LDcgKzIyMTgsNyBAQAogCiAJbW1jX2J1c19nZXQoaG9zdCk7CiAKLQlpZiAoaG9zdC0+YnVzX29wcyAmJiAhaG9zdC0+YnVzX2RlYWQgJiYgaG9zdC0+YnVzX29wcy0+YXdha2UpCisJaWYgKGhvc3QtPmJ1c19vcHMgJiYgIWhvc3QtPmJ1c19kZWFkICYmIGhvc3QtPmJ1c19vcHMtPnNsZWVwKQogCQllcnIgPSBob3N0LT5idXNfb3BzLT5zbGVlcChob3N0KTsKIAogCW1tY19idXNfcHV0KGhvc3QpOwpAQCAtMjMwMiw4ICsyMzI0LDE3IEBACiAJCSAqIHByZS1jbGFpbSB0aGUgaG9zdC4KIAkJICovCiAJCWlmIChtbWNfdHJ5X2NsYWltX2hvc3QoaG9zdCkpIHsKLQkJCWlmIChob3N0LT5idXNfb3BzLT5zdXNwZW5kKQorCQkJaWYgKGhvc3QtPmJ1c19vcHMtPnN1c3BlbmQpIHsKKwkJCQkvKgorCQkJCSAqIEZvciBlTU1DIDQuNSBkZXZpY2Ugc2VuZCBub3RpZnkgY29tbWFuZAorCQkJCSAqIGJlZm9yZSBzbGVlcCwgYmVjYXVzZSBpbiBzbGVlcCBzdGF0ZSBlTU1DIDQuNQorCQkJCSAqIGRldmljZXMgcmVzcG9uZCB0byBvbmx5IFJFU0VUIGFuZCBBV0FLRSBjbWQKKwkJCQkgKi8KKwkJCQltbWNfcG93ZXJvZmZfbm90aWZ5KGhvc3QpOwogCQkJCWVyciA9IGhvc3QtPmJ1c19vcHMtPnN1c3BlbmQoaG9zdCk7CisJCQl9CisJCQltbWNfZG9fcmVsZWFzZV9ob3N0KGhvc3QpOworCiAJCQlpZiAoZXJyID09IC1FTk9TWVMgfHwgIWhvc3QtPmJ1c19vcHMtPnJlc3VtZSkgewogCQkJCS8qCiAJCQkJICogV2Ugc2ltcGx5ICJyZW1vdmUiIHRoZSBjYXJkIGluIHRoaXMgY2FzZS4KQEAgLTIzMTgsNyArMjM0OSw2IEBACiAJCQkJaG9zdC0+cG1fZmxhZ3MgPSAwOwogCQkJCWVyciA9IDA7CiAJCQl9Ci0JCQltbWNfZG9fcmVsZWFzZV9ob3N0KGhvc3QpOwogCQl9IGVsc2UgewogCQkJZXJyID0gLUVCVVNZOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL2hvc3QuYyBiL2RyaXZlcnMvbW1jL2NvcmUvaG9zdC5jCmluZGV4IGU4YTVlYjMuLmQzMWM3OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2NvcmUvaG9zdC5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvaG9zdC5jCkBAIC0zMDIsMTcgKzMwMiw2IEBACiAJaG9zdC0+bWF4X2Jsa19zaXplID0gNTEyOwogCWhvc3QtPm1heF9ibGtfY291bnQgPSBQQUdFX0NBQ0hFX1NJWkUgLyA1MTI7CiAKLQkvKgotCSAqIEVuYWJsZSBydW50aW1lIHBvd2VyIG1hbmFnZW1lbnQgYnkgZGVmYXVsdC4gVGhpcyBmbGFnIHdhcyBhZGRlZCBkdWUKLQkgKiB0byBydW50aW1lIHBvd2VyIG1hbmFnZW1lbnQgY2F1c2luZyBkaXNydXB0aW9uIGZvciBzb21lIHVzZXJzLCBidXQKLQkgKiB0aGUgcG93ZXIgb24vb2ZmIGNvZGUgaGFzIGJlZW4gaW1wcm92ZWQgc2luY2UgdGhlbi4KLQkgKgotCSAqIFdlJ2xsIGVuYWJsZSB0aGlzIGZsYWcgYnkgZGVmYXVsdCBhcyBhbiBleHBlcmltZW50LCBhbmQgaWYgbm8KLQkgKiBwcm9ibGVtcyBhcmUgcmVwb3J0ZWQsIHdlIHdpbGwgZm9sbG93IHVwIGxhdGVyIGFuZCByZW1vdmUgdGhlIGZsYWcKLQkgKiBhbHRvZ2V0aGVyLgotCSAqLwotCWhvc3QtPmNhcHMgPSBNTUNfQ0FQX1BPV0VSX09GRl9DQVJEOwotCiAJcmV0dXJuIGhvc3Q7CiAKIGZyZWU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL21tYy5jIGIvZHJpdmVycy9tbWMvY29yZS9tbWMuYwppbmRleCBkYmY0MjFhLi5kMjQwNDI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9jb3JlL21tYy5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvbW1jLmMKQEAgLTg3NiwxNyArODc2LDIxIEBACiAJICogc2V0IHRoZSBub3RpZmljYXRpb24gYnl0ZSBpbiB0aGUgZXh0X2NzZCByZWdpc3RlciBvZiBkZXZpY2UKIAkgKi8KIAlpZiAoKGhvc3QtPmNhcHMyICYgTU1DX0NBUDJfUE9XRVJPRkZfTk9USUZZKSAmJgotCSAgICAoY2FyZC0+cG93ZXJvZmZfbm90aWZ5X3N0YXRlID09IE1NQ19OT19QT1dFUl9OT1RJRklDQVRJT04pKSB7CisJICAgIChjYXJkLT5leHRfY3NkLnJldiA+PSA2KSkgewogCQllcnIgPSBtbWNfc3dpdGNoKGNhcmQsIEVYVF9DU0RfQ01EX1NFVF9OT1JNQUwsCiAJCQkJIEVYVF9DU0RfUE9XRVJfT0ZGX05PVElGSUNBVElPTiwKIAkJCQkgRVhUX0NTRF9QT1dFUl9PTiwKIAkJCQkgY2FyZC0+ZXh0X2NzZC5nZW5lcmljX2NtZDZfdGltZSk7CiAJCWlmIChlcnIgJiYgZXJyICE9IC1FQkFETVNHKQogCQkJZ290byBmcmVlX2NhcmQ7Ci0JfQogCi0JaWYgKCFlcnIpCi0JCWNhcmQtPnBvd2Vyb2ZmX25vdGlmeV9zdGF0ZSA9IE1NQ19QT1dFUkVEX09OOworCQkvKgorCQkgKiBUaGUgZXJyIGNhbiBiZSAtRUJBRE1TRyBvciAwLAorCQkgKiBzbyBjaGVjayBmb3Igc3VjY2VzcyBhbmQgdXBkYXRlIHRoZSBmbGFnCisJCSAqLworCQlpZiAoIWVycikKKwkJCWNhcmQtPnBvd2Vyb2ZmX25vdGlmeV9zdGF0ZSA9IE1NQ19QT1dFUkVEX09OOworCX0KIAogCS8qCiAJICogQWN0aXZhdGUgaGlnaCBzcGVlZCAoaWYgc3VwcG9ydGVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9tbWNpLmMgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwppbmRleCA1MGI1Zjk5Li4wNzI2ZTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L21tY2kuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L21tY2kuYwpAQCAtNjc1LDcgKzY3NSw4IEBACiAJICAgICAgdW5zaWduZWQgaW50IHN0YXR1cykKIHsKIAkvKiBGaXJzdCBjaGVjayBmb3IgZXJyb3JzICovCi0JaWYgKHN0YXR1cyAmIChNQ0lfREFUQUNSQ0ZBSUx8TUNJX0RBVEFUSU1FT1VUfE1DSV9UWFVOREVSUlVOfE1DSV9SWE9WRVJSVU4pKSB7CisJaWYgKHN0YXR1cyAmIChNQ0lfREFUQUNSQ0ZBSUx8TUNJX0RBVEFUSU1FT1VUfE1DSV9TVEFSVEJJVEVSUnwKKwkJICAgICAgTUNJX1RYVU5ERVJSVU58TUNJX1JYT1ZFUlJVTikpIHsKIAkJdTMyIHJlbWFpbiwgc3VjY2VzczsKIAogCQkvKiBUZXJtaW5hdGUgdGhlIERNQSB0cmFuc2ZlciAqLwpAQCAtNzU0LDggKzc1NSwxMiBAQAogCX0KIAogCWlmICghY21kLT5kYXRhIHx8IGNtZC0+ZXJyb3IpIHsKLQkJaWYgKGhvc3QtPmRhdGEpCisJCWlmIChob3N0LT5kYXRhKSB7CisJCQkvKiBUZXJtaW5hdGUgdGhlIERNQSB0cmFuc2ZlciAqLworCQkJaWYgKGRtYV9pbnByb2dyZXNzKGhvc3QpKQorCQkJCW1tY2lfZG1hX2RhdGFfZXJyb3IoaG9zdCk7CiAJCQltbWNpX3N0b3BfZGF0YShob3N0KTsKKwkJfQogCQltbWNpX3JlcXVlc3RfZW5kKGhvc3QsIGNtZC0+bXJxKTsKIAl9IGVsc2UgaWYgKCEoY21kLT5kYXRhLT5mbGFncyAmIE1NQ19EQVRBX1JFQUQpKSB7CiAJCW1tY2lfc3RhcnRfZGF0YShob3N0LCBjbWQtPmRhdGEpOwpAQCAtOTU1LDggKzk2MCw5IEBACiAJCWRldl9kYmcobW1jX2Rldihob3N0LT5tbWMpLCAiaXJxMCAoZGF0YStjbWQpICUwOHhcbiIsIHN0YXR1cyk7CiAKIAkJZGF0YSA9IGhvc3QtPmRhdGE7Ci0JCWlmIChzdGF0dXMgJiAoTUNJX0RBVEFDUkNGQUlMfE1DSV9EQVRBVElNRU9VVHxNQ0lfVFhVTkRFUlJVTnwKLQkJCSAgICAgIE1DSV9SWE9WRVJSVU58TUNJX0RBVEFFTkR8TUNJX0RBVEFCTE9DS0VORCkgJiYgZGF0YSkKKwkJaWYgKHN0YXR1cyAmIChNQ0lfREFUQUNSQ0ZBSUx8TUNJX0RBVEFUSU1FT1VUfE1DSV9TVEFSVEJJVEVSUnwKKwkJCSAgICAgIE1DSV9UWFVOREVSUlVOfE1DSV9SWE9WRVJSVU58TUNJX0RBVEFFTkR8CisJCQkgICAgICBNQ0lfREFUQUJMT0NLRU5EKSAmJiBkYXRhKQogCQkJbW1jaV9kYXRhX2lycShob3N0LCBkYXRhLCBzdGF0dXMpOwogCiAJCWNtZCA9IGhvc3QtPmNtZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMgYi9kcml2ZXJzL21tYy9ob3N0L214Y21tYy5jCmluZGV4IDMyNWVhNjEuLjhlMGZiZTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3QvbXhjbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9teGNtbWMuYwpAQCAtNzMyLDYgKzczMiw3IEBACiAJCQkJImZhaWxlZCB0byBjb25maWcgRE1BIGNoYW5uZWwuIEZhbGxpbmcgYmFjayB0byBQSU9cbiIpOwogCQkJZG1hX3JlbGVhc2VfY2hhbm5lbChob3N0LT5kbWEpOwogCQkJaG9zdC0+ZG9fZG1hID0gMDsKKwkJCWhvc3QtPmRtYSA9IE5VTEw7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvb21hcF9oc21tYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKaW5kZXggMTAxY2QzMS4uZDVmZTQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9vbWFwX2hzbW1jLmMKQEAgLTEwMTAsNiArMTAxMCw3IEBACiAJCQlob3N0LT5kYXRhLT5zZ19sZW4sCiAJCQlvbWFwX2hzbW1jX2dldF9kbWFfZGlyKGhvc3QsIGhvc3QtPmRhdGEpKTsKIAkJb21hcF9mcmVlX2RtYShkbWFfY2gpOworCQlob3N0LT5kYXRhLT5ob3N0X2Nvb2tpZSA9IDA7CiAJfQogCWhvc3QtPmRhdGEgPSBOVUxMOwogfQpAQCAtMTU3NSw4ICsxNTc2LDEwIEBACiAJc3RydWN0IG1tY19kYXRhICpkYXRhID0gbXJxLT5kYXRhOwogCiAJaWYgKGhvc3QtPnVzZV9kbWEpIHsKLQkJZG1hX3VubWFwX3NnKG1tY19kZXYoaG9zdC0+bW1jKSwgZGF0YS0+c2csIGRhdGEtPnNnX2xlbiwKLQkJCSAgICAgb21hcF9oc21tY19nZXRfZG1hX2Rpcihob3N0LCBkYXRhKSk7CisJCWlmIChkYXRhLT5ob3N0X2Nvb2tpZSkKKwkJCWRtYV91bm1hcF9zZyhtbWNfZGV2KGhvc3QtPm1tYyksIGRhdGEtPnNnLAorCQkJCSAgICAgZGF0YS0+c2dfbGVuLAorCQkJCSAgICAgb21hcF9oc21tY19nZXRfZG1hX2Rpcihob3N0LCBkYXRhKSk7CiAJCWRhdGEtPmhvc3RfY29va2llID0gMDsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWNuczN4eHguYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktY25zM3h4eC5jCmluZGV4IDRiOTIwYjcuLmI0MjU3ZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktY25zM3h4eC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktY25zM3h4eC5jCkBAIC0xNSw2ICsxNSw3IEBACiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPG1hY2gvY25zM3h4eC5oPgogI2luY2x1ZGUgInNkaGNpLXBsdGZtLmgiCiAKQEAgLTEwOCwxMyArMTA5LDEwIEBACiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInNkaGNpLWNuczN4eHgiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gU0RIQ0lfUExURk1fUE1PUFMsCiAJfSwKIAkucHJvYmUJCT0gc2RoY2lfY25zM3h4eF9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNkaGNpX2NuczN4eHhfcmVtb3ZlKSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZAk9IHNkaGNpX3BsdGZtX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzZGhjaV9wbHRmbV9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNkaGNpX2NuczN4eHhfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1kb3ZlLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWRvdmUuYwppbmRleCBmMmQyOWRjLi5hODEzMTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWRvdmUuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWRvdmUuYwpAQCAtODIsMTMgKzgyLDEwIEBACiAJLmRyaXZlcgkJPSB7CiAJCS5uYW1lCT0gInNkaGNpLWRvdmUiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gU0RIQ0lfUExURk1fUE1PUFMsCiAJfSwKIAkucHJvYmUJCT0gc2RoY2lfZG92ZV9wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNkaGNpX2RvdmVfcmVtb3ZlKSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZAk9IHNkaGNpX3BsdGZtX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzZGhjaV9wbHRmbV9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNkaGNpX2RvdmVfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktZXNkaGMtaW14LmMKaW5kZXggNGI5NzZmMC4uMzhlYmM0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1lc2RoYy1pbXguYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLWVzZGhjLWlteC5jCkBAIC01OTksMTQgKzU5OSwxMSBAQAogCQkubmFtZQk9ICJzZGhjaS1lc2RoYy1pbXgiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gaW14X2VzZGhjX2R0X2lkcywKKwkJLnBtCT0gU0RIQ0lfUExURk1fUE1PUFMsCiAJfSwKIAkuaWRfdGFibGUJPSBpbXhfZXNkaGNfZGV2dHlwZSwKIAkucHJvYmUJCT0gc2RoY2lfZXNkaGNfaW14X3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2RoY2lfZXNkaGNfaW14X3JlbW92ZSksCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSBzZGhjaV9wbHRmbV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gc2RoY2lfcGx0Zm1fcmVzdW1lLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzZGhjaV9lc2RoY19pbXhfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1lc2RoYy5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1vZi1lc2RoYy5jCmluZGV4IDU5ZTlkMDAuLjAxZTVmNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtZXNkaGMuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWVzZGhjLmMKQEAgLTEyNSwxMyArMTI1LDEwIEBACiAJCS5uYW1lID0gInNkaGNpLWVzZGhjIiwKIAkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJCS5vZl9tYXRjaF90YWJsZSA9IHNkaGNpX2VzZGhjX29mX21hdGNoLAorCQkucG0gPSBTREhDSV9QTFRGTV9QTU9QUywKIAl9LAogCS5wcm9iZSA9IHNkaGNpX2VzZGhjX3Byb2JlLAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzZGhjaV9lc2RoY19yZW1vdmUpLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kID0gc2RoY2lfcGx0Zm1fc3VzcGVuZCwKLQkucmVzdW1lID0gc2RoY2lfcGx0Zm1fcmVzdW1lLAotI2VuZGlmCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBzZGhjaV9lc2RoY19pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLW9mLWhsd2QuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtaGx3ZC5jCmluZGV4IDliMGQ3OTQuLjM2MTlhZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtaGx3ZC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktb2YtaGx3ZC5jCkBAIC04NywxMyArODcsMTAgQEAKIAkJLm5hbWUgPSAic2RoY2ktaGx3ZCIsCiAJCS5vd25lciA9IFRISVNfTU9EVUxFLAogCQkub2ZfbWF0Y2hfdGFibGUgPSBzZGhjaV9obHdkX29mX21hdGNoLAorCQkucG0gPSBTREhDSV9QTFRGTV9QTU9QUywKIAl9LAogCS5wcm9iZSA9IHNkaGNpX2hsd2RfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNkaGNpX2hsd2RfcmVtb3ZlKSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZCA9IHNkaGNpX3BsdGZtX3N1c3BlbmQsCi0JLnJlc3VtZSA9IHNkaGNpX3BsdGZtX3Jlc3VtZSwKLSNlbmRpZgogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2RoY2lfaGx3ZF9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wY2kuYwppbmRleCBkODMzZDljLi42ODc4YTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBjaS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGNpLmMKQEAgLTU0LDggKzU0LDcgQEAKIAlpbnQJCQkoKnByb2JlX3Nsb3QpIChzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3QgKik7CiAJdm9pZAkJCSgqcmVtb3ZlX3Nsb3QpIChzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3QgKiwgaW50KTsKIAotCWludAkJCSgqc3VzcGVuZCkgKHN0cnVjdCBzZGhjaV9wY2lfY2hpcCAqLAotCQkJCQlwbV9tZXNzYWdlX3QpOworCWludAkJCSgqc3VzcGVuZCkgKHN0cnVjdCBzZGhjaV9wY2lfY2hpcCAqKTsKIAlpbnQJCQkoKnJlc3VtZSkgKHN0cnVjdCBzZGhjaV9wY2lfY2hpcCAqKTsKIH07CiAKQEAgLTU0OSw3ICs1NDgsNyBAQAogCQlqbWljcm9uX2VuYWJsZV9tbWMoc2xvdC0+aG9zdCwgMCk7CiB9CiAKLXN0YXRpYyBpbnQgam1pY3Jvbl9zdXNwZW5kKHN0cnVjdCBzZGhjaV9wY2lfY2hpcCAqY2hpcCwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBqbWljcm9uX3N1c3BlbmQoc3RydWN0IHNkaGNpX3BjaV9jaGlwICpjaGlwKQogewogCWludCBpOwogCkBAIC05OTMsOCArOTkyLDkgQEAKIAogI2lmZGVmIENPTkZJR19QTQogCi1zdGF0aWMgaW50IHNkaGNpX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHNkaGNpX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKIAlzdHJ1Y3Qgc2RoY2lfcGNpX2NoaXAgKmNoaXA7CiAJc3RydWN0IHNkaGNpX3BjaV9zbG90ICpzbG90OwogCW1tY19wbV9mbGFnX3Qgc2xvdF9wbV9mbGFnczsKQEAgLTEwMTAsNyArMTAxMCw3IEBACiAJCWlmICghc2xvdCkKIAkJCWNvbnRpbnVlOwogCi0JCXJldCA9IHNkaGNpX3N1c3BlbmRfaG9zdChzbG90LT5ob3N0LCBzdGF0ZSk7CisJCXJldCA9IHNkaGNpX3N1c3BlbmRfaG9zdChzbG90LT5ob3N0KTsKIAogCQlpZiAocmV0KSB7CiAJCQlmb3IgKGktLTsgaSA+PSAwOyBpLS0pCkBAIC0xMDI2LDcgKzEwMjYsNyBAQAogCX0KIAogCWlmIChjaGlwLT5maXhlcyAmJiBjaGlwLT5maXhlcy0+c3VzcGVuZCkgewotCQlyZXQgPSBjaGlwLT5maXhlcy0+c3VzcGVuZChjaGlwLCBzdGF0ZSk7CisJCXJldCA9IGNoaXAtPmZpeGVzLT5zdXNwZW5kKGNoaXApOwogCQlpZiAocmV0KSB7CiAJCQlmb3IgKGkgPSBjaGlwLT5udW1fc2xvdHMgLSAxOyBpID49IDA7IGktLSkKIAkJCQlzZGhjaV9yZXN1bWVfaG9zdChjaGlwLT5zbG90c1tpXS0+aG9zdCk7CkBAIC0xMDQyLDE2ICsxMDQyLDE3IEBACiAJCX0KIAkJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDNob3QpOwogCX0gZWxzZSB7Ci0JCXBjaV9lbmFibGVfd2FrZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSwgMCk7CisJCXBjaV9lbmFibGVfd2FrZShwZGV2LCBQQ0lfRDNob3QsIDApOwogCQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7Ci0JCXBjaV9zZXRfcG93ZXJfc3RhdGUocGRldiwgcGNpX2Nob29zZV9zdGF0ZShwZGV2LCBzdGF0ZSkpOworCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2RoY2lfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyBpbnQgc2RoY2lfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IHNkaGNpX3BjaV9jaGlwICpjaGlwOwogCXN0cnVjdCBzZGhjaV9wY2lfc2xvdCAqc2xvdDsKIAlpbnQgaSwgcmV0OwpAQCAtMTA5OSw3ICsxMTAwLDYgQEAKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGNvbnRhaW5lcl9vZihkZXYsIHN0cnVjdCBwY2lfZGV2LCBkZXYpOwogCXN0cnVjdCBzZGhjaV9wY2lfY2hpcCAqY2hpcDsKIAlzdHJ1Y3Qgc2RoY2lfcGNpX3Nsb3QgKnNsb3Q7Ci0JcG1fbWVzc2FnZV90IHN0YXRlID0geyAuZXZlbnQgPSBQTV9FVkVOVF9TVVNQRU5EIH07CiAJaW50IGksIHJldDsKIAogCWNoaXAgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CkBAIC0xMTIxLDcgKzExMjEsNyBAQAogCX0KIAogCWlmIChjaGlwLT5maXhlcyAmJiBjaGlwLT5maXhlcy0+c3VzcGVuZCkgewotCQlyZXQgPSBjaGlwLT5maXhlcy0+c3VzcGVuZChjaGlwLCBzdGF0ZSk7CisJCXJldCA9IGNoaXAtPmZpeGVzLT5zdXNwZW5kKGNoaXApOwogCQlpZiAocmV0KSB7CiAJCQlmb3IgKGkgPSBjaGlwLT5udW1fc2xvdHMgLSAxOyBpID49IDA7IGktLSkKIAkJCQlzZGhjaV9ydW50aW1lX3Jlc3VtZV9ob3N0KGNoaXAtPnNsb3RzW2ldLT5ob3N0KTsKQEAgLTExNzYsNiArMTE3Niw4IEBACiAjZW5kaWYKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNkaGNpX3BjaV9wbV9vcHMgPSB7CisJLnN1c3BlbmQgPSBzZGhjaV9wY2lfc3VzcGVuZCwKKwkucmVzdW1lID0gc2RoY2lfcGNpX3Jlc3VtZSwKIAkucnVudGltZV9zdXNwZW5kID0gc2RoY2lfcGNpX3J1bnRpbWVfc3VzcGVuZCwKIAkucnVudGltZV9yZXN1bWUgPSBzZGhjaV9wY2lfcnVudGltZV9yZXN1bWUsCiAJLnJ1bnRpbWVfaWRsZSA9IHNkaGNpX3BjaV9ydW50aW1lX2lkbGUsCkBAIC0xNDI4LDggKzE0MzAsNiBAQAogCS5pZF90YWJsZSA9CXBjaV9pZHMsCiAJLnByb2JlID0Jc2RoY2lfcGNpX3Byb2JlLAogCS5yZW1vdmUgPQlfX2RldmV4aXRfcChzZGhjaV9wY2lfcmVtb3ZlKSwKLQkuc3VzcGVuZCA9CXNkaGNpX3BjaV9zdXNwZW5kLAotCS5yZXN1bWUJPQlzZGhjaV9wY2lfcmVzdW1lLAogCS5kcml2ZXIgPQl7CiAJCS5wbSA9ICAgJnNkaGNpX3BjaV9wbV9vcHMKIAl9LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5jCmluZGV4IGE5ZTEyZWEuLjAzOTcwYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmMKQEAgLTE5NCwyMSArMTk0LDI1IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzZGhjaV9wbHRmbV91bnJlZ2lzdGVyKTsKIAogI2lmZGVmIENPTkZJR19QTQotaW50IHNkaGNpX3BsdGZtX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCitzdGF0aWMgaW50IHNkaGNpX3BsdGZtX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCi0JcmV0dXJuIHNkaGNpX3N1c3BlbmRfaG9zdChob3N0LCBzdGF0ZSk7CisJcmV0dXJuIHNkaGNpX3N1c3BlbmRfaG9zdChob3N0KTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNkaGNpX3BsdGZtX3N1c3BlbmQpOwogCi1pbnQgc2RoY2lfcGx0Zm1fcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgc2RoY2lfcGx0Zm1fcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAogCXJldHVybiBzZGhjaV9yZXN1bWVfaG9zdChob3N0KTsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHNkaGNpX3BsdGZtX3Jlc3VtZSk7CisKK2NvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHNkaGNpX3BsdGZtX3Btb3BzID0geworCS5zdXNwZW5kCT0gc2RoY2lfcGx0Zm1fc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNkaGNpX3BsdGZtX3Jlc3VtZSwKK307CitFWFBPUlRfU1lNQk9MX0dQTChzZGhjaV9wbHRmbV9wbW9wcyk7CiAjZW5kaWYJLyogQ09ORklHX1BNICovCiAKIHN0YXRpYyBpbnQgX19pbml0IHNkaGNpX3BsdGZtX2Rydl9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmggYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXBsdGZtLmgKaW5kZXggM2E5ZmMzZi4uMzdlMGUxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1wbHRmbS5oCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcGx0Zm0uaApAQCAtOTksOCArOTksMTAgQEAKIGV4dGVybiBpbnQgc2RoY2lfcGx0Zm1fdW5yZWdpc3RlcihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKIAogI2lmZGVmIENPTkZJR19QTQotZXh0ZXJuIGludCBzZGhjaV9wbHRmbV9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKLWV4dGVybiBpbnQgc2RoY2lfcGx0Zm1fcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmRldik7CitleHRlcm4gY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc2RoY2lfcGx0Zm1fcG1vcHM7CisjZGVmaW5lIFNESENJX1BMVEZNX1BNT1BTICgmc2RoY2lfcGx0Zm1fcG1vcHMpCisjZWxzZQorI2RlZmluZSBTREhDSV9QTFRGTV9QTU9QUyBOVUxMCiAjZW5kaWYKIAogI2VuZGlmIC8qIF9EUklWRVJTX01NQ19TREhDSV9QTFRGTV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYyLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYyLmMKaW5kZXggZDRiZjZkMy4uN2EwMzljMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGF2Mi5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjIuYwpAQCAtMjE4LDEzICsyMTgsMTAgQEAKIAkuZHJpdmVyCQk9IHsKIAkJLm5hbWUJPSAic2RoY2ktcHhhdjIiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKKwkJLnBtCT0gU0RIQ0lfUExURk1fUE1PUFMsCiAJfSwKIAkucHJvYmUJCT0gc2RoY2lfcHhhdjJfcHJvYmUsCiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzZGhjaV9weGF2Ml9yZW1vdmUpLAotI2lmZGVmIENPTkZJR19QTQotCS5zdXNwZW5kCT0gc2RoY2lfcGx0Zm1fc3VzcGVuZCwKLQkucmVzdW1lCQk9IHNkaGNpX3BsdGZtX3Jlc3VtZSwKLSNlbmRpZgogfTsKIHN0YXRpYyBpbnQgX19pbml0IHNkaGNpX3B4YXYyX2luaXQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjMuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktcHhhdjMuYwppbmRleCBjZmY0YWQzLi4xNTY3M2E3IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXB4YXYzLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1weGF2My5jCkBAIC0yNjQsMTMgKzI2NCwxMCBAQAogCS5kcml2ZXIJCT0gewogCQkubmFtZQk9ICJzZGhjaS1weGF2MyIsCiAJCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCQkucG0JPSBTREhDSV9QTFRGTV9QTU9QUywKIAl9LAogCS5wcm9iZQkJPSBzZGhjaV9weGF2M19wcm9iZSwKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHNkaGNpX3B4YXYzX3JlbW92ZSksCi0jaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQJPSBzZGhjaV9wbHRmbV9zdXNwZW5kLAotCS5yZXN1bWUJCT0gc2RoY2lfcGx0Zm1fcmVzdW1lLAotI2VuZGlmCiB9Owogc3RhdGljIGludCBfX2luaXQgc2RoY2lfcHhhdjNfaW5pdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktczNjLmMKaW5kZXggM2QwMGU3Mi4uMGQzM2ZmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS1zM2MuYworKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXMzYy5jCkBAIC02MjIsMzMgKzYyMiwzOCBAQAogCiAjaWZkZWYgQ09ORklHX1BNCiAKLXN0YXRpYyBpbnQgc2RoY2lfczNjX3N1c3BlbmQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZGV2LCBwbV9tZXNzYWdlX3QgcG0pCitzdGF0aWMgaW50IHNkaGNpX3MzY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAotCXJldHVybiBzZGhjaV9zdXNwZW5kX2hvc3QoaG9zdCwgcG0pOworCXJldHVybiBzZGhjaV9zdXNwZW5kX2hvc3QoaG9zdCk7CiB9CiAKLXN0YXRpYyBpbnQgc2RoY2lfczNjX3Jlc3VtZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IHNkaGNpX3MzY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBzZGhjaV9ob3N0ICpob3N0ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCiAJcmV0dXJuIHNkaGNpX3Jlc3VtZV9ob3N0KGhvc3QpOwogfQogCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc2RoY2lfczNjX3Btb3BzID0geworCS5zdXNwZW5kCT0gc2RoY2lfczNjX3N1c3BlbmQsCisJLnJlc3VtZQkJPSBzZGhjaV9zM2NfcmVzdW1lLAorfTsKKworI2RlZmluZSBTREhDSV9TM0NfUE1PUFMgKCZzZGhjaV9zM2NfcG1vcHMpCisKICNlbHNlCi0jZGVmaW5lIHNkaGNpX3MzY19zdXNwZW5kIE5VTEwKLSNkZWZpbmUgc2RoY2lfczNjX3Jlc3VtZSBOVUxMCisjZGVmaW5lIFNESENJX1MzQ19QTU9QUyBOVUxMCiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc2RoY2lfczNjX2RyaXZlciA9IHsKIAkucHJvYmUJCT0gc2RoY2lfczNjX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2RoY2lfczNjX3JlbW92ZSksCi0JLnN1c3BlbmQJPSBzZGhjaV9zM2Nfc3VzcGVuZCwKLQkucmVzdW1lCSAgICAgICAgPSBzZGhjaV9zM2NfcmVzdW1lLAogCS5kcml2ZXIJCT0gewogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm5hbWUJPSAiczNjLXNkaGNpIiwKKwkJLnBtCT0gU0RIQ0lfUzNDX1BNT1BTLAogCX0sCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLXRlZ3JhLmMKaW5kZXggODk2OTllOC4uZTJlMThkMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS10ZWdyYS5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2ktdGVncmEuYwpAQCAtMzE4LDEzICszMTgsMTAgQEAKIAkJLm5hbWUJPSAic2RoY2ktdGVncmEiLAogCQkub3duZXIJPSBUSElTX01PRFVMRSwKIAkJLm9mX21hdGNoX3RhYmxlID0gc2RoY2lfdGVncmFfZHRfbWF0Y2gsCisJCS5wbQk9IFNESENJX1BMVEZNX1BNT1BTLAogCX0sCiAJLnByb2JlCQk9IHNkaGNpX3RlZ3JhX3Byb2JlLAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc2RoY2lfdGVncmFfcmVtb3ZlKSwKLSNpZmRlZiBDT05GSUdfUE0KLQkuc3VzcGVuZAk9IHNkaGNpX3BsdGZtX3N1c3BlbmQsCi0JLnJlc3VtZQkJPSBzZGhjaV9wbHRmbV9yZXN1bWUsCi0jZW5kaWYKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNkaGNpX3RlZ3JhX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuYwppbmRleCA2ZDhlZWEzLi4xOWVkNTgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5jCkBAIC0yMzI3LDcgKzIzMjcsNyBAQAogCiAjaWZkZWYgQ09ORklHX1BNCiAKLWludCBzZGhjaV9zdXNwZW5kX2hvc3Qoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK2ludCBzZGhjaV9zdXNwZW5kX2hvc3Qoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QpCiB7CiAJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oIGIvZHJpdmVycy9tbWMvaG9zdC9zZGhjaS5oCmluZGV4IDBhNWI2NTQuLmEwNGQ0ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbW1jL2hvc3Qvc2RoY2kuaAorKysgYi9kcml2ZXJzL21tYy9ob3N0L3NkaGNpLmgKQEAgLTM3NCw3ICszNzQsNyBAQAogZXh0ZXJuIHZvaWQgc2RoY2lfcmVtb3ZlX2hvc3Qoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIGludCBkZWFkKTsKIAogI2lmZGVmIENPTkZJR19QTQotZXh0ZXJuIGludCBzZGhjaV9zdXNwZW5kX2hvc3Qoc3RydWN0IHNkaGNpX2hvc3QgKmhvc3QsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitleHRlcm4gaW50IHNkaGNpX3N1c3BlbmRfaG9zdChzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CiBleHRlcm4gaW50IHNkaGNpX3Jlc3VtZV9ob3N0KHN0cnVjdCBzZGhjaV9ob3N0ICpob3N0KTsKIGV4dGVybiB2b2lkIHNkaGNpX2VuYWJsZV9pcnFfd2FrZXVwcyhzdHJ1Y3Qgc2RoY2lfaG9zdCAqaG9zdCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW1jaWYuYyBiL2RyaXZlcnMvbW1jL2hvc3Qvc2hfbW1jaWYuYwppbmRleCAzNjkzNjZjLi5kNTUwNWYzIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3NoX21tY2lmLmMKKysrIGIvZHJpdmVycy9tbWMvaG9zdC9zaF9tbWNpZi5jCkBAIC05MDgsNyArOTA4LDcgQEAKIAkJaWYgKGhvc3QtPnBvd2VyKSB7CiAJCQlwbV9ydW50aW1lX3B1dCgmaG9zdC0+cGQtPmRldik7CiAJCQlob3N0LT5wb3dlciA9IGZhbHNlOwotCQkJaWYgKHAtPmRvd25fcHdyKQorCQkJaWYgKHAtPmRvd25fcHdyICYmIGlvcy0+cG93ZXJfbW9kZSA9PSBNTUNfUE9XRVJfT0ZGKQogCQkJCXAtPmRvd25fcHdyKGhvc3QtPnBkKTsKIAkJfQogCQlob3N0LT5zdGF0ZSA9IFNUQVRFX0lETEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jIGIvZHJpdmVycy9tbWMvaG9zdC90bWlvX21tY19waW8uYwppbmRleCBkODVhNjBjLi40MjA4YjM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3RtaW9fbW1jX3Bpby5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdG1pb19tbWNfcGlvLmMKQEAgLTc5OCw3ICs3OTgsNyBAQAogCQkvKiBzdGFydCBidXMgY2xvY2sgKi8KIAkJdG1pb19tbWNfY2xrX3N0YXJ0KGhvc3QpOwogCX0gZWxzZSBpZiAoaW9zLT5wb3dlcl9tb2RlICE9IE1NQ19QT1dFUl9VUCkgewotCQlpZiAoaG9zdC0+c2V0X3B3cikKKwkJaWYgKGhvc3QtPnNldF9wd3IgJiYgaW9zLT5wb3dlcl9tb2RlID09IE1NQ19QT1dFUl9PRkYpCiAJCQlob3N0LT5zZXRfcHdyKGhvc3QtPnBkZXYsIDApOwogCQlpZiAoKHBkYXRhLT5mbGFncyAmIFRNSU9fTU1DX0hBU19DT0xEX0NEKSAmJgogCQkgICAgcGRhdGEtPnBvd2VyKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jIGIvZHJpdmVycy9tbWMvaG9zdC92dWIzMDAuYwppbmRleCBlOGY2ZTY1Li4yZWM5NzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL21tYy9ob3N0L3Z1YjMwMC5jCisrKyBiL2RyaXZlcnMvbW1jL2hvc3QvdnViMzAwLmMKQEAgLTI1OSw3ICsyNTksNyBAQAogc3RhdGljIGludCBmaXJtd2FyZV9yb21fd2FpdF9zdGF0ZXMgPSAweDFDOwogI2VuZGlmCiAKLW1vZHVsZV9wYXJhbShmaXJtd2FyZV9yb21fd2FpdF9zdGF0ZXMsIGJvb2wsIDA2NDQpOworbW9kdWxlX3BhcmFtKGZpcm13YXJlX3JvbV93YWl0X3N0YXRlcywgaW50LCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MoZmlybXdhcmVfcm9tX3dhaXRfc3RhdGVzLAogCQkgIlJPTSB3YWl0IHN0YXRlcyBieXRlPVJSUklJRUVFIChSZXNlcnZlZCBJbnRlcm5hbCBFeHRlcm5hbCkiKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jIGIvZHJpdmVycy9tdGQvbWFwcy9wbGF0LXJhbS5jCmluZGV4IDk0ZjU1MzQuLjQ1ODc2ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcGxhdC1yYW0uYworKysgYi9kcml2ZXJzL210ZC9tYXBzL3BsYXQtcmFtLmMKQEAgLTIyNywxMCArMjI3LDE0IEBACiAJaWYgKCFlcnIpCiAJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJyZWdpc3RlcmVkIG10ZCBkZXZpY2VcbiIpOwogCi0JLyogYWRkIHRoZSB3aG9sZSBkZXZpY2UuICovCi0JZXJyID0gbXRkX2RldmljZV9yZWdpc3RlcihpbmZvLT5tdGQsIE5VTEwsIDApOwotCWlmIChlcnIpCi0JCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byByZWdpc3RlciB0aGUgZW50aXJlIGRldmljZVxuIik7CisJaWYgKHBkYXRhLT5ucl9wYXJ0aXRpb25zKSB7CisJCS8qIGFkZCB0aGUgd2hvbGUgZGV2aWNlLiAqLworCQllcnIgPSBtdGRfZGV2aWNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgTlVMTCwgMCk7CisJCWlmIChlcnIpIHsKKwkJCWRldl9lcnIoJnBkZXYtPmRldiwKKwkJCQkiZmFpbGVkIHRvIHJlZ2lzdGVyIHRoZSBlbnRpcmUgZGV2aWNlXG4iKTsKKwkJfQorCX0KIAogCXJldHVybiBlcnI7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL21hcHMvcHhhMnh4LWZsYXNoLmMgYi9kcml2ZXJzL210ZC9tYXBzL3B4YTJ4eC1mbGFzaC5jCmluZGV4IDQxMWExN2QuLjJhMjViNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbXRkL21hcHMvcHhhMnh4LWZsYXNoLmMKKysrIGIvZHJpdmVycy9tdGQvbWFwcy9weGEyeHgtZmxhc2guYwpAQCAtOTgsNyArOTgsNyBAQAogCX0KIAlpbmZvLT5tdGQtPm93bmVyID0gVEhJU19NT0RVTEU7CiAKLQltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgcHJvYmVzLCAwLCBOVUxMLCAwKTsKKwltdGRfZGV2aWNlX3BhcnNlX3JlZ2lzdGVyKGluZm8tPm10ZCwgcHJvYmVzLCAwLCBmbGFzaC0+cGFydHMsIGZsYXNoLT5ucl9wYXJ0cyk7CiAKIAlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQvZ3BtaS1uYW5kL2dwbWktbmFuZC5jIGIvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1uYW5kLmMKaW5kZXggMDcxYjYzNC4uNDkzZWMyZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1uYW5kLmMKKysrIGIvZHJpdmVycy9tdGQvbmFuZC9ncG1pLW5hbmQvZ3BtaS1uYW5kLmMKQEAgLTIxLDkgKzIxLDkgQEAKICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXRkL2dwbWktbmFuZC5oPgogI2luY2x1ZGUgPGxpbnV4L210ZC9wYXJ0aXRpb25zLmg+Ci0KICNpbmNsdWRlICJncG1pLW5hbmQuaCIKIAogLyogYWRkIG91ciBvd25lciBiYnQgZGVzY3JpcHRvciAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tdGQvbmFuZC9uZGZjLmMgYi9kcml2ZXJzL210ZC9uYW5kL25kZmMuYwppbmRleCBlZTE3MTM5Li5mOGFhY2Y0IDEwMDY0NAotLS0gYS9kcml2ZXJzL210ZC9uYW5kL25kZmMuYworKysgYi9kcml2ZXJzL210ZC9uYW5kL25kZmMuYwpAQCAtMTg4LDcgKzE4OCw3IEBACiAJaWYgKCFmbGFzaF9ucCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlwcGRhdGEtPm9mX25vZGUgPSBmbGFzaF9ucDsKKwlwcGRhdGEub2Zfbm9kZSA9IGZsYXNoX25wOwogCW5kZmMtPm10ZC5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcy4lcyIsCiAJCQlkZXZfbmFtZSgmbmRmYy0+b2ZkZXYtPmRldiksIGZsYXNoX25wLT5uYW1lKTsKIAlpZiAoIW5kZmMtPm10ZC5uYW1lKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvS2NvbmZpZwppbmRleCA2NTRhNWU5Li45ODQ1YWZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L0tjb25maWcKQEAgLTEyNSw2ICsxMjUsOCBAQAogCSAgJ2lmYjEnIGV0Yy4KIAkgIExvb2sgYXQgdGhlIGlwcm91dGUyIGRvY3VtZW50YXRpb24gZGlyZWN0b3J5IGZvciB1c2FnZSBldGMKIAorc291cmNlICJkcml2ZXJzL25ldC90ZWFtL0tjb25maWciCisKIGNvbmZpZyBNQUNWTEFOCiAJdHJpc3RhdGUgIk1BQy1WTEFOIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKQEAgLTI0MSw2ICsyNDMsOCBAQAogCiBzb3VyY2UgImRyaXZlcnMvbmV0L2NhaWYvS2NvbmZpZyIKIAorc291cmNlICJkcml2ZXJzL25ldC9kc2EvS2NvbmZpZyIKKwogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbmV0L2ZkZGkvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKaW5kZXggZmE4NzdjZC4uMTk4ODg4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvTWFrZWZpbGUKQEAgLTE3LDYgKzE3LDcgQEAKIG9iai0kKENPTkZJR19ORVRDT05TT0xFKSArPSBuZXRjb25zb2xlLm8KIG9iai0kKENPTkZJR19QSFlMSUIpICs9IHBoeS8KIG9iai0kKENPTkZJR19SSU9ORVQpICs9IHJpb25ldC5vCitvYmotJChDT05GSUdfTkVUX1RFQU0pICs9IHRlYW0vCiBvYmotJChDT05GSUdfVFVOKSArPSB0dW4ubwogb2JqLSQoQ09ORklHX1ZFVEgpICs9IHZldGgubwogb2JqLSQoQ09ORklHX1ZJUlRJT19ORVQpICs9IHZpcnRpb19uZXQubwpAQCAtMjksNiArMzAsNyBAQAogb2JqLSQoQ09ORklHX0NBSUYpICs9IGNhaWYvCiBvYmotJChDT05GSUdfQ0FOKSArPSBjYW4vCiBvYmotJChDT05GSUdfRVRSQVhfRVRIRVJORVQpICs9IGNyaXMvCitvYmotJChDT05GSUdfTkVUX0RTQSkgKz0gZHNhLwogb2JqLSQoQ09ORklHX0VUSEVSTkVUKSArPSBldGhlcm5ldC8KIG9iai0kKENPTkZJR19GRERJKSArPSBmZGRpLwogb2JqLSQoQ09ORklHX0hJUFBJKSArPSBoaXBwaS8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2FyY25ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvYXJjbmV0L0tjb25maWcKaW5kZXggYTczZDlkYy4uODRmYjYzNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYXJjbmV0L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvYXJjbmV0L0tjb25maWcKQEAgLTQsNyArNCw3IEBACiAKIG1lbnVjb25maWcgQVJDTkVUCiAJZGVwZW5kcyBvbiBORVRERVZJQ0VTICYmIChJU0EgfHwgUENJIHx8IFBDTUNJQSkKLQlib29sICJBUkNuZXQgc3VwcG9ydCIKKwl0cmlzdGF0ZSAiQVJDbmV0IHN1cHBvcnQiCiAJLS0taGVscC0tLQogCSAgSWYgeW91IGhhdmUgYSBuZXR3b3JrIGNhcmQgb2YgdGhpcyB0eXBlLCBzYXkgWSBhbmQgY2hlY2sgb3V0IHRoZQogCSAgKGFyZ3VhYmx5KSBiZWF1dGlmdWwgcG9ldHJ5IGluCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfaXB2Ni5jIGIvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX2lwdjYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI3YTBlZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfaXB2Ni5jCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQoYykgMjAwOCBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueSwgTC5QLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKLSAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKLSAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkKLSAqIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZwotICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNywgVVNBLgotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+Ci0jaW5jbHVkZSA8bmV0L2lwdjYuaD4KLSNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KLSNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KLSNpbmNsdWRlIDxuZXQvbmV0bnMvZ2VuZXJpYy5oPgotI2luY2x1ZGUgImJvbmRpbmcuaCIKLQotLyoKLSAqIEFzc2lnbiBib25kLT5tYXN0ZXJfaXB2NiB0byB0aGUgbmV4dCBJUHY2IGFkZHJlc3MgaW4gdGhlIGxpc3QsIG9yCi0gKiB6ZXJvIGl0IG91dCBpZiB0aGVyZSBhcmUgbm9uZS4KLSAqLwotc3RhdGljIHZvaWQgYm9uZF9nbGVhbl9kZXZfaXB2NihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCi17Ci0Jc3RydWN0IGluZXQ2X2RldiAqaWRldjsKLQotCWlmICghZGV2KQotCQlyZXR1cm47Ci0KLQlpZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKLQlpZiAoIWlkZXYpCi0JCXJldHVybjsKLQotCXJlYWRfbG9ja19iaCgmaWRldi0+bG9jayk7Ci0JaWYgKCFsaXN0X2VtcHR5KCZpZGV2LT5hZGRyX2xpc3QpKSB7Ci0JCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmYQotCQkJPSBsaXN0X2ZpcnN0X2VudHJ5KCZpZGV2LT5hZGRyX2xpc3QsCi0JCQkJCSAgIHN0cnVjdCBpbmV0Nl9pZmFkZHIsIGlmX2xpc3QpOwotCQlpcHY2X2FkZHJfY29weShhZGRyLCAmaWZhLT5hZGRyKTsKLQl9IGVsc2UKLQkJaXB2Nl9hZGRyX3NldChhZGRyLCAwLCAwLCAwLCAwKTsKLQotCXJlYWRfdW5sb2NrX2JoKCZpZGV2LT5sb2NrKTsKLQotCWluNl9kZXZfcHV0KGlkZXYpOwotfQotCi1zdGF0aWMgdm9pZCBib25kX25hX3NlbmQoc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldiwKLQkJCSBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLAotCQkJIGludCByb3V0ZXIsCi0JCQkgdW5zaWduZWQgc2hvcnQgdmxhbl9pZCkKLXsKLQlzdHJ1Y3QgaW42X2FkZHIgbWNhZGRyOwotCXN0cnVjdCBpY21wNmhkciBpY21wNmggPSB7Ci0JCS5pY21wNl90eXBlID0gTkRJU0NfTkVJR0hCT1VSX0FEVkVSVElTRU1FTlQsCi0JfTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JaWNtcDZoLmljbXA2X3JvdXRlciA9IHJvdXRlcjsKLQlpY21wNmguaWNtcDZfc29saWNpdGVkID0gMDsKLQlpY21wNmguaWNtcDZfb3ZlcnJpZGUgPSAxOwotCi0JYWRkcmNvbmZfYWRkcl9zb2xpY3RfbXVsdChkYWRkciwgJm1jYWRkcik7Ci0KLQlwcl9kZWJ1ZygiaXB2NiBuYSBvbiBzbGF2ZSAlczogZGVzdCAlcEk2LCBzcmMgJXBJNlxuIiwKLQkJIHNsYXZlX2Rldi0+bmFtZSwgJm1jYWRkciwgZGFkZHIpOwotCi0Jc2tiID0gbmRpc2NfYnVpbGRfc2tiKHNsYXZlX2RldiwgJm1jYWRkciwgZGFkZHIsICZpY21wNmgsIGRhZGRyLAotCQkJICAgICAgTkRfT1BUX1RBUkdFVF9MTF9BRERSKTsKLQotCWlmICghc2tiKSB7Ci0JCXByX2VycigiTkEgcGFja2V0IGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh2bGFuX2lkKSB7Ci0JCS8qIFRoZSBFdGhlcm5ldCBoZWFkZXIgaXMgbm90IHByZXNlbnQgeWV0LCBzbyBpdCBpcwotCQkgKiB0b28gZWFybHkgdG8gaW5zZXJ0IGEgVkxBTiB0YWcuICBGb3JjZSB1c2Ugb2YgYW4KLQkJICogb3V0LW9mLWxpbmUgdGFnIGhlcmUgYW5kIGxldCBkZXZfaGFyZF9zdGFydF94bWl0KCkKLQkJICogaW5zZXJ0IGl0IGlmIHRoZSBzbGF2ZSBoYXJkd2FyZSBjYW4ndC4KLQkJICovCi0JCXNrYiA9IF9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCB2bGFuX2lkKTsKLQkJaWYgKCFza2IpIHsKLQkJCXByX2VycigiZmFpbGVkIHRvIGluc2VydCBWTEFOIHRhZ1xuIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQluZGlzY19zZW5kX3NrYihza2IsIHNsYXZlX2RldiwgTlVMTCwgJm1jYWRkciwgZGFkZHIsICZpY21wNmgpOwotfQotCi0vKgotICogS2ljayBvdXQgYW4gdW5zb2xpY2l0ZWQgTmVpZ2hib3IgQWR2ZXJ0aXNlbWVudCBmb3IgYW4gSVB2NiBhZGRyZXNzIG9uCi0gKiB0aGUgYm9uZGluZyBtYXN0ZXIuICBUaGlzIHdpbGwgaGVscCB0aGUgc3dpdGNoIGxlYXJuIG91ciBhZGRyZXNzCi0gKiBpZiBpbiBhY3RpdmUtYmFja3VwIG1vZGUuCi0gKgotICogQ2FsbGVyIG11c3QgaG9sZCBjdXJyX3NsYXZlX2xvY2sgZm9yIHJlYWQgb3IgYmV0dGVyCi0gKi8KLXZvaWQgYm9uZF9zZW5kX3Vuc29saWNpdGVkX25hKHN0cnVjdCBib25kaW5nICpib25kKQotewotCXN0cnVjdCBzbGF2ZSAqc2xhdmUgPSBib25kLT5jdXJyX2FjdGl2ZV9zbGF2ZTsKLQlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbjsKLQlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2OwotCWludCBpc19yb3V0ZXI7Ci0KLQlwcl9kZWJ1ZygiJXM6IGJvbmQgJXMgc2xhdmUgJXNcbiIsIGJvbmQtPmRldi0+bmFtZSwKLQkJIF9fZnVuY19fLCBzbGF2ZSA/IHNsYXZlLT5kZXYtPm5hbWUgOiAiTlVMTCIpOwotCi0JaWYgKCFzbGF2ZSB8fCAhYm9uZC0+c2VuZF91bnNvbF9uYSB8fAotCSAgICB0ZXN0X2JpdChfX0xJTktfU1RBVEVfTElOS1dBVENIX1BFTkRJTkcsICZzbGF2ZS0+ZGV2LT5zdGF0ZSkpCi0JCXJldHVybjsKLQotCWJvbmQtPnNlbmRfdW5zb2xfbmEtLTsKLQotCWlkZXYgPSBpbjZfZGV2X2dldChib25kLT5kZXYpOwotCWlmICghaWRldikKLQkJcmV0dXJuOwotCi0JaXNfcm91dGVyID0gISFpZGV2LT5jbmYuZm9yd2FyZGluZzsKLQotCWluNl9kZXZfcHV0KGlkZXYpOwotCi0JaWYgKCFpcHY2X2FkZHJfYW55KCZib25kLT5tYXN0ZXJfaXB2NikpCi0JCWJvbmRfbmFfc2VuZChzbGF2ZS0+ZGV2LCAmYm9uZC0+bWFzdGVyX2lwdjYsIGlzX3JvdXRlciwgMCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgewotCQlpZiAoIWlwdjZfYWRkcl9hbnkoJnZsYW4tPnZsYW5faXB2NikpIHsKLQkJCWJvbmRfbmFfc2VuZChzbGF2ZS0+ZGV2LCAmdmxhbi0+dmxhbl9pcHY2LCBpc19yb3V0ZXIsCi0JCQkJICAgICB2bGFuLT52bGFuX2lkKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIGJvbmRfaW5ldDZhZGRyX2V2ZW50OiBoYW5kbGUgaW5ldDZhZGRyIG5vdGlmaWVyIGNoYWluIGV2ZW50cy4KLSAqCi0gKiBXZSBrZWVwIHRyYWNrIG9mIGRldmljZSBJUHY2IGFkZHJlc3NlcyBwcmltYXJpbHkgdG8gdXNlIGFzIHNvdXJjZQotICogYWRkcmVzc2VzIGluIE5TIHByb2Jlcy4KLSAqCi0gKiBXZSB0cmFjayBvbmUgSVB2NiBmb3IgdGhlIG1haW4gZGV2aWNlIChpZiBpdCBoYXMgb25lKS4KLSAqLwotc3RhdGljIGludCBib25kX2luZXQ2YWRkcl9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnRoaXMsCi0JCQkJdW5zaWduZWQgbG9uZyBldmVudCwKLQkJCQl2b2lkICpwdHIpCi17Ci0Jc3RydWN0IGluZXQ2X2lmYWRkciAqaWZhID0gcHRyOwotCXN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2RldiwgKmV2ZW50X2RldiA9IGlmYS0+aWRldi0+ZGV2OwotCXN0cnVjdCBib25kaW5nICpib25kOwotCXN0cnVjdCB2bGFuX2VudHJ5ICp2bGFuOwotCXN0cnVjdCBib25kX25ldCAqYm4gPSBuZXRfZ2VuZXJpYyhkZXZfbmV0KGV2ZW50X2RldiksIGJvbmRfbmV0X2lkKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoYm9uZCwgJmJuLT5kZXZfbGlzdCwgYm9uZF9saXN0KSB7Ci0JCWlmIChib25kLT5kZXYgPT0gZXZlbnRfZGV2KSB7Ci0JCQlzd2l0Y2ggKGV2ZW50KSB7Ci0JCQljYXNlIE5FVERFVl9VUDoKLQkJCQlpZiAoaXB2Nl9hZGRyX2FueSgmYm9uZC0+bWFzdGVyX2lwdjYpKQotCQkJCQlpcHY2X2FkZHJfY29weSgmYm9uZC0+bWFzdGVyX2lwdjYsCi0JCQkJCQkgICAgICAgJmlmYS0+YWRkcik7Ci0JCQkJcmV0dXJuIE5PVElGWV9PSzsKLQkJCWNhc2UgTkVUREVWX0RPV046Ci0JCQkJaWYgKGlwdjZfYWRkcl9lcXVhbCgmYm9uZC0+bWFzdGVyX2lwdjYsCi0JCQkJCQkgICAgJmlmYS0+YWRkcikpCi0JCQkJCWJvbmRfZ2xlYW5fZGV2X2lwdjYoYm9uZC0+ZGV2LAotCQkJCQkJCSAgICAmYm9uZC0+bWFzdGVyX2lwdjYpOwotCQkJCXJldHVybiBOT1RJRllfT0s7Ci0JCQlkZWZhdWx0OgotCQkJCXJldHVybiBOT1RJRllfRE9ORTsKLQkJCX0KLQkJfQotCi0JCWxpc3RfZm9yX2VhY2hfZW50cnkodmxhbiwgJmJvbmQtPnZsYW5fbGlzdCwgdmxhbl9saXN0KSB7Ci0JCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCQl2bGFuX2RldiA9IF9fdmxhbl9maW5kX2Rldl9kZWVwKGJvbmQtPmRldiwKLQkJCQkJCQl2bGFuLT52bGFuX2lkKTsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJaWYgKHZsYW5fZGV2ID09IGV2ZW50X2RldikgewotCQkJCXN3aXRjaCAoZXZlbnQpIHsKLQkJCQljYXNlIE5FVERFVl9VUDoKLQkJCQkJaWYgKGlwdjZfYWRkcl9hbnkoJnZsYW4tPnZsYW5faXB2NikpCi0JCQkJCQlpcHY2X2FkZHJfY29weSgmdmxhbi0+dmxhbl9pcHY2LAotCQkJCQkJCSAgICAgICAmaWZhLT5hZGRyKTsKLQkJCQkJcmV0dXJuIE5PVElGWV9PSzsKLQkJCQljYXNlIE5FVERFVl9ET1dOOgotCQkJCQlpZiAoaXB2Nl9hZGRyX2VxdWFsKCZ2bGFuLT52bGFuX2lwdjYsCi0JCQkJCQkJICAgICZpZmEtPmFkZHIpKQotCQkJCQkJYm9uZF9nbGVhbl9kZXZfaXB2Nih2bGFuX2RldiwKLQkJCQkJCQkJICAgICZ2bGFuLT52bGFuX2lwdjYpOwotCQkJCQlyZXR1cm4gTk9USUZZX09LOwotCQkJCWRlZmF1bHQ6Ci0JCQkJCXJldHVybiBOT1RJRllfRE9ORTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGJvbmRfaW5ldDZhZGRyX25vdGlmaWVyID0gewotCS5ub3RpZmllcl9jYWxsID0gYm9uZF9pbmV0NmFkZHJfZXZlbnQsCi19OwotCi12b2lkIGJvbmRfcmVnaXN0ZXJfaXB2Nl9ub3RpZmllcih2b2lkKQotewotCXJlZ2lzdGVyX2luZXQ2YWRkcl9ub3RpZmllcigmYm9uZF9pbmV0NmFkZHJfbm90aWZpZXIpOwotfQotCi12b2lkIGJvbmRfdW5yZWdpc3Rlcl9pcHY2X25vdGlmaWVyKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9pbmV0NmFkZHJfbm90aWZpZXIoJmJvbmRfaW5ldDZhZGRyX25vdGlmaWVyKTsKLX0KLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYyBiL2RyaXZlcnMvbmV0L2JvbmRpbmcvYm9uZF9tYWluLmMKaW5kZXggYjBjNTc3Mi4uNDM1OTg0YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvYm9uZGluZy9ib25kX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ib25kaW5nL2JvbmRfbWFpbi5jCkBAIC00MjgsMjcgKzQyOCwzNCBAQAogICogQGJvbmRfZGV2OiBib25kaW5nIG5ldCBkZXZpY2UgdGhhdCBnb3QgY2FsbGVkCiAgKiBAdmlkOiB2bGFuIGlkIGJlaW5nIGFkZGVkCiAgKi8KLXN0YXRpYyB2b2lkIGJvbmRfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpib25kX2RldiwgdWludDE2X3QgdmlkKQorc3RhdGljIGludCBib25kX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHVpbnQxNl90IHZpZCkKIHsKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IG5ldGRldl9wcml2KGJvbmRfZGV2KTsKLQlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOworCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpzdG9wX2F0OwogCWludCBpLCByZXM7CiAKIAlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYgPSBzbGF2ZS0+ZGV2OwotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnNsYXZlX29wcyA9IHNsYXZlX2Rldi0+bmV0ZGV2X29wczsKLQotCQlpZiAoKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKSAmJgotCQkgICAgc2xhdmVfb3BzLT5uZG9fdmxhbl9yeF9hZGRfdmlkKSB7Ci0JCQlzbGF2ZV9vcHMtPm5kb192bGFuX3J4X2FkZF92aWQoc2xhdmVfZGV2LCB2aWQpOwotCQl9CisJCXJlcyA9IHZsYW5fdmlkX2FkZChzbGF2ZS0+ZGV2LCB2aWQpOworCQlpZiAocmVzKQorCQkJZ290byB1bndpbmQ7CiAJfQogCiAJcmVzID0gYm9uZF9hZGRfdmxhbihib25kLCB2aWQpOwogCWlmIChyZXMpIHsKIAkJcHJfZXJyKCIlczogRXJyb3I6IEZhaWxlZCB0byBhZGQgdmxhbiBpZCAlZFxuIiwKIAkJICAgICAgIGJvbmRfZGV2LT5uYW1lLCB2aWQpOworCQlyZXR1cm4gcmVzOwogCX0KKworCXJldHVybiAwOworCit1bndpbmQ6CisJLyogdW53aW5kIGZyb20gaGVhZCB0byB0aGUgc2xhdmUgdGhhdCBmYWlsZWQgKi8KKwlzdG9wX2F0ID0gc2xhdmU7CisJYm9uZF9mb3JfZWFjaF9zbGF2ZV9mcm9tX3RvKGJvbmQsIHNsYXZlLCBpLCBib25kLT5maXJzdF9zbGF2ZSwgc3RvcF9hdCkKKwkJdmxhbl92aWRfZGVsKHNsYXZlLT5kZXYsIHZpZCk7CisKKwlyZXR1cm4gcmVzOwogfQogCiAvKioKQEAgLTQ1Niw1NiArNDYzLDQ4IEBACiAgKiBAYm9uZF9kZXY6IGJvbmRpbmcgbmV0IGRldmljZSB0aGF0IGdvdCBjYWxsZWQKICAqIEB2aWQ6IHZsYW4gaWQgYmVpbmcgcmVtb3ZlZAogICovCi1zdGF0aWMgdm9pZCBib25kX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmJvbmRfZGV2LCB1aW50MTZfdCB2aWQpCitzdGF0aWMgaW50IGJvbmRfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYsIHVpbnQxNl90IHZpZCkKIHsKIAlzdHJ1Y3QgYm9uZGluZyAqYm9uZCA9IG5ldGRldl9wcml2KGJvbmRfZGV2KTsKIAlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOwogCWludCBpLCByZXM7CiAKLQlib25kX2Zvcl9lYWNoX3NsYXZlKGJvbmQsIHNsYXZlLCBpKSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYgPSBzbGF2ZS0+ZGV2OwotCQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnNsYXZlX29wcyA9IHNsYXZlX2Rldi0+bmV0ZGV2X29wczsKLQotCQlpZiAoKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKSAmJgotCQkgICAgc2xhdmVfb3BzLT5uZG9fdmxhbl9yeF9raWxsX3ZpZCkgewotCQkJc2xhdmVfb3BzLT5uZG9fdmxhbl9yeF9raWxsX3ZpZChzbGF2ZV9kZXYsIHZpZCk7Ci0JCX0KLQl9CisJYm9uZF9mb3JfZWFjaF9zbGF2ZShib25kLCBzbGF2ZSwgaSkKKwkJdmxhbl92aWRfZGVsKHNsYXZlLT5kZXYsIHZpZCk7CiAKIAlyZXMgPSBib25kX2RlbF92bGFuKGJvbmQsIHZpZCk7CiAJaWYgKHJlcykgewogCQlwcl9lcnIoIiVzOiBFcnJvcjogRmFpbGVkIHRvIHJlbW92ZSB2bGFuIGlkICVkXG4iLAogCQkgICAgICAgYm9uZF9kZXYtPm5hbWUsIHZpZCk7CisJCXJldHVybiByZXM7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGJvbmRfYWRkX3ZsYW5zX29uX3NsYXZlKHN0cnVjdCBib25kaW5nICpib25kLCBzdHJ1Y3QgbmV0X2RldmljZSAqc2xhdmVfZGV2KQogewogCXN0cnVjdCB2bGFuX2VudHJ5ICp2bGFuOwotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqc2xhdmVfb3BzID0gc2xhdmVfZGV2LT5uZXRkZXZfb3BzOworCWludCByZXM7CiAKLQlpZiAoIShzbGF2ZV9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUikgfHwKLQkgICAgIShzbGF2ZV9vcHMtPm5kb192bGFuX3J4X2FkZF92aWQpKQotCQlyZXR1cm47Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkKLQkJc2xhdmVfb3BzLT5uZG9fdmxhbl9yeF9hZGRfdmlkKHNsYXZlX2Rldiwgdmxhbi0+dmxhbl9pZCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bGFuLCAmYm9uZC0+dmxhbl9saXN0LCB2bGFuX2xpc3QpIHsKKwkJcmVzID0gdmxhbl92aWRfYWRkKHNsYXZlX2Rldiwgdmxhbi0+dmxhbl9pZCk7CisJCWlmIChyZXMpCisJCQlwcl93YXJuaW5nKCIlczogRmFpbGVkIHRvIGFkZCB2bGFuIGlkICVkIHRvIGRldmljZSAlc1xuIiwKKwkJCQkgICBib25kLT5kZXYtPm5hbWUsIHZsYW4tPnZsYW5faWQsCisJCQkJICAgc2xhdmVfZGV2LT5uYW1lKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGJvbmRfZGVsX3ZsYW5zX2Zyb21fc2xhdmUoc3RydWN0IGJvbmRpbmcgKmJvbmQsCiAJCQkJICAgICAgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2RldikKIHsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKnNsYXZlX29wcyA9IHNsYXZlX2Rldi0+bmV0ZGV2X29wczsKIAlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbjsKIAotCWlmICghKHNsYXZlX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKSB8fAotCSAgICAhKHNsYXZlX29wcy0+bmRvX3ZsYW5fcnhfa2lsbF92aWQpKQotCQlyZXR1cm47Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZsYW4sICZib25kLT52bGFuX2xpc3QsIHZsYW5fbGlzdCkgewogCQlpZiAoIXZsYW4tPnZsYW5faWQpCiAJCQljb250aW51ZTsKLQkJc2xhdmVfb3BzLT5uZG9fdmxhbl9yeF9raWxsX3ZpZChzbGF2ZV9kZXYsIHZsYW4tPnZsYW5faWQpOworCQl2bGFuX3ZpZF9kZWwoc2xhdmVfZGV2LCB2bGFuLT52bGFuX2lkKTsKIAl9CiB9CiAKQEAgLTEzMjUsMTEgKzEzMjQsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUzMiBib25kX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgYm9uZF9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgc2xhdmUgKnNsYXZlOwogCXN0cnVjdCBib25kaW5nICpib25kID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MzIgbWFzazsKKwluZXRkZXZfZmVhdHVyZXNfdCBtYXNrOwogCWludCBpOwogCiAJcmVhZF9sb2NrKCZib25kLT5sb2NrKTsKQEAgLTEzNjMsNyArMTM2Myw3IEBACiB7CiAJc3RydWN0IHNsYXZlICpzbGF2ZTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqYm9uZF9kZXYgPSBib25kLT5kZXY7Ci0JdTMyIHZsYW5fZmVhdHVyZXMgPSBCT05EX1ZMQU5fRkVBVFVSRVM7CisJbmV0ZGV2X2ZlYXR1cmVzX3Qgdmxhbl9mZWF0dXJlcyA9IEJPTkRfVkxBTl9GRUFUVVJFUzsKIAl1bnNpZ25lZCBzaG9ydCBtYXhfaGFyZF9oZWFkZXJfbGVuID0gRVRIX0hMRU47CiAJaW50IGk7CiAKQEAgLTE4MjIsNyArMTgyMiw3IEBACiAJCQkJICJidXQgbmV3IHNsYXZlIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IG5ldHBvbGwuXG4iLAogCQkJCSBib25kX2Rldi0+bmFtZSk7CiAJCQlyZXMgPSAtRUJVU1k7Ci0JCQlnb3RvIGVycl9jbG9zZTsKKwkJCWdvdG8gZXJyX2RldGFjaDsKIAkJfQogCX0KICNlbmRpZgpAQCAtMTgzMSw3ICsxODMxLDcgQEAKIAogCXJlcyA9IGJvbmRfY3JlYXRlX3NsYXZlX3N5bWxpbmtzKGJvbmRfZGV2LCBzbGF2ZV9kZXYpOwogCWlmIChyZXMpCi0JCWdvdG8gZXJyX2Nsb3NlOworCQlnb3RvIGVycl9kZXRhY2g7CiAKIAlyZXMgPSBuZXRkZXZfcnhfaGFuZGxlcl9yZWdpc3RlcihzbGF2ZV9kZXYsIGJvbmRfaGFuZGxlX2ZyYW1lLAogCQkJCQkgbmV3X3NsYXZlKTsKQEAgLTE4NTIsNiArMTg1MiwxMSBAQAogZXJyX2Rlc3Rfc3ltbGlua3M6CiAJYm9uZF9kZXN0cm95X3NsYXZlX3N5bWxpbmtzKGJvbmRfZGV2LCBzbGF2ZV9kZXYpOwogCitlcnJfZGV0YWNoOgorCXdyaXRlX2xvY2tfYmgoJmJvbmQtPmxvY2spOworCWJvbmRfZGV0YWNoX3NsYXZlKGJvbmQsIG5ld19zbGF2ZSk7CisJd3JpdGVfdW5sb2NrX2JoKCZib25kLT5sb2NrKTsKKwogZXJyX2Nsb3NlOgogCWRldl9jbG9zZShzbGF2ZV9kZXYpOwogCkBAIC0xODk3LDcgKzE5MDIsNyBAQAogCXN0cnVjdCBib25kaW5nICpib25kID0gbmV0ZGV2X3ByaXYoYm9uZF9kZXYpOwogCXN0cnVjdCBzbGF2ZSAqc2xhdmUsICpvbGRjdXJyZW50OwogCXN0cnVjdCBzb2NrYWRkciBhZGRyOwotCXUzMiBvbGRfZmVhdHVyZXMgPSBib25kX2Rldi0+ZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3Qgb2xkX2ZlYXR1cmVzID0gYm9uZF9kZXYtPmZlYXR1cmVzOwogCiAJLyogc2xhdmUgaXMgbm90IGEgc2xhdmUgb3IgbWFzdGVyIGlzIG5vdCBtYXN0ZXIgb2YgdGhpcyBzbGF2ZSAqLwogCWlmICghKHNsYXZlX2Rldi0+ZmxhZ3MgJiBJRkZfU0xBVkUpIHx8CkBAIC0yNTUzLDMwICsyNTU4LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBfX2JlMzIgYm9uZF9nbGVhbl9kZXZfaXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlzdHJ1Y3QgaW5fZGV2aWNlICppZGV2OwotCXN0cnVjdCBpbl9pZmFkZHIgKmlmYTsKLQlfX2JlMzIgYWRkciA9IDA7Ci0KLQlpZiAoIWRldikKLQkJcmV0dXJuIDA7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JaWRldiA9IF9faW5fZGV2X2dldF9yY3UoZGV2KTsKLQlpZiAoIWlkZXYpCi0JCWdvdG8gb3V0OwotCi0JaWZhID0gaWRldi0+aWZhX2xpc3Q7Ci0JaWYgKCFpZmEpCi0JCWdvdG8gb3V0OwotCi0JYWRkciA9IGlmYS0+aWZhX2xvY2FsOwotb3V0OgotCXJjdV9yZWFkX3VubG9jaygpOwotCXJldHVybiBhZGRyOwotfQotCiBzdGF0aWMgaW50IGJvbmRfaGFzX3RoaXNfaXAoc3RydWN0IGJvbmRpbmcgKmJvbmQsIF9fYmUzMiBpcCkKIHsKIAlzdHJ1Y3Qgdmxhbl9lbnRyeSAqdmxhbjsKQEAgLTMzMjIsNiArMzMwMywxMCBAQAogCXN0cnVjdCBib25kaW5nICpib25kOwogCXN0cnVjdCB2bGFuX2VudHJ5ICp2bGFuOwogCisJLyogd2Ugb25seSBjYXJlIGFib3V0IHByaW1hcnkgYWRkcmVzcyAqLworCWlmKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfU0VDT05EQVJZKQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGJvbmQsICZibi0+ZGV2X2xpc3QsIGJvbmRfbGlzdCkgewogCQlpZiAoYm9uZC0+ZGV2ID09IGV2ZW50X2RldikgewogCQkJc3dpdGNoIChldmVudCkgewpAQCAtMzMyOSw3ICszMzE0LDcgQEAKIAkJCQlib25kLT5tYXN0ZXJfaXAgPSBpZmEtPmlmYV9sb2NhbDsKIAkJCQlyZXR1cm4gTk9USUZZX09LOwogCQkJY2FzZSBORVRERVZfRE9XTjoKLQkJCQlib25kLT5tYXN0ZXJfaXAgPSBib25kX2dsZWFuX2Rldl9pcChib25kLT5kZXYpOworCQkJCWJvbmQtPm1hc3Rlcl9pcCA9IDA7CiAJCQkJcmV0dXJuIE5PVElGWV9PSzsKIAkJCWRlZmF1bHQ6CiAJCQkJcmV0dXJuIE5PVElGWV9ET05FOwpAQCAtMzM0NSw4ICszMzMwLDcgQEAKIAkJCQkJdmxhbi0+dmxhbl9pcCA9IGlmYS0+aWZhX2xvY2FsOwogCQkJCQlyZXR1cm4gTk9USUZZX09LOwogCQkJCWNhc2UgTkVUREVWX0RPV046Ci0JCQkJCXZsYW4tPnZsYW5faXAgPQotCQkJCQkJYm9uZF9nbGVhbl9kZXZfaXAodmxhbl9kZXYpOworCQkJCQl2bGFuLT52bGFuX2lwID0gMDsKIAkJCQkJcmV0dXJuIE5PVElGWV9PSzsKIAkJCQlkZWZhdWx0OgogCQkJCQlyZXR1cm4gTk9USUZZX0RPTkU7CkBAIC00MzYwLDcgKzQzNDQsNyBAQAogCQkJCU5FVElGX0ZfSFdfVkxBTl9SWCB8CiAJCQkJTkVUSUZfRl9IV19WTEFOX0ZJTFRFUjsKIAotCWJvbmRfZGV2LT5od19mZWF0dXJlcyAmPSB+KE5FVElGX0ZfQUxMX0NTVU0gJiB+TkVUSUZfRl9OT19DU1VNKTsKKwlib25kX2Rldi0+aHdfZmVhdHVyZXMgJj0gfihORVRJRl9GX0FMTF9DU1VNICYgfk5FVElGX0ZfSFdfQ1NVTSk7CiAJYm9uZF9kZXYtPmZlYXR1cmVzIHw9IGJvbmRfZGV2LT5od19mZWF0dXJlczsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX2hzaS5jIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX2hzaS5jCmluZGV4IDA3MzM1MjUuLjBhNGZjNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9oc2kuYworKysgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfaHNpLmMKQEAgLTExNywxNSArMTE3LDYgQEAKIAlkZXZfZGJnKCZjZmhzaS0+bmRldi0+ZGV2LCAiJXMuXG4iLAogCQlfX2Z1bmNfXyk7CiAKLQotCXJldCA9IGNmaHNpLT5kZXYtPmNmaHNpX3dha2VfdXAoY2Zoc2ktPmRldik7Ci0JaWYgKHJldCkgewotCQlkZXZfd2FybigmY2Zoc2ktPm5kZXYtPmRldiwKLQkJCSIlczogY2FuJ3Qgd2FrZSB1cCBIU0kgaW50ZXJmYWNlOiAlZC5cbiIsCi0JCQlfX2Z1bmNfXywgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KIAlkbyB7CiAJCXJldCA9IGNmaHNpLT5kZXYtPmNmaHNpX2ZpZm9fb2NjdXBhbmN5KGNmaHNpLT5kZXYsCiAJCQkJJmZpZm9fb2NjdXBhbmN5KTsKQEAgLTE2OCw4ICsxNTksNiBAQAogCQl9CiAJfSB3aGlsZSAoMSk7CiAKLQljZmhzaS0+ZGV2LT5jZmhzaV93YWtlX2Rvd24oY2Zoc2ktPmRldik7Ci0KIAlyZXR1cm4gcmV0OwogfQogCkBAIC05NDQsNyArOTMzLDcgQEAKIAogCQkvKiBDcmVhdGUgSFNJIGZyYW1lLiAqLwogCQlsZW4gPSBjZmhzaV90eF9mcm0oZGVzYywgY2Zoc2kpOwotCQlCVUdfT04oIWxlbik7CisJCVdBUk5fT04oIWxlbik7CiAKIAkJLyogU2V0IHVwIG5ldyB0cmFuc2Zlci4gKi8KIAkJcmVzID0gY2Zoc2ktPmRldi0+Y2Zoc2lfdHgoY2Zoc2ktPnR4X2J1ZiwgbGVuLCBjZmhzaS0+ZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zZXJpYWwuYyBiL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zZXJpYWwuYwppbmRleCAyMzQwNmU2Li44YTMwNTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2VyaWFsLmMKKysrIGIvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NlcmlhbC5jCkBAIC0zOCwxNSArMzgsMTUgQEAKIC8qVGhpcyBsaXN0IGlzIHByb3RlY3RlZCBieSB0aGUgcnRubCBsb2NrLiAqLwogc3RhdGljIExJU1RfSEVBRChzZXJfbGlzdCk7CiAKLXN0YXRpYyBpbnQgc2VyX2xvb3A7CitzdGF0aWMgYm9vbCBzZXJfbG9vcDsKIG1vZHVsZV9wYXJhbShzZXJfbG9vcCwgYm9vbCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHNlcl9sb29wLCAiUnVuIGluIHNpbXVsYXRlZCBsb29wYmFjayBtb2RlLiIpOwogCi1zdGF0aWMgaW50IHNlcl91c2Vfc3R4ID0gMTsKK3N0YXRpYyBib29sIHNlcl91c2Vfc3R4ID0gdHJ1ZTsKIG1vZHVsZV9wYXJhbShzZXJfdXNlX3N0eCwgYm9vbCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKHNlcl91c2Vfc3R4LCAiU1RYIGVuYWJsZWQgb3Igbm90LiIpOwogCi1zdGF0aWMgaW50IHNlcl91c2VfZmNzID0gMTsKK3N0YXRpYyBib29sIHNlcl91c2VfZmNzID0gdHJ1ZTsKIAogbW9kdWxlX3BhcmFtKHNlcl91c2VfZmNzLCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Moc2VyX3VzZV9mY3MsICJGQ1MgZW5hYmxlZCBvciBub3QuIik7CkBAIC0yNjEsNyArMjYxLDcgQEAKIAkJc2tiX3B1bGwoc2tiLCB0dHlfd3IpOwogCQlpZiAoc2tiLT5sZW4gPT0gMCkgewogCQkJc3RydWN0IHNrX2J1ZmYgKnRtcCA9IHNrYl9kZXF1ZXVlKCZzZXItPmhlYWQpOwotCQkJQlVHX09OKHRtcCAhPSBza2IpOworCQkJV0FSTl9PTih0bXAgIT0gc2tiKTsKIAkJCWlmIChpbl9pbnRlcnJ1cHQoKSkKIAkJCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogCQkJZWxzZQpAQCAtMzA1LDcgKzMwNSw3IEBACiAKIAlzZXIgPSB0dHktPmRpc2NfZGF0YTsKIAlCVUdfT04oc2VyID09IE5VTEwpOwotCUJVR19PTihzZXItPnR0eSAhPSB0dHkpOworCVdBUk5fT04oc2VyLT50dHkgIT0gdHR5KTsKIAloYW5kbGVfdHgoc2VyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NobWNvcmUuYyBiL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zaG1jb3JlLmMKaW5kZXggZDRiMjZmYi4uNWIyMDQxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NobWNvcmUuYworKysgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc2htY29yZS5jCkBAIC0yMzgsMTEgKzIzOCwxMSBAQAogCQlpZiAoKGF2YWlsX2VtcHR5YnVmZiA+IEhJR0hfV0FURVJNQVJLKSAmJgogCQkJCQkoIXBzaG1fZHJ2LT50eF9lbXB0eV9hdmFpbGFibGUpKSB7CiAJCQlwc2htX2Rydi0+dHhfZW1wdHlfYXZhaWxhYmxlID0gMTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaG1fZHJ2LT5sb2NrLCBmbGFncyk7CiAJCQlwc2htX2Rydi0+Y2ZkZXYuZmxvd2N0cmwKIAkJCQkJKHBzaG1fZHJ2LT5wc2htX2Rldi0+cHNobV9uZXRkZXYsCiAJCQkJCQkJCUNBSUZfRkxPV19PTik7CiAKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaG1fZHJ2LT5sb2NrLCBmbGFncyk7CiAKIAkJCS8qIFNjaGVkdWxlIHRoZSB3b3JrIHF1ZXVlLiBpZiByZXF1aXJlZCAqLwogCQkJaWYgKCF3b3JrX3BlbmRpbmcoJnBzaG1fZHJ2LT5zaG1fdHhfd29yaykpCkBAIC0yODUsNiArMjg1LDcgQEAKIAkJCWxpc3RfZW50cnkocHNobV9kcnYtPnJ4X2Z1bGxfbGlzdC5uZXh0LCBzdHJ1Y3QgYnVmX2xpc3QsCiAJCQkJCWxpc3QpOwogCQlsaXN0X2RlbF9pbml0KCZwYnVmLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHNobV9kcnYtPmxvY2ssIGZsYWdzKTsKIAogCQkvKiBSZXRyaWV2ZSBwb2ludGVyIHRvIHN0YXJ0IG9mIHRoZSBwYWNrZXQgZGVzY3JpcHRvciBhcmVhLiAqLwogCQlwY2tfZGVzYyA9IChzdHJ1Y3Qgc2htX3Bja19kZXNjICopIHBidWYtPmRlc2NfdnB0cjsKQEAgLTMzNiw3ICszMzcsMTEgQEAKIAkJCS8qIEdldCBhIHN1aXRhYmxlIENBSUYgcGFja2V0IGFuZCBjb3B5IGluIGRhdGEuICovCiAJCQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHBzaG1fZHJ2LT5wc2htX2Rldi0+cHNobV9uZXRkZXYsCiAJCQkJCQkJZnJtX3Bja19sZW4gKyAxKTsKLQkJCUJVR19PTihza2IgPT0gTlVMTCk7CisKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXByX2luZm8oIk9PTTogVHJ5IG5leHQgZnJhbWUgaW4gZGVzY3JpcHRvclxuIik7CisJCQkJYnJlYWs7CisJCQl9CiAKIAkJCXAgPSBza2JfcHV0KHNrYiwgZnJtX3Bja19sZW4pOwogCQkJbWVtY3B5KHAsIHBidWYtPmRlc2NfdnB0ciArIGZybV9wY2tfb2ZzLCBmcm1fcGNrX2xlbik7CkBAIC0zNjAsNiArMzY1LDcgQEAKIAkJCXBja19kZXNjKys7CiAJCX0KIAorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHNobV9kcnYtPmxvY2ssIGZsYWdzKTsKIAkJbGlzdF9hZGRfdGFpbCgmcGJ1Zi0+bGlzdCwgJnBzaG1fZHJ2LT5yeF9wZW5kX2xpc3QpOwogCiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaG1fZHJ2LT5sb2NrLCBmbGFncyk7CkBAIC00MTIsNyArNDE4LDYgQEAKIAogCQlpZiAoc2tiID09IE5VTEwpCiAJCQlnb3RvIHNlbmRfbXNnOwotCiAJCS8qIENoZWNrIHRoZSBhdmFpbGFibGUgbm8uIG9mIGJ1ZmZlcnMgaW4gdGhlIGVtcHR5IGxpc3QgKi8KIAkJbGlzdF9mb3JfZWFjaChwb3MsICZwc2htX2Rydi0+dHhfZW1wdHlfbGlzdCkKIAkJCWF2YWlsX2VtcHR5YnVmZisrOwpAQCAtNDIxLDkgKzQyNiwxMSBAQAogCQkJCQlwc2htX2Rydi0+dHhfZW1wdHlfYXZhaWxhYmxlKSB7CiAJCQkvKiBVcGRhdGUgYmxvY2tpbmcgY29uZGl0aW9uLiAqLwogCQkJcHNobV9kcnYtPnR4X2VtcHR5X2F2YWlsYWJsZSA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwc2htX2Rydi0+bG9jaywgZmxhZ3MpOwogCQkJcHNobV9kcnYtPmNmZGV2LmZsb3djdHJsCiAJCQkJCShwc2htX2Rydi0+cHNobV9kZXYtPnBzaG1fbmV0ZGV2LAogCQkJCQlDQUlGX0ZMT1dfT0ZGKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZwc2htX2Rydi0+bG9jaywgZmxhZ3MpOwogCQl9CiAJCS8qCiAJCSAqIFdlIHNpbXBseSByZXR1cm4gYmFjayB0byB0aGUgY2FsbGVyIGlmIHdlIGRvIG5vdCBoYXZlIHNwYWNlCkBAIC00NjksNiArNDc2LDggQEAKIAkJCX0KIAogCQkJc2tiID0gc2tiX2RlcXVldWUoJnBzaG1fZHJ2LT5za19xaGVhZCk7CisJCQlpZiAoc2tiID09IE5VTEwpCisJCQkJYnJlYWs7CiAJCQkvKiBDb3B5IGluIENBSUYgZnJhbWUuICovCiAJCQlza2JfY29weV9iaXRzKHNrYiwgMCwgcGJ1Zi0+ZGVzY192cHRyICsKIAkJCQkJcGJ1Zi0+ZnJtX29mcyArIFNITV9IRFJfTEVOICsKQEAgLTQ3Nyw3ICs0ODYsNyBAQAogCQkJcHNobV9kcnYtPnBzaG1fZGV2LT5wc2htX25ldGRldi0+c3RhdHMudHhfcGFja2V0cysrOwogCQkJcHNobV9kcnYtPnBzaG1fZGV2LT5wc2htX25ldGRldi0+c3RhdHMudHhfYnl0ZXMgKz0KIAkJCQkJCQkJCWZybWxlbjsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAKIAkJCS8qIEZpbGwgaW4gdGhlIHNoYXJlZCBtZW1vcnkgcGFja2V0IGRlc2NyaXB0b3IgYXJlYS4gKi8KIAkJCXBja19kZXNjID0gKHN0cnVjdCBzaG1fcGNrX2Rlc2MgKikgKHBidWYtPmRlc2NfdnB0cik7CkBAIC01MTIsMTYgKzUyMSwxMSBAQAogc3RhdGljIGludCBzaG1fbmV0ZGV2X3R4KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpzaG1fbmV0ZGV2KQogewogCXN0cnVjdCBzaG1kcnZfbGF5ZXIgKnBzaG1fZHJ2OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwogCiAJcHNobV9kcnYgPSBuZXRkZXZfcHJpdihzaG1fbmV0ZGV2KTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwc2htX2Rydi0+bG9jaywgZmxhZ3MpOwotCiAJc2tiX3F1ZXVlX3RhaWwoJnBzaG1fZHJ2LT5za19xaGVhZCwgc2tiKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBzaG1fZHJ2LT5sb2NrLCBmbGFncyk7Ci0KIAkvKiBTY2hlZHVsZSBUeCB3b3JrIHF1ZXVlLiBmb3IgZGVmZXJyZWQgcHJvY2Vzc2luZyBvZiBza2JzKi8KIAlpZiAoIXdvcmtfcGVuZGluZygmcHNobV9kcnYtPnNobV90eF93b3JrKSkKIAkJcXVldWVfd29yayhwc2htX2Rydi0+cHNobV90eF93b3JrcXVldWUsICZwc2htX2Rydi0+c2htX3R4X3dvcmspOwpAQCAtNjA2LDYgKzYxMCw3IEBACiAJCXBzaG1fZHJ2LT5zaG1fcnhfYWRkciA9IHBzaG1fZGV2LT5zaG1fYmFzZV9hZGRyICsKIAkJCQkJCShOUl9UWF9CVUYgKiBUWF9CVUZfU1opOwogCisJc3Bpbl9sb2NrX2luaXQoJnBzaG1fZHJ2LT5sb2NrKTsKIAlJTklUX0xJU1RfSEVBRCgmcHNobV9kcnYtPnR4X2VtcHR5X2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZwc2htX2Rydi0+dHhfcGVuZF9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmcHNobV9kcnYtPnR4X2Z1bGxfbGlzdCk7CkBAIC02NDAsNyArNjQ1LDcgQEAKIAkJdHhfYnVmLT5mcm1fb2ZzID0gU0hNX0NBSUZfRlJNX09GUzsKIAogCQlpZiAocHNobV9kZXYtPnNobV9sb29wYmFjaykKLQkJCXR4X2J1Zi0+ZGVzY192cHRyID0gKGNoYXIgKil0eF9idWYtPnBoeV9hZGRyOworCQkJdHhfYnVmLT5kZXNjX3ZwdHIgPSAodW5zaWduZWQgY2hhciAqKXR4X2J1Zi0+cGh5X2FkZHI7CiAJCWVsc2UKIAkJCXR4X2J1Zi0+ZGVzY192cHRyID0KIAkJCQkJaW9yZW1hcCh0eF9idWYtPnBoeV9hZGRyLCBUWF9CVUZfU1opOwpAQCAtNjY0LDcgKzY2OSw3IEBACiAJCXJ4X2J1Zi0+bGVuID0gUlhfQlVGX1NaOwogCiAJCWlmIChwc2htX2Rldi0+c2htX2xvb3BiYWNrKQotCQkJcnhfYnVmLT5kZXNjX3ZwdHIgPSAoY2hhciAqKXJ4X2J1Zi0+cGh5X2FkZHI7CisJCQlyeF9idWYtPmRlc2NfdnB0ciA9ICh1bnNpZ25lZCBjaGFyICopcnhfYnVmLT5waHlfYWRkcjsKIAkJZWxzZQogCQkJcnhfYnVmLT5kZXNjX3ZwdHIgPQogCQkJCQlpb3JlbWFwKHJ4X2J1Zi0+cGh5X2FkZHIsIFJYX0JVRl9TWik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc3BpLmMgYi9kcml2ZXJzL25ldC9jYWlmL2NhaWZfc3BpLmMKaW5kZXggMDVlNzkxZi4uOTYzOTFjMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FpZi9jYWlmX3NwaS5jCisrKyBiL2RyaXZlcnMvbmV0L2NhaWYvY2FpZl9zcGkuYwpAQCAtMzUsNyArMzUsNyBAQAogLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZXMgZm9yIGFsaWdubWVudC4gKi8KICNkZWZpbmUgUEFEX1BPVzIoeCwgcG93KSAoKCgoeCkmKChwb3cpLTEpKT09MCkgPyAwIDogKCgocG93KS0oKHgpJigocG93KS0xKSkpKSkKIAotc3RhdGljIGludCBzcGlfbG9vcDsKK3N0YXRpYyBib29sIHNwaV9sb29wOwogbW9kdWxlX3BhcmFtKHNwaV9sb29wLCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Moc3BpX2xvb3AsICJTUEkgcnVubmluZyBpbiBsb29wYmFjayBtb2RlLiIpOwogCkBAIC0yMjYsNyArMjI2LDcgQEAKIAkJCSJUeCBkYXRhIChMZW46ICVkKTpcbiIsIGNmc3BpLT50eF9jcGNrX2xlbik7CiAKIAlsZW4gKz0gcHJpbnRfZnJhbWUoKGJ1ZiArIGxlbiksIChERUJVR0ZTX0JVRl9TSVpFIC0gbGVuKSwKLQkJCSAgIGNmc3BpLT54ZmVyLnZhX3R4LAorCQkJICAgY2ZzcGktPnhmZXIudmFfdHhbMF0sCiAJCQkgICAoY2ZzcGktPnR4X2NwY2tfbGVuICsgU1BJX0NNRF9TWiksIDEwMCk7CiAKIAlsZW4gKz0gc25wcmludGYoKGJ1ZiArIGxlbiksIChERUJVR0ZTX0JVRl9TSVpFIC0gbGVuKSwKQEAgLTU5OSw0OCArNTk5LDExIEBACiAJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCXJldHVybiAwOwogfQotc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjZnNwaV9vcHMgPSB7Ci0JLm5kb19vcGVuID0gY2ZzcGlfb3BlbiwKLQkubmRvX3N0b3AgPSBjZnNwaV9jbG9zZSwKLQkubmRvX3N0YXJ0X3htaXQgPSBjZnNwaV94bWl0Ci19OwogCi1zdGF0aWMgdm9pZCBjZnNwaV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGludCBjZnNwaV9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CisJaW50IHJlcyA9IDA7CiAJc3RydWN0IGNmc3BpICpjZnNwaSA9IG5ldGRldl9wcml2KGRldik7Ci0JZGV2LT5mZWF0dXJlcyA9IDA7Ci0JZGV2LT5uZXRkZXZfb3BzID0gJmNmc3BpX29wczsKLQlkZXYtPnR5cGUgPSBBUlBIUkRfQ0FJRjsKLQlkZXYtPmZsYWdzID0gSUZGX05PQVJQIHwgSUZGX1BPSU5UT1BPSU5UOwotCWRldi0+dHhfcXVldWVfbGVuID0gMDsKLQlkZXYtPm10dSA9IFNQSV9NQVhfUEFZTE9BRF9TSVpFOwotCWRldi0+ZGVzdHJ1Y3RvciA9IGZyZWVfbmV0ZGV2OwotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNmc3BpLT5xaGVhZCk7Ci0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY2ZzcGktPmNoZWFkKTsKLQljZnNwaS0+Y2ZkZXYubGlua19zZWxlY3QgPSBDQUlGX0xJTktfSElHSF9CQU5EVzsKLQljZnNwaS0+Y2ZkZXYudXNlX2ZyYWcgPSBmYWxzZTsKLQljZnNwaS0+Y2ZkZXYudXNlX3N0eCA9IGZhbHNlOwotCWNmc3BpLT5jZmRldi51c2VfZmNzID0gZmFsc2U7Ci0JY2ZzcGktPm5kZXYgPSBkZXY7Ci19Ci0KLWludCBjZnNwaV9zcGlfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKLXsKLQlzdHJ1Y3QgY2ZzcGkgKmNmc3BpID0gTlVMTDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKLQlzdHJ1Y3QgY2ZzcGlfZGV2ICpkZXY7Ci0JaW50IHJlczsKLQlkZXYgPSAoc3RydWN0IGNmc3BpX2RldiAqKXBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotCi0JbmRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGNmc3BpKSwKLQkJCSJjZnNwaSVkIiwgY2ZzcGlfc2V0dXApOwotCWlmICghbmRldikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljZnNwaSA9IG5ldGRldl9wcml2KG5kZXYpOwotCW5ldGlmX3N0b3BfcXVldWUobmRldik7Ci0JY2ZzcGktPm5kZXYgPSBuZGV2OwotCWNmc3BpLT5wZGV2ID0gcGRldjsKIAogCS8qIFNldCBmbG93IGluZm8uICovCiAJY2ZzcGktPmZsb3dfb2ZmX3NlbnQgPSAwOwpAQCAtNjU2LDE2ICs2MTksMTEgQEAKIAkJY2ZzcGktPnNsYXZlX3RhbGtlZCA9IGZhbHNlOwogCX0KIAotCS8qIEFzc2lnbiB0aGUgU1BJIGRldmljZS4gKi8KLQljZnNwaS0+ZGV2ID0gZGV2OwotCS8qIEFzc2lnbiB0aGUgZGV2aWNlIGlmYyB0byB0aGlzIFNQSSBpbnRlcmZhY2UuICovCi0JZGV2LT5pZmMgPSAmY2ZzcGktPmlmYzsKLQogCS8qIEFsbG9jYXRlIERNQSBidWZmZXJzLiAqLwotCWNmc3BpLT54ZmVyLnZhX3R4ID0gZG1hX2FsbG9jKCZjZnNwaS0+eGZlci5wYV90eCk7Ci0JaWYgKCFjZnNwaS0+eGZlci52YV90eCkgeworCWNmc3BpLT54ZmVyLnZhX3R4WzBdID0gZG1hX2FsbG9jKCZjZnNwaS0+eGZlci5wYV90eFswXSk7CisJaWYgKCFjZnNwaS0+eGZlci52YV90eFswXSkgewogCQlyZXMgPSAtRU5PREVWOwotCQlnb3RvIGVycl9kbWFfYWxsb2NfdHg7CisJCWdvdG8gZXJyX2RtYV9hbGxvY190eF8wOwogCX0KIAogCWNmc3BpLT54ZmVyLnZhX3J4ID0gZG1hX2FsbG9jKCZjZnNwaS0+eGZlci5wYV9yeCk7CkBAIC03MTQsNiArNjcyLDg3IEBACiAJLyogU2NoZWR1bGUgdGhlIHdvcmsgcXVldWUuICovCiAJcXVldWVfd29yayhjZnNwaS0+d3EsICZjZnNwaS0+d29yayk7CiAKKwlyZXR1cm4gMDsKKworIGVycl9jcmVhdGVfd3E6CisJZG1hX2ZyZWUoY2ZzcGktPnhmZXIudmFfcngsIGNmc3BpLT54ZmVyLnBhX3J4KTsKKyBlcnJfZG1hX2FsbG9jX3J4OgorCWRtYV9mcmVlKGNmc3BpLT54ZmVyLnZhX3R4WzBdLCBjZnNwaS0+eGZlci5wYV90eFswXSk7CisgZXJyX2RtYV9hbGxvY190eF8wOgorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGNmc3BpX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjZnNwaSAqY2ZzcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCisJLyogUmVtb3ZlIGZyb20gbGlzdC4gKi8KKwlzcGluX2xvY2soJmNmc3BpX2xpc3RfbG9jayk7CisJbGlzdF9kZWwoJmNmc3BpLT5saXN0KTsKKwlzcGluX3VubG9jaygmY2ZzcGlfbGlzdF9sb2NrKTsKKworCWNmc3BpLT5uZGV2ID0gTlVMTDsKKwkvKiBGcmVlIERNQSBidWZmZXJzLiAqLworCWRtYV9mcmVlKGNmc3BpLT54ZmVyLnZhX3J4LCBjZnNwaS0+eGZlci5wYV9yeCk7CisJZG1hX2ZyZWUoY2ZzcGktPnhmZXIudmFfdHhbMF0sIGNmc3BpLT54ZmVyLnBhX3R4WzBdKTsKKwlzZXRfYml0KFNQSV9URVJNSU5BVEUsICZjZnNwaS0+c3RhdGUpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2ZzcGktPndhaXQpOworCWRlc3Ryb3lfd29ya3F1ZXVlKGNmc3BpLT53cSk7CisJLyogRGVzdHJveSBkZWJ1Z2ZzIGRpcmVjdG9yeSBhbmQgZmlsZXMuICovCisJZGV2X2RlYnVnZnNfcmVtKGNmc3BpKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgY2ZzcGlfb3BzID0geworCS5uZG9fb3BlbiA9IGNmc3BpX29wZW4sCisJLm5kb19zdG9wID0gY2ZzcGlfY2xvc2UsCisJLm5kb19pbml0ID0gY2ZzcGlfaW5pdCwKKwkubmRvX3VuaW5pdCA9IGNmc3BpX3VuaW5pdCwKKwkubmRvX3N0YXJ0X3htaXQgPSBjZnNwaV94bWl0Cit9OworCitzdGF0aWMgdm9pZCBjZnNwaV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjZnNwaSAqY2ZzcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCWRldi0+ZmVhdHVyZXMgPSAwOworCWRldi0+bmV0ZGV2X29wcyA9ICZjZnNwaV9vcHM7CisJZGV2LT50eXBlID0gQVJQSFJEX0NBSUY7CisJZGV2LT5mbGFncyA9IElGRl9OT0FSUCB8IElGRl9QT0lOVE9QT0lOVDsKKwlkZXYtPnR4X3F1ZXVlX2xlbiA9IDA7CisJZGV2LT5tdHUgPSBTUElfTUFYX1BBWUxPQURfU0laRTsKKwlkZXYtPmRlc3RydWN0b3IgPSBmcmVlX25ldGRldjsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZjZnNwaS0+cWhlYWQpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNmc3BpLT5jaGVhZCk7CisJY2ZzcGktPmNmZGV2Lmxpbmtfc2VsZWN0ID0gQ0FJRl9MSU5LX0hJR0hfQkFORFc7CisJY2ZzcGktPmNmZGV2LnVzZV9mcmFnID0gZmFsc2U7CisJY2ZzcGktPmNmZGV2LnVzZV9zdHggPSBmYWxzZTsKKwljZnNwaS0+Y2ZkZXYudXNlX2ZjcyA9IGZhbHNlOworCWNmc3BpLT5uZGV2ID0gZGV2OworfQorCitpbnQgY2ZzcGlfc3BpX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGNmc3BpICpjZnNwaSA9IE5VTEw7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IGNmc3BpX2RldiAqZGV2OworCWludCByZXM7CisJZGV2ID0gKHN0cnVjdCBjZnNwaV9kZXYgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKworCW5kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBjZnNwaSksCisJCQkiY2ZzcGklZCIsIGNmc3BpX3NldHVwKTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljZnNwaSA9IG5ldGRldl9wcml2KG5kZXYpOworCW5ldGlmX3N0b3BfcXVldWUobmRldik7CisJY2ZzcGktPm5kZXYgPSBuZGV2OworCWNmc3BpLT5wZGV2ID0gcGRldjsKKworCS8qIEFzc2lnbiB0aGUgU1BJIGRldmljZS4gKi8KKwljZnNwaS0+ZGV2ID0gZGV2OworCS8qIEFzc2lnbiB0aGUgZGV2aWNlIGlmYyB0byB0aGlzIFNQSSBpbnRlcmZhY2UuICovCisJZGV2LT5pZmMgPSAmY2ZzcGktPmlmYzsKKwogCS8qIFJlZ2lzdGVyIG5ldHdvcmsgZGV2aWNlLiAqLwogCXJlcyA9IHJlZ2lzdGVyX25ldGRldihuZGV2KTsKIAlpZiAocmVzKSB7CkBAIC03MjMsMTUgKzc2Miw2IEBACiAJcmV0dXJuIHJlczsKIAogIGVycl9uZXRfcmVnOgotCWRldl9kZWJ1Z2ZzX3JlbShjZnNwaSk7Ci0Jc2V0X2JpdChTUElfVEVSTUlOQVRFLCAmY2ZzcGktPnN0YXRlKTsKLQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmNmc3BpLT53YWl0KTsKLQlkZXN0cm95X3dvcmtxdWV1ZShjZnNwaS0+d3EpOwotIGVycl9jcmVhdGVfd3E6Ci0JZG1hX2ZyZWUoY2ZzcGktPnhmZXIudmFfcngsIGNmc3BpLT54ZmVyLnBhX3J4KTsKLSBlcnJfZG1hX2FsbG9jX3J4OgotCWRtYV9mcmVlKGNmc3BpLT54ZmVyLnZhX3R4LCBjZnNwaS0+eGZlci5wYV90eCk7Ci0gZXJyX2RtYV9hbGxvY190eDoKIAlmcmVlX25ldGRldihuZGV2KTsKIAogCXJldHVybiByZXM7CkBAIC03MzksMzQgKzc2OSw4IEBACiAKIGludCBjZnNwaV9zcGlfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqbGlzdF9ub2RlOwotCXN0cnVjdCBsaXN0X2hlYWQgKm47Ci0Jc3RydWN0IGNmc3BpICpjZnNwaSA9IE5VTEw7Ci0Jc3RydWN0IGNmc3BpX2RldiAqZGV2OwotCi0JZGV2ID0gKHN0cnVjdCBjZnNwaV9kZXYgKilwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKLQlzcGluX2xvY2soJmNmc3BpX2xpc3RfbG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9zYWZlKGxpc3Rfbm9kZSwgbiwgJmNmc3BpX2xpc3QpIHsKLQkJY2ZzcGkgPSBsaXN0X2VudHJ5KGxpc3Rfbm9kZSwgc3RydWN0IGNmc3BpLCBsaXN0KTsKLQkJLyogRmluZCB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UuICovCi0JCWlmIChjZnNwaS0+ZGV2ID09IGRldikgewotCQkJLyogUmVtb3ZlIGZyb20gbGlzdC4gKi8KLQkJCWxpc3RfZGVsKGxpc3Rfbm9kZSk7Ci0JCQkvKiBGcmVlIERNQSBidWZmZXJzLiAqLwotCQkJZG1hX2ZyZWUoY2ZzcGktPnhmZXIudmFfcngsIGNmc3BpLT54ZmVyLnBhX3J4KTsKLQkJCWRtYV9mcmVlKGNmc3BpLT54ZmVyLnZhX3R4LCBjZnNwaS0+eGZlci5wYV90eCk7Ci0JCQlzZXRfYml0KFNQSV9URVJNSU5BVEUsICZjZnNwaS0+c3RhdGUpOwotCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjZnNwaS0+d2FpdCk7Ci0JCQlkZXN0cm95X3dvcmtxdWV1ZShjZnNwaS0+d3EpOwotCQkJLyogRGVzdHJveSBkZWJ1Z2ZzIGRpcmVjdG9yeSBhbmQgZmlsZXMuICovCi0JCQlkZXZfZGVidWdmc19yZW0oY2ZzcGkpOwotCQkJdW5yZWdpc3Rlcl9uZXRkZXYoY2ZzcGktPm5kZXYpOwotCQkJc3Bpbl91bmxvY2soJmNmc3BpX2xpc3RfbG9jayk7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQlzcGluX3VubG9jaygmY2ZzcGlfbGlzdF9sb2NrKTsKLQlyZXR1cm4gLUVOT0RFVjsKKwkvKiBFdmVyeXRoaW5nIGlzIGRvbmUgaW4gY2ZzcGlfdW5pbml0KCkuICovCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjZnNwaV9leGl0X21vZHVsZSh2b2lkKQpAQCAtNzc3LDcgKzc4MSw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX3NhZmUobGlzdF9ub2RlLCBuLCAmY2ZzcGlfbGlzdCkgewogCQljZnNwaSA9IGxpc3RfZW50cnkobGlzdF9ub2RlLCBzdHJ1Y3QgY2ZzcGksIGxpc3QpOwotCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihjZnNwaS0+cGRldik7CisJCXVucmVnaXN0ZXJfbmV0ZGV2KGNmc3BpLT5uZGV2KTsKIAl9CiAKIAkvKiBEZXN0cm95IHN5c2ZzIGZpbGVzLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL0tjb25maWcgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwppbmRleCBmNmM5OGZiLi5hYjQ1NzU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9jYW4vS2NvbmZpZwpAQCAtMTE2LDYgKzExNiw4IEBACiAKIHNvdXJjZSAiZHJpdmVycy9uZXQvY2FuL2NfY2FuL0tjb25maWciCiAKK3NvdXJjZSAiZHJpdmVycy9uZXQvY2FuL2NjNzcwL0tjb25maWciCisKIHNvdXJjZSAiZHJpdmVycy9uZXQvY2FuL3VzYi9LY29uZmlnIgogCiBzb3VyY2UgImRyaXZlcnMvbmV0L2Nhbi9zb2Z0aW5nL0tjb25maWciCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9jYW4vTWFrZWZpbGUKaW5kZXggMjRlYmZlOC4uOTM4YmUzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9NYWtlZmlsZQpAQCAtMTQsNiArMTQsNyBAQAogb2JqLSQoQ09ORklHX0NBTl9TSkExMDAwKQkrPSBzamExMDAwLwogb2JqLSQoQ09ORklHX0NBTl9NU0NBTikJCSs9IG1zY2FuLwogb2JqLSQoQ09ORklHX0NBTl9DX0NBTikJCSs9IGNfY2FuLworb2JqLSQoQ09ORklHX0NBTl9DQzc3MCkJCSs9IGNjNzcwLwogb2JqLSQoQ09ORklHX0NBTl9BVDkxKQkJKz0gYXQ5MV9jYW4ubwogb2JqLSQoQ09ORklHX0NBTl9USV9IRUNDKQkrPSB0aV9oZWNjLm8KIG9iai0kKENPTkZJR19DQU5fTUNQMjUxWCkJKz0gbWNwMjUxeC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vYXQ5MV9jYW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9hdDkxX2Nhbi5jCmluZGV4IDA0NGVhMDYuLjZlYTkwNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9hdDkxX2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9hdDkxX2Nhbi5jCkBAIC0xMzgzLDE4ICsxMzgzLDcgQEAKIAkuaWRfdGFibGUgPSBhdDkxX2Nhbl9pZF90YWJsZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGF0OTFfY2FuX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYXQ5MV9jYW5fZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGF0OTFfY2FuX21vZHVsZV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmF0OTFfY2FuX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGF0OTFfY2FuX21vZHVsZV9pbml0KTsKLW1vZHVsZV9leGl0KGF0OTFfY2FuX21vZHVsZV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXQ5MV9jYW5fZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiTWFyYyBLbGVpbmUtQnVkZGUgPG1rbEBwZW5ndXRyb25peC5kZT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9iZmluX2Nhbi5jIGIvZHJpdmVycy9uZXQvY2FuL2JmaW5fY2FuLmMKaW5kZXggYTFjNWFiYy4uMzQ5ZTBmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2JmaW5fY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2JmaW5fY2FuLmMKQEAgLTY3NiwxNyArNjc2LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgYmZpbl9jYW5faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmJmaW5fY2FuX2RyaXZlcik7Ci19Ci1tb2R1bGVfaW5pdChiZmluX2Nhbl9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGJmaW5fY2FuX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYmZpbl9jYW5fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGJmaW5fY2FuX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiZmluX2Nhbl9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJCYXJyeSBTb25nIDwyMWNuYmFvQGdtYWlsLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9jX2Nhbi9jX2Nhbl9wbGF0Zm9ybS5jIGIvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuX3BsYXRmb3JtLmMKaW5kZXggMGI1YzZmOC4uNWUxYTVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuX3BsYXRmb3JtLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2NfY2FuL2NfY2FuX3BsYXRmb3JtLmMKQEAgLTE5NywxNyArMTk3LDcgQEAKIAkucmVtb3ZlID0gX19kZXZleGl0X3AoY19jYW5fcGxhdF9yZW1vdmUpLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgY19jYW5fcGxhdF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY19jYW5fcGxhdF9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoY19jYW5fcGxhdF9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IGNfY2FuX3BsYXRfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZjX2Nhbl9wbGF0X2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChjX2Nhbl9wbGF0X2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihjX2Nhbl9wbGF0X2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkJodXBlc2ggU2hhcm1hIDxiaHVwZXNoLnNoYXJtYUBzdC5jb20+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vY2M3NzAvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2Nhbi9jYzc3MC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzA3YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jYW4vY2M3NzAvS2NvbmZpZwpAQCAtMCwwICsxLDIxIEBACittZW51Y29uZmlnIENBTl9DQzc3MAorCXRyaXN0YXRlICJCb3NjaCBDQzc3MCBhbmQgSW50ZWwgQU44MjUyNyBkZXZpY2VzIgorCWRlcGVuZHMgb24gQ0FOX0RFViAmJiBIQVNfSU9NRU0KKworaWYgQ0FOX0NDNzcwCisKK2NvbmZpZyBDQU5fQ0M3NzBfSVNBCisJdHJpc3RhdGUgIklTQSBCdXMgYmFzZWQgbGVnYWN5IENDNzcwIGRyaXZlciIKKwktLS1oZWxwLS0tCisJICBUaGlzIGRyaXZlciBhZGRzIGxlZ2FjeSBzdXBwb3J0IGZvciBDQzc3MCBhbmQgQU44MjUyNyBjaGlwcworCSAgY29ubmVjdGVkIHRvIHRoZSBJU0EgYnVzIHVzaW5nIEkvTyBwb3J0LCBtZW1vcnkgbWFwcGVkIG9yCisJICBpbmRpcmVjdCBhY2Nlc3MuCisKK2NvbmZpZyBDQU5fQ0M3NzBfUExBVEZPUk0KKwl0cmlzdGF0ZSAiR2VuZXJpYyBQbGF0Zm9ybSBCdXMgYmFzZWQgQ0M3NzAgZHJpdmVyIgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZHJpdmVyIGFkZHMgc3VwcG9ydCBmb3IgdGhlIENDNzcwIGFuZCBBTjgyNTI3IGNoaXBzCisJICBjb25uZWN0ZWQgdG8gdGhlICJwbGF0Zm9ybSBidXMiIChMaW51eCBhYnN0cmFjdGlvbiBmb3IgZGlyZWN0bHkKKwkgIHRvIHRoZSBwcm9jZXNzb3IgYXR0YWNoZWQgZGV2aWNlcykuCisKK2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vY2M3NzAvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9jYW4vY2M3NzAvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiODMyMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9jYzc3MC9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKKyMKKyMgIE1ha2VmaWxlIGZvciB0aGUgQm9zY2ggQ0M3NzAgQ0FOIGNvbnRyb2xsZXIgZHJpdmVycy4KKyMKKworb2JqLSQoQ09ORklHX0NBTl9DQzc3MCkgKz0gY2M3NzAubworb2JqLSQoQ09ORklHX0NBTl9DQzc3MF9JU0EpICs9IGNjNzcwX2lzYS5vCitvYmotJChDT05GSUdfQ0FOX0NDNzcwX1BMQVRGT1JNKSArPSBjYzc3MF9wbGF0Zm9ybS5vCisKK2NjZmxhZ3MtJChDT05GSUdfQ0FOX0RFQlVHX0RFVklDRVMpIDo9IC1EREVCVUcKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9jYzc3MC9jYzc3MC5jIGIvZHJpdmVycy9uZXQvY2FuL2NjNzcwL2NjNzcwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY2ODk2NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9jYzc3MC9jYzc3MC5jCkBAIC0wLDAgKzEsODgxIEBACisvKgorICogQ29yZSBkcml2ZXIgZm9yIHRoZSBDQzc3MCBhbmQgQU44MjUyNyBDQU4gY29udHJvbGxlcnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTEgV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9mY250bC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvY2FuLmg+CisjaW5jbHVkZSA8bGludXgvY2FuL2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9lcnJvci5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9kZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vcGxhdGZvcm0vY2M3NzAuaD4KKworI2luY2x1ZGUgImNjNzcwLmgiCisKK01PRFVMRV9BVVRIT1IoIldvbGZnYW5nIEdyYW5kZWdnZXIgPHdnQGdyYW5kZWdnZXIuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKEtCVUlMRF9NT0ROQU1FICJDQU4gbmV0ZGV2aWNlIGRyaXZlciIpOworCisvKgorICogVGhlIENDNzcwIGlzIGEgQ0FOIGNvbnRyb2xsZXIgZnJvbSBCb3NjaCwgd2hpY2ggaXMgMTAwJSBjb21wYXRpYmxlCisgKiB3aXRoIHRoZSBBTjgyNTI3IGZyb20gSW50ZWwsIGJ1dCB3aXRoICJidWdzIiBiZWluZyBmaXhlZCBhbmQgc29tZQorICogYWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5LCBtYWlubHk6CisgKgorICogMS4gUlggYW5kIFRYIGVycm9yIGNvdW50ZXJzIGFyZSByZWFkYWJsZS4KKyAqIDIuIFN1cHBvcnQgb2Ygc2lsZW50IChsaXN0ZW4tb25seSkgbW9kZS4KKyAqIDMuIE1lc3NhZ2Ugb2JqZWN0IDE1IGNhbiByZWNlaXZlIGFsbCB0eXBlcyBvZiBmcmFtZXMsIGFsc28gUlRSIGFuZCBFRkYuCisgKgorICogRGV0YWlscyBhcmUgYXZhaWxhYmxlIGZyb20gQm9zY2gncyAiQ0M3NzBfUHJvZHVjdF9JbmZvXzIwMDctMDEucGRmIiwKKyAqIHdoaWNoIGV4cGxhaW5zIGluIGRldGFpbCB0aGUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHRoZSBDQzc3MCBhbmQgdGhlCisgKiA4MjUyNy4gVGhpcyBkcml2ZXIgdXNlIHRoZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgMy4gb24gcmVhbCBDQzc3MAorICogZGV2aWNlcy4gVW5mb3J0dW5hdGVseSwgdGhlIENDNzcwIGRvZXMgc3RpbGwgbm90IHN0b3JlIHRoZSBtZXNzYWdlCisgKiBpZGVudGlmaWVyIG9mIHJlY2VpdmVkIHJlbW90ZSB0cmFuc21pc3Npb24gcmVxdWVzdCBmcmFtZXMgYW5kCisgKiB0aGVyZWZvcmUgaXQncyBzZXQgdG8gMC4KKyAqCisgKiBUaGUgbWVzc2FnZSBvYmplY3RzIDEuLjE0IGNhbiBiZSB1c2VkIGZvciBUWCBhbmQgUlggd2hpbGUgdGhlIG1lc3NhZ2UKKyAqIG9iamVjdHMgMTUgaXMgb3B0aW1pemVkIGZvciBSWC4gSXQgaGFzIGEgc2hhZG93IHJlZ2lzdGVyIGZvciByZWxpYWJsZQorICogZGF0YSByZWNlaXB0aW9uIHVuZGVyIGhlYXZ5IGJ1cyBsb2FkLiBUaGVyZWZvcmUgaXQgbWFrZXMgc2Vuc2UgdG8gdXNlCisgKiB0aGlzIG1lc3NhZ2Ugb2JqZWN0IGZvciB0aGUgbmVlZGVkIHVzZSBjYXNlLiBUaGUgZnJhbWUgdHlwZSAoRUZGL1NGRikKKyAqIGZvciB0aGUgbWVzc2FnZSBvYmplY3QgMTUgY2FuIGJlIGRlZmluZWQgdmlhIGtlcm5lbCBtb2R1bGUgcGFyYW1ldGVyCisgKiAibXNnb2JqMTVfZWZmIi4gSWYgbm90IGVxdWFsIDAsIGl0IHdpbGwgcmVjZWl2ZSAyOS1iaXQgRUZGIGZyYW1lcywKKyAqIG90aGVyd2lzZSAxMSBiaXQgU0ZGIG1lc3NhZ2VzLgorICovCitzdGF0aWMgaW50IG1zZ29iajE1X2VmZjsKK21vZHVsZV9wYXJhbShtc2dvYmoxNV9lZmYsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKG1zZ29iajE1X2VmZiwgIkV4dGVuZGVkIDI5LWJpdCBmcmFtZXMgZm9yIG1lc3NhZ2Ugb2JqZWN0IDE1ICIKKwkJICIoZGVmYXVsdDogMTEtYml0IHN0YW5kYXJkIGZyYW1lcykiKTsKKworc3RhdGljIGludCBpODI1MjdfY29tcGF0OworbW9kdWxlX3BhcmFtKGk4MjUyN19jb21wYXQsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGk4MjUyN19jb21wYXQsICJTdHJpY3QgSW50ZWwgODI1MjcgY29tcHRpYmlsaXR5IG1vZGUgIgorCQkgIndpdGhvdXQgdXNpbmcgYWRkaXRpb25hbCBmdW5jdGlvbnMiKTsKKworLyoKKyAqIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGxhc3QgNSBtZXNzYWdlIG9iamVjdHMgMTEuLjE1LiBUaGUgZGVmaW5pdGlvbnMKKyAqIGFuZCBzdHJ1Y3R1cmUgYmVsb3cgYWxsb3dzIHRvIGNvbmZpZ3VyZSBhbmQgYXNzaWduIHRoZW0gdG8gdGhlIHJlYWwKKyAqIG1lc3NhZ2Ugb2JqZWN0LgorICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBjYzc3MF9vYmpfZmxhZ3NbQ0M3NzBfT0JKX01BWF0gPSB7CisJW0NDNzcwX09CSl9SWDBdID0gQ0M3NzBfT0JKX0ZMQUdfUlgsCisJW0NDNzcwX09CSl9SWDFdID0gQ0M3NzBfT0JKX0ZMQUdfUlggfCBDQzc3MF9PQkpfRkxBR19FRkYsCisJW0NDNzcwX09CSl9SWF9SVFIwXSA9IENDNzcwX09CSl9GTEFHX1JYIHwgQ0M3NzBfT0JKX0ZMQUdfUlRSLAorCVtDQzc3MF9PQkpfUlhfUlRSMV0gPSBDQzc3MF9PQkpfRkxBR19SWCB8IENDNzcwX09CSl9GTEFHX1JUUiB8CisJCQkgICAgICBDQzc3MF9PQkpfRkxBR19FRkYsCisJW0NDNzcwX09CSl9UWF0gPSAwLAorfTsKKworc3RhdGljIHN0cnVjdCBjYW5fYml0dGltaW5nX2NvbnN0IGNjNzcwX2JpdHRpbWluZ19jb25zdCA9IHsKKwkubmFtZSA9IEtCVUlMRF9NT0ROQU1FLAorCS50c2VnMV9taW4gPSAxLAorCS50c2VnMV9tYXggPSAxNiwKKwkudHNlZzJfbWluID0gMSwKKwkudHNlZzJfbWF4ID0gOCwKKwkuc2p3X21heCA9IDQsCisJLmJycF9taW4gPSAxLAorCS5icnBfbWF4ID0gNjQsCisJLmJycF9pbmMgPSAxLAorfTsKKworc3RhdGljIGlubGluZSBpbnQgaW50aWQyb2JqKHVuc2lnbmVkIGludCBpbnRpZCkKK3sKKwlpZiAoaW50aWQgPT0gMikKKwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXR1cm4gTVNHT0JKX0xBU1QgKyAyIC0gaW50aWQ7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV9hbGxfb2Jqcyhjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjYzc3MF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OCBtc2djZmc7CisJdW5zaWduZWQgY2hhciBvYmpfZmxhZ3M7CisJdW5zaWduZWQgaW50IG8sIG1vOworCisJZm9yIChvID0gMDsgbyA8IEFSUkFZX1NJWkUocHJpdi0+b2JqX2ZsYWdzKTsgbysrKSB7CisJCW9ial9mbGFncyA9IHByaXYtPm9ial9mbGFnc1tvXTsKKwkJbW8gPSBvYmoybXNnb2JqKG8pOworCisJCWlmIChvYmpfZmxhZ3MgJiBDQzc3MF9PQkpfRkxBR19SWCkgeworCQkJLyoKKwkJCSAqIFdlIGRvbid0IG5lZWQgZXh0cmEgb2JqZWN0cyBmb3IgUlRSIGFuZCBFRkYgaWYKKwkJCSAqIHRoZSBhZGRpdGlvbmFsIENDNzcwIGZ1bmN0aW9ucyBhcmUgZW5hYmxlZC4KKwkJCSAqLworCQkJaWYgKHByaXYtPmNvbnRyb2xfbm9ybWFsX21vZGUgJiBDVFJMX0VBRikgeworCQkJCWlmIChvID4gMCkKKwkJCQkJY29udGludWU7CisJCQkJbmV0ZGV2X2RiZyhkZXYsICJNZXNzYWdlIG9iamVjdCAlZCBmb3IgIgorCQkJCQkgICAiUlggZGF0YSwgUlRSLCBTRkYgYW5kIEVGRlxuIiwgbW8pOworCQkJfSBlbHNlIHsKKwkJCQluZXRkZXZfZGJnKGRldiwKKwkJCQkJICAgIk1lc3NhZ2Ugb2JqZWN0ICVkIGZvciBSWCAlcyAlc1xuIiwKKwkJCQkJICAgbW8sIG9ial9mbGFncyAmIENDNzcwX09CSl9GTEFHX1JUUiA/CisJCQkJCSAgICJSVFIiIDogImRhdGEiLAorCQkJCQkgICBvYmpfZmxhZ3MgJiBDQzc3MF9PQkpfRkxBR19FRkYgPworCQkJCQkgICAiRUZGIiA6ICJTRkYiKTsKKwkJCX0KKworCQkJaWYgKG9ial9mbGFncyAmIENDNzcwX09CSl9GTEFHX0VGRikKKwkJCQltc2djZmcgPSBNU0dDRkdfWFREOworCQkJZWxzZQorCQkJCW1zZ2NmZyA9IDA7CisJCQlpZiAob2JqX2ZsYWdzICYgQ0M3NzBfT0JKX0ZMQUdfUlRSKQorCQkJCW1zZ2NmZyB8PSBNU0dDRkdfRElSOworCisJCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jb25maWcsIG1zZ2NmZyk7CisJCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jdHJsMCwKKwkJCQkJTVNHVkFMX1NFVCB8IFRYSUVfUkVTIHwKKwkJCQkJUlhJRV9TRVQgfCBJTlRQTkRfUkVTKTsKKworCQkJaWYgKG9ial9mbGFncyAmIENDNzcwX09CSl9GTEFHX1JUUikKKwkJCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jdHJsMSwKKwkJCQkJCU5FV0RBVF9SRVMgfCBDUFVVUERfU0VUIHwKKwkJCQkJCVRYUlFTVF9SRVMgfCBSTVRQTkRfUkVTKTsKKwkJCWVsc2UKKwkJCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jdHJsMSwKKwkJCQkJCU5FV0RBVF9SRVMgfCBNU0dMU1RfUkVTIHwKKwkJCQkJCVRYUlFTVF9SRVMgfCBSTVRQTkRfUkVTKTsKKwkJfSBlbHNlIHsKKwkJCW5ldGRldl9kYmcoZGV2LCAiTWVzc2FnZSBvYmplY3QgJWQgZm9yICIKKwkJCQkgICAiVFggZGF0YSwgUlRSLCBTRkYgYW5kIEVGRlxuIiwgbW8pOworCisJCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jdHJsMSwKKwkJCQkJUk1UUE5EX1JFUyB8IFRYUlFTVF9SRVMgfAorCQkJCQlDUFVVUERfUkVTIHwgTkVXREFUX1JFUyk7CisJCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jdHJsMCwKKwkJCQkJTVNHVkFMX1JFUyB8IFRYSUVfUkVTIHwKKwkJCQkJUlhJRV9SRVMgfCBJTlRQTkRfUkVTKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZGlzYWJsZV9hbGxfb2Jqcyhjb25zdCBzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdikKK3sKKwlpbnQgbywgbW87CisKKwlmb3IgKG8gPSAwOyBvIDwgIEFSUkFZX1NJWkUocHJpdi0+b2JqX2ZsYWdzKTsgbysrKSB7CisJCW1vID0gb2JqMm1zZ29iaihvKTsKKworCQlpZiAocHJpdi0+b2JqX2ZsYWdzW29dICYgQ0M3NzBfT0JKX0ZMQUdfUlgpIHsKKwkJCWlmIChvID4gMCAmJiBwcml2LT5jb250cm9sX25vcm1hbF9tb2RlICYgQ1RSTF9FQUYpCisJCQkJY29udGludWU7CisKKwkJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmN0cmwxLAorCQkJCQlORVdEQVRfUkVTIHwgTVNHTFNUX1JFUyB8CisJCQkJCVRYUlFTVF9SRVMgfCBSTVRQTkRfUkVTKTsKKwkJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmN0cmwwLAorCQkJCQlNU0dWQUxfUkVTIHwgVFhJRV9SRVMgfAorCQkJCQlSWElFX1JFUyB8IElOVFBORF9SRVMpOworCQl9IGVsc2UgeworCQkJLyogQ2xlYXIgbWVzc2FnZSBvYmplY3QgZm9yIHNlbmQgKi8KKwkJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmN0cmwxLAorCQkJCQlSTVRQTkRfUkVTIHwgVFhSUVNUX1JFUyB8CisJCQkJCUNQVVVQRF9SRVMgfCBORVdEQVRfUkVTKTsKKwkJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmN0cmwwLAorCQkJCQlNU0dWQUxfUkVTIHwgVFhJRV9SRVMgfAorCQkJCQlSWElFX1JFUyB8IElOVFBORF9SRVMpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfcmVzZXRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjYzc3MF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEVuYWJsZSBjb25maWd1cmF0aW9uIGFuZCBwdXRzIGNoaXAgaW4gYnVzLW9mZiwgZGlzYWJsZSBpbnRlcnJ1cHRzICovCisJY2M3NzBfd3JpdGVfcmVnKHByaXYsIGNvbnRyb2wsIENUUkxfQ0NFIHwgQ1RSTF9JTkkpOworCisJcHJpdi0+Y2FuLnN0YXRlID0gQ0FOX1NUQVRFX1NUT1BQRUQ7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHRzICovCisJY2M3NzBfcmVhZF9yZWcocHJpdiwgaW50ZXJydXB0KTsKKworCS8qIENsZWFyIHN0YXR1cyByZWdpc3RlciAqLworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBzdGF0dXMsIDApOworCisJLyogRGlzYWJsZSBhbGwgdXNlZCBtZXNzYWdlIG9iamVjdHMgKi8KKwlkaXNhYmxlX2FsbF9vYmpzKHByaXYpOworfQorCitzdGF0aWMgdm9pZCBzZXRfbm9ybWFsX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBDbGVhciBpbnRlcnJ1cHRzICovCisJY2M3NzBfcmVhZF9yZWcocHJpdiwgaW50ZXJydXB0KTsKKworCS8qIENsZWFyIHN0YXR1cyByZWdpc3RlciBhbmQgcHJlLXNldCBsYXN0IGVycm9yIGNvZGUgKi8KKwljYzc3MF93cml0ZV9yZWcocHJpdiwgc3RhdHVzLCBTVEFUX0xFQ19NQVNLKTsKKworCS8qIEVuYWJsZSBhbGwgdXNlZCBtZXNzYWdlIG9iamVjdHMqLworCWVuYWJsZV9hbGxfb2JqcyhkZXYpOworCisJLyoKKwkgKiBDbGVhciBidXMtb2ZmLCBpbnRlcnJ1cHRzIG9ubHkgZm9yIGVycm9ycywKKwkgKiBub3QgZm9yIHN0YXR1cyBjaGFuZ2UKKwkgKi8KKwljYzc3MF93cml0ZV9yZWcocHJpdiwgY29udHJvbCwgcHJpdi0+Y29udHJvbF9ub3JtYWxfbW9kZSk7CisKKwlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworfQorCitzdGF0aWMgdm9pZCBjaGlwc2V0X2luaXQoc3RydWN0IGNjNzcwX3ByaXYgKnByaXYpCit7CisJaW50IG1vLCBpZCwgZGF0YTsKKworCS8qIEVuYWJsZSBjb25maWd1cmF0aW9uIGFuZCBwdXQgY2hpcCBpbiBidXMtb2ZmLCBkaXNhYmxlIGludGVycnVwdHMgKi8KKwljYzc3MF93cml0ZV9yZWcocHJpdiwgY29udHJvbCwgKENUUkxfQ0NFIHwgQ1RSTF9JTkkpKTsKKworCS8qIFNldCBDTEtPVVQgZGl2aWRlciBhbmQgc2xldyByYXRlcyAqLworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBjbGtvdXQsIHByaXYtPmNsa291dCk7CisKKwkvKiBDb25maWd1cmUgQ1BVIGludGVyZmFjZSAvIENMS09VVCBlbmFibGUgKi8KKwljYzc3MF93cml0ZV9yZWcocHJpdiwgY3B1X2ludGVyZmFjZSwgcHJpdi0+Y3B1X2ludGVyZmFjZSk7CisKKwkvKiBTZXQgYnVzIGNvbmZpZ3VyYXRpb24gICovCisJY2M3NzBfd3JpdGVfcmVnKHByaXYsIGJ1c19jb25maWcsIHByaXYtPmJ1c19jb25maWcpOworCisJLyogQ2xlYXIgaW50ZXJydXB0cyAqLworCWNjNzcwX3JlYWRfcmVnKHByaXYsIGludGVycnVwdCk7CisKKwkvKiBDbGVhciBzdGF0dXMgcmVnaXN0ZXIgKi8KKwljYzc3MF93cml0ZV9yZWcocHJpdiwgc3RhdHVzLCAwKTsKKworCS8qIENsZWFyIGFuZCBpbnZhbGlkYXRlIG1lc3NhZ2Ugb2JqZWN0cyAqLworCWZvciAobW8gPSBNU0dPQkpfRklSU1Q7IG1vIDw9IE1TR09CSl9MQVNUOyBtbysrKSB7CisJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmN0cmwwLAorCQkJCUlOVFBORF9VTkMgfCBSWElFX1JFUyB8CisJCQkJVFhJRV9SRVMgfCBNU0dWQUxfUkVTKTsKKwkJY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1zZ29ialttb10uY3RybDAsCisJCQkJSU5UUE5EX1JFUyB8IFJYSUVfUkVTIHwKKwkJCQlUWElFX1JFUyB8IE1TR1ZBTF9SRVMpOworCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jdHJsMSwKKwkJCQlORVdEQVRfUkVTIHwgTVNHTFNUX1JFUyB8CisJCQkJVFhSUVNUX1JFUyB8IFJNVFBORF9SRVMpOworCQlmb3IgKGRhdGEgPSAwOyBkYXRhIDwgODsgZGF0YSsrKQorCQkJY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1zZ29ialttb10uZGF0YVtkYXRhXSwgMCk7CisJCWZvciAoaWQgPSAwOyBpZCA8IDQ7IGlkKyspCisJCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5pZFtpZF0sIDApOworCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jb25maWcsIDApOworCX0KKworCS8qIFNldCBhbGwgZ2xvYmFsIElEIG1hc2tzIHRvICJkb24ndCBjYXJlIiAqLworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBnbG9iYWxfbWFza19zdGRbMF0sIDApOworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBnbG9iYWxfbWFza19zdGRbMV0sIDApOworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBnbG9iYWxfbWFza19leHRbMF0sIDApOworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBnbG9iYWxfbWFza19leHRbMV0sIDApOworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBnbG9iYWxfbWFza19leHRbMl0sIDApOworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBnbG9iYWxfbWFza19leHRbM10sIDApOworCit9CisKK3N0YXRpYyBpbnQgY2M3NzBfcHJvYmVfY2hpcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjYzc3MF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIEVuYWJsZSBjb25maWd1cmF0aW9uLCBwdXQgY2hpcCBpbiBidXMtb2ZmLCBkaXNhYmxlIGludHMgKi8KKwljYzc3MF93cml0ZV9yZWcocHJpdiwgY29udHJvbCwgQ1RSTF9DQ0UgfCBDVFJMX0VBRiB8IENUUkxfSU5JKTsKKwkvKiBDb25maWd1cmUgY3B1IGludGVyZmFjZSAvIENMS09VVCBkaXNhYmxlICovCisJY2M3NzBfd3JpdGVfcmVnKHByaXYsIGNwdV9pbnRlcmZhY2UsIHByaXYtPmNwdV9pbnRlcmZhY2UpOworCisJLyoKKwkgKiBDaGVjayBpZiBoYXJkd2FyZSByZXNldCBpcyBzdGlsbCBpbmFjdGl2ZSBvciBtYXliZSB0aGVyZQorCSAqIGlzIG5vIGNoaXAgaW4gdGhpcyBhZGRyZXNzIHNwYWNlCisJICovCisJaWYgKGNjNzcwX3JlYWRfcmVnKHByaXYsIGNwdV9pbnRlcmZhY2UpICYgQ1BVSUZfUlNUKSB7CisJCW5ldGRldl9pbmZvKGRldiwgInByb2JpbmcgQDB4JXAgZmFpbGVkIChyZXNldClcbiIsCisJCQkgICAgcHJpdi0+cmVnX2Jhc2UpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwkvKiBXcml0ZSBhbmQgcmVhZCBiYWNrIHRlc3QgcGF0dGVybiAoc29tZSBhcmJpdHJhcnkgdmFsdWVzKSAqLworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbMV0uZGF0YVsxXSwgMHgyNSk7CisJY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1zZ29ialsyXS5kYXRhWzNdLCAweDUyKTsKKwljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqWzEwXS5kYXRhWzZdLCAweGMzKTsKKwlpZiAoKGNjNzcwX3JlYWRfcmVnKHByaXYsIG1zZ29ialsxXS5kYXRhWzFdKSAhPSAweDI1KSB8fAorCSAgICAoY2M3NzBfcmVhZF9yZWcocHJpdiwgbXNnb2JqWzJdLmRhdGFbM10pICE9IDB4NTIpIHx8CisJICAgIChjYzc3MF9yZWFkX3JlZyhwcml2LCBtc2dvYmpbMTBdLmRhdGFbNl0pICE9IDB4YzMpKSB7CisJCW5ldGRldl9pbmZvKGRldiwgInByb2JpbmcgQDB4JXAgZmFpbGVkIChwYXR0ZXJuKVxuIiwKKwkJCSAgICBwcml2LT5yZWdfYmFzZSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIENoZWNrIGlmIHRoaXMgY2hpcCBpcyBhIENDNzcwIHN1cHBvcnRpbmcgYWRkaXRpb25hbCBmdW5jdGlvbnMgKi8KKwlpZiAoY2M3NzBfcmVhZF9yZWcocHJpdiwgY29udHJvbCkgJiBDVFJMX0VBRikKKwkJcHJpdi0+Y29udHJvbF9ub3JtYWxfbW9kZSB8PSBDVFJMX0VBRjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjYzc3MF9zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjYzc3MF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCS8qIGxlYXZlIHJlc2V0IG1vZGUgKi8KKwlpZiAocHJpdi0+Y2FuLnN0YXRlICE9IENBTl9TVEFURV9TVE9QUEVEKQorCQlzZXRfcmVzZXRfbW9kZShkZXYpOworCisJLyogbGVhdmUgcmVzZXQgbW9kZSAqLworCXNldF9ub3JtYWxfbW9kZShkZXYpOworfQorCitzdGF0aWMgaW50IGNjNzcwX3NldF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGVudW0gY2FuX21vZGUgbW9kZSkKK3sKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENBTl9NT0RFX1NUQVJUOgorCQljYzc3MF9zdGFydChkZXYpOworCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNjNzcwX3NldF9iaXR0aW1pbmcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IGNhbl9iaXR0aW1pbmcgKmJ0ID0gJnByaXYtPmNhbi5iaXR0aW1pbmc7CisJdTggYnRyMCwgYnRyMTsKKworCWJ0cjAgPSAoKGJ0LT5icnAgLSAxKSAmIDB4M2YpIHwgKCgoYnQtPnNqdyAtIDEpICYgMHgzKSA8PCA2KTsKKwlidHIxID0gKChidC0+cHJvcF9zZWcgKyBidC0+cGhhc2Vfc2VnMSAtIDEpICYgMHhmKSB8CisJCSgoKGJ0LT5waGFzZV9zZWcyIC0gMSkgJiAweDcpIDw8IDQpOworCWlmIChwcml2LT5jYW4uY3RybG1vZGUgJiBDQU5fQ1RSTE1PREVfM19TQU1QTEVTKQorCQlidHIxIHw9IDB4ODA7CisKKwluZXRkZXZfaW5mbyhkZXYsICJzZXR0aW5nIEJUUjA9MHglMDJ4IEJUUjE9MHglMDJ4XG4iLCBidHIwLCBidHIxKTsKKworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBiaXRfdGltaW5nXzAsIGJ0cjApOworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBiaXRfdGltaW5nXzEsIGJ0cjEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2M3NzBfZ2V0X2JlcnJfY291bnRlcihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgc3RydWN0IGNhbl9iZXJyX2NvdW50ZXIgKmJlYykKK3sKKwlzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwliZWMtPnR4ZXJyID0gY2M3NzBfcmVhZF9yZWcocHJpdiwgdHhfZXJyb3JfY291bnRlcik7CisJYmVjLT5yeGVyciA9IGNjNzcwX3JlYWRfcmVnKHByaXYsIHJ4X2Vycm9yX2NvdW50ZXIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBuZXRkZXZfdHhfdCBjYzc3MF9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNjNzcwX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOworCXN0cnVjdCBjYW5fZnJhbWUgKmNmID0gKHN0cnVjdCBjYW5fZnJhbWUgKilza2ItPmRhdGE7CisJdW5zaWduZWQgaW50IG1vID0gb2JqMm1zZ29iaihDQzc3MF9PQkpfVFgpOworCXU4IGRsYywgcnRyOworCXUzMiBpZDsKKwlpbnQgaTsKKworCWlmIChjYW5fZHJvcHBlZF9pbnZhbGlkX3NrYihkZXYsIHNrYikpCisJCXJldHVybiBORVRERVZfVFhfT0s7CisKKwlpZiAoKGNjNzcwX3JlYWRfcmVnKHByaXYsCisJCQkgICAgbXNnb2JqW21vXS5jdHJsMSkgJiBUWFJRU1RfVU5DKSA9PSBUWFJRU1RfU0VUKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiVFggcmVnaXN0ZXIgaXMgc3RpbGwgb2NjdXBpZWQhXG4iKTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWRsYyA9IGNmLT5jYW5fZGxjOworCWlkID0gY2YtPmNhbl9pZDsKKwlpZiAoY2YtPmNhbl9pZCAmIENBTl9SVFJfRkxBRykKKwkJcnRyID0gMDsKKwllbHNlCisJCXJ0ciA9IE1TR0NGR19ESVI7CisJY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1zZ29ialttb10uY3RybDEsCisJCQlSTVRQTkRfUkVTIHwgVFhSUVNUX1JFUyB8IENQVVVQRF9TRVQgfCBORVdEQVRfUkVTKTsKKwljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jdHJsMCwKKwkJCU1TR1ZBTF9TRVQgfCBUWElFX1NFVCB8IFJYSUVfUkVTIHwgSU5UUE5EX1JFUyk7CisJaWYgKGlkICYgQ0FOX0VGRl9GTEFHKSB7CisJCWlkICY9IENBTl9FRkZfTUFTSzsKKwkJY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1zZ29ialttb10uY29uZmlnLAorCQkJCShkbGMgPDwgNCkgfCBydHIgfCBNU0dDRkdfWFREKTsKKwkJY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1zZ29ialttb10uaWRbM10sIGlkIDw8IDMpOworCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5pZFsyXSwgaWQgPj4gNSk7CisJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmlkWzFdLCBpZCA+PiAxMyk7CisJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmlkWzBdLCBpZCA+PiAyMSk7CisJfSBlbHNlIHsKKwkJaWQgJj0gQ0FOX1NGRl9NQVNLOworCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jb25maWcsIChkbGMgPDwgNCkgfCBydHIpOworCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5pZFswXSwgaWQgPj4gMyk7CisJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmlkWzFdLCBpZCA8PCA1KTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgZGxjOyBpKyspCisJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmRhdGFbaV0sIGNmLT5kYXRhW2ldKTsKKworCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmN0cmwxLAorCQkJUk1UUE5EX1JFUyB8IFRYUlFTVF9TRVQgfCBDUFVVUERfUkVTIHwgTkVXREFUX1VOQyk7CisKKwlzdGF0cy0+dHhfYnl0ZXMgKz0gZGxjOworCisJY2FuX3B1dF9lY2hvX3NrYihza2IsIGRldiwgMCk7CisKKwkvKgorCSAqIEhNOiBXZSBoYWQgc29tZSBjYXNlcyBvZiByZXBlYXRlZCBJUlFzIHNvIG1ha2Ugc3VyZSB0aGUKKwkgKiBJTlQgaXMgYWNrbm93bGVkZ2VkIEkga25vdyBpdCdzIGFscmVhZHkgZnVydGhlciB1cCwgYnV0CisJICogZG9pbmcgYWdhaW4gZml4ZWQgdGhlIGlzc3VlCisJICovCisJY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1zZ29ialttb10uY3RybDAsCisJCQlNU0dWQUxfVU5DIHwgVFhJRV9VTkMgfCBSWElFX1VOQyB8IElOVFBORF9SRVMpOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIHZvaWQgY2M3NzBfcngoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG1vLCB1OCBjdHJsMSkKK3sKKwlzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKnN0YXRzID0gJmRldi0+c3RhdHM7CisJc3RydWN0IGNhbl9mcmFtZSAqY2Y7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1OCBjb25maWc7CisJdTMyIGlkOworCWludCBpOworCisJc2tiID0gYWxsb2NfY2FuX3NrYihkZXYsICZjZik7CisJaWYgKCFza2IpCisJCXJldHVybjsKKworCWNvbmZpZyA9IGNjNzcwX3JlYWRfcmVnKHByaXYsIG1zZ29ialttb10uY29uZmlnKTsKKworCWlmIChjdHJsMSAmIFJNVFBORF9TRVQpIHsKKwkJLyoKKwkJICogVW5mb3J0dW5hdGVseSwgdGhlIGNoaXAgZG9lcyBub3Qgc3RvcmUgdGhlIHJlYWwgbWVzc2FnZQorCQkgKiBpZGVudGlmaWVyIG9mIHRoZSByZWNlaXZlZCByZW1vdGUgdHJhbnNtaXNzaW9uIHJlcXVlc3QKKwkJICogZnJhbWUuIFRoZXJlZm9yZSB3ZSBzZXQgaXQgdG8gMC4KKwkJICovCisJCWNmLT5jYW5faWQgPSBDQU5fUlRSX0ZMQUc7CisJCWlmIChjb25maWcgJiBNU0dDRkdfWFREKQorCQkJY2YtPmNhbl9pZCB8PSBDQU5fRUZGX0ZMQUc7CisJCWNmLT5jYW5fZGxjID0gMDsKKwl9IGVsc2UgeworCQlpZiAoY29uZmlnICYgTVNHQ0ZHX1hURCkgeworCQkJaWQgPSBjYzc3MF9yZWFkX3JlZyhwcml2LCBtc2dvYmpbbW9dLmlkWzNdKTsKKwkJCWlkIHw9IGNjNzcwX3JlYWRfcmVnKHByaXYsIG1zZ29ialttb10uaWRbMl0pIDw8IDg7CisJCQlpZCB8PSBjYzc3MF9yZWFkX3JlZyhwcml2LCBtc2dvYmpbbW9dLmlkWzFdKSA8PCAxNjsKKwkJCWlkIHw9IGNjNzcwX3JlYWRfcmVnKHByaXYsIG1zZ29ialttb10uaWRbMF0pIDw8IDI0OworCQkJaWQgPj49IDM7CisJCQlpZCB8PSBDQU5fRUZGX0ZMQUc7CisJCX0gZWxzZSB7CisJCQlpZCA9IGNjNzcwX3JlYWRfcmVnKHByaXYsIG1zZ29ialttb10uaWRbMV0pOworCQkJaWQgfD0gY2M3NzBfcmVhZF9yZWcocHJpdiwgbXNnb2JqW21vXS5pZFswXSkgPDwgODsKKwkJCWlkID4+PSA1OworCQl9CisKKwkJY2YtPmNhbl9pZCA9IGlkOworCQljZi0+Y2FuX2RsYyA9IGdldF9jYW5fZGxjKChjb25maWcgJiAweGYwKSA+PiA0KTsKKwkJZm9yIChpID0gMDsgaSA8IGNmLT5jYW5fZGxjOyBpKyspCisJCQljZi0+ZGF0YVtpXSA9IGNjNzcwX3JlYWRfcmVnKHByaXYsIG1zZ29ialttb10uZGF0YVtpXSk7CisJfQorCW5ldGlmX3J4KHNrYik7CisKKwlzdGF0cy0+cnhfcGFja2V0cysrOworCXN0YXRzLT5yeF9ieXRlcyArPSBjZi0+Y2FuX2RsYzsKK30KKworc3RhdGljIGludCBjYzc3MF9lcnIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggc3RhdHVzKQoreworCXN0cnVjdCBjYzc3MF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqc3RhdHMgPSAmZGV2LT5zdGF0czsKKwlzdHJ1Y3QgY2FuX2ZyYW1lICpjZjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4IGxlYzsKKworCW5ldGRldl9kYmcoZGV2LCAic3RhdHVzIGludGVycnVwdCAoJSN4KVxuIiwgc3RhdHVzKTsKKworCXNrYiA9IGFsbG9jX2Nhbl9lcnJfc2tiKGRldiwgJmNmKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBVc2UgZXh0ZW5kZWQgZnVuY3Rpb25zIG9mIHRoZSBDQzc3MCAqLworCWlmIChwcml2LT5jb250cm9sX25vcm1hbF9tb2RlICYgQ1RSTF9FQUYpIHsKKwkJY2YtPmRhdGFbNl0gPSBjYzc3MF9yZWFkX3JlZyhwcml2LCB0eF9lcnJvcl9jb3VudGVyKTsKKwkJY2YtPmRhdGFbN10gPSBjYzc3MF9yZWFkX3JlZyhwcml2LCByeF9lcnJvcl9jb3VudGVyKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgU1RBVF9CT0ZGKSB7CisJCS8qIERpc2FibGUgaW50ZXJydXB0cyAqLworCQljYzc3MF93cml0ZV9yZWcocHJpdiwgY29udHJvbCwgQ1RSTF9JTkkpOworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQlVTT0ZGOworCQlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfQlVTX09GRjsKKwkJY2FuX2J1c19vZmYoZGV2KTsKKwl9IGVsc2UgaWYgKHN0YXR1cyAmIFNUQVRfV0FSTikgeworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfQ1JUTDsKKwkJLyogT25seSB0aGUgQ0M3NzAgZG9lcyBzaG93IGVycm9yIHBhc3NpdmUgKi8KKwkJaWYgKGNmLT5kYXRhWzddID4gMTI3KSB7CisJCQljZi0+ZGF0YVsxXSA9IENBTl9FUlJfQ1JUTF9SWF9QQVNTSVZFIHwKKwkJCQlDQU5fRVJSX0NSVExfVFhfUEFTU0lWRTsKKwkJCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9QQVNTSVZFOworCQkJcHJpdi0+Y2FuLmNhbl9zdGF0cy5lcnJvcl9wYXNzaXZlKys7CisJCX0gZWxzZSB7CisJCQljZi0+ZGF0YVsxXSA9IENBTl9FUlJfQ1JUTF9SWF9XQVJOSU5HIHwKKwkJCQlDQU5fRVJSX0NSVExfVFhfV0FSTklORzsKKwkJCXByaXYtPmNhbi5zdGF0ZSA9IENBTl9TVEFURV9FUlJPUl9XQVJOSU5HOworCQkJcHJpdi0+Y2FuLmNhbl9zdGF0cy5lcnJvcl93YXJuaW5nKys7CisJCX0KKwl9IGVsc2UgeworCQkvKiBCYWNrIHRvIGVycm9yIGF2dGl2ZSAqLworCQljZi0+Y2FuX2lkIHw9IENBTl9FUlJfUFJPVDsKKwkJY2YtPmRhdGFbMl0gPSBDQU5fRVJSX1BST1RfQUNUSVZFOworCQlwcml2LT5jYW4uc3RhdGUgPSBDQU5fU1RBVEVfRVJST1JfQUNUSVZFOworCX0KKworCWxlYyA9IHN0YXR1cyAmIFNUQVRfTEVDX01BU0s7CisJaWYgKGxlYyA8IDcgJiYgbGVjID4gMCkgeworCQlpZiAobGVjID09IFNUQVRfTEVDX0FDSykgeworCQkJY2YtPmNhbl9pZCB8PSBDQU5fRVJSX0FDSzsKKwkJfSBlbHNlIHsKKwkJCWNmLT5jYW5faWQgfD0gQ0FOX0VSUl9QUk9UOworCQkJc3dpdGNoIChsZWMpIHsKKwkJCWNhc2UgU1RBVF9MRUNfU1RVRkY6CisJCQkJY2YtPmRhdGFbMl0gfD0gQ0FOX0VSUl9QUk9UX1NUVUZGOworCQkJCWJyZWFrOworCQkJY2FzZSBTVEFUX0xFQ19GT1JNOgorCQkJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9GT1JNOworCQkJCWJyZWFrOworCQkJY2FzZSBTVEFUX0xFQ19CSVQxOgorCQkJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9CSVQxOworCQkJCWJyZWFrOworCQkJY2FzZSBTVEFUX0xFQ19CSVQwOgorCQkJCWNmLT5kYXRhWzJdIHw9IENBTl9FUlJfUFJPVF9CSVQwOworCQkJCWJyZWFrOworCQkJY2FzZSBTVEFUX0xFQ19DUkM6CisJCQkJY2YtPmRhdGFbM10gfD0gQ0FOX0VSUl9QUk9UX0xPQ19DUkNfU0VROworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJbmV0aWZfcngoc2tiKTsKKworCXN0YXRzLT5yeF9wYWNrZXRzKys7CisJc3RhdHMtPnJ4X2J5dGVzICs9IGNmLT5jYW5fZGxjOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2M3NzBfc3RhdHVzX2ludGVycnVwdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBjYzc3MF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OCBzdGF0dXM7CisKKwlzdGF0dXMgPSBjYzc3MF9yZWFkX3JlZyhwcml2LCBzdGF0dXMpOworCS8qIFJlc2V0IHRoZSBzdGF0dXMgcmVnaXN0ZXIgaW5jbHVkaW5nIFJYT0sgYW5kIFRYT0sgKi8KKwljYzc3MF93cml0ZV9yZWcocHJpdiwgc3RhdHVzLCBTVEFUX0xFQ19NQVNLKTsKKworCWlmIChzdGF0dXMgJiAoU1RBVF9XQVJOIHwgU1RBVF9CT0ZGKSB8fAorCSAgICAoc3RhdHVzICYgU1RBVF9MRUNfTUFTSykgIT0gU1RBVF9MRUNfTUFTSykgeworCQljYzc3MF9lcnIoZGV2LCBzdGF0dXMpOworCQlyZXR1cm4gc3RhdHVzICYgU1RBVF9CT0ZGOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjYzc3MF9yeF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG8pCit7CisJc3RydWN0IGNjNzcwX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOworCXVuc2lnbmVkIGludCBtbyA9IG9iajJtc2dvYmoobyk7CisJdTggY3RybDE7CisJaW50IG4gPSBDQzc3MF9NQVhfTVNHOworCisJd2hpbGUgKG4tLSkgeworCQljdHJsMSA9IGNjNzcwX3JlYWRfcmVnKHByaXYsIG1zZ29ialttb10uY3RybDEpOworCisJCWlmICghKGN0cmwxICYgTkVXREFUX1NFVCkpICB7CisJCQkvKiBDaGVjayBmb3IgUlRSIGlmIGFkZGl0aW9uYWwgZnVuY3Rpb25zIGFyZSBlbmFibGVkICovCisJCQlpZiAocHJpdi0+Y29udHJvbF9ub3JtYWxfbW9kZSAmIENUUkxfRUFGKSB7CisJCQkJaWYgKCEoY2M3NzBfcmVhZF9yZWcocHJpdiwgbXNnb2JqW21vXS5jdHJsMCkgJgorCQkJCSAgICAgIElOVFBORF9TRVQpKQorCQkJCQlicmVhazsKKwkJCX0gZWxzZSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoY3RybDEgJiBNU0dMU1RfU0VUKSB7CisJCQlzdGF0cy0+cnhfb3Zlcl9lcnJvcnMrKzsKKwkJCXN0YXRzLT5yeF9lcnJvcnMrKzsKKwkJfQorCQlpZiAobW8gPCBNU0dPQkpfTEFTVCkKKwkJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmN0cmwxLAorCQkJCQlORVdEQVRfUkVTIHwgTVNHTFNUX1JFUyB8CisJCQkJCVRYUlFTVF9VTkMgfCBSTVRQTkRfVU5DKTsKKwkJY2M3NzBfcngoZGV2LCBtbywgY3RybDEpOworCisJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmN0cmwwLAorCQkJCU1TR1ZBTF9TRVQgfCBUWElFX1JFUyB8CisJCQkJUlhJRV9TRVQgfCBJTlRQTkRfUkVTKTsKKwkJY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1zZ29ialttb10uY3RybDEsCisJCQkJTkVXREFUX1JFUyB8IE1TR0xTVF9SRVMgfAorCQkJCVRYUlFTVF9SRVMgfCBSTVRQTkRfUkVTKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNjNzcwX3J0cl9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG8pCit7CisJc3RydWN0IGNjNzcwX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBtbyA9IG9iajJtc2dvYmoobyk7CisJdTggY3RybDAsIGN0cmwxOworCWludCBuID0gQ0M3NzBfTUFYX01TRzsKKworCXdoaWxlIChuLS0pIHsKKwkJY3RybDAgPSBjYzc3MF9yZWFkX3JlZyhwcml2LCBtc2dvYmpbbW9dLmN0cmwwKTsKKwkJaWYgKCEoY3RybDAgJiBJTlRQTkRfU0VUKSkKKwkJCWJyZWFrOworCisJCWN0cmwxID0gY2M3NzBfcmVhZF9yZWcocHJpdiwgbXNnb2JqW21vXS5jdHJsMSk7CisJCWNjNzcwX3J4KGRldiwgbW8sIGN0cmwxKTsKKworCQljYzc3MF93cml0ZV9yZWcocHJpdiwgbXNnb2JqW21vXS5jdHJsMCwKKwkJCQlNU0dWQUxfU0VUIHwgVFhJRV9SRVMgfAorCQkJCVJYSUVfU0VUIHwgSU5UUE5EX1JFUyk7CisJCWNjNzcwX3dyaXRlX3JlZyhwcml2LCBtc2dvYmpbbW9dLmN0cmwxLAorCQkJCU5FV0RBVF9SRVMgfCBDUFVVUERfU0VUIHwKKwkJCQlUWFJRU1RfUkVTIHwgUk1UUE5EX1JFUyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjYzc3MF90eF9pbnRlcnJ1cHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG8pCit7CisJc3RydWN0IGNjNzcwX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpzdGF0cyA9ICZkZXYtPnN0YXRzOworCXVuc2lnbmVkIGludCBtbyA9IG9iajJtc2dvYmoobyk7CisKKwkvKiBOb3RoaW5nIG1vcmUgdG8gc2VuZCwgc3dpdGNoIG9mZiBpbnRlcnJ1cHRzICovCisJY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1zZ29ialttb10uY3RybDAsCisJCQlNU0dWQUxfUkVTIHwgVFhJRV9SRVMgfCBSWElFX1JFUyB8IElOVFBORF9SRVMpOworCS8qCisJICogV2UgaGFkIHNvbWUgY2FzZXMgb2YgcmVwZWF0ZWQgSVJRIHNvIG1ha2Ugc3VyZSB0aGUKKwkgKiBJTlQgaXMgYWNrbm93bGVkZ2VkCisJICovCisJY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1zZ29ialttb10uY3RybDAsCisJCQlNU0dWQUxfVU5DIHwgVFhJRV9VTkMgfCBSWElFX1VOQyB8IElOVFBORF9SRVMpOworCisJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwljYW5fZ2V0X2VjaG9fc2tiKGRldiwgMCk7CisJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOworfQorCitpcnFyZXR1cm5fdCBjYzc3MF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKilkZXZfaWQ7CisJc3RydWN0IGNjNzcwX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXU4IGludGlkOworCWludCBvLCBuID0gMDsKKworCS8qIFNoYXJlZCBpbnRlcnJ1cHRzIGFuZCBJUlEgb2ZmPyAqLworCWlmIChwcml2LT5jYW4uc3RhdGUgPT0gQ0FOX1NUQVRFX1NUT1BQRUQpCisJCXJldHVybiBJUlFfTk9ORTsKKworCWlmIChwcml2LT5wcmVfaXJxKQorCQlwcml2LT5wcmVfaXJxKHByaXYpOworCisJd2hpbGUgKG4gPCBDQzc3MF9NQVhfSVJRKSB7CisJCS8qIFJlYWQgdGhlIGhpZ2hlc3QgcGVuZGluZyBpbnRlcnJ1cHQgcmVxdWVzdCAqLworCQlpbnRpZCA9IGNjNzcwX3JlYWRfcmVnKHByaXYsIGludGVycnVwdCk7CisJCWlmICghaW50aWQpCisJCQlicmVhazsKKwkJbisrOworCisJCWlmIChpbnRpZCA9PSAxKSB7CisJCQkvKiBFeGl0IGluIGNhc2Ugb2YgYnVzLW9mZiAqLworCQkJaWYgKGNjNzcwX3N0YXR1c19pbnRlcnJ1cHQoZGV2KSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCW8gPSBpbnRpZDJvYmooaW50aWQpOworCisJCQlpZiAobyA+PSBDQzc3MF9PQkpfTUFYKSB7CisJCQkJbmV0ZGV2X2VycihkZXYsICJVbmV4cGVjdGVkIGludGVycnVwdCBpZCAlZFxuIiwKKwkJCQkJICAgaW50aWQpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAocHJpdi0+b2JqX2ZsYWdzW29dICYgQ0M3NzBfT0JKX0ZMQUdfUlRSKQorCQkJCWNjNzcwX3J0cl9pbnRlcnJ1cHQoZGV2LCBvKTsKKwkJCWVsc2UgaWYgKHByaXYtPm9ial9mbGFnc1tvXSAmIENDNzcwX09CSl9GTEFHX1JYKQorCQkJCWNjNzcwX3J4X2ludGVycnVwdChkZXYsIG8pOworCQkJZWxzZQorCQkJCWNjNzcwX3R4X2ludGVycnVwdChkZXYsIG8pOworCQl9CisJfQorCisJaWYgKHByaXYtPnBvc3RfaXJxKQorCQlwcml2LT5wb3N0X2lycShwcml2KTsKKworCWlmIChuID49IENDNzcwX01BWF9JUlEpCisJCW5ldGRldl9kYmcoZGV2LCAiJWQgbWVzc2FnZXMgaGFuZGxlZCBpbiBJU1IiLCBuKTsKKworCXJldHVybiAobikgPyBJUlFfSEFORExFRCA6IElSUV9OT05FOworfQorCitzdGF0aWMgaW50IGNjNzcwX29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGVycjsKKworCS8qIHNldCBjaGlwIGludG8gcmVzZXQgbW9kZSAqLworCXNldF9yZXNldF9tb2RlKGRldik7CisKKwkvKiBjb21tb24gb3BlbiAqLworCWVyciA9IG9wZW5fY2FuZGV2KGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCAmY2M3NzBfaW50ZXJydXB0LCBwcml2LT5pcnFfZmxhZ3MsCisJCQkgIGRldi0+bmFtZSwgZGV2KTsKKwlpZiAoZXJyKSB7CisJCWNsb3NlX2NhbmRldihkZXYpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisKKwkvKiBpbml0IGFuZCBzdGFydCBjaGlwICovCisJY2M3NzBfc3RhcnQoZGV2KTsKKworCW5ldGlmX3N0YXJ0X3F1ZXVlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYzc3MF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwlzZXRfcmVzZXRfbW9kZShkZXYpOworCisJZnJlZV9pcnEoZGV2LT5pcnEsIGRldik7CisJY2xvc2VfY2FuZGV2KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2NjNzcwZGV2KGludCBzaXplb2ZfcHJpdikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBjYzc3MF9wcml2ICpwcml2OworCisJZGV2ID0gYWxsb2NfY2FuZGV2KHNpemVvZihzdHJ1Y3QgY2M3NzBfcHJpdikgKyBzaXplb2ZfcHJpdiwKKwkJCSAgIENDNzcwX0VDSE9fU0tCX01BWCk7CisJaWYgKCFkZXYpCisJCXJldHVybiBOVUxMOworCisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlwcml2LT5kZXYgPSBkZXY7CisJcHJpdi0+Y2FuLmJpdHRpbWluZ19jb25zdCA9ICZjYzc3MF9iaXR0aW1pbmdfY29uc3Q7CisJcHJpdi0+Y2FuLmRvX3NldF9iaXR0aW1pbmcgPSBjYzc3MF9zZXRfYml0dGltaW5nOworCXByaXYtPmNhbi5kb19zZXRfbW9kZSA9IGNjNzcwX3NldF9tb2RlOworCXByaXYtPmNhbi5jdHJsbW9kZV9zdXBwb3J0ZWQgPSBDQU5fQ1RSTE1PREVfM19TQU1QTEVTOworCisJbWVtY3B5KHByaXYtPm9ial9mbGFncywgY2M3NzBfb2JqX2ZsYWdzLCBzaXplb2YoY2M3NzBfb2JqX2ZsYWdzKSk7CisKKwlpZiAoc2l6ZW9mX3ByaXYpCisJCXByaXYtPnByaXYgPSAodm9pZCAqKXByaXYgKyBzaXplb2Yoc3RydWN0IGNjNzcwX3ByaXYpOworCisJcmV0dXJuIGRldjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFsbG9jX2NjNzcwZGV2KTsKKwordm9pZCBmcmVlX2NjNzcwZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZnJlZV9jYW5kZXYoZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZyZWVfY2M3NzBkZXYpOworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGNjNzcwX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuID0gY2M3NzBfb3BlbiwKKwkubmRvX3N0b3AgPSBjYzc3MF9jbG9zZSwKKwkubmRvX3N0YXJ0X3htaXQgPSBjYzc3MF9zdGFydF94bWl0LAorfTsKKworaW50IHJlZ2lzdGVyX2NjNzcwZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGNjNzcwX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwllcnIgPSBjYzc3MF9wcm9iZV9jaGlwKGRldik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWRldi0+bmV0ZGV2X29wcyA9ICZjYzc3MF9uZXRkZXZfb3BzOworCisJZGV2LT5mbGFncyB8PSBJRkZfRUNITzsJLyogd2Ugc3VwcG9ydCBsb2NhbCBlY2hvICovCisKKwkvKiBTaG91bGQgd2UgdXNlIGFkZGl0aW9uYWwgZnVuY3Rpb25zPyAqLworCWlmICghaTgyNTI3X2NvbXBhdCAmJiBwcml2LT5jb250cm9sX25vcm1hbF9tb2RlICYgQ1RSTF9FQUYpIHsKKwkJcHJpdi0+Y2FuLmRvX2dldF9iZXJyX2NvdW50ZXIgPSBjYzc3MF9nZXRfYmVycl9jb3VudGVyOworCQlwcml2LT5jb250cm9sX25vcm1hbF9tb2RlID0gQ1RSTF9JRSB8IENUUkxfRUFGIHwgQ1RSTF9FSUU7CisJCW5ldGRldl9kYmcoZGV2LCAiaTgyNTI3IG1vZGUgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9uc1xuIik7CisJfSBlbHNlIHsKKwkJcHJpdi0+Y29udHJvbF9ub3JtYWxfbW9kZSA9IENUUkxfSUUgfCBDVFJMX0VJRTsKKwkJbmV0ZGV2X2RiZyhkZXYsICJzdHJpY3QgaTgyNTI3IGNvbXBhdGliaWxpdHkgbW9kZVxuIik7CisJfQorCisJY2hpcHNldF9pbml0KHByaXYpOworCXNldF9yZXNldF9tb2RlKGRldik7CisKKwlyZXR1cm4gcmVnaXN0ZXJfY2FuZGV2KGRldik7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyZWdpc3Rlcl9jYzc3MGRldik7CisKK3ZvaWQgdW5yZWdpc3Rlcl9jYzc3MGRldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXNldF9yZXNldF9tb2RlKGRldik7CisJdW5yZWdpc3Rlcl9jYW5kZXYoZGV2KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfY2M3NzBkZXYpOworCitzdGF0aWMgX19pbml0IGludCBjYzc3MF9pbml0KHZvaWQpCit7CisJaWYgKG1zZ29iajE1X2VmZikgeworCQljYzc3MF9vYmpfZmxhZ3NbQ0M3NzBfT0JKX1JYMF0gfD0gQ0M3NzBfT0JKX0ZMQUdfRUZGOworCQljYzc3MF9vYmpfZmxhZ3NbQ0M3NzBfT0JKX1JYMV0gJj0gfkNDNzcwX09CSl9GTEFHX0VGRjsKKwl9CisKKwlwcl9pbmZvKCJDQU4gbmV0ZGV2aWNlIGRyaXZlclxuIik7CisKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KGNjNzcwX2luaXQpOworCitzdGF0aWMgX19leGl0IHZvaWQgY2M3NzBfZXhpdCh2b2lkKQoreworCXByX2luZm8oImRyaXZlciByZW1vdmVkXG4iKTsKK30KK21vZHVsZV9leGl0KGNjNzcwX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2NjNzcwL2NjNzcwLmggYi9kcml2ZXJzL25ldC9jYW4vY2M3NzAvY2M3NzAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTczOWRiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2FuL2NjNzcwL2NjNzcwLmgKQEAgLTAsMCArMSwyMDMgQEAKKy8qCisgKiBDb3JlIGRyaXZlciBmb3IgdGhlIENDNzcwIGFuZCBBTjgyNTI3IENBTiBjb250cm9sbGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMSBXb2xmZ2FuZyBHcmFuZGVnZ2VyIDx3Z0BncmFuZGVnZ2VyLmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaWZuZGVmIENDNzcwX0RFVl9ICisjZGVmaW5lIENDNzcwX0RFVl9ICisKKyNpbmNsdWRlIDxsaW51eC9jYW4vZGV2Lmg+CisKK3N0cnVjdCBjYzc3MF9tc2dvYmogeworCXU4IGN0cmwwOworCXU4IGN0cmwxOworCXU4IGlkWzRdOworCXU4IGNvbmZpZzsKKwl1OCBkYXRhWzhdOworCXU4IGRvbnR1c2U7CQkvKiBwYWRkaW5nICovCit9IF9fcGFja2VkOworCitzdHJ1Y3QgY2M3NzBfcmVncyB7CisJdW5pb24geworCQlzdHJ1Y3QgY2M3NzBfbXNnb2JqIG1zZ29ialsxNl07IC8qIE1lc3NhZ2Ugb2JqZWN0IDEuLjE1ICovCisJCXN0cnVjdCB7CisJCQl1OCBjb250cm9sOwkJLyogQ29udHJvbCBSZWdpc3RlciAqLworCQkJdTggc3RhdHVzOwkJLyogU3RhdHVzIFJlZ2lzdGVyICovCisJCQl1OCBjcHVfaW50ZXJmYWNlOwkvKiBDUFUgSW50ZXJmYWNlIFJlZ2lzdGVyICovCisJCQl1OCBkb250dXNlMTsKKwkJCXU4IGhpZ2hfc3BlZWRfcmVhZFsyXTsJLyogSGlnaCBTcGVlZCBSZWFkICovCisJCQl1OCBnbG9iYWxfbWFza19zdGRbMl07CS8qIFN0YW5kYXJkIEdsb2JhbCBNYXNrICovCisJCQl1OCBnbG9iYWxfbWFza19leHRbNF07CS8qIEV4dGVuZGVkIEdsb2JhbCBNYXNrICovCisJCQl1OCBtc2cxNV9tYXNrWzRdOwkvKiBNZXNzYWdlIDE1IE1hc2sgKi8KKwkJCXU4IGRvbnR1c2UyWzE1XTsKKwkJCXU4IGNsa291dDsJCS8qIENsb2NrIE91dCBSZWdpc3RlciAqLworCQkJdTggZG9udHVzZTNbMTVdOworCQkJdTggYnVzX2NvbmZpZzsJCS8qIEJ1cyBDb25maWd1cmF0aW9uIFJlZ2lzdGVyICovCisJCQl1OCBkb250dXNlNFsxNV07CisJCQl1OCBiaXRfdGltaW5nXzA7CS8qIEJpdCBUaW1pbmcgUmVnaXN0ZXIgYnl0ZSAwICovCisJCQl1OCBkb250dXNlNVsxNV07CisJCQl1OCBiaXRfdGltaW5nXzE7CS8qIEJpdCBUaW1pbmcgUmVnaXN0ZXIgYnl0ZSAxICovCisJCQl1OCBkb250dXNlNlsxNV07CisJCQl1OCBpbnRlcnJ1cHQ7CQkvKiBJbnRlcnJ1cHQgUmVnaXN0ZXIgKi8KKwkJCXU4IGRvbnR1c2U3WzE1XTsKKwkJCXU4IHJ4X2Vycm9yX2NvdW50ZXI7CS8qIFJlY2VpdmUgRXJyb3IgQ291bnRlciAqLworCQkJdTggZG9udHVzZThbMTVdOworCQkJdTggdHhfZXJyb3JfY291bnRlcjsJLyogVHJhbnNtaXQgRXJyb3IgQ291bnRlciAqLworCQkJdTggZG9udHVzZTlbMzFdOworCQkJdTggcDFfY29uZjsKKwkJCXU4IGRvbnR1c2UxMFsxNV07CisJCQl1OCBwMl9jb25mOworCQkJdTggZG9udHVzZTExWzE1XTsKKwkJCXU4IHAxX2luOworCQkJdTggZG9udHVzZTEyWzE1XTsKKwkJCXU4IHAyX2luOworCQkJdTggZG9udHVzZTEzWzE1XTsKKwkJCXU4IHAxX291dDsKKwkJCXU4IGRvbnR1c2UxNFsxNV07CisJCQl1OCBwMl9vdXQ7CisJCQl1OCBkb250dXNlMTVbMTVdOworCQkJdTggc2VyaWFsX3Jlc2V0X2FkZHI7CisJCX07CisJfTsKK30gX19wYWNrZWQ7CisKKy8qIENvbnRyb2wgUmVnaXN0ZXIgKDB4MDApICovCisjZGVmaW5lIENUUkxfSU5JCTB4MDEJLyogSW5pdGlhbGl6YXRpb24gKi8KKyNkZWZpbmUgQ1RSTF9JRQkJMHgwMgkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIENUUkxfU0lFCTB4MDQJLyogU3RhdHVzIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgQ1RSTF9FSUUJMHgwOAkvKiBFcnJvciBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIENUUkxfRUFGCTB4MjAJLyogRW5hYmxlIGFkZGl0aW9uYWwgZnVuY3Rpb25zICovCisjZGVmaW5lIENUUkxfQ0NFCTB4NDAJLyogQ2hhbmdlIENvbmZpZ3VyYXRpb24gRW5hYmxlICovCisKKy8qIFN0YXR1cyBSZWdpc3RlciAoMHgwMSkgKi8KKyNkZWZpbmUgU1RBVF9MRUNfU1RVRkYJMHgwMQkvKiBTdHVmZiBlcnJvciAqLworI2RlZmluZSBTVEFUX0xFQ19GT1JNCTB4MDIJLyogRm9ybSBlcnJvciAqLworI2RlZmluZSBTVEFUX0xFQ19BQ0sJMHgwMwkvKiBBY2tub3dsZWRnZW1lbnQgZXJyb3IgKi8KKyNkZWZpbmUgU1RBVF9MRUNfQklUMQkweDA0CS8qIEJpdDEgZXJyb3IgKi8KKyNkZWZpbmUgU1RBVF9MRUNfQklUMAkweDA1CS8qIEJpdDAgZXJyb3IgKi8KKyNkZWZpbmUgU1RBVF9MRUNfQ1JDCTB4MDYJLyogQ1JDIGVycm9yICovCisjZGVmaW5lIFNUQVRfTEVDX01BU0sJMHgwNwkvKiBMYXN0IEVycm9yIENvZGUgbWFzayAqLworI2RlZmluZSBTVEFUX1RYT0sJMHgwOAkvKiBUcmFuc21pdCBNZXNzYWdlIFN1Y2Nlc3NmdWxseSAqLworI2RlZmluZSBTVEFUX1JYT0sJMHgxMAkvKiBSZWNlaXZlIE1lc3NhZ2UgU3VjY2Vzc2Z1bGx5ICovCisjZGVmaW5lIFNUQVRfV0FLRQkweDIwCS8qIFdha2UgVXAgU3RhdHVzICovCisjZGVmaW5lIFNUQVRfV0FSTgkweDQwCS8qIFdhcm5pbmcgU3RhdHVzICovCisjZGVmaW5lIFNUQVRfQk9GRgkweDgwCS8qIEJ1cyBPZmYgU3RhdHVzICovCisKKy8qCisgKiBDUFUgSW50ZXJmYWNlIFJlZ2lzdGVyICgweDAyKQorICogQ2xvY2sgT3V0IFJlZ2lzdGVyICgweDFmKQorICogQnVzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKDB4MmYpCisgKgorICogc2VlIGluY2x1ZGUvbGludXgvY2FuL3BsYXRmb3JtL2NjNzcwLmgKKyAqLworCisvKiBNZXNzYWdlIENvbnRyb2wgUmVnaXN0ZXIgMCAoQmFzZSBBZGRyZXNzICsgMHgwKSAqLworI2RlZmluZSBJTlRQTkRfUkVTCTB4MDEJLyogTm8gSW50ZXJydXB0IHBlbmRpbmcgKi8KKyNkZWZpbmUgSU5UUE5EX1NFVAkweDAyCS8qIEludGVycnVwdCBwZW5kaW5nICovCisjZGVmaW5lIElOVFBORF9VTkMJMHgwMworI2RlZmluZSBSWElFX1JFUwkweDA0CS8qIFJlY2VpdmUgSW50ZXJydXB0IERpc2FibGUgKi8KKyNkZWZpbmUgUlhJRV9TRVQJMHgwOAkvKiBSZWNlaXZlIEludGVycnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgUlhJRV9VTkMJMHgwYworI2RlZmluZSBUWElFX1JFUwkweDEwCS8qIFRyYW5zbWl0IEludGVycnVwdCBEaXNhYmxlICovCisjZGVmaW5lIFRYSUVfU0VUCTB4MjAJLyogVHJhbnNtaXQgSW50ZXJydXB0IEVuYWJsZSAqLworI2RlZmluZSBUWElFX1VOQwkweDMwCisjZGVmaW5lIE1TR1ZBTF9SRVMJMHg0MAkvKiBNZXNzYWdlIEludmFsaWQgKi8KKyNkZWZpbmUgTVNHVkFMX1NFVAkweDgwCS8qIE1lc3NhZ2UgVmFsaWQgKi8KKyNkZWZpbmUgTVNHVkFMX1VOQwkweGMwCisKKy8qIE1lc3NhZ2UgQ29udHJvbCBSZWdpc3RlciAxIChCYXNlIEFkZHJlc3MgKyAweDAxKSAqLworI2RlZmluZSBORVdEQVRfUkVTCTB4MDEJLyogTm8gTmV3IERhdGEgKi8KKyNkZWZpbmUgTkVXREFUX1NFVAkweDAyCS8qIE5ldyBEYXRhICovCisjZGVmaW5lIE5FV0RBVF9VTkMJMHgwMworI2RlZmluZSBNU0dMU1RfUkVTCTB4MDQJLyogTm8gTWVzc2FnZSBMb3N0ICovCisjZGVmaW5lIE1TR0xTVF9TRVQJMHgwOAkvKiBNZXNzYWdlIExvc3QgKi8KKyNkZWZpbmUgTVNHTFNUX1VOQwkweDBjCisjZGVmaW5lIENQVVVQRF9SRVMJMHgwNAkvKiBObyBDUFUgVXBkYXRpbmcgKi8KKyNkZWZpbmUgQ1BVVVBEX1NFVAkweDA4CS8qIENQVSBVcGRhdGluZyAqLworI2RlZmluZSBDUFVVUERfVU5DCTB4MGMKKyNkZWZpbmUgVFhSUVNUX1JFUwkweDEwCS8qIE5vIFRyYW5zbWlzc2lvbiBSZXF1ZXN0ICovCisjZGVmaW5lIFRYUlFTVF9TRVQJMHgyMAkvKiBUcmFuc21pc3Npb24gUmVxdWVzdCAqLworI2RlZmluZSBUWFJRU1RfVU5DCTB4MzAKKyNkZWZpbmUgUk1UUE5EX1JFUwkweDQwCS8qIE5vIFJlbW90ZSBSZXF1ZXN0IFBlbmRpbmcgKi8KKyNkZWZpbmUgUk1UUE5EX1NFVAkweDgwCS8qIFJlbW90ZSBSZXF1ZXN0IFBlbmRpbmcgKi8KKyNkZWZpbmUgUk1UUE5EX1VOQwkweGMwCisKKy8qIE1lc3NhZ2UgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAoQmFzZSBBZGRyZXNzICsgMHgwNikgKi8KKyNkZWZpbmUgTVNHQ0ZHX1hURAkweDA0CS8qIEV4dGVuZGVkIElkZW50aWZpZXIgKi8KKyNkZWZpbmUgTVNHQ0ZHX0RJUgkweDA4CS8qIERpcmVjdGlvbiBpcyBUcmFuc21pdCAqLworCisjZGVmaW5lIE1TR09CSl9GSVJTVAkxCisjZGVmaW5lIE1TR09CSl9MQVNUCTE1CisKKyNkZWZpbmUgQ0M3NzBfSU9fU0laRQkweDEwMAorI2RlZmluZSBDQzc3MF9NQVhfSVJRCTIwCS8qIG1heC4gbnVtYmVyIG9mIGludGVycnVwdHMgaGFuZGxlZCBpbiBJU1IgKi8KKyNkZWZpbmUgQ0M3NzBfTUFYX01TRwk0CS8qIG1heC4gbnVtYmVyIG9mIG1lc3NhZ2VzIGhhbmRsZWQgaW4gSVNSICovCisKKyNkZWZpbmUgQ0M3NzBfRUNIT19TS0JfTUFYCTEKKworI2RlZmluZSBjYzc3MF9yZWFkX3JlZyhwcml2LCBtZW1iZXIpCQkJCQlcCisJcHJpdi0+cmVhZF9yZWcocHJpdiwgb2Zmc2V0b2Yoc3RydWN0IGNjNzcwX3JlZ3MsIG1lbWJlcikpCisKKyNkZWZpbmUgY2M3NzBfd3JpdGVfcmVnKHByaXYsIG1lbWJlciwgdmFsdWUpCQkJCVwKKwlwcml2LT53cml0ZV9yZWcocHJpdiwgb2Zmc2V0b2Yoc3RydWN0IGNjNzcwX3JlZ3MsIG1lbWJlciksIHZhbHVlKQorCisvKgorICogTWVzc2FnZSBvYmplY3RzIGFuZCBmbGFncyB1c2VkIGJ5IHRoaXMgZHJpdmVyCisgKi8KKyNkZWZpbmUgQ0M3NzBfT0JKX0ZMQUdfUlgJMHgwMQorI2RlZmluZSBDQzc3MF9PQkpfRkxBR19SVFIJMHgwMgorI2RlZmluZSBDQzc3MF9PQkpfRkxBR19FRkYJMHgwNAorCitlbnVtIHsKKwlDQzc3MF9PQkpfUlgwID0gMCwJLyogZm9yIHJlY2VpdmluZyBub3JtYWwgbWVzc2FnZXMgKi8KKwlDQzc3MF9PQkpfUlgxLAkJLyogZm9yIHJlY2VpdmluZyBub3JtYWwgbWVzc2FnZXMgKi8KKwlDQzc3MF9PQkpfUlhfUlRSMCwJLyogZm9yIHJlY2VpdmluZyByZW1vdGUgdHJhbnNtaXNzaW9uIHJlcXVlc3RzICovCisJQ0M3NzBfT0JKX1JYX1JUUjEsCS8qIGZvciByZWNlaXZpbmcgcmVtb3RlIHRyYW5zbWlzc2lvbiByZXF1ZXN0cyAqLworCUNDNzcwX09CSl9UWCwJCS8qIGZvciBzZW5kaW5nIG1lc3NhZ2VzICovCisJQ0M3NzBfT0JKX01BWAorfTsKKworI2RlZmluZSBvYmoybXNnb2JqKG8pCShNU0dPQkpfTEFTVCAtIChvKSkgLyogbWVzc2FnZSBvYmplY3QgMTEuLjE1ICovCisKKy8qCisgKiBDQzc3MCBwcml2YXRlIGRhdGEgc3RydWN0dXJlCisgKi8KK3N0cnVjdCBjYzc3MF9wcml2IHsKKwlzdHJ1Y3QgY2FuX3ByaXYgY2FuOwkvKiBtdXN0IGJlIHRoZSBmaXJzdCBtZW1iZXIgKi8KKwlzdHJ1Y3Qgc2tfYnVmZiAqZWNob19za2I7CisKKwkvKiB0aGUgbG93ZXItbGF5ZXIgaXMgcmVzcG9uc2libGUgZm9yIGFwcHJvcHJpYXRlIGxvY2tpbmcgKi8KKwl1OCAoKnJlYWRfcmVnKShjb25zdCBzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdiwgaW50IHJlZyk7CisJdm9pZCAoKndyaXRlX3JlZykoY29uc3Qgc3RydWN0IGNjNzcwX3ByaXYgKnByaXYsIGludCByZWcsIHU4IHZhbCk7CisJdm9pZCAoKnByZV9pcnEpKGNvbnN0IHN0cnVjdCBjYzc3MF9wcml2ICpwcml2KTsKKwl2b2lkICgqcG9zdF9pcnEpKGNvbnN0IHN0cnVjdCBjYzc3MF9wcml2ICpwcml2KTsKKworCXZvaWQgKnByaXY7CQkvKiBmb3IgYm9hcmQtc3BlY2lmaWMgZGF0YSAqLworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisKKwl2b2lkIF9faW9tZW0gKnJlZ19iYXNlOwkgLyogaW9yZW1hcCdlZCBhZGRyZXNzIHRvIHJlZ2lzdGVycyAqLworCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOyAvKiBmb3IgcmVxdWVzdF9pcnEoKSAqLworCisJdW5zaWduZWQgY2hhciBvYmpfZmxhZ3NbQ0M3NzBfT0JKX01BWF07CisJdTggY29udHJvbF9ub3JtYWxfbW9kZTsJLyogQ29udHJvbCByZWdpc3RlciBmb3Igbm9ybWFsIG1vZGUgKi8KKwl1OCBjcHVfaW50ZXJmYWNlOwkvKiBDUFUgaW50ZXJmYWNlIHJlZ2lzdGVyICovCisJdTggY2xrb3V0OwkJLyogQ2xvY2sgb3V0IHJlZ2lzdGVyICovCisJdTggYnVzX2NvbmZpZzsJCS8qIEJ1cyBjb25mZmlndXJhdGlvbiByZWdpc3RlciAqLworfTsKKworc3RydWN0IG5ldF9kZXZpY2UgKmFsbG9jX2NjNzcwZGV2KGludCBzaXplb2ZfcHJpdik7Cit2b2lkIGZyZWVfY2M3NzBkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CitpbnQgcmVnaXN0ZXJfY2M3NzBkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Cit2b2lkIHVucmVnaXN0ZXJfY2M3NzBkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKKyNlbmRpZiAvKiBDQzc3MF9ERVZfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2NjNzcwL2NjNzcwX2lzYS5jIGIvZHJpdmVycy9uZXQvY2FuL2NjNzcwL2NjNzcwX2lzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZTVmZTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9jYW4vY2M3NzAvY2M3NzBfaXNhLmMKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBEcml2ZXIgZm9yIENDNzcwIGFuZCBBTjgyNTI3IENBTiBjb250cm9sbGVycyBvbiB0aGUgbGVnYWN5IElTQSBidXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTEgV29sZmdhbmcgR3JhbmRlZ2dlciA8d2dAZ3JhbmRlZ2dlci5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKworLyoKKyAqIEJvc2NoIENDNzcwIGFuZCBJbnRlbCBBTjgyNTI3IENBTiBjb250cm9sbGVycyBvbiB0aGUgSVNBIG9yIFBDLTEwNCBidXMuCisgKiBUaGUgSS9PIHBvcnQgb3IgbWVtb3J5IGFkZHJlc3MgYW5kIHRoZSBJUlEgbnVtYmVyIG11c3QgYmUgc3BlY2lmaWVkIHZpYQorICogbW9kdWxlIHBhcmFtZXRlcnM6CisgKgorICogICBpbnNtb2QgY2M3NzBfaXNhLmtvIHBvcnQ9MHgzMTAsMHgzODAgaXJxPTcsMTEKKyAqCisgKiBmb3IgSVNBIGRldmljZXMgdXNpbmcgSS9PIHBvcnRzIG9yOgorICoKKyAqICAgaW5zbW9kIGNjNzcwX2lzYS5rbyBtZW09MHhkMTAwMCwweGQxMDAwIGlycT03LDExCisgKgorICogZm9yIG1lbW9yeSBtYXBwZWQgSVNBIGRldmljZXMuCisgKgorICogSW5kaXJlY3QgYWNjZXNzIHZpYSBhZGRyZXNzIGFuZCBkYXRhIHBvcnQgaXMgc3VwcG9ydGVkIGFzIHdlbGw6CisgKgorICogICBpbnNtb2QgY2M3NzBfaXNhLmtvIHBvcnQ9MHgzMTAsMHgzODAgaW5kaXJlY3Q9MSBpcnE9NywxMQorICoKKyAqIEZ1cnRoZXJtb3JlLCB0aGUgZm9sbG93aW5nIG1vZGUgcGFyYW1ldGVyIGNhbiBiZSBkZWZpbmVkOgorICoKKyAqICAgY2xrOiBFeHRlcm5hbCBvc2NpbGxhdG9yIGNsb2NrIGZyZXF1ZW5jeSAoZGVmYXVsdD0xNjAwMDAwMCBbMTYgTUh6XSkKKyAqICAgY2lyOiBDUFUgaW50ZXJmYWNlIHJlZ2lzdGVyIChkZWZhdWx0PTB4NDAgW0RTQ10pCisgKiAgIGJjcjogQnVzIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKGRlZmF1bHQ9MHg0MCBbQ0JZXSkKKyAqICAgY29yOiBDbG9ja291dCByZWdpc3RlciAoZGVmYXVsdD0weDAwKQorICoKKyAqIE5vdGU6IGZvciBjbGssIGNpciwgYmNyIGFuZCBjb3IsIHRoZSBmaXJzdCBhcmd1bWVudCByZS1kZWZpbmVzIHRoZQorICogZGVmYXVsdCBmb3IgYWxsIG90aGVyIGRldmljZXMsIGUuZy46CisgKgorICogICBpbnNtb2QgY2M3NzBfaXNhLmtvIG1lbT0weGQxMDAwLDB4ZDEwMDAgaXJxPTcsMTEgY2xrPTI0MDAwMDAwCisgKgorICogaXMgZXF1aXZhbGVudCB0bworICoKKyAqICAgaW5zbW9kIGNjNzcwX2lzYS5rbyBtZW09MHhkMTAwMCwweGQxMDAwIGlycT03LDExIGNsaz0yNDAwMDAwMCwyNDAwMDAwMAorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9jYW4vZGV2Lmg+CisjaW5jbHVkZSA8bGludXgvY2FuL3BsYXRmb3JtL2NjNzcwLmg+CisKKyNpbmNsdWRlICJjYzc3MC5oIgorCisjZGVmaW5lIE1BWERFViA4CisKK01PRFVMRV9BVVRIT1IoIldvbGZnYW5nIEdyYW5kZWdnZXIgPHdnQGdyYW5kZWdnZXIuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb2NrZXQtQ0FOIGRyaXZlciBmb3IgQ0M3NzAgb24gdGhlIElTQSBidXMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKKworI2RlZmluZSBDTEtfREVGQVVMVAkxNjAwMDAwMAkvKiAxNiBNSHogKi8KKyNkZWZpbmUgQ09SX0RFRkFVTFQJMHgwMAorI2RlZmluZSBCQ1JfREVGQVVMVAlCVVNDRkdfQ0JZCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBvcnRbTUFYREVWXTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1lbVtNQVhERVZdOworc3RhdGljIGludCBfX2RldmluaXRkYXRhIGlycVtNQVhERVZdOworc3RhdGljIGludCBfX2RldmluaXRkYXRhIGNsa1tNQVhERVZdOworc3RhdGljIHU4IF9fZGV2aW5pdGRhdGEgY2lyW01BWERFVl0gPSB7WzAgLi4uIChNQVhERVYgLSAxKV0gPSAweGZmfTsKK3N0YXRpYyB1OCBfX2RldmluaXRkYXRhIGNvcltNQVhERVZdID0ge1swIC4uLiAoTUFYREVWIC0gMSldID0gMHhmZn07CitzdGF0aWMgdTggX19kZXZpbml0ZGF0YSBiY3JbTUFYREVWXSA9IHtbMCAuLi4gKE1BWERFViAtIDEpXSA9IDB4ZmZ9Oworc3RhdGljIGludCBfX2RldmluaXRkYXRhIGluZGlyZWN0W01BWERFVl0gPSB7WzAgLi4uIChNQVhERVYgLSAxKV0gPSAtMX07CisKK21vZHVsZV9wYXJhbV9hcnJheShwb3J0LCB1bG9uZywgTlVMTCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHBvcnQsICJJL08gcG9ydCBudW1iZXIiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KG1lbSwgdWxvbmcsIE5VTEwsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhtZW0sICJJL08gbWVtb3J5IGFkZHJlc3MiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGluZGlyZWN0LCBpbnQsIE5VTEwsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhpbmRpcmVjdCwgIkluZGlyZWN0IGFjY2VzcyB2aWEgYWRkcmVzcyBhbmQgZGF0YSBwb3J0Iik7CisKK21vZHVsZV9wYXJhbV9hcnJheShpcnEsIGludCwgTlVMTCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGlycSwgIklSUSBudW1iZXIiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGNsaywgaW50LCBOVUxMLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoY2xrLCAiRXh0ZXJuYWwgb3NjaWxsYXRvciBjbG9jayBmcmVxdWVuY3kgIgorCQkgIihkZWZhdWx0PTE2MDAwMDAwIFsxNiBNSHpdKSIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoY2lyLCBieXRlLCBOVUxMLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoY2lyLCAiQ1BVIGludGVyZmFjZSByZWdpc3RlciAoZGVmYXVsdD0weDQwIFtEU0NdKSIpOworCittb2R1bGVfcGFyYW1fYXJyYXkoY29yLCBieXRlLCBOVUxMLCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoY29yLCAiQ2xvY2tvdXQgcmVnaXN0ZXIgKGRlZmF1bHQ9MHgwMCkiKTsKKworbW9kdWxlX3BhcmFtX2FycmF5KGJjciwgYnl0ZSwgTlVMTCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGJjciwgIkJ1cyBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIChkZWZhdWx0PTB4NDAgW0NCWV0pIik7CisKKyNkZWZpbmUgQ0M3NzBfSU9TSVpFICAgICAgICAgIDB4MjAKKyNkZWZpbmUgQ0M3NzBfSU9TSVpFX0lORElSRUNUIDB4MDIKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNjNzcwX2lzYV9kZXZzW01BWERFVl07CisKK3N0YXRpYyB1OCBjYzc3MF9pc2FfbWVtX3JlYWRfcmVnKGNvbnN0IHN0cnVjdCBjYzc3MF9wcml2ICpwcml2LCBpbnQgcmVnKQoreworCXJldHVybiByZWFkYihwcml2LT5yZWdfYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB2b2lkIGNjNzcwX2lzYV9tZW1fd3JpdGVfcmVnKGNvbnN0IHN0cnVjdCBjYzc3MF9wcml2ICpwcml2LAorCQkJCSAgICAgIGludCByZWcsIHU4IHZhbCkKK3sKKwl3cml0ZWIodmFsLCBwcml2LT5yZWdfYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyB1OCBjYzc3MF9pc2FfcG9ydF9yZWFkX3JlZyhjb25zdCBzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdiwgaW50IHJlZykKK3sKKwlyZXR1cm4gaW5iKCh1bnNpZ25lZCBsb25nKXByaXYtPnJlZ19iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgY2M3NzBfaXNhX3BvcnRfd3JpdGVfcmVnKGNvbnN0IHN0cnVjdCBjYzc3MF9wcml2ICpwcml2LAorCQkJCSAgICAgICBpbnQgcmVnLCB1OCB2YWwpCit7CisJb3V0Yih2YWwsICh1bnNpZ25lZCBsb25nKXByaXYtPnJlZ19iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHU4IGNjNzcwX2lzYV9wb3J0X3JlYWRfcmVnX2luZGlyZWN0KGNvbnN0IHN0cnVjdCBjYzc3MF9wcml2ICpwcml2LAorCQkJCQkgICAgIGludCByZWcpCit7CisJdW5zaWduZWQgbG9uZyBiYXNlID0gKHVuc2lnbmVkIGxvbmcpcHJpdi0+cmVnX2Jhc2U7CisKKwlvdXRiKHJlZywgYmFzZSk7CisJcmV0dXJuIGluYihiYXNlICsgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGNjNzcwX2lzYV9wb3J0X3dyaXRlX3JlZ19pbmRpcmVjdChjb25zdCBzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdiwKKwkJCQkJCWludCByZWcsIHU4IHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGJhc2UgPSAodW5zaWduZWQgbG9uZylwcml2LT5yZWdfYmFzZTsKKworCW91dGIocmVnLCBiYXNlKTsKKwlvdXRiKHZhbCwgYmFzZSArIDEpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjYzc3MF9pc2FfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBjYzc3MF9wcml2ICpwcml2OworCXZvaWQgX19pb21lbSAqYmFzZSA9IE5VTEw7CisJaW50IGlvc2l6ZSA9IENDNzcwX0lPU0laRTsKKwlpbnQgaWR4ID0gcGRldi0+aWQ7CisJaW50IGVycjsKKwl1MzIgY2xrdG1wOworCisJZGV2X2RiZygmcGRldi0+ZGV2LCAicHJvYmluZyBpZHg9JWQ6IHBvcnQ9JSNseCwgbWVtPSUjbHgsIGlycT0lZFxuIiwKKwkJaWR4LCBwb3J0W2lkeF0sIG1lbVtpZHhdLCBpcnFbaWR4XSk7CisJaWYgKG1lbVtpZHhdKSB7CisJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbVtpZHhdLCBpb3NpemUsIEtCVUlMRF9NT0ROQU1FKSkgeworCQkJZXJyID0gLUVCVVNZOworCQkJZ290byBleGl0OworCQl9CisJCWJhc2UgPSBpb3JlbWFwX25vY2FjaGUobWVtW2lkeF0sIGlvc2l6ZSk7CisJCWlmICghYmFzZSkgeworCQkJZXJyID0gLUVOT01FTTsKKwkJCWdvdG8gZXhpdF9yZWxlYXNlOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGluZGlyZWN0W2lkeF0gPiAwIHx8CisJCSAgICAoaW5kaXJlY3RbaWR4XSA9PSAtMSAmJiBpbmRpcmVjdFswXSA+IDApKQorCQkJaW9zaXplID0gQ0M3NzBfSU9TSVpFX0lORElSRUNUOworCQlpZiAoIXJlcXVlc3RfcmVnaW9uKHBvcnRbaWR4XSwgaW9zaXplLCBLQlVJTERfTU9ETkFNRSkpIHsKKwkJCWVyciA9IC1FQlVTWTsKKwkJCWdvdG8gZXhpdDsKKwkJfQorCX0KKworCWRldiA9IGFsbG9jX2NjNzcwZGV2KDApOworCWlmICghZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdF91bm1hcDsKKwl9CisJcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlkZXYtPmlycSA9IGlycVtpZHhdOworCXByaXYtPmlycV9mbGFncyA9IElSUUZfU0hBUkVEOworCWlmIChtZW1baWR4XSkgeworCQlwcml2LT5yZWdfYmFzZSA9IGJhc2U7CisJCWRldi0+YmFzZV9hZGRyID0gbWVtW2lkeF07CisJCXByaXYtPnJlYWRfcmVnID0gY2M3NzBfaXNhX21lbV9yZWFkX3JlZzsKKwkJcHJpdi0+d3JpdGVfcmVnID0gY2M3NzBfaXNhX21lbV93cml0ZV9yZWc7CisJfSBlbHNlIHsKKwkJcHJpdi0+cmVnX2Jhc2UgPSAodm9pZCBfX2lvbWVtICopcG9ydFtpZHhdOworCQlkZXYtPmJhc2VfYWRkciA9IHBvcnRbaWR4XTsKKworCQlpZiAoaW9zaXplID09IENDNzcwX0lPU0laRV9JTkRJUkVDVCkgeworCQkJcHJpdi0+cmVhZF9yZWcgPSBjYzc3MF9pc2FfcG9ydF9yZWFkX3JlZ19pbmRpcmVjdDsKKwkJCXByaXYtPndyaXRlX3JlZyA9IGNjNzcwX2lzYV9wb3J0X3dyaXRlX3JlZ19pbmRpcmVjdDsKKwkJfSBlbHNlIHsKKwkJCXByaXYtPnJlYWRfcmVnID0gY2M3NzBfaXNhX3BvcnRfcmVhZF9yZWc7CisJCQlwcml2LT53cml0ZV9yZWcgPSBjYzc3MF9pc2FfcG9ydF93cml0ZV9yZWc7CisJCX0KKwl9CisKKwlpZiAoY2xrW2lkeF0pCisJCWNsa3RtcCA9IGNsa1tpZHhdOworCWVsc2UgaWYgKGNsa1swXSkKKwkJY2xrdG1wID0gY2xrWzBdOworCWVsc2UKKwkJY2xrdG1wID0gQ0xLX0RFRkFVTFQ7CisJcHJpdi0+Y2FuLmNsb2NrLmZyZXEgPSBjbGt0bXA7CisKKwlpZiAoY2lyW2lkeF0gIT0gMHhmZikgeworCQlwcml2LT5jcHVfaW50ZXJmYWNlID0gY2lyW2lkeF07CisJfSBlbHNlIGlmIChjaXJbMF0gIT0gMHhmZikgeworCQlwcml2LT5jcHVfaW50ZXJmYWNlID0gY2lyWzBdOworCX0gZWxzZSB7CisJCS8qIFRoZSBzeXN0ZW0gY2xvY2sgbWF5IG5vdCBleGNlZWQgMTAgTUh6ICovCisJCWlmIChjbGt0bXAgPiAxMDAwMDAwMCkgeworCQkJcHJpdi0+Y3B1X2ludGVyZmFjZSB8PSBDUFVJRl9EU0M7CisJCQljbGt0bXAgLz0gMjsKKwkJfQorCQkvKiBUaGUgbWVtb3J5IGNsb2NrIG1heSBub3QgZXhjZWVkIDggTUh6ICovCisJCWlmIChjbGt0bXAgPiA4MDAwMDAwKQorCQkJcHJpdi0+Y3B1X2ludGVyZmFjZSB8PSBDUFVJRl9ETUM7CisJfQorCisJaWYgKHByaXYtPmNwdV9pbnRlcmZhY2UgJiBDUFVJRl9EU0MpCisJCXByaXYtPmNhbi5jbG9jay5mcmVxIC89IDI7CisKKwlpZiAoYmNyW2lkeF0gIT0gMHhmZikKKwkJcHJpdi0+YnVzX2NvbmZpZyA9IGJjcltpZHhdOworCWVsc2UgaWYgKGJjclswXSAhPSAweGZmKQorCQlwcml2LT5idXNfY29uZmlnID0gYmNyWzBdOworCWVsc2UKKwkJcHJpdi0+YnVzX2NvbmZpZyA9IEJDUl9ERUZBVUxUOworCisJaWYgKGNvcltpZHhdICE9IDB4ZmYpCisJCXByaXYtPmNsa291dCA9IGNvcltpZHhdOworCWVsc2UgaWYgKGNvclswXSAhPSAweGZmKQorCQlwcml2LT5jbGtvdXQgPSBjb3JbMF07CisJZWxzZQorCQlwcml2LT5jbGtvdXQgPSBDT1JfREVGQVVMVDsKKworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBkZXYpOworCVNFVF9ORVRERVZfREVWKGRldiwgJnBkZXYtPmRldik7CisKKwllcnIgPSByZWdpc3Rlcl9jYzc3MGRldihkZXYpOworCWlmIChlcnIpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LAorCQkJImNvdWxkbid0IHJlZ2lzdGVyIGRldmljZSAoZXJyPSVkKVxuIiwgZXJyKTsKKwkJZ290byBleGl0X3VubWFwOworCX0KKworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJkZXZpY2UgcmVnaXN0ZXJlZCAocmVnX2Jhc2U9MHglcCwgaXJxPSVkKVxuIiwKKwkJIHByaXYtPnJlZ19iYXNlLCBkZXYtPmlycSk7CisJcmV0dXJuIDA7CisKKyBleGl0X3VubWFwOgorCWlmIChtZW1baWR4XSkKKwkJaW91bm1hcChiYXNlKTsKKyBleGl0X3JlbGVhc2U6CisJaWYgKG1lbVtpZHhdKQorCQlyZWxlYXNlX21lbV9yZWdpb24obWVtW2lkeF0sIGlvc2l6ZSk7CisJZWxzZQorCQlyZWxlYXNlX3JlZ2lvbihwb3J0W2lkeF0sIGlvc2l6ZSk7CisgZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBjYzc3MF9pc2FfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGRldl9nZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2KTsKKwlzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlkeCA9IHBkZXYtPmlkOworCisJdW5yZWdpc3Rlcl9jYzc3MGRldihkZXYpOworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBOVUxMKTsKKworCWlmIChtZW1baWR4XSkgeworCQlpb3VubWFwKHByaXYtPnJlZ19iYXNlKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKG1lbVtpZHhdLCBDQzc3MF9JT1NJWkUpOworCX0gZWxzZSB7CisJCWlmIChwcml2LT5yZWFkX3JlZyA9PSBjYzc3MF9pc2FfcG9ydF9yZWFkX3JlZ19pbmRpcmVjdCkKKwkJCXJlbGVhc2VfcmVnaW9uKHBvcnRbaWR4XSwgQ0M3NzBfSU9TSVpFX0lORElSRUNUKTsKKwkJZWxzZQorCQkJcmVsZWFzZV9yZWdpb24ocG9ydFtpZHhdLCBDQzc3MF9JT1NJWkUpOworCX0KKwlmcmVlX2NjNzcwZGV2KGRldik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgY2M3NzBfaXNhX2RyaXZlciA9IHsKKwkucHJvYmUgPSBjYzc3MF9pc2FfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGNjNzcwX2lzYV9yZW1vdmUpLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gS0JVSUxEX01PRE5BTUUsCisJCS5vd25lciA9IFRISVNfTU9EVUxFLAorCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjYzc3MF9pc2FfaW5pdCh2b2lkKQoreworCWludCBpZHgsIGVycjsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShjYzc3MF9pc2FfZGV2cyk7IGlkeCsrKSB7CisJCWlmICgocG9ydFtpZHhdIHx8IG1lbVtpZHhdKSAmJiBpcnFbaWR4XSkgeworCQkJY2M3NzBfaXNhX2RldnNbaWR4XSA9CisJCQkJcGxhdGZvcm1fZGV2aWNlX2FsbG9jKEtCVUlMRF9NT0ROQU1FLCBpZHgpOworCQkJaWYgKCFjYzc3MF9pc2FfZGV2c1tpZHhdKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIGV4aXRfZnJlZV9kZXZpY2VzOworCQkJfQorCQkJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChjYzc3MF9pc2FfZGV2c1tpZHhdKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlwbGF0Zm9ybV9kZXZpY2VfcHV0KGNjNzcwX2lzYV9kZXZzW2lkeF0pOworCQkJCWdvdG8gZXhpdF9mcmVlX2RldmljZXM7CisJCQl9CisJCQlwcl9kZWJ1ZygicGxhdGZvcm0gZGV2aWNlICVkOiBwb3J0PSUjbHgsIG1lbT0lI2x4LCAiCisJCQkJICJpcnE9JWRcbiIsCisJCQkJIGlkeCwgcG9ydFtpZHhdLCBtZW1baWR4XSwgaXJxW2lkeF0pOworCQl9IGVsc2UgaWYgKGlkeCA9PSAwIHx8IHBvcnRbaWR4XSB8fCBtZW1baWR4XSkgeworCQkJcHJfZXJyKCJpbnN1ZmZpY2llbnQgcGFyYW1ldGVycyBzdXBwbGllZFxuIik7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBleGl0X2ZyZWVfZGV2aWNlczsKKwkJfQorCX0KKworCWVyciA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmY2M3NzBfaXNhX2RyaXZlcik7CisJaWYgKGVycikKKwkJZ290byBleGl0X2ZyZWVfZGV2aWNlczsKKworCXByX2luZm8oImRyaXZlciBmb3IgbWF4LiAlZCBkZXZpY2VzIHJlZ2lzdGVyZWRcbiIsIE1BWERFVik7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlX2RldmljZXM6CisJd2hpbGUgKC0taWR4ID49IDApIHsKKwkJaWYgKGNjNzcwX2lzYV9kZXZzW2lkeF0pCisJCQlwbGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcihjYzc3MF9pc2FfZGV2c1tpZHhdKTsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorbW9kdWxlX2luaXQoY2M3NzBfaXNhX2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2M3NzBfaXNhX2V4aXQodm9pZCkKK3sKKwlpbnQgaWR4OworCisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmNjNzcwX2lzYV9kcml2ZXIpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgQVJSQVlfU0laRShjYzc3MF9pc2FfZGV2cyk7IGlkeCsrKSB7CisJCWlmIChjYzc3MF9pc2FfZGV2c1tpZHhdKQorCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoY2M3NzBfaXNhX2RldnNbaWR4XSk7CisJfQorfQorbW9kdWxlX2V4aXQoY2M3NzBfaXNhX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2NjNzcwL2NjNzcwX3BsYXRmb3JtLmMgYi9kcml2ZXJzL25ldC9jYW4vY2M3NzAvY2M3NzBfcGxhdGZvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzExNWVlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvY2FuL2NjNzcwL2NjNzcwX3BsYXRmb3JtLmMKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiBEcml2ZXIgZm9yIENDNzcwIGFuZCBBTjgyNTI3IENBTiBjb250cm9sbGVycyBvbiB0aGUgcGxhdGZvcm0gYnVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDExIFdvbGZnYW5nIEdyYW5kZWdnZXIgPHdnQGdyYW5kZWdnZXIuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKy8qCisgKiBJZiBwbGF0Zm9ybSBkYXRhIGFyZSB1c2VkIHlvdSBzaG91bGQgaGF2ZSBzaW1pbGFyIGRlZmluaXRpb25zCisgKiBpbiB5b3VyIGJvYXJkLXNwZWNpZmljIGNvZGU6CisgKgorICogICBzdGF0aWMgc3RydWN0IGNjNzcwX3BsYXRmb3JtX2RhdGEgbXlib2FyZF9jYzc3MF9wZGF0YSA9IHsKKyAqICAgICAgICAgICAub3NjX2ZyZXEgPSAxNjAwMDAwMCwKKyAqICAgICAgICAgICAuY2lyID0gMHg0MSwKKyAqICAgICAgICAgICAuY29yID0gMHgyMCwKKyAqICAgICAgICAgICAuYmNyID0gMHg0MCwKKyAqICAgfTsKKyAqCisgKiBQbGVhc2Ugc2VlIGluY2x1ZGUvbGludXgvY2FuL3BsYXRmb3JtL2NjNzcwLmggZm9yIGRlc2NyaXB0aW9uIG9mCisgKiBhYm92ZSBmaWVsZHMuCisgKgorICogSWYgdGhlIGRldmljZSB0cmVlIGlzIHVzZWQsIHlvdSBuZWVkIGEgQ0FOIG5vZGUgZGVmaW5pdGlvbiBpbiB5b3VyCisgKiBEVFMgZmlsZSBzaW1pbGFyIHRvOgorICoKKyAqICAgY2FuQDMsMTAwIHsKKyAqICAgICAgICAgICBjb21wYXRpYmxlID0gImJvc2NoLGNjNzcwIjsKKyAqICAgICAgICAgICByZWcgPSA8MyAweDEwMCAweDgwPjsKKyAqICAgICAgICAgICBpbnRlcnJ1cHRzID0gPDIgMD47CisgKiAgICAgICAgICAgaW50ZXJydXB0LXBhcmVudCA9IDwmbXBpYz47CisgKiAgICAgICAgICAgYm9zY2gsZXh0ZXJuYWwtY2xvY2stZnJlcXVlbmN5ID0gPDE2MDAwMDAwPjsKKyAqICAgfTsKKyAqCisgKiBTZWUgIkRvY3VtZW50YXRpb24vZGV2aWNldHJlZS9iaW5kaW5ncy9uZXQvY2FuL2NjNzcwLnR4dCIgZm9yIGZ1cnRoZXIKKyAqIGluZm9ybWF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvY2FuLmg+CisjaW5jbHVkZSA8bGludXgvY2FuL2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2Nhbi9wbGF0Zm9ybS9jYzc3MC5oPgorCisjaW5jbHVkZSAiY2M3NzAuaCIKKworI2RlZmluZSBEUlZfTkFNRSAiY2M3NzBfcGxhdGZvcm0iCisKK01PRFVMRV9BVVRIT1IoIldvbGZnYW5nIEdyYW5kZWdnZXIgPHdnQGdyYW5kZWdnZXIuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTb2NrZXQtQ0FOIGRyaXZlciBmb3IgQ0M3NzAgb24gdGhlIHBsYXRmb3JtIGJ1cyIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworCisjZGVmaW5lIENDNzcwX1BMQVRGT1JNX0NBTl9DTE9DSyAgMTYwMDAwMDAKKworc3RhdGljIHU4IGNjNzcwX3BsYXRmb3JtX3JlYWRfcmVnKGNvbnN0IHN0cnVjdCBjYzc3MF9wcml2ICpwcml2LCBpbnQgcmVnKQoreworCXJldHVybiBpb3JlYWQ4KHByaXYtPnJlZ19iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHZvaWQgY2M3NzBfcGxhdGZvcm1fd3JpdGVfcmVnKGNvbnN0IHN0cnVjdCBjYzc3MF9wcml2ICpwcml2LCBpbnQgcmVnLAorCQkJCSAgICAgdTggdmFsKQoreworCWlvd3JpdGU4KHZhbCwgcHJpdi0+cmVnX2Jhc2UgKyByZWcpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjYzc3MF9nZXRfb2Zfbm9kZV9kYXRhKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCisJCQkJCSAgICBzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wID0gcGRldi0+ZGV2Lm9mX25vZGU7CisJY29uc3QgdTMyICpwcm9wOworCWludCBwcm9wX3NpemU7CisJdTMyIGNsa2V4dDsKKworCXByb3AgPSBvZl9nZXRfcHJvcGVydHkobnAsICJib3NjaCxleHRlcm5hbC1jbG9jay1mcmVxdWVuY3kiLAorCQkJICAgICAgICZwcm9wX3NpemUpOworCWlmIChwcm9wICYmIChwcm9wX3NpemUgPT0gIHNpemVvZih1MzIpKSkKKwkJY2xrZXh0ID0gKnByb3A7CisJZWxzZQorCQljbGtleHQgPSBDQzc3MF9QTEFURk9STV9DQU5fQ0xPQ0s7IC8qIGRlZmF1bHQgKi8KKwlwcml2LT5jYW4uY2xvY2suZnJlcSA9IGNsa2V4dDsKKworCS8qIFRoZSBzeXN0ZW0gY2xvY2sgbWF5IG5vdCBleGNlZWQgMTAgTUh6ICovCisJaWYgKHByaXYtPmNhbi5jbG9jay5mcmVxID4gMTAwMDAwMDApIHsKKwkJcHJpdi0+Y3B1X2ludGVyZmFjZSB8PSBDUFVJRl9EU0M7CisJCXByaXYtPmNhbi5jbG9jay5mcmVxIC89IDI7CisJfQorCisJLyogVGhlIG1lbW9yeSBjbG9jayBtYXkgbm90IGV4Y2VlZCA4IE1IeiAqLworCWlmIChwcml2LT5jYW4uY2xvY2suZnJlcSA+IDgwMDAwMDApCisJCXByaXYtPmNwdV9pbnRlcmZhY2UgfD0gQ1BVSUZfRE1DOworCisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImJvc2NoLGRpdmlkZS1tZW1vcnktY2xvY2siLCBOVUxMKSkKKwkJcHJpdi0+Y3B1X2ludGVyZmFjZSB8PSBDUFVJRl9ETUM7CisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImJvc2NoLGlzby1sb3ctc3BlZWQtbXV4IiwgTlVMTCkpCisJCXByaXYtPmNwdV9pbnRlcmZhY2UgfD0gQ1BVSUZfTVVYOworCisJaWYgKCFvZl9nZXRfcHJvcGVydHkobnAsICJib3NjaCxuby1jb21wZXJhdG9yLWJ5cGFzcyIsIE5VTEwpKQorCQlwcml2LT5idXNfY29uZmlnIHw9IEJVU0NGR19DQlk7CisJaWYgKG9mX2dldF9wcm9wZXJ0eShucCwgImJvc2NoLGRpc2Nvbm5lY3QtcngwLWlucHV0IiwgTlVMTCkpCisJCXByaXYtPmJ1c19jb25maWcgfD0gQlVTQ0ZHX0RSMDsKKwlpZiAob2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYm9zY2gsZGlzY29ubmVjdC1yeDEtaW5wdXQiLCBOVUxMKSkKKwkJcHJpdi0+YnVzX2NvbmZpZyB8PSBCVVNDRkdfRFIxOworCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJib3NjaCxkaXNjb25uZWN0LXR4MS1vdXRwdXQiLCBOVUxMKSkKKwkJcHJpdi0+YnVzX2NvbmZpZyB8PSBCVVNDRkdfRFQxOworCWlmIChvZl9nZXRfcHJvcGVydHkobnAsICJib3NjaCxwb2xhcml0eS1kb21pbmFudCIsIE5VTEwpKQorCQlwcml2LT5idXNfY29uZmlnIHw9IEJVU0NGR19QT0w7CisKKwlwcm9wID0gb2ZfZ2V0X3Byb3BlcnR5KG5wLCAiYm9zY2gsY2xvY2stb3V0LWZyZXF1ZW5jeSIsICZwcm9wX3NpemUpOworCWlmIChwcm9wICYmIChwcm9wX3NpemUgPT0gc2l6ZW9mKHUzMikpICYmICpwcm9wID4gMCkgeworCQl1MzIgY2R2ID0gY2xrZXh0IC8gKnByb3A7CisJCWludCBzbGV3OworCisJCWlmIChjZHYgPiAwICYmIGNkdiA8IDE2KSB7CisJCQlwcml2LT5jcHVfaW50ZXJmYWNlIHw9IENQVUlGX0NFTjsKKwkJCXByaXYtPmNsa291dCB8PSAoY2R2IC0gMSkgJiBDTEtPVVRfQ0RfTUFTSzsKKworCQkJcHJvcCA9IG9mX2dldF9wcm9wZXJ0eShucCwgImJvc2NoLHNsZXctcmF0ZSIsCisJCQkJCSAgICAgICAmcHJvcF9zaXplKTsKKwkJCWlmIChwcm9wICYmIChwcm9wX3NpemUgPT0gc2l6ZW9mKHUzMikpKSB7CisJCQkJc2xldyA9ICpwcm9wOworCQkJfSBlbHNlIHsKKwkJCQkvKiBEZXRlcm1pbmUgZGVmYXVsdCBzbGV3IHJhdGUgKi8KKwkJCQlzbGV3ID0gKENMS09VVF9TTF9NQVNLID4+CisJCQkJCUNMS09VVF9TTF9TSElGVCkgLQorCQkJCQkoKGNkdiAqIGNsa2V4dCAtIDEpIC8gODAwMDAwMCk7CisJCQkJaWYgKHNsZXcgPCAwKQorCQkJCQlzbGV3ID0gMDsKKwkJCX0KKwkJCXByaXYtPmNsa291dCB8PSAoc2xldyA8PCBDTEtPVVRfU0xfU0hJRlQpICYKKwkJCQlDTEtPVVRfU0xfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCWRldl9kYmcoJnBkZXYtPmRldiwgImludmFsaWQgY2xvY2stb3V0LWZyZXF1ZW5jeVxuIik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgY2M3NzBfZ2V0X3BsYXRmb3JtX2RhdGEoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwKKwkJCQkJICAgICBzdHJ1Y3QgY2M3NzBfcHJpdiAqcHJpdikKK3sKKworCXN0cnVjdCBjYzc3MF9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCisJcHJpdi0+Y2FuLmNsb2NrLmZyZXEgPSBwZGF0YS0+b3NjX2ZyZXE7CisJaWYgKHByaXYtPmNwdV9pbnRlcmZhY2UgfCBDUFVJRl9EU0MpCisJCXByaXYtPmNhbi5jbG9jay5mcmVxIC89IDI7CisJcHJpdi0+Y2xrb3V0ID0gcGRhdGEtPmNvcjsKKwlwcml2LT5idXNfY29uZmlnID0gcGRhdGEtPmJjcjsKKwlwcml2LT5jcHVfaW50ZXJmYWNlID0gcGRhdGEtPmNpcjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjYzc3MF9wbGF0Zm9ybV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGNjNzcwX3ByaXYgKnByaXY7CisJc3RydWN0IHJlc291cmNlICptZW07CisJcmVzb3VyY2Vfc2l6ZV90IG1lbV9zaXplOworCXZvaWQgX19pb21lbSAqYmFzZTsKKwlpbnQgZXJyLCBpcnE7CisKKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCWlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKCFtZW0gfHwgaXJxIDw9IDApCisJCXJldHVybiAtRU5PREVWOworCisJbWVtX3NpemUgPSByZXNvdXJjZV9zaXplKG1lbSk7CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24obWVtLT5zdGFydCwgbWVtX3NpemUsIHBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJYmFzZSA9IGlvcmVtYXAobWVtLT5zdGFydCwgbWVtX3NpemUpOworCWlmICghYmFzZSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGV4aXRfcmVsZWFzZV9tZW07CisJfQorCisJZGV2ID0gYWxsb2NfY2M3NzBkZXYoMCk7CisJaWYgKCFkZXYpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBleGl0X3VubWFwX21lbTsKKwl9CisKKwlkZXYtPmlycSA9IGlycTsKKwlwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlwcml2LT5yZWFkX3JlZyA9IGNjNzcwX3BsYXRmb3JtX3JlYWRfcmVnOworCXByaXYtPndyaXRlX3JlZyA9IGNjNzcwX3BsYXRmb3JtX3dyaXRlX3JlZzsKKwlwcml2LT5pcnFfZmxhZ3MgPSBJUlFGX1NIQVJFRDsKKwlwcml2LT5yZWdfYmFzZSA9IGJhc2U7CisKKwlpZiAocGRldi0+ZGV2Lm9mX25vZGUpCisJCWVyciA9IGNjNzcwX2dldF9vZl9ub2RlX2RhdGEocGRldiwgcHJpdik7CisJZWxzZSBpZiAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpCisJCWVyciA9IGNjNzcwX2dldF9wbGF0Zm9ybV9kYXRhKHBkZXYsIHByaXYpOworCWVsc2UKKwkJZXJyID0gLUVOT0RFVjsKKwlpZiAoZXJyKQorCQlnb3RvIGV4aXRfZnJlZV9jYzc3MDsKKworCWRldl9kYmcoJnBkZXYtPmRldiwKKwkJICJyZWdfYmFzZT0weCVwIGlycT0lZCBjbG9jaz0lZCBjcHVfaW50ZXJmYWNlPTB4JTAyeCAiCisJCSAiYnVzX2NvbmZpZz0weCUwMnggY2xrb3V0PTB4JTAyeFxuIiwKKwkJIHByaXYtPnJlZ19iYXNlLCBkZXYtPmlycSwgcHJpdi0+Y2FuLmNsb2NrLmZyZXEsCisJCSBwcml2LT5jcHVfaW50ZXJmYWNlLCBwcml2LT5idXNfY29uZmlnLCBwcml2LT5jbGtvdXQpOworCisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKKworCWVyciA9IHJlZ2lzdGVyX2NjNzcwZGV2KGRldik7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsCisJCQkiY291bGRuJ3QgcmVnaXN0ZXIgQ0M3MDAgZGV2aWNlIChlcnI9JWQpXG4iLCBlcnIpOworCQlnb3RvIGV4aXRfZnJlZV9jYzc3MDsKKwl9CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlX2NjNzcwOgorCWZyZWVfY2M3NzBkZXYoZGV2KTsKK2V4aXRfdW5tYXBfbWVtOgorCWlvdW5tYXAoYmFzZSk7CitleGl0X3JlbGVhc2VfbWVtOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCBtZW1fc2l6ZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBjYzc3MF9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpOworCXN0cnVjdCBjYzc3MF9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgcmVzb3VyY2UgKm1lbTsKKworCXVucmVnaXN0ZXJfY2M3NzBkZXYoZGV2KTsKKwlpb3VubWFwKHByaXYtPnJlZ19iYXNlKTsKKwlmcmVlX2NjNzcwZGV2KGRldik7CisKKwltZW0gPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihtZW0tPnN0YXJ0LCByZXNvdXJjZV9zaXplKG1lbSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIF9fZGV2aW5pdGRhdGEgY2M3NzBfcGxhdGZvcm1fdGFibGVbXSA9IHsKKwl7LmNvbXBhdGlibGUgPSAiYm9zY2gsY2M3NzAifSwgLyogQ0M3NzAgZnJvbSBCb3NjaCAqLworCXsuY29tcGF0aWJsZSA9ICJpbnRjLDgyNTI3In0sICAvKiBBTjgyNTI3IGZyb20gSW50ZWwgQ1AgKi8KKwl7fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGNjNzcwX3BsYXRmb3JtX2RyaXZlciA9IHsKKwkuZHJpdmVyID0geworCQkubmFtZSA9IERSVl9OQU1FLAorCQkub3duZXIgPSBUSElTX01PRFVMRSwKKwkJLm9mX21hdGNoX3RhYmxlID0gY2M3NzBfcGxhdGZvcm1fdGFibGUsCisJfSwKKwkucHJvYmUgPSBjYzc3MF9wbGF0Zm9ybV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoY2M3NzBfcGxhdGZvcm1fcmVtb3ZlKSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoY2M3NzBfcGxhdGZvcm1fZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9kZXYuYyBiL2RyaXZlcnMvbmV0L2Nhbi9kZXYuYwppbmRleCAyNTY5NWJkLi4xMjBmMWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL2Rldi5jCkBAIC00NTQsNyArNDU0LDcgQEAKIAogCS8qIE5ldy1zdHlsZSBmbGFncy4gKi8KIAlkZXYtPmZsYWdzID0gSUZGX05PQVJQOwotCWRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX05PX0NTVU07CisJZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfSFdfQ1NVTTsKIH0KIAogc3RydWN0IHNrX2J1ZmYgKmFsbG9jX2Nhbl9za2Ioc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNhbl9mcmFtZSAqKmNmKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2ZsZXhjYW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9mbGV4Y2FuLmMKaW5kZXggZTAyMzM3OS4uMTY1YTRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2ZsZXhjYW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vZmxleGNhbi5jCkBAIC0xMDYwLDIwICsxMDYwLDcgQEAKIAkucmVtb3ZlID0gX19kZXZleGl0X3AoZmxleGNhbl9yZW1vdmUpLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgZmxleGNhbl9pbml0KHZvaWQpCi17Ci0JcHJfaW5mbygiJXMgbmV0ZGV2aWNlIGRyaXZlclxuIiwgRFJWX05BTUUpOwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmZsZXhjYW5fZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGZsZXhjYW5fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmbGV4Y2FuX2RyaXZlcik7Ci0JcHJfaW5mbygiJXM6IGRyaXZlciByZW1vdmVkXG4iLCBEUlZfTkFNRSk7Ci19Ci0KLW1vZHVsZV9pbml0KGZsZXhjYW5faW5pdCk7Ci1tb2R1bGVfZXhpdChmbGV4Y2FuX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihmbGV4Y2FuX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIlNhc2NoYSBIYXVlciA8a2VybmVsQHBlbmd1dHJvbml4LmRlPiwgIgogCSAgICAgICJNYXJjIEtsZWluZS1CdWRkZSA8a2VybmVsQHBlbmd1dHJvbml4LmRlPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL2phbnotaWNhbjMuYyBiL2RyaXZlcnMvbmV0L2Nhbi9qYW56LWljYW4zLmMKaW5kZXggMzI3NzhkNS4uMDhjODkzYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL2phbnotaWNhbjMuYworKysgYi9kcml2ZXJzL25ldC9jYW4vamFuei1pY2FuMy5jCkBAIC0xODAzLDIwICsxODAzLDkgQEAKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGljYW4zX3JlbW92ZSksCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBpY2FuM19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmaWNhbjNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGljYW4zX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaWNhbjNfZHJpdmVyKTsKLX0KK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoaWNhbjNfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiSXJhIFcuIFNueWRlciA8aXdzQG92cm8uY2FsdGVjaC5lZHU+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkphbnogTU9EVUxidXMgVk1PRC1JQ0FOMyBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9BTElBUygicGxhdGZvcm06amFuei1pY2FuMyIpOwotCi1tb2R1bGVfaW5pdChpY2FuM19pbml0KTsKLW1vZHVsZV9leGl0KGljYW4zX2V4aXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL21zY2FuL21wYzV4eHhfY2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vbXNjYW4vbXBjNXh4eF9jYW4uYwppbmRleCA1ZmVkYzMzLi41Y2FhNTcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vbXNjYW4vbXBjNXh4eF9jYW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vbXNjYW4vbXBjNXh4eF9jYW4uYwpAQCAtNDExLDE3ICs0MTEsNyBAQAogI2VuZGlmCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBtcGM1eHh4X2Nhbl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmbXBjNXh4eF9jYW5fZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KG1wYzV4eHhfY2FuX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgbXBjNXh4eF9jYW5fZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtcGM1eHh4X2Nhbl9kcml2ZXIpOwotfTsKLW1vZHVsZV9leGl0KG1wYzV4eHhfY2FuX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihtcGM1eHh4X2Nhbl9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJXb2xmZ2FuZyBHcmFuZGVnZ2VyIDx3Z0BncmFuZGVnZ2VyLmNvbT4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRnJlZXNjYWxlIE1QQzV4eHggQ0FOIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL21zY2FuL21zY2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vbXNjYW4vbXNjYW4uYwppbmRleCBlYzRhMzExLi4xYzgyZGQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vbXNjYW4vbXNjYW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vbXNjYW4vbXNjYW4uYwpAQCAtNTgxLDcgKzU4MSwxMCBAQAogCiAJcHJpdi0+b3Blbl90aW1lID0gamlmZmllczsKIAotCWNscmJpdHM4KCZyZWdzLT5jYW5jdGwxLCBNU0NBTl9MSVNURU4pOworCWlmIChwcml2LT5jYW4uY3RybG1vZGUgJiBDQU5fQ1RSTE1PREVfTElTVEVOT05MWSkKKwkJc2V0Yml0czgoJnJlZ3MtPmNhbmN0bDEsIE1TQ0FOX0xJU1RFTik7CisJZWxzZQorCQljbHJiaXRzOCgmcmVncy0+Y2FuY3RsMSwgTVNDQU5fTElTVEVOKTsKIAogCXJldCA9IG1zY2FuX3N0YXJ0KGRldik7CiAJaWYgKHJldCkKQEAgLTY5MCw3ICs2OTMsOCBAQAogCXByaXYtPmNhbi5iaXR0aW1pbmdfY29uc3QgPSAmbXNjYW5fYml0dGltaW5nX2NvbnN0OwogCXByaXYtPmNhbi5kb19zZXRfYml0dGltaW5nID0gbXNjYW5fZG9fc2V0X2JpdHRpbWluZzsKIAlwcml2LT5jYW4uZG9fc2V0X21vZGUgPSBtc2Nhbl9kb19zZXRfbW9kZTsKLQlwcml2LT5jYW4uY3RybG1vZGVfc3VwcG9ydGVkID0gQ0FOX0NUUkxNT0RFXzNfU0FNUExFUzsKKwlwcml2LT5jYW4uY3RybG1vZGVfc3VwcG9ydGVkID0gQ0FOX0NUUkxNT0RFXzNfU0FNUExFUyB8CisJCUNBTl9DVFJMTU9ERV9MSVNURU5PTkxZOwogCiAJZm9yIChpID0gMDsgaSA8IFRYX1FVRVVFX1NJWkU7IGkrKykgewogCQlwcml2LT50eF9xdWV1ZVtpXS5pZCA9IGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9LY29uZmlnIGIvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvS2NvbmZpZwppbmRleCBmZTllNjRkLi4zNmU5ZDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL0tjb25maWcKQEAgLTYsNyArNiw2IEBACiAKIGNvbmZpZyBDQU5fU0pBMTAwMF9JU0EKIAl0cmlzdGF0ZSAiSVNBIEJ1cyBiYXNlZCBsZWdhY3kgU0pBMTAwMCBkcml2ZXIiCi0JZGVwZW5kcyBvbiBJU0EKIAktLS1oZWxwLS0tCiAJICBUaGlzIGRyaXZlciBhZGRzIGxlZ2FjeSBzdXBwb3J0IGZvciBTSkExMDAwIGNoaXBzIGNvbm5lY3RlZCB0bwogCSAgdGhlIElTQSBidXMgdXNpbmcgSS9PIHBvcnQsIG1lbW9yeSBtYXBwZWQgb3IgaW5kaXJlY3QgYWNjZXNzLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvcGVha19wY2kuYyBiL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3BlYWtfcGNpLmMKaW5kZXggOTA1YmNlMC4uMmM3ZjUwMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvcGVha19wY2kuYworKysgYi9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9wZWFrX3BjaS5jCkBAIC0yMCw3ICsyMCw2IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3NqYTEwMDBfaXNhLmMgYi9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9zamExMDAwX2lzYS5jCmluZGV4IDQ5NjIyM2UuLjkwYzVjMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3NqYTEwMDBfaXNhLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvc2phMTAwMF9pc2EuYwpAQCAtMTcsNyArMTcsNyBAQAogCiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaXNhLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KQEAgLTQ0LDkgKzQ0LDkgQEAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIG1lbVtNQVhERVZdOwogc3RhdGljIGludCBfX2RldmluaXRkYXRhIGlycVtNQVhERVZdOwogc3RhdGljIGludCBfX2RldmluaXRkYXRhIGNsa1tNQVhERVZdOwotc3RhdGljIGNoYXIgX19kZXZpbml0ZGF0YSBjZHJbTUFYREVWXSA9IHtbMCAuLi4gKE1BWERFViAtIDEpXSA9IC0xfTsKLXN0YXRpYyBjaGFyIF9fZGV2aW5pdGRhdGEgb2NyW01BWERFVl0gPSB7WzAgLi4uIChNQVhERVYgLSAxKV0gPSAtMX07Ci1zdGF0aWMgY2hhciBfX2RldmluaXRkYXRhIGluZGlyZWN0W01BWERFVl0gPSB7WzAgLi4uIChNQVhERVYgLSAxKV0gPSAtMX07CitzdGF0aWMgdW5zaWduZWQgY2hhciBfX2RldmluaXRkYXRhIGNkcltNQVhERVZdID0ge1swIC4uLiAoTUFYREVWIC0gMSldID0gMHhmZn07CitzdGF0aWMgdW5zaWduZWQgY2hhciBfX2RldmluaXRkYXRhIG9jcltNQVhERVZdID0ge1swIC4uLiAoTUFYREVWIC0gMSldID0gMHhmZn07CitzdGF0aWMgaW50IF9fZGV2aW5pdGRhdGEgaW5kaXJlY3RbTUFYREVWXSA9IHtbMCAuLi4gKE1BWERFViAtIDEpXSA9IC0xfTsKIAogbW9kdWxlX3BhcmFtX2FycmF5KHBvcnQsIHVsb25nLCBOVUxMLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MocG9ydCwgIkkvTyBwb3J0IG51bWJlciIpOwpAQCAtNTQsNyArNTQsNyBAQAogbW9kdWxlX3BhcmFtX2FycmF5KG1lbSwgdWxvbmcsIE5VTEwsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhtZW0sICJJL08gbWVtb3J5IGFkZHJlc3MiKTsKIAotbW9kdWxlX3BhcmFtX2FycmF5KGluZGlyZWN0LCBieXRlLCBOVUxMLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9hcnJheShpbmRpcmVjdCwgaW50LCBOVUxMLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoaW5kaXJlY3QsICJJbmRpcmVjdCBhY2Nlc3MgdmlhIGFkZHJlc3MgYW5kIGRhdGEgcG9ydCIpOwogCiBtb2R1bGVfcGFyYW1fYXJyYXkoaXJxLCBpbnQsIE5VTEwsIFNfSVJVR08pOwpAQCAtNzUsNiArNzUsOCBAQAogI2RlZmluZSBTSkExMDAwX0lPU0laRSAgICAgICAgICAweDIwCiAjZGVmaW5lIFNKQTEwMDBfSU9TSVpFX0lORElSRUNUIDB4MDIKIAorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNqYTEwMDBfaXNhX2RldnNbTUFYREVWXTsKKwogc3RhdGljIHU4IHNqYTEwMDBfaXNhX21lbV9yZWFkX3JlZyhjb25zdCBzdHJ1Y3Qgc2phMTAwMF9wcml2ICpwcml2LCBpbnQgcmVnKQogewogCXJldHVybiByZWFkYihwcml2LT5yZWdfYmFzZSArIHJlZyk7CkBAIC0xMTUsMjYgKzExNywxOCBAQAogCW91dGIodmFsLCBiYXNlICsgMSk7CiB9CiAKLXN0YXRpYyBpbnQgX19kZXZpbml0IHNqYTEwMDBfaXNhX21hdGNoKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBpZHgpCi17Ci0JaWYgKHBvcnRbaWR4XSB8fCBtZW1baWR4XSkgewotCQlpZiAoaXJxW2lkeF0pCi0JCQlyZXR1cm4gMTsKLQl9IGVsc2UgaWYgKGlkeCkKLQkJcmV0dXJuIDA7Ci0KLQlkZXZfZXJyKHBkZXYsICJpbnN1ZmZpY2llbnQgcGFyYW1ldGVycyBzdXBwbGllZFxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHNqYTEwMDBfaXNhX3Byb2JlKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBpZHgpCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzamExMDAwX2lzYV9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CiAJc3RydWN0IHNqYTEwMDBfcHJpdiAqcHJpdjsKIAl2b2lkIF9faW9tZW0gKmJhc2UgPSBOVUxMOwogCWludCBpb3NpemUgPSBTSkExMDAwX0lPU0laRTsKKwlpbnQgaWR4ID0gcGRldi0+aWQ7CiAJaW50IGVycjsKIAorCWRldl9kYmcoJnBkZXYtPmRldiwgInByb2JpbmcgaWR4PSVkOiBwb3J0PSUjbHgsIG1lbT0lI2x4LCBpcnE9JWRcbiIsCisJCWlkeCwgcG9ydFtpZHhdLCBtZW1baWR4XSwgaXJxW2lkeF0pOworCiAJaWYgKG1lbVtpZHhdKSB7CiAJCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKG1lbVtpZHhdLCBpb3NpemUsIERSVl9OQU1FKSkgewogCQkJZXJyID0gLUVCVVNZOwpAQCAtMTg5LDMxICsxODMsMzEgQEAKIAllbHNlCiAJCXByaXYtPmNhbi5jbG9jay5mcmVxID0gQ0xLX0RFRkFVTFQgLyAyOwogCi0JaWYgKG9jcltpZHhdICE9IC0xKQotCQlwcml2LT5vY3IgPSBvY3JbaWR4XSAmIDB4ZmY7Ci0JZWxzZSBpZiAob2NyWzBdICE9IC0xKQotCQlwcml2LT5vY3IgPSBvY3JbMF0gJiAweGZmOworCWlmIChvY3JbaWR4XSAhPSAweGZmKQorCQlwcml2LT5vY3IgPSBvY3JbaWR4XTsKKwllbHNlIGlmIChvY3JbMF0gIT0gMHhmZikKKwkJcHJpdi0+b2NyID0gb2NyWzBdOwogCWVsc2UKIAkJcHJpdi0+b2NyID0gT0NSX0RFRkFVTFQ7CiAKLQlpZiAoY2RyW2lkeF0gIT0gLTEpCi0JCXByaXYtPmNkciA9IGNkcltpZHhdICYgMHhmZjsKLQllbHNlIGlmIChjZHJbMF0gIT0gLTEpCi0JCXByaXYtPmNkciA9IGNkclswXSAmIDB4ZmY7CisJaWYgKGNkcltpZHhdICE9IDB4ZmYpCisJCXByaXYtPmNkciA9IGNkcltpZHhdOworCWVsc2UgaWYgKGNkclswXSAhPSAweGZmKQorCQlwcml2LT5jZHIgPSBjZHJbMF07CiAJZWxzZQogCQlwcml2LT5jZHIgPSBDRFJfREVGQVVMVDsKIAotCWRldl9zZXRfZHJ2ZGF0YShwZGV2LCBkZXYpOwotCVNFVF9ORVRERVZfREVWKGRldiwgcGRldik7CisJZGV2X3NldF9kcnZkYXRhKCZwZGV2LT5kZXYsIGRldik7CisJU0VUX05FVERFVl9ERVYoZGV2LCAmcGRldi0+ZGV2KTsKIAogCWVyciA9IHJlZ2lzdGVyX3NqYTEwMDBkZXYoZGV2KTsKIAlpZiAoZXJyKSB7Ci0JCWRldl9lcnIocGRldiwgInJlZ2lzdGVyaW5nICVzIGZhaWxlZCAoZXJyPSVkKVxuIiwKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAicmVnaXN0ZXJpbmcgJXMgZmFpbGVkIChlcnI9JWQpXG4iLAogCQkJRFJWX05BTUUsIGVycik7CiAJCWdvdG8gZXhpdF91bm1hcDsKIAl9CiAKLQlkZXZfaW5mbyhwZGV2LCAiJXMgZGV2aWNlIHJlZ2lzdGVyZWQgKHJlZ19iYXNlPTB4JXAsIGlycT0lZClcbiIsCisJZGV2X2luZm8oJnBkZXYtPmRldiwgIiVzIGRldmljZSByZWdpc3RlcmVkIChyZWdfYmFzZT0weCVwLCBpcnE9JWQpXG4iLAogCQkgRFJWX05BTUUsIHByaXYtPnJlZ19iYXNlLCBkZXYtPmlycSk7CiAJcmV0dXJuIDA7CiAKQEAgLTIyOSwxMyArMjIzLDE0IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCBfX2RldmV4aXQgc2phMTAwMF9pc2FfcmVtb3ZlKHN0cnVjdCBkZXZpY2UgKnBkZXYsIHVuc2lnbmVkIGludCBpZHgpCitzdGF0aWMgaW50IF9fZGV2ZXhpdCBzamExMDAwX2lzYV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gZGV2X2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfZ2V0X2RydmRhdGEoJnBkZXYtPmRldik7CiAJc3RydWN0IHNqYTEwMDBfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGlkeCA9IHBkZXYtPmlkOwogCiAJdW5yZWdpc3Rlcl9zamExMDAwZGV2KGRldik7Ci0JZGV2X3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCWRldl9zZXRfZHJ2ZGF0YSgmcGRldi0+ZGV2LCBOVUxMKTsKIAogCWlmIChtZW1baWR4XSkgewogCQlpb3VubWFwKHByaXYtPnJlZ19iYXNlKTsKQEAgLTI1MSwyOSArMjQ2LDcwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgaXNhX2RyaXZlciBzamExMDAwX2lzYV9kcml2ZXIgPSB7Ci0JLm1hdGNoID0gc2phMTAwMF9pc2FfbWF0Y2gsCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzamExMDAwX2lzYV9kcml2ZXIgPSB7CiAJLnByb2JlID0gc2phMTAwMF9pc2FfcHJvYmUsCiAJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHNqYTEwMDBfaXNhX3JlbW92ZSksCiAJLmRyaXZlciA9IHsKIAkJLm5hbWUgPSBEUlZfTkFNRSwKKwkJLm93bmVyID0gVEhJU19NT0RVTEUsCiAJfSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHNqYTEwMDBfaXNhX2luaXQodm9pZCkKIHsKLQlpbnQgZXJyID0gaXNhX3JlZ2lzdGVyX2RyaXZlcigmc2phMTAwMF9pc2FfZHJpdmVyLCBNQVhERVYpOworCWludCBpZHgsIGVycjsKIAotCWlmICghZXJyKQotCQlwcmludGsoS0VSTl9JTkZPCi0JCSAgICAgICAiTGVnYWN5ICVzIGRyaXZlciBmb3IgbWF4LiAlZCBkZXZpY2VzIHJlZ2lzdGVyZWRcbiIsCi0JCSAgICAgICBEUlZfTkFNRSwgTUFYREVWKTsKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWERFVjsgaWR4KyspIHsKKwkJaWYgKChwb3J0W2lkeF0gfHwgbWVtW2lkeF0pICYmIGlycVtpZHhdKSB7CisJCQlzamExMDAwX2lzYV9kZXZzW2lkeF0gPQorCQkJCXBsYXRmb3JtX2RldmljZV9hbGxvYyhEUlZfTkFNRSwgaWR4KTsKKwkJCWlmICghc2phMTAwMF9pc2FfZGV2c1tpZHhdKSB7CisJCQkJZXJyID0gLUVOT01FTTsKKwkJCQlnb3RvIGV4aXRfZnJlZV9kZXZpY2VzOworCQkJfQorCQkJZXJyID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzamExMDAwX2lzYV9kZXZzW2lkeF0pOworCQkJaWYgKGVycikgeworCQkJCXBsYXRmb3JtX2RldmljZV9wdXQoc2phMTAwMF9pc2FfZGV2c1tpZHhdKTsKKwkJCQlnb3RvIGV4aXRfZnJlZV9kZXZpY2VzOworCQkJfQorCQkJcHJfZGVidWcoIiVzOiBwbGF0Zm9ybSBkZXZpY2UgJWQ6IHBvcnQ9JSNseCwgbWVtPSUjbHgsICIKKwkJCQkgImlycT0lZFxuIiwKKwkJCQkgRFJWX05BTUUsIGlkeCwgcG9ydFtpZHhdLCBtZW1baWR4XSwgaXJxW2lkeF0pOworCQl9IGVsc2UgaWYgKGlkeCA9PSAwIHx8IHBvcnRbaWR4XSB8fCBtZW1baWR4XSkgeworCQkJCXByX2VycigiJXM6IGluc3VmZmljaWVudCBwYXJhbWV0ZXJzIHN1cHBsaWVkXG4iLAorCQkJCSAgICAgICBEUlZfTkFNRSk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIGV4aXRfZnJlZV9kZXZpY2VzOworCQl9CisJfQorCisJZXJyID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzamExMDAwX2lzYV9kcml2ZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXhpdF9mcmVlX2RldmljZXM7CisKKwlwcl9pbmZvKCJMZWdhY3kgJXMgZHJpdmVyIGZvciBtYXguICVkIGRldmljZXMgcmVnaXN0ZXJlZFxuIiwKKwkJRFJWX05BTUUsIE1BWERFVik7CisKKwlyZXR1cm4gMDsKKworZXhpdF9mcmVlX2RldmljZXM6CisJd2hpbGUgKC0taWR4ID49IDApIHsKKwkJaWYgKHNqYTEwMDBfaXNhX2RldnNbaWR4XSkKKwkJCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHNqYTEwMDBfaXNhX2RldnNbaWR4XSk7CisJfQorCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHZvaWQgX19leGl0IHNqYTEwMDBfaXNhX2V4aXQodm9pZCkKIHsKLQlpc2FfdW5yZWdpc3Rlcl9kcml2ZXIoJnNqYTEwMDBfaXNhX2RyaXZlcik7CisJaW50IGlkeDsKKworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzamExMDAwX2lzYV9kcml2ZXIpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgTUFYREVWOyBpZHgrKykgeworCQlpZiAoc2phMTAwMF9pc2FfZGV2c1tpZHhdKQorCQkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoc2phMTAwMF9pc2FfZGV2c1tpZHhdKTsKKwl9CiB9CiAKIG1vZHVsZV9pbml0KHNqYTEwMDBfaXNhX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvc2phMTAwMF9vZl9wbGF0Zm9ybS5jIGIvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvc2phMTAwMF9vZl9wbGF0Zm9ybS5jCmluZGV4IGMzZGQ5ZDAuLmYyNjgzZWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3NqYTEwMDBfb2ZfcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9zamExMDAwX29mX3BsYXRmb3JtLmMKQEAgLTIyMCwxNCArMjIwLDQgQEAKIAkucmVtb3ZlID0gX19kZXZleGl0X3Aoc2phMTAwMF9vZnBfcmVtb3ZlKSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNqYTEwMDBfb2ZwX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzamExMDAwX29mcF9kcml2ZXIpOwotfQotbW9kdWxlX2luaXQoc2phMTAwMF9vZnBfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzamExMDAwX29mcF9leGl0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzamExMDAwX29mcF9kcml2ZXIpOwotfTsKLW1vZHVsZV9leGl0KHNqYTEwMDBfb2ZwX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzamExMDAwX29mcF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvc2phMTAwMF9wbGF0Zm9ybS5jIGIvZHJpdmVycy9uZXQvY2FuL3NqYTEwMDAvc2phMTAwMF9wbGF0Zm9ybS5jCmluZGV4IGQ5ZmFkYzQuLjRmNTAxNDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9zamExMDAwL3NqYTEwMDBfcGxhdGZvcm0uYworKysgYi9kcml2ZXJzL25ldC9jYW4vc2phMTAwMC9zamExMDAwX3BsYXRmb3JtLmMKQEAgLTE4NSwxNSArMTg1LDQgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc3BfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNwX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzcF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNwX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHNwX2luaXQpOwotbW9kdWxlX2V4aXQoc3BfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNwX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vc2xjYW4uYyBiL2RyaXZlcnMvbmV0L2Nhbi9zbGNhbi5jCmluZGV4IGE5NzliMDAuLjNmMWViY2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi9zbGNhbi5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi9zbGNhbi5jCkBAIC0zODcsNyArMzg3LDcgQEAKIAogCS8qIE5ldy1zdHlsZSBmbGFncy4gKi8KIAlkZXYtPmZsYWdzCQk9IElGRl9OT0FSUDsKLQlkZXYtPmZlYXR1cmVzICAgICAgICAgICA9IE5FVElGX0ZfTk9fQ1NVTTsKKwlkZXYtPmZlYXR1cmVzICAgICAgICAgICA9IE5FVElGX0ZfSFdfQ1NVTTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvY2FuL3NvZnRpbmcvc29mdGluZ19tYWluLmMgYi9kcml2ZXJzL25ldC9jYW4vc29mdGluZy9zb2Z0aW5nX21haW4uYwppbmRleCAwOWE4Yjg2Li5hN2M3N2M3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vc29mdGluZy9zb2Z0aW5nX21haW4uYworKysgYi9kcml2ZXJzL25ldC9jYW4vc29mdGluZy9zb2Z0aW5nX21haW4uYwpAQCAtODc0LDIxICs4NzQsOSBAQAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChzb2Z0aW5nX3BkZXZfcmVtb3ZlKSwKIH07CiAKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc29mdGluZ19kcml2ZXIpOworCiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnNvZnRpbmciKTsKLQotc3RhdGljIGludCBfX2luaXQgc29mdGluZ19zdGFydCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNvZnRpbmdfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHNvZnRpbmdfc3RvcCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzb2Z0aW5nX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHNvZnRpbmdfc3RhcnQpOwotbW9kdWxlX2V4aXQoc29mdGluZ19zdG9wKTsKLQogTU9EVUxFX0RFU0NSSVBUSU9OKCJTb2Z0aW5nIERQUkFNIENBTiBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkt1cnQgVmFuIERpamNrIDxrdXJ0LnZhbi5kaWpja0BlaWEuYmU+Iik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9jYW4vdGlfaGVjYy5jIGIvZHJpdmVycy9uZXQvY2FuL3RpX2hlY2MuYwppbmRleCAyYWRjMjk0Li5kZjgwOWUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9jYW4vdGlfaGVjYy5jCisrKyBiL2RyaXZlcnMvbmV0L2Nhbi90aV9oZWNjLmMKQEAgLTEwMzcsMjAgKzEwMzcsNyBAQAogCS5yZXN1bWUgPSB0aV9oZWNjX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHRpX2hlY2NfaW5pdF9kcml2ZXIodm9pZCkKLXsKLQlwcmludGsoS0VSTl9JTkZPIERSVl9ERVNDICJcbiIpOwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnRpX2hlY2NfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHRpX2hlY2NfZXhpdF9kcml2ZXIodm9pZCkKLXsKLQlwcmludGsoS0VSTl9JTkZPIERSVl9ERVNDICIgdW5sb2FkZWRcbiIpOwotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0aV9oZWNjX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9leGl0KHRpX2hlY2NfZXhpdF9kcml2ZXIpOwotbW9kdWxlX2luaXQodGlfaGVjY19pbml0X2RyaXZlcik7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRpX2hlY2NfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiQW5hbnQgR29sZSA8YW5hbnRnb2xlQHRpLmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2Nhbi92Y2FuLmMgYi9kcml2ZXJzL25ldC9jYW4vdmNhbi5jCmluZGV4IGY5M2UyZDYuLmVhMmQ5NDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2Nhbi92Y2FuLmMKKysrIGIvZHJpdmVycy9uZXQvY2FuL3ZjYW4uYwpAQCAtNjMsNyArNjMsNyBAQAogICogU2VlIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9jYW4udHh0IGZvciBkZXRhaWxzLgogICovCiAKLXN0YXRpYyBpbnQgZWNobzsgLyogZWNobyB0ZXN0aW5nLiBEZWZhdWx0OiAwIChPZmYpICovCitzdGF0aWMgYm9vbCBlY2hvOyAvKiBlY2hvIHRlc3RpbmcuIERlZmF1bHQ6IDAgKE9mZikgKi8KIG1vZHVsZV9wYXJhbShlY2hvLCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoZWNobywgIkVjaG8gc2VudCBmcmFtZXMgKGZvciB0ZXN0aW5nKS4gRGVmYXVsdDogMCAoT2ZmKSIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2RzYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMTUxZDUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9kc2EvS2NvbmZpZwpAQCAtMCwwICsxLDM2IEBACittZW51ICJEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaGl0ZWN0dXJlIGRyaXZlcnMiCisJZGVwZW5kcyBvbiBORVRfRFNBCisKK2NvbmZpZyBORVRfRFNBX01WODhFNlhYWAorCXRyaXN0YXRlCisJZGVmYXVsdCBuCisKK2NvbmZpZyBORVRfRFNBX01WODhFNjA2MAorCXRyaXN0YXRlICJNYXJ2ZWxsIDg4RTYwNjAgZXRoZXJuZXQgc3dpdGNoIGNoaXAgc3VwcG9ydCIKKwlzZWxlY3QgTkVUX0RTQV9UQUdfVFJBSUxFUgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTWFydmVsbCA4OEU2MDYwIGV0aGVybmV0IHN3aXRjaAorCSAgY2hpcC4KKworY29uZmlnIE5FVF9EU0FfTVY4OEU2WFhYX05FRURfUFBVCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgTkVUX0RTQV9NVjg4RTYxMzEKKwl0cmlzdGF0ZSAiTWFydmVsbCA4OEU2MDg1LzYwOTUvNjA5NUYvNjEzMSBldGhlcm5ldCBzd2l0Y2ggY2hpcCBzdXBwb3J0IgorCXNlbGVjdCBORVRfRFNBX01WODhFNlhYWAorCXNlbGVjdCBORVRfRFNBX01WODhFNlhYWF9ORUVEX1BQVQorCXNlbGVjdCBORVRfRFNBX1RBR19EU0EKKwktLS1oZWxwLS0tCisJICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1hcnZlbGwgODhFNjA4NS82MDk1LzYwOTVGLzYxMzEKKwkgIGV0aGVybmV0IHN3aXRjaCBjaGlwcy4KKworY29uZmlnIE5FVF9EU0FfTVY4OEU2MTIzXzYxXzY1CisJdHJpc3RhdGUgIk1hcnZlbGwgODhFNjEyMy82MTYxLzYxNjUgZXRoZXJuZXQgc3dpdGNoIGNoaXAgc3VwcG9ydCIKKwlzZWxlY3QgTkVUX0RTQV9NVjg4RTZYWFgKKwlzZWxlY3QgTkVUX0RTQV9UQUdfRURTQQorCS0tLWhlbHAtLS0KKwkgIFRoaXMgZW5hYmxlcyBzdXBwb3J0IGZvciB0aGUgTWFydmVsbCA4OEU2MTIzLzYxNjEvNjE2NQorCSAgZXRoZXJuZXQgc3dpdGNoIGNoaXBzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9kc2EvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9kc2EvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNiZGEwNQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9NYWtlZmlsZQpAQCAtMCwwICsxLDkgQEAKK29iai0kKENPTkZJR19ORVRfRFNBX01WODhFNjA2MCkgKz0gbXY4OGU2MDYwLm8KK29iai0kKENPTkZJR19ORVRfRFNBX01WODhFNlhYWCkgKz0gbXY4OGU2eHh4X2Rydi5vCittdjg4ZTZ4eHhfZHJ2LXkgKz0gbXY4OGU2eHh4Lm8KK2lmZGVmIENPTkZJR19ORVRfRFNBX01WODhFNjEyM182MV82NQorbXY4OGU2eHh4X2Rydi15ICs9IG12ODhlNjEyM182MV82NS5vCitlbmRpZgoraWZkZWYgQ09ORklHX05FVF9EU0FfTVY4OEU2MTMxCittdjg4ZTZ4eHhfZHJ2LXkgKz0gbXY4OGU2MTMxLm8KK2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvZHNhL212ODhlNjA2MC5jIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNjA2MC5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIG5ldC9kc2EvbXY4OGU2MDYwLmMKcmVuYW1lIHRvIGRyaXZlcnMvbmV0L2RzYS9tdjg4ZTYwNjAuYwppbmRleCA4ZjRmZjVhLi43ZmM0ZTgxIDEwMDY0NAotLS0gYS9uZXQvZHNhL212ODhlNjA2MC5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYwNjAuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9waHkuaD4KLSNpbmNsdWRlICJkc2FfcHJpdi5oIgorI2luY2x1ZGUgPG5ldC9kc2EuaD4KIAogI2RlZmluZSBSRUdfUE9SVChwKQkJKDggKyAocCkpCiAjZGVmaW5lIFJFR19HTE9CQUwJCTB4MGYKQEAgLTI4NiwzICsyODYsOCBAQAogCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2MDYwX3N3aXRjaF9kcml2ZXIpOwogfQogbW9kdWxlX2V4aXQobXY4OGU2MDYwX2NsZWFudXApOworCitNT0RVTEVfQVVUSE9SKCJMZW5uZXJ0IEJ1eXRlbmhlayA8YnV5dGVuaEB3YW50c3RvZmx5Lm9yZz4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBNYXJ2ZWxsIDg4RTYwNjAgZXRoZXJuZXQgc3dpdGNoIGNoaXAiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bXY4OGU2MDYwIik7CmRpZmYgLS1naXQgYS9uZXQvZHNhL212ODhlNjEyM182MV82NS5jIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNjEyM182MV82NS5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIG5ldC9kc2EvbXY4OGU2MTIzXzYxXzY1LmMKcmVuYW1lIHRvIGRyaXZlcnMvbmV0L2RzYS9tdjg4ZTYxMjNfNjFfNjUuYwppbmRleCA1MmZhYWEyLi5jMGE0NThmIDEwMDY0NAotLS0gYS9uZXQvZHNhL212ODhlNjEyM182MV82NS5jCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTYxMjNfNjFfNjUuYwpAQCAtMTEsNyArMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9waHkuaD4KLSNpbmNsdWRlICJkc2FfcHJpdi5oIgorI2luY2x1ZGUgPG5ldC9kc2EuaD4KICNpbmNsdWRlICJtdjg4ZTZ4eHguaCIKIAogc3RhdGljIGNoYXIgKm12ODhlNjEyM182MV82NV9wcm9iZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgc3dfYWRkcikKQEAgLTQxOSw3ICs0MTksNyBAQAogCXJldHVybiBBUlJBWV9TSVpFKG12ODhlNjEyM182MV82NV9od19zdGF0cyk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgbXY4OGU2MTIzXzYxXzY1X3N3aXRjaF9kcml2ZXIgPSB7CitzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgbXY4OGU2MTIzXzYxXzY1X3N3aXRjaF9kcml2ZXIgPSB7CiAJLnRhZ19wcm90b2NvbAkJPSBjcHVfdG9fYmUxNihFVEhfUF9FRFNBKSwKIAkucHJpdl9zaXplCQk9IHNpemVvZihzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUpLAogCS5wcm9iZQkJCT0gbXY4OGU2MTIzXzYxXzY1X3Byb2JlLApAQCAtNDMzLDE1ICs0MzMsNiBAQAogCS5nZXRfc3NldF9jb3VudAkJPSBtdjg4ZTYxMjNfNjFfNjVfZ2V0X3NzZXRfY291bnQsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBtdjg4ZTYxMjNfNjFfNjVfaW5pdCh2b2lkKQotewotCXJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNjEyM182MV82NV9zd2l0Y2hfZHJpdmVyKTsKLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KG12ODhlNjEyM182MV82NV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG12ODhlNjEyM182MV82NV9jbGVhbnVwKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTYxMjNfNjFfNjVfc3dpdGNoX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChtdjg4ZTYxMjNfNjFfNjVfY2xlYW51cCk7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm12ODhlNjEyMyIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTptdjg4ZTYxNjEiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bXY4OGU2MTY1Iik7CmRpZmYgLS1naXQgYS9uZXQvZHNhL212ODhlNjEzMS5jIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNjEzMS5jCnNpbWlsYXJpdHkgaW5kZXggOTYlCnJlbmFtZSBmcm9tIG5ldC9kc2EvbXY4OGU2MTMxLmMKcmVuYW1lIHRvIGRyaXZlcnMvbmV0L2RzYS9tdjg4ZTYxMzEuYwppbmRleCA5YmQxMDYxLi5lMGViNjgyNCAxMDA2NDQKLS0tIGEvbmV0L2RzYS9tdjg4ZTYxMzEuYworKysgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2MTMxLmMKQEAgLTExLDcgKzExLDcgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+Ci0jaW5jbHVkZSAiZHNhX3ByaXYuaCIKKyNpbmNsdWRlIDxuZXQvZHNhLmg+CiAjaW5jbHVkZSAibXY4OGU2eHh4LmgiCiAKIC8qCkBAIC00MTUsNyArNDE1LDcgQEAKIAlyZXR1cm4gQVJSQVlfU0laRShtdjg4ZTYxMzFfaHdfc3RhdHMpOwogfQogCi1zdGF0aWMgc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNjEzMV9zd2l0Y2hfZHJpdmVyID0geworc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNjEzMV9zd2l0Y2hfZHJpdmVyID0gewogCS50YWdfcHJvdG9jb2wJCT0gY3B1X3RvX2JlMTYoRVRIX1BfRFNBKSwKIAkucHJpdl9zaXplCQk9IHNpemVvZihzdHJ1Y3QgbXY4OGU2eHh4X3ByaXZfc3RhdGUpLAogCS5wcm9iZQkJCT0gbXY4OGU2MTMxX3Byb2JlLApAQCAtNDI5LDE1ICs0MjksNyBAQAogCS5nZXRfc3NldF9jb3VudAkJPSBtdjg4ZTYxMzFfZ2V0X3NzZXRfY291bnQsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBtdjg4ZTYxMzFfaW5pdCh2b2lkKQotewotCXJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNjEzMV9zd2l0Y2hfZHJpdmVyKTsKLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KG12ODhlNjEzMV9pbml0KTsKLQotc3RhdGljIHZvaWQgX19leGl0IG12ODhlNjEzMV9jbGVhbnVwKHZvaWQpCi17Ci0JdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKCZtdjg4ZTYxMzFfc3dpdGNoX2RyaXZlcik7Ci19Ci1tb2R1bGVfZXhpdChtdjg4ZTYxMzFfY2xlYW51cCk7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm12ODhlNjA4NSIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTptdjg4ZTYwOTUiKTsKK01PRFVMRV9BTElBUygicGxhdGZvcm06bXY4OGU2MDk1ZiIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTptdjg4ZTYxMzEiKTsKZGlmZiAtLWdpdCBhL25ldC9kc2EvbXY4OGU2eHh4LmMgYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4LmMKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gbmV0L2RzYS9tdjg4ZTZ4eHguYwpyZW5hbWUgdG8gZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC5jCmluZGV4IGVmZTY2MWEuLjU0NjdjMDQgMTAwNjQ0Ci0tLSBhL25ldC9kc2EvbXY4OGU2eHh4LmMKKysrIGIvZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgotI2luY2x1ZGUgImRzYV9wcml2LmgiCisjaW5jbHVkZSA8bmV0L2RzYS5oPgogI2luY2x1ZGUgIm12ODhlNnh4eC5oIgogCiAvKgpAQCAtNTIwLDMgKzUyMCwzMCBAQAogCiAJbXV0ZXhfdW5sb2NrKCZwcy0+c3RhdHNfbXV0ZXgpOwogfQorCitzdGF0aWMgaW50IF9faW5pdCBtdjg4ZTZ4eHhfaW5pdCh2b2lkKQoreworI2lmIElTX0VOQUJMRUQoQ09ORklHX05FVF9EU0FfTVY4OEU2MTMxKQorCXJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNjEzMV9zd2l0Y2hfZHJpdmVyKTsKKyNlbmRpZgorI2lmIElTX0VOQUJMRUQoQ09ORklHX05FVF9EU0FfTVY4OEU2MTIzXzYxXzY1KQorCXJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNjEyM182MV82NV9zd2l0Y2hfZHJpdmVyKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorbW9kdWxlX2luaXQobXY4OGU2eHh4X2luaXQpOworCitzdGF0aWMgdm9pZCBfX2V4aXQgbXY4OGU2eHh4X2NsZWFudXAodm9pZCkKK3sKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRfRFNBX01WODhFNjEyM182MV82NSkKKwl1bnJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoJm12ODhlNjEyM182MV82NV9zd2l0Y2hfZHJpdmVyKTsKKyNlbmRpZgorI2lmIElTX0VOQUJMRUQoQ09ORklHX05FVF9EU0FfTVY4OEU2MTMxKQorCXVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcigmbXY4OGU2MTMxX3N3aXRjaF9kcml2ZXIpOworI2VuZGlmCit9Cittb2R1bGVfZXhpdChtdjg4ZTZ4eHhfY2xlYW51cCk7CisKK01PRFVMRV9BVVRIT1IoIkxlbm5lcnQgQnV5dGVuaGVrIDxidXl0ZW5oQHdhbnRzdG9mbHkub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgZm9yIE1hcnZlbGwgODhFNlhYWCBldGhlcm5ldCBzd2l0Y2ggY2hpcHMiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL25ldC9kc2EvbXY4OGU2eHh4LmggYi9kcml2ZXJzL25ldC9kc2EvbXY4OGU2eHh4LmgKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gbmV0L2RzYS9tdjg4ZTZ4eHguaApyZW5hbWUgdG8gZHJpdmVycy9uZXQvZHNhL212ODhlNnh4eC5oCmluZGV4IDYxMTU2Y2EyLi5mYzJjZDdiIDEwMDY0NAotLS0gYS9uZXQvZHNhL212ODhlNnh4eC5oCisrKyBiL2RyaXZlcnMvbmV0L2RzYS9tdjg4ZTZ4eHguaApAQCAtNzEsNiArNzEsOSBAQAogCQkJCSBpbnQgbnJfc3RhdHMsIHN0cnVjdCBtdjg4ZTZ4eHhfaHdfc3RhdCAqc3RhdHMsCiAJCQkJIGludCBwb3J0LCB1aW50NjRfdCAqZGF0YSk7CiAKK2V4dGVybiBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgbXY4OGU2MTMxX3N3aXRjaF9kcml2ZXI7CitleHRlcm4gc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyIG12ODhlNjEyM182MV82NV9zd2l0Y2hfZHJpdmVyOworCiAjZGVmaW5lIFJFR19SRUFEKGFkZHIsIHJlZykJCQkJCQlcCiAJKHsJCQkJCQkJCVwKIAkJaW50IF9fcmV0OwkJCQkJCVwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2R1bW15LmMgYi9kcml2ZXJzL25ldC9kdW1teS5jCmluZGV4IGE3YzVlODguLjA4NzY0OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2R1bW15LmMKKysrIGIvZHJpdmVycy9uZXQvZHVtbXkuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJZGV2LT5mbGFncyB8PSBJRkZfTk9BUlA7CiAJZGV2LT5mbGFncyAmPSB+SUZGX01VTFRJQ0FTVDsKIAlkZXYtPmZlYXR1cmVzCXw9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0ZSQUdMSVNUIHwgTkVUSUZfRl9UU087Ci0JZGV2LT5mZWF0dXJlcwl8PSBORVRJRl9GX05PX0NTVU0gfCBORVRJRl9GX0hJR0hETUEgfCBORVRJRl9GX0xMVFg7CisJZGV2LT5mZWF0dXJlcwl8PSBORVRJRl9GX0hXX0NTVU0gfCBORVRJRl9GX0hJR0hETUEgfCBORVRJRl9GX0xMVFg7CiAJcmFuZG9tX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcik7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1ODlfY3MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1ODlfY3MuYwppbmRleCA5NzJmODBlLi5kYTQxMGYwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTg5X2NzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvM2NvbS8zYzU4OV9jcy5jCkBAIC00NjgsOSArNDY4LDEwIEBACiBzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJQQ01DSUEgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSwKKwkJIlBDTUNJQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTl4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tLzNjNTl4LmMKaW5kZXggYjQyYzA2Yi4uODE1M2EzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvM2NvbS8zYzU5eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vM2M1OXguYwpAQCAtMjkyOSwxNSArMjkyOSwxNyBAQAogewogCXN0cnVjdCB2b3J0ZXhfcHJpdmF0ZSAqdnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOwogCWlmIChWT1JURVhfUENJKHZwKSkgewotCQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKFZPUlRFWF9QQ0kodnApKSk7CisJCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKFZPUlRFWF9QQ0kodnApKSwKKwkJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOwogCX0gZWxzZSB7CiAJCWlmIChWT1JURVhfRUlTQSh2cCkpCi0JCQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIGRldl9uYW1lKHZwLT5nZW5kZXYpKTsKKwkJCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIGRldl9uYW1lKHZwLT5nZW5kZXYpLAorCQkJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOwogCQllbHNlCi0JCQlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiRUlTQSAweCVseCAlZCIsCi0JCQkJCWRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CisJCQlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSwKKwkJCQkiRUlTQSAweCVseCAlZCIsIGRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC8zY29tL3R5cGhvb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vdHlwaG9vbi5jCmluZGV4IDIwZWEwNzUuLjZkNmJjNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vdHlwaG9vbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzNjb20vdHlwaG9vbi5jCkBAIC05ODgsMjEgKzk4OCwyMyBAQAogCiAJc21wX3JtYigpOwogCWlmKHRwLT5jYXJkX3N0YXRlID09IFNsZWVwaW5nKSB7Ci0JCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiU2xlZXAgaW1hZ2UiKTsKKwkJc3RybGNweShpbmZvLT5md192ZXJzaW9uLCAiU2xlZXAgaW1hZ2UiLAorCQkJc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pKTsKIAl9IGVsc2UgewogCQlJTklUX0NPTU1BTkRfV0lUSF9SRVNQT05TRSgmeHBfY21kLCBUWVBIT09OX0NNRF9SRUFEX1ZFUlNJT05TKTsKIAkJaWYodHlwaG9vbl9pc3N1ZV9jb21tYW5kKHRwLCAxLCAmeHBfY21kLCAzLCB4cF9yZXNwKSA8IDApIHsKLQkJCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiVW5rbm93biBydW50aW1lIik7CisJCQlzdHJsY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJVbmtub3duIHJ1bnRpbWUiLAorCQkJCXNpemVvZihpbmZvLT5md192ZXJzaW9uKSk7CiAJCX0gZWxzZSB7CiAJCQl1MzIgc2xlZXBfdmVyID0gbGUzMl90b19jcHUoeHBfcmVzcFswXS5wYXJtMik7Ci0JCQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCAzMiwgIiUwMnguJTAzeC4lMDN4IiwKLQkJCQkgc2xlZXBfdmVyID4+IDI0LCAoc2xlZXBfdmVyID4+IDEyKSAmIDB4ZmZmLAotCQkJCSBzbGVlcF92ZXIgJiAweGZmZik7CisJCQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksCisJCQkJIiUwMnguJTAzeC4lMDN4Iiwgc2xlZXBfdmVyID4+IDI0LAorCQkJCShzbGVlcF92ZXIgPj4gMTIpICYgMHhmZmYsIHNsZWVwX3ZlciAmIDB4ZmZmKTsKIAkJfQogCX0KIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIEtCVUlMRF9NT0ROQU1FKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBjaV9kZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgS0JVSUxEX01PRE5BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwY2lfZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyBpbnQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvODM5MC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC84MzkwLmgKaW5kZXggNThhMTJlNC4uZWYzMjVmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC84MzkwLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC84MzkwLmgKQEAgLTE0LDggKzE0LDYgQEAKIAogI2RlZmluZSBUWF9QQUdFUyAxMgkvKiBUd28gVHggc2xvdHMgKi8KIAotI2RlZmluZSBFVEhFUl9BRERSX0xFTiA2Ci0KIC8qIFRoZSA4MzkwIHNwZWNpZmljIHBlci1wYWNrZXQtaGVhZGVyIGZvcm1hdC4gKi8KIHN0cnVjdCBlODM5MF9wa3RfaGRyIHsKICAgdW5zaWduZWQgY2hhciBzdGF0dXM7IC8qIHN0YXR1cyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9hcG5lLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2FwbmUuYwppbmRleCA1NDc3MzczLi4zYWQ1ZDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2FwbmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2FwbmUuYwpAQCAtMzE4LDcgKzMxOCw3IEBACiAgICAgaSA9IHJlcXVlc3RfaXJxKGRldi0+aXJxLCBhcG5lX2ludGVycnVwdCwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBkZXYpOwogICAgIGlmIChpKSByZXR1cm4gaTsKIAotICAgIGZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisgICAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCiAJZGV2LT5kZXZfYWRkcltpXSA9IFNBX3Byb21baV07CiAKICAgICBwcmludGsoIiAlcE1cbiIsIGRldi0+ZGV2X2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9heDg4Nzk2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2F4ODg3OTYuYwppbmRleCBlOWY4NDMyLi45ZThiYTRmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2F4ODg3OTYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2F4ODg3OTYuYwpAQCAtNzM1LDE1ICs3MzUsMTQgQEAKIAlpZiAoYXgtPnBsYXQtPmZsYWdzICYgQVhGTEdfTUFDX0ZST01ERVYpIHsKIAkJZWlfb3V0YihFODM5MF9OT0RNQSArIEU4MzkwX1BBR0UxICsgRTgzOTBfU1RPUCwKIAkJCWVpX2xvY2FsLT5tZW0gKyBFODM5MF9DTUQpOyAvKiAweDYxICovCi0JCWZvciAoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorCQlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKIAkJCWRldi0+ZGV2X2FkZHJbaV0gPQogCQkJCWVpX2luYihpb2FkZHIgKyBFTjFfUEhZU19TSElGVChpKSk7CiAJfQogCiAJaWYgKChheC0+cGxhdC0+ZmxhZ3MgJiBBWEZMR19NQUNfRlJPTVBMQVRGT1JNKSAmJgogCSAgICBheC0+cGxhdC0+bWFjX2FkZHIpCi0JCW1lbWNweShkZXYtPmRldl9hZGRyLCBheC0+cGxhdC0+bWFjX2FkZHIsCi0JCSAgICAgICBFVEhFUl9BRERSX0xFTik7CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCBheC0+cGxhdC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIAogCWF4X3Jlc2V0XzgzOTAoZGV2KTsKIApAQCAtOTkxLDE4ICs5OTAsNyBAQAogCS5yZXN1bWUJCT0gYXhfcmVzdW1lLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgYXhkcnZfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmF4ZHJ2KTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGF4ZHJ2X2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXhkcnYpOwotfQotCi1tb2R1bGVfaW5pdChheGRydl9pbml0KTsKLW1vZHVsZV9leGl0KGF4ZHJ2X2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihheGRydik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiQVg4ODc5NiAxMC8xMDAgRXRoZXJuZXQgcGxhdGZvcm0gZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJCZW4gRG9va3MsIDxiZW5Ac2ltdGVjLmNvLnVrPiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9lczMyMTAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvZXMzMjEwLmMKaW5kZXggN2EwOTU3NS4uNjQyOGY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9lczMyMTAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2VzMzIxMC5jCkBAIC0xOTUsNyArMTk1LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOIDsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTiA7IGkrKykKIAkJZGV2LT5kZXZfYWRkcltpXSA9IGluYihpb2FkZHIgKyBFU19TQV9QUk9NICsgaSk7CiAKIC8qCUNoZWNrIHRoZSBSYWNhbCB2ZW5kb3IgSUQgYXMgd2VsbC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvaHAtcGx1cy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9ocC1wbHVzLmMKaW5kZXggZWVhYzg0My4uZDQyOTM4YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9ocC1wbHVzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9ocC1wbHVzLmMKQEAgLTIwMiw3ICsyMDIsNyBAQAogCS8qIFJldHJpZXZlIGFuZCBjaGVja3N1bSB0aGUgc3RhdGlvbiBhZGRyZXNzLiAqLwogCW91dHcoTUFDX1BhZ2UsIGlvYWRkciArIEhQX1BBR0lORyk7CiAKLQlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKSB7CisJZm9yKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykgewogCQl1bnNpZ25lZCBjaGFyIGludmFsID0gaW5iKGlvYWRkciArIDggKyBpKTsKIAkJZGV2LT5kZXZfYWRkcltpXSA9IGludmFsOwogCQljaGVja3N1bSArPSBpbnZhbDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvaHAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvaHAuYwppbmRleCAxODU2NGQ0Li4xMTNmMWUwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2hwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9ocC5jCkBAIC0xNTYsNyArMTU2LDcgQEAKIAogCXByaW50aygiJXM6ICVzIChJRCAlMDJ4KSBhdCAlIzN4LCIsIGRldi0+bmFtZSwgbmFtZSwgYm9hcmRfaWQsIGlvYWRkcik7CiAKLQlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorCWZvcihpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCiAJCWRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgaSk7CiAKIAlwcmludGsoIiAlcE0iLCBkZXYtPmRldl9hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvaHlkcmEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvaHlkcmEuYwppbmRleCAzZGFjOTM3Li41MzcwYzg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2h5ZHJhLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9oeWRyYS5jCkBAIC0xMjksNyArMTI5LDcgQEAKICAgICBpZiAoIWRldikKIAlyZXR1cm4gLUVOT01FTTsKIAotICAgIGZvcihqID0gMDsgaiA8IEVUSEVSX0FERFJfTEVOOyBqKyspCisgICAgZm9yIChqID0gMDsgaiA8IEVUSF9BTEVOOyBqKyspCiAJZGV2LT5kZXZfYWRkcltqXSA9ICooKHU4ICopKGJvYXJkICsgSFlEUkFfQUREUlBST00gKyAyKmopKTsKIAogICAgIC8qIFdlIG11c3Qgc2V0IHRoZSA4MzkwIGZvciB3b3JkIG1vZGUuICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2xuZTM5MC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9sbmUzOTAuYwppbmRleCBmOTg4OGQyLi42OTQ5MGFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL2xuZTM5MC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvbG5lMzkwLmMKQEAgLTE5MSwxNCArMTkxLDE0IEBACiAJCXx8IGluYihpb2FkZHIgKyBMTkUzOTBfU0FfUFJPTSArIDEpICE9IExORTM5MF9BRERSMQogCQl8fCBpbmIoaW9hZGRyICsgTE5FMzkwX1NBX1BST00gKyAyKSAhPSBMTkUzOTBfQUREUjIgKSB7CiAJCXByaW50aygibG5lMzkwLmM6IGNhcmQgbm90IGZvdW5kIik7Ci0JCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisJCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQogCQkJcHJpbnRrKCIgJTAyeCIsIGluYihpb2FkZHIgKyBMTkUzOTBfU0FfUFJPTSArIGkpKTsKIAkJcHJpbnRrKCIgKGludmFsaWQgcHJlZml4KS5cbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAjZW5kaWYKIAotCWZvcihpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCiAJCWRldi0+ZGV2X2FkZHJbaV0gPSBpbmIoaW9hZGRyICsgTE5FMzkwX1NBX1BST00gKyBpKTsKIAlwcmludGsoImxuZTM5MC5jOiBMTkUzOTAlWCBpbiBFSVNBIHNsb3QgJWQsIGFkZHJlc3MgJXBNLlxuIiwKIAkgICAgICAgMHhhK3JldmlzaW9uLCBpb2FkZHIvMHgxMDAwLCBkZXYtPmRldl9hZGRyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvbmUtaDgzMDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvbmUtaDgzMDAuYwppbmRleCBjZDM2YTZhLi45YjljNzdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL25lLWg4MzAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9uZS1oODMwMC5jCkBAIC0zMTIsNyArMzEyLDcgQEAKIAogCWRldi0+YmFzZV9hZGRyID0gaW9hZGRyOwogCi0JZm9yKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKIAkJZGV2LT5kZXZfYWRkcltpXSA9IFNBX3Byb21baV07CiAJcHJpbnRrKCIgJXBNXG4iLCBkZXYtPmRldl9hZGRyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9uZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9uZS5jCmluZGV4IDEwNjMwOTMuLmY5MmVhMmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvbmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL25lLmMKQEAgLTUwMywxMiArNTAzLDEyIEBACiAjaWZkZWYgQ09ORklHX1BMQVRfTUFQUEkKIAlvdXRiX3AoRTgzOTBfTk9ETUEgKyBFODM5MF9QQUdFMSArIEU4MzkwX1NUT1AsCiAJCWlvYWRkciArIEU4MzkwX0NNRCk7IC8qIDB4NjEgKi8KLQlmb3IgKGkgPSAwIDsgaSA8IEVUSEVSX0FERFJfTEVOIDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspIHsKIAkJZGV2LT5kZXZfYWRkcltpXSA9IFNBX3Byb21baV0KIAkJCT0gaW5iX3AoaW9hZGRyICsgRU4xX1BIWVNfU0hJRlQoaSkpOwogCX0KICNlbHNlCi0JZm9yKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CiAJCWRldi0+ZGV2X2FkZHJbaV0gPSBTQV9wcm9tW2ldOwogCX0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9uZTIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvbmUyLmMKaW5kZXggNzBjZGM2OS4uOTIyYjMyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9uZTIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL25lMi5jCkBAIC00NjAsNyArNDYwLDcgQEAKIAogCWRldi0+YmFzZV9hZGRyID0gYmFzZV9hZGRyOwogCi0JZm9yKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKIAkJZGV2LT5kZXZfYWRkcltpXSA9IFNBX3Byb21baV07CiAKIAlwcmludGsoIiAlcE1cbiIsIGRldi0+ZGV2X2FkZHIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9uZTJrLXBjaS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9uZTJrLXBjaS5jCmluZGV4IDM5OTIzNDIuLjNmYWIwNGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvbmUyay1wY2kuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL25lMmstcGNpLmMKQEAgLTYzOSw5ICs2MzksOSBAQAogCXN0cnVjdCBlaV9kZXZpY2UgKmVpID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IChzdHJ1Y3QgcGNpX2RldiAqKSBlaS0+cHJpdjsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocGNpX2RldikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocGNpX2RldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG5lMmtfcGNpX2V0aHRvb2xfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9uZTMyMTAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvbmUzMjEwLmMKaW5kZXggMjQzZWQyYS4uMmEzZTgwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9uZTMyMTAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL25lMzIxMC5jCkBAIC0xMjUsNyArMTI1LDcgQEAKICNlbmRpZgogCiAJcG9ydF9pbmRleCA9IGluYihpb2FkZHIgKyBORTMyMTBfQ0ZHMikgPj4gNjsKLQlmb3IoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQogCQlkZXYtPmRldl9hZGRyW2ldID0gaW5iKGlvYWRkciArIE5FMzIxMF9TQV9QUk9NICsgaSk7CiAJcHJpbnRrKCJuZTMyMTAuYzogTkUzMjEwIGluIEVJU0Egc2xvdCAlZCwgbWVkaWE6ICVzLCBhZGRyOiAlcE0uXG4iLAogCQllZGV2LT5zbG90LCBpZm1hcFtwb3J0X2luZGV4XSwgZGV2LT5kZXZfYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL3N0bmljLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL3N0bmljLmMKaW5kZXggZDg1ZjBhOC4uM2I5MDM3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC9zdG5pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvc3RuaWMuYwpAQCAtMTE0LDcgKzExNCw3IEBACiAjaWZkZWYgQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MKICAgc2hfYmlvc19nZXRfbm9kZV9hZGRyIChzdG5pY19lYWRyKTsKICNlbmRpZgotICBmb3IgKGkgPSAwOyBpIDwgRVRIRVJfQUREUl9MRU47IGkrKykKKyAgZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCiAgICAgZGV2LT5kZXZfYWRkcltpXSA9IHN0bmljX2VhZHJbaV07CiAKICAgLyogU2V0IHRoZSBiYXNlIGFkZHJlc3MgdG8gcG9pbnQgdG8gdGhlIE5JQywgbm90IHRoZSAicmVhbCIgYmFzZSEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvem9ycm84MzkwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC84MzkwL3pvcnJvODM5MC5jCmluZGV4IDNhYTlmZTkuLmJjZDI3MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0LzgzOTAvem9ycm84MzkwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvODM5MC96b3JybzgzOTAuYwpAQCAtMzY1LDcgKzM2NSw3IEBACiAJaWYgKGkpCiAJCXJldHVybiBpOwogCi0JZm9yIChpID0gMDsgaSA8IEVUSEVSX0FERFJfTEVOOyBpKyspCisJZm9yIChpID0gMDsgaSA8IEVUSF9BTEVOOyBpKyspCiAJCWRldi0+ZGV2X2FkZHJbaV0gPSBTQV9wcm9tW2ldOwogCiAJcHJfZGVidWcoIkZvdW5kIGV0aGVybmV0IGFkZHJlc3M6ICVwTVxuIiwgZGV2LT5kZXZfYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvS2NvbmZpZwppbmRleCA1OTdmNGQ0Li4zNDc0YTYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L0tjb25maWcKQEAgLTI4LDYgKzI4LDcgQEAKIHNvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRpL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvS2NvbmZpZyIKK3NvdXJjZSAiZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FseGVkYS9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL0tjb25maWciCiBzb3VyY2UgImRyaXZlcnMvbmV0L2V0aGVybmV0L2NpcnJ1cy9LY29uZmlnIgogc291cmNlICJkcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9LY29uZmlnIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZQppbmRleCBiZTVkZGUwLi5jZDZkNjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9NYWtlZmlsZQpAQCAtMTQsNiArMTQsNyBAQAogb2JqLSQoQ09ORklHX05FVF9CRklOKSArPSBhZGkvCiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9CUk9BRENPTSkgKz0gYnJvYWRjb20vCiBvYmotJChDT05GSUdfTkVUX1ZFTkRPUl9CUk9DQURFKSArPSBicm9jYWRlLworb2JqLSQoQ09ORklHX05FVF9DQUxYRURBX1hHTUFDKSArPSBjYWx4ZWRhLwogb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfQ0hFTFNJTykgKz0gY2hlbHNpby8KIG9iai0kKENPTkZJR19ORVRfVkVORE9SX0NJUlJVUykgKz0gY2lycnVzLwogb2JqLSQoQ09ORklHX05FVF9WRU5ET1JfQ0lTQ08pICs9IGNpc2NvLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRhcHRlYy9zdGFyZmlyZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWRhcHRlYy9zdGFyZmlyZS5jCmluZGV4IDZkOWY2OTEuLmNiNGYzOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FkYXB0ZWMvc3RhcmZpcmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZGFwdGVjL3N0YXJmaXJlLmMKQEAgLTYwNyw3ICs2MDcsNyBAQAogCiAKICNpZmRlZiBWTEFOX1NVUFBPUlQKLXN0YXRpYyB2b2lkIG5ldGRldl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQorc3RhdGljIGludCBuZXRkZXZfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtNjE3LDkgKzYxNywxMSBAQAogCXNldF9iaXQodmlkLCBucC0+YWN0aXZlX3ZsYW5zKTsKIAlzZXRfcnhfbW9kZShkZXYpOwogCXNwaW5fdW5sb2NrKCZucC0+bG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbmV0ZGV2X3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQorc3RhdGljIGludCBuZXRkZXZfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CiAJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7CiAKQEAgLTYyOSw2ICs2MzEsOCBAQAogCWNsZWFyX2JpdCh2aWQsIG5wLT5hY3RpdmVfdmxhbnMpOwogCXNldF9yeF9tb2RlKGRldik7CiAJc3Bpbl91bmxvY2soJm5wLT5sb2NrKTsKKworCXJldHVybiAwOwogfQogI2VuZGlmIC8qIFZMQU5fU1VQUE9SVCAqLwogCkBAIC0xODQyLDkgKzE4NDYsOSBAQAogc3RhdGljIHZvaWQgZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKIHsKIAlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSk7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiBzdGF0aWMgaW50IGdldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYWVyb2ZsZXgvZ3JldGguYwppbmRleCA0NDJmZWZhLi5jODg1YWE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hZXJvZmxleC9ncmV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Flcm9mbGV4L2dyZXRoLmMKQEAgLTE2MjMsMTggKzE2MjMsNyBAQAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChncmV0aF9vZl9yZW1vdmUpLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgZ3JldGhfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmdyZXRoX29mX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBncmV0aF9jbGVhbnVwKHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdyZXRoX29mX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGdyZXRoX2luaXQpOwotbW9kdWxlX2V4aXQoZ3JldGhfY2xlYW51cCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGdyZXRoX29mX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIkFlcm9mbGV4IEdhaXNsZXIgQUIuIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIkFlcm9mbGV4IEdhaXNsZXIgRXRoZXJuZXQgTUFDIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2FtZDgxMTFlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuYwppbmRleCBhOTc0NWY0Li4zM2UwYThjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuYwpAQCAtNDk5LDcgKzQ5OSw3IEBACiAJd3JpdGVsKCBWQUwwIHwgQVBBRF9YTVQgfCBSRVhfUlRSWSwgbW1pbyArIENNRDIgKTsKIAogCS8qIFNldHRpbmcgdGhlIE1BQyBhZGRyZXNzIHRvIHRoZSBkZXZpY2UgKi8KLQlmb3IoaSA9IDA7IGkgPCBFVEhfQUREUl9MRU47IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKIAkJd3JpdGViKCBkZXYtPmRldl9hZGRyW2ldLCBtbWlvICsgUEFEUiArIGkgKTsKIAogCS8qIEVuYWJsZSBpbnRlcnJ1cHQgY29hbGVzY2UgKi8KQEAgLTE0MTIsMTAgKzE0MTIsMTEgQEAKIHsKIAlzdHJ1Y3QgYW1kODExMWVfcHJpdiAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gbHAtPnBjaV9kZXY7Ci0Jc3RyY3B5IChpbmZvLT5kcml2ZXIsIE1PRFVMRV9OQU1FKTsKLQlzdHJjcHkgKGluZm8tPnZlcnNpb24sIE1PRFVMRV9WRVJTKTsKLQlzcHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIiV1IixjaGlwX3ZlcnNpb24pOwotCXN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBjaV9kZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgTU9EVUxFX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIE1PRFVMRV9WRVJTLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSwKKwkJIiV1IiwgY2hpcF92ZXJzaW9uKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwY2lfZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyBpbnQgYW1kODExMWVfZ2V0X3JlZ3NfbGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0xNTQ5LDcgKzE1NTAsNyBAQAogCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKIAlzcGluX2xvY2tfaXJxKCZscC0+bG9jayk7CiAJLyogU2V0dGluZyB0aGUgTUFDIGFkZHJlc3MgdG8gdGhlIGRldmljZSAqLwotCWZvcihpID0gMDsgaSA8IEVUSF9BRERSX0xFTjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQogCQl3cml0ZWIoIGRldi0+ZGV2X2FkZHJbaV0sIGxwLT5tbWlvICsgUEFEUiArIGkgKTsKIAogCXNwaW5fdW5sb2NrX2lycSgmbHAtPmxvY2spOwpAQCAtMTg4NSw3ICsxODg2LDcgQEAKIAl9CiAKIAkvKiBJbml0aWFsaXppbmcgTUFDIGFkZHJlc3MgKi8KLQlmb3IoaSA9IDA7IGkgPCBFVEhfQUREUl9MRU47IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKIAkJZGV2LT5kZXZfYWRkcltpXSA9IHJlYWRiKGxwLT5tbWlvICsgUEFEUiArIGkpOwogCiAJLyogU2V0dGluZyB1c2VyIGRlZmluZWQgcGFyYW1ldHJzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYW1kODExMWUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hbWQ4MTExZS5oCmluZGV4IDJmZjJlN2EuLjhiYWEzNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hbWQ4MTExZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hbWQ4MTExZS5oCkBAIC01ODYsNyArNTg2LDYgQEAKIAogI2RlZmluZSBQS1RfQlVGRl9TWgkJCTE1MzYKICNkZWZpbmUgTUlOX1BLVF9MRU4JCQk2MAotI2RlZmluZSBFVEhfQUREUl9MRU4JCQk2CiAKICNkZWZpbmUgIEFNRDgxMTFFX1RYX1RJTUVPVVQJCSgzICogSFopLyogMyBzZWMgKi8KICNkZWZpbmUgU09GVF9USU1FUl9GUkVRIAkJMHhCRUJDICAvKiAwLjUgc2VjICovCkBAIC04MDgsOCArODA3LDggQEAKIAogc3RhdGljIGludCBjYXJkX2lkeDsKIHN0YXRpYyBpbnQgc3BlZWRfZHVwbGV4W01BWF9VTklUU10gPSB7IDAsIH07Ci1zdGF0aWMgaW50IGNvYWxlc2NlW01BWF9VTklUU10gPSB7MSwxLDEsMSwxLDEsMSwxfTsKLXN0YXRpYyBpbnQgZHluYW1pY19pcGdbTUFYX1VOSVRTXSA9IHswLDAsMCwwLDAsMCwwLDB9Oworc3RhdGljIGJvb2wgY29hbGVzY2VbTUFYX1VOSVRTXSA9IHsgWyAwIC4uLiBNQVhfVU5JVFMtMV0gPSB0cnVlIH07CitzdGF0aWMgYm9vbCBkeW5hbWljX2lwZ1tNQVhfVU5JVFNdID0geyBbIDAgLi4uIE1BWF9VTklUUy0xXSA9IGZhbHNlIH07CiBzdGF0aWMgdW5zaWduZWQgaW50IGNoaXBfdmVyc2lvbjsKIAogI2VuZGlmIC8qIF9BTUQ4MTExRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYXUxMDAwX2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL2F1MTAwMF9ldGguYwppbmRleCA0ODY1ZmYxLi5jYzkyNjJiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvYXUxMDAwX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9hdTEwMDBfZXRoLmMKQEAgLTEzMzksMTggKzEzMzksNyBAQAogCQkub3duZXIgID0gVEhJU19NT0RVTEUsCiAJfSwKIH07CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoYXUxMDAwX2V0aF9kcml2ZXIpOworCiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOmF1MTAwMC1ldGgiKTsKLQotCi1zdGF0aWMgaW50IF9faW5pdCBhdTEwMDBfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZhdTEwMDBfZXRoX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBhdTEwMDBfZXhpdF9tb2R1bGUodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYXUxMDAwX2V0aF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChhdTEwMDBfaW5pdF9tb2R1bGUpOwotbW9kdWxlX2V4aXQoYXUxMDAwX2V4aXRfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9ubWNsYW5fY3MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9ubWNsYW5fY3MuYwppbmRleCAzYWNjZDVkLi42YmUwZGQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvbm1jbGFuX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL25tY2xhbl9jcy5jCkBAIC0xNjAsOCArMTYwLDYgQEAKIERlZmluZXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAotI2RlZmluZSBFVEhFUl9BRERSX0xFTgkJCUVUSF9BTEVOCi0JCQkJCS8qIDYgYnl0ZXMgaW4gYW4gRXRoZXJuZXQgQWRkcmVzcyAqLwogI2RlZmluZSBNQUNFX0xBRFJGX0xFTgkJCTgKIAkJCQkJLyogOCBieXRlcyBpbiBMb2dpY2FsIEFkZHJlc3MgRmlsdGVyICovCiAKQEAgLTYwMCw3ICs1OTgsNyBAQAogICAJfQogICB9CiAgIC8qIFNldCBQQURSIHJlZ2lzdGVyICovCi0gIGZvciAoaSA9IDA7IGkgPCBFVEhFUl9BRERSX0xFTjsgaSsrKQorICBmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKICAgICBtYWNlX3dyaXRlKGxwLCBpb2FkZHIsIE1BQ0VfUEFEUiwgZW5ldF9hZGRyW2ldKTsKIAogICAvKiBNQUMgQ29uZmlndXJhdGlvbiBDb250cm9sIFJlZ2lzdGVyIHNob3VsZCBiZSB3cml0dGVuIGxhc3QgKi8KQEAgLTYzOSwxMSArNjM3LDExIEBACiAKICAgLyogUmVhZCB0aGUgZXRoZXJuZXQgYWRkcmVzcyBmcm9tIHRoZSBDSVMuICovCiAgIGxlbiA9IHBjbWNpYV9nZXRfdHVwbGUobGluaywgMHg4MCwgJmJ1Zik7Ci0gIGlmICghYnVmIHx8IGxlbiA8IEVUSEVSX0FERFJfTEVOKSB7CisgIGlmICghYnVmIHx8IGxlbiA8IEVUSF9BTEVOKSB7CiAJICBrZnJlZShidWYpOwogCSAgZ290byBmYWlsZWQ7CiAgIH0KLSAgbWVtY3B5KGRldi0+ZGV2X2FkZHIsIGJ1ZiwgRVRIRVJfQUREUl9MRU4pOworICBtZW1jcHkoZGV2LT5kZXZfYWRkciwgYnVmLCBFVEhfQUxFTik7CiAgIGtmcmVlKGJ1Zik7CiAKICAgLyogVmVyaWZ5IGNvbmZpZ3VyYXRpb24gYnkgcmVhZGluZyB0aGUgTUFDRSBJRC4gKi8KQEAgLTgyMiw5ICs4MjAsMTAgQEAKIHN0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7Ci0Jc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlBDTUNJQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXNucHJpbnRmKGluZm8tPmJ1c19pbmZvLCBzaXplb2YoaW5mby0+YnVzX2luZm8pLAorCQkiUENNQ0lBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKQEAgLTE0MjAsNyArMTQxOSw3IEBACiBzdGF0aWMgdm9pZCBzZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKICAgbWFjZV9wcml2YXRlICpscCA9IG5ldGRldl9wcml2KGRldik7Ci0gIGludCBhZHJbRVRIRVJfQUREUl9MRU5dID0gezB9OyAvKiBFdGhlcm5ldCBhZGRyZXNzICovCisgIGludCBhZHJbRVRIX0FMRU5dID0gezB9OyAvKiBFdGhlcm5ldCBhZGRyZXNzICovCiAgIHN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CiAKICNpZmRlZiBQQ01DSUFfREVCVUcKQEAgLTE0NDIsNyArMTQ0MSw3IEBACiAgICAgLyogQ2FsY3VsYXRlIG11bHRpY2FzdCBsb2dpY2FsIGFkZHJlc3MgZmlsdGVyICovCiAgICAgbWVtc2V0KGxwLT5tdWx0aWNhc3RfbGFkcmYsIDAsIE1BQ0VfTEFEUkZfTEVOKTsKICAgICBuZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7Ci0gICAgICBtZW1jcHkoYWRyLCBoYS0+YWRkciwgRVRIRVJfQUREUl9MRU4pOworICAgICAgbWVtY3B5KGFkciwgaGEtPmFkZHIsIEVUSF9BTEVOKTsKICAgICAgIEJ1aWxkTEFGKGxwLT5tdWx0aWNhc3RfbGFkcmYsIGFkcik7CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvcGNuZXQzMi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3BjbmV0MzIuYwppbmRleCBmOTJiYzZlLi4yMGU2ZGFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvcGNuZXQzMi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2FtZC9wY25ldDMyLmMKQEAgLTcxMSwxMiArNzExLDE0IEBACiB7CiAJc3RydWN0IHBjbmV0MzJfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKIAlpZiAobHAtPnBjaV9kZXYpCi0JCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobHAtPnBjaV9kZXYpKTsKKwkJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobHAtPnBjaV9kZXYpLAorCQkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiAJZWxzZQotCQlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiVkxCIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOworCQlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSwKKwkJCSJWTEIgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7CiB9CiAKIHN0YXRpYyB1MzIgcGNuZXQzMl9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYW1kL3N1bmxhbmNlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvc3VubGFuY2UuYwppbmRleCA4ZmRhNDU3Li43ZWExNmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvc3VubGFuY2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hbWQvc3VubGFuY2UuYwpAQCAtMTU0MCwxNyArMTU0MCw0IEBACiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzdW5sYW5jZV9zYnVzX3JlbW92ZSksCiB9OwogCi0KLS8qIEZpbmQgYWxsIHRoZSBsYW5jZSBjYXJkcyBvbiB0aGUgc3lzdGVtIGFuZCBpbml0aWFsaXplIHRoZW0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHNwYXJjX2xhbmNlX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzdW5sYW5jZV9zYnVzX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzcGFyY19sYW5jZV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnN1bmxhbmNlX3NidXNfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc3BhcmNfbGFuY2VfaW5pdCk7Ci1tb2R1bGVfZXhpdChzcGFyY19sYW5jZV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3VubGFuY2Vfc2J1c19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxYy9hdGwxY19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFjL2F0bDFjX2V0aHRvb2wuYwppbmRleCA3YmU4ODRkLi4wYTkzMjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFjL2F0bDFjX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFjL2F0bDFjX2V0aHRvb2wuYwpAQCAtMjMyLDcgKzIzMiw2IEBACiAJc3RybGNweShkcnZpbmZvLT5kcml2ZXIsICBhdGwxY19kcml2ZXJfbmFtZSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOwogCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgYXRsMWNfZHJpdmVyX3ZlcnNpb24sCiAJCXNpemVvZihkcnZpbmZvLT52ZXJzaW9uKSk7Ci0Jc3RybGNweShkcnZpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgc2l6ZW9mKGRydmluZm8tPmZ3X3ZlcnNpb24pKTsKIAlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKIAkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CiAJZHJ2aW5mby0+bl9zdGF0cyA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFjL2F0bDFjX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRsMWMvYXRsMWNfbWFpbi5jCmluZGV4IDAyYzdlZDguLmI4NTkxMjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRsMWMvYXRsMWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRsMWMvYXRsMWNfbWFpbi5jCkBAIC00MTEsNyArNDExLDcgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIF9fYXRsMWNfdmxhbl9tb2RlKHUzMiBmZWF0dXJlcywgdTMyICptYWNfY3RybF9kYXRhKQorc3RhdGljIHZvaWQgX19hdGwxY192bGFuX21vZGUobmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMsIHUzMiAqbWFjX2N0cmxfZGF0YSkKIHsKIAlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpIHsKIAkJLyogZW5hYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwpAQCAtNDIyLDcgKzQyMiw4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGwxY192bGFuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIHZvaWQgYXRsMWNfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IGF0bDFjX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKQEAgLTQ4Miw3ICs0ODMsOCBAQAogCQlyb3VuZHVwKG10dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU4gKyBWTEFOX0hMRU4sIDgpIDogQVRfUlhfQlVGX1NJWkU7CiB9CiAKLXN0YXRpYyB1MzIgYXRsMWNfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBhdGwxY19maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAkvKgogCSAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHJ4L3R4IHZsYW4gYWNjZWwKQEAgLTQ5OSw5ICs1MDEsMTAgQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLXN0YXRpYyBpbnQgYXRsMWNfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgYXRsMWNfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7Ci0JdTMyIGNoYW5nZWQgPSBuZXRkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlZCA9IG5ldGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKIAogCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9IV19WTEFOX1JYKQogCQlhdGwxY192bGFuX21vZGUobmV0ZGV2LCBmZWF0dXJlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFlL2F0bDFlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRsMWUvYXRsMWVfZXRodG9vbC5jCmluZGV4IDYyNjk0MzguLjZlNjFmOWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRsMWUvYXRsMWVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRsMWUvYXRsMWVfZXRodG9vbC5jCkBAIC0zMTAsMTAgKzMxMCwxMiBAQAogewogCXN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCAgYXRsMWVfZHJpdmVyX25hbWUsIDMyKTsKLQlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIGF0bDFlX2RyaXZlcl92ZXJzaW9uLCAzMik7Ci0Jc3RybmNweShkcnZpbmZvLT5md192ZXJzaW9uLCAiTDFlIiwgMzIpOwotCXN0cm5jcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLCAzMik7CisJc3RybGNweShkcnZpbmZvLT5kcml2ZXIsICBhdGwxZV9kcml2ZXJfbmFtZSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgYXRsMWVfZHJpdmVyX3ZlcnNpb24sCisJCXNpemVvZihkcnZpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShkcnZpbmZvLT5md192ZXJzaW9uLCAiTDFlIiwgc2l6ZW9mKGRydmluZm8tPmZ3X3ZlcnNpb24pKTsKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKKwkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CiAJZHJ2aW5mby0+bl9zdGF0cyA9IDA7CiAJZHJ2aW5mby0+dGVzdGluZm9fbGVuID0gMDsKIAlkcnZpbmZvLT5yZWdkdW1wX2xlbiA9IGF0bDFlX2dldF9yZWdzX2xlbihuZXRkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGwxZS9hdGwxZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFlL2F0bDFlX21haW4uYwppbmRleCA5NTQ4M2JjLi5jOTE1YzA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFlL2F0bDFlX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bDFlL2F0bDFlX21haW4uYwpAQCAtMzEzLDcgKzMxMyw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBfX2F0bDFlX3ZsYW5fbW9kZSh1MzIgZmVhdHVyZXMsIHUzMiAqbWFjX2N0cmxfZGF0YSkKK3N0YXRpYyB2b2lkIF9fYXRsMWVfdmxhbl9tb2RlKG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzLCB1MzIgKm1hY19jdHJsX2RhdGEpCiB7CiAJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSB7CiAJCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KQEAgLTMyNCw3ICszMjQsOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYXRsMWVfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyB2b2lkIGF0bDFlX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBhdGwxZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAl1MzIgbWFjX2N0cmxfZGF0YSA9IDA7CkBAIC0zNzAsNyArMzcxLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUzMiBhdGwxZV9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IGF0bDFlX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCS8qCiAJICogU2luY2UgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3Igc2VwYXJhdGUgcngvdHggdmxhbiBhY2NlbApAQCAtMzg0LDkgKzM4NiwxMCBAQAogCXJldHVybiBmZWF0dXJlczsKIH0KIAotc3RhdGljIGludCBhdGwxZV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIGludCBhdGwxZV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKLQl1MzIgY2hhbmdlZCA9IG5ldGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdCBjaGFuZ2VkID0gbmV0ZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOwogCiAJaWYgKGNoYW5nZWQgJiBORVRJRl9GX0hXX1ZMQU5fUlgpCiAJCWF0bDFlX3ZsYW5fbW9kZShuZXRkZXYsIGZlYXR1cmVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRseC9hdGwxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bHgvYXRsMS5jCmluZGV4IDMzYTRlMzUuLjliZDIwNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRseC9hdGwxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGx4L2F0bDEuYwpAQCAtMzM2NSw3ICszMzY1LDYgQEAKIAlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgQVRMWF9EUklWRVJfTkFNRSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOwogCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgQVRMWF9EUklWRVJfVkVSU0lPTiwKIAkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKLQlzdHJsY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJOL0EiLCBzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbikpOwogCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAogCQlzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pKTsKIAlkcnZpbmZvLT5lZWR1bXBfbGVuID0gQVRMMV9FRURVTVBfTEVOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGx4L2F0bDIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRseC9hdGwyLmMKaW5kZXggMWZlYWU1OS4uMDcxZjRjOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGx4L2F0bDIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bHgvYXRsMi5jCkBAIC0zNjEsNyArMzYxLDcgQEAKICAgICBzeW5jaHJvbml6ZV9pcnEoYWRhcHRlci0+cGRldi0+aXJxKTsKIH0KIAotc3RhdGljIHZvaWQgX19hdGwyX3ZsYW5fbW9kZSh1MzIgZmVhdHVyZXMsIHUzMiAqY3RybCkKK3N0YXRpYyB2b2lkIF9fYXRsMl92bGFuX21vZGUobmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMsIHUzMiAqY3RybCkKIHsKIAlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpIHsKIAkJLyogZW5hYmxlIFZMQU4gdGFnIGluc2VydC9zdHJpcCAqLwpAQCAtMzcyLDcgKzM3Miw4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGwyX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgdm9pZCBhdGwyX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBhdGwyX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXUzMiBjdHJsOwpAQCAtMzkxLDcgKzM5Miw4IEBACiAJYXRsMl92bGFuX21vZGUoYWRhcHRlci0+bmV0ZGV2LCBhZGFwdGVyLT5uZXRkZXYtPmZlYXR1cmVzKTsKIH0KIAotc3RhdGljIHUzMiBhdGwyX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgYXRsMl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAkvKgogCSAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHJ4L3R4IHZsYW4gYWNjZWwKQEAgLTQwNSw5ICs0MDcsMTAgQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLXN0YXRpYyBpbnQgYXRsMl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIGludCBhdGwyX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewotCXUzMiBjaGFuZ2VkID0gbmV0ZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBuZXRkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CiAKIAlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKIAkJYXRsMl92bGFuX21vZGUobmV0ZGV2LCBmZWF0dXJlcyk7CkBAIC0yMDQ5LDEwICsyMDUyLDEyIEBACiB7CiAJc3RydWN0IGF0bDJfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIGF0bDJfZHJpdmVyX25hbWUsIDMyKTsKLQlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIGF0bDJfZHJpdmVyX3ZlcnNpb24sIDMyKTsKLQlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJMMiIsIDMyKTsKLQlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwgMzIpOworCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCAgYXRsMl9kcml2ZXJfbmFtZSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgYXRsMl9kcml2ZXJfdmVyc2lvbiwKKwkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJMMiIsIHNpemVvZihkcnZpbmZvLT5md192ZXJzaW9uKSk7CisJc3RybGNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksCisJCXNpemVvZihkcnZpbmZvLT5idXNfaW5mbykpOwogCWRydmluZm8tPm5fc3RhdHMgPSAwOwogCWRydmluZm8tPnRlc3RpbmZvX2xlbiA9IDA7CiAJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSBhdGwyX2dldF9yZWdzX2xlbihuZXRkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGx4L2F0bHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2F0aGVyb3MvYXRseC9hdGx4LmMKaW5kZXggYWFiY2Y0Yi4uOGZmNzQxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYXRoZXJvcy9hdGx4L2F0bHguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9hdGhlcm9zL2F0bHgvYXRseC5jCkBAIC0yMTEsNyArMjExLDcgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyB2b2lkIF9fYXRseF92bGFuX21vZGUodTMyIGZlYXR1cmVzLCB1MzIgKmN0cmwpCitzdGF0aWMgdm9pZCBfX2F0bHhfdmxhbl9tb2RlKG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzLCB1MzIgKmN0cmwpCiB7CiAJaWYgKGZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1JYKSB7CiAJCS8qIGVuYWJsZSBWTEFOIHRhZyBpbnNlcnQvc3RyaXAgKi8KQEAgLTIyMiw3ICsyMjIsOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYXRseF92bGFuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIHZvaWQgYXRseF92bGFuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgYXRseF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMjQyLDcgKzI0Myw4IEBACiAJYXRseF92bGFuX21vZGUoYWRhcHRlci0+bmV0ZGV2LCBhZGFwdGVyLT5uZXRkZXYtPmZlYXR1cmVzKTsKIH0KIAotc3RhdGljIHUzMiBhdGx4X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgYXRseF9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAkvKgogCSAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHJ4L3R4IHZsYW4gYWNjZWwKQEAgLTI1Niw5ICsyNTgsMTAgQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLXN0YXRpYyBpbnQgYXRseF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIGludCBhdGx4X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewotCXUzMiBjaGFuZ2VkID0gbmV0ZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBuZXRkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CiAKIAlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKIAkJYXRseF92bGFuX21vZGUobmV0ZGV2LCBmZWF0dXJlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9iNDQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5jCmluZGV4IDRjZjgzNWQuLjNmYjY2ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2I0NC5jCkBAIC02MDgsNyArNjA4LDcgQEAKIAkJCQkgc2tiLT5sZW4sCiAJCQkJIERNQV9UT19ERVZJQ0UpOwogCQlycC0+c2tiID0gTlVMTDsKLQkJZGV2X2tmcmVlX3NrYihza2IpOworCQlkZXZfa2ZyZWVfc2tiX2lycShza2IpOwogCX0KIAogCWJwLT50eF9jb25zID0gY29uczsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuYwppbmRleCA5NjVjNzIzLi4wMjFmYjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5jCkBAIC01NywxMSArNTcsMTEgQEAKICNpbmNsdWRlICJibngyX2Z3LmgiCiAKICNkZWZpbmUgRFJWX01PRFVMRV9OQU1FCQkiYm54MiIKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OCSIyLjEuMTEiCi0jZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiSnVseSAyMCwgMjAxMSIKLSNkZWZpbmUgRldfTUlQU19GSUxFXzA2CQkiYm54Mi9ibngyLW1pcHMtMDYtNi4yLjEuZnciCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiMi4yLjEiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURQkiRGVjIDE4LCAyMDExIgorI2RlZmluZSBGV19NSVBTX0ZJTEVfMDYJCSJibngyL2JueDItbWlwcy0wNi02LjIuMy5mdyIKICNkZWZpbmUgRldfUlYyUF9GSUxFXzA2CQkiYm54Mi9ibngyLXJ2MnAtMDYtNi4wLjE1LmZ3IgotI2RlZmluZSBGV19NSVBTX0ZJTEVfMDkJCSJibngyL2JueDItbWlwcy0wOS02LjIuMWEuZnciCisjZGVmaW5lIEZXX01JUFNfRklMRV8wOQkJImJueDIvYm54Mi1taXBzLTA5LTYuMi4xYi5mdyIKICNkZWZpbmUgRldfUlYyUF9GSUxFXzA5X0F4CSJibngyL2JueDItcnYycC0wOWF4LTYuMC4xNy5mdyIKICNkZWZpbmUgRldfUlYyUF9GSUxFXzA5CQkiYm54Mi9ibngyLXJ2MnAtMDktNi4wLjE3LmZ3IgogCkBAIC00MDksNyArNDA5LDcgQEAKIAltdXRleF9sb2NrKCZicC0+Y25pY19sb2NrKTsKIAljcC0+ZHJ2X3N0YXRlID0gMDsKIAlibmFwaS0+Y25pY19wcmVzZW50ID0gMDsKLQlyY3VfYXNzaWduX3BvaW50ZXIoYnAtPmNuaWNfb3BzLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKGJwLT5jbmljX29wcywgTlVMTCk7CiAJbXV0ZXhfdW5sb2NrKCZicC0+Y25pY19sb2NrKTsKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIAlyZXR1cm4gMDsKQEAgLTIwNTQsOCArMjA1NCw4IEBACiAKIAlpZiAoYnAtPmF1dG9uZWcgJiBBVVRPTkVHX1NQRUVEKSB7CiAJCXUzMiBhZHZfcmVnLCBhZHYxMDAwX3JlZzsKLQkJdTMyIG5ld19hZHZfcmVnID0gMDsKLQkJdTMyIG5ld19hZHYxMDAwX3JlZyA9IDA7CisJCXUzMiBuZXdfYWR2ID0gMDsKKwkJdTMyIG5ld19hZHYxMDAwID0gMDsKIAogCQlibngyX3JlYWRfcGh5KGJwLCBicC0+bWlpX2FkdiwgJmFkdl9yZWcpOwogCQlhZHZfcmVnICY9IChQSFlfQUxMXzEwXzEwMF9TUEVFRCB8IEFEVkVSVElTRV9QQVVTRV9DQVAgfApAQCAtMjA2NCwyNyArMjA2NCwxOCBAQAogCQlibngyX3JlYWRfcGh5KGJwLCBNSUlfQ1RSTDEwMDAsICZhZHYxMDAwX3JlZyk7CiAJCWFkdjEwMDBfcmVnICY9IFBIWV9BTExfMTAwMF9TUEVFRDsKIAotCQlpZiAoYnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCi0JCQluZXdfYWR2X3JlZyB8PSBBRFZFUlRJU0VfMTBIQUxGOwotCQlpZiAoYnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCi0JCQluZXdfYWR2X3JlZyB8PSBBRFZFUlRJU0VfMTBGVUxMOwotCQlpZiAoYnAtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQotCQkJbmV3X2Fkdl9yZWcgfD0gQURWRVJUSVNFXzEwMEhBTEY7Ci0JCWlmIChicC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCi0JCQluZXdfYWR2X3JlZyB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKLQkJaWYgKGJwLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCi0JCQluZXdfYWR2MTAwMF9yZWcgfD0gQURWRVJUSVNFXzEwMDBGVUxMOworCQluZXdfYWR2ID0gZXRodG9vbF9hZHZfdG9fbWlpX2Fkdl90KGJwLT5hZHZlcnRpc2luZyk7CisJCW5ld19hZHYgfD0gQURWRVJUSVNFX0NTTUE7CisJCW5ld19hZHYgfD0gYm54Ml9waHlfZ2V0X3BhdXNlX2FkdihicCk7CiAKLQkJbmV3X2Fkdl9yZWcgfD0gQURWRVJUSVNFX0NTTUE7CisJCW5ld19hZHYxMDAwIHw9IGV0aHRvb2xfYWR2X3RvX21paV9jdHJsMTAwMF90KGJwLT5hZHZlcnRpc2luZyk7CiAKLQkJbmV3X2Fkdl9yZWcgfD0gYm54Ml9waHlfZ2V0X3BhdXNlX2FkdihicCk7Ci0KLQkJaWYgKChhZHYxMDAwX3JlZyAhPSBuZXdfYWR2MTAwMF9yZWcpIHx8Ci0JCQkoYWR2X3JlZyAhPSBuZXdfYWR2X3JlZykgfHwKKwkJaWYgKChhZHYxMDAwX3JlZyAhPSBuZXdfYWR2MTAwMCkgfHwKKwkJCShhZHZfcmVnICE9IG5ld19hZHYpIHx8CiAJCQkoKGJtY3IgJiBCTUNSX0FORU5BQkxFKSA9PSAwKSkgewogCi0JCQlibngyX3dyaXRlX3BoeShicCwgYnAtPm1paV9hZHYsIG5ld19hZHZfcmVnKTsKLQkJCWJueDJfd3JpdGVfcGh5KGJwLCBNSUlfQ1RSTDEwMDAsIG5ld19hZHYxMDAwX3JlZyk7CisJCQlibngyX3dyaXRlX3BoeShicCwgYnAtPm1paV9hZHYsIG5ld19hZHYpOworCQkJYm54Ml93cml0ZV9waHkoYnAsIE1JSV9DVFJMMTAwMCwgbmV3X2FkdjEwMDApOwogCQkJYm54Ml93cml0ZV9waHkoYnAsIGJwLT5taWlfYm1jciwgQk1DUl9BTlJFU1RBUlQgfAogCQkJCUJNQ1JfQU5FTkFCTEUpOwogCQl9CkBAIC0yNzM0LDMxICsyNzI1LDI3IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50Ci1ibngyX2FsbG9jX3J4X3NrYihzdHJ1Y3QgYm54MiAqYnAsIHN0cnVjdCBibngyX3J4X3JpbmdfaW5mbyAqcnhyLCB1MTYgaW5kZXgsIGdmcF90IGdmcCkKK2JueDJfYWxsb2NfcnhfZGF0YShzdHJ1Y3QgYm54MiAqYnAsIHN0cnVjdCBibngyX3J4X3JpbmdfaW5mbyAqcnhyLCB1MTYgaW5kZXgsIGdmcF90IGdmcCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4ICpkYXRhOwogCXN0cnVjdCBzd19iZCAqcnhfYnVmID0gJnJ4ci0+cnhfYnVmX3JpbmdbaW5kZXhdOwogCWRtYV9hZGRyX3QgbWFwcGluZzsKIAlzdHJ1Y3QgcnhfYmQgKnJ4YmQgPSAmcnhyLT5yeF9kZXNjX3JpbmdbUlhfUklORyhpbmRleCldW1JYX0lEWChpbmRleCldOwotCXVuc2lnbmVkIGxvbmcgYWxpZ247CiAKLQlza2IgPSBfX25ldGRldl9hbGxvY19za2IoYnAtPmRldiwgYnAtPnJ4X2J1Zl9zaXplLCBnZnApOwotCWlmIChza2IgPT0gTlVMTCkgeworCWRhdGEgPSBrbWFsbG9jKGJwLT5yeF9idWZfc2l6ZSwgZ2ZwKTsKKwlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PTUVNOwotCX0KIAotCWlmICh1bmxpa2VseSgoYWxpZ24gPSAodW5zaWduZWQgbG9uZykgc2tiLT5kYXRhICYgKEJOWDJfUlhfQUxJR04gLSAxKSkpKQotCQlza2JfcmVzZXJ2ZShza2IsIEJOWDJfUlhfQUxJR04gLSBhbGlnbik7Ci0KLQltYXBwaW5nID0gZG1hX21hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsIHNrYi0+ZGF0YSwgYnAtPnJ4X2J1Zl91c2Vfc2l6ZSwKKwltYXBwaW5nID0gZG1hX21hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsCisJCQkJIGdldF9sMl9maGRyKGRhdGEpLAorCQkJCSBicC0+cnhfYnVmX3VzZV9zaXplLAogCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCWlmIChkbWFfbWFwcGluZ19lcnJvcigmYnAtPnBkZXYtPmRldiwgbWFwcGluZykpIHsKLQkJZGV2X2tmcmVlX3NrYihza2IpOworCQlrZnJlZShkYXRhKTsKIAkJcmV0dXJuIC1FSU87CiAJfQogCi0JcnhfYnVmLT5za2IgPSBza2I7Ci0JcnhfYnVmLT5kZXNjID0gKHN0cnVjdCBsMl9maGRyICopIHNrYi0+ZGF0YTsKKwlyeF9idWYtPmRhdGEgPSBkYXRhOwogCWRtYV91bm1hcF9hZGRyX3NldChyeF9idWYsIG1hcHBpbmcsIG1hcHBpbmcpOwogCiAJcnhiZC0+cnhfYmRfaGFkZHJfaGkgPSAodTY0KSBtYXBwaW5nID4+IDMyOwpAQCAtMjgyMyw2ICsyODEwLDcgQEAKIAlzdHJ1Y3QgYm54Ml90eF9yaW5nX2luZm8gKnR4ciA9ICZibmFwaS0+dHhfcmluZzsKIAl1MTYgaHdfY29ucywgc3dfY29ucywgc3dfcmluZ19jb25zOwogCWludCB0eF9wa3QgPSAwLCBpbmRleDsKKwl1bnNpZ25lZCBpbnQgdHhfYnl0ZXMgPSAwOwogCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKIAogCWluZGV4ID0gKGJuYXBpIC0gYnAtPmJueDJfbmFwaSk7CkBAIC0yODc3LDYgKzI4NjUsNyBAQAogCiAJCXN3X2NvbnMgPSBORVhUX1RYX0JEKHN3X2NvbnMpOwogCisJCXR4X2J5dGVzICs9IHNrYi0+bGVuOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXR4X3BrdCsrOwogCQlpZiAodHhfcGt0ID09IGJ1ZGdldCkKQEAgLTI4ODYsNiArMjg3NSw3IEBACiAJCQlod19jb25zID0gYm54Ml9nZXRfaHdfdHhfY29ucyhibmFwaSk7CiAJfQogCisJbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZSh0eHEsIHR4X3BrdCwgdHhfYnl0ZXMpOwogCXR4ci0+aHdfdHhfY29ucyA9IGh3X2NvbnM7CiAJdHhyLT50eF9jb25zID0gc3dfY29uczsKIApAQCAtMjk2NSw4ICsyOTU1LDggQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkCi1ibngyX3JldXNlX3J4X3NrYihzdHJ1Y3QgYm54MiAqYnAsIHN0cnVjdCBibngyX3J4X3JpbmdfaW5mbyAqcnhyLAotCQkgIHN0cnVjdCBza19idWZmICpza2IsIHUxNiBjb25zLCB1MTYgcHJvZCkKK2JueDJfcmV1c2VfcnhfZGF0YShzdHJ1Y3QgYm54MiAqYnAsIHN0cnVjdCBibngyX3J4X3JpbmdfaW5mbyAqcnhyLAorCQkgICB1OCAqZGF0YSwgdTE2IGNvbnMsIHUxNiBwcm9kKQogewogCXN0cnVjdCBzd19iZCAqY29uc19yeF9idWYsICpwcm9kX3J4X2J1ZjsKIAlzdHJ1Y3QgcnhfYmQgKmNvbnNfYmQsICpwcm9kX2JkOwpAQCAtMjk4MCw4ICsyOTcwLDcgQEAKIAogCXJ4ci0+cnhfcHJvZF9ic2VxICs9IGJwLT5yeF9idWZfdXNlX3NpemU7CiAKLQlwcm9kX3J4X2J1Zi0+c2tiID0gc2tiOwotCXByb2RfcnhfYnVmLT5kZXNjID0gKHN0cnVjdCBsMl9maGRyICopIHNrYi0+ZGF0YTsKKwlwcm9kX3J4X2J1Zi0+ZGF0YSA9IGRhdGE7CiAKIAlpZiAoY29ucyA9PSBwcm9kKQogCQlyZXR1cm47CkBAIC0yOTk1LDMzICsyOTg0LDM5IEBACiAJcHJvZF9iZC0+cnhfYmRfaGFkZHJfbG8gPSBjb25zX2JkLT5yeF9iZF9oYWRkcl9sbzsKIH0KIAotc3RhdGljIGludAotYm54Ml9yeF9za2Ioc3RydWN0IGJueDIgKmJwLCBzdHJ1Y3QgYm54Ml9yeF9yaW5nX2luZm8gKnJ4ciwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqCitibngyX3J4X3NrYihzdHJ1Y3QgYm54MiAqYnAsIHN0cnVjdCBibngyX3J4X3JpbmdfaW5mbyAqcnhyLCB1OCAqZGF0YSwKIAkgICAgdW5zaWduZWQgaW50IGxlbiwgdW5zaWduZWQgaW50IGhkcl9sZW4sIGRtYV9hZGRyX3QgZG1hX2FkZHIsCiAJICAgIHUzMiByaW5nX2lkeCkKIHsKIAlpbnQgZXJyOwogCXUxNiBwcm9kID0gcmluZ19pZHggJiAweGZmZmY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCWVyciA9IGJueDJfYWxsb2Nfcnhfc2tiKGJwLCByeHIsIHByb2QsIEdGUF9BVE9NSUMpOworCWVyciA9IGJueDJfYWxsb2NfcnhfZGF0YShicCwgcnhyLCBwcm9kLCBHRlBfQVRPTUlDKTsKIAlpZiAodW5saWtlbHkoZXJyKSkgewotCQlibngyX3JldXNlX3J4X3NrYihicCwgcnhyLCBza2IsICh1MTYpIChyaW5nX2lkeCA+PiAxNiksIHByb2QpOworCQlibngyX3JldXNlX3J4X2RhdGEoYnAsIHJ4ciwgZGF0YSwgKHUxNikgKHJpbmdfaWR4ID4+IDE2KSwgcHJvZCk7CitlcnJvcjoKIAkJaWYgKGhkcl9sZW4pIHsKIAkJCXVuc2lnbmVkIGludCByYXdfbGVuID0gbGVuICsgNDsKIAkJCWludCBwYWdlcyA9IFBBR0VfQUxJR04ocmF3X2xlbiAtIGhkcl9sZW4pID4+IFBBR0VfU0hJRlQ7CiAKIAkJCWJueDJfcmV1c2Vfcnhfc2tiX3BhZ2VzKGJwLCByeHIsIE5VTEwsIHBhZ2VzKTsKIAkJfQotCQlyZXR1cm4gZXJyOworCQlyZXR1cm4gTlVMTDsKIAl9CiAKLQlza2JfcmVzZXJ2ZShza2IsIEJOWDJfUlhfT0ZGU0VUKTsKIAlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBkbWFfYWRkciwgYnAtPnJ4X2J1Zl91c2Vfc2l6ZSwKIAkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCisJc2tiID0gYnVpbGRfc2tiKGRhdGEpOworCWlmICghc2tiKSB7CisJCWtmcmVlKGRhdGEpOworCQlnb3RvIGVycm9yOworCX0KKwlza2JfcmVzZXJ2ZShza2IsICgodTggKilnZXRfbDJfZmhkcihkYXRhKSAtIGRhdGEpICsgQk5YMl9SWF9PRkZTRVQpOwogCWlmIChoZHJfbGVuID09IDApIHsKIAkJc2tiX3B1dChza2IsIGxlbik7Ci0JCXJldHVybiAwOworCQlyZXR1cm4gc2tiOwogCX0gZWxzZSB7CiAJCXVuc2lnbmVkIGludCBpLCBmcmFnX2xlbiwgZnJhZ19zaXplLCBwYWdlczsKIAkJc3RydWN0IHN3X3BnICpyeF9wZzsKQEAgLTMwNTIsNyArMzA0Nyw3IEBACiAJCQkJCXNrYl9mcmFnX3NpemVfc3ViKGZyYWcsIHRhaWwpOwogCQkJCQlza2ItPmRhdGFfbGVuIC09IHRhaWw7CiAJCQkJfQotCQkJCXJldHVybiAwOworCQkJCXJldHVybiBza2I7CiAJCQl9CiAJCQlyeF9wZyA9ICZyeHItPnJ4X3BnX3JpbmdbcGdfY29uc107CiAKQEAgLTMwNzQsNyArMzA2OSw3IEBACiAJCQkJcnhyLT5yeF9wZ19wcm9kID0gcGdfcHJvZDsKIAkJCQlibngyX3JldXNlX3J4X3NrYl9wYWdlcyhicCwgcnhyLCBza2IsCiAJCQkJCQkJcGFnZXMgLSBpKTsKLQkJCQlyZXR1cm4gZXJyOworCQkJCXJldHVybiBOVUxMOwogCQkJfQogCiAJCQlkbWFfdW5tYXBfcGFnZSgmYnAtPnBkZXYtPmRldiwgbWFwcGluZ19vbGQsCkBAIC0zMDkxLDcgKzMwODYsNyBAQAogCQlyeHItPnJ4X3BnX3Byb2QgPSBwZ19wcm9kOwogCQlyeHItPnJ4X3BnX2NvbnMgPSBwZ19jb25zOwogCX0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gc2tiOwogfQogCiBzdGF0aWMgaW5saW5lIHUxNgpAQCAtMzEzMCwxOSArMzEyNSwxNyBAQAogCQlzdHJ1Y3Qgc3dfYmQgKnJ4X2J1ZiwgKm5leHRfcnhfYnVmOwogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCQlkbWFfYWRkcl90IGRtYV9hZGRyOworCQl1OCAqZGF0YTsKIAogCQlzd19yaW5nX2NvbnMgPSBSWF9SSU5HX0lEWChzd19jb25zKTsKIAkJc3dfcmluZ19wcm9kID0gUlhfUklOR19JRFgoc3dfcHJvZCk7CiAKIAkJcnhfYnVmID0gJnJ4ci0+cnhfYnVmX3Jpbmdbc3dfcmluZ19jb25zXTsKLQkJc2tiID0gcnhfYnVmLT5za2I7Ci0JCXByZWZldGNodyhza2IpOworCQlkYXRhID0gcnhfYnVmLT5kYXRhOworCQlyeF9idWYtPmRhdGEgPSBOVUxMOwogCi0JCW5leHRfcnhfYnVmID0KLQkJCSZyeHItPnJ4X2J1Zl9yaW5nW1JYX1JJTkdfSURYKE5FWFRfUlhfQkQoc3dfY29ucykpXTsKLQkJcHJlZmV0Y2gobmV4dF9yeF9idWYtPmRlc2MpOwotCi0JCXJ4X2J1Zi0+c2tiID0gTlVMTDsKKwkJcnhfaGRyID0gZ2V0X2wyX2ZoZHIoZGF0YSk7CisJCXByZWZldGNoKHJ4X2hkcik7CiAKIAkJZG1hX2FkZHIgPSBkbWFfdW5tYXBfYWRkcihyeF9idWYsIG1hcHBpbmcpOwogCkBAIC0zMTUwLDcgKzMxNDMsMTAgQEAKIAkJCUJOWDJfUlhfT0ZGU0VUICsgQk5YMl9SWF9DT1BZX1RIUkVTSCwKIAkJCVBDSV9ETUFfRlJPTURFVklDRSk7CiAKLQkJcnhfaGRyID0gcnhfYnVmLT5kZXNjOworCQluZXh0X3J4X2J1ZiA9CisJCQkmcnhyLT5yeF9idWZfcmluZ1tSWF9SSU5HX0lEWChORVhUX1JYX0JEKHN3X2NvbnMpKV07CisJCXByZWZldGNoKGdldF9sMl9maGRyKG5leHRfcnhfYnVmLT5kYXRhKSk7CisKIAkJbGVuID0gcnhfaGRyLT5sMl9maGRyX3BrdF9sZW47CiAJCXN0YXR1cyA9IHJ4X2hkci0+bDJfZmhkcl9zdGF0dXM7CiAKQEAgLTMxNjksNyArMzE2NSw3IEBACiAJCQkJICAgICAgIEwyX0ZIRFJfRVJST1JTX1RPT19TSE9SVCB8CiAJCQkJICAgICAgIEwyX0ZIRFJfRVJST1JTX0dJQU5UX0ZSQU1FKSkpIHsKIAotCQkJYm54Ml9yZXVzZV9yeF9za2IoYnAsIHJ4ciwgc2tiLCBzd19yaW5nX2NvbnMsCisJCQlibngyX3JldXNlX3J4X2RhdGEoYnAsIHJ4ciwgZGF0YSwgc3dfcmluZ19jb25zLAogCQkJCQkgIHN3X3JpbmdfcHJvZCk7CiAJCQlpZiAocGdfcmluZ191c2VkKSB7CiAJCQkJaW50IHBhZ2VzOwpAQCAtMzE4NCwzMCArMzE4MCwyOSBAQAogCQlsZW4gLT0gNDsKIAogCQlpZiAobGVuIDw9IGJwLT5yeF9jb3B5X3RocmVzaCkgewotCQkJc3RydWN0IHNrX2J1ZmYgKm5ld19za2I7Ci0KLQkJCW5ld19za2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGJwLT5kZXYsIGxlbiArIDYpOwotCQkJaWYgKG5ld19za2IgPT0gTlVMTCkgewotCQkJCWJueDJfcmV1c2Vfcnhfc2tiKGJwLCByeHIsIHNrYiwgc3dfcmluZ19jb25zLAorCQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihicC0+ZGV2LCBsZW4gKyA2KTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCWJueDJfcmV1c2VfcnhfZGF0YShicCwgcnhyLCBkYXRhLCBzd19yaW5nX2NvbnMsCiAJCQkJCQkgIHN3X3JpbmdfcHJvZCk7CiAJCQkJZ290byBuZXh0X3J4OwogCQkJfQogCiAJCQkvKiBhbGlnbmVkIGNvcHkgKi8KLQkJCXNrYl9jb3B5X2Zyb21fbGluZWFyX2RhdGFfb2Zmc2V0KHNrYiwKLQkJCQkJCQkgQk5YMl9SWF9PRkZTRVQgLSA2LAotCQkJCSAgICAgIG5ld19za2ItPmRhdGEsIGxlbiArIDYpOwotCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgNik7Ci0JCQlza2JfcHV0KG5ld19za2IsIGxlbik7CisJCQltZW1jcHkoc2tiLT5kYXRhLAorCQkJICAgICAgICh1OCAqKXJ4X2hkciArIEJOWDJfUlhfT0ZGU0VUIC0gNiwKKwkJCSAgICAgICBsZW4gKyA2KTsKKwkJCXNrYl9yZXNlcnZlKHNrYiwgNik7CisJCQlza2JfcHV0KHNrYiwgbGVuKTsKIAotCQkJYm54Ml9yZXVzZV9yeF9za2IoYnAsIHJ4ciwgc2tiLAorCQkJYm54Ml9yZXVzZV9yeF9kYXRhKGJwLCByeHIsIGRhdGEsCiAJCQkJc3dfcmluZ19jb25zLCBzd19yaW5nX3Byb2QpOwogCi0JCQlza2IgPSBuZXdfc2tiOwotCQl9IGVsc2UgaWYgKHVubGlrZWx5KGJueDJfcnhfc2tiKGJwLCByeHIsIHNrYiwgbGVuLCBoZHJfbGVuLAotCQkJICAgZG1hX2FkZHIsIChzd19yaW5nX2NvbnMgPDwgMTYpIHwgc3dfcmluZ19wcm9kKSkpCi0JCQlnb3RvIG5leHRfcng7Ci0KKwkJfSBlbHNlIHsKKwkJCXNrYiA9IGJueDJfcnhfc2tiKGJwLCByeHIsIGRhdGEsIGxlbiwgaGRyX2xlbiwgZG1hX2FkZHIsCisJCQkJCSAgKHN3X3JpbmdfY29ucyA8PCAxNikgfCBzd19yaW5nX3Byb2QpOworCQkJaWYgKCFza2IpCisJCQkJZ290byBuZXh0X3J4OworCQl9CiAJCWlmICgoc3RhdHVzICYgTDJfRkhEUl9TVEFUVVNfTDJfVkxBTl9UQUcpICYmCiAJCSAgICAhKGJwLT5yeF9tb2RlICYgQk5YMl9FTUFDX1JYX01PREVfS0VFUF9WTEFOX1RBRykpCiAJCQlfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgcnhfaGRyLT5sMl9maGRyX3ZsYW5fdGFnKTsKQEAgLTUyMzQsNyArNTIyOSw3IEBACiAKIAlyaW5nX3Byb2QgPSBwcm9kID0gcnhyLT5yeF9wcm9kOwogCWZvciAoaSA9IDA7IGkgPCBicC0+cnhfcmluZ19zaXplOyBpKyspIHsKLQkJaWYgKGJueDJfYWxsb2Nfcnhfc2tiKGJwLCByeHIsIHJpbmdfcHJvZCwgR0ZQX0tFUk5FTCkgPCAwKSB7CisJCWlmIChibngyX2FsbG9jX3J4X2RhdGEoYnAsIHJ4ciwgcmluZ19wcm9kLCBHRlBfS0VSTkVMKSA8IDApIHsKIAkJCW5ldGRldl93YXJuKGJwLT5kZXYsICJpbml0J2VkIHJ4IHJpbmcgJWQgd2l0aCAlZC8lZCBza2JzIG9ubHlcbiIsCiAJCQkJICAgIHJpbmdfbnVtLCBpLCBicC0+cnhfcmluZ19zaXplKTsKIAkJCWJyZWFrOwpAQCAtNTMyOSw3ICs1MzI0LDcgQEAKIAlyeF9zaXplID0gYnAtPmRldi0+bXR1ICsgRVRIX0hMRU4gKyBCTlgyX1JYX09GRlNFVCArIDg7CiAKIAlyeF9zcGFjZSA9IFNLQl9EQVRBX0FMSUdOKHJ4X3NpemUgKyBCTlgyX1JYX0FMSUdOKSArIE5FVF9TS0JfUEFEICsKLQkJc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pOworCQlTS0JfREFUQV9BTElHTihzaXplb2Yoc3RydWN0IHNrYl9zaGFyZWRfaW5mbykpOwogCiAJYnAtPnJ4X2NvcHlfdGhyZXNoID0gQk5YMl9SWF9DT1BZX1RIUkVTSDsKIAlicC0+cnhfcGdfcmluZ19zaXplID0gMDsKQEAgLTUzNTEsOCArNTM0Niw5IEBACiAJfQogCiAJYnAtPnJ4X2J1Zl91c2Vfc2l6ZSA9IHJ4X3NpemU7Ci0JLyogaHcgYWxpZ25tZW50ICovCi0JYnAtPnJ4X2J1Zl9zaXplID0gYnAtPnJ4X2J1Zl91c2Vfc2l6ZSArIEJOWDJfUlhfQUxJR047CisJLyogaHcgYWxpZ25tZW50ICsgYnVpbGRfc2tiKCkgb3ZlcmhlYWQqLworCWJwLT5yeF9idWZfc2l6ZSA9IFNLQl9EQVRBX0FMSUdOKGJwLT5yeF9idWZfdXNlX3NpemUgKyBCTlgyX1JYX0FMSUdOKSArCisJCU5FVF9TS0JfUEFEICsgU0tCX0RBVEFfQUxJR04oc2l6ZW9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8pKTsKIAlicC0+cnhfanVtYm9fdGhyZXNoID0gcnhfc2l6ZSAtIEJOWDJfUlhfT0ZGU0VUOwogCWJwLT5yeF9yaW5nX3NpemUgPSBzaXplOwogCWJwLT5yeF9tYXhfcmluZyA9IGJueDJfZmluZF9tYXhfcmluZyhzaXplLCBNQVhfUlhfUklOR1MpOwpAQCAtNTQwMCw2ICs1Mzk2LDcgQEAKIAkJCX0KIAkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJfQorCQluZXRkZXZfdHhfcmVzZXRfcXVldWUobmV0ZGV2X2dldF90eF9xdWV1ZShicC0+ZGV2LCBpKSk7CiAJfQogfQogCkBAIC01NDE4LDkgKzU0MTUsOSBAQAogCiAJCWZvciAoaiA9IDA7IGogPCBicC0+cnhfbWF4X3JpbmdfaWR4OyBqKyspIHsKIAkJCXN0cnVjdCBzd19iZCAqcnhfYnVmID0gJnJ4ci0+cnhfYnVmX3Jpbmdbal07Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnhfYnVmLT5za2I7CisJCQl1OCAqZGF0YSA9IHJ4X2J1Zi0+ZGF0YTsKIAotCQkJaWYgKHNrYiA9PSBOVUxMKQorCQkJaWYgKGRhdGEgPT0gTlVMTCkKIAkJCQljb250aW51ZTsKIAogCQkJZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwKQEAgLTU0MjgsOSArNTQyNSw5IEBACiAJCQkJCSBicC0+cnhfYnVmX3VzZV9zaXplLAogCQkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKIAotCQkJcnhfYnVmLT5za2IgPSBOVUxMOworCQkJcnhfYnVmLT5kYXRhID0gTlVMTDsKIAotCQkJZGV2X2tmcmVlX3NrYihza2IpOworCQkJa2ZyZWUoZGF0YSk7CiAJCX0KIAkJZm9yIChqID0gMDsgaiA8IGJwLT5yeF9tYXhfcGdfcmluZ19pZHg7IGorKykKIAkJCWJueDJfZnJlZV9yeF9wYWdlKGJwLCByeHIsIGopOwpAQCAtNTczNiw3ICs1NzMzLDggQEAKIGJueDJfcnVuX2xvb3BiYWNrKHN0cnVjdCBibngyICpicCwgaW50IGxvb3BiYWNrX21vZGUpCiB7CiAJdW5zaWduZWQgaW50IHBrdF9zaXplLCBudW1fcGt0cywgaTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqcnhfc2tiOworCXN0cnVjdCBza19idWZmICpza2I7CisJdTggKmRhdGE7CiAJdW5zaWduZWQgY2hhciAqcGFja2V0OwogCXUxNiByeF9zdGFydF9pZHgsIHJ4X2lkeDsKIAlkbWFfYWRkcl90IG1hcDsKQEAgLTU4MjgsMTQgKzU4MjYsMTQgQEAKIAl9CiAKIAlyeF9idWYgPSAmcnhyLT5yeF9idWZfcmluZ1tyeF9zdGFydF9pZHhdOwotCXJ4X3NrYiA9IHJ4X2J1Zi0+c2tiOworCWRhdGEgPSByeF9idWYtPmRhdGE7CiAKLQlyeF9oZHIgPSByeF9idWYtPmRlc2M7Ci0Jc2tiX3Jlc2VydmUocnhfc2tiLCBCTlgyX1JYX09GRlNFVCk7CisJcnhfaGRyID0gZ2V0X2wyX2ZoZHIoZGF0YSk7CisJZGF0YSA9ICh1OCAqKXJ4X2hkciArIEJOWDJfUlhfT0ZGU0VUOwogCiAJZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUoJmJwLT5wZGV2LT5kZXYsCiAJCWRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCi0JCWJwLT5yeF9idWZfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJYnAtPnJ4X2J1Zl91c2Vfc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKIAogCWlmIChyeF9oZHItPmwyX2ZoZHJfc3RhdHVzICYKIAkJKEwyX0ZIRFJfRVJST1JTX0JBRF9DUkMgfApAQCAtNTg1Miw3ICs1ODUwLDcgQEAKIAl9CiAKIAlmb3IgKGkgPSAxNDsgaSA8IHBrdF9zaXplOyBpKyspIHsKLQkJaWYgKCoocnhfc2tiLT5kYXRhICsgaSkgIT0gKHVuc2lnbmVkIGNoYXIpIChpICYgMHhmZikpIHsKKwkJaWYgKCooZGF0YSArIGkpICE9ICh1bnNpZ25lZCBjaGFyKSAoaSAmIDB4ZmYpKSB7CiAJCQlnb3RvIGxvb3BiYWNrX3Rlc3RfZG9uZTsKIAkJfQogCX0KQEAgLTY1NTIsNiArNjU1MCw4IEBACiAJfQogCXR4YmQtPnR4X2JkX3ZsYW5fdGFnX2ZsYWdzIHw9IFRYX0JEX0ZMQUdTX0VORDsKIAorCW5ldGRldl90eF9zZW50X3F1ZXVlKHR4cSwgc2tiLT5sZW4pOworCiAJcHJvZCA9IE5FWFRfVFhfQkQocHJvZCk7CiAJdHhyLT50eF9wcm9kX2JzZXEgKz0gc2tiLT5sZW47CiAKQEAgLTY4NzMsMTAgKzY4NzMsMTAgQEAKIHsKIAlzdHJ1Y3QgYm54MiAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGJwLT5wZGV2KSk7Ci0Jc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sIGJwLT5md192ZXJzaW9uKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYnAtPnBkZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKKwlzdHJsY3B5KGluZm8tPmZ3X3ZlcnNpb24sIGJwLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbikpOwogfQogCiAjZGVmaW5lIEJOWDJfUkVHRFVNUF9MRU4JCSgzMiAqIDEwMjQpCkBAIC03NTcxLDggKzc1NzEsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTMyCi1ibngyX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QKK2JueDJfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBibngyICpicCA9IG5ldGRldl9wcml2KGRldik7CiAKQEAgLTc1ODMsNyArNzU4Myw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWJueDJfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK2JueDJfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBibngyICpicCA9IG5ldGRldl9wcml2KGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDIuaAppbmRleCA5OWQzMWE3Li4xZGIyZDUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54Mi5oCkBAIC02NTYzLDEyICs2NTYzLDI1IEBACiAjZGVmaW5lIE1CX1RYX0NJRF9BRERSCU1CX0dFVF9DSURfQUREUihUWF9DSUQpCiAjZGVmaW5lIE1CX1JYX0NJRF9BRERSCU1CX0dFVF9DSURfQUREUihSWF9DSUQpCiAKKy8qCisgKiBUaGlzIGRyaXZlciB1c2VzIG5ldyBidWlsZF9za2IoKSBBUEkgOgorICogUlggcmluZyBidWZmZXIgY29udGFpbnMgcG9pbnRlciB0byBrbWFsbG9jKCkgZGF0YSBvbmx5LAorICogc2tiIGFyZSBidWlsdCBvbmx5IGFmdGVyIEhhcmR3YXJlIGZpbGxlZCB0aGUgZnJhbWUuCisgKi8KIHN0cnVjdCBzd19iZCB7Ci0Jc3RydWN0IHNrX2J1ZmYJCSpza2I7Ci0Jc3RydWN0IGwyX2ZoZHIJCSpkZXNjOworCXU4CQkJKmRhdGE7CiAJREVGSU5FX0RNQV9VTk1BUF9BRERSKG1hcHBpbmcpOwogfTsKIAorLyogSXRzIGZhc3RlciB0byBjb21wdXRlIHRoaXMgZnJvbSBkYXRhIHRoYW4gc3RvcmluZyBpdCBpbiBzd19iZAorICogKGxlc3MgY2FjaGUgbWlzc2VzKQorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBsMl9maGRyICpnZXRfbDJfZmhkcih1OCAqZGF0YSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBsMl9maGRyICopKFBUUl9BTElHTihkYXRhLCBCTlgyX1JYX0FMSUdOKSArIE5FVF9TS0JfUEFEKTsKK30KKworCiBzdHJ1Y3Qgc3dfcGcgewogCXN0cnVjdCBwYWdlCQkqcGFnZTsKIAlERUZJTkVfRE1BX1VOTUFQX0FERFIobWFwcGluZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnguaAppbmRleCBhZWM3MjEyLi44YzczZDM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4LmgKQEAgLTIzLDggKzIzLDggQEAKICAqICh5b3Ugd2lsbCBuZWVkIHRvIHJlYm9vdCBhZnRlcndhcmRzKSAqLwogLyogI2RlZmluZSBCTlgyWF9TVE9QX09OX0VSUk9SICovCiAKLSNkZWZpbmUgRFJWX01PRFVMRV9WRVJTSU9OICAgICAgIjEuNzAuMzAtMCIKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFICAgICAgIjIwMTEvMTAvMjUiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTiAgICAgICIxLjcwLjM1LTAiCisjZGVmaW5lIERSVl9NT0RVTEVfUkVMREFURSAgICAgICIyMDExLzExLzEwIgogI2RlZmluZSBCTlgyWF9CQ19WRVIgICAgICAgICAgICAweDA0MDIwMAogCiAjaWYgZGVmaW5lZChDT05GSUdfRENCKQpAQCAtMjkzLDggKzI5MywxMyBAQAogI2RlZmluZSBGQ09FX1RYUV9JRFgoYnApCShNQVhfRVRIX1RYUV9JRFgoYnApKQogCiAvKiBmYXN0IHBhdGggKi8KKy8qCisgKiBUaGlzIGRyaXZlciB1c2VzIG5ldyBidWlsZF9za2IoKSBBUEkgOgorICogUlggcmluZyBidWZmZXIgY29udGFpbnMgcG9pbnRlciB0byBrbWFsbG9jKCkgZGF0YSBvbmx5LAorICogc2tiIGFyZSBidWlsdCBvbmx5IGFmdGVyIEhhcmR3YXJlIGZpbGxlZCB0aGUgZnJhbWUuCisgKi8KIHN0cnVjdCBzd19yeF9iZCB7Ci0Jc3RydWN0IHNrX2J1ZmYJKnNrYjsKKwl1OAkJKmRhdGE7CiAJREVGSU5FX0RNQV9VTk1BUF9BRERSKG1hcHBpbmcpOwogfTsKIApAQCAtNDExLDggKzQxNiw3IEBACiAKIAogLyogTnVtYmVyIG9mIHU2NCBlbGVtZW50cyBpbiBTR0UgbWFzayBhcnJheSAqLwotI2RlZmluZSBSWF9TR0VfTUFTS19MRU4JCQkoKE5VTV9SWF9TR0VfUEFHRVMgKiBSWF9TR0VfQ05UKSAvIFwKLQkJCQkJIEJJVF9WRUM2NF9FTEVNX1NaKQorI2RlZmluZSBSWF9TR0VfTUFTS19MRU4JCQkoTlVNX1JYX1NHRSAvIEJJVF9WRUM2NF9FTEVNX1NaKQogI2RlZmluZSBSWF9TR0VfTUFTS19MRU5fTUFTSwkJKFJYX1NHRV9NQVNLX0xFTiAtIDEpCiAjZGVmaW5lIE5FWFRfU0dFX01BU0tfRUxFTShlbCkJCSgoKGVsKSArIDEpICYgUlhfU0dFX01BU0tfTEVOX01BU0spCiAKQEAgLTQyNSw4ICs0MjksOCBAQAogCiBzdHJ1Y3QgYm54MnhfYWdnX2luZm8gewogCS8qCi0JICogRmlyc3QgYWdncmVnYXRpb24gYnVmZmVyIGlzIGFuIHNrYiwgdGhlIGZvbGxvd2luZyAtIGFyZSBwYWdlcy4KLQkgKiBXZSB3aWxsIHByZWFsbG9jYXRlIHRoZSBza2JzIGZvciBlYWNoIGFnZ3JlZ2F0aW9uIHdoZW4KKwkgKiBGaXJzdCBhZ2dyZWdhdGlvbiBidWZmZXIgaXMgYSBkYXRhIGJ1ZmZlciwgdGhlIGZvbGxvd2luZyAtIGFyZSBwYWdlcy4KKwkgKiBXZSB3aWxsIHByZWFsbG9jYXRlIHRoZSBkYXRhIGJ1ZmZlciBmb3IgZWFjaCBhZ2dyZWdhdGlvbiB3aGVuCiAJICogd2Ugb3BlbiB0aGUgaW50ZXJmYWNlIGFuZCB3aWxsIHJlcGxhY2UgdGhlIEJEIGF0IHRoZSBjb25zdW1lcgogCSAqIHdpdGggdGhpcyBvbmUgd2hlbiB3ZSByZWNlaXZlIHRoZSBUUEFfU1RBUlQgQ1FFIGluIG9yZGVyIHRvCiAJICoga2VlcCB0aGUgUnggQkQgcmluZyBjb25zaXN0ZW50LgpAQCAtNDQwLDYgKzQ0NCw3IEBACiAJdTE2CQkJcGFyc2luZ19mbGFnczsKIAl1MTYJCQl2bGFuX3RhZzsKIAl1MTYJCQlsZW5fb25fYmQ7CisJdTMyCQkJcnhoYXNoOwogfTsKIAogI2RlZmluZSBRX1NUQVRTX09GRlNFVDMyKHN0YXRfbmFtZSkgXApAQCAtNTA3LDYgKzUxMiw3IEBACiAJX19sZTE2CQkJZnBfaGNfaWR4OwogCiAJdTgJCQlpbmRleDsJCS8qIG51bWJlciBpbiBmcCBhcnJheSAqLworCXU4CQkJcnhfcXVldWU7CS8qIGluZGV4IGZvciBza2JfcmVjb3JkICovCiAJdTgJCQljbF9pZDsJCS8qIGV0aCBjbGllbnQgaWQgKi8KIAl1OAkJCWNsX3F6b25lX2lkOwogCXU4CQkJZndfc2JfaWQ7CS8qIHN0YXR1cyBibG9jayBudW1iZXIgaW4gRlcgKi8KQEAgLTg4MSw2ICs4ODcsOCBAQAogI2RlZmluZSBDSElQX1BPUlRfTU9ERV9OT05FCQkJMHgyCiAjZGVmaW5lIENISVBfTU9ERShicCkJCQkoYnAtPmNvbW1vbi5jaGlwX3BvcnRfbW9kZSkKICNkZWZpbmUgQ0hJUF9NT0RFX0lTXzRfUE9SVChicCkgKENISVBfTU9ERShicCkgPT0gQ0hJUF80X1BPUlRfTU9ERSkKKworCXUzMgkJCWJvb3RfbW9kZTsKIH07CiAKIC8qIElHVSBNU0lYIFNUQVRJU1RJQ1Mgb24gNTc3MTI6IDY0IGZvciBWRnM7IDQgZm9yIFBGczsgNCBmb3IgQXR0ZW50aW9ucyAqLwpAQCAtMTA0Miw2ICsxMDUwLDggQEAKIAogCXUzMgkJCQl3Yl9jb21wOwogCXUzMgkJCQl3Yl9kYXRhWzRdOworCisJdW5pb24gZHJ2X2luZm9fdG9fbWNwCQlkcnZfaW5mb190b19tY3A7CiB9OwogCiAjZGVmaW5lIGJueDJ4X3NwKGJwLCB2YXIpCQkoJmJwLT5zbG93cGF0aC0+dmFyKQpAQCAtMTEyMiwxOCArMTEzMiwyMSBAQAogZW51bSB7CiAJQk5YMlhfUE9SVF9RVUVSWV9JRFgsCiAJQk5YMlhfUEZfUVVFUllfSURYLAorCUJOWDJYX0ZDT0VfUVVFUllfSURYLAogCUJOWDJYX0ZJUlNUX1FVRVVFX1FVRVJZX0lEWCwKIH07CiAKIHN0cnVjdCBibngyeF9md19zdGF0c19yZXEgewogCXN0cnVjdCBzdGF0c19xdWVyeV9oZWFkZXIgaGRyOwotCXN0cnVjdCBzdGF0c19xdWVyeV9lbnRyeSBxdWVyeVtTVEFUU19RVUVSWV9DTURfQ09VTlRdOworCXN0cnVjdCBzdGF0c19xdWVyeV9lbnRyeSBxdWVyeVtGUF9TQl9NQVhfRTF4KworCQlCTlgyWF9GSVJTVF9RVUVVRV9RVUVSWV9JRFhdOwogfTsKIAogc3RydWN0IGJueDJ4X2Z3X3N0YXRzX2RhdGEgewogCXN0cnVjdCBzdGF0c19jb3VudGVyCXN0b3JtX2NvdW50ZXJzOwogCXN0cnVjdCBwZXJfcG9ydF9zdGF0cwlwb3J0OwogCXN0cnVjdCBwZXJfcGZfc3RhdHMJcGY7CisJc3RydWN0IGZjb2Vfc3RhdGlzdGljc19wYXJhbXMJZmNvZTsKIAlzdHJ1Y3QgcGVyX3F1ZXVlX3N0YXRzICBxdWV1ZV9zdGF0c1sxXTsKIH07CiAKQEAgLTExNDEsNiArMTE1NCw3IEBACiBlbnVtIHsKIAlCTlgyWF9TUF9SVE5MX1NFVFVQX1RDLAogCUJOWDJYX1NQX1JUTkxfVFhfVElNRU9VVCwKKwlCTlgyWF9TUF9SVE5MX0ZBTl9GQUlMVVJFLAogfTsKIAogCkBAIC0xMTg2LDEwICsxMjAwLDIwIEBACiAjZGVmaW5lIEVUSF9NQVhfSlVNQk9fUEFDS0VUX1NJWkUJOTYwMAogCiAJLyogTWF4IHN1cHBvcnRlZCBhbGlnbm1lbnQgaXMgMjU2ICg4IHNoaWZ0KSAqLwotI2RlZmluZSBCTlgyWF9SWF9BTElHTl9TSElGVAkJKChMMV9DQUNIRV9TSElGVCA8IDgpID8gXAotCQkJCQkgTDFfQ0FDSEVfU0hJRlQgOiA4KQotCS8qIEZXIHVzZSAyIENhY2hlIGxpbmVzIEFsaWdubWVudCBmb3Igc3RhcnQgcGFja2V0IGFuZCBzaXplICAqLwotI2RlZmluZSBCTlgyWF9GV19SWF9BTElHTgkJKDIgPDwgQk5YMlhfUlhfQUxJR05fU0hJRlQpCisjZGVmaW5lIEJOWDJYX1JYX0FMSUdOX1NISUZUCQltaW4oOCwgTDFfQ0FDSEVfU0hJRlQpCisKKwkvKiBGVyB1c2VzIDIgQ2FjaGUgbGluZXMgQWxpZ25tZW50IGZvciBzdGFydCBwYWNrZXQgYW5kIHNpemUKKwkgKgorCSAqIFdlIGFzc3VtZSBza2JfYnVpbGQoKSB1c2VzIHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSBieXRlcworCSAqIGF0IHRoZSBlbmQgb2Ygc2tiLT5kYXRhLCB0byBhdm9pZCB3YXN0aW5nIGEgZnVsbCBjYWNoZSBsaW5lLgorCSAqIFRoaXMgcmVkdWNlcyBtZW1vcnkgdXNlIChza2ItPnRydWVzaXplKS4KKwkgKi8KKyNkZWZpbmUgQk5YMlhfRldfUlhfQUxJR05fU1RBUlQJKDFVTCA8PCBCTlgyWF9SWF9BTElHTl9TSElGVCkKKworI2RlZmluZSBCTlgyWF9GV19SWF9BTElHTl9FTkQJCQkJCVwKKwltYXgoMVVMIDw8IEJOWDJYX1JYX0FMSUdOX1NISUZULCAJCQlcCisJICAgIFNLQl9EQVRBX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSkpCisKICNkZWZpbmUgQk5YMlhfUFhQX0RSQU1fQUxJR04JCShCTlgyWF9SWF9BTElHTl9TSElGVCAtIDUpCiAKIAlzdHJ1Y3QgaG9zdF9zcF9zdGF0dXNfYmxvY2sgKmRlZl9zdGF0dXNfYmxrOwpAQCAtMTI0OSw2ICsxMjczLDcgQEAKICNkZWZpbmUgTk9fSVNDU0lfT09PX0ZMQUcJCSgxIDw8IDEzKQogI2RlZmluZSBOT19JU0NTSV9GTEFHCQkJKDEgPDwgMTQpCiAjZGVmaW5lIE5PX0ZDT0VfRkxBRwkJCSgxIDw8IDE1KQorI2RlZmluZSBCQ19TVVBQT1JUU19QRkNfU1RBVFMJCSgxIDw8IDE3KQogCiAjZGVmaW5lIE5PX0lTQ1NJKGJwKQkJKChicCktPmZsYWdzICYgTk9fSVNDU0lfRkxBRykKICNkZWZpbmUgTk9fSVNDU0lfT09PKGJwKQkoKGJwKS0+ZmxhZ3MgJiBOT19JU0NTSV9PT09fRkxBRykKQEAgLTE5ODQsMTMgKzIwMDksNiBAQAogI2RlZmluZSBIV19QUlRZX0FTU0VSVF9TRVRfNCAoQUVVX0lOUFVUU19BVFROX0JJVFNfUEdMVUVfUEFSSVRZX0VSUk9SIHwgXAogCQkJICAgICAgQUVVX0lOUFVUU19BVFROX0JJVFNfQVRDX1BBUklUWV9FUlJPUikKIAotI2RlZmluZSBSU1NfRkxBR1MoYnApIFwKLQkJKFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfSVBWNF9DQVBBQklMSVRZIHwgXAotCQkgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY0X1RDUF9DQVBBQklMSVRZIHwgXAotCQkgVFNUT1JNX0VUSF9GVU5DVElPTl9DT01NT05fQ09ORklHX1JTU19JUFY2X0NBUEFCSUxJVFkgfCBcCi0JCSBUU1RPUk1fRVRIX0ZVTkNUSU9OX0NPTU1PTl9DT05GSUdfUlNTX0lQVjZfVENQX0NBUEFCSUxJVFkgfCBcCi0JCSAoYnAtPm11bHRpX21vZGUgPDwgXAotCQkgIFRTVE9STV9FVEhfRlVOQ1RJT05fQ09NTU9OX0NPTkZJR19SU1NfTU9ERV9TSElGVCkpCiAjZGVmaW5lIE1VTFRJX01BU0sJCQkweDdmCiAKIApAQCAtMjA1NSw2ICsyMDczLDggQEAKICNkZWZpbmUgQk5YMlhfVlBEX0xFTgkJCTEyOAogI2RlZmluZSBWRU5ET1JfSURfTEVOCQkJNAogCitpbnQgYm54MnhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CisKIC8qIENvbmdlc3Rpb24gbWFuYWdlbWVudCBmYWlybmVzcyBtb2RlICovCiAjZGVmaW5lIENNTkdfRk5TX05PTkUJCTAKICNkZWZpbmUgQ01OR19GTlNfTUlOTUFYCQkxCkBAIC0yMDcyLDQgKzIwOTIsMTYgQEAKIAogdm9pZCBibngyeF9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CiB2b2lkIGJueDJ4X25vdGlmeV9saW5rX2NoYW5nZWQoc3RydWN0IGJueDJ4ICpicCk7CisKKworI2RlZmluZSBCTlgyWF9NRl9QUk9UT0NPTChicCkgXAorCSgoYnApLT5tZl9jb25maWdbQlBfVk4oYnApXSAmIEZVTkNfTUZfQ0ZHX1BST1RPQ09MX01BU0spCisKKyNpZmRlZiBCQ01fQ05JQworI2RlZmluZSBCTlgyWF9JU19NRl9QUk9UT0NPTF9JU0NTSShicCkgXAorCShCTlgyWF9NRl9QUk9UT0NPTChicCkgPT0gRlVOQ19NRl9DRkdfUFJPVE9DT0xfSVNDU0kpCisKKyNkZWZpbmUgSVNfTUZfSVNDU0lfU0QoYnApIChJU19NRl9TRChicCkgJiYgQk5YMlhfSVNfTUZfUFJPVE9DT0xfSVNDU0koYnApKQorI2VuZGlmCisKICNlbmRpZiAvKiBibngyeC5oICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5jCmluZGV4IDU4MGI0NGUuLjJiNzMxYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5jCkBAIC03OSwxOSArNzksMjEgQEAKICAqIEB0bzoJCWRlc3RpbmF0aW9uIEZQIGluZGV4CiAgKgogICogTWFrZXMgc3VyZSB0aGUgY29udGVudHMgb2YgdGhlIGJwLT5mcFt0b10ubmFwaSBpcyBrZXB0Ci0gKiBpbnRhY3QuCisgKiBpbnRhY3QuIFRoaXMgaXMgZG9uZSBieSBmaXJzdCBjb3B5aW5nIHRoZSBuYXBpIHN0cnVjdCBmcm9tCisgKiB0aGUgdGFyZ2V0IHRvIHRoZSBzb3VyY2UsIGFuZCB0aGVuIG1lbSBjb3B5aW5nIHRoZSBlbnRpcmUKKyAqIHNvdXJjZSBvbnRvIHRoZSB0YXJnZXQKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X21vdmVfZnAoc3RydWN0IGJueDJ4ICpicCwgaW50IGZyb20sIGludCB0bykKIHsKIAlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZyb21fZnAgPSAmYnAtPmZwW2Zyb21dOwogCXN0cnVjdCBibngyeF9mYXN0cGF0aCAqdG9fZnAgPSAmYnAtPmZwW3RvXTsKLQlzdHJ1Y3QgbmFwaV9zdHJ1Y3Qgb3JpZ19uYXBpID0gdG9fZnAtPm5hcGk7CisKKwkvKiBDb3B5IHRoZSBOQVBJIG9iamVjdCBhcyBpdCBoYXMgYmVlbiBhbHJlYWR5IGluaXRpYWxpemVkICovCisJZnJvbV9mcC0+bmFwaSA9IHRvX2ZwLT5uYXBpOworCiAJLyogTW92ZSBibngyeF9mYXN0cGF0aCBjb250ZW50cyAqLwogCW1lbWNweSh0b19mcCwgZnJvbV9mcCwgc2l6ZW9mKCp0b19mcCkpOwogCXRvX2ZwLT5pbmRleCA9IHRvOwotCi0JLyogUmVzdG9yZSB0aGUgTkFQSSBvYmplY3QgYXMgaXQgaGFzIGJlZW4gYWxyZWFkeSBpbml0aWFsaXplZCAqLwotCXRvX2ZwLT5uYXBpID0gb3JpZ19uYXBpOwogfQogCiBpbnQgbG9hZF9jb3VudFsyXVszXSA9IHsgezB9IH07IC8qIHBlci1wYXRoOiAwLWNvbW1vbiwgMS1wb3J0MCwgMi1wb3J0MSAqLwpAQCAtMTAwLDcgKzEwMiw4IEBACiAgKiByZXR1cm4gaWR4IG9mIGxhc3QgYmQgZnJlZWQKICAqLwogc3RhdGljIHUxNiBibngyeF9mcmVlX3R4X3BrdChzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54MnhfZnBfdHhkYXRhICp0eGRhdGEsCi0JCQkgICAgIHUxNiBpZHgpCisJCQkgICAgIHUxNiBpZHgsIHVuc2lnbmVkIGludCAqcGt0c19jb21wbCwKKwkJCSAgICAgdW5zaWduZWQgaW50ICpieXRlc19jb21wbCkKIHsKIAlzdHJ1Y3Qgc3dfdHhfYmQgKnR4X2J1ZiA9ICZ0eGRhdGEtPnR4X2J1Zl9yaW5nW2lkeF07CiAJc3RydWN0IGV0aF90eF9zdGFydF9iZCAqdHhfc3RhcnRfYmQ7CkBAIC0xNTcsNiArMTYwLDEwIEBACiAKIAkvKiByZWxlYXNlIHNrYiAqLwogCVdBUk5fT04oIXNrYik7CisJaWYgKHNrYikgeworCQkoKnBrdHNfY29tcGwpKys7CisJCSgqYnl0ZXNfY29tcGwpICs9IHNrYi0+bGVuOworCX0KIAlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCXR4X2J1Zi0+Zmlyc3RfYmQgPSAwOwogCXR4X2J1Zi0+c2tiID0gTlVMTDsKQEAgLTE2OCw2ICsxNzUsNyBAQAogewogCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKIAl1MTYgaHdfY29ucywgc3dfY29ucywgYmRfY29ucyA9IHR4ZGF0YS0+dHhfYmRfY29uczsKKwl1bnNpZ25lZCBpbnQgcGt0c19jb21wbCA9IDAsIGJ5dGVzX2NvbXBsID0gMDsKIAogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKIAlpZiAodW5saWtlbHkoYnAtPnBhbmljKSkKQEAgLTE4NywxMCArMTk1LDE0IEBACiAJCQkJICAgICAgIiBwa3RfY29ucyAldVxuIiwKIAkJICAgdHhkYXRhLT50eHFfaW5kZXgsIGh3X2NvbnMsIHN3X2NvbnMsIHBrdF9jb25zKTsKIAotCQliZF9jb25zID0gYm54MnhfZnJlZV90eF9wa3QoYnAsIHR4ZGF0YSwgcGt0X2NvbnMpOworCQliZF9jb25zID0gYm54MnhfZnJlZV90eF9wa3QoYnAsIHR4ZGF0YSwgcGt0X2NvbnMsCisJCSAgICAmcGt0c19jb21wbCwgJmJ5dGVzX2NvbXBsKTsKKwogCQlzd19jb25zKys7CiAJfQogCisJbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZSh0eHEsIHBrdHNfY29tcGwsIGJ5dGVzX2NvbXBsKTsKKwogCXR4ZGF0YS0+dHhfcGt0X2NvbnMgPSBzd19jb25zOwogCXR4ZGF0YS0+dHhfYmRfY29ucyA9IGJkX2NvbnM7CiAKQEAgLTI5Miw4ICszMDQsMjEgQEAKIAkgICBmcC0+bGFzdF9tYXhfc2dlLCBmcC0+cnhfc2dlX3Byb2QpOwogfQogCisvKiBTZXQgVG9lcGxpdHogaGFzaCB2YWx1ZSBpbiB0aGUgc2tiIHVzaW5nIHRoZSB2YWx1ZSBmcm9tIHRoZQorICogQ1FFIChjYWxjdWxhdGVkIGJ5IEhXKS4KKyAqLworc3RhdGljIHUzMiBibngyeF9nZXRfcnhoYXNoKGNvbnN0IHN0cnVjdCBibngyeCAqYnAsCisJCQkgICAgY29uc3Qgc3RydWN0IGV0aF9mYXN0X3BhdGhfcnhfY3FlICpjcWUpCit7CisJLyogU2V0IFRvZXBsaXR6IGhhc2ggZnJvbSBDUUUgKi8KKwlpZiAoKGJwLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpICYmCisJICAgIChjcWUtPnN0YXR1c19mbGFncyAmIEVUSF9GQVNUX1BBVEhfUlhfQ1FFX1JTU19IQVNIX0ZMRykpCisJCXJldHVybiBsZTMyX3RvX2NwdShjcWUtPnJzc19oYXNoX3Jlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyB2b2lkIGJueDJ4X3RwYV9zdGFydChzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLCB1MTYgcXVldWUsCi0JCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGNvbnMsIHUxNiBwcm9kLAorCQkJICAgIHUxNiBjb25zLCB1MTYgcHJvZCwKIAkJCSAgICBzdHJ1Y3QgZXRoX2Zhc3RfcGF0aF9yeF9jcWUgKmNxZSkKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gZnAtPmJwOwpAQCAtMzA4LDkgKzMzMyw5IEBACiAJaWYgKHRwYV9pbmZvLT50cGFfc3RhdGUgIT0gQk5YMlhfVFBBX1NUT1ApCiAJCUJOWDJYX0VSUigic3RhcnQgb2YgYmluIG5vdCBpbiBzdG9wIFslZF1cbiIsIHF1ZXVlKTsKIAotCS8qIFRyeSB0byBtYXAgYW4gZW1wdHkgc2tiIGZyb20gdGhlIGFnZ3JlZ2F0aW9uIGluZm8gICovCisJLyogVHJ5IHRvIG1hcCBhbiBlbXB0eSBkYXRhIGJ1ZmZlciBmcm9tIHRoZSBhZ2dyZWdhdGlvbiBpbmZvICAqLwogCW1hcHBpbmcgPSBkbWFfbWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwKLQkJCQkgZmlyc3RfYnVmLT5za2ItPmRhdGEsCisJCQkJIGZpcnN0X2J1Zi0+ZGF0YSArIE5FVF9TS0JfUEFELAogCQkJCSBmcC0+cnhfYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CiAJLyoKIAkgKiAgLi4uaWYgaXQgZmFpbHMgLSBtb3ZlIHRoZSBza2IgZnJvbSB0aGUgY29uc3VtZXIgdG8gdGhlIHByb2R1Y2VyCkBAIC0zMjAsMTUgKzM0NSwxNSBAQAogCiAJaWYgKHVubGlrZWx5KGRtYV9tYXBwaW5nX2Vycm9yKCZicC0+cGRldi0+ZGV2LCBtYXBwaW5nKSkpIHsKIAkJLyogTW92ZSB0aGUgQkQgZnJvbSB0aGUgY29uc3VtZXIgdG8gdGhlIHByb2R1Y2VyICovCi0JCWJueDJ4X3JldXNlX3J4X3NrYihmcCwgY29ucywgcHJvZCk7CisJCWJueDJ4X3JldXNlX3J4X2RhdGEoZnAsIGNvbnMsIHByb2QpOwogCQl0cGFfaW5mby0+dHBhX3N0YXRlID0gQk5YMlhfVFBBX0VSUk9SOwogCQlyZXR1cm47CiAJfQogCi0JLyogbW92ZSBlbXB0eSBza2IgZnJvbSBwb29sIHRvIHByb2QgKi8KLQlwcm9kX3J4X2J1Zi0+c2tiID0gZmlyc3RfYnVmLT5za2I7CisJLyogbW92ZSBlbXB0eSBkYXRhIGZyb20gcG9vbCB0byBwcm9kICovCisJcHJvZF9yeF9idWYtPmRhdGEgPSBmaXJzdF9idWYtPmRhdGE7CiAJZG1hX3VubWFwX2FkZHJfc2V0KHByb2RfcnhfYnVmLCBtYXBwaW5nLCBtYXBwaW5nKTsKLQkvKiBwb2ludCBwcm9kX2JkIHRvIG5ldyBza2IgKi8KKwkvKiBwb2ludCBwcm9kX2JkIHRvIG5ldyBkYXRhICovCiAJcHJvZF9iZC0+YWRkcl9oaSA9IGNwdV90b19sZTMyKFU2NF9ISShtYXBwaW5nKSk7CiAJcHJvZF9iZC0+YWRkcl9sbyA9IGNwdV90b19sZTMyKFU2NF9MTyhtYXBwaW5nKSk7CiAKQEAgLTM0Miw2ICszNjcsNyBAQAogCXRwYV9pbmZvLT50cGFfc3RhdGUgPSBCTlgyWF9UUEFfU1RBUlQ7CiAJdHBhX2luZm8tPmxlbl9vbl9iZCA9IGxlMTZfdG9fY3B1KGNxZS0+bGVuX29uX2JkKTsKIAl0cGFfaW5mby0+cGxhY2VtZW50X29mZnNldCA9IGNxZS0+cGxhY2VtZW50X29mZnNldDsKKwl0cGFfaW5mby0+cnhoYXNoID0gYm54MnhfZ2V0X3J4aGFzaChicCwgY3FlKTsKIAogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKIAlmcC0+dHBhX3F1ZXVlX3VzZWQgfD0gKDEgPDwgcXVldWUpOwpAQCAtNDY5LDExICs0OTUsMTIgQEAKIHsKIAlzdHJ1Y3QgYm54MnhfYWdnX2luZm8gKnRwYV9pbmZvID0gJmZwLT50cGFfaW5mb1txdWV1ZV07CiAJc3RydWN0IHN3X3J4X2JkICpyeF9idWYgPSAmdHBhX2luZm8tPmZpcnN0X2J1ZjsKLQl1OCBwYWQgPSB0cGFfaW5mby0+cGxhY2VtZW50X29mZnNldDsKKwl1MzIgcGFkID0gdHBhX2luZm8tPnBsYWNlbWVudF9vZmZzZXQ7CiAJdTE2IGxlbiA9IHRwYV9pbmZvLT5sZW5fb25fYmQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHJ4X2J1Zi0+c2tiOworCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXU4ICpkYXRhID0gcnhfYnVmLT5kYXRhOwogCS8qIGFsbG9jIG5ldyBza2IgKi8KLQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYjsKKwl1OCAqbmV3X2RhdGE7CiAJdTggb2xkX3RwYV9zdGF0ZSA9IHRwYV9pbmZvLT50cGFfc3RhdGU7CiAKIAl0cGFfaW5mby0+dHBhX3N0YXRlID0gQk5YMlhfVFBBX1NUT1A7CkBAIC00ODQsMTggKzUxMSwxOCBAQAogCWlmIChvbGRfdHBhX3N0YXRlID09IEJOWDJYX1RQQV9FUlJPUikKIAkJZ290byBkcm9wOwogCi0JLyogVHJ5IHRvIGFsbG9jYXRlIHRoZSBuZXcgc2tiICovCi0JbmV3X3NrYiA9IG5ldGRldl9hbGxvY19za2IoYnAtPmRldiwgZnAtPnJ4X2J1Zl9zaXplKTsKKwkvKiBUcnkgdG8gYWxsb2NhdGUgdGhlIG5ldyBkYXRhICovCisJbmV3X2RhdGEgPSBrbWFsbG9jKGZwLT5yeF9idWZfc2l6ZSArIE5FVF9TS0JfUEFELCBHRlBfQVRPTUlDKTsKIAogCS8qIFVubWFwIHNrYiBpbiB0aGUgcG9vbCBhbnl3YXksIGFzIHdlIGFyZSBnb2luZyB0byBjaGFuZ2UKIAkgICBwb29sIGVudHJ5IHN0YXR1cyB0byBCTlgyWF9UUEFfU1RPUCBldmVuIGlmIG5ldyBza2IgYWxsb2NhdGlvbgogCSAgIGZhaWxzLiAqLwogCWRtYV91bm1hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsIGRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCiAJCQkgZnAtPnJ4X2J1Zl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOworCWlmIChsaWtlbHkobmV3X2RhdGEpKQorCQlza2IgPSBidWlsZF9za2IoZGF0YSk7CiAKLQlpZiAobGlrZWx5KG5ld19za2IpKSB7Ci0JCXByZWZldGNoKHNrYik7Ci0JCXByZWZldGNoKCgoY2hhciAqKShza2IpKSArIEwxX0NBQ0hFX0JZVEVTKTsKKwlpZiAobGlrZWx5KHNrYikpIHsKIAogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKIAkJaWYgKHBhZCArIGxlbiA+IGZwLT5yeF9idWZfc2l6ZSkgewpAQCAtNTA3LDggKzUzNCw5IEBACiAJCX0KICNlbmRpZgogCi0JCXNrYl9yZXNlcnZlKHNrYiwgcGFkKTsKKwkJc2tiX3Jlc2VydmUoc2tiLCBwYWQgKyBORVRfU0tCX1BBRCk7CiAJCXNrYl9wdXQoc2tiLCBsZW4pOworCQlza2ItPnJ4aGFzaCA9IHRwYV9pbmZvLT5yeGhhc2g7CiAKIAkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgYnAtPmRldik7CiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CkBAIC01MjQsOCArNTUyLDggQEAKIAkJfQogCiAKLQkJLyogcHV0IG5ldyBza2IgaW4gYmluICovCi0JCXJ4X2J1Zi0+c2tiID0gbmV3X3NrYjsKKwkJLyogcHV0IG5ldyBkYXRhIGluIGJpbiAqLworCQlyeF9idWYtPmRhdGEgPSBuZXdfZGF0YTsKIAogCQlyZXR1cm47CiAJfQpAQCAtNTM3LDE5ICs1NjUsNiBAQAogCWZwLT5ldGhfcV9zdGF0cy5yeF9za2JfYWxsb2NfZmFpbGVkKys7CiB9CiAKLS8qIFNldCBUb2VwbGl0eiBoYXNoIHZhbHVlIGluIHRoZSBza2IgdXNpbmcgdGhlIHZhbHVlIGZyb20gdGhlCi0gKiBDUUUgKGNhbGN1bGF0ZWQgYnkgSFcpLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYm54Mnhfc2V0X3NrYl9yeGhhc2goc3RydWN0IGJueDJ4ICpicCwgdW5pb24gZXRoX3J4X2NxZSAqY3FlLAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCS8qIFNldCBUb2VwbGl0eiBoYXNoIGZyb20gQ1FFICovCi0JaWYgKChicC0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhIQVNIKSAmJgotCSAgICAoY3FlLT5mYXN0X3BhdGhfY3FlLnN0YXR1c19mbGFncyAmCi0JICAgICBFVEhfRkFTVF9QQVRIX1JYX0NRRV9SU1NfSEFTSF9GTEcpKQotCQlza2ItPnJ4aGFzaCA9Ci0JCWxlMzJfdG9fY3B1KGNxZS0+ZmFzdF9wYXRoX2NxZS5yc3NfaGFzaF9yZXN1bHQpOwotfQogCiBpbnQgYm54MnhfcnhfaW50KHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsIGludCBidWRnZXQpCiB7CkBAIC01OTIsNiArNjA3LDcgQEAKIAkJdTggY3FlX2ZwX2ZsYWdzOwogCQllbnVtIGV0aF9yeF9jcWVfdHlwZSBjcWVfZnBfdHlwZTsKIAkJdTE2IGxlbiwgcGFkOworCQl1OCAqZGF0YTsKIAogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKIAkJaWYgKHVubGlrZWx5KGJwLT5wYW5pYykpCkBAIC02MDIsMTMgKzYxOCw2IEBACiAJCWJkX3Byb2QgPSBSWF9CRChiZF9wcm9kKTsKIAkJYmRfY29ucyA9IFJYX0JEKGJkX2NvbnMpOwogCi0JCS8qIFByZWZldGNoIHRoZSBwYWdlIGNvbnRhaW5pbmcgdGhlIEJEIGRlc2NyaXB0b3IKLQkJICAgYXQgcHJvZHVjZXIncyBpbmRleC4gSXQgd2lsbCBiZSBuZWVkZWQgd2hlbiBuZXcgc2tiIGlzCi0JCSAgIGFsbG9jYXRlZCAqLwotCQlwcmVmZXRjaCgodm9pZCAqKShQQUdFX0FMSUdOKCh1bnNpZ25lZCBsb25nKQotCQkJCQkgICAgICgmZnAtPnJ4X2Rlc2NfcmluZ1tiZF9wcm9kXSkpIC0KLQkJCQkgIFBBR0VfU0laRSArIDEpKTsKLQogCQljcWUgPSAmZnAtPnJ4X2NvbXBfcmluZ1tjb21wX3JpbmdfY29uc107CiAJCWNxZV9mcCA9ICZjcWUtPmZhc3RfcGF0aF9jcWU7CiAJCWNxZV9mcF9mbGFncyA9IGNxZV9mcC0+dHlwZV9lcnJvcl9mbGFnczsKQEAgLTYyNCwxMzggKzYzMywxMjMgQEAKIAkJaWYgKHVubGlrZWx5KENRRV9UWVBFX1NMT1coY3FlX2ZwX3R5cGUpKSkgewogCQkJYm54Mnhfc3BfZXZlbnQoZnAsIGNxZSk7CiAJCQlnb3RvIG5leHRfY3FlOworCQl9CisJCXJ4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbYmRfY29uc107CisJCWRhdGEgPSByeF9idWYtPmRhdGE7CiAKLQkJLyogdGhpcyBpcyBhbiByeCBwYWNrZXQgKi8KLQkJfSBlbHNlIHsKLQkJCXJ4X2J1ZiA9ICZmcC0+cnhfYnVmX3JpbmdbYmRfY29uc107Ci0JCQlza2IgPSByeF9idWYtPnNrYjsKLQkJCXByZWZldGNoKHNrYik7Ci0KLQkJCWlmICghQ1FFX1RZUEVfRkFTVChjcWVfZnBfdHlwZSkpIHsKKwkJaWYgKCFDUUVfVFlQRV9GQVNUKGNxZV9mcF90eXBlKSkgewogI2lmZGVmIEJOWDJYX1NUT1BfT05fRVJST1IKLQkJCQkvKiBzYW5pdHkgY2hlY2sgKi8KLQkJCQlpZiAoZnAtPmRpc2FibGVfdHBhICYmCi0JCQkJICAgIChDUUVfVFlQRV9TVEFSVChjcWVfZnBfdHlwZSkgfHwKLQkJCQkgICAgIENRRV9UWVBFX1NUT1AoY3FlX2ZwX3R5cGUpKSkKLQkJCQkJQk5YMlhfRVJSKCJTVEFSVC9TVE9QIHBhY2tldCB3aGlsZSAiCi0JCQkJCQkgICJkaXNhYmxlX3RwYSB0eXBlICV4XG4iLAotCQkJCQkJICBDUUVfVFlQRShjcWVfZnBfdHlwZSkpOworCQkJLyogc2FuaXR5IGNoZWNrICovCisJCQlpZiAoZnAtPmRpc2FibGVfdHBhICYmCisJCQkgICAgKENRRV9UWVBFX1NUQVJUKGNxZV9mcF90eXBlKSB8fAorCQkJICAgICBDUUVfVFlQRV9TVE9QKGNxZV9mcF90eXBlKSkpCisJCQkJQk5YMlhfRVJSKCJTVEFSVC9TVE9QIHBhY2tldCB3aGlsZSAiCisJCQkJCSAgImRpc2FibGVfdHBhIHR5cGUgJXhcbiIsCisJCQkJCSAgQ1FFX1RZUEUoY3FlX2ZwX3R5cGUpKTsKICNlbmRpZgogCi0JCQkJaWYgKENRRV9UWVBFX1NUQVJUKGNxZV9mcF90eXBlKSkgewotCQkJCQl1MTYgcXVldWUgPSBjcWVfZnAtPnF1ZXVlX2luZGV4OwotCQkJCQlEUChORVRJRl9NU0dfUlhfU1RBVFVTLAotCQkJCQkgICAiY2FsbGluZyB0cGFfc3RhcnQgb24gcXVldWUgJWRcbiIsCi0JCQkJCSAgIHF1ZXVlKTsKKwkJCWlmIChDUUVfVFlQRV9TVEFSVChjcWVfZnBfdHlwZSkpIHsKKwkJCQl1MTYgcXVldWUgPSBjcWVfZnAtPnF1ZXVlX2luZGV4OworCQkJCURQKE5FVElGX01TR19SWF9TVEFUVVMsCisJCQkJICAgImNhbGxpbmcgdHBhX3N0YXJ0IG9uIHF1ZXVlICVkXG4iLAorCQkJCSAgIHF1ZXVlKTsKIAotCQkJCQlibngyeF90cGFfc3RhcnQoZnAsIHF1ZXVlLCBza2IsCi0JCQkJCQkJYmRfY29ucywgYmRfcHJvZCwKLQkJCQkJCQljcWVfZnApOworCQkJCWJueDJ4X3RwYV9zdGFydChmcCwgcXVldWUsCisJCQkJCQliZF9jb25zLCBiZF9wcm9kLAorCQkJCQkJY3FlX2ZwKTsKKwkJCQlnb3RvIG5leHRfcng7CisJCQl9IGVsc2UgeworCQkJCXUxNiBxdWV1ZSA9CisJCQkJCWNxZS0+ZW5kX2FnZ19jcWUucXVldWVfaW5kZXg7CisJCQkJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywKKwkJCQkgICAiY2FsbGluZyB0cGFfc3RvcCBvbiBxdWV1ZSAlZFxuIiwKKwkJCQkgICBxdWV1ZSk7CiAKLQkJCQkJLyogU2V0IFRvZXBsaXR6IGhhc2ggZm9yIExSTyBza2IgKi8KLQkJCQkJYm54Mnhfc2V0X3NrYl9yeGhhc2goYnAsIGNxZSwgc2tiKTsKLQotCQkJCQlnb3RvIG5leHRfcng7Ci0KLQkJCQl9IGVsc2UgewotCQkJCQl1MTYgcXVldWUgPQotCQkJCQkJY3FlLT5lbmRfYWdnX2NxZS5xdWV1ZV9pbmRleDsKLQkJCQkJRFAoTkVUSUZfTVNHX1JYX1NUQVRVUywKLQkJCQkJICAgImNhbGxpbmcgdHBhX3N0b3Agb24gcXVldWUgJWRcbiIsCi0JCQkJCSAgIHF1ZXVlKTsKLQotCQkJCQlibngyeF90cGFfc3RvcChicCwgZnAsIHF1ZXVlLAotCQkJCQkJICAgICAgICZjcWUtPmVuZF9hZ2dfY3FlLAotCQkJCQkJICAgICAgIGNvbXBfcmluZ19jb25zKTsKKwkJCQlibngyeF90cGFfc3RvcChicCwgZnAsIHF1ZXVlLAorCQkJCQkgICAgICAgJmNxZS0+ZW5kX2FnZ19jcWUsCisJCQkJCSAgICAgICBjb21wX3JpbmdfY29ucyk7CiAjaWZkZWYgQk5YMlhfU1RPUF9PTl9FUlJPUgotCQkJCQlpZiAoYnAtPnBhbmljKQotCQkJCQkJcmV0dXJuIDA7CisJCQkJaWYgKGJwLT5wYW5pYykKKwkJCQkJcmV0dXJuIDA7CiAjZW5kaWYKIAotCQkJCQlibngyeF91cGRhdGVfc2dlX3Byb2QoZnAsIGNxZV9mcCk7Ci0JCQkJCWdvdG8gbmV4dF9jcWU7Ci0JCQkJfQorCQkJCWJueDJ4X3VwZGF0ZV9zZ2VfcHJvZChmcCwgY3FlX2ZwKTsKKwkJCQlnb3RvIG5leHRfY3FlOwogCQkJfQotCQkJLyogbm9uIFRQQSAqLwotCQkJbGVuID0gbGUxNl90b19jcHUoY3FlX2ZwLT5wa3RfbGVuKTsKLQkJCXBhZCA9IGNxZV9mcC0+cGxhY2VtZW50X29mZnNldDsKLQkJCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCZicC0+cGRldi0+ZGV2LAorCQl9CisJCS8qIG5vbiBUUEEgKi8KKwkJbGVuID0gbGUxNl90b19jcHUoY3FlX2ZwLT5wa3RfbGVuKTsKKwkJcGFkID0gY3FlX2ZwLT5wbGFjZW1lbnRfb2Zmc2V0OworCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdSgmYnAtPnBkZXYtPmRldiwKIAkJCQkJZG1hX3VubWFwX2FkZHIocnhfYnVmLCBtYXBwaW5nKSwKLQkJCQkJCSAgICAgICBwYWQgKyBSWF9DT1BZX1RIUkVTSCwKLQkJCQkJCSAgICAgICBETUFfRlJPTV9ERVZJQ0UpOwotCQkJcHJlZmV0Y2goKChjaGFyICopKHNrYikpICsgTDFfQ0FDSEVfQllURVMpOworCQkJCQlwYWQgKyBSWF9DT1BZX1RIUkVTSCwKKwkJCQkJRE1BX0ZST01fREVWSUNFKTsKKwkJcGFkICs9IE5FVF9TS0JfUEFEOworCQlwcmVmZXRjaChkYXRhICsgcGFkKTsgLyogc3BlZWR1cCBldGhfdHlwZV90cmFucygpICovCisJCS8qIGlzIHRoaXMgYW4gZXJyb3IgcGFja2V0PyAqLworCQlpZiAodW5saWtlbHkoY3FlX2ZwX2ZsYWdzICYgRVRIX1JYX0VSUk9SX0ZBTEdTKSkgeworCQkJRFAoTkVUSUZfTVNHX1JYX0VSUiwKKwkJCSAgICJFUlJPUiAgZmxhZ3MgJXggIHJ4IHBhY2tldCAldVxuIiwKKwkJCSAgIGNxZV9mcF9mbGFncywgc3dfY29tcF9jb25zKTsKKwkJCWZwLT5ldGhfcV9zdGF0cy5yeF9lcnJfZGlzY2FyZF9wa3QrKzsKKwkJCWdvdG8gcmV1c2Vfcng7CisJCX0KIAotCQkJLyogaXMgdGhpcyBhbiBlcnJvciBwYWNrZXQ/ICovCi0JCQlpZiAodW5saWtlbHkoY3FlX2ZwX2ZsYWdzICYgRVRIX1JYX0VSUk9SX0ZBTEdTKSkgeworCQkvKiBTaW5jZSB3ZSBkb24ndCBoYXZlIGEganVtYm8gcmluZworCQkgKiBjb3B5IHNtYWxsIHBhY2tldHMgaWYgbXR1ID4gMTUwMAorCQkgKi8KKwkJaWYgKChicC0+ZGV2LT5tdHUgPiBFVEhfTUFYX1BBQ0tFVF9TSVpFKSAmJgorCQkgICAgKGxlbiA8PSBSWF9DT1BZX1RIUkVTSCkpIHsKKwkJCXNrYiA9IG5ldGRldl9hbGxvY19za2JfaXBfYWxpZ24oYnAtPmRldiwgbGVuKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgewogCQkJCURQKE5FVElGX01TR19SWF9FUlIsCi0JCQkJICAgIkVSUk9SICBmbGFncyAleCAgcnggcGFja2V0ICV1XG4iLAotCQkJCSAgIGNxZV9mcF9mbGFncywgc3dfY29tcF9jb25zKTsKLQkJCQlmcC0+ZXRoX3Ffc3RhdHMucnhfZXJyX2Rpc2NhcmRfcGt0Kys7CisJCQkJICAgIkVSUk9SICBwYWNrZXQgZHJvcHBlZCBiZWNhdXNlIG9mIGFsbG9jIGZhaWx1cmVcbiIpOworCQkJCWZwLT5ldGhfcV9zdGF0cy5yeF9za2JfYWxsb2NfZmFpbGVkKys7CiAJCQkJZ290byByZXVzZV9yeDsKIAkJCX0KLQotCQkJLyogU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGp1bWJvIHJpbmcKLQkJCSAqIGNvcHkgc21hbGwgcGFja2V0cyBpZiBtdHUgPiAxNTAwCi0JCQkgKi8KLQkJCWlmICgoYnAtPmRldi0+bXR1ID4gRVRIX01BWF9QQUNLRVRfU0laRSkgJiYKLQkJCSAgICAobGVuIDw9IFJYX0NPUFlfVEhSRVNIKSkgewotCQkJCXN0cnVjdCBza19idWZmICpuZXdfc2tiOwotCi0JCQkJbmV3X3NrYiA9IG5ldGRldl9hbGxvY19za2IoYnAtPmRldiwgbGVuICsgcGFkKTsKLQkJCQlpZiAobmV3X3NrYiA9PSBOVUxMKSB7Ci0JCQkJCURQKE5FVElGX01TR19SWF9FUlIsCi0JCQkJCSAgICJFUlJPUiAgcGFja2V0IGRyb3BwZWQgIgotCQkJCQkgICAiYmVjYXVzZSBvZiBhbGxvYyBmYWlsdXJlXG4iKTsKLQkJCQkJZnAtPmV0aF9xX3N0YXRzLnJ4X3NrYl9hbGxvY19mYWlsZWQrKzsKLQkJCQkJZ290byByZXVzZV9yeDsKLQkJCQl9Ci0KLQkJCQkvKiBhbGlnbmVkIGNvcHkgKi8KLQkJCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIHBhZCwKLQkJCQkJCSAgICBuZXdfc2tiLT5kYXRhICsgcGFkLCBsZW4pOwotCQkJCXNrYl9yZXNlcnZlKG5ld19za2IsIHBhZCk7Ci0JCQkJc2tiX3B1dChuZXdfc2tiLCBsZW4pOwotCi0JCQkJYm54MnhfcmV1c2Vfcnhfc2tiKGZwLCBiZF9jb25zLCBiZF9wcm9kKTsKLQotCQkJCXNrYiA9IG5ld19za2I7Ci0KLQkJCX0gZWxzZQotCQkJaWYgKGxpa2VseShibngyeF9hbGxvY19yeF9za2IoYnAsIGZwLCBiZF9wcm9kKSA9PSAwKSkgeworCQkJbWVtY3B5KHNrYi0+ZGF0YSwgZGF0YSArIHBhZCwgbGVuKTsKKwkJCWJueDJ4X3JldXNlX3J4X2RhdGEoZnAsIGJkX2NvbnMsIGJkX3Byb2QpOworCQl9IGVsc2UgeworCQkJaWYgKGxpa2VseShibngyeF9hbGxvY19yeF9kYXRhKGJwLCBmcCwgYmRfcHJvZCkgPT0gMCkpIHsKIAkJCQlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LAotCQkJCQlkbWFfdW5tYXBfYWRkcihyeF9idWYsIG1hcHBpbmcpLAorCQkJCQkJIGRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCiAJCQkJCQkgZnAtPnJ4X2J1Zl9zaXplLAogCQkJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCQkJc2tiID0gYnVpbGRfc2tiKGRhdGEpOworCQkJCWlmICh1bmxpa2VseSghc2tiKSkgeworCQkJCQlrZnJlZShkYXRhKTsKKwkJCQkJZnAtPmV0aF9xX3N0YXRzLnJ4X3NrYl9hbGxvY19mYWlsZWQrKzsKKwkJCQkJZ290byBuZXh0X3J4OworCQkJCX0KIAkJCQlza2JfcmVzZXJ2ZShza2IsIHBhZCk7Ci0JCQkJc2tiX3B1dChza2IsIGxlbik7Ci0KIAkJCX0gZWxzZSB7CiAJCQkJRFAoTkVUSUZfTVNHX1JYX0VSUiwKIAkJCQkgICAiRVJST1IgIHBhY2tldCBkcm9wcGVkIGJlY2F1c2UgIgogCQkJCSAgICJvZiBhbGxvYyBmYWlsdXJlXG4iKTsKIAkJCQlmcC0+ZXRoX3Ffc3RhdHMucnhfc2tiX2FsbG9jX2ZhaWxlZCsrOwogcmV1c2Vfcng6Ci0JCQkJYm54MnhfcmV1c2Vfcnhfc2tiKGZwLCBiZF9jb25zLCBiZF9wcm9kKTsKKwkJCQlibngyeF9yZXVzZV9yeF9kYXRhKGZwLCBiZF9jb25zLCBiZF9wcm9kKTsKIAkJCQlnb3RvIG5leHRfcng7CiAJCQl9Ci0KLQkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOwotCi0JCQkvKiBTZXQgVG9lcGxpdHogaGFzaCBmb3IgYSBub25lLUxSTyBza2IgKi8KLQkJCWJueDJ4X3NldF9za2JfcnhoYXNoKGJwLCBjcWUsIHNrYik7Ci0KLQkJCXNrYl9jaGVja3N1bV9ub25lX2Fzc2VydChza2IpOwotCi0JCQlpZiAoYnAtPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkgewotCi0JCQkJaWYgKGxpa2VseShCTlgyWF9SWF9DU1VNX09LKGNxZSkpKQotCQkJCQlza2ItPmlwX3N1bW1lZCA9IENIRUNLU1VNX1VOTkVDRVNTQVJZOwotCQkJCWVsc2UKLQkJCQkJZnAtPmV0aF9xX3N0YXRzLmh3X2NzdW1fZXJyKys7Ci0JCQl9CiAJCX0KIAotCQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgZnAtPmluZGV4KTsKKwkJc2tiX3B1dChza2IsIGxlbik7CisJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGJwLT5kZXYpOworCisJCS8qIFNldCBUb2VwbGl0eiBoYXNoIGZvciBhIG5vbmUtTFJPIHNrYiAqLworCQlza2ItPnJ4aGFzaCA9IGJueDJ4X2dldF9yeGhhc2goYnAsIGNxZV9mcCk7CisKKwkJc2tiX2NoZWNrc3VtX25vbmVfYXNzZXJ0KHNrYik7CisKKwkJaWYgKGJwLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pIHsKKworCQkJaWYgKGxpa2VseShCTlgyWF9SWF9DU1VNX09LKGNxZSkpKQorCQkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJCQllbHNlCisJCQkJZnAtPmV0aF9xX3N0YXRzLmh3X2NzdW1fZXJyKys7CisJCX0KKworCQlza2JfcmVjb3JkX3J4X3F1ZXVlKHNrYiwgZnAtPnJ4X3F1ZXVlKTsKIAogCQlpZiAobGUxNl90b19jcHUoY3FlX2ZwLT5wYXJzX2ZsYWdzLmZsYWdzKSAmCiAJCSAgICBQQVJTSU5HX0ZMQUdTX1ZMQU4pCkBAIC03NjUsNyArNzU5LDcgQEAKIAogCiBuZXh0X3J4OgotCQlyeF9idWYtPnNrYiA9IE5VTEw7CisJCXJ4X2J1Zi0+ZGF0YSA9IE5VTEw7CiAKIAkJYmRfY29ucyA9IE5FWFRfUlhfSURYKGJkX2NvbnMpOwogCQliZF9wcm9kID0gTkVYVF9SWF9JRFgoYmRfcHJvZCk7CkBAIC0xMDExLDkgKzEwMDUsOSBAQAogCQkJCXN0cnVjdCBzd19yeF9iZCAqZmlyc3RfYnVmID0KIAkJCQkJJnRwYV9pbmZvLT5maXJzdF9idWY7CiAKLQkJCQlmaXJzdF9idWYtPnNrYiA9IG5ldGRldl9hbGxvY19za2IoYnAtPmRldiwKLQkJCQkJCSAgICAgICBmcC0+cnhfYnVmX3NpemUpOwotCQkJCWlmICghZmlyc3RfYnVmLT5za2IpIHsKKwkJCQlmaXJzdF9idWYtPmRhdGEgPSBrbWFsbG9jKGZwLT5yeF9idWZfc2l6ZSArIE5FVF9TS0JfUEFELAorCQkJCQkJCSAgR0ZQX0FUT01JQyk7CisJCQkJaWYgKCFmaXJzdF9idWYtPmRhdGEpIHsKIAkJCQkJQk5YMlhfRVJSKCJGYWlsZWQgdG8gYWxsb2NhdGUgVFBBICIKIAkJCQkJCSAgInNrYiBwb29sIGZvciBxdWV1ZVslZF0gLSAiCiAJCQkJCQkgICJkaXNhYmxpbmcgVFBBIG9uIHRoaXMgIgpAQCAtMTA5MywxNiArMTA4NywxOCBAQAogCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKIAkJZm9yX2VhY2hfY29zX2luX3R4X3F1ZXVlKGZwLCBjb3MpIHsKIAkJCXN0cnVjdCBibngyeF9mcF90eGRhdGEgKnR4ZGF0YSA9ICZmcC0+dHhkYXRhW2Nvc107CisJCQl1bnNpZ25lZCBwa3RzX2NvbXBsID0gMCwgYnl0ZXNfY29tcGwgPSAwOwogCi0JCQl1MTYgYmRfY29ucyA9IHR4ZGF0YS0+dHhfYmRfY29uczsKIAkJCXUxNiBzd19wcm9kID0gdHhkYXRhLT50eF9wa3RfcHJvZDsKIAkJCXUxNiBzd19jb25zID0gdHhkYXRhLT50eF9wa3RfY29uczsKIAogCQkJd2hpbGUgKHN3X2NvbnMgIT0gc3dfcHJvZCkgewotCQkJCWJkX2NvbnMgPSBibngyeF9mcmVlX3R4X3BrdChicCwgdHhkYXRhLAotCQkJCQkJCSAgICBUWF9CRChzd19jb25zKSk7CisJCQkJYm54MnhfZnJlZV90eF9wa3QoYnAsIHR4ZGF0YSwgVFhfQkQoc3dfY29ucyksCisJCQkJICAgICZwa3RzX2NvbXBsLCAmYnl0ZXNfY29tcGwpOwogCQkJCXN3X2NvbnMrKzsKIAkJCX0KKwkJCW5ldGRldl90eF9yZXNldF9xdWV1ZSgKKwkJCSAgICBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGJwLT5kZXYsIHR4ZGF0YS0+dHhxX2luZGV4KSk7CiAJCX0KIAl9CiB9CkBAIC0xMTE4LDE2ICsxMTE0LDE2IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1JYX0JEOyBpKyspIHsKIAkJc3RydWN0IHN3X3J4X2JkICpyeF9idWYgPSAmZnAtPnJ4X2J1Zl9yaW5nW2ldOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcnhfYnVmLT5za2I7CisJCXU4ICpkYXRhID0gcnhfYnVmLT5kYXRhOwogCi0JCWlmIChza2IgPT0gTlVMTCkKKwkJaWYgKGRhdGEgPT0gTlVMTCkKIAkJCWNvbnRpbnVlOwogCQlkbWFfdW5tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LAogCQkJCSBkbWFfdW5tYXBfYWRkcihyeF9idWYsIG1hcHBpbmcpLAogCQkJCSBmcC0+cnhfYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7CiAKLQkJcnhfYnVmLT5za2IgPSBOVUxMOwotCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJ4X2J1Zi0+ZGF0YSA9IE5VTEw7CisJCWtmcmVlKGRhdGEpOwogCX0KIH0KIApAQCAtMTQ0NSw2ICsxNDQxLDExIEBACiAJCWJyZWFrOwogCX0KIAorI2lmZGVmIEJDTV9DTklDCisJLyogb3ZlcnJpZGUgaW4gSVNDU0kgU0QgbW9kICovCisJaWYgKElTX01GX0lTQ1NJX1NEKGJwKSkKKwkJYnAtPm51bV9xdWV1ZXMgPSAxOworI2VuZGlmCiAJLyogQWRkIHNwZWNpYWwgcXVldWVzICovCiAJYnAtPm51bV9xdWV1ZXMgKz0gTk9OX0VUSF9DT05URVhUX1VTRTsKIH0KQEAgLTE1MDksNiArMTUxMCw3IEBACiAKIAlmb3JfZWFjaF9xdWV1ZShicCwgaSkgewogCQlzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwID0gJmJwLT5mcFtpXTsKKwkJdTMyIG10dTsKIAogCQkvKiBBbHdheXMgdXNlIGEgbWluaS1qdW1ibyBNVFUgZm9yIHRoZSBGQ29FIEwyIHJpbmcgKi8KIAkJaWYgKElTX0ZDT0VfSURYKGkpKQpAQCAtMTUxOCwxMyArMTUyMCwxNSBAQAogCQkJICogSVBfSEVBREVSX0FMSUdOTUVOVF9QQURESU5HIHRvIHByZXZlbnQgYSBidWZmZXIKIAkJCSAqIG92ZXJydW4gYXR0YWNrLgogCQkJICovCi0JCQlmcC0+cnhfYnVmX3NpemUgPQotCQkJCUJOWDJYX0ZDT0VfTUlOSV9KVU1CT19NVFUgKyBFVEhfT1ZSRUhFQUQgKwotCQkJCUJOWDJYX0ZXX1JYX0FMSUdOICsgSVBfSEVBREVSX0FMSUdOTUVOVF9QQURESU5HOworCQkJbXR1ID0gQk5YMlhfRkNPRV9NSU5JX0pVTUJPX01UVTsKIAkJZWxzZQotCQkJZnAtPnJ4X2J1Zl9zaXplID0KLQkJCQlicC0+ZGV2LT5tdHUgKyBFVEhfT1ZSRUhFQUQgKwotCQkJCUJOWDJYX0ZXX1JYX0FMSUdOICsgSVBfSEVBREVSX0FMSUdOTUVOVF9QQURESU5HOworCQkJbXR1ID0gYnAtPmRldi0+bXR1OworCQlmcC0+cnhfYnVmX3NpemUgPSBCTlgyWF9GV19SWF9BTElHTl9TVEFSVCArCisJCQkJICBJUF9IRUFERVJfQUxJR05NRU5UX1BBRERJTkcgKworCQkJCSAgRVRIX09WUkVIRUFEICsKKwkJCQkgIG10dSArCisJCQkJICBCTlgyWF9GV19SWF9BTElHTl9FTkQ7CisJCS8qIE5vdGUgOiByeF9idWZfc2l6ZSBkb2VzbnQgdGFrZSBpbnRvIGFjY291bnQgTkVUX1NLQl9QQUQgKi8KIAl9CiB9CiAKQEAgLTE1NDEsNyArMTU0NSw4IEBACiAJaWYgKGJwLT5tdWx0aV9tb2RlICE9IEVUSF9SU1NfTU9ERV9ESVNBQkxFRCkgewogCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGluZF90YWJsZSk7IGkrKykKIAkJCWluZF90YWJsZVtpXSA9Ci0JCQkJYnAtPmZwLT5jbF9pZCArCShpICUgbnVtX2V0aF9xdWV1ZXMpOworCQkJCWJwLT5mcC0+Y2xfaWQgKworCQkJCWV0aHRvb2xfcnhmaF9pbmRpcl9kZWZhdWx0KGksIG51bV9ldGhfcXVldWVzKTsKIAl9CiAKIAkvKgpAQCAtMTkyOSwxMyArMTkzNCwxNyBAQAogCQlicmVhazsKIAl9CiAKLQlpZiAoIWJwLT5wb3J0LnBtZikKKwlpZiAoYnAtPnBvcnQucG1mKQorCQlibngyeF91cGRhdGVfZHJ2X2ZsYWdzKGJwLCBEUlZfRkxBR1NfRENCX0NPTkZJR1VSRUQsIDApOworCWVsc2UKIAkJYm54MnhfX2xpbmtfc3RhdHVzX3VwZGF0ZShicCk7CiAKIAkvKiBzdGFydCB0aGUgdGltZXIgKi8KIAltb2RfdGltZXIoJmJwLT50aW1lciwgamlmZmllcyArIGJwLT5jdXJyZW50X2ludGVydmFsKTsKIAogI2lmZGVmIEJDTV9DTklDCisJLyogcmUtcmVhZCBpc2NzaSBpbmZvICovCisJYm54MnhfZ2V0X2lzY3NpX2luZm8oYnApOwogCWJueDJ4X3NldHVwX2NuaWNfaXJxX2luZm8oYnApOwogCWlmIChicC0+c3RhdGUgPT0gQk5YMlhfU1RBVEVfT1BFTikKIAkJYm54MnhfY25pY19ub3RpZnkoYnAsIENOSUNfQ1RMX1NUQVJUX0NNRCk7CkBAIC0yNzk5LDYgKzI4MDgsNyBAQAogCQltYXBwaW5nID0gc2tiX2ZyYWdfZG1hX21hcCgmYnAtPnBkZXYtPmRldiwgZnJhZywgMCwKIAkJCQkJICAgc2tiX2ZyYWdfc2l6ZShmcmFnKSwgRE1BX1RPX0RFVklDRSk7CiAJCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmYnAtPnBkZXYtPmRldiwgbWFwcGluZykpKSB7CisJCQl1bnNpZ25lZCBpbnQgcGt0c19jb21wbCA9IDAsIGJ5dGVzX2NvbXBsID0gMDsKIAogCQkJRFAoTkVUSUZfTVNHX1RYX1FVRVVFRCwgIlVuYWJsZSB0byBtYXAgcGFnZSAtICIKIAkJCQkJCSJkcm9wcGluZyBwYWNrZXQuLi5cbiIpOwpAQCAtMjgxMCw3ICsyODIwLDggQEAKIAkJCSAqLwogCQkJZmlyc3RfYmQtPm5iZCA9IGNwdV90b19sZTE2KG5iZCk7CiAJCQlibngyeF9mcmVlX3R4X3BrdChicCwgdHhkYXRhLAotCQkJCQkgIFRYX0JEKHR4ZGF0YS0+dHhfcGt0X3Byb2QpKTsKKwkJCQkJICBUWF9CRCh0eGRhdGEtPnR4X3BrdF9wcm9kKSwKKwkJCQkJICAmcGt0c19jb21wbCwgJmJ5dGVzX2NvbXBsKTsKIAkJCXJldHVybiBORVRERVZfVFhfT0s7CiAJCX0KIApAQCAtMjg3MSw2ICsyODgyLDggQEAKIAkJICAgcGJkX2UyLT5wYXJzaW5nX2RhdGEpOwogCURQKE5FVElGX01TR19UWF9RVUVVRUQsICJkb29yYmVsbDogbmJkICVkICBiZCAldVxuIiwgbmJkLCBiZF9wcm9kKTsKIAorCW5ldGRldl90eF9zZW50X3F1ZXVlKHR4cSwgc2tiLT5sZW4pOworCiAJdHhkYXRhLT50eF9wa3RfcHJvZCsrOwogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgdGhlIEJEIGRhdGEgaXMgdXBkYXRlZCBiZWZvcmUgdXBkYXRpbmcgdGhlIHByb2R1Y2VyCkBAIC0yOTgxLDkgKzI5OTQsMTQgQEAKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgcmMgPSAwOwogCi0JaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKCh1OCAqKShhZGRyLT5zYV9kYXRhKSkpCisJaWYgKCFibngyeF9pc192YWxpZF9ldGhlcl9hZGRyKGJwLCBhZGRyLT5zYV9kYXRhKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKyNpZmRlZiBCQ01fQ05JQworCWlmIChJU19NRl9JU0NTSV9TRChicCkgJiYgIWlzX3plcm9fZXRoZXJfYWRkcihhZGRyLT5zYV9kYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKKwogCWlmIChuZXRpZl9ydW5uaW5nKGRldikpICB7CiAJCXJjID0gYm54Mnhfc2V0X2V0aF9tYWMoYnAsIGZhbHNlKTsKIAkJaWYgKHJjKQpAQCAtMzA5OCw3ICszMTE2LDEyIEBACiAJdTggY29zOwogCWludCByeF9yaW5nX3NpemUgPSAwOwogCi0JLyogaWYgcnhfcmluZ19zaXplIHNwZWNpZmllZCAtIHVzZSBpdCAqLworI2lmZGVmIEJDTV9DTklDCisJaWYgKElTX01GX0lTQ1NJX1NEKGJwKSkgeworCQlyeF9yaW5nX3NpemUgPSBNSU5fUlhfU0laRV9OT05UUEE7CisJCWJwLT5yeF9yaW5nX3NpemUgPSByeF9yaW5nX3NpemU7CisJfSBlbHNlCisjZW5kaWYKIAlpZiAoIWJwLT5yeF9yaW5nX3NpemUpIHsKIAogCQlyeF9yaW5nX3NpemUgPSBNQVhfUlhfQVZBSUwvQk5YMlhfTlVNX1JYX1FVRVVFUyhicCk7CkBAIC0zMTA4LDcgKzMxMzEsNyBAQAogCQkJCSAgICAgTUlOX1JYX1NJWkVfVFBBLCByeF9yaW5nX3NpemUpOwogCiAJCWJwLT5yeF9yaW5nX3NpemUgPSByeF9yaW5nX3NpemU7Ci0JfSBlbHNlCisJfSBlbHNlIC8qIGlmIHJ4X3Jpbmdfc2l6ZSBzcGVjaWZpZWQgLSB1c2UgaXQgKi8KIAkJcnhfcmluZ19zaXplID0gYnAtPnJ4X3Jpbmdfc2l6ZTsKIAogCS8qIENvbW1vbiAqLwpAQCAtMzI3OCwxNCArMzMwMSwxNCBAQAogCW1zaXhfdGFibGVfc2l6ZSA9IGJwLT5pZ3Vfc2JfY250ICsgMTsKIAogCS8qIGZwIGFycmF5OiBSU1MgcGx1cyBDTklDIHJlbGF0ZWQgTDIgcXVldWVzICovCi0JZnAgPSBremFsbG9jKChCTlgyWF9NQVhfUlNTX0NPVU5UKGJwKSArIE5PTl9FVEhfQ09OVEVYVF9VU0UpICoKKwlmcCA9IGtjYWxsb2MoQk5YMlhfTUFYX1JTU19DT1VOVChicCkgKyBOT05fRVRIX0NPTlRFWFRfVVNFLAogCQkgICAgIHNpemVvZigqZnApLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWZwKQogCQlnb3RvIGFsbG9jX2VycjsKIAlicC0+ZnAgPSBmcDsKIAogCS8qIG1zaXggdGFibGUgKi8KLQl0YmwgPSBremFsbG9jKG1zaXhfdGFibGVfc2l6ZSAqIHNpemVvZigqdGJsKSwgR0ZQX0tFUk5FTCk7CisJdGJsID0ga2NhbGxvYyhtc2l4X3RhYmxlX3NpemUsIHNpemVvZigqdGJsKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCF0YmwpCiAJCWdvdG8gYWxsb2NfZXJyOwogCWJwLT5tc2l4X3RhYmxlID0gdGJsOwpAQCAtMzQwOSw3ICszNDMyLDggQEAKIAlyZXR1cm4gYm54MnhfcmVsb2FkX2lmX3J1bm5pbmcoZGV2KTsKIH0KIAotdTMyIGJueDJ4X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCituZXRkZXZfZmVhdHVyZXNfdCBibngyeF9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtMzQyMCw3ICszNDQ0LDcgQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLWludCBibngyeF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQoraW50IGJueDJ4X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgZmxhZ3MgPSBicC0+ZmxhZ3M7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9jbW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCmluZGV4IDI4M2Q2NjMuLmJmMjdjNTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2Ntbi5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogCiAKICNpbmNsdWRlICJibngyeC5oIgpAQCAtNTMzLDggKzUzNCw5IEBACiAgKi8KIGludCBibngyeF9mY29lX2dldF93d24oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTY0ICp3d24sIGludCB0eXBlKTsKICNlbmRpZgotdTMyIGJueDJ4X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpOwotaW50IGJueDJ4X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpOworbmV0ZGV2X2ZlYXR1cmVzX3QgYm54MnhfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOworaW50IGJueDJ4X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyk7CiAKIC8qKgogICogYm54MnhfdHhfdGltZW91dCAtIHR4IHRpbWVvdXQgbmV0ZGV2IGNhbGxiYWNrCkBAIC04NzQsOCArODc2LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9pbml0X3NnZV9yaW5nX2JpdF9tYXNrKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnApCiB7CiAJLyogU2V0IHRoZSBtYXNrIHRvIGFsbCAxLXM6IGl0J3MgZmFzdGVyIHRvIGNvbXBhcmUgdG8gMCB0aGFuIHRvIDB4Zi1zICovCi0JbWVtc2V0KGZwLT5zZ2VfbWFzaywgMHhmZiwKLQkgICAgICAgKE5VTV9SWF9TR0UgPj4gQklUX1ZFQzY0X0VMRU1fU0hJRlQpKnNpemVvZih1NjQpKTsKKwltZW1zZXQoZnAtPnNnZV9tYXNrLCAweGZmLCBzaXplb2YoZnAtPnNnZV9tYXNrKSk7CiAKIAkvKiBDbGVhciB0aGUgdHdvIGxhc3QgaW5kaWNlcyBpbiB0aGUgcGFnZSB0byAxOgogCSAgIHRoZXNlIGFyZSB0aGUgaW5kaWNlcyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlICJuZXh0IiBlbGVtZW50LApAQCAtOTExLDI2ICs5MTIsMjcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgYm54MnhfYWxsb2Nfcnhfc2tiKHN0cnVjdCBibngyeCAqYnAsCi0JCQkJICAgICBzdHJ1Y3QgYm54MnhfZmFzdHBhdGggKmZwLCB1MTYgaW5kZXgpCitzdGF0aWMgaW5saW5lIGludCBibngyeF9hbGxvY19yeF9kYXRhKHN0cnVjdCBibngyeCAqYnAsCisJCQkJICAgICAgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwgdTE2IGluZGV4KQogewotCXN0cnVjdCBza19idWZmICpza2I7CisJdTggKmRhdGE7CiAJc3RydWN0IHN3X3J4X2JkICpyeF9idWYgPSAmZnAtPnJ4X2J1Zl9yaW5nW2luZGV4XTsKIAlzdHJ1Y3QgZXRoX3J4X2JkICpyeF9iZCA9ICZmcC0+cnhfZGVzY19yaW5nW2luZGV4XTsKIAlkbWFfYWRkcl90IG1hcHBpbmc7CiAKLQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKGJwLT5kZXYsIGZwLT5yeF9idWZfc2l6ZSk7Ci0JaWYgKHVubGlrZWx5KHNrYiA9PSBOVUxMKSkKKwlkYXRhID0ga21hbGxvYyhmcC0+cnhfYnVmX3NpemUgKyBORVRfU0tCX1BBRCwgR0ZQX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KGRhdGEgPT0gTlVMTCkpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbWFwcGluZyA9IGRtYV9tYXBfc2luZ2xlKCZicC0+cGRldi0+ZGV2LCBza2ItPmRhdGEsIGZwLT5yeF9idWZfc2l6ZSwKKwltYXBwaW5nID0gZG1hX21hcF9zaW5nbGUoJmJwLT5wZGV2LT5kZXYsIGRhdGEgKyBORVRfU0tCX1BBRCwKKwkJCQkgZnAtPnJ4X2J1Zl9zaXplLAogCQkJCSBETUFfRlJPTV9ERVZJQ0UpOwogCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcigmYnAtPnBkZXYtPmRldiwgbWFwcGluZykpKSB7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCWtmcmVlKGRhdGEpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlyeF9idWYtPnNrYiA9IHNrYjsKKwlyeF9idWYtPmRhdGEgPSBkYXRhOwogCWRtYV91bm1hcF9hZGRyX3NldChyeF9idWYsIG1hcHBpbmcsIG1hcHBpbmcpOwogCiAJcnhfYmQtPmFkZHJfaGkgPSBjcHVfdG9fbGUzMihVNjRfSEkobWFwcGluZykpOwpAQCAtOTM5LDEyICs5NDEsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogbm90ZSB0aGF0IHdlIGFyZSBub3QgYWxsb2NhdGluZyBhIG5ldyBza2IsCisvKiBub3RlIHRoYXQgd2UgYXJlIG5vdCBhbGxvY2F0aW5nIGEgbmV3IGJ1ZmZlciwKICAqIHdlIGFyZSBqdXN0IG1vdmluZyBvbmUgZnJvbSBjb25zIHRvIHByb2QKICAqIHdlIGFyZSBub3QgY3JlYXRpbmcgYSBuZXcgbWFwcGluZywKICAqIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgZm9yIGRtYV9tYXBwaW5nX2Vycm9yKCkuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9yZXVzZV9yeF9za2Ioc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCwKK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9yZXVzZV9yeF9kYXRhKHN0cnVjdCBibngyeF9mYXN0cGF0aCAqZnAsCiAJCQkJICAgICAgdTE2IGNvbnMsIHUxNiBwcm9kKQogewogCXN0cnVjdCBzd19yeF9iZCAqY29uc19yeF9idWYgPSAmZnAtPnJ4X2J1Zl9yaW5nW2NvbnNdOwpAQCAtOTU0LDcgKzk1Niw3IEBACiAKIAlkbWFfdW5tYXBfYWRkcl9zZXQocHJvZF9yeF9idWYsIG1hcHBpbmcsCiAJCQkgICBkbWFfdW5tYXBfYWRkcihjb25zX3J4X2J1ZiwgbWFwcGluZykpOwotCXByb2RfcnhfYnVmLT5za2IgPSBjb25zX3J4X2J1Zi0+c2tiOworCXByb2RfcnhfYnVmLT5kYXRhID0gY29uc19yeF9idWYtPmRhdGE7CiAJKnByb2RfYmQgPSAqY29uc19iZDsKIH0KIApAQCAtMTAzMCw5ICsxMDMyLDkgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7CiAJCXN0cnVjdCBibngyeF9hZ2dfaW5mbyAqdHBhX2luZm8gPSAmZnAtPnRwYV9pbmZvW2ldOwogCQlzdHJ1Y3Qgc3dfcnhfYmQgKmZpcnN0X2J1ZiA9ICZ0cGFfaW5mby0+Zmlyc3RfYnVmOwotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZmlyc3RfYnVmLT5za2I7CisJCXU4ICpkYXRhID0gZmlyc3RfYnVmLT5kYXRhOwogCi0JCWlmIChza2IgPT0gTlVMTCkgeworCQlpZiAoZGF0YSA9PSBOVUxMKSB7CiAJCQlEUChORVRJRl9NU0dfSUZET1dOLCAidHBhIGJpbiAlZCBlbXB0eSBvbiBmcmVlXG4iLCBpKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0xMDQwLDggKzEwNDIsOCBAQAogCQkJZG1hX3VubWFwX3NpbmdsZSgmYnAtPnBkZXYtPmRldiwKIAkJCQkJIGRtYV91bm1hcF9hZGRyKGZpcnN0X2J1ZiwgbWFwcGluZyksCiAJCQkJCSBmcC0+cnhfYnVmX3NpemUsIERNQV9GUk9NX0RFVklDRSk7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJZmlyc3RfYnVmLT5za2IgPSBOVUxMOworCQlrZnJlZShkYXRhKTsKKwkJZmlyc3RfYnVmLT5kYXRhID0gTlVMTDsKIAl9CiB9CiAKQEAgLTExNDksNyArMTE1MSw3IEBACiAJICogZnAtPmV0aF9xX3N0YXRzLnJ4X3NrYl9hbGxvY19mYWlsZWQgPSAwCiAJICovCiAJZm9yIChpID0gMDsgaSA8IHJ4X3Jpbmdfc2l6ZTsgaSsrKSB7Ci0JCWlmIChibngyeF9hbGxvY19yeF9za2IoYnAsIGZwLCByaW5nX3Byb2QpIDwgMCkgeworCQlpZiAoYm54MnhfYWxsb2NfcnhfZGF0YShicCwgZnAsIHJpbmdfcHJvZCkgPCAwKSB7CiAJCQlmcC0+ZXRoX3Ffc3RhdHMucnhfc2tiX2FsbG9jX2ZhaWxlZCsrOwogCQkJY29udGludWU7CiAJCX0KQEAgLTEzMTgsNiArMTMyMCw3IEBACiAJc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCA9IGJueDJ4X2Zjb2VfZnAoYnApOwogCXVuc2lnbmVkIGxvbmcgcV90eXBlID0gMDsKIAorCWJueDJ4X2Zjb2UoYnAsIHJ4X3F1ZXVlKSA9IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKTsKIAlibngyeF9mY29lKGJwLCBjbF9pZCkgPSBibngyeF9jbmljX2V0aF9jbF9pZChicCwKIAkJCQkJCSAgICAgQk5YMlhfRkNPRV9FVEhfQ0xfSURfSURYKTsKIAkvKiogQ3VycmVudCBCTlgyWF9GQ09FX0VUSF9DSUQgZGVmZmluaXRpb24gaW1wbGllcyBub3QgbW9yZSB0aGFuCkBAIC0xNDg4LDQgKzE0OTEsNzcgQEAKIAlyZXR1cm4gbWF4X2NmZzsKIH0KIAorLyoqCisgKiBibngyeF9nZXRfaXNjc2lfaW5mbyAtIHVwZGF0ZSBpU0NTSSBwYXJhbXMgYWNjb3JkaW5nIHRvIGxpY2Vuc2luZyBpbmZvLgorICoKKyAqIEBicDoJCWRyaXZlciBoYW5kbGUKKyAqCisgKi8KK3ZvaWQgYm54MnhfZ2V0X2lzY3NpX2luZm8oc3RydWN0IGJueDJ4ICpicCk7CisKKy8qIHJldHVybnMgZnVuYyBieSBWTiBmb3IgY3VycmVudCBwb3J0ICovCitzdGF0aWMgaW5saW5lIGludCBmdW5jX2J5X3ZuKHN0cnVjdCBibngyeCAqYnAsIGludCB2bikKK3sKKwlyZXR1cm4gMiAqIHZuICsgQlBfUE9SVChicCk7Cit9CisKKy8qKgorICogYm54MnhfbGlua19zeW5jX25vdGlmeSAtIHNlbmQgbm90aWZpY2F0aW9uIHRvIG90aGVyIGZ1bmN0aW9ucy4KKyAqCisgKiBAYnA6CQlkcml2ZXIgaGFuZGxlCisgKgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYm54MnhfbGlua19zeW5jX25vdGlmeShzdHJ1Y3QgYm54MnggKmJwKQoreworCWludCBmdW5jOworCWludCB2bjsKKworCS8qIFNldCB0aGUgYXR0ZW50aW9uIHRvd2FyZHMgb3RoZXIgZHJpdmVycyBvbiB0aGUgc2FtZSBwb3J0ICovCisJZm9yICh2biA9IFZOXzA7IHZuIDwgQlBfTUFYX1ZOX05VTShicCk7IHZuKyspIHsKKwkJaWYgKHZuID09IEJQX1ZOKGJwKSkKKwkJCWNvbnRpbnVlOworCisJCWZ1bmMgPSBmdW5jX2J5X3ZuKGJwLCB2bik7CisJCVJFR19XUihicCwgTUlTQ19SRUdfQUVVX0dFTkVSQUxfQVRUTl8wICsKKwkJICAgICAgIChMSU5LX1NZTkNfQVRURU5USU9OX0JJVF9GVU5DXzAgKyBmdW5jKSo0LCAxKTsKKwl9Cit9CisKKy8qKgorICogYm54MnhfdXBkYXRlX2Rydl9mbGFncyAtIHVwZGF0ZSBmbGFncyBpbiBzaG1lbQorICoKKyAqIEBicDoJCWRyaXZlciBoYW5kbGUKKyAqIEBmbGFnczoJZmxhZ3MgdG8gdXBkYXRlCisgKiBAc2V0OglzZXQgb3IgY2xlYXIKKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBibngyeF91cGRhdGVfZHJ2X2ZsYWdzKHN0cnVjdCBibngyeCAqYnAsIHUzMiBmbGFncywgdTMyIHNldCkKK3sKKwlpZiAoU0hNRU0yX0hBUyhicCwgZHJ2X2ZsYWdzKSkgeworCQl1MzIgZHJ2X2ZsYWdzOworCQlibngyeF9hY3F1aXJlX2h3X2xvY2soYnAsIEhXX0xPQ0tfRFJWX0ZMQUdTKTsKKwkJZHJ2X2ZsYWdzID0gU0hNRU0yX1JEKGJwLCBkcnZfZmxhZ3MpOworCisJCWlmIChzZXQpCisJCQlTRVRfRkxBR1MoZHJ2X2ZsYWdzLCBmbGFncyk7CisJCWVsc2UKKwkJCVJFU0VUX0ZMQUdTKGRydl9mbGFncywgZmxhZ3MpOworCisJCVNITUVNMl9XUihicCwgZHJ2X2ZsYWdzLCBkcnZfZmxhZ3MpOworCQlEUChORVRJRl9NU0dfSFcsICJkcnZfZmxhZ3MgMHglMDh4XG4iLCBkcnZfZmxhZ3MpOworCQlibngyeF9yZWxlYXNlX2h3X2xvY2soYnAsIEhXX0xPQ0tfRFJWX0ZMQUdTKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBibngyeF9pc192YWxpZF9ldGhlcl9hZGRyKHN0cnVjdCBibngyeCAqYnAsIHU4ICphZGRyKQoreworCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGFkZHIpKQorCQlyZXR1cm4gdHJ1ZTsKKyNpZmRlZiBCQ01fQ05JQworCWlmIChpc196ZXJvX2V0aGVyX2FkZHIoYWRkcikgJiYgSVNfTUZfSVNDU0lfU0QoYnApKQorCQlyZXR1cm4gdHJ1ZTsKKyNlbmRpZgorCXJldHVybiBmYWxzZTsKK30KKwogI2VuZGlmIC8qIEJOWDJYX0NNTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9kY2IuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2RjYi5jCmluZGV4IDUxYmQ3NDguLjUwNTFjZjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2RjYi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2RjYi5jCkBAIC02ODUsMjQgKzY4NSw2IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3VwZGF0ZV9kcnZfZmxhZ3Moc3RydWN0IGJueDJ4ICpicCwgdTMyIGZsYWdzLCB1MzIgc2V0KQotewotCWlmIChTSE1FTTJfSEFTKGJwLCBkcnZfZmxhZ3MpKSB7Ci0JCXUzMiBkcnZfZmxhZ3M7Ci0JCWJueDJ4X2FjcXVpcmVfaHdfbG9jayhicCwgSFdfTE9DS19EUlZfRkxBR1MpOwotCQlkcnZfZmxhZ3MgPSBTSE1FTTJfUkQoYnAsIGRydl9mbGFncyk7Ci0KLQkJaWYgKHNldCkKLQkJCVNFVF9GTEFHUyhkcnZfZmxhZ3MsIGZsYWdzKTsKLQkJZWxzZQotCQkJUkVTRVRfRkxBR1MoZHJ2X2ZsYWdzLCBmbGFncyk7Ci0KLQkJU0hNRU0yX1dSKGJwLCBkcnZfZmxhZ3MsIGRydl9mbGFncyk7Ci0JCURQKE5FVElGX01TR19IVywgImRydl9mbGFncyAweCUwOHhcbiIsIGRydl9mbGFncyk7Ci0JCWJueDJ4X3JlbGVhc2VfaHdfbG9jayhicCwgSFdfTE9DS19EUlZfRkxBR1MpOwotCX0KLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2RjYnhfdXBkYXRlX3RjX21hcHBpbmcoc3RydWN0IGJueDJ4ICpicCkKIHsKIAl1OCBwcmlvLCBjb3M7CkBAIC03NTUsMTggKzczNywyNiBAQAogCQkJLyogbWFyayBEQ0JYIHJlc3VsdCBmb3IgUE1GIG1pZ3JhdGlvbiAqLwogCQkJYm54MnhfdXBkYXRlX2Rydl9mbGFncyhicCwgRFJWX0ZMQUdTX0RDQl9DT05GSUdVUkVELCAxKTsKICNpZmRlZiBCQ01fRENCTkwKLQkJCS8qKgorCQkJLyoKIAkJCSAqIEFkZCBuZXcgYXBwIHRsdnMgdG8gZGNibmwKIAkJCSAqLwogCQkJYm54MnhfZGNibmxfdXBkYXRlX2FwcGxpc3QoYnAsIGZhbHNlKTsKICNlbmRpZgotCQkJYm54MnhfZGNieF9zdG9wX2h3X3R4KGJwKTsKLQotCQkJLyogcmVjb25maWd1cmUgdGhlIG5ldGRldmljZSB3aXRoIHRoZSByZXN1bHRzIG9mIHRoZSBuZXcKKwkJCS8qCisJCQkgKiByZWNvbmZpZ3VyZSB0aGUgbmV0ZGV2aWNlIHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIG5ldwogCQkJICogZGNieCBuZWdvdGlhdGlvbi4KIAkJCSAqLwogCQkJYm54MnhfZGNieF91cGRhdGVfdGNfbWFwcGluZyhicCk7CiAKKwkJCS8qCisJCQkgKiBhbGxvdyBvdGhlciBmdW50aW9ucyB0byB1cGRhdGUgdGhlaXIgbmV0ZGV2aWNlcworCQkJICogYWNjb3JkaW5nbHkKKwkJCSAqLworCQkJaWYgKElTX01GKGJwKSkKKwkJCQlibngyeF9saW5rX3N5bmNfbm90aWZ5KGJwKTsKKworCQkJYm54MnhfZGNieF9zdG9wX2h3X3R4KGJwKTsKKwogCQkJcmV0dXJuOwogCQl9CiAJY2FzZSBCTlgyWF9EQ0JYX1NUQVRFX1RYX1BBVVNFRDoKQEAgLTc3NSw2ICs3NjUsNyBAQAogCiAJCWJueDJ4X2RjYnhfdXBkYXRlX2V0c19wYXJhbXMoYnApOwogCQlibngyeF9kY2J4X3Jlc3VtZV9od190eChicCk7CisKIAkJcmV0dXJuOwogCWNhc2UgQk5YMlhfRENCWF9TVEFURV9UWF9SRUxFQVNFRDoKIAkJRFAoTkVUSUZfTVNHX0xJTkssICJCTlgyWF9EQ0JYX1NUQVRFX1RYX1JFTEVBU0VEXG4iKTsKQEAgLTg4Myw3ICs4NzQsNyBAQAogCQkvKkZvciBJRUVFIGFkbWluX3JlY29tbWVuZGF0aW9uX2J3X3ByZWNlbnRhZ2UKIAkJICpGb3IgSUVFRSBhZG1pbl9yZWNvbW1lbmRhdGlvbl9ldHNfcGcgKi8KIAkJYWYtPnBmYy5wcmlfZW5fYml0bWFwID0gKHU4KWRwLT5hZG1pbl9wZmNfYml0bWFwOwotCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBEQ0JYX0NPTkZJR19NQVhfQVBQX1BST1RPQ09MOyBpKyspIHsKIAkJCWlmIChkcC0+YWRtaW5fcHJpb3JpdHlfYXBwX3RhYmxlW2ldLnZhbGlkKSB7CiAJCQkJc3RydWN0IGJueDJ4X2FkbWluX3ByaW9yaXR5X2FwcF90YWJsZSAqdGFibGUgPQogCQkJCQlkcC0+YWRtaW5fcHJpb3JpdHlfYXBwX3RhYmxlOwpAQCAtOTIzLDcgKzkxNCw3IEBACiAKIHZvaWQgYm54MnhfZGNieF9zZXRfc3RhdGUoc3RydWN0IGJueDJ4ICpicCwgYm9vbCBkY2Jfb24sIHUzMiBkY2J4X2VuYWJsZWQpCiB7Ci0JaWYgKCFDSElQX0lTX0UxeChicCkgJiYgIUNISVBfSVNfRTMoYnApKSB7CisJaWYgKCFDSElQX0lTX0UxeChicCkpIHsKIAkJYnAtPmRjYl9zdGF0ZSA9IGRjYl9vbjsKIAkJYnAtPmRjYnhfZW5hYmxlZCA9IGRjYnhfZW5hYmxlZDsKIAl9IGVsc2UgewpAQCAtMTg2Myw3ICsxODU0LDcgQEAKIHZvaWQgYm54MnhfZGNieF9wbWZfdXBkYXRlKHN0cnVjdCBibngyeCAqYnApCiB7CiAJLyogaWYgd2UgbmVlZCB0byBzeW5jcm9uaXplIERDQlggcmVzdWx0IGZyb20gcHJldiBQTUYKLQkgKiByZWFkIGl0IGZyb20gc2htZW0gYW5kIHVwZGF0ZSBicCBhY2NvcmRpbmdseQorCSAqIHJlYWQgaXQgZnJvbSBzaG1lbSBhbmQgdXBkYXRlIGJwIGFuZCBuZXRkZXYgYWNjb3JkaW5nbHkKIAkgKi8KIAlpZiAoU0hNRU0yX0hBUyhicCwgZHJ2X2ZsYWdzKSAmJgogCSAgIEdFVF9GTEFHUyhTSE1FTTJfUkQoYnAsIGRydl9mbGFncyksIERSVl9GTEFHU19EQ0JfQ09ORklHVVJFRCkpIHsKQEAgLTE4NzUsNiArMTg2NiwyMiBAQAogCQkJCQkgIGJwLT5kY2J4X2Vycm9yKTsKIAkJYm54MnhfZ2V0X2RjYnhfZHJ2X3BhcmFtKGJwLCAmYnAtPmRjYnhfbG9jYWxfZmVhdCwKIAkJCQkJIGJwLT5kY2J4X2Vycm9yKTsKKyNpZmRlZiBCQ01fRENCTkwKKwkJLyoKKwkJICogQWRkIG5ldyBhcHAgdGx2cyB0byBkY2JubAorCQkgKi8KKwkJYm54MnhfZGNibmxfdXBkYXRlX2FwcGxpc3QoYnAsIGZhbHNlKTsKKwkJLyoKKwkJICogU2VuZCBhIG5vdGlmaWNhdGlvbiBmb3IgdGhlIG5ldyBuZWdvdGlhdGVkIHBhcmFtZXRlcnMKKwkJICovCisJCWRjYm5sX2NlZV9ub3RpZnkoYnAtPmRldiwgUlRNX0dFVERDQiwgRENCX0NNRF9DRUVfR0VULCAwLCAwKTsKKyNlbmRpZgorCQkvKgorCQkgKiByZWNvbmZpZ3VyZSB0aGUgbmV0ZGV2aWNlIHdpdGggdGhlIHJlc3VsdHMgb2YgdGhlIG5ldworCQkgKiBkY2J4IG5lZ290aWF0aW9uLgorCQkgKi8KKwkJYm54MnhfZGNieF91cGRhdGVfdGNfbWFwcGluZyhicCk7CisKIAl9CiB9CiAKQEAgLTIyNDIsNyArMjI0OSw3IEBACiAJaW50IGksIGZmOwogCiAJLyogaXRlcmF0ZSBvdmVyIHRoZSBhcHAgZW50cmllcyBsb29raW5nIGZvciBpZHR5cGUgYW5kIGlkdmFsICovCi0JZm9yIChpID0gMCwgZmYgPSAtMTsgaSA8IDQ7IGkrKykgeworCWZvciAoaSA9IDAsIGZmID0gLTE7IGkgPCBEQ0JYX0NPTkZJR19NQVhfQVBQX1BST1RPQ09MOyBpKyspIHsKIAkJc3RydWN0IGJueDJ4X2FkbWluX3ByaW9yaXR5X2FwcF90YWJsZSAqYXBwX2VudCA9CiAJCQkmYnAtPmRjYnhfY29uZmlnX3BhcmFtcy5hZG1pbl9wcmlvcml0eV9hcHBfdGFibGVbaV07CiAJCWlmIChibngyeF9hZG1pbl9hcHBfaXNfZXF1YWwoYXBwX2VudCwgaWR0eXBlLCBpZHZhbCkpCkBAIC0yMjUxLDcgKzIyNTgsNyBAQAogCQlpZiAoZmYgPCAwICYmICFhcHBfZW50LT52YWxpZCkKIAkJCWZmID0gaTsKIAl9Ci0JaWYgKGkgPCA0KQorCWlmIChpIDwgRENCWF9DT05GSUdfTUFYX0FQUF9QUk9UT0NPTCkKIAkJLyogaWYgZm91bmQgb3ZlcndyaXRlIHVwICovCiAJCWJwLT5kY2J4X2NvbmZpZ19wYXJhbXMuCiAJCQlhZG1pbl9wcmlvcml0eV9hcHBfdGFibGVbaV0ucHJpb3JpdHkgPSB1cDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2RjYi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZGNiLmgKaW5kZXggMmM2YTNiYy4uMmFiOTI1NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZGNiLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZGNiLmgKQEAgLTkwLDYgKzkwLDcgQEAKIAkJdTMyIGFwcF9pZDsKIH07CiAKKyNkZWZpbmUgRENCWF9DT05GSUdfTUFYX0FQUF9QUk9UT0NPTCA0CiBzdHJ1Y3QgYm54MnhfY29uZmlnX2RjYnhfcGFyYW1zIHsKIAl1MzIgb3ZlcndyaXRlX3NldHRpbmdzOwogCXUzMiBhZG1pbl9kY2J4X3ZlcnNpb247CkBAIC0xMDksNyArMTEwLDggQEAKIAl1MzIgYWRtaW5fcmVjb21tZW5kYXRpb25fYndfcHJlY2VudGFnZVs4XTsKIAl1MzIgYWRtaW5fcmVjb21tZW5kYXRpb25fZXRzX3BnWzhdOwogCXUzMiBhZG1pbl9wZmNfYml0bWFwOwotCXN0cnVjdCBibngyeF9hZG1pbl9wcmlvcml0eV9hcHBfdGFibGUgYWRtaW5fcHJpb3JpdHlfYXBwX3RhYmxlWzRdOworCXN0cnVjdCBibngyeF9hZG1pbl9wcmlvcml0eV9hcHBfdGFibGUKKwkJYWRtaW5fcHJpb3JpdHlfYXBwX3RhYmxlW0RDQlhfQ09ORklHX01BWF9BUFBfUFJPVE9DT0xdOwogCXUzMiBhZG1pbl9kZWZhdWx0X3ByaW9yaXR5OwogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfZXRodG9vbC5jCmluZGV4IGYwY2E4YjIuLmE2ODhiOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9ldGh0b29sLmMKQEAgLTEwNyw2ICsxMDcsMTAgQEAKIAkJCQk0LCBTVEFUU19GTEFHU19QT1JULCAicnhfZmlsdGVyZWRfcGFja2V0cyIgfSwKIAl7IFNUQVRTX09GRlNFVDMyKG1mX3RhZ19kaXNjYXJkKSwKIAkJCQk0LCBTVEFUU19GTEFHU19QT1JULCAicnhfbWZfdGFnX2Rpc2NhcmQiIH0sCisJeyBTVEFUU19PRkZTRVQzMihwZmNfZnJhbWVzX3JlY2VpdmVkX2hpKSwKKwkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAicGZjX2ZyYW1lc19yZWNlaXZlZCIgfSwKKwl7IFNUQVRTX09GRlNFVDMyKHBmY19mcmFtZXNfc2VudF9oaSksCisJCQkJOCwgU1RBVFNfRkxBR1NfUE9SVCwgInBmY19mcmFtZXNfc2VudCIgfSwKIAl7IFNUQVRTX09GRlNFVDMyKGJyYl9kcm9wX2hpKSwKIAkJCQk4LCBTVEFUU19GTEFHU19QT1JULCAicnhfYnJiX2Rpc2NhcmQiIH0sCiAJeyBTVEFUU19PRkZTRVQzMihicmJfdHJ1bmNhdGVfaGkpLApAQCAtMzUyLDcgKzM1Niw3IEBACiAJCURQKE5FVElGX01TR19MSU5LLCAiVW5zdXBwb3J0ZWQgcG9ydCB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCS8qIFNhdmUgbmV3IGNvbmZpZyBpbiBjYXNlIGNvbW1hbmQgY29tcGxldGUgc3VjY2Vzc3VseSAqLworCS8qIFNhdmUgbmV3IGNvbmZpZyBpbiBjYXNlIGNvbW1hbmQgY29tcGxldGUgc3VjY2Vzc3VsbHkgKi8KIAluZXdfbXVsdGlfcGh5X2NvbmZpZyA9IGJwLT5saW5rX3BhcmFtcy5tdWx0aV9waHlfY29uZmlnOwogCS8qIEdldCB0aGUgbmV3IGNmZ19pZHggKi8KIAljZmdfaWR4ID0gYm54MnhfZ2V0X2xpbmtfY2ZnX2lkeChicCk7CkBAIC03NjEsOCArNzY1LDggQEAKIAlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCBwaHlfZndfdmVyW1BIWV9GV19WRVJfTEVOXTsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9NT0RVTEVfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9NT0RVTEVfVkVSU0lPTik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9NT0RVTEVfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwogCiAJcGh5X2Z3X3ZlclswXSA9ICdcMCc7CiAJaWYgKGJwLT5wb3J0LnBtZikgewpAQCAtNzczLDE0ICs3NzcsMTQgQEAKIAkJYm54MnhfcmVsZWFzZV9waHlfbG9jayhicCk7CiAJfQogCi0Jc3RybmNweShpbmZvLT5md192ZXJzaW9uLCBicC0+ZndfdmVyLCAzMik7CisJc3RybGNweShpbmZvLT5md192ZXJzaW9uLCBicC0+ZndfdmVyLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbikpOwogCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24gKyBzdHJsZW4oYnAtPmZ3X3ZlciksIDMyIC0gc3RybGVuKGJwLT5md192ZXIpLAogCQkgImJjICVkLiVkLiVkJXMlcyIsCiAJCSAoYnAtPmNvbW1vbi5iY192ZXIgJiAweGZmMDAwMCkgPj4gMTYsCiAJCSAoYnAtPmNvbW1vbi5iY192ZXIgJiAweGZmMDApID4+IDgsCiAJCSAoYnAtPmNvbW1vbi5iY192ZXIgJiAweGZmKSwKIAkJICgocGh5X2Z3X3ZlclswXSAhPSAnXDAnKSA/ICIgcGh5ICIgOiAiIiksIHBoeV9md192ZXIpOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYnAtPnBkZXYpKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShicC0+cGRldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogCWluZm8tPm5fc3RhdHMgPSBCTlgyWF9OVU1fU1RBVFM7CiAJaW5mby0+dGVzdGluZm9fbGVuID0gQk5YMlhfTlVNX1RFU1RTOwogCWluZm8tPmVlZHVtcF9sZW4gPSBicC0+Y29tbW9uLmZsYXNoX3NpemU7CkBAIC0xNzQwLDYgKzE3NDQsOCBAQAogCXN0cnVjdCBzd19yeF9iZCAqcnhfYnVmOwogCXUxNiBsZW47CiAJaW50IHJjID0gLUVOT0RFVjsKKwl1OCAqZGF0YTsKKwlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICp0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGJwLT5kZXYsIHR4ZGF0YS0+dHhxX2luZGV4KTsKIAogCS8qIGNoZWNrIHRoZSBsb29wYmFjayBtb2RlICovCiAJc3dpdGNoIChsb29wYmFja19tb2RlKSB7CkBAIC0xNzQ4LDggKzE3NTQsMTggQEAKIAkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKIAljYXNlIEJOWDJYX01BQ19MT09QQkFDSzoKLQkJYnAtPmxpbmtfcGFyYW1zLmxvb3BiYWNrX21vZGUgPSBDSElQX0lTX0UzKGJwKSA/Ci0JCQkJCQlMT09QQkFDS19YTUFDIDogTE9PUEJBQ0tfQk1BQzsKKwkJaWYgKENISVBfSVNfRTMoYnApKSB7CisJCQlpbnQgY2ZnX2lkeCA9IGJueDJ4X2dldF9saW5rX2NmZ19pZHgoYnApOworCQkJaWYgKGJwLT5wb3J0LnN1cHBvcnRlZFtjZmdfaWR4XSAmCisJCQkgICAgKFNVUFBPUlRFRF8xMDAwMGJhc2VUX0Z1bGwgfAorCQkJICAgICBTVVBQT1JURURfMjAwMDBiYXNlTUxEMl9GdWxsIHwKKwkJCSAgICAgU1VQUE9SVEVEXzIwMDAwYmFzZUtSMl9GdWxsKSkKKwkJCQlicC0+bGlua19wYXJhbXMubG9vcGJhY2tfbW9kZSA9IExPT1BCQUNLX1hNQUM7CisJCQllbHNlCisJCQkJYnAtPmxpbmtfcGFyYW1zLmxvb3BiYWNrX21vZGUgPSBMT09QQkFDS19VTUFDOworCQl9IGVsc2UKKwkJCWJwLT5saW5rX3BhcmFtcy5sb29wYmFja19tb2RlID0gTE9PUEJBQ0tfQk1BQzsKKwogCQlibngyeF9waHlfaW5pdCgmYnAtPmxpbmtfcGFyYW1zLCAmYnAtPmxpbmtfdmFycyk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0xNzg0LDYgKzE4MDAsOCBAQAogCXR4X3N0YXJ0X2lkeCA9IGxlMTZfdG9fY3B1KCp0eGRhdGEtPnR4X2NvbnNfc2IpOwogCXJ4X3N0YXJ0X2lkeCA9IGxlMTZfdG9fY3B1KCpmcF9yeC0+cnhfY29uc19zYik7CiAKKwluZXRkZXZfdHhfc2VudF9xdWV1ZSh0eHEsIHNrYi0+bGVuKTsKKwogCXBrdF9wcm9kID0gdHhkYXRhLT50eF9wa3RfcHJvZCsrOwogCXR4X2J1ZiA9ICZ0eGRhdGEtPnR4X2J1Zl9yaW5nW1RYX0JEKHBrdF9wcm9kKV07CiAJdHhfYnVmLT5maXJzdF9iZCA9IHR4ZGF0YS0+dHhfYmRfcHJvZDsKQEAgLTE4NjUsMTAgKzE4ODMsOSBAQAogCWRtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KCZicC0+cGRldi0+ZGV2LAogCQkJCSAgIGRtYV91bm1hcF9hZGRyKHJ4X2J1ZiwgbWFwcGluZyksCiAJCQkJICAgZnBfcngtPnJ4X2J1Zl9zaXplLCBETUFfRlJPTV9ERVZJQ0UpOwotCXNrYiA9IHJ4X2J1Zi0+c2tiOwotCXNrYl9yZXNlcnZlKHNrYiwgY3FlLT5mYXN0X3BhdGhfY3FlLnBsYWNlbWVudF9vZmZzZXQpOworCWRhdGEgPSByeF9idWYtPmRhdGEgKyBORVRfU0tCX1BBRCArIGNxZS0+ZmFzdF9wYXRoX2NxZS5wbGFjZW1lbnRfb2Zmc2V0OwogCWZvciAoaSA9IEVUSF9ITEVOOyBpIDwgcGt0X3NpemU7IGkrKykKLQkJaWYgKCooc2tiLT5kYXRhICsgaSkgIT0gKHVuc2lnbmVkIGNoYXIpIChpICYgMHhmZikpCisJCWlmICgqKGRhdGEgKyBpKSAhPSAodW5zaWduZWQgY2hhcikgKGkgJiAweGZmKSkKIAkJCWdvdG8gdGVzdF9sb29wYmFja19yeF9leGl0OwogCiAJcmMgPSAwOwpAQCAtMjI4NSwxOCArMjMwMiwyMCBAQAogCX0KIH0KIAotc3RhdGljIGludCBibngyeF9nZXRfcnhmaF9pbmRpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCXN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKmluZGlyKQorc3RhdGljIHUzMiBibngyeF9nZXRfcnhmaF9pbmRpcl9zaXplKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc2l6ZV90IGNvcHlfc2l6ZSA9Ci0JCW1pbl90KHNpemVfdCwgaW5kaXItPnNpemUsIFRfRVRIX0lORElSRUNUSU9OX1RBQkxFX1NJWkUpOworCisJcmV0dXJuIChicC0+bXVsdGlfbW9kZSA9PSBFVEhfUlNTX01PREVfRElTQUJMRUQgPworCQkwIDogVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRSk7Cit9CisKK3N0YXRpYyBpbnQgYm54MnhfZ2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICppbmRpcikKK3sKKwlzdHJ1Y3QgYm54MnggKmJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCBpbmRfdGFibGVbVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRV0gPSB7MH07CiAJc2l6ZV90IGk7CiAKLQlpZiAoYnAtPm11bHRpX21vZGUgPT0gRVRIX1JTU19NT0RFX0RJU0FCTEVEKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KIAkvKiBHZXQgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiB0aGUgUlNTIGluZGlyZWN0aW9uIHRhYmxlICovCiAJYm54MnhfZ2V0X3Jzc19pbmRfdGFibGUoJmJwLT5yc3NfY29uZl9vYmosIGluZF90YWJsZSk7CiAKQEAgLTIzMDksMzMgKzIzMjgsMTkgQEAKIAkgKiBhbGlnbiB0aGUgcmV0dXJuZWQgdGFibGUgdG8gdGhlIENsaWVudCBJRCBvZiB0aGUgbGVhZGluZyBSU1MKIAkgKiBxdWV1ZS4KIAkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgY29weV9zaXplOyBpKyspCi0JCWluZGlyLT5yaW5nX2luZGV4W2ldID0gaW5kX3RhYmxlW2ldIC0gYnAtPmZwLT5jbF9pZDsKLQotCWluZGlyLT5zaXplID0gVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRTsKKwlmb3IgKGkgPSAwOyBpIDwgVF9FVEhfSU5ESVJFQ1RJT05fVEFCTEVfU0laRTsgaSsrKQorCQlpbmRpcltpXSA9IGluZF90YWJsZVtpXSAtIGJwLT5mcC0+Y2xfaWQ7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBibngyeF9zZXRfcnhmaF9pbmRpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCWNvbnN0IHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKmluZGlyKQorc3RhdGljIGludCBibngyeF9zZXRfcnhmaF9pbmRpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1MzIgKmluZGlyKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXNpemVfdCBpOwogCXU4IGluZF90YWJsZVtUX0VUSF9JTkRJUkVDVElPTl9UQUJMRV9TSVpFXSA9IHswfTsKLQl1MzIgbnVtX2V0aF9xdWV1ZXMgPSBCTlgyWF9OVU1fRVRIX1FVRVVFUyhicCk7Ci0KLQlpZiAoYnAtPm11bHRpX21vZGUgPT0gRVRIX1JTU19NT0RFX0RJU0FCTEVEKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQkvKiB2YWxpZGF0ZSB0aGUgc2l6ZSAqLwotCWlmIChpbmRpci0+c2l6ZSAhPSBUX0VUSF9JTkRJUkVDVElPTl9UQUJMRV9TSVpFKQotCQlyZXR1cm4gLUVJTlZBTDsKIAogCWZvciAoaSA9IDA7IGkgPCBUX0VUSF9JTkRJUkVDVElPTl9UQUJMRV9TSVpFOyBpKyspIHsKLQkJLyogdmFsaWRhdGUgdGhlIGluZGljZXMgKi8KLQkJaWYgKGluZGlyLT5yaW5nX2luZGV4W2ldID49IG51bV9ldGhfcXVldWVzKQotCQkJcmV0dXJuIC1FSU5WQUw7CiAJCS8qCiAJCSAqIFRoZSBzYW1lIGFzIGluIGJueDJ4X2dldF9yeGZoX2luZGlyOiB3ZSBjYW4ndCB1c2UgYSBtZW1jcHkoKQogCQkgKiBhcyBhbiBpbnRlcm5hbCBzdG9yYWdlIG9mIGFuIGluZGlyZWN0aW9uIHRhYmxlIGlzIGEgdTggYXJyYXkKQEAgLTIzNDUsNyArMjM1MCw3IEBACiAJCSAqIGFsaWduIHRoZSByZWNlaXZlZCB0YWJsZSB0byB0aGUgQ2xpZW50IElEIG9mIHRoZSBsZWFkaW5nIFJTUwogCQkgKiBxdWV1ZQogCQkgKi8KLQkJaW5kX3RhYmxlW2ldID0gaW5kaXItPnJpbmdfaW5kZXhbaV0gKyBicC0+ZnAtPmNsX2lkOworCQlpbmRfdGFibGVbaV0gPSBpbmRpcltpXSArIGJwLT5mcC0+Y2xfaWQ7CiAJfQogCiAJcmV0dXJuIGJueDJ4X2NvbmZpZ19yc3NfcGYoYnAsIGluZF90YWJsZSwgZmFsc2UpOwpAQCAtMjM3OCw2ICsyMzgzLDcgQEAKIAkuc2V0X3BoeXNfaWQJCT0gYm54Mnhfc2V0X3BoeXNfaWQsCiAJLmdldF9ldGh0b29sX3N0YXRzCT0gYm54MnhfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9yeG5mYwkJPSBibngyeF9nZXRfcnhuZmMsCisJLmdldF9yeGZoX2luZGlyX3NpemUJPSBibngyeF9nZXRfcnhmaF9pbmRpcl9zaXplLAogCS5nZXRfcnhmaF9pbmRpcgkJPSBibngyeF9nZXRfcnhmaF9pbmRpciwKIAkuc2V0X3J4ZmhfaW5kaXIJCT0gYm54Mnhfc2V0X3J4ZmhfaW5kaXIsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfaHNpLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9oc2kuaAppbmRleCBmYzc1NGNiLi4zZTMwYzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9oc2kuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9oc2kuaApAQCAtMTI0NywxMSArMTI0NywxNCBAQAogCSNkZWZpbmUgRFJWX01TR19DT0RFX1ZSRllfU1BFQ0lGSUNfUEhZX09QVF9NREwgIDB4YTEwMDAwMDAKIAkjZGVmaW5lIFJFUV9CQ19WRVJfNF9WUkZZX1NQRUNJRklDX1BIWV9PUFRfTURMICAweDAwMDUwMjM0CiAJI2RlZmluZSBSRVFfQkNfVkVSXzRfU0ZQX1RYX0RJU0FCTEVfU1VQUE9SVEVEICAgMHgwMDA3MDAxNAorCSNkZWZpbmUgUkVRX0JDX1ZFUl80X1BGQ19TVEFUU19TVVBQT1JURUQgICAgICAgIDB4MDAwNzAyMDEKIAogCSNkZWZpbmUgRFJWX01TR19DT0RFX0RDQlhfQURNSU5fUE1GX01TRyAgICAgICAgIDB4YjAwMDAwMDAKIAkjZGVmaW5lIERSVl9NU0dfQ09ERV9EQ0JYX1BNRl9EUlZfT0sgICAgICAgICAgICAweGIyMDAwMDAwCiAKIAkjZGVmaW5lIERSVl9NU0dfQ09ERV9WRl9ESVNBQkxFRF9ET05FICAgICAgICAgICAweGMwMDAwMDAwCisJI2RlZmluZSBEUlZfTVNHX0NPREVfRFJWX0lORk9fQUNLICAgICAgICAgICAgICAgMHhkODAwMDAwMAorCSNkZWZpbmUgRFJWX01TR19DT0RFX0RSVl9JTkZPX05BQ0sgICAgICAgICAgICAgIDB4ZDkwMDAwMDAKIAogCSNkZWZpbmUgRFJWX01TR19DT0RFX1NFVF9NRl9CVyAgICAgICAgICAgICAgICAgIDB4ZTAwMDAwMDAKIAkjZGVmaW5lIFJFUV9CQ19WRVJfNF9TRVRfTUZfQlcgICAgICAgICAgICAgICAgICAweDAwMDYwMjAyCkBAIC0xMzA0LDYgKzEzMDcsOCBAQAogCSNkZWZpbmUgRldfTVNHX0NPREVfVlJGWV9PUFRfTURMX0lOVkxEX0lNRyAgICAgIDB4YTAyMDAwMDAKIAkjZGVmaW5lIEZXX01TR19DT0RFX1ZSRllfT1BUX01ETF9VTkFQUFJPVkVEICAgICAweGEwMzAwMDAwCiAJI2RlZmluZSBGV19NU0dfQ09ERV9WRl9ESVNBQkxFRF9ET05FICAgICAgICAgICAgMHhiMDAwMDAwMAorCSNkZWZpbmUgRldfTVNHX0NPREVfRFJWX0lORk9fQUNLICAgICAgICAgICAgICAgIDB4ZDgxMDAwMDAKKwkjZGVmaW5lIEZXX01TR19DT0RFX0RSVl9JTkZPX05BQ0sgICAgICAgICAgICAgICAweGQ5MTAwMDAwCiAKIAkjZGVmaW5lIEZXX01TR19DT0RFX1NFVF9NRl9CV19TRU5UICAgICAgICAgICAgICAweGUwMDAwMDAwCiAJI2RlZmluZSBGV19NU0dfQ09ERV9TRVRfTUZfQldfRE9ORSAgICAgICAgICAgICAgMHhlMTAwMDAwMApAQCAtMTM2MCw2ICsxMzY1LDcgQEAKIAogCSNkZWZpbmUgRFJWX1NUQVRVU19EQ0JYX0VWRU5UX01BU0sgICAgICAgICAgICAgIDB4MDAwZjAwMDAKIAkjZGVmaW5lIERSVl9TVEFUVVNfRENCWF9ORUdPVElBVElPTl9SRVNVTFRTICAgICAweDAwMDEwMDAwCisJI2RlZmluZSBEUlZfU1RBVFVTX0RSVl9JTkZPX1JFUSAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAogCiAJdTMyIHZpcnRfbWFjX3VwcGVyOwogCSNkZWZpbmUgVklSVF9NQUNfU0lHTl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4ZmZmZjAwMDAKQEAgLTE5NjQsOSArMTk3MCwzOCBAQAogCXUzMiBleHRlbmRlZF9kZXZfaW5mb19zaGFyZWRfYWRkcjsKIAl1MzIgbmNzaV9vZW1fZGF0YV9hZGRyOwogCi0JdTMyIG9jc2RfaG9zdF9hZGRyOwotCXUzMiBvY2JiX2hvc3RfYWRkcjsKLQl1MzIgb2NzZF9yZXFfdXBkYXRlX2ludGVydmFsOworCXUzMiBvY3NkX2hvc3RfYWRkcjsgLyogaW5pdGlhbGl6ZWQgYnkgb3B0aW9uIFJPTSAqLworCXUzMiBvY2JiX2hvc3RfYWRkcjsgLyogaW5pdGlhbGl6ZWQgYnkgb3B0aW9uIFJPTSAqLworCXUzMiBvY3NkX3JlcV91cGRhdGVfaW50ZXJ2YWw7IC8qIGluaXRpYWxpemVkIGJ5IG9wdGlvbiBST00gKi8KKwl1MzIgdGVtcGVyYXR1cmVfaW5faGFsZl9jZWxzaXVzOworCXUzMiBnbG9iX3N0cnVjdF9pbl9ob3N0OworCisJdTMyIGRjYnhfbmVnX3Jlc19leHRfb2Zmc2V0OworI2RlZmluZSBTSE1FTV9EQ0JYX05FR19SRVNfRVhUX05PTkUJCQkweDAwMDAwMDAwCisKKwl1MzIgZHJ2X2NhcGFiaWxpdGllc19mbGFnW0UyX0ZVTkNfTUFYXTsKKyNkZWZpbmUgRFJWX0ZMQUdTX0NBUEFCSUxJVElFU19MT0FERURfU1VQUE9SVEVEIDB4MDAwMDAwMDEKKyNkZWZpbmUgRFJWX0ZMQUdTX0NBUEFCSUxJVElFU19MT0FERURfTDIgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRFJWX0ZMQUdTX0NBUEFCSUxJVElFU19MT0FERURfRkNPRSAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRFJWX0ZMQUdTX0NBUEFCSUxJVElFU19MT0FERURfSVNDU0kgICAgIDB4MDAwMDAwMDgKKworCXUzMiBleHRlbmRlZF9kZXZfaW5mb19zaGFyZWRfY2ZnX3NpemU7CisKKwl1MzIgZGNieF9lbltQT1JUX01BWF07CisKKwkvKiBUaGUgb2Zmc2V0IHBvaW50cyB0byB0aGUgbXVsdGkgdGhyZWFkZWQgbWV0YSBzdHJ1Y3R1cmUgKi8KKwl1MzIgbXVsdGlfdGhyZWFkX2RhdGFfb2Zmc2V0OworCisJLyogYWRkcmVzcyBvZiBETUFhYmxlIGhvc3QgYWRkcmVzcyBob2xkaW5nIHZhbHVlcyBmcm9tIHRoZSBkcml2ZXJzICovCisJdTMyIGRydl9pbmZvX2hvc3RfYWRkcl9sbzsKKwl1MzIgZHJ2X2luZm9faG9zdF9hZGRyX2hpOworCisJLyogZ2VuZXJhbCB2YWx1ZXMgd3JpdHRlbiBieSB0aGUgTUZXIChzdWNoIGFzIGN1cnJlbnQgdmVyc2lvbikgKi8KKwl1MzIgZHJ2X2luZm9fY29udHJvbDsKKyNkZWZpbmUgRFJWX0lORk9fQ09OVFJPTF9WRVJfTUFTSyAgICAgICAgICAweDAwMDAwMGZmCisjZGVmaW5lIERSVl9JTkZPX0NPTlRST0xfVkVSX1NISUZUICAgICAgICAgMAorI2RlZmluZSBEUlZfSU5GT19DT05UUk9MX09QX0NPREVfTUFTSyAgICAgIDB4MDAwMGZmMDAKKyNkZWZpbmUgRFJWX0lORk9fQ09OVFJPTF9PUF9DT0RFX1NISUZUICAgICA4CiB9OwogCiAKQEAgLTI1MDEsMTQgKzI1MzYsMTggQEAKICNkZWZpbmUgTUFDX1NUWF9JRFhfTUFYICAgICAgICAgICAgICAgICAgICAgMgogCiBzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzIHsKLQl1MzIgICAgICAgICAgICBob3N0X3BvcnRfc3RhdHNfc3RhcnQ7CisJdTMyICAgICAgICAgICAgaG9zdF9wb3J0X3N0YXRzX2NvdW50ZXI7CiAKIAlzdHJ1Y3QgbWFjX3N0eCBtYWNfc3R4W01BQ19TVFhfSURYX01BWF07CiAKIAl1MzIgICAgICAgICAgICBicmJfZHJvcF9oaTsKIAl1MzIgICAgICAgICAgICBicmJfZHJvcF9sbzsKIAotCXUzMiAgICAgICAgICAgIGhvc3RfcG9ydF9zdGF0c19lbmQ7CisJdTMyICAgICAgICAgICAgbm90X3VzZWQ7IC8qIG9ic29sZXRlICovCisJdTMyICAgICAgICAgICAgcGZjX2ZyYW1lc190eF9oaTsKKwl1MzIgICAgICAgICAgICBwZmNfZnJhbWVzX3R4X2xvOworCXUzMiAgICAgICAgICAgIHBmY19mcmFtZXNfcnhfaGk7CisJdTMyICAgICAgICAgICAgcGZjX2ZyYW1lc19yeF9sbzsKIH07CiAKIApAQCAtMjU0OCw2ICsyNTg3LDExOCBAQAogLyogVklDIGRlZmluaXRpb25zICovCiAjZGVmaW5lIFZJQ1NUQVRTVF9VSUZfSU5ERVggMgogCisvKiBjdXJyZW50IGRydl9pbmZvIHZlcnNpb24gKi8KKyNkZWZpbmUgRFJWX0lORk9fQ1VSX1ZFUiAxCisKKy8qIGRydl9pbmZvIG9wIGNvZGVzIHN1cHBvcnRlZCAqLworZW51bSBkcnZfaW5mb19vcGNvZGUgeworCUVUSF9TVEFUU19PUENPREUsCisJRkNPRV9TVEFUU19PUENPREUsCisJSVNDU0lfU1RBVFNfT1BDT0RFCit9OworCisjZGVmaW5lIEVUSF9TVEFUX0lORk9fVkVSU0lPTl9MRU4JMTIKKy8qICBQZXIgUENJIEZ1bmN0aW9uIEV0aGVybmV0IFN0YXRpc3RpY3MgcmVxdWlyZWQgZnJvbSB0aGUgZHJpdmVyICovCitzdHJ1Y3QgZXRoX3N0YXRzX2luZm8geworCS8qIEZ1bmN0aW9uJ3MgRHJpdmVyIFZlcnNpb24uIHBhZGRlZCB0byAxMiAqLworCXU4IHZlcnNpb25bRVRIX1NUQVRfSU5GT19WRVJTSU9OX0xFTl07CisJLyogTG9jYWxseSBBZG1pbiBBZGRyLiBCaWdFbmRpYW4gRUlVNDguIEFjdHVhbCBzaXplIGlzIDYgYnl0ZXMgKi8KKwl1OCBtYWNfbG9jYWxbOF07CisJdTggbWFjX2FkZDFbOF07CQkvKiBBZGRpdGlvbmFsIFByb2dyYW1tZWQgTUFDIEFkZHIgMS4gKi8KKwl1OCBtYWNfYWRkMls4XTsJCS8qIEFkZGl0aW9uYWwgUHJvZ3JhbW1lZCBNQUMgQWRkciAyLiAqLworCXUzMiBtdHVfc2l6ZTsJCS8qIE1UVSBTaXplLiBOb3RlICAgOiBOZWdvdGlhdGVkIE1UVSAqLworCXUzMiBmZWF0dXJlX2ZsYWdzOwkvKiBGZWF0dXJlX0ZsYWdzLiAqLworI2RlZmluZSBGRUFUVVJFX0VUSF9DSEtTVU1fT0ZGTE9BRF9NQVNLCQkweDAxCisjZGVmaW5lIEZFQVRVUkVfRVRIX0xTT19NQVNLCQkJMHgwMgorI2RlZmluZSBGRUFUVVJFX0VUSF9CT09UTU9ERV9NQVNLCQkweDFDCisjZGVmaW5lIEZFQVRVUkVfRVRIX0JPT1RNT0RFX1NISUZUCQkyCisjZGVmaW5lIEZFQVRVUkVfRVRIX0JPT1RNT0RFX05PTkUJCSgweDAgPDwgMikKKyNkZWZpbmUgRkVBVFVSRV9FVEhfQk9PVE1PREVfUFhFCQkoMHgxIDw8IDIpCisjZGVmaW5lIEZFQVRVUkVfRVRIX0JPT1RNT0RFX0lTQ1NJCQkoMHgyIDw8IDIpCisjZGVmaW5lIEZFQVRVUkVfRVRIX0JPT1RNT0RFX0ZDT0UJCSgweDMgPDwgMikKKyNkZWZpbmUgRkVBVFVSRV9FVEhfVE9FX01BU0sJCQkweDIwCisJdTMyIGxzb19tYXhfc2l6ZTsJLyogTFNPIE1heE9mZmxvYWRTaXplLiAqLworCXUzMiBsc29fbWluX3NlZ19jbnQ7CS8qIExTTyBNaW5TZWdtZW50Q291bnQuICovCisJLyogTnVtIE9mZmxvYWRlZCBDb25uZWN0aW9ucyBUQ1BfSVB2NC4gKi8KKwl1MzIgaXB2NF9vZmxkX2NudDsKKwkvKiBOdW0gT2ZmbG9hZGVkIENvbm5lY3Rpb25zIFRDUF9JUHY2LiAqLworCXUzMiBpcHY2X29mbGRfY250OworCXUzMiBwcm9taXNjdW91c19tb2RlOwkvKiBQcm9taXNjdW91cyBNb2RlLiBub24temVybyB0cnVlICovCisJdTMyIHR4cV9zaXplOwkJLyogVFggRGVzY3JpcHRvcnMgUXVldWUgU2l6ZSAqLworCXUzMiByeHFfc2l6ZTsJCS8qIFJYIERlc2NyaXB0b3JzIFF1ZXVlIFNpemUgKi8KKwkvKiBUWCBEZXNjcmlwdG9yIFF1ZXVlIEF2ZyBEZXB0aC4gJSBBdmcgUXVldWUgRGVwdGggc2luY2UgbGFzdCBwb2xsICovCisJdTMyIHR4cV9hdmdfZGVwdGg7CisJLyogUlggRGVzY3JpcHRvcnMgUXVldWUgQXZnIERlcHRoLiAlIEF2ZyBRdWV1ZSBEZXB0aCBzaW5jZSBsYXN0IHBvbGwgKi8KKwl1MzIgcnhxX2F2Z19kZXB0aDsKKwkvKiBJT1ZfT2ZmbG9hZC4gMD1ub25lOyAxPU11bHRpUXVldWUsIDI9VkVCIDM9IFZFUEEqLworCXUzMiBpb3Zfb2ZmbG9hZDsKKwkvKiBOdW1iZXIgb2YgTmV0UXVldWUvVk1RIENvbmZpZydkLiAqLworCXUzMiBuZXRxX2NudDsKKwl1MzIgdmZfY250OwkJLyogTnVtIFZGIGFzc2lnbmVkIHRvIHRoaXMgUEYuICovCit9OworCisvKiAgUGVyIFBDSSBGdW5jdGlvbiBGQ09FIFN0YXRpc3RpY3MgcmVxdWlyZWQgZnJvbSB0aGUgZHJpdmVyICovCitzdHJ1Y3QgZmNvZV9zdGF0c19pbmZvIHsKKwl1OCB2ZXJzaW9uWzEyXTsJCS8qIEZ1bmN0aW9uJ3MgRHJpdmVyIFZlcnNpb24uICovCisJdTggbWFjX2xvY2FsWzhdOwkvKiBMb2NhbGx5IEFkbWluIEFkZHIuICovCisJdTggbWFjX2FkZDFbOF07CQkvKiBBZGRpdGlvbmFsIFByb2dyYW1tZWQgTUFDIEFkZHIgMS4gKi8KKwl1OCBtYWNfYWRkMls4XTsJCS8qIEFkZGl0aW9uYWwgUHJvZ3JhbW1lZCBNQUMgQWRkciAyLiAqLworCS8qIFFvUyBQcmlvcml0eSAocGVyIDgwMi4xcCkuIDAtNzI1NSAqLworCXUzMiBxb3NfcHJpb3JpdHk7CisJdTMyIHR4cV9zaXplOwkJLyogRkNvRSBUWCBEZXNjcmlwdG9ycyBRdWV1ZSBTaXplLiAqLworCXUzMiByeHFfc2l6ZTsJCS8qIEZDb0UgUlggRGVzY3JpcHRvcnMgUXVldWUgU2l6ZS4gKi8KKwkvKiBGQ29FIFRYIERlc2NyaXB0b3IgUXVldWUgQXZnIERlcHRoLiAqLworCXUzMiB0eHFfYXZnX2RlcHRoOworCS8qIEZDb0UgUlggRGVzY3JpcHRvcnMgUXVldWUgQXZnIERlcHRoLiAqLworCXUzMiByeHFfYXZnX2RlcHRoOworCXUzMiByeF9mcmFtZXNfbG87CS8qIEZDb0UgUlggRnJhbWVzIHJlY2VpdmVkLiAqLworCXUzMiByeF9mcmFtZXNfaGk7CS8qIEZDb0UgUlggRnJhbWVzIHJlY2VpdmVkLiAqLworCXUzMiByeF9ieXRlc19sbzsJLyogRkNvRSBSWCBCeXRlcyByZWNlaXZlZC4gKi8KKwl1MzIgcnhfYnl0ZXNfaGk7CS8qIEZDb0UgUlggQnl0ZXMgcmVjZWl2ZWQuICovCisJdTMyIHR4X2ZyYW1lc19sbzsJLyogRkNvRSBUWCBGcmFtZXMgc2VudC4gKi8KKwl1MzIgdHhfZnJhbWVzX2hpOwkvKiBGQ29FIFRYIEZyYW1lcyBzZW50LiAqLworCXUzMiB0eF9ieXRlc19sbzsJLyogRkNvRSBUWCBCeXRlcyBzZW50LiAqLworCXUzMiB0eF9ieXRlc19oaTsJLyogRkNvRSBUWCBCeXRlcyBzZW50LiAqLworfTsKKworLyogUGVyIFBDSSAgRnVuY3Rpb24gaVNDU0kgU3RhdGlzdGljcyByZXF1aXJlZCBmcm9tIHRoZSBkcml2ZXIqLworc3RydWN0IGlzY3NpX3N0YXRzX2luZm8geworCXU4IHZlcnNpb25bMTJdOwkJLyogRnVuY3Rpb24ncyBEcml2ZXIgVmVyc2lvbi4gKi8KKwl1OCBtYWNfbG9jYWxbOF07CS8qIExvY2FsbHkgQWRtaW4gaVNDU0kgTUFDIEFkZHIuICovCisJdTggbWFjX2FkZDFbOF07CQkvKiBBZGRpdGlvbmFsIFByb2dyYW1tZWQgTUFDIEFkZHIgMS4gKi8KKwkvKiBRb1MgUHJpb3JpdHkgKHBlciA4MDIuMXApLiAwLTcyNTUgKi8KKwl1MzIgcW9zX3ByaW9yaXR5OworCXU4IGluaXRpYXRvcl9uYW1lWzY0XTsJLyogaVNDU0kgQm9vdCBJbml0aWF0b3IgTm9kZSBuYW1lLiAqLworCXU4IHd3X3BvcnRfbmFtZVs2NF07CS8qIGlTQ1NJIFdvcmxkIHdpZGUgcG9ydCBuYW1lICovCisJdTggYm9vdF90YXJnZXRfbmFtZVs2NF07LyogaVNDU0kgQm9vdCBUYXJnZXQgTmFtZS4gKi8KKwl1OCBib290X3RhcmdldF9pcFsxNl07CS8qIGlTQ1NJIEJvb3QgVGFyZ2V0IElQLiAqLworCXUzMiBib290X3RhcmdldF9wb3J0YWw7CS8qIGlTQ1NJIEJvb3QgVGFyZ2V0IFBvcnRhbC4gKi8KKwl1OCBib290X2luaXRfaXBbMTZdOwkvKiBpU0NTSSBCb290IEluaXRpYXRvciBJUCBBZGRyZXNzLiAqLworCXUzMiBtYXhfZnJhbWVfc2l6ZTsJLyogTWF4IEZyYW1lIFNpemUuIGJ5dGVzICovCisJdTMyIHR4cV9zaXplOwkJLyogUERVIFRYIERlc2NyaXB0b3JzIFF1ZXVlIFNpemUuICovCisJdTMyIHJ4cV9zaXplOwkJLyogUERVIFJYIERlc2NyaXB0b3JzIFF1ZXVlIFNpemUuICovCisJdTMyIHR4cV9hdmdfZGVwdGg7CS8qIFBEVSBUWCBEZXNjcmlwdG9yIFF1ZXVlIEF2ZyBEZXB0aC4gKi8KKwl1MzIgcnhxX2F2Z19kZXB0aDsJLyogUERVIFJYIERlc2NyaXB0b3JzIFF1ZXVlIEF2ZyBEZXB0aC4gKi8KKwl1MzIgcnhfcGR1c19sbzsJCS8qIGlTQ1NJIFBEVXMgcmVjZWl2ZWQuICovCisJdTMyIHJ4X3BkdXNfaGk7CQkvKiBpU0NTSSBQRFVzIHJlY2VpdmVkLiAqLworCXUzMiByeF9ieXRlc19sbzsJLyogaVNDU0kgUlggQnl0ZXMgcmVjZWl2ZWQuICovCisJdTMyIHJ4X2J5dGVzX2hpOwkvKiBpU0NTSSBSWCBCeXRlcyByZWNlaXZlZC4gKi8KKwl1MzIgdHhfcGR1c19sbzsJCS8qIGlTQ1NJIFBEVXMgc2VudC4gKi8KKwl1MzIgdHhfcGR1c19oaTsJCS8qIGlTQ1NJIFBEVXMgc2VudC4gKi8KKwl1MzIgdHhfYnl0ZXNfbG87CS8qIGlTQ1NJIFBEVSBUWCBCeXRlcyBzZW50LiAqLworCXUzMiB0eF9ieXRlc19oaTsJLyogaVNDU0kgUERVIFRYIEJ5dGVzIHNlbnQuICovCisJdTMyIHBjcF9wcmlvcl9tYXBfdGJsOwkvKiBDLVBDUCB0byBTLVBDUCBQcmlvcml0eSBNYXBUYWJsZS4KKwkJCQkgKiA5IG5pYmJsZXMsIHRoZSBwb3NpdGlvbiBvZiBlYWNoIG5pYmJsZQorCQkJCSAqIHJlcHJlc2VudHMgdGhlIEMtUENQIHZhbHVlLCB0aGUgdmFsdWUKKwkJCQkgKiBvZiB0aGUgbmliYmxlID0gUy1QQ1AgdmFsdWUuCisJCQkJICovCit9OworCit1bmlvbiBkcnZfaW5mb190b19tY3AgeworCXN0cnVjdCBldGhfc3RhdHNfaW5mbwlldGhlcl9zdGF0OworCXN0cnVjdCBmY29lX3N0YXRzX2luZm8JZmNvZV9zdGF0OworCXN0cnVjdCBpc2NzaV9zdGF0c19pbmZvCWlzY3NpX3N0YXQ7Cit9OwogI2RlZmluZSBCQ01fNTcxMF9GV19NQUpPUl9WRVJTSU9OCQkJNwogI2RlZmluZSBCQ01fNTcxMF9GV19NSU5PUl9WRVJTSU9OCQkJMAogI2RlZmluZSBCQ01fNTcxMF9GV19SRVZJU0lPTl9WRVJTSU9OCQkyOQpAQCAtNDE2MSw4ICs0MzEyLDYyIEBACiAKIAogLyoKLSAqIGNmYyBkZWxldGUgZXZlbnQgZGF0YQorICogRkNvRSBSWCBzdGF0aXN0aWNzIHBhcmFtZXRlcnMgc2VjdGlvbiMwCiAgKi8KK3N0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24wIHsKKwlfX2xlMzIgZmNvZV9yeF9wa3RfY250OworCV9fbGUzMiBmY29lX3J4X2J5dGVfY250OworfTsKKworCisvKgorICogRkNvRSBSWCBzdGF0aXN0aWNzIHBhcmFtZXRlcnMgc2VjdGlvbiMxCisgKi8KK3N0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24xIHsKKwlfX2xlMzIgZmNvZV92ZXJfY250OworCV9fbGUzMiBmY29lX3J4X2Ryb3BfcGt0X2NudDsKK307CisKKworLyoKKyAqIEZDb0UgUlggc3RhdGlzdGljcyBwYXJhbWV0ZXJzIHNlY3Rpb24jMgorICovCitzdHJ1Y3QgZmNvZV9yeF9zdGF0X3BhcmFtc19zZWN0aW9uMiB7CisJX19sZTMyIGZjX2NyY19jbnQ7CisJX19sZTMyIGVvZmFfZGVsX2NudDsKKwlfX2xlMzIgbWlzc19mcmFtZV9jbnQ7CisJX19sZTMyIHNlcV90aW1lb3V0X2NudDsKKwlfX2xlMzIgZHJvcF9zZXFfY250OworCV9fbGUzMiBmY29lX3J4X2Ryb3BfcGt0X2NudDsKKwlfX2xlMzIgZmNwX3J4X3BrdF9jbnQ7CisJX19sZTMyIHJlc2VydmVkMDsKK307CisKKworLyoKKyAqIEZDb0UgVFggc3RhdGlzdGljcyBwYXJhbWV0ZXJzCisgKi8KK3N0cnVjdCBmY29lX3R4X3N0YXRfcGFyYW1zIHsKKwlfX2xlMzIgZmNvZV90eF9wa3RfY250OworCV9fbGUzMiBmY29lX3R4X2J5dGVfY250OworCV9fbGUzMiBmY3BfdHhfcGt0X2NudDsKKwlfX2xlMzIgcmVzZXJ2ZWQwOworfTsKKworLyoKKyAqIEZDb0Ugc3RhdGlzdGljcyBwYXJhbWV0ZXJzCisgKi8KK3N0cnVjdCBmY29lX3N0YXRpc3RpY3NfcGFyYW1zIHsKKwlzdHJ1Y3QgZmNvZV90eF9zdGF0X3BhcmFtcyB0eF9zdGF0OworCXN0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24wIHJ4X3N0YXQwOworCXN0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24xIHJ4X3N0YXQxOworCXN0cnVjdCBmY29lX3J4X3N0YXRfcGFyYW1zX3NlY3Rpb24yIHJ4X3N0YXQyOworfTsKKworCisvKgorICogY2ZjIGRlbGV0ZSBldmVudCBkYXRhCisqLwogc3RydWN0IGNmY19kZWxfZXZlbnRfZGF0YSB7CiAJdTMyIGNpZDsKIAl1MzIgcmVzZXJ2ZWQwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbGluay5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbGluay5jCmluZGV4IGJjZTIwM2YuLjRkZjk1MDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2xpbmsuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9saW5rLmMKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlICJibngyeC5oIgogI2luY2x1ZGUgImJueDJ4X2Ntbi5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNkZWZpbmUgRVRIX0hMRU4JCQkxNAogLyogTDIgaGVhZGVyIHNpemUgKyAyKlZMQU5zICg4IGJ5dGVzKSArIExMQyBTTkFQICg4IGJ5dGVzKSAqLwpAQCAtMTYzLDYgKzE2MiwxMSBAQAogI2RlZmluZSBFRENfTU9ERV9MSU1JVElORwkJCQkweDAwNDQKICNkZWZpbmUgRURDX01PREVfUEFTU0lWRV9EQUMJCQkweDAwNTUKIAorLyogQlJCIGRlZmF1bHQgZm9yIGNsYXNzIDAgRTIgKi8KKyNkZWZpbmUgREVGQVVMVDBfRTJfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUgkxNzAKKyNkZWZpbmUgREVGQVVMVDBfRTJfQlJCX01BQ19QQVVTRV9YT05fVEhSCQkyNTAKKyNkZWZpbmUgREVGQVVMVDBfRTJfQlJCX01BQ19GVUxMX1hPRkZfVEhSCQkxMAorI2RlZmluZSBERUZBVUxUMF9FMl9CUkJfTUFDX0ZVTExfWE9OX1RIUgkJNTAKIAogLyogQlJCIHRocmVzaG9sZHMgZm9yIEUyKi8KICNkZWZpbmUgUEZDX0UyX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfUEFVU0UJCTE3MApAQCAtMTc3LDYgKzE4MSwxMiBAQAogI2RlZmluZSBQRkNfRTJfQlJCX01BQ19GVUxMX1hPTl9USFJfUEFVU0UJCQk1MAogI2RlZmluZSBQRkNfRTJfQlJCX01BQ19GVUxMX1hPTl9USFJfTk9OX1BBVVNFCQkyNTAKIAorLyogQlJCIGRlZmF1bHQgZm9yIGNsYXNzIDAgRTNBMCAqLworI2RlZmluZSBERUZBVUxUMF9FM0EwX0JSQl9NQUNfUEFVU0VfWE9GRl9USFIJMjkwCisjZGVmaW5lIERFRkFVTFQwX0UzQTBfQlJCX01BQ19QQVVTRV9YT05fVEhSCTQxMAorI2RlZmluZSBERUZBVUxUMF9FM0EwX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUgkxMAorI2RlZmluZSBERUZBVUxUMF9FM0EwX0JSQl9NQUNfRlVMTF9YT05fVEhSCTUwCisKIC8qIEJSQiB0aHJlc2hvbGRzIGZvciBFM0EwICovCiAjZGVmaW5lIFBGQ19FM0EwX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfUEFVU0UJCTI5MAogI2RlZmluZSBQRkNfRTNBMF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX05PTl9QQVVTRQkJMApAQCAtMTkwLDYgKzIwMCwxMSBAQAogI2RlZmluZSBQRkNfRTNBMF9CUkJfTUFDX0ZVTExfWE9OX1RIUl9QQVVTRQkJNTAKICNkZWZpbmUgUEZDX0UzQTBfQlJCX01BQ19GVUxMX1hPTl9USFJfTk9OX1BBVVNFCQk0MTAKIAorLyogQlJCIGRlZmF1bHQgZm9yIEUzQjAgKi8KKyNkZWZpbmUgREVGQVVMVDBfRTNCMF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSCTMzMAorI2RlZmluZSBERUZBVUxUMF9FM0IwX0JSQl9NQUNfUEFVU0VfWE9OX1RIUgk0OTAKKyNkZWZpbmUgREVGQVVMVDBfRTNCMF9CUkJfTUFDX0ZVTExfWE9GRl9USFIJMTUKKyNkZWZpbmUgREVGQVVMVDBfRTNCMF9CUkJfTUFDX0ZVTExfWE9OX1RIUgk1NQogCiAvKiBCUkIgdGhyZXNob2xkcyBmb3IgRTNCMCAyIHBvcnQgbW9kZSovCiAjZGVmaW5lIFBGQ19FM0IwXzJQX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfUEFVU0UJCTEwMjUKQEAgLTIzOSwxOCArMjU0LDI5IEBACiAjZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9NQUNfRlVMTF9YT05fVEhSX1BBVVNFCQk1MAogI2RlZmluZSBQRkNfRTNCMF80UF9CUkJfTUFDX0ZVTExfWE9OX1RIUl9OT05fUEFVU0UJMzg0CiAKLQogLyogb25seSBmb3IgRTNCMCovCiAjZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9GVUxMX0xCX1hPRkZfVEhSCQkJMzA0CiAjZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9GVUxMX0xCX1hPTl9USFIJCQkzODQKLSNkZWZpbmUgUEZDX0UzQjBfNFBfTEJfR1VBUlQJCQkJMTIwCisjZGVmaW5lIFBGQ19FM0IwXzRQX0xCX0dVQVJUCQkxMjAKIAogI2RlZmluZSBQRkNfRTNCMF80UF9CUkJfTUFDXzBfQ0xBU1NfVF9HVUFSVAkJMTIwCi0jZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9NQUNfMF9DTEFTU19UX0dVQVJUX0hZU1QJCTgwCisjZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9NQUNfMF9DTEFTU19UX0dVQVJUX0hZU1QJODAKIAogI2RlZmluZSBQRkNfRTNCMF80UF9CUkJfTUFDXzFfQ0xBU1NfVF9HVUFSVAkJODAKLSNkZWZpbmUgUEZDX0UzQjBfNFBfQlJCX01BQ18xX0NMQVNTX1RfR1VBUlRfSFlTVAkJMTIwCisjZGVmaW5lIFBGQ19FM0IwXzRQX0JSQl9NQUNfMV9DTEFTU19UX0dVQVJUX0hZU1QJMTIwCiAKKy8qIFBhdXNlIGRlZmluZXMqLworI2RlZmluZSBERUZBVUxUX0UzQjBfQlJCX0ZVTExfTEJfWE9GRl9USFIJCQkzMzAKKyNkZWZpbmUgREVGQVVMVF9FM0IwX0JSQl9GVUxMX0xCX1hPTl9USFIJCQk0OTAKKyNkZWZpbmUgREVGQVVMVF9FM0IwX0xCX0dVQVJUCQk0MAorCisjZGVmaW5lIERFRkFVTFRfRTNCMF9CUkJfTUFDXzBfQ0xBU1NfVF9HVUFSVAkJNDAKKyNkZWZpbmUgREVGQVVMVF9FM0IwX0JSQl9NQUNfMF9DTEFTU19UX0dVQVJUX0hZU1QJMAorCisjZGVmaW5lIERFRkFVTFRfRTNCMF9CUkJfTUFDXzFfQ0xBU1NfVF9HVUFSVAkJNDAKKyNkZWZpbmUgREVGQVVMVF9FM0IwX0JSQl9NQUNfMV9DTEFTU19UX0dVQVJUX0hZU1QJMAorCisvKiBFVFMgZGVmaW5lcyovCiAjZGVmaW5lIERDQlhfSU5WQUxJRF9DT1MJCQkJCSgweEZGKQogCiAjZGVmaW5lIEVUU19CV19MSU1JVF9DUkVESVRfVVBQRVJfQk9VTkQJCSgweDUwMDApCkBAIC00NDAsNyArNDY2LDcgQEAKIAl1MzIgbWluX3dfdmFsID0gMDsKIAkvKiBDYWxjdWxhdGUgbWluX3dfdmFsLiovCiAJaWYgKHZhcnMtPmxpbmtfdXApIHsKLQkJaWYgKFNQRUVEXzIwMDAwID09IHZhcnMtPmxpbmVfc3BlZWQpCisJCWlmICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzIwMDAwKQogCQkJbWluX3dfdmFsID0gRVRTX0UzQjBfTklHX01JTl9XX1ZBTF8yMEdCUFM7CiAJCWVsc2UKIAkJCW1pbl93X3ZhbCA9IEVUU19FM0IwX05JR19NSU5fV19WQUxfVVBfVE9fMTBHQlBTOwpAQCAtNDkwLDcgKzUxNiw3IEBACiAJUkVHX1dSKGJwLCAocG9ydCkgPyBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfNSA6CiAJCSAgIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF81LCBjcmVkaXRfdXBwZXJfYm91bmQpOwogCi0JaWYgKDAgPT0gcG9ydCkgeworCWlmICghcG9ydCkgewogCQlSRUdfV1IoYnAsIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9VUFBFUl9CT1VORF82LAogCQkJY3JlZGl0X3VwcGVyX2JvdW5kKTsKIAkJUkVHX1dSKGJwLCBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfVVBQRVJfQk9VTkRfNywKQEAgLTU4NCw3ICs2MTAsNyBAQAogCQkgICBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfV0VJR0hUXzQsIDB4MCk7CiAJUkVHX1dSKGJwLCAocG9ydCkgPyBOSUdfUkVHX1AxX1RYX0FSQl9DUkVESVRfV0VJR0hUXzUgOgogCQkgICBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfV0VJR0hUXzUsIDB4MCk7Ci0JaWYgKDAgPT0gcG9ydCkgeworCWlmICghcG9ydCkgewogCQlSRUdfV1IoYnAsIE5JR19SRUdfUDBfVFhfQVJCX0NSRURJVF9XRUlHSFRfNiwgMHgwKTsKIAkJUkVHX1dSKGJwLCBOSUdfUkVHX1AwX1RYX0FSQl9DUkVESVRfV0VJR0hUXzcsIDB4MCk7CiAJCVJFR19XUihicCwgTklHX1JFR19QMF9UWF9BUkJfQ1JFRElUX1dFSUdIVF84LCAweDApOwpAQCAtNjEyLDcgKzYzOCw3IEBACiAJKiBJbiAyIHBvcnQgbW9kZSBwb3J0MCBoYXMgQ09TMC01IHRoYXQgY2FuIGJlIHVzZWQgZm9yIFdGUS5JbiA0CiAJKiBwb3J0IG1vZGUgcG9ydDEgaGFzIENPUzAtMiB0aGF0IGNhbiBiZSB1c2VkIGZvciBXRlEuCiAJKi8KLQlpZiAoMCA9PSBwb3J0KSB7CisJaWYgKCFwb3J0KSB7CiAJCWJhc2VfdXBwZXJfYm91bmQgPSBQQkZfUkVHX0NPUzBfVVBQRVJfQk9VTkRfUDA7CiAJCW1heF9jb3MgPSBEQ0JYX0UzQjBfTUFYX05VTV9DT1NfUE9SVDA7CiAJfSBlbHNlIHsKQEAgLTY3NCw3ICs3MDAsNyBAQAogCSogSW4gMiBwb3J0IG1vZGUgcG9ydDAgaGFzIENPUzAtNSB0aGF0IGNhbiBiZSB1c2VkIGZvciBXRlEuCiAJKiBJbiA0IHBvcnQgbW9kZSBwb3J0MSBoYXMgQ09TMC0yIHRoYXQgY2FuIGJlIHVzZWQgZm9yIFdGUS4KIAkqLwotCWlmICgwID09IHBvcnQpIHsKKwlpZiAoIXBvcnQpIHsKIAkJYmFzZV93ZWlnaHQgPSBQQkZfUkVHX0NPUzBfV0VJR0hUX1AwOwogCQltYXhfY29zID0gRENCWF9FM0IwX01BWF9OVU1fQ09TX1BPUlQwOwogCX0gZWxzZSB7CkBAIC04NDYsMzQgKzg3Miw0NyBAQAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogc3RhdGljIGludCBibngyeF9ldHNfZTNiMF9nZXRfdG90YWxfYncoCiAJY29uc3Qgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JY29uc3Qgc3RydWN0IGJueDJ4X2V0c19wYXJhbXMgKmV0c19wYXJhbXMsCisJc3RydWN0IGJueDJ4X2V0c19wYXJhbXMgKmV0c19wYXJhbXMsCiAJdTE2ICp0b3RhbF9idykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAl1OCBjb3NfaWR4ID0gMDsKKwl1OCBpc19id19jb3NfZXhpc3QgPSAwOwogCiAJKnRvdGFsX2J3ID0gMCA7CisKIAkvKiBDYWxjdWxhdGUgdG90YWwgQlcgcmVxdWVzdGVkICovCiAJZm9yIChjb3NfaWR4ID0gMDsgY29zX2lkeCA8IGV0c19wYXJhbXMtPm51bV9vZl9jb3M7IGNvc19pZHgrKykgewotCQlpZiAoYm54MnhfY29zX3N0YXRlX2J3ID09IGV0c19wYXJhbXMtPmNvc1tjb3NfaWR4XS5zdGF0ZSkgeworCQlpZiAoZXRzX3BhcmFtcy0+Y29zW2Nvc19pZHhdLnN0YXRlID09IGJueDJ4X2Nvc19zdGF0ZV9idykgeworCQkJaXNfYndfY29zX2V4aXN0ID0gMTsKKwkJCWlmICghZXRzX3BhcmFtcy0+Y29zW2Nvc19pZHhdLnBhcmFtcy5id19wYXJhbXMuYncpIHsKKwkJCQlEUChORVRJRl9NU0dfTElOSywgImJueDJ4X2V0c19FM0IwX2NvbmZpZyBCVyIKKwkJCQkJCSAgICJ3YXMgc2V0IHRvIDBcbiIpOworCQkJCS8qCisJCQkJICogVGhpcyBpcyB0byBwcmV2ZW50IGEgc3RhdGUgd2hlbiByYW1yb2RzCisJCQkJICogY2FuJ3QgYmUgc2VudAorCQkJCSovCisJCQkJZXRzX3BhcmFtcy0+Y29zW2Nvc19pZHhdLnBhcmFtcy5id19wYXJhbXMuYncKKwkJCQkJID0gMTsKKwkJCX0KIAkJCSp0b3RhbF9idyArPQogCQkJCWV0c19wYXJhbXMtPmNvc1tjb3NfaWR4XS5wYXJhbXMuYndfcGFyYW1zLmJ3OwogCQl9CiAJfQogCiAJLyogQ2hlY2sgdG90YWwgQlcgaXMgdmFsaWQgKi8KLQlpZiAoKDEwMCAhPSAqdG90YWxfYncpIHx8ICgwID09ICp0b3RhbF9idykpIHsKLQkJaWYgKDAgPT0gKnRvdGFsX2J3KSB7CisJaWYgKChpc19id19jb3NfZXhpc3QgPT0gMSkgJiYgKCp0b3RhbF9idyAhPSAxMDApKSB7CisJCWlmICgqdG90YWxfYncgPT0gMCkgewogCQkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCQkgICAiYm54MnhfZXRzX0UzQjBfY29uZmlnIHRvYXRsIEJXIHNob3VsZG4ndCBiZSAwXG4iKTsKKwkJCSAgICJibngyeF9ldHNfRTNCMF9jb25maWcgdG90YWwgQlcgc2hvdWxkbid0IGJlIDBcbiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAkJRFAoTkVUSUZfTVNHX0xJTkssCi0JCSAgICJibngyeF9ldHNfRTNCMF9jb25maWcgdG9hdGwgQlcgc2hvdWxkIGJlIDEwMFxuIik7Ci0JCS8qKgotCQkqICAgV2UgY2FuIGhhbmRsZSBhIGNhc2Ugd2hyZSB0aGUgQlcgaXNuJ3QgMTAwIHRoaXMgY2FuIGhhcHBlbgotCQkqICAgaWYgdGhlIFRDIGFyZSBqb2luZWQuCi0JCSovCisJCSAgICJibngyeF9ldHNfRTNCMF9jb25maWcgdG90YWwgQlcgc2hvdWxkIGJlIDEwMFxuIik7CisJCS8qCisJCSAqIFdlIGNhbiBoYW5kbGUgYSBjYXNlIHdocmUgdGhlIEJXIGlzbid0IDEwMCB0aGlzIGNhbiBoYXBwZW4KKwkJICogaWYgdGhlIFRDIGFyZSBqb2luZWQuCisJCSAqLwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTkwNCw3ICs5NDMsNyBAQAogCWNvbnN0IHU4IG1heF9udW1fb2ZfY29zID0gKHBvcnQpID8gRENCWF9FM0IwX01BWF9OVU1fQ09TX1BPUlQxIDoKIAkJRENCWF9FM0IwX01BWF9OVU1fQ09TX1BPUlQwOwogCi0JaWYgKERDQlhfSU5WQUxJRF9DT1MgIT0gc3BfcHJpX3RvX2Nvc1twcmldKSB7CisJaWYgKHNwX3ByaV90b19jb3NbcHJpXSAhPSBEQ0JYX0lOVkFMSURfQ09TKSB7CiAJCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfZXRzX2UzYjBfc3BfcHJpX3RvX2Nvc19zZXQgaW52YWxpZCAiCiAJCQkJICAgInBhcmFtZXRlciBUaGVyZSBjYW4ndCBiZSB0d28gQ09TJ3Mgd2l0aCAiCiAJCQkJICAgInRoZSBzYW1lIHN0cmljdCBwcmlcbiIpOwpAQCAtOTEzLDcgKzk1Miw3IEBACiAKIAlpZiAocHJpID4gbWF4X251bV9vZl9jb3MpIHsKIAkJRFAoTkVUSUZfTVNHX0xJTkssICJibngyeF9ldHNfZTNiMF9zcF9wcmlfdG9fY29zX3NldCBpbnZhbGlkICIKLQkJCSAgICAgICAicGFyYW1ldGVyIElsbGVnYWwgc3RyaWN0IHByaW9yaXR5XG4iKTsKKwkJICAgInBhcmFtZXRlciBJbGxlZ2FsIHN0cmljdCBwcmlvcml0eVxuIik7CiAJICAgIHJldHVybiAtRUlOVkFMOwogCX0KIApAQCAtOTk1LDggKzEwMzQsOCBAQAogCiAJLyogU2V0IGFsbCB0aGUgc3RyaWN0IHByaW9yaXR5IGZpcnN0ICovCiAJZm9yIChpID0gMDsgaSA8IG1heF9udW1fb2ZfY29zOyBpKyspIHsKLQkJaWYgKERDQlhfSU5WQUxJRF9DT1MgIT0gc3BfcHJpX3RvX2Nvc1tpXSkgewotCQkJaWYgKERDQlhfTUFYX05VTV9DT1MgPD0gc3BfcHJpX3RvX2Nvc1tpXSkgeworCQlpZiAoc3BfcHJpX3RvX2Nvc1tpXSAhPSBEQ0JYX0lOVkFMSURfQ09TKSB7CisJCQlpZiAoc3BfcHJpX3RvX2Nvc1tpXSA+PSBEQ0JYX01BWF9OVU1fQ09TKSB7CiAJCQkJRFAoTkVUSUZfTVNHX0xJTkssCiAJCQkJCSAgICJibngyeF9ldHNfZTNiMF9zcF9zZXRfcHJpX2NsaV9yZWcgIgogCQkJCQkgICAiaW52YWxpZCBjb3MgZW50cnlcbiIpOwpAQCAtMTAxMCw3ICsxMDQ5LDcgQEAKIAkJCSAgICBzcF9wcmlfdG9fY29zW2ldLCBwcmlfc2V0KTsKIAkJCXByaV9iaXRtYXNrID0gMSA8PCBzcF9wcmlfdG9fY29zW2ldOwogCQkJLyogQ09TIGlzIHVzZWQgcmVtb3ZlIGl0IGZyb20gYml0bWFwLiovCi0JCQlpZiAoMCA9PSAocHJpX2JpdG1hc2sgJiBjb3NfYml0X3RvX3NldCkpIHsKKwkJCWlmICghKHByaV9iaXRtYXNrICYgY29zX2JpdF90b19zZXQpKSB7CiAJCQkJRFAoTkVUSUZfTVNHX0xJTkssCiAJCQkJCSJibngyeF9ldHNfZTNiMF9zcF9zZXRfcHJpX2NsaV9yZWcgIgogCQkJCQkiaW52YWxpZCBUaGVyZSBjYW4ndCBiZSB0d28gQ09TJ3Mgd2l0aCIKQEAgLTEwNzIsNyArMTExMSw3IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBpbnQgYm54MnhfZXRzX2UzYjBfY29uZmlnKGNvbnN0IHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAogCQkJIGNvbnN0IHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCi0JCQkgY29uc3Qgc3RydWN0IGJueDJ4X2V0c19wYXJhbXMgKmV0c19wYXJhbXMpCisJCQkgc3RydWN0IGJueDJ4X2V0c19wYXJhbXMgKmV0c19wYXJhbXMpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAJaW50IGJueDJ4X3N0YXR1cyA9IDA7CkBAIC0xMTA1LDE1ICsxMTQ0LDE1IEBACiAJLyogUHJlcGFyZSBCVyBwYXJhbWV0ZXJzKi8KIAlibngyeF9zdGF0dXMgPSBibngyeF9ldHNfZTNiMF9nZXRfdG90YWxfYncocGFyYW1zLCBldHNfcGFyYW1zLAogCQkJCQkJICAgJnRvdGFsX2J3KTsKLQlpZiAoMCAhPSBibngyeF9zdGF0dXMpIHsKKwlpZiAoYm54Mnhfc3RhdHVzKSB7CiAJCURQKE5FVElGX01TR19MSU5LLAogCQkgICAiYm54MnhfZXRzX0UzQjBfY29uZmlnIGdldF90b3RhbF9idyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQkvKioKLQkgKiAgVXBwZXIgYm91bmQgaXMgc2V0IGFjY29yZGluZyB0byBjdXJyZW50IGxpbmsgc3BlZWQgKG1pbl93X3ZhbAotCSAqICBzaG91bGQgYmUgdGhlIHNhbWUgZm9yIHVwcGVyIGJvdW5kIGFuZCBDT1MgY3JlZGl0IHZhbCkuCisJLyoKKwkgKiBVcHBlciBib3VuZCBpcyBzZXQgYWNjb3JkaW5nIHRvIGN1cnJlbnQgbGluayBzcGVlZCAobWluX3dfdmFsCisJICogc2hvdWxkIGJlIHRoZSBzYW1lIGZvciB1cHBlciBib3VuZCBhbmQgQ09TIGNyZWRpdCB2YWwpLgogCSAqLwogCWJueDJ4X2V0c19lM2IwX3NldF9jcmVkaXRfdXBwZXJfYm91bmRfbmlnKHBhcmFtcywgbWluX3dfdmFsX25pZyk7CiAJYm54MnhfZXRzX2UzYjBfc2V0X2NyZWRpdF91cHBlcl9ib3VuZF9wYmYocGFyYW1zLCBtaW5fd192YWxfcGJmKTsKQEAgLTExMjIsNyArMTE2MSw3IEBACiAJZm9yIChjb3NfZW50cnkgPSAwOyBjb3NfZW50cnkgPCBldHNfcGFyYW1zLT5udW1fb2ZfY29zOyBjb3NfZW50cnkrKykgewogCQlpZiAoYm54MnhfY29zX3N0YXRlX2J3ID09IGV0c19wYXJhbXMtPmNvc1tjb3NfZW50cnldLnN0YXRlKSB7CiAJCQljb3NfYndfYml0bWFwIHw9ICgxIDw8IGNvc19lbnRyeSk7Ci0JCQkvKioKKwkJCS8qCiAJCQkgKiBUaGUgZnVuY3Rpb24gYWxzbyBzZXRzIHRoZSBCVyBpbiBIVyhub3QgdGhlIG1hcHBpbgogCQkJICogeWV0KQogCQkJICovCkBAIC0xMTQ2LDcgKzExODUsNyBAQAogCQkJICAgImJueDJ4X2V0c19lM2IwX2NvbmZpZyBjb3Mgc3RhdGUgbm90IHZhbGlkXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWlmICgwICE9IGJueDJ4X3N0YXR1cykgeworCQlpZiAoYm54Mnhfc3RhdHVzKSB7CiAJCQlEUChORVRJRl9NU0dfTElOSywKIAkJCSAgICJibngyeF9ldHNfZTNiMF9jb25maWcgc2V0IGNvcyBidyBmYWlsZWRcbiIpOwogCQkJcmV0dXJuIGJueDJ4X3N0YXR1czsKQEAgLTExNTcsNyArMTE5Niw3IEBACiAJYm54Mnhfc3RhdHVzID0gYm54MnhfZXRzX2UzYjBfc3Bfc2V0X3ByaV9jbGlfcmVnKHBhcmFtcywKIAkJCQkJCQkgc3BfcHJpX3RvX2Nvcyk7CiAKLQlpZiAoMCAhPSBibngyeF9zdGF0dXMpIHsKKwlpZiAoYm54Mnhfc3RhdHVzKSB7CiAJCURQKE5FVElGX01TR19MSU5LLAogCQkgICAiYm54MnhfZXRzX0UzQjBfY29uZmlnIHNldF9wcmlfY2xpX3JlZyBmYWlsZWRcbiIpOwogCQlyZXR1cm4gYm54Mnhfc3RhdHVzOwpAQCAtMTE2OCw3ICsxMjA3LDcgQEAKIAkJCQkJICAgICAgY29zX3NwX2JpdG1hcCwKIAkJCQkJICAgICAgY29zX2J3X2JpdG1hcCk7CiAKLQlpZiAoMCAhPSBibngyeF9zdGF0dXMpIHsKKwlpZiAoYm54Mnhfc3RhdHVzKSB7CiAJCURQKE5FVElGX01TR19MSU5LLCAiYm54MnhfZXRzX0UzQjBfY29uZmlnIFNQIGZhaWxlZFxuIik7CiAJCXJldHVybiBibngyeF9zdGF0dXM7CiAJfQpAQCAtMTIzMiw5ICsxMjcxLDkgQEAKIAogCURQKE5FVElGX01TR19MSU5LLCAiRVRTIGVuYWJsZWQgQlcgbGltaXQgY29uZmlndXJhdGlvblxuIik7CiAKLQlpZiAoKDAgPT0gdG90YWxfYncpIHx8Ci0JICAgICgwID09IGNvczBfYncpIHx8Ci0JICAgICgwID09IGNvczFfYncpKSB7CisJaWYgKCghdG90YWxfYncpIHx8CisJICAgICghY29zMF9idykgfHwKKwkgICAgKCFjb3MxX2J3KSkgewogCQlEUChORVRJRl9NU0dfTElOSywgIlRvdGFsIEJXIGNhbid0IGJlIHplcm9cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMTI5MCw3ICsxMzI5LDcgQEAKIAkgKiBkYmcwLTAxMCAgICAgZGJnMS0wMDEgICAgIGNvczEtMTAwICAgICBjb3MwLTAxMSAgICAgTUNQLTAwMAogCSAqIGRiZzAtMDEwICAgICBkYmcxLTAwMSAgICAgY29zMC0wMTEgICAgIGNvczEtMTAwICAgICBNQ1AtMDAwCiAJICovCi0JdmFsID0gKDAgPT0gc3RyaWN0X2NvcykgPyAweDIzMTggOiAweDIyRTA7CisJdmFsID0gKCFzdHJpY3RfY29zKSA/IDB4MjMxOCA6IDB4MjJFMDsKIAlSRUdfV1IoYnAsIE5JR19SRUdfUDBfVFhfQVJCX1BSSU9SSVRZX0NMSUVOVCwgdmFsKTsKIAogCXJldHVybiAwOwpAQCAtMTI5OCw3ICsxMzM3LDYgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKgkJCVBGQyBzZWN0aW9uCQkJCSAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KIHN0YXRpYyB2b2lkIGJueDJ4X3VwZGF0ZV9wZmNfeG1hYyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKIAkJCQkgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsCiAJCQkJICB1OCBpc19sYikKQEAgLTE0MDEsNyArMTQzOSw3IEBACiAJaWYgKCF2YXJzLT5saW5rX3VwKQogCQlyZXR1cm47CiAKLQlpZiAoTUFDX1RZUEVfRU1BQyA9PSB2YXJzLT5tYWNfdHlwZSkgeworCWlmICh2YXJzLT5tYWNfdHlwZSA9PSBNQUNfVFlQRV9FTUFDKSB7CiAJCURQKE5FVElGX01TR19MSU5LLCAiQWJvdXQgdG8gcmVhZCBQRkMgc3RhdHMgZnJvbSBFTUFDXG4iKTsKIAkJYm54MnhfZW1hY19nZXRfcGZjX3N0YXQocGFyYW1zLCBwZmNfZnJhbWVzX3NlbnQsCiAJCQkJCXBmY19mcmFtZXNfcmVjZWl2ZWQpOwpAQCAtMTQzNSw2ICsxNDczLDE4IEBACiAKIAl1ZGVsYXkoNDApOwogfQorc3RhdGljIHU4IGJueDJ4X2lzXzRfcG9ydF9tb2RlKHN0cnVjdCBibngyeCAqYnApCit7CisJdTMyIHBvcnQ0bW9kZV9vdndyX3ZhbDsKKwkvKiBDaGVjayA0LXBvcnQgb3ZlcnJpZGUgZW5hYmxlZCAqLworCXBvcnQ0bW9kZV9vdndyX3ZhbCA9IFJFR19SRChicCwgTUlTQ19SRUdfUE9SVDRNT0RFX0VOX09WV1IpOworCWlmIChwb3J0NG1vZGVfb3Z3cl92YWwgJiAoMTw8MCkpIHsKKwkJLyogUmV0dXJuIDQtcG9ydCBtb2RlIG92ZXJyaWRlIHZhbHVlICovCisJCXJldHVybiAoKHBvcnQ0bW9kZV9vdndyX3ZhbCAmICgxPDwxKSkgPT0gKDE8PDEpKTsKKwl9CisJLyogUmV0dXJuIDQtcG9ydCBtb2RlIGZyb20gaW5wdXQgcGluICovCisJcmV0dXJuICh1OClSRUdfUkQoYnAsIE1JU0NfUkVHX1BPUlQ0TU9ERV9FTik7Cit9CiAKIHN0YXRpYyB2b2lkIGJueDJ4X2VtYWNfaW5pdChzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKIAkJCSAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQpAQCAtMTYwMSwzMSArMTY1MSwxOCBAQAogCiB9CiAKLXN0YXRpYyB1OCBibngyeF9pc180X3BvcnRfbW9kZShzdHJ1Y3QgYm54MnggKmJwKQotewotCXUzMiBwb3J0NG1vZGVfb3Z3cl92YWw7Ci0JLyogQ2hlY2sgNC1wb3J0IG92ZXJyaWRlIGVuYWJsZWQgKi8KLQlwb3J0NG1vZGVfb3Z3cl92YWwgPSBSRUdfUkQoYnAsIE1JU0NfUkVHX1BPUlQ0TU9ERV9FTl9PVldSKTsKLQlpZiAocG9ydDRtb2RlX292d3JfdmFsICYgKDE8PDApKSB7Ci0JCS8qIFJldHVybiA0LXBvcnQgbW9kZSBvdmVycmlkZSB2YWx1ZSAqLwotCQlyZXR1cm4gKChwb3J0NG1vZGVfb3Z3cl92YWwgJiAoMTw8MSkpID09ICgxPDwxKSk7Ci0JfQotCS8qIFJldHVybiA0LXBvcnQgbW9kZSBmcm9tIGlucHV0IHBpbiAqLwotCXJldHVybiAodTgpUkVHX1JEKGJwLCBNSVNDX1JFR19QT1JUNE1PREVfRU4pOwotfQotCiAvKiBEZWZpbmUgdGhlIFhNQUMgbW9kZSAqLwogc3RhdGljIHZvaWQgYm54MnhfeG1hY19pbml0KHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLCB1MzIgbWF4X3NwZWVkKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXUzMiBpc19wb3J0NG1vZGUgPSBibngyeF9pc180X3BvcnRfbW9kZShicCk7CiAKLQkvKioKLQkqIEluIDQtcG9ydCBtb2RlLCBuZWVkIHRvIHNldCB0aGUgbW9kZSBvbmx5IG9uY2UsIHNvIGlmIFhNQUMgaXMKLQkqIGFscmVhZHkgb3V0IG9mIHJlc2V0LCBpdCBtZWFucyB0aGUgbW9kZSBoYXMgYWxyZWFkeSBiZWVuIHNldCwKLQkqIGFuZCBpdCBtdXN0IG5vdCogcmVzZXQgdGhlIFhNQUMgYWdhaW4sIHNpbmNlIGl0IGNvbnRyb2xzIGJvdGgKLQkqIHBvcnRzIG9mIHRoZSBwYXRoCi0JKiovCisJLyoKKwkgKiBJbiA0LXBvcnQgbW9kZSwgbmVlZCB0byBzZXQgdGhlIG1vZGUgb25seSBvbmNlLCBzbyBpZiBYTUFDIGlzCisJICogYWxyZWFkeSBvdXQgb2YgcmVzZXQsIGl0IG1lYW5zIHRoZSBtb2RlIGhhcyBhbHJlYWR5IGJlZW4gc2V0LAorCSAqIGFuZCBpdCBtdXN0IG5vdCogcmVzZXQgdGhlIFhNQUMgYWdhaW4sIHNpbmNlIGl0IGNvbnRyb2xzIGJvdGgKKwkgKiBwb3J0cyBvZiB0aGUgcGF0aAorCSAqLwogCiAJaWYgKChDSElQX05VTShicCkgPT0gQ0hJUF9OVU1fNTc4NDApICYmCiAJICAgIChSRUdfUkQoYnAsIE1JU0NfUkVHX1JFU0VUX1JFR18yKSAmCkBAIC0xNzQzLDYgKzE3ODAsNyBAQAogCiAJcmV0dXJuIDA7CiB9CisKIHN0YXRpYyBpbnQgYm54MnhfZW1hY19lbmFibGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCiAJCQkgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMsIHU4IGxiKQogewpAQCAtMTk5OSw3ICsyMDM3LDYgQEAKIAlSRUdfV1JfRE1BRShicCwgYm1hY19hZGRyICsgQklHTUFDMl9SRUdJU1RFUl9CTUFDX0NPTlRST0wsIHdiX2RhdGEsIDIpOwogfQogCi0KIC8qIFBGQyBCUkIgaW50ZXJuYWwgcG9ydCBjb25maWd1cmF0aW9uIHBhcmFtcyAqLwogc3RydWN0IGJueDJ4X3BmY19icmJfdGhyZXNob2xkX3ZhbCB7CiAJdTMyIHBhdXNlX3hvZmY7CkBAIC0yMDA5LDYgKzIwNDYsOCBAQAogfTsKIAogc3RydWN0IGJueDJ4X3BmY19icmJfZTNiMF92YWwgeworCXUzMiBwZXJfY2xhc3NfZ3VhcmFudHlfbW9kZTsKKwl1MzIgbGJfZ3VhcmFudGllZF9oeXN0OwogCXUzMiBmdWxsX2xiX3hvZmZfdGg7CiAJdTMyIGZ1bGxfbGJfeG9uX3RocmVzaG9sZDsKIAl1MzIgbGJfZ3VhcmFudGllZDsKQEAgLTIwMjEsNiArMjA2MCw5IEBACiBzdHJ1Y3QgYm54MnhfcGZjX2JyYl90aF92YWwgewogCXN0cnVjdCBibngyeF9wZmNfYnJiX3RocmVzaG9sZF92YWwgcGF1c2VhYmxlX3RoOwogCXN0cnVjdCBibngyeF9wZmNfYnJiX3RocmVzaG9sZF92YWwgbm9uX3BhdXNlYWJsZV90aDsKKwlzdHJ1Y3QgYm54MnhfcGZjX2JyYl90aHJlc2hvbGRfdmFsIGRlZmF1bHRfY2xhc3MwOworCXN0cnVjdCBibngyeF9wZmNfYnJiX3RocmVzaG9sZF92YWwgZGVmYXVsdF9jbGFzczE7CisKIH07CiBzdGF0aWMgaW50IGJueDJ4X3BmY19icmJfZ2V0X2NvbmZpZ19wYXJhbXMoCiAJCQkJc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCkBAIC0yMDI4LDE0MCArMjA3MCwyMDAgQEAKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgUEZDIEJSQiBjb25maWd1cmF0aW9uXG4iKTsKKworCWNvbmZpZ192YWwtPmRlZmF1bHRfY2xhc3MxLnBhdXNlX3hvZmYgPSAwOworCWNvbmZpZ192YWwtPmRlZmF1bHRfY2xhc3MxLnBhdXNlX3hvbiA9IDA7CisJY29uZmlnX3ZhbC0+ZGVmYXVsdF9jbGFzczEuZnVsbF94b2ZmID0gMDsKKwljb25maWdfdmFsLT5kZWZhdWx0X2NsYXNzMS5mdWxsX3hvbiA9IDA7CisKIAlpZiAoQ0hJUF9JU19FMihicCkpIHsKKwkJLyogIGNsYXNzMCBkZWZhdWx0cyAqLworCQljb25maWdfdmFsLT5kZWZhdWx0X2NsYXNzMC5wYXVzZV94b2ZmID0KKwkJCURFRkFVTFQwX0UyX0JSQl9NQUNfUEFVU0VfWE9GRl9USFI7CisJCWNvbmZpZ192YWwtPmRlZmF1bHRfY2xhc3MwLnBhdXNlX3hvbiA9CisJCQlERUZBVUxUMF9FMl9CUkJfTUFDX1BBVVNFX1hPTl9USFI7CisJCWNvbmZpZ192YWwtPmRlZmF1bHRfY2xhc3MwLmZ1bGxfeG9mZiA9CisJCQlERUZBVUxUMF9FMl9CUkJfTUFDX0ZVTExfWE9GRl9USFI7CisJCWNvbmZpZ192YWwtPmRlZmF1bHRfY2xhc3MwLmZ1bGxfeG9uID0KKwkJCURFRkFVTFQwX0UyX0JSQl9NQUNfRlVMTF9YT05fVEhSOworCQkvKiAgcGF1c2UgYWJsZSovCiAJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5wYXVzZV94b2ZmID0KLQkJICAgIFBGQ19FMl9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX1BBVVNFOworCQkJUEZDX0UyX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfUEFVU0U7CiAJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5wYXVzZV94b24gPQotCQkgICAgUEZDX0UyX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9QQVVTRTsKKwkJCVBGQ19FMl9CUkJfTUFDX1BBVVNFX1hPTl9USFJfUEFVU0U7CiAJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5mdWxsX3hvZmYgPQotCQkgICAgUEZDX0UyX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9QQVVTRTsKKwkJCVBGQ19FMl9CUkJfTUFDX0ZVTExfWE9GRl9USFJfUEFVU0U7CiAJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5mdWxsX3hvbiA9Ci0JCSAgICBQRkNfRTJfQlJCX01BQ19GVUxMX1hPTl9USFJfUEFVU0U7CisJCQlQRkNfRTJfQlJCX01BQ19GVUxMX1hPTl9USFJfUEFVU0U7CiAJCS8qIG5vbiBwYXVzZSBhYmxlKi8KIAkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5wYXVzZV94b2ZmID0KLQkJICAgIFBGQ19FMl9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX05PTl9QQVVTRTsKKwkJCVBGQ19FMl9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX05PTl9QQVVTRTsKIAkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5wYXVzZV94b24gPQotCQkgICAgUEZDX0UyX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9OT05fUEFVU0U7CisJCQlQRkNfRTJfQlJCX01BQ19QQVVTRV9YT05fVEhSX05PTl9QQVVTRTsKIAkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5mdWxsX3hvZmYgPQotCQkgICAgUEZDX0UyX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9OT05fUEFVU0U7CisJCQlQRkNfRTJfQlJCX01BQ19GVUxMX1hPRkZfVEhSX05PTl9QQVVTRTsKIAkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5mdWxsX3hvbiA9Ci0JCSAgICBQRkNfRTJfQlJCX01BQ19GVUxMX1hPTl9USFJfTk9OX1BBVVNFOworCQkJUEZDX0UyX0JSQl9NQUNfRlVMTF9YT05fVEhSX05PTl9QQVVTRTsKIAl9IGVsc2UgaWYgKENISVBfSVNfRTNBMChicCkpIHsKKwkJLyogIGNsYXNzMCBkZWZhdWx0cyAqLworCQljb25maWdfdmFsLT5kZWZhdWx0X2NsYXNzMC5wYXVzZV94b2ZmID0KKwkJCURFRkFVTFQwX0UzQTBfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUjsKKwkJY29uZmlnX3ZhbC0+ZGVmYXVsdF9jbGFzczAucGF1c2VfeG9uID0KKwkJCURFRkFVTFQwX0UzQTBfQlJCX01BQ19QQVVTRV9YT05fVEhSOworCQljb25maWdfdmFsLT5kZWZhdWx0X2NsYXNzMC5mdWxsX3hvZmYgPQorCQkJREVGQVVMVDBfRTNBMF9CUkJfTUFDX0ZVTExfWE9GRl9USFI7CisJCWNvbmZpZ192YWwtPmRlZmF1bHRfY2xhc3MwLmZ1bGxfeG9uID0KKwkJCURFRkFVTFQwX0UzQTBfQlJCX01BQ19GVUxMX1hPTl9USFI7CisJCS8qICBwYXVzZSBhYmxlICovCiAJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5wYXVzZV94b2ZmID0KLQkJICAgIFBGQ19FM0EwX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfUEFVU0U7CisJCQlQRkNfRTNBMF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX1BBVVNFOwogCQljb25maWdfdmFsLT5wYXVzZWFibGVfdGgucGF1c2VfeG9uID0KLQkJICAgIFBGQ19FM0EwX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9QQVVTRTsKKwkJCVBGQ19FM0EwX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9QQVVTRTsKIAkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLmZ1bGxfeG9mZiA9Ci0JCSAgICBQRkNfRTNBMF9CUkJfTUFDX0ZVTExfWE9GRl9USFJfUEFVU0U7CisJCQlQRkNfRTNBMF9CUkJfTUFDX0ZVTExfWE9GRl9USFJfUEFVU0U7CiAJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5mdWxsX3hvbiA9Ci0JCSAgICBQRkNfRTNBMF9CUkJfTUFDX0ZVTExfWE9OX1RIUl9QQVVTRTsKKwkJCVBGQ19FM0EwX0JSQl9NQUNfRlVMTF9YT05fVEhSX1BBVVNFOwogCQkvKiBub24gcGF1c2UgYWJsZSovCiAJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGgucGF1c2VfeG9mZiA9Ci0JCSAgICBQRkNfRTNBMF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX05PTl9QQVVTRTsKKwkJCVBGQ19FM0EwX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfTk9OX1BBVVNFOwogCQljb25maWdfdmFsLT5ub25fcGF1c2VhYmxlX3RoLnBhdXNlX3hvbiA9Ci0JCSAgICBQRkNfRTNBMF9CUkJfTUFDX1BBVVNFX1hPTl9USFJfTk9OX1BBVVNFOworCQkJUEZDX0UzQTBfQlJCX01BQ19QQVVTRV9YT05fVEhSX05PTl9QQVVTRTsKIAkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5mdWxsX3hvZmYgPQotCQkgICAgUEZDX0UzQTBfQlJCX01BQ19GVUxMX1hPRkZfVEhSX05PTl9QQVVTRTsKKwkJCVBGQ19FM0EwX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9OT05fUEFVU0U7CiAJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGguZnVsbF94b24gPQotCQkgICAgUEZDX0UzQTBfQlJCX01BQ19GVUxMX1hPTl9USFJfTk9OX1BBVVNFOworCQkJUEZDX0UzQTBfQlJCX01BQ19GVUxMX1hPTl9USFJfTk9OX1BBVVNFOwogCX0gZWxzZSBpZiAoQ0hJUF9JU19FM0IwKGJwKSkgeworCQkvKiAgY2xhc3MwIGRlZmF1bHRzICovCisJCWNvbmZpZ192YWwtPmRlZmF1bHRfY2xhc3MwLnBhdXNlX3hvZmYgPQorCQkJREVGQVVMVDBfRTNCMF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSOworCQljb25maWdfdmFsLT5kZWZhdWx0X2NsYXNzMC5wYXVzZV94b24gPQorCQkgICAgREVGQVVMVDBfRTNCMF9CUkJfTUFDX1BBVVNFX1hPTl9USFI7CisJCWNvbmZpZ192YWwtPmRlZmF1bHRfY2xhc3MwLmZ1bGxfeG9mZiA9CisJCSAgICBERUZBVUxUMF9FM0IwX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUjsKKwkJY29uZmlnX3ZhbC0+ZGVmYXVsdF9jbGFzczAuZnVsbF94b24gPQorCQkgICAgREVGQVVMVDBfRTNCMF9CUkJfTUFDX0ZVTExfWE9OX1RIUjsKKwogCQlpZiAocGFyYW1zLT5waHlbSU5UX1BIWV0uZmxhZ3MgJgogCQkgICAgRkxBR1NfNF9QT1JUX01PREUpIHsKIAkJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5wYXVzZV94b2ZmID0KLQkJCSAgICBQRkNfRTNCMF80UF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX1BBVVNFOworCQkJCVBGQ19FM0IwXzRQX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfUEFVU0U7CiAJCQljb25maWdfdmFsLT5wYXVzZWFibGVfdGgucGF1c2VfeG9uID0KLQkJCSAgICBQRkNfRTNCMF80UF9CUkJfTUFDX1BBVVNFX1hPTl9USFJfUEFVU0U7CisJCQkJUEZDX0UzQjBfNFBfQlJCX01BQ19QQVVTRV9YT05fVEhSX1BBVVNFOwogCQkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLmZ1bGxfeG9mZiA9Ci0JCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ19GVUxMX1hPRkZfVEhSX1BBVVNFOworCQkJCVBGQ19FM0IwXzRQX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9QQVVTRTsKIAkJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5mdWxsX3hvbiA9Ci0JCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ19GVUxMX1hPTl9USFJfUEFVU0U7CisJCQkJUEZDX0UzQjBfNFBfQlJCX01BQ19GVUxMX1hPTl9USFJfUEFVU0U7CiAJCQkvKiBub24gcGF1c2UgYWJsZSovCiAJCQljb25maWdfdmFsLT5ub25fcGF1c2VhYmxlX3RoLnBhdXNlX3hvZmYgPQotCQkJICAgIFBGQ19FM0IwXzRQX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfTk9OX1BBVVNFOworCQkJUEZDX0UzQjBfNFBfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUl9OT05fUEFVU0U7CiAJCQljb25maWdfdmFsLT5ub25fcGF1c2VhYmxlX3RoLnBhdXNlX3hvbiA9Ci0JCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ19QQVVTRV9YT05fVEhSX05PTl9QQVVTRTsKKwkJCVBGQ19FM0IwXzRQX0JSQl9NQUNfUEFVU0VfWE9OX1RIUl9OT05fUEFVU0U7CiAJCQljb25maWdfdmFsLT5ub25fcGF1c2VhYmxlX3RoLmZ1bGxfeG9mZiA9Ci0JCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ19GVUxMX1hPRkZfVEhSX05PTl9QQVVTRTsKKwkJCVBGQ19FM0IwXzRQX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9OT05fUEFVU0U7CiAJCQljb25maWdfdmFsLT5ub25fcGF1c2VhYmxlX3RoLmZ1bGxfeG9uID0KLQkJCSAgICBQRkNfRTNCMF80UF9CUkJfTUFDX0ZVTExfWE9OX1RIUl9OT05fUEFVU0U7Ci0JICAgIH0gZWxzZSB7Ci0JCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5wYXVzZV94b2ZmID0KLQkJICAgIFBGQ19FM0IwXzJQX0JSQl9NQUNfUEFVU0VfWE9GRl9USFJfUEFVU0U7Ci0JCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5wYXVzZV94b24gPQotCQkgICAgUEZDX0UzQjBfMlBfQlJCX01BQ19QQVVTRV9YT05fVEhSX1BBVVNFOwotCQljb25maWdfdmFsLT5wYXVzZWFibGVfdGguZnVsbF94b2ZmID0KLQkJICAgIFBGQ19FM0IwXzJQX0JSQl9NQUNfRlVMTF9YT0ZGX1RIUl9QQVVTRTsKLQkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLmZ1bGxfeG9uID0KLQkJCVBGQ19FM0IwXzJQX0JSQl9NQUNfRlVMTF9YT05fVEhSX1BBVVNFOwotCQkvKiBub24gcGF1c2UgYWJsZSovCi0JCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGgucGF1c2VfeG9mZiA9Ci0JCSAgICBQRkNfRTNCMF8yUF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX05PTl9QQVVTRTsKLQkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5wYXVzZV94b24gPQotCQkgICAgUEZDX0UzQjBfMlBfQlJCX01BQ19QQVVTRV9YT05fVEhSX05PTl9QQVVTRTsKLQkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5mdWxsX3hvZmYgPQotCQkgICAgUEZDX0UzQjBfMlBfQlJCX01BQ19GVUxMX1hPRkZfVEhSX05PTl9QQVVTRTsKLQkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5mdWxsX3hvbiA9Ci0JCSAgICBQRkNfRTNCMF8yUF9CUkJfTUFDX0ZVTExfWE9OX1RIUl9OT05fUEFVU0U7Ci0JICAgIH0KKwkJCVBGQ19FM0IwXzRQX0JSQl9NQUNfRlVMTF9YT05fVEhSX05PTl9QQVVTRTsKKwkJfSBlbHNlIHsKKwkJCWNvbmZpZ192YWwtPnBhdXNlYWJsZV90aC5wYXVzZV94b2ZmID0KKwkJCQlQRkNfRTNCMF8yUF9CUkJfTUFDX1BBVVNFX1hPRkZfVEhSX1BBVVNFOworCQkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLnBhdXNlX3hvbiA9CisJCQkJUEZDX0UzQjBfMlBfQlJCX01BQ19QQVVTRV9YT05fVEhSX1BBVVNFOworCQkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLmZ1bGxfeG9mZiA9CisJCQkJUEZDX0UzQjBfMlBfQlJCX01BQ19GVUxMX1hPRkZfVEhSX1BBVVNFOworCQkJY29uZmlnX3ZhbC0+cGF1c2VhYmxlX3RoLmZ1bGxfeG9uID0KKwkJCQlQRkNfRTNCMF8yUF9CUkJfTUFDX0ZVTExfWE9OX1RIUl9QQVVTRTsKKwkJCS8qIG5vbiBwYXVzZSBhYmxlKi8KKwkJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGgucGF1c2VfeG9mZiA9CisJCQkJUEZDX0UzQjBfMlBfQlJCX01BQ19QQVVTRV9YT0ZGX1RIUl9OT05fUEFVU0U7CisJCQljb25maWdfdmFsLT5ub25fcGF1c2VhYmxlX3RoLnBhdXNlX3hvbiA9CisJCQkJUEZDX0UzQjBfMlBfQlJCX01BQ19QQVVTRV9YT05fVEhSX05PTl9QQVVTRTsKKwkJCWNvbmZpZ192YWwtPm5vbl9wYXVzZWFibGVfdGguZnVsbF94b2ZmID0KKwkJCQlQRkNfRTNCMF8yUF9CUkJfTUFDX0ZVTExfWE9GRl9USFJfTk9OX1BBVVNFOworCQkJY29uZmlnX3ZhbC0+bm9uX3BhdXNlYWJsZV90aC5mdWxsX3hvbiA9CisJCQkJUEZDX0UzQjBfMlBfQlJCX01BQ19GVUxMX1hPTl9USFJfTk9OX1BBVVNFOworCQl9CiAJfSBlbHNlCiAJICAgIHJldHVybiAtRUlOVkFMOwogCiAJcmV0dXJuIDA7CiB9CiAKLQotc3RhdGljIHZvaWQgYm54MnhfcGZjX2JyYl9nZXRfZTNiMF9jb25maWdfcGFyYW1zKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCQkJIHN0cnVjdCBibngyeF9wZmNfYnJiX2UzYjBfdmFsCi0JCQkJCQkgKmUzYjBfdmFsLAotCQkJCQkJIHUzMiBjb3MwX3BhdXNlYWJsZSwKLQkJCQkJCSB1MzIgY29zMV9wYXVzZWFibGUpCitzdGF0aWMgdm9pZCBibngyeF9wZmNfYnJiX2dldF9lM2IwX2NvbmZpZ19wYXJhbXMoCisJCXN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAorCQlzdHJ1Y3QgYm54MnhfcGZjX2JyYl9lM2IwX3ZhbAorCQkqZTNiMF92YWwsCisJCXN0cnVjdCBibngyeF9uaWdfYnJiX3BmY19wb3J0X3BhcmFtcyAqcGZjX3BhcmFtcywKKwkJY29uc3QgdTggcGZjX2VuYWJsZWQpCiB7Ci0JaWYgKHBhcmFtcy0+cGh5W0lOVF9QSFldLmZsYWdzICYgRkxBR1NfNF9QT1JUX01PREUpIHsKLQkJZTNiMF92YWwtPmZ1bGxfbGJfeG9mZl90aCA9Ci0JCSAgICBQRkNfRTNCMF80UF9CUkJfRlVMTF9MQl9YT0ZGX1RIUjsKLQkJZTNiMF92YWwtPmZ1bGxfbGJfeG9uX3RocmVzaG9sZCA9Ci0JCSAgICBQRkNfRTNCMF80UF9CUkJfRlVMTF9MQl9YT05fVEhSOwotCQllM2IwX3ZhbC0+bGJfZ3VhcmFudGllZCA9Ci0JCSAgICBQRkNfRTNCMF80UF9MQl9HVUFSVDsKLQkJZTNiMF92YWwtPm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZCA9Ci0JCSAgICBQRkNfRTNCMF80UF9CUkJfTUFDXzBfQ0xBU1NfVF9HVUFSVDsKLQkJZTNiMF92YWwtPm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0ID0KLQkJICAgIFBGQ19FM0IwXzRQX0JSQl9NQUNfMF9DTEFTU19UX0dVQVJUX0hZU1Q7Ci0JCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWQgPQotCQkgICAgUEZDX0UzQjBfNFBfQlJCX01BQ18xX0NMQVNTX1RfR1VBUlQ7Ci0JCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCA9Ci0JCSAgICBQRkNfRTNCMF80UF9CUkJfTUFDXzFfQ0xBU1NfVF9HVUFSVF9IWVNUOwotCX0gZWxzZSB7Ci0JCWUzYjBfdmFsLT5mdWxsX2xiX3hvZmZfdGggPQotCQkgICAgUEZDX0UzQjBfMlBfQlJCX0ZVTExfTEJfWE9GRl9USFI7Ci0JCWUzYjBfdmFsLT5mdWxsX2xiX3hvbl90aHJlc2hvbGQgPQotCQkgICAgUEZDX0UzQjBfMlBfQlJCX0ZVTExfTEJfWE9OX1RIUjsKLQkJZTNiMF92YWwtPm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0ID0KLQkJICAgIFBGQ19FM0IwXzJQX0JSQl9NQUNfMF9DTEFTU19UX0dVQVJUX0hZU1Q7Ci0JCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWQgPQotCQkgICAgUEZDX0UzQjBfMlBfQlJCX01BQ18xX0NMQVNTX1RfR1VBUlQ7Ci0JCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCA9Ci0JCSAgICBQRkNfRTNCMF8yUF9CUkJfTUFDXzFfQ0xBU1NfVF9HVUFSVF9IWVNUOworCWlmIChwZmNfZW5hYmxlZCAmJiBwZmNfcGFyYW1zKSB7CisJCWUzYjBfdmFsLT5wZXJfY2xhc3NfZ3VhcmFudHlfbW9kZSA9IDE7CisJCWUzYjBfdmFsLT5sYl9ndWFyYW50aWVkX2h5c3QgPSA4MDsKIAotCQlpZiAoY29zMF9wYXVzZWFibGUgIT0gY29zMV9wYXVzZWFibGUpIHsKLQkJCS8qIG5vbnBhdXNlYWJsZT0gTG9zc3kgKyBwYXVzZWFibGUgPSBMb3NzbGVzcyovCisJCWlmIChwYXJhbXMtPnBoeVtJTlRfUEhZXS5mbGFncyAmCisJCSAgICBGTEFHU180X1BPUlRfTU9ERSkgeworCQkJZTNiMF92YWwtPmZ1bGxfbGJfeG9mZl90aCA9CisJCQkJUEZDX0UzQjBfNFBfQlJCX0ZVTExfTEJfWE9GRl9USFI7CisJCQllM2IwX3ZhbC0+ZnVsbF9sYl94b25fdGhyZXNob2xkID0KKwkJCQlQRkNfRTNCMF80UF9CUkJfRlVMTF9MQl9YT05fVEhSOwogCQkJZTNiMF92YWwtPmxiX2d1YXJhbnRpZWQgPQotCQkJICAgIFBGQ19FM0IwXzJQX01JWF9QQVVTRV9MQl9HVUFSVDsKKwkJCQlQRkNfRTNCMF80UF9MQl9HVUFSVDsKIAkJCWUzYjBfdmFsLT5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWQgPQotCQkJICAgIFBGQ19FM0IwXzJQX01JWF9QQVVTRV9NQUNfMF9DTEFTU19UX0dVQVJUOwotCQl9IGVsc2UgaWYgKGNvczBfcGF1c2VhYmxlKSB7Ci0JCQkvKiBMb3NzbGVzcyArTG9zc2xlc3MqLwotCQkJZTNiMF92YWwtPmxiX2d1YXJhbnRpZWQgPQotCQkJICAgIFBGQ19FM0IwXzJQX1BBVVNFX0xCX0dVQVJUOwotCQkJZTNiMF92YWwtPm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZCA9Ci0JCQkgICAgUEZDX0UzQjBfMlBfUEFVU0VfTUFDXzBfQ0xBU1NfVF9HVUFSVDsKKwkJCQlQRkNfRTNCMF80UF9CUkJfTUFDXzBfQ0xBU1NfVF9HVUFSVDsKKwkJCWUzYjBfdmFsLT5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCA9CisJCQkJUEZDX0UzQjBfNFBfQlJCX01BQ18wX0NMQVNTX1RfR1VBUlRfSFlTVDsKKwkJCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWQgPQorCQkJCVBGQ19FM0IwXzRQX0JSQl9NQUNfMV9DTEFTU19UX0dVQVJUOworCQkJZTNiMF92YWwtPm1hY18xX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0ID0KKwkJCQlQRkNfRTNCMF80UF9CUkJfTUFDXzFfQ0xBU1NfVF9HVUFSVF9IWVNUOwogCQl9IGVsc2UgewotCQkJLyogTG9zc3kgK0xvc3N5Ki8KLQkJCWUzYjBfdmFsLT5sYl9ndWFyYW50aWVkID0KLQkJCSAgICBQRkNfRTNCMF8yUF9OT05fUEFVU0VfTEJfR1VBUlQ7Ci0JCQllM2IwX3ZhbC0+bWFjXzBfY2xhc3NfdF9ndWFyYW50aWVkID0KLQkJCSAgICBQRkNfRTNCMF8yUF9OT05fUEFVU0VfTUFDXzBfQ0xBU1NfVF9HVUFSVDsKKwkJCWUzYjBfdmFsLT5mdWxsX2xiX3hvZmZfdGggPQorCQkJCVBGQ19FM0IwXzJQX0JSQl9GVUxMX0xCX1hPRkZfVEhSOworCQkJZTNiMF92YWwtPmZ1bGxfbGJfeG9uX3RocmVzaG9sZCA9CisJCQkJUEZDX0UzQjBfMlBfQlJCX0ZVTExfTEJfWE9OX1RIUjsKKwkJCWUzYjBfdmFsLT5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCA9CisJCQkJUEZDX0UzQjBfMlBfQlJCX01BQ18wX0NMQVNTX1RfR1VBUlRfSFlTVDsKKwkJCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWQgPQorCQkJCVBGQ19FM0IwXzJQX0JSQl9NQUNfMV9DTEFTU19UX0dVQVJUOworCQkJZTNiMF92YWwtPm1hY18xX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0ID0KKwkJCQlQRkNfRTNCMF8yUF9CUkJfTUFDXzFfQ0xBU1NfVF9HVUFSVF9IWVNUOworCisJCQlpZiAocGZjX3BhcmFtcy0+Y29zMF9wYXVzZWFibGUgIT0KKwkJCQlwZmNfcGFyYW1zLT5jb3MxX3BhdXNlYWJsZSkgeworCQkJCS8qIG5vbnBhdXNlYWJsZT0gTG9zc3kgKyBwYXVzZWFibGUgPSBMb3NzbGVzcyovCisJCQkJZTNiMF92YWwtPmxiX2d1YXJhbnRpZWQgPQorCQkJCQlQRkNfRTNCMF8yUF9NSVhfUEFVU0VfTEJfR1VBUlQ7CisJCQkJZTNiMF92YWwtPm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZCA9CisJCQkgICAgICAgUEZDX0UzQjBfMlBfTUlYX1BBVVNFX01BQ18wX0NMQVNTX1RfR1VBUlQ7CisJCQl9IGVsc2UgaWYgKHBmY19wYXJhbXMtPmNvczBfcGF1c2VhYmxlKSB7CisJCQkJLyogTG9zc2xlc3MgK0xvc3NsZXNzKi8KKwkJCQllM2IwX3ZhbC0+bGJfZ3VhcmFudGllZCA9CisJCQkJCVBGQ19FM0IwXzJQX1BBVVNFX0xCX0dVQVJUOworCQkJCWUzYjBfdmFsLT5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWQgPQorCQkJCSAgIFBGQ19FM0IwXzJQX1BBVVNFX01BQ18wX0NMQVNTX1RfR1VBUlQ7CisJCQl9IGVsc2UgeworCQkJCS8qIExvc3N5ICtMb3NzeSovCisJCQkJZTNiMF92YWwtPmxiX2d1YXJhbnRpZWQgPQorCQkJCQlQRkNfRTNCMF8yUF9OT05fUEFVU0VfTEJfR1VBUlQ7CisJCQkJZTNiMF92YWwtPm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZCA9CisJCQkgICAgICAgUEZDX0UzQjBfMlBfTk9OX1BBVVNFX01BQ18wX0NMQVNTX1RfR1VBUlQ7CisJCQl9CiAJCX0KKwl9IGVsc2UgeworCQllM2IwX3ZhbC0+cGVyX2NsYXNzX2d1YXJhbnR5X21vZGUgPSAwOworCQllM2IwX3ZhbC0+bGJfZ3VhcmFudGllZF9oeXN0ID0gMDsKKwkJZTNiMF92YWwtPmZ1bGxfbGJfeG9mZl90aCA9CisJCQlERUZBVUxUX0UzQjBfQlJCX0ZVTExfTEJfWE9GRl9USFI7CisJCWUzYjBfdmFsLT5mdWxsX2xiX3hvbl90aHJlc2hvbGQgPQorCQkJREVGQVVMVF9FM0IwX0JSQl9GVUxMX0xCX1hPTl9USFI7CisJCWUzYjBfdmFsLT5sYl9ndWFyYW50aWVkID0KKwkJCURFRkFVTFRfRTNCMF9MQl9HVUFSVDsKKwkJZTNiMF92YWwtPm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZCA9CisJCQlERUZBVUxUX0UzQjBfQlJCX01BQ18wX0NMQVNTX1RfR1VBUlQ7CisJCWUzYjBfdmFsLT5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCA9CisJCQlERUZBVUxUX0UzQjBfQlJCX01BQ18wX0NMQVNTX1RfR1VBUlRfSFlTVDsKKwkJZTNiMF92YWwtPm1hY18xX2NsYXNzX3RfZ3VhcmFudGllZCA9CisJCQlERUZBVUxUX0UzQjBfQlJCX01BQ18xX0NMQVNTX1RfR1VBUlQ7CisJCWUzYjBfdmFsLT5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCA9CisJCQlERUZBVUxUX0UzQjBfQlJCX01BQ18xX0NMQVNTX1RfR1VBUlRfSFlTVDsKIAl9CiB9CiBzdGF0aWMgaW50IGJueDJ4X3VwZGF0ZV9wZmNfYnJiKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLApAQCAtMjE3MiwyMyArMjI3NCwyOCBAQAogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXN0cnVjdCBibngyeF9wZmNfYnJiX3RoX3ZhbCBjb25maWdfdmFsID0geyB7MH0gfTsKIAlzdHJ1Y3QgYm54MnhfcGZjX2JyYl90aHJlc2hvbGRfdmFsICpyZWdfdGhfY29uZmlnID0KLQkgICAgJmNvbmZpZ192YWwucGF1c2VhYmxlX3RoOworCQkmY29uZmlnX3ZhbC5wYXVzZWFibGVfdGg7CiAJc3RydWN0IGJueDJ4X3BmY19icmJfZTNiMF92YWwgZTNiMF92YWwgPSB7MH07Ci0JaW50IHNldF9wZmMgPSBwYXJhbXMtPmZlYXR1cmVfY29uZmlnX2ZsYWdzICYKKwljb25zdCBpbnQgc2V0X3BmYyA9IHBhcmFtcy0+ZmVhdHVyZV9jb25maWdfZmxhZ3MgJgogCQlGRUFUVVJFX0NPTkZJR19QRkNfRU5BQkxFRDsKKwljb25zdCB1OCBwZmNfZW5hYmxlZCA9IChzZXRfcGZjICYmIHBmY19wYXJhbXMpOwogCWludCBibngyeF9zdGF0dXMgPSAwOwogCXU4IHBvcnQgPSBwYXJhbXMtPnBvcnQ7CiAKIAkvKiBkZWZhdWx0IC0gcGF1c2UgY29uZmlndXJhdGlvbiAqLwogCXJlZ190aF9jb25maWcgPSAmY29uZmlnX3ZhbC5wYXVzZWFibGVfdGg7CiAJYm54Mnhfc3RhdHVzID0gYm54MnhfcGZjX2JyYl9nZXRfY29uZmlnX3BhcmFtcyhwYXJhbXMsICZjb25maWdfdmFsKTsKLQlpZiAoMCAhPSBibngyeF9zdGF0dXMpCisJaWYgKGJueDJ4X3N0YXR1cykKIAkJcmV0dXJuIGJueDJ4X3N0YXR1czsKIAotCWlmIChzZXRfcGZjICYmIHBmY19wYXJhbXMpCisJaWYgKHBmY19lbmFibGVkKSB7CiAJCS8qIEZpcnN0IENPUyAqLwotCQlpZiAoIXBmY19wYXJhbXMtPmNvczBfcGF1c2VhYmxlKQorCQlpZiAocGZjX3BhcmFtcy0+Y29zMF9wYXVzZWFibGUpCisJCQlyZWdfdGhfY29uZmlnID0gJmNvbmZpZ192YWwucGF1c2VhYmxlX3RoOworCQllbHNlCiAJCQlyZWdfdGhfY29uZmlnID0gJmNvbmZpZ192YWwubm9uX3BhdXNlYWJsZV90aDsKKwl9IGVsc2UKKwkJcmVnX3RoX2NvbmZpZyA9ICZjb25maWdfdmFsLmRlZmF1bHRfY2xhc3MwOwogCS8qCiAJICogVGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBiZWxvdyB3aGljaCB0aGUgcGF1c2Ugc2lnbmFsIHRvIGNsYXNzIDAKIAkgKiBvZiBNQUMgI24gaXMgYXNzZXJ0ZWQuIG49MCwxCkBAIC0yMjE1LDEyMiArMjMyMiwxMTkgQEAKIAlSRUdfV1IoYnAsIChwb3J0KSA/IEJSQjFfUkVHX0ZVTExfMF9YT05fVEhSRVNIT0xEXzEgOgogCSAgICAgICBCUkIxX1JFR19GVUxMXzBfWE9OX1RIUkVTSE9MRF8wICwgcmVnX3RoX2NvbmZpZy0+ZnVsbF94b24pOwogCi0JaWYgKHNldF9wZmMgJiYgcGZjX3BhcmFtcykgeworCWlmIChwZmNfZW5hYmxlZCkgewogCQkvKiBTZWNvbmQgQ09TICovCiAJCWlmIChwZmNfcGFyYW1zLT5jb3MxX3BhdXNlYWJsZSkKIAkJCXJlZ190aF9jb25maWcgPSAmY29uZmlnX3ZhbC5wYXVzZWFibGVfdGg7CiAJCWVsc2UKIAkJCXJlZ190aF9jb25maWcgPSAmY29uZmlnX3ZhbC5ub25fcGF1c2VhYmxlX3RoOworCX0gZWxzZQorCQlyZWdfdGhfY29uZmlnID0gJmNvbmZpZ192YWwuZGVmYXVsdF9jbGFzczE7CisJLyoKKwkgKiBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGJlbG93IHdoaWNoIHRoZSBwYXVzZSBzaWduYWwgdG8KKwkgKiBjbGFzcyAxIG9mIE1BQyAjbiBpcyBhc3NlcnRlZC4gbj0wLDEKKwkgKi8KKwlSRUdfV1IoYnAsIChwb3J0KSA/IEJSQjFfUkVHX1BBVVNFXzFfWE9GRl9USFJFU0hPTERfMSA6CisJICAgICAgIEJSQjFfUkVHX1BBVVNFXzFfWE9GRl9USFJFU0hPTERfMCwKKwkgICAgICAgcmVnX3RoX2NvbmZpZy0+cGF1c2VfeG9mZik7CisKKwkvKgorCSAqIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIHBhdXNlIHNpZ25hbCB0bworCSAqIGNsYXNzIDEgb2YgTUFDICNuIGlzIGRlLWFzc2VydGVkLiBuPTAsMQorCSAqLworCVJFR19XUihicCwgKHBvcnQpID8gQlJCMV9SRUdfUEFVU0VfMV9YT05fVEhSRVNIT0xEXzEgOgorCSAgICAgICBCUkIxX1JFR19QQVVTRV8xX1hPTl9USFJFU0hPTERfMCwKKwkgICAgICAgcmVnX3RoX2NvbmZpZy0+cGF1c2VfeG9uKTsKKwkvKgorCSAqIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYmVsb3cgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvCisJICogY2xhc3MgMSBvZiBNQUMgI24gaXMgYXNzZXJ0ZWQuIG49MCwxCisJICovCisJUkVHX1dSKGJwLCAocG9ydCkgPyBCUkIxX1JFR19GVUxMXzFfWE9GRl9USFJFU0hPTERfMSA6CisJICAgICAgIEJSQjFfUkVHX0ZVTExfMV9YT0ZGX1RIUkVTSE9MRF8wLAorCSAgICAgICByZWdfdGhfY29uZmlnLT5mdWxsX3hvZmYpOworCS8qCisJICogVGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBhYm92ZSB3aGljaCB0aGUgZnVsbCBzaWduYWwgdG8KKwkgKiBjbGFzcyAxIG9mIE1BQyAjbiBpcyBkZS1hc3NlcnRlZC4gbj0wLDEKKwkgKi8KKwlSRUdfV1IoYnAsIChwb3J0KSA/IEJSQjFfUkVHX0ZVTExfMV9YT05fVEhSRVNIT0xEXzEgOgorCSAgICAgICBCUkIxX1JFR19GVUxMXzFfWE9OX1RIUkVTSE9MRF8wLAorCSAgICAgICByZWdfdGhfY29uZmlnLT5mdWxsX3hvbik7CisKKwlpZiAoQ0hJUF9JU19FM0IwKGJwKSkgeworCQlibngyeF9wZmNfYnJiX2dldF9lM2IwX2NvbmZpZ19wYXJhbXMoCisJCQlwYXJhbXMsCisJCQkmZTNiMF92YWwsCisJCQlwZmNfcGFyYW1zLAorCQkJcGZjX2VuYWJsZWQpOworCisJCVJFR19XUihicCwgQlJCMV9SRUdfUEVSX0NMQVNTX0dVQVJBTlRZX01PREUsCisJCQkgICBlM2IwX3ZhbC5wZXJfY2xhc3NfZ3VhcmFudHlfbW9kZSk7CisKIAkJLyoKLQkJICogVGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBiZWxvdyB3aGljaCB0aGUgcGF1c2Ugc2lnbmFsIHRvCi0JCSAqIGNsYXNzIDEgb2YgTUFDICNuIGlzIGFzc2VydGVkLiBuPTAsMQotCQkqKi8KLQkJUkVHX1dSKGJwLCAocG9ydCkgPyBCUkIxX1JFR19QQVVTRV8xX1hPRkZfVEhSRVNIT0xEXzEgOgotCQkgICAgICAgQlJCMV9SRUdfUEFVU0VfMV9YT0ZGX1RIUkVTSE9MRF8wLAotCQkgICAgICAgcmVnX3RoX2NvbmZpZy0+cGF1c2VfeG9mZik7Ci0JCS8qCi0JCSAqIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIHBhdXNlIHNpZ25hbCB0bwotCQkgKiBjbGFzcyAxIG9mIE1BQyAjbiBpcyBkZS1hc3NlcnRlZC4gbj0wLDEKKwkJICogVGhlIGh5c3RlcmVzaXMgb24gdGhlIGd1YXJhbnRpZWQgYnVmZmVyIHNwYWNlIGZvciB0aGUgTGIKKwkJICogcG9ydCBiZWZvcmUgc2lnbmFsaW5nIFhPTi4KIAkJICovCi0JCVJFR19XUihicCwgKHBvcnQpID8gQlJCMV9SRUdfUEFVU0VfMV9YT05fVEhSRVNIT0xEXzEgOgotCQkgICAgICAgQlJCMV9SRUdfUEFVU0VfMV9YT05fVEhSRVNIT0xEXzAsCi0JCSAgICAgICByZWdfdGhfY29uZmlnLT5wYXVzZV94b24pOworCQlSRUdfV1IoYnAsIEJSQjFfUkVHX0xCX0dVQVJBTlRJRURfSFlTVCwKKwkJCSAgIGUzYjBfdmFsLmxiX2d1YXJhbnRpZWRfaHlzdCk7CisKIAkJLyoKLQkJICogVGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBiZWxvdyB3aGljaCB0aGUgZnVsbCBzaWduYWwgdG8KLQkJICogY2xhc3MgMSBvZiBNQUMgI24gaXMgYXNzZXJ0ZWQuIG49MCwxCisJCSAqIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYmVsb3cgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvIHRoZQorCQkgKiBMQiBwb3J0IGlzIGFzc2VydGVkLgogCQkgKi8KLQkJUkVHX1dSKGJwLCAocG9ydCkgPyBCUkIxX1JFR19GVUxMXzFfWE9GRl9USFJFU0hPTERfMSA6Ci0JCSAgICAgICBCUkIxX1JFR19GVUxMXzFfWE9GRl9USFJFU0hPTERfMCwKLQkJICAgICAgIHJlZ190aF9jb25maWctPmZ1bGxfeG9mZik7CisJCVJFR19XUihicCwgQlJCMV9SRUdfRlVMTF9MQl9YT0ZGX1RIUkVTSE9MRCwKKwkJICAgICAgIGUzYjBfdmFsLmZ1bGxfbGJfeG9mZl90aCk7CiAJCS8qCi0JCSAqIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYWJvdmUgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvCi0JCSAqIGNsYXNzIDEgb2YgTUFDICNuIGlzIGRlLWFzc2VydGVkLiBuPTAsMQorCQkgKiBUaGUgbnVtYmVyIG9mIGZyZWUgYmxvY2tzIGFib3ZlIHdoaWNoIHRoZSBmdWxsIHNpZ25hbCB0byB0aGUKKwkJICogTEIgcG9ydCBpcyBkZS1hc3NlcnRlZC4KIAkJICovCi0JCVJFR19XUihicCwgKHBvcnQpID8gQlJCMV9SRUdfRlVMTF8xX1hPTl9USFJFU0hPTERfMSA6Ci0JCSAgICAgICBCUkIxX1JFR19GVUxMXzFfWE9OX1RIUkVTSE9MRF8wLAotCQkgICAgICAgcmVnX3RoX2NvbmZpZy0+ZnVsbF94b24pOworCQlSRUdfV1IoYnAsIEJSQjFfUkVHX0ZVTExfTEJfWE9OX1RIUkVTSE9MRCwKKwkJICAgICAgIGUzYjBfdmFsLmZ1bGxfbGJfeG9uX3RocmVzaG9sZCk7CisJCS8qCisJCSAqIFRoZSBudW1iZXIgb2YgYmxvY2tzIGd1YXJhbnRpZWQgZm9yIHRoZSBNQUMgI24gcG9ydC4gbj0wLDEKKwkJICovCiAKKwkJLyogVGhlIG51bWJlciBvZiBibG9ja3MgZ3VhcmFudGllZCBmb3IgdGhlIExCIHBvcnQuKi8KKwkJUkVHX1dSKGJwLCBCUkIxX1JFR19MQl9HVUFSQU5USUVELAorCQkgICAgICAgZTNiMF92YWwubGJfZ3VhcmFudGllZCk7CiAKLQkJaWYgKENISVBfSVNfRTNCMChicCkpIHsKLQkJCS8qU2hvdWxkIGJlIGRvbmUgYnkgaW5pdCB0b29sICovCi0JCQkvKgotCQkJKiBCUkJfZW1wdHlfZm9yX2R1cCA9IEJSQjFfUkVHX0JSQl9FTVBUWV9USFJFU0hPTEQKLQkJCSogcmVzZXQgdmFsdWUKLQkJCSogOTQ0Ci0JCQkqLworCQkvKgorCQkgKiBUaGUgbnVtYmVyIG9mIGJsb2NrcyBndWFyYW50aWVkIGZvciB0aGUgTUFDICNuIHBvcnQuCisJCSAqLworCQlSRUdfV1IoYnAsIEJSQjFfUkVHX01BQ19HVUFSQU5USUVEXzAsCisJCSAgICAgICAyICogZTNiMF92YWwubWFjXzBfY2xhc3NfdF9ndWFyYW50aWVkKTsKKwkJUkVHX1dSKGJwLCBCUkIxX1JFR19NQUNfR1VBUkFOVElFRF8xLAorCQkgICAgICAgMiAqIGUzYjBfdmFsLm1hY18xX2NsYXNzX3RfZ3VhcmFudGllZCk7CisJCS8qCisJCSAqIFRoZSBudW1iZXIgb2YgYmxvY2tzIGd1YXJhbnRpZWQgZm9yIGNsYXNzICN0IGluIE1BQzAuIHQ9MCwxCisJCSAqLworCQlSRUdfV1IoYnAsIEJSQjFfUkVHX01BQ18wX0NMQVNTXzBfR1VBUkFOVElFRCwKKwkJICAgICAgIGUzYjBfdmFsLm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZCk7CisJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzBfQ0xBU1NfMV9HVUFSQU5USUVELAorCQkgICAgICAgZTNiMF92YWwubWFjXzBfY2xhc3NfdF9ndWFyYW50aWVkKTsKKwkJLyoKKwkJICogVGhlIGh5c3RlcmVzaXMgb24gdGhlIGd1YXJhbnRpZWQgYnVmZmVyIHNwYWNlIGZvciBjbGFzcyBpbgorCQkgKiBNQUMwLiAgdD0wLDEKKwkJICovCisJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzBfQ0xBU1NfMF9HVUFSQU5USUVEX0hZU1QsCisJCSAgICAgICBlM2IwX3ZhbC5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCk7CisJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzBfQ0xBU1NfMV9HVUFSQU5USUVEX0hZU1QsCisJCSAgICAgICBlM2IwX3ZhbC5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCk7CiAKLQkJCS8qKgotCQkJICogVGhlIGh5c3RlcmVzaXMgb24gdGhlIGd1YXJhbnRpZWQgYnVmZmVyIHNwYWNlIGZvciB0aGUgTGIgcG9ydAotCQkJICogYmVmb3JlIHNpZ25hbGluZyBYT04uCi0JCQkgKiovCi0JCQlSRUdfV1IoYnAsIEJSQjFfUkVHX0xCX0dVQVJBTlRJRURfSFlTVCwgODApOwotCi0JCQlibngyeF9wZmNfYnJiX2dldF9lM2IwX2NvbmZpZ19wYXJhbXMoCi0JCQkgICAgcGFyYW1zLAotCQkJICAgICZlM2IwX3ZhbCwKLQkJCSAgICBwZmNfcGFyYW1zLT5jb3MwX3BhdXNlYWJsZSwKLQkJCSAgICBwZmNfcGFyYW1zLT5jb3MxX3BhdXNlYWJsZSk7Ci0JCQkvKioKLQkJCSAqIFRoZSBudW1iZXIgb2YgZnJlZSBibG9ja3MgYmVsb3cgd2hpY2ggdGhlIGZ1bGwgc2lnbmFsIHRvIHRoZQotCQkJICogTEIgcG9ydCBpcyBhc3NlcnRlZC4KLQkJCSovCi0JCQlSRUdfV1IoYnAsIEJSQjFfUkVHX0ZVTExfTEJfWE9GRl9USFJFU0hPTEQsCi0JCQkJICAgZTNiMF92YWwuZnVsbF9sYl94b2ZmX3RoKTsKLQkJCS8qKgotCQkJICogVGhlIG51bWJlciBvZiBmcmVlIGJsb2NrcyBhYm92ZSB3aGljaCB0aGUgZnVsbCBzaWduYWwgdG8gdGhlCi0JCQkgKiBMQiBwb3J0IGlzIGRlLWFzc2VydGVkLgotCQkJKi8KLQkJCVJFR19XUihicCwgQlJCMV9SRUdfRlVMTF9MQl9YT05fVEhSRVNIT0xELAotCQkJCSAgIGUzYjBfdmFsLmZ1bGxfbGJfeG9uX3RocmVzaG9sZCk7Ci0JCQkvKioKLQkJCSogVGhlIG51bWJlciBvZiBibG9ja3MgZ3VhcmFudGllZCBmb3IgdGhlIE1BQyAjbiBwb3J0LiBuPTAsMQotCQkJKi8KLQotCQkJLypUaGUgbnVtYmVyIG9mIGJsb2NrcyBndWFyYW50aWVkIGZvciB0aGUgTEIgcG9ydC4qLwotCQkJUkVHX1dSKGJwLCBCUkIxX1JFR19MQl9HVUFSQU5USUVELAotCQkJICAgICAgIGUzYjBfdmFsLmxiX2d1YXJhbnRpZWQpOwotCi0JCQkvKioKLQkJCSAqIFRoZSBudW1iZXIgb2YgYmxvY2tzIGd1YXJhbnRpZWQgZm9yIHRoZSBNQUMgI24gcG9ydC4KLQkJCSovCi0JCQlSRUdfV1IoYnAsIEJSQjFfUkVHX01BQ19HVUFSQU5USUVEXzAsCi0JCQkJICAgMiAqIGUzYjBfdmFsLm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZCk7Ci0JCQlSRUdfV1IoYnAsIEJSQjFfUkVHX01BQ19HVUFSQU5USUVEXzEsCi0JCQkJICAgMiAqIGUzYjBfdmFsLm1hY18xX2NsYXNzX3RfZ3VhcmFudGllZCk7Ci0JCQkvKioKLQkJCSAqIFRoZSBudW1iZXIgb2YgYmxvY2tzIGd1YXJhbnRpZWQgZm9yIGNsYXNzICN0IGluIE1BQzAuIHQ9MCwxCi0JCQkqLwotCQkJUkVHX1dSKGJwLCBCUkIxX1JFR19NQUNfMF9DTEFTU18wX0dVQVJBTlRJRUQsCi0JCQkgICAgICAgZTNiMF92YWwubWFjXzBfY2xhc3NfdF9ndWFyYW50aWVkKTsKLQkJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzBfQ0xBU1NfMV9HVUFSQU5USUVELAotCQkJICAgICAgIGUzYjBfdmFsLm1hY18wX2NsYXNzX3RfZ3VhcmFudGllZCk7Ci0JCQkvKioKLQkJCSAqIFRoZSBoeXN0ZXJlc2lzIG9uIHRoZSBndWFyYW50aWVkIGJ1ZmZlciBzcGFjZSBmb3IgY2xhc3MgaW4KLQkJCSAqIE1BQzAuICB0PTAsMQotCQkJKi8KLQkJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzBfQ0xBU1NfMF9HVUFSQU5USUVEX0hZU1QsCi0JCQkgICAgICAgZTNiMF92YWwubWFjXzBfY2xhc3NfdF9ndWFyYW50aWVkX2h5c3QpOwotCQkJUkVHX1dSKGJwLCBCUkIxX1JFR19NQUNfMF9DTEFTU18xX0dVQVJBTlRJRURfSFlTVCwKLQkJCSAgICAgICBlM2IwX3ZhbC5tYWNfMF9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCk7Ci0KLQkJCS8qKgotCQkJICogVGhlIG51bWJlciBvZiBibG9ja3MgZ3VhcmFudGllZCBmb3IgY2xhc3MgI3QgaW4gTUFDMS50PTAsMQotCQkJKi8KLQkJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzFfQ0xBU1NfMF9HVUFSQU5USUVELAotCQkJICAgICAgIGUzYjBfdmFsLm1hY18xX2NsYXNzX3RfZ3VhcmFudGllZCk7Ci0JCQlSRUdfV1IoYnAsIEJSQjFfUkVHX01BQ18xX0NMQVNTXzFfR1VBUkFOVElFRCwKLQkJCSAgICAgICBlM2IwX3ZhbC5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWQpOwotCQkJLyoqCi0JCQkgKiBUaGUgaHlzdGVyZXNpcyBvbiB0aGUgZ3VhcmFudGllZCBidWZmZXIgc3BhY2UgZm9yIGNsYXNzICN0Ci0JCQkqIGluIE1BQzEuICB0PTAsMQotCQkJKi8KLQkJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzFfQ0xBU1NfMF9HVUFSQU5USUVEX0hZU1QsCi0JCQkgICAgICAgZTNiMF92YWwubWFjXzFfY2xhc3NfdF9ndWFyYW50aWVkX2h5c3QpOwotCQkJUkVHX1dSKGJwLCBCUkIxX1JFR19NQUNfMV9DTEFTU18xX0dVQVJBTlRJRURfSFlTVCwKLQkJCSAgICAgICBlM2IwX3ZhbC5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWRfaHlzdCk7Ci0KLQkgICAgfQotCisJCS8qCisJCSAqIFRoZSBudW1iZXIgb2YgYmxvY2tzIGd1YXJhbnRpZWQgZm9yIGNsYXNzICN0IGluIE1BQzEudD0wLDEKKwkJICovCisJCVJFR19XUihicCwgQlJCMV9SRUdfTUFDXzFfQ0xBU1NfMF9HVUFSQU5USUVELAorCQkgICAgICAgZTNiMF92YWwubWFjXzFfY2xhc3NfdF9ndWFyYW50aWVkKTsKKwkJUkVHX1dSKGJwLCBCUkIxX1JFR19NQUNfMV9DTEFTU18xX0dVQVJBTlRJRUQsCisJCSAgICAgICBlM2IwX3ZhbC5tYWNfMV9jbGFzc190X2d1YXJhbnRpZWQpOworCQkvKgorCQkgKiBUaGUgaHlzdGVyZXNpcyBvbiB0aGUgZ3VhcmFudGllZCBidWZmZXIgc3BhY2UgZm9yIGNsYXNzICN0CisJCSAqIGluIE1BQzEuICB0PTAsMQorCQkgKi8KKwkJUkVHX1dSKGJwLCBCUkIxX1JFR19NQUNfMV9DTEFTU18wX0dVQVJBTlRJRURfSFlTVCwKKwkJICAgICAgIGUzYjBfdmFsLm1hY18xX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0KTsKKwkJUkVHX1dSKGJwLCBCUkIxX1JFR19NQUNfMV9DTEFTU18xX0dVQVJBTlRJRURfSFlTVCwKKwkJICAgICAgIGUzYjBfdmFsLm1hY18xX2NsYXNzX3RfZ3VhcmFudGllZF9oeXN0KTsKIAl9CiAKIAlyZXR1cm4gYm54Mnhfc3RhdHVzOwpAQCAtMjUxNSw3ICsyNjE5LDcgQEAKIAogCS8qIHVwZGF0ZSBCUkIgcGFyYW1zICovCiAJYm54Mnhfc3RhdHVzID0gYm54MnhfdXBkYXRlX3BmY19icmIocGFyYW1zLCB2YXJzLCBwZmNfcGFyYW1zKTsKLQlpZiAoMCAhPSBibngyeF9zdGF0dXMpCisJaWYgKGJueDJ4X3N0YXR1cykKIAkJcmV0dXJuIGJueDJ4X3N0YXR1czsKIAogCWlmICghdmFycy0+bGlua191cCkKQEAgLTI1MzMsNyArMjYzNyw2IEBACiAJCQlibngyeF9lbWFjX2VuYWJsZShwYXJhbXMsIHZhcnMsIDApOwogCQkJcmV0dXJuIGJueDJ4X3N0YXR1czsKIAkJfQotCiAJCWlmIChDSElQX0lTX0UyKGJwKSkKIAkJCWJueDJ4X3VwZGF0ZV9wZmNfYm1hYzIocGFyYW1zLCB2YXJzLCBibWFjX2xvb3BiYWNrKTsKIAkJZWxzZQpAQCAtMzA1Myw3ICszMTU2LDYgQEAKIAkJRFAoTkVUSUZfTVNHX0xJTkssICJ3cml0ZSBwaHkgcmVnaXN0ZXIgZmFpbGVkXG4iKTsKIAkJbmV0ZGV2X2VycihicC0+ZGV2LCAgIk1EQy9NRElPIGFjY2VzcyB0aW1lb3V0XG4iKTsKIAkJcmMgPSAtRUZBVUxUOwotCiAJfSBlbHNlIHsKIAkJLyogZGF0YSAqLwogCQl0bXAgPSAoKHBoeS0+YWRkciA8PCAyMSkgfCAoZGV2YWQgPDwgMTYpIHwgdmFsIHwKQEAgLTMwOTAsOCArMzE5Miw2IEBACiAJCQkgICAgICAgRU1BQ19NRElPX1NUQVRVU18xME1CKTsKIAlyZXR1cm4gcmM7CiB9Ci0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCQkJQlNDIGFjY2VzcyBmdW5jdGlvbnMgZnJvbSBFMwkgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0zMzM5LDcgKzM0MzksNyBAQAogCQlhZXJfdmFsID0gMHgzODAwICsgb2Zmc2V0IC0gMTsKIAllbHNlCiAJCWFlcl92YWwgPSAweDM4MDAgKyBvZmZzZXQ7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJTZXQgQUVSIHRvIDB4JXhcbiIsIGFlcl92YWwpOworCiAJQ0wyMl9XUl9PVkVSX0NMNDUoYnAsIHBoeSwgTURJT19SRUdfQkFOS19BRVJfQkxPQ0ssCiAJCQkgIE1ESU9fQUVSX0JMT0NLX0FFUl9SRUcsIGFlcl92YWwpOwogCkBAIC0zOTQyLDEzICs0MDQyLDExIEBACiAKIHN0YXRpYyB2b2lkIGJueDJ4X3dhcnBjb3JlX3NldF9zZ21paV9zcGVlZChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCiAJCQkJCSAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLAotCQkJCQkgICB1OCBmaWJlcl9tb2RlKQorCQkJCQkgICB1OCBmaWJlcl9tb2RlLAorCQkJCQkgICB1OCBhbHdheXNfYXV0b25lZykKIHsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAl1MTYgdmFsMTYsIGRpZ2N0cmxfa3gxLCBkaWdjdHJsX2t4MjsKLQl1OCBsYW5lOwotCi0JbGFuZSA9IGJueDJ4X2dldF93YXJwY29yZV9sYW5lKHBoeSwgcGFyYW1zKTsKIAogCS8qIENsZWFyIFhGSSBjbG9jayBjb21wIGluIG5vbi0xMEcgc2luZ2xlIGxhbmUgbW9kZS4gKi8KIAlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKQEAgLTM5NTYsNyArNDA1NCw3IEBACiAJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX1dDX0RFVkFELAogCQkJIE1ESU9fV0NfUkVHX1JYNjZfQ09OVFJPTCwgdmFsMTYgJiB+KDM8PDEzKSk7CiAKLQlpZiAocGh5LT5yZXFfbGluZV9zcGVlZCA9PSBTUEVFRF9BVVRPX05FRykgeworCWlmIChhbHdheXNfYXV0b25lZyB8fCBwaHktPnJlcV9saW5lX3NwZWVkID09IFNQRUVEX0FVVE9fTkVHKSB7CiAJCS8qIFNHTUlJIEF1dG9uZWcgKi8KIAkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCiAJCQkJTURJT19XQ19SRUdfQ09NQk9fSUVFRTBfTUlJQ1RSTCwgJnZhbDE2KTsKQEAgLTM5NjcsNyArNDA2NSw3IEBACiAJfSBlbHNlIHsKIAkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCiAJCQkJTURJT19XQ19SRUdfQ09NQk9fSUVFRTBfTUlJQ1RSTCwgJnZhbDE2KTsKLQkJdmFsMTYgJj0gMHhjZmJmOworCQl2YWwxNiAmPSAweGNlYmY7CiAJCXN3aXRjaCAocGh5LT5yZXFfbGluZV9zcGVlZCkgewogCQljYXNlIFNQRUVEXzEwOgogCQkJYnJlYWs7CkBAIC00MDQzLDkgKzQxNDEsNyBAQAogCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAogCQkJIE1ESU9fV0NfUkVHX0RJR0lUQUw1X01JU0M2LCAmdmFsKTsKIH0KLQotCi0JLyogQ2xlYXIgU0ZJL1hGSSBsaW5rIHNldHRpbmdzIHJlZ2lzdGVycyAqLworLyogQ2xlYXIgU0ZJL1hGSSBsaW5rIHNldHRpbmdzIHJlZ2lzdGVycyAqLwogc3RhdGljIHZvaWQgYm54Mnhfd2FycGNvcmVfY2xlYXJfcmVncyhzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCiAJCQkJICAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCiAJCQkJICAgICAgdTE2IGxhbmUpCkBAIC00MjUwLDcgKzQzNDYsNyBAQAogCQl2YXJzLT5waHlfZmxhZ3MgfD0gUEhZX1NHTUlJX0ZMQUc7CiAJCURQKE5FVElGX01TR19MSU5LLCAiU2V0dGluZyBTR01JSSBtb2RlXG4iKTsKIAkJYm54Mnhfd2FycGNvcmVfY2xlYXJfcmVncyhwaHksIHBhcmFtcywgbGFuZSk7Ci0JCWJueDJ4X3dhcnBjb3JlX3NldF9zZ21paV9zcGVlZChwaHksIHBhcmFtcywgMCk7CisJCWJueDJ4X3dhcnBjb3JlX3NldF9zZ21paV9zcGVlZChwaHksIHBhcmFtcywgMCwgMSk7CiAJfSBlbHNlIHsKIAkJc3dpdGNoIChzZXJkZXNfbmV0X2lmKSB7CiAJCWNhc2UgUE9SVF9IV19DRkdfTkVUX1NFUkRFU19JRl9LUjoKQEAgLTQyNzgsNyArNDM3NCw4IEBACiAJCQkJfQogCQkJCWJueDJ4X3dhcnBjb3JlX3NldF9zZ21paV9zcGVlZChwaHksCiAJCQkJCQkJCXBhcmFtcywKLQkJCQkJCQkJZmliZXJfbW9kZSk7CisJCQkJCQkJCWZpYmVyX21vZGUsCisJCQkJCQkJCTApOwogCQkJfQogCiAJCQlicmVhazsKQEAgLTQyOTEsNyArNDM4OCw4IEBACiAJCQkJYm54Mnhfd2FycGNvcmVfc2V0XzEwR19YRkkocGh5LCBwYXJhbXMsIDApOwogCQkJfSBlbHNlIGlmICh2YXJzLT5saW5lX3NwZWVkID09IFNQRUVEXzEwMDApIHsKIAkJCQlEUChORVRJRl9NU0dfTElOSywgIlNldHRpbmcgMUcgRmliZXJcbiIpOwotCQkJCWJueDJ4X3dhcnBjb3JlX3NldF9zZ21paV9zcGVlZChwaHksIHBhcmFtcywgMSk7CisJCQkJYm54Mnhfd2FycGNvcmVfc2V0X3NnbWlpX3NwZWVkKAorCQkJCQkJcGh5LCBwYXJhbXMsIDEsIDApOwogCQkJfQogCQkJLyogSXNzdWUgTW9kdWxlIGRldGVjdGlvbiAqLwogCQkJaWYgKGJueDJ4X2lzX3NmcF9tb2R1bGVfcGx1Z2dlZChwaHksIHBhcmFtcykpCkBAIC00NDI4LDEyICs0NTI2LDYgQEAKIAogCQkvKiBTd2l0Y2ggYmFjayB0byA0LWNvcHkgcmVnaXN0ZXJzICovCiAJCWJueDJ4X3NldF9hZXJfbW1kKHBhcmFtcywgcGh5KTsKLQkJLyogR2xvYmFsIGxvb3BiYWNrLCBub3QgcmVjb21tZW5kZWQuICovCi0JCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX1dDX0RFVkFELAotCQkJCU1ESU9fV0NfUkVHX0NPTUJPX0lFRUUwX01JSUNUUkwsICZ2YWwxNik7Ci0JCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19XQ19ERVZBRCwKLQkJCQlNRElPX1dDX1JFR19DT01CT19JRUVFMF9NSUlDVFJMLCB2YWwxNiB8Ci0JCQkJMHg0MDAwKTsKIAl9IGVsc2UgewogCQkvKiAxMEcgJiAyMEcgKi8KIAkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fV0NfREVWQUQsCkBAIC00NDUwLDI1ICs0NTQyLDE0IEBACiB9CiAKIAotdm9pZCBibngyeF9saW5rX3N0YXR1c191cGRhdGUoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCi0JCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQordm9pZCBibngyeF9zeW5jX2xpbmsoc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCisJCQkgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCXU4IGxpbmtfMTBnX3BsdXM7Ci0JdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKLQl1MzIgc3luY19vZmZzZXQsIG1lZGlhX3R5cGVzOwotCS8qIFVwZGF0ZSBQSFkgY29uZmlndXJhdGlvbiAqLwotCXNldF9waHlfdmFycyhwYXJhbXMsIHZhcnMpOwotCi0JdmFycy0+bGlua19zdGF0dXMgPSBSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKLQkJCQkJICAgIHBvcnRfbWJbcG9ydF0ubGlua19zdGF0dXMpKTsKLQotCXZhcnMtPmxpbmtfdXAgPSAodmFycy0+bGlua19zdGF0dXMgJiBMSU5LX1NUQVRVU19MSU5LX1VQKTsKLQl2YXJzLT5waHlfZmxhZ3MgPSBQSFlfWEdYU19GTEFHOwogCWlmICh2YXJzLT5saW5rX3N0YXR1cyAmIExJTktfU1RBVFVTX1BIWVNJQ0FMX0xJTktfRkxBRykKIAkJdmFycy0+cGh5X2ZsYWdzIHw9IFBIWV9QSFlTSUNBTF9MSU5LX0ZMQUc7Ci0KKwl2YXJzLT5saW5rX3VwID0gKHZhcnMtPmxpbmtfc3RhdHVzICYgTElOS19TVEFUVVNfTElOS19VUCk7CiAJaWYgKHZhcnMtPmxpbmtfdXApIHsKIAkJRFAoTkVUSUZfTVNHX0xJTkssICJwaHkgbGluayB1cFxuIik7CiAKQEAgLTQ1NjMsNyArNDY0NCwyMyBAQAogCQlpZiAodmFycy0+bGlua19zdGF0dXMgJiBMSU5LX1NUQVRVU19QSFlTSUNBTF9MSU5LX0ZMQUcpCiAJCQl2YXJzLT5waHlfZmxhZ3MgfD0gUEhZX0hBTEZfT1BFTl9DT05OX0ZMQUc7CiAJfQorfQogCit2b2lkIGJueDJ4X2xpbmtfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJCSAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTggcG9ydCA9IHBhcmFtcy0+cG9ydDsKKwl1MzIgc3luY19vZmZzZXQsIG1lZGlhX3R5cGVzOworCS8qIFVwZGF0ZSBQSFkgY29uZmlndXJhdGlvbiAqLworCXNldF9waHlfdmFycyhwYXJhbXMsIHZhcnMpOworCisJdmFycy0+bGlua19zdGF0dXMgPSBSRUdfUkQoYnAsIHBhcmFtcy0+c2htZW1fYmFzZSArCisJCQkJICAgb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKKwkJCQkJICAgIHBvcnRfbWJbcG9ydF0ubGlua19zdGF0dXMpKTsKKworCXZhcnMtPnBoeV9mbGFncyA9IFBIWV9YR1hTX0ZMQUc7CisJYm54Mnhfc3luY19saW5rKHBhcmFtcywgdmFycyk7CiAJLyogU3luYyBtZWRpYSB0eXBlICovCiAJc3luY19vZmZzZXQgPSBwYXJhbXMtPnNobWVtX2Jhc2UgKwogCQkJb2Zmc2V0b2Yoc3RydWN0IHNobWVtX3JlZ2lvbiwKQEAgLTQ2MDIsNyArNDY5OSw2IEBACiAJCSB2YXJzLT5saW5lX3NwZWVkLCB2YXJzLT5kdXBsZXgsIHZhcnMtPmZsb3dfY3RybCk7CiB9CiAKLQogc3RhdGljIHZvaWQgYm54Mnhfc2V0X21hc3Rlcl9sbihzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKIAkJCQlzdHJ1Y3QgYm54MnhfcGh5ICpwaHkpCiB7CkBAIC00Njc2LDExICs0NzcyLDggQEAKIAkgKiAgRWFjaCB0d28gYml0cyByZXByZXNlbnRzIGEgbGFuZSBudW1iZXI6CiAJICogIE5vIHN3YXAgaXMgMDEyMyA9PiAweDFiIG5vIG5lZWQgdG8gZW5hYmxlIHRoZSBzd2FwCiAJICovCi0JdTE2IHNlcl9sYW5lLCByeF9sYW5lX3N3YXAsIHR4X2xhbmVfc3dhcDsKKwl1MTYgcnhfbGFuZV9zd2FwLCB0eF9sYW5lX3N3YXA7CiAKLQlzZXJfbGFuZSA9ICgocGFyYW1zLT5sYW5lX2NvbmZpZyAmCi0JCSAgICAgUE9SVF9IV19DRkdfTEFORV9TV0FQX0NGR19NQVNURVJfTUFTSykgPj4KLQkJICAgIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfTUFTVEVSX1NISUZUKTsKIAlyeF9sYW5lX3N3YXAgPSAoKHBhcmFtcy0+bGFuZV9jb25maWcgJgogCQkJIFBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfUlhfTUFTSykgPj4KIAkJCVBPUlRfSFdfQ0ZHX0xBTkVfU1dBUF9DRkdfUlhfU0hJRlQpOwpAQCAtNTM1Niw3ICs1NDQ5LDYgQEAKIAkJCQkgICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKIAkJCQkgICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewotCiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CiAKIAl1MTYgZ3Bfc3RhdHVzLCBkdXBsZXggPSBEVVBMRVhfSEFMRiwgbGlua191cCA9IDAsIHNwZWVkX21hc2s7CkBAIC01NDAzLDkgKzU0OTUsNyBAQAogCQkJCSAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCiAJCQkJICAgICBzdHJ1Y3QgbGlua192YXJzICp2YXJzKQogewotCiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0KIAl1OCBsYW5lOwogCXUxNiBncF9zdGF0dXMxLCBncF9zcGVlZCwgbGlua191cCwgZHVwbGV4ID0gRFVQTEVYX0ZVTEw7CiAJaW50IHJjID0gMDsKQEAgLTY2NzgsNyArNjc2OCw2IEBACiAJcmV0dXJuIHJjOwogfQogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qCQkJICAgIEV4dGVybmFsIFBoeSBzZWN0aW9uCQkJICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtODEwMyw3ICs4MTkyLDE1IEBACiBzdGF0aWMgdm9pZCBibngyeF93YXJwY29yZV9od19yZXNldChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCiAJCQkJICAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQogeworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwogCWJueDJ4X3dhcnBjb3JlX3Bvd2VyX21vZHVsZShwYXJhbXMsIHBoeSwgMCk7CisJLyogUHV0IFdhcnBjb3JlIGluIGxvdyBwb3dlciBtb2RlICovCisJUkVHX1dSKGJwLCBNSVNDX1JFR19XQzBfUkVTRVQsIDB4MGMwZSk7CisKKwkvKiBQdXQgTENQTEwgaW4gbG93IHBvd2VyIG1vZGUgKi8KKwlSRUdfV1IoYnAsIE1JU0NfUkVHX0xDUExMX0U0MF9QV1JEV04sIDEpOworCVJFR19XUihicCwgTUlTQ19SRUdfTENQTExfRTQwX1JFU0VUQl9BTkEsIDApOworCVJFR19XUihicCwgTUlTQ19SRUdfTENQTExfRTQwX1JFU0VUQl9ESUcsIDApOwogfQogCiBzdGF0aWMgdm9pZCBibngyeF9wb3dlcl9zZnBfbW9kdWxlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLApAQCAtOTA0MCwxMyArOTEzNywxMyBAQAogCQkJRFAoTkVUSUZfTVNHX0xJTkssCiAJCQkgICAiODcyNyBQb3dlciBmYXVsdCBoYXMgYmVlbiBkZXRlY3RlZCBvbiBwb3J0ICVkXG4iLAogCQkJICAgb2NfcG9ydCk7Ci0JCQluZXRkZXZfZXJyKGJwLT5kZXYsICJFcnJvcjogIFBvd2VyIGZhdWx0IG9uIFBvcnQgJWQgaGFzIgotCQkJCQkgICAgIiBiZWVuIGRldGVjdGVkIGFuZCB0aGUgcG93ZXIgdG8gIgotCQkJCQkgICAgInRoYXQgU0ZQKyBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCIKLQkJCQkJICAgICIgdG8gcHJldmVudCBmYWlsdXJlIG9mIHRoZSBjYXJkLiIKLQkJCQkJICAgICIgUGxlYXNlIHJlbW92ZSB0aGUgU0ZQKyBtb2R1bGUgYW5kIgotCQkJCQkgICAgIiByZXN0YXJ0IHRoZSBzeXN0ZW0gdG8gY2xlYXIgdGhpcyIKLQkJCQkJICAgICIgZXJyb3IuXG4iLAorCQkJbmV0ZGV2X2VycihicC0+ZGV2LCAiRXJyb3I6IFBvd2VyIGZhdWx0IG9uIFBvcnQgJWQgaGFzICIKKwkJCQkJICAgICJiZWVuIGRldGVjdGVkIGFuZCB0aGUgcG93ZXIgdG8gIgorCQkJCQkgICAgInRoYXQgU0ZQKyBtb2R1bGUgaGFzIGJlZW4gcmVtb3ZlZCAiCisJCQkJCSAgICAidG8gcHJldmVudCBmYWlsdXJlIG9mIHRoZSBjYXJkLiAiCisJCQkJCSAgICAiUGxlYXNlIHJlbW92ZSB0aGUgU0ZQKyBtb2R1bGUgYW5kICIKKwkJCQkJICAgICJyZXN0YXJ0IHRoZSBzeXN0ZW0gdG8gY2xlYXIgdGhpcyAiCisJCQkJCSAgICAiZXJyb3IuXG4iLAogCQkJIG9jX3BvcnQpOwogCQkJLyogRGlzYWJsZSBhbGwgUlhfQUxBUk1zIGV4Y2VwdCBmb3IgbW9kX2FicyAqLwogCQkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LApAQCAtOTIyOCw3ICs5MzI1LDcgQEAKIHN0YXRpYyB2b2lkIGJueDJ4Xzg0OHh4X3NldF9sZWQoc3RydWN0IGJueDJ4ICpicCwKIAkJCQlzdHJ1Y3QgYm54MnhfcGh5ICpwaHkpCiB7Ci0JdTE2IHZhbDsKKwl1MTYgdmFsLCBvZmZzZXQ7CiAKIAkvKiBQSFlDX0NUTF9MRURfQ1RMICovCiAJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCkBAIC05MjYzLDE0ICs5MzYwLDIyIEBACiAJCQlNRElPX1BNQV9SRUdfODQ4MV9MRUQzX0JMSU5LLAogCQkJMCk7CiAKLQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKLQkJCU1ESU9fUE1BX0RFVkFELAotCQkJTURJT19QTUFfUkVHXzg0ODIzX0NUTF9MRURfQ1RMXzEsICZ2YWwpOwotCXZhbCB8PSBNRElPX1BNQV9SRUdfODQ4MjNfTEVEM19TVFJFVENIX0VOOyAvKiBzdHJldGNoX2VuIGZvciBMRUQzKi8KLQorCS8qIENvbmZpZ3VyZSB0aGUgYmxpbmsgcmF0ZSB0byB+MTUuOSBIeiAqLwogCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKLQkJCSBNRElPX1BNQV9ERVZBRCwKLQkJCSBNRElPX1BNQV9SRUdfODQ4MjNfQ1RMX0xFRF9DVExfMSwgdmFsKTsKKwkJCU1ESU9fUE1BX0RFVkFELAorCQkJTURJT19QTUFfUkVHXzg0ODIzX0NUTF9TTE9XX0NMS19DTlRfSElHSCwKKwkJCU1ESU9fUE1BX1JFR184NDgyM19CTElOS19SQVRFX1ZBTF8xNVA5SFopOworCisJaWYgKHBoeS0+dHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgzMykKKwkJb2Zmc2V0ID0gTURJT19QTUFfUkVHXzg0ODMzX0NUTF9MRURfQ1RMXzE7CisJZWxzZQorCQlvZmZzZXQgPSBNRElPX1BNQV9SRUdfODQ4MjNfQ1RMX0xFRF9DVExfMTsKKworCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LAorCQkJTURJT19QTUFfREVWQUQsIG9mZnNldCwgJnZhbCk7CisJdmFsIHw9IE1ESU9fUE1BX1JFR184NDgyM19MRUQzX1NUUkVUQ0hfRU47IC8qIHN0cmV0Y2hfZW4gZm9yIExFRDMqLworCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKKwkJCSBNRElPX1BNQV9ERVZBRCwgb2Zmc2V0LCB2YWwpOwogCiAJLyogJ0ludGVycnVwdCBNYXNrJyAqLwogCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKQEAgLTkyODMsNyArOTM4OCw3IEBACiAJCQkJICAgICAgIHN0cnVjdCBsaW5rX3ZhcnMgKnZhcnMpCiB7CiAJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7Ci0JdTE2IGF1dG9uZWdfdmFsLCBhbl8xMDAwX3ZhbCwgYW5fMTBfMTAwX3ZhbDsKKwl1MTYgYXV0b25lZ192YWwsIGFuXzEwMDBfdmFsLCBhbl8xMF8xMDBfdmFsLCBhbl8xMGdfdmFsOwogCXUxNiB0bXBfcmVxX2xpbmVfc3BlZWQ7CiAKIAl0bXBfcmVxX2xpbmVfc3BlZWQgPSBwaHktPnJlcV9saW5lX3NwZWVkOwpAQCAtOTM3OCw2ICs5NDgzLDggQEAKIAkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAogCQkJCSBNRElPX0FOX0RFVkFELCBNRElPX0FOX1JFR184NDgxX0FVWF9DVFJMLAogCQkJCSAoMTw8MTUgfCAxPDw5IHwgNzw8MCkpOworCQkvKiBUaGUgUEhZIG5lZWRzIHRoaXMgc2V0IGV2ZW4gZm9yIGZvcmNlZCBsaW5rLiAqLworCQlhbl8xMF8xMDBfdmFsIHw9ICgxPDw4KSB8ICgxPDw3KTsKIAkJRFAoTkVUSUZfTVNHX0xJTkssICJTZXR0aW5nIDEwME0gZm9yY2VcbiIpOwogCX0KIAlpZiAoKHBoeS0+cmVxX2xpbmVfc3BlZWQgPT0gU1BFRURfMTApICYmCkBAIC05NDE1LDkgKzk1MjIsMTcgQEAKIAkJCURQKE5FVElGX01TR19MSU5LLCAiQWR2ZXJ0aXNpbmcgMTBHXG4iKTsKIAkJCS8qIFJlc3RhcnQgYXV0b25lZyBmb3IgMTBHKi8KIAorCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksCisJCQkJCU1ESU9fQU5fREVWQUQsCisJCQkJCU1ESU9fQU5fUkVHXzg0ODFfMTBHQkFTRV9UX0FOX0NUUkwsCisJCQkJCSZhbl8xMGdfdmFsKTsKIAkJCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwKLQkJCQkgTURJT19BTl9ERVZBRCwgTURJT19BTl9SRUdfQ1RSTCwKLQkJCQkgMHgzMjAwKTsKKwkJCQkJIE1ESU9fQU5fREVWQUQsCisJCQkJCSBNRElPX0FOX1JFR184NDgxXzEwR0JBU0VfVF9BTl9DVFJMLAorCQkJCQkgYW5fMTBnX3ZhbCB8IDB4MTAwMCk7CisJCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCisJCQkJCSBNRElPX0FOX0RFVkFELCBNRElPX0FOX1JFR19DVFJMLAorCQkJCQkgMHgzMjAwKTsKIAl9IGVsc2UKIAkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAogCQkJCSBNRElPX0FOX0RFVkFELApAQCAtOTQ0OSwxOCArOTU2NCw3NCBAQAogCXJldHVybiBibngyeF84NDh4eF9jbW5fY29uZmlnX2luaXQocGh5LCBwYXJhbXMsIHZhcnMpOwogfQogCisjZGVmaW5lIFBIWTg0ODMzX0NNREhETFJfV0FJVCAzMDAKKyNkZWZpbmUgUEhZODQ4MzNfQ01ESERMUl9NQVhfQVJHUyA1CitzdGF0aWMgaW50IGJueDJ4Xzg0ODMzX2NtZF9oZGxyKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywKKwkJICAgdTE2IGZ3X2NtZCwKKwkJICAgdTE2IGNtZF9hcmdzW10pCit7CisJdTMyIGlkeDsKKwl1MTYgdmFsOworCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOworCS8qIFdyaXRlIENNRF9PUEVOX09WRVJSSURFIHRvIFNUQVRVUyByZWcgKi8KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAorCQkJTURJT184NDgzM19DTURfSERMUl9TVEFUVVMsCisJCQlQSFk4NDgzM19TVEFUVVNfQ01EX09QRU5fT1ZFUlJJREUpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgUEhZODQ4MzNfQ01ESERMUl9XQUlUOyBpZHgrKykgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCisJCQkJTURJT184NDgzM19DTURfSERMUl9TVEFUVVMsICZ2YWwpOworCQlpZiAodmFsID09IFBIWTg0ODMzX1NUQVRVU19DTURfT1BFTl9GT1JfQ01EUykKKwkJCWJyZWFrOworCQltc2xlZXAoMSk7CisJfQorCWlmIChpZHggPj0gUEhZODQ4MzNfQ01ESERMUl9XQUlUKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiRlcgY21kOiBGVyBub3QgcmVhZHkuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0jZGVmaW5lIFBIWTg0ODMzX0hEU0hLX1dBSVQgMzAwCisJLyogUHJlcGFyZSBhcmd1bWVudChzKSBhbmQgaXNzdWUgY29tbWFuZCAqLworCWZvciAoaWR4ID0gMDsgaWR4IDwgUEhZODQ4MzNfQ01ESERMUl9NQVhfQVJHUzsgaWR4KyspIHsKKwkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKKwkJCQlNRElPXzg0ODMzX0NNRF9IRExSX0RBVEExICsgaWR4LAorCQkJCWNtZF9hcmdzW2lkeF0pOworCX0KKwlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAorCQkJTURJT184NDgzM19DTURfSERMUl9DT01NQU5ELCBmd19jbWQpOworCWZvciAoaWR4ID0gMDsgaWR4IDwgUEhZODQ4MzNfQ01ESERMUl9XQUlUOyBpZHgrKykgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCisJCQkJTURJT184NDgzM19DTURfSERMUl9TVEFUVVMsICZ2YWwpOworCQlpZiAoKHZhbCA9PSBQSFk4NDgzM19TVEFUVVNfQ01EX0NPTVBMRVRFX1BBU1MpIHx8CisJCQkodmFsID09IFBIWTg0ODMzX1NUQVRVU19DTURfQ09NUExFVEVfRVJST1IpKQorCQkJYnJlYWs7CisJCW1zbGVlcCgxKTsKKwl9CisJaWYgKChpZHggPj0gUEhZODQ4MzNfQ01ESERMUl9XQUlUKSB8fAorCQkodmFsID09IFBIWTg0ODMzX1NUQVRVU19DTURfQ09NUExFVEVfRVJST1IpKSB7CisJCURQKE5FVElGX01TR19MSU5LLCAiRlcgY21kIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJLyogR2F0aGVyIHJldHVybmluZyBkYXRhICovCisJZm9yIChpZHggPSAwOyBpZHggPCBQSFk4NDgzM19DTURIRExSX01BWF9BUkdTOyBpZHgrKykgeworCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCisJCQkJTURJT184NDgzM19DTURfSERMUl9EQVRBMSArIGlkeCwKKwkJCQkmY21kX2FyZ3NbaWR4XSk7CisJfQorCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCisJCQlNRElPXzg0ODMzX0NNRF9IRExSX1NUQVRVUywKKwkJCVBIWTg0ODMzX1NUQVRVU19DTURfQ0xFQVJfQ09NUExFVEUpOworCXJldHVybiAwOworfQorCisKIHN0YXRpYyBpbnQgYm54MnhfODQ4MzNfcGFpcl9zd2FwX2NmZyhzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCiAJCQkJICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCiAJCQkJICAgc3RydWN0IGxpbmtfdmFycyAqdmFycykKIHsKLQl1MzIgaWR4OwogCXUzMiBwYWlyX3N3YXA7Ci0JdTE2IHZhbDsKLQl1MTYgZGF0YTsKKwl1MTYgZGF0YVtQSFk4NDgzM19DTURIRExSX01BWF9BUkdTXTsKKwlpbnQgc3RhdHVzOwogCXN0cnVjdCBibngyeCAqYnAgPSBwYXJhbXMtPmJwOwotCS8qIERvIHBhaXIgc3dhcCAqLwogCiAJLyogQ2hlY2sgZm9yIGNvbmZpZ3VyYXRpb24uICovCiAJcGFpcl9zd2FwID0gUkVHX1JEKGJwLCBwYXJhbXMtPnNobWVtX2Jhc2UgKwpAQCAtOTQ3MSw1MiArOTY0MiwxNyBAQAogCWlmIChwYWlyX3N3YXAgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlkYXRhID0gKHUxNilwYWlyX3N3YXA7CisJLyogT25seSB0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIHVzZWQgZm9yIHRoaXMgY29tbWFuZCAqLworCWRhdGFbMV0gPSAodTE2KXBhaXJfc3dhcDsKIAotCS8qIFdyaXRlIENNRF9PUEVOX09WRVJSSURFIHRvIFNUQVRVUyByZWcgKi8KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAotCQkJTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMiwKLQkJCVBIWTg0ODMzX0NNRF9PUEVOX09WRVJSSURFKTsKLQlmb3IgKGlkeCA9IDA7IGlkeCA8IFBIWTg0ODMzX0hEU0hLX1dBSVQ7IGlkeCsrKSB7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKLQkJCQlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyLCAmdmFsKTsKLQkJaWYgKHZhbCA9PSBQSFk4NDgzM19DTURfT1BFTl9GT1JfQ01EUykKLQkJCWJyZWFrOwotCQltc2xlZXAoMSk7Ci0JfQotCWlmIChpZHggPj0gUEhZODQ4MzNfSERTSEtfV0FJVCkgewotCQlEUChORVRJRl9NU0dfTElOSywgIlBhaXJzd2FwOiBGVyBub3QgcmVhZHkuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCXN0YXR1cyA9IGJueDJ4Xzg0ODMzX2NtZF9oZGxyKHBoeSwgcGFyYW1zLAorCQlQSFk4NDgzM19DTURfU0VUX1BBSVJfU1dBUCwgZGF0YSk7CisJaWYgKHN0YXR1cyA9PSAwKQorCQlEUChORVRJRl9NU0dfTElOSywgIlBhaXJzd2FwIE9LLCB2YWw9MHgleFxuIiwgZGF0YVsxXSk7CiAKLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAotCQkJTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHNCwKLQkJCWRhdGEpOwotCS8qIElzc3VlIHBhaXIgc3dhcCBjb21tYW5kICovCi0JYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKLQkJCU1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzAsCi0JCQlQSFk4NDgzM19ESUFHX0NNRF9QQUlSX1NXQVBfQ0hBTkdFKTsKLQlmb3IgKGlkeCA9IDA7IGlkeCA8IFBIWTg0ODMzX0hEU0hLX1dBSVQ7IGlkeCsrKSB7Ci0JCWJueDJ4X2NsNDVfcmVhZChicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKLQkJCQlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyLCAmdmFsKTsKLQkJaWYgKCh2YWwgPT0gUEhZODQ4MzNfQ01EX0NPTVBMRVRFX1BBU1MpIHx8Ci0JCQkodmFsID09IFBIWTg0ODMzX0NNRF9DT01QTEVURV9FUlJPUikpCi0JCQlicmVhazsKLQkJbXNsZWVwKDEpOwotCX0KLQlpZiAoKGlkeCA+PSBQSFk4NDgzM19IRFNIS19XQUlUKSB8fAotCQkodmFsID09IFBIWTg0ODMzX0NNRF9DT01QTEVURV9FUlJPUikpIHsKLQkJRFAoTkVUSUZfTVNHX0xJTkssICJQYWlyc3dhcDogb3ZlcnJpZGUgZmFpbGVkLlxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAotCQkJTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMiwKLQkJCVBIWTg0ODMzX0NNRF9DTEVBUl9DT01QTEVURSk7Ci0JRFAoTkVUSUZfTVNHX0xJTkssICJQYWlyc3dhcCBPSywgdmFsPTB4JXhcbiIsIGRhdGEpOwotCXJldHVybiAwOworCXJldHVybiBzdGF0dXM7CiB9CiAKLQogc3RhdGljIHU4IGJueDJ4Xzg0ODMzX2dldF9yZXNldF9ncGlvcyhzdHJ1Y3QgYm54MnggKmJwLAogCQkJCSAgICAgIHUzMiBzaG1lbV9iYXNlX3BhdGhbXSwKIAkJCQkgICAgICB1MzIgY2hpcF9pZCkKQEAgLTk1NzksMjQgKzk3MTUsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJueDJ4Xzg0ODMzX2NvbW1vbl9pbml0X3BoeShzdHJ1Y3QgYm54MnggKmJwLAotCQkJCQkJdTMyIHNobWVtX2Jhc2VfcGF0aFtdLAotCQkJCQkJdTMyIGNoaXBfaWQpCi17Ci0JdTggcmVzZXRfZ3Bpb3M7Ci0KLQlyZXNldF9ncGlvcyA9IGJueDJ4Xzg0ODMzX2dldF9yZXNldF9ncGlvcyhicCwgc2htZW1fYmFzZV9wYXRoLCBjaGlwX2lkKTsKLQotCWJueDJ4X3NldF9tdWx0X2dwaW8oYnAsIHJlc2V0X2dwaW9zLCBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9MT1cpOwotCXVkZWxheSgxMCk7Ci0JYm54Mnhfc2V0X211bHRfZ3BpbyhicCwgcmVzZXRfZ3Bpb3MsIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0hJR0gpOwotCW1zbGVlcCg4MDApOwotCURQKE5FVElGX01TR19MSU5LLCAiODQ4MzMgcmVzZXQgcHVsc2Ugb24gcGluIHZhbHVlcyAweCV4XG4iLAotCQlyZXNldF9ncGlvcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogI2RlZmluZSBQSFk4NDgzM19DT05TVEFOVF9MQVRFTkNZIDExOTMKIHN0YXRpYyBpbnQgYm54MnhfODQ4eDNfY29uZmlnX2luaXQoc3RydWN0IGJueDJ4X3BoeSAqcGh5LAogCQkJCSAgIHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zLApAQCAtOTYwNSw4ICs5NzIzLDggQEAKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAl1OCBwb3J0LCBpbml0aWFsaXplID0gMTsKIAl1MTYgdmFsOwotCXUxNiB0ZW1wOwotCXUzMiBhY3R1YWxfcGh5X3NlbGVjdGlvbiwgY21zX2VuYWJsZSwgaWR4OworCXUzMiBhY3R1YWxfcGh5X3NlbGVjdGlvbiwgY21zX2VuYWJsZTsKKwl1MTYgY21kX2FyZ3NbUEhZODQ4MzNfQ01ESERMUl9NQVhfQVJHU107CiAJaW50IHJjID0gMDsKIAogCW1zbGVlcCgxKTsKQEAgLTk2MjUsNiArOTc0MywxMyBAQAogCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksCiAJCQkJTURJT19QTUFfREVWQUQsCiAJCQkJTURJT19QTUFfUkVHX0NUUkwsIDB4ODAwMCk7CisJfQorCisJYm54Mnhfd2FpdF9yZXNldF9jb21wbGV0ZShicCwgcGh5LCBwYXJhbXMpOworCisJLyogV2FpdCBmb3IgR1BIWSB0byBjb21lIG91dCBvZiByZXNldCAqLworCW1zbGVlcCg1MCk7CisJaWYgKHBoeS0+dHlwZSA9PSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9CQ004NDgzMykgewogCQkvKiBCcmluZyBQSFkgb3V0IG9mIHN1cGVyIGlzb2xhdGUgbW9kZSAqLwogCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwKIAkJCQlNRElPX0NUTF9ERVZBRCwKQEAgLTk2MzMsMjYgKzk3NTgsMTkgQEAKIAkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LAogCQkJCU1ESU9fQ1RMX0RFVkFELAogCQkJCU1ESU9fODQ4MzNfVE9QX0NGR19YR1BIWV9TVFJBUDEsIHZhbCk7Ci0JfQotCi0JYm54Mnhfd2FpdF9yZXNldF9jb21wbGV0ZShicCwgcGh5LCBwYXJhbXMpOwotCi0JLyogV2FpdCBmb3IgR1BIWSB0byBjb21lIG91dCBvZiByZXNldCAqLwotCW1zbGVlcCg1MCk7Ci0KLQlpZiAocGh5LT50eXBlID09IFBPUlRfSFdfQ0ZHX1hHWFNfRVhUX1BIWV9UWVBFX0JDTTg0ODMzKQogCQlibngyeF84NDgzM19wYWlyX3N3YXBfY2ZnKHBoeSwgcGFyYW1zLCB2YXJzKTsKLQotCS8qCi0JICogQkNNODQ4MjMgcmVxdWlyZXMgdGhhdCBYR1hTIGxpbmtzIHVwIGZpcnN0IEAgMTBHIGZvciBub3JtYWwgYmVoYXZpb3IKLQkgKi8KLQl0ZW1wID0gdmFycy0+bGluZV9zcGVlZDsKLQl2YXJzLT5saW5lX3NwZWVkID0gU1BFRURfMTAwMDA7Ci0JYm54Mnhfc2V0X2F1dG9uZWcoJnBhcmFtcy0+cGh5W0lOVF9QSFldLCBwYXJhbXMsIHZhcnMsIDApOwotCWJueDJ4X3Byb2dyYW1fc2VyZGVzKCZwYXJhbXMtPnBoeVtJTlRfUEhZXSwgcGFyYW1zLCB2YXJzKTsKLQl2YXJzLT5saW5lX3NwZWVkID0gdGVtcDsKLQotCS8qIFNldCBkdWFsLW1lZGlhIGNvbmZpZ3VyYXRpb24gYWNjb3JkaW5nIHRvIGNvbmZpZ3VyYXRpb24gKi8KKwl9IGVsc2UgeworCQkvKgorCQkgKiBCQ004NDgyMyByZXF1aXJlcyB0aGF0IFhHWFMgbGlua3MgdXAgZmlyc3QgQCAxMEcgZm9yIG5vcm1hbAorCQkgKiBiZWhhdmlvci4KKwkJICovCisJCXUxNiB0ZW1wOworCQl0ZW1wID0gdmFycy0+bGluZV9zcGVlZDsKKwkJdmFycy0+bGluZV9zcGVlZCA9IFNQRUVEXzEwMDAwOworCQlibngyeF9zZXRfYXV0b25lZygmcGFyYW1zLT5waHlbSU5UX1BIWV0sIHBhcmFtcywgdmFycywgMCk7CisJCWJueDJ4X3Byb2dyYW1fc2VyZGVzKCZwYXJhbXMtPnBoeVtJTlRfUEhZXSwgcGFyYW1zLCB2YXJzKTsKKwkJdmFycy0+bGluZV9zcGVlZCA9IHRlbXA7CisJfQogCiAJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAogCQkJTURJT19DVExfUkVHXzg0ODIzX01FRElBLCAmdmFsKTsKQEAgLTk3MDAsNjQgKzk4MTgsMTggQEAKIAogCS8qIEF1dG9nckVFRW4gKi8KIAlpZiAocGFyYW1zLT5mZWF0dXJlX2NvbmZpZ19mbGFncyAmCi0JCUZFQVRVUkVfQ09ORklHX0FVVE9HUkVFRU5fRU5BQkxFRCkgewotCQkvKiBFbnN1cmUgdGhhdCBmL3cgaXMgcmVhZHkgKi8KLQkJZm9yIChpZHggPSAwOyBpZHggPCBQSFk4NDgzM19IRFNIS19XQUlUOyBpZHgrKykgewotCQkJYm54MnhfY2w0NV9yZWFkKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAotCQkJCQlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyLCAmdmFsKTsKLQkJCWlmICh2YWwgPT0gUEhZODQ4MzNfQ01EX09QRU5fRk9SX0NNRFMpCi0JCQkJYnJlYWs7Ci0JCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7Ci0JCX0KLQkJaWYgKGlkeCA+PSBQSFk4NDgzM19IRFNIS19XQUlUKSB7Ci0JCQlEUChORVRJRl9NU0dfTElOSywgIkF1dG9nckVFRW46IEZXIG5vdCByZWFkeS5cbiIpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KKwkJRkVBVFVSRV9DT05GSUdfQVVUT0dSRUVFTl9FTkFCTEVEKQorCQljbWRfYXJnc1swXSA9IDB4MjsKKwllbHNlCisJCWNtZF9hcmdzWzBdID0gMHgwOwogCi0JCS8qIFNlbGVjdCBFRUUgbW9kZSAqLwotCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAotCQkJCU1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzMsCi0JCQkJMHgyKTsKLQotCQkvKiBTZXQgSWRsZSBhbmQgTGF0ZW5jeSAqLwotCQlibngyeF9jbDQ1X3dyaXRlKGJwLCBwaHksIE1ESU9fQ1RMX0RFVkFELAotCQkJCU1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzQsCi0JCQkJUEhZODQ4MzNfQ09OU1RBTlRfTEFURU5DWSArIDEpOwotCi0JCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCi0JCQkJTURJT184NDgzM19UT1BfQ0ZHX0RBVEEzX1JFRywKLQkJCQlQSFk4NDgzM19DT05TVEFOVF9MQVRFTkNZICsgMSk7Ci0KLQkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKLQkJCQlNRElPXzg0ODMzX1RPUF9DRkdfREFUQTRfUkVHLAotCQkJCVBIWTg0ODMzX0NPTlNUQU5UX0xBVEVOQ1kpOwotCi0JCS8qIFNlbmQgRUVFIGluc3RydWN0aW9uIHRvIGNvbW1hbmQgcmVnaXN0ZXIgKi8KLQkJYm54MnhfY2w0NV93cml0ZShicCwgcGh5LCBNRElPX0NUTF9ERVZBRCwKLQkJCQlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcwLAotCQkJCVBIWTg0ODMzX0RJQUdfQ01EX1NFVF9FRUVfTU9ERSk7Ci0KLQkJLyogRW5zdXJlIHRoYXQgdGhlIGNvbW1hbmQgaGFzIGNvbXBsZXRlZCAqLwotCQlmb3IgKGlkeCA9IDA7IGlkeCA8IFBIWTg0ODMzX0hEU0hLX1dBSVQ7IGlkeCsrKSB7Ci0JCQlibngyeF9jbDQ1X3JlYWQoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCi0JCQkJCU1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzIsICZ2YWwpOwotCQkJaWYgKCh2YWwgPT0gUEhZODQ4MzNfQ01EX0NPTVBMRVRFX1BBU1MpIHx8Ci0JCQkJKHZhbCA9PSBQSFk4NDgzM19DTURfQ09NUExFVEVfRVJST1IpKQotCQkJCWJyZWFrOwotCQkJdXNsZWVwX3JhbmdlKDEwMDAsIDEwMDApOwotCQl9Ci0JCWlmICgoaWR4ID49IFBIWTg0ODMzX0hEU0hLX1dBSVQpIHx8Ci0JCQkodmFsID09IFBIWTg0ODMzX0NNRF9DT01QTEVURV9FUlJPUikpIHsKLQkJCURQKE5FVElGX01TR19MSU5LLCAiQXV0b2dyRUVFbjogY29tbWFuZCBmYWlsZWQuXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJLyogUmVzZXQgY29tbWFuZCBoYW5kbGVyICovCi0JCWJueDJ4X2NsNDVfd3JpdGUoYnAsIHBoeSwgTURJT19DVExfREVWQUQsCi0JCQkgICAgTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMiwKLQkJCSAgICBQSFk4NDgzM19DTURfQ0xFQVJfQ09NUExFVEUpOwotCX0KLQorCWNtZF9hcmdzWzFdID0gMHgwOworCWNtZF9hcmdzWzJdID0gUEhZODQ4MzNfQ09OU1RBTlRfTEFURU5DWSArIDE7CisJY21kX2FyZ3NbM10gPSBQSFk4NDgzM19DT05TVEFOVF9MQVRFTkNZOworCXJjID0gYm54MnhfODQ4MzNfY21kX2hkbHIocGh5LCBwYXJhbXMsCisJCVBIWTg0ODMzX0NNRF9TRVRfRUVFX01PREUsIGNtZF9hcmdzKTsKKwlpZiAocmMgIT0gMCkKKwkJRFAoTkVUSUZfTVNHX0xJTkssICJDZmcgQXV0b2dyRUVFbiBmYWlsZWQuXG4iKTsKIAlpZiAoaW5pdGlhbGl6ZSkKIAkJcmMgPSBibngyeF84NDh4eF9jbW5fY29uZmlnX2luaXQocGh5LCBwYXJhbXMsIHZhcnMpOwogCWVsc2UKQEAgLTEwMTQ0LDggKzEwMjE2LDEwIEBACiAJRFAoTkVUSUZfTVNHX0xJTkssICI1NDYxOFNFIGNmZyBpbml0XG4iKTsKIAl1c2xlZXBfcmFuZ2UoMTAwMCwgMTAwMCk7CiAKLQkvKiBUaGlzIHdvcmtzIHdpdGggRTMgb25seSwgbm8gbmVlZCB0byBjaGVjayB0aGUgY2hpcAotCSAgIGJlZm9yZSBkZXRlcm1pbmluZyB0aGUgcG9ydC4gKi8KKwkvKgorCSAqIFRoaXMgd29ya3Mgd2l0aCBFMyBvbmx5LCBubyBuZWVkIHRvIGNoZWNrIHRoZSBjaGlwCisJICogYmVmb3JlIGRldGVybWluaW5nIHRoZSBwb3J0LgorCSAqLwogCXBvcnQgPSBwYXJhbXMtPnBvcnQ7CiAKIAljZmdfcGluID0gKFJFR19SRChicCwgcGFyYW1zLT5zaG1lbV9iYXNlICsKQEAgLTEwMzI3LDYgKzEwNDAxLDQzIEBACiAJcmV0dXJuIDA7CiB9CiAKKworc3RhdGljIHZvaWQgYm54MnhfNTQ2MXhfc2V0X2xpbmtfbGVkKHN0cnVjdCBibngyeF9waHkgKnBoeSwKKwkJCQkgICAgICAgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsIHU4IG1vZGUpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IHBhcmFtcy0+YnA7CisJdTE2IHRlbXA7CisKKwlibngyeF9jbDIyX3dyaXRlKGJwLCBwaHksCisJCU1ESU9fUkVHX0dQSFlfU0hBRE9XLAorCQlNRElPX1JFR19HUEhZX1NIQURPV19MRURfU0VMMSk7CisJYm54MnhfY2wyMl9yZWFkKGJwLCBwaHksCisJCU1ESU9fUkVHX0dQSFlfU0hBRE9XLAorCQkmdGVtcCk7CisJdGVtcCAmPSAweGZmMDA7CisKKwlEUChORVRJRl9NU0dfTElOSywgIjU0NjE4eCBzZXQgbGluayBsZWQgKG1vZGU9JXgpXG4iLCBtb2RlKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIExFRF9NT0RFX0ZST05UX1BBTkVMX09GRjoKKwljYXNlIExFRF9NT0RFX09GRjoKKwkJdGVtcCB8PSAweDAwZWU7CisJCWJyZWFrOworCWNhc2UgTEVEX01PREVfT1BFUjoKKwkJdGVtcCB8PSAweDAwMDE7CisJCWJyZWFrOworCWNhc2UgTEVEX01PREVfT046CisJCXRlbXAgfD0gMHgwMGZmOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJYm54MnhfY2wyMl93cml0ZShicCwgcGh5LAorCQlNRElPX1JFR19HUEhZX1NIQURPVywKKwkJTURJT19SRUdfR1BIWV9TSEFET1dfV1JfRU5BIHwgdGVtcCk7CisJcmV0dXJuOworfQorCisKIHN0YXRpYyB2b2lkIGJueDJ4XzU0NjE4c2VfbGlua19yZXNldChzdHJ1Y3QgYm54MnhfcGh5ICpwaHksCiAJCQkJICAgICBzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcykKIHsKQEAgLTExMTAzLDcgKzExMjE0LDcgQEAKIAkuY29uZmlnX2xvb3BiYWNrID0gKGNvbmZpZ19sb29wYmFja190KWJueDJ4XzU0NjE4c2VfY29uZmlnX2xvb3BiYWNrLAogCS5mb3JtYXRfZndfdmVyCT0gKGZvcm1hdF9md192ZXJfdClOVUxMLAogCS5od19yZXNldAk9IChod19yZXNldF90KU5VTEwsCi0JLnNldF9saW5rX2xlZAk9IChzZXRfbGlua19sZWRfdClOVUxMLAorCS5zZXRfbGlua19sZWQJPSAoc2V0X2xpbmtfbGVkX3QpYm54MnhfNTQ2MXhfc2V0X2xpbmtfbGVkLAogCS5waHlfc3BlY2lmaWNfZnVuYyA9IChwaHlfc3BlY2lmaWNfZnVuY190KU5VTEwKIH07CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xMTE4MSw3ICsxMTI5Miw5IEBACiAJCQkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBzaG1lbV9yZWdpb24sCiAJCQlkZXZfaW5mby5wb3J0X2ZlYXR1cmVfY29uZmlnW3BvcnRdLmxpbmtfY29uZmlnKSkgJgogCQkJICBQT1JUX0ZFQVRVUkVfQ09OTkVDVEVEX1NXSVRDSF9NQVNLKTsKLQljaGlwX2lkID0gUkVHX1JEKGJwLCBNSVNDX1JFR19DSElQX05VTSkgPDwgMTY7CisJY2hpcF9pZCA9IChSRUdfUkQoYnAsIE1JU0NfUkVHX0NISVBfTlVNKSA8PCAxNikgfAorCQkoKFJFR19SRChicCwgTUlTQ19SRUdfQ0hJUF9SRVYpICYgMHhmKSA8PCAxMik7CisKIAlEUChORVRJRl9NU0dfTElOSywgIjpjaGlwX2lkID0gMHgleFxuIiwgY2hpcF9pZCk7CiAJaWYgKFVTRVNfV0FSUENPUkUoYnApKSB7CiAJCXUzMiBzZXJkZXNfbmV0X2lmOwpAQCAtMTEzNjAsNiArMTE0NzMsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJZGVmYXVsdDoKIAkJKnBoeSA9IHBoeV9udWxsOworCQkvKiBJbiBjYXNlIGV4dGVybmFsIFBIWSB3YXNuJ3QgZm91bmQgKi8KKwkJaWYgKChwaHlfdHlwZSAhPSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9ESVJFQ1QpICYmCisJCSAgICAocGh5X3R5cGUgIT0gUE9SVF9IV19DRkdfWEdYU19FWFRfUEhZX1RZUEVfTk9UX0NPTk4pKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTE1MzMsNyArMTE2NTAsNyBAQAogCiBpbnQgYm54MnhfcGh5X3Byb2JlKHN0cnVjdCBsaW5rX3BhcmFtcyAqcGFyYW1zKQogewotCXU4IHBoeV9pbmRleCwgYWN0dWFsX3BoeV9pZHgsIGxpbmtfY2ZnX2lkeDsKKwl1OCBwaHlfaW5kZXgsIGFjdHVhbF9waHlfaWR4OwogCXUzMiBwaHlfY29uZmlnX3N3YXBwZWQsIHN5bmNfb2Zmc2V0LCBtZWRpYV90eXBlczsKIAlzdHJ1Y3QgYm54MnggKmJwID0gcGFyYW1zLT5icDsKIAlzdHJ1Y3QgYm54MnhfcGh5ICpwaHk7CkBAIC0xMTU0NCw3ICsxMTY2MSw2IEBACiAKIAlmb3IgKHBoeV9pbmRleCA9IElOVF9QSFk7IHBoeV9pbmRleCA8IE1BWF9QSFlTOwogCSAgICAgIHBoeV9pbmRleCsrKSB7Ci0JCWxpbmtfY2ZnX2lkeCA9IExJTktfQ09ORklHX0lEWChwaHlfaW5kZXgpOwogCQlhY3R1YWxfcGh5X2lkeCA9IHBoeV9pbmRleDsKIAkJaWYgKHBoeV9jb25maWdfc3dhcHBlZCkgewogCQkJaWYgKHBoeV9pbmRleCA9PSBFWFRfUEhZMSkKQEAgLTEyMjEwLDYgKzEyMzI2LDYzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYm54MnhfODQ4MzNfY29tbW9uX2luaXRfcGh5KHN0cnVjdCBibngyeCAqYnAsCisJCQkJCQl1MzIgc2htZW1fYmFzZV9wYXRoW10sCisJCQkJCQl1MzIgc2htZW0yX2Jhc2VfcGF0aFtdLAorCQkJCQkJdTggcGh5X2luZGV4LAorCQkJCQkJdTMyIGNoaXBfaWQpCit7CisJdTggcmVzZXRfZ3Bpb3M7CisJc3RydWN0IGJueDJ4X3BoeSBwaHk7CisJdTMyIHNobWVtX2Jhc2UsIHNobWVtMl9iYXNlLCBjbnQ7CisJczggcG9ydCA9IDA7CisJdTE2IHZhbDsKKworCXJlc2V0X2dwaW9zID0gYm54MnhfODQ4MzNfZ2V0X3Jlc2V0X2dwaW9zKGJwLCBzaG1lbV9iYXNlX3BhdGgsIGNoaXBfaWQpOworCWJueDJ4X3NldF9tdWx0X2dwaW8oYnAsIHJlc2V0X2dwaW9zLCBNSVNDX1JFR0lTVEVSU19HUElPX09VVFBVVF9MT1cpOworCXVkZWxheSgxMCk7CisJYm54Mnhfc2V0X211bHRfZ3BpbyhicCwgcmVzZXRfZ3Bpb3MsIE1JU0NfUkVHSVNURVJTX0dQSU9fT1VUUFVUX0hJR0gpOworCURQKE5FVElGX01TR19MSU5LLCAiODQ4MzMgcmVzZXQgcHVsc2Ugb24gcGluIHZhbHVlcyAweCV4XG4iLAorCQlyZXNldF9ncGlvcyk7CisJZm9yIChwb3J0ID0gUE9SVF9NQVggLSAxOyBwb3J0ID49IFBPUlRfMDsgcG9ydC0tKSB7CisJCS8qIFRoaXMgUEhZIGlzIGZvciBFMiBhbmQgRTMuICovCisJCXNobWVtX2Jhc2UgPSBzaG1lbV9iYXNlX3BhdGhbcG9ydF07CisJCXNobWVtMl9iYXNlID0gc2htZW0yX2Jhc2VfcGF0aFtwb3J0XTsKKwkJLyogRXh0cmFjdCB0aGUgZXh0IHBoeSBhZGRyZXNzIGZvciB0aGUgcG9ydCAqLworCQlpZiAoYm54MnhfcG9wdWxhdGVfcGh5KGJwLCBwaHlfaW5kZXgsIHNobWVtX2Jhc2UsIHNobWVtMl9iYXNlLAorCQkJCSAgICAgICAwLCAmcGh5KSAhPQorCQkgICAgMCkgeworCQkJRFAoTkVUSUZfTVNHX0xJTkssICJwb3B1bGF0ZV9waHkgZmFpbGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJLyogV2FpdCBmb3IgRlcgY29tcGxldGluZyBpdHMgaW5pdGlhbGl6YXRpb24uICovCisJCWZvciAoY250ID0gMDsgY250IDwgMTAwMDsgY250KyspIHsKKwkJCWJueDJ4X2NsNDVfcmVhZChicCwgJnBoeSwKKwkJCQlNRElPX1BNQV9ERVZBRCwKKwkJCQlNRElPX1BNQV9SRUdfQ1RSTCwgJnZhbCk7CisJCQlpZiAoISh2YWwgJiAoMTw8MTUpKSkKKwkJCQlicmVhazsKKwkJCW1zbGVlcCgxKTsKKwkJfQorCQlpZiAoY250ID49IDEwMDApCisJCQlEUChORVRJRl9NU0dfTElOSywKKwkJCQkiODQ4MzMgQ21uIHJlc2V0IHRpbWVvdXQgKCVkKVxuIiwgcG9ydCk7CisKKwkJLyogUHV0IHRoZSBwb3J0IGluIHN1cGVyIGlzb2xhdGUgbW9kZS4gKi8KKwkJYm54MnhfY2w0NV9yZWFkKGJwLCAmcGh5LAorCQkJCU1ESU9fQ1RMX0RFVkFELAorCQkJCU1ESU9fODQ4MzNfVE9QX0NGR19YR1BIWV9TVFJBUDEsICZ2YWwpOworCQl2YWwgfD0gTURJT184NDgzM19TVVBFUl9JU09MQVRFOworCQlibngyeF9jbDQ1X3dyaXRlKGJwLCAmcGh5LAorCQkJCU1ESU9fQ1RMX0RFVkFELAorCQkJCU1ESU9fODQ4MzNfVE9QX0NGR19YR1BIWV9TVFJBUDEsIHZhbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwogc3RhdGljIGludCBibngyeF9leHRfcGh5X2NvbW1vbl9pbml0KHN0cnVjdCBibngyeCAqYnAsIHUzMiBzaG1lbV9iYXNlX3BhdGhbXSwKIAkJCQkgICAgIHUzMiBzaG1lbTJfYmFzZV9wYXRoW10sIHU4IHBoeV9pbmRleCwKIAkJCQkgICAgIHUzMiBleHRfcGh5X3R5cGUsIHUzMiBjaGlwX2lkKQpAQCAtMTIyNDQsNyArMTI0MTcsOSBAQAogCQkgKiBHUElPMydzIGFyZSBsaW5rZWQsIGFuZCBzbyBib3RoIG5lZWQgdG8gYmUgdG9nZ2xlZAogCQkgKiB0byBvYnRhaW4gcmVxdWlyZWQgMnVzIHB1bHNlLgogCQkgKi8KLQkJcmMgPSBibngyeF84NDgzM19jb21tb25faW5pdF9waHkoYnAsIHNobWVtX2Jhc2VfcGF0aCwgY2hpcF9pZCk7CisJCXJjID0gYm54MnhfODQ4MzNfY29tbW9uX2luaXRfcGh5KGJwLCBzaG1lbV9iYXNlX3BhdGgsCisJCQkJCQlzaG1lbTJfYmFzZV9wYXRoLAorCQkJCQkJcGh5X2luZGV4LCBjaGlwX2lkKTsKIAkJYnJlYWs7CiAJY2FzZSBQT1JUX0hXX0NGR19YR1hTX0VYVF9QSFlfVFlQRV9GQUlMVVJFOgogCQlyYyA9IC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9saW5rLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9saW5rLmgKaW5kZXggMmE0NmU2My4uZTAyYTY4YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbGluay5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X2xpbmsuaApAQCAtNDc5LDcgKzQ3OSw3IEBACiAvKiAgQ29uZmlndXJlIHRoZSBDT1MgdG8gRVRTIGFjY29yZGluZyB0byBCVyBhbmQgU1Agc2V0dGluZ3MuKi8KIGludCBibngyeF9ldHNfZTNiMF9jb25maWcoY29uc3Qgc3RydWN0IGxpbmtfcGFyYW1zICpwYXJhbXMsCiAJCQkgY29uc3Qgc3RydWN0IGxpbmtfdmFycyAqdmFycywKLQkJCSBjb25zdCBzdHJ1Y3QgYm54MnhfZXRzX3BhcmFtcyAqZXRzX3BhcmFtcyk7CisJCQkgc3RydWN0IGJueDJ4X2V0c19wYXJhbXMgKmV0c19wYXJhbXMpOwogLyogUmVhZCBwZmMgc3RhdGlzdGljKi8KIHZvaWQgYm54MnhfcGZjX3N0YXRpc3RpYyhzdHJ1Y3QgbGlua19wYXJhbXMgKnBhcmFtcywgc3RydWN0IGxpbmtfdmFycyAqdmFycywKIAkJCQkJCSB1MzIgcGZjX2ZyYW1lc19zZW50WzJdLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfbWFpbi5jCmluZGV4IDJmNjM2MWUuLmZmZWFhYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9tYWluLmMKQEAgLTIzMTgsMTIgKzIzMTgsNiBAQAogCQkJCQlDTU5HX0ZMQUdTX1BFUl9QT1JUX0ZBSVJORVNTX1ZOOwogfQogCi0vKiByZXR1cm5zIGZ1bmMgYnkgVk4gZm9yIGN1cnJlbnQgcG9ydCAqLwotc3RhdGljIGlubGluZSBpbnQgZnVuY19ieV92bihzdHJ1Y3QgYm54MnggKmJwLCBpbnQgdm4pCi17Ci0JcmV0dXJuIDIgKiB2biArIEJQX1BPUlQoYnApOwotfQotCiBzdGF0aWMgdm9pZCBibngyeF9pbml0X3ZuX21pbm1heChzdHJ1Y3QgYm54MnggKmJwLCBpbnQgdm4pCiB7CiAJc3RydWN0IHJhdGVfc2hhcGluZ192YXJzX3Blcl92biBtX3JzX3ZuOwpAQCAtMjQ3NSwyMiArMjQ2OSw2IEBACiAJICAgInJhdGUgc2hhcGluZyBhbmQgZmFpcm5lc3MgYXJlIGRpc2FibGVkXG4iKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X2xpbmtfc3luY19ub3RpZnkoc3RydWN0IGJueDJ4ICpicCkKLXsKLQlpbnQgZnVuYzsKLQlpbnQgdm47Ci0KLQkvKiBTZXQgdGhlIGF0dGVudGlvbiB0b3dhcmRzIG90aGVyIGRyaXZlcnMgb24gdGhlIHNhbWUgcG9ydCAqLwotCWZvciAodm4gPSBWTl8wOyB2biA8IEJQX01BWF9WTl9OVU0oYnApOyB2bisrKSB7Ci0JCWlmICh2biA9PSBCUF9WTihicCkpCi0JCQljb250aW51ZTsKLQotCQlmdW5jID0gZnVuY19ieV92bihicCwgdm4pOwotCQlSRUdfV1IoYnAsIE1JU0NfUkVHX0FFVV9HRU5FUkFMX0FUVE5fMCArCi0JCSAgICAgICAoTElOS19TWU5DX0FUVEVOVElPTl9CSVRfRlVOQ18wICsgZnVuYykqNCwgMSk7Ci0JfQotfQotCiAvKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB1cG9uIGxpbmsgaW50ZXJydXB0ICovCiBzdGF0aWMgdm9pZCBibngyeF9saW5rX2F0dG4oc3RydWN0IGJueDJ4ICpicCkKIHsKQEAgLTI1NDksNiArMjUyNyw5IEBACiAJaWYgKGJwLT5zdGF0ZSAhPSBCTlgyWF9TVEFURV9PUEVOKQogCQlyZXR1cm47CiAKKwkvKiByZWFkIHVwZGF0ZWQgZGNiIGNvbmZpZ3VyYXRpb24gKi8KKwlibngyeF9kY2J4X3BtZl91cGRhdGUoYnApOworCiAJYm54MnhfbGlua19zdGF0dXNfdXBkYXRlKCZicC0+bGlua19wYXJhbXMsICZicC0+bGlua192YXJzKTsKIAogCWlmIChicC0+bGlua192YXJzLmxpbmtfdXApCkBAIC0yNjQzLDE1ICsyNjI0LDYgQEAKIAlyZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB1OCBzdGF0X2NvdW50ZXJfdmFsaWQoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Zhc3RwYXRoICpmcCkKLXsKLSNpZmRlZiBCQ01fQ05JQwotCS8qIFN0YXRpc3RpY3MgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIENOSUMgQ2xpZW50cyBhdCB0aGUgbW9tZW50ICovCi0JaWYgKElTX0ZDT0VfRlAoZnApKQotCQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLQlyZXR1cm4gdHJ1ZTsKLX0KIAogdm9pZCBibngyeF9mdW5jX2luaXQoc3RydWN0IGJueDJ4ICpicCwgc3RydWN0IGJueDJ4X2Z1bmNfaW5pdF9wYXJhbXMgKnApCiB7CkBAIC0yNjk1LDExICsyNjY3LDExIEBACiAJICogIHBhcmVudCBjb25uZWN0aW9uKS4gVGhlIHN0YXRpc3RpY3MgYXJlIHplcm9lZCB3aGVuIHRoZSBwYXJlbnQKIAkgKiAgY29ubmVjdGlvbiBpcyBpbml0aWFsaXplZC4KIAkgKi8KLQlpZiAoc3RhdF9jb3VudGVyX3ZhbGlkKGJwLCBmcCkpIHsKLQkJX19zZXRfYml0KEJOWDJYX1FfRkxHX1NUQVRTLCAmZmxhZ3MpOwotCQlpZiAoemVyb19zdGF0cykKLQkJCV9fc2V0X2JpdChCTlgyWF9RX0ZMR19aRVJPX1NUQVRTLCAmZmxhZ3MpOwotCX0KKworCV9fc2V0X2JpdChCTlgyWF9RX0ZMR19TVEFUUywgJmZsYWdzKTsKKwlpZiAoemVyb19zdGF0cykKKwkJX19zZXRfYml0KEJOWDJYX1FfRkxHX1pFUk9fU1RBVFMsICZmbGFncyk7CisKIAogCXJldHVybiBmbGFnczsKIH0KQEAgLTI4MDgsOCArMjc4MCw4IEBACiAJLyogVGhpcyBzaG91bGQgYmUgYSBtYXhpbXVtIG51bWJlciBvZiBkYXRhIGJ5dGVzIHRoYXQgbWF5IGJlCiAJICogcGxhY2VkIG9uIHRoZSBCRCAobm90IGluY2x1ZGluZyBwYWRkaW5ncykuCiAJICovCi0JcnhxX2luaXQtPmJ1Zl9zeiA9IGZwLT5yeF9idWZfc2l6ZSAtIEJOWDJYX0ZXX1JYX0FMSUdOIC0KLQkJSVBfSEVBREVSX0FMSUdOTUVOVF9QQURESU5HOworCXJ4cV9pbml0LT5idWZfc3ogPSBmcC0+cnhfYnVmX3NpemUgLSBCTlgyWF9GV19SWF9BTElHTl9TVEFSVCAtCisJCUJOWDJYX0ZXX1JYX0FMSUdOX0VORCAtCUlQX0hFQURFUl9BTElHTk1FTlRfUEFERElORzsKIAogCXJ4cV9pbml0LT5jbF9xem9uZV9pZCA9IGZwLT5jbF9xem9uZV9pZDsKIAlyeHFfaW5pdC0+dHBhX2FnZ19zeiA9IHRwYV9hZ2dfc2l6ZTsKQEAgLTI5NDAsNiArMjkxMiwxNDMgQEAKIAkgKi8KIH0KIAorI2RlZmluZSBEUlZfSU5GT19FVEhfU1RBVF9OVU1fTUFDU19SRVFVSVJFRCAzCisKK3N0YXRpYyB2b2lkIGJueDJ4X2Rydl9pbmZvX2V0aGVyX3N0YXQoc3RydWN0IGJueDJ4ICpicCkKK3sKKwlzdHJ1Y3QgZXRoX3N0YXRzX2luZm8gKmV0aGVyX3N0YXQgPQorCQkmYnAtPnNsb3dwYXRoLT5kcnZfaW5mb190b19tY3AuZXRoZXJfc3RhdDsKKworCS8qIGxlYXZlIGxhc3QgY2hhciBhcyBOVUxMICovCisJbWVtY3B5KGV0aGVyX3N0YXQtPnZlcnNpb24sIERSVl9NT0RVTEVfVkVSU0lPTiwKKwkgICAgICAgRVRIX1NUQVRfSU5GT19WRVJTSU9OX0xFTiAtIDEpOworCisJYnAtPmZwWzBdLm1hY19vYmouZ2V0X25fZWxlbWVudHMoYnAsICZicC0+ZnBbMF0ubWFjX29iaiwKKwkJCQkJIERSVl9JTkZPX0VUSF9TVEFUX05VTV9NQUNTX1JFUVVJUkVELAorCQkJCQkgZXRoZXJfc3RhdC0+bWFjX2xvY2FsKTsKKworCWV0aGVyX3N0YXQtPm10dV9zaXplID0gYnAtPmRldi0+bXR1OworCisJaWYgKGJwLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pCisJCWV0aGVyX3N0YXQtPmZlYXR1cmVfZmxhZ3MgfD0gRkVBVFVSRV9FVEhfQ0hLU1VNX09GRkxPQURfTUFTSzsKKwlpZiAoYnAtPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1RTTykKKwkJZXRoZXJfc3RhdC0+ZmVhdHVyZV9mbGFncyB8PSBGRUFUVVJFX0VUSF9MU09fTUFTSzsKKwlldGhlcl9zdGF0LT5mZWF0dXJlX2ZsYWdzIHw9IGJwLT5jb21tb24uYm9vdF9tb2RlOworCisJZXRoZXJfc3RhdC0+cHJvbWlzY3VvdXNfbW9kZSA9IChicC0+ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSA/IDEgOiAwOworCisJZXRoZXJfc3RhdC0+dHhxX3NpemUgPSBicC0+dHhfcmluZ19zaXplOworCWV0aGVyX3N0YXQtPnJ4cV9zaXplID0gYnAtPnJ4X3Jpbmdfc2l6ZTsKK30KKworc3RhdGljIHZvaWQgYm54MnhfZHJ2X2luZm9fZmNvZV9zdGF0KHN0cnVjdCBibngyeCAqYnApCit7CisjaWZkZWYgQkNNX0NOSUMKKwlzdHJ1Y3QgYm54MnhfZGNieF9hcHBfcGFyYW1zICphcHAgPSAmYnAtPmRjYnhfcG9ydF9wYXJhbXMuYXBwOworCXN0cnVjdCBmY29lX3N0YXRzX2luZm8gKmZjb2Vfc3RhdCA9CisJCSZicC0+c2xvd3BhdGgtPmRydl9pbmZvX3RvX21jcC5mY29lX3N0YXQ7CisKKwltZW1jcHkoZmNvZV9zdGF0LT5tYWNfbG9jYWwsIGJwLT5maXBfbWFjLCBFVEhfQUxFTik7CisKKwlmY29lX3N0YXQtPnFvc19wcmlvcml0eSA9CisJCWFwcC0+dHJhZmZpY190eXBlX3ByaW9yaXR5W0xMRkNfVFJBRkZJQ19UWVBFX0ZDT0VdOworCisJLyogaW5zZXJ0IEZDb0Ugc3RhdHMgZnJvbSByYW1yb2QgcmVzcG9uc2UgKi8KKwlpZiAoIU5PX0ZDT0UoYnApKSB7CisJCXN0cnVjdCB0c3Rvcm1fcGVyX3F1ZXVlX3N0YXRzICpmY29lX3FfdHN0b3JtX3N0YXRzID0KKwkJCSZicC0+Zndfc3RhdHNfZGF0YS0+cXVldWVfc3RhdHNbRkNPRV9JRFhdLgorCQkJdHN0b3JtX3F1ZXVlX3N0YXRpc3RpY3M7CisKKwkJc3RydWN0IHhzdG9ybV9wZXJfcXVldWVfc3RhdHMgKmZjb2VfcV94c3Rvcm1fc3RhdHMgPQorCQkJJmJwLT5md19zdGF0c19kYXRhLT5xdWV1ZV9zdGF0c1tGQ09FX0lEWF0uCisJCQl4c3Rvcm1fcXVldWVfc3RhdGlzdGljczsKKworCQlzdHJ1Y3QgZmNvZV9zdGF0aXN0aWNzX3BhcmFtcyAqZndfZmNvZV9zdGF0ID0KKwkJCSZicC0+Zndfc3RhdHNfZGF0YS0+ZmNvZTsKKworCQlBRERfNjQoZmNvZV9zdGF0LT5yeF9ieXRlc19oaSwgMCwgZmNvZV9zdGF0LT5yeF9ieXRlc19sbywKKwkJICAgICAgIGZ3X2Zjb2Vfc3RhdC0+cnhfc3RhdDAuZmNvZV9yeF9ieXRlX2NudCk7CisKKwkJQUREXzY0KGZjb2Vfc3RhdC0+cnhfYnl0ZXNfaGksCisJCSAgICAgICBmY29lX3FfdHN0b3JtX3N0YXRzLT5yY3ZfdWNhc3RfYnl0ZXMuaGksCisJCSAgICAgICBmY29lX3N0YXQtPnJ4X2J5dGVzX2xvLAorCQkgICAgICAgZmNvZV9xX3RzdG9ybV9zdGF0cy0+cmN2X3VjYXN0X2J5dGVzLmxvKTsKKworCQlBRERfNjQoZmNvZV9zdGF0LT5yeF9ieXRlc19oaSwKKwkJICAgICAgIGZjb2VfcV90c3Rvcm1fc3RhdHMtPnJjdl9iY2FzdF9ieXRlcy5oaSwKKwkJICAgICAgIGZjb2Vfc3RhdC0+cnhfYnl0ZXNfbG8sCisJCSAgICAgICBmY29lX3FfdHN0b3JtX3N0YXRzLT5yY3ZfYmNhc3RfYnl0ZXMubG8pOworCisJCUFERF82NChmY29lX3N0YXQtPnJ4X2J5dGVzX2hpLAorCQkgICAgICAgZmNvZV9xX3RzdG9ybV9zdGF0cy0+cmN2X21jYXN0X2J5dGVzLmhpLAorCQkgICAgICAgZmNvZV9zdGF0LT5yeF9ieXRlc19sbywKKwkJICAgICAgIGZjb2VfcV90c3Rvcm1fc3RhdHMtPnJjdl9tY2FzdF9ieXRlcy5sbyk7CisKKwkJQUREXzY0KGZjb2Vfc3RhdC0+cnhfZnJhbWVzX2hpLCAwLCBmY29lX3N0YXQtPnJ4X2ZyYW1lc19sbywKKwkJICAgICAgIGZ3X2Zjb2Vfc3RhdC0+cnhfc3RhdDAuZmNvZV9yeF9wa3RfY250KTsKKworCQlBRERfNjQoZmNvZV9zdGF0LT5yeF9mcmFtZXNfaGksIDAsIGZjb2Vfc3RhdC0+cnhfZnJhbWVzX2xvLAorCQkgICAgICAgZmNvZV9xX3RzdG9ybV9zdGF0cy0+cmN2X3VjYXN0X3BrdHMpOworCisJCUFERF82NChmY29lX3N0YXQtPnJ4X2ZyYW1lc19oaSwgMCwgZmNvZV9zdGF0LT5yeF9mcmFtZXNfbG8sCisJCSAgICAgICBmY29lX3FfdHN0b3JtX3N0YXRzLT5yY3ZfYmNhc3RfcGt0cyk7CisKKwkJQUREXzY0KGZjb2Vfc3RhdC0+cnhfZnJhbWVzX2hpLCAwLCBmY29lX3N0YXQtPnJ4X2ZyYW1lc19sbywKKwkJICAgICAgIGZjb2VfcV90c3Rvcm1fc3RhdHMtPnJjdl9tY2FzdF9wa3RzKTsKKworCQlBRERfNjQoZmNvZV9zdGF0LT50eF9ieXRlc19oaSwgMCwgZmNvZV9zdGF0LT50eF9ieXRlc19sbywKKwkJICAgICAgIGZ3X2Zjb2Vfc3RhdC0+dHhfc3RhdC5mY29lX3R4X2J5dGVfY250KTsKKworCQlBRERfNjQoZmNvZV9zdGF0LT50eF9ieXRlc19oaSwKKwkJICAgICAgIGZjb2VfcV94c3Rvcm1fc3RhdHMtPnVjYXN0X2J5dGVzX3NlbnQuaGksCisJCSAgICAgICBmY29lX3N0YXQtPnR4X2J5dGVzX2xvLAorCQkgICAgICAgZmNvZV9xX3hzdG9ybV9zdGF0cy0+dWNhc3RfYnl0ZXNfc2VudC5sbyk7CisKKwkJQUREXzY0KGZjb2Vfc3RhdC0+dHhfYnl0ZXNfaGksCisJCSAgICAgICBmY29lX3FfeHN0b3JtX3N0YXRzLT5iY2FzdF9ieXRlc19zZW50LmhpLAorCQkgICAgICAgZmNvZV9zdGF0LT50eF9ieXRlc19sbywKKwkJICAgICAgIGZjb2VfcV94c3Rvcm1fc3RhdHMtPmJjYXN0X2J5dGVzX3NlbnQubG8pOworCisJCUFERF82NChmY29lX3N0YXQtPnR4X2J5dGVzX2hpLAorCQkgICAgICAgZmNvZV9xX3hzdG9ybV9zdGF0cy0+bWNhc3RfYnl0ZXNfc2VudC5oaSwKKwkJICAgICAgIGZjb2Vfc3RhdC0+dHhfYnl0ZXNfbG8sCisJCSAgICAgICBmY29lX3FfeHN0b3JtX3N0YXRzLT5tY2FzdF9ieXRlc19zZW50LmxvKTsKKworCQlBRERfNjQoZmNvZV9zdGF0LT50eF9mcmFtZXNfaGksIDAsIGZjb2Vfc3RhdC0+dHhfZnJhbWVzX2xvLAorCQkgICAgICAgZndfZmNvZV9zdGF0LT50eF9zdGF0LmZjb2VfdHhfcGt0X2NudCk7CisKKwkJQUREXzY0KGZjb2Vfc3RhdC0+dHhfZnJhbWVzX2hpLCAwLCBmY29lX3N0YXQtPnR4X2ZyYW1lc19sbywKKwkJICAgICAgIGZjb2VfcV94c3Rvcm1fc3RhdHMtPnVjYXN0X3BrdHNfc2VudCk7CisKKwkJQUREXzY0KGZjb2Vfc3RhdC0+dHhfZnJhbWVzX2hpLCAwLCBmY29lX3N0YXQtPnR4X2ZyYW1lc19sbywKKwkJICAgICAgIGZjb2VfcV94c3Rvcm1fc3RhdHMtPmJjYXN0X3BrdHNfc2VudCk7CisKKwkJQUREXzY0KGZjb2Vfc3RhdC0+dHhfZnJhbWVzX2hpLCAwLCBmY29lX3N0YXQtPnR4X2ZyYW1lc19sbywKKwkJICAgICAgIGZjb2VfcV94c3Rvcm1fc3RhdHMtPm1jYXN0X3BrdHNfc2VudCk7CisJfQorCisJLyogYXNrIEw1IGRyaXZlciB0byBhZGQgZGF0YSB0byB0aGUgc3RydWN0ICovCisJYm54MnhfY25pY19ub3RpZnkoYnAsIENOSUNfQ1RMX0ZDT0VfU1RBVFNfR0VUX0NNRCk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgYm54MnhfZHJ2X2luZm9faXNjc2lfc3RhdChzdHJ1Y3QgYm54MnggKmJwKQoreworI2lmZGVmIEJDTV9DTklDCisJc3RydWN0IGJueDJ4X2RjYnhfYXBwX3BhcmFtcyAqYXBwID0gJmJwLT5kY2J4X3BvcnRfcGFyYW1zLmFwcDsKKwlzdHJ1Y3QgaXNjc2lfc3RhdHNfaW5mbyAqaXNjc2lfc3RhdCA9CisJCSZicC0+c2xvd3BhdGgtPmRydl9pbmZvX3RvX21jcC5pc2NzaV9zdGF0OworCisJbWVtY3B5KGlzY3NpX3N0YXQtPm1hY19sb2NhbCwgYnAtPmNuaWNfZXRoX2Rldi5pc2NzaV9tYWMsIEVUSF9BTEVOKTsKKworCWlzY3NpX3N0YXQtPnFvc19wcmlvcml0eSA9CisJCWFwcC0+dHJhZmZpY190eXBlX3ByaW9yaXR5W0xMRkNfVFJBRkZJQ19UWVBFX0lTQ1NJXTsKKworCS8qIGFzayBMNSBkcml2ZXIgdG8gYWRkIGRhdGEgdG8gdGhlIHN0cnVjdCAqLworCWJueDJ4X2NuaWNfbm90aWZ5KGJwLCBDTklDX0NUTF9JU0NTSV9TVEFUU19HRVRfQ01EKTsKKyNlbmRpZgorfQorCiAvKiBjYWxsZWQgZHVlIHRvIE1DUCBldmVudCAob24gcG1mKToKICAqCXJlcmVhZCBuZXcgYmFuZHdpZHRoIGNvbmZpZ3VyYXRpb24KICAqCWNvbmZpZ3VyZSBGVwpAQCAtMjk2MCw2ICszMDY5LDUwIEBACiAJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX1NFVF9NRl9CV19BQ0ssIDApOwogfQogCitzdGF0aWMgdm9pZCBibngyeF9oYW5kbGVfZHJ2X2luZm9fcmVxKHN0cnVjdCBibngyeCAqYnApCit7CisJZW51bSBkcnZfaW5mb19vcGNvZGUgb3BfY29kZTsKKwl1MzIgZHJ2X2luZm9fY3RsID0gU0hNRU0yX1JEKGJwLCBkcnZfaW5mb19jb250cm9sKTsKKworCS8qIGlmIGRydl9pbmZvIHZlcnNpb24gc3VwcG9ydGVkIGJ5IE1GVyBkb2Vzbid0IG1hdGNoIC0gc2VuZCBOQUNLICovCisJaWYgKChkcnZfaW5mb19jdGwgJiBEUlZfSU5GT19DT05UUk9MX1ZFUl9NQVNLKSAhPSBEUlZfSU5GT19DVVJfVkVSKSB7CisJCWJueDJ4X2Z3X2NvbW1hbmQoYnAsIERSVl9NU0dfQ09ERV9EUlZfSU5GT19OQUNLLCAwKTsKKwkJcmV0dXJuOworCX0KKworCW9wX2NvZGUgPSAoZHJ2X2luZm9fY3RsICYgRFJWX0lORk9fQ09OVFJPTF9PUF9DT0RFX01BU0spID4+CisJCSAgRFJWX0lORk9fQ09OVFJPTF9PUF9DT0RFX1NISUZUOworCisJbWVtc2V0KCZicC0+c2xvd3BhdGgtPmRydl9pbmZvX3RvX21jcCwgMCwKKwkgICAgICAgc2l6ZW9mKHVuaW9uIGRydl9pbmZvX3RvX21jcCkpOworCisJc3dpdGNoIChvcF9jb2RlKSB7CisJY2FzZSBFVEhfU1RBVFNfT1BDT0RFOgorCQlibngyeF9kcnZfaW5mb19ldGhlcl9zdGF0KGJwKTsKKwkJYnJlYWs7CisJY2FzZSBGQ09FX1NUQVRTX09QQ09ERToKKwkJYm54MnhfZHJ2X2luZm9fZmNvZV9zdGF0KGJwKTsKKwkJYnJlYWs7CisJY2FzZSBJU0NTSV9TVEFUU19PUENPREU6CisJCWJueDJ4X2Rydl9pbmZvX2lzY3NpX3N0YXQoYnApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBpZiBvcCBjb2RlIGlzbid0IHN1cHBvcnRlZCAtIHNlbmQgTkFDSyAqLworCQlibngyeF9md19jb21tYW5kKGJwLCBEUlZfTVNHX0NPREVfRFJWX0lORk9fTkFDSywgMCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBpZiB3ZSBnb3QgZHJ2X2luZm8gYXR0biBmcm9tIE1GVyB0aGVuIHRoZXNlIGZpZWxkcyBhcmUgZGVmaW5lZCBpbgorCSAqIHNobWVtMiBmb3Igc3VyZQorCSAqLworCVNITUVNMl9XUihicCwgZHJ2X2luZm9faG9zdF9hZGRyX2xvLAorCQlVNjRfTE8oYm54Mnhfc3BfbWFwcGluZyhicCwgZHJ2X2luZm9fdG9fbWNwKSkpOworCVNITUVNMl9XUihicCwgZHJ2X2luZm9faG9zdF9hZGRyX2hpLAorCQlVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgZHJ2X2luZm9fdG9fbWNwKSkpOworCisJYm54MnhfZndfY29tbWFuZChicCwgRFJWX01TR19DT0RFX0RSVl9JTkZPX0FDSywgMCk7Cit9CisKIHN0YXRpYyB2b2lkIGJueDJ4X2RjY19ldmVudChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgZGNjX2V2ZW50KQogewogCURQKEJOWDJYX01TR19NQ1AsICJkY2NfZXZlbnQgMHgleFxuIiwgZGNjX2V2ZW50KTsKQEAgLTMzMTgsNiArMzQ3MSwxNyBAQAogCW5ldGRldl9lcnIoYnAtPmRldiwgIkZhbiBGYWlsdXJlIG9uIE5ldHdvcmsgQ29udHJvbGxlciBoYXMgY2F1c2VkIgogCSAgICAgICAiIHRoZSBkcml2ZXIgdG8gc2h1dGRvd24gdGhlIGNhcmQgdG8gcHJldmVudCBwZXJtYW5lbnQiCiAJICAgICAgICIgZGFtYWdlLiAgUGxlYXNlIGNvbnRhY3QgT0VNIFN1cHBvcnQgZm9yIGFzc2lzdGFuY2VcbiIpOworCisJLyoKKwkgKiBTY2hldWRsZSBkZXZpY2UgcmVzZXQgKHVubG9hZCkKKwkgKiBUaGlzIGlzIGR1ZSB0byBzb21lIGJvYXJkcyBjb25zdW1pbmcgc3VmZmljaWVudCBwb3dlciB3aGVuIGRyaXZlciBpcworCSAqIHVwIHRvIG92ZXJoZWF0IGlmIGZhbiBmYWlscy4KKwkgKi8KKwlzbXBfbWJfX2JlZm9yZV9jbGVhcl9iaXQoKTsKKwlzZXRfYml0KEJOWDJYX1NQX1JUTkxfRkFOX0ZBSUxVUkUsICZicC0+c3BfcnRubF9zdGF0ZSk7CisJc21wX21iX19hZnRlcl9jbGVhcl9iaXQoKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmJwLT5zcF9ydG5sX3Rhc2ssIDApOworCiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBibngyeF9hdHRuX2ludF9kZWFzc2VydGVkMChzdHJ1Y3QgYm54MnggKmJwLCB1MzIgYXR0bikKQEAgLTM0NTYsNiArMzYyMCw4IEBACiAJCQlpZiAodmFsICYgRFJWX1NUQVRVU19TRVRfTUZfQlcpCiAJCQkJYm54Mnhfc2V0X21mX2J3KGJwKTsKIAorCQkJaWYgKHZhbCAmIERSVl9TVEFUVVNfRFJWX0lORk9fUkVRKQorCQkJCWJueDJ4X2hhbmRsZV9kcnZfaW5mb19yZXEoYnApOwogCQkJaWYgKChicC0+cG9ydC5wbWYgPT0gMCkgJiYgKHZhbCAmIERSVl9TVEFUVVNfUE1GKSkKIAkJCQlibngyeF9wbWZfdXBkYXRlKGJwKTsKIApAQCAtNTI0Nyw3ICs1NDEzLDcgQEAKIAl1OCBjb3M7CiAJdW5zaWduZWQgbG9uZyBxX3R5cGUgPSAwOwogCXUzMiBjaWRzW0JOWDJYX01VTFRJX1RYX0NPU10gPSB7IDAgfTsKLQorCWZwLT5yeF9xdWV1ZSA9IGZwX2lkeDsKIAlmcC0+Y2lkID0gZnBfaWR4OwogCWZwLT5jbF9pZCA9IGJueDJ4X2ZwX2NsX2lkKGZwKTsKIAlmcC0+Zndfc2JfaWQgPSBibngyeF9mcF9md19zYl9pZChmcCk7CkBAIC02ODU2LDEzICs3MDIyLDE2IEBACiBzdGF0aWMgaW5saW5lIGludCBibngyeF9hbGxvY19md19zdGF0c19tZW0oc3RydWN0IGJueDJ4ICpicCkKIHsKIAlpbnQgbnVtX2dyb3VwczsKKwlpbnQgaXNfZmNvZV9zdGF0cyA9IE5PX0ZDT0UoYnApID8gMCA6IDE7CiAKLQkvKiBudW1iZXIgb2YgZXRoX3F1ZXVlcyAqLwotCXU4IG51bV9xdWV1ZV9zdGF0cyA9IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKTsKKwkvKiBudW1iZXIgb2YgcXVldWVzIGZvciBzdGF0aXN0aWNzIGlzIG51bWJlciBvZiBldGggcXVldWVzICsgRkNvRSAqLworCXU4IG51bV9xdWV1ZV9zdGF0cyA9IEJOWDJYX05VTV9FVEhfUVVFVUVTKGJwKSArIGlzX2Zjb2Vfc3RhdHM7CiAKIAkvKiBUb3RhbCBudW1iZXIgb2YgRlcgc3RhdGlzdGljcyByZXF1ZXN0cyA9Ci0JICogMSBmb3IgcG9ydCBzdGF0cyArIDEgZm9yIFBGIHN0YXRzICsgbnVtX2V0aF9xdWV1ZXMgKi8KLQlicC0+Zndfc3RhdHNfbnVtID0gMiArIG51bV9xdWV1ZV9zdGF0czsKKwkgKiAxIGZvciBwb3J0IHN0YXRzICsgMSBmb3IgUEYgc3RhdHMgKyBwb3RlbnRpYWwgMSBmb3IgRkNvRSBzdGF0cyArCisJICogbnVtIG9mIHF1ZXVlcworCSAqLworCWJwLT5md19zdGF0c19udW0gPSAyICsgaXNfZmNvZV9zdGF0cyArIG51bV9xdWV1ZV9zdGF0czsKIAogCiAJLyogUmVxdWVzdCBpcyBidWlsdCBmcm9tIHN0YXRzX3F1ZXJ5X2hlYWRlciBhbmQgYW4gYXJyYXkgb2YKQEAgLTY4NzAsOCArNzAzOSw4IEBACiAJICogU1RBVFNfUVVFUllfQ01EX0NPVU5UIHJ1bGVzLiBUaGUgcmVhbCBudW1iZXIgb3IgcmVxdWVzdHMgaXMKIAkgKiBjb25maWd1cmVkIGluIHRoZSBzdGF0c19xdWVyeV9oZWFkZXIuCiAJICovCi0JbnVtX2dyb3VwcyA9ICgyICsgbnVtX3F1ZXVlX3N0YXRzKSAvIFNUQVRTX1FVRVJZX0NNRF9DT1VOVCArCi0JCSgoKDIgKyBudW1fcXVldWVfc3RhdHMpICUgU1RBVFNfUVVFUllfQ01EX0NPVU5UKSA/IDEgOiAwKTsKKwludW1fZ3JvdXBzID0gKChicC0+Zndfc3RhdHNfbnVtKSAvIFNUQVRTX1FVRVJZX0NNRF9DT1VOVCkgKworCQkgICAgICgoKGJwLT5md19zdGF0c19udW0pICUgU1RBVFNfUVVFUllfQ01EX0NPVU5UKSA/IDEgOiAwKTsKIAogCWJwLT5md19zdGF0c19yZXFfc3ogPSBzaXplb2Yoc3RydWN0IHN0YXRzX3F1ZXJ5X2hlYWRlcikgKwogCQkJbnVtX2dyb3VwcyAqIHNpemVvZihzdHJ1Y3Qgc3RhdHNfcXVlcnlfY21kX2dyb3VwKTsKQEAgLTY4ODAsOSArNzA0OSwxMyBAQAogCSAqCiAJICogc3RhdHNfY291bnRlciBob2xkcyBwZXItU1RPUk0gY291bnRlcnMgdGhhdCBhcmUgaW5jcmVtZW50ZWQKIAkgKiB3aGVuIFNUT1JNIGhhcyBmaW5pc2hlZCB3aXRoIHRoZSBjdXJyZW50IHJlcXVlc3QuCisJICoKKwkgKiBtZW1vcnkgZm9yIEZDb0Ugb2ZmbG9hZGVkIHN0YXRpc3RpY3MgYXJlIGNvdW50ZWQgYW55d2F5LAorCSAqIGV2ZW4gaWYgdGhleSB3aWxsIG5vdCBiZSBzZW50LgogCSAqLwogCWJwLT5md19zdGF0c19kYXRhX3N6ID0gc2l6ZW9mKHN0cnVjdCBwZXJfcG9ydF9zdGF0cykgKwogCQlzaXplb2Yoc3RydWN0IHBlcl9wZl9zdGF0cykgKworCQlzaXplb2Yoc3RydWN0IGZjb2Vfc3RhdGlzdGljc19wYXJhbXMpICsKIAkJc2l6ZW9mKHN0cnVjdCBwZXJfcXVldWVfc3RhdHMpICogbnVtX3F1ZXVlX3N0YXRzICsKIAkJc2l6ZW9mKHN0cnVjdCBzdGF0c19jb3VudGVyKTsKIApAQCAtNzAyNSw2ICs3MTk4LDEzIEBACiB7CiAJdW5zaWduZWQgbG9uZyByYW1yb2RfZmxhZ3MgPSAwOwogCisjaWZkZWYgQkNNX0NOSUMKKwlpZiAoaXNfemVyb19ldGhlcl9hZGRyKGJwLT5kZXYtPmRldl9hZGRyKSAmJiBJU19NRl9JU0NTSV9TRChicCkpIHsKKwkJRFAoTkVUSUZfTVNHX0lGVVAsICJJZ25vcmluZyBaZXJvIE1BQyBmb3IgaVNDU0kgU0QgbW9kZVxuIik7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCiAJRFAoTkVUSUZfTVNHX0lGVVAsICJBZGRpbmcgRXRoIE1BQ1xuIik7CiAKIAlfX3NldF9iaXQoUkFNUk9EX0NPTVBfV0FJVCwgJnJhbXJvZF9mbGFncyk7CkBAIC04NTIyLDYgKzg3MDIsMTcgQEAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEJOWDJYX1NQX1JUTkxfU0VUVVBfVEMsICZicC0+c3BfcnRubF9zdGF0ZSkpCiAJCWJueDJ4X3NldHVwX3RjKGJwLT5kZXYsIGJwLT5kY2J4X3BvcnRfcGFyYW1zLmV0cy5udW1fb2ZfY29zKTsKIAorCS8qCisJICogaW4gY2FzZSBvZiBmYW4gZmFpbHVyZSB3ZSBuZWVkIHRvIHJlc2V0IGlkIGlmIHRoZSAic3RvcCBvbiBlcnJvciIKKwkgKiBkZWJ1ZyBmbGFnIGlzIHNldCwgc2luY2Ugd2UgdHJ5aW5nIHRvIHByZXZlbnQgcGVybWFuZW50IG92ZXJoZWF0aW5nCisJICogZGFtYWdlCisJICovCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChCTlgyWF9TUF9SVE5MX0ZBTl9GQUlMVVJFLCAmYnAtPnNwX3J0bmxfc3RhdGUpKSB7CisJCURQKEJOWDJYX01TR19TUCwgImZhbiBmYWlsdXJlIGRldGVjdGVkLiBVbmxvYWRpbmcgZHJpdmVyXG4iKTsKKwkJbmV0aWZfZGV2aWNlX2RldGFjaChicC0+ZGV2KTsKKwkJYm54MnhfY2xvc2UoYnAtPmRldik7CisJfQorCiBzcF9ydG5sX2V4aXQ6CiAJcnRubF91bmxvY2soKTsKIH0KQEAgLTg3MDgsNyArODg5OSw3IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBibngyeF9nZXRfY29tbW9uX2h3aW5mbyhzdHJ1Y3QgYm54MnggKmJwKQogewotCXUzMiB2YWwsIHZhbDIsIHZhbDMsIHZhbDQsIGlkOworCXUzMiB2YWwsIHZhbDIsIHZhbDMsIHZhbDQsIGlkLCBib290X21vZGU7CiAJdTE2IHBtYzsKIAogCS8qIEdldCB0aGUgY2hpcCByZXZpc2lvbiBpZCBhbmQgbnVtYmVyLiAqLwpAQCAtODgxNyw2ICs5MDA4LDI2IEBACiAJYnAtPmxpbmtfcGFyYW1zLmZlYXR1cmVfY29uZmlnX2ZsYWdzIHw9CiAJCSh2YWwgPj0gUkVRX0JDX1ZFUl80X1NGUF9UWF9ESVNBQkxFX1NVUFBPUlRFRCkgPwogCQlGRUFUVVJFX0NPTkZJR19CQ19TVVBQT1JUU19TRlBfVFhfRElTQUJMRUQgOiAwOworCWJwLT5mbGFncyB8PSAodmFsID49IFJFUV9CQ19WRVJfNF9QRkNfU1RBVFNfU1VQUE9SVEVEKSA/CisJCQlCQ19TVVBQT1JUU19QRkNfU1RBVFMgOiAwOworCisJYm9vdF9tb2RlID0gU0hNRU1fUkQoYnAsCisJCQlkZXZfaW5mby5wb3J0X2ZlYXR1cmVfY29uZmlnW0JQX1BPUlQoYnApXS5tYmFfY29uZmlnKSAmCisJCQlQT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9NQVNLOworCXN3aXRjaCAoYm9vdF9tb2RlKSB7CisJY2FzZSBQT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9QWEU6CisJCWJwLT5jb21tb24uYm9vdF9tb2RlID0gRkVBVFVSRV9FVEhfQk9PVE1PREVfUFhFOworCQlicmVhazsKKwljYXNlIFBPUlRfRkVBVFVSRV9NQkFfQk9PVF9BR0VOVF9UWVBFX0lTQ1NJQjoKKwkJYnAtPmNvbW1vbi5ib290X21vZGUgPSBGRUFUVVJFX0VUSF9CT09UTU9ERV9JU0NTSTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9GQ09FX0JPT1Q6CisJCWJwLT5jb21tb24uYm9vdF9tb2RlID0gRkVBVFVSRV9FVEhfQk9PVE1PREVfRkNPRTsKKwkJYnJlYWs7CisJY2FzZSBQT1JUX0ZFQVRVUkVfTUJBX0JPT1RfQUdFTlRfVFlQRV9OT05FOgorCQlicC0+Y29tbW9uLmJvb3RfbW9kZSA9IEZFQVRVUkVfRVRIX0JPT1RNT0RFX05PTkU7CisJCWJyZWFrOworCX0KIAogCXBjaV9yZWFkX2NvbmZpZ193b3JkKGJwLT5wZGV2LCBicC0+cG1fY2FwICsgUENJX1BNX1BNQywgJnBtYyk7CiAJYnAtPmZsYWdzIHw9IChwbWMgJiBQQ0lfUE1fQ0FQX1BNRV9EM2NvbGQpID8gMCA6IE5PX1dPTF9GTEFHOwpAQCAtOTI2NywyMiArOTQ3OCw0MyBAQAogCQkJCQkJCWJwLT5jb21tb24uc2htZW0yX2Jhc2UpOwogfQogCi0jaWZkZWYgQkNNX0NOSUMKLXN0YXRpYyB2b2lkIF9fZGV2aW5pdCBibngyeF9nZXRfY25pY19pbmZvKHN0cnVjdCBibngyeCAqYnApCit2b2lkIGJueDJ4X2dldF9pc2NzaV9pbmZvKHN0cnVjdCBibngyeCAqYnApCiB7CisjaWZkZWYgQkNNX0NOSUMKIAlpbnQgcG9ydCA9IEJQX1BPUlQoYnApOwotCWludCBmdW5jID0gQlBfQUJTX0ZVTkMoYnApOwogCiAJdTMyIG1heF9pc2NzaV9jb25uID0gRldfRU5DT0RFXzMyQklUX1BBVFRFUk4gXiBTSE1FTV9SRChicCwKIAkJCQlkcnZfbGljX2tleVtwb3J0XS5tYXhfaXNjc2lfY29ubik7Ci0JdTMyIG1heF9mY29lX2Nvbm4gPSBGV19FTkNPREVfMzJCSVRfUEFUVEVSTiBeIFNITUVNX1JEKGJwLAotCQkJCWRydl9saWNfa2V5W3BvcnRdLm1heF9mY29lX2Nvbm4pOwogCi0JLyogR2V0IHRoZSBudW1iZXIgb2YgbWF4aW11bSBhbGxvd2VkIGlTQ1NJIGFuZCBGQ29FIGNvbm5lY3Rpb25zICovCisJLyogR2V0IHRoZSBudW1iZXIgb2YgbWF4aW11bSBhbGxvd2VkIGlTQ1NJIGNvbm5lY3Rpb25zICovCiAJYnAtPmNuaWNfZXRoX2Rldi5tYXhfaXNjc2lfY29ubiA9CiAJCShtYXhfaXNjc2lfY29ubiAmIEJOWDJYX01BWF9JU0NTSV9JTklUX0NPTk5fTUFTSykgPj4KIAkJQk5YMlhfTUFYX0lTQ1NJX0lOSVRfQ09OTl9TSElGVDsKIAorCUJOWDJYX0RFVl9JTkZPKCJtYXhfaXNjc2lfY29ubiAweCV4XG4iLAorCQkgICAgICAgYnAtPmNuaWNfZXRoX2Rldi5tYXhfaXNjc2lfY29ubik7CisKKwkvKgorCSAqIElmIG1heGltdW0gYWxsb3dlZCBudW1iZXIgb2YgY29ubmVjdGlvbnMgaXMgemVybyAtCisJICogZGlzYWJsZSB0aGUgZmVhdHVyZS4KKwkgKi8KKwlpZiAoIWJwLT5jbmljX2V0aF9kZXYubWF4X2lzY3NpX2Nvbm4pCisJCWJwLT5mbGFncyB8PSBOT19JU0NTSV9GTEFHOworI2Vsc2UKKwlicC0+ZmxhZ3MgfD0gTk9fSVNDU0lfRkxBRzsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgYm54MnhfZ2V0X2Zjb2VfaW5mbyhzdHJ1Y3QgYm54MnggKmJwKQoreworI2lmZGVmIEJDTV9DTklDCisJaW50IHBvcnQgPSBCUF9QT1JUKGJwKTsKKwlpbnQgZnVuYyA9IEJQX0FCU19GVU5DKGJwKTsKKworCXUzMiBtYXhfZmNvZV9jb25uID0gRldfRU5DT0RFXzMyQklUX1BBVFRFUk4gXiBTSE1FTV9SRChicCwKKwkJCQlkcnZfbGljX2tleVtwb3J0XS5tYXhfZmNvZV9jb25uKTsKKworCS8qIEdldCB0aGUgbnVtYmVyIG9mIG1heGltdW0gYWxsb3dlZCBGQ29FIGNvbm5lY3Rpb25zICovCiAJYnAtPmNuaWNfZXRoX2Rldi5tYXhfZmNvZV9jb25uID0KIAkJKG1heF9mY29lX2Nvbm4gJiBCTlgyWF9NQVhfRkNPRV9JTklUX0NPTk5fTUFTSykgPj4KIAkJQk5YMlhfTUFYX0ZDT0VfSU5JVF9DT05OX1NISUZUOwpAQCAtOTMzNCwyMSArOTU2NiwyOSBAQAogCQl9CiAJfQogCi0JQk5YMlhfREVWX0lORk8oIm1heF9pc2NzaV9jb25uIDB4JXggbWF4X2Zjb2VfY29ubiAweCV4XG4iLAotCQkgICAgICAgYnAtPmNuaWNfZXRoX2Rldi5tYXhfaXNjc2lfY29ubiwKLQkJICAgICAgIGJwLT5jbmljX2V0aF9kZXYubWF4X2Zjb2VfY29ubik7CisJQk5YMlhfREVWX0lORk8oIm1heF9mY29lX2Nvbm4gMHgleFxuIiwgYnAtPmNuaWNfZXRoX2Rldi5tYXhfZmNvZV9jb25uKTsKIAogCS8qCiAJICogSWYgbWF4aW11bSBhbGxvd2VkIG51bWJlciBvZiBjb25uZWN0aW9ucyBpcyB6ZXJvIC0KIAkgKiBkaXNhYmxlIHRoZSBmZWF0dXJlLgogCSAqLwotCWlmICghYnAtPmNuaWNfZXRoX2Rldi5tYXhfaXNjc2lfY29ubikKLQkJYnAtPmZsYWdzIHw9IE5PX0lTQ1NJX09PT19GTEFHIHwgTk9fSVNDU0lfRkxBRzsKLQogCWlmICghYnAtPmNuaWNfZXRoX2Rldi5tYXhfZmNvZV9jb25uKQogCQlicC0+ZmxhZ3MgfD0gTk9fRkNPRV9GTEFHOwotfQorI2Vsc2UKKwlicC0+ZmxhZ3MgfD0gTk9fRkNPRV9GTEFHOwogI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBibngyeF9nZXRfY25pY19pbmZvKHN0cnVjdCBibngyeCAqYnApCit7CisJLyoKKwkgKiBpU0NTSSBtYXkgYmUgZHluYW1pY2FsbHkgZGlzYWJsZWQgYnV0IHJlYWRpbmcKKwkgKiBpbmZvIGhlcmUgd2Ugd2lsbCBkZWNyZWFzZSBtZW1vcnkgdXNhZ2UgYnkgZHJpdmVyCisJICogaWYgdGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQgZm9yIGdvb2QKKwkgKi8KKwlibngyeF9nZXRfaXNjc2lfaW5mbyhicCk7CisJYm54MnhfZ2V0X2Zjb2VfaW5mbyhicCk7Cit9CiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBibngyeF9nZXRfbWFjX2h3aW5mbyhzdHJ1Y3QgYm54MnggKmJwKQogewpAQCAtOTM3NCw3ICs5NjE0LDggQEAKIAkJCWJueDJ4X3NldF9tYWNfYnVmKGJwLT5kZXYtPmRldl9hZGRyLCB2YWwsIHZhbDIpOwogCiAjaWZkZWYgQkNNX0NOSUMKLQkJLyogaVNDU0kgYW5kIEZDb0UgTlBBUiBNQUNzOiBpZiB0aGVyZSBpcyBubyBlaXRoZXIgaVNDU0kgb3IKKwkJLyoKKwkJICogaVNDU0kgYW5kIEZDb0UgTlBBUiBNQUNzOiBpZiB0aGVyZSBpcyBubyBlaXRoZXIgaVNDU0kgb3IKIAkJICogRkNvRSBNQUMgdGhlbiB0aGUgYXBwcm9wcmlhdGUgZmVhdHVyZSBzaG91bGQgYmUgZGlzYWJsZWQuCiAJCSAqLwogCQlpZiAoSVNfTUZfU0koYnApKSB7CkBAIC05Mzk2LDExICs5NjM3LDIyIEBACiAJCQkJdmFsID0gTUZfQ0ZHX1JEKGJwLCBmdW5jX2V4dF9jb25maWdbZnVuY10uCiAJCQkJCQkgICAgZmNvZV9tYWNfYWRkcl9sb3dlcik7CiAJCQkJYm54Mnhfc2V0X21hY19idWYoZmlwX21hYywgdmFsLCB2YWwyKTsKLQkJCQlCTlgyWF9ERVZfSU5GTygiUmVhZCBGQ29FIEwyIE1BQyB0byAlcE1cbiIsCisJCQkJQk5YMlhfREVWX0lORk8oIlJlYWQgRkNvRSBMMiBNQUM6ICVwTVxuIiwKIAkJCQkJICAgICAgIGZpcF9tYWMpOwogCiAJCQl9IGVsc2UKIAkJCQlicC0+ZmxhZ3MgfD0gTk9fRkNPRV9GTEFHOworCQl9IGVsc2UgeyAvKiBTRCBtb2RlICovCisJCQlpZiAoQk5YMlhfSVNfTUZfUFJPVE9DT0xfSVNDU0koYnApKSB7CisJCQkJLyogdXNlIHByaW1hcnkgbWFjIGFzIGlzY3NpIG1hYyAqLworCQkJCW1lbWNweShpc2NzaV9tYWMsIGJwLT5kZXYtPmRldl9hZGRyLCBFVEhfQUxFTik7CisJCQkJLyogWmVybyBwcmltYXJ5IE1BQyBjb25maWd1cmF0aW9uICovCisJCQkJbWVtc2V0KGJwLT5kZXYtPmRldl9hZGRyLCAwLCBFVEhfQUxFTik7CisKKwkJCQlCTlgyWF9ERVZfSU5GTygiU0QgSVNDU0kgTU9ERVxuIik7CisJCQkJQk5YMlhfREVWX0lORk8oIlJlYWQgaVNDU0kgTUFDOiAlcE1cbiIsCisJCQkJCSAgICAgICBpc2NzaV9tYWMpOworCQkJfQogCQl9CiAjZW5kaWYKIAl9IGVsc2UgewpAQCAtOTQ0OSw3ICs5NzAxLDcgQEAKIAl9CiAjZW5kaWYKIAotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihicC0+ZGV2LT5kZXZfYWRkcikpCisJaWYgKCFibngyeF9pc192YWxpZF9ldGhlcl9hZGRyKGJwLCBicC0+ZGV2LT5kZXZfYWRkcikpCiAJCWRldl9lcnIoJmJwLT5wZGV2LT5kZXYsCiAJCQkiYmFkIEV0aGVybmV0IE1BQyBhZGRyZXNzIGNvbmZpZ3VyYXRpb246ICIKIAkJCSIlcE0sIGNoYW5nZSBpdCBtYW51YWxseSBiZWZvcmUgYnJpbmdpbmcgdXAgIgpAQCAtOTY2MSw5ICs5OTEzLDcgQEAKIAkvKiBHZXQgTUFDIGFkZHJlc3NlcyAqLwogCWJueDJ4X2dldF9tYWNfaHdpbmZvKGJwKTsKIAotI2lmZGVmIEJDTV9DTklDCiAJYm54MnhfZ2V0X2NuaWNfaW5mbyhicCk7Ci0jZW5kaWYKIAogCS8qIEdldCBjdXJyZW50IEZXIHB1bHNlIHNlcXVlbmNlICovCiAJaWYgKCFCUF9OT01DUChicCkpIHsKQEAgLTk2ODEsMzAgKzk5MzEsNDkgQEAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBibngyeF9yZWFkX2Z3aW5mbyhzdHJ1Y3QgYm54MnggKmJwKQogewogCWludCBjbnQsIGksIGJsb2NrX2VuZCwgcm9kaTsKLQljaGFyIHZwZF9kYXRhW0JOWDJYX1ZQRF9MRU4rMV07CisJY2hhciB2cGRfc3RhcnRbQk5YMlhfVlBEX0xFTisxXTsKIAljaGFyIHN0cl9pZF9yZWdbVkVORE9SX0lEX0xFTisxXTsKIAljaGFyIHN0cl9pZF9jYXBbVkVORE9SX0lEX0xFTisxXTsKKwljaGFyICp2cGRfZGF0YTsKKwljaGFyICp2cGRfZXh0ZW5kZWRfZGF0YSA9IE5VTEw7CiAJdTggbGVuOwogCi0JY250ID0gcGNpX3JlYWRfdnBkKGJwLT5wZGV2LCAwLCBCTlgyWF9WUERfTEVOLCB2cGRfZGF0YSk7CisJY250ID0gcGNpX3JlYWRfdnBkKGJwLT5wZGV2LCAwLCBCTlgyWF9WUERfTEVOLCB2cGRfc3RhcnQpOwogCW1lbXNldChicC0+ZndfdmVyLCAwLCBzaXplb2YoYnAtPmZ3X3ZlcikpOwogCiAJaWYgKGNudCA8IEJOWDJYX1ZQRF9MRU4pCiAJCWdvdG8gb3V0X25vdF9mb3VuZDsKIAotCWkgPSBwY2lfdnBkX2ZpbmRfdGFnKHZwZF9kYXRhLCAwLCBCTlgyWF9WUERfTEVOLAorCS8qIFZQRCBSTyB0YWcgc2hvdWxkIGJlIGZpcnN0IHRhZyBhZnRlciBpZGVudGlmaWVyIHN0cmluZywgaGVuY2UKKwkgKiB3ZSBzaG91bGQgYmUgYWJsZSB0byBmaW5kIGl0IGluIGZpcnN0IEJOWDJYX1ZQRF9MRU4gY2hhcnMKKwkgKi8KKwlpID0gcGNpX3ZwZF9maW5kX3RhZyh2cGRfc3RhcnQsIDAsIEJOWDJYX1ZQRF9MRU4sCiAJCQkgICAgIFBDSV9WUERfTFJEVF9ST19EQVRBKTsKIAlpZiAoaSA8IDApCiAJCWdvdG8gb3V0X25vdF9mb3VuZDsKIAotCiAJYmxvY2tfZW5kID0gaSArIFBDSV9WUERfTFJEVF9UQUdfU0laRSArCi0JCSAgICBwY2lfdnBkX2xyZHRfc2l6ZSgmdnBkX2RhdGFbaV0pOworCQkgICAgcGNpX3ZwZF9scmR0X3NpemUoJnZwZF9zdGFydFtpXSk7CiAKIAlpICs9IFBDSV9WUERfTFJEVF9UQUdfU0laRTsKIAotCWlmIChibG9ja19lbmQgPiBCTlgyWF9WUERfTEVOKQotCQlnb3RvIG91dF9ub3RfZm91bmQ7CisJaWYgKGJsb2NrX2VuZCA+IEJOWDJYX1ZQRF9MRU4pIHsKKwkJdnBkX2V4dGVuZGVkX2RhdGEgPSBrbWFsbG9jKGJsb2NrX2VuZCwgR0ZQX0tFUk5FTCk7CisJCWlmICh2cGRfZXh0ZW5kZWRfZGF0YSAgPT0gTlVMTCkKKwkJCWdvdG8gb3V0X25vdF9mb3VuZDsKKworCQkvKiByZWFkIHJlc3Qgb2YgdnBkIGltYWdlIGludG8gdnBkX2V4dGVuZGVkX2RhdGEgKi8KKwkJbWVtY3B5KHZwZF9leHRlbmRlZF9kYXRhLCB2cGRfc3RhcnQsIEJOWDJYX1ZQRF9MRU4pOworCQljbnQgPSBwY2lfcmVhZF92cGQoYnAtPnBkZXYsIEJOWDJYX1ZQRF9MRU4sCisJCQkJICAgYmxvY2tfZW5kIC0gQk5YMlhfVlBEX0xFTiwKKwkJCQkgICB2cGRfZXh0ZW5kZWRfZGF0YSArIEJOWDJYX1ZQRF9MRU4pOworCQlpZiAoY250IDwgKGJsb2NrX2VuZCAtIEJOWDJYX1ZQRF9MRU4pKQorCQkJZ290byBvdXRfbm90X2ZvdW5kOworCQl2cGRfZGF0YSA9IHZwZF9leHRlbmRlZF9kYXRhOworCX0gZWxzZQorCQl2cGRfZGF0YSA9IHZwZF9zdGFydDsKKworCS8qIG5vdyB2cGRfZGF0YSBob2xkcyBmdWxsIHZwZCBjb250ZW50IGluIGJvdGggY2FzZXMgKi8KIAogCXJvZGkgPSBwY2lfdnBkX2ZpbmRfaW5mb19rZXl3b3JkKHZwZF9kYXRhLCBpLCBibG9ja19lbmQsCiAJCQkJICAgUENJX1ZQRF9ST19LRVlXT1JEX01GUl9JRCk7CkBAIC05NzM2LDkgKzEwMDA1LDExIEBACiAJCQkJYnAtPmZ3X3ZlcltsZW5dID0gJyAnOwogCQkJfQogCQl9CisJCWtmcmVlKHZwZF9leHRlbmRlZF9kYXRhKTsKIAkJcmV0dXJuOwogCX0KIG91dF9ub3RfZm91bmQ6CisJa2ZyZWUodnBkX2V4dGVuZGVkX2RhdGEpOwogCXJldHVybjsKIH0KIApAQCAtOTg0MCwxNSArMTAxMTEsMjAgQEAKIAogCWJwLT5tdWx0aV9tb2RlID0gbXVsdGlfbW9kZTsKIAorCWJwLT5kaXNhYmxlX3RwYSA9IGRpc2FibGVfdHBhOworCisjaWZkZWYgQkNNX0NOSUMKKwlicC0+ZGlzYWJsZV90cGEgfD0gSVNfTUZfSVNDU0lfU0QoYnApOworI2VuZGlmCisKIAkvKiBTZXQgVFBBIGZsYWdzICovCi0JaWYgKGRpc2FibGVfdHBhKSB7CisJaWYgKGJwLT5kaXNhYmxlX3RwYSkgewogCQlicC0+ZmxhZ3MgJj0gflRQQV9FTkFCTEVfRkxBRzsKIAkJYnAtPmRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfTFJPOwogCX0gZWxzZSB7CiAJCWJwLT5mbGFncyB8PSBUUEFfRU5BQkxFX0ZMQUc7CiAJCWJwLT5kZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfTFJPOwogCX0KLQlicC0+ZGlzYWJsZV90cGEgPSBkaXNhYmxlX3RwYTsKIAogCWlmIChDSElQX0lTX0UxKGJwKSkKIAkJYnAtPmRyb3BsZXNzX2ZjID0gMDsKQEAgLTk5NjUsNyArMTAyNDEsNyBAQAogfQogCiAvKiBjYWxsZWQgd2l0aCBydG5sX2xvY2sgKi8KLXN0YXRpYyBpbnQgYm54MnhfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK2ludCBibngyeF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBibngyeCAqYnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC0xMDExOSw2ICsxMDM5NSwxMSBAQAogCX0KIAogCWJwLT5yeF9tb2RlID0gcnhfbW9kZTsKKyNpZmRlZiBCQ01fQ05JQworCS8qIGhhbmRsZSBJU0NTSSBTRCBtb2RlICovCisJaWYgKElTX01GX0lTQ1NJX1NEKGJwKSkKKwkJYnAtPnJ4X21vZGUgPSBCTlgyWF9SWF9NT0RFX05PTkU7CisjZW5kaWYKIAogCS8qIFNjaGVkdWxlIHRoZSByeF9tb2RlIGNvbW1hbmQgKi8KIAlpZiAodGVzdF9iaXQoQk5YMlhfRklMVEVSX1JYX01PREVfUEVORElORywgJmJwLT5zcF9zdGF0ZSkpIHsKQEAgLTEwMTk4LDYgKzEwNDc5LDE1IEBACiB9CiAjZW5kaWYKIAorc3RhdGljIGludCBibngyeF92YWxpZGF0ZV9hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGJueDJ4ICpicCA9IG5ldGRldl9wcml2KGRldik7CisKKwlpZiAoIWJueDJ4X2lzX3ZhbGlkX2V0aGVyX2FkZHIoYnAsIGRldi0+ZGV2X2FkZHIpKQorCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgYm54MnhfbmV0ZGV2X29wcyA9IHsKIAkubmRvX29wZW4JCT0gYm54Mnhfb3BlbiwKIAkubmRvX3N0b3AJCT0gYm54MnhfY2xvc2UsCkBAIC0xMDIwNSw3ICsxMDQ5NSw3IEBACiAJLm5kb19zZWxlY3RfcXVldWUJPSBibngyeF9zZWxlY3RfcXVldWUsCiAJLm5kb19zZXRfcnhfbW9kZQk9IGJueDJ4X3NldF9yeF9tb2RlLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gYm54MnhfY2hhbmdlX21hY19hZGRyLAotCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGJueDJ4X3ZhbGlkYXRlX2FkZHIsCiAJLm5kb19kb19pb2N0bAkJPSBibngyeF9pb2N0bCwKIAkubmRvX2NoYW5nZV9tdHUJCT0gYm54MnhfY2hhbmdlX210dSwKIAkubmRvX2ZpeF9mZWF0dXJlcwk9IGJueDJ4X2ZpeF9mZWF0dXJlcywKQEAgLTEwODIzLDggKzExMTEzLDggQEAKIAlicC0+cW1fY2lkX2NvdW50ID0gYm54Mnhfc2V0X3FtX2NpZF9jb3VudChicCk7CiAKICNpZmRlZiBCQ01fQ05JQwotCS8qIGRpc2FibGUgRkNPRSBMMiBxdWV1ZSBmb3IgRTF4IGFuZCBFMyovCi0JaWYgKENISVBfSVNfRTF4KGJwKSB8fCBDSElQX0lTX0UzKGJwKSkKKwkvKiBkaXNhYmxlIEZDT0UgTDIgcXVldWUgZm9yIEUxeCAqLworCWlmIChDSElQX0lTX0UxeChicCkpCiAJCWJwLT5mbGFncyB8PSBOT19GQ09FX0ZMQUc7CiAKICNlbmRpZgpAQCAtMTE0ODYsNiArMTE3NzYsMzggQEAKIAkJc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7CiAJCWJyZWFrOwogCX0KKwljYXNlIERSVl9DVExfVUxQX1JFR0lTVEVSX0NNRDogeworCQlpbnQgdWxwX3R5cGUgPSBjdGwtPmRhdGEudWxwX3R5cGU7CisKKwkJaWYgKENISVBfSVNfRTMoYnApKSB7CisJCQlpbnQgaWR4ID0gQlBfRldfTUJfSURYKGJwKTsKKwkJCXUzMiBjYXA7CisKKwkJCWNhcCA9IFNITUVNMl9SRChicCwgZHJ2X2NhcGFiaWxpdGllc19mbGFnW2lkeF0pOworCQkJaWYgKHVscF90eXBlID09IENOSUNfVUxQX0lTQ1NJKQorCQkJCWNhcCB8PSBEUlZfRkxBR1NfQ0FQQUJJTElUSUVTX0xPQURFRF9JU0NTSTsKKwkJCWVsc2UgaWYgKHVscF90eXBlID09IENOSUNfVUxQX0ZDT0UpCisJCQkJY2FwIHw9IERSVl9GTEFHU19DQVBBQklMSVRJRVNfTE9BREVEX0ZDT0U7CisJCQlTSE1FTTJfV1IoYnAsIGRydl9jYXBhYmlsaXRpZXNfZmxhZ1tpZHhdLCBjYXApOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlIERSVl9DVExfVUxQX1VOUkVHSVNURVJfQ01EOiB7CisJCWludCB1bHBfdHlwZSA9IGN0bC0+ZGF0YS51bHBfdHlwZTsKKworCQlpZiAoQ0hJUF9JU19FMyhicCkpIHsKKwkJCWludCBpZHggPSBCUF9GV19NQl9JRFgoYnApOworCQkJdTMyIGNhcDsKKworCQkJY2FwID0gU0hNRU0yX1JEKGJwLCBkcnZfY2FwYWJpbGl0aWVzX2ZsYWdbaWR4XSk7CisJCQlpZiAodWxwX3R5cGUgPT0gQ05JQ19VTFBfSVNDU0kpCisJCQkJY2FwICY9IH5EUlZfRkxBR1NfQ0FQQUJJTElUSUVTX0xPQURFRF9JU0NTSTsKKwkJCWVsc2UgaWYgKHVscF90eXBlID09IENOSUNfVUxQX0ZDT0UpCisJCQkJY2FwICY9IH5EUlZfRkxBR1NfQ0FQQUJJTElUSUVTX0xPQURFRF9GQ09FOworCQkJU0hNRU0yX1dSKGJwLCBkcnZfY2FwYWJpbGl0aWVzX2ZsYWdbaWR4XSwgY2FwKTsKKwkJfQorCQlicmVhazsKKwl9CiAKIAlkZWZhdWx0OgogCQlCTlgyWF9FUlIoInVua25vd24gY29tbWFuZCAleFxuIiwgY3RsLT5jbWQpOwpAQCAtMTE1NjEsNyArMTE4ODMsNyBAQAogCiAJbXV0ZXhfbG9jaygmYnAtPmNuaWNfbXV0ZXgpOwogCWNwLT5kcnZfc3RhdGUgPSAwOwotCXJjdV9hc3NpZ25fcG9pbnRlcihicC0+Y25pY19vcHMsIE5VTEwpOworCVJDVV9JTklUX1BPSU5URVIoYnAtPmNuaWNfb3BzLCBOVUxMKTsKIAltdXRleF91bmxvY2soJmJwLT5jbmljX211dGV4KTsKIAlzeW5jaHJvbml6ZV9yY3UoKTsKIAlrZnJlZShicC0+Y25pY19rd3EpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54MnhfcmVnLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9yZWcuaAppbmRleCBmYzdiZDBmLi40NDYwOWRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9yZWcuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9yZWcuaApAQCAtMTYwLDggKzE2MCwxMSBAQAogI2RlZmluZSBCUkIxX1JFR19QQVVTRV9ISUdIX1RIUkVTSE9MRF8xIAkJCSAweDYwMDdjCiAvKiBbUlcgMTBdIFdyaXRlIGNsaWVudCAwOiBBc3NlcnQgcGF1c2UgdGhyZXNob2xkLiAqLwogI2RlZmluZSBCUkIxX1JFR19QQVVTRV9MT1dfVEhSRVNIT0xEXzAJCQkJIDB4NjAwNjgKLSNkZWZpbmUgQlJCMV9SRUdfUEFVU0VfTE9XX1RIUkVTSE9MRF8xCQkJCSAweDYwMDZjCi0vKiBbUiAyNF0gVGhlIG51bWJlciBvZiBmdWxsIGJsb2NrcyBvY2N1cGllZCBieSBwb3J0LiAqLworLyogW1JXIDFdIEluZGljYXRlcyBpZiB0byB1c2UgcGVyLWNsYXNzIGd1YXJhbnR5IG1vZGUgKG5ldyBtb2RlKSBvciBwZXItTUFDCisgKiBndWFyYW50eSBtb2RlIChiYWNrd2FyZHMtY29tcGF0aWJsZSBtb2RlKS4gMD1wZXItTUFDIGd1YXJhbnR5IG1vZGUgKEJDCisgKiBtb2RlKS4gMT1wZXItY2xhc3MgZ3VhcmFudHkgbW9kZSAobmV3IG1vZGUpLiAqLworI2RlZmluZSBCUkIxX1JFR19QRVJfQ0xBU1NfR1VBUkFOVFlfTU9ERQkJCSAweDYwMjY4CisvKiBbUiAyNF0gVGhlIG51bWJlciBvZiBmdWxsIGJsb2NrcyBvY2NwaWVkIGJ5IHBvcnQuICovCiAjZGVmaW5lIEJSQjFfUkVHX1BPUlRfTlVNX09DQ19CTE9DS1NfMAkJCQkgMHg2MDA5NAogLyogW1JXIDFdIFJlc2V0IHRoZSBkZXNpZ24gYnkgc29mdHdhcmUuICovCiAjZGVmaW5lIEJSQjFfUkVHX1NPRlRfUkVTRVQJCQkJCSAweDYwMGRjCkBAIC0xNjE5LDYgKzE2MjIsMTQgQEAKICAgIHJlZ2lzdGVyIGJpdHMuICovCiAjZGVmaW5lIE1JU0NfUkVHX0xDUExMX0NUUkxfMQkJCQkJIDB4YTJhNAogI2RlZmluZSBNSVNDX1JFR19MQ1BMTF9DVFJMX1JFR18yCQkJCSAweGEyYTgKKy8qIFtSVyAxXSBMQ1BMTCBwb3dlciBkb3duLiBHbG9iYWwgcmVnaXN0ZXIuIEFjdGl2ZSBIaWdoLiBSZXNldCBvbiBQT1IKKyAqIHJlc2V0LiAqLworI2RlZmluZSBNSVNDX1JFR19MQ1BMTF9FNDBfUFdSRFdOCQkJCSAweGFhNzQKKy8qIFtSVyAxXSBMQ1BMTCBWQ08gcmVzZXQuIEdsb2JhbCByZWdpc3Rlci4gQWN0aXZlIExvdyBSZXNldCBvbiBQT1IgcmVzZXQuICovCisjZGVmaW5lIE1JU0NfUkVHX0xDUExMX0U0MF9SRVNFVEJfQU5BCQkJCSAweGFhNzgKKy8qIFtSVyAxXSBMQ1BMTCBwb3N0LWRpdmlkZXIgcmVzZXQuIEdsb2JhbCByZWdpc3Rlci4gQWN0aXZlIExvdyBSZXNldCBvbiBQT1IKKyAqIHJlc2V0LiAqLworI2RlZmluZSBNSVNDX1JFR19MQ1BMTF9FNDBfUkVTRVRCX0RJRwkJCQkgMHhhYTdjCiAvKiBbUlcgNF0gSW50ZXJydXB0IG1hc2sgcmVnaXN0ZXIgIzAgcmVhZC93cml0ZSAqLwogI2RlZmluZSBNSVNDX1JFR19NSVNDX0lOVF9NQVNLCQkJCQkgMHhhMzg4CiAvKiBbUlcgMV0gUGFyaXR5IG1hc2sgcmVnaXN0ZXIgIzAgcmVhZC93cml0ZSAqLwpAQCAtMTc1NCw2ICsxNzY1LDcgQEAKICAqIGlzIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZSBvbiBjdHJsX21kX2RldmFkLiBEcml2ZXMgb3V0cHV0CiAgKiBtaXNjX3hneHMwX3BoeV9hZGRyLiBHbG9iYWwgcmVnaXN0ZXIuICovCiAjZGVmaW5lIE1JU0NfUkVHX1dDMF9DVFJMX1BIWV9BRERSCQkJCSAweGE5Y2MKKyNkZWZpbmUgTUlTQ19SRUdfV0MwX1JFU0VUCQkJCQkgMHhhYzMwCiAvKiBbUlcgMl0gWE1BQyBDb3JlIHBvcnQgbW9kZS4gSW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgcG9ydHMgb24gdGhlIHN5c3RlbQogICAgc2lkZS4gVGhpcyBzaG91bGQgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHBoeV9wb3J0X21vZGU7IGlmIHNvbWUgb2YgdGhlCiAgICBwb3J0cyBhcmUgbm90IHVzZWQuIFRoaXMgZW5hYmxlcyByZWR1Y3Rpb24gb2YgZnJlcXVlbmN5IG9uIHRoZSBjb3JlIHNpZGUuCkBAIC02ODIzLDExICs2ODM1LDEzIEBACiAjZGVmaW5lIE1ESU9fQ1RMX1JFR184NDgyM19NRURJQV9QUklPUklUWV9DT1BQRVIJMHgwMDAwCiAjZGVmaW5lIE1ESU9fQ1RMX1JFR184NDgyM19NRURJQV9QUklPUklUWV9GSUJFUgkJMHgwMTAwCiAjZGVmaW5lIE1ESU9fQ1RMX1JFR184NDgyM19NRURJQV9GSUJFUl8xRwkJCTB4MTAwMAotI2RlZmluZSBNRElPX0NUTF9SRUdfODQ4MjNfVVNFUl9DVFJMX1JFRwkJMHg0MDA1Ci0jZGVmaW5lIE1ESU9fQ1RMX1JFR184NDgyM19VU0VSX0NUUkxfQ01TCQkweDAwODAKLQotI2RlZmluZSBNRElPX1BNQV9SRUdfODQ4MjNfQ1RMX0xFRF9DVExfMQkJMHhhOGUzCi0jZGVmaW5lIE1ESU9fUE1BX1JFR184NDgyM19MRUQzX1NUUkVUQ0hfRU4JCTB4MDA4MAorI2RlZmluZSBNRElPX0NUTF9SRUdfODQ4MjNfVVNFUl9DVFJMX1JFRwkJCTB4NDAwNQorI2RlZmluZSBNRElPX0NUTF9SRUdfODQ4MjNfVVNFUl9DVFJMX0NNUwkJCTB4MDA4MAorI2RlZmluZSBNRElPX1BNQV9SRUdfODQ4MjNfQ1RMX1NMT1dfQ0xLX0NOVF9ISUdICQkweGE4MmIKKyNkZWZpbmUgTURJT19QTUFfUkVHXzg0ODIzX0JMSU5LX1JBVEVfVkFMXzE1UDlIWgkweDJmCisjZGVmaW5lIE1ESU9fUE1BX1JFR184NDgyM19DVExfTEVEX0NUTF8xCQkJMHhhOGUzCisjZGVmaW5lIE1ESU9fUE1BX1JFR184NDgzM19DVExfTEVEX0NUTF8xCQkJMHhhOGVjCisjZGVmaW5lIE1ESU9fUE1BX1JFR184NDgyM19MRUQzX1NUUkVUQ0hfRU4JCQkweDAwODAKIAogLyogQkNNODQ4MzMgb25seSAqLwogI2RlZmluZSBNRElPXzg0ODMzX1RPUF9DRkdfWEdQSFlfU1RSQVAxCQkJMHg0MDFhCkBAIC02ODM4LDI3ICs2ODUyLDM2IEBACiAjZGVmaW5lIE1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzIJCQkweDQwMDcKICNkZWZpbmUgTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMwkJCTB4NDAwOAogI2RlZmluZSBNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUc0CQkJMHg0MDA5Ci0jZGVmaW5lIE1ESU9fODQ4MzNfVE9QX0NGR19EQVRBM19SRUcJCQkweDQwMTEKLSNkZWZpbmUgTURJT184NDgzM19UT1BfQ0ZHX0RBVEE0X1JFRwkJCTB4NDAxMgorI2RlZmluZSBNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyNgkJMHg0MDM3CisjZGVmaW5lIE1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzI3CQkweDQwMzgKKyNkZWZpbmUgTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMjgJCTB4NDAzOQorI2RlZmluZSBNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyOQkJMHg0MDNhCisjZGVmaW5lIE1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzMwCQkweDQwM2IKKyNkZWZpbmUgTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMzEJCTB4NDAzYworI2RlZmluZSBNRElPXzg0ODMzX0NNRF9IRExSX0NPTU1BTkQJTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMAorI2RlZmluZSBNRElPXzg0ODMzX0NNRF9IRExSX1NUQVRVUwlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyNgorI2RlZmluZSBNRElPXzg0ODMzX0NNRF9IRExSX0RBVEExCU1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzI3CisjZGVmaW5lIE1ESU9fODQ4MzNfQ01EX0hETFJfREFUQTIJTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMjgKKyNkZWZpbmUgTURJT184NDgzM19DTURfSERMUl9EQVRBMwlNRElPXzg0ODMzX1RPUF9DRkdfU0NSQVRDSF9SRUcyOQorI2RlZmluZSBNRElPXzg0ODMzX0NNRF9IRExSX0RBVEE0CU1ESU9fODQ4MzNfVE9QX0NGR19TQ1JBVENIX1JFRzMwCisjZGVmaW5lIE1ESU9fODQ4MzNfQ01EX0hETFJfREFUQTUJTURJT184NDgzM19UT1BfQ0ZHX1NDUkFUQ0hfUkVHMzEKIAogLyogTWFpbGJveCBjb21tYW5kIHNldCB1c2VkIGJ5IDg0ODMzLiAqLwotI2RlZmluZSBQSFk4NDgzM19ESUFHX0NNRF9QQUlSX1NXQVBfQ0hBTkdFCQkweDIKKyNkZWZpbmUgUEhZODQ4MzNfQ01EX1NFVF9QQUlSX1NXQVAJCQkweDgwMDEKKyNkZWZpbmUgUEhZODQ4MzNfQ01EX0dFVF9FRUVfTU9ERQkJCTB4ODAwOAorI2RlZmluZSBQSFk4NDgzM19DTURfU0VUX0VFRV9NT0RFCQkJMHg4MDA5CiAvKiBNYWlsYm94IHN0YXR1cyBzZXQgdXNlZCBieSA4NDgzMy4gKi8KLSNkZWZpbmUgUEhZODQ4MzNfQ01EX1JFQ0VJVkVECQkJCTB4MDAwMQotI2RlZmluZSBQSFk4NDgzM19DTURfSU5fUFJPR1JFU1MJCQkweDAwMDIKLSNkZWZpbmUgUEhZODQ4MzNfQ01EX0NPTVBMRVRFX1BBU1MJCQkweDAwMDQKLSNkZWZpbmUgUEhZODQ4MzNfQ01EX0NPTVBMRVRFX0VSUk9SCQkJMHgwMDA4Ci0jZGVmaW5lIFBIWTg0ODMzX0NNRF9PUEVOX0ZPUl9DTURTCQkJMHgwMDEwCi0jZGVmaW5lIFBIWTg0ODMzX0NNRF9TWVNURU1fQk9PVAkJCTB4MDAyMAotI2RlZmluZSBQSFk4NDgzM19DTURfTk9UX09QRU5fRk9SX0NNRFMJCQkweDAwNDAKLSNkZWZpbmUgUEhZODQ4MzNfQ01EX0NMRUFSX0NPTVBMRVRFCQkJMHgwMDgwCi0jZGVmaW5lIFBIWTg0ODMzX0NNRF9PUEVOX09WRVJSSURFCQkJMHhhNWE1CisjZGVmaW5lIFBIWTg0ODMzX1NUQVRVU19DTURfUkVDRUlWRUQJCQkweDAwMDEKKyNkZWZpbmUgUEhZODQ4MzNfU1RBVFVTX0NNRF9JTl9QUk9HUkVTUwkJCTB4MDAwMgorI2RlZmluZSBQSFk4NDgzM19TVEFUVVNfQ01EX0NPTVBMRVRFX1BBU1MJCTB4MDAwNAorI2RlZmluZSBQSFk4NDgzM19TVEFUVVNfQ01EX0NPTVBMRVRFX0VSUk9SCQkweDAwMDgKKyNkZWZpbmUgUEhZODQ4MzNfU1RBVFVTX0NNRF9PUEVOX0ZPUl9DTURTCQkweDAwMTAKKyNkZWZpbmUgUEhZODQ4MzNfU1RBVFVTX0NNRF9TWVNURU1fQk9PVAkJCTB4MDAyMAorI2RlZmluZSBQSFk4NDgzM19TVEFUVVNfQ01EX05PVF9PUEVOX0ZPUl9DTURTCQkweDAwNDAKKyNkZWZpbmUgUEhZODQ4MzNfU1RBVFVTX0NNRF9DTEVBUl9DT01QTEVURQkJMHgwMDgwCisjZGVmaW5lIFBIWTg0ODMzX1NUQVRVU19DTURfT1BFTl9PVkVSUklERQkJMHhhNWE1CiAKIAotLyogODQ4MzMgRi9XIEZlYXR1cmUgQ29tbWFuZHMgKi8KLSNkZWZpbmUgUEhZODQ4MzNfRElBR19DTURfR0VUX0VFRV9NT0RFCQkJMHgyNwotI2RlZmluZSBQSFk4NDgzM19ESUFHX0NNRF9TRVRfRUVFX01PREUJCQkweDI4Ci0KIC8qIFdhcnBjb3JlIGNsYXVzZSA0NSBhZGRyZXNzaW5nICovCiAjZGVmaW5lIE1ESU9fV0NfREVWQUQJCQkJCTB4MwogI2RlZmluZSBNRElPX1dDX1JFR19JRUVFMEJMS19NSUlDTlRMCQkJMHgwCkBAIC02OTkwLDYgKzcwMTMsNyBAQAogI2RlZmluZSBNRElPX1JFR19JTlRSX01BU0sJCQkJMHgxYgogI2RlZmluZSBNRElPX1JFR19JTlRSX01BU0tfTElOS19TVEFUVVMJCQkoMHgxIDw8IDEpCiAjZGVmaW5lIE1ESU9fUkVHX0dQSFlfU0hBRE9XCQkJCTB4MWMKKyNkZWZpbmUgTURJT19SRUdfR1BIWV9TSEFET1dfTEVEX1NFTDEJCQkoMHgwZCA8PCAxMCkKICNkZWZpbmUgTURJT19SRUdfR1BIWV9TSEFET1dfTEVEX1NFTDIJCQkoMHgwZSA8PCAxMCkKICNkZWZpbmUgTURJT19SRUdfR1BIWV9TSEFET1dfV1JfRU5BCQkJKDB4MSA8PCAxNSkKICNkZWZpbmUgTURJT19SRUdfR1BIWV9TSEFET1dfQVVUT19ERVRfTUVECQkoMHgxZSA8PCAxMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5jCmluZGV4IDE0NTE3NjkuLjVhYzYxNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuYwpAQCAtMzAsNiArMzAsOCBAQAogCiAjZGVmaW5lIEJOWDJYX01BWF9FTVVMX01VTFRJCQkxNgogCisjZGVmaW5lIE1BQ19MRUFESU5HX1pFUk9fQ05UIChBTElHTihFVEhfQUxFTiwgc2l6ZW9mKHUzMikpIC0gRVRIX0FMRU4pCisKIC8qKioqIEV4ZSBRdWV1ZSBpbnRlcmZhY2VzICoqKiovCiAKIC8qKgpAQCAtNDQxLDYgKzQ0MywzNiBAQAogCXJldHVybiB0cnVlOwogfQogCitzdGF0aWMgaW50IGJueDJ4X2dldF9uX2VsZW1lbnRzKHN0cnVjdCBibngyeCAqYnAsIHN0cnVjdCBibngyeF92bGFuX21hY19vYmogKm8sCisJCQkJaW50IG4sIHU4ICpidWYpCit7CisJc3RydWN0IGJueDJ4X3ZsYW5fbWFjX3JlZ2lzdHJ5X2VsZW0gKnBvczsKKwl1OCAqbmV4dCA9IGJ1ZjsKKwlpbnQgY291bnRlciA9IDA7CisKKwkvKiB0cmF2ZXJzZSBsaXN0ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZvLT5oZWFkLCBsaW5rKSB7CisJCWlmIChjb3VudGVyIDwgbikgeworCQkJLyogcGxhY2UgbGVhZGluZyB6ZXJvZXMgaW4gYnVmZmVyICovCisJCQltZW1zZXQobmV4dCwgMCwgTUFDX0xFQURJTkdfWkVST19DTlQpOworCisJCQkvKiBwbGFjZSBtYWMgYWZ0ZXIgbGVhZGluZyB6ZXJvZXMqLworCQkJbWVtY3B5KG5leHQgKyBNQUNfTEVBRElOR19aRVJPX0NOVCwgcG9zLT51Lm1hYy5tYWMsCisJCQkgICAgICAgRVRIX0FMRU4pOworCisJCQkvKiBjYWxjdWxhdGUgYWRkcmVzcyBvZiBuZXh0IGVsZW1lbnQgYW5kCisJCQkgKiBhZHZhbmNlIGNvdW50ZXIKKwkJCSAqLworCQkJY291bnRlcisrOworCQkJbmV4dCA9IGJ1ZiArIGNvdW50ZXIgKiBBTElHTihFVEhfQUxFTiwgc2l6ZW9mKHUzMikpOworCisJCQlEUChCTlgyWF9NU0dfU1AsICJjb3BpZWQgZWxlbWVudCBudW1iZXIgJWQgdG8gYWRkcmVzcyAlcCBlbGVtZW50IHdhcyAlcE1cbiIsCisJCQkgICBjb3VudGVyLCBuZXh0LCBwb3MtPnUubWFjLm1hYyk7CisJCX0KKwl9CisJcmV0dXJuIGNvdW50ZXIgKiBFVEhfQUxFTjsKK30KKwogLyogY2hlY2tfYWRkKCkgY2FsbGJhY2tzICovCiBzdGF0aWMgaW50IGJueDJ4X2NoZWNrX21hY19hZGQoc3RydWN0IGJueDJ4X3ZsYW5fbWFjX29iaiAqbywKIAkJCSAgICAgICB1bmlvbiBibngyeF9jbGFzc2lmaWNhdGlvbl9yYW1yb2RfZGF0YSAqZGF0YSkKQEAgLTE4ODYsNiArMTkxOCw3IEBACiAJCW1hY19vYmotPmNoZWNrX21vdmUgICAgICAgID0gYm54MnhfY2hlY2tfbW92ZTsKIAkJbWFjX29iai0+cmFtcm9kX2NtZCAgICAgICAgPQogCQkJUkFNUk9EX0NNRF9JRF9FVEhfQ0xBU1NJRklDQVRJT05fUlVMRVM7CisJCW1hY19vYmotPmdldF9uX2VsZW1lbnRzICAgID0gYm54MnhfZ2V0X25fZWxlbWVudHM7CiAKIAkJLyogRXhlIFF1ZXVlICovCiAJCWJueDJ4X2V4ZV9xdWV1ZV9pbml0KGJwLApAQCAtMzM0Miw3ICszMzc1LDcgQEAKIAkJaWYgKCFsaXN0X2VtcHR5KCZvLT5yZWdpc3RyeS5leGFjdF9tYXRjaC5tYWNzKSkKIAkJCXJldHVybiAwOwogCi0JCWVsZW0gPSBremFsbG9jKHNpemVvZigqZWxlbSkqbGVuLCBHRlBfQVRPTUlDKTsKKwkJZWxlbSA9IGtjYWxsb2MobGVuLCBzaXplb2YoKmVsZW0pLCBHRlBfQVRPTUlDKTsKIAkJaWYgKCFlbGVtKSB7CiAJCQlCTlgyWF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSByZWdpc3RyeSBtZW1vcnlcbiIpOwogCQkJcmV0dXJuIC1FTk9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3AuaAppbmRleCA5YTUxN2MyLi45OTIzMDhmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zcC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3NwLmgKQEAgLTI4NSw2ICsyODUsMTkgQEAKIAkvKiBSQU1ST0QgY29tbWFuZCB0byBiZSB1c2VkICovCiAJaW50CQkJCXJhbXJvZF9jbWQ7CiAKKwkvKiBjb3B5IGZpcnN0IG4gZWxlbWVudHMgb250byBwcmVhbGxvY2F0ZWQgYnVmZmVyCisJICoKKwkgKiBAcGFyYW0gbiBudW1iZXIgb2YgZWxlbWVudHMgdG8gZ2V0CisJICogQHBhcmFtIGJ1ZiBidWZmZXIgcHJlYWxsb2NhdGVkIGJ5IGNhbGxlciBpbnRvIHdoaWNoIGVsZW1lbnRzCisJICogICAgICAgICAgICB3aWxsIGJlIGNvcGllZC4gTm90ZSBlbGVtZW50cyBhcmUgNC1ieXRlIGFsaWduZWQKKwkgKiAgICAgICAgICAgIHNvIGJ1ZmZlciBzaXplIG11c3QgYmUgYWJsZSB0byBhY2NvbW9kYXRlIHRoZQorCSAqICAgICAgICAgICAgYWxpZ25lZCBlbGVtZW50cy4KKwkgKgorCSAqIEByZXR1cm4gbnVtYmVyIG9mIGNvcGllZCBieXRlcworCSAqLworCWludCAoKmdldF9uX2VsZW1lbnRzKShzdHJ1Y3QgYm54MnggKmJwLCBzdHJ1Y3QgYm54Mnhfdmxhbl9tYWNfb2JqICpvLAorCQkJICAgICAgaW50IG4sIHU4ICpidWYpOworCiAJLyoqCiAJICogQ2hlY2tzIGlmIEFERC1yYW1yb2Qgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1zIG1heSBiZSBwZXJmb3JtZWQuCiAJICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3N0YXRzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zdGF0cy5jCmluZGV4IDAyYWM2YTcuLmJjMDEyMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3N0YXRzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3RhdHMuYwpAQCAtMzksNiArMzksMTcgQEAKICNlbmRpZgogfQogCitzdGF0aWMgdTE2IGJueDJ4X2dldF9wb3J0X3N0YXRzX2RtYV9sZW4oc3RydWN0IGJueDJ4ICpicCkKK3sKKwl1MTYgcmVzID0gc2l6ZW9mKHN0cnVjdCBob3N0X3BvcnRfc3RhdHMpID4+IDI7CisKKwkvKiBpZiBQRkMgc3RhdHMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIE1GVywgZG9uJ3QgRE1BIHRoZW0gKi8KKwlpZiAoIShicC0+ZmxhZ3MgJiAgQkNfU1VQUE9SVFNfUEZDX1NUQVRTKSkKKwkJcmVzIC09IChzaXplb2YodTMyKSo0KSA+PiAyOworCisJcmV0dXJuIHJlczsKK30KKwogLyoKICAqIEluaXQgc2VydmljZSBmdW5jdGlvbnMKICAqLwpAQCAtMTc4LDcgKzE4OSw4IEBACiAJCQkJICAgRE1BRV9MRU4zMl9SRF9NQVggKiA0KTsKIAlkbWFlLT5kc3RfYWRkcl9oaSA9IFU2NF9ISShibngyeF9zcF9tYXBwaW5nKGJwLCBwb3J0X3N0YXRzKSArCiAJCQkJICAgRE1BRV9MRU4zMl9SRF9NQVggKiA0KTsKLQlkbWFlLT5sZW4gPSAoc2l6ZW9mKHN0cnVjdCBob3N0X3BvcnRfc3RhdHMpID4+IDIpIC0gRE1BRV9MRU4zMl9SRF9NQVg7CisJZG1hZS0+bGVuID0gYm54MnhfZ2V0X3BvcnRfc3RhdHNfZG1hX2xlbihicCkgLSBETUFFX0xFTjMyX1JEX01BWDsKKwogCWRtYWUtPmNvbXBfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7CiAJZG1hZS0+Y29tcF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKIAlkbWFlLT5jb21wX3ZhbCA9IERNQUVfQ09NUF9WQUw7CkBAIC0yMTcsNyArMjI5LDcgQEAKIAkJZG1hZS0+c3JjX2FkZHJfaGkgPSBVNjRfSEkoYm54Mnhfc3BfbWFwcGluZyhicCwgcG9ydF9zdGF0cykpOwogCQlkbWFlLT5kc3RfYWRkcl9sbyA9IGJwLT5wb3J0LnBvcnRfc3R4ID4+IDI7CiAJCWRtYWUtPmRzdF9hZGRyX2hpID0gMDsKLQkJZG1hZS0+bGVuID0gc2l6ZW9mKHN0cnVjdCBob3N0X3BvcnRfc3RhdHMpID4+IDI7CisJCWRtYWUtPmxlbiA9IGJueDJ4X2dldF9wb3J0X3N0YXRzX2RtYV9sZW4oYnApOwogCQlkbWFlLT5jb21wX2FkZHJfbG8gPSBkbWFlX3JlZ19nb19jW2xvYWRlcl9pZHhdID4+IDI7CiAJCWRtYWUtPmNvbXBfYWRkcl9oaSA9IDA7CiAJCWRtYWUtPmNvbXBfdmFsID0gMTsKQEAgLTU0MCw2ICs1NTIsMjUgQEAKIAkJVVBEQVRFX1NUQVQ2NCh0eF9zdGF0X2d0ZXJyLAogCQkJCXR4X3N0YXRfZG90M3N0YXRzaW50ZXJuYWxtYWN0cmFuc21pdGVycm9ycyk7CiAJCVVQREFURV9TVEFUNjQodHhfc3RhdF9ndHVmbCwgdHhfc3RhdF9tYWNfdWZsKTsKKworCQkvKiBjb2xsZWN0IFBGQyBzdGF0cyAqLworCQlESUZGXzY0KGRpZmYuaGksIG5ldy0+dHhfc3RhdF9ndHBwX2hpLAorCQkJcHN0YXRzLT5wZmNfZnJhbWVzX3R4X2hpLAorCQkJZGlmZi5sbywgbmV3LT50eF9zdGF0X2d0cHBfbG8sCisJCQlwc3RhdHMtPnBmY19mcmFtZXNfdHhfbG8pOworCQlwc3RhdHMtPnBmY19mcmFtZXNfdHhfaGkgPSBuZXctPnR4X3N0YXRfZ3RwcF9oaTsKKwkJcHN0YXRzLT5wZmNfZnJhbWVzX3R4X2xvID0gbmV3LT50eF9zdGF0X2d0cHBfbG87CisJCUFERF82NChwc3RhdHMtPnBmY19mcmFtZXNfdHhfaGksIGRpZmYuaGksCisJCQlwc3RhdHMtPnBmY19mcmFtZXNfdHhfbG8sIGRpZmYubG8pOworCisJCURJRkZfNjQoZGlmZi5oaSwgbmV3LT5yeF9zdGF0X2dycHBfaGksCisJCQlwc3RhdHMtPnBmY19mcmFtZXNfcnhfaGksCisJCQlkaWZmLmxvLCBuZXctPnJ4X3N0YXRfZ3JwcF9sbywKKwkJCXBzdGF0cy0+cGZjX2ZyYW1lc19yeF9sbyk7CisJCXBzdGF0cy0+cGZjX2ZyYW1lc19yeF9oaSA9IG5ldy0+cnhfc3RhdF9ncnBwX2hpOworCQlwc3RhdHMtPnBmY19mcmFtZXNfcnhfbG8gPSBuZXctPnJ4X3N0YXRfZ3JwcF9sbzsKKwkJQUREXzY0KHBzdGF0cy0+cGZjX2ZyYW1lc19yeF9oaSwgZGlmZi5oaSwKKwkJCXBzdGF0cy0+cGZjX2ZyYW1lc19yeF9sbywgZGlmZi5sbyk7CiAJfQogCiAJZXN0YXRzLT5wYXVzZV9mcmFtZXNfcmVjZWl2ZWRfaGkgPQpAQCAtNTUxLDYgKzU4MiwxNSBAQAogCQkJCXBzdGF0cy0+bWFjX3N0eFsxXS50eF9zdGF0X291dHhvZmZzZW50X2hpOwogCWVzdGF0cy0+cGF1c2VfZnJhbWVzX3NlbnRfbG8gPQogCQkJCXBzdGF0cy0+bWFjX3N0eFsxXS50eF9zdGF0X291dHhvZmZzZW50X2xvOworCisJZXN0YXRzLT5wZmNfZnJhbWVzX3JlY2VpdmVkX2hpID0KKwkJCQlwc3RhdHMtPnBmY19mcmFtZXNfcnhfaGk7CisJZXN0YXRzLT5wZmNfZnJhbWVzX3JlY2VpdmVkX2xvID0KKwkJCQlwc3RhdHMtPnBmY19mcmFtZXNfcnhfbG87CisJZXN0YXRzLT5wZmNfZnJhbWVzX3NlbnRfaGkgPQorCQkJCXBzdGF0cy0+cGZjX2ZyYW1lc190eF9oaTsKKwllc3RhdHMtPnBmY19mcmFtZXNfc2VudF9sbyA9CisJCQkJcHN0YXRzLT5wZmNfZnJhbWVzX3R4X2xvOwogfQogCiBzdGF0aWMgdm9pZCBibngyeF9tc3RhdF9zdGF0c191cGRhdGUoc3RydWN0IGJueDJ4ICpicCkKQEAgLTU3MSw2ICs2MTEsMTEgQEAKIAlBRERfU1RBVDY0KHN0YXRzX3R4LnR4X2d0eHBmLCB0eF9zdGF0X291dHhvZmZzZW50KTsKIAlBRERfU1RBVDY0KHN0YXRzX3R4LnR4X2d0eHBmLCB0eF9zdGF0X2Zsb3djb250cm9sZG9uZSk7CiAKKwkvKiBjb2xsZWN0IHBmYyBzdGF0cyAqLworCUFERF82NChwc3RhdHMtPnBmY19mcmFtZXNfdHhfaGksIG5ldy0+c3RhdHNfdHgudHhfZ3R4cHBfaGksCisJCXBzdGF0cy0+cGZjX2ZyYW1lc190eF9sbywgbmV3LT5zdGF0c190eC50eF9ndHhwcF9sbyk7CisJQUREXzY0KHBzdGF0cy0+cGZjX2ZyYW1lc19yeF9oaSwgbmV3LT5zdGF0c19yeC5yeF9ncnhwcF9oaSwKKwkJcHN0YXRzLT5wZmNfZnJhbWVzX3J4X2xvLCBuZXctPnN0YXRzX3J4LnJ4X2dyeHBwX2xvKTsKIAogCUFERF9TVEFUNjQoc3RhdHNfdHgudHhfZ3Q2NCwgdHhfc3RhdF9ldGhlcnN0YXRzcGt0czY0b2N0ZXRzKTsKIAlBRERfU1RBVDY0KHN0YXRzX3R4LnR4X2d0MTI3LApAQCAtNjI4LDYgKzY3MywxNSBAQAogCQkJCXBzdGF0cy0+bWFjX3N0eFsxXS50eF9zdGF0X291dHhvZmZzZW50X2hpOwogCWVzdGF0cy0+cGF1c2VfZnJhbWVzX3NlbnRfbG8gPQogCQkJCXBzdGF0cy0+bWFjX3N0eFsxXS50eF9zdGF0X291dHhvZmZzZW50X2xvOworCisJZXN0YXRzLT5wZmNfZnJhbWVzX3JlY2VpdmVkX2hpID0KKwkJCQlwc3RhdHMtPnBmY19mcmFtZXNfcnhfaGk7CisJZXN0YXRzLT5wZmNfZnJhbWVzX3JlY2VpdmVkX2xvID0KKwkJCQlwc3RhdHMtPnBmY19mcmFtZXNfcnhfbG87CisJZXN0YXRzLT5wZmNfZnJhbWVzX3NlbnRfaGkgPQorCQkJCXBzdGF0cy0+cGZjX2ZyYW1lc190eF9oaTsKKwllc3RhdHMtPnBmY19mcmFtZXNfc2VudF9sbyA9CisJCQkJcHN0YXRzLT5wZmNfZnJhbWVzX3R4X2xvOwogfQogCiBzdGF0aWMgdm9pZCBibngyeF9lbWFjX3N0YXRzX3VwZGF0ZShzdHJ1Y3QgYm54MnggKmJwKQpAQCAtNzQwLDcgKzc5NCw3IEBACiAJZXN0YXRzLT5icmJfZHJvcF9oaSA9IHBzdGF0cy0+YnJiX2Ryb3BfaGk7CiAJZXN0YXRzLT5icmJfZHJvcF9sbyA9IHBzdGF0cy0+YnJiX2Ryb3BfbG87CiAKLQlwc3RhdHMtPmhvc3RfcG9ydF9zdGF0c19zdGFydCA9ICsrcHN0YXRzLT5ob3N0X3BvcnRfc3RhdHNfZW5kOworCXBzdGF0cy0+aG9zdF9wb3J0X3N0YXRzX2NvdW50ZXIrKzsKIAogCWlmICghQlBfTk9NQ1AoYnApKSB7CiAJCXUzMiBuaWdfdGltZXJfbWF4ID0KQEAgLTEyNjUsNyArMTMxOSw3IEBACiAJCWRtYWUtPnNyY19hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpKTsKIAkJZG1hZS0+ZHN0X2FkZHJfbG8gPSBicC0+cG9ydC5wb3J0X3N0eCA+PiAyOwogCQlkbWFlLT5kc3RfYWRkcl9oaSA9IDA7Ci0JCWRtYWUtPmxlbiA9IHNpemVvZihzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzKSA+PiAyOworCQlkbWFlLT5sZW4gPSBibngyeF9nZXRfcG9ydF9zdGF0c19kbWFfbGVuKGJwKTsKIAkJaWYgKGJwLT5mdW5jX3N0eCkgewogCQkJZG1hZS0+Y29tcF9hZGRyX2xvID0gZG1hZV9yZWdfZ29fY1tsb2FkZXJfaWR4XSA+PiAyOwogCQkJZG1hZS0+Y29tcF9hZGRyX2hpID0gMDsKQEAgLTEzNDksMTIgKzE0MDMsMTQgQEAKIAllbnVtIGJueDJ4X3N0YXRzX3N0YXRlIHN0YXRlOwogCWlmICh1bmxpa2VseShicC0+cGFuaWMpKQogCQlyZXR1cm47Ci0JYm54Mnhfc3RhdHNfc3RtW2JwLT5zdGF0c19zdGF0ZV1bZXZlbnRdLmFjdGlvbihicCk7CisKIAlzcGluX2xvY2tfYmgoJmJwLT5zdGF0c19sb2NrKTsKIAlzdGF0ZSA9IGJwLT5zdGF0c19zdGF0ZTsKIAlicC0+c3RhdHNfc3RhdGUgPSBibngyeF9zdGF0c19zdG1bc3RhdGVdW2V2ZW50XS5uZXh0X3N0YXRlOwogCXNwaW5fdW5sb2NrX2JoKCZicC0+c3RhdHNfbG9jayk7CiAKKwlibngyeF9zdGF0c19zdG1bc3RhdGVdW2V2ZW50XS5hY3Rpb24oYnApOworCiAJaWYgKChldmVudCAhPSBTVEFUU19FVkVOVF9VUERBVEUpIHx8IG5ldGlmX21zZ190aW1lcihicCkpCiAJCURQKEJOWDJYX01TR19TVEFUUywgInN0YXRlICVkIC0+IGV2ZW50ICVkIC0+IHN0YXRlICVkXG4iLAogCQkgICBzdGF0ZSwgZXZlbnQsIGJwLT5zdGF0c19zdGF0ZSk7CkBAIC0xMzgwLDcgKzE0MzYsNyBAQAogCWRtYWUtPnNyY19hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHBvcnRfc3RhdHMpKTsKIAlkbWFlLT5kc3RfYWRkcl9sbyA9IGJwLT5wb3J0LnBvcnRfc3R4ID4+IDI7CiAJZG1hZS0+ZHN0X2FkZHJfaGkgPSAwOwotCWRtYWUtPmxlbiA9IHNpemVvZihzdHJ1Y3QgaG9zdF9wb3J0X3N0YXRzKSA+PiAyOworCWRtYWUtPmxlbiA9IGJueDJ4X2dldF9wb3J0X3N0YXRzX2RtYV9sZW4oYnApOwogCWRtYWUtPmNvbXBfYWRkcl9sbyA9IFU2NF9MTyhibngyeF9zcF9tYXBwaW5nKGJwLCBzdGF0c19jb21wKSk7CiAJZG1hZS0+Y29tcF9hZGRyX2hpID0gVTY0X0hJKGJueDJ4X3NwX21hcHBpbmcoYnAsIHN0YXRzX2NvbXApKTsKIAlkbWFlLT5jb21wX3ZhbCA9IERNQUVfQ09NUF9WQUw7CkBAIC0xNDU3LDYgKzE1MTMsNyBAQAogc3RhdGljIGlubGluZSB2b2lkIGJueDJ4X3ByZXBfZndfc3RhdHNfcmVxKHN0cnVjdCBibngyeCAqYnApCiB7CiAJaW50IGk7CisJaW50IGZpcnN0X3F1ZXVlX3F1ZXJ5X2luZGV4OwogCXN0cnVjdCBzdGF0c19xdWVyeV9oZWFkZXIgKnN0YXRzX2hkciA9ICZicC0+Zndfc3RhdHNfcmVxLT5oZHI7CiAKIAlkbWFfYWRkcl90IGN1cl9kYXRhX29mZnNldDsKQEAgLTE1MTIsMTQgKzE1NjksNDAgQEAKIAljdXJfcXVlcnlfZW50cnktPmFkZHJlc3MuaGkgPSBjcHVfdG9fbGUzMihVNjRfSEkoY3VyX2RhdGFfb2Zmc2V0KSk7CiAJY3VyX3F1ZXJ5X2VudHJ5LT5hZGRyZXNzLmxvID0gY3B1X3RvX2xlMzIoVTY0X0xPKGN1cl9kYXRhX29mZnNldCkpOwogCisJLyoqKiogRkNvRSBGVyBzdGF0aXN0aWNzIGRhdGEgKioqKi8KKwlpZiAoIU5PX0ZDT0UoYnApKSB7CisJCWN1cl9kYXRhX29mZnNldCA9IGJwLT5md19zdGF0c19kYXRhX21hcHBpbmcgKworCQkJb2Zmc2V0b2Yoc3RydWN0IGJueDJ4X2Z3X3N0YXRzX2RhdGEsIGZjb2UpOworCisJCWN1cl9xdWVyeV9lbnRyeSA9CisJCQkmYnAtPmZ3X3N0YXRzX3JlcS0+cXVlcnlbQk5YMlhfRkNPRV9RVUVSWV9JRFhdOworCisJCWN1cl9xdWVyeV9lbnRyeS0+a2luZCA9IFNUQVRTX1RZUEVfRkNPRTsKKwkJLyogRm9yIEZDb0UgcXVlcnkgaW5kZXggaXMgYSBET05UIENBUkUgKi8KKwkJY3VyX3F1ZXJ5X2VudHJ5LT5pbmRleCA9IEJQX1BPUlQoYnApOworCQljdXJfcXVlcnlfZW50cnktPmZ1bmNJRCA9IGNwdV90b19sZTE2KEJQX0ZVTkMoYnApKTsKKwkJY3VyX3F1ZXJ5X2VudHJ5LT5hZGRyZXNzLmhpID0KKwkJCWNwdV90b19sZTMyKFU2NF9ISShjdXJfZGF0YV9vZmZzZXQpKTsKKwkJY3VyX3F1ZXJ5X2VudHJ5LT5hZGRyZXNzLmxvID0KKwkJCWNwdV90b19sZTMyKFU2NF9MTyhjdXJfZGF0YV9vZmZzZXQpKTsKKwl9CisKIAkvKioqKiBDbGllbnRzJyBxdWVyaWVzICoqKiovCiAJY3VyX2RhdGFfb2Zmc2V0ID0gYnAtPmZ3X3N0YXRzX2RhdGFfbWFwcGluZyArCiAJCW9mZnNldG9mKHN0cnVjdCBibngyeF9md19zdGF0c19kYXRhLCBxdWV1ZV9zdGF0cyk7CiAKKwkvKiBmaXJzdCBxdWV1ZSBxdWVyeSBpbmRleCBkZXBlbmRzIHdoZXRoZXIgRkNvRSBvZmZsb2FkZWQgcmVxdWVzdCB3aWxsCisJICogYmUgaW5jbHVkZWQgaW4gdGhlIHJhbXJvZAorCSAqLworCWlmICghTk9fRkNPRShicCkpCisJCWZpcnN0X3F1ZXVlX3F1ZXJ5X2luZGV4ID0gQk5YMlhfRklSU1RfUVVFVUVfUVVFUllfSURYOworCWVsc2UKKwkJZmlyc3RfcXVldWVfcXVlcnlfaW5kZXggPSBCTlgyWF9GSVJTVF9RVUVVRV9RVUVSWV9JRFggLSAxOworCiAJZm9yX2VhY2hfZXRoX3F1ZXVlKGJwLCBpKSB7CiAJCWN1cl9xdWVyeV9lbnRyeSA9CiAJCQkmYnAtPmZ3X3N0YXRzX3JlcS0+Ci0JCQkJCXF1ZXJ5W0JOWDJYX0ZJUlNUX1FVRVVFX1FVRVJZX0lEWCArIGldOworCQkJCQlxdWVyeVtmaXJzdF9xdWV1ZV9xdWVyeV9pbmRleCArIGldOwogCiAJCWN1cl9xdWVyeV9lbnRyeS0+a2luZCA9IFNUQVRTX1RZUEVfUVVFVUU7CiAJCWN1cl9xdWVyeV9lbnRyeS0+aW5kZXggPSBibngyeF9zdGF0c19pZCgmYnAtPmZwW2ldKTsKQEAgLTE1MzEsNiArMTYxNCwyMSBAQAogCiAJCWN1cl9kYXRhX29mZnNldCArPSBzaXplb2Yoc3RydWN0IHBlcl9xdWV1ZV9zdGF0cyk7CiAJfQorCisJLyogYWRkIEZDb0UgcXVldWUgcXVlcnkgaWYgbmVlZGVkICovCisJaWYgKCFOT19GQ09FKGJwKSkgeworCQljdXJfcXVlcnlfZW50cnkgPQorCQkJJmJwLT5md19zdGF0c19yZXEtPgorCQkJCQlxdWVyeVtmaXJzdF9xdWV1ZV9xdWVyeV9pbmRleCArIGldOworCisJCWN1cl9xdWVyeV9lbnRyeS0+a2luZCA9IFNUQVRTX1RZUEVfUVVFVUU7CisJCWN1cl9xdWVyeV9lbnRyeS0+aW5kZXggPSBibngyeF9zdGF0c19pZCgmYnAtPmZwW0ZDT0VfSURYXSk7CisJCWN1cl9xdWVyeV9lbnRyeS0+ZnVuY0lEID0gY3B1X3RvX2xlMTYoQlBfRlVOQyhicCkpOworCQljdXJfcXVlcnlfZW50cnktPmFkZHJlc3MuaGkgPQorCQkJY3B1X3RvX2xlMzIoVTY0X0hJKGN1cl9kYXRhX29mZnNldCkpOworCQljdXJfcXVlcnlfZW50cnktPmFkZHJlc3MubG8gPQorCQkJY3B1X3RvX2xlMzIoVTY0X0xPKGN1cl9kYXRhX29mZnNldCkpOworCX0KIH0KIAogdm9pZCBibngyeF9zdGF0c19pbml0KHN0cnVjdCBibngyeCAqYnApCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zdGF0cy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vYm54MngvYm54Mnhfc3RhdHMuaAppbmRleCA1ZDhjZTJmLi42ODNkZWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9ibngyeC9ibngyeF9zdGF0cy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2JueDJ4L2JueDJ4X3N0YXRzLmgKQEAgLTE5Myw2ICsxOTMsMTIgQEAKIAl1MzIgdG90YWxfdHBhX2FnZ3JlZ2F0ZWRfZnJhbWVzX2xvOwogCXUzMiB0b3RhbF90cGFfYnl0ZXNfaGk7CiAJdTMyIHRvdGFsX3RwYV9ieXRlc19sbzsKKworCS8qIFBGQyAqLworCXUzMiBwZmNfZnJhbWVzX3JlY2VpdmVkX2hpOworCXUzMiBwZmNfZnJhbWVzX3JlY2VpdmVkX2xvOworCXUzMiBwZmNfZnJhbWVzX3NlbnRfaGk7CisJdTMyIHBmY19mcmFtZXNfc2VudF9sbzsKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pYy5jCmluZGV4IDZmMTBjNjkuLmRkM2EwYTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljLmMKQEAgLTI1MCw2ICsyNTAsMjEgQEAKIAlyZXR1cm4gaW8tPmRhdGE7CiB9CiAKK3N0YXRpYyB2b2lkIGNuaWNfdWxwX2N0bChzdHJ1Y3QgY25pY19kZXYgKmRldiwgaW50IHVscF90eXBlLCBib29sIHJlZykKK3sKKwlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKKwlzdHJ1Y3QgY25pY19ldGhfZGV2ICpldGhkZXYgPSBjcC0+ZXRoZGV2OworCXN0cnVjdCBkcnZfY3RsX2luZm8gaW5mbzsKKworCWlmIChyZWcpCisJCWluZm8uY21kID0gRFJWX0NUTF9VTFBfUkVHSVNURVJfQ01EOworCWVsc2UKKwkJaW5mby5jbWQgPSBEUlZfQ1RMX1VMUF9VTlJFR0lTVEVSX0NNRDsKKworCWluZm8uZGF0YS51bHBfdHlwZSA9IHVscF90eXBlOworCWV0aGRldi0+ZHJ2X2N0bChkZXYtPm5ldGRldiwgJmluZm8pOworfQorCiBzdGF0aWMgaW50IGNuaWNfaW5fdXNlKHN0cnVjdCBjbmljX3NvY2sgKmNzaykKIHsKIAlyZXR1cm4gdGVzdF9iaXQoU0tfRl9JTlVTRSwgJmNzay0+ZmxhZ3MpOwpAQCAtNTA2LDcgKzUyMSw3IEBACiAJfQogCXJlYWRfdW5sb2NrKCZjbmljX2Rldl9sb2NrKTsKIAotCXJjdV9hc3NpZ25fcG9pbnRlcihjbmljX3VscF90YmxbdWxwX3R5cGVdLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKGNuaWNfdWxwX3RibFt1bHBfdHlwZV0sIE5VTEwpOwogCiAJbXV0ZXhfdW5sb2NrKCZjbmljX2xvY2spOwogCXN5bmNocm9uaXplX3JjdSgpOwpAQCAtNTYzLDYgKzU3OCw4IEBACiAKIAltdXRleF91bmxvY2soJmNuaWNfbG9jayk7CiAKKwljbmljX3VscF9jdGwoZGV2LCB1bHBfdHlwZSwgdHJ1ZSk7CisKIAlyZXR1cm4gMDsKIAogfQpAQCAtNTc5LDcgKzU5Niw3IEBACiAJfQogCW11dGV4X2xvY2soJmNuaWNfbG9jayk7CiAJaWYgKHJjdV9kZXJlZmVyZW5jZShjcC0+dWxwX29wc1t1bHBfdHlwZV0pKSB7Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihjcC0+dWxwX29wc1t1bHBfdHlwZV0sIE5VTEwpOworCQlSQ1VfSU5JVF9QT0lOVEVSKGNwLT51bHBfb3BzW3VscF90eXBlXSwgTlVMTCk7CiAJCWNuaWNfcHV0KGRldik7CiAJfSBlbHNlIHsKIAkJcHJfZXJyKCIlczogZGV2aWNlIG5vdCByZWdpc3RlcmVkIHRvIHRoaXMgdWxwIHR5cGUgJWRcbiIsCkBAIC02MDIsNiArNjE5LDggQEAKIAlpZiAodGVzdF9iaXQoVUxQX0ZfQ0FMTF9QRU5ESU5HLCAmY3AtPnVscF9mbGFnc1t1bHBfdHlwZV0pKQogCQluZXRkZXZfd2FybihkZXYtPm5ldGRldiwgIkZhaWxlZCB3YWl0aW5nIGZvciBVTFAgdXAgY2FsbCB0byBjb21wbGV0ZVxuIik7CiAKKwljbmljX3VscF9jdGwoZGV2LCB1bHBfdHlwZSwgZmFsc2UpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKGNuaWNfdW5yZWdpc3Rlcl9kcml2ZXIpOwpAQCAtMTM0Miw3ICsxMzYxLDcgQEAKIAlpZiAocmV0ID09IDEpCiAJCXJldHVybiAwOwogCi0JcmV0dXJuIC1FQlVTWTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBjbmljX3JlcGx5X2JueDJ4X2tjcWVzKHN0cnVjdCBjbmljX2RldiAqZGV2LCBpbnQgdWxwX3R5cGUsCkBAIC0xODMwLDcgKzE4NDksNyBAQAogZG9uZToKIAljcWVzWzBdID0gKHN0cnVjdCBrY3FlICopICZrY3FlOwogCWNuaWNfcmVwbHlfYm54Mnhfa2NxZXMoZGV2LCBDTklDX1VMUF9JU0NTSSwgY3FlcywgMSk7Ci0JcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0xOTI4LDcgKzE5NDcsNyBAQAogCWNxZXNbMF0gPSAoc3RydWN0IGtjcWUgKikgJmtjcWU7CiAJY25pY19yZXBseV9ibngyeF9rY3FlcyhkZXYsIENOSUNfVUxQX0lTQ1NJLCBjcWVzLCAxKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGNuaWNfaW5pdF9zdG9ybV9jb25uX2J1ZnMoc3RydWN0IGNuaWNfZGV2ICpkZXYsCkBAIC0yNDk0LDYgKzI1MTMsNTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCBjbmljX2JueDJ4X2t3cWVfZXJyKHN0cnVjdCBjbmljX2RldiAqZGV2LCBzdHJ1Y3Qga3dxZSAqa3dxZSkKK3sKKwlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKKwlzdHJ1Y3Qga2NxZSBrY3FlOworCXN0cnVjdCBrY3FlICpjcWVzWzFdOworCXUzMiBjaWQ7CisJdTMyIG9wY29kZSA9IEtXUUVfT1BDT0RFKGt3cWUtPmt3cWVfb3BfZmxhZyk7CisJdTMyIGxheWVyX2NvZGUgPSBrd3FlLT5rd3FlX29wX2ZsYWcgJiBLV1FFX0xBWUVSX01BU0s7CisJaW50IHVscF90eXBlOworCisJY2lkID0ga3dxZS0+a3dxZV9pbmZvMDsKKwltZW1zZXQoJmtjcWUsIDAsIHNpemVvZihrY3FlKSk7CisKKwlpZiAobGF5ZXJfY29kZSA9PSBLV1FFX0ZMQUdTX0xBWUVSX01BU0tfTDVfSVNDU0kpIHsKKwkJdWxwX3R5cGUgPSBDTklDX1VMUF9JU0NTSTsKKwkJaWYgKG9wY29kZSA9PSBJU0NTSV9LV1FFX09QQ09ERV9VUERBVEVfQ09OTikKKwkJCWNpZCA9IGt3cWUtPmt3cWVfaW5mbzE7CisKKwkJa2NxZS5rY3FlX29wX2ZsYWcgPSAob3Bjb2RlICsgMHgxMCkgPDwgS0NRRV9GTEFHU19PUENPREVfU0hJRlQ7CisJCWtjcWUua2NxZV9vcF9mbGFnIHw9IEtDUUVfRkxBR1NfTEFZRVJfTUFTS19MNV9JU0NTSTsKKwkJa2NxZS5rY3FlX2luZm8xID0gSVNDU0lfS0NRRV9DT01QTEVUSU9OX1NUQVRVU19OSUNfRVJST1I7CisJCWtjcWUua2NxZV9pbmZvMiA9IGNpZDsKKwkJY25pY19nZXRfbDVfY2lkKGNwLCBCTlgyWF9TV19DSUQoY2lkKSwgJmtjcWUua2NxZV9pbmZvMCk7CisKKwl9IGVsc2UgaWYgKGxheWVyX2NvZGUgPT0gS1dRRV9GTEFHU19MQVlFUl9NQVNLX0w0KSB7CisJCXN0cnVjdCBsNF9rY3EgKmw0a2NxZSA9IChzdHJ1Y3QgbDRfa2NxICopICZrY3FlOworCQl1MzIga2NxZV9vcDsKKworCQl1bHBfdHlwZSA9IENOSUNfVUxQX0w0OworCQlpZiAob3Bjb2RlID09IEw0X0tXUUVfT1BDT0RFX1ZBTFVFX0NPTk5FQ1QxKQorCQkJa2NxZV9vcCA9IEw0X0tDUUVfT1BDT0RFX1ZBTFVFX0NPTk5FQ1RfQ09NUExFVEU7CisJCWVsc2UgaWYgKG9wY29kZSA9PSBMNF9LV1FFX09QQ09ERV9WQUxVRV9SRVNFVCkKKwkJCWtjcWVfb3AgPSBMNF9LQ1FFX09QQ09ERV9WQUxVRV9SRVNFVF9DT01QOworCQllbHNlIGlmIChvcGNvZGUgPT0gTDRfS1dRRV9PUENPREVfVkFMVUVfQ0xPU0UpCisJCQlrY3FlX29wID0gTDRfS0NRRV9PUENPREVfVkFMVUVfQ0xPU0VfQ09NUDsKKwkJZWxzZQorCQkJcmV0dXJuOworCisJCWtjcWUua2NxZV9vcF9mbGFnID0gKGtjcWVfb3AgPDwgS0NRRV9GTEFHU19PUENPREVfU0hJRlQpIHwKKwkJCQkgICAgS0NRRV9GTEFHU19MQVlFUl9NQVNLX0w0OworCQlsNGtjcWUtPnN0YXR1cyA9IEw0X0tDUUVfQ09NUExFVElPTl9TVEFUVVNfTklDX0VSUk9SOworCQlsNGtjcWUtPmNpZCA9IGNpZDsKKwkJY25pY19nZXRfbDVfY2lkKGNwLCBCTlgyWF9TV19DSUQoY2lkKSwgJmw0a2NxZS0+Y29ubl9pZCk7CisJfSBlbHNlIHsKKwkJcmV0dXJuOworCX0KKworCWNxZXNbMF0gPSAoc3RydWN0IGtjcWUgKikgJmtjcWU7CisJY25pY19yZXBseV9ibngyeF9rY3FlcyhkZXYsIHVscF90eXBlLCBjcWVzLCAxKTsKK30KKwogc3RhdGljIGludCBjbmljX3N1Ym1pdF9ibngyeF9pc2NzaV9rd3FlcyhzdHJ1Y3QgY25pY19kZXYgKmRldiwKIAkJCQkJIHN0cnVjdCBrd3FlICp3cWVzW10sIHUzMiBudW1fd3FlcykKIHsKQEAgLTI1NTEsOSArMjYyMSwxNyBAQAogCQkJCSAgIG9wY29kZSk7CiAJCQlicmVhazsKIAkJfQotCQlpZiAocmV0IDwgMCkKKwkJaWYgKHJldCA8IDApIHsKIAkJCW5ldGRldl9lcnIoZGV2LT5uZXRkZXYsICJLV1FFKDB4JXgpIGZhaWxlZFxuIiwKIAkJCQkgICBvcGNvZGUpOworCisJCQkvKiBQb3NzaWJseSBibngyeCBwYXJpdHkgZXJyb3IsIHNlbmQgY29tcGxldGlvbgorCQkJICogdG8gdWxwIGRyaXZlcnMgd2l0aCBlcnJvciBjb2RlIHRvIHNwZWVkIHVwCisJCQkgKiBjbGVhbnVwIGFuZCByZXNldCByZWNvdmVyeS4KKwkJCSAqLworCQkJaWYgKHJldCA9PSAtRUlPIHx8IHJldCA9PSAtRUFHQUlOKQorCQkJCWNuaWNfYm54Mnhfa3dxZV9lcnIoZGV2LCBrd3FlKTsKKwkJfQogCQlpICs9IHdvcms7CiAJfQogCXJldHVybiAwOwpAQCAtMzA1Miw5ICszMTMwLDI2IEBACiAJfQogfQogCitzdGF0aWMgaW50IGNuaWNfY29weV91bHBfc3RhdHMoc3RydWN0IGNuaWNfZGV2ICpkZXYsIGludCB1bHBfdHlwZSkKK3sKKwlzdHJ1Y3QgY25pY19sb2NhbCAqY3AgPSBkZXYtPmNuaWNfcHJpdjsKKwlzdHJ1Y3QgY25pY191bHBfb3BzICp1bHBfb3BzOworCWludCByYzsKKworCW11dGV4X2xvY2soJmNuaWNfbG9jayk7CisJdWxwX29wcyA9IGNuaWNfdWxwX3RibF9wcm90KHVscF90eXBlKTsKKwlpZiAodWxwX29wcyAmJiB1bHBfb3BzLT5jbmljX2dldF9zdGF0cykKKwkJcmMgPSB1bHBfb3BzLT5jbmljX2dldF9zdGF0cyhjcC0+dWxwX2hhbmRsZVt1bHBfdHlwZV0pOworCWVsc2UKKwkJcmMgPSAtRU5PREVWOworCW11dGV4X3VubG9jaygmY25pY19sb2NrKTsKKwlyZXR1cm4gcmM7Cit9CisKIHN0YXRpYyBpbnQgY25pY19jdGwodm9pZCAqZGF0YSwgc3RydWN0IGNuaWNfY3RsX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IGNuaWNfZGV2ICpkZXYgPSBkYXRhOworCWludCB1bHBfdHlwZSA9IENOSUNfVUxQX0lTQ1NJOwogCiAJc3dpdGNoIChpbmZvLT5jbWQpIHsKIAljYXNlIENOSUNfQ1RMX1NUT1BfQ01EOgpAQCAtMzEwMCw2ICszMTk1LDE1IEBACiAJCX0KIAkJYnJlYWs7CiAJfQorCWNhc2UgQ05JQ19DVExfRkNPRV9TVEFUU19HRVRfQ01EOgorCQl1bHBfdHlwZSA9IENOSUNfVUxQX0ZDT0U7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgQ05JQ19DVExfSVNDU0lfU1RBVFNfR0VUX0NNRDoKKwkJY25pY19ob2xkKGRldik7CisJCWNuaWNfY29weV91bHBfc3RhdHMoZGV2LCB1bHBfdHlwZSk7CisJCWNuaWNfcHV0KGRldik7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMzQ3NSw3ICszNTc5LDcgQEAKIAlzdHJ1Y3QgZmxvd2k2IGZsNjsKIAogCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgJmRzdF9hZGRyLT5zaW42X2FkZHIpOworCWZsNi5kYWRkciA9IGRzdF9hZGRyLT5zaW42X2FkZHI7CiAJaWYgKGlwdjZfYWRkcl90eXBlKCZmbDYuZGFkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKIAkJZmw2LmZsb3dpNl9vaWYgPSBkc3RfYWRkci0+c2luNl9zY29wZV9pZDsKIApAQCAtMzgwNCw2ICszOTA4LDkgQEAKIAljYXNlIEw0X0tDUUVfT1BDT0RFX1ZBTFVFX1JFU0VUX0NPTVA6CiAJY2FzZSBMNUNNX1JBTVJPRF9DTURfSURfU0VBUkNIRVJfREVMRVRFOgogCWNhc2UgTDVDTV9SQU1ST0RfQ01EX0lEX1RFUk1JTkFURV9PRkZMT0FEOgorCQlpZiAobDRrY3FlLT5zdGF0dXMgPT0gTDRfS0NRRV9DT01QTEVUSU9OX1NUQVRVU19OSUNfRVJST1IpCisJCQlzZXRfYml0KFNLX0ZfSFdfRVJSLCAmY3NrLT5mbGFncyk7CisKIAkJY3AtPmNsb3NlX2Nvbm4oY3NrLCBvcGNvZGUpOwogCQlicmVhazsKIApAQCAtMzkzMSw3ICs0MDM4LDkgQEAKIAljYXNlIEw0X0tDUUVfT1BDT0RFX1ZBTFVFX0NMT1NFX0NPTVA6CiAJY2FzZSBMNF9LQ1FFX09QQ09ERV9WQUxVRV9SRVNFVF9DT01QOgogCQlpZiAoY25pY19yZWFkeV90b19jbG9zZShjc2ssIG9wY29kZSkpIHsKLQkJCWlmICh0ZXN0X2JpdChTS19GX1BHX09GRkxEX0NPTVBMRVRFLCAmY3NrLT5mbGFncykpCisJCQlpZiAodGVzdF9iaXQoU0tfRl9IV19FUlIsICZjc2stPmZsYWdzKSkKKwkJCQljbG9zZV9jb21wbGV0ZSA9IDE7CisJCQllbHNlIGlmICh0ZXN0X2JpdChTS19GX1BHX09GRkxEX0NPTVBMRVRFLCAmY3NrLT5mbGFncykpCiAJCQkJY21kID0gTDVDTV9SQU1ST0RfQ01EX0lEX1NFQVJDSEVSX0RFTEVURTsKIAkJCWVsc2UKIAkJCQljbG9zZV9jb21wbGV0ZSA9IDE7CkBAIC00ODI0LDYgKzQ5MzMsNyBAQAogCWludCBmdW5jID0gQ05JQ19GVU5DKGNwKSwgcmV0OwogCXUzMiBwZmlkOwogCisJZGV2LT5zdGF0c19hZGRyID0gZXRoZGV2LT5hZGRyX2Rydl9pbmZvX3RvX21jcDsKIAljcC0+cG9ydF9tb2RlID0gQ0hJUF9QT1JUX01PREVfTk9ORTsKIAogCWlmIChCTlgyWF9DSElQX0lTX0UyX1BMVVMoY3AtPmNoaXBfaWQpKSB7CkBAIC01MTM0LDcgKzUyNDQsNyBAQAogCQl9CiAJCWNuaWNfc2h1dGRvd25fcmluZ3MoZGV2KTsKIAkJY2xlYXJfYml0KENOSUNfRl9DTklDX1VQLCAmZGV2LT5mbGFncyk7Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihjcC0+dWxwX29wc1tDTklDX1VMUF9MNF0sIE5VTEwpOworCQlSQ1VfSU5JVF9QT0lOVEVSKGNwLT51bHBfb3BzW0NOSUNfVUxQX0w0XSwgTlVMTCk7CiAJCXN5bmNocm9uaXplX3JjdSgpOwogCQljbmljX2NtX3NodXRkb3duKGRldik7CiAJCWNwLT5zdG9wX2h3KGRldik7CkBAIC01Mjg4LDYgKzUzOTgsOCBAQAogCWNkZXYtPnBjaWRldiA9IHBkZXY7CiAJY3AtPmNoaXBfaWQgPSBldGhkZXYtPmNoaXBfaWQ7CiAKKwljZGV2LT5zdGF0c19hZGRyID0gZXRoZGV2LT5hZGRyX2Rydl9pbmZvX3RvX21jcDsKKwogCWlmICghKGV0aGRldi0+ZHJ2X3N0YXRlICYgQ05JQ19EUlZfU1RBVEVfTk9fSVNDU0kpKQogCQljZGV2LT5tYXhfaXNjc2lfY29ubiA9IGV0aGRldi0+bWF4X2lzY3NpX2Nvbm47CiAJaWYgKEJOWDJYX0NISVBfSVNfRTJfUExVUyhjcC0+Y2hpcF9pZCkgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWNfZGVmcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19kZWZzLmgKaW5kZXggMjM5ZGU4OS4uODY5MzZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19kZWZzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19kZWZzLmgKQEAgLTg1LDYgKzg1LDcgQEAKIAogLyogS0NRIChrZXJuZWwgY29tcGxldGlvbiBxdWV1ZSkgY29tcGxldGlvbiBzdGF0dXMgKi8KICNkZWZpbmUgTDRfS0NRRV9DT01QTEVUSU9OX1NUQVRVU19TVUNDRVNTICAgICAgICAgICAoMCkKKyNkZWZpbmUgTDRfS0NRRV9DT01QTEVUSU9OX1NUQVRVU19OSUNfRVJST1IgICAgICAgICAoNCkKICNkZWZpbmUgTDRfS0NRRV9DT01QTEVUSU9OX1NUQVRVU19USU1FT1VUICAgICAgICAgICAoMHg5MykKIAogI2RlZmluZSBMNF9LQ1FFX0NPTVBMRVRJT05fU1RBVFVTX0NUWF9BTExPQ19GQUlMICAgICgweDgzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19pZi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vY25pY19pZi5oCmluZGV4IDc5NDQzZTAuLjE1MTc3NjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL2NuaWNfaWYuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9jbmljX2lmLmgKQEAgLTEsNiArMSw2IEBACiAvKiBjbmljX2lmLmg6IEJyb2FkY29tIENOSUMgY29yZSBuZXR3b3JrIGRyaXZlci4KICAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMTIgQnJvYWRjb20gQ29ycG9yYXRpb24KICAqCiAgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKQEAgLTEyLDggKzEyLDggQEAKICNpZm5kZWYgQ05JQ19JRl9ICiAjZGVmaW5lIENOSUNfSUZfSAogCi0jZGVmaW5lIENOSUNfTU9EVUxFX1ZFUlNJT04JIjIuNS43IgotI2RlZmluZSBDTklDX01PRFVMRV9SRUxEQVRFCSJKdWx5IDIwLCAyMDExIgorI2RlZmluZSBDTklDX01PRFVMRV9WRVJTSU9OCSIyLjUuOCIKKyNkZWZpbmUgQ05JQ19NT0RVTEVfUkVMREFURQkiSmFuIDMsIDIwMTIiCiAKICNkZWZpbmUgQ05JQ19VTFBfUkRNQQkJMAogI2RlZmluZSBDTklDX1VMUF9JU0NTSQkJMQpAQCAtODYsNiArODYsOCBAQAogI2RlZmluZSBDTklDX0NUTF9TVEFSVF9DTUQJCTIKICNkZWZpbmUgQ05JQ19DVExfQ09NUExFVElPTl9DTUQJCTMKICNkZWZpbmUgQ05JQ19DVExfU1RPUF9JU0NTSV9DTUQJCTQKKyNkZWZpbmUgQ05JQ19DVExfRkNPRV9TVEFUU19HRVRfQ01ECTUKKyNkZWZpbmUgQ05JQ19DVExfSVNDU0lfU1RBVFNfR0VUX0NNRAk2CiAKICNkZWZpbmUgRFJWX0NUTF9JT19XUl9DTUQJCTB4MTAxCiAjZGVmaW5lIERSVl9DVExfSU9fUkRfQ01ECQkweDEwMgpAQCAtOTYsNiArOTgsOCBAQAogI2RlZmluZSBEUlZfQ1RMX1NUT1BfTDJfQ01ECQkweDEwNwogI2RlZmluZSBEUlZfQ1RMX1JFVF9MMl9TUFFfQ1JFRElUX0NNRAkweDEwYwogI2RlZmluZSBEUlZfQ1RMX0lTQ1NJX1NUT1BQRURfQ01ECTB4MTBkCisjZGVmaW5lIERSVl9DVExfVUxQX1JFR0lTVEVSX0NNRAkweDEwZQorI2RlZmluZSBEUlZfQ1RMX1VMUF9VTlJFR0lTVEVSX0NNRAkweDEwZgogCiBzdHJ1Y3QgY25pY19jdGxfY29tcGxldGlvbiB7CiAJdTMyCWNpZDsKQEAgLTEzMyw2ICsxMzcsNyBAQAogCQlzdHJ1Y3QgZHJ2X2N0bF9zcHFfY3JlZGl0IGNyZWRpdDsKIAkJc3RydWN0IGRydl9jdGxfaW8gaW87CiAJCXN0cnVjdCBkcnZfY3RsX2wyX3JpbmcgcmluZzsKKwkJaW50IHVscF90eXBlOwogCQljaGFyIGJ5dGVzW01BWF9EUlZfQ1RMX0RBVEFdOwogCX0gZGF0YTsKIH07CkBAIC0yMDEsNiArMjA2LDcgQEAKIAkJCQkJICAgICAgIHN0cnVjdCBrd3FlXzE2ICpbXSwgdTMyKTsKIAlpbnQJCSgqZHJ2X2N0bCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGRydl9jdGxfaW5mbyAqKTsKIAl1bnNpZ25lZCBsb25nCXJlc2VydmVkMVsyXTsKKwl1bmlvbiBkcnZfaW5mb190b19tY3AJKmFkZHJfZHJ2X2luZm9fdG9fbWNwOwogfTsKIAogc3RydWN0IGNuaWNfc29ja2FkZHIgewpAQCAtMjU1LDYgKzI2MSw3IEBACiAjZGVmaW5lIFNLX0ZfQ09OTkVDVF9TVEFSVAk0CiAjZGVmaW5lIFNLX0ZfSVBWNgkJNQogI2RlZmluZSBTS19GX0NMT1NJTkcJCTcKKyNkZWZpbmUgU0tfRl9IV19FUlIJCTgKIAogCWF0b21pY190IHJlZl9jb3VudDsKIAl1MzIgc3RhdGU7CkBAIC0yOTcsNiArMzA0LDggQEAKIAlpbnQJCW1heF9mY29lX2Nvbm47CiAJaW50CQltYXhfcmRtYV9jb25uOwogCisJdW5pb24gZHJ2X2luZm9fdG9fbWNwCSpzdGF0c19hZGRyOworCiAJdm9pZAkJKmNuaWNfcHJpdjsKIH07CiAKQEAgLTMyNiw2ICszMzUsNyBAQAogCXZvaWQgKCpjbV9yZW1vdGVfYWJvcnQpKHN0cnVjdCBjbmljX3NvY2sgKik7CiAJaW50ICgqaXNjc2lfbmxfc2VuZF9tc2cpKHZvaWQgKnVscF9jdHgsIHUzMiBtc2dfdHlwZSwKIAkJCQkgIGNoYXIgKmRhdGEsIHUxNiBkYXRhX3NpemUpOworCWludCAoKmNuaWNfZ2V0X3N0YXRzKSh2b2lkICp1bHBfY3R4KTsKIAlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKIAlhdG9taWNfdCByZWZfY291bnQ7CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vc2IxMjUwLW1hYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vc2IxMjUwLW1hYy5jCmluZGV4IDBhMWQ3ZjIuLjhmYTdhYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3NiMTI1MC1tYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9hZGNvbS9zYjEyNTAtbWFjLmMKQEAgLTE2Myw3ICsxNjMsNiBAQAogI2RlZmluZSBTQk1BQ19NQVhfVFhERVNDUgkyNTYKICNkZWZpbmUgU0JNQUNfTUFYX1JYREVTQ1IJMjU2CiAKLSNkZWZpbmUgRVRIRVJfQUREUl9MRU4JCTYKICNkZWZpbmUgRU5FVF9QQUNLRVRfU0laRQkxNTE4CiAvKiNkZWZpbmUgRU5FVF9QQUNLRVRfU0laRQk5MjE2ICovCiAKQEAgLTI2Niw3ICsyNjUsNyBAQAogCWludAkJCXNibV9wYXVzZTsJLyogY3VycmVudCBwYXVzZSBzZXR0aW5nICovCiAJaW50CQkJc2JtX2xpbms7CS8qIGN1cnJlbnQgbGluayBzdGF0ZSAqLwogCi0JdW5zaWduZWQgY2hhcgkJc2JtX2h3YWRkcltFVEhFUl9BRERSX0xFTl07CisJdW5zaWduZWQgY2hhcgkJc2JtX2h3YWRkcltFVEhfQUxFTl07CiAKIAlzdHJ1Y3Qgc2JtYWNkbWEJCXNibV90eGRtYTsJLyogb25seSBjaGFubmVsIDAgZm9yIG5vdyAqLwogCXN0cnVjdCBzYm1hY2RtYQkJc2JtX3J4ZG1hOwpAQCAtMjY3NiwxNSArMjY3NSw0IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNibWFjX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2JtYWNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHNibWFjX2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNibWFjX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHNibWFjX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KHNibWFjX2NsZWFudXBfbW9kdWxlKTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2JtYWNfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKaW5kZXggYmY0MDc0MS4uMDc2ZTAyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmMKQEAgLTg5LDEwICs4OSwxMCBAQAogCiAjZGVmaW5lIERSVl9NT0RVTEVfTkFNRQkJInRnMyIKICNkZWZpbmUgVEczX01BSl9OVU0JCQkzCi0jZGVmaW5lIFRHM19NSU5fTlVNCQkJMTIxCisjZGVmaW5lIFRHM19NSU5fTlVNCQkJMTIyCiAjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTglcCiAJX19zdHJpbmdpZnkoVEczX01BSl9OVU0pICIuIiBfX3N0cmluZ2lmeShURzNfTUlOX05VTSkKLSNkZWZpbmUgRFJWX01PRFVMRV9SRUxEQVRFCSJOb3ZlbWJlciAyLCAyMDExIgorI2RlZmluZSBEUlZfTU9EVUxFX1JFTERBVEUJIkRlY2VtYmVyIDcsIDIwMTEiCiAKICNkZWZpbmUgUkVTRVRfS0lORF9TSFVURE9XTgkwCiAjZGVmaW5lIFJFU0VUX0tJTkRfSU5JVAkJMQpAQCAtMTM1LDcgKzEzNSw2IEBACiAJKHRnM19mbGFnKHRwLCBMUkdfUFJPRF9SSU5HX0NBUCkgPyBcCiAJIFRHM19SWF9KTUJfTUFYX1NJWkVfNTcxNyA6IFRHM19SWF9KTUJfTUFYX1NJWkVfNTcwMCkKICNkZWZpbmUgVEczX0RFRl9SWF9KVU1CT19SSU5HX1BFTkRJTkcJMTAwCi0jZGVmaW5lIFRHM19SU1NfSU5ESVJfVEJMX1NJWkUJCTEyOAogCiAvKiBEbyBub3QgcGxhY2UgdGhpcyBuLXJpbmcgZW50cmllcyB2YWx1ZSBpbnRvIHRoZSB0cCBzdHJ1Y3QgaXRzZWxmLAogICogd2UgcmVhbGx5IHdhbnQgdG8gZXhwb3NlIHRoZXNlIGNvbnN0YW50cyB0byBHQ0Mgc28gdGhhdCBtb2R1bG8gZXQKQEAgLTE5NCwxMiArMTkzLDEzIEBACiAjaWYgKE5FVF9JUF9BTElHTiAhPSAwKQogI2RlZmluZSBURzNfUlhfT0ZGU0VUKHRwKQkoKHRwKS0+cnhfb2Zmc2V0KQogI2Vsc2UKLSNkZWZpbmUgVEczX1JYX09GRlNFVCh0cCkJMAorI2RlZmluZSBURzNfUlhfT0ZGU0VUKHRwKQkoTkVUX1NLQl9QQUQpCiAjZW5kaWYKIAogLyogbWluaW11bSBudW1iZXIgb2YgZnJlZSBUWCBkZXNjcmlwdG9ycyByZXF1aXJlZCB0byB3YWtlIHVwIFRYIHByb2Nlc3MgKi8KICNkZWZpbmUgVEczX1RYX1dBS0VVUF9USFJFU0godG5hcGkpCQkoKHRuYXBpKS0+dHhfcGVuZGluZyAvIDQpCi0jZGVmaW5lIFRHM19UWF9CRF9ETUFfTUFYCQk0MDk2CisjZGVmaW5lIFRHM19UWF9CRF9ETUFfTUFYXzJLCQkyMDQ4CisjZGVmaW5lIFRHM19UWF9CRF9ETUFfTUFYXzRLCQk0MDk2CiAKICNkZWZpbmUgVEczX1JBV19JUF9BTElHTiAyCiAKQEAgLTE2NzAsMjIgKzE2NzAsNiBAQAogCX0KIH0KIAotc3RhdGljIHUxNiB0ZzNfYWR2ZXJ0X2Zsb3djdHJsXzEwMDBUKHU4IGZsb3dfY3RybCkKLXsKLQl1MTYgbWlpcmVnOwotCi0JaWYgKChmbG93X2N0cmwgJiBGTE9XX0NUUkxfVFgpICYmIChmbG93X2N0cmwgJiBGTE9XX0NUUkxfUlgpKQotCQltaWlyZWcgPSBBRFZFUlRJU0VfUEFVU0VfQ0FQOwotCWVsc2UgaWYgKGZsb3dfY3RybCAmIEZMT1dfQ1RSTF9UWCkKLQkJbWlpcmVnID0gQURWRVJUSVNFX1BBVVNFX0FTWU07Ci0JZWxzZSBpZiAoZmxvd19jdHJsICYgRkxPV19DVFJMX1JYKQotCQltaWlyZWcgPSBBRFZFUlRJU0VfUEFVU0VfQ0FQIHwgQURWRVJUSVNFX1BBVVNFX0FTWU07Ci0JZWxzZQotCQltaWlyZWcgPSAwOwotCi0JcmV0dXJuIG1paXJlZzsKLX0KLQogc3RhdGljIHUxNiB0ZzNfYWR2ZXJ0X2Zsb3djdHJsXzEwMDBYKHU4IGZsb3dfY3RybCkKIHsKIAl1MTYgbWlpcmVnOwpAQCAtMTcwNiwxOCArMTY5MCwxMiBAQAogewogCXU4IGNhcCA9IDA7CiAKLQlpZiAobGNsYWR2ICYgQURWRVJUSVNFXzEwMDBYUEFVU0UpIHsKLQkJaWYgKGxjbGFkdiAmIEFEVkVSVElTRV8xMDAwWFBTRV9BU1lNKSB7Ci0JCQlpZiAocm10YWR2ICYgTFBBXzEwMDBYUEFVU0UpCi0JCQkJY2FwID0gRkxPV19DVFJMX1RYIHwgRkxPV19DVFJMX1JYOwotCQkJZWxzZSBpZiAocm10YWR2ICYgTFBBXzEwMDBYUEFVU0VfQVNZTSkKLQkJCQljYXAgPSBGTE9XX0NUUkxfUlg7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAocm10YWR2ICYgTFBBXzEwMDBYUEFVU0UpCi0JCQkJY2FwID0gRkxPV19DVFJMX1RYIHwgRkxPV19DVFJMX1JYOwotCQl9Ci0JfSBlbHNlIGlmIChsY2xhZHYgJiBBRFZFUlRJU0VfMTAwMFhQU0VfQVNZTSkgewotCQlpZiAoKHJtdGFkdiAmIExQQV8xMDAwWFBBVVNFKSAmJiAocm10YWR2ICYgTFBBXzEwMDBYUEFVU0VfQVNZTSkpCisJaWYgKGxjbGFkdiAmIHJtdGFkdiAmIEFEVkVSVElTRV8xMDAwWFBBVVNFKSB7CisJCWNhcCA9IEZMT1dfQ1RSTF9UWCB8IEZMT1dfQ1RSTF9SWDsKKwl9IGVsc2UgaWYgKGxjbGFkdiAmIHJtdGFkdiAmIEFEVkVSVElTRV8xMDAwWFBTRV9BU1lNKSB7CisJCWlmIChsY2xhZHYgJiBBRFZFUlRJU0VfMTAwMFhQQVVTRSkKKwkJCWNhcCA9IEZMT1dfQ1RSTF9SWDsKKwkJaWYgKHJtdGFkdiAmIEFEVkVSVElTRV8xMDAwWFBBVVNFKQogCQkJY2FwID0gRkxPV19DVFJMX1RYOwogCX0KIApAQCAtMTc5Miw3ICsxNzcwLDcgQEAKIAkJaWYgKHBoeWRldi0+ZHVwbGV4ID09IERVUExFWF9IQUxGKQogCQkJbWFjX21vZGUgfD0gTUFDX01PREVfSEFMRl9EVVBMRVg7CiAJCWVsc2UgewotCQkJbGNsX2FkdiA9IHRnM19hZHZlcnRfZmxvd2N0cmxfMTAwMFQoCisJCQlsY2xfYWR2ID0gbWlpX2FkdmVydGlzZV9mbG93Y3RybCgKIAkJCQkgIHRwLT5saW5rX2NvbmZpZy5mbG93Y3RybCk7CiAKIAkJCWlmIChwaHlkZXYtPnBhdXNlKQpAQCAtMjE2MCw3ICsyMTM4LDcgQEAKIAlpZiAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCA9PSBTUEVFRF8xMDAwICYmCiAJICAgIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxNyB8fAogCSAgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTkgfHwKLQkgICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkgJiYKKwkgICAgIHRnM19mbGFnKHRwLCA1Nzc2NV9DTEFTUykpICYmCiAJICAgICFURzNfUEhZX0FVWENUTF9TTURTUF9FTkFCTEUodHApKSB7CiAJCXZhbCA9IE1JSV9URzNfRFNQX1RBUDI2X0FMTk9LTyB8CiAJCSAgICAgIE1JSV9URzNfRFNQX1RBUDI2X1JNUlhTVE87CkBAIC0yNjc5LDggKzI2NTcsNyBAQAogCWJvb2wgbmVlZF92YXV4ID0gZmFsc2U7CiAKIAkvKiBUaGUgR1BJT3MgZG8gc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IG9uIDU3NzY1LiAqLwotCWlmICghdGczX2ZsYWcodHAsIElTX05JQykgfHwKLQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KQorCWlmICghdGczX2ZsYWcodHAsIElTX05JQykgfHwgdGczX2ZsYWcodHAsIDU3NzY1X0NMQVNTKSkKIAkJcmV0dXJuOwogCiAJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8CkBAIC0zNTk0LDM3ICszNTcxLDI0IEBACiAJdTMyIHZhbCwgbmV3X2FkdjsKIAogCW5ld19hZHYgPSBBRFZFUlRJU0VfQ1NNQTsKLQlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYpCi0JCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwSEFMRjsKLQlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCi0JCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwRlVMTDsKLQlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQotCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDBIQUxGOwotCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwpCi0JCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7Ci0KLQluZXdfYWR2IHw9IHRnM19hZHZlcnRfZmxvd2N0cmxfMTAwMFQoZmxvd2N0cmwpOworCW5ld19hZHYgfD0gZXRodG9vbF9hZHZfdG9fbWlpX2Fkdl90KGFkdmVydGlzZSkgJiBBRFZFUlRJU0VfQUxMOworCW5ld19hZHYgfD0gbWlpX2FkdmVydGlzZV9mbG93Y3RybChmbG93Y3RybCk7CiAKIAllcnIgPSB0ZzNfd3JpdGVwaHkodHAsIE1JSV9BRFZFUlRJU0UsIG5ld19hZHYpOwogCWlmIChlcnIpCiAJCWdvdG8gZG9uZTsKIAotCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR18xMF8xMDBfT05MWSkKLQkJZ290byBkb25lOworCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHXzEwXzEwMF9PTkxZKSkgeworCQluZXdfYWR2ID0gZXRodG9vbF9hZHZfdG9fbWlpX2N0cmwxMDAwX3QoYWR2ZXJ0aXNlKTsKIAotCW5ld19hZHYgPSAwOwotCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQotCQluZXdfYWR2IHw9IEFEVkVSVElTRV8xMDAwSEFMRjsKLQlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKLQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTAwMEZVTEw7CisJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTcwMV9BMCB8fAorCQkgICAgdHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3MDFfQjApCisJCQluZXdfYWR2IHw9IENUTDEwMDBfQVNfTUFTVEVSIHwgQ1RMMTAwMF9FTkFCTEVfTUFTVEVSOwogCi0JaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0EwIHx8Ci0JICAgIHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzAxX0IwKQotCQluZXdfYWR2IHw9IENUTDEwMDBfQVNfTUFTVEVSIHwgQ1RMMTAwMF9FTkFCTEVfTUFTVEVSOwotCi0JZXJyID0gdGczX3dyaXRlcGh5KHRwLCBNSUlfQ1RSTDEwMDAsIG5ld19hZHYpOwotCWlmIChlcnIpCi0JCWdvdG8gZG9uZTsKKwkJZXJyID0gdGczX3dyaXRlcGh5KHRwLCBNSUlfQ1RSTDEwMDAsIG5ld19hZHYpOworCQlpZiAoZXJyKQorCQkJZ290byBkb25lOworCX0KIAogCWlmICghKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0VFRV9DQVApKQogCQlnb3RvIGRvbmU7CkBAIC0zNjUwLDYgKzM2MTQsNyBAQAogCQlzd2l0Y2ggKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSkgewogCQljYXNlIEFTSUNfUkVWXzU3MTc6CiAJCWNhc2UgQVNJQ19SRVZfNTc3NjU6CisJCWNhc2UgQVNJQ19SRVZfNTc3NjY6CiAJCWNhc2UgQVNJQ19SRVZfNTcxOToKIAkJCS8qIElmIHdlIGFkdmVydGlzZWQgYW55IGVlZSBhZHZlcnRpc2VtZW50cyBhYm92ZS4uLiAqLwogCQkJaWYgKHZhbCkKQEAgLTM3ODYsNzYgKzM3NTEsNjEgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHRnM19jb3BwZXJfaXNfYWR2ZXJ0aXNpbmdfYWxsKHN0cnVjdCB0ZzMgKnRwLCB1MzIgbWFzaykKK3N0YXRpYyBib29sIHRnM19waHlfY29wcGVyX2FuX2NvbmZpZ19vayhzdHJ1Y3QgdGczICp0cCwgdTMyICpsY2xhZHYpCiB7Ci0JdTMyIGFkdl9yZWcsIGFsbF9tYXNrID0gMDsKKwl1MzIgYWR2bXNrLCB0Z3RhZHYsIGFkdmVydGlzaW5nOwogCi0JaWYgKG1hc2sgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKLQkJYWxsX21hc2sgfD0gQURWRVJUSVNFXzEwSEFMRjsKLQlpZiAobWFzayAmIEFEVkVSVElTRURfMTBiYXNlVF9GdWxsKQotCQlhbGxfbWFzayB8PSBBRFZFUlRJU0VfMTBGVUxMOwotCWlmIChtYXNrICYgQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmKQotCQlhbGxfbWFzayB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKLQlpZiAobWFzayAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKLQkJYWxsX21hc2sgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJYWR2ZXJ0aXNpbmcgPSB0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmc7CisJdGd0YWR2ID0gZXRodG9vbF9hZHZfdG9fbWlpX2Fkdl90KGFkdmVydGlzaW5nKSAmIEFEVkVSVElTRV9BTEw7CiAKLQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9BRFZFUlRJU0UsICZhZHZfcmVnKSkKLQkJcmV0dXJuIDA7CisJYWR2bXNrID0gQURWRVJUSVNFX0FMTDsKKwlpZiAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKKwkJdGd0YWR2IHw9IG1paV9hZHZlcnRpc2VfZmxvd2N0cmwodHAtPmxpbmtfY29uZmlnLmZsb3djdHJsKTsKKwkJYWR2bXNrIHw9IEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKKwl9CiAKLQlpZiAoKGFkdl9yZWcgJiBBRFZFUlRJU0VfQUxMKSAhPSBhbGxfbWFzaykKLQkJcmV0dXJuIDA7CisJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBsY2xhZHYpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoKCpsY2xhZHYgJiBhZHZtc2spICE9IHRndGFkdikKKwkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfMTBfMTAwX09OTFkpKSB7CiAJCXUzMiB0ZzNfY3RybDsKIAotCQlhbGxfbWFzayA9IDA7Ci0JCWlmIChtYXNrICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKLQkJCWFsbF9tYXNrIHw9IEFEVkVSVElTRV8xMDAwSEFMRjsKLQkJaWYgKG1hc2sgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQotCQkJYWxsX21hc2sgfD0gQURWRVJUSVNFXzEwMDBGVUxMOworCQl0Z3RhZHYgPSBldGh0b29sX2Fkdl90b19taWlfY3RybDEwMDBfdChhZHZlcnRpc2luZyk7CiAKIAkJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfQ1RSTDEwMDAsICZ0ZzNfY3RybCkpCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiBmYWxzZTsKIAogCQl0ZzNfY3RybCAmPSAoQURWRVJUSVNFXzEwMDBIQUxGIHwgQURWRVJUSVNFXzEwMDBGVUxMKTsKLQkJaWYgKHRnM19jdHJsICE9IGFsbF9tYXNrKQotCQkJcmV0dXJuIDA7CisJCWlmICh0ZzNfY3RybCAhPSB0Z3RhZHYpCisJCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcmV0dXJuIDE7CisJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBpbnQgdGczX2Fkdl8xMDAwVF9mbG93Y3RybF9vayhzdHJ1Y3QgdGczICp0cCwgdTMyICpsY2xhZHYsIHUzMiAqcm10YWR2KQorc3RhdGljIGJvb2wgdGczX3BoeV9jb3BwZXJfZmV0Y2hfcm10YWR2KHN0cnVjdCB0ZzMgKnRwLCB1MzIgKnJtdGFkdikKIHsKLQl1MzIgY3VyYWR2LCByZXFhZHY7CisJdTMyIGxwZXRoID0gMDsKIAotCWlmICh0ZzNfcmVhZHBoeSh0cCwgTUlJX0FEVkVSVElTRSwgbGNsYWR2KSkKLQkJcmV0dXJuIDE7CisJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfMTBfMTAwX09OTFkpKSB7CisJCXUzMiB2YWw7CiAKLQljdXJhZHYgPSAqbGNsYWR2ICYgKEFEVkVSVElTRV9QQVVTRV9DQVAgfCBBRFZFUlRJU0VfUEFVU0VfQVNZTSk7Ci0JcmVxYWR2ID0gdGczX2FkdmVydF9mbG93Y3RybF8xMDAwVCh0cC0+bGlua19jb25maWcuZmxvd2N0cmwpOworCQlpZiAodGczX3JlYWRwaHkodHAsIE1JSV9TVEFUMTAwMCwgJnZhbCkpCisJCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKLQkJaWYgKGN1cmFkdiAhPSByZXFhZHYpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAodGczX2ZsYWcodHAsIFBBVVNFX0FVVE9ORUcpKQotCQkJdGczX3JlYWRwaHkodHAsIE1JSV9MUEEsIHJtdGFkdik7Ci0JfSBlbHNlIHsKLQkJLyogUmVwcm9ncmFtIHRoZSBhZHZlcnRpc2VtZW50IHJlZ2lzdGVyLCBldmVuIGlmIGl0Ci0JCSAqIGRvZXMgbm90IGFmZmVjdCB0aGUgY3VycmVudCBsaW5rLiAgSWYgdGhlIGxpbmsKLQkJICogZ2V0cyByZW5lZ290aWF0ZWQgaW4gdGhlIGZ1dHVyZSwgd2UgY2FuIHNhdmUgYW4KLQkJICogYWRkaXRpb25hbCByZW5lZ290aWF0aW9uIGN5Y2xlIGJ5IGFkdmVydGlzaW5nCi0JCSAqIGl0IGNvcnJlY3RseSBpbiB0aGUgZmlyc3QgcGxhY2UuCi0JCSAqLwotCQlpZiAoY3VyYWR2ICE9IHJlcWFkdikgewotCQkJKmxjbGFkdiAmPSB+KEFEVkVSVElTRV9QQVVTRV9DQVAgfAotCQkJCSAgICAgQURWRVJUSVNFX1BBVVNFX0FTWU0pOwotCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCAqbGNsYWR2IHwgcmVxYWR2KTsKLQkJfQorCQlscGV0aCA9IG1paV9zdGF0MTAwMF90b19ldGh0b29sX2xwYV90KHZhbCk7CiAJfQogCi0JcmV0dXJuIDE7CisJaWYgKHRnM19yZWFkcGh5KHRwLCBNSUlfTFBBLCBybXRhZHYpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlscGV0aCB8PSBtaWlfbHBhX3RvX2V0aHRvb2xfbHBhX3QoKnJtdGFkdik7CisJdHAtPmxpbmtfY29uZmlnLnJtdF9hZHYgPSBscGV0aDsKKworCXJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgaW50IHRnM19zZXR1cF9jb3BwZXJfcGh5KHN0cnVjdCB0ZzMgKnRwLCBpbnQgZm9yY2VfcmVzZXQpCkBAIC0zOTYxLDYgKzM5MTEsOCBAQAogCWN1cnJlbnRfbGlua191cCA9IDA7CiAJY3VycmVudF9zcGVlZCA9IFNQRUVEX0lOVkFMSUQ7CiAJY3VycmVudF9kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwl0cC0+cGh5X2ZsYWdzICY9IH5URzNfUEhZRkxHX01ESVhfU1RBVEU7CisJdHAtPmxpbmtfY29uZmlnLnJtdF9hZHYgPSAwOwogCiAJaWYgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX0NBUEFDSVRJVkVfQ09VUExJTkcpIHsKIAkJZXJyID0gdGczX3BoeV9hdXhjdGxfcmVhZCh0cCwKQEAgLTQwMTYsMTIgKzM5NjgsOSBAQAogCiAJCWlmICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewogCQkJaWYgKChibWNyICYgQk1DUl9BTkVOQUJMRSkgJiYKLQkJCSAgICB0ZzNfY29wcGVyX2lzX2FkdmVydGlzaW5nX2FsbCh0cCwKLQkJCQkJCXRwLT5saW5rX2NvbmZpZy5hZHZlcnRpc2luZykpIHsKLQkJCQlpZiAodGczX2Fkdl8xMDAwVF9mbG93Y3RybF9vayh0cCwgJmxjbF9hZHYsCi0JCQkJCQkJCSAgJnJtdF9hZHYpKQotCQkJCQljdXJyZW50X2xpbmtfdXAgPSAxOwotCQkJfQorCQkJICAgIHRnM19waHlfY29wcGVyX2FuX2NvbmZpZ19vayh0cCwgJmxjbF9hZHYpICYmCisJCQkgICAgdGczX3BoeV9jb3BwZXJfZmV0Y2hfcm10YWR2KHRwLCAmcm10X2FkdikpCisJCQkJY3VycmVudF9saW5rX3VwID0gMTsKIAkJfSBlbHNlIHsKIAkJCWlmICghKGJtY3IgJiBCTUNSX0FORU5BQkxFKSAmJgogCQkJICAgIHRwLT5saW5rX2NvbmZpZy5zcGVlZCA9PSBjdXJyZW50X3NwZWVkICYmCkBAIC00MDMzLDggKzM5ODIsMjIgQEAKIAkJfQogCiAJCWlmIChjdXJyZW50X2xpbmtfdXAgPT0gMSAmJgotCQkgICAgdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCisJCSAgICB0cC0+bGlua19jb25maWcuYWN0aXZlX2R1cGxleCA9PSBEVVBMRVhfRlVMTCkgeworCQkJdTMyIHJlZywgYml0OworCisJCQlpZiAodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfSVNfRkVUKSB7CisJCQkJcmVnID0gTUlJX1RHM19GRVRfR0VOX1NUQVQ7CisJCQkJYml0ID0gTUlJX1RHM19GRVRfR0VOX1NUQVRfTURJWFNUQVQ7CisJCQl9IGVsc2UgeworCQkJCXJlZyA9IE1JSV9URzNfRVhUX1NUQVQ7CisJCQkJYml0ID0gTUlJX1RHM19FWFRfU1RBVF9NRElYOworCQkJfQorCisJCQlpZiAoIXRnM19yZWFkcGh5KHRwLCByZWcsICZ2YWwpICYmICh2YWwgJiBiaXQpKQorCQkJCXRwLT5waHlfZmxhZ3MgfD0gVEczX1BIWUZMR19NRElYX1NUQVRFOworCiAJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCBsY2xfYWR2LCBybXRfYWR2KTsKKwkJfQogCX0KIAogcmVsaW5rOgpAQCAtNDY0Myw2ICs0NjA2LDkgQEAKIAkJCWlmIChzZ19kaWdfc3RhdHVzICYgU0dfRElHX1BBUlRORVJfQVNZTV9QQVVTRSkKIAkJCQlyZW1vdGVfYWR2IHw9IExQQV8xMDAwWFBBVVNFX0FTWU07CiAKKwkJCXRwLT5saW5rX2NvbmZpZy5ybXRfYWR2ID0KKwkJCQkJICAgbWlpX2Fkdl90b19ldGh0b29sX2Fkdl94KHJlbW90ZV9hZHYpOworCiAJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCBsb2NhbF9hZHYsIHJlbW90ZV9hZHYpOwogCQkJY3VycmVudF9saW5rX3VwID0gMTsKIAkJCXRwLT5zZXJkZXNfY291bnRlciA9IDA7CkBAIC00NzE0LDYgKzQ2ODAsOSBAQAogCQkJaWYgKHJ4ZmxhZ3MgJiBNUl9MUF9BRFZfQVNZTV9QQVVTRSkKIAkJCQlyZW1vdGVfYWR2IHw9IExQQV8xMDAwWFBBVVNFX0FTWU07CiAKKwkJCXRwLT5saW5rX2NvbmZpZy5ybXRfYWR2ID0KKwkJCQkJICAgbWlpX2Fkdl90b19ldGh0b29sX2Fkdl94KHJlbW90ZV9hZHYpOworCiAJCQl0ZzNfc2V0dXBfZmxvd19jb250cm9sKHRwLCBsb2NhbF9hZHYsIHJlbW90ZV9hZHYpOwogCiAJCQljdXJyZW50X2xpbmtfdXAgPSAxOwpAQCAtNDc5Niw2ICs0NzY1LDcgQEAKIAl1ZGVsYXkoNDApOwogCiAJY3VycmVudF9saW5rX3VwID0gMDsKKwl0cC0+bGlua19jb25maWcucm10X2FkdiA9IDA7CiAJbWFjX3N0YXR1cyA9IHRyMzIoTUFDX1NUQVRVUyk7CiAKIAlpZiAodGczX2ZsYWcodHAsIEhXX0FVVE9ORUcpKQpAQCAtNDg4Nyw2ICs0ODU3LDcgQEAKIAljdXJyZW50X2xpbmtfdXAgPSAwOwogCWN1cnJlbnRfc3BlZWQgPSBTUEVFRF9JTlZBTElEOwogCWN1cnJlbnRfZHVwbGV4ID0gRFVQTEVYX0lOVkFMSUQ7CisJdHAtPmxpbmtfY29uZmlnLnJtdF9hZHYgPSAwOwogCiAJZXJyIHw9IHRnM19yZWFkcGh5KHRwLCBNSUlfQk1TUiwgJmJtc3IpOwogCWVyciB8PSB0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKQEAgLTQ5MDMsMjMgKzQ4NzQsMTkgQEAKIAkgICAgKHRwLT5waHlfZmxhZ3MgJiBURzNfUEhZRkxHX1BBUkFMTEVMX0RFVEVDVCkpIHsKIAkJLyogZG8gbm90aGluZywganVzdCBjaGVjayBmb3IgbGluayB1cCBhdCB0aGUgZW5kICovCiAJfSBlbHNlIGlmICh0cC0+bGlua19jb25maWcuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkgewotCQl1MzIgYWR2LCBuZXdfYWR2OworCQl1MzIgYWR2LCBuZXdhZHY7CiAKIAkJZXJyIHw9IHRnM19yZWFkcGh5KHRwLCBNSUlfQURWRVJUSVNFLCAmYWR2KTsKLQkJbmV3X2FkdiA9IGFkdiAmIH4oQURWRVJUSVNFXzEwMDBYRlVMTCB8IEFEVkVSVElTRV8xMDAwWEhBTEYgfAotCQkJCSAgQURWRVJUSVNFXzEwMDBYUEFVU0UgfAotCQkJCSAgQURWRVJUSVNFXzEwMDBYUFNFX0FTWU0gfAotCQkJCSAgQURWRVJUSVNFX1NMQ1QpOworCQluZXdhZHYgPSBhZHYgJiB+KEFEVkVSVElTRV8xMDAwWEZVTEwgfCBBRFZFUlRJU0VfMTAwMFhIQUxGIHwKKwkJCQkgQURWRVJUSVNFXzEwMDBYUEFVU0UgfAorCQkJCSBBRFZFUlRJU0VfMTAwMFhQU0VfQVNZTSB8CisJCQkJIEFEVkVSVElTRV9TTENUKTsKIAotCQluZXdfYWR2IHw9IHRnM19hZHZlcnRfZmxvd2N0cmxfMTAwMFgodHAtPmxpbmtfY29uZmlnLmZsb3djdHJsKTsKKwkJbmV3YWR2IHw9IHRnM19hZHZlcnRfZmxvd2N0cmxfMTAwMFgodHAtPmxpbmtfY29uZmlnLmZsb3djdHJsKTsKKwkJbmV3YWR2IHw9IGV0aHRvb2xfYWR2X3RvX21paV9hZHZfeCh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcpOwogCi0JCWlmICh0cC0+bGlua19jb25maWcuYWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQotCQkJbmV3X2FkdiB8PSBBRFZFUlRJU0VfMTAwMFhIQUxGOwotCQlpZiAodHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKLQkJCW5ld19hZHYgfD0gQURWRVJUSVNFXzEwMDBYRlVMTDsKLQotCQlpZiAoKG5ld19hZHYgIT0gYWR2KSB8fCAhKGJtY3IgJiBCTUNSX0FORU5BQkxFKSkgewotCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBuZXdfYWR2KTsKKwkJaWYgKChuZXdhZHYgIT0gYWR2KSB8fCAhKGJtY3IgJiBCTUNSX0FORU5BQkxFKSkgeworCQkJdGczX3dyaXRlcGh5KHRwLCBNSUlfQURWRVJUSVNFLCBuZXdhZHYpOwogCQkJYm1jciB8PSBCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQ7CiAJCQl0ZzNfd3JpdGVwaHkodHAsIE1JSV9CTUNSLCBibWNyKTsKIApAQCAtNDk5Nyw2ICs0OTY0LDkgQEAKIAkJCQkJY3VycmVudF9kdXBsZXggPSBEVVBMRVhfRlVMTDsKIAkJCQllbHNlCiAJCQkJCWN1cnJlbnRfZHVwbGV4ID0gRFVQTEVYX0hBTEY7CisKKwkJCQl0cC0+bGlua19jb25maWcucm10X2FkdiA9CisJCQkJCSAgIG1paV9hZHZfdG9fZXRodG9vbF9hZHZfeChyZW1vdGVfYWR2KTsKIAkJCX0gZWxzZSBpZiAoIXRnM19mbGFnKHRwLCA1NzgwX0NMQVNTKSkgewogCQkJCS8qIExpbmsgaXMgdXAgdmlhIHBhcmFsbGVsIGRldGVjdCAqLwogCQkJfSBlbHNlIHsKQEAgLTUzMjAsNiArNTI5MCw3IEBACiAJdTMyIHN3X2lkeCA9IHRuYXBpLT50eF9jb25zOwogCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKIAlpbnQgaW5kZXggPSB0bmFwaSAtIHRwLT5uYXBpOworCXVuc2lnbmVkIGludCBwa3RzX2NvbXBsID0gMCwgYnl0ZXNfY29tcGwgPSAwOwogCiAJaWYgKHRnM19mbGFnKHRwLCBFTkFCTEVfVFNTKSkKIAkJaW5kZXgtLTsKQEAgLTUzNzAsNiArNTM0MSw5IEBACiAJCQlzd19pZHggPSBORVhUX1RYKHN3X2lkeCk7CiAJCX0KIAorCQlwa3RzX2NvbXBsKys7CisJCWJ5dGVzX2NvbXBsICs9IHNrYi0+bGVuOworCiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAogCQlpZiAodW5saWtlbHkodHhfYnVnKSkgewpAQCAtNTM3OCw2ICs1MzUyLDggQEAKIAkJfQogCX0KIAorCW5ldGRldl9jb21wbGV0ZWRfcXVldWUodHAtPmRldiwgcGt0c19jb21wbCwgYnl0ZXNfY29tcGwpOworCiAJdG5hcGktPnR4X2NvbnMgPSBzd19pZHg7CiAKIAkvKiBOZWVkIHRvIG1ha2UgdGhlIHR4X2NvbnMgdXBkYXRlIHZpc2libGUgdG8gdGczX3N0YXJ0X3htaXQoKQpAQCAtNTM5NywxNSArNTM3MywxNSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgdGczX3J4X3NrYl9mcmVlKHN0cnVjdCB0ZzMgKnRwLCBzdHJ1Y3QgcmluZ19pbmZvICpyaSwgdTMyIG1hcF9zeikKK3N0YXRpYyB2b2lkIHRnM19yeF9kYXRhX2ZyZWUoc3RydWN0IHRnMyAqdHAsIHN0cnVjdCByaW5nX2luZm8gKnJpLCB1MzIgbWFwX3N6KQogewotCWlmICghcmktPnNrYikKKwlpZiAoIXJpLT5kYXRhKQogCQlyZXR1cm47CiAKIAlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBkbWFfdW5tYXBfYWRkcihyaSwgbWFwcGluZyksCiAJCQkgbWFwX3N6LCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCWRldl9rZnJlZV9za2JfYW55KHJpLT5za2IpOwotCXJpLT5za2IgPSBOVUxMOworCWtmcmVlKHJpLT5kYXRhKTsKKwlyaS0+ZGF0YSA9IE5VTEw7CiB9CiAKIC8qIFJldHVybnMgc2l6ZSBvZiBza2IgYWxsb2NhdGVkIG9yIDwgMCBvbiBlcnJvci4KQEAgLTU0MTksMjggKzUzOTUsMjggQEAKICAqIGJ1ZmZlcnMgdGhlIGNwdSBvbmx5IHJlYWRzIHRoZSBsYXN0IGNhY2hlbGluZSBvZiB0aGUgUlggZGVzY3JpcHRvcgogICogKHRvIGZldGNoIHRoZSBlcnJvciBmbGFncywgdmxhbiB0YWcsIGNoZWNrc3VtLCBhbmQgb3BhcXVlIGNvb2tpZSkuCiAgKi8KLXN0YXRpYyBpbnQgdGczX2FsbG9jX3J4X3NrYihzdHJ1Y3QgdGczICp0cCwgc3RydWN0IHRnM19yeF9wcm9kcmluZ19zZXQgKnRwciwKK3N0YXRpYyBpbnQgdGczX2FsbG9jX3J4X2RhdGEoc3RydWN0IHRnMyAqdHAsIHN0cnVjdCB0ZzNfcnhfcHJvZHJpbmdfc2V0ICp0cHIsCiAJCQkgICAgdTMyIG9wYXF1ZV9rZXksIHUzMiBkZXN0X2lkeF91bm1hc2tlZCkKIHsKIAlzdHJ1Y3QgdGczX3J4X2J1ZmZlcl9kZXNjICpkZXNjOwogCXN0cnVjdCByaW5nX2luZm8gKm1hcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4ICpkYXRhOwogCWRtYV9hZGRyX3QgbWFwcGluZzsKLQlpbnQgc2tiX3NpemUsIGRlc3RfaWR4OworCWludCBza2Jfc2l6ZSwgZGF0YV9zaXplLCBkZXN0X2lkeDsKIAogCXN3aXRjaCAob3BhcXVlX2tleSkgewogCWNhc2UgUlhEX09QQVFVRV9SSU5HX1NURDoKIAkJZGVzdF9pZHggPSBkZXN0X2lkeF91bm1hc2tlZCAmIHRwLT5yeF9zdGRfcmluZ19tYXNrOwogCQlkZXNjID0gJnRwci0+cnhfc3RkW2Rlc3RfaWR4XTsKIAkJbWFwID0gJnRwci0+cnhfc3RkX2J1ZmZlcnNbZGVzdF9pZHhdOwotCQlza2Jfc2l6ZSA9IHRwLT5yeF9wa3RfbWFwX3N6OworCQlkYXRhX3NpemUgPSB0cC0+cnhfcGt0X21hcF9zejsKIAkJYnJlYWs7CiAKIAljYXNlIFJYRF9PUEFRVUVfUklOR19KVU1CTzoKIAkJZGVzdF9pZHggPSBkZXN0X2lkeF91bm1hc2tlZCAmIHRwLT5yeF9qbWJfcmluZ19tYXNrOwogCQlkZXNjID0gJnRwci0+cnhfam1iW2Rlc3RfaWR4XS5zdGQ7CiAJCW1hcCA9ICZ0cHItPnJ4X2ptYl9idWZmZXJzW2Rlc3RfaWR4XTsKLQkJc2tiX3NpemUgPSBURzNfUlhfSk1CX01BUF9TWjsKKwkJZGF0YV9zaXplID0gVEczX1JYX0pNQl9NQVBfU1o7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKQEAgLTU0NTMsMzEgKzU0MjksMzMgQEAKIAkgKiBDYWxsZXJzIGRlcGVuZCB1cG9uIHRoaXMgYmVoYXZpb3IgYW5kIGFzc3VtZSB0aGF0CiAJICogd2UgbGVhdmUgZXZlcnl0aGluZyB1bmNoYW5nZWQgaWYgd2UgZmFpbC4KIAkgKi8KLQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiKHRwLT5kZXYsIHNrYl9zaXplICsgVEczX1JYX09GRlNFVCh0cCkpOwotCWlmIChza2IgPT0gTlVMTCkKKwlza2Jfc2l6ZSA9IFNLQl9EQVRBX0FMSUdOKGRhdGFfc2l6ZSArIFRHM19SWF9PRkZTRVQodHApKSArCisJCSAgIFNLQl9EQVRBX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSk7CisJZGF0YSA9IGttYWxsb2Moc2tiX3NpemUsIEdGUF9BVE9NSUMpOworCWlmICghZGF0YSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlza2JfcmVzZXJ2ZShza2IsIFRHM19SWF9PRkZTRVQodHApKTsKLQotCW1hcHBpbmcgPSBwY2lfbWFwX3NpbmdsZSh0cC0+cGRldiwgc2tiLT5kYXRhLCBza2Jfc2l6ZSwKKwltYXBwaW5nID0gcGNpX21hcF9zaW5nbGUodHAtPnBkZXYsCisJCQkJIGRhdGEgKyBURzNfUlhfT0ZGU0VUKHRwKSwKKwkJCQkgZGF0YV9zaXplLAogCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IodHAtPnBkZXYsIG1hcHBpbmcpKSB7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJa2ZyZWUoZGF0YSk7CiAJCXJldHVybiAtRUlPOwogCX0KIAotCW1hcC0+c2tiID0gc2tiOworCW1hcC0+ZGF0YSA9IGRhdGE7CiAJZG1hX3VubWFwX2FkZHJfc2V0KG1hcCwgbWFwcGluZywgbWFwcGluZyk7CiAKIAlkZXNjLT5hZGRyX2hpID0gKCh1NjQpbWFwcGluZyA+PiAzMik7CiAJZGVzYy0+YWRkcl9sbyA9ICgodTY0KW1hcHBpbmcgJiAweGZmZmZmZmZmKTsKIAotCXJldHVybiBza2Jfc2l6ZTsKKwlyZXR1cm4gZGF0YV9zaXplOwogfQogCiAvKiBXZSBvbmx5IG5lZWQgdG8gbW92ZSBvdmVyIGluIHRoZSBhZGRyZXNzIGJlY2F1c2UgdGhlIG90aGVyCiAgKiBtZW1iZXJzIG9mIHRoZSBSWCBkZXNjcmlwdG9yIGFyZSBpbnZhcmlhbnQuICBTZWUgbm90ZXMgYWJvdmUKLSAqIHRnM19hbGxvY19yeF9za2IgZm9yIGZ1bGwgZGV0YWlscy4KKyAqIHRnM19hbGxvY19yeF9kYXRhIGZvciBmdWxsIGRldGFpbHMuCiAgKi8KIHN0YXRpYyB2b2lkIHRnM19yZWN5Y2xlX3J4KHN0cnVjdCB0ZzNfbmFwaSAqdG5hcGksCiAJCQkgICBzdHJ1Y3QgdGczX3J4X3Byb2RyaW5nX3NldCAqZHByLApAQCAtNTUxMSw3ICs1NDg5LDcgQEAKIAkJcmV0dXJuOwogCX0KIAotCWRlc3RfbWFwLT5za2IgPSBzcmNfbWFwLT5za2I7CisJZGVzdF9tYXAtPmRhdGEgPSBzcmNfbWFwLT5kYXRhOwogCWRtYV91bm1hcF9hZGRyX3NldChkZXN0X21hcCwgbWFwcGluZywKIAkJCSAgIGRtYV91bm1hcF9hZGRyKHNyY19tYXAsIG1hcHBpbmcpKTsKIAlkZXN0X2Rlc2MtPmFkZHJfaGkgPSBzcmNfZGVzYy0+YWRkcl9oaTsKQEAgLTU1MjIsNyArNTUwMCw3IEBACiAJICovCiAJc21wX3dtYigpOwogCi0Jc3JjX21hcC0+c2tiID0gTlVMTDsKKwlzcmNfbWFwLT5kYXRhID0gTlVMTDsKIH0KIAogLyogVGhlIFJYIHJpbmcgc2NoZW1lIGlzIGNvbXBvc2VkIG9mIG11bHRpcGxlIHJpbmdzIHdoaWNoIHBvc3QgZnJlc2gKQEAgLTU1NzYsMTkgKzU1NTQsMjAgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAkJZG1hX2FkZHJfdCBkbWFfYWRkcjsKIAkJdTMyIG9wYXF1ZV9rZXksIGRlc2NfaWR4LCAqcG9zdF9wdHI7CisJCXU4ICpkYXRhOwogCiAJCWRlc2NfaWR4ID0gZGVzYy0+b3BhcXVlICYgUlhEX09QQVFVRV9JTkRFWF9NQVNLOwogCQlvcGFxdWVfa2V5ID0gZGVzYy0+b3BhcXVlICYgUlhEX09QQVFVRV9SSU5HX01BU0s7CiAJCWlmIChvcGFxdWVfa2V5ID09IFJYRF9PUEFRVUVfUklOR19TVEQpIHsKIAkJCXJpID0gJnRwLT5uYXBpWzBdLnByb2RyaW5nLnJ4X3N0ZF9idWZmZXJzW2Rlc2NfaWR4XTsKIAkJCWRtYV9hZGRyID0gZG1hX3VubWFwX2FkZHIocmksIG1hcHBpbmcpOwotCQkJc2tiID0gcmktPnNrYjsKKwkJCWRhdGEgPSByaS0+ZGF0YTsKIAkJCXBvc3RfcHRyID0gJnN0ZF9wcm9kX2lkeDsKIAkJCXJ4X3N0ZF9wb3N0ZWQrKzsKIAkJfSBlbHNlIGlmIChvcGFxdWVfa2V5ID09IFJYRF9PUEFRVUVfUklOR19KVU1CTykgewogCQkJcmkgPSAmdHAtPm5hcGlbMF0ucHJvZHJpbmcucnhfam1iX2J1ZmZlcnNbZGVzY19pZHhdOwogCQkJZG1hX2FkZHIgPSBkbWFfdW5tYXBfYWRkcihyaSwgbWFwcGluZyk7Ci0JCQlza2IgPSByaS0+c2tiOworCQkJZGF0YSA9IHJpLT5kYXRhOwogCQkJcG9zdF9wdHIgPSAmam1iX3Byb2RfaWR4OwogCQl9IGVsc2UKIAkJCWdvdG8gbmV4dF9wa3Rfbm9wb3N0OwpAQCAtNTYwNiwxMyArNTU4NSwxNCBAQAogCQkJZ290byBuZXh0X3BrdDsKIAkJfQogCisJCXByZWZldGNoKGRhdGEgKyBURzNfUlhfT0ZGU0VUKHRwKSk7CiAJCWxlbiA9ICgoZGVzYy0+aWR4X2xlbiAmIFJYRF9MRU5fTUFTSykgPj4gUlhEX0xFTl9TSElGVCkgLQogCQkgICAgICBFVEhfRkNTX0xFTjsKIAogCQlpZiAobGVuID4gVEczX1JYX0NPUFlfVEhSRVNIKHRwKSkgewogCQkJaW50IHNrYl9zaXplOwogCi0JCQlza2Jfc2l6ZSA9IHRnM19hbGxvY19yeF9za2IodHAsIHRwciwgb3BhcXVlX2tleSwKKwkJCXNrYl9zaXplID0gdGczX2FsbG9jX3J4X2RhdGEodHAsIHRwciwgb3BhcXVlX2tleSwKIAkJCQkJCSAgICAqcG9zdF9wdHIpOwogCQkJaWYgKHNrYl9zaXplIDwgMCkKIAkJCQlnb3RvIGRyb3BfaXQ7CkBAIC01NjIwLDM1ICs1NjAwLDM3IEBACiAJCQlwY2lfdW5tYXBfc2luZ2xlKHRwLT5wZGV2LCBkbWFfYWRkciwgc2tiX3NpemUsCiAJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCi0JCQkvKiBFbnN1cmUgdGhhdCB0aGUgdXBkYXRlIHRvIHRoZSBza2IgaGFwcGVucworCQkJc2tiID0gYnVpbGRfc2tiKGRhdGEpOworCQkJaWYgKCFza2IpIHsKKwkJCQlrZnJlZShkYXRhKTsKKwkJCQlnb3RvIGRyb3BfaXRfbm9fcmVjeWNsZTsKKwkJCX0KKwkJCXNrYl9yZXNlcnZlKHNrYiwgVEczX1JYX09GRlNFVCh0cCkpOworCQkJLyogRW5zdXJlIHRoYXQgdGhlIHVwZGF0ZSB0byB0aGUgZGF0YSBoYXBwZW5zCiAJCQkgKiBhZnRlciB0aGUgdXNhZ2Ugb2YgdGhlIG9sZCBETUEgbWFwcGluZy4KIAkJCSAqLwogCQkJc21wX3dtYigpOwogCi0JCQlyaS0+c2tiID0gTlVMTDsKKwkJCXJpLT5kYXRhID0gTlVMTDsKIAotCQkJc2tiX3B1dChza2IsIGxlbik7CiAJCX0gZWxzZSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqY29weV9za2I7Ci0KIAkJCXRnM19yZWN5Y2xlX3J4KHRuYXBpLCB0cHIsIG9wYXF1ZV9rZXksCiAJCQkJICAgICAgIGRlc2NfaWR4LCAqcG9zdF9wdHIpOwogCi0JCQljb3B5X3NrYiA9IG5ldGRldl9hbGxvY19za2IodHAtPmRldiwgbGVuICsKLQkJCQkJCSAgICBURzNfUkFXX0lQX0FMSUdOKTsKLQkJCWlmIChjb3B5X3NrYiA9PSBOVUxMKQorCQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYih0cC0+ZGV2LAorCQkJCQkgICAgICAgbGVuICsgVEczX1JBV19JUF9BTElHTik7CisJCQlpZiAoc2tiID09IE5VTEwpCiAJCQkJZ290byBkcm9wX2l0X25vX3JlY3ljbGU7CiAKLQkJCXNrYl9yZXNlcnZlKGNvcHlfc2tiLCBURzNfUkFXX0lQX0FMSUdOKTsKLQkJCXNrYl9wdXQoY29weV9za2IsIGxlbik7CisJCQlza2JfcmVzZXJ2ZShza2IsIFRHM19SQVdfSVBfQUxJR04pOwogCQkJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KHRwLT5wZGV2LCBkbWFfYWRkciwgbGVuLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJc2tiX2NvcHlfZnJvbV9saW5lYXJfZGF0YShza2IsIGNvcHlfc2tiLT5kYXRhLCBsZW4pOworCQkJbWVtY3B5KHNrYi0+ZGF0YSwKKwkJCSAgICAgICBkYXRhICsgVEczX1JYX09GRlNFVCh0cCksCisJCQkgICAgICAgbGVuKTsKIAkJCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZSh0cC0+cGRldiwgZG1hX2FkZHIsIGxlbiwgUENJX0RNQV9GUk9NREVWSUNFKTsKLQotCQkJLyogV2UnbGwgcmV1c2UgdGhlIG9yaWdpbmFsIHJpbmcgYnVmZmVyLiAqLwotCQkJc2tiID0gY29weV9za2I7CiAJCX0KIAorCQlza2JfcHV0KHNrYiwgbGVuKTsKIAkJaWYgKCh0cC0+ZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKSAmJgogCQkgICAgKGRlc2MtPnR5cGVfZmxhZ3MgJiBSWERfRkxBR19UQ1BVRFBfQ1NVTSkgJiYKIAkJICAgICgoKGRlc2MtPmlwX3RjcF9jc3VtICYgUlhEX1RDUENTVU1fTUFTSykKQEAgLTU3ODcsNyArNTc2OSw3IEBACiAJCWRpID0gZHByLT5yeF9zdGRfcHJvZF9pZHg7CiAKIAkJZm9yIChpID0gZGk7IGkgPCBkaSArIGNweWNudDsgaSsrKSB7Ci0JCQlpZiAoZHByLT5yeF9zdGRfYnVmZmVyc1tpXS5za2IpIHsKKwkJCWlmIChkcHItPnJ4X3N0ZF9idWZmZXJzW2ldLmRhdGEpIHsKIAkJCQljcHljbnQgPSBpIC0gZGk7CiAJCQkJZXJyID0gLUVOT1NQQzsKIAkJCQlicmVhazsKQEAgLTU4NDUsNyArNTgyNyw3IEBACiAJCWRpID0gZHByLT5yeF9qbWJfcHJvZF9pZHg7CiAKIAkJZm9yIChpID0gZGk7IGkgPCBkaSArIGNweWNudDsgaSsrKSB7Ci0JCQlpZiAoZHByLT5yeF9qbWJfYnVmZmVyc1tpXS5za2IpIHsKKwkJCWlmIChkcHItPnJ4X2ptYl9idWZmZXJzW2ldLmRhdGEpIHsKIAkJCQljcHljbnQgPSBpIC0gZGk7CiAJCQkJZXJyID0gLUVOT1NQQzsKIAkJCQlicmVhazsKQEAgLTY0NDMsMjUgKzY0MjUsMjUgQEAKIAlib29sIGh3YnVnID0gZmFsc2U7CiAKIAlpZiAodGczX2ZsYWcodHAsIFNIT1JUX0RNQV9CVUcpICYmIGxlbiA8PSA4KQotCQlod2J1ZyA9IDE7CisJCWh3YnVnID0gdHJ1ZTsKIAogCWlmICh0ZzNfNGdfb3ZlcmZsb3dfdGVzdChtYXAsIGxlbikpCi0JCWh3YnVnID0gMTsKKwkJaHdidWcgPSB0cnVlOwogCiAJaWYgKHRnM180MGJpdF9vdmVyZmxvd190ZXN0KHRwLCBtYXAsIGxlbikpCi0JCWh3YnVnID0gMTsKKwkJaHdidWcgPSB0cnVlOwogCi0JaWYgKHRnM19mbGFnKHRwLCA0S19GSUZPX0xJTUlUKSkgeworCWlmICh0cC0+ZG1hX2xpbWl0KSB7CiAJCXUzMiBwcnZpZHggPSAqZW50cnk7CiAJCXUzMiB0bXBfZmxhZyA9IGZsYWdzICYgflRYRF9GTEFHX0VORDsKLQkJd2hpbGUgKGxlbiA+IFRHM19UWF9CRF9ETUFfTUFYICYmICpidWRnZXQpIHsKLQkJCXUzMiBmcmFnX2xlbiA9IFRHM19UWF9CRF9ETUFfTUFYOwotCQkJbGVuIC09IFRHM19UWF9CRF9ETUFfTUFYOworCQl3aGlsZSAobGVuID4gdHAtPmRtYV9saW1pdCAmJiAqYnVkZ2V0KSB7CisJCQl1MzIgZnJhZ19sZW4gPSB0cC0+ZG1hX2xpbWl0OworCQkJbGVuIC09IHRwLT5kbWFfbGltaXQ7CiAKIAkJCS8qIEF2b2lkIHRoZSA4Ynl0ZSBETUEgcHJvYmxlbSAqLwogCQkJaWYgKGxlbiA8PSA4KSB7Ci0JCQkJbGVuICs9IFRHM19UWF9CRF9ETUFfTUFYIC8gMjsKLQkJCQlmcmFnX2xlbiA9IFRHM19UWF9CRF9ETUFfTUFYIC8gMjsKKwkJCQlsZW4gKz0gdHAtPmRtYV9saW1pdCAvIDI7CisJCQkJZnJhZ19sZW4gPSB0cC0+ZG1hX2xpbWl0IC8gMjsKIAkJCX0KIAogCQkJdG5hcGktPnR4X2J1ZmZlcnNbKmVudHJ5XS5mcmFnbWVudGVkID0gdHJ1ZTsKQEAgLTY0ODIsNyArNjQ2NCw3IEBACiAJCQkJKmJ1ZGdldCAtPSAxOwogCQkJCSplbnRyeSA9IE5FWFRfVFgoKmVudHJ5KTsKIAkJCX0gZWxzZSB7Ci0JCQkJaHdidWcgPSAxOworCQkJCWh3YnVnID0gdHJ1ZTsKIAkJCQl0bmFwaS0+dHhfYnVmZmVyc1twcnZpZHhdLmZyYWdtZW50ZWQgPSBmYWxzZTsKIAkJCX0KIAkJfQpAQCAtNjgxNiw2ICs2Nzk4LDcgQEAKIAl9CiAKIAlza2JfdHhfdGltZXN0YW1wKHNrYik7CisJbmV0ZGV2X3NlbnRfcXVldWUodHAtPmRldiwgc2tiLT5sZW4pOwogCiAJLyogUGFja2V0cyBhcmUgcmVhZHksIHVwZGF0ZSBUeCBwcm9kdWNlciBpZHggbG9jYWwgYW5kIG9uIGNhcmQuICovCiAJdHczMl90eF9tYm94KHRuYXBpLT5wcm9kbWJveCwgZW50cnkpOwpAQCAtNjk2OCw3ICs2OTUxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgdGczX3NldF9sb29wYmFjayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgdm9pZCB0ZzNfc2V0X2xvb3BiYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtNjk5NCw3ICs2OTc3LDggQEAKIAl9CiB9CiAKLXN0YXRpYyB1MzIgdGczX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgdGczX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtNzAwNCw5ICs2OTg4LDkgQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLXN0YXRpYyBpbnQgdGczX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgaW50IHRnM19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7Ci0JdTMyIGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlZCA9IGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKIAogCWlmICgoY2hhbmdlZCAmIE5FVElGX0ZfTE9PUEJBQ0spICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkKIAkJdGczX3NldF9sb29wYmFjayhkZXYsIGZlYXR1cmVzKTsKQEAgLTcwODIsMTQgKzcwNjYsMTQgQEAKIAlpZiAodHByICE9ICZ0cC0+bmFwaVswXS5wcm9kcmluZykgewogCQlmb3IgKGkgPSB0cHItPnJ4X3N0ZF9jb25zX2lkeDsgaSAhPSB0cHItPnJ4X3N0ZF9wcm9kX2lkeDsKIAkJICAgICBpID0gKGkgKyAxKSAmIHRwLT5yeF9zdGRfcmluZ19tYXNrKQotCQkJdGczX3J4X3NrYl9mcmVlKHRwLCAmdHByLT5yeF9zdGRfYnVmZmVyc1tpXSwKKwkJCXRnM19yeF9kYXRhX2ZyZWUodHAsICZ0cHItPnJ4X3N0ZF9idWZmZXJzW2ldLAogCQkJCQl0cC0+cnhfcGt0X21hcF9zeik7CiAKIAkJaWYgKHRnM19mbGFnKHRwLCBKVU1CT19DQVBBQkxFKSkgewogCQkJZm9yIChpID0gdHByLT5yeF9qbWJfY29uc19pZHg7CiAJCQkgICAgIGkgIT0gdHByLT5yeF9qbWJfcHJvZF9pZHg7CiAJCQkgICAgIGkgPSAoaSArIDEpICYgdHAtPnJ4X2ptYl9yaW5nX21hc2spIHsKLQkJCQl0ZzNfcnhfc2tiX2ZyZWUodHAsICZ0cHItPnJ4X2ptYl9idWZmZXJzW2ldLAorCQkJCXRnM19yeF9kYXRhX2ZyZWUodHAsICZ0cHItPnJ4X2ptYl9idWZmZXJzW2ldLAogCQkJCQkJVEczX1JYX0pNQl9NQVBfU1opOwogCQkJfQogCQl9CkBAIC03MDk4LDEyICs3MDgyLDEyIEBACiAJfQogCiAJZm9yIChpID0gMDsgaSA8PSB0cC0+cnhfc3RkX3JpbmdfbWFzazsgaSsrKQotCQl0ZzNfcnhfc2tiX2ZyZWUodHAsICZ0cHItPnJ4X3N0ZF9idWZmZXJzW2ldLAorCQl0ZzNfcnhfZGF0YV9mcmVlKHRwLCAmdHByLT5yeF9zdGRfYnVmZmVyc1tpXSwKIAkJCQl0cC0+cnhfcGt0X21hcF9zeik7CiAKIAlpZiAodGczX2ZsYWcodHAsIEpVTUJPX0NBUEFCTEUpICYmICF0ZzNfZmxhZyh0cCwgNTc4MF9DTEFTUykpIHsKIAkJZm9yIChpID0gMDsgaSA8PSB0cC0+cnhfam1iX3JpbmdfbWFzazsgaSsrKQotCQkJdGczX3J4X3NrYl9mcmVlKHRwLCAmdHByLT5yeF9qbWJfYnVmZmVyc1tpXSwKKwkJCXRnM19yeF9kYXRhX2ZyZWUodHAsICZ0cHItPnJ4X2ptYl9idWZmZXJzW2ldLAogCQkJCQlURzNfUlhfSk1CX01BUF9TWik7CiAJfQogfQpAQCAtNzE1OSw3ICs3MTQzLDcgQEAKIAogCS8qIE5vdyBhbGxvY2F0ZSBmcmVzaCBTS0JzIGZvciBlYWNoIHJ4IHJpbmcuICovCiAJZm9yIChpID0gMDsgaSA8IHRwLT5yeF9wZW5kaW5nOyBpKyspIHsKLQkJaWYgKHRnM19hbGxvY19yeF9za2IodHAsIHRwciwgUlhEX09QQVFVRV9SSU5HX1NURCwgaSkgPCAwKSB7CisJCWlmICh0ZzNfYWxsb2NfcnhfZGF0YSh0cCwgdHByLCBSWERfT1BBUVVFX1JJTkdfU1RELCBpKSA8IDApIHsKIAkJCW5ldGRldl93YXJuKHRwLT5kZXYsCiAJCQkJICAgICJVc2luZyBhIHNtYWxsZXIgUlggc3RhbmRhcmQgcmluZy4gT25seSAiCiAJCQkJICAgICIlZCBvdXQgb2YgJWQgYnVmZmVycyB3ZXJlIGFsbG9jYXRlZCAiCkBAIC03MTkxLDcgKzcxNzUsNyBAQAogCX0KIAogCWZvciAoaSA9IDA7IGkgPCB0cC0+cnhfanVtYm9fcGVuZGluZzsgaSsrKSB7Ci0JCWlmICh0ZzNfYWxsb2Nfcnhfc2tiKHRwLCB0cHIsIFJYRF9PUEFRVUVfUklOR19KVU1CTywgaSkgPCAwKSB7CisJCWlmICh0ZzNfYWxsb2NfcnhfZGF0YSh0cCwgdHByLCBSWERfT1BBUVVFX1JJTkdfSlVNQk8sIGkpIDwgMCkgewogCQkJbmV0ZGV2X3dhcm4odHAtPmRldiwKIAkJCQkgICAgIlVzaW5nIGEgc21hbGxlciBSWCBqdW1ibyByaW5nLiBPbmx5ICVkICIKIAkJCQkgICAgIm91dCBvZiAlZCBidWZmZXJzIHdlcmUgYWxsb2NhdGVkICIKQEAgLTcyOTcsNiArNzI4MSw3IEBACiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQl9CiAJfQorCW5ldGRldl9yZXNldF9xdWV1ZSh0cC0+ZGV2KTsKIH0KIAogLyogSW5pdGlhbGl6ZSB0eC9yeCByaW5ncyBmb3IgcGFja2V0IHByb2Nlc3NpbmcuCkBAIC03NTkxLDggKzc1NzYsNiBAQAogCQlpZiAodG5hcGktPmh3X3N0YXR1cykKIAkJCW1lbXNldCh0bmFwaS0+aHdfc3RhdHVzLCAwLCBURzNfSFdfU1RBVFVTX1NJWkUpOwogCX0KLQlpZiAodHAtPmh3X3N0YXRzKQotCQltZW1zZXQodHAtPmh3X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHRnM19od19zdGF0cykpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTc2MjYsMTUgKzc2MDksMTEgQEAKIAogCXBjaV93cml0ZV9jb25maWdfd29yZCh0cC0+cGRldiwgUENJX0NPTU1BTkQsIHRwLT5wY2lfY21kKTsKIAotCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgIT0gQVNJQ19SRVZfNTc4NSkgewotCQlpZiAodGczX2ZsYWcodHAsIFBDSV9FWFBSRVNTKSkKLQkJCXBjaWVfc2V0X3JlYWRycSh0cC0+cGRldiwgdHAtPnBjaWVfcmVhZHJxKTsKLQkJZWxzZSB7Ci0JCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUodHAtPnBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsCi0JCQkJCSAgICAgIHRwLT5wY2lfY2FjaGVsaW5lX3N6KTsKLQkJCXBjaV93cml0ZV9jb25maWdfYnl0ZSh0cC0+cGRldiwgUENJX0xBVEVOQ1lfVElNRVIsCi0JCQkJCSAgICAgIHRwLT5wY2lfbGF0X3RpbWVyKTsKLQkJfQorCWlmICghdGczX2ZsYWcodHAsIFBDSV9FWFBSRVNTKSkgeworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUodHAtPnBkZXYsIFBDSV9DQUNIRV9MSU5FX1NJWkUsCisJCQkJICAgICAgdHAtPnBjaV9jYWNoZWxpbmVfc3opOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUodHAtPnBkZXYsIFBDSV9MQVRFTkNZX1RJTUVSLAorCQkJCSAgICAgIHRwLT5wY2lfbGF0X3RpbWVyKTsKIAl9CiAKIAkvKiBNYWtlIHN1cmUgUENJLVggcmVsYXhlZCBvcmRlcmluZyBiaXQgaXMgY2xlYXIuICovCkBAIC03ODE5LDggKzc3OTgsNiBAQAogCQkJCSAgICAgIHBjaV9wY2llX2NhcCh0cC0+cGRldikgKyBQQ0lfRVhQX0RFVkNUTCwKIAkJCQkgICAgICB2YWwxNik7CiAKLQkJcGNpZV9zZXRfcmVhZHJxKHRwLT5wZGV2LCB0cC0+cGNpZV9yZWFkcnEpOwotCiAJCS8qIENsZWFyIGVycm9yIHN0YXR1cyAqLwogCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQodHAtPnBkZXYsCiAJCQkJICAgICAgcGNpX3BjaWVfY2FwKHRwLT5wZGV2KSArIFBDSV9FWFBfREVWU1RBLApAQCAtNzkxNCw2ICs3ODkxLDExIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnRnM19nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJCQkJIHN0cnVjdCBydG5sX2xpbmtfc3RhdHM2NCAqKTsKK3N0YXRpYyBzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMgKnRnM19nZXRfZXN0YXRzKHN0cnVjdCB0ZzMgKiwKKwkJCQkJCXN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqKTsKKwogLyogdHAtPmxvY2sgaXMgaGVsZC4gKi8KIHN0YXRpYyBpbnQgdGczX2hhbHQoc3RydWN0IHRnMyAqdHAsIGludCBraW5kLCBpbnQgc2lsZW50KQogewpAQCAtNzkzMSw2ICs3OTEzLDE1IEBACiAJdGczX3dyaXRlX3NpZ19sZWdhY3kodHAsIGtpbmQpOwogCXRnM193cml0ZV9zaWdfcG9zdF9yZXNldCh0cCwga2luZCk7CiAKKwlpZiAodHAtPmh3X3N0YXRzKSB7CisJCS8qIFNhdmUgdGhlIHN0YXRzIGFjcm9zcyBjaGlwIHJlc2V0cy4uLiAqLworCQl0ZzNfZ2V0X3N0YXRzNjQodHAtPmRldiwgJnRwLT5uZXRfc3RhdHNfcHJldiksCisJCXRnM19nZXRfZXN0YXRzKHRwLCAmdHAtPmVzdGF0c19wcmV2KTsKKworCQkvKiBBbmQgbWFrZSBzdXJlIHRoZSBuZXh0IHNhbXBsZSBpcyBuZXcgZGF0YSAqLworCQltZW1zZXQodHAtPmh3X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHRnM19od19zdGF0cykpOworCX0KKwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTgwNzQsNyArODA2NSw3IEBACiAJCWxpbWl0ID0gTklDX1NSQU1fU0VORF9SQ0IgKyBURzNfQkRJTkZPX1NJWkUgKiAxNjsKIAllbHNlIGlmICh0ZzNfZmxhZyh0cCwgNTcxN19QTFVTKSkKIAkJbGltaXQgPSBOSUNfU1JBTV9TRU5EX1JDQiArIFRHM19CRElORk9fU0laRSAqIDQ7Ci0JZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KQorCWVsc2UgaWYgKHRnM19mbGFnKHRwLCA1Nzc2NV9DTEFTUykpCiAJCWxpbWl0ID0gTklDX1NSQU1fU0VORF9SQ0IgKyBURzNfQkRJTkZPX1NJWkUgKiAyOwogCWVsc2UKIAkJbGltaXQgPSBOSUNfU1JBTV9TRU5EX1JDQiArIFRHM19CRElORk9fU0laRTsKQEAgLTgwOTEsNyArODA4Miw3IEBACiAJZWxzZSBpZiAoIXRnM19mbGFnKHRwLCA1NzA1X1BMVVMpKQogCQlsaW1pdCA9IE5JQ19TUkFNX1JDVl9SRVRfUkNCICsgVEczX0JESU5GT19TSVpFICogMTY7CiAJZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTUgfHwKLQkJIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkKKwkJIHRnM19mbGFnKHRwLCA1Nzc2NV9DTEFTUykpCiAJCWxpbWl0ID0gTklDX1NSQU1fUkNWX1JFVF9SQ0IgKyBURzNfQkRJTkZPX1NJWkUgKiA0OwogCWVsc2UKIAkJbGltaXQgPSBOSUNfU1JBTV9SQ1ZfUkVUX1JDQiArIFRHM19CRElORk9fU0laRTsKQEAgLTgxOTcsNyArODE4OCw4IEBACiAJaWYgKCF0ZzNfZmxhZyh0cCwgNTc1MF9QTFVTKSB8fAogCSAgICB0ZzNfZmxhZyh0cCwgNTc4MF9DTEFTUykgfHwKIAkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTAgfHwKLQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTIpCisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzUyIHx8CisJICAgIHRnM19mbGFnKHRwLCA1Nzc2NV9QTFVTKSkKIAkJYmRjYWNoZV9tYXhjbnQgPSBURzNfU1JBTV9SWF9TVERfQkRDQUNIRV9TSVpFXzU3MDA7CiAJZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTUgfHwKIAkJIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzg3KQpAQCAtODIxNywxMCArODIwOSw3IEBACiAJaWYgKCF0ZzNfZmxhZyh0cCwgSlVNQk9fQ0FQQUJMRSkgfHwgdGczX2ZsYWcodHAsIDU3ODBfQ0xBU1MpKQogCQlyZXR1cm47CiAKLQlpZiAoIXRnM19mbGFnKHRwLCA1NzA1X1BMVVMpKQotCQliZGNhY2hlX21heGNudCA9IFRHM19TUkFNX1JYX0pNQl9CRENBQ0hFX1NJWkVfNTcwMDsKLQllbHNlCi0JCWJkY2FjaGVfbWF4Y250ID0gVEczX1NSQU1fUlhfSk1CX0JEQ0FDSEVfU0laRV81NzE3OworCWJkY2FjaGVfbWF4Y250ID0gVEczX1NSQU1fUlhfSk1CX0JEQ0FDSEVfU0laRV81NzAwOwogCiAJaG9zdF9yZXBfdGhyZXNoID0gbWF4X3QodTMyLCB0cC0+cnhfanVtYm9fcGVuZGluZyAvIDgsIDEpOwogCkBAIC04MjMxLDYgKzgyMjAsNTQgQEAKIAkJdHczMihKTUJfUkVQTEVOSVNIX0xXTSwgYmRjYWNoZV9tYXhjbnQpOwogfQogCitzdGF0aWMgdm9pZCB0ZzNfcnNzX2luaXRfZGZsdF9pbmRpcl90Ymwoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVEczX1JTU19JTkRJUl9UQkxfU0laRTsgaSsrKQorCQl0cC0+cnNzX2luZF90YmxbaV0gPQorCQkJZXRodG9vbF9yeGZoX2luZGlyX2RlZmF1bHQoaSwgdHAtPmlycV9jbnQgLSAxKTsKK30KKworc3RhdGljIHZvaWQgdGczX3Jzc19jaGVja19pbmRpcl90Ymwoc3RydWN0IHRnMyAqdHApCit7CisJaW50IGk7CisKKwlpZiAoIXRnM19mbGFnKHRwLCBTVVBQT1JUX01TSVgpKQorCQlyZXR1cm47CisKKwlpZiAodHAtPmlycV9jbnQgPD0gMikgeworCQltZW1zZXQoJnRwLT5yc3NfaW5kX3RibFswXSwgMCwgc2l6ZW9mKHRwLT5yc3NfaW5kX3RibCkpOworCQlyZXR1cm47CisJfQorCisJLyogVmFsaWRhdGUgdGFibGUgYWdhaW5zdCBjdXJyZW50IElSUSBjb3VudCAqLworCWZvciAoaSA9IDA7IGkgPCBURzNfUlNTX0lORElSX1RCTF9TSVpFOyBpKyspIHsKKwkJaWYgKHRwLT5yc3NfaW5kX3RibFtpXSA+PSB0cC0+aXJxX2NudCAtIDEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSAhPSBURzNfUlNTX0lORElSX1RCTF9TSVpFKQorCQl0ZzNfcnNzX2luaXRfZGZsdF9pbmRpcl90YmwodHApOworfQorCitzdGF0aWMgdm9pZCB0ZzNfcnNzX3dyaXRlX2luZGlyX3RibChzdHJ1Y3QgdGczICp0cCkKK3sKKwlpbnQgaSA9IDA7CisJdTMyIHJlZyA9IE1BQ19SU1NfSU5ESVJfVEJMXzA7CisKKwl3aGlsZSAoaSA8IFRHM19SU1NfSU5ESVJfVEJMX1NJWkUpIHsKKwkJdTMyIHZhbCA9IHRwLT5yc3NfaW5kX3RibFtpXTsKKwkJaSsrOworCQlmb3IgKDsgaSAlIDg7IGkrKykgeworCQkJdmFsIDw8PSA0OworCQkJdmFsIHw9IHRwLT5yc3NfaW5kX3RibFtpXTsKKwkJfQorCQl0dzMyKHJlZywgdmFsKTsKKwkJcmVnICs9IDQ7CisJfQorfQorCiAvKiB0cC0+bG9jayBpcyBoZWxkLiAqLwogc3RhdGljIGludCB0ZzNfcmVzZXRfaHcoc3RydWN0IHRnMyAqdHAsIGludCByZXNldF9waHkpCiB7CkBAIC04MzM3LDcgKzgzNzQsNyBAQAogCQl0dzMyKEdSQ19NT0RFLCBncmNfbW9kZSk7CiAJfQogCi0JaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkgeworCWlmICh0ZzNfZmxhZyh0cCwgNTc3NjVfQ0xBU1MpKSB7CiAJCWlmICh0cC0+cGNpX2NoaXBfcmV2X2lkID09IENISVBSRVZfSURfNTc3NjVfQTApIHsKIAkJCXUzMiBncmNfbW9kZSA9IHRyMzIoR1JDX01PREUpOwogCkBAIC04NDI1LDcgKzg0NjIsNyBAQAogCQkgICAgICB+RE1BX1JXQ1RSTF9ESVNfQ0FDSEVfQUxJR05NRU5UOwogCQlpZiAodHAtPnBjaV9jaGlwX3Jldl9pZCA9PSBDSElQUkVWX0lEXzU3NzY1X0EwKQogCQkJdmFsICY9IH5ETUFfUldDVFJMX0NSRFJEUl9SRE1BX01SUlNfTVNLOwotCQlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3NzY1ICYmCisJCWlmICghdGczX2ZsYWcodHAsIDU3NzY1X0NMQVNTKSAmJgogCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MTcpCiAJCQl2YWwgfD0gRE1BX1JXQ1RSTF9UQUdHRURfU1RBVF9XQTsKIAkJdHczMihURzNQQ0lfRE1BX1JXX0NUUkwsIHZhbCB8IHRwLT5kbWFfcndjdHJsKTsKQEAgLTg1NzIsNyArODYwOSw3IEBACiAJCQl0dzMyKFJDVkRCRElfSlVNQk9fQkQgKyBURzNfQkRJTkZPX01BWExFTl9GTEFHUywKIAkJCSAgICAgdmFsIHwgQkRJTkZPX0ZMQUdTX1VTRV9FWFRfUkVDVik7CiAJCQlpZiAoIXRnM19mbGFnKHRwLCBVU0VfSlVNQk9fQkRGTEFHKSB8fAotCQkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkKKwkJCSAgICB0ZzNfZmxhZyh0cCwgNTc3NjVfQ0xBU1MpKQogCQkJCXR3MzIoUkNWREJESV9KVU1CT19CRCArIFRHM19CRElORk9fTklDX0FERFIsCiAJCQkJICAgICBOSUNfU1JBTV9SWF9KVU1CT19CVUZGRVJfREVTQyk7CiAJCX0gZWxzZSB7CkBAIC04NTgxLDEwICs4NjE4LDcgQEAKIAkJfQogCiAJCWlmICh0ZzNfZmxhZyh0cCwgNTc3NjVfUExVUykpIHsKLQkJCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjUpCi0JCQkJdmFsID0gVEczX1JYX1NURF9NQVhfU0laRV81NzAwOwotCQkJZWxzZQotCQkJCXZhbCA9IFRHM19SWF9TVERfTUFYX1NJWkVfNTcxNzsKKwkJCXZhbCA9IFRHM19SWF9TVERfUklOR19TSVpFKHRwKTsKIAkJCXZhbCA8PD0gQkRJTkZPX0ZMQUdTX01BWExFTl9TSElGVDsKIAkJCXZhbCB8PSAoVEczX1JYX1NURF9ETUFfU1ogPDwgMik7CiAJCX0gZWxzZQpAQCAtODY2MSw2ICs4Njk1LDkgQEAKIAlpZiAodGczX2ZsYWcodHAsIFBDSV9FWFBSRVNTKSkKIAkJcmRtYWNfbW9kZSB8PSBSRE1BQ19NT0RFX0ZJRk9fTE9OR19CVVJTVDsKIAorCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjYpCisJCXJkbWFjX21vZGUgfD0gUkRNQUNfTU9ERV9KTUJfMktfTU1SUjsKKwogCWlmICh0ZzNfZmxhZyh0cCwgSFdfVFNPXzEpIHx8CiAJICAgIHRnM19mbGFnKHRwLCBIV19UU09fMikgfHwKIAkgICAgdGczX2ZsYWcodHAsIEhXX1RTT18zKSkKQEAgLTg5MjQsMjggKzg5NjEsNyBAQAogCXVkZWxheSgxMDApOwogCiAJaWYgKHRnM19mbGFnKHRwLCBFTkFCTEVfUlNTKSkgewotCQlpbnQgaSA9IDA7Ci0JCXUzMiByZWcgPSBNQUNfUlNTX0lORElSX1RCTF8wOwotCi0JCWlmICh0cC0+aXJxX2NudCA9PSAyKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgVEczX1JTU19JTkRJUl9UQkxfU0laRTsgaSArPSA4KSB7Ci0JCQkJdHczMihyZWcsIDB4MCk7Ci0JCQkJcmVnICs9IDQ7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQl1MzIgdmFsOwotCi0JCQl3aGlsZSAoaSA8IFRHM19SU1NfSU5ESVJfVEJMX1NJWkUpIHsKLQkJCQl2YWwgPSBpICUgKHRwLT5pcnFfY250IC0gMSk7Ci0JCQkJaSsrOwotCQkJCWZvciAoOyBpICUgODsgaSsrKSB7Ci0JCQkJCXZhbCA8PD0gNDsKLQkJCQkJdmFsIHw9IChpICUgKHRwLT5pcnFfY250IC0gMSkpOwotCQkJCX0KLQkJCQl0dzMyKHJlZywgdmFsKTsKLQkJCQlyZWcgKz0gNDsKLQkJCX0KLQkJfQorCQl0ZzNfcnNzX3dyaXRlX2luZGlyX3RibCh0cCk7CiAKIAkJLyogU2V0dXAgdGhlICJzZWNyZXQiIGhhc2gga2V5LiAqLwogCQl0dzMyKE1BQ19SU1NfSEFTSF9LRVlfMCwgMHg1Zjg2NTQzNyk7CkBAIC05MDAyLDcgKzkwMTgsNyBAQAogCS8qIFByZXZlbnQgY2hpcCBmcm9tIGRyb3BwaW5nIGZyYW1lcyB3aGVuIGZsb3cgY29udHJvbAogCSAqIGlzIGVuYWJsZWQuCiAJICovCi0JaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkKKwlpZiAodGczX2ZsYWcodHAsIDU3NzY1X0NMQVNTKSkKIAkJdmFsID0gMTsKIAllbHNlCiAJCXZhbCA9IDI7CkBAIC05MjE3LDcgKzkyMzMsNyBAQAogCXNwaW5fbG9jaygmdHAtPmxvY2spOwogCiAJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8Ci0JICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkKKwkgICAgdGczX2ZsYWcodHAsIDU3NzY1X0NMQVNTKSkKIAkJdGczX2Noa19taXNzZWRfbXNpKHRwKTsKIAogCWlmICghdGczX2ZsYWcodHAsIFRBR0dFRF9TVEFUVVMpKSB7CkBAIC05NjY5LDYgKzk2ODUsOCBAQAogCSAqLwogCXRnM19pbnRzX2luaXQodHApOwogCisJdGczX3Jzc19jaGVja19pbmRpcl90YmwodHApOworCiAJLyogVGhlIHBsYWNlbWVudCBvZiB0aGlzIGNhbGwgaXMgdGllZAogCSAqIHRvIHRoZSBzZXR1cCBhbmQgdXNlIG9mIEhvc3QgVFggZGVzY3JpcHRvcnMuCiAJICovCkBAIC05NzAwLDggKzk3MTgsOCBAQAogCQl0ZzNfZnJlZV9yaW5ncyh0cCk7CiAJfSBlbHNlIHsKIAkJaWYgKHRnM19mbGFnKHRwLCBUQUdHRURfU1RBVFVTKSAmJgotCQkJR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpICE9IEFTSUNfUkVWXzU3MTcgJiYKLQkJCUdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81Nzc2NSkKKwkJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSAhPSBBU0lDX1JFVl81NzE3ICYmCisJCSAgICAhdGczX2ZsYWcodHAsIDU3NzY1X0NMQVNTKSkKIAkJCXRwLT50aW1lcl9vZmZzZXQgPSBIWjsKIAkJZWxzZQogCQkJdHAtPnRpbWVyX29mZnNldCA9IEhaIC8gMTA7CkBAIC05NzgyLDEwICs5ODAwLDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICp0ZzNfZ2V0X3N0YXRzNjQoc3RydWN0IG5ldF9kZXZpY2UgKiwKLQkJCQkJCSBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKik7Ci1zdGF0aWMgc3RydWN0IHRnM19ldGh0b29sX3N0YXRzICp0ZzNfZ2V0X2VzdGF0cyhzdHJ1Y3QgdGczICopOwotCiBzdGF0aWMgaW50IHRnM19jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCBpOwpAQCAtOTgxNywxMCArOTgzMSw5IEBACiAKIAl0ZzNfaW50c19maW5pKHRwKTsKIAotCXRnM19nZXRfc3RhdHM2NCh0cC0+ZGV2LCAmdHAtPm5ldF9zdGF0c19wcmV2KTsKLQotCW1lbWNweSgmdHAtPmVzdGF0c19wcmV2LCB0ZzNfZ2V0X2VzdGF0cyh0cCksCi0JICAgICAgIHNpemVvZih0cC0+ZXN0YXRzX3ByZXYpKTsKKwkvKiBDbGVhciBzdGF0cyBhY3Jvc3MgY2xvc2UgLyBvcGVuIGNhbGxzICovCisJbWVtc2V0KCZ0cC0+bmV0X3N0YXRzX3ByZXYsIDAsIHNpemVvZih0cC0+bmV0X3N0YXRzX3ByZXYpKTsKKwltZW1zZXQoJnRwLT5lc3RhdHNfcHJldiwgMCwgc2l6ZW9mKHRwLT5lc3RhdHNfcHJldikpOwogCiAJdGczX25hcGlfZmluaSh0cCk7CiAKQEAgLTk4NjgsOSArOTg4MSw5IEBACiAJZXN0YXRzLT5tZW1iZXIgPQlvbGRfZXN0YXRzLT5tZW1iZXIgKyBcCiAJCQkJZ2V0X3N0YXQ2NCgmaHdfc3RhdHMtPm1lbWJlcikKIAotc3RhdGljIHN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqdGczX2dldF9lc3RhdHMoc3RydWN0IHRnMyAqdHApCitzdGF0aWMgc3RydWN0IHRnM19ldGh0b29sX3N0YXRzICp0ZzNfZ2V0X2VzdGF0cyhzdHJ1Y3QgdGczICp0cCwKKwkJCQkJICAgICAgIHN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqZXN0YXRzKQogewotCXN0cnVjdCB0ZzNfZXRodG9vbF9zdGF0cyAqZXN0YXRzID0gJnRwLT5lc3RhdHM7CiAJc3RydWN0IHRnM19ldGh0b29sX3N0YXRzICpvbGRfZXN0YXRzID0gJnRwLT5lc3RhdHNfcHJldjsKIAlzdHJ1Y3QgdGczX2h3X3N0YXRzICpod19zdGF0cyA9IHRwLT5od19zdGF0czsKIApAQCAtMTAzMTgsMTIgKzEwMzMxLDIwIEBACiAJCQljbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfQXN5bV9QYXVzZTsKIAkJfQogCX0KLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKSB7CisJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSAmJiBuZXRpZl9jYXJyaWVyX29rKGRldikpIHsKIAkJZXRodG9vbF9jbWRfc3BlZWRfc2V0KGNtZCwgdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9zcGVlZCk7CiAJCWNtZC0+ZHVwbGV4ID0gdHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9kdXBsZXg7CisJCWNtZC0+bHBfYWR2ZXJ0aXNpbmcgPSB0cC0+bGlua19jb25maWcucm10X2FkdjsKKwkJaWYgKCEodHAtPnBoeV9mbGFncyAmIFRHM19QSFlGTEdfQU5ZX1NFUkRFUykpIHsKKwkJCWlmICh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19NRElYX1NUQVRFKQorCQkJCWNtZC0+ZXRoX3RwX21kaXggPSBFVEhfVFBfTURJX1g7CisJCQllbHNlCisJCQkJY21kLT5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NREk7CisJCX0KIAl9IGVsc2UgewogCQlldGh0b29sX2NtZF9zcGVlZF9zZXQoY21kLCBTUEVFRF9JTlZBTElEKTsKIAkJY21kLT5kdXBsZXggPSBEVVBMRVhfSU5WQUxJRDsKKwkJY21kLT5ldGhfdHBfbWRpeCA9IEVUSF9UUF9NRElfSU5WQUxJRDsKIAl9CiAJY21kLT5waHlfYWRkcmVzcyA9IHRwLT5waHlfYWRkcjsKIAljbWQtPnRyYW5zY2VpdmVyID0gWENWUl9JTlRFUk5BTDsKQEAgLTEwNDI4LDEwICsxMDQ0OSwxMCBAQAogewogCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9NT0RVTEVfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9NT0RVTEVfVkVSU0lPTik7Ci0Jc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sIHRwLT5md192ZXIpOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUodHAtPnBkZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5md192ZXJzaW9uLCB0cC0+ZndfdmVyLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHRwLT5wZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHRnM19nZXRfd29sKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX3dvbGluZm8gKndvbCkKQEAgLTEwNTkwLDEyICsxMDYxMSwxMiBAQAogCiAJZXBhdXNlLT5hdXRvbmVnID0gISF0ZzNfZmxhZyh0cCwgUEFVU0VfQVVUT05FRyk7CiAKLQlpZiAodHAtPmxpbmtfY29uZmlnLmFjdGl2ZV9mbG93Y3RybCAmIEZMT1dfQ1RSTF9SWCkKKwlpZiAodHAtPmxpbmtfY29uZmlnLmZsb3djdHJsICYgRkxPV19DVFJMX1JYKQogCQllcGF1c2UtPnJ4X3BhdXNlID0gMTsKIAllbHNlCiAJCWVwYXVzZS0+cnhfcGF1c2UgPSAwOwogCi0JaWYgKHRwLT5saW5rX2NvbmZpZy5hY3RpdmVfZmxvd2N0cmwgJiBGTE9XX0NUUkxfVFgpCisJaWYgKHRwLT5saW5rX2NvbmZpZy5mbG93Y3RybCAmIEZMT1dfQ1RSTF9UWCkKIAkJZXBhdXNlLT50eF9wYXVzZSA9IDE7CiAJZWxzZQogCQllcGF1c2UtPnR4X3BhdXNlID0gMDsKQEAgLTEwNzE1LDYgKzEwNzM2LDc4IEBACiAJfQogfQogCitzdGF0aWMgaW50IHRnM19nZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKmluZm8sCisJCQkgdTMyICpydWxlcyBfX2Fsd2F5c191bnVzZWQpCit7CisJc3RydWN0IHRnMyAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKCF0ZzNfZmxhZyh0cCwgU1VQUE9SVF9NU0lYKSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3dpdGNoIChpbmZvLT5jbWQpIHsKKwljYXNlIEVUSFRPT0xfR1JYUklOR1M6CisJCWlmIChuZXRpZl9ydW5uaW5nKHRwLT5kZXYpKQorCQkJaW5mby0+ZGF0YSA9IHRwLT5pcnFfY250OworCQllbHNlIHsKKwkJCWluZm8tPmRhdGEgPSBudW1fb25saW5lX2NwdXMoKTsKKwkJCWlmIChpbmZvLT5kYXRhID4gVEczX0lSUV9NQVhfVkVDU19SU1MpCisJCQkJaW5mby0+ZGF0YSA9IFRHM19JUlFfTUFYX1ZFQ1NfUlNTOworCQl9CisKKwkJLyogVGhlIGZpcnN0IGludGVycnVwdCB2ZWN0b3Igb25seQorCQkgKiBoYW5kbGVzIGxpbmsgaW50ZXJydXB0cy4KKwkJICovCisJCWluZm8tPmRhdGEgLT0gMTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgdTMyIHRnM19nZXRfcnhmaF9pbmRpcl9zaXplKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIHNpemUgPSAwOworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWlmICh0ZzNfZmxhZyh0cCwgU1VQUE9SVF9NU0lYKSkKKwkJc2l6ZSA9IFRHM19SU1NfSU5ESVJfVEJMX1NJWkU7CisKKwlyZXR1cm4gc2l6ZTsKK30KKworc3RhdGljIGludCB0ZzNfZ2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyICppbmRpcikKK3sKKwlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVEczX1JTU19JTkRJUl9UQkxfU0laRTsgaSsrKQorCQlpbmRpcltpXSA9IHRwLT5yc3NfaW5kX3RibFtpXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRnM19zZXRfcnhmaF9pbmRpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB1MzIgKmluZGlyKQoreworCXN0cnVjdCB0ZzMgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzaXplX3QgaTsKKworCWZvciAoaSA9IDA7IGkgPCBURzNfUlNTX0lORElSX1RCTF9TSVpFOyBpKyspCisJCXRwLT5yc3NfaW5kX3RibFtpXSA9IGluZGlyW2ldOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKGRldikgfHwgIXRnM19mbGFnKHRwLCBFTkFCTEVfUlNTKSkKKwkJcmV0dXJuIDA7CisKKwkvKiBJdCBpcyBsZWdhbCB0byB3cml0ZSB0aGUgaW5kaXJlY3Rpb24KKwkgKiB0YWJsZSB3aGlsZSB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcuCisJICovCisJdGczX2Z1bGxfbG9jayh0cCwgMCk7CisJdGczX3Jzc193cml0ZV9pbmRpcl90YmwodHApOworCXRnM19mdWxsX3VubG9jayh0cCk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHZvaWQgdGczX2dldF9zdHJpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBzdHJpbmdzZXQsIHU4ICpidWYpCiB7CiAJc3dpdGNoIChzdHJpbmdzZXQpIHsKQEAgLTEwNzY5LDcgKzEwODYyLDggQEAKIAkJCQkgICBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZXN0YXRzLCB1NjQgKnRtcF9zdGF0cykKIHsKIAlzdHJ1Y3QgdGczICp0cCA9IG5ldGRldl9wcml2KGRldik7Ci0JbWVtY3B5KHRtcF9zdGF0cywgdGczX2dldF9lc3RhdHModHApLCBzaXplb2YodHAtPmVzdGF0cykpOworCisJdGczX2dldF9lc3RhdHModHAsIChzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMgKil0bXBfc3RhdHMpOwogfQogCiBzdGF0aWMgX19iZTMyICp0ZzNfdnBkX3JlYWRibG9jayhzdHJ1Y3QgdGczICp0cCwgdTMyICp2cGRsZW4pCkBAIC0xMTM1Miw3ICsxMTQ0Niw3IEBACiAKIAlpZiAodGczX2ZsYWcodHAsIDU3MTdfUExVUykpCiAJCW1lbV90YmwgPSBtZW1fdGJsXzU3MTc7Ci0JZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1KQorCWVsc2UgaWYgKHRnM19mbGFnKHRwLCA1Nzc2NV9DTEFTUykpCiAJCW1lbV90YmwgPSBtZW1fdGJsXzU3NzY1OwogCWVsc2UgaWYgKHRnM19mbGFnKHRwLCA1NzU1X1BMVVMpKQogCQltZW1fdGJsID0gbWVtX3RibF81NzU1OwpAQCAtMTE0MDAsOCArMTE0OTQsOCBAQAogCXUzMiByeF9zdGFydF9pZHgsIHJ4X2lkeCwgdHhfaWR4LCBvcGFxdWVfa2V5OwogCXUzMiBiYXNlX2ZsYWdzID0gMCwgbXNzID0gMCwgZGVzY19pZHgsIGNvYWxfbm93LCBkYXRhX29mZiwgdmFsOwogCXUzMiBidWRnZXQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnJ4X3NrYjsKLQl1OCAqdHhfZGF0YTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4ICp0eF9kYXRhLCAqcnhfZGF0YTsKIAlkbWFfYWRkcl90IG1hcDsKIAlpbnQgbnVtX3BrdHMsIHR4X2xlbiwgcnhfbGVuLCBpLCBlcnI7CiAJc3RydWN0IHRnM19yeF9idWZmZXJfZGVzYyAqZGVzYzsKQEAgLTExNTY5LDExICsxMTY2MywxMSBAQAogCQl9CiAKIAkJaWYgKG9wYXF1ZV9rZXkgPT0gUlhEX09QQVFVRV9SSU5HX1NURCkgewotCQkJcnhfc2tiID0gdHByLT5yeF9zdGRfYnVmZmVyc1tkZXNjX2lkeF0uc2tiOworCQkJcnhfZGF0YSA9IHRwci0+cnhfc3RkX2J1ZmZlcnNbZGVzY19pZHhdLmRhdGE7CiAJCQltYXAgPSBkbWFfdW5tYXBfYWRkcigmdHByLT5yeF9zdGRfYnVmZmVyc1tkZXNjX2lkeF0sCiAJCQkJCSAgICAgbWFwcGluZyk7CiAJCX0gZWxzZSBpZiAob3BhcXVlX2tleSA9PSBSWERfT1BBUVVFX1JJTkdfSlVNQk8pIHsKLQkJCXJ4X3NrYiA9IHRwci0+cnhfam1iX2J1ZmZlcnNbZGVzY19pZHhdLnNrYjsKKwkJCXJ4X2RhdGEgPSB0cHItPnJ4X2ptYl9idWZmZXJzW2Rlc2NfaWR4XS5kYXRhOwogCQkJbWFwID0gZG1hX3VubWFwX2FkZHIoJnRwci0+cnhfam1iX2J1ZmZlcnNbZGVzY19pZHhdLAogCQkJCQkgICAgIG1hcHBpbmcpOwogCQl9IGVsc2UKQEAgLTExNTgyLDE1ICsxMTY3NiwxNiBAQAogCQlwY2lfZG1hX3N5bmNfc2luZ2xlX2Zvcl9jcHUodHAtPnBkZXYsIG1hcCwgcnhfbGVuLAogCQkJCQkgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKIAorCQlyeF9kYXRhICs9IFRHM19SWF9PRkZTRVQodHApOwogCQlmb3IgKGkgPSBkYXRhX29mZjsgaSA8IHJ4X2xlbjsgaSsrLCB2YWwrKykgewotCQkJaWYgKCoocnhfc2tiLT5kYXRhICsgaSkgIT0gKHU4KSAodmFsICYgMHhmZikpCisJCQlpZiAoKihyeF9kYXRhICsgaSkgIT0gKHU4KSAodmFsICYgMHhmZikpCiAJCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKIAllcnIgPSAwOwogCi0JLyogdGczX2ZyZWVfcmluZ3Mgd2lsbCB1bm1hcCBhbmQgZnJlZSB0aGUgcnhfc2tiICovCisJLyogdGczX2ZyZWVfcmluZ3Mgd2lsbCB1bm1hcCBhbmQgZnJlZSB0aGUgcnhfZGF0YSAqLwogb3V0OgogCXJldHVybiBlcnI7CiB9CkBAIC0xMTk0Myw2ICsxMjAzOCwxMCBAQAogCS5nZXRfY29hbGVzY2UJCT0gdGczX2dldF9jb2FsZXNjZSwKIAkuc2V0X2NvYWxlc2NlCQk9IHRnM19zZXRfY29hbGVzY2UsCiAJLmdldF9zc2V0X2NvdW50CQk9IHRnM19nZXRfc3NldF9jb3VudCwKKwkuZ2V0X3J4bmZjCQk9IHRnM19nZXRfcnhuZmMsCisJLmdldF9yeGZoX2luZGlyX3NpemUgICAgPSB0ZzNfZ2V0X3J4ZmhfaW5kaXJfc2l6ZSwKKwkuZ2V0X3J4ZmhfaW5kaXIJCT0gdGczX2dldF9yeGZoX2luZGlyLAorCS5zZXRfcnhmaF9pbmRpcgkJPSB0ZzNfc2V0X3J4ZmhfaW5kaXIsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2RldmluaXQgdGczX2dldF9lZXByb21fc2l6ZShzdHJ1Y3QgdGczICp0cCkKQEAgLTEyNjEyLDcgKzEyNzExLDcgQEAKIAkJZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU5MDYpCiAJCQl0ZzNfZ2V0XzU5MDZfbnZyYW1faW5mbyh0cCk7CiAJCWVsc2UgaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc4MCB8fAotCQkJIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkKKwkJCSB0ZzNfZmxhZyh0cCwgNTc3NjVfQ0xBU1MpKQogCQkJdGczX2dldF81Nzc4MF9udnJhbV9pbmZvKHRwKTsKIAkJZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MTcgfHwKIAkJCSBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSkKQEAgLTEzMjE4LDggKzEzMzE3LDcgQEAKIAogc3RhdGljIHZvaWQgX19kZXZpbml0IHRnM19waHlfaW5pdF9saW5rX2NvbmZpZyhzdHJ1Y3QgdGczICp0cCkKIHsKLQl1MzIgYWR2ID0gQURWRVJUSVNFRF9BdXRvbmVnIHwKLQkJICBBRFZFUlRJU0VEX1BhdXNlOworCXUzMiBhZHYgPSBBRFZFUlRJU0VEX0F1dG9uZWc7CiAKIAlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR18xMF8xMDBfT05MWSkpCiAJCWFkdiB8PSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmIHwKQEAgLTEzMzIyLDcgKzEzNDIwLDcgQEAKIAlpZiAoISh0cC0+cGh5X2ZsYWdzICYgVEczX1BIWUZMR19BTllfU0VSREVTKSAmJgogCSAgICAhdGczX2ZsYWcodHAsIEVOQUJMRV9BUEUpICYmCiAJICAgICF0ZzNfZmxhZyh0cCwgRU5BQkxFX0FTRikpIHsKLQkJdTMyIGJtc3IsIG1hc2s7CisJCXUzMiBibXNyLCBkdW1teTsKIAogCQl0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKTsKIAkJaWYgKCF0ZzNfcmVhZHBoeSh0cCwgTUlJX0JNU1IsICZibXNyKSAmJgpAQCAtMTMzMzUsMTAgKzEzNDMzLDcgQEAKIAogCQl0ZzNfcGh5X3NldF93aXJlc3BlZWQodHApOwogCi0JCW1hc2sgPSAoQURWRVJUSVNFRF8xMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCB8Ci0JCQlBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYgfCBBRFZFUlRJU0VEXzEwMGJhc2VUX0Z1bGwgfAotCQkJQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZiB8IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpOwotCQlpZiAoIXRnM19jb3BwZXJfaXNfYWR2ZXJ0aXNpbmdfYWxsKHRwLCBtYXNrKSkgeworCQlpZiAoIXRnM19waHlfY29wcGVyX2FuX2NvbmZpZ19vayh0cCwgJmR1bW15KSkgewogCQkJdGczX3BoeV9hdXRvbmVnX2NmZyh0cCwgdHAtPmxpbmtfY29uZmlnLmFkdmVydGlzaW5nLAogCQkJCQkgICAgdHAtPmxpbmtfY29uZmlnLmZsb3djdHJsKTsKIApAQCAtMTM0NjAsNiArMTM1NTUsMTcgQEAKIAkJCXN0cmNweSh0cC0+Ym9hcmRfcGFydF9udW1iZXIsICJCQ001Nzc5NSIpOwogCQllbHNlCiAJCQlnb3RvIG5vbWF0Y2g7CisJfSBlbHNlIGlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjYpIHsKKwkJaWYgKHRwLT5wZGV2LT5kZXZpY2UgPT0gVEczUENJX0RFVklDRV9USUdPTjNfNTc3NjIpCisJCQlzdHJjcHkodHAtPmJvYXJkX3BhcnRfbnVtYmVyLCAiQkNNNTc3NjIiKTsKKwkJZWxzZSBpZiAodHAtPnBkZXYtPmRldmljZSA9PSBURzNQQ0lfREVWSUNFX1RJR09OM181Nzc2NikKKwkJCXN0cmNweSh0cC0+Ym9hcmRfcGFydF9udW1iZXIsICJCQ001Nzc2NiIpOworCQllbHNlIGlmICh0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NzgyKQorCQkJc3RyY3B5KHRwLT5ib2FyZF9wYXJ0X251bWJlciwgIkJDTTU3NzgyIik7CisJCWVsc2UgaWYgKHRwLT5wZGV2LT5kZXZpY2UgPT0gVEczUENJX0RFVklDRV9USUdPTjNfNTc3ODYpCisJCQlzdHJjcHkodHAtPmJvYXJkX3BhcnRfbnVtYmVyLCAiQkNNNTc3ODYiKTsKKwkJZWxzZQorCQkJZ290byBub21hdGNoOwogCX0gZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU5MDYpIHsKIAkJc3RyY3B5KHRwLT5ib2FyZF9wYXJ0X251bWJlciwgIkJDTTk1OTA2Iik7CiAJfSBlbHNlIHsKQEAgLTEzNzk4LDcgKzEzOTA0LDExIEBACiAJCQkgdHAtPnBkZXYtPmRldmljZSA9PSBURzNQQ0lfREVWSUNFX1RJR09OM181Nzc2MSB8fAogCQkJIHRwLT5wZGV2LT5kZXZpY2UgPT0gVEczUENJX0RFVklDRV9USUdPTjNfNTc3NjUgfHwKIAkJCSB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NzkxIHx8Ci0JCQkgdHAtPnBkZXYtPmRldmljZSA9PSBURzNQQ0lfREVWSUNFX1RJR09OM181Nzc5NSkKKwkJCSB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3Nzk1IHx8CisJCQkgdHAtPnBkZXYtPmRldmljZSA9PSBURzNQQ0lfREVWSUNFX1RJR09OM181Nzc2MiB8fAorCQkJIHRwLT5wZGV2LT5kZXZpY2UgPT0gVEczUENJX0RFVklDRV9USUdPTjNfNTc3NjYgfHwKKwkJCSB0cC0+cGRldi0+ZGV2aWNlID09IFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NzgyIHx8CisJCQkgdHAtPnBkZXYtPmRldmljZSA9PSBURzNQQ0lfREVWSUNFX1RJR09OM181Nzc4NikKIAkJCXBjaV9yZWFkX2NvbmZpZ19kd29yZCh0cC0+cGRldiwKIAkJCQkJICAgICAgVEczUENJX0dFTjE1X1BST0RJRF9BU0lDUkVWLAogCQkJCQkgICAgICAmcHJvZF9pZF9hc2ljX3Jldik7CkBAIC0xMzk0NSw3ICsxNDA1NSwxMCBAQAogCQl0ZzNfZmxhZ19zZXQodHAsIDU3MTdfUExVUyk7CiAKIAlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY1IHx8Ci0JICAgIHRnM19mbGFnKHRwLCA1NzE3X1BMVVMpKQorCSAgICBHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTc3NjYpCisJCXRnM19mbGFnX3NldCh0cCwgNTc3NjVfQ0xBU1MpOworCisJaWYgKHRnM19mbGFnKHRwLCA1Nzc2NV9DTEFTUykgfHwgdGczX2ZsYWcodHAsIDU3MTdfUExVUykpCiAJCXRnM19mbGFnX3NldCh0cCwgNTc3NjVfUExVUyk7CiAKIAkvKiBJbnRlbnRpb25hbGx5IGV4Y2x1ZGUgQVNJQ19SRVZfNTkwNiAqLwpAQCAtMTM5OTcsOSArMTQxMTAsMTMgQEAKIAlpZiAodGczX2ZsYWcodHAsIEhXX1RTT18xKSB8fAogCSAgICB0ZzNfZmxhZyh0cCwgSFdfVFNPXzIpIHx8CiAJICAgIHRnM19mbGFnKHRwLCBIV19UU09fMykgfHwKLQkgICAgKHRwLT5md19uZWVkZWQgJiYgIXRnM19mbGFnKHRwLCBFTkFCTEVfQVNGKSkpCisJICAgIHRwLT5md19uZWVkZWQpIHsKKwkJLyogRm9yIGZpcm13YXJlIFRTTywgYXNzdW1lIEFTRiBpcyBkaXNhYmxlZC4KKwkJICogV2UnbGwgZGlzYWJsZSBUU08gbGF0ZXIgaWYgd2UgZGlzY292ZXIgQVNGCisJCSAqIGlzIGVuYWJsZWQgaW4gdGczX2dldF9lZXByb21faHdfY2ZnKCkuCisJCSAqLwogCQl0ZzNfZmxhZ19zZXQodHAsIFRTT19DQVBBQkxFKTsKLQllbHNlIHsKKwl9IGVsc2UgewogCQl0ZzNfZmxhZ19jbGVhcih0cCwgVFNPX0NBUEFCTEUpOwogCQl0ZzNfZmxhZ19jbGVhcih0cCwgVFNPX0JVRyk7CiAJCXRwLT5md19uZWVkZWQgPSBOVUxMOwpAQCAtMTQwMjcsNiArMTQxNDQsNyBAQAogCQlpZiAodGczX2ZsYWcodHAsIDU3NzY1X1BMVVMpKSB7CiAJCQl0ZzNfZmxhZ19zZXQodHAsIFNVUFBPUlRfTVNJWCk7CiAJCQl0cC0+aXJxX21heCA9IFRHM19JUlFfTUFYX1ZFQ1M7CisJCQl0ZzNfcnNzX2luaXRfZGZsdF9pbmRpcl90YmwodHApOwogCQl9CiAJfQogCkBAIC0xNDAzNCw5ICsxNDE1MiwxMyBAQAogCQl0ZzNfZmxhZ19zZXQodHAsIFNIT1JUX0RNQV9CVUcpOwogCiAJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE5KQotCQl0ZzNfZmxhZ19zZXQodHAsIDRLX0ZJRk9fTElNSVQpOworCQl0cC0+ZG1hX2xpbWl0ID0gVEczX1RYX0JEX0RNQV9NQVhfNEs7CisJZWxzZSBpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzY2KQorCQl0cC0+ZG1hX2xpbWl0ID0gVEczX1RYX0JEX0RNQV9NQVhfMks7CiAKLQlpZiAodGczX2ZsYWcodHAsIDU3MTdfUExVUykpCisJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE3IHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzE5IHx8CisJICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzIwKQogCQl0ZzNfZmxhZ19zZXQodHAsIExSR19QUk9EX1JJTkdfQ0FQKTsKIAogCWlmICh0ZzNfZmxhZyh0cCwgNTc3NjVfUExVUykgJiYKQEAgLTE0MDU2LDEyICsxNDE3OCwxMSBAQAogCiAJCXRnM19mbGFnX3NldCh0cCwgUENJX0VYUFJFU1MpOwogCi0JCXRwLT5wY2llX3JlYWRycSA9IDQwOTY7Ci0JCWlmIChHRVRfQVNJQ19SRVYodHAtPnBjaV9jaGlwX3Jldl9pZCkgPT0gQVNJQ19SRVZfNTcxOSB8fAotCQkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3MjApCi0JCQl0cC0+cGNpZV9yZWFkcnEgPSAyMDQ4OwotCi0JCXBjaWVfc2V0X3JlYWRycSh0cC0+cGRldiwgdHAtPnBjaWVfcmVhZHJxKTsKKwkJaWYgKHRwLT5wY2lfY2hpcF9yZXZfaWQgPT0gQ0hJUFJFVl9JRF81NzE5X0EwKSB7CisJCQlpbnQgcmVhZHJxID0gcGNpZV9nZXRfcmVhZHJxKHRwLT5wZGV2KTsKKwkJCWlmIChyZWFkcnEgPiAyMDQ4KQorCQkJCXBjaWVfc2V0X3JlYWRycSh0cC0+cGRldiwgMjA0OCk7CisJCX0KIAogCQlwY2lfcmVhZF9jb25maWdfd29yZCh0cC0+cGRldiwKIAkJCQkgICAgIHBjaV9wY2llX2NhcCh0cC0+cGRldikgKyBQQ0lfRVhQX0xOS0NUTCwKQEAgLTE0MjczLDYgKzE0Mzk0LDEyIEBACiAJICovCiAJdGczX2dldF9lZXByb21faHdfY2ZnKHRwKTsKIAorCWlmICh0cC0+ZndfbmVlZGVkICYmIHRnM19mbGFnKHRwLCBFTkFCTEVfQVNGKSkgeworCQl0ZzNfZmxhZ19jbGVhcih0cCwgVFNPX0NBUEFCTEUpOworCQl0ZzNfZmxhZ19jbGVhcih0cCwgVFNPX0JVRyk7CisJCXRwLT5md19uZWVkZWQgPSBOVUxMOworCX0KKwogCWlmICh0ZzNfZmxhZyh0cCwgRU5BQkxFX0FQRSkpIHsKIAkJLyogQWxsb3cgcmVhZHMgYW5kIHdyaXRlcyB0byB0aGUKIAkJICogQVBFIHJlZ2lzdGVyIGFuZCBtZW1vcnkgc3BhY2UuCkBAIC0xNDMxMSw3ICsxNDQzOCw3IEBACiAKIAlpZiAoR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NTUgfHwKIAkgICAgR0VUX0FTSUNfUkVWKHRwLT5wY2lfY2hpcF9yZXZfaWQpID09IEFTSUNfUkVWXzU3NzgwIHx8Ci0JICAgIEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81Nzc2NSkKKwkgICAgdGczX2ZsYWcodHAsIDU3NzY1X0NMQVNTKSkKIAkJdHAtPmdyY19sb2NhbF9jdHJsIHw9IEdSQ19MQ0xDVFJMX0dQSU9fVUFSVF9TRUw7CiAKIAlpZiAodHAtPnBkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX1RJR09OM181NzYxIHx8CkBAIC0xNDU0OCwxMSArMTQ2NzUsMTEgQEAKIAllbHNlCiAJCXRnM19mbGFnX2NsZWFyKHRwLCBQT0xMX1NFUkRFUyk7CiAKLQl0cC0+cnhfb2Zmc2V0ID0gTkVUX0lQX0FMSUdOOworCXRwLT5yeF9vZmZzZXQgPSBORVRfU0tCX1BBRCArIE5FVF9JUF9BTElHTjsKIAl0cC0+cnhfY29weV90aHJlc2ggPSBURzNfUlhfQ09QWV9USFJFU0hPTEQ7CiAJaWYgKEdFVF9BU0lDX1JFVih0cC0+cGNpX2NoaXBfcmV2X2lkKSA9PSBBU0lDX1JFVl81NzAxICYmCiAJICAgIHRnM19mbGFnKHRwLCBQQ0lYX01PREUpKSB7Ci0JCXRwLT5yeF9vZmZzZXQgPSAwOworCQl0cC0+cnhfb2Zmc2V0ID0gTkVUX1NLQl9QQUQ7CiAjaWZuZGVmIENPTkZJR19IQVZFX0VGRklDSUVOVF9VTkFMSUdORURfQUNDRVNTCiAJCXRwLT5yeF9jb3B5X3RocmVzaCA9IH4odTE2KTA7CiAjZW5kaWYKQEAgLTE1MzEzLDcgKzE1NDQwLDcgQEAKIAl1MzIgc25kbWJ4LCByY3ZtYngsIGludG1ieDsKIAljaGFyIHN0cls0MF07CiAJdTY0IGRtYV9tYXNrLCBwZXJzaXN0X2RtYV9tYXNrOwotCXUzMiBmZWF0dXJlcyA9IDA7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMgPSAwOwogCiAJcHJpbnRrX29uY2UoS0VSTl9JTkZPICIlc1xuIiwgdmVyc2lvbik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2FkY29tL3RnMy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmgKaW5kZXggOTRiNGJkMC4uYWVhOGY3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvYWRjb20vdGczLmgKQEAgLTMxLDYgKzMxLDggQEAKICNkZWZpbmUgVEczX1JYX1JFVF9NQVhfU0laRV81NzA1CTUxMgogI2RlZmluZSBURzNfUlhfUkVUX01BWF9TSVpFXzU3MTcJNDA5NgogCisjZGVmaW5lIFRHM19SU1NfSU5ESVJfVEJMX1NJWkUJCTEyOAorCiAvKiBGaXJzdCAyNTYgYnl0ZXMgYXJlIGEgbWlycm9yIG9mIFBDSSBjb25maWcgc3BhY2UuICovCiAjZGVmaW5lIFRHM1BDSV9WRU5ET1IJCQkweDAwMDAwMDAwCiAjZGVmaW5lICBURzNQQ0lfVkVORE9SX0JST0FEQ09NCQkgMHgxNGU0CkBAIC01Nyw2ICs1OSwxMCBAQAogI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfNTc3OTUJIDB4MTZiNgogI2RlZmluZSAgVEczUENJX0RFVklDRV9USUdPTjNfNTcxOQkgMHgxNjU3CiAjZGVmaW5lICBURzNQQ0lfREVWSUNFX1RJR09OM181NzIwCSAweDE2NWYKKyNkZWZpbmUgIFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NzYyCSAweDE2ODIKKyNkZWZpbmUgIFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NzY2CSAweDE2ODYKKyNkZWZpbmUgIFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3Nzg2CSAweDE2YjMKKyNkZWZpbmUgIFRHM1BDSV9ERVZJQ0VfVElHT04zXzU3NzgyCSAweDE2YjcKIC8qIDB4MDQgLS0+IDB4MmMgdW51c2VkICovCiAjZGVmaW5lIFRHM1BDSV9TVUJWRU5ET1JfSURfQlJPQURDT00JCVBDSV9WRU5ET1JfSURfQlJPQURDT00KICNkZWZpbmUgVEczUENJX1NVQkRFVklDRV9JRF9CUk9BRENPTV85NTcwMEE2CTB4MTY0NApAQCAtMTY4LDYgKzE3NCw3IEBACiAjZGVmaW5lICAgQVNJQ19SRVZfNTc3NjUJCSAweDU3Nzg1CiAjZGVmaW5lICAgQVNJQ19SRVZfNTcxOQkJCSAweDU3MTkKICNkZWZpbmUgICBBU0lDX1JFVl81NzIwCQkJIDB4NTcyMAorI2RlZmluZSAgIEFTSUNfUkVWXzU3NzY2CQkgMHg1Nzc2NgogI2RlZmluZSAgR0VUX0NISVBfUkVWKENISVBfUkVWX0lEKQkoKENISVBfUkVWX0lEKSA+PiA4KQogI2RlZmluZSAgIENISVBSRVZfNTcwMF9BWAkJIDB4NzAKICNkZWZpbmUgICBDSElQUkVWXzU3MDBfQlgJCSAweDcxCkBAIC0xMzQwLDYgKzEzNDcsNyBAQAogI2RlZmluZSAgUkRNQUNfTU9ERV9NQlVGX1NCRF9DUlBUX0VOQUIJIDB4MDAwMDIwMDAKICNkZWZpbmUgIFJETUFDX01PREVfRklGT19TSVpFXzEyOAkgMHgwMDAyMDAwMAogI2RlZmluZSAgUkRNQUNfTU9ERV9GSUZPX0xPTkdfQlVSU1QJIDB4MDAwMzAwMDAKKyNkZWZpbmUgIFJETUFDX01PREVfSk1CXzJLX01NUlIJCSAweDAwODAwMDAwCiAjZGVmaW5lICBSRE1BQ19NT0RFX01VTFRfRE1BX1JEX0RJUwkgMHgwMTAwMDAwMAogI2RlZmluZSAgUkRNQUNfTU9ERV9JUFY0X0xTT19FTgkJIDB4MDgwMDAwMDAKICNkZWZpbmUgIFJETUFDX01PREVfSVBWNl9MU09fRU4JCSAweDEwMDAwMDAwCkBAIC0yMTc0LDYgKzIxODIsNyBAQAogI2RlZmluZSAgTUlJX1RHM19FWFRfQ1RSTF9UQkkJCTB4ODAwMAogCiAjZGVmaW5lIE1JSV9URzNfRVhUX1NUQVQJCTB4MTEgLyogRXh0ZW5kZWQgc3RhdHVzIHJlZ2lzdGVyICovCisjZGVmaW5lICBNSUlfVEczX0VYVF9TVEFUX01ESVgJCTB4MjAwMAogI2RlZmluZSAgTUlJX1RHM19FWFRfU1RBVF9MUEFTUwkJMHgwMTAwCiAKICNkZWZpbmUgTUlJX1RHM19SWFJfQ09VTlRFUlMJCTB4MTQgLyogTG9jYWwvUmVtb3RlIFJlY2VpdmVyIENvdW50cyAqLwpAQCAtMjI3Nyw2ICsyMjg2LDkgQEAKICNkZWZpbmUgIE1JSV9URzNfRkVUX1BURVNUX0ZSQ19UWF9MSU5LCTB4MTAwMAogI2RlZmluZSAgTUlJX1RHM19GRVRfUFRFU1RfRlJDX1RYX0xPQ0sJMHgwODAwCiAKKyNkZWZpbmUgTUlJX1RHM19GRVRfR0VOX1NUQVQJCTB4MWMKKyNkZWZpbmUgIE1JSV9URzNfRkVUX0dFTl9TVEFUX01ESVhTVEFUCTB4MjAwMAorCiAjZGVmaW5lIE1JSV9URzNfRkVUX1RFU1QJCTB4MWYKICNkZWZpbmUgIE1JSV9URzNfRkVUX1NIQURPV19FTgkJMHgwMDgwCiAKQEAgLTI2NjIsOSArMjY3NCwxMyBAQAogLyogJ21hcHBpbmcnIGlzIHN1cGVyZmx1b3VzIGFzIHRoZSBjaGlwIGRvZXMgbm90IHdyaXRlIGludG8KICAqIHRoZSB0eC9yeCBwb3N0IHJpbmdzIHNvIHdlIGNvdWxkIGp1c3QgZmV0Y2ggaXQgZnJvbSB0aGVyZS4KICAqIEJ1dCB0aGUgY2FjaGUgYmVoYXZpb3IgaXMgYmV0dGVyIGhvdyB3ZSBhcmUgZG9pbmcgaXQgbm93LgorICoKKyAqIFRoaXMgZHJpdmVyIHVzZXMgbmV3IGJ1aWxkX3NrYigpIEFQSSA6CisgKiBSWCByaW5nIGJ1ZmZlciBjb250YWlucyBwb2ludGVyIHRvIGttYWxsb2MoKSBkYXRhIG9ubHksCisgKiBza2IgYXJlIGJ1aWx0IG9ubHkgYWZ0ZXIgSGFyZHdhcmUgZmlsbGVkIHRoZSBmcmFtZS4KICAqLwogc3RydWN0IHJpbmdfaW5mbyB7Ci0Jc3RydWN0IHNrX2J1ZmYJCQkqc2tiOworCXU4CQkJCSpkYXRhOwogCURFRklORV9ETUFfVU5NQVBfQUREUihtYXBwaW5nKTsKIH07CiAKQEAgLTI2OTAsNiArMjcwNiw3IEBACiAjZGVmaW5lIERVUExFWF9JTlZBTElECQkweGZmCiAjZGVmaW5lIEFVVE9ORUdfSU5WQUxJRAkJMHhmZgogCXUxNgkJCQlhY3RpdmVfc3BlZWQ7CisJdTMyCQkJCXJtdF9hZHY7CiAKIAkvKiBXaGVuIHdlIGdvIGluIGFuZCBvdXQgb2YgbG93IHBvd2VyIG1vZGUgd2UgbmVlZAogCSAqIHRvIHN3YXAgd2l0aCB0aGlzIHN0YXRlLgpAQCAtMjg2NSw2ICsyODgyLDggQEAKIAlURzNfRkxBR19OVlJBTV9CVUZGRVJFRCwKIAlURzNfRkxBR19TVVBQT1JUX01TSSwKIAlURzNfRkxBR19TVVBQT1JUX01TSVgsCisJVEczX0ZMQUdfVVNJTkdfTVNJLAorCVRHM19GTEFHX1VTSU5HX01TSVgsCiAJVEczX0ZMQUdfUENJWF9NT0RFLAogCVRHM19GTEFHX1BDSV9ISUdIX1NQRUVELAogCVRHM19GTEFHX1BDSV8zMkJJVCwKQEAgLTI4ODAsNyArMjg5OSw2IEBACiAJVEczX0ZMQUdfQ0hJUF9SRVNFVFRJTkcsCiAJVEczX0ZMQUdfSU5JVF9DT01QTEVURSwKIAlURzNfRkxBR19UU09fQlVHLAotCVRHM19GTEFHX0lTXzU3ODgsCiAJVEczX0ZMQUdfTUFYX1JYUEVORF82NCwKIAlURzNfRkxBR19UU09fQ0FQQUJMRSwKIAlURzNfRkxBR19QQ0lfRVhQUkVTUywgLyogQkNNNTc4NSArIHBjaV9pc19wY2llKCkgKi8KQEAgLTI4ODksMTQgKzI5MDcsOSBAQAogCVRHM19GTEFHX0lTX05JQywKIAlURzNfRkxBR19GTEFTSCwKIAlURzNfRkxBR19IV19UU09fMSwKLQlURzNfRkxBR181NzA1X1BMVVMsCi0JVEczX0ZMQUdfNTc1MF9QTFVTLAotCVRHM19GTEFHX0hXX1RTT18zLAotCVRHM19GTEFHX1VTSU5HX01TSSwKLQlURzNfRkxBR19VU0lOR19NU0lYLAotCVRHM19GTEFHX0lDSF9XT1JLQVJPVU5ELAotCVRHM19GTEFHXzU3ODBfQ0xBU1MsCiAJVEczX0ZMQUdfSFdfVFNPXzIsCisJVEczX0ZMQUdfSFdfVFNPXzMsCisJVEczX0ZMQUdfSUNIX1dPUktBUk9VTkQsCiAJVEczX0ZMQUdfMVNIT1RfTVNJLAogCVRHM19GTEFHX05PX0ZXQVJFX1JFUE9SVEVELAogCVRHM19GTEFHX05PX05WUkFNX0FERFJfVFJBTlMsCkBAIC0yOTEwLDE4ICsyOTIzLDIzIEBACiAJVEczX0ZMQUdfUkdNSUlfRVhUX0lCTkRfUlhfRU4sCiAJVEczX0ZMQUdfUkdNSUlfRVhUX0lCTkRfVFhfRU4sCiAJVEczX0ZMQUdfQ0xLUkVRX0JVRywKLQlURzNfRkxBR181NzU1X1BMVVMsCiAJVEczX0ZMQUdfTk9fTlZSQU0sCiAJVEczX0ZMQUdfRU5BQkxFX1JTUywKIAlURzNfRkxBR19FTkFCTEVfVFNTLAogCVRHM19GTEFHX1NIT1JUX0RNQV9CVUcsCiAJVEczX0ZMQUdfVVNFX0pVTUJPX0JERkxBRywKIAlURzNfRkxBR19MMVBMTFBEX0VOLAotCVRHM19GTEFHXzU3NzY1X1BMVVMsCiAJVEczX0ZMQUdfQVBFX0hBU19OQ1NJLAotCVRHM19GTEFHXzU3MTdfUExVUywKIAlURzNfRkxBR180S19GSUZPX0xJTUlULAogCVRHM19GTEFHX1JFU0VUX1RBU0tfUEVORElORywKKwlURzNfRkxBR181NzA1X1BMVVMsCisJVEczX0ZMQUdfSVNfNTc4OCwKKwlURzNfRkxBR181NzUwX1BMVVMsCisJVEczX0ZMQUdfNTc4MF9DTEFTUywKKwlURzNfRkxBR181NzU1X1BMVVMsCisJVEczX0ZMQUdfNTc3NjVfUExVUywKKwlURzNfRkxBR181Nzc2NV9DTEFTUywKKwlURzNfRkxBR181NzE3X1BMVVMsCiAKIAkvKiBBZGQgbmV3IGZsYWdzIGJlZm9yZSB0aGlzIGNvbW1lbnQgYW5kIFRHM19GTEFHX05VTUJFUl9PRl9GTEFHUyAqLwogCVRHM19GTEFHX05VTUJFUl9PRl9GTEFHUywJLyogTGFzdCBlbnRyeSBpbiBlbnVtIFRHM19GTEFHUyAqLwpAQCAtMjk4NSw2ICszMDAzLDcgQEAKIAkvKiBiZWdpbiAidHggdGhyZWFkIiBjYWNoZWxpbmUgc2VjdGlvbiAqLwogCXZvaWQJCQkJKCp3cml0ZTMyX3R4X21ib3gpIChzdHJ1Y3QgdGczICosIHUzMiwKIAkJCQkJCQkgICAgdTMyKTsKKwl1MzIJCQkJZG1hX2xpbWl0OwogCiAJLyogYmVnaW4gInJ4IHRocmVhZCIgY2FjaGVsaW5lIHNlY3Rpb24gKi8KIAlzdHJ1Y3QgdGczX25hcGkJCQluYXBpW1RHM19JUlFfTUFYX1ZFQ1NdOwpAQCAtMzAwNSw3ICszMDI0LDYgQEAKIAl1bnNpZ25lZCBsb25nCQkJcnhfZHJvcHBlZDsKIAl1bnNpZ25lZCBsb25nCQkJdHhfZHJvcHBlZDsKIAlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQJbmV0X3N0YXRzX3ByZXY7Ci0Jc3RydWN0IHRnM19ldGh0b29sX3N0YXRzCWVzdGF0czsKIAlzdHJ1Y3QgdGczX2V0aHRvb2xfc3RhdHMJZXN0YXRzX3ByZXY7CiAKIAlERUNMQVJFX0JJVE1BUCh0ZzNfZmxhZ3MsIFRHM19GTEFHX05VTUJFUl9PRl9GTEFHUyk7CkBAIC0zMTMxLDEwICszMTQ5LDEyIEBACiAjZGVmaW5lIFRHM19QSFlGTEdfU0VSREVTX1BSRUVNUEhBU0lTCTB4MDAwMTAwMDAKICNkZWZpbmUgVEczX1BIWUZMR19QQVJBTExFTF9ERVRFQ1QJMHgwMDAyMDAwMAogI2RlZmluZSBURzNfUEhZRkxHX0VFRV9DQVAJCTB4MDAwNDAwMDAKKyNkZWZpbmUgVEczX1BIWUZMR19NRElYX1NUQVRFCQkweDAwMjAwMDAwCiAKIAl1MzIJCQkJbGVkX2N0cmw7CiAJdTMyCQkJCXBoeV9vdHA7CiAJdTMyCQkJCXNldGxwaWNudDsKKwl1OAkJCQlyc3NfaW5kX3RibFtURzNfUlNTX0lORElSX1RCTF9TSVpFXTsKIAogI2RlZmluZSBURzNfQlBOX1NJWkUJCQkyNAogCWNoYXIJCQkJYm9hcmRfcGFydF9udW1iZXJbVEczX0JQTl9TSVpFXTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvTWFrZWZpbGUKaW5kZXggNzRkM2FiYy4uNjAyNzMwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvTWFrZWZpbGUKQEAgLTUsNyArNSw3IEBACiAKIG9iai0kKENPTkZJR19CTkEpICs9IGJuYS5vCiAKLWJuYS1vYmpzIDo9IGJuYWQubyBibmFkX2V0aHRvb2wubyBibmFfZW5ldC5vIGJuYV90eF9yeC5vCitibmEtb2JqcyA6PSBibmFkLm8gYm5hZF9ldGh0b29sLm8gYm5hZF9kZWJ1Z2ZzLm8gYm5hX2VuZXQubyBibmFfdHhfcngubwogYm5hLW9ianMgKz0gYmZhX21zZ3EubyBiZmFfaW9jLm8gYmZhX2lvY19jdC5vIGJmYV9jZWUubwogYm5hLW9ianMgKz0gY25hX2Z3aW1nLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2NlZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2NlZS5jCmluZGV4IDhlNjI3MTguLjI5ZjI4NGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9jZWUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfY2VlLmMKQEAgLTE4NSw2ICsxODUsNDEgQEAKIH0KIAogLyoqCisgKiBiZmFfY2VlX2dldF9hdHRyKCkKKyAqCisgKiBAYnJpZWYJU2VuZCB0aGUgcmVxdWVzdCB0byB0aGUgZi93IHRvIGZldGNoIENFRSBhdHRyaWJ1dGVzLgorICoKKyAqIEBwYXJhbVtpbl0JUG9pbnRlciB0byB0aGUgQ0VFIG1vZHVsZSBkYXRhIHN0cnVjdHVyZS4KKyAqCisgKiBAcmV0dXJuCVN0YXR1cworICovCitlbnVtIGJmYV9zdGF0dXMKK2JmYV9ud19jZWVfZ2V0X2F0dHIoc3RydWN0IGJmYV9jZWUgKmNlZSwgc3RydWN0IGJmYV9jZWVfYXR0ciAqYXR0ciwKKwkJICAgIGJmYV9jZWVfZ2V0X2F0dHJfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKQoreworCXN0cnVjdCBiZmlfY2VlX2dldF9yZXEgKmNtZDsKKworCUJVR19PTighKChjZWUgIT0gTlVMTCkgJiYgKGNlZS0+aW9jICE9IE5VTEwpKSk7CisJaWYgKCFiZmFfbndfaW9jX2lzX29wZXJhdGlvbmFsKGNlZS0+aW9jKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX0ZBSUxVUkU7CisKKwlpZiAoY2VlLT5nZXRfYXR0cl9wZW5kaW5nID09IHRydWUpCisJCXJldHVybiAgQkZBX1NUQVRVU19ERVZCVVNZOworCisJY2VlLT5nZXRfYXR0cl9wZW5kaW5nID0gdHJ1ZTsKKwljbWQgPSAoc3RydWN0IGJmaV9jZWVfZ2V0X3JlcSAqKSBjZWUtPmdldF9jZmdfbWIubXNnOworCWNlZS0+YXR0ciA9IGF0dHI7CisJY2VlLT5jYmZuLmdldF9hdHRyX2NiZm4gPSBjYmZuOworCWNlZS0+Y2Jmbi5nZXRfYXR0cl9jYmFyZyA9IGNiYXJnOworCWJmaV9oMmlfc2V0KGNtZC0+bWgsIEJGSV9NQ19DRUUsIEJGSV9DRUVfSDJJX0dFVF9DRkdfUkVRLAorCQkgICAgYmZhX2lvY19wb3J0aWQoY2VlLT5pb2MpKTsKKwliZmFfZG1hX2JlX2FkZHJfc2V0KGNtZC0+ZG1hX2FkZHIsIGNlZS0+YXR0cl9kbWEucGEpOworCWJmYV9ud19pb2NfbWJveF9xdWV1ZShjZWUtPmlvYywgJmNlZS0+Z2V0X2NmZ19tYiwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoqCiAgKiBiZmFfY2VlX2lzcnMoKQogICoKICAqIEBicmllZiBIYW5kbGVzIE1haWwtYm94IGludGVycnVwdHMgZm9yIENFRSBtb2R1bGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfY2VlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfY2VlLmgKaW5kZXggNThkNTRlOS4uOTNmZGU2MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2NlZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9jZWUuaApAQCAtNTksNSArNTksNyBAQAogdm9pZCBiZmFfbndfY2VlX21lbV9jbGFpbShzdHJ1Y3QgYmZhX2NlZSAqY2VlLCB1OCAqZG1hX2t2YSwKIAl1NjQgZG1hX3BhKTsKIHZvaWQgYmZhX253X2NlZV9hdHRhY2goc3RydWN0IGJmYV9jZWUgKmNlZSwgc3RydWN0IGJmYV9pb2MgKmlvYywgdm9pZCAqZGV2KTsKLQorZW51bSBiZmFfc3RhdHVzIGJmYV9ud19jZWVfZ2V0X2F0dHIoc3RydWN0IGJmYV9jZWUgKmNlZSwKKwkJCQlzdHJ1Y3QgYmZhX2NlZV9hdHRyICphdHRyLAorCQkJCWJmYV9jZWVfZ2V0X2F0dHJfY2Jmbl90IGNiZm4sIHZvaWQgKmNiYXJnKTsKICNlbmRpZiAvKiBfX0JGQV9DRUVfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfZGVmcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2RlZnMuaAppbmRleCAyZjEyZDY4Li44NzFjNjMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfZGVmcy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9kZWZzLmgKQEAgLTIxOSw0MSArMjE5LDM5IEBACiAgKiBBbGwgbnVtZXJpY2FsIGZpZWxkcyBhcmUgaW4gYmlnLWVuZGlhbiBmb3JtYXQuCiAgKi8KIHN0cnVjdCBiZmFfbWZnX2Jsb2NrIHsKLQl1OAkJdmVyc2lvbjsJLyohPCBtYW51ZmFjdHVyaW5nIGJsb2NrIHZlcnNpb24gKi8KLQl1OAkJbWZnX3NpZ1szXTsJLyohPCBjaGFyYWN0ZXJzICdNJywgJ0YnLCAnRycgKi8KLQl1MTYJbWZnc2l6ZTsJLyohPCBtZmcgYmxvY2sgc2l6ZSAqLwotCXUxNgl1MTZfY2hrc3VtOwkvKiE8IG9sZCB1MTYgY2hlY2tzdW0gKi8KLQljaGFyCQlicmNkX3NlcmlhbG51bVtTVFJTWihCRkFfTUZHX1NFUklBTE5VTV9TSVpFKV07Ci0JY2hhcgkJYnJjZF9wYXJ0bnVtW1NUUlNaKEJGQV9NRkdfUEFSVE5VTV9TSVpFKV07Ci0JdTgJCW1mZ19kYXk7CS8qITwgbWFudWZhY3R1cmluZyBkYXkgKi8KLQl1OAkJbWZnX21vbnRoOwkvKiE8IG1hbnVmYWN0dXJpbmcgbW9udGggKi8KLQl1MTYJbWZnX3llYXI7CS8qITwgbWFudWZhY3R1cmluZyB5ZWFyICovCi0JdTY0CQltZmdfd3duOwkvKiE8IHd3biBiYXNlIGZvciB0aGlzIGFkYXB0ZXIgKi8KLQl1OAkJbnVtX3d3bjsJLyohPCBudW1iZXIgb2Ygd3ducyBhc3NpZ25lZCAqLwotCXU4CQltZmdfc3BlZWRzOwkvKiE8IHNwZWVkcyBhbGxvd2VkIGZvciB0aGlzIGFkYXB0ZXIgKi8KLQl1OAkJcnN2WzJdOwotCWNoYXIJCXN1cHBsaWVyX2lkW1NUUlNaKEJGQV9NRkdfU1VQUExJRVJfSURfU0laRSldOwotCWNoYXIJCXN1cHBsaWVyX3BhcnRudW1bU1RSU1ooQkZBX01GR19TVVBQTElFUl9QQVJUTlVNX1NJWkUpXTsKLQljaGFyCi0JCXN1cHBsaWVyX3NlcmlhbG51bVtTVFJTWihCRkFfTUZHX1NVUFBMSUVSX1NFUklBTE5VTV9TSVpFKV07Ci0JY2hhcgotCQlzdXBwbGllcl9yZXZpc2lvbltTVFJTWihCRkFfTUZHX1NVUFBMSUVSX1JFVklTSU9OX1NJWkUpXTsKLQltYWNfdAkJbWZnX21hYzsJLyohPCBtYWMgYWRkcmVzcyAqLwotCXU4CQludW1fbWFjOwkvKiE8IG51bWJlciBvZiBtYWMgYWRkcmVzc2VzICovCi0JdTgJCXJzdjI7Ci0JdTMyCQljYXJkX3R5cGU7CS8qITwgY2FyZCB0eXBlICovCi0JY2hhcgkJY2FwX25pYzsJLyohPCBjYXBhYmlsaXR5IG5pYyAqLwotCWNoYXIJCWNhcF9jbmE7CS8qITwgY2FwYWJpbGl0eSBjbmEgKi8KLQljaGFyCQljYXBfaGJhOwkvKiE8IGNhcGFiaWxpdHkgaGJhICovCi0JY2hhcgkJY2FwX2ZjMTZnOwkvKiE8IGNhcGFiaWxpdHkgZmMgMTZnICovCi0JY2hhcgkJY2FwX3NyaW92OwkvKiE8IGNhcGFiaWxpdHkgc3Jpb3YgKi8KLQljaGFyCQljYXBfbWV6ejsJLyohPCBjYXBhYmlsaXR5IG1lenogKi8KLQl1OAkJcnN2MzsKLQl1OAkJbWZnX25wb3J0czsJLyohPCBudW1iZXIgb2YgcG9ydHMgKi8KLQljaGFyCQltZWRpYVs4XTsJLyohPCB4ZmkveGF1aSAqLwotCWNoYXIJCWluaXRpYWxfbW9kZVs4XTsvKiE8IGluaXRpYWwgbW9kZTogaGJhL2NuYS9uaWMgKi8KLQl1OAkJcnN2NFs4NF07Ci0JdTgJCW1kNV9jaGtzdW1bQkZBX01GR19DSEtTVU1fU0laRV07IC8qITwgbWQ1IGNoZWNrc3VtICovCisJdTgJdmVyc2lvbjsJLyogbWFudWZhY3R1cmluZyBibG9jayB2ZXJzaW9uICovCisJdTgJbWZnX3NpZ1szXTsJLyogY2hhcmFjdGVycyAnTScsICdGJywgJ0cnICovCisJdTE2CW1mZ3NpemU7CS8qIG1mZyBibG9jayBzaXplICovCisJdTE2CXUxNl9jaGtzdW07CS8qIG9sZCB1MTYgY2hlY2tzdW0gKi8KKwljaGFyCWJyY2Rfc2VyaWFsbnVtW1NUUlNaKEJGQV9NRkdfU0VSSUFMTlVNX1NJWkUpXTsKKwljaGFyCWJyY2RfcGFydG51bVtTVFJTWihCRkFfTUZHX1BBUlROVU1fU0laRSldOworCXU4CW1mZ19kYXk7CS8qIG1hbnVmYWN0dXJpbmcgZGF5ICovCisJdTgJbWZnX21vbnRoOwkvKiBtYW51ZmFjdHVyaW5nIG1vbnRoICovCisJdTE2CW1mZ195ZWFyOwkvKiBtYW51ZmFjdHVyaW5nIHllYXIgKi8KKwl1NjQJbWZnX3d3bjsJLyogd3duIGJhc2UgZm9yIHRoaXMgYWRhcHRlciAqLworCXU4CW51bV93d247CS8qIG51bWJlciBvZiB3d25zIGFzc2lnbmVkICovCisJdTgJbWZnX3NwZWVkczsJLyogc3BlZWRzIGFsbG93ZWQgZm9yIHRoaXMgYWRhcHRlciAqLworCXU4CXJzdlsyXTsKKwljaGFyCXN1cHBsaWVyX2lkW1NUUlNaKEJGQV9NRkdfU1VQUExJRVJfSURfU0laRSldOworCWNoYXIJc3VwcGxpZXJfcGFydG51bVtTVFJTWihCRkFfTUZHX1NVUFBMSUVSX1BBUlROVU1fU0laRSldOworCWNoYXIJc3VwcGxpZXJfc2VyaWFsbnVtW1NUUlNaKEJGQV9NRkdfU1VQUExJRVJfU0VSSUFMTlVNX1NJWkUpXTsKKwljaGFyCXN1cHBsaWVyX3JldmlzaW9uW1NUUlNaKEJGQV9NRkdfU1VQUExJRVJfUkVWSVNJT05fU0laRSldOworCW1hY190CW1mZ19tYWM7CS8qIGJhc2UgbWFjIGFkZHJlc3MgKi8KKwl1OAludW1fbWFjOwkvKiBudW1iZXIgb2YgbWFjIGFkZHJlc3NlcyAqLworCXU4CXJzdjI7CisJdTMyCWNhcmRfdHlwZTsJLyogY2FyZCB0eXBlICAgICAgICAgICovCisJY2hhcgljYXBfbmljOwkvKiBjYXBhYmlsaXR5IG5pYyAgICAgKi8KKwljaGFyCWNhcF9jbmE7CS8qIGNhcGFiaWxpdHkgY25hICAgICAqLworCWNoYXIJY2FwX2hiYTsJLyogY2FwYWJpbGl0eSBoYmEgICAgICovCisJY2hhcgljYXBfZmMxNmc7CS8qIGNhcGFiaWxpdHkgZmMgMTZnICAgICAgKi8KKwljaGFyCWNhcF9zcmlvdjsJLyogY2FwYWJpbGl0eSBzcmlvdiAgICAgICAqLworCWNoYXIJY2FwX21leno7CS8qIGNhcGFiaWxpdHkgbWV6eiAgICAgICAgKi8KKwl1OAlyc3YzOworCXU4CW1mZ19ucG9ydHM7CS8qIG51bWJlciBvZiBwb3J0cyAgICAgICAgKi8KKwljaGFyCW1lZGlhWzhdOwkvKiB4ZmkveGF1aSAgICAgICAgICAgKi8KKwljaGFyCWluaXRpYWxfbW9kZVs4XTsgLyogaW5pdGlhbCBtb2RlOiBoYmEvY25hL25pYyAqLworCXU4CXJzdjRbODRdOworCXU4CW1kNV9jaGtzdW1bQkZBX01GR19DSEtTVU1fU0laRV07IC8qIG1kNSBjaGVja3N1bSAqLwogfTsKIAogI3ByYWdtYSBwYWNrKCkKQEAgLTI5Myw0ICsyOTEsMzQgQEAKIAlCRkFfTU9ERV9OSUMJCT0gMwogfTsKIAorLyoKKyAqCUZsYXNoIG1vZHVsZSBzcGVjaWZpYworICovCisjZGVmaW5lIEJGQV9GTEFTSF9QQVJUX0VOVFJZX1NJWkUJMzIJLyogcGFydGl0aW9uIGVudHJ5IHNpemUgKi8KKyNkZWZpbmUgQkZBX0ZMQVNIX1BBUlRfTUFYCQkzMgkvKiBtYXhpbWFsICMgb2YgcGFydGl0aW9ucyAqLworI2RlZmluZSBCRkFfVE9UQUxfRkxBU0hfU0laRQkJMHg0MDAwMDAKKyNkZWZpbmUgQkZBX0ZMQVNIX1BBUlRfTUZHCQk3CisKKy8qCisgKiBmbGFzaCBwYXJ0aXRpb24gYXR0cmlidXRlcworICovCitzdHJ1Y3QgYmZhX2ZsYXNoX3BhcnRfYXR0ciB7CisJdTMyCXBhcnRfdHlwZTsJLyogcGFydGl0aW9uIHR5cGUgKi8KKwl1MzIJcGFydF9pbnN0YW5jZTsJLyogcGFydGl0aW9uIGluc3RhbmNlICovCisJdTMyCXBhcnRfb2ZmOwkvKiBwYXJ0aXRpb24gb2Zmc2V0ICovCisJdTMyCXBhcnRfc2l6ZTsJLyogcGFydGl0aW9uIHNpemUgKi8KKwl1MzIJcGFydF9sZW47CS8qIHBhcnRpdGlvbiBjb250ZW50IGxlbmd0aCAqLworCXUzMglwYXJ0X3N0YXR1czsJLyogcGFydGl0aW9uIHN0YXR1cyAqLworCWNoYXIJcnN2W0JGQV9GTEFTSF9QQVJUX0VOVFJZX1NJWkUgLSAyNF07Cit9OworCisvKgorICogZmxhc2ggYXR0cmlidXRlcworICovCitzdHJ1Y3QgYmZhX2ZsYXNoX2F0dHIgeworCXUzMglzdGF0dXM7CS8qIGZsYXNoIG92ZXJhbGwgc3RhdHVzICovCisJdTMyCW5wYXJ0OyAgLyogbnVtIG9mIHBhcnRpdGlvbnMgKi8KKwlzdHJ1Y3QgYmZhX2ZsYXNoX3BhcnRfYXR0ciBwYXJ0W0JGQV9GTEFTSF9QQVJUX01BWF07Cit9OworCiAjZW5kaWYgLyogX19CRkFfREVGU19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9pb2MuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9pb2MuYwppbmRleCBiMDMwN2EwLi5hYmZhZDI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfaW9jLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2lvYy5jCkBAIC03NCw2ICs3NCw3IEBACiBzdGF0aWMgdm9pZCBiZmFfaW9jX2V2ZW50X25vdGlmeShzdHJ1Y3QgYmZhX2lvYyAqLCBlbnVtIGJmYV9pb2NfZXZlbnQpOwogc3RhdGljIHZvaWQgYmZhX2lvY19kaXNhYmxlX2NvbXAoc3RydWN0IGJmYV9pb2MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2xwdV9zdG9wKHN0cnVjdCBiZmFfaW9jICppb2MpOworc3RhdGljIHZvaWQgYmZhX253X2lvY19kZWJ1Z19zYXZlX2Z0cmMoc3RydWN0IGJmYV9pb2MgKmlvYyk7CiBzdGF0aWMgdm9pZCBiZmFfaW9jX2ZhaWxfbm90aWZ5KHN0cnVjdCBiZmFfaW9jICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19wZl9lbmFibGVkKHN0cnVjdCBiZmFfaW9jICppb2MpOwogc3RhdGljIHZvaWQgYmZhX2lvY19wZl9kaXNhYmxlZChzdHJ1Y3QgYmZhX2lvYyAqaW9jKTsKQEAgLTk5Nyw2ICs5OTgsNyBAQAogc3RhdGljIHZvaWQKIGJmYV9pb2NwZl9zbV9pbml0ZmFpbF9zeW5jX2VudHJ5KHN0cnVjdCBiZmFfaW9jcGYgKmlvY3BmKQogeworCWJmYV9ud19pb2NfZGVidWdfc2F2ZV9mdHJjKGlvY3BmLT5pb2MpOwogCWJmYV9pb2NfaHdfc2VtX2dldChpb2NwZi0+aW9jKTsKIH0KIApAQCAtMTc0Myw2ICsxNzQ1LDExNCBAQAogCQliZmFfcV9kZXEoJm1vZC0+Y21kX3EsICZjbWQpOwogfQogCisvKioKKyAqIFJlYWQgZGF0YSBmcm9tIFNNRU0gdG8gaG9zdCB0aHJvdWdoIFBDSSBtZW1tYXAKKyAqCisgKiBAcGFyYW1baW5dICBpb2MgICAgIG1lbW9yeSBmb3IgSU9DCisgKiBAcGFyYW1baW5dICB0YnVmICAgIGFwcCBtZW1vcnkgdG8gc3RvcmUgZGF0YSBmcm9tIHNtZW0KKyAqIEBwYXJhbVtpbl0gIHNvZmYgICAgc21lbSBvZmZzZXQKKyAqIEBwYXJhbVtpbl0gIHN6ICAgICAgc2l6ZSBvZiBzbWVtIGluIGJ5dGVzCisgKi8KK3N0YXRpYyBpbnQKK2JmYV9ud19pb2Nfc21lbV9yZWFkKHN0cnVjdCBiZmFfaW9jICppb2MsIHZvaWQgKnRidWYsIHUzMiBzb2ZmLCB1MzIgc3opCit7CisJdTMyIHBnbnVtLCBsb2ZmLCByMzI7CisJaW50IGksIGxlbjsKKwl1MzIgKmJ1ZiA9IHRidWY7CisKKwlwZ251bSA9IFBTU19TTUVNX1BHTlVNKGlvYy0+aW9jX3JlZ3Muc21lbV9wZzAsIHNvZmYpOworCWxvZmYgPSBQU1NfU01FTV9QR09GRihzb2ZmKTsKKworCS8qCisJICogIEhvbGQgc2VtYXBob3JlIHRvIHNlcmlhbGl6ZSBwbGwgaW5pdCBhbmQgZnd0cmMuCisJKi8KKwlpZiAoYmZhX253X2lvY19zZW1fZ2V0KGlvYy0+aW9jX3JlZ3MuaW9jX2luaXRfc2VtX3JlZykgPT0gMCkKKwkJcmV0dXJuIDE7CisKKwl3cml0ZWwocGdudW0sIGlvYy0+aW9jX3JlZ3MuaG9zdF9wYWdlX251bV9mbik7CisKKwlsZW4gPSBzei9zaXplb2YodTMyKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJcjMyID0gc3dhYjMyKHJlYWRsKChsb2ZmKSArIChpb2MtPmlvY19yZWdzLnNtZW1fcGFnZV9zdGFydCkpKTsKKwkJYnVmW2ldID0gYmUzMl90b19jcHUocjMyKTsKKwkJbG9mZiArPSBzaXplb2YodTMyKTsKKworCQkvKioKKwkJICogaGFuZGxlIHBhZ2Ugb2Zmc2V0IHdyYXAgYXJvdW5kCisJCSAqLworCQlsb2ZmID0gUFNTX1NNRU1fUEdPRkYobG9mZik7CisJCWlmIChsb2ZmID09IDApIHsKKwkJCXBnbnVtKys7CisJCQl3cml0ZWwocGdudW0sIGlvYy0+aW9jX3JlZ3MuaG9zdF9wYWdlX251bV9mbik7CisJCX0KKwl9CisKKwl3cml0ZWwoUFNTX1NNRU1fUEdOVU0oaW9jLT5pb2NfcmVncy5zbWVtX3BnMCwgMCksCisJICAgICAgIGlvYy0+aW9jX3JlZ3MuaG9zdF9wYWdlX251bV9mbik7CisKKwkvKgorCSAqIHJlbGVhc2Ugc2VtYXBob3JlCisJICovCisJcmVhZGwoaW9jLT5pb2NfcmVncy5pb2NfaW5pdF9zZW1fcmVnKTsKKwl3cml0ZWwoMSwgaW9jLT5pb2NfcmVncy5pb2NfaW5pdF9zZW1fcmVnKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBSZXRyaWV2ZSBzYXZlZCBmaXJtd2FyZSB0cmFjZSBmcm9tIGEgcHJpb3IgSU9DIGZhaWx1cmUuCisgKi8KK2ludAorYmZhX253X2lvY19kZWJ1Z19md3RyYyhzdHJ1Y3QgYmZhX2lvYyAqaW9jLCB2b2lkICp0cmNkYXRhLCBpbnQgKnRyY2xlbikKK3sKKwl1MzIgbG9mZiA9IEJGSV9JT0NfVFJDX09GRiArIEJOQV9EQkdfRldUUkNfTEVOICogaW9jLT5wb3J0X2lkOworCWludCB0bGVuLCBzdGF0dXMgPSAwOworCisJdGxlbiA9ICp0cmNsZW47CisJaWYgKHRsZW4gPiBCTkFfREJHX0ZXVFJDX0xFTikKKwkJdGxlbiA9IEJOQV9EQkdfRldUUkNfTEVOOworCisJc3RhdHVzID0gYmZhX253X2lvY19zbWVtX3JlYWQoaW9jLCB0cmNkYXRhLCBsb2ZmLCB0bGVuKTsKKwkqdHJjbGVuID0gdGxlbjsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFNhdmUgZmlybXdhcmUgdHJhY2UgaWYgY29uZmlndXJlZC4KKyAqLworc3RhdGljIHZvaWQKK2JmYV9ud19pb2NfZGVidWdfc2F2ZV9mdHJjKHN0cnVjdCBiZmFfaW9jICppb2MpCit7CisJaW50IHRsZW47CisKKwlpZiAoaW9jLT5kYmdfZndzYXZlX29uY2UpIHsKKwkJaW9jLT5kYmdfZndzYXZlX29uY2UgPSAwOworCQlpZiAoaW9jLT5kYmdfZndzYXZlX2xlbikgeworCQkJdGxlbiA9IGlvYy0+ZGJnX2Z3c2F2ZV9sZW47CisJCQliZmFfbndfaW9jX2RlYnVnX2Z3dHJjKGlvYywgaW9jLT5kYmdfZndzYXZlLCAmdGxlbik7CisJCX0KKwl9Cit9CisKKy8qKgorICogUmV0cmlldmUgc2F2ZWQgZmlybXdhcmUgdHJhY2UgZnJvbSBhIHByaW9yIElPQyBmYWlsdXJlLgorICovCitpbnQKK2JmYV9ud19pb2NfZGVidWdfZndzYXZlKHN0cnVjdCBiZmFfaW9jICppb2MsIHZvaWQgKnRyY2RhdGEsIGludCAqdHJjbGVuKQoreworCWludCB0bGVuOworCisJaWYgKGlvYy0+ZGJnX2Z3c2F2ZV9sZW4gPT0gMCkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRU5PRlNBVkU7CisKKwl0bGVuID0gKnRyY2xlbjsKKwlpZiAodGxlbiA+IGlvYy0+ZGJnX2Z3c2F2ZV9sZW4pCisJCXRsZW4gPSBpb2MtPmRiZ19md3NhdmVfbGVuOworCisJbWVtY3B5KHRyY2RhdGEsIGlvYy0+ZGJnX2Z3c2F2ZSwgdGxlbik7CisJKnRyY2xlbiA9IHRsZW47CisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CisKIHN0YXRpYyB2b2lkCiBiZmFfaW9jX2ZhaWxfbm90aWZ5KHN0cnVjdCBiZmFfaW9jICppb2MpCiB7CkBAIC0xNzUxLDYgKzE4NjEsNyBAQAogCSAqLwogCWlvYy0+Y2Jmbi0+aGJmYWlsX2NiZm4oaW9jLT5iZmEpOwogCWJmYV9pb2NfZXZlbnRfbm90aWZ5KGlvYywgQkZBX0lPQ19FX0ZBSUxFRCk7CisJYmZhX253X2lvY19kZWJ1Z19zYXZlX2Z0cmMoaW9jKTsKIH0KIAogLyoqCkBAIC0yMDU4LDYgKzIxNjksMTYgQEAKIAliZmFfZnNtX3NlbmRfZXZlbnQoaW9jLCBJT0NfRV9ESVNBQkxFKTsKIH0KIAorLyoqCisgKiBJbml0aWFsaXplIG1lbW9yeSBmb3Igc2F2aW5nIGZpcm13YXJlIHRyYWNlLgorICovCit2b2lkCitiZmFfbndfaW9jX2RlYnVnX21lbWNsYWltKHN0cnVjdCBiZmFfaW9jICppb2MsIHZvaWQgKmRiZ19md3NhdmUpCit7CisJaW9jLT5kYmdfZndzYXZlID0gZGJnX2Z3c2F2ZTsKKwlpb2MtPmRiZ19md3NhdmVfbGVuID0gaW9jLT5pb2NwZi5hdXRvX3JlY292ZXIgPyBCTkFfREJHX0ZXVFJDX0xFTiA6IDA7Cit9CisKIHN0YXRpYyB1MzIKIGJmYV9pb2Nfc21lbV9wZ251bShzdHJ1Y3QgYmZhX2lvYyAqaW9jLCB1MzIgZm1hZGRyKQogewpAQCAtMjE3Miw2ICsyMjkzLDE1IEBACiB9CiAKIC8qKgorICogcmV0dXJuIHRydWUgaWYgSU9DIGlzIG9wZXJhdGlvbmFsCisgKi8KK2Jvb2wKK2JmYV9ud19pb2NfaXNfb3BlcmF0aW9uYWwoc3RydWN0IGJmYV9pb2MgKmlvYykKK3sKKwlyZXR1cm4gYmZhX2ZzbV9jbXBfc3RhdGUoaW9jLCBiZmFfaW9jX3NtX29wKTsKK30KKworLyoqCiAgKiBBZGQgdG8gSU9DIGhlYXJ0YmVhdCBmYWlsdXJlIG5vdGlmaWNhdGlvbiBxdWV1ZS4gVG8gYmUgdXNlZCBieSBjb21tb24KICAqIG1vZHVsZXMgc3VjaCBhcyBjZWUsIHBvcnQsIGRpYWcuCiAgKi8KQEAgLTI0NzEsMyArMjYwMSwzNjYgQEAKIAkJCW1zZWNzX3RvX2ppZmZpZXMoQkZBX0lPQ19QT0xMX1RPVikpOwogCX0KIH0KKworLyoKKyAqCUZsYXNoIG1vZHVsZSBzcGVjaWZpYworICovCisKKy8qCisgKiBGTEFTSCBETUEgYnVmZmVyIHNob3VsZCBiZSBiaWcgZW5vdWdoIHRvIGhvbGQgYm90aCBNRkcgYmxvY2sgYW5kCisgKiBhc2ljIGJsb2NrKDY0aykgYXQgdGhlIHNhbWUgdGltZSBhbmQgYWxzbyBzaG91bGQgYmUgMmsgYWxpZ25lZCB0bworICogYXZvaWQgd3JpdGUgc2VnZW1lbnQgdG8gY3Jvc3Mgc2VjdG9yIGJvdW5kYXJ5LgorICovCisjZGVmaW5lIEJGQV9GTEFTSF9TRUdfU1oJMjA0OAorI2RlZmluZSBCRkFfRkxBU0hfRE1BX0JVRl9TWglcCisJcm91bmR1cCgweDAxMDAwMCArIHNpemVvZihzdHJ1Y3QgYmZhX21mZ19ibG9jayksIEJGQV9GTEFTSF9TRUdfU1opCisKK3N0YXRpYyB2b2lkCitiZmFfZmxhc2hfY2Ioc3RydWN0IGJmYV9mbGFzaCAqZmxhc2gpCit7CisJZmxhc2gtPm9wX2J1c3kgPSAwOworCWlmIChmbGFzaC0+Y2JmbikKKwkJZmxhc2gtPmNiZm4oZmxhc2gtPmNiYXJnLCBmbGFzaC0+c3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQKK2JmYV9mbGFzaF9ub3RpZnkodm9pZCAqY2JhcmcsIGVudW0gYmZhX2lvY19ldmVudCBldmVudCkKK3sKKwlzdHJ1Y3QgYmZhX2ZsYXNoICpmbGFzaCA9IGNiYXJnOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgQkZBX0lPQ19FX0RJU0FCTEVEOgorCWNhc2UgQkZBX0lPQ19FX0ZBSUxFRDoKKwkJaWYgKGZsYXNoLT5vcF9idXN5KSB7CisJCQlmbGFzaC0+c3RhdHVzID0gQkZBX1NUQVRVU19JT0NfRkFJTFVSRTsKKwkJCWZsYXNoLT5jYmZuKGZsYXNoLT5jYmFyZywgZmxhc2gtPnN0YXR1cyk7CisJCQlmbGFzaC0+b3BfYnVzeSA9IDA7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogU2VuZCBmbGFzaCB3cml0ZSByZXF1ZXN0LgorICoKKyAqIEBwYXJhbVtpbl0gY2JhcmcgLSBjYWxsYmFjayBhcmd1bWVudAorICovCitzdGF0aWMgdm9pZAorYmZhX2ZsYXNoX3dyaXRlX3NlbmQoc3RydWN0IGJmYV9mbGFzaCAqZmxhc2gpCit7CisJc3RydWN0IGJmaV9mbGFzaF93cml0ZV9yZXEgKm1zZyA9CisJCQkoc3RydWN0IGJmaV9mbGFzaF93cml0ZV9yZXEgKikgZmxhc2gtPm1iLm1zZzsKKwl1MzIJbGVuOworCisJbXNnLT50eXBlID0gYmUzMl90b19jcHUoZmxhc2gtPnR5cGUpOworCW1zZy0+aW5zdGFuY2UgPSBmbGFzaC0+aW5zdGFuY2U7CisJbXNnLT5vZmZzZXQgPSBiZTMyX3RvX2NwdShmbGFzaC0+YWRkcl9vZmYgKyBmbGFzaC0+b2Zmc2V0KTsKKwlsZW4gPSAoZmxhc2gtPnJlc2lkdWUgPCBCRkFfRkxBU0hfRE1BX0JVRl9TWikgPworCSAgICAgICBmbGFzaC0+cmVzaWR1ZSA6IEJGQV9GTEFTSF9ETUFfQlVGX1NaOworCW1zZy0+bGVuZ3RoID0gYmUzMl90b19jcHUobGVuKTsKKworCS8qIGluZGljYXRlIGlmIGl0J3MgdGhlIGxhc3QgbXNnIG9mIHRoZSB3aG9sZSB3cml0ZSBvcGVyYXRpb24gKi8KKwltc2ctPmxhc3QgPSAobGVuID09IGZsYXNoLT5yZXNpZHVlKSA/IDEgOiAwOworCisJYmZpX2gyaV9zZXQobXNnLT5taCwgQkZJX01DX0ZMQVNILCBCRklfRkxBU0hfSDJJX1dSSVRFX1JFUSwKKwkJICAgIGJmYV9pb2NfcG9ydGlkKGZsYXNoLT5pb2MpKTsKKwliZmFfYWxlbl9zZXQoJm1zZy0+YWxlbiwgbGVuLCBmbGFzaC0+ZGJ1Zl9wYSk7CisJbWVtY3B5KGZsYXNoLT5kYnVmX2t2YSwgZmxhc2gtPnVidWYgKyBmbGFzaC0+b2Zmc2V0LCBsZW4pOworCWJmYV9ud19pb2NfbWJveF9xdWV1ZShmbGFzaC0+aW9jLCAmZmxhc2gtPm1iLCBOVUxMLCBOVUxMKTsKKworCWZsYXNoLT5yZXNpZHVlIC09IGxlbjsKKwlmbGFzaC0+b2Zmc2V0ICs9IGxlbjsKK30KKworLyoKKyAqIFNlbmQgZmxhc2ggcmVhZCByZXF1ZXN0LgorICoKKyAqIEBwYXJhbVtpbl0gY2JhcmcgLSBjYWxsYmFjayBhcmd1bWVudAorICovCitzdGF0aWMgdm9pZAorYmZhX2ZsYXNoX3JlYWRfc2VuZCh2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZhX2ZsYXNoICpmbGFzaCA9IGNiYXJnOworCXN0cnVjdCBiZmlfZmxhc2hfcmVhZF9yZXEgKm1zZyA9CisJCQkoc3RydWN0IGJmaV9mbGFzaF9yZWFkX3JlcSAqKSBmbGFzaC0+bWIubXNnOworCXUzMglsZW47CisKKwltc2ctPnR5cGUgPSBiZTMyX3RvX2NwdShmbGFzaC0+dHlwZSk7CisJbXNnLT5pbnN0YW5jZSA9IGZsYXNoLT5pbnN0YW5jZTsKKwltc2ctPm9mZnNldCA9IGJlMzJfdG9fY3B1KGZsYXNoLT5hZGRyX29mZiArIGZsYXNoLT5vZmZzZXQpOworCWxlbiA9IChmbGFzaC0+cmVzaWR1ZSA8IEJGQV9GTEFTSF9ETUFfQlVGX1NaKSA/CisJICAgICAgIGZsYXNoLT5yZXNpZHVlIDogQkZBX0ZMQVNIX0RNQV9CVUZfU1o7CisJbXNnLT5sZW5ndGggPSBiZTMyX3RvX2NwdShsZW4pOworCWJmaV9oMmlfc2V0KG1zZy0+bWgsIEJGSV9NQ19GTEFTSCwgQkZJX0ZMQVNIX0gySV9SRUFEX1JFUSwKKwkJICAgIGJmYV9pb2NfcG9ydGlkKGZsYXNoLT5pb2MpKTsKKwliZmFfYWxlbl9zZXQoJm1zZy0+YWxlbiwgbGVuLCBmbGFzaC0+ZGJ1Zl9wYSk7CisJYmZhX253X2lvY19tYm94X3F1ZXVlKGZsYXNoLT5pb2MsICZmbGFzaC0+bWIsIE5VTEwsIE5VTEwpOworfQorCisvKgorICogUHJvY2VzcyBmbGFzaCByZXNwb25zZSBtZXNzYWdlcyB1cG9uIHJlY2VpdmluZyBpbnRlcnJ1cHRzLgorICoKKyAqIEBwYXJhbVtpbl0gZmxhc2hhcmcgLSBmbGFzaCBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gbXNnIC0gbWVzc2FnZSBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHZvaWQKK2JmYV9mbGFzaF9pbnRyKHZvaWQgKmZsYXNoYXJnLCBzdHJ1Y3QgYmZpX21ibXNnICptc2cpCit7CisJc3RydWN0IGJmYV9mbGFzaCAqZmxhc2ggPSBmbGFzaGFyZzsKKwl1MzIJc3RhdHVzOworCisJdW5pb24geworCQlzdHJ1Y3QgYmZpX2ZsYXNoX3F1ZXJ5X3JzcCAqcXVlcnk7CisJCXN0cnVjdCBiZmlfZmxhc2hfd3JpdGVfcnNwICp3cml0ZTsKKwkJc3RydWN0IGJmaV9mbGFzaF9yZWFkX3JzcCAqcmVhZDsKKwkJc3RydWN0IGJmaV9tYm1zZyAgICptc2c7CisJfSBtOworCisJbS5tc2cgPSBtc2c7CisKKwkvKiByZWNlaXZpbmcgcmVzcG9uc2UgYWZ0ZXIgaW9jIGZhaWx1cmUgKi8KKwlpZiAoIWZsYXNoLT5vcF9idXN5ICYmIG1zZy0+bWgubXNnX2lkICE9IEJGSV9GTEFTSF9JMkhfRVZFTlQpCisJCXJldHVybjsKKworCXN3aXRjaCAobXNnLT5taC5tc2dfaWQpIHsKKwljYXNlIEJGSV9GTEFTSF9JMkhfUVVFUllfUlNQOgorCQlzdGF0dXMgPSBiZTMyX3RvX2NwdShtLnF1ZXJ5LT5zdGF0dXMpOworCQlpZiAoc3RhdHVzID09IEJGQV9TVEFUVVNfT0spIHsKKwkJCXUzMglpOworCQkJc3RydWN0IGJmYV9mbGFzaF9hdHRyICphdHRyLCAqZjsKKworCQkJYXR0ciA9IChzdHJ1Y3QgYmZhX2ZsYXNoX2F0dHIgKikgZmxhc2gtPnVidWY7CisJCQlmID0gKHN0cnVjdCBiZmFfZmxhc2hfYXR0ciAqKSBmbGFzaC0+ZGJ1Zl9rdmE7CisJCQlhdHRyLT5zdGF0dXMgPSBiZTMyX3RvX2NwdShmLT5zdGF0dXMpOworCQkJYXR0ci0+bnBhcnQgPSBiZTMyX3RvX2NwdShmLT5ucGFydCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgYXR0ci0+bnBhcnQ7IGkrKykgeworCQkJCWF0dHItPnBhcnRbaV0ucGFydF90eXBlID0KKwkJCQkJYmUzMl90b19jcHUoZi0+cGFydFtpXS5wYXJ0X3R5cGUpOworCQkJCWF0dHItPnBhcnRbaV0ucGFydF9pbnN0YW5jZSA9CisJCQkJCWJlMzJfdG9fY3B1KGYtPnBhcnRbaV0ucGFydF9pbnN0YW5jZSk7CisJCQkJYXR0ci0+cGFydFtpXS5wYXJ0X29mZiA9CisJCQkJCWJlMzJfdG9fY3B1KGYtPnBhcnRbaV0ucGFydF9vZmYpOworCQkJCWF0dHItPnBhcnRbaV0ucGFydF9zaXplID0KKwkJCQkJYmUzMl90b19jcHUoZi0+cGFydFtpXS5wYXJ0X3NpemUpOworCQkJCWF0dHItPnBhcnRbaV0ucGFydF9sZW4gPQorCQkJCQliZTMyX3RvX2NwdShmLT5wYXJ0W2ldLnBhcnRfbGVuKTsKKwkJCQlhdHRyLT5wYXJ0W2ldLnBhcnRfc3RhdHVzID0KKwkJCQkJYmUzMl90b19jcHUoZi0+cGFydFtpXS5wYXJ0X3N0YXR1cyk7CisJCQl9CisJCX0KKwkJZmxhc2gtPnN0YXR1cyA9IHN0YXR1czsKKwkJYmZhX2ZsYXNoX2NiKGZsYXNoKTsKKwkJYnJlYWs7CisJY2FzZSBCRklfRkxBU0hfSTJIX1dSSVRFX1JTUDoKKwkJc3RhdHVzID0gYmUzMl90b19jcHUobS53cml0ZS0+c3RhdHVzKTsKKwkJaWYgKHN0YXR1cyAhPSBCRkFfU1RBVFVTX09LIHx8IGZsYXNoLT5yZXNpZHVlID09IDApIHsKKwkJCWZsYXNoLT5zdGF0dXMgPSBzdGF0dXM7CisJCQliZmFfZmxhc2hfY2IoZmxhc2gpOworCQl9IGVsc2UKKwkJCWJmYV9mbGFzaF93cml0ZV9zZW5kKGZsYXNoKTsKKwkJYnJlYWs7CisJY2FzZSBCRklfRkxBU0hfSTJIX1JFQURfUlNQOgorCQlzdGF0dXMgPSBiZTMyX3RvX2NwdShtLnJlYWQtPnN0YXR1cyk7CisJCWlmIChzdGF0dXMgIT0gQkZBX1NUQVRVU19PSykgeworCQkJZmxhc2gtPnN0YXR1cyA9IHN0YXR1czsKKwkJCWJmYV9mbGFzaF9jYihmbGFzaCk7CisJCX0gZWxzZSB7CisJCQl1MzIgbGVuID0gYmUzMl90b19jcHUobS5yZWFkLT5sZW5ndGgpOworCQkJbWVtY3B5KGZsYXNoLT51YnVmICsgZmxhc2gtPm9mZnNldCwKKwkJCSAgICAgICBmbGFzaC0+ZGJ1Zl9rdmEsIGxlbik7CisJCQlmbGFzaC0+cmVzaWR1ZSAtPSBsZW47CisJCQlmbGFzaC0+b2Zmc2V0ICs9IGxlbjsKKwkJCWlmIChmbGFzaC0+cmVzaWR1ZSA9PSAwKSB7CisJCQkJZmxhc2gtPnN0YXR1cyA9IHN0YXR1czsKKwkJCQliZmFfZmxhc2hfY2IoZmxhc2gpOworCQkJfSBlbHNlCisJCQkJYmZhX2ZsYXNoX3JlYWRfc2VuZChmbGFzaCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCRklfRkxBU0hfSTJIX0JPT1RfVkVSX1JTUDoKKwljYXNlIEJGSV9GTEFTSF9JMkhfRVZFTlQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJfQorfQorCisvKgorICogRmxhc2ggbWVtb3J5IGluZm8gQVBJLgorICovCit1MzIKK2JmYV9ud19mbGFzaF9tZW1pbmZvKHZvaWQpCit7CisJcmV0dXJuIHJvdW5kdXAoQkZBX0ZMQVNIX0RNQV9CVUZfU1osIEJGQV9ETUFfQUxJR05fU1opOworfQorCisvKgorICogRmxhc2ggYXR0YWNoIEFQSS4KKyAqCisgKiBAcGFyYW1baW5dIGZsYXNoIC0gZmxhc2ggc3RydWN0dXJlCisgKiBAcGFyYW1baW5dIGlvYyAgLSBpb2Mgc3RydWN0dXJlCisgKiBAcGFyYW1baW5dIGRldiAgLSBkZXZpY2Ugc3RydWN0dXJlCisgKi8KK3ZvaWQKK2JmYV9ud19mbGFzaF9hdHRhY2goc3RydWN0IGJmYV9mbGFzaCAqZmxhc2gsIHN0cnVjdCBiZmFfaW9jICppb2MsIHZvaWQgKmRldikKK3sKKwlmbGFzaC0+aW9jID0gaW9jOworCWZsYXNoLT5jYmZuID0gTlVMTDsKKwlmbGFzaC0+Y2JhcmcgPSBOVUxMOworCWZsYXNoLT5vcF9idXN5ID0gMDsKKworCWJmYV9ud19pb2NfbWJveF9yZWdpc3IoZmxhc2gtPmlvYywgQkZJX01DX0ZMQVNILCBiZmFfZmxhc2hfaW50ciwgZmxhc2gpOworCWJmYV9xX3FlX2luaXQoJmZsYXNoLT5pb2Nfbm90aWZ5KTsKKwliZmFfaW9jX25vdGlmeV9pbml0KCZmbGFzaC0+aW9jX25vdGlmeSwgYmZhX2ZsYXNoX25vdGlmeSwgZmxhc2gpOworCWxpc3RfYWRkX3RhaWwoJmZsYXNoLT5pb2Nfbm90aWZ5LnFlLCAmZmxhc2gtPmlvYy0+bm90aWZ5X3EpOworfQorCisvKgorICogQ2xhaW0gbWVtb3J5IGZvciBmbGFzaAorICoKKyAqIEBwYXJhbVtpbl0gZmxhc2ggLSBmbGFzaCBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gZG1fa3ZhIC0gcG9pbnRlciB0byB2aXJ0dWFsIG1lbW9yeSBhZGRyZXNzCisgKiBAcGFyYW1baW5dIGRtX3BhIC0gcGh5c2ljYWwgbWVtb3J5IGFkZHJlc3MKKyAqLwordm9pZAorYmZhX253X2ZsYXNoX21lbWNsYWltKHN0cnVjdCBiZmFfZmxhc2ggKmZsYXNoLCB1OCAqZG1fa3ZhLCB1NjQgZG1fcGEpCit7CisJZmxhc2gtPmRidWZfa3ZhID0gZG1fa3ZhOworCWZsYXNoLT5kYnVmX3BhID0gZG1fcGE7CisJbWVtc2V0KGZsYXNoLT5kYnVmX2t2YSwgMCwgQkZBX0ZMQVNIX0RNQV9CVUZfU1opOworCWRtX2t2YSArPSByb3VuZHVwKEJGQV9GTEFTSF9ETUFfQlVGX1NaLCBCRkFfRE1BX0FMSUdOX1NaKTsKKwlkbV9wYSArPSByb3VuZHVwKEJGQV9GTEFTSF9ETUFfQlVGX1NaLCBCRkFfRE1BX0FMSUdOX1NaKTsKK30KKworLyoKKyAqIEdldCBmbGFzaCBhdHRyaWJ1dGUuCisgKgorICogQHBhcmFtW2luXSBmbGFzaCAtIGZsYXNoIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSBhdHRyIC0gZmxhc2ggYXR0cmlidXRlIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSBjYmZuIC0gY2FsbGJhY2sgZnVuY3Rpb24KKyAqIEBwYXJhbVtpbl0gY2JhcmcgLSBjYWxsYmFjayBhcmd1bWVudAorICoKKyAqIFJldHVybiBzdGF0dXMuCisgKi8KK2VudW0gYmZhX3N0YXR1cworYmZhX253X2ZsYXNoX2dldF9hdHRyKHN0cnVjdCBiZmFfZmxhc2ggKmZsYXNoLCBzdHJ1Y3QgYmZhX2ZsYXNoX2F0dHIgKmF0dHIsCisJCSAgICAgIGJmYV9jYl9mbGFzaCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwlzdHJ1Y3QgYmZpX2ZsYXNoX3F1ZXJ5X3JlcSAqbXNnID0KKwkJCShzdHJ1Y3QgYmZpX2ZsYXNoX3F1ZXJ5X3JlcSAqKSBmbGFzaC0+bWIubXNnOworCisJaWYgKCFiZmFfbndfaW9jX2lzX29wZXJhdGlvbmFsKGZsYXNoLT5pb2MpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19JT0NfTk9OX09QOworCisJaWYgKGZsYXNoLT5vcF9idXN5KQorCQlyZXR1cm4gQkZBX1NUQVRVU19ERVZCVVNZOworCisJZmxhc2gtPm9wX2J1c3kgPSAxOworCWZsYXNoLT5jYmZuID0gY2JmbjsKKwlmbGFzaC0+Y2JhcmcgPSBjYmFyZzsKKwlmbGFzaC0+dWJ1ZiA9ICh1OCAqKSBhdHRyOworCisJYmZpX2gyaV9zZXQobXNnLT5taCwgQkZJX01DX0ZMQVNILCBCRklfRkxBU0hfSDJJX1FVRVJZX1JFUSwKKwkJICAgIGJmYV9pb2NfcG9ydGlkKGZsYXNoLT5pb2MpKTsKKwliZmFfYWxlbl9zZXQoJm1zZy0+YWxlbiwgc2l6ZW9mKHN0cnVjdCBiZmFfZmxhc2hfYXR0ciksIGZsYXNoLT5kYnVmX3BhKTsKKwliZmFfbndfaW9jX21ib3hfcXVldWUoZmxhc2gtPmlvYywgJmZsYXNoLT5tYiwgTlVMTCwgTlVMTCk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoKKyAqIFVwZGF0ZSBmbGFzaCBwYXJ0aXRpb24uCisgKgorICogQHBhcmFtW2luXSBmbGFzaCAtIGZsYXNoIHN0cnVjdHVyZQorICogQHBhcmFtW2luXSB0eXBlIC0gZmxhc2ggcGFydGl0aW9uIHR5cGUKKyAqIEBwYXJhbVtpbl0gaW5zdGFuY2UgLSBmbGFzaCBwYXJ0aXRpb24gaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gYnVmIC0gdXBkYXRlIGRhdGEgYnVmZmVyCisgKiBAcGFyYW1baW5dIGxlbiAtIGRhdGEgYnVmZmVyIGxlbmd0aAorICogQHBhcmFtW2luXSBvZmZzZXQgLSBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHBhcnRpdGlvbiBzdGFydGluZyBhZGRyZXNzCisgKiBAcGFyYW1baW5dIGNiZm4gLSBjYWxsYmFjayBmdW5jdGlvbgorICogQHBhcmFtW2luXSBjYmFyZyAtIGNhbGxiYWNrIGFyZ3VtZW50CisgKgorICogUmV0dXJuIHN0YXR1cy4KKyAqLworZW51bSBiZmFfc3RhdHVzCitiZmFfbndfZmxhc2hfdXBkYXRlX3BhcnQoc3RydWN0IGJmYV9mbGFzaCAqZmxhc2gsIHUzMiB0eXBlLCB1OCBpbnN0YW5jZSwKKwkJCSB2b2lkICpidWYsIHUzMiBsZW4sIHUzMiBvZmZzZXQsCisJCQkgYmZhX2NiX2ZsYXNoIGNiZm4sIHZvaWQgKmNiYXJnKQoreworCWlmICghYmZhX253X2lvY19pc19vcGVyYXRpb25hbChmbGFzaC0+aW9jKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfSU9DX05PTl9PUDsKKworCS8qCisJICogJ2xlbicgbXVzdCBiZSBpbiB3b3JkICg0LWJ5dGUpIGJvdW5kYXJ5CisJICovCisJaWYgKCFsZW4gfHwgKGxlbiAmIDB4MDMpKQorCQlyZXR1cm4gQkZBX1NUQVRVU19GTEFTSF9CQURfTEVOOworCisJaWYgKHR5cGUgPT0gQkZBX0ZMQVNIX1BBUlRfTUZHKQorCQlyZXR1cm4gQkZBX1NUQVRVU19FSU5WQUw7CisKKwlpZiAoZmxhc2gtPm9wX2J1c3kpCisJCXJldHVybiBCRkFfU1RBVFVTX0RFVkJVU1k7CisKKwlmbGFzaC0+b3BfYnVzeSA9IDE7CisJZmxhc2gtPmNiZm4gPSBjYmZuOworCWZsYXNoLT5jYmFyZyA9IGNiYXJnOworCWZsYXNoLT50eXBlID0gdHlwZTsKKwlmbGFzaC0+aW5zdGFuY2UgPSBpbnN0YW5jZTsKKwlmbGFzaC0+cmVzaWR1ZSA9IGxlbjsKKwlmbGFzaC0+b2Zmc2V0ID0gMDsKKwlmbGFzaC0+YWRkcl9vZmYgPSBvZmZzZXQ7CisJZmxhc2gtPnVidWYgPSBidWY7CisKKwliZmFfZmxhc2hfd3JpdGVfc2VuZChmbGFzaCk7CisKKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworLyoKKyAqIFJlYWQgZmxhc2ggcGFydGl0aW9uLgorICoKKyAqIEBwYXJhbVtpbl0gZmxhc2ggLSBmbGFzaCBzdHJ1Y3R1cmUKKyAqIEBwYXJhbVtpbl0gdHlwZSAtIGZsYXNoIHBhcnRpdGlvbiB0eXBlCisgKiBAcGFyYW1baW5dIGluc3RhbmNlIC0gZmxhc2ggcGFydGl0aW9uIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGJ1ZiAtIHJlYWQgZGF0YSBidWZmZXIKKyAqIEBwYXJhbVtpbl0gbGVuIC0gZGF0YSBidWZmZXIgbGVuZ3RoCisgKiBAcGFyYW1baW5dIG9mZnNldCAtIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgcGFydGl0aW9uIHN0YXJ0aW5nIGFkZHJlc3MKKyAqIEBwYXJhbVtpbl0gY2JmbiAtIGNhbGxiYWNrIGZ1bmN0aW9uCisgKiBAcGFyYW1baW5dIGNiYXJnIC0gY2FsbGJhY2sgYXJndW1lbnQKKyAqCisgKiBSZXR1cm4gc3RhdHVzLgorICovCitlbnVtIGJmYV9zdGF0dXMKK2JmYV9ud19mbGFzaF9yZWFkX3BhcnQoc3RydWN0IGJmYV9mbGFzaCAqZmxhc2gsIHUzMiB0eXBlLCB1OCBpbnN0YW5jZSwKKwkJICAgICAgIHZvaWQgKmJ1ZiwgdTMyIGxlbiwgdTMyIG9mZnNldCwKKwkJICAgICAgIGJmYV9jYl9mbGFzaCBjYmZuLCB2b2lkICpjYmFyZykKK3sKKwlpZiAoIWJmYV9ud19pb2NfaXNfb3BlcmF0aW9uYWwoZmxhc2gtPmlvYykpCisJCXJldHVybiBCRkFfU1RBVFVTX0lPQ19OT05fT1A7CisKKwkvKgorCSAqICdsZW4nIG11c3QgYmUgaW4gd29yZCAoNC1ieXRlKSBib3VuZGFyeQorCSAqLworCWlmICghbGVuIHx8IChsZW4gJiAweDAzKSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfRkxBU0hfQkFEX0xFTjsKKworCWlmIChmbGFzaC0+b3BfYnVzeSkKKwkJcmV0dXJuIEJGQV9TVEFUVVNfREVWQlVTWTsKKworCWZsYXNoLT5vcF9idXN5ID0gMTsKKwlmbGFzaC0+Y2JmbiA9IGNiZm47CisJZmxhc2gtPmNiYXJnID0gY2Jhcmc7CisJZmxhc2gtPnR5cGUgPSB0eXBlOworCWZsYXNoLT5pbnN0YW5jZSA9IGluc3RhbmNlOworCWZsYXNoLT5yZXNpZHVlID0gbGVuOworCWZsYXNoLT5vZmZzZXQgPSAwOworCWZsYXNoLT5hZGRyX29mZiA9IG9mZnNldDsKKwlmbGFzaC0+dWJ1ZiA9IGJ1ZjsKKworCWJmYV9mbGFzaF9yZWFkX3NlbmQoZmxhc2gpOworCisJcmV0dXJuIEJGQV9TVEFUVVNfT0s7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfaW9jLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmFfaW9jLmgKaW5kZXggY2ExNThkMS4uM2I0NDYwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZhX2lvYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JmYV9pb2MuaApAQCAtMjcsNiArMjcsOCBAQAogI2RlZmluZSBCRkFfSU9DX0hXU0VNX1RPVgk1MDAJLyogbXNlY3MgKi8KICNkZWZpbmUgQkZBX0lPQ19IQl9UT1YJCTUwMAkvKiBtc2VjcyAqLwogI2RlZmluZSBCRkFfSU9DX1BPTExfVE9WCTIwMAkvKiBtc2VjcyAqLworI2RlZmluZSBCTkFfREJHX0ZXVFJDX0xFTiAgICAgIChCRklfSU9DX1RSQ19FTlRTICogQkZJX0lPQ19UUkNfRU5UX1NaICsgXAorCQkJCUJGSV9JT0NfVFJDX0hEUl9TWikKIAogLyoqCiAgKiBQQ0kgZGV2aWNlIGluZm9ybWF0aW9uIHJlcXVpcmVkIGJ5IElPQwpAQCAtNjgsNiArNzAsMTYgQEAKIAlkbWFfYWRkci0+YTMyLmFkZHJfaGkgPSAodTMyKSBodG9ubCh1cHBlcl8zMl9iaXRzKHBhKSk7CiB9CiAKKyNkZWZpbmUgYmZhX2FsZW5fc2V0KF9fYWxlbiwgX19sZW4sIF9fcGEpCVwKKwlfX2JmYV9hbGVuX3NldChfX2FsZW4sIF9fbGVuLCAodTY0KV9fcGEpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19iZmFfYWxlbl9zZXQoc3RydWN0IGJmaV9hbGVuICphbGVuLCB1MzIgbGVuLCB1NjQgcGEpCit7CisJYWxlbi0+YWxfbGVuID0gY3B1X3RvX2JlMzIobGVuKTsKKwliZmFfZG1hX2JlX2FkZHJfc2V0KGFsZW4tPmFsX2FkZHIsIHBhKTsKK30KKwogc3RydWN0IGJmYV9pb2NfcmVncyB7CiAJdm9pZCBfX2lvbWVtICpoZm5fbWJveF9jbWQ7CiAJdm9pZCBfX2lvbWVtICpoZm5fbWJveDsKQEAgLTI5Niw2ICszMDgsNyBAQAogCiB2b2lkIGJmYV9ud19pb2NfZXJyb3JfaXNyKHN0cnVjdCBiZmFfaW9jICppb2MpOwogYm9vbCBiZmFfbndfaW9jX2lzX2Rpc2FibGVkKHN0cnVjdCBiZmFfaW9jICppb2MpOworYm9vbCBiZmFfbndfaW9jX2lzX29wZXJhdGlvbmFsKHN0cnVjdCBiZmFfaW9jICppb2MpOwogdm9pZCBiZmFfbndfaW9jX2dldF9hdHRyKHN0cnVjdCBiZmFfaW9jICppb2MsIHN0cnVjdCBiZmFfaW9jX2F0dHIgKmlvY19hdHRyKTsKIHZvaWQgYmZhX253X2lvY19ub3RpZnlfcmVnaXN0ZXIoc3RydWN0IGJmYV9pb2MgKmlvYywKIAlzdHJ1Y3QgYmZhX2lvY19ub3RpZnkgKm5vdGlmeSk7CkBAIC0zMDcsNiArMzIwLDkgQEAKIGJvb2wgYmZhX253X2lvY19md3Zlcl9jbXAoc3RydWN0IGJmYV9pb2MgKmlvYywKIAkJCXN0cnVjdCBiZmlfaW9jX2ltYWdlX2hkciAqZndoZHIpOwogbWFjX3QgYmZhX253X2lvY19nZXRfbWFjKHN0cnVjdCBiZmFfaW9jICppb2MpOwordm9pZCBiZmFfbndfaW9jX2RlYnVnX21lbWNsYWltKHN0cnVjdCBiZmFfaW9jICppb2MsIHZvaWQgKmRiZ19md3NhdmUpOworaW50IGJmYV9ud19pb2NfZGVidWdfZnd0cmMoc3RydWN0IGJmYV9pb2MgKmlvYywgdm9pZCAqdHJjZGF0YSwgaW50ICp0cmNsZW4pOworaW50IGJmYV9ud19pb2NfZGVidWdfZndzYXZlKHN0cnVjdCBiZmFfaW9jICppb2MsIHZvaWQgKnRyY2RhdGEsIGludCAqdHJjbGVuKTsKIAogLyoKICAqIFRpbWVvdXQgQVBJcwpAQCAtMzIyLDQgKzMzOCw0MiBAQAogdTMyICpiZmFfY2JfaW1hZ2VfZ2V0X2NodW5rKGVudW0gYmZpX2FzaWNfZ2VuIGFzaWNfZ2VuLCB1MzIgb2ZmKTsKIHUzMiBiZmFfY2JfaW1hZ2VfZ2V0X3NpemUoZW51bSBiZmlfYXNpY19nZW4gYXNpY19nZW4pOwogCisvKgorICoJRmxhc2ggbW9kdWxlIHNwZWNpZmljCisgKi8KK3R5cGVkZWYgdm9pZAkoKmJmYV9jYl9mbGFzaCkgKHZvaWQgKmNiYXJnLCBlbnVtIGJmYV9zdGF0dXMgc3RhdHVzKTsKKworc3RydWN0IGJmYV9mbGFzaCB7CisJc3RydWN0IGJmYV9pb2MgKmlvYzsJCS8qIGJhY2sgcG9pbnRlciB0byBpb2MgKi8KKwl1MzIJCXR5cGU7CQkvKiBwYXJ0aXRpb24gdHlwZSAqLworCXU4CQlpbnN0YW5jZTsJLyogcGFydGl0aW9uIGluc3RhbmNlICovCisJdTgJCXJzdlszXTsKKwl1MzIJCW9wX2J1c3k7CS8qICBvcGVyYXRpb24gYnVzeSBmbGFnICovCisJdTMyCQlyZXNpZHVlOwkvKiAgcmVzaWR1YWwgbGVuZ3RoICovCisJdTMyCQlvZmZzZXQ7CQkvKiAgb2Zmc2V0ICovCisJZW51bSBiZmFfc3RhdHVzCXN0YXR1czsJCS8qICBzdGF0dXMgKi8KKwl1OAkJKmRidWZfa3ZhOwkvKiAgZG1hIGJ1ZiB2aXJ0dWFsIGFkZHJlc3MgKi8KKwl1NjQJCWRidWZfcGE7CS8qICBkbWEgYnVmIHBoeXNpY2FsIGFkZHJlc3MgKi8KKwliZmFfY2JfZmxhc2gJY2JmbjsJCS8qICB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJdm9pZAkJKmNiYXJnOwkJLyogIHVzZXIgY2FsbGJhY2sgYXJnICovCisJdTgJCSp1YnVmOwkJLyogIHVzZXIgc3VwcGxpZWQgYnVmZmVyICovCisJdTMyCQlhZGRyX29mZjsJLyogIHBhcnRpdGlvbiBhZGRyZXNzIG9mZnNldCAqLworCXN0cnVjdCBiZmFfbWJveF9jbWQgbWI7CQkvKiAgbWFpbGJveCAqLworCXN0cnVjdCBiZmFfaW9jX25vdGlmeSBpb2Nfbm90aWZ5OyAvKiAgaW9jIGV2ZW50IG5vdGlmeSAqLworfTsKKworZW51bSBiZmFfc3RhdHVzIGJmYV9ud19mbGFzaF9nZXRfYXR0cihzdHJ1Y3QgYmZhX2ZsYXNoICpmbGFzaCwKKwkJCXN0cnVjdCBiZmFfZmxhc2hfYXR0ciAqYXR0ciwKKwkJCWJmYV9jYl9mbGFzaCBjYmZuLCB2b2lkICpjYmFyZyk7CitlbnVtIGJmYV9zdGF0dXMgYmZhX253X2ZsYXNoX3VwZGF0ZV9wYXJ0KHN0cnVjdCBiZmFfZmxhc2ggKmZsYXNoLAorCQkJdTMyIHR5cGUsIHU4IGluc3RhbmNlLCB2b2lkICpidWYsIHUzMiBsZW4sIHUzMiBvZmZzZXQsCisJCQliZmFfY2JfZmxhc2ggY2Jmbiwgdm9pZCAqY2JhcmcpOworZW51bSBiZmFfc3RhdHVzIGJmYV9ud19mbGFzaF9yZWFkX3BhcnQoc3RydWN0IGJmYV9mbGFzaCAqZmxhc2gsCisJCQl1MzIgdHlwZSwgdTggaW5zdGFuY2UsIHZvaWQgKmJ1ZiwgdTMyIGxlbiwgdTMyIG9mZnNldCwKKwkJCWJmYV9jYl9mbGFzaCBjYmZuLCB2b2lkICpjYmFyZyk7Cit1MzIJYmZhX253X2ZsYXNoX21lbWluZm8odm9pZCk7Cit2b2lkCWJmYV9ud19mbGFzaF9hdHRhY2goc3RydWN0IGJmYV9mbGFzaCAqZmxhc2gsCisJCQkgICAgc3RydWN0IGJmYV9pb2MgKmlvYywgdm9pZCAqZGV2KTsKK3ZvaWQJYmZhX253X2ZsYXNoX21lbWNsYWltKHN0cnVjdCBiZmFfZmxhc2ggKmZsYXNoLCB1OCAqZG1fa3ZhLCB1NjQgZG1fcGEpOworCiAjZW5kaWYgLyogX19CRkFfSU9DX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYmZpLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmkuaAppbmRleCA3YTEzOTNhLi4wZDlkZjY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmkuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9iZmkuaApAQCAtODMsNiArODMsMTQgQEAKIAl9IGEzMjsKIH07CiAKKy8qKgorICogR2VuZXJpYyBETUEgYWRkci1sZW4gcGFpci4KKyAqLworc3RydWN0IGJmaV9hbGVuIHsKKwl1bmlvbiBiZmlfYWRkcl91CWFsX2FkZHI7CS8qIERNQSBhZGRyIG9mIGJ1ZmZlcgkqLworCXUzMgkJCWFsX2xlbjsJCS8qIGxlbmd0aCBvZiBidWZmZXIgKi8KK307CisKIC8qCiAgKiBMYXJnZSBNZXNzYWdlIHN0cnVjdHVyZSAtIDEyOCBCeXRlcyBzaXplIE1zZ3MKICAqLwpAQCAtMjQ5LDYgKzI1Nyw4IEBACiAgKi8KICNkZWZpbmUgQkZJX0lPQ19UUkNfT0ZGCQkoMHg0YjAwKQogI2RlZmluZSBCRklfSU9DX1RSQ19FTlRTCTI1NgorI2RlZmluZSBCRklfSU9DX1RSQ19FTlRfU1oJMTYKKyNkZWZpbmUgQkZJX0lPQ19UUkNfSERSX1NaCTMyCiAKICNkZWZpbmUgQkZJX0lPQ19GV19TSUdOQVRVUkUJKDB4YmZhZGJmYWQpCiAjZGVmaW5lIEJGSV9JT0NfTUQ1U1VNX1NaCTQKQEAgLTQ3Niw2ICs0ODYsOTMgQEAKIAl1MTYgICAgIGxlbjsKIH07CiAKKy8qCisgKiAgICAgIEZMQVNIIG1vZHVsZSBzcGVjaWZpYworICovCitlbnVtIGJmaV9mbGFzaF9oMmlfbXNncyB7CisJQkZJX0ZMQVNIX0gySV9RVUVSWV9SRVEgPSAxLAorCUJGSV9GTEFTSF9IMklfRVJBU0VfUkVRID0gMiwKKwlCRklfRkxBU0hfSDJJX1dSSVRFX1JFUSA9IDMsCisJQkZJX0ZMQVNIX0gySV9SRUFEX1JFUSA9IDQsCisJQkZJX0ZMQVNIX0gySV9CT09UX1ZFUl9SRVEgPSA1LAorfTsKKworZW51bSBiZmlfZmxhc2hfaTJoX21zZ3MgeworCUJGSV9GTEFTSF9JMkhfUVVFUllfUlNQID0gQkZBX0kySE0oMSksCisJQkZJX0ZMQVNIX0kySF9FUkFTRV9SU1AgPSBCRkFfSTJITSgyKSwKKwlCRklfRkxBU0hfSTJIX1dSSVRFX1JTUCA9IEJGQV9JMkhNKDMpLAorCUJGSV9GTEFTSF9JMkhfUkVBRF9SU1AgPSBCRkFfSTJITSg0KSwKKwlCRklfRkxBU0hfSTJIX0JPT1RfVkVSX1JTUCA9IEJGQV9JMkhNKDUpLAorCUJGSV9GTEFTSF9JMkhfRVZFTlQgPSBCRkFfSTJITSgxMjcpLAorfTsKKworLyoKKyAqIEZsYXNoIHF1ZXJ5IHJlcXVlc3QKKyAqLworc3RydWN0IGJmaV9mbGFzaF9xdWVyeV9yZXEgeworCXN0cnVjdCBiZmlfbWhkciBtaDsgICAvKiBDb21tb24gbXNnIGhlYWRlciAqLworCXN0cnVjdCBiZmlfYWxlbiBhbGVuOworfTsKKworLyoKKyAqIEZsYXNoIHdyaXRlIHJlcXVlc3QKKyAqLworc3RydWN0IGJmaV9mbGFzaF93cml0ZV9yZXEgeworCXN0cnVjdCBiZmlfbWhkciBtaDsJLyogQ29tbW9uIG1zZyBoZWFkZXIgKi8KKwlzdHJ1Y3QgYmZpX2FsZW4gYWxlbjsKKwl1MzIJdHlwZTsgICAvKiBwYXJ0aXRpb24gdHlwZSAqLworCXU4CWluc3RhbmNlOyAvKiBwYXJ0aXRpb24gaW5zdGFuY2UgKi8KKwl1OAlsYXN0OworCXU4CXJzdlsyXTsKKwl1MzIJb2Zmc2V0OworCXUzMglsZW5ndGg7Cit9OworCisvKgorICogRmxhc2ggcmVhZCByZXF1ZXN0CisgKi8KK3N0cnVjdCBiZmlfZmxhc2hfcmVhZF9yZXEgeworCXN0cnVjdCBiZmlfbWhkciBtaDsJLyogQ29tbW9uIG1zZyBoZWFkZXIgKi8KKwl1MzIJdHlwZTsJCS8qIHBhcnRpdGlvbiB0eXBlICovCisJdTgJaW5zdGFuY2U7CS8qIHBhcnRpdGlvbiBpbnN0YW5jZSAqLworCXU4CXJzdlszXTsKKwl1MzIJb2Zmc2V0OworCXUzMglsZW5ndGg7CisJc3RydWN0IGJmaV9hbGVuIGFsZW47Cit9OworCisvKgorICogRmxhc2ggcXVlcnkgcmVzcG9uc2UKKyAqLworc3RydWN0IGJmaV9mbGFzaF9xdWVyeV9yc3AgeworCXN0cnVjdCBiZmlfbWhkciBtaDsJLyogQ29tbW9uIG1zZyBoZWFkZXIgKi8KKwl1MzIJc3RhdHVzOworfTsKKworLyoKKyAqIEZsYXNoIHJlYWQgcmVzcG9uc2UKKyAqLworc3RydWN0IGJmaV9mbGFzaF9yZWFkX3JzcCB7CisJc3RydWN0IGJmaV9taGRyIG1oOwkvKiBDb21tb24gbXNnIGhlYWRlciAqLworCXUzMgl0eXBlOwkJLyogcGFydGl0aW9uIHR5cGUgKi8KKwl1OAlpbnN0YW5jZTsJLyogcGFydGl0aW9uIGluc3RhbmNlICovCisJdTgJcnN2WzNdOworCXUzMglzdGF0dXM7CisJdTMyCWxlbmd0aDsKK307CisKKy8qCisgKiBGbGFzaCB3cml0ZSByZXNwb25zZQorICovCitzdHJ1Y3QgYmZpX2ZsYXNoX3dyaXRlX3JzcCB7CisJc3RydWN0IGJmaV9taGRyIG1oOwkvKiBDb21tb24gbXNnIGhlYWRlciAqLworCXUzMgl0eXBlOwkJLyogcGFydGl0aW9uIHR5cGUgKi8KKwl1OAlpbnN0YW5jZTsJLyogcGFydGl0aW9uIGluc3RhbmNlICovCisJdTgJcnN2WzNdOworCXUzMglzdGF0dXM7CisJdTMyCWxlbmd0aDsKK307CisKICNwcmFnbWEgcGFjaygpCiAKICNlbmRpZiAvKiBfX0JGSV9IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYV9lbmV0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFfZW5ldC5jCmluZGV4IDI2ZjVjNWEuLjljY2M1ODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYV9lbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hX2VuZXQuYwpAQCAtMTcyNyw2ICsxNzI3LDcgQEAKIAliZmFfbndfaW9jX21lbV9jbGFpbSgmaW9jZXRoLT5pb2MsIGt2YSwgZG1hKTsKIAogCWt2YSA9IHJlc19pbmZvW0JOQV9SRVNfTUVNX1RfRldUUkNdLnJlc191Lm1lbV9pbmZvLm1kbFswXS5rdmE7CisJYmZhX253X2lvY19kZWJ1Z19tZW1jbGFpbSgmaW9jZXRoLT5pb2MsIGt2YSk7CiAKIAkvKioKIAkgKiBBdHRhY2ggY29tbW9uIG1vZHVsZXMgKERpYWcsIFNGUCwgQ0VFLCBQb3J0KSBhbmQgY2xhaW0gcmVzcGVjdGl2ZQpAQCAtMTc0MCw2ICsxNzQxLDExIEBACiAJa3ZhICs9IGJmYV9ud19jZWVfbWVtaW5mbygpOwogCWRtYSArPSBiZmFfbndfY2VlX21lbWluZm8oKTsKIAorCWJmYV9ud19mbGFzaF9hdHRhY2goJmJuYS0+Zmxhc2gsICZpb2NldGgtPmlvYywgYm5hKTsKKwliZmFfbndfZmxhc2hfbWVtY2xhaW0oJmJuYS0+Zmxhc2gsIGt2YSwgZG1hKTsKKwlrdmEgKz0gYmZhX253X2ZsYXNoX21lbWluZm8oKTsKKwlkbWEgKz0gYmZhX253X2ZsYXNoX21lbWluZm8oKTsKKwogCWJmYV9tc2dxX2F0dGFjaCgmYm5hLT5tc2dxLCAmaW9jZXRoLT5pb2MpOwogCWJmYV9tc2dxX21lbWNsYWltKCZibmEtPm1zZ3EsIGt2YSwgZG1hKTsKIAliZmFfbXNncV9yZWdpc3IoJmJuYS0+bXNncSwgQkZJX01DX0VORVQsIGJuYV9tc2dxX3JzcF9oYW5kbGVyLCBibmEpOwpAQCAtMTg5Miw3ICsxODk4LDggQEAKIAlyZXNfaW5mb1tCTkFfUkVTX01FTV9UX0NPTV0ucmVzX3UubWVtX2luZm8ubnVtID0gMTsKIAlyZXNfaW5mb1tCTkFfUkVTX01FTV9UX0NPTV0ucmVzX3UubWVtX2luZm8ubGVuID0gQUxJR04oCiAJCQkJKGJmYV9ud19jZWVfbWVtaW5mbygpICsKLQkJCQliZmFfbXNncV9tZW1pbmZvKCkpLCBQQUdFX1NJWkUpOworCQkJCSBiZmFfbndfZmxhc2hfbWVtaW5mbygpICsKKwkJCQkgYmZhX21zZ3FfbWVtaW5mbygpKSwgUEFHRV9TSVpFKTsKIAogCS8qIERNQSBtZW1vcnkgZm9yIHJldHJpZXZpbmcgSU9DIGF0dHJpYnV0ZXMgKi8KIAlyZXNfaW5mb1tCTkFfUkVTX01FTV9UX0FUVFJdLnJlc190eXBlID0gQk5BX1JFU19UX01FTTsKQEAgLTE5MDQsOCArMTkxMSw4IEBACiAJLyogVmlydHVhbCBtZW1vcnkgZm9yIHJldHJlaXZpbmcgZndfdHJjICovCiAJcmVzX2luZm9bQk5BX1JFU19NRU1fVF9GV1RSQ10ucmVzX3R5cGUgPSBCTkFfUkVTX1RfTUVNOwogCXJlc19pbmZvW0JOQV9SRVNfTUVNX1RfRldUUkNdLnJlc191Lm1lbV9pbmZvLm1lbV90eXBlID0gQk5BX01FTV9UX0tWQTsKLQlyZXNfaW5mb1tCTkFfUkVTX01FTV9UX0ZXVFJDXS5yZXNfdS5tZW1faW5mby5udW0gPSAwOwotCXJlc19pbmZvW0JOQV9SRVNfTUVNX1RfRldUUkNdLnJlc191Lm1lbV9pbmZvLmxlbiA9IDA7CisJcmVzX2luZm9bQk5BX1JFU19NRU1fVF9GV1RSQ10ucmVzX3UubWVtX2luZm8ubnVtID0gMTsKKwlyZXNfaW5mb1tCTkFfUkVTX01FTV9UX0ZXVFJDXS5yZXNfdS5tZW1faW5mby5sZW4gPSBCTkFfREJHX0ZXVFJDX0xFTjsKIAogCS8qIERNQSBtZW1vcnkgZm9yIHJldHJlaXZpbmcgc3RhdHMgKi8KIAlyZXNfaW5mb1tCTkFfUkVTX01FTV9UX1NUQVRTXS5yZXNfdHlwZSA9IEJOQV9SRVNfVF9NRU07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFfdHlwZXMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYV90eXBlcy5oCmluZGV4IGQwOTBmYmYuLmU4ZDNhYjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYV90eXBlcy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYV90eXBlcy5oCkBAIC00MjcsNyArNDI3LDcgQEAKIAogLyogRG9vcmJlbGwgc3RydWN0dXJlICovCiBzdHJ1Y3QgYm5hX2liX2RiZWxsIHsKLQl2b2lkICpfX2lvbWVtIGRvb3JiZWxsX2FkZHI7CisJdm9pZCBfX2lvbWVtICAgKmRvb3JiZWxsX2FkZHI7CiAJdTMyCQlkb29yYmVsbF9hY2s7CiB9OwogCkBAIC00NjMsNyArNDYzLDcgQEAKIAl1MzIJCWNvbnN1bWVyX2luZGV4OwogCXZvbGF0aWxlIHUzMgkqaHdfY29uc3VtZXJfaW5kZXg7CiAJdTMyCQlxX2RlcHRoOwotCXZvaWQgKl9faW9tZW0gcV9kYmVsbDsKKwl2b2lkIF9faW9tZW0gICAqcV9kYmVsbDsKIAlzdHJ1Y3QgYm5hX2liX2RiZWxsICppX2RiZWxsOwogCWludAkJCXBhZ2VfaWR4OwogCWludAkJCXBhZ2VfY291bnQ7CkBAIC01OTksNyArNTk5LDcgQEAKIAl1MzIJCXByb2R1Y2VyX2luZGV4OwogCXUzMgkJY29uc3VtZXJfaW5kZXg7CiAJdTMyCQlxX2RlcHRoOwotCXZvaWQgKl9faW9tZW0gcV9kYmVsbDsKKwl2b2lkIF9faW9tZW0gICAqcV9kYmVsbDsKIAlpbnQJCQlwYWdlX2lkeDsKIAlpbnQJCQlwYWdlX2NvdW50OwogCS8qIENvbnRyb2wgcGF0aCAqLwpAQCAtOTY2LDYgKzk2Niw3IEBACiAKIAlzdHJ1Y3QgYm5hX2lvY2V0aCBpb2NldGg7CiAJc3RydWN0IGJmYV9jZWUgY2VlOworCXN0cnVjdCBiZmFfZmxhc2ggZmxhc2g7CiAJc3RydWN0IGJmYV9tc2dxIG1zZ3E7CiAKIAlzdHJ1Y3QgYm5hX2V0aHBvcnQgZXRocG9ydDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuYwppbmRleCA3ZjMwOTFlLi5iZTdkOTFlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5jCkBAIC00NCwxMSArNDQsMTggQEAKIG1vZHVsZV9wYXJhbShibmFkX2lvY19hdXRvX3JlY292ZXIsIHVpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhibmFkX2lvY19hdXRvX3JlY292ZXIsICJFbmFibGUgLyBEaXNhYmxlIGF1dG8gcmVjb3ZlcnkiKTsKIAorc3RhdGljIHVpbnQgYm5hX2RlYnVnZnNfZW5hYmxlID0gMTsKK21vZHVsZV9wYXJhbShibmFfZGVidWdmc19lbmFibGUsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoYm5hX2RlYnVnZnNfZW5hYmxlLCAiRW5hYmxlcyBkZWJ1Z2ZzIGZlYXR1cmUsIGRlZmF1bHQ9MSwiCisJCSAiIFJhbmdlW2ZhbHNlOjB8dHJ1ZToxXSIpOworCiAvKgogICogR2xvYmFsIHZhcmlhYmxlcwogICovCiB1MzIgYm5hZF9yeHFzX3Blcl9jcSA9IDI7Ci0KK3N0YXRpYyB1MzIgYm5hX2lkOworc3RhdGljIHN0cnVjdCBtdXRleCBibmFkX2xpc3RfbXV0ZXg7CitzdGF0aWMgTElTVF9IRUFEKGJuYWRfbGlzdCk7CiBzdGF0aWMgY29uc3QgdTggYm5hZF9iY2FzdF9hZGRyW10gPSAgezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OwogCiAvKgpAQCAtNzUsNiArODIsMjMgQEAKIAogI2RlZmluZSBCTkFEX1RYUlhfU1lOQ19NREVMQVkJMjUwCS8qIDI1MCBtc2VjcyAqLwogCitzdGF0aWMgdm9pZAorYm5hZF9hZGRfdG9fbGlzdChzdHJ1Y3QgYm5hZCAqYm5hZCkKK3sKKwltdXRleF9sb2NrKCZibmFkX2xpc3RfbXV0ZXgpOworCWxpc3RfYWRkX3RhaWwoJmJuYWQtPmxpc3RfZW50cnksICZibmFkX2xpc3QpOworCWJuYWQtPmlkID0gYm5hX2lkKys7CisJbXV0ZXhfdW5sb2NrKCZibmFkX2xpc3RfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAorYm5hZF9yZW1vdmVfZnJvbV9saXN0KHN0cnVjdCBibmFkICpibmFkKQoreworCW11dGV4X2xvY2soJmJuYWRfbGlzdF9tdXRleCk7CisJbGlzdF9kZWwoJmJuYWQtPmxpc3RfZW50cnkpOworCW11dGV4X3VubG9jaygmYm5hZF9saXN0X211dGV4KTsKK30KKwogLyoKICAqIFJlaW5pdGlhbGl6ZSBjb21wbGV0aW9ucyBpbiBDUSwgb25jZSBSeCBpcyB0YWtlbiBkb3duCiAgKi8KQEAgLTcyMyw3ICs3NDcsNyBAQAogYm5hZF9jYl9ldGhwb3J0X2xpbmtfc3RhdHVzKHN0cnVjdCBibmFkICpibmFkLAogCQkJZW51bSBibmFfbGlua19zdGF0dXMgbGlua19zdGF0dXMpCiB7Ci0JYm9vbCBsaW5rX3VwID0gMDsKKwlib29sIGxpbmtfdXAgPSBmYWxzZTsKIAogCWxpbmtfdXAgPSAobGlua19zdGF0dXMgPT0gQk5BX0xJTktfVVApIHx8IChsaW5rX3N0YXR1cyA9PSBCTkFfQ0VFX1VQKTsKIApAQCAtMTA4NCw2ICsxMTA4LDE2IEBACiAJY29tcGxldGUoJmJuYWQtPmJuYWRfY29tcGxldGlvbnMubXR1X2NvbXApOwogfQogCit2b2lkCitibmFkX2NiX2NvbXBsZXRpb24odm9pZCAqYXJnLCBlbnVtIGJmYV9zdGF0dXMgc3RhdHVzKQoreworCXN0cnVjdCBibmFkX2lvY21kX2NvbXAgKmlvY21kX2NvbXAgPQorCQkJKHN0cnVjdCBibmFkX2lvY21kX2NvbXAgKilhcmc7CisKKwlpb2NtZF9jb21wLT5jb21wX3N0YXR1cyA9ICh1MzIpIHN0YXR1czsKKwljb21wbGV0ZSgmaW9jbWRfY29tcC0+Y29tcCk7Cit9CisKIC8qIFJlc291cmNlIGFsbG9jYXRpb24sIGZyZWUgZnVuY3Rpb25zICovCiAKIHN0YXRpYyB2b2lkCkBAIC0yOTY4LDcgKzMwMDIsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBibmFkX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJCSB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CkBAIC0yOTc2LDcgKzMwMTAsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIWJuYWQtPnJ4X2luZm9bMF0ucngpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAltdXRleF9sb2NrKCZibmFkLT5jb25mX211dGV4KTsKIApAQCAtMjk4Niw5ICszMDIwLDExIEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKIAogCW11dGV4X3VubG9jaygmYm5hZC0+Y29uZl9tdXRleCk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGJuYWRfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAogCQkJCSAgdW5zaWduZWQgc2hvcnQgdmlkKQogewpAQCAtMjk5Niw3ICszMDMyLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCFibmFkLT5yeF9pbmZvWzBdLnJ4KQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJbXV0ZXhfbG9jaygmYm5hZC0+Y29uZl9tdXRleCk7CiAKQEAgLTMwMDYsNiArMzA0Miw4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKIAogCW11dGV4X3VubG9jaygmYm5hZC0+Y29uZl9tdXRleCk7CisKKwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCkBAIC0zMTYzLDEyICszMjAxLDE0IEBACiB7CiAJc3Bpbl9sb2NrX2luaXQoJmJuYWQtPmJuYV9sb2NrKTsKIAltdXRleF9pbml0KCZibmFkLT5jb25mX211dGV4KTsKKwltdXRleF9pbml0KCZibmFkX2xpc3RfbXV0ZXgpOwogfQogCiBzdGF0aWMgdm9pZAogYm5hZF9sb2NrX3VuaW5pdChzdHJ1Y3QgYm5hZCAqYm5hZCkKIHsKIAltdXRleF9kZXN0cm95KCZibmFkLT5jb25mX211dGV4KTsKKwltdXRleF9kZXN0cm95KCZibmFkX2xpc3RfbXV0ZXgpOwogfQogCiAvKiBQQ0kgSW5pdGlhbGl6YXRpb24gKi8KQEAgLTMxODYsNyArMzIyNiw3IEBACiAJCWdvdG8gZGlzYWJsZV9kZXZpY2U7CiAJaWYgKCFkbWFfc2V0X21hc2soJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDY0KSkgJiYKIAkgICAgIWRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LCBETUFfQklUX01BU0soNjQpKSkgewotCQkqdXNpbmdfZGFjID0gMTsKKwkJKnVzaW5nX2RhYyA9IHRydWU7CiAJfSBlbHNlIHsKIAkJZXJyID0gZG1hX3NldF9tYXNrKCZwZGV2LT5kZXYsIERNQV9CSVRfTUFTSygzMikpOwogCQlpZiAoZXJyKSB7CkBAIC0zMTk1LDcgKzMyMzUsNyBAQAogCQkJaWYgKGVycikKIAkJCQlnb3RvIHJlbGVhc2VfcmVnaW9uczsKIAkJfQotCQkqdXNpbmdfZGFjID0gMDsKKwkJKnVzaW5nX2RhYyA9IGZhbHNlOwogCX0KIAlwY2lfc2V0X21hc3RlcihwZGV2KTsKIAlyZXR1cm4gMDsKQEAgLTMyNDksOCArMzI4OSw4IEBACiAJCXJldHVybiBlcnI7CiAJfQogCWJuYWQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCiAJYm5hZF9sb2NrX2luaXQoYm5hZCk7CisJYm5hZF9hZGRfdG9fbGlzdChibmFkKTsKIAogCW11dGV4X2xvY2soJmJuYWQtPmNvbmZfbXV0ZXgpOwogCS8qCkBAIC0zMjc3LDYgKzMzMTcsMTAgQEAKIAkvKiBTZXQgbGluayB0byBkb3duIHN0YXRlICovCiAJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKIAorCS8qIFNldHVwIHRoZSBkZWJ1Z2ZzIG5vZGUgZm9yIHRoaXMgYmZhZCAqLworCWlmIChibmFfZGVidWdmc19lbmFibGUpCisJCWJuYWRfZGVidWdmc19pbml0KGJuYWQpOworCiAJLyogR2V0IHJlc291cmNlIHJlcXVpcmVtZW50IGZvcm0gYm5hICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CiAJYm5hX3Jlc19yZXEoJmJuYWQtPnJlc19pbmZvWzBdKTsKQEAgLTMzOTgsMTEgKzM0NDIsMTUgQEAKIHJlc19mcmVlOgogCWJuYWRfcmVzX2ZyZWUoYm5hZCwgJmJuYWQtPnJlc19pbmZvWzBdLCBCTkFfUkVTX1RfTUFYKTsKIGRydl91bmluaXQ6CisJLyogUmVtb3ZlIHRoZSBkZWJ1Z2ZzIG5vZGUgZm9yIHRoaXMgYm5hZCAqLworCWtmcmVlKGJuYWQtPnJlZ2RhdGEpOworCWJuYWRfZGVidWdmc191bmluaXQoYm5hZCk7CiAJYm5hZF91bmluaXQoYm5hZCk7CiBwY2lfdW5pbml0OgogCWJuYWRfcGNpX3VuaW5pdChwZGV2KTsKIHVubG9ja19tdXRleDoKIAltdXRleF91bmxvY2soJmJuYWQtPmNvbmZfbXV0ZXgpOworCWJuYWRfcmVtb3ZlX2Zyb21fbGlzdChibmFkKTsKIAlibmFkX2xvY2tfdW5pbml0KGJuYWQpOwogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiAJcmV0dXJuIGVycjsKQEAgLTM0NDEsNyArMzQ4OSwxMSBAQAogCWJuYWRfZGlzYWJsZV9tc2l4KGJuYWQpOwogCWJuYWRfcGNpX3VuaW5pdChwZGV2KTsKIAltdXRleF91bmxvY2soJmJuYWQtPmNvbmZfbXV0ZXgpOworCWJuYWRfcmVtb3ZlX2Zyb21fbGlzdChibmFkKTsKIAlibmFkX2xvY2tfdW5pbml0KGJuYWQpOworCS8qIFJlbW92ZSB0aGUgZGVidWdmcyBub2RlIGZvciB0aGlzIGJuYWQgKi8KKwlrZnJlZShibmFkLT5yZWdkYXRhKTsKKwlibmFkX2RlYnVnZnNfdW5pbml0KGJuYWQpOwogCWJuYWRfdW5pbml0KGJuYWQpOwogCWZyZWVfbmV0ZGV2KG5ldGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkLmgKaW5kZXggNTQ4N2NhNC4uNTU4MjRkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2JuYWQuaApAQCAtMTI0LDYgKzEyNCwxMiBAQAogCUJOQURfTFNfVVAJCT0gMQogfTsKIAorc3RydWN0IGJuYWRfaW9jbWRfY29tcCB7CisJc3RydWN0IGJuYWQJCSpibmFkOworCXN0cnVjdCBjb21wbGV0aW9uCWNvbXA7CisJaW50CQkJY29tcF9zdGF0dXM7Cit9OworCiBzdHJ1Y3QgYm5hZF9jb21wbGV0aW9uIHsKIAlzdHJ1Y3QgY29tcGxldGlvbglpb2NfY29tcDsKIAlzdHJ1Y3QgY29tcGxldGlvbgl1Y2FzdF9jb21wOwpAQCAtMjUxLDYgKzI1Nyw4IEBACiAKIHN0cnVjdCBibmFkIHsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmV0ZGV2OworCXUzMgkJCWlkOworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdF9lbnRyeTsKIAogCS8qIERhdGEgcGF0aCAqLwogCXN0cnVjdCBibmFkX3R4X2luZm8gdHhfaW5mb1tCTkFEX01BWF9UWF07CkBAIC0zMjAsMTIgKzMyOCwyNiBAQAogCWNoYXIJCQlhZGFwdGVyX25hbWVbQk5BRF9OQU1FX0xFTl07CiAJY2hhcgkJCXBvcnRfbmFtZVtCTkFEX05BTUVfTEVOXTsKIAljaGFyCQkJbWJveF9pcnFfbmFtZVtCTkFEX05BTUVfTEVOXTsKKworCS8qIGRlYnVnZnMgc3BlY2lmaWMgZGF0YSAqLworCWNoYXIJKnJlZ2RhdGE7CisJdTMyCXJlZ2xlbjsKKwlzdHJ1Y3QgZGVudHJ5ICpibmFkX2RlbnRyeV9maWxlc1s1XTsKKwlzdHJ1Y3QgZGVudHJ5ICpwb3J0X2RlYnVnZnNfcm9vdDsKK307CisKK3N0cnVjdCBibmFkX2RydmluZm8geworCXN0cnVjdCBiZmFfaW9jX2F0dHIgIGlvY19hdHRyOworCXN0cnVjdCBiZmFfY2VlX2F0dHIgIGNlZV9hdHRyOworCXN0cnVjdCBiZmFfZmxhc2hfYXR0ciBmbGFzaF9hdHRyOworCXUzMgljZWVfc3RhdHVzOworCXUzMglmbGFzaF9zdGF0dXM7CiB9OwogCiAvKgogICogRVhURVJOIFZBUklBQkxFUwogICovCi1leHRlcm4gc3RydWN0IGZpcm13YXJlICpiZmlfZnc7CitleHRlcm4gY29uc3Qgc3RydWN0IGZpcm13YXJlICpiZmlfZnc7CiBleHRlcm4gdTMyCQlibmFkX3J4cXNfcGVyX2NxOwogCiAvKgpAQCAtMzQwLDYgKzM2Miw3IEBACiBleHRlcm4gaW50IGJuYWRfZW5hYmxlX2RlZmF1bHRfYmNhc3Qoc3RydWN0IGJuYWQgKmJuYWQpOwogZXh0ZXJuIHZvaWQgYm5hZF9yZXN0b3JlX3ZsYW5zKHN0cnVjdCBibmFkICpibmFkLCB1MzIgcnhfaWQpOwogZXh0ZXJuIHZvaWQgYm5hZF9zZXRfZXRodG9vbF9vcHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldik7CitleHRlcm4gdm9pZCBibmFkX2NiX2NvbXBsZXRpb24odm9pZCAqYXJnLCBlbnVtIGJmYV9zdGF0dXMgc3RhdHVzKTsKIAogLyogQ29uZmlndXJhdGlvbiAmIHNldHVwICovCiBleHRlcm4gdm9pZCBibmFkX3R4X2NvYWxlc2NpbmdfdGltZW9fc2V0KHN0cnVjdCBibmFkICpibmFkKTsKQEAgLTM1OSw2ICszODIsMTAgQEAKIGV4dGVybiB2b2lkIGJuYWRfbmV0ZGV2X2h3c3RhdHNfZmlsbChzdHJ1Y3QgYm5hZCAqYm5hZCwKIAkJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0cyk7CiAKKy8qIERlYnVnZnMgKi8KK3ZvaWQJYm5hZF9kZWJ1Z2ZzX2luaXQoc3RydWN0IGJuYWQgKmJuYWQpOwordm9pZAlibmFkX2RlYnVnZnNfdW5pbml0KHN0cnVjdCBibmFkICpibmFkKTsKKwogLyoqCiAgKiBNQUNST1MKICAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2RlYnVnZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTJhZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9kZWJ1Z2ZzLmMKQEAgLTAsMCArMSw2MjMgQEAKKy8qCisgKiBMaW51eCBuZXR3b3JrIGRyaXZlciBmb3IgQnJvY2FkZSBDb252ZXJnZWQgTmV0d29yayBBZGFwdGVyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA1LTIwMTEgQnJvY2FkZSBDb21tdW5pY2F0aW9ucyBTeXN0ZW1zLCBJbmMuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKiB3d3cuYnJvY2FkZS5jb20KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgImJuYWQuaCIKKworLyoKKyAqIEJOQSBkZWJ1ZnMgaW50ZXJmYWNlCisgKgorICogVG8gYWNjZXNzIHRoZSBpbnRlcmZhY2UsIGRlYnVnZnMgZmlsZSBzeXN0ZW0gc2hvdWxkIGJlIG1vdW50ZWQKKyAqIGlmIG5vdCBhbHJlYWR5IG1vdW50ZWQgdXNpbmc6CisgKgltb3VudCAtdCBkZWJ1Z2ZzIG5vbmUgL3N5cy9rZXJuZWwvZGVidWcKKyAqCisgKiBCTkEgSGllcmFyY2h5OgorICoJLSBibmEvcGNpX2Rldjo8cGNpX25hbWU+CisgKiB3aGVyZSB0aGUgcGNpX25hbWUgY29ycmVzcG9uZHMgdG8gdGhlIG9uZSB1bmRlciAvc3lzL2J1cy9wY2kvZHJpdmVycy9ibmEKKyAqCisgKiBEZWJ1Z2dpbmcgc2VydmljZSBhdmFpbGFibGUgcGVyIHBjaV9kZXY6CisgKglmd3RyYzogIFRvIGNvbGxlY3QgY3VycmVudCBmaXJtd2FyZSB0cmFjZS4KKyAqCWZ3c2F2ZTogVG8gY29sbGVjdCBsYXN0IHNhdmVkIGZ3IHRyYWNlIGFzIGEgcmVzdWx0IG9mIGZpcm13YXJlIGNyYXNoLgorICoJcmVnd3I6ICBUbyB3cml0ZSBvbmUgd29yZCB0byBjaGlwIHJlZ2lzdGVyCisgKglyZWdyZDogIFRvIHJlYWQgb25lIG9yIG1vcmUgd29yZHMgZnJvbSBjaGlwIHJlZ2lzdGVyLgorICovCisKK3N0cnVjdCBibmFkX2RlYnVnX2luZm8geworCWNoYXIgKmRlYnVnX2J1ZmZlcjsKKwl2b2lkICppX3ByaXZhdGU7CisJaW50IGJ1ZmZlcl9sZW47Cit9OworCitzdGF0aWMgaW50CitibmFkX2RlYnVnZnNfb3Blbl9md3RyYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYm5hZCAqYm5hZCA9IGlub2RlLT5pX3ByaXZhdGU7CisJc3RydWN0IGJuYWRfZGVidWdfaW5mbyAqZndfZGVidWc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmM7CisKKwlmd19kZWJ1ZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibmFkX2RlYnVnX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ3X2RlYnVnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZ3X2RlYnVnLT5idWZmZXJfbGVuID0gQk5BX0RCR19GV1RSQ19MRU47CisKKwlmd19kZWJ1Zy0+ZGVidWdfYnVmZmVyID0ga3phbGxvYyhmd19kZWJ1Zy0+YnVmZmVyX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmd19kZWJ1Zy0+ZGVidWdfYnVmZmVyKSB7CisJCWtmcmVlKGZ3X2RlYnVnKTsKKwkJZndfZGVidWcgPSBOVUxMOworCQlwcl93YXJuKCJibmEgJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBmd3RyYyBidWZmZXJcbiIsCisJCQlwY2lfbmFtZShibmFkLT5wY2lkZXYpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CisJcmMgPSBiZmFfbndfaW9jX2RlYnVnX2Z3dHJjKCZibmFkLT5ibmEuaW9jZXRoLmlvYywKKwkJCWZ3X2RlYnVnLT5kZWJ1Z19idWZmZXIsCisJCQkmZndfZGVidWctPmJ1ZmZlcl9sZW4pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CisJaWYgKHJjICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJa2ZyZWUoZndfZGVidWctPmRlYnVnX2J1ZmZlcik7CisJCWZ3X2RlYnVnLT5kZWJ1Z19idWZmZXIgPSBOVUxMOworCQlrZnJlZShmd19kZWJ1Zyk7CisJCWZ3X2RlYnVnID0gTlVMTDsKKwkJcHJfd2FybigiYm5hZCAlczogRmFpbGVkIHRvIGNvbGxlY3QgZnd0cmNcbiIsCisJCQlwY2lfbmFtZShibmFkLT5wY2lkZXYpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZndfZGVidWc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYm5hZF9kZWJ1Z2ZzX29wZW5fZndzYXZlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBibmFkICpibmFkID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgYm5hZF9kZWJ1Z19pbmZvICpmd19kZWJ1ZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYzsKKworCWZ3X2RlYnVnID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJuYWRfZGVidWdfaW5mbyksIEdGUF9LRVJORUwpOworCWlmICghZndfZGVidWcpCisJCXJldHVybiAtRU5PTUVNOworCisJZndfZGVidWctPmJ1ZmZlcl9sZW4gPSBCTkFfREJHX0ZXVFJDX0xFTjsKKworCWZ3X2RlYnVnLT5kZWJ1Z19idWZmZXIgPSBremFsbG9jKGZ3X2RlYnVnLT5idWZmZXJfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ3X2RlYnVnLT5kZWJ1Z19idWZmZXIpIHsKKwkJa2ZyZWUoZndfZGVidWcpOworCQlmd19kZWJ1ZyA9IE5VTEw7CisJCXByX3dhcm4oImJuYSAlczogRmFpbGVkIHRvIGFsbG9jYXRlIGZ3c2F2ZSBidWZmZXJcbiIsCisJCQlwY2lfbmFtZShibmFkLT5wY2lkZXYpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CisJcmMgPSBiZmFfbndfaW9jX2RlYnVnX2Z3c2F2ZSgmYm5hZC0+Ym5hLmlvY2V0aC5pb2MsCisJCQlmd19kZWJ1Zy0+ZGVidWdfYnVmZmVyLAorCQkJJmZ3X2RlYnVnLT5idWZmZXJfbGVuKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOworCWlmIChyYyAhPSBCRkFfU1RBVFVTX09LICYmIHJjICE9IEJGQV9TVEFUVVNfRU5PRlNBVkUpIHsKKwkJa2ZyZWUoZndfZGVidWctPmRlYnVnX2J1ZmZlcik7CisJCWZ3X2RlYnVnLT5kZWJ1Z19idWZmZXIgPSBOVUxMOworCQlrZnJlZShmd19kZWJ1Zyk7CisJCWZ3X2RlYnVnID0gTlVMTDsKKwkJcHJfd2FybigiYm5hICVzOiBGYWlsZWQgdG8gY29sbGVjdCBmd3NhdmVcbiIsCisJCQlwY2lfbmFtZShibmFkLT5wY2lkZXYpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZndfZGVidWc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYm5hZF9kZWJ1Z2ZzX29wZW5fcmVnKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBibmFkX2RlYnVnX2luZm8gKnJlZ19kZWJ1ZzsKKworCXJlZ19kZWJ1ZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBibmFkX2RlYnVnX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlZ19kZWJ1ZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZWdfZGVidWctPmlfcHJpdmF0ZSA9IGlub2RlLT5pX3ByaXZhdGU7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSByZWdfZGVidWc7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYm5hZF9nZXRfZGVidWdfZHJ2aW5mbyhzdHJ1Y3QgYm5hZCAqYm5hZCwgdm9pZCAqYnVmZmVyLCB1MzIgbGVuKQoreworCXN0cnVjdCBibmFkX2RydmluZm8gKmRydmluZm8gPSAoc3RydWN0IGJuYWRfZHJ2aW5mbyAqKSBidWZmZXI7CisJc3RydWN0IGJuYWRfaW9jbWRfY29tcCBmY29tcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKKwlpbnQgcmV0ID0gQkZBX1NUQVRVU19GQUlMRUQ7CisKKwkvKiBHZXQgSU9DIGluZm8gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKKwliZmFfbndfaW9jX2dldF9hdHRyKCZibmFkLT5ibmEuaW9jZXRoLmlvYywgJmRydmluZm8tPmlvY19hdHRyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOworCisJLyogUmV0cmlldmUgQ0VFIHJlbGF0ZWQgaW5mbyAqLworCWZjb21wLmJuYWQgPSBibmFkOworCWZjb21wLmNvbXBfc3RhdHVzID0gMDsKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOworCXJldCA9IGJmYV9ud19jZWVfZ2V0X2F0dHIoJmJuYWQtPmJuYS5jZWUsICZkcnZpbmZvLT5jZWVfYXR0ciwKKwkJCQlibmFkX2NiX2NvbXBsZXRpb24sICZmY29tcCk7CisJaWYgKHJldCAhPSBCRkFfU1RBVFVTX09LKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CisJCWdvdG8gb3V0OworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCWRydmluZm8tPmNlZV9zdGF0dXMgPSBmY29tcC5jb21wX3N0YXR1czsKKworCS8qIFJldHJpZXZlIGZsYXNoIHBhcnRpdGlvbiBpbmZvICovCisJZmNvbXAuY29tcF9zdGF0dXMgPSAwOworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CisJcmV0ID0gYmZhX253X2ZsYXNoX2dldF9hdHRyKCZibmFkLT5ibmEuZmxhc2gsICZkcnZpbmZvLT5mbGFzaF9hdHRyLAorCQkJCWJuYWRfY2JfY29tcGxldGlvbiwgJmZjb21wKTsKKwlpZiAocmV0ICE9IEJGQV9TVEFUVVNfT0spIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKKwkJZ290byBvdXQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CisJd2FpdF9mb3JfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJZHJ2aW5mby0+Zmxhc2hfc3RhdHVzID0gZmNvbXAuY29tcF9zdGF0dXM7CitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYm5hZF9kZWJ1Z2ZzX29wZW5fZHJ2aW5mbyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYm5hZCAqYm5hZCA9IGlub2RlLT5pX3ByaXZhdGU7CisJc3RydWN0IGJuYWRfZGVidWdfaW5mbyAqZHJ2X2luZm87CisJaW50IHJjOworCisJZHJ2X2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYm5hZF9kZWJ1Z19pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkcnZfaW5mbykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkcnZfaW5mby0+YnVmZmVyX2xlbiA9IHNpemVvZihzdHJ1Y3QgYm5hZF9kcnZpbmZvKTsKKworCWRydl9pbmZvLT5kZWJ1Z19idWZmZXIgPSBremFsbG9jKGRydl9pbmZvLT5idWZmZXJfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRydl9pbmZvLT5kZWJ1Z19idWZmZXIpIHsKKwkJa2ZyZWUoZHJ2X2luZm8pOworCQlkcnZfaW5mbyA9IE5VTEw7CisJCXByX3dhcm4oImJuYSAlczogRmFpbGVkIHRvIGFsbG9jYXRlIGRydiBpbmZvIGJ1ZmZlclxuIiwKKwkJCXBjaV9uYW1lKGJuYWQtPnBjaWRldikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltdXRleF9sb2NrKCZibmFkLT5jb25mX211dGV4KTsKKwlyYyA9IGJuYWRfZ2V0X2RlYnVnX2RydmluZm8oYm5hZCwgZHJ2X2luZm8tPmRlYnVnX2J1ZmZlciwKKwkJCQlkcnZfaW5mby0+YnVmZmVyX2xlbik7CisJbXV0ZXhfdW5sb2NrKCZibmFkLT5jb25mX211dGV4KTsKKwlpZiAocmMgIT0gQkZBX1NUQVRVU19PSykgeworCQlrZnJlZShkcnZfaW5mby0+ZGVidWdfYnVmZmVyKTsKKwkJZHJ2X2luZm8tPmRlYnVnX2J1ZmZlciA9IE5VTEw7CisJCWtmcmVlKGRydl9pbmZvKTsKKwkJZHJ2X2luZm8gPSBOVUxMOworCQlwcl93YXJuKCJibmEgJXM6IEZhaWxlZCB0byBjb2xsZWN0IGRydmluZm9cbiIsCisJCQlwY2lfbmFtZShibmFkLT5wY2lkZXYpKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZHJ2X2luZm87CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhbmdlcyB0aGUgY3VycmVudCBmaWxlIHBvc2l0aW9uICovCitzdGF0aWMgbG9mZl90CitibmFkX2RlYnVnZnNfbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnKQoreworCWxvZmZfdCBwb3MgPSBmaWxlLT5mX3BvczsKKwlzdHJ1Y3QgYm5hZF9kZWJ1Z19pbmZvICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghZGVidWcpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChvcmlnKSB7CisJY2FzZSAwOgorCQlmaWxlLT5mX3BvcyA9IG9mZnNldDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlmaWxlLT5mX3BvcyArPSBvZmZzZXQ7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZmlsZS0+Zl9wb3MgPSBkZWJ1Zy0+YnVmZmVyX2xlbiAtIG9mZnNldDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGZpbGUtPmZfcG9zIDwgMCB8fCBmaWxlLT5mX3BvcyA+IGRlYnVnLT5idWZmZXJfbGVuKSB7CisJCWZpbGUtPmZfcG9zID0gcG9zOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZmlsZS0+Zl9wb3M7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitibmFkX2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJICBzaXplX3QgbmJ5dGVzLCBsb2ZmX3QgKnBvcykKK3sKKwlzdHJ1Y3QgYm5hZF9kZWJ1Z19pbmZvICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghZGVidWcgfHwgIWRlYnVnLT5kZWJ1Z19idWZmZXIpCisJCXJldHVybiAwOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1ZiwgbmJ5dGVzLCBwb3MsCisJCQkJZGVidWctPmRlYnVnX2J1ZmZlciwgZGVidWctPmJ1ZmZlcl9sZW4pOworfQorCisjZGVmaW5lIEJGQV9SRUdfQ1RfQUREUlNaCSgweDQwMDAwKQorI2RlZmluZSBCRkFfUkVHX0NCX0FERFJTWgkoMHgyMDAwMCkKKyNkZWZpbmUgQkZBX1JFR19BRERSU1ooX19pb2MpCVwKKwkoKHUzMikoYmZhX2FzaWNfaWRfY3RjKGJmYV9pb2NfZGV2aWQoX19pb2MpKSA/ICBcCisJIEJGQV9SRUdfQ1RfQUREUlNaIDogQkZBX1JFR19DQl9BRERSU1opKQorI2RlZmluZSBCRkFfUkVHX0FERFJNU0soX19pb2MpCShCRkFfUkVHX0FERFJTWihfX2lvYykgLSAxKQorCisvKgorICogRnVuY3Rpb24gdG8gY2hlY2sgaWYgdGhlIHJlZ2lzdGVyIG9mZnNldCBwYXNzZWQgaXMgdmFsaWQuCisgKi8KK3N0YXRpYyBpbnQKK2JuYV9yZWdfb2Zmc2V0X2NoZWNrKHN0cnVjdCBiZmFfaW9jICppb2MsIHUzMiBvZmZzZXQsIHUzMiBsZW4pCit7CisJdTggYXJlYTsKKworCS8qIGNoZWNrIFsxNjoxNV0gKi8KKwlhcmVhID0gKG9mZnNldCA+PiAxNSkgJiAweDc7CisJaWYgKGFyZWEgPT0gMCkgeworCQkvKiBQQ0llIGNvcmUgcmVnaXN0ZXIgKi8KKwkJaWYgKChvZmZzZXQgKyAobGVuPDwyKSkgPiAweDgwMDApCS8qIDhrIGR3b3JkcyBvciAzMktCICovCisJCQlyZXR1cm4gQkZBX1NUQVRVU19FSU5WQUw7CisJfSBlbHNlIGlmIChhcmVhID09IDB4MSkgeworCQkvKiBDQiAzMiBLQiBtZW1vcnkgcGFnZSAqLworCQlpZiAoKG9mZnNldCArIChsZW48PDIpKSA+IDB4MTAwMDApCS8qIDhrIGR3b3JkcyBvciAzMktCICovCisJCQlyZXR1cm4gQkZBX1NUQVRVU19FSU5WQUw7CisJfSBlbHNlIHsKKwkJLyogQ0IgcmVnaXN0ZXIgc3BhY2UgNjRLQiAqLworCQlpZiAoKG9mZnNldCArIChsZW48PDIpKSA+IEJGQV9SRUdfQUREUk1TSyhpb2MpKQorCQkJcmV0dXJuIEJGQV9TVEFUVVNfRUlOVkFMOworCX0KKwlyZXR1cm4gQkZBX1NUQVRVU19PSzsKK30KKworc3RhdGljIHNzaXplX3QKK2JuYWRfZGVidWdmc19yZWFkX3JlZ3JkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLAorCQkJc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwb3MpCit7CisJc3RydWN0IGJuYWRfZGVidWdfaW5mbyAqcmVncmRfZGVidWcgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGJuYWQgKmJuYWQgPSAoc3RydWN0IGJuYWQgKilyZWdyZF9kZWJ1Zy0+aV9wcml2YXRlOworCXNzaXplX3QgcmM7CisKKwlpZiAoIWJuYWQtPnJlZ2RhdGEpCisJCXJldHVybiAwOworCisJcmMgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcihidWYsIG5ieXRlcywgcG9zLAorCQkJYm5hZC0+cmVnZGF0YSwgYm5hZC0+cmVnbGVuKTsKKworCWlmICgoKnBvcyArIG5ieXRlcykgPj0gYm5hZC0+cmVnbGVuKSB7CisJCWtmcmVlKGJuYWQtPnJlZ2RhdGEpOworCQlibmFkLT5yZWdkYXRhID0gTlVMTDsKKwkJYm5hZC0+cmVnbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitibmFkX2RlYnVnZnNfd3JpdGVfcmVncmQoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCXNpemVfdCBuYnl0ZXMsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYm5hZF9kZWJ1Z19pbmZvICpyZWdyZF9kZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYm5hZCAqYm5hZCA9IChzdHJ1Y3QgYm5hZCAqKXJlZ3JkX2RlYnVnLT5pX3ByaXZhdGU7CisJc3RydWN0IGJmYV9pb2MgKmlvYyA9ICZibmFkLT5ibmEuaW9jZXRoLmlvYzsKKwlpbnQgYWRkciwgbGVuLCByYywgaTsKKwl1MzIgKnJlZ2J1ZjsKKwl2b2lkIF9faW9tZW0gKnJiLCAqcmVnX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICprZXJuX2J1ZjsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSB0aGUgdXNlciBzcGFjZSBidWYgKi8KKwlrZXJuX2J1ZiA9IGt6YWxsb2MobmJ5dGVzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtlcm5fYnVmKSB7CisJCXByX3dhcm4oImJuYSAlczogRmFpbGVkIHRvIGFsbG9jYXRlIHVzZXIgYnVmZmVyXG4iLAorCQkJcGNpX25hbWUoYm5hZC0+cGNpZGV2KSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihrZXJuX2J1ZiwgKHZvaWQgIF9fdXNlciAqKWJ1ZiwgbmJ5dGVzKSkgeworCQlrZnJlZShrZXJuX2J1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJjID0gc3NjYW5mKGtlcm5fYnVmLCAiJXg6JXgiLCAmYWRkciwgJmxlbik7CisJaWYgKHJjIDwgMikgeworCQlwcl93YXJuKCJibmEgJXM6IEZhaWxlZCB0byByZWFkIHVzZXIgYnVmZmVyXG4iLAorCQkJcGNpX25hbWUoYm5hZC0+cGNpZGV2KSk7CisJCWtmcmVlKGtlcm5fYnVmKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJa2ZyZWUoa2Vybl9idWYpOworCWtmcmVlKGJuYWQtPnJlZ2RhdGEpOworCWJuYWQtPnJlZ2RhdGEgPSBOVUxMOworCWJuYWQtPnJlZ2xlbiA9IDA7CisKKwlibmFkLT5yZWdkYXRhID0ga3phbGxvYyhsZW4gPDwgMiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFibmFkLT5yZWdkYXRhKSB7CisJCXByX3dhcm4oImJuYSAlczogRmFpbGVkIHRvIGFsbG9jYXRlIHJlZ3JkIGJ1ZmZlclxuIiwKKwkJCXBjaV9uYW1lKGJuYWQtPnBjaWRldikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlibmFkLT5yZWdsZW4gPSBsZW4gPDwgMjsKKwlyYiA9IGJmYV9pb2NfYmFyMChpb2MpOworCWFkZHIgJj0gQkZBX1JFR19BRERSTVNLKGlvYyk7CisKKwkvKiBvZmZzZXQgYW5kIGxlbiBzYW5pdHkgY2hlY2sgKi8KKwlyYyA9IGJuYV9yZWdfb2Zmc2V0X2NoZWNrKGlvYywgYWRkciwgbGVuKTsKKwlpZiAocmMpIHsKKwkJcHJfd2FybigiYm5hICVzOiBGYWlsZWQgcmVnIG9mZnNldCBjaGVja1xuIiwKKwkJCXBjaV9uYW1lKGJuYWQtPnBjaWRldikpOworCQlrZnJlZShibmFkLT5yZWdkYXRhKTsKKwkJYm5hZC0+cmVnZGF0YSA9IE5VTEw7CisJCWJuYWQtPnJlZ2xlbiA9IDA7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlZ19hZGRyID0gcmIgKyBhZGRyOworCXJlZ2J1ZiA9ICAodTMyICopYm5hZC0+cmVnZGF0YTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJKnJlZ2J1ZiA9IHJlYWRsKHJlZ19hZGRyKTsKKwkJcmVnYnVmKys7CisJCXJlZ19hZGRyICs9IHNpemVvZih1MzIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG5ieXRlczsKK30KKworc3RhdGljIHNzaXplX3QKK2JuYWRfZGVidWdmc193cml0ZV9yZWd3cihzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJc2l6ZV90IG5ieXRlcywgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBibmFkX2RlYnVnX2luZm8gKmRlYnVnID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBibmFkICpibmFkID0gKHN0cnVjdCBibmFkICopZGVidWctPmlfcHJpdmF0ZTsKKwlzdHJ1Y3QgYmZhX2lvYyAqaW9jID0gJmJuYWQtPmJuYS5pb2NldGguaW9jOworCWludCBhZGRyLCB2YWwsIHJjOworCXZvaWQgX19pb21lbSAqcmVnX2FkZHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkICprZXJuX2J1ZjsKKworCS8qIEFsbG9jYXRlIG1lbW9yeSB0byBzdG9yZSB0aGUgdXNlciBzcGFjZSBidWYgKi8KKwlrZXJuX2J1ZiA9IGt6YWxsb2MobmJ5dGVzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtlcm5fYnVmKSB7CisJCXByX3dhcm4oImJuYSAlczogRmFpbGVkIHRvIGFsbG9jYXRlIHVzZXIgYnVmZmVyXG4iLAorCQkJcGNpX25hbWUoYm5hZC0+cGNpZGV2KSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChjb3B5X2Zyb21fdXNlcihrZXJuX2J1ZiwgKHZvaWQgIF9fdXNlciAqKWJ1ZiwgbmJ5dGVzKSkgeworCQlrZnJlZShrZXJuX2J1Zik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJjID0gc3NjYW5mKGtlcm5fYnVmLCAiJXg6JXgiLCAmYWRkciwgJnZhbCk7CisJaWYgKHJjIDwgMikgeworCQlwcl93YXJuKCJibmEgJXM6IEZhaWxlZCB0byByZWFkIHVzZXIgYnVmZmVyXG4iLAorCQkJcGNpX25hbWUoYm5hZC0+cGNpZGV2KSk7CisJCWtmcmVlKGtlcm5fYnVmKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWtmcmVlKGtlcm5fYnVmKTsKKworCWFkZHIgJj0gQkZBX1JFR19BRERSTVNLKGlvYyk7IC8qIG9mZnNldCBvbmx5IDE3IGJpdCBhbmQgd29yZCBhbGlnbiAqLworCisJLyogb2Zmc2V0IGFuZCBsZW4gc2FuaXR5IGNoZWNrICovCisJcmMgPSBibmFfcmVnX29mZnNldF9jaGVjayhpb2MsIGFkZHIsIDEpOworCWlmIChyYykgeworCQlwcl93YXJuKCJibmEgJXM6IEZhaWxlZCByZWcgb2Zmc2V0IGNoZWNrXG4iLAorCQkJcGNpX25hbWUoYm5hZC0+cGNpZGV2KSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlZ19hZGRyID0gKGJmYV9pb2NfYmFyMChpb2MpKSArIGFkZHI7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CisJd3JpdGVsKHZhbCwgcmVnX2FkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbmJ5dGVzOworfQorCitzdGF0aWMgaW50CitibmFkX2RlYnVnZnNfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYm5hZF9kZWJ1Z19pbmZvICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghZGVidWcpCisJCXJldHVybiAwOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKKwlrZnJlZShkZWJ1Zyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2JuYWRfZGVidWdmc19idWZmZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYm5hZF9kZWJ1Z19pbmZvICpkZWJ1ZyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmICghZGVidWcpCisJCXJldHVybiAwOworCisJa2ZyZWUoZGVidWctPmRlYnVnX2J1ZmZlcik7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOworCWtmcmVlKGRlYnVnKTsKKwlkZWJ1ZyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJuYWRfZGVidWdmc19vcF9md3RyYyA9IHsKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLm9wZW4JCT0JYm5hZF9kZWJ1Z2ZzX29wZW5fZnd0cmMsCisJLmxsc2VlawkJPQlibmFkX2RlYnVnZnNfbHNlZWssCisJLnJlYWQJCT0JYm5hZF9kZWJ1Z2ZzX3JlYWQsCisJLnJlbGVhc2UJPQlibmFkX2RlYnVnZnNfYnVmZmVyX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibmFkX2RlYnVnZnNfb3BfZndzYXZlID0geworCS5vd25lcgkJPQlUSElTX01PRFVMRSwKKwkub3BlbgkJPQlibmFkX2RlYnVnZnNfb3Blbl9md3NhdmUsCisJLmxsc2VlawkJPQlibmFkX2RlYnVnZnNfbHNlZWssCisJLnJlYWQJCT0JYm5hZF9kZWJ1Z2ZzX3JlYWQsCisJLnJlbGVhc2UJPQlibmFkX2RlYnVnZnNfYnVmZmVyX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibmFkX2RlYnVnZnNfb3BfcmVncmQgPSB7CisJLm93bmVyCQk9ICAgICAgIFRISVNfTU9EVUxFLAorCS5vcGVuCQk9CWJuYWRfZGVidWdmc19vcGVuX3JlZywKKwkubGxzZWVrCQk9CWJuYWRfZGVidWdmc19sc2VlaywKKwkucmVhZAkJPQlibmFkX2RlYnVnZnNfcmVhZF9yZWdyZCwKKwkud3JpdGUJCT0JYm5hZF9kZWJ1Z2ZzX3dyaXRlX3JlZ3JkLAorCS5yZWxlYXNlCT0JYm5hZF9kZWJ1Z2ZzX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibmFkX2RlYnVnZnNfb3BfcmVnd3IgPSB7CisJLm93bmVyCQk9CVRISVNfTU9EVUxFLAorCS5vcGVuCQk9CWJuYWRfZGVidWdmc19vcGVuX3JlZywKKwkubGxzZWVrCQk9CWJuYWRfZGVidWdmc19sc2VlaywKKwkud3JpdGUJCT0JYm5hZF9kZWJ1Z2ZzX3dyaXRlX3JlZ3dyLAorCS5yZWxlYXNlCT0JYm5hZF9kZWJ1Z2ZzX3JlbGVhc2UsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBibmFkX2RlYnVnZnNfb3BfZHJ2aW5mbyA9IHsKKwkub3duZXIJCT0JVEhJU19NT0RVTEUsCisJLm9wZW4JCT0JYm5hZF9kZWJ1Z2ZzX29wZW5fZHJ2aW5mbywKKwkubGxzZWVrCQk9CWJuYWRfZGVidWdmc19sc2VlaywKKwkucmVhZAkJPQlibmFkX2RlYnVnZnNfcmVhZCwKKwkucmVsZWFzZQk9CWJuYWRfZGVidWdmc19idWZmZXJfcmVsZWFzZSwKK307CisKK3N0cnVjdCBibmFkX2RlYnVnZnNfZW50cnkgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJbW9kZV90ICBtb2RlOworCWNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHM7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJuYWRfZGVidWdmc19lbnRyeSBibmFkX2RlYnVnZnNfZmlsZXNbXSA9IHsKKwl7ICJmd3RyYyIsICBTX0lGUkVHfFNfSVJVR08sICZibmFkX2RlYnVnZnNfb3BfZnd0cmMsIH0sCisJeyAiZndzYXZlIiwgU19JRlJFR3xTX0lSVUdPLCAmYm5hZF9kZWJ1Z2ZzX29wX2Z3c2F2ZSwgfSwKKwl7ICJyZWdyZCIsICBTX0lGUkVHfFNfSVJVR098U19JV1VTUiwgJmJuYWRfZGVidWdmc19vcF9yZWdyZCwgfSwKKwl7ICJyZWd3ciIsICBTX0lGUkVHfFNfSVdVU1IsICZibmFkX2RlYnVnZnNfb3BfcmVnd3IsIH0sCisJeyAiZHJ2aW5mbyIsIFNfSUZSRUd8U19JUlVHTywgJmJuYWRfZGVidWdmc19vcF9kcnZpbmZvLCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBkZW50cnkgKmJuYV9kZWJ1Z2ZzX3Jvb3Q7CitzdGF0aWMgYXRvbWljX3QgYm5hX2RlYnVnZnNfcG9ydF9jb3VudDsKKworLyogSW5pdGlhbGl6ZSBkZWJ1Z2ZzIGludGVyZmFjZSBmb3IgQk5BICovCit2b2lkCitibmFkX2RlYnVnZnNfaW5pdChzdHJ1Y3QgYm5hZCAqYm5hZCkKK3sKKwljb25zdCBzdHJ1Y3QgYm5hZF9kZWJ1Z2ZzX2VudHJ5ICpmaWxlOworCWNoYXIgbmFtZVs2NF07CisJaW50IGk7CisKKwkvKiBTZXR1cCB0aGUgQk5BIGRlYnVnZnMgcm9vdCBkaXJlY3RvcnkqLworCWlmICghYm5hX2RlYnVnZnNfcm9vdCkgeworCQlibmFfZGVidWdmc19yb290ID0gZGVidWdmc19jcmVhdGVfZGlyKCJibmEiLCBOVUxMKTsKKwkJYXRvbWljX3NldCgmYm5hX2RlYnVnZnNfcG9ydF9jb3VudCwgMCk7CisJCWlmICghYm5hX2RlYnVnZnNfcm9vdCkgeworCQkJcHJfd2FybigiQk5BOiBkZWJ1Z2ZzIHJvb3QgZGlyIGNyZWF0aW9uIGZhaWxlZFxuIik7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBTZXR1cCB0aGUgcGNpX2RldiBkZWJ1Z2ZzIGRpcmVjdG9yeSBmb3IgdGhlIHBvcnQgKi8KKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJwY2lfZGV2OiVzIiwgcGNpX25hbWUoYm5hZC0+cGNpZGV2KSk7CisJaWYgKCFibmFkLT5wb3J0X2RlYnVnZnNfcm9vdCkgeworCQlibmFkLT5wb3J0X2RlYnVnZnNfcm9vdCA9CisJCQlkZWJ1Z2ZzX2NyZWF0ZV9kaXIobmFtZSwgYm5hX2RlYnVnZnNfcm9vdCk7CisJCWlmICghYm5hZC0+cG9ydF9kZWJ1Z2ZzX3Jvb3QpIHsKKwkJCXByX3dhcm4oImJuYSBwY2lfZGV2ICVzOiByb290IGRpciBjcmVhdGlvbiBmYWlsZWRcbiIsCisJCQkJcGNpX25hbWUoYm5hZC0+cGNpZGV2KSk7CisJCQlyZXR1cm47CisJCX0KKworCQlhdG9taWNfaW5jKCZibmFfZGVidWdmc19wb3J0X2NvdW50KTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShibmFkX2RlYnVnZnNfZmlsZXMpOyBpKyspIHsKKwkJCWZpbGUgPSAmYm5hZF9kZWJ1Z2ZzX2ZpbGVzW2ldOworCQkJYm5hZC0+Ym5hZF9kZW50cnlfZmlsZXNbaV0gPQorCQkJCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKGZpbGUtPm5hbWUsCisJCQkJCQkJZmlsZS0+bW9kZSwKKwkJCQkJCQlibmFkLT5wb3J0X2RlYnVnZnNfcm9vdCwKKwkJCQkJCQlibmFkLAorCQkJCQkJCWZpbGUtPmZvcHMpOworCQkJaWYgKCFibmFkLT5ibmFkX2RlbnRyeV9maWxlc1tpXSkgeworCQkJCXByX3dhcm4oCisJCQkJICAgICAiQk5BIHBjaV9kZXY6JXM6IGNyZWF0ZSAlcyBlbnRyeSBmYWlsZWRcbiIsCisJCQkJICAgICBwY2lfbmFtZShibmFkLT5wY2lkZXYpLCBmaWxlLT5uYW1lKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIFVuaW5pdGlhbGl6ZSBkZWJ1Z2ZzIGludGVyZmFjZSBmb3IgQk5BICovCit2b2lkCitibmFkX2RlYnVnZnNfdW5pbml0KHN0cnVjdCBibmFkICpibmFkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYm5hZF9kZWJ1Z2ZzX2ZpbGVzKTsgaSsrKSB7CisJCWlmIChibmFkLT5ibmFkX2RlbnRyeV9maWxlc1tpXSkgeworCQkJZGVidWdmc19yZW1vdmUoYm5hZC0+Ym5hZF9kZW50cnlfZmlsZXNbaV0pOworCQkJYm5hZC0+Ym5hZF9kZW50cnlfZmlsZXNbaV0gPSBOVUxMOworCQl9CisJfQorCisJLyogUmVtb3ZlIHRoZSBwY2lfZGV2IGRlYnVnZnMgZGlyZWN0b3J5IGZvciB0aGUgcG9ydCAqLworCWlmIChibmFkLT5wb3J0X2RlYnVnZnNfcm9vdCkgeworCQlkZWJ1Z2ZzX3JlbW92ZShibmFkLT5wb3J0X2RlYnVnZnNfcm9vdCk7CisJCWJuYWQtPnBvcnRfZGVidWdmc19yb290ID0gTlVMTDsKKwkJYXRvbWljX2RlYygmYm5hX2RlYnVnZnNfcG9ydF9jb3VudCk7CisJfQorCisJLyogUmVtb3ZlIHRoZSBCTkEgZGVidWdmcyByb290IGRpcmVjdG9yeSAqLworCWlmIChhdG9taWNfcmVhZCgmYm5hX2RlYnVnZnNfcG9ydF9jb3VudCkgPT0gMCkgeworCQlkZWJ1Z2ZzX3JlbW92ZShibmFfZGVidWdmc19yb290KTsKKwkJYm5hX2RlYnVnZnNfcm9vdCA9IE5VTEw7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvYm5hZF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2V0aHRvb2wuYwppbmRleCBmZDNkY2MxLi45YjQ0ZWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9ibmFkX2V0aHRvb2wuYwpAQCAtMzgsNyArMzgsNyBAQAogCXNpemVvZihzdHJ1Y3QgYm5hZF9kcnZfc3RhdHMpIC8gc2l6ZW9mKHU2NCkgKwkJXAogCW9mZnNldG9mKHN0cnVjdCBiZmlfZW5ldF9zdGF0cywgcnhmX3N0YXRzWzBdKSAvIHNpemVvZih1NjQpKQogCi1zdGF0aWMgY2hhciAqYm5hZF9uZXRfc3RhdHNfc3RyaW5nc1tCTkFEX0VUSFRPT0xfU1RBVFNfTlVNXSA9IHsKK3N0YXRpYyBjb25zdCBjaGFyICpibmFkX25ldF9zdGF0c19zdHJpbmdzW0JOQURfRVRIVE9PTF9TVEFUU19OVU1dID0gewogCSJyeF9wYWNrZXRzIiwKIAkidHhfcGFja2V0cyIsCiAJInJ4X2J5dGVzIiwKQEAgLTI5Niw4ICsyOTYsOCBAQAogCXN0cnVjdCBiZmFfaW9jX2F0dHIgKmlvY19hdHRyOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlzdHJjcHkoZHJ2aW5mby0+ZHJpdmVyLCBCTkFEX05BTUUpOwotCXN0cmNweShkcnZpbmZvLT52ZXJzaW9uLCBCTkFEX1ZFUlNJT04pOworCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCBCTkFEX05BTUUsIHNpemVvZihkcnZpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIEJOQURfVkVSU0lPTiwgc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKIAogCWlvY19hdHRyID0ga3phbGxvYyhzaXplb2YoKmlvY19hdHRyKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKGlvY19hdHRyKSB7CkBAIC0zMDUsMTIgKzMwNSwxMyBAQAogCQliZmFfbndfaW9jX2dldF9hdHRyKCZibmFkLT5ibmEuaW9jZXRoLmlvYywgaW9jX2F0dHIpOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOwogCi0JCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgaW9jX2F0dHItPmFkYXB0ZXJfYXR0ci5md192ZXIsCi0JCQlzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbikgLSAxKTsKKwkJc3RybGNweShkcnZpbmZvLT5md192ZXJzaW9uLCBpb2NfYXR0ci0+YWRhcHRlcl9hdHRyLmZ3X3ZlciwKKwkJCXNpemVvZihkcnZpbmZvLT5md192ZXJzaW9uKSk7CiAJCWtmcmVlKGlvY19hdHRyKTsKIAl9CiAKLQlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShibmFkLT5wY2lkZXYpLCBFVEhUT09MX0JVU0lORk9fTEVOKTsKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShibmFkLT5wY2lkZXYpLAorCQlzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTkzNCw3ICs5MzUsMTQ0IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGJuYWRfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgdTMyCitibmFkX2dldF9mbGFzaF9wYXJ0aXRpb25fYnlfb2Zmc2V0KHN0cnVjdCBibmFkICpibmFkLCB1MzIgb2Zmc2V0LAorCQkJCXUzMiAqYmFzZV9vZmZzZXQpCit7CisJc3RydWN0IGJmYV9mbGFzaF9hdHRyICpmbGFzaF9hdHRyOworCXN0cnVjdCBibmFkX2lvY21kX2NvbXAgZmNvbXA7CisJdTMyIGksIGZsYXNoX3BhcnQgPSAwLCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisKKwlmbGFzaF9hdHRyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJmYV9mbGFzaF9hdHRyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmbGFzaF9hdHRyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZjb21wLmJuYWQgPSBibmFkOworCWZjb21wLmNvbXBfc3RhdHVzID0gMDsKKworCWluaXRfY29tcGxldGlvbigmZmNvbXAuY29tcCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJuYWQtPmJuYV9sb2NrLCBmbGFncyk7CisJcmV0ID0gYmZhX253X2ZsYXNoX2dldF9hdHRyKCZibmFkLT5ibmEuZmxhc2gsIGZsYXNoX2F0dHIsCisJCQkJYm5hZF9jYl9jb21wbGV0aW9uLCAmZmNvbXApOworCWlmIChyZXQgIT0gQkZBX1NUQVRVU19PSykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOworCQlrZnJlZShmbGFzaF9hdHRyKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXJldCA9IGZjb21wLmNvbXBfc3RhdHVzOworCisJLyogQ2hlY2sgZm9yIHRoZSBmbGFzaCB0eXBlICYgYmFzZSBvZmZzZXQgdmFsdWUgKi8KKwlpZiAocmV0ID09IEJGQV9TVEFUVVNfT0spIHsKKwkJZm9yIChpID0gMDsgaSA8IGZsYXNoX2F0dHItPm5wYXJ0OyBpKyspIHsKKwkJCWlmIChvZmZzZXQgPj0gZmxhc2hfYXR0ci0+cGFydFtpXS5wYXJ0X29mZiAmJgorCQkJICAgIG9mZnNldCA8IChmbGFzaF9hdHRyLT5wYXJ0W2ldLnBhcnRfb2ZmICsKKwkJCQkgICAgICBmbGFzaF9hdHRyLT5wYXJ0W2ldLnBhcnRfc2l6ZSkpIHsKKwkJCQlmbGFzaF9wYXJ0ID0gZmxhc2hfYXR0ci0+cGFydFtpXS5wYXJ0X3R5cGU7CisJCQkJKmJhc2Vfb2Zmc2V0ID0gZmxhc2hfYXR0ci0+cGFydFtpXS5wYXJ0X29mZjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlrZnJlZShmbGFzaF9hdHRyKTsKKwlyZXR1cm4gZmxhc2hfcGFydDsKK291dF9lcnI6CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQKK2JuYWRfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gQkZBX1RPVEFMX0ZMQVNIX1NJWkU7Cit9CisKK3N0YXRpYyBpbnQKK2JuYWRfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBzdHJ1Y3QgZXRodG9vbF9lZXByb20gKmVlcHJvbSwKKwkJdTggKmJ5dGVzKQoreworCXN0cnVjdCBibmFkICpibmFkID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYm5hZF9pb2NtZF9jb21wIGZjb21wOworCXUzMiBmbGFzaF9wYXJ0ID0gMCwgYmFzZV9vZmZzZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCByZXQgPSAwOworCisJLyogQ2hlY2sgaWYgdGhlIGZsYXNoIHJlYWQgcmVxdWVzdCBpcyB2YWxpZCAqLworCWlmIChlZXByb20tPm1hZ2ljICE9IChibmFkLT5wY2lkZXYtPnZlbmRvciB8CisJCQkgICAgIChibmFkLT5wY2lkZXYtPmRldmljZSA8PCAxNikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIFF1ZXJ5IHRoZSBmbGFzaCBwYXJ0aXRpb24gYmFzZWQgb24gdGhlIG9mZnNldCAqLworCWZsYXNoX3BhcnQgPSBibmFkX2dldF9mbGFzaF9wYXJ0aXRpb25fYnlfb2Zmc2V0KGJuYWQsCisJCQkJZWVwcm9tLT5vZmZzZXQsICZiYXNlX29mZnNldCk7CisJaWYgKGZsYXNoX3BhcnQgPD0gMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlmY29tcC5ibmFkID0gYm5hZDsKKwlmY29tcC5jb21wX3N0YXR1cyA9IDA7CisKKwlpbml0X2NvbXBsZXRpb24oJmZjb21wLmNvbXApOworCXNwaW5fbG9ja19pcnFzYXZlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOworCXJldCA9IGJmYV9ud19mbGFzaF9yZWFkX3BhcnQoJmJuYWQtPmJuYS5mbGFzaCwgZmxhc2hfcGFydCwKKwkJCQlibmFkLT5pZCwgYnl0ZXMsIGVlcHJvbS0+bGVuLAorCQkJCWVlcHJvbS0+b2Zmc2V0IC0gYmFzZV9vZmZzZXQsCisJCQkJYm5hZF9jYl9jb21wbGV0aW9uLCAmZmNvbXApOworCWlmIChyZXQgIT0gQkZBX1NUQVRVU19PSykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlyZXQgPSBmY29tcC5jb21wX3N0YXR1czsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorYm5hZF9zZXRfZWVwcm9tKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLAorCQl1OCAqYnl0ZXMpCit7CisJc3RydWN0IGJuYWQgKmJuYWQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBibmFkX2lvY21kX2NvbXAgZmNvbXA7CisJdTMyIGZsYXNoX3BhcnQgPSAwLCBiYXNlX29mZnNldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CisJaW50IHJldCA9IDA7CisKKwkvKiBDaGVjayBpZiB0aGUgZmxhc2ggdXBkYXRlIHJlcXVlc3QgaXMgdmFsaWQgKi8KKwlpZiAoZWVwcm9tLT5tYWdpYyAhPSAoYm5hZC0+cGNpZGV2LT52ZW5kb3IgfAorCQkJICAgICAoYm5hZC0+cGNpZGV2LT5kZXZpY2UgPDwgMTYpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBRdWVyeSB0aGUgZmxhc2ggcGFydGl0aW9uIGJhc2VkIG9uIHRoZSBvZmZzZXQgKi8KKwlmbGFzaF9wYXJ0ID0gYm5hZF9nZXRfZmxhc2hfcGFydGl0aW9uX2J5X29mZnNldChibmFkLAorCQkJCWVlcHJvbS0+b2Zmc2V0LCAmYmFzZV9vZmZzZXQpOworCWlmIChmbGFzaF9wYXJ0IDw9IDApCisJCXJldHVybiAtRUZBVUxUOworCisJZmNvbXAuYm5hZCA9IGJuYWQ7CisJZmNvbXAuY29tcF9zdGF0dXMgPSAwOworCisJaW5pdF9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKKwlyZXQgPSBiZmFfbndfZmxhc2hfdXBkYXRlX3BhcnQoJmJuYWQtPmJuYS5mbGFzaCwgZmxhc2hfcGFydCwKKwkJCQlibmFkLT5pZCwgYnl0ZXMsIGVlcHJvbS0+bGVuLAorCQkJCWVlcHJvbS0+b2Zmc2V0IC0gYmFzZV9vZmZzZXQsCisJCQkJYm5hZF9jYl9jb21wbGV0aW9uLCAmZmNvbXApOworCWlmIChyZXQgIT0gQkZBX1NUQVRVU19PSykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibmFkLT5ibmFfbG9jaywgZmxhZ3MpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYm5hZC0+Ym5hX2xvY2ssIGZsYWdzKTsKKwl3YWl0X2Zvcl9jb21wbGV0aW9uKCZmY29tcC5jb21wKTsKKwlyZXQgPSBmY29tcC5jb21wX3N0YXR1czsKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBibmFkX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgPSBibmFkX2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzID0gYm5hZF9zZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvID0gYm5hZF9nZXRfZHJ2aW5mbywKQEAgLTk0OCw3ICsxMDg2LDEwIEBACiAJLnNldF9wYXVzZXBhcmFtID0gYm5hZF9zZXRfcGF1c2VwYXJhbSwKIAkuZ2V0X3N0cmluZ3MgPSBibmFkX2dldF9zdHJpbmdzLAogCS5nZXRfZXRodG9vbF9zdGF0cyA9IGJuYWRfZ2V0X2V0aHRvb2xfc3RhdHMsCi0JLmdldF9zc2V0X2NvdW50ID0gYm5hZF9nZXRfc3NldF9jb3VudAorCS5nZXRfc3NldF9jb3VudCA9IGJuYWRfZ2V0X3NzZXRfY291bnQsCisJLmdldF9lZXByb21fbGVuID0gYm5hZF9nZXRfZWVwcm9tX2xlbiwKKwkuZ2V0X2VlcHJvbSA9IGJuYWRfZ2V0X2VlcHJvbSwKKwkuc2V0X2VlcHJvbSA9IGJuYWRfc2V0X2VlcHJvbSwKIH07CiAKIHZvaWQKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Jyb2NhZGUvYm5hL2NuYS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvY25hLmgKaW5kZXggMWIzZTkwZC4uMzJlOGYxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvY25hLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvY25hLmgKQEAgLTQzLDggKzQzLDcgQEAKIAogI3ByYWdtYSBwYWNrKDEpCiAKLSNkZWZpbmUgTUFDX0FERFJMRU4JKDYpCi10eXBlZGVmIHN0cnVjdCBtYWMgeyB1OCBtYWNbTUFDX0FERFJMRU5dOyB9IG1hY190OwordHlwZWRlZiBzdHJ1Y3QgbWFjIHsgdTggbWFjW0VUSF9BTEVOXTsgfSBtYWNfdDsKIAogI3ByYWdtYSBwYWNrKCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvYnJvY2FkZS9ibmEvY25hX2Z3aW1nLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9jbmFfZndpbWcuYwppbmRleCA3MjViOWZmLi5jZmMyMmE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9jbmFfZndpbWcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9icm9jYWRlL2JuYS9jbmFfZndpbWcuYwpAQCAtMTYsNiArMTYsNyBAQAogICogd3d3LmJyb2NhZGUuY29tCiAgKi8KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgImJuYWQuaCIKICNpbmNsdWRlICJiZmkuaCIKICNpbmNsdWRlICJjbmEuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FseGVkYS9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FseGVkYS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYTQzNWMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWx4ZWRhL0tjb25maWcKQEAgLTAsMCArMSw3IEBACitjb25maWcgTkVUX0NBTFhFREFfWEdNQUMKKwl0cmlzdGF0ZSAiQ2FseGVkYSAxRy8xMEcgWEdNQUMgRXRoZXJuZXQgZHJpdmVyIgorCWRlcGVuZHMgb24gSEFTX0lPTUVNCisJc2VsZWN0IENSQzMyCisJaGVscAorCSAgVGhpcyBpcyB0aGUgZHJpdmVyIGZvciB0aGUgWEdNQUMgRXRoZXJuZXQgSVAgYmxvY2sgZm91bmQgb24gQ2FseGVkYQorCSAgSGlnaGJhbmsgcGxhdGZvcm1zLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2FseGVkYS9NYWtlZmlsZSBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhbHhlZGEvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBlZjA4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhbHhlZGEvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAorb2JqLSQoQ09ORklHX05FVF9DQUxYRURBX1hHTUFDKSArPSB4Z21hYy5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWx4ZWRhL3hnbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jYWx4ZWRhL3hnbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZjZTE4NgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NhbHhlZGEveGdtYWMuYwpAQCAtMCwwICsxLDE5MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMC0yMDExIENhbHhlZGEsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NpcmNfYnVmLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisvKiBYR01BQyBSZWdpc3RlciBkZWZpbml0aW9ucyAqLworI2RlZmluZSBYR01BQ19DT05UUk9MCQkweDAwMDAwMDAwCS8qIE1BQyBDb25maWd1cmF0aW9uICovCisjZGVmaW5lIFhHTUFDX0ZSQU1FX0ZJTFRFUgkweDAwMDAwMDA0CS8qIE1BQyBGcmFtZSBGaWx0ZXIgKi8KKyNkZWZpbmUgWEdNQUNfRkxPV19DVFJMCQkweDAwMDAwMDE4CS8qIE1BQyBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUgWEdNQUNfVkxBTl9UQUcJCTB4MDAwMDAwMUMJLyogVkxBTiBUYWdzICovCisjZGVmaW5lIFhHTUFDX1ZFUlNJT04JCTB4MDAwMDAwMjAJLyogVmVyc2lvbiAqLworI2RlZmluZSBYR01BQ19WTEFOX0lOQ0wJCTB4MDAwMDAwMjQJLyogVkxBTiB0YWcgZm9yIHR4IGZyYW1lcyAqLworI2RlZmluZSBYR01BQ19MUElfQ1RSTAkJMHgwMDAwMDAyOAkvKiBMUEkgQ29udHJvbCBhbmQgU3RhdHVzICovCisjZGVmaW5lIFhHTUFDX0xQSV9USU1FUgkJMHgwMDAwMDAyQwkvKiBMUEkgVGltZXJzIENvbnRyb2wgKi8KKyNkZWZpbmUgWEdNQUNfVFhfUEFDRQkJMHgwMDAwMDAzMAkvKiBUcmFuc21pdCBQYWNlIGFuZCBTdHJldGNoICovCisjZGVmaW5lIFhHTUFDX1ZMQU5fSEFTSAkJMHgwMDAwMDAzNAkvKiBWTEFOIEhhc2ggVGFibGUgKi8KKyNkZWZpbmUgWEdNQUNfREVCVUcJCTB4MDAwMDAwMzgJLyogRGVidWcgKi8KKyNkZWZpbmUgWEdNQUNfSU5UX1NUQVQJCTB4MDAwMDAwM0MJLyogSW50ZXJydXB0IGFuZCBDb250cm9sICovCisjZGVmaW5lIFhHTUFDX0FERFJfSElHSChyZWcpCSgweDAwMDAwMDQwICsgKChyZWcpICogOCkpCisjZGVmaW5lIFhHTUFDX0FERFJfTE9XKHJlZykJKDB4MDAwMDAwNDQgKyAoKHJlZykgKiA4KSkKKyNkZWZpbmUgWEdNQUNfSEFTSChuKQkJKDB4MDAwMDAzMDAgKyAobikgKiA0KSAvKiBIQVNIIHRhYmxlIHJlZ3MgKi8KKyNkZWZpbmUgWEdNQUNfTlVNX0hBU0gJCTE2CisjZGVmaW5lIFhHTUFDX09NUgkJMHgwMDAwMDQwMAorI2RlZmluZSBYR01BQ19SRU1PVEVfV0FLRQkweDAwMDAwNzAwCS8qIFJlbW90ZSBXYWtlLVVwIEZybSBGaWx0ZXIgKi8KKyNkZWZpbmUgWEdNQUNfUE1UCQkweDAwMDAwNzA0CS8qIFBNVCBDb250cm9sIGFuZCBTdGF0dXMgKi8KKyNkZWZpbmUgWEdNQUNfTU1DX0NUUkwJCTB4MDAwMDA4MDAJLyogWEdNQUMgTU1DIENvbnRyb2wgKi8KKyNkZWZpbmUgWEdNQUNfTU1DX0lOVFJfUlgJMHgwMDAwMDgwNAkvKiBSZWNpZXZlIEludGVycnVwdCAqLworI2RlZmluZSBYR01BQ19NTUNfSU5UUl9UWAkweDAwMDAwODA4CS8qIFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZSBYR01BQ19NTUNfSU5UUl9NQVNLX1JYCTB4MDAwMDA4MGMJLyogUmVjaWV2ZSBJbnRlcnJ1cHQgTWFzayAqLworI2RlZmluZSBYR01BQ19NTUNfSU5UUl9NQVNLX1RYCTB4MDAwMDA4MTAJLyogVHJhbnNtaXQgSW50ZXJydXB0IE1hc2sgKi8KKworLyogSGFyZHdhcmUgVFggU3RhdGlzdGljcyBDb3VudGVycyAqLworI2RlZmluZSBYR01BQ19NTUNfVFhPQ1RFVF9HQl9MTwkweDAwMDAwODE0CisjZGVmaW5lIFhHTUFDX01NQ19UWE9DVEVUX0dCX0hJCTB4MDAwMDA4MTgKKyNkZWZpbmUgWEdNQUNfTU1DX1RYRlJBTUVfR0JfTE8JMHgwMDAwMDgxQworI2RlZmluZSBYR01BQ19NTUNfVFhGUkFNRV9HQl9ISQkweDAwMDAwODIwCisjZGVmaW5lIFhHTUFDX01NQ19UWEJDRlJBTUVfRwkweDAwMDAwODI0CisjZGVmaW5lIFhHTUFDX01NQ19UWE1DRlJBTUVfRwkweDAwMDAwODJDCisjZGVmaW5lIFhHTUFDX01NQ19UWFVDRlJBTUVfR0IJMHgwMDAwMDg2NAorI2RlZmluZSBYR01BQ19NTUNfVFhNQ0ZSQU1FX0dCCTB4MDAwMDA4NkMKKyNkZWZpbmUgWEdNQUNfTU1DX1RYQkNGUkFNRV9HQgkweDAwMDAwODc0CisjZGVmaW5lIFhHTUFDX01NQ19UWFVOREVSRkxPVwkweDAwMDAwODdDCisjZGVmaW5lIFhHTUFDX01NQ19UWE9DVEVUX0dfTE8JMHgwMDAwMDg4NAorI2RlZmluZSBYR01BQ19NTUNfVFhPQ1RFVF9HX0hJCTB4MDAwMDA4ODgKKyNkZWZpbmUgWEdNQUNfTU1DX1RYRlJBTUVfR19MTwkweDAwMDAwODhDCisjZGVmaW5lIFhHTUFDX01NQ19UWEZSQU1FX0dfSEkJMHgwMDAwMDg5MAorI2RlZmluZSBYR01BQ19NTUNfVFhQQVVTRUZSQU1FCTB4MDAwMDA4OTQKKyNkZWZpbmUgWEdNQUNfTU1DX1RYVkxBTkZSQU1FCTB4MDAwMDA4OUMKKworLyogSGFyZHdhcmUgUlggU3RhdGlzdGljcyBDb3VudGVycyAqLworI2RlZmluZSBYR01BQ19NTUNfUlhGUkFNRV9HQl9MTwkweDAwMDAwOTAwCisjZGVmaW5lIFhHTUFDX01NQ19SWEZSQU1FX0dCX0hJCTB4MDAwMDA5MDQKKyNkZWZpbmUgWEdNQUNfTU1DX1JYT0NURVRfR0JfTE8JMHgwMDAwMDkwOAorI2RlZmluZSBYR01BQ19NTUNfUlhPQ1RFVF9HQl9ISQkweDAwMDAwOTBDCisjZGVmaW5lIFhHTUFDX01NQ19SWE9DVEVUX0dfTE8JMHgwMDAwMDkxMAorI2RlZmluZSBYR01BQ19NTUNfUlhPQ1RFVF9HX0hJCTB4MDAwMDA5MTQKKyNkZWZpbmUgWEdNQUNfTU1DX1JYQkNGUkFNRV9HCTB4MDAwMDA5MTgKKyNkZWZpbmUgWEdNQUNfTU1DX1JYTUNGUkFNRV9HCTB4MDAwMDA5MjAKKyNkZWZpbmUgWEdNQUNfTU1DX1JYQ1JDRVJSCTB4MDAwMDA5MjgKKyNkZWZpbmUgWEdNQUNfTU1DX1JYUlVOVAkweDAwMDAwOTMwCisjZGVmaW5lIFhHTUFDX01NQ19SWEpBQkJFUgkweDAwMDAwOTM0CisjZGVmaW5lIFhHTUFDX01NQ19SWFVDRlJBTUVfRwkweDAwMDAwOTcwCisjZGVmaW5lIFhHTUFDX01NQ19SWExFTkdUSEVSUgkweDAwMDAwOTc4CisjZGVmaW5lIFhHTUFDX01NQ19SWFBBVVNFRlJBTUUJMHgwMDAwMDk4OAorI2RlZmluZSBYR01BQ19NTUNfUlhPVkVSRkxPVwkweDAwMDAwOTkwCisjZGVmaW5lIFhHTUFDX01NQ19SWFZMQU5GUkFNRQkweDAwMDAwOTk4CisjZGVmaW5lIFhHTUFDX01NQ19SWFdBVENIRE9HCTB4MDAwMDA5YTAKKworLyogRE1BIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlcnMgKi8KKyNkZWZpbmUgWEdNQUNfRE1BX0JVU19NT0RFCTB4MDAwMDBmMDAJLyogQnVzIE1vZGUgKi8KKyNkZWZpbmUgWEdNQUNfRE1BX1RYX1BPTEwJMHgwMDAwMGYwNAkvKiBUcmFuc21pdCBQb2xsIERlbWFuZCAqLworI2RlZmluZSBYR01BQ19ETUFfUlhfUE9MTAkweDAwMDAwZjA4CS8qIFJlY2VpdmVkIFBvbGwgRGVtYW5kICovCisjZGVmaW5lIFhHTUFDX0RNQV9SWF9CQVNFX0FERFIJMHgwMDAwMGYwYwkvKiBSZWNlaXZlIExpc3QgQmFzZSAqLworI2RlZmluZSBYR01BQ19ETUFfVFhfQkFTRV9BRERSCTB4MDAwMDBmMTAJLyogVHJhbnNtaXQgTGlzdCBCYXNlICovCisjZGVmaW5lIFhHTUFDX0RNQV9TVEFUVVMJMHgwMDAwMGYxNAkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgWEdNQUNfRE1BX0NPTlRST0wJMHgwMDAwMGYxOAkvKiBDdHJsIChPcGVyYXRpb25hbCBNb2RlKSAqLworI2RlZmluZSBYR01BQ19ETUFfSU5UUl9FTkEJMHgwMDAwMGYxYwkvKiBJbnRlcnJ1cHQgRW5hYmxlICovCisjZGVmaW5lIFhHTUFDX0RNQV9NSVNTX0ZSQU1FX0NUUiAweDAwMDAwZjIwCS8qIE1pc3NlZCBGcmFtZSBDb3VudGVyICovCisjZGVmaW5lIFhHTUFDX0RNQV9SSV9XRE9HX1RJTUVSCTB4MDAwMDBmMjQJLyogUlggSW50ciBXYXRjaGRvZyBUaW1lciAqLworI2RlZmluZSBYR01BQ19ETUFfQVhJX0JVUwkweDAwMDAwZjI4CS8qIEFYSSBCdXMgTW9kZSAqLworI2RlZmluZSBYR01BQ19ETUFfQVhJX1NUQVRVUwkweDAwMDAwZjJDCS8qIEFYSSBTdGF0dXMgKi8KKyNkZWZpbmUgWEdNQUNfRE1BX0hXX0ZFQVRVUkUJMHgwMDAwMGY1OAkvKiBFbmFibGVkIEhhcmR3YXJlIEZlYXR1cmVzICovCisKKyNkZWZpbmUgWEdNQUNfQUREUl9BRQkJMHg4MDAwMDAwMAorI2RlZmluZSBYR01BQ19NQVhfRklMVEVSX0FERFIJMzEKKworLyogUE1UIENvbnRyb2wgYW5kIFN0YXR1cyAqLworI2RlZmluZSBYR01BQ19QTVRfUE9JTlRFUl9SRVNFVAkweDgwMDAwMDAwCisjZGVmaW5lIFhHTUFDX1BNVF9HTEJMX1VOSUNBU1QJMHgwMDAwMDIwMAorI2RlZmluZSBYR01BQ19QTVRfV0FLRVVQX1JYX0ZSTQkweDAwMDAwMDQwCisjZGVmaW5lIFhHTUFDX1BNVF9NQUdJQ19QS1QJMHgwMDAwMDAyMAorI2RlZmluZSBYR01BQ19QTVRfV0FLRVVQX0ZSTV9FTgkweDAwMDAwMDA0CisjZGVmaW5lIFhHTUFDX1BNVF9NQUdJQ19QS1RfRU4JMHgwMDAwMDAwMgorI2RlZmluZSBYR01BQ19QTVRfUE9XRVJET1dOCTB4MDAwMDAwMDEKKworI2RlZmluZSBYR01BQ19DT05UUk9MX1NQRAkweDQwMDAwMDAwCS8qIFNwZWVkIGNvbnRyb2wgKi8KKyNkZWZpbmUgWEdNQUNfQ09OVFJPTF9TUERfTUFTSwkweDYwMDAwMDAwCisjZGVmaW5lIFhHTUFDX0NPTlRST0xfU1BEXzFHCTB4NjAwMDAwMDAKKyNkZWZpbmUgWEdNQUNfQ09OVFJPTF9TUERfMl81RwkweDQwMDAwMDAwCisjZGVmaW5lIFhHTUFDX0NPTlRST0xfU1BEXzEwRwkweDAwMDAwMDAwCisjZGVmaW5lIFhHTUFDX0NPTlRST0xfU0FSQwkweDEwMDAwMDAwCS8qIFNvdXJjZSBBZGRyIEluc2VydC9SZXBsYWNlICovCisjZGVmaW5lIFhHTUFDX0NPTlRST0xfU0FSS19NQVNLCTB4MTgwMDAwMDAKKyNkZWZpbmUgWEdNQUNfQ09OVFJPTF9DQVIJMHgwNDAwMDAwMAkvKiBDUkMgQWRkaXRpb24vUmVwbGFjZW1lbnQgKi8KKyNkZWZpbmUgWEdNQUNfQ09OVFJPTF9DQVJfTUFTSwkweDA2MDAwMDAwCisjZGVmaW5lIFhHTUFDX0NPTlRST0xfRFAJMHgwMTAwMDAwMAkvKiBEaXNhYmxlIFBhZGRpbmcgKi8KKyNkZWZpbmUgWEdNQUNfQ09OVFJPTF9XRAkweDAwODAwMDAwCS8qIERpc2FibGUgV2F0Y2hkb2cgb24gcnggKi8KKyNkZWZpbmUgWEdNQUNfQ09OVFJPTF9KRAkweDAwNDAwMDAwCS8qIEphYmJlciBkaXNhYmxlICovCisjZGVmaW5lIFhHTUFDX0NPTlRST0xfSkUJMHgwMDEwMDAwMAkvKiBKdW1ibyBmcmFtZSAqLworI2RlZmluZSBYR01BQ19DT05UUk9MX0xNCTB4MDAwMDEwMDAJLyogTG9vcC1iYWNrIG1vZGUgKi8KKyNkZWZpbmUgWEdNQUNfQ09OVFJPTF9JUEMJMHgwMDAwMDQwMAkvKiBDaGVja3N1bSBPZmZsb2FkICovCisjZGVmaW5lIFhHTUFDX0NPTlRST0xfQUNTCTB4MDAwMDAwODAJLyogQXV0b21hdGljIFBhZC9GQ1MgU3RyaXAgKi8KKyNkZWZpbmUgWEdNQUNfQ09OVFJPTF9ERElDCTB4MDAwMDAwMTAJLyogRGlzYWJsZSBEZWZpY2l0IElkbGUgQ291bnQgKi8KKyNkZWZpbmUgWEdNQUNfQ09OVFJPTF9URQkweDAwMDAwMDA4CS8qIFRyYW5zbWl0dGVyIEVuYWJsZSAqLworI2RlZmluZSBYR01BQ19DT05UUk9MX1JFCTB4MDAwMDAwMDQJLyogUmVjZWl2ZXIgRW5hYmxlICovCisKKy8qIFhHTUFDIEZyYW1lIEZpbHRlciBkZWZpbmVzICovCisjZGVmaW5lIFhHTUFDX0ZSQU1FX0ZJTFRFUl9QUgkweDAwMDAwMDAxCS8qIFByb21pc2N1b3VzIE1vZGUgKi8KKyNkZWZpbmUgWEdNQUNfRlJBTUVfRklMVEVSX0hVQwkweDAwMDAwMDAyCS8qIEhhc2ggVW5pY2FzdCAqLworI2RlZmluZSBYR01BQ19GUkFNRV9GSUxURVJfSE1DCTB4MDAwMDAwMDQJLyogSGFzaCBNdWx0aWNhc3QgKi8KKyNkZWZpbmUgWEdNQUNfRlJBTUVfRklMVEVSX0RBSUYJMHgwMDAwMDAwOAkvKiBEQSBJbnZlcnNlIEZpbHRlcmluZyAqLworI2RlZmluZSBYR01BQ19GUkFNRV9GSUxURVJfUE0JMHgwMDAwMDAxMAkvKiBQYXNzIGFsbCBtdWx0aWNhc3QgKi8KKyNkZWZpbmUgWEdNQUNfRlJBTUVfRklMVEVSX0RCRgkweDAwMDAwMDIwCS8qIERpc2FibGUgQnJvYWRjYXN0IGZyYW1lcyAqLworI2RlZmluZSBYR01BQ19GUkFNRV9GSUxURVJfU0FJRgkweDAwMDAwMTAwCS8qIEludmVyc2UgRmlsdGVyaW5nICovCisjZGVmaW5lIFhHTUFDX0ZSQU1FX0ZJTFRFUl9TQUYJMHgwMDAwMDIwMAkvKiBTb3VyY2UgQWRkcmVzcyBGaWx0ZXIgKi8KKyNkZWZpbmUgWEdNQUNfRlJBTUVfRklMVEVSX0hQRgkweDAwMDAwNDAwCS8qIEhhc2ggb3IgcGVyZmVjdCBGaWx0ZXIgKi8KKyNkZWZpbmUgWEdNQUNfRlJBTUVfRklMVEVSX1ZIRgkweDAwMDAwODAwCS8qIFZMQU4gSGFzaCBGaWx0ZXIgKi8KKyNkZWZpbmUgWEdNQUNfRlJBTUVfRklMVEVSX1ZQRgkweDAwMDAxMDAwCS8qIFZMQU4gUGVyZmVjdCBGaWx0ZXIgKi8KKyNkZWZpbmUgWEdNQUNfRlJBTUVfRklMVEVSX1JBCTB4ODAwMDAwMDAJLyogUmVjZWl2ZSBhbGwgbW9kZSAqLworCisvKiBYR01BQyBGTE9XIENUUkwgZGVmaW5lcyAqLworI2RlZmluZSBYR01BQ19GTE9XX0NUUkxfUFRfTUFTSwkweGZmZmYwMDAwCS8qIFBhdXNlIFRpbWUgTWFzayAqLworI2RlZmluZSBYR01BQ19GTE9XX0NUUkxfUFRfU0hJRlQJMTYKKyNkZWZpbmUgWEdNQUNfRkxPV19DVFJMX0RaUVAJMHgwMDAwMDA4MAkvKiBEaXNhYmxlIFplcm8tUXVhbnRhIFBoYXNlICovCisjZGVmaW5lIFhHTUFDX0ZMT1dfQ1RSTF9QTFQJMHgwMDAwMDAyMAkvKiBQYXVzZSBMb3cgVGhyZXNoaG9sZCAqLworI2RlZmluZSBYR01BQ19GTE9XX0NUUkxfUExUX01BU0sgMHgwMDAwMDAzMAkvKiBQTFQgTUFTSyAqLworI2RlZmluZSBYR01BQ19GTE9XX0NUUkxfVVAJMHgwMDAwMDAwOAkvKiBVbmljYXN0IFBhdXNlIEZyYW1lIERldGVjdCAqLworI2RlZmluZSBYR01BQ19GTE9XX0NUUkxfUkZFCTB4MDAwMDAwMDQJLyogUnggRmxvdyBDb250cm9sIEVuYWJsZSAqLworI2RlZmluZSBYR01BQ19GTE9XX0NUUkxfVEZFCTB4MDAwMDAwMDIJLyogVHggRmxvdyBDb250cm9sIEVuYWJsZSAqLworI2RlZmluZSBYR01BQ19GTE9XX0NUUkxfRkNCX0JQQQkweDAwMDAwMDAxCS8qIEZsb3cgQ29udHJvbCBCdXN5IC4uLiAqLworCisvKiBYR01BQ19JTlRfU1RBVCByZWcgKi8KKyNkZWZpbmUgWEdNQUNfSU5UX1NUQVRfUE1UCTB4MDA4MAkJLyogUE1UIEludGVycnVwdCBTdGF0dXMgKi8KKyNkZWZpbmUgWEdNQUNfSU5UX1NUQVRfTFBJCTB4MDA0MAkJLyogTFBJIEludGVycnVwdCBTdGF0dXMgKi8KKworLyogRE1BIEJ1cyBNb2RlIHJlZ2lzdGVyIGRlZmluZXMgKi8KKyNkZWZpbmUgRE1BX0JVU19NT0RFX1NGVF9SRVNFVAkweDAwMDAwMDAxCS8qIFNvZnR3YXJlIFJlc2V0ICovCisjZGVmaW5lIERNQV9CVVNfTU9ERV9EU0xfTUFTSwkweDAwMDAwMDdjCS8qIERlc2NyaXB0b3IgU2tpcCBMZW5ndGggKi8KKyNkZWZpbmUgRE1BX0JVU19NT0RFX0RTTF9TSElGVAkyCQkvKiAoaW4gRFdPUkRTKSAqLworI2RlZmluZSBETUFfQlVTX01PREVfQVREUwkweDAwMDAwMDgwCS8qIEFsdGVybmF0ZSBEZXNjcmlwdG9yIFNpemUgKi8KKworLyogUHJvZ3JhbW1hYmxlIGJ1cnN0IGxlbmd0aCAqLworI2RlZmluZSBETUFfQlVTX01PREVfUEJMX01BU0sJMHgwMDAwM2YwMAkvKiBQcm9ncmFtbWFibGUgQnVyc3QgTGVuICovCisjZGVmaW5lIERNQV9CVVNfTU9ERV9QQkxfU0hJRlQJOAorI2RlZmluZSBETUFfQlVTX01PREVfRkIJCTB4MDAwMTAwMDAJLyogRml4ZWQgYnVyc3QgKi8KKyNkZWZpbmUgRE1BX0JVU19NT0RFX1JQQkxfTUFTSwkweDAwM2UwMDAwCS8qIFJ4LVByb2dyYW1tYWJsZSBCdXJzdCBMZW4gKi8KKyNkZWZpbmUgRE1BX0JVU19NT0RFX1JQQkxfU0hJRlQJMTcKKyNkZWZpbmUgRE1BX0JVU19NT0RFX1VTUAkweDAwODAwMDAwCisjZGVmaW5lIERNQV9CVVNfTU9ERV84UEJMCTB4MDEwMDAwMDAKKyNkZWZpbmUgRE1BX0JVU19NT0RFX0FBTAkweDAyMDAwMDAwCisKKy8qIERNQSBCdXMgTW9kZSByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIERNQV9CVVNfUFJfUkFUSU9fTUFTSwkweDAwMDBjMDAwCS8qIFJ4L1R4IHByaW9yaXR5IHJhdGlvICovCisjZGVmaW5lIERNQV9CVVNfUFJfUkFUSU9fU0hJRlQJMTQKKyNkZWZpbmUgRE1BX0JVU19GQgkJMHgwMDAxMDAwMAkvKiBGaXhlZCBCdXJzdCAqLworCisvKiBETUEgQ29udHJvbCByZWdpc3RlciBkZWZpbmVzICovCisjZGVmaW5lIERNQV9DT05UUk9MX1NUCQkweDAwMDAyMDAwCS8qIFN0YXJ0L1N0b3AgVHJhbnNtaXNzaW9uICovCisjZGVmaW5lIERNQV9DT05UUk9MX1NSCQkweDAwMDAwMDAyCS8qIFN0YXJ0L1N0b3AgUmVjZWl2ZSAqLworI2RlZmluZSBETUFfQ09OVFJPTF9ERkYJCTB4MDEwMDAwMDAJLyogRGlzYWJsZSBmbHVzaCBvZiByeCBmcmFtZXMgKi8KKworLyogRE1BIE5vcm1hbCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgRE1BX0lOVFJfRU5BX05JRQkweDAwMDEwMDAwCS8qIE5vcm1hbCBTdW1tYXJ5ICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9BSUUJMHgwMDAwODAwMAkvKiBBYm5vcm1hbCBTdW1tYXJ5ICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9FUkUJMHgwMDAwNDAwMAkvKiBFYXJseSBSZWNlaXZlICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9GQkUJMHgwMDAwMjAwMAkvKiBGYXRhbCBCdXMgRXJyb3IgKi8KKyNkZWZpbmUgRE1BX0lOVFJfRU5BX0VURQkweDAwMDAwNDAwCS8qIEVhcmx5IFRyYW5zbWl0ICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9SV0UJMHgwMDAwMDIwMAkvKiBSZWNlaXZlIFdhdGNoZG9nICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9SU0UJMHgwMDAwMDEwMAkvKiBSZWNlaXZlIFN0b3BwZWQgKi8KKyNkZWZpbmUgRE1BX0lOVFJfRU5BX1JVRQkweDAwMDAwMDgwCS8qIFJlY2VpdmUgQnVmZmVyIFVuYXZhaWxhYmxlICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9SSUUJMHgwMDAwMDA0MAkvKiBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBETUFfSU5UUl9FTkFfVU5FCTB4MDAwMDAwMjAJLyogVHggVW5kZXJmbG93ICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9PVkUJMHgwMDAwMDAxMAkvKiBSZWNlaXZlIE92ZXJmbG93ICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9USkUJMHgwMDAwMDAwOAkvKiBUcmFuc21pdCBKYWJiZXIgKi8KKyNkZWZpbmUgRE1BX0lOVFJfRU5BX1RVRQkweDAwMDAwMDA0CS8qIFRyYW5zbWl0IEJ1ZmZlciBVbmF2YWlsICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9UU0UJMHgwMDAwMDAwMgkvKiBUcmFuc21pdCBTdG9wcGVkICovCisjZGVmaW5lIERNQV9JTlRSX0VOQV9USUUJMHgwMDAwMDAwMQkvKiBUcmFuc21pdCBJbnRlcnJ1cHQgKi8KKworI2RlZmluZSBETUFfSU5UUl9OT1JNQUwJCShETUFfSU5UUl9FTkFfTklFIHwgRE1BX0lOVFJfRU5BX1JJRSB8IFwKKwkJCQkgRE1BX0lOVFJfRU5BX1RVRSkKKworI2RlZmluZSBETUFfSU5UUl9BQk5PUk1BTAkoRE1BX0lOVFJfRU5BX0FJRSB8IERNQV9JTlRSX0VOQV9GQkUgfCBcCisJCQkJIERNQV9JTlRSX0VOQV9SV0UgfCBETUFfSU5UUl9FTkFfUlNFIHwgXAorCQkJCSBETUFfSU5UUl9FTkFfUlVFIHwgRE1BX0lOVFJfRU5BX1VORSB8IFwKKwkJCQkgRE1BX0lOVFJfRU5BX09WRSB8IERNQV9JTlRSX0VOQV9USkUgfCBcCisJCQkJIERNQV9JTlRSX0VOQV9UU0UpCisKKy8qIERNQSBkZWZhdWx0IGludGVycnVwdCBtYXNrICovCisjZGVmaW5lIERNQV9JTlRSX0RFRkFVTFRfTUFTSwkoRE1BX0lOVFJfTk9STUFMIHwgRE1BX0lOVFJfQUJOT1JNQUwpCisKKy8qIERNQSBTdGF0dXMgcmVnaXN0ZXIgZGVmaW5lcyAqLworI2RlZmluZSBETUFfU1RBVFVTX0dNSQkJMHgwODAwMDAwMAkvKiBNTUMgaW50ZXJydXB0ICovCisjZGVmaW5lIERNQV9TVEFUVVNfR0xJCQkweDA0MDAwMDAwCS8qIEdNQUMgTGluZSBpbnRlcmZhY2UgaW50ICovCisjZGVmaW5lIERNQV9TVEFUVVNfRUJfTUFTSwkweDAwMzgwMDAwCS8qIEVycm9yIEJpdHMgTWFzayAqLworI2RlZmluZSBETUFfU1RBVFVTX0VCX1RYX0FCT1JUCTB4MDAwODAwMDAJLyogRXJyb3IgQml0cyAtIFRYIEFib3J0ICovCisjZGVmaW5lIERNQV9TVEFUVVNfRUJfUlhfQUJPUlQJMHgwMDEwMDAwMAkvKiBFcnJvciBCaXRzIC0gUlggQWJvcnQgKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19UU19NQVNLCTB4MDA3MDAwMDAJLyogVHJhbnNtaXQgUHJvY2VzcyBTdGF0ZSAqLworI2RlZmluZSBETUFfU1RBVFVTX1RTX1NISUZUCTIwCisjZGVmaW5lIERNQV9TVEFUVVNfUlNfTUFTSwkweDAwMGUwMDAwCS8qIFJlY2VpdmUgUHJvY2VzcyBTdGF0ZSAqLworI2RlZmluZSBETUFfU1RBVFVTX1JTX1NISUZUCTE3CisjZGVmaW5lIERNQV9TVEFUVVNfTklTCQkweDAwMDEwMDAwCS8qIE5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSAqLworI2RlZmluZSBETUFfU1RBVFVTX0FJUwkJMHgwMDAwODAwMAkvKiBBYm5vcm1hbCBJbnRlcnJ1cHQgU3VtbWFyeSAqLworI2RlZmluZSBETUFfU1RBVFVTX0VSSQkJMHgwMDAwNDAwMAkvKiBFYXJseSBSZWNlaXZlIEludGVycnVwdCAqLworI2RlZmluZSBETUFfU1RBVFVTX0ZCSQkJMHgwMDAwMjAwMAkvKiBGYXRhbCBCdXMgRXJyb3IgSW50ZXJydXB0ICovCisjZGVmaW5lIERNQV9TVEFUVVNfRVRJCQkweDAwMDAwNDAwCS8qIEVhcmx5IFRyYW5zbWl0IEludGVycnVwdCAqLworI2RlZmluZSBETUFfU1RBVFVTX1JXVAkJMHgwMDAwMDIwMAkvKiBSZWNlaXZlIFdhdGNoZG9nIFRpbWVvdXQgKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19SUFMJCTB4MDAwMDAxMDAJLyogUmVjZWl2ZSBQcm9jZXNzIFN0b3BwZWQgKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19SVQkJMHgwMDAwMDA4MAkvKiBSZWNlaXZlIEJ1ZmZlciBVbmF2YWlsYWJsZSAqLworI2RlZmluZSBETUFfU1RBVFVTX1JJCQkweDAwMDAwMDQwCS8qIFJlY2VpdmUgSW50ZXJydXB0ICovCisjZGVmaW5lIERNQV9TVEFUVVNfVU5GCQkweDAwMDAwMDIwCS8qIFRyYW5zbWl0IFVuZGVyZmxvdyAqLworI2RlZmluZSBETUFfU1RBVFVTX09WRgkJMHgwMDAwMDAxMAkvKiBSZWNlaXZlIE92ZXJmbG93ICovCisjZGVmaW5lIERNQV9TVEFUVVNfVEpUCQkweDAwMDAwMDA4CS8qIFRyYW5zbWl0IEphYmJlciBUaW1lb3V0ICovCisjZGVmaW5lIERNQV9TVEFUVVNfVFUJCTB4MDAwMDAwMDQJLyogVHJhbnNtaXQgQnVmZmVyIFVuYXZhaWwgKi8KKyNkZWZpbmUgRE1BX1NUQVRVU19UUFMJCTB4MDAwMDAwMDIJLyogVHJhbnNtaXQgUHJvY2VzcyBTdG9wcGVkICovCisjZGVmaW5lIERNQV9TVEFUVVNfVEkJCTB4MDAwMDAwMDEJLyogVHJhbnNtaXQgSW50ZXJydXB0ICovCisKKy8qIENvbW1vbiBNQUMgZGVmaW5lcyAqLworI2RlZmluZSBNQUNfRU5BQkxFX1RYCQkweDAwMDAwMDA4CS8qIFRyYW5zbWl0dGVyIEVuYWJsZSAqLworI2RlZmluZSBNQUNfRU5BQkxFX1JYCQkweDAwMDAwMDA0CS8qIFJlY2VpdmVyIEVuYWJsZSAqLworCisvKiBYR01BQyBPcGVyYXRpb24gTW9kZSBSZWdpc3RlciAqLworI2RlZmluZSBYR01BQ19PTVJfVFNGCQkweDAwMjAwMDAwCS8qIFRYIEZJRk8gU3RvcmUgYW5kIEZvcndhcmQgKi8KKyNkZWZpbmUgWEdNQUNfT01SX0ZURgkJMHgwMDEwMDAwMAkvKiBGbHVzaCBUcmFuc21pdCBGSUZPICovCisjZGVmaW5lIFhHTUFDX09NUl9UVEMJCTB4MDAwMjAwMDAJLyogVHJhbnNtaXQgVGhyZXNoaG9sZCBDdHJsICovCisjZGVmaW5lIFhHTUFDX09NUl9UVENfTUFTSwkweDAwMDMwMDAwCisjZGVmaW5lIFhHTUFDX09NUl9SRkQJCTB4MDAwMDYwMDAJLyogRkMgRGVhY3RpdmF0aW9uIFRocmVzaGhvbGQgKi8KKyNkZWZpbmUgWEdNQUNfT01SX1JGRF9NQVNLCTB4MDAwMDcwMDAJLyogRkMgRGVhY3QgVGhyZXNoaG9sZCBNQVNLICovCisjZGVmaW5lIFhHTUFDX09NUl9SRkEJCTB4MDAwMDA2MDAJLyogRkMgQWN0aXZhdGlvbiBUaHJlc2hob2xkICovCisjZGVmaW5lIFhHTUFDX09NUl9SRkFfTUFTSwkweDAwMDAwRTAwCS8qIEZDIEFjdCBUaHJlc2hob2xkIE1BU0sgKi8KKyNkZWZpbmUgWEdNQUNfT01SX0VGQwkJMHgwMDAwMDEwMAkvKiBFbmFibGUgSGFyZHdhcmUgRkMgKi8KKyNkZWZpbmUgWEdNQUNfT01SX0ZFRgkJMHgwMDAwMDA4MAkvKiBGb3J3YXJkIEVycm9yIEZyYW1lcyAqLworI2RlZmluZSBYR01BQ19PTVJfRFQJCTB4MDAwMDAwNDAJLyogRHJvcCBUQ1AvSVAgY3N1bSBFcnJvcnMgKi8KKyNkZWZpbmUgWEdNQUNfT01SX1JTRgkJMHgwMDAwMDAyMAkvKiBSWCBGSUZPIFN0b3JlIGFuZCBGb3J3YXJkICovCisjZGVmaW5lIFhHTUFDX09NUl9SVEMJCTB4MDAwMDAwMTAJLyogUlggVGhyZXNoaG9sZCBDdHJsICovCisjZGVmaW5lIFhHTUFDX09NUl9SVENfTUFTSwkweDAwMDAwMDE4CS8qIFJYIFRocmVzaGhvbGQgQ3RybCBNQVNLICovCisKKy8qIFhHTUFDIEhXIEZlYXR1cmVzIFJlZ2lzdGVyICovCisjZGVmaW5lIERNQV9IV19GRUFUX1RYQ09FU0VMCTB4MDAwMTAwMDAJLyogVFggQ2hlY2tzdW0gb2ZmbG9hZCAqLworCisjZGVmaW5lIFhHTUFDX01NQ19DVFJMX0NOVF9GUloJMHgwMDAwMDAwOAorCisvKiBYR01BQyBEZXNjcmlwdG9yIERlZmluZXMgKi8KKyNkZWZpbmUgTUFYX0RFU0NfQlVGX1NaCQkoMHgyMDAwIC0gOCkKKworI2RlZmluZSBSWERFU0NfRVhUX1NUQVRVUwkweDAwMDAwMDAxCisjZGVmaW5lIFJYREVTQ19DUkNfRVJSCQkweDAwMDAwMDAyCisjZGVmaW5lIFJYREVTQ19SWF9FUlIJCTB4MDAwMDAwMDgKKyNkZWZpbmUgUlhERVNDX1JYX1dET0cJCTB4MDAwMDAwMTAKKyNkZWZpbmUgUlhERVNDX0ZSQU1FX1RZUEUJMHgwMDAwMDAyMAorI2RlZmluZSBSWERFU0NfR0lBTlRfRlJBTUUJMHgwMDAwMDA4MAorI2RlZmluZSBSWERFU0NfTEFTVF9TRUcJCTB4MDAwMDAxMDAKKyNkZWZpbmUgUlhERVNDX0ZJUlNUX1NFRwkweDAwMDAwMjAwCisjZGVmaW5lIFJYREVTQ19WTEFOX0ZSQU1FCTB4MDAwMDA0MDAKKyNkZWZpbmUgUlhERVNDX09WRVJGTE9XX0VSUgkweDAwMDAwODAwCisjZGVmaW5lIFJYREVTQ19MRU5HVEhfRVJSCTB4MDAwMDEwMDAKKyNkZWZpbmUgUlhERVNDX1NBX0ZJTFRFUl9GQUlMCTB4MDAwMDIwMDAKKyNkZWZpbmUgUlhERVNDX0RFU0NSSVBUT1JfRVJSCTB4MDAwMDQwMDAKKyNkZWZpbmUgUlhERVNDX0VSUk9SX1NVTU1BUlkJMHgwMDAwODAwMAorI2RlZmluZSBSWERFU0NfRlJBTUVfTEVOX09GRlNFVAkxNgorI2RlZmluZSBSWERFU0NfRlJBTUVfTEVOX01BU0sJMHgzZmZmMDAwMAorI2RlZmluZSBSWERFU0NfREFfRklMVEVSX0ZBSUwJMHg0MDAwMDAwMAorCisjZGVmaW5lIFJYREVTQzFfRU5EX1JJTkcJMHgwMDAwODAwMAorCisjZGVmaW5lIFJYREVTQ19JUF9QQVlMT0FEX01BU0sJMHgwMDAwMDAwMworI2RlZmluZSBSWERFU0NfSVBfUEFZTE9BRF9VRFAJMHgwMDAwMDAwMQorI2RlZmluZSBSWERFU0NfSVBfUEFZTE9BRF9UQ1AJMHgwMDAwMDAwMgorI2RlZmluZSBSWERFU0NfSVBfUEFZTE9BRF9JQ01QCTB4MDAwMDAwMDMKKyNkZWZpbmUgUlhERVNDX0lQX0hFQURFUl9FUlIJMHgwMDAwMDAwOAorI2RlZmluZSBSWERFU0NfSVBfUEFZTE9BRF9FUlIJMHgwMDAwMDAxMAorI2RlZmluZSBSWERFU0NfSVBWNF9QQUNLRVQJMHgwMDAwMDA0MAorI2RlZmluZSBSWERFU0NfSVBWNl9QQUNLRVQJMHgwMDAwMDA4MAorI2RlZmluZSBUWERFU0NfVU5ERVJGTE9XX0VSUgkweDAwMDAwMDAxCisjZGVmaW5lIFRYREVTQ19KQUJCRVJfVElNRU9VVAkweDAwMDAwMDAyCisjZGVmaW5lIFRYREVTQ19MT0NBTF9GQVVMVAkweDAwMDAwMDA0CisjZGVmaW5lIFRYREVTQ19SRU1PVEVfRkFVTFQJMHgwMDAwMDAwOAorI2RlZmluZSBUWERFU0NfVkxBTl9GUkFNRQkweDAwMDAwMDEwCisjZGVmaW5lIFRYREVTQ19GUkFNRV9GTFVTSEVECTB4MDAwMDAwMjAKKyNkZWZpbmUgVFhERVNDX0lQX0hFQURFUl9FUlIJMHgwMDAwMDA0MAorI2RlZmluZSBUWERFU0NfUEFZTE9BRF9DU1VNX0VSUgkweDAwMDAwMDgwCisjZGVmaW5lIFRYREVTQ19FUlJPUl9TVU1NQVJZCTB4MDAwMDgwMDAKKyNkZWZpbmUgVFhERVNDX1NBX0NUUkxfSU5TRVJUCTB4MDAwNDAwMDAKKyNkZWZpbmUgVFhERVNDX1NBX0NUUkxfUkVQTEFDRQkweDAwMDgwMDAwCisjZGVmaW5lIFRYREVTQ18yTkRfQUREUl9DSEFJTkVECTB4MDAxMDAwMDAKKyNkZWZpbmUgVFhERVNDX0VORF9SSU5HCQkweDAwMjAwMDAwCisjZGVmaW5lIFRYREVTQ19DU1VNX0lQCQkweDAwNDAwMDAwCisjZGVmaW5lIFRYREVTQ19DU1VNX0lQX1BBWUxECTB4MDA4MDAwMDAKKyNkZWZpbmUgVFhERVNDX0NTVU1fQUxMCQkweDAwQzAwMDAwCisjZGVmaW5lIFRYREVTQ19DUkNfRU5fUkVQTEFDRQkweDAxMDAwMDAwCisjZGVmaW5lIFRYREVTQ19DUkNfRU5fQVBQRU5ECTB4MDIwMDAwMDAKKyNkZWZpbmUgVFhERVNDX0RJU0FCTEVfUEFECTB4MDQwMDAwMDAKKyNkZWZpbmUgVFhERVNDX0ZJUlNUX1NFRwkweDEwMDAwMDAwCisjZGVmaW5lIFRYREVTQ19MQVNUX1NFRwkJMHgyMDAwMDAwMAorI2RlZmluZSBUWERFU0NfSU5URVJSVVBUCTB4NDAwMDAwMDAKKworI2RlZmluZSBERVNDX09XTgkJMHg4MDAwMDAwMAorI2RlZmluZSBERVNDX0JVRkZFUjFfU1pfTUFTSwkweDAwMDAxZmZmCisjZGVmaW5lIERFU0NfQlVGRkVSMl9TWl9NQVNLCTB4MWZmZjAwMDAKKyNkZWZpbmUgREVTQ19CVUZGRVIyX1NaX09GRlNFVAkxNgorCitzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgeworCV9fbGUzMiBmbGFnczsKKwlfX2xlMzIgYnVmX3NpemU7CisJX19sZTMyIGJ1ZjFfYWRkcjsJCS8qIEJ1ZmZlciAxIEFkZHJlc3MgUG9pbnRlciAqLworCV9fbGUzMiBidWYyX2FkZHI7CQkvKiBCdWZmZXIgMiBBZGRyZXNzIFBvaW50ZXIgKi8KKwlfX2xlMzIgZXh0X3N0YXR1czsKKwlfX2xlMzIgcmVzWzNdOworfTsKKworc3RydWN0IHhnbWFjX2V4dHJhX3N0YXRzIHsKKwkvKiBUcmFuc21pdCBlcnJvcnMgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2phYmJlcjsKKwl1bnNpZ25lZCBsb25nIHR4X2ZyYW1lX2ZsdXNoZWQ7CisJdW5zaWduZWQgbG9uZyB0eF9wYXlsb2FkX2Vycm9yOworCXVuc2lnbmVkIGxvbmcgdHhfaXBfaGVhZGVyX2Vycm9yOworCXVuc2lnbmVkIGxvbmcgdHhfbG9jYWxfZmF1bHQ7CisJdW5zaWduZWQgbG9uZyB0eF9yZW1vdGVfZmF1bHQ7CisJLyogUmVjZWl2ZSBlcnJvcnMgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X3dhdGNoZG9nOworCXVuc2lnbmVkIGxvbmcgcnhfZGFfZmlsdGVyX2ZhaWw7CisJdW5zaWduZWQgbG9uZyByeF9zYV9maWx0ZXJfZmFpbDsKKwl1bnNpZ25lZCBsb25nIHJ4X3BheWxvYWRfZXJyb3I7CisJdW5zaWduZWQgbG9uZyByeF9pcF9oZWFkZXJfZXJyb3I7CisJLyogVHgvUnggSVJRIGVycm9ycyAqLworCXVuc2lnbmVkIGxvbmcgdHhfdW5kZWZsb3c7CisJdW5zaWduZWQgbG9uZyB0eF9wcm9jZXNzX3N0b3BwZWQ7CisJdW5zaWduZWQgbG9uZyByeF9idWZfdW5hdjsKKwl1bnNpZ25lZCBsb25nIHJ4X3Byb2Nlc3Nfc3RvcHBlZDsKKwl1bnNpZ25lZCBsb25nIHR4X2Vhcmx5OworCXVuc2lnbmVkIGxvbmcgZmF0YWxfYnVzX2Vycm9yOworfTsKKworc3RydWN0IHhnbWFjX3ByaXYgeworCXN0cnVjdCB4Z21hY19kbWFfZGVzYyAqZG1hX3J4OworCXN0cnVjdCBza19idWZmICoqcnhfc2tidWZmOworCXVuc2lnbmVkIGludCByeF90YWlsOworCXVuc2lnbmVkIGludCByeF9oZWFkOworCisJc3RydWN0IHhnbWFjX2RtYV9kZXNjICpkbWFfdHg7CisJc3RydWN0IHNrX2J1ZmYgKip0eF9za2J1ZmY7CisJdW5zaWduZWQgaW50IHR4X2hlYWQ7CisJdW5zaWduZWQgaW50IHR4X3RhaWw7CisKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCByeF9yZWN5Y2xlOworCXVuc2lnbmVkIGludCBkbWFfYnVmX3N6OworCWRtYV9hZGRyX3QgZG1hX3J4X3BoeTsKKwlkbWFfYWRkcl90IGRtYV90eF9waHk7CisKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBkZXZpY2UgKmRldmljZTsKKwlzdHJ1Y3QgbmFwaV9zdHJ1Y3QgbmFwaTsKKworCXN0cnVjdCB4Z21hY19leHRyYV9zdGF0cyB4c3RhdHM7CisKKwlzcGlubG9ja190IHN0YXRzX2xvY2s7CisJaW50IHBtdF9pcnE7CisJY2hhciByeF9wYXVzZTsKKwljaGFyIHR4X3BhdXNlOworCWludCB3b2xvcHRzOworfTsKKworLyogWEdNQUMgQ29uZmlndXJhdGlvbiBTZXR0aW5ncyAqLworI2RlZmluZSBNQVhfTVRVCQkJOTAwMAorI2RlZmluZSBQQVVTRV9USU1FCQkweDQwMAorCisjZGVmaW5lIERNQV9SWF9SSU5HX1NaCQkyNTYKKyNkZWZpbmUgRE1BX1RYX1JJTkdfU1oJCTEyOAorLyogbWluaW11bSBudW1iZXIgb2YgZnJlZSBUWCBkZXNjcmlwdG9ycyByZXF1aXJlZCB0byB3YWtlIHVwIFRYIHByb2Nlc3MgKi8KKyNkZWZpbmUgVFhfVEhSRVNICQkoRE1BX1RYX1JJTkdfU1ovNCkKKworLyogRE1BIGRlc2NyaXB0b3IgcmluZyBoZWxwZXJzICovCisjZGVmaW5lIGRtYV9yaW5nX2luY3IobiwgcykJKCgobikgKyAxKSAmICgocykgLSAxKSkKKyNkZWZpbmUgZG1hX3Jpbmdfc3BhY2UoaCwgdCwgcykJQ0lSQ19TUEFDRShoLCB0LCBzKQorI2RlZmluZSBkbWFfcmluZ19jbnQoaCwgdCwgcykJQ0lSQ19DTlQoaCwgdCwgcykKKworLyogWEdNQUMgRGVzY3JpcHRvciBBY2Nlc3MgSGVscGVycyAqLworc3RhdGljIGlubGluZSB2b2lkIGRlc2Nfc2V0X2J1Zl9sZW4oc3RydWN0IHhnbWFjX2RtYV9kZXNjICpwLCB1MzIgYnVmX3N6KQoreworCWlmIChidWZfc3ogPiBNQVhfREVTQ19CVUZfU1opCisJCXAtPmJ1Zl9zaXplID0gY3B1X3RvX2xlMzIoTUFYX0RFU0NfQlVGX1NaIHwKKwkJCShidWZfc3ogLSBNQVhfREVTQ19CVUZfU1opIDw8IERFU0NfQlVGRkVSMl9TWl9PRkZTRVQpOworCWVsc2UKKwkJcC0+YnVmX3NpemUgPSBjcHVfdG9fbGUzMihidWZfc3opOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZXNjX2dldF9idWZfbGVuKHN0cnVjdCB4Z21hY19kbWFfZGVzYyAqcCkKK3sKKwl1MzIgbGVuID0gY3B1X3RvX2xlMzIocC0+ZmxhZ3MpOworCXJldHVybiAobGVuICYgREVTQ19CVUZGRVIxX1NaX01BU0spICsKKwkJKChsZW4gJiBERVNDX0JVRkZFUjJfU1pfTUFTSykgPj4gREVTQ19CVUZGRVIyX1NaX09GRlNFVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXNjX2luaXRfcnhfZGVzYyhzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgKnAsIGludCByaW5nX3NpemUsCisJCQkJICAgICBpbnQgYnVmX3N6KQoreworCXN0cnVjdCB4Z21hY19kbWFfZGVzYyAqZW5kID0gcCArIHJpbmdfc2l6ZSAtIDE7CisKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSAqIHJpbmdfc2l6ZSk7CisKKwlmb3IgKDsgcCA8PSBlbmQ7IHArKykKKwkJZGVzY19zZXRfYnVmX2xlbihwLCBidWZfc3opOworCisJZW5kLT5idWZfc2l6ZSB8PSBjcHVfdG9fbGUzMihSWERFU0MxX0VORF9SSU5HKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlc2NfaW5pdF90eF9kZXNjKHN0cnVjdCB4Z21hY19kbWFfZGVzYyAqcCwgdTMyIHJpbmdfc2l6ZSkKK3sKKwltZW1zZXQocCwgMCwgc2l6ZW9mKCpwKSAqIHJpbmdfc2l6ZSk7CisJcFtyaW5nX3NpemUgLSAxXS5mbGFncyA9IGNwdV90b19sZTMyKFRYREVTQ19FTkRfUklORyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlc2NfZ2V0X293bmVyKHN0cnVjdCB4Z21hY19kbWFfZGVzYyAqcCkKK3sKKwlyZXR1cm4gbGUzMl90b19jcHUocC0+ZmxhZ3MpICYgREVTQ19PV047Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXNjX3NldF9yeF9vd25lcihzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgKnApCit7CisJLyogQ2xlYXIgYWxsIGZpZWxkcyBhbmQgc2V0IHRoZSBvd25lciAqLworCXAtPmZsYWdzID0gY3B1X3RvX2xlMzIoREVTQ19PV04pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVzY19zZXRfdHhfb3duZXIoc3RydWN0IHhnbWFjX2RtYV9kZXNjICpwLCB1MzIgZmxhZ3MpCit7CisJdTMyIHRtcGZsYWdzID0gbGUzMl90b19jcHUocC0+ZmxhZ3MpOworCXRtcGZsYWdzICY9IFRYREVTQ19FTkRfUklORzsKKwl0bXBmbGFncyB8PSBmbGFncyB8IERFU0NfT1dOOworCXAtPmZsYWdzID0gY3B1X3RvX2xlMzIodG1wZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBkZXNjX2dldF90eF9scyhzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgKnApCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KHAtPmZsYWdzKSAmIFRYREVTQ19MQVNUX1NFRzsKK30KKworc3RhdGljIGlubGluZSB1MzIgZGVzY19nZXRfYnVmX2FkZHIoc3RydWN0IHhnbWFjX2RtYV9kZXNjICpwKQoreworCXJldHVybiBsZTMyX3RvX2NwdShwLT5idWYxX2FkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVzY19zZXRfYnVmX2FkZHIoc3RydWN0IHhnbWFjX2RtYV9kZXNjICpwLAorCQkJCSAgICAgdTMyIHBhZGRyLCBpbnQgbGVuKQoreworCXAtPmJ1ZjFfYWRkciA9IGNwdV90b19sZTMyKHBhZGRyKTsKKwlpZiAobGVuID4gTUFYX0RFU0NfQlVGX1NaKQorCQlwLT5idWYyX2FkZHIgPSBjcHVfdG9fbGUzMihwYWRkciArIE1BWF9ERVNDX0JVRl9TWik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXNjX3NldF9idWZfYWRkcl9hbmRfc2l6ZShzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgKnAsCisJCQkJCSAgICAgIHUzMiBwYWRkciwgaW50IGxlbikKK3sKKwlkZXNjX3NldF9idWZfbGVuKHAsIGxlbik7CisJZGVzY19zZXRfYnVmX2FkZHIocCwgcGFkZHIsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlc2NfZ2V0X3J4X2ZyYW1lX2xlbihzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgKnApCit7CisJdTMyIGRhdGEgPSBsZTMyX3RvX2NwdShwLT5mbGFncyk7CisJdTMyIGxlbiA9IChkYXRhICYgUlhERVNDX0ZSQU1FX0xFTl9NQVNLKSA+PiBSWERFU0NfRlJBTUVfTEVOX09GRlNFVDsKKwlpZiAoZGF0YSAmIFJYREVTQ19GUkFNRV9UWVBFKQorCQlsZW4gLT0gRVRIX0ZDU19MRU47CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZCB4Z21hY19kbWFfZmx1c2hfdHhfZmlmbyh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwlpbnQgdGltZW91dCA9IDEwMDA7CisJdTMyIHJlZyA9IHJlYWRsKGlvYWRkciArIFhHTUFDX09NUik7CisJd3JpdGVsKHJlZyB8IFhHTUFDX09NUl9GVEYsIGlvYWRkciArIFhHTUFDX09NUik7CisKKwl3aGlsZSAoKHRpbWVvdXQtLSA+IDApICYmIHJlYWRsKGlvYWRkciArIFhHTUFDX09NUikgJiBYR01BQ19PTVJfRlRGKQorCQl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyBpbnQgZGVzY19nZXRfdHhfc3RhdHVzKHN0cnVjdCB4Z21hY19wcml2ICpwcml2LCBzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgKnApCit7CisJc3RydWN0IHhnbWFjX2V4dHJhX3N0YXRzICp4ID0gJnByaXYtPnhzdGF0czsKKwl1MzIgc3RhdHVzID0gbGUzMl90b19jcHUocC0+ZmxhZ3MpOworCisJaWYgKCEoc3RhdHVzICYgVFhERVNDX0VSUk9SX1NVTU1BUlkpKQorCQlyZXR1cm4gMDsKKworCW5ldGRldl9kYmcocHJpdi0+ZGV2LCAidHggZGVzYyBlcnJvciA9IDB4JTA4eFxuIiwgc3RhdHVzKTsKKwlpZiAoc3RhdHVzICYgVFhERVNDX0pBQkJFUl9USU1FT1VUKQorCQl4LT50eF9qYWJiZXIrKzsKKwlpZiAoc3RhdHVzICYgVFhERVNDX0ZSQU1FX0ZMVVNIRUQpCisJCXgtPnR4X2ZyYW1lX2ZsdXNoZWQrKzsKKwlpZiAoc3RhdHVzICYgVFhERVNDX1VOREVSRkxPV19FUlIpCisJCXhnbWFjX2RtYV9mbHVzaF90eF9maWZvKHByaXYtPmJhc2UpOworCWlmIChzdGF0dXMgJiBUWERFU0NfSVBfSEVBREVSX0VSUikKKwkJeC0+dHhfaXBfaGVhZGVyX2Vycm9yKys7CisJaWYgKHN0YXR1cyAmIFRYREVTQ19MT0NBTF9GQVVMVCkKKwkJeC0+dHhfbG9jYWxfZmF1bHQrKzsKKwlpZiAoc3RhdHVzICYgVFhERVNDX1JFTU9URV9GQVVMVCkKKwkJeC0+dHhfcmVtb3RlX2ZhdWx0Kys7CisJaWYgKHN0YXR1cyAmIFRYREVTQ19QQVlMT0FEX0NTVU1fRVJSKQorCQl4LT50eF9wYXlsb2FkX2Vycm9yKys7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgZGVzY19nZXRfcnhfc3RhdHVzKHN0cnVjdCB4Z21hY19wcml2ICpwcml2LCBzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgKnApCit7CisJc3RydWN0IHhnbWFjX2V4dHJhX3N0YXRzICp4ID0gJnByaXYtPnhzdGF0czsKKwlpbnQgcmV0ID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CisJdTMyIHN0YXR1cyA9IGxlMzJfdG9fY3B1KHAtPmZsYWdzKTsKKwl1MzIgZXh0X3N0YXR1cyA9IGxlMzJfdG9fY3B1KHAtPmV4dF9zdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIFJYREVTQ19EQV9GSUxURVJfRkFJTCkgeworCQluZXRkZXZfZGJnKHByaXYtPmRldiwgIlhHTUFDIFJYIDogRGVzdCBBZGRyZXNzIGZpbHRlciBmYWlsXG4iKTsKKwkJeC0+cnhfZGFfZmlsdGVyX2ZhaWwrKzsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENoZWNrIGlmIHBhY2tldCBoYXMgY2hlY2tzdW0gYWxyZWFkeSAqLworCWlmICgoc3RhdHVzICYgUlhERVNDX0ZSQU1FX1RZUEUpICYmIChzdGF0dXMgJiBSWERFU0NfRVhUX1NUQVRVUykgJiYKKwkJIShleHRfc3RhdHVzICYgUlhERVNDX0lQX1BBWUxPQURfTUFTSykpCisJCXJldCA9IENIRUNLU1VNX05PTkU7CisKKwluZXRkZXZfZGJnKHByaXYtPmRldiwgInJ4IHN0YXR1cyAtIGZyYW1lIHR5cGU9JWQsIGNzdW0gPSAlZCwgZXh0IHN0YXQgJTA4eFxuIiwKKwkJICAgKHN0YXR1cyAmIFJYREVTQ19GUkFNRV9UWVBFKSA/IDEgOiAwLCByZXQsIGV4dF9zdGF0dXMpOworCisJaWYgKCEoc3RhdHVzICYgUlhERVNDX0VSUk9SX1NVTU1BUlkpKQorCQlyZXR1cm4gcmV0OworCisJLyogSGFuZGxlIGFueSBlcnJvcnMgKi8KKwlpZiAoc3RhdHVzICYgKFJYREVTQ19ERVNDUklQVE9SX0VSUiB8IFJYREVTQ19PVkVSRkxPV19FUlIgfAorCQlSWERFU0NfR0lBTlRfRlJBTUUgfCBSWERFU0NfTEVOR1RIX0VSUiB8IFJYREVTQ19DUkNfRVJSKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHN0YXR1cyAmIFJYREVTQ19FWFRfU1RBVFVTKSB7CisJCWlmIChleHRfc3RhdHVzICYgUlhERVNDX0lQX0hFQURFUl9FUlIpCisJCQl4LT5yeF9pcF9oZWFkZXJfZXJyb3IrKzsKKwkJaWYgKGV4dF9zdGF0dXMgJiBSWERFU0NfSVBfUEFZTE9BRF9FUlIpCisJCQl4LT5yeF9wYXlsb2FkX2Vycm9yKys7CisJCW5ldGRldl9kYmcocHJpdi0+ZGV2LCAiSVAgY2hlY2tzdW0gZXJyb3IgLSBzdGF0ICUwOHhcbiIsCisJCQkgICBleHRfc3RhdHVzKTsKKwkJcmV0dXJuIENIRUNLU1VNX05PTkU7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHhnbWFjX21hY19lbmFibGUodm9pZCBfX2lvbWVtICppb2FkZHIpCit7CisJdTMyIHZhbHVlID0gcmVhZGwoaW9hZGRyICsgWEdNQUNfQ09OVFJPTCk7CisJdmFsdWUgfD0gTUFDX0VOQUJMRV9SWCB8IE1BQ19FTkFCTEVfVFg7CisJd3JpdGVsKHZhbHVlLCBpb2FkZHIgKyBYR01BQ19DT05UUk9MKTsKKworCXZhbHVlID0gcmVhZGwoaW9hZGRyICsgWEdNQUNfRE1BX0NPTlRST0wpOworCXZhbHVlIHw9IERNQV9DT05UUk9MX1NUIHwgRE1BX0NPTlRST0xfU1I7CisJd3JpdGVsKHZhbHVlLCBpb2FkZHIgKyBYR01BQ19ETUFfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4Z21hY19tYWNfZGlzYWJsZSh2b2lkIF9faW9tZW0gKmlvYWRkcikKK3sKKwl1MzIgdmFsdWUgPSByZWFkbChpb2FkZHIgKyBYR01BQ19ETUFfQ09OVFJPTCk7CisJdmFsdWUgJj0gfihETUFfQ09OVFJPTF9TVCB8IERNQV9DT05UUk9MX1NSKTsKKwl3cml0ZWwodmFsdWUsIGlvYWRkciArIFhHTUFDX0RNQV9DT05UUk9MKTsKKworCXZhbHVlID0gcmVhZGwoaW9hZGRyICsgWEdNQUNfQ09OVFJPTCk7CisJdmFsdWUgJj0gfihNQUNfRU5BQkxFX1RYIHwgTUFDX0VOQUJMRV9SWCk7CisJd3JpdGVsKHZhbHVlLCBpb2FkZHIgKyBYR01BQ19DT05UUk9MKTsKK30KKworc3RhdGljIHZvaWQgeGdtYWNfc2V0X21hY19hZGRyKHZvaWQgX19pb21lbSAqaW9hZGRyLCB1bnNpZ25lZCBjaGFyICphZGRyLAorCQkJICAgICAgIGludCBudW0pCit7CisJdTMyIGRhdGE7CisKKwlkYXRhID0gKGFkZHJbNV0gPDwgOCkgfCBhZGRyWzRdIHwgKG51bSA/IFhHTUFDX0FERFJfQUUgOiAwKTsKKwl3cml0ZWwoZGF0YSwgaW9hZGRyICsgWEdNQUNfQUREUl9ISUdIKG51bSkpOworCWRhdGEgPSAoYWRkclszXSA8PCAyNCkgfCAoYWRkclsyXSA8PCAxNikgfCAoYWRkclsxXSA8PCA4KSB8IGFkZHJbMF07CisJd3JpdGVsKGRhdGEsIGlvYWRkciArIFhHTUFDX0FERFJfTE9XKG51bSkpOworfQorCitzdGF0aWMgdm9pZCB4Z21hY19nZXRfbWFjX2FkZHIodm9pZCBfX2lvbWVtICppb2FkZHIsIHVuc2lnbmVkIGNoYXIgKmFkZHIsCisJCQkgICAgICAgaW50IG51bSkKK3sKKwl1MzIgaGlfYWRkciwgbG9fYWRkcjsKKworCS8qIFJlYWQgdGhlIE1BQyBhZGRyZXNzIGZyb20gdGhlIGhhcmR3YXJlICovCisJaGlfYWRkciA9IHJlYWRsKGlvYWRkciArIFhHTUFDX0FERFJfSElHSChudW0pKTsKKwlsb19hZGRyID0gcmVhZGwoaW9hZGRyICsgWEdNQUNfQUREUl9MT1cobnVtKSk7CisKKwkvKiBFeHRyYWN0IHRoZSBNQUMgYWRkcmVzcyBmcm9tIHRoZSBoaWdoIGFuZCBsb3cgd29yZHMgKi8KKwlhZGRyWzBdID0gbG9fYWRkciAmIDB4ZmY7CisJYWRkclsxXSA9IChsb19hZGRyID4+IDgpICYgMHhmZjsKKwlhZGRyWzJdID0gKGxvX2FkZHIgPj4gMTYpICYgMHhmZjsKKwlhZGRyWzNdID0gKGxvX2FkZHIgPj4gMjQpICYgMHhmZjsKKwlhZGRyWzRdID0gaGlfYWRkciAmIDB4ZmY7CisJYWRkcls1XSA9IChoaV9hZGRyID4+IDgpICYgMHhmZjsKK30KKworc3RhdGljIGludCB4Z21hY19zZXRfZmxvd19jdHJsKHN0cnVjdCB4Z21hY19wcml2ICpwcml2LCBpbnQgcngsIGludCB0eCkKK3sKKwl1MzIgcmVnOworCXVuc2lnbmVkIGludCBmbG93ID0gMDsKKworCXByaXYtPnJ4X3BhdXNlID0gcng7CisJcHJpdi0+dHhfcGF1c2UgPSB0eDsKKworCWlmIChyeCB8fCB0eCkgeworCQlpZiAocngpCisJCQlmbG93IHw9IFhHTUFDX0ZMT1dfQ1RSTF9SRkU7CisJCWlmICh0eCkKKwkJCWZsb3cgfD0gWEdNQUNfRkxPV19DVFJMX1RGRTsKKworCQlmbG93IHw9IFhHTUFDX0ZMT1dfQ1RSTF9QTFQgfCBYR01BQ19GTE9XX0NUUkxfVVA7CisJCWZsb3cgfD0gKFBBVVNFX1RJTUUgPDwgWEdNQUNfRkxPV19DVFJMX1BUX1NISUZUKTsKKworCQl3cml0ZWwoZmxvdywgcHJpdi0+YmFzZSArIFhHTUFDX0ZMT1dfQ1RSTCk7CisKKwkJcmVnID0gcmVhZGwocHJpdi0+YmFzZSArIFhHTUFDX09NUik7CisJCXJlZyB8PSBYR01BQ19PTVJfRUZDOworCQl3cml0ZWwocmVnLCBwcml2LT5iYXNlICsgWEdNQUNfT01SKTsKKwl9IGVsc2UgeworCQl3cml0ZWwoMCwgcHJpdi0+YmFzZSArIFhHTUFDX0ZMT1dfQ1RSTCk7CisKKwkJcmVnID0gcmVhZGwocHJpdi0+YmFzZSArIFhHTUFDX09NUik7CisJCXJlZyAmPSB+WEdNQUNfT01SX0VGQzsKKwkJd3JpdGVsKHJlZywgcHJpdi0+YmFzZSArIFhHTUFDX09NUik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhnbWFjX3J4X3JlZmlsbChzdHJ1Y3QgeGdtYWNfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgKnA7CisJZG1hX2FkZHJfdCBwYWRkcjsKKworCXdoaWxlIChkbWFfcmluZ19zcGFjZShwcml2LT5yeF9oZWFkLCBwcml2LT5yeF90YWlsLCBETUFfUlhfUklOR19TWikgPiAxKSB7CisJCWludCBlbnRyeSA9IHByaXYtPnJ4X2hlYWQ7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJcCA9IHByaXYtPmRtYV9yeCArIGVudHJ5OworCisJCWlmIChwcml2LT5yeF9za2J1ZmZbZW50cnldICE9IE5VTEwpCisJCQljb250aW51ZTsKKworCQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZwcml2LT5yeF9yZWN5Y2xlKTsKKwkJaWYgKHNrYiA9PSBOVUxMKQorCQkJc2tiID0gbmV0ZGV2X2FsbG9jX3NrYihwcml2LT5kZXYsIHByaXYtPmRtYV9idWZfc3opOworCQlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKQorCQkJYnJlYWs7CisKKwkJcHJpdi0+cnhfc2tidWZmW2VudHJ5XSA9IHNrYjsKKwkJcGFkZHIgPSBkbWFfbWFwX3NpbmdsZShwcml2LT5kZXZpY2UsIHNrYi0+ZGF0YSwKKwkJCQkJIHByaXYtPmRtYV9idWZfc3osIERNQV9GUk9NX0RFVklDRSk7CisJCWRlc2Nfc2V0X2J1Zl9hZGRyKHAsIHBhZGRyLCBwcml2LT5kbWFfYnVmX3N6KTsKKworCQluZXRkZXZfZGJnKHByaXYtPmRldiwgInJ4IHJpbmc6IGhlYWQgJWQsIHRhaWwgJWRcbiIsCisJCQlwcml2LT5yeF9oZWFkLCBwcml2LT5yeF90YWlsKTsKKworCQlwcml2LT5yeF9oZWFkID0gZG1hX3JpbmdfaW5jcihwcml2LT5yeF9oZWFkLCBETUFfUlhfUklOR19TWik7CisJCS8qIEVuc3VyZSBkZXNjcmlwdG9yIGlzIGluIG1lbW9yeSBiZWZvcmUgaGFuZGluZyB0byBoL3cgKi8KKwkJd21iKCk7CisJCWRlc2Nfc2V0X3J4X293bmVyKHApOworCX0KK30KKworLyoqCisgKiBpbml0X3hnbWFjX2RtYV9kZXNjX3JpbmdzIC0gaW5pdCB0aGUgUlgvVFggZGVzY3JpcHRvciByaW5ncworICogQGRldjogbmV0IGRldmljZSBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uOiAgdGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgRE1BIFJYL1RYIGRlc2NyaXB0b3JzCisgKiBhbmQgYWxsb2NhdGVzIHRoZSBzb2NrZXQgYnVmZmVycy4KKyAqLworc3RhdGljIGludCB4Z21hY19kbWFfZGVzY19yaW5nc19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhnbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBiZnNpemU7CisKKwkvKiBTZXQgdGhlIEJ1ZmZlciBzaXplIGFjY29yZGluZyB0byB0aGUgTVRVOworCSAqIGluZGVlZCwgaW4gY2FzZSBvZiBqdW1ibyB3ZSBuZWVkIHRvIGJ1bXAtdXAgdGhlIGJ1ZmZlciBzaXplcy4KKwkgKi8KKwliZnNpemUgPSBBTElHTihkZXYtPm10dSArIEVUSF9ITEVOICsgRVRIX0ZDU19MRU4gKyBORVRfSVBfQUxJR04gKyA2NCwKKwkJICAgICAgIDY0KTsKKworCW5ldGRldl9kYmcocHJpdi0+ZGV2LCAibXR1IFslZF0gYmZzaXplIFslZF1cbiIsIGRldi0+bXR1LCBiZnNpemUpOworCisJcHJpdi0+cnhfc2tidWZmID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHNrX2J1ZmYgKikgKiBETUFfUlhfUklOR19TWiwKKwkJCQkgIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+cnhfc2tidWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPmRtYV9yeCA9IGRtYV9hbGxvY19jb2hlcmVudChwcml2LT5kZXZpY2UsCisJCQkJCSAgRE1BX1JYX1JJTkdfU1ogKgorCQkJCQkgIHNpemVvZihzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MpLAorCQkJCQkgICZwcml2LT5kbWFfcnhfcGh5LAorCQkJCQkgIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+ZG1hX3J4KQorCQlnb3RvIGVycl9kbWFfcng7CisKKwlwcml2LT50eF9za2J1ZmYgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc2tfYnVmZiAqKSAqIERNQV9UWF9SSU5HX1NaLAorCQkJCSAgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcml2LT50eF9za2J1ZmYpCisJCWdvdG8gZXJyX3R4X3NrYjsKKworCXByaXYtPmRtYV90eCA9IGRtYV9hbGxvY19jb2hlcmVudChwcml2LT5kZXZpY2UsCisJCQkJCSAgRE1BX1RYX1JJTkdfU1ogKgorCQkJCQkgIHNpemVvZihzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MpLAorCQkJCQkgICZwcml2LT5kbWFfdHhfcGh5LAorCQkJCQkgIEdGUF9LRVJORUwpOworCWlmICghcHJpdi0+ZG1hX3R4KQorCQlnb3RvIGVycl9kbWFfdHg7CisKKwluZXRkZXZfZGJnKHByaXYtPmRldiwgIkRNQSBkZXNjIHJpbmdzOiB2aXJ0IGFkZHIgKFJ4ICVwLCAiCisJICAgICJUeCAlcClcblx0RE1BIHBoeSBhZGRyIChSeCAweCUwOHgsIFR4IDB4JTA4eClcbiIsCisJICAgIHByaXYtPmRtYV9yeCwgcHJpdi0+ZG1hX3R4LAorCSAgICAodW5zaWduZWQgaW50KXByaXYtPmRtYV9yeF9waHksICh1bnNpZ25lZCBpbnQpcHJpdi0+ZG1hX3R4X3BoeSk7CisKKwlwcml2LT5yeF90YWlsID0gMDsKKwlwcml2LT5yeF9oZWFkID0gMDsKKwlwcml2LT5kbWFfYnVmX3N6ID0gYmZzaXplOworCWRlc2NfaW5pdF9yeF9kZXNjKHByaXYtPmRtYV9yeCwgRE1BX1JYX1JJTkdfU1osIHByaXYtPmRtYV9idWZfc3opOworCXhnbWFjX3J4X3JlZmlsbChwcml2KTsKKworCXByaXYtPnR4X3RhaWwgPSAwOworCXByaXYtPnR4X2hlYWQgPSAwOworCWRlc2NfaW5pdF90eF9kZXNjKHByaXYtPmRtYV90eCwgRE1BX1RYX1JJTkdfU1opOworCisJd3JpdGVsKHByaXYtPmRtYV90eF9waHksIHByaXYtPmJhc2UgKyBYR01BQ19ETUFfVFhfQkFTRV9BRERSKTsKKwl3cml0ZWwocHJpdi0+ZG1hX3J4X3BoeSwgcHJpdi0+YmFzZSArIFhHTUFDX0RNQV9SWF9CQVNFX0FERFIpOworCisJcmV0dXJuIDA7CisKK2Vycl9kbWFfdHg6CisJa2ZyZWUocHJpdi0+dHhfc2tidWZmKTsKK2Vycl90eF9za2I6CisJZG1hX2ZyZWVfY29oZXJlbnQocHJpdi0+ZGV2aWNlLAorCQkJICBETUFfUlhfUklOR19TWiAqIHNpemVvZihzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MpLAorCQkJICBwcml2LT5kbWFfcngsIHByaXYtPmRtYV9yeF9waHkpOworZXJyX2RtYV9yeDoKKwlrZnJlZShwcml2LT5yeF9za2J1ZmYpOworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgdm9pZCB4Z21hY19mcmVlX3J4X3NrYnVmcyhzdHJ1Y3QgeGdtYWNfcHJpdiAqcHJpdikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgKnA7CisKKwlpZiAoIXByaXYtPnJ4X3NrYnVmZikKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IERNQV9SWF9SSU5HX1NaOyBpKyspIHsKKwkJaWYgKHByaXYtPnJ4X3NrYnVmZltpXSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJcCA9IHByaXYtPmRtYV9yeCArIGk7CisJCWRtYV91bm1hcF9zaW5nbGUocHJpdi0+ZGV2aWNlLCBkZXNjX2dldF9idWZfYWRkcihwKSwKKwkJCQkgcHJpdi0+ZG1hX2J1Zl9zeiwgRE1BX0ZST01fREVWSUNFKTsKKwkJZGV2X2tmcmVlX3NrYl9hbnkocHJpdi0+cnhfc2tidWZmW2ldKTsKKwkJcHJpdi0+cnhfc2tidWZmW2ldID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhnbWFjX2ZyZWVfdHhfc2tidWZzKHN0cnVjdCB4Z21hY19wcml2ICpwcml2KQoreworCWludCBpLCBmOworCXN0cnVjdCB4Z21hY19kbWFfZGVzYyAqcDsKKworCWlmICghcHJpdi0+dHhfc2tidWZmKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgRE1BX1RYX1JJTkdfU1o7IGkrKykgeworCQlpZiAocHJpdi0+dHhfc2tidWZmW2ldID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlwID0gcHJpdi0+ZG1hX3R4ICsgaTsKKwkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5kZXZpY2UsIGRlc2NfZ2V0X2J1Zl9hZGRyKHApLAorCQkJCSBkZXNjX2dldF9idWZfbGVuKHApLCBETUFfVE9fREVWSUNFKTsKKworCQlmb3IgKGYgPSAwOyBmIDwgc2tiX3NoaW5mbyhwcml2LT50eF9za2J1ZmZbaV0pLT5ucl9mcmFnczsgZisrKSB7CisJCQlwID0gcHJpdi0+ZG1hX3R4ICsgaSsrOworCQkJZG1hX3VubWFwX3BhZ2UocHJpdi0+ZGV2aWNlLCBkZXNjX2dldF9idWZfYWRkcihwKSwKKwkJCQkgICAgICAgZGVzY19nZXRfYnVmX2xlbihwKSwgRE1BX1RPX0RFVklDRSk7CisJCX0KKworCQlkZXZfa2ZyZWVfc2tiX2FueShwcml2LT50eF9za2J1ZmZbaV0pOworCQlwcml2LT50eF9za2J1ZmZbaV0gPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgeGdtYWNfZnJlZV9kbWFfZGVzY19yaW5ncyhzdHJ1Y3QgeGdtYWNfcHJpdiAqcHJpdikKK3sKKwkvKiBSZWxlYXNlIHRoZSBETUEgVFgvUlggc29ja2V0IGJ1ZmZlcnMgKi8KKwl4Z21hY19mcmVlX3J4X3NrYnVmcyhwcml2KTsKKwl4Z21hY19mcmVlX3R4X3NrYnVmcyhwcml2KTsKKworCS8qIEZyZWUgdGhlIGNvbnNpc3RlbnQgbWVtb3J5IGFsbG9jYXRlZCBmb3IgZGVzY3JpcHRvciByaW5ncyAqLworCWlmIChwcml2LT5kbWFfdHgpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQocHJpdi0+ZGV2aWNlLAorCQkJCSAgRE1BX1RYX1JJTkdfU1ogKiBzaXplb2Yoc3RydWN0IHhnbWFjX2RtYV9kZXNjKSwKKwkJCQkgIHByaXYtPmRtYV90eCwgcHJpdi0+ZG1hX3R4X3BoeSk7CisJCXByaXYtPmRtYV90eCA9IE5VTEw7CisJfQorCWlmIChwcml2LT5kbWFfcngpIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQocHJpdi0+ZGV2aWNlLAorCQkJCSAgRE1BX1JYX1JJTkdfU1ogKiBzaXplb2Yoc3RydWN0IHhnbWFjX2RtYV9kZXNjKSwKKwkJCQkgIHByaXYtPmRtYV9yeCwgcHJpdi0+ZG1hX3J4X3BoeSk7CisJCXByaXYtPmRtYV9yeCA9IE5VTEw7CisJfQorCWtmcmVlKHByaXYtPnJ4X3NrYnVmZik7CisJcHJpdi0+cnhfc2tidWZmID0gTlVMTDsKKwlrZnJlZShwcml2LT50eF9za2J1ZmYpOworCXByaXYtPnR4X3NrYnVmZiA9IE5VTEw7Cit9CisKKy8qKgorICogeGdtYWNfdHg6CisgKiBAcHJpdjogcHJpdmF0ZSBkcml2ZXIgc3RydWN0dXJlCisgKiBEZXNjcmlwdGlvbjogaXQgcmVjbGFpbXMgcmVzb3VyY2VzIGFmdGVyIHRyYW5zbWlzc2lvbiBjb21wbGV0ZXMuCisgKi8KK3N0YXRpYyB2b2lkIHhnbWFjX3R4X2NvbXBsZXRlKHN0cnVjdCB4Z21hY19wcml2ICpwcml2KQoreworCWludCBpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcHJpdi0+YmFzZTsKKworCXdyaXRlbChETUFfU1RBVFVTX1RVIHwgRE1BX1NUQVRVU19OSVMsIGlvYWRkciArIFhHTUFDX0RNQV9TVEFUVVMpOworCisJd2hpbGUgKGRtYV9yaW5nX2NudChwcml2LT50eF9oZWFkLCBwcml2LT50eF90YWlsLCBETUFfVFhfUklOR19TWikpIHsKKwkJdW5zaWduZWQgaW50IGVudHJ5ID0gcHJpdi0+dHhfdGFpbDsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHByaXYtPnR4X3NrYnVmZltlbnRyeV07CisJCXN0cnVjdCB4Z21hY19kbWFfZGVzYyAqcCA9IHByaXYtPmRtYV90eCArIGVudHJ5OworCisJCS8qIENoZWNrIGlmIHRoZSBkZXNjcmlwdG9yIGlzIG93bmVkIGJ5IHRoZSBETUEuICovCisJCWlmIChkZXNjX2dldF9vd25lcihwKSkKKwkJCWJyZWFrOworCisJCS8qIFZlcmlmeSB0eCBlcnJvciBieSBsb29raW5nIGF0IHRoZSBsYXN0IHNlZ21lbnQgKi8KKwkJaWYgKGRlc2NfZ2V0X3R4X2xzKHApKQorCQkJZGVzY19nZXRfdHhfc3RhdHVzKHByaXYsIHApOworCisJCW5ldGRldl9kYmcocHJpdi0+ZGV2LCAidHggcmluZzogY3VyciAlZCwgZGlydHkgJWRcbiIsCisJCQlwcml2LT50eF9oZWFkLCBwcml2LT50eF90YWlsKTsKKworCQlkbWFfdW5tYXBfc2luZ2xlKHByaXYtPmRldmljZSwgZGVzY19nZXRfYnVmX2FkZHIocCksCisJCQkJIGRlc2NfZ2V0X2J1Zl9sZW4ocCksIERNQV9UT19ERVZJQ0UpOworCisJCXByaXYtPnR4X3NrYnVmZltlbnRyeV0gPSBOVUxMOworCQlwcml2LT50eF90YWlsID0gZG1hX3JpbmdfaW5jcihlbnRyeSwgRE1BX1RYX1JJTkdfU1opOworCisJCWlmICghc2tiKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBza2Jfc2hpbmZvKHNrYiktPm5yX2ZyYWdzOyBpKyspIHsKKwkJCWVudHJ5ID0gcHJpdi0+dHhfdGFpbCA9IGRtYV9yaW5nX2luY3IocHJpdi0+dHhfdGFpbCwKKwkJCQkJCQkgICAgICBETUFfVFhfUklOR19TWik7CisJCQlwID0gcHJpdi0+ZG1hX3R4ICsgcHJpdi0+dHhfdGFpbDsKKworCQkJZG1hX3VubWFwX3BhZ2UocHJpdi0+ZGV2aWNlLCBkZXNjX2dldF9idWZfYWRkcihwKSwKKwkJCQkgICAgICAgZGVzY19nZXRfYnVmX2xlbihwKSwgRE1BX1RPX0RFVklDRSk7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGVyZSdzIHJvb20gaW4gdGhlIHF1ZXVlIChsaW1pdCBpdCB0byBzaXplKQorCQkgKiB3ZSBhZGQgdGhpcyBza2IgYmFjayBpbnRvIHRoZSBwb29sLAorCQkgKiBpZiBpdCdzIHRoZSByaWdodCBzaXplLgorCQkgKi8KKwkJaWYgKChza2JfcXVldWVfbGVuKCZwcml2LT5yeF9yZWN5Y2xlKSA8CisJCQlETUFfUlhfUklOR19TWikgJiYKKwkJCXNrYl9yZWN5Y2xlX2NoZWNrKHNrYiwgcHJpdi0+ZG1hX2J1Zl9zeikpCisJCQlfX3NrYl9xdWV1ZV9oZWFkKCZwcml2LT5yeF9yZWN5Y2xlLCBza2IpOworCQllbHNlCisJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJfQorCisJaWYgKGRtYV9yaW5nX3NwYWNlKHByaXYtPnR4X2hlYWQsIHByaXYtPnR4X3RhaWwsIERNQV9UWF9SSU5HX1NaKSA+CisJICAgIFRYX1RIUkVTSCkKKwkJbmV0aWZfd2FrZV9xdWV1ZShwcml2LT5kZXYpOworfQorCisvKioKKyAqIHhnbWFjX3R4X2VycjoKKyAqIEBwcml2OiBwb2ludGVyIHRvIHRoZSBwcml2YXRlIGRldmljZSBzdHJ1Y3R1cmUKKyAqIERlc2NyaXB0aW9uOiBpdCBjbGVhbnMgdGhlIGRlc2NyaXB0b3JzIGFuZCByZXN0YXJ0cyB0aGUgdHJhbnNtaXNzaW9uCisgKiBpbiBjYXNlIG9mIGVycm9ycy4KKyAqLworc3RhdGljIHZvaWQgeGdtYWNfdHhfZXJyKHN0cnVjdCB4Z21hY19wcml2ICpwcml2KQoreworCXUzMiByZWcsIHZhbHVlLCBpbnRlbjsKKworCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+ZGV2KTsKKworCWludGVuID0gcmVhZGwocHJpdi0+YmFzZSArIFhHTUFDX0RNQV9JTlRSX0VOQSk7CisJd3JpdGVsKDAsIHByaXYtPmJhc2UgKyBYR01BQ19ETUFfSU5UUl9FTkEpOworCisJcmVnID0gcmVhZGwocHJpdi0+YmFzZSArIFhHTUFDX0RNQV9DT05UUk9MKTsKKwl3cml0ZWwocmVnICYgfkRNQV9DT05UUk9MX1NULCBwcml2LT5iYXNlICsgWEdNQUNfRE1BX0NPTlRST0wpOworCWRvIHsKKwkJdmFsdWUgPSByZWFkbChwcml2LT5iYXNlICsgWEdNQUNfRE1BX1NUQVRVUykgJiAweDcwMDAwMDsKKwl9IHdoaWxlICh2YWx1ZSAmJiAodmFsdWUgIT0gMHg2MDAwMDApKTsKKworCXhnbWFjX2ZyZWVfdHhfc2tidWZzKHByaXYpOworCWRlc2NfaW5pdF90eF9kZXNjKHByaXYtPmRtYV90eCwgRE1BX1RYX1JJTkdfU1opOworCXByaXYtPnR4X3RhaWwgPSAwOworCXByaXYtPnR4X2hlYWQgPSAwOworCXdyaXRlbChyZWcgfCBETUFfQ09OVFJPTF9TVCwgcHJpdi0+YmFzZSArIFhHTUFDX0RNQV9DT05UUk9MKTsKKworCXdyaXRlbChETUFfU1RBVFVTX1RVIHwgRE1BX1NUQVRVU19UUFMgfCBETUFfU1RBVFVTX05JUyB8IERNQV9TVEFUVVNfQUlTLAorCQlwcml2LT5iYXNlICsgWEdNQUNfRE1BX1NUQVRVUyk7CisJd3JpdGVsKGludGVuLCBwcml2LT5iYXNlICsgWEdNQUNfRE1BX0lOVFJfRU5BKTsKKworCW5ldGlmX3dha2VfcXVldWUocHJpdi0+ZGV2KTsKK30KKworc3RhdGljIGludCB4Z21hY19od19pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIHZhbHVlLCBjdHJsOworCWludCBsaW1pdDsKKwlzdHJ1Y3QgeGdtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwcml2LT5iYXNlOworCisJLyogU2F2ZSB0aGUgY3RybCByZWdpc3RlciB2YWx1ZSAqLworCWN0cmwgPSByZWFkbChpb2FkZHIgKyBYR01BQ19DT05UUk9MKSAmIFhHTUFDX0NPTlRST0xfU1BEX01BU0s7CisKKwkvKiBTVyByZXNldCAqLworCXZhbHVlID0gRE1BX0JVU19NT0RFX1NGVF9SRVNFVDsKKwl3cml0ZWwodmFsdWUsIGlvYWRkciArIFhHTUFDX0RNQV9CVVNfTU9ERSk7CisJbGltaXQgPSAxNTAwMDsKKwl3aGlsZSAobGltaXQtLSAmJgorCQkocmVhZGwoaW9hZGRyICsgWEdNQUNfRE1BX0JVU19NT0RFKSAmIERNQV9CVVNfTU9ERV9TRlRfUkVTRVQpKQorCQljcHVfcmVsYXgoKTsKKwlpZiAobGltaXQgPCAwKQorCQlyZXR1cm4gLUVCVVNZOworCisJdmFsdWUgPSAoMHgxMCA8PCBETUFfQlVTX01PREVfUEJMX1NISUZUKSB8CisJCSgweDEwIDw8IERNQV9CVVNfTU9ERV9SUEJMX1NISUZUKSB8CisJCURNQV9CVVNfTU9ERV9GQiB8IERNQV9CVVNfTU9ERV9BVERTIHwgRE1BX0JVU19NT0RFX0FBTDsKKwl3cml0ZWwodmFsdWUsIGlvYWRkciArIFhHTUFDX0RNQV9CVVNfTU9ERSk7CisKKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLworCXdyaXRlbChETUFfSU5UUl9ERUZBVUxUX01BU0ssIGlvYWRkciArIFhHTUFDX0RNQV9TVEFUVVMpOworCXdyaXRlbChETUFfSU5UUl9ERUZBVUxUX01BU0ssIGlvYWRkciArIFhHTUFDX0RNQV9JTlRSX0VOQSk7CisKKwkvKiBYR01BQyByZXF1aXJlcyBBWEkgYnVzIGluaXQuIFRoaXMgaXMgYSAnbWFnaWMgbnVtYmVyJyBmb3Igbm93ICovCisJd3JpdGVsKDB4MDAwMTAwRSwgaW9hZGRyICsgWEdNQUNfRE1BX0FYSV9CVVMpOworCisJY3RybCB8PSBYR01BQ19DT05UUk9MX0RESUMgfCBYR01BQ19DT05UUk9MX0pFIHwgWEdNQUNfQ09OVFJPTF9BQ1MgfAorCQlYR01BQ19DT05UUk9MX0NBUjsKKwlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKQorCQljdHJsIHw9IFhHTUFDX0NPTlRST0xfSVBDOworCXdyaXRlbChjdHJsLCBpb2FkZHIgKyBYR01BQ19DT05UUk9MKTsKKworCXZhbHVlID0gRE1BX0NPTlRST0xfREZGOworCXdyaXRlbCh2YWx1ZSwgaW9hZGRyICsgWEdNQUNfRE1BX0NPTlRST0wpOworCisJLyogU2V0IHRoZSBIVyBETUEgbW9kZSBhbmQgdGhlIENPRSAqLworCXdyaXRlbChYR01BQ19PTVJfVFNGIHwgWEdNQUNfT01SX1JTRiB8IFhHTUFDX09NUl9SRkQgfCBYR01BQ19PTVJfUkZBLAorCQlpb2FkZHIgKyBYR01BQ19PTVIpOworCisJLyogUmVzZXQgdGhlIE1NQyBjb3VudGVycyAqLworCXdyaXRlbCgxLCBpb2FkZHIgKyBYR01BQ19NTUNfQ1RSTCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogIHhnbWFjX29wZW4gLSBvcGVuIGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIKKyAqICBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBvcGVuIGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIDAgb24gc3VjY2VzcyBhbmQgYW4gYXBwcm9wcmlhdGUgKC0pdmUgaW50ZWdlciBhcyBkZWZpbmVkIGluIGVycm5vLmgKKyAqICBmaWxlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgeGdtYWNfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCByZXQ7CisJc3RydWN0IHhnbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcHJpdi0+YmFzZTsKKworCS8qIENoZWNrIHRoYXQgdGhlIE1BQyBhZGRyZXNzIGlzIHZhbGlkLiAgSWYgaXRzIG5vdCwgcmVmdXNlCisJICogdG8gYnJpbmcgdGhlIGRldmljZSB1cC4gVGhlIHVzZXIgbXVzdCBzcGVjaWZ5IGFuCisJICogYWRkcmVzcyB1c2luZyB0aGUgZm9sbG93aW5nIGxpbnV4IGNvbW1hbmQ6CisJICogICAgICBpZmNvbmZpZyBldGgwIGh3IGV0aGVyIHh4Onh4Onh4Onh4Onh4Onh4ICAqLworCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkgeworCQlyYW5kb21fZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKTsKKwkJbmV0ZGV2X2RiZyhwcml2LT5kZXYsICJnZW5lcmF0ZWQgcmFuZG9tIE1BQyBhZGRyZXNzICVwTVxuIiwKKwkJCWRldi0+ZGV2X2FkZHIpOworCX0KKworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPnJ4X3JlY3ljbGUpOworCW1lbXNldCgmcHJpdi0+eHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHhnbWFjX2V4dHJhX3N0YXRzKSk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBYR01BQyBhbmQgZGVzY3JpcHRvcnMgKi8KKwl4Z21hY19od19pbml0KGRldik7CisJeGdtYWNfc2V0X21hY19hZGRyKGlvYWRkciwgZGV2LT5kZXZfYWRkciwgMCk7CisJeGdtYWNfc2V0X2Zsb3dfY3RybChwcml2LCBwcml2LT5yeF9wYXVzZSwgcHJpdi0+dHhfcGF1c2UpOworCisJcmV0ID0geGdtYWNfZG1hX2Rlc2NfcmluZ3NfaW5pdChkZXYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogRW5hYmxlIHRoZSBNQUMgUngvVHggKi8KKwl4Z21hY19tYWNfZW5hYmxlKGlvYWRkcik7CisKKwluYXBpX2VuYWJsZSgmcHJpdi0+bmFwaSk7CisJbmV0aWZfc3RhcnRfcXVldWUoZGV2KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqICB4Z21hY19yZWxlYXNlIC0gY2xvc2UgZW50cnkgcG9pbnQgb2YgdGhlIGRyaXZlcgorICogIEBkZXYgOiBkZXZpY2UgcG9pbnRlci4KKyAqICBEZXNjcmlwdGlvbjoKKyAqICBUaGlzIGlzIHRoZSBzdG9wIGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBpbnQgeGdtYWNfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB4Z21hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKworCWlmIChyZWFkbChwcml2LT5iYXNlICsgWEdNQUNfRE1BX0lOVFJfRU5BKSkKKwkJbmFwaV9kaXNhYmxlKCZwcml2LT5uYXBpKTsKKworCXdyaXRlbCgwLCBwcml2LT5iYXNlICsgWEdNQUNfRE1BX0lOVFJfRU5BKTsKKwlza2JfcXVldWVfcHVyZ2UoJnByaXYtPnJ4X3JlY3ljbGUpOworCisJLyogRGlzYWJsZSB0aGUgTUFDIGNvcmUgKi8KKwl4Z21hY19tYWNfZGlzYWJsZShwcml2LT5iYXNlKTsKKworCS8qIFJlbGVhc2UgYW5kIGZyZWUgdGhlIFJ4L1R4IHJlc291cmNlcyAqLworCXhnbWFjX2ZyZWVfZG1hX2Rlc2NfcmluZ3MocHJpdik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiAgeGdtYWNfeG1pdDoKKyAqICBAc2tiIDogdGhlIHNvY2tldCBidWZmZXIKKyAqICBAZGV2IDogZGV2aWNlIHBvaW50ZXIKKyAqICBEZXNjcmlwdGlvbiA6IFR4IGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIuCisgKi8KK3N0YXRpYyBuZXRkZXZfdHhfdCB4Z21hY194bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHhnbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBlbnRyeTsKKwlpbnQgaTsKKwlpbnQgbmZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKKwlzdHJ1Y3QgeGdtYWNfZG1hX2Rlc2MgKmRlc2MsICpmaXJzdDsKKwl1bnNpZ25lZCBpbnQgZGVzY19mbGFnczsKKwl1bnNpZ25lZCBpbnQgbGVuOworCWRtYV9hZGRyX3QgcGFkZHI7CisKKwlpZiAoZG1hX3Jpbmdfc3BhY2UocHJpdi0+dHhfaGVhZCwgcHJpdi0+dHhfdGFpbCwgRE1BX1RYX1JJTkdfU1opIDwKKwkgICAgKG5mcmFncyArIDEpKSB7CisJCXdyaXRlbChETUFfSU5UUl9ERUZBVUxUX01BU0sgfCBETUFfSU5UUl9FTkFfVElFLAorCQkJcHJpdi0+YmFzZSArIFhHTUFDX0RNQV9JTlRSX0VOQSk7CisJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKKwkJcmV0dXJuIE5FVERFVl9UWF9CVVNZOworCX0KKworCWRlc2NfZmxhZ3MgPSAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fUEFSVElBTCkgPworCQlUWERFU0NfQ1NVTV9BTEwgOiAwOworCWVudHJ5ID0gcHJpdi0+dHhfaGVhZDsKKwlkZXNjID0gcHJpdi0+ZG1hX3R4ICsgZW50cnk7CisJZmlyc3QgPSBkZXNjOworCisJbGVuID0gc2tiX2hlYWRsZW4oc2tiKTsKKwlwYWRkciA9IGRtYV9tYXBfc2luZ2xlKHByaXYtPmRldmljZSwgc2tiLT5kYXRhLCBsZW4sIERNQV9UT19ERVZJQ0UpOworCWlmIChkbWFfbWFwcGluZ19lcnJvcihwcml2LT5kZXZpY2UsIHBhZGRyKSkgeworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybiAtRUlPOworCX0KKwlwcml2LT50eF9za2J1ZmZbZW50cnldID0gc2tiOworCWRlc2Nfc2V0X2J1Zl9hZGRyX2FuZF9zaXplKGRlc2MsIHBhZGRyLCBsZW4pOworCisJZm9yIChpID0gMDsgaSA8IG5mcmFnczsgaSsrKSB7CisJCXNrYl9mcmFnX3QgKmZyYWcgPSAmc2tiX3NoaW5mbyhza2IpLT5mcmFnc1tpXTsKKworCQlsZW4gPSBmcmFnLT5zaXplOworCisJCXBhZGRyID0gc2tiX2ZyYWdfZG1hX21hcChwcml2LT5kZXZpY2UsIGZyYWcsIDAsIGxlbiwKKwkJCQkJIERNQV9UT19ERVZJQ0UpOworCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+ZGV2aWNlLCBwYWRkcikpIHsKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJZW50cnkgPSBkbWFfcmluZ19pbmNyKGVudHJ5LCBETUFfVFhfUklOR19TWik7CisJCWRlc2MgPSBwcml2LT5kbWFfdHggKyBlbnRyeTsKKwkJcHJpdi0+dHhfc2tidWZmW2VudHJ5XSA9IE5VTEw7CisKKwkJZGVzY19zZXRfYnVmX2FkZHJfYW5kX3NpemUoZGVzYywgcGFkZHIsIGxlbik7CisJCWlmIChpIDwgKG5mcmFncyAtIDEpKQorCQkJZGVzY19zZXRfdHhfb3duZXIoZGVzYywgZGVzY19mbGFncyk7CisJfQorCisJLyogSW50ZXJydXB0IG9uIGNvbXBsZXRpdGlvbiBvbmx5IGZvciB0aGUgbGF0ZXN0IHNlZ21lbnQgKi8KKwlpZiAoZGVzYyAhPSBmaXJzdCkKKwkJZGVzY19zZXRfdHhfb3duZXIoZGVzYywgZGVzY19mbGFncyB8CisJCQlUWERFU0NfTEFTVF9TRUcgfCBUWERFU0NfSU5URVJSVVBUKTsKKwllbHNlCisJCWRlc2NfZmxhZ3MgfD0gVFhERVNDX0xBU1RfU0VHIHwgVFhERVNDX0lOVEVSUlVQVDsKKworCS8qIFNldCBvd25lciBvbiBmaXJzdCBkZXNjIGxhc3QgdG8gYXZvaWQgcmFjZSBjb25kaXRpb24gKi8KKwl3bWIoKTsKKwlkZXNjX3NldF90eF9vd25lcihmaXJzdCwgZGVzY19mbGFncyB8IFRYREVTQ19GSVJTVF9TRUcpOworCisJcHJpdi0+dHhfaGVhZCA9IGRtYV9yaW5nX2luY3IoZW50cnksIERNQV9UWF9SSU5HX1NaKTsKKworCXdyaXRlbCgxLCBwcml2LT5iYXNlICsgWEdNQUNfRE1BX1RYX1BPTEwpOworCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIGludCB4Z21hY19yeChzdHJ1Y3QgeGdtYWNfcHJpdiAqcHJpdiwgaW50IGxpbWl0KQoreworCXVuc2lnbmVkIGludCBlbnRyeTsKKwl1bnNpZ25lZCBpbnQgY291bnQgPSAwOworCXN0cnVjdCB4Z21hY19kbWFfZGVzYyAqcDsKKworCXdoaWxlIChjb3VudCA8IGxpbWl0KSB7CisJCWludCBpcF9jaGVja3N1bTsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwkJaW50IGZyYW1lX2xlbjsKKworCQl3cml0ZWwoRE1BX1NUQVRVU19SSSB8IERNQV9TVEFUVVNfTklTLAorCQkgICAgICAgcHJpdi0+YmFzZSArIFhHTUFDX0RNQV9TVEFUVVMpOworCisJCWVudHJ5ID0gcHJpdi0+cnhfdGFpbDsKKwkJcCA9IHByaXYtPmRtYV9yeCArIGVudHJ5OworCQlpZiAoZGVzY19nZXRfb3duZXIocCkpCisJCQlicmVhazsKKworCQljb3VudCsrOworCQlwcml2LT5yeF90YWlsID0gZG1hX3JpbmdfaW5jcihwcml2LT5yeF90YWlsLCBETUFfUlhfUklOR19TWik7CisKKwkJLyogcmVhZCB0aGUgc3RhdHVzIG9mIHRoZSBpbmNvbWluZyBmcmFtZSAqLworCQlpcF9jaGVja3N1bSA9IGRlc2NfZ2V0X3J4X3N0YXR1cyhwcml2LCBwKTsKKwkJaWYgKGlwX2NoZWNrc3VtIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCXNrYiA9IHByaXYtPnJ4X3NrYnVmZltlbnRyeV07CisJCWlmICh1bmxpa2VseSghc2tiKSkgeworCQkJbmV0ZGV2X2Vycihwcml2LT5kZXYsICJJbmNvbnNpc3RlbnQgUnggZGVzY3JpcHRvciBjaGFpblxuIik7CisJCQlicmVhazsKKwkJfQorCQlwcml2LT5yeF9za2J1ZmZbZW50cnldID0gTlVMTDsKKworCQlmcmFtZV9sZW4gPSBkZXNjX2dldF9yeF9mcmFtZV9sZW4ocCk7CisJCW5ldGRldl9kYmcocHJpdi0+ZGV2LCAiUlggZnJhbWUgc2l6ZSAlZCwgQ09FIHN0YXR1czogJWRcbiIsCisJCQlmcmFtZV9sZW4sIGlwX2NoZWNrc3VtKTsKKworCQlza2JfcHV0KHNrYiwgZnJhbWVfbGVuKTsKKwkJZG1hX3VubWFwX3NpbmdsZShwcml2LT5kZXZpY2UsIGRlc2NfZ2V0X2J1Zl9hZGRyKHApLAorCQkJCSBmcmFtZV9sZW4sIERNQV9GUk9NX0RFVklDRSk7CisKKwkJc2tiLT5wcm90b2NvbCA9IGV0aF90eXBlX3RyYW5zKHNrYiwgcHJpdi0+ZGV2KTsKKwkJc2tiLT5pcF9zdW1tZWQgPSBpcF9jaGVja3N1bTsKKwkJaWYgKGlwX2NoZWNrc3VtID09IENIRUNLU1VNX05PTkUpCisJCQluZXRpZl9yZWNlaXZlX3NrYihza2IpOworCQllbHNlCisJCQluYXBpX2dyb19yZWNlaXZlKCZwcml2LT5uYXBpLCBza2IpOworCX0KKworCXhnbWFjX3J4X3JlZmlsbChwcml2KTsKKworCXdyaXRlbCgxLCBwcml2LT5iYXNlICsgWEdNQUNfRE1BX1JYX1BPTEwpOworCisJcmV0dXJuIGNvdW50OworfQorCisvKioKKyAqICB4Z21hY19wb2xsIC0geGdtYWMgcG9sbCBtZXRob2QgKE5BUEkpCisgKiAgQG5hcGkgOiBwb2ludGVyIHRvIHRoZSBuYXBpIHN0cnVjdHVyZS4KKyAqICBAYnVkZ2V0IDogbWF4aW11bSBudW1iZXIgb2YgcGFja2V0cyB0aGF0IHRoZSBjdXJyZW50IENQVSBjYW4gcmVjZWl2ZSBmcm9tCisgKgkgICAgICBhbGwgaW50ZXJmYWNlcy4KKyAqICBEZXNjcmlwdGlvbiA6CisgKiAgIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgdGhlIHJlY2VwdGlvbiBwcm9jZXNzLgorICogICBBbHNvIGl0IHJ1bnMgdGhlIFRYIGNvbXBsZXRpb24gdGhyZWFkCisgKi8KK3N0YXRpYyBpbnQgeGdtYWNfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCit7CisJc3RydWN0IHhnbWFjX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YobmFwaSwKKwkJCQkgICAgICAgc3RydWN0IHhnbWFjX3ByaXYsIG5hcGkpOworCWludCB3b3JrX2RvbmUgPSAwOworCisJeGdtYWNfdHhfY29tcGxldGUocHJpdik7CisJd29ya19kb25lID0geGdtYWNfcngocHJpdiwgYnVkZ2V0KTsKKworCWlmICh3b3JrX2RvbmUgPCBidWRnZXQpIHsKKwkJbmFwaV9jb21wbGV0ZShuYXBpKTsKKwkJd3JpdGVsKERNQV9JTlRSX0RFRkFVTFRfTUFTSywgcHJpdi0+YmFzZSArIFhHTUFDX0RNQV9JTlRSX0VOQSk7CisJfQorCXJldHVybiB3b3JrX2RvbmU7Cit9CisKKy8qKgorICogIHhnbWFjX3R4X3RpbWVvdXQKKyAqICBAZGV2IDogUG9pbnRlciB0byBuZXQgZGV2aWNlIHN0cnVjdHVyZQorICogIERlc2NyaXB0aW9uOiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcGFja2V0IHRyYW5zbWlzc2lvbiBmYWlscyB0bworICogICBjb21wbGV0ZSB3aXRoaW4gYSByZWFzb25hYmxlIHRtcmF0ZS4gVGhlIGRyaXZlciB3aWxsIG1hcmsgdGhlIGVycm9yIGluIHRoZQorICogICBuZXRkZXYgc3RydWN0dXJlIGFuZCBhcnJhbmdlIGZvciB0aGUgZGV2aWNlIHRvIGJlIHJlc2V0IHRvIGEgc2FuZSBzdGF0ZQorICogICBpbiBvcmRlciB0byB0cmFuc21pdCBhIG5ldyBwYWNrZXQuCisgKi8KK3N0YXRpYyB2b2lkIHhnbWFjX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgeGdtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwkvKiBDbGVhciBUeCByZXNvdXJjZXMgYW5kIHJlc3RhcnQgdHJhbnNtaXR0aW5nIGFnYWluICovCisJeGdtYWNfdHhfZXJyKHByaXYpOworfQorCisvKioKKyAqICB4Z21hY19zZXRfcnhfbW9kZSAtIGVudHJ5IHBvaW50IGZvciBtdWx0aWNhc3QgYWRkcmVzc2luZworICogIEBkZXYgOiBwb2ludGVyIHRvIHRoZSBkZXZpY2Ugc3RydWN0dXJlCisgKiAgRGVzY3JpcHRpb246CisgKiAgVGhpcyBmdW5jdGlvbiBpcyBhIGRyaXZlciBlbnRyeSBwb2ludCB3aGljaCBnZXRzIGNhbGxlZCBieSB0aGUga2VybmVsCisgKiAgd2hlbmV2ZXIgbXVsdGljYXN0IGFkZHJlc3NlcyBtdXN0IGJlIGVuYWJsZWQvZGlzYWJsZWQuCisgKiAgUmV0dXJuIHZhbHVlOgorICogIHZvaWQuCisgKi8KK3N0YXRpYyB2b2lkIHhnbWFjX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJaW50IGk7CisJc3RydWN0IHhnbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqaW9hZGRyID0gcHJpdi0+YmFzZTsKKwl1bnNpZ25lZCBpbnQgdmFsdWUgPSAwOworCXUzMiBoYXNoX2ZpbHRlcltYR01BQ19OVU1fSEFTSF07CisJaW50IHJlZyA9IDE7CisJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKKwlib29sIHVzZV9oYXNoID0gZmFsc2U7CisKKwluZXRkZXZfZGJnKHByaXYtPmRldiwgIiMgbWNhc3RzICVkLCAjIHVuaWNhc3QgJWRcbiIsCisJCSBuZXRkZXZfbWNfY291bnQoZGV2KSwgbmV0ZGV2X3VjX2NvdW50KGRldikpOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQl3cml0ZWwoWEdNQUNfRlJBTUVfRklMVEVSX1BSLCBpb2FkZHIgKyBYR01BQ19GUkFNRV9GSUxURVIpOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KGhhc2hfZmlsdGVyLCAwLCBzaXplb2YoaGFzaF9maWx0ZXIpKTsKKworCWlmIChuZXRkZXZfdWNfY291bnQoZGV2KSA+IFhHTUFDX01BWF9GSUxURVJfQUREUikgeworCQl1c2VfaGFzaCA9IHRydWU7CisJCXZhbHVlIHw9IFhHTUFDX0ZSQU1FX0ZJTFRFUl9IVUMgfCBYR01BQ19GUkFNRV9GSUxURVJfSFBGOworCX0KKwluZXRkZXZfZm9yX2VhY2hfdWNfYWRkcihoYSwgZGV2KSB7CisJCWlmICh1c2VfaGFzaCkgeworCQkJdTMyIGJpdF9uciA9IH5ldGhlcl9jcmMoRVRIX0FMRU4sIGhhLT5hZGRyKSA+PiAyMzsKKworCQkJLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgNCBiaXRzIGRldGVybWluZSB0aGUgcmVnaXN0ZXIgdG8KKwkJCSAqIHVzZSAoSC9MKSB3aGlsZSB0aGUgb3RoZXIgNSBiaXRzIGRldGVybWluZSB0aGUgYml0CisJCQkgKiB3aXRoaW4gdGhlIHJlZ2lzdGVyLiAqLworCQkJaGFzaF9maWx0ZXJbYml0X25yID4+IDVdIHw9IDEgPDwgKGJpdF9uciAmIDMxKTsKKwkJfSBlbHNlIHsKKwkJCXhnbWFjX3NldF9tYWNfYWRkcihpb2FkZHIsIGhhLT5hZGRyLCByZWcpOworCQkJcmVnKys7CisJCX0KKwl9CisKKwlpZiAoZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgeworCQl2YWx1ZSB8PSBYR01BQ19GUkFNRV9GSUxURVJfUE07CisJCWdvdG8gb3V0OworCX0KKworCWlmICgobmV0ZGV2X21jX2NvdW50KGRldikgKyByZWcgLSAxKSA+IFhHTUFDX01BWF9GSUxURVJfQUREUikgeworCQl1c2VfaGFzaCA9IHRydWU7CisJCXZhbHVlIHw9IFhHTUFDX0ZSQU1FX0ZJTFRFUl9ITUMgfCBYR01BQ19GUkFNRV9GSUxURVJfSFBGOworCX0KKwluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgZGV2KSB7CisJCWlmICh1c2VfaGFzaCkgeworCQkJdTMyIGJpdF9uciA9IH5ldGhlcl9jcmMoRVRIX0FMRU4sIGhhLT5hZGRyKSA+PiAyMzsKKworCQkJLyogVGhlIG1vc3Qgc2lnbmlmaWNhbnQgNCBiaXRzIGRldGVybWluZSB0aGUgcmVnaXN0ZXIgdG8KKwkJCSAqIHVzZSAoSC9MKSB3aGlsZSB0aGUgb3RoZXIgNSBiaXRzIGRldGVybWluZSB0aGUgYml0CisJCQkgKiB3aXRoaW4gdGhlIHJlZ2lzdGVyLiAqLworCQkJaGFzaF9maWx0ZXJbYml0X25yID4+IDVdIHw9IDEgPDwgKGJpdF9uciAmIDMxKTsKKwkJfSBlbHNlIHsKKwkJCXhnbWFjX3NldF9tYWNfYWRkcihpb2FkZHIsIGhhLT5hZGRyLCByZWcpOworCQkJcmVnKys7CisJCX0KKwl9CisKK291dDoKKwlmb3IgKGkgPSAwOyBpIDwgWEdNQUNfTlVNX0hBU0g7IGkrKykKKwkJd3JpdGVsKGhhc2hfZmlsdGVyW2ldLCBpb2FkZHIgKyBYR01BQ19IQVNIKGkpKTsKKworCXdyaXRlbCh2YWx1ZSwgaW9hZGRyICsgWEdNQUNfRlJBTUVfRklMVEVSKTsKK30KKworLyoqCisgKiAgeGdtYWNfY2hhbmdlX210dSAtIGVudHJ5IHBvaW50IHRvIGNoYW5nZSBNVFUgc2l6ZSBmb3IgdGhlIGRldmljZS4KKyAqICBAZGV2IDogZGV2aWNlIHBvaW50ZXIuCisgKiAgQG5ld19tdHUgOiB0aGUgbmV3IE1UVSBzaXplIGZvciB0aGUgZGV2aWNlLgorICogIERlc2NyaXB0aW9uOiB0aGUgTWF4aW11bSBUcmFuc2ZlciBVbml0IChNVFUpIGlzIHVzZWQgYnkgdGhlIG5ldHdvcmsgbGF5ZXIKKyAqICB0byBkcml2ZSBwYWNrZXQgdHJhbnNtaXNzaW9uLiBFdGhlcm5ldCBoYXMgYW4gTVRVIG9mIDE1MDAgb2N0ZXRzCisgKiAgKEVUSF9EQVRBX0xFTikuIFRoaXMgdmFsdWUgY2FuIGJlIGNoYW5nZWQgd2l0aCBpZmNvbmZpZy4KKyAqICBSZXR1cm4gdmFsdWU6CisgKiAgMCBvbiBzdWNjZXNzIGFuZCBhbiBhcHByb3ByaWF0ZSAoLSl2ZSBpbnRlZ2VyIGFzIGRlZmluZWQgaW4gZXJybm8uaAorICogIGZpbGUgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCB4Z21hY19jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCB4Z21hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgb2xkX210dTsKKworCWlmICgobmV3X210dSA8IDQ2KSB8fCAobmV3X210dSA+IE1BWF9NVFUpKSB7CisJCW5ldGRldl9lcnIocHJpdi0+ZGV2LCAiaW52YWxpZCBNVFUsIG1heCBNVFUgaXM6ICVkXG4iLCBNQVhfTVRVKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJb2xkX210dSA9IGRldi0+bXR1OworCWRldi0+bXR1ID0gbmV3X210dTsKKworCS8qIHJldHVybiBlYXJseSBpZiB0aGUgYnVmZmVyIHNpemVzIHdpbGwgbm90IGNoYW5nZSAqLworCWlmIChvbGRfbXR1IDw9IEVUSF9EQVRBX0xFTiAmJiBuZXdfbXR1IDw9IEVUSF9EQVRBX0xFTikKKwkJcmV0dXJuIDA7CisJaWYgKG9sZF9tdHUgPT0gbmV3X210dSkKKwkJcmV0dXJuIDA7CisKKwkvKiBTdG9wIGV2ZXJ5dGhpbmcsIGdldCByZWFkeSB0byBjaGFuZ2UgdGhlIE1UVSAqLworCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQorCQlyZXR1cm4gMDsKKworCS8qIEJyaW5nIHRoZSBpbnRlcmZhY2UgZG93biBhbmQgdGhlbiBiYWNrIHVwICovCisJeGdtYWNfc3RvcChkZXYpOworCXJldHVybiB4Z21hY19vcGVuKGRldik7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB4Z21hY19wbXRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1MzIgaW50cl9zdGF0dXM7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKWRldl9pZDsKKwlzdHJ1Y3QgeGdtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwcml2LT5iYXNlOworCisJaW50cl9zdGF0dXMgPSByZWFkbChpb2FkZHIgKyBYR01BQ19JTlRfU1RBVCk7CisJaWYgKGludHJfc3RhdHVzICYgWEdNQUNfSU5UX1NUQVRfUE1UKSB7CisJCW5ldGRldl9kYmcocHJpdi0+ZGV2LCAicmVjZWl2ZWQgTWFnaWMgZnJhbWVcbiIpOworCQkvKiBjbGVhciB0aGUgUE1UIGJpdHMgNSBhbmQgNiBieSByZWFkaW5nIHRoZSBQTVQgKi8KKwkJcmVhZGwoaW9hZGRyICsgWEdNQUNfUE1UKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGdtYWNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwl1MzIgaW50cl9zdGF0dXM7CisJYm9vbCB0eF9lcnIgPSBmYWxzZTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopZGV2X2lkOworCXN0cnVjdCB4Z21hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgeGdtYWNfZXh0cmFfc3RhdHMgKnggPSAmcHJpdi0+eHN0YXRzOworCisJLyogcmVhZCB0aGUgc3RhdHVzIHJlZ2lzdGVyIChDU1I1KSAqLworCWludHJfc3RhdHVzID0gcmVhZGwocHJpdi0+YmFzZSArIFhHTUFDX0RNQV9TVEFUVVMpOworCWludHJfc3RhdHVzICY9IHJlYWRsKHByaXYtPmJhc2UgKyBYR01BQ19ETUFfSU5UUl9FTkEpOworCXdyaXRlbChpbnRyX3N0YXR1cywgcHJpdi0+YmFzZSArIFhHTUFDX0RNQV9TVEFUVVMpOworCisJLyogSXQgZGlzcGxheXMgdGhlIERNQSBwcm9jZXNzIHN0YXRlcyAoQ1NSNSByZWdpc3RlcikgKi8KKwkvKiBBQk5PUk1BTCBpbnRlcnJ1cHRzICovCisJaWYgKHVubGlrZWx5KGludHJfc3RhdHVzICYgRE1BX1NUQVRVU19BSVMpKSB7CisJCWlmIChpbnRyX3N0YXR1cyAmIERNQV9TVEFUVVNfVEpUKSB7CisJCQluZXRkZXZfZXJyKHByaXYtPmRldiwgInRyYW5zbWl0IGphYmJlclxuIik7CisJCQl4LT50eF9qYWJiZXIrKzsKKwkJfQorCQlpZiAoaW50cl9zdGF0dXMgJiBETUFfU1RBVFVTX1JVKQorCQkJeC0+cnhfYnVmX3VuYXYrKzsKKwkJaWYgKGludHJfc3RhdHVzICYgRE1BX1NUQVRVU19SUFMpIHsKKwkJCW5ldGRldl9lcnIocHJpdi0+ZGV2LCAicmVjZWl2ZSBwcm9jZXNzIHN0b3BwZWRcbiIpOworCQkJeC0+cnhfcHJvY2Vzc19zdG9wcGVkKys7CisJCX0KKwkJaWYgKGludHJfc3RhdHVzICYgRE1BX1NUQVRVU19FVEkpIHsKKwkJCW5ldGRldl9lcnIocHJpdi0+ZGV2LCAidHJhbnNtaXQgZWFybHkgaW50ZXJydXB0XG4iKTsKKwkJCXgtPnR4X2Vhcmx5Kys7CisJCX0KKwkJaWYgKGludHJfc3RhdHVzICYgRE1BX1NUQVRVU19UUFMpIHsKKwkJCW5ldGRldl9lcnIocHJpdi0+ZGV2LCAidHJhbnNtaXQgcHJvY2VzcyBzdG9wcGVkXG4iKTsKKwkJCXgtPnR4X3Byb2Nlc3Nfc3RvcHBlZCsrOworCQkJdHhfZXJyID0gdHJ1ZTsKKwkJfQorCQlpZiAoaW50cl9zdGF0dXMgJiBETUFfU1RBVFVTX0ZCSSkgeworCQkJbmV0ZGV2X2Vycihwcml2LT5kZXYsICJmYXRhbCBidXMgZXJyb3JcbiIpOworCQkJeC0+ZmF0YWxfYnVzX2Vycm9yKys7CisJCQl0eF9lcnIgPSB0cnVlOworCQl9CisKKwkJaWYgKHR4X2VycikKKwkJCXhnbWFjX3R4X2Vycihwcml2KTsKKwl9CisKKwkvKiBUWC9SWCBOT1JNQUwgaW50ZXJydXB0cyAqLworCWlmIChpbnRyX3N0YXR1cyAmIChETUFfU1RBVFVTX1JJIHwgRE1BX1NUQVRVU19UVSkpIHsKKwkJd3JpdGVsKERNQV9JTlRSX0FCTk9STUFMLCBwcml2LT5iYXNlICsgWEdNQUNfRE1BX0lOVFJfRU5BKTsKKwkJbmFwaV9zY2hlZHVsZSgmcHJpdi0+bmFwaSk7CisJfQorCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKy8qIFBvbGxpbmcgcmVjZWl2ZSAtIHVzZWQgYnkgTkVUQ09OU09MRSBhbmQgb3RoZXIgZGlhZ25vc3RpYyB0b29scworICogdG8gYWxsb3cgbmV0d29yayBJL08gd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLiAqLworc3RhdGljIHZvaWQgeGdtYWNfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJZGlzYWJsZV9pcnEoZGV2LT5pcnEpOworCXhnbWFjX2ludGVycnVwdChkZXYtPmlycSwgZGV2KTsKKwllbmFibGVfaXJxKGRldi0+aXJxKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICoKK3hnbWFjX2dldF9zdGF0czY0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCSAgICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0b3JhZ2UpCit7CisJc3RydWN0IHhnbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCXZvaWQgX19pb21lbSAqYmFzZSA9IHByaXYtPmJhc2U7CisJdTMyIGNvdW50OworCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5zdGF0c19sb2NrKTsKKwl3cml0ZWwoWEdNQUNfTU1DX0NUUkxfQ05UX0ZSWiwgYmFzZSArIFhHTUFDX01NQ19DVFJMKTsKKworCXN0b3JhZ2UtPnJ4X2J5dGVzID0gcmVhZGwoYmFzZSArIFhHTUFDX01NQ19SWE9DVEVUX0dfTE8pOworCXN0b3JhZ2UtPnJ4X2J5dGVzIHw9ICh1NjQpKHJlYWRsKGJhc2UgKyBYR01BQ19NTUNfUlhPQ1RFVF9HX0hJKSkgPDwgMzI7CisKKwlzdG9yYWdlLT5yeF9wYWNrZXRzID0gcmVhZGwoYmFzZSArIFhHTUFDX01NQ19SWEZSQU1FX0dCX0xPKTsKKwlzdG9yYWdlLT5tdWx0aWNhc3QgPSByZWFkbChiYXNlICsgWEdNQUNfTU1DX1JYTUNGUkFNRV9HKTsKKwlzdG9yYWdlLT5yeF9jcmNfZXJyb3JzID0gcmVhZGwoYmFzZSArIFhHTUFDX01NQ19SWENSQ0VSUik7CisJc3RvcmFnZS0+cnhfbGVuZ3RoX2Vycm9ycyA9IHJlYWRsKGJhc2UgKyBYR01BQ19NTUNfUlhMRU5HVEhFUlIpOworCXN0b3JhZ2UtPnJ4X21pc3NlZF9lcnJvcnMgPSByZWFkbChiYXNlICsgWEdNQUNfTU1DX1JYT1ZFUkZMT1cpOworCisJc3RvcmFnZS0+dHhfYnl0ZXMgPSByZWFkbChiYXNlICsgWEdNQUNfTU1DX1RYT0NURVRfR19MTyk7CisJc3RvcmFnZS0+dHhfYnl0ZXMgfD0gKHU2NCkocmVhZGwoYmFzZSArIFhHTUFDX01NQ19UWE9DVEVUX0dfSEkpKSA8PCAzMjsKKworCWNvdW50ID0gcmVhZGwoYmFzZSArIFhHTUFDX01NQ19UWEZSQU1FX0dCX0xPKTsKKwlzdG9yYWdlLT50eF9lcnJvcnMgPSBjb3VudCAtIHJlYWRsKGJhc2UgKyBYR01BQ19NTUNfVFhGUkFNRV9HX0xPKTsKKwlzdG9yYWdlLT50eF9wYWNrZXRzID0gY291bnQ7CisJc3RvcmFnZS0+dHhfZmlmb19lcnJvcnMgPSByZWFkbChiYXNlICsgWEdNQUNfTU1DX1RYVU5ERVJGTE9XKTsKKworCXdyaXRlbCgwLCBiYXNlICsgWEdNQUNfTU1DX0NUUkwpOworCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdGF0c19sb2NrKTsKKwlyZXR1cm4gc3RvcmFnZTsKK30KKworc3RhdGljIGludCB4Z21hY19zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKK3sKKwlzdHJ1Y3QgeGdtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSBwcml2LT5iYXNlOworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKworCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBkZXYtPmFkZHJfbGVuKTsKKworCXhnbWFjX3NldF9tYWNfYWRkcihpb2FkZHIsIGRldi0+ZGV2X2FkZHIsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGdtYWNfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQoreworCXUzMiBjdHJsOworCXN0cnVjdCB4Z21hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHByaXYtPmJhc2U7CisJdTMyIGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisKKwlpZiAoIShjaGFuZ2VkICYgTkVUSUZfRl9SWENTVU0pKQorCQlyZXR1cm4gMDsKKworCWN0cmwgPSByZWFkbChpb2FkZHIgKyBYR01BQ19DT05UUk9MKTsKKwlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkKKwkJY3RybCB8PSBYR01BQ19DT05UUk9MX0lQQzsKKwllbHNlCisJCWN0cmwgJj0gflhHTUFDX0NPTlRST0xfSVBDOworCXdyaXRlbChjdHJsLCBpb2FkZHIgKyBYR01BQ19DT05UUk9MKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHhnbWFjX25ldGRldl9vcHMgPSB7CisJLm5kb19vcGVuID0geGdtYWNfb3BlbiwKKwkubmRvX3N0YXJ0X3htaXQgPSB4Z21hY194bWl0LAorCS5uZG9fc3RvcCA9IHhnbWFjX3N0b3AsCisJLm5kb19jaGFuZ2VfbXR1ID0geGdtYWNfY2hhbmdlX210dSwKKwkubmRvX3NldF9yeF9tb2RlID0geGdtYWNfc2V0X3J4X21vZGUsCisJLm5kb190eF90aW1lb3V0ID0geGdtYWNfdHhfdGltZW91dCwKKwkubmRvX2dldF9zdGF0czY0ID0geGdtYWNfZ2V0X3N0YXRzNjQsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlciA9IHhnbWFjX3BvbGxfY29udHJvbGxlciwKKyNlbmRpZgorCS5uZG9fc2V0X21hY19hZGRyZXNzID0geGdtYWNfc2V0X21hY19hZGRyZXNzLAorCS5uZG9fc2V0X2ZlYXR1cmVzID0geGdtYWNfc2V0X2ZlYXR1cmVzLAorfTsKKworc3RhdGljIGludCB4Z21hY19ldGh0b29sX2dldHNldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCit7CisJY21kLT5hdXRvbmVnID0gMDsKKwljbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOworCWV0aHRvb2xfY21kX3NwZWVkX3NldChjbWQsIDEwMDAwKTsKKwljbWQtPnN1cHBvcnRlZCA9IDA7CisJY21kLT5hZHZlcnRpc2luZyA9IDA7CisJY21kLT50cmFuc2NlaXZlciA9IFhDVlJfSU5URVJOQUw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhnbWFjX2dldF9wYXVzZXBhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICAgICAgc3RydWN0IGV0aHRvb2xfcGF1c2VwYXJhbSAqcGF1c2UpCit7CisJc3RydWN0IHhnbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJcGF1c2UtPnJ4X3BhdXNlID0gcHJpdi0+cnhfcGF1c2U7CisJcGF1c2UtPnR4X3BhdXNlID0gcHJpdi0+dHhfcGF1c2U7Cit9CisKK3N0YXRpYyBpbnQgeGdtYWNfc2V0X3BhdXNlcGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgICAgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gKnBhdXNlKQoreworCXN0cnVjdCB4Z21hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmIChwYXVzZS0+YXV0b25lZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4geGdtYWNfc2V0X2Zsb3dfY3RybChwcml2LCBwYXVzZS0+cnhfcGF1c2UsIHBhdXNlLT50eF9wYXVzZSk7Cit9CisKK3N0cnVjdCB4Z21hY19zdGF0cyB7CisJY2hhciBzdGF0X3N0cmluZ1tFVEhfR1NUUklOR19MRU5dOworCWludCBzdGF0X29mZnNldDsKKwlib29sIGlzX3JlZzsKK307CisKKyNkZWZpbmUgWEdNQUNfU1RBVChtKQlcCisJeyAjbSwgb2Zmc2V0b2Yoc3RydWN0IHhnbWFjX3ByaXYsIHhzdGF0cy5tKSwgZmFsc2UgfQorI2RlZmluZSBYR01BQ19IV19TVEFUKG0sIHJlZ19vZmZzZXQpCVwKKwl7ICNtLCByZWdfb2Zmc2V0LCB0cnVlIH0KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4Z21hY19zdGF0cyB4Z21hY19nc3RyaW5nc19zdGF0c1tdID0geworCVhHTUFDX1NUQVQodHhfZnJhbWVfZmx1c2hlZCksCisJWEdNQUNfU1RBVCh0eF9wYXlsb2FkX2Vycm9yKSwKKwlYR01BQ19TVEFUKHR4X2lwX2hlYWRlcl9lcnJvciksCisJWEdNQUNfU1RBVCh0eF9sb2NhbF9mYXVsdCksCisJWEdNQUNfU1RBVCh0eF9yZW1vdGVfZmF1bHQpLAorCVhHTUFDX1NUQVQodHhfZWFybHkpLAorCVhHTUFDX1NUQVQodHhfcHJvY2Vzc19zdG9wcGVkKSwKKwlYR01BQ19TVEFUKHR4X2phYmJlciksCisJWEdNQUNfU1RBVChyeF9idWZfdW5hdiksCisJWEdNQUNfU1RBVChyeF9wcm9jZXNzX3N0b3BwZWQpLAorCVhHTUFDX1NUQVQocnhfcGF5bG9hZF9lcnJvciksCisJWEdNQUNfU1RBVChyeF9pcF9oZWFkZXJfZXJyb3IpLAorCVhHTUFDX1NUQVQocnhfZGFfZmlsdGVyX2ZhaWwpLAorCVhHTUFDX1NUQVQocnhfc2FfZmlsdGVyX2ZhaWwpLAorCVhHTUFDX1NUQVQoZmF0YWxfYnVzX2Vycm9yKSwKKwlYR01BQ19IV19TVEFUKHJ4X3dhdGNoZG9nLCBYR01BQ19NTUNfUlhXQVRDSERPRyksCisJWEdNQUNfSFdfU1RBVCh0eF92bGFuLCBYR01BQ19NTUNfVFhWTEFORlJBTUUpLAorCVhHTUFDX0hXX1NUQVQocnhfdmxhbiwgWEdNQUNfTU1DX1JYVkxBTkZSQU1FKSwKKwlYR01BQ19IV19TVEFUKHR4X3BhdXNlLCBYR01BQ19NTUNfVFhQQVVTRUZSQU1FKSwKKwlYR01BQ19IV19TVEFUKHJ4X3BhdXNlLCBYR01BQ19NTUNfUlhQQVVTRUZSQU1FKSwKK307CisjZGVmaW5lIFhHTUFDX1NUQVRTX0xFTiBBUlJBWV9TSVpFKHhnbWFjX2dzdHJpbmdzX3N0YXRzKQorCitzdGF0aWMgdm9pZCB4Z21hY19nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkgc3RydWN0IGV0aHRvb2xfc3RhdHMgKmR1bW15LAorCQkJCQkgdTY0ICpkYXRhKQoreworCXN0cnVjdCB4Z21hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl2b2lkICpwID0gcHJpdjsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBYR01BQ19TVEFUU19MRU47IGkrKykgeworCQlpZiAoeGdtYWNfZ3N0cmluZ3Nfc3RhdHNbaV0uaXNfcmVnKQorCQkJKmRhdGErKyA9IHJlYWRsKHByaXYtPmJhc2UgKworCQkJCXhnbWFjX2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfb2Zmc2V0KTsKKwkJZWxzZQorCQkJKmRhdGErKyA9ICoodTMyICopKHAgKworCQkJCXhnbWFjX2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfb2Zmc2V0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgeGdtYWNfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHNzZXQpCit7CisJc3dpdGNoIChzc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCXJldHVybiBYR01BQ19TVEFUU19MRU47CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdm9pZCB4Z21hY19nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LAorCQkJCSAgIHU4ICpkYXRhKQoreworCWludCBpOworCXU4ICpwID0gZGF0YTsKKworCXN3aXRjaCAoc3RyaW5nc2V0KSB7CisJY2FzZSBFVEhfU1NfU1RBVFM6CisJCWZvciAoaSA9IDA7IGkgPCBYR01BQ19TVEFUU19MRU47IGkrKykgeworCQkJbWVtY3B5KHAsIHhnbWFjX2dzdHJpbmdzX3N0YXRzW2ldLnN0YXRfc3RyaW5nLAorCQkJICAgICAgIEVUSF9HU1RSSU5HX0xFTik7CisJCQlwICs9IEVUSF9HU1RSSU5HX0xFTjsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKDEpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhnbWFjX2dldF93b2woc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCit7CisJc3RydWN0IHhnbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOworCisJaWYgKGRldmljZV9jYW5fd2FrZXVwKHByaXYtPmRldmljZSkpIHsKKwkJd29sLT5zdXBwb3J0ZWQgPSBXQUtFX01BR0lDIHwgV0FLRV9VQ0FTVDsKKwkJd29sLT53b2xvcHRzID0gcHJpdi0+d29sb3B0czsKKwl9Cit9CisKK3N0YXRpYyBpbnQgeGdtYWNfc2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICAgICAgc3RydWN0IGV0aHRvb2xfd29saW5mbyAqd29sKQoreworCXN0cnVjdCB4Z21hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgc3VwcG9ydCA9IFdBS0VfTUFHSUMgfCBXQUtFX1VDQVNUOworCisJaWYgKCFkZXZpY2VfY2FuX3dha2V1cChwcml2LT5kZXZpY2UpKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaWYgKHdvbC0+d29sb3B0cyAmIH5zdXBwb3J0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXByaXYtPndvbG9wdHMgPSB3b2wtPndvbG9wdHM7CisKKwlpZiAod29sLT53b2xvcHRzKSB7CisJCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShwcml2LT5kZXZpY2UsIDEpOworCQllbmFibGVfaXJxX3dha2UoZGV2LT5pcnEpOworCX0gZWxzZSB7CisJCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShwcml2LT5kZXZpY2UsIDApOworCQlkaXNhYmxlX2lycV93YWtlKGRldi0+aXJxKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyB4Z21hY19ldGh0b29sX29wcyA9IHsKKwkuZ2V0X3NldHRpbmdzID0geGdtYWNfZXRodG9vbF9nZXRzZXR0aW5ncywKKwkuZ2V0X2xpbmsgPSBldGh0b29sX29wX2dldF9saW5rLAorCS5nZXRfcGF1c2VwYXJhbSA9IHhnbWFjX2dldF9wYXVzZXBhcmFtLAorCS5zZXRfcGF1c2VwYXJhbSA9IHhnbWFjX3NldF9wYXVzZXBhcmFtLAorCS5nZXRfZXRodG9vbF9zdGF0cyA9IHhnbWFjX2dldF9ldGh0b29sX3N0YXRzLAorCS5nZXRfc3RyaW5ncyA9IHhnbWFjX2dldF9zdHJpbmdzLAorCS5nZXRfd29sID0geGdtYWNfZ2V0X3dvbCwKKwkuc2V0X3dvbCA9IHhnbWFjX3NldF93b2wsCisJLmdldF9zc2V0X2NvdW50ID0geGdtYWNfZ2V0X3NzZXRfY291bnQsCit9OworCisvKioKKyAqIHhnbWFjX3Byb2JlCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIKKyAqIERlc2NyaXB0aW9uOiB0aGUgZHJpdmVyIGlzIGluaXRpYWxpemVkIHRocm91Z2ggcGxhdGZvcm1fZGV2aWNlLgorICovCitzdGF0aWMgaW50IHhnbWFjX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBOVUxMOworCXN0cnVjdCB4Z21hY19wcml2ICpwcml2ID0gTlVMTDsKKwl1MzIgdWlkOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKQorCQlyZXR1cm4gLUVCVVNZOworCisJbmRldiA9IGFsbG9jX2V0aGVyZGV2KHNpemVvZihzdHJ1Y3QgeGdtYWNfcHJpdikpOworCWlmICghbmRldikgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9hbGxvYzsKKwl9CisKKwlTRVRfTkVUREVWX0RFVihuZGV2LCAmcGRldi0+ZGV2KTsKKwlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgbmRldik7CisJZXRoZXJfc2V0dXAobmRldik7CisJbmRldi0+bmV0ZGV2X29wcyA9ICZ4Z21hY19uZXRkZXZfb3BzOworCVNFVF9FVEhUT09MX09QUyhuZGV2LCAmeGdtYWNfZXRodG9vbF9vcHMpOworCXNwaW5fbG9ja19pbml0KCZwcml2LT5zdGF0c19sb2NrKTsKKworCXByaXYtPmRldmljZSA9ICZwZGV2LT5kZXY7CisJcHJpdi0+ZGV2ID0gbmRldjsKKwlwcml2LT5yeF9wYXVzZSA9IDE7CisJcHJpdi0+dHhfcGF1c2UgPSAxOworCisJcHJpdi0+YmFzZSA9IGlvcmVtYXAocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKKwlpZiAoIXByaXYtPmJhc2UpIHsKKwkJbmV0ZGV2X2VycihuZGV2LCAiaW9yZW1hcCBmYWlsZWRcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9pbzsKKwl9CisKKwl1aWQgPSByZWFkbChwcml2LT5iYXNlICsgWEdNQUNfVkVSU0lPTik7CisJbmV0ZGV2X2luZm8obmRldiwgImgvdyB2ZXJzaW9uIGlzIDB4JXhcbiIsIHVpZCk7CisKKwl3cml0ZWwoMCwgcHJpdi0+YmFzZSArIFhHTUFDX0RNQV9JTlRSX0VOQSk7CisJbmRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAobmRldi0+aXJxID09IC1FTlhJTykgeworCQluZXRkZXZfZXJyKG5kZXYsICJObyBpcnEgcmVzb3VyY2VcbiIpOworCQlyZXQgPSBuZGV2LT5pcnE7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwlyZXQgPSByZXF1ZXN0X2lycShuZGV2LT5pcnEsIHhnbWFjX2ludGVycnVwdCwgMCwKKwkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIG5kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCW5ldGRldl9lcnIobmRldiwgIkNvdWxkIG5vdCByZXF1ZXN0IGlycSAlZCAtIHJldCAlZClcbiIsCisJCQluZGV2LT5pcnEsIHJldCk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwlwcml2LT5wbXRfaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAxKTsKKwlpZiAocHJpdi0+cG10X2lycSA9PSAtRU5YSU8pIHsKKwkJbmV0ZGV2X2VycihuZGV2LCAiTm8gcG10IGlycSByZXNvdXJjZVxuIik7CisJCXJldCA9IHByaXYtPnBtdF9pcnE7CisJCWdvdG8gZXJyX3BtdF9pcnE7CisJfQorCisJcmV0ID0gcmVxdWVzdF9pcnEocHJpdi0+cG10X2lycSwgeGdtYWNfcG10X2ludGVycnVwdCwgMCwKKwkJCSAgZGV2X25hbWUoJnBkZXYtPmRldiksIG5kZXYpOworCWlmIChyZXQgPCAwKSB7CisJCW5ldGRldl9lcnIobmRldiwgIkNvdWxkIG5vdCByZXF1ZXN0IGlycSAlZCAtIHJldCAlZClcbiIsCisJCQlwcml2LT5wbXRfaXJxLCByZXQpOworCQlnb3RvIGVycl9wbXRfaXJxOworCX0KKworCWRldmljZV9zZXRfd2FrZXVwX2NhcGFibGUoJnBkZXYtPmRldiwgMSk7CisJaWYgKGRldmljZV9jYW5fd2FrZXVwKHByaXYtPmRldmljZSkpCisJCXByaXYtPndvbG9wdHMgPSBXQUtFX01BR0lDOwkvKiBNYWdpYyBGcmFtZSBhcyBkZWZhdWx0ICovCisKKwluZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0ZSQUdMSVNUIHwgTkVUSUZfRl9ISUdIRE1BOworCWlmIChyZWFkbChwcml2LT5iYXNlICsgWEdNQUNfRE1BX0hXX0ZFQVRVUkUpICYgRE1BX0hXX0ZFQVRfVFhDT0VTRUwpCisJCW5kZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNIHwKKwkJCQkgICAgIE5FVElGX0ZfUlhDU1VNOworCW5kZXYtPmZlYXR1cmVzIHw9IG5kZXYtPmh3X2ZlYXR1cmVzOworCW5kZXYtPnByaXZfZmxhZ3MgfD0gSUZGX1VOSUNBU1RfRkxUOworCisJLyogR2V0IHRoZSBNQUMgYWRkcmVzcyAqLworCXhnbWFjX2dldF9tYWNfYWRkcihwcml2LT5iYXNlLCBuZGV2LT5kZXZfYWRkciwgMCk7CisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG5kZXYtPmRldl9hZGRyKSkKKwkJbmV0ZGV2X3dhcm4obmRldiwgIk1BQyBhZGRyZXNzICVwTSBub3QgdmFsaWQiLAorCQkJIG5kZXYtPmRldl9hZGRyKTsKKworCW5ldGlmX25hcGlfYWRkKG5kZXYsICZwcml2LT5uYXBpLCB4Z21hY19wb2xsLCA2NCk7CisJcmV0ID0gcmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3JlZzsKKworCXJldHVybiAwOworCitlcnJfcmVnOgorCW5ldGlmX25hcGlfZGVsKCZwcml2LT5uYXBpKTsKKwlmcmVlX2lycShwcml2LT5wbXRfaXJxLCBuZGV2KTsKK2Vycl9wbXRfaXJxOgorCWZyZWVfaXJxKG5kZXYtPmlycSwgbmRldik7CitlcnJfaXJxOgorCWlvdW5tYXAocHJpdi0+YmFzZSk7CitlcnJfaW86CisJZnJlZV9uZXRkZXYobmRldik7CitlcnJfYWxsb2M6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiB4Z21hY19kdnJfcmVtb3ZlCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIKKyAqIERlc2NyaXB0aW9uOiB0aGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgVFgvUlggcHJvY2Vzc2VzLCBkaXNhYmxlcyB0aGUgTUFDIFJYL1RYCisgKiBjaGFuZ2VzIHRoZSBsaW5rIHN0YXR1cywgcmVsZWFzZXMgdGhlIERNQSBkZXNjcmlwdG9yIHJpbmdzLAorICogdW5yZWdpc3RlcnMgdGhlIE1ESU8gYnVzIGFuZCB1bm1hcHMgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKi8KK3N0YXRpYyBpbnQgeGdtYWNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgeGdtYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCisJeGdtYWNfbWFjX2Rpc2FibGUocHJpdi0+YmFzZSk7CisKKwkvKiBGcmVlIHRoZSBJUlEgbGluZXMgKi8KKwlmcmVlX2lycShuZGV2LT5pcnEsIG5kZXYpOworCWZyZWVfaXJxKHByaXYtPnBtdF9pcnEsIG5kZXYpOworCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJdW5yZWdpc3Rlcl9uZXRkZXYobmRldik7CisJbmV0aWZfbmFwaV9kZWwoJnByaXYtPm5hcGkpOworCisJaW91bm1hcChwcml2LT5iYXNlKTsKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCisJZnJlZV9uZXRkZXYobmRldik7CisKKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19QTV9TTEVFUAorc3RhdGljIHZvaWQgeGdtYWNfcG10KHZvaWQgX19pb21lbSAqaW9hZGRyLCB1bnNpZ25lZCBsb25nIG1vZGUpCit7CisJdW5zaWduZWQgaW50IHBtdCA9IDA7CisKKwlpZiAobW9kZSAmIFdBS0VfTUFHSUMpCisJCXBtdCB8PSBYR01BQ19QTVRfUE9XRVJET1dOIHwgWEdNQUNfUE1UX01BR0lDX1BLVDsKKwlpZiAobW9kZSAmIFdBS0VfVUNBU1QpCisJCXBtdCB8PSBYR01BQ19QTVRfUE9XRVJET1dOIHwgWEdNQUNfUE1UX0dMQkxfVU5JQ0FTVDsKKworCXdyaXRlbChwbXQsIGlvYWRkciArIFhHTUFDX1BNVCk7Cit9CisKK3N0YXRpYyBpbnQgeGdtYWNfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7CisJc3RydWN0IHhnbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl1MzIgdmFsdWU7CisKKwlpZiAoIW5kZXYgfHwgIW5ldGlmX3J1bm5pbmcobmRldikpCisJCXJldHVybiAwOworCisJbmV0aWZfZGV2aWNlX2RldGFjaChuZGV2KTsKKwluYXBpX2Rpc2FibGUoJnByaXYtPm5hcGkpOworCXdyaXRlbCgwLCBwcml2LT5iYXNlICsgWEdNQUNfRE1BX0lOVFJfRU5BKTsKKworCWlmIChkZXZpY2VfbWF5X3dha2V1cChwcml2LT5kZXZpY2UpKSB7CisJCS8qIFN0b3AgVFgvUlggRE1BIE9ubHkgKi8KKwkJdmFsdWUgPSByZWFkbChwcml2LT5iYXNlICsgWEdNQUNfRE1BX0NPTlRST0wpOworCQl2YWx1ZSAmPSB+KERNQV9DT05UUk9MX1NUIHwgRE1BX0NPTlRST0xfU1IpOworCQl3cml0ZWwodmFsdWUsIHByaXYtPmJhc2UgKyBYR01BQ19ETUFfQ09OVFJPTCk7CisKKwkJeGdtYWNfcG10KHByaXYtPmJhc2UsIHByaXYtPndvbG9wdHMpOworCX0gZWxzZQorCQl4Z21hY19tYWNfZGlzYWJsZShwcml2LT5iYXNlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhnbWFjX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YSh0b19wbGF0Zm9ybV9kZXZpY2UoZGV2KSk7CisJc3RydWN0IHhnbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHByaXYtPmJhc2U7CisKKwlpZiAoIW5ldGlmX3J1bm5pbmcobmRldikpCisJCXJldHVybiAwOworCisJeGdtYWNfcG10KGlvYWRkciwgMCk7CisKKwkvKiBFbmFibGUgdGhlIE1BQyBhbmQgRE1BICovCisJeGdtYWNfbWFjX2VuYWJsZShpb2FkZHIpOworCXdyaXRlbChETUFfSU5UUl9ERUZBVUxUX01BU0ssIGlvYWRkciArIFhHTUFDX0RNQV9TVEFUVVMpOworCXdyaXRlbChETUFfSU5UUl9ERUZBVUxUX01BU0ssIGlvYWRkciArIFhHTUFDX0RNQV9JTlRSX0VOQSk7CisKKwluZXRpZl9kZXZpY2VfYXR0YWNoKG5kZXYpOworCW5hcGlfZW5hYmxlKCZwcml2LT5uYXBpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgU0lNUExFX0RFVl9QTV9PUFMoeGdtYWNfcG1fb3BzLCB4Z21hY19zdXNwZW5kLCB4Z21hY19yZXN1bWUpOworI2RlZmluZSBYR01BQ19QTV9PUFMgKCZ4Z21hY19wbV9vcHMpCisjZWxzZQorI2RlZmluZSBYR01BQ19QTV9PUFMgTlVMTAorI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCB4Z21hY19vZl9tYXRjaFtdID0geworCXsgLmNvbXBhdGlibGUgPSAiY2FseGVkYSxoYi14Z21hYyIsIH0sCisJe30sCit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgeGdtYWNfb2ZfbWF0Y2gpOworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciB4Z21hY19kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAiY2FseGVkYXhnbWFjIiwKKwkJLm9mX21hdGNoX3RhYmxlID0geGdtYWNfb2ZfbWF0Y2gsCisJfSwKKwkucHJvYmUgPSB4Z21hY19wcm9iZSwKKwkucmVtb3ZlID0geGdtYWNfcmVtb3ZlLAorCS5kcml2ZXIucG0gPSBYR01BQ19QTV9PUFMsCit9OworCittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHhnbWFjX2RyaXZlcik7CisKK01PRFVMRV9BVVRIT1IoIkNhbHhlZGEsIEluYy4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ2FseGVkYSAxMEcgWEdNQUMgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IvY3hnYjIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYi9jeGdiMi5jCmluZGV4IGNhMjZkOTcuLjFkMTdjOTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYi9jeGdiMi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYi9jeGdiMi5jCkBAIC00MzQsMTAgKzQzNCwxMCBAQAogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gZGV2LT5tbF9wcml2OwogCi0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7Ci0Jc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIGludCBnZXRfc3NldF9jb3VudChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3NldCkKQEAgLTg0OSw3ICs4NDksOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTMyIHQxX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgdDFfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJLyoKIAkgKiBTaW5jZSB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZXBhcmF0ZSByeC90eCB2bGFuIGFjY2VsCkBAIC04NjMsOSArODY0LDkgQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLXN0YXRpYyBpbnQgdDFfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgdDFfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewotCXUzMiBjaGFuZ2VkID0gZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CiAJc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIgPSBkZXYtPm1sX3ByaXY7CiAKIAlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYi9zZ2UuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYi9zZ2UuYwppbmRleCBmOWI2MDIzLi40N2E4NDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2Ivc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiL3NnZS5jCkBAIC03NDIsNyArNzQyLDcgQEAKIC8qCiAgKiBFbmFibGUvZGlzYWJsZSBWTEFOIGFjY2VsZXJhdGlvbi4KICAqLwotdm9pZCB0MV92bGFuX21vZGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBmZWF0dXJlcykKK3ZvaWQgdDFfdmxhbl9tb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgc2dlICpzZ2UgPSBhZGFwdGVyLT5zZ2U7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYi9zZ2UuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYi9zZ2UuaAppbmRleCBlMDM5ODBiLi5iOWJmMTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2Ivc2dlLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiL3NnZS5oCkBAIC03OSw3ICs3OSw3IEBACiBpbnQgdDFfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKiwgaW50KTsKIAogbmV0ZGV2X3R4X3QgdDFfc3RhcnRfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLXZvaWQgdDFfdmxhbl9tb2RlKHN0cnVjdCBhZGFwdGVyICphZGFwdGVyLCB1MzIgZmVhdHVyZXMpOwordm9pZCB0MV92bGFuX21vZGUoc3RydWN0IGFkYXB0ZXIgKmFkYXB0ZXIsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKTsKIHZvaWQgdDFfc2dlX3N0YXJ0KHN0cnVjdCBzZ2UgKik7CiB2b2lkIHQxX3NnZV9zdG9wKHN0cnVjdCBzZ2UgKik7CiBpbnQgdDFfc2dlX2ludHJfZXJyb3JfaGFuZGxlcihzdHJ1Y3Qgc2dlICopOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9jeGdiM19tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX21haW4uYwppbmRleCA0ZDE1YzhmLi44NTdjYzI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2N4Z2IzX21haW4uYwpAQCAtMTU3NiwxMiArMTU3NiwxMSBAQAogCXQzX2dldF90cF92ZXJzaW9uKGFkYXB0ZXIsICZ0cF92ZXJzKTsKIAlzcGluX3VubG9jaygmYWRhcHRlci0+c3RhdHNfbG9jayk7CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpKTsKLQlpZiAoIWZ3X3ZlcnMpCi0JCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiTi9BIik7Ci0JZWxzZSB7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKKwkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CisJaWYgKGZ3X3ZlcnMpCiAJCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSwKIAkJCSAiJXMgJXUuJXUuJXUgVFAgJXUuJXUuJXUiLAogCQkJIEdfRldfVkVSU0lPTl9UWVBFKGZ3X3ZlcnMpID8gIlQiIDogIk4iLApAQCAtMTU5MSw3ICsxNTkwLDYgQEAKIAkJCSBHX1RQX1ZFUlNJT05fTUFKT1IodHBfdmVycyksCiAJCQkgR19UUF9WRVJTSU9OX01JTk9SKHRwX3ZlcnMpLAogCQkJIEdfVFBfVkVSU0lPTl9NSUNSTyh0cF92ZXJzKSk7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBnZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqIGRhdGEpCkBAIC0yNTMxLDcgKzI1MjksNyBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgY3hnYl92bGFuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIHZvaWQgY3hnYl92bGFuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gcGktPmFkYXB0ZXI7CkBAIC0yNTUyLDcgKzI1NTAsOCBAQAogCXQzX3N5bmNocm9uaXplX3J4KGFkYXB0ZXIsIHBpKTsKIH0KIAotc3RhdGljIHUzMiBjeGdiX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgY3hnYl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAkvKgogCSAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHJ4L3R4IHZsYW4gYWNjZWwKQEAgLTI1NjYsOSArMjU2NSw5IEBACiAJcmV0dXJuIGZlYXR1cmVzOwogfQogCi1zdGF0aWMgaW50IGN4Z2Jfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgY3hnYl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7Ci0JdTMyIGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlZCA9IGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKIAogCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9IV19WTEFOX1JYKQogCQljeGdiX3ZsYW5fbW9kZShkZXYsIGZlYXR1cmVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvY3hnYjNfb2ZmbG9hZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9jeGdiM19vZmZsb2FkLmMKaW5kZXggOTBmZjEzMS4uNjVlNGIyOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9jeGdiM19vZmZsb2FkLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9jeGdiM19vZmZsb2FkLmMKQEAgLTk2OSw3ICs5NjksNyBAQAogCWNhc2UgKE5FVEVWRU5UX1JFRElSRUNUKTp7CiAJCXN0cnVjdCBuZXRldmVudF9yZWRpcmVjdCAqbnIgPSBjdHg7CiAJCWN4Z2JfcmVkaXJlY3QobnItPm9sZCwgbnItPm5ldyk7Ci0JCWN4Z2JfbmVpZ2hfdXBkYXRlKGRzdF9nZXRfbmVpZ2hib3VyKG5yLT5uZXcpKTsKKwkJY3hnYl9uZWlnaF91cGRhdGUoZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYobnItPm5ldykpOwogCQlicmVhazsKIAl9CiAJZGVmYXVsdDoKQEAgLTEwNzIsOCArMTA3MiwxMSBAQAogCiBzdGF0aWMgdm9pZCBjeGdiX25laWdoX3VwZGF0ZShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCisJaWYgKCFuZWlnaCkKKwkJcmV0dXJuOworCWRldiA9IG5laWdoLT5kZXY7CiAJaWYgKGRldiAmJiAoaXNfb2ZmbG9hZGluZyhkZXYpKSkgewogCQlzdHJ1Y3QgdDNjZGV2ICp0ZGV2ID0gZGV2MnQzY2RldihkZXYpOwogCkBAIC0xMTA3LDYgKzExMTAsNyBAQAogc3RhdGljIHZvaWQgY3hnYl9yZWRpcmVjdChzdHJ1Y3QgZHN0X2VudHJ5ICpvbGQsIHN0cnVjdCBkc3RfZW50cnkgKm5ldykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqb2xkZGV2LCAqbmV3ZGV2OworCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAJc3RydWN0IHRpZF9pbmZvICp0aTsKIAlzdHJ1Y3QgdDNjZGV2ICp0ZGV2OwogCXUzMiB0aWQ7CkBAIC0xMTE0LDggKzExMTgsMTYgQEAKIAlzdHJ1Y3QgbDJ0X2VudHJ5ICplOwogCXN0cnVjdCB0M2NfdGlkX2VudHJ5ICp0ZTsKIAotCW9sZGRldiA9IGRzdF9nZXRfbmVpZ2hib3VyKG9sZCktPmRldjsKLQluZXdkZXYgPSBkc3RfZ2V0X25laWdoYm91cihuZXcpLT5kZXY7CisJbiA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKG9sZCk7CisJaWYgKCFuKQorCQlyZXR1cm47CisJb2xkZGV2ID0gbi0+ZGV2OworCisJbiA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKG5ldyk7CisJaWYgKCFuKQorCQlyZXR1cm47CisJbmV3ZGV2ID0gbi0+ZGV2OworCiAJaWYgKCFpc19vZmZsb2FkaW5nKG9sZGRldikpCiAJCXJldHVybjsKIAlpZiAoIWlzX29mZmxvYWRpbmcobmV3ZGV2KSkgewpAQCAtMTEzMiw3ICsxMTQ0LDcgQEAKIAl9CiAKIAkvKiBBZGQgbmV3IEwyVCBlbnRyeSAqLwotCWUgPSB0M19sMnRfZ2V0KHRkZXYsIGRzdF9nZXRfbmVpZ2hib3VyKG5ldyksIG5ld2Rldik7CisJZSA9IHQzX2wydF9nZXQodGRldiwgbmV3LCBuZXdkZXYpOwogCWlmICghZSkgewogCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjb3VsZG4ndCBhbGxvY2F0ZSBuZXcgbDJ0IGVudHJ5IVxuIiwKIAkJICAgICAgIF9fZnVuY19fKTsKQEAgLTEzMDEsNyArMTMxMyw3IEBACiAKIG91dF9mcmVlX2wydDoKIAl0M19mcmVlX2wydChMMkRBVEEoZGV2KSk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGRldi0+bDJvcHQsIE5VTEwpOworCVJDVV9JTklUX1BPSU5URVIoZGV2LT5sMm9wdCwgTlVMTCk7CiBvdXRfZnJlZToKIAlrZnJlZSh0KTsKIAlyZXR1cm4gZXJyOwpAQCAtMTMyOSw3ICsxMzQxLDcgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZCA9IEwyREFUQSh0ZGV2KTsKIAlyY3VfcmVhZF91bmxvY2soKTsKLQlyY3VfYXNzaWduX3BvaW50ZXIodGRldi0+bDJvcHQsIE5VTEwpOworCVJDVV9JTklUX1BPSU5URVIodGRldi0+bDJvcHQsIE5VTEwpOwogCWNhbGxfcmN1KCZkLT5yY3VfaGVhZCwgY2xlYW5fbDJfZGF0YSk7CiAJaWYgKHQtPm5vZmFpbF9za2IpCiAJCWtmcmVlX3NrYih0LT5ub2ZhaWxfc2tiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvbDJ0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2wydC5jCmluZGV4IDcwZmVjOGIuLjNmYTNjODggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvbDJ0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9sMnQuYwpAQCAtMjk4LDE4ICsyOTgsMzEgQEAKIAlzcGluX3VubG9jaygmZS0+bG9jayk7CiB9CiAKLXN0cnVjdCBsMnRfZW50cnkgKnQzX2wydF9nZXQoc3RydWN0IHQzY2RldiAqY2Rldiwgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCitzdHJ1Y3QgbDJ0X2VudHJ5ICp0M19sMnRfZ2V0KHN0cnVjdCB0M2NkZXYgKmNkZXYsIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKIAkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbDJ0X2VudHJ5ICplID0gTlVMTDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaDsKKwlzdHJ1Y3QgcG9ydF9pbmZvICpwOwogCXN0cnVjdCBsMnRfZGF0YSAqZDsKIAlpbnQgaGFzaDsKLQl1MzIgYWRkciA9ICoodTMyICopIG5laWdoLT5wcmltYXJ5X2tleTsKLQlpbnQgaWZpZHggPSBuZWlnaC0+ZGV2LT5pZmluZGV4OwotCXN0cnVjdCBwb3J0X2luZm8gKnAgPSBuZXRkZXZfcHJpdihkZXYpOwotCWludCBzbXRfaWR4ID0gcC0+cG9ydF9pZDsKKwl1MzIgYWRkcjsKKwlpbnQgaWZpZHg7CisJaW50IHNtdF9pZHg7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CisJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZihkc3QpOworCWlmICghbmVpZ2gpCisJCWdvdG8gZG9uZV9yY3U7CisKKwlhZGRyID0gKih1MzIgKikgbmVpZ2gtPnByaW1hcnlfa2V5OworCWlmaWR4ID0gbmVpZ2gtPmRldi0+aWZpbmRleDsKKworCWlmICghZGV2KQorCQlkZXYgPSBuZWlnaC0+ZGV2OworCXAgPSBuZXRkZXZfcHJpdihkZXYpOworCXNtdF9pZHggPSBwLT5wb3J0X2lkOworCiAJZCA9IEwyREFUQShjZGV2KTsKIAlpZiAoIWQpCiAJCWdvdG8gZG9uZV9yY3U7CkBAIC0zMjMsNyArMzM2LDcgQEAKIAkJCWwydF9ob2xkKGQsIGUpOwogCQkJaWYgKGF0b21pY19yZWFkKCZlLT5yZWZjbnQpID09IDEpCiAJCQkJcmV1c2VfZW50cnkoZSwgbmVpZ2gpOwotCQkJZ290byBkb25lOworCQkJZ290byBkb25lX3VubG9jazsKIAkJfQogCiAJLyogTmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBlbnRyeSAqLwpAQCAtMzQ0LDcgKzM1Nyw3IEBACiAJCQllLT52bGFuID0gVkxBTl9OT05FOwogCQlzcGluX3VubG9jaygmZS0+bG9jayk7CiAJfQotZG9uZToKK2RvbmVfdW5sb2NrOgogCXdyaXRlX3VubG9ja19iaCgmZC0+bG9jayk7CiBkb25lX3JjdToKIAlyY3VfcmVhZF91bmxvY2soKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvbDJ0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2IzL2wydC5oCmluZGV4IGM1ZjU0NzkuLmM0ZTg2NDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjMvbDJ0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiMy9sMnQuaApAQCAtMTA5LDcgKzEwOSw3IEBACiAKIHZvaWQgdDNfbDJlX2ZyZWUoc3RydWN0IGwydF9kYXRhICpkLCBzdHJ1Y3QgbDJ0X2VudHJ5ICplKTsKIHZvaWQgdDNfbDJ0X3VwZGF0ZShzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKTsKLXN0cnVjdCBsMnRfZW50cnkgKnQzX2wydF9nZXQoc3RydWN0IHQzY2RldiAqY2Rldiwgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCitzdHJ1Y3QgbDJ0X2VudHJ5ICp0M19sMnRfZ2V0KHN0cnVjdCB0M2NkZXYgKmNkZXYsIHN0cnVjdCBkc3RfZW50cnkgKmRzdCwKIAkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBpbnQgdDNfbDJ0X3NlbmRfc2xvdyhzdHJ1Y3QgdDNjZGV2ICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgc3RydWN0IGwydF9lbnRyeSAqZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L2N4Z2I0X21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfbWFpbi5jCmluZGV4IDRjOGY0MmEuLmU4M2QxMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvY3hnYjRfbWFpbi5jCkBAIC0yNDMsNyArMjQzLDcgQEAKIE1PRFVMRV9QQVJNX0RFU0MoaW50cl9jbnQsCiAJCSAidGhyZXNob2xkcyAxLi4zIGZvciBxdWV1ZSBpbnRlcnJ1cHQgcGFja2V0IGNvdW50ZXJzIik7CiAKLXN0YXRpYyBpbnQgdmZfYWNsczsKK3N0YXRpYyBib29sIHZmX2FjbHM7CiAKICNpZmRlZiBDT05GSUdfUENJX0lPVgogbW9kdWxlX3BhcmFtKHZmX2FjbHMsIGJvb2wsIDA2NDQpOwpAQCAtMTAwMiwxMyArMTAwMiwxMiBAQAogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIEtCVUlMRF9NT0ROQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBLQlVJTERfTU9ETkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksCisJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOwogCi0JaWYgKCFhZGFwdGVyLT5wYXJhbXMuZndfdmVycykKLQkJc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiKTsKLQllbHNlCisJaWYgKGFkYXB0ZXItPnBhcmFtcy5md192ZXJzKQogCQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksCiAJCQkiJXUuJXUuJXUuJXUsIFRQICV1LiV1LiV1LiV1IiwKIAkJCUZXX0hEUl9GV19WRVJfTUFKT1JfR0VUKGFkYXB0ZXItPnBhcmFtcy5md192ZXJzKSwKQEAgLTE4NTUsMTAgKzE4NTQsMTAgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IGN4Z2Jfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgY3hnYl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiBjaGFuZ2VkID0gZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CiAJaW50IGVycjsKIAogCWlmICghKGNoYW5nZWQgJiBORVRJRl9GX0hXX1ZMQU5fUlgpKQpAQCAtMTg3MiwzMCArMTg3MSwzMCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X3Jzc190YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9yeGZoX2luZGlyICpwKQorc3RhdGljIHUzMiBnZXRfcnNzX3RhYmxlX3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAljb25zdCBzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7Ci0JdW5zaWduZWQgaW50IG4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsIHAtPnNpemUsIHBpLT5yc3Nfc2l6ZSk7CiAKLQlwLT5zaXplID0gcGktPnJzc19zaXplOworCXJldHVybiBwaS0+cnNzX3NpemU7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3Jzc190YWJsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgKnApCit7CisJY29uc3Qgc3RydWN0IHBvcnRfaW5mbyAqcGkgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBuID0gcGktPnJzc19zaXplOworCiAJd2hpbGUgKG4tLSkKLQkJcC0+cmluZ19pbmRleFtuXSA9IHBpLT5yc3Nbbl07CisJCXBbbl0gPSBwaS0+cnNzW25dOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNldF9yc3NfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCSBjb25zdCBzdHJ1Y3QgZXRodG9vbF9yeGZoX2luZGlyICpwKQorc3RhdGljIGludCBzZXRfcnNzX3RhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHUzMiAqcCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAocC0+c2l6ZSAhPSBwaS0+cnNzX3NpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCWZvciAoaSA9IDA7IGkgPCBwLT5zaXplOyBpKyspCi0JCWlmIChwLT5yaW5nX2luZGV4W2ldID49IHBpLT5ucXNldHMpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQlmb3IgKGkgPSAwOyBpIDwgcC0+c2l6ZTsgaSsrKQotCQlwaS0+cnNzW2ldID0gcC0+cmluZ19pbmRleFtpXTsKKwlmb3IgKGkgPSAwOyBpIDwgcGktPnJzc19zaXplOyBpKyspCisJCXBpLT5yc3NbaV0gPSBwW2ldOwogCWlmIChwaS0+YWRhcHRlci0+ZmxhZ3MgJiBGVUxMX0lOSVRfRE9ORSkKIAkJcmV0dXJuIHdyaXRlX3JzcyhwaSwgcGktPnJzcyk7CiAJcmV0dXJuIDA7CkBAIC0xOTY0LDcgKzE5NjMsNyBAQAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBjeGdiX2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBjeGdiX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgICAgICA9IGdldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzICAgICAgPSBzZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvICAgICAgID0gZ2V0X2RydmluZm8sCkBAIC0xOTkwLDYgKzE5ODksNyBAQAogCS5nZXRfd29sICAgICAgICAgICA9IGdldF93b2wsCiAJLnNldF93b2wgICAgICAgICAgID0gc2V0X3dvbCwKIAkuZ2V0X3J4bmZjICAgICAgICAgPSBnZXRfcnhuZmMsCisJLmdldF9yeGZoX2luZGlyX3NpemUgPSBnZXRfcnNzX3RhYmxlX3NpemUsCiAJLmdldF9yeGZoX2luZGlyICAgID0gZ2V0X3Jzc190YWJsZSwKIAkuc2V0X3J4ZmhfaW5kaXIgICAgPSBzZXRfcnNzX3RhYmxlLAogCS5mbGFzaF9kZXZpY2UgICAgICA9IHNldF9mbGFzaCwKQEAgLTM0NDksNyArMzQ0OSw3IEBACiAJCWlmICghcGktPnJzcykKIAkJCXJldHVybiAtRU5PTUVNOwogCQlmb3IgKGogPSAwOyBqIDwgcGktPnJzc19zaXplOyBqKyspCi0JCQlwaS0+cnNzW2pdID0gaiAlIHBpLT5ucXNldHM7CisJCQlwaS0+cnNzW2pdID0gZXRodG9vbF9yeGZoX2luZGlyX2RlZmF1bHQoaiwgcGktPm5xc2V0cyk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMzUzNyw3ICszNTM3LDcgQEAKIHsKIAlpbnQgZnVuYywgaSwgZXJyOwogCXN0cnVjdCBwb3J0X2luZm8gKnBpOwotCXVuc2lnbmVkIGludCBoaWdoZG1hID0gMDsKKwlib29sIGhpZ2hkbWEgPSBmYWxzZTsKIAlzdHJ1Y3QgYWRhcHRlciAqYWRhcHRlciA9IE5VTEw7CiAKIAlwcmludGtfb25jZShLRVJOX0lORk8gIiVzIC0gdmVyc2lvbiAlc1xuIiwgRFJWX0RFU0MsIERSVl9WRVJTSU9OKTsKQEAgLTM1NjMsNyArMzU2Myw3IEBACiAJfQogCiAJaWYgKCFwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSyg2NCkpKSB7Ci0JCWhpZ2hkbWEgPSBORVRJRl9GX0hJR0hETUE7CisJCWhpZ2hkbWEgPSB0cnVlOwogCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7CiAJCWlmIChlcnIpIHsKIAkJCWRldl9lcnIoJnBkZXYtPmRldiwgInVuYWJsZSB0byBvYnRhaW4gNjQtYml0IERNQSBmb3IgIgpAQCAtMzYzNyw3ICszNjM3LDkgQEAKIAkJCU5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNIHwKIAkJCU5FVElGX0ZfUlhDU1VNIHwgTkVUSUZfRl9SWEhBU0ggfAogCQkJTkVUSUZfRl9IV19WTEFOX1RYIHwgTkVUSUZfRl9IV19WTEFOX1JYOwotCQluZXRkZXYtPmZlYXR1cmVzIHw9IG5ldGRldi0+aHdfZmVhdHVyZXMgfCBoaWdoZG1hOworCQlpZiAoaGlnaGRtYSkKKwkJCW5ldGRldi0+aHdfZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOworCQluZXRkZXYtPmZlYXR1cmVzIHw9IG5ldGRldi0+aHdfZmVhdHVyZXM7CiAJCW5ldGRldi0+dmxhbl9mZWF0dXJlcyA9IG5ldGRldi0+ZmVhdHVyZXMgJiBWTEFOX0ZFQVQ7CiAKIAkJbmV0ZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9VTklDQVNUX0ZMVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0L3NnZS5jCmluZGV4IDE0MDI1NGMuLjJkYWU3OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjQvc2dlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNC9zZ2UuYwpAQCAtNDkxLDcgKzQ5MSw3IEBACiAJX19iZTY0ICpkID0gJnEtPmRlc2NbcS0+cGlkeF07CiAJc3RydWN0IHJ4X3N3X2Rlc2MgKnNkID0gJnEtPnNkZXNjW3EtPnBpZHhdOwogCi0JZ2ZwIHw9IF9fR0ZQX05PV0FSTjsgICAgICAgICAvKiBmYWlsdXJlcyBhcmUgZXhwZWN0ZWQgKi8KKwlnZnAgfD0gX19HRlBfTk9XQVJOIHwgX19HRlBfQ09MRDsKIAogI2lmIEZMX1BHX09SREVSID4gMAogCS8qCkBAIC01MjgsNyArNTI4LDcgQEAKICNlbmRpZgogCiAJd2hpbGUgKG4tLSkgewotCQlwZyA9IF9fbmV0ZGV2X2FsbG9jX3BhZ2UoYWRhcC0+cG9ydFswXSwgZ2ZwKTsKKwkJcGcgPSBhbGxvY19wYWdlKGdmcCk7CiAJCWlmICh1bmxpa2VseSghcGcpKSB7CiAJCQlxLT5hbGxvY19mYWlsZWQrKzsKIAkJCWJyZWFrOwpAQCAtNTM3LDcgKzUzNyw3IEBACiAJCW1hcHBpbmcgPSBkbWFfbWFwX3BhZ2UoYWRhcC0+cGRldl9kZXYsIHBnLCAwLCBQQUdFX1NJWkUsCiAJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CiAJCWlmICh1bmxpa2VseShkbWFfbWFwcGluZ19lcnJvcihhZGFwLT5wZGV2X2RldiwgbWFwcGluZykpKSB7Ci0JCQluZXRkZXZfZnJlZV9wYWdlKGFkYXAtPnBvcnRbMF0sIHBnKTsKKwkJCXB1dF9wYWdlKHBnKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCSpkKysgPSBjcHVfdG9fYmU2NChtYXBwaW5nKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9jeGdiNHZmX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9jeGdiNHZmX21haW4uYwppbmRleCBkYTkwNzJiLi41Y2E3MzY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvY3hnYjR2Zl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL2N4Z2I0dmZfbWFpbi5jCkBAIC0xMDkyLDcgKzEwOTIsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1MzIgY3hnYjR2Zl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IGN4Z2I0dmZfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJLyoKIAkgKiBTaW5jZSB0aGVyZSBpcyBubyBzdXBwb3J0IGZvciBzZXBhcmF0ZSByeC90eCB2bGFuIGFjY2VsCkBAIC0xMTA2LDEwICsxMTA3LDExIEBACiAJcmV0dXJuIGZlYXR1cmVzOwogfQogCi1zdGF0aWMgaW50IGN4Z2I0dmZfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgY3hnYjR2Zl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KGRldik7Ci0JdTMyIGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlZCA9IGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKIAogCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9IV19WTEFOX1JYKQogCQl0NHZmX3NldF9yeG1vZGUocGktPmFkYXB0ZXIsIHBpLT52aWlkLCAtMSwgLTEsIC0xLCAtMSwKQEAgLTEyMDMsOSArMTIwNSwxMCBAQAogewogCXN0cnVjdCBhZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2MmFkYXAoZGV2KTsKIAotCXN0cmNweShkcnZpbmZvLT5kcml2ZXIsIEtCVUlMRF9NT0ROQU1FKTsKLQlzdHJjcHkoZHJ2aW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUodG9fcGNpX2RldihkZXYtPmRldi5wYXJlbnQpKSk7CisJc3RybGNweShkcnZpbmZvLT5kcml2ZXIsIEtCVUlMRF9NT0ROQU1FLCBzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShkcnZpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZSh0b19wY2lfZGV2KGRldi0+ZGV2LnBhcmVudCkpLAorCQlzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pKTsKIAlzbnByaW50ZihkcnZpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbiksCiAJCSAiJXUuJXUuJXUuJXUsIFRQICV1LiV1LiV1LiV1IiwKIAkJIEZXX0hEUl9GV19WRVJfTUFKT1JfR0VUKGFkYXB0ZXItPnBhcmFtcy5kZXYuZndyZXYpLApAQCAtMTU2MSw3ICsxNTY0LDcgQEAKICAqLwogI2RlZmluZSBUU09fRkxBR1MgKE5FVElGX0ZfVFNPIHwgTkVUSUZfRl9UU082IHwgTkVUSUZfRl9UU09fRUNOKQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGN4Z2I0dmZfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGN4Z2I0dmZfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncwkJPSBjeGdiNHZmX2dldF9zZXR0aW5ncywKIAkuZ2V0X2RydmluZm8JCT0gY3hnYjR2Zl9nZXRfZHJ2aW5mbywKIAkuZ2V0X21zZ2xldmVsCQk9IGN4Z2I0dmZfZ2V0X21zZ2xldmVsLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3NnZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2hlbHNpby9jeGdiNHZmL3NnZS5jCmluZGV4IDhkNWQ1NWEuLmMzODFkYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2NoZWxzaW8vY3hnYjR2Zi9zZ2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaGVsc2lvL2N4Z2I0dmYvc2dlLmMKQEAgLTY1Myw4ICs2NTMsNyBAQAogCiBhbGxvY19zbWFsbF9wYWdlczoKIAl3aGlsZSAobi0tKSB7Ci0JCXBhZ2UgPSBfX25ldGRldl9hbGxvY19wYWdlKGFkYXB0ZXItPnBvcnRbMF0sCi0JCQkJCSAgIGdmcCB8IF9fR0ZQX05PV0FSTik7CisJCXBhZ2UgPSBhbGxvY19wYWdlKGdmcCB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX0NPTEQpOwogCQlpZiAodW5saWtlbHkoIXBhZ2UpKSB7CiAJCQlmbC0+YWxsb2NfZmFpbGVkKys7CiAJCQlicmVhazsKQEAgLTY2NCw3ICs2NjMsNyBAQAogCQlkbWFfYWRkciA9IGRtYV9tYXBfcGFnZShhZGFwdGVyLT5wZGV2X2RldiwgcGFnZSwgMCwgUEFHRV9TSVpFLAogCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOwogCQlpZiAodW5saWtlbHkoZG1hX21hcHBpbmdfZXJyb3IoYWRhcHRlci0+cGRldl9kZXYsIGRtYV9hZGRyKSkpIHsKLQkJCW5ldGRldl9mcmVlX3BhZ2UoYWRhcHRlci0+cG9ydFswXSwgcGFnZSk7CisJCQlwdXRfcGFnZShwYWdlKTsKIAkJCWJyZWFrOwogCQl9CiAJCSpkKysgPSBjcHVfdG9fYmU2NChkbWFfYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL2VuaWNfZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL2VuaWNfZGV2LmMKaW5kZXggZmQ2MjQ3Yi4uYmYwZmM1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX2Rldi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19kZXYuYwpAQCAtMjEyLDIzICsyMTIsMjkgQEAKIH0KIAogLyogcnRubCBsb2NrIGlzIGhlbGQgKi8KLXZvaWQgZW5pY192bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKK2ludCBlbmljX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBlbmljICplbmljID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgZXJyOwogCiAJc3Bpbl9sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7Ci0JZW5pY19hZGRfdmxhbihlbmljLCB2aWQpOworCWVyciA9IGVuaWNfYWRkX3ZsYW4oZW5pYywgdmlkKTsKIAlzcGluX3VubG9jaygmZW5pYy0+ZGV2Y21kX2xvY2spOworCisJcmV0dXJuIGVycjsKIH0KIAogLyogcnRubCBsb2NrIGlzIGhlbGQgKi8KLXZvaWQgZW5pY192bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCitpbnQgZW5pY192bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCiB7CiAJc3RydWN0IGVuaWMgKmVuaWMgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBlcnI7CiAKIAlzcGluX2xvY2soJmVuaWMtPmRldmNtZF9sb2NrKTsKLQllbmljX2RlbF92bGFuKGVuaWMsIHZpZCk7CisJZXJyID0gZW5pY19kZWxfdmxhbihlbmljLCB2aWQpOwogCXNwaW5fdW5sb2NrKCZlbmljLT5kZXZjbWRfbG9jayk7CisKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgZW5pY19kZXZfZW5hYmxlMihzdHJ1Y3QgZW5pYyAqZW5pYywgaW50IGFjdGl2ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19kZXYuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19kZXYuaAppbmRleCAxZjgzYTQ3Li5kYTFjYmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL2VuaWNfZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX2Rldi5oCkBAIC00Niw4ICs0Niw4IEBACiAJaW50IGJyb2FkY2FzdCwgaW50IHByb21pc2MsIGludCBhbGxtdWx0aSk7CiBpbnQgZW5pY19kZXZfYWRkX2FkZHIoc3RydWN0IGVuaWMgKmVuaWMsIHU4ICphZGRyKTsKIGludCBlbmljX2Rldl9kZWxfYWRkcihzdHJ1Y3QgZW5pYyAqZW5pYywgdTggKmFkZHIpOwotdm9pZCBlbmljX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKTsKLXZvaWQgZW5pY192bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpOworaW50IGVuaWNfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpOworaW50IGVuaWNfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKTsKIGludCBlbmljX2Rldl9ub3RpZnlfdW5zZXQoc3RydWN0IGVuaWMgKmVuaWMpOwogaW50IGVuaWNfZGV2X2hhbmdfbm90aWZ5KHN0cnVjdCBlbmljICplbmljKTsKIGludCBlbmljX2Rldl9zZXRfaWdfdmxhbl9yZXdyaXRlX21vZGUoc3RydWN0IGVuaWMgKmVuaWMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Npc2NvL2VuaWMvZW5pY19tYWluLmMKaW5kZXggYzM3ODZmZC4uMmZkOWRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvY2lzY28vZW5pYy9lbmljX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9jaXNjby9lbmljL2VuaWNfbWFpbi5jCkBAIC0yMTcsMTEgKzIxNywxMSBAQAogCiAJZW5pY19kZXZfZndfaW5mbyhlbmljLCAmZndfaW5mbyk7CiAKLQlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihkcnZpbmZvLT5kcml2ZXIpKTsKLQlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOwotCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgZndfaW5mby0+ZndfdmVyc2lvbiwKKwlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihkcnZpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgZndfaW5mby0+ZndfdmVyc2lvbiwKIAkJc2l6ZW9mKGRydmluZm8tPmZ3X3ZlcnNpb24pKTsKLQlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShlbmljLT5wZGV2KSwKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShlbmljLT5wZGV2KSwKIAkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CiB9CiAKQEAgLTIzNzksNyArMjM3OSw3IEBACiAKICNlbmRpZgogCS8qIEFsbG9jYXRlIHN0cnVjdHVyZSBmb3IgcG9ydCBwcm9maWxlcyAqLwotCWVuaWMtPnBwID0ga3phbGxvYyhudW1fcHBzICogc2l6ZW9mKCplbmljLT5wcCksIEdGUF9LRVJORUwpOworCWVuaWMtPnBwID0ga2NhbGxvYyhudW1fcHBzLCBzaXplb2YoKmVuaWMtPnBwKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFlbmljLT5wcCkgewogCQlwcl9lcnIoInBvcnQgcHJvZmlsZSBhbGxvYyBmYWlsZWQsIGFib3J0aW5nXG4iKTsKIAkJZXJyID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Rhdmljb20vZG05MDAwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kYXZpY29tL2RtOTAwMC5jCmluZGV4IDQzOGY0NTguLmY4MDE3NTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2Rhdmljb20vZG05MDAwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGF2aWNvbS9kbTkwMDAuYwpAQCAtNDc0LDEwICs0NzQsMTEgQEAKIAlyZXR1cm4gbWlpX253YXlfcmVzdGFydCgmZG0tPm1paSk7CiB9CiAKLXN0YXRpYyBpbnQgZG05MDAwX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgaW50IGRtOTAwMF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlib2FyZF9pbmZvX3QgKmRtID0gdG9fZG05MDAwX2JvYXJkKGRldik7Ci0JdTMyIGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlZCA9IGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCEoY2hhbmdlZCAmIE5FVElGX0ZfUlhDU1VNKSkKQEAgLTYxMyw3ICs2MTQsNyBAQAogCiAJCWlmICghZG0tPndha2Vfc3RhdGUpCiAJCQlpcnFfc2V0X2lycV93YWtlKGRtLT5pcnFfd2FrZSwgMSk7Ci0JCWVsc2UgaWYgKGRtLT53YWtlX3N0YXRlICYgIW9wdHMpCisJCWVsc2UgaWYgKGRtLT53YWtlX3N0YXRlICYmICFvcHRzKQogCQkJaXJxX3NldF9pcnFfd2FrZShkbS0+aXJxX3dha2UsIDApOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlMjEwNHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC9kZTIxMDR4LmMKaW5kZXggMTQyNzczOS4uMWViNDZhMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlMjEwNHguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGUyMTA0eC5jCkBAIC0xNTk4LDkgKzE1OTgsOSBAQAogewogCXN0cnVjdCBkZV9wcml2YXRlICpkZSA9IG5ldGRldl9wcml2KGRldik7CiAKLQlzdHJjcHkgKGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweSAoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweSAoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGRlLT5wZGV2KSk7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShkZS0+cGRldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogCWluZm8tPmVlZHVtcF9sZW4gPSBERV9FRVBST01fU0laRTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RlNHg1LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuYwppbmRleCA4NzFiY2FhLi40ZDcxZjVhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZGU0eDUuYwpAQCAtMjEyNywxNCArMjEyNyw5IEBACiAgICAgdV9sb25nIGlvYmFzZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdXBwZXIgMzIgYml0cyBpbiBBbHBoYXMgKi8KICAgICBpbnQgaSwgajsKICAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwotICAgIHN0cnVjdCBsaXN0X2hlYWQgKndhbGs7CisgICAgc3RydWN0IHBjaV9kZXYgKnRoaXNfZGV2OwogCi0gICAgbGlzdF9mb3JfZWFjaCh3YWxrLCAmcGRldi0+YnVzX2xpc3QpIHsKLQlzdHJ1Y3QgcGNpX2RldiAqdGhpc19kZXYgPSBwY2lfZGV2X2Iod2Fsayk7Ci0KLQkvKiBTa2lwIHRoZSBwY2lfYnVzIGxpc3QgZW50cnkgKi8KLQlpZiAobGlzdF9lbnRyeSh3YWxrLCBzdHJ1Y3QgcGNpX2J1cywgZGV2aWNlcykgPT0gcGRldi0+YnVzKSBjb250aW51ZTsKLQorICAgIGxpc3RfZm9yX2VhY2hfZW50cnkodGhpc19kZXYsICZwZGV2LT5idXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJdmVuZG9yID0gdGhpc19kZXYtPnZlbmRvcjsKIAlkZXZpY2UgPSB0aGlzX2Rldi0+ZGV2aWNlIDw8IDg7CiAJaWYgKCEoaXNfREMyMTA0MCB8fCBpc19EQzIxMDQxIHx8IGlzX0RDMjExNDAgfHwgaXNfREMyMTE0eCkpIGNvbnRpbnVlOwpAQCAtNTE5Niw3ICs1MTkxLDcgQEAKICAgICBzdHJ1Y3QgZGU0eDVfcHJpdmF0ZSAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogICAgIGNoYXIgKnAsICpxLCB0OwogCi0gICAgbHAtPnBhcmFtcy5mZHggPSAwOworICAgIGxwLT5wYXJhbXMuZmR4ID0gZmFsc2U7CiAgICAgbHAtPnBhcmFtcy5hdXRvc2Vuc2UgPSBBVVRPOwogCiAgICAgaWYgKGFyZ3MgPT0gTlVMTCkgcmV0dXJuOwpAQCAtNTIwNiw3ICs1MjAxLDcgQEAKIAl0ID0gKnE7CiAJKnEgPSAnXDAnOwogCi0JaWYgKHN0cnN0cihwLCAiZmR4IikgfHwgc3Ryc3RyKHAsICJGRFgiKSkgbHAtPnBhcmFtcy5mZHggPSAxOworCWlmIChzdHJzdHIocCwgImZkeCIpIHx8IHN0cnN0cihwLCAiRkRYIikpIGxwLT5wYXJhbXMuZmR4ID0gdHJ1ZTsKIAogCWlmIChzdHJzdHIocCwgImF1dG9zZW5zZSIpIHx8IHN0cnN0cihwLCAiQVVUT1NFTlNFIikpIHsKIAkgICAgaWYgKHN0cnN0cihwLCAiVFAiKSkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RtZmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC9kbWZlLmMKaW5kZXggMTdiMTFlZS4uNTFmNzU0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL2RtZmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvZG1mZS5jCkBAIC0xMDg1LDEwICsxMDg1LDExIEBACiB7CiAJc3RydWN0IGRtZmVfYm9hcmRfaW5mbyAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKIAlpZiAobnAtPnBkZXYpCi0JCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBkZXYpKTsKKwkJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBkZXYpLAorCQkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiAJZWxzZQogCQlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiRUlTQSAweCVseCAlZCIsCiAJCQlkZXYtPmJhc2VfYWRkciwgZGV2LT5pcnEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL3R1bGlwX2NvcmUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC90dWxpcF9jb3JlLmMKaW5kZXggOTY1NmRkMC4uNGViMGQ3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL3R1bGlwX2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvdHVsaXBfY29yZS5jCkBAIC04NzEsOSArODcxLDkgQEAKIHN0YXRpYyB2b2lkIHR1bGlwX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IHR1bGlwX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wZGV2KSk7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGRldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC91bGk1MjZ4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvdWxpNTI2eC5jCmluZGV4IDdhNDRhN2EuLjQ4YjBiNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC91bGk1MjZ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGVjL3R1bGlwL3VsaTUyNnguYwpAQCAtOTYwLDEwICs5NjAsMTEgQEAKIHsKIAlzdHJ1Y3QgdWxpNTI2eF9ib2FyZF9pbmZvICpucCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwogCWlmIChucC0+cGRldikKLQkJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGRldikpOworCQlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGRldiksCisJCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIAllbHNlCiAJCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJFSVNBIDB4JWx4ICVkIiwKIAkJCWRldi0+YmFzZV9hZGRyLCBkZXYtPmlycSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9kZWMvdHVsaXAvd2luYm9uZC04NDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC93aW5ib25kLTg0MC5jCmluZGV4IDRkMDEyMTkuLjUyZGE3YjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC93aW5ib25kLTg0MC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RlYy90dWxpcC93aW5ib25kLTg0MC5jCkBAIC0xMzkwLDkgKzEzOTAsOSBAQAogewogCXN0cnVjdCBuZXRkZXZfcHJpdmF0ZSAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3RyY3B5IChpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkgKGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKLQlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBjaV9kZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIGludCBuZXRkZXZfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2NtZCAqY21kKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGxpbmsvZGU2MDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RsaW5rL2RlNjAwLmMKaW5kZXggMjNhNjUzOS4uYzI0ZmFiMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGxpbmsvZGU2MDAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9kZTYwMC5jCkBAIC01OSw3ICs1OSw3IEBACiAKICNpbmNsdWRlICJkZTYwMC5oIgogCi1zdGF0aWMgdW5zaWduZWQgaW50IGNoZWNrX2xvc3QgPSAxOworc3RhdGljIGJvb2wgY2hlY2tfbG9zdCA9IHRydWU7CiBtb2R1bGVfcGFyYW0oY2hlY2tfbG9zdCwgYm9vbCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNoZWNrX2xvc3QsICJJZiBzZXQgdGhlbiBjaGVjayBmb3IgdW5wbHVnZ2VkIGRlNjAwIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RsaW5rL3N1bmRhbmNlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbGluay9zdW5kYW5jZS5jCmluZGV4IGRjZDdmN2EuLjI4YTNhOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RsaW5rL3N1bmRhbmNlLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZGxpbmsvc3VuZGFuY2UuYwpAQCAtMTYzNCw5ICsxNjM0LDkgQEAKIHN0YXRpYyB2b2lkIGdldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7Ci0Jc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBjaV9kZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIGludCBnZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICplY21kKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZG5ldC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZG5ldC5jCmluZGV4IGMxMDYzZDEuLmNlODhjMGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2RuZXQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9kbmV0LmMKQEAgLTgwNCw5ICs4MDQsOSBAQAogc3RhdGljIHZvaWQgZG5ldF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgIjAiKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sICIwIiwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZG5ldF9ldGh0b29sX29wcyA9IHsKQEAgLTk3NywxOCArOTc3LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgZG5ldF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZG5ldF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZG5ldF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmRuZXRfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZG5ldF9pbml0KTsKLW1vZHVsZV9leGl0KGRuZXRfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGRuZXRfZHJpdmVyKTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEYXZlIERORVQgRXRoZXJuZXQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmUuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oCmluZGV4IDY0NGU4ZmUuLmNiZGVjMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZS5oCkBAIC00MCw2ICs0MCw3IEBACiAjZGVmaW5lIE9DX05BTUUJCQkiRW11bGV4IE9uZUNvbm5lY3QgMTBHYnBzIE5JQyIKICNkZWZpbmUgT0NfTkFNRV9CRQkJT0NfTkFNRQkiKGJlMykiCiAjZGVmaW5lIE9DX05BTUVfTEFOQ0VSCQlPQ19OQU1FICIoTGFuY2VyKSIKKyNkZWZpbmUgT0NfTkFNRV9TSAkJT0NfTkFNRSAiKFNreWhhd2spIgogI2RlZmluZSBEUlZfREVTQwkJIlNlcnZlckVuZ2luZXMgQmxhZGVFbmdpbmUgMTBHYnBzIE5JQyBEcml2ZXIiCiAKICNkZWZpbmUgQkVfVkVORE9SX0lEIAkJMHgxOWEyCkBAIC01MCw2ICs1MSw3IEBACiAjZGVmaW5lIE9DX0RFVklDRV9JRDIJCTB4NzEwCS8qIERldmljZSBJZCBmb3IgQkUzIGNhcmRzICovCiAjZGVmaW5lIE9DX0RFVklDRV9JRDMJCTB4ZTIyMAkvKiBEZXZpY2UgaWQgZm9yIExhbmNlciBjYXJkcyAqLwogI2RlZmluZSBPQ19ERVZJQ0VfSUQ0ICAgICAgICAgICAweGUyMjggICAvKiBEZXZpY2UgaWQgZm9yIFZGIGluIExhbmNlciAqLworI2RlZmluZSBPQ19ERVZJQ0VfSUQ1CQkweDcyMAkvKiBEZXZpY2UgSWQgZm9yIFNreWhhd2sgY2FyZHMgKi8KIAogc3RhdGljIGlubGluZSBjaGFyICpuaWNfbmFtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKIHsKQEAgLTYzLDYgKzY1LDggQEAKIAkJcmV0dXJuIE9DX05BTUVfTEFOQ0VSOwogCWNhc2UgQkVfREVWSUNFX0lEMjoKIAkJcmV0dXJuIEJFM19OQU1FOworCWNhc2UgT0NfREVWSUNFX0lENToKKwkJcmV0dXJuIE9DX05BTUVfU0g7CiAJZGVmYXVsdDoKIAkJcmV0dXJuIEJFX05BTUU7CiAJfQpAQCAtMjg4LDE0ICsyOTIsMTQgQEAKIH07CiAKIHN0cnVjdCBiZV92Zl9jZmcgewotCXVuc2lnbmVkIGNoYXIgdmZfbWFjX2FkZHJbRVRIX0FMRU5dOwotCXUzMiB2Zl9pZl9oYW5kbGU7Ci0JdTMyIHZmX3BtYWNfaWQ7Ci0JdTE2IHZmX3ZsYW5fdGFnOwotCXUzMiB2Zl90eF9yYXRlOworCXVuc2lnbmVkIGNoYXIgbWFjX2FkZHJbRVRIX0FMRU5dOworCWludCBpZl9oYW5kbGU7CisJaW50IHBtYWNfaWQ7CisJdTE2IHZsYW5fdGFnOworCXUzMiB0eF9yYXRlOwogfTsKIAotI2RlZmluZSBCRV9JTlZBTElEX1BNQUNfSUQJCTB4ZmZmZmZmZmYKKyNkZWZpbmUgQkVfRkxBR1NfTElOS19TVEFUVVNfSU5JVAkJMQogCiBzdHJ1Y3QgYmVfYWRhcHRlciB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXY7CkBAIC0zNDUsMTMgKzM0OSwxNiBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKIAl1MTYgd29ya19jb3VudGVyOwogCisJdTMyIGZsYWdzOwogCS8qIEV0aHRvb2wga25vYnMgYW5kIGluZm8gKi8KIAljaGFyIGZ3X3ZlcltGV19WRVJfTEVOXTsKLQl1MzIgaWZfaGFuZGxlOwkJLyogVXNlZCB0byBjb25maWd1cmUgZmlsdGVyaW5nICovCisJaW50IGlmX2hhbmRsZTsJCS8qIFVzZWQgdG8gY29uZmlndXJlIGZpbHRlcmluZyAqLwogCXUzMiBwbWFjX2lkOwkJLyogTUFDIGFkZHIgaGFuZGxlIHVzZWQgYnkgQkUgY2FyZCAqLwogCXUzMiBiZWFjb25fc3RhdGU7CS8qIGZvciBzZXRfcGh5c19pZCAqLwogCiAJYm9vbCBlZWhfZXJyOworCWJvb2wgdWVfZGV0ZWN0ZWQ7CisJYm9vbCBmd190aW1lb3V0OwogCXUzMiBwb3J0X251bTsKIAlib29sIHByb21pc2N1b3VzOwogCWJvb2wgd29sOwpAQCAtMzU5LDcgKzM2Niw2IEBACiAJdTMyIGZ1bmN0aW9uX2NhcHM7CiAJdTMyIHJ4X2ZjOwkJLyogUnggZmxvdyBjb250cm9sICovCiAJdTMyIHR4X2ZjOwkJLyogVHggZmxvdyBjb250cm9sICovCi0JYm9vbCB1ZV9kZXRlY3RlZDsKIAlib29sIHN0YXRzX2NtZF9zZW50OwogCWludCBsaW5rX3NwZWVkOwogCXU4IHBvcnRfdHlwZTsKQEAgLTM2OSwxNiArMzc1LDIwIEBACiAJdTMyIGZsYXNoX3N0YXR1czsKIAlzdHJ1Y3QgY29tcGxldGlvbiBmbGFzaF9jb21wbDsKIAotCWJvb2wgYmUzX25hdGl2ZTsKLQlib29sIHNyaW92X2VuYWJsZWQ7Ci0Jc3RydWN0IGJlX3ZmX2NmZyAqdmZfY2ZnOworCXUzMiBudW1fdmZzOwogCXU4IGlzX3ZpcnRmbjsKKwlzdHJ1Y3QgYmVfdmZfY2ZnICp2Zl9jZmc7CisJYm9vbCBiZTNfbmF0aXZlOwogCXUzMiBzbGlfZmFtaWx5OwogCXU4IGhiYV9wb3J0X251bTsKIAl1MTYgcHZpZDsKIH07CiAKICNkZWZpbmUgYmVfcGh5c2ZuKGFkYXB0ZXIpICghYWRhcHRlci0+aXNfdmlydGZuKQorI2RlZmluZQlzcmlvdl9lbmFibGVkKGFkYXB0ZXIpCQkoYWRhcHRlci0+bnVtX3ZmcyA+IDApCisjZGVmaW5lIGZvcl9hbGxfdmZzKGFkYXB0ZXIsIHZmX2NmZywgaSkJCQkJCVwKKwlmb3IgKGkgPSAwLCB2Zl9jZmcgPSAmYWRhcHRlci0+dmZfY2ZnW2ldOyBpIDwgYWRhcHRlci0+bnVtX3ZmczsJXAorCQlpKyssIHZmX2NmZysrKQogCiAvKiBCbGFkZUVuZ2luZSBHZW5lcmF0aW9uIG51bWJlcnMgKi8KICNkZWZpbmUgQkVfR0VOMiAyCkBAIC01MjQsOSArNTM0LDE0IEBACiAJcmV0dXJuIGFkYXB0ZXItPm51bV9yeF9xcyA+IDE7CiB9CiAKK3N0YXRpYyBpbmxpbmUgYm9vbCBiZV9lcnJvcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gYWRhcHRlci0+ZWVoX2VyciB8fCBhZGFwdGVyLT51ZV9kZXRlY3RlZCB8fCBhZGFwdGVyLT5md190aW1lb3V0OworfQorCiBleHRlcm4gdm9pZCBiZV9jcV9ub3RpZnkoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUxNiBxaWQsIGJvb2wgYXJtLAogCQl1MTYgbnVtX3BvcHBlZCk7Ci1leHRlcm4gdm9pZCBiZV9saW5rX3N0YXR1c191cGRhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBsaW5rX3N0YXR1cyk7CitleHRlcm4gdm9pZCBiZV9saW5rX3N0YXR1c191cGRhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGxpbmtfc3RhdHVzKTsKIGV4dGVybiB2b2lkIGJlX3BhcnNlX3N0YXRzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGV4dGVybiBpbnQgYmVfbG9hZF9mdyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKmZ1bmMpOwogI2VuZGlmCQkJCS8qIEJFX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5jCmluZGV4IDJjN2IzNjYuLjBmY2I0NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuYwpAQCAtMzEsMTEgKzMxLDggQEAKIAlzdHJ1Y3QgYmVfcXVldWVfaW5mbyAqbWNjcSA9ICZhZGFwdGVyLT5tY2Nfb2JqLnE7CiAJdTMyIHZhbCA9IDA7CiAKLQlpZiAoYWRhcHRlci0+ZWVoX2VycikgewotCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJIkVycm9yIGluIENhcmQgRGV0ZWN0ZWQhIENhbm5vdCBpc3N1ZSBjb21tYW5kc1xuIik7CisJaWYgKGJlX2Vycm9yKGFkYXB0ZXIpKQogCQlyZXR1cm47Ci0JfQogCiAJdmFsIHw9IG1jY3EtPmlkICYgREJfTUNDUV9SSU5HX0lEX01BU0s7CiAJdmFsIHw9IDEgPDwgREJfTUNDUV9OVU1fUE9TVEVEX1NISUZUOwpAQCAtMTI4LDcgKzEyNSwxNCBAQAogc3RhdGljIHZvaWQgYmVfYXN5bmNfbGlua19zdGF0ZV9wcm9jZXNzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAogCQlzdHJ1Y3QgYmVfYXN5bmNfZXZlbnRfbGlua19zdGF0ZSAqZXZ0KQogewotCWJlX2xpbmtfc3RhdHVzX3VwZGF0ZShhZGFwdGVyLCBldnQtPnBvcnRfbGlua19zdGF0dXMpOworCS8qIFdoZW4gbGluayBzdGF0dXMgY2hhbmdlcywgbGluayBzcGVlZCBtdXN0IGJlIHJlLXF1ZXJpZWQgZnJvbSBGVyAqLworCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAtMTsKKworCS8qIEZvciB0aGUgaW5pdGlhbCBsaW5rIHN0YXR1cyBkbyBub3QgcmVseSBvbiB0aGUgQVNZTkMgZXZlbnQgYXMKKwkgKiBpdCBtYXkgbm90IGJlIHJlY2VpdmVkIGluIHNvbWUgY2FzZXMuCisJICovCisJaWYgKGFkYXB0ZXItPmZsYWdzICYgQkVfRkxBR1NfTElOS19TVEFUVVNfSU5JVCkKKwkJYmVfbGlua19zdGF0dXNfdXBkYXRlKGFkYXB0ZXIsIGV2dC0+cG9ydF9saW5rX3N0YXR1cyk7CiB9CiAKIC8qIEdycDUgQ29TIFByaW9yaXR5IGV2dCAqLwpAQCAtMjY2LDEwICsyNzAsMTAgQEAKIAlpbnQgaSwgbnVtLCBzdGF0dXMgPSAwOwogCXN0cnVjdCBiZV9tY2Nfb2JqICptY2Nfb2JqID0gJmFkYXB0ZXItPm1jY19vYmo7CiAKLQlpZiAoYWRhcHRlci0+ZWVoX2VycikKLQkJcmV0dXJuIC1FSU87Ci0KIAlmb3IgKGkgPSAwOyBpIDwgbWNjX3RpbWVvdXQ7IGkrKykgeworCQlpZiAoYmVfZXJyb3IoYWRhcHRlcikpCisJCQlyZXR1cm4gLUVJTzsKKwogCQludW0gPSBiZV9wcm9jZXNzX21jYyhhZGFwdGVyLCAmc3RhdHVzKTsKIAkJaWYgKG51bSkKIAkJCWJlX2NxX25vdGlmeShhZGFwdGVyLCBtY2Nfb2JqLT5jcS5pZCwKQEAgLTI4MCw3ICsyODQsOCBAQAogCQl1ZGVsYXkoMTAwKTsKIAl9CiAJaWYgKGkgPT0gbWNjX3RpbWVvdXQpIHsKLQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LCAibWNjcSBwb2xsIHRpbWVkIG91dFxuIik7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkZXIG5vdCByZXNwb25kaW5nXG4iKTsKKwkJYWRhcHRlci0+ZndfdGltZW91dCA9IHRydWU7CiAJCXJldHVybiAtMTsKIAl9CiAJcmV0dXJuIHN0YXR1czsKQEAgLTI5OCwyNiArMzAzLDIxIEBACiAJaW50IG1zZWNzID0gMDsKIAl1MzIgcmVhZHk7CiAKLQlpZiAoYWRhcHRlci0+ZWVoX2VycikgewotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCi0JCQkiRXJyb3IgZGV0ZWN0ZWQgaW4gY2FyZC5DYW5ub3QgaXNzdWUgY29tbWFuZHNcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KIAlkbyB7CisJCWlmIChiZV9lcnJvcihhZGFwdGVyKSkKKwkJCXJldHVybiAtRUlPOworCiAJCXJlYWR5ID0gaW9yZWFkMzIoZGIpOwotCQlpZiAocmVhZHkgPT0gMHhmZmZmZmZmZikgewotCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSJwY2kgc2xvdCBkaXNjb25uZWN0ZWRcbiIpOworCQlpZiAocmVhZHkgPT0gMHhmZmZmZmZmZikKIAkJCXJldHVybiAtMTsKLQkJfQogCiAJCXJlYWR5ICY9IE1QVV9NQUlMQk9YX0RCX1JEWV9NQVNLOwogCQlpZiAocmVhZHkpCiAJCQlicmVhazsKIAogCQlpZiAobXNlY3MgPiA0MDAwKSB7Ci0JCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJtYm94IHBvbGwgdGltZWQgb3V0XG4iKTsKKwkJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIkZXIG5vdCByZXNwb25kaW5nXG4iKTsKKwkJCWFkYXB0ZXItPmZ3X3RpbWVvdXQgPSB0cnVlOwogCQkJYmVfZGV0ZWN0X2R1bXBfdWUoYWRhcHRlcik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTU1NSw5ICs1NTUsNiBAQAogCXU4ICp3cmI7CiAJaW50IHN0YXR1czsKIAotCWlmIChhZGFwdGVyLT5lZWhfZXJyKQotCQlyZXR1cm4gLUVJTzsKLQogCWlmIChtdXRleF9sb2NrX2ludGVycnVwdGlibGUoJmFkYXB0ZXItPm1ib3hfbG9jaykpCiAJCXJldHVybiAtMTsKIApAQCAtNjE5LDcgKzYxNiw3IEBACiAKIC8qIFVzZSBNQ0MgKi8KIGludCBiZV9jbWRfbWFjX2FkZHJfcXVlcnkoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWNfYWRkciwKLQkJCXU4IHR5cGUsIGJvb2wgcGVybWFuZW50LCB1MzIgaWZfaGFuZGxlKQorCQkJdTggdHlwZSwgYm9vbCBwZXJtYW5lbnQsIHUzMiBpZl9oYW5kbGUsIHUzMiBwbWFjX2lkKQogewogCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CiAJc3RydWN0IGJlX2NtZF9yZXFfbWFjX3F1ZXJ5ICpyZXE7CkBAIC02NDEsNiArNjM4LDcgQEAKIAkJcmVxLT5wZXJtYW5lbnQgPSAxOwogCX0gZWxzZSB7CiAJCXJlcS0+aWZfaWQgPSBjcHVfdG9fbGUxNigodTE2KSBpZl9oYW5kbGUpOworCQlyZXEtPnBtYWNfaWQgPSBjcHVfdG9fbGUzMihwbWFjX2lkKTsKIAkJcmVxLT5wZXJtYW5lbnQgPSAwOwogCX0KIApAQCAtNjk1LDEyICs2OTMsMTUgQEAKIH0KIAogLyogVXNlcyBzeW5jaHJvbm91cyBNQ0NRICovCi1pbnQgYmVfY21kX3BtYWNfZGVsKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgaWZfaWQsIHUzMiBwbWFjX2lkLCB1MzIgZG9tKQoraW50IGJlX2NtZF9wbWFjX2RlbChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGlmX2lkLCBpbnQgcG1hY19pZCwgdTMyIGRvbSkKIHsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCXN0cnVjdCBiZV9jbWRfcmVxX3BtYWNfZGVsICpyZXE7CiAJaW50IHN0YXR1czsKIAorCWlmIChwbWFjX2lkID09IC0xKQorCQlyZXR1cm4gMDsKKwogCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOwogCiAJd3JiID0gd3JiX2Zyb21fbWNjcShhZGFwdGVyKTsKQEAgLTkyMywxMCArOTI0LDE0IEBACiAJdm9pZCAqY3R4dDsKIAlpbnQgc3RhdHVzOwogCi0JaWYgKG11dGV4X2xvY2tfaW50ZXJydXB0aWJsZSgmYWRhcHRlci0+bWJveF9sb2NrKSkKLQkJcmV0dXJuIC0xOworCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOwogCi0Jd3JiID0gd3JiX2Zyb21fbWJveChhZGFwdGVyKTsKKwl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOworCWlmICghd3JiKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCiAJcmVxID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOwogCWN0eHQgPSAmcmVxLT5jb250ZXh0OwogCkBAIC05NTIsMTQgKzk1NywxNSBAQAogCiAJYmVfY21kX3BhZ2VfYWRkcnNfcHJlcGFyZShyZXEtPnBhZ2VzLCBBUlJBWV9TSVpFKHJlcS0+cGFnZXMpLCBxX21lbSk7CiAKLQlzdGF0dXMgPSBiZV9tYm94X25vdGlmeV93YWl0KGFkYXB0ZXIpOworCXN0YXR1cyA9IGJlX21jY19ub3RpZnlfd2FpdChhZGFwdGVyKTsKIAlpZiAoIXN0YXR1cykgewogCQlzdHJ1Y3QgYmVfY21kX3Jlc3BfZXRoX3R4X2NyZWF0ZSAqcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAkJdHhxLT5pZCA9IGxlMTZfdG9fY3B1KHJlc3AtPmNpZCk7CiAJCXR4cS0+Y3JlYXRlZCA9IHRydWU7CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tYm94X2xvY2spOworZXJyOgorCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTAxOCw5ICsxMDI0LDYgQEAKIAl1OCBzdWJzeXMgPSAwLCBvcGNvZGUgPSAwOwogCWludCBzdGF0dXM7CiAKLQlpZiAoYWRhcHRlci0+ZWVoX2VycikKLQkJcmV0dXJuIC1FSU87Ci0KIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwdGVyLT5tYm94X2xvY2spKQogCQlyZXR1cm4gLTE7CiAKQEAgLTExMzYsMTYgKzExMzksMTMgQEAKIH0KIAogLyogVXNlcyBNQ0NRICovCi1pbnQgYmVfY21kX2lmX2Rlc3Ryb3koc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBpbnRlcmZhY2VfaWQsIHUzMiBkb21haW4pCitpbnQgYmVfY21kX2lmX2Rlc3Ryb3koc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBpbnRlcmZhY2VfaWQsIHUzMiBkb21haW4pCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9pZl9kZXN0cm95ICpyZXE7CiAJaW50IHN0YXR1czsKIAotCWlmIChhZGFwdGVyLT5lZWhfZXJyKQotCQlyZXR1cm4gLUVJTzsKLQotCWlmICghaW50ZXJmYWNlX2lkKQorCWlmIChpbnRlcmZhY2VfaWQgPT0gLTEpCiAJCXJldHVybiAwOwogCiAJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CkBAIC0xMjM5LDcgKzEyMzksNyBAQAogCiAvKiBVc2VzIHN5bmNocm9ub3VzIG1jYyAqLwogaW50IGJlX2NtZF9saW5rX3N0YXR1c19xdWVyeShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKm1hY19zcGVlZCwKLQkJCXUxNiAqbGlua19zcGVlZCwgdTMyIGRvbSkKKwkJCSAgICAgdTE2ICpsaW5rX3NwZWVkLCB1OCAqbGlua19zdGF0dXMsIHUzMiBkb20pCiB7CiAJc3RydWN0IGJlX21jY193cmIgKndyYjsKIAlzdHJ1Y3QgYmVfY21kX3JlcV9saW5rX3N0YXR1cyAqcmVxOwpAQCAtMTI0Nyw2ICsxMjQ3LDkgQEAKIAogCXNwaW5fbG9ja19iaCgmYWRhcHRlci0+bWNjX2xvY2spOwogCisJaWYgKGxpbmtfc3RhdHVzKQorCQkqbGlua19zdGF0dXMgPSBMSU5LX0RPV047CisKIAl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOwogCWlmICghd3JiKSB7CiAJCXN0YXR1cyA9IC1FQlVTWTsKQEAgLTEyNTQsNiArMTI1Nyw5IEBACiAJfQogCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAorCWlmIChhZGFwdGVyLT5nZW5lcmF0aW9uID09IEJFX0dFTjMgfHwgbGFuY2VyX2NoaXAoYWRhcHRlcikpCisJCXJlcS0+aGRyLnZlcnNpb24gPSAxOworCiAJYmVfd3JiX2NtZF9oZHJfcHJlcGFyZSgmcmVxLT5oZHIsIENNRF9TVUJTWVNURU1fQ09NTU9OLAogCQlPUENPREVfQ09NTU9OX05UV0tfTElOS19TVEFUVVNfUVVFUlksIHNpemVvZigqcmVxKSwgd3JiLCBOVUxMKTsKIApAQCAtMTI2MSwxMCArMTI2NywxMyBAQAogCWlmICghc3RhdHVzKSB7CiAJCXN0cnVjdCBiZV9jbWRfcmVzcF9saW5rX3N0YXR1cyAqcmVzcCA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKIAkJaWYgKHJlc3AtPm1hY19zcGVlZCAhPSBQSFlfTElOS19TUEVFRF9aRVJPKSB7Ci0JCQkqbGlua19zcGVlZCA9IGxlMTZfdG9fY3B1KHJlc3AtPmxpbmtfc3BlZWQpOworCQkJaWYgKGxpbmtfc3BlZWQpCisJCQkJKmxpbmtfc3BlZWQgPSBsZTE2X3RvX2NwdShyZXNwLT5saW5rX3NwZWVkKTsKIAkJCWlmIChtYWNfc3BlZWQpCiAJCQkJKm1hY19zcGVlZCA9IHJlc3AtPm1hY19zcGVlZDsKIAkJfQorCQlpZiAobGlua19zdGF0dXMpCisJCQkqbGlua19zdGF0dXMgPSByZXNwLT5sb2dpY2FsX2xpbmtfc3RhdHVzOwogCX0KIAogZXJyOgpAQCAtMTY3Myw4ICsxNjgyLDkgQEAKIHsKIAlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOwogCXN0cnVjdCBiZV9jbWRfcmVxX3Jzc19jb25maWcgKnJlcTsKLQl1MzIgbXloYXNoWzEwXSA9IHsweDAxMjMsIDB4NDU2NywgMHg4OUFCLCAweENERUYsIDB4MDFFRiwKLQkJCTB4MDEyMywgMHg0NTY3LCAweDg5QUIsIDB4Q0RFRiwgMHgwMUVGfTsKKwl1MzIgbXloYXNoWzEwXSA9IHsweDE1ZDQzZmE1LCAweDI1MzQ2ODVhLCAweDVmODc2OTNhLCAweDU2Njg0OTRlLAorCQkJMHgzM2NmNmE1MywgMHgzODMzMzRjNiwgMHg3NmFjNDI1NywgMHg1OWIyNDJiMiwKKwkJCTB4M2VhODNjMDIsIDB4NGExMTAzMDR9OwogCWludCBzdGF0dXM7CiAKIAlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZhZGFwdGVyLT5tYm94X2xvY2spKQpAQCAtMTgzNiw2ICsxODQ2LDUzIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAoraW50IGxhbmNlcl9jbWRfcmVhZF9vYmplY3Qoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBiZV9kbWFfbWVtICpjbWQsCisJCXUzMiBkYXRhX3NpemUsIHUzMiBkYXRhX29mZnNldCwgY29uc3QgY2hhciAqb2JqX25hbWUsCisJCXUzMiAqZGF0YV9yZWFkLCB1MzIgKmVvZiwgdTggKmFkZG5fc3RhdHVzKQoreworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CisJc3RydWN0IGxhbmNlcl9jbWRfcmVxX3JlYWRfb2JqZWN0ICpyZXE7CisJc3RydWN0IGxhbmNlcl9jbWRfcmVzcF9yZWFkX29iamVjdCAqcmVzcDsKKwlpbnQgc3RhdHVzOworCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisKKwl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOworCWlmICghd3JiKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnJfdW5sb2NrOworCX0KKworCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKworCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKKwkJCU9QQ09ERV9DT01NT05fUkVBRF9PQkpFQ1QsCisJCQlzaXplb2Yoc3RydWN0IGxhbmNlcl9jbWRfcmVxX3JlYWRfb2JqZWN0KSwgd3JiLAorCQkJTlVMTCk7CisKKwlyZXEtPmRlc2lyZWRfcmVhZF9sZW4gPSBjcHVfdG9fbGUzMihkYXRhX3NpemUpOworCXJlcS0+cmVhZF9vZmZzZXQgPSBjcHVfdG9fbGUzMihkYXRhX29mZnNldCk7CisJc3RyY3B5KHJlcS0+b2JqZWN0X25hbWUsIG9ial9uYW1lKTsKKwlyZXEtPmRlc2NyaXB0b3JfY291bnQgPSBjcHVfdG9fbGUzMigxKTsKKwlyZXEtPmJ1Zl9sZW4gPSBjcHVfdG9fbGUzMihkYXRhX3NpemUpOworCXJlcS0+YWRkcl9sb3cgPSBjcHVfdG9fbGUzMigoY21kLT5kbWEgJiAweEZGRkZGRkZGKSk7CisJcmVxLT5hZGRyX2hpZ2ggPSBjcHVfdG9fbGUzMih1cHBlcl8zMl9iaXRzKGNtZC0+ZG1hKSk7CisKKwlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CisKKwlyZXNwID0gZW1iZWRkZWRfcGF5bG9hZCh3cmIpOworCWlmICghc3RhdHVzKSB7CisJCSpkYXRhX3JlYWQgPSBsZTMyX3RvX2NwdShyZXNwLT5hY3R1YWxfcmVhZF9sZW4pOworCQkqZW9mID0gbGUzMl90b19jcHUocmVzcC0+ZW9mKTsKKwl9IGVsc2UgeworCQkqYWRkbl9zdGF0dXMgPSByZXNwLT5hZGRpdGlvbmFsX3N0YXR1czsKKwl9CisKK2Vycl91bmxvY2s6CisJc3Bpbl91bmxvY2tfYmgoJmFkYXB0ZXItPm1jY19sb2NrKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCiBpbnQgYmVfY21kX3dyaXRlX2ZsYXNocm9tKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBzdHJ1Y3QgYmVfZG1hX21lbSAqY21kLAogCQkJdTMyIGZsYXNoX3R5cGUsIHUzMiBmbGFzaF9vcGNvZGUsIHUzMiBidWZfc2l6ZSkKIHsKQEAgLTIyMzgsMyArMjI5NSw5OSBAQAogCW11dGV4X3VubG9jaygmYWRhcHRlci0+bWJveF9sb2NrKTsKIAlyZXR1cm4gc3RhdHVzOwogfQorCisvKiBVc2VzIHN5bmNocm9ub3VzIE1DQ1EgKi8KK2ludCBiZV9jbWRfZ2V0X21hY19mcm9tX2xpc3Qoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiBkb21haW4sCisJCQkJCQkJdTMyICpwbWFjX2lkKQoreworCXN0cnVjdCBiZV9tY2Nfd3JiICp3cmI7CisJc3RydWN0IGJlX2NtZF9yZXFfZ2V0X21hY19saXN0ICpyZXE7CisJaW50IHN0YXR1czsKKwlpbnQgbWFjX2NvdW50OworCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisKKwl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOworCWlmICghd3JiKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCXJlcSA9IGVtYmVkZGVkX3BheWxvYWQod3JiKTsKKworCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKKwkJCQlPUENPREVfQ09NTU9OX0dFVF9NQUNfTElTVCwgc2l6ZW9mKCpyZXEpLAorCQkJCXdyYiwgTlVMTCk7CisKKwlyZXEtPmhkci5kb21haW4gPSBkb21haW47CisKKwlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CisJaWYgKCFzdGF0dXMpIHsKKwkJc3RydWN0IGJlX2NtZF9yZXNwX2dldF9tYWNfbGlzdCAqcmVzcCA9CisJCQkJCQllbWJlZGRlZF9wYXlsb2FkKHdyYik7CisJCWludCBpOworCQl1OCAqY3R4dCA9ICZyZXNwLT5jb250ZXh0WzBdWzBdOworCQlzdGF0dXMgPSAtRUlPOworCQltYWNfY291bnQgPSByZXNwLT5tYWNfY291bnQ7CisJCWJlX2R3c19sZV90b19jcHUoJnJlc3AtPmNvbnRleHQsIHNpemVvZihyZXNwLT5jb250ZXh0KSk7CisJCWZvciAoaSA9IDA7IGkgPCBtYWNfY291bnQ7IGkrKykgeworCQkJaWYgKCFBTUFQX0dFVF9CSVRTKHN0cnVjdCBhbWFwX2dldF9tYWNfbGlzdF9jb250ZXh0LAorCQkJCQkgICBhY3QsIGN0eHQpKSB7CisJCQkJKnBtYWNfaWQgPSBBTUFQX0dFVF9CSVRTCisJCQkJCShzdHJ1Y3QgYW1hcF9nZXRfbWFjX2xpc3RfY29udGV4dCwKKwkJCQkJIG1hY2lkLCBjdHh0KTsKKwkJCQlzdGF0dXMgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJY3R4dCArPSBzaXplb2Yoc3RydWN0IGFtYXBfZ2V0X21hY19saXN0X2NvbnRleHQpIC8gODsKKwkJfQorCX0KKworZXJyOgorCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KKworLyogVXNlcyBzeW5jaHJvbm91cyBNQ0NRICovCitpbnQgYmVfY21kX3NldF9tYWNfbGlzdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKm1hY19hcnJheSwKKwkJCXU4IG1hY19jb3VudCwgdTMyIGRvbWFpbikKK3sKKwlzdHJ1Y3QgYmVfbWNjX3dyYiAqd3JiOworCXN0cnVjdCBiZV9jbWRfcmVxX3NldF9tYWNfbGlzdCAqcmVxOworCWludCBzdGF0dXM7CisJc3RydWN0IGJlX2RtYV9tZW0gY21kOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihzdHJ1Y3QgYmVfZG1hX21lbSkpOworCWNtZC5zaXplID0gc2l6ZW9mKHN0cnVjdCBiZV9jbWRfcmVxX3NldF9tYWNfbGlzdCk7CisJY21kLnZhID0gZG1hX2FsbG9jX2NvaGVyZW50KCZhZGFwdGVyLT5wZGV2LT5kZXYsIGNtZC5zaXplLAorCQkJJmNtZC5kbWEsIEdGUF9LRVJORUwpOworCWlmICghY21kLnZhKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIk1lbW9yeSBhbGxvYyBmYWlsdXJlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisKKwl3cmIgPSB3cmJfZnJvbV9tY2NxKGFkYXB0ZXIpOworCWlmICghd3JiKSB7CisJCXN0YXR1cyA9IC1FQlVTWTsKKwkJZ290byBlcnI7CisJfQorCisJcmVxID0gY21kLnZhOworCWJlX3dyYl9jbWRfaGRyX3ByZXBhcmUoJnJlcS0+aGRyLCBDTURfU1VCU1lTVEVNX0NPTU1PTiwKKwkJCQlPUENPREVfQ09NTU9OX1NFVF9NQUNfTElTVCwgc2l6ZW9mKCpyZXEpLAorCQkJCXdyYiwgJmNtZCk7CisKKwlyZXEtPmhkci5kb21haW4gPSBkb21haW47CisJcmVxLT5tYWNfY291bnQgPSBtYWNfY291bnQ7CisJaWYgKG1hY19jb3VudCkKKwkJbWVtY3B5KHJlcS0+bWFjLCBtYWNfYXJyYXksIEVUSF9BTEVOKm1hY19jb3VudCk7CisKKwlzdGF0dXMgPSBiZV9tY2Nfbm90aWZ5X3dhaXQoYWRhcHRlcik7CisKK2VycjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmYWRhcHRlci0+cGRldi0+ZGV2LCBjbWQuc2l6ZSwKKwkJCQljbWQudmEsIGNtZC5kbWEpOworCXNwaW5fdW5sb2NrX2JoKCZhZGFwdGVyLT5tY2NfbG9jayk7CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfY21kcy5oCmluZGV4IGEzNWNkMDMuLmRjYTg5MjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9jbWRzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2NtZHMuaApAQCAtMTg5LDYgKzE4OSw5IEBACiAjZGVmaW5lIE9QQ09ERV9DT01NT05fR0VUX1BIWV9ERVRBSUxTCQkJMTAyCiAjZGVmaW5lIE9QQ09ERV9DT01NT05fU0VUX0RSSVZFUl9GVU5DVElPTl9DQVAJCTEwMwogI2RlZmluZSBPUENPREVfQ09NTU9OX0dFVF9DTlRMX0FERElUSU9OQUxfQVRUUklCVVRFUwkxMjEKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9HRVRfTUFDX0xJU1QJCQkxNDcKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9TRVRfTUFDX0xJU1QJCQkxNDgKKyNkZWZpbmUgT1BDT0RFX0NPTU1PTl9SRUFEX09CSkVDVAkJCTE3MQogI2RlZmluZSBPUENPREVfQ09NTU9OX1dSSVRFX09CSkVDVAkJCTE3MgogCiAjZGVmaW5lIE9QQ09ERV9FVEhfUlNTX0NPTkZJRwkJCQkxCkBAIC0yOTQsNiArMjk3LDcgQEAKIAl1OCB0eXBlOwogCXU4IHBlcm1hbmVudDsKIAl1MTYgaWZfaWQ7CisJdTMyIHBtYWNfaWQ7CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgYmVfY21kX3Jlc3BfbWFjX3F1ZXJ5IHsKQEAgLTk1Niw3ICs5NjAsOCBAQAogCXU4IG1nbXRfbWFjX2R1cGxleDsKIAl1OCBtZ210X21hY19zcGVlZDsKIAl1MTYgbGlua19zcGVlZDsKLQl1MzIgcnN2ZDA7CisJdTggbG9naWNhbF9saW5rX3N0YXR1czsKKwl1OCByc3ZkMVszXTsKIH0gX19wYWNrZWQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKiBQb3J0IElkZW50aWZpY2F0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTExNjEsNiArMTE2NiwzOCBAQAogCXUzMiBhY3R1YWxfd3JpdGVfbGVuOwogfTsKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKiBMYW5jZXIgUmVhZCBGVyBpbmZvICoqKioqKioqKioqKioqLworI2RlZmluZSBMQU5DRVJfUkVBRF9GSUxFX0NIVU5LCQkJKDMyKjEwMjQpCisjZGVmaW5lIExBTkNFUl9SRUFEX0ZJTEVfRU9GX01BU0sJCTB4ODAwMDAwMDAKKworI2RlZmluZSBMQU5DRVJfRldfRFVNUF9GSUxFCQkJIi9kYmcvZHVtcC5iaW4iCisjZGVmaW5lIExBTkNFUl9WUERfUEZfRklMRQkJCSIvdnBkL250cl9wZi52cGQiCisjZGVmaW5lIExBTkNFUl9WUERfVkZfRklMRQkJCSIvdnBkL250cl92Zi52cGQiCisKK3N0cnVjdCBsYW5jZXJfY21kX3JlcV9yZWFkX29iamVjdCB7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKKwl1MzIgZGVzaXJlZF9yZWFkX2xlbjsKKwl1MzIgcmVhZF9vZmZzZXQ7CisJdTggb2JqZWN0X25hbWVbMTA0XTsKKwl1MzIgZGVzY3JpcHRvcl9jb3VudDsKKwl1MzIgYnVmX2xlbjsKKwl1MzIgYWRkcl9sb3c7CisJdTMyIGFkZHJfaGlnaDsKK307CisKK3N0cnVjdCBsYW5jZXJfY21kX3Jlc3BfcmVhZF9vYmplY3QgeworCXU4IG9wY29kZTsKKwl1OCBzdWJzeXN0ZW07CisJdTggcnN2ZDFbMl07CisJdTggc3RhdHVzOworCXU4IGFkZGl0aW9uYWxfc3RhdHVzOworCXU4IHJzdmQyWzJdOworCXUzMiByZXNwX2xlbjsKKwl1MzIgYWN0dWFsX3Jlc3BfbGVuOworCXUzMiBhY3R1YWxfcmVhZF9sZW47CisJdTMyIGVvZjsKK307CisKIC8qKioqKioqKioqKioqKioqKioqKioqKiogV09MICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdHJ1Y3QgYmVfY21kX3JlcV9hY3BpX3dvbF9tYWdpY19jb25maWd7CiAJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKQEAgLTEzMDcsNiArMTM0NCwzNCBAQAogCXU4IHJzdmRbMjEyXTsKIH07CiAKKy8qKioqKioqKioqKioqKioqKioqKiBHRVQvU0VUX01BQ0xJU1QgICoqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBCRV9NQVhfTUFDCQkJNjQKK3N0cnVjdCBhbWFwX2dldF9tYWNfbGlzdF9jb250ZXh0IHsKKwl1OCBtYWNpZFszMV07CisJdTggYWN0OworfSBfX3BhY2tlZDsKKworc3RydWN0IGJlX2NtZF9yZXFfZ2V0X21hY19saXN0IHsKKwlzdHJ1Y3QgYmVfY21kX3JlcV9oZHIgaGRyOworCXUzMiByc3ZkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGJlX2NtZF9yZXNwX2dldF9tYWNfbGlzdCB7CisJc3RydWN0IGJlX2NtZF9yZXNwX2hkciBoZHI7CisJdTggbWFjX2NvdW50OworCXU4IHJzdmQxOworCXUxNiByc3ZkMjsKKwl1OCBjb250ZXh0W3NpemVvZihzdHJ1Y3QgYW1hcF9nZXRfbWFjX2xpc3RfY29udGV4dCkgLyA4XVtCRV9NQVhfTUFDXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBiZV9jbWRfcmVxX3NldF9tYWNfbGlzdCB7CisJc3RydWN0IGJlX2NtZF9yZXFfaGRyIGhkcjsKKwl1OCBtYWNfY291bnQ7CisJdTggcnN2ZDE7CisJdTE2IHJzdmQyOworCXN0cnVjdCBtYWNhZGRyIG1hY1tCRV9NQVhfTUFDXTsKK30gX19wYWNrZWQ7CisKIC8qKioqKioqKioqKioqKiogSFcgU3RhdHMgR2V0IHYxICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIEJFX1RYUF9TV19TWgkJCTQ4CiBzdHJ1Y3QgYmVfcG9ydF9yeGZfc3RhdHNfdjEgewpAQCAtMTQxMywxNSArMTQ3OCwxNSBAQAogZXh0ZXJuIGludCBiZV9wY2lfZm51bV9nZXQoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogZXh0ZXJuIGludCBiZV9jbWRfUE9TVChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcik7CiBleHRlcm4gaW50IGJlX2NtZF9tYWNfYWRkcl9xdWVyeShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKm1hY19hZGRyLAotCQkJdTggdHlwZSwgYm9vbCBwZXJtYW5lbnQsIHUzMiBpZl9oYW5kbGUpOworCQkJdTggdHlwZSwgYm9vbCBwZXJtYW5lbnQsIHUzMiBpZl9oYW5kbGUsIHUzMiBwbWFjX2lkKTsKIGV4dGVybiBpbnQgYmVfY21kX3BtYWNfYWRkKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1OCAqbWFjX2FkZHIsCiAJCQl1MzIgaWZfaWQsIHUzMiAqcG1hY19pZCwgdTMyIGRvbWFpbik7CiBleHRlcm4gaW50IGJlX2NtZF9wbWFjX2RlbChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGlmX2lkLAotCQkJdTMyIHBtYWNfaWQsIHUzMiBkb21haW4pOworCQkJaW50IHBtYWNfaWQsIHUzMiBkb21haW4pOwogZXh0ZXJuIGludCBiZV9jbWRfaWZfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgY2FwX2ZsYWdzLAogCQkJdTMyIGVuX2ZsYWdzLCB1OCAqbWFjLCB1MzIgKmlmX2hhbmRsZSwgdTMyICpwbWFjX2lkLAogCQkJdTMyIGRvbWFpbik7Ci1leHRlcm4gaW50IGJlX2NtZF9pZl9kZXN0cm95KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgaWZfaGFuZGxlLAorZXh0ZXJuIGludCBiZV9jbWRfaWZfZGVzdHJveShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgaW50IGlmX2hhbmRsZSwKIAkJCXUzMiBkb21haW4pOwogZXh0ZXJuIGludCBiZV9jbWRfZXFfY3JlYXRlKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAogCQkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKmVxLCBpbnQgZXFfZGVsYXkpOwpAQCAtMTQ0Myw4ICsxNTA4LDggQEAKIAkJCWludCB0eXBlKTsKIGV4dGVybiBpbnQgYmVfY21kX3J4cV9kZXN0cm95KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLAogCQkJc3RydWN0IGJlX3F1ZXVlX2luZm8gKnEpOwotZXh0ZXJuIGludCBiZV9jbWRfbGlua19zdGF0dXNfcXVlcnkoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsCi0JCQl1OCAqbWFjX3NwZWVkLCB1MTYgKmxpbmtfc3BlZWQsIHUzMiBkb20pOworZXh0ZXJuIGludCBiZV9jbWRfbGlua19zdGF0dXNfcXVlcnkoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWNfc3BlZWQsCisJCQkJICAgIHUxNiAqbGlua19zcGVlZCwgdTggKmxpbmtfc3RhdHVzLCB1MzIgZG9tKTsKIGV4dGVybiBpbnQgYmVfY21kX3Jlc2V0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKTsKIGV4dGVybiBpbnQgYmVfY21kX2dldF9zdGF0cyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKIAkJCXN0cnVjdCBiZV9kbWFfbWVtICpub25lbWJfY21kKTsKQEAgLTE0ODAsNiArMTU0NSw5IEBACiAJCQkJdTMyIGRhdGFfc2l6ZSwgdTMyIGRhdGFfb2Zmc2V0LAogCQkJCWNvbnN0IGNoYXIgKm9ial9uYW1lLAogCQkJCXUzMiAqZGF0YV93cml0dGVuLCB1OCAqYWRkbl9zdGF0dXMpOworaW50IGxhbmNlcl9jbWRfcmVhZF9vYmplY3Qoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBiZV9kbWFfbWVtICpjbWQsCisJCXUzMiBkYXRhX3NpemUsIHUzMiBkYXRhX29mZnNldCwgY29uc3QgY2hhciAqb2JqX25hbWUsCisJCXUzMiAqZGF0YV9yZWFkLCB1MzIgKmVvZiwgdTggKmFkZG5fc3RhdHVzKTsKIGludCBiZV9jbWRfZ2V0X2ZsYXNoX2NyYyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKmZsYXNoZWRfY3JjLAogCQkJCWludCBvZmZzZXQpOwogZXh0ZXJuIGludCBiZV9jbWRfZW5hYmxlX21hZ2ljX3dvbChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTggKm1hYywKQEAgLTE1MDYsNCArMTU3NCw4IEBACiBleHRlcm4gaW50IGJlX2NtZF9yZXFfbmF0aXZlX21vZGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogZXh0ZXJuIGludCBiZV9jbWRfZ2V0X3JlZ19sZW4oc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHUzMiAqbG9nX3NpemUpOwogZXh0ZXJuIHZvaWQgYmVfY21kX2dldF9yZWdzKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgYnVmX2xlbiwgdm9pZCAqYnVmKTsKK2V4dGVybiBpbnQgYmVfY21kX2dldF9tYWNfZnJvbV9saXN0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1MzIgZG9tYWluLAorCQkJCQkJCXUzMiAqcG1hY19pZCk7CitleHRlcm4gaW50IGJlX2NtZF9zZXRfbWFjX2xpc3Qoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICptYWNfYXJyYXksCisJCQkJCQl1OCBtYWNfY291bnQsIHUzMiBkb21haW4pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX2V0aHRvb2wuYwppbmRleCBiZjgxNTNlLi42ZGI2YjZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9ldGh0b29sLmMKQEAgLTEyNyw4ICsxMjcsOCBAQAogCW1lbXNldChmd19vbl9mbGFzaCwgMCAsIHNpemVvZihmd19vbl9mbGFzaCkpOwogCWJlX2NtZF9nZXRfZndfdmVyKGFkYXB0ZXIsIGFkYXB0ZXItPmZ3X3ZlciwgZndfb25fZmxhc2gpOwogCi0Jc3RyY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShkcnZpbmZvLT52ZXJzaW9uLCBEUlZfVkVSKTsKKwlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihkcnZpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIERSVl9WRVIsIHNpemVvZihkcnZpbmZvLT52ZXJzaW9uKSk7CiAJc3RybmNweShkcnZpbmZvLT5md192ZXJzaW9uLCBhZGFwdGVyLT5md192ZXIsIEZXX1ZFUl9MRU4pOwogCWlmIChtZW1jbXAoYWRhcHRlci0+ZndfdmVyLCBmd19vbl9mbGFzaCwgRldfVkVSX0xFTikgIT0gMCkgewogCQlzdHJjYXQoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIiBbIik7CkBAIC0xMzYsMjEgKzEzNiw4NCBAQAogCQlzdHJjYXQoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIl0iKTsKIAl9CiAKLQlzdHJjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpKTsKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKKwkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CiAJZHJ2aW5mby0+dGVzdGluZm9fbGVuID0gMDsKIAlkcnZpbmZvLT5yZWdkdW1wX2xlbiA9IDA7CiAJZHJ2aW5mby0+ZWVkdW1wX2xlbiA9IDA7CiB9CiAKK3N0YXRpYyB1MzIKK2xhbmNlcl9jbWRfZ2V0X2ZpbGVfbGVuKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1OCAqZmlsZV9uYW1lKQoreworCXUzMiBkYXRhX3JlYWQgPSAwLCBlb2Y7CisJdTggYWRkbl9zdGF0dXM7CisJc3RydWN0IGJlX2RtYV9tZW0gZGF0YV9sZW5fY21kOworCWludCBzdGF0dXM7CisKKwltZW1zZXQoJmRhdGFfbGVuX2NtZCwgMCwgc2l6ZW9mKGRhdGFfbGVuX2NtZCkpOworCS8qIGRhdGFfb2Zmc2V0IGFuZCBkYXRhX3NpemUgc2hvdWxkIGJlIDAgdG8gZ2V0IHJlZyBsZW4gKi8KKwlzdGF0dXMgPSBsYW5jZXJfY21kX3JlYWRfb2JqZWN0KGFkYXB0ZXIsICZkYXRhX2xlbl9jbWQsIDAsIDAsCisJCQkJZmlsZV9uYW1lLCAmZGF0YV9yZWFkLCAmZW9mLCAmYWRkbl9zdGF0dXMpOworCisJcmV0dXJuIGRhdGFfcmVhZDsKK30KKworc3RhdGljIGludAorbGFuY2VyX2NtZF9yZWFkX2ZpbGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4ICpmaWxlX25hbWUsCisJCXUzMiBidWZfbGVuLCB2b2lkICpidWYpCit7CisJc3RydWN0IGJlX2RtYV9tZW0gcmVhZF9jbWQ7CisJdTMyIHJlYWRfbGVuID0gMCwgdG90YWxfcmVhZF9sZW4gPSAwLCBjaHVua19zaXplOworCXUzMiBlb2YgPSAwOworCXU4IGFkZG5fc3RhdHVzOworCWludCBzdGF0dXMgPSAwOworCisJcmVhZF9jbWQuc2l6ZSA9IExBTkNFUl9SRUFEX0ZJTEVfQ0hVTks7CisJcmVhZF9jbWQudmEgPSBwY2lfYWxsb2NfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCByZWFkX2NtZC5zaXplLAorCQkJJnJlYWRfY21kLmRtYSk7CisKKwlpZiAoIXJlYWRfY21kLnZhKSB7CisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSB3aGlsZSByZWFkaW5nIGR1bXBcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwl3aGlsZSAoKHRvdGFsX3JlYWRfbGVuIDwgYnVmX2xlbikgJiYgIWVvZikgeworCQljaHVua19zaXplID0gbWluX3QodTMyLCAoYnVmX2xlbiAtIHRvdGFsX3JlYWRfbGVuKSwKKwkJCQlMQU5DRVJfUkVBRF9GSUxFX0NIVU5LKTsKKwkJY2h1bmtfc2l6ZSA9IEFMSUdOKGNodW5rX3NpemUsIDQpOworCQlzdGF0dXMgPSBsYW5jZXJfY21kX3JlYWRfb2JqZWN0KGFkYXB0ZXIsICZyZWFkX2NtZCwgY2h1bmtfc2l6ZSwKKwkJCQl0b3RhbF9yZWFkX2xlbiwgZmlsZV9uYW1lLCAmcmVhZF9sZW4sCisJCQkJJmVvZiwgJmFkZG5fc3RhdHVzKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCW1lbWNweShidWYgKyB0b3RhbF9yZWFkX2xlbiwgcmVhZF9jbWQudmEsIHJlYWRfbGVuKTsKKwkJCXRvdGFsX3JlYWRfbGVuICs9IHJlYWRfbGVuOworCQkJZW9mICY9IExBTkNFUl9SRUFEX0ZJTEVfRU9GX01BU0s7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwl9CisJcGNpX2ZyZWVfY29uc2lzdGVudChhZGFwdGVyLT5wZGV2LCByZWFkX2NtZC5zaXplLCByZWFkX2NtZC52YSwKKwkJCXJlYWRfY21kLmRtYSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCiBzdGF0aWMgaW50CiBiZV9nZXRfcmVnX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAl1MzIgbG9nX3NpemUgPSAwOwogCi0JaWYgKGJlX3BoeXNmbihhZGFwdGVyKSkKLQkJYmVfY21kX2dldF9yZWdfbGVuKGFkYXB0ZXIsICZsb2dfc2l6ZSk7Ci0KKwlpZiAoYmVfcGh5c2ZuKGFkYXB0ZXIpKSB7CisJCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkKKwkJCWxvZ19zaXplID0gbGFuY2VyX2NtZF9nZXRfZmlsZV9sZW4oYWRhcHRlciwKKwkJCQkJTEFOQ0VSX0ZXX0RVTVBfRklMRSk7CisJCWVsc2UKKwkJCWJlX2NtZF9nZXRfcmVnX2xlbihhZGFwdGVyLCAmbG9nX3NpemUpOworCX0KIAlyZXR1cm4gbG9nX3NpemU7CiB9CiAKQEAgLTE2MSw3ICsyMjQsMTEgQEAKIAogCWlmIChiZV9waHlzZm4oYWRhcHRlcikpIHsKIAkJbWVtc2V0KGJ1ZiwgMCwgcmVncy0+bGVuKTsKLQkJYmVfY21kX2dldF9yZWdzKGFkYXB0ZXIsIHJlZ3MtPmxlbiwgYnVmKTsKKwkJaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpKQorCQkJbGFuY2VyX2NtZF9yZWFkX2ZpbGUoYWRhcHRlciwgTEFOQ0VSX0ZXX0RVTVBfRklMRSwKKwkJCQkJcmVncy0+bGVuLCBidWYpOworCQllbHNlCisJCQliZV9jbWRfZ2V0X3JlZ3MoYWRhcHRlciwgcmVncy0+bGVuLCBidWYpOwogCX0KIH0KIApAQCAtMzYyLDExICs0MjksMTQgQEAKIAlzdHJ1Y3QgYmVfcGh5X2luZm8gcGh5X2luZm87CiAJdTggbWFjX3NwZWVkID0gMDsKIAl1MTYgbGlua19zcGVlZCA9IDA7CisJdTggbGlua19zdGF0dXM7CiAJaW50IHN0YXR1czsKIAogCWlmICgoYWRhcHRlci0+bGlua19zcGVlZCA8IDApIHx8ICghKG5ldGRldi0+ZmxhZ3MgJiBJRkZfVVApKSkgewogCQlzdGF0dXMgPSBiZV9jbWRfbGlua19zdGF0dXNfcXVlcnkoYWRhcHRlciwgJm1hY19zcGVlZCwKLQkJCQkJCSZsaW5rX3NwZWVkLCAwKTsKKwkJCQkJCSAgJmxpbmtfc3BlZWQsICZsaW5rX3N0YXR1cywgMCk7CisJCWlmICghc3RhdHVzKQorCQkJYmVfbGlua19zdGF0dXNfdXBkYXRlKGFkYXB0ZXIsIGxpbmtfc3RhdHVzKTsKIAogCQkvKiBsaW5rX3NwZWVkIGlzIGluIHVuaXRzIG9mIDEwIE1icHMgKi8KIAkJaWYgKGxpbmtfc3BlZWQpIHsKQEAgLTQ1MywxNiArNTIzLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkCi1iZV9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHN0cnVjdCBldGh0b29sX3JpbmdwYXJhbSAqcmluZykKK3N0YXRpYyB2b2lkIGJlX2dldF9yaW5ncGFyYW0oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtICpyaW5nKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCXJpbmctPnJ4X21heF9wZW5kaW5nID0gYWRhcHRlci0+cnhfb2JqWzBdLnEubGVuOwotCXJpbmctPnR4X21heF9wZW5kaW5nID0gYWRhcHRlci0+dHhfb2JqWzBdLnEubGVuOwotCi0JcmluZy0+cnhfcGVuZGluZyA9IGF0b21pY19yZWFkKCZhZGFwdGVyLT5yeF9vYmpbMF0ucS51c2VkKTsKLQlyaW5nLT50eF9wZW5kaW5nID0gYXRvbWljX3JlYWQoJmFkYXB0ZXItPnR4X29ialswXS5xLnVzZWQpOworCXJpbmctPnJ4X21heF9wZW5kaW5nID0gcmluZy0+cnhfcGVuZGluZyA9IGFkYXB0ZXItPnJ4X29ialswXS5xLmxlbjsKKwlyaW5nLT50eF9tYXhfcGVuZGluZyA9IHJpbmctPnR4X3BlbmRpbmcgPSBhZGFwdGVyLT50eF9vYmpbMF0ucS5sZW47CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC02MzYsNyArNzAzLDcgQEAKIAl9CiAKIAlpZiAoYmVfY21kX2xpbmtfc3RhdHVzX3F1ZXJ5KGFkYXB0ZXIsICZtYWNfc3BlZWQsCi0JCQkJJnFvc19saW5rX3NwZWVkLCAwKSAhPSAwKSB7CisJCQkJICAgICAmcW9zX2xpbmtfc3BlZWQsIE5VTEwsIDApICE9IDApIHsKIAkJdGVzdC0+ZmxhZ3MgfD0gRVRIX1RFU1RfRkxfRkFJTEVEOwogCQlkYXRhWzRdID0gLTE7CiAJfSBlbHNlIGlmICghbWFjX3NwZWVkKSB7CkBAIC02NjAsNyArNzI3LDE3IEBACiBzdGF0aWMgaW50CiBiZV9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewotCXJldHVybiBCRV9SRUFEX1NFRVBST01fTEVOOworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKKwkJaWYgKGJlX3BoeXNmbihhZGFwdGVyKSkKKwkJCXJldHVybiBsYW5jZXJfY21kX2dldF9maWxlX2xlbihhZGFwdGVyLAorCQkJCQlMQU5DRVJfVlBEX1BGX0ZJTEUpOworCQllbHNlCisJCQlyZXR1cm4gbGFuY2VyX2NtZF9nZXRfZmlsZV9sZW4oYWRhcHRlciwKKwkJCQkJTEFOQ0VSX1ZQRF9WRl9GSUxFKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gQkVfUkVBRF9TRUVQUk9NX0xFTjsKKwl9CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTY3NSw2ICs3NTIsMTUgQEAKIAlpZiAoIWVlcHJvbS0+bGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkgeworCQlpZiAoYmVfcGh5c2ZuKGFkYXB0ZXIpKQorCQkJcmV0dXJuIGxhbmNlcl9jbWRfcmVhZF9maWxlKGFkYXB0ZXIsIExBTkNFUl9WUERfUEZfRklMRSwKKwkJCQkJZWVwcm9tLT5sZW4sIGRhdGEpOworCQllbHNlCisJCQlyZXR1cm4gbGFuY2VyX2NtZF9yZWFkX2ZpbGUoYWRhcHRlciwgTEFOQ0VSX1ZQRF9WRl9GSUxFLAorCQkJCQllZXByb20tPmxlbiwgZGF0YSk7CisJfQorCiAJZWVwcm9tLT5tYWdpYyA9IEJFX1ZFTkRPUl9JRCB8IChhZGFwdGVyLT5wZGV2LT5kZXZpY2U8PDE2KTsKIAogCW1lbXNldCgmZWVwcm9tX2NtZCwgMCwgc2l6ZW9mKHN0cnVjdCBiZV9kbWFfbWVtKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZW11bGV4L2JlbmV0L2JlX21haW4uYwppbmRleCBiZjI2NmEwLi42YzQ2NzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9lbXVsZXgvYmVuZXQvYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2VtdWxleC9iZW5ldC9iZV9tYWluLmMKQEAgLTI3LDEzICsyNywxNCBAQAogTU9EVUxFX0FVVEhPUigiU2VydmVyRW5naW5lcyBDb3Jwb3JhdGlvbiIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgdXNob3J0IHJ4X2ZyYWdfc2l6ZSA9IDIwNDg7CiBzdGF0aWMgdW5zaWduZWQgaW50IG51bV92ZnM7Ci1tb2R1bGVfcGFyYW0ocnhfZnJhZ19zaXplLCB1c2hvcnQsIFNfSVJVR08pOwogbW9kdWxlX3BhcmFtKG51bV92ZnMsIHVpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhyeF9mcmFnX3NpemUsICJTaXplIG9mIGEgZnJhZ21lbnQgdGhhdCBob2xkcyByY3ZkIGRhdGEuIik7CiBNT0RVTEVfUEFSTV9ERVNDKG51bV92ZnMsICJOdW1iZXIgb2YgUENJIFZGcyB0byBpbml0aWFsaXplIik7CiAKK3N0YXRpYyB1c2hvcnQgcnhfZnJhZ19zaXplID0gMjA0ODsKK21vZHVsZV9wYXJhbShyeF9mcmFnX3NpemUsIHVzaG9ydCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKHJ4X2ZyYWdfc2l6ZSwgIlNpemUgb2YgYSBmcmFnbWVudCB0aGF0IGhvbGRzIHJjdmQgZGF0YS4iKTsKKwogc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGJlX2Rldl9pZHMpID0gewogCXsgUENJX0RFVklDRShCRV9WRU5ET1JfSUQsIEJFX0RFVklDRV9JRDEpIH0sCiAJeyBQQ0lfREVWSUNFKEJFX1ZFTkRPUl9JRCwgQkVfREVWSUNFX0lEMikgfSwKQEAgLTQxLDYgKzQyLDcgQEAKIAl7IFBDSV9ERVZJQ0UoQkVfVkVORE9SX0lELCBPQ19ERVZJQ0VfSUQyKSB9LAogCXsgUENJX0RFVklDRShFTVVMRVhfVkVORE9SX0lELCBPQ19ERVZJQ0VfSUQzKX0sCiAJeyBQQ0lfREVWSUNFKEVNVUxFWF9WRU5ET1JfSUQsIE9DX0RFVklDRV9JRDQpfSwKKwl7IFBDSV9ERVZJQ0UoRU1VTEVYX1ZFTkRPUl9JRCwgT0NfREVWSUNFX0lENSl9LAogCXsgMCB9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJlX2Rldl9pZHMpOwpAQCAtMjM3LDcgKzIzOSw4IEBACiAJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKIAogCXN0YXR1cyA9IGJlX2NtZF9tYWNfYWRkcl9xdWVyeShhZGFwdGVyLCBjdXJyZW50X21hYywKLQkJCU1BQ19BRERSRVNTX1RZUEVfTkVUV09SSywgZmFsc2UsIGFkYXB0ZXItPmlmX2hhbmRsZSk7CisJCQkJTUFDX0FERFJFU1NfVFlQRV9ORVRXT1JLLCBmYWxzZSwKKwkJCQlhZGFwdGVyLT5pZl9oYW5kbGUsIDApOwogCWlmIChzdGF0dXMpCiAJCWdvdG8gZXJyOwogCkBAIC0zMTUsNiArMzE4LDggQEAKIAlzdHJ1Y3QgYmVfZHJ2X3N0YXRzICpkcnZzID0gJmFkYXB0ZXItPmRydl9zdGF0czsKIAogCWJlX2R3c19sZV90b19jcHUoaHdfc3RhdHMsIHNpemVvZigqaHdfc3RhdHMpKTsKKwlkcnZzLT5wbWVtX2ZpZm9fb3ZlcmZsb3dfZHJvcCA9IHBvcnRfc3RhdHMtPnBtZW1fZmlmb19vdmVyZmxvd19kcm9wOworCWRydnMtPnJ4X3ByaW9yaXR5X3BhdXNlX2ZyYW1lcyA9IHBvcnRfc3RhdHMtPnJ4X3ByaW9yaXR5X3BhdXNlX2ZyYW1lczsKIAlkcnZzLT5yeF9wYXVzZV9mcmFtZXMgPSBwb3J0X3N0YXRzLT5yeF9wYXVzZV9mcmFtZXM7CiAJZHJ2cy0+cnhfY3JjX2Vycm9ycyA9IHBvcnRfc3RhdHMtPnJ4X2NyY19lcnJvcnM7CiAJZHJ2cy0+cnhfY29udHJvbF9mcmFtZXMgPSBwb3J0X3N0YXRzLT5yeF9jb250cm9sX2ZyYW1lczsKQEAgLTQ5MSwxOSArNDk2LDE5IEBACiAJcmV0dXJuIHN0YXRzOwogfQogCi12b2lkIGJlX2xpbmtfc3RhdHVzX3VwZGF0ZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwgdTMyIGxpbmtfc3RhdHVzKQordm9pZCBiZV9saW5rX3N0YXR1c191cGRhdGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IGxpbmtfc3RhdHVzKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAKLQkvKiB3aGVuIGxpbmsgc3RhdHVzIGNoYW5nZXMsIGxpbmsgc3BlZWQgbXVzdCBiZSByZS1xdWVyaWVkIGZyb20gY2FyZCAqLwotCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAtMTsKLQlpZiAoKGxpbmtfc3RhdHVzICYgTElOS19TVEFUVVNfTUFTSykgPT0gTElOS19VUCkgewotCQluZXRpZl9jYXJyaWVyX29uKG5ldGRldik7Ci0JCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICIlczogTGluayB1cFxuIiwgbmV0ZGV2LT5uYW1lKTsKLQl9IGVsc2UgeworCWlmICghKGFkYXB0ZXItPmZsYWdzICYgQkVfRkxBR1NfTElOS19TVEFUVVNfSU5JVCkpIHsKIAkJbmV0aWZfY2Fycmllcl9vZmYobmV0ZGV2KTsKLQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIiVzOiBMaW5rIGRvd25cbiIsIG5ldGRldi0+bmFtZSk7CisJCWFkYXB0ZXItPmZsYWdzIHw9IEJFX0ZMQUdTX0xJTktfU1RBVFVTX0lOSVQ7CiAJfQorCisJaWYgKChsaW5rX3N0YXR1cyAmIExJTktfU1RBVFVTX01BU0spID09IExJTktfVVApCisJCW5ldGlmX2NhcnJpZXJfb24obmV0ZGV2KTsKKwllbHNlCisJCW5ldGlmX2NhcnJpZXJfb2ZmKG5ldGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGJlX3R4X3N0YXRzX3VwZGF0ZShzdHJ1Y3QgYmVfdHhfb2JqICp0eG8sCkBAIC01NDksMTEgKzU1NCwyNiBAQAogCXdyYi0+ZnJhZ19sZW4gPSBsZW4gJiBFVEhfV1JCX0ZSQUdfTEVOX01BU0s7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdTE2IGJlX2dldF90eF92bGFuX3RhZyhzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1OCB2bGFuX3ByaW87CisJdTE2IHZsYW5fdGFnOworCisJdmxhbl90YWcgPSB2bGFuX3R4X3RhZ19nZXQoc2tiKTsKKwl2bGFuX3ByaW8gPSAodmxhbl90YWcgJiBWTEFOX1BSSU9fTUFTSykgPj4gVkxBTl9QUklPX1NISUZUOworCS8qIElmIHZsYW4gcHJpb3JpdHkgcHJvdmlkZWQgYnkgT1MgaXMgTk9UIGluIGF2YWlsYWJsZSBibWFwICovCisJaWYgKCEoYWRhcHRlci0+dmxhbl9wcmlvX2JtYXAgJiAoMSA8PCB2bGFuX3ByaW8pKSkKKwkJdmxhbl90YWcgPSAodmxhbl90YWcgJiB+VkxBTl9QUklPX01BU0spIHwKKwkJCQlhZGFwdGVyLT5yZWNvbW1lbmRlZF9wcmlvOworCisJcmV0dXJuIHZsYW5fdGFnOworfQorCiBzdGF0aWMgdm9pZCB3cmJfZmlsbF9oZHIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBiZV9ldGhfaGRyX3dyYiAqaGRyLAogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgd3JiX2NudCwgdTMyIGxlbikKIHsKLQl1OCB2bGFuX3ByaW8gPSAwOwotCXUxNiB2bGFuX3RhZyA9IDA7CisJdTE2IHZsYW5fdGFnOwogCiAJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKCpoZHIpKTsKIApAQCAtNTg0LDEyICs2MDQsNyBAQAogCiAJaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgewogCQlBTUFQX1NFVF9CSVRTKHN0cnVjdCBhbWFwX2V0aF9oZHJfd3JiLCB2bGFuLCBoZHIsIDEpOwotCQl2bGFuX3RhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOwotCQl2bGFuX3ByaW8gPSAodmxhbl90YWcgJiBWTEFOX1BSSU9fTUFTSykgPj4gVkxBTl9QUklPX1NISUZUOwotCQkvKiBJZiB2bGFuIHByaW9yaXR5IHByb3ZpZGVkIGJ5IE9TIGlzIE5PVCBpbiBhdmFpbGFibGUgYm1hcCAqLwotCQlpZiAoIShhZGFwdGVyLT52bGFuX3ByaW9fYm1hcCAmICgxIDw8IHZsYW5fcHJpbykpKQotCQkJdmxhbl90YWcgPSAodmxhbl90YWcgJiB+VkxBTl9QUklPX01BU0spIHwKLQkJCQkJYWRhcHRlci0+cmVjb21tZW5kZWRfcHJpbzsKKwkJdmxhbl90YWcgPSBiZV9nZXRfdHhfdmxhbl90YWcoYWRhcHRlciwgc2tiKTsKIAkJQU1BUF9TRVRfQklUUyhzdHJ1Y3QgYW1hcF9ldGhfaGRyX3dyYiwgdmxhbl90YWcsIGhkciwgdmxhbl90YWcpOwogCX0KIApAQCAtNjkyLDYgKzcwNywyNSBAQAogCXUzMiBzdGFydCA9IHR4cS0+aGVhZDsKIAlib29sIGR1bW15X3dyYiwgc3RvcHBlZCA9IGZhbHNlOwogCisJLyogRm9yIHZsYW4gdGFnZ2VkIHBrdHMsIEJFCisJICogMSkgY2FsY3VsYXRlcyBjaGVja3N1bSBldmVuIHdoZW4gQ1NPIGlzIG5vdCByZXF1ZXN0ZWQKKwkgKiAyKSBjYWxjdWxhdGVzIGNoZWNrc3VtIHdyb25nbHkgZm9yIHBhZGRlZCBwa3QgbGVzcyB0aGFuCisJICogNjAgYnl0ZXMgbG9uZy4KKwkgKiBBcyBhIHdvcmthcm91bmQgZGlzYWJsZSBUWCB2bGFuIG9mZmxvYWRpbmcgaW4gc3VjaCBjYXNlcy4KKwkgKi8KKwlpZiAodW5saWtlbHkodmxhbl90eF90YWdfcHJlc2VudChza2IpICYmCisJCSAgICAgKHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwgfHwgc2tiLT5sZW4gPD0gNjApKSkgeworCQlza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKTsKKwkJaWYgKHVubGlrZWx5KCFza2IpKQorCQkJZ290byB0eF9kcm9wOworCisJCXNrYiA9IF9fdmxhbl9wdXRfdGFnKHNrYiwgYmVfZ2V0X3R4X3ZsYW5fdGFnKGFkYXB0ZXIsIHNrYikpOworCQlpZiAodW5saWtlbHkoIXNrYikpCisJCQlnb3RvIHR4X2Ryb3A7CisKKwkJc2tiLT52bGFuX3RjaSA9IDA7CisJfQorCiAJd3JiX2NudCA9IHdyYl9jbnRfZm9yX3NrYihhZGFwdGVyLCBza2IsICZkdW1teV93cmIpOwogCiAJY29waWVkID0gbWFrZV90eF93cmJzKGFkYXB0ZXIsIHR4cSwgc2tiLCB3cmJfY250LCBkdW1teV93cmIpOwpAQCAtNzE5LDYgKzc1Myw3IEBACiAJCXR4cS0+aGVhZCA9IHN0YXJ0OwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCX0KK3R4X2Ryb3A6CiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKIH0KIApAQCAtNzQ2LDE1ICs3ODEsMTUgQEAKICAqLwogc3RhdGljIGludCBiZV92aWRfY29uZmlnKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCBib29sIHZmLCB1MzIgdmZfbnVtKQogeworCXN0cnVjdCBiZV92Zl9jZmcgKnZmX2NmZyA9ICZhZGFwdGVyLT52Zl9jZmdbdmZfbnVtXTsKIAl1MTYgdnRhZ1tCRV9OVU1fVkxBTlNfU1VQUE9SVEVEXTsKIAl1MTYgbnRhZ3MgPSAwLCBpOwogCWludCBzdGF0dXMgPSAwOwotCXUzMiBpZl9oYW5kbGU7CiAKIAlpZiAodmYpIHsKLQkJaWZfaGFuZGxlID0gYWRhcHRlci0+dmZfY2ZnW3ZmX251bV0udmZfaWZfaGFuZGxlOwotCQl2dGFnWzBdID0gY3B1X3RvX2xlMTYoYWRhcHRlci0+dmZfY2ZnW3ZmX251bV0udmZfdmxhbl90YWcpOwotCQlzdGF0dXMgPSBiZV9jbWRfdmxhbl9jb25maWcoYWRhcHRlciwgaWZfaGFuZGxlLCB2dGFnLCAxLCAxLCAwKTsKKwkJdnRhZ1swXSA9IGNwdV90b19sZTE2KHZmX2NmZy0+dmxhbl90YWcpOworCQlzdGF0dXMgPSBiZV9jbWRfdmxhbl9jb25maWcoYWRhcHRlciwgdmZfY2ZnLT5pZl9oYW5kbGUsIHZ0YWcsCisJCQkJCSAgICAxLCAxLCAwKTsKIAl9CiAKIAkvKiBObyBuZWVkIHRvIGZ1cnRoZXIgY29uZmlndXJlIHZpZHMgaWYgaW4gcHJvbWlzY3VvdXMgbW9kZSAqLwpAQCAtNzc5LDMxICs4MTQsNDggQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgdm9pZCBiZV92bGFuX2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKK3N0YXRpYyBpbnQgYmVfdmxhbl9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCiB7CiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCWludCBzdGF0dXMgPSAwOwogCi0JYWRhcHRlci0+dmxhbnNfYWRkZWQrKzsKLQlpZiAoIWJlX3BoeXNmbihhZGFwdGVyKSkKLQkJcmV0dXJuOworCWlmICghYmVfcGh5c2ZuKGFkYXB0ZXIpKSB7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gcmV0OworCX0KIAogCWFkYXB0ZXItPnZsYW5fdGFnW3ZpZF0gPSAxOwogCWlmIChhZGFwdGVyLT52bGFuc19hZGRlZCA8PSAoYWRhcHRlci0+bWF4X3ZsYW5zICsgMSkpCi0JCWJlX3ZpZF9jb25maWcoYWRhcHRlciwgZmFsc2UsIDApOworCQlzdGF0dXMgPSBiZV92aWRfY29uZmlnKGFkYXB0ZXIsIGZhbHNlLCAwKTsKKworCWlmICghc3RhdHVzKQorCQlhZGFwdGVyLT52bGFuc19hZGRlZCsrOworCWVsc2UKKwkJYWRhcHRlci0+dmxhbl90YWdbdmlkXSA9IDA7CityZXQ6CisJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIHZvaWQgYmVfdmxhbl9yZW1fdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCitzdGF0aWMgaW50IGJlX3ZsYW5fcmVtX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlpbnQgc3RhdHVzID0gMDsKIAotCWFkYXB0ZXItPnZsYW5zX2FkZGVkLS07Ci0KLQlpZiAoIWJlX3BoeXNmbihhZGFwdGVyKSkKLQkJcmV0dXJuOworCWlmICghYmVfcGh5c2ZuKGFkYXB0ZXIpKSB7CisJCXN0YXR1cyA9IC1FSU5WQUw7CisJCWdvdG8gcmV0OworCX0KIAogCWFkYXB0ZXItPnZsYW5fdGFnW3ZpZF0gPSAwOwogCWlmIChhZGFwdGVyLT52bGFuc19hZGRlZCA8PSBhZGFwdGVyLT5tYXhfdmxhbnMpCi0JCWJlX3ZpZF9jb25maWcoYWRhcHRlciwgZmFsc2UsIDApOworCQlzdGF0dXMgPSBiZV92aWRfY29uZmlnKGFkYXB0ZXIsIGZhbHNlLCAwKTsKKworCWlmICghc3RhdHVzKQorCQlhZGFwdGVyLT52bGFuc19hZGRlZC0tOworCWVsc2UKKwkJYWRhcHRlci0+dmxhbl90YWdbdmlkXSA9IDE7CityZXQ6CisJcmV0dXJuIHN0YXR1czsKIH0KIAogc3RhdGljIHZvaWQgYmVfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKQEAgLTg0MCwyOCArODkyLDMwIEBACiBzdGF0aWMgaW50IGJlX3NldF92Zl9tYWMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IHZmLCB1OCAqbWFjKQogewogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfdmZfY2ZnICp2Zl9jZmcgPSAmYWRhcHRlci0+dmZfY2ZnW3ZmXTsKIAlpbnQgc3RhdHVzOwogCi0JaWYgKCFhZGFwdGVyLT5zcmlvdl9lbmFibGVkKQorCWlmICghc3Jpb3ZfZW5hYmxlZChhZGFwdGVyKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihtYWMpIHx8ICh2ZiA+PSBudW1fdmZzKSkKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIobWFjKSB8fCB2ZiA+PSBhZGFwdGVyLT5udW1fdmZzKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX3BtYWNfaWQgIT0gQkVfSU5WQUxJRF9QTUFDX0lEKQotCQlzdGF0dXMgPSBiZV9jbWRfcG1hY19kZWwoYWRhcHRlciwKLQkJCQkJYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9pZl9oYW5kbGUsCi0JCQkJCWFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfcG1hY19pZCwgdmYgKyAxKTsKKwlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKKwkJc3RhdHVzID0gYmVfY21kX3NldF9tYWNfbGlzdChhZGFwdGVyLCAgbWFjLCAxLCB2ZiArIDEpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGJlX2NtZF9wbWFjX2RlbChhZGFwdGVyLCB2Zl9jZmctPmlmX2hhbmRsZSwKKwkJCQkJIHZmX2NmZy0+cG1hY19pZCwgdmYgKyAxKTsKIAotCXN0YXR1cyA9IGJlX2NtZF9wbWFjX2FkZChhZGFwdGVyLCBtYWMsCi0JCQkJYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9pZl9oYW5kbGUsCi0JCQkJJmFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfcG1hY19pZCwgdmYgKyAxKTsKKwkJc3RhdHVzID0gYmVfY21kX3BtYWNfYWRkKGFkYXB0ZXIsIG1hYywgdmZfY2ZnLT5pZl9oYW5kbGUsCisJCQkJCSAmdmZfY2ZnLT5wbWFjX2lkLCB2ZiArIDEpOworCX0KIAogCWlmIChzdGF0dXMpCiAJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwgIk1BQyAlcE0gc2V0IG9uIFZGICVkIEZhaWxlZFxuIiwKIAkJCQltYWMsIHZmKTsKIAllbHNlCi0JCW1lbWNweShhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX21hY19hZGRyLCBtYWMsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHZmX2NmZy0+bWFjX2FkZHIsIG1hYywgRVRIX0FMRU4pOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTg3MCwxOCArOTI0LDE5IEBACiAJCQlzdHJ1Y3QgaWZsYV92Zl9pbmZvICp2aSkKIHsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGJlX3ZmX2NmZyAqdmZfY2ZnID0gJmFkYXB0ZXItPnZmX2NmZ1t2Zl07CiAKLQlpZiAoIWFkYXB0ZXItPnNyaW92X2VuYWJsZWQpCisJaWYgKCFzcmlvdl9lbmFibGVkKGFkYXB0ZXIpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKHZmID49IG51bV92ZnMpCisJaWYgKHZmID49IGFkYXB0ZXItPm51bV92ZnMpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJdmktPnZmID0gdmY7Ci0JdmktPnR4X3JhdGUgPSBhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX3R4X3JhdGU7Ci0JdmktPnZsYW4gPSBhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX3ZsYW5fdGFnOworCXZpLT50eF9yYXRlID0gdmZfY2ZnLT50eF9yYXRlOworCXZpLT52bGFuID0gdmZfY2ZnLT52bGFuX3RhZzsKIAl2aS0+cW9zID0gMDsKLQltZW1jcHkoJnZpLT5tYWMsIGFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfbWFjX2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoJnZpLT5tYWMsIHZmX2NmZy0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKIAogCXJldHVybiAwOwogfQpAQCAtODkyLDE3ICs5NDcsMTcgQEAKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJaW50IHN0YXR1cyA9IDA7CiAKLQlpZiAoIWFkYXB0ZXItPnNyaW92X2VuYWJsZWQpCisJaWYgKCFzcmlvdl9lbmFibGVkKGFkYXB0ZXIpKQogCQlyZXR1cm4gLUVQRVJNOwogCi0JaWYgKCh2ZiA+PSBudW1fdmZzKSB8fCAodmxhbiA+IDQwOTUpKQorCWlmICh2ZiA+PSBhZGFwdGVyLT5udW1fdmZzIHx8IHZsYW4gPiA0MDk1KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICh2bGFuKSB7Ci0JCWFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfdmxhbl90YWcgPSB2bGFuOworCQlhZGFwdGVyLT52Zl9jZmdbdmZdLnZsYW5fdGFnID0gdmxhbjsKIAkJYWRhcHRlci0+dmxhbnNfYWRkZWQrKzsKIAl9IGVsc2UgewotCQlhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX3ZsYW5fdGFnID0gMDsKKwkJYWRhcHRlci0+dmZfY2ZnW3ZmXS52bGFuX3RhZyA9IDA7CiAJCWFkYXB0ZXItPnZsYW5zX2FkZGVkLS07CiAJfQogCkBAIC05MjAsMjEgKzk3NSwyNSBAQAogCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgc3RhdHVzID0gMDsKIAotCWlmICghYWRhcHRlci0+c3Jpb3ZfZW5hYmxlZCkKKwlpZiAoIXNyaW92X2VuYWJsZWQoYWRhcHRlcikpCiAJCXJldHVybiAtRVBFUk07CiAKLQlpZiAoKHZmID49IG51bV92ZnMpIHx8IChyYXRlIDwgMCkpCisJaWYgKHZmID49IGFkYXB0ZXItPm51bV92ZnMpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHJhdGUgPiAxMDAwMCkKLQkJcmF0ZSA9IDEwMDAwOworCWlmIChyYXRlIDwgMTAwIHx8IHJhdGUgPiAxMDAwMCkgeworCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCisJCQkidHggcmF0ZSBtdXN0IGJlIGJldHdlZW4gMTAwIGFuZCAxMDAwMCBNYnBzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl90eF9yYXRlID0gcmF0ZTsKIAlzdGF0dXMgPSBiZV9jbWRfc2V0X3FvcyhhZGFwdGVyLCByYXRlIC8gMTAsIHZmICsgMSk7CiAKIAlpZiAoc3RhdHVzKQotCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LAorCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCQkJInR4IHJhdGUgJWQgb24gVkYgJWQgZmFpbGVkXG4iLCByYXRlLCB2Zik7CisJZWxzZQorCQlhZGFwdGVyLT52Zl9jZmdbdmZdLnR4X3JhdGUgPSByYXRlOwogCXJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE2NDUsOCArMTcwNCw3IEBACiAKIHN0YXRpYyBpbnQgYmVfbnVtX3R4cXNfd2FudChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKLQlpZiAoKG51bV92ZnMgJiYgYWRhcHRlci0+c3Jpb3ZfZW5hYmxlZCkgfHwKLQkJYmVfaXNfbWMoYWRhcHRlcikgfHwKKwlpZiAoc3Jpb3ZfZW5hYmxlZChhZGFwdGVyKSB8fCBiZV9pc19tYyhhZGFwdGVyKSB8fAogCQlsYW5jZXJfY2hpcChhZGFwdGVyKSB8fCAhYmVfcGh5c2ZuKGFkYXB0ZXIpIHx8CiAJCWFkYXB0ZXItPmdlbmVyYXRpb24gPT0gQkVfR0VOMikKIAkJcmV0dXJuIDE7CkBAIC0xNjYyLDkgKzE3MjAsMTIgQEAKIAl1OCBpOwogCiAJYWRhcHRlci0+bnVtX3R4X3FzID0gYmVfbnVtX3R4cXNfd2FudChhZGFwdGVyKTsKLQlpZiAoYWRhcHRlci0+bnVtX3R4X3FzICE9IE1BWF9UWF9RUykKKwlpZiAoYWRhcHRlci0+bnVtX3R4X3FzICE9IE1BWF9UWF9RUykgeworCQlydG5sX2xvY2soKTsKIAkJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhhZGFwdGVyLT5uZXRkZXYsCiAJCQlhZGFwdGVyLT5udW1fdHhfcXMpOworCQlydG5sX3VubG9jaygpOworCX0KIAogCWFkYXB0ZXItPnR4X2VxLm1heF9lcWQgPSAwOwogCWFkYXB0ZXItPnR4X2VxLm1pbl9lcWQgPSAwOwpAQCAtMTY5Myw5ICsxNzU0LDYgQEAKIAkJaWYgKGJlX3F1ZXVlX2FsbG9jKGFkYXB0ZXIsIHEsIFRYX1FfTEVOLAogCQkJc2l6ZW9mKHN0cnVjdCBiZV9ldGhfd3JiKSkpCiAJCQlnb3RvIGVycjsKLQotCQlpZiAoYmVfY21kX3R4cV9jcmVhdGUoYWRhcHRlciwgcSwgY3EpKQotCQkJZ290byBlcnI7CiAJfQogCXJldHVybiAwOwogCkBAIC0xNzI4LDggKzE3ODYsOCBAQAogc3RhdGljIHUzMiBiZV9udW1fcnhxc193YW50KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQogewogCWlmICgoYWRhcHRlci0+ZnVuY3Rpb25fY2FwcyAmIEJFX0ZVTkNUSU9OX0NBUFNfUlNTKSAmJgotCQkhYWRhcHRlci0+c3Jpb3ZfZW5hYmxlZCAmJiBiZV9waHlzZm4oYWRhcHRlcikgJiYKLQkJIWJlX2lzX21jKGFkYXB0ZXIpKSB7CisJICAgICAhc3Jpb3ZfZW5hYmxlZChhZGFwdGVyKSAmJiBiZV9waHlzZm4oYWRhcHRlcikgJiYKKwkgICAgICFiZV9pc19tYyhhZGFwdGVyKSkgewogCQlyZXR1cm4gMSArIE1BWF9SU1NfUVM7IC8qIG9uZSBkZWZhdWx0IG5vbi1SU1MgcXVldWUgKi8KIAl9IGVsc2UgewogCQlkZXZfd2FybigmYWRhcHRlci0+cGRldi0+ZGV2LApAQCAtMTkyOSw2ICsxOTg3LDcgQEAKIAlzdHJ1Y3QgYmVfZXFfb2JqICp0eF9lcSA9IGNvbnRhaW5lcl9vZihuYXBpLCBzdHJ1Y3QgYmVfZXFfb2JqLCBuYXBpKTsKIAlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9CiAJCWNvbnRhaW5lcl9vZih0eF9lcSwgc3RydWN0IGJlX2FkYXB0ZXIsIHR4X2VxKTsKKwlzdHJ1Y3QgYmVfbWNjX29iaiAqbWNjX29iaiA9ICZhZGFwdGVyLT5tY2Nfb2JqOwogCXN0cnVjdCBiZV90eF9vYmogKnR4bzsKIAlzdHJ1Y3QgYmVfZXRoX3R4X2NvbXBsICp0eGNwOwogCWludCB0eF9jb21wbCwgbWNjX2NvbXBsLCBzdGF0dXMgPSAwOwpAQCAtMTk2NSwxMiArMjAyNCwxOSBAQAogCW1jY19jb21wbCA9IGJlX3Byb2Nlc3NfbWNjKGFkYXB0ZXIsICZzdGF0dXMpOwogCiAJaWYgKG1jY19jb21wbCkgewotCQlzdHJ1Y3QgYmVfbWNjX29iaiAqbWNjX29iaiA9ICZhZGFwdGVyLT5tY2Nfb2JqOwogCQliZV9jcV9ub3RpZnkoYWRhcHRlciwgbWNjX29iai0+Y3EuaWQsIHRydWUsIG1jY19jb21wbCk7CiAJfQogCiAJbmFwaV9jb21wbGV0ZShuYXBpKTsKIAorCS8qIEFybSBDUSBhZ2FpbiB0byByZWdlbmVyYXRlIEVRRXMgZm9yIExhbmNlciBpbiBJTlR4IG1vZGUgKi8KKwlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikgJiYgIW1zaXhfZW5hYmxlZChhZGFwdGVyKSkgeworCQlmb3JfYWxsX3R4X3F1ZXVlcyhhZGFwdGVyLCB0eG8sIGkpCisJCQliZV9jcV9ub3RpZnkoYWRhcHRlciwgdHhvLT5jcS5pZCwgdHJ1ZSwgMCk7CisKKwkJYmVfY3Ffbm90aWZ5KGFkYXB0ZXIsIG1jY19vYmotPmNxLmlkLCB0cnVlLCAwKTsKKwl9CisKIAliZV9lcV9ub3RpZnkoYWRhcHRlciwgdHhfZXEtPnEuaWQsIHRydWUsIGZhbHNlLCAwKTsKIAlhZGFwdGVyLT5kcnZfc3RhdHMudHhfZXZlbnRzKys7CiAJcmV0dXJuIDE7CkBAIC0xOTgyLDYgKzIwNDgsOSBAQAogCXUzMiBzbGlwb3J0X3N0YXR1cyA9IDAsIHNsaXBvcnRfZXJyMSA9IDAsIHNsaXBvcnRfZXJyMiA9IDA7CiAJdTMyIGk7CiAKKwlpZiAoYWRhcHRlci0+ZWVoX2VyciB8fCBhZGFwdGVyLT51ZV9kZXRlY3RlZCkKKwkJcmV0dXJuOworCiAJaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpKSB7CiAJCXNsaXBvcnRfc3RhdHVzID0gaW9yZWFkMzIoYWRhcHRlci0+ZGIgKyBTTElQT1JUX1NUQVRVU19PRkZTRVQpOwogCQlpZiAoc2xpcG9ydF9zdGF0dXMgJiBTTElQT1JUX1NUQVRVU19FUlJfTUFTSykgewpAQCAtMjAwOCw3ICsyMDc3LDggQEAKIAkJc2xpcG9ydF9zdGF0dXMgJiBTTElQT1JUX1NUQVRVU19FUlJfTUFTSykgewogCQlhZGFwdGVyLT51ZV9kZXRlY3RlZCA9IHRydWU7CiAJCWFkYXB0ZXItPmVlaF9lcnIgPSB0cnVlOwotCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJVRSBEZXRlY3RlZCEhXG4iKTsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIlVucmVjb3ZlcmFibGUgZXJyb3IgaW4gdGhlIGNhcmRcbiIpOwogCX0KIAogCWlmICh1ZV9sbykgewpAQCAtMjAzNiw1MyArMjEwNiw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBiZV93b3JrZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiZV9hZGFwdGVyLCB3b3JrLndvcmspOwotCXN0cnVjdCBiZV9yeF9vYmogKnJ4bzsKLQlpbnQgaTsKLQotCWlmICghYWRhcHRlci0+dWVfZGV0ZWN0ZWQpCi0JCWJlX2RldGVjdF9kdW1wX3VlKGFkYXB0ZXIpOwotCi0JLyogd2hlbiBpbnRlcnJ1cHRzIGFyZSBub3QgeWV0IGVuYWJsZWQsIGp1c3QgcmVhcCBhbnkgcGVuZGluZwotCSogbWNjIGNvbXBsZXRpb25zICovCi0JaWYgKCFuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKLQkJaW50IG1jY19jb21wbCwgc3RhdHVzID0gMDsKLQotCQltY2NfY29tcGwgPSBiZV9wcm9jZXNzX21jYyhhZGFwdGVyLCAmc3RhdHVzKTsKLQotCQlpZiAobWNjX2NvbXBsKSB7Ci0JCQlzdHJ1Y3QgYmVfbWNjX29iaiAqbWNjX29iaiA9ICZhZGFwdGVyLT5tY2Nfb2JqOwotCQkJYmVfY3Ffbm90aWZ5KGFkYXB0ZXIsIG1jY19vYmotPmNxLmlkLCBmYWxzZSwgbWNjX2NvbXBsKTsKLQkJfQotCi0JCWdvdG8gcmVzY2hlZHVsZTsKLQl9Ci0KLQlpZiAoIWFkYXB0ZXItPnN0YXRzX2NtZF9zZW50KSB7Ci0JCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkKLQkJCWxhbmNlcl9jbWRfZ2V0X3Bwb3J0X3N0YXRzKGFkYXB0ZXIsCi0JCQkJCQkmYWRhcHRlci0+c3RhdHNfY21kKTsKLQkJZWxzZQotCQkJYmVfY21kX2dldF9zdGF0cyhhZGFwdGVyLCAmYWRhcHRlci0+c3RhdHNfY21kKTsKLQl9Ci0KLQlmb3JfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpIHsKLQkJYmVfcnhfZXFkX3VwZGF0ZShhZGFwdGVyLCByeG8pOwotCi0JCWlmIChyeG8tPnJ4X3Bvc3Rfc3RhcnZlZCkgewotCQkJcnhvLT5yeF9wb3N0X3N0YXJ2ZWQgPSBmYWxzZTsKLQkJCWJlX3Bvc3RfcnhfZnJhZ3MocnhvLCBHRlBfS0VSTkVMKTsKLQkJfQotCX0KLQotcmVzY2hlZHVsZToKLQlhZGFwdGVyLT53b3JrX2NvdW50ZXIrKzsKLQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOwotfQotCiBzdGF0aWMgdm9pZCBiZV9tc2l4X2Rpc2FibGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJaWYgKG1zaXhfZW5hYmxlZChhZGFwdGVyKSkgewpAQCAtMjExOSwyNyArMjE0MiwyOCBAQAogc3RhdGljIGludCBiZV9zcmlvdl9lbmFibGUoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJYmVfY2hlY2tfc3Jpb3ZfZm5fdHlwZShhZGFwdGVyKTsKKwogI2lmZGVmIENPTkZJR19QQ0lfSU9WCiAJaWYgKGJlX3BoeXNmbihhZGFwdGVyKSAmJiBudW1fdmZzKSB7CiAJCWludCBzdGF0dXMsIHBvczsKLQkJdTE2IG52ZnM7CisJCXUxNiBkZXZfdmZzOwogCiAJCXBvcyA9IHBjaV9maW5kX2V4dF9jYXBhYmlsaXR5KGFkYXB0ZXItPnBkZXYsCiAJCQkJCQlQQ0lfRVhUX0NBUF9JRF9TUklPVik7CiAJCXBjaV9yZWFkX2NvbmZpZ193b3JkKGFkYXB0ZXItPnBkZXYsCi0JCQkJCXBvcyArIFBDSV9TUklPVl9UT1RBTF9WRiwgJm52ZnMpOworCQkJCSAgICAgcG9zICsgUENJX1NSSU9WX1RPVEFMX1ZGLCAmZGV2X3Zmcyk7CiAKLQkJaWYgKG51bV92ZnMgPiBudmZzKSB7CisJCWFkYXB0ZXItPm51bV92ZnMgPSBtaW5fdCh1MTYsIG51bV92ZnMsIGRldl92ZnMpOworCQlpZiAoYWRhcHRlci0+bnVtX3ZmcyAhPSBudW1fdmZzKQogCQkJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwKLQkJCQkJIkRldmljZSBzdXBwb3J0cyAlZCBWRnMgYW5kIG5vdCAlZFxuIiwKLQkJCQkJbnZmcywgbnVtX3Zmcyk7Ci0JCQludW1fdmZzID0gbnZmczsKLQkJfQorCQkJCSAiRGV2aWNlIHN1cHBvcnRzICVkIFZGcyBhbmQgbm90ICVkXG4iLAorCQkJCSBhZGFwdGVyLT5udW1fdmZzLCBudW1fdmZzKTsKIAotCQlzdGF0dXMgPSBwY2lfZW5hYmxlX3NyaW92KGFkYXB0ZXItPnBkZXYsIG51bV92ZnMpOwotCQlhZGFwdGVyLT5zcmlvdl9lbmFibGVkID0gc3RhdHVzID8gZmFsc2UgOiB0cnVlOworCQlzdGF0dXMgPSBwY2lfZW5hYmxlX3NyaW92KGFkYXB0ZXItPnBkZXYsIGFkYXB0ZXItPm51bV92ZnMpOworCQlpZiAoc3RhdHVzKQorCQkJYWRhcHRlci0+bnVtX3ZmcyA9IDA7CiAKLQkJaWYgKGFkYXB0ZXItPnNyaW92X2VuYWJsZWQpIHsKKwkJaWYgKGFkYXB0ZXItPm51bV92ZnMpIHsKIAkJCWFkYXB0ZXItPnZmX2NmZyA9IGtjYWxsb2MobnVtX3ZmcywKIAkJCQkJCXNpemVvZihzdHJ1Y3QgYmVfdmZfY2ZnKSwKIAkJCQkJCUdGUF9LRVJORUwpOwpAQCAtMjE1NCwxMCArMjE3OCwxMCBAQAogc3RhdGljIHZvaWQgYmVfc3Jpb3ZfZGlzYWJsZShzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKICNpZmRlZiBDT05GSUdfUENJX0lPVgotCWlmIChhZGFwdGVyLT5zcmlvdl9lbmFibGVkKSB7CisJaWYgKHNyaW92X2VuYWJsZWQoYWRhcHRlcikpIHsKIAkJcGNpX2Rpc2FibGVfc3Jpb3YoYWRhcHRlci0+cGRldik7CiAJCWtmcmVlKGFkYXB0ZXItPnZmX2NmZyk7Ci0JCWFkYXB0ZXItPnNyaW92X2VuYWJsZWQgPSBmYWxzZTsKKwkJYWRhcHRlci0+bnVtX3ZmcyA9IDA7CiAJfQogI2VuZGlmCiB9CkBAIC0yMzUxLDggKzIzNzUsOCBAQAogc3RhdGljIGludCBiZV9yeF9xdWV1ZXNfc2V0dXAoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IGJlX3J4X29iaiAqcnhvOwotCWludCByYywgaTsKLQl1OCByc3N0YWJsZVtNQVhfUlNTX1FTXTsKKwlpbnQgcmMsIGksIGo7CisJdTggcnNzdGFibGVbMTI4XTsKIAogCWZvcl9hbGxfcnhfcXVldWVzKGFkYXB0ZXIsIHJ4bywgaSkgewogCQlyYyA9IGJlX2NtZF9yeHFfY3JlYXRlKGFkYXB0ZXIsICZyeG8tPnEsIHJ4by0+Y3EuaWQsCkBAIC0yMzY0LDExICsyMzg4LDE1IEBACiAJfQogCiAJaWYgKGJlX211bHRpX3J4cShhZGFwdGVyKSkgewotCQlmb3JfYWxsX3Jzc19xdWV1ZXMoYWRhcHRlciwgcnhvLCBpKQotCQkJcnNzdGFibGVbaV0gPSByeG8tPnJzc19pZDsKKwkJZm9yIChqID0gMDsgaiA8IDEyODsgaiArPSBhZGFwdGVyLT5udW1fcnhfcXMgLSAxKSB7CisJCQlmb3JfYWxsX3Jzc19xdWV1ZXMoYWRhcHRlciwgcnhvLCBpKSB7CisJCQkJaWYgKChqICsgaSkgPj0gMTI4KQorCQkJCQlicmVhazsKKwkJCQlyc3N0YWJsZVtqICsgaV0gPSByeG8tPnJzc19pZDsKKwkJCX0KKwkJfQorCQlyYyA9IGJlX2NtZF9yc3NfY29uZmlnKGFkYXB0ZXIsIHJzc3RhYmxlLCAxMjgpOwogCi0JCXJjID0gYmVfY21kX3Jzc19jb25maWcoYWRhcHRlciwgcnNzdGFibGUsCi0JCQlhZGFwdGVyLT5udW1fcnhfcXMgLSAxKTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwogCX0KQEAgLTIzODYsNiArMjQxNCw3IEBACiAJc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBiZV9lcV9vYmogKnR4X2VxID0gJmFkYXB0ZXItPnR4X2VxOwogCXN0cnVjdCBiZV9yeF9vYmogKnJ4bzsKKwl1OCBsaW5rX3N0YXR1czsKIAlpbnQgc3RhdHVzLCBpOwogCiAJc3RhdHVzID0gYmVfcnhfcXVldWVzX3NldHVwKGFkYXB0ZXIpOwpAQCAtMjQwOSw2ICsyNDM4LDExIEBACiAJLyogTm93IHRoYXQgaW50ZXJydXB0cyBhcmUgb24gd2UgY2FuIHByb2Nlc3MgYXN5bmMgbWNjICovCiAJYmVfYXN5bmNfbWNjX2VuYWJsZShhZGFwdGVyKTsKIAorCXN0YXR1cyA9IGJlX2NtZF9saW5rX3N0YXR1c19xdWVyeShhZGFwdGVyLCBOVUxMLCBOVUxMLAorCQkJCQkgICZsaW5rX3N0YXR1cywgMCk7CisJaWYgKCFzdGF0dXMpCisJCWJlX2xpbmtfc3RhdHVzX3VwZGF0ZShhZGFwdGVyLCBsaW5rX3N0YXR1cyk7CisKIAlyZXR1cm4gMDsKIGVycjoKIAliZV9jbG9zZShhZGFwdGVyLT5uZXRkZXYpOwpAQCAtMjQ2NSwxOSArMjQ5OSwyNCBAQAogCXUzMiB2ZjsKIAlpbnQgc3RhdHVzID0gMDsKIAl1OCBtYWNbRVRIX0FMRU5dOworCXN0cnVjdCBiZV92Zl9jZmcgKnZmX2NmZzsKIAogCWJlX3ZmX2V0aF9hZGRyX2dlbmVyYXRlKGFkYXB0ZXIsIG1hYyk7CiAKLQlmb3IgKHZmID0gMDsgdmYgPCBudW1fdmZzOyB2ZisrKSB7Ci0JCXN0YXR1cyA9IGJlX2NtZF9wbWFjX2FkZChhZGFwdGVyLCBtYWMsCi0JCQkJCWFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfaWZfaGFuZGxlLAotCQkJCQkmYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9wbWFjX2lkLAotCQkJCQl2ZiArIDEpOworCWZvcl9hbGxfdmZzKGFkYXB0ZXIsIHZmX2NmZywgdmYpIHsKKwkJaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpKSB7CisJCQlzdGF0dXMgPSBiZV9jbWRfc2V0X21hY19saXN0KGFkYXB0ZXIsICBtYWMsIDEsIHZmICsgMSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXMgPSBiZV9jbWRfcG1hY19hZGQoYWRhcHRlciwgbWFjLAorCQkJCQkJIHZmX2NmZy0+aWZfaGFuZGxlLAorCQkJCQkJICZ2Zl9jZmctPnBtYWNfaWQsIHZmICsgMSk7CisJCX0KKwogCQlpZiAoc3RhdHVzKQogCQkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAotCQkJCSJNYWMgYWRkcmVzcyBhZGQgZmFpbGVkIGZvciBWRiAlZFxuIiwgdmYpOworCQkJIk1hYyBhZGRyZXNzIGFzc2lnbm1lbnQgZmFpbGVkIGZvciBWRiAlZFxuIiwgdmYpOwogCQllbHNlCi0JCQltZW1jcHkoYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9tYWNfYWRkciwgbWFjLCBFVEhfQUxFTik7CisJCQltZW1jcHkodmZfY2ZnLT5tYWNfYWRkciwgbWFjLCBFVEhfQUxFTik7CiAKIAkJbWFjWzVdICs9IDE7CiAJfQpAQCAtMjQ4NiwyNCArMjUyNSwyMyBAQAogCiBzdGF0aWMgdm9pZCBiZV92Zl9jbGVhcihzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKKwlzdHJ1Y3QgYmVfdmZfY2ZnICp2Zl9jZmc7CiAJdTMyIHZmOwogCi0JZm9yICh2ZiA9IDA7IHZmIDwgbnVtX3ZmczsgdmYrKykgewotCQlpZiAoYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9wbWFjX2lkICE9IEJFX0lOVkFMSURfUE1BQ19JRCkKLQkJCWJlX2NtZF9wbWFjX2RlbChhZGFwdGVyLAotCQkJCQlhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX2lmX2hhbmRsZSwKLQkJCQkJYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9wbWFjX2lkLCB2ZiArIDEpOwotCX0KKwlmb3JfYWxsX3ZmcyhhZGFwdGVyLCB2Zl9jZmcsIHZmKSB7CisJCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkKKwkJCWJlX2NtZF9zZXRfbWFjX2xpc3QoYWRhcHRlciwgTlVMTCwgMCwgdmYgKyAxKTsKKwkJZWxzZQorCQkJYmVfY21kX3BtYWNfZGVsKGFkYXB0ZXIsIHZmX2NmZy0+aWZfaGFuZGxlLAorCQkJCQl2Zl9jZmctPnBtYWNfaWQsIHZmICsgMSk7CiAKLQlmb3IgKHZmID0gMDsgdmYgPCBudW1fdmZzOyB2ZisrKQotCQlpZiAoYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9pZl9oYW5kbGUpCi0JCQliZV9jbWRfaWZfZGVzdHJveShhZGFwdGVyLAotCQkJCWFkYXB0ZXItPnZmX2NmZ1t2Zl0udmZfaWZfaGFuZGxlLCB2ZiArIDEpOworCQliZV9jbWRfaWZfZGVzdHJveShhZGFwdGVyLCB2Zl9jZmctPmlmX2hhbmRsZSwgdmYgKyAxKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgYmVfY2xlYXIoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0JaWYgKGJlX3BoeXNmbihhZGFwdGVyKSAmJiBhZGFwdGVyLT5zcmlvdl9lbmFibGVkKQorCWlmIChzcmlvdl9lbmFibGVkKGFkYXB0ZXIpKQogCQliZV92Zl9jbGVhcihhZGFwdGVyKTsKIAogCWJlX2NtZF9pZl9kZXN0cm95KGFkYXB0ZXIsIGFkYXB0ZXItPmlmX2hhbmRsZSwgIDApOwpAQCAtMjUxMSw2MSArMjU0OSw5NCBAQAogCWJlX21jY19xdWV1ZXNfZGVzdHJveShhZGFwdGVyKTsKIAliZV9yeF9xdWV1ZXNfZGVzdHJveShhZGFwdGVyKTsKIAliZV90eF9xdWV1ZXNfZGVzdHJveShhZGFwdGVyKTsKLQlhZGFwdGVyLT5lcV9uZXh0X2lkeCA9IDA7Ci0KLQlhZGFwdGVyLT5iZTNfbmF0aXZlID0gZmFsc2U7Ci0JYWRhcHRlci0+cHJvbWlzY3VvdXMgPSBmYWxzZTsKIAogCS8qIHRlbGwgZncgd2UncmUgZG9uZSB3aXRoIGZpcmluZyBjbWRzICovCiAJYmVfY21kX2Z3X2NsZWFuKGFkYXB0ZXIpOwogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCBiZV92Zl9zZXR1cF9pbml0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCXN0cnVjdCBiZV92Zl9jZmcgKnZmX2NmZzsKKwlpbnQgdmY7CisKKwlmb3JfYWxsX3ZmcyhhZGFwdGVyLCB2Zl9jZmcsIHZmKSB7CisJCXZmX2NmZy0+aWZfaGFuZGxlID0gLTE7CisJCXZmX2NmZy0+cG1hY19pZCA9IC0xOworCX0KK30KKwogc3RhdGljIGludCBiZV92Zl9zZXR1cChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlcikKIHsKKwlzdHJ1Y3QgYmVfdmZfY2ZnICp2Zl9jZmc7CiAJdTMyIGNhcF9mbGFncywgZW5fZmxhZ3MsIHZmOwogCXUxNiBsbmtfc3BlZWQ7CiAJaW50IHN0YXR1czsKIAotCWNhcF9mbGFncyA9IGVuX2ZsYWdzID0gQkVfSUZfRkxBR1NfVU5UQUdHRUQgfCBCRV9JRl9GTEFHU19CUk9BRENBU1Q7Ci0JZm9yICh2ZiA9IDA7IHZmIDwgbnVtX3ZmczsgdmYrKykgeworCWJlX3ZmX3NldHVwX2luaXQoYWRhcHRlcik7CisKKwljYXBfZmxhZ3MgPSBlbl9mbGFncyA9IEJFX0lGX0ZMQUdTX1VOVEFHR0VEIHwgQkVfSUZfRkxBR1NfQlJPQURDQVNUIHwKKwkJCQlCRV9JRl9GTEFHU19NVUxUSUNBU1Q7CisJZm9yX2FsbF92ZnMoYWRhcHRlciwgdmZfY2ZnLCB2ZikgewogCQlzdGF0dXMgPSBiZV9jbWRfaWZfY3JlYXRlKGFkYXB0ZXIsIGNhcF9mbGFncywgZW5fZmxhZ3MsIE5VTEwsCi0JCQkJCSZhZGFwdGVyLT52Zl9jZmdbdmZdLnZmX2lmX2hhbmRsZSwKLQkJCQkJTlVMTCwgdmYrMSk7Ci0JCWlmIChzdGF0dXMpCi0JCQlnb3RvIGVycjsKLQkJYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl9wbWFjX2lkID0gQkVfSU5WQUxJRF9QTUFDX0lEOwotCX0KLQotCWlmICghbGFuY2VyX2NoaXAoYWRhcHRlcikpIHsKLQkJc3RhdHVzID0gYmVfdmZfZXRoX2FkZHJfY29uZmlnKGFkYXB0ZXIpOworCQkJCQkgICZ2Zl9jZmctPmlmX2hhbmRsZSwgTlVMTCwgdmYgKyAxKTsKIAkJaWYgKHN0YXR1cykKIAkJCWdvdG8gZXJyOwogCX0KIAotCWZvciAodmYgPSAwOyB2ZiA8IG51bV92ZnM7IHZmKyspIHsKKwlzdGF0dXMgPSBiZV92Zl9ldGhfYWRkcl9jb25maWcoYWRhcHRlcik7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnI7CisKKwlmb3JfYWxsX3ZmcyhhZGFwdGVyLCB2Zl9jZmcsIHZmKSB7CiAJCXN0YXR1cyA9IGJlX2NtZF9saW5rX3N0YXR1c19xdWVyeShhZGFwdGVyLCBOVUxMLCAmbG5rX3NwZWVkLAotCQkJCXZmICsgMSk7CisJCQkJCQkgIE5VTEwsIHZmICsgMSk7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIGVycjsKLQkJYWRhcHRlci0+dmZfY2ZnW3ZmXS52Zl90eF9yYXRlID0gbG5rX3NwZWVkICogMTA7CisJCXZmX2NmZy0+dHhfcmF0ZSA9IGxua19zcGVlZCAqIDEwOwogCX0KIAlyZXR1cm4gMDsKIGVycjoKIAlyZXR1cm4gc3RhdHVzOwogfQogCitzdGF0aWMgdm9pZCBiZV9zZXR1cF9pbml0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWFkYXB0ZXItPnZsYW5fcHJpb19ibWFwID0gMHhmZjsKKwlhZGFwdGVyLT5saW5rX3NwZWVkID0gLTE7CisJYWRhcHRlci0+aWZfaGFuZGxlID0gLTE7CisJYWRhcHRlci0+YmUzX25hdGl2ZSA9IGZhbHNlOworCWFkYXB0ZXItPnByb21pc2N1b3VzID0gZmFsc2U7CisJYWRhcHRlci0+ZXFfbmV4dF9pZHggPSAwOworfQorCitzdGF0aWMgaW50IGJlX2NvbmZpZ3VyZV9tYWNfZnJvbV9saXN0KHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyLCB1OCAqbWFjKQoreworCXUzMiBwbWFjX2lkOworCWludCBzdGF0dXMgPSBiZV9jbWRfZ2V0X21hY19mcm9tX2xpc3QoYWRhcHRlciwgMCwgJnBtYWNfaWQpOworCWlmIChzdGF0dXMgIT0gMCkKKwkJZ290byBkb19ub25lOworCXN0YXR1cyA9IGJlX2NtZF9tYWNfYWRkcl9xdWVyeShhZGFwdGVyLCBtYWMsCisJCQlNQUNfQUREUkVTU19UWVBFX05FVFdPUkssCisJCQlmYWxzZSwgYWRhcHRlci0+aWZfaGFuZGxlLCBwbWFjX2lkKTsKKwlpZiAoc3RhdHVzICE9IDApCisJCWdvdG8gZG9fbm9uZTsKKwlzdGF0dXMgPSBiZV9jbWRfcG1hY19hZGQoYWRhcHRlciwgbWFjLCBhZGFwdGVyLT5pZl9oYW5kbGUsCisJCQkmYWRhcHRlci0+cG1hY19pZCwgMCk7Citkb19ub25lOgorCXJldHVybiBzdGF0dXM7Cit9CisKIHN0YXRpYyBpbnQgYmVfc2V0dXAoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGFkYXB0ZXItPm5ldGRldjsKIAl1MzIgY2FwX2ZsYWdzLCBlbl9mbGFnczsKIAl1MzIgdHhfZmMsIHJ4X2ZjOwotCWludCBzdGF0dXM7CisJaW50IHN0YXR1cywgaTsKIAl1OCBtYWNbRVRIX0FMRU5dOworCXN0cnVjdCBiZV90eF9vYmogKnR4bzsKIAotCS8qIEFsbG93IGFsbCBwcmlvcml0aWVzIGJ5IGRlZmF1bHQuIEEgR1JQNSBldnQgbWF5IG1vZGlmeSB0aGlzICovCi0JYWRhcHRlci0+dmxhbl9wcmlvX2JtYXAgPSAweGZmOwotCWFkYXB0ZXItPmxpbmtfc3BlZWQgPSAtMTsKKwliZV9zZXR1cF9pbml0KGFkYXB0ZXIpOwogCiAJYmVfY21kX3JlcV9uYXRpdmVfbW9kZShhZGFwdGVyKTsKIApAQCAtMjU4Myw3ICsyNjU0LDcgQEAKIAogCW1lbXNldChtYWMsIDAsIEVUSF9BTEVOKTsKIAlzdGF0dXMgPSBiZV9jbWRfbWFjX2FkZHJfcXVlcnkoYWRhcHRlciwgbWFjLCBNQUNfQUREUkVTU19UWVBFX05FVFdPUkssCi0JCQl0cnVlIC8qcGVybWFuZW50ICovLCAwKTsKKwkJCXRydWUgLypwZXJtYW5lbnQgKi8sIDAsIDApOwogCWlmIChzdGF0dXMpCiAJCXJldHVybiBzdGF0dXM7CiAJbWVtY3B5KGFkYXB0ZXItPm5ldGRldi0+ZGV2X2FkZHIsIG1hYywgRVRIX0FMRU4pOwpAQCAtMjU5Miw3ICsyNjYzLDggQEAKIAllbl9mbGFncyA9IEJFX0lGX0ZMQUdTX1VOVEFHR0VEIHwgQkVfSUZfRkxBR1NfQlJPQURDQVNUIHwKIAkJCUJFX0lGX0ZMQUdTX01VTFRJQ0FTVCB8IEJFX0lGX0ZMQUdTX1BBU1NfTDNMNF9FUlJPUlM7CiAJY2FwX2ZsYWdzID0gZW5fZmxhZ3MgfCBCRV9JRl9GTEFHU19NQ0FTVF9QUk9NSVNDVU9VUyB8Ci0JCQlCRV9JRl9GTEFHU19QUk9NSVNDVU9VUzsKKwkJCUJFX0lGX0ZMQUdTX1ZMQU5fUFJPTUlTQ1VPVVMgfCBCRV9JRl9GTEFHU19QUk9NSVNDVU9VUzsKKwogCWlmIChhZGFwdGVyLT5mdW5jdGlvbl9jYXBzICYgQkVfRlVOQ1RJT05fQ0FQU19SU1MpIHsKIAkJY2FwX2ZsYWdzIHw9IEJFX0lGX0ZMQUdTX1JTUzsKIAkJZW5fZmxhZ3MgfD0gQkVfSUZfRkxBR1NfUlNTOwpAQCAtMjYwMywxMiArMjY3NSwyMyBAQAogCWlmIChzdGF0dXMgIT0gMCkKIAkJZ290byBlcnI7CiAKLQkvKiBGb3IgQkV4LCB0aGUgVkYncyBwZXJtYW5lbnQgbWFjIHF1ZXJpZWQgZnJvbSBjYXJkIGlzIGluY29ycmVjdC4KLQkgKiBRdWVyeSB0aGUgbWFjIGNvbmZpZ3VlZCBieSB0aGUgUEYgdXNpbmcgaWZfaGFuZGxlCi0JICovCi0JaWYgKCFiZV9waHlzZm4oYWRhcHRlcikgJiYgIWxhbmNlcl9jaGlwKGFkYXB0ZXIpKSB7Ci0JCXN0YXR1cyA9IGJlX2NtZF9tYWNfYWRkcl9xdWVyeShhZGFwdGVyLCBtYWMsCi0JCQlNQUNfQUREUkVTU19UWVBFX05FVFdPUkssIGZhbHNlLCBhZGFwdGVyLT5pZl9oYW5kbGUpOworCSBmb3JfYWxsX3R4X3F1ZXVlcyhhZGFwdGVyLCB0eG8sIGkpIHsKKwkJc3RhdHVzID0gYmVfY21kX3R4cV9jcmVhdGUoYWRhcHRlciwgJnR4by0+cSwgJnR4by0+Y3EpOworCQlpZiAoc3RhdHVzKQorCQkJZ290byBlcnI7CisJfQorCisJIC8qIFRoZSBWRidzIHBlcm1hbmVudCBtYWMgcXVlcmllZCBmcm9tIGNhcmQgaXMgaW5jb3JyZWN0LgorCSAgKiBGb3IgQkV4OiBRdWVyeSB0aGUgbWFjIGNvbmZpZ3VlZCBieSB0aGUgUEYgdXNpbmcgaWZfaGFuZGxlCisJICAqIEZvciBMYW5jZXI6IEdldCBhbmQgdXNlIG1hY19saXN0IHRvIG9idGFpbiBtYWMgYWRkcmVzcy4KKwkgICovCisJaWYgKCFiZV9waHlzZm4oYWRhcHRlcikpIHsKKwkJaWYgKGxhbmNlcl9jaGlwKGFkYXB0ZXIpKQorCQkJc3RhdHVzID0gYmVfY29uZmlndXJlX21hY19mcm9tX2xpc3QoYWRhcHRlciwgbWFjKTsKKwkJZWxzZQorCQkJc3RhdHVzID0gYmVfY21kX21hY19hZGRyX3F1ZXJ5KGFkYXB0ZXIsIG1hYywKKwkJCQkJTUFDX0FERFJFU1NfVFlQRV9ORVRXT1JLLCBmYWxzZSwKKwkJCQkJYWRhcHRlci0+aWZfaGFuZGxlLCAwKTsKIAkJaWYgKCFzdGF0dXMpIHsKIAkJCW1lbWNweShhZGFwdGVyLT5uZXRkZXYtPmRldl9hZGRyLCBtYWMsIEVUSF9BTEVOKTsKIAkJCW1lbWNweShhZGFwdGVyLT5uZXRkZXYtPnBlcm1fYWRkciwgbWFjLCBFVEhfQUxFTik7CkBAIC0yNjI0LDE4ICsyNzA3LDIxIEBACiAJYmVfc2V0X3J4X21vZGUoYWRhcHRlci0+bmV0ZGV2KTsKIAogCXN0YXR1cyA9IGJlX2NtZF9nZXRfZmxvd19jb250cm9sKGFkYXB0ZXIsICZ0eF9mYywgJnJ4X2ZjKTsKLQlpZiAoc3RhdHVzKQorCS8qIEZvciBMYW5jZXI6IEl0IGlzIGxlZ2FsIGZvciB0aGlzIGNtZCB0byBmYWlsIG9uIFZGICovCisJaWYgKHN0YXR1cyAmJiAoYmVfcGh5c2ZuKGFkYXB0ZXIpIHx8ICFsYW5jZXJfY2hpcChhZGFwdGVyKSkpCiAJCWdvdG8gZXJyOworCiAJaWYgKHJ4X2ZjICE9IGFkYXB0ZXItPnJ4X2ZjIHx8IHR4X2ZjICE9IGFkYXB0ZXItPnR4X2ZjKSB7CiAJCXN0YXR1cyA9IGJlX2NtZF9zZXRfZmxvd19jb250cm9sKGFkYXB0ZXIsIGFkYXB0ZXItPnR4X2ZjLAogCQkJCQlhZGFwdGVyLT5yeF9mYyk7Ci0JCWlmIChzdGF0dXMpCisJCS8qIEZvciBMYW5jZXI6IEl0IGlzIGxlZ2FsIGZvciB0aGlzIGNtZCB0byBmYWlsIG9uIFZGICovCisJCWlmIChzdGF0dXMgJiYgKGJlX3BoeXNmbihhZGFwdGVyKSB8fCAhbGFuY2VyX2NoaXAoYWRhcHRlcikpKQogCQkJZ290byBlcnI7CiAJfQogCiAJcGNpZV9zZXRfcmVhZHJxKGFkYXB0ZXItPnBkZXYsIDQwOTYpOwogCi0JaWYgKGJlX3BoeXNmbihhZGFwdGVyKSAmJiBhZGFwdGVyLT5zcmlvdl9lbmFibGVkKSB7CisJaWYgKHNyaW92X2VuYWJsZWQoYWRhcHRlcikpIHsKIAkJc3RhdHVzID0gYmVfdmZfc2V0dXAoYWRhcHRlcik7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIGVycjsKQEAgLTI2NDcsNiArMjczMywxOSBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgYmVfbmV0cG9sbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgYmVfcnhfb2JqICpyeG87CisJaW50IGk7CisKKwlldmVudF9oYW5kbGUoYWRhcHRlciwgJmFkYXB0ZXItPnR4X2VxLCBmYWxzZSk7CisJZm9yX2FsbF9yeF9xdWV1ZXMoYWRhcHRlciwgcnhvLCBpKQorCQlldmVudF9oYW5kbGUoYWRhcHRlciwgJnJ4by0+cnhfZXEsIHRydWUpOworfQorI2VuZGlmCisKICNkZWZpbmUgRldfRklMRV9IRFJfU0lHTiAJIlNlcnZlckVuZ2luZXMgQ29ycC4gIgogc3RhdGljIGJvb2wgYmVfZmxhc2hfcmVkYm9vdChzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciwKIAkJCWNvbnN0IHU4ICpwLCB1MzIgaW1nX3N0YXJ0LCBpbnQgaW1hZ2Vfc2l6ZSwKQEAgLTI5OTUsNyArMzA5NCwxMCBAQAogCS5uZG9fc2V0X3ZmX21hYwkJPSBiZV9zZXRfdmZfbWFjLAogCS5uZG9fc2V0X3ZmX3ZsYW4JPSBiZV9zZXRfdmZfdmxhbiwKIAkubmRvX3NldF92Zl90eF9yYXRlCT0gYmVfc2V0X3ZmX3R4X3JhdGUsCi0JLm5kb19nZXRfdmZfY29uZmlnCT0gYmVfZ2V0X3ZmX2NvbmZpZworCS5uZG9fZ2V0X3ZmX2NvbmZpZwk9IGJlX2dldF92Zl9jb25maWcsCisjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKKwkubmRvX3BvbGxfY29udHJvbGxlcgk9IGJlX25ldHBvbGwsCisjZW5kaWYKIH07CiAKIHN0YXRpYyB2b2lkIGJlX25ldGRldl9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCkBAIC0zMjQyLDYgKzMzNDQsNyBAQAogCQlicmVhazsKIAljYXNlIEJFX0RFVklDRV9JRDI6CiAJY2FzZSBPQ19ERVZJQ0VfSUQyOgorCWNhc2UgT0NfREVWSUNFX0lENToKIAkJYWRhcHRlci0+Z2VuZXJhdGlvbiA9IEJFX0dFTjM7CiAJCWJyZWFrOwogCWNhc2UgT0NfREVWSUNFX0lEMzoKQEAgLTMyNjcsNyArMzM3MCw3IEBACiAKIHN0YXRpYyBpbnQgbGFuY2VyX3dhaXRfcmVhZHkoc3RydWN0IGJlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7Ci0jZGVmaW5lIFNMSVBPUlRfUkVBRFlfVElNRU9VVCA1MDAKKyNkZWZpbmUgU0xJUE9SVF9SRUFEWV9USU1FT1VUIDMwCiAJdTMyIHNsaXBvcnRfc3RhdHVzOwogCWludCBzdGF0dXMgPSAwLCBpOwogCkBAIC0zMjc2LDcgKzMzNzksNyBAQAogCQlpZiAoc2xpcG9ydF9zdGF0dXMgJiBTTElQT1JUX1NUQVRVU19SRFlfTUFTSykKIAkJCWJyZWFrOwogCi0JCW1zbGVlcCgyMCk7CisJCW1zbGVlcCgxMDAwKTsKIAl9CiAKIAlpZiAoaSA9PSBTTElQT1JUX1JFQURZX1RJTUVPVVQpCkBAIC0zMzEzLDYgKzM0MTYsMTA0IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdGljIHZvaWQgbGFuY2VyX3Rlc3RfYW5kX3JlY292ZXJfZm5fZXJyKHN0cnVjdCBiZV9hZGFwdGVyICphZGFwdGVyKQoreworCWludCBzdGF0dXM7CisJdTMyIHNsaXBvcnRfc3RhdHVzOworCisJaWYgKGFkYXB0ZXItPmVlaF9lcnIgfHwgYWRhcHRlci0+dWVfZGV0ZWN0ZWQpCisJCXJldHVybjsKKworCXNsaXBvcnRfc3RhdHVzID0gaW9yZWFkMzIoYWRhcHRlci0+ZGIgKyBTTElQT1JUX1NUQVRVU19PRkZTRVQpOworCisJaWYgKHNsaXBvcnRfc3RhdHVzICYgU0xJUE9SVF9TVEFUVVNfRVJSX01BU0spIHsKKwkJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJCSJBZGFwdGVyIGluIGVycm9yIHN0YXRlLiIKKwkJCQkiVHJ5aW5nIHRvIHJlY292ZXIuXG4iKTsKKworCQlzdGF0dXMgPSBsYW5jZXJfdGVzdF9hbmRfc2V0X3JkeV9zdGF0ZShhZGFwdGVyKTsKKwkJaWYgKHN0YXR1cykKKwkJCWdvdG8gZXJyOworCisJCW5ldGlmX2RldmljZV9kZXRhY2goYWRhcHRlci0+bmV0ZGV2KTsKKworCQlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKQorCQkJYmVfY2xvc2UoYWRhcHRlci0+bmV0ZGV2KTsKKworCQliZV9jbGVhcihhZGFwdGVyKTsKKworCQlhZGFwdGVyLT5md190aW1lb3V0ID0gZmFsc2U7CisKKwkJc3RhdHVzID0gYmVfc2V0dXAoYWRhcHRlcik7CisJCWlmIChzdGF0dXMpCisJCQlnb3RvIGVycjsKKworCQlpZiAobmV0aWZfcnVubmluZyhhZGFwdGVyLT5uZXRkZXYpKSB7CisJCQlzdGF0dXMgPSBiZV9vcGVuKGFkYXB0ZXItPm5ldGRldik7CisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gZXJyOworCQl9CisKKwkJbmV0aWZfZGV2aWNlX2F0dGFjaChhZGFwdGVyLT5uZXRkZXYpOworCisJCWRldl9lcnIoJmFkYXB0ZXItPnBkZXYtPmRldiwKKwkJCQkiQWRhcHRlciBlcnJvciByZWNvdmVyeSBzdWNjZWVkZWRcbiIpOworCX0KKwlyZXR1cm47CitlcnI6CisJZGV2X2VycigmYWRhcHRlci0+cGRldi0+ZGV2LAorCQkJIkFkYXB0ZXIgZXJyb3IgcmVjb3ZlcnkgZmFpbGVkXG4iKTsKK30KKworc3RhdGljIHZvaWQgYmVfd29ya2VyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYmVfYWRhcHRlciAqYWRhcHRlciA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYmVfYWRhcHRlciwgd29yay53b3JrKTsKKwlzdHJ1Y3QgYmVfcnhfb2JqICpyeG87CisJaW50IGk7CisKKwlpZiAobGFuY2VyX2NoaXAoYWRhcHRlcikpCisJCWxhbmNlcl90ZXN0X2FuZF9yZWNvdmVyX2ZuX2VycihhZGFwdGVyKTsKKworCWJlX2RldGVjdF9kdW1wX3VlKGFkYXB0ZXIpOworCisJLyogd2hlbiBpbnRlcnJ1cHRzIGFyZSBub3QgeWV0IGVuYWJsZWQsIGp1c3QgcmVhcCBhbnkgcGVuZGluZworCSogbWNjIGNvbXBsZXRpb25zICovCisJaWYgKCFuZXRpZl9ydW5uaW5nKGFkYXB0ZXItPm5ldGRldikpIHsKKwkJaW50IG1jY19jb21wbCwgc3RhdHVzID0gMDsKKworCQltY2NfY29tcGwgPSBiZV9wcm9jZXNzX21jYyhhZGFwdGVyLCAmc3RhdHVzKTsKKworCQlpZiAobWNjX2NvbXBsKSB7CisJCQlzdHJ1Y3QgYmVfbWNjX29iaiAqbWNjX29iaiA9ICZhZGFwdGVyLT5tY2Nfb2JqOworCQkJYmVfY3Ffbm90aWZ5KGFkYXB0ZXIsIG1jY19vYmotPmNxLmlkLCBmYWxzZSwgbWNjX2NvbXBsKTsKKwkJfQorCisJCWdvdG8gcmVzY2hlZHVsZTsKKwl9CisKKwlpZiAoIWFkYXB0ZXItPnN0YXRzX2NtZF9zZW50KSB7CisJCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkKKwkJCWxhbmNlcl9jbWRfZ2V0X3Bwb3J0X3N0YXRzKGFkYXB0ZXIsCisJCQkJCQkmYWRhcHRlci0+c3RhdHNfY21kKTsKKwkJZWxzZQorCQkJYmVfY21kX2dldF9zdGF0cyhhZGFwdGVyLCAmYWRhcHRlci0+c3RhdHNfY21kKTsKKwl9CisKKwlmb3JfYWxsX3J4X3F1ZXVlcyhhZGFwdGVyLCByeG8sIGkpIHsKKwkJYmVfcnhfZXFkX3VwZGF0ZShhZGFwdGVyLCByeG8pOworCisJCWlmIChyeG8tPnJ4X3Bvc3Rfc3RhcnZlZCkgeworCQkJcnhvLT5yeF9wb3N0X3N0YXJ2ZWQgPSBmYWxzZTsKKwkJCWJlX3Bvc3RfcnhfZnJhZ3MocnhvLCBHRlBfS0VSTkVMKTsKKwkJfQorCX0KKworcmVzY2hlZHVsZToKKwlhZGFwdGVyLT53b3JrX2NvdW50ZXIrKzsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmFkYXB0ZXItPndvcmssIG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpOworfQorCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBiZV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKIAkJCWNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwZGV2X2lkKQogewpAQCAtMzM2NSw3ICszNTY2LDEyIEBACiAJCWdvdG8gZGlzYWJsZV9zcmlvdjsKIAogCWlmIChsYW5jZXJfY2hpcChhZGFwdGVyKSkgewotCQlzdGF0dXMgPSBsYW5jZXJfdGVzdF9hbmRfc2V0X3JkeV9zdGF0ZShhZGFwdGVyKTsKKwkJc3RhdHVzID0gbGFuY2VyX3dhaXRfcmVhZHkoYWRhcHRlcik7CisJCWlmICghc3RhdHVzKSB7CisJCQlpb3dyaXRlMzIoU0xJX1BPUlRfQ09OVFJPTF9JUF9NQVNLLAorCQkJCQlhZGFwdGVyLT5kYiArIFNMSVBPUlRfQ09OVFJPTF9PRkZTRVQpOworCQkJc3RhdHVzID0gbGFuY2VyX3Rlc3RfYW5kX3NldF9yZHlfc3RhdGUoYWRhcHRlcik7CisJCX0KIAkJaWYgKHN0YXR1cykgewogCQkJZGV2X2VycigmcGRldi0+ZGV2LCAiQWRhcHRlciBpbiBub24gcmVjb3ZlcmFibGUgZXJyb3JcbiIpOwogCQkJZ290byBjdHJsX2NsZWFuOwpAQCAtMzU1OSw2ICszNzY1LDggQEAKIAogCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJFRUggcmVzZXRcbiIpOwogCWFkYXB0ZXItPmVlaF9lcnIgPSBmYWxzZTsKKwlhZGFwdGVyLT51ZV9kZXRlY3RlZCA9IGZhbHNlOworCWFkYXB0ZXItPmZ3X3RpbWVvdXQgPSBmYWxzZTsKIAogCXN0YXR1cyA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwogCWlmIChzdGF0dXMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9ldGhvYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZXRob2MuYwppbmRleCAyNTFiNjM1Li42MGYwZTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9ldGhvYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2V0aG9jLmMKQEAgLTExODUsMTggKzExODUsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBldGhvY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZXRob2NfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGV0aG9jX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZXRob2NfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZXRob2NfaW5pdCk7Ci1tb2R1bGVfZXhpdChldGhvY19leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZXRob2NfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiVGhpZXJyeSBSZWRpbmcgPHRoaWVycnkucmVkaW5nQGF2aW9uaWMtZGVzaWduLmRlPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJPcGVuQ29yZXMgRXRoZXJuZXQgTUFDIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZmVhbG54LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mZWFsbnguYwppbmRleCA2MWQyYmRkLi5jODJkNDQ0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mZWFsbnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mZWFsbnguYwpAQCAtMTgxOCw5ICsxODE4LDkgQEAKIHsKIAlzdHJ1Y3QgbmV0ZGV2X3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyBpbnQgbmV0ZGV2X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL0tjb25maWcKaW5kZXggYzUyMGNmZC4uMzU3NGUxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL0tjb25maWcKQEAgLTIxLDkgKzIxLDEwIEBACiBpZiBORVRfVkVORE9SX0ZSRUVTQ0FMRQogCiBjb25maWcgRkVDCi0JYm9vbCAiRkVDIGV0aGVybmV0IGNvbnRyb2xsZXIgKG9mIENvbGRGaXJlIGFuZCBzb21lIGkuTVggQ1BVcykiCisJdHJpc3RhdGUgIkZFQyBldGhlcm5ldCBjb250cm9sbGVyIChvZiBDb2xkRmlyZSBhbmQgc29tZSBpLk1YIENQVXMpIgogCWRlcGVuZHMgb24gKE01MjN4IHx8IE01Mjd4IHx8IE01MjcyIHx8IE01Mjh4IHx8IE01MjB4IHx8IE01MzJ4IHx8IFwKLQkJICAgQVJDSF9NWEMgfHwgQVJDSF9NWFMpCisJCSAgIEFSQ0hfTVhDIHx8IFNPQ19JTVgyOCkKKwlkZWZhdWx0IEFSQ0hfTVhDIHx8IFNPQ19JTVgyOCBpZiBBUk0KIAlzZWxlY3QgUEhZTElCCiAJLS0taGVscC0tLQogCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGJ1aWx0LWluIDEwLzEwMCBGYXN0IGV0aGVybmV0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZmVjLmMKaW5kZXggMTEyNGNlMC4uMjBjMmUzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZlYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mZWMuYwpAQCAtOTksNyArOTksNyBAQAogTU9EVUxFX0RFVklDRV9UQUJMRShwbGF0Zm9ybSwgZmVjX2RldnR5cGUpOwogCiBlbnVtIGlteF9mZWNfdHlwZSB7Ci0JSU1YMjVfRkVDID0gMSwgCS8qIHJ1bnMgb24gaS5teDI1LzUwLzUzICovCisJSU1YMjVfRkVDID0gMSwJLyogcnVucyBvbiBpLm14MjUvNTAvNTMgKi8KIAlJTVgyN19GRUMsCS8qIHJ1bnMgb24gaS5teDI3LzM1LzUxICovCiAJSU1YMjhfRkVDLAogCUlNWDZRX0ZFQywKQEAgLTEzMiw3ICsxMzIsNyBAQAogI2VsaWYgZGVmaW5lZCAoQ09ORklHX001MjcyQzMpCiAjZGVmaW5lCUZFQ19GTEFTSE1BQwkoMHhmZmUwNDAwMCArIDQpCiAjZWxpZiBkZWZpbmVkKENPTkZJR19NT0Q1MjcyKQotI2RlZmluZSBGRUNfRkxBU0hNQUMgCTB4ZmZjMDQwNmIKKyNkZWZpbmUgRkVDX0ZMQVNITUFDCTB4ZmZjMDQwNmIKICNlbHNlCiAjZGVmaW5lCUZFQ19GTEFTSE1BQwkwCiAjZW5kaWYKQEAgLTIzMiw2ICsyMzIsNyBAQAogCXN0cnVjdAlwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKIAlpbnQJb3BlbmVkOworCWludAlkZXZfaWQ7CiAKIAkvKiBQaHlsaWIgYW5kIE1ESU8gaW50ZXJmYWNlICovCiAJc3RydWN0CW1paV9idXMgKm1paV9idXM7CkBAIC0yNTQsMTEgKzI1NSwxMyBAQAogI2RlZmluZSBGRUNfTU1GUl9UQQkJKDIgPDwgMTYpCiAjZGVmaW5lIEZFQ19NTUZSX0RBVEEodikJKHYgJiAweGZmZmYpCiAKLSNkZWZpbmUgRkVDX01JSV9USU1FT1VUCQkxMDAwIC8qIHVzICovCisjZGVmaW5lIEZFQ19NSUlfVElNRU9VVAkJMzAwMDAgLyogdXMgKi8KIAogLyogVHJhbnNtaXR0ZXIgdGltZW91dCAqLwogI2RlZmluZSBUWF9USU1FT1VUICgyICogSFopCiAKK3N0YXRpYyBpbnQgbWlpX2NudDsKKwogc3RhdGljIHZvaWQgKnN3YXBfYnVmZmVyKHZvaWQgKmJ1ZmFkZHIsIGludCBsZW4pCiB7CiAJaW50IGk7CkBAIC01MTUsNiArNTE4LDcgQEAKIAlzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwID0gbmV0ZGV2X3ByaXYobmRldik7CiAJY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCAqaWRfZW50cnkgPQogCQkJCXBsYXRmb3JtX2dldF9kZXZpY2VfaWQoZmVwLT5wZGV2KTsKKwl1MzIgcm1paV9tb2RlID0gcmVhZGwoZmVwLT5od3AgKyBGRUNfUl9DTlRSTCkgJiAoMSA8PCA4KTsKIAogCS8qIFdlIGNhbm5vdCBleHBlY3QgYSBncmFjZWZ1bCB0cmFuc21pdCBzdG9wIHdpdGhvdXQgbGluayAhISEgKi8KIAlpZiAoZmVwLT5saW5rKSB7CkBAIC01MzEsOCArNTM1LDEwIEBACiAJd3JpdGVsKEZFQ19ERUZBVUxUX0lNQVNLLCBmZXAtPmh3cCArIEZFQ19JTUFTSyk7CiAKIAkvKiBXZSBoYXZlIHRvIGtlZXAgRU5FVCBlbmFibGVkIHRvIGhhdmUgTUlJIGludGVycnVwdCBzdGF5IHdvcmtpbmcgKi8KLQlpZiAoaWRfZW50cnktPmRyaXZlcl9kYXRhICYgRkVDX1FVSVJLX0VORVRfTUFDKQorCWlmIChpZF9lbnRyeS0+ZHJpdmVyX2RhdGEgJiBGRUNfUVVJUktfRU5FVF9NQUMpIHsKIAkJd3JpdGVsKDIsIGZlcC0+aHdwICsgRkVDX0VDTlRSTCk7CisJCXdyaXRlbChybWlpX21vZGUsIGZlcC0+aHdwICsgRkVDX1JfQ05UUkwpOworCX0KIH0KIAogCkBAIC04MTgsNyArODI0LDcgQEAKIAkJCWlhcCA9ICh1bnNpZ25lZCBjaGFyICopRkVDX0ZMQVNITUFDOwogI2Vsc2UKIAkJaWYgKHBkYXRhKQotCQkJbWVtY3B5KGlhcCwgcGRhdGEtPm1hYywgRVRIX0FMRU4pOworCQkJaWFwID0gKHVuc2lnbmVkIGNoYXIgKikmcGRhdGEtPm1hYzsKICNlbmRpZgogCX0KIApAQCAtODM3LDcgKzg0Myw3IEBACiAKIAkvKiBBZGp1c3QgTUFDIGlmIHVzaW5nIG1hY2FkZHIgKi8KIAlpZiAoaWFwID09IG1hY2FkZHIpCi0JCSBuZGV2LT5kZXZfYWRkcltFVEhfQUxFTi0xXSA9IG1hY2FkZHJbRVRIX0FMRU4tMV0gKyBmZXAtPnBkZXYtPmlkOworCQkgbmRldi0+ZGV2X2FkZHJbRVRIX0FMRU4tMV0gPSBtYWNhZGRyW0VUSF9BTEVOLTFdICsgZmVwLT5kZXZfaWQ7CiB9CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KQEAgLTg2NSw2ICs4NzEsOCBAQAogCWlmIChwaHlfZGV2LT5saW5rKSB7CiAJCWlmIChmZXAtPmZ1bGxfZHVwbGV4ICE9IHBoeV9kZXYtPmR1cGxleCkgewogCQkJZmVjX3Jlc3RhcnQobmRldiwgcGh5X2Rldi0+ZHVwbGV4KTsKKwkJCS8qIHByZXZlbnQgdW5uZWNlc3Nhcnkgc2Vjb25kIGZlY19yZXN0YXJ0KCkgYmVsb3cgKi8KKwkJCWZlcC0+bGluayA9IHBoeV9kZXYtPmxpbms7CiAJCQlzdGF0dXNfY2hhbmdlID0gMTsKIAkJfQogCX0KQEAgLTk1Myw3ICs5NjEsNyBAQAogCWNoYXIgbWRpb19idXNfaWRbTUlJX0JVU19JRF9TSVpFXTsKIAljaGFyIHBoeV9uYW1lW01JSV9CVVNfSURfU0laRSArIDNdOwogCWludCBwaHlfaWQ7Ci0JaW50IGRldl9pZCA9IGZlcC0+cGRldi0+aWQ7CisJaW50IGRldl9pZCA9IGZlcC0+ZGV2X2lkOwogCiAJZmVwLT5waHlfZGV2ID0gTlVMTDsKIApAQCAtOTcyLDggKzk4MCw5IEBACiAJfQogCiAJaWYgKHBoeV9pZCA+PSBQSFlfTUFYX0FERFIpIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IG5vIFBIWSwgYXNzdW1pbmcgZGlyZWN0IGNvbm5lY3Rpb24gIgotCQkJInRvIHN3aXRjaFxuIiwgbmRldi0+bmFtZSk7CisJCXByaW50ayhLRVJOX0lORk8KKwkJCSIlczogbm8gUEhZLCBhc3N1bWluZyBkaXJlY3QgY29ubmVjdGlvbiB0byBzd2l0Y2hcbiIsCisJCQluZGV2LT5uYW1lKTsKIAkJc3RybmNweShtZGlvX2J1c19pZCwgIjAiLCBNSUlfQlVTX0lEX1NJWkUpOwogCQlwaHlfaWQgPSAwOwogCX0KQEAgLTk5OCw4ICsxMDA3LDkgQEAKIAlmZXAtPmxpbmsgPSAwOwogCWZlcC0+ZnVsbF9kdXBsZXggPSAwOwogCi0JcHJpbnRrKEtFUk5fSU5GTyAiJXM6IEZyZWVzY2FsZSBGRUMgUEhZIGRyaXZlciBbJXNdICIKLQkJIihtaWlfYnVzOnBoeV9hZGRyPSVzLCBpcnE9JWQpXG4iLCBuZGV2LT5uYW1lLAorCXByaW50ayhLRVJOX0lORk8KKwkJIiVzOiBGcmVlc2NhbGUgRkVDIFBIWSBkcml2ZXIgWyVzXSAobWlpX2J1czpwaHlfYWRkcj0lcywgaXJxPSVkKVxuIiwKKwkJbmRldi0+bmFtZSwKIAkJZmVwLT5waHlfZGV2LT5kcnYtPm5hbWUsIGRldl9uYW1lKCZmZXAtPnBoeV9kZXYtPmRldiksCiAJCWZlcC0+cGh5X2Rldi0+aXJxKTsKIApAQCAtMTAzMSwxMCArMTA0MSwxNCBAQAogCSAqIG1kaW8gaW50ZXJmYWNlIGluIGJvYXJkIGRlc2lnbiwgYW5kIG5lZWQgdG8gYmUgY29uZmlndXJlZCBieQogCSAqIGZlYzAgbWlpX2J1cy4KIAkgKi8KLQlpZiAoKGlkX2VudHJ5LT5kcml2ZXJfZGF0YSAmIEZFQ19RVUlSS19FTkVUX01BQykgJiYgcGRldi0+aWQgPiAwKSB7CisJaWYgKChpZF9lbnRyeS0+ZHJpdmVyX2RhdGEgJiBGRUNfUVVJUktfRU5FVF9NQUMpICYmIGZlcC0+ZGV2X2lkID4gMCkgewogCQkvKiBmZWMxIHVzZXMgZmVjMCBtaWlfYnVzICovCi0JCWZlcC0+bWlpX2J1cyA9IGZlYzBfbWlpX2J1czsKLQkJcmV0dXJuIDA7CisJCWlmIChtaWlfY250ICYmIGZlYzBfbWlpX2J1cykgeworCQkJZmVwLT5taWlfYnVzID0gZmVjMF9taWlfYnVzOworCQkJbWlpX2NudCsrOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCiAJZmVwLT5taWlfdGltZW91dCA9IDA7CkBAIC0xMDYzLDcgKzEwNzcsNyBAQAogCWZlcC0+bWlpX2J1cy0+cmVhZCA9IGZlY19lbmV0X21kaW9fcmVhZDsKIAlmZXAtPm1paV9idXMtPndyaXRlID0gZmVjX2VuZXRfbWRpb193cml0ZTsKIAlmZXAtPm1paV9idXMtPnJlc2V0ID0gZmVjX2VuZXRfbWRpb19yZXNldDsKLQlzbnByaW50ZihmZXAtPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIleCIsIHBkZXYtPmlkICsgMSk7CisJc25wcmludGYoZmVwLT5taWlfYnVzLT5pZCwgTUlJX0JVU19JRF9TSVpFLCAiJXgiLCBmZXAtPmRldl9pZCArIDEpOwogCWZlcC0+bWlpX2J1cy0+cHJpdiA9IGZlcDsKIAlmZXAtPm1paV9idXMtPnBhcmVudCA9ICZwZGV2LT5kZXY7CiAKQEAgLTEwNzksNiArMTA5Myw4IEBACiAJaWYgKG1kaW9idXNfcmVnaXN0ZXIoZmVwLT5taWlfYnVzKSkKIAkJZ290byBlcnJfb3V0X2ZyZWVfbWRpb19pcnE7CiAKKwltaWlfY250Kys7CisKIAkvKiBzYXZlIGZlYzAgbWlpX2J1cyAqLwogCWlmIChpZF9lbnRyeS0+ZHJpdmVyX2RhdGEgJiBGRUNfUVVJUktfRU5FVF9NQUMpCiAJCWZlYzBfbWlpX2J1cyA9IGZlcC0+bWlpX2J1czsKQEAgLTEwOTUsMTEgKzExMTEsMTEgQEAKIAogc3RhdGljIHZvaWQgZmVjX2VuZXRfbWlpX3JlbW92ZShzdHJ1Y3QgZmVjX2VuZXRfcHJpdmF0ZSAqZmVwKQogewotCWlmIChmZXAtPnBoeV9kZXYpCi0JCXBoeV9kaXNjb25uZWN0KGZlcC0+cGh5X2Rldik7Ci0JbWRpb2J1c191bnJlZ2lzdGVyKGZlcC0+bWlpX2J1cyk7Ci0Ja2ZyZWUoZmVwLT5taWlfYnVzLT5pcnEpOwotCW1kaW9idXNfZnJlZShmZXAtPm1paV9idXMpOworCWlmICgtLW1paV9jbnQgPT0gMCkgeworCQltZGlvYnVzX3VucmVnaXN0ZXIoZmVwLT5taWlfYnVzKTsKKwkJa2ZyZWUoZmVwLT5taWlfYnVzLT5pcnEpOworCQltZGlvYnVzX2ZyZWUoZmVwLT5taWlfYnVzKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgZmVjX2VuZXRfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LApAQCAtMTEzNiw3ICsxMTUyLDcgQEAKIAlzdHJjcHkoaW5mby0+YnVzX2luZm8sIGRldl9uYW1lKCZuZGV2LT5kZXYpKTsKIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyBmZWNfZW5ldF9ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZmVjX2VuZXRfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncwkJPSBmZWNfZW5ldF9nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwkJPSBmZWNfZW5ldF9zZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvCQk9IGZlY19lbmV0X2dldF9kcnZpbmZvLApAQCAtMTUyMSw2ICsxNTM3LDcgQEAKIAlpbnQgaSwgaXJxLCByZXQgPSAwOwogCXN0cnVjdCByZXNvdXJjZSAqcjsKIAljb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkICpvZl9pZDsKKwlzdGF0aWMgaW50IGRldl9pZDsKIAogCW9mX2lkID0gb2ZfbWF0Y2hfZGV2aWNlKGZlY19kdF9pZHMsICZwZGV2LT5kZXYpOwogCWlmIChvZl9pZCkKQEAgLTE1NDgsNiArMTU2NSw3IEBACiAKIAlmZXAtPmh3cCA9IGlvcmVtYXAoci0+c3RhcnQsIHJlc291cmNlX3NpemUocikpOwogCWZlcC0+cGRldiA9IHBkZXY7CisJZmVwLT5kZXZfaWQgPSBkZXZfaWQrKzsKIAogCWlmICghZmVwLT5od3ApIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTE1NzEsOCArMTU4OSwxMiBAQAogCiAJZm9yIChpID0gMDsgaSA8IEZFQ19JUlFfTlVNOyBpKyspIHsKIAkJaXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCBpKTsKLQkJaWYgKGkgJiYgaXJxIDwgMCkKLQkJCWJyZWFrOworCQlpZiAoaXJxIDwgMCkgeworCQkJaWYgKGkpCisJCQkJYnJlYWs7CisJCQlyZXQgPSBpcnE7CisJCQlnb3RvIGZhaWxlZF9pcnE7CisJCX0KIAkJcmV0ID0gcmVxdWVzdF9pcnEoaXJxLCBmZWNfZW5ldF9pbnRlcnJ1cHQsIElSUUZfRElTQUJMRUQsIHBkZXYtPm5hbWUsIG5kZXYpOwogCQlpZiAocmV0KSB7CiAJCQl3aGlsZSAoLS1pID49IDApIHsKQEAgLTE1ODMsNyArMTYwNSw3IEBACiAJCX0KIAl9CiAKLQlmZXAtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgImZlY19jbGsiKTsKKwlmZXAtPmNsayA9IGNsa19nZXQoJnBkZXYtPmRldiwgTlVMTCk7CiAJaWYgKElTX0VSUihmZXAtPmNsaykpIHsKIAkJcmV0ID0gUFRSX0VSUihmZXAtPmNsayk7CiAJCWdvdG8gZmFpbGVkX2NsazsKQEAgLTE2MzUsMTMgKzE2NTcsMTggQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBmZWNfZW5ldF9wcml2YXRlICpmZXAgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgcmVzb3VyY2UgKnI7CisJaW50IGk7CiAKLQlmZWNfc3RvcChuZGV2KTsKKwl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKIAlmZWNfZW5ldF9taWlfcmVtb3ZlKGZlcCk7CisJZm9yIChpID0gMDsgaSA8IEZFQ19JUlFfTlVNOyBpKyspIHsKKwkJaW50IGlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgaSk7CisJCWlmIChpcnEgPiAwKQorCQkJZnJlZV9pcnEoaXJxLCBuZGV2KTsKKwl9CiAJY2xrX2Rpc2FibGUoZmVwLT5jbGspOwogCWNsa19wdXQoZmVwLT5jbGspOwogCWlvdW5tYXAoZmVwLT5od3ApOwotCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwogCWZyZWVfbmV0ZGV2KG5kZXYpOwogCiAJciA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9mc19lbmV0LW1haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCmluZGV4IDViZjU0NzEuLjkxMGE4ZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L2ZzX2VuZXQtbWFpbi5jCkBAIC0xMTcxLDE2ICsxMTcxLDYgQEAKIAkucmVtb3ZlID0gZnNfZW5ldF9yZW1vdmUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBmc19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNfZW5ldF9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZnNfY2xlYW51cCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZmc19lbmV0X2RyaXZlcik7Ci19Ci0KICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogc3RhdGljIHZvaWQgZnNfZW5ldF9uZXRwb2xsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0xMTkwLDcgKzExODAsNCBAQAogfQogI2VuZGlmCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotbW9kdWxlX2luaXQoZnNfaW5pdCk7Ci1tb2R1bGVfZXhpdChmc19jbGVhbnVwKTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZnNfZW5ldF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWlpLWJpdGJhbmcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21paS1iaXRiYW5nLmMKaW5kZXggYjA5MjcwYi4uMGYyZDFhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWlpLWJpdGJhbmcuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9taWktYml0YmFuZy5jCkBAIC0yMzIsMTUgKzIzMiw0IEBACiAJLnJlbW92ZSA9IGZzX2VuZXRfbWRpb19yZW1vdmUsCiB9OwogCi1zdGF0aWMgaW50IGZzX2VuZXRfbWRpb19iYl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNfZW5ldF9iYl9tZGlvX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGZzX2VuZXRfbWRpb19iYl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmZzX2VuZXRfYmJfbWRpb19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChmc19lbmV0X21kaW9fYmJfaW5pdCk7Ci1tb2R1bGVfZXhpdChmc19lbmV0X21kaW9fYmJfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGZzX2VuZXRfYmJfbWRpb19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWlpLWZlYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzX2VuZXQvbWlpLWZlYy5jCmluZGV4IGUwZTlkNmMuLjU1YmI4NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9mc19lbmV0L21paS1mZWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNfZW5ldC9taWktZmVjLmMKQEAgLTIzNywxNSArMjM3LDQgQEAKIAkucmVtb3ZlID0gZnNfZW5ldF9tZGlvX3JlbW92ZSwKIH07CiAKLXN0YXRpYyBpbnQgZnNfZW5ldF9tZGlvX2ZlY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNfZW5ldF9mZWNfbWRpb19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBmc19lbmV0X21kaW9fZmVjX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZnNfZW5ldF9mZWNfbWRpb19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChmc19lbmV0X21kaW9fZmVjX2luaXQpOwotbW9kdWxlX2V4aXQoZnNfZW5ldF9tZGlvX2ZlY19leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZnNfZW5ldF9mZWNfbWRpb19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2ZzbF9wcV9tZGlvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNsX3BxX21kaW8uYwppbmRleCA1MmY0ZThhLi45ZWI4MTU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNsX3BxX21kaW8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZnNsX3BxX21kaW8uYwpAQCAtMTgzLDI4ICsxODMsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGZzbF9wcV9tZGlvX2J1c19uYW1lKTsKIAotLyogU2NhbiB0aGUgYnVzIGluIHJldmVyc2UsIGxvb2tpbmcgZm9yIGFuIGVtcHR5IHNwb3QgKi8KLXN0YXRpYyBpbnQgZnNsX3BxX21kaW9fZmluZF9mcmVlKHN0cnVjdCBtaWlfYnVzICpuZXdfYnVzKQotewotCWludCBpOwogCi0JZm9yIChpID0gUEhZX01BWF9BRERSOyBpID4gMDsgaS0tKSB7Ci0JCXUzMiBwaHlfaWQ7Ci0KLQkJaWYgKGdldF9waHlfaWQobmV3X2J1cywgaSwgJnBoeV9pZCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaWYgKHBoeV9pZCA9PSAweGZmZmZmZmZmKQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGk7Ci19Ci0KLQotI2lmIGRlZmluZWQoQ09ORklHX0dJQU5GQVIpIHx8IGRlZmluZWQoQ09ORklHX0dJQU5GQVJfTU9EVUxFKQogc3RhdGljIHUzMiBfX2lvbWVtICpnZXRfZ2Zhcl90YmlwYShzdHJ1Y3QgZnNsX3BxX21kaW8gX19pb21lbSAqcmVncywgc3RydWN0IGRldmljZV9ub2RlICpucCkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19HSUFORkFSKSB8fCBkZWZpbmVkKENPTkZJR19HSUFORkFSX01PRFVMRSkKIAlzdHJ1Y3QgZ2ZhciBfX2lvbWVtICplbmV0X3JlZ3M7CiAKIAkvKgpAQCAtMjIwLDE1ICsyMDIsMTUgQEAKIAl9IGVsc2UgaWYgKG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGV0c2VjMi1tZGlvIikgfHwKIAkJCW9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGV0c2VjMi10YmkiKSkgewogCQlyZXR1cm4gb2ZfaW9tYXAobnAsIDEpOwotCX0gZWxzZQotCQlyZXR1cm4gTlVMTDsKLX0KKwl9CiAjZW5kaWYKKwlyZXR1cm4gTlVMTDsKK30KIAogCi0jaWYgZGVmaW5lZChDT05GSUdfVUNDX0dFVEgpIHx8IGRlZmluZWQoQ09ORklHX1VDQ19HRVRIX01PRFVMRSkKIHN0YXRpYyBpbnQgZ2V0X3VjY19pZF9mb3JfcmFuZ2UodTY0IHN0YXJ0LCB1NjQgZW5kLCB1MzIgKnVjY19pZCkKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19VQ0NfR0VUSCkgfHwgZGVmaW5lZChDT05GSUdfVUNDX0dFVEhfTU9EVUxFKQogCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOwogCWludCBlcnIgPSAwOwogCkBAIC0yNjEsOSArMjQzLDEwIEBACiAJCXJldHVybiBlcnI7CiAJZWxzZQogCQlyZXR1cm4gLUVJTlZBTDsKLX0KKyNlbHNlCisJcmV0dXJuIC1FTk9ERVY7CiAjZW5kaWYKLQorfQogCiBzdGF0aWMgaW50IGZzbF9wcV9tZGlvX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKm9mZGV2KQogewpAQCAtMzM5LDE5ICszMjIsMTMgQEAKIAkJCW9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGV0c2VjMi1tZGlvIikgfHwKIAkJCW9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCAiZnNsLGV0c2VjMi10YmkiKSB8fAogCQkJb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJnaWFuZmFyIikpIHsKLSNpZiBkZWZpbmVkKENPTkZJR19HSUFORkFSKSB8fCBkZWZpbmVkKENPTkZJR19HSUFORkFSX01PRFVMRSkKIAkJdGJpcGEgPSBnZXRfZ2Zhcl90YmlwYShyZWdzLCBucCk7CiAJCWlmICghdGJpcGEpIHsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIGVycl9mcmVlX2lycXM7CiAJCX0KLSNlbHNlCi0JCWVyciA9IC1FTk9ERVY7Ci0JCWdvdG8gZXJyX2ZyZWVfaXJxczsKLSNlbmRpZgogCX0gZWxzZSBpZiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJmc2wsdWNjLW1kaW8iKSB8fAogCQkJb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsICJ1Y2NfZ2V0aF9waHkiKSkgewotI2lmIGRlZmluZWQoQ09ORklHX1VDQ19HRVRIKSB8fCBkZWZpbmVkKENPTkZJR19VQ0NfR0VUSF9NT0RVTEUpCiAJCXUzMiBpZDsKIAkJc3RhdGljIHUzMiBtaWlfbW5nX21hc3RlcjsKIApAQCAtMzY0LDEwICszNDEsNiBAQAogCQkJbWlpX21uZ19tYXN0ZXIgPSBpZDsKIAkJCXVjY19zZXRfcWVfbXV4X21paV9tbmcoaWQgLSAxKTsKIAkJfQotI2Vsc2UKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBlcnJfZnJlZV9pcnFzOwotI2VuZGlmCiAJfSBlbHNlIHsKIAkJZXJyID0gLUVOT0RFVjsKIAkJZ290byBlcnJfZnJlZV9pcnFzOwpAQCAtMzg2LDIzICszNTksMTIgQEAKIAl9CiAKIAlpZiAodGJpYWRkciA9PSAtMSkgewotCQlvdXRfYmUzMih0YmlwYSwgMCk7Ci0KLQkJdGJpYWRkciA9IGZzbF9wcV9tZGlvX2ZpbmRfZnJlZShuZXdfYnVzKTsKLQl9Ci0KLQkvKgotCSAqIFdlIGRlZmluZSBUQklQQSBhdCAwIHRvIGJlIGlsbGVnYWwsIG9wdGluZyB0byBmYWlsIGZvciBib2FyZHMgdGhhdAotCSAqIGhhdmUgUEhZcyBhdCAxLTMxLCByYXRoZXIgdGhhbiBjaGFuZ2UgdGJpcGEgYW5kIHJlc2Nhbi4KLQkgKi8KLQlpZiAodGJpYWRkciA9PSAwKSB7CiAJCWVyciA9IC1FQlVTWTsKLQogCQlnb3RvIGVycl9mcmVlX2lycXM7CisJfSBlbHNlIHsKKwkJb3V0X2JlMzIodGJpcGEsIHRiaWFkZHIpOwogCX0KIAotCW91dF9iZTMyKHRiaXBhLCB0YmlhZGRyKTsKLQogCWVyciA9IG9mX21kaW9idXNfcmVnaXN0ZXIobmV3X2J1cywgbnApOwogCWlmIChlcnIpIHsKIAkJcHJpbnRrIChLRVJOX0VSUiAiJXM6IENhbm5vdCByZWdpc3RlciBhcyBNRElPIGJ1c1xuIiwKQEAgLTQ4MCwxNSArNDQyLDYgQEAKIAkucmVtb3ZlID0gZnNsX3BxX21kaW9fcmVtb3ZlLAogfTsKIAotaW50IF9faW5pdCBmc2xfcHFfbWRpb19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZnNsX3BxX21kaW9fZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KGZzbF9wcV9tZGlvX2luaXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihmc2xfcHFfbWRpb19kcml2ZXIpOwogCi12b2lkIGZzbF9wcV9tZGlvX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZnNsX3BxX21kaW9fZHJpdmVyKTsKLX0KLW1vZHVsZV9leGl0KGZzbF9wcV9tZGlvX2V4aXQpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmMKaW5kZXggODMxOTlmZC4uZTAxY2RhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5jCkBAIC03MzQsNyArNzM0LDcgQEAKIAogCW1hY19hZGRyID0gb2ZfZ2V0X21hY19hZGRyZXNzKG5wKTsKIAlpZiAobWFjX2FkZHIpCi0JCW1lbWNweShkZXYtPmRldl9hZGRyLCBtYWNfYWRkciwgTUFDX0FERFJfTEVOKTsKKwkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIG1hY19hZGRyLCBFVEhfQUxFTik7CiAKIAlpZiAobW9kZWwgJiYgIXN0cmNhc2VjbXAobW9kZWwsICJUU0VDIikpCiAJCXByaXYtPmRldmljZV9mbGFncyA9CkBAIC0yMzA2LDcgKzIzMDYsNyBAQAogfQogCiAvKiBFbmFibGVzIGFuZCBkaXNhYmxlcyBWTEFOIGluc2VydGlvbi9leHRyYWN0aW9uICovCi12b2lkIGdmYXJfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3ZvaWQgZ2Zhcl92bGFuX21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IGdmYXJfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGdmYXIgX19pb21lbSAqcmVncyA9IE5VTEw7CkBAIC0zMTE0LDcgKzMxMTQsNyBAQAogc3RhdGljIHZvaWQgZ2Zhcl9jbGVhcl9leGFjdF9tYXRjaChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWludCBpZHg7Ci0Jc3RhdGljIGNvbnN0IHU4IHplcm9fYXJyW01BQ19BRERSX0xFTl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07CisJc3RhdGljIGNvbnN0IHU4IHplcm9fYXJyW0VUSF9BTEVOXSA9IHswLCAwLCAwLCAwLCAwLCAwfTsKIAogCWZvcihpZHggPSAxO2lkeCA8IEdGQVJfRU1fTlVNICsgMTtpZHgrKykKIAkJZ2Zhcl9zZXRfbWFjX2Zvcl9hZGRyKGRldiwgaWR4LCB6ZXJvX2Fycik7CkBAIC0zMTM3LDcgKzMxMzcsNyBAQAogewogCXUzMiB0ZW1wdmFsOwogCXN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiByZXN1bHQgPSBldGhlcl9jcmMoTUFDX0FERFJfTEVOLCBhZGRyKTsKKwl1MzIgcmVzdWx0ID0gZXRoZXJfY3JjKEVUSF9BTEVOLCBhZGRyKTsKIAlpbnQgd2lkdGggPSBwcml2LT5oYXNoX3dpZHRoOwogCXU4IHdoaWNoYml0ID0gKHJlc3VsdCA+PiAoMzIgLSB3aWR0aCkpICYgMHgxZjsKIAl1OCB3aGljaHJlZyA9IHJlc3VsdCA+PiAoMzIgLSB3aWR0aCArIDUpOwpAQCAtMzE1OCw3ICszMTU4LDcgQEAKIAlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZ2ZhciBfX2lvbWVtICpyZWdzID0gcHJpdi0+Z2ZhcmdycFswXS5yZWdzOwogCWludCBpZHg7Ci0JY2hhciB0bXBidWZbTUFDX0FERFJfTEVOXTsKKwljaGFyIHRtcGJ1ZltFVEhfQUxFTl07CiAJdTMyIHRlbXB2YWw7CiAJdTMyIF9faW9tZW0gKm1hY3B0ciA9ICZyZWdzLT5tYWNzdG5hZGRyMTsKIApAQCAtMzE2Niw4ICszMTY2LDggQEAKIAogCS8qIE5vdyBjb3B5IGl0IGludG8gdGhlIG1hYyByZWdpc3RlcnMgYmFja3dhcmRzLCBjdXogKi8KIAkvKiBsaXR0bGUgZW5kaWFuIGlzIHNpbGx5ICovCi0JZm9yIChpZHggPSAwOyBpZHggPCBNQUNfQUREUl9MRU47IGlkeCsrKQotCQl0bXBidWZbTUFDX0FERFJfTEVOIC0gMSAtIGlkeF0gPSBhZGRyW2lkeF07CisJZm9yIChpZHggPSAwOyBpZHggPCBFVEhfQUxFTjsgaWR4KyspCisJCXRtcGJ1ZltFVEhfQUxFTiAtIDEgLSBpZHhdID0gYWRkcltpZHhdOwogCiAJZ2Zhcl93cml0ZShtYWNwdHIsICooKHUzMiAqKSAodG1wYnVmKSkpOwogCkBAIC0zMjgxLDE2ICszMjgxLDQgQEAKIAkucmVtb3ZlID0gZ2Zhcl9yZW1vdmUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBnZmFyX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZnZmFyX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBnZmFyX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZ2Zhcl9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChnZmFyX2luaXQpOwotbW9kdWxlX2V4aXQoZ2Zhcl9leGl0KTsKLQorbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihnZmFyX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXIuaAppbmRleCA5YWE0Mzc3Li5mZTdhYzNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhci5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyLmgKQEAgLTc0LDkgKzc0LDYgQEAKICAqIHdpbGwgYmUgdGhlIG5leHQgaGlnaGVzdCBtdWx0aXBsZSBvZiA1MTIgYnl0ZXMuICovCiAjZGVmaW5lIElOQ1JFTUVOVEFMX0JVRkZFUl9TSVpFIDUxMgogCi0KLSNkZWZpbmUgTUFDX0FERFJfTEVOIDYKLQogI2RlZmluZSBQSFlfSU5JVF9USU1FT1VUIDEwMDAwMAogI2RlZmluZSBHRkFSX1BIWV9DSEFOR0VfVElNRSAyCiAKQEAgLTExNzksOSArMTE3Niw5IEBACiBleHRlcm4gdm9pZCBnZmFyX2NvbmZpZ3VyZV9jb2FsZXNjaW5nKHN0cnVjdCBnZmFyX3ByaXZhdGUgKnByaXYsCiAJCXVuc2lnbmVkIGxvbmcgdHhfbWFzaywgdW5zaWduZWQgbG9uZyByeF9tYXNrKTsKIHZvaWQgZ2Zhcl9pbml0X3N5c2ZzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IGdmYXJfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcyk7CitpbnQgZ2Zhcl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOwogZXh0ZXJuIHZvaWQgZ2Zhcl9jaGVja19yeF9wYXJzZXJfbW9kZShzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2KTsKLWV4dGVybiB2b2lkIGdmYXJfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcyk7CitleHRlcm4gdm9pZCBnZmFyX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyk7CiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgZ2Zhcl9ldGh0b29sX29wczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXJfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXJfZXRodG9vbC5jCmluZGV4IDIxMjczNmIuLjVhM2IyZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvZ2lhbmZhcl9ldGh0b29sLmMKQEAgLTUxOSwxMiArNTE5LDEyIEBACiAJcmV0dXJuIGVycjsKIH0KIAotaW50IGdmYXJfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK2ludCBnZmFyX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgZ2Zhcl9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnIgPSAwLCBpID0gMDsKLQl1MzIgY2hhbmdlZCA9IGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdCBjaGFuZ2VkID0gZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOwogCiAJaWYgKGNoYW5nZWQgJiAoTkVUSUZfRl9IV19WTEFOX1RYfE5FVElGX0ZfSFdfVkxBTl9SWCkpCiAJCWdmYXJfdmxhbl9tb2RlKGRldiwgZmVhdHVyZXMpOwpAQCAtMTQxMCwxMCArMTQxMCw5IEBACiAKIAkvKiBXZSBuZWVkIGEgY29weSBvZiB0aGUgZmlsZXIgdGFibGUgYmVjYXVzZQogCSAqIHdlIHdhbnQgdG8gY2hhbmdlIGl0cyBvcmRlciAqLwotCXRlbXBfdGFibGUgPSBrbWFsbG9jKHNpemVvZigqdGVtcF90YWJsZSksIEdGUF9LRVJORUwpOworCXRlbXBfdGFibGUgPSBrbWVtZHVwKHRhYiwgc2l6ZW9mKCp0ZW1wX3RhYmxlKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKHRlbXBfdGFibGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JbWVtY3B5KHRlbXBfdGFibGUsIHRhYiwgc2l6ZW9mKCp0ZW1wX3RhYmxlKSk7CiAKIAltYXNrX3RhYmxlID0ga2NhbGxvYyhNQVhfRklMRVJfQ0FDSEVfSURYIC8gMiArIDEsCiAJCQlzaXplb2Yoc3RydWN0IGdmYXJfbWFza19lbnRyeSksIEdGUF9LRVJORUwpOwpAQCAtMTY5Myw4ICsxNjkyLDkgQEAKIAkJcmV0ID0gZ2Zhcl9zZXRfaGFzaF9vcHRzKHByaXYsIGNtZCk7CiAJCWJyZWFrOwogCWNhc2UgRVRIVE9PTF9TUlhDTFNSTElOUzoKLQkJaWYgKGNtZC0+ZnMucmluZ19jb29raWUgIT0gUlhfQ0xTX0ZMT1dfRElTQyAmJgotCQkJY21kLT5mcy5yaW5nX2Nvb2tpZSA+PSBwcml2LT5udW1fcnhfcXVldWVzKSB7CisJCWlmICgoY21kLT5mcy5yaW5nX2Nvb2tpZSAhPSBSWF9DTFNfRkxPV19ESVNDICYmCisJCSAgICAgY21kLT5mcy5yaW5nX2Nvb2tpZSA+PSBwcml2LT5udW1fcnhfcXVldWVzKSB8fAorCQkgICAgY21kLT5mcy5sb2NhdGlvbiA+PSBNQVhfRklMRVJfSURYKSB7CiAJCQlyZXQgPSAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS9naWFuZmFyX3B0cC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXJfcHRwLmMKaW5kZXggZjY3YjhhZS4uODNlMGVkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXJfcHRwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnJlZXNjYWxlL2dpYW5mYXJfcHRwLmMKQEAgLTU2MiwyMSArNTYyLDcgQEAKIAkucmVtb3ZlICAgICAgPSBnaWFuZmFyX3B0cF9yZW1vdmUsCiB9OwogCi0vKiBtb2R1bGUgb3BlcmF0aW9ucyAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBwdHBfZ2lhbmZhcl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZ2lhbmZhcl9wdHBfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQocHRwX2dpYW5mYXJfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwdHBfZ2lhbmZhcl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmdpYW5mYXJfcHRwX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9leGl0KHB0cF9naWFuZmFyX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihnaWFuZmFyX3B0cF9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJSaWNoYXJkIENvY2hyYW4gPHJpY2hhcmQuY29jaHJhbkBvbWljcm9uLmF0PiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJQVFAgY2xvY2sgdXNpbmcgdGhlIGVUU0VDIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jCmluZGV4IGI1ZGMwMjcuLmJhMmRjMDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5jCkBAIC00NDMsNyArNDQzLDcgQEAKIAogc3RhdGljIGlubGluZSBpbnQgY29tcGFyZV9hZGRyKHU4ICoqYWRkcjEsIHU4ICoqYWRkcjIpCiB7Ci0JcmV0dXJuIG1lbWNtcChhZGRyMSwgYWRkcjIsIEVORVRfTlVNX09DVEVUU19QRVJfQUREUkVTUyk7CisJcmV0dXJuIG1lbWNtcChhZGRyMSwgYWRkcjIsIEVUSF9BTEVOKTsKIH0KIAogI2lmZGVmIERFQlVHCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mcmVlc2NhbGUvdWNjX2dldGguaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5oCmluZGV4IGQxMmZjYWQuLjJlMzk1YTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ZyZWVzY2FsZS91Y2NfZ2V0aC5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KIAogI2luY2x1ZGUgPGFzbS9pbW1hcF9xZS5oPgogI2luY2x1ZGUgPGFzbS9xZS5oPgpAQCAtODgxLDcgKzg4Miw2IEBACiAjZGVmaW5lIFRYX1JJTkdfTU9EX01BU0soc2l6ZSkgICAgICAgICAgICAgICAgICAoc2l6ZS0xKQogI2RlZmluZSBSWF9SSU5HX01PRF9NQVNLKHNpemUpICAgICAgICAgICAgICAgICAgKHNpemUtMSkKIAotI2RlZmluZSBFTkVUX05VTV9PQ1RFVFNfUEVSX0FERFJFU1MgICAgICAgICAgICAgNgogI2RlZmluZSBFTkVUX0dST1VQX0FERFIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMQkvKiBHcm91cCBhZGRyZXNzIG1hc2sKIAkJCQkJCQkgICBmb3IgZXRoZXJuZXQKIAkJCQkJCQkgICBhZGRyZXNzZXMgKi8KQEAgLTEwNTEsNyArMTA1MSw3IEBACiAKIC8qIFVDQyBHRVRIIDgyeHggRXRoZXJuZXQgQWRkcmVzcyBDb250YWluZXIgKi8KIHN0cnVjdCBlbmV0X2FkZHJfY29udGFpbmVyIHsKLQl1OCBhZGRyZXNzW0VORVRfTlVNX09DVEVUU19QRVJfQUREUkVTU107CS8qIGV0aGVybmV0IGFkZHJlc3MgKi8KKwl1OCBhZGRyZXNzW0VUSF9BTEVOXTsJLyogZXRoZXJuZXQgYWRkcmVzcyAqLwogCWVudW0gdWNjX2dldGhfZW5ldF9hZGRyZXNzX3JlY29nbml0aW9uX2xvY2F0aW9uIGxvY2F0aW9uOwkvKiBsb2NhdGlvbiBpbgogCQkJCQkJCQkgICA4Mnh4IGFkZHJlc3MKIAkJCQkJCQkJICAgcmVjb2duaXRpb24KQEAgLTExOTQsNyArMTE5NCw3IEBACiAJdTE2IGNwdWNvdW50W05VTV9UWF9RVUVVRVNdOwogCXUxNiBfX2lvbWVtICpwX2NwdWNvdW50W05VTV9UWF9RVUVVRVNdOwogCWludCBpbmRBZGRyUmVnVXNlZFtOVU1fT0ZfUEFERFJTXTsKLQl1OCBwYWRkcltOVU1fT0ZfUEFERFJTXVtFTkVUX05VTV9PQ1RFVFNfUEVSX0FERFJFU1NdOwkvKiBldGhlcm5ldCBhZGRyZXNzICovCisJdTggcGFkZHJbTlVNX09GX1BBRERSU11bRVRIX0FMRU5dOwkvKiBldGhlcm5ldCBhZGRyZXNzICovCiAJdTggbnVtR3JvdXBBZGRySW5IYXNoOwogCXU4IG51bUluZEFkZHJJbkhhc2g7CiAJdTggbnVtSW5kQWRkckluUmVnOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvZnVqaXRzdS9mbXZqMTh4X2NzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mdWppdHN1L2ZtdmoxOHhfY3MuYwppbmRleCAxNTQxNjc1Li5lZTg0YjQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9mdWppdHN1L2ZtdmoxOHhfY3MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9mdWppdHN1L2ZtdmoxOHhfY3MuYwpAQCAtMTA1OCw5ICsxMDU4LDEwIEBACiBzdGF0aWMgdm9pZCBuZXRkZXZfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJQQ01DSUEgMHglbHgiLCBkZXYtPmJhc2VfYWRkcik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzbnByaW50ZihpbmZvLT5idXNfaW5mbywgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSwKKwkJIlBDTUNJQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBuZXRkZXZfZXRodG9vbF9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvZWVwcm8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2k4MjV4eC9lZXByby5jCmluZGV4IDA2N2M0NjAuLjExNGNkYTc3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvZWVwcm8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pODI1eHgvZWVwcm8uYwpAQCAtMTcyNiw5ICsxNzI2LDEwIEBACiBzdGF0aWMgdm9pZCBlZXByb19ldGh0b29sX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCXN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCiB7Ci0Jc3RyY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShkcnZpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7Ci0Jc3ByaW50ZihkcnZpbmZvLT5idXNfaW5mbywgIklTQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKKwlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihkcnZpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOworCXNucHJpbnRmKGRydmluZm8tPmJ1c19pbmZvLCBzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pLAorCQkiSVNBIDB4JWx4IiwgZGV2LT5iYXNlX2FkZHIpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGVlcHJvX2V0aHRvb2xfb3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VoZWEvZWhlYS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VoZWEvZWhlYS5oCmluZGV4IDQxMGQ2YTEuLjY2NTAwNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9laGVhL2VoZWEuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZWhlYS9laGVhLmgKQEAgLTYxLDkgKzYxLDkgQEAKICNpZmRlZiBFSEVBX1NNQUxMX1FVRVVFUwogI2RlZmluZSBFSEVBX01BWF9DUUVfQ09VTlQgICAgICAxMDIzCiAjZGVmaW5lIEVIRUFfREVGX0VOVFJJRVNfU1EgICAgIDEwMjMKLSNkZWZpbmUgRUhFQV9ERUZfRU5UUklFU19SUTEgICAgNDA5NQorI2RlZmluZSBFSEVBX0RFRl9FTlRSSUVTX1JRMSAgICAxMDIzCiAjZGVmaW5lIEVIRUFfREVGX0VOVFJJRVNfUlEyICAgIDEwMjMKLSNkZWZpbmUgRUhFQV9ERUZfRU5UUklFU19SUTMgICAgMTAyMworI2RlZmluZSBFSEVBX0RFRl9FTlRSSUVTX1JRMyAgICA1MTEKICNlbHNlCiAjZGVmaW5lIEVIRUFfTUFYX0NRRV9DT1VOVCAgICAgIDQwODAKICNkZWZpbmUgRUhFQV9ERUZfRU5UUklFU19TUSAgICAgNDA4MApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VoZWEvZWhlYV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZWhlYS9laGVhX21haW4uYwppbmRleCAzN2I3MGY3Li4zNTU0NDE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZWhlYS9laGVhX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZWhlYS9laGVhX21haW4uYwpAQCAtMzcxLDcgKzM3MSw4IEBACiBvdXRfaGVycjoKIAlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpY2IyKTsKIHJlc2NoZWQ6Ci0Jc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwb3J0LT5zdGF0c193b3JrLCBtc2Vjc190b19qaWZmaWVzKDEwMDApKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnBvcnQtPnN0YXRzX3dvcmssCisJCQkgICAgICByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKG1zZWNzX3RvX2ppZmZpZXMoMTAwMCkpKTsKIH0KIAogc3RhdGljIHZvaWQgZWhlYV9yZWZpbGxfcnExKHN0cnVjdCBlaGVhX3BvcnRfcmVzICpwciwgaW50IGluZGV4LCBpbnQgbnJfb2Zfd3FlcykKQEAgLTIxMTMsMTcgKzIxMTQsMTkgQEAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwogfQogCi1zdGF0aWMgdm9pZCBlaGVhX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCitzdGF0aWMgaW50IGVoZWFfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgZWhlYV9wb3J0ICpwb3J0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgZWhlYV9hZGFwdGVyICphZGFwdGVyID0gcG9ydC0+YWRhcHRlcjsKIAlzdHJ1Y3QgaGNwX2VoZWFfcG9ydF9jYjEgKmNiMTsKIAlpbnQgaW5kZXg7CiAJdTY0IGhyZXQ7CisJaW50IGVyciA9IDA7CiAKIAljYjEgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKIAlpZiAoIWNiMSkgewogCQlwcl9lcnIoIm5vIG1lbSBmb3IgY2IxXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0yMTMxLDYgKzIxMzQsNyBAQAogCQkJCSAgICAgIEhfUE9SVF9DQjEsIEhfUE9SVF9DQjFfQUxMLCBjYjEpOwogCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewogCQlwcl9lcnIoInF1ZXJ5X2VoZWFfcG9ydCBmYWlsZWRcbiIpOworCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTIxMzksMjQgKzIxNDMsMjggQEAKIAogCWhyZXQgPSBlaGVhX2hfbW9kaWZ5X2VoZWFfcG9ydChhZGFwdGVyLT5oYW5kbGUsIHBvcnQtPmxvZ2ljYWxfcG9ydF9pZCwKIAkJCQkgICAgICAgSF9QT1JUX0NCMSwgSF9QT1JUX0NCMV9BTEwsIGNiMSk7Ci0JaWYgKGhyZXQgIT0gSF9TVUNDRVNTKQorCWlmIChocmV0ICE9IEhfU1VDQ0VTUykgewogCQlwcl9lcnIoIm1vZGlmeV9laGVhX3BvcnQgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CiBvdXQ6CiAJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWNiMSk7Ci0JcmV0dXJuOworCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkIGVoZWFfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCitzdGF0aWMgaW50IGVoZWFfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CiAJc3RydWN0IGVoZWFfcG9ydCAqcG9ydCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGVoZWFfYWRhcHRlciAqYWRhcHRlciA9IHBvcnQtPmFkYXB0ZXI7CiAJc3RydWN0IGhjcF9laGVhX3BvcnRfY2IxICpjYjE7CiAJaW50IGluZGV4OwogCXU2NCBocmV0OworCWludCBlcnIgPSAwOwogCiAJY2IxID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYjEpIHsKIAkJcHJfZXJyKCJubyBtZW0gZm9yIGNiMVxuIik7CisJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjE2NCw2ICsyMTcyLDcgQEAKIAkJCQkgICAgICBIX1BPUlRfQ0IxLCBIX1BPUlRfQ0IxX0FMTCwgY2IxKTsKIAlpZiAoaHJldCAhPSBIX1NVQ0NFU1MpIHsKIAkJcHJfZXJyKCJxdWVyeV9laGVhX3BvcnQgZmFpbGVkXG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0yMTcyLDEwICsyMTgxLDEzIEBACiAKIAlocmV0ID0gZWhlYV9oX21vZGlmeV9laGVhX3BvcnQoYWRhcHRlci0+aGFuZGxlLCBwb3J0LT5sb2dpY2FsX3BvcnRfaWQsCiAJCQkJICAgICAgIEhfUE9SVF9DQjEsIEhfUE9SVF9DQjFfQUxMLCBjYjEpOwotCWlmIChocmV0ICE9IEhfU1VDQ0VTUykKKwlpZiAoaHJldCAhPSBIX1NVQ0NFU1MpIHsKIAkJcHJfZXJyKCJtb2RpZnlfZWhlYV9wb3J0IGZhaWxlZFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJfQogb3V0OgogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyljYjEpOworCXJldHVybiBlcnI7CiB9CiAKIGludCBlaGVhX2FjdGl2YXRlX3FwKHN0cnVjdCBlaGVhX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBlaGVhX3FwICpxcCkKQEAgLTI0MzQsNyArMjQ0Niw4IEBACiAJfQogCiAJbXV0ZXhfdW5sb2NrKCZwb3J0LT5wb3J0X2xvY2spOwotCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcG9ydC0+c3RhdHNfd29yaywgbXNlY3NfdG9famlmZmllcygxMDAwKSk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwb3J0LT5zdGF0c193b3JrLAorCQkJICAgICAgcm91bmRfamlmZmllc19yZWxhdGl2ZShtc2Vjc190b19qaWZmaWVzKDEwMDApKSk7CiAKIAlyZXR1cm4gcmV0OwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvY29yZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2VtYWMvY29yZS5jCmluZGV4IGVkNzliMmQuLjJhYmNlOTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9lbWFjL2NvcmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vZW1hYy9jb3JlLmMKQEAgLTI5MjQsNiArMjkyNCw5IEBACiAJaWYgKGVtYWNfaGFzX2ZlYXR1cmUoZGV2LCBFTUFDX0ZUUl9IQVNfWk1JSSkpCiAJCXptaWlfZGV0YWNoKGRldi0+em1paV9kZXYsIGRldi0+em1paV9wb3J0KTsKIAorCWJ1c3lfcGh5X21hcCAmPSB+KDEgPDwgZGV2LT5waHkuYWRkcmVzcyk7CisJREJHKGRldiwgImJ1c3lfcGh5X21hcCBub3cgJSN4IiBOTCwgYnVzeV9waHlfbWFwKTsKKwogCW1hbF91bnJlZ2lzdGVyX2NvbW1hYyhkZXYtPm1hbCwgJmRldi0+Y29tbWFjKTsKIAllbWFjX3B1dF9kZXBzKGRldik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaWJtdmV0aC5jCmluZGV4IGIxY2Q0MWIuLmU4NzczNzEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pYm12ZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2libXZldGguYwpAQCAtNzM1LDcgKzczNSw4IEBACiAJCXNpemVvZihpbmZvLT52ZXJzaW9uKSAtIDEpOwogfQogCi1zdGF0aWMgdTMyIGlibXZldGhfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBpYm12ZXRoX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCS8qCiAJICogU2luY2UgdGhlIGlibXZldGggZmlybXdhcmUgaW50ZXJmYWNlIGRvZXMgbm90IGhhdmUgdGhlCkBAIC04MzgsNyArODM5LDggQEAKIAlyZXR1cm4gcmMxID8gcmMxIDogcmMyOwogfQogCi1zdGF0aWMgaW50IGlibXZldGhfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgaWJtdmV0aF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgaWJtdmV0aF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgcnhfY3N1bSA9ICEhKGZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2lzZXJpZXNfdmV0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWJtL2lzZXJpZXNfdmV0aC5jCmluZGV4IDQzMjY2ODEuLmFjYzMxYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2libS9pc2VyaWVzX3ZldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pYm0vaXNlcmllc192ZXRoLmMKQEAgLTE0MjEsNyArMTQyMSw3IEBACiAKIAkJLyogRklYTUU6IGRvIHdlIG5lZWQgdGhpcz8gKi8KIAkJbWVtc2V0KGxvY2FsX2xpc3QsIDAsIHNpemVvZihsb2NhbF9saXN0KSk7Ci0JCW1lbXNldChyZW1vdGVfbGlzdCwgMCwgc2l6ZW9mKFZFVEhfTUFYX0ZSQU1FU19QRVJfTVNHKSk7CisJCW1lbXNldChyZW1vdGVfbGlzdCwgMCwgc2l6ZW9mKHJlbW90ZV9saXN0KSk7CiAKIAkJLyogYSAwIGFkZHJlc3MgbWFya3MgdGhlIGVuZCBvZiB0aGUgdmFsaWQgZW50cmllcyAqLwogCQlpZiAoc2VuZGRhdGEtPmFkZHJbc3RhcnRjaHVua10gPT0gMCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ljcGx1cy9pcGcuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ljcGx1cy9pcGcuYwppbmRleCA4ZmQ4MGEwLi4wNzU0NTFkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pY3BsdXMvaXBnLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaWNwbHVzL2lwZy5jCkBAIC0zNzEsMTYgKzM3MSw5IEBACiAJfQogCiAJLyogVGhlIGxhc3QgY3ljbGUgaXMgYSB0cmktc3RhdGUsIHNvIHJlYWQgZnJvbSB0aGUgUEhZLiAqLwotCWZvciAoaiA9IDc7IGogPCA4OyBqKyspIHsKLQkJZm9yIChpID0gMDsgaSA8IHBbal0ubGVuOyBpKyspIHsKLQkJCWlwZ193cml0ZV9waHlfY3RsKGlvYWRkciwgSVBHX1BDX01HTVRDTEtfTE8gfCBwb2xhcml0eSk7Ci0KLQkJCXBbal0uZmllbGQgfD0gKChpcGdfcjgoUEhZX0NUUkwpICYKLQkJCQlJUEdfUENfTUdNVERBVEEpID4+IDEpIDw8IChwW2pdLmxlbiAtIDEgLSBpKTsKLQotCQkJaXBnX3dyaXRlX3BoeV9jdGwoaW9hZGRyLCBJUEdfUENfTUdNVENMS19ISSB8IHBvbGFyaXR5KTsKLQkJfQotCX0KKwlpcGdfd3JpdGVfcGh5X2N0bChpb2FkZHIsIElQR19QQ19NR01UQ0xLX0xPIHwgcG9sYXJpdHkpOworCWlwZ19yOChQSFlfQ1RSTCk7CisJaXBnX3dyaXRlX3BoeV9jdGwoaW9hZGRyLCBJUEdfUENfTUdNVENMS19ISSB8IHBvbGFyaXR5KTsKIH0KIAogc3RhdGljIHZvaWQgaXBnX3NldF9sZWRfbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMC5jCmluZGV4IDVhMmZkZjcuLjk0MzYzOTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwLmMKQEAgLTIzNzYsMTAgKzIzNzYsMTAgQEAKIAlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCXN0cnVjdCBuaWMgKm5pYyA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7Ci0Jc3RyY3B5KGluZm8tPmZ3X3ZlcnNpb24sICJOL0EiKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5pYy0+cGRldikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobmljLT5wZGV2KSwKKwkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKICNkZWZpbmUgRTEwMF9QSFlfUkVHUyAweDFDCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMC9lMTAwMF9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMC9lMTAwMF9ldGh0b29sLmMKaW5kZXggMmIyMjNhYy4uMzEwM2YwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDAvZTEwMDBfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwL2UxMDAwX2V0aHRvb2wuYwpAQCAtNTE1LDE0ICs1MTUsMTQgQEAKIAkJCSAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWNoYXIgZmlybXdhcmVfdmVyc2lvblszMl07CiAKLQlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIGUxMDAwX2RyaXZlcl9uYW1lLCAzMik7Ci0Jc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBlMTAwMF9kcml2ZXJfdmVyc2lvbiwgMzIpOworCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCAgZTEwMDBfZHJpdmVyX25hbWUsCisJCXNpemVvZihkcnZpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIGUxMDAwX2RyaXZlcl92ZXJzaW9uLAorCQlzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOwogCi0Jc3ByaW50ZihmaXJtd2FyZV92ZXJzaW9uLCAiTi9BIik7Ci0Jc3RybmNweShkcnZpbmZvLT5md192ZXJzaW9uLCBmaXJtd2FyZV92ZXJzaW9uLCAzMik7Ci0Jc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksIDMyKTsKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKKwkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CiAJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSBlMTAwMF9nZXRfcmVnc19sZW4obmV0ZGV2KTsKIAlkcnZpbmZvLT5lZWR1bXBfbGVuID0gZTEwMDBfZ2V0X2VlcHJvbV9sZW4obmV0ZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwL2UxMDAwX2h3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMC9lMTAwMF9ody5oCmluZGV4IDVjOWE4NDAuLmY2YzRkN2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwL2UxMDAwX2h3LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDAvZTEwMDBfaHcuaApAQCAtNDQ4LDcgKzQ0OCw2IEBACiAjZGVmaW5lIEUxMDAwX0RFVl9JRF9JTlRFTF9DRTQxMDBfR0JFICAgIDB4MkU2RQogCiAjZGVmaW5lIE5PREVfQUREUkVTU19TSVpFIDYKLSNkZWZpbmUgRVRIX0xFTkdUSF9PRl9BRERSRVNTIDYKIAogLyogTUFDIGRlY29kZSBzaXplIGlzIDEyOEsgLSBUaGlzIGlzIHRoZSBzaXplIG9mIEJBUjAgKi8KICNkZWZpbmUgTUFDX0RFQ09ERV9TSVpFICgxMjggKiAxMDI0KQpAQCAtODEzLDggKzgxMiw3IEBACiAjZGVmaW5lIEUxMDAwX0ZMQSAgICAgIDB4MDAwMUMJLyogRmxhc2ggQWNjZXNzIC0gUlcgKi8KICNkZWZpbmUgRTEwMDBfTURJQyAgICAgMHgwMDAyMAkvKiBNREkgQ29udHJvbCAtIFJXICovCiAKLWV4dGVybiB2b2lkIF9faW9tZW0gKmNlNDEwMF9nYmVfbWRpb19iYXNlX3ZpcnQ7Ci0jZGVmaW5lIElOVEVMX0NFX0dCRV9NRElPX1JDT01QX0JBU0UgICAgKGNlNDEwMF9nYmVfbWRpb19iYXNlX3ZpcnQpCisjZGVmaW5lIElOVEVMX0NFX0dCRV9NRElPX1JDT01QX0JBU0UgICAgKGh3LT5jZTQxMDBfZ2JlX21kaW9fYmFzZV92aXJ0KQogI2RlZmluZSBFMTAwMF9NRElPX1NUUyAgKElOVEVMX0NFX0dCRV9NRElPX1JDT01QX0JBU0UgKyAwKQogI2RlZmluZSBFMTAwMF9NRElPX0NNRCAgKElOVEVMX0NFX0dCRV9NRElPX1JDT01QX0JBU0UgKyA0KQogI2RlZmluZSBFMTAwMF9NRElPX0RSViAgKElOVEVMX0NFX0dCRV9NRElPX1JDT01QX0JBU0UgKyA4KQpAQCAtMTM0NCw2ICsxMzQyLDcgQEAKIHN0cnVjdCBlMTAwMF9odyB7CiAJdTggX19pb21lbSAqaHdfYWRkcjsKIAl1OCBfX2lvbWVtICpmbGFzaF9hZGRyZXNzOworCXZvaWQgX19pb21lbSAqY2U0MTAwX2diZV9tZGlvX2Jhc2VfdmlydDsKIAllMTAwMF9tYWNfdHlwZSBtYWNfdHlwZTsKIAllMTAwMF9waHlfdHlwZSBwaHlfdHlwZTsKIAl1MzIgcGh5X2luaXRfc2NyaXB0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDAvZTEwMDBfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDAvZTEwMDBfbWFpbi5jCmluZGV4IGNmNDgwYjUuLjY2OWNhMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwL2UxMDAwX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMC9lMTAwMF9tYWluLmMKQEAgLTMzLDExICszMyw2IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgogCi0vKiBJbnRlbCBNZWRpYSBTT0MgR2JFIE1ESU8gcGh5c2ljYWwgYmFzZSBhZGRyZXNzICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjZTQxMDBfZ2JlX21kaW9fYmFzZV9waHk7Ci0vKiBJbnRlbCBNZWRpYSBTT0MgR2JFIE1ESU8gdmlydHVhbCBiYXNlIGFkZHJlc3MgKi8KLXZvaWQgX19pb21lbSAqY2U0MTAwX2diZV9tZGlvX2Jhc2VfdmlydDsKLQogY2hhciBlMTAwMF9kcml2ZXJfbmFtZVtdID0gImUxMDAwIjsKIHN0YXRpYyBjaGFyIGUxMDAwX2RyaXZlcl9zdHJpbmdbXSA9ICJJbnRlbChSKSBQUk8vMTAwMCBOZXR3b3JrIERyaXZlciI7CiAjZGVmaW5lIERSVl9WRVJTSU9OICI3LjMuMjEtazgtTkFQSSIKQEAgLTE2Nyw5ICsxNjIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogCiBzdGF0aWMgYm9vbCBlMTAwMF92bGFuX3VzZWQoc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwotc3RhdGljIHZvaWQgZTEwMDBfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcyk7Ci1zdGF0aWMgdm9pZCBlMTAwMF92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCk7Ci1zdGF0aWMgdm9pZCBlMTAwMF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpOworc3RhdGljIHZvaWQgZTEwMDBfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOworc3RhdGljIGludCBlMTAwMF92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCk7CitzdGF0aWMgaW50IGUxMDAwX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCk7CiBzdGF0aWMgdm9pZCBlMTAwMF9yZXN0b3JlX3ZsYW4oc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC04MDYsNyArODAyLDggQEAKIAl9CiB9CiAKLXN0YXRpYyB1MzIgZTEwMDBfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBlMTAwMF9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAkvKgogCSAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHJ4L3R4IHZsYW4gYWNjZWwKQEAgLTgyMCwxMCArODE3LDExIEBACiAJcmV0dXJuIGZlYXR1cmVzOwogfQogCi1zdGF0aWMgaW50IGUxMDAwX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgaW50IGUxMDAwX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MzIgY2hhbmdlZCA9IGZlYXR1cmVzIF4gbmV0ZGV2LT5mZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdCBjaGFuZ2VkID0gZmVhdHVyZXMgXiBuZXRkZXYtPmZlYXR1cmVzOwogCiAJaWYgKGNoYW5nZWQgJiBORVRJRl9GX0hXX1ZMQU5fUlgpCiAJCWUxMDAwX3ZsYW5fbW9kZShuZXRkZXYsIGZlYXR1cmVzKTsKQEAgLTEwNTEsMTEgKzEwNDksMTEgQEAKIAogCWVyciA9IC1FSU87CiAJaWYgKGh3LT5tYWNfdHlwZSA9PSBlMTAwMF9jZTQxMDApIHsKLQkJY2U0MTAwX2diZV9tZGlvX2Jhc2VfcGh5ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEJBUl8xKTsKLQkJY2U0MTAwX2diZV9tZGlvX2Jhc2VfdmlydCA9IGlvcmVtYXAoY2U0MTAwX2diZV9tZGlvX2Jhc2VfcGh5LAorCQlody0+Y2U0MTAwX2diZV9tZGlvX2Jhc2VfdmlydCA9CisJCQkJCWlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIEJBUl8xKSwKIAkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIEJBUl8xKSk7CiAKLQkJaWYgKCFjZTQxMDBfZ2JlX21kaW9fYmFzZV92aXJ0KQorCQlpZiAoIWh3LT5jZTQxMDBfZ2JlX21kaW9fYmFzZV92aXJ0KQogCQkJZ290byBlcnJfbWRpb19pb3JlbWFwOwogCX0KIApAQCAtMTE4Miw3ICsxMTgwLDcgQEAKIAkJaWYgKGdsb2JhbF9xdWFkX3BvcnRfYSAhPSAwKQogCQkJYWRhcHRlci0+ZWVwcm9tX3dvbCA9IDA7CiAJCWVsc2UKLQkJCWFkYXB0ZXItPnF1YWRfcG9ydF9hID0gMTsKKwkJCWFkYXB0ZXItPnF1YWRfcG9ydF9hID0gdHJ1ZTsKIAkJLyogUmVzZXQgZm9yIG11bHRpcGxlIHF1YWQgcG9ydCBhZGFwdGVycyAqLwogCQlpZiAoKytnbG9iYWxfcXVhZF9wb3J0X2EgPT0gNCkKIAkJCWdsb2JhbF9xdWFkX3BvcnRfYSA9IDA7CkBAIC0xMjQ2LDcgKzEyNDQsNyBAQAogZXJyX2RtYToKIGVycl9zd19pbml0OgogZXJyX21kaW9faW9yZW1hcDoKLQlpb3VubWFwKGNlNDEwMF9nYmVfbWRpb19iYXNlX3ZpcnQpOworCWlvdW5tYXAoaHctPmNlNDEwMF9nYmVfbWRpb19iYXNlX3ZpcnQpOwogCWlvdW5tYXAoaHctPmh3X2FkZHIpOwogZXJyX2lvcmVtYXA6CiAJZnJlZV9uZXRkZXYobmV0ZGV2KTsKQEAgLTEyODMsNiArMTI4MSw4IEBACiAJa2ZyZWUoYWRhcHRlci0+dHhfcmluZyk7CiAJa2ZyZWUoYWRhcHRlci0+cnhfcmluZyk7CiAKKwlpZiAoaHctPm1hY190eXBlID09IGUxMDAwX2NlNDEwMCkKKwkJaW91bm1hcChody0+Y2U0MTAwX2diZV9tZGlvX2Jhc2VfdmlydCk7CiAJaW91bm1hcChody0+aHdfYWRkcik7CiAJaWYgKGh3LT5mbGFzaF9hZGRyZXNzKQogCQlpb3VubWFwKGh3LT5mbGFzaF9hZGRyZXNzKTsKQEAgLTE2NzYsNyArMTY3Niw3IEBACiAJICogbmVlZCB0aGlzIHRvIGFwcGx5IGEgd29ya2Fyb3VuZCBsYXRlciBpbiB0aGUgc2VuZCBwYXRoLiAqLwogCWlmIChody0+bWFjX3R5cGUgPT0gZTEwMDBfODI1NDQgJiYKIAkgICAgaHctPmJ1c190eXBlID09IGUxMDAwX2J1c190eXBlX3BjaXgpCi0JCWFkYXB0ZXItPnBjaXhfODI1NDQgPSAxOworCQlhZGFwdGVyLT5wY2l4XzgyNTQ0ID0gdHJ1ZTsKIAogCWV3MzIoVENUTCwgdGN0bCk7CiAKQEAgLTE5OTksNyArMTk5OSw3IEBACiAKIAl0eF9yaW5nLT5uZXh0X3RvX3VzZSA9IDA7CiAJdHhfcmluZy0+bmV4dF90b19jbGVhbiA9IDA7Ci0JdHhfcmluZy0+bGFzdF90eF90c28gPSAwOworCXR4X3JpbmctPmxhc3RfdHhfdHNvID0gZmFsc2U7CiAKIAl3cml0ZWwoMCwgaHctPmh3X2FkZHIgKyB0eF9yaW5nLT50ZGgpOwogCXdyaXRlbCgwLCBody0+aHdfYWRkciArIHR4X3JpbmctPnRkdCk7CkBAIC0yODQ4LDcgKzI4NDgsNyBAQAogCQkgKiBETUEnZCB0byB0aGUgY29udHJvbGxlciAqLwogCQlpZiAoIXNrYi0+ZGF0YV9sZW4gJiYgdHhfcmluZy0+bGFzdF90eF90c28gJiYKIAkJICAgICFza2JfaXNfZ3NvKHNrYikpIHsKLQkJCXR4X3JpbmctPmxhc3RfdHhfdHNvID0gMDsKKwkJCXR4X3JpbmctPmxhc3RfdHhfdHNvID0gZmFsc2U7CiAJCQlzaXplIC09IDQ7CiAJCX0KIApAQCAtMzIxNiw3ICszMjE2LDcgQEAKIAogCWlmIChsaWtlbHkodHNvKSkgewogCQlpZiAobGlrZWx5KGh3LT5tYWNfdHlwZSAhPSBlMTAwMF84MjU0NCkpCi0JCQl0eF9yaW5nLT5sYXN0X3R4X3RzbyA9IDE7CisJCQl0eF9yaW5nLT5sYXN0X3R4X3RzbyA9IHRydWU7CiAJCXR4X2ZsYWdzIHw9IEUxMDAwX1RYX0ZMQUdTX1RTTzsKIAl9IGVsc2UgaWYgKGxpa2VseShlMTAwMF90eF9jc3VtKGFkYXB0ZXIsIHR4X3JpbmcsIHNrYikpKQogCQl0eF9mbGFncyB8PSBFMTAwMF9UWF9GTEFHU19DU1VNOwpAQCAtNDU3Nyw3ICs0NTc3LDggQEAKIAkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKIH0KIAotc3RhdGljIHZvaWQgZTEwMDBfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyB2b2lkIGUxMDAwX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtNDYwMCw3ICs0NjAxLDcgQEAKIAkJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKIH0KIAotc3RhdGljIHZvaWQgZTEwMDBfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCitzdGF0aWMgaW50IGUxMDAwX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtNDYwOSw3ICs0NjEwLDcgQEAKIAlpZiAoKGh3LT5tbmdfY29va2llLnN0YXR1cyAmCiAJICAgICBFMTAwMF9NTkdfREhDUF9DT09LSUVfU1RBVFVTX1ZMQU5fU1VQUE9SVCkgJiYKIAkgICAgKHZpZCA9PSBhZGFwdGVyLT5tbmdfdmxhbl9pZCkpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAlpZiAoIWUxMDAwX3ZsYW5fdXNlZChhZGFwdGVyKSkKIAkJZTEwMDBfdmxhbl9maWx0ZXJfb25fb2ZmKGFkYXB0ZXIsIHRydWUpOwpAQCAtNDYyMSw5ICs0NjIyLDExIEBACiAJZTEwMDBfd3JpdGVfdmZ0YShodywgaW5kZXgsIHZmdGEpOwogCiAJc2V0X2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucyk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZTEwMDBfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQorc3RhdGljIGludCBlMTAwMF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CkBAIC00NjQ0LDYgKzQ2NDcsOCBAQAogCiAJaWYgKCFlMTAwMF92bGFuX3VzZWQoYWRhcHRlcikpCiAJCWUxMDAwX3ZsYW5fZmlsdGVyX29uX29mZihhZGFwdGVyLCBmYWxzZSk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgZTEwMDBfcmVzdG9yZV92bGFuKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQpAQCAtNDcxNiw4ICs0NzIxLDYgQEAKIAogCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKIAotCW11dGV4X2xvY2soJmFkYXB0ZXItPm11dGV4KTsKLQogCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpIHsKIAkJV0FSTl9PTih0ZXN0X2JpdChfX0UxMDAwX1JFU0VUVElORywgJmFkYXB0ZXItPmZsYWdzKSk7CiAJCWUxMDAwX2Rvd24oYWRhcHRlcik7CkBAIC00NzI1LDEwICs0NzI4LDggQEAKIAogI2lmZGVmIENPTkZJR19QTQogCXJldHZhbCA9IHBjaV9zYXZlX3N0YXRlKHBkZXYpOwotCWlmIChyZXR2YWwpIHsKLQkJbXV0ZXhfdW5sb2NrKCZhZGFwdGVyLT5tdXRleCk7CisJaWYgKHJldHZhbCkKIAkJcmV0dXJuIHJldHZhbDsKLQl9CiAjZW5kaWYKIAogCXN0YXR1cyA9IGVyMzIoU1RBVFVTKTsKQEAgLTQ3ODMsOCArNDc4NCw2IEBACiAJaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkKIAkJZTEwMDBfZnJlZV9pcnEoYWRhcHRlcik7CiAKLQltdXRleF91bmxvY2soJmFkYXB0ZXItPm11dGV4KTsKLQogCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2UxMDAwLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZTEwMDAuaAppbmRleCA5ZmUxOGQxLi5mNDc4YTIyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZTEwMDAuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZTEwMDAuaApAQCAtMzA5LDYgKzMwOSw3IEBACiAJdTMyIHR4ZF9jbWQ7CiAKIAlib29sIGRldGVjdF90eF9odW5nOworCWJvb2wgdHhfaGFuZ19yZWNoZWNrOwogCXU4IHR4X3RpbWVvdXRfZmFjdG9yOwogCiAJdTMyIHR4X2ludF9kZWxheTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvZXRodG9vbC5jCmluZGV4IDY5YzlkMjEuLmZiMmMyOGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL2V0aHRvb2wuYwpAQCAtNTc5LDI2ICs1NzksMjQgQEAKIAkJCSAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWNoYXIgZmlybXdhcmVfdmVyc2lvblszMl07CiAKLQlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIGUxMDAwZV9kcml2ZXJfbmFtZSwKLQkJc2l6ZW9mKGRydmluZm8tPmRyaXZlcikgLSAxKTsKLQlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIGUxMDAwZV9kcml2ZXJfdmVyc2lvbiwKLQkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pIC0gMSk7CisJc3RybGNweShkcnZpbmZvLT5kcml2ZXIsICBlMTAwMGVfZHJpdmVyX25hbWUsCisJCXNpemVvZihkcnZpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIGUxMDAwZV9kcml2ZXJfdmVyc2lvbiwKKwkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKIAogCS8qCiAJICogRUVQUk9NIGltYWdlIHZlcnNpb24gIyBpcyByZXBvcnRlZCBhcyBmaXJtd2FyZSB2ZXJzaW9uICMgZm9yCiAJICogUENJLUUgY29udHJvbGxlcnMKIAkgKi8KLQlzbnByaW50ZihmaXJtd2FyZV92ZXJzaW9uLCBzaXplb2YoZmlybXdhcmVfdmVyc2lvbiksICIlZC4lZC0lZCIsCisJc25wcmludGYoZHJ2aW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGRydmluZm8tPmZ3X3ZlcnNpb24pLAorCQkiJWQuJWQtJWQiLAogCQkoYWRhcHRlci0+ZWVwcm9tX3ZlcnMgJiAweEYwMDApID4+IDEyLAogCQkoYWRhcHRlci0+ZWVwcm9tX3ZlcnMgJiAweDBGRjApID4+IDQsCiAJCShhZGFwdGVyLT5lZXByb21fdmVycyAmIDB4MDAwRikpOwogCi0Jc3RybmNweShkcnZpbmZvLT5md192ZXJzaW9uLCBmaXJtd2FyZV92ZXJzaW9uLAotCQlzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbikgLSAxKTsKLQlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKLQkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSAtIDEpOworCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pKTsKIAlkcnZpbmZvLT5yZWdkdW1wX2xlbiA9IGUxMDAwX2dldF9yZWdzX2xlbihuZXRkZXYpOwogCWRydmluZm8tPmVlZHVtcF9sZW4gPSBlMTAwMF9nZXRfZWVwcm9tX2xlbihuZXRkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL25ldGRldi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvZTEwMDBlL25ldGRldi5jCmluZGV4IGE4NTVkYjEuLjM5MTE0MDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2UxMDAwZS9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9lMTAwMGUvbmV0ZGV2LmMKQEAgLTE2MywxNiArMTYzLDEzIEBACiAJCQlyZWdzW25dID0gX19lcjMyKGh3LCBFMTAwMF9UQVJDKG4pKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJS0xNXMgJTA4eFxuIiwKLQkJICAgICAgIHJlZ2luZm8tPm5hbWUsIF9fZXIzMihodywgcmVnaW5mby0+b2ZzKSk7CisJCXByX2luZm8oIiUtMTVzICUwOHhcbiIsCisJCQlyZWdpbmZvLT5uYW1lLCBfX2VyMzIoaHcsIHJlZ2luZm8tPm9mcykpOwogCQlyZXR1cm47CiAJfQogCiAJc25wcmludGYocm5hbWUsIDE2LCAiJXMlcyIsIHJlZ2luZm8tPm5hbWUsICJbMC0xXSIpOwotCXByaW50ayhLRVJOX0lORk8gIiUtMTVzICIsIHJuYW1lKTsKLQlmb3IgKG4gPSAwOyBuIDwgMjsgbisrKQotCQlwcmludGsoS0VSTl9DT05UICIlMDh4ICIsIHJlZ3Nbbl0pOwotCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJcHJfaW5mbygiJS0xNXMgJTA4eCAlMDh4XG4iLCBybmFtZSwgcmVnc1swXSwgcmVnc1sxXSk7CiB9CiAKIC8qCkBAIC0yMDgsMTYgKzIwNSwxNSBAQAogCS8qIFByaW50IG5ldGRldmljZSBJbmZvICovCiAJaWYgKG5ldGRldikgewogCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiTmV0IGRldmljZSBJbmZvXG4iKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRGV2aWNlIE5hbWUgICAgIHN0YXRlICAgICAgICAgICAgIgotCQkgICAgICAgInRyYW5zX3N0YXJ0ICAgICAgbGFzdF9yeFxuIik7Ci0JCXByaW50ayhLRVJOX0lORk8gIiUtMTVzICUwMTZsWCAlMDE2bFggJTAxNmxYXG4iLAotCQkgICAgICAgbmV0ZGV2LT5uYW1lLCBuZXRkZXYtPnN0YXRlLCBuZXRkZXYtPnRyYW5zX3N0YXJ0LAotCQkgICAgICAgbmV0ZGV2LT5sYXN0X3J4KTsKKwkJcHJfaW5mbygiRGV2aWNlIE5hbWUgICAgIHN0YXRlICAgICAgICAgICAgdHJhbnNfc3RhcnQgICAgICBsYXN0X3J4XG4iKTsKKwkJcHJfaW5mbygiJS0xNXMgJTAxNmxYICUwMTZsWCAlMDE2bFhcbiIsCisJCQluZXRkZXYtPm5hbWUsIG5ldGRldi0+c3RhdGUsIG5ldGRldi0+dHJhbnNfc3RhcnQsCisJCQluZXRkZXYtPmxhc3RfcngpOwogCX0KIAogCS8qIFByaW50IFJlZ2lzdGVycyAqLwogCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJSZWdpc3RlciBEdW1wXG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICIgUmVnaXN0ZXIgTmFtZSAgIFZhbHVlXG4iKTsKKwlwcl9pbmZvKCIgUmVnaXN0ZXIgTmFtZSAgIFZhbHVlXG4iKTsKIAlmb3IgKHJlZ2luZm8gPSAoc3RydWN0IGUxMDAwX3JlZ19pbmZvICopZTEwMDBfcmVnX2luZm9fdGJsOwogCSAgICAgcmVnaW5mby0+bmFtZTsgcmVnaW5mbysrKSB7CiAJCWUxMDAwX3JlZ2R1bXAoaHcsIHJlZ2luZm8pOwpAQCAtMjI4LDE1ICsyMjQsMTQgQEAKIAkJZ290byBleGl0OwogCiAJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIlR4IFJpbmcgU3VtbWFyeVxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUXVldWUgW05UVV0gW05UQ10gW2JpKG50YyktPmRtYSAgXSIKLQkgICAgICAgIiBsZW5nIG50dyB0aW1lc3RhbXBcbiIpOworCXByX2luZm8oIlF1ZXVlIFtOVFVdIFtOVENdIFtiaShudGMpLT5kbWEgIF0gbGVuZyBudHcgdGltZXN0YW1wXG4iKTsKIAlidWZmZXJfaW5mbyA9ICZ0eF9yaW5nLT5idWZmZXJfaW5mb1t0eF9yaW5nLT5uZXh0X3RvX2NsZWFuXTsKLQlwcmludGsoS0VSTl9JTkZPICIgJTVkICU1WCAlNVggJTAxNmxsWCAlMDRYICUzWCAlMDE2bGxYXG4iLAotCSAgICAgICAwLCB0eF9yaW5nLT5uZXh0X3RvX3VzZSwgdHhfcmluZy0+bmV4dF90b19jbGVhbiwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWZmZXJfaW5mby0+ZG1hLAotCSAgICAgICBidWZmZXJfaW5mby0+bGVuZ3RoLAotCSAgICAgICBidWZmZXJfaW5mby0+bmV4dF90b193YXRjaCwKLQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWZmZXJfaW5mby0+dGltZV9zdGFtcCk7CisJcHJfaW5mbygiICU1ZCAlNVggJTVYICUwMTZsbFggJTA0WCAlM1ggJTAxNmxsWFxuIiwKKwkJMCwgdHhfcmluZy0+bmV4dF90b191c2UsIHR4X3JpbmctPm5leHRfdG9fY2xlYW4sCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnVmZmVyX2luZm8tPmRtYSwKKwkJYnVmZmVyX2luZm8tPmxlbmd0aCwKKwkJYnVmZmVyX2luZm8tPm5leHRfdG9fd2F0Y2gsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnVmZmVyX2luZm8tPnRpbWVfc3RhbXApOwogCiAJLyogUHJpbnQgVHggUmluZyAqLwogCWlmICghbmV0aWZfbXNnX3R4X2RvbmUoYWRhcHRlcikpCkBAIC0yNzEsMzcgKzI2NiwzMiBAQAogCSAqICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAJICogICA2MyAgICAgICA0OCA0NyAgICAgNDAgMzkgIDM2IDM1ICAgIDMyIDMxICAgICAyNCAyMyAgMjAgMTkgICAgICAgIDAKIAkgKi8KLQlwcmludGsoS0VSTl9JTkZPICJUbFtkZXNjXSAgICAgW2FkZHJlc3MgNjM6MCAgXSBbU3BlQ3NzU0NtQ3NMZW5dIgotCSAgICAgICAiIFtiaS0+ZG1hICAgICAgIF0gbGVuZyAgbnR3IHRpbWVzdGFtcCAgICAgICAgYmktPnNrYiAiCi0JICAgICAgICI8LS0gTGVnYWN5IGZvcm1hdFxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVGNbZGVzY10gICAgIFtDZSBDb0NzSXBjZUNvU10gW01zc0hsUlNDbTBQbGVuXSIKLQkgICAgICAgIiBbYmktPmRtYSAgICAgICBdIGxlbmcgIG50dyB0aW1lc3RhbXAgICAgICAgIGJpLT5za2IgIgotCSAgICAgICAiPC0tIEV4dCBDb250ZXh0IGZvcm1hdFxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiVGRbZGVzY10gICAgIFthZGRyZXNzIDYzOjAgIF0gW1ZsYVBvUlNDbTFEbGVuXSIKLQkgICAgICAgIiBbYmktPmRtYSAgICAgICBdIGxlbmcgIG50dyB0aW1lc3RhbXAgICAgICAgIGJpLT5za2IgIgotCSAgICAgICAiPC0tIEV4dCBEYXRhIGZvcm1hdFxuIik7CisJcHJfaW5mbygiVGxbZGVzY10gICAgIFthZGRyZXNzIDYzOjAgIF0gW1NwZUNzc1NDbUNzTGVuXSBbYmktPmRtYSAgICAgICBdIGxlbmcgIG50dyB0aW1lc3RhbXAgICAgICAgIGJpLT5za2IgPC0tIExlZ2FjeSBmb3JtYXRcbiIpOworCXByX2luZm8oIlRjW2Rlc2NdICAgICBbQ2UgQ29Dc0lwY2VDb1NdIFtNc3NIbFJTQ20wUGxlbl0gW2JpLT5kbWEgICAgICAgXSBsZW5nICBudHcgdGltZXN0YW1wICAgICAgICBiaS0+c2tiIDwtLSBFeHQgQ29udGV4dCBmb3JtYXRcbiIpOworCXByX2luZm8oIlRkW2Rlc2NdICAgICBbYWRkcmVzcyA2MzowICBdIFtWbGFQb1JTQ20xRGxlbl0gW2JpLT5kbWEgICAgICAgXSBsZW5nICBudHcgdGltZXN0YW1wICAgICAgICBiaS0+c2tiIDwtLSBFeHQgRGF0YSBmb3JtYXRcbiIpOwogCWZvciAoaSA9IDA7IHR4X3JpbmctPmRlc2MgJiYgKGkgPCB0eF9yaW5nLT5jb3VudCk7IGkrKykgeworCQljb25zdCBjaGFyICpuZXh0X2Rlc2M7CiAJCXR4X2Rlc2MgPSBFMTAwMF9UWF9ERVNDKCp0eF9yaW5nLCBpKTsKIAkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+YnVmZmVyX2luZm9baV07CiAJCXUwID0gKHN0cnVjdCBteV91MCAqKXR4X2Rlc2M7Ci0JCXByaW50ayhLRVJOX0lORk8gIlQlY1sweCUwM1hdICAgICUwMTZsbFggJTAxNmxsWCAlMDE2bGxYICIKLQkJICAgICAgICIlMDRYICAlM1ggJTAxNmxsWCAlcCIsCi0JCSAgICAgICAoIShsZTY0X3RvX2NwdSh1MC0+YikgJiAoMSA8PCAyOSkpID8gJ2wnIDoKLQkJCSgobGU2NF90b19jcHUodTAtPmIpICYgKDEgPDwgMjApKSA/ICdkJyA6ICdjJykpLCBpLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MC0+YSksCi0JCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUwLT5iKSwKLQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYnVmZmVyX2luZm8tPmRtYSwKLQkJICAgICAgIGJ1ZmZlcl9pbmZvLT5sZW5ndGgsIGJ1ZmZlcl9pbmZvLT5uZXh0X3RvX3dhdGNoLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWZmZXJfaW5mby0+dGltZV9zdGFtcCwKLQkJICAgICAgIGJ1ZmZlcl9pbmZvLT5za2IpOwogCQlpZiAoaSA9PSB0eF9yaW5nLT5uZXh0X3RvX3VzZSAmJiBpID09IHR4X3JpbmctPm5leHRfdG9fY2xlYW4pCi0JCQlwcmludGsoS0VSTl9DT05UICIgTlRDL1VcbiIpOworCQkJbmV4dF9kZXNjID0gIiBOVEMvVSI7CiAJCWVsc2UgaWYgKGkgPT0gdHhfcmluZy0+bmV4dF90b191c2UpCi0JCQlwcmludGsoS0VSTl9DT05UICIgTlRVXG4iKTsKKwkJCW5leHRfZGVzYyA9ICIgTlRVIjsKIAkJZWxzZSBpZiAoaSA9PSB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuKQotCQkJcHJpbnRrKEtFUk5fQ09OVCAiIE5UQ1xuIik7CisJCQluZXh0X2Rlc2MgPSAiIE5UQyI7CiAJCWVsc2UKLQkJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CisJCQluZXh0X2Rlc2MgPSAiIjsKKwkJcHJfaW5mbygiVCVjWzB4JTAzWF0gICAgJTAxNmxsWCAlMDE2bGxYICUwMTZsbFggJTA0WCAgJTNYICUwMTZsbFggJXAlc1xuIiwKKwkJCSghKGxlNjRfdG9fY3B1KHUwLT5iKSAmICgxIDw8IDI5KSkgPyAnbCcgOgorCQkJICgobGU2NF90b19jcHUodTAtPmIpICYgKDEgPDwgMjApKSA/ICdkJyA6ICdjJykpLAorCQkJaSwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTAtPmEpLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MC0+YiksCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWJ1ZmZlcl9pbmZvLT5kbWEsCisJCQlidWZmZXJfaW5mby0+bGVuZ3RoLCBidWZmZXJfaW5mby0+bmV4dF90b193YXRjaCwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpYnVmZmVyX2luZm8tPnRpbWVfc3RhbXAsCisJCQlidWZmZXJfaW5mby0+c2tiLCBuZXh0X2Rlc2MpOwogCiAJCWlmIChuZXRpZl9tc2dfcGt0ZGF0YShhZGFwdGVyKSAmJiBidWZmZXJfaW5mby0+ZG1hICE9IDApCiAJCQlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICIiLCBEVU1QX1BSRUZJWF9BRERSRVNTLApAQCAtMzEyLDkgKzMwMiw5IEBACiAJLyogUHJpbnQgUnggUmluZyBTdW1tYXJ5ICovCiByeF9yaW5nX3N1bW1hcnk6CiAJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIlJ4IFJpbmcgU3VtbWFyeVxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUXVldWUgW05UVV0gW05UQ11cbiIpOwotCXByaW50ayhLRVJOX0lORk8gIiAlNWQgJTVYICU1WFxuIiwgMCwKLQkgICAgICAgcnhfcmluZy0+bmV4dF90b191c2UsIHJ4X3JpbmctPm5leHRfdG9fY2xlYW4pOworCXByX2luZm8oIlF1ZXVlIFtOVFVdIFtOVENdXG4iKTsKKwlwcl9pbmZvKCIgJTVkICU1WCAlNVhcbiIsCisJCTAsIHJ4X3JpbmctPm5leHRfdG9fdXNlLCByeF9yaW5nLT5uZXh0X3RvX2NsZWFuKTsKIAogCS8qIFByaW50IFJ4IFJpbmcgKi8KIAlpZiAoIW5ldGlmX21zZ19yeF9zdGF0dXMoYWRhcHRlcikpCkBAIC0zMzcsMTAgKzMyNyw3IEBACiAJCSAqIDI0IHwgICAgICAgICAgICAgICAgQnVmZmVyIEFkZHJlc3MgMyBbNjM6MF0gICAgICAgICAgICAgIHwKIAkJICogICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCQkgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiUiAgW2Rlc2NdICAgICAgW2J1ZmZlciAwIDYzOjAgXSAiCi0JCSAgICAgICAiW2J1ZmZlciAxIDYzOjAgXSAiCi0JCSAgICAgICAiW2J1ZmZlciAyIDYzOjAgXSBbYnVmZmVyIDMgNjM6MCBdIFtiaS0+ZG1hICAgICAgIF0gIgotCQkgICAgICAgIltiaS0+c2tiXSA8LS0gRXh0IFBrdCBTcGxpdCBmb3JtYXRcbiIpOworCQlwcl9pbmZvKCJSICBbZGVzY10gICAgICBbYnVmZmVyIDAgNjM6MCBdIFtidWZmZXIgMSA2MzowIF0gW2J1ZmZlciAyIDYzOjAgXSBbYnVmZmVyIDMgNjM6MCBdIFtiaS0+ZG1hICAgICAgIF0gW2JpLT5za2JdIDwtLSBFeHQgUGt0IFNwbGl0IGZvcm1hdFxuIik7CiAJCS8qIFtFeHRlbmRlZF0gUmVjZWl2ZSBEZXNjcmlwdG9yIChXcml0ZS1CYWNrKSBGb3JtYXQKIAkJICoKIAkJICogICA2MyAgICAgICA0OCA0NyAgICAzMiAzMSAgICAgMTMgMTIgICAgOCA3ICAgIDQgMyAgICAgICAgMApAQCAtMzUyLDM1ICszMzksNDAgQEAKIAkJICogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCQkgKiAgIDYzICAgICAgIDQ4IDQ3ICAgIDMyIDMxICAgICAgICAgICAgMjAgMTkgICAgICAgICAgICAgICAwCiAJCSAqLwotCQlwcmludGsoS0VSTl9JTkZPICJSV0JbZGVzY10gICAgICBbY2sgaXBpZCBtcnFoc2hdICIKLQkJICAgICAgICJbdmwgICBsMCBlZSAgZXNdICIKLQkJICAgICAgICJbIGwzICBsMiAgbDEgaHNdIFtyZXNlcnZlZCAgICAgIF0gLS0tLS0tLS0tLS0tLS0tLSAiCi0JCSAgICAgICAiW2JpLT5za2JdIDwtLSBFeHQgUnggV3JpdGUtQmFjayBmb3JtYXRcbiIpOworCQlwcl9pbmZvKCJSV0JbZGVzY10gICAgICBbY2sgaXBpZCBtcnFoc2hdIFt2bCAgIGwwIGVlICBlc10gWyBsMyAgbDIgIGwxIGhzXSBbcmVzZXJ2ZWQgICAgICBdIC0tLS0tLS0tLS0tLS0tLS0gW2JpLT5za2JdIDwtLSBFeHQgUnggV3JpdGUtQmFjayBmb3JtYXRcbiIpOwogCQlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZy0+Y291bnQ7IGkrKykgeworCQkJY29uc3QgY2hhciAqbmV4dF9kZXNjOwogCQkJYnVmZmVyX2luZm8gPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CiAJCQlyeF9kZXNjX3BzID0gRTEwMDBfUlhfREVTQ19QUygqcnhfcmluZywgaSk7CiAJCQl1MSA9IChzdHJ1Y3QgbXlfdTEgKilyeF9kZXNjX3BzOwogCQkJc3RhdGVyciA9CiAJCQkgICAgbGUzMl90b19jcHUocnhfZGVzY19wcy0+d2IubWlkZGxlLnN0YXR1c19lcnJvcik7CisKKwkJCWlmIChpID09IHJ4X3JpbmctPm5leHRfdG9fdXNlKQorCQkJCW5leHRfZGVzYyA9ICIgTlRVIjsKKwkJCWVsc2UgaWYgKGkgPT0gcnhfcmluZy0+bmV4dF90b19jbGVhbikKKwkJCQluZXh0X2Rlc2MgPSAiIE5UQyI7CisJCQllbHNlCisJCQkJbmV4dF9kZXNjID0gIiI7CisKIAkJCWlmIChzdGF0ZXJyICYgRTEwMDBfUlhEX1NUQVRfREQpIHsKIAkJCQkvKiBEZXNjcmlwdG9yIERvbmUgKi8KLQkJCQlwcmludGsoS0VSTl9JTkZPICJSV0JbMHglMDNYXSAgICAgJTAxNmxsWCAiCi0JCQkJICAgICAgICIlMDE2bGxYICUwMTZsbFggJTAxNmxsWCAiCi0JCQkJICAgICAgICItLS0tLS0tLS0tLS0tLS0tICVwIiwgaSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+YSksCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTEtPmIpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5jKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+ZCksCi0JCQkJICAgICAgIGJ1ZmZlcl9pbmZvLT5za2IpOworCQkJCXByX2luZm8oIiVzWzB4JTAzWF0gICAgICUwMTZsbFggJTAxNmxsWCAlMDE2bGxYICUwMTZsbFggLS0tLS0tLS0tLS0tLS0tLSAlcCVzXG4iLAorCQkJCQkiUldCIiwgaSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+YSksCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTEtPmIpLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5jKSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+ZCksCisJCQkJCWJ1ZmZlcl9pbmZvLT5za2IsIG5leHRfZGVzYyk7CiAJCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0lORk8gIlIgIFsweCUwM1hdICAgICAlMDE2bGxYICIKLQkJCQkgICAgICAgIiUwMTZsbFggJTAxNmxsWCAlMDE2bGxYICUwMTZsbFggJXAiLCBpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5hKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+YiksCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTEtPmMpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5kKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWZmZXJfaW5mby0+ZG1hLAotCQkJCSAgICAgICBidWZmZXJfaW5mby0+c2tiKTsKKwkJCQlwcl9pbmZvKCIlc1sweCUwM1hdICAgICAlMDE2bGxYICUwMTZsbFggJTAxNmxsWCAlMDE2bGxYICUwMTZsbFggJXAlc1xuIiwKKwkJCQkJIlIgICIsIGksCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTEtPmEpLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5iKSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+YyksCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTEtPmQpLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJCWJ1ZmZlcl9pbmZvLT5za2IsIG5leHRfZGVzYyk7CiAKIAkJCQlpZiAobmV0aWZfbXNnX3BrdGRhdGEoYWRhcHRlcikpCiAJCQkJCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsCkBAIC0zODgsMTMgKzM4MCw2IEBACiAJCQkJCQlwaHlzX3RvX3ZpcnQoYnVmZmVyX2luZm8tPmRtYSksCiAJCQkJCQlhZGFwdGVyLT5yeF9wc19ic2l6ZTAsIHRydWUpOwogCQkJfQotCi0JCQlpZiAoaSA9PSByeF9yaW5nLT5uZXh0X3RvX3VzZSkKLQkJCQlwcmludGsoS0VSTl9DT05UICIgTlRVXG4iKTsKLQkJCWVsc2UgaWYgKGkgPT0gcnhfcmluZy0+bmV4dF90b19jbGVhbikKLQkJCQlwcmludGsoS0VSTl9DT05UICIgTlRDXG4iKTsKLQkJCWVsc2UKLQkJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOwogCQl9CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC00MDcsOSArMzkyLDcgQEAKIAkJICogOCB8ICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgICB8CiAJCSAqICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogCQkgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiUiAgW2Rlc2NdICAgICAgW2J1ZiBhZGRyIDYzOjAgXSAiCi0JCSAgICAgICAiW3Jlc2VydmVkIDYzOjAgXSBbYmktPmRtYSAgICAgICBdICIKLQkJICAgICAgICJbYmktPnNrYl0gPC0tIEV4dCAoUmVhZCkgZm9ybWF0XG4iKTsKKwkJcHJfaW5mbygiUiAgW2Rlc2NdICAgICAgW2J1ZiBhZGRyIDYzOjAgXSBbcmVzZXJ2ZWQgNjM6MCBdIFtiaS0+ZG1hICAgICAgIF0gW2JpLT5za2JdIDwtLSBFeHQgKFJlYWQpIGZvcm1hdFxuIik7CiAJCS8qIEV4dGVuZGVkIFJlY2VpdmUgRGVzY3JpcHRvciAoV3JpdGUtQmFjaykgRm9ybWF0CiAJCSAqCiAJCSAqICAgNjMgICAgICAgNDggNDcgICAgMzIgMzEgICAgMjQgMjMgICAgICAgICAgICA0IDMgICAgICAgIDAKQEAgLTQyMywyOSArNDA2LDM3IEBACiAJCSAqICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKIAkJICogICA2MyAgICAgICA0OCA0NyAgICAzMiAzMSAgICAgICAgICAgIDIwIDE5ICAgICAgICAgICAgICAgMAogCQkgKi8KLQkJcHJpbnRrKEtFUk5fSU5GTyAiUldCW2Rlc2NdICAgICAgW2NzIGlwaWQgICAgbXJxXSAiCi0JCSAgICAgICAiW3Z0ICAgbG4geGUgIHhzXSAiCi0JCSAgICAgICAiW2JpLT5za2JdIDwtLSBFeHQgKFdyaXRlLUJhY2spIGZvcm1hdFxuIik7CisJCXByX2luZm8oIlJXQltkZXNjXSAgICAgIFtjcyBpcGlkICAgIG1ycV0gW3Z0ICAgbG4geGUgIHhzXSBbYmktPnNrYl0gPC0tIEV4dCAoV3JpdGUtQmFjaykgZm9ybWF0XG4iKTsKIAogCQlmb3IgKGkgPSAwOyBpIDwgcnhfcmluZy0+Y291bnQ7IGkrKykgeworCQkJY29uc3QgY2hhciAqbmV4dF9kZXNjOworCiAJCQlidWZmZXJfaW5mbyA9ICZyeF9yaW5nLT5idWZmZXJfaW5mb1tpXTsKIAkJCXJ4X2Rlc2MgPSBFMTAwMF9SWF9ERVNDX0VYVCgqcnhfcmluZywgaSk7CiAJCQl1MSA9IChzdHJ1Y3QgbXlfdTEgKilyeF9kZXNjOwogCQkJc3RhdGVyciA9IGxlMzJfdG9fY3B1KHJ4X2Rlc2MtPndiLnVwcGVyLnN0YXR1c19lcnJvcik7CisKKwkJCWlmIChpID09IHJ4X3JpbmctPm5leHRfdG9fdXNlKQorCQkJCW5leHRfZGVzYyA9ICIgTlRVIjsKKwkJCWVsc2UgaWYgKGkgPT0gcnhfcmluZy0+bmV4dF90b19jbGVhbikKKwkJCQluZXh0X2Rlc2MgPSAiIE5UQyI7CisJCQllbHNlCisJCQkJbmV4dF9kZXNjID0gIiI7CisKIAkJCWlmIChzdGF0ZXJyICYgRTEwMDBfUlhEX1NUQVRfREQpIHsKIAkJCQkvKiBEZXNjcmlwdG9yIERvbmUgKi8KLQkJCQlwcmludGsoS0VSTl9JTkZPICJSV0JbMHglMDNYXSAgICAgJTAxNmxsWCAiCi0JCQkJICAgICAgICIlMDE2bGxYIC0tLS0tLS0tLS0tLS0tLS0gJXAiLCBpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5hKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+YiksCi0JCQkJICAgICAgIGJ1ZmZlcl9pbmZvLT5za2IpOworCQkJCXByX2luZm8oIiVzWzB4JTAzWF0gICAgICUwMTZsbFggJTAxNmxsWCAtLS0tLS0tLS0tLS0tLS0tICVwJXNcbiIsCisJCQkJCSJSV0IiLCBpLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5hKSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+YiksCisJCQkJCWJ1ZmZlcl9pbmZvLT5za2IsIG5leHRfZGVzYyk7CiAJCQl9IGVsc2UgewotCQkJCXByaW50ayhLRVJOX0lORk8gIlIgIFsweCUwM1hdICAgICAlMDE2bGxYICIKLQkJCQkgICAgICAgIiUwMTZsbFggJTAxNmxsWCAlcCIsIGksCi0JCQkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTEtPmEpLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWxlNjRfdG9fY3B1KHUxLT5iKSwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidWZmZXJfaW5mby0+ZG1hLAotCQkJCSAgICAgICBidWZmZXJfaW5mby0+c2tiKTsKKwkJCQlwcl9pbmZvKCIlc1sweCUwM1hdICAgICAlMDE2bGxYICUwMTZsbFggJTAxNmxsWCAlcCVzXG4iLAorCQkJCQkiUiAgIiwgaSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdSh1MS0+YSksCisJCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUodTEtPmIpLAorCQkJCQkodW5zaWduZWQgbG9uZyBsb25nKWJ1ZmZlcl9pbmZvLT5kbWEsCisJCQkJCWJ1ZmZlcl9pbmZvLT5za2IsIG5leHRfZGVzYyk7CiAKIAkJCQlpZiAobmV0aWZfbXNnX3BrdGRhdGEoYWRhcHRlcikpCiAJCQkJCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsCkBAIC00NTYsMTMgKzQ0Nyw2IEBACiAJCQkJCQkgICAgICAgYWRhcHRlci0+cnhfYnVmZmVyX2xlbiwKIAkJCQkJCSAgICAgICB0cnVlKTsKIAkJCX0KLQotCQkJaWYgKGkgPT0gcnhfcmluZy0+bmV4dF90b191c2UpCi0JCQkJcHJpbnRrKEtFUk5fQ09OVCAiIE5UVVxuIik7Ci0JCQllbHNlIGlmIChpID09IHJ4X3JpbmctPm5leHRfdG9fY2xlYW4pCi0JCQkJcHJpbnRrKEtFUk5fQ09OVCAiIE5UQ1xuIik7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKIAkJfQogCX0KIApAQCAtODc1LDcgKzg1OSw3IEBACiAJdTMyIGxlbmd0aCwgc3RhdGVycjsKIAl1bnNpZ25lZCBpbnQgaTsKIAlpbnQgY2xlYW5lZF9jb3VudCA9IDA7Ci0JYm9vbCBjbGVhbmVkID0gMDsKKwlib29sIGNsZWFuZWQgPSBmYWxzZTsKIAl1bnNpZ25lZCBpbnQgdG90YWxfcnhfYnl0ZXMgPSAwLCB0b3RhbF9yeF9wYWNrZXRzID0gMDsKIAogCWkgPSByeF9yaW5nLT5uZXh0X3RvX2NsZWFuOwpAQCAtOTA0LDcgKzg4OCw3IEBACiAKIAkJbmV4dF9idWZmZXIgPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CiAKLQkJY2xlYW5lZCA9IDE7CisJCWNsZWFuZWQgPSB0cnVlOwogCQljbGVhbmVkX2NvdW50Kys7CiAJCWRtYV91bm1hcF9zaW5nbGUoJnBkZXYtPmRldiwKIAkJCQkgYnVmZmVyX2luZm8tPmRtYSwKQEAgLTEwMzAsNiArMTAxNCw3IEBACiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBjb250YWluZXJfb2Yod29yaywKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZTEwMDBfYWRhcHRlciwKIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludF9oYW5nX3Rhc2spOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBhZGFwdGVyLT5uZXRkZXY7CiAJc3RydWN0IGUxMDAwX3JpbmcgKnR4X3JpbmcgPSBhZGFwdGVyLT50eF9yaW5nOwogCXVuc2lnbmVkIGludCBpID0gdHhfcmluZy0+bmV4dF90b19jbGVhbjsKIAl1bnNpZ25lZCBpbnQgZW9wID0gdHhfcmluZy0+YnVmZmVyX2luZm9baV0ubmV4dF90b193YXRjaDsKQEAgLTEwNDEsNiArMTAyNiwyMSBAQAogCWlmICh0ZXN0X2JpdChfX0UxMDAwX0RPV04sICZhZGFwdGVyLT5zdGF0ZSkpCiAJCXJldHVybjsKIAorCWlmICghYWRhcHRlci0+dHhfaGFuZ19yZWNoZWNrICYmCisJICAgIChhZGFwdGVyLT5mbGFnczIgJiBGTEFHMl9ETUFfQlVSU1QpKSB7CisJCS8qIE1heSBiZSBibG9jayBvbiB3cml0ZS1iYWNrLCBmbHVzaCBhbmQgZGV0ZWN0IGFnYWluCisJCSAqIGZsdXNoIHBlbmRpbmcgZGVzY3JpcHRvciB3cml0ZWJhY2tzIHRvIG1lbW9yeQorCQkgKi8KKwkJZXczMihUSURWLCBhZGFwdGVyLT50eF9pbnRfZGVsYXkgfCBFMTAwMF9USURWX0ZQRCk7CisJCS8qIGV4ZWN1dGUgdGhlIHdyaXRlcyBpbW1lZGlhdGVseSAqLworCQllMWVfZmx1c2goKTsKKwkJYWRhcHRlci0+dHhfaGFuZ19yZWNoZWNrID0gdHJ1ZTsKKwkJcmV0dXJuOworCX0KKwkvKiBSZWFsIGhhbmcgZGV0ZWN0ZWQgKi8KKwlhZGFwdGVyLT50eF9oYW5nX3JlY2hlY2sgPSBmYWxzZTsKKwluZXRpZl9zdG9wX3F1ZXVlKG5ldGRldik7CisKIAllMWVfcnBoeShodywgUEhZX1NUQVRVUywgJnBoeV9zdGF0dXMpOwogCWUxZV9ycGh5KGh3LCBQSFlfMTAwMFRfU1RBVFVTLCAmcGh5XzEwMDB0X3N0YXR1cyk7CiAJZTFlX3JwaHkoaHcsIFBIWV9FWFRfU1RBVFVTLCAmcGh5X2V4dF9zdGF0dXMpOwpAQCAtMTA5NSw2ICsxMDk1LDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgZW9wOwogCXVuc2lnbmVkIGludCBjb3VudCA9IDA7CiAJdW5zaWduZWQgaW50IHRvdGFsX3R4X2J5dGVzID0gMCwgdG90YWxfdHhfcGFja2V0cyA9IDA7CisJdW5zaWduZWQgaW50IGJ5dGVzX2NvbXBsID0gMCwgcGt0c19jb21wbCA9IDA7CiAKIAlpID0gdHhfcmluZy0+bmV4dF90b19jbGVhbjsKIAllb3AgPSB0eF9yaW5nLT5idWZmZXJfaW5mb1tpXS5uZXh0X3RvX3dhdGNoOwpAQCAtMTExMiw2ICsxMTEzLDEwIEBACiAJCQlpZiAoY2xlYW5lZCkgewogCQkJCXRvdGFsX3R4X3BhY2tldHMgKz0gYnVmZmVyX2luZm8tPnNlZ3M7CiAJCQkJdG90YWxfdHhfYnl0ZXMgKz0gYnVmZmVyX2luZm8tPmJ5dGVjb3VudDsKKwkJCQlpZiAoYnVmZmVyX2luZm8tPnNrYikgeworCQkJCQlieXRlc19jb21wbCArPSBidWZmZXJfaW5mby0+c2tiLT5sZW47CisJCQkJCXBrdHNfY29tcGwrKzsKKwkJCQl9CiAJCQl9CiAKIAkJCWUxMDAwX3B1dF90eGJ1ZihhZGFwdGVyLCBidWZmZXJfaW5mbyk7CkBAIC0xMTMwLDYgKzExMzUsOCBAQAogCiAJdHhfcmluZy0+bmV4dF90b19jbGVhbiA9IGk7CiAKKwluZXRkZXZfY29tcGxldGVkX3F1ZXVlKG5ldGRldiwgcGt0c19jb21wbCwgYnl0ZXNfY29tcGwpOworCiAjZGVmaW5lIFRYX1dBS0VfVEhSRVNIT0xEIDMyCiAJaWYgKGNvdW50ICYmIG5ldGlmX2NhcnJpZXJfb2sobmV0ZGV2KSAmJgogCSAgICBlMTAwMF9kZXNjX3VudXNlZCh0eF9yaW5nKSA+PSBUWF9XQUtFX1RIUkVTSE9MRCkgewpAQCAtMTE1MCwxNCArMTE1NywxNCBAQAogCQkgKiBEZXRlY3QgYSB0cmFuc21pdCBoYW5nIGluIGhhcmR3YXJlLCB0aGlzIHNlcmlhbGl6ZXMgdGhlCiAJCSAqIGNoZWNrIHdpdGggdGhlIGNsZWFyaW5nIG9mIHRpbWVfc3RhbXAgYW5kIG1vdmVtZW50IG9mIGkKIAkJICovCi0JCWFkYXB0ZXItPmRldGVjdF90eF9odW5nID0gMDsKKwkJYWRhcHRlci0+ZGV0ZWN0X3R4X2h1bmcgPSBmYWxzZTsKIAkJaWYgKHR4X3JpbmctPmJ1ZmZlcl9pbmZvW2ldLnRpbWVfc3RhbXAgJiYKIAkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgdHhfcmluZy0+YnVmZmVyX2luZm9baV0udGltZV9zdGFtcAogCQkJICAgICAgICsgKGFkYXB0ZXItPnR4X3RpbWVvdXRfZmFjdG9yICogSFopKSAmJgotCQkgICAgIShlcjMyKFNUQVRVUykgJiBFMTAwMF9TVEFUVVNfVFhPRkYpKSB7CisJCSAgICAhKGVyMzIoU1RBVFVTKSAmIEUxMDAwX1NUQVRVU19UWE9GRikpCiAJCQlzY2hlZHVsZV93b3JrKCZhZGFwdGVyLT5wcmludF9oYW5nX3Rhc2spOwotCQkJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXYpOwotCQl9CisJCWVsc2UKKwkJCWFkYXB0ZXItPnR4X2hhbmdfcmVjaGVjayA9IGZhbHNlOwogCX0KIAlhZGFwdGVyLT50b3RhbF90eF9ieXRlcyArPSB0b3RhbF90eF9ieXRlczsKIAlhZGFwdGVyLT50b3RhbF90eF9wYWNrZXRzICs9IHRvdGFsX3R4X3BhY2tldHM7CkBAIC0xMTg1LDcgKzExOTIsNyBAQAogCXVuc2lnbmVkIGludCBpLCBqOwogCXUzMiBsZW5ndGgsIHN0YXRlcnI7CiAJaW50IGNsZWFuZWRfY291bnQgPSAwOwotCWJvb2wgY2xlYW5lZCA9IDA7CisJYm9vbCBjbGVhbmVkID0gZmFsc2U7CiAJdW5zaWduZWQgaW50IHRvdGFsX3J4X2J5dGVzID0gMCwgdG90YWxfcnhfcGFja2V0cyA9IDA7CiAKIAlpID0gcnhfcmluZy0+bmV4dF90b19jbGVhbjsKQEAgLTEyMTEsNyArMTIxOCw3IEBACiAKIAkJbmV4dF9idWZmZXIgPSAmcnhfcmluZy0+YnVmZmVyX2luZm9baV07CiAKLQkJY2xlYW5lZCA9IDE7CisJCWNsZWFuZWQgPSB0cnVlOwogCQljbGVhbmVkX2NvdW50Kys7CiAJCWRtYV91bm1hcF9zaW5nbGUoJnBkZXYtPmRldiwgYnVmZmVyX2luZm8tPmRtYSwKIAkJCQkgYWRhcHRlci0+cnhfcHNfYnNpemUwLCBETUFfRlJPTV9ERVZJQ0UpOwpAQCAtMTIyMiw4ICsxMjI5LDcgQEAKIAkJCWFkYXB0ZXItPmZsYWdzMiB8PSBGTEFHMl9JU19ESVNDQVJESU5HOwogCiAJCWlmIChhZGFwdGVyLT5mbGFnczIgJiBGTEFHMl9JU19ESVNDQVJESU5HKSB7Ci0JCQllX2RiZygiUGFja2V0IFNwbGl0IGJ1ZmZlcnMgZGlkbid0IHBpY2sgdXAgdGhlIGZ1bGwgIgotCQkJICAgICAgInBhY2tldFxuIik7CisJCQllX2RiZygiUGFja2V0IFNwbGl0IGJ1ZmZlcnMgZGlkbid0IHBpY2sgdXAgdGhlIGZ1bGwgcGFja2V0XG4iKTsKIAkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCQlpZiAoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX0VPUCkKIAkJCQlhZGFwdGVyLT5mbGFnczIgJj0gfkZMQUcyX0lTX0RJU0NBUkRJTkc7CkBAIC0xMjM4LDggKzEyNDQsNyBAQAogCQlsZW5ndGggPSBsZTE2X3RvX2NwdShyeF9kZXNjLT53Yi5taWRkbGUubGVuZ3RoMCk7CiAKIAkJaWYgKCFsZW5ndGgpIHsKLQkJCWVfZGJnKCJMYXN0IHBhcnQgb2YgdGhlIHBhY2tldCBzcGFubmluZyBtdWx0aXBsZSAiCi0JCQkgICAgICAiZGVzY3JpcHRvcnNcbiIpOworCQkJZV9kYmcoIkxhc3QgcGFydCBvZiB0aGUgcGFja2V0IHNwYW5uaW5nIG11bHRpcGxlIGRlc2NyaXB0b3JzXG4iKTsKIAkJCWRldl9rZnJlZV9za2JfaXJxKHNrYik7CiAJCQlnb3RvIG5leHRfZGVzYzsKIAkJfQpAQCAtMTkxNyw4ICsxOTIyLDcgQEAKIAkJCQkJcmV0dXJuOwogCQkJfQogCQkJLyogTVNJLVggZmFpbGVkLCBzbyBmYWxsIHRocm91Z2ggYW5kIHRyeSBNU0kgKi8KLQkJCWVfZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBNU0ktWCBpbnRlcnJ1cHRzLiAgIgotCQkJICAgICAgIkZhbGxpbmcgYmFjayB0byBNU0kgaW50ZXJydXB0cy5cbiIpOworCQkJZV9lcnIoIkZhaWxlZCB0byBpbml0aWFsaXplIE1TSS1YIGludGVycnVwdHMuICBGYWxsaW5nIGJhY2sgdG8gTVNJIGludGVycnVwdHMuXG4iKTsKIAkJCWUxMDAwZV9yZXNldF9pbnRlcnJ1cHRfY2FwYWJpbGl0eShhZGFwdGVyKTsKIAkJfQogCQlhZGFwdGVyLT5pbnRfbW9kZSA9IEUxMDAwRV9JTlRfTU9ERV9NU0k7CkBAIC0xOTI4LDggKzE5MzIsNyBAQAogCQkJYWRhcHRlci0+ZmxhZ3MgfD0gRkxBR19NU0lfRU5BQkxFRDsKIAkJfSBlbHNlIHsKIAkJCWFkYXB0ZXItPmludF9tb2RlID0gRTEwMDBFX0lOVF9NT0RFX0xFR0FDWTsKLQkJCWVfZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBNU0kgaW50ZXJydXB0cy4gIEZhbGxpbmcgIgotCQkJICAgICAgImJhY2sgdG8gbGVnYWN5IGludGVycnVwdHMuXG4iKTsKKwkJCWVfZXJyKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBNU0kgaW50ZXJydXB0cy4gIEZhbGxpbmcgYmFjayB0byBsZWdhY3kgaW50ZXJydXB0cy5cbiIpOwogCQl9CiAJCS8qIEZhbGwgdGhyb3VnaCAqLwogCWNhc2UgRTEwMDBFX0lOVF9NT0RFX0xFR0FDWToKQEAgLTIyNjAsNiArMjI2Myw3IEBACiAJCWUxMDAwX3B1dF90eGJ1ZihhZGFwdGVyLCBidWZmZXJfaW5mbyk7CiAJfQogCisJbmV0ZGV2X3Jlc2V0X3F1ZXVlKGFkYXB0ZXItPm5ldGRldik7CiAJc2l6ZSA9IHNpemVvZihzdHJ1Y3QgZTEwMDBfYnVmZmVyKSAqIHR4X3JpbmctPmNvdW50OwogCW1lbXNldCh0eF9yaW5nLT5idWZmZXJfaW5mbywgMCwgc2l6ZSk7CiAKQEAgLTI1MTgsNyArMjUyMiw3IEBACiAJcmV0dXJuIHdvcmtfZG9uZTsKIH0KIAotc3RhdGljIHZvaWQgZTEwMDBfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCitzdGF0aWMgaW50IGUxMDAwX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtMjUyOCw3ICsyNTMyLDcgQEAKIAlpZiAoKGFkYXB0ZXItPmh3Lm1uZ19jb29raWUuc3RhdHVzICYKIAkgICAgIEUxMDAwX01OR19ESENQX0NPT0tJRV9TVEFUVVNfVkxBTikgJiYKIAkgICAgKHZpZCA9PSBhZGFwdGVyLT5tbmdfdmxhbl9pZCkpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKIAkvKiBhZGQgVklEIHRvIGZpbHRlciB0YWJsZSAqLwogCWlmIChhZGFwdGVyLT5mbGFncyAmIEZMQUdfSEFTX0hXX1ZMQU5fRklMVEVSKSB7CkBAIC0yNTM5LDkgKzI1NDMsMTEgQEAKIAl9CiAKIAlzZXRfYml0KHZpZCwgYWRhcHRlci0+YWN0aXZlX3ZsYW5zKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBlMTAwMF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCitzdGF0aWMgaW50IGUxMDAwX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTI1NTIsNyArMjU1OCw3IEBACiAJICAgICh2aWQgPT0gYWRhcHRlci0+bW5nX3ZsYW5faWQpKSB7CiAJCS8qIHJlbGVhc2UgY29udHJvbCB0byBmL3cgKi8KIAkJZTEwMDBlX3JlbGVhc2VfaHdfY29udHJvbChhZGFwdGVyKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAl9CiAKIAkvKiByZW1vdmUgVklEIGZyb20gZmlsdGVyIHRhYmxlICovCkBAIC0yNTY0LDYgKzI1NzAsOCBAQAogCX0KIAogCWNsZWFyX2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucyk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0zMTEzLDc5ICszMTIxLDE0NyBAQAogfQogCiAvKioKLSAqICBlMTAwMF91cGRhdGVfbWNfYWRkcl9saXN0IC0gVXBkYXRlIE11bHRpY2FzdCBhZGRyZXNzZXMKLSAqICBAaHc6IHBvaW50ZXIgdG8gdGhlIEhXIHN0cnVjdHVyZQotICogIEBtY19hZGRyX2xpc3Q6IGFycmF5IG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gcHJvZ3JhbQotICogIEBtY19hZGRyX2NvdW50OiBudW1iZXIgb2YgbXVsdGljYXN0IGFkZHJlc3NlcyB0byBwcm9ncmFtCi0gKgotICogIFVwZGF0ZXMgdGhlIE11bHRpY2FzdCBUYWJsZSBBcnJheS4KLSAqICBUaGUgY2FsbGVyIG11c3QgaGF2ZSBhIHBhY2tlZCBtY19hZGRyX2xpc3Qgb2YgbXVsdGljYXN0IGFkZHJlc3Nlcy4KLSAqKi8KLXN0YXRpYyB2b2lkIGUxMDAwX3VwZGF0ZV9tY19hZGRyX2xpc3Qoc3RydWN0IGUxMDAwX2h3ICpodywgdTggKm1jX2FkZHJfbGlzdCwKLQkJCQkgICAgICB1MzIgbWNfYWRkcl9jb3VudCkKLXsKLQlody0+bWFjLm9wcy51cGRhdGVfbWNfYWRkcl9saXN0KGh3LCBtY19hZGRyX2xpc3QsIG1jX2FkZHJfY291bnQpOwotfQotCi0vKioKLSAqIGUxMDAwX3NldF9tdWx0aSAtIE11bHRpY2FzdCBhbmQgUHJvbWlzY3VvdXMgbW9kZSBzZXQKKyAqIGUxMDAwZV93cml0ZV9tY19hZGRyX2xpc3QgLSB3cml0ZSBtdWx0aWNhc3QgYWRkcmVzc2VzIHRvIE1UQQogICogQG5ldGRldjogbmV0d29yayBpbnRlcmZhY2UgZGV2aWNlIHN0cnVjdHVyZQogICoKLSAqIFRoZSBzZXRfbXVsdGkgZW50cnkgcG9pbnQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBtdWx0aWNhc3QgYWRkcmVzcwotICogbGlzdCBvciB0aGUgbmV0d29yayBpbnRlcmZhY2UgZmxhZ3MgYXJlIHVwZGF0ZWQuICBUaGlzIHJvdXRpbmUgaXMKLSAqIHJlc3BvbnNpYmxlIGZvciBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUgZm9yIHByb3BlciBtdWx0aWNhc3QsCi0gKiBwcm9taXNjdW91cyBtb2RlLCBhbmQgYWxsLW11bHRpIGJlaGF2aW9yLgotICoqLwotc3RhdGljIHZvaWQgZTEwMDBfc2V0X211bHRpKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCisgKiBXcml0ZXMgbXVsdGljYXN0IGFkZHJlc3MgbGlzdCB0byB0aGUgTVRBIGhhc2ggdGFibGUuCisgKiBSZXR1cm5zOiAtRU5PTUVNIG9uIGZhaWx1cmUKKyAqICAgICAgICAgICAgICAgIDAgb24gbm8gYWRkcmVzc2VzIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICAgIFggb24gd3JpdGluZyBYIGFkZHJlc3NlcyB0byBNVEEKKyAqLworc3RhdGljIGludCBlMTAwMGVfd3JpdGVfbWNfYWRkcl9saXN0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJc3RydWN0IG5ldGRldl9od19hZGRyICpoYTsKLQl1OCAgKm10YV9saXN0OworCXU4ICptdGFfbGlzdDsKKwlpbnQgaTsKKworCWlmIChuZXRkZXZfbWNfZW1wdHkobmV0ZGV2KSkgeworCQkvKiBub3RoaW5nIHRvIHByb2dyYW0sIHNvIGNsZWFyIG1jIGxpc3QgKi8KKwkJaHctPm1hYy5vcHMudXBkYXRlX21jX2FkZHJfbGlzdChodywgTlVMTCwgMCk7CisJCXJldHVybiAwOworCX0KKworCW10YV9saXN0ID0ga3phbGxvYyhuZXRkZXZfbWNfY291bnQobmV0ZGV2KSAqIEVUSF9BTEVOLCBHRlBfQVRPTUlDKTsKKwlpZiAoIW10YV9saXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIHVwZGF0ZV9tY19hZGRyX2xpc3QgZXhwZWN0cyBhIHBhY2tlZCBhcnJheSBvZiBvbmx5IGFkZHJlc3Nlcy4gKi8KKwlpID0gMDsKKwluZXRkZXZfZm9yX2VhY2hfbWNfYWRkcihoYSwgbmV0ZGV2KQorCQltZW1jcHkobXRhX2xpc3QgKyAoaSsrICogRVRIX0FMRU4pLCBoYS0+YWRkciwgRVRIX0FMRU4pOworCisJaHctPm1hYy5vcHMudXBkYXRlX21jX2FkZHJfbGlzdChodywgbXRhX2xpc3QsIGkpOworCWtmcmVlKG10YV9saXN0KTsKKworCXJldHVybiBuZXRkZXZfbWNfY291bnQobmV0ZGV2KTsKK30KKworLyoqCisgKiBlMTAwMGVfd3JpdGVfdWNfYWRkcl9saXN0IC0gd3JpdGUgdW5pY2FzdCBhZGRyZXNzZXMgdG8gUkFSIHRhYmxlCisgKiBAbmV0ZGV2OiBuZXR3b3JrIGludGVyZmFjZSBkZXZpY2Ugc3RydWN0dXJlCisgKgorICogV3JpdGVzIHVuaWNhc3QgYWRkcmVzcyBsaXN0IHRvIHRoZSBSQVIgdGFibGUuCisgKiBSZXR1cm5zOiAtRU5PTUVNIG9uIGZhaWx1cmUvaW5zdWZmaWNpZW50IGFkZHJlc3Mgc3BhY2UKKyAqICAgICAgICAgICAgICAgIDAgb24gbm8gYWRkcmVzc2VzIHdyaXR0ZW4KKyAqICAgICAgICAgICAgICAgIFggb24gd3JpdGluZyBYIGFkZHJlc3NlcyB0byB0aGUgUkFSIHRhYmxlCisgKiovCitzdGF0aWMgaW50IGUxMDAwZV93cml0ZV91Y19hZGRyX2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CisJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKKwl1bnNpZ25lZCBpbnQgcmFyX2VudHJpZXMgPSBody0+bWFjLnJhcl9lbnRyeV9jb3VudDsKKwlpbnQgY291bnQgPSAwOworCisJLyogc2F2ZSBhIHJhciBlbnRyeSBmb3Igb3VyIGhhcmR3YXJlIGFkZHJlc3MgKi8KKwlyYXJfZW50cmllcy0tOworCisJLyogc2F2ZSBhIHJhciBlbnRyeSBmb3IgdGhlIExBQSB3b3JrYXJvdW5kICovCisJaWYgKGFkYXB0ZXItPmZsYWdzICYgRkxBR19SRVNFVF9PVkVSV1JJVEVTX0xBQSkKKwkJcmFyX2VudHJpZXMtLTsKKworCS8qIHJldHVybiBFTk9NRU0gaW5kaWNhdGluZyBpbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBhZGRyZXNzZXMgKi8KKwlpZiAobmV0ZGV2X3VjX2NvdW50KG5ldGRldikgPiByYXJfZW50cmllcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoIW5ldGRldl91Y19lbXB0eShuZXRkZXYpICYmIHJhcl9lbnRyaWVzKSB7CisJCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisKKwkJLyoKKwkJICogd3JpdGUgdGhlIGFkZHJlc3NlcyBpbiByZXZlcnNlIG9yZGVyIHRvIGF2b2lkIHdyaXRlCisJCSAqIGNvbWJpbmluZworCQkgKi8KKwkJbmV0ZGV2X2Zvcl9lYWNoX3VjX2FkZHIoaGEsIG5ldGRldikgeworCQkJaWYgKCFyYXJfZW50cmllcykKKwkJCQlicmVhazsKKwkJCWUxMDAwZV9yYXJfc2V0KGh3LCBoYS0+YWRkciwgcmFyX2VudHJpZXMtLSk7CisJCQljb3VudCsrOworCQl9CisJfQorCisJLyogemVybyBvdXQgdGhlIHJlbWFpbmluZyBSQVIgZW50cmllcyBub3QgdXNlZCBhYm92ZSAqLworCWZvciAoOyByYXJfZW50cmllcyA+IDA7IHJhcl9lbnRyaWVzLS0pIHsKKwkJZXczMihSQUgocmFyX2VudHJpZXMpLCAwKTsKKwkJZXczMihSQUwocmFyX2VudHJpZXMpLCAwKTsKKwl9CisJZTFlX2ZsdXNoKCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qKgorICogZTEwMDBlX3NldF9yeF9tb2RlIC0gc2Vjb25kYXJ5IHVuaWNhc3QsIE11bHRpY2FzdCBhbmQgUHJvbWlzY3VvdXMgbW9kZSBzZXQKKyAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKKyAqCisgKiBUaGUgbmRvX3NldF9yeF9tb2RlIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgdW5pY2FzdCBvciBtdWx0aWNhc3QKKyAqIGFkZHJlc3MgbGlzdCBvciB0aGUgbmV0d29yayBpbnRlcmZhY2UgZmxhZ3MgYXJlIHVwZGF0ZWQuICBUaGlzIHJvdXRpbmUgaXMKKyAqIHJlc3BvbnNpYmxlIGZvciBjb25maWd1cmluZyB0aGUgaGFyZHdhcmUgZm9yIHByb3BlciB1bmljYXN0LCBtdWx0aWNhc3QsCisgKiBwcm9taXNjdW91cyBtb2RlLCBhbmQgYWxsLW11bHRpIGJlaGF2aW9yLgorICoqLworc3RhdGljIHZvaWQgZTEwMDBlX3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGUxMDAwX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CiAJdTMyIHJjdGw7CiAKIAkvKiBDaGVjayBmb3IgUHJvbWlzY3VvdXMgYW5kIEFsbCBNdWx0aWNhc3QgbW9kZXMgKi8KLQogCXJjdGwgPSBlcjMyKFJDVEwpOwogCisJLyogY2xlYXIgdGhlIGFmZmVjdGVkIGJpdHMgKi8KKwlyY3RsICY9IH4oRTEwMDBfUkNUTF9VUEUgfCBFMTAwMF9SQ1RMX01QRSk7CisKIAlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKSB7CiAJCXJjdGwgfD0gKEUxMDAwX1JDVExfVVBFIHwgRTEwMDBfUkNUTF9NUEUpOwotCQlyY3RsICY9IH5FMTAwMF9SQ1RMX1ZGRTsKIAkJLyogRG8gbm90IGhhcmR3YXJlIGZpbHRlciBWTEFOcyBpbiBwcm9taXNjIG1vZGUgKi8KIAkJZTEwMDBlX3ZsYW5fZmlsdGVyX2Rpc2FibGUoYWRhcHRlcik7CiAJfSBlbHNlIHsKKwkJaW50IGNvdW50OwogCQlpZiAobmV0ZGV2LT5mbGFncyAmIElGRl9BTExNVUxUSSkgewogCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX01QRTsKLQkJCXJjdGwgJj0gfkUxMDAwX1JDVExfVVBFOwogCQl9IGVsc2UgewotCQkJcmN0bCAmPSB+KEUxMDAwX1JDVExfVVBFIHwgRTEwMDBfUkNUTF9NUEUpOworCQkJLyoKKwkJCSAqIFdyaXRlIGFkZHJlc3NlcyB0byB0aGUgTVRBLCBpZiB0aGUgYXR0ZW1wdCBmYWlscworCQkJICogdGhlbiB3ZSBzaG91bGQganVzdCB0dXJuIG9uIHByb21pc2N1b3VzIG1vZGUgc28KKwkJCSAqIHRoYXQgd2UgY2FuIGF0IGxlYXN0IHJlY2VpdmUgbXVsdGljYXN0IHRyYWZmaWMKKwkJCSAqLworCQkJY291bnQgPSBlMTAwMGVfd3JpdGVfbWNfYWRkcl9saXN0KG5ldGRldik7CisJCQlpZiAoY291bnQgPCAwKQorCQkJCXJjdGwgfD0gRTEwMDBfUkNUTF9NUEU7CiAJCX0KIAkJZTEwMDBlX3ZsYW5fZmlsdGVyX2VuYWJsZShhZGFwdGVyKTsKKwkJLyoKKwkJICogV3JpdGUgYWRkcmVzc2VzIHRvIGF2YWlsYWJsZSBSQVIgcmVnaXN0ZXJzLCBpZiB0aGVyZSBpcyBub3QKKwkJICogc3VmZmljaWVudCBzcGFjZSB0byBzdG9yZSBhbGwgdGhlIGFkZHJlc3NlcyB0aGVuIGVuYWJsZQorCQkgKiB1bmljYXN0IHByb21pc2N1b3VzIG1vZGUKKwkJICovCisJCWNvdW50ID0gZTEwMDBlX3dyaXRlX3VjX2FkZHJfbGlzdChuZXRkZXYpOworCQlpZiAoY291bnQgPCAwKQorCQkJcmN0bCB8PSBFMTAwMF9SQ1RMX1VQRTsKIAl9CiAKIAlldzMyKFJDVEwsIHJjdGwpOwogCi0JaWYgKCFuZXRkZXZfbWNfZW1wdHkobmV0ZGV2KSkgewotCQlpbnQgaSA9IDA7Ci0KLQkJbXRhX2xpc3QgPSBrbWFsbG9jKG5ldGRldl9tY19jb3VudChuZXRkZXYpICogNiwgR0ZQX0FUT01JQyk7Ci0JCWlmICghbXRhX2xpc3QpCi0JCQlyZXR1cm47Ci0KLQkJLyogcHJlcGFyZSBhIHBhY2tlZCBhcnJheSBvZiBvbmx5IGFkZHJlc3Nlcy4gKi8KLQkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIG5ldGRldikKLQkJCW1lbWNweShtdGFfbGlzdCArIChpKysgKiBFVEhfQUxFTiksIGhhLT5hZGRyLCBFVEhfQUxFTik7Ci0KLQkJZTEwMDBfdXBkYXRlX21jX2FkZHJfbGlzdChodywgbXRhX2xpc3QsIGkpOwotCQlrZnJlZShtdGFfbGlzdCk7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogaWYgd2UncmUgY2FsbGVkIGZyb20gcHJvYmUsIHdlIG1pZ2h0IG5vdCBoYXZlCi0JCSAqIGFueXRoaW5nIHRvIGRvIGhlcmUsIHNvIGNsZWFyIG91dCB0aGUgbGlzdAotCQkgKi8KLQkJZTEwMDBfdXBkYXRlX21jX2FkZHJfbGlzdChodywgTlVMTCwgMCk7Ci0JfQotCiAJaWYgKG5ldGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fUlgpCiAJCWUxMDAwZV92bGFuX3N0cmlwX2VuYWJsZShhZGFwdGVyKTsKIAllbHNlCkBAIC0zMTk4LDcgKzMyNzQsNyBAQAogICoqLwogc3RhdGljIHZvaWQgZTEwMDBfY29uZmlndXJlKHN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyKQogewotCWUxMDAwX3NldF9tdWx0aShhZGFwdGVyLT5uZXRkZXYpOworCWUxMDAwZV9zZXRfcnhfbW9kZShhZGFwdGVyLT5uZXRkZXYpOwogCiAJZTEwMDBfcmVzdG9yZV92bGFuKGFkYXB0ZXIpOwogCWUxMDAwX2luaXRfbWFuYWdlYWJpbGl0eV9wdChhZGFwdGVyKTsKQEAgLTM0NDQsNyArMzUyMCw2IEBACiAKIAljbGVhcl9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+c3RhdGUpOwogCi0JbmFwaV9lbmFibGUoJmFkYXB0ZXItPm5hcGkpOwogCWlmIChhZGFwdGVyLT5tc2l4X2VudHJpZXMpCiAJCWUxMDAwX2NvbmZpZ3VyZV9tc2l4KGFkYXB0ZXIpOwogCWUxMDAwX2lycV9lbmFibGUoYWRhcHRlcik7CkBAIC0zNTA2LDcgKzM1ODEsNiBAQAogCWUxZV9mbHVzaCgpOwogCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOwogCi0JbmFwaV9kaXNhYmxlKCZhZGFwdGVyLT5uYXBpKTsKIAllMTAwMF9pcnFfZGlzYWJsZShhZGFwdGVyKTsKIAogCWRlbF90aW1lcl9zeW5jKCZhZGFwdGVyLT53YXRjaGRvZ190aW1lcik7CkBAIC0zNzgyLDYgKzM4NTYsNyBAQAogCiAJZTEwMDBfaXJxX2VuYWJsZShhZGFwdGVyKTsKIAorCWFkYXB0ZXItPnR4X2hhbmdfcmVjaGVjayA9IGZhbHNlOwogCW5ldGlmX3N0YXJ0X3F1ZXVlKG5ldGRldik7CiAKIAlhZGFwdGVyLT5pZGxlX2NoZWNrID0gdHJ1ZTsKQEAgLTM4MjgsNiArMzkwMyw4IEBACiAKIAlwbV9ydW50aW1lX2dldF9zeW5jKCZwZGV2LT5kZXYpOwogCisJbmFwaV9kaXNhYmxlKCZhZGFwdGVyLT5uYXBpKTsKKwogCWlmICghdGVzdF9iaXQoX19FMTAwMF9ET1dOLCAmYWRhcHRlci0+c3RhdGUpKSB7CiAJCWUxMDAwZV9kb3duKGFkYXB0ZXIpOwogCQllMTAwMF9mcmVlX2lycShhZGFwdGVyKTsKQEAgLTQxNjgsMjIgKzQyNDUsMTkgQEAKIAl1MzIgY3RybCA9IGVyMzIoQ1RSTCk7CiAKIAkvKiBMaW5rIHN0YXR1cyBtZXNzYWdlIG11c3QgZm9sbG93IHRoaXMgZm9ybWF0IGZvciB1c2VyIHRvb2xzICovCi0JcHJpbnRrKEtFUk5fSU5GTyAiZTEwMDBlOiAlcyBOSUMgTGluayBpcyBVcCAlZCBNYnBzICVzLCAiCi0JICAgICAgICJGbG93IENvbnRyb2w6ICVzXG4iLAotCSAgICAgICBhZGFwdGVyLT5uZXRkZXYtPm5hbWUsCi0JICAgICAgIGFkYXB0ZXItPmxpbmtfc3BlZWQsCi0JICAgICAgIChhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBGVUxMX0RVUExFWCkgPwotCSAgICAgICAiRnVsbCBEdXBsZXgiIDogIkhhbGYgRHVwbGV4IiwKLQkgICAgICAgKChjdHJsICYgRTEwMDBfQ1RSTF9URkNFKSAmJiAoY3RybCAmIEUxMDAwX0NUUkxfUkZDRSkpID8KLQkgICAgICAgIlJ4L1R4IiA6Ci0JICAgICAgICgoY3RybCAmIEUxMDAwX0NUUkxfUkZDRSkgPyAiUngiIDoKLQkJKChjdHJsICYgRTEwMDBfQ1RSTF9URkNFKSA/ICJUeCIgOiAiTm9uZSIpKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiZTEwMDBlOiAlcyBOSUMgTGluayBpcyBVcCAlZCBNYnBzICVzIER1cGxleCwgRmxvdyBDb250cm9sOiAlc1xuIiwKKwkJYWRhcHRlci0+bmV0ZGV2LT5uYW1lLAorCQlhZGFwdGVyLT5saW5rX3NwZWVkLAorCQlhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBGVUxMX0RVUExFWCA/ICJGdWxsIiA6ICJIYWxmIiwKKwkJKGN0cmwgJiBFMTAwMF9DVFJMX1RGQ0UpICYmIChjdHJsICYgRTEwMDBfQ1RSTF9SRkNFKSA/ICJSeC9UeCIgOgorCQkoY3RybCAmIEUxMDAwX0NUUkxfUkZDRSkgPyAiUngiIDoKKwkJKGN0cmwgJiBFMTAwMF9DVFJMX1RGQ0UpID8gIlR4IiA6ICJOb25lIik7CiB9CiAKIHN0YXRpYyBib29sIGUxMDAwZV9oYXNfbGluayhzdHJ1Y3QgZTEwMDBfYWRhcHRlciAqYWRhcHRlcikKIHsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwotCWJvb2wgbGlua19hY3RpdmUgPSAwOworCWJvb2wgbGlua19hY3RpdmUgPSBmYWxzZTsKIAlzMzIgcmV0X3ZhbCA9IDA7CiAKIAkvKgpAQCAtNDE5OCw3ICs0MjcyLDcgQEAKIAkJCXJldF92YWwgPSBody0+bWFjLm9wcy5jaGVja19mb3JfbGluayhodyk7CiAJCQlsaW5rX2FjdGl2ZSA9ICFody0+bWFjLmdldF9saW5rX3N0YXR1czsKIAkJfSBlbHNlIHsKLQkJCWxpbmtfYWN0aXZlID0gMTsKKwkJCWxpbmtfYWN0aXZlID0gdHJ1ZTsKIAkJfQogCQlicmVhazsKIAljYXNlIGUxMDAwX21lZGlhX3R5cGVfZmliZXI6CkBAIC00Mjk3LDcgKzQzNzEsNyBAQAogCiAJaWYgKGxpbmspIHsKIAkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKLQkJCWJvb2wgdHhiMmIgPSAxOworCQkJYm9vbCB0eGIyYiA9IHRydWU7CiAKIAkJCS8qIENhbmNlbCBzY2hlZHVsZWQgc3VzcGVuZCByZXF1ZXN0cy4gKi8KIAkJCXBtX3J1bnRpbWVfcmVzdW1lKG5ldGRldi0+ZGV2LnBhcmVudCk7CkBAIC00MzIzLDIxICs0Mzk3LDE4IEBACiAJCQkJZTFlX3JwaHkoaHcsIFBIWV9BVVRPTkVHX0VYUCwgJmF1dG9uZWdfZXhwKTsKIAogCQkJCWlmICghKGF1dG9uZWdfZXhwICYgTldBWV9FUl9MUF9OV0FZX0NBUFMpKQotCQkJCQllX2luZm8oIkF1dG9uZWdvdGlhdGVkIGhhbGYgZHVwbGV4IGJ1dCIKLQkJCQkJICAgICAgICIgbGluayBwYXJ0bmVyIGNhbm5vdCBhdXRvbmVnLiAiCi0JCQkJCSAgICAgICAiIFRyeSBmb3JjaW5nIGZ1bGwgZHVwbGV4IGlmICIKLQkJCQkJICAgICAgICJsaW5rIGdldHMgbWFueSBjb2xsaXNpb25zLlxuIik7CisJCQkJCWVfaW5mbygiQXV0b25lZ290aWF0ZWQgaGFsZiBkdXBsZXggYnV0IGxpbmsgcGFydG5lciBjYW5ub3QgYXV0b25lZy4gIFRyeSBmb3JjaW5nIGZ1bGwgZHVwbGV4IGlmIGxpbmsgZ2V0cyBtYW55IGNvbGxpc2lvbnMuXG4iKTsKIAkJCX0KIAogCQkJLyogYWRqdXN0IHRpbWVvdXQgZmFjdG9yIGFjY29yZGluZyB0byBzcGVlZC9kdXBsZXggKi8KIAkJCWFkYXB0ZXItPnR4X3RpbWVvdXRfZmFjdG9yID0gMTsKIAkJCXN3aXRjaCAoYWRhcHRlci0+bGlua19zcGVlZCkgewogCQkJY2FzZSBTUEVFRF8xMDoKLQkJCQl0eGIyYiA9IDA7CisJCQkJdHhiMmIgPSBmYWxzZTsKIAkJCQlhZGFwdGVyLT50eF90aW1lb3V0X2ZhY3RvciA9IDE2OwogCQkJCWJyZWFrOwogCQkJY2FzZSBTUEVFRF8xMDA6Ci0JCQkJdHhiMmIgPSAwOworCQkJCXR4YjJiID0gZmFsc2U7CiAJCQkJYWRhcHRlci0+dHhfdGltZW91dF9mYWN0b3IgPSAxMDsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTQ0NzMsNyArNDU0NCw3IEBACiAJZTEwMDBlX2ZsdXNoX2Rlc2NyaXB0b3JzKGFkYXB0ZXIpOwogCiAJLyogRm9yY2UgZGV0ZWN0aW9uIG9mIGh1bmcgY29udHJvbGxlciBldmVyeSB3YXRjaGRvZyBwZXJpb2QgKi8KLQlhZGFwdGVyLT5kZXRlY3RfdHhfaHVuZyA9IDE7CisJYWRhcHRlci0+ZGV0ZWN0X3R4X2h1bmcgPSB0cnVlOwogCiAJLyoKIAkgKiBXaXRoIDgyNTcxIGNvbnRyb2xsZXJzLCBMQUEgbWF5IGJlIG92ZXJ3cml0dGVuIGR1ZSB0byBjb250cm9sbGVyCkBAIC00OTg1LDYgKzUwNTYsNyBAQAogCS8qIGlmIGNvdW50IGlzIDAgdGhlbiBtYXBwaW5nIGVycm9yIGhhcyBvY2N1cnJlZCAqLwogCWNvdW50ID0gZTEwMDBfdHhfbWFwKGFkYXB0ZXIsIHNrYiwgZmlyc3QsIG1heF9wZXJfdHhkLCBucl9mcmFncywgbXNzKTsKIAlpZiAoY291bnQpIHsKKwkJbmV0ZGV2X3NlbnRfcXVldWUobmV0ZGV2LCBza2ItPmxlbik7CiAJCWUxMDAwX3R4X3F1ZXVlKGFkYXB0ZXIsIHR4X2ZsYWdzLCBjb3VudCk7CiAJCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgcmluZyBmb3IgdGhlIG5leHQgc2VuZC4gKi8KIAkJZTEwMDBfbWF5YmVfc3RvcF90eChuZXRkZXYsIE1BWF9TS0JfRlJBR1MgKyAyKTsKQEAgLTUxMTAsOCArNTE4Miw3IEBACiAJaWYgKChhZGFwdGVyLT5ody5tYWMudHlwZSA9PSBlMTAwMF9wY2gybGFuKSAmJgogCSAgICAhKGFkYXB0ZXItPmZsYWdzMiAmIEZMQUcyX0NSQ19TVFJJUFBJTkcpICYmCiAJICAgIChuZXdfbXR1ID4gRVRIX0RBVEFfTEVOKSkgewotCQllX2VycigiSnVtYm8gRnJhbWVzIG5vdCBzdXBwb3J0ZWQgb24gODI1Nzkgd2hlbiBDUkMgIgotCQkgICAgICAic3RyaXBwaW5nIGlzIGRpc2FibGVkLlxuIik7CisJCWVfZXJyKCJKdW1ibyBGcmFtZXMgbm90IHN1cHBvcnRlZCBvbiA4MjU3OSB3aGVuIENSQyBzdHJpcHBpbmcgaXMgZGlzYWJsZWQuXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC01MzMxLDcgKzU0MDIsNyBAQAogCiAJaWYgKHd1ZmMpIHsKIAkJZTEwMDBfc2V0dXBfcmN0bChhZGFwdGVyKTsKLQkJZTEwMDBfc2V0X211bHRpKG5ldGRldik7CisJCWUxMDAwZV9zZXRfcnhfbW9kZShuZXRkZXYpOwogCiAJCS8qIHR1cm4gb24gYWxsLW11bHRpIG1vZGUgaWYgd2FrZSBvbiBtdWx0aWNhc3QgaXMgZW5hYmxlZCAqLwogCQlpZiAod3VmYyAmIEUxMDAwX1dVRkNfTUMpIHsKQEAgLTU1MjcsOCArNTU5OCw4IEBACiAJCQkJcGh5X2RhdGEgJiBFMTAwMF9XVVNfTUMgPyAiTXVsdGljYXN0IFBhY2tldCIgOgogCQkJCXBoeV9kYXRhICYgRTEwMDBfV1VTX0JDID8gIkJyb2FkY2FzdCBQYWNrZXQiIDoKIAkJCQlwaHlfZGF0YSAmIEUxMDAwX1dVU19NQUcgPyAiTWFnaWMgUGFja2V0IiA6Ci0JCQkJcGh5X2RhdGEgJiBFMTAwMF9XVVNfTE5LQyA/ICJMaW5rIFN0YXR1cyAiCi0JCQkJIiBDaGFuZ2UiIDogIm90aGVyIik7CisJCQkJcGh5X2RhdGEgJiBFMTAwMF9XVVNfTE5LQyA/CisJCQkJIkxpbmsgU3RhdHVzIENoYW5nZSIgOiAib3RoZXIiKTsKIAkJfQogCQllMWVfd3BoeSgmYWRhcHRlci0+aHcsIEJNX1dVUywgfjApOwogCX0gZWxzZSB7CkBAIC01ODU5LDEwICs1OTMwLDExIEBACiAJfQogfQogCi1zdGF0aWMgaW50IGUxMDAwX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgaW50IGUxMDAwX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBlMTAwMF9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MzIgY2hhbmdlZCA9IGZlYXR1cmVzIF4gbmV0ZGV2LT5mZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdCBjaGFuZ2VkID0gZmVhdHVyZXMgXiBuZXRkZXYtPmZlYXR1cmVzOwogCiAJaWYgKGNoYW5nZWQgJiAoTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYpKQogCQlhZGFwdGVyLT5mbGFncyB8PSBGTEFHX1RTT19GT1JDRTsKQEAgLTU4ODQsNyArNTk1Niw3IEBACiAJLm5kb19zdG9wCQk9IGUxMDAwX2Nsb3NlLAogCS5uZG9fc3RhcnRfeG1pdAkJPSBlMTAwMF94bWl0X2ZyYW1lLAogCS5uZG9fZ2V0X3N0YXRzNjQJPSBlMTAwMGVfZ2V0X3N0YXRzNjQsCi0JLm5kb19zZXRfcnhfbW9kZQk9IGUxMDAwX3NldF9tdWx0aSwKKwkubmRvX3NldF9yeF9tb2RlCT0gZTEwMDBlX3NldF9yeF9tb2RlLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZTEwMDBfc2V0X21hYywKIAkubmRvX2NoYW5nZV9tdHUJCT0gZTEwMDBfY2hhbmdlX210dSwKIAkubmRvX2RvX2lvY3RsCQk9IGUxMDAwX2lvY3RsLApAQCAtNTk0OSw4ICs2MDIxLDcgQEAKIAkJCWVyciA9IGRtYV9zZXRfY29oZXJlbnRfbWFzaygmcGRldi0+ZGV2LAogCQkJCQkJICAgIERNQV9CSVRfTUFTSygzMikpOwogCQkJaWYgKGVycikgewotCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHVzYWJsZSBETUEgIgotCQkJCQkiY29uZmlndXJhdGlvbiwgYWJvcnRpbmdcbiIpOworCQkJCWRldl9lcnIoJnBkZXYtPmRldiwgIk5vIHVzYWJsZSBETUEgY29uZmlndXJhdGlvbiwgYWJvcnRpbmdcbiIpOwogCQkJCWdvdG8gZXJyX2RtYTsKIAkJCX0KIAkJfQpAQCAtNjA3Niw2ICs2MTQ3LDggQEAKIAkJCQkgIE5FVElGX0ZfVFNPNiB8CiAJCQkJICBORVRJRl9GX0hXX0NTVU0pOwogCisJbmV0ZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9VTklDQVNUX0ZMVDsKKwogCWlmIChwY2lfdXNpbmdfZGFjKSB7CiAJCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwogCQluZXRkZXYtPnZsYW5fZmVhdHVyZXMgfD0gTkVUSUZfRl9ISUdIRE1BOwpAQCAtNjEzNSw3ICs2MjA4LDcgQEAKIAogCS8qIEluaXRpYWxpemUgbGluayBwYXJhbWV0ZXJzLiBVc2VyIGNhbiBjaGFuZ2UgdGhlbSB3aXRoIGV0aHRvb2wgKi8KIAlhZGFwdGVyLT5ody5tYWMuYXV0b25lZyA9IDE7Ci0JYWRhcHRlci0+ZmNfYXV0b25lZyA9IDE7CisJYWRhcHRlci0+ZmNfYXV0b25lZyA9IHRydWU7CiAJYWRhcHRlci0+aHcuZmMucmVxdWVzdGVkX21vZGUgPSBlMTAwMF9mY19kZWZhdWx0OwogCWFkYXB0ZXItPmh3LmZjLmN1cnJlbnRfbW9kZSA9IGUxMDAwX2ZjX2RlZmF1bHQ7CiAJYWRhcHRlci0+aHcucGh5LmF1dG9uZWdfYWR2ZXJ0aXNlZCA9IDB4MmY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvZTEwMDBfODI1NzUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF84MjU3NS5jCmluZGV4IDc4ODFmYjkuLmI4ZTIwZjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF84MjU3NS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9lMTAwMF84MjU3NS5jCkBAIC0yOSw2ICsyOSw4IEBACiAgKiBlMTAwMF84MjU3NgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfZXRoZXIuaD4KIApAQCAtMjQ0LDggKzI0Niw3IEBACiAJICogQ2hlY2sgZm9yIGludmFsaWQgc2l6ZQogCSAqLwogCWlmICgoaHctPm1hYy50eXBlID09IGUxMDAwXzgyNTc2KSAmJiAoc2l6ZSA+IDE1KSkgewotCQlwcmludGsoImlnYjogVGhlIE5WTSBzaXplIGlzIG5vdCB2YWxpZCwgIgotCQkJImRlZmF1bHRpbmcgdG8gMzJLLlxuIik7CisJCXByX25vdGljZSgiVGhlIE5WTSBzaXplIGlzIG5vdCB2YWxpZCwgZGVmYXVsdGluZyB0byAzMktcbiIpOwogCQlzaXplID0gMTU7CiAJfQogCW52bS0+d29yZF9zaXplID0gMSA8PCBzaXplOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYi5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYi5oCmluZGV4IGM2OWZlZWIuLjNkMTJlNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYi9pZ2IuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiLmgKQEAgLTQ0Nyw0ICs0NDcsOSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cmluZ190eHEoY29uc3Qgc3RydWN0IGlnYl9yaW5nICp0eF9yaW5nKQoreworCXJldHVybiBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHR4X3JpbmctPm5ldGRldiwgdHhfcmluZy0+cXVldWVfaW5kZXgpOworfQorCiAjZW5kaWYgLyogX0lHQl9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX2V0aHRvb2wuYwppbmRleCA0Mzg3M2ViLi43OTk4YmY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX2V0aHRvb2wuYwpAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aHRvb2wuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CiAKICNpbmNsdWRlICJpZ2IuaCIKIApAQCAtMTQ4LDcgKzE0OSw4IEBACiAJCQkJICAgU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsfAogCQkJCSAgIFNVUFBPUlRFRF9BdXRvbmVnIHwKIAkJCQkgICBTVVBQT1JURURfVFApOwotCQllY21kLT5hZHZlcnRpc2luZyA9IEFEVkVSVElTRURfVFA7CisJCWVjbWQtPmFkdmVydGlzaW5nID0gKEFEVkVSVElTRURfVFAgfAorCQkJCSAgICAgQURWRVJUSVNFRF9QYXVzZSk7CiAKIAkJaWYgKGh3LT5tYWMuYXV0b25lZyA9PSAxKSB7CiAJCQllY21kLT5hZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEX0F1dG9uZWc7CkBAIC0xNjUsNyArMTY3LDggQEAKIAogCQllY21kLT5hZHZlcnRpc2luZyA9IChBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsIHwKIAkJCQkgICAgIEFEVkVSVElTRURfRklCUkUgfAotCQkJCSAgICAgQURWRVJUSVNFRF9BdXRvbmVnKTsKKwkJCQkgICAgIEFEVkVSVElTRURfQXV0b25lZyB8CisJCQkJICAgICBBRFZFUlRJU0VEX1BhdXNlKTsKIAogCQllY21kLT5wb3J0ID0gUE9SVF9GSUJSRTsKIAl9CkBAIC02NzMsMjUgKzY3NiwyMiBAQAogCQkJICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCiB7CiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQljaGFyIGZpcm13YXJlX3ZlcnNpb25bMzJdOwogCXUxNiBlZXByb21fZGF0YTsKIAotCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCAgaWdiX2RyaXZlcl9uYW1lLCBzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSAtIDEpOwotCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgaWdiX2RyaXZlcl92ZXJzaW9uLAotCQlzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikgLSAxKTsKKwlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgIGlnYl9kcml2ZXJfbmFtZSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgaWdiX2RyaXZlcl92ZXJzaW9uLCBzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOwogCiAJLyogRUVQUk9NIGltYWdlIHZlcnNpb24gIyBpcyByZXBvcnRlZCBhcyBmaXJtd2FyZSB2ZXJzaW9uICMgZm9yCiAJICogODI1NzUgY29udHJvbGxlcnMgKi8KIAlhZGFwdGVyLT5ody5udm0ub3BzLnJlYWQoJmFkYXB0ZXItPmh3LCA1LCAxLCAmZWVwcm9tX2RhdGEpOwotCXNwcmludGYoZmlybXdhcmVfdmVyc2lvbiwgIiVkLiVkLSVkIiwKKwlzbnByaW50ZihkcnZpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbiksCisJCSIlZC4lZC0lZCIsCiAJCShlZXByb21fZGF0YSAmIDB4RjAwMCkgPj4gMTIsCiAJCShlZXByb21fZGF0YSAmIDB4MEZGMCkgPj4gNCwKIAkJZWVwcm9tX2RhdGEgJiAweDAwMEYpOwogCi0Jc3RybmNweShkcnZpbmZvLT5md192ZXJzaW9uLCBmaXJtd2FyZV92ZXJzaW9uLAotCQlzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbikgLSAxKTsKLQlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKLQkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSAtIDEpOworCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pKTsKIAlkcnZpbmZvLT5uX3N0YXRzID0gSUdCX1NUQVRTX0xFTjsKIAlkcnZpbmZvLT50ZXN0aW5mb19sZW4gPSBJR0JfVEVTVF9MRU47CiAJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSBpZ2JfZ2V0X3JlZ3NfbGVuKG5ldGRldik7CkBAIC0yMTYyLDYgKzIxNjIsMTkgQEAKIAl9CiB9CiAKK3N0YXRpYyBpbnQgaWdiX2V0aHRvb2xfYmVnaW4oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJmFkYXB0ZXItPnBkZXYtPmRldik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGlnYl9ldGh0b29sX2NvbXBsZXRlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlwbV9ydW50aW1lX3B1dCgmYWRhcHRlci0+cGRldi0+ZGV2KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBpZ2JfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncyAgICAgICAgICAgPSBpZ2JfZ2V0X3NldHRpbmdzLAogCS5zZXRfc2V0dGluZ3MgICAgICAgICAgID0gaWdiX3NldF9zZXR0aW5ncywKQEAgLTIxODgsNiArMjIwMSw4IEBACiAJLmdldF9ldGh0b29sX3N0YXRzICAgICAgPSBpZ2JfZ2V0X2V0aHRvb2xfc3RhdHMsCiAJLmdldF9jb2FsZXNjZSAgICAgICAgICAgPSBpZ2JfZ2V0X2NvYWxlc2NlLAogCS5zZXRfY29hbGVzY2UgICAgICAgICAgID0gaWdiX3NldF9jb2FsZXNjZSwKKwkuYmVnaW4JCQk9IGlnYl9ldGh0b29sX2JlZ2luLAorCS5jb21wbGV0ZQkJPSBpZ2JfZXRodG9vbF9jb21wbGV0ZSwKIH07CiAKIHZvaWQgaWdiX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdiL2lnYl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX21haW4uYwppbmRleCBjZWQ1NDQ0Li4wMWU1ZTg5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2IvaWdiX21haW4uYwpAQCAtMjUsNiArMjUsOCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTUxLDYgKzUzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgogI2luY2x1ZGUgPGxpbnV4L2Flci5oPgogI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvcG1fcnVudGltZS5oPgogI2lmZGVmIENPTkZJR19JR0JfRENBCiAjaW5jbHVkZSA8bGludXgvZGNhLmg+CiAjZW5kaWYKQEAgLTE0NSw5ICsxNDgsOSBAQAogc3RhdGljIGludCBpZ2JfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGlmcmVxICosIGludCBjbWQpOwogc3RhdGljIHZvaWQgaWdiX3R4X3RpbWVvdXQoc3RydWN0IG5ldF9kZXZpY2UgKik7CiBzdGF0aWMgdm9pZCBpZ2JfcmVzZXRfdGFzayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKik7Ci1zdGF0aWMgdm9pZCBpZ2Jfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcyk7Ci1zdGF0aWMgdm9pZCBpZ2Jfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNik7Ci1zdGF0aWMgdm9pZCBpZ2Jfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYpOworc3RhdGljIHZvaWQgaWdiX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyk7CitzdGF0aWMgaW50IGlnYl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2KTsKK3N0YXRpYyBpbnQgaWdiX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2KTsKIHN0YXRpYyB2b2lkIGlnYl9yZXN0b3JlX3ZsYW4oc3RydWN0IGlnYl9hZGFwdGVyICopOwogc3RhdGljIHZvaWQgaWdiX3Jhcl9zZXRfcXNlbChzdHJ1Y3QgaWdiX2FkYXB0ZXIgKiwgdTggKiwgdTMyICwgdTgpOwogc3RhdGljIHZvaWQgaWdiX3BpbmdfYWxsX3ZmcyhzdHJ1Y3QgaWdiX2FkYXB0ZXIgKik7CkBAIC0xNzAsOCArMTczLDE4IEBACiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBpZ2Jfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqLCBwbV9tZXNzYWdlX3QpOwotc3RhdGljIGludCBpZ2JfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICopOworc3RhdGljIGludCBpZ2Jfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICopOworc3RhdGljIGludCBpZ2JfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKik7CisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKK3N0YXRpYyBpbnQgaWdiX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpOworc3RhdGljIGludCBpZ2JfcnVudGltZV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KTsKK3N0YXRpYyBpbnQgaWdiX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpOworI2VuZGlmCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaWdiX3BtX29wcyA9IHsKKwlTRVRfU1lTVEVNX1NMRUVQX1BNX09QUyhpZ2Jfc3VzcGVuZCwgaWdiX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFMoaWdiX3J1bnRpbWVfc3VzcGVuZCwgaWdiX3J1bnRpbWVfcmVzdW1lLAorCQkJaWdiX3J1bnRpbWVfaWRsZSkKK307CiAjZW5kaWYKIHN0YXRpYyB2b2lkIGlnYl9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqKTsKICNpZmRlZiBDT05GSUdfSUdCX0RDQQpAQCAtMjEyLDkgKzIyNSw3IEBACiAJLnByb2JlICAgID0gaWdiX3Byb2JlLAogCS5yZW1vdmUgICA9IF9fZGV2ZXhpdF9wKGlnYl9yZW1vdmUpLAogI2lmZGVmIENPTkZJR19QTQotCS8qIFBvd2VyIE1hbmFnZW1lbnQgSG9va3MgKi8KLQkuc3VzcGVuZCAgPSBpZ2Jfc3VzcGVuZCwKLQkucmVzdW1lICAgPSBpZ2JfcmVzdW1lLAorCS5kcml2ZXIucG0gPSAmaWdiX3BtX29wcywKICNlbmRpZgogCS5zaHV0ZG93biA9IGlnYl9zaHV0ZG93biwKIAkuZXJyX2hhbmRsZXIgPSAmaWdiX2Vycl9oYW5kbGVyCkBAIC0zMjUsMTYgKzMzNiwxMyBAQAogCQkJcmVnc1tuXSA9IHJkMzIoRTEwMDBfVFhEQ1RMKG4pKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcHJpbnRrKEtFUk5fSU5GTyAiJS0xNXMgJTA4eFxuIiwKLQkJCXJlZ2luZm8tPm5hbWUsIHJkMzIocmVnaW5mby0+b2ZzKSk7CisJCXByX2luZm8oIiUtMTVzICUwOHhcbiIsIHJlZ2luZm8tPm5hbWUsIHJkMzIocmVnaW5mby0+b2ZzKSk7CiAJCXJldHVybjsKIAl9CiAKIAlzbnByaW50ZihybmFtZSwgMTYsICIlcyVzIiwgcmVnaW5mby0+bmFtZSwgIlswLTNdIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJS0xNXMgIiwgcm5hbWUpOwotCWZvciAobiA9IDA7IG4gPCA0OyBuKyspCi0JCXByaW50ayhLRVJOX0NPTlQgIiUwOHggIiwgcmVnc1tuXSk7Ci0JcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwlwcl9pbmZvKCIlLTE1cyAlMDh4ICUwOHggJTA4eCAlMDh4XG4iLCBybmFtZSwgcmVnc1swXSwgcmVnc1sxXSwKKwkJcmVnc1syXSwgcmVnc1szXSk7CiB9CiAKIC8qCkBAIC0zNTksMTggKzM2NywxNSBAQAogCS8qIFByaW50IG5ldGRldmljZSBJbmZvICovCiAJaWYgKG5ldGRldikgewogCQlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiTmV0IGRldmljZSBJbmZvXG4iKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRGV2aWNlIE5hbWUgICAgIHN0YXRlICAgICAgICAgICAgIgotCQkJInRyYW5zX3N0YXJ0ICAgICAgbGFzdF9yeFxuIik7Ci0JCXByaW50ayhLRVJOX0lORk8gIiUtMTVzICUwMTZsWCAlMDE2bFggJTAxNmxYXG4iLAotCQluZXRkZXYtPm5hbWUsCi0JCW5ldGRldi0+c3RhdGUsCi0JCW5ldGRldi0+dHJhbnNfc3RhcnQsCi0JCW5ldGRldi0+bGFzdF9yeCk7CisJCXByX2luZm8oIkRldmljZSBOYW1lICAgICBzdGF0ZSAgICAgICAgICAgIHRyYW5zX3N0YXJ0ICAgICAgIgorCQkJImxhc3RfcnhcbiIpOworCQlwcl9pbmZvKCIlLTE1cyAlMDE2bFggJTAxNmxYICUwMTZsWFxuIiwgbmV0ZGV2LT5uYW1lLAorCQkJbmV0ZGV2LT5zdGF0ZSwgbmV0ZGV2LT50cmFuc19zdGFydCwgbmV0ZGV2LT5sYXN0X3J4KTsKIAl9CiAKIAkvKiBQcmludCBSZWdpc3RlcnMgKi8KIAlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiUmVnaXN0ZXIgRHVtcFxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiIFJlZ2lzdGVyIE5hbWUgICBWYWx1ZVxuIik7CisJcHJfaW5mbygiIFJlZ2lzdGVyIE5hbWUgICBWYWx1ZVxuIik7CiAJZm9yIChyZWdpbmZvID0gKHN0cnVjdCBpZ2JfcmVnX2luZm8gKilpZ2JfcmVnX2luZm9fdGJsOwogCSAgICAgcmVnaW5mby0+bmFtZTsgcmVnaW5mbysrKSB7CiAJCWlnYl9yZWdkdW1wKGh3LCByZWdpbmZvKTsKQEAgLTM4MSwxOCArMzg2LDE3IEBACiAJCWdvdG8gZXhpdDsKIAogCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJUWCBSaW5ncyBTdW1tYXJ5XG4iKTsKLQlwcmludGsoS0VSTl9JTkZPICJRdWV1ZSBbTlRVXSBbTlRDXSBbYmkobnRjKS0+ZG1hICBdIgotCQkiIGxlbmcgbnR3IHRpbWVzdGFtcFxuIik7CisJcHJfaW5mbygiUXVldWUgW05UVV0gW05UQ10gW2JpKG50YyktPmRtYSAgXSBsZW5nIG50dyB0aW1lc3RhbXBcbiIpOwogCWZvciAobiA9IDA7IG4gPCBhZGFwdGVyLT5udW1fdHhfcXVldWVzOyBuKyspIHsKIAkJc3RydWN0IGlnYl90eF9idWZmZXIgKmJ1ZmZlcl9pbmZvOwogCQl0eF9yaW5nID0gYWRhcHRlci0+dHhfcmluZ1tuXTsKIAkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+dHhfYnVmZmVyX2luZm9bdHhfcmluZy0+bmV4dF90b19jbGVhbl07Ci0JCXByaW50ayhLRVJOX0lORk8gIiAlNWQgJTVYICU1WCAlMDE2bGxYICUwNFggJXAgJTAxNmxsWFxuIiwKLQkJCSAgIG4sIHR4X3JpbmctPm5leHRfdG9fdXNlLCB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuLAotCQkJICAgKHU2NClidWZmZXJfaW5mby0+ZG1hLAotCQkJICAgYnVmZmVyX2luZm8tPmxlbmd0aCwKLQkJCSAgIGJ1ZmZlcl9pbmZvLT5uZXh0X3RvX3dhdGNoLAotCQkJICAgKHU2NClidWZmZXJfaW5mby0+dGltZV9zdGFtcCk7CisJCXByX2luZm8oIiAlNWQgJTVYICU1WCAlMDE2bGxYICUwNFggJXAgJTAxNmxsWFxuIiwKKwkJCW4sIHR4X3JpbmctPm5leHRfdG9fdXNlLCB0eF9yaW5nLT5uZXh0X3RvX2NsZWFuLAorCQkJKHU2NClidWZmZXJfaW5mby0+ZG1hLAorCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwKKwkJCWJ1ZmZlcl9pbmZvLT5uZXh0X3RvX3dhdGNoLAorCQkJKHU2NClidWZmZXJfaW5mby0+dGltZV9zdGFtcCk7CiAJfQogCiAJLyogUHJpbnQgVFggUmluZ3MgKi8KQEAgLTQxNCwzNiArNDE4LDM4IEBACiAKIAlmb3IgKG4gPSAwOyBuIDwgYWRhcHRlci0+bnVtX3R4X3F1ZXVlczsgbisrKSB7CiAJCXR4X3JpbmcgPSBhZGFwdGVyLT50eF9yaW5nW25dOwotCQlwcmludGsoS0VSTl9JTkZPICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwotCQlwcmludGsoS0VSTl9JTkZPICJUWCBRVUVVRSBJTkRFWCA9ICVkXG4iLCB0eF9yaW5nLT5xdWV1ZV9pbmRleCk7Ci0JCXByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JCXByaW50ayhLRVJOX0lORk8gIlQgW2Rlc2NdICAgICBbYWRkcmVzcyA2MzowICBdICIKLQkJCSJbUGxQT0NJU3RERE0gTG5dIFtiaS0+ZG1hICAgICAgIF0gIgotCQkJImxlbmcgIG50dyB0aW1lc3RhbXAgICAgICAgIGJpLT5za2JcbiIpOworCQlwcl9pbmZvKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlwcl9pbmZvKCJUWCBRVUVVRSBJTkRFWCA9ICVkXG4iLCB0eF9yaW5nLT5xdWV1ZV9pbmRleCk7CisJCXByX2luZm8oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCXByX2luZm8oIlQgW2Rlc2NdICAgICBbYWRkcmVzcyA2MzowICBdIFtQbFBPQ0lTdERETSBMbl0gIgorCQkJIltiaS0+ZG1hICAgICAgIF0gbGVuZyAgbnR3IHRpbWVzdGFtcCAgICAgICAgIgorCQkJImJpLT5za2JcbiIpOwogCiAJCWZvciAoaSA9IDA7IHR4X3JpbmctPmRlc2MgJiYgKGkgPCB0eF9yaW5nLT5jb3VudCk7IGkrKykgeworCQkJY29uc3QgY2hhciAqbmV4dF9kZXNjOwogCQkJc3RydWN0IGlnYl90eF9idWZmZXIgKmJ1ZmZlcl9pbmZvOwogCQkJdHhfZGVzYyA9IElHQl9UWF9ERVNDKHR4X3JpbmcsIGkpOwogCQkJYnVmZmVyX2luZm8gPSAmdHhfcmluZy0+dHhfYnVmZmVyX2luZm9baV07CiAJCQl1MCA9IChzdHJ1Y3QgbXlfdTAgKil0eF9kZXNjOwotCQkJcHJpbnRrKEtFUk5fSU5GTyAiVCBbMHglMDNYXSAgICAlMDE2bGxYICUwMTZsbFggJTAxNmxsWCIKLQkJCQkiICUwNFggICVwICUwMTZsbFggJXAiLCBpLAorCQkJaWYgKGkgPT0gdHhfcmluZy0+bmV4dF90b191c2UgJiYKKwkJCSAgICBpID09IHR4X3JpbmctPm5leHRfdG9fY2xlYW4pCisJCQkJbmV4dF9kZXNjID0gIiBOVEMvVSI7CisJCQllbHNlIGlmIChpID09IHR4X3JpbmctPm5leHRfdG9fdXNlKQorCQkJCW5leHRfZGVzYyA9ICIgTlRVIjsKKwkJCWVsc2UgaWYgKGkgPT0gdHhfcmluZy0+bmV4dF90b19jbGVhbikKKwkJCQluZXh0X2Rlc2MgPSAiIE5UQyI7CisJCQllbHNlCisJCQkJbmV4dF9kZXNjID0gIiI7CisKKwkJCXByX2luZm8oIlQgWzB4JTAzWF0gICAgJTAxNmxsWCAlMDE2bGxYICUwMTZsbFgiCisJCQkJIiAlMDRYICAlcCAlMDE2bGxYICVwJXNcbiIsIGksCiAJCQkJbGU2NF90b19jcHUodTAtPmEpLAogCQkJCWxlNjRfdG9fY3B1KHUwLT5iKSwKIAkJCQkodTY0KWJ1ZmZlcl9pbmZvLT5kbWEsCiAJCQkJYnVmZmVyX2luZm8tPmxlbmd0aCwKIAkJCQlidWZmZXJfaW5mby0+bmV4dF90b193YXRjaCwKIAkJCQkodTY0KWJ1ZmZlcl9pbmZvLT50aW1lX3N0YW1wLAotCQkJCWJ1ZmZlcl9pbmZvLT5za2IpOwotCQkJaWYgKGkgPT0gdHhfcmluZy0+bmV4dF90b191c2UgJiYKLQkJCQlpID09IHR4X3JpbmctPm5leHRfdG9fY2xlYW4pCi0JCQkJcHJpbnRrKEtFUk5fQ09OVCAiIE5UQy9VXG4iKTsKLQkJCWVsc2UgaWYgKGkgPT0gdHhfcmluZy0+bmV4dF90b191c2UpCi0JCQkJcHJpbnRrKEtFUk5fQ09OVCAiIE5UVVxuIik7Ci0JCQllbHNlIGlmIChpID09IHR4X3JpbmctPm5leHRfdG9fY2xlYW4pCi0JCQkJcHJpbnRrKEtFUk5fQ09OVCAiIE5UQ1xuIik7Ci0JCQllbHNlCi0JCQkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwkJCQlidWZmZXJfaW5mby0+c2tiLCBuZXh0X2Rlc2MpOwogCiAJCQlpZiAobmV0aWZfbXNnX3BrdGRhdGEoYWRhcHRlcikgJiYgYnVmZmVyX2luZm8tPmRtYSAhPSAwKQogCQkJCXByaW50X2hleF9kdW1wKEtFUk5fSU5GTywgIiIsCkBAIC00NTYsMTEgKzQ2MiwxMSBAQAogCS8qIFByaW50IFJYIFJpbmdzIFN1bW1hcnkgKi8KIHJ4X3Jpbmdfc3VtbWFyeToKIAlkZXZfaW5mbygmYWRhcHRlci0+cGRldi0+ZGV2LCAiUlggUmluZ3MgU3VtbWFyeVxuIik7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiUXVldWUgW05UVV0gW05UQ11cbiIpOworCXByX2luZm8oIlF1ZXVlIFtOVFVdIFtOVENdXG4iKTsKIAlmb3IgKG4gPSAwOyBuIDwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsgbisrKSB7CiAJCXJ4X3JpbmcgPSBhZGFwdGVyLT5yeF9yaW5nW25dOwotCQlwcmludGsoS0VSTl9JTkZPICIgJTVkICU1WCAlNVhcbiIsIG4sCi0JCQkgICByeF9yaW5nLT5uZXh0X3RvX3VzZSwgcnhfcmluZy0+bmV4dF90b19jbGVhbik7CisJCXByX2luZm8oIiAlNWQgJTVYICU1WFxuIiwKKwkJCW4sIHJ4X3JpbmctPm5leHRfdG9fdXNlLCByeF9yaW5nLT5uZXh0X3RvX2NsZWFuKTsKIAl9CiAKIAkvKiBQcmludCBSWCBSaW5ncyAqLwpAQCAtNDkyLDM2ICs0OTgsNDMgQEAKIAogCWZvciAobiA9IDA7IG4gPCBhZGFwdGVyLT5udW1fcnhfcXVldWVzOyBuKyspIHsKIAkJcnhfcmluZyA9IGFkYXB0ZXItPnJ4X3Jpbmdbbl07Ci0JCXByaW50ayhLRVJOX0lORk8gIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0JCXByaW50ayhLRVJOX0lORk8gIlJYIFFVRVVFIElOREVYID0gJWRcbiIsIHJ4X3JpbmctPnF1ZXVlX2luZGV4KTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiUiAgW2Rlc2NdICAgICAgWyBQa3RCdWYgICAgIEEwXSAiCi0JCQkiWyAgSGVhZEJ1ZiAgIEREXSBbYmktPmRtYSAgICAgICBdIFtiaS0+c2tiXSAiCi0JCQkiPC0tIEFkdiBSeCBSZWFkIGZvcm1hdFxuIik7Ci0JCXByaW50ayhLRVJOX0lORk8gIlJXQltkZXNjXSAgICAgIFtQY3NtSXBTSGwgUHRSc10gIgotCQkJIlt2bCBlciBTIGNrcyBsbl0gLS0tLS0tLS0tLS0tLS0tLSBbYmktPnNrYl0gIgotCQkJIjwtLSBBZHYgUnggV3JpdGUtQmFjayBmb3JtYXRcbiIpOworCQlwcl9pbmZvKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCQlwcl9pbmZvKCJSWCBRVUVVRSBJTkRFWCA9ICVkXG4iLCByeF9yaW5nLT5xdWV1ZV9pbmRleCk7CisJCXByX2luZm8oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJCXByX2luZm8oIlIgIFtkZXNjXSAgICAgIFsgUGt0QnVmICAgICBBMF0gWyAgSGVhZEJ1ZiAgIEREXSAiCisJCQkiW2JpLT5kbWEgICAgICAgXSBbYmktPnNrYl0gPC0tIEFkdiBSeCBSZWFkIGZvcm1hdFxuIik7CisJCXByX2luZm8oIlJXQltkZXNjXSAgICAgIFtQY3NtSXBTSGwgUHRSc10gW3ZsIGVyIFMgY2tzIGxuXSAtLS0tLSIKKwkJCSItLS0tLS0tLS0tLSBbYmktPnNrYl0gPC0tIEFkdiBSeCBXcml0ZS1CYWNrIGZvcm1hdFxuIik7CiAKIAkJZm9yIChpID0gMDsgaSA8IHJ4X3JpbmctPmNvdW50OyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKm5leHRfZGVzYzsKIAkJCXN0cnVjdCBpZ2JfcnhfYnVmZmVyICpidWZmZXJfaW5mbzsKIAkJCWJ1ZmZlcl9pbmZvID0gJnJ4X3JpbmctPnJ4X2J1ZmZlcl9pbmZvW2ldOwogCQkJcnhfZGVzYyA9IElHQl9SWF9ERVNDKHJ4X3JpbmcsIGkpOwogCQkJdTAgPSAoc3RydWN0IG15X3UwICopcnhfZGVzYzsKIAkJCXN0YXRlcnIgPSBsZTMyX3RvX2NwdShyeF9kZXNjLT53Yi51cHBlci5zdGF0dXNfZXJyb3IpOworCisJCQlpZiAoaSA9PSByeF9yaW5nLT5uZXh0X3RvX3VzZSkKKwkJCQluZXh0X2Rlc2MgPSAiIE5UVSI7CisJCQllbHNlIGlmIChpID09IHJ4X3JpbmctPm5leHRfdG9fY2xlYW4pCisJCQkJbmV4dF9kZXNjID0gIiBOVEMiOworCQkJZWxzZQorCQkJCW5leHRfZGVzYyA9ICIiOworCiAJCQlpZiAoc3RhdGVyciAmIEUxMDAwX1JYRF9TVEFUX0REKSB7CiAJCQkJLyogRGVzY3JpcHRvciBEb25lICovCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiUldCWzB4JTAzWF0gICAgICUwMTZsbFggIgotCQkJCQkiJTAxNmxsWCAtLS0tLS0tLS0tLS0tLS0tICVwIiwgaSwKKwkJCQlwcl9pbmZvKCIlc1sweCUwM1hdICAgICAlMDE2bGxYICUwMTZsbFggLS0tLS0tLSIKKwkJCQkJIi0tLS0tLS0tLSAlcCVzXG4iLCAiUldCIiwgaSwKIAkJCQkJbGU2NF90b19jcHUodTAtPmEpLAogCQkJCQlsZTY0X3RvX2NwdSh1MC0+YiksCi0JCQkJCWJ1ZmZlcl9pbmZvLT5za2IpOworCQkJCQlidWZmZXJfaW5mby0+c2tiLCBuZXh0X2Rlc2MpOwogCQkJfSBlbHNlIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJSICBbMHglMDNYXSAgICAgJTAxNmxsWCAiCi0JCQkJCSIlMDE2bGxYICUwMTZsbFggJXAiLCBpLAorCQkJCXByX2luZm8oIiVzWzB4JTAzWF0gICAgICUwMTZsbFggJTAxNmxsWCAlMDE2bGxYIgorCQkJCQkiICVwJXNcbiIsICJSICAiLCBpLAogCQkJCQlsZTY0X3RvX2NwdSh1MC0+YSksCiAJCQkJCWxlNjRfdG9fY3B1KHUwLT5iKSwKIAkJCQkJKHU2NClidWZmZXJfaW5mby0+ZG1hLAotCQkJCQlidWZmZXJfaW5mby0+c2tiKTsKKwkJCQkJYnVmZmVyX2luZm8tPnNrYiwgbmV4dF9kZXNjKTsKIAogCQkJCWlmIChuZXRpZl9tc2dfcGt0ZGF0YShhZGFwdGVyKSkgewogCQkJCQlwcmludF9oZXhfZHVtcChLRVJOX0lORk8sICIiLApAQCAtNTM4LDE0ICs1NTEsNiBAQAogCQkJCQkgIFBBR0VfU0laRS8yLCB0cnVlKTsKIAkJCQl9CiAJCQl9Ci0KLQkJCWlmIChpID09IHJ4X3JpbmctPm5leHRfdG9fdXNlKQotCQkJCXByaW50ayhLRVJOX0NPTlQgIiBOVFVcbiIpOwotCQkJZWxzZSBpZiAoaSA9PSByeF9yaW5nLT5uZXh0X3RvX2NsZWFuKQotCQkJCXByaW50ayhLRVJOX0NPTlQgIiBOVENcbiIpOwotCQkJZWxzZQotCQkJCXByaW50ayhLRVJOX0NPTlQgIlxuIik7Ci0KIAkJfQogCX0KIApAQCAtNTk5LDEwICs2MDQsMTAgQEAKIHN0YXRpYyBpbnQgX19pbml0IGlnYl9pbml0X21vZHVsZSh2b2lkKQogewogCWludCByZXQ7Ci0JcHJpbnRrKEtFUk5fSU5GTyAiJXMgLSB2ZXJzaW9uICVzXG4iLAorCXByX2luZm8oIiVzIC0gdmVyc2lvbiAlc1xuIiwKIAkgICAgICAgaWdiX2RyaXZlcl9zdHJpbmcsIGlnYl9kcml2ZXJfdmVyc2lvbik7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgaWdiX2NvcHlyaWdodCk7CisJcHJfaW5mbygiJXNcbiIsIGlnYl9jb3B5cmlnaHQpOwogCiAjaWZkZWYgQ09ORklHX0lHQl9EQ0EKIAlkY2FfcmVnaXN0ZXJfbm90aWZ5KCZkY2Ffbm90aWZpZXIpOwpAQCAtMTUwMiw2ICsxNTA3LDcgQEAKIAkJaWdiX3Bvd2VyX3VwX3BoeV9jb3BwZXIoJmFkYXB0ZXItPmh3KTsKIAllbHNlCiAJCWlnYl9wb3dlcl91cF9zZXJkZXNfbGlua184MjU3NSgmYWRhcHRlci0+aHcpOworCWlnYl9yZXNldF9waHkoJmFkYXB0ZXItPmh3KTsKIH0KIAogLyoqCkBAIC0xNzQyLDcgKzE3NDgsOCBAQAogCWlnYl9nZXRfcGh5X2luZm8oaHcpOwogfQogCi1zdGF0aWMgdTMyIGlnYl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IGlnYl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAkvKgogCSAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHJ4L3R4IHZsYW4gYWNjZWwKQEAgLTE3NTYsOSArMTc2MywxMCBAQAogCXJldHVybiBmZWF0dXJlczsKIH0KIAotc3RhdGljIGludCBpZ2Jfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgaWdiX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewotCXUzMiBjaGFuZ2VkID0gbmV0ZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBuZXRkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CiAKIAlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKIAkJaWdiX3ZsYW5fbW9kZShuZXRkZXYsIGZlYXR1cmVzKTsKQEAgLTIxMTMsNiArMjEyMSw4IEBACiAJZGVmYXVsdDoKIAkJYnJlYWs7CiAJfQorCisJcG1fcnVudGltZV9wdXRfbm9pZGxlKCZwZGV2LT5kZXYpOwogCXJldHVybiAwOwogCiBlcnJfcmVnaXN0ZXI6CkBAIC0yMTUyLDYgKzIxNjIsOCBAQAogCXN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKIAorCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKCZwZGV2LT5kZXYpOworCiAJLyoKIAkgKiBUaGUgd2F0Y2hkb2cgdGltZXIgbWF5IGJlIHJlc2NoZWR1bGVkLCBzbyBleHBsaWNpdGx5CiAJICogZGlzYWJsZSB3YXRjaGRvZyBmcm9tIGJlaW5nIHJlc2NoZWR1bGVkLgpAQCAtMjQ3NCwxNiArMjQ4NiwyMiBAQAogICogaGFuZGxlciBpcyByZWdpc3RlcmVkIHdpdGggdGhlIE9TLCB0aGUgd2F0Y2hkb2cgdGltZXIgaXMgc3RhcnRlZCwKICAqIGFuZCB0aGUgc3RhY2sgaXMgbm90aWZpZWQgdGhhdCB0aGUgaW50ZXJmYWNlIGlzIHJlYWR5LgogICoqLwotc3RhdGljIGludCBpZ2Jfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQorc3RhdGljIGludCBfX2lnYl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGJvb2wgcmVzdW1pbmcpCiB7CiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAlpbnQgZXJyOwogCWludCBpOwogCiAJLyogZGlzYWxsb3cgb3BlbiBkdXJpbmcgdGVzdCAqLwotCWlmICh0ZXN0X2JpdChfX0lHQl9URVNUSU5HLCAmYWRhcHRlci0+c3RhdGUpKQorCWlmICh0ZXN0X2JpdChfX0lHQl9URVNUSU5HLCAmYWRhcHRlci0+c3RhdGUpKSB7CisJCVdBUk5fT04ocmVzdW1pbmcpOwogCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICghcmVzdW1pbmcpCisJCXBtX3J1bnRpbWVfZ2V0X3N5bmMoJnBkZXYtPmRldik7CiAKIAluZXRpZl9jYXJyaWVyX29mZihuZXRkZXYpOwogCkBAIC0yNTI5LDYgKzI1NDcsOSBAQAogCiAJbmV0aWZfdHhfc3RhcnRfYWxsX3F1ZXVlcyhuZXRkZXYpOwogCisJaWYgKCFyZXN1bWluZykKKwkJcG1fcnVudGltZV9wdXQoJnBkZXYtPmRldik7CisKIAkvKiBzdGFydCB0aGUgd2F0Y2hkb2cuICovCiAJaHctPm1hYy5nZXRfbGlua19zdGF0dXMgPSAxOwogCXNjaGVkdWxlX3dvcmsoJmFkYXB0ZXItPndhdGNoZG9nX3Rhc2spOwpAQCAtMjU0MywxMCArMjU2NCwxNyBAQAogCWlnYl9mcmVlX2FsbF90eF9yZXNvdXJjZXMoYWRhcHRlcik7CiBlcnJfc2V0dXBfdHg6CiAJaWdiX3Jlc2V0KGFkYXB0ZXIpOworCWlmICghcmVzdW1pbmcpCisJCXBtX3J1bnRpbWVfcHV0KCZwZGV2LT5kZXYpOwogCiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIGludCBpZ2Jfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXJldHVybiBfX2lnYl9vcGVuKG5ldGRldiwgZmFsc2UpOworfQorCiAvKioKICAqIGlnYl9jbG9zZSAtIERpc2FibGVzIGEgbmV0d29yayBpbnRlcmZhY2UKICAqIEBuZXRkZXY6IG5ldHdvcmsgaW50ZXJmYWNlIGRldmljZSBzdHJ1Y3R1cmUKQEAgLTI1NTgsMjEgKzI1ODYsMzIgQEAKICAqIG5lZWRzIHRvIGJlIGRpc2FibGVkLiAgQSBnbG9iYWwgTUFDIHJlc2V0IGlzIGlzc3VlZCB0byBzdG9wIHRoZQogICogaGFyZHdhcmUsIGFuZCBhbGwgdHJhbnNtaXQgYW5kIHJlY2VpdmUgcmVzb3VyY2VzIGFyZSBmcmVlZC4KICAqKi8KLXN0YXRpYyBpbnQgaWdiX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCitzdGF0aWMgaW50IF9faWdiX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGJvb2wgc3VzcGVuZGluZykKIHsKIAlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gYWRhcHRlci0+cGRldjsKIAogCVdBUk5fT04odGVzdF9iaXQoX19JR0JfUkVTRVRUSU5HLCAmYWRhcHRlci0+c3RhdGUpKTsKLQlpZ2JfZG93bihhZGFwdGVyKTsKIAorCWlmICghc3VzcGVuZGluZykKKwkJcG1fcnVudGltZV9nZXRfc3luYygmcGRldi0+ZGV2KTsKKworCWlnYl9kb3duKGFkYXB0ZXIpOwogCWlnYl9mcmVlX2lycShhZGFwdGVyKTsKIAogCWlnYl9mcmVlX2FsbF90eF9yZXNvdXJjZXMoYWRhcHRlcik7CiAJaWdiX2ZyZWVfYWxsX3J4X3Jlc291cmNlcyhhZGFwdGVyKTsKIAorCWlmICghc3VzcGVuZGluZykKKwkJcG1fcnVudGltZV9wdXRfc3luYygmcGRldi0+ZGV2KTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBpZ2JfY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gX19pZ2JfY2xvc2UobmV0ZGV2LCBmYWxzZSk7Cit9CisKIC8qKgogICogaWdiX3NldHVwX3R4X3Jlc291cmNlcyAtIGFsbG9jYXRlIFR4IHJlc291cmNlcyAoRGVzY3JpcHRvcnMpCiAgKiBAdHhfcmluZzogdHggZGVzY3JpcHRvciByaW5nIChmb3IgYSBzcGVjaWZpYyBxdWV1ZSkgdG8gc2V0dXAKQEAgLTMyMDMsNiArMzI0Miw3IEBACiAJCWJ1ZmZlcl9pbmZvID0gJnR4X3JpbmctPnR4X2J1ZmZlcl9pbmZvW2ldOwogCQlpZ2JfdW5tYXBfYW5kX2ZyZWVfdHhfcmVzb3VyY2UodHhfcmluZywgYnVmZmVyX2luZm8pOwogCX0KKwluZXRkZXZfdHhfcmVzZXRfcXVldWUodHhyaW5nX3R4cSh0eF9yaW5nKSk7CiAKIAlzaXplID0gc2l6ZW9mKHN0cnVjdCBpZ2JfdHhfYnVmZmVyKSAqIHR4X3JpbmctPmNvdW50OwogCW1lbXNldCh0eF9yaW5nLT50eF9idWZmZXJfaW5mbywgMCwgc2l6ZSk7CkBAIC0zNjMyLDYgKzM2NzIsOSBAQAogCiAJbGluayA9IGlnYl9oYXNfbGluayhhZGFwdGVyKTsKIAlpZiAobGluaykgeworCQkvKiBDYW5jZWwgc2NoZWR1bGVkIHN1c3BlbmQgcmVxdWVzdHMuICovCisJCXBtX3J1bnRpbWVfcmVzdW1lKG5ldGRldi0+ZGV2LnBhcmVudCk7CisKIAkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKG5ldGRldikpIHsKIAkJCXUzMiBjdHJsOwogCQkJaHctPm1hYy5vcHMuZ2V0X3NwZWVkX2FuZF9kdXBsZXgoaHcsCkBAIC0zNjQwLDIzICszNjgzLDIzIEBACiAKIAkJCWN0cmwgPSByZDMyKEUxMDAwX0NUUkwpOwogCQkJLyogTGlua3Mgc3RhdHVzIG1lc3NhZ2UgbXVzdCBmb2xsb3cgdGhpcyBmb3JtYXQgKi8KLQkJCXByaW50ayhLRVJOX0lORk8gImlnYjogJXMgTklDIExpbmsgaXMgVXAgJWQgTWJwcyAlcywgIgotCQkJCSAiRmxvdyBDb250cm9sOiAlc1xuIiwKKwkJCXByaW50ayhLRVJOX0lORk8gImlnYjogJXMgTklDIExpbmsgaXMgVXAgJWQgTWJwcyAlcyAiCisJCQkgICAgICAgIkR1cGxleCwgRmxvdyBDb250cm9sOiAlc1xuIiwKIAkJCSAgICAgICBuZXRkZXYtPm5hbWUsCiAJCQkgICAgICAgYWRhcHRlci0+bGlua19zcGVlZCwKIAkJCSAgICAgICBhZGFwdGVyLT5saW5rX2R1cGxleCA9PSBGVUxMX0RVUExFWCA/Ci0JCQkJICJGdWxsIER1cGxleCIgOiAiSGFsZiBEdXBsZXgiLAotCQkJICAgICAgICgoY3RybCAmIEUxMDAwX0NUUkxfVEZDRSkgJiYKLQkJCSAgICAgICAgKGN0cmwgJiBFMTAwMF9DVFJMX1JGQ0UpKSA/ICJSWC9UWCIgOgotCQkJICAgICAgICgoY3RybCAmIEUxMDAwX0NUUkxfUkZDRSkgPyAgIlJYIiA6Ci0JCQkgICAgICAgKChjdHJsICYgRTEwMDBfQ1RSTF9URkNFKSA/ICAiVFgiIDogIk5vbmUiKSkpOworCQkJICAgICAgICJGdWxsIiA6ICJIYWxmIiwKKwkJCSAgICAgICAoY3RybCAmIEUxMDAwX0NUUkxfVEZDRSkgJiYKKwkJCSAgICAgICAoY3RybCAmIEUxMDAwX0NUUkxfUkZDRSkgPyAiUlgvVFgiIDoKKwkJCSAgICAgICAoY3RybCAmIEUxMDAwX0NUUkxfUkZDRSkgPyAgIlJYIiA6CisJCQkgICAgICAgKGN0cmwgJiBFMTAwMF9DVFJMX1RGQ0UpID8gICJUWCIgOiAiTm9uZSIpOwogCiAJCQkvKiBjaGVjayBmb3IgdGhlcm1hbCBzZW5zb3IgZXZlbnQgKi8KLQkJCWlmIChpZ2JfdGhlcm1hbF9zZW5zb3JfZXZlbnQoaHcsIEUxMDAwX1RIU1RBVF9MSU5LX1RIUk9UVExFKSkgewotCQkJCXByaW50ayhLRVJOX0lORk8gImlnYjogJXMgVGhlIG5ldHdvcmsgYWRhcHRlciAiCi0JCQkJCQkgImxpbmsgc3BlZWQgd2FzIGRvd25zaGlmdGVkICIKLQkJCQkJCSAiYmVjYXVzZSBpdCBvdmVyaGVhdGVkLlxuIiwKLQkJCQkJCSBuZXRkZXYtPm5hbWUpOworCQkJaWYgKGlnYl90aGVybWFsX3NlbnNvcl9ldmVudChodywKKwkJCSAgICBFMTAwMF9USFNUQVRfTElOS19USFJPVFRMRSkpIHsKKwkJCQluZXRkZXZfaW5mbyhuZXRkZXYsICJUaGUgbmV0d29yayBhZGFwdGVyIGxpbmsgIgorCQkJCQkgICAgInNwZWVkIHdhcyBkb3duc2hpZnRlZCBiZWNhdXNlIGl0ICIKKwkJCQkJICAgICJvdmVyaGVhdGVkXG4iKTsKIAkJCX0KIAogCQkJLyogYWRqdXN0IHRpbWVvdXQgZmFjdG9yIGFjY29yZGluZyB0byBzcGVlZC9kdXBsZXggKi8KQEAgLTM2ODYsMTEgKzM3MjksMTAgQEAKIAkJCWFkYXB0ZXItPmxpbmtfZHVwbGV4ID0gMDsKIAogCQkJLyogY2hlY2sgZm9yIHRoZXJtYWwgc2Vuc29yIGV2ZW50ICovCi0JCQlpZiAoaWdiX3RoZXJtYWxfc2Vuc29yX2V2ZW50KGh3LCBFMTAwMF9USFNUQVRfUFdSX0RPV04pKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSICJpZ2I6ICVzIFRoZSBuZXR3b3JrIGFkYXB0ZXIgIgotCQkJCQkJIndhcyBzdG9wcGVkIGJlY2F1c2UgaXQgIgotCQkJCQkJIm92ZXJoZWF0ZWQuXG4iLAotCQkJCQkJbmV0ZGV2LT5uYW1lKTsKKwkJCWlmIChpZ2JfdGhlcm1hbF9zZW5zb3JfZXZlbnQoaHcsCisJCQkgICAgRTEwMDBfVEhTVEFUX1BXUl9ET1dOKSkgeworCQkJCW5ldGRldl9lcnIobmV0ZGV2LCAiVGhlIG5ldHdvcmsgYWRhcHRlciB3YXMgIgorCQkJCQkgICAic3RvcHBlZCBiZWNhdXNlIGl0IG92ZXJoZWF0ZWRcbiIpOwogCQkJfQogCiAJCQkvKiBMaW5rcyBzdGF0dXMgbWVzc2FnZSBtdXN0IGZvbGxvdyB0aGlzIGZvcm1hdCAqLwpAQCAtMzcwNCw2ICszNzQ2LDkgQEAKIAkJCWlmICghdGVzdF9iaXQoX19JR0JfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJCQltb2RfdGltZXIoJmFkYXB0ZXItPnBoeV9pbmZvX3RpbWVyLAogCQkJCQkgIHJvdW5kX2ppZmZpZXMoamlmZmllcyArIDIgKiBIWikpOworCisJCQlwbV9zY2hlZHVsZV9zdXNwZW5kKG5ldGRldi0+ZGV2LnBhcmVudCwKKwkJCQkJICAgIE1TRUNfUEVSX1NFQyAqIDUpOwogCQl9CiAJfQogCkBAIC00MjQxLDYgKzQyODYsOCBAQAogCQlmcmFnKys7CiAJfQogCisJbmV0ZGV2X3R4X3NlbnRfcXVldWUodHhyaW5nX3R4cSh0eF9yaW5nKSwgZmlyc3QtPmJ5dGVjb3VudCk7CisKIAkvKiB3cml0ZSBsYXN0IGRlc2NyaXB0b3Igd2l0aCBSUyBhbmQgRU9QIGJpdHMgKi8KIAljbWRfdHlwZSB8PSBjcHVfdG9fbGUzMihzaXplKSB8IGNwdV90b19sZTMyKElHQl9UWERfRENNRCk7CiAJdHhfZGVzYy0+cmVhZC5jbWRfdHlwZV9sZW4gPSBjbWRfdHlwZTsKQEAgLTU3ODAsNiArNTgyNyw4IEBACiAJCX0KIAl9CiAKKwluZXRkZXZfdHhfY29tcGxldGVkX3F1ZXVlKHR4cmluZ190eHEodHhfcmluZyksCisJCQkJICB0b3RhbF9wYWNrZXRzLCB0b3RhbF9ieXRlcyk7CiAJaSArPSB0eF9yaW5nLT5jb3VudDsKIAl0eF9yaW5nLT5uZXh0X3RvX2NsZWFuID0gaTsKIAl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZ0eF9yaW5nLT50eF9zeW5jcCk7CkBAIC02MTM4LDcgKzYxODcsNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCWlmICghcGFnZSkgewotCQlwYWdlID0gbmV0ZGV2X2FsbG9jX3BhZ2UocnhfcmluZy0+bmV0ZGV2KTsKKwkJcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyB8IF9fR0ZQX0NPTEQpOwogCQliaS0+cGFnZSA9IHBhZ2U7CiAJCWlmICh1bmxpa2VseSghcGFnZSkpIHsKIAkJCXJ4X3JpbmctPnJ4X3N0YXRzLmFsbG9jX2ZhaWxlZCsrOwpAQCAtNjQ2Nyw3ICs2NTE2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaWdiX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgdm9pZCBpZ2Jfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTY0OTQsNyArNjU0Myw3IEBACiAJaWdiX3JscG1sX3NldChhZGFwdGVyKTsKIH0KIAotc3RhdGljIHZvaWQgaWdiX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQorc3RhdGljIGludCBpZ2Jfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCiB7CiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtNjUwNyw5ICs2NTU2LDExIEBACiAJaWdiX3ZmdGFfc2V0KGh3LCB2aWQsIHRydWUpOwogCiAJc2V0X2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucyk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgaWdiX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKK3N0YXRpYyBpbnQgaWdiX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CkBAIC02NTI0LDYgKzY1NzUsOCBAQAogCQlpZ2JfdmZ0YV9zZXQoaHcsIHZpZCwgZmFsc2UpOwogCiAJY2xlYXJfYml0KHZpZCwgYWRhcHRlci0+YWN0aXZlX3ZsYW5zKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpZ2JfcmVzdG9yZV92bGFuKHN0cnVjdCBpZ2JfYWRhcHRlciAqYWRhcHRlcikKQEAgLTY1ODIsMTMgKzY2MzUsMTQgQEAKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIAotc3RhdGljIGludCBfX2lnYl9zaHV0ZG93bihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgYm9vbCAqZW5hYmxlX3dha2UpCitzdGF0aWMgaW50IF9faWdiX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBib29sICplbmFibGVfd2FrZSwKKwkJCSAgYm9vbCBydW50aW1lKQogewogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CiAJc3RydWN0IGlnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCXUzMiBjdHJsLCByY3RsLCBzdGF0dXM7Ci0JdTMyIHd1ZmMgPSBhZGFwdGVyLT53b2w7CisJdTMyIHd1ZmMgPSBydW50aW1lID8gRTEwMDBfV1VGQ19MTktDIDogYWRhcHRlci0+d29sOwogI2lmZGVmIENPTkZJR19QTQogCWludCByZXR2YWwgPSAwOwogI2VuZGlmCkBAIC02NTk2LDcgKzY2NTAsNyBAQAogCW5ldGlmX2RldmljZV9kZXRhY2gobmV0ZGV2KTsKIAogCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCWlnYl9jbG9zZShuZXRkZXYpOworCQlfX2lnYl9jbG9zZShuZXRkZXYsIHRydWUpOwogCiAJaWdiX2NsZWFyX2ludGVycnVwdF9zY2hlbWUoYWRhcHRlcik7CiAKQEAgLTY2NTUsMTIgKzY3MDksMTMgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCBpZ2Jfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQorc3RhdGljIGludCBpZ2Jfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldHZhbDsKIAlib29sIHdha2U7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CiAKLQlyZXR2YWwgPSBfX2lnYl9zaHV0ZG93bihwZGV2LCAmd2FrZSk7CisJcmV0dmFsID0gX19pZ2Jfc2h1dGRvd24ocGRldiwgJndha2UsIDApOwogCWlmIChyZXR2YWwpCiAJCXJldHVybiByZXR2YWw7CiAKQEAgLTY2NzQsOCArNjcyOSw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaWdiX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyBpbnQgaWdiX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBlMTAwMF9odyAqaHcgPSAmYWRhcHRlci0+aHc7CkBAIC02Njk2LDcgKzY3NTIsMTggQEAKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzaG90LCAwKTsKIAlwY2lfZW5hYmxlX3dha2UocGRldiwgUENJX0QzY29sZCwgMCk7CiAKLQlpZiAoaWdiX2luaXRfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKSkgeworCWlmICghcnRubF9pc19sb2NrZWQoKSkgeworCQkvKgorCQkgKiBzaHV0IHVwIEFTU0VSVF9SVE5MKCkgd2FybmluZyBpbgorCQkgKiBuZXRpZl9zZXRfcmVhbF9udW1fdHgvcnhfcXVldWVzLgorCQkgKi8KKwkJcnRubF9sb2NrKCk7CisJCWVyciA9IGlnYl9pbml0X2ludGVycnVwdF9zY2hlbWUoYWRhcHRlcik7CisJCXJ0bmxfdW5sb2NrKCk7CisJfSBlbHNlIHsKKwkJZXJyID0gaWdiX2luaXRfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKKwl9CisJaWYgKGVycikgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBxdWV1ZXNcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKIAl9CkBAIC02NzA5LDIzICs2Nzc2LDYxIEBACiAKIAl3cjMyKEUxMDAwX1dVUywgfjApOwogCi0JaWYgKG5ldGlmX3J1bm5pbmcobmV0ZGV2KSkgewotCQllcnIgPSBpZ2Jfb3BlbihuZXRkZXYpOworCWlmIChuZXRkZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCWVyciA9IF9faWdiX29wZW4obmV0ZGV2LCB0cnVlKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfQogCiAJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX1BNX1JVTlRJTUUKK3N0YXRpYyBpbnQgaWdiX3J1bnRpbWVfaWRsZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3QgaWdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCisJaWYgKCFpZ2JfaGFzX2xpbmsoYWRhcHRlcikpCisJCXBtX3NjaGVkdWxlX3N1c3BlbmQoZGV2LCBNU0VDX1BFUl9TRUMgKiA1KTsKKworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgaWdiX3J1bnRpbWVfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldik7CisJaW50IHJldHZhbDsKKwlib29sIHdha2U7CisKKwlyZXR2YWwgPSBfX2lnYl9zaHV0ZG93bihwZGV2LCAmd2FrZSwgMSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCWlmICh3YWtlKSB7CisJCXBjaV9wcmVwYXJlX3RvX3NsZWVwKHBkZXYpOworCX0gZWxzZSB7CisJCXBjaV93YWtlX2Zyb21fZDMocGRldiwgZmFsc2UpOworCQlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CisJfQogCiAJcmV0dXJuIDA7CiB9CisKK3N0YXRpYyBpbnQgaWdiX3J1bnRpbWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gaWdiX3Jlc3VtZShkZXYpOworfQorI2VuZGlmIC8qIENPTkZJR19QTV9SVU5USU1FICovCiAjZW5kaWYKIAogc3RhdGljIHZvaWQgaWdiX3NodXRkb3duKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewogCWJvb2wgd2FrZTsKIAotCV9faWdiX3NodXRkb3duKHBkZXYsICZ3YWtlKTsKKwlfX2lnYl9zaHV0ZG93bihwZGV2LCAmd2FrZSwgMCk7CiAKIAlpZiAoc3lzdGVtX3N0YXRlID09IFNZU1RFTV9QT1dFUl9PRkYpIHsKIAkJcGNpX3dha2VfZnJvbV9kMyhwZGV2LCB3YWtlKTsKQEAgLTcwNjQsMTUgKzcxNjksMjggQEAKIAkJCXdyMzIoRTEwMDBfRE1DVFhUSCwgMCk7CiAKIAkJCS8qCi0JCQkgKiBETUEgQ29hbGVzY2luZyBoaWdoIHdhdGVyIG1hcmsgbmVlZHMgdG8gYmUgaGlnaGVyCi0JCQkgKiB0aGFuIHRoZSBSWCB0aHJlc2hvbGQuIHNldCBod20gdG8gUEJBIC0gIDIgKiBtYXgKLQkJCSAqIGZyYW1lIHNpemUKKwkJCSAqIERNQSBDb2FsZXNjaW5nIGhpZ2ggd2F0ZXIgbWFyayBuZWVkcyB0byBiZSBncmVhdGVyCisJCQkgKiB0aGFuIHRoZSBSeCB0aHJlc2hvbGQuIFNldCBod20gdG8gUEJBIC0gbWF4IGZyYW1lCisJCQkgKiBzaXplIGluIDE2QiB1bml0cywgY2FwcGluZyBpdCBhdCBQQkEgLSA2S0IuCiAJCQkgKi8KLQkJCWh3bSA9IHBiYSAtICgyICogYWRhcHRlci0+bWF4X2ZyYW1lX3NpemUpOworCQkJaHdtID0gNjQgKiBwYmEgLSBhZGFwdGVyLT5tYXhfZnJhbWVfc2l6ZSAvIDE2OworCQkJaWYgKGh3bSA8IDY0ICogKHBiYSAtIDYpKQorCQkJCWh3bSA9IDY0ICogKHBiYSAtIDYpOworCQkJcmVnID0gcmQzMihFMTAwMF9GQ1JUQyk7CisJCQlyZWcgJj0gfkUxMDAwX0ZDUlRDX1JUSF9DT0FMX01BU0s7CisJCQlyZWcgfD0gKChod20gPDwgRTEwMDBfRkNSVENfUlRIX0NPQUxfU0hJRlQpCisJCQkJJiBFMTAwMF9GQ1JUQ19SVEhfQ09BTF9NQVNLKTsKKwkJCXdyMzIoRTEwMDBfRkNSVEMsIHJlZyk7CisKKwkJCS8qCisJCQkgKiBTZXQgdGhlIERNQSBDb2FsZXNjaW5nIFJ4IHRocmVzaG9sZCB0byBQQkEgLSAyICogbWF4CisJCQkgKiBmcmFtZSBzaXplLCBjYXBwaW5nIGl0IGF0IFBCQSAtIDEwS0IuCisJCQkgKi8KKwkJCWRtYWNfdGhyID0gcGJhIC0gYWRhcHRlci0+bWF4X2ZyYW1lX3NpemUgLyA1MTI7CisJCQlpZiAoZG1hY190aHIgPCBwYmEgLSAxMCkKKwkJCQlkbWFjX3RociA9IHBiYSAtIDEwOwogCQkJcmVnID0gcmQzMihFMTAwMF9ETUFDUik7CiAJCQlyZWcgJj0gfkUxMDAwX0RNQUNSX0RNQUNUSFJfTUFTSzsKLQkJCWRtYWNfdGhyID0gcGJhIC0gNDsKLQogCQkJcmVnIHw9ICgoZG1hY190aHIgPDwgRTEwMDBfRE1BQ1JfRE1BQ1RIUl9TSElGVCkKIAkJCQkmIEUxMDAwX0RNQUNSX0RNQUNUSFJfTUFTSyk7CiAKQEAgLTcwODgsNyArNzIwNiw2IEBACiAJCQkgKiBjb2FsZXNjaW5nKHNtYXJ0IGZpZmIpLVVUUkVTSD0wCiAJCQkgKi8KIAkJCXdyMzIoRTEwMDBfRE1DUlRSSCwgMCk7Ci0JCQl3cjMyKEUxMDAwX0ZDUlRDLCBod20pOwogCiAJCQlyZWcgPSAoSUdCX0RNQ1RMWF9EQ0ZMVVNIX0RJUyB8IDB4NCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2lnYnZmL2V0aHRvb2wuYwppbmRleCAyYzI1ODU4Li43YjYwMGExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvZXRodG9vbC5jCkBAIC0xOTEsMTIgKzE5MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7Ci0JY2hhciBmaXJtd2FyZV92ZXJzaW9uWzMyXSA9ICJOL0EiOwogCi0Jc3RybmNweShkcnZpbmZvLT5kcml2ZXIsICBpZ2J2Zl9kcml2ZXJfbmFtZSwgMzIpOwotCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgaWdidmZfZHJpdmVyX3ZlcnNpb24sIDMyKTsKLQlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sIGZpcm13YXJlX3ZlcnNpb24sIDMyKTsKLQlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwgMzIpOworCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCAgaWdidmZfZHJpdmVyX25hbWUsIHNpemVvZihkcnZpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIGlnYnZmX2RyaXZlcl92ZXJzaW9uLAorCQlzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pKTsKIAlkcnZpbmZvLT5yZWdkdW1wX2xlbiA9IGlnYnZmX2dldF9yZWdzX2xlbihuZXRkZXYpOwogCWRydmluZm8tPmVlZHVtcF9sZW4gPSBpZ2J2Zl9nZXRfZWVwcm9tX2xlbihuZXRkZXYpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaWdidmYvbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYwppbmRleCBjY2E3ODEyLi5mZDNkYTMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9pZ2J2Zi9uZXRkZXYuYwpAQCAtMjUsNiArMjUsOCBAQAogCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTExNzQsMTggKzExNzYsMjAgQEAKIAllMTAwMF9ybHBtbF9zZXRfdmYoaHcsIG1heF9mcmFtZV9zaXplKTsKIH0KIAotc3RhdGljIHZvaWQgaWdidmZfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCitzdGF0aWMgaW50IGlnYnZmX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgZTEwMDBfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwogCi0JaWYgKGh3LT5tYWMub3BzLnNldF92ZnRhKGh3LCB2aWQsIHRydWUpKQorCWlmIChody0+bWFjLm9wcy5zZXRfdmZ0YShodywgdmlkLCB0cnVlKSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIHZsYW4gaWQgJWRcbiIsIHZpZCk7Ci0JZWxzZQotCQlzZXRfYml0KHZpZCwgYWRhcHRlci0+YWN0aXZlX3ZsYW5zKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNldF9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpZ2J2Zl92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCitzdGF0aWMgaW50IGlnYnZmX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGUxMDAwX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTExOTUsMTEgKzExOTksMTMgQEAKIAlpZiAoIXRlc3RfYml0KF9fSUdCVkZfRE9XTiwgJmFkYXB0ZXItPnN0YXRlKSkKIAkJaWdidmZfaXJxX2VuYWJsZShhZGFwdGVyKTsKIAotCWlmIChody0+bWFjLm9wcy5zZXRfdmZ0YShodywgdmlkLCBmYWxzZSkpCisJaWYgKGh3LT5tYWMub3BzLnNldF92ZnRhKGh3LCB2aWQsIGZhbHNlKSkgewogCQlkZXZfZXJyKCZhZGFwdGVyLT5wZGV2LT5kZXYsCiAJCSAgICAgICAgIkZhaWxlZCB0byByZW1vdmUgdmxhbiBpZCAlZFxuIiwgdmlkKTsKLQllbHNlCi0JCWNsZWFyX2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpZ2J2Zl9yZXN0b3JlX3ZsYW4oc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0xNzQ2LDEwICsxNzUyLDkgQEAKIAogc3RhdGljIHZvaWQgaWdidmZfcHJpbnRfbGlua19pbmZvKHN0cnVjdCBpZ2J2Zl9hZGFwdGVyICphZGFwdGVyKQogewotCWRldl9pbmZvKCZhZGFwdGVyLT5wZGV2LT5kZXYsICJMaW5rIGlzIFVwICVkIE1icHMgJXNcbiIsCi0JICAgICAgICAgYWRhcHRlci0+bGlua19zcGVlZCwKLQkgICAgICAgICAoKGFkYXB0ZXItPmxpbmtfZHVwbGV4ID09IEZVTExfRFVQTEVYKSA/Ci0JICAgICAgICAgICJGdWxsIER1cGxleCIgOiAiSGFsZiBEdXBsZXgiKSk7CisJZGV2X2luZm8oJmFkYXB0ZXItPnBkZXYtPmRldiwgIkxpbmsgaXMgVXAgJWQgTWJwcyAlcyBEdXBsZXhcbiIsCisJCSBhZGFwdGVyLT5saW5rX3NwZWVkLAorCQkgYWRhcHRlci0+bGlua19kdXBsZXggPT0gRlVMTF9EVVBMRVggPyAiRnVsbCIgOiAiSGFsZiIpOwogfQogCiBzdGF0aWMgYm9vbCBpZ2J2Zl9oYXNfbGluayhzdHJ1Y3QgaWdidmZfYWRhcHRlciAqYWRhcHRlcikKQEAgLTI1MzIsNyArMjUzNyw4IEBACiAJZGV2X2luZm8oJnBkZXYtPmRldiwgIkFkZHJlc3M6ICVwTVxuIiwgbmV0ZGV2LT5kZXZfYWRkcik7CiB9CiAKLXN0YXRpYyBpbnQgaWdidmZfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgaWdidmZfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IGlnYnZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCkBAIC0yODQyLDkgKzI4NDgsOCBAQAogc3RhdGljIGludCBfX2luaXQgaWdidmZfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgcmV0OwotCXByaW50ayhLRVJOX0lORk8gIiVzIC0gdmVyc2lvbiAlc1xuIiwKLQkgICAgICAgaWdidmZfZHJpdmVyX3N0cmluZywgaWdidmZfZHJpdmVyX3ZlcnNpb24pOwotCXByaW50ayhLRVJOX0lORk8gIiVzXG4iLCBpZ2J2Zl9jb3B5cmlnaHQpOworCXByX2luZm8oIiVzIC0gdmVyc2lvbiAlc1xuIiwgaWdidmZfZHJpdmVyX3N0cmluZywgaWdidmZfZHJpdmVyX3ZlcnNpb24pOworCXByX2luZm8oIiVzXG4iLCBpZ2J2Zl9jb3B5cmlnaHQpOwogCiAJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaWdidmZfZHJpdmVyKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYi9peGdiX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2IvaXhnYl9ldGh0b29sLmMKaW5kZXggOWRmY2U3ZC4uZGJiN2RkMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYi9peGdiX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiL2l4Z2JfZXRodG9vbC5jCkBAIC00NzMsMTAgKzQ3MywxMiBAQAogewogCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0Jc3RybmNweShkcnZpbmZvLT5kcml2ZXIsICBpeGdiX2RyaXZlcl9uYW1lLCAzMik7Ci0Jc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBpeGdiX2RyaXZlcl92ZXJzaW9uLCAzMik7Ci0Jc3RybmNweShkcnZpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgMzIpOwotCXN0cm5jcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLCAzMik7CisJc3RybGNweShkcnZpbmZvLT5kcml2ZXIsICBpeGdiX2RyaXZlcl9uYW1lLAorCQlzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShkcnZpbmZvLT52ZXJzaW9uLCBpeGdiX2RyaXZlcl92ZXJzaW9uLAorCQlzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pKTsKIAlkcnZpbmZvLT5uX3N0YXRzID0gSVhHQl9TVEFUU19MRU47CiAJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSBpeGdiX2dldF9yZWdzX2xlbihuZXRkZXYpOwogCWRydmluZm8tPmVlZHVtcF9sZW4gPSBpeGdiX2dldF9lZXByb21fbGVuKG5ldGRldik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiL2l4Z2JfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYi9peGdiX21haW4uYwppbmRleCBlMjExNDhmLi45YmQ1ZmFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiL2l4Z2JfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2IvaXhnYl9tYWluLmMKQEAgLTEwMSw4ICsxMDEsOCBAQAogCiBzdGF0aWMgdm9pZCBpeGdiX3ZsYW5fc3RyaXBfZW5hYmxlKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOwogc3RhdGljIHZvaWQgaXhnYl92bGFuX3N0cmlwX2Rpc2FibGUoc3RydWN0IGl4Z2JfYWRhcHRlciAqYWRhcHRlcik7Ci1zdGF0aWMgdm9pZCBpeGdiX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKTsKLXN0YXRpYyB2b2lkIGl4Z2Jfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKTsKK3N0YXRpYyBpbnQgaXhnYl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCk7CitzdGF0aWMgaW50IGl4Z2Jfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKTsKIHN0YXRpYyB2b2lkIGl4Z2JfcmVzdG9yZV92bGFuKHN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIpOwogCiAjaWZkZWYgQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIKQEAgLTIyOCw3ICsyMjgsNyBAQAogCWlmIChJWEdCX1JFQURfUkVHKCZhZGFwdGVyLT5odywgU1RBVFVTKSAmIElYR0JfU1RBVFVTX1BDSVhfTU9ERSkgewogCQllcnIgPSBwY2lfZW5hYmxlX21zaShhZGFwdGVyLT5wZGV2KTsKIAkJaWYgKCFlcnIpIHsKLQkJCWFkYXB0ZXItPmhhdmVfbXNpID0gMTsKKwkJCWFkYXB0ZXItPmhhdmVfbXNpID0gdHJ1ZTsKIAkJCWlycV9mbGFncyA9IDA7CiAJCX0KIAkJLyogcHJvY2VlZCB0byB0cnkgdG8gcmVxdWVzdCByZWd1bGFyIGludGVycnVwdCAqLwpAQCAtMzI1LDggKzMyNSw4IEBACiAJfQogfQogCi1zdGF0aWMgdTMyCi1peGdiX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QKK2l4Z2JfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCS8qCiAJICogVHggVkxBTiBpbnNlcnRpb24gZG9lcyBub3Qgd29yayBwZXIgSFcgZGVzaWduIHdoZW4gUnggc3RyaXBwaW5nIGlzCkBAIC0zMzksMTAgKzMzOSwxMCBAQAogfQogCiBzdGF0aWMgaW50Ci1peGdiX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitpeGdiX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MzIgY2hhbmdlZCA9IGZlYXR1cmVzIF4gbmV0ZGV2LT5mZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdCBjaGFuZ2VkID0gZmVhdHVyZXMgXiBuZXRkZXYtPmZlYXR1cmVzOwogCiAJaWYgKCEoY2hhbmdlZCAmIChORVRJRl9GX1JYQ1NVTXxORVRJRl9GX0hXX1ZMQU5fUlgpKSkKIAkJcmV0dXJuIDA7CkBAIC0yMjE3LDcgKzIyMTcsNyBAQAogCUlYR0JfV1JJVEVfUkVHKCZhZGFwdGVyLT5odywgQ1RSTDAsIGN0cmwpOwogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogaXhnYl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgaXhnYl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTIyMzAsOSArMjIzMCwxMSBAQAogCXZmdGEgfD0gKDEgPDwgKHZpZCAmIDB4MUYpKTsKIAlpeGdiX3dyaXRlX3ZmdGEoJmFkYXB0ZXItPmh3LCBpbmRleCwgdmZ0YSk7CiAJc2V0X2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucyk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGl4Z2Jfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBpeGdiX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwpAQCAtMjI0NSw2ICsyMjQ3LDggQEAKIAl2ZnRhICY9IH4oMSA8PCAodmlkICYgMHgxRikpOwogCWl4Z2Jfd3JpdGVfdmZ0YSgmYWRhcHRlci0+aHcsIGluZGV4LCB2ZnRhKTsKIAljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmUuaAppbmRleCBhODM2OGQ1Li4yNTgxNjRkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlLmgKQEAgLTU2MCw2ICs1NjAsNyBAQAogCiBleHRlcm4gY2hhciBpeGdiZV9kcml2ZXJfbmFtZVtdOwogZXh0ZXJuIGNvbnN0IGNoYXIgaXhnYmVfZHJpdmVyX3ZlcnNpb25bXTsKK2V4dGVybiBjaGFyIGl4Z2JlX2RlZmF1bHRfZGV2aWNlX2Rlc2NyW107CiAKIGV4dGVybiB2b2lkIGl4Z2JlX3VwKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKIGV4dGVybiB2b2lkIGl4Z2JlX2Rvd24oc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtNjI3LDYgKzYyOCw4IEBACiBleHRlcm4gdTggaXhnYmVfZmNvZV9zZXRhcHAoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIsIHU4IHVwKTsKICNlbmRpZiAvKiBDT05GSUdfSVhHQkVfRENCICovCiBleHRlcm4gaW50IGl4Z2JlX2Zjb2VfZ2V0X3d3bihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1NjQgKnd3biwgaW50IHR5cGUpOworZXh0ZXJuIGludCBpeGdiZV9mY29lX2dldF9oYmFpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCQkJICBzdHJ1Y3QgbmV0ZGV2X2Zjb2VfaGJhaW5mbyAqaW5mbyk7CiAjZW5kaWYgLyogSVhHQkVfRkNPRSAqLwogCiAjZW5kaWYgLyogX0lYR0JFX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV84MjU5OS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfODI1OTkuYwppbmRleCA0YWUyNmE3Li43NzIwNzIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV84MjU5OS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlXzgyNTk5LmMKQEAgLTM1Niw2ICszNTYsNyBAQAogCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk5X1NGUF9GQ09FOgogCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk5X1NGUF9FTToKIAljYXNlIElYR0JFX0RFVl9JRF84MjU5OV9TRlBfU0YyOgorCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk5X1NGUF9TRl9RUDoKIAljYXNlIElYR0JFX0RFVl9JRF84MjU5OUVOX1NGUDoKIAkJbWVkaWFfdHlwZSA9IGl4Z2JlX21lZGlhX3R5cGVfZmliZXI7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfY29tbW9uLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9jb21tb24uYwppbmRleCBmMTM2NWZlLi5hM2FhNjMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9jb21tb24uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9jb21tb24uYwpAQCAtMjY2LDEwICsyNjYsMTAgQEAKIAlpZiAoaHctPm1hYy50eXBlID09IGl4Z2JlX21hY19YNTQwKSB7CiAJCWlmIChody0+cGh5LmlkID09IDApCiAJCQlody0+cGh5Lm9wcy5pZGVudGlmeShodyk7Ci0JCWh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCAweDMsIElYR0JFX1BDUkM4RUNMLCAmaSk7Ci0JCWh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCAweDMsIElYR0JFX1BDUkM4RUNILCAmaSk7Ci0JCWh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCAweDMsIElYR0JFX0xEUENFQ0wsICZpKTsKLQkJaHctPnBoeS5vcHMucmVhZF9yZWcoaHcsIDB4MywgSVhHQkVfTERQQ0VDSCwgJmkpOworCQlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgSVhHQkVfUENSQzhFQ0wsIE1ESU9fTU1EX1BDUywgJmkpOworCQlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgSVhHQkVfUENSQzhFQ0gsIE1ESU9fTU1EX1BDUywgJmkpOworCQlody0+cGh5Lm9wcy5yZWFkX3JlZyhodywgSVhHQkVfTERQQ0VDTCwgTURJT19NTURfUENTLCAmaSk7CisJCWh3LT5waHkub3BzLnJlYWRfcmVnKGh3LCBJWEdCRV9MRFBDRUNILCBNRElPX01NRF9QQ1MsICZpKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTI1OTksNyArMjU5OSw3IEBACiBzMzIgaXhnYmVfYmxpbmtfbGVkX3N0YXJ0X2dlbmVyaWMoc3RydWN0IGl4Z2JlX2h3ICpodywgdTMyIGluZGV4KQogewogCWl4Z2JlX2xpbmtfc3BlZWQgc3BlZWQgPSAwOwotCWJvb2wgbGlua191cCA9IDA7CisJYm9vbCBsaW5rX3VwID0gZmFsc2U7CiAJdTMyIGF1dG9jX3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9BVVRPQyk7CiAJdTMyIGxlZF9yZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTEVEQ1RMKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZGNiX25sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfbmwuYwppbmRleCAzM2I5M2ZmLi5kYTMxNzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfbmwuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9kY2JfbmwuYwpAQCAtMTU4LDEwICsxNTgsNiBAQAogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCS8qIEFib3J0IGEgYmFkIGNvbmZpZ3VyYXRpb24gKi8KLQlpZiAoZmZzKHVwX21hcCkgPiBhZGFwdGVyLT5kY2JfY2ZnLm51bV90Y3MucGdfdGNzKQotCQlyZXR1cm47Ci0KIAlpZiAocHJpbyAhPSBEQ0JfQVRUUl9WQUxVRV9VTkRFRklORUQpCiAJCWFkYXB0ZXItPnRlbXBfZGNiX2NmZy50Y19jb25maWdbdGNdLnBhdGhbMF0ucHJpb190eXBlID0gcHJpbzsKIAlpZiAoYndnX2lkICE9IERDQl9BVFRSX1ZBTFVFX1VOREVGSU5FRCkKQEAgLTE4NSw3ICsxODEsNyBAQAogCiAJaWYgKGFkYXB0ZXItPnRlbXBfZGNiX2NmZy50Y19jb25maWdbdGNdLnBhdGhbMF0udXBfdG9fdGNfYml0bWFwICE9CiAJICAgICBhZGFwdGVyLT5kY2JfY2ZnLnRjX2NvbmZpZ1t0Y10ucGF0aFswXS51cF90b190Y19iaXRtYXApCi0JCWFkYXB0ZXItPmRjYl9zZXRfYml0bWFwIHw9IEJJVF9QRkM7CisJCWFkYXB0ZXItPmRjYl9zZXRfYml0bWFwIHw9IEJJVF9QRkMgfCBCSVRfQVBQX1VQQ0hHOwogfQogCiBzdGF0aWMgdm9pZCBpeGdiZV9kY2JubF9zZXRfcGdfYndnX2NmZ190eChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBpbnQgYndnX2lkLApAQCAtMjA2LDEwICsyMDIsNiBAQAogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCS8qIEFib3J0IGJhZCBjb25maWd1cmF0aW9ucyAqLwotCWlmIChmZnModXBfbWFwKSA+IGFkYXB0ZXItPmRjYl9jZmcubnVtX3Rjcy5wZ190Y3MpCi0JCXJldHVybjsKLQogCWlmIChwcmlvICE9IERDQl9BVFRSX1ZBTFVFX1VOREVGSU5FRCkKIAkJYWRhcHRlci0+dGVtcF9kY2JfY2ZnLnRjX2NvbmZpZ1t0Y10ucGF0aFsxXS5wcmlvX3R5cGUgPSBwcmlvOwogCWlmIChid2dfaWQgIT0gRENCX0FUVFJfVkFMVUVfVU5ERUZJTkVEKQpAQCAtMzA5LDYgKzMwMSwyNyBAQAogCSpzZXR0aW5nID0gYWRhcHRlci0+ZGNiX2NmZy50Y19jb25maWdbcHJpb3JpdHldLmRjYl9wZmM7CiB9CiAKKyNpZmRlZiBJWEdCRV9GQ09FCitzdGF0aWMgdm9pZCBpeGdiZV9kY2JubF9kZXZyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCXdoaWxlICh0ZXN0X2FuZF9zZXRfYml0KF9fSVhHQkVfUkVTRVRUSU5HLCAmYWRhcHRlci0+c3RhdGUpKQorCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7CisKKwlpZiAobmV0aWZfcnVubmluZyhkZXYpKQorCQlkZXYtPm5ldGRldl9vcHMtPm5kb19zdG9wKGRldik7CisKKwlpeGdiZV9jbGVhcl9pbnRlcnJ1cHRfc2NoZW1lKGFkYXB0ZXIpOworCWl4Z2JlX2luaXRfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKKworCWlmIChuZXRpZl9ydW5uaW5nKGRldikpCisJCWRldi0+bmV0ZGV2X29wcy0+bmRvX29wZW4oZGV2KTsKKworCWNsZWFyX2JpdChfX0lYR0JFX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKTsKK30KKyNlbmRpZgorCiBzdGF0aWMgdTggaXhnYmVfZGNibmxfc2V0X2FsbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTMzOCwyNyArMzUxLDYgQEAKIAlpZiAocmV0KQogCQlyZXR1cm4gRENCX05PX0hXX0NIRzsKIAotI2lmZGVmIElYR0JFX0ZDT0UKLQlpZiAodXAgJiYgISh1cCAmICgxIDw8IGFkYXB0ZXItPmZjb2UudXApKSkKLQkJYWRhcHRlci0+ZGNiX3NldF9iaXRtYXAgfD0gQklUX0FQUF9VUENIRzsKLQotCS8qCi0JICogT25seSB0YWtlIGRvd24gdGhlIGFkYXB0ZXIgaWYgYW4gYXBwIGNoYW5nZSBvY2N1cnJlZC4gRkNvRQotCSAqIG1heSBzaHVmZmxlIHR4IHJpbmdzIGluIHRoaXMgY2FzZSBhbmQgdGhpcyBjYW4gbm90IGJlIGRvbmUKLQkgKiB3aXRob3V0IGEgcmVzZXQgY3VycmVudGx5LgotCSAqLwotCWlmIChhZGFwdGVyLT5kY2Jfc2V0X2JpdG1hcCAmIEJJVF9BUFBfVVBDSEcpIHsKLQkJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoX19JWEdCRV9SRVNFVFRJTkcsICZhZGFwdGVyLT5zdGF0ZSkpCi0JCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMjAwMCk7Ci0KLQkJYWRhcHRlci0+ZmNvZS51cCA9IGZmcyh1cCkgLSAxOwotCi0JCWlmIChuZXRpZl9ydW5uaW5nKG5ldGRldikpCi0JCQluZXRkZXYtPm5ldGRldl9vcHMtPm5kb19zdG9wKG5ldGRldik7Ci0JCWl4Z2JlX2NsZWFyX2ludGVycnVwdF9zY2hlbWUoYWRhcHRlcik7Ci0JfQotI2VuZGlmCi0KIAlpZiAoYWRhcHRlci0+ZGNiX2NmZy5wZmNfbW9kZV9lbmFibGUpIHsKIAkJc3dpdGNoIChhZGFwdGVyLT5ody5tYWMudHlwZSkgewogCQljYXNlIGl4Z2JlX21hY184MjU5OUVCOgpAQCAtMzg1LDE1ICszNzcsNiBAQAogCQl9CiAJfQogCi0jaWZkZWYgSVhHQkVfRkNPRQotCWlmIChhZGFwdGVyLT5kY2Jfc2V0X2JpdG1hcCAmIEJJVF9BUFBfVVBDSEcpIHsKLQkJaXhnYmVfaW5pdF9pbnRlcnJ1cHRfc2NoZW1lKGFkYXB0ZXIpOwotCQlpZiAobmV0aWZfcnVubmluZyhuZXRkZXYpKQotCQkJbmV0ZGV2LT5uZXRkZXZfb3BzLT5uZG9fb3BlbihuZXRkZXYpOwotCQlyZXQgPSBEQ0JfSFdfQ0hHX1JTVDsKLQl9Ci0jZW5kaWYKLQogCWlmIChhZGFwdGVyLT5kY2Jfc2V0X2JpdG1hcCAmIChCSVRfUEdfVFh8QklUX1BHX1JYKSkgewogCQl1MTYgcmVmaWxsW01BWF9UUkFGRklDX0NMQVNTXSwgbWF4W01BWF9UUkFGRklDX0NMQVNTXTsKIAkJdTggYndnX2lkW01BWF9UUkFGRklDX0NMQVNTXSwgcHJpb190eXBlW01BWF9UUkFGRklDX0NMQVNTXTsKQEAgLTQ0Miw4ICs0MjUsMTkgQEAKIAlpZiAoYWRhcHRlci0+ZGNiX2NmZy5wZmNfbW9kZV9lbmFibGUpCiAJCWFkYXB0ZXItPmh3LmZjLmN1cnJlbnRfbW9kZSA9IGl4Z2JlX2ZjX3BmYzsKIAotCWlmIChhZGFwdGVyLT5kY2Jfc2V0X2JpdG1hcCAmIEJJVF9BUFBfVVBDSEcpCi0JCWNsZWFyX2JpdChfX0lYR0JFX1JFU0VUVElORywgJmFkYXB0ZXItPnN0YXRlKTsKKyNpZmRlZiBJWEdCRV9GQ09FCisJLyogUmVwcm9nYW0gRkNvRSBoYXJkd2FyZSBvZmZsb2FkcyB3aGVuIHRoZSB0cmFmZmljIGNsYXNzCisJICogRkNvRSBpcyB1c2luZyBjaGFuZ2VzLiBUaGlzIGhhcHBlbnMgaWYgdGhlIEFQUCBpbmZvCisJICogY2hhbmdlcyBvciB0aGUgdXAydGMgbWFwcGluZyBpcyB1cGRhdGVkLgorCSAqLworCWlmICgodXAgJiYgISh1cCAmICgxIDw8IGFkYXB0ZXItPmZjb2UudXApKSkgfHwKKwkgICAgKGFkYXB0ZXItPmRjYl9zZXRfYml0bWFwICYgQklUX0FQUF9VUENIRykpIHsKKwkJYWRhcHRlci0+ZmNvZS51cCA9IGZmcyh1cCkgLSAxOworCQlpeGdiZV9kY2JubF9kZXZyZXNldChuZXRkZXYpOworCQlyZXQgPSBEQ0JfSFdfQ0hHX1JTVDsKKwl9CisjZW5kaWYKKwogCWFkYXB0ZXItPmRjYl9zZXRfYml0bWFwID0gMHgwMDsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjYxLDIyICs2NTUsNiBAQAogCXJldHVybiBpeGdiZV9kY2JfaHdfcGZjX2NvbmZpZygmYWRhcHRlci0+aHcsIHBmYy0+cGZjX2VuLCBwcmlvX3RjKTsKIH0KIAotI2lmZGVmIElYR0JFX0ZDT0UKLXN0YXRpYyB2b2lkIGl4Z2JlX2RjYm5sX2RldnJlc2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0Jc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihkZXYpOwotCi0JaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKLQkJZGV2LT5uZXRkZXZfb3BzLT5uZG9fc3RvcChkZXYpOwotCi0JaXhnYmVfY2xlYXJfaW50ZXJydXB0X3NjaGVtZShhZGFwdGVyKTsKLQlpeGdiZV9pbml0X2ludGVycnVwdF9zY2hlbWUoYWRhcHRlcik7Ci0KLQlpZiAobmV0aWZfcnVubmluZyhkZXYpKQotCQlkZXYtPm5ldGRldl9vcHMtPm5kb19vcGVuKGRldik7Ci19Ci0jZW5kaWYKLQogc3RhdGljIGludCBpeGdiZV9kY2JubF9pZWVlX3NldGFwcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHN0cnVjdCBkY2JfYXBwICphcHApCiB7CkBAIC03NjEsNyArNzM5LDkgQEAKIAkJaXhnYmVfZGNibmxfaWVlZV9zZXRldHMoZGV2LCAmZXRzKTsKIAkJaXhnYmVfZGNibmxfaWVlZV9zZXRwZmMoZGV2LCAmcGZjKTsKIAl9IGVsc2UgaWYgKG1vZGUgJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkgewotCQlhZGFwdGVyLT5kY2Jfc2V0X2JpdG1hcCB8PSAoQklUX1BGQyAmIEJJVF9QR19UWCAmIEJJVF9QR19SWCk7CisJCXU4IG1hc2sgPSBCSVRfUEZDIHwgQklUX1BHX1RYIHwgQklUX1BHX1JYIHwgQklUX0FQUF9VUENIRzsKKworCQlhZGFwdGVyLT5kY2Jfc2V0X2JpdG1hcCB8PSBtYXNrOwogCQlpeGdiZV9kY2JubF9zZXRfYWxsKGRldik7CiAJfSBlbHNlIHsKIAkJLyogRHJvcCBpbnRvIHNpbmdsZSBUQyBtb2RlIHN0cmljdCBwcmlvcml0eSBhcyB0aGlzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9ldGh0b29sLmMKaW5kZXggNzBkNThjMy4uZGE3ZTU4MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2V0aHRvb2wuYwpAQCAtODg4LDIzICs4ODgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmRydmluZm8pCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwotCWNoYXIgZmlybXdhcmVfdmVyc2lvblszMl07CiAJdTMyIG52bV90cmFja19pZDsKIAotCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBpeGdiZV9kcml2ZXJfbmFtZSwKLQkgICAgICAgIHNpemVvZihkcnZpbmZvLT5kcml2ZXIpIC0gMSk7Ci0Jc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBpeGdiZV9kcml2ZXJfdmVyc2lvbiwKLQkgICAgICAgIHNpemVvZihkcnZpbmZvLT52ZXJzaW9uKSAtIDEpOworCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCBpeGdiZV9kcml2ZXJfbmFtZSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgaXhnYmVfZHJpdmVyX3ZlcnNpb24sCisJCXNpemVvZihkcnZpbmZvLT52ZXJzaW9uKSk7CiAKIAludm1fdHJhY2tfaWQgPSAoYWRhcHRlci0+ZWVwcm9tX3ZlcmggPDwgMTYpIHwKIAkJCWFkYXB0ZXItPmVlcHJvbV92ZXJsOwotCXNucHJpbnRmKGZpcm13YXJlX3ZlcnNpb24sIHNpemVvZihmaXJtd2FyZV92ZXJzaW9uKSwgIjB4JTA4eCIsCisJc25wcmludGYoZHJ2aW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGRydmluZm8tPmZ3X3ZlcnNpb24pLCAiMHglMDh4IiwKIAkJIG52bV90cmFja19pZCk7CiAKLQlzdHJuY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sIGZpcm13YXJlX3ZlcnNpb24sCi0JCXNpemVvZihkcnZpbmZvLT5md192ZXJzaW9uKSAtIDEpOwotCXN0cm5jcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAotCQlzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pIC0gMSk7CisJc3RybGNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksCisJCXNpemVvZihkcnZpbmZvLT5idXNfaW5mbykpOwogCWRydmluZm8tPm5fc3RhdHMgPSBJWEdCRV9TVEFUU19MRU47CiAJZHJ2aW5mby0+dGVzdGluZm9fbGVuID0gSVhHQkVfVEVTVF9MRU47CiAJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSBpeGdiZV9nZXRfcmVnc19sZW4obmV0ZGV2KTsKQEAgLTE5NTksMTIgKzE5NTUsMjEgQEAKIAkvKiBXT0wgbm90IHN1cHBvcnRlZCBleGNlcHQgZm9yIHRoZSBmb2xsb3dpbmcgKi8KIAlzd2l0Y2goaHctPmRldmljZV9pZCkgewogCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk5X1NGUDoKLQkJLyogT25seSB0aGlzIHN1YmRldmljZSBzdXBwb3J0cyBXT0wgKi8KLQkJaWYgKGh3LT5zdWJzeXN0ZW1fZGV2aWNlX2lkICE9IElYR0JFX1NVQkRFVl9JRF84MjU5OV9TRlApIHsKKwkJLyogT25seSB0aGVzZSBzdWJkZXZpY2VzIGNvdWxkIHN1cHBvcnRzIFdPTCAqLworCQlzd2l0Y2ggKGh3LT5zdWJzeXN0ZW1fZGV2aWNlX2lkKSB7CisJCWNhc2UgSVhHQkVfU1VCREVWX0lEXzgyNTk5XzU2MEZMUjoKKwkJCS8qIG9ubHkgc3VwcG9ydCBmaXJzdCBwb3J0ICovCisJCQlpZiAoaHctPmJ1cy5mdW5jICE9IDApIHsKKwkJCQl3b2wtPnN1cHBvcnRlZCA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCWNhc2UgSVhHQkVfU1VCREVWX0lEXzgyNTk5X1NGUDoKKwkJCXJldHZhbCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKIAkJCXdvbC0+c3VwcG9ydGVkID0gMDsKIAkJCWJyZWFrOwogCQl9Ci0JCXJldHZhbCA9IDA7CiAJCWJyZWFrOwogCWNhc2UgSVhHQkVfREVWX0lEXzgyNTk5X0NPTUJPX0JBQ0tQTEFORToKIAkJLyogQWxsIGV4Y2VwdCB0aGlzIHN1YmRldmljZSBzdXBwb3J0IFdPTCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZmNvZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfZmNvZS5jCmluZGV4IGRmM2IxYmUuLmQxOGQ2MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX2Zjb2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9mY29lLmMKQEAgLTg1NSwzICs4NTUsODYgQEAKIAl9CiAJcmV0dXJuIHJjOwogfQorCisvKioKKyAqIGl4Z2JlX2Zjb2VfZ2V0X2hiYWluZm8gLSBnZXQgRkNvRSBIQkEgaW5mb3JtYXRpb24KKyAqIEBuZXRkZXYgOiBpeGdiZSBhZGFwdGVyCisgKiBAaW5mbyA6IEhCQSBpbmZvcm1hdGlvbgorICoKKyAqIFJldHVybnMgaXhnYmUgSEJBIGluZm9ybWF0aW9uCisgKgorICogUmV0dXJucyA6IDAgb24gc3VjY2VzcworICovCitpbnQgaXhnYmVfZmNvZV9nZXRfaGJhaW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJICAgc3RydWN0IG5ldGRldl9mY29lX2hiYWluZm8gKmluZm8pCit7CisJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOworCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CisJaW50IGksIHBvczsKKwl1OCBidWZbOF07CisKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRG9uJ3QgcmV0dXJuIGluZm9ybWF0aW9uIG9uIHVuc3VwcG9ydGVkIGRldmljZXMgKi8KKwlpZiAoaHctPm1hYy50eXBlICE9IGl4Z2JlX21hY184MjU5OUVCICYmCisJICAgIGh3LT5tYWMudHlwZSAhPSBpeGdiZV9tYWNfWDU0MCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBNYW51ZmFjdHVyZXIgKi8KKwlzbnByaW50ZihpbmZvLT5tYW51ZmFjdHVyZXIsIHNpemVvZihpbmZvLT5tYW51ZmFjdHVyZXIpLAorCQkgIkludGVsIENvcnBvcmF0aW9uIik7CisKKwkvKiBTZXJpYWwgTnVtYmVyICovCisKKwkvKiBHZXQgdGhlIFBDSS1lIERldmljZSBTZXJpYWwgTnVtYmVyIENhcGFiaWxpdHkgKi8KKwlwb3MgPSBwY2lfZmluZF9leHRfY2FwYWJpbGl0eShhZGFwdGVyLT5wZGV2LCBQQ0lfRVhUX0NBUF9JRF9EU04pOworCWlmIChwb3MpIHsKKwkJcG9zICs9IDQ7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShhZGFwdGVyLT5wZGV2LCBwb3MgKyBpLCAmYnVmW2ldKTsKKworCQlzbnByaW50ZihpbmZvLT5zZXJpYWxfbnVtYmVyLCBzaXplb2YoaW5mby0+c2VyaWFsX251bWJlciksCisJCQkgIiUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYIiwKKwkJCSBidWZbN10sIGJ1Zls2XSwgYnVmWzVdLCBidWZbNF0sCisJCQkgYnVmWzNdLCBidWZbMl0sIGJ1ZlsxXSwgYnVmWzBdKTsKKwl9IGVsc2UKKwkJc25wcmludGYoaW5mby0+c2VyaWFsX251bWJlciwgc2l6ZW9mKGluZm8tPnNlcmlhbF9udW1iZXIpLAorCQkJICJVbmtub3duIik7CisKKwkvKiBIYXJkd2FyZSBWZXJzaW9uICovCisJc25wcmludGYoaW5mby0+aGFyZHdhcmVfdmVyc2lvbiwKKwkJIHNpemVvZihpbmZvLT5oYXJkd2FyZV92ZXJzaW9uKSwKKwkJICJSZXYgJWQiLCBody0+cmV2aXNpb25faWQpOworCS8qIERyaXZlciBOYW1lL1ZlcnNpb24gKi8KKwlzbnByaW50ZihpbmZvLT5kcml2ZXJfdmVyc2lvbiwKKwkJIHNpemVvZihpbmZvLT5kcml2ZXJfdmVyc2lvbiksCisJCSAiJXMgdiVzIiwKKwkJIGl4Z2JlX2RyaXZlcl9uYW1lLAorCQkgaXhnYmVfZHJpdmVyX3ZlcnNpb24pOworCS8qIEZpcm13YXJlIFZlcnNpb24gKi8KKwlzbnByaW50ZihpbmZvLT5maXJtd2FyZV92ZXJzaW9uLAorCQkgc2l6ZW9mKGluZm8tPmZpcm13YXJlX3ZlcnNpb24pLAorCQkgIjB4JTA4eCIsCisJCSAoYWRhcHRlci0+ZWVwcm9tX3ZlcmggPDwgMTYpIHwKKwkJICBhZGFwdGVyLT5lZXByb21fdmVybCk7CisKKwkvKiBNb2RlbCAqLworCWlmIChody0+bWFjLnR5cGUgPT0gaXhnYmVfbWFjXzgyNTk5RUIpIHsKKwkJc25wcmludGYoaW5mby0+bW9kZWwsCisJCQkgc2l6ZW9mKGluZm8tPm1vZGVsKSwKKwkJCSAiSW50ZWwgODI1OTkiKTsKKwl9IGVsc2UgeworCQlzbnByaW50ZihpbmZvLT5tb2RlbCwKKwkJCSBzaXplb2YoaW5mby0+bW9kZWwpLAorCQkJICJJbnRlbCBYNTQwIik7CisJfQorCisJLyogTW9kZWwgRGVzY3JpcHRpb24gKi8KKwlzbnByaW50ZihpbmZvLT5tb2RlbF9kZXNjcmlwdGlvbiwKKwkJIHNpemVvZihpbmZvLT5tb2RlbF9kZXNjcmlwdGlvbiksCisJCSAiJXMiLAorCQkgaXhnYmVfZGVmYXVsdF9kZXZpY2VfZGVzY3IpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9tYWluLmMKaW5kZXggOGVmOTJkMS4uMWVlNWQwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX21haW4uYwpAQCAtNTUsNiArNTUsOCBAQAogY2hhciBpeGdiZV9kcml2ZXJfbmFtZVtdID0gIml4Z2JlIjsKIHN0YXRpYyBjb25zdCBjaGFyIGl4Z2JlX2RyaXZlcl9zdHJpbmdbXSA9CiAJCQkgICAgICAiSW50ZWwoUikgMTAgR2lnYWJpdCBQQ0kgRXhwcmVzcyBOZXR3b3JrIERyaXZlciI7CitjaGFyIGl4Z2JlX2RlZmF1bHRfZGV2aWNlX2Rlc2NyW10gPQorCQkJICAgICAgIkludGVsKFIpIDEwIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uIjsKICNkZWZpbmUgTUFKIDMKICNkZWZpbmUgTUlOIDYKICNkZWZpbmUgQlVJTEQgNwpAQCAtMTA2LDYgKzEwOCw3IEBACiAJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfODI1OTlfU0ZQX1NGMiksIGJvYXJkXzgyNTk5IH0sCiAJe1BDSV9WREVWSUNFKElOVEVMLCBJWEdCRV9ERVZfSURfODI1OTlfTFMpLCBib2FyZF84MjU5OSB9LAogCXtQQ0lfVkRFVklDRShJTlRFTCwgSVhHQkVfREVWX0lEXzgyNTk5RU5fU0ZQKSwgYm9hcmRfODI1OTkgfSwKKwl7UENJX1ZERVZJQ0UoSU5URUwsIElYR0JFX0RFVl9JRF84MjU5OV9TRlBfU0ZfUVApLCBib2FyZF84MjU5OSB9LAogCS8qIHJlcXVpcmVkIGxhc3QgZW50cnkgKi8KIAl7MCwgfQogfTsKQEAgLTE0Niw3ICsxNDksNyBAQAogewogCUJVR19PTighdGVzdF9iaXQoX19JWEdCRV9TRVJWSUNFX1NDSEVELCAmYWRhcHRlci0+c3RhdGUpKTsKIAotCS8qIGZsdXNoIG1lbW9yeSB0byBtYWtlIHN1cmUgc3RhdGUgaXMgY29ycmVjdCBiZWZvcmUgbmV4dCB3YXRjaG9nICovCisJLyogZmx1c2ggbWVtb3J5IHRvIG1ha2Ugc3VyZSBzdGF0ZSBpcyBjb3JyZWN0IGJlZm9yZSBuZXh0IHdhdGNoZG9nICovCiAJc21wX21iX19iZWZvcmVfY2xlYXJfYml0KCk7CiAJY2xlYXJfYml0KF9fSVhHQkVfU0VSVklDRV9TQ0hFRCwgJmFkYXB0ZXItPnN0YXRlKTsKIH0KQEAgLTExNDAsNyArMTE0Myw3IEBACiAKIAkJaWYgKHJpbmdfaXNfcHNfZW5hYmxlZChyeF9yaW5nKSkgewogCQkJaWYgKCFiaS0+cGFnZSkgewotCQkJCWJpLT5wYWdlID0gbmV0ZGV2X2FsbG9jX3BhZ2UocnhfcmluZy0+bmV0ZGV2KTsKKwkJCQliaS0+cGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyB8IF9fR0ZQX0NPTEQpOwogCQkJCWlmICghYmktPnBhZ2UpIHsKIAkJCQkJcnhfcmluZy0+cnhfc3RhdHMuYWxsb2NfcnhfcGFnZV9mYWlsZWQrKzsKIAkJCQkJZ290byBub19idWZmZXJzOwpAQCAtMjE1Niw3ICsyMTU5LDcgQEAKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0VJTUMsIElYR0JFX0lSUV9DTEVBUl9NQVNLKTsKIAogCS8qIGZvciBOQVBJLCB1c2luZyBFSUFNIHRvIGF1dG8tbWFzayB0eC9yeCBpbnRlcnJ1cHQgYml0cyBvbiByZWFkCi0JICogdGhlcmVmb3JlIG5vIGV4cGxpY3QgaW50ZXJydXB0IGRpc2FibGUgaXMgbmVjZXNzYXJ5ICovCisJICogdGhlcmVmb3JlIG5vIGV4cGxpY2l0IGludGVycnVwdCBkaXNhYmxlIGlzIG5lY2Vzc2FyeSAqLwogCWVpY3IgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfRUlDUik7CiAJaWYgKCFlaWNyKSB7CiAJCS8qCkBAIC0zMDQ0LDcgKzMwNDcsNyBAQAogCWh3LT5tYWMub3BzLmVuYWJsZV9yeF9kbWEoaHcsIHJ4Y3RybCk7CiB9CiAKLXN0YXRpYyB2b2lkIGl4Z2JlX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQorc3RhdGljIGludCBpeGdiZV92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTMwNTMsOSArMzA1NiwxMSBAQAogCS8qIGFkZCBWSUQgdG8gZmlsdGVyIHRhYmxlICovCiAJaHctPm1hYy5vcHMuc2V0X3ZmdGEoJmFkYXB0ZXItPmh3LCB2aWQsIHBvb2xfbmR4LCB0cnVlKTsKIAlzZXRfYml0KHZpZCwgYWRhcHRlci0+YWN0aXZlX3ZsYW5zKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBpeGdiZV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUxNiB2aWQpCitzdGF0aWMgaW50IGl4Z2JlX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgaXhnYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IGl4Z2JlX2h3ICpodyA9ICZhZGFwdGVyLT5odzsKQEAgLTMwNjQsNiArMzA2OSw4IEBACiAJLyogcmVtb3ZlIFZJRCBmcm9tIGZpbHRlciB0YWJsZSAqLwogCWh3LT5tYWMub3BzLnNldF92ZnRhKCZhZGFwdGVyLT5odywgdmlkLCBwb29sX25keCwgZmFsc2UpOwogCWNsZWFyX2JpdCh2aWQsIGFkYXB0ZXItPmFjdGl2ZV92bGFucyk7CisKKwlyZXR1cm4gMDsKIH0KIAogLyoqCkBAIC0zNjAyLDcgKzM2MDksNyBAQAogc3RhdGljIHZvaWQgaXhnYmVfc2ZwX2xpbmtfY29uZmlnKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKQogewogCS8qCi0JICogV2UgYXJlIGFzc3VtaW5nIHRoZSB3b3JzdCBjYXNlIHNjZW5lcmlvIGhlcmUsIGFuZCB0aGF0CisJICogV2UgYXJlIGFzc3VtaW5nIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvIGhlcmUsIGFuZCB0aGF0CiAJICogaXMgdGhhdCBhbiBTRlAgd2FzIGluc2VydGVkL3JlbW92ZWQgYWZ0ZXIgdGhlIHJlc2V0CiAJICogYnV0IGJlZm9yZSBTRlAgZGV0ZWN0aW9uIHdhcyBlbmFibGVkLiAgQXMgc3VjaCB0aGUgYmVzdAogCSAqIHNvbHV0aW9uIGlzIHRvIGp1c3Qgc3RhcnQgc2VhcmNoaW5nIGFzIHNvb24gYXMgd2Ugc3RhcnQKQEAgLTM4MjQsNyArMzgzMSw3IEBACiAJY2FzZSBJWEdCRV9FUlJfRUVQUk9NX1ZFUlNJT046CiAJCS8qIFdlIGFyZSBydW5uaW5nIG9uIGEgcHJlLXByb2R1Y3Rpb24gZGV2aWNlLCBsb2cgYSB3YXJuaW5nICovCiAJCWVfZGV2X3dhcm4oIlRoaXMgZGV2aWNlIGlzIGEgcHJlLXByb2R1Y3Rpb24gYWRhcHRlci9MT00uICIKLQkJCSAgICJQbGVhc2UgYmUgYXdhcmUgdGhlcmUgbWF5IGJlIGlzc3Vlc2Fzc29jaWF0ZWQgd2l0aCAiCisJCQkgICAiUGxlYXNlIGJlIGF3YXJlIHRoZXJlIG1heSBiZSBpc3N1ZXMgYXNzb2NpYXRlZCB3aXRoICIKIAkJCSAgICJ5b3VyIGhhcmR3YXJlLiAgSWYgeW91IGFyZSBleHBlcmllbmNpbmcgcHJvYmxlbXMgIgogCQkJICAgInBsZWFzZSBjb250YWN0IHlvdXIgSW50ZWwgb3IgaGFyZHdhcmUgIgogCQkJICAgInJlcHJlc2VudGF0aXZlIHdobyBwcm92aWRlZCB5b3Ugd2l0aCB0aGlzICIKQEAgLTQwMTksNyArNDAyNiw3IEBACiAKIAkJLyogTWFyayBhbGwgdGhlIFZGcyBhcyBpbmFjdGl2ZSAqLwogCQlmb3IgKGkgPSAwIDsgaSA8IGFkYXB0ZXItPm51bV92ZnM7IGkrKykKLQkJCWFkYXB0ZXItPnZmaW5mb1tpXS5jbGVhcl90b19zZW5kID0gMDsKKwkJCWFkYXB0ZXItPnZmaW5mb1tpXS5jbGVhcl90b19zZW5kID0gZmFsc2U7CiAKIAkJLyogcGluZyBhbGwgdGhlIGFjdGl2ZSB2ZnMgdG8gbGV0IHRoZW0ga25vdyB3ZSBhcmUgZ29pbmcgZG93biAqLwogCQlpeGdiZV9waW5nX2FsbF92ZnMoYWRhcHRlcik7CkBAIC01Nzg4LDkgKzU3OTUsOSBAQAogICogQGFkYXB0ZXIgLSBwb2ludGVyIHRvIHRoZSBkZXZpY2UgYWRhcHRlciBzdHJ1Y3R1cmUKICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHNlcnZlcyB0d28gcHVycG9zZXMuICBGaXJzdCBpdCBzdHJvYmVzIHRoZSBpbnRlcnJ1cHQgbGluZXMKLSAqIGluIG9yZGVyIHRvIG1ha2UgY2VydGFpbiBpbnRlcnJ1cHRzIGFyZSBvY2N1cmluZy4gIFNlY29uZGx5IGl0IHNldHMgdGhlCisgKiBpbiBvcmRlciB0byBtYWtlIGNlcnRhaW4gaW50ZXJydXB0cyBhcmUgb2NjdXJyaW5nLiAgU2Vjb25kbHkgaXQgc2V0cyB0aGUKICAqIGJpdHMgbmVlZGVkIHRvIGNoZWNrIGZvciBUWCBoYW5ncy4gIEFzIGEgcmVzdWx0IHdlIHNob3VsZCBpbW1lZGlhdGVseQotICogZGV0ZXJtaW5lIGlmIGEgaGFuZyBoYXMgb2NjdXJlZC4KKyAqIGRldGVybWluZSBpZiBhIGhhbmcgaGFzIG9jY3VycmVkLgogICovCiBzdGF0aWMgdm9pZCBpeGdiZV9jaGVja19oYW5nX3N1YnRhc2soc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpCiB7CkBAIC03MTI4LDcgKzcxMzUsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEhhcmR3YXJlIGhhcyB0byByZWluaXRpYWxpemUgcXVldWVzIGFuZCBpbnRlcnJ1cHRzIHRvCi0JICogbWF0Y2ggcGFja2V0IGJ1ZmZlciBhbGlnbm1lbnQuIFVuZm9ydHVuYW50bHksIHRoZQorCSAqIG1hdGNoIHBhY2tldCBidWZmZXIgYWxpZ25tZW50LiBVbmZvcnR1bmF0ZWx5LCB0aGUKIAkgKiBoYXJkd2FyZSBpcyBub3QgZmxleGlibGUgZW5vdWdoIHRvIGRvIHRoaXMgZHluYW1pY2FsbHkuCiAJICovCiAJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkKQEAgLTcxNzQsNyArNzE4MSw4IEBACiAJCWl4Z2JlX3Jlc2V0KGFkYXB0ZXIpOwogfQogCi1zdGF0aWMgdTMyIGl4Z2JlX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZGF0YSkKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBpeGdiZV9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBkYXRhKQogewogCXN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtNzIwNCw3ICs3MjEyLDggQEAKIAlyZXR1cm4gZGF0YTsKIH0KIAotc3RhdGljIGludCBpeGdiZV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGRhdGEpCitzdGF0aWMgaW50IGl4Z2JlX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGRhdGEpCiB7CiAJc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCWJvb2wgbmVlZF9yZXNldCA9IGZhbHNlOwpAQCAtNzI4Niw2ICs3Mjk1LDcgQEAKIAkubmRvX2Zjb2VfZW5hYmxlID0gaXhnYmVfZmNvZV9lbmFibGUsCiAJLm5kb19mY29lX2Rpc2FibGUgPSBpeGdiZV9mY29lX2Rpc2FibGUsCiAJLm5kb19mY29lX2dldF93d24gPSBpeGdiZV9mY29lX2dldF93d24sCisJLm5kb19mY29lX2dldF9oYmFpbmZvID0gaXhnYmVfZmNvZV9nZXRfaGJhaW5mbywKICNlbmRpZiAvKiBJWEdCRV9GQ09FICovCiAJLm5kb19zZXRfZmVhdHVyZXMgPSBpeGdiZV9zZXRfZmVhdHVyZXMsCiAJLm5kb19maXhfZmVhdHVyZXMgPSBpeGdiZV9maXhfZmVhdHVyZXMsCkBAIC03NTk4LDkgKzc2MDgsMTYgQEAKIAlhZGFwdGVyLT53b2wgPSAwOwogCXN3aXRjaCAocGRldi0+ZGV2aWNlKSB7CiAJY2FzZSBJWEdCRV9ERVZfSURfODI1OTlfU0ZQOgotCQkvKiBPbmx5IHRoaXMgc3ViZGV2aWNlIHN1cHBvcnRzIFdPTCAqLwotCQlpZiAocGRldi0+c3Vic3lzdGVtX2RldmljZSA9PSBJWEdCRV9TVUJERVZfSURfODI1OTlfU0ZQKQorCQkvKiBPbmx5IHRoZXNlIHN1YmRldmljZSBzdXBwb3J0cyBXT0wgKi8KKwkJc3dpdGNoIChwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKSB7CisJCWNhc2UgSVhHQkVfU1VCREVWX0lEXzgyNTk5XzU2MEZMUjoKKwkJCS8qIG9ubHkgc3VwcG9ydCBmaXJzdCBwb3J0ICovCisJCQlpZiAoaHctPmJ1cy5mdW5jICE9IDApCisJCQkJYnJlYWs7CisJCWNhc2UgSVhHQkVfU1VCREVWX0lEXzgyNTk5X1NGUDoKIAkJCWFkYXB0ZXItPndvbCA9IElYR0JFX1dVRkNfTUFHOworCQkJYnJlYWs7CisJCX0KIAkJYnJlYWs7CiAJY2FzZSBJWEdCRV9ERVZfSURfODI1OTlfQ09NQk9fQkFDS1BMQU5FOgogCQkvKiBBbGwgZXhjZXB0IHRoaXMgc3ViZGV2aWNlIHN1cHBvcnQgV09MICovCkBAIC03NzA4LDcgKzc3MjUsNyBAQAogCS8qIGFkZCBzYW4gbWFjIGFkZHIgdG8gbmV0ZGV2ICovCiAJaXhnYmVfYWRkX3Nhbm1hY19uZXRkZXYobmV0ZGV2KTsKIAotCWVfZGV2X2luZm8oIkludGVsKFIpIDEwIEdpZ2FiaXQgTmV0d29yayBDb25uZWN0aW9uXG4iKTsKKwllX2Rldl9pbmZvKCIlc1xuIiwgaXhnYmVfZGVmYXVsdF9kZXZpY2VfZGVzY3IpOwogCWNhcmRzX2ZvdW5kKys7CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3BoeS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcGh5LmMKaW5kZXggOWE1NmZkNy4uN2NmMWUxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfcGh5LmMKQEAgLTEyMTQsNyArMTIxNCw3IEBACiAJdTMyIG1heF9yZXRyeSA9IDEwOwogCXUzMiByZXRyeSA9IDA7CiAJdTE2IHN3ZndfbWFzayA9IDA7Ci0JYm9vbCBuYWNrID0gMTsKKwlib29sIG5hY2sgPSB0cnVlOwogCSpkYXRhID0gMDsKIAogCWlmIChJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfU1RBVFVTKSAmIElYR0JFX1NUQVRVU19MQU5fSURfMSkKQEAgLTE0MjEsNyArMTQyMSw3IEBACiBzdGF0aWMgczMyIGl4Z2JlX2Nsb2NrX2luX2kyY19ieXRlKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4ICpkYXRhKQogewogCXMzMiBpOwotCWJvb2wgYml0ID0gMDsKKwlib29sIGJpdCA9IGZhbHNlOwogCiAJZm9yIChpID0gNzsgaSA+PSAwOyBpLS0pIHsKIAkJaXhnYmVfY2xvY2tfaW5faTJjX2JpdChodywgJmJpdCk7CkBAIC0xNDQzLDcgKzE0NDMsNyBAQAogCXMzMiBzdGF0dXMgPSAwOwogCXMzMiBpOwogCXUzMiBpMmNjdGw7Ci0JYm9vbCBiaXQgPSAwOworCWJvb2wgYml0ID0gZmFsc2U7CiAKIAlmb3IgKGkgPSA3OyBpID49IDA7IGktLSkgewogCQliaXQgPSAoZGF0YSA+PiBpKSAmIDB4MTsKQEAgLTE0NTcsNiArMTQ1Nyw3IEBACiAJaTJjY3RsID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX0kyQ0NUTCk7CiAJaTJjY3RsIHw9IElYR0JFX0kyQ19EQVRBX09VVDsKIAlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX0kyQ0NUTCwgaTJjY3RsKTsKKwlJWEdCRV9XUklURV9GTFVTSChodyk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTQ3Myw3ICsxNDc0LDcgQEAKIAl1MzIgaSA9IDA7CiAJdTMyIGkyY2N0bCA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9JMkNDVEwpOwogCXUzMiB0aW1lb3V0ID0gMTA7Ci0JYm9vbCBhY2sgPSAxOworCWJvb2wgYWNrID0gdHJ1ZTsKIAogCWl4Z2JlX3JhaXNlX2kyY19jbGsoaHcsICZpMmNjdGwpOwogCkBAIC0xNjQ2LDkgKzE2NDcsOSBAQAogCWJvb2wgZGF0YTsKIAogCWlmICgqaTJjY3RsICYgSVhHQkVfSTJDX0RBVEFfSU4pCi0JCWRhdGEgPSAxOworCQlkYXRhID0gdHJ1ZTsKIAllbHNlCi0JCWRhdGEgPSAwOworCQlkYXRhID0gZmFsc2U7CiAKIAlyZXR1cm4gZGF0YTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5jCmluZGV4IDAwZmNkMzkuLmNmNjgxMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuYwpAQCAtNTcyLDcgKzU3Miw3IEBACiAKIAkJLyogcmVwbHkgdG8gcmVzZXQgd2l0aCBhY2sgYW5kIHZmIG1hYyBhZGRyZXNzICovCiAJCW1zZ2J1ZlswXSA9IElYR0JFX1ZGX1JFU0VUIHwgSVhHQkVfVlRfTVNHVFlQRV9BQ0s7Ci0JCW1lbWNweShuZXdfbWFjLCB2Zl9tYWMsIElYR0JFX0VUSF9MRU5HVEhfT0ZfQUREUkVTUyk7CisJCW1lbWNweShuZXdfbWFjLCB2Zl9tYWMsIEVUSF9BTEVOKTsKIAkJLyoKIAkJICogUGlnZ3liYWNrIHRoZSBtdWx0aWNhc3QgZmlsdGVyIHR5cGUgc28gVkYgY2FuIGNvbXB1dGUgdGhlCiAJCSAqIGNvcnJlY3QgdmVjdG9ycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3NyaW92LmgKaW5kZXggZGYwNGYxYS4uZThiYWRhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfc3Jpb3YuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV9zcmlvdi5oCkBAIC0zMyw3ICszMyw2IEBACiBpbnQgaXhnYmVfdmZfY29uZmlndXJhdGlvbihzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdW5zaWduZWQgaW50IGV2ZW50X21hc2spOwogdm9pZCBpeGdiZV9kaXNhYmxlX3R4X3J4KHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKIHZvaWQgaXhnYmVfcGluZ19hbGxfdmZzKHN0cnVjdCBpeGdiZV9hZGFwdGVyICphZGFwdGVyKTsKLXZvaWQgaXhnYmVfZHVtcF9yZWdpc3RlcnMoc3RydWN0IGl4Z2JlX2FkYXB0ZXIgKmFkYXB0ZXIpOwogaW50IGl4Z2JlX25kb19zZXRfdmZfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBxdWV1ZSwgdTggKm1hYyk7CiBpbnQgaXhnYmVfbmRvX3NldF92Zl92bGFuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBxdWV1ZSwgdTE2IHZsYW4sCiAJCQkgICB1OCBxb3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfdHlwZS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfdHlwZS5oCmluZGV4IDZjNWNjYTguLjgwMmJmYTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3R5cGUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV90eXBlLmgKQEAgLTU3LDYgKzU3LDcgQEAKICNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk5X0JBQ0tQTEFORV9GQ09FICAgICAgIDB4MTUyYQogI2RlZmluZSBJWEdCRV9ERVZfSURfODI1OTlfU0ZQX0ZDT0UgICAgICAweDE1MjkKICNkZWZpbmUgSVhHQkVfU1VCREVWX0lEXzgyNTk5X1NGUCAgICAgICAgMHgxMUE5CisjZGVmaW5lIElYR0JFX1NVQkRFVl9JRF84MjU5OV81NjBGTFIgICAgIDB4MTdEMAogI2RlZmluZSBJWEdCRV9ERVZfSURfODI1OTlfU0ZQX0VNICAgICAgICAweDE1MDcKICNkZWZpbmUgSVhHQkVfREVWX0lEXzgyNTk5X1NGUF9TRjIgICAgICAgMHgxNTRECiAjZGVmaW5lIElYR0JFX0RFVl9JRF84MjU5OUVOX1NGUCAgICAgICAgIDB4MTU1NwpAQCAtNjUsNiArNjYsNyBAQAogI2RlZmluZSBJWEdCRV9TVUJERVZfSURfODI1OTlfS1g0X0tSX01FWlogIDB4MDAwQwogI2RlZmluZSBJWEdCRV9ERVZfSURfODI1OTlfTFMgICAgICAgICAgICAweDE1NEYKICNkZWZpbmUgSVhHQkVfREVWX0lEX1g1NDBUICAgICAgICAgICAgICAgMHgxNTI4CisjZGVmaW5lIElYR0JFX0RFVl9JRF84MjU5OV9TRlBfU0ZfUVAgICAgIDB4MTU0QQogCiAvKiBWRiBEZXZpY2UgSURzICovCiAjZGVmaW5lIElYR0JFX0RFVl9JRF84MjU5OV9WRiAgICAgICAgICAgMHgxMEVECkBAIC0xNzEwLDggKzE3MTIsNiBAQAogI2RlZmluZSBJWEdCRV9OVk1fUE9MTF9XUklURSAgICAgICAxICAvKiBGbGFnIGZvciBwb2xsaW5nIGZvciB3cml0ZSBjb21wbGV0ZSAqLwogI2RlZmluZSBJWEdCRV9OVk1fUE9MTF9SRUFEICAgICAgICAwICAvKiBGbGFnIGZvciBwb2xsaW5nIGZvciByZWFkIGNvbXBsZXRlICovCiAKLSNkZWZpbmUgSVhHQkVfRVRIX0xFTkdUSF9PRl9BRERSRVNTICAgNgotCiAjZGVmaW5lIElYR0JFX0VFUFJPTV9QQUdFX1NJWkVfTUFYICAgICAgIDEyOAogI2RlZmluZSBJWEdCRV9FRVBST01fUkRfQlVGRkVSX01BWF9DT1VOVCA1MTIgLyogRUVQUk9NIHdvcmRzICMgcmVhZCBpbiBidXJzdCAqLwogI2RlZmluZSBJWEdCRV9FRVBST01fV1JfQlVGRkVSX01BWF9DT1VOVCAyNTYgLyogRUVQUk9NIHdvcmRzICMgd3IgaW4gYnVyc3QgKi8KQEAgLTI4MDIsOSArMjgwMiw5IEBACiBzdHJ1Y3QgaXhnYmVfbWFjX2luZm8gewogCXN0cnVjdCBpeGdiZV9tYWNfb3BlcmF0aW9ucyAgICAgb3BzOwogCWVudW0gaXhnYmVfbWFjX3R5cGUgICAgICAgICAgICAgdHlwZTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJbSVhHQkVfRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKLQl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1fYWRkcltJWEdCRV9FVEhfTEVOR1RIX09GX0FERFJFU1NdOwotCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FuX2FkZHJbSVhHQkVfRVRIX0xFTkdUSF9PRl9BRERSRVNTXTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJbRVRIX0FMRU5dOworCXU4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybV9hZGRyW0VUSF9BTEVOXTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbl9hZGRyW0VUSF9BTEVOXTsKIAkvKiBwcmVmaXggZm9yIFdvcmxkIFdpZGUgTm9kZSBOYW1lIChXV05OKSAqLwogCXUxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3dubl9wcmVmaXg7CiAJLyogcHJlZml4IGZvciBXb3JsZCBXaWRlIFBvcnQgTmFtZSAoV1dQTikgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3g1NDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JlL2l4Z2JlX3g1NDAuYwppbmRleCBlNTEwMWU5Li44Y2M1ZWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZS9peGdiZV94NTQwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmUvaXhnYmVfeDU0MC5jCkBAIC03NTEsMTYgKzc1MSwyMCBAQAogewogCXUzMiBtYWNjX3JlZzsKIAl1MzIgbGVkY3RsX3JlZzsKKwlpeGdiZV9saW5rX3NwZWVkIHNwZWVkOworCWJvb2wgbGlua191cDsKIAogCS8qCi0JICogSW4gb3JkZXIgZm9yIHRoZSBibGluayBiaXQgaW4gdGhlIExFRCBjb250cm9sIHJlZ2lzdGVyCi0JICogdG8gd29yaywgbGluayBhbmQgc3BlZWQgbXVzdCBiZSBmb3JjZWQgaW4gdGhlIE1BQy4gV2UKLQkgKiB3aWxsIHJldmVyc2UgdGhpcyB3aGVuIHdlIHN0b3AgdGhlIGJsaW5raW5nLgorCSAqIExpbmsgc2hvdWxkIGJlIHVwIGluIG9yZGVyIGZvciB0aGUgYmxpbmsgYml0IGluIHRoZSBMRUQgY29udHJvbAorCSAqIHJlZ2lzdGVyIHRvIHdvcmsuIEZvcmNlIGxpbmsgYW5kIHNwZWVkIGluIHRoZSBNQUMgaWYgbGluayBpcyBkb3duLgorCSAqIFRoaXMgd2lsbCBiZSByZXZlcnNlZCB3aGVuIHdlIHN0b3AgdGhlIGJsaW5raW5nLgogCSAqLwotCW1hY2NfcmVnID0gSVhHQkVfUkVBRF9SRUcoaHcsIElYR0JFX01BQ0MpOwotCW1hY2NfcmVnIHw9IElYR0JFX01BQ0NfRkxVIHwgSVhHQkVfTUFDQ19GU1ZfMTBHIHwgSVhHQkVfTUFDQ19GUzsKLQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01BQ0MsIG1hY2NfcmVnKTsKLQorCWh3LT5tYWMub3BzLmNoZWNrX2xpbmsoaHcsICZzcGVlZCwgJmxpbmtfdXAsIGZhbHNlKTsKKwlpZiAobGlua191cCA9PSBmYWxzZSkgeworCQltYWNjX3JlZyA9IElYR0JFX1JFQURfUkVHKGh3LCBJWEdCRV9NQUNDKTsKKwkJbWFjY19yZWcgfD0gSVhHQkVfTUFDQ19GTFUgfCBJWEdCRV9NQUNDX0ZTVl8xMEcgfCBJWEdCRV9NQUNDX0ZTOworCQlJWEdCRV9XUklURV9SRUcoaHcsIElYR0JFX01BQ0MsIG1hY2NfcmVnKTsKKwl9CiAJLyogU2V0IHRoZSBMRUQgdG8gTElOS19VUCArIEJMSU5LLiAqLwogCWxlZGN0bF9yZWcgPSBJWEdCRV9SRUFEX1JFRyhodywgSVhHQkVfTEVEQ1RMKTsKIAlsZWRjdGxfcmVnICY9IH5JWEdCRV9MRURfTU9ERV9NQVNLKGluZGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvZGVmaW5lcy5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9kZWZpbmVzLmgKaW5kZXggNzhhYmI2Zi4uMmViODljYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9kZWZpbmVzLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9kZWZpbmVzLmgKQEAgLTM1LDcgKzM1LDYgQEAKICNkZWZpbmUgSVhHQkVfVkZfSVJRX0NMRUFSX01BU0sgICAgICAgICA3CiAjZGVmaW5lIElYR0JFX1ZGX01BWF9UWF9RVUVVRVMgICAgICAgICAgMQogI2RlZmluZSBJWEdCRV9WRl9NQVhfUlhfUVVFVUVTICAgICAgICAgIDEKLSNkZWZpbmUgSVhHQkVfRVRIX0xFTkdUSF9PRl9BRERSRVNTICAgICA2CiAKIC8qIExpbmsgc3BlZWQgKi8KIHR5cGVkZWYgdTMyIGl4Z2JlX2xpbmtfc3BlZWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvZXRodG9vbC5jCmluZGV4IGUyOWJhNDUuLmRjOGU2NTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvZXRodG9vbC5jCkBAIC0yNyw2ICsyNyw4IEBACiAKIC8qIGV0aHRvb2wgc3VwcG9ydCBmb3IgaXhnYmV2ZiAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTI2NSwxMSArMjY3LDExIEBACiB7CiAJc3RydWN0IGl4Z2JldmZfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgaXhnYmV2Zl9kcml2ZXJfbmFtZSwgMzIpOwotCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgaXhnYmV2Zl9kcml2ZXJfdmVyc2lvbiwgMzIpOwotCi0Jc3RybGNweShkcnZpbmZvLT5md192ZXJzaW9uLCAiTi9BIiwgNCk7Ci0Jc3RybGNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksIDMyKTsKKwlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgaXhnYmV2Zl9kcml2ZXJfbmFtZSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgaXhnYmV2Zl9kcml2ZXJfdmVyc2lvbiwKKwkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKKwkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JldmZfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LApAQCAtNTQ5LDggKzU1MSw4IEBACiAJd3JpdGVsKChXICYgTSksIChhZGFwdGVyLT5ody5od19hZGRyICsgUikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAl2YWwgPSByZWFkbChhZGFwdGVyLT5ody5od19hZGRyICsgUik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogCWlmICgoVyAmIE0pICE9ICh2YWwgJiBNKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0JCXByaW50ayhLRVJOX0VSUiAic2V0L2NoZWNrIHJlZyAlMDRYIHRlc3QgZmFpbGVkOiBnb3QgMHglMDhYICIgXAotCQkJCSAiZXhwZWN0ZWQgMHglMDhYXG4iLCBSLCAodmFsICYgTSksIChXICYgTSkpOyBcCisJCXByX2Vycigic2V0L2NoZWNrIHJlZyAlMDRYIHRlc3QgZmFpbGVkOiBnb3QgMHglMDhYIGV4cGVjdGVkICIgXAorCQkgICAgICAgIjB4JTA4WFxuIiwgUiwgKHZhbCAmIE0pLCAoVyAmIE0pKTsgICAgICAgICAgICAgICAgICAgIFwKIAkJKmRhdGEgPSBSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCXdyaXRlbChiZWZvcmUsIChhZGFwdGVyLT5ody5od19hZGRyICsgUikpOyAgICAgICAgICAgICAgICAgICAgXAogCQlyZXR1cm4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL2l4Z2JldmZfbWFpbi5jCmluZGV4IDRjOGUxOTkuLjg5MTE2MmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvaXhnYmV2Zl9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9peGdiZXZmX21haW4uYwpAQCAtMjksNiArMjksOSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIENvcHlyaWdodCAoYykyMDA2IC0gMjAwNyBNeXJpY29tLCBJbmMuIGZvciBzb21lIExSTyBzcGVjaWZpYyBjb2RlCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC0zNjMsNyArMzY2LDcgQEAKIAkJaWYgKCFiaS0+cGFnZV9kbWEgJiYKIAkJICAgIChhZGFwdGVyLT5mbGFncyAmIElYR0JFX0ZMQUdfUlhfUFNfRU5BQkxFRCkpIHsKIAkJCWlmICghYmktPnBhZ2UpIHsKLQkJCQliaS0+cGFnZSA9IG5ldGRldl9hbGxvY19wYWdlKGFkYXB0ZXItPm5ldGRldik7CisJCQkJYmktPnBhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMgfCBfX0dGUF9DT0xEKTsKIAkJCQlpZiAoIWJpLT5wYWdlKSB7CiAJCQkJCWFkYXB0ZXItPmFsbG9jX3J4X3BhZ2VfZmFpbGVkKys7CiAJCQkJCWdvdG8gbm9fYnVmZmVyczsKQEAgLTE0MDAsNyArMTQwMyw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpeGdiZXZmX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQorc3RhdGljIGludCBpeGdiZXZmX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBpeGdiZV9odyAqaHcgPSAmYWRhcHRlci0+aHc7CkBAIC0xNDA5LDkgKzE0MTIsMTEgQEAKIAlpZiAoaHctPm1hYy5vcHMuc2V0X3ZmdGEpCiAJCWh3LT5tYWMub3BzLnNldF92ZnRhKGh3LCB2aWQsIDAsIHRydWUpOwogCXNldF9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOworCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGl4Z2JldmZfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQorc3RhdGljIGludCBpeGdiZXZmX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgaXhnYmVfaHcgKmh3ID0gJmFkYXB0ZXItPmh3OwpAQCAtMTQyMCw2ICsxNDI1LDggQEAKIAlpZiAoaHctPm1hYy5vcHMuc2V0X3ZmdGEpCiAJCWh3LT5tYWMub3BzLnNldF92ZnRhKGh3LCB2aWQsIDAsIGZhbHNlKTsKIAljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGl4Z2JldmZfcmVzdG9yZV92bGFuKHN0cnVjdCBpeGdiZXZmX2FkYXB0ZXIgKmFkYXB0ZXIpCkBAIC0xNDM3LDcgKzE0NDQsNyBAQAogCWludCBjb3VudCA9IDA7CiAKIAlpZiAoKG5ldGRldl91Y19jb3VudChuZXRkZXYpKSA+IDEwKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiVG9vIG1hbnkgdW5pY2FzdCBmaWx0ZXJzIC0gTm8gU3BhY2VcbiIpOworCQlwcl9lcnIoIlRvbyBtYW55IHVuaWNhc3QgZmlsdGVycyAtIE5vIFNwYWNlXG4iKTsKIAkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCkBAIC0yMTM1LDcgKzIxNDIsNyBAQAogCiAJZXJyID0gaXhnYmV2Zl9hbGxvY19xdWV1ZXMoYWRhcHRlcik7CiAJaWYgKGVycikgewotCQlwcmludGsoS0VSTl9FUlIgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHF1ZXVlc1xuIik7CisJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgcXVldWVzXG4iKTsKIAkJZ290byBlcnJfYWxsb2NfcXVldWVzOwogCX0KIApAQCAtMjE4OSw3ICsyMTk2LDcgQEAKIAl9IGVsc2UgewogCQllcnIgPSBody0+bWFjLm9wcy5pbml0X2h3KGh3KTsKIAkJaWYgKGVycikgewotCQkJcHJpbnRrKEtFUk5fRVJSICJpbml0X3NoYXJlZF9jb2RlIGZhaWxlZDogJWRcbiIsIGVycik7CisJCQlwcl9lcnIoImluaXRfc2hhcmVkX2NvZGUgZmFpbGVkOiAlZFxuIiwgZXJyKTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJfQpAQCAtMjYzMCw4ICsyNjM3LDggQEAKIAkJICogdGhlIHZmIGNhbid0IHN0YXJ0LiAqLwogCQlpZiAoaHctPmFkYXB0ZXJfc3RvcHBlZCkgewogCQkJZXJyID0gSVhHQkVfRVJSX01CWDsKLQkJCXByaW50ayhLRVJOX0VSUiAiVW5hYmxlIHRvIHN0YXJ0IC0gcGVyaGFwcyB0aGUgUEYiCi0JCQkgICAgICAgIiBEcml2ZXIgaXNuJ3QgdXAgeWV0XG4iKTsKKwkJCXByX2VycigiVW5hYmxlIHRvIHN0YXJ0IC0gcGVyaGFwcyB0aGUgUEYgRHJpdmVyIGlzbid0ICIKKwkJCSAgICAgICAidXAgeWV0XG4iKTsKIAkJCWdvdG8gZXJyX3NldHVwX3Jlc2V0OwogCQl9CiAJfQpAQCAtMjg0MiwxMCArMjg0OSw4IEBACiAJCQkJYnJlYWs7CiAJCQlkZWZhdWx0OgogCQkJCWlmICh1bmxpa2VseShuZXRfcmF0ZWxpbWl0KCkpKSB7Ci0JCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKLQkJCQkJICAgICAgICJwYXJ0aWFsIGNoZWNrc3VtIGJ1dCAiCi0JCQkJCSAgICAgICAicHJvdG89JXghXG4iLAotCQkJCQkgICAgICAgc2tiLT5wcm90b2NvbCk7CisJCQkJCXByX3dhcm4oInBhcnRpYWwgY2hlY2tzdW0gYnV0ICIKKwkJCQkJCSJwcm90bz0leCFcbiIsIHNrYi0+cHJvdG9jb2wpOwogCQkJCX0KIAkJCQlicmVhazsKIAkJCX0KQEAgLTMyNDksNyArMzI1NCw4IEBACiAJcmV0dXJuIHN0YXRzOwogfQogCi1zdGF0aWMgaW50IGl4Z2JldmZfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgaXhnYmV2Zl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgaXhnYmV2Zl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIApAQCAtMzQxNCw3ICszNDIwLDcgQEAKIAltZW1jcHkobmV0ZGV2LT5wZXJtX2FkZHIsIGFkYXB0ZXItPmh3Lm1hYy5hZGRyLCBuZXRkZXYtPmFkZHJfbGVuKTsKIAogCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKSkgewotCQlwcmludGsoS0VSTl9FUlIgImludmFsaWQgTUFDIGFkZHJlc3NcbiIpOworCQlwcl9lcnIoImludmFsaWQgTUFDIGFkZHJlc3NcbiIpOwogCQllcnIgPSAtRUlPOwogCQlnb3RvIGVycl9zd19pbml0OwogCX0KQEAgLTM1MzUsMTAgKzM1NDEsMTAgQEAKIHN0YXRpYyBpbnQgX19pbml0IGl4Z2JldmZfaW5pdF9tb2R1bGUodm9pZCkKIHsKIAlpbnQgcmV0OwotCXByaW50ayhLRVJOX0lORk8gIml4Z2JldmY6ICVzIC0gdmVyc2lvbiAlc1xuIiwgaXhnYmV2Zl9kcml2ZXJfc3RyaW5nLAotCSAgICAgICBpeGdiZXZmX2RyaXZlcl92ZXJzaW9uKTsKKwlwcl9pbmZvKCIlcyAtIHZlcnNpb24gJXNcbiIsIGl4Z2JldmZfZHJpdmVyX3N0cmluZywKKwkJaXhnYmV2Zl9kcml2ZXJfdmVyc2lvbik7CiAKLQlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgaXhnYmV2Zl9jb3B5cmlnaHQpOworCXByX2luZm8oIiVzXG4iLCBpeGdiZXZmX2NvcHlyaWdodCk7CiAKIAlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpeGdiZXZmX2RyaXZlcik7CiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvbWJ4LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL21ieC5oCmluZGV4IGVhMzkzZWIuLjlkMzhhOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvbWJ4LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9tYnguaApAQCAtNDcsOCArNDcsOCBAQAogI2RlZmluZSBJWEdCRV9WRk1BSUxCT1hfUlNURCAgICAgMHgwMDAwMDA4MCAvKiBQRiBoYXMgaW5kaWNhdGVkIHJlc2V0IGRvbmUgKi8KICNkZWZpbmUgSVhHQkVfVkZNQUlMQk9YX1IyQ19CSVRTIDB4MDAwMDAwQjAgLyogQWxsIHJlYWQgdG8gY2xlYXIgYml0cyAqLwogCi0jZGVmaW5lIElYR0JFX1BGTUFJTEJPWCh4KSAgICAgICAgICAoMHgwNEIwMCArICg0ICogeCkpCi0jZGVmaW5lIElYR0JFX1BGTUJNRU0odmZuKSAgICAgICAgICAoMHgxMzAwMCArICg2NCAqIHZmbikpCisjZGVmaW5lIElYR0JFX1BGTUFJTEJPWCh4KSAgICAgICAgICAoMHgwNEIwMCArICg0ICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfUEZNQk1FTSh2Zm4pICAgICAgICAgICgweDEzMDAwICsgKDY0ICogKHZmbikpKQogCiAjZGVmaW5lIElYR0JFX1BGTUFJTEJPWF9TVFMgICAweDAwMDAwMDAxIC8qIEluaXRpYXRlIG1lc3NhZ2Ugc2VuZCB0byBWRiAqLwogI2RlZmluZSBJWEdCRV9QRk1BSUxCT1hfQUNLICAgMHgwMDAwMDAwMiAvKiBBY2sgbWVzc2FnZSByZWN2J2QgZnJvbSBWRiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi9yZWdzLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL3JlZ3MuaAppbmRleCAxODkyMDBlLi41ZTRkNWU1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL3JlZ3MuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL3JlZ3MuaApAQCAtMzksMjkgKzM5LDI5IEBACiAjZGVmaW5lIElYR0JFX1ZURUlNQyAgICAgICAgICAgMHgwMDEwQwogI2RlZmluZSBJWEdCRV9WVEVJQUMgICAgICAgICAgIDB4MDAxMTAKICNkZWZpbmUgSVhHQkVfVlRFSUFNICAgICAgICAgICAweDAwMTE0Ci0jZGVmaW5lIElYR0JFX1ZURUlUUih4KSAgICAgICAgKDB4MDA4MjAgKyAoNCAqIHgpKQotI2RlZmluZSBJWEdCRV9WVElWQVIoeCkgICAgICAgICgweDAwMTIwICsgKDQgKiB4KSkKKyNkZWZpbmUgSVhHQkVfVlRFSVRSKHgpICAgICAgICAoMHgwMDgyMCArICg0ICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVlRJVkFSKHgpICAgICAgICAoMHgwMDEyMCArICg0ICogKHgpKSkKICNkZWZpbmUgSVhHQkVfVlRJVkFSX01JU0MgICAgICAweDAwMTQwCi0jZGVmaW5lIElYR0JFX1ZUUlNDSU5UKHgpICAgICAgKDB4MDAxODAgKyAoNCAqIHgpKQotI2RlZmluZSBJWEdCRV9WRlJEQkFMKHgpICAgICAgICgweDAxMDAwICsgKDB4NDAgKiB4KSkKLSNkZWZpbmUgSVhHQkVfVkZSREJBSCh4KSAgICAgICAoMHgwMTAwNCArICgweDQwICogeCkpCi0jZGVmaW5lIElYR0JFX1ZGUkRMRU4oeCkgICAgICAgKDB4MDEwMDggKyAoMHg0MCAqIHgpKQotI2RlZmluZSBJWEdCRV9WRlJESCh4KSAgICAgICAgICgweDAxMDEwICsgKDB4NDAgKiB4KSkKLSNkZWZpbmUgSVhHQkVfVkZSRFQoeCkgICAgICAgICAoMHgwMTAxOCArICgweDQwICogeCkpCi0jZGVmaW5lIElYR0JFX1ZGUlhEQ1RMKHgpICAgICAgKDB4MDEwMjggKyAoMHg0MCAqIHgpKQotI2RlZmluZSBJWEdCRV9WRlNSUkNUTCh4KSAgICAgICgweDAxMDE0ICsgKDB4NDAgKiB4KSkKLSNkZWZpbmUgSVhHQkVfVkZSU0NDVEwoeCkgICAgICAoMHgwMTAyQyArICgweDQwICogeCkpCisjZGVmaW5lIElYR0JFX1ZUUlNDSU5UKHgpICAgICAgKDB4MDAxODAgKyAoNCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUkRCQUwoeCkgICAgICAgKDB4MDEwMDAgKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUkRCQUgoeCkgICAgICAgKDB4MDEwMDQgKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUkRMRU4oeCkgICAgICAgKDB4MDEwMDggKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUkRIKHgpICAgICAgICAgKDB4MDEwMTAgKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUkRUKHgpICAgICAgICAgKDB4MDEwMTggKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUlhEQ1RMKHgpICAgICAgKDB4MDEwMjggKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGU1JSQ1RMKHgpICAgICAgKDB4MDEwMTQgKyAoMHg0MCAqICh4KSkpCisjZGVmaW5lIElYR0JFX1ZGUlNDQ1RMKHgpICAgICAgKDB4MDEwMkMgKyAoMHg0MCAqICh4KSkpCiAjZGVmaW5lIElYR0JFX1ZGUFNSVFlQRSAgICAgICAgMHgwMDMwMAotI2RlZmluZSBJWEdCRV9WRlREQkFMKHgpICAgICAgICgweDAyMDAwICsgKDB4NDAgKiB4KSkKLSNkZWZpbmUgSVhHQkVfVkZUREJBSCh4KSAgICAgICAoMHgwMjAwNCArICgweDQwICogeCkpCi0jZGVmaW5lIElYR0JFX1ZGVERMRU4oeCkgICAgICAgKDB4MDIwMDggKyAoMHg0MCAqIHgpKQotI2RlZmluZSBJWEdCRV9WRlRESCh4KSAgICAgICAgICgweDAyMDEwICsgKDB4NDAgKiB4KSkKLSNkZWZpbmUgSVhHQkVfVkZURFQoeCkgICAgICAgICAoMHgwMjAxOCArICgweDQwICogeCkpCi0jZGVmaW5lIElYR0JFX1ZGVFhEQ1RMKHgpICAgICAgKDB4MDIwMjggKyAoMHg0MCAqIHgpKQotI2RlZmluZSBJWEdCRV9WRlREV0JBTCh4KSAgICAgICgweDAyMDM4ICsgKDB4NDAgKiB4KSkKLSNkZWZpbmUgSVhHQkVfVkZURFdCQUgoeCkgICAgICAoMHgwMjAzQyArICgweDQwICogeCkpCi0jZGVmaW5lIElYR0JFX1ZGRENBX1JYQ1RSTCh4KSAgKDB4MDEwMEMgKyAoMHg0MCAqIHgpKQotI2RlZmluZSBJWEdCRV9WRkRDQV9UWENUUkwoeCkgICgweDAyMDBjICsgKDB4NDAgKiB4KSkKKyNkZWZpbmUgSVhHQkVfVkZUREJBTCh4KSAgICAgICAoMHgwMjAwMCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZUREJBSCh4KSAgICAgICAoMHgwMjAwNCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZURExFTih4KSAgICAgICAoMHgwMjAwOCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZUREgoeCkgICAgICAgICAoMHgwMjAxMCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZURFQoeCkgICAgICAgICAoMHgwMjAxOCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZUWERDVEwoeCkgICAgICAoMHgwMjAyOCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZURFdCQUwoeCkgICAgICAoMHgwMjAzOCArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZURFdCQUgoeCkgICAgICAoMHgwMjAzQyArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZEQ0FfUlhDVFJMKHgpICAoMHgwMTAwQyArICgweDQwICogKHgpKSkKKyNkZWZpbmUgSVhHQkVfVkZEQ0FfVFhDVFJMKHgpICAoMHgwMjAwYyArICgweDQwICogKHgpKSkKICNkZWZpbmUgSVhHQkVfVkZHUFJDICAgICAgICAgICAweDAxMDFDCiAjZGVmaW5lIElYR0JFX1ZGR1BUQyAgICAgICAgICAgMHgwMjAxQwogI2RlZmluZSBJWEdCRV9WRkdPUkNfTFNCICAgICAgIDB4MDEwMjAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvdmYuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L2ludGVsL2l4Z2JldmYvdmYuYwppbmRleCBhYTM2ODJlLi4yMTUzM2UzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9pbnRlbC9peGdiZXZmL3ZmLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvaW50ZWwvaXhnYmV2Zi92Zi5jCkBAIC0xMDgsNyArMTA4LDcgQEAKIAlpZiAobXNnYnVmWzBdICE9IChJWEdCRV9WRl9SRVNFVCB8IElYR0JFX1ZUX01TR1RZUEVfQUNLKSkKIAkJcmV0dXJuIElYR0JFX0VSUl9JTlZBTElEX01BQ19BRERSOwogCi0JbWVtY3B5KGh3LT5tYWMucGVybV9hZGRyLCBhZGRyLCBJWEdCRV9FVEhfTEVOR1RIX09GX0FERFJFU1MpOworCW1lbWNweShody0+bWFjLnBlcm1fYWRkciwgYWRkciwgRVRIX0FMRU4pOwogCWh3LT5tYWMubWNfZmlsdGVyX3R5cGUgPSBtc2didWZbSVhHQkVfVkZfTUNfVFlQRV9XT1JEXTsKIAogCXJldHVybiAwOwpAQCAtMjExLDcgKzIxMSw3IEBACiAgKiovCiBzdGF0aWMgczMyIGl4Z2JldmZfZ2V0X21hY19hZGRyX3ZmKHN0cnVjdCBpeGdiZV9odyAqaHcsIHU4ICptYWNfYWRkcikKIHsKLQltZW1jcHkobWFjX2FkZHIsIGh3LT5tYWMucGVybV9hZGRyLCBJWEdCRV9FVEhfTEVOR1RIX09GX0FERFJFU1MpOworCW1lbWNweShtYWNfYWRkciwgaHctPm1hYy5wZXJtX2FkZHIsIEVUSF9BTEVOKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvam1lLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9qbWUuYwppbmRleCA3YmVjZmYxLi4yN2Q2NTFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9qbWUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9qbWUuYwpAQCAtMTc0NSw2ICsxNzQ1LDExMiBAQAogfQogCiBzdGF0aWMgaW50CitqbWVfcGh5X3NwZWNyZWdfcmVhZChzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgdTMyIHNwZWNyZWcpCit7CisJdTMyIHBoeV9hZGRyOworCisJcGh5X2FkZHIgPSBKTV9QSFlfU1BFQ19SRUdfUkVBRCB8IHNwZWNyZWc7CisJam1lX21kaW9fd3JpdGUoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwgSk1fUEhZX1NQRUNfQUREUl9SRUcsCisJCQlwaHlfYWRkcik7CisJcmV0dXJuIGptZV9tZGlvX3JlYWQoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwKKwkJCUpNX1BIWV9TUEVDX0RBVEFfUkVHKTsKK30KKworc3RhdGljIHZvaWQKK2ptZV9waHlfc3BlY3JlZ193cml0ZShzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSwgdTMyIGV4dF9yZWcsIHUzMiBwaHlfZGF0YSkKK3sKKwl1MzIgcGh5X2FkZHI7CisKKwlwaHlfYWRkciA9IEpNX1BIWV9TUEVDX1JFR19XUklURSB8IGV4dF9yZWc7CisJam1lX21kaW9fd3JpdGUoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwgSk1fUEhZX1NQRUNfREFUQV9SRUcsCisJCQlwaHlfZGF0YSk7CisJam1lX21kaW9fd3JpdGUoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwgSk1fUEhZX1NQRUNfQUREUl9SRUcsCisJCQlwaHlfYWRkcik7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9waHlfY2FsaWJyYXRpb24oc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJdTMyIGN0cmwxMDAwLCBwaHlfZGF0YTsKKworCWptZV9waHlfb2ZmKGptZSk7CisJam1lX3BoeV9vbihqbWUpOworCS8qICBFbmFiZWwgUEhZIHRlc3QgbW9kZSAxICovCisJY3RybDEwMDAgPSBqbWVfbWRpb19yZWFkKGptZS0+ZGV2LCBqbWUtPm1paV9pZi5waHlfaWQsIE1JSV9DVFJMMTAwMCk7CisJY3RybDEwMDAgJj0gflBIWV9HQURfVEVTVF9NT0RFX01TSzsKKwljdHJsMTAwMCB8PSBQSFlfR0FEX1RFU1RfTU9ERV8xOworCWptZV9tZGlvX3dyaXRlKGptZS0+ZGV2LCBqbWUtPm1paV9pZi5waHlfaWQsIE1JSV9DVFJMMTAwMCwgY3RybDEwMDApOworCisJcGh5X2RhdGEgPSBqbWVfcGh5X3NwZWNyZWdfcmVhZChqbWUsIEpNX1BIWV9FWFRfQ09NTV8yX1JFRyk7CisJcGh5X2RhdGEgJj0gfkpNX1BIWV9FWFRfQ09NTV8yX0NBTElfTU9ERV8wOworCXBoeV9kYXRhIHw9IEpNX1BIWV9FWFRfQ09NTV8yX0NBTElfTEFUQ0ggfAorCQkJSk1fUEhZX0VYVF9DT01NXzJfQ0FMSV9FTkFCTEU7CisJam1lX3BoeV9zcGVjcmVnX3dyaXRlKGptZSwgSk1fUEhZX0VYVF9DT01NXzJfUkVHLCBwaHlfZGF0YSk7CisJbXNsZWVwKDIwKTsKKwlwaHlfZGF0YSA9IGptZV9waHlfc3BlY3JlZ19yZWFkKGptZSwgSk1fUEhZX0VYVF9DT01NXzJfUkVHKTsKKwlwaHlfZGF0YSAmPSB+KEpNX1BIWV9FWFRfQ09NTV8yX0NBTElfRU5BQkxFIHwKKwkJCUpNX1BIWV9FWFRfQ09NTV8yX0NBTElfTU9ERV8wIHwKKwkJCUpNX1BIWV9FWFRfQ09NTV8yX0NBTElfTEFUQ0gpOworCWptZV9waHlfc3BlY3JlZ193cml0ZShqbWUsIEpNX1BIWV9FWFRfQ09NTV8yX1JFRywgcGh5X2RhdGEpOworCisJLyogIERpc2FibGUgUEhZIHRlc3QgbW9kZSAqLworCWN0cmwxMDAwID0gam1lX21kaW9fcmVhZChqbWUtPmRldiwgam1lLT5taWlfaWYucGh5X2lkLCBNSUlfQ1RSTDEwMDApOworCWN0cmwxMDAwICY9IH5QSFlfR0FEX1RFU1RfTU9ERV9NU0s7CisJam1lX21kaW9fd3JpdGUoam1lLT5kZXYsIGptZS0+bWlpX2lmLnBoeV9pZCwgTUlJX0NUUkwxMDAwLCBjdHJsMTAwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ptZV9waHlfc2V0RUEoc3RydWN0IGptZV9hZGFwdGVyICpqbWUpCit7CisJdTMyIHBoeV9jb21tMCA9IDAsIHBoeV9jb21tMSA9IDA7CisJdTggbmljX2N0cmw7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShqbWUtPnBkZXYsIFBDSV9QUklWX1NIQVJFX05JQ0NUUkwsICZuaWNfY3RybCk7CisJaWYgKChuaWNfY3RybCAmIDB4MykgPT0gSk1FX0ZMQUdfUEhZRUFfRU5BQkxFKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoam1lLT5wZGV2LT5kZXZpY2UpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSk1JQ1JPTl9KTUMyNTA6CisJCWlmICgoKGptZS0+Y2hpcF9tYWluX3JldiA9PSA1KSAmJgorCQkJKChqbWUtPmNoaXBfc3ViX3JldiA9PSAwKSB8fCAoam1lLT5jaGlwX3N1Yl9yZXYgPT0gMSkgfHwKKwkJCShqbWUtPmNoaXBfc3ViX3JldiA9PSAzKSkpIHx8CisJCQkoam1lLT5jaGlwX21haW5fcmV2ID49IDYpKSB7CisJCQlwaHlfY29tbTAgPSAweDAwOEE7CisJCQlwaHlfY29tbTEgPSAweDQxMDk7CisJCX0KKwkJaWYgKChqbWUtPmNoaXBfbWFpbl9yZXYgPT0gMykgJiYKKwkJCSgoam1lLT5jaGlwX3N1Yl9yZXYgPT0gMSkgfHwgKGptZS0+Y2hpcF9zdWJfcmV2ID09IDIpKSkKKwkJCXBoeV9jb21tMCA9IDB4RTA4ODsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0pNSUNST05fSk1DMjYwOgorCQlpZiAoKChqbWUtPmNoaXBfbWFpbl9yZXYgPT0gNSkgJiYKKwkJCSgoam1lLT5jaGlwX3N1Yl9yZXYgPT0gMCkgfHwgKGptZS0+Y2hpcF9zdWJfcmV2ID09IDEpIHx8CisJCQkoam1lLT5jaGlwX3N1Yl9yZXYgPT0gMykpKSB8fAorCQkJKGptZS0+Y2hpcF9tYWluX3JldiA+PSA2KSkgeworCQkJcGh5X2NvbW0wID0gMHgwMDhBOworCQkJcGh5X2NvbW0xID0gMHg0MTA5OworCQl9CisJCWlmICgoam1lLT5jaGlwX21haW5fcmV2ID09IDMpICYmCisJCQkoKGptZS0+Y2hpcF9zdWJfcmV2ID09IDEpIHx8IChqbWUtPmNoaXBfc3ViX3JldiA9PSAyKSkpCisJCQlwaHlfY29tbTAgPSAweEUwODg7CisJCWlmICgoam1lLT5jaGlwX21haW5fcmV2ID09IDIpICYmIChqbWUtPmNoaXBfc3ViX3JldiA9PSAwKSkKKwkJCXBoeV9jb21tMCA9IDB4NjA4QTsKKwkJaWYgKChqbWUtPmNoaXBfbWFpbl9yZXYgPT0gMikgJiYgKGptZS0+Y2hpcF9zdWJfcmV2ID09IDIpKQorCQkJcGh5X2NvbW0wID0gMHg0MDhBOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJaWYgKHBoeV9jb21tMCkKKwkJam1lX3BoeV9zcGVjcmVnX3dyaXRlKGptZSwgSk1fUEhZX0VYVF9DT01NXzBfUkVHLCBwaHlfY29tbTApOworCWlmIChwaHlfY29tbTEpCisJCWptZV9waHlfc3BlY3JlZ193cml0ZShqbWUsIEpNX1BIWV9FWFRfQ09NTV8xX1JFRywgcGh5X2NvbW0xKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CiBqbWVfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKQEAgLTE3NjksNyArMTg3NSw4IEBACiAJCWptZV9zZXRfc2V0dGluZ3MobmV0ZGV2LCAmam1lLT5vbGRfZWNtZCk7CiAJZWxzZQogCQlqbWVfcmVzZXRfcGh5X3Byb2Nlc3NvcihqbWUpOwotCisJam1lX3BoeV9jYWxpYnJhdGlvbihqbWUpOworCWptZV9waHlfc2V0RUEoam1lKTsKIAlqbWVfcmVzZXRfbGluayhqbWUpOwogCiAJcmV0dXJuIDA7CkBAIC0xODgzLDcgKzE5OTAsNyBAQAogCQlzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJdTMyIHBhZ2Vfb2Zmc2V0LAogCQl1MzIgbGVuLAotCQl1OCBoaWRtYSkKKwkJYm9vbCBoaWRtYSkKIHsKIAlkbWFfYWRkcl90IGRtYWFkZHI7CiAKQEAgLTE5MTcsNyArMjAyNCw3IEBACiAJc3RydWN0IGptZV9yaW5nICp0eHJpbmcgPSAmKGptZS0+dHhyaW5nWzBdKTsKIAlzdHJ1Y3QgdHhkZXNjICp0eGRlc2MgPSB0eHJpbmctPmRlc2MsICpjdHhkZXNjOwogCXN0cnVjdCBqbWVfYnVmZmVyX2luZm8gKnR4YmkgPSB0eHJpbmctPmJ1ZmluZiwgKmN0eGJpOwotCXU4IGhpZG1hID0gam1lLT5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9ISUdIRE1BOworCWJvb2wgaGlkbWEgPSBqbWUtPmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hJR0hETUE7CiAJaW50IGksIG5yX2ZyYWdzID0gc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFnczsKIAlpbnQgbWFzayA9IGptZS0+dHhfcmluZ19tYXNrOwogCWNvbnN0IHN0cnVjdCBza2JfZnJhZ19zdHJ1Y3QgKmZyYWc7CkBAIC0yMjkyLDkgKzIzOTksOSBAQAogewogCXN0cnVjdCBqbWVfYWRhcHRlciAqam1lID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoam1lLT5wZGV2KSk7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShqbWUtPnBkZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIGludApAQCAtMjYyMCw4ICsyNzI3LDggQEAKIAlqbWUtPm1zZ19lbmFibGUgPSB2YWx1ZTsKIH0KIAotc3RhdGljIHUzMgotam1lX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QKK2ptZV9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJaWYgKG5ldGRldi0+bXR1ID4gMTkwMCkKIAkJZmVhdHVyZXMgJj0gfihORVRJRl9GX0FMTF9UU08gfCBORVRJRl9GX0FMTF9DU1VNKTsKQEAgLTI2MjksNyArMjczNiw3IEBACiB9CiAKIHN0YXRpYyBpbnQKLWptZV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQoram1lX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgam1lX2FkYXB0ZXIgKmptZSA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKQEAgLTMxODQsNyArMzI5MSw4IEBACiAJCWptZV9zZXRfc2V0dGluZ3MobmV0ZGV2LCAmam1lLT5vbGRfZWNtZCk7CiAJZWxzZQogCQlqbWVfcmVzZXRfcGh5X3Byb2Nlc3NvcihqbWUpOwotCisJam1lX3BoeV9jYWxpYnJhdGlvbihqbWUpOworCWptZV9waHlfc2V0RUEoam1lKTsKIAlqbWVfc3RhcnRfaXJxKGptZSk7CiAJbmV0aWZfZGV2aWNlX2F0dGFjaChuZXRkZXYpOwogCkBAIC0zMjM5LDQgKzMzNDcsMyBAQAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwogTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGptZV9wY2lfdGJsKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvam1lLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9qbWUuaAppbmRleCAwMmVhMjdjLi40MzA0MDcyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9qbWUuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9qbWUuaApAQCAtNzYwLDYgKzc2MCwyNSBAQAogCQkJCSAgUlhNQ1NfQ0hFQ0tTVU0sCiB9OwogCisvKglFeHRlcm4gUEhZIGNvbW1vbiByZWdpc3RlciAyCSovCisKKyNkZWZpbmUgUEhZX0dBRF9URVNUX01PREVfMQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgUEhZX0dBRF9URVNUX01PREVfTVNLCQkJMHgwMDAwRTAwMAorI2RlZmluZSBKTV9QSFlfU1BFQ19SRUdfUkVBRAkJCTB4MDAwMDQwMDAKKyNkZWZpbmUgSk1fUEhZX1NQRUNfUkVHX1dSSVRFCQkJMHgwMDAwODAwMAorI2RlZmluZSBQSFlfQ0FMSUJSQVRJT05fREVMQVkJCQkyMAorI2RlZmluZSBKTV9QSFlfU1BFQ19BRERSX1JFRwkJCTB4MUUKKyNkZWZpbmUgSk1fUEhZX1NQRUNfREFUQV9SRUcJCQkweDFGCisKKyNkZWZpbmUgSk1fUEhZX0VYVF9DT01NXzBfUkVHCQkJMHgzMAorI2RlZmluZSBKTV9QSFlfRVhUX0NPTU1fMV9SRUcJCQkweDMxCisjZGVmaW5lIEpNX1BIWV9FWFRfQ09NTV8yX1JFRwkJCTB4MzIKKyNkZWZpbmUgSk1fUEhZX0VYVF9DT01NXzJfQ0FMSV9FTkFCTEUJCTB4MDEKKyNkZWZpbmUgSk1fUEhZX0VYVF9DT01NXzJfQ0FMSV9NT0RFXzAJCTB4MDIKKyNkZWZpbmUgSk1fUEhZX0VYVF9DT01NXzJfQ0FMSV9MQVRDSAkJMHgxMAorI2RlZmluZSBQQ0lfUFJJVl9TSEFSRV9OSUNDVFJMCQkJMHhGNQorI2RlZmluZSBKTUVfRkxBR19QSFlFQV9FTkFCTEUJCQkweDIKKwogLyoKICAqIFdha2V1cCBGcmFtZSBzZXR1cCBpbnRlcmZhY2UgcmVnaXN0ZXJzCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L2tvcmluYS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQva29yaW5hLmMKaW5kZXggZDg0MzBmNC4uNmFkMDk0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQva29yaW5hLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQva29yaW5hLmMKQEAgLTEyMzAsMTggKzEyMzAsNyBAQAogCS5yZW1vdmUgPSBrb3JpbmFfcmVtb3ZlLAogfTsKIAotc3RhdGljIGludCBfX2luaXQga29yaW5hX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigma29yaW5hX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIGtvcmluYV9jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigma29yaW5hX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGtvcmluYV9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChrb3JpbmFfY2xlYW51cF9tb2R1bGUpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihrb3JpbmFfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiUGhpbGlwIFJpc2NoZWwgPHJpc2NoZWxwQGlkdC5jb20+Iik7CiBNT0RVTEVfQVVUSE9SKCJGZWxpeCBGaWV0a2F1IDxuYmRAb3BlbndydC5vcmc+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212NjQzeHhfZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL212NjQzeHhfZXRoLmMKaW5kZXggMTk0YTAzMS4uZTg3ODQ3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9tdjY0M3h4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvbXY2NDN4eF9ldGguYwpAQCAtMTUwMiwxMCArMTUwMiwxMiBAQAogc3RhdGljIHZvaWQgbXY2NDN4eF9ldGhfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKIHsKLQlzdHJuY3B5KGRydmluZm8tPmRyaXZlciwgIG12NjQzeHhfZXRoX2RyaXZlcl9uYW1lLCAzMik7Ci0Jc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBtdjY0M3h4X2V0aF9kcml2ZXJfdmVyc2lvbiwgMzIpOwotCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIk4vQSIsIDMyKTsKLQlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCAicGxhdGZvcm0iLCAzMik7CisJc3RybGNweShkcnZpbmZvLT5kcml2ZXIsIG12NjQzeHhfZXRoX2RyaXZlcl9uYW1lLAorCQlzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShkcnZpbmZvLT52ZXJzaW9uLCBtdjY0M3h4X2V0aF9kcml2ZXJfdmVyc2lvbiwKKwkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJOL0EiLCBzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbikpOworCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sICJwbGF0Zm9ybSIsIHNpemVvZihkcnZpbmZvLT5idXNfaW5mbykpOwogCWRydmluZm8tPm5fc3RhdHMgPSBBUlJBWV9TSVpFKG12NjQzeHhfZXRoX3N0YXRzKTsKIH0KIApAQCAtMTU3OCwxMCArMTU4MCwxMCBAQAogCiAKIHN0YXRpYyBpbnQKLW12NjQzeHhfZXRoX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCittdjY0M3h4X2V0aF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IG12NjQzeHhfZXRoX3ByaXZhdGUgKm1wID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQl1MzIgcnhfY3N1bSA9IGZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU07CisJYm9vbCByeF9jc3VtID0gZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTTsKIAogCXdybHAobXAsIFBPUlRfQ09ORklHLCByeF9jc3VtID8gMHgwMjAwMDAwMCA6IDB4MDAwMDAwMDApOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3B4YTE2OF9ldGguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvcHhhMTY4X2V0aC5jCmluZGV4IGQxN2QwNjIuLjVlYzQwOWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvcHhhMTY4X2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvcHhhMTY4X2V0aC5jCkBAIC0xNjQ1LDE4ICsxNjQ1LDcgQEAKIAkJICAgfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHB4YTE2OF9pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnB4YTE2OF9ldGhfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHB4YTE2OF9jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZweGExNjhfZXRoX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHB4YTE2OF9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChweGExNjhfY2xlYW51cF9tb2R1bGUpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihweGExNjhfZXRoX2RyaXZlcik7CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiRXRoZXJuZXQgZHJpdmVyIGZvciBNYXJ2ZWxsIFBYQTE2OCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWFydmVsbC9za2dlLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NrZ2UuYwppbmRleCBjN2I2MDgzLi4xOGE4N2E1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NrZ2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NrZ2UuYwpAQCAtMzk0LDEwICszOTQsMTAgQEAKIHsKIAlzdHJ1Y3Qgc2tnZV9wb3J0ICpza2dlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiTi9BIik7Ci0Jc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShza2dlLT5ody0+cGRldikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoc2tnZS0+aHctPnBkZXYpLAorCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBza2dlX3N0YXQgewpAQCAtMjYwNiw2ICsyNjA2LDkgQEAKIAlzcGluX3VubG9ja19pcnEoJmh3LT5od19sb2NrKTsKIAogCW5hcGlfZW5hYmxlKCZza2dlLT5uYXBpKTsKKworCXNrZ2Vfc2V0X211bHRpY2FzdChkZXYpOworCiAJcmV0dXJuIDA7CiAKICBmcmVlX3R4X3Jpbmc6CkBAIC00MDM5LDcgKzQwNDIsNyBAQAogCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKIH0KIAotI2lmZGVmIENPTkZJR19QTQorI2lmZGVmIENPTkZJR19QTV9TTEVFUAogc3RhdGljIGludCBza2dlX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQogewogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXYpOwpAQCAtNDEwMSw3ICs0MTA0LDcgQEAKICNlbHNlCiAKICNkZWZpbmUgU0tHRV9QTV9PUFMgTlVMTAotI2VuZGlmCisjZW5kaWYgLyogQ09ORklHX1BNX1NMRUVQICovCiAKIHN0YXRpYyB2b2lkIHNrZ2Vfc2h1dGRvd24oc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tYXJ2ZWxsL3NreTIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCmluZGV4IDc4MDNlZmEuLjc2MGMyYjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21hcnZlbGwvc2t5Mi5jCkBAIC0xMTEwLDYgKzExMTAsNyBAQAogCXNreTItPnR4X3Byb2QgPSBza3kyLT50eF9jb25zID0gMDsKIAlza3kyLT50eF90Y3BzdW0gPSAwOwogCXNreTItPnR4X2xhc3RfbXNzID0gMDsKKwluZXRkZXZfcmVzZXRfcXVldWUoc2t5Mi0+bmV0ZGV2KTsKIAogCWxlID0gZ2V0X3R4X2xlKHNreTIsICZza3kyLT50eF9wcm9kKTsKIAlsZS0+YWRkciA9IDA7CkBAIC0xMjg0LDcgKzEyODUsNyBAQAogfTsKIAogLyogRW5hYmxlL2Rpc2FibGUgcmVjZWl2ZSBoYXNoIGNhbGN1bGF0aW9uIChSU1MpICovCi1zdGF0aWMgdm9pZCByeF9zZXRfcnNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyB2b2lkIHJ4X3NldF9yc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNreTJfaHcgKmh3ID0gc2t5Mi0+aHc7CkBAIC0xNDAyLDcgKzE0MDMsNyBAQAogCiAjZGVmaW5lIFNLWTJfVkxBTl9PRkZMT0FEUyAoTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9TRyB8IE5FVElGX0ZfVFNPKQogCi1zdGF0aWMgdm9pZCBza3kyX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgdm9pZCBza3kyX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgc2t5Ml9wb3J0ICpza3kyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgc2t5Ml9odyAqaHcgPSBza3kyLT5odzsKQEAgLTE5NzEsNiArMTk3Miw3IEBACiAJaWYgKHR4X2F2YWlsKHNreTIpIDw9IE1BWF9TS0JfVFhfTEUpCiAJCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAorCW5ldGRldl9zZW50X3F1ZXVlKGRldiwgc2tiLT5sZW4pOwogCXNreTJfcHV0X2lkeChodywgdHhxYWRkcltza3kyLT5wb3J0XSwgc2t5Mi0+dHhfcHJvZCk7CiAKIAlyZXR1cm4gTkVUREVWX1RYX09LOwpAQCAtMjAwMiw3ICsyMDA0LDggQEAKIHN0YXRpYyB2b2lkIHNreTJfdHhfY29tcGxldGUoc3RydWN0IHNreTJfcG9ydCAqc2t5MiwgdTE2IGRvbmUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHNreTItPm5ldGRldjsKLQl1bnNpZ25lZCBpZHg7CisJdTE2IGlkeDsKKwl1bnNpZ25lZCBpbnQgYnl0ZXNfY29tcGwgPSAwLCBwa3RzX2NvbXBsID0gMDsKIAogCUJVR19PTihkb25lID49IHNreTItPnR4X3Jpbmdfc2l6ZSk7CiAKQEAgLTIwMTcsMTAgKzIwMjAsOCBAQAogCQkJbmV0aWZfcHJpbnRrKHNreTIsIHR4X2RvbmUsIEtFUk5fREVCVUcsIGRldiwKIAkJCQkgICAgICJ0eCBkb25lICV1XG4iLCBpZHgpOwogCi0JCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZza3kyLT50eF9zdGF0cy5zeW5jcCk7Ci0JCQkrK3NreTItPnR4X3N0YXRzLnBhY2tldHM7Ci0JCQlza3kyLT50eF9zdGF0cy5ieXRlcyArPSBza2ItPmxlbjsKLQkJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZza3kyLT50eF9zdGF0cy5zeW5jcCk7CisJCQlwa3RzX2NvbXBsKys7CisJCQlieXRlc19jb21wbCArPSBza2ItPmxlbjsKIAogCQkJcmUtPnNrYiA9IE5VTEw7CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtMjAzMSw2ICsyMDMyLDEzIEBACiAKIAlza3kyLT50eF9jb25zID0gaWR4OwogCXNtcF9tYigpOworCisJbmV0ZGV2X2NvbXBsZXRlZF9xdWV1ZShkZXYsIHBrdHNfY29tcGwsIGJ5dGVzX2NvbXBsKTsKKworCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnNreTItPnR4X3N0YXRzLnN5bmNwKTsKKwlza3kyLT50eF9zdGF0cy5wYWNrZXRzICs9IHBrdHNfY29tcGw7CisJc2t5Mi0+dHhfc3RhdHMuYnl0ZXMgKz0gYnl0ZXNfY29tcGw7CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnNreTItPnR4X3N0YXRzLnN5bmNwKTsKIH0KIAogc3RhdGljIHZvaWQgc2t5Ml90eF9yZXNldChzdHJ1Y3Qgc2t5Ml9odyAqaHcsIHVuc2lnbmVkIHBvcnQpCkBAIC0zNjQzLDEwICszNjUxLDEwIEBACiB7CiAJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKLQlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIk4vQSIpOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoc2t5Mi0+aHctPnBkZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHNreTItPmh3LT5wZGV2KSwKKwkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2t5Ml9zdGF0IHsKQEAgLTQzMTEsNyArNDMxOSw4IEBACiAJcmV0dXJuIHNreTJfdnBkX3dyaXRlKHNreTItPmh3LCBjYXAsIGRhdGEsIGVlcHJvbS0+b2Zmc2V0LCBlZXByb20tPmxlbik7CiB9CiAKLXN0YXRpYyB1MzIgc2t5Ml9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IHNreTJfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJY29uc3Qgc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7CiAJY29uc3Qgc3RydWN0IHNreTJfaHcgKmh3ID0gc2t5Mi0+aHc7CkBAIC00MzM1LDEzICs0MzQ0LDEzIEBACiAJcmV0dXJuIGZlYXR1cmVzOwogfQogCi1zdGF0aWMgaW50IHNreTJfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgc2t5Ml9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHNreTJfcG9ydCAqc2t5MiA9IG5ldGRldl9wcml2KGRldik7Ci0JdTMyIGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlZCA9IGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKIAogCWlmIChjaGFuZ2VkICYgTkVUSUZfRl9SWENTVU0pIHsKLQkJdTMyIG9uID0gZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTTsKKwkJYm9vbCBvbiA9IGZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU07CiAJCXNreTJfd3JpdGUzMihza3kyLT5odywgUV9BRERSKHJ4cWFkZHJbc2t5Mi0+cG9ydF0sIFFfQ1NSKSwKIAkJCSAgICAgb24gPyBCTVVfRU5BX1JYX0NIS1NVTSA6IEJNVV9ESVNfUlhfQ0hLU1VNKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9NYWtlZmlsZQppbmRleCBkMWFhNDVhLi40YTQwYWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiBvYmotJChDT05GSUdfTUxYNF9DT1JFKQkJKz0gbWx4NF9jb3JlLm8KIAogbWx4NF9jb3JlLXkgOj0JYWxsb2MubyBjYXRhcy5vIGNtZC5vIGNxLm8gZXEubyBmdy5vIGljbS5vIGludGYubyBtYWluLm8gbWNnLm8gXAotCQltci5vIHBkLm8gcG9ydC5vIHByb2ZpbGUubyBxcC5vIHJlc2V0Lm8gc2Vuc2UubyBzcnEubworCQltci5vIHBkLm8gcG9ydC5vIHByb2ZpbGUubyBxcC5vIHJlc2V0Lm8gc2Vuc2UubyBzcnEubyByZXNvdXJjZV90cmFja2VyLm8KIAogb2JqLSQoQ09ORklHX01MWDRfRU4pICAgICAgICAgICAgICAgKz0gbWx4NF9lbi5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY2F0YXMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY2F0YXMuYwppbmRleCA0NWFlYTljLi45MTVlOTQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NhdGFzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jYXRhcy5jCkBAIC00OCw3ICs0OCw4IEBACiBzdGF0aWMgaW50IGludGVybmFsX2Vycl9yZXNldCA9IDE7CiBtb2R1bGVfcGFyYW0oaW50ZXJuYWxfZXJyX3Jlc2V0LCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbnRlcm5hbF9lcnJfcmVzZXQsCi0JCSAiUmVzZXQgZGV2aWNlIG9uIGludGVybmFsIGVycm9ycyBpZiBub24temVybyAoZGVmYXVsdCAxKSIpOworCQkgIlJlc2V0IGRldmljZSBvbiBpbnRlcm5hbCBlcnJvcnMgaWYgbm9uLXplcm8iCisJCSAiIChkZWZhdWx0IDEsIGluIFNSSU9WIG1vZGUgZGVmYXVsdCBpcyAwKSIpOwogCiBzdGF0aWMgdm9pZCBkdW1wX2Vycl9idWYoc3RydWN0IG1seDRfZGV2ICpkZXYpCiB7CkBAIC0xMTYsNiArMTE3LDEwIEBACiAJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwogCXBoeXNfYWRkcl90IGFkZHI7CiAKKwkvKklmIHdlIGFyZSBpbiBTUklPViB0aGUgZGVmYXVsdCBvZiB0aGUgbW9kdWxlIHBhcmFtIG11c3QgYmUgMCovCisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkKKwkJaW50ZXJuYWxfZXJyX3Jlc2V0ID0gMDsKKwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT5jYXRhc19lcnIubGlzdCk7CiAJaW5pdF90aW1lcigmcHJpdi0+Y2F0YXNfZXJyLnRpbWVyKTsKIAlwcml2LT5jYXRhc19lcnIubWFwID0gTlVMTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NtZC5jCmluZGV4IDc4ZjVhMWEuLjk3OGY1OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY21kLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jbWQuYwpAQCAtMzksMTIgKzM5LDE4IEBACiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L21seDQvY21kLmg+CisjaW5jbHVkZSA8bGludXgvc2VtYXBob3JlLmg+CiAKICNpbmNsdWRlIDxhc20vaW8uaD4KIAogI2luY2x1ZGUgIm1seDQuaCIKKyNpbmNsdWRlICJmdy5oIgogCiAjZGVmaW5lIENNRF9QT0xMX1RPS0VOIDB4ZmZmZgorI2RlZmluZSBJTkJPWF9NQVNLCTB4ZmZmZmZmZmZmZmZmZmYwMFVMTAorCisjZGVmaW5lIENNRF9DSEFOX1ZFUiAxCisjZGVmaW5lIENNRF9DSEFOX0lGX1JFViAxCiAKIGVudW0gewogCS8qIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseTogKi8KQEAgLTExMCw4ICsxMTYsMTIgQEAKIAlpbnQJCQluZXh0OwogCXU2NAkJCW91dF9wYXJhbTsKIAl1MTYJCQl0b2tlbjsKKwl1OAkJCWZ3X3N0YXR1czsKIH07CiAKK3N0YXRpYyBpbnQgbWx4NF9tYXN0ZXJfcHJvY2Vzc192aGNyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkJICAgIHN0cnVjdCBtbHg0X3ZoY3JfY21kICppbl92aGNyKTsKKwogc3RhdGljIGludCBtbHg0X3N0YXR1c190b19lcnJubyh1OCBzdGF0dXMpCiB7CiAJc3RhdGljIGNvbnN0IGludCB0cmFuc190YWJsZVtdID0gewpAQCAtMTQyLDYgKzE1MiwxMzkgQEAKIAlyZXR1cm4gdHJhbnNfdGFibGVbc3RhdHVzXTsKIH0KIAorc3RhdGljIHU4IG1seDRfZXJybm9fdG9fc3RhdHVzKGludCBlcnJubykKK3sKKwlzd2l0Y2ggKGVycm5vKSB7CisJY2FzZSAtRVBFUk06CisJCXJldHVybiBDTURfU1RBVF9CQURfT1A7CisJY2FzZSAtRUlOVkFMOgorCQlyZXR1cm4gQ01EX1NUQVRfQkFEX1BBUkFNOworCWNhc2UgLUVOWElPOgorCQlyZXR1cm4gQ01EX1NUQVRfQkFEX1NZU19TVEFURTsKKwljYXNlIC1FQlVTWToKKwkJcmV0dXJuIENNRF9TVEFUX1JFU09VUkNFX0JVU1k7CisJY2FzZSAtRU5PTUVNOgorCQlyZXR1cm4gQ01EX1NUQVRfRVhDRUVEX0xJTTsKKwljYXNlIC1FTkZJTEU6CisJCXJldHVybiBDTURfU1RBVF9JQ01fRVJST1I7CisJZGVmYXVsdDoKKwkJcmV0dXJuIENNRF9TVEFUX0lOVEVSTkFMX0VSUjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29tbV9wZW5kaW5nKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwl1MzIgc3RhdHVzID0gcmVhZGwoJnByaXYtPm1mdW5jLmNvbW0tPnNsYXZlX3JlYWQpOworCisJcmV0dXJuIChzd2FiMzIoc3RhdHVzKSA+PiAzMSkgIT0gcHJpdi0+Y21kLmNvbW1fdG9nZ2xlOworfQorCitzdGF0aWMgdm9pZCBtbHg0X2NvbW1fY21kX3Bvc3Qoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IGNtZCwgdTE2IHBhcmFtKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwl1MzIgdmFsOworCisJcHJpdi0+Y21kLmNvbW1fdG9nZ2xlIF49IDE7CisJdmFsID0gcGFyYW0gfCAoY21kIDw8IDE2KSB8IChwcml2LT5jbWQuY29tbV90b2dnbGUgPDwgMzEpOworCV9fcmF3X3dyaXRlbCgoX19mb3JjZSB1MzIpIGNwdV90b19iZTMyKHZhbCksCisJCSAgICAgJnByaXYtPm1mdW5jLmNvbW0tPnNsYXZlX3dyaXRlKTsKKwltbWlvd2IoKTsKK30KKworc3RhdGljIGludCBtbHg0X2NvbW1fY21kX3BvbGwoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IGNtZCwgdTE2IHBhcmFtLAorCQkgICAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGVuZDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgcmV0X2Zyb21fcGVuZGluZyA9IDA7CisKKwkvKiBGaXJzdCwgdmVyaWZ5IHRoYXQgdGhlIG1hc3RlciByZXBvcnRzIGNvcnJlY3Qgc3RhdHVzICovCisJaWYgKGNvbW1fcGVuZGluZyhkZXYpKSB7CisJCW1seDRfd2FybihkZXYsICJDb21tdW5pY2F0aW9uIGNoYW5uZWwgaXMgbm90IGlkbGUuIgorCQkJICAibXkgdG9nZ2xlIGlzICVkIChjbWQ6MHgleClcbiIsCisJCQkgIHByaXYtPmNtZC5jb21tX3RvZ2dsZSwgY21kKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJLyogV3JpdGUgY29tbWFuZCAqLworCWRvd24oJnByaXYtPmNtZC5wb2xsX3NlbSk7CisJbWx4NF9jb21tX2NtZF9wb3N0KGRldiwgY21kLCBwYXJhbSk7CisKKwllbmQgPSBtc2Vjc190b19qaWZmaWVzKHRpbWVvdXQpICsgamlmZmllczsKKwl3aGlsZSAoY29tbV9wZW5kaW5nKGRldikgJiYgdGltZV9iZWZvcmUoamlmZmllcywgZW5kKSkKKwkJY29uZF9yZXNjaGVkKCk7CisJcmV0X2Zyb21fcGVuZGluZyA9IGNvbW1fcGVuZGluZyhkZXYpOworCWlmIChyZXRfZnJvbV9wZW5kaW5nKSB7CisJCS8qIGNoZWNrIGlmIHRoZSBzbGF2ZSBpcyB0cnlpbmcgdG8gYm9vdCBpbiB0aGUgbWlkZGxlIG9mCisJCSAqIEZMUiBwcm9jZXNzLiBUaGUgb25seSBub24temVybyByZXN1bHQgaW4gdGhlIFJFU0VUIGNvbW1hbmQKKwkJICogaXMgTUxYNF9ERUxBWV9SRVNFVF9TTEFWRSovCisJCWlmICgoTUxYNF9DT01NX0NNRF9SRVNFVCA9PSBjbWQpKSB7CisJCQltbHg0X3dhcm4oZGV2LCAiR290IHNsYXZlIEZMUmVkIGZyb20gQ29tbXVuaWNhdGlvbiIKKwkJCQkgICIgY2hhbm5lbCAocmV0OjB4JXgpXG4iLCByZXRfZnJvbV9wZW5kaW5nKTsKKwkJCWVyciA9IE1MWDRfREVMQVlfUkVTRVRfU0xBVkU7CisJCX0gZWxzZSB7CisJCQltbHg0X3dhcm4oZGV2LCAiQ29tbXVuaWNhdGlvbiBjaGFubmVsIHRpbWVkIG91dFxuIik7CisJCQllcnIgPSAtRVRJTUVET1VUOworCQl9CisJfQorCisJdXAoJnByaXYtPmNtZC5wb2xsX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtbHg0X2NvbW1fY21kX3dhaXQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IG9wLAorCQkJICAgICAgdTE2IHBhcmFtLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJc3RydWN0IG1seDRfY21kICpjbWQgPSAmbWx4NF9wcml2KGRldiktPmNtZDsKKwlzdHJ1Y3QgbWx4NF9jbWRfY29udGV4dCAqY29udGV4dDsKKwlpbnQgZXJyID0gMDsKKworCWRvd24oJmNtZC0+ZXZlbnRfc2VtKTsKKworCXNwaW5fbG9jaygmY21kLT5jb250ZXh0X2xvY2spOworCUJVR19PTihjbWQtPmZyZWVfaGVhZCA8IDApOworCWNvbnRleHQgPSAmY21kLT5jb250ZXh0W2NtZC0+ZnJlZV9oZWFkXTsKKwljb250ZXh0LT50b2tlbiArPSBjbWQtPnRva2VuX21hc2sgKyAxOworCWNtZC0+ZnJlZV9oZWFkID0gY29udGV4dC0+bmV4dDsKKwlzcGluX3VubG9jaygmY21kLT5jb250ZXh0X2xvY2spOworCisJaW5pdF9jb21wbGV0aW9uKCZjb250ZXh0LT5kb25lKTsKKworCW1seDRfY29tbV9jbWRfcG9zdChkZXYsIG9wLCBwYXJhbSk7CisKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udGV4dC0+ZG9uZSwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gY29udGV4dC0+cmVzdWx0OworCWlmIChlcnIgJiYgY29udGV4dC0+Zndfc3RhdHVzICE9IENNRF9TVEFUX01VTFRJX0ZVTkNfUkVRKSB7CisJCW1seDRfZXJyKGRldiwgImNvbW1hbmQgMHgleCBmYWlsZWQ6IGZ3IHN0YXR1cyA9IDB4JXhcbiIsCisJCQkgb3AsIGNvbnRleHQtPmZ3X3N0YXR1cyk7CisJCWdvdG8gb3V0OworCX0KKworb3V0OgorCXNwaW5fbG9jaygmY21kLT5jb250ZXh0X2xvY2spOworCWNvbnRleHQtPm5leHQgPSBjbWQtPmZyZWVfaGVhZDsKKwljbWQtPmZyZWVfaGVhZCA9IGNvbnRleHQgLSBjbWQtPmNvbnRleHQ7CisJc3Bpbl91bmxvY2soJmNtZC0+Y29udGV4dF9sb2NrKTsKKworCXVwKCZjbWQtPmV2ZW50X3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IG1seDRfY29tbV9jbWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IGNtZCwgdTE2IHBhcmFtLAorCQkgIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlpZiAobWx4NF9wcml2KGRldiktPmNtZC51c2VfZXZlbnRzKQorCQlyZXR1cm4gbWx4NF9jb21tX2NtZF93YWl0KGRldiwgY21kLCBwYXJhbSwgdGltZW91dCk7CisJcmV0dXJuIG1seDRfY29tbV9jbWRfcG9sbChkZXYsIGNtZCwgcGFyYW0sIHRpbWVvdXQpOworfQorCiBzdGF0aWMgaW50IGNtZF9wZW5kaW5nKHN0cnVjdCBtbHg0X2RldiAqZGV2KQogewogCXUzMiBzdGF0dXMgPSByZWFkbChtbHg0X3ByaXYoZGV2KS0+Y21kLmhjciArIEhDUl9TVEFUVVNfT0ZGU0VUKTsKQEAgLTE2Nyw4ICszMTAsMTAgQEAKIAkJZW5kICs9IG1zZWNzX3RvX2ppZmZpZXMoR09fQklUX1RJTUVPVVRfTVNFQ1MpOwogCiAJd2hpbGUgKGNtZF9wZW5kaW5nKGRldikpIHsKLQkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kKSkKKwkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgZW5kKSkgeworCQkJbWx4NF9lcnIoZGV2LCAiJXM6Y21kX3BlbmRpbmcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CiAJCQlnb3RvIG91dDsKKwkJfQogCQljb25kX3Jlc2NoZWQoKTsKIAl9CiAKQEAgLTE5Miw3ICszMzcsNyBAQAogCQkJCQkgICAgICAgKGNtZC0+dG9nZ2xlIDw8IEhDUl9UX0JJVCkJfAogCQkJCQkgICAgICAgKGV2ZW50ID8gKDEgPDwgSENSX0VfQklUKSA6IDApCXwKIAkJCQkJICAgICAgIChvcF9tb2RpZmllciA8PCBIQ1JfT1BNT0RfU0hJRlQpIHwKLQkJCQkJICAgICAgIG9wKSwJCQkgIGhjciArIDYpOworCQkJCQkgICAgICAgb3ApLCBoY3IgKyA2KTsKIAogCS8qCiAJICogTWFrZSBzdXJlIHRoYXQgb3VyIEhDUiB3cml0ZXMgZG9uJ3QgZ2V0IG1peGVkIGluIHdpdGgKQEAgLTIwOSw2ICszNTQsNjIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IG1seDRfc2xhdmVfY21kKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1NjQgaW5fcGFyYW0sIHU2NCAqb3V0X3BhcmFtLAorCQkJICBpbnQgb3V0X2lzX2ltbSwgdTMyIGluX21vZGlmaWVyLCB1OCBvcF9tb2RpZmllciwKKwkJCSAgdTE2IG9wLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3ZoY3JfY21kICp2aGNyID0gcHJpdi0+bWZ1bmMudmhjcjsKKwlpbnQgcmV0OworCisJZG93bigmcHJpdi0+Y21kLnNsYXZlX3NlbSk7CisJdmhjci0+aW5fcGFyYW0gPSBjcHVfdG9fYmU2NChpbl9wYXJhbSk7CisJdmhjci0+b3V0X3BhcmFtID0gb3V0X3BhcmFtID8gY3B1X3RvX2JlNjQoKm91dF9wYXJhbSkgOiAwOworCXZoY3ItPmluX21vZGlmaWVyID0gY3B1X3RvX2JlMzIoaW5fbW9kaWZpZXIpOworCXZoY3ItPm9wY29kZSA9IGNwdV90b19iZTE2KCgoKHUxNikgb3BfbW9kaWZpZXIpIDw8IDEyKSB8IChvcCAmIDB4ZmZmKSk7CisJdmhjci0+dG9rZW4gPSBjcHVfdG9fYmUxNihDTURfUE9MTF9UT0tFTik7CisJdmhjci0+c3RhdHVzID0gMDsKKwl2aGNyLT5mbGFncyA9ICEhKHByaXYtPmNtZC51c2VfZXZlbnRzKSA8PCA2OworCWlmIChtbHg0X2lzX21hc3RlcihkZXYpKSB7CisJCXJldCA9IG1seDRfbWFzdGVyX3Byb2Nlc3NfdmhjcihkZXYsIGRldi0+Y2Fwcy5mdW5jdGlvbiwgdmhjcik7CisJCWlmICghcmV0KSB7CisJCQlpZiAob3V0X2lzX2ltbSkgeworCQkJCWlmIChvdXRfcGFyYW0pCisJCQkJCSpvdXRfcGFyYW0gPQorCQkJCQkJYmU2NF90b19jcHUodmhjci0+b3V0X3BhcmFtKTsKKwkJCQllbHNlIHsKKwkJCQkJbWx4NF9lcnIoZGV2LCAicmVzcG9uc2UgZXhwZWN0ZWQgd2hpbGUiCisJCQkJCQkgIm91dHB1dCBtYWlsYm94IGlzIE5VTEwgZm9yICIKKwkJCQkJCSAiY29tbWFuZCAweCV4XG4iLCBvcCk7CisJCQkJCXZoY3ItPnN0YXR1cyA9IENNRF9TVEFUX0JBRF9QQVJBTTsKKwkJCQl9CisJCQl9CisJCQlyZXQgPSBtbHg0X3N0YXR1c190b19lcnJubyh2aGNyLT5zdGF0dXMpOworCQl9CisJfSBlbHNlIHsKKwkJcmV0ID0gbWx4NF9jb21tX2NtZChkZXYsIE1MWDRfQ09NTV9DTURfVkhDUl9QT1NULCAwLAorCQkJCSAgICBNTFg0X0NPTU1fVElNRSArIHRpbWVvdXQpOworCQlpZiAoIXJldCkgeworCQkJaWYgKG91dF9pc19pbW0pIHsKKwkJCQlpZiAob3V0X3BhcmFtKQorCQkJCQkqb3V0X3BhcmFtID0KKwkJCQkJCWJlNjRfdG9fY3B1KHZoY3ItPm91dF9wYXJhbSk7CisJCQkJZWxzZSB7CisJCQkJCW1seDRfZXJyKGRldiwgInJlc3BvbnNlIGV4cGVjdGVkIHdoaWxlIgorCQkJCQkJICJvdXRwdXQgbWFpbGJveCBpcyBOVUxMIGZvciAiCisJCQkJCQkgImNvbW1hbmQgMHgleFxuIiwgb3ApOworCQkJCQl2aGNyLT5zdGF0dXMgPSBDTURfU1RBVF9CQURfUEFSQU07CisJCQkJfQorCQkJfQorCQkJcmV0ID0gbWx4NF9zdGF0dXNfdG9fZXJybm8odmhjci0+c3RhdHVzKTsKKwkJfSBlbHNlCisJCQltbHg0X2VycihkZXYsICJmYWlsZWQgZXhlY3V0aW9uIG9mIFZIQ1JfUE9TVCBjb21tYW5kIgorCQkJCSAib3Bjb2RlIDB4JXhcbiIsIG9wKTsKKwl9CisJdXAoJnByaXYtPmNtZC5zbGF2ZV9zZW0pOworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgbWx4NF9jbWRfcG9sbChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTY0IGluX3BhcmFtLCB1NjQgKm91dF9wYXJhbSwKIAkJCSBpbnQgb3V0X2lzX2ltbSwgdTMyIGluX21vZGlmaWVyLCB1OCBvcF9tb2RpZmllciwKIAkJCSB1MTYgb3AsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKQEAgLTIxNyw2ICs0MTgsNyBAQAogCXZvaWQgX19pb21lbSAqaGNyID0gcHJpdi0+Y21kLmhjcjsKIAlpbnQgZXJyID0gMDsKIAl1bnNpZ25lZCBsb25nIGVuZDsKKwl1MzIgc3RhdDsKIAogCWRvd24oJnByaXYtPmNtZC5wb2xsX3NlbSk7CiAKQEAgLTI0MCw5ICs0NDIsMTIgQEAKIAkJCQkJICBfX3Jhd19yZWFkbChoY3IgKyBIQ1JfT1VUX1BBUkFNX09GRlNFVCkpIDw8IDMyIHwKIAkJCSh1NjQpIGJlMzJfdG9fY3B1KChfX2ZvcmNlIF9fYmUzMikKIAkJCQkJICBfX3Jhd19yZWFkbChoY3IgKyBIQ1JfT1VUX1BBUkFNX09GRlNFVCArIDQpKTsKLQotCWVyciA9IG1seDRfc3RhdHVzX3RvX2Vycm5vKGJlMzJfdG9fY3B1KChfX2ZvcmNlIF9fYmUzMikKLQkJCQkJICAgICAgIF9fcmF3X3JlYWRsKGhjciArIEhDUl9TVEFUVVNfT0ZGU0VUKSkgPj4gMjQpOworCXN0YXQgPSBiZTMyX3RvX2NwdSgoX19mb3JjZSBfX2JlMzIpCisJCQkgICBfX3Jhd19yZWFkbChoY3IgKyBIQ1JfU1RBVFVTX09GRlNFVCkpID4+IDI0OworCWVyciA9IG1seDRfc3RhdHVzX3RvX2Vycm5vKHN0YXQpOworCWlmIChlcnIpCisJCW1seDRfZXJyKGRldiwgImNvbW1hbmQgMHgleCBmYWlsZWQ6IGZ3IHN0YXR1cyA9IDB4JXhcbiIsCisJCQkgb3AsIHN0YXQpOwogCiBvdXQ6CiAJdXAoJnByaXYtPmNtZC5wb2xsX3NlbSk7CkBAIC0yNTksNiArNDY0LDcgQEAKIAlpZiAodG9rZW4gIT0gY29udGV4dC0+dG9rZW4pCiAJCXJldHVybjsKIAorCWNvbnRleHQtPmZ3X3N0YXR1cyA9IHN0YXR1czsKIAljb250ZXh0LT5yZXN1bHQgICAgPSBtbHg0X3N0YXR1c190b19lcnJubyhzdGF0dXMpOwogCWNvbnRleHQtPm91dF9wYXJhbSA9IG91dF9wYXJhbTsKIApAQCAtMjg3LDE0ICs0OTMsMTggQEAKIAltbHg0X2NtZF9wb3N0KGRldiwgaW5fcGFyYW0sIG91dF9wYXJhbSA/ICpvdXRfcGFyYW0gOiAwLAogCQkgICAgICBpbl9tb2RpZmllciwgb3BfbW9kaWZpZXIsIG9wLCBjb250ZXh0LT50b2tlbiwgMSk7CiAKLQlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udGV4dC0+ZG9uZSwgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSkpIHsKKwlpZiAoIXdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCgmY29udGV4dC0+ZG9uZSwKKwkJCQkJIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpKSB7CiAJCWVyciA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQogCiAJZXJyID0gY29udGV4dC0+cmVzdWx0OwotCWlmIChlcnIpCisJaWYgKGVycikgeworCQltbHg0X2VycihkZXYsICJjb21tYW5kIDB4JXggZmFpbGVkOiBmdyBzdGF0dXMgPSAweCV4XG4iLAorCQkJIG9wLCBjb250ZXh0LT5md19zdGF0dXMpOwogCQlnb3RvIG91dDsKKwl9CiAKIAlpZiAob3V0X2lzX2ltbSkKIAkJKm91dF9wYXJhbSA9IGNvbnRleHQtPm91dF9wYXJhbTsKQEAgLTMxMSwxNyArNTIxLDEwNDYgQEAKIAogaW50IF9fbWx4NF9jbWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU2NCBpbl9wYXJhbSwgdTY0ICpvdXRfcGFyYW0sCiAJICAgICAgIGludCBvdXRfaXNfaW1tLCB1MzIgaW5fbW9kaWZpZXIsIHU4IG9wX21vZGlmaWVyLAotCSAgICAgICB1MTYgb3AsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKKwkgICAgICAgdTE2IG9wLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQsIGludCBuYXRpdmUpCiB7Ci0JaWYgKG1seDRfcHJpdihkZXYpLT5jbWQudXNlX2V2ZW50cykKLQkJcmV0dXJuIG1seDRfY21kX3dhaXQoZGV2LCBpbl9wYXJhbSwgb3V0X3BhcmFtLCBvdXRfaXNfaW1tLAotCQkJCSAgICAgaW5fbW9kaWZpZXIsIG9wX21vZGlmaWVyLCBvcCwgdGltZW91dCk7Ci0JZWxzZQotCQlyZXR1cm4gbWx4NF9jbWRfcG9sbChkZXYsIGluX3BhcmFtLCBvdXRfcGFyYW0sIG91dF9pc19pbW0sCi0JCQkJICAgICBpbl9tb2RpZmllciwgb3BfbW9kaWZpZXIsIG9wLCB0aW1lb3V0KTsKKwlpZiAoIW1seDRfaXNfbWZ1bmMoZGV2KSB8fCAobmF0aXZlICYmIG1seDRfaXNfbWFzdGVyKGRldikpKSB7CisJCWlmIChtbHg0X3ByaXYoZGV2KS0+Y21kLnVzZV9ldmVudHMpCisJCQlyZXR1cm4gbWx4NF9jbWRfd2FpdChkZXYsIGluX3BhcmFtLCBvdXRfcGFyYW0sCisJCQkJCSAgICAgb3V0X2lzX2ltbSwgaW5fbW9kaWZpZXIsCisJCQkJCSAgICAgb3BfbW9kaWZpZXIsIG9wLCB0aW1lb3V0KTsKKwkJZWxzZQorCQkJcmV0dXJuIG1seDRfY21kX3BvbGwoZGV2LCBpbl9wYXJhbSwgb3V0X3BhcmFtLAorCQkJCQkgICAgIG91dF9pc19pbW0sIGluX21vZGlmaWVyLAorCQkJCQkgICAgIG9wX21vZGlmaWVyLCBvcCwgdGltZW91dCk7CisJfQorCXJldHVybiBtbHg0X3NsYXZlX2NtZChkZXYsIGluX3BhcmFtLCBvdXRfcGFyYW0sIG91dF9pc19pbW0sCisJCQkgICAgICBpbl9tb2RpZmllciwgb3BfbW9kaWZpZXIsIG9wLCB0aW1lb3V0KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKF9fbWx4NF9jbWQpOwogCisKK3N0YXRpYyBpbnQgbWx4NF9BUk1fQ09NTV9DSEFOTkVMKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCXJldHVybiBtbHg0X2NtZChkZXYsIDAsIDAsIDAsIE1MWDRfQ01EX0FSTV9DT01NX0NIQU5ORUwsCisJCQlNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX05BVElWRSk7Cit9CisKK3N0YXRpYyBpbnQgbWx4NF9BQ0NFU1NfTUVNKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1NjQgbWFzdGVyX2FkZHIsCisJCQkgICBpbnQgc2xhdmUsIHU2NCBzbGF2ZV9hZGRyLAorCQkJICAgaW50IHNpemUsIGludCBpc19yZWFkKQoreworCXU2NCBpbl9wYXJhbTsKKwl1NjQgb3V0X3BhcmFtOworCisJaWYgKChzbGF2ZV9hZGRyICYgMHhmZmYpIHwgKG1hc3Rlcl9hZGRyICYgMHhmZmYpIHwKKwkgICAgKHNsYXZlICYgfjB4N2YpIHwgKHNpemUgJiAweGZmKSkgeworCQltbHg0X2VycihkZXYsICJCYWQgYWNjZXNzIG1lbSBwYXJhbXMgLSBzbGF2ZV9hZGRyOjB4JWxseCAiCisJCQkgICAgICAibWFzdGVyX2FkZHI6MHglbGx4IHNsYXZlX2lkOiVkIHNpemU6JWRcbiIsCisJCQkgICAgICBzbGF2ZV9hZGRyLCBtYXN0ZXJfYWRkciwgc2xhdmUsIHNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoaXNfcmVhZCkgeworCQlpbl9wYXJhbSA9ICh1NjQpIHNsYXZlIHwgc2xhdmVfYWRkcjsKKwkJb3V0X3BhcmFtID0gKHU2NCkgZGV2LT5jYXBzLmZ1bmN0aW9uIHwgbWFzdGVyX2FkZHI7CisJfSBlbHNlIHsKKwkJaW5fcGFyYW0gPSAodTY0KSBkZXYtPmNhcHMuZnVuY3Rpb24gfCBtYXN0ZXJfYWRkcjsKKwkJb3V0X3BhcmFtID0gKHU2NCkgc2xhdmUgfCBzbGF2ZV9hZGRyOworCX0KKworCXJldHVybiBtbHg0X2NtZF9pbW0oZGV2LCBpbl9wYXJhbSwgJm91dF9wYXJhbSwgc2l6ZSwgMCwKKwkJCSAgICBNTFg0X0NNRF9BQ0NFU1NfTUVNLAorCQkJICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfTkFUSVZFKTsKK30KKworaW50IG1seDRfRE1BX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJICAgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJICAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJdTY0IGluX3BhcmFtOworCXU2NCBvdXRfcGFyYW07CisJaW50IGVycjsKKworCWluX3BhcmFtID0gY21kLT5oYXNfaW5ib3ggPyAodTY0KSBpbmJveC0+ZG1hIDogdmhjci0+aW5fcGFyYW07CisJb3V0X3BhcmFtID0gY21kLT5oYXNfb3V0Ym94ID8gKHU2NCkgb3V0Ym94LT5kbWEgOiB2aGNyLT5vdXRfcGFyYW07CisJaWYgKGNtZC0+ZW5jb2RlX3NsYXZlX2lkKSB7CisJCWluX3BhcmFtICY9IDB4ZmZmZmZmZmZmZmZmZmYwMGxsOworCQlpbl9wYXJhbSB8PSBzbGF2ZTsKKwl9CisKKwllcnIgPSBfX21seDRfY21kKGRldiwgaW5fcGFyYW0sICZvdXRfcGFyYW0sIGNtZC0+b3V0X2lzX2ltbSwKKwkJCSB2aGNyLT5pbl9tb2RpZmllciwgdmhjci0+b3BfbW9kaWZpZXIsIHZoY3ItPm9wLAorCQkJIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfTkFUSVZFKTsKKworCWlmIChjbWQtPm91dF9pc19pbW0pCisJCXZoY3ItPm91dF9wYXJhbSA9IG91dF9wYXJhbTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyBjbWRfaW5mb1tdID0geworCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1FVRVJZX0ZXLAorCQkuaGFzX2luYm94ID0gZmFsc2UsCisJCS5oYXNfb3V0Ym94ID0gdHJ1ZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBOVUxMCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9RVUVSWV9IQ0EsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSB0cnVlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IE5VTEwKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1FVRVJZX0RFVl9DQVAsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSB0cnVlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IE5VTEwKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1FVRVJZX0ZVTkNfQ0FQLAorCQkuaGFzX2luYm94ID0gZmFsc2UsCisJCS5oYXNfb3V0Ym94ID0gdHJ1ZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X1FVRVJZX0ZVTkNfQ0FQX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1FVRVJZX0FEQVBURVIsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSB0cnVlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IE5VTEwKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX0lOSVRfUE9SVCwKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfSU5JVF9QT1JUX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX0NMT1NFX1BPUlQsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9DTE9TRV9QT1JUX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1FVRVJZX1BPUlQsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSB0cnVlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfUVVFUllfUE9SVF93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9TRVRfUE9SVCwKKwkJLmhhc19pbmJveCA9IHRydWUsCisJCS5oYXNfb3V0Ym94ID0gZmFsc2UsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9TRVRfUE9SVF93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9NQVBfRVEsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X01BUF9FUV93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9TVzJIV19FUSwKKwkJLmhhc19pbmJveCA9IHRydWUsCisJCS5oYXNfb3V0Ym94ID0gZmFsc2UsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSB0cnVlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X1NXMkhXX0VRX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX0hXX0hFQUxUSF9DSEVDSywKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IE5VTEwKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX05PUCwKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IE5VTEwKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX0FMTE9DX1JFUywKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IHRydWUsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9BTExPQ19SRVNfd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfRlJFRV9SRVMsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X0ZSRUVfUkVTX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1NXMkhXX01QVCwKKwkJLmhhc19pbmJveCA9IHRydWUsCisJCS5oYXNfb3V0Ym94ID0gZmFsc2UsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSB0cnVlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X1NXMkhXX01QVF93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9RVUVSWV9NUFQsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSB0cnVlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfUVVFUllfTVBUX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX0hXMlNXX01QVCwKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfSFcyU1dfTVBUX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1JFQURfTVRULAorCQkuaGFzX2luYm94ID0gZmFsc2UsCisJCS5oYXNfb3V0Ym94ID0gdHJ1ZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBOVUxMCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9XUklURV9NVFQsCisJCS5oYXNfaW5ib3ggPSB0cnVlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfV1JJVEVfTVRUX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1NZTkNfVFBULAorCQkuaGFzX2luYm94ID0gdHJ1ZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBOVUxMCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9IVzJTV19FUSwKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IHRydWUsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSB0cnVlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X0hXMlNXX0VRX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1FVRVJZX0VRLAorCQkuaGFzX2luYm94ID0gZmFsc2UsCisJCS5oYXNfb3V0Ym94ID0gdHJ1ZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IHRydWUsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfUVVFUllfRVFfd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfU1cySFdfQ1EsCisJCS5oYXNfaW5ib3ggPSB0cnVlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gdHJ1ZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9TVzJIV19DUV93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9IVzJTV19DUSwKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfSFcyU1dfQ1Ffd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfUVVFUllfQ1EsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSB0cnVlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfUVVFUllfQ1Ffd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfTU9ESUZZX0NRLAorCQkuaGFzX2luYm94ID0gdHJ1ZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSB0cnVlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfTU9ESUZZX0NRX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1NXMkhXX1NSUSwKKwkJLmhhc19pbmJveCA9IHRydWUsCisJCS5oYXNfb3V0Ym94ID0gZmFsc2UsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSB0cnVlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X1NXMkhXX1NSUV93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9IVzJTV19TUlEsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X0hXMlNXX1NSUV93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9RVUVSWV9TUlEsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSB0cnVlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfUVVFUllfU1JRX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX0FSTV9TUlEsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X0FSTV9TUlFfd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfUlNUMklOSVRfUVAsCisJCS5oYXNfaW5ib3ggPSB0cnVlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gdHJ1ZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9SU1QySU5JVF9RUF93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9JTklUMklOSVRfUVAsCisJCS5oYXNfaW5ib3ggPSB0cnVlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfR0VOX1FQX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX0lOSVQyUlRSX1FQLAorCQkuaGFzX2luYm94ID0gdHJ1ZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X0lOSVQyUlRSX1FQX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1JUUjJSVFNfUVAsCisJCS5oYXNfaW5ib3ggPSB0cnVlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfR0VOX1FQX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1JUUzJSVFNfUVAsCisJCS5oYXNfaW5ib3ggPSB0cnVlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfR0VOX1FQX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1NRRVJSMlJUU19RUCwKKwkJLmhhc19pbmJveCA9IHRydWUsCisJCS5oYXNfb3V0Ym94ID0gZmFsc2UsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9HRU5fUVBfd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfMkVSUl9RUCwKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfR0VOX1FQX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1JUUzJTUURfUVAsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X0dFTl9RUF93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9TUUQyU1FEX1FQLAorCQkuaGFzX2luYm94ID0gdHJ1ZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X0dFTl9RUF93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9TUUQyUlRTX1FQLAorCQkuaGFzX2luYm94ID0gdHJ1ZSwKKwkJLmhhc19vdXRib3ggPSBmYWxzZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X0dFTl9RUF93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF8yUlNUX1FQLAorCQkuaGFzX2luYm94ID0gZmFsc2UsCisJCS5oYXNfb3V0Ym94ID0gZmFsc2UsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF8yUlNUX1FQX3dyYXBwZXIKKwl9LAorCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1FVRVJZX1FQLAorCQkuaGFzX2luYm94ID0gZmFsc2UsCisJCS5oYXNfb3V0Ym94ID0gdHJ1ZSwKKwkJLm91dF9pc19pbW0gPSBmYWxzZSwKKwkJLmVuY29kZV9zbGF2ZV9pZCA9IGZhbHNlLAorCQkudmVyaWZ5ID0gTlVMTCwKKwkJLndyYXBwZXIgPSBtbHg0X0dFTl9RUF93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9TVVNQRU5EX1FQLAorCQkuaGFzX2luYm94ID0gZmFsc2UsCisJCS5oYXNfb3V0Ym94ID0gZmFsc2UsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9HRU5fUVBfd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfVU5TVVNQRU5EX1FQLAorCQkuaGFzX2luYm94ID0gZmFsc2UsCisJCS5oYXNfb3V0Ym94ID0gZmFsc2UsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9HRU5fUVBfd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfUVVFUllfSUZfU1RBVCwKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IHRydWUsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9RVUVSWV9JRl9TVEFUX3dyYXBwZXIKKwl9LAorCS8qIE5hdGl2ZSBtdWx0aWNhc3QgY29tbWFuZHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIGd1ZXN0cyAqLworCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1FQX0FUVEFDSCwKKwkJLmhhc19pbmJveCA9IHRydWUsCisJCS5oYXNfb3V0Ym94ID0gZmFsc2UsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gbWx4NF9RUF9BVFRBQ0hfd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfUFJPTUlTQywKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfUFJPTUlTQ193cmFwcGVyCisJfSwKKwkvKiBFdGhlcm5ldCBzcGVjaWZpYyBjb21tYW5kcyAqLworCXsKKwkJLm9wY29kZSA9IE1MWDRfQ01EX1NFVF9WTEFOX0ZMVFIsCisJCS5oYXNfaW5ib3ggPSB0cnVlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfU0VUX1ZMQU5fRkxUUl93cmFwcGVyCisJfSwKKwl7CisJCS5vcGNvZGUgPSBNTFg0X0NNRF9TRVRfTUNBU1RfRkxUUiwKKwkJLmhhc19pbmJveCA9IGZhbHNlLAorCQkuaGFzX291dGJveCA9IGZhbHNlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfU0VUX01DQVNUX0ZMVFJfd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfRFVNUF9FVEhfU1RBVFMsCisJCS5oYXNfaW5ib3ggPSBmYWxzZSwKKwkJLmhhc19vdXRib3ggPSB0cnVlLAorCQkub3V0X2lzX2ltbSA9IGZhbHNlLAorCQkuZW5jb2RlX3NsYXZlX2lkID0gZmFsc2UsCisJCS52ZXJpZnkgPSBOVUxMLAorCQkud3JhcHBlciA9IG1seDRfRFVNUF9FVEhfU1RBVFNfd3JhcHBlcgorCX0sCisJeworCQkub3Bjb2RlID0gTUxYNF9DTURfSU5GT1JNX0ZMUl9ET05FLAorCQkuaGFzX2luYm94ID0gZmFsc2UsCisJCS5oYXNfb3V0Ym94ID0gZmFsc2UsCisJCS5vdXRfaXNfaW1tID0gZmFsc2UsCisJCS5lbmNvZGVfc2xhdmVfaWQgPSBmYWxzZSwKKwkJLnZlcmlmeSA9IE5VTEwsCisJCS53cmFwcGVyID0gTlVMTAorCX0sCit9OworCitzdGF0aWMgaW50IG1seDRfbWFzdGVyX3Byb2Nlc3NfdmhjcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJCSAgICBzdHJ1Y3QgbWx4NF92aGNyX2NtZCAqaW5fdmhjcikKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCA9IE5VTEw7CisJc3RydWN0IG1seDRfdmhjcl9jbWQgKnZoY3JfY21kID0gaW5fdmhjciA/IGluX3ZoY3IgOiBwcml2LT5tZnVuYy52aGNyOworCXN0cnVjdCBtbHg0X3ZoY3IgKnZoY3I7CisJc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94ID0gTlVMTDsKKwlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94ID0gTlVMTDsKKwl1NjQgaW5fcGFyYW07CisJdTY0IG91dF9wYXJhbTsKKwlpbnQgcmV0ID0gMDsKKwlpbnQgaTsKKwlpbnQgZXJyID0gMDsKKworCS8qIENyZWF0ZSBzdyByZXByZXNlbnRhdGlvbiBvZiBWaXJ0dWFsIEhDUiAqLworCXZoY3IgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbWx4NF92aGNyKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2aGNyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIERNQSBpbiB0aGUgdkhDUiAqLworCWlmICghaW5fdmhjcikgeworCQlyZXQgPSBtbHg0X0FDQ0VTU19NRU0oZGV2LCBwcml2LT5tZnVuYy52aGNyX2RtYSwgc2xhdmUsCisJCQkJICAgICAgcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXS52aGNyX2RtYSwKKwkJCQkgICAgICBBTElHTihzaXplb2Yoc3RydWN0IG1seDRfdmhjcl9jbWQpLAorCQkJCQkgICAgTUxYNF9BQ0NFU1NfTUVNX0FMSUdOKSwgMSk7CisJCWlmIChyZXQpIHsKKwkJCW1seDRfZXJyKGRldiwgIiVzOkZhaWxlZCByZWFkaW5nIHZoY3IiCisJCQkJICJyZXQ6IDB4JXhcbiIsIF9fZnVuY19fLCByZXQpOworCQkJa2ZyZWUodmhjcik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogRmlsbCBTVyBWSENSIGZpZWxkcyAqLworCXZoY3ItPmluX3BhcmFtID0gYmU2NF90b19jcHUodmhjcl9jbWQtPmluX3BhcmFtKTsKKwl2aGNyLT5vdXRfcGFyYW0gPSBiZTY0X3RvX2NwdSh2aGNyX2NtZC0+b3V0X3BhcmFtKTsKKwl2aGNyLT5pbl9tb2RpZmllciA9IGJlMzJfdG9fY3B1KHZoY3JfY21kLT5pbl9tb2RpZmllcik7CisJdmhjci0+dG9rZW4gPSBiZTE2X3RvX2NwdSh2aGNyX2NtZC0+dG9rZW4pOworCXZoY3ItPm9wID0gYmUxNl90b19jcHUodmhjcl9jbWQtPm9wY29kZSkgJiAweGZmZjsKKwl2aGNyLT5vcF9tb2RpZmllciA9ICh1OCkgKGJlMTZfdG9fY3B1KHZoY3JfY21kLT5vcGNvZGUpID4+IDEyKTsKKwl2aGNyLT5lX2JpdCA9IHZoY3JfY21kLT5mbGFncyAmICgxIDw8IDYpOworCisJLyogTG9va3VwIGNvbW1hbmQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjbWRfaW5mbyk7ICsraSkgeworCQlpZiAodmhjci0+b3AgPT0gY21kX2luZm9baV0ub3Bjb2RlKSB7CisJCQljbWQgPSAmY21kX2luZm9baV07CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoIWNtZCkgeworCQltbHg0X2VycihkZXYsICJVbmtub3duIGNvbW1hbmQ6MHgleCBhY2NlcHRlZCBmcm9tIHNsYXZlOiVkXG4iLAorCQkJIHZoY3ItPm9wLCBzbGF2ZSk7CisJCXZoY3JfY21kLT5zdGF0dXMgPSBDTURfU1RBVF9CQURfUEFSQU07CisJCWdvdG8gb3V0X3N0YXR1czsKKwl9CisKKwkvKiBSZWFkIGluYm94ICovCisJaWYgKGNtZC0+aGFzX2luYm94KSB7CisJCXZoY3ItPmluX3BhcmFtICY9IElOQk9YX01BU0s7CisJCWluYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOworCQlpZiAoSVNfRVJSKGluYm94KSkgeworCQkJdmhjcl9jbWQtPnN0YXR1cyA9IENNRF9TVEFUX0JBRF9TSVpFOworCQkJaW5ib3ggPSBOVUxMOworCQkJZ290byBvdXRfc3RhdHVzOworCQl9CisKKwkJaWYgKG1seDRfQUNDRVNTX01FTShkZXYsIGluYm94LT5kbWEsIHNsYXZlLAorCQkJCSAgICB2aGNyLT5pbl9wYXJhbSwKKwkJCQkgICAgTUxYNF9NQUlMQk9YX1NJWkUsIDEpKSB7CisJCQltbHg0X2VycihkZXYsICIlczogRmFpbGVkIHJlYWRpbmcgaW5ib3ggKGNtZDoweCV4KVxuIiwKKwkJCQkgX19mdW5jX18sIGNtZC0+b3Bjb2RlKTsKKwkJCXZoY3JfY21kLT5zdGF0dXMgPSBDTURfU1RBVF9JTlRFUk5BTF9FUlI7CisJCQlnb3RvIG91dF9zdGF0dXM7CisJCX0KKwl9CisKKwkvKiBBcHBseSBwZXJtaXNzaW9uIGFuZCBib3VuZCBjaGVja3MgaWYgYXBwbGljYWJsZSAqLworCWlmIChjbWQtPnZlcmlmeSAmJiBjbWQtPnZlcmlmeShkZXYsIHNsYXZlLCB2aGNyLCBpbmJveCkpIHsKKwkJbWx4NF93YXJuKGRldiwgIkNvbW1hbmQ6MHgleCBmcm9tIHNsYXZlOiAlZCBmYWlsZWQgcHJvdGVjdGlvbiAiCisJCQkgICJjaGVja3MgZm9yIHJlc291cmNlX2lkOiVkXG4iLCB2aGNyLT5vcCwgc2xhdmUsCisJCQkgIHZoY3ItPmluX21vZGlmaWVyKTsKKwkJdmhjcl9jbWQtPnN0YXR1cyA9IENNRF9TVEFUX0JBRF9PUDsKKwkJZ290byBvdXRfc3RhdHVzOworCX0KKworCS8qIEFsbG9jYXRlIG91dGJveCAqLworCWlmIChjbWQtPmhhc19vdXRib3gpIHsKKwkJb3V0Ym94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOworCQlpZiAoSVNfRVJSKG91dGJveCkpIHsKKwkJCXZoY3JfY21kLT5zdGF0dXMgPSBDTURfU1RBVF9CQURfU0laRTsKKwkJCW91dGJveCA9IE5VTEw7CisJCQlnb3RvIG91dF9zdGF0dXM7CisJCX0KKwl9CisKKwkvKiBFeGVjdXRlIHRoZSBjb21tYW5kISAqLworCWlmIChjbWQtPndyYXBwZXIpIHsKKwkJZXJyID0gY21kLT53cmFwcGVyKGRldiwgc2xhdmUsIHZoY3IsIGluYm94LCBvdXRib3gsCisJCQkJICAgY21kKTsKKwkJaWYgKGNtZC0+b3V0X2lzX2ltbSkKKwkJCXZoY3JfY21kLT5vdXRfcGFyYW0gPSBjcHVfdG9fYmU2NCh2aGNyLT5vdXRfcGFyYW0pOworCX0gZWxzZSB7CisJCWluX3BhcmFtID0gY21kLT5oYXNfaW5ib3ggPyAodTY0KSBpbmJveC0+ZG1hIDoKKwkJCXZoY3ItPmluX3BhcmFtOworCQlvdXRfcGFyYW0gPSBjbWQtPmhhc19vdXRib3ggPyAodTY0KSBvdXRib3gtPmRtYSA6CisJCQl2aGNyLT5vdXRfcGFyYW07CisJCWVyciA9IF9fbWx4NF9jbWQoZGV2LCBpbl9wYXJhbSwgJm91dF9wYXJhbSwKKwkJCQkgY21kLT5vdXRfaXNfaW1tLCB2aGNyLT5pbl9tb2RpZmllciwKKwkJCQkgdmhjci0+b3BfbW9kaWZpZXIsIHZoY3ItPm9wLAorCQkJCSBNTFg0X0NNRF9USU1FX0NMQVNTX0EsCisJCQkJIE1MWDRfQ01EX05BVElWRSk7CisKKwkJaWYgKGNtZC0+b3V0X2lzX2ltbSkgeworCQkJdmhjci0+b3V0X3BhcmFtID0gb3V0X3BhcmFtOworCQkJdmhjcl9jbWQtPm91dF9wYXJhbSA9IGNwdV90b19iZTY0KHZoY3ItPm91dF9wYXJhbSk7CisJCX0KKwl9CisKKwlpZiAoZXJyKSB7CisJCW1seDRfd2FybihkZXYsICJ2aGNyIGNvbW1hbmQ6MHgleCBzbGF2ZTolZCBmYWlsZWQgd2l0aCIKKwkJCSAgIiBlcnJvcjolZCwgc3RhdHVzICVkXG4iLAorCQkJICB2aGNyLT5vcCwgc2xhdmUsIHZoY3ItPmVycm5vLCBlcnIpOworCQl2aGNyX2NtZC0+c3RhdHVzID0gbWx4NF9lcnJub190b19zdGF0dXMoZXJyKTsKKwkJZ290byBvdXRfc3RhdHVzOworCX0KKworCisJLyogV3JpdGUgb3V0Ym94IGlmIGNvbW1hbmQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworCWlmIChjbWQtPmhhc19vdXRib3ggJiYgIXZoY3JfY21kLT5zdGF0dXMpIHsKKwkJcmV0ID0gbWx4NF9BQ0NFU1NfTUVNKGRldiwgb3V0Ym94LT5kbWEsIHNsYXZlLAorCQkJCSAgICAgIHZoY3ItPm91dF9wYXJhbSwKKwkJCQkgICAgICBNTFg0X01BSUxCT1hfU0laRSwgTUxYNF9DTURfV1JBUFBFRCk7CisJCWlmIChyZXQpIHsKKwkJCS8qIElmIHdlIGZhaWxlZCB0byB3cml0ZSBiYWNrIHRoZSBvdXRib3ggYWZ0ZXIgdGhlCisJCQkgKmNvbW1hbmQgd2FzIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCwgd2UgbXVzdCBmYWlsIHRoaXMKKwkJCSAqIHNsYXZlLCBhcyBpdCBpcyBub3cgaW4gdW5kZWZpbmVkIHN0YXRlICovCisJCQltbHg0X2VycihkZXYsICIlczpGYWlsZWQgd3JpdGluZyBvdXRib3hcbiIsIF9fZnVuY19fKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCitvdXRfc3RhdHVzOgorCS8qIERNQSBiYWNrIHZoY3IgcmVzdWx0ICovCisJaWYgKCFpbl92aGNyKSB7CisJCXJldCA9IG1seDRfQUNDRVNTX01FTShkZXYsIHByaXYtPm1mdW5jLnZoY3JfZG1hLCBzbGF2ZSwKKwkJCQkgICAgICBwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbc2xhdmVdLnZoY3JfZG1hLAorCQkJCSAgICAgIEFMSUdOKHNpemVvZihzdHJ1Y3QgbWx4NF92aGNyKSwKKwkJCQkJICAgIE1MWDRfQUNDRVNTX01FTV9BTElHTiksCisJCQkJICAgICAgTUxYNF9DTURfV1JBUFBFRCk7CisJCWlmIChyZXQpCisJCQltbHg0X2VycihkZXYsICIlczpGYWlsZWQgd3JpdGluZyB2aGNyIHJlc3VsdFxuIiwKKwkJCQkgX19mdW5jX18pOworCQllbHNlIGlmICh2aGNyLT5lX2JpdCAmJgorCQkJIG1seDRfR0VOX0VRRShkZXYsIHNsYXZlLCAmcHJpdi0+bWZ1bmMubWFzdGVyLmNtZF9lcWUpKQorCQkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gZ2VuZXJhdGUgY29tbWFuZCBjb21wbGV0aW9uICIKKwkJCQkJICAiZXFlIGZvciBzbGF2ZSAlZFxuIiwgc2xhdmUpOworCX0KKworb3V0OgorCWtmcmVlKHZoY3IpOworCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIGluYm94KTsKKwltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBvdXRib3gpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1seDRfbWFzdGVyX2RvX2NtZChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCB1OCBjbWQsCisJCQkgICAgICAgdTE2IHBhcmFtLCB1OCB0b2dnbGUpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3NsYXZlX3N0YXRlICpzbGF2ZV9zdGF0ZSA9IHByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZTsKKwl1MzIgcmVwbHk7CisJdTMyIHNsYXZlX3N0YXR1cyA9IDA7CisJdTggaXNfZ29pbmdfZG93biA9IDA7CisKKwlzbGF2ZV9zdGF0ZVtzbGF2ZV0uY29tbV90b2dnbGUgXj0gMTsKKwlyZXBseSA9ICh1MzIpIHNsYXZlX3N0YXRlW3NsYXZlXS5jb21tX3RvZ2dsZSA8PCAzMTsKKwlpZiAodG9nZ2xlICE9IHNsYXZlX3N0YXRlW3NsYXZlXS5jb21tX3RvZ2dsZSkgeworCQltbHg0X3dhcm4oZGV2LCAiSW5jb3JyZWN0IHRvZ2dsZSAlZCBmcm9tIHNsYXZlICVkLiAqKiogTUFTVEVSIgorCQkJICAiU1RBVEUgQ09NUFJPTUlTSUVEICoqKlxuIiwgdG9nZ2xlLCBzbGF2ZSk7CisJCWdvdG8gcmVzZXRfc2xhdmU7CisJfQorCWlmIChjbWQgPT0gTUxYNF9DT01NX0NNRF9SRVNFVCkgeworCQltbHg0X3dhcm4oZGV2LCAiUmVjZWl2ZWQgcmVzZXQgZnJvbSBzbGF2ZTolZFxuIiwgc2xhdmUpOworCQlzbGF2ZV9zdGF0ZVtzbGF2ZV0uYWN0aXZlID0gZmFsc2U7CisJCS8qY2hlY2sgaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgRkxSIHByb2Nlc3MsCisJCWlmIHNvIHJldHVybiAicmV0cnkiIHN0YXR1cyB0byB0aGUgc2xhdmUqLworCQlpZiAoTUxYNF9DT01NX0NNRF9GTFIgPT0gc2xhdmVfc3RhdGVbc2xhdmVdLmxhc3RfY21kKSB7CisJCQlzbGF2ZV9zdGF0dXMgPSBNTFg0X0RFTEFZX1JFU0VUX1NMQVZFOworCQkJZ290byBpbmZvcm1fc2xhdmVfc3RhdGU7CisJCX0KKworCQkvKiB3cml0ZSB0aGUgdmVyc2lvbiBpbiB0aGUgZXZlbnQgZmllbGQgKi8KKwkJcmVwbHkgfD0gbWx4NF9jb21tX2dldF92ZXJzaW9uKCk7CisKKwkJZ290byByZXNldF9zbGF2ZTsKKwl9CisJLypjb21tYW5kIGZyb20gc2xhdmUgaW4gdGhlIG1pZGRsZSBvZiBGTFIqLworCWlmIChjbWQgIT0gTUxYNF9DT01NX0NNRF9SRVNFVCAmJgorCSAgICBNTFg0X0NPTU1fQ01EX0ZMUiA9PSBzbGF2ZV9zdGF0ZVtzbGF2ZV0ubGFzdF9jbWQpIHsKKwkJbWx4NF93YXJuKGRldiwgInNsYXZlOiVkIGlzIFRyeWluZyB0byBydW4gY21kKDB4JXgpICIKKwkJCSAgImluIHRoZSBtaWRkbGUgb2YgRkxSXG4iLCBzbGF2ZSwgY21kKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNTFg0X0NPTU1fQ01EX1ZIQ1IwOgorCQlpZiAoc2xhdmVfc3RhdGVbc2xhdmVdLmxhc3RfY21kICE9IE1MWDRfQ09NTV9DTURfUkVTRVQpCisJCQlnb3RvIHJlc2V0X3NsYXZlOworCQlzbGF2ZV9zdGF0ZVtzbGF2ZV0udmhjcl9kbWEgPSAoKHU2NCkgcGFyYW0pIDw8IDQ4OworCQlwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbc2xhdmVdLmNvb2tpZSA9IDA7CisJCW11dGV4X2luaXQoJnByaXYtPm1mdW5jLm1hc3Rlci5nZW5fZXFlX211dGV4W3NsYXZlXSk7CisJCWJyZWFrOworCWNhc2UgTUxYNF9DT01NX0NNRF9WSENSMToKKwkJaWYgKHNsYXZlX3N0YXRlW3NsYXZlXS5sYXN0X2NtZCAhPSBNTFg0X0NPTU1fQ01EX1ZIQ1IwKQorCQkJZ290byByZXNldF9zbGF2ZTsKKwkJc2xhdmVfc3RhdGVbc2xhdmVdLnZoY3JfZG1hIHw9ICgodTY0KSBwYXJhbSkgPDwgMzI7CisJCWJyZWFrOworCWNhc2UgTUxYNF9DT01NX0NNRF9WSENSMjoKKwkJaWYgKHNsYXZlX3N0YXRlW3NsYXZlXS5sYXN0X2NtZCAhPSBNTFg0X0NPTU1fQ01EX1ZIQ1IxKQorCQkJZ290byByZXNldF9zbGF2ZTsKKwkJc2xhdmVfc3RhdGVbc2xhdmVdLnZoY3JfZG1hIHw9ICgodTY0KSBwYXJhbSkgPDwgMTY7CisJCWJyZWFrOworCWNhc2UgTUxYNF9DT01NX0NNRF9WSENSX0VOOgorCQlpZiAoc2xhdmVfc3RhdGVbc2xhdmVdLmxhc3RfY21kICE9IE1MWDRfQ09NTV9DTURfVkhDUjIpCisJCQlnb3RvIHJlc2V0X3NsYXZlOworCQlzbGF2ZV9zdGF0ZVtzbGF2ZV0udmhjcl9kbWEgfD0gcGFyYW07CisJCXNsYXZlX3N0YXRlW3NsYXZlXS5hY3RpdmUgPSB0cnVlOworCQlicmVhazsKKwljYXNlIE1MWDRfQ09NTV9DTURfVkhDUl9QT1NUOgorCQlpZiAoKHNsYXZlX3N0YXRlW3NsYXZlXS5sYXN0X2NtZCAhPSBNTFg0X0NPTU1fQ01EX1ZIQ1JfRU4pICYmCisJCSAgICAoc2xhdmVfc3RhdGVbc2xhdmVdLmxhc3RfY21kICE9IE1MWDRfQ09NTV9DTURfVkhDUl9QT1NUKSkKKwkJCWdvdG8gcmVzZXRfc2xhdmU7CisJCWRvd24oJnByaXYtPmNtZC5zbGF2ZV9zZW0pOworCQlpZiAobWx4NF9tYXN0ZXJfcHJvY2Vzc192aGNyKGRldiwgc2xhdmUsIE5VTEwpKSB7CisJCQltbHg0X2VycihkZXYsICJGYWlsZWQgcHJvY2Vzc2luZyB2aGNyIGZvciBzbGF2ZTolZCwiCisJCQkJICIgcmVzZXRpbmcgc2xhdmUuXG4iLCBzbGF2ZSk7CisJCQl1cCgmcHJpdi0+Y21kLnNsYXZlX3NlbSk7CisJCQlnb3RvIHJlc2V0X3NsYXZlOworCQl9CisJCXVwKCZwcml2LT5jbWQuc2xhdmVfc2VtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWx4NF93YXJuKGRldiwgIkJhZCBjb21tIGNtZDolZCBmcm9tIHNsYXZlOiVkXG4iLCBjbWQsIHNsYXZlKTsKKwkJZ290byByZXNldF9zbGF2ZTsKKwl9CisJc3Bpbl9sb2NrKCZwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVfbG9jayk7CisJaWYgKCFzbGF2ZV9zdGF0ZVtzbGF2ZV0uaXNfc2xhdmVfZ29pbmdfZG93bikKKwkJc2xhdmVfc3RhdGVbc2xhdmVdLmxhc3RfY21kID0gY21kOworCWVsc2UKKwkJaXNfZ29pbmdfZG93biA9IDE7CisJc3Bpbl91bmxvY2soJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZV9sb2NrKTsKKwlpZiAoaXNfZ29pbmdfZG93bikgeworCQltbHg0X3dhcm4oZGV2LCAiU2xhdmUgaXMgZ29pbmcgZG93biBhYm9ydGluZyBjb21tYW5kKCVkKSIKKwkJCSAgIiBleGVjdXRpbmcgZnJvbSBzbGF2ZTolZFxuIiwKKwkJCSAgY21kLCBzbGF2ZSk7CisJCXJldHVybjsKKwl9CisJX19yYXdfd3JpdGVsKChfX2ZvcmNlIHUzMikgY3B1X3RvX2JlMzIocmVwbHkpLAorCQkgICAgICZwcml2LT5tZnVuYy5jb21tW3NsYXZlXS5zbGF2ZV9yZWFkKTsKKwltbWlvd2IoKTsKKworCXJldHVybjsKKworcmVzZXRfc2xhdmU6CisJLyogY2xlYW51cCBhbnkgc2xhdmUgcmVzb3VyY2VzICovCisJbWx4NF9kZWxldGVfYWxsX3Jlc291cmNlc19mb3Jfc2xhdmUoZGV2LCBzbGF2ZSk7CisJc3Bpbl9sb2NrKCZwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVfbG9jayk7CisJaWYgKCFzbGF2ZV9zdGF0ZVtzbGF2ZV0uaXNfc2xhdmVfZ29pbmdfZG93bikKKwkJc2xhdmVfc3RhdGVbc2xhdmVdLmxhc3RfY21kID0gTUxYNF9DT01NX0NNRF9SRVNFVDsKKwlzcGluX3VubG9jaygmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlX2xvY2spOworCS8qd2l0aCBzbGF2ZSBpbiB0aGUgbWlkZGxlIG9mIGZsciwgbm8gbmVlZCB0byBjbGVhbiByZXNvdXJjZXMgYWdhaW4uKi8KK2luZm9ybV9zbGF2ZV9zdGF0ZToKKwltZW1zZXQoJnNsYXZlX3N0YXRlW3NsYXZlXS5ldmVudF9lcSwgMCwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBtbHg0X3NsYXZlX2V2ZW50X2VxX2luZm8pKTsKKwlfX3Jhd193cml0ZWwoKF9fZm9yY2UgdTMyKSBjcHVfdG9fYmUzMihyZXBseSksCisJCSAgICAgJnByaXYtPm1mdW5jLmNvbW1bc2xhdmVdLnNsYXZlX3JlYWQpOworCXdtYigpOworfQorCisvKiBtYXN0ZXIgY29tbWFuZCBwcm9jZXNzaW5nICovCit2b2lkIG1seDRfbWFzdGVyX2NvbW1fY2hhbm5lbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1seDRfbWZ1bmNfbWFzdGVyX2N0eCAqbWFzdGVyID0KKwkJY29udGFpbmVyX29mKHdvcmssCisJCQkgICAgIHN0cnVjdCBtbHg0X21mdW5jX21hc3Rlcl9jdHgsCisJCQkgICAgIGNvbW1fd29yayk7CisJc3RydWN0IG1seDRfbWZ1bmMgKm1mdW5jID0KKwkJY29udGFpbmVyX29mKG1hc3Rlciwgc3RydWN0IG1seDRfbWZ1bmMsIG1hc3Rlcik7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9CisJCWNvbnRhaW5lcl9vZihtZnVuYywgc3RydWN0IG1seDRfcHJpdiwgbWZ1bmMpOworCXN0cnVjdCBtbHg0X2RldiAqZGV2ID0gJnByaXYtPmRldjsKKwlfX2JlMzIgKmJpdF92ZWM7CisJdTMyIGNvbW1fY21kOworCXUzMiB2ZWM7CisJaW50IGksIGosIHNsYXZlOworCWludCB0b2dnbGU7CisJaW50IHNlcnZlZCA9IDA7CisJaW50IHJlcG9ydGVkID0gMDsKKwl1MzIgc2x0OworCisJYml0X3ZlYyA9IG1hc3Rlci0+Y29tbV9hcm1fYml0X3ZlY3RvcjsKKwlmb3IgKGkgPSAwOyBpIDwgQ09NTV9DSEFOTkVMX0JJVF9BUlJBWV9TSVpFOyBpKyspIHsKKwkJdmVjID0gYmUzMl90b19jcHUoYml0X3ZlY1tpXSk7CisJCWZvciAoaiA9IDA7IGogPCAzMjsgaisrKSB7CisJCQlpZiAoISh2ZWMgJiAoMSA8PCBqKSkpCisJCQkJY29udGludWU7CisJCQkrK3JlcG9ydGVkOworCQkJc2xhdmUgPSAoaSAqIDMyKSArIGo7CisJCQljb21tX2NtZCA9IHN3YWIzMihyZWFkbCgKKwkJCQkJICAmbWZ1bmMtPmNvbW1bc2xhdmVdLnNsYXZlX3dyaXRlKSk7CisJCQlzbHQgPSBzd2FiMzIocmVhZGwoJm1mdW5jLT5jb21tW3NsYXZlXS5zbGF2ZV9yZWFkKSkKKwkJCQkgICAgID4+IDMxOworCQkJdG9nZ2xlID0gY29tbV9jbWQgPj4gMzE7CisJCQlpZiAodG9nZ2xlICE9IHNsdCkgeworCQkJCWlmIChtYXN0ZXItPnNsYXZlX3N0YXRlW3NsYXZlXS5jb21tX3RvZ2dsZQorCQkJCSAgICAhPSBzbHQpIHsKKwkJCQkJcHJpbnRrKEtFUk5fSU5GTyAic2xhdmUgJWQgb3V0IG9mIHN5bmMuIgorCQkJCQkgICAgICAgIiByZWFkIHRvZ2dsZSAlZCwgc3RhdGUgdG9nZ2xlICVkLiAiCisJCQkJCSAgICAgICAiUmVzeW5jaGluZy5cbiIsIHNsYXZlLCBzbHQsCisJCQkJCSAgICAgICBtYXN0ZXItPnNsYXZlX3N0YXRlW3NsYXZlXS5jb21tX3RvZ2dsZSk7CisJCQkJCW1hc3Rlci0+c2xhdmVfc3RhdGVbc2xhdmVdLmNvbW1fdG9nZ2xlID0KKwkJCQkJCXNsdDsKKwkJCQl9CisJCQkJbWx4NF9tYXN0ZXJfZG9fY21kKGRldiwgc2xhdmUsCisJCQkJCQkgICBjb21tX2NtZCA+PiAxNiAmIDB4ZmYsCisJCQkJCQkgICBjb21tX2NtZCAmIDB4ZmZmZiwgdG9nZ2xlKTsKKwkJCQkrK3NlcnZlZDsKKwkJCX0KKwkJfQorCX0KKworCWlmIChyZXBvcnRlZCAmJiByZXBvcnRlZCAhPSBzZXJ2ZWQpCisJCW1seDRfd2FybihkZXYsICJHb3QgY29tbWFuZCBldmVudCB3aXRoIGJpdG1hc2sgZnJvbSAlZCBzbGF2ZXMiCisJCQkgICIgYnV0ICVkIHdlcmUgc2VydmVkXG4iLAorCQkJICByZXBvcnRlZCwgc2VydmVkKTsKKworCWlmIChtbHg0X0FSTV9DT01NX0NIQU5ORUwoZGV2KSkKKwkJbWx4NF93YXJuKGRldiwgIkZhaWxlZCB0byBhcm0gY29tbSBjaGFubmVsIGV2ZW50c1xuIik7Cit9CisKK3N0YXRpYyBpbnQgc3luY190b2dnbGVzKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlpbnQgd3JfdG9nZ2xlOworCWludCByZF90b2dnbGU7CisJdW5zaWduZWQgbG9uZyBlbmQ7CisKKwl3cl90b2dnbGUgPSBzd2FiMzIocmVhZGwoJnByaXYtPm1mdW5jLmNvbW0tPnNsYXZlX3dyaXRlKSkgPj4gMzE7CisJZW5kID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoNTAwMCk7CisKKwl3aGlsZSAodGltZV9iZWZvcmUoamlmZmllcywgZW5kKSkgeworCQlyZF90b2dnbGUgPSBzd2FiMzIocmVhZGwoJnByaXYtPm1mdW5jLmNvbW0tPnNsYXZlX3JlYWQpKSA+PiAzMTsKKwkJaWYgKHJkX3RvZ2dsZSA9PSB3cl90b2dnbGUpIHsKKwkJCXByaXYtPmNtZC5jb21tX3RvZ2dsZSA9IHJkX3RvZ2dsZTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCisJLyoKKwkgKiB3ZSBjb3VsZCByZWFjaCBoZXJlIGlmIGZvciBleGFtcGxlIHRoZSBwcmV2aW91cyBWTSB1c2luZyB0aGlzCisJICogZnVuY3Rpb24gbWlzYmVoYXZlZCBhbmQgbGVmdCB0aGUgY2hhbm5lbCB3aXRoIHVuc3luY2VkIHN0YXRlLiBXZQorCSAqIHNob3VsZCBmaXggdGhpcyBoZXJlIGFuZCBnaXZlIHRoaXMgVk0gYSBjaGFuY2UgdG8gdXNlIGEgcHJvcGVybHkKKwkgKiBzeW5jZWQgY2hhbm5lbAorCSAqLworCW1seDRfd2FybihkZXYsICJyZWNvdmVyaW5nIGZyb20gcHJldmlvdXNseSBtaXMtYmVoYXZlZCBWTVxuIik7CisJX19yYXdfd3JpdGVsKChfX2ZvcmNlIHUzMikgMCwgJnByaXYtPm1mdW5jLmNvbW0tPnNsYXZlX3JlYWQpOworCV9fcmF3X3dyaXRlbCgoX19mb3JjZSB1MzIpIDAsICZwcml2LT5tZnVuYy5jb21tLT5zbGF2ZV93cml0ZSk7CisJcHJpdi0+Y21kLmNvbW1fdG9nZ2xlID0gMDsKKworCXJldHVybiAwOworfQorCitpbnQgbWx4NF9tdWx0aV9mdW5jX2luaXQoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3NsYXZlX3N0YXRlICpzX3N0YXRlOworCWludCBpLCBlcnIsIHBvcnQ7CisKKwlwcml2LT5tZnVuYy52aGNyID0gZG1hX2FsbG9jX2NvaGVyZW50KCYoZGV2LT5wZGV2LT5kZXYpLCBQQUdFX1NJWkUsCisJCQkJCSAgICAmcHJpdi0+bWZ1bmMudmhjcl9kbWEsCisJCQkJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYtPm1mdW5jLnZoY3IpIHsKKwkJbWx4NF9lcnIoZGV2LCAiQ291bGRuJ3QgYWxsb2NhdGUgdmhjci5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAobWx4NF9pc19tYXN0ZXIoZGV2KSkKKwkJcHJpdi0+bWZ1bmMuY29tbSA9CisJCWlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgcHJpdi0+ZncuY29tbV9iYXIpICsKKwkJCXByaXYtPmZ3LmNvbW1fYmFzZSwgTUxYNF9DT01NX1BBR0VTSVpFKTsKKwllbHNlCisJCXByaXYtPm1mdW5jLmNvbW0gPQorCQlpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDIpICsKKwkJCU1MWDRfU0xBVkVfQ09NTV9CQVNFLCBNTFg0X0NPTU1fUEFHRVNJWkUpOworCWlmICghcHJpdi0+bWZ1bmMuY29tbSkgeworCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBtYXAgY29tbXVuaWNhdGlvbiB2ZWN0b3IuXG4iKTsKKwkJZ290byBlcnJfdmhjcjsKKwl9CisKKwlpZiAobWx4NF9pc19tYXN0ZXIoZGV2KSkgeworCQlwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGUgPQorCQkJa3phbGxvYyhkZXYtPm51bV9zbGF2ZXMgKgorCQkJCXNpemVvZihzdHJ1Y3QgbWx4NF9zbGF2ZV9zdGF0ZSksIEdGUF9LRVJORUwpOworCQlpZiAoIXByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZSkKKwkJCWdvdG8gZXJyX2NvbW07CisKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3NsYXZlczsgKytpKSB7CisJCQlzX3N0YXRlID0gJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtpXTsKKwkJCXNfc3RhdGUtPmxhc3RfY21kID0gTUxYNF9DT01NX0NNRF9SRVNFVDsKKwkJCV9fcmF3X3dyaXRlbCgoX19mb3JjZSB1MzIpIDAsCisJCQkJICAgICAmcHJpdi0+bWZ1bmMuY29tbVtpXS5zbGF2ZV93cml0ZSk7CisJCQlfX3Jhd193cml0ZWwoKF9fZm9yY2UgdTMyKSAwLAorCQkJCSAgICAgJnByaXYtPm1mdW5jLmNvbW1baV0uc2xhdmVfcmVhZCk7CisJCQltbWlvd2IoKTsKKwkJCWZvciAocG9ydCA9IDE7IHBvcnQgPD0gTUxYNF9NQVhfUE9SVFM7IHBvcnQrKykgeworCQkJCXNfc3RhdGUtPnZsYW5fZmlsdGVyW3BvcnRdID0KKwkJCQkJa3phbGxvYyhzaXplb2Yoc3RydWN0IG1seDRfdmxhbl9mbHRyKSwKKwkJCQkJCUdGUF9LRVJORUwpOworCQkJCWlmICghc19zdGF0ZS0+dmxhbl9maWx0ZXJbcG9ydF0pIHsKKwkJCQkJaWYgKC0tcG9ydCkKKwkJCQkJCWtmcmVlKHNfc3RhdGUtPnZsYW5fZmlsdGVyW3BvcnRdKTsKKwkJCQkJZ290byBlcnJfc2xhdmVzOworCQkJCX0KKwkJCQlJTklUX0xJU1RfSEVBRCgmc19zdGF0ZS0+bWNhc3RfZmlsdGVyc1twb3J0XSk7CisJCQl9CisJCQlzcGluX2xvY2tfaW5pdCgmc19zdGF0ZS0+bG9jayk7CisJCX0KKworCQltZW1zZXQoJnByaXYtPm1mdW5jLm1hc3Rlci5jbWRfZXFlLCAwLCBzaXplb2Yoc3RydWN0IG1seDRfZXFlKSk7CisJCXByaXYtPm1mdW5jLm1hc3Rlci5jbWRfZXFlLnR5cGUgPSBNTFg0X0VWRU5UX1RZUEVfQ01EOworCQlJTklUX1dPUksoJnByaXYtPm1mdW5jLm1hc3Rlci5jb21tX3dvcmssCisJCQkgIG1seDRfbWFzdGVyX2NvbW1fY2hhbm5lbCk7CisJCUlOSVRfV09SSygmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX2V2ZW50X3dvcmssCisJCQkgIG1seDRfZ2VuX3NsYXZlX2VxZSk7CisJCUlOSVRfV09SSygmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX2Zscl9ldmVudF93b3JrLAorCQkJICBtbHg0X21hc3Rlcl9oYW5kbGVfc2xhdmVfZmxyKTsKKwkJc3Bpbl9sb2NrX2luaXQoJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZV9sb2NrKTsKKwkJcHJpdi0+bWZ1bmMubWFzdGVyLmNvbW1fd3EgPQorCQkJY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoIm1seDRfY29tbSIpOworCQlpZiAoIXByaXYtPm1mdW5jLm1hc3Rlci5jb21tX3dxKQorCQkJZ290byBlcnJfc2xhdmVzOworCisJCWlmIChtbHg0X2luaXRfcmVzb3VyY2VfdHJhY2tlcihkZXYpKQorCQkJZ290byBlcnJfdGhyZWFkOworCisJCXNlbWFfaW5pdCgmcHJpdi0+Y21kLnNsYXZlX3NlbSwgMSk7CisJCWVyciA9IG1seDRfQVJNX0NPTU1fQ0hBTk5FTChkZXYpOworCQlpZiAoZXJyKSB7CisJCQltbHg0X2VycihkZXYsICIgRmFpbGVkIHRvIGFybSBjb21tIGNoYW5uZWwgZXE6ICV4XG4iLAorCQkJCSBlcnIpOworCQkJZ290byBlcnJfcmVzb3VyY2U7CisJCX0KKworCX0gZWxzZSB7CisJCWVyciA9IHN5bmNfdG9nZ2xlcyhkZXYpOworCQlpZiAoZXJyKSB7CisJCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBzeW5jIHRvZ2dsZXNcbiIpOworCQkJZ290byBlcnJfY29tbTsKKwkJfQorCisJCXNlbWFfaW5pdCgmcHJpdi0+Y21kLnNsYXZlX3NlbSwgMSk7CisJfQorCXJldHVybiAwOworCitlcnJfcmVzb3VyY2U6CisJbWx4NF9mcmVlX3Jlc291cmNlX3RyYWNrZXIoZGV2KTsKK2Vycl90aHJlYWQ6CisJZmx1c2hfd29ya3F1ZXVlKHByaXYtPm1mdW5jLm1hc3Rlci5jb21tX3dxKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT5tZnVuYy5tYXN0ZXIuY29tbV93cSk7CitlcnJfc2xhdmVzOgorCXdoaWxlICgtLWkpIHsKKwkJZm9yIChwb3J0ID0gMTsgcG9ydCA8PSBNTFg0X01BWF9QT1JUUzsgcG9ydCsrKQorCQkJa2ZyZWUocHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW2ldLnZsYW5fZmlsdGVyW3BvcnRdKTsKKwl9CisJa2ZyZWUocHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlKTsKK2Vycl9jb21tOgorCWlvdW5tYXAocHJpdi0+bWZ1bmMuY29tbSk7CitlcnJfdmhjcjoKKwlkbWFfZnJlZV9jb2hlcmVudCgmKGRldi0+cGRldi0+ZGV2KSwgUEFHRV9TSVpFLAorCQkJCQkgICAgIHByaXYtPm1mdW5jLnZoY3IsCisJCQkJCSAgICAgcHJpdi0+bWZ1bmMudmhjcl9kbWEpOworCXByaXYtPm1mdW5jLnZoY3IgPSBOVUxMOworCXJldHVybiAtRU5PTUVNOworfQorCiBpbnQgbWx4NF9jbWRfaW5pdChzdHJ1Y3QgbWx4NF9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CkBAIC0zMzEsMjIgKzE1NzAsNTEgQEAKIAlwcml2LT5jbWQudXNlX2V2ZW50cyA9IDA7CiAJcHJpdi0+Y21kLnRvZ2dsZSAgICAgPSAxOwogCi0JcHJpdi0+Y21kLmhjciA9IGlvcmVtYXAocGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMCkgKyBNTFg0X0hDUl9CQVNFLAotCQkJCU1MWDRfSENSX1NJWkUpOwotCWlmICghcHJpdi0+Y21kLmhjcikgewotCQltbHg0X2VycihkZXYsICJDb3VsZG4ndCBtYXAgY29tbWFuZCByZWdpc3Rlci4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJcHJpdi0+Y21kLmhjciA9IE5VTEw7CisJcHJpdi0+bWZ1bmMudmhjciA9IE5VTEw7CisKKwlpZiAoIW1seDRfaXNfc2xhdmUoZGV2KSkgeworCQlwcml2LT5jbWQuaGNyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKSArCisJCQkJCU1MWDRfSENSX0JBU0UsIE1MWDRfSENSX1NJWkUpOworCQlpZiAoIXByaXYtPmNtZC5oY3IpIHsKKwkJCW1seDRfZXJyKGRldiwgIkNvdWxkbid0IG1hcCBjb21tYW5kIHJlZ2lzdGVyLlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCX0KIAogCXByaXYtPmNtZC5wb29sID0gcGNpX3Bvb2xfY3JlYXRlKCJtbHg0X2NtZCIsIGRldi0+cGRldiwKIAkJCQkJIE1MWDRfTUFJTEJPWF9TSVpFLAogCQkJCQkgTUxYNF9NQUlMQk9YX1NJWkUsIDApOwotCWlmICghcHJpdi0+Y21kLnBvb2wpIHsKLQkJaW91bm1hcChwcml2LT5jbWQuaGNyKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQorCWlmICghcHJpdi0+Y21kLnBvb2wpCisJCWdvdG8gZXJyX2hjcjsKIAogCXJldHVybiAwOworCitlcnJfaGNyOgorCWlmICghbWx4NF9pc19zbGF2ZShkZXYpKQorCQlpb3VubWFwKHByaXYtPmNtZC5oY3IpOworCXJldHVybiAtRU5PTUVNOworfQorCit2b2lkIG1seDRfbXVsdGlfZnVuY19jbGVhbnVwKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlpbnQgaSwgcG9ydDsKKworCWlmIChtbHg0X2lzX21hc3RlcihkZXYpKSB7CisJCWZsdXNoX3dvcmtxdWV1ZShwcml2LT5tZnVuYy5tYXN0ZXIuY29tbV93cSk7CisJCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPm1mdW5jLm1hc3Rlci5jb21tX3dxKTsKKwkJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3NsYXZlczsgaSsrKSB7CisJCQlmb3IgKHBvcnQgPSAxOyBwb3J0IDw9IE1MWDRfTUFYX1BPUlRTOyBwb3J0KyspCisJCQkJa2ZyZWUocHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW2ldLnZsYW5fZmlsdGVyW3BvcnRdKTsKKwkJfQorCQlrZnJlZShwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGUpOworCQlpb3VubWFwKHByaXYtPm1mdW5jLmNvbW0pOworCQlkbWFfZnJlZV9jb2hlcmVudCgmKGRldi0+cGRldi0+ZGV2KSwgUEFHRV9TSVpFLAorCQkJCQkJICAgICBwcml2LT5tZnVuYy52aGNyLAorCQkJCQkJICAgICBwcml2LT5tZnVuYy52aGNyX2RtYSk7CisJCXByaXYtPm1mdW5jLnZoY3IgPSBOVUxMOworCX0KIH0KIAogdm9pZCBtbHg0X2NtZF9jbGVhbnVwKHN0cnVjdCBtbHg0X2RldiAqZGV2KQpAQCAtMzU0LDcgKzE2MjIsOSBAQAogCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKIAogCXBjaV9wb29sX2Rlc3Ryb3kocHJpdi0+Y21kLnBvb2wpOwotCWlvdW5tYXAocHJpdi0+Y21kLmhjcik7CisKKwlpZiAoIW1seDRfaXNfc2xhdmUoZGV2KSkKKwkJaW91bm1hcChwcml2LT5jbWQuaGNyKTsKIH0KIAogLyoKQEAgLTM2NSw2ICsxNjM1LDcgQEAKIHsKIAlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CiAJaW50IGk7CisJaW50IGVyciA9IDA7CiAKIAlwcml2LT5jbWQuY29udGV4dCA9IGttYWxsb2MocHJpdi0+Y21kLm1heF9jbWRzICoKIAkJCQkgICBzaXplb2YgKHN0cnVjdCBtbHg0X2NtZF9jb250ZXh0KSwKQEAgLTM4OSwxMSArMTY2MCwxMCBAQAogCQk7IC8qIG5vdGhpbmcgKi8KIAktLXByaXYtPmNtZC50b2tlbl9tYXNrOwogCisJZG93bigmcHJpdi0+Y21kLnBvbGxfc2VtKTsKIAlwcml2LT5jbWQudXNlX2V2ZW50cyA9IDE7CiAKLQlkb3duKCZwcml2LT5jbWQucG9sbF9zZW0pOwotCi0JcmV0dXJuIDA7CisJcmV0dXJuIGVycjsKIH0KIAogLyoKQEAgLTQzMyw3ICsxNzAzLDggQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfYWxsb2NfY21kX21haWxib3gpOwogCi12b2lkIG1seDRfZnJlZV9jbWRfbWFpbGJveChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3gpCit2b2lkIG1seDRfZnJlZV9jbWRfbWFpbGJveChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94KQogewogCWlmICghbWFpbGJveCkKIAkJcmV0dXJuOwpAQCAtNDQyLDMgKzE3MTMsOCBAQAogCWtmcmVlKG1haWxib3gpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9mcmVlX2NtZF9tYWlsYm94KTsKKwordTMyIG1seDRfY29tbV9nZXRfdmVyc2lvbih2b2lkKQoreworCSByZXR1cm4gKCh1MzIpIENNRF9DSEFOX0lGX1JFViA8PCA4KSB8ICh1MzIpIENNRF9DSEFOX1ZFUjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY3EuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvY3EuYwppbmRleCA0OTlhNTE2Li40NzVmOWQ2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2NxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9jcS5jCkBAIC0zNCw5ICszNCw5IEBACiAgKiBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21seDQvY21kLmg+CiAjaW5jbHVkZSA8bGludXgvbWx4NC9jcS5oPgpAQCAtNDQsMjcgKzQ0LDYgQEAKICNpbmNsdWRlICJtbHg0LmgiCiAjaW5jbHVkZSAiaWNtLmgiCiAKLXN0cnVjdCBtbHg0X2NxX2NvbnRleHQgewotCV9fYmUzMgkJCWZsYWdzOwotCXUxNgkJCXJlc2VydmVkMVszXTsKLQlfX2JlMTYJCQlwYWdlX29mZnNldDsKLQlfX2JlMzIJCQlsb2dzaXplX3VzcnBhZ2U7Ci0JX19iZTE2CQkJY3FfcGVyaW9kOwotCV9fYmUxNgkJCWNxX21heF9jb3VudDsKLQl1OAkJCXJlc2VydmVkMlszXTsKLQl1OAkJCWNvbXBfZXFuOwotCXU4CQkJbG9nX3BhZ2Vfc2l6ZTsKLQl1OAkJCXJlc2VydmVkM1syXTsKLQl1OAkJCW10dF9iYXNlX2FkZHJfaDsKLQlfX2JlMzIJCQltdHRfYmFzZV9hZGRyX2w7Ci0JX19iZTMyCQkJbGFzdF9ub3RpZmllZF9pbmRleDsKLQlfX2JlMzIJCQlzb2xpY2l0X3Byb2R1Y2VyX2luZGV4OwotCV9fYmUzMgkJCWNvbnN1bWVyX2luZGV4OwotCV9fYmUzMgkJCXByb2R1Y2VyX2luZGV4OwotCXUzMgkJCXJlc2VydmVkNFsyXTsKLQlfX2JlNjQJCQlkYl9yZWNfYWRkcjsKLX07Ci0KICNkZWZpbmUgTUxYNF9DUV9TVEFUVVNfT0sJCSggMCA8PCAyOCkKICNkZWZpbmUgTUxYNF9DUV9TVEFUVVNfT1ZFUkZMT1cJCSggOSA8PCAyOCkKICNkZWZpbmUgTUxYNF9DUV9TVEFUVVNfV1JJVEVfRkFJTAkoMTAgPDwgMjgpCkBAIC04MSw3ICs2MCw3IEBACiAJY3EgPSByYWRpeF90cmVlX2xvb2t1cCgmbWx4NF9wcml2KGRldiktPmNxX3RhYmxlLnRyZWUsCiAJCQkgICAgICAgY3FuICYgKGRldi0+Y2Fwcy5udW1fY3FzIC0gMSkpOwogCWlmICghY3EpIHsKLQkJbWx4NF93YXJuKGRldiwgIkNvbXBsZXRpb24gZXZlbnQgZm9yIGJvZ3VzIENRICUwOHhcbiIsIGNxbik7CisJCW1seDRfZGJnKGRldiwgIkNvbXBsZXRpb24gZXZlbnQgZm9yIGJvZ3VzIENRICUwOHhcbiIsIGNxbik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTExNywyMyArOTYsMjQgQEAKIHN0YXRpYyBpbnQgbWx4NF9TVzJIV19DUShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3gsCiAJCQkgaW50IGNxX251bSkKIHsKLQlyZXR1cm4gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGNxX251bSwgMCwgTUxYNF9DTURfU1cySFdfQ1EsCi0JCQlNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCXJldHVybiBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSB8IGRldi0+Y2Fwcy5mdW5jdGlvbiwgY3FfbnVtLCAwLAorCQkJTUxYNF9DTURfU1cySFdfQ1EsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCU1MWDRfQ01EX1dSQVBQRUQpOwogfQogCiBzdGF0aWMgaW50IG1seDRfTU9ESUZZX0NRKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveCwKIAkJCSBpbnQgY3FfbnVtLCB1MzIgb3Btb2QpCiB7CiAJcmV0dXJuIG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBjcV9udW0sIG9wbW9kLCBNTFg0X0NNRF9NT0RJRllfQ1EsCi0JCQlNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCQkJTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9XUkFQUEVEKTsKIH0KIAogc3RhdGljIGludCBtbHg0X0hXMlNXX0NRKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveCwKIAkJCSBpbnQgY3FfbnVtKQogewotCXJldHVybiBtbHg0X2NtZF9ib3goZGV2LCAwLCBtYWlsYm94ID8gbWFpbGJveC0+ZG1hIDogMCwgY3FfbnVtLAotCQkJICAgIG1haWxib3ggPyAwIDogMSwgTUxYNF9DTURfSFcyU1dfQ1EsCi0JCQkgICAgTUxYNF9DTURfVElNRV9DTEFTU19BKTsKKwlyZXR1cm4gbWx4NF9jbWRfYm94KGRldiwgZGV2LT5jYXBzLmZ1bmN0aW9uLCBtYWlsYm94ID8gbWFpbGJveC0+ZG1hIDogMCwKKwkJCSAgICBjcV9udW0sIG1haWxib3ggPyAwIDogMSwgTUxYNF9DTURfSFcyU1dfQ1EsCisJCQkgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9XUkFQUEVEKTsKIH0KIAogaW50IG1seDRfY3FfbW9kaWZ5KHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9jcSAqY3EsCkBAIC0xODgsNiArMTY4LDc4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X2NxX3Jlc2l6ZSk7CiAKK2ludCBfX21seDRfY3FfYWxsb2NfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgKmNxbikKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfY3FfdGFibGUgKmNxX3RhYmxlID0gJnByaXYtPmNxX3RhYmxlOworCWludCBlcnI7CisKKwkqY3FuID0gbWx4NF9iaXRtYXBfYWxsb2MoJmNxX3RhYmxlLT5iaXRtYXApOworCWlmICgqY3FuID09IC0xKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IG1seDRfdGFibGVfZ2V0KGRldiwgJmNxX3RhYmxlLT50YWJsZSwgKmNxbik7CisJaWYgKGVycikKKwkJZ290byBlcnJfb3V0OworCisJZXJyID0gbWx4NF90YWJsZV9nZXQoZGV2LCAmY3FfdGFibGUtPmNtcHRfdGFibGUsICpjcW4pOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3B1dDsKKwlyZXR1cm4gMDsKKworZXJyX3B1dDoKKwltbHg0X3RhYmxlX3B1dChkZXYsICZjcV90YWJsZS0+dGFibGUsICpjcW4pOworCitlcnJfb3V0OgorCW1seDRfYml0bWFwX2ZyZWUoJmNxX3RhYmxlLT5iaXRtYXAsICpjcW4pOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbWx4NF9jcV9hbGxvY19pY20oc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCAqY3FuKQoreworCXU2NCBvdXRfcGFyYW07CisJaW50IGVycjsKKworCWlmIChtbHg0X2lzX21mdW5jKGRldikpIHsKKwkJZXJyID0gbWx4NF9jbWRfaW1tKGRldiwgMCwgJm91dF9wYXJhbSwgUkVTX0NRLAorCQkJCSAgIFJFU19PUF9SRVNFUlZFX0FORF9NQVAsIE1MWDRfQ01EX0FMTE9DX1JFUywKKwkJCQkgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EsIE1MWDRfQ01EX1dSQVBQRUQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwkJZWxzZSB7CisJCQkqY3FuID0gZ2V0X3BhcmFtX2woJm91dF9wYXJhbSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gX19tbHg0X2NxX2FsbG9jX2ljbShkZXYsIGNxbik7Cit9CisKK3ZvaWQgX19tbHg0X2NxX2ZyZWVfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgY3FuKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9jcV90YWJsZSAqY3FfdGFibGUgPSAmcHJpdi0+Y3FfdGFibGU7CisKKwltbHg0X3RhYmxlX3B1dChkZXYsICZjcV90YWJsZS0+Y21wdF90YWJsZSwgY3FuKTsKKwltbHg0X3RhYmxlX3B1dChkZXYsICZjcV90YWJsZS0+dGFibGUsIGNxbik7CisJbWx4NF9iaXRtYXBfZnJlZSgmY3FfdGFibGUtPmJpdG1hcCwgY3FuKTsKK30KKworc3RhdGljIHZvaWQgbWx4NF9jcV9mcmVlX2ljbShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IGNxbikKK3sKKwl1NjQgaW5fcGFyYW07CisJaW50IGVycjsKKworCWlmIChtbHg0X2lzX21mdW5jKGRldikpIHsKKwkJc2V0X3BhcmFtX2woJmluX3BhcmFtLCBjcW4pOworCQllcnIgPSBtbHg0X2NtZChkZXYsIGluX3BhcmFtLCBSRVNfQ1EsIFJFU19PUF9SRVNFUlZFX0FORF9NQVAsCisJCQkgICAgICAgTUxYNF9DTURfRlJFRV9SRVMsCisJCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9XUkFQUEVEKTsKKwkJaWYgKGVycikKKwkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgZnJlZWluZyBjcTolZFxuIiwgY3FuKTsKKwl9IGVsc2UKKwkJX19tbHg0X2NxX2ZyZWVfaWNtKGRldiwgY3FuKTsKK30KKwogaW50IG1seDRfY3FfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBuZW50LCBzdHJ1Y3QgbWx4NF9tdHQgKm10dCwKIAkJICBzdHJ1Y3QgbWx4NF91YXIgKnVhciwgdTY0IGRiX3JlYywgc3RydWN0IG1seDRfY3EgKmNxLAogCQkgIHVuc2lnbmVkIHZlY3RvciwgaW50IGNvbGxhcHNlZCkKQEAgLTIwNCwyMyArMjU2LDE1IEBACiAKIAljcS0+dmVjdG9yID0gdmVjdG9yOwogCi0JY3EtPmNxbiA9IG1seDRfYml0bWFwX2FsbG9jKCZjcV90YWJsZS0+Yml0bWFwKTsKLQlpZiAoY3EtPmNxbiA9PSAtMSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQllcnIgPSBtbHg0X3RhYmxlX2dldChkZXYsICZjcV90YWJsZS0+dGFibGUsIGNxLT5jcW4pOworCWVyciA9IG1seDRfY3FfYWxsb2NfaWNtKGRldiwgJmNxLT5jcW4pOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dDsKLQotCWVyciA9IG1seDRfdGFibGVfZ2V0KGRldiwgJmNxX3RhYmxlLT5jbXB0X3RhYmxlLCBjcS0+Y3FuKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9wdXQ7CisJCXJldHVybiBlcnI7CiAKIAlzcGluX2xvY2tfaXJxKCZjcV90YWJsZS0+bG9jayk7CiAJZXJyID0gcmFkaXhfdHJlZV9pbnNlcnQoJmNxX3RhYmxlLT50cmVlLCBjcS0+Y3FuLCBjcSk7CiAJc3Bpbl91bmxvY2tfaXJxKCZjcV90YWJsZS0+bG9jayk7CiAJaWYgKGVycikKLQkJZ290byBlcnJfY21wdF9wdXQ7CisJCWdvdG8gZXJyX2ljbTsKIAogCW1haWxib3ggPSBtbHg0X2FsbG9jX2NtZF9tYWlsYm94KGRldik7CiAJaWYgKElTX0VSUihtYWlsYm94KSkgewpAQCAtMjU5LDE0ICszMDMsOCBAQAogCXJhZGl4X3RyZWVfZGVsZXRlKCZjcV90YWJsZS0+dHJlZSwgY3EtPmNxbik7CiAJc3Bpbl91bmxvY2tfaXJxKCZjcV90YWJsZS0+bG9jayk7CiAKLWVycl9jbXB0X3B1dDoKLQltbHg0X3RhYmxlX3B1dChkZXYsICZjcV90YWJsZS0+Y21wdF90YWJsZSwgY3EtPmNxbik7Ci0KLWVycl9wdXQ6Ci0JbWx4NF90YWJsZV9wdXQoZGV2LCAmY3FfdGFibGUtPnRhYmxlLCBjcS0+Y3FuKTsKLQotZXJyX291dDoKLQltbHg0X2JpdG1hcF9mcmVlKCZjcV90YWJsZS0+Yml0bWFwLCBjcS0+Y3FuKTsKK2Vycl9pY206CisJbWx4NF9jcV9mcmVlX2ljbShkZXYsIGNxLT5jcW4pOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTI5Miw4ICszMzAsNyBAQAogCQljb21wbGV0ZSgmY3EtPmZyZWUpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNxLT5mcmVlKTsKIAotCW1seDRfdGFibGVfcHV0KGRldiwgJmNxX3RhYmxlLT50YWJsZSwgY3EtPmNxbik7Ci0JbWx4NF9iaXRtYXBfZnJlZSgmY3FfdGFibGUtPmJpdG1hcCwgY3EtPmNxbik7CisJbWx4NF9jcV9mcmVlX2ljbShkZXYsIGNxLT5jcW4pOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9jcV9mcmVlKTsKIApAQCAtMzA0LDYgKzM0MSw4IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmY3FfdGFibGUtPmxvY2spOwogCUlOSVRfUkFESVhfVFJFRSgmY3FfdGFibGUtPnRyZWUsIEdGUF9BVE9NSUMpOworCWlmIChtbHg0X2lzX3NsYXZlKGRldikpCisJCXJldHVybiAwOwogCiAJZXJyID0gbWx4NF9iaXRtYXBfaW5pdCgmY3FfdGFibGUtPmJpdG1hcCwgZGV2LT5jYXBzLm51bV9jcXMsCiAJCQkgICAgICAgZGV2LT5jYXBzLm51bV9jcXMgLSAxLCBkZXYtPmNhcHMucmVzZXJ2ZWRfY3FzLCAwKTsKQEAgLTMxNSw2ICszNTQsOCBAQAogCiB2b2lkIG1seDRfY2xlYW51cF9jcV90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldikKIHsKKwlpZiAobWx4NF9pc19zbGF2ZShkZXYpKQorCQlyZXR1cm47CiAJLyogTm90aGluZyB0byBkbyB0byBjbGVhbiB1cCByYWRpeF90cmVlICovCiAJbWx4NF9iaXRtYXBfY2xlYW51cCgmbWx4NF9wcml2KGRldiktPmNxX3RhYmxlLmJpdG1hcCk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2NxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2NxLmMKaW5kZXggMjI3OTk3ZC4uMDBiODEyNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9jcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fY3EuYwpAQCAtNTEsMTAgKzUxLDcgQEAKIAlpbnQgZXJyOwogCiAJY3EtPnNpemUgPSBlbnRyaWVzOwotCWlmIChtb2RlID09IFJYKQotCQljcS0+YnVmX3NpemUgPSBjcS0+c2l6ZSAqIHNpemVvZihzdHJ1Y3QgbWx4NF9jcWUpOwotCWVsc2UKLQkJY3EtPmJ1Zl9zaXplID0gc2l6ZW9mKHN0cnVjdCBtbHg0X2NxZSk7CisJY3EtPmJ1Zl9zaXplID0gY3EtPnNpemUgKiBzaXplb2Yoc3RydWN0IG1seDRfY3FlKTsKIAogCWNxLT5yaW5nID0gcmluZzsKIAljcS0+aXNfdHggPSBtb2RlOwpAQCAtMTIwLDcgKzExNyw3IEBACiAJCWNxLT5zaXplID0gcHJpdi0+cnhfcmluZ1tjcS0+cmluZ10uYWN0dWFsX3NpemU7CiAKIAllcnIgPSBtbHg0X2NxX2FsbG9jKG1kZXYtPmRldiwgY3EtPnNpemUsICZjcS0+d3FyZXMubXR0LCAmbWRldi0+cHJpdl91YXIsCi0JCQkgICAgY3EtPndxcmVzLmRiLmRtYSwgJmNxLT5tY3EsIGNxLT52ZWN0b3IsIGNxLT5pc190eCk7CisJCQkgICAgY3EtPndxcmVzLmRiLmRtYSwgJmNxLT5tY3EsIGNxLT52ZWN0b3IsIDApOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTE0Nyw2ICsxNDQsNyBAQAogCW1seDRfZnJlZV9od3FfcmVzKG1kZXYtPmRldiwgJmNxLT53cXJlcywgY3EtPmJ1Zl9zaXplKTsKIAlpZiAocHJpdi0+bWRldi0+ZGV2LT5jYXBzLmNvbXBfcG9vbCAmJiBjcS0+dmVjdG9yKQogCQltbHg0X3JlbGVhc2VfZXEocHJpdi0+bWRldi0+ZGV2LCBjcS0+dmVjdG9yKTsKKwljcS0+dmVjdG9yID0gMDsKIAljcS0+YnVmX3NpemUgPSAwOwogCWNxLT5idWYgPSBOVUxMOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2V0aHRvb2wuYwppbmRleCA3NGUyYTJhLi43ZGJjNmEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX2V0aHRvb2wuYwpAQCAtNDUsMTMgKzQ1LDE2IEBACiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKIAotCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgMzIpOwotCXN0cm5jcHkoZHJ2aW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04gIiAoIiBEUlZfUkVMREFURSAiKSIsIDMyKTsKLQlzcHJpbnRmKGRydmluZm8tPmZ3X3ZlcnNpb24sICIlZC4lZC4lZCIsCisJc3RybGNweShkcnZpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShkcnZpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiAiICgiIERSVl9SRUxEQVRFICIpIiwKKwkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlzbnByaW50ZihkcnZpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbiksCisJCSIlZC4lZC4lZCIsCiAJCSh1MTYpIChtZGV2LT5kZXYtPmNhcHMuZndfdmVyID4+IDMyKSwKIAkJKHUxNikgKChtZGV2LT5kZXYtPmNhcHMuZndfdmVyID4+IDE2KSAmIDB4ZmZmZiksCiAJCSh1MTYpIChtZGV2LT5kZXYtPmNhcHMuZndfdmVyICYgMHhmZmZmKSk7Ci0Jc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobWRldi0+ZGV2LT5wZGV2KSwgMzIpOworCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG1kZXYtPmRldi0+cGRldiksCisJCXNpemVvZihkcnZpbmZvLT5idXNfaW5mbykpOwogCWRydmluZm8tPm5fc3RhdHMgPSAwOwogCWRydmluZm8tPnJlZ2R1bXBfbGVuID0gMDsKIAlkcnZpbmZvLT5lZWR1bXBfbGVuID0gMDsKQEAgLTEwMyw4ICsxMDYsMTcgQEAKIAlzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlpbnQgZXJyID0gMDsKIAl1NjQgY29uZmlnID0gMDsKKwl1NjQgbWFzazsKIAotCWlmICghKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1dPTCkpIHsKKwlpZiAoKHByaXYtPnBvcnQgPCAxKSB8fCAocHJpdi0+cG9ydCA+IDIpKSB7CisJCWVuX2Vycihwcml2LCAiRmFpbGVkIHRvIGdldCBXb0wgaW5mb3JtYXRpb25cbiIpOworCQlyZXR1cm47CisJfQorCisJbWFzayA9IChwcml2LT5wb3J0ID09IDEpID8gTUxYNF9ERVZfQ0FQX0ZMQUdfV09MX1BPUlQxIDoKKwkJTUxYNF9ERVZfQ0FQX0ZMQUdfV09MX1BPUlQyOworCisJaWYgKCEocHJpdi0+bWRldi0+ZGV2LT5jYXBzLmZsYWdzICYgbWFzaykpIHsKIAkJd29sLT5zdXBwb3J0ZWQgPSAwOwogCQl3b2wtPndvbG9wdHMgPSAwOwogCQlyZXR1cm47CkBAIC0xMzMsOCArMTQ1LDE1IEBACiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdTY0IGNvbmZpZyA9IDA7CiAJaW50IGVyciA9IDA7CisJdTY0IG1hc2s7CiAKLQlpZiAoIShwcml2LT5tZGV2LT5kZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19XT0wpKQorCWlmICgocHJpdi0+cG9ydCA8IDEpIHx8IChwcml2LT5wb3J0ID4gMikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCW1hc2sgPSAocHJpdi0+cG9ydCA9PSAxKSA/IE1MWDRfREVWX0NBUF9GTEFHX1dPTF9QT1JUMSA6CisJCU1MWDRfREVWX0NBUF9GTEFHX1dPTF9QT1JUMjsKKworCWlmICghKHByaXYtPm1kZXYtPmRldi0+Y2Fwcy5mbGFncyAmIG1hc2spKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAod29sLT5zdXBwb3J0ZWQgJiB+V0FLRV9NQUdJQykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbmV0ZGV2LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX25ldGRldi5jCmluZGV4IDc4ZDc3NmIuLjcyZmE4MDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fbmV0ZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9uZXRkZXYuYwpAQCAtNDUsNyArNDUsNyBAQAogI2luY2x1ZGUgIm1seDRfZW4uaCIKICNpbmNsdWRlICJlbl9wb3J0LmgiCiAKLXN0YXRpYyB2b2lkIG1seDRfZW5fdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3N0YXRpYyBpbnQgbWx4NF9lbl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQogewogCXN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBtbHg0X2VuX2RldiAqbWRldiA9IHByaXYtPm1kZXY7CkBAIC02Nyw5ICs2NywxMCBAQAogCQllbl9lcnIocHJpdiwgImZhaWxlZCBhZGRpbmcgdmxhbiAlZFxuIiwgdmlkKTsKIAltdXRleF91bmxvY2soJm1kZXYtPnN0YXRlX2xvY2spOwogCisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1seDRfZW5fdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCitzdGF0aWMgaW50IG1seDRfZW5fdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKQEAgLTkzLDYgKzk0LDggQEAKIAkJCWVuX2Vycihwcml2LCAiRmFpbGVkIGNvbmZpZ3VyaW5nIFZMQU4gZmlsdGVyXG4iKTsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZtZGV2LT5zdGF0ZV9sb2NrKTsKKworCXJldHVybiAwOwogfQogCiB1NjQgbWx4NF9lbl9tYWNfdG9fdTY0KHU4ICphZGRyKQpAQCAtMTMzLDcgKzEzNiw3IEBACiAJaWYgKHByaXYtPnBvcnRfdXApIHsKIAkJLyogUmVtb3ZlIG9sZCBNQUMgYW5kIGluc2VydCB0aGUgbmV3IG9uZSAqLwogCQllcnIgPSBtbHg0X3JlcGxhY2VfbWFjKG1kZXYtPmRldiwgcHJpdi0+cG9ydCwKLQkJCQkgICAgICAgcHJpdi0+YmFzZV9xcG4sIHByaXYtPm1hYywgMCk7CisJCQkJICAgICAgIHByaXYtPmJhc2VfcXBuLCBwcml2LT5tYWMpOwogCQlpZiAoZXJyKQogCQkJZW5fZXJyKHByaXYsICJGYWlsZWQgY2hhbmdpbmcgSFcgTUFDIGFkZHJlc3NcbiIpOwogCX0gZWxzZQpAQCAtMTQ4LDYgKzE1MSw3IEBACiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKIAlrZnJlZShwcml2LT5tY19hZGRycyk7CisJcHJpdi0+bWNfYWRkcnMgPSBOVUxMOwogCXByaXYtPm1jX2FkZHJzX2NudCA9IDA7CiB9CiAKQEAgLTE2Nyw2ICsxNzEsNyBAQAogCWkgPSAwOwogCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCiAJCW1lbWNweShtY19hZGRycyArIGkrKyAqIEVUSF9BTEVOLCBoYS0+YWRkciwgRVRIX0FMRU4pOworCW1seDRfZW5fY2xlYXJfbGlzdChkZXYpOwogCXByaXYtPm1jX2FkZHJzID0gbWNfYWRkcnM7CiAJcHJpdi0+bWNfYWRkcnNfY250ID0gbWNfYWRkcnNfY250OwogfQpAQCAtMjA0LDYgKzIwOSwxNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKKwlpZiAoIW5ldGlmX2NhcnJpZXJfb2soZGV2KSkgeworCQlpZiAoIW1seDRfZW5fUVVFUllfUE9SVChtZGV2LCBwcml2LT5wb3J0KSkgeworCQkJaWYgKHByaXYtPnBvcnRfc3RhdGUubGlua19zdGF0ZSkgeworCQkJCXByaXYtPmxhc3RfbGlua19zdGF0ZSA9IE1MWDRfREVWX0VWRU5UX1BPUlRfVVA7CisJCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQkJCWVuX2RiZyhMSU5LLCBwcml2LCAiTGluayBVcFxuIik7CisJCQl9CisJCX0KKwl9CisKIAkvKgogCSAqIFByb21zaWN1b3VzIG1vZGU6IGRpc2FibGUgYWxsIGZpbHRlcnMKIAkgKi8KQEAgLTU5OSwxMiArNjE0LDEyIEBACiAJCSsrcnhfaW5kZXg7CiAJfQogCi0JLyogU2V0IHBvcnQgbWFjIG51bWJlciAqLwotCWVuX2RiZyhEUlYsIHByaXYsICJTZXR0aW5nIG1hYyBmb3IgcG9ydCAlZFxuIiwgcHJpdi0+cG9ydCk7Ci0JZXJyID0gbWx4NF9yZWdpc3Rlcl9tYWMobWRldi0+ZGV2LCBwcml2LT5wb3J0LAotCQkJCXByaXYtPm1hYywgJnByaXYtPmJhc2VfcXBuLCAwKTsKKwkvKiBTZXQgcXAgbnVtYmVyICovCisJZW5fZGJnKERSViwgcHJpdiwgIkdldHRpbmcgcXAgbnVtYmVyIGZvciBwb3J0ICVkXG4iLCBwcml2LT5wb3J0KTsKKwllcnIgPSBtbHg0X2dldF9ldGhfcXAobWRldi0+ZGV2LCBwcml2LT5wb3J0LAorCQkJCXByaXYtPm1hYywgJnByaXYtPmJhc2VfcXBuKTsKIAlpZiAoZXJyKSB7Ci0JCWVuX2Vycihwcml2LCAiRmFpbGVkIHNldHRpbmcgcG9ydCBtYWNcbiIpOworCQllbl9lcnIocHJpdiwgIkZhaWxlZCBnZXR0aW5nIGV0aCBxcFxuIik7CiAJCWdvdG8gY3FfZXJyOwogCX0KIAltZGV2LT5tYWNfcmVtb3ZlZFtwcml2LT5wb3J0XSA9IDA7CkBAIC02OTksNyArNzE0LDcgQEAKIAogCW1seDRfZW5fcmVsZWFzZV9yc3Nfc3RlZXIocHJpdik7CiBtYWNfZXJyOgotCW1seDRfdW5yZWdpc3Rlcl9tYWMobWRldi0+ZGV2LCBwcml2LT5wb3J0LCBwcml2LT5iYXNlX3Fwbik7CisJbWx4NF9wdXRfZXRoX3FwKG1kZXYtPmRldiwgcHJpdi0+cG9ydCwgcHJpdi0+bWFjLCBwcml2LT5iYXNlX3Fwbik7CiBjcV9lcnI6CiAJd2hpbGUgKHJ4X2luZGV4LS0pCiAJCW1seDRfZW5fZGVhY3RpdmF0ZV9jcShwcml2LCAmcHJpdi0+cnhfY3FbcnhfaW5kZXhdKTsKQEAgLTc0NSwxMCArNzYwLDYgQEAKIAkvKiBGbHVzaCBtdWx0aWNhc3QgZmlsdGVyICovCiAJbWx4NF9TRVRfTUNBU1RfRkxUUihtZGV2LT5kZXYsIHByaXYtPnBvcnQsIDAsIDEsIE1MWDRfTUNBU1RfQ09ORklHKTsKIAotCS8qIFVucmVnaXN0ZXIgTWFjIGFkZHJlc3MgZm9yIHRoZSBwb3J0ICovCi0JbWx4NF91bnJlZ2lzdGVyX21hYyhtZGV2LT5kZXYsIHByaXYtPnBvcnQsIHByaXYtPmJhc2VfcXBuKTsKLQltZGV2LT5tYWNfcmVtb3ZlZFtwcml2LT5wb3J0XSA9IDE7Ci0KIAkvKiBGcmVlIFRYIFJpbmdzICovCiAJZm9yIChpID0gMDsgaSA8IHByaXYtPnR4X3JpbmdfbnVtOyBpKyspIHsKIAkJbWx4NF9lbl9kZWFjdGl2YXRlX3R4X3JpbmcocHJpdiwgJnByaXYtPnR4X3JpbmdbaV0pOwpAQCAtNzYyLDYgKzc3MywxMCBAQAogCS8qIEZyZWUgUlNTIHFwcyAqLwogCW1seDRfZW5fcmVsZWFzZV9yc3Nfc3RlZXIocHJpdik7CiAKKwkvKiBVbnJlZ2lzdGVyIE1hYyBhZGRyZXNzIGZvciB0aGUgcG9ydCAqLworCW1seDRfcHV0X2V0aF9xcChtZGV2LT5kZXYsIHByaXYtPnBvcnQsIHByaXYtPm1hYywgcHJpdi0+YmFzZV9xcG4pOworCW1kZXYtPm1hY19yZW1vdmVkW3ByaXYtPnBvcnRdID0gMTsKKwogCS8qIEZyZWUgUlggUmluZ3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+cnhfcmluZ19udW07IGkrKykgewogCQltbHg0X2VuX2RlYWN0aXZhdGVfcnhfcmluZyhwcml2LCAmcHJpdi0+cnhfcmluZ1tpXSk7CkBAIC05NzQsNiArOTg5LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbWx4NF9lbl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCit7CisJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX0xPT1BCQUNLKQorCQlwcml2LT5jdHJsX2ZsYWdzIHw9IGNwdV90b19iZTMyKE1MWDRfV1FFX0NUUkxfRk9SQ0VfTE9PUEJBQ0spOworCWVsc2UKKwkJcHJpdi0+Y3RybF9mbGFncyAmPQorCQkJY3B1X3RvX2JlMzIofk1MWDRfV1FFX0NUUkxfRk9SQ0VfTE9PUEJBQ0spOworCisJcmV0dXJuIDA7CisKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBtbHg0X25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQk9IG1seDRfZW5fb3BlbiwKIAkubmRvX3N0b3AJCT0gbWx4NF9lbl9jbG9zZSwKQEAgLTk5MCw2ICsxMDIwLDcgQEAKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gbWx4NF9lbl9uZXRwb2xsLAogI2VuZGlmCisJLm5kb19zZXRfZmVhdHVyZXMJPSBtbHg0X2VuX3NldF9mZWF0dXJlcywKIH07CiAKIGludCBtbHg0X2VuX2luaXRfbmV0ZGV2KHN0cnVjdCBtbHg0X2VuX2RldiAqbWRldiwgaW50IHBvcnQsCkBAIC0xMDIyLDYgKzEwNTMsOCBAQAogCXByaXYtPnBvcnQgPSBwb3J0OwogCXByaXYtPnBvcnRfdXAgPSBmYWxzZTsKIAlwcml2LT5mbGFncyA9IHByb2YtPmZsYWdzOworCXByaXYtPmN0cmxfZmxhZ3MgPSBjcHVfdG9fYmUzMihNTFg0X1dRRV9DVFJMX0NRX1VQREFURSB8CisJCQlNTFg0X1dRRV9DVFJMX1NPTElDSVRFRCk7CiAJcHJpdi0+dHhfcmluZ19udW0gPSBwcm9mLT50eF9yaW5nX251bTsKIAlwcml2LT5yeF9yaW5nX251bSA9IHByb2YtPnJ4X3JpbmdfbnVtOwogCXByaXYtPm1hY19pbmRleCA9IC0xOwpAQCAtMTA4OCw2ICsxMTIxLDcgQEAKIAlkZXYtPmZlYXR1cmVzID0gZGV2LT5od19mZWF0dXJlcyB8IE5FVElGX0ZfSElHSERNQSB8CiAJCQlORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX0hXX1ZMQU5fUlggfAogCQkJTkVUSUZfRl9IV19WTEFOX0ZJTFRFUjsKKwlkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfTE9PUEJBQ0s7CiAKIAltZGV2LT5wbmRldltwb3J0XSA9IGRldjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9wb3J0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3BvcnQuYwppbmRleCAwM2M4NGNkLi4zMzE3OTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3BvcnQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3BvcnQuYwpAQCAtNDEsMTMgKzQxLDYgQEAKICNpbmNsdWRlICJtbHg0X2VuLmgiCiAKIAotaW50IG1seDRfU0VUX01DQVNUX0ZMVFIoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCi0JCQl1NjQgbWFjLCB1NjQgY2xlYXIsIHU4IG1vZGUpCi17Ci0JcmV0dXJuIG1seDRfY21kKGRldiwgKG1hYyB8IChjbGVhciA8PCA2MykpLCBwb3J0LCBtb2RlLAotCQkJTUxYNF9DTURfU0VUX01DQVNUX0ZMVFIsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7Ci19Ci0KIGludCBtbHg0X1NFVF9WTEFOX0ZMVFIoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CkBAIC03Miw3NiArNjUsNyBAQAogCQlmaWx0ZXItPmVudHJ5W2ldID0gY3B1X3RvX2JlMzIoZW50cnkpOwogCX0KIAllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgcHJpdi0+cG9ydCwgMCwgTUxYNF9DTURfU0VUX1ZMQU5fRkxUUiwKLQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7Ci0JbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7Ci0JcmV0dXJuIGVycjsKLX0KLQotCi1pbnQgbWx4NF9TRVRfUE9SVF9nZW5lcmFsKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCBpbnQgbXR1LAotCQkJICB1OCBwcHR4LCB1OCBwZmN0eCwgdTggcHByeCwgdTggcGZjcngpCi17Ci0Jc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7Ci0Jc3RydWN0IG1seDRfc2V0X3BvcnRfZ2VuZXJhbF9jb250ZXh0ICpjb250ZXh0OwotCWludCBlcnI7Ci0JdTMyIGluX21vZDsKLQotCW1haWxib3ggPSBtbHg0X2FsbG9jX2NtZF9tYWlsYm94KGRldik7Ci0JaWYgKElTX0VSUihtYWlsYm94KSkKLQkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7Ci0JY29udGV4dCA9IG1haWxib3gtPmJ1ZjsKLQltZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mICpjb250ZXh0KTsKLQotCWNvbnRleHQtPmZsYWdzID0gU0VUX1BPUlRfR0VOX0FMTF9WQUxJRDsKLQljb250ZXh0LT5tdHUgPSBjcHVfdG9fYmUxNihtdHUpOwotCWNvbnRleHQtPnBwdHggPSAocHB0eCAqICghcGZjdHgpKSA8PCA3OwotCWNvbnRleHQtPnBmY3R4ID0gcGZjdHg7Ci0JY29udGV4dC0+cHByeCA9IChwcHJ4ICogKCFwZmNyeCkpIDw8IDc7Ci0JY29udGV4dC0+cGZjcnggPSBwZmNyeDsKLQotCWluX21vZCA9IE1MWDRfU0VUX1BPUlRfR0VORVJBTCA8PCA4IHwgcG9ydDsKLQllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgaW5fbW9kLCAxLCBNTFg0X0NNRF9TRVRfUE9SVCwKLQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7Ci0KLQltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKLQlyZXR1cm4gZXJyOwotfQotCi1pbnQgbWx4NF9TRVRfUE9SVF9xcG5fY2FsYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTMyIGJhc2VfcXBuLAotCQkJICAgdTggcHJvbWlzYykKLXsKLQlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveDsKLQlzdHJ1Y3QgbWx4NF9zZXRfcG9ydF9ycXBfY2FsY19jb250ZXh0ICpjb250ZXh0OwotCWludCBlcnI7Ci0JdTMyIGluX21vZDsKLQl1MzIgbV9wcm9taXNjID0gKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9NQ19TVEVFUikgPwotCQkJCQkJTUNBU1RfRElSRUNUIDogTUNBU1RfREVGQVVMVDsKLQotCWlmIChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19WRVBfTUNfU1RFRVIgICYmCi0JCQlkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19WRVBfVUNfU1RFRVIpCi0JCXJldHVybiAwOwotCi0JbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKLQlpZiAoSVNfRVJSKG1haWxib3gpKQotCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKLQljb250ZXh0ID0gbWFpbGJveC0+YnVmOwotCW1lbXNldChjb250ZXh0LCAwLCBzaXplb2YgKmNvbnRleHQpOwotCi0JY29udGV4dC0+YmFzZV9xcG4gPSBjcHVfdG9fYmUzMihiYXNlX3Fwbik7Ci0JY29udGV4dC0+bl9tYWMgPSBkZXYtPmNhcHMubG9nX251bV9tYWNzOwotCWNvbnRleHQtPnByb21pc2MgPSBjcHVfdG9fYmUzMihwcm9taXNjIDw8IFNFVF9QT1JUX1BST01JU0NfU0hJRlQgfAotCQkJCSAgICAgICBiYXNlX3Fwbik7Ci0JY29udGV4dC0+bWNhc3QgPSBjcHVfdG9fYmUzMihtX3Byb21pc2MgPDwgU0VUX1BPUlRfTUNfUFJPTUlTQ19TSElGVCB8Ci0JCQkJICAgICBiYXNlX3Fwbik7Ci0JY29udGV4dC0+aW50cmFfbm9fdmxhbiA9IDA7Ci0JY29udGV4dC0+bm9fdmxhbiA9IE1MWDRfTk9fVkxBTl9JRFg7Ci0JY29udGV4dC0+aW50cmFfdmxhbl9taXNzID0gMDsKLQljb250ZXh0LT52bGFuX21pc3MgPSBNTFg0X1ZMQU5fTUlTU19JRFg7Ci0KLQlpbl9tb2QgPSBNTFg0X1NFVF9QT1JUX1JRUF9DQUxDIDw8IDggfCBwb3J0OwotCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBpbl9tb2QsIDEsIE1MWDRfQ01EX1NFVF9QT1JULAotCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19CKTsKLQorCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19CLCBNTFg0X0NNRF9XUkFQUEVEKTsKIAltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTU5LDcgKzgzLDggQEAKIAkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CiAJbWVtc2V0KG1haWxib3gtPmJ1ZiwgMCwgc2l6ZW9mKCpxcG9ydF9jb250ZXh0KSk7CiAJZXJyID0gbWx4NF9jbWRfYm94KG1kZXYtPmRldiwgMCwgbWFpbGJveC0+ZG1hLCBwb3J0LCAwLAotCQkJICAgTUxYNF9DTURfUVVFUllfUE9SVCwgTUxYNF9DTURfVElNRV9DTEFTU19CKTsKKwkJCSAgIE1MWDRfQ01EX1FVRVJZX1BPUlQsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwKKwkJCSAgIE1MWDRfQ01EX1dSQVBQRUQpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCXFwb3J0X2NvbnRleHQgPSBtYWlsYm94LT5idWY7CkBAIC0yMDQsNyArMTI5LDggQEAKIAkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CiAJbWVtc2V0KG1haWxib3gtPmJ1ZiwgMCwgc2l6ZW9mKCptbHg0X2VuX3N0YXRzKSk7CiAJZXJyID0gbWx4NF9jbWRfYm94KG1kZXYtPmRldiwgMCwgbWFpbGJveC0+ZG1hLCBpbl9tb2QsIDAsCi0JCQkgICBNTFg0X0NNRF9EVU1QX0VUSF9TVEFUUywgTUxYNF9DTURfVElNRV9DTEFTU19CKTsKKwkJCSAgIE1MWDRfQ01EX0RVTVBfRVRIX1NUQVRTLCBNTFg0X0NNRF9USU1FX0NMQVNTX0IsCisJCQkgICBNTFg0X0NNRF9XUkFQUEVEKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9wb3J0LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3BvcnQuaAppbmRleCAxOWViMjQ0Li42OTM0ZmQ3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3BvcnQuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3BvcnQuaApAQCAtMzksNDkgKzM5LDYgQEAKICNkZWZpbmUgU0VUX1BPUlRfUFJPTUlTQ19TSElGVAkzMQogI2RlZmluZSBTRVRfUE9SVF9NQ19QUk9NSVNDX1NISUZUCTMwCiAKLWVudW0gewotCU1MWDRfQ01EX1NFVF9WTEFOX0ZMVFIgID0gMHg0NywKLQlNTFg0X0NNRF9TRVRfTUNBU1RfRkxUUiA9IDB4NDgsCi0JTUxYNF9DTURfRFVNUF9FVEhfU1RBVFMgPSAweDQ5LAotfTsKLQotZW51bSB7Ci0JTUNBU1RfRElSRUNUX09OTFkgICAgICAgPSAwLAotCU1DQVNUX0RJUkVDVCAgICAgICAgICAgID0gMSwKLQlNQ0FTVF9ERUZBVUxUICAgICAgICAgICA9IDIKLX07Ci0KLXN0cnVjdCBtbHg0X3NldF9wb3J0X2dlbmVyYWxfY29udGV4dCB7Ci0JdTggcmVzZXJ2ZWRbM107Ci0JdTggZmxhZ3M7Ci0JdTE2IHJlc2VydmVkMjsKLQlfX2JlMTYgbXR1OwotCXU4IHBwdHg7Ci0JdTggcGZjdHg7Ci0JdTE2IHJlc2VydmVkMzsKLQl1OCBwcHJ4OwotCXU4IHBmY3J4OwotCXUxNiByZXNlcnZlZDQ7Ci19OwotCi1zdHJ1Y3QgbWx4NF9zZXRfcG9ydF9ycXBfY2FsY19jb250ZXh0IHsKLQlfX2JlMzIgYmFzZV9xcG47Ci0JdTggcmVyZXJ2ZWQ7Ci0JdTggbl9tYWM7Ci0JdTggbl92bGFuOwotCXU4IG5fcHJpbzsKLQl1OCByZXNlcnZlZDJbM107Ci0JdTggbWFjX21pc3M7Ci0JdTggaW50cmFfbm9fdmxhbjsKLQl1OCBub192bGFuOwotCXU4IGludHJhX3ZsYW5fbWlzczsKLQl1OCB2bGFuX21pc3M7Ci0JdTggcmVzZXJ2ZWQzWzNdOwotCXU4IG5vX3ZsYW5fcHJpbzsKLQlfX2JlMzIgcHJvbWlzYzsKLQlfX2JlMzIgbWNhc3Q7Ci19OwotCiAjZGVmaW5lIFZMQU5fRkxUUl9TSVpFCTEyOAogc3RydWN0IG1seDRfc2V0X3ZsYW5fZmx0cl9tYm94IHsKIAlfX2JlMzIgZW50cnlbVkxBTl9GTFRSX1NJWkVdOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9yZXNvdXJjZXMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fcmVzb3VyY2VzLmMKaW5kZXggMGRmYjRlYy4uYmNiYzU0YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9yZXNvdXJjZXMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3Jlc291cmNlcy5jCkBAIC00NCw3ICs0NCw3IEBACiAJc3RydWN0IG1seDRfZW5fZGV2ICptZGV2ID0gcHJpdi0+bWRldjsKIAogCW1lbXNldChjb250ZXh0LCAwLCBzaXplb2YgKmNvbnRleHQpOwotCWNvbnRleHQtPmZsYWdzID0gY3B1X3RvX2JlMzIoNyA8PCAxNiB8IHJzcyA8PCAxMyk7CisJY29udGV4dC0+ZmxhZ3MgPSBjcHVfdG9fYmUzMig3IDw8IDE2IHwgcnNzIDw8IE1MWDRfUlNTX1FQQ19GTEFHX09GRlNFVCk7CiAJY29udGV4dC0+cGQgPSBjcHVfdG9fYmUzMihtZGV2LT5wcml2X3Bkbik7CiAJY29udGV4dC0+bXR1X21zZ21heCA9IDB4ZmY7CiAJaWYgKCFpc190eCAmJiAhcnNzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9yeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9yeC5jCmluZGV4IGMyZGY2YzMuLmU4ZDZhZDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fcnguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3J4LmMKQEAgLTU0MSw2ICs1NDEsOCBAQAogCXVuc2lnbmVkIGludCBsZW5ndGg7CiAJaW50IHBvbGxlZCA9IDA7CiAJaW50IGlwX3N1bW1lZDsKKwlzdHJ1Y3QgZXRoaGRyICpldGhoOworCXU2NCBzX21hYzsKIAogCWlmICghcHJpdi0+cG9ydF91cCkKIAkJcmV0dXJuIDA7CkBAIC01NzcsNiArNTc5LDE5IEBACiAJCQlnb3RvIG5leHQ7CiAJCX0KIAorCQkvKiBHZXQgcG9pbnRlciB0byBmaXJzdCBmcmFnbWVudCBzaW5jZSB3ZSBoYXZlbid0IHNrYiB5ZXQgYW5kCisJCSAqIGNhc3QgaXQgdG8gZXRoaGRyIHN0cnVjdCAqLworCQlldGhoID0gKHN0cnVjdCBldGhoZHIgKikocGFnZV9hZGRyZXNzKHNrYl9mcmFnc1swXS5wYWdlKSArCisJCQkJCSBza2JfZnJhZ3NbMF0ub2Zmc2V0KTsKKwkJc19tYWMgPSBtbHg0X2VuX21hY190b191NjQoZXRoaC0+aF9zb3VyY2UpOworCisJCS8qIElmIHNvdXJjZSBNQUMgaXMgZXF1YWwgdG8gb3VyIG93biBNQUMgYW5kIG5vdCBwZXJmb3JtaW5nCisJCSAqIHRoZSBzZWxmdGVzdCBvciBmbGIgZGlzYWJsZWQgLSBkcm9wIHRoZSBwYWNrZXQgKi8KKwkJaWYgKHNfbWFjID09IHByaXYtPm1hYyAmJgorCQkJKCEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTE9PUEJBQ0spIHx8CisJCQkgIXByaXYtPnZhbGlkYXRlX2xvb3BiYWNrKSkKKwkJCWdvdG8gbmV4dDsKKwogCQkvKgogCQkgKiBQYWNrZXQgaXMgT0sgLSBwcm9jZXNzIGl0LgogCQkgKi8KQEAgLTgzNyw5ICs4NTIsMTAgQEAKIAlzdHJ1Y3QgbWx4NF9lbl9kZXYgKm1kZXYgPSBwcml2LT5tZGV2OwogCXN0cnVjdCBtbHg0X2VuX3Jzc19tYXAgKnJzc19tYXAgPSAmcHJpdi0+cnNzX21hcDsKIAlzdHJ1Y3QgbWx4NF9xcF9jb250ZXh0IGNvbnRleHQ7Ci0Jc3RydWN0IG1seDRfZW5fcnNzX2NvbnRleHQgKnJzc19jb250ZXh0OworCXN0cnVjdCBtbHg0X3Jzc19jb250ZXh0ICpyc3NfY29udGV4dDsKIAl2b2lkICpwdHI7Ci0JdTggcnNzX21hc2sgPSAweDNmOworCXU4IHJzc19tYXNrID0gKE1MWDRfUlNTX0lQVjQgfCBNTFg0X1JTU19UQ1BfSVBWNCB8IE1MWDRfUlNTX0lQVjYgfAorCQkJTUxYNF9SU1NfVENQX0lQVjYpOwogCWludCBpLCBxcG47CiAJaW50IGVyciA9IDA7CiAJaW50IGdvb2RfcXBzID0gMDsKQEAgLTg3NywxOCArODkzLDIxIEBACiAJbWx4NF9lbl9maWxsX3FwX2NvbnRleHQocHJpdiwgMCwgMCwgMCwgMSwgcHJpdi0+YmFzZV9xcG4sCiAJCQkJcHJpdi0+cnhfcmluZ1swXS5jcW4sICZjb250ZXh0KTsKIAotCXB0ciA9ICgodm9pZCAqKSAmY29udGV4dCkgKyAweDNjOworCXB0ciA9ICgodm9pZCAqKSAmY29udGV4dCkgKyBvZmZzZXRvZihzdHJ1Y3QgbWx4NF9xcF9jb250ZXh0LCBwcmlfcGF0aCkKKwkJCQkJKyBNTFg0X1JTU19PRkZTRVRfSU5fUVBDX1BSSV9QQVRIOwogCXJzc19jb250ZXh0ID0gcHRyOwogCXJzc19jb250ZXh0LT5iYXNlX3FwbiA9IGNwdV90b19iZTMyKGlsb2cyKHByaXYtPnJ4X3JpbmdfbnVtKSA8PCAyNCB8CiAJCQkJCSAgICAocnNzX21hcC0+YmFzZV9xcG4pKTsKIAlyc3NfY29udGV4dC0+ZGVmYXVsdF9xcG4gPSBjcHVfdG9fYmUzMihyc3NfbWFwLT5iYXNlX3Fwbik7CisJaWYgKHByaXYtPm1kZXYtPnByb2ZpbGUudWRwX3JzcykgeworCQlyc3NfbWFzayB8PSAgTUxYNF9SU1NfVURQX0lQVjQgfCBNTFg0X1JTU19VRFBfSVBWNjsKKwkJcnNzX2NvbnRleHQtPmJhc2VfcXBuX3VkcCA9IHJzc19jb250ZXh0LT5kZWZhdWx0X3FwbjsKKwl9CiAJcnNzX2NvbnRleHQtPmZsYWdzID0gcnNzX21hc2s7Ci0JcnNzX2NvbnRleHQtPmhhc2hfZm4gPSAxOworCXJzc19jb250ZXh0LT5oYXNoX2ZuID0gTUxYNF9SU1NfSEFTSF9UT1A7CiAJZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCiAJCXJzc19jb250ZXh0LT5yc3Nfa2V5W2ldID0gcnNza2V5W2ldOwogCi0JaWYgKHByaXYtPm1kZXYtPnByb2ZpbGUudWRwX3JzcykKLQkJcnNzX2NvbnRleHQtPmJhc2VfcXBuX3VkcCA9IHJzc19jb250ZXh0LT5kZWZhdWx0X3FwbjsKIAllcnIgPSBtbHg0X3FwX3RvX3JlYWR5KG1kZXYtPmRldiwgJnByaXYtPnJlcy5tdHQsICZjb250ZXh0LAogCQkJICAgICAgICZyc3NfbWFwLT5pbmRpcl9xcCwgJnJzc19tYXAtPmluZGlyX3N0YXRlKTsKIAlpZiAoZXJyKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9zZWxmdGVzdC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl9zZWxmdGVzdC5jCmluZGV4IDlmZGJjZWMuLmJmMmU1ZDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fc2VsZnRlc3QuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3NlbGZ0ZXN0LmMKQEAgLTQzLDcgKzQzLDcgQEAKIHN0YXRpYyBpbnQgbWx4NF9lbl90ZXN0X3JlZ2lzdGVycyhzdHJ1Y3QgbWx4NF9lbl9wcml2ICpwcml2KQogewogCXJldHVybiBtbHg0X2NtZChwcml2LT5tZGV2LT5kZXYsIDAsIDAsIDAsIE1MWDRfQ01EX0hXX0hFQUxUSF9DSEVDSywKLQkJCU1MWDRfQ01EX1RJTUVfQ0xBU1NfQSk7CisJCQlNTFg0X0NNRF9USU1FX0NMQVNTX0EsIE1MWDRfQ01EX1dSQVBQRUQpOwogfQogCiBzdGF0aWMgaW50IG1seDRfZW5fdGVzdF9sb29wYmFja194bWl0KHN0cnVjdCBtbHg0X2VuX3ByaXYgKnByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3R4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VuX3R4LmMKaW5kZXggZDkwMWI0Mi4uOWVmOTAzOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lbl90eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZW5fdHguYwpAQCAtMzA3LDU5ICszMDcsNjAgQEAKIAlyZXR1cm4gY250OwogfQogCi0KIHN0YXRpYyB2b2lkIG1seDRfZW5fcHJvY2Vzc190eF9jcShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbWx4NF9lbl9jcSAqY3EpCiB7CiAJc3RydWN0IG1seDRfZW5fcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IG1seDRfY3EgKm1jcSA9ICZjcS0+bWNxOwogCXN0cnVjdCBtbHg0X2VuX3R4X3JpbmcgKnJpbmcgPSAmcHJpdi0+dHhfcmluZ1tjcS0+cmluZ107Ci0Jc3RydWN0IG1seDRfY3FlICpjcWUgPSBjcS0+YnVmOworCXN0cnVjdCBtbHg0X2NxZSAqY3FlOwogCXUxNiBpbmRleDsKLQl1MTYgbmV3X2luZGV4OworCXUxNiBuZXdfaW5kZXgsIHJpbmdfaW5kZXg7CiAJdTMyIHR4YmJzX3NraXBwZWQgPSAwOwotCXUzMiBjcV9sYXN0X3NhdjsKLQotCS8qIGluZGV4IGFsd2F5cyBwb2ludHMgdG8gdGhlIGZpcnN0IFRYQkIgb2YgdGhlIGxhc3QgcG9sbGVkIGRlc2NyaXB0b3IgKi8KLQlpbmRleCA9IHJpbmctPmNvbnMgJiByaW5nLT5zaXplX21hc2s7Ci0JbmV3X2luZGV4ID0gYmUxNl90b19jcHUoY3FlLT53cWVfaW5kZXgpICYgcmluZy0+c2l6ZV9tYXNrOwotCWlmIChpbmRleCA9PSBuZXdfaW5kZXgpCi0JCXJldHVybjsKKwl1MzIgY29uc19pbmRleCA9IG1jcS0+Y29uc19pbmRleDsKKwlpbnQgc2l6ZSA9IGNxLT5zaXplOworCXUzMiBzaXplX21hc2sgPSByaW5nLT5zaXplX21hc2s7CisJc3RydWN0IG1seDRfY3FlICpidWYgPSBjcS0+YnVmOwogCiAJaWYgKCFwcml2LT5wb3J0X3VwKQogCQlyZXR1cm47CiAKLQkvKgotCSAqIFdlIHVzZSBhIHR3by1zdGFnZSBsb29wOgotCSAqIC0gdGhlIGZpcnN0IHNhbXBsZXMgdGhlIEhXLXVwZGF0ZWQgQ1FFCi0JICogLSB0aGUgc2Vjb25kIGZyZWVzIFRYQkJzIHVudGlsIHRoZSBsYXN0IHNhbXBsZQotCSAqIFRoaXMgbGV0cyB1cyBhbW9ydGl6ZSBDUUUgY2FjaGUgbWlzc2VzLCB3aGlsZSBzdGlsbCBwb2xsaW5nIHRoZSBDUQotCSAqIHVudGlsIGlzIHF1aWVzY2VudC4KLQkgKi8KLQljcV9sYXN0X3NhdiA9IG1jcS0+Y29uc19pbmRleDsKLQlkbyB7CisJaW5kZXggPSBjb25zX2luZGV4ICYgc2l6ZV9tYXNrOworCWNxZSA9ICZidWZbaW5kZXhdOworCXJpbmdfaW5kZXggPSByaW5nLT5jb25zICYgc2l6ZV9tYXNrOworCisJLyogUHJvY2VzcyBhbGwgY29tcGxldGVkIENRRXMgKi8KKwl3aGlsZSAoWE5PUihjcWUtPm93bmVyX3NyX29wY29kZSAmIE1MWDRfQ1FFX09XTkVSX01BU0ssCisJCQljb25zX2luZGV4ICYgc2l6ZSkpIHsKKwkJLyoKKwkJICogbWFrZSBzdXJlIHdlIHJlYWQgdGhlIENRRSBhZnRlciB3ZSByZWFkIHRoZQorCQkgKiBvd25lcnNoaXAgYml0CisJCSAqLworCQlybWIoKTsKKworCQkvKiBTa2lwIG92ZXIgbGFzdCBwb2xsZWQgQ1FFICovCisJCW5ld19pbmRleCA9IGJlMTZfdG9fY3B1KGNxZS0+d3FlX2luZGV4KSAmIHNpemVfbWFzazsKKwogCQlkbyB7Ci0JCQkvKiBTa2lwIG92ZXIgbGFzdCBwb2xsZWQgQ1FFICovCi0JCQlpbmRleCA9IChpbmRleCArIHJpbmctPmxhc3RfbnJfdHhiYikgJiByaW5nLT5zaXplX21hc2s7CiAJCQl0eGJic19za2lwcGVkICs9IHJpbmctPmxhc3RfbnJfdHhiYjsKLQotCQkJLyogUG9sbCBuZXh0IENRRSAqLworCQkJcmluZ19pbmRleCA9IChyaW5nX2luZGV4ICsgcmluZy0+bGFzdF9ucl90eGJiKSAmIHNpemVfbWFzazsKKwkJCS8qIGZyZWUgbmV4dCBkZXNjcmlwdG9yICovCiAJCQlyaW5nLT5sYXN0X25yX3R4YmIgPSBtbHg0X2VuX2ZyZWVfdHhfZGVzYygKLQkJCQkJCXByaXYsIHJpbmcsIGluZGV4LAotCQkJCQkJISEoKHJpbmctPmNvbnMgKyB0eGJic19za2lwcGVkKSAmCi0JCQkJCQkgICByaW5nLT5zaXplKSk7Ci0JCQkrK21jcS0+Y29uc19pbmRleDsKKwkJCQkJcHJpdiwgcmluZywgcmluZ19pbmRleCwKKwkJCQkJISEoKHJpbmctPmNvbnMgKyB0eGJic19za2lwcGVkKSAmCisJCQkJCQkJcmluZy0+c2l6ZSkpOworCQl9IHdoaWxlIChyaW5nX2luZGV4ICE9IG5ld19pbmRleCk7CiAKLQkJfSB3aGlsZSAoaW5kZXggIT0gbmV3X2luZGV4KTsKKwkJKytjb25zX2luZGV4OworCQlpbmRleCA9IGNvbnNfaW5kZXggJiBzaXplX21hc2s7CisJCWNxZSA9ICZidWZbaW5kZXhdOworCX0KIAotCQluZXdfaW5kZXggPSBiZTE2X3RvX2NwdShjcWUtPndxZV9pbmRleCkgJiByaW5nLT5zaXplX21hc2s7Ci0JfSB3aGlsZSAoaW5kZXggIT0gbmV3X2luZGV4KTsKLQlBVkdfUEVSRl9DT1VOVEVSKHByaXYtPnBzdGF0cy50eF9jb2FsX2F2ZywKLQkJCSAodTMyKSAobWNxLT5jb25zX2luZGV4IC0gY3FfbGFzdF9zYXYpKTsKIAogCS8qCiAJICogVG8gcHJldmVudCBDUSBvdmVyZmxvdyB3ZSBmaXJzdCB1cGRhdGUgQ1EgY29uc3VtZXIgYW5kIG9ubHkgdGhlbgogCSAqIHRoZSByaW5nIGNvbnN1bWVyLgogCSAqLworCW1jcS0+Y29uc19pbmRleCA9IGNvbnNfaW5kZXg7CiAJbWx4NF9jcV9zZXRfY2kobWNxKTsKIAl3bWIoKTsKIAlyaW5nLT5jb25zICs9IHR4YmJzX3NraXBwZWQ7CkBAIC01NjUsNyArNTY2LDggQEAKIAkJaW5sLT5ieXRlX2NvdW50ID0gY3B1X3RvX2JlMzIoMSA8PCAzMSB8IChza2ItPmxlbiAtIHNwYykpOwogCX0KIAl0eF9kZXNjLT5jdHJsLnZsYW5fdGFnID0gY3B1X3RvX2JlMTYoKnZsYW5fdGFnKTsKLQl0eF9kZXNjLT5jdHJsLmluc192bGFuID0gTUxYNF9XUUVfQ1RSTF9JTlNfVkxBTiAqICEhKCp2bGFuX3RhZyk7CisJdHhfZGVzYy0+Y3RybC5pbnNfdmxhbiA9IE1MWDRfV1FFX0NUUkxfSU5TX1ZMQU4gKgorCQkoISF2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpOwogCXR4X2Rlc2MtPmN0cmwuZmVuY2Vfc2l6ZSA9IChyZWFsX3NpemUgLyAxNikgJiAweDNmOwogfQogCkBAIC02NzYsMjcgKzY3OCwyNSBAQAogCS8qIFByZXBhcmUgY3RybCBzZWdlbWVudCBhcGFydCBvcGNvZGUrb3duZXJzaGlwLCB3aGljaCBkZXBlbmRzIG9uCiAJICogd2hldGhlciBMU08gaXMgdXNlZCAqLwogCXR4X2Rlc2MtPmN0cmwudmxhbl90YWcgPSBjcHVfdG9fYmUxNih2bGFuX3RhZyk7Ci0JdHhfZGVzYy0+Y3RybC5pbnNfdmxhbiA9IE1MWDRfV1FFX0NUUkxfSU5TX1ZMQU4gKiAhIXZsYW5fdGFnOworCXR4X2Rlc2MtPmN0cmwuaW5zX3ZsYW4gPSBNTFg0X1dRRV9DVFJMX0lOU19WTEFOICoKKwkJISF2bGFuX3R4X3RhZ19wcmVzZW50KHNrYik7CiAJdHhfZGVzYy0+Y3RybC5mZW5jZV9zaXplID0gKHJlYWxfc2l6ZSAvIDE2KSAmIDB4M2Y7Ci0JdHhfZGVzYy0+Y3RybC5zcmNyYl9mbGFncyA9IGNwdV90b19iZTMyKE1MWDRfV1FFX0NUUkxfQ1FfVVBEQVRFIHwKLQkJCQkJCU1MWDRfV1FFX0NUUkxfU09MSUNJVEVEKTsKKwl0eF9kZXNjLT5jdHJsLnNyY3JiX2ZsYWdzID0gcHJpdi0+Y3RybF9mbGFnczsKIAlpZiAobGlrZWx5KHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX1BBUlRJQUwpKSB7CiAJCXR4X2Rlc2MtPmN0cmwuc3JjcmJfZmxhZ3MgfD0gY3B1X3RvX2JlMzIoTUxYNF9XUUVfQ1RSTF9JUF9DU1VNIHwKIAkJCQkJCQkgTUxYNF9XUUVfQ1RSTF9UQ1BfVURQX0NTVU0pOwogCQlyaW5nLT50eF9jc3VtKys7CiAJfQogCi0JaWYgKHVubGlrZWx5KHByaXYtPnZhbGlkYXRlX2xvb3BiYWNrKSkgewotCQkvKiBDb3B5IGRzdCBtYWMgYWRkcmVzcyB0byB3cWUgKi8KLQkJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKLQkJZXRoaCA9IGV0aF9oZHIoc2tiKTsKLQkJaWYgKGV0aGggJiYgZXRoaC0+aF9kZXN0KSB7Ci0JCQltYWMgPSBtbHg0X2VuX21hY190b191NjQoZXRoaC0+aF9kZXN0KTsKLQkJCW1hY19oID0gKHUzMikgKChtYWMgJiAweGZmZmYwMDAwMDAwMFVMTCkgPj4gMTYpOwotCQkJbWFjX2wgPSAodTMyKSAobWFjICYgMHhmZmZmZmZmZik7Ci0JCQl0eF9kZXNjLT5jdHJsLnNyY3JiX2ZsYWdzIHw9IGNwdV90b19iZTMyKG1hY19oKTsKLQkJCXR4X2Rlc2MtPmN0cmwuaW1tID0gY3B1X3RvX2JlMzIobWFjX2wpOwotCQl9CisJLyogQ29weSBkc3QgbWFjIGFkZHJlc3MgdG8gd3FlICovCisJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKKwlldGhoID0gZXRoX2hkcihza2IpOworCWlmIChldGhoICYmIGV0aGgtPmhfZGVzdCkgeworCQltYWMgPSBtbHg0X2VuX21hY190b191NjQoZXRoaC0+aF9kZXN0KTsKKwkJbWFjX2ggPSAodTMyKSAoKG1hYyAmIDB4ZmZmZjAwMDAwMDAwVUxMKSA+PiAxNik7CisJCW1hY19sID0gKHUzMikgKG1hYyAmIDB4ZmZmZmZmZmYpOworCQl0eF9kZXNjLT5jdHJsLnNyY3JiX2ZsYWdzIHw9IGNwdV90b19iZTMyKG1hY19oKTsKKwkJdHhfZGVzYy0+Y3RybC5pbW0gPSBjcHVfdG9fYmUzMihtYWNfbCk7CiAJfQogCiAJLyogSGFuZGxlIExTTyAoVFNPKSBwYWNrZXRzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VxLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2VxLmMKaW5kZXggMjRlZTk2Ny4uMWU5YjU1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9lcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZXEuYwpAQCAtMzEsNiArMzEsNyBAQAogICogU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CkBAIC01MiwzMCArNTMsNiBAQAogCU1MWDRfRVFfRU5UUllfU0laRQk9IDB4MjAKIH07CiAKLS8qCi0gKiBNdXN0IGJlIHBhY2tlZCBiZWNhdXNlIHN0YXJ0IGlzIDY0IGJpdHMgYnV0IG9ubHkgYWxpZ25lZCB0byAzMiBiaXRzLgotICovCi1zdHJ1Y3QgbWx4NF9lcV9jb250ZXh0IHsKLQlfX2JlMzIJCQlmbGFnczsKLQl1MTYJCQlyZXNlcnZlZDFbM107Ci0JX19iZTE2CQkJcGFnZV9vZmZzZXQ7Ci0JdTgJCQlsb2dfZXFfc2l6ZTsKLQl1OAkJCXJlc2VydmVkMls0XTsKLQl1OAkJCWVxX3BlcmlvZDsKLQl1OAkJCXJlc2VydmVkMzsKLQl1OAkJCWVxX21heF9jb3VudDsKLQl1OAkJCXJlc2VydmVkNFszXTsKLQl1OAkJCWludHI7Ci0JdTgJCQlsb2dfcGFnZV9zaXplOwotCXU4CQkJcmVzZXJ2ZWQ1WzJdOwotCXU4CQkJbXR0X2Jhc2VfYWRkcl9oOwotCV9fYmUzMgkJCW10dF9iYXNlX2FkZHJfbDsKLQl1MzIJCQlyZXNlcnZlZDZbMl07Ci0JX19iZTMyCQkJY29uc3VtZXJfaW5kZXg7Ci0JX19iZTMyCQkJcHJvZHVjZXJfaW5kZXg7Ci0JdTMyCQkJcmVzZXJ2ZWQ3WzRdOwotfTsKLQogI2RlZmluZSBNTFg0X0VRX1NUQVRVU19PSwkgICAoIDAgPDwgMjgpCiAjZGVmaW5lIE1MWDRfRVFfU1RBVFVTX1dSSVRFX0ZBSUwgICgxMCA8PCAyOCkKICNkZWZpbmUgTUxYNF9FUV9PV05FUl9TVwkgICAoIDAgPDwgMjQpCkBAIC0xMDAsNDYgKzc3LDkgQEAKIAkJCSAgICAgICAoMXVsbCA8PCBNTFg0X0VWRU5UX1RZUEVfU1JRX0NBVEFTX0VSUk9SKSAgICB8IFwKIAkJCSAgICAgICAoMXVsbCA8PCBNTFg0X0VWRU5UX1RZUEVfU1JRX1FQX0xBU1RfV1FFKSAgICB8IFwKIAkJCSAgICAgICAoMXVsbCA8PCBNTFg0X0VWRU5UX1RZUEVfU1JRX0xJTUlUKQkgICAgfCBcCi0JCQkgICAgICAgKDF1bGwgPDwgTUxYNF9FVkVOVF9UWVBFX0NNRCkpCi0KLXN0cnVjdCBtbHg0X2VxZSB7Ci0JdTgJCQlyZXNlcnZlZDE7Ci0JdTgJCQl0eXBlOwotCXU4CQkJcmVzZXJ2ZWQyOwotCXU4CQkJc3VidHlwZTsKLQl1bmlvbiB7Ci0JCXUzMgkJcmF3WzZdOwotCQlzdHJ1Y3QgewotCQkJX19iZTMyCWNxbjsKLQkJfSBfX3BhY2tlZCBjb21wOwotCQlzdHJ1Y3QgewotCQkJdTE2CXJlc2VydmVkMTsKLQkJCV9fYmUxNgl0b2tlbjsKLQkJCXUzMglyZXNlcnZlZDI7Ci0JCQl1OAlyZXNlcnZlZDNbM107Ci0JCQl1OAlzdGF0dXM7Ci0JCQlfX2JlNjQJb3V0X3BhcmFtOwotCQl9IF9fcGFja2VkIGNtZDsKLQkJc3RydWN0IHsKLQkJCV9fYmUzMglxcG47Ci0JCX0gX19wYWNrZWQgcXA7Ci0JCXN0cnVjdCB7Ci0JCQlfX2JlMzIJc3JxbjsKLQkJfSBfX3BhY2tlZCBzcnE7Ci0JCXN0cnVjdCB7Ci0JCQlfX2JlMzIJY3FuOwotCQkJdTMyCXJlc2VydmVkMTsKLQkJCXU4CXJlc2VydmVkMlszXTsKLQkJCXU4CXN5bmRyb21lOwotCQl9IF9fcGFja2VkIGNxX2VycjsKLQkJc3RydWN0IHsKLQkJCXUzMglyZXNlcnZlZDFbMl07Ci0JCQlfX2JlMzIJcG9ydDsKLQkJfSBfX3BhY2tlZCBwb3J0X2NoYW5nZTsKLQl9CQkJZXZlbnQ7Ci0JdTgJCQlyZXNlcnZlZDNbM107Ci0JdTgJCQlvd25lcjsKLX0gX19wYWNrZWQ7CisJCQkgICAgICAgKDF1bGwgPDwgTUxYNF9FVkVOVF9UWVBFX0NNRCkJCSAgICB8IFwKKwkJCSAgICAgICAoMXVsbCA8PCBNTFg0X0VWRU5UX1RZUEVfQ09NTV9DSEFOTkVMKSAgICAgICB8IFwKKwkJCSAgICAgICAoMXVsbCA8PCBNTFg0X0VWRU5UX1RZUEVfRkxSX0VWRU5UKSkKIAogc3RhdGljIHZvaWQgZXFfc2V0X2NpKHN0cnVjdCBtbHg0X2VxICplcSwgaW50IHJlcV9ub3QpCiB7CkBAIC0xNjIsMTMgKzEwMiwxNDQgQEAKIAlyZXR1cm4gISEoZXFlLT5vd25lciAmIDB4ODApIF4gISEoZXEtPmNvbnNfaW5kZXggJiBlcS0+bmVudCkgPyBOVUxMIDogZXFlOwogfQogCitzdGF0aWMgc3RydWN0IG1seDRfZXFlICpuZXh0X3NsYXZlX2V2ZW50X2VxZShzdHJ1Y3QgbWx4NF9zbGF2ZV9ldmVudF9lcSAqc2xhdmVfZXEpCit7CisJc3RydWN0IG1seDRfZXFlICplcWUgPQorCQkmc2xhdmVfZXEtPmV2ZW50X2VxZVtzbGF2ZV9lcS0+Y29ucyAmIChTTEFWRV9FVkVOVF9FUV9TSVpFIC0gMSldOworCXJldHVybiAoISEoZXFlLT5vd25lciAmIDB4ODApIF4KKwkJISEoc2xhdmVfZXEtPmNvbnMgJiBTTEFWRV9FVkVOVF9FUV9TSVpFKSkgPworCQllcWUgOiBOVUxMOworfQorCit2b2lkIG1seDRfZ2VuX3NsYXZlX2VxZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG1seDRfbWZ1bmNfbWFzdGVyX2N0eCAqbWFzdGVyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBtbHg0X21mdW5jX21hc3Rlcl9jdHgsCisJCQkgICAgIHNsYXZlX2V2ZW50X3dvcmspOworCXN0cnVjdCBtbHg0X21mdW5jICptZnVuYyA9CisJCWNvbnRhaW5lcl9vZihtYXN0ZXIsIHN0cnVjdCBtbHg0X21mdW5jLCBtYXN0ZXIpOworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YobWZ1bmMsIHN0cnVjdCBtbHg0X3ByaXYsIG1mdW5jKTsKKwlzdHJ1Y3QgbWx4NF9kZXYgKmRldiA9ICZwcml2LT5kZXY7CisJc3RydWN0IG1seDRfc2xhdmVfZXZlbnRfZXEgKnNsYXZlX2VxID0gJm1mdW5jLT5tYXN0ZXIuc2xhdmVfZXE7CisJc3RydWN0IG1seDRfZXFlICplcWU7CisJdTggc2xhdmU7CisJaW50IGk7CisKKwlmb3IgKGVxZSA9IG5leHRfc2xhdmVfZXZlbnRfZXFlKHNsYXZlX2VxKTsgZXFlOworCSAgICAgIGVxZSA9IG5leHRfc2xhdmVfZXZlbnRfZXFlKHNsYXZlX2VxKSkgeworCQlzbGF2ZSA9IGVxZS0+c2xhdmVfaWQ7CisKKwkJLyogQWxsIGFjdGl2ZSBzbGF2ZXMgbmVlZCB0byByZWNlaXZlIHRoZSBldmVudCAqLworCQlpZiAoc2xhdmUgPT0gQUxMX1NMQVZFUykgeworCQkJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3NsYXZlczsgaSsrKSB7CisJCQkJaWYgKGkgIT0gZGV2LT5jYXBzLmZ1bmN0aW9uICYmCisJCQkJICAgIG1hc3Rlci0+c2xhdmVfc3RhdGVbaV0uYWN0aXZlKQorCQkJCQlpZiAobWx4NF9HRU5fRVFFKGRldiwgaSwgZXFlKSkKKwkJCQkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gIgorCQkJCQkJCSAgIiBnZW5lcmF0ZSBldmVudCAiCisJCQkJCQkJICAiZm9yIHNsYXZlICVkXG4iLCBpKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChtbHg0X0dFTl9FUUUoZGV2LCBzbGF2ZSwgZXFlKSkKKwkJCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIHRvIGdlbmVyYXRlIGV2ZW50ICIKKwkJCQkJICAgICAgICJmb3Igc2xhdmUgJWRcbiIsIHNsYXZlKTsKKwkJfQorCQkrK3NsYXZlX2VxLT5jb25zOworCX0KK30KKworCitzdGF0aWMgdm9pZCBzbGF2ZV9ldmVudChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggc2xhdmUsIHN0cnVjdCBtbHg0X2VxZSAqZXFlKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9zbGF2ZV9ldmVudF9lcSAqc2xhdmVfZXEgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX2VxOworCXN0cnVjdCBtbHg0X2VxZSAqc19lcWUgPQorCQkmc2xhdmVfZXEtPmV2ZW50X2VxZVtzbGF2ZV9lcS0+cHJvZCAmIChTTEFWRV9FVkVOVF9FUV9TSVpFIC0gMSldOworCisJaWYgKCghIShzX2VxZS0+b3duZXIgJiAweDgwKSkgXgorCSAgICAoISEoc2xhdmVfZXEtPnByb2QgJiBTTEFWRV9FVkVOVF9FUV9TSVpFKSkpIHsKKwkJbWx4NF93YXJuKGRldiwgIk1hc3RlciBmYWlsZWQgdG8gZ2VuZXJhdGUgYW4gRVFFIGZvciBzbGF2ZTogJWQuICIKKwkJCSAgIk5vIGZyZWUgRVFFIG9uIHNsYXZlIGV2ZW50cyBxdWV1ZVxuIiwgc2xhdmUpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KHNfZXFlLCBlcWUsIHNpemVvZihzdHJ1Y3QgbWx4NF9lcWUpIC0gMSk7CisJc19lcWUtPnNsYXZlX2lkID0gc2xhdmU7CisJLyogZW5zdXJlIGFsbCBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIGJlZm9yZSBzZXR0aW5nIHRoZSBvd25lcnNpcCBiaXQgKi8KKwl3bWIoKTsKKwlzX2VxZS0+b3duZXIgPSAhIShzbGF2ZV9lcS0+cHJvZCAmIFNMQVZFX0VWRU5UX0VRX1NJWkUpID8gMHgwIDogMHg4MDsKKwkrK3NsYXZlX2VxLT5wcm9kOworCisJcXVldWVfd29yayhwcml2LT5tZnVuYy5tYXN0ZXIuY29tbV93cSwKKwkJICAgJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9ldmVudF93b3JrKTsKK30KKworc3RhdGljIHZvaWQgbWx4NF9zbGF2ZV9ldmVudChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgICBzdHJ1Y3QgbWx4NF9lcWUgKmVxZSkKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfc2xhdmVfc3RhdGUgKnNfc2xhdmUgPQorCQkmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXTsKKworCWlmICghc19zbGF2ZS0+YWN0aXZlKSB7CisJCS8qbWx4NF93YXJuKGRldiwgIlRyeWluZyB0byBwYXNzIGV2ZW50IHRvIGluYWN0aXZlIHNsYXZlXG4iKTsqLworCQlyZXR1cm47CisJfQorCisJc2xhdmVfZXZlbnQoZGV2LCBzbGF2ZSwgZXFlKTsKK30KKwordm9pZCBtbHg0X21hc3Rlcl9oYW5kbGVfc2xhdmVfZmxyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbWx4NF9tZnVuY19tYXN0ZXJfY3R4ICptYXN0ZXIgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG1seDRfbWZ1bmNfbWFzdGVyX2N0eCwKKwkJCSAgICAgc2xhdmVfZmxyX2V2ZW50X3dvcmspOworCXN0cnVjdCBtbHg0X21mdW5jICptZnVuYyA9CisJCWNvbnRhaW5lcl9vZihtYXN0ZXIsIHN0cnVjdCBtbHg0X21mdW5jLCBtYXN0ZXIpOworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2YobWZ1bmMsIHN0cnVjdCBtbHg0X3ByaXYsIG1mdW5jKTsKKwlzdHJ1Y3QgbWx4NF9kZXYgKmRldiA9ICZwcml2LT5kZXY7CisJc3RydWN0IG1seDRfc2xhdmVfc3RhdGUgKnNsYXZlX3N0YXRlID0gcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlOworCWludCBpOworCWludCBlcnI7CisKKwltbHg0X2RiZyhkZXYsICJtbHg0X2hhbmRsZV9zbGF2ZV9mbHJcbiIpOworCisJZm9yIChpID0gMCA7IGkgPCBkZXYtPm51bV9zbGF2ZXM7IGkrKykgeworCisJCWlmIChNTFg0X0NPTU1fQ01EX0ZMUiA9PSBzbGF2ZV9zdGF0ZVtpXS5sYXN0X2NtZCkgeworCQkJbWx4NF9kYmcoZGV2LCAibWx4NF9oYW5kbGVfc2xhdmVfZmxyOiAiCisJCQkJICJjbGVhbiBzbGF2ZTogJWRcbiIsIGkpOworCisJCQltbHg0X2RlbGV0ZV9hbGxfcmVzb3VyY2VzX2Zvcl9zbGF2ZShkZXYsIGkpOworCQkJLypyZXR1cm4gdGhlIHNsYXZlIHRvIHJ1bm5pbmcgbW9kZSovCisJCQlzcGluX2xvY2soJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZV9sb2NrKTsKKwkJCXNsYXZlX3N0YXRlW2ldLmxhc3RfY21kID0gTUxYNF9DT01NX0NNRF9SRVNFVDsKKwkJCXNsYXZlX3N0YXRlW2ldLmlzX3NsYXZlX2dvaW5nX2Rvd24gPSAwOworCQkJc3Bpbl91bmxvY2soJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZV9sb2NrKTsKKwkJCS8qbm90aWZ5IHRoZSBGVzoqLworCQkJZXJyID0gbWx4NF9jbWQoZGV2LCAwLCBpLCAwLCBNTFg0X0NNRF9JTkZPUk1fRkxSX0RPTkUsCisJCQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfV1JBUFBFRCk7CisJCQlpZiAoZXJyKQorCQkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gbm90aWZ5IEZXIG9uICIKKwkJCQkJICAiRkxSIGRvbmUgKHNsYXZlOiVkKVxuIiwgaSk7CisJCX0KKwl9Cit9CisKIHN0YXRpYyBpbnQgbWx4NF9lcV9pbnQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X2VxICplcSkKIHsKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CiAJc3RydWN0IG1seDRfZXFlICplcWU7CiAJaW50IGNxbjsKIAlpbnQgZXFlc19mb3VuZCA9IDA7CiAJaW50IHNldF9jaSA9IDA7CiAJaW50IHBvcnQ7CisJaW50IHNsYXZlID0gMDsKKwlpbnQgcmV0OworCXUzMiBmbHJfc2xhdmU7CisJdTggdXBkYXRlX3NsYXZlX3N0YXRlOworCWludCBpOwogCiAJd2hpbGUgKChlcWUgPSBuZXh0X2VxZV9zdyhlcSkpKSB7CiAJCS8qCkBAIC0xOTEsMTQgKzI2Miw2OCBAQAogCQljYXNlIE1MWDRfRVZFTlRfVFlQRV9QQVRIX01JR19GQUlMRUQ6CiAJCWNhc2UgTUxYNF9FVkVOVF9UWVBFX1dRX0lOVkFMX1JFUV9FUlJPUjoKIAkJY2FzZSBNTFg0X0VWRU5UX1RZUEVfV1FfQUNDRVNTX0VSUk9SOgotCQkJbWx4NF9xcF9ldmVudChkZXYsIGJlMzJfdG9fY3B1KGVxZS0+ZXZlbnQucXAucXBuKSAmIDB4ZmZmZmZmLAotCQkJCSAgICAgIGVxZS0+dHlwZSk7CisJCQltbHg0X2RiZyhkZXYsICJldmVudCAlZCBhcnJpdmVkXG4iLCBlcWUtPnR5cGUpOworCQkJaWYgKG1seDRfaXNfbWFzdGVyKGRldikpIHsKKwkJCQkvKiBmb3J3YXJkIG9ubHkgdG8gc2xhdmUgb3duaW5nIHRoZSBRUCAqLworCQkJCXJldCA9IG1seDRfZ2V0X3NsYXZlX2Zyb21fcmVzb3VyY2VfaWQoZGV2LAorCQkJCQkJUkVTX1FQLAorCQkJCQkJYmUzMl90b19jcHUoZXFlLT5ldmVudC5xcC5xcG4pCisJCQkJCQkmIDB4ZmZmZmZmLCAmc2xhdmUpOworCQkJCWlmIChyZXQgJiYgcmV0ICE9IC1FTk9FTlQpIHsKKwkJCQkJbWx4NF9kYmcoZGV2LCAiUVAgZXZlbnQgJTAyeCglMDJ4KSBvbiAiCisJCQkJCQkgIkVRICVkIGF0IGluZGV4ICV1OiBjb3VsZCAiCisJCQkJCQkgIm5vdCBnZXQgc2xhdmUgaWQgKCVkKVxuIiwKKwkJCQkJCSBlcWUtPnR5cGUsIGVxZS0+c3VidHlwZSwKKwkJCQkJCSBlcS0+ZXFuLCBlcS0+Y29uc19pbmRleCwgcmV0KTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJaWYgKCFyZXQgJiYgc2xhdmUgIT0gZGV2LT5jYXBzLmZ1bmN0aW9uKSB7CisJCQkJCW1seDRfc2xhdmVfZXZlbnQoZGV2LCBzbGF2ZSwgZXFlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQl9CisJCQltbHg0X3FwX2V2ZW50KGRldiwgYmUzMl90b19jcHUoZXFlLT5ldmVudC5xcC5xcG4pICYKKwkJCQkgICAgICAweGZmZmZmZiwgZXFlLT50eXBlKTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgTUxYNF9FVkVOVF9UWVBFX1NSUV9MSU1JVDoKKwkJCW1seDRfd2FybihkZXYsICIlczogTUxYNF9FVkVOVF9UWVBFX1NSUV9MSU1JVFxuIiwKKwkJCQkgIF9fZnVuY19fKTsKIAkJY2FzZSBNTFg0X0VWRU5UX1RZUEVfU1JRX0NBVEFTX0VSUk9SOgotCQkJbWx4NF9zcnFfZXZlbnQoZGV2LCBiZTMyX3RvX2NwdShlcWUtPmV2ZW50LnNycS5zcnFuKSAmIDB4ZmZmZmZmLAotCQkJCSAgICAgIGVxZS0+dHlwZSk7CisJCQlpZiAobWx4NF9pc19tYXN0ZXIoZGV2KSkgeworCQkJCS8qIGZvcndhcmQgb25seSB0byBzbGF2ZSBvd25pbmcgdGhlIFNSUSAqLworCQkJCXJldCA9IG1seDRfZ2V0X3NsYXZlX2Zyb21fcmVzb3VyY2VfaWQoZGV2LAorCQkJCQkJUkVTX1NSUSwKKwkJCQkJCWJlMzJfdG9fY3B1KGVxZS0+ZXZlbnQuc3JxLnNycW4pCisJCQkJCQkmIDB4ZmZmZmZmLAorCQkJCQkJJnNsYXZlKTsKKwkJCQlpZiAocmV0ICYmIHJldCAhPSAtRU5PRU5UKSB7CisJCQkJCW1seDRfd2FybihkZXYsICJTUlEgZXZlbnQgJTAyeCglMDJ4KSAiCisJCQkJCQkgICJvbiBFUSAlZCBhdCBpbmRleCAldTogY291bGQiCisJCQkJCQkgICIgbm90IGdldCBzbGF2ZSBpZCAoJWQpXG4iLAorCQkJCQkJICBlcWUtPnR5cGUsIGVxZS0+c3VidHlwZSwKKwkJCQkJCSAgZXEtPmVxbiwgZXEtPmNvbnNfaW5kZXgsIHJldCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQltbHg0X3dhcm4oZGV2LCAiJXM6IHNsYXZlOiVkLCBzcnFfbm86MHgleCwiCisJCQkJCSAgIiBldmVudDogJTAyeCglMDJ4KVxuIiwgX19mdW5jX18sCisJCQkJCSAgc2xhdmUsCisJCQkJCSAgYmUzMl90b19jcHUoZXFlLT5ldmVudC5zcnEuc3JxbiksCisJCQkJCSAgZXFlLT50eXBlLCBlcWUtPnN1YnR5cGUpOworCisJCQkJaWYgKCFyZXQgJiYgc2xhdmUgIT0gZGV2LT5jYXBzLmZ1bmN0aW9uKSB7CisJCQkJCW1seDRfd2FybihkZXYsICIlczogc2VuZGluZyBldmVudCAiCisJCQkJCQkgICIlMDJ4KCUwMngpIHRvIHNsYXZlOiVkXG4iLAorCQkJCQkJICAgX19mdW5jX18sIGVxZS0+dHlwZSwKKwkJCQkJCSAgZXFlLT5zdWJ0eXBlLCBzbGF2ZSk7CisJCQkJCW1seDRfc2xhdmVfZXZlbnQoZGV2LCBzbGF2ZSwgZXFlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJbWx4NF9zcnFfZXZlbnQoZGV2LCBiZTMyX3RvX2NwdShlcWUtPmV2ZW50LnNycS5zcnFuKSAmCisJCQkJICAgICAgIDB4ZmZmZmZmLCBlcWUtPnR5cGUpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBNTFg0X0VWRU5UX1RZUEVfQ01EOgpAQCAtMjExLDEzICszMzYsMzUgQEAKIAkJY2FzZSBNTFg0X0VWRU5UX1RZUEVfUE9SVF9DSEFOR0U6CiAJCQlwb3J0ID0gYmUzMl90b19jcHUoZXFlLT5ldmVudC5wb3J0X2NoYW5nZS5wb3J0KSA+PiAyODsKIAkJCWlmIChlcWUtPnN1YnR5cGUgPT0gTUxYNF9QT1JUX0NIQU5HRV9TVUJUWVBFX0RPV04pIHsKLQkJCQltbHg0X2Rpc3BhdGNoX2V2ZW50KGRldiwgTUxYNF9ERVZfRVZFTlRfUE9SVF9ET1dOLAorCQkJCW1seDRfZGlzcGF0Y2hfZXZlbnQoZGV2LAorCQkJCQkJICAgIE1MWDRfREVWX0VWRU5UX1BPUlRfRE9XTiwKIAkJCQkJCSAgICBwb3J0KTsKIAkJCQltbHg0X3ByaXYoZGV2KS0+c2Vuc2UuZG9fc2Vuc2VfcG9ydFtwb3J0XSA9IDE7CisJCQkJaWYgKG1seDRfaXNfbWFzdGVyKGRldikpCisJCQkJCS8qY2hhbmdlIHRoZSBzdGF0ZSBvZiBhbGwgc2xhdmUncyBwb3J0CisJCQkJCSogdG8gZG93bjoqLworCQkJCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fc2xhdmVzOyBpKyspIHsKKwkJCQkJCW1seDRfZGJnKGRldiwgIiVzOiBTZW5kaW5nICIKKwkJCQkJCQkgIk1MWDRfUE9SVF9DSEFOR0VfU1VCVFlQRV9ET1dOIgorCQkJCQkJCSAiIHRvIHNsYXZlOiAlZCwgcG9ydDolZFxuIiwKKwkJCQkJCQkgX19mdW5jX18sIGksIHBvcnQpOworCQkJCQkJaWYgKGkgPT0gZGV2LT5jYXBzLmZ1bmN0aW9uKQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJbWx4NF9zbGF2ZV9ldmVudChkZXYsIGksIGVxZSk7CisJCQkJCX0KIAkJCX0gZWxzZSB7Ci0JCQkJbWx4NF9kaXNwYXRjaF9ldmVudChkZXYsIE1MWDRfREVWX0VWRU5UX1BPUlRfVVAsCisJCQkJbWx4NF9kaXNwYXRjaF9ldmVudChkZXYsCisJCQkJCQkgICAgTUxYNF9ERVZfRVZFTlRfUE9SVF9VUCwKIAkJCQkJCSAgICBwb3J0KTsKIAkJCQltbHg0X3ByaXYoZGV2KS0+c2Vuc2UuZG9fc2Vuc2VfcG9ydFtwb3J0XSA9IDA7CisKKwkJCQlpZiAobWx4NF9pc19tYXN0ZXIoZGV2KSkgeworCQkJCQlmb3IgKGkgPSAwOyBpIDwgZGV2LT5udW1fc2xhdmVzOyBpKyspIHsKKwkJCQkJCWlmIChpID09IGRldi0+Y2Fwcy5mdW5jdGlvbikKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCW1seDRfc2xhdmVfZXZlbnQoZGV2LCBpLCBlcWUpOworCQkJCQl9CisJCQkJfQogCQkJfQogCQkJYnJlYWs7CiAKQEAgLTIyNiw3ICszNzMsMjggQEAKIAkJCQkgIGVxZS0+ZXZlbnQuY3FfZXJyLnN5bmRyb21lID09IDEgPwogCQkJCSAgIm92ZXJydW4iIDogImFjY2VzcyB2aW9sYXRpb24iLAogCQkJCSAgYmUzMl90b19jcHUoZXFlLT5ldmVudC5jcV9lcnIuY3FuKSAmIDB4ZmZmZmZmKTsKLQkJCW1seDRfY3FfZXZlbnQoZGV2LCBiZTMyX3RvX2NwdShlcWUtPmV2ZW50LmNxX2Vyci5jcW4pLAorCQkJaWYgKG1seDRfaXNfbWFzdGVyKGRldikpIHsKKwkJCQlyZXQgPSBtbHg0X2dldF9zbGF2ZV9mcm9tX3Jlc291cmNlX2lkKGRldiwKKwkJCQkJUkVTX0NRLAorCQkJCQliZTMyX3RvX2NwdShlcWUtPmV2ZW50LmNxX2Vyci5jcW4pCisJCQkJCSYgMHhmZmZmZmYsICZzbGF2ZSk7CisJCQkJaWYgKHJldCAmJiByZXQgIT0gLUVOT0VOVCkgeworCQkJCQltbHg0X2RiZyhkZXYsICJDUSBldmVudCAlMDJ4KCUwMngpIG9uICIKKwkJCQkJCSAiRVEgJWQgYXQgaW5kZXggJXU6IGNvdWxkICIKKwkJCQkJCSAgIm5vdCBnZXQgc2xhdmUgaWQgKCVkKVxuIiwKKwkJCQkJCSAgZXFlLT50eXBlLCBlcWUtPnN1YnR5cGUsCisJCQkJCQkgIGVxLT5lcW4sIGVxLT5jb25zX2luZGV4LCByZXQpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoIXJldCAmJiBzbGF2ZSAhPSBkZXYtPmNhcHMuZnVuY3Rpb24pIHsKKwkJCQkJbWx4NF9zbGF2ZV9ldmVudChkZXYsIHNsYXZlLCBlcWUpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQltbHg0X2NxX2V2ZW50KGRldiwKKwkJCQkgICAgICBiZTMyX3RvX2NwdShlcWUtPmV2ZW50LmNxX2Vyci5jcW4pCisJCQkJICAgICAgJiAweGZmZmZmZiwKIAkJCQkgICAgICBlcWUtPnR5cGUpOwogCQkJYnJlYWs7CiAKQEAgLTIzNCwxMyArNDAyLDYwIEBACiAJCQltbHg0X3dhcm4oZGV2LCAiRVEgb3ZlcnJ1biBvbiBFUU4gJWRcbiIsIGVxLT5lcW4pOwogCQkJYnJlYWs7CiAKKwkJY2FzZSBNTFg0X0VWRU5UX1RZUEVfQ09NTV9DSEFOTkVMOgorCQkJaWYgKCFtbHg0X2lzX21hc3RlcihkZXYpKSB7CisJCQkJbWx4NF93YXJuKGRldiwgIlJlY2VpdmVkIGNvbW0gY2hhbm5lbCBldmVudCAiCisJCQkJCSAgICAgICAiZm9yIG5vbiBtYXN0ZXIgZGV2aWNlXG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCW1lbWNweSgmcHJpdi0+bWZ1bmMubWFzdGVyLmNvbW1fYXJtX2JpdF92ZWN0b3IsCisJCQkgICAgICAgZXFlLT5ldmVudC5jb21tX2NoYW5uZWxfYXJtLmJpdF92ZWMsCisJCQkgICAgICAgc2l6ZW9mIGVxZS0+ZXZlbnQuY29tbV9jaGFubmVsX2FybS5iaXRfdmVjKTsKKwkJCXF1ZXVlX3dvcmsocHJpdi0+bWZ1bmMubWFzdGVyLmNvbW1fd3EsCisJCQkJICAgJnByaXYtPm1mdW5jLm1hc3Rlci5jb21tX3dvcmspOworCQkJYnJlYWs7CisKKwkJY2FzZSBNTFg0X0VWRU5UX1RZUEVfRkxSX0VWRU5UOgorCQkJZmxyX3NsYXZlID0gYmUzMl90b19jcHUoZXFlLT5ldmVudC5mbHJfZXZlbnQuc2xhdmVfaWQpOworCQkJaWYgKCFtbHg0X2lzX21hc3RlcihkZXYpKSB7CisJCQkJbWx4NF93YXJuKGRldiwgIk5vbi1tYXN0ZXIgZnVuY3Rpb24gcmVjZWl2ZWQiCisJCQkJCSAgICAgICAiRkxSIGV2ZW50XG4iKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJbWx4NF9kYmcoZGV2LCAiRkxSIGV2ZW50IGZvciBzbGF2ZTogJWRcbiIsIGZscl9zbGF2ZSk7CisKKwkJCWlmIChmbHJfc2xhdmUgPiBkZXYtPm51bV9zbGF2ZXMpIHsKKwkJCQltbHg0X3dhcm4oZGV2LAorCQkJCQkgICJHb3QgRkxSIGZvciB1bmtub3duIGZ1bmN0aW9uOiAlZFxuIiwKKwkJCQkJICBmbHJfc2xhdmUpOworCQkJCXVwZGF0ZV9zbGF2ZV9zdGF0ZSA9IDA7CisJCQl9IGVsc2UKKwkJCQl1cGRhdGVfc2xhdmVfc3RhdGUgPSAxOworCisJCQlzcGluX2xvY2soJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZV9sb2NrKTsKKwkJCWlmICh1cGRhdGVfc2xhdmVfc3RhdGUpIHsKKwkJCQlwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbZmxyX3NsYXZlXS5hY3RpdmUgPSBmYWxzZTsKKwkJCQlwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbZmxyX3NsYXZlXS5sYXN0X2NtZCA9IE1MWDRfQ09NTV9DTURfRkxSOworCQkJCXByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtmbHJfc2xhdmVdLmlzX3NsYXZlX2dvaW5nX2Rvd24gPSAxOworCQkJfQorCQkJc3Bpbl91bmxvY2soJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZV9sb2NrKTsKKwkJCXF1ZXVlX3dvcmsocHJpdi0+bWZ1bmMubWFzdGVyLmNvbW1fd3EsCisJCQkJICAgJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9mbHJfZXZlbnRfd29yayk7CisJCQlicmVhazsKIAkJY2FzZSBNTFg0X0VWRU5UX1RZUEVfRUVDX0NBVEFTX0VSUk9SOgogCQljYXNlIE1MWDRfRVZFTlRfVFlQRV9FQ0NfREVURUNUOgogCQlkZWZhdWx0OgotCQkJbWx4NF93YXJuKGRldiwgIlVuaGFuZGxlZCBldmVudCAlMDJ4KCUwMngpIG9uIEVRICVkIGF0IGluZGV4ICV1XG4iLAotCQkJCSAgZXFlLT50eXBlLCBlcWUtPnN1YnR5cGUsIGVxLT5lcW4sIGVxLT5jb25zX2luZGV4KTsKKwkJCW1seDRfd2FybihkZXYsICJVbmhhbmRsZWQgZXZlbnQgJTAyeCglMDJ4KSBvbiBFUSAlZCBhdCAiCisJCQkJICAiaW5kZXggJXUuIG93bmVyPSV4LCBuZW50PTB4JXgsIHNsYXZlPSV4LCAiCisJCQkJICAib3duZXJzaGlwPSVzXG4iLAorCQkJCSAgZXFlLT50eXBlLCBlcWUtPnN1YnR5cGUsIGVxLT5lcW4sCisJCQkJICBlcS0+Y29uc19pbmRleCwgZXFlLT5vd25lciwgZXEtPm5lbnQsCisJCQkJICBlcWUtPnNsYXZlX2lkLAorCQkJCSAgISEoZXFlLT5vd25lciAmIDB4ODApIF4KKwkJCQkgICEhKGVxLT5jb25zX2luZGV4ICYgZXEtPm5lbnQpID8gIkhXIiA6ICJTVyIpOwogCQkJYnJlYWs7Ci0JCX0KKwkJfTsKIAogCQkrK2VxLT5jb25zX2luZGV4OwogCQllcWVzX2ZvdW5kID0gMTsKQEAgLTI5MCwyNSArNTA1LDU4IEBACiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCitpbnQgbWx4NF9NQVBfRVFfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQlzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9zbGF2ZV9ldmVudF9lcV9pbmZvICpldmVudF9lcSA9CisJCSZwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbc2xhdmVdLmV2ZW50X2VxOworCXUzMiBpbl9tb2RpZmllciA9IHZoY3ItPmluX21vZGlmaWVyOworCXUzMiBlcW4gPSBpbl9tb2RpZmllciAmIDB4MUZGOworCXU2NCBpbl9wYXJhbSA9ICB2aGNyLT5pbl9wYXJhbTsKKwlpbnQgZXJyID0gMDsKKworCWlmIChzbGF2ZSA9PSBkZXYtPmNhcHMuZnVuY3Rpb24pCisJCWVyciA9IG1seDRfY21kKGRldiwgaW5fcGFyYW0sIChpbl9tb2RpZmllciAmIDB4ODAwMDAwMDApIHwgZXFuLAorCQkJICAgICAgIDAsIE1MWDRfQ01EX01BUF9FUSwgTUxYNF9DTURfVElNRV9DTEFTU19CLAorCQkJICAgICAgIE1MWDRfQ01EX05BVElWRSk7CisJaWYgKCFlcnIpIHsKKwkJaWYgKGluX21vZGlmaWVyID4+IDMxKSB7CisJCQkvKiB1bm1hcCAqLworCQkJZXZlbnRfZXEtPmV2ZW50X3R5cGUgJj0gfmluX3BhcmFtOworCQl9IGVsc2UgeworCQkJZXZlbnRfZXEtPmVxbiA9IGVxbjsKKwkJCWV2ZW50X2VxLT5ldmVudF90eXBlID0gaW5fcGFyYW07CisJCX0KKwl9CisJcmV0dXJuIGVycjsKK30KKwogc3RhdGljIGludCBtbHg0X01BUF9FUShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTY0IGV2ZW50X21hc2ssIGludCB1bm1hcCwKIAkJCWludCBlcV9udW0pCiB7CiAJcmV0dXJuIG1seDRfY21kKGRldiwgZXZlbnRfbWFzaywgKHVubWFwIDw8IDMxKSB8IGVxX251bSwKLQkJCTAsIE1MWDRfQ01EX01BUF9FUSwgTUxYNF9DTURfVElNRV9DTEFTU19CKTsKKwkJCTAsIE1MWDRfQ01EX01BUF9FUSwgTUxYNF9DTURfVElNRV9DTEFTU19CLAorCQkJTUxYNF9DTURfV1JBUFBFRCk7CiB9CiAKIHN0YXRpYyBpbnQgbWx4NF9TVzJIV19FUShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3gsCiAJCQkgaW50IGVxX251bSkKIHsKLQlyZXR1cm4gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGVxX251bSwgMCwgTUxYNF9DTURfU1cySFdfRVEsCi0JCQlNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCXJldHVybiBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSB8IGRldi0+Y2Fwcy5mdW5jdGlvbiwgZXFfbnVtLCAwLAorCQkJTUxYNF9DTURfU1cySFdfRVEsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCU1MWDRfQ01EX1dSQVBQRUQpOwogfQogCiBzdGF0aWMgaW50IG1seDRfSFcyU1dfRVEoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94LAogCQkJIGludCBlcV9udW0pCiB7Ci0JcmV0dXJuIG1seDRfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgZXFfbnVtLCAwLCBNTFg0X0NNRF9IVzJTV19FUSwKLQkJCSAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCXJldHVybiBtbHg0X2NtZF9ib3goZGV2LCBkZXYtPmNhcHMuZnVuY3Rpb24sIG1haWxib3gtPmRtYSwgZXFfbnVtLAorCQkJICAgIDAsIE1MWDRfQ01EX0hXMlNXX0VRLCBNTFg0X0NNRF9USU1FX0NMQVNTX0EsCisJCQkgICAgTUxYNF9DTURfV1JBUFBFRCk7CiB9CiAKIHN0YXRpYyBpbnQgbWx4NF9udW1fZXFfdWFyKHN0cnVjdCBtbHg0X2RldiAqZGV2KQpAQCAtNTg1LDE0ICs4MzMsMTYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbWx4NF9udW1fZXFfdWFyKGRldik7ICsraSkKIAkJcHJpdi0+ZXFfdGFibGUudWFyX21hcFtpXSA9IE5VTEw7CiAKLQllcnIgPSBtbHg0X21hcF9jbHJfaW50KGRldik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfb3V0X2JpdG1hcDsKKwlpZiAoIW1seDRfaXNfc2xhdmUoZGV2KSkgeworCQllcnIgPSBtbHg0X21hcF9jbHJfaW50KGRldik7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9vdXRfYml0bWFwOwogCi0JcHJpdi0+ZXFfdGFibGUuY2xyX21hc2sgPQotCQlzd2FiMzIoMSA8PCAocHJpdi0+ZXFfdGFibGUuaW50YV9waW4gJiAzMSkpOwotCXByaXYtPmVxX3RhYmxlLmNscl9pbnQgID0gcHJpdi0+Y2xyX2Jhc2UgKwotCQkocHJpdi0+ZXFfdGFibGUuaW50YV9waW4gPCAzMiA/IDQgOiAwKTsKKwkJcHJpdi0+ZXFfdGFibGUuY2xyX21hc2sgPQorCQkJc3dhYjMyKDEgPDwgKHByaXYtPmVxX3RhYmxlLmludGFfcGluICYgMzEpKTsKKwkJcHJpdi0+ZXFfdGFibGUuY2xyX2ludCAgPSBwcml2LT5jbHJfYmFzZSArCisJCQkocHJpdi0+ZXFfdGFibGUuaW50YV9waW4gPCAzMiA/IDQgOiAwKTsKKwl9CiAKIAlwcml2LT5lcV90YWJsZS5pcnFfbmFtZXMgPQogCQlrbWFsbG9jKE1MWDRfSVJRTkFNRV9TSVpFICogKGRldi0+Y2Fwcy5udW1fY29tcF92ZWN0b3JzICsgMSArCkBAIC03MDAsNyArOTUwLDggQEAKIAkJbWx4NF9mcmVlX2VxKGRldiwgJnByaXYtPmVxX3RhYmxlLmVxW2ldKTsKIAkJLS1pOwogCX0KLQltbHg0X3VubWFwX2Nscl9pbnQoZGV2KTsKKwlpZiAoIW1seDRfaXNfc2xhdmUoZGV2KSkKKwkJbWx4NF91bm1hcF9jbHJfaW50KGRldik7CiAJbWx4NF9mcmVlX2lycXMoZGV2KTsKIAogZXJyX291dF9iaXRtYXA6CkBAIC03MjUsNyArOTc2LDggQEAKIAlmb3IgKGkgPSAwOyBpIDwgZGV2LT5jYXBzLm51bV9jb21wX3ZlY3RvcnMgKyBkZXYtPmNhcHMuY29tcF9wb29sICsgMTsgKytpKQogCQltbHg0X2ZyZWVfZXEoZGV2LCAmcHJpdi0+ZXFfdGFibGUuZXFbaV0pOwogCi0JbWx4NF91bm1hcF9jbHJfaW50KGRldik7CisJaWYgKCFtbHg0X2lzX3NsYXZlKGRldikpCisJCW1seDRfdW5tYXBfY2xyX2ludChkZXYpOwogCiAJZm9yIChpID0gMDsgaSA8IG1seDRfbnVtX2VxX3VhcihkZXYpOyArK2kpCiAJCWlmIChwcml2LT5lcV90YWJsZS51YXJfbWFwW2ldKQpAQCAtNzQ4LDcgKzEwMDAsNyBAQAogCiAJZXJyID0gbWx4NF9OT1AoZGV2KTsKIAkvKiBXaGVuIG5vdCBpbiBNU0lfWCwgdGhlcmUgaXMgb25seSBvbmUgaXJxIHRvIGNoZWNrICovCi0JaWYgKCEoZGV2LT5mbGFncyAmIE1MWDRfRkxBR19NU0lfWCkpCisJaWYgKCEoZGV2LT5mbGFncyAmIE1MWDRfRkxBR19NU0lfWCkgfHwgbWx4NF9pc19zbGF2ZShkZXYpKQogCQlyZXR1cm4gZXJyOwogCiAJLyogQSBsb29wIG92ZXIgYWxsIGNvbXBsZXRpb24gdmVjdG9ycywgZm9yIGVhY2ggdmVjdG9yIHdlIHdpbGwgY2hlY2sKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuYwppbmRleCA0MzVjYTZlLi5hNDI0YTE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5jCkBAIC0zMiw2ICszMiw3IEBACiAgKiBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhY2hlLmg+CkBAIC00OCw3ICs0OSw3IEBACiBleHRlcm4gdm9pZCBfX2J1Z2d5X3VzZV9vZl9NTFg0X0dFVCh2b2lkKTsKIGV4dGVybiB2b2lkIF9fYnVnZ3lfdXNlX29mX01MWDRfUFVUKHZvaWQpOwogCi1zdGF0aWMgaW50IGVuYWJsZV9xb3M7CitzdGF0aWMgYm9vbCBlbmFibGVfcW9zOwogbW9kdWxlX3BhcmFtKGVuYWJsZV9xb3MsIGJvb2wsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfcW9zLCAiRW5hYmxlIFF1YWxpdHkgb2YgU2VydmljZSBzdXBwb3J0IGluIHRoZSBIQ0EgKGRlZmF1bHQ6IG9mZikiKTsKIApAQCAtMTM5LDEyICsxNDAsMTg1IEBACiAJTUxYNF9QVVQoaW5ib3gsIGNmZy0+bG9nX3BnX3N6X20sIE1PRF9TVEFUX0NGR19QR19TWl9NX09GRlNFVCk7CiAKIAllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgMCwgMCwgTUxYNF9DTURfTU9EX1NUQVRfQ0ZHLAotCQkJTUxYNF9DTURfVElNRV9DTEFTU19BKTsKKwkJCU1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfTkFUSVZFKTsKIAogCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiBlcnI7CiB9CiAKK2ludCBtbHg0X1FVRVJZX0ZVTkNfQ0FQX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCQlzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCQlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJCXN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJdTgJZmllbGQ7CisJdTMyCXNpemU7CisJaW50CWVyciA9IDA7CisKKyNkZWZpbmUgUVVFUllfRlVOQ19DQVBfRkxBR1NfT0ZGU0VUCQkweDAKKyNkZWZpbmUgUVVFUllfRlVOQ19DQVBfTlVNX1BPUlRTX09GRlNFVAkJMHgxCisjZGVmaW5lIFFVRVJZX0ZVTkNfQ0FQX0ZVTkNUSU9OX09GRlNFVAkJMHgzCisjZGVmaW5lIFFVRVJZX0ZVTkNfQ0FQX1BGX0JIVlJfT0ZGU0VUCQkweDQKKyNkZWZpbmUgUVVFUllfRlVOQ19DQVBfUVBfUVVPVEFfT0ZGU0VUCQkweDEwCisjZGVmaW5lIFFVRVJZX0ZVTkNfQ0FQX0NRX1FVT1RBX09GRlNFVAkJMHgxNAorI2RlZmluZSBRVUVSWV9GVU5DX0NBUF9TUlFfUVVPVEFfT0ZGU0VUCQkweDE4CisjZGVmaW5lIFFVRVJZX0ZVTkNfQ0FQX01QVF9RVU9UQV9PRkZTRVQJCTB4MjAKKyNkZWZpbmUgUVVFUllfRlVOQ19DQVBfTVRUX1FVT1RBX09GRlNFVAkJMHgyNAorI2RlZmluZSBRVUVSWV9GVU5DX0NBUF9NQ0dfUVVPVEFfT0ZGU0VUCQkweDI4CisjZGVmaW5lIFFVRVJZX0ZVTkNfQ0FQX01BWF9FUV9PRkZTRVQJCTB4MmMKKyNkZWZpbmUgUVVFUllfRlVOQ19DQVBfUkVTRVJWRURfRVFfT0ZGU0VUCTBYMzAKKworI2RlZmluZSBRVUVSWV9GVU5DX0NBUF9QSFlTX1BPUlRfT0ZGU0VUCQkweDMKKyNkZWZpbmUgUVVFUllfRlVOQ19DQVBfRVRIX1BST1BTX09GRlNFVAkJMHhjCisKKwlpZiAodmhjci0+b3BfbW9kaWZpZXIgPT0gMSkgeworCQlmaWVsZCA9IHZoY3ItPmluX21vZGlmaWVyOworCQlNTFg0X1BVVChvdXRib3gtPmJ1ZiwgZmllbGQsIFFVRVJZX0ZVTkNfQ0FQX1BIWVNfUE9SVF9PRkZTRVQpOworCisJCWZpZWxkID0gMDsgLyogZW5zdXJlIGZ2bCBiaXQgaXMgbm90IHNldCAqLworCQlNTFg0X1BVVChvdXRib3gtPmJ1ZiwgZmllbGQsIFFVRVJZX0ZVTkNfQ0FQX0VUSF9QUk9QU19PRkZTRVQpOworCX0gZWxzZSBpZiAodmhjci0+b3BfbW9kaWZpZXIgPT0gMCkgeworCQlmaWVsZCA9IDEgPDwgNzsgLyogZW5hYmxlIG9ubHkgZXRoZXJuZXQgaW50ZXJmYWNlICovCisJCU1MWDRfUFVUKG91dGJveC0+YnVmLCBmaWVsZCwgUVVFUllfRlVOQ19DQVBfRkxBR1NfT0ZGU0VUKTsKKworCQlmaWVsZCA9IHNsYXZlOworCQlNTFg0X1BVVChvdXRib3gtPmJ1ZiwgZmllbGQsIFFVRVJZX0ZVTkNfQ0FQX0ZVTkNUSU9OX09GRlNFVCk7CisKKwkJZmllbGQgPSBkZXYtPmNhcHMubnVtX3BvcnRzOworCQlNTFg0X1BVVChvdXRib3gtPmJ1ZiwgZmllbGQsIFFVRVJZX0ZVTkNfQ0FQX05VTV9QT1JUU19PRkZTRVQpOworCisJCXNpemUgPSAwOyAvKiBubyBQRiBiZWhhdmlvdXMgaXMgc2V0IGZvciBub3cgKi8KKwkJTUxYNF9QVVQob3V0Ym94LT5idWYsIHNpemUsIFFVRVJZX0ZVTkNfQ0FQX1BGX0JIVlJfT0ZGU0VUKTsKKworCQlzaXplID0gZGV2LT5jYXBzLm51bV9xcHM7CisJCU1MWDRfUFVUKG91dGJveC0+YnVmLCBzaXplLCBRVUVSWV9GVU5DX0NBUF9RUF9RVU9UQV9PRkZTRVQpOworCisJCXNpemUgPSBkZXYtPmNhcHMubnVtX3NycXM7CisJCU1MWDRfUFVUKG91dGJveC0+YnVmLCBzaXplLCBRVUVSWV9GVU5DX0NBUF9TUlFfUVVPVEFfT0ZGU0VUKTsKKworCQlzaXplID0gZGV2LT5jYXBzLm51bV9jcXM7CisJCU1MWDRfUFVUKG91dGJveC0+YnVmLCBzaXplLCBRVUVSWV9GVU5DX0NBUF9DUV9RVU9UQV9PRkZTRVQpOworCisJCXNpemUgPSBkZXYtPmNhcHMubnVtX2VxczsKKwkJTUxYNF9QVVQob3V0Ym94LT5idWYsIHNpemUsIFFVRVJZX0ZVTkNfQ0FQX01BWF9FUV9PRkZTRVQpOworCisJCXNpemUgPSBkZXYtPmNhcHMucmVzZXJ2ZWRfZXFzOworCQlNTFg0X1BVVChvdXRib3gtPmJ1Ziwgc2l6ZSwgUVVFUllfRlVOQ19DQVBfUkVTRVJWRURfRVFfT0ZGU0VUKTsKKworCQlzaXplID0gZGV2LT5jYXBzLm51bV9tcHRzOworCQlNTFg0X1BVVChvdXRib3gtPmJ1Ziwgc2l6ZSwgUVVFUllfRlVOQ19DQVBfTVBUX1FVT1RBX09GRlNFVCk7CisKKwkJc2l6ZSA9IGRldi0+Y2Fwcy5udW1fbXR0czsKKwkJTUxYNF9QVVQob3V0Ym94LT5idWYsIHNpemUsIFFVRVJZX0ZVTkNfQ0FQX01UVF9RVU9UQV9PRkZTRVQpOworCisJCXNpemUgPSBkZXYtPmNhcHMubnVtX21nbXMgKyBkZXYtPmNhcHMubnVtX2FtZ21zOworCQlNTFg0X1BVVChvdXRib3gtPmJ1Ziwgc2l6ZSwgUVVFUllfRlVOQ19DQVBfTUNHX1FVT1RBX09GRlNFVCk7CisKKwl9IGVsc2UKKwkJZXJyID0gLUVJTlZBTDsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X1FVRVJZX0ZVTkNfQ0FQKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9mdW5jX2NhcCAqZnVuY19jYXApCit7CisJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CisJdTMyCQkJKm91dGJveDsKKwl1OAkJCWZpZWxkOworCXUzMgkJCXNpemU7CisJaW50CQkJaTsKKwlpbnQJCQllcnIgPSAwOworCisKKwltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCisJZXJyID0gbWx4NF9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCAwLCAwLCBNTFg0X0NNRF9RVUVSWV9GVU5DX0NBUCwKKwkJCSAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfV1JBUFBFRCk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlvdXRib3ggPSBtYWlsYm94LT5idWY7CisKKwlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9GVU5DX0NBUF9GTEFHU19PRkZTRVQpOworCWlmICghKGZpZWxkICYgKDEgPDwgNykpKSB7CisJCW1seDRfZXJyKGRldiwgIlRoZSBob3N0IGRvZXNuJ3Qgc3VwcG9ydCBldGggaW50ZXJmYWNlXG4iKTsKKwkJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKKwkJZ290byBvdXQ7CisJfQorCisJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfRlVOQ19DQVBfRlVOQ1RJT05fT0ZGU0VUKTsKKwlmdW5jX2NhcC0+ZnVuY3Rpb24gPSBmaWVsZDsKKworCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0ZVTkNfQ0FQX05VTV9QT1JUU19PRkZTRVQpOworCWZ1bmNfY2FwLT5udW1fcG9ydHMgPSBmaWVsZDsKKworCU1MWDRfR0VUKHNpemUsIG91dGJveCwgUVVFUllfRlVOQ19DQVBfUEZfQkhWUl9PRkZTRVQpOworCWZ1bmNfY2FwLT5wZl9jb250ZXh0X2JlaGF2aW91ciA9IHNpemU7CisKKwlNTFg0X0dFVChzaXplLCBvdXRib3gsIFFVRVJZX0ZVTkNfQ0FQX1FQX1FVT1RBX09GRlNFVCk7CisJZnVuY19jYXAtPnFwX3F1b3RhID0gc2l6ZSAmIDB4RkZGRkZGOworCisJTUxYNF9HRVQoc2l6ZSwgb3V0Ym94LCBRVUVSWV9GVU5DX0NBUF9TUlFfUVVPVEFfT0ZGU0VUKTsKKwlmdW5jX2NhcC0+c3JxX3F1b3RhID0gc2l6ZSAmIDB4RkZGRkZGOworCisJTUxYNF9HRVQoc2l6ZSwgb3V0Ym94LCBRVUVSWV9GVU5DX0NBUF9DUV9RVU9UQV9PRkZTRVQpOworCWZ1bmNfY2FwLT5jcV9xdW90YSA9IHNpemUgJiAweEZGRkZGRjsKKworCU1MWDRfR0VUKHNpemUsIG91dGJveCwgUVVFUllfRlVOQ19DQVBfTUFYX0VRX09GRlNFVCk7CisJZnVuY19jYXAtPm1heF9lcSA9IHNpemUgJiAweEZGRkZGRjsKKworCU1MWDRfR0VUKHNpemUsIG91dGJveCwgUVVFUllfRlVOQ19DQVBfUkVTRVJWRURfRVFfT0ZGU0VUKTsKKwlmdW5jX2NhcC0+cmVzZXJ2ZWRfZXEgPSBzaXplICYgMHhGRkZGRkY7CisKKwlNTFg0X0dFVChzaXplLCBvdXRib3gsIFFVRVJZX0ZVTkNfQ0FQX01QVF9RVU9UQV9PRkZTRVQpOworCWZ1bmNfY2FwLT5tcHRfcXVvdGEgPSBzaXplICYgMHhGRkZGRkY7CisKKwlNTFg0X0dFVChzaXplLCBvdXRib3gsIFFVRVJZX0ZVTkNfQ0FQX01UVF9RVU9UQV9PRkZTRVQpOworCWZ1bmNfY2FwLT5tdHRfcXVvdGEgPSBzaXplICYgMHhGRkZGRkY7CisKKwlNTFg0X0dFVChzaXplLCBvdXRib3gsIFFVRVJZX0ZVTkNfQ0FQX01DR19RVU9UQV9PRkZTRVQpOworCWZ1bmNfY2FwLT5tY2dfcXVvdGEgPSBzaXplICYgMHhGRkZGRkY7CisKKwlmb3IgKGkgPSAxOyBpIDw9IGZ1bmNfY2FwLT5udW1fcG9ydHM7ICsraSkgeworCQllcnIgPSBtbHg0X2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIGksIDEsCisJCQkJICAgTUxYNF9DTURfUVVFUllfRlVOQ19DQVAsCisJCQkJICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9XUkFQUEVEKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0OworCisJCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX0ZVTkNfQ0FQX0VUSF9QUk9QU19PRkZTRVQpOworCQlpZiAoZmllbGQgJiAoMSA8PCA3KSkgeworCQkJbWx4NF9lcnIoZGV2LCAiVkxBTiBpcyBlbmZvcmNlZCBvbiB0aGlzIHBvcnRcbiIpOworCQkJZXJyID0gLUVQUk9UT05PU1VQUE9SVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGZpZWxkICYgKDEgPDwgNikpIHsKKwkJCW1seDRfZXJyKGRldiwgIkZvcmNlIG1hYyBpcyBlbmFibGVkIG9uIHRoaXMgcG9ydFxuIik7CisJCQllcnIgPSAtRVBST1RPTk9TVVBQT1JUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlNTFg0X0dFVChmaWVsZCwgb3V0Ym94LCBRVUVSWV9GVU5DX0NBUF9QSFlTX1BPUlRfT0ZGU0VUKTsKKwkJZnVuY19jYXAtPnBoeXNpY2FsX3BvcnRbaV0gPSBmaWVsZDsKKwl9CisKKwkvKiBBbGwgb3RoZXIgcmVzb3VyY2VzIGFyZSBhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciwgYnV0IHdlIHN0aWxsIHJlcG9ydAorCSAqICdudW0nIGFuZCAncmVzZXJ2ZWQnIGNhcGFiaWxpdGllcyBhcyBmb2xsb3dzOgorCSAqIC0gbnVtIHJlbWFpbnMgdGhlIG1heGltdW0gcmVzb3VyY2UgaW5kZXgKKwkgKiAtICdudW0gLSByZXNlcnZlZCcgaXMgdGhlIHRvdGFsIGF2YWlsYWJsZSBvYmplY3RzIG9mIGEgcmVzb3VyY2UsIGJ1dAorCSAqICAgcmVzb3VyY2UgaW5kaWNlcyBtYXkgYmUgbGVzcyB0aGFuICdyZXNlcnZlZCcKKwkgKiBUT0RPOiBzZXQgcGVyLXJlc291cmNlIHF1b3RhcyAqLworCitvdXQ6CisJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CisKKwlyZXR1cm4gZXJyOworfQorCiBpbnQgbWx4NF9RVUVSWV9ERVZfQ0FQKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9kZXZfY2FwICpkZXZfY2FwKQogewogCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OwpAQCAtMjI5LDcgKzQwMyw3IEBACiAJb3V0Ym94ID0gbWFpbGJveC0+YnVmOwogCiAJZXJyID0gbWx4NF9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCAwLCAwLCBNTFg0X0NNRF9RVUVSWV9ERVZfQ0FQLAotCQkJICAgTUxYNF9DTURfVElNRV9DTEFTU19BKTsKKwkJCSAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgIW1seDRfaXNfc2xhdmUoZGV2KSk7CiAJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKQEAgLTM5NiwxMiArNTcwLDE1IEBACiAKIAkJZm9yIChpID0gMTsgaSA8PSBkZXZfY2FwLT5udW1fcG9ydHM7ICsraSkgewogCQkJZXJyID0gbWx4NF9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCBpLCAwLCBNTFg0X0NNRF9RVUVSWV9QT1JULAotCQkJCQkgICBNTFg0X0NNRF9USU1FX0NMQVNTX0IpOworCQkJCQkgICBNTFg0X0NNRF9USU1FX0NMQVNTX0IsCisJCQkJCSAgICFtbHg0X2lzX3NsYXZlKGRldikpOwogCQkJaWYgKGVycikKIAkJCQlnb3RvIG91dDsKIAogCQkJTUxYNF9HRVQoZmllbGQsIG91dGJveCwgUVVFUllfUE9SVF9TVVBQT1JURURfVFlQRV9PRkZTRVQpOwogCQkJZGV2X2NhcC0+c3VwcG9ydGVkX3BvcnRfdHlwZXNbaV0gPSBmaWVsZCAmIDM7CisJCQlkZXZfY2FwLT5zdWdnZXN0ZWRfdHlwZVtpXSA9IChmaWVsZCA+PiAzKSAmIDE7CisJCQlkZXZfY2FwLT5kZWZhdWx0X3NlbnNlW2ldID0gKGZpZWxkID4+IDQpICYgMTsKIAkJCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX1BPUlRfTVRVX09GRlNFVCk7CiAJCQlkZXZfY2FwLT5pYl9tdHVbaV0JICAgPSBmaWVsZCAmIDB4ZjsKIAkJCU1MWDRfR0VUKGZpZWxkLCBvdXRib3gsIFFVRVJZX1BPUlRfV0lEVEhfT0ZGU0VUKTsKQEAgLTQ3MCw2ICs2NDcsNjEgQEAKIAlyZXR1cm4gZXJyOwogfQogCitpbnQgbWx4NF9RVUVSWV9QT1JUX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJdTY0IGRlZl9tYWM7CisJdTggcG9ydF90eXBlOworCWludCBlcnI7CisKKyNkZWZpbmUgTUxYNF9QT1JUX1NVUFBPUlRfSUIJCSgxIDw8IDApCisjZGVmaW5lIE1MWDRfUE9SVF9TVUdHRVNUX1RZUEUJCSgxIDw8IDMpCisjZGVmaW5lIE1MWDRfUE9SVF9ERUZBVUxUX1NFTlNFCQkoMSA8PCA0KQorI2RlZmluZSBNTFg0X1ZGX1BPUlRfRVRIX09OTFlfTUFTSwkoMHhmZiAmIH5NTFg0X1BPUlRfU1VQUE9SVF9JQiAmIFwKKwkJCQkJIH5NTFg0X1BPUlRfU1VHR0VTVF9UWVBFICYgXAorCQkJCQkgfk1MWDRfUE9SVF9ERUZBVUxUX1NFTlNFKQorCisJZXJyID0gbWx4NF9jbWRfYm94KGRldiwgMCwgb3V0Ym94LT5kbWEsIHZoY3ItPmluX21vZGlmaWVyLCAwLAorCQkJICAgTUxYNF9DTURfUVVFUllfUE9SVCwgTUxYNF9DTURfVElNRV9DTEFTU19CLAorCQkJICAgTUxYNF9DTURfTkFUSVZFKTsKKworCWlmICghZXJyICYmIGRldi0+Y2Fwcy5mdW5jdGlvbiAhPSBzbGF2ZSkgeworCQkvKiBzZXQgc2xhdmUgZGVmYXVsdF9tYWMgYWRkcmVzcyAqLworCQlNTFg0X0dFVChkZWZfbWFjLCBvdXRib3gtPmJ1ZiwgUVVFUllfUE9SVF9NQUNfT0ZGU0VUKTsKKwkJZGVmX21hYyArPSBzbGF2ZSA8PCA4OworCQlNTFg0X1BVVChvdXRib3gtPmJ1ZiwgZGVmX21hYywgUVVFUllfUE9SVF9NQUNfT0ZGU0VUKTsKKworCQkvKiBnZXQgcG9ydCB0eXBlIC0gY3VycmVudGx5IG9ubHkgZXRoIGlzIGVuYWJsZWQgKi8KKwkJTUxYNF9HRVQocG9ydF90eXBlLCBvdXRib3gtPmJ1ZiwKKwkJCSBRVUVSWV9QT1JUX1NVUFBPUlRFRF9UWVBFX09GRlNFVCk7CisKKwkJLyogQWxsb3cgb25seSBFdGggcG9ydCwgbm8gbGluayBzZW5zaW5nIGFsbG93ZWQgKi8KKwkJcG9ydF90eXBlICY9IE1MWDRfVkZfUE9SVF9FVEhfT05MWV9NQVNLOworCisJCS8qIGNoZWNrIGV0aCBpcyBlbmFibGVkIGZvciB0aGlzIHBvcnQgKi8KKwkJaWYgKCEocG9ydF90eXBlICYgMikpCisJCQltbHg0X2RiZyhkZXYsICJRVUVSWSBQT1JUOiBldGggbm90IHN1cHBvcnRlZCBieSBob3N0Iik7CisKKwkJTUxYNF9QVVQob3V0Ym94LT5idWYsIHBvcnRfdHlwZSwKKwkJCSBRVUVSWV9QT1JUX1NVUFBPUlRFRF9UWVBFX09GRlNFVCk7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtbHg0X1FVRVJZX1BPUlQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHZvaWQgKnB0ciwgdTggcG9ydCkKK3sKKwlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94ID0gcHRyOworCisJcmV0dXJuIG1seDRfY21kX2JveChkZXYsIDAsIG91dGJveC0+ZG1hLCBwb3J0LCAwLAorCQkJICAgIE1MWDRfQ01EX1FVRVJZX1BPUlQsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwKKwkJCSAgICBNTFg0X0NNRF9XUkFQUEVEKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1seDRfUVVFUllfUE9SVCk7CisKIGludCBtbHg0X21hcF9jbWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHUxNiBvcCwgc3RydWN0IG1seDRfaWNtICppY20sIHU2NCB2aXJ0KQogewogCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OwpAQCAtNTE5LDcgKzc1MSw4IEBACiAKIAkJCWlmICgrK25lbnQgPT0gTUxYNF9NQUlMQk9YX1NJWkUgLyAxNikgewogCQkJCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBuZW50LCAwLCBvcCwKLQkJCQkJCU1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7CisJCQkJCQlNTFg0X0NNRF9USU1FX0NMQVNTX0IsCisJCQkJCQlNTFg0X0NNRF9OQVRJVkUpOwogCQkJCWlmIChlcnIpCiAJCQkJCWdvdG8gb3V0OwogCQkJCW5lbnQgPSAwOwpAQCAtNTI4LDcgKzc2MSw4IEBACiAJfQogCiAJaWYgKG5lbnQpCi0JCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBuZW50LCAwLCBvcCwgTUxYNF9DTURfVElNRV9DTEFTU19CKTsKKwkJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIG5lbnQsIDAsIG9wLAorCQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgTUxYNF9DTURfTkFUSVZFKTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dDsKIApAQCAtNTU3LDEzICs3OTEsMTUgQEAKIAogaW50IG1seDRfVU5NQVBfRkEoc3RydWN0IG1seDRfZGV2ICpkZXYpCiB7Ci0JcmV0dXJuIG1seDRfY21kKGRldiwgMCwgMCwgMCwgTUxYNF9DTURfVU5NQVBfRkEsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7CisJcmV0dXJuIG1seDRfY21kKGRldiwgMCwgMCwgMCwgTUxYNF9DTURfVU5NQVBfRkEsCisJCQlNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX05BVElWRSk7CiB9CiAKIAogaW50IG1seDRfUlVOX0ZXKHN0cnVjdCBtbHg0X2RldiAqZGV2KQogewotCXJldHVybiBtbHg0X2NtZChkZXYsIDAsIDAsIDAsIE1MWDRfQ01EX1JVTl9GVywgTUxYNF9DTURfVElNRV9DTEFTU19BKTsKKwlyZXR1cm4gbWx4NF9jbWQoZGV2LCAwLCAwLCAwLCBNTFg0X0NNRF9SVU5fRlcsCisJCQlNTFg0X0NNRF9USU1FX0NMQVNTX0EsIE1MWDRfQ01EX05BVElWRSk7CiB9CiAKIGludCBtbHg0X1FVRVJZX0ZXKHN0cnVjdCBtbHg0X2RldiAqZGV2KQpAQCAtNTc5LDYgKzgxNSw3IEBACiAKICNkZWZpbmUgUVVFUllfRldfT1VUX1NJWkUgICAgICAgICAgICAgMHgxMDAKICNkZWZpbmUgUVVFUllfRldfVkVSX09GRlNFVCAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgUVVFUllfRldfUFBGX0lECQkgICAgICAgMHgwOQogI2RlZmluZSBRVUVSWV9GV19DTURfSUZfUkVWX09GRlNFVCAgICAgMHgwYQogI2RlZmluZSBRVUVSWV9GV19NQVhfQ01EX09GRlNFVCAgICAgICAgMHgwZgogI2RlZmluZSBRVUVSWV9GV19FUlJfU1RBUlRfT0ZGU0VUICAgICAgMHgzMApAQCAtNTg5LDEzICs4MjYsMTYgQEAKICNkZWZpbmUgUVVFUllfRldfQ0xSX0lOVF9CQVNFX09GRlNFVCAgIDB4MjAKICNkZWZpbmUgUVVFUllfRldfQ0xSX0lOVF9CQVJfT0ZGU0VUICAgIDB4MjgKIAorI2RlZmluZSBRVUVSWV9GV19DT01NX0JBU0VfT0ZGU0VUICAgICAgMHg0MAorI2RlZmluZSBRVUVSWV9GV19DT01NX0JBUl9PRkZTRVQgICAgICAgMHg0OAorCiAJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKIAlpZiAoSVNfRVJSKG1haWxib3gpKQogCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKIAlvdXRib3ggPSBtYWlsYm94LT5idWY7CiAKIAllcnIgPSBtbHg0X2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIDAsIDAsIE1MWDRfQ01EX1FVRVJZX0ZXLAotCQkJICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSk7CisJCQkgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9OQVRJVkUpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC02MDgsNiArODQ4LDkgQEAKIAkJKChmd192ZXIgJiAweGZmZmYwMDAwdWxsKSA+PiAxNikgfAogCQkoKGZ3X3ZlciAmIDB4MDAwMGZmZmZ1bGwpIDw8IDE2KTsKIAorCU1MWDRfR0VUKGxnLCBvdXRib3gsIFFVRVJZX0ZXX1BQRl9JRCk7CisJZGV2LT5jYXBzLmZ1bmN0aW9uID0gbGc7CisKIAlNTFg0X0dFVChjbWRfaWZfcmV2LCBvdXRib3gsIFFVRVJZX0ZXX0NNRF9JRl9SRVZfT0ZGU0VUKTsKIAlpZiAoY21kX2lmX3JldiA8IE1MWDRfQ09NTUFORF9JTlRFUkZBQ0VfTUlOX1JFViB8fAogCSAgICBjbWRfaWZfcmV2ID4gTUxYNF9DT01NQU5EX0lOVEVSRkFDRV9NQVhfUkVWKSB7CkBAIC02NDksNiArODkyLDExIEBACiAJTUxYNF9HRVQoZnctPmNscl9pbnRfYmFyLCAgb3V0Ym94LCBRVUVSWV9GV19DTFJfSU5UX0JBUl9PRkZTRVQpOwogCWZ3LT5jbHJfaW50X2JhciA9IChmdy0+Y2xyX2ludF9iYXIgPj4gNikgKiAyOwogCisJTUxYNF9HRVQoZnctPmNvbW1fYmFzZSwgb3V0Ym94LCBRVUVSWV9GV19DT01NX0JBU0VfT0ZGU0VUKTsKKwlNTFg0X0dFVChmdy0+Y29tbV9iYXIsICBvdXRib3gsIFFVRVJZX0ZXX0NPTU1fQkFSX09GRlNFVCk7CisJZnctPmNvbW1fYmFyID0gKGZ3LT5jb21tX2JhciA+PiA2KSAqIDI7CisJbWx4NF9kYmcoZGV2LCAiQ29tbXVuaWNhdGlvbiB2ZWN0b3IgYmFyOiVkIG9mZnNldDoweCVsbHhcbiIsCisJCSBmdy0+Y29tbV9iYXIsIGZ3LT5jb21tX2Jhc2UpOwogCW1seDRfZGJnKGRldiwgIkZXIHNpemUgJWQgS0JcbiIsIGZ3LT5md19wYWdlcyA+PiAyKTsKIAogCS8qCkBAIC03MTEsNyArOTU5LDcgQEAKIAlvdXRib3ggPSBtYWlsYm94LT5idWY7CiAKIAllcnIgPSBtbHg0X2NtZF9ib3goZGV2LCAwLCBtYWlsYm94LT5kbWEsIDAsIDAsIE1MWDRfQ01EX1FVRVJZX0FEQVBURVIsCi0JCQkgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCQkJICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9OQVRJVkUpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCkBAIC03NDMsNiArOTkxLDcgQEAKICNkZWZpbmUJIElOSVRfSENBX0xPR19TUlFfT0ZGU0VUCSAoSU5JVF9IQ0FfUVBDX09GRlNFVCArIDB4MmYpCiAjZGVmaW5lCSBJTklUX0hDQV9DUUNfQkFTRV9PRkZTRVQJIChJTklUX0hDQV9RUENfT0ZGU0VUICsgMHgzMCkKICNkZWZpbmUJIElOSVRfSENBX0xPR19DUV9PRkZTRVQJCSAoSU5JVF9IQ0FfUVBDX09GRlNFVCArIDB4MzcpCisjZGVmaW5lCSBJTklUX0hDQV9FUUVfQ1FFX09GRlNFVFMJIChJTklUX0hDQV9RUENfT0ZGU0VUICsgMHgzOCkKICNkZWZpbmUJIElOSVRfSENBX0FMVENfQkFTRV9PRkZTRVQJIChJTklUX0hDQV9RUENfT0ZGU0VUICsgMHg0MCkKICNkZWZpbmUJIElOSVRfSENBX0FVWENfQkFTRV9PRkZTRVQJIChJTklUX0hDQV9RUENfT0ZGU0VUICsgMHg1MCkKICNkZWZpbmUJIElOSVRfSENBX0VRQ19CQVNFX09GRlNFVAkgKElOSVRfSENBX1FQQ19PRkZTRVQgKyAweDYwKQpAQCAtODMxLDEwICsxMDgwLDExIEBACiAKIAkvKiBVQVIgYXR0cmlidXRlcyAqLwogCi0JTUxYNF9QVVQoaW5ib3gsICh1OCkgKFBBR0VfU0hJRlQgLSAxMiksIElOSVRfSENBX1VBUl9QQUdFX1NaX09GRlNFVCk7CisJTUxYNF9QVVQoaW5ib3gsIHBhcmFtLT51YXJfcGFnZV9zeiwJSU5JVF9IQ0FfVUFSX1BBR0VfU1pfT0ZGU0VUKTsKIAlNTFg0X1BVVChpbmJveCwgcGFyYW0tPmxvZ191YXJfc3osICAgICAgSU5JVF9IQ0FfTE9HX1VBUl9TWl9PRkZTRVQpOwogCi0JZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIDAsIDAsIE1MWDRfQ01EX0lOSVRfSENBLCAxMDAwMCk7CisJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIDAsIDAsIE1MWDRfQ01EX0lOSVRfSENBLCAxMDAwMCwKKwkJICAgICAgIE1MWDRfQ01EX05BVElWRSk7CiAKIAlpZiAoZXJyKQogCQltbHg0X2VycihkZXYsICJJTklUX0hDQSByZXR1cm5zICVkXG4iLCBlcnIpOwpAQCAtODQzLDYgKzEwOTMsMTAxIEBACiAJcmV0dXJuIGVycjsKIH0KIAoraW50IG1seDRfUVVFUllfSENBKHN0cnVjdCBtbHg0X2RldiAqZGV2LAorCQkgICBzdHJ1Y3QgbWx4NF9pbml0X2hjYV9wYXJhbSAqcGFyYW0pCit7CisJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CisJX19iZTMyICpvdXRib3g7CisJaW50IGVycjsKKworI2RlZmluZSBRVUVSWV9IQ0FfR0xPQkFMX0NBUFNfT0ZGU0VUCTB4MDQKKworCW1haWxib3ggPSBtbHg0X2FsbG9jX2NtZF9tYWlsYm94KGRldik7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CisJb3V0Ym94ID0gbWFpbGJveC0+YnVmOworCisJZXJyID0gbWx4NF9jbWRfYm94KGRldiwgMCwgbWFpbGJveC0+ZG1hLCAwLCAwLAorCQkJICAgTUxYNF9DTURfUVVFUllfSENBLAorCQkJICAgTUxYNF9DTURfVElNRV9DTEFTU19CLAorCQkJICAgIW1seDRfaXNfc2xhdmUoZGV2KSk7CisJaWYgKGVycikKKwkJZ290byBvdXQ7CisKKwlNTFg0X0dFVChwYXJhbS0+Z2xvYmFsX2NhcHMsIG91dGJveCwgUVVFUllfSENBX0dMT0JBTF9DQVBTX09GRlNFVCk7CisKKwkvKiBRUEMvRUVDL0NRQy9FUUMvUkRNQVJDIGF0dHJpYnV0ZXMgKi8KKworCU1MWDRfR0VUKHBhcmFtLT5xcGNfYmFzZSwgICAgICBvdXRib3gsIElOSVRfSENBX1FQQ19CQVNFX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPmxvZ19udW1fcXBzLCAgIG91dGJveCwgSU5JVF9IQ0FfTE9HX1FQX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPnNycWNfYmFzZSwgICAgIG91dGJveCwgSU5JVF9IQ0FfU1JRQ19CQVNFX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPmxvZ19udW1fc3JxcywgIG91dGJveCwgSU5JVF9IQ0FfTE9HX1NSUV9PRkZTRVQpOworCU1MWDRfR0VUKHBhcmFtLT5jcWNfYmFzZSwgICAgICBvdXRib3gsIElOSVRfSENBX0NRQ19CQVNFX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPmxvZ19udW1fY3FzLCAgIG91dGJveCwgSU5JVF9IQ0FfTE9HX0NRX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPmFsdGNfYmFzZSwgICAgIG91dGJveCwgSU5JVF9IQ0FfQUxUQ19CQVNFX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPmF1eGNfYmFzZSwgICAgIG91dGJveCwgSU5JVF9IQ0FfQVVYQ19CQVNFX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPmVxY19iYXNlLCAgICAgIG91dGJveCwgSU5JVF9IQ0FfRVFDX0JBU0VfT0ZGU0VUKTsKKwlNTFg0X0dFVChwYXJhbS0+bG9nX251bV9lcXMsICAgb3V0Ym94LCBJTklUX0hDQV9MT0dfRVFfT0ZGU0VUKTsKKwlNTFg0X0dFVChwYXJhbS0+cmRtYXJjX2Jhc2UsICAgb3V0Ym94LCBJTklUX0hDQV9SRE1BUkNfQkFTRV9PRkZTRVQpOworCU1MWDRfR0VUKHBhcmFtLT5sb2dfcmRfcGVyX3FwLCBvdXRib3gsIElOSVRfSENBX0xPR19SRF9PRkZTRVQpOworCisJLyogbXVsdGljYXN0IGF0dHJpYnV0ZXMgKi8KKworCU1MWDRfR0VUKHBhcmFtLT5tY19iYXNlLCAgICAgICAgIG91dGJveCwgSU5JVF9IQ0FfTUNfQkFTRV9PRkZTRVQpOworCU1MWDRfR0VUKHBhcmFtLT5sb2dfbWNfZW50cnlfc3osIG91dGJveCwKKwkJIElOSVRfSENBX0xPR19NQ19FTlRSWV9TWl9PRkZTRVQpOworCU1MWDRfR0VUKHBhcmFtLT5sb2dfbWNfaGFzaF9zeiwgIG91dGJveCwKKwkJIElOSVRfSENBX0xPR19NQ19IQVNIX1NaX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPmxvZ19tY190YWJsZV9zeiwgb3V0Ym94LAorCQkgSU5JVF9IQ0FfTE9HX01DX1RBQkxFX1NaX09GRlNFVCk7CisKKwkvKiBUUFQgYXR0cmlidXRlcyAqLworCisJTUxYNF9HRVQocGFyYW0tPmRtcHRfYmFzZSwgIG91dGJveCwgSU5JVF9IQ0FfRE1QVF9CQVNFX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPmxvZ19tcHRfc3osIG91dGJveCwgSU5JVF9IQ0FfTE9HX01QVF9TWl9PRkZTRVQpOworCU1MWDRfR0VUKHBhcmFtLT5tdHRfYmFzZSwgICBvdXRib3gsIElOSVRfSENBX01UVF9CQVNFX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPmNtcHRfYmFzZSwgIG91dGJveCwgSU5JVF9IQ0FfQ01QVF9CQVNFX09GRlNFVCk7CisKKwkvKiBVQVIgYXR0cmlidXRlcyAqLworCisJTUxYNF9HRVQocGFyYW0tPnVhcl9wYWdlX3N6LCBvdXRib3gsIElOSVRfSENBX1VBUl9QQUdFX1NaX09GRlNFVCk7CisJTUxYNF9HRVQocGFyYW0tPmxvZ191YXJfc3osIG91dGJveCwgSU5JVF9IQ0FfTE9HX1VBUl9TWl9PRkZTRVQpOworCitvdXQ6CisJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgbWx4NF9JTklUX1BPUlRfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlpbnQgcG9ydCA9IHZoY3ItPmluX21vZGlmaWVyOworCWludCBlcnI7CisKKwlpZiAocHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXS5pbml0X3BvcnRfbWFzayAmICgxIDw8IHBvcnQpKQorCQlyZXR1cm4gMDsKKworCWlmIChkZXYtPmNhcHMucG9ydF9tYXNrW3BvcnRdID09IE1MWDRfUE9SVF9UWVBFX0lCKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIEVuYWJsZSBwb3J0IG9ubHkgaWYgaXQgd2FzIHByZXZpb3VzbHkgZGlzYWJsZWQgKi8KKwlpZiAoIXByaXYtPm1mdW5jLm1hc3Rlci5pbml0X3BvcnRfcmVmW3BvcnRdKSB7CisJCWVyciA9IG1seDRfY21kKGRldiwgMCwgcG9ydCwgMCwgTUxYNF9DTURfSU5JVF9QT1JULAorCQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfTkFUSVZFKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCXByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtzbGF2ZV0uaW5pdF9wb3J0X21hc2sgfD0KKwkJCSgxIDw8IHBvcnQpOworCX0KKwkrK3ByaXYtPm1mdW5jLm1hc3Rlci5pbml0X3BvcnRfcmVmW3BvcnRdOworCXJldHVybiAwOworfQorCiBpbnQgbWx4NF9JTklUX1BPUlQoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0KQogewogCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OwpAQCAtODg2LDMzICsxMjMxLDYyIEBACiAJCU1MWDRfUFVUKGluYm94LCBmaWVsZCwgSU5JVF9QT1JUX01BWF9QS0VZX09GRlNFVCk7CiAKIAkJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIHBvcnQsIDAsIE1MWDRfQ01EX0lOSVRfUE9SVCwKLQkJCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfTkFUSVZFKTsKIAogCQltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKIAl9IGVsc2UKIAkJZXJyID0gbWx4NF9jbWQoZGV2LCAwLCBwb3J0LCAwLCBNTFg0X0NNRF9JTklUX1BPUlQsCi0JCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19BKTsKKwkJCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EsIE1MWDRfQ01EX1dSQVBQRUQpOwogCiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfSU5JVF9QT1JUKTsKIAoraW50IG1seDRfQ0xPU0VfUE9SVF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlpbnQgcG9ydCA9IHZoY3ItPmluX21vZGlmaWVyOworCWludCBlcnI7CisKKwlpZiAoIShwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbc2xhdmVdLmluaXRfcG9ydF9tYXNrICYKKwkgICAgKDEgPDwgcG9ydCkpKQorCQlyZXR1cm4gMDsKKworCWlmIChkZXYtPmNhcHMucG9ydF9tYXNrW3BvcnRdID09IE1MWDRfUE9SVF9UWVBFX0lCKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocHJpdi0+bWZ1bmMubWFzdGVyLmluaXRfcG9ydF9yZWZbcG9ydF0gPT0gMSkgeworCQllcnIgPSBtbHg0X2NtZChkZXYsIDAsIHBvcnQsIDAsIE1MWDRfQ01EX0NMT1NFX1BPUlQsIDEwMDAsCisJCQkgICAgICAgTUxYNF9DTURfTkFUSVZFKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCXByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtzbGF2ZV0uaW5pdF9wb3J0X21hc2sgJj0gfigxIDw8IHBvcnQpOworCS0tcHJpdi0+bWZ1bmMubWFzdGVyLmluaXRfcG9ydF9yZWZbcG9ydF07CisJcmV0dXJuIDA7Cit9CisKIGludCBtbHg0X0NMT1NFX1BPUlQoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0KQogewotCXJldHVybiBtbHg0X2NtZChkZXYsIDAsIHBvcnQsIDAsIE1MWDRfQ01EX0NMT1NFX1BPUlQsIDEwMDApOworCXJldHVybiBtbHg0X2NtZChkZXYsIDAsIHBvcnQsIDAsIE1MWDRfQ01EX0NMT1NFX1BPUlQsIDEwMDAsCisJCQlNTFg0X0NNRF9XUkFQUEVEKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfQ0xPU0VfUE9SVCk7CiAKIGludCBtbHg0X0NMT1NFX0hDQShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHBhbmljKQogewotCXJldHVybiBtbHg0X2NtZChkZXYsIDAsIDAsIHBhbmljLCBNTFg0X0NNRF9DTE9TRV9IQ0EsIDEwMDApOworCXJldHVybiBtbHg0X2NtZChkZXYsIDAsIDAsIHBhbmljLCBNTFg0X0NNRF9DTE9TRV9IQ0EsIDEwMDAsCisJCQlNTFg0X0NNRF9OQVRJVkUpOwogfQogCiBpbnQgbWx4NF9TRVRfSUNNX1NJWkUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU2NCBpY21fc2l6ZSwgdTY0ICphdXhfcGFnZXMpCiB7CiAJaW50IHJldCA9IG1seDRfY21kX2ltbShkZXYsIGljbV9zaXplLCBhdXhfcGFnZXMsIDAsIDAsCiAJCQkgICAgICAgTUxYNF9DTURfU0VUX0lDTV9TSVpFLAotCQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSk7CisJCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9OQVRJVkUpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTkyOSw3ICsxMzAzLDcgQEAKIGludCBtbHg0X05PUChzdHJ1Y3QgbWx4NF9kZXYgKmRldikKIHsKIAkvKiBJbnB1dCBtb2RpZmllciBvZiAweDFmIG1lYW5zICJmaW5pc2ggYXMgc29vbiBhcyBwb3NzaWJsZS4iICovCi0JcmV0dXJuIG1seDRfY21kKGRldiwgMCwgMHgxZiwgMCwgTUxYNF9DTURfTk9QLCAxMDApOworCXJldHVybiBtbHg0X2NtZChkZXYsIDAsIDB4MWYsIDAsIE1MWDRfQ01EX05PUCwgMTAwLCBNTFg0X0NNRF9OQVRJVkUpOwogfQogCiAjZGVmaW5lIE1MWDRfV09MX1NFVFVQX01PREUgKDUgPDwgMjgpCkBAIC05MzgsNyArMTMxMiw4IEBACiAJdTMyIGluX21vZCA9IE1MWDRfV09MX1NFVFVQX01PREUgfCBwb3J0IDw8IDg7CiAKIAlyZXR1cm4gbWx4NF9jbWRfaW1tKGRldiwgMCwgY29uZmlnLCBpbl9tb2QsIDB4MywKLQkJCSAgICBNTFg0X0NNRF9NT0RfU1RBVF9DRkcsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSk7CisJCQkgICAgTUxYNF9DTURfTU9EX1NUQVRfQ0ZHLCBNTFg0X0NNRF9USU1FX0NMQVNTX0EsCisJCQkgICAgTUxYNF9DTURfTkFUSVZFKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfd29sX3JlYWQpOwogCkBAIC05NDcsNiArMTMyMiw2IEBACiAJdTMyIGluX21vZCA9IE1MWDRfV09MX1NFVFVQX01PREUgfCBwb3J0IDw8IDg7CiAKIAlyZXR1cm4gbWx4NF9jbWQoZGV2LCBjb25maWcsIGluX21vZCwgMHgxLCBNTFg0X0NNRF9NT0RfU1RBVF9DRkcsCi0JCQkJCU1MWDRfQ01EX1RJTUVfQ0xBU1NfQSk7CisJCQlNTFg0X0NNRF9USU1FX0NMQVNTX0EsIE1MWDRfQ01EX05BVElWRSk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X3dvbF93cml0ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2Z3LmgKaW5kZXggYmY1ZWMyMi4uMTE5ZTBjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9mdy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvZncuaApAQCAtMTExLDExICsxMTEsMzAgQEAKIAl1NjQgbWF4X2ljbV9zejsKIAlpbnQgbWF4X2dzb19zejsKIAl1OCAgc3VwcG9ydGVkX3BvcnRfdHlwZXNbTUxYNF9NQVhfUE9SVFMgKyAxXTsKKwl1OCAgc3VnZ2VzdGVkX3R5cGVbTUxYNF9NQVhfUE9SVFMgKyAxXTsKKwl1OCAgZGVmYXVsdF9zZW5zZVtNTFg0X01BWF9QT1JUUyArIDFdOwogCXU4ICBsb2dfbWF4X21hY3NbTUxYNF9NQVhfUE9SVFMgKyAxXTsKIAl1OCAgbG9nX21heF92bGFuc1tNTFg0X01BWF9QT1JUUyArIDFdOwogCXUzMiBtYXhfY291bnRlcnM7CiB9OwogCitzdHJ1Y3QgbWx4NF9mdW5jX2NhcCB7CisJdTgJZnVuY3Rpb247CisJdTgJbnVtX3BvcnRzOworCXU4CWZsYWdzOworCXUzMglwZl9jb250ZXh0X2JlaGF2aW91cjsKKwlpbnQJcXBfcXVvdGE7CisJaW50CWNxX3F1b3RhOworCWludAlzcnFfcXVvdGE7CisJaW50CW1wdF9xdW90YTsKKwlpbnQJbXR0X3F1b3RhOworCWludAltYXhfZXE7CisJaW50CXJlc2VydmVkX2VxOworCWludAltY2dfcXVvdGE7CisJdTgJcGh5c2ljYWxfcG9ydFtNTFg0X01BWF9QT1JUUyArIDFdOworCXU4CXBvcnRfZmxhZ3NbTUxYNF9NQVhfUE9SVFMgKyAxXTsKK307CisKIHN0cnVjdCBtbHg0X2FkYXB0ZXIgewogCWNoYXIgYm9hcmRfaWRbTUxYNF9CT0FSRF9JRF9MRU5dOwogCXU4ICAgaW50YV9waW47CkBAIC0xMzMsNiArMTUyLDcgQEAKIAl1NjQgZG1wdF9iYXNlOwogCXU2NCBjbXB0X2Jhc2U7CiAJdTY0IG10dF9iYXNlOworCXU2NCBnbG9iYWxfY2FwczsKIAl1MTYgbG9nX21jX2VudHJ5X3N6OwogCXUxNiBsb2dfbWNfaGFzaF9zejsKIAl1OCAgbG9nX251bV9xcHM7CkBAIC0xNDMsNiArMTYzLDcgQEAKIAl1OCAgbG9nX21jX3RhYmxlX3N6OwogCXU4ICBsb2dfbXB0X3N6OwogCXU4ICBsb2dfdWFyX3N6OworCXU4ICB1YXJfcGFnZV9zejsgLyogbG9nIHBnIHN6IGluIDRrIGNodW5rcyAqLwogfTsKIAogc3RydWN0IG1seDRfaW5pdF9pYl9wYXJhbSB7CkBAIC0xNjcsMTIgKzE4OCwxOSBAQAogfTsKIAogaW50IG1seDRfUVVFUllfREVWX0NBUChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfZGV2X2NhcCAqZGV2X2NhcCk7CitpbnQgbWx4NF9RVUVSWV9GVU5DX0NBUChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfZnVuY19jYXAgKmZ1bmNfY2FwKTsKK2ludCBtbHg0X1FVRVJZX0ZVTkNfQ0FQX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCQlzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCQlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJCXN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOwogaW50IG1seDRfTUFQX0ZBKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9pY20gKmljbSk7CiBpbnQgbWx4NF9VTk1BUF9GQShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CiBpbnQgbWx4NF9SVU5fRlcoc3RydWN0IG1seDRfZGV2ICpkZXYpOwogaW50IG1seDRfUVVFUllfRlcoc3RydWN0IG1seDRfZGV2ICpkZXYpOwogaW50IG1seDRfUVVFUllfQURBUFRFUihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfYWRhcHRlciAqYWRhcHRlcik7CiBpbnQgbWx4NF9JTklUX0hDQShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfaW5pdF9oY2FfcGFyYW0gKnBhcmFtKTsKK2ludCBtbHg0X1FVRVJZX0hDQShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfaW5pdF9oY2FfcGFyYW0gKnBhcmFtKTsKIGludCBtbHg0X0NMT1NFX0hDQShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHBhbmljKTsKIGludCBtbHg0X21hcF9jbWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHUxNiBvcCwgc3RydWN0IG1seDRfaWNtICppY20sIHU2NCB2aXJ0KTsKIGludCBtbHg0X1NFVF9JQ01fU0laRShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTY0IGljbV9zaXplLCB1NjQgKmF1eF9wYWdlcyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2ljbS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9pY20uYwppbmRleCAwMjM5M2ZkLi5hOWFkZTFjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2ljbS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvaWNtLmMKQEAgLTIxMyw3ICsyMTMsNyBAQAogc3RhdGljIGludCBtbHg0X1VOTUFQX0lDTShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTY0IHZpcnQsIHUzMiBwYWdlX2NvdW50KQogewogCXJldHVybiBtbHg0X2NtZChkZXYsIHZpcnQsIHBhZ2VfY291bnQsIDAsIE1MWDRfQ01EX1VOTUFQX0lDTSwKLQkJCU1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7CisJCQlNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX05BVElWRSk7CiB9CiAKIGludCBtbHg0X01BUF9JQ01fQVVYKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9pY20gKmljbSkKQEAgLTIyMyw3ICsyMjMsOCBAQAogCiBpbnQgbWx4NF9VTk1BUF9JQ01fQVVYKHN0cnVjdCBtbHg0X2RldiAqZGV2KQogewotCXJldHVybiBtbHg0X2NtZChkZXYsIDAsIDAsIDAsIE1MWDRfQ01EX1VOTUFQX0lDTV9BVVgsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7CisJcmV0dXJuIG1seDRfY21kKGRldiwgMCwgMCwgMCwgTUxYNF9DTURfVU5NQVBfSUNNX0FVWCwKKwkJCU1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgTUxYNF9DTURfTkFUSVZFKTsKIH0KIAogaW50IG1seDRfdGFibGVfZ2V0KHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9pY21fdGFibGUgKnRhYmxlLCBpbnQgb2JqKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9pbnRmLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2ludGYuYwppbmRleCBjYTZmZWI1Li5iNGU5ZjZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2ludGYuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L2ludGYuYwpAQCAtMTQyLDcgKzE0Miw4IEBACiAJCW1seDRfYWRkX2RldmljZShpbnRmLCBwcml2KTsKIAogCW11dGV4X3VubG9jaygmaW50Zl9tdXRleCk7Ci0JbWx4NF9zdGFydF9jYXRhc19wb2xsKGRldik7CisJaWYgKCFtbHg0X2lzX3NsYXZlKGRldikpCisJCW1seDRfc3RhcnRfY2F0YXNfcG9sbChkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTIsNyArMTUzLDggQEAKIAlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CiAJc3RydWN0IG1seDRfaW50ZXJmYWNlICppbnRmOwogCi0JbWx4NF9zdG9wX2NhdGFzX3BvbGwoZGV2KTsKKwlpZiAoIW1seDRfaXNfc2xhdmUoZGV2KSkKKwkJbWx4NF9zdG9wX2NhdGFzX3BvbGwoZGV2KTsKIAltdXRleF9sb2NrKCZpbnRmX211dGV4KTsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoaW50ZiwgJmludGZfbGlzdCwgbGlzdCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMKaW5kZXggOTRiYmM4NS4uNmJiNjJjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tYWluLmMKQEAgLTQwLDYgKzQwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9pby1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21seDQvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbWx4NC9kb29yYmVsbC5oPgpAQCAtNzUsMjEgKzc2LDQyIEBACiAKICNlbmRpZiAvKiBDT05GSUdfUENJX01TSSAqLwogCitzdGF0aWMgaW50IG51bV92ZnM7Cittb2R1bGVfcGFyYW0obnVtX3ZmcywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0MobnVtX3ZmcywgImVuYWJsZSAjbnVtX3ZmcyBmdW5jdGlvbnMgaWYgbnVtX3ZmcyA+IDAiKTsKKworc3RhdGljIGludCBwcm9iZV92ZjsKK21vZHVsZV9wYXJhbShwcm9iZV92ZiwgaW50LCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MocHJvYmVfdmYsICJudW1iZXIgb2YgdmZzIHRvIHByb2JlIGJ5IHBmIGRyaXZlciAobnVtX3ZmcyA+IDApIik7CisKK2ludCBtbHg0X2xvZ19udW1fbWdtX2VudHJ5X3NpemUgPSAxMDsKK21vZHVsZV9wYXJhbV9uYW1lZChsb2dfbnVtX21nbV9lbnRyeV9zaXplLAorCQkJbWx4NF9sb2dfbnVtX21nbV9lbnRyeV9zaXplLCBpbnQsIDA0NDQpOworTU9EVUxFX1BBUk1fREVTQyhsb2dfbnVtX21nbV9lbnRyeV9zaXplLCAibG9nIG1nbSBzaXplLCB0aGF0IGRlZmluZXMgdGhlIG51bSIKKwkJCQkJICIgb2YgcXAgcGVyIG1jZywgZm9yIGV4YW1wbGU6IgorCQkJCQkgIiAxMCBnaXZlcyAyNDgucmFuZ2U6IDk8PSIKKwkJCQkJICIgbG9nX251bV9tZ21fZW50cnlfc2l6ZSA8PSAxMiIpOworCisjZGVmaW5lIE1MWDRfVkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKworI2RlZmluZSBIQ0FfR0xPQkFMX0NBUF9NQVNLICAgICAgICAgICAgMAorI2RlZmluZSBQRl9DT05URVhUX0JFSEFWSU9VUl9NQVNLICAgICAgMAorCiBzdGF0aWMgY2hhciBtbHg0X3ZlcnNpb25bXSBfX2RldmluaXRkYXRhID0KIAlEUlZfTkFNRSAiOiBNZWxsYW5veCBDb25uZWN0WCBjb3JlIGRyaXZlciB2IgogCURSVl9WRVJTSU9OICIgKCIgRFJWX1JFTERBVEUgIilcbiI7CiAKIHN0YXRpYyBzdHJ1Y3QgbWx4NF9wcm9maWxlIGRlZmF1bHRfcHJvZmlsZSA9IHsKLQkubnVtX3FwCQk9IDEgPDwgMTcsCisJLm51bV9xcAkJPSAxIDw8IDE4LAogCS5udW1fc3JxCT0gMSA8PCAxNiwKIAkucmRtYXJjX3Blcl9xcAk9IDEgPDwgNCwKIAkubnVtX2NxCQk9IDEgPDwgMTYsCiAJLm51bV9tY2cJPSAxIDw8IDEzLAotCS5udW1fbXB0CT0gMSA8PCAxNywKKwkubnVtX21wdAk9IDEgPDwgMTksCiAJLm51bV9tdHQJPSAxIDw8IDIwLAogfTsKIAotc3RhdGljIGludCBsb2dfbnVtX21hYyA9IDI7CitzdGF0aWMgaW50IGxvZ19udW1fbWFjID0gNzsKIG1vZHVsZV9wYXJhbV9uYW1lZChsb2dfbnVtX21hYywgbG9nX251bV9tYWMsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGxvZ19udW1fbWFjLCAiTG9nMiBtYXggbnVtYmVyIG9mIE1BQ3MgcGVyIEVUSCBwb3J0ICgxLTcpIik7CiAKQEAgLTk5LDE1ICsxMjEsMzMgQEAKIC8qIExvZzIgbWF4IG51bWJlciBvZiBWTEFOcyBwZXIgRVRIIHBvcnQgKDAtNykgKi8KICNkZWZpbmUgTUxYNF9MT0dfTlVNX1ZMQU5TIDcKIAotc3RhdGljIGludCB1c2VfcHJpbzsKK3N0YXRpYyBib29sIHVzZV9wcmlvOwogbW9kdWxlX3BhcmFtX25hbWVkKHVzZV9wcmlvLCB1c2VfcHJpbywgYm9vbCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHVzZV9wcmlvLCAiRW5hYmxlIHN0ZWVyaW5nIGJ5IFZMQU4gcHJpb3JpdHkgb24gRVRIIHBvcnRzICIKIAkJICAiKDAvMSwgZGVmYXVsdCAwKSIpOwogCi1zdGF0aWMgaW50IGxvZ19tdHRzX3Blcl9zZWcgPSBpbG9nMihNTFg0X01UVF9FTlRSWV9QRVJfU0VHKTsKK2ludCBsb2dfbXR0c19wZXJfc2VnID0gaWxvZzIoTUxYNF9NVFRfRU5UUllfUEVSX1NFRyk7CiBtb2R1bGVfcGFyYW1fbmFtZWQobG9nX210dHNfcGVyX3NlZywgbG9nX210dHNfcGVyX3NlZywgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0MobG9nX210dHNfcGVyX3NlZywgIkxvZzIgbnVtYmVyIG9mIE1UVCBlbnRyaWVzIHBlciBzZWdtZW50ICgxLTcpIik7CiAKK3N0YXRpYyBpbnQgcG9ydF90eXBlX2FycmF5WzJdID0ge01MWDRfUE9SVF9UWVBFX05PTkUsIE1MWDRfUE9SVF9UWVBFX05PTkV9Oworc3RhdGljIGludCBhcnJfYXJnYyA9IDI7Cittb2R1bGVfcGFyYW1fYXJyYXkocG9ydF90eXBlX2FycmF5LCBpbnQsICZhcnJfYXJnYywgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHBvcnRfdHlwZV9hcnJheSwgIkFycmF5IG9mIHBvcnQgdHlwZXM6IEhXX0RFRkFVTFQgKDApIGlzIGRlZmF1bHQgIgorCQkJCSIxIGZvciBJQiwgMiBmb3IgRXRoZXJuZXQiKTsKKworc3RydWN0IG1seDRfcG9ydF9jb25maWcgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwllbnVtIG1seDRfcG9ydF90eXBlIHBvcnRfdHlwZVtNTFg0X01BWF9QT1JUUyArIDFdOworCXN0cnVjdCBwY2lfZGV2ICpwZGV2OworfTsKKworc3RhdGljIGlubGluZSBpbnQgbWx4NF9tYXN0ZXJfZ2V0X251bV9lcXMoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJcmV0dXJuIGRldi0+Y2Fwcy5yZXNlcnZlZF9lcXMgKworCQlNTFg0X01GVU5DX0VRX05VTSAqIChkZXYtPm51bV9zbGF2ZXMgKyAxKTsKK30KKwogaW50IG1seDRfY2hlY2tfcG9ydF9wYXJhbXMoc3RydWN0IG1seDRfZGV2ICpkZXYsCiAJCQkgICBlbnVtIG1seDRfcG9ydF90eXBlICpwb3J0X3R5cGUpCiB7CkBAIC0xNDAsMTAgKzE4MCw4IEBACiB7CiAJaW50IGk7CiAKLQlkZXYtPmNhcHMucG9ydF9tYXNrID0gMDsKIAlmb3IgKGkgPSAxOyBpIDw9IGRldi0+Y2Fwcy5udW1fcG9ydHM7ICsraSkKLQkJaWYgKGRldi0+Y2Fwcy5wb3J0X3R5cGVbaV0gPT0gTUxYNF9QT1JUX1RZUEVfSUIpCi0JCQlkZXYtPmNhcHMucG9ydF9tYXNrIHw9IDEgPDwgKGkgLSAxKTsKKwkJZGV2LT5jYXBzLnBvcnRfbWFza1tpXSA9IGRldi0+Y2Fwcy5wb3J0X3R5cGVbaV07CiB9CiAKIHN0YXRpYyBpbnQgbWx4NF9kZXZfY2FwKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9kZXZfY2FwICpkZXZfY2FwKQpAQCAtMTg4LDEyICsyMjYsMTUgQEAKIAkJZGV2LT5jYXBzLmV0aF9tdHVfY2FwW2ldICAgID0gZGV2X2NhcC0+ZXRoX210dVtpXTsKIAkJZGV2LT5jYXBzLmRlZl9tYWNbaV0gICAgICAgID0gZGV2X2NhcC0+ZGVmX21hY1tpXTsKIAkJZGV2LT5jYXBzLnN1cHBvcnRlZF90eXBlW2ldID0gZGV2X2NhcC0+c3VwcG9ydGVkX3BvcnRfdHlwZXNbaV07CisJCWRldi0+Y2Fwcy5zdWdnZXN0ZWRfdHlwZVtpXSA9IGRldl9jYXAtPnN1Z2dlc3RlZF90eXBlW2ldOworCQlkZXYtPmNhcHMuZGVmYXVsdF9zZW5zZVtpXSA9IGRldl9jYXAtPmRlZmF1bHRfc2Vuc2VbaV07CiAJCWRldi0+Y2Fwcy50cmFuc190eXBlW2ldCSAgICA9IGRldl9jYXAtPnRyYW5zX3R5cGVbaV07CiAJCWRldi0+Y2Fwcy52ZW5kb3Jfb3VpW2ldICAgICA9IGRldl9jYXAtPnZlbmRvcl9vdWlbaV07CiAJCWRldi0+Y2Fwcy53YXZlbGVuZ3RoW2ldICAgICA9IGRldl9jYXAtPndhdmVsZW5ndGhbaV07CiAJCWRldi0+Y2Fwcy50cmFuc19jb2RlW2ldICAgICA9IGRldl9jYXAtPnRyYW5zX2NvZGVbaV07CiAJfQogCisJZGV2LT5jYXBzLnVhcl9wYWdlX3NpemUJICAgICA9IFBBR0VfU0laRTsKIAlkZXYtPmNhcHMubnVtX3VhcnMJICAgICA9IGRldl9jYXAtPnVhcl9zaXplIC8gUEFHRV9TSVpFOwogCWRldi0+Y2Fwcy5sb2NhbF9jYV9hY2tfZGVsYXkgPSBkZXZfY2FwLT5sb2NhbF9jYV9hY2tfZGVsYXk7CiAJZGV2LT5jYXBzLmJmX3JlZ19zaXplCSAgICAgPSBkZXZfY2FwLT5iZl9yZWdfc2l6ZTsKQEAgLTIwNyw3ICsyNDgsNyBAQAogCWRldi0+Y2Fwcy5yZXNlcnZlZF9zcnFzCSAgICAgPSBkZXZfY2FwLT5yZXNlcnZlZF9zcnFzOwogCWRldi0+Y2Fwcy5tYXhfc3FfZGVzY19zeiAgICAgPSBkZXZfY2FwLT5tYXhfc3FfZGVzY19zejsKIAlkZXYtPmNhcHMubWF4X3JxX2Rlc2Nfc3ogICAgID0gZGV2X2NhcC0+bWF4X3JxX2Rlc2Nfc3o7Ci0JZGV2LT5jYXBzLm51bV9xcF9wZXJfbWdtICAgICA9IE1MWDRfUVBfUEVSX01HTTsKKwlkZXYtPmNhcHMubnVtX3FwX3Blcl9tZ20gICAgID0gbWx4NF9nZXRfcXBfcGVyX21nbShkZXYpOwogCS8qCiAJICogU3VidHJhY3QgMSBmcm9tIHRoZSBsaW1pdCBiZWNhdXNlIHdlIG5lZWQgdG8gYWxsb2NhdGUgYQogCSAqIHNwYXJlIENRRSBzbyB0aGUgSENBIEhXIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYW4KQEAgLTIxNiwxNyArMjU3LDE4IEBACiAJZGV2LT5jYXBzLm1heF9jcWVzCSAgICAgPSBkZXZfY2FwLT5tYXhfY3Ffc3ogLSAxOwogCWRldi0+Y2Fwcy5yZXNlcnZlZF9jcXMJICAgICA9IGRldl9jYXAtPnJlc2VydmVkX2NxczsKIAlkZXYtPmNhcHMucmVzZXJ2ZWRfZXFzCSAgICAgPSBkZXZfY2FwLT5yZXNlcnZlZF9lcXM7Ci0JZGV2LT5jYXBzLm10dHNfcGVyX3NlZwkgICAgID0gMSA8PCBsb2dfbXR0c19wZXJfc2VnOwotCWRldi0+Y2Fwcy5yZXNlcnZlZF9tdHRzCSAgICAgPSBESVZfUk9VTkRfVVAoZGV2X2NhcC0+cmVzZXJ2ZWRfbXR0cywKLQkJCQkJCSAgICBkZXYtPmNhcHMubXR0c19wZXJfc2VnKTsKKwlkZXYtPmNhcHMucmVzZXJ2ZWRfbXR0cyAgICAgID0gZGV2X2NhcC0+cmVzZXJ2ZWRfbXR0czsKIAlkZXYtPmNhcHMucmVzZXJ2ZWRfbXJ3cwkgICAgID0gZGV2X2NhcC0+cmVzZXJ2ZWRfbXJ3czsKLQlkZXYtPmNhcHMucmVzZXJ2ZWRfdWFycwkgICAgID0gZGV2X2NhcC0+cmVzZXJ2ZWRfdWFyczsKKworCS8qIFRoZSBmaXJzdCAxMjggVUFScyBhcmUgdXNlZCBmb3IgRVEgZG9vcmJlbGxzICovCisJZGV2LT5jYXBzLnJlc2VydmVkX3VhcnMJICAgICA9IG1heF90KGludCwgMTI4LCBkZXZfY2FwLT5yZXNlcnZlZF91YXJzKTsKIAlkZXYtPmNhcHMucmVzZXJ2ZWRfcGRzCSAgICAgPSBkZXZfY2FwLT5yZXNlcnZlZF9wZHM7CiAJZGV2LT5jYXBzLnJlc2VydmVkX3hyY2RzICAgICA9IChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19YUkMpID8KIAkJCQkJZGV2X2NhcC0+cmVzZXJ2ZWRfeHJjZHMgOiAwOwogCWRldi0+Y2Fwcy5tYXhfeHJjZHMgICAgICAgICAgPSAoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfWFJDKSA/CiAJCQkJCWRldl9jYXAtPm1heF94cmNkcyA6IDA7Ci0JZGV2LT5jYXBzLm10dF9lbnRyeV9zegkgICAgID0gZGV2LT5jYXBzLm10dHNfcGVyX3NlZyAqIGRldl9jYXAtPm10dF9lbnRyeV9zejsKKwlkZXYtPmNhcHMubXR0X2VudHJ5X3N6ICAgICAgID0gZGV2X2NhcC0+bXR0X2VudHJ5X3N6OworCiAJZGV2LT5jYXBzLm1heF9tc2dfc3ogICAgICAgICA9IGRldl9jYXAtPm1heF9tc2dfc3o7CiAJZGV2LT5jYXBzLnBhZ2Vfc2l6ZV9jYXAJICAgICA9IH4odTMyKSAoZGV2X2NhcC0+bWluX3BhZ2Vfc3ogLSAxKTsKIAlkZXYtPmNhcHMuZmxhZ3MJCSAgICAgPSBkZXZfY2FwLT5mbGFnczsKQEAgLTIzNSwxOCArMjc3LDcwIEBACiAJZGV2LT5jYXBzLnN0YXRfcmF0ZV9zdXBwb3J0ICA9IGRldl9jYXAtPnN0YXRfcmF0ZV9zdXBwb3J0OwogCWRldi0+Y2Fwcy5tYXhfZ3NvX3N6CSAgICAgPSBkZXZfY2FwLT5tYXhfZ3NvX3N6OwogCisJLyogU2Vuc2UgcG9ydCBhbHdheXMgYWxsb3dlZCBvbiBzdXBwb3J0ZWQgZGV2aWNlcyBmb3IgQ29ubmVjdFgxIGFuZCAyICovCisJaWYgKGRldi0+cGRldi0+ZGV2aWNlICE9IDB4MTAwMykKKwkJZGV2LT5jYXBzLmZsYWdzIHw9IE1MWDRfREVWX0NBUF9GTEFHX1NFTlNFX1NVUFBPUlQ7CisKIAlkZXYtPmNhcHMubG9nX251bV9tYWNzICA9IGxvZ19udW1fbWFjOwogCWRldi0+Y2Fwcy5sb2dfbnVtX3ZsYW5zID0gTUxYNF9MT0dfTlVNX1ZMQU5TOwogCWRldi0+Y2Fwcy5sb2dfbnVtX3ByaW9zID0gdXNlX3ByaW8gPyAzIDogMDsKIAogCWZvciAoaSA9IDE7IGkgPD0gZGV2LT5jYXBzLm51bV9wb3J0czsgKytpKSB7Ci0JCWlmIChkZXYtPmNhcHMuc3VwcG9ydGVkX3R5cGVbaV0gIT0gTUxYNF9QT1JUX1RZUEVfRVRIKQotCQkJZGV2LT5jYXBzLnBvcnRfdHlwZVtpXSA9IE1MWDRfUE9SVF9UWVBFX0lCOwotCQllbHNlCi0JCQlkZXYtPmNhcHMucG9ydF90eXBlW2ldID0gTUxYNF9QT1JUX1RZUEVfRVRIOwotCQlkZXYtPmNhcHMucG9zc2libGVfdHlwZVtpXSA9IGRldi0+Y2Fwcy5wb3J0X3R5cGVbaV07CisJCWRldi0+Y2Fwcy5wb3J0X3R5cGVbaV0gPSBNTFg0X1BPUlRfVFlQRV9OT05FOworCQlpZiAoZGV2LT5jYXBzLnN1cHBvcnRlZF90eXBlW2ldKSB7CisJCQkvKiBpZiBvbmx5IEVUSCBpcyBzdXBwb3J0ZWQgLSBhc3NpZ24gRVRIICovCisJCQlpZiAoZGV2LT5jYXBzLnN1cHBvcnRlZF90eXBlW2ldID09IE1MWDRfUE9SVF9UWVBFX0VUSCkKKwkJCQlkZXYtPmNhcHMucG9ydF90eXBlW2ldID0gTUxYNF9QT1JUX1RZUEVfRVRIOworCQkJLyogaWYgb25seSBJQiBpcyBzdXBwb3J0ZWQsCisJCQkgKiBhc3NpZ24gSUIgb25seSBpZiBTUklPViBpcyBvZmYqLworCQkJZWxzZSBpZiAoZGV2LT5jYXBzLnN1cHBvcnRlZF90eXBlW2ldID09CisJCQkJIE1MWDRfUE9SVF9UWVBFX0lCKSB7CisJCQkJaWYgKGRldi0+ZmxhZ3MgJiBNTFg0X0ZMQUdfU1JJT1YpCisJCQkJCWRldi0+Y2Fwcy5wb3J0X3R5cGVbaV0gPQorCQkJCQkJTUxYNF9QT1JUX1RZUEVfTk9ORTsKKwkJCQllbHNlCisJCQkJCWRldi0+Y2Fwcy5wb3J0X3R5cGVbaV0gPQorCQkJCQkJTUxYNF9QT1JUX1RZUEVfSUI7CisJCQkvKiBpZiBJQiBhbmQgRVRIIGFyZSBzdXBwb3J0ZWQsCisJCQkgKiBmaXJzdCBvZiBhbGwgY2hlY2sgaWYgU1JJT1YgaXMgb24gKi8KKwkJCX0gZWxzZSBpZiAoZGV2LT5mbGFncyAmIE1MWDRfRkxBR19TUklPVikKKwkJCQlkZXYtPmNhcHMucG9ydF90eXBlW2ldID0gTUxYNF9QT1JUX1RZUEVfRVRIOworCQkJZWxzZSB7CisJCQkJLyogSW4gbm9uLVNSSU9WIG1vZGUsIHdlIHNldCB0aGUgcG9ydCB0eXBlCisJCQkJICogYWNjb3JkaW5nIHRvIHVzZXIgc2VsZWN0aW9uIG9mIHBvcnQgdHlwZSwKKwkJCQkgKiBpZiB1c2VyZSBzZWxlY3RlZCBub25lLCB0YWtlIHRoZSBGVyBoaW50ICovCisJCQkJaWYgKHBvcnRfdHlwZV9hcnJheVtpLTFdID09IE1MWDRfUE9SVF9UWVBFX05PTkUpCisJCQkJCWRldi0+Y2Fwcy5wb3J0X3R5cGVbaV0gPSBkZXYtPmNhcHMuc3VnZ2VzdGVkX3R5cGVbaV0gPworCQkJCQkJTUxYNF9QT1JUX1RZUEVfRVRIIDogTUxYNF9QT1JUX1RZUEVfSUI7CisJCQkJZWxzZQorCQkJCQlkZXYtPmNhcHMucG9ydF90eXBlW2ldID0gcG9ydF90eXBlX2FycmF5W2ktMV07CisJCQl9CisJCX0KKwkJLyoKKwkJICogTGluayBzZW5zaW5nIGlzIGFsbG93ZWQgb24gdGhlIHBvcnQgaWYgMyBjb25kaXRpb25zIGFyZSB0cnVlOgorCQkgKiAxLiBCb3RoIHByb3RvY29scyBhcmUgc3VwcG9ydGVkIG9uIHRoZSBwb3J0LgorCQkgKiAyLiBEaWZmZXJlbnQgdHlwZXMgYXJlIHN1cHBvcnRlZCBvbiB0aGUgcG9ydAorCQkgKiAzLiBGVyBkZWNsYXJlZCB0aGF0IGl0IHN1cHBvcnRzIGxpbmsgc2Vuc2luZworCQkgKi8KIAkJbWx4NF9wcml2KGRldiktPnNlbnNlLnNlbnNlX2FsbG93ZWRbaV0gPQotCQkJZGV2LT5jYXBzLnN1cHBvcnRlZF90eXBlW2ldID09IE1MWDRfUE9SVF9UWVBFX0FVVE87CisJCQkoKGRldi0+Y2Fwcy5zdXBwb3J0ZWRfdHlwZVtpXSA9PSBNTFg0X1BPUlRfVFlQRV9BVVRPKSAmJgorCQkJIChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19EUERQKSAmJgorCQkJIChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19TRU5TRV9TVVBQT1JUKSk7CisKKwkJLyoKKwkJICogSWYgImRlZmF1bHRfc2Vuc2UiIGJpdCBpcyBzZXQsIHdlIG1vdmUgdGhlIHBvcnQgdG8gIkFVVE8iIG1vZGUKKwkJICogYW5kIHBlcmZvcm0gc2Vuc2VfcG9ydCBGVyBjb21tYW5kIHRvIHRyeSBhbmQgc2V0IHRoZSBjb3JyZWN0CisJCSAqIHBvcnQgdHlwZSBmcm9tIGJlZ2lubmluZworCQkgKi8KKwkJaWYgKG1seDRfcHJpdihkZXYpLT5zZW5zZS5zZW5zZV9hbGxvd2VkW2ldICYmIGRldi0+Y2Fwcy5kZWZhdWx0X3NlbnNlW2ldKSB7CisJCQllbnVtIG1seDRfcG9ydF90eXBlIHNlbnNlZF9wb3J0ID0gTUxYNF9QT1JUX1RZUEVfTk9ORTsKKwkJCWRldi0+Y2Fwcy5wb3NzaWJsZV90eXBlW2ldID0gTUxYNF9QT1JUX1RZUEVfQVVUTzsKKwkJCW1seDRfU0VOU0VfUE9SVChkZXYsIGksICZzZW5zZWRfcG9ydCk7CisJCQlpZiAoc2Vuc2VkX3BvcnQgIT0gTUxYNF9QT1JUX1RZUEVfTk9ORSkKKwkJCQlkZXYtPmNhcHMucG9ydF90eXBlW2ldID0gc2Vuc2VkX3BvcnQ7CisJCX0gZWxzZSB7CisJCQlkZXYtPmNhcHMucG9zc2libGVfdHlwZVtpXSA9IGRldi0+Y2Fwcy5wb3J0X3R5cGVbaV07CisJCX0KIAogCQlpZiAoZGV2LT5jYXBzLmxvZ19udW1fbWFjcyA+IGRldl9jYXAtPmxvZ19tYXhfbWFjc1tpXSkgewogCQkJZGV2LT5jYXBzLmxvZ19udW1fbWFjcyA9IGRldl9jYXAtPmxvZ19tYXhfbWFjc1tpXTsKQEAgLTI2Miw4ICszNTYsNiBAQAogCQl9CiAJfQogCi0JbWx4NF9zZXRfcG9ydF9tYXNrKGRldik7Ci0KIAlkZXYtPmNhcHMubWF4X2NvdW50ZXJzID0gMSA8PCBpbG9nMihkZXZfY2FwLT5tYXhfY291bnRlcnMpOwogCiAJZGV2LT5jYXBzLnJlc2VydmVkX3Fwc19jbnRbTUxYNF9RUF9SRUdJT05fRlddID0gZGV2X2NhcC0+cmVzZXJ2ZWRfcXBzOwpAQCAtMjgyLDYgKzM3NCwxNDkgQEAKIAogCXJldHVybiAwOwogfQorLypUaGUgZnVuY3Rpb24gY2hlY2tzIGlmIHRoZXJlIGFyZSBsaXZlIHZmLCByZXR1cm4gdGhlIG51bSBvZiB0aGVtKi8KK3N0YXRpYyBpbnQgbWx4NF9ob3dfbWFueV9saXZlc192ZihzdHJ1Y3QgbWx4NF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfc2xhdmVfc3RhdGUgKnNfc3RhdGU7CisJaW50IGk7CisJaW50IHJldCA9IDA7CisKKwlmb3IgKGkgPSAxLyp0aGUgcHBmIGlzIDAqLzsgaSA8IGRldi0+bnVtX3NsYXZlczsgKytpKSB7CisJCXNfc3RhdGUgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW2ldOworCQlpZiAoc19zdGF0ZS0+YWN0aXZlICYmIHNfc3RhdGUtPmxhc3RfY21kICE9CisJCSAgICBNTFg0X0NPTU1fQ01EX1JFU0VUKSB7CisJCQltbHg0X3dhcm4oZGV2LCAiJXM6IHNsYXZlOiAlZCBpcyBzdGlsbCBhY3RpdmVcbiIsCisJCQkJICBfX2Z1bmNfXywgaSk7CisJCQlyZXQrKzsKKwkJfQorCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IG1seDRfaXNfc2xhdmVfYWN0aXZlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3NsYXZlX3N0YXRlICpzX3NsYXZlOworCisJaWYgKCFtbHg0X2lzX21hc3RlcihkZXYpKQorCQlyZXR1cm4gMDsKKworCXNfc2xhdmUgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXTsKKwlyZXR1cm4gISFzX3NsYXZlLT5hY3RpdmU7Cit9CitFWFBPUlRfU1lNQk9MKG1seDRfaXNfc2xhdmVfYWN0aXZlKTsKKworc3RhdGljIGludCBtbHg0X3NsYXZlX2NhcChzdHJ1Y3QgbWx4NF9kZXYgKmRldikKK3sKKwlpbnQJCQkgICBlcnI7CisJdTMyCQkJICAgcGFnZV9zaXplOworCXN0cnVjdCBtbHg0X2Rldl9jYXAJICAgZGV2X2NhcDsKKwlzdHJ1Y3QgbWx4NF9mdW5jX2NhcAkgICBmdW5jX2NhcDsKKwlzdHJ1Y3QgbWx4NF9pbml0X2hjYV9wYXJhbSBoY2FfcGFyYW07CisJaW50CQkJICAgaTsKKworCW1lbXNldCgmaGNhX3BhcmFtLCAwLCBzaXplb2YoaGNhX3BhcmFtKSk7CisJZXJyID0gbWx4NF9RVUVSWV9IQ0EoZGV2LCAmaGNhX3BhcmFtKTsKKwlpZiAoZXJyKSB7CisJCW1seDRfZXJyKGRldiwgIlFVRVJZX0hDQSBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKmZhaWwgaWYgdGhlIGhjYSBoYXMgYW4gdW5rbm93biBjYXBhYmlsaXR5ICovCisJaWYgKChoY2FfcGFyYW0uZ2xvYmFsX2NhcHMgfCBIQ0FfR0xPQkFMX0NBUF9NQVNLKSAhPQorCSAgICBIQ0FfR0xPQkFMX0NBUF9NQVNLKSB7CisJCW1seDRfZXJyKGRldiwgIlVua25vd24gaGNhIGdsb2JhbCBjYXBhYmlsaXRpZXNcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwltbHg0X2xvZ19udW1fbWdtX2VudHJ5X3NpemUgPSBoY2FfcGFyYW0ubG9nX21jX2VudHJ5X3N6OworCisJbWVtc2V0KCZkZXZfY2FwLCAwLCBzaXplb2YoZGV2X2NhcCkpOworCWVyciA9IG1seDRfZGV2X2NhcChkZXYsICZkZXZfY2FwKTsKKwlpZiAoZXJyKSB7CisJCW1seDRfZXJyKGRldiwgIlFVRVJZX0RFVl9DQVAgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJcGFnZV9zaXplID0gfmRldi0+Y2Fwcy5wYWdlX3NpemVfY2FwICsgMTsKKwltbHg0X3dhcm4oZGV2LCAiSENBIG1pbmltdW0gcGFnZSBzaXplOiVkXG4iLCBwYWdlX3NpemUpOworCWlmIChwYWdlX3NpemUgPiBQQUdFX1NJWkUpIHsKKwkJbWx4NF9lcnIoZGV2LCAiSENBIG1pbmltdW0gcGFnZSBzaXplIG9mICVkIGJpZ2dlciB0aGFuICIKKwkJCSAia2VybmVsIFBBR0VfU0laRSBvZiAlbGQsIGFib3J0aW5nLlxuIiwKKwkJCSBwYWdlX3NpemUsIFBBR0VfU0laRSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIHNsYXZlIGdldHMgdWFyIHBhZ2Ugc2l6ZSBmcm9tIFFVRVJZX0hDQSBmdyBjb21tYW5kICovCisJZGV2LT5jYXBzLnVhcl9wYWdlX3NpemUgPSAxIDw8IChoY2FfcGFyYW0udWFyX3BhZ2Vfc3ogKyAxMik7CisKKwkvKiBUT0RPOiByZWxheCB0aGlzIGFzc3VtcHRpb24gKi8KKwlpZiAoZGV2LT5jYXBzLnVhcl9wYWdlX3NpemUgIT0gUEFHRV9TSVpFKSB7CisJCW1seDRfZXJyKGRldiwgIlVBUiBzaXplOiVkICE9IGtlcm5lbCBQQUdFX1NJWkUgb2YgJWxkXG4iLAorCQkJIGRldi0+Y2Fwcy51YXJfcGFnZV9zaXplLCBQQUdFX1NJWkUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltZW1zZXQoJmZ1bmNfY2FwLCAwLCBzaXplb2YoZnVuY19jYXApKTsKKwllcnIgPSBtbHg0X1FVRVJZX0ZVTkNfQ0FQKGRldiwgJmZ1bmNfY2FwKTsKKwlpZiAoZXJyKSB7CisJCW1seDRfZXJyKGRldiwgIlFVRVJZX0ZVTkNfQ0FQIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZnVuY19jYXAucGZfY29udGV4dF9iZWhhdmlvdXIgfCBQRl9DT05URVhUX0JFSEFWSU9VUl9NQVNLKSAhPQorCSAgICBQRl9DT05URVhUX0JFSEFWSU9VUl9NQVNLKSB7CisJCW1seDRfZXJyKGRldiwgIlVua25vd24gcGYgY29udGV4dCBiZWhhdmlvdXJcbiIpOworCQlyZXR1cm4gLUVOT1NZUzsKKwl9CisKKwlkZXYtPmNhcHMuZnVuY3Rpb24JCT0gZnVuY19jYXAuZnVuY3Rpb247CisJZGV2LT5jYXBzLm51bV9wb3J0cwkJPSBmdW5jX2NhcC5udW1fcG9ydHM7CisJZGV2LT5jYXBzLm51bV9xcHMJCT0gZnVuY19jYXAucXBfcXVvdGE7CisJZGV2LT5jYXBzLm51bV9zcnFzCQk9IGZ1bmNfY2FwLnNycV9xdW90YTsKKwlkZXYtPmNhcHMubnVtX2NxcwkJPSBmdW5jX2NhcC5jcV9xdW90YTsKKwlkZXYtPmNhcHMubnVtX2VxcyAgICAgICAgICAgICAgID0gZnVuY19jYXAubWF4X2VxOworCWRldi0+Y2Fwcy5yZXNlcnZlZF9lcXMgICAgICAgICAgPSBmdW5jX2NhcC5yZXNlcnZlZF9lcTsKKwlkZXYtPmNhcHMubnVtX21wdHMJCT0gZnVuY19jYXAubXB0X3F1b3RhOworCWRldi0+Y2Fwcy5udW1fbXR0cwkJPSBmdW5jX2NhcC5tdHRfcXVvdGE7CisJZGV2LT5jYXBzLm51bV9wZHMgICAgICAgICAgICAgICA9IE1MWDRfTlVNX1BEUzsKKwlkZXYtPmNhcHMubnVtX21nbXMgICAgICAgICAgICAgID0gMDsKKwlkZXYtPmNhcHMubnVtX2FtZ21zICAgICAgICAgICAgID0gMDsKKworCWZvciAoaSA9IDE7IGkgPD0gZGV2LT5jYXBzLm51bV9wb3J0czsgKytpKQorCQlkZXYtPmNhcHMucG9ydF9tYXNrW2ldID0gZGV2LT5jYXBzLnBvcnRfdHlwZVtpXTsKKworCWlmIChkZXYtPmNhcHMubnVtX3BvcnRzID4gTUxYNF9NQVhfUE9SVFMpIHsKKwkJbWx4NF9lcnIoZGV2LCAiSENBIGhhcyAlZCBwb3J0cywgYnV0IHdlIG9ubHkgc3VwcG9ydCAlZCwgIgorCQkJICJhYm9ydGluZy5cbiIsIGRldi0+Y2Fwcy5udW1fcG9ydHMsIE1MWDRfTUFYX1BPUlRTKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKGRldi0+Y2Fwcy51YXJfcGFnZV9zaXplICogKGRldi0+Y2Fwcy5udW1fdWFycyAtCisJCQkJICAgICAgIGRldi0+Y2Fwcy5yZXNlcnZlZF91YXJzKSA+CisJCQkJICAgICAgIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAyKSkgeworCQltbHg0X2VycihkZXYsICJIQ0EgcmVwb3J0ZWQgVUFSIHJlZ2lvbiBzaXplIG9mIDB4JXggYmlnZ2VyIHRoYW4gIgorCQkJICJQQ0kgcmVzb3VyY2UgMiBzaXplIG9mIDB4JWxseCwgYWJvcnRpbmcuXG4iLAorCQkJIGRldi0+Y2Fwcy51YXJfcGFnZV9zaXplICogZGV2LT5jYXBzLm51bV91YXJzLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIHBjaV9yZXNvdXJjZV9sZW4oZGV2LT5wZGV2LCAyKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworI2lmIDAKKwltbHg0X3dhcm4oZGV2LCAic3FwX2RlbXV4OiVkXG4iLCBkZXYtPmNhcHMuc3FwX2RlbXV4KTsKKwltbHg0X3dhcm4oZGV2LCAibnVtX3VhcnM6JWQgcmVzZXJ2ZWRfdWFyczolZCB1YXIgcmVnaW9uOjB4JXggYmFyMjoweCVsbHhcbiIsCisJCSAgZGV2LT5jYXBzLm51bV91YXJzLCBkZXYtPmNhcHMucmVzZXJ2ZWRfdWFycywKKwkJICBkZXYtPmNhcHMudWFyX3BhZ2Vfc2l6ZSAqIGRldi0+Y2Fwcy5udW1fdWFycywKKwkJICBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMikpOworCW1seDRfd2FybihkZXYsICJudW1fZXFzOiVkIHJlc2VydmVkX2VxczolZFxuIiwgZGV2LT5jYXBzLm51bV9lcXMsCisJCSAgZGV2LT5jYXBzLnJlc2VydmVkX2Vxcyk7CisJbWx4NF93YXJuKGRldiwgIm51bV9wZHM6JWQgcmVzZXJ2ZWRfcGRzOiVkIHNsYXZlX3BkX3NoaWZ0OiVkIHBkX2Jhc2U6JWRcbiIsCisJCSAgZGV2LT5jYXBzLm51bV9wZHMsIGRldi0+Y2Fwcy5yZXNlcnZlZF9wZHMsCisJCSAgZGV2LT5jYXBzLnNsYXZlX3BkX3NoaWZ0LCBkZXYtPmNhcHMucGRfYmFzZSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KIAogLyoKICAqIENoYW5nZSB0aGUgcG9ydCBjb25maWd1cmF0aW9uIG9mIHRoZSBkZXZpY2UuCkBAIC0zNzcsNyArNjEyLDggQEAKIAkJCXR5cGVzW2ldID0gbWRldi0+Y2Fwcy5wb3J0X3R5cGVbaSsxXTsKIAl9CiAKLQlpZiAoIShtZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfRFBEUCkpIHsKKwlpZiAoIShtZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfRFBEUCkgJiYKKwkgICAgIShtZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfU0VOU0VfU1VQUE9SVCkpIHsKIAkJZm9yIChpID0gMTsgaSA8PSBtZGV2LT5jYXBzLm51bV9wb3J0czsgaSsrKSB7CiAJCQlpZiAobWRldi0+Y2Fwcy5wb3NzaWJsZV90eXBlW2ldID09IE1MWDRfUE9SVF9UWVBFX0FVVE8pIHsKIAkJCQltZGV2LT5jYXBzLnBvc3NpYmxlX3R5cGVbaV0gPSBtZGV2LT5jYXBzLnBvcnRfdHlwZVtpXTsKQEAgLTQ1MSw2ICs2ODcsNyBAQAogewogCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKIAlpbnQgZXJyOworCWludCBudW1fZXFzOwogCiAJZXJyID0gbWx4NF9pbml0X2ljbV90YWJsZShkZXYsICZwcml2LT5xcF90YWJsZS5jbXB0X3RhYmxlLAogCQkJCSAgY21wdF9iYXNlICsKQEAgLTQ4MCwxMiArNzE3LDE0IEBACiAJaWYgKGVycikKIAkJZ290byBlcnJfc3JxOwogCisJbnVtX2VxcyA9IChtbHg0X2lzX21hc3RlcihkZXYpKSA/CisJCXJvdW5kdXBfcG93X29mX3R3byhtbHg0X21hc3Rlcl9nZXRfbnVtX2VxcyhkZXYpKSA6CisJCWRldi0+Y2Fwcy5udW1fZXFzOwogCWVyciA9IG1seDRfaW5pdF9pY21fdGFibGUoZGV2LCAmcHJpdi0+ZXFfdGFibGUuY21wdF90YWJsZSwKIAkJCQkgIGNtcHRfYmFzZSArCiAJCQkJICAoKHU2NCkgKE1MWDRfQ01QVF9UWVBFX0VRICoKIAkJCQkJICBjbXB0X2VudHJ5X3N6KSA8PCBNTFg0X0NNUFRfU0hJRlQpLAotCQkJCSAgY21wdF9lbnRyeV9zeiwKLQkJCQkgIGRldi0+Y2Fwcy5udW1fZXFzLCBkZXYtPmNhcHMubnVtX2VxcywgMCwgMCk7CisJCQkJICBjbXB0X2VudHJ5X3N6LCBudW1fZXFzLCBudW1fZXFzLCAwLCAwKTsKIAlpZiAoZXJyKQogCQlnb3RvIGVycl9jcTsKIApAQCAtNTA5LDYgKzc0OCw3IEBACiB7CiAJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwogCXU2NCBhdXhfcGFnZXM7CisJaW50IG51bV9lcXM7CiAJaW50IGVycjsKIAogCWVyciA9IG1seDRfU0VUX0lDTV9TSVpFKGRldiwgaWNtX3NpemUsICZhdXhfcGFnZXMpOwpAQCAtNTQwLDEwICs3ODAsMTMgQEAKIAkJZ290byBlcnJfdW5tYXBfYXV4OwogCX0KIAorCisJbnVtX2VxcyA9IChtbHg0X2lzX21hc3RlcihkZXYpKSA/CisJCXJvdW5kdXBfcG93X29mX3R3byhtbHg0X21hc3Rlcl9nZXRfbnVtX2VxcyhkZXYpKSA6CisJCWRldi0+Y2Fwcy5udW1fZXFzOwogCWVyciA9IG1seDRfaW5pdF9pY21fdGFibGUoZGV2LCAmcHJpdi0+ZXFfdGFibGUudGFibGUsCiAJCQkJICBpbml0X2hjYS0+ZXFjX2Jhc2UsIGRldl9jYXAtPmVxY19lbnRyeV9zeiwKLQkJCQkgIGRldi0+Y2Fwcy5udW1fZXFzLCBkZXYtPmNhcHMubnVtX2VxcywKLQkJCQkgIDAsIDApOworCQkJCSAgbnVtX2VxcywgbnVtX2VxcywgMCwgMCk7CiAJaWYgKGVycikgewogCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gbWFwIEVRIGNvbnRleHQgbWVtb3J5LCBhYm9ydGluZy5cbiIpOwogCQlnb3RvIGVycl91bm1hcF9jbXB0OwpAQCAtNTYzLDcgKzgwNiw3IEBACiAJZXJyID0gbWx4NF9pbml0X2ljbV90YWJsZShkZXYsICZwcml2LT5tcl90YWJsZS5tdHRfdGFibGUsCiAJCQkJICBpbml0X2hjYS0+bXR0X2Jhc2UsCiAJCQkJICBkZXYtPmNhcHMubXR0X2VudHJ5X3N6LAotCQkJCSAgZGV2LT5jYXBzLm51bV9tdHRfc2VncywKKwkJCQkgIGRldi0+Y2Fwcy5udW1fbXR0cywKIAkJCQkgIGRldi0+Y2Fwcy5yZXNlcnZlZF9tdHRzLCAxLCAwKTsKIAlpZiAoZXJyKSB7CiAJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBtYXAgTVRUIGNvbnRleHQgbWVtb3J5LCBhYm9ydGluZy5cbiIpOwpAQCAtNjUwLDcgKzg5Myw4IEBACiAJICogYW5kIGl0J3MgYSBsb3QgZWFzaWVyIHRoYW4gdHJ5aW5nIHRvIHRyYWNrIHJlZiBjb3VudHMuCiAJICovCiAJZXJyID0gbWx4NF9pbml0X2ljbV90YWJsZShkZXYsICZwcml2LT5tY2dfdGFibGUudGFibGUsCi0JCQkJICBpbml0X2hjYS0+bWNfYmFzZSwgTUxYNF9NR01fRU5UUllfU0laRSwKKwkJCQkgIGluaXRfaGNhLT5tY19iYXNlLAorCQkJCSAgbWx4NF9nZXRfbWdtX2VudHJ5X3NpemUoZGV2KSwKIAkJCQkgIGRldi0+Y2Fwcy5udW1fbWdtcyArIGRldi0+Y2Fwcy5udW1fYW1nbXMsCiAJCQkJICBkZXYtPmNhcHMubnVtX21nbXMgKyBkZXYtPmNhcHMubnVtX2FtZ21zLAogCQkJCSAgMCwgMCk7CkBAIC03MjYsNiArOTcwLDE2IEBACiAJbWx4NF9mcmVlX2ljbShkZXYsIHByaXYtPmZ3LmF1eF9pY20sIDApOwogfQogCitzdGF0aWMgdm9pZCBtbHg0X3NsYXZlX2V4aXQoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCisJZG93bigmcHJpdi0+Y21kLnNsYXZlX3NlbSk7CisJaWYgKG1seDRfY29tbV9jbWQoZGV2LCBNTFg0X0NPTU1fQ01EX1JFU0VULCAwLCBNTFg0X0NPTU1fVElNRSkpCisJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gY2xvc2Ugc2xhdmUgZnVuY3Rpb24uXG4iKTsKKwl1cCgmcHJpdi0+Y21kLnNsYXZlX3NlbSk7Cit9CisKIHN0YXRpYyBpbnQgbWFwX2JmX2FyZWEoc3RydWN0IG1seDRfZGV2ICpkZXYpCiB7CiAJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwpAQCAtNzMzLDggKzk4NywxMCBAQAogCXJlc291cmNlX3NpemVfdCBiZl9sZW47CiAJaW50IGVyciA9IDA7CiAKLQliZl9zdGFydCA9IHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDIpICsgKGRldi0+Y2Fwcy5udW1fdWFycyA8PCBQQUdFX1NISUZUKTsKLQliZl9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMikgLSAoZGV2LT5jYXBzLm51bV91YXJzIDw8IFBBR0VfU0hJRlQpOworCWJmX3N0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KGRldi0+cGRldiwgMikgKworCQkJKGRldi0+Y2Fwcy5udW1fdWFycyA8PCBQQUdFX1NISUZUKTsKKwliZl9sZW4gPSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMikgLQorCQkJKGRldi0+Y2Fwcy5udW1fdWFycyA8PCBQQUdFX1NISUZUKTsKIAlwcml2LT5iZl9tYXBwaW5nID0gaW9fbWFwcGluZ19jcmVhdGVfd2MoYmZfc3RhcnQsIGJmX2xlbik7CiAJaWYgKCFwcml2LT5iZl9tYXBwaW5nKQogCQllcnIgPSAtRU5PTUVNOwpAQCAtNzUxLDEwICsxMDA3LDgxIEBACiBzdGF0aWMgdm9pZCBtbHg0X2Nsb3NlX2hjYShzdHJ1Y3QgbWx4NF9kZXYgKmRldikKIHsKIAl1bm1hcF9iZl9hcmVhKGRldik7Ci0JbWx4NF9DTE9TRV9IQ0EoZGV2LCAwKTsKLQltbHg0X2ZyZWVfaWNtcyhkZXYpOwotCW1seDRfVU5NQVBfRkEoZGV2KTsKLQltbHg0X2ZyZWVfaWNtKGRldiwgbWx4NF9wcml2KGRldiktPmZ3LmZ3X2ljbSwgMCk7CisJaWYgKG1seDRfaXNfc2xhdmUoZGV2KSkKKwkJbWx4NF9zbGF2ZV9leGl0KGRldik7CisJZWxzZSB7CisJCW1seDRfQ0xPU0VfSENBKGRldiwgMCk7CisJCW1seDRfZnJlZV9pY21zKGRldik7CisJCW1seDRfVU5NQVBfRkEoZGV2KTsKKwkJbWx4NF9mcmVlX2ljbShkZXYsIG1seDRfcHJpdihkZXYpLT5mdy5md19pY20sIDApOworCX0KK30KKworc3RhdGljIGludCBtbHg0X2luaXRfc2xhdmUoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXU2NCBkbWEgPSAodTY0KSBwcml2LT5tZnVuYy52aGNyX2RtYTsKKwlpbnQgbnVtX29mX3Jlc2V0X3JldHJpZXMgPSBOVU1fT0ZfUkVTRVRfUkVUUklFUzsKKwlpbnQgcmV0X2Zyb21fcmVzZXQgPSAwOworCXUzMiBzbGF2ZV9yZWFkOworCXUzMiBjbWRfY2hhbm5lbF92ZXI7CisKKwlkb3duKCZwcml2LT5jbWQuc2xhdmVfc2VtKTsKKwlwcml2LT5jbWQubWF4X2NtZHMgPSAxOworCW1seDRfd2FybihkZXYsICJTZW5kaW5nIHJlc2V0XG4iKTsKKwlyZXRfZnJvbV9yZXNldCA9IG1seDRfY29tbV9jbWQoZGV2LCBNTFg0X0NPTU1fQ01EX1JFU0VULCAwLAorCQkJCSAgICAgICBNTFg0X0NPTU1fVElNRSk7CisJLyogaWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgZmxyIHRoZSBzbGF2ZSB3aWxsIHRyeQorCSAqIE5VTV9PRl9SRVNFVF9SRVRSSUVTIHRpbWVzIGJlZm9yZSBsZWF2aW5nLiovCisJaWYgKHJldF9mcm9tX3Jlc2V0KSB7CisJCWlmIChNTFg0X0RFTEFZX1JFU0VUX1NMQVZFID09IHJldF9mcm9tX3Jlc2V0KSB7CisJCQltc2xlZXAoU0xFRVBfVElNRV9JTl9SRVNFVCk7CisJCQl3aGlsZSAocmV0X2Zyb21fcmVzZXQgJiYgbnVtX29mX3Jlc2V0X3JldHJpZXMpIHsKKwkJCQltbHg0X3dhcm4oZGV2LCAic2xhdmUgaXMgY3VycmVudGx5IGluIHRoZSIKKwkJCQkJICAibWlkZGxlIG9mIEZMUi4gcmV0cnlpbmcuLi4iCisJCQkJCSAgIih0cnkgbnVtOiVkKVxuIiwKKwkJCQkJICAoTlVNX09GX1JFU0VUX1JFVFJJRVMgLQorCQkJCQkgICBudW1fb2ZfcmVzZXRfcmV0cmllcyAgKyAxKSk7CisJCQkJcmV0X2Zyb21fcmVzZXQgPQorCQkJCQltbHg0X2NvbW1fY21kKGRldiwgTUxYNF9DT01NX0NNRF9SRVNFVCwKKwkJCQkJCSAgICAgIDAsIE1MWDRfQ09NTV9USU1FKTsKKwkJCQludW1fb2ZfcmVzZXRfcmV0cmllcyA9IG51bV9vZl9yZXNldF9yZXRyaWVzIC0gMTsKKwkJCX0KKwkJfSBlbHNlCisJCQlnb3RvIGVycjsKKwl9CisKKwkvKiBjaGVjayB0aGUgZHJpdmVyIHZlcnNpb24gLSB0aGUgc2xhdmUgSS9GIHJldmlzaW9uCisJICogbXVzdCBtYXRjaCB0aGUgbWFzdGVyJ3MgKi8KKwlzbGF2ZV9yZWFkID0gc3dhYjMyKHJlYWRsKCZwcml2LT5tZnVuYy5jb21tLT5zbGF2ZV9yZWFkKSk7CisJY21kX2NoYW5uZWxfdmVyID0gbWx4NF9jb21tX2dldF92ZXJzaW9uKCk7CisKKwlpZiAoTUxYNF9DT01NX0dFVF9JRl9SRVYoY21kX2NoYW5uZWxfdmVyKSAhPQorCQlNTFg0X0NPTU1fR0VUX0lGX1JFVihzbGF2ZV9yZWFkKSkgeworCQltbHg0X2VycihkZXYsICJzbGF2ZSBkcml2ZXIgdmVyc2lvbiBpcyBub3Qgc3VwcG9ydGVkIgorCQkJICIgYnkgdGhlIG1hc3RlclxuIik7CisJCWdvdG8gZXJyOworCX0KKworCW1seDRfd2FybihkZXYsICJTZW5kaW5nIHZoY3IwXG4iKTsKKwlpZiAobWx4NF9jb21tX2NtZChkZXYsIE1MWDRfQ09NTV9DTURfVkhDUjAsIGRtYSA+PiA0OCwKKwkJCQkJCSAgICBNTFg0X0NPTU1fVElNRSkpCisJCWdvdG8gZXJyOworCWlmIChtbHg0X2NvbW1fY21kKGRldiwgTUxYNF9DT01NX0NNRF9WSENSMSwgZG1hID4+IDMyLAorCQkJCQkJICAgIE1MWDRfQ09NTV9USU1FKSkKKwkJZ290byBlcnI7CisJaWYgKG1seDRfY29tbV9jbWQoZGV2LCBNTFg0X0NPTU1fQ01EX1ZIQ1IyLCBkbWEgPj4gMTYsCisJCQkJCQkgICAgTUxYNF9DT01NX1RJTUUpKQorCQlnb3RvIGVycjsKKwlpZiAobWx4NF9jb21tX2NtZChkZXYsIE1MWDRfQ09NTV9DTURfVkhDUl9FTiwgZG1hLCBNTFg0X0NPTU1fVElNRSkpCisJCWdvdG8gZXJyOworCXVwKCZwcml2LT5jbWQuc2xhdmVfc2VtKTsKKwlyZXR1cm4gMDsKKworZXJyOgorCW1seDRfY29tbV9jbWQoZGV2LCBNTFg0X0NPTU1fQ01EX1JFU0VULCAwLCAwKTsKKwl1cCgmcHJpdi0+Y21kLnNsYXZlX3NlbSk7CisJcmV0dXJuIC1FSU87CiB9CiAKIHN0YXRpYyBpbnQgbWx4NF9pbml0X2hjYShzdHJ1Y3QgbWx4NF9kZXYgKmRldikKQEAgLTc2OCw1NSArMTA5NSw3NSBAQAogCXU2NCBpY21fc2l6ZTsKIAlpbnQgZXJyOwogCi0JZXJyID0gbWx4NF9RVUVSWV9GVyhkZXYpOwotCWlmIChlcnIpIHsKLQkJaWYgKGVyciA9PSAtRUFDQ0VTKQotCQkJbWx4NF9pbmZvKGRldiwgIm5vbi1wcmltYXJ5IHBoeXNpY2FsIGZ1bmN0aW9uLCBza2lwcGluZy5cbiIpOwotCQllbHNlCi0JCQltbHg0X2VycihkZXYsICJRVUVSWV9GVyBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKLQkJcmV0dXJuIGVycjsKLQl9CisJaWYgKCFtbHg0X2lzX3NsYXZlKGRldikpIHsKKwkJZXJyID0gbWx4NF9RVUVSWV9GVyhkZXYpOworCQlpZiAoZXJyKSB7CisJCQlpZiAoZXJyID09IC1FQUNDRVMpCisJCQkJbWx4NF9pbmZvKGRldiwgIm5vbi1wcmltYXJ5IHBoeXNpY2FsIGZ1bmN0aW9uLCBza2lwcGluZy5cbiIpOworCQkJZWxzZQorCQkJCW1seDRfZXJyKGRldiwgIlFVRVJZX0ZXIGNvbW1hbmQgZmFpbGVkLCBhYm9ydGluZy5cbiIpOworCQkJZ290byB1bm1hcF9iZjsKKwkJfQogCi0JZXJyID0gbWx4NF9sb2FkX2Z3KGRldik7Ci0JaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gc3RhcnQgRlcsIGFib3J0aW5nLlxuIik7Ci0JCXJldHVybiBlcnI7Ci0JfQorCQllcnIgPSBtbHg0X2xvYWRfZncoZGV2KTsKKwkJaWYgKGVycikgeworCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIHN0YXJ0IEZXLCBhYm9ydGluZy5cbiIpOworCQkJZ290byB1bm1hcF9iZjsKKwkJfQogCi0JbWx4NF9jZmcubG9nX3BnX3N6X20gPSAxOwotCW1seDRfY2ZnLmxvZ19wZ19zeiA9IDA7Ci0JZXJyID0gbWx4NF9NT0RfU1RBVF9DRkcoZGV2LCAmbWx4NF9jZmcpOwotCWlmIChlcnIpCi0JCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gb3ZlcnJpZGUgbG9nX3BnX3N6IHBhcmFtZXRlclxuIik7CisJCW1seDRfY2ZnLmxvZ19wZ19zel9tID0gMTsKKwkJbWx4NF9jZmcubG9nX3BnX3N6ID0gMDsKKwkJZXJyID0gbWx4NF9NT0RfU1RBVF9DRkcoZGV2LCAmbWx4NF9jZmcpOworCQlpZiAoZXJyKQorCQkJbWx4NF93YXJuKGRldiwgIkZhaWxlZCB0byBvdmVycmlkZSBsb2dfcGdfc3ogcGFyYW1ldGVyXG4iKTsKIAotCWVyciA9IG1seDRfZGV2X2NhcChkZXYsICZkZXZfY2FwKTsKLQlpZiAoZXJyKSB7Ci0JCW1seDRfZXJyKGRldiwgIlFVRVJZX0RFVl9DQVAgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX3N0b3BfZnc7Ci0JfQorCQllcnIgPSBtbHg0X2Rldl9jYXAoZGV2LCAmZGV2X2NhcCk7CisJCWlmIChlcnIpIHsKKwkJCW1seDRfZXJyKGRldiwgIlFVRVJZX0RFVl9DQVAgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9zdG9wX2Z3OworCQl9CiAKLQlwcm9maWxlID0gZGVmYXVsdF9wcm9maWxlOworCQlwcm9maWxlID0gZGVmYXVsdF9wcm9maWxlOwogCi0JaWNtX3NpemUgPSBtbHg0X21ha2VfcHJvZmlsZShkZXYsICZwcm9maWxlLCAmZGV2X2NhcCwgJmluaXRfaGNhKTsKLQlpZiAoKGxvbmcgbG9uZykgaWNtX3NpemUgPCAwKSB7Ci0JCWVyciA9IGljbV9zaXplOwotCQlnb3RvIGVycl9zdG9wX2Z3OworCQlpY21fc2l6ZSA9IG1seDRfbWFrZV9wcm9maWxlKGRldiwgJnByb2ZpbGUsICZkZXZfY2FwLAorCQkJCQkgICAgICZpbml0X2hjYSk7CisJCWlmICgobG9uZyBsb25nKSBpY21fc2l6ZSA8IDApIHsKKwkJCWVyciA9IGljbV9zaXplOworCQkJZ290byBlcnJfc3RvcF9mdzsKKwkJfQorCisJCWluaXRfaGNhLmxvZ191YXJfc3ogPSBpbG9nMihkZXYtPmNhcHMubnVtX3VhcnMpOworCQlpbml0X2hjYS51YXJfcGFnZV9zeiA9IFBBR0VfU0hJRlQgLSAxMjsKKworCQllcnIgPSBtbHg0X2luaXRfaWNtKGRldiwgJmRldl9jYXAsICZpbml0X2hjYSwgaWNtX3NpemUpOworCQlpZiAoZXJyKQorCQkJZ290byBlcnJfc3RvcF9mdzsKKworCQllcnIgPSBtbHg0X0lOSVRfSENBKGRldiwgJmluaXRfaGNhKTsKKwkJaWYgKGVycikgeworCQkJbWx4NF9lcnIoZGV2LCAiSU5JVF9IQ0EgY29tbWFuZCBmYWlsZWQsIGFib3J0aW5nLlxuIik7CisJCQlnb3RvIGVycl9mcmVlX2ljbTsKKwkJfQorCX0gZWxzZSB7CisJCWVyciA9IG1seDRfaW5pdF9zbGF2ZShkZXYpOworCQlpZiAoZXJyKSB7CisJCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBzbGF2ZVxuIik7CisJCQlnb3RvIHVubWFwX2JmOworCQl9CisKKwkJZXJyID0gbWx4NF9zbGF2ZV9jYXAoZGV2KTsKKwkJaWYgKGVycikgeworCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIG9idGFpbiBzbGF2ZSBjYXBzXG4iKTsKKwkJCWdvdG8gZXJyX2Nsb3NlOworCQl9CiAJfQogCiAJaWYgKG1hcF9iZl9hcmVhKGRldikpCiAJCW1seDRfZGJnKGRldiwgIkZhaWxlZCB0byBtYXAgYmx1ZSBmbGFtZSBhcmVhXG4iKTsKIAotCWluaXRfaGNhLmxvZ191YXJfc3ogPSBpbG9nMihkZXYtPmNhcHMubnVtX3VhcnMpOwotCi0JZXJyID0gbWx4NF9pbml0X2ljbShkZXYsICZkZXZfY2FwLCAmaW5pdF9oY2EsIGljbV9zaXplKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9zdG9wX2Z3OwotCi0JZXJyID0gbWx4NF9JTklUX0hDQShkZXYsICZpbml0X2hjYSk7Ci0JaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJJTklUX0hDQSBjb21tYW5kIGZhaWxlZCwgYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfZnJlZV9pY207Ci0JfQorCS8qT25seSB0aGUgbWFzdGVyIHNldCB0aGUgcG9ydHMsIGFsbCB0aGUgcmVzdCBnb3QgaXQgZnJvbSBpdC4qLworCWlmICghbWx4NF9pc19zbGF2ZShkZXYpKQorCQltbHg0X3NldF9wb3J0X21hc2soZGV2KTsKIAogCWVyciA9IG1seDRfUVVFUllfQURBUFRFUihkZXYsICZhZGFwdGVyKTsKIAlpZiAoZXJyKSB7CkBAIC04MzAsMTYgKzExNzcsMTkgQEAKIAlyZXR1cm4gMDsKIAogZXJyX2Nsb3NlOgotCW1seDRfQ0xPU0VfSENBKGRldiwgMCk7CisJbWx4NF9jbG9zZV9oY2EoZGV2KTsKIAogZXJyX2ZyZWVfaWNtOgotCW1seDRfZnJlZV9pY21zKGRldik7CisJaWYgKCFtbHg0X2lzX3NsYXZlKGRldikpCisJCW1seDRfZnJlZV9pY21zKGRldik7CiAKIGVycl9zdG9wX2Z3OgorCWlmICghbWx4NF9pc19zbGF2ZShkZXYpKSB7CisJCW1seDRfVU5NQVBfRkEoZGV2KTsKKwkJbWx4NF9mcmVlX2ljbShkZXYsIHByaXYtPmZ3LmZ3X2ljbSwgMCk7CisJfQordW5tYXBfYmY6CiAJdW5tYXBfYmZfYXJlYShkZXYpOwotCW1seDRfVU5NQVBfRkEoZGV2KTsKLQltbHg0X2ZyZWVfaWNtKGRldiwgcHJpdi0+ZncuZndfaWNtLCAwKTsKLQogCXJldHVybiBlcnI7CiB9CiAKQEAgLTk4Niw1NSArMTMzNiw1NiBAQAogCQlnb3RvIGVycl9zcnFfdGFibGVfZnJlZTsKIAl9CiAKLQllcnIgPSBtbHg0X2luaXRfbWNnX3RhYmxlKGRldik7Ci0JaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSAiCi0JCQkgIm11bHRpY2FzdCBncm91cCB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKLQkJZ290byBlcnJfcXBfdGFibGVfZnJlZTsKKwlpZiAoIW1seDRfaXNfc2xhdmUoZGV2KSkgeworCQllcnIgPSBtbHg0X2luaXRfbWNnX3RhYmxlKGRldik7CisJCWlmIChlcnIpIHsKKwkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplICIKKwkJCQkgIm11bHRpY2FzdCBncm91cCB0YWJsZSwgYWJvcnRpbmcuXG4iKTsKKwkJCWdvdG8gZXJyX3FwX3RhYmxlX2ZyZWU7CisJCX0KIAl9CiAKIAllcnIgPSBtbHg0X2luaXRfY291bnRlcnNfdGFibGUoZGV2KTsKIAlpZiAoZXJyICYmIGVyciAhPSAtRU5PRU5UKSB7CiAJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0aWFsaXplIGNvdW50ZXJzIHRhYmxlLCBhYm9ydGluZy5cbiIpOwotCQlnb3RvIGVycl9jb3VudGVyc190YWJsZV9mcmVlOworCQlnb3RvIGVycl9tY2dfdGFibGVfZnJlZTsKIAl9CiAKLQlmb3IgKHBvcnQgPSAxOyBwb3J0IDw9IGRldi0+Y2Fwcy5udW1fcG9ydHM7IHBvcnQrKykgewotCQllbnVtIG1seDRfcG9ydF90eXBlIHBvcnRfdHlwZSA9IDA7Ci0JCW1seDRfU0VOU0VfUE9SVChkZXYsIHBvcnQsICZwb3J0X3R5cGUpOwotCQlpZiAocG9ydF90eXBlKQotCQkJZGV2LT5jYXBzLnBvcnRfdHlwZVtwb3J0XSA9IHBvcnRfdHlwZTsKLQkJaWJfcG9ydF9kZWZhdWx0X2NhcHMgPSAwOwotCQllcnIgPSBtbHg0X2dldF9wb3J0X2liX2NhcHMoZGV2LCBwb3J0LCAmaWJfcG9ydF9kZWZhdWx0X2NhcHMpOwotCQlpZiAoZXJyKQotCQkJbWx4NF93YXJuKGRldiwgImZhaWxlZCB0byBnZXQgcG9ydCAlZCBkZWZhdWx0ICIKLQkJCQkgICJpYiBjYXBhYmlsaXRpZXMgKCVkKS4gQ29udGludWluZyB3aXRoICIKLQkJCQkgICJjYXBzID0gMFxuIiwgcG9ydCwgZXJyKTsKLQkJZGV2LT5jYXBzLmliX3BvcnRfZGVmX2NhcFtwb3J0XSA9IGliX3BvcnRfZGVmYXVsdF9jYXBzOworCWlmICghbWx4NF9pc19zbGF2ZShkZXYpKSB7CisJCWZvciAocG9ydCA9IDE7IHBvcnQgPD0gZGV2LT5jYXBzLm51bV9wb3J0czsgcG9ydCsrKSB7CisJCQlpYl9wb3J0X2RlZmF1bHRfY2FwcyA9IDA7CisJCQllcnIgPSBtbHg0X2dldF9wb3J0X2liX2NhcHMoZGV2LCBwb3J0LAorCQkJCQkJICAgICZpYl9wb3J0X2RlZmF1bHRfY2Fwcyk7CisJCQlpZiAoZXJyKQorCQkJCW1seDRfd2FybihkZXYsICJmYWlsZWQgdG8gZ2V0IHBvcnQgJWQgZGVmYXVsdCAiCisJCQkJCSAgImliIGNhcGFiaWxpdGllcyAoJWQpLiBDb250aW51aW5nICIKKwkJCQkJICAid2l0aCBjYXBzID0gMFxuIiwgcG9ydCwgZXJyKTsKKwkJCWRldi0+Y2Fwcy5pYl9wb3J0X2RlZl9jYXBbcG9ydF0gPSBpYl9wb3J0X2RlZmF1bHRfY2FwczsKIAotCQllcnIgPSBtbHg0X2NoZWNrX2V4dF9wb3J0X2NhcHMoZGV2LCBwb3J0KTsKLQkJaWYgKGVycikKLQkJCW1seDRfd2FybihkZXYsICJmYWlsZWQgdG8gZ2V0IHBvcnQgJWQgZXh0ZW5kZWQgIgotCQkJCSAgInBvcnQgY2FwYWJpbGl0aWVzIHN1cHBvcnQgaW5mbyAoJWQpLiIKLQkJCQkgICIgQXNzdW1pbmcgbm90IHN1cHBvcnRlZFxuIiwgcG9ydCwgZXJyKTsKKwkJCWVyciA9IG1seDRfY2hlY2tfZXh0X3BvcnRfY2FwcyhkZXYsIHBvcnQpOworCQkJaWYgKGVycikKKwkJCQltbHg0X3dhcm4oZGV2LCAiZmFpbGVkIHRvIGdldCBwb3J0ICVkIGV4dGVuZGVkICIKKwkJCQkJICAicG9ydCBjYXBhYmlsaXRpZXMgc3VwcG9ydCBpbmZvICglZCkuIgorCQkJCQkgICIgQXNzdW1pbmcgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQkJICBwb3J0LCBlcnIpOwogCi0JCWVyciA9IG1seDRfU0VUX1BPUlQoZGV2LCBwb3J0KTsKLQkJaWYgKGVycikgewotCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIHNldCBwb3J0ICVkLCBhYm9ydGluZ1xuIiwKLQkJCQlwb3J0KTsKLQkJCWdvdG8gZXJyX21jZ190YWJsZV9mcmVlOworCQkJZXJyID0gbWx4NF9TRVRfUE9SVChkZXYsIHBvcnQpOworCQkJaWYgKGVycikgeworCQkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBzZXQgcG9ydCAlZCwgYWJvcnRpbmdcbiIsCisJCQkJCXBvcnQpOworCQkJCWdvdG8gZXJyX2NvdW50ZXJzX3RhYmxlX2ZyZWU7CisJCQl9CiAJCX0KIAl9Ci0JbWx4NF9zZXRfcG9ydF9tYXNrKGRldik7CiAKIAlyZXR1cm4gMDsKIAotZXJyX21jZ190YWJsZV9mcmVlOgotCW1seDRfY2xlYW51cF9tY2dfdGFibGUoZGV2KTsKLQogZXJyX2NvdW50ZXJzX3RhYmxlX2ZyZWU6CiAJbWx4NF9jbGVhbnVwX2NvdW50ZXJzX3RhYmxlKGRldik7CiAKK2Vycl9tY2dfdGFibGVfZnJlZToKKwltbHg0X2NsZWFudXBfbWNnX3RhYmxlKGRldik7CisKIGVycl9xcF90YWJsZV9mcmVlOgogCW1seDRfY2xlYW51cF9xcF90YWJsZShkZXYpOwogCkBAIC0xMDgxLDggKzE0MzIsMTYgQEAKIAlpbnQgaTsKIAogCWlmIChtc2lfeCkgewotCQlucmVxID0gbWluX3QoaW50LCBkZXYtPmNhcHMubnVtX2VxcyAtIGRldi0+Y2Fwcy5yZXNlcnZlZF9lcXMsCi0JCQkgICAgIG5yZXEpOworCQkvKiBJbiBtdWx0aWZ1bmN0aW9uIG1vZGUgZWFjaCBmdW5jdGlvbiBnZXRzIDIgbXNpLVggdmVjdG9ycworCQkgKiBvbmUgZm9yIGRhdGEgcGF0aCBjb21wbGV0aW9ucyBhbmYgdGhlIG90aGVyIGZvciBhc3luY2ggZXZlbnRzCisJCSAqIG9yIGNvbW1hbmQgY29tcGxldGlvbnMgKi8KKwkJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkgeworCQkJbnJlcSA9IDI7CisJCX0gZWxzZSB7CisJCQlucmVxID0gbWluX3QoaW50LCBkZXYtPmNhcHMubnVtX2VxcyAtCisJCQkJICAgICBkZXYtPmNhcHMucmVzZXJ2ZWRfZXFzLCBucmVxKTsKKwkJfQorCiAJCWVudHJpZXMgPSBrY2FsbG9jKG5yZXEsIHNpemVvZiAqZW50cmllcywgR0ZQX0tFUk5FTCk7CiAJCWlmICghZW50cmllcykKIAkJCWdvdG8gbm9fbXNpOwpAQCAtMTEzOCwxNiArMTQ5NywyNCBAQAogCiAJaW5mby0+ZGV2ID0gZGV2OwogCWluZm8tPnBvcnQgPSBwb3J0OwotCW1seDRfaW5pdF9tYWNfdGFibGUoZGV2LCAmaW5mby0+bWFjX3RhYmxlKTsKLQltbHg0X2luaXRfdmxhbl90YWJsZShkZXYsICZpbmZvLT52bGFuX3RhYmxlKTsKLQlpbmZvLT5iYXNlX3FwbiA9IGRldi0+Y2Fwcy5yZXNlcnZlZF9xcHNfYmFzZVtNTFg0X1FQX1JFR0lPTl9FVEhfQUREUl0gKworCWlmICghbWx4NF9pc19zbGF2ZShkZXYpKSB7CisJCUlOSVRfUkFESVhfVFJFRSgmaW5mby0+bWFjX3RyZWUsIEdGUF9LRVJORUwpOworCQltbHg0X2luaXRfbWFjX3RhYmxlKGRldiwgJmluZm8tPm1hY190YWJsZSk7CisJCW1seDRfaW5pdF92bGFuX3RhYmxlKGRldiwgJmluZm8tPnZsYW5fdGFibGUpOworCQlpbmZvLT5iYXNlX3FwbiA9CisJCQlkZXYtPmNhcHMucmVzZXJ2ZWRfcXBzX2Jhc2VbTUxYNF9RUF9SRUdJT05fRVRIX0FERFJdICsKIAkJCShwb3J0IC0gMSkgKiAoMSA8PCBsb2dfbnVtX21hYyk7CisJfQogCiAJc3ByaW50ZihpbmZvLT5kZXZfbmFtZSwgIm1seDRfcG9ydCVkIiwgcG9ydCk7CiAJaW5mby0+cG9ydF9hdHRyLmF0dHIubmFtZSA9IGluZm8tPmRldl9uYW1lOwotCWluZm8tPnBvcnRfYXR0ci5hdHRyLm1vZGUgPSBTX0lSVUdPIHwgU19JV1VTUjsKKwlpZiAobWx4NF9pc19tZnVuYyhkZXYpKQorCQlpbmZvLT5wb3J0X2F0dHIuYXR0ci5tb2RlID0gU19JUlVHTzsKKwllbHNlIHsKKwkJaW5mby0+cG9ydF9hdHRyLmF0dHIubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSOworCQlpbmZvLT5wb3J0X2F0dHIuc3RvcmUgICAgID0gc2V0X3BvcnRfdHlwZTsKKwl9CiAJaW5mby0+cG9ydF9hdHRyLnNob3cgICAgICA9IHNob3dfcG9ydF90eXBlOwotCWluZm8tPnBvcnRfYXR0ci5zdG9yZSAgICAgPSBzZXRfcG9ydF90eXBlOwogCXN5c2ZzX2F0dHJfaW5pdCgmaW5mby0+cG9ydF9hdHRyLmF0dHIpOwogCiAJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZkZXYtPnBkZXYtPmRldiwgJmluZm8tPnBvcnRfYXR0cik7CkBAIC0xMjIwLDYgKzE1ODcsNDYgQEAKIAlrZnJlZShwcml2LT5zdGVlcik7CiB9CiAKK3N0YXRpYyBpbnQgZXh0ZW5kZWRfZnVuY19udW0oc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcmV0dXJuIFBDSV9TTE9UKHBkZXYtPmRldmZuKSAqIDggKyBQQ0lfRlVOQyhwZGV2LT5kZXZmbik7Cit9CisKKyNkZWZpbmUgTUxYNF9PV05FUl9CQVNFCTB4ODA2OWMKKyNkZWZpbmUgTUxYNF9PV05FUl9TSVpFCTQKKworc3RhdGljIGludCBtbHg0X2dldF9vd25lcnNoaXAoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICpvd25lcjsKKwl1MzIgcmV0OworCisJb3duZXIgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDApICsgTUxYNF9PV05FUl9CQVNFLAorCQkJTUxYNF9PV05FUl9TSVpFKTsKKwlpZiAoIW93bmVyKSB7CisJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBvYnRhaW4gb3duZXJzaGlwIGJpdFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IHJlYWRsKG93bmVyKTsKKwlpb3VubWFwKG93bmVyKTsKKwlyZXR1cm4gKGludCkgISFyZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1seDRfZnJlZV9vd25lcnNoaXAoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJdm9pZCBfX2lvbWVtICpvd25lcjsKKworCW93bmVyID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAwKSArIE1MWDRfT1dORVJfQkFTRSwKKwkJCU1MWDRfT1dORVJfU0laRSk7CisJaWYgKCFvd25lcikgeworCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gb2J0YWluIG93bmVyc2hpcCBiaXRcbiIpOworCQlyZXR1cm47CisJfQorCXdyaXRlbCgwLCBvd25lcik7CisJbXNsZWVwKDEwMDApOworCWlvdW5tYXAob3duZXIpOworfQorCiBzdGF0aWMgaW50IF9fbWx4NF9pbml0X29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQogewogCXN0cnVjdCBtbHg0X3ByaXYgKnByaXY7CkBAIC0xMjM1LDEzICsxNjQyLDIwIEBACiAJCQkiYWJvcnRpbmcuXG4iKTsKIAkJcmV0dXJuIGVycjsKIAl9Ci0KKwlpZiAobnVtX3ZmcyA+IE1MWDRfTUFYX05VTV9WRikgeworCQlwcmludGsoS0VSTl9FUlIgIlRoZXJlIGFyZSBtb3JlIFZGJ3MgKCVkKSB0aGFuIGFsbG93ZWQoJWQpXG4iLAorCQkgICAgICAgbnVtX3ZmcywgTUxYNF9NQVhfTlVNX1ZGKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCS8qCi0JICogQ2hlY2sgZm9yIEJBUnMuICBXZSBleHBlY3QgMDogMU1CCisJICogQ2hlY2sgZm9yIEJBUnMuCiAJICovCi0JaWYgKCEocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pIHx8Ci0JICAgIHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkgIT0gMSA8PCAyMCkgewotCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIERDUywgYWJvcnRpbmcuXG4iKTsKKwlpZiAoKChpZCA9PSBOVUxMKSB8fCAhKGlkLT5kcml2ZXJfZGF0YSAmIE1MWDRfVkYpKSAmJgorCSAgICAhKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJNaXNzaW5nIERDUywgYWJvcnRpbmcuIgorCQkJIihpZCA9PSAwWCVwLCBpZC0+ZHJpdmVyX2RhdGE6IDB4JWx4LCIKKwkJCSIgcGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApOjB4JWx4KVxuIiwgaWQsCisJCQlpZCA/IGlkLT5kcml2ZXJfZGF0YSA6IDAsIHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSk7CiAJCWVyciA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyX2Rpc2FibGVfcGRldjsKIAl9CkBAIC0xMzA1LDQyICsxNzE5LDEzMiBAQAogCW11dGV4X2luaXQoJnByaXYtPmJmX211dGV4KTsKIAogCWRldi0+cmV2X2lkID0gcGRldi0+cmV2aXNpb247CisJLyogRGV0ZWN0IGlmIHRoaXMgZGV2aWNlIGlzIGEgdmlydHVhbCBmdW5jdGlvbiAqLworCWlmIChpZCAmJiBpZC0+ZHJpdmVyX2RhdGEgJiBNTFg0X1ZGKSB7CisJCS8qIFdoZW4gYWN0aW5nIGFzIHBmLCB3ZSBub3JtYWxseSBza2lwIHZmcyB1bmxlc3MgZXhwbGljaXRseQorCQkgKiByZXF1ZXN0ZWQgdG8gcHJvYmUgdGhlbS4gKi8KKwkJaWYgKG51bV92ZnMgJiYgZXh0ZW5kZWRfZnVuY19udW0ocGRldikgPiBwcm9iZV92ZikgeworCQkJbWx4NF93YXJuKGRldiwgIlNraXBwaW5nIHZpcnR1YWwgZnVuY3Rpb246JWRcbiIsCisJCQkJCQlleHRlbmRlZF9mdW5jX251bShwZGV2KSk7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBlcnJfZnJlZV9kZXY7CisJCX0KKwkJbWx4NF93YXJuKGRldiwgIkRldGVjdGVkIHZpcnR1YWwgZnVuY3Rpb24gLSBydW5uaW5nIGluIHNsYXZlIG1vZGVcbiIpOworCQlkZXYtPmZsYWdzIHw9IE1MWDRfRkxBR19TTEFWRTsKKwl9IGVsc2UgeworCQkvKiBXZSByZXNldCB0aGUgZGV2aWNlIGFuZCBlbmFibGUgU1JJT1Ygb25seSBmb3IgcGh5c2ljYWwKKwkJICogZGV2aWNlcy4gIFRyeSB0byBjbGFpbSBvd25lcnNoaXAgb24gdGhlIGRldmljZTsKKwkJICogaWYgYWxyZWFkeSB0YWtlbiwgc2tpcCAtLSBkbyBub3QgYWxsb3cgbXVsdGlwbGUgUEZzICovCisJCWVyciA9IG1seDRfZ2V0X293bmVyc2hpcChkZXYpOworCQlpZiAoZXJyKSB7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlnb3RvIGVycl9mcmVlX2RldjsKKwkJCWVsc2UgeworCQkJCW1seDRfd2FybihkZXYsICJNdWx0aXBsZSBQRnMgbm90IHlldCBzdXBwb3J0ZWQuIgorCQkJCQkgICIgU2tpcHBpbmcgUEYuXG4iKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gZXJyX2ZyZWVfZGV2OworCQkJfQorCQl9CiAKLQkvKgotCSAqIE5vdyByZXNldCB0aGUgSENBIGJlZm9yZSB3ZSB0b3VjaCB0aGUgUENJIGNhcGFiaWxpdGllcyBvcgotCSAqIGF0dGVtcHQgYSBmaXJtd2FyZSBjb21tYW5kLCBzaW5jZSBhIGJvb3QgUk9NIG1heSBoYXZlIGxlZnQKLQkgKiB0aGUgSENBIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4KLQkgKi8KLQllcnIgPSBtbHg0X3Jlc2V0KGRldik7Ci0JaWYgKGVycikgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgdG8gcmVzZXQgSENBLCBhYm9ydGluZy5cbiIpOwotCQlnb3RvIGVycl9mcmVlX2RldjsKKwkJaWYgKG51bV92ZnMpIHsKKwkJCW1seDRfd2FybihkZXYsICJFbmFibGluZyBzcmlvdiB3aXRoOiVkIHZmc1xuIiwgbnVtX3Zmcyk7CisJCQllcnIgPSBwY2lfZW5hYmxlX3NyaW92KHBkZXYsIG51bV92ZnMpOworCQkJaWYgKGVycikgeworCQkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBlbmFibGUgc3Jpb3YsIgorCQkJCQkgImNvbnRpbnVpbmcgd2l0aG91dCBzcmlvdiBlbmFibGVkIgorCQkJCQkgIiAoZXJyID0gJWQpLlxuIiwgZXJyKTsKKwkJCQludW1fdmZzID0gMDsKKwkJCQllcnIgPSAwOworCQkJfSBlbHNlIHsKKwkJCQltbHg0X3dhcm4oZGV2LCAiUnVubmluZyBpbiBtYXN0ZXIgbW9kZVxuIik7CisJCQkJZGV2LT5mbGFncyB8PSBNTFg0X0ZMQUdfU1JJT1YgfAorCQkJCQkgICAgICBNTFg0X0ZMQUdfTUFTVEVSOworCQkJCWRldi0+bnVtX3ZmcyA9IG51bV92ZnM7CisJCQl9CisJCX0KKworCQkvKgorCQkgKiBOb3cgcmVzZXQgdGhlIEhDQSBiZWZvcmUgd2UgdG91Y2ggdGhlIFBDSSBjYXBhYmlsaXRpZXMgb3IKKwkJICogYXR0ZW1wdCBhIGZpcm13YXJlIGNvbW1hbmQsIHNpbmNlIGEgYm9vdCBST00gbWF5IGhhdmUgbGVmdAorCQkgKiB0aGUgSENBIGluIGFuIHVuZGVmaW5lZCBzdGF0ZS4KKwkJICovCisJCWVyciA9IG1seDRfcmVzZXQoZGV2KTsKKwkJaWYgKGVycikgeworCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc2V0IEhDQSwgYWJvcnRpbmcuXG4iKTsKKwkJCWdvdG8gZXJyX3JlbF9vd247CisJCX0KIAl9CiAKK3NsYXZlX3N0YXJ0OgogCWlmIChtbHg0X2NtZF9pbml0KGRldikpIHsKIAkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXQgY29tbWFuZCBpbnRlcmZhY2UsIGFib3J0aW5nLlxuIik7Ci0JCWdvdG8gZXJyX2ZyZWVfZGV2OworCQlnb3RvIGVycl9zcmlvdjsKKwl9CisKKwkvKiBJbiBzbGF2ZSBmdW5jdGlvbnMsIHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgbXVzdCBiZSBpbml0aWFsaXplZAorCSAqIGJlZm9yZSBwb3N0aW5nIGNvbW1hbmRzLiBBbHNvLCBpbml0IG51bV9zbGF2ZXMgYmVmb3JlIGNhbGxpbmcKKwkgKiBtbHg0X2luaXRfaGNhICovCisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkgeworCQlpZiAobWx4NF9pc19tYXN0ZXIoZGV2KSkKKwkJCWRldi0+bnVtX3NsYXZlcyA9IE1MWDRfTUFYX05VTV9TTEFWRVM7CisJCWVsc2UgeworCQkJZGV2LT5udW1fc2xhdmVzID0gMDsKKwkJCWlmIChtbHg0X211bHRpX2Z1bmNfaW5pdChkZXYpKSB7CisJCQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIGluaXQgc2xhdmUgbWZ1bmMiCisJCQkJCSAiIGludGVyZmFjZSwgYWJvcnRpbmcuXG4iKTsKKwkJCQlnb3RvIGVycl9jbWQ7CisJCQl9CisJCX0KIAl9CiAKIAllcnIgPSBtbHg0X2luaXRfaGNhKGRldik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfY21kOworCWlmIChlcnIpIHsKKwkJaWYgKGVyciA9PSAtRUFDQ0VTKSB7CisJCQkvKiBOb3QgcHJpbWFyeSBQaHlzaWNhbCBmdW5jdGlvbgorCQkJICogUnVubmluZyBpbiBzbGF2ZSBtb2RlICovCisJCQltbHg0X2NtZF9jbGVhbnVwKGRldik7CisJCQlkZXYtPmZsYWdzIHw9IE1MWDRfRkxBR19TTEFWRTsKKwkJCWRldi0+ZmxhZ3MgJj0gfk1MWDRfRkxBR19NQVNURVI7CisJCQlnb3RvIHNsYXZlX3N0YXJ0OworCQl9IGVsc2UKKwkJCWdvdG8gZXJyX21mdW5jOworCX0KKworCS8qIEluIG1hc3RlciBmdW5jdGlvbnMsIHRoZSBjb21tdW5pY2F0aW9uIGNoYW5uZWwgbXVzdCBiZSBpbml0aWFsaXplZAorCSAqIGFmdGVyIG9idGFpbmluZyBpdHMgYWRkcmVzcyBmcm9tIGZ3ICovCisJaWYgKG1seDRfaXNfbWFzdGVyKGRldikpIHsKKwkJaWYgKG1seDRfbXVsdGlfZnVuY19pbml0KGRldikpIHsKKwkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byBpbml0IG1hc3RlciBtZnVuYyIKKwkJCQkgImludGVyZmFjZSwgYWJvcnRpbmcuXG4iKTsKKwkJCWdvdG8gZXJyX2Nsb3NlOworCQl9CisJfQogCiAJZXJyID0gbWx4NF9hbGxvY19lcV90YWJsZShkZXYpOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX2Nsb3NlOworCQlnb3RvIGVycl9tYXN0ZXJfbWZ1bmM7CiAKIAlwcml2LT5tc2l4X2N0bC5wb29sX2JtID0gMDsKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bXNpeF9jdGwucG9vbF9sb2NrKTsKIAogCW1seDRfZW5hYmxlX21zaV94KGRldik7Ci0KLQllcnIgPSBtbHg0X2luaXRfc3RlZXJpbmcoZGV2KTsKLQlpZiAoZXJyKQorCWlmICgobWx4NF9pc19tZnVuYyhkZXYpKSAmJgorCSAgICAhKGRldi0+ZmxhZ3MgJiBNTFg0X0ZMQUdfTVNJX1gpKSB7CisJCW1seDRfZXJyKGRldiwgIklOVHggaXMgbm90IHN1cHBvcnRlZCBpbiBtdWx0aS1mdW5jdGlvbiBtb2RlLiIKKwkJCSAiIGFib3J0aW5nLlxuIik7CiAJCWdvdG8gZXJyX2ZyZWVfZXE7CisJfQorCisJaWYgKCFtbHg0X2lzX3NsYXZlKGRldikpIHsKKwkJZXJyID0gbWx4NF9pbml0X3N0ZWVyaW5nKGRldik7CisJCWlmIChlcnIpCisJCQlnb3RvIGVycl9mcmVlX2VxOworCX0KIAogCWVyciA9IG1seDRfc2V0dXBfaGNhKGRldik7Ci0JaWYgKGVyciA9PSAtRUJVU1kgJiYgKGRldi0+ZmxhZ3MgJiBNTFg0X0ZMQUdfTVNJX1gpKSB7CisJaWYgKGVyciA9PSAtRUJVU1kgJiYgKGRldi0+ZmxhZ3MgJiBNTFg0X0ZMQUdfTVNJX1gpICYmCisJICAgICFtbHg0X2lzX21mdW5jKGRldikpIHsKIAkJZGV2LT5mbGFncyAmPSB+TUxYNF9GTEFHX01TSV9YOwogCQlwY2lfZGlzYWJsZV9tc2l4KHBkZXYpOwogCQllcnIgPSBtbHg0X3NldHVwX2hjYShkZXYpOwpAQCAtMTM4MywyMCArMTg4NywzNyBAQAogCW1seDRfY2xlYW51cF91YXJfdGFibGUoZGV2KTsKIAogZXJyX3N0ZWVyOgotCW1seDRfY2xlYXJfc3RlZXJpbmcoZGV2KTsKKwlpZiAoIW1seDRfaXNfc2xhdmUoZGV2KSkKKwkJbWx4NF9jbGVhcl9zdGVlcmluZyhkZXYpOwogCiBlcnJfZnJlZV9lcToKIAltbHg0X2ZyZWVfZXFfdGFibGUoZGV2KTsKIAorZXJyX21hc3Rlcl9tZnVuYzoKKwlpZiAobWx4NF9pc19tYXN0ZXIoZGV2KSkKKwkJbWx4NF9tdWx0aV9mdW5jX2NsZWFudXAoZGV2KTsKKwogZXJyX2Nsb3NlOgogCWlmIChkZXYtPmZsYWdzICYgTUxYNF9GTEFHX01TSV9YKQogCQlwY2lfZGlzYWJsZV9tc2l4KHBkZXYpOwogCiAJbWx4NF9jbG9zZV9oY2EoZGV2KTsKIAorZXJyX21mdW5jOgorCWlmIChtbHg0X2lzX3NsYXZlKGRldikpCisJCW1seDRfbXVsdGlfZnVuY19jbGVhbnVwKGRldik7CisKIGVycl9jbWQ6CiAJbWx4NF9jbWRfY2xlYW51cChkZXYpOwogCitlcnJfc3Jpb3Y6CisJaWYgKG51bV92ZnMgJiYgKGRldi0+ZmxhZ3MgJiBNTFg0X0ZMQUdfU1JJT1YpKQorCQlwY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKKworZXJyX3JlbF9vd246CisJaWYgKCFtbHg0X2lzX3NsYXZlKGRldikpCisJCW1seDRfZnJlZV9vd25lcnNoaXAoZGV2KTsKKwogZXJyX2ZyZWVfZGV2OgogCWtmcmVlKHByaXYpOwogCkBAIC0xNDI0LDYgKzE5NDUsMTIgQEAKIAlpbnQgcDsKIAogCWlmIChkZXYpIHsKKwkJLyogaW4gU1JJT1YgaXQgaXMgbm90IGFsbG93ZWQgdG8gdW5sb2FkIHRoZSBwZidzCisJCSAqIGRyaXZlciB3aGlsZSB0aGVyZSBhcmUgYWxpdmUgdmYncyAqLworCQlpZiAobWx4NF9pc19tYXN0ZXIoZGV2KSkgeworCQkJaWYgKG1seDRfaG93X21hbnlfbGl2ZXNfdmYoZGV2KSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIlJlbW92aW5nIFBGIHdoZW4gdGhlcmUgYXJlIGFzc2lnbmVkIFZGJ3MgISEhXG4iKTsKKwkJfQogCQltbHg0X3N0b3Bfc2Vuc2UoZGV2KTsKIAkJbWx4NF91bnJlZ2lzdGVyX2RldmljZShkZXYpOwogCkBAIC0xNDQzLDE3ICsxOTcwLDMxIEBACiAJCW1seDRfY2xlYW51cF94cmNkX3RhYmxlKGRldik7CiAJCW1seDRfY2xlYW51cF9wZF90YWJsZShkZXYpOwogCisJCWlmIChtbHg0X2lzX21hc3RlcihkZXYpKQorCQkJbWx4NF9mcmVlX3Jlc291cmNlX3RyYWNrZXIoZGV2KTsKKwogCQlpb3VubWFwKHByaXYtPmthcik7CiAJCW1seDRfdWFyX2ZyZWUoZGV2LCAmcHJpdi0+ZHJpdmVyX3Vhcik7CiAJCW1seDRfY2xlYW51cF91YXJfdGFibGUoZGV2KTsKLQkJbWx4NF9jbGVhcl9zdGVlcmluZyhkZXYpOworCQlpZiAoIW1seDRfaXNfc2xhdmUoZGV2KSkKKwkJCW1seDRfY2xlYXJfc3RlZXJpbmcoZGV2KTsKIAkJbWx4NF9mcmVlX2VxX3RhYmxlKGRldik7CisJCWlmIChtbHg0X2lzX21hc3RlcihkZXYpKQorCQkJbWx4NF9tdWx0aV9mdW5jX2NsZWFudXAoZGV2KTsKIAkJbWx4NF9jbG9zZV9oY2EoZGV2KTsKKwkJaWYgKG1seDRfaXNfc2xhdmUoZGV2KSkKKwkJCW1seDRfbXVsdGlfZnVuY19jbGVhbnVwKGRldik7CiAJCW1seDRfY21kX2NsZWFudXAoZGV2KTsKIAogCQlpZiAoZGV2LT5mbGFncyAmIE1MWDRfRkxBR19NU0lfWCkKIAkJCXBjaV9kaXNhYmxlX21zaXgocGRldik7CisJCWlmIChudW1fdmZzICYmIChkZXYtPmZsYWdzICYgTUxYNF9GTEFHX1NSSU9WKSkgeworCQkJbWx4NF93YXJuKGRldiwgIkRpc2FibGluZyBzcmlvdlxuIik7CisJCQlwY2lfZGlzYWJsZV9zcmlvdihwZGV2KTsKKwkJfQogCisJCWlmICghbWx4NF9pc19zbGF2ZShkZXYpKQorCQkJbWx4NF9mcmVlX293bmVyc2hpcChkZXYpOwogCQlrZnJlZShwcml2KTsKIAkJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpAQCAtMTQ2OCwzMyArMjAwOSw0OCBAQAogfQogCiBzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUobWx4NF9wY2lfdGFibGUpID0gewotCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4NjM0MCkgfSwgLyogTVQyNTQwOCAiSGVybW9uIiBTRFIgKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDYzNGEpIH0sIC8qIE1UMjU0MDggIkhlcm1vbiIgRERSICovCi0JeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHg2MzU0KSB9LCAvKiBNVDI1NDA4ICJIZXJtb24iIFFEUiAqLwotCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4NjczMikgfSwgLyogTVQyNTQwOCAiSGVybW9uIiBERFIgUENJZSBnZW4yICovCi0JeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHg2NzNjKSB9LCAvKiBNVDI1NDA4ICJIZXJtb24iIFFEUiBQQ0llIGdlbjIgKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDYzNjgpIH0sIC8qIE1UMjU0MDggIkhlcm1vbiIgRU4gMTBHaWdFICovCi0JeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHg2NzUwKSB9LCAvKiBNVDI1NDA4ICJIZXJtb24iIEVOIDEwR2lnRSBQQ0llIGdlbjIgKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDYzNzIpIH0sIC8qIE1UMjU0NTggQ29ubmVjdFggRU4gMTBHQkFTRS1UIDEwR2lnRSAqLwotCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4Njc1YSkgfSwgLyogTVQyNTQ1OCBDb25uZWN0WCBFTiAxMEdCQVNFLVQrR2VuMiAxMEdpZ0UgKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDY3NjQpIH0sIC8qIE1UMjY0NjggQ29ubmVjdFggRU4gMTBHaWdFIFBDSWUgZ2VuMiovCi0JeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHg2NzQ2KSB9LCAvKiBNVDI2NDM4IENvbm5lY3RYIEVOIDQwR2lnRSBQQ0llIGdlbjIgNUdUL3MgKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDY3NmUpIH0sIC8qIE1UMjY0NzggQ29ubmVjdFgyIDQwR2lnRSBQQ0llIGdlbjIgKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDEwMDIpIH0sIC8qIE1UMjU0MDAgRmFtaWx5IFtDb25uZWN0WC0yIFZpcnR1YWwgRnVuY3Rpb25dICovCi0JeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHgxMDAzKSB9LCAvKiBNVDI3NTAwIEZhbWlseSBbQ29ubmVjdFgtM10gKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDEwMDQpIH0sIC8qIE1UMjc1MDAgRmFtaWx5IFtDb25uZWN0WC0zIFZpcnR1YWwgRnVuY3Rpb25dICovCi0JeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHgxMDA1KSB9LCAvKiBNVDI3NTEwIEZhbWlseSAqLwotCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4MTAwNikgfSwgLyogTVQyNzUxMSBGYW1pbHkgKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDEwMDcpIH0sIC8qIE1UMjc1MjAgRmFtaWx5ICovCi0JeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHgxMDA4KSB9LCAvKiBNVDI3NTIxIEZhbWlseSAqLwotCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4MTAwOSkgfSwgLyogTVQyNzUzMCBGYW1pbHkgKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDEwMGEpIH0sIC8qIE1UMjc1MzEgRmFtaWx5ICovCi0JeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHgxMDBiKSB9LCAvKiBNVDI3NTQwIEZhbWlseSAqLwotCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4MTAwYykgfSwgLyogTVQyNzU0MSBGYW1pbHkgKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDEwMGQpIH0sIC8qIE1UMjc1NTAgRmFtaWx5ICovCi0JeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHgxMDBlKSB9LCAvKiBNVDI3NTUxIEZhbWlseSAqLwotCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4MTAwZikgfSwgLyogTVQyNzU2MCBGYW1pbHkgKi8KLQl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDEwMTApIH0sIC8qIE1UMjc1NjEgRmFtaWx5ICovCisJLyogTVQyNTQwOCAiSGVybW9uIiBTRFIgKi8KKwl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDYzNDApLCAwIH0sCisJLyogTVQyNTQwOCAiSGVybW9uIiBERFIgKi8KKwl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDYzNGEpLCAwIH0sCisJLyogTVQyNTQwOCAiSGVybW9uIiBRRFIgKi8KKwl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDYzNTQpLCAwIH0sCisJLyogTVQyNTQwOCAiSGVybW9uIiBERFIgUENJZSBnZW4yICovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHg2NzMyKSwgMCB9LAorCS8qIE1UMjU0MDggIkhlcm1vbiIgUURSIFBDSWUgZ2VuMiAqLworCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4NjczYyksIDAgfSwKKwkvKiBNVDI1NDA4ICJIZXJtb24iIEVOIDEwR2lnRSAqLworCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4NjM2OCksIDAgfSwKKwkvKiBNVDI1NDA4ICJIZXJtb24iIEVOIDEwR2lnRSBQQ0llIGdlbjIgKi8KKwl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDY3NTApLCAwIH0sCisJLyogTVQyNTQ1OCBDb25uZWN0WCBFTiAxMEdCQVNFLVQgMTBHaWdFICovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHg2MzcyKSwgMCB9LAorCS8qIE1UMjU0NTggQ29ubmVjdFggRU4gMTBHQkFTRS1UK0dlbjIgMTBHaWdFICovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHg2NzVhKSwgMCB9LAorCS8qIE1UMjY0NjggQ29ubmVjdFggRU4gMTBHaWdFIFBDSWUgZ2VuMiovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHg2NzY0KSwgMCB9LAorCS8qIE1UMjY0MzggQ29ubmVjdFggRU4gNDBHaWdFIFBDSWUgZ2VuMiA1R1QvcyAqLworCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4Njc0NiksIDAgfSwKKwkvKiBNVDI2NDc4IENvbm5lY3RYMiA0MEdpZ0UgUENJZSBnZW4yICovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHg2NzZlKSwgMCB9LAorCS8qIE1UMjU0MDAgRmFtaWx5IFtDb25uZWN0WC0yIFZpcnR1YWwgRnVuY3Rpb25dICovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHgxMDAyKSwgTUxYNF9WRiB9LAorCS8qIE1UMjc1MDAgRmFtaWx5IFtDb25uZWN0WC0zXSAqLworCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4MTAwMyksIDAgfSwKKwkvKiBNVDI3NTAwIEZhbWlseSBbQ29ubmVjdFgtMyBWaXJ0dWFsIEZ1bmN0aW9uXSAqLworCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4MTAwNCksIE1MWDRfVkYgfSwKKwl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDEwMDUpLCAwIH0sIC8qIE1UMjc1MTAgRmFtaWx5ICovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHgxMDA2KSwgMCB9LCAvKiBNVDI3NTExIEZhbWlseSAqLworCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4MTAwNyksIDAgfSwgLyogTVQyNzUyMCBGYW1pbHkgKi8KKwl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDEwMDgpLCAwIH0sIC8qIE1UMjc1MjEgRmFtaWx5ICovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHgxMDA5KSwgMCB9LCAvKiBNVDI3NTMwIEZhbWlseSAqLworCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4MTAwYSksIDAgfSwgLyogTVQyNzUzMSBGYW1pbHkgKi8KKwl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDEwMGIpLCAwIH0sIC8qIE1UMjc1NDAgRmFtaWx5ICovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHgxMDBjKSwgMCB9LCAvKiBNVDI3NTQxIEZhbWlseSAqLworCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4MTAwZCksIDAgfSwgLyogTVQyNzU1MCBGYW1pbHkgKi8KKwl7IFBDSV9WREVWSUNFKE1FTExBTk9YLCAweDEwMGUpLCAwIH0sIC8qIE1UMjc1NTEgRmFtaWx5ICovCisJeyBQQ0lfVkRFVklDRShNRUxMQU5PWCwgMHgxMDBmKSwgMCB9LCAvKiBNVDI3NTYwIEZhbWlseSAqLworCXsgUENJX1ZERVZJQ0UoTUVMTEFOT1gsIDB4MTAxMCksIDAgfSwgLyogTVQyNzU2MSBGYW1pbHkgKi8KIAl7IDAsIH0KIH07CiAKQEAgLTE1MjMsNiArMjA3OSwxMiBAQAogCQlyZXR1cm4gLTE7CiAJfQogCisJLyogQ2hlY2sgaWYgbW9kdWxlIHBhcmFtIGZvciBwb3J0cyB0eXBlIGhhcyBsZWdhbCBjb21iaW5hdGlvbiAqLworCWlmIChwb3J0X3R5cGVfYXJyYXlbMF0gPT0gZmFsc2UgJiYgcG9ydF90eXBlX2FycmF5WzFdID09IHRydWUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTW9kdWxlIHBhcmFtZXRlciBjb25maWd1cmF0aW9uIEVUSC9JQiBpcyBub3Qgc3VwcG9ydGVkLiBTd2l0Y2hpbmcgdG8gZGVmYXVsdCBjb25maWd1cmF0aW9uIElCL0lCXG4iKTsKKwkJcG9ydF90eXBlX2FycmF5WzBdID0gdHJ1ZTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tY2cuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWNnLmMKaW5kZXggOTc4Njg4Yy4uMDc4NWQ5YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tY2cuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21jZy5jCkBAIC00NCwyOCArNDQsNDcgQEAKIAogc3RhdGljIGNvbnN0IHU4IHplcm9fZ2lkWzE2XTsJLyogYXV0b21hdGljYWxseSBpbml0aWFsaXplZCB0byAwICovCiAKK3N0cnVjdCBtbHg0X21nbSB7CisJX19iZTMyCQkJbmV4dF9naWRfaW5kZXg7CisJX19iZTMyCQkJbWVtYmVyc19jb3VudDsKKwl1MzIJCQlyZXNlcnZlZFsyXTsKKwl1OAkJCWdpZFsxNl07CisJX19iZTMyCQkJcXBbTUxYNF9NQVhfUVBfUEVSX01HTV07Cit9OworCitpbnQgbWx4NF9nZXRfbWdtX2VudHJ5X3NpemUoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJcmV0dXJuIG1pbigoMSA8PCBtbHg0X2xvZ19udW1fbWdtX2VudHJ5X3NpemUpLCBNTFg0X01BWF9NR01fRU5UUllfU0laRSk7Cit9CisKK2ludCBtbHg0X2dldF9xcF9wZXJfbWdtKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCXJldHVybiA0ICogKG1seDRfZ2V0X21nbV9lbnRyeV9zaXplKGRldikgLyAxNiAtIDIpOworfQorCiBzdGF0aWMgaW50IG1seDRfUkVBRF9FTlRSWShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IGluZGV4LAogCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3gpCiB7CiAJcmV0dXJuIG1seDRfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgaW5kZXgsIDAsIE1MWDRfQ01EX1JFQURfTUNHLAotCQkJICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSk7CisJCQkgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9OQVRJVkUpOwogfQogCiBzdGF0aWMgaW50IG1seDRfV1JJVEVfRU5UUlkoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBpbmRleCwKIAkJCSAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveCkKIHsKIAlyZXR1cm4gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGluZGV4LCAwLCBNTFg0X0NNRF9XUklURV9NQ0csCi0JCQlNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCQkJTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9OQVRJVkUpOwogfQogCi1zdGF0aWMgaW50IG1seDRfV1JJVEVfUFJPTUlTQyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggdmVwX251bSwgdTggcG9ydCwgdTggc3RlZXIsCitzdGF0aWMgaW50IG1seDRfV1JJVEVfUFJPTUlTQyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTggc3RlZXIsCiAJCQkgICAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveCkKIHsKIAl1MzIgaW5fbW9kOwogCi0JaW5fbW9kID0gKHUzMikgdmVwX251bSA8PCAyNCB8ICh1MzIpIHBvcnQgPDwgMTYgfCBzdGVlciA8PCAxOworCWluX21vZCA9ICh1MzIpIHBvcnQgPDwgMTYgfCBzdGVlciA8PCAxOwogCXJldHVybiBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgaW5fbW9kLCAweDEsCi0JCQlNTFg0X0NNRF9XUklURV9NQ0csIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSk7CisJCQlNTFg0X0NNRF9XUklURV9NQ0csIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCU1MWDRfQ01EX05BVElWRSk7CiB9CiAKIHN0YXRpYyBpbnQgbWx4NF9HSURfSEFTSChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3gsCkBAIC03NSw3ICs5NCw4IEBACiAJaW50IGVycjsKIAogCWVyciA9IG1seDRfY21kX2ltbShkZXYsIG1haWxib3gtPmRtYSwgJmltbSwgMCwgb3BfbW9kLAotCQkJICAgTUxYNF9DTURfTUdJRF9IQVNILCBNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCQkJICAgTUxYNF9DTURfTUdJRF9IQVNILCBNTFg0X0NNRF9USU1FX0NMQVNTX0EsCisJCQkgICBNTFg0X0NNRF9OQVRJVkUpOwogCiAJaWYgKCFlcnIpCiAJCSpoYXNoID0gaW1tOwpAQCAtMTAyLDcgKzEyMiw3IEBACiAgKiBBZGQgbmV3IGVudHJ5IHRvIHN0ZWVyaW5nIGRhdGEgc3RydWN0dXJlLgogICogQWxsIHByb21pc2MgUVBzIHNob3VsZCBiZSBhZGRlZCBhcyB3ZWxsCiAgKi8KLXN0YXRpYyBpbnQgbmV3X3N0ZWVyaW5nX2VudHJ5KHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCB2ZXBfbnVtLCB1OCBwb3J0LAorc3RhdGljIGludCBuZXdfc3RlZXJpbmdfZW50cnkoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCiAJCQkgICAgICBlbnVtIG1seDRfc3RlZXJfdHlwZSBzdGVlciwKIAkJCSAgICAgIHVuc2lnbmVkIGludCBpbmRleCwgdTMyIHFwbikKIHsKQEAgLTExNSwxMCArMTM1LDggQEAKIAlzdHJ1Y3QgbWx4NF9wcm9taXNjX3FwICpkcXAgPSBOVUxMOwogCXUzMiBwcm90OwogCWludCBlcnI7Ci0JdTggcGZfbnVtOwogCi0JcGZfbnVtID0gKGRldi0+Y2Fwcy5udW1fcG9ydHMgPT0gMSkgPyB2ZXBfbnVtIDogKHZlcF9udW0gPDwgMSkgfCAocG9ydCAtIDEpOwotCXNfc3RlZXIgPSAmbWx4NF9wcml2KGRldiktPnN0ZWVyW3BmX251bV07CisJc19zdGVlciA9ICZtbHg0X3ByaXYoZGV2KS0+c3RlZXJbMF07CiAJbmV3X2VudHJ5ID0ga3phbGxvYyhzaXplb2YgKm5ld19lbnRyeSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFuZXdfZW50cnkpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTMwLDcgKzE0OCw3IEBACiAJLyogSWYgdGhlIGdpdmVuIHFwbiBpcyBhbHNvIGEgcHJvbWlzYyBxcCwKIAkgKiBpdCBzaG91bGQgYmUgaW5zZXJ0ZWQgdG8gZHVwbGljYXRlcyBsaXN0CiAJICovCi0JcHFwID0gZ2V0X3Byb21pc2NfcXAoZGV2LCBwZl9udW0sIHN0ZWVyLCBxcG4pOworCXBxcCA9IGdldF9wcm9taXNjX3FwKGRldiwgMCwgc3RlZXIsIHFwbik7CiAJaWYgKHBxcCkgewogCQlkcXAgPSBrbWFsbG9jKHNpemVvZiAqZHFwLCBHRlBfS0VSTkVMKTsKIAkJaWYgKCFkcXApIHsKQEAgLTE2NSw3ICsxODMsNyBAQAogCQkvKiBkb24ndCBhZGQgYWxyZWFkeSBleGlzdGluZyBxcG4gKi8KIAkJaWYgKHBxcC0+cXBuID09IHFwbikKIAkJCWNvbnRpbnVlOwotCQlpZiAobWVtYmVyc19jb3VudCA9PSBNTFg0X1FQX1BFUl9NR00pIHsKKwkJaWYgKG1lbWJlcnNfY291bnQgPT0gZGV2LT5jYXBzLm51bV9xcF9wZXJfbWdtKSB7CiAJCQkvKiBvdXQgb2Ygc3BhY2UgKi8KIAkJCWVyciA9IC1FTk9NRU07CiAJCQlnb3RvIG91dF9tYWlsYm94OwpAQCAtMTkzLDcgKzIxMSw3IEBACiB9CiAKIC8qIHVwZGF0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIHdpdGggZXhpc3Rpbmcgc3RlZXJpbmcgZW50cnkgKi8KLXN0YXRpYyBpbnQgZXhpc3Rpbmdfc3RlZXJpbmdfZW50cnkoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHZlcF9udW0sIHU4IHBvcnQsCitzdGF0aWMgaW50IGV4aXN0aW5nX3N0ZWVyaW5nX2VudHJ5KHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LAogCQkJCSAgIGVudW0gbWx4NF9zdGVlcl90eXBlIHN0ZWVyLAogCQkJCSAgIHVuc2lnbmVkIGludCBpbmRleCwgdTMyIHFwbikKIHsKQEAgLTIwMSwxMiArMjE5LDEwIEBACiAJc3RydWN0IG1seDRfc3RlZXJfaW5kZXggKnRtcF9lbnRyeSwgKmVudHJ5ID0gTlVMTDsKIAlzdHJ1Y3QgbWx4NF9wcm9taXNjX3FwICpwcXA7CiAJc3RydWN0IG1seDRfcHJvbWlzY19xcCAqZHFwOwotCXU4IHBmX251bTsKIAotCXBmX251bSA9IChkZXYtPmNhcHMubnVtX3BvcnRzID09IDEpID8gdmVwX251bSA6ICh2ZXBfbnVtIDw8IDEpIHwgKHBvcnQgLSAxKTsKLQlzX3N0ZWVyID0gJm1seDRfcHJpdihkZXYpLT5zdGVlcltwZl9udW1dOworCXNfc3RlZXIgPSAmbWx4NF9wcml2KGRldiktPnN0ZWVyWzBdOwogCi0JcHFwID0gZ2V0X3Byb21pc2NfcXAoZGV2LCBwZl9udW0sIHN0ZWVyLCBxcG4pOworCXBxcCA9IGdldF9wcm9taXNjX3FwKGRldiwgMCwgc3RlZXIsIHFwbik7CiAJaWYgKCFwcXApCiAJCXJldHVybiAwOyAvKiBub3RoaW5nIHRvIGRvICovCiAKQEAgLTIyNSw3ICsyNDEsNyBAQAogCSAqIHdlIG5lZWQgdG8gYWRkIGl0IGFzIGEgZHVwbGljYXRlIHRvIHRoaXMgZW50cnkKIAkgKiBmb3IgZnV0dXJlIHJlZmVyZW5jZXMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRxcCwgJmVudHJ5LT5kdXBsaWNhdGVzLCBsaXN0KSB7Ci0JCWlmIChxcG4gPT0gZHFwLT5xcG4pCisJCWlmIChxcG4gPT0gcHFwLT5xcG4pCiAJCQlyZXR1cm4gMDsgLyogcXAgaXMgYWxyZWFkeSBkdXBsaWNhdGVkICovCiAJfQogCkBAIC0yNDEsMjAgKzI1NywxOCBAQAogCiAvKiBDaGVjayB3aGV0aGVyIGEgcXBuIGlzIGEgZHVwbGljYXRlIG9uIHN0ZWVyaW5nIGVudHJ5CiAgKiBJZiBzbywgaXQgc2hvdWxkIG5vdCBiZSByZW1vdmVkIGZyb20gbWdtICovCi1zdGF0aWMgYm9vbCBjaGVja19kdXBsaWNhdGVfZW50cnkoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHZlcF9udW0sIHU4IHBvcnQsCitzdGF0aWMgYm9vbCBjaGVja19kdXBsaWNhdGVfZW50cnkoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCiAJCQkJICBlbnVtIG1seDRfc3RlZXJfdHlwZSBzdGVlciwKIAkJCQkgIHVuc2lnbmVkIGludCBpbmRleCwgdTMyIHFwbikKIHsKIAlzdHJ1Y3QgbWx4NF9zdGVlciAqc19zdGVlcjsKIAlzdHJ1Y3QgbWx4NF9zdGVlcl9pbmRleCAqdG1wX2VudHJ5LCAqZW50cnkgPSBOVUxMOwogCXN0cnVjdCBtbHg0X3Byb21pc2NfcXAgKmRxcCwgKnRtcF9kcXA7Ci0JdTggcGZfbnVtOwogCi0JcGZfbnVtID0gKGRldi0+Y2Fwcy5udW1fcG9ydHMgPT0gMSkgPyB2ZXBfbnVtIDogKHZlcF9udW0gPDwgMSkgfCAocG9ydCAtIDEpOwotCXNfc3RlZXIgPSAmbWx4NF9wcml2KGRldiktPnN0ZWVyW3BmX251bV07CisJc19zdGVlciA9ICZtbHg0X3ByaXYoZGV2KS0+c3RlZXJbMF07CiAKIAkvKiBpZiBxcCBpcyBub3QgcHJvbWlzYywgaXQgY2Fubm90IGJlIGR1cGxpY2F0ZWQgKi8KLQlpZiAoIWdldF9wcm9taXNjX3FwKGRldiwgcGZfbnVtLCBzdGVlciwgcXBuKSkKKwlpZiAoIWdldF9wcm9taXNjX3FwKGRldiwgMCwgc3RlZXIsIHFwbikpCiAJCXJldHVybiBmYWxzZTsKIAogCS8qIFRoZSBxcCBpcyBwcm9taXNjIHFwIHNvIGl0IGlzIGEgZHVwbGljYXRlIG9uIHRoaXMgaW5kZXgKQEAgLTI3OSw3ICsyOTMsNyBAQAogfQogCiAvKiBJIGEgc3RlZXJpbmcgZW50cnkgY29udGFpbnMgb25seSBwcm9taXNjIFFQcywgaXQgY2FuIGJlIHJlbW92ZWQuICovCi1zdGF0aWMgYm9vbCBjYW5fcmVtb3ZlX3N0ZWVyaW5nX2VudHJ5KHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCB2ZXBfbnVtLCB1OCBwb3J0LAorc3RhdGljIGJvb2wgY2FuX3JlbW92ZV9zdGVlcmluZ19lbnRyeShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwKIAkJCQkgICAgICBlbnVtIG1seDRfc3RlZXJfdHlwZSBzdGVlciwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgaW5kZXgsIHUzMiB0cXBuKQogewpAQCAtMjkxLDEwICszMDUsOCBAQAogCXUzMiBtZW1iZXJzX2NvdW50OwogCWJvb2wgcmV0ID0gZmFsc2U7CiAJaW50IGk7Ci0JdTggcGZfbnVtOwogCi0JcGZfbnVtID0gKGRldi0+Y2Fwcy5udW1fcG9ydHMgPT0gMSkgPyB2ZXBfbnVtIDogKHZlcF9udW0gPDwgMSkgfCAocG9ydCAtIDEpOwotCXNfc3RlZXIgPSAmbWx4NF9wcml2KGRldiktPnN0ZWVyW3BmX251bV07CisJc19zdGVlciA9ICZtbHg0X3ByaXYoZGV2KS0+c3RlZXJbMF07CiAKIAltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOwogCWlmIChJU19FUlIobWFpbGJveCkpCkBAIC0zMDYsNyArMzE4LDcgQEAKIAltZW1iZXJzX2NvdW50ID0gYmUzMl90b19jcHUobWdtLT5tZW1iZXJzX2NvdW50KSAmIDB4ZmZmZmZmOwogCWZvciAoaSA9IDA7ICBpIDwgbWVtYmVyc19jb3VudDsgaSsrKSB7CiAJCXFwbiA9IGJlMzJfdG9fY3B1KG1nbS0+cXBbaV0pICYgTUdNX1FQTl9NQVNLOwotCQlpZiAoIWdldF9wcm9taXNjX3FwKGRldiwgcGZfbnVtLCBzdGVlciwgcXBuKSAmJiBxcG4gIT0gdHFwbikgeworCQlpZiAoIWdldF9wcm9taXNjX3FwKGRldiwgMCwgc3RlZXIsIHFwbikgJiYgcXBuICE9IHRxcG4pIHsKIAkJCS8qIHRoZSBxcCBpcyBub3QgcHJvbWlzYywgdGhlIGVudHJ5IGNhbid0IGJlIHJlbW92ZWQgKi8KIAkJCWdvdG8gb3V0OwogCQl9CkBAIC0zMzIsNyArMzQ0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGFkZF9wcm9taXNjX3FwKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCB2ZXBfbnVtLCB1OCBwb3J0LAorc3RhdGljIGludCBhZGRfcHJvbWlzY19xcChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwKIAkJCSAgZW51bSBtbHg0X3N0ZWVyX3R5cGUgc3RlZXIsIHUzMiBxcG4pCiB7CiAJc3RydWN0IG1seDRfc3RlZXIgKnNfc3RlZXI7CkBAIC0zNDcsMTQgKzM1OSwxMyBAQAogCWJvb2wgZm91bmQ7CiAJaW50IGxhc3RfaW5kZXg7CiAJaW50IGVycjsKLQl1OCBwZl9udW07CiAJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwotCXBmX251bSA9IChkZXYtPmNhcHMubnVtX3BvcnRzID09IDEpID8gdmVwX251bSA6ICh2ZXBfbnVtIDw8IDEpIHwgKHBvcnQgLSAxKTsKLQlzX3N0ZWVyID0gJm1seDRfcHJpdihkZXYpLT5zdGVlcltwZl9udW1dOworCisJc19zdGVlciA9ICZtbHg0X3ByaXYoZGV2KS0+c3RlZXJbMF07CiAKIAltdXRleF9sb2NrKCZwcml2LT5tY2dfdGFibGUubXV0ZXgpOwogCi0JaWYgKGdldF9wcm9taXNjX3FwKGRldiwgcGZfbnVtLCBzdGVlciwgcXBuKSkgeworCWlmIChnZXRfcHJvbWlzY19xcChkZXYsIDAsIHN0ZWVyLCBxcG4pKSB7CiAJCWVyciA9IDA7ICAvKiBOb3RpbmcgdG8gZG8sIGFscmVhZHkgZXhpc3RzICovCiAJCWdvdG8gb3V0X211dGV4OwogCX0KQEAgLTM5Nyw3ICs0MDgsNyBAQAogCQl9CiAJCWlmICghZm91bmQpIHsKIAkJCS8qIE5lZWQgdG8gYWRkIHRoZSBxcG4gdG8gbWdtICovCi0JCQlpZiAobWVtYmVyc19jb3VudCA9PSBNTFg0X1FQX1BFUl9NR00pIHsKKwkJCWlmIChtZW1iZXJzX2NvdW50ID09IGRldi0+Y2Fwcy5udW1fcXBfcGVyX21nbSkgewogCQkJCS8qIGVudHJ5IGlzIGZ1bGwgKi8KIAkJCQllcnIgPSAtRU5PTUVNOwogCQkJCWdvdG8gb3V0X21haWxib3g7CkBAIC00MjAsNyArNDMxLDcgQEAKIAkJbWdtLT5xcFttZW1iZXJzX2NvdW50KytdID0gY3B1X3RvX2JlMzIoZHFwLT5xcG4gJiBNR01fUVBOX01BU0spOwogCW1nbS0+bWVtYmVyc19jb3VudCA9IGNwdV90b19iZTMyKG1lbWJlcnNfY291bnQgfCBNTFg0X1BST1RfRVRIIDw8IDMwKTsKIAotCWVyciA9IG1seDRfV1JJVEVfUFJPTUlTQyhkZXYsIHZlcF9udW0sIHBvcnQsIHN0ZWVyLCBtYWlsYm94KTsKKwllcnIgPSBtbHg0X1dSSVRFX1BST01JU0MoZGV2LCBwb3J0LCBzdGVlciwgbWFpbGJveCk7CiAJaWYgKGVycikKIAkJZ290byBvdXRfbGlzdDsKIApAQCAtNDM5LDcgKzQ1MCw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZW1vdmVfcHJvbWlzY19xcChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggdmVwX251bSwgdTggcG9ydCwKK3N0YXRpYyBpbnQgcmVtb3ZlX3Byb21pc2NfcXAoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCiAJCQkgICAgIGVudW0gbWx4NF9zdGVlcl90eXBlIHN0ZWVyLCB1MzIgcXBuKQogewogCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKQEAgLTQ1NCwxMyArNDY1LDExIEBACiAJYm9vbCBiYWNrX3RvX2xpc3QgPSBmYWxzZTsKIAlpbnQgbG9jLCBpOwogCWludCBlcnI7Ci0JdTggcGZfbnVtOwogCi0JcGZfbnVtID0gKGRldi0+Y2Fwcy5udW1fcG9ydHMgPT0gMSkgPyB2ZXBfbnVtIDogKHZlcF9udW0gPDwgMSkgfCAocG9ydCAtIDEpOwotCXNfc3RlZXIgPSAmbWx4NF9wcml2KGRldiktPnN0ZWVyW3BmX251bV07CisJc19zdGVlciA9ICZtbHg0X3ByaXYoZGV2KS0+c3RlZXJbMF07CiAJbXV0ZXhfbG9jaygmcHJpdi0+bWNnX3RhYmxlLm11dGV4KTsKIAotCXBxcCA9IGdldF9wcm9taXNjX3FwKGRldiwgcGZfbnVtLCBzdGVlciwgcXBuKTsKKwlwcXAgPSBnZXRfcHJvbWlzY19xcChkZXYsIDAsIHN0ZWVyLCBxcG4pOwogCWlmICh1bmxpa2VseSghcHFwKSkgewogCQltbHg0X3dhcm4oZGV2LCAiUVAgJXggaXMgbm90IHByb21pc2N1b3VzIFFQXG4iLCBxcG4pOwogCQkvKiBub3RoaW5nIHRvIGRvICovCkBAIC00NzksMTIgKzQ4OCwxMyBAQAogCQlnb3RvIG91dF9saXN0OwogCX0KIAltZ20gPSBtYWlsYm94LT5idWY7CisJbWVtc2V0KG1nbSwgMCwgc2l6ZW9mICptZ20pOwogCW1lbWJlcnNfY291bnQgPSAwOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoZHFwLCAmc19zdGVlci0+cHJvbWlzY19xcHNbc3RlZXJdLCBsaXN0KQogCQltZ20tPnFwW21lbWJlcnNfY291bnQrK10gPSBjcHVfdG9fYmUzMihkcXAtPnFwbiAmIE1HTV9RUE5fTUFTSyk7CiAJbWdtLT5tZW1iZXJzX2NvdW50ID0gY3B1X3RvX2JlMzIobWVtYmVyc19jb3VudCB8IE1MWDRfUFJPVF9FVEggPDwgMzApOwogCi0JZXJyID0gbWx4NF9XUklURV9QUk9NSVNDKGRldiwgdmVwX251bSwgcG9ydCwgc3RlZXIsIG1haWxib3gpOworCWVyciA9IG1seDRfV1JJVEVfUFJPTUlTQyhkZXYsIHBvcnQsIHN0ZWVyLCBtYWlsYm94KTsKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9tYWlsYm94OwogCkBAIC02NDksMTIgKzY1OSwxMyBAQAogCQl9CiAJCWluZGV4ICs9IGRldi0+Y2Fwcy5udW1fbWdtczsKIAorCQluZXdfZW50cnkgPSAxOwogCQltZW1zZXQobWdtLCAwLCBzaXplb2YgKm1nbSk7CiAJCW1lbWNweShtZ20tPmdpZCwgZ2lkLCAxNik7CiAJfQogCiAJbWVtYmVyc19jb3VudCA9IGJlMzJfdG9fY3B1KG1nbS0+bWVtYmVyc19jb3VudCkgJiAweGZmZmZmZjsKLQlpZiAobWVtYmVyc19jb3VudCA9PSBNTFg0X1FQX1BFUl9NR00pIHsKKwlpZiAobWVtYmVyc19jb3VudCA9PSBkZXYtPmNhcHMubnVtX3FwX3Blcl9tZ20pIHsKIAkJbWx4NF9lcnIoZGV2LCAiTUdNIGF0IGluZGV4ICV4IGlzIGZ1bGwuXG4iLCBpbmRleCk7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gb3V0OwpAQCAtNjk2LDkgKzcwNyw5IEBACiAJaWYgKHByb3QgPT0gTUxYNF9QUk9UX0VUSCkgewogCQkvKiBtYW5hZ2UgdGhlIHN0ZWVyaW5nIGVudHJ5IGZvciBwcm9taXNjIG1vZGUgKi8KIAkJaWYgKG5ld19lbnRyeSkKLQkJCW5ld19zdGVlcmluZ19lbnRyeShkZXYsIDAsIHBvcnQsIHN0ZWVyLCBpbmRleCwgcXAtPnFwbik7CisJCQluZXdfc3RlZXJpbmdfZW50cnkoZGV2LCBwb3J0LCBzdGVlciwgaW5kZXgsIHFwLT5xcG4pOwogCQllbHNlCi0JCQlleGlzdGluZ19zdGVlcmluZ19lbnRyeShkZXYsIDAsIHBvcnQsIHN0ZWVyLAorCQkJZXhpc3Rpbmdfc3RlZXJpbmdfZW50cnkoZGV2LCBwb3J0LCBzdGVlciwKIAkJCQkJCWluZGV4LCBxcC0+cXBuKTsKIAl9CiAJaWYgKGVyciAmJiBsaW5rICYmIGluZGV4ICE9IC0xKSB7CkBAIC03NDksNyArNzYwLDcgQEAKIAogCS8qIGlmIHRoaXMgcHEgaXMgYWxzbyBhIHByb21pc2MgcXAsIGl0IHNob3VsZG4ndCBiZSByZW1vdmVkICovCiAJaWYgKHByb3QgPT0gTUxYNF9QUk9UX0VUSCAmJgotCSAgICBjaGVja19kdXBsaWNhdGVfZW50cnkoZGV2LCAwLCBwb3J0LCBzdGVlciwgaW5kZXgsIHFwLT5xcG4pKQorCSAgICBjaGVja19kdXBsaWNhdGVfZW50cnkoZGV2LCBwb3J0LCBzdGVlciwgaW5kZXgsIHFwLT5xcG4pKQogCQlnb3RvIG91dDsKIAogCW1lbWJlcnNfY291bnQgPSBiZTMyX3RvX2NwdShtZ20tPm1lbWJlcnNfY291bnQpICYgMHhmZmZmZmY7CkBAIC03NjksNyArNzgwLDggQEAKIAltZ20tPnFwW2kgLSAxXSAgICAgPSAwOwogCiAJaWYgKHByb3QgPT0gTUxYNF9QUk9UX0VUSCkKLQkJcmVtb3ZlZF9lbnRyeSA9IGNhbl9yZW1vdmVfc3RlZXJpbmdfZW50cnkoZGV2LCAwLCBwb3J0LCBzdGVlciwgaW5kZXgsIHFwLT5xcG4pOworCQlyZW1vdmVkX2VudHJ5ID0gY2FuX3JlbW92ZV9zdGVlcmluZ19lbnRyeShkZXYsIHBvcnQsIHN0ZWVyLAorCQkJCQkJCQlpbmRleCwgcXAtPnFwbik7CiAJaWYgKGkgIT0gMSAmJiAocHJvdCAhPSBNTFg0X1BST1RfRVRIIHx8ICFyZW1vdmVkX2VudHJ5KSkgewogCQllcnIgPSBtbHg0X1dSSVRFX0VOVFJZKGRldiwgaW5kZXgsIG1haWxib3gpOwogCQlnb3RvIG91dDsKQEAgLTgyOCw2ICs4NDAsMzQgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IG1seDRfUVBfQVRUQUNIKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9xcCAqcXAsCisJCQkgIHU4IGdpZFsxNl0sIHU4IGF0dGFjaCwgdTggYmxvY2tfbG9vcGJhY2ssCisJCQkgIGVudW0gbWx4NF9wcm90b2NvbCBwcm90KQoreworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OworCWludCBlcnIgPSAwOworCWludCBxcG47CisKKwlpZiAoIW1seDRfaXNfbWZ1bmMoZGV2KSkKKwkJcmV0dXJuIC1FQkFERjsKKworCW1haWxib3ggPSBtbHg0X2FsbG9jX2NtZF9tYWlsYm94KGRldik7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CisKKwltZW1jcHkobWFpbGJveC0+YnVmLCBnaWQsIDE2KTsKKwlxcG4gPSBxcC0+cXBuOworCXFwbiB8PSAocHJvdCA8PCAyOCk7CisJaWYgKGF0dGFjaCAmJiBibG9ja19sb29wYmFjaykKKwkJcXBuIHw9ICgxIDw8IDMxKTsKKworCWVyciA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBxcG4sIGF0dGFjaCwKKwkJICAgICAgIE1MWDRfQ01EX1FQX0FUVEFDSCwgTUxYNF9DTURfVElNRV9DTEFTU19BLAorCQkgICAgICAgTUxYNF9DTURfV1JBUFBFRCk7CisKKwltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKKwlyZXR1cm4gZXJyOworfQogCiBpbnQgbWx4NF9tdWx0aWNhc3RfYXR0YWNoKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9xcCAqcXAsIHU4IGdpZFsxNl0sCiAJCQkgIGludCBibG9ja19tY2FzdF9sb29wYmFjaywgZW51bSBtbHg0X3Byb3RvY29sIHByb3QpCkBAIC04NDMsOSArODgzLDEyIEBACiAJaWYgKHByb3QgPT0gTUxYNF9QUk9UX0VUSCkKIAkJZ2lkWzddIHw9IChzdGVlciA8PCAxKTsKIAotCXJldHVybiBtbHg0X3FwX2F0dGFjaF9jb21tb24oZGV2LCBxcCwgZ2lkLAotCQkJCSAgICAgYmxvY2tfbWNhc3RfbG9vcGJhY2ssIHByb3QsCi0JCQkJICAgICBzdGVlcik7CisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkKKwkJcmV0dXJuIG1seDRfUVBfQVRUQUNIKGRldiwgcXAsIGdpZCwgMSwKKwkJCQkJYmxvY2tfbWNhc3RfbG9vcGJhY2ssIHByb3QpOworCisJcmV0dXJuIG1seDRfcXBfYXR0YWNoX2NvbW1vbihkZXYsIHFwLCBnaWQsIGJsb2NrX21jYXN0X2xvb3BiYWNrLAorCQkJCQlwcm90LCBzdGVlcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X211bHRpY2FzdF9hdHRhY2gpOwogCkBAIC04NjAsMjIgKzkwMyw5MCBAQAogCQkJIShkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19WRVBfTUNfU1RFRVIpKQogCQlyZXR1cm4gMDsKIAotCWlmIChwcm90ID09IE1MWDRfUFJPVF9FVEgpIHsKKwlpZiAocHJvdCA9PSBNTFg0X1BST1RfRVRIKQogCQlnaWRbN10gfD0gKHN0ZWVyIDw8IDEpOwotCX0KKworCWlmIChtbHg0X2lzX21mdW5jKGRldikpCisJCXJldHVybiBtbHg0X1FQX0FUVEFDSChkZXYsIHFwLCBnaWQsIDAsIDAsIHByb3QpOwogCiAJcmV0dXJuIG1seDRfcXBfZGV0YWNoX2NvbW1vbihkZXYsIHFwLCBnaWQsIHByb3QsIHN0ZWVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfbXVsdGljYXN0X2RldGFjaCk7CiAKK2ludCBtbHg0X3VuaWNhc3RfYXR0YWNoKHN0cnVjdCBtbHg0X2RldiAqZGV2LAorCQkJc3RydWN0IG1seDRfcXAgKnFwLCB1OCBnaWRbMTZdLAorCQkJaW50IGJsb2NrX21jYXN0X2xvb3BiYWNrLCBlbnVtIG1seDRfcHJvdG9jb2wgcHJvdCkKK3sKKwlpZiAocHJvdCA9PSBNTFg0X1BST1RfRVRIICYmCisJCQkhKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUikpCisJCXJldHVybiAwOworCisJaWYgKHByb3QgPT0gTUxYNF9QUk9UX0VUSCkKKwkJZ2lkWzddIHw9IChNTFg0X1VDX1NURUVSIDw8IDEpOworCisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkKKwkJcmV0dXJuIG1seDRfUVBfQVRUQUNIKGRldiwgcXAsIGdpZCwgMSwKKwkJCQkJYmxvY2tfbWNhc3RfbG9vcGJhY2ssIHByb3QpOworCisJcmV0dXJuIG1seDRfcXBfYXR0YWNoX2NvbW1vbihkZXYsIHFwLCBnaWQsIGJsb2NrX21jYXN0X2xvb3BiYWNrLAorCQkJCQlwcm90LCBNTFg0X1VDX1NURUVSKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1seDRfdW5pY2FzdF9hdHRhY2gpOworCitpbnQgbWx4NF91bmljYXN0X2RldGFjaChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfcXAgKnFwLAorCQkJICAgICAgIHU4IGdpZFsxNl0sIGVudW0gbWx4NF9wcm90b2NvbCBwcm90KQoreworCWlmIChwcm90ID09IE1MWDRfUFJPVF9FVEggJiYKKwkJCSEoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX1VDX1NURUVSKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAocHJvdCA9PSBNTFg0X1BST1RfRVRIKQorCQlnaWRbN10gfD0gKE1MWDRfVUNfU1RFRVIgPDwgMSk7CisKKwlpZiAobWx4NF9pc19tZnVuYyhkZXYpKQorCQlyZXR1cm4gbWx4NF9RUF9BVFRBQ0goZGV2LCBxcCwgZ2lkLCAwLCAwLCBwcm90KTsKKworCXJldHVybiBtbHg0X3FwX2RldGFjaF9jb21tb24oZGV2LCBxcCwgZ2lkLCBwcm90LCBNTFg0X1VDX1NURUVSKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1seDRfdW5pY2FzdF9kZXRhY2gpOworCitpbnQgbWx4NF9QUk9NSVNDX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJdTMyIHFwbiA9ICh1MzIpIHZoY3ItPmluX3BhcmFtICYgMHhmZmZmZmZmZjsKKwl1OCBwb3J0ID0gdmhjci0+aW5fcGFyYW0gPj4gNjI7CisJZW51bSBtbHg0X3N0ZWVyX3R5cGUgc3RlZXIgPSB2aGNyLT5pbl9tb2RpZmllcjsKKworCS8qIFByb21pc2N1b3VzIHVuaWNhc3QgaXMgbm90IGFsbG93ZWQgaW4gbWZ1bmMgKi8KKwlpZiAobWx4NF9pc19tZnVuYyhkZXYpICYmIHN0ZWVyID09IE1MWDRfVUNfU1RFRVIpCisJCXJldHVybiAwOworCisJaWYgKHZoY3ItPm9wX21vZGlmaWVyKQorCQlyZXR1cm4gYWRkX3Byb21pc2NfcXAoZGV2LCBwb3J0LCBzdGVlciwgcXBuKTsKKwllbHNlCisJCXJldHVybiByZW1vdmVfcHJvbWlzY19xcChkZXYsIHBvcnQsIHN0ZWVyLCBxcG4pOworfQorCitzdGF0aWMgaW50IG1seDRfUFJPTUlTQyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIHFwbiwKKwkJCWVudW0gbWx4NF9zdGVlcl90eXBlIHN0ZWVyLCB1OCBhZGQsIHU4IHBvcnQpCit7CisJcmV0dXJuIG1seDRfY21kKGRldiwgKHU2NCkgcXBuIHwgKHU2NCkgcG9ydCA8PCA2MiwgKHUzMikgc3RlZXIsIGFkZCwKKwkJCU1MWDRfQ01EX1BST01JU0MsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCU1MWDRfQ01EX1dSQVBQRUQpOworfQogCiBpbnQgbWx4NF9tdWx0aWNhc3RfcHJvbWlzY19hZGQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiBxcG4sIHU4IHBvcnQpCiB7CiAJaWYgKCEoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX01DX1NURUVSKSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAobWx4NF9pc19tZnVuYyhkZXYpKQorCQlyZXR1cm4gbWx4NF9QUk9NSVNDKGRldiwgcXBuLCBNTFg0X01DX1NURUVSLCAxLCBwb3J0KTsKIAotCXJldHVybiBhZGRfcHJvbWlzY19xcChkZXYsIDAsIHBvcnQsIE1MWDRfTUNfU1RFRVIsIHFwbik7CisJcmV0dXJuIGFkZF9wcm9taXNjX3FwKGRldiwgcG9ydCwgTUxYNF9NQ19TVEVFUiwgcXBuKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfbXVsdGljYXN0X3Byb21pc2NfYWRkKTsKIApAQCAtODg0LDggKzk5NSwxMCBAQAogCWlmICghKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9NQ19TVEVFUikpCiAJCXJldHVybiAwOwogCisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkKKwkJcmV0dXJuIG1seDRfUFJPTUlTQyhkZXYsIHFwbiwgTUxYNF9NQ19TVEVFUiwgMCwgcG9ydCk7CiAKLQlyZXR1cm4gcmVtb3ZlX3Byb21pc2NfcXAoZGV2LCAwLCBwb3J0LCBNTFg0X01DX1NURUVSLCBxcG4pOworCXJldHVybiByZW1vdmVfcHJvbWlzY19xcChkZXYsIHBvcnQsIE1MWDRfTUNfU1RFRVIsIHFwbik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X211bHRpY2FzdF9wcm9taXNjX3JlbW92ZSk7CiAKQEAgLTg5NCw4ICsxMDA3LDEwIEBACiAJaWYgKCEoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX01DX1NURUVSKSkKIAkJcmV0dXJuIDA7CiAKKwlpZiAobWx4NF9pc19tZnVuYyhkZXYpKQorCQlyZXR1cm4gbWx4NF9QUk9NSVNDKGRldiwgcXBuLCBNTFg0X1VDX1NURUVSLCAxLCBwb3J0KTsKIAotCXJldHVybiBhZGRfcHJvbWlzY19xcChkZXYsIDAsIHBvcnQsIE1MWDRfVUNfU1RFRVIsIHFwbik7CisJcmV0dXJuIGFkZF9wcm9taXNjX3FwKGRldiwgcG9ydCwgTUxYNF9VQ19TVEVFUiwgcXBuKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfdW5pY2FzdF9wcm9taXNjX2FkZCk7CiAKQEAgLTkwNCw3ICsxMDE5LDEwIEBACiAJaWYgKCEoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX01DX1NURUVSKSkKIAkJcmV0dXJuIDA7CiAKLQlyZXR1cm4gcmVtb3ZlX3Byb21pc2NfcXAoZGV2LCAwLCBwb3J0LCBNTFg0X1VDX1NURUVSLCBxcG4pOworCWlmIChtbHg0X2lzX21mdW5jKGRldikpCisJCXJldHVybiBtbHg0X1BST01JU0MoZGV2LCBxcG4sIE1MWDRfVUNfU1RFRVIsIDAsIHBvcnQpOworCisJcmV0dXJuIHJlbW92ZV9wcm9taXNjX3FwKGRldiwgcG9ydCwgTUxYNF9VQ19TVEVFUiwgcXBuKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfdW5pY2FzdF9wcm9taXNjX3JlbW92ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0LmgKaW5kZXggNWRmYTY4Zi4uYTgwMTIxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0LmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tbHg0LmgKQEAgLTQ2LDIxICs0NiwyNSBAQAogI2luY2x1ZGUgPGxpbnV4L21seDQvZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbWx4NC9kcml2ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9tbHg0L2Rvb3JiZWxsLmg+CisjaW5jbHVkZSA8bGludXgvbWx4NC9jbWQuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkibWx4NF9jb3JlIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMS4wIgotI2RlZmluZSBEUlZfUkVMREFURQkiSnVseSAxNCwgMjAxMSIKKyNkZWZpbmUgUEZYCQlEUlZfTkFNRSAiOiAiCisjZGVmaW5lIERSVl9WRVJTSU9OCSIxLjEiCisjZGVmaW5lIERSVl9SRUxEQVRFCSJEZWMsIDIwMTEiCiAKIGVudW0gewogCU1MWDRfSENSX0JBU0UJCT0gMHg4MDY4MCwKIAlNTFg0X0hDUl9TSVpFCQk9IDB4MDAwMWMsCi0JTUxYNF9DTFJfSU5UX1NJWkUJPSAweDAwMDA4CisJTUxYNF9DTFJfSU5UX1NJWkUJPSAweDAwMDA4LAorCU1MWDRfU0xBVkVfQ09NTV9CQVNFCT0gMHgwLAorCU1MWDRfQ09NTV9QQUdFU0laRQk9IDB4MTAwMAogfTsKIAogZW51bSB7Ci0JTUxYNF9NR01fRU5UUllfU0laRQk9ICAweDEwMCwKLQlNTFg0X1FQX1BFUl9NR00JCT0gNCAqIChNTFg0X01HTV9FTlRSWV9TSVpFIC8gMTYgLSAyKSwKLQlNTFg0X01UVF9FTlRSWV9QRVJfU0VHCT0gOAorCU1MWDRfTUFYX01HTV9FTlRSWV9TSVpFID0gMHgxMDAwLAorCU1MWDRfTUFYX1FQX1BFUl9NR00JPSA0ICogKE1MWDRfTUFYX01HTV9FTlRSWV9TSVpFIC8gMTYgLSAyKSwKKwlNTFg0X01UVF9FTlRSWV9QRVJfU0VHCT0gOCwKIH07CiAKIGVudW0gewpAQCAtODAsNiArODQsOTQgQEAKIAlNTFg0X05VTV9DTVBUUwkJPSBNTFg0X0NNUFRfTlVNX1RZUEUgPDwgTUxYNF9DTVBUX1NISUZUCiB9OwogCitlbnVtIG1seDRfbXJfc3RhdGUgeworCU1MWDRfTVJfRElTQUJMRUQgPSAwLAorCU1MWDRfTVJfRU5fSFcsCisJTUxYNF9NUl9FTl9TVworfTsKKworI2RlZmluZSBNTFg0X0NPTU1fVElNRQkJMTAwMDAKK2VudW0geworCU1MWDRfQ09NTV9DTURfUkVTRVQsCisJTUxYNF9DT01NX0NNRF9WSENSMCwKKwlNTFg0X0NPTU1fQ01EX1ZIQ1IxLAorCU1MWDRfQ09NTV9DTURfVkhDUjIsCisJTUxYNF9DT01NX0NNRF9WSENSX0VOLAorCU1MWDRfQ09NTV9DTURfVkhDUl9QT1NULAorCU1MWDRfQ09NTV9DTURfRkxSID0gMjU0Cit9OworCisvKlRoZSBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBzbGF2ZSBzaG91bGQgZGVsYXkgdGhlIFJFU0VUIGNtZCovCisjZGVmaW5lIE1MWDRfREVMQVlfUkVTRVRfU0xBVkUgMHhiYmJiYmJiCisvKmluZGljYXRlcyBob3cgbWFueSByZXRyaWVzIHdpbGwgYmUgZG9uZSBpZiB3ZSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBGTFIqLworI2RlZmluZSBOVU1fT0ZfUkVTRVRfUkVUUklFUwkxMAorI2RlZmluZSBTTEVFUF9USU1FX0lOX1JFU0VUCSgyICogMTAwMCkKK2VudW0gbWx4NF9yZXNvdXJjZSB7CisJUkVTX1FQLAorCVJFU19DUSwKKwlSRVNfU1JRLAorCVJFU19YUkNELAorCVJFU19NUFQsCisJUkVTX01UVCwKKwlSRVNfTUFDLAorCVJFU19WTEFOLAorCVJFU19FUSwKKwlSRVNfQ09VTlRFUiwKKwlNTFg0X05VTV9PRl9SRVNPVVJDRV9UWVBFCit9OworCitlbnVtIG1seDRfYWxsb2NfbW9kZSB7CisJUkVTX09QX1JFU0VSVkUsCisJUkVTX09QX1JFU0VSVkVfQU5EX01BUCwKKwlSRVNfT1BfTUFQX0lDTSwKK307CisKKworLyoKKyAqVmlydHVhbCBIQ1Igc3RydWN0dXJlcy4KKyAqIG1seDRfdmhjciBpcyB0aGUgc3cgcmVwcmVzZW50YXRpb24sIGluIG1hY2hpbmUgZW5kaWFuZXNzCisgKgorICogbWx4NF92aGNyX2NtZCBpcyB0aGUgZm9ybWFsaXplZCBzdHJ1Y3R1cmUsIHRoZSBvbmUgdGhhdCBpcyBwYXNzZWQKKyAqIHRvIEZXIHRvIGdvIHRocm91Z2ggY29tbXVuaWNhdGlvbiBjaGFubmVsLgorICogSXQgaXMgYmlnIGVuZGlhbiwgYW5kIGhhcyB0aGUgc2FtZSBzdHJ1Y3R1cmUgYXMgdGhlIHBoeXNpY2FsIEhDUgorICogdXNlZCBieSBjb21tYW5kIGludGVyZmFjZQorICovCitzdHJ1Y3QgbWx4NF92aGNyIHsKKwl1NjQJaW5fcGFyYW07CisJdTY0CW91dF9wYXJhbTsKKwl1MzIJaW5fbW9kaWZpZXI7CisJdTMyCWVycm5vOworCXUxNglvcDsKKwl1MTYJdG9rZW47CisJdTgJb3BfbW9kaWZpZXI7CisJdTgJZV9iaXQ7Cit9OworCitzdHJ1Y3QgbWx4NF92aGNyX2NtZCB7CisJX19iZTY0IGluX3BhcmFtOworCV9fYmUzMiBpbl9tb2RpZmllcjsKKwlfX2JlNjQgb3V0X3BhcmFtOworCV9fYmUxNiB0b2tlbjsKKwl1MTYgcmVzZXJ2ZWQ7CisJdTggc3RhdHVzOworCXU4IGZsYWdzOworCV9fYmUxNiBvcGNvZGU7Cit9OworCitzdHJ1Y3QgbWx4NF9jbWRfaW5mbyB7CisJdTE2IG9wY29kZTsKKwlib29sIGhhc19pbmJveDsKKwlib29sIGhhc19vdXRib3g7CisJYm9vbCBvdXRfaXNfaW1tOworCWJvb2wgZW5jb2RlX3NsYXZlX2lkOworCWludCAoKnZlcmlmeSkoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJICAgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94KTsKKwlpbnQgKCp3cmFwcGVyKShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkgICAgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkgICAgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJICAgICAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworfTsKKwogI2lmZGVmIENPTkZJR19NTFg0X0RFQlVHCiBleHRlcm4gaW50IG1seDRfZGVidWdfbGV2ZWw7CiAjZWxzZSAvKiBDT05GSUdfTUxYNF9ERUJVRyAqLwpAQCAtOTksNiArMTkxLDEyIEBACiAjZGVmaW5lIG1seDRfd2FybihtZGV2LCBmb3JtYXQsIGFyZy4uLikgXAogCWRldl93YXJuKCZtZGV2LT5wZGV2LT5kZXYsIGZvcm1hdCwgIyNhcmcpCiAKK2V4dGVybiBpbnQgbWx4NF9sb2dfbnVtX21nbV9lbnRyeV9zaXplOworZXh0ZXJuIGludCBsb2dfbXR0c19wZXJfc2VnOworCisjZGVmaW5lIE1MWDRfTUFYX05VTV9TTEFWRVMJKE1MWDRfTUFYX05VTV9QRiArIE1MWDRfTUFYX05VTV9WRikKKyNkZWZpbmUgQUxMX1NMQVZFUyAweGZmCisKIHN0cnVjdCBtbHg0X2JpdG1hcCB7CiAJdTMyCQkJbGFzdDsKIAl1MzIJCQl0b3A7CkBAIC0xMzAsNiArMjI4LDE0NyBAQAogCXN0cnVjdCBtbHg0X2ljbQkgICAgICAqKmljbTsKIH07CiAKKy8qCisgKiBNdXN0IGJlIHBhY2tlZCBiZWNhdXNlIG10dF9zZWcgaXMgNjQgYml0cyBidXQgb25seSBhbGlnbmVkIHRvIDMyIGJpdHMuCisgKi8KK3N0cnVjdCBtbHg0X21wdF9lbnRyeSB7CisJX19iZTMyIGZsYWdzOworCV9fYmUzMiBxcG47CisJX19iZTMyIGtleTsKKwlfX2JlMzIgcGRfZmxhZ3M7CisJX19iZTY0IHN0YXJ0OworCV9fYmU2NCBsZW5ndGg7CisJX19iZTMyIGxrZXk7CisJX19iZTMyIHdpbl9jbnQ7CisJdTgJcmVzZXJ2ZWQxWzNdOworCXU4CW10dF9yZXA7CisJX19iZTY0IG10dF9hZGRyOworCV9fYmUzMiBtdHRfc3o7CisJX19iZTMyIGVudGl0eV9zaXplOworCV9fYmUzMiBmaXJzdF9ieXRlX29mZnNldDsKK30gX19wYWNrZWQ7CisKKy8qCisgKiBNdXN0IGJlIHBhY2tlZCBiZWNhdXNlIHN0YXJ0IGlzIDY0IGJpdHMgYnV0IG9ubHkgYWxpZ25lZCB0byAzMiBiaXRzLgorICovCitzdHJ1Y3QgbWx4NF9lcV9jb250ZXh0IHsKKwlfX2JlMzIJCQlmbGFnczsKKwl1MTYJCQlyZXNlcnZlZDFbM107CisJX19iZTE2CQkJcGFnZV9vZmZzZXQ7CisJdTgJCQlsb2dfZXFfc2l6ZTsKKwl1OAkJCXJlc2VydmVkMls0XTsKKwl1OAkJCWVxX3BlcmlvZDsKKwl1OAkJCXJlc2VydmVkMzsKKwl1OAkJCWVxX21heF9jb3VudDsKKwl1OAkJCXJlc2VydmVkNFszXTsKKwl1OAkJCWludHI7CisJdTgJCQlsb2dfcGFnZV9zaXplOworCXU4CQkJcmVzZXJ2ZWQ1WzJdOworCXU4CQkJbXR0X2Jhc2VfYWRkcl9oOworCV9fYmUzMgkJCW10dF9iYXNlX2FkZHJfbDsKKwl1MzIJCQlyZXNlcnZlZDZbMl07CisJX19iZTMyCQkJY29uc3VtZXJfaW5kZXg7CisJX19iZTMyCQkJcHJvZHVjZXJfaW5kZXg7CisJdTMyCQkJcmVzZXJ2ZWQ3WzRdOworfTsKKworc3RydWN0IG1seDRfY3FfY29udGV4dCB7CisJX19iZTMyCQkJZmxhZ3M7CisJdTE2CQkJcmVzZXJ2ZWQxWzNdOworCV9fYmUxNgkJCXBhZ2Vfb2Zmc2V0OworCV9fYmUzMgkJCWxvZ3NpemVfdXNycGFnZTsKKwlfX2JlMTYJCQljcV9wZXJpb2Q7CisJX19iZTE2CQkJY3FfbWF4X2NvdW50OworCXU4CQkJcmVzZXJ2ZWQyWzNdOworCXU4CQkJY29tcF9lcW47CisJdTgJCQlsb2dfcGFnZV9zaXplOworCXU4CQkJcmVzZXJ2ZWQzWzJdOworCXU4CQkJbXR0X2Jhc2VfYWRkcl9oOworCV9fYmUzMgkJCW10dF9iYXNlX2FkZHJfbDsKKwlfX2JlMzIJCQlsYXN0X25vdGlmaWVkX2luZGV4OworCV9fYmUzMgkJCXNvbGljaXRfcHJvZHVjZXJfaW5kZXg7CisJX19iZTMyCQkJY29uc3VtZXJfaW5kZXg7CisJX19iZTMyCQkJcHJvZHVjZXJfaW5kZXg7CisJdTMyCQkJcmVzZXJ2ZWQ0WzJdOworCV9fYmU2NAkJCWRiX3JlY19hZGRyOworfTsKKworc3RydWN0IG1seDRfc3JxX2NvbnRleHQgeworCV9fYmUzMgkJCXN0YXRlX2xvZ3NpemVfc3JxbjsKKwl1OAkJCWxvZ3N0cmlkZTsKKwl1OAkJCXJlc2VydmVkMTsKKwlfX2JlMTYJCQl4cmNkOworCV9fYmUzMgkJCXBnX29mZnNldF9jcW47CisJdTMyCQkJcmVzZXJ2ZWQyOworCXU4CQkJbG9nX3BhZ2Vfc2l6ZTsKKwl1OAkJCXJlc2VydmVkM1syXTsKKwl1OAkJCW10dF9iYXNlX2FkZHJfaDsKKwlfX2JlMzIJCQltdHRfYmFzZV9hZGRyX2w7CisJX19iZTMyCQkJcGQ7CisJX19iZTE2CQkJbGltaXRfd2F0ZXJtYXJrOworCV9fYmUxNgkJCXdxZV9jbnQ7CisJdTE2CQkJcmVzZXJ2ZWQ0OworCV9fYmUxNgkJCXdxZV9jb3VudGVyOworCXUzMgkJCXJlc2VydmVkNTsKKwlfX2JlNjQJCQlkYl9yZWNfYWRkcjsKK307CisKK3N0cnVjdCBtbHg0X2VxZSB7CisJdTgJCQlyZXNlcnZlZDE7CisJdTgJCQl0eXBlOworCXU4CQkJcmVzZXJ2ZWQyOworCXU4CQkJc3VidHlwZTsKKwl1bmlvbiB7CisJCXUzMgkJcmF3WzZdOworCQlzdHJ1Y3QgeworCQkJX19iZTMyCWNxbjsKKwkJfSBfX3BhY2tlZCBjb21wOworCQlzdHJ1Y3QgeworCQkJdTE2CXJlc2VydmVkMTsKKwkJCV9fYmUxNgl0b2tlbjsKKwkJCXUzMglyZXNlcnZlZDI7CisJCQl1OAlyZXNlcnZlZDNbM107CisJCQl1OAlzdGF0dXM7CisJCQlfX2JlNjQJb3V0X3BhcmFtOworCQl9IF9fcGFja2VkIGNtZDsKKwkJc3RydWN0IHsKKwkJCV9fYmUzMglxcG47CisJCX0gX19wYWNrZWQgcXA7CisJCXN0cnVjdCB7CisJCQlfX2JlMzIJc3JxbjsKKwkJfSBfX3BhY2tlZCBzcnE7CisJCXN0cnVjdCB7CisJCQlfX2JlMzIJY3FuOworCQkJdTMyCXJlc2VydmVkMTsKKwkJCXU4CXJlc2VydmVkMlszXTsKKwkJCXU4CXN5bmRyb21lOworCQl9IF9fcGFja2VkIGNxX2VycjsKKwkJc3RydWN0IHsKKwkJCXUzMglyZXNlcnZlZDFbMl07CisJCQlfX2JlMzIJcG9ydDsKKwkJfSBfX3BhY2tlZCBwb3J0X2NoYW5nZTsKKwkJc3RydWN0IHsKKwkJCSNkZWZpbmUgQ09NTV9DSEFOTkVMX0JJVF9BUlJBWV9TSVpFCTQKKwkJCXUzMiByZXNlcnZlZDsKKwkJCXUzMiBiaXRfdmVjW0NPTU1fQ0hBTk5FTF9CSVRfQVJSQVlfU0laRV07CisJCX0gX19wYWNrZWQgY29tbV9jaGFubmVsX2FybTsKKwkJc3RydWN0IHsKKwkJCXU4CXBvcnQ7CisJCQl1OAlyZXNlcnZlZFszXTsKKwkJCV9fYmU2NAltYWM7CisJCX0gX19wYWNrZWQgbWFjX3VwZGF0ZTsKKwkJc3RydWN0IHsKKwkJCXU4CXBvcnQ7CisJCX0gX19wYWNrZWQgc3dfZXZlbnQ7CisJCXN0cnVjdCB7CisJCQlfX2JlMzIJc2xhdmVfaWQ7CisJCX0gX19wYWNrZWQgZmxyX2V2ZW50OworCX0JCQlldmVudDsKKwl1OAkJCXNsYXZlX2lkOworCXU4CQkJcmVzZXJ2ZWQzWzJdOworCXU4CQkJb3duZXI7Cit9IF9fcGFja2VkOworCiBzdHJ1Y3QgbWx4NF9lcSB7CiAJc3RydWN0IG1seDRfZGV2CSAgICAgICAqZGV2OwogCXZvaWQgX19pb21lbQkgICAgICAgKmRvb3JiZWxsOwpAQCAtMTQyLDYgKzM4MSwxOCBAQAogCXN0cnVjdCBtbHg0X210dAkJbXR0OwogfTsKIAorc3RydWN0IG1seDRfc2xhdmVfZXFlIHsKKwl1OCB0eXBlOworCXU4IHBvcnQ7CisJdTMyIHBhcmFtOworfTsKKworc3RydWN0IG1seDRfc2xhdmVfZXZlbnRfZXFfaW5mbyB7CisJdTMyIGVxbjsKKwl1MTYgdG9rZW47CisJdTY0IGV2ZW50X3R5cGU7Cit9OworCiBzdHJ1Y3QgbWx4NF9wcm9maWxlIHsKIAlpbnQJCQludW1fcXA7CiAJaW50CQkJcmRtYXJjX3Blcl9xcDsKQEAgLTE1NSwxNiArNDA2LDM3IEBACiBzdHJ1Y3QgbWx4NF9mdyB7CiAJdTY0CQkJY2xyX2ludF9iYXNlOwogCXU2NAkJCWNhdGFzX29mZnNldDsKKwl1NjQJCQljb21tX2Jhc2U7CiAJc3RydWN0IG1seDRfaWNtCSAgICAgICAqZndfaWNtOwogCXN0cnVjdCBtbHg0X2ljbQkgICAgICAgKmF1eF9pY207CiAJdTMyCQkJY2F0YXNfc2l6ZTsKIAl1MTYJCQlmd19wYWdlczsKIAl1OAkJCWNscl9pbnRfYmFyOwogCXU4CQkJY2F0YXNfYmFyOworCXU4CQkJY29tbV9iYXI7CiB9OwogCi0jZGVmaW5lIE1HTV9RUE5fTUFTSyAgICAgICAweDAwRkZGRkZGCi0jZGVmaW5lIE1HTV9CTENLX0xCX0JJVCAgICAzMAorc3RydWN0IG1seDRfY29tbSB7CisJdTMyCQkJc2xhdmVfd3JpdGU7CisJdTMyCQkJc2xhdmVfcmVhZDsKK307CisKK2VudW0geworCU1MWDRfTUNBU1RfQ09ORklHICAgICAgID0gMCwKKwlNTFg0X01DQVNUX0RJU0FCTEUgICAgICA9IDEsCisJTUxYNF9NQ0FTVF9FTkFCTEUgICAgICAgPSAyLAorfTsKKworI2RlZmluZSBWTEFOX0ZMVFJfU0laRQkxMjgKKworc3RydWN0IG1seDRfdmxhbl9mbHRyIHsKKwlfX2JlMzIgZW50cnlbVkxBTl9GTFRSX1NJWkVdOworfTsKKworc3RydWN0IG1seDRfbWNhc3RfZW50cnkgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1NjQgYWRkcjsKK307CiAKIHN0cnVjdCBtbHg0X3Byb21pc2NfcXAgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKQEAgLTE3NywxOSArNDQ5LDg3IEBACiAJc3RydWN0IGxpc3RfaGVhZCBkdXBsaWNhdGVzOwogfTsKIAotc3RydWN0IG1seDRfbWdtIHsKLQlfX2JlMzIJCQluZXh0X2dpZF9pbmRleDsKLQlfX2JlMzIJCQltZW1iZXJzX2NvdW50OwotCXUzMgkJCXJlc2VydmVkWzJdOwotCXU4CQkJZ2lkWzE2XTsKLQlfX2JlMzIJCQlxcFtNTFg0X1FQX1BFUl9NR01dOworc3RydWN0IG1seDRfc2xhdmVfc3RhdGUgeworCXU4IGNvbW1fdG9nZ2xlOworCXU4IGxhc3RfY21kOworCXU4IGluaXRfcG9ydF9tYXNrOworCWJvb2wgYWN0aXZlOworCXU4IGZ1bmN0aW9uOworCWRtYV9hZGRyX3Qgdmhjcl9kbWE7CisJdTE2IG10dVtNTFg0X01BWF9QT1JUUyArIDFdOworCV9fYmUzMiBpYl9jYXBfbWFza1tNTFg0X01BWF9QT1JUUyArIDFdOworCXN0cnVjdCBtbHg0X3NsYXZlX2VxZSBlcVtNTFg0X01GVU5DX01BWF9FUUVTXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1jYXN0X2ZpbHRlcnNbTUxYNF9NQVhfUE9SVFMgKyAxXTsKKwlzdHJ1Y3QgbWx4NF92bGFuX2ZsdHIgKnZsYW5fZmlsdGVyW01MWDRfTUFYX1BPUlRTICsgMV07CisJc3RydWN0IG1seDRfc2xhdmVfZXZlbnRfZXFfaW5mbyBldmVudF9lcTsKKwl1MTYgZXFfcGk7CisJdTE2IGVxX2NpOworCXNwaW5sb2NrX3QgbG9jazsKKwkvKmluaXRpYWxpemVkIHZpYSB0aGUga3phbGxvYyovCisJdTggaXNfc2xhdmVfZ29pbmdfZG93bjsKKwl1MzIgY29va2llOwogfTsKKworc3RydWN0IHNsYXZlX2xpc3QgeworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJlc19saXN0W01MWDRfTlVNX09GX1JFU09VUkNFX1RZUEVdOworfTsKKworc3RydWN0IG1seDRfcmVzb3VyY2VfdHJhY2tlciB7CisJc3BpbmxvY2tfdCBsb2NrOworCS8qIHRyZWUgZm9yIGVhY2ggcmVzb3VyY2VzICovCisJc3RydWN0IHJhZGl4X3RyZWVfcm9vdCByZXNfdHJlZVtNTFg0X05VTV9PRl9SRVNPVVJDRV9UWVBFXTsKKwkvKiBudW1fb2Zfc2xhdmUncyBsaXN0cywgb25lIHBlciBzbGF2ZSAqLworCXN0cnVjdCBzbGF2ZV9saXN0ICpzbGF2ZV9saXN0OworfTsKKworI2RlZmluZSBTTEFWRV9FVkVOVF9FUV9TSVpFCTEyOAorc3RydWN0IG1seDRfc2xhdmVfZXZlbnRfZXEgeworCXUzMiBlcW47CisJdTMyIGNvbnM7CisJdTMyIHByb2Q7CisJc3RydWN0IG1seDRfZXFlIGV2ZW50X2VxZVtTTEFWRV9FVkVOVF9FUV9TSVpFXTsKK307CisKK3N0cnVjdCBtbHg0X21hc3Rlcl9xcDBfc3RhdGUgeworCWludCBwcm94eV9xcDBfYWN0aXZlOworCWludCBxcDBfYWN0aXZlOworCWludCBwb3J0X2FjdGl2ZTsKK307CisKK3N0cnVjdCBtbHg0X21mdW5jX21hc3Rlcl9jdHggeworCXN0cnVjdCBtbHg0X3NsYXZlX3N0YXRlICpzbGF2ZV9zdGF0ZTsKKwlzdHJ1Y3QgbWx4NF9tYXN0ZXJfcXAwX3N0YXRlIHFwMF9zdGF0ZVtNTFg0X01BWF9QT1JUUyArIDFdOworCWludAkJCWluaXRfcG9ydF9yZWZbTUxYNF9NQVhfUE9SVFMgKyAxXTsKKwl1MTYJCQltYXhfbXR1W01MWDRfTUFYX1BPUlRTICsgMV07CisJaW50CQkJZGlzYWJsZV9tY2FzdF9yZWZbTUxYNF9NQVhfUE9SVFMgKyAxXTsKKwlzdHJ1Y3QgbWx4NF9yZXNvdXJjZV90cmFja2VyIHJlc190cmFja2VyOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICpjb21tX3dxOworCXN0cnVjdCB3b3JrX3N0cnVjdAljb21tX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0CXNsYXZlX2V2ZW50X3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0CXNsYXZlX2Zscl9ldmVudF93b3JrOworCXNwaW5sb2NrX3QJCXNsYXZlX3N0YXRlX2xvY2s7CisJX19iZTMyCQkJY29tbV9hcm1fYml0X3ZlY3Rvcls0XTsKKwlzdHJ1Y3QgbWx4NF9lcWUJCWNtZF9lcWU7CisJc3RydWN0IG1seDRfc2xhdmVfZXZlbnRfZXEgc2xhdmVfZXE7CisJc3RydWN0IG11dGV4CQlnZW5fZXFlX211dGV4W01MWDRfTUZVTkNfTUFYXTsKK307CisKK3N0cnVjdCBtbHg0X21mdW5jIHsKKwlzdHJ1Y3QgbWx4NF9jb21tIF9faW9tZW0gICAgICAgKmNvbW07CisJc3RydWN0IG1seDRfdmhjcl9jbWQJICAgICAgICp2aGNyOworCWRtYV9hZGRyX3QJCQl2aGNyX2RtYTsKKworCXN0cnVjdCBtbHg0X21mdW5jX21hc3Rlcl9jdHgJbWFzdGVyOworfTsKKwogc3RydWN0IG1seDRfY21kIHsKIAlzdHJ1Y3QgcGNpX3Bvb2wJICAgICAgICpwb29sOwogCXZvaWQgX19pb21lbQkgICAgICAgKmhjcjsKIAlzdHJ1Y3QgbXV0ZXgJCWhjcl9tdXRleDsKIAlzdHJ1Y3Qgc2VtYXBob3JlCXBvbGxfc2VtOwogCXN0cnVjdCBzZW1hcGhvcmUJZXZlbnRfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUJc2xhdmVfc2VtOwogCWludAkJCW1heF9jbWRzOwogCXNwaW5sb2NrX3QJCWNvbnRleHRfbG9jazsKIAlpbnQJCQlmcmVlX2hlYWQ7CkBAIC0xOTcsNiArNTM3LDcgQEAKIAl1MTYJCQl0b2tlbl9tYXNrOwogCXU4CQkJdXNlX2V2ZW50czsKIAl1OAkJCXRvZ2dsZTsKKwl1OAkJCWNvbW1fdG9nZ2xlOwogfTsKIAogc3RydWN0IG1seDRfdWFyX3RhYmxlIHsKQEAgLTI4Nyw2ICs2MjgsNDggQEAKIAlpbnQJCQltYXg7CiB9OwogCisjZGVmaW5lIFNFVF9QT1JUX0dFTl9BTExfVkFMSUQJCTB4NworI2RlZmluZSBTRVRfUE9SVF9QUk9NSVNDX1NISUZUCQkzMQorI2RlZmluZSBTRVRfUE9SVF9NQ19QUk9NSVNDX1NISUZUCTMwCisKK2VudW0geworCU1DQVNUX0RJUkVDVF9PTkxZCT0gMCwKKwlNQ0FTVF9ESVJFQ1QJCT0gMSwKKwlNQ0FTVF9ERUZBVUxUCQk9IDIKK307CisKKworc3RydWN0IG1seDRfc2V0X3BvcnRfZ2VuZXJhbF9jb250ZXh0IHsKKwl1OCByZXNlcnZlZFszXTsKKwl1OCBmbGFnczsKKwl1MTYgcmVzZXJ2ZWQyOworCV9fYmUxNiBtdHU7CisJdTggcHB0eDsKKwl1OCBwZmN0eDsKKwl1MTYgcmVzZXJ2ZWQzOworCXU4IHBwcng7CisJdTggcGZjcng7CisJdTE2IHJlc2VydmVkNDsKK307CisKK3N0cnVjdCBtbHg0X3NldF9wb3J0X3JxcF9jYWxjX2NvbnRleHQgeworCV9fYmUzMiBiYXNlX3FwbjsKKwl1OCByZXJlcnZlZDsKKwl1OCBuX21hYzsKKwl1OCBuX3ZsYW47CisJdTggbl9wcmlvOworCXU4IHJlc2VydmVkMlszXTsKKwl1OCBtYWNfbWlzczsKKwl1OCBpbnRyYV9ub192bGFuOworCXU4IG5vX3ZsYW47CisJdTggaW50cmFfdmxhbl9taXNzOworCXU4IHZsYW5fbWlzczsKKwl1OCByZXNlcnZlZDNbM107CisJdTggbm9fdmxhbl9wcmlvOworCV9fYmUzMiBwcm9taXNjOworCV9fYmUzMiBtY2FzdDsKK307CisKIHN0cnVjdCBtbHg0X21hY19lbnRyeSB7CiAJdTY0IG1hYzsKIH07CkBAIC0zMzMsNiArNzE2LDcgQEAKIAogCXN0cnVjdCBtbHg0X2Z3CQlmdzsKIAlzdHJ1Y3QgbWx4NF9jbWQJCWNtZDsKKwlzdHJ1Y3QgbWx4NF9tZnVuYwltZnVuYzsKIAogCXN0cnVjdCBtbHg0X2JpdG1hcAlwZF9iaXRtYXA7CiAJc3RydWN0IG1seDRfYml0bWFwCXhyY2RfYml0bWFwOwpAQCAtMzU5LDYgKzc0Myw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAliZl9saXN0OwogCXN0cnVjdCBtdXRleAkJYmZfbXV0ZXg7CiAJc3RydWN0IGlvX21hcHBpbmcJKmJmX21hcHBpbmc7CisJaW50CQkJcmVzZXJ2ZWRfbXR0czsKIH07CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1seDRfcHJpdiAqbWx4NF9wcml2KHN0cnVjdCBtbHg0X2RldiAqZGV2KQpAQCAtNDAzLDYgKzc4OCw2MiBAQAogdm9pZCBtbHg0X2NsZWFudXBfcXBfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpOwogdm9pZCBtbHg0X2NsZWFudXBfc3JxX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKIHZvaWQgbWx4NF9jbGVhbnVwX21jZ190YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CitpbnQgX19tbHg0X3FwX2FsbG9jX2ljbShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHFwbik7Cit2b2lkIF9fbWx4NF9xcF9mcmVlX2ljbShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHFwbik7CitpbnQgX19tbHg0X2NxX2FsbG9jX2ljbShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50ICpjcW4pOwordm9pZCBfX21seDRfY3FfZnJlZV9pY20oc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBjcW4pOworaW50IF9fbWx4NF9zcnFfYWxsb2NfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgKnNycW4pOwordm9pZCBfX21seDRfc3JxX2ZyZWVfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc3Jxbik7CitpbnQgX19tbHg0X21yX3Jlc2VydmUoc3RydWN0IG1seDRfZGV2ICpkZXYpOwordm9pZCBfX21seDRfbXJfcmVsZWFzZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIGluZGV4KTsKK2ludCBfX21seDRfbXJfYWxsb2NfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgaW5kZXgpOwordm9pZCBfX21seDRfbXJfZnJlZV9pY20oc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiBpbmRleCk7Cit1MzIgX19tbHg0X2FsbG9jX210dF9yYW5nZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IG9yZGVyKTsKK3ZvaWQgX19tbHg0X2ZyZWVfbXR0X3JhbmdlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgZmlyc3Rfc2VnLCBpbnQgb3JkZXIpOworCitpbnQgbWx4NF9XUklURV9NVFRfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X1NZTkNfVFBUX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCk7CitpbnQgbWx4NF9TVzJIV19NUFRfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X0hXMlNXX01QVF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworaW50IG1seDRfUVVFUllfTVBUX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCk7CitpbnQgbWx4NF9TVzJIV19FUV93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCk7CitpbnQgbWx4NF9ETUFfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkgICAgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCSAgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCSAgICAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCk7CitpbnQgX19tbHg0X3FwX3Jlc2VydmVfcmFuZ2Uoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBjbnQsIGludCBhbGlnbiwKKwkJCSAgICBpbnQgKmJhc2UpOwordm9pZCBfX21seDRfcXBfcmVsZWFzZV9yYW5nZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IGJhc2VfcXBuLCBpbnQgY250KTsKK2ludCBfX21seDRfcmVnaXN0ZXJfbWFjKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1NjQgbWFjKTsKK3ZvaWQgX19tbHg0X3VucmVnaXN0ZXJfbWFjKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1NjQgbWFjKTsKK2ludCBfX21seDRfcmVwbGFjZV9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBxcG4sIHU2NCBuZXdfbWFjKTsKK2ludCBfX21seDRfd3JpdGVfbXR0KHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9tdHQgKm10dCwKKwkJICAgICBpbnQgc3RhcnRfaW5kZXgsIGludCBucGFnZXMsIHU2NCAqcGFnZV9saXN0KTsKIAogdm9pZCBtbHg0X3N0YXJ0X2NhdGFzX3BvbGwoc3RydWN0IG1seDRfZGV2ICpkZXYpOwogdm9pZCBtbHg0X3N0b3BfY2F0YXNfcG9sbChzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CkBAIC00MTksMTMgKzg2MCwxMTMgQEAKIAkJICAgICAgc3RydWN0IG1seDRfcHJvZmlsZSAqcmVxdWVzdCwKIAkJICAgICAgc3RydWN0IG1seDRfZGV2X2NhcCAqZGV2X2NhcCwKIAkJICAgICAgc3RydWN0IG1seDRfaW5pdF9oY2FfcGFyYW0gKmluaXRfaGNhKTsKK3ZvaWQgbWx4NF9tYXN0ZXJfY29tbV9jaGFubmVsKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7Cit2b2lkIG1seDRfZ2VuX3NsYXZlX2VxZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwordm9pZCBtbHg0X21hc3Rlcl9oYW5kbGVfc2xhdmVfZmxyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CisKK2ludCBtbHg0X0FMTE9DX1JFU193cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworaW50IG1seDRfRlJFRV9SRVNfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworaW50IG1seDRfTUFQX0VRX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCXN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQlzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X0NPTU1fSU5UX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X0hXMlNXX0VRX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X1FVRVJZX0VRX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X1NXMkhXX0NRX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X0hXMlNXX0NRX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X1FVRVJZX0NRX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X01PRElGWV9DUV93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworaW50IG1seDRfU1cySFdfU1JRX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCk7CitpbnQgbWx4NF9IVzJTV19TUlFfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X1FVRVJZX1NSUV93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworaW50IG1seDRfQVJNX1NSUV93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X0dFTl9RUF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQlzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCXN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworaW50IG1seDRfUlNUMklOSVRfUVBfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworaW50IG1seDRfSU5JVDJSVFJfUVBfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworaW50IG1seDRfMlJTVF9RUF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKKworaW50IG1seDRfR0VOX0VRRShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBzdHJ1Y3QgbWx4NF9lcWUgKmVxZSk7CiAKIGludCBtbHg0X2NtZF9pbml0KHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKIHZvaWQgbWx4NF9jbWRfY2xlYW51cChzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CitpbnQgbWx4NF9tdWx0aV9mdW5jX2luaXQoc3RydWN0IG1seDRfZGV2ICpkZXYpOwordm9pZCBtbHg0X211bHRpX2Z1bmNfY2xlYW51cChzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CiB2b2lkIG1seDRfY21kX2V2ZW50KHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MTYgdG9rZW4sIHU4IHN0YXR1cywgdTY0IG91dF9wYXJhbSk7CiBpbnQgbWx4NF9jbWRfdXNlX2V2ZW50cyhzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CiB2b2lkIG1seDRfY21kX3VzZV9wb2xsaW5nKHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKIAoraW50IG1seDRfY29tbV9jbWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IGNtZCwgdTE2IHBhcmFtLAorCQkgIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7CisKIHZvaWQgbWx4NF9jcV9jb21wbGV0aW9uKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgY3FuKTsKIHZvaWQgbWx4NF9jcV9ldmVudChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIGNxbiwgaW50IGV2ZW50X3R5cGUpOwogCkBAIC00NTIsMTIgKzk5MywxMTMgQEAKIHZvaWQgbWx4NF9pbml0X3ZsYW5fdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3ZsYW5fdGFibGUgKnRhYmxlKTsKIAogaW50IG1seDRfU0VUX1BPUlQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQpOworLyogcmVzb3VyY2UgdHJhY2tlciBmdW5jdGlvbnMqLworaW50IG1seDRfZ2V0X3NsYXZlX2Zyb21fcmVzb3VyY2VfaWQoc3RydWN0IG1seDRfZGV2ICpkZXYsCisJCQkJICAgIGVudW0gbWx4NF9yZXNvdXJjZSByZXNvdXJjZV90eXBlLAorCQkJCSAgICBpbnQgcmVzb3VyY2VfaWQsIGludCAqc2xhdmUpOwordm9pZCBtbHg0X2RlbGV0ZV9hbGxfcmVzb3VyY2VzX2Zvcl9zbGF2ZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlX2lkKTsKK2ludCBtbHg0X2luaXRfcmVzb3VyY2VfdHJhY2tlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CisKK3ZvaWQgbWx4NF9mcmVlX3Jlc291cmNlX3RyYWNrZXIoc3RydWN0IG1seDRfZGV2ICpkZXYpOworCitpbnQgbWx4NF9TRVRfUE9SVF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCk7CitpbnQgbWx4NF9JTklUX1BPUlRfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X0NMT1NFX1BPUlRfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCk7CitpbnQgbWx4NF9RVUVSWV9QT1JUX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOwogaW50IG1seDRfZ2V0X3BvcnRfaWJfY2FwcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgX19iZTMyICpjYXBzKTsKIGludCBtbHg0X2NoZWNrX2V4dF9wb3J0X2NhcHMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQpOwogCisKK2ludCBtbHg0X1FQX0FUVEFDSF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworCitpbnQgbWx4NF9QUk9NSVNDX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOwogaW50IG1seDRfcXBfZGV0YWNoX2NvbW1vbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfcXAgKnFwLCB1OCBnaWRbMTZdLAogCQkJICBlbnVtIG1seDRfcHJvdG9jb2wgcHJvdCwgZW51bSBtbHg0X3N0ZWVyX3R5cGUgc3RlZXIpOwogaW50IG1seDRfcXBfYXR0YWNoX2NvbW1vbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfcXAgKnFwLCB1OCBnaWRbMTZdLAogCQkJICBpbnQgYmxvY2tfbWNhc3RfbG9vcGJhY2ssIGVudW0gbWx4NF9wcm90b2NvbCBwcm90LAogCQkJICBlbnVtIG1seDRfc3RlZXJfdHlwZSBzdGVlcik7CitpbnQgbWx4NF9TRVRfTUNBU1RfRkxUUl93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkJc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCQlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkJc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCQlzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X1NFVF9WTEFOX0ZMVFJfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgICAgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgICAgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICAgICAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCk7CitpbnQgbWx4NF9jb21tb25fc2V0X3ZsYW5fZmx0cihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IGZ1bmN0aW9uLAorCQkJCSAgICAgaW50IHBvcnQsIHZvaWQgKmJ1Zik7CitpbnQgbWx4NF9jb21tb25fZHVtcF9ldGhfc3RhdHMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgdTMyIGluX21vZCwKKwkJCQlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94KTsKK2ludCBtbHg0X0RVTVBfRVRIX1NUQVRTX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJCXN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpOworaW50IG1seDRfUEtFWV9UQUJMRV93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKTsKK2ludCBtbHg0X1FVRVJZX0lGX1NUQVRfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgICAgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgICAgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICAgICAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCk7CisKK2ludCBtbHg0X2dldF9tZ21fZW50cnlfc2l6ZShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CitpbnQgbWx4NF9nZXRfcXBfcGVyX21nbShzdHJ1Y3QgbWx4NF9kZXYgKmRldik7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfcGFyYW1fbCh1NjQgKmFyZywgdTMyIHZhbCkKK3sKKwkqKCh1MzIgKilhcmcpID0gdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3BhcmFtX2godTY0ICphcmcsIHUzMiB2YWwpCit7CisJKmFyZyA9ICgqYXJnICYgMHhmZmZmZmZmZikgfCAoKHU2NCkgdmFsIDw8IDMyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgZ2V0X3BhcmFtX2wodTY0ICphcmcpCit7CisJcmV0dXJuICh1MzIpICgqYXJnICYgMHhmZmZmZmZmZik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGdldF9wYXJhbV9oKHU2NCAqYXJnKQoreworCXJldHVybiAodTMyKSgqYXJnID4+IDMyKTsKK30KKworc3RhdGljIGlubGluZSBzcGlubG9ja190ICptbHg0X3Rsb2NrKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCXJldHVybiAmbWx4NF9wcml2KGRldiktPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlci5sb2NrOworfQorCisjZGVmaW5lIE5PVF9NQVNLRURfUERfQklUUyAxNworCiAjZW5kaWYgLyogTUxYNF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21seDRfZW4uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oCmluZGV4IDIwN2I1YWQuLmYyYThlNjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbWx4NF9lbi5oCkBAIC01MSw4ICs1MSw4IEBACiAjaW5jbHVkZSAiZW5fcG9ydC5oIgogCiAjZGVmaW5lIERSVl9OQU1FCSJtbHg0X2VuIgotI2RlZmluZSBEUlZfVkVSU0lPTgkiMS41LjQuMiIKLSNkZWZpbmUgRFJWX1JFTERBVEUJIk9jdG9iZXIgMjAxMSIKKyNkZWZpbmUgRFJWX1ZFUlNJT04JIjIuMCIKKyNkZWZpbmUgRFJWX1JFTERBVEUJIkRlYyAyMDExIgogCiAjZGVmaW5lIE1MWDRfRU5fTVNHX0xFVkVMCShORVRJRl9NU0dfTElOSyB8IE5FVElGX01TR19JRkRPV04pCiAKQEAgLTM2NiwxNiArMzY2LDYgQEAKIAllbnVtIG1seDRfcXBfc3RhdGUgaW5kaXJfc3RhdGU7CiB9OwogCi1zdHJ1Y3QgbWx4NF9lbl9yc3NfY29udGV4dCB7Ci0JX19iZTMyIGJhc2VfcXBuOwotCV9fYmUzMiBkZWZhdWx0X3FwbjsKLQl1MTYgcmVzZXJ2ZWQ7Ci0JdTggaGFzaF9mbjsKLQl1OCBmbGFnczsKLQlfX2JlMzIgcnNzX2tleVsxMF07Ci0JX19iZTMyIGJhc2VfcXBuX3VkcDsKLX07Ci0KIHN0cnVjdCBtbHg0X2VuX3BvcnRfc3RhdGUgewogCWludCBsaW5rX3N0YXRlOwogCWludCBsaW5rX3NwZWVkOwpAQCAtNDYzLDYgKzQ1Myw3IEBACiAJaW50IGJhc2VfcXBuOwogCiAJc3RydWN0IG1seDRfZW5fcnNzX21hcCByc3NfbWFwOworCXUzMiBjdHJsX2ZsYWdzOwogCXUzMiBmbGFnczsKICNkZWZpbmUgTUxYNF9FTl9GTEFHX1BST01JU0MJMHgxCiAjZGVmaW5lIE1MWDRfRU5fRkxBR19NQ19QUk9NSVNDCTB4MgpAQCAtNDk1LDkgKzQ4Niw5IEBACiBlbnVtIG1seDRfZW5fd29sIHsKIAlNTFg0X0VOX1dPTF9NQUdJQyA9ICgxVUxMIDw8IDYxKSwKIAlNTFg0X0VOX1dPTF9FTkFCTEVEID0gKDFVTEwgPDwgNjIpLAotCU1MWDRfRU5fV09MX0RPX01PRElGWSA9ICgxVUxMIDw8IDYzKSwKIH07CiAKKyNkZWZpbmUgTUxYNF9FTl9XT0xfRE9fTU9ESUZZICgxVUxMIDw8IDYzKQogCiB2b2lkIG1seDRfZW5fZGVzdHJveV9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiBpbnQgbWx4NF9lbl9pbml0X25ldGRldihzdHJ1Y3QgbWx4NF9lbl9kZXYgKm1kZXYsIGludCBwb3J0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9tci5jCmluZGV4IGVmYTNlNzcuLjAxZGY1NTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvbXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L21yLmMKQEAgLTMyLDM1ICszMiwxNyBAQAogICogU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KIAogI2luY2x1ZGUgPGxpbnV4L21seDQvY21kLmg+CiAKICNpbmNsdWRlICJtbHg0LmgiCiAjaW5jbHVkZSAiaWNtLmgiCiAKLS8qCi0gKiBNdXN0IGJlIHBhY2tlZCBiZWNhdXNlIG10dF9zZWcgaXMgNjQgYml0cyBidXQgb25seSBhbGlnbmVkIHRvIDMyIGJpdHMuCi0gKi8KLXN0cnVjdCBtbHg0X21wdF9lbnRyeSB7Ci0JX19iZTMyIGZsYWdzOwotCV9fYmUzMiBxcG47Ci0JX19iZTMyIGtleTsKLQlfX2JlMzIgcGRfZmxhZ3M7Ci0JX19iZTY0IHN0YXJ0OwotCV9fYmU2NCBsZW5ndGg7Ci0JX19iZTMyIGxrZXk7Ci0JX19iZTMyIHdpbl9jbnQ7Ci0JdTgJcmVzZXJ2ZWQxWzNdOwotCXU4CW10dF9yZXA7Ci0JX19iZTY0IG10dF9zZWc7Ci0JX19iZTMyIG10dF9zejsKLQlfX2JlMzIgZW50aXR5X3NpemU7Ci0JX19iZTMyIGZpcnN0X2J5dGVfb2Zmc2V0OwotfSBfX3BhY2tlZDsKLQogI2RlZmluZSBNTFg0X01QVF9GTEFHX1NXX09XTlMJICAgICgweGZVTCA8PCAyOCkKICNkZWZpbmUgTUxYNF9NUFRfRkxBR19GUkVFCSAgICAoMHgzVUwgPDwgMjgpCiAjZGVmaW5lIE1MWDRfTVBUX0ZMQUdfTUlPCSAgICAoMSA8PCAxNykKQEAgLTE4MCwyMiArMTYyLDQ4IEBACiAJa2ZyZWUoYnVkZHktPm51bV9mcmVlKTsKIH0KIAotc3RhdGljIHUzMiBtbHg0X2FsbG9jX210dF9yYW5nZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IG9yZGVyKQordTMyIF9fbWx4NF9hbGxvY19tdHRfcmFuZ2Uoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBvcmRlcikKIHsKIAlzdHJ1Y3QgbWx4NF9tcl90YWJsZSAqbXJfdGFibGUgPSAmbWx4NF9wcml2KGRldiktPm1yX3RhYmxlOwogCXUzMiBzZWc7CisJaW50IHNlZ19vcmRlcjsKKwl1MzIgb2Zmc2V0OwogCi0Jc2VnID0gbWx4NF9idWRkeV9hbGxvYygmbXJfdGFibGUtPm10dF9idWRkeSwgb3JkZXIpOworCXNlZ19vcmRlciA9IG1heF90KGludCwgb3JkZXIgLSBsb2dfbXR0c19wZXJfc2VnLCAwKTsKKworCXNlZyA9IG1seDRfYnVkZHlfYWxsb2MoJm1yX3RhYmxlLT5tdHRfYnVkZHksIHNlZ19vcmRlcik7CiAJaWYgKHNlZyA9PSAtMSkKIAkJcmV0dXJuIC0xOwogCi0JaWYgKG1seDRfdGFibGVfZ2V0X3JhbmdlKGRldiwgJm1yX3RhYmxlLT5tdHRfdGFibGUsIHNlZywKLQkJCQkgc2VnICsgKDEgPDwgb3JkZXIpIC0gMSkpIHsKLQkJbWx4NF9idWRkeV9mcmVlKCZtcl90YWJsZS0+bXR0X2J1ZGR5LCBzZWcsIG9yZGVyKTsKKwlvZmZzZXQgPSBzZWcgKiAoMSA8PCBsb2dfbXR0c19wZXJfc2VnKTsKKworCWlmIChtbHg0X3RhYmxlX2dldF9yYW5nZShkZXYsICZtcl90YWJsZS0+bXR0X3RhYmxlLCBvZmZzZXQsCisJCQkJIG9mZnNldCArICgxIDw8IG9yZGVyKSAtIDEpKSB7CisJCW1seDRfYnVkZHlfZnJlZSgmbXJfdGFibGUtPm10dF9idWRkeSwgc2VnLCBzZWdfb3JkZXIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JcmV0dXJuIHNlZzsKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgdTMyIG1seDRfYWxsb2NfbXR0X3JhbmdlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgb3JkZXIpCit7CisJdTY0IGluX3BhcmFtOworCXU2NCBvdXRfcGFyYW07CisJaW50IGVycjsKKworCWlmIChtbHg0X2lzX21mdW5jKGRldikpIHsKKwkJc2V0X3BhcmFtX2woJmluX3BhcmFtLCBvcmRlcik7CisJCWVyciA9IG1seDRfY21kX2ltbShkZXYsIGluX3BhcmFtLCAmb3V0X3BhcmFtLCBSRVNfTVRULAorCQkJCQkJICAgICAgIFJFU19PUF9SRVNFUlZFX0FORF9NQVAsCisJCQkJCQkgICAgICAgTUxYNF9DTURfQUxMT0NfUkVTLAorCQkJCQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCQkJCSAgICAgICBNTFg0X0NNRF9XUkFQUEVEKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiAtMTsKKwkJcmV0dXJuIGdldF9wYXJhbV9sKCZvdXRfcGFyYW0pOworCX0KKwlyZXR1cm4gX19tbHg0X2FsbG9jX210dF9yYW5nZShkZXYsIG9yZGVyKTsKIH0KIAogaW50IG1seDRfbXR0X2luaXQoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBucGFnZXMsIGludCBwYWdlX3NoaWZ0LApAQCAtMjEwLDMzICsyMTgsNjMgQEAKIAl9IGVsc2UKIAkJbXR0LT5wYWdlX3NoaWZ0ID0gcGFnZV9zaGlmdDsKIAotCWZvciAobXR0LT5vcmRlciA9IDAsIGkgPSBkZXYtPmNhcHMubXR0c19wZXJfc2VnOyBpIDwgbnBhZ2VzOyBpIDw8PSAxKQorCWZvciAobXR0LT5vcmRlciA9IDAsIGkgPSAxOyBpIDwgbnBhZ2VzOyBpIDw8PSAxKQogCQkrK210dC0+b3JkZXI7CiAKLQltdHQtPmZpcnN0X3NlZyA9IG1seDRfYWxsb2NfbXR0X3JhbmdlKGRldiwgbXR0LT5vcmRlcik7Ci0JaWYgKG10dC0+Zmlyc3Rfc2VnID09IC0xKQorCW10dC0+b2Zmc2V0ID0gbWx4NF9hbGxvY19tdHRfcmFuZ2UoZGV2LCBtdHQtPm9yZGVyKTsKKwlpZiAobXR0LT5vZmZzZXQgPT0gLTEpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X210dF9pbml0KTsKIAotdm9pZCBtbHg0X210dF9jbGVhbnVwKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9tdHQgKm10dCkKK3ZvaWQgX19tbHg0X2ZyZWVfbXR0X3JhbmdlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgb2Zmc2V0LCBpbnQgb3JkZXIpCiB7CisJdTMyIGZpcnN0X3NlZzsKKwlpbnQgc2VnX29yZGVyOwogCXN0cnVjdCBtbHg0X21yX3RhYmxlICptcl90YWJsZSA9ICZtbHg0X3ByaXYoZGV2KS0+bXJfdGFibGU7CiAKKwlzZWdfb3JkZXIgPSBtYXhfdChpbnQsIG9yZGVyIC0gbG9nX210dHNfcGVyX3NlZywgMCk7CisJZmlyc3Rfc2VnID0gb2Zmc2V0IC8gKDEgPDwgbG9nX210dHNfcGVyX3NlZyk7CisKKwltbHg0X2J1ZGR5X2ZyZWUoJm1yX3RhYmxlLT5tdHRfYnVkZHksIGZpcnN0X3NlZywgc2VnX29yZGVyKTsKKwltbHg0X3RhYmxlX3B1dF9yYW5nZShkZXYsICZtcl90YWJsZS0+bXR0X3RhYmxlLCBvZmZzZXQsCisJCQkgICAgIG9mZnNldCArICgxIDw8IG9yZGVyKSAtIDEpOworfQorCitzdGF0aWMgdm9pZCBtbHg0X2ZyZWVfbXR0X3JhbmdlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgb2Zmc2V0LCBpbnQgb3JkZXIpCit7CisJdTY0IGluX3BhcmFtOworCWludCBlcnI7CisKKwlpZiAobWx4NF9pc19tZnVuYyhkZXYpKSB7CisJCXNldF9wYXJhbV9sKCZpbl9wYXJhbSwgb2Zmc2V0KTsKKwkJc2V0X3BhcmFtX2goJmluX3BhcmFtLCBvcmRlcik7CisJCWVyciA9IG1seDRfY21kKGRldiwgaW5fcGFyYW0sIFJFU19NVFQsIFJFU19PUF9SRVNFUlZFX0FORF9NQVAsCisJCQkJCQkgICAgICAgTUxYNF9DTURfRlJFRV9SRVMsCisJCQkJCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLAorCQkJCQkJICAgICAgIE1MWDRfQ01EX1dSQVBQRUQpOworCQlpZiAoZXJyKQorCQkJbWx4NF93YXJuKGRldiwgIkZhaWxlZCB0byBmcmVlIG10dCByYW5nZSBhdDoiCisJCQkJICAiJWQgb3JkZXI6JWRcbiIsIG9mZnNldCwgb3JkZXIpOworCQlyZXR1cm47CisJfQorCSBfX21seDRfZnJlZV9tdHRfcmFuZ2UoZGV2LCBvZmZzZXQsIG9yZGVyKTsKK30KKwordm9pZCBtbHg0X210dF9jbGVhbnVwKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9tdHQgKm10dCkKK3sKIAlpZiAobXR0LT5vcmRlciA8IDApCiAJCXJldHVybjsKIAotCW1seDRfYnVkZHlfZnJlZSgmbXJfdGFibGUtPm10dF9idWRkeSwgbXR0LT5maXJzdF9zZWcsIG10dC0+b3JkZXIpOwotCW1seDRfdGFibGVfcHV0X3JhbmdlKGRldiwgJm1yX3RhYmxlLT5tdHRfdGFibGUsIG10dC0+Zmlyc3Rfc2VnLAotCQkJICAgICBtdHQtPmZpcnN0X3NlZyArICgxIDw8IG10dC0+b3JkZXIpIC0gMSk7CisJbWx4NF9mcmVlX210dF9yYW5nZShkZXYsIG10dC0+b2Zmc2V0LCBtdHQtPm9yZGVyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfbXR0X2NsZWFudXApOwogCiB1NjQgbWx4NF9tdHRfYWRkcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfbXR0ICptdHQpCiB7Ci0JcmV0dXJuICh1NjQpIG10dC0+Zmlyc3Rfc2VnICogZGV2LT5jYXBzLm10dF9lbnRyeV9zejsKKwlyZXR1cm4gKHU2NCkgbXR0LT5vZmZzZXQgKiBkZXYtPmNhcHMubXR0X2VudHJ5X3N6OwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9tdHRfYWRkcik7CiAKQEAgLTI1Myw2OSArMjkxLDIwNSBAQAogc3RhdGljIGludCBtbHg0X1NXMkhXX01QVChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3gsCiAJCQkgIGludCBtcHRfaW5kZXgpCiB7Ci0JcmV0dXJuIG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBtcHRfaW5kZXgsIDAsIE1MWDRfQ01EX1NXMkhXX01QVCwKLQkJCU1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7CisJcmV0dXJuIG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hIHwgZGV2LT5jYXBzLmZ1bmN0aW9uICwgbXB0X2luZGV4LAorCQkJMCwgTUxYNF9DTURfU1cySFdfTVBULCBNTFg0X0NNRF9USU1FX0NMQVNTX0IsCisJCQlNTFg0X0NNRF9XUkFQUEVEKTsKIH0KIAogc3RhdGljIGludCBtbHg0X0hXMlNXX01QVChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3gsCiAJCQkgIGludCBtcHRfaW5kZXgpCiB7CiAJcmV0dXJuIG1seDRfY21kX2JveChkZXYsIDAsIG1haWxib3ggPyBtYWlsYm94LT5kbWEgOiAwLCBtcHRfaW5kZXgsCi0JCQkgICAgIW1haWxib3gsIE1MWDRfQ01EX0hXMlNXX01QVCwgTUxYNF9DTURfVElNRV9DTEFTU19CKTsKKwkJCSAgICAhbWFpbGJveCwgTUxYNF9DTURfSFcyU1dfTVBULAorCQkJICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgTUxYNF9DTURfV1JBUFBFRCk7Cit9CisKK3N0YXRpYyBpbnQgbWx4NF9tcl9yZXNlcnZlX3JhbmdlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgY250LCBpbnQgYWxpZ24sCisJCQkgIHUzMiAqYmFzZV9tcmlkeCkKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJdTMyIG1yaWR4OworCisJbXJpZHggPSBtbHg0X2JpdG1hcF9hbGxvY19yYW5nZSgmcHJpdi0+bXJfdGFibGUubXB0X2JpdG1hcCwgY250LCBhbGlnbik7CisJaWYgKG1yaWR4ID09IC0xKQorCQlyZXR1cm4gLUVOT01FTTsKKworCSpiYXNlX21yaWR4ID0gbXJpZHg7CisJcmV0dXJuIDA7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1seDRfbXJfcmVzZXJ2ZV9yYW5nZSk7CisKK3N0YXRpYyB2b2lkIG1seDRfbXJfcmVsZWFzZV9yYW5nZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIGJhc2VfbXJpZHgsIGludCBjbnQpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCW1seDRfYml0bWFwX2ZyZWVfcmFuZ2UoJnByaXYtPm1yX3RhYmxlLm1wdF9iaXRtYXAsIGJhc2VfbXJpZHgsIGNudCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtbHg0X21yX3JlbGVhc2VfcmFuZ2UpOworCitzdGF0aWMgaW50IG1seDRfbXJfYWxsb2NfcmVzZXJ2ZWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiBtcmlkeCwgdTMyIHBkLAorCQkJICAgdTY0IGlvdmEsIHU2NCBzaXplLCB1MzIgYWNjZXNzLCBpbnQgbnBhZ2VzLAorCQkJICAgaW50IHBhZ2Vfc2hpZnQsIHN0cnVjdCBtbHg0X21yICptcikKK3sKKwltci0+aW92YSAgICAgICA9IGlvdmE7CisJbXItPnNpemUgICAgICAgPSBzaXplOworCW1yLT5wZAkgICAgICAgPSBwZDsKKwltci0+YWNjZXNzICAgICA9IGFjY2VzczsKKwltci0+ZW5hYmxlZCAgICA9IE1MWDRfTVJfRElTQUJMRUQ7CisJbXItPmtleQkgICAgICAgPSBod19pbmRleF90b19rZXkobXJpZHgpOworCisJcmV0dXJuIG1seDRfbXR0X2luaXQoZGV2LCBucGFnZXMsIHBhZ2Vfc2hpZnQsICZtci0+bXR0KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1seDRfbXJfYWxsb2NfcmVzZXJ2ZWQpOworCitzdGF0aWMgaW50IG1seDRfV1JJVEVfTVRUKHN0cnVjdCBtbHg0X2RldiAqZGV2LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveCwKKwkJCSAgaW50IG51bV9lbnRyaWVzKQoreworCXJldHVybiBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgbnVtX2VudHJpZXMsIDAsIE1MWDRfQ01EX1dSSVRFX01UVCwKKwkJCU1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgIE1MWDRfQ01EX1dSQVBQRUQpOworfQorCitpbnQgX19tbHg0X21yX3Jlc2VydmUoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCisJcmV0dXJuIG1seDRfYml0bWFwX2FsbG9jKCZwcml2LT5tcl90YWJsZS5tcHRfYml0bWFwKTsKK30KKworc3RhdGljIGludCBtbHg0X21yX3Jlc2VydmUoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJdTY0IG91dF9wYXJhbTsKKworCWlmIChtbHg0X2lzX21mdW5jKGRldikpIHsKKwkJaWYgKG1seDRfY21kX2ltbShkZXYsIDAsICZvdXRfcGFyYW0sIFJFU19NUFQsIFJFU19PUF9SRVNFUlZFLAorCQkJCSAgIE1MWDRfQ01EX0FMTE9DX1JFUywKKwkJCQkgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EsIE1MWDRfQ01EX1dSQVBQRUQpKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gZ2V0X3BhcmFtX2woJm91dF9wYXJhbSk7CisJfQorCXJldHVybiAgX19tbHg0X21yX3Jlc2VydmUoZGV2KTsKK30KKwordm9pZCBfX21seDRfbXJfcmVsZWFzZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIGluZGV4KQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKworCW1seDRfYml0bWFwX2ZyZWUoJnByaXYtPm1yX3RhYmxlLm1wdF9iaXRtYXAsIGluZGV4KTsKK30KKworc3RhdGljIHZvaWQgbWx4NF9tcl9yZWxlYXNlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgaW5kZXgpCit7CisJdTY0IGluX3BhcmFtOworCisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkgeworCQlzZXRfcGFyYW1fbCgmaW5fcGFyYW0sIGluZGV4KTsKKwkJaWYgKG1seDRfY21kKGRldiwgaW5fcGFyYW0sIFJFU19NUFQsIFJFU19PUF9SRVNFUlZFLAorCQkJICAgICAgIE1MWDRfQ01EX0ZSRUVfUkVTLAorCQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfV1JBUFBFRCkpCisJCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIHRvIHJlbGVhc2UgbXIgaW5kZXg6JWRcbiIsCisJCQkJICBpbmRleCk7CisJCXJldHVybjsKKwl9CisJX19tbHg0X21yX3JlbGVhc2UoZGV2LCBpbmRleCk7Cit9CisKK2ludCBfX21seDRfbXJfYWxsb2NfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgaW5kZXgpCit7CisJc3RydWN0IG1seDRfbXJfdGFibGUgKm1yX3RhYmxlID0gJm1seDRfcHJpdihkZXYpLT5tcl90YWJsZTsKKworCXJldHVybiBtbHg0X3RhYmxlX2dldChkZXYsICZtcl90YWJsZS0+ZG1wdF90YWJsZSwgaW5kZXgpOworfQorCitzdGF0aWMgaW50IG1seDRfbXJfYWxsb2NfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgaW5kZXgpCit7CisJdTY0IHBhcmFtOworCisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkgeworCQlzZXRfcGFyYW1fbCgmcGFyYW0sIGluZGV4KTsKKwkJcmV0dXJuIG1seDRfY21kX2ltbShkZXYsIHBhcmFtLCAmcGFyYW0sIFJFU19NUFQsIFJFU19PUF9NQVBfSUNNLAorCQkJCQkJCU1MWDRfQ01EX0FMTE9DX1JFUywKKwkJCQkJCQlNTFg0X0NNRF9USU1FX0NMQVNTX0EsCisJCQkJCQkJTUxYNF9DTURfV1JBUFBFRCk7CisJfQorCXJldHVybiBfX21seDRfbXJfYWxsb2NfaWNtKGRldiwgaW5kZXgpOworfQorCit2b2lkIF9fbWx4NF9tcl9mcmVlX2ljbShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIGluZGV4KQoreworCXN0cnVjdCBtbHg0X21yX3RhYmxlICptcl90YWJsZSA9ICZtbHg0X3ByaXYoZGV2KS0+bXJfdGFibGU7CisKKwltbHg0X3RhYmxlX3B1dChkZXYsICZtcl90YWJsZS0+ZG1wdF90YWJsZSwgaW5kZXgpOworfQorCitzdGF0aWMgdm9pZCBtbHg0X21yX2ZyZWVfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1MzIgaW5kZXgpCit7CisJdTY0IGluX3BhcmFtOworCisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkgeworCQlzZXRfcGFyYW1fbCgmaW5fcGFyYW0sIGluZGV4KTsKKwkJaWYgKG1seDRfY21kKGRldiwgaW5fcGFyYW0sIFJFU19NUFQsIFJFU19PUF9NQVBfSUNNLAorCQkJICAgICBNTFg0X0NNRF9GUkVFX1JFUywgTUxYNF9DTURfVElNRV9DTEFTU19BLAorCQkJICAgICBNTFg0X0NNRF9XUkFQUEVEKSkKKwkJCW1seDRfd2FybihkZXYsICJGYWlsZWQgdG8gZnJlZSBpY20gb2YgbXIgaW5kZXg6JWRcbiIsCisJCQkJICBpbmRleCk7CisJCXJldHVybjsKKwl9CisJcmV0dXJuIF9fbWx4NF9tcl9mcmVlX2ljbShkZXYsIGluZGV4KTsKIH0KIAogaW50IG1seDRfbXJfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiBwZCwgdTY0IGlvdmEsIHU2NCBzaXplLCB1MzIgYWNjZXNzLAogCQkgIGludCBucGFnZXMsIGludCBwYWdlX3NoaWZ0LCBzdHJ1Y3QgbWx4NF9tciAqbXIpCiB7Ci0Jc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwogCXUzMiBpbmRleDsKIAlpbnQgZXJyOwogCi0JaW5kZXggPSBtbHg0X2JpdG1hcF9hbGxvYygmcHJpdi0+bXJfdGFibGUubXB0X2JpdG1hcCk7CisJaW5kZXggPSBtbHg0X21yX3Jlc2VydmUoZGV2KTsKIAlpZiAoaW5kZXggPT0gLTEpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JbXItPmlvdmEgICAgICAgPSBpb3ZhOwotCW1yLT5zaXplICAgICAgID0gc2l6ZTsKLQltci0+cGQJICAgICAgID0gcGQ7Ci0JbXItPmFjY2VzcyAgICAgPSBhY2Nlc3M7Ci0JbXItPmVuYWJsZWQgICAgPSAwOwotCW1yLT5rZXkJICAgICAgID0gaHdfaW5kZXhfdG9fa2V5KGluZGV4KTsKLQotCWVyciA9IG1seDRfbXR0X2luaXQoZGV2LCBucGFnZXMsIHBhZ2Vfc2hpZnQsICZtci0+bXR0KTsKKwllcnIgPSBtbHg0X21yX2FsbG9jX3Jlc2VydmVkKGRldiwgaW5kZXgsIHBkLCBpb3ZhLCBzaXplLAorCQkJCSAgICAgYWNjZXNzLCBucGFnZXMsIHBhZ2Vfc2hpZnQsIG1yKTsKIAlpZiAoZXJyKQotCQltbHg0X2JpdG1hcF9mcmVlKCZwcml2LT5tcl90YWJsZS5tcHRfYml0bWFwLCBpbmRleCk7CisJCW1seDRfbXJfcmVsZWFzZShkZXYsIGluZGV4KTsKIAogCXJldHVybiBlcnI7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X21yX2FsbG9jKTsKIAotdm9pZCBtbHg0X21yX2ZyZWUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X21yICptcikKK3N0YXRpYyB2b2lkIG1seDRfbXJfZnJlZV9yZXNlcnZlZChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfbXIgKm1yKQogewotCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKIAlpbnQgZXJyOwogCi0JaWYgKG1yLT5lbmFibGVkKSB7CisJaWYgKG1yLT5lbmFibGVkID09IE1MWDRfTVJfRU5fSFcpIHsKIAkJZXJyID0gbWx4NF9IVzJTV19NUFQoZGV2LCBOVUxMLAogCQkJCSAgICAga2V5X3RvX2h3X2luZGV4KG1yLT5rZXkpICYKIAkJCQkgICAgIChkZXYtPmNhcHMubnVtX21wdHMgLSAxKSk7CiAJCWlmIChlcnIpCi0JCQltbHg0X3dhcm4oZGV2LCAiSFcyU1dfTVBUIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwotCX0KKwkJCW1seDRfd2FybihkZXYsICJ4eHggSFcyU1dfTVBUIGZhaWxlZCAoJWQpXG4iLCBlcnIpOwogCisJCW1yLT5lbmFibGVkID0gTUxYNF9NUl9FTl9TVzsKKwl9CiAJbWx4NF9tdHRfY2xlYW51cChkZXYsICZtci0+bXR0KTsKLQltbHg0X2JpdG1hcF9mcmVlKCZwcml2LT5tcl90YWJsZS5tcHRfYml0bWFwLCBrZXlfdG9faHdfaW5kZXgobXItPmtleSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9tcl9mcmVlX3Jlc2VydmVkKTsKKwordm9pZCBtbHg0X21yX2ZyZWUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X21yICptcikKK3sKKwltbHg0X21yX2ZyZWVfcmVzZXJ2ZWQoZGV2LCBtcik7CisJaWYgKG1yLT5lbmFibGVkKQorCQltbHg0X21yX2ZyZWVfaWNtKGRldiwga2V5X3RvX2h3X2luZGV4KG1yLT5rZXkpKTsKKwltbHg0X21yX3JlbGVhc2UoZGV2LCBrZXlfdG9faHdfaW5kZXgobXItPmtleSkpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9tcl9mcmVlKTsKIAogaW50IG1seDRfbXJfZW5hYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9tciAqbXIpCiB7Ci0Jc3RydWN0IG1seDRfbXJfdGFibGUgKm1yX3RhYmxlID0gJm1seDRfcHJpdihkZXYpLT5tcl90YWJsZTsKIAlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveDsKIAlzdHJ1Y3QgbWx4NF9tcHRfZW50cnkgKm1wdF9lbnRyeTsKIAlpbnQgZXJyOwogCi0JZXJyID0gbWx4NF90YWJsZV9nZXQoZGV2LCAmbXJfdGFibGUtPmRtcHRfdGFibGUsIGtleV90b19od19pbmRleChtci0+a2V5KSk7CisJZXJyID0gbWx4NF9tcl9hbGxvY19pY20oZGV2LCBrZXlfdG9faHdfaW5kZXgobXItPmtleSkpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTM0MCw5ICs1MTQsMTAgQEAKIAogCWlmIChtci0+bXR0Lm9yZGVyIDwgMCkgewogCQltcHRfZW50cnktPmZsYWdzIHw9IGNwdV90b19iZTMyKE1MWDRfTVBUX0ZMQUdfUEhZU0lDQUwpOwotCQltcHRfZW50cnktPm10dF9zZWcgPSAwOworCQltcHRfZW50cnktPm10dF9hZGRyID0gMDsKIAl9IGVsc2UgewotCQltcHRfZW50cnktPm10dF9zZWcgPSBjcHVfdG9fYmU2NChtbHg0X210dF9hZGRyKGRldiwgJm1yLT5tdHQpKTsKKwkJbXB0X2VudHJ5LT5tdHRfYWRkciA9IGNwdV90b19iZTY0KG1seDRfbXR0X2FkZHIoZGV2LAorCQkJCQkJICAmbXItPm10dCkpOwogCX0KIAogCWlmIChtci0+bXR0Lm9yZGVyID49IDAgJiYgbXItPm10dC5wYWdlX3NoaWZ0ID09IDApIHsKQEAgLTM1MCw4ICs1MjUsNyBAQAogCQltcHRfZW50cnktPmZsYWdzICAgIHw9IGNwdV90b19iZTMyKE1MWDRfTVBUX0ZMQUdfRlJFRSk7CiAJCW1wdF9lbnRyeS0+cGRfZmxhZ3MgfD0gY3B1X3RvX2JlMzIoTUxYNF9NUFRfUERfRkxBR19GQVNUX1JFRyB8CiAJCQkJCQkgICBNTFg0X01QVF9QRF9GTEFHX1JBRSk7Ci0JCW1wdF9lbnRyeS0+bXR0X3N6ICAgID0gY3B1X3RvX2JlMzIoKDEgPDwgbXItPm10dC5vcmRlcikgKgotCQkJCQkJICAgZGV2LT5jYXBzLm10dHNfcGVyX3NlZyk7CisJCW1wdF9lbnRyeS0+bXR0X3N6ICAgID0gY3B1X3RvX2JlMzIoMSA8PCBtci0+bXR0Lm9yZGVyKTsKIAl9IGVsc2UgewogCQltcHRfZW50cnktPmZsYWdzICAgIHw9IGNwdV90b19iZTMyKE1MWDRfTVBUX0ZMQUdfU1dfT1dOUyk7CiAJfQpAQCAtMzYyLDggKzUzNiw3IEBACiAJCW1seDRfd2FybihkZXYsICJTVzJIV19NUFQgZmFpbGVkICglZClcbiIsIGVycik7CiAJCWdvdG8gZXJyX2NtZDsKIAl9Ci0KLQltci0+ZW5hYmxlZCA9IDE7CisJbXItPmVuYWJsZWQgPSBNTFg0X01SX0VOX0hXOwogCiAJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAKQEAgLTM3Myw3ICs1NDYsNyBAQAogCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOwogCiBlcnJfdGFibGU6Ci0JbWx4NF90YWJsZV9wdXQoZGV2LCAmbXJfdGFibGUtPmRtcHRfdGFibGUsIGtleV90b19od19pbmRleChtci0+a2V5KSk7CisJbWx4NF9tcl9mcmVlX2ljbShkZXYsIGtleV90b19od19pbmRleChtci0+a2V5KSk7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfbXJfZW5hYmxlKTsKQEAgLTM4NSwxOCArNTU4LDEwIEBACiAJX19iZTY0ICptdHRzOwogCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKIAlpbnQgaTsKLQlpbnQgcyA9IHN0YXJ0X2luZGV4ICogc2l6ZW9mICh1NjQpOwogCi0JLyogQWxsIE1UVHMgbXVzdCBmaXQgaW4gdGhlIHNhbWUgcGFnZSAqLwotCWlmIChzdGFydF9pbmRleCAvIChQQUdFX1NJWkUgLyBzaXplb2YgKHU2NCkpICE9Ci0JICAgIChzdGFydF9pbmRleCArIG5wYWdlcyAtIDEpIC8gKFBBR0VfU0laRSAvIHNpemVvZiAodTY0KSkpCi0JCXJldHVybiAtRUlOVkFMOworCW10dHMgPSBtbHg0X3RhYmxlX2ZpbmQoJnByaXYtPm1yX3RhYmxlLm10dF90YWJsZSwgbXR0LT5vZmZzZXQgKworCQkJICAgICAgIHN0YXJ0X2luZGV4LCAmZG1hX2hhbmRsZSk7CiAKLQlpZiAoc3RhcnRfaW5kZXggJiAoZGV2LT5jYXBzLm10dHNfcGVyX3NlZyAtIDEpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCW10dHMgPSBtbHg0X3RhYmxlX2ZpbmQoJnByaXYtPm1yX3RhYmxlLm10dF90YWJsZSwgbXR0LT5maXJzdF9zZWcgKwotCQkJCXMgLyBkZXYtPmNhcHMubXR0X2VudHJ5X3N6LCAmZG1hX2hhbmRsZSk7CiAJaWYgKCFtdHRzKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNDEyLDI3ICs1NzcsNzUgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IF9fbWx4NF93cml0ZV9tdHQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X210dCAqbXR0LAorCQkgICAgIGludCBzdGFydF9pbmRleCwgaW50IG5wYWdlcywgdTY0ICpwYWdlX2xpc3QpCit7CisJaW50IGVyciA9IDA7CisJaW50IGNodW5rOworCWludCBtdHRzX3Blcl9wYWdlOworCWludCBtYXhfbXR0c19maXJzdF9wYWdlOworCisJLyogY29tcHV0ZSBob3cgbWF5IG10dHMgZml0IGluIHRoZSBmaXJzdCBwYWdlICovCisJbXR0c19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIHNpemVvZih1NjQpOworCW1heF9tdHRzX2ZpcnN0X3BhZ2UgPSBtdHRzX3Blcl9wYWdlIC0gKG10dC0+b2Zmc2V0ICsgc3RhcnRfaW5kZXgpCisJCQkgICAgICAlIG10dHNfcGVyX3BhZ2U7CisKKwljaHVuayA9IG1pbl90KGludCwgbWF4X210dHNfZmlyc3RfcGFnZSwgbnBhZ2VzKTsKKworCXdoaWxlIChucGFnZXMgPiAwKSB7CisJCWVyciA9IG1seDRfd3JpdGVfbXR0X2NodW5rKGRldiwgbXR0LCBzdGFydF9pbmRleCwgY2h1bmssIHBhZ2VfbGlzdCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCQlucGFnZXMgICAgICAtPSBjaHVuazsKKwkJc3RhcnRfaW5kZXggKz0gY2h1bms7CisJCXBhZ2VfbGlzdCAgICs9IGNodW5rOworCisJCWNodW5rID0gbWluX3QoaW50LCBtdHRzX3Blcl9wYWdlLCBucGFnZXMpOworCX0KKwlyZXR1cm4gZXJyOworfQorCiBpbnQgbWx4NF93cml0ZV9tdHQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X210dCAqbXR0LAogCQkgICBpbnQgc3RhcnRfaW5kZXgsIGludCBucGFnZXMsIHU2NCAqcGFnZV9saXN0KQogeworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94ID0gTlVMTDsKKwlfX2JlNjQgKmluYm94ID0gTlVMTDsKIAlpbnQgY2h1bms7Ci0JaW50IGVycjsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaTsKIAogCWlmIChtdHQtPm9yZGVyIDwgMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl3aGlsZSAobnBhZ2VzID4gMCkgewotCQljaHVuayA9IG1pbl90KGludCwgUEFHRV9TSVpFIC8gc2l6ZW9mKHU2NCksIG5wYWdlcyk7Ci0JCWVyciA9IG1seDRfd3JpdGVfbXR0X2NodW5rKGRldiwgbXR0LCBzdGFydF9pbmRleCwgY2h1bmssIHBhZ2VfbGlzdCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOworCWlmIChtbHg0X2lzX21mdW5jKGRldikpIHsKKwkJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKKwkJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCQlpbmJveCA9IG1haWxib3gtPmJ1ZjsKIAotCQlucGFnZXMgICAgICAtPSBjaHVuazsKLQkJc3RhcnRfaW5kZXggKz0gY2h1bms7Ci0JCXBhZ2VfbGlzdCAgICs9IGNodW5rOworCQl3aGlsZSAobnBhZ2VzID4gMCkgeworCQkJY2h1bmsgPSBtaW5fdChpbnQsIE1MWDRfTUFJTEJPWF9TSVpFIC8gc2l6ZW9mKHU2NCkgLSAyLAorCQkJCSAgICAgIG5wYWdlcyk7CisJCQlpbmJveFswXSA9IGNwdV90b19iZTY0KG10dC0+b2Zmc2V0ICsgc3RhcnRfaW5kZXgpOworCQkJaW5ib3hbMV0gPSAwOworCQkJZm9yIChpID0gMDsgaSA8IGNodW5rOyArK2kpCisJCQkJaW5ib3hbaSArIDJdID0gY3B1X3RvX2JlNjQocGFnZV9saXN0W2ldIHwKKwkJCQkJICAgICAgIE1MWDRfTVRUX0ZMQUdfUFJFU0VOVCk7CisJCQllcnIgPSBtbHg0X1dSSVRFX01UVChkZXYsIG1haWxib3gsIGNodW5rKTsKKwkJCWlmIChlcnIpIHsKKwkJCQltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCisJCQlucGFnZXMgICAgICAtPSBjaHVuazsKKwkJCXN0YXJ0X2luZGV4ICs9IGNodW5rOworCQkJcGFnZV9saXN0ICAgKz0gY2h1bms7CisJCX0KKwkJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CisJCXJldHVybiBlcnI7CiAJfQogCi0JcmV0dXJuIDA7CisJcmV0dXJuIF9fbWx4NF93cml0ZV9tdHQoZGV2LCBtdHQsIHN0YXJ0X2luZGV4LCBucGFnZXMsIHBhZ2VfbGlzdCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X3dyaXRlX210dCk7CiAKQEAgLTQ2MiwyMSArNjc1LDM0IEBACiAKIGludCBtbHg0X2luaXRfbXJfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IG1seDRfbXJfdGFibGUgKm1yX3RhYmxlID0gJm1seDRfcHJpdihkZXYpLT5tcl90YWJsZTsKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfbXJfdGFibGUgKm1yX3RhYmxlID0gJnByaXYtPm1yX3RhYmxlOwogCWludCBlcnI7CiAKKwlpZiAoIWlzX3Bvd2VyX29mXzIoZGV2LT5jYXBzLm51bV9tcHRzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBOb3RoaW5nIHRvIGRvIGZvciBzbGF2ZXMgLSBhbGwgTVIgaGFuZGxpbmcgaXMgZm9yd2FyZGVkCisJKiB0byB0aGUgbWFzdGVyICovCisJaWYgKG1seDRfaXNfc2xhdmUoZGV2KSkKKwkJcmV0dXJuIDA7CisKIAllcnIgPSBtbHg0X2JpdG1hcF9pbml0KCZtcl90YWJsZS0+bXB0X2JpdG1hcCwgZGV2LT5jYXBzLm51bV9tcHRzLAogCQkJICAgICAgIH4wLCBkZXYtPmNhcHMucmVzZXJ2ZWRfbXJ3cywgMCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAogCWVyciA9IG1seDRfYnVkZHlfaW5pdCgmbXJfdGFibGUtPm10dF9idWRkeSwKLQkJCSAgICAgIGlsb2cyKGRldi0+Y2Fwcy5udW1fbXR0X3NlZ3MpKTsKKwkJCSAgICAgIGlsb2cyKGRldi0+Y2Fwcy5udW1fbXR0cyAvCisJCQkgICAgICAoMSA8PCBsb2dfbXR0c19wZXJfc2VnKSkpOwogCWlmIChlcnIpCiAJCWdvdG8gZXJyX2J1ZGR5OwogCiAJaWYgKGRldi0+Y2Fwcy5yZXNlcnZlZF9tdHRzKSB7Ci0JCWlmIChtbHg0X2FsbG9jX210dF9yYW5nZShkZXYsIGZscyhkZXYtPmNhcHMucmVzZXJ2ZWRfbXR0cyAtIDEpKSA9PSAtMSkgeworCQlwcml2LT5yZXNlcnZlZF9tdHRzID0KKwkJCW1seDRfYWxsb2NfbXR0X3JhbmdlKGRldiwKKwkJCQkJICAgICBmbHMoZGV2LT5jYXBzLnJlc2VydmVkX210dHMgLSAxKSk7CisJCWlmIChwcml2LT5yZXNlcnZlZF9tdHRzIDwgMCkgewogCQkJbWx4NF93YXJuKGRldiwgIk1UVCB0YWJsZSBvZiBvcmRlciAlZCBpcyB0b28gc21hbGwuXG4iLAogCQkJCSAgbXJfdGFibGUtPm10dF9idWRkeS5tYXhfb3JkZXIpOwogCQkJZXJyID0gLUVOT01FTTsKQEAgLTQ5Nyw4ICs3MjMsMTQgQEAKIAogdm9pZCBtbHg0X2NsZWFudXBfbXJfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IG1seDRfbXJfdGFibGUgKm1yX3RhYmxlID0gJm1seDRfcHJpdihkZXYpLT5tcl90YWJsZTsKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfbXJfdGFibGUgKm1yX3RhYmxlID0gJnByaXYtPm1yX3RhYmxlOwogCisJaWYgKG1seDRfaXNfc2xhdmUoZGV2KSkKKwkJcmV0dXJuOworCWlmIChwcml2LT5yZXNlcnZlZF9tdHRzID49IDApCisJCW1seDRfZnJlZV9tdHRfcmFuZ2UoZGV2LCBwcml2LT5yZXNlcnZlZF9tdHRzLAorCQkJCSAgICBmbHMoZGV2LT5jYXBzLnJlc2VydmVkX210dHMgLSAxKSk7CiAJbWx4NF9idWRkeV9jbGVhbnVwKCZtcl90YWJsZS0+bXR0X2J1ZGR5KTsKIAltbHg0X2JpdG1hcF9jbGVhbnVwKCZtcl90YWJsZS0+bXB0X2JpdG1hcCk7CiB9CkBAIC01ODEsNyArODEzLDcgQEAKIAkJICAgaW50IG1heF9tYXBzLCB1OCBwYWdlX3NoaWZ0LCBzdHJ1Y3QgbWx4NF9mbXIgKmZtcikKIHsKIAlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7Ci0JdTY0IG10dF9zZWc7CisJdTY0IG10dF9vZmZzZXQ7CiAJaW50IGVyciA9IC1FTk9NRU07CiAKIAlpZiAocGFnZV9zaGlmdCA8IChmZnMoZGV2LT5jYXBzLnBhZ2Vfc2l6ZV9jYXApIC0gMSkgfHwgcGFnZV9zaGlmdCA+PSAzMikKQEAgLTYwMSwxMSArODMzLDEyIEBACiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCW10dF9zZWcgPSBmbXItPm1yLm10dC5maXJzdF9zZWcgKiBkZXYtPmNhcHMubXR0X2VudHJ5X3N6OworCW10dF9vZmZzZXQgPSBmbXItPm1yLm10dC5vZmZzZXQgKiBkZXYtPmNhcHMubXR0X2VudHJ5X3N6OwogCiAJZm1yLT5tdHRzID0gbWx4NF90YWJsZV9maW5kKCZwcml2LT5tcl90YWJsZS5tdHRfdGFibGUsCi0JCQkJICAgIGZtci0+bXIubXR0LmZpcnN0X3NlZywKKwkJCQkgICAgZm1yLT5tci5tdHQub2Zmc2V0LAogCQkJCSAgICAmZm1yLT5kbWFfaGFuZGxlKTsKKwogCWlmICghZm1yLT5tdHRzKSB7CiAJCWVyciA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2ZyZWU7CkBAIC02MTksNiArODUyLDQ2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X2Ztcl9hbGxvYyk7CiAKK3N0YXRpYyBpbnQgbWx4NF9mbXJfYWxsb2NfcmVzZXJ2ZWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiBtcmlkeCwKKwkJCSAgICB1MzIgcGQsIHUzMiBhY2Nlc3MsIGludCBtYXhfcGFnZXMsCisJCQkgICAgaW50IG1heF9tYXBzLCB1OCBwYWdlX3NoaWZ0LCBzdHJ1Y3QgbWx4NF9mbXIgKmZtcikKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwlpZiAocGFnZV9zaGlmdCA8IChmZnMoZGV2LT5jYXBzLnBhZ2Vfc2l6ZV9jYXApIC0gMSkgfHwgcGFnZV9zaGlmdCA+PSAzMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBBbGwgTVRUcyBtdXN0IGZpdCBpbiB0aGUgc2FtZSBwYWdlICovCisJaWYgKG1heF9wYWdlcyAqIHNpemVvZiAqZm1yLT5tdHRzID4gUEFHRV9TSVpFKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZtci0+cGFnZV9zaGlmdCA9IHBhZ2Vfc2hpZnQ7CisJZm1yLT5tYXhfcGFnZXMgID0gbWF4X3BhZ2VzOworCWZtci0+bWF4X21hcHMgICA9IG1heF9tYXBzOworCWZtci0+bWFwcyA9IDA7CisKKwllcnIgPSBtbHg0X21yX2FsbG9jX3Jlc2VydmVkKGRldiwgbXJpZHgsIHBkLCAwLCAwLCBhY2Nlc3MsIG1heF9wYWdlcywKKwkJCQkgICAgIHBhZ2Vfc2hpZnQsICZmbXItPm1yKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZm1yLT5tdHRzID0gbWx4NF90YWJsZV9maW5kKCZwcml2LT5tcl90YWJsZS5tdHRfdGFibGUsCisJCQkJICAgIGZtci0+bXIubXR0Lm9mZnNldCwKKwkJCQkgICAgJmZtci0+ZG1hX2hhbmRsZSk7CisJaWYgKCFmbXItPm10dHMpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfZnJlZTsKKwl9CisKKwlyZXR1cm4gMDsKKworZXJyX2ZyZWU6CisJbWx4NF9tcl9mcmVlX3Jlc2VydmVkKGRldiwgJmZtci0+bXIpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChtbHg0X2Ztcl9hbGxvY19yZXNlcnZlZCk7CisKIGludCBtbHg0X2Ztcl9lbmFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X2ZtciAqZm1yKQogewogCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKQEAgLTY0MCwxMiArOTEzLDMyIEBACiB2b2lkIG1seDRfZm1yX3VubWFwKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9mbXIgKmZtciwKIAkJICAgIHUzMiAqbGtleSwgdTMyICpya2V5KQogeworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OworCWludCBlcnI7CisKIAlpZiAoIWZtci0+bWFwcykKIAkJcmV0dXJuOwogCiAJZm1yLT5tYXBzID0gMDsKIAotCSoodTggKikgZm1yLT5tcHQgPSBNTFg0X01QVF9TVEFUVVNfU1c7CisJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKSB7CisJCWVyciA9IFBUUl9FUlIobWFpbGJveCk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1seDRfaWI6IG1seDRfYWxsb2NfY21kX21haWxib3giCisJCSAgICAgICAiIGZhaWxlZCAoJWQpXG4iLCBlcnIpOworCQlyZXR1cm47CisJfQorCisJZXJyID0gbWx4NF9IVzJTV19NUFQoZGV2LCBOVUxMLAorCQkJICAgICBrZXlfdG9faHdfaW5kZXgoZm1yLT5tci5rZXkpICYKKwkJCSAgICAgKGRldi0+Y2Fwcy5udW1fbXB0cyAtIDEpKTsKKwltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKKwlpZiAoZXJyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1seDRfaWI6IG1seDRfSFcyU1dfTVBUIGZhaWxlZCAoJWQpXG4iLAorCQkgICAgICAgZXJyKTsKKwkJcmV0dXJuOworCX0KKwlmbXItPm1yLmVuYWJsZWQgPSBNTFg0X01SX0VOX1NXOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9mbXJfdW5tYXApOwogCkBAIC02NTQsMTUgKzk0NywyOCBAQAogCWlmIChmbXItPm1hcHMpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlmbXItPm1yLmVuYWJsZWQgPSAwOwogCW1seDRfbXJfZnJlZShkZXYsICZmbXItPm1yKTsKKwlmbXItPm1yLmVuYWJsZWQgPSBNTFg0X01SX0RJU0FCTEVEOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X2Ztcl9mcmVlKTsKIAorc3RhdGljIGludCBtbHg0X2Ztcl9mcmVlX3Jlc2VydmVkKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9mbXIgKmZtcikKK3sKKwlpZiAoZm1yLT5tYXBzKQorCQlyZXR1cm4gLUVCVVNZOworCisJbWx4NF9tcl9mcmVlX3Jlc2VydmVkKGRldiwgJmZtci0+bXIpOworCWZtci0+bXIuZW5hYmxlZCA9IE1MWDRfTVJfRElTQUJMRUQ7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1seDRfZm1yX2ZyZWVfcmVzZXJ2ZWQpOworCiBpbnQgbWx4NF9TWU5DX1RQVChzdHJ1Y3QgbWx4NF9kZXYgKmRldikKIHsKLQlyZXR1cm4gbWx4NF9jbWQoZGV2LCAwLCAwLCAwLCBNTFg0X0NNRF9TWU5DX1RQVCwgMTAwMCk7CisJcmV0dXJuIG1seDRfY21kKGRldiwgMCwgMCwgMCwgTUxYNF9DTURfU1lOQ19UUFQsIDEwMDAsCisJCQlNTFg0X0NNRF9XUkFQUEVEKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfU1lOQ19UUFQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9wZC5jCmluZGV4IDI2MGVkMjUuLjVjOWE1NGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcGQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BkLmMKQEAgLTMxLDYgKzMxLDcgQEAKICAqIFNPRlRXQVJFLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pby1tYXBwaW5nLmg+CkBAIC01MSw3ICs1Miw4IEBACiAJKnBkbiA9IG1seDRfYml0bWFwX2FsbG9jKCZwcml2LT5wZF9iaXRtYXApOwogCWlmICgqcGRuID09IC0xKQogCQlyZXR1cm4gLUVOT01FTTsKLQorCWlmIChtbHg0X2lzX21mdW5jKGRldikpCisJCSpwZG4gfD0gKGRldi0+Y2Fwcy5mdW5jdGlvbiArIDEpIDw8IE5PVF9NQVNLRURfUERfQklUUzsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfcGRfYWxsb2MpOwpAQCAtODUsNyArODcsOCBAQAogCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKIAogCXJldHVybiBtbHg0X2JpdG1hcF9pbml0KCZwcml2LT5wZF9iaXRtYXAsIGRldi0+Y2Fwcy5udW1fcGRzLAotCQkJCSgxIDw8IDI0KSAtIDEsIGRldi0+Y2Fwcy5yZXNlcnZlZF9wZHMsIDApOworCQkJCSgxIDw8IE5PVF9NQVNLRURfUERfQklUUykgLSAxLAorCQkJCSBkZXYtPmNhcHMucmVzZXJ2ZWRfcGRzLCAwKTsKIH0KIAogdm9pZCBtbHg0X2NsZWFudXBfcGRfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpCkBAIC0xMDgsMTMgKzExMSwxOSBAQAogCiBpbnQgbWx4NF91YXJfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3VhciAqdWFyKQogeworCWludCBvZmZzZXQ7CisKIAl1YXItPmluZGV4ID0gbWx4NF9iaXRtYXBfYWxsb2MoJm1seDRfcHJpdihkZXYpLT51YXJfdGFibGUuYml0bWFwKTsKIAlpZiAodWFyLT5pbmRleCA9PSAtMSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQl1YXItPnBmbiA9IChwY2lfcmVzb3VyY2Vfc3RhcnQoZGV2LT5wZGV2LCAyKSA+PiBQQUdFX1NISUZUKSArIHVhci0+aW5kZXg7CisJaWYgKG1seDRfaXNfc2xhdmUoZGV2KSkKKwkJb2Zmc2V0ID0gdWFyLT5pbmRleCAlICgoaW50KSBwY2lfcmVzb3VyY2VfbGVuKGRldi0+cGRldiwgMikgLworCQkJCSAgICAgICBkZXYtPmNhcHMudWFyX3BhZ2Vfc2l6ZSk7CisJZWxzZQorCQlvZmZzZXQgPSB1YXItPmluZGV4OworCXVhci0+cGZuID0gKHBjaV9yZXNvdXJjZV9zdGFydChkZXYtPnBkZXYsIDIpID4+IFBBR0VfU0hJRlQpICsgb2Zmc2V0OwogCXVhci0+bWFwID0gTlVMTDsKLQogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF91YXJfYWxsb2MpOwpAQCAtMjMyLDcgKzI0MSw3IEBACiAKIAlyZXR1cm4gbWx4NF9iaXRtYXBfaW5pdCgmbWx4NF9wcml2KGRldiktPnVhcl90YWJsZS5iaXRtYXAsCiAJCQkJZGV2LT5jYXBzLm51bV91YXJzLCBkZXYtPmNhcHMubnVtX3VhcnMgLSAxLAotCQkJCW1heCgxMjgsIGRldi0+Y2Fwcy5yZXNlcnZlZF91YXJzKSwgMCk7CisJCQkJZGV2LT5jYXBzLnJlc2VydmVkX3VhcnMsIDApOwogfQogCiB2b2lkIG1seDRfY2xlYW51cF91YXJfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3BvcnQuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCmluZGV4IGQ5NDJhZWEuLjg4YjUyZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcG9ydC5jCkBAIC03MCw0MSArNzAsMTIgQEAKIAl0YWJsZS0+dG90YWwgPSAwOwogfQogCi1zdGF0aWMgaW50IG1seDRfc2V0X3BvcnRfbWFjX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LAotCQkJCSAgIF9fYmU2NCAqZW50cmllcykKLXsKLQlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveDsKLQl1MzIgaW5fbW9kOwotCWludCBlcnI7Ci0KLQltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOwotCWlmIChJU19FUlIobWFpbGJveCkpCi0JCXJldHVybiBQVFJfRVJSKG1haWxib3gpOwotCi0JbWVtY3B5KG1haWxib3gtPmJ1ZiwgZW50cmllcywgTUxYNF9NQUNfVEFCTEVfU0laRSk7Ci0KLQlpbl9tb2QgPSBNTFg0X1NFVF9QT1JUX01BQ19UQUJMRSA8PCA4IHwgcG9ydDsKLQllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgaW5fbW9kLCAxLCBNTFg0X0NNRF9TRVRfUE9SVCwKLQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7Ci0KLQltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IG1seDRfdWNfc3RlZXJfYWRkKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LAotCQkJICAgICB1NjQgbWFjLCBpbnQgKnFwbiwgdTggcmVzZXJ2ZSkKK3N0YXRpYyBpbnQgbWx4NF91Y19zdGVlcl9hZGQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU2NCBtYWMsIGludCAqcXBuKQogewogCXN0cnVjdCBtbHg0X3FwIHFwOwogCXU4IGdpZFsxNl0gPSB7MH07CiAJaW50IGVycjsKIAotCWlmIChyZXNlcnZlKSB7Ci0JCWVyciA9IG1seDRfcXBfcmVzZXJ2ZV9yYW5nZShkZXYsIDEsIDEsIHFwbik7Ci0JCWlmIChlcnIpIHsKLQkJCW1seDRfZXJyKGRldiwgIkZhaWxlZCB0byByZXNlcnZlIHFwIGZvciBtYWMgcmVnaXN0cmF0aW9uXG4iKTsKLQkJCXJldHVybiBlcnI7Ci0JCX0KLQl9CiAJcXAucXBuID0gKnFwbjsKIAogCW1hYyAmPSAweGZmZmZmZmZmZmZmZlVMTDsKQEAgLTExMywxNiArODQsMTUgQEAKIAlnaWRbNV0gPSBwb3J0OwogCWdpZFs3XSA9IE1MWDRfVUNfU1RFRVIgPDwgMTsKIAotCWVyciA9IG1seDRfcXBfYXR0YWNoX2NvbW1vbihkZXYsICZxcCwgZ2lkLCAwLAotCQkJCSAgICBNTFg0X1BST1RfRVRILCBNTFg0X1VDX1NURUVSKTsKLQlpZiAoZXJyICYmIHJlc2VydmUpCi0JCW1seDRfcXBfcmVsZWFzZV9yYW5nZShkZXYsICpxcG4sIDEpOworCWVyciA9IG1seDRfdW5pY2FzdF9hdHRhY2goZGV2LCAmcXAsIGdpZCwgMCwgTUxYNF9QUk9UX0VUSCk7CisJaWYgKGVycikKKwkJbWx4NF93YXJuKGRldiwgIkZhaWxlZCBBdHRhY2hpbmcgVW5pY2FzdFxuIik7CiAKIAlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBtbHg0X3VjX3N0ZWVyX3JlbGVhc2Uoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCi0JCQkJICB1NjQgbWFjLCBpbnQgcXBuLCB1OCBmcmVlKQorCQkJCSAgdTY0IG1hYywgaW50IHFwbikKIHsKIAlzdHJ1Y3QgbWx4NF9xcCBxcDsKIAl1OCBnaWRbMTZdID0gezB9OwpAQCAtMTM0LDg5ICsxMDQsOSBAQAogCWdpZFs1XSA9IHBvcnQ7CiAJZ2lkWzddID0gTUxYNF9VQ19TVEVFUiA8PCAxOwogCi0JbWx4NF9xcF9kZXRhY2hfY29tbW9uKGRldiwgJnFwLCBnaWQsIE1MWDRfUFJPVF9FVEgsIE1MWDRfVUNfU1RFRVIpOwotCWlmIChmcmVlKQotCQltbHg0X3FwX3JlbGVhc2VfcmFuZ2UoZGV2LCBxcG4sIDEpOworCW1seDRfdW5pY2FzdF9kZXRhY2goZGV2LCAmcXAsIGdpZCwgTUxYNF9QUk9UX0VUSCk7CiB9CiAKLWludCBtbHg0X3JlZ2lzdGVyX21hYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTY0IG1hYywgaW50ICpxcG4sIHU4IHdyYXApCi17Ci0Jc3RydWN0IG1seDRfcG9ydF9pbmZvICppbmZvID0gJm1seDRfcHJpdihkZXYpLT5wb3J0W3BvcnRdOwotCXN0cnVjdCBtbHg0X21hY190YWJsZSAqdGFibGUgPSAmaW5mby0+bWFjX3RhYmxlOwotCXN0cnVjdCBtbHg0X21hY19lbnRyeSAqZW50cnk7Ci0JaW50IGksIGVyciA9IDA7Ci0JaW50IGZyZWUgPSAtMTsKLQotCWlmIChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19WRVBfVUNfU1RFRVIpIHsKLQkJZXJyID0gbWx4NF91Y19zdGVlcl9hZGQoZGV2LCBwb3J0LCBtYWMsIHFwbiwgMSk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCi0JCWVudHJ5ID0ga21hbGxvYyhzaXplb2YgKmVudHJ5LCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFlbnRyeSkgewotCQkJbWx4NF91Y19zdGVlcl9yZWxlYXNlKGRldiwgcG9ydCwgbWFjLCAqcXBuLCAxKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJZW50cnktPm1hYyA9IG1hYzsKLQkJZXJyID0gcmFkaXhfdHJlZV9pbnNlcnQoJmluZm8tPm1hY190cmVlLCAqcXBuLCBlbnRyeSk7Ci0JCWlmIChlcnIpIHsKLQkJCWtmcmVlKGVudHJ5KTsKLQkJCW1seDRfdWNfc3RlZXJfcmVsZWFzZShkZXYsIHBvcnQsIG1hYywgKnFwbiwgMSk7Ci0JCQlyZXR1cm4gZXJyOwotCQl9Ci0JfQotCi0JbWx4NF9kYmcoZGV2LCAiUmVnaXN0ZXJpbmcgTUFDOiAweCVsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG1hYyk7Ci0KLQltdXRleF9sb2NrKCZ0YWJsZS0+bXV0ZXgpOwotCWZvciAoaSA9IDA7IGkgPCBNTFg0X01BWF9NQUNfTlVNIC0gMTsgaSsrKSB7Ci0JCWlmIChmcmVlIDwgMCAmJiAhdGFibGUtPnJlZnNbaV0pIHsKLQkJCWZyZWUgPSBpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAobWFjID09IChNTFg0X01BQ19NQVNLICYgYmU2NF90b19jcHUodGFibGUtPmVudHJpZXNbaV0pKSkgewotCQkJLyogTUFDIGFscmVhZHkgcmVnaXN0ZXJlZCwgaW5jcmVhc2UgcmVmZXJlbmNlcyBjb3VudCAqLwotCQkJKyt0YWJsZS0+cmVmc1tpXTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JfQotCi0JaWYgKGZyZWUgPCAwKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCW1seDRfZGJnKGRldiwgIkZyZWUgTUFDIGluZGV4IGlzICVkXG4iLCBmcmVlKTsKLQotCWlmICh0YWJsZS0+dG90YWwgPT0gdGFibGUtPm1heCkgewotCQkvKiBObyBmcmVlIG1hYyBlbnRyaWVzICovCi0JCWVyciA9IC1FTk9TUEM7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qIFJlZ2lzdGVyIG5ldyBNQUMgKi8KLQl0YWJsZS0+cmVmc1tmcmVlXSA9IDE7Ci0JdGFibGUtPmVudHJpZXNbZnJlZV0gPSBjcHVfdG9fYmU2NChtYWMgfCBNTFg0X01BQ19WQUxJRCk7Ci0KLQllcnIgPSBtbHg0X3NldF9wb3J0X21hY190YWJsZShkZXYsIHBvcnQsIHRhYmxlLT5lbnRyaWVzKTsKLQlpZiAodW5saWtlbHkoZXJyKSkgewotCQltbHg0X2VycihkZXYsICJGYWlsZWQgYWRkaW5nIE1BQzogMHglbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKSBtYWMpOwotCQl0YWJsZS0+cmVmc1tmcmVlXSA9IDA7Ci0JCXRhYmxlLT5lbnRyaWVzW2ZyZWVdID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKCEoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX1VDX1NURUVSKSkKLQkJKnFwbiA9IGluZm8tPmJhc2VfcXBuICsgZnJlZTsKLQkrK3RhYmxlLT50b3RhbDsKLW91dDoKLQltdXRleF91bmxvY2soJnRhYmxlLT5tdXRleCk7Ci0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG1seDRfcmVnaXN0ZXJfbWFjKTsKLQogc3RhdGljIGludCB2YWxpZGF0ZV9pbmRleChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwKIAkJCSAgc3RydWN0IG1seDRfbWFjX3RhYmxlICp0YWJsZSwgaW50IGluZGV4KQogewpAQCAtMjMzLDY3ICsxMjMsMjUxIEBACiAJCSAgICAgIHN0cnVjdCBtbHg0X21hY190YWJsZSAqdGFibGUsIHU2NCBtYWMpCiB7CiAJaW50IGk7CisKIAlmb3IgKGkgPSAwOyBpIDwgTUxYNF9NQVhfTUFDX05VTTsgaSsrKSB7Ci0JCWlmIChtYWMgPT0gKE1MWDRfTUFDX01BU0sgJiBiZTY0X3RvX2NwdSh0YWJsZS0+ZW50cmllc1tpXSkpKQorCQlpZiAoKG1hYyAmIE1MWDRfTUFDX01BU0spID09CisJCSAgICAoTUxYNF9NQUNfTUFTSyAmIGJlNjRfdG9fY3B1KHRhYmxlLT5lbnRyaWVzW2ldKSkpCiAJCQlyZXR1cm4gaTsKIAl9CiAJLyogTWFjIG5vdCBmb3VuZCAqLwogCXJldHVybiAtRUlOVkFMOwogfQogCi12b2lkIG1seDRfdW5yZWdpc3Rlcl9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBxcG4pCitpbnQgbWx4NF9nZXRfZXRoX3FwKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1NjQgbWFjLCBpbnQgKnFwbikKIHsKIAlzdHJ1Y3QgbWx4NF9wb3J0X2luZm8gKmluZm8gPSAmbWx4NF9wcml2KGRldiktPnBvcnRbcG9ydF07Ci0Jc3RydWN0IG1seDRfbWFjX3RhYmxlICp0YWJsZSA9ICZpbmZvLT5tYWNfdGFibGU7Ci0JaW50IGluZGV4ID0gcXBuIC0gaW5mby0+YmFzZV9xcG47CiAJc3RydWN0IG1seDRfbWFjX2VudHJ5ICplbnRyeTsKKwlpbnQgaW5kZXggPSAwOworCWludCBlcnIgPSAwOworCisJbWx4NF9kYmcoZGV2LCAiUmVnaXN0ZXJpbmcgTUFDOiAweCVsbHggZm9yIGFkZGluZ1xuIiwKKwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG1hYyk7CisJaW5kZXggPSBtbHg0X3JlZ2lzdGVyX21hYyhkZXYsIHBvcnQsIG1hYyk7CisJaWYgKGluZGV4IDwgMCkgeworCQllcnIgPSBpbmRleDsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIGFkZGluZyBNQUM6IDB4JWxseFxuIiwKKwkJCSAodW5zaWduZWQgbG9uZyBsb25nKSBtYWMpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICghKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUikpIHsKKwkJKnFwbiA9IGluZm8tPmJhc2VfcXBuICsgaW5kZXg7CisJCXJldHVybiAwOworCX0KKworCWVyciA9IG1seDRfcXBfcmVzZXJ2ZV9yYW5nZShkZXYsIDEsIDEsIHFwbik7CisJbWx4NF9kYmcoZGV2LCAiUmVzZXJ2ZWQgcXAgJWRcbiIsICpxcG4pOworCWlmIChlcnIpIHsKKwkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIHRvIHJlc2VydmUgcXAgZm9yIG1hYyByZWdpc3RyYXRpb25cbiIpOworCQlnb3RvIHFwX2VycjsKKwl9CisKKwllcnIgPSBtbHg0X3VjX3N0ZWVyX2FkZChkZXYsIHBvcnQsIG1hYywgcXBuKTsKKwlpZiAoZXJyKQorCQlnb3RvIHN0ZWVyX2VycjsKKworCWVudHJ5ID0ga21hbGxvYyhzaXplb2YgKmVudHJ5LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudHJ5KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gYWxsb2NfZXJyOworCX0KKwllbnRyeS0+bWFjID0gbWFjOworCWVyciA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZpbmZvLT5tYWNfdHJlZSwgKnFwbiwgZW50cnkpOworCWlmIChlcnIpCisJCWdvdG8gaW5zZXJ0X2VycjsKKwlyZXR1cm4gMDsKKworaW5zZXJ0X2VycjoKKwlrZnJlZShlbnRyeSk7CisKK2FsbG9jX2VycjoKKwltbHg0X3VjX3N0ZWVyX3JlbGVhc2UoZGV2LCBwb3J0LCBtYWMsICpxcG4pOworCitzdGVlcl9lcnI6CisJbWx4NF9xcF9yZWxlYXNlX3JhbmdlKGRldiwgKnFwbiwgMSk7CisKK3FwX2VycjoKKwltbHg0X3VucmVnaXN0ZXJfbWFjKGRldiwgcG9ydCwgbWFjKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9nZXRfZXRoX3FwKTsKKwordm9pZCBtbHg0X3B1dF9ldGhfcXAoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU2NCBtYWMsIGludCBxcG4pCit7CisJc3RydWN0IG1seDRfcG9ydF9pbmZvICppbmZvID0gJm1seDRfcHJpdihkZXYpLT5wb3J0W3BvcnRdOworCXN0cnVjdCBtbHg0X21hY19lbnRyeSAqZW50cnk7CisKKwltbHg0X2RiZyhkZXYsICJSZWdpc3RlcmluZyBNQUM6IDB4JWxseCBmb3IgZGVsZXRpbmdcbiIsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKSBtYWMpOworCW1seDRfdW5yZWdpc3Rlcl9tYWMoZGV2LCBwb3J0LCBtYWMpOwogCiAJaWYgKGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUikgewogCQllbnRyeSA9IHJhZGl4X3RyZWVfbG9va3VwKCZpbmZvLT5tYWNfdHJlZSwgcXBuKTsKIAkJaWYgKGVudHJ5KSB7Ci0JCQltbHg0X3VjX3N0ZWVyX3JlbGVhc2UoZGV2LCBwb3J0LCBlbnRyeS0+bWFjLCBxcG4sIDEpOworCQkJbWx4NF9kYmcoZGV2LCAiUmVsZWFzaW5nIHFwOiBwb3J0ICVkLCBtYWMgMHglbGx4LCIKKwkJCQkgIiBxcG4gJWRcbiIsIHBvcnQsCisJCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIG1hYywgcXBuKTsKKwkJCW1seDRfdWNfc3RlZXJfcmVsZWFzZShkZXYsIHBvcnQsIGVudHJ5LT5tYWMsIHFwbik7CisJCQltbHg0X3FwX3JlbGVhc2VfcmFuZ2UoZGV2LCBxcG4sIDEpOwogCQkJcmFkaXhfdHJlZV9kZWxldGUoJmluZm8tPm1hY190cmVlLCBxcG4pOwotCQkJaW5kZXggPSBmaW5kX2luZGV4KGRldiwgdGFibGUsIGVudHJ5LT5tYWMpOwogCQkJa2ZyZWUoZW50cnkpOwogCQl9CiAJfQorfQorRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9wdXRfZXRoX3FwKTsKKworc3RhdGljIGludCBtbHg0X3NldF9wb3J0X21hY190YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwKKwkJCQkgICBfX2JlNjQgKmVudHJpZXMpCit7CisJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CisJdTMyIGluX21vZDsKKwlpbnQgZXJyOworCisJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKQorCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKKworCW1lbWNweShtYWlsYm94LT5idWYsIGVudHJpZXMsIE1MWDRfTUFDX1RBQkxFX1NJWkUpOworCisJaW5fbW9kID0gTUxYNF9TRVRfUE9SVF9NQUNfVEFCTEUgPDwgOCB8IHBvcnQ7CisKKwllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgaW5fbW9kLCAxLCBNTFg0X0NNRF9TRVRfUE9SVCwKKwkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgTUxYNF9DTURfTkFUSVZFKTsKKworCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBfX21seDRfcmVnaXN0ZXJfbWFjKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1NjQgbWFjKQoreworCXN0cnVjdCBtbHg0X3BvcnRfaW5mbyAqaW5mbyA9ICZtbHg0X3ByaXYoZGV2KS0+cG9ydFtwb3J0XTsKKwlzdHJ1Y3QgbWx4NF9tYWNfdGFibGUgKnRhYmxlID0gJmluZm8tPm1hY190YWJsZTsKKwlpbnQgaSwgZXJyID0gMDsKKwlpbnQgZnJlZSA9IC0xOworCisJbWx4NF9kYmcoZGV2LCAiUmVnaXN0ZXJpbmcgTUFDOiAweCVsbHggZm9yIHBvcnQgJWRcbiIsCisJCSAodW5zaWduZWQgbG9uZyBsb25nKSBtYWMsIHBvcnQpOworCisJbXV0ZXhfbG9jaygmdGFibGUtPm11dGV4KTsKKwlmb3IgKGkgPSAwOyBpIDwgTUxYNF9NQVhfTUFDX05VTTsgaSsrKSB7CisJCWlmIChmcmVlIDwgMCAmJiAhdGFibGUtPmVudHJpZXNbaV0pIHsKKwkJCWZyZWUgPSBpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobWFjID09IChNTFg0X01BQ19NQVNLICYgYmU2NF90b19jcHUodGFibGUtPmVudHJpZXNbaV0pKSkgeworCQkJLyogTUFDIGFscmVhZHkgcmVnaXN0ZXJlZCwgTXVzdCBub3QgaGF2ZSBkdXBsaWNhdGVzICovCisJCQllcnIgPSAtRUVYSVNUOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwltbHg0X2RiZyhkZXYsICJGcmVlIE1BQyBpbmRleCBpcyAlZFxuIiwgZnJlZSk7CisKKwlpZiAodGFibGUtPnRvdGFsID09IHRhYmxlLT5tYXgpIHsKKwkJLyogTm8gZnJlZSBtYWMgZW50cmllcyAqLworCQllcnIgPSAtRU5PU1BDOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBSZWdpc3RlciBuZXcgTUFDICovCisJdGFibGUtPmVudHJpZXNbZnJlZV0gPSBjcHVfdG9fYmU2NChtYWMgfCBNTFg0X01BQ19WQUxJRCk7CisKKwllcnIgPSBtbHg0X3NldF9wb3J0X21hY190YWJsZShkZXYsIHBvcnQsIHRhYmxlLT5lbnRyaWVzKTsKKwlpZiAodW5saWtlbHkoZXJyKSkgeworCQltbHg0X2VycihkZXYsICJGYWlsZWQgYWRkaW5nIE1BQzogMHglbGx4XG4iLAorCQkJICh1bnNpZ25lZCBsb25nIGxvbmcpIG1hYyk7CisJCXRhYmxlLT5lbnRyaWVzW2ZyZWVdID0gMDsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gZnJlZTsKKwkrK3RhYmxlLT50b3RhbDsKK291dDoKKwltdXRleF91bmxvY2soJnRhYmxlLT5tdXRleCk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKF9fbWx4NF9yZWdpc3Rlcl9tYWMpOworCitpbnQgbWx4NF9yZWdpc3Rlcl9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU2NCBtYWMpCit7CisJdTY0IG91dF9wYXJhbTsKKwlpbnQgZXJyOworCisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkgeworCQlzZXRfcGFyYW1fbCgmb3V0X3BhcmFtLCBwb3J0KTsKKwkJZXJyID0gbWx4NF9jbWRfaW1tKGRldiwgbWFjLCAmb3V0X3BhcmFtLCBSRVNfTUFDLAorCQkJCSAgIFJFU19PUF9SRVNFUlZFX0FORF9NQVAsIE1MWDRfQ01EX0FMTE9DX1JFUywKKwkJCQkgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EsIE1MWDRfQ01EX1dSQVBQRUQpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlyZXR1cm4gZ2V0X3BhcmFtX2woJm91dF9wYXJhbSk7CisJfQorCXJldHVybiBfX21seDRfcmVnaXN0ZXJfbWFjKGRldiwgcG9ydCwgbWFjKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1seDRfcmVnaXN0ZXJfbWFjKTsKKworCit2b2lkIF9fbWx4NF91bnJlZ2lzdGVyX21hYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTY0IG1hYykKK3sKKwlzdHJ1Y3QgbWx4NF9wb3J0X2luZm8gKmluZm8gPSAmbWx4NF9wcml2KGRldiktPnBvcnRbcG9ydF07CisJc3RydWN0IG1seDRfbWFjX3RhYmxlICp0YWJsZSA9ICZpbmZvLT5tYWNfdGFibGU7CisJaW50IGluZGV4OworCisJaW5kZXggPSBmaW5kX2luZGV4KGRldiwgdGFibGUsIG1hYyk7CiAKIAltdXRleF9sb2NrKCZ0YWJsZS0+bXV0ZXgpOwogCiAJaWYgKHZhbGlkYXRlX2luZGV4KGRldiwgdGFibGUsIGluZGV4KSkKIAkJZ290byBvdXQ7CiAKLQkvKiBDaGVjayB3aGV0aGVyIHRoaXMgYWRkcmVzcyBoYXMgcmVmZXJlbmNlIGNvdW50ICovCi0JaWYgKCEoLS10YWJsZS0+cmVmc1tpbmRleF0pKSB7Ci0JCXRhYmxlLT5lbnRyaWVzW2luZGV4XSA9IDA7Ci0JCW1seDRfc2V0X3BvcnRfbWFjX3RhYmxlKGRldiwgcG9ydCwgdGFibGUtPmVudHJpZXMpOwotCQktLXRhYmxlLT50b3RhbDsKLQl9CisJdGFibGUtPmVudHJpZXNbaW5kZXhdID0gMDsKKwltbHg0X3NldF9wb3J0X21hY190YWJsZShkZXYsIHBvcnQsIHRhYmxlLT5lbnRyaWVzKTsKKwktLXRhYmxlLT50b3RhbDsKIG91dDoKIAltdXRleF91bmxvY2soJnRhYmxlLT5tdXRleCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChfX21seDRfdW5yZWdpc3Rlcl9tYWMpOworCit2b2lkIG1seDRfdW5yZWdpc3Rlcl9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU2NCBtYWMpCit7CisJdTY0IG91dF9wYXJhbTsKKwlpbnQgZXJyOworCisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkgeworCQlzZXRfcGFyYW1fbCgmb3V0X3BhcmFtLCBwb3J0KTsKKwkJZXJyID0gbWx4NF9jbWRfaW1tKGRldiwgbWFjLCAmb3V0X3BhcmFtLCBSRVNfTUFDLAorCQkJCSAgIFJFU19PUF9SRVNFUlZFX0FORF9NQVAsIE1MWDRfQ01EX0ZSRUVfUkVTLAorCQkJCSAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfV1JBUFBFRCk7CisJCXJldHVybjsKKwl9CisJX19tbHg0X3VucmVnaXN0ZXJfbWFjKGRldiwgcG9ydCwgbWFjKTsKKwlyZXR1cm47Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X3VucmVnaXN0ZXJfbWFjKTsKIAotaW50IG1seDRfcmVwbGFjZV9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBxcG4sIHU2NCBuZXdfbWFjLCB1OCB3cmFwKQoraW50IG1seDRfcmVwbGFjZV9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBxcG4sIHU2NCBuZXdfbWFjKQogewogCXN0cnVjdCBtbHg0X3BvcnRfaW5mbyAqaW5mbyA9ICZtbHg0X3ByaXYoZGV2KS0+cG9ydFtwb3J0XTsKIAlzdHJ1Y3QgbWx4NF9tYWNfdGFibGUgKnRhYmxlID0gJmluZm8tPm1hY190YWJsZTsKLQlpbnQgaW5kZXggPSBxcG4gLSBpbmZvLT5iYXNlX3FwbjsKIAlzdHJ1Y3QgbWx4NF9tYWNfZW50cnkgKmVudHJ5OwotCWludCBlcnI7CisJaW50IGluZGV4ID0gcXBuIC0gaW5mby0+YmFzZV9xcG47CisJaW50IGVyciA9IDA7CiAKIAlpZiAoZGV2LT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX1VDX1NURUVSKSB7CiAJCWVudHJ5ID0gcmFkaXhfdHJlZV9sb29rdXAoJmluZm8tPm1hY190cmVlLCBxcG4pOwogCQlpZiAoIWVudHJ5KQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWluZGV4ID0gZmluZF9pbmRleChkZXYsIHRhYmxlLCBlbnRyeS0+bWFjKTsKLQkJbWx4NF91Y19zdGVlcl9yZWxlYXNlKGRldiwgcG9ydCwgZW50cnktPm1hYywgcXBuLCAwKTsKKwkJbWx4NF91Y19zdGVlcl9yZWxlYXNlKGRldiwgcG9ydCwgZW50cnktPm1hYywgcXBuKTsKKwkJbWx4NF91bnJlZ2lzdGVyX21hYyhkZXYsIHBvcnQsIGVudHJ5LT5tYWMpOwogCQllbnRyeS0+bWFjID0gbmV3X21hYzsKLQkJZXJyID0gbWx4NF91Y19zdGVlcl9hZGQoZGV2LCBwb3J0LCBlbnRyeS0+bWFjLCAmcXBuLCAwKTsKLQkJaWYgKGVyciB8fCBpbmRleCA8IDApCi0JCQlyZXR1cm4gZXJyOworCQltbHg0X3JlZ2lzdGVyX21hYyhkZXYsIHBvcnQsIG5ld19tYWMpOworCQllcnIgPSBtbHg0X3VjX3N0ZWVyX2FkZChkZXYsIHBvcnQsIGVudHJ5LT5tYWMsICZxcG4pOworCQlyZXR1cm4gZXJyOwogCX0KIAorCS8qIENYMSBkb2Vzbid0IHN1cHBvcnQgbXVsdGktZnVuY3Rpb25zICovCiAJbXV0ZXhfbG9jaygmdGFibGUtPm11dGV4KTsKIAogCWVyciA9IHZhbGlkYXRlX2luZGV4KGRldiwgdGFibGUsIGluZGV4KTsKQEAgLTMwNCw3ICszNzgsOCBAQAogCiAJZXJyID0gbWx4NF9zZXRfcG9ydF9tYWNfdGFibGUoZGV2LCBwb3J0LCB0YWJsZS0+ZW50cmllcyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKLQkJbWx4NF9lcnIoZGV2LCAiRmFpbGVkIGFkZGluZyBNQUM6IDB4JWxseFxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgbmV3X21hYyk7CisJCW1seDRfZXJyKGRldiwgIkZhaWxlZCBhZGRpbmcgTUFDOiAweCVsbHhcbiIsCisJCQkgKHVuc2lnbmVkIGxvbmcgbG9uZykgbmV3X21hYyk7CiAJCXRhYmxlLT5lbnRyaWVzW2luZGV4XSA9IDA7CiAJfQogb3V0OgpAQCAtMzEyLDYgKzM4Nyw3IEBACiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfcmVwbGFjZV9tYWMpOworCiBzdGF0aWMgaW50IG1seDRfc2V0X3BvcnRfdmxhbl90YWJsZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwKIAkJCQkgICAgX19iZTMyICplbnRyaWVzKQogewpAQCAtMzI2LDcgKzQwMiw3IEBACiAJbWVtY3B5KG1haWxib3gtPmJ1ZiwgZW50cmllcywgTUxYNF9WTEFOX1RBQkxFX1NJWkUpOwogCWluX21vZCA9IE1MWDRfU0VUX1BPUlRfVkxBTl9UQUJMRSA8PCA4IHwgcG9ydDsKIAllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgaW5fbW9kLCAxLCBNTFg0X0NNRF9TRVRfUE9SVCwKLQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7CisJCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX1dSQVBQRUQpOwogCiAJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CiAKQEAgLTM1Miw3ICs0MjgsOCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9maW5kX2NhY2hlZF92bGFuKTsKIAotaW50IG1seDRfcmVnaXN0ZXJfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTE2IHZsYW4sIGludCAqaW5kZXgpCitzdGF0aWMgaW50IF9fbWx4NF9yZWdpc3Rlcl92bGFuKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1MTYgdmxhbiwKKwkJCQlpbnQgKmluZGV4KQogewogCXN0cnVjdCBtbHg0X3ZsYW5fdGFibGUgKnRhYmxlID0gJm1seDRfcHJpdihkZXYpLT5wb3J0W3BvcnRdLnZsYW5fdGFibGU7CiAJaW50IGksIGVyciA9IDA7CkBAIC0zODcsNyArNDY0LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JLyogUmVnaXN0ZXIgbmV3IE1BQyAqLworCS8qIFJlZ2lzdGVyIG5ldyBWTEFOICovCiAJdGFibGUtPnJlZnNbZnJlZV0gPSAxOwogCXRhYmxlLT5lbnRyaWVzW2ZyZWVdID0gY3B1X3RvX2JlMzIodmxhbiB8IE1MWDRfVkxBTl9WQUxJRCk7CiAKQEAgLTQwNSw5ICs0ODIsMjcgQEAKIAltdXRleF91bmxvY2soJnRhYmxlLT5tdXRleCk7CiAJcmV0dXJuIGVycjsKIH0KKworaW50IG1seDRfcmVnaXN0ZXJfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTE2IHZsYW4sIGludCAqaW5kZXgpCit7CisJdTY0IG91dF9wYXJhbTsKKwlpbnQgZXJyOworCisJaWYgKG1seDRfaXNfbWZ1bmMoZGV2KSkgeworCQlzZXRfcGFyYW1fbCgmb3V0X3BhcmFtLCBwb3J0KTsKKwkJZXJyID0gbWx4NF9jbWRfaW1tKGRldiwgdmxhbiwgJm91dF9wYXJhbSwgUkVTX1ZMQU4sCisJCQkJICAgUkVTX09QX1JFU0VSVkVfQU5EX01BUCwgTUxYNF9DTURfQUxMT0NfUkVTLAorCQkJCSAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfV1JBUFBFRCk7CisJCWlmICghZXJyKQorCQkJKmluZGV4ID0gZ2V0X3BhcmFtX2woJm91dF9wYXJhbSk7CisKKwkJcmV0dXJuIGVycjsKKwl9CisJcmV0dXJuIF9fbWx4NF9yZWdpc3Rlcl92bGFuKGRldiwgcG9ydCwgdmxhbiwgaW5kZXgpOworfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9yZWdpc3Rlcl92bGFuKTsKIAotdm9pZCBtbHg0X3VucmVnaXN0ZXJfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgaW50IGluZGV4KQorc3RhdGljIHZvaWQgX19tbHg0X3VucmVnaXN0ZXJfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgaW50IGluZGV4KQogewogCXN0cnVjdCBtbHg0X3ZsYW5fdGFibGUgKnRhYmxlID0gJm1seDRfcHJpdihkZXYpLT5wb3J0W3BvcnRdLnZsYW5fdGFibGU7CiAKQEAgLTQzMiw2ICs1MjcsMjUgQEAKIG91dDoKIAltdXRleF91bmxvY2soJnRhYmxlLT5tdXRleCk7CiB9CisKK3ZvaWQgbWx4NF91bnJlZ2lzdGVyX3ZsYW4oc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBpbmRleCkKK3sKKwl1NjQgaW5fcGFyYW07CisJaW50IGVycjsKKworCWlmIChtbHg0X2lzX21mdW5jKGRldikpIHsKKwkJc2V0X3BhcmFtX2woJmluX3BhcmFtLCBwb3J0KTsKKwkJZXJyID0gbWx4NF9jbWQoZGV2LCBpbl9wYXJhbSwgUkVTX1ZMQU4sIFJFU19PUF9SRVNFUlZFX0FORF9NQVAsCisJCQkgICAgICAgTUxYNF9DTURfRlJFRV9SRVMsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCSAgICAgICBNTFg0X0NNRF9XUkFQUEVEKTsKKwkJaWYgKCFlcnIpCisJCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIGZyZWVpbmcgdmxhbiBhdCBpbmRleDolZFxuIiwKKwkJCQkJaW5kZXgpOworCisJCXJldHVybjsKKwl9CisJX19tbHg0X3VucmVnaXN0ZXJfdmxhbihkZXYsIHBvcnQsIGluZGV4KTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfdW5yZWdpc3Rlcl92bGFuKTsKIAogaW50IG1seDRfZ2V0X3BvcnRfaWJfY2FwcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgX19iZTMyICpjYXBzKQpAQCAtNDYyLDcgKzU3Niw4IEBACiAJKihfX2JlMzIgKikgKCZpbmJ1ZlsyMF0pID0gY3B1X3RvX2JlMzIocG9ydCk7CiAKIAllcnIgPSBtbHg0X2NtZF9ib3goZGV2LCBpbm1haWxib3gtPmRtYSwgb3V0bWFpbGJveC0+ZG1hLCBwb3J0LCAzLAotCQkJICAgTUxYNF9DTURfTUFEX0lGQywgTUxYNF9DTURfVElNRV9DTEFTU19DKTsKKwkJCSAgIE1MWDRfQ01EX01BRF9JRkMsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQywKKwkJCSAgIE1MWDRfQ01EX05BVElWRSk7CiAJaWYgKCFlcnIpCiAJCSpjYXBzID0gKihfX2JlMzIgKikgKG91dGJ1ZiArIDg0KTsKIAltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBpbm1haWxib3gpOwpAQCAtNDk5LDcgKzYxNCw4IEBACiAJKihfX2JlMzIgKikgKCZpbmJ1ZlsyMF0pID0gY3B1X3RvX2JlMzIocG9ydCk7CiAKIAllcnIgPSBtbHg0X2NtZF9ib3goZGV2LCBpbm1haWxib3gtPmRtYSwgb3V0bWFpbGJveC0+ZG1hLCBwb3J0LCAzLAotCQkJICAgTUxYNF9DTURfTUFEX0lGQywgTUxYNF9DTURfVElNRV9DTEFTU19DKTsKKwkJCSAgIE1MWDRfQ01EX01BRF9JRkMsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQywKKwkJCSAgIE1MWDRfQ01EX05BVElWRSk7CiAKIAlwYWNrZXRfZXJyb3IgPSBiZTE2X3RvX2NwdSgqKF9fYmUxNiAqKSAob3V0YnVmICsgNCkpOwogCkBAIC01MTIsNiArNjI4LDEzOSBAQAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgbWx4NF9jb21tb25fc2V0X3BvcnQoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgdTMyIGluX21vZCwKKwkJCQl1OCBvcF9tb2QsIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCkKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfcG9ydF9pbmZvICpwb3J0X2luZm87CisJc3RydWN0IG1seDRfbWZ1bmNfbWFzdGVyX2N0eCAqbWFzdGVyID0gJnByaXYtPm1mdW5jLm1hc3RlcjsKKwlzdHJ1Y3QgbWx4NF9zbGF2ZV9zdGF0ZSAqc2xhdmVfc3QgPSAmbWFzdGVyLT5zbGF2ZV9zdGF0ZVtzbGF2ZV07CisJc3RydWN0IG1seDRfc2V0X3BvcnRfcnFwX2NhbGNfY29udGV4dCAqcXBuX2NvbnRleHQ7CisJc3RydWN0IG1seDRfc2V0X3BvcnRfZ2VuZXJhbF9jb250ZXh0ICpnZW5fY29udGV4dDsKKwlpbnQgcmVzZXRfcWtleV92aW9sczsKKwlpbnQgcG9ydDsKKwlpbnQgaXNfZXRoOworCXUzMiBpbl9tb2RpZmllcjsKKwl1MzIgcHJvbWlzYzsKKwl1MTYgbXR1LCBwcmV2X210dTsKKwlpbnQgZXJyOworCWludCBpOworCV9fYmUzMiBhZ2dfY2FwX21hc2s7CisJX19iZTMyIHNsYXZlX2NhcF9tYXNrOworCV9fYmUzMiBuZXdfY2FwX21hc2s7CisKKwlwb3J0ID0gaW5fbW9kICYgMHhmZjsKKwlpbl9tb2RpZmllciA9IGluX21vZCA+PiA4OworCWlzX2V0aCA9IG9wX21vZDsKKwlwb3J0X2luZm8gPSAmcHJpdi0+cG9ydFtwb3J0XTsKKworCS8qIFNsYXZlcyBjYW5ub3QgcGVyZm9ybSBTRVRfUE9SVCBvcGVyYXRpb25zIGV4Y2VwdCBjaGFuZ2luZyBNVFUgKi8KKwlpZiAoaXNfZXRoKSB7CisJCWlmIChzbGF2ZSAhPSBkZXYtPmNhcHMuZnVuY3Rpb24gJiYKKwkJICAgIGluX21vZGlmaWVyICE9IE1MWDRfU0VUX1BPUlRfR0VORVJBTCkgeworCQkJbWx4NF93YXJuKGRldiwgImRlbnlpbmcgU0VUX1BPUlQgZm9yIHNsYXZlOiVkXG4iLAorCQkJCQlzbGF2ZSk7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzd2l0Y2ggKGluX21vZGlmaWVyKSB7CisJCWNhc2UgTUxYNF9TRVRfUE9SVF9SUVBfQ0FMQzoKKwkJCXFwbl9jb250ZXh0ID0gaW5ib3gtPmJ1ZjsKKwkJCXFwbl9jb250ZXh0LT5iYXNlX3FwbiA9CisJCQkJY3B1X3RvX2JlMzIocG9ydF9pbmZvLT5iYXNlX3Fwbik7CisJCQlxcG5fY29udGV4dC0+bl9tYWMgPSAweDc7CisJCQlwcm9taXNjID0gYmUzMl90b19jcHUocXBuX2NvbnRleHQtPnByb21pc2MpID4+CisJCQkJU0VUX1BPUlRfUFJPTUlTQ19TSElGVDsKKwkJCXFwbl9jb250ZXh0LT5wcm9taXNjID0gY3B1X3RvX2JlMzIoCisJCQkJcHJvbWlzYyA8PCBTRVRfUE9SVF9QUk9NSVNDX1NISUZUIHwKKwkJCQlwb3J0X2luZm8tPmJhc2VfcXBuKTsKKwkJCXByb21pc2MgPSBiZTMyX3RvX2NwdShxcG5fY29udGV4dC0+bWNhc3QpID4+CisJCQkJU0VUX1BPUlRfTUNfUFJPTUlTQ19TSElGVDsKKwkJCXFwbl9jb250ZXh0LT5tY2FzdCA9IGNwdV90b19iZTMyKAorCQkJCXByb21pc2MgPDwgU0VUX1BPUlRfTUNfUFJPTUlTQ19TSElGVCB8CisJCQkJcG9ydF9pbmZvLT5iYXNlX3Fwbik7CisJCQlicmVhazsKKwkJY2FzZSBNTFg0X1NFVF9QT1JUX0dFTkVSQUw6CisJCQlnZW5fY29udGV4dCA9IGluYm94LT5idWY7CisJCQkvKiBNdHUgaXMgY29uZmlndXJlZCBhcyB0aGUgbWF4IE1UVSBhbW9uZyBhbGwgdGhlCisJCQkgKiB0aGUgZnVuY3Rpb25zIG9uIHRoZSBwb3J0LiAqLworCQkJbXR1ID0gYmUxNl90b19jcHUoZ2VuX2NvbnRleHQtPm10dSk7CisJCQltdHUgPSBtaW5fdChpbnQsIG10dSwgZGV2LT5jYXBzLmV0aF9tdHVfY2FwW3BvcnRdKTsKKwkJCXByZXZfbXR1ID0gc2xhdmVfc3QtPm10dVtwb3J0XTsKKwkJCXNsYXZlX3N0LT5tdHVbcG9ydF0gPSBtdHU7CisJCQlpZiAobXR1ID4gbWFzdGVyLT5tYXhfbXR1W3BvcnRdKQorCQkJCW1hc3Rlci0+bWF4X210dVtwb3J0XSA9IG10dTsKKwkJCWlmIChtdHUgPCBwcmV2X210dSAmJiBwcmV2X210dSA9PQorCQkJCQkJbWFzdGVyLT5tYXhfbXR1W3BvcnRdKSB7CisJCQkJc2xhdmVfc3QtPm10dVtwb3J0XSA9IG10dTsKKwkJCQltYXN0ZXItPm1heF9tdHVbcG9ydF0gPSBtdHU7CisJCQkJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3NsYXZlczsgaSsrKSB7CisJCQkJCW1hc3Rlci0+bWF4X210dVtwb3J0XSA9CisJCQkJCW1heChtYXN0ZXItPm1heF9tdHVbcG9ydF0sCisJCQkJCSAgICBtYXN0ZXItPnNsYXZlX3N0YXRlW2ldLm10dVtwb3J0XSk7CisJCQkJfQorCQkJfQorCisJCQlnZW5fY29udGV4dC0+bXR1ID0gY3B1X3RvX2JlMTYobWFzdGVyLT5tYXhfbXR1W3BvcnRdKTsKKwkJCWJyZWFrOworCQl9CisJCXJldHVybiBtbHg0X2NtZChkZXYsIGluYm94LT5kbWEsIGluX21vZCwgb3BfbW9kLAorCQkJCU1MWDRfQ01EX1NFVF9QT1JULCBNTFg0X0NNRF9USU1FX0NMQVNTX0IsCisJCQkJTUxYNF9DTURfTkFUSVZFKTsKKwl9CisKKwkvKiBGb3IgSUIsIHdlIG9ubHkgY29uc2lkZXI6CisJICogLSBUaGUgY2FwYWJpbGl0eSBtYXNrLCB3aGljaCBpcyBzZXQgdG8gdGhlIGFnZ3JlZ2F0ZSBvZiBhbGwKKwkgKiAgIHNsYXZlIGZ1bmN0aW9uIGNhcGFiaWxpdGllcworCSAqIC0gVGhlIFFLZXkgdmlvbGF0aW4gY291bnRlciAtIHJlc2V0IGFjY29yZGluZyB0byBlYWNoIHJlcXVlc3QuCisJICovCisKKwlpZiAoZGV2LT5mbGFncyAmIE1MWDRfRkxBR19PTERfUE9SVF9DTURTKSB7CisJCXJlc2V0X3FrZXlfdmlvbHMgPSAoKih1OCAqKSBpbmJveC0+YnVmKSAmIDB4NDA7CisJCW5ld19jYXBfbWFzayA9ICgoX19iZTMyICopIGluYm94LT5idWYpWzJdOworCX0gZWxzZSB7CisJCXJlc2V0X3FrZXlfdmlvbHMgPSAoKHU4ICopIGluYm94LT5idWYpWzNdICYgMHgxOworCQluZXdfY2FwX21hc2sgPSAoKF9fYmUzMiAqKSBpbmJveC0+YnVmKVsxXTsKKwl9CisKKwlhZ2dfY2FwX21hc2sgPSAwOworCXNsYXZlX2NhcF9tYXNrID0KKwkJcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlW3NsYXZlXS5pYl9jYXBfbWFza1twb3J0XTsKKwlwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbc2xhdmVdLmliX2NhcF9tYXNrW3BvcnRdID0gbmV3X2NhcF9tYXNrOworCWZvciAoaSA9IDA7IGkgPCBkZXYtPm51bV9zbGF2ZXM7IGkrKykKKwkJYWdnX2NhcF9tYXNrIHw9CisJCQlwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbaV0uaWJfY2FwX21hc2tbcG9ydF07CisKKwkvKiBvbmx5IGNsZWFyIG1haWxib3ggZm9yIGd1ZXN0cy4gIE1hc3RlciBtYXkgYmUgc2V0dGluZworCSogTVRVIG9yIFBLRVkgdGFibGUgc2l6ZQorCSovCisJaWYgKHNsYXZlICE9IGRldi0+Y2Fwcy5mdW5jdGlvbikKKwkJbWVtc2V0KGluYm94LT5idWYsIDAsIDI1Nik7CisJaWYgKGRldi0+ZmxhZ3MgJiBNTFg0X0ZMQUdfT0xEX1BPUlRfQ01EUykgeworCQkqKHU4ICopIGluYm94LT5idWYJICAgPSAhIXJlc2V0X3FrZXlfdmlvbHMgPDwgNjsKKwkJKChfX2JlMzIgKikgaW5ib3gtPmJ1ZilbMl0gPSBhZ2dfY2FwX21hc2s7CisJfSBlbHNlIHsKKwkJKCh1OCAqKSBpbmJveC0+YnVmKVszXSAgICAgPSAhIXJlc2V0X3FrZXlfdmlvbHM7CisJCSgoX19iZTMyICopIGluYm94LT5idWYpWzFdID0gYWdnX2NhcF9tYXNrOworCX0KKworCWVyciA9IG1seDRfY21kKGRldiwgaW5ib3gtPmRtYSwgcG9ydCwgaXNfZXRoLCBNTFg0X0NNRF9TRVRfUE9SVCwKKwkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgTUxYNF9DTURfTkFUSVZFKTsKKwlpZiAoZXJyKQorCQlwcml2LT5tZnVuYy5tYXN0ZXIuc2xhdmVfc3RhdGVbc2xhdmVdLmliX2NhcF9tYXNrW3BvcnRdID0KKwkJCXNsYXZlX2NhcF9tYXNrOworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X1NFVF9QT1JUX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCXJldHVybiBtbHg0X2NvbW1vbl9zZXRfcG9ydChkZXYsIHNsYXZlLCB2aGNyLT5pbl9tb2RpZmllciwKKwkJCQkgICAgdmhjci0+b3BfbW9kaWZpZXIsIGluYm94KTsKK30KKwogaW50IG1seDRfU0VUX1BPUlQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQpCiB7CiAJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CkBAIC01MjgsOCArNzc3LDEyNyBAQAogCiAJKChfX2JlMzIgKikgbWFpbGJveC0+YnVmKVsxXSA9IGRldi0+Y2Fwcy5pYl9wb3J0X2RlZl9jYXBbcG9ydF07CiAJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIHBvcnQsIDAsIE1MWDRfQ01EX1NFVF9QT1JULAotCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19CKTsKKwkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgTUxYNF9DTURfV1JBUFBFRCk7CiAKIAltbHg0X2ZyZWVfY21kX21haWxib3goZGV2LCBtYWlsYm94KTsKIAlyZXR1cm4gZXJyOwogfQorCitpbnQgbWx4NF9TRVRfUE9SVF9nZW5lcmFsKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCBpbnQgbXR1LAorCQkJICB1OCBwcHR4LCB1OCBwZmN0eCwgdTggcHByeCwgdTggcGZjcngpCit7CisJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CisJc3RydWN0IG1seDRfc2V0X3BvcnRfZ2VuZXJhbF9jb250ZXh0ICpjb250ZXh0OworCWludCBlcnI7CisJdTMyIGluX21vZDsKKworCW1haWxib3ggPSBtbHg0X2FsbG9jX2NtZF9tYWlsYm94KGRldik7CisJaWYgKElTX0VSUihtYWlsYm94KSkKKwkJcmV0dXJuIFBUUl9FUlIobWFpbGJveCk7CisJY29udGV4dCA9IG1haWxib3gtPmJ1ZjsKKwltZW1zZXQoY29udGV4dCwgMCwgc2l6ZW9mICpjb250ZXh0KTsKKworCWNvbnRleHQtPmZsYWdzID0gU0VUX1BPUlRfR0VOX0FMTF9WQUxJRDsKKwljb250ZXh0LT5tdHUgPSBjcHVfdG9fYmUxNihtdHUpOworCWNvbnRleHQtPnBwdHggPSAocHB0eCAqICghcGZjdHgpKSA8PCA3OworCWNvbnRleHQtPnBmY3R4ID0gcGZjdHg7CisJY29udGV4dC0+cHByeCA9IChwcHJ4ICogKCFwZmNyeCkpIDw8IDc7CisJY29udGV4dC0+cGZjcnggPSBwZmNyeDsKKworCWluX21vZCA9IE1MWDRfU0VUX1BPUlRfR0VORVJBTCA8PCA4IHwgcG9ydDsKKwllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgaW5fbW9kLCAxLCBNTFg0X0NNRF9TRVRfUE9SVCwKKwkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwgIE1MWDRfQ01EX1dSQVBQRUQpOworCisJbWx4NF9mcmVlX2NtZF9tYWlsYm94KGRldiwgbWFpbGJveCk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wobWx4NF9TRVRfUE9SVF9nZW5lcmFsKTsKKworaW50IG1seDRfU0VUX1BPUlRfcXBuX2NhbGMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHUzMiBiYXNlX3FwbiwKKwkJCSAgIHU4IHByb21pc2MpCit7CisJc3RydWN0IG1seDRfY21kX21haWxib3ggKm1haWxib3g7CisJc3RydWN0IG1seDRfc2V0X3BvcnRfcnFwX2NhbGNfY29udGV4dCAqY29udGV4dDsKKwlpbnQgZXJyOworCXUzMiBpbl9tb2Q7CisJdTMyIG1fcHJvbWlzYyA9IChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19WRVBfTUNfU1RFRVIpID8KKwkJTUNBU1RfRElSRUNUIDogTUNBU1RfREVGQVVMVDsKKworCWlmIChkZXYtPmNhcHMuZmxhZ3MgJiBNTFg0X0RFVl9DQVBfRkxBR19WRVBfTUNfU1RFRVIgICYmCisJICAgIGRldi0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX1ZFUF9VQ19TVEVFUikKKwkJcmV0dXJuIDA7CisKKwltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOworCWlmIChJU19FUlIobWFpbGJveCkpCisJCXJldHVybiBQVFJfRVJSKG1haWxib3gpOworCWNvbnRleHQgPSBtYWlsYm94LT5idWY7CisJbWVtc2V0KGNvbnRleHQsIDAsIHNpemVvZiAqY29udGV4dCk7CisKKwljb250ZXh0LT5iYXNlX3FwbiA9IGNwdV90b19iZTMyKGJhc2VfcXBuKTsKKwljb250ZXh0LT5uX21hYyA9IGRldi0+Y2Fwcy5sb2dfbnVtX21hY3M7CisJY29udGV4dC0+cHJvbWlzYyA9IGNwdV90b19iZTMyKHByb21pc2MgPDwgU0VUX1BPUlRfUFJPTUlTQ19TSElGVCB8CisJCQkJICAgICAgIGJhc2VfcXBuKTsKKwljb250ZXh0LT5tY2FzdCA9IGNwdV90b19iZTMyKG1fcHJvbWlzYyA8PCBTRVRfUE9SVF9NQ19QUk9NSVNDX1NISUZUIHwKKwkJCQkgICAgIGJhc2VfcXBuKTsKKwljb250ZXh0LT5pbnRyYV9ub192bGFuID0gMDsKKwljb250ZXh0LT5ub192bGFuID0gTUxYNF9OT19WTEFOX0lEWDsKKwljb250ZXh0LT5pbnRyYV92bGFuX21pc3MgPSAwOworCWNvbnRleHQtPnZsYW5fbWlzcyA9IE1MWDRfVkxBTl9NSVNTX0lEWDsKKworCWluX21vZCA9IE1MWDRfU0VUX1BPUlRfUlFQX0NBTEMgPDwgOCB8IHBvcnQ7CisJZXJyID0gbWx4NF9jbWQoZGV2LCBtYWlsYm94LT5kbWEsIGluX21vZCwgMSwgTUxYNF9DTURfU0VUX1BPUlQsCisJCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0IsICBNTFg0X0NNRF9XUkFQUEVEKTsKKworCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKG1seDRfU0VUX1BPUlRfcXBuX2NhbGMpOworCitpbnQgbWx4NF9TRVRfTUNBU1RfRkxUUl93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkJc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCQlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkJc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCQlzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCWludCBlcnIgPSAwOworCisJcmV0dXJuIGVycjsKK30KKworaW50IG1seDRfU0VUX01DQVNUX0ZMVFIoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsCisJCQl1NjQgbWFjLCB1NjQgY2xlYXIsIHU4IG1vZGUpCit7CisJcmV0dXJuIG1seDRfY21kKGRldiwgKG1hYyB8IChjbGVhciA8PCA2MykpLCBwb3J0LCBtb2RlLAorCQkJTUxYNF9DTURfU0VUX01DQVNUX0ZMVFIsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQiwKKwkJCU1MWDRfQ01EX1dSQVBQRUQpOworfQorRVhQT1JUX1NZTUJPTChtbHg0X1NFVF9NQ0FTVF9GTFRSKTsKKworaW50IG1seDRfU0VUX1ZMQU5fRkxUUl93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICAgICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgICAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICAgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgICAgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCWludCBlcnIgPSAwOworCisJcmV0dXJuIGVycjsKK30KKworaW50IG1seDRfY29tbW9uX2R1bXBfZXRoX3N0YXRzKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICAgICAgdTMyIGluX21vZCwgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCkKK3sKKwlyZXR1cm4gbWx4NF9jbWRfYm94KGRldiwgMCwgb3V0Ym94LT5kbWEsIGluX21vZCwgMCwKKwkJCSAgICBNTFg0X0NNRF9EVU1QX0VUSF9TVEFUUywgTUxYNF9DTURfVElNRV9DTEFTU19CLAorCQkJICAgIE1MWDRfQ01EX05BVElWRSk7Cit9CisKK2ludCBtbHg0X0RVTVBfRVRIX1NUQVRTX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCQlzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCQlzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJCXN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJcmV0dXJuIG1seDRfY29tbW9uX2R1bXBfZXRoX3N0YXRzKGRldiwgc2xhdmUsCisJCQkJCSAgdmhjci0+aW5fbW9kaWZpZXIsIG91dGJveCk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Byb2ZpbGUuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcHJvZmlsZS5jCmluZGV4IGI5Njc2NDcuLjY2ZjkxY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcHJvZmlsZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcHJvZmlsZS5jCkBAIC05OCw4ICs5OCw4IEBACiAJcHJvZmlsZVtNTFg0X1JFU19FUV0uc2l6ZSAgICAgPSBkZXZfY2FwLT5lcWNfZW50cnlfc3o7CiAJcHJvZmlsZVtNTFg0X1JFU19ETVBUXS5zaXplICAgPSBkZXZfY2FwLT5kbXB0X2VudHJ5X3N6OwogCXByb2ZpbGVbTUxYNF9SRVNfQ01QVF0uc2l6ZSAgID0gZGV2X2NhcC0+Y21wdF9lbnRyeV9zejsKLQlwcm9maWxlW01MWDRfUkVTX01UVF0uc2l6ZSAgICA9IGRldi0+Y2Fwcy5tdHRzX3Blcl9zZWcgKiBkZXZfY2FwLT5tdHRfZW50cnlfc3o7Ci0JcHJvZmlsZVtNTFg0X1JFU19NQ0ddLnNpemUgICAgPSBNTFg0X01HTV9FTlRSWV9TSVpFOworCXByb2ZpbGVbTUxYNF9SRVNfTVRUXS5zaXplICAgID0gZGV2X2NhcC0+bXR0X2VudHJ5X3N6OworCXByb2ZpbGVbTUxYNF9SRVNfTUNHXS5zaXplICAgID0gbWx4NF9nZXRfbWdtX2VudHJ5X3NpemUoZGV2KTsKIAogCXByb2ZpbGVbTUxYNF9SRVNfUVBdLm51bSAgICAgID0gcmVxdWVzdC0+bnVtX3FwOwogCXByb2ZpbGVbTUxYNF9SRVNfUkRNQVJDXS5udW0gID0gcmVxdWVzdC0+bnVtX3FwICogcmVxdWVzdC0+cmRtYXJjX3Blcl9xcDsKQEAgLTIxMCw3ICsyMTAsNyBAQAogCQkJaW5pdF9oY2EtPmNtcHRfYmFzZQkgPSBwcm9maWxlW2ldLnN0YXJ0OwogCQkJYnJlYWs7CiAJCWNhc2UgTUxYNF9SRVNfTVRUOgotCQkJZGV2LT5jYXBzLm51bV9tdHRfc2VncwkgPSBwcm9maWxlW2ldLm51bTsKKwkJCWRldi0+Y2Fwcy5udW1fbXR0cwkgPSBwcm9maWxlW2ldLm51bTsKIAkJCXByaXYtPm1yX3RhYmxlLm10dF9iYXNlCSA9IHByb2ZpbGVbaV0uc3RhcnQ7CiAJCQlpbml0X2hjYS0+bXR0X2Jhc2UJID0gcHJvZmlsZVtpXS5zdGFydDsKIAkJCWJyZWFrOwpAQCAtMjE4LDcgKzIxOCw4IEBACiAJCQlkZXYtPmNhcHMubnVtX21nbXMJICA9IHByb2ZpbGVbaV0ubnVtID4+IDE7CiAJCQlkZXYtPmNhcHMubnVtX2FtZ21zCSAgPSBwcm9maWxlW2ldLm51bSA+PiAxOwogCQkJaW5pdF9oY2EtPm1jX2Jhc2UJICA9IHByb2ZpbGVbaV0uc3RhcnQ7Ci0JCQlpbml0X2hjYS0+bG9nX21jX2VudHJ5X3N6ID0gaWxvZzIoTUxYNF9NR01fRU5UUllfU0laRSk7CisJCQlpbml0X2hjYS0+bG9nX21jX2VudHJ5X3N6ID0KKwkJCQkJaWxvZzIobWx4NF9nZXRfbWdtX2VudHJ5X3NpemUoZGV2KSk7CiAJCQlpbml0X2hjYS0+bG9nX21jX3RhYmxlX3N6ID0gcHJvZmlsZVtpXS5sb2dfbnVtOwogCQkJaW5pdF9oY2EtPmxvZ19tY19oYXNoX3N6ICA9IHByb2ZpbGVbaV0ubG9nX251bSAtIDE7CiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcXAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvcXAuYwppbmRleCAxNWY4NzBjLi42YjAzYWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3FwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9xcC5jCkBAIC0zNSw2ICszNSw4IEBACiAKICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKICNpbmNsdWRlIDxsaW51eC9tbHg0L2NtZC5oPgogI2luY2x1ZGUgPGxpbnV4L21seDQvcXAuaD4KIApAQCAtNTUsNyArNTcsNyBAQAogCXNwaW5fdW5sb2NrKCZxcF90YWJsZS0+bG9jayk7CiAKIAlpZiAoIXFwKSB7Ci0JCW1seDRfd2FybihkZXYsICJBc3luYyBldmVudCBmb3IgYm9ndXMgUVAgJTA4eFxuIiwgcXBuKTsKKwkJbWx4NF9kYmcoZGV2LCAiQXN5bmMgZXZlbnQgZm9yIG5vbmUgZXhpc3RlbnQgUVAgJTA4eFxuIiwgcXBuKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNjUsMTAgKzY3LDE3IEBACiAJCWNvbXBsZXRlKCZxcC0+ZnJlZSk7CiB9CiAKLWludCBtbHg0X3FwX21vZGlmeShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfbXR0ICptdHQsCi0JCSAgIGVudW0gbWx4NF9xcF9zdGF0ZSBjdXJfc3RhdGUsIGVudW0gbWx4NF9xcF9zdGF0ZSBuZXdfc3RhdGUsCi0JCSAgIHN0cnVjdCBtbHg0X3FwX2NvbnRleHQgKmNvbnRleHQsIGVudW0gbWx4NF9xcF9vcHRwYXIgb3B0cGFyLAotCQkgICBpbnQgc3FkX2V2ZW50LCBzdHJ1Y3QgbWx4NF9xcCAqcXApCitzdGF0aWMgaW50IGlzX3FwMChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfcXAgKnFwKQoreworCXJldHVybiBxcC0+cXBuID49IGRldi0+Y2Fwcy5zcXBfc3RhcnQgJiYKKwkJcXAtPnFwbiA8PSBkZXYtPmNhcHMuc3FwX3N0YXJ0ICsgMTsKK30KKworc3RhdGljIGludCBfX21seDRfcXBfbW9kaWZ5KHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9tdHQgKm10dCwKKwkJICAgICBlbnVtIG1seDRfcXBfc3RhdGUgY3VyX3N0YXRlLCBlbnVtIG1seDRfcXBfc3RhdGUgbmV3X3N0YXRlLAorCQkgICAgIHN0cnVjdCBtbHg0X3FwX2NvbnRleHQgKmNvbnRleHQsCisJCSAgICAgZW51bSBtbHg0X3FwX29wdHBhciBvcHRwYXIsCisJCSAgICAgaW50IHNxZF9ldmVudCwgc3RydWN0IG1seDRfcXAgKnFwLCBpbnQgbmF0aXZlKQogewogCXN0YXRpYyBjb25zdCB1MTYgb3BbTUxYNF9RUF9OVU1fU1RBVEVdW01MWDRfUVBfTlVNX1NUQVRFXSA9IHsKIAkJW01MWDRfUVBfU1RBVEVfUlNUXSA9IHsKQEAgLTExMCwxNiArMTE5LDI2IEBACiAJCX0KIAl9OwogCisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwogCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OwogCWludCByZXQgPSAwOworCXU4IHBvcnQ7CiAKIAlpZiAoY3VyX3N0YXRlID49IE1MWDRfUVBfTlVNX1NUQVRFIHx8IG5ld19zdGF0ZSA+PSBNTFg0X1FQX05VTV9TVEFURSB8fAogCSAgICAhb3BbY3VyX3N0YXRlXVtuZXdfc3RhdGVdKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChvcFtjdXJfc3RhdGVdW25ld19zdGF0ZV0gPT0gTUxYNF9DTURfMlJTVF9RUCkKLQkJcmV0dXJuIG1seDRfY21kKGRldiwgMCwgcXAtPnFwbiwgMiwKLQkJCQlNTFg0X0NNRF8yUlNUX1FQLCBNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCWlmIChvcFtjdXJfc3RhdGVdW25ld19zdGF0ZV0gPT0gTUxYNF9DTURfMlJTVF9RUCkgeworCQlyZXQgPSBtbHg0X2NtZChkZXYsIDAsIHFwLT5xcG4sIDIsCisJCQlNTFg0X0NNRF8yUlNUX1FQLCBNTFg0X0NNRF9USU1FX0NMQVNTX0EsIG5hdGl2ZSk7CisJCWlmIChtbHg0X2lzX21hc3RlcihkZXYpICYmIGN1cl9zdGF0ZSAhPSBNTFg0X1FQX1NUQVRFX0VSUiAmJgorCQkgICAgY3VyX3N0YXRlICE9IE1MWDRfUVBfU1RBVEVfUlNUICYmCisJCSAgICBpc19xcDAoZGV2LCBxcCkpIHsKKwkJCXBvcnQgPSAocXAtPnFwbiAmIDEpICsgMTsKKwkJCXByaXYtPm1mdW5jLm1hc3Rlci5xcDBfc3RhdGVbcG9ydF0ucXAwX2FjdGl2ZSA9IDA7CisJCX0KKwkJcmV0dXJuIHJldDsKKwl9CiAKIAltYWlsYm94ID0gbWx4NF9hbGxvY19jbWRfbWFpbGJveChkZXYpOwogCWlmIChJU19FUlIobWFpbGJveCkpCkBAIC0xMzIsNDcgKzE1MSwxODYgQEAKIAkJY29udGV4dC0+bG9nX3BhZ2Vfc2l6ZSAgID0gbXR0LT5wYWdlX3NoaWZ0IC0gTUxYNF9JQ01fUEFHRV9TSElGVDsKIAl9CiAKKwlwb3J0ID0gKChjb250ZXh0LT5wcmlfcGF0aC5zY2hlZF9xdWV1ZSA+PiA2KSAmIDEpICsgMTsKKwlpZiAoZGV2LT5jYXBzLnBvcnRfdHlwZVtwb3J0XSA9PSBNTFg0X1BPUlRfVFlQRV9FVEgpCisJCWNvbnRleHQtPnByaV9wYXRoLnNjaGVkX3F1ZXVlID0gKGNvbnRleHQtPnByaV9wYXRoLnNjaGVkX3F1ZXVlICYKKwkJCQkJCTB4YzMpOworCiAJKihfX2JlMzIgKikgbWFpbGJveC0+YnVmID0gY3B1X3RvX2JlMzIob3B0cGFyKTsKIAltZW1jcHkobWFpbGJveC0+YnVmICsgOCwgY29udGV4dCwgc2l6ZW9mICpjb250ZXh0KTsKIAogCSgoc3RydWN0IG1seDRfcXBfY29udGV4dCAqKSAobWFpbGJveC0+YnVmICsgOCkpLT5sb2NhbF9xcG4gPQogCQljcHVfdG9fYmUzMihxcC0+cXBuKTsKIAotCXJldCA9IG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBxcC0+cXBuIHwgKCEhc3FkX2V2ZW50IDw8IDMxKSwKKwlyZXQgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSB8IGRldi0+Y2Fwcy5mdW5jdGlvbiwKKwkJICAgICAgIHFwLT5xcG4gfCAoISFzcWRfZXZlbnQgPDwgMzEpLAogCQkgICAgICAgbmV3X3N0YXRlID09IE1MWDRfUVBfU1RBVEVfUlNUID8gMiA6IDAsCi0JCSAgICAgICBvcFtjdXJfc3RhdGVdW25ld19zdGF0ZV0sIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQyk7CisJCSAgICAgICBvcFtjdXJfc3RhdGVdW25ld19zdGF0ZV0sIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQywgbmF0aXZlKTsKIAogCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOwogCXJldHVybiByZXQ7CiB9CisKK2ludCBtbHg0X3FwX21vZGlmeShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfbXR0ICptdHQsCisJCSAgIGVudW0gbWx4NF9xcF9zdGF0ZSBjdXJfc3RhdGUsIGVudW0gbWx4NF9xcF9zdGF0ZSBuZXdfc3RhdGUsCisJCSAgIHN0cnVjdCBtbHg0X3FwX2NvbnRleHQgKmNvbnRleHQsCisJCSAgIGVudW0gbWx4NF9xcF9vcHRwYXIgb3B0cGFyLAorCQkgICBpbnQgc3FkX2V2ZW50LCBzdHJ1Y3QgbWx4NF9xcCAqcXApCit7CisJcmV0dXJuIF9fbWx4NF9xcF9tb2RpZnkoZGV2LCBtdHQsIGN1cl9zdGF0ZSwgbmV3X3N0YXRlLCBjb250ZXh0LAorCQkJCW9wdHBhciwgc3FkX2V2ZW50LCBxcCwgMCk7Cit9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X3FwX21vZGlmeSk7CiAKK2ludCBfX21seDRfcXBfcmVzZXJ2ZV9yYW5nZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IGNudCwgaW50IGFsaWduLAorCQkJCSAgIGludCAqYmFzZSkKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfcXBfdGFibGUgKnFwX3RhYmxlID0gJnByaXYtPnFwX3RhYmxlOworCisJKmJhc2UgPSBtbHg0X2JpdG1hcF9hbGxvY19yYW5nZSgmcXBfdGFibGUtPmJpdG1hcCwgY250LCBhbGlnbik7CisJaWYgKCpiYXNlID09IC0xKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCiBpbnQgbWx4NF9xcF9yZXNlcnZlX3JhbmdlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgY250LCBpbnQgYWxpZ24sIGludCAqYmFzZSkKIHsKLQlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7Ci0Jc3RydWN0IG1seDRfcXBfdGFibGUgKnFwX3RhYmxlID0gJnByaXYtPnFwX3RhYmxlOwotCWludCBxcG47CisJdTY0IGluX3BhcmFtOworCXU2NCBvdXRfcGFyYW07CisJaW50IGVycjsKIAotCXFwbiA9IG1seDRfYml0bWFwX2FsbG9jX3JhbmdlKCZxcF90YWJsZS0+Yml0bWFwLCBjbnQsIGFsaWduKTsKLQlpZiAocXBuID09IC0xKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAobWx4NF9pc19tZnVuYyhkZXYpKSB7CisJCXNldF9wYXJhbV9sKCZpbl9wYXJhbSwgY250KTsKKwkJc2V0X3BhcmFtX2goJmluX3BhcmFtLCBhbGlnbik7CisJCWVyciA9IG1seDRfY21kX2ltbShkZXYsIGluX3BhcmFtLCAmb3V0X3BhcmFtLAorCQkJCSAgIFJFU19RUCwgUkVTX09QX1JFU0VSVkUsCisJCQkJICAgTUxYNF9DTURfQUxMT0NfUkVTLAorCQkJCSAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwgTUxYNF9DTURfV1JBUFBFRCk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOwogCi0JKmJhc2UgPSBxcG47Ci0JcmV0dXJuIDA7CisJCSpiYXNlID0gZ2V0X3BhcmFtX2woJm91dF9wYXJhbSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gX19tbHg0X3FwX3Jlc2VydmVfcmFuZ2UoZGV2LCBjbnQsIGFsaWduLCBiYXNlKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfcXBfcmVzZXJ2ZV9yYW5nZSk7CiAKLXZvaWQgbWx4NF9xcF9yZWxlYXNlX3JhbmdlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgYmFzZV9xcG4sIGludCBjbnQpCit2b2lkIF9fbWx4NF9xcF9yZWxlYXNlX3JhbmdlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgYmFzZV9xcG4sIGludCBjbnQpCiB7CiAJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOwogCXN0cnVjdCBtbHg0X3FwX3RhYmxlICpxcF90YWJsZSA9ICZwcml2LT5xcF90YWJsZTsKLQlpZiAoYmFzZV9xcG4gPCBkZXYtPmNhcHMuc3FwX3N0YXJ0ICsgOCkKLQkJcmV0dXJuOwogCisJaWYgKG1seDRfaXNfcXBfcmVzZXJ2ZWQoZGV2LCAodTMyKSBiYXNlX3FwbikpCisJCXJldHVybjsKIAltbHg0X2JpdG1hcF9mcmVlX3JhbmdlKCZxcF90YWJsZS0+Yml0bWFwLCBiYXNlX3FwbiwgY250KTsKIH0KKwordm9pZCBtbHg0X3FwX3JlbGVhc2VfcmFuZ2Uoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBiYXNlX3FwbiwgaW50IGNudCkKK3sKKwl1NjQgaW5fcGFyYW07CisJaW50IGVycjsKKworCWlmIChtbHg0X2lzX21mdW5jKGRldikpIHsKKwkJc2V0X3BhcmFtX2woJmluX3BhcmFtLCBiYXNlX3Fwbik7CisJCXNldF9wYXJhbV9oKCZpbl9wYXJhbSwgY250KTsKKwkJZXJyID0gbWx4NF9jbWQoZGV2LCBpbl9wYXJhbSwgUkVTX1FQLCBSRVNfT1BfUkVTRVJWRSwKKwkJCSAgICAgICBNTFg0X0NNRF9GUkVFX1JFUywKKwkJCSAgICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EsIE1MWDRfQ01EX1dSQVBQRUQpOworCQlpZiAoZXJyKSB7CisJCQltbHg0X3dhcm4oZGV2LCAiRmFpbGVkIHRvIHJlbGVhc2UgcXAgcmFuZ2UiCisJCQkJICAiIGJhc2U6JWQgY250OiVkXG4iLCBiYXNlX3FwbiwgY250KTsKKwkJfQorCX0gZWxzZQorCQkgX19tbHg0X3FwX3JlbGVhc2VfcmFuZ2UoZGV2LCBiYXNlX3FwbiwgY250KTsKK30KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfcXBfcmVsZWFzZV9yYW5nZSk7CiAKK2ludCBfX21seDRfcXBfYWxsb2NfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcXBuKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9xcF90YWJsZSAqcXBfdGFibGUgPSAmcHJpdi0+cXBfdGFibGU7CisJaW50IGVycjsKKworCWVyciA9IG1seDRfdGFibGVfZ2V0KGRldiwgJnFwX3RhYmxlLT5xcF90YWJsZSwgcXBuKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ7CisKKwllcnIgPSBtbHg0X3RhYmxlX2dldChkZXYsICZxcF90YWJsZS0+YXV4Y190YWJsZSwgcXBuKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9wdXRfcXA7CisKKwllcnIgPSBtbHg0X3RhYmxlX2dldChkZXYsICZxcF90YWJsZS0+YWx0Y190YWJsZSwgcXBuKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9wdXRfYXV4YzsKKworCWVyciA9IG1seDRfdGFibGVfZ2V0KGRldiwgJnFwX3RhYmxlLT5yZG1hcmNfdGFibGUsIHFwbik7CisJaWYgKGVycikKKwkJZ290byBlcnJfcHV0X2FsdGM7CisKKwllcnIgPSBtbHg0X3RhYmxlX2dldChkZXYsICZxcF90YWJsZS0+Y21wdF90YWJsZSwgcXBuKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9wdXRfcmRtYXJjOworCisJcmV0dXJuIDA7CisKK2Vycl9wdXRfcmRtYXJjOgorCW1seDRfdGFibGVfcHV0KGRldiwgJnFwX3RhYmxlLT5yZG1hcmNfdGFibGUsIHFwbik7CisKK2Vycl9wdXRfYWx0YzoKKwltbHg0X3RhYmxlX3B1dChkZXYsICZxcF90YWJsZS0+YWx0Y190YWJsZSwgcXBuKTsKKworZXJyX3B1dF9hdXhjOgorCW1seDRfdGFibGVfcHV0KGRldiwgJnFwX3RhYmxlLT5hdXhjX3RhYmxlLCBxcG4pOworCitlcnJfcHV0X3FwOgorCW1seDRfdGFibGVfcHV0KGRldiwgJnFwX3RhYmxlLT5xcF90YWJsZSwgcXBuKTsKKworZXJyX291dDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1seDRfcXBfYWxsb2NfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcXBuKQoreworCXU2NCBwYXJhbTsKKworCWlmIChtbHg0X2lzX21mdW5jKGRldikpIHsKKwkJc2V0X3BhcmFtX2woJnBhcmFtLCBxcG4pOworCQlyZXR1cm4gbWx4NF9jbWRfaW1tKGRldiwgcGFyYW0sICZwYXJhbSwgUkVTX1FQLCBSRVNfT1BfTUFQX0lDTSwKKwkJCQkgICAgTUxYNF9DTURfQUxMT0NfUkVTLCBNTFg0X0NNRF9USU1FX0NMQVNTX0EsCisJCQkJICAgIE1MWDRfQ01EX1dSQVBQRUQpOworCX0KKwlyZXR1cm4gX19tbHg0X3FwX2FsbG9jX2ljbShkZXYsIHFwbik7Cit9CisKK3ZvaWQgX19tbHg0X3FwX2ZyZWVfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgcXBuKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9xcF90YWJsZSAqcXBfdGFibGUgPSAmcHJpdi0+cXBfdGFibGU7CisKKwltbHg0X3RhYmxlX3B1dChkZXYsICZxcF90YWJsZS0+Y21wdF90YWJsZSwgcXBuKTsKKwltbHg0X3RhYmxlX3B1dChkZXYsICZxcF90YWJsZS0+cmRtYXJjX3RhYmxlLCBxcG4pOworCW1seDRfdGFibGVfcHV0KGRldiwgJnFwX3RhYmxlLT5hbHRjX3RhYmxlLCBxcG4pOworCW1seDRfdGFibGVfcHV0KGRldiwgJnFwX3RhYmxlLT5hdXhjX3RhYmxlLCBxcG4pOworCW1seDRfdGFibGVfcHV0KGRldiwgJnFwX3RhYmxlLT5xcF90YWJsZSwgcXBuKTsKK30KKworc3RhdGljIHZvaWQgbWx4NF9xcF9mcmVlX2ljbShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHFwbikKK3sKKwl1NjQgaW5fcGFyYW07CisKKwlpZiAobWx4NF9pc19tZnVuYyhkZXYpKSB7CisJCXNldF9wYXJhbV9sKCZpbl9wYXJhbSwgcXBuKTsKKwkJaWYgKG1seDRfY21kKGRldiwgaW5fcGFyYW0sIFJFU19RUCwgUkVTX09QX01BUF9JQ00sCisJCQkgICAgIE1MWDRfQ01EX0ZSRUVfUkVTLCBNTFg0X0NNRF9USU1FX0NMQVNTX0EsCisJCQkgICAgIE1MWDRfQ01EX1dSQVBQRUQpKQorCQkJbWx4NF93YXJuKGRldiwgIkZhaWxlZCB0byBmcmVlIGljbSBvZiBxcDolZFxuIiwgcXBuKTsKKwl9IGVsc2UKKwkJX19tbHg0X3FwX2ZyZWVfaWNtKGRldiwgcXBuKTsKK30KKwogaW50IG1seDRfcXBfYWxsb2Moc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBxcG4sIHN0cnVjdCBtbHg0X3FwICpxcCkKIHsKIAlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CkBAIC0xODQsNTUgKzM0MiwyNyBAQAogCiAJcXAtPnFwbiA9IHFwbjsKIAotCWVyciA9IG1seDRfdGFibGVfZ2V0KGRldiwgJnFwX3RhYmxlLT5xcF90YWJsZSwgcXAtPnFwbik7CisJZXJyID0gbWx4NF9xcF9hbGxvY19pY20oZGV2LCBxcG4pOwogCWlmIChlcnIpCi0JCWdvdG8gZXJyX291dDsKLQotCWVyciA9IG1seDRfdGFibGVfZ2V0KGRldiwgJnFwX3RhYmxlLT5hdXhjX3RhYmxlLCBxcC0+cXBuKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9wdXRfcXA7Ci0KLQllcnIgPSBtbHg0X3RhYmxlX2dldChkZXYsICZxcF90YWJsZS0+YWx0Y190YWJsZSwgcXAtPnFwbik7Ci0JaWYgKGVycikKLQkJZ290byBlcnJfcHV0X2F1eGM7Ci0KLQllcnIgPSBtbHg0X3RhYmxlX2dldChkZXYsICZxcF90YWJsZS0+cmRtYXJjX3RhYmxlLCBxcC0+cXBuKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9wdXRfYWx0YzsKLQotCWVyciA9IG1seDRfdGFibGVfZ2V0KGRldiwgJnFwX3RhYmxlLT5jbXB0X3RhYmxlLCBxcC0+cXBuKTsKLQlpZiAoZXJyKQotCQlnb3RvIGVycl9wdXRfcmRtYXJjOworCQlyZXR1cm4gZXJyOwogCiAJc3Bpbl9sb2NrX2lycSgmcXBfdGFibGUtPmxvY2spOwotCWVyciA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZkZXYtPnFwX3RhYmxlX3RyZWUsIHFwLT5xcG4gJiAoZGV2LT5jYXBzLm51bV9xcHMgLSAxKSwgcXApOworCWVyciA9IHJhZGl4X3RyZWVfaW5zZXJ0KCZkZXYtPnFwX3RhYmxlX3RyZWUsIHFwLT5xcG4gJgorCQkJCShkZXYtPmNhcHMubnVtX3FwcyAtIDEpLCBxcCk7CiAJc3Bpbl91bmxvY2tfaXJxKCZxcF90YWJsZS0+bG9jayk7CiAJaWYgKGVycikKLQkJZ290byBlcnJfcHV0X2NtcHQ7CisJCWdvdG8gZXJyX2ljbTsKIAogCWF0b21pY19zZXQoJnFwLT5yZWZjb3VudCwgMSk7CiAJaW5pdF9jb21wbGV0aW9uKCZxcC0+ZnJlZSk7CiAKIAlyZXR1cm4gMDsKIAotZXJyX3B1dF9jbXB0OgotCW1seDRfdGFibGVfcHV0KGRldiwgJnFwX3RhYmxlLT5jbXB0X3RhYmxlLCBxcC0+cXBuKTsKLQotZXJyX3B1dF9yZG1hcmM6Ci0JbWx4NF90YWJsZV9wdXQoZGV2LCAmcXBfdGFibGUtPnJkbWFyY190YWJsZSwgcXAtPnFwbik7Ci0KLWVycl9wdXRfYWx0YzoKLQltbHg0X3RhYmxlX3B1dChkZXYsICZxcF90YWJsZS0+YWx0Y190YWJsZSwgcXAtPnFwbik7Ci0KLWVycl9wdXRfYXV4YzoKLQltbHg0X3RhYmxlX3B1dChkZXYsICZxcF90YWJsZS0+YXV4Y190YWJsZSwgcXAtPnFwbik7Ci0KLWVycl9wdXRfcXA6Ci0JbWx4NF90YWJsZV9wdXQoZGV2LCAmcXBfdGFibGUtPnFwX3RhYmxlLCBxcC0+cXBuKTsKLQotZXJyX291dDoKK2Vycl9pY206CisJbWx4NF9xcF9mcmVlX2ljbShkZXYsIHFwbik7CiAJcmV0dXJuIGVycjsKIH0KKwogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9xcF9hbGxvYyk7CiAKIHZvaWQgbWx4NF9xcF9yZW1vdmUoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3FwICpxcCkKQEAgLTI0OCwyNCArMzc4LDE4IEBACiAKIHZvaWQgbWx4NF9xcF9mcmVlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9xcCAqcXApCiB7Ci0Jc3RydWN0IG1seDRfcXBfdGFibGUgKnFwX3RhYmxlID0gJm1seDRfcHJpdihkZXYpLT5xcF90YWJsZTsKLQogCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZxcC0+cmVmY291bnQpKQogCQljb21wbGV0ZSgmcXAtPmZyZWUpOwogCXdhaXRfZm9yX2NvbXBsZXRpb24oJnFwLT5mcmVlKTsKIAotCW1seDRfdGFibGVfcHV0KGRldiwgJnFwX3RhYmxlLT5jbXB0X3RhYmxlLCBxcC0+cXBuKTsKLQltbHg0X3RhYmxlX3B1dChkZXYsICZxcF90YWJsZS0+cmRtYXJjX3RhYmxlLCBxcC0+cXBuKTsKLQltbHg0X3RhYmxlX3B1dChkZXYsICZxcF90YWJsZS0+YWx0Y190YWJsZSwgcXAtPnFwbik7Ci0JbWx4NF90YWJsZV9wdXQoZGV2LCAmcXBfdGFibGUtPmF1eGNfdGFibGUsIHFwLT5xcG4pOwotCW1seDRfdGFibGVfcHV0KGRldiwgJnFwX3RhYmxlLT5xcF90YWJsZSwgcXAtPnFwbik7CisJbWx4NF9xcF9mcmVlX2ljbShkZXYsIHFwLT5xcG4pOwogfQogRVhQT1JUX1NZTUJPTF9HUEwobWx4NF9xcF9mcmVlKTsKIAogc3RhdGljIGludCBtbHg0X0NPTkZfU1BFQ0lBTF9RUChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIGJhc2VfcXBuKQogewogCXJldHVybiBtbHg0X2NtZChkZXYsIDAsIGJhc2VfcXBuLCAwLCBNTFg0X0NNRF9DT05GX1NQRUNJQUxfUVAsCi0JCQlNTFg0X0NNRF9USU1FX0NMQVNTX0IpOworCQkJTUxYNF9DTURfVElNRV9DTEFTU19CLCBNTFg0X0NNRF9OQVRJVkUpOwogfQogCiBpbnQgbWx4NF9pbml0X3FwX3RhYmxlKHN0cnVjdCBtbHg0X2RldiAqZGV2KQpAQCAtMjc2LDYgKzQwMCw4IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmcXBfdGFibGUtPmxvY2spOwogCUlOSVRfUkFESVhfVFJFRSgmZGV2LT5xcF90YWJsZV90cmVlLCBHRlBfQVRPTUlDKTsKKwlpZiAobWx4NF9pc19zbGF2ZShkZXYpKQorCQlyZXR1cm4gMDsKIAogCS8qCiAJICogV2UgcmVzZXJ2ZSAyIGV4dHJhIFFQcyBwZXIgcG9ydCBmb3IgdGhlIHNwZWNpYWwgUVBzLiAgVGhlCkBAIC0zMjcsNiArNDUzLDkgQEAKIAogdm9pZCBtbHg0X2NsZWFudXBfcXBfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpCiB7CisJaWYgKG1seDRfaXNfc2xhdmUoZGV2KSkKKwkJcmV0dXJuOworCiAJbWx4NF9DT05GX1NQRUNJQUxfUVAoZGV2LCAwKTsKIAltbHg0X2JpdG1hcF9jbGVhbnVwKCZtbHg0X3ByaXYoZGV2KS0+cXBfdGFibGUuYml0bWFwKTsKIH0KQEAgLTM0Miw3ICs0NzEsOCBAQAogCQlyZXR1cm4gUFRSX0VSUihtYWlsYm94KTsKIAogCWVyciA9IG1seDRfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgcXAtPnFwbiwgMCwKLQkJCSAgIE1MWDRfQ01EX1FVRVJZX1FQLCBNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCQkJICAgTUxYNF9DTURfUVVFUllfUVAsIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCSAgIE1MWDRfQ01EX1dSQVBQRUQpOwogCWlmICghZXJyKQogCQltZW1jcHkoY29udGV4dCwgbWFpbGJveC0+YnVmICsgOCwgc2l6ZW9mICpjb250ZXh0KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9yZXNvdXJjZV90cmFja2VyLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3Jlc291cmNlX3RyYWNrZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDIwNzUxCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9yZXNvdXJjZV90cmFja2VyLmMKQEAgLTAsMCArMSwzMTA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IFRvcHNwaW4gQ29tbXVuaWNhdGlvbnMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4IE1lbGxhbm94IFRlY2hub2xvZ2llcy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYsIDIwMDcgQ2lzY28gU3lzdGVtcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYSBjaG9pY2Ugb2Ygb25lIG9mIHR3bworICogbGljZW5zZXMuICBZb3UgbWF5IGNob29zZSB0byBiZSBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSBWZXJzaW9uIDIsIGF2YWlsYWJsZSBmcm9tIHRoZSBmaWxlCisgKiBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLCBvciB0aGUKKyAqIE9wZW5JQi5vcmcgQlNEIGxpY2Vuc2UgYmVsb3c6CisgKgorICogICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqICAgICB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKKyAqICAgICBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIuCisgKgorICogICAgICAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqICAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscworICogICAgICAgIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQKKyAqIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMKKyAqIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUKKyAqIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbWx4NC9jbWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbHg0L3FwLmg+CisKKyNpbmNsdWRlICJtbHg0LmgiCisjaW5jbHVkZSAiZncuaCIKKworI2RlZmluZSBNTFg0X01BQ19WQUxJRAkJKDF1bGwgPDwgNjMpCisjZGVmaW5lIE1MWDRfTUFDX01BU0sJCTB4N2ZmZmZmZmZmZmZmZmZmZlVMTAorI2RlZmluZSBFVEhfQUxFTgkJNgorCitzdHJ1Y3QgbWFjX3JlcyB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXU2NCBtYWM7CisJdTggcG9ydDsKK307CisKK3N0cnVjdCByZXNfY29tbW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJdTMyCQkgICAgICAgIHJlc19pZDsKKwlpbnQJCQlvd25lcjsKKwlpbnQJCQlzdGF0ZTsKKwlpbnQJCQlmcm9tX3N0YXRlOworCWludAkJCXRvX3N0YXRlOworCWludAkJCXJlbW92aW5nOworfTsKKworZW51bSB7CisJUkVTX0FOWV9CVVNZID0gMQorfTsKKworc3RydWN0IHJlc19naWQgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKwl1OAkJCWdpZFsxNl07CisJZW51bSBtbHg0X3Byb3RvY29sCXByb3Q7Cit9OworCitlbnVtIHJlc19xcF9zdGF0ZXMgeworCVJFU19RUF9CVVNZID0gUkVTX0FOWV9CVVNZLAorCisJLyogUVAgbnVtYmVyIHdhcyBhbGxvY2F0ZWQgKi8KKwlSRVNfUVBfUkVTRVJWRUQsCisKKwkvKiBJQ00gbWVtb3J5IGZvciBRUCBjb250ZXh0IHdhcyBtYXBwZWQgKi8KKwlSRVNfUVBfTUFQUEVELAorCisJLyogUVAgaXMgaW4gaHcgb3duZXJzaGlwICovCisJUkVTX1FQX0hXCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnFwX3N0YXRlc19zdHIoZW51bSByZXNfcXBfc3RhdGVzIHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFJFU19RUF9CVVNZOiByZXR1cm4gIlJFU19RUF9CVVNZIjsKKwljYXNlIFJFU19RUF9SRVNFUlZFRDogcmV0dXJuICJSRVNfUVBfUkVTRVJWRUQiOworCWNhc2UgUkVTX1FQX01BUFBFRDogcmV0dXJuICJSRVNfUVBfTUFQUEVEIjsKKwljYXNlIFJFU19RUF9IVzogcmV0dXJuICJSRVNfUVBfSFciOworCWRlZmF1bHQ6IHJldHVybiAiVW5rbm93biI7CisJfQorfQorCitzdHJ1Y3QgcmVzX3FwIHsKKwlzdHJ1Y3QgcmVzX2NvbW1vbgljb207CisJc3RydWN0IHJlc19tdHQJICAgICAgICptdHQ7CisJc3RydWN0IHJlc19jcQkgICAgICAgKnJjcTsKKwlzdHJ1Y3QgcmVzX2NxCSAgICAgICAqc2NxOworCXN0cnVjdCByZXNfc3JxCSAgICAgICAqc3JxOworCXN0cnVjdCBsaXN0X2hlYWQJbWNnX2xpc3Q7CisJc3BpbmxvY2tfdAkJbWNnX3NwbDsKKwlpbnQJCQlsb2NhbF9xcG47Cit9OworCitlbnVtIHJlc19tdHRfc3RhdGVzIHsKKwlSRVNfTVRUX0JVU1kgPSBSRVNfQU5ZX0JVU1ksCisJUkVTX01UVF9BTExPQ0FURUQsCit9OworCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKm10dF9zdGF0ZXNfc3RyKGVudW0gcmVzX210dF9zdGF0ZXMgc3RhdGUpCit7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgUkVTX01UVF9CVVNZOiByZXR1cm4gIlJFU19NVFRfQlVTWSI7CisJY2FzZSBSRVNfTVRUX0FMTE9DQVRFRDogcmV0dXJuICJSRVNfTVRUX0FMTE9DQVRFRCI7CisJZGVmYXVsdDogcmV0dXJuICJVbmtub3duIjsKKwl9Cit9CisKK3N0cnVjdCByZXNfbXR0IHsKKwlzdHJ1Y3QgcmVzX2NvbW1vbgljb207CisJaW50CQkJb3JkZXI7CisJYXRvbWljX3QJCXJlZl9jb3VudDsKK307CisKK2VudW0gcmVzX21wdF9zdGF0ZXMgeworCVJFU19NUFRfQlVTWSA9IFJFU19BTllfQlVTWSwKKwlSRVNfTVBUX1JFU0VSVkVELAorCVJFU19NUFRfTUFQUEVELAorCVJFU19NUFRfSFcsCit9OworCitzdHJ1Y3QgcmVzX21wdCB7CisJc3RydWN0IHJlc19jb21tb24JY29tOworCXN0cnVjdCByZXNfbXR0CSAgICAgICAqbXR0OworCWludAkJCWtleTsKK307CisKK2VudW0gcmVzX2VxX3N0YXRlcyB7CisJUkVTX0VRX0JVU1kgPSBSRVNfQU5ZX0JVU1ksCisJUkVTX0VRX1JFU0VSVkVELAorCVJFU19FUV9IVywKK307CisKK3N0cnVjdCByZXNfZXEgeworCXN0cnVjdCByZXNfY29tbW9uCWNvbTsKKwlzdHJ1Y3QgcmVzX210dAkgICAgICAgKm10dDsKK307CisKK2VudW0gcmVzX2NxX3N0YXRlcyB7CisJUkVTX0NRX0JVU1kgPSBSRVNfQU5ZX0JVU1ksCisJUkVTX0NRX0FMTE9DQVRFRCwKKwlSRVNfQ1FfSFcsCit9OworCitzdHJ1Y3QgcmVzX2NxIHsKKwlzdHJ1Y3QgcmVzX2NvbW1vbgljb207CisJc3RydWN0IHJlc19tdHQJICAgICAgICptdHQ7CisJYXRvbWljX3QJCXJlZl9jb3VudDsKK307CisKK2VudW0gcmVzX3NycV9zdGF0ZXMgeworCVJFU19TUlFfQlVTWSA9IFJFU19BTllfQlVTWSwKKwlSRVNfU1JRX0FMTE9DQVRFRCwKKwlSRVNfU1JRX0hXLAorfTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpzcnFfc3RhdGVzX3N0cihlbnVtIHJlc19zcnFfc3RhdGVzIHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFJFU19TUlFfQlVTWTogcmV0dXJuICJSRVNfU1JRX0JVU1kiOworCWNhc2UgUkVTX1NSUV9BTExPQ0FURUQ6IHJldHVybiAiUkVTX1NSUV9BTExPQ0FURUQiOworCWNhc2UgUkVTX1NSUV9IVzogcmV0dXJuICJSRVNfU1JRX0hXIjsKKwlkZWZhdWx0OiByZXR1cm4gIlVua25vd24iOworCX0KK30KKworc3RydWN0IHJlc19zcnEgeworCXN0cnVjdCByZXNfY29tbW9uCWNvbTsKKwlzdHJ1Y3QgcmVzX210dAkgICAgICAgKm10dDsKKwlzdHJ1Y3QgcmVzX2NxCSAgICAgICAqY3E7CisJYXRvbWljX3QJCXJlZl9jb3VudDsKK307CisKK2VudW0gcmVzX2NvdW50ZXJfc3RhdGVzIHsKKwlSRVNfQ09VTlRFUl9CVVNZID0gUkVTX0FOWV9CVVNZLAorCVJFU19DT1VOVEVSX0FMTE9DQVRFRCwKK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY291bnRlcl9zdGF0ZXNfc3RyKGVudW0gcmVzX2NvdW50ZXJfc3RhdGVzIHN0YXRlKQoreworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIFJFU19DT1VOVEVSX0JVU1k6IHJldHVybiAiUkVTX0NPVU5URVJfQlVTWSI7CisJY2FzZSBSRVNfQ09VTlRFUl9BTExPQ0FURUQ6IHJldHVybiAiUkVTX0NPVU5URVJfQUxMT0NBVEVEIjsKKwlkZWZhdWx0OiByZXR1cm4gIlVua25vd24iOworCX0KK30KKworc3RydWN0IHJlc19jb3VudGVyIHsKKwlzdHJ1Y3QgcmVzX2NvbW1vbgljb207CisJaW50CQkJcG9ydDsKK307CisKKy8qIEZvciBEZWJ1ZyB1c2VzICovCitzdGF0aWMgY29uc3QgY2hhciAqUmVzb3VyY2VUeXBlKGVudW0gbWx4NF9yZXNvdXJjZSBydCkKK3sKKwlzd2l0Y2ggKHJ0KSB7CisJY2FzZSBSRVNfUVA6IHJldHVybiAiUkVTX1FQIjsKKwljYXNlIFJFU19DUTogcmV0dXJuICJSRVNfQ1EiOworCWNhc2UgUkVTX1NSUTogcmV0dXJuICJSRVNfU1JRIjsKKwljYXNlIFJFU19NUFQ6IHJldHVybiAiUkVTX01QVCI7CisJY2FzZSBSRVNfTVRUOiByZXR1cm4gIlJFU19NVFQiOworCWNhc2UgUkVTX01BQzogcmV0dXJuICAiUkVTX01BQyI7CisJY2FzZSBSRVNfRVE6IHJldHVybiAiUkVTX0VRIjsKKwljYXNlIFJFU19DT1VOVEVSOiByZXR1cm4gIlJFU19DT1VOVEVSIjsKKwlkZWZhdWx0OiByZXR1cm4gIlVua25vd24gcmVzb3VyY2UgdHlwZSAhISEiOworCX07Cit9CisKK2ludCBtbHg0X2luaXRfcmVzb3VyY2VfdHJhY2tlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJaW50IGk7CisJaW50IHQ7CisKKwlwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXIuc2xhdmVfbGlzdCA9CisJCWt6YWxsb2MoZGV2LT5udW1fc2xhdmVzICogc2l6ZW9mKHN0cnVjdCBzbGF2ZV9saXN0KSwKKwkJCUdGUF9LRVJORUwpOworCWlmICghcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyLnNsYXZlX2xpc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMCA7IGkgPCBkZXYtPm51bV9zbGF2ZXM7IGkrKykgeworCQlmb3IgKHQgPSAwOyB0IDwgTUxYNF9OVU1fT0ZfUkVTT1VSQ0VfVFlQRTsgKyt0KQorCQkJSU5JVF9MSVNUX0hFQUQoJnByaXYtPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlci4KKwkJCQkgICAgICAgc2xhdmVfbGlzdFtpXS5yZXNfbGlzdFt0XSk7CisJCW11dGV4X2luaXQoJnByaXYtPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlci5zbGF2ZV9saXN0W2ldLm11dGV4KTsKKwl9CisKKwltbHg0X2RiZyhkZXYsICJTdGFydGVkIGluaXRfcmVzb3VyY2VfdHJhY2tlcjogJWxkIHNsYXZlc1xuIiwKKwkJIGRldi0+bnVtX3NsYXZlcyk7CisJZm9yIChpID0gMCA7IGkgPCBNTFg0X05VTV9PRl9SRVNPVVJDRV9UWVBFOyBpKyspCisJCUlOSVRfUkFESVhfVFJFRSgmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyLnJlc190cmVlW2ldLAorCQkJCUdGUF9BVE9NSUN8X19HRlBfTk9XQVJOKTsKKworCXNwaW5fbG9ja19pbml0KCZwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXIubG9jayk7CisJcmV0dXJuIDAgOworfQorCit2b2lkIG1seDRfZnJlZV9yZXNvdXJjZV90cmFja2VyKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCWlmIChwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXIuc2xhdmVfbGlzdCkgeworCQlmb3IgKGkgPSAwIDsgaSA8IGRldi0+bnVtX3NsYXZlczsgaSsrKQorCQkJbWx4NF9kZWxldGVfYWxsX3Jlc291cmNlc19mb3Jfc2xhdmUoZGV2LCBpKTsKKworCQlrZnJlZShwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXIuc2xhdmVfbGlzdCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfdWRfZ2lkKHN0cnVjdCBtbHg0X2RldiAqZGV2LAorCQkJICBzdHJ1Y3QgbWx4NF9xcF9jb250ZXh0ICpxcF9jdHgsIHU4IHNsYXZlKQoreworCXUzMiB0cyA9IChiZTMyX3RvX2NwdShxcF9jdHgtPmZsYWdzKSA+PiAxNikgJiAweGZmOworCisJaWYgKE1MWDRfUVBfU1RfVUQgPT0gdHMpCisJCXFwX2N0eC0+cHJpX3BhdGgubWdpZF9pbmRleCA9IDB4ODAgfCBzbGF2ZTsKKworCW1seDRfZGJnKGRldiwgInNsYXZlICVkLCBuZXcgZ2lkIGluZGV4OiAweCV4ICIsCisJCXNsYXZlLCBxcF9jdHgtPnByaV9wYXRoLm1naWRfaW5kZXgpOworfQorCitzdGF0aWMgaW50IG1wdF9tYXNrKHN0cnVjdCBtbHg0X2RldiAqZGV2KQoreworCXJldHVybiBkZXYtPmNhcHMubnVtX21wdHMgLSAxOworfQorCitzdGF0aWMgdm9pZCAqZmluZF9yZXMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCByZXNfaWQsCisJCSAgICAgIGVudW0gbWx4NF9yZXNvdXJjZSB0eXBlKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKworCXJldHVybiByYWRpeF90cmVlX2xvb2t1cCgmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyLnJlc190cmVlW3R5cGVdLAorCQkJCSByZXNfaWQpOworfQorCitzdGF0aWMgaW50IGdldF9yZXMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgaW50IHJlc19pZCwKKwkJICAgZW51bSBtbHg0X3Jlc291cmNlIHR5cGUsCisJCSAgIHZvaWQgKnJlcykKK3sKKwlzdHJ1Y3QgcmVzX2NvbW1vbiAqcjsKKwlpbnQgZXJyID0gMDsKKworCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKwlyID0gZmluZF9yZXMoZGV2LCByZXNfaWQsIHR5cGUpOworCWlmICghcikgeworCQllcnIgPSAtRU5PTkVUOworCQlnb3RvIGV4aXQ7CisJfQorCisJaWYgKHItPnN0YXRlID09IFJFU19BTllfQlVTWSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gZXhpdDsKKwl9CisKKwlpZiAoci0+b3duZXIgIT0gc2xhdmUpIHsKKwkJZXJyID0gLUVQRVJNOworCQlnb3RvIGV4aXQ7CisJfQorCisJci0+ZnJvbV9zdGF0ZSA9IHItPnN0YXRlOworCXItPnN0YXRlID0gUkVTX0FOWV9CVVNZOworCW1seDRfZGJnKGRldiwgInJlcyAlcyBpZCAweCV4IHRvIGJ1c3lcbiIsCisJCSBSZXNvdXJjZVR5cGUodHlwZSksIHItPnJlc19pZCk7CisKKwlpZiAocmVzKQorCQkqKChzdHJ1Y3QgcmVzX2NvbW1vbiAqKilyZXMpID0gcjsKKworZXhpdDoKKwlzcGluX3VubG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgbWx4NF9nZXRfc2xhdmVfZnJvbV9yZXNvdXJjZV9pZChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwKKwkJCQkgICAgZW51bSBtbHg0X3Jlc291cmNlIHR5cGUsCisJCQkJICAgIGludCByZXNfaWQsIGludCAqc2xhdmUpCit7CisKKwlzdHJ1Y3QgcmVzX2NvbW1vbiAqcjsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKwlpbnQgaWQgPSByZXNfaWQ7CisKKwlpZiAodHlwZSA9PSBSRVNfUVApCisJCWlkICY9IDB4N2ZmZmZmOworCXNwaW5fbG9jayhtbHg0X3Rsb2NrKGRldikpOworCisJciA9IGZpbmRfcmVzKGRldiwgaWQsIHR5cGUpOworCWlmIChyKSB7CisJCSpzbGF2ZSA9IHItPm93bmVyOworCQllcnIgPSAwOworCX0KKwlzcGluX3VubG9jayhtbHg0X3Rsb2NrKGRldikpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcHV0X3JlcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBpbnQgcmVzX2lkLAorCQkgICAgZW51bSBtbHg0X3Jlc291cmNlIHR5cGUpCit7CisJc3RydWN0IHJlc19jb21tb24gKnI7CisKKwlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJciA9IGZpbmRfcmVzKGRldiwgcmVzX2lkLCB0eXBlKTsKKwlpZiAocikKKwkJci0+c3RhdGUgPSByLT5mcm9tX3N0YXRlOworCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworfQorCitzdGF0aWMgc3RydWN0IHJlc19jb21tb24gKmFsbG9jX3FwX3RyKGludCBpZCkKK3sKKwlzdHJ1Y3QgcmVzX3FwICpyZXQ7CisKKwlyZXQgPSBremFsbG9jKHNpemVvZiAqcmV0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQtPmNvbS5yZXNfaWQgPSBpZDsKKwlyZXQtPmNvbS5zdGF0ZSA9IFJFU19RUF9SRVNFUlZFRDsKKwlJTklUX0xJU1RfSEVBRCgmcmV0LT5tY2dfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnJldC0+bWNnX3NwbCk7CisKKwlyZXR1cm4gJnJldC0+Y29tOworfQorCitzdGF0aWMgc3RydWN0IHJlc19jb21tb24gKmFsbG9jX210dF90cihpbnQgaWQsIGludCBvcmRlcikKK3sKKwlzdHJ1Y3QgcmVzX210dCAqcmV0OworCisJcmV0ID0ga3phbGxvYyhzaXplb2YgKnJldCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXQpCisJCXJldHVybiBOVUxMOworCisJcmV0LT5jb20ucmVzX2lkID0gaWQ7CisJcmV0LT5vcmRlciA9IG9yZGVyOworCXJldC0+Y29tLnN0YXRlID0gUkVTX01UVF9BTExPQ0FURUQ7CisJYXRvbWljX3NldCgmcmV0LT5yZWZfY291bnQsIDApOworCisJcmV0dXJuICZyZXQtPmNvbTsKK30KKworc3RhdGljIHN0cnVjdCByZXNfY29tbW9uICphbGxvY19tcHRfdHIoaW50IGlkLCBpbnQga2V5KQoreworCXN0cnVjdCByZXNfbXB0ICpyZXQ7CisKKwlyZXQgPSBremFsbG9jKHNpemVvZiAqcmV0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQtPmNvbS5yZXNfaWQgPSBpZDsKKwlyZXQtPmNvbS5zdGF0ZSA9IFJFU19NUFRfUkVTRVJWRUQ7CisJcmV0LT5rZXkgPSBrZXk7CisKKwlyZXR1cm4gJnJldC0+Y29tOworfQorCitzdGF0aWMgc3RydWN0IHJlc19jb21tb24gKmFsbG9jX2VxX3RyKGludCBpZCkKK3sKKwlzdHJ1Y3QgcmVzX2VxICpyZXQ7CisKKwlyZXQgPSBremFsbG9jKHNpemVvZiAqcmV0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJldCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXQtPmNvbS5yZXNfaWQgPSBpZDsKKwlyZXQtPmNvbS5zdGF0ZSA9IFJFU19FUV9SRVNFUlZFRDsKKworCXJldHVybiAmcmV0LT5jb207Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzX2NvbW1vbiAqYWxsb2NfY3FfdHIoaW50IGlkKQoreworCXN0cnVjdCByZXNfY3EgKnJldDsKKworCXJldCA9IGt6YWxsb2Moc2l6ZW9mICpyZXQsIEdGUF9LRVJORUwpOworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldC0+Y29tLnJlc19pZCA9IGlkOworCXJldC0+Y29tLnN0YXRlID0gUkVTX0NRX0FMTE9DQVRFRDsKKwlhdG9taWNfc2V0KCZyZXQtPnJlZl9jb3VudCwgMCk7CisKKwlyZXR1cm4gJnJldC0+Y29tOworfQorCitzdGF0aWMgc3RydWN0IHJlc19jb21tb24gKmFsbG9jX3NycV90cihpbnQgaWQpCit7CisJc3RydWN0IHJlc19zcnEgKnJldDsKKworCXJldCA9IGt6YWxsb2Moc2l6ZW9mICpyZXQsIEdGUF9LRVJORUwpOworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldC0+Y29tLnJlc19pZCA9IGlkOworCXJldC0+Y29tLnN0YXRlID0gUkVTX1NSUV9BTExPQ0FURUQ7CisJYXRvbWljX3NldCgmcmV0LT5yZWZfY291bnQsIDApOworCisJcmV0dXJuICZyZXQtPmNvbTsKK30KKworc3RhdGljIHN0cnVjdCByZXNfY29tbW9uICphbGxvY19jb3VudGVyX3RyKGludCBpZCkKK3sKKwlzdHJ1Y3QgcmVzX2NvdW50ZXIgKnJldDsKKworCXJldCA9IGt6YWxsb2Moc2l6ZW9mICpyZXQsIEdGUF9LRVJORUwpOworCWlmICghcmV0KQorCQlyZXR1cm4gTlVMTDsKKworCXJldC0+Y29tLnJlc19pZCA9IGlkOworCXJldC0+Y29tLnN0YXRlID0gUkVTX0NPVU5URVJfQUxMT0NBVEVEOworCisJcmV0dXJuICZyZXQtPmNvbTsKK30KKworc3RhdGljIHN0cnVjdCByZXNfY29tbW9uICphbGxvY190cihpbnQgaWQsIGVudW0gbWx4NF9yZXNvdXJjZSB0eXBlLCBpbnQgc2xhdmUsCisJCQkJICAgaW50IGV4dHJhKQoreworCXN0cnVjdCByZXNfY29tbW9uICpyZXQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJFU19RUDoKKwkJcmV0ID0gYWxsb2NfcXBfdHIoaWQpOworCQlicmVhazsKKwljYXNlIFJFU19NUFQ6CisJCXJldCA9IGFsbG9jX21wdF90cihpZCwgZXh0cmEpOworCQlicmVhazsKKwljYXNlIFJFU19NVFQ6CisJCXJldCA9IGFsbG9jX210dF90cihpZCwgZXh0cmEpOworCQlicmVhazsKKwljYXNlIFJFU19FUToKKwkJcmV0ID0gYWxsb2NfZXFfdHIoaWQpOworCQlicmVhazsKKwljYXNlIFJFU19DUToKKwkJcmV0ID0gYWxsb2NfY3FfdHIoaWQpOworCQlicmVhazsKKwljYXNlIFJFU19TUlE6CisJCXJldCA9IGFsbG9jX3NycV90cihpZCk7CisJCWJyZWFrOworCWNhc2UgUkVTX01BQzoKKwkJcHJpbnRrKEtFUk5fRVJSICJpbXBsZW1lbnRhdGlvbiBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJY2FzZSBSRVNfQ09VTlRFUjoKKwkJcmV0ID0gYWxsb2NfY291bnRlcl90cihpZCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChyZXQpCisJCXJldC0+b3duZXIgPSBzbGF2ZTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYWRkX3Jlc19yYW5nZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBpbnQgYmFzZSwgaW50IGNvdW50LAorCQkJIGVudW0gbWx4NF9yZXNvdXJjZSB0eXBlLCBpbnQgZXh0cmEpCit7CisJaW50IGk7CisJaW50IGVycjsKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IHJlc19jb21tb24gKipyZXNfYXJyOworCXN0cnVjdCBtbHg0X3Jlc291cmNlX3RyYWNrZXIgKnRyYWNrZXIgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyOworCXN0cnVjdCByYWRpeF90cmVlX3Jvb3QgKnJvb3QgPSAmdHJhY2tlci0+cmVzX3RyZWVbdHlwZV07CisKKwlyZXNfYXJyID0ga3phbGxvYyhjb3VudCAqIHNpemVvZiAqcmVzX2FyciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNfYXJyKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisJCXJlc19hcnJbaV0gPSBhbGxvY190cihiYXNlICsgaSwgdHlwZSwgc2xhdmUsIGV4dHJhKTsKKwkJaWYgKCFyZXNfYXJyW2ldKSB7CisJCQlmb3IgKC0taTsgaSA+PSAwOyAtLWkpCisJCQkJa2ZyZWUocmVzX2FycltpXSk7CisKKwkJCWtmcmVlKHJlc19hcnIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisKKwlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJZm9yIChpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKwkJaWYgKGZpbmRfcmVzKGRldiwgYmFzZSArIGksIHR5cGUpKSB7CisJCQllcnIgPSAtRUVYSVNUOworCQkJZ290byB1bmRvOworCQl9CisJCWVyciA9IHJhZGl4X3RyZWVfaW5zZXJ0KHJvb3QsIGJhc2UgKyBpLCByZXNfYXJyW2ldKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdW5kbzsKKwkJbGlzdF9hZGRfdGFpbCgmcmVzX2FycltpXS0+bGlzdCwKKwkJCSAgICAgICZ0cmFja2VyLT5zbGF2ZV9saXN0W3NsYXZlXS5yZXNfbGlzdFt0eXBlXSk7CisJfQorCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCWtmcmVlKHJlc19hcnIpOworCisJcmV0dXJuIDA7CisKK3VuZG86CisJZm9yICgtLWk7IGkgPj0gYmFzZTsgLS1pKQorCQlyYWRpeF90cmVlX2RlbGV0ZSgmdHJhY2tlci0+cmVzX3RyZWVbdHlwZV0sIGkpOworCisJc3Bpbl91bmxvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKwkJa2ZyZWUocmVzX2FycltpXSk7CisKKwlrZnJlZShyZXNfYXJyKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX3FwX29rKHN0cnVjdCByZXNfcXAgKnJlcykKK3sKKwlpZiAocmVzLT5jb20uc3RhdGUgPT0gUkVTX1FQX0JVU1kpCisJCXJldHVybiAtRUJVU1k7CisJZWxzZSBpZiAocmVzLT5jb20uc3RhdGUgIT0gUkVTX1FQX1JFU0VSVkVEKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX210dF9vayhzdHJ1Y3QgcmVzX210dCAqcmVzLCBpbnQgb3JkZXIpCit7CisJaWYgKHJlcy0+Y29tLnN0YXRlID09IFJFU19NVFRfQlVTWSB8fAorCSAgICBhdG9taWNfcmVhZCgmcmVzLT5yZWZfY291bnQpKSB7CisJCXByaW50ayhLRVJOX0RFQlVHICIlcy0lZDogc3RhdGUgJXMsIHJlZl9jb3VudCAlZFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCBfX0xJTkVfXywKKwkJICAgICAgIG10dF9zdGF0ZXNfc3RyKHJlcy0+Y29tLnN0YXRlKSwKKwkJICAgICAgIGF0b21pY19yZWFkKCZyZXMtPnJlZl9jb3VudCkpOworCQlyZXR1cm4gLUVCVVNZOworCX0gZWxzZSBpZiAocmVzLT5jb20uc3RhdGUgIT0gUkVTX01UVF9BTExPQ0FURUQpCisJCXJldHVybiAtRVBFUk07CisJZWxzZSBpZiAocmVzLT5vcmRlciAhPSBvcmRlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZW1vdmVfbXB0X29rKHN0cnVjdCByZXNfbXB0ICpyZXMpCit7CisJaWYgKHJlcy0+Y29tLnN0YXRlID09IFJFU19NUFRfQlVTWSkKKwkJcmV0dXJuIC1FQlVTWTsKKwllbHNlIGlmIChyZXMtPmNvbS5zdGF0ZSAhPSBSRVNfTVBUX1JFU0VSVkVEKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX2VxX29rKHN0cnVjdCByZXNfZXEgKnJlcykKK3sKKwlpZiAocmVzLT5jb20uc3RhdGUgPT0gUkVTX01QVF9CVVNZKQorCQlyZXR1cm4gLUVCVVNZOworCWVsc2UgaWYgKHJlcy0+Y29tLnN0YXRlICE9IFJFU19NUFRfUkVTRVJWRUQpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZW1vdmVfY291bnRlcl9vayhzdHJ1Y3QgcmVzX2NvdW50ZXIgKnJlcykKK3sKKwlpZiAocmVzLT5jb20uc3RhdGUgPT0gUkVTX0NPVU5URVJfQlVTWSkKKwkJcmV0dXJuIC1FQlVTWTsKKwllbHNlIGlmIChyZXMtPmNvbS5zdGF0ZSAhPSBSRVNfQ09VTlRFUl9BTExPQ0FURUQpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZW1vdmVfY3Ffb2soc3RydWN0IHJlc19jcSAqcmVzKQoreworCWlmIChyZXMtPmNvbS5zdGF0ZSA9PSBSRVNfQ1FfQlVTWSkKKwkJcmV0dXJuIC1FQlVTWTsKKwllbHNlIGlmIChyZXMtPmNvbS5zdGF0ZSAhPSBSRVNfQ1FfQUxMT0NBVEVEKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcmVtb3ZlX3NycV9vayhzdHJ1Y3QgcmVzX3NycSAqcmVzKQoreworCWlmIChyZXMtPmNvbS5zdGF0ZSA9PSBSRVNfU1JRX0JVU1kpCisJCXJldHVybiAtRUJVU1k7CisJZWxzZSBpZiAocmVzLT5jb20uc3RhdGUgIT0gUkVTX1NSUV9BTExPQ0FURUQpCisJCXJldHVybiAtRVBFUk07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZW1vdmVfb2soc3RydWN0IHJlc19jb21tb24gKnJlcywgZW51bSBtbHg0X3Jlc291cmNlIHR5cGUsIGludCBleHRyYSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJFU19RUDoKKwkJcmV0dXJuIHJlbW92ZV9xcF9vaygoc3RydWN0IHJlc19xcCAqKXJlcyk7CisJY2FzZSBSRVNfQ1E6CisJCXJldHVybiByZW1vdmVfY3Ffb2soKHN0cnVjdCByZXNfY3EgKilyZXMpOworCWNhc2UgUkVTX1NSUToKKwkJcmV0dXJuIHJlbW92ZV9zcnFfb2soKHN0cnVjdCByZXNfc3JxICopcmVzKTsKKwljYXNlIFJFU19NUFQ6CisJCXJldHVybiByZW1vdmVfbXB0X29rKChzdHJ1Y3QgcmVzX21wdCAqKXJlcyk7CisJY2FzZSBSRVNfTVRUOgorCQlyZXR1cm4gcmVtb3ZlX210dF9vaygoc3RydWN0IHJlc19tdHQgKilyZXMsIGV4dHJhKTsKKwljYXNlIFJFU19NQUM6CisJCXJldHVybiAtRU5PU1lTOworCWNhc2UgUkVTX0VROgorCQlyZXR1cm4gcmVtb3ZlX2VxX29rKChzdHJ1Y3QgcmVzX2VxICopcmVzKTsKKwljYXNlIFJFU19DT1VOVEVSOgorCQlyZXR1cm4gcmVtb3ZlX2NvdW50ZXJfb2soKHN0cnVjdCByZXNfY291bnRlciAqKXJlcyk7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IHJlbV9yZXNfcmFuZ2Uoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgaW50IGJhc2UsIGludCBjb3VudCwKKwkJCSBlbnVtIG1seDRfcmVzb3VyY2UgdHlwZSwgaW50IGV4dHJhKQoreworCWludCBpOworCWludCBlcnI7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3Jlc291cmNlX3RyYWNrZXIgKnRyYWNrZXIgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyOworCXN0cnVjdCByZXNfY29tbW9uICpyOworCisJc3Bpbl9sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCWZvciAoaSA9IGJhc2U7IGkgPCBiYXNlICsgY291bnQ7ICsraSkgeworCQlyID0gcmFkaXhfdHJlZV9sb29rdXAoJnRyYWNrZXItPnJlc190cmVlW3R5cGVdLCBpKTsKKwkJaWYgKCFyKSB7CisJCQllcnIgPSAtRU5PRU5UOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHItPm93bmVyICE9IHNsYXZlKSB7CisJCQllcnIgPSAtRVBFUk07CisJCQlnb3RvIG91dDsKKwkJfQorCQllcnIgPSByZW1vdmVfb2sociwgdHlwZSwgZXh0cmEpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJfQorCisJZm9yIChpID0gYmFzZTsgaSA8IGJhc2UgKyBjb3VudDsgKytpKSB7CisJCXIgPSByYWRpeF90cmVlX2xvb2t1cCgmdHJhY2tlci0+cmVzX3RyZWVbdHlwZV0sIGkpOworCQlyYWRpeF90cmVlX2RlbGV0ZSgmdHJhY2tlci0+cmVzX3RyZWVbdHlwZV0sIGkpOworCQlsaXN0X2RlbCgmci0+bGlzdCk7CisJCWtmcmVlKHIpOworCX0KKwllcnIgPSAwOworCitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHFwX3Jlc19zdGFydF9tb3ZlX3RvKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsIGludCBxcG4sCisJCQkJZW51bSByZXNfcXBfc3RhdGVzIHN0YXRlLCBzdHJ1Y3QgcmVzX3FwICoqcXAsCisJCQkJaW50IGFsbG9jKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9yZXNvdXJjZV90cmFja2VyICp0cmFja2VyID0gJnByaXYtPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlcjsKKwlzdHJ1Y3QgcmVzX3FwICpyOworCWludCBlcnIgPSAwOworCisJc3Bpbl9sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCXIgPSByYWRpeF90cmVlX2xvb2t1cCgmdHJhY2tlci0+cmVzX3RyZWVbUkVTX1FQXSwgcXBuKTsKKwlpZiAoIXIpCisJCWVyciA9IC1FTk9FTlQ7CisJZWxzZSBpZiAoci0+Y29tLm93bmVyICE9IHNsYXZlKQorCQllcnIgPSAtRVBFUk07CisJZWxzZSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBSRVNfUVBfQlVTWToKKwkJCW1seDRfZGJnKGRldiwgIiVzOiBmYWlsZWQgUkVTX1FQLCAweCV4XG4iLAorCQkJCSBfX2Z1bmNfXywgci0+Y29tLnJlc19pZCk7CisJCQllcnIgPSAtRUJVU1k7CisJCQlicmVhazsKKworCQljYXNlIFJFU19RUF9SRVNFUlZFRDoKKwkJCWlmIChyLT5jb20uc3RhdGUgPT0gUkVTX1FQX01BUFBFRCAmJiAhYWxsb2MpCisJCQkJYnJlYWs7CisKKwkJCW1seDRfZGJnKGRldiwgImZhaWxlZCBSRVNfUVAsIDB4JXhcbiIsIHItPmNvbS5yZXNfaWQpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTX1FQX01BUFBFRDoKKwkJCWlmICgoci0+Y29tLnN0YXRlID09IFJFU19RUF9SRVNFUlZFRCAmJiBhbGxvYykgfHwKKwkJCSAgICByLT5jb20uc3RhdGUgPT0gUkVTX1FQX0hXKQorCQkJCWJyZWFrOworCQkJZWxzZSB7CisJCQkJbWx4NF9kYmcoZGV2LCAiZmFpbGVkIFJFU19RUCwgMHgleFxuIiwKKwkJCQkJICByLT5jb20ucmVzX2lkKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFJFU19RUF9IVzoKKwkJCWlmIChyLT5jb20uc3RhdGUgIT0gUkVTX1FQX01BUFBFRCkKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFlcnIpIHsKKwkJCXItPmNvbS5mcm9tX3N0YXRlID0gci0+Y29tLnN0YXRlOworCQkJci0+Y29tLnRvX3N0YXRlID0gc3RhdGU7CisJCQlyLT5jb20uc3RhdGUgPSBSRVNfUVBfQlVTWTsKKwkJCWlmIChxcCkKKwkJCQkqcXAgPSAoc3RydWN0IHJlc19xcCAqKXI7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbXJfcmVzX3N0YXJ0X21vdmVfdG8oc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgaW50IGluZGV4LAorCQkJCWVudW0gcmVzX21wdF9zdGF0ZXMgc3RhdGUsIHN0cnVjdCByZXNfbXB0ICoqbXB0KQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9yZXNvdXJjZV90cmFja2VyICp0cmFja2VyID0gJnByaXYtPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlcjsKKwlzdHJ1Y3QgcmVzX21wdCAqcjsKKwlpbnQgZXJyID0gMDsKKworCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKwlyID0gcmFkaXhfdHJlZV9sb29rdXAoJnRyYWNrZXItPnJlc190cmVlW1JFU19NUFRdLCBpbmRleCk7CisJaWYgKCFyKQorCQllcnIgPSAtRU5PRU5UOworCWVsc2UgaWYgKHItPmNvbS5vd25lciAhPSBzbGF2ZSkKKwkJZXJyID0gLUVQRVJNOworCWVsc2UgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgUkVTX01QVF9CVVNZOgorCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTX01QVF9SRVNFUlZFRDoKKwkJCWlmIChyLT5jb20uc3RhdGUgIT0gUkVTX01QVF9NQVBQRUQpCisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCisJCWNhc2UgUkVTX01QVF9NQVBQRUQ6CisJCQlpZiAoci0+Y29tLnN0YXRlICE9IFJFU19NUFRfUkVTRVJWRUQgJiYKKwkJCSAgICByLT5jb20uc3RhdGUgIT0gUkVTX01QVF9IVykKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNfTVBUX0hXOgorCQkJaWYgKHItPmNvbS5zdGF0ZSAhPSBSRVNfTVBUX01BUFBFRCkKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFlcnIpIHsKKwkJCXItPmNvbS5mcm9tX3N0YXRlID0gci0+Y29tLnN0YXRlOworCQkJci0+Y29tLnRvX3N0YXRlID0gc3RhdGU7CisJCQlyLT5jb20uc3RhdGUgPSBSRVNfTVBUX0JVU1k7CisJCQlpZiAobXB0KQorCQkJCSptcHQgPSAoc3RydWN0IHJlc19tcHQgKilyOworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVxX3Jlc19zdGFydF9tb3ZlX3RvKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsIGludCBpbmRleCwKKwkJCQllbnVtIHJlc19lcV9zdGF0ZXMgc3RhdGUsIHN0cnVjdCByZXNfZXEgKiplcSkKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfcmVzb3VyY2VfdHJhY2tlciAqdHJhY2tlciA9ICZwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXI7CisJc3RydWN0IHJlc19lcSAqcjsKKwlpbnQgZXJyID0gMDsKKworCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKwlyID0gcmFkaXhfdHJlZV9sb29rdXAoJnRyYWNrZXItPnJlc190cmVlW1JFU19FUV0sIGluZGV4KTsKKwlpZiAoIXIpCisJCWVyciA9IC1FTk9FTlQ7CisJZWxzZSBpZiAoci0+Y29tLm93bmVyICE9IHNsYXZlKQorCQllcnIgPSAtRVBFUk07CisJZWxzZSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBSRVNfRVFfQlVTWToKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIFJFU19FUV9SRVNFUlZFRDoKKwkJCWlmIChyLT5jb20uc3RhdGUgIT0gUkVTX0VRX0hXKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIFJFU19FUV9IVzoKKwkJCWlmIChyLT5jb20uc3RhdGUgIT0gUkVTX0VRX1JFU0VSVkVEKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwkJfQorCisJCWlmICghZXJyKSB7CisJCQlyLT5jb20uZnJvbV9zdGF0ZSA9IHItPmNvbS5zdGF0ZTsKKwkJCXItPmNvbS50b19zdGF0ZSA9IHN0YXRlOworCQkJci0+Y29tLnN0YXRlID0gUkVTX0VRX0JVU1k7CisJCQlpZiAoZXEpCisJCQkJKmVxID0gcjsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBjcV9yZXNfc3RhcnRfbW92ZV90byhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBpbnQgY3FuLAorCQkJCWVudW0gcmVzX2NxX3N0YXRlcyBzdGF0ZSwgc3RydWN0IHJlc19jcSAqKmNxKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9yZXNvdXJjZV90cmFja2VyICp0cmFja2VyID0gJnByaXYtPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlcjsKKwlzdHJ1Y3QgcmVzX2NxICpyOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJciA9IHJhZGl4X3RyZWVfbG9va3VwKCZ0cmFja2VyLT5yZXNfdHJlZVtSRVNfQ1FdLCBjcW4pOworCWlmICghcikKKwkJZXJyID0gLUVOT0VOVDsKKwllbHNlIGlmIChyLT5jb20ub3duZXIgIT0gc2xhdmUpCisJCWVyciA9IC1FUEVSTTsKKwllbHNlIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFJFU19DUV9CVVNZOgorCQkJZXJyID0gLUVCVVNZOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNfQ1FfQUxMT0NBVEVEOgorCQkJaWYgKHItPmNvbS5zdGF0ZSAhPSBSRVNfQ1FfSFcpCisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCWVsc2UgaWYgKGF0b21pY19yZWFkKCZyLT5yZWZfY291bnQpKQorCQkJCWVyciA9IC1FQlVTWTsKKwkJCWVsc2UKKwkJCQllcnIgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBSRVNfQ1FfSFc6CisJCQlpZiAoci0+Y29tLnN0YXRlICE9IFJFU19DUV9BTExPQ0FURUQpCisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCWVsc2UKKwkJCQllcnIgPSAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWVyciA9IC1FSU5WQUw7CisJCX0KKworCQlpZiAoIWVycikgeworCQkJci0+Y29tLmZyb21fc3RhdGUgPSByLT5jb20uc3RhdGU7CisJCQlyLT5jb20udG9fc3RhdGUgPSBzdGF0ZTsKKwkJCXItPmNvbS5zdGF0ZSA9IFJFU19DUV9CVVNZOworCQkJaWYgKGNxKQorCQkJCSpjcSA9IHI7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc3JxX3Jlc19zdGFydF9tb3ZlX3RvKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsIGludCBpbmRleCwKKwkJCQkgZW51bSByZXNfY3Ffc3RhdGVzIHN0YXRlLCBzdHJ1Y3QgcmVzX3NycSAqKnNycSkKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfcmVzb3VyY2VfdHJhY2tlciAqdHJhY2tlciA9ICZwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXI7CisJc3RydWN0IHJlc19zcnEgKnI7CisJaW50IGVyciA9IDA7CisKKwlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJciA9IHJhZGl4X3RyZWVfbG9va3VwKCZ0cmFja2VyLT5yZXNfdHJlZVtSRVNfU1JRXSwgaW5kZXgpOworCWlmICghcikKKwkJZXJyID0gLUVOT0VOVDsKKwllbHNlIGlmIChyLT5jb20ub3duZXIgIT0gc2xhdmUpCisJCWVyciA9IC1FUEVSTTsKKwllbHNlIHsKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIFJFU19TUlFfQlVTWToKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQljYXNlIFJFU19TUlFfQUxMT0NBVEVEOgorCQkJaWYgKHItPmNvbS5zdGF0ZSAhPSBSRVNfU1JRX0hXKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCQllbHNlIGlmIChhdG9taWNfcmVhZCgmci0+cmVmX2NvdW50KSkKKwkJCQllcnIgPSAtRUJVU1k7CisJCQlicmVhazsKKworCQljYXNlIFJFU19TUlFfSFc6CisJCQlpZiAoci0+Y29tLnN0YXRlICE9IFJFU19TUlFfQUxMT0NBVEVEKQorCQkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJZXJyID0gLUVJTlZBTDsKKwkJfQorCisJCWlmICghZXJyKSB7CisJCQlyLT5jb20uZnJvbV9zdGF0ZSA9IHItPmNvbS5zdGF0ZTsKKwkJCXItPmNvbS50b19zdGF0ZSA9IHN0YXRlOworCQkJci0+Y29tLnN0YXRlID0gUkVTX1NSUV9CVVNZOworCQkJaWYgKHNycSkKKwkJCQkqc3JxID0gcjsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgcmVzX2Fib3J0X21vdmUoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgIGVudW0gbWx4NF9yZXNvdXJjZSB0eXBlLCBpbnQgaWQpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3Jlc291cmNlX3RyYWNrZXIgKnRyYWNrZXIgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyOworCXN0cnVjdCByZXNfY29tbW9uICpyOworCisJc3Bpbl9sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCXIgPSByYWRpeF90cmVlX2xvb2t1cCgmdHJhY2tlci0+cmVzX3RyZWVbdHlwZV0sIGlkKTsKKwlpZiAociAmJiAoci0+b3duZXIgPT0gc2xhdmUpKQorCQlyLT5zdGF0ZSA9IHItPmZyb21fc3RhdGU7CisJc3Bpbl91bmxvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlc19lbmRfbW92ZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJIGVudW0gbWx4NF9yZXNvdXJjZSB0eXBlLCBpbnQgaWQpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3Jlc291cmNlX3RyYWNrZXIgKnRyYWNrZXIgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyOworCXN0cnVjdCByZXNfY29tbW9uICpyOworCisJc3Bpbl9sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCXIgPSByYWRpeF90cmVlX2xvb2t1cCgmdHJhY2tlci0+cmVzX3RyZWVbdHlwZV0sIGlkKTsKKwlpZiAociAmJiAoci0+b3duZXIgPT0gc2xhdmUpKQorCQlyLT5zdGF0ZSA9IHItPnRvX3N0YXRlOworCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworfQorCitzdGF0aWMgaW50IHZhbGlkX3Jlc2VydmVkKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsIGludCBxcG4pCit7CisJcmV0dXJuIG1seDRfaXNfcXBfcmVzZXJ2ZWQoZGV2LCBxcG4pOworfQorCitzdGF0aWMgaW50IHFwX2FsbG9jX3JlcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBpbnQgb3AsIGludCBjbWQsCisJCQl1NjQgaW5fcGFyYW0sIHU2NCAqb3V0X3BhcmFtKQoreworCWludCBlcnI7CisJaW50IGNvdW50OworCWludCBhbGlnbjsKKwlpbnQgYmFzZTsKKwlpbnQgcXBuOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgUkVTX09QX1JFU0VSVkU6CisJCWNvdW50ID0gZ2V0X3BhcmFtX2woJmluX3BhcmFtKTsKKwkJYWxpZ24gPSBnZXRfcGFyYW1faCgmaW5fcGFyYW0pOworCQllcnIgPSBfX21seDRfcXBfcmVzZXJ2ZV9yYW5nZShkZXYsIGNvdW50LCBhbGlnbiwgJmJhc2UpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQllcnIgPSBhZGRfcmVzX3JhbmdlKGRldiwgc2xhdmUsIGJhc2UsIGNvdW50LCBSRVNfUVAsIDApOworCQlpZiAoZXJyKSB7CisJCQlfX21seDRfcXBfcmVsZWFzZV9yYW5nZShkZXYsIGJhc2UsIGNvdW50KTsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJc2V0X3BhcmFtX2wob3V0X3BhcmFtLCBiYXNlKTsKKwkJYnJlYWs7CisJY2FzZSBSRVNfT1BfTUFQX0lDTToKKwkJcXBuID0gZ2V0X3BhcmFtX2woJmluX3BhcmFtKSAmIDB4N2ZmZmZmOworCQlpZiAodmFsaWRfcmVzZXJ2ZWQoZGV2LCBzbGF2ZSwgcXBuKSkgeworCQkJZXJyID0gYWRkX3Jlc19yYW5nZShkZXYsIHNsYXZlLCBxcG4sIDEsIFJFU19RUCwgMCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKworCQllcnIgPSBxcF9yZXNfc3RhcnRfbW92ZV90byhkZXYsIHNsYXZlLCBxcG4sIFJFU19RUF9NQVBQRUQsCisJCQkJCSAgIE5VTEwsIDEpOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoIXZhbGlkX3Jlc2VydmVkKGRldiwgc2xhdmUsIHFwbikpIHsKKwkJCWVyciA9IF9fbWx4NF9xcF9hbGxvY19pY20oZGV2LCBxcG4pOworCQkJaWYgKGVycikgeworCQkJCXJlc19hYm9ydF9tb3ZlKGRldiwgc2xhdmUsIFJFU19RUCwgcXBuKTsKKwkJCQlyZXR1cm4gZXJyOworCQkJfQorCQl9CisKKwkJcmVzX2VuZF9tb3ZlKGRldiwgc2xhdmUsIFJFU19RUCwgcXBuKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtdHRfYWxsb2NfcmVzKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsIGludCBvcCwgaW50IGNtZCwKKwkJCSB1NjQgaW5fcGFyYW0sIHU2NCAqb3V0X3BhcmFtKQoreworCWludCBlcnIgPSAtRUlOVkFMOworCWludCBiYXNlOworCWludCBvcmRlcjsKKworCWlmIChvcCAhPSBSRVNfT1BfUkVTRVJWRV9BTkRfTUFQKQorCQlyZXR1cm4gZXJyOworCisJb3JkZXIgPSBnZXRfcGFyYW1fbCgmaW5fcGFyYW0pOworCWJhc2UgPSBfX21seDRfYWxsb2NfbXR0X3JhbmdlKGRldiwgb3JkZXIpOworCWlmIChiYXNlID09IC0xKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IGFkZF9yZXNfcmFuZ2UoZGV2LCBzbGF2ZSwgYmFzZSwgMSwgUkVTX01UVCwgb3JkZXIpOworCWlmIChlcnIpCisJCV9fbWx4NF9mcmVlX210dF9yYW5nZShkZXYsIGJhc2UsIG9yZGVyKTsKKwllbHNlCisJCXNldF9wYXJhbV9sKG91dF9wYXJhbSwgYmFzZSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1wdF9hbGxvY19yZXMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgaW50IG9wLCBpbnQgY21kLAorCQkJIHU2NCBpbl9wYXJhbSwgdTY0ICpvdXRfcGFyYW0pCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJaW50IGluZGV4OworCWludCBpZDsKKwlzdHJ1Y3QgcmVzX21wdCAqbXB0OworCisJc3dpdGNoIChvcCkgeworCWNhc2UgUkVTX09QX1JFU0VSVkU6CisJCWluZGV4ID0gX19tbHg0X21yX3Jlc2VydmUoZGV2KTsKKwkJaWYgKGluZGV4ID09IC0xKQorCQkJYnJlYWs7CisJCWlkID0gaW5kZXggJiBtcHRfbWFzayhkZXYpOworCisJCWVyciA9IGFkZF9yZXNfcmFuZ2UoZGV2LCBzbGF2ZSwgaWQsIDEsIFJFU19NUFQsIGluZGV4KTsKKwkJaWYgKGVycikgeworCQkJX19tbHg0X21yX3JlbGVhc2UoZGV2LCBpbmRleCk7CisJCQlicmVhazsKKwkJfQorCQlzZXRfcGFyYW1fbChvdXRfcGFyYW0sIGluZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBSRVNfT1BfTUFQX0lDTToKKwkJaW5kZXggPSBnZXRfcGFyYW1fbCgmaW5fcGFyYW0pOworCQlpZCA9IGluZGV4ICYgbXB0X21hc2soZGV2KTsKKwkJZXJyID0gbXJfcmVzX3N0YXJ0X21vdmVfdG8oZGV2LCBzbGF2ZSwgaWQsCisJCQkJCSAgIFJFU19NUFRfTUFQUEVELCAmbXB0KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJZXJyID0gX19tbHg0X21yX2FsbG9jX2ljbShkZXYsIG1wdC0+a2V5KTsKKwkJaWYgKGVycikgeworCQkJcmVzX2Fib3J0X21vdmUoZGV2LCBzbGF2ZSwgUkVTX01QVCwgaWQpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCisJCXJlc19lbmRfbW92ZShkZXYsIHNsYXZlLCBSRVNfTVBULCBpZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNxX2FsbG9jX3JlcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBpbnQgb3AsIGludCBjbWQsCisJCQl1NjQgaW5fcGFyYW0sIHU2NCAqb3V0X3BhcmFtKQoreworCWludCBjcW47CisJaW50IGVycjsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIFJFU19PUF9SRVNFUlZFX0FORF9NQVA6CisJCWVyciA9IF9fbWx4NF9jcV9hbGxvY19pY20oZGV2LCAmY3FuKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCWVyciA9IGFkZF9yZXNfcmFuZ2UoZGV2LCBzbGF2ZSwgY3FuLCAxLCBSRVNfQ1EsIDApOworCQlpZiAoZXJyKSB7CisJCQlfX21seDRfY3FfZnJlZV9pY20oZGV2LCBjcW4pOworCQkJYnJlYWs7CisJCX0KKworCQlzZXRfcGFyYW1fbChvdXRfcGFyYW0sIGNxbik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNycV9hbGxvY19yZXMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgaW50IG9wLCBpbnQgY21kLAorCQkJIHU2NCBpbl9wYXJhbSwgdTY0ICpvdXRfcGFyYW0pCit7CisJaW50IHNycW47CisJaW50IGVycjsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIFJFU19PUF9SRVNFUlZFX0FORF9NQVA6CisJCWVyciA9IF9fbWx4NF9zcnFfYWxsb2NfaWNtKGRldiwgJnNycW4pOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisKKwkJZXJyID0gYWRkX3Jlc19yYW5nZShkZXYsIHNsYXZlLCBzcnFuLCAxLCBSRVNfU1JRLCAwKTsKKwkJaWYgKGVycikgeworCQkJX19tbHg0X3NycV9mcmVlX2ljbShkZXYsIHNycW4pOworCQkJYnJlYWs7CisJCX0KKworCQlzZXRfcGFyYW1fbChvdXRfcGFyYW0sIHNycW4pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtYWNfYWRkX3RvX3NsYXZlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsIHU2NCBtYWMsIGludCBwb3J0KQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9yZXNvdXJjZV90cmFja2VyICp0cmFja2VyID0gJnByaXYtPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlcjsKKwlzdHJ1Y3QgbWFjX3JlcyAqcmVzOworCisJcmVzID0ga3phbGxvYyhzaXplb2YgKnJlcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PTUVNOworCXJlcy0+bWFjID0gbWFjOworCXJlcy0+cG9ydCA9ICh1OCkgcG9ydDsKKwlsaXN0X2FkZF90YWlsKCZyZXMtPmxpc3QsCisJCSAgICAgICZ0cmFja2VyLT5zbGF2ZV9saXN0W3NsYXZlXS5yZXNfbGlzdFtSRVNfTUFDXSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1hY19kZWxfZnJvbV9zbGF2ZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCB1NjQgbWFjLAorCQkJICAgICAgIGludCBwb3J0KQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9yZXNvdXJjZV90cmFja2VyICp0cmFja2VyID0gJnByaXYtPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICptYWNfbGlzdCA9CisJCSZ0cmFja2VyLT5zbGF2ZV9saXN0W3NsYXZlXS5yZXNfbGlzdFtSRVNfTUFDXTsKKwlzdHJ1Y3QgbWFjX3JlcyAqcmVzLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcywgdG1wLCBtYWNfbGlzdCwgbGlzdCkgeworCQlpZiAocmVzLT5tYWMgPT0gbWFjICYmIHJlcy0+cG9ydCA9PSAodTgpIHBvcnQpIHsKKwkJCWxpc3RfZGVsKCZyZXMtPmxpc3QpOworCQkJa2ZyZWUocmVzKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCByZW1fc2xhdmVfbWFjcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9yZXNvdXJjZV90cmFja2VyICp0cmFja2VyID0gJnByaXYtPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICptYWNfbGlzdCA9CisJCSZ0cmFja2VyLT5zbGF2ZV9saXN0W3NsYXZlXS5yZXNfbGlzdFtSRVNfTUFDXTsKKwlzdHJ1Y3QgbWFjX3JlcyAqcmVzLCAqdG1wOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcywgdG1wLCBtYWNfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmcmVzLT5saXN0KTsKKwkJX19tbHg0X3VucmVnaXN0ZXJfbWFjKGRldiwgcmVzLT5wb3J0LCByZXMtPm1hYyk7CisJCWtmcmVlKHJlcyk7CisJfQorfQorCitzdGF0aWMgaW50IG1hY19hbGxvY19yZXMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgaW50IG9wLCBpbnQgY21kLAorCQkJIHU2NCBpbl9wYXJhbSwgdTY0ICpvdXRfcGFyYW0pCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJaW50IHBvcnQ7CisJdTY0IG1hYzsKKworCWlmIChvcCAhPSBSRVNfT1BfUkVTRVJWRV9BTkRfTUFQKQorCQlyZXR1cm4gZXJyOworCisJcG9ydCA9IGdldF9wYXJhbV9sKG91dF9wYXJhbSk7CisJbWFjID0gaW5fcGFyYW07CisKKwllcnIgPSBfX21seDRfcmVnaXN0ZXJfbWFjKGRldiwgcG9ydCwgbWFjKTsKKwlpZiAoZXJyID49IDApIHsKKwkJc2V0X3BhcmFtX2wob3V0X3BhcmFtLCBlcnIpOworCQllcnIgPSAwOworCX0KKworCWlmICghZXJyKSB7CisJCWVyciA9IG1hY19hZGRfdG9fc2xhdmUoZGV2LCBzbGF2ZSwgbWFjLCBwb3J0KTsKKwkJaWYgKGVycikKKwkJCV9fbWx4NF91bnJlZ2lzdGVyX21hYyhkZXYsIHBvcnQsIG1hYyk7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdmxhbl9hbGxvY19yZXMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgaW50IG9wLCBpbnQgY21kLAorCQkJIHU2NCBpbl9wYXJhbSwgdTY0ICpvdXRfcGFyYW0pCit7CisJcmV0dXJuIDA7Cit9CisKK2ludCBtbHg0X0FMTE9DX1JFU193cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVycjsKKwlpbnQgYWxvcCA9IHZoY3ItPm9wX21vZGlmaWVyOworCisJc3dpdGNoICh2aGNyLT5pbl9tb2RpZmllcikgeworCWNhc2UgUkVTX1FQOgorCQllcnIgPSBxcF9hbGxvY19yZXMoZGV2LCBzbGF2ZSwgdmhjci0+b3BfbW9kaWZpZXIsIGFsb3AsCisJCQkJICAgdmhjci0+aW5fcGFyYW0sICZ2aGNyLT5vdXRfcGFyYW0pOworCQlicmVhazsKKworCWNhc2UgUkVTX01UVDoKKwkJZXJyID0gbXR0X2FsbG9jX3JlcyhkZXYsIHNsYXZlLCB2aGNyLT5vcF9tb2RpZmllciwgYWxvcCwKKwkJCQkgICAgdmhjci0+aW5fcGFyYW0sICZ2aGNyLT5vdXRfcGFyYW0pOworCQlicmVhazsKKworCWNhc2UgUkVTX01QVDoKKwkJZXJyID0gbXB0X2FsbG9jX3JlcyhkZXYsIHNsYXZlLCB2aGNyLT5vcF9tb2RpZmllciwgYWxvcCwKKwkJCQkgICAgdmhjci0+aW5fcGFyYW0sICZ2aGNyLT5vdXRfcGFyYW0pOworCQlicmVhazsKKworCWNhc2UgUkVTX0NROgorCQllcnIgPSBjcV9hbGxvY19yZXMoZGV2LCBzbGF2ZSwgdmhjci0+b3BfbW9kaWZpZXIsIGFsb3AsCisJCQkJICAgdmhjci0+aW5fcGFyYW0sICZ2aGNyLT5vdXRfcGFyYW0pOworCQlicmVhazsKKworCWNhc2UgUkVTX1NSUToKKwkJZXJyID0gc3JxX2FsbG9jX3JlcyhkZXYsIHNsYXZlLCB2aGNyLT5vcF9tb2RpZmllciwgYWxvcCwKKwkJCQkgICAgdmhjci0+aW5fcGFyYW0sICZ2aGNyLT5vdXRfcGFyYW0pOworCQlicmVhazsKKworCWNhc2UgUkVTX01BQzoKKwkJZXJyID0gbWFjX2FsbG9jX3JlcyhkZXYsIHNsYXZlLCB2aGNyLT5vcF9tb2RpZmllciwgYWxvcCwKKwkJCQkgICAgdmhjci0+aW5fcGFyYW0sICZ2aGNyLT5vdXRfcGFyYW0pOworCQlicmVhazsKKworCWNhc2UgUkVTX1ZMQU46CisJCWVyciA9IHZsYW5fYWxsb2NfcmVzKGRldiwgc2xhdmUsIHZoY3ItPm9wX21vZGlmaWVyLCBhbG9wLAorCQkJCSAgICB2aGNyLT5pbl9wYXJhbSwgJnZoY3ItPm91dF9wYXJhbSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBxcF9mcmVlX3JlcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBpbnQgb3AsIGludCBjbWQsCisJCSAgICAgICB1NjQgaW5fcGFyYW0pCit7CisJaW50IGVycjsKKwlpbnQgY291bnQ7CisJaW50IGJhc2U7CisJaW50IHFwbjsKKworCXN3aXRjaCAob3ApIHsKKwljYXNlIFJFU19PUF9SRVNFUlZFOgorCQliYXNlID0gZ2V0X3BhcmFtX2woJmluX3BhcmFtKSAmIDB4N2ZmZmZmOworCQljb3VudCA9IGdldF9wYXJhbV9oKCZpbl9wYXJhbSk7CisJCWVyciA9IHJlbV9yZXNfcmFuZ2UoZGV2LCBzbGF2ZSwgYmFzZSwgY291bnQsIFJFU19RUCwgMCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwkJX19tbHg0X3FwX3JlbGVhc2VfcmFuZ2UoZGV2LCBiYXNlLCBjb3VudCk7CisJCWJyZWFrOworCWNhc2UgUkVTX09QX01BUF9JQ006CisJCXFwbiA9IGdldF9wYXJhbV9sKCZpbl9wYXJhbSkgJiAweDdmZmZmZjsKKwkJZXJyID0gcXBfcmVzX3N0YXJ0X21vdmVfdG8oZGV2LCBzbGF2ZSwgcXBuLCBSRVNfUVBfUkVTRVJWRUQsCisJCQkJCSAgIE5VTEwsIDApOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKworCQlpZiAoIXZhbGlkX3Jlc2VydmVkKGRldiwgc2xhdmUsIHFwbikpCisJCQlfX21seDRfcXBfZnJlZV9pY20oZGV2LCBxcG4pOworCisJCXJlc19lbmRfbW92ZShkZXYsIHNsYXZlLCBSRVNfUVAsIHFwbik7CisKKwkJaWYgKHZhbGlkX3Jlc2VydmVkKGRldiwgc2xhdmUsIHFwbikpCisJCQllcnIgPSByZW1fcmVzX3JhbmdlKGRldiwgc2xhdmUsIHFwbiwgMSwgUkVTX1FQLCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgbXR0X2ZyZWVfcmVzKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsIGludCBvcCwgaW50IGNtZCwKKwkJCXU2NCBpbl9wYXJhbSwgdTY0ICpvdXRfcGFyYW0pCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJaW50IGJhc2U7CisJaW50IG9yZGVyOworCisJaWYgKG9wICE9IFJFU19PUF9SRVNFUlZFX0FORF9NQVApCisJCXJldHVybiBlcnI7CisKKwliYXNlID0gZ2V0X3BhcmFtX2woJmluX3BhcmFtKTsKKwlvcmRlciA9IGdldF9wYXJhbV9oKCZpbl9wYXJhbSk7CisJZXJyID0gcmVtX3Jlc19yYW5nZShkZXYsIHNsYXZlLCBiYXNlLCAxLCBSRVNfTVRULCBvcmRlcik7CisJaWYgKCFlcnIpCisJCV9fbWx4NF9mcmVlX210dF9yYW5nZShkZXYsIGJhc2UsIG9yZGVyKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG1wdF9mcmVlX3JlcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBpbnQgb3AsIGludCBjbWQsCisJCQl1NjQgaW5fcGFyYW0pCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJaW50IGluZGV4OworCWludCBpZDsKKwlzdHJ1Y3QgcmVzX21wdCAqbXB0OworCisJc3dpdGNoIChvcCkgeworCWNhc2UgUkVTX09QX1JFU0VSVkU6CisJCWluZGV4ID0gZ2V0X3BhcmFtX2woJmluX3BhcmFtKTsKKwkJaWQgPSBpbmRleCAmIG1wdF9tYXNrKGRldik7CisJCWVyciA9IGdldF9yZXMoZGV2LCBzbGF2ZSwgaWQsIFJFU19NUFQsICZtcHQpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCWluZGV4ID0gbXB0LT5rZXk7CisJCXB1dF9yZXMoZGV2LCBzbGF2ZSwgaWQsIFJFU19NUFQpOworCisJCWVyciA9IHJlbV9yZXNfcmFuZ2UoZGV2LCBzbGF2ZSwgaWQsIDEsIFJFU19NUFQsIDApOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisJCV9fbWx4NF9tcl9yZWxlYXNlKGRldiwgaW5kZXgpOworCQlicmVhazsKKwljYXNlIFJFU19PUF9NQVBfSUNNOgorCQkJaW5kZXggPSBnZXRfcGFyYW1fbCgmaW5fcGFyYW0pOworCQkJaWQgPSBpbmRleCAmIG1wdF9tYXNrKGRldik7CisJCQllcnIgPSBtcl9yZXNfc3RhcnRfbW92ZV90byhkZXYsIHNsYXZlLCBpZCwKKwkJCQkJCSAgIFJFU19NUFRfUkVTRVJWRUQsICZtcHQpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCisJCQlfX21seDRfbXJfZnJlZV9pY20oZGV2LCBtcHQtPmtleSk7CisJCQlyZXNfZW5kX21vdmUoZGV2LCBzbGF2ZSwgUkVTX01QVCwgaWQpOworCQkJcmV0dXJuIGVycjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3FfZnJlZV9yZXMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgaW50IG9wLCBpbnQgY21kLAorCQkgICAgICAgdTY0IGluX3BhcmFtLCB1NjQgKm91dF9wYXJhbSkKK3sKKwlpbnQgY3FuOworCWludCBlcnI7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBSRVNfT1BfUkVTRVJWRV9BTkRfTUFQOgorCQljcW4gPSBnZXRfcGFyYW1fbCgmaW5fcGFyYW0pOworCQllcnIgPSByZW1fcmVzX3JhbmdlKGRldiwgc2xhdmUsIGNxbiwgMSwgUkVTX0NRLCAwKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCV9fbWx4NF9jcV9mcmVlX2ljbShkZXYsIGNxbik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBzcnFfZnJlZV9yZXMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgaW50IG9wLCBpbnQgY21kLAorCQkJdTY0IGluX3BhcmFtLCB1NjQgKm91dF9wYXJhbSkKK3sKKwlpbnQgc3JxbjsKKwlpbnQgZXJyOworCisJc3dpdGNoIChvcCkgeworCWNhc2UgUkVTX09QX1JFU0VSVkVfQU5EX01BUDoKKwkJc3JxbiA9IGdldF9wYXJhbV9sKCZpbl9wYXJhbSk7CisJCWVyciA9IHJlbV9yZXNfcmFuZ2UoZGV2LCBzbGF2ZSwgc3JxbiwgMSwgUkVTX1NSUSwgMCk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKworCQlfX21seDRfc3JxX2ZyZWVfaWNtKGRldiwgc3Jxbik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtYWNfZnJlZV9yZXMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgaW50IG9wLCBpbnQgY21kLAorCQkJICAgIHU2NCBpbl9wYXJhbSwgdTY0ICpvdXRfcGFyYW0pCit7CisJaW50IHBvcnQ7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKG9wKSB7CisJY2FzZSBSRVNfT1BfUkVTRVJWRV9BTkRfTUFQOgorCQlwb3J0ID0gZ2V0X3BhcmFtX2wob3V0X3BhcmFtKTsKKwkJbWFjX2RlbF9mcm9tX3NsYXZlKGRldiwgc2xhdmUsIGluX3BhcmFtLCBwb3J0KTsKKwkJX19tbHg0X3VucmVnaXN0ZXJfbWFjKGRldiwgcG9ydCwgaW5fcGFyYW0pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnIgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworCit9CisKK3N0YXRpYyBpbnQgdmxhbl9mcmVlX3JlcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBpbnQgb3AsIGludCBjbWQsCisJCQkgICAgdTY0IGluX3BhcmFtLCB1NjQgKm91dF9wYXJhbSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IG1seDRfRlJFRV9SRVNfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVyciA9IC1FSU5WQUw7CisJaW50IGFsb3AgPSB2aGNyLT5vcF9tb2RpZmllcjsKKworCXN3aXRjaCAodmhjci0+aW5fbW9kaWZpZXIpIHsKKwljYXNlIFJFU19RUDoKKwkJZXJyID0gcXBfZnJlZV9yZXMoZGV2LCBzbGF2ZSwgdmhjci0+b3BfbW9kaWZpZXIsIGFsb3AsCisJCQkJICB2aGNyLT5pbl9wYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBSRVNfTVRUOgorCQllcnIgPSBtdHRfZnJlZV9yZXMoZGV2LCBzbGF2ZSwgdmhjci0+b3BfbW9kaWZpZXIsIGFsb3AsCisJCQkJICAgdmhjci0+aW5fcGFyYW0sICZ2aGNyLT5vdXRfcGFyYW0pOworCQlicmVhazsKKworCWNhc2UgUkVTX01QVDoKKwkJZXJyID0gbXB0X2ZyZWVfcmVzKGRldiwgc2xhdmUsIHZoY3ItPm9wX21vZGlmaWVyLCBhbG9wLAorCQkJCSAgIHZoY3ItPmluX3BhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIFJFU19DUToKKwkJZXJyID0gY3FfZnJlZV9yZXMoZGV2LCBzbGF2ZSwgdmhjci0+b3BfbW9kaWZpZXIsIGFsb3AsCisJCQkJICB2aGNyLT5pbl9wYXJhbSwgJnZoY3ItPm91dF9wYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBSRVNfU1JROgorCQllcnIgPSBzcnFfZnJlZV9yZXMoZGV2LCBzbGF2ZSwgdmhjci0+b3BfbW9kaWZpZXIsIGFsb3AsCisJCQkJICAgdmhjci0+aW5fcGFyYW0sICZ2aGNyLT5vdXRfcGFyYW0pOworCQlicmVhazsKKworCWNhc2UgUkVTX01BQzoKKwkJZXJyID0gbWFjX2ZyZWVfcmVzKGRldiwgc2xhdmUsIHZoY3ItPm9wX21vZGlmaWVyLCBhbG9wLAorCQkJCSAgIHZoY3ItPmluX3BhcmFtLCAmdmhjci0+b3V0X3BhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIFJFU19WTEFOOgorCQllcnIgPSB2bGFuX2ZyZWVfcmVzKGRldiwgc2xhdmUsIHZoY3ItPm9wX21vZGlmaWVyLCBhbG9wLAorCQkJCSAgIHZoY3ItPmluX3BhcmFtLCAmdmhjci0+b3V0X3BhcmFtKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIGVycjsKK30KKworLyogdWdseSBidXQgb3RoZXIgY2hvaWNlcyBhcmUgdWdsaWVyICovCitzdGF0aWMgaW50IG1yX3BoeXNfbXB0KHN0cnVjdCBtbHg0X21wdF9lbnRyeSAqbXB0KQoreworCXJldHVybiAoYmUzMl90b19jcHUobXB0LT5mbGFncykgPj4gOSkgJiAxOworfQorCitzdGF0aWMgaW50IG1yX2dldF9tdHRfYWRkcihzdHJ1Y3QgbWx4NF9tcHRfZW50cnkgKm1wdCkKK3sKKwlyZXR1cm4gKGludCliZTY0X3RvX2NwdShtcHQtPm10dF9hZGRyKSAmIDB4ZmZmZmZmZjg7Cit9CisKK3N0YXRpYyBpbnQgbXJfZ2V0X210dF9zaXplKHN0cnVjdCBtbHg0X21wdF9lbnRyeSAqbXB0KQoreworCXJldHVybiBiZTMyX3RvX2NwdShtcHQtPm10dF9zeik7Cit9CisKK3N0YXRpYyBpbnQgbXJfZ2V0X3BkbihzdHJ1Y3QgbWx4NF9tcHRfZW50cnkgKm1wdCkKK3sKKwlyZXR1cm4gYmUzMl90b19jcHUobXB0LT5wZF9mbGFncykgJiAweGZmZmZmZjsKK30KKworc3RhdGljIGludCBxcF9nZXRfbXR0X2FkZHIoc3RydWN0IG1seDRfcXBfY29udGV4dCAqcXBjKQoreworCXJldHVybiBiZTMyX3RvX2NwdShxcGMtPm10dF9iYXNlX2FkZHJfbCkgJiAweGZmZmZmZmY4OworfQorCitzdGF0aWMgaW50IHNycV9nZXRfbXR0X2FkZHIoc3RydWN0IG1seDRfc3JxX2NvbnRleHQgKnNycWMpCit7CisJcmV0dXJuIGJlMzJfdG9fY3B1KHNycWMtPm10dF9iYXNlX2FkZHJfbCkgJiAweGZmZmZmZmY4OworfQorCitzdGF0aWMgaW50IHFwX2dldF9tdHRfc2l6ZShzdHJ1Y3QgbWx4NF9xcF9jb250ZXh0ICpxcGMpCit7CisJaW50IHBhZ2Vfc2hpZnQgPSAocXBjLT5sb2dfcGFnZV9zaXplICYgMHgzZikgKyAxMjsKKwlpbnQgbG9nX3NxX3NpemUgPSAocXBjLT5zcV9zaXplX3N0cmlkZSA+PiAzKSAmIDB4ZjsKKwlpbnQgbG9nX3NxX3NyaWRlID0gcXBjLT5zcV9zaXplX3N0cmlkZSAmIDc7CisJaW50IGxvZ19ycV9zaXplID0gKHFwYy0+cnFfc2l6ZV9zdHJpZGUgPj4gMykgJiAweGY7CisJaW50IGxvZ19ycV9zdHJpZGUgPSBxcGMtPnJxX3NpemVfc3RyaWRlICYgNzsKKwlpbnQgc3JxID0gKGJlMzJfdG9fY3B1KHFwYy0+c3JxbikgPj4gMjQpICYgMTsKKwlpbnQgcnNzID0gKGJlMzJfdG9fY3B1KHFwYy0+ZmxhZ3MpID4+IDEzKSAmIDE7CisJaW50IHhyYyA9IChiZTMyX3RvX2NwdShxcGMtPmxvY2FsX3FwbikgPj4gMjMpICYgMTsKKwlpbnQgc3Ffc2l6ZTsKKwlpbnQgcnFfc2l6ZTsKKwlpbnQgdG90YWxfcGFnZXM7CisJaW50IHRvdGFsX21lbTsKKwlpbnQgcGFnZV9vZmZzZXQgPSAoYmUzMl90b19jcHUocXBjLT5wYXJhbXMyKSA+PiA2KSAmIDB4M2Y7CisKKwlzcV9zaXplID0gMSA8PCAobG9nX3NxX3NpemUgKyBsb2dfc3Ffc3JpZGUgKyA0KTsKKwlycV9zaXplID0gKHNycXxyc3N8eHJjKSA/IDAgOiAoMSA8PCAobG9nX3JxX3NpemUgKyBsb2dfcnFfc3RyaWRlICsgNCkpOworCXRvdGFsX21lbSA9IHNxX3NpemUgKyBycV9zaXplOworCXRvdGFsX3BhZ2VzID0KKwkJcm91bmR1cF9wb3dfb2ZfdHdvKCh0b3RhbF9tZW0gKyAocGFnZV9vZmZzZXQgPDwgNikpID4+CisJCQkJICAgcGFnZV9zaGlmdCk7CisKKwlyZXR1cm4gdG90YWxfcGFnZXM7Cit9CisKK3N0YXRpYyBpbnQgcXBfZ2V0X3BkbihzdHJ1Y3QgbWx4NF9xcF9jb250ZXh0ICpxcGMpCit7CisJcmV0dXJuIGJlMzJfdG9fY3B1KHFwYy0+cGQpICYgMHhmZmZmZmY7Cit9CisKK3N0YXRpYyBpbnQgcGRuMnNsYXZlKGludCBwZG4pCit7CisJcmV0dXJuIChwZG4gPj4gTk9UX01BU0tFRF9QRF9CSVRTKSAtIDE7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfbXR0X3JhbmdlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsIGludCBzdGFydCwKKwkJCSAgIGludCBzaXplLCBzdHJ1Y3QgcmVzX210dCAqbXR0KQoreworCWludCByZXNfc3RhcnQgPSBtdHQtPmNvbS5yZXNfaWQ7CisJaW50IHJlc19zaXplID0gKDEgPDwgbXR0LT5vcmRlcik7CisKKwlpZiAoc3RhcnQgPCByZXNfc3RhcnQgfHwgc3RhcnQgKyBzaXplID4gcmVzX3N0YXJ0ICsgcmVzX3NpemUpCisJCXJldHVybiAtRVBFUk07CisJcmV0dXJuIDA7Cit9CisKK2ludCBtbHg0X1NXMkhXX01QVF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVycjsKKwlpbnQgaW5kZXggPSB2aGNyLT5pbl9tb2RpZmllcjsKKwlzdHJ1Y3QgcmVzX210dCAqbXR0OworCXN0cnVjdCByZXNfbXB0ICptcHQ7CisJaW50IG10dF9iYXNlID0gbXJfZ2V0X210dF9hZGRyKGluYm94LT5idWYpIC8gZGV2LT5jYXBzLm10dF9lbnRyeV9zejsKKwlpbnQgcGh5czsKKwlpbnQgaWQ7CisKKwlpZCA9IGluZGV4ICYgbXB0X21hc2soZGV2KTsKKwllcnIgPSBtcl9yZXNfc3RhcnRfbW92ZV90byhkZXYsIHNsYXZlLCBpZCwgUkVTX01QVF9IVywgJm1wdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXBoeXMgPSBtcl9waHlzX21wdChpbmJveC0+YnVmKTsKKwlpZiAoIXBoeXMpIHsKKwkJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCBtdHRfYmFzZSwgUkVTX01UVCwgJm10dCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4X2Fib3J0OworCisJCWVyciA9IGNoZWNrX210dF9yYW5nZShkZXYsIHNsYXZlLCBtdHRfYmFzZSwKKwkJCQkgICAgICBtcl9nZXRfbXR0X3NpemUoaW5ib3gtPmJ1ZiksIG10dCk7CisJCWlmIChlcnIpCisJCQlnb3RvIGV4X3B1dDsKKworCQltcHQtPm10dCA9IG10dDsKKwl9CisKKwlpZiAocGRuMnNsYXZlKG1yX2dldF9wZG4oaW5ib3gtPmJ1ZikpICE9IHNsYXZlKSB7CisJCWVyciA9IC1FUEVSTTsKKwkJZ290byBleF9wdXQ7CisJfQorCisJZXJyID0gbWx4NF9ETUFfd3JhcHBlcihkZXYsIHNsYXZlLCB2aGNyLCBpbmJveCwgb3V0Ym94LCBjbWQpOworCWlmIChlcnIpCisJCWdvdG8gZXhfcHV0OworCisJaWYgKCFwaHlzKSB7CisJCWF0b21pY19pbmMoJm10dC0+cmVmX2NvdW50KTsKKwkJcHV0X3JlcyhkZXYsIHNsYXZlLCBtdHQtPmNvbS5yZXNfaWQsIFJFU19NVFQpOworCX0KKworCXJlc19lbmRfbW92ZShkZXYsIHNsYXZlLCBSRVNfTVBULCBpZCk7CisJcmV0dXJuIDA7CisKK2V4X3B1dDoKKwlpZiAoIXBoeXMpCisJCXB1dF9yZXMoZGV2LCBzbGF2ZSwgbXR0LT5jb20ucmVzX2lkLCBSRVNfTVRUKTsKK2V4X2Fib3J0OgorCXJlc19hYm9ydF9tb3ZlKGRldiwgc2xhdmUsIFJFU19NUFQsIGlkKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X0hXMlNXX01QVF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVycjsKKwlpbnQgaW5kZXggPSB2aGNyLT5pbl9tb2RpZmllcjsKKwlzdHJ1Y3QgcmVzX21wdCAqbXB0OworCWludCBpZDsKKworCWlkID0gaW5kZXggJiBtcHRfbWFzayhkZXYpOworCWVyciA9IG1yX3Jlc19zdGFydF9tb3ZlX3RvKGRldiwgc2xhdmUsIGlkLCBSRVNfTVBUX01BUFBFRCwgJm1wdCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWVyciA9IG1seDRfRE1BX3dyYXBwZXIoZGV2LCBzbGF2ZSwgdmhjciwgaW5ib3gsIG91dGJveCwgY21kKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4X2Fib3J0OworCisJaWYgKG1wdC0+bXR0KQorCQlhdG9taWNfZGVjKCZtcHQtPm10dC0+cmVmX2NvdW50KTsKKworCXJlc19lbmRfbW92ZShkZXYsIHNsYXZlLCBSRVNfTVBULCBpZCk7CisJcmV0dXJuIDA7CisKK2V4X2Fib3J0OgorCXJlc19hYm9ydF9tb3ZlKGRldiwgc2xhdmUsIFJFU19NUFQsIGlkKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X1FVRVJZX01QVF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVycjsKKwlpbnQgaW5kZXggPSB2aGNyLT5pbl9tb2RpZmllcjsKKwlzdHJ1Y3QgcmVzX21wdCAqbXB0OworCWludCBpZDsKKworCWlkID0gaW5kZXggJiBtcHRfbWFzayhkZXYpOworCWVyciA9IGdldF9yZXMoZGV2LCBzbGF2ZSwgaWQsIFJFU19NUFQsICZtcHQpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlpZiAobXB0LT5jb20uZnJvbV9zdGF0ZSAhPSBSRVNfTVBUX0hXKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJZXJyID0gbWx4NF9ETUFfd3JhcHBlcihkZXYsIHNsYXZlLCB2aGNyLCBpbmJveCwgb3V0Ym94LCBjbWQpOworCitvdXQ6CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBpZCwgUkVTX01QVCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBxcF9nZXRfcmNxbihzdHJ1Y3QgbWx4NF9xcF9jb250ZXh0ICpxcGMpCit7CisJcmV0dXJuIGJlMzJfdG9fY3B1KHFwYy0+Y3FuX3JlY3YpICYgMHhmZmZmZmY7Cit9CisKK3N0YXRpYyBpbnQgcXBfZ2V0X3NjcW4oc3RydWN0IG1seDRfcXBfY29udGV4dCAqcXBjKQoreworCXJldHVybiBiZTMyX3RvX2NwdShxcGMtPmNxbl9zZW5kKSAmIDB4ZmZmZmZmOworfQorCitzdGF0aWMgdTMyIHFwX2dldF9zcnFuKHN0cnVjdCBtbHg0X3FwX2NvbnRleHQgKnFwYykKK3sKKwlyZXR1cm4gYmUzMl90b19jcHUocXBjLT5zcnFuKSAmIDB4MWZmZmZmZjsKK30KKworaW50IG1seDRfUlNUMklOSVRfUVBfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVycjsKKwlpbnQgcXBuID0gdmhjci0+aW5fbW9kaWZpZXIgJiAweDdmZmZmZjsKKwlzdHJ1Y3QgcmVzX210dCAqbXR0OworCXN0cnVjdCByZXNfcXAgKnFwOworCXN0cnVjdCBtbHg0X3FwX2NvbnRleHQgKnFwYyA9IGluYm94LT5idWYgKyA4OworCWludCBtdHRfYmFzZSA9IHFwX2dldF9tdHRfYWRkcihxcGMpIC8gZGV2LT5jYXBzLm10dF9lbnRyeV9zejsKKwlpbnQgbXR0X3NpemUgPSBxcF9nZXRfbXR0X3NpemUocXBjKTsKKwlzdHJ1Y3QgcmVzX2NxICpyY3E7CisJc3RydWN0IHJlc19jcSAqc2NxOworCWludCByY3FuID0gcXBfZ2V0X3JjcW4ocXBjKTsKKwlpbnQgc2NxbiA9IHFwX2dldF9zY3FuKHFwYyk7CisJdTMyIHNycW4gPSBxcF9nZXRfc3JxbihxcGMpICYgMHhmZmZmZmY7CisJaW50IHVzZV9zcnEgPSAocXBfZ2V0X3NycW4ocXBjKSA+PiAyNCkgJiAxOworCXN0cnVjdCByZXNfc3JxICpzcnE7CisJaW50IGxvY2FsX3FwbiA9IGJlMzJfdG9fY3B1KHFwYy0+bG9jYWxfcXBuKSAmIDB4ZmZmZmZmOworCisJZXJyID0gcXBfcmVzX3N0YXJ0X21vdmVfdG8oZGV2LCBzbGF2ZSwgcXBuLCBSRVNfUVBfSFcsICZxcCwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlxcC0+bG9jYWxfcXBuID0gbG9jYWxfcXBuOworCisJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCBtdHRfYmFzZSwgUkVTX01UVCwgJm10dCk7CisJaWYgKGVycikKKwkJZ290byBleF9hYm9ydDsKKworCWVyciA9IGNoZWNrX210dF9yYW5nZShkZXYsIHNsYXZlLCBtdHRfYmFzZSwgbXR0X3NpemUsIG10dCk7CisJaWYgKGVycikKKwkJZ290byBleF9wdXRfbXR0OworCisJaWYgKHBkbjJzbGF2ZShxcF9nZXRfcGRuKHFwYykpICE9IHNsYXZlKSB7CisJCWVyciA9IC1FUEVSTTsKKwkJZ290byBleF9wdXRfbXR0OworCX0KKworCWVyciA9IGdldF9yZXMoZGV2LCBzbGF2ZSwgcmNxbiwgUkVTX0NRLCAmcmNxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4X3B1dF9tdHQ7CisKKwlpZiAoc2NxbiAhPSByY3FuKSB7CisJCWVyciA9IGdldF9yZXMoZGV2LCBzbGF2ZSwgc2NxbiwgUkVTX0NRLCAmc2NxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXhfcHV0X3JjcTsKKwl9IGVsc2UKKwkJc2NxID0gcmNxOworCisJaWYgKHVzZV9zcnEpIHsKKwkJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCBzcnFuLCBSRVNfU1JRLCAmc3JxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXhfcHV0X3NjcTsKKwl9CisKKwllcnIgPSBtbHg0X0RNQV93cmFwcGVyKGRldiwgc2xhdmUsIHZoY3IsIGluYm94LCBvdXRib3gsIGNtZCk7CisJaWYgKGVycikKKwkJZ290byBleF9wdXRfc3JxOworCWF0b21pY19pbmMoJm10dC0+cmVmX2NvdW50KTsKKwlxcC0+bXR0ID0gbXR0OworCWF0b21pY19pbmMoJnJjcS0+cmVmX2NvdW50KTsKKwlxcC0+cmNxID0gcmNxOworCWF0b21pY19pbmMoJnNjcS0+cmVmX2NvdW50KTsKKwlxcC0+c2NxID0gc2NxOworCisJaWYgKHNjcW4gIT0gcmNxbikKKwkJcHV0X3JlcyhkZXYsIHNsYXZlLCBzY3FuLCBSRVNfQ1EpOworCisJaWYgKHVzZV9zcnEpIHsKKwkJYXRvbWljX2luYygmc3JxLT5yZWZfY291bnQpOworCQlwdXRfcmVzKGRldiwgc2xhdmUsIHNycW4sIFJFU19TUlEpOworCQlxcC0+c3JxID0gc3JxOworCX0KKwlwdXRfcmVzKGRldiwgc2xhdmUsIHJjcW4sIFJFU19DUSk7CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBtdHRfYmFzZSwgUkVTX01UVCk7CisJcmVzX2VuZF9tb3ZlKGRldiwgc2xhdmUsIFJFU19RUCwgcXBuKTsKKworCXJldHVybiAwOworCitleF9wdXRfc3JxOgorCWlmICh1c2Vfc3JxKQorCQlwdXRfcmVzKGRldiwgc2xhdmUsIHNycW4sIFJFU19TUlEpOworZXhfcHV0X3NjcToKKwlpZiAoc2NxbiAhPSByY3FuKQorCQlwdXRfcmVzKGRldiwgc2xhdmUsIHNjcW4sIFJFU19DUSk7CitleF9wdXRfcmNxOgorCXB1dF9yZXMoZGV2LCBzbGF2ZSwgcmNxbiwgUkVTX0NRKTsKK2V4X3B1dF9tdHQ6CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBtdHRfYmFzZSwgUkVTX01UVCk7CitleF9hYm9ydDoKKwlyZXNfYWJvcnRfbW92ZShkZXYsIHNsYXZlLCBSRVNfUVAsIHFwbik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGVxX2dldF9tdHRfYWRkcihzdHJ1Y3QgbWx4NF9lcV9jb250ZXh0ICplcWMpCit7CisJcmV0dXJuIGJlMzJfdG9fY3B1KGVxYy0+bXR0X2Jhc2VfYWRkcl9sKSAmIDB4ZmZmZmZmZjg7Cit9CisKK3N0YXRpYyBpbnQgZXFfZ2V0X210dF9zaXplKHN0cnVjdCBtbHg0X2VxX2NvbnRleHQgKmVxYykKK3sKKwlpbnQgbG9nX2VxX3NpemUgPSBlcWMtPmxvZ19lcV9zaXplICYgMHgxZjsKKwlpbnQgcGFnZV9zaGlmdCA9IChlcWMtPmxvZ19wYWdlX3NpemUgJiAweDNmKSArIDEyOworCisJaWYgKGxvZ19lcV9zaXplICsgNSA8IHBhZ2Vfc2hpZnQpCisJCXJldHVybiAxOworCisJcmV0dXJuIDEgPDwgKGxvZ19lcV9zaXplICsgNSAtIHBhZ2Vfc2hpZnQpOworfQorCitzdGF0aWMgaW50IGNxX2dldF9tdHRfYWRkcihzdHJ1Y3QgbWx4NF9jcV9jb250ZXh0ICpjcWMpCit7CisJcmV0dXJuIGJlMzJfdG9fY3B1KGNxYy0+bXR0X2Jhc2VfYWRkcl9sKSAmIDB4ZmZmZmZmZjg7Cit9CisKK3N0YXRpYyBpbnQgY3FfZ2V0X210dF9zaXplKHN0cnVjdCBtbHg0X2NxX2NvbnRleHQgKmNxYykKK3sKKwlpbnQgbG9nX2NxX3NpemUgPSAoYmUzMl90b19jcHUoY3FjLT5sb2dzaXplX3VzcnBhZ2UpID4+IDI0KSAmIDB4MWY7CisJaW50IHBhZ2Vfc2hpZnQgPSAoY3FjLT5sb2dfcGFnZV9zaXplICYgMHgzZikgKyAxMjsKKworCWlmIChsb2dfY3Ffc2l6ZSArIDUgPCBwYWdlX3NoaWZ0KQorCQlyZXR1cm4gMTsKKworCXJldHVybiAxIDw8IChsb2dfY3Ffc2l6ZSArIDUgLSBwYWdlX3NoaWZ0KTsKK30KKworaW50IG1seDRfU1cySFdfRVFfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVycjsKKwlpbnQgZXFuID0gdmhjci0+aW5fbW9kaWZpZXI7CisJaW50IHJlc19pZCA9IChzbGF2ZSA8PCA4KSB8IGVxbjsKKwlzdHJ1Y3QgbWx4NF9lcV9jb250ZXh0ICplcWMgPSBpbmJveC0+YnVmOworCWludCBtdHRfYmFzZSA9IGVxX2dldF9tdHRfYWRkcihlcWMpIC8gZGV2LT5jYXBzLm10dF9lbnRyeV9zejsKKwlpbnQgbXR0X3NpemUgPSBlcV9nZXRfbXR0X3NpemUoZXFjKTsKKwlzdHJ1Y3QgcmVzX2VxICplcTsKKwlzdHJ1Y3QgcmVzX210dCAqbXR0OworCisJZXJyID0gYWRkX3Jlc19yYW5nZShkZXYsIHNsYXZlLCByZXNfaWQsIDEsIFJFU19FUSwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBlcV9yZXNfc3RhcnRfbW92ZV90byhkZXYsIHNsYXZlLCByZXNfaWQsIFJFU19FUV9IVywgJmVxKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9hZGQ7CisKKwllcnIgPSBnZXRfcmVzKGRldiwgc2xhdmUsIG10dF9iYXNlLCBSRVNfTVRULCAmbXR0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9tb3ZlOworCisJZXJyID0gY2hlY2tfbXR0X3JhbmdlKGRldiwgc2xhdmUsIG10dF9iYXNlLCBtdHRfc2l6ZSwgbXR0KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9wdXQ7CisKKwllcnIgPSBtbHg0X0RNQV93cmFwcGVyKGRldiwgc2xhdmUsIHZoY3IsIGluYm94LCBvdXRib3gsIGNtZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcHV0OworCisJYXRvbWljX2luYygmbXR0LT5yZWZfY291bnQpOworCWVxLT5tdHQgPSBtdHQ7CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBtdHQtPmNvbS5yZXNfaWQsIFJFU19NVFQpOworCXJlc19lbmRfbW92ZShkZXYsIHNsYXZlLCBSRVNfRVEsIHJlc19pZCk7CisJcmV0dXJuIDA7CisKK291dF9wdXQ6CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBtdHQtPmNvbS5yZXNfaWQsIFJFU19NVFQpOworb3V0X21vdmU6CisJcmVzX2Fib3J0X21vdmUoZGV2LCBzbGF2ZSwgUkVTX0VRLCByZXNfaWQpOworb3V0X2FkZDoKKwlyZW1fcmVzX3JhbmdlKGRldiwgc2xhdmUsIHJlc19pZCwgMSwgUkVTX0VRLCAwKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGdldF9jb250YWluaW5nX210dChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBpbnQgc3RhcnQsCisJCQkgICAgICBpbnQgbGVuLCBzdHJ1Y3QgcmVzX210dCAqKnJlcykKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfcmVzb3VyY2VfdHJhY2tlciAqdHJhY2tlciA9ICZwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXI7CisJc3RydWN0IHJlc19tdHQgKm10dDsKKwlpbnQgZXJyID0gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG10dCwgJnRyYWNrZXItPnNsYXZlX2xpc3Rbc2xhdmVdLnJlc19saXN0W1JFU19NVFRdLAorCQkJICAgIGNvbS5saXN0KSB7CisJCWlmICghY2hlY2tfbXR0X3JhbmdlKGRldiwgc2xhdmUsIHN0YXJ0LCBsZW4sIG10dCkpIHsKKwkJCSpyZXMgPSBtdHQ7CisJCQltdHQtPmNvbS5mcm9tX3N0YXRlID0gbXR0LT5jb20uc3RhdGU7CisJCQltdHQtPmNvbS5zdGF0ZSA9IFJFU19NVFRfQlVTWTsKKwkJCWVyciA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X1dSSVRFX01UVF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJc3RydWN0IG1seDRfbXR0IG10dDsKKwlfX2JlNjQgKnBhZ2VfbGlzdCA9IGluYm94LT5idWY7CisJdTY0ICpwZ19saXN0ID0gKHU2NCAqKXBhZ2VfbGlzdDsKKwlpbnQgaTsKKwlzdHJ1Y3QgcmVzX210dCAqcm10dCA9IE5VTEw7CisJaW50IHN0YXJ0ID0gYmU2NF90b19jcHUocGFnZV9saXN0WzBdKTsKKwlpbnQgbnBhZ2VzID0gdmhjci0+aW5fbW9kaWZpZXI7CisJaW50IGVycjsKKworCWVyciA9IGdldF9jb250YWluaW5nX210dChkZXYsIHNsYXZlLCBzdGFydCwgbnBhZ2VzLCAmcm10dCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIENhbGwgdGhlIFNXIGltcGxlbWVudGF0aW9uIG9mIHdyaXRlX210dDoKKwkgKiAtIFByZXBhcmUgYSBkdW1teSBtdHQgc3RydWN0CisJICogLSBUcmFuc2xhdGUgaW5ib3ggY29udGVudHMgdG8gc2ltcGxlIGFkZHJlc3NlcyBpbiBob3N0IGVuZGlhbmVzcyAqLworCW10dC5vZmZzZXQgPSAwOyAgLyogVEJEIHRoaXMgaXMgYnJva2VuIGJ1dCBJIGRvbid0IGhhbmRsZSBpdCBzaW5jZQorCQkJICAgIHdlIGRvbid0IHJlYWxseSB1c2UgaXQgKi8KKwltdHQub3JkZXIgPSAwOworCW10dC5wYWdlX3NoaWZ0ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2kpCisJCXBnX2xpc3RbaSArIDJdID0gKGJlNjRfdG9fY3B1KHBhZ2VfbGlzdFtpICsgMl0pICYgfjFVTEwpOworCisJZXJyID0gX19tbHg0X3dyaXRlX210dChkZXYsICZtdHQsIGJlNjRfdG9fY3B1KHBhZ2VfbGlzdFswXSksIG5wYWdlcywKKwkJCSAgICAgICAoKHU2NCAqKXBhZ2VfbGlzdCArIDIpKTsKKworCWlmIChybXR0KQorCQlwdXRfcmVzKGRldiwgc2xhdmUsIHJtdHQtPmNvbS5yZXNfaWQsIFJFU19NVFQpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IG1seDRfSFcyU1dfRVFfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVxbiA9IHZoY3ItPmluX21vZGlmaWVyOworCWludCByZXNfaWQgPSBlcW4gfCAoc2xhdmUgPDwgOCk7CisJc3RydWN0IHJlc19lcSAqZXE7CisJaW50IGVycjsKKworCWVyciA9IGVxX3Jlc19zdGFydF9tb3ZlX3RvKGRldiwgc2xhdmUsIHJlc19pZCwgUkVTX0VRX1JFU0VSVkVELCAmZXEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwllcnIgPSBnZXRfcmVzKGRldiwgc2xhdmUsIGVxLT5tdHQtPmNvbS5yZXNfaWQsIFJFU19NVFQsIE5VTEwpOworCWlmIChlcnIpCisJCWdvdG8gZXhfYWJvcnQ7CisKKwllcnIgPSBtbHg0X0RNQV93cmFwcGVyKGRldiwgc2xhdmUsIHZoY3IsIGluYm94LCBvdXRib3gsIGNtZCk7CisJaWYgKGVycikKKwkJZ290byBleF9wdXQ7CisKKwlhdG9taWNfZGVjKCZlcS0+bXR0LT5yZWZfY291bnQpOworCXB1dF9yZXMoZGV2LCBzbGF2ZSwgZXEtPm10dC0+Y29tLnJlc19pZCwgUkVTX01UVCk7CisJcmVzX2VuZF9tb3ZlKGRldiwgc2xhdmUsIFJFU19FUSwgcmVzX2lkKTsKKwlyZW1fcmVzX3JhbmdlKGRldiwgc2xhdmUsIHJlc19pZCwgMSwgUkVTX0VRLCAwKTsKKworCXJldHVybiAwOworCitleF9wdXQ6CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBlcS0+bXR0LT5jb20ucmVzX2lkLCBSRVNfTVRUKTsKK2V4X2Fib3J0OgorCXJlc19hYm9ydF9tb3ZlKGRldiwgc2xhdmUsIFJFU19FUSwgcmVzX2lkKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X0dFTl9FUUUoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgc3RydWN0IG1seDRfZXFlICplcWUpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3NsYXZlX2V2ZW50X2VxX2luZm8gKmV2ZW50X2VxOworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OworCXUzMiBpbl9tb2RpZmllciA9IDA7CisJaW50IGVycjsKKwlpbnQgcmVzX2lkOworCXN0cnVjdCByZXNfZXEgKnJlcTsKKworCWlmICghcHJpdi0+bWZ1bmMubWFzdGVyLnNsYXZlX3N0YXRlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWV2ZW50X2VxID0gJnByaXYtPm1mdW5jLm1hc3Rlci5zbGF2ZV9zdGF0ZVtzbGF2ZV0uZXZlbnRfZXE7CisKKwkvKiBDcmVhdGUgdGhlIGV2ZW50IG9ubHkgaWYgdGhlIHNsYXZlIGlzIHJlZ2lzdGVyZWQgKi8KKwlpZiAoKGV2ZW50X2VxLT5ldmVudF90eXBlICYgKDEgPDwgZXFlLT50eXBlKSkgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwltdXRleF9sb2NrKCZwcml2LT5tZnVuYy5tYXN0ZXIuZ2VuX2VxZV9tdXRleFtzbGF2ZV0pOworCXJlc19pZCA9IChzbGF2ZSA8PCA4KSB8IGV2ZW50X2VxLT5lcW47CisJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCByZXNfaWQsIFJFU19FUSwgJnJlcSk7CisJaWYgKGVycikKKwkJZ290byB1bmxvY2s7CisKKwlpZiAocmVxLT5jb20uZnJvbV9zdGF0ZSAhPSBSRVNfRVFfSFcpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBwdXQ7CisJfQorCisJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKKwlpZiAoSVNfRVJSKG1haWxib3gpKSB7CisJCWVyciA9IFBUUl9FUlIobWFpbGJveCk7CisJCWdvdG8gcHV0OworCX0KKworCWlmIChlcWUtPnR5cGUgPT0gTUxYNF9FVkVOVF9UWVBFX0NNRCkgeworCQkrK2V2ZW50X2VxLT50b2tlbjsKKwkJZXFlLT5ldmVudC5jbWQudG9rZW4gPSBjcHVfdG9fYmUxNihldmVudF9lcS0+dG9rZW4pOworCX0KKworCW1lbWNweShtYWlsYm94LT5idWYsICh1OCAqKSBlcWUsIDI4KTsKKworCWluX21vZGlmaWVyID0gKHNsYXZlICYgMHhmZikgfCAoKGV2ZW50X2VxLT5lcW4gJiAweGZmKSA8PCAxNik7CisKKwllcnIgPSBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSwgaW5fbW9kaWZpZXIsIDAsCisJCSAgICAgICBNTFg0X0NNRF9HRU5fRVFFLCBNTFg0X0NNRF9USU1FX0NMQVNTX0IsCisJCSAgICAgICBNTFg0X0NNRF9OQVRJVkUpOworCisJcHV0X3JlcyhkZXYsIHNsYXZlLCByZXNfaWQsIFJFU19FUSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tZnVuYy5tYXN0ZXIuZ2VuX2VxZV9tdXRleFtzbGF2ZV0pOworCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOworCXJldHVybiBlcnI7CisKK3B1dDoKKwlwdXRfcmVzKGRldiwgc2xhdmUsIHJlc19pZCwgUkVTX0VRKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdi0+bWZ1bmMubWFzdGVyLmdlbl9lcWVfbXV0ZXhbc2xhdmVdKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgbWx4NF9RVUVSWV9FUV93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCkKK3sKKwlpbnQgZXFuID0gdmhjci0+aW5fbW9kaWZpZXI7CisJaW50IHJlc19pZCA9IGVxbiB8IChzbGF2ZSA8PCA4KTsKKwlzdHJ1Y3QgcmVzX2VxICplcTsKKwlpbnQgZXJyOworCisJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCByZXNfaWQsIFJFU19FUSwgJmVxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGVxLT5jb20uZnJvbV9zdGF0ZSAhPSBSRVNfRVFfSFcpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBleF9wdXQ7CisJfQorCisJZXJyID0gbWx4NF9ETUFfd3JhcHBlcihkZXYsIHNsYXZlLCB2aGNyLCBpbmJveCwgb3V0Ym94LCBjbWQpOworCitleF9wdXQ6CisJcHV0X3JlcyhkZXYsIHNsYXZlLCByZXNfaWQsIFJFU19FUSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IG1seDRfU1cySFdfQ1Ffd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVycjsKKwlpbnQgY3FuID0gdmhjci0+aW5fbW9kaWZpZXI7CisJc3RydWN0IG1seDRfY3FfY29udGV4dCAqY3FjID0gaW5ib3gtPmJ1ZjsKKwlpbnQgbXR0X2Jhc2UgPSBjcV9nZXRfbXR0X2FkZHIoY3FjKSAvIGRldi0+Y2Fwcy5tdHRfZW50cnlfc3o7CisJc3RydWN0IHJlc19jcSAqY3E7CisJc3RydWN0IHJlc19tdHQgKm10dDsKKworCWVyciA9IGNxX3Jlc19zdGFydF9tb3ZlX3RvKGRldiwgc2xhdmUsIGNxbiwgUkVTX0NRX0hXLCAmY3EpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCBtdHRfYmFzZSwgUkVTX01UVCwgJm10dCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfbW92ZTsKKwllcnIgPSBjaGVja19tdHRfcmFuZ2UoZGV2LCBzbGF2ZSwgbXR0X2Jhc2UsIGNxX2dldF9tdHRfc2l6ZShjcWMpLCBtdHQpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3B1dDsKKwllcnIgPSBtbHg0X0RNQV93cmFwcGVyKGRldiwgc2xhdmUsIHZoY3IsIGluYm94LCBvdXRib3gsIGNtZCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcHV0OworCWF0b21pY19pbmMoJm10dC0+cmVmX2NvdW50KTsKKwljcS0+bXR0ID0gbXR0OworCXB1dF9yZXMoZGV2LCBzbGF2ZSwgbXR0LT5jb20ucmVzX2lkLCBSRVNfTVRUKTsKKwlyZXNfZW5kX21vdmUoZGV2LCBzbGF2ZSwgUkVTX0NRLCBjcW4pOworCXJldHVybiAwOworCitvdXRfcHV0OgorCXB1dF9yZXMoZGV2LCBzbGF2ZSwgbXR0LT5jb20ucmVzX2lkLCBSRVNfTVRUKTsKK291dF9tb3ZlOgorCXJlc19hYm9ydF9tb3ZlKGRldiwgc2xhdmUsIFJFU19DUSwgY3FuKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgbWx4NF9IVzJTV19DUV93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCkKK3sKKwlpbnQgZXJyOworCWludCBjcW4gPSB2aGNyLT5pbl9tb2RpZmllcjsKKwlzdHJ1Y3QgcmVzX2NxICpjcTsKKworCWVyciA9IGNxX3Jlc19zdGFydF9tb3ZlX3RvKGRldiwgc2xhdmUsIGNxbiwgUkVTX0NRX0FMTE9DQVRFRCwgJmNxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWVyciA9IG1seDRfRE1BX3dyYXBwZXIoZGV2LCBzbGF2ZSwgdmhjciwgaW5ib3gsIG91dGJveCwgY21kKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9tb3ZlOworCWF0b21pY19kZWMoJmNxLT5tdHQtPnJlZl9jb3VudCk7CisJcmVzX2VuZF9tb3ZlKGRldiwgc2xhdmUsIFJFU19DUSwgY3FuKTsKKwlyZXR1cm4gMDsKKworb3V0X21vdmU6CisJcmVzX2Fib3J0X21vdmUoZGV2LCBzbGF2ZSwgUkVTX0NRLCBjcW4pOworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X1FVRVJZX0NRX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCWludCBjcW4gPSB2aGNyLT5pbl9tb2RpZmllcjsKKwlzdHJ1Y3QgcmVzX2NxICpjcTsKKwlpbnQgZXJyOworCisJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCBjcW4sIFJFU19DUSwgJmNxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGNxLT5jb20uZnJvbV9zdGF0ZSAhPSBSRVNfQ1FfSFcpCisJCWdvdG8gZXhfcHV0OworCisJZXJyID0gbWx4NF9ETUFfd3JhcHBlcihkZXYsIHNsYXZlLCB2aGNyLCBpbmJveCwgb3V0Ym94LCBjbWQpOworZXhfcHV0OgorCXB1dF9yZXMoZGV2LCBzbGF2ZSwgY3FuLCBSRVNfQ1EpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBoYW5kbGVfcmVzaXplKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kLAorCQkJIHN0cnVjdCByZXNfY3EgKmNxKQoreworCWludCBlcnI7CisJc3RydWN0IHJlc19tdHQgKm9yaWdfbXR0OworCXN0cnVjdCByZXNfbXR0ICptdHQ7CisJc3RydWN0IG1seDRfY3FfY29udGV4dCAqY3FjID0gaW5ib3gtPmJ1ZjsKKwlpbnQgbXR0X2Jhc2UgPSBjcV9nZXRfbXR0X2FkZHIoY3FjKSAvIGRldi0+Y2Fwcy5tdHRfZW50cnlfc3o7CisKKwllcnIgPSBnZXRfcmVzKGRldiwgc2xhdmUsIGNxLT5tdHQtPmNvbS5yZXNfaWQsIFJFU19NVFQsICZvcmlnX210dCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChvcmlnX210dCAhPSBjcS0+bXR0KSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXhfcHV0OworCX0KKworCWVyciA9IGdldF9yZXMoZGV2LCBzbGF2ZSwgbXR0X2Jhc2UsIFJFU19NVFQsICZtdHQpOworCWlmIChlcnIpCisJCWdvdG8gZXhfcHV0OworCisJZXJyID0gY2hlY2tfbXR0X3JhbmdlKGRldiwgc2xhdmUsIG10dF9iYXNlLCBjcV9nZXRfbXR0X3NpemUoY3FjKSwgbXR0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4X3B1dDE7CisJZXJyID0gbWx4NF9ETUFfd3JhcHBlcihkZXYsIHNsYXZlLCB2aGNyLCBpbmJveCwgb3V0Ym94LCBjbWQpOworCWlmIChlcnIpCisJCWdvdG8gZXhfcHV0MTsKKwlhdG9taWNfZGVjKCZvcmlnX210dC0+cmVmX2NvdW50KTsKKwlwdXRfcmVzKGRldiwgc2xhdmUsIG9yaWdfbXR0LT5jb20ucmVzX2lkLCBSRVNfTVRUKTsKKwlhdG9taWNfaW5jKCZtdHQtPnJlZl9jb3VudCk7CisJY3EtPm10dCA9IG10dDsKKwlwdXRfcmVzKGRldiwgc2xhdmUsIG10dC0+Y29tLnJlc19pZCwgUkVTX01UVCk7CisJcmV0dXJuIDA7CisKK2V4X3B1dDE6CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBtdHQtPmNvbS5yZXNfaWQsIFJFU19NVFQpOworZXhfcHV0OgorCXB1dF9yZXMoZGV2LCBzbGF2ZSwgb3JpZ19tdHQtPmNvbS5yZXNfaWQsIFJFU19NVFQpOworCisJcmV0dXJuIGVycjsKKworfQorCitpbnQgbWx4NF9NT0RJRllfQ1Ffd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCWludCBjcW4gPSB2aGNyLT5pbl9tb2RpZmllcjsKKwlzdHJ1Y3QgcmVzX2NxICpjcTsKKwlpbnQgZXJyOworCisJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCBjcW4sIFJFU19DUSwgJmNxKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJaWYgKGNxLT5jb20uZnJvbV9zdGF0ZSAhPSBSRVNfQ1FfSFcpCisJCWdvdG8gZXhfcHV0OworCisJaWYgKHZoY3ItPm9wX21vZGlmaWVyID09IDApIHsKKwkJZXJyID0gaGFuZGxlX3Jlc2l6ZShkZXYsIHNsYXZlLCB2aGNyLCBpbmJveCwgb3V0Ym94LCBjbWQsIGNxKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXhfcHV0OworCX0KKworCWVyciA9IG1seDRfRE1BX3dyYXBwZXIoZGV2LCBzbGF2ZSwgdmhjciwgaW5ib3gsIG91dGJveCwgY21kKTsKK2V4X3B1dDoKKwlwdXRfcmVzKGRldiwgc2xhdmUsIGNxbiwgUkVTX0NRKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc3JxX2dldF9wZG4oc3RydWN0IG1seDRfc3JxX2NvbnRleHQgKnNycWMpCit7CisJcmV0dXJuIGJlMzJfdG9fY3B1KHNycWMtPnBkKSAmIDB4ZmZmZmZmOworfQorCitzdGF0aWMgaW50IHNycV9nZXRfbXR0X3NpemUoc3RydWN0IG1seDRfc3JxX2NvbnRleHQgKnNycWMpCit7CisJaW50IGxvZ19zcnFfc2l6ZSA9IChiZTMyX3RvX2NwdShzcnFjLT5zdGF0ZV9sb2dzaXplX3NycW4pID4+IDI0KSAmIDB4ZjsKKwlpbnQgbG9nX3JxX3N0cmlkZSA9IHNycWMtPmxvZ3N0cmlkZSAmIDc7CisJaW50IHBhZ2Vfc2hpZnQgPSAoc3JxYy0+bG9nX3BhZ2Vfc2l6ZSAmIDB4M2YpICsgMTI7CisKKwlpZiAobG9nX3NycV9zaXplICsgbG9nX3JxX3N0cmlkZSArIDQgPCBwYWdlX3NoaWZ0KQorCQlyZXR1cm4gMTsKKworCXJldHVybiAxIDw8IChsb2dfc3JxX3NpemUgKyBsb2dfcnFfc3RyaWRlICsgNCAtIHBhZ2Vfc2hpZnQpOworfQorCitpbnQgbWx4NF9TVzJIV19TUlFfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCWludCBlcnI7CisJaW50IHNycW4gPSB2aGNyLT5pbl9tb2RpZmllcjsKKwlzdHJ1Y3QgcmVzX210dCAqbXR0OworCXN0cnVjdCByZXNfc3JxICpzcnE7CisJc3RydWN0IG1seDRfc3JxX2NvbnRleHQgKnNycWMgPSBpbmJveC0+YnVmOworCWludCBtdHRfYmFzZSA9IHNycV9nZXRfbXR0X2FkZHIoc3JxYykgLyBkZXYtPmNhcHMubXR0X2VudHJ5X3N6OworCisJaWYgKHNycW4gIT0gKGJlMzJfdG9fY3B1KHNycWMtPnN0YXRlX2xvZ3NpemVfc3JxbikgJiAweGZmZmZmZikpCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gc3JxX3Jlc19zdGFydF9tb3ZlX3RvKGRldiwgc2xhdmUsIHNycW4sIFJFU19TUlFfSFcsICZzcnEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCBtdHRfYmFzZSwgUkVTX01UVCwgJm10dCk7CisJaWYgKGVycikKKwkJZ290byBleF9hYm9ydDsKKwllcnIgPSBjaGVja19tdHRfcmFuZ2UoZGV2LCBzbGF2ZSwgbXR0X2Jhc2UsIHNycV9nZXRfbXR0X3NpemUoc3JxYyksCisJCQkgICAgICBtdHQpOworCWlmIChlcnIpCisJCWdvdG8gZXhfcHV0X210dDsKKworCWlmIChwZG4yc2xhdmUoc3JxX2dldF9wZG4oc3JxYykpICE9IHNsYXZlKSB7CisJCWVyciA9IC1FUEVSTTsKKwkJZ290byBleF9wdXRfbXR0OworCX0KKworCWVyciA9IG1seDRfRE1BX3dyYXBwZXIoZGV2LCBzbGF2ZSwgdmhjciwgaW5ib3gsIG91dGJveCwgY21kKTsKKwlpZiAoZXJyKQorCQlnb3RvIGV4X3B1dF9tdHQ7CisKKwlhdG9taWNfaW5jKCZtdHQtPnJlZl9jb3VudCk7CisJc3JxLT5tdHQgPSBtdHQ7CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBtdHQtPmNvbS5yZXNfaWQsIFJFU19NVFQpOworCXJlc19lbmRfbW92ZShkZXYsIHNsYXZlLCBSRVNfU1JRLCBzcnFuKTsKKwlyZXR1cm4gMDsKKworZXhfcHV0X210dDoKKwlwdXRfcmVzKGRldiwgc2xhdmUsIG10dC0+Y29tLnJlc19pZCwgUkVTX01UVCk7CitleF9hYm9ydDoKKwlyZXNfYWJvcnRfbW92ZShkZXYsIHNsYXZlLCBSRVNfU1JRLCBzcnFuKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X0hXMlNXX1NSUV93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVycjsKKwlpbnQgc3JxbiA9IHZoY3ItPmluX21vZGlmaWVyOworCXN0cnVjdCByZXNfc3JxICpzcnE7CisKKwllcnIgPSBzcnFfcmVzX3N0YXJ0X21vdmVfdG8oZGV2LCBzbGF2ZSwgc3JxbiwgUkVTX1NSUV9BTExPQ0FURUQsICZzcnEpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJZXJyID0gbWx4NF9ETUFfd3JhcHBlcihkZXYsIHNsYXZlLCB2aGNyLCBpbmJveCwgb3V0Ym94LCBjbWQpOworCWlmIChlcnIpCisJCWdvdG8gZXhfYWJvcnQ7CisJYXRvbWljX2RlYygmc3JxLT5tdHQtPnJlZl9jb3VudCk7CisJaWYgKHNycS0+Y3EpCisJCWF0b21pY19kZWMoJnNycS0+Y3EtPnJlZl9jb3VudCk7CisJcmVzX2VuZF9tb3ZlKGRldiwgc2xhdmUsIFJFU19TUlEsIHNycW4pOworCisJcmV0dXJuIDA7CisKK2V4X2Fib3J0OgorCXJlc19hYm9ydF9tb3ZlKGRldiwgc2xhdmUsIFJFU19TUlEsIHNycW4pOworCisJcmV0dXJuIGVycjsKK30KKworaW50IG1seDRfUVVFUllfU1JRX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICAgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCkKK3sKKwlpbnQgZXJyOworCWludCBzcnFuID0gdmhjci0+aW5fbW9kaWZpZXI7CisJc3RydWN0IHJlc19zcnEgKnNycTsKKworCWVyciA9IGdldF9yZXMoZGV2LCBzbGF2ZSwgc3JxbiwgUkVTX1NSUSwgJnNycSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAoc3JxLT5jb20uZnJvbV9zdGF0ZSAhPSBSRVNfU1JRX0hXKSB7CisJCWVyciA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCWVyciA9IG1seDRfRE1BX3dyYXBwZXIoZGV2LCBzbGF2ZSwgdmhjciwgaW5ib3gsIG91dGJveCwgY21kKTsKK291dDoKKwlwdXRfcmVzKGRldiwgc2xhdmUsIHNycW4sIFJFU19TUlEpOworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X0FSTV9TUlFfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJIHN0cnVjdCBtbHg0X3ZoY3IgKnZoY3IsCisJCQkgc3RydWN0IG1seDRfY21kX21haWxib3ggKmluYm94LAorCQkJIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgc3RydWN0IG1seDRfY21kX2luZm8gKmNtZCkKK3sKKwlpbnQgZXJyOworCWludCBzcnFuID0gdmhjci0+aW5fbW9kaWZpZXI7CisJc3RydWN0IHJlc19zcnEgKnNycTsKKworCWVyciA9IGdldF9yZXMoZGV2LCBzbGF2ZSwgc3JxbiwgUkVTX1NSUSwgJnNycSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChzcnEtPmNvbS5mcm9tX3N0YXRlICE9IFJFU19TUlFfSFcpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBtbHg0X0RNQV93cmFwcGVyKGRldiwgc2xhdmUsIHZoY3IsIGluYm94LCBvdXRib3gsIGNtZCk7CitvdXQ6CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBzcnFuLCBSRVNfU1JRKTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQgbWx4NF9HRU5fUVBfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQlzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCWludCBlcnI7CisJaW50IHFwbiA9IHZoY3ItPmluX21vZGlmaWVyICYgMHg3ZmZmZmY7CisJc3RydWN0IHJlc19xcCAqcXA7CisKKwllcnIgPSBnZXRfcmVzKGRldiwgc2xhdmUsIHFwbiwgUkVTX1FQLCAmcXApOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisJaWYgKHFwLT5jb20uZnJvbV9zdGF0ZSAhPSBSRVNfUVBfSFcpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSBtbHg0X0RNQV93cmFwcGVyKGRldiwgc2xhdmUsIHZoY3IsIGluYm94LCBvdXRib3gsIGNtZCk7CitvdXQ6CisJcHV0X3JlcyhkZXYsIHNsYXZlLCBxcG4sIFJFU19RUCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IG1seDRfSU5JVDJSVFJfUVBfd3JhcHBlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLAorCQkJICAgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICpvdXRib3gsCisJCQkgICAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJc3RydWN0IG1seDRfcXBfY29udGV4dCAqcXBjID0gaW5ib3gtPmJ1ZiArIDg7CisKKwl1cGRhdGVfdWRfZ2lkKGRldiwgcXBjLCAodTgpc2xhdmUpOworCisJcmV0dXJuIG1seDRfR0VOX1FQX3dyYXBwZXIoZGV2LCBzbGF2ZSwgdmhjciwgaW5ib3gsIG91dGJveCwgY21kKTsKK30KKworaW50IG1seDRfMlJTVF9RUF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCWludCBlcnI7CisJaW50IHFwbiA9IHZoY3ItPmluX21vZGlmaWVyICYgMHg3ZmZmZmY7CisJc3RydWN0IHJlc19xcCAqcXA7CisKKwllcnIgPSBxcF9yZXNfc3RhcnRfbW92ZV90byhkZXYsIHNsYXZlLCBxcG4sIFJFU19RUF9NQVBQRUQsICZxcCwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwllcnIgPSBtbHg0X0RNQV93cmFwcGVyKGRldiwgc2xhdmUsIHZoY3IsIGluYm94LCBvdXRib3gsIGNtZCk7CisJaWYgKGVycikKKwkJZ290byBleF9hYm9ydDsKKworCWF0b21pY19kZWMoJnFwLT5tdHQtPnJlZl9jb3VudCk7CisJYXRvbWljX2RlYygmcXAtPnJjcS0+cmVmX2NvdW50KTsKKwlhdG9taWNfZGVjKCZxcC0+c2NxLT5yZWZfY291bnQpOworCWlmIChxcC0+c3JxKQorCQlhdG9taWNfZGVjKCZxcC0+c3JxLT5yZWZfY291bnQpOworCXJlc19lbmRfbW92ZShkZXYsIHNsYXZlLCBSRVNfUVAsIHFwbik7CisJcmV0dXJuIDA7CisKK2V4X2Fib3J0OgorCXJlc19hYm9ydF9tb3ZlKGRldiwgc2xhdmUsIFJFU19RUCwgcXBuKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmVzX2dpZCAqZmluZF9naWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCQlzdHJ1Y3QgcmVzX3FwICpycXAsIHU4ICpnaWQpCit7CisJc3RydWN0IHJlc19naWQgKnJlczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVzLCAmcnFwLT5tY2dfbGlzdCwgbGlzdCkgeworCQlpZiAoIW1lbWNtcChyZXMtPmdpZCwgZ2lkLCAxNikpCisJCQlyZXR1cm4gcmVzOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBhZGRfbWNnX3JlcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBzdHJ1Y3QgcmVzX3FwICpycXAsCisJCSAgICAgICB1OCAqZ2lkLCBlbnVtIG1seDRfcHJvdG9jb2wgcHJvdCkKK3sKKwlzdHJ1Y3QgcmVzX2dpZCAqcmVzOworCWludCBlcnI7CisKKwlyZXMgPSBremFsbG9jKHNpemVvZiAqcmVzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaXJxKCZycXAtPm1jZ19zcGwpOworCWlmIChmaW5kX2dpZChkZXYsIHNsYXZlLCBycXAsIGdpZCkpIHsKKwkJa2ZyZWUocmVzKTsKKwkJZXJyID0gLUVFWElTVDsKKwl9IGVsc2UgeworCQltZW1jcHkocmVzLT5naWQsIGdpZCwgMTYpOworCQlyZXMtPnByb3QgPSBwcm90OworCQlsaXN0X2FkZF90YWlsKCZyZXMtPmxpc3QsICZycXAtPm1jZ19saXN0KTsKKwkJZXJyID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZycXAtPm1jZ19zcGwpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCByZW1fbWNnX3JlcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlLCBzdHJ1Y3QgcmVzX3FwICpycXAsCisJCSAgICAgICB1OCAqZ2lkLCBlbnVtIG1seDRfcHJvdG9jb2wgcHJvdCkKK3sKKwlzdHJ1Y3QgcmVzX2dpZCAqcmVzOworCWludCBlcnI7CisKKwlzcGluX2xvY2tfaXJxKCZycXAtPm1jZ19zcGwpOworCXJlcyA9IGZpbmRfZ2lkKGRldiwgc2xhdmUsIHJxcCwgZ2lkKTsKKwlpZiAoIXJlcyB8fCByZXMtPnByb3QgIT0gcHJvdCkKKwkJZXJyID0gLUVJTlZBTDsKKwllbHNlIHsKKwkJbGlzdF9kZWwoJnJlcy0+bGlzdCk7CisJCWtmcmVlKHJlcyk7CisJCWVyciA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycSgmcnFwLT5tY2dfc3BsKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBtbHg0X1FQX0FUVEFDSF93cmFwcGVyKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgICAgICAgc3RydWN0IG1seDRfdmhjciAqdmhjciwKKwkJCSAgICAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqaW5ib3gsCisJCQkgICAgICAgc3RydWN0IG1seDRfY21kX21haWxib3ggKm91dGJveCwKKwkJCSAgICAgICBzdHJ1Y3QgbWx4NF9jbWRfaW5mbyAqY21kKQoreworCXN0cnVjdCBtbHg0X3FwIHFwOyAvKiBkdW1teSBmb3IgY2FsbGluZyBhdHRhY2gvZGV0YWNoICovCisJdTggKmdpZCA9IGluYm94LT5idWY7CisJZW51bSBtbHg0X3Byb3RvY29sIHByb3QgPSAodmhjci0+aW5fbW9kaWZpZXIgPj4gMjgpICYgMHg3OworCWludCBlcnIsIGVycjE7CisJaW50IHFwbjsKKwlzdHJ1Y3QgcmVzX3FwICpycXA7CisJaW50IGF0dGFjaCA9IHZoY3ItPm9wX21vZGlmaWVyOworCWludCBibG9ja19sb29wYmFjayA9IHZoY3ItPmluX21vZGlmaWVyID4+IDMxOworCXU4IHN0ZWVyX3R5cGVfbWFzayA9IDI7CisJZW51bSBtbHg0X3N0ZWVyX3R5cGUgdHlwZSA9IGdpZFs3XSAmIHN0ZWVyX3R5cGVfbWFzazsKKworCXFwbiA9IHZoY3ItPmluX21vZGlmaWVyICYgMHhmZmZmZmY7CisJZXJyID0gZ2V0X3JlcyhkZXYsIHNsYXZlLCBxcG4sIFJFU19RUCwgJnJxcCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXFwLnFwbiA9IHFwbjsKKwlpZiAoYXR0YWNoKSB7CisJCWVyciA9IGFkZF9tY2dfcmVzKGRldiwgc2xhdmUsIHJxcCwgZ2lkLCBwcm90KTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXhfcHV0OworCisJCWVyciA9IG1seDRfcXBfYXR0YWNoX2NvbW1vbihkZXYsICZxcCwgZ2lkLAorCQkJCQkgICAgYmxvY2tfbG9vcGJhY2ssIHByb3QsIHR5cGUpOworCQlpZiAoZXJyKQorCQkJZ290byBleF9yZW07CisJfSBlbHNlIHsKKwkJZXJyID0gcmVtX21jZ19yZXMoZGV2LCBzbGF2ZSwgcnFwLCBnaWQsIHByb3QpOworCQlpZiAoZXJyKQorCQkJZ290byBleF9wdXQ7CisJCWVyciA9IG1seDRfcXBfZGV0YWNoX2NvbW1vbihkZXYsICZxcCwgZ2lkLCBwcm90LCB0eXBlKTsKKwl9CisKKwlwdXRfcmVzKGRldiwgc2xhdmUsIHFwbiwgUkVTX1FQKTsKKwlyZXR1cm4gMDsKKworZXhfcmVtOgorCS8qIGlnbm9yZSBlcnJvciByZXR1cm4gYmVsb3csIGFscmVhZHkgaW4gZXJyb3IgKi8KKwllcnIxID0gcmVtX21jZ19yZXMoZGV2LCBzbGF2ZSwgcnFwLCBnaWQsIHByb3QpOworZXhfcHV0OgorCXB1dF9yZXMoZGV2LCBzbGF2ZSwgcXBuLCBSRVNfUVApOworCisJcmV0dXJuIGVycjsKK30KKworZW51bSB7CisJQlVTWV9NQVhfUkVUUklFUyA9IDEwCit9OworCitpbnQgbWx4NF9RVUVSWV9JRl9TVEFUX3dyYXBwZXIoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSAgICAgICBzdHJ1Y3QgbWx4NF92aGNyICp2aGNyLAorCQkJICAgICAgIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICppbmJveCwKKwkJCSAgICAgICBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqb3V0Ym94LAorCQkJICAgICAgIHN0cnVjdCBtbHg0X2NtZF9pbmZvICpjbWQpCit7CisJaW50IGVycjsKKwlpbnQgaW5kZXggPSB2aGNyLT5pbl9tb2RpZmllciAmIDB4ZmZmZjsKKworCWVyciA9IGdldF9yZXMoZGV2LCBzbGF2ZSwgaW5kZXgsIFJFU19DT1VOVEVSLCBOVUxMKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gbWx4NF9ETUFfd3JhcHBlcihkZXYsIHNsYXZlLCB2aGNyLCBpbmJveCwgb3V0Ym94LCBjbWQpOworCXB1dF9yZXMoZGV2LCBzbGF2ZSwgaW5kZXgsIFJFU19DT1VOVEVSKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBkZXRhY2hfcXAoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwgc3RydWN0IHJlc19xcCAqcnFwKQoreworCXN0cnVjdCByZXNfZ2lkICpyZ2lkOworCXN0cnVjdCByZXNfZ2lkICp0bXA7CisJaW50IGVycjsKKwlzdHJ1Y3QgbWx4NF9xcCBxcDsgLyogZHVtbXkgZm9yIGNhbGxpbmcgYXR0YWNoL2RldGFjaCAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJnaWQsIHRtcCwgJnJxcC0+bWNnX2xpc3QsIGxpc3QpIHsKKwkJcXAucXBuID0gcnFwLT5sb2NhbF9xcG47CisJCWVyciA9IG1seDRfcXBfZGV0YWNoX2NvbW1vbihkZXYsICZxcCwgcmdpZC0+Z2lkLCByZ2lkLT5wcm90LAorCQkJCQkgICAgTUxYNF9NQ19TVEVFUik7CisJCWxpc3RfZGVsKCZyZ2lkLT5saXN0KTsKKwkJa2ZyZWUocmdpZCk7CisJfQorfQorCitzdGF0aWMgaW50IF9tb3ZlX2FsbF9idXN5KHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUsCisJCQkgIGVudW0gbWx4NF9yZXNvdXJjZSB0eXBlLCBpbnQgcHJpbnQpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3Jlc291cmNlX3RyYWNrZXIgKnRyYWNrZXIgPQorCQkmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyOworCXN0cnVjdCBsaXN0X2hlYWQgKnJsaXN0ID0gJnRyYWNrZXItPnNsYXZlX2xpc3Rbc2xhdmVdLnJlc19saXN0W3R5cGVdOworCXN0cnVjdCByZXNfY29tbW9uICpyOworCXN0cnVjdCByZXNfY29tbW9uICp0bXA7CisJaW50IGJ1c3k7CisKKwlidXN5ID0gMDsKKwlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHIsIHRtcCwgcmxpc3QsIGxpc3QpIHsKKwkJaWYgKHItPm93bmVyID09IHNsYXZlKSB7CisJCQlpZiAoIXItPnJlbW92aW5nKSB7CisJCQkJaWYgKHItPnN0YXRlID09IFJFU19BTllfQlVTWSkgeworCQkJCQlpZiAocHJpbnQpCisJCQkJCQltbHg0X2RiZyhkZXYsCisJCQkJCQkJICIlcyBpZCAweCV4IGlzIGJ1c3lcbiIsCisJCQkJCQkJICBSZXNvdXJjZVR5cGUodHlwZSksCisJCQkJCQkJICByLT5yZXNfaWQpOworCQkJCQkrK2J1c3k7CisJCQkJfSBlbHNlIHsKKwkJCQkJci0+ZnJvbV9zdGF0ZSA9IHItPnN0YXRlOworCQkJCQlyLT5zdGF0ZSA9IFJFU19BTllfQlVTWTsKKwkJCQkJci0+cmVtb3ZpbmcgPSAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKworCXJldHVybiBidXN5OworfQorCitzdGF0aWMgaW50IG1vdmVfYWxsX2J1c3koc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSwKKwkJCSBlbnVtIG1seDRfcmVzb3VyY2UgdHlwZSkKK3sKKwl1bnNpZ25lZCBsb25nIGJlZ2luOworCWludCBidXN5OworCisJYmVnaW4gPSBqaWZmaWVzOworCWRvIHsKKwkJYnVzeSA9IF9tb3ZlX2FsbF9idXN5KGRldiwgc2xhdmUsIHR5cGUsIDApOworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBiZWdpbiArIDUgKiBIWikpCisJCQlicmVhazsKKwkJaWYgKGJ1c3kpCisJCQljb25kX3Jlc2NoZWQoKTsKKwl9IHdoaWxlIChidXN5KTsKKworCWlmIChidXN5KQorCQlidXN5ID0gX21vdmVfYWxsX2J1c3koZGV2LCBzbGF2ZSwgdHlwZSwgMSk7CisKKwlyZXR1cm4gYnVzeTsKK30KK3N0YXRpYyB2b2lkIHJlbV9zbGF2ZV9xcHMoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzbGF2ZSkKK3sKKwlzdHJ1Y3QgbWx4NF9wcml2ICpwcml2ID0gbWx4NF9wcml2KGRldik7CisJc3RydWN0IG1seDRfcmVzb3VyY2VfdHJhY2tlciAqdHJhY2tlciA9ICZwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXI7CisJc3RydWN0IGxpc3RfaGVhZCAqcXBfbGlzdCA9CisJCSZ0cmFja2VyLT5zbGF2ZV9saXN0W3NsYXZlXS5yZXNfbGlzdFtSRVNfUVBdOworCXN0cnVjdCByZXNfcXAgKnFwOworCXN0cnVjdCByZXNfcXAgKnRtcDsKKwlpbnQgc3RhdGU7CisJdTY0IGluX3BhcmFtOworCWludCBxcG47CisJaW50IGVycjsKKworCWVyciA9IG1vdmVfYWxsX2J1c3koZGV2LCBzbGF2ZSwgUkVTX1FQKTsKKwlpZiAoZXJyKQorCQltbHg0X3dhcm4oZGV2LCAicmVtX3NsYXZlX3FwczogQ291bGQgbm90IG1vdmUgYWxsIHFwcyB0byBidXN5IgorCQkJICAiZm9yIHNsYXZlICVkXG4iLCBzbGF2ZSk7CisKKwlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHFwLCB0bXAsIHFwX2xpc3QsIGNvbS5saXN0KSB7CisJCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCQlpZiAocXAtPmNvbS5vd25lciA9PSBzbGF2ZSkgeworCQkJcXBuID0gcXAtPmNvbS5yZXNfaWQ7CisJCQlkZXRhY2hfcXAoZGV2LCBzbGF2ZSwgcXApOworCQkJc3RhdGUgPSBxcC0+Y29tLmZyb21fc3RhdGU7CisJCQl3aGlsZSAoc3RhdGUgIT0gMCkgeworCQkJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCQljYXNlIFJFU19RUF9SRVNFUlZFRDoKKwkJCQkJc3Bpbl9sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCQkJCQlyYWRpeF90cmVlX2RlbGV0ZSgmdHJhY2tlci0+cmVzX3RyZWVbUkVTX1FQXSwKKwkJCQkJCQkgIHFwLT5jb20ucmVzX2lkKTsKKwkJCQkJbGlzdF9kZWwoJnFwLT5jb20ubGlzdCk7CisJCQkJCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCQkJCQlrZnJlZShxcCk7CisJCQkJCXN0YXRlID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRVNfUVBfTUFQUEVEOgorCQkJCQlpZiAoIXZhbGlkX3Jlc2VydmVkKGRldiwgc2xhdmUsIHFwbikpCisJCQkJCQlfX21seDRfcXBfZnJlZV9pY20oZGV2LCBxcG4pOworCQkJCQlzdGF0ZSA9IFJFU19RUF9SRVNFUlZFRDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBSRVNfUVBfSFc6CisJCQkJCWluX3BhcmFtID0gc2xhdmU7CisJCQkJCWVyciA9IG1seDRfY21kKGRldiwgaW5fcGFyYW0sCisJCQkJCQkgICAgICAgcXAtPmxvY2FsX3FwbiwgMiwKKwkJCQkJCSAgICAgICBNTFg0X0NNRF8yUlNUX1FQLAorCQkJCQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCQkJCSAgICAgICBNTFg0X0NNRF9OQVRJVkUpOworCQkJCQlpZiAoZXJyKQorCQkJCQkJbWx4NF9kYmcoZGV2LCAicmVtX3NsYXZlX3FwczogZmFpbGVkIgorCQkJCQkJCSAiIHRvIG1vdmUgc2xhdmUgJWQgcXBuICVkIHRvIgorCQkJCQkJCSAiIHJlc2V0XG4iLCBzbGF2ZSwKKwkJCQkJCQkgcXAtPmxvY2FsX3Fwbik7CisJCQkJCWF0b21pY19kZWMoJnFwLT5yY3EtPnJlZl9jb3VudCk7CisJCQkJCWF0b21pY19kZWMoJnFwLT5zY3EtPnJlZl9jb3VudCk7CisJCQkJCWF0b21pY19kZWMoJnFwLT5tdHQtPnJlZl9jb3VudCk7CisJCQkJCWlmIChxcC0+c3JxKQorCQkJCQkJYXRvbWljX2RlYygmcXAtPnNycS0+cmVmX2NvdW50KTsKKwkJCQkJc3RhdGUgPSBSRVNfUVBfTUFQUEVEOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlzdGF0ZSA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlbV9zbGF2ZV9zcnFzKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3Jlc291cmNlX3RyYWNrZXIgKnRyYWNrZXIgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyOworCXN0cnVjdCBsaXN0X2hlYWQgKnNycV9saXN0ID0KKwkJJnRyYWNrZXItPnNsYXZlX2xpc3Rbc2xhdmVdLnJlc19saXN0W1JFU19TUlFdOworCXN0cnVjdCByZXNfc3JxICpzcnE7CisJc3RydWN0IHJlc19zcnEgKnRtcDsKKwlpbnQgc3RhdGU7CisJdTY0IGluX3BhcmFtOworCUxJU1RfSEVBRCh0bGlzdCk7CisJaW50IHNycW47CisJaW50IGVycjsKKworCWVyciA9IG1vdmVfYWxsX2J1c3koZGV2LCBzbGF2ZSwgUkVTX1NSUSk7CisJaWYgKGVycikKKwkJbWx4NF93YXJuKGRldiwgInJlbV9zbGF2ZV9zcnFzOiBDb3VsZCBub3QgbW92ZSBhbGwgc3JxcyB0byAiCisJCQkgICJidXN5IGZvciBzbGF2ZSAlZFxuIiwgc2xhdmUpOworCisJc3Bpbl9sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzcnEsIHRtcCwgc3JxX2xpc3QsIGNvbS5saXN0KSB7CisJCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCQlpZiAoc3JxLT5jb20ub3duZXIgPT0gc2xhdmUpIHsKKwkJCXNycW4gPSBzcnEtPmNvbS5yZXNfaWQ7CisJCQlzdGF0ZSA9IHNycS0+Y29tLmZyb21fc3RhdGU7CisJCQl3aGlsZSAoc3RhdGUgIT0gMCkgeworCQkJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCQljYXNlIFJFU19TUlFfQUxMT0NBVEVEOgorCQkJCQlfX21seDRfc3JxX2ZyZWVfaWNtKGRldiwgc3Jxbik7CisJCQkJCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKwkJCQkJcmFkaXhfdHJlZV9kZWxldGUoJnRyYWNrZXItPnJlc190cmVlW1JFU19TUlFdLAorCQkJCQkJCSAgc3Jxbik7CisJCQkJCWxpc3RfZGVsKCZzcnEtPmNvbS5saXN0KTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJCQkJCWtmcmVlKHNycSk7CisJCQkJCXN0YXRlID0gMDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFJFU19TUlFfSFc6CisJCQkJCWluX3BhcmFtID0gc2xhdmU7CisJCQkJCWVyciA9IG1seDRfY21kKGRldiwgaW5fcGFyYW0sIHNycW4sIDEsCisJCQkJCQkgICAgICAgTUxYNF9DTURfSFcyU1dfU1JRLAorCQkJCQkJICAgICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCQkJCSAgICAgICBNTFg0X0NNRF9OQVRJVkUpOworCQkJCQlpZiAoZXJyKQorCQkJCQkJbWx4NF9kYmcoZGV2LCAicmVtX3NsYXZlX3NycXM6IGZhaWxlZCIKKwkJCQkJCQkgIiB0byBtb3ZlIHNsYXZlICVkIHNycSAlZCB0byIKKwkJCQkJCQkgIiBTVyBvd25lcnNoaXBcbiIsCisJCQkJCQkJIHNsYXZlLCBzcnFuKTsKKworCQkJCQlhdG9taWNfZGVjKCZzcnEtPm10dC0+cmVmX2NvdW50KTsKKwkJCQkJaWYgKHNycS0+Y3EpCisJCQkJCQlhdG9taWNfZGVjKCZzcnEtPmNxLT5yZWZfY291bnQpOworCQkJCQlzdGF0ZSA9IFJFU19TUlFfQUxMT0NBVEVEOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXN0YXRlID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKwkJc3Bpbl9sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCX0KKwlzcGluX3VubG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKK30KKworc3RhdGljIHZvaWQgcmVtX3NsYXZlX2NxcyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9yZXNvdXJjZV90cmFja2VyICp0cmFja2VyID0gJnByaXYtPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpjcV9saXN0ID0KKwkJJnRyYWNrZXItPnNsYXZlX2xpc3Rbc2xhdmVdLnJlc19saXN0W1JFU19DUV07CisJc3RydWN0IHJlc19jcSAqY3E7CisJc3RydWN0IHJlc19jcSAqdG1wOworCWludCBzdGF0ZTsKKwl1NjQgaW5fcGFyYW07CisJTElTVF9IRUFEKHRsaXN0KTsKKwlpbnQgY3FuOworCWludCBlcnI7CisKKwllcnIgPSBtb3ZlX2FsbF9idXN5KGRldiwgc2xhdmUsIFJFU19DUSk7CisJaWYgKGVycikKKwkJbWx4NF93YXJuKGRldiwgInJlbV9zbGF2ZV9jcXM6IENvdWxkIG5vdCBtb3ZlIGFsbCBjcXMgdG8gIgorCQkJICAiYnVzeSBmb3Igc2xhdmUgJWRcbiIsIHNsYXZlKTsKKworCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3EsIHRtcCwgY3FfbGlzdCwgY29tLmxpc3QpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJCWlmIChjcS0+Y29tLm93bmVyID09IHNsYXZlICYmICFhdG9taWNfcmVhZCgmY3EtPnJlZl9jb3VudCkpIHsKKwkJCWNxbiA9IGNxLT5jb20ucmVzX2lkOworCQkJc3RhdGUgPSBjcS0+Y29tLmZyb21fc3RhdGU7CisJCQl3aGlsZSAoc3RhdGUgIT0gMCkgeworCQkJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCQljYXNlIFJFU19DUV9BTExPQ0FURUQ6CisJCQkJCV9fbWx4NF9jcV9mcmVlX2ljbShkZXYsIGNxbik7CisJCQkJCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKwkJCQkJcmFkaXhfdHJlZV9kZWxldGUoJnRyYWNrZXItPnJlc190cmVlW1JFU19DUV0sCisJCQkJCQkJICBjcW4pOworCQkJCQlsaXN0X2RlbCgmY3EtPmNvbS5saXN0KTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJCQkJCWtmcmVlKGNxKTsKKwkJCQkJc3RhdGUgPSAwOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUkVTX0NRX0hXOgorCQkJCQlpbl9wYXJhbSA9IHNsYXZlOworCQkJCQllcnIgPSBtbHg0X2NtZChkZXYsIGluX3BhcmFtLCBjcW4sIDEsCisJCQkJCQkgICAgICAgTUxYNF9DTURfSFcyU1dfQ1EsCisJCQkJCQkgICAgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLAorCQkJCQkJICAgICAgIE1MWDRfQ01EX05BVElWRSk7CisJCQkJCWlmIChlcnIpCisJCQkJCQltbHg0X2RiZyhkZXYsICJyZW1fc2xhdmVfY3FzOiBmYWlsZWQiCisJCQkJCQkJICIgdG8gbW92ZSBzbGF2ZSAlZCBjcSAlZCB0byIKKwkJCQkJCQkgIiBTVyBvd25lcnNoaXBcbiIsCisJCQkJCQkJIHNsYXZlLCBjcW4pOworCQkJCQlhdG9taWNfZGVjKCZjcS0+bXR0LT5yZWZfY291bnQpOworCQkJCQlzdGF0ZSA9IFJFU19DUV9BTExPQ0FURUQ7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJc3RhdGUgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJfQorCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworfQorCitzdGF0aWMgdm9pZCByZW1fc2xhdmVfbXJzKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3Jlc291cmNlX3RyYWNrZXIgKnRyYWNrZXIgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyOworCXN0cnVjdCBsaXN0X2hlYWQgKm1wdF9saXN0ID0KKwkJJnRyYWNrZXItPnNsYXZlX2xpc3Rbc2xhdmVdLnJlc19saXN0W1JFU19NUFRdOworCXN0cnVjdCByZXNfbXB0ICptcHQ7CisJc3RydWN0IHJlc19tcHQgKnRtcDsKKwlpbnQgc3RhdGU7CisJdTY0IGluX3BhcmFtOworCUxJU1RfSEVBRCh0bGlzdCk7CisJaW50IG1wdG47CisJaW50IGVycjsKKworCWVyciA9IG1vdmVfYWxsX2J1c3koZGV2LCBzbGF2ZSwgUkVTX01QVCk7CisJaWYgKGVycikKKwkJbWx4NF93YXJuKGRldiwgInJlbV9zbGF2ZV9tcnM6IENvdWxkIG5vdCBtb3ZlIGFsbCBtcHRzIHRvICIKKwkJCSAgImJ1c3kgZm9yIHNsYXZlICVkXG4iLCBzbGF2ZSk7CisKKwlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1wdCwgdG1wLCBtcHRfbGlzdCwgY29tLmxpc3QpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJCWlmIChtcHQtPmNvbS5vd25lciA9PSBzbGF2ZSkgeworCQkJbXB0biA9IG1wdC0+Y29tLnJlc19pZDsKKwkJCXN0YXRlID0gbXB0LT5jb20uZnJvbV9zdGF0ZTsKKwkJCXdoaWxlIChzdGF0ZSAhPSAwKSB7CisJCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJCWNhc2UgUkVTX01QVF9SRVNFUlZFRDoKKwkJCQkJX19tbHg0X21yX3JlbGVhc2UoZGV2LCBtcHQtPmtleSk7CisJCQkJCXNwaW5fbG9ja19pcnEobWx4NF90bG9jayhkZXYpKTsKKwkJCQkJcmFkaXhfdHJlZV9kZWxldGUoJnRyYWNrZXItPnJlc190cmVlW1JFU19NUFRdLAorCQkJCQkJCSAgbXB0bik7CisJCQkJCWxpc3RfZGVsKCZtcHQtPmNvbS5saXN0KTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJCQkJCWtmcmVlKG1wdCk7CisJCQkJCXN0YXRlID0gMDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFJFU19NUFRfTUFQUEVEOgorCQkJCQlfX21seDRfbXJfZnJlZV9pY20oZGV2LCBtcHQtPmtleSk7CisJCQkJCXN0YXRlID0gUkVTX01QVF9SRVNFUlZFRDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFJFU19NUFRfSFc6CisJCQkJCWluX3BhcmFtID0gc2xhdmU7CisJCQkJCWVyciA9IG1seDRfY21kKGRldiwgaW5fcGFyYW0sIG1wdG4sIDAsCisJCQkJCQkgICAgIE1MWDRfQ01EX0hXMlNXX01QVCwKKwkJCQkJCSAgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLAorCQkJCQkJICAgICBNTFg0X0NNRF9OQVRJVkUpOworCQkJCQlpZiAoZXJyKQorCQkJCQkJbWx4NF9kYmcoZGV2LCAicmVtX3NsYXZlX21yczogZmFpbGVkIgorCQkJCQkJCSAiIHRvIG1vdmUgc2xhdmUgJWQgbXB0ICVkIHRvIgorCQkJCQkJCSAiIFNXIG93bmVyc2hpcFxuIiwKKwkJCQkJCQkgc2xhdmUsIG1wdG4pOworCQkJCQlpZiAobXB0LT5tdHQpCisJCQkJCQlhdG9taWNfZGVjKCZtcHQtPm10dC0+cmVmX2NvdW50KTsKKwkJCQkJc3RhdGUgPSBSRVNfTVBUX01BUFBFRDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJc3RhdGUgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJfQorCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworfQorCitzdGF0aWMgdm9pZCByZW1fc2xhdmVfbXR0cyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNsYXZlKQoreworCXN0cnVjdCBtbHg0X3ByaXYgKnByaXYgPSBtbHg0X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbWx4NF9yZXNvdXJjZV90cmFja2VyICp0cmFja2VyID0KKwkJJnByaXYtPm1mdW5jLm1hc3Rlci5yZXNfdHJhY2tlcjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICptdHRfbGlzdCA9CisJCSZ0cmFja2VyLT5zbGF2ZV9saXN0W3NsYXZlXS5yZXNfbGlzdFtSRVNfTVRUXTsKKwlzdHJ1Y3QgcmVzX210dCAqbXR0OworCXN0cnVjdCByZXNfbXR0ICp0bXA7CisJaW50IHN0YXRlOworCUxJU1RfSEVBRCh0bGlzdCk7CisJaW50IGJhc2U7CisJaW50IGVycjsKKworCWVyciA9IG1vdmVfYWxsX2J1c3koZGV2LCBzbGF2ZSwgUkVTX01UVCk7CisJaWYgKGVycikKKwkJbWx4NF93YXJuKGRldiwgInJlbV9zbGF2ZV9tdHRzOiBDb3VsZCBub3QgbW92ZSBhbGwgbXR0cyB0byAiCisJCQkgICJidXN5IGZvciBzbGF2ZSAlZFxuIiwgc2xhdmUpOworCisJc3Bpbl9sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtdHQsIHRtcCwgbXR0X2xpc3QsIGNvbS5saXN0KSB7CisJCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCQlpZiAobXR0LT5jb20ub3duZXIgPT0gc2xhdmUpIHsKKwkJCWJhc2UgPSBtdHQtPmNvbS5yZXNfaWQ7CisJCQlzdGF0ZSA9IG10dC0+Y29tLmZyb21fc3RhdGU7CisJCQl3aGlsZSAoc3RhdGUgIT0gMCkgeworCQkJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCQljYXNlIFJFU19NVFRfQUxMT0NBVEVEOgorCQkJCQlfX21seDRfZnJlZV9tdHRfcmFuZ2UoZGV2LCBiYXNlLAorCQkJCQkJCSAgICAgIG10dC0+b3JkZXIpOworCQkJCQlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJCQkJCXJhZGl4X3RyZWVfZGVsZXRlKCZ0cmFja2VyLT5yZXNfdHJlZVtSRVNfTVRUXSwKKwkJCQkJCQkgIGJhc2UpOworCQkJCQlsaXN0X2RlbCgmbXR0LT5jb20ubGlzdCk7CisJCQkJCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCQkJCQlrZnJlZShtdHQpOworCQkJCQlzdGF0ZSA9IDA7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJc3RhdGUgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJfQorCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworfQorCitzdGF0aWMgdm9pZCByZW1fc2xhdmVfZXFzKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCXN0cnVjdCBtbHg0X3Jlc291cmNlX3RyYWNrZXIgKnRyYWNrZXIgPSAmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyOworCXN0cnVjdCBsaXN0X2hlYWQgKmVxX2xpc3QgPQorCQkmdHJhY2tlci0+c2xhdmVfbGlzdFtzbGF2ZV0ucmVzX2xpc3RbUkVTX0VRXTsKKwlzdHJ1Y3QgcmVzX2VxICplcTsKKwlzdHJ1Y3QgcmVzX2VxICp0bXA7CisJaW50IGVycjsKKwlpbnQgc3RhdGU7CisJTElTVF9IRUFEKHRsaXN0KTsKKwlpbnQgZXFuOworCXN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94OworCisJZXJyID0gbW92ZV9hbGxfYnVzeShkZXYsIHNsYXZlLCBSRVNfRVEpOworCWlmIChlcnIpCisJCW1seDRfd2FybihkZXYsICJyZW1fc2xhdmVfZXFzOiBDb3VsZCBub3QgbW92ZSBhbGwgZXFzIHRvICIKKwkJCSAgImJ1c3kgZm9yIHNsYXZlICVkXG4iLCBzbGF2ZSk7CisKKwlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGVxLCB0bXAsIGVxX2xpc3QsIGNvbS5saXN0KSB7CisJCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCQlpZiAoZXEtPmNvbS5vd25lciA9PSBzbGF2ZSkgeworCQkJZXFuID0gZXEtPmNvbS5yZXNfaWQ7CisJCQlzdGF0ZSA9IGVxLT5jb20uZnJvbV9zdGF0ZTsKKwkJCXdoaWxlIChzdGF0ZSAhPSAwKSB7CisJCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJCWNhc2UgUkVTX0VRX1JFU0VSVkVEOgorCQkJCQlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJCQkJCXJhZGl4X3RyZWVfZGVsZXRlKCZ0cmFja2VyLT5yZXNfdHJlZVtSRVNfRVFdLAorCQkJCQkJCSAgZXFuKTsKKwkJCQkJbGlzdF9kZWwoJmVxLT5jb20ubGlzdCk7CisJCQkJCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworCQkJCQlrZnJlZShlcSk7CisJCQkJCXN0YXRlID0gMDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIFJFU19FUV9IVzoKKwkJCQkJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKKwkJCQkJaWYgKElTX0VSUihtYWlsYm94KSkgeworCQkJCQkJY29uZF9yZXNjaGVkKCk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQllcnIgPSBtbHg0X2NtZF9ib3goZGV2LCBzbGF2ZSwgMCwKKwkJCQkJCQkgICBlcW4gJiAweGZmLCAwLAorCQkJCQkJCSAgIE1MWDRfQ01EX0hXMlNXX0VRLAorCQkJCQkJCSAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSwKKwkJCQkJCQkgICBNTFg0X0NNRF9OQVRJVkUpOworCQkJCQltbHg0X2RiZyhkZXYsICJyZW1fc2xhdmVfZXFzOiBmYWlsZWQiCisJCQkJCQkgIiB0byBtb3ZlIHNsYXZlICVkIGVxcyAlZCB0byIKKwkJCQkJCSAiIFNXIG93bmVyc2hpcFxuIiwgc2xhdmUsIGVxbik7CisJCQkJCW1seDRfZnJlZV9jbWRfbWFpbGJveChkZXYsIG1haWxib3gpOworCQkJCQlpZiAoIWVycikgeworCQkJCQkJYXRvbWljX2RlYygmZXEtPm10dC0+cmVmX2NvdW50KTsKKwkJCQkJCXN0YXRlID0gUkVTX0VRX1JFU0VSVkVEOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJc3RhdGUgPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxKG1seDRfdGxvY2soZGV2KSk7CisJfQorCXNwaW5fdW5sb2NrX2lycShtbHg0X3Rsb2NrKGRldikpOworfQorCit2b2lkIG1seDRfZGVsZXRlX2FsbF9yZXNvdXJjZXNfZm9yX3NsYXZlKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgc2xhdmUpCit7CisJc3RydWN0IG1seDRfcHJpdiAqcHJpdiA9IG1seDRfcHJpdihkZXYpOworCisJbXV0ZXhfbG9jaygmcHJpdi0+bWZ1bmMubWFzdGVyLnJlc190cmFja2VyLnNsYXZlX2xpc3Rbc2xhdmVdLm11dGV4KTsKKwkvKlZMQU4qLworCXJlbV9zbGF2ZV9tYWNzKGRldiwgc2xhdmUpOworCXJlbV9zbGF2ZV9xcHMoZGV2LCBzbGF2ZSk7CisJcmVtX3NsYXZlX3NycXMoZGV2LCBzbGF2ZSk7CisJcmVtX3NsYXZlX2NxcyhkZXYsIHNsYXZlKTsKKwlyZW1fc2xhdmVfbXJzKGRldiwgc2xhdmUpOworCXJlbV9zbGF2ZV9lcXMoZGV2LCBzbGF2ZSk7CisJcmVtX3NsYXZlX210dHMoZGV2LCBzbGF2ZSk7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5tZnVuYy5tYXN0ZXIucmVzX3RyYWNrZXIuc2xhdmVfbGlzdFtzbGF2ZV0ubXV0ZXgpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9zZW5zZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9zZW5zZS5jCmluZGV4IGUyMzM3YTcuLjgwMjQ5ODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvc2Vuc2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3NlbnNlLmMKQEAgLTQ1LDcgKzQ1LDggQEAKIAlpbnQgZXJyID0gMDsKIAogCWVyciA9IG1seDRfY21kX2ltbShkZXYsIDAsICZvdXRfcGFyYW0sIHBvcnQsIDAsCi0JCQkgICBNTFg0X0NNRF9TRU5TRV9QT1JULCBNTFg0X0NNRF9USU1FX0NMQVNTX0IpOworCQkJICAgTUxYNF9DTURfU0VOU0VfUE9SVCwgTUxYNF9DTURfVElNRV9DTEFTU19CLAorCQkJICAgTUxYNF9DTURfV1JBUFBFRCk7CiAJaWYgKGVycikgewogCQltbHg0X2VycihkZXYsICJTZW5zZSBjb21tYW5kIGZhaWxlZCBmb3IgcG9ydDogJWRcbiIsIHBvcnQpOwogCQlyZXR1cm4gZXJyOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9zcnEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21lbGxhbm94L21seDQvc3JxLmMKaW5kZXggOWNiZjNmYy4uMjgyM2ZmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWVsbGFub3gvbWx4NC9zcnEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9tZWxsYW5veC9tbHg0L3NycS5jCkBAIC0zMSw2ICszMSw4IEBACiAgKiBTT0ZUV0FSRS4KICAqLwogCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCiAjaW5jbHVkZSA8bGludXgvbWx4NC9jbWQuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KQEAgLTM4LDI2ICs0MCw2IEBACiAjaW5jbHVkZSAibWx4NC5oIgogI2luY2x1ZGUgImljbS5oIgogCi1zdHJ1Y3QgbWx4NF9zcnFfY29udGV4dCB7Ci0JX19iZTMyCQkJc3RhdGVfbG9nc2l6ZV9zcnFuOwotCXU4CQkJbG9nc3RyaWRlOwotCXU4CQkJcmVzZXJ2ZWQxOwotCV9fYmUxNgkJCXhyY2Q7Ci0JX19iZTMyCQkJcGdfb2Zmc2V0X2NxbjsKLQl1MzIJCQlyZXNlcnZlZDI7Ci0JdTgJCQlsb2dfcGFnZV9zaXplOwotCXU4CQkJcmVzZXJ2ZWQzWzJdOwotCXU4CQkJbXR0X2Jhc2VfYWRkcl9oOwotCV9fYmUzMgkJCW10dF9iYXNlX2FkZHJfbDsKLQlfX2JlMzIJCQlwZDsKLQlfX2JlMTYJCQlsaW1pdF93YXRlcm1hcms7Ci0JX19iZTE2CQkJd3FlX2NudDsKLQl1MTYJCQlyZXNlcnZlZDQ7Ci0JX19iZTE2CQkJd3FlX2NvdW50ZXI7Ci0JdTMyCQkJcmVzZXJ2ZWQ1OwotCV9fYmU2NAkJCWRiX3JlY19hZGRyOwotfTsKLQogdm9pZCBtbHg0X3NycV9ldmVudChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIHNycW4sIGludCBldmVudF90eXBlKQogewogCXN0cnVjdCBtbHg0X3NycV90YWJsZSAqc3JxX3RhYmxlID0gJm1seDRfcHJpdihkZXYpLT5zcnFfdGFibGU7CkBAIC04NSw4ICs2Nyw5IEBACiBzdGF0aWMgaW50IG1seDRfU1cySFdfU1JRKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveCwKIAkJCSAgaW50IHNycV9udW0pCiB7Ci0JcmV0dXJuIG1seDRfY21kKGRldiwgbWFpbGJveC0+ZG1hLCBzcnFfbnVtLCAwLCBNTFg0X0NNRF9TVzJIV19TUlEsCi0JCQlNTFg0X0NNRF9USU1FX0NMQVNTX0EpOworCXJldHVybiBtbHg0X2NtZChkZXYsIG1haWxib3gtPmRtYSB8IGRldi0+Y2Fwcy5mdW5jdGlvbiwgc3JxX251bSwgMCwKKwkJCU1MWDRfQ01EX1NXMkhXX1NSUSwgTUxYNF9DTURfVElNRV9DTEFTU19BLAorCQkJTUxYNF9DTURfV1JBUFBFRCk7CiB9CiAKIHN0YXRpYyBpbnQgbWx4NF9IVzJTV19TUlEoc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptYWlsYm94LApAQCAtOTQsMjAgKzc3LDg5IEBACiB7CiAJcmV0dXJuIG1seDRfY21kX2JveChkZXYsIDAsIG1haWxib3ggPyBtYWlsYm94LT5kbWEgOiAwLCBzcnFfbnVtLAogCQkJICAgIG1haWxib3ggPyAwIDogMSwgTUxYNF9DTURfSFcyU1dfU1JRLAotCQkJICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSk7CisJCQkgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9XUkFQUEVEKTsKIH0KIAogc3RhdGljIGludCBtbHg0X0FSTV9TUlEoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzcnFfbnVtLCBpbnQgbGltaXRfd2F0ZXJtYXJrKQogewogCXJldHVybiBtbHg0X2NtZChkZXYsIGxpbWl0X3dhdGVybWFyaywgc3JxX251bSwgMCwgTUxYNF9DTURfQVJNX1NSUSwKLQkJCU1MWDRfQ01EX1RJTUVfQ0xBU1NfQik7CisJCQlNTFg0X0NNRF9USU1FX0NMQVNTX0IsIE1MWDRfQ01EX1dSQVBQRUQpOwogfQogCiBzdGF0aWMgaW50IG1seDRfUVVFUllfU1JRKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveCwKIAkJCSAgaW50IHNycV9udW0pCiB7CiAJcmV0dXJuIG1seDRfY21kX2JveChkZXYsIDAsIG1haWxib3gtPmRtYSwgc3JxX251bSwgMCwgTUxYNF9DTURfUVVFUllfU1JRLAotCQkJICAgIE1MWDRfQ01EX1RJTUVfQ0xBU1NfQSk7CisJCQkgICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9XUkFQUEVEKTsKK30KKworaW50IF9fbWx4NF9zcnFfYWxsb2NfaWNtKHN0cnVjdCBtbHg0X2RldiAqZGV2LCBpbnQgKnNycW4pCit7CisJc3RydWN0IG1seDRfc3JxX3RhYmxlICpzcnFfdGFibGUgPSAmbWx4NF9wcml2KGRldiktPnNycV90YWJsZTsKKwlpbnQgZXJyOworCisKKwkqc3JxbiA9IG1seDRfYml0bWFwX2FsbG9jKCZzcnFfdGFibGUtPmJpdG1hcCk7CisJaWYgKCpzcnFuID09IC0xKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IG1seDRfdGFibGVfZ2V0KGRldiwgJnNycV90YWJsZS0+dGFibGUsICpzcnFuKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vdXQ7CisKKwllcnIgPSBtbHg0X3RhYmxlX2dldChkZXYsICZzcnFfdGFibGUtPmNtcHRfdGFibGUsICpzcnFuKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9wdXQ7CisJcmV0dXJuIDA7CisKK2Vycl9wdXQ6CisJbWx4NF90YWJsZV9wdXQoZGV2LCAmc3JxX3RhYmxlLT50YWJsZSwgKnNycW4pOworCitlcnJfb3V0OgorCW1seDRfYml0bWFwX2ZyZWUoJnNycV90YWJsZS0+Yml0bWFwLCAqc3Jxbik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtbHg0X3NycV9hbGxvY19pY20oc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCAqc3JxbikKK3sKKwl1NjQgb3V0X3BhcmFtOworCWludCBlcnI7CisKKwlpZiAobWx4NF9pc19tZnVuYyhkZXYpKSB7CisJCWVyciA9IG1seDRfY21kX2ltbShkZXYsIDAsICZvdXRfcGFyYW0sIFJFU19TUlEsCisJCQkJICAgUkVTX09QX1JFU0VSVkVfQU5EX01BUCwKKwkJCQkgICBNTFg0X0NNRF9BTExPQ19SRVMsCisJCQkJICAgTUxYNF9DTURfVElNRV9DTEFTU19BLCBNTFg0X0NNRF9XUkFQUEVEKTsKKwkJaWYgKCFlcnIpCisJCQkqc3JxbiA9IGdldF9wYXJhbV9sKCZvdXRfcGFyYW0pOworCisJCXJldHVybiBlcnI7CisJfQorCXJldHVybiBfX21seDRfc3JxX2FsbG9jX2ljbShkZXYsIHNycW4pOworfQorCit2b2lkIF9fbWx4NF9zcnFfZnJlZV9pY20oc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzcnFuKQoreworCXN0cnVjdCBtbHg0X3NycV90YWJsZSAqc3JxX3RhYmxlID0gJm1seDRfcHJpdihkZXYpLT5zcnFfdGFibGU7CisKKwltbHg0X3RhYmxlX3B1dChkZXYsICZzcnFfdGFibGUtPmNtcHRfdGFibGUsIHNycW4pOworCW1seDRfdGFibGVfcHV0KGRldiwgJnNycV90YWJsZS0+dGFibGUsIHNycW4pOworCW1seDRfYml0bWFwX2ZyZWUoJnNycV90YWJsZS0+Yml0bWFwLCBzcnFuKTsKK30KKworc3RhdGljIHZvaWQgbWx4NF9zcnFfZnJlZV9pY20oc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBzcnFuKQoreworCXU2NCBpbl9wYXJhbTsKKworCWlmIChtbHg0X2lzX21mdW5jKGRldikpIHsKKwkJc2V0X3BhcmFtX2woJmluX3BhcmFtLCBzcnFuKTsKKwkJaWYgKG1seDRfY21kKGRldiwgaW5fcGFyYW0sIFJFU19TUlEsIFJFU19PUF9SRVNFUlZFX0FORF9NQVAsCisJCQkgICAgIE1MWDRfQ01EX0ZSRUVfUkVTLAorCQkJICAgICBNTFg0X0NNRF9USU1FX0NMQVNTX0EsIE1MWDRfQ01EX1dSQVBQRUQpKQorCQkJbWx4NF93YXJuKGRldiwgIkZhaWxlZCBmcmVlaW5nIGNxOiVkXG4iLCBzcnFuKTsKKwkJcmV0dXJuOworCX0KKwlfX21seDRfc3JxX2ZyZWVfaWNtKGRldiwgc3Jxbik7CiB9CiAKIGludCBtbHg0X3NycV9hbGxvYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIHBkbiwgdTMyIGNxbiwgdTE2IHhyY2QsCkBAIC0xMTksMjMgKzE3MSwxNSBAQAogCXU2NCBtdHRfYWRkcjsKIAlpbnQgZXJyOwogCi0Jc3JxLT5zcnFuID0gbWx4NF9iaXRtYXBfYWxsb2MoJnNycV90YWJsZS0+Yml0bWFwKTsKLQlpZiAoc3JxLT5zcnFuID09IC0xKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWVyciA9IG1seDRfdGFibGVfZ2V0KGRldiwgJnNycV90YWJsZS0+dGFibGUsIHNycS0+c3Jxbik7CisJZXJyID0gbWx4NF9zcnFfYWxsb2NfaWNtKGRldiwgJnNycS0+c3Jxbik7CiAJaWYgKGVycikKLQkJZ290byBlcnJfb3V0OwotCi0JZXJyID0gbWx4NF90YWJsZV9nZXQoZGV2LCAmc3JxX3RhYmxlLT5jbXB0X3RhYmxlLCBzcnEtPnNycW4pOwotCWlmIChlcnIpCi0JCWdvdG8gZXJyX3B1dDsKKwkJcmV0dXJuIGVycjsKIAogCXNwaW5fbG9ja19pcnEoJnNycV90YWJsZS0+bG9jayk7CiAJZXJyID0gcmFkaXhfdHJlZV9pbnNlcnQoJnNycV90YWJsZS0+dHJlZSwgc3JxLT5zcnFuLCBzcnEpOwogCXNwaW5fdW5sb2NrX2lycSgmc3JxX3RhYmxlLT5sb2NrKTsKIAlpZiAoZXJyKQotCQlnb3RvIGVycl9jbXB0X3B1dDsKKwkJZ290byBlcnJfaWNtOwogCiAJbWFpbGJveCA9IG1seDRfYWxsb2NfY21kX21haWxib3goZGV2KTsKIAlpZiAoSVNfRVJSKG1haWxib3gpKSB7CkBAIC0xNzQsMTUgKzIxOCw4IEBACiAJcmFkaXhfdHJlZV9kZWxldGUoJnNycV90YWJsZS0+dHJlZSwgc3JxLT5zcnFuKTsKIAlzcGluX3VubG9ja19pcnEoJnNycV90YWJsZS0+bG9jayk7CiAKLWVycl9jbXB0X3B1dDoKLQltbHg0X3RhYmxlX3B1dChkZXYsICZzcnFfdGFibGUtPmNtcHRfdGFibGUsIHNycS0+c3Jxbik7Ci0KLWVycl9wdXQ6Ci0JbWx4NF90YWJsZV9wdXQoZGV2LCAmc3JxX3RhYmxlLT50YWJsZSwgc3JxLT5zcnFuKTsKLQotZXJyX291dDoKLQltbHg0X2JpdG1hcF9mcmVlKCZzcnFfdGFibGUtPmJpdG1hcCwgc3JxLT5zcnFuKTsKLQorZXJyX2ljbToKKwltbHg0X3NycV9mcmVlX2ljbShkZXYsIHNycS0+c3Jxbik7CiAJcmV0dXJuIGVycjsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG1seDRfc3JxX2FsbG9jKTsKQEAgLTIwNCw4ICsyNDEsNyBAQAogCQljb21wbGV0ZSgmc3JxLT5mcmVlKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzcnEtPmZyZWUpOwogCi0JbWx4NF90YWJsZV9wdXQoZGV2LCAmc3JxX3RhYmxlLT50YWJsZSwgc3JxLT5zcnFuKTsKLQltbHg0X2JpdG1hcF9mcmVlKCZzcnFfdGFibGUtPmJpdG1hcCwgc3JxLT5zcnFuKTsKKwltbHg0X3NycV9mcmVlX2ljbShkZXYsIHNycS0+c3Jxbik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChtbHg0X3NycV9mcmVlKTsKIApAQCAtMjQ1LDYgKzI4MSw4IEBACiAKIAlzcGluX2xvY2tfaW5pdCgmc3JxX3RhYmxlLT5sb2NrKTsKIAlJTklUX1JBRElYX1RSRUUoJnNycV90YWJsZS0+dHJlZSwgR0ZQX0FUT01JQyk7CisJaWYgKG1seDRfaXNfc2xhdmUoZGV2KSkKKwkJcmV0dXJuIDA7CiAKIAllcnIgPSBtbHg0X2JpdG1hcF9pbml0KCZzcnFfdGFibGUtPmJpdG1hcCwgZGV2LT5jYXBzLm51bV9zcnFzLAogCQkJICAgICAgIGRldi0+Y2Fwcy5udW1fc3JxcyAtIDEsIGRldi0+Y2Fwcy5yZXNlcnZlZF9zcnFzLCAwKTsKQEAgLTI1Niw1ICsyOTQsNyBAQAogCiB2b2lkIG1seDRfY2xlYW51cF9zcnFfdGFibGUoc3RydWN0IG1seDRfZGV2ICpkZXYpCiB7CisJaWYgKG1seDRfaXNfc2xhdmUoZGV2KSkKKwkJcmV0dXJuOwogCW1seDRfYml0bWFwX2NsZWFudXAoJm1seDRfcHJpdihkZXYpLT5zcnFfdGFibGUuYml0bWFwKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9LY29uZmlnIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL0tjb25maWcKaW5kZXggZDEwYzJlMS4uMWVhODExYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL0tjb25maWcKQEAgLTQyLDYgKzQyLDggQEAKIAlzZWxlY3QgTkVUX0NPUkUKIAlzZWxlY3QgTUlJCiAJc2VsZWN0IENSQzMyCisJc2VsZWN0IE1JU0NfREVWSUNFUworCXNlbGVjdCBFRVBST01fOTNDWDYKIAktLS1oZWxwLS0tCiAJICBTUEkgZHJpdmVyIGZvciBNaWNyZWwgS1M4ODUxIFNQSSBhdHRhY2hlZCBuZXR3b3JrIGNoaXAuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rczg4NDIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rczg4NDIuYwppbmRleCA0YTZhZTA1Li43NWVjODdhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3M4ODQyLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg0Mi5jCkBAIC0xMjY0LDE4ICsxMjY0LDcgQEAKIAkucmVtb3ZlCQk9IGtzODg0Ml9yZW1vdmUsCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBrczg4NDJfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmtzODg0Ml9wbGF0Zm9ybV9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQga3M4ODQyX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigma3M4ODQyX3BsYXRmb3JtX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KGtzODg0Ml9pbml0KTsKLW1vZHVsZV9leGl0KGtzODg0Ml9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoa3M4ODQyX3BsYXRmb3JtX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiVGltYmVyZGFsZSBLUzg4NDIgZXRoZXJuZXQgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJNb2NlYW4gTGFib3JhdG9yaWVzIDxpbmZvQG1vY2Vhbi1sYWJzLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rczg4NTEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rczg4NTEuYwppbmRleCBmNTY3NDNhLi42YjM1ZTdkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3M4ODUxLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogI2luY2x1ZGUgPGxpbnV4L21paS5oPgorI2luY2x1ZGUgPGxpbnV4L2VlcHJvbV85M2N4Ni5oPgogCiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogCkBAIC04Miw2ICs4Myw3IEBACiAgKiBAcmNfY2NyOiBDYWNoZWQgY29weSBvZiBLU19DQ1IuCiAgKiBAcmNfcnhxY3I6IENhY2hlZCBjb3B5IG9mIEtTX1JYUUNSLgogICogQGVlcHJvbV9zaXplOiBDb21wYW5pb24gZWVwcm9tIHNpemUgaW4gQnl0ZXMsIDAgaWYgbm8gZWVwcm9tCisgKiBAZWVwcm9tOiA5M0NYNiBFRVBST00gc3RhdGUgZm9yIGFjY2Vzc2luZyBvbi1ib2FyZCBFRVBST00uCiAgKgogICogVGhlIEBsb2NrIGVuc3VyZXMgdGhhdCB0aGUgY2hpcCBpcyBwcm90ZWN0ZWQgd2hlbiBjZXJ0YWluIG9wZXJhdGlvbnMgYXJlCiAgKiBpbiBwcm9ncmVzcy4gV2hlbiB0aGUgcmVhZCBvciB3cml0ZSBwYWNrZXQgdHJhbnNmZXIgaXMgaW4gcHJvZ3Jlc3MsIG1vc3QKQEAgLTEyOCw2ICsxMzAsOCBAQAogCXN0cnVjdCBzcGlfbWVzc2FnZQlzcGlfbXNnMjsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXNwaV94ZmVyMTsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyCXNwaV94ZmVyMlsyXTsKKworCXN0cnVjdCBlZXByb21fOTNjeDYJZWVwcm9tOwogfTsKIAogc3RhdGljIGludCBtc2dfZW5hYmxlOwpAQCAtMzQzLDYgKzM0NywyNiBAQAogfQogCiAvKioKKyAqIGtzODg1MV9zZXRfcG93ZXJtb2RlIC0gc2V0IHBvd2VyIG1vZGUgb2YgdGhlIGRldmljZQorICogQGtzOiBUaGUgZGV2aWNlIHN0YXRlCisgKiBAcHdybW9kZTogVGhlIHBvd2VyIG1vZGUgdmFsdWUgdG8gd3JpdGUgdG8gS1NfUE1FQ1IuCisgKgorICogQ2hhbmdlIHRoZSBwb3dlciBtb2RlIG9mIHRoZSBjaGlwLgorICovCitzdGF0aWMgdm9pZCBrczg4NTFfc2V0X3Bvd2VybW9kZShzdHJ1Y3Qga3M4ODUxX25ldCAqa3MsIHVuc2lnbmVkIHB3cm1vZGUpCit7CisJdW5zaWduZWQgcG1lY3I7CisKKwluZXRpZl9kYmcoa3MsIGh3LCBrcy0+bmV0ZGV2LCAic2V0dGluZyBwb3dlciBtb2RlICVkXG4iLCBwd3Jtb2RlKTsKKworCXBtZWNyID0ga3M4ODUxX3JkcmVnMTYoa3MsIEtTX1BNRUNSKTsKKwlwbWVjciAmPSB+UE1FQ1JfUE1fTUFTSzsKKwlwbWVjciB8PSBwd3Jtb2RlOworCisJa3M4ODUxX3dycmVnMTYoa3MsIEtTX1BNRUNSLCBwbWVjcik7Cit9CisKKy8qKgogICoga3M4ODUxX3dyaXRlX21hY19hZGRyIC0gd3JpdGUgbWFjIGFkZHJlc3MgdG8gZGV2aWNlIHJlZ2lzdGVycwogICogQGRldjogVGhlIG5ldHdvcmsgZGV2aWNlCiAgKgpAQCAtMzU4LDggKzM4MiwxNSBAQAogCiAJbXV0ZXhfbG9jaygma3MtPmxvY2spOwogCisJLyoKKwkgKiBXYWtlIHVwIGNoaXAgaW4gY2FzZSBpdCB3YXMgcG93ZXJlZCBvZmYgd2hlbiBzdG9wcGVkOyBvdGhlcndpc2UsCisJICogdGhlIGZpcnN0IHdyaXRlIHRvIHRoZSBNQUMgYWRkcmVzcyBkb2VzIG5vdCB0YWtlIGVmZmVjdC4KKwkgKi8KKwlrczg4NTFfc2V0X3Bvd2VybW9kZShrcywgUE1FQ1JfUE1fTk9STUFMKTsKIAlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKIAkJa3M4ODUxX3dycmVnOChrcywgS1NfTUFSKGkpLCBkZXYtPmRldl9hZGRyW2ldKTsKKwlpZiAoIW5ldGlmX3J1bm5pbmcoZGV2KSkKKwkJa3M4ODUxX3NldF9wb3dlcm1vZGUoa3MsIFBNRUNSX1BNX1NPRlRET1dOKTsKIAogCW11dGV4X3VubG9jaygma3MtPmxvY2spOwogCkBAIC0zNjcsMjEgKzM5OCw0NyBAQAogfQogCiAvKioKKyAqIGtzODg1MV9yZWFkX21hY19hZGRyIC0gcmVhZCBtYWMgYWRkcmVzcyBmcm9tIGRldmljZSByZWdpc3RlcnMKKyAqIEBkZXY6IFRoZSBuZXR3b3JrIGRldmljZQorICoKKyAqIFVwZGF0ZSBvdXIgY29weSBvZiB0aGUgS1M4ODUxIE1BQyBhZGRyZXNzIGZyb20gdGhlIHJlZ2lzdGVycyBvZiBAZGV2LgorKi8KK3N0YXRpYyB2b2lkIGtzODg1MV9yZWFkX21hY19hZGRyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGtzODg1MV9uZXQgKmtzID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgaTsKKworCW11dGV4X2xvY2soJmtzLT5sb2NrKTsKKworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQorCQlkZXYtPmRldl9hZGRyW2ldID0ga3M4ODUxX3JkcmVnOChrcywgS1NfTUFSKGkpKTsKKworCW11dGV4X3VubG9jaygma3MtPmxvY2spOworfQorCisvKioKICAqIGtzODg1MV9pbml0X21hYyAtIGluaXRpYWxpc2UgdGhlIG1hYyBhZGRyZXNzCiAgKiBAa3M6IFRoZSBkZXZpY2Ugc3RydWN0dXJlCiAgKgogICogR2V0IG9yIGNyZWF0ZSB0aGUgaW5pdGlhbCBtYWMgYWRkcmVzcyBmb3IgdGhlIGRldmljZSBhbmQgdGhlbiBzZXQgdGhhdAotICogaW50byB0aGUgc3RhdGlvbiBhZGRyZXNzIHJlZ2lzdGVyLiBDdXJyZW50bHkgd2UgYXNzdW1lIHRoYXQgdGhlIGRldmljZQotICogZG9lcyBub3QgaGF2ZSBhIHZhbGlkIG1hYyBhZGRyZXNzIGluIGl0LCBhbmQgc28gd2UgdXNlIHJhbmRvbV9ldGhlcl9hZGRyKCkKKyAqIGludG8gdGhlIHN0YXRpb24gYWRkcmVzcyByZWdpc3Rlci4gSWYgdGhlcmUgaXMgYW4gRUVQUk9NIHByZXNlbnQsIHRoZW4KKyAqIHdlIHRyeSB0aGF0LiBJZiBubyB2YWxpZCBtYWMgYWRkcmVzcyBpcyBmb3VuZCB3ZSB1c2UgcmFuZG9tX2V0aGVyX2FkZHIoKQogICogdG8gY3JlYXRlIGEgbmV3IG9uZS4KLSAqCi0gKiBJbiBmdXR1cmUsIHRoZSBkcml2ZXIgc2hvdWxkIGNoZWNrIHRvIHNlZSBpZiB0aGUgZGV2aWNlIGhhcyBhbiBFRVBST00KLSAqIGF0dGFjaGVkIGFuZCB3aGV0aGVyIHRoYXQgaGFzIGEgdmFsaWQgZXRoZXJuZXQgYWRkcmVzcyBpbiBpdC4KICAqLwogc3RhdGljIHZvaWQga3M4ODUxX2luaXRfbWFjKHN0cnVjdCBrczg4NTFfbmV0ICprcykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0ga3MtPm5ldGRldjsKIAorCS8qIGZpcnN0LCB0cnkgcmVhZGluZyB3aGF0IHdlJ3ZlIGdvdCBhbHJlYWR5ICovCisJaWYgKGtzLT5yY19jY3IgJiBDQ1JfRUVQUk9NKSB7CisJCWtzODg1MV9yZWFkX21hY19hZGRyKGRldik7CisJCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKQorCQkJcmV0dXJuOworCisJCW5ldGRldl9lcnIoa3MtPm5ldGRldiwgImludmFsaWQgbWFjIGFkZHJlc3MgcmVhZCAlcE1cbiIsCisJCQkJZGV2LT5kZXZfYWRkcik7CisJfQorCiAJcmFuZG9tX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcik7CiAJa3M4ODUxX3dyaXRlX21hY19hZGRyKGRldik7CiB9CkBAIC03MzksMjYgKzc5Niw2IEBACiB9CiAKIC8qKgotICoga3M4ODUxX3NldF9wb3dlcm1vZGUgLSBzZXQgcG93ZXIgbW9kZSBvZiB0aGUgZGV2aWNlCi0gKiBAa3M6IFRoZSBkZXZpY2Ugc3RhdGUKLSAqIEBwd3Jtb2RlOiBUaGUgcG93ZXIgbW9kZSB2YWx1ZSB0byB3cml0ZSB0byBLU19QTUVDUi4KLSAqCi0gKiBDaGFuZ2UgdGhlIHBvd2VyIG1vZGUgb2YgdGhlIGNoaXAuCi0gKi8KLXN0YXRpYyB2b2lkIGtzODg1MV9zZXRfcG93ZXJtb2RlKHN0cnVjdCBrczg4NTFfbmV0ICprcywgdW5zaWduZWQgcHdybW9kZSkKLXsKLQl1bnNpZ25lZCBwbWVjcjsKLQotCW5ldGlmX2RiZyhrcywgaHcsIGtzLT5uZXRkZXYsICJzZXR0aW5nIHBvd2VyIG1vZGUgJWRcbiIsIHB3cm1vZGUpOwotCi0JcG1lY3IgPSBrczg4NTFfcmRyZWcxNihrcywgS1NfUE1FQ1IpOwotCXBtZWNyICY9IH5QTUVDUl9QTV9NQVNLOwotCXBtZWNyIHw9IHB3cm1vZGU7Ci0KLQlrczg4NTFfd3JyZWcxNihrcywgS1NfUE1FQ1IsIHBtZWNyKTsKLX0KLQotLyoqCiAgKiBrczg4NTFfbmV0X29wZW4gLSBvcGVuIG5ldHdvcmsgZGV2aWNlCiAgKiBAZGV2OiBUaGUgbmV0d29yayBkZXZpY2UgYmVpbmcgb3BlbmVkLgogICoKQEAgLTEwMzgsMjM0ICsxMDc1LDYgQEAKIAkubmRvX3ZhbGlkYXRlX2FkZHIJPSBldGhfdmFsaWRhdGVfYWRkciwKIH07CiAKLS8qIENvbXBhbmlvbiBlZXByb20gYWNjZXNzICovCi0KLWVudW0gewkvKiBFRVBST00gcHJvZ3JhbW1pbmcgc3RhdGVzICovCi0JRUVQUk9NX0NPTlRST0wsCi0JRUVQUk9NX0FERFJFU1MsCi0JRUVQUk9NX0RBVEEsCi0JRUVQUk9NX0NPTVBMRVRFCi19OwotCi0vKioKLSAqIGtzODg1MV9lZXByb21fcmVhZCAtIHJlYWQgYSAxNmJpdHMgd29yZCBpbiBrczg4NTEgY29tcGFuaW9uIEVFUFJPTQotICogQGRldjogVGhlIG5ldHdvcmsgZGV2aWNlIHRoZSBQSFkgaXMgb24uCi0gKiBAYWRkcjogRUVQUk9NIGFkZHJlc3MgdG8gcmVhZAotICoKLSAqIGVlcHJvbV9zaXplOiB1c2VkIHRvIGRlZmluZSB0aGUgZGF0YSBjb2RpbmcgbGVuZ3RoLiBDYW4gYmUgY2hhbmdlZAotICogdGhyb3VnaCBkZWJ1Zy1mcy4KLSAqCi0gKiBQcm9ncmFtcyBhIHJlYWQgb24gdGhlIEVFUFJPTSB1c2luZyBrczg4NTEgRUVQUk9NIFNXIGFjY2VzcyBmZWF0dXJlLgotICogV2FybmluZzogVGhlIFJFQUQgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIG9uIGtzODg1MSByZXZpc2lvbiAwLgotICoKLSAqIFJvdWdoIHByb2dyYW1taW5nIG1vZGVsOgotICogIC0gb24gcGVyaW9kIHN0YXJ0OiBzZXQgY2xvY2sgaGlnaCBhbmQgcmVhZCB2YWx1ZSBvbiBidXMKLSAqICAtIG9uIHBlcmlvZCAvIDI6IHNldCBjbG9jayBsb3cgYW5kIHByb2dyYW0gdmFsdWUgb24gYnVzCi0gKiAgLSBzdGFydCBvbiBwZXJpb2QgLyAyCi0gKi8KLXVuc2lnbmVkIGludCBrczg4NTFfZWVwcm9tX3JlYWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IGFkZHIpCi17Ci0Jc3RydWN0IGtzODg1MV9uZXQgKmtzID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgZWVwY3I7Ci0JaW50IGN0cmwgPSBFRVBST01fT1BfUkVBRDsKLQlpbnQgc3RhdGUgPSBFRVBST01fQ09OVFJPTDsKLQlpbnQgYml0X2NvdW50ID0gRUVQUk9NX09QX0xFTiAtIDE7Ci0JdW5zaWduZWQgaW50IGRhdGEgPSAwOwotCWludCBkdW1teTsKLQl1bnNpZ25lZCBpbnQgYWRkcl9sZW47Ci0KLQlhZGRyX2xlbiA9IChrcy0+ZWVwcm9tX3NpemUgPT0gMTI4KSA/IDYgOiA4OwotCi0JLyogc3RhcnQgdHJhbnNhY3Rpb246IGNoaXAgc2VsZWN0IGhpZ2gsIGF1dGhvcml6ZSB3cml0ZSAqLwotCW11dGV4X2xvY2soJmtzLT5sb2NrKTsKLQllZXBjciA9IEVFUENSX0VFU0EgfCBFRVBDUl9FRVNSV0E7Ci0Ja3M4ODUxX3dycmVnMTYoa3MsIEtTX0VFUENSLCBlZXBjcik7Ci0JZWVwY3IgfD0gRUVQQ1JfRUVDUzsKLQlrczg4NTFfd3JyZWcxNihrcywgS1NfRUVQQ1IsIGVlcGNyKTsKLQltdXRleF91bmxvY2soJmtzLT5sb2NrKTsKLQotCXdoaWxlIChzdGF0ZSAhPSBFRVBST01fQ09NUExFVEUpIHsKLQkJLyogZmFsbGluZyBjbG9jayBwZXJpb2Qgc3RhcnRzLi4uICovCi0JCS8qIHNldCBFRURfSU8gcGluIGZvciBjb250cm9sIGFuZCBhZGRyZXNzICovCi0JCWVlcGNyICY9IH5FRVBDUl9FRURPOwotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCWNhc2UgRUVQUk9NX0NPTlRST0w6Ci0JCQllZXBjciB8PSAoKGN0cmwgPj4gYml0X2NvdW50KSAmIDEpIDw8IDI7Ci0JCQlpZiAoYml0X2NvdW50LS0gPD0gMCkgewotCQkJCWJpdF9jb3VudCA9IGFkZHJfbGVuIC0gMTsKLQkJCQlzdGF0ZSA9IEVFUFJPTV9BRERSRVNTOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgRUVQUk9NX0FERFJFU1M6Ci0JCQllZXBjciB8PSAoKGFkZHIgPj4gYml0X2NvdW50KSAmIDEpIDw8IDI7Ci0JCQliaXRfY291bnQtLTsKLQkJCWJyZWFrOwotCQljYXNlIEVFUFJPTV9EQVRBOgotCQkJLyogQ2hhbmdlIHRvIHJlY2VpdmUgbW9kZSAqLwotCQkJZWVwY3IgJj0gfkVFUENSX0VFU1JXQTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJLyogbG93ZXIgY2xvY2sgICovCi0JCWVlcGNyICY9IH5FRVBDUl9FRVNDSzsKLQotCQltdXRleF9sb2NrKCZrcy0+bG9jayk7Ci0JCWtzODg1MV93cnJlZzE2KGtzLCBLU19FRVBDUiwgZWVwY3IpOwotCQltdXRleF91bmxvY2soJmtzLT5sb2NrKTsKLQotCQkvKiB3YWl0cmVhZCBwZXJpb2QgLyAyICovCi0JCXVkZWxheShFRVBST01fU0tfUEVSSU9EIC8gMik7Ci0KLQkJLyogcmlzaW5nIGNsb2NrIHBlcmlvZCBzdGFydHMuLi4gKi8KLQotCQkvKiByYWlzZSBjbG9jayAqLwotCQltdXRleF9sb2NrKCZrcy0+bG9jayk7Ci0JCWVlcGNyIHw9IEVFUENSX0VFU0NLOwotCQlrczg4NTFfd3JyZWcxNihrcywgS1NfRUVQQ1IsIGVlcGNyKTsKLQkJbXV0ZXhfdW5sb2NrKCZrcy0+bG9jayk7Ci0KLQkJLyogTWFuYWdlIHJlYWQgKi8KLQkJc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIEVFUFJPTV9BRERSRVNTOgotCQkJaWYgKGJpdF9jb3VudCA8IDApIHsKLQkJCQliaXRfY291bnQgPSBFRVBST01fREFUQV9MRU4gLSAxOwotCQkJCXN0YXRlID0gRUVQUk9NX0RBVEE7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBFRVBST01fREFUQToKLQkJCW11dGV4X2xvY2soJmtzLT5sb2NrKTsKLQkJCWR1bW15ID0ga3M4ODUxX3JkcmVnMTYoa3MsIEtTX0VFUENSKTsKLQkJCW11dGV4X3VubG9jaygma3MtPmxvY2spOwotCQkJZGF0YSB8PSAoKGR1bW15ID4+IEVFUENSX0VFU0JfT0ZGU0VUKSAmIDEpIDw8IGJpdF9jb3VudDsKLQkJCWlmIChiaXRfY291bnQtLSA8PSAwKQotCQkJCXN0YXRlID0gRUVQUk9NX0NPTVBMRVRFOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiB3YWl0IHBlcmlvZCAvIDIgKi8KLQkJdWRlbGF5KEVFUFJPTV9TS19QRVJJT0QgLyAyKTsKLQl9Ci0KLQkvKiBjbG9zZSB0cmFuc2FjdGlvbiAqLwotCW11dGV4X2xvY2soJmtzLT5sb2NrKTsKLQllZXBjciAmPSB+RUVQQ1JfRUVDUzsKLQlrczg4NTFfd3JyZWcxNihrcywgS1NfRUVQQ1IsIGVlcGNyKTsKLQllZXBjciA9IDA7Ci0Ja3M4ODUxX3dycmVnMTYoa3MsIEtTX0VFUENSLCBlZXBjcik7Ci0JbXV0ZXhfdW5sb2NrKCZrcy0+bG9jayk7Ci0KLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBrczg4NTFfZWVwcm9tX3dyaXRlIC0gd3JpdGUgYSAxNmJpdHMgd29yZCBpbiBrczg4NTEgY29tcGFuaW9uIEVFUFJPTQotICogQGRldjogVGhlIG5ldHdvcmsgZGV2aWNlIHRoZSBQSFkgaXMgb24uCi0gKiBAb3A6IG9wZXJhbmQgKGNhbiBiZSBXUklURSwgRVdFTiwgRVdEUykKLSAqIEBhZGRyOiBFRVBST00gYWRkcmVzcyB0byB3cml0ZQotICogQGRhdGE6IGRhdGEgdG8gd3JpdGUKLSAqCi0gKiBlZXByb21fc2l6ZTogdXNlZCB0byBkZWZpbmUgdGhlIGRhdGEgY29kaW5nIGxlbmd0aC4gQ2FuIGJlIGNoYW5nZWQKLSAqIHRocm91Z2ggZGVidWctZnMuCi0gKgotICogUHJvZ3JhbXMgYSB3cml0ZSBvbiB0aGUgRUVQUk9NIHVzaW5nIGtzODg1MSBFRVBST00gU1cgYWNjZXNzIGZlYXR1cmUuCi0gKgotICogTm90ZSB0aGF0IGEgd3JpdGUgZW5hYmxlIGlzIHJlcXVpcmVkIGJlZm9yZSB3cml0aW5nIGRhdGEuCi0gKgotICogUm91Z2ggcHJvZ3JhbW1pbmcgbW9kZWw6Ci0gKiAgLSBvbiBwZXJpb2Qgc3RhcnQ6IHNldCBjbG9jayBoaWdoCi0gKiAgLSBvbiBwZXJpb2QgLyAyOiBzZXQgY2xvY2sgbG93IGFuZCBwcm9ncmFtIHZhbHVlIG9uIGJ1cwotICogIC0gc3RhcnQgb24gcGVyaW9kIC8gMgotICovCi12b2lkIGtzODg1MV9lZXByb21fd3JpdGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG9wLAotCQkJCQl1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IGRhdGEpCi17Ci0Jc3RydWN0IGtzODg1MV9uZXQgKmtzID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlpbnQgZWVwY3I7Ci0JaW50IHN0YXRlID0gRUVQUk9NX0NPTlRST0w7Ci0JaW50IGJpdF9jb3VudCA9IEVFUFJPTV9PUF9MRU4gLSAxOwotCXVuc2lnbmVkIGludCBhZGRyX2xlbjsKLQotCWFkZHJfbGVuID0gKGtzLT5lZXByb21fc2l6ZSA9PSAxMjgpID8gNiA6IDg7Ci0KLQlzd2l0Y2ggKG9wKSB7Ci0JY2FzZSBFRVBST01fT1BfRVdFTjoKLQkJYWRkciA9IDB4MzA7Ci0JYnJlYWs7Ci0JY2FzZSBFRVBST01fT1BfRVdEUzoKLQkJYWRkciA9IDA7Ci0JCWJyZWFrOwotCX0KLQotCS8qIHN0YXJ0IHRyYW5zYWN0aW9uOiBjaGlwIHNlbGVjdCBoaWdoLCBhdXRob3JpemUgd3JpdGUgKi8KLQltdXRleF9sb2NrKCZrcy0+bG9jayk7Ci0JZWVwY3IgPSBFRVBDUl9FRVNBIHwgRUVQQ1JfRUVTUldBOwotCWtzODg1MV93cnJlZzE2KGtzLCBLU19FRVBDUiwgZWVwY3IpOwotCWVlcGNyIHw9IEVFUENSX0VFQ1M7Ci0Ja3M4ODUxX3dycmVnMTYoa3MsIEtTX0VFUENSLCBlZXBjcik7Ci0JbXV0ZXhfdW5sb2NrKCZrcy0+bG9jayk7Ci0KLQl3aGlsZSAoc3RhdGUgIT0gRUVQUk9NX0NPTVBMRVRFKSB7Ci0JCS8qIGZhbGxpbmcgY2xvY2sgcGVyaW9kIHN0YXJ0cy4uLiAqLwotCQkvKiBzZXQgRUVEX0lPIHBpbiBmb3IgY29udHJvbCBhbmQgYWRkcmVzcyAqLwotCQllZXBjciAmPSB+RUVQQ1JfRUVETzsKLQkJc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIEVFUFJPTV9DT05UUk9MOgotCQkJZWVwY3IgfD0gKChvcCA+PiBiaXRfY291bnQpICYgMSkgPDwgMjsKLQkJCWlmIChiaXRfY291bnQtLSA8PSAwKSB7Ci0JCQkJYml0X2NvdW50ID0gYWRkcl9sZW4gLSAxOwotCQkJCXN0YXRlID0gRUVQUk9NX0FERFJFU1M7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBFRVBST01fQUREUkVTUzoKLQkJCWVlcGNyIHw9ICgoYWRkciA+PiBiaXRfY291bnQpICYgMSkgPDwgMjsKLQkJCWlmIChiaXRfY291bnQtLSA8PSAwKSB7Ci0JCQkJaWYgKG9wID09IEVFUFJPTV9PUF9XUklURSkgewotCQkJCQliaXRfY291bnQgPSBFRVBST01fREFUQV9MRU4gLSAxOwotCQkJCQlzdGF0ZSA9IEVFUFJPTV9EQVRBOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXN0YXRlID0gRUVQUk9NX0NPTVBMRVRFOwotCQkJCX0KLQkJCX0KLQkJCWJyZWFrOwotCQljYXNlIEVFUFJPTV9EQVRBOgotCQkJZWVwY3IgfD0gKChkYXRhID4+IGJpdF9jb3VudCkgJiAxKSA8PCAyOwotCQkJaWYgKGJpdF9jb3VudC0tIDw9IDApCi0JCQkJc3RhdGUgPSBFRVBST01fQ09NUExFVEU7Ci0JCQlicmVhazsKLQkJfQotCi0JCS8qIGxvd2VyIGNsb2NrICAqLwotCQllZXBjciAmPSB+RUVQQ1JfRUVTQ0s7Ci0KLQkJbXV0ZXhfbG9jaygma3MtPmxvY2spOwotCQlrczg4NTFfd3JyZWcxNihrcywgS1NfRUVQQ1IsIGVlcGNyKTsKLQkJbXV0ZXhfdW5sb2NrKCZrcy0+bG9jayk7Ci0KLQkJLyogd2FpdCBwZXJpb2QgLyAyICovCi0JCXVkZWxheShFRVBST01fU0tfUEVSSU9EIC8gMik7Ci0KLQkJLyogcmlzaW5nIGNsb2NrIHBlcmlvZCBzdGFydHMuLi4gKi8KLQotCQkvKiByYWlzZSBjbG9jayAqLwotCQllZXBjciB8PSBFRVBDUl9FRVNDSzsKLQkJbXV0ZXhfbG9jaygma3MtPmxvY2spOwotCQlrczg4NTFfd3JyZWcxNihrcywgS1NfRUVQQ1IsIGVlcGNyKTsKLQkJbXV0ZXhfdW5sb2NrKCZrcy0+bG9jayk7Ci0KLQkJLyogd2FpdCBwZXJpb2QgLyAyICovCi0JCXVkZWxheShFRVBST01fU0tfUEVSSU9EIC8gMik7Ci0JfQotCi0JLyogY2xvc2UgdHJhbnNhY3Rpb24gKi8KLQltdXRleF9sb2NrKCZrcy0+bG9jayk7Ci0JZWVwY3IgJj0gfkVFUENSX0VFQ1M7Ci0Ja3M4ODUxX3dycmVnMTYoa3MsIEtTX0VFUENSLCBlZXBjcik7Ci0JZWVwY3IgPSAwOwotCWtzODg1MV93cnJlZzE2KGtzLCBLU19FRVBDUiwgZWVwY3IpOwotCW11dGV4X3VubG9jaygma3MtPmxvY2spOwotCi19Ci0KIC8qIGV0aHRvb2wgc3VwcG9ydCAqLwogCiBzdGF0aWMgdm9pZCBrczg4NTFfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTEzMTIsMTE1ICsxMTIxLDE0MSBAQAogCXJldHVybiBtaWlfbndheV9yZXN0YXJ0KCZrcy0+bWlpKTsKIH0KIAotc3RhdGljIGludCBrczg4NTFfZ2V0X2VlcHJvbV9sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKy8qIEVFUFJPTSBzdXBwb3J0ICovCisKK3N0YXRpYyB2b2lkIGtzODg1MV9lZXByb21fcmVncmVhZChzdHJ1Y3QgZWVwcm9tXzkzY3g2ICplZSkKK3sKKwlzdHJ1Y3Qga3M4ODUxX25ldCAqa3MgPSBlZS0+ZGF0YTsKKwl1bnNpZ25lZCB2YWw7CisKKwl2YWwgPSBrczg4NTFfcmRyZWcxNihrcywgS1NfRUVQQ1IpOworCisJZWUtPnJlZ19kYXRhX291dCA9ICh2YWwgJiBFRVBDUl9FRVNCKSA/IDEgOiAwOworCWVlLT5yZWdfZGF0YV9jbG9jayA9ICh2YWwgJiBFRVBDUl9FRVNDSykgPyAxIDogMDsKKwllZS0+cmVnX2NoaXBfc2VsZWN0ID0gKHZhbCAmIEVFUENSX0VFQ1MpID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkIGtzODg1MV9lZXByb21fcmVnd3JpdGUoc3RydWN0IGVlcHJvbV85M2N4NiAqZWUpCit7CisJc3RydWN0IGtzODg1MV9uZXQgKmtzID0gZWUtPmRhdGE7CisJdW5zaWduZWQgdmFsID0gRUVQQ1JfRUVTQTsJLyogZGVmYXVsdCAtIGVlcHJvbSBhY2Nlc3Mgb24gKi8KKworCWlmIChlZS0+ZHJpdmVfZGF0YSkKKwkJdmFsIHw9IEVFUENSX0VFU1JXQTsKKwlpZiAoZWUtPnJlZ19kYXRhX2luKQorCQl2YWwgfD0gRUVQQ1JfRUVETzsKKwlpZiAoZWUtPnJlZ19kYXRhX2Nsb2NrKQorCQl2YWwgfD0gRUVQQ1JfRUVTQ0s7CisJaWYgKGVlLT5yZWdfY2hpcF9zZWxlY3QpCisJCXZhbCB8PSBFRVBDUl9FRUNTOworCisJa3M4ODUxX3dycmVnMTYoa3MsIEtTX0VFUENSLCB2YWwpOworfQorCisvKioKKyAqIGtzODg1MV9lZXByb21fY2xhaW0gLSBjbGFpbSBkZXZpY2UgRUVQUk9NIGFuZCBhY3RpdmF0ZSB0aGUgaW50ZXJmYWNlCisgKiBAa3M6IFRoZSBuZXR3b3JrIGRldmljZSBzdGF0ZS4KKyAqCisgKiBDaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIGFuIEVFUFJPTSwgYW5kIHRoZW4gYWN0aXZhdGUgc29mdHdhcmUgYWNjZXNzCisgKiB0byB0aGUgZGV2aWNlLgorICovCitzdGF0aWMgaW50IGtzODg1MV9lZXByb21fY2xhaW0oc3RydWN0IGtzODg1MV9uZXQgKmtzKQoreworCWlmICghKGtzLT5yY19jY3IgJiBDQ1JfRUVQUk9NKSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisKKwltdXRleF9sb2NrKCZrcy0+bG9jayk7CisKKwkvKiBzdGFydCB3aXRoIGNsb2NrIGxvdywgY3MgaGlnaCAqLworCWtzODg1MV93cnJlZzE2KGtzLCBLU19FRVBDUiwgRUVQQ1JfRUVTQSB8IEVFUENSX0VFQ1MpOworCXJldHVybiAwOworfQorCisvKioKKyAqIGtzODg1MV9lZXByb21fcmVsZWFzZSAtIHJlbGVhc2UgdGhlIEVFUFJPTSBpbnRlcmZhY2UKKyAqIEBrczogVGhlIGRldmljZSBzdGF0ZQorICoKKyAqIFJlbGVhc2UgdGhlIHNvZnR3YXJlIGFjY2VzcyB0byB0aGUgZGV2aWNlIEVFUFJPTQorICovCitzdGF0aWMgdm9pZCBrczg4NTFfZWVwcm9tX3JlbGVhc2Uoc3RydWN0IGtzODg1MV9uZXQgKmtzKQoreworCXVuc2lnbmVkIHZhbCA9IGtzODg1MV9yZHJlZzE2KGtzLCBLU19FRVBDUik7CisKKwlrczg4NTFfd3JyZWcxNihrcywgS1NfRUVQQ1IsIHZhbCAmIH5FRVBDUl9FRVNBKTsKKwltdXRleF91bmxvY2soJmtzLT5sb2NrKTsKK30KKworI2RlZmluZSBLU19FRVBST01fTUFHSUMgKDB4MDAwMDg4NTEpCisKK3N0YXRpYyBpbnQga3M4ODUxX3NldF9lZXByb20oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSAgICAgc3RydWN0IGV0aHRvb2xfZWVwcm9tICplZSwgdTggKmRhdGEpCiB7CiAJc3RydWN0IGtzODg1MV9uZXQgKmtzID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlyZXR1cm4ga3MtPmVlcHJvbV9zaXplOworCWludCBvZmZzZXQgPSBlZS0+b2Zmc2V0OworCWludCBsZW4gPSBlZS0+bGVuOworCXUxNiB0bXA7CisKKwkvKiBjdXJyZW50bHkgb25seSBzdXBwb3J0IGJ5dGUgd3JpdGluZyAqLworCWlmIChsZW4gIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZWUtPm1hZ2ljICE9IEtTX0VFUFJPTV9NQUdJQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoa3M4ODUxX2VlcHJvbV9jbGFpbShrcykpCisJCXJldHVybiAtRU5PRU5UOworCisJZWVwcm9tXzkzY3g2X3dyZW4oJmtzLT5lZXByb20sIHRydWUpOworCisJLyogZXRodG9vbCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB3cml0aW5nIGJ5dGVzLCB3aGljaCBtZWFucworCSAqIHdlIGhhdmUgdG8gcmVhZC9tb2RpZnkvd3JpdGUgb3VyIDE2Yml0IEVFUFJPTXMgKi8KKworCWVlcHJvbV85M2N4Nl9yZWFkKCZrcy0+ZWVwcm9tLCBvZmZzZXQvMiwgJnRtcCk7CisKKwlpZiAob2Zmc2V0ICYgMSkgeworCQl0bXAgJj0gMHhmZjsKKwkJdG1wIHw9ICpkYXRhIDw8IDg7CisJfSBlbHNlIHsKKwkJdG1wICY9IDB4ZmYwMDsKKwkJdG1wIHw9ICpkYXRhOworCX0KKworCWVlcHJvbV85M2N4Nl93cml0ZSgma3MtPmVlcHJvbSwgb2Zmc2V0LzIsIHRtcCk7CisJZWVwcm9tXzkzY3g2X3dyZW4oJmtzLT5lZXByb20sIGZhbHNlKTsKKworCWtzODg1MV9lZXByb21fcmVsZWFzZShrcyk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBrczg4NTFfZ2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqYnl0ZXMpCisJCQkgICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWUsIHU4ICpkYXRhKQogewogCXN0cnVjdCBrczg4NTFfbmV0ICprcyA9IG5ldGRldl9wcml2KGRldik7Ci0JdTE2ICplZXByb21fYnVmZjsKLQlpbnQgZmlyc3Rfd29yZDsKLQlpbnQgbGFzdF93b3JkOwotCWludCByZXRfdmFsID0gMDsKLQl1MTYgaTsKKwlpbnQgb2Zmc2V0ID0gZWUtPm9mZnNldDsKKwlpbnQgbGVuID0gZWUtPmxlbjsKIAotCWlmIChlZXByb20tPmxlbiA9PSAwKQorCS8qIG11c3QgYmUgMiBieXRlIGFsaWduZWQgKi8KKwlpZiAobGVuICYgMSB8fCBvZmZzZXQgJiAxKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChlZXByb20tPmxlbiA+IGtzLT5lZXByb21fc2l6ZSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzODg1MV9lZXByb21fY2xhaW0oa3MpKQorCQlyZXR1cm4gLUVOT0VOVDsKIAotCWVlcHJvbS0+bWFnaWMgPSBrczg4NTFfcmRyZWcxNihrcywgS1NfQ0lERVIpOworCWVlLT5tYWdpYyA9IEtTX0VFUFJPTV9NQUdJQzsKIAotCWZpcnN0X3dvcmQgPSBlZXByb20tPm9mZnNldCA+PiAxOwotCWxhc3Rfd29yZCA9IChlZXByb20tPm9mZnNldCArIGVlcHJvbS0+bGVuIC0gMSkgPj4gMTsKKwllZXByb21fOTNjeDZfbXVsdGlyZWFkKCZrcy0+ZWVwcm9tLCBvZmZzZXQvMiwgKF9fbGUxNiAqKWRhdGEsIGxlbi8yKTsKKwlrczg4NTFfZWVwcm9tX3JlbGVhc2Uoa3MpOwogCi0JZWVwcm9tX2J1ZmYgPSBrbWFsbG9jKHNpemVvZih1MTYpICoKLQkJCShsYXN0X3dvcmQgLSBmaXJzdF93b3JkICsgMSksIEdGUF9LRVJORUwpOwotCWlmICghZWVwcm9tX2J1ZmYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChpID0gMDsgaSA8IGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQgKyAxOyBpKyspCi0JCWVlcHJvbV9idWZmW2ldID0ga3M4ODUxX2VlcHJvbV9yZWFkKGRldiwgZmlyc3Rfd29yZCArIDEpOwotCi0JLyogRGV2aWNlJ3MgZWVwcm9tIGlzIGxpdHRsZS1lbmRpYW4sIHdvcmQgYWRkcmVzc2FibGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDE7IGkrKykKLQkJbGUxNl90b19jcHVzKCZlZXByb21fYnVmZltpXSk7Ci0KLQltZW1jcHkoYnl0ZXMsICh1OCAqKWVlcHJvbV9idWZmICsgKGVlcHJvbS0+b2Zmc2V0ICYgMSksIGVlcHJvbS0+bGVuKTsKLQlrZnJlZShlZXByb21fYnVmZik7Ci0KLQlyZXR1cm4gcmV0X3ZhbDsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBrczg4NTFfc2V0X2VlcHJvbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJICAgIHN0cnVjdCBldGh0b29sX2VlcHJvbSAqZWVwcm9tLCB1OCAqYnl0ZXMpCitzdGF0aWMgaW50IGtzODg1MV9nZXRfZWVwcm9tX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBrczg4NTFfbmV0ICprcyA9IG5ldGRldl9wcml2KGRldik7Ci0JdTE2ICplZXByb21fYnVmZjsKLQl2b2lkICpwdHI7Ci0JaW50IG1heF9sZW47Ci0JaW50IGZpcnN0X3dvcmQ7Ci0JaW50IGxhc3Rfd29yZDsKLQlpbnQgcmV0X3ZhbCA9IDA7Ci0JdTE2IGk7CiAKLQlpZiAoZWVwcm9tLT5sZW4gPT0gMCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKGVlcHJvbS0+bGVuID4ga3MtPmVlcHJvbV9zaXplKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChlZXByb20tPm1hZ2ljICE9IGtzODg1MV9yZHJlZzE2KGtzLCBLU19DSURFUikpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JZmlyc3Rfd29yZCA9IGVlcHJvbS0+b2Zmc2V0ID4+IDE7Ci0JbGFzdF93b3JkID0gKGVlcHJvbS0+b2Zmc2V0ICsgZWVwcm9tLT5sZW4gLSAxKSA+PiAxOwotCW1heF9sZW4gPSAobGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDEpICogMjsKLQllZXByb21fYnVmZiA9IGttYWxsb2MobWF4X2xlbiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFlZXByb21fYnVmZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwdHIgPSAodm9pZCAqKWVlcHJvbV9idWZmOwotCi0JaWYgKGVlcHJvbS0+b2Zmc2V0ICYgMSkgewotCQkvKiBuZWVkIHJlYWQvbW9kaWZ5L3dyaXRlIG9mIGZpcnN0IGNoYW5nZWQgRUVQUk9NIHdvcmQgKi8KLQkJLyogb25seSB0aGUgc2Vjb25kIGJ5dGUgb2YgdGhlIHdvcmQgaXMgYmVpbmcgbW9kaWZpZWQgKi8KLQkJZWVwcm9tX2J1ZmZbMF0gPSBrczg4NTFfZWVwcm9tX3JlYWQoZGV2LCBmaXJzdF93b3JkKTsKLQkJcHRyKys7Ci0JfQotCWlmICgoZWVwcm9tLT5vZmZzZXQgKyBlZXByb20tPmxlbikgJiAxKQotCQkvKiBuZWVkIHJlYWQvbW9kaWZ5L3dyaXRlIG9mIGxhc3QgY2hhbmdlZCBFRVBST00gd29yZCAqLwotCQkvKiBvbmx5IHRoZSBmaXJzdCBieXRlIG9mIHRoZSB3b3JkIGlzIGJlaW5nIG1vZGlmaWVkICovCi0JCWVlcHJvbV9idWZmW2xhc3Rfd29yZCAtIGZpcnN0X3dvcmRdID0KLQkJCQkJa3M4ODUxX2VlcHJvbV9yZWFkKGRldiwgbGFzdF93b3JkKTsKLQotCi0JLyogRGV2aWNlJ3MgZWVwcm9tIGlzIGxpdHRsZS1lbmRpYW4sIHdvcmQgYWRkcmVzc2FibGUgKi8KLQlsZTE2X3RvX2NwdXMoJmVlcHJvbV9idWZmWzBdKTsKLQlsZTE2X3RvX2NwdXMoJmVlcHJvbV9idWZmW2xhc3Rfd29yZCAtIGZpcnN0X3dvcmRdKTsKLQotCW1lbWNweShwdHIsIGJ5dGVzLCBlZXByb20tPmxlbik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGFzdF93b3JkIC0gZmlyc3Rfd29yZCArIDE7IGkrKykKLQkJZWVwcm9tX2J1ZmZbaV0gPSBjcHVfdG9fbGUxNihlZXByb21fYnVmZltpXSk7Ci0KLQlrczg4NTFfZWVwcm9tX3dyaXRlKGRldiwgRUVQUk9NX09QX0VXRU4sIDAsIDApOwotCi0JZm9yIChpID0gMDsgaSA8IGxhc3Rfd29yZCAtIGZpcnN0X3dvcmQgKyAxOyBpKyspIHsKLQkJa3M4ODUxX2VlcHJvbV93cml0ZShkZXYsIEVFUFJPTV9PUF9XUklURSwgZmlyc3Rfd29yZCArIGksCi0JCQkJCQkJZWVwcm9tX2J1ZmZbaV0pOwotCQltZGVsYXkoRUVQUk9NX1dSSVRFX1RJTUUpOwotCX0KLQotCWtzODg1MV9lZXByb21fd3JpdGUoZGV2LCBFRVBST01fT1BfRVdEUywgMCwgMCk7Ci0KLQlrZnJlZShlZXByb21fYnVmZik7Ci0JcmV0dXJuIHJldF92YWw7CisJLyogY3VycmVudGx5LCB3ZSBhc3N1bWUgaXQgaXMgYW4gOTNDNDYgYXR0YWNoZWQsIHNvIHJldHVybiAxMjggKi8KKwlyZXR1cm4ga3MtPnJjX2NjciAmIENDUl9FRVBST00gPyAxMjggOiAwOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIGtzODg1MV9ldGh0b29sX29wcyA9IHsKQEAgLTE2MTMsNiArMTQ0OCwxMyBAQAogCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZrcy0+c3BpX3hmZXIyWzBdLCAma3MtPnNwaV9tc2cyKTsKIAlzcGlfbWVzc2FnZV9hZGRfdGFpbCgma3MtPnNwaV94ZmVyMlsxXSwgJmtzLT5zcGlfbXNnMik7CiAKKwkvKiBzZXR1cCBFRVBST00gc3RhdGUgKi8KKworCWtzLT5lZXByb20uZGF0YSA9IGtzOworCWtzLT5lZXByb20ud2lkdGggPSBQQ0lfRUVQUk9NX1dJRFRIXzkzQzQ2OworCWtzLT5lZXByb20ucmVnaXN0ZXJfcmVhZCA9IGtzODg1MV9lZXByb21fcmVncmVhZDsKKwlrcy0+ZWVwcm9tLnJlZ2lzdGVyX3dyaXRlID0ga3M4ODUxX2VlcHJvbV9yZWd3cml0ZTsKKwogCS8qIHNldHVwIG1paSBzdGF0ZSAqLwogCWtzLT5taWkuZGV2CQk9IG5kZXY7CiAJa3MtPm1paS5waHlfaWQJCT0gMSwKQEAgLTE2NzQsOSArMTUxNiwxMCBAQAogCQlnb3RvIGVycl9uZXRkZXY7CiAJfQogCi0JbmV0ZGV2X2luZm8obmRldiwgInJldmlzaW9uICVkLCBNQUMgJXBNLCBJUlEgJWRcbiIsCisJbmV0ZGV2X2luZm8obmRldiwgInJldmlzaW9uICVkLCBNQUMgJXBNLCBJUlEgJWQsICVzIEVFUFJPTVxuIiwKIAkJICAgIENJREVSX1JFVl9HRVQoa3M4ODUxX3JkcmVnMTYoa3MsIEtTX0NJREVSKSksCi0JCSAgICBuZGV2LT5kZXZfYWRkciwgbmRldi0+aXJxKTsKKwkJICAgIG5kZXYtPmRldl9hZGRyLCBuZGV2LT5pcnEsCisJCSAgICBrcy0+cmNfY2NyICYgQ0NSX0VFUFJPTSA/ICJoYXMiIDogIm5vIik7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MS5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MS5oCmluZGV4IDUzN2ZiMDZlLi5iMGZhZTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3M4ODUxLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MS5oCkBAIC0xNiw3ICsxNiw3IEBACiAjZGVmaW5lIENDUl8zMlBJTgkJCQkoMSA8PCAwKQogCiAvKiBNQUMgYWRkcmVzcyByZWdpc3RlcnMgKi8KLSNkZWZpbmUgS1NfTUFSKF9tKQkJCQkweDE1IC0gKF9tKQorI2RlZmluZSBLU19NQVIoX20pCQkJCSgweDE1IC0gKF9tKSkKICNkZWZpbmUgS1NfTUFSTAkJCQkJMHgxMAogI2RlZmluZSBLU19NQVJNCQkJCQkweDEyCiAjZGVmaW5lIEtTX01BUkgJCQkJCTB4MTQKQEAgLTI3LDIyICsyNywxMSBAQAogI2RlZmluZSBLU19FRVBDUgkJCQkweDIyCiAjZGVmaW5lIEVFUENSX0VFU1JXQQkJCQkoMSA8PCA1KQogI2RlZmluZSBFRVBDUl9FRVNBCQkJCSgxIDw8IDQpCi0jZGVmaW5lIEVFUENSX0VFU0JfT0ZGU0VUCQkJMwotI2RlZmluZSBFRVBDUl9FRVNCCQkJCSgxIDw8IEVFUENSX0VFU0JfT0ZGU0VUKQorI2RlZmluZSBFRVBDUl9FRVNCCQkJCSgxIDw8IDMpCiAjZGVmaW5lIEVFUENSX0VFRE8JCQkJKDEgPDwgMikKICNkZWZpbmUgRUVQQ1JfRUVTQ0sJCQkJKDEgPDwgMSkKICNkZWZpbmUgRUVQQ1JfRUVDUwkJCQkoMSA8PCAwKQogCi0jZGVmaW5lIEVFUFJPTV9PUF9MRU4JCQkJMwkvKiBiaXRzOiovCi0jZGVmaW5lIEVFUFJPTV9PUF9SRUFECQkJCTB4MDYKLSNkZWZpbmUgRUVQUk9NX09QX0VXRU4JCQkJMHgwNAotI2RlZmluZSBFRVBST01fT1BfV1JJVEUJCQkJMHgwNQotI2RlZmluZSBFRVBST01fT1BfRVdEUwkJCQkweDE0Ci0KLSNkZWZpbmUgRUVQUk9NX0RBVEFfTEVOCQkJCTE2CS8qIDE2IGJpdHMgRUVQUk9NICovCi0jZGVmaW5lIEVFUFJPTV9XUklURV9USU1FCQkJNAkvKiB3cnQgYWNrIHRpbWUgaW4gbXMgKi8KLSNkZWZpbmUgRUVQUk9NX1NLX1BFUklPRAkJCTQwMAkvKiBpbiB1cyAqLwotCiAjZGVmaW5lIEtTX01CSVIJCQkJCTB4MjQKICNkZWZpbmUgTUJJUl9UWE1CRgkJCQkoMSA8PCAxMikKICNkZWZpbmUgTUJJUl9UWE1CRkEJCQkJKDEgPDwgMTEpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3M4ODUxX21sbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzODg1MV9tbGwuYwppbmRleCBkMTljODQ5Li5lNThlNzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3M4ODUxX21sbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rczg4NTFfbWxsLmMKQEAgLTE1MDAsOCArMTUwMCw3IEBACiAJa3MtPmFsbF9tY2FzdCA9IDA7CiAJa3MtPm1jYXN0X2xzdF9zaXplID0gMDsKIAotCWtzLT5mcmFtZV9oZWFkX2luZm8gPSAoc3RydWN0IHR5cGVfZnJhbWVfaGVhZCAqKSBcCi0JCWttYWxsb2MoTUhFQURFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlrcy0+ZnJhbWVfaGVhZF9pbmZvID0ga21hbGxvYyhNSEVBREVSX1NJWkUsIEdGUF9LRVJORUwpOwogCWlmICgha3MtPmZyYW1lX2hlYWRfaW5mbykgewogCQlwcl9lcnIoIkVycm9yOiBGYWlsIHRvIGFsbG9jYXRlIGZyYW1lIG1lbW9yeVxuIik7CiAJCXJldHVybiBmYWxzZTsKQEAgLTE2NTksMTggKzE2NTgsNyBAQAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChrczg4NTFfcmVtb3ZlKSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGtzODg1MV9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigma3M4ODUxX3BsYXRmb3JtX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBrczg4NTFfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZrczg4NTFfcGxhdGZvcm1fZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoa3M4ODUxX2luaXQpOwotbW9kdWxlX2V4aXQoa3M4ODUxX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihrczg4NTFfcGxhdGZvcm1fZHJpdmVyKTsKIAogTU9EVUxFX0RFU0NSSVBUSU9OKCJLUzg4NTEgTUxMIE5ldHdvcmsgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJEYXZpZCBDaG9pIDxkYXZpZC5jaG9pQG1pY3JlbC5jb20+Iik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3N6ODg0eC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbWljcmVsL2tzejg4NHguYwppbmRleCA3ZWNlOTkwLi42ZWQwOWE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9taWNyZWwva3N6ODg0eC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L21pY3JlbC9rc3o4ODR4LmMKQEAgLTc0Myw4ICs3NDMsNyBAQAogLyogQ2hhbmdlIGRlZmF1bHQgTEVEIG1vZGUuICovCiAjZGVmaW5lIFNFVF9ERUZBVUxUX0xFRAkJCUxFRF9TUEVFRF9EVVBMRVhfQUNUCiAKLSNkZWZpbmUgTUFDX0FERFJfTEVOCQkJNgotI2RlZmluZSBNQUNfQUREUl9PUkRFUihpKQkJKE1BQ19BRERSX0xFTiAtIDEgLSAoaSkpCisjZGVmaW5lIE1BQ19BRERSX09SREVSKGkpCQkoRVRIX0FMRU4gLSAxIC0gKGkpKQogCiAjZGVmaW5lIE1BWF9FVEhFUk5FVF9CT0RZX1NJWkUJCTE1MDAKICNkZWZpbmUgRVRIRVJORVRfSEVBREVSX1NJWkUJCTE0CkBAIC0xMDQzLDcgKzEwNDIsNyBAQAogICogQHZhbGlkOglWYWxpZCBzZXR0aW5nIGluZGljYXRpbmcgdGhlIGVudHJ5IGlzIGJlaW5nIHVzZWQuCiAgKi8KIHN0cnVjdCBrc3pfbWFjX3RhYmxlIHsKLQl1OCBtYWNfYWRkcltNQUNfQUREUl9MRU5dOworCXU4IG1hY19hZGRyW0VUSF9BTEVOXTsKIAl1MTYgdmlkOwogCXU4IGZpZDsKIAl1OCBwb3J0czsKQEAgLTExODcsOCArMTE4Niw4IEBACiAJdTggZGlmZnNlcnZbRElGRlNFUlZfRU5UUklFU107CiAJdTggcF84MDJfMXBbUFJJT184MDJfMVBfRU5UUklFU107CiAKLQl1OCBicl9hZGRyW01BQ19BRERSX0xFTl07Ci0JdTggb3RoZXJfYWRkcltNQUNfQUREUl9MRU5dOworCXU4IGJyX2FkZHJbRVRIX0FMRU5dOworCXU4IG90aGVyX2FkZHJbRVRIX0FMRU5dOwogCiAJdTggYnJvYWRfcGVyOwogCXU4IG1lbWJlcjsKQEAgLTEyOTIsMTQgKzEyOTEsMTQgQEAKIAlpbnQgdHhfaW50X21hc2s7CiAJaW50IHR4X3NpemU7CiAKLQl1OCBwZXJtX2FkZHJbTUFDX0FERFJfTEVOXTsKLQl1OCBvdmVycmlkZV9hZGRyW01BQ19BRERSX0xFTl07Ci0JdTggYWRkcmVzc1tBRERJVElPTkFMX0VOVFJJRVNdW01BQ19BRERSX0xFTl07CisJdTggcGVybV9hZGRyW0VUSF9BTEVOXTsKKwl1OCBvdmVycmlkZV9hZGRyW0VUSF9BTEVOXTsKKwl1OCBhZGRyZXNzW0FERElUSU9OQUxfRU5UUklFU11bRVRIX0FMRU5dOwogCXU4IGFkZHJfbGlzdF9zaXplOwogCXU4IG1hY19vdmVycmlkZTsKIAl1OCBwcm9taXNjdW91czsKIAl1OCBhbGxfbXVsdGk7Ci0JdTggbXVsdGlfbGlzdFtNQVhfTVVMVElDQVNUX0xJU1RdW01BQ19BRERSX0xFTl07CisJdTggbXVsdGlfbGlzdFtNQVhfTVVMVElDQVNUX0xJU1RdW0VUSF9BTEVOXTsKIAl1OCBtdWx0aV9iaXRzW0hXX01VTFRJQ0FTVF9TSVpFXTsKIAl1OCBtdWx0aV9saXN0X3NpemU7CiAKQEAgLTM2NTQsNyArMzY1Myw3IEBACiAJc3RhdGljIGNvbnN0IHU4IG1hc2tbXSA9IHsgMHgzRiB9OwogCXN0YXRpYyBjb25zdCB1OCBwYXR0ZXJuW10gPSB7IDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYgfTsKIAotCWh3X3NldF93b2xfZnJhbWUoaHcsIDIsIDEsIG1hc2ssIE1BQ19BRERSX0xFTiwgcGF0dGVybik7CisJaHdfc2V0X3dvbF9mcmFtZShodywgMiwgMSwgbWFzaywgRVRIX0FMRU4sIHBhdHRlcm4pOwogfQogCiAvKioKQEAgLTM2ODksNyArMzY4OCw3IEBACiB7CiAJc3RhdGljIGNvbnN0IHU4IG1hc2tbXSA9IHsgMHgzRiB9OwogCi0JaHdfc2V0X3dvbF9mcmFtZShodywgMCwgMSwgbWFzaywgTUFDX0FERFJfTEVOLCBody0+b3ZlcnJpZGVfYWRkcik7CisJaHdfc2V0X3dvbF9mcmFtZShodywgMCwgMSwgbWFzaywgRVRIX0FMRU4sIGh3LT5vdmVycmlkZV9hZGRyKTsKIH0KIAogLyoqCkBAIC00MDU1LDcgKzQwNTQsNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQogCQl3cml0ZWIoaHctPm92ZXJyaWRlX2FkZHJbTUFDX0FERFJfT1JERVIoaSldLAogCQkJaHctPmlvICsgS1M4ODRYX0FERFJfMF9PRkZTRVQgKyBpKTsKIApAQCAtNDA3MiwxNyArNDA3MSwxNiBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKQogCQlody0+cGVybV9hZGRyW01BQ19BRERSX09SREVSKGkpXSA9IHJlYWRiKGh3LT5pbyArCiAJCQlLUzg4NFhfQUREUl8wX09GRlNFVCArIGkpOwogCiAJaWYgKCFody0+bWFjX292ZXJyaWRlKSB7Ci0JCW1lbWNweShody0+b3ZlcnJpZGVfYWRkciwgaHctPnBlcm1fYWRkciwgTUFDX0FERFJfTEVOKTsKKwkJbWVtY3B5KGh3LT5vdmVycmlkZV9hZGRyLCBody0+cGVybV9hZGRyLCBFVEhfQUxFTik7CiAJCWlmIChlbXB0eV9hZGRyKGh3LT5vdmVycmlkZV9hZGRyKSkgewotCQkJbWVtY3B5KGh3LT5wZXJtX2FkZHIsIERFRkFVTFRfTUFDX0FERFJFU1MsCi0JCQkJTUFDX0FERFJfTEVOKTsKKwkJCW1lbWNweShody0+cGVybV9hZGRyLCBERUZBVUxUX01BQ19BRERSRVNTLCBFVEhfQUxFTik7CiAJCQltZW1jcHkoaHctPm92ZXJyaWRlX2FkZHIsIERFRkFVTFRfTUFDX0FERFJFU1MsCi0JCQkJTUFDX0FERFJfTEVOKTsKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJCQlody0+b3ZlcnJpZGVfYWRkcls1XSArPSBody0+aWQ7CiAJCQlod19zZXRfYWRkcihodyk7CiAJCX0KQEAgLTQxMzAsMTYgKzQxMjgsMTYgQEAKIAlpbnQgaTsKIAlpbnQgaiA9IEFERElUSU9OQUxfRU5UUklFUzsKIAotCWlmICghbWVtY21wKGh3LT5vdmVycmlkZV9hZGRyLCBtYWNfYWRkciwgTUFDX0FERFJfTEVOKSkKKwlpZiAoIW1lbWNtcChody0+b3ZlcnJpZGVfYWRkciwgbWFjX2FkZHIsIEVUSF9BTEVOKSkKIAkJcmV0dXJuIDA7CiAJZm9yIChpID0gMDsgaSA8IGh3LT5hZGRyX2xpc3Rfc2l6ZTsgaSsrKSB7Ci0JCWlmICghbWVtY21wKGh3LT5hZGRyZXNzW2ldLCBtYWNfYWRkciwgTUFDX0FERFJfTEVOKSkKKwkJaWYgKCFtZW1jbXAoaHctPmFkZHJlc3NbaV0sIG1hY19hZGRyLCBFVEhfQUxFTikpCiAJCQlyZXR1cm4gMDsKIAkJaWYgKEFERElUSU9OQUxfRU5UUklFUyA9PSBqICYmIGVtcHR5X2FkZHIoaHctPmFkZHJlc3NbaV0pKQogCQkJaiA9IGk7CiAJfQogCWlmIChqIDwgQURESVRJT05BTF9FTlRSSUVTKSB7Ci0JCW1lbWNweShody0+YWRkcmVzc1tqXSwgbWFjX2FkZHIsIE1BQ19BRERSX0xFTik7CisJCW1lbWNweShody0+YWRkcmVzc1tqXSwgbWFjX2FkZHIsIEVUSF9BTEVOKTsKIAkJaHdfZW5hX2FkZF9hZGRyKGh3LCBqLCBody0+YWRkcmVzc1tqXSk7CiAJCXJldHVybiAwOwogCX0KQEAgLTQxNTEsOCArNDE0OSw4IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaHctPmFkZHJfbGlzdF9zaXplOyBpKyspIHsKLQkJaWYgKCFtZW1jbXAoaHctPmFkZHJlc3NbaV0sIG1hY19hZGRyLCBNQUNfQUREUl9MRU4pKSB7Ci0JCQltZW1zZXQoaHctPmFkZHJlc3NbaV0sIDAsIE1BQ19BRERSX0xFTik7CisJCWlmICghbWVtY21wKGh3LT5hZGRyZXNzW2ldLCBtYWNfYWRkciwgRVRIX0FMRU4pKSB7CisJCQltZW1zZXQoaHctPmFkZHJlc3NbaV0sIDAsIEVUSF9BTEVOKTsKIAkJCXdyaXRlbCgwLCBody0+aW8gKyBBRERfQUREUl9JTkNSICogaSArCiAJCQkJS1NfQUREX0FERFJfMF9ISSk7CiAJCQlyZXR1cm4gMDsKQEAgLTQzODIsMTIgKzQzODAsMTAgQEAKICAqLwogc3RhdGljIGludCBrc3pfYWxsb2Nfc29mdF9kZXNjKHN0cnVjdCBrc3pfZGVzY19pbmZvICpkZXNjX2luZm8sIGludCB0cmFuc21pdCkKIHsKLQlkZXNjX2luZm8tPnJpbmcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qga3N6X2Rlc2MpICogZGVzY19pbmZvLT5hbGxvYywKLQkJR0ZQX0tFUk5FTCk7CisJZGVzY19pbmZvLT5yaW5nID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGtzel9kZXNjKSAqIGRlc2NfaW5mby0+YWxsb2MsCisJCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIWRlc2NfaW5mby0+cmluZykKIAkJcmV0dXJuIDE7Ci0JbWVtc2V0KCh2b2lkICopIGRlc2NfaW5mby0+cmluZywgMCwKLQkJc2l6ZW9mKHN0cnVjdCBrc3pfZGVzYykgKiBkZXNjX2luZm8tPmFsbG9jKTsKIAlod19pbml0X2Rlc2MoZGVzY19pbmZvLCB0cmFuc21pdCk7CiAJcmV0dXJuIDA7CiB9CkBAIC01Njc2LDcgKzU2NzIsNyBAQAogCQlod19kZWxfYWRkcihodywgZGV2LT5kZXZfYWRkcik7CiAJZWxzZSB7CiAJCWh3LT5tYWNfb3ZlcnJpZGUgPSAxOwotCQltZW1jcHkoaHctPm92ZXJyaWRlX2FkZHIsIG1hYy0+c2FfZGF0YSwgTUFDX0FERFJfTEVOKTsKKwkJbWVtY3B5KGh3LT5vdmVycmlkZV9hZGRyLCBtYWMtPnNhX2RhdGEsIEVUSF9BTEVOKTsKIAl9CiAKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgbWFjLT5zYV9kYXRhLCBNQVhfQUREUl9MRU4pOwpAQCAtNTc4Niw3ICs1NzgyLDcgQEAKIAkJbmV0ZGV2X2Zvcl9lYWNoX21jX2FkZHIoaGEsIGRldikgewogCQkJaWYgKGkgPj0gTUFYX01VTFRJQ0FTVF9MSVNUKQogCQkJCWJyZWFrOwotCQkJbWVtY3B5KGh3LT5tdWx0aV9saXN0W2krK10sIGhhLT5hZGRyLCBNQUNfQUREUl9MRU4pOworCQkJbWVtY3B5KGh3LT5tdWx0aV9saXN0W2krK10sIGhhLT5hZGRyLCBFVEhfQUxFTik7CiAJCX0KIAkJaHctPm11bHRpX2xpc3Rfc2l6ZSA9ICh1OCkgaTsKIAkJaHdfc2V0X2dycF9hZGRyKGh3KTsKQEAgLTYwOTMsOSArNjA4OSwxMCBAQAogCXN0cnVjdCBkZXZfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IGRldl9pbmZvICpod19wcml2ID0gcHJpdi0+YWRhcHRlcjsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoaHdfcHJpdi0+cGRldikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoaHdfcHJpdi0+cGRldiksCisJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiAvKioKQEAgLTY1ODcsNyArNjU4NCw4IEBACiAgKgogICogUmV0dXJuIDAgaWYgc3VjY2Vzc2Z1bDsgb3RoZXJ3aXNlIGFuIGVycm9yIGNvZGUuCiAgKi8KLXN0YXRpYyBpbnQgbmV0ZGV2X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgaW50IG5ldGRldl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgZGV2X3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBkZXZfaW5mbyAqaHdfcHJpdiA9IHByaXYtPmFkYXB0ZXI7CkBAIC02NjA5LDcgKzY2MDcsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgbmV0ZGV2X2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MJCT0gbmV0ZGV2X2dldF9zZXR0aW5ncywKIAkuc2V0X3NldHRpbmdzCQk9IG5ldGRldl9zZXRfc2V0dGluZ3MsCiAJLm53YXlfcmVzZXQJCT0gbmV0ZGV2X253YXlfcmVzZXQsCkBAIC02ODYwLDcgKzY4NTgsNyBAQAogCWludCBudW07CiAKIAlpID0gaiA9IG51bSA9IGdvdF9udW0gPSAwOwotCXdoaWxlIChqIDwgTUFDX0FERFJfTEVOKSB7CisJd2hpbGUgKGogPCBFVEhfQUxFTikgewogCQlpZiAobWFjYWRkcltpXSkgewogCQkJaW50IGRpZ2l0OwogCkBAIC02ODkxLDcgKzY4ODksNyBAQAogCQl9CiAJCWkrKzsKIAl9Ci0JaWYgKE1BQ19BRERSX0xFTiA9PSBqKSB7CisJaWYgKEVUSF9BTEVOID09IGopIHsKIAkJaWYgKE1BSU5fUE9SVCA9PSBwb3J0KQogCQkJaHdfcHJpdi0+aHcubWFjX292ZXJyaWRlID0gMTsKIAl9CkBAIC03MDU4LDcgKzcwNTYsNyBAQAogCiAJLyogTXVsdGlwbGUgZGV2aWNlIGludGVyZmFjZXMgbW9kZSByZXF1aXJlcyBhIHNlY29uZCBNQUMgYWRkcmVzcy4gKi8KIAlpZiAoaHctPmRldl9jb3VudCA+IDEpIHsKLQkJbWVtY3B5KHN3LT5vdGhlcl9hZGRyLCBody0+b3ZlcnJpZGVfYWRkciwgTUFDX0FERFJfTEVOKTsKKwkJbWVtY3B5KHN3LT5vdGhlcl9hZGRyLCBody0+b3ZlcnJpZGVfYWRkciwgRVRIX0FMRU4pOwogCQlyZWFkX290aGVyX2FkZHIoaHcpOwogCQlpZiAobWFjMWFkZHJbMF0gIT0gJzonKQogCQkJZ2V0X21hY19hZGRyKGh3X3ByaXYsIG1hYzFhZGRyLCBPVEhFUl9QT1JUKTsKQEAgLTcxMDgsMTIgKzcxMDYsMTEgQEAKIAkJZGV2LT5pcnEgPSBwZGV2LT5pcnE7CiAJCWlmIChNQUlOX1BPUlQgPT0gaSkKIAkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBod19wcml2LT5ody5vdmVycmlkZV9hZGRyLAotCQkJCU1BQ19BRERSX0xFTik7CisJCQkgICAgICAgRVRIX0FMRU4pOwogCQllbHNlIHsKLQkJCW1lbWNweShkZXYtPmRldl9hZGRyLCBzdy0+b3RoZXJfYWRkciwKLQkJCQlNQUNfQUREUl9MRU4pOworCQkJbWVtY3B5KGRldi0+ZGV2X2FkZHIsIHN3LT5vdGhlcl9hZGRyLCBFVEhfQUxFTik7CiAJCQlpZiAoIW1lbWNtcChzdy0+b3RoZXJfYWRkciwgaHctPm92ZXJyaWRlX2FkZHIsCi0JCQkJCU1BQ19BRERSX0xFTikpCisJCQkJICAgIEVUSF9BTEVOKSkKIAkJCQlkZXYtPmRldl9hZGRyWzVdICs9IHBvcnQtPmZpcnN0X3BvcnQ7CiAJCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbXlyaWNvbS9teXJpMTBnZS9teXJpMTBnZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbXlyaWNvbS9teXJpMTBnZS9teXJpMTBnZS5jCmluZGV4IDA3NzhlZGMuLjIwYjcyZWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L215cmljb20vbXlyaTEwZ2UvbXlyaTEwZ2UuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9teXJpY29tL215cmkxMGdlL215cmkxMGdlLmMKQEAgLTE0OTEsNyArMTQ5MSw3IEBACiAJICogYWNjZXNzIHRvIGF2b2lkIHRoZW9yZXRpY2FsIHJhY2UgY29uZGl0aW9uIHdpdGggZnVuY3Rpb25zIHRoYXQKIAkgKiBjaGFuZ2UgTkVUSUZfRl9MUk8gZmxhZyBhdCBydW50aW1lLgogCSAqLwotCWJvb2wgbHJvX2VuYWJsZWQgPSBBQ0NFU1NfT05DRShtZ3AtPmRldi0+ZmVhdHVyZXMpICYgTkVUSUZfRl9MUk87CisJYm9vbCBscm9fZW5hYmxlZCA9ICEhKEFDQ0VTU19PTkNFKG1ncC0+ZGV2LT5mZWF0dXJlcykgJiBORVRJRl9GX0xSTyk7CiAKIAl3aGlsZSAocnhfZG9uZS0+ZW50cnlbaWR4XS5sZW5ndGggIT0gMCAmJiB3b3JrX2RvbmUgPCBidWRnZXQpIHsKIAkJbGVuZ3RoID0gbnRvaHMocnhfZG9uZS0+ZW50cnlbaWR4XS5sZW5ndGgpOwpAQCAtMzE0OSw3ICszMTQ5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHUzMiBteXJpMTBnZV9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IG15cmkxMGdlX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCWlmICghKGZlYXR1cmVzICYgTkVUSUZfRl9SWENTVU0pKQogCQlmZWF0dXJlcyAmPSB+TkVUSUZfRl9MUk87CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9teXJpY29tL215cmkxMGdlL215cmkxMGdlX21jcC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbXlyaWNvbS9teXJpMTBnZS9teXJpMTBnZV9tY3AuaAppbmRleCAxMWJlMTUwLi5iN2ZjMjZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9teXJpY29tL215cmkxMGdlL215cmkxMGdlX21jcC5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L215cmljb20vbXlyaTEwZ2UvbXlyaTEwZ2VfbWNwLmgKQEAgLTM1Niw3ICszNTYsNyBAQAogCU1YR0VGV19DTURfR0VUX0RDQV9PRkZTRVQgPSA1NiwKIAkvKiBvZmZzZXQgb2YgZGNhIGNvbnRyb2wgZm9yIFdETUFzICovCiAKLQkvKiBWTVdhcmUgTmV0UXVldWUgY29tbWFuZHMgKi8KKwkvKiBWTXdhcmUgTmV0UXVldWUgY29tbWFuZHMgKi8KIAlNWEdFRldfQ01EX05FVFFfR0VUX0ZJTFRFUlNfUEVSX1FVRVVFID0gNTcsCiAJTVhHRUZXX0NNRF9ORVRRX0FERF9GSUxURVIgPSA1OCwKIAkvKiBkYXRhMCA9IGZpbHRlcl9pZCA8PCAxNiB8IHF1ZXVlIDw8IDggfCB0eXBlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL2phenpzb25pYy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9qYXp6c29uaWMuYwppbmRleCBmYzdjNmE5Li41Yjg5ZmQzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL2phenpzb25pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvamF6enNvbmljLmMKQEAgLTI5NCwxNSArMjk0LDQgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgamF6el9zb25pY19pbml0X21vZHVsZSh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmphenpfc29uaWNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGphenpfc29uaWNfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmamF6el9zb25pY19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChqYXp6X3NvbmljX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KGphenpfc29uaWNfY2xlYW51cF9tb2R1bGUpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihqYXp6X3NvbmljX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL21hY3NvbmljLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL21hY3NvbmljLmMKaW5kZXggYTJlYWNiZi4uNzAzNjdkNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9tYWNzb25pYy5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbWFjc29uaWMuYwpAQCAtNjQzLDE1ICs2NDMsNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBtYWNfc29uaWNfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZtYWNfc29uaWNfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IG1hY19zb25pY19jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZtYWNfc29uaWNfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobWFjX3NvbmljX2luaXRfbW9kdWxlKTsKLW1vZHVsZV9leGl0KG1hY19zb25pY19jbGVhbnVwX21vZHVsZSk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKG1hY19zb25pY19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9uYXRzZW1pLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25hdHNlbWkuYwppbmRleCA2Y2EwNDdhLi5hYzdiMTZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25hdHNlbWkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL25hdHNlbWkuYwpAQCAtMjU1NSw5ICsyNTU1LDkgQEAKIHN0YXRpYyB2b2lkIGdldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IG5ldGRldl9wcml2YXRlICpucCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RybmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBFVEhUT09MX0JVU0lORk9fTEVOKTsKLQlzdHJuY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBFVEhUT09MX0JVU0lORk9fTEVOKTsKLQlzdHJuY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldiksIEVUSFRPT0xfQlVTSU5GT19MRU4pOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBjaV9kZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIGludCBnZXRfcmVnc19sZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25hdHNlbWkvbnM4MzgyMC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9uczgzODIwLmMKaW5kZXggMmI4ZjY0ZC4uYzI0YjQ2YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9uczgzODIwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS9uczgzODIwLmMKQEAgLTEzNjQsOSArMTM2NCw5IEBACiBzdGF0aWMgdm9pZCBuczgzODIwX2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCXN0cnVjdCBuczgzODIwICpkZXYgPSBQUklWKG5kZXYpOwotCXN0cmNweShpbmZvLT5kcml2ZXIsICJuczgzODIwIik7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIFZFUlNJT04pOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoZGV2LT5wY2lfZGV2KSk7CisJc3RybGNweShpbmZvLT5kcml2ZXIsICJuczgzODIwIiwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShkZXYtPnBjaV9kZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIHUzMiBuczgzODIwX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmF0c2VtaS94dHNvbmljLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL3h0c29uaWMuYwppbmRleCBjY2Y2MWI5Li5lMDFjMGEwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL3h0c29uaWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uYXRzZW1pL3h0c29uaWMuYwpAQCAtMzE5LDE1ICszMTksNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCB4dHNvbmljX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ4dHNvbmljX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCB4dHNvbmljX2NsZWFudXAodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmeHRzb25pY19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdCh4dHNvbmljX2luaXQpOwotbW9kdWxlX2V4aXQoeHRzb25pY19jbGVhbnVwKTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoeHRzb25pY19kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vczJpby5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vczJpby5jCmluZGV4IGMyN2ZiM2QuLjk3ZjYzZTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3MyaW8uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi9zMmlvLmMKQEAgLTUzOTEsMTAgKzUzOTEsOSBAQAogewogCXN0cnVjdCBzMmlvX25pYyAqc3AgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3RybmNweShpbmZvLT5kcml2ZXIsIHMyaW9fZHJpdmVyX25hbWUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKLQlzdHJuY3B5KGluZm8tPnZlcnNpb24sIHMyaW9fZHJpdmVyX3ZlcnNpb24sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7Ci0Jc3RybmNweShpbmZvLT5md192ZXJzaW9uLCAiIiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pKTsKLQlzdHJuY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShzcC0+cGRldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBzMmlvX2RyaXZlcl9uYW1lLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBzMmlvX2RyaXZlcl92ZXJzaW9uLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHNwLT5wZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiAJaW5mby0+cmVnZHVtcF9sZW4gPSBYRU5BX1JFR19TUEFDRTsKIAlpbmZvLT5lZWR1bXBfbGVuID0gWEVOQV9FRVBST01fU1BBQ0U7CiB9CkBAIC02NjE2LDEwICs2NjE1LDEwIEBACiAJfQogfQogCi1zdGF0aWMgaW50IHMyaW9fc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgczJpb19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHMyaW9fbmljICpzcCA9IG5ldGRldl9wcml2KGRldik7Ci0JdTMyIGNoYW5nZWQgPSAoZmVhdHVyZXMgXiBkZXYtPmZlYXR1cmVzKSAmIE5FVElGX0ZfTFJPOworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSAoZmVhdHVyZXMgXiBkZXYtPmZlYXR1cmVzKSAmIE5FVElGX0ZfTFJPOwogCiAJaWYgKGNoYW5nZWQgJiYgbmV0aWZfcnVubmluZyhkZXYpKSB7CiAJCWludCByYzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1tYWluLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9uZXRlcmlvbi92eGdlL3Z4Z2UtbWFpbi5jCmluZGV4IGE4MzE5N2QuLmVmNzY3MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L25ldGVyaW9uL3Z4Z2UvdnhnZS1tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvbmV0ZXJpb24vdnhnZS92eGdlLW1haW4uYwpAQCAtMjY2Miw5ICsyNjYyLDEwIEBACiAJbW9kX3RpbWVyKCZ2ZGV2LT52cF9sb2NrdXBfdGltZXIsIGppZmZpZXMgKyBIWiAvIDEwMDApOwogfQogCi1zdGF0aWMgdTMyIHZ4Z2VfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCB2eGdlX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewotCXUzMiBjaGFuZ2VkID0gZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CiAKIAkvKiBFbmFibGluZyBSVEggcmVxdWlyZXMgc29tZSBvZiB0aGUgbG9naWMgaW4gdnhnZV9kZXZpY2VfcmVnaXN0ZXIgYW5kIGEKIAkgKiB2cGF0aCByZXNldC4gIER1ZSB0byB0aGVzZSByZXN0cmljdGlvbnMsIG9ubHkgYWxsb3cgbW9kaWZpY2F0aW9uCkBAIC0yNjc2LDEwICsyNjc3LDEwIEBACiAJcmV0dXJuIGZlYXR1cmVzOwogfQogCi1zdGF0aWMgaW50IHZ4Z2Vfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgdnhnZV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHZ4Z2VkZXYgKnZkZXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCXUzMiBjaGFuZ2VkID0gZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CiAKIAlpZiAoIShjaGFuZ2VkICYgTkVUSUZfRl9SWEhBU0gpKQogCQlyZXR1cm4gMDsKQEAgLTMzMDQsNyArMzMwNSw3IEBACiAgKgogICogQWRkIHRoZSB2bGFuIGlkIHRvIHRoZSBkZXZpY2VzIHZsYW4gaWQgdGFibGUKICAqLwotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIHZ4Z2Vfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgdnhnZWRldiAqdmRldiA9IG5ldGRldl9wcml2KGRldik7CkBAIC0zMzE5LDYgKzMzMjAsNyBAQAogCQl2eGdlX2h3X3ZwYXRoX3ZpZF9hZGQodnBhdGgtPmhhbmRsZSwgdmlkKTsKIAl9CiAJc2V0X2JpdCh2aWQsIHZkZXYtPmFjdGl2ZV92bGFucyk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMzMyOCw3ICszMzMwLDcgQEAKICAqCiAgKiBSZW1vdmUgdGhlIHZsYW4gaWQgZnJvbSB0aGUgZGV2aWNlJ3MgdmxhbiBpZCB0YWJsZQogICovCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogdnhnZV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgdnhnZWRldiAqdmRldiA9IG5ldGRldl9wcml2KGRldik7CkBAIC0zMzQ3LDYgKzMzNDksNyBAQAogCXZ4Z2VfZGVidWdfZW50cnlleGl0KFZYR0VfVFJBQ0UsCiAJCSIlczolZCAgRXhpdGluZy4uLiIsIF9fZnVuY19fLCBfX0xJTkVfXyk7CiAJY2xlYXJfYml0KHZpZCwgdmRldi0+YWN0aXZlX3ZsYW5zKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyB2eGdlX25ldGRldl9vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9udXZvdG9uL3c5MHA5MTBfZXRoZXIuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L251dm90b24vdzkwcDkxMF9ldGhlci5jCmluZGV4IGYxYmZiOGYuLmI3NWEwNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L251dm90b24vdzkwcDkxMF9ldGhlci5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L251dm90b24vdzkwcDkxMF9ldGhlci5jCkBAIC0xMTAzLDE4ICsxMTAzLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgdzkwcDkxMF9ldGhlcl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdzkwcDkxMF9ldGhlcl9kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdzkwcDkxMF9ldGhlcl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnc5MHA5MTBfZXRoZXJfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQodzkwcDkxMF9ldGhlcl9pbml0KTsKLW1vZHVsZV9leGl0KHc5MHA5MTBfZXRoZXJfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHc5MHA5MTBfZXRoZXJfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiV2FuIFpvbmdTaHVuIDxtY3Vvcy5jb21AZ21haWwuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJ3OTBwOTEwIE1BQyBkcml2ZXIhIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9udmlkaWEvZm9yY2VkZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9udmlkaWEvZm9yY2VkZXRoLmMKaW5kZXggMWM2MWQzNi4uNGM0ZTdmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvbnZpZGlhL2ZvcmNlZGV0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L252aWRpYS9mb3JjZWRldGguYwpAQCAtNjUsNyArNjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KLSNpbmNsdWRlICA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxsaW51eC91NjRfc3RhdHNfc3luYy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAKICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgpAQCAtNzM2LDYgKzczNywxNiBAQAogICogLSB0eCBzZXR1cCBpcyBsb2NrbGVzczogaXQgcmVsaWVzIG9uIG5ldGlmX3R4X2xvY2suIEFjdHVhbCBzdWJtaXNzaW9uCiAgKgluZWVkcyBuZXRkZXZfcHJpdihkZXYpLT5sb2NrIDotKAogICogLSBzZXRfbXVsdGljYXN0X2xpc3Q6IHByZXBhcmF0aW9uIGxvY2tsZXNzLCByZWxpZXMgb24gbmV0aWZfdHhfbG9jay4KKyAqCisgKiBIYXJkd2FyZSBzdGF0cyB1cGRhdGVzIGFyZSBwcm90ZWN0ZWQgYnkgaHdzdGF0c19sb2NrOgorICogLSB1cGRhdGVkIGJ5IG52X2RvX3N0YXRzX3BvbGwgKHRpbWVyKS4gVGhpcyBpcyBtZWFudCB0byBhdm9pZAorICogICBpbnRlZ2VyIHdyYXBhcm91bmQgaW4gdGhlIE5JQyBzdGF0cyByZWdpc3RlcnMsIGF0IGxvdyBmcmVxdWVuY3kKKyAqICAgKDAuMSBIeikKKyAqIC0gdXBkYXRlZCBieSBudl9nZXRfZXRodG9vbF9zdGF0cyArIG52X2dldF9zdGF0czY0CisgKgorICogU29mdHdhcmUgc3RhdHMgYXJlIGFjY2Vzc2VkIG9ubHkgdGhyb3VnaCA2NGIgc3luY2hyb25pemF0aW9uIHBvaW50cworICogYW5kIGFyZSBub3Qgc3ViamVjdCB0byBvdGhlciBzeW5jaHJvbml6YXRpb24gdGVjaG5pcXVlcyAoc2luZ2xlCisgKiB1cGRhdGUgdGhyZWFkIG9uIHRoZSBUWCBvciBSWCBwYXRocykuCiAgKi8KIAogLyogaW4gZGV2OiBiYXNlLCBpcnEgKi8KQEAgLTc0NSw5ICs3NTYsMTAgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXN0cnVjdCBuYXBpX3N0cnVjdCBuYXBpOwogCi0JLyogR2VuZXJhbCBkYXRhOgotCSAqIExvY2tpbmc6IHNwaW5fbG9jaygmbnAtPmxvY2spOyAqLworCS8qIGhhcmR3YXJlIHN0YXRzIGFyZSB1cGRhdGVkIGluIHN5c2NhbGwgYW5kIHRpbWVyICovCisJc3BpbmxvY2tfdCBod3N0YXRzX2xvY2s7CiAJc3RydWN0IG52X2V0aHRvb2xfc3RhdHMgZXN0YXRzOworCiAJaW50IGluX3NodXRkb3duOwogCXUzMiBsaW5rc3BlZWQ7CiAJaW50IGR1cGxleDsKQEAgLTc5OCw2ICs4MTAsMTMgQEAKIAl1MzIgbmljX3BvbGxfaXJxOwogCWludCByeF9yaW5nX3NpemU7CiAKKwkvKiBSWCBzb2Z0d2FyZSBzdGF0cyAqLworCXN0cnVjdCB1NjRfc3RhdHNfc3luYyBzd3N0YXRzX3J4X3N5bmNwOworCXU2NCBzdGF0X3J4X3BhY2tldHM7CisJdTY0IHN0YXRfcnhfYnl0ZXM7IC8qIG5vdCBhbHdheXMgYXZhaWxhYmxlIGluIEhXICovCisJdTY0IHN0YXRfcnhfbWlzc2VkX2Vycm9yczsKKwl1NjQgc3RhdF9yeF9kcm9wcGVkOworCiAJLyogbWVkaWEgZGV0ZWN0aW9uIHdvcmthcm91bmQuCiAJICogTG9ja2luZzogV2l0aGluIGlycSBoYW5kZXIgb3IgZGlzYWJsZV9pcnErc3Bpbl9sb2NrKCZucC0+bG9jayk7CiAJICovCkBAIC04MjAsNiArODM5LDEyIEBACiAJc3RydWN0IG52X3NrYl9tYXAgKnR4X2VuZF9mbGlwOwogCWludCB0eF9zdG9wOwogCisJLyogVFggc29mdHdhcmUgc3RhdHMgKi8KKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgc3dzdGF0c190eF9zeW5jcDsKKwl1NjQgc3RhdF90eF9wYWNrZXRzOyAvKiBub3QgYWx3YXlzIGF2YWlsYWJsZSBpbiBIVyAqLworCXU2NCBzdGF0X3R4X2J5dGVzOworCXU2NCBzdGF0X3R4X2Ryb3BwZWQ7CisKIAkvKiBtc2kvbXNpLXggZmllbGRzICovCiAJdTMyIG1zaV9mbGFnczsKIAlzdHJ1Y3QgbXNpeF9lbnRyeSBtc2lfeF9lbnRyeVtOVl9NU0lfWF9NQVhfVkVDVE9SU107CkBAIC04OTIsNiArOTE3LDExIEBACiBzdGF0aWMgaW50IGRtYV82NGJpdCA9IE5WX0RNQV82NEJJVF9FTkFCTEVEOwogCiAvKgorICogRGVidWcgb3V0cHV0IGNvbnRyb2wgZm9yIHR4X3RpbWVvdXQKKyAqLworc3RhdGljIGJvb2wgZGVidWdfdHhfdGltZW91dCA9IGZhbHNlOworCisvKgogICogQ3Jvc3NvdmVyIERldGVjdGlvbgogICogUmVhbHRlayA4MjAxIHBoeSArIHNvbWUgT0VNIGJvYXJkcyBkbyBub3Qgd29yayBwcm9wZXJseS4KICAqLwpAQCAtMTYzMCwxMSArMTY2MCwxOSBAQAogCXBjaV9wdXNoKGJhc2UpOwogfQogCi1zdGF0aWMgdm9pZCBudl9nZXRfaHdfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKKy8qIENhbGxlciBtdXN0IGFwcHJvcHJpYXRlbHkgbG9jayBuZXRkZXZfcHJpdihkZXYpLT5od3N0YXRzX2xvY2sgKi8KK3N0YXRpYyB2b2lkIG52X3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCXN0cnVjdCBmZV9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CiAJdTggX19pb21lbSAqYmFzZSA9IGdldF9od2Jhc2UoZGV2KTsKIAorCS8qIElmIGl0IGhhcHBlbnMgdGhhdCB0aGlzIGlzIHJ1biBpbiB0b3AtaGFsZiBjb250ZXh0LCB0aGVuCisJICogcmVwbGFjZSB0aGUgc3Bpbl9sb2NrIG9mIGh3c3RhdHNfbG9jayB3aXRoCisJICogc3Bpbl9sb2NrX2lycXNhdmUoKSBpbiBjYWxsaW5nIGZ1bmN0aW9ucy4gKi8KKwlXQVJOX09OQ0UoaW5faXJxKCksICJmb3JjZWRldGg6IGVzdGF0cyBzcGluX2xvY2soX2JoKSBmcm9tIHRvcC1oYWxmIik7CisJYXNzZXJ0X3NwaW5fbG9ja2VkKCZucC0+aHdzdGF0c19sb2NrKTsKKworCS8qIHF1ZXJ5IGhhcmR3YXJlICovCiAJbnAtPmVzdGF0cy50eF9ieXRlcyArPSByZWFkbChiYXNlICsgTnZSZWdUeENudCk7CiAJbnAtPmVzdGF0cy50eF96ZXJvX3JleG10ICs9IHJlYWRsKGJhc2UgKyBOdlJlZ1R4WmVyb1JlWG10KTsKIAlucC0+ZXN0YXRzLnR4X29uZV9yZXhtdCArPSByZWFkbChiYXNlICsgTnZSZWdUeE9uZVJlWG10KTsKQEAgLTE2OTMsNDAgKzE3MzEsNzMgQEAKIH0KIAogLyoKLSAqIG52X2dldF9zdGF0czogZGV2LT5nZXRfc3RhdHMgZnVuY3Rpb24KKyAqIG52X2dldF9zdGF0czY0OiBkZXYtPm5kb19nZXRfc3RhdHM2NCBmdW5jdGlvbgogICogR2V0IGxhdGVzdCBzdGF0cyB2YWx1ZSBmcm9tIHRoZSBuaWMuCiAgKiBDYWxsZWQgd2l0aCByZWFkX2xvY2soJmRldl9iYXNlX2xvY2spIGhlbGQgZm9yIHJlYWQgLQogICogb25seSBzeW5jaHJvbml6ZWQgYWdhaW5zdCB1bnJlZ2lzdGVyX25ldGRldmljZS4KICAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzICpudl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQqCitudl9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0b3JhZ2UpCisJX19hY3F1aXJlcygmbmV0ZGV2X3ByaXYoZGV2KS0+aHdzdGF0c19sb2NrKQorCV9fcmVsZWFzZXMoJm5ldGRldl9wcml2KGRldiktPmh3c3RhdHNfbG9jaykKIHsKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBuZXRkZXZfcHJpdihkZXYpOworCXVuc2lnbmVkIGludCBzeW5jcF9zdGFydDsKKworCS8qCisJICogTm90ZTogYmVjYXVzZSBIVyBzdGF0cyBhcmUgbm90IGFsd2F5cyBhdmFpbGFibGUgYW5kIGZvcgorCSAqIGNvbnNpc3RlbmN5IHJlYXNvbnMsIHRoZSBmb2xsb3dpbmcgaWZjb25maWcgc3RhdHMgYXJlCisJICogbWFuYWdlZCBieSBzb2Z0d2FyZTogcnhfYnl0ZXMsIHR4X2J5dGVzLCByeF9wYWNrZXRzIGFuZAorCSAqIHR4X3BhY2tldHMuIFRoZSByZWxhdGVkIGhhcmR3YXJlIHN0YXRzIHJlcG9ydGVkIGJ5IGV0aHRvb2wKKwkgKiBzaG91bGQgYmUgZXF1aXZhbGVudCB0byB0aGVzZSBpZmNvbmZpZyBzdGF0cywgd2l0aCA0CisJICogYWRkaXRpb25hbCBieXRlcyBwZXIgcGFja2V0IChFdGhlcm5ldCBGQ1MgQ1JDKSwgZXhjZXB0IGZvcgorCSAqIHR4X3BhY2tldHMgd2hlbiBUU08ga2lja3MgaW4uCisJICovCisKKwkvKiBzb2Z0d2FyZSBzdGF0cyAqLworCWRvIHsKKwkJc3luY3Bfc3RhcnQgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW5fYmgoJm5wLT5zd3N0YXRzX3J4X3N5bmNwKTsKKwkJc3RvcmFnZS0+cnhfcGFja2V0cyAgICAgICA9IG5wLT5zdGF0X3J4X3BhY2tldHM7CisJCXN0b3JhZ2UtPnJ4X2J5dGVzICAgICAgICAgPSBucC0+c3RhdF9yeF9ieXRlczsKKwkJc3RvcmFnZS0+cnhfZHJvcHBlZCAgICAgICA9IG5wLT5zdGF0X3J4X2Ryb3BwZWQ7CisJCXN0b3JhZ2UtPnJ4X21pc3NlZF9lcnJvcnMgPSBucC0+c3RhdF9yeF9taXNzZWRfZXJyb3JzOworCX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeV9iaCgmbnAtPnN3c3RhdHNfcnhfc3luY3AsIHN5bmNwX3N0YXJ0KSk7CisKKwlkbyB7CisJCXN5bmNwX3N0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2JoKCZucC0+c3dzdGF0c190eF9zeW5jcCk7CisJCXN0b3JhZ2UtPnR4X3BhY2tldHMgPSBucC0+c3RhdF90eF9wYWNrZXRzOworCQlzdG9yYWdlLT50eF9ieXRlcyAgID0gbnAtPnN0YXRfdHhfYnl0ZXM7CisJCXN0b3JhZ2UtPnR4X2Ryb3BwZWQgPSBucC0+c3RhdF90eF9kcm9wcGVkOworCX0gd2hpbGUgKHU2NF9zdGF0c19mZXRjaF9yZXRyeV9iaCgmbnAtPnN3c3RhdHNfdHhfc3luY3AsIHN5bmNwX3N0YXJ0KSk7CiAKIAkvKiBJZiB0aGUgbmljIHN1cHBvcnRzIGh3IGNvdW50ZXJzIHRoZW4gcmV0cmlldmUgbGF0ZXN0IHZhbHVlcyAqLwotCWlmIChucC0+ZHJpdmVyX2RhdGEgJiAoREVWX0hBU19TVEFUSVNUSUNTX1YxfERFVl9IQVNfU1RBVElTVElDU19WMnxERVZfSEFTX1NUQVRJU1RJQ1NfVjMpKSB7Ci0JCW52X2dldF9od19zdGF0cyhkZXYpOworCWlmIChucC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX1NUQVRJU1RJQ1NfVjEyMykgeworCQlzcGluX2xvY2tfYmgoJm5wLT5od3N0YXRzX2xvY2spOwogCi0JCS8qCi0JCSAqIE5vdGU6IGJlY2F1c2UgSFcgc3RhdHMgYXJlIG5vdCBhbHdheXMgYXZhaWxhYmxlIGFuZAotCQkgKiBmb3IgY29uc2lzdGVuY3kgcmVhc29ucywgdGhlIGZvbGxvd2luZyBpZmNvbmZpZwotCQkgKiBzdGF0cyBhcmUgbWFuYWdlZCBieSBzb2Z0d2FyZTogcnhfYnl0ZXMsIHR4X2J5dGVzLAotCQkgKiByeF9wYWNrZXRzIGFuZCB0eF9wYWNrZXRzLiBUaGUgcmVsYXRlZCBoYXJkd2FyZQotCQkgKiBzdGF0cyByZXBvcnRlZCBieSBldGh0b29sIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvCi0JCSAqIHRoZXNlIGlmY29uZmlnIHN0YXRzLCB3aXRoIDQgYWRkaXRpb25hbCBieXRlcyBwZXIKLQkJICogcGFja2V0IChFdGhlcm5ldCBGQ1MgQ1JDKS4KLQkJICovCisJCW52X3VwZGF0ZV9zdGF0cyhkZXYpOwogCi0JCS8qIGNvcHkgdG8gbmV0X2RldmljZSBzdGF0cyAqLwotCQlkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzID0gbnAtPmVzdGF0cy50eF9maWZvX2Vycm9yczsKLQkJZGV2LT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycyA9IG5wLT5lc3RhdHMudHhfY2Fycmllcl9lcnJvcnM7Ci0JCWRldi0+c3RhdHMucnhfY3JjX2Vycm9ycyA9IG5wLT5lc3RhdHMucnhfY3JjX2Vycm9yczsKLQkJZGV2LT5zdGF0cy5yeF9vdmVyX2Vycm9ycyA9IG5wLT5lc3RhdHMucnhfb3Zlcl9lcnJvcnM7Ci0JCWRldi0+c3RhdHMucnhfZmlmb19lcnJvcnMgPSBucC0+ZXN0YXRzLnJ4X2Ryb3BfZnJhbWU7Ci0JCWRldi0+c3RhdHMucnhfZXJyb3JzID0gbnAtPmVzdGF0cy5yeF9lcnJvcnNfdG90YWw7Ci0JCWRldi0+c3RhdHMudHhfZXJyb3JzID0gbnAtPmVzdGF0cy50eF9lcnJvcnNfdG90YWw7CisJCS8qIGdlbmVyaWMgc3RhdHMgKi8KKwkJc3RvcmFnZS0+cnhfZXJyb3JzID0gbnAtPmVzdGF0cy5yeF9lcnJvcnNfdG90YWw7CisJCXN0b3JhZ2UtPnR4X2Vycm9ycyA9IG5wLT5lc3RhdHMudHhfZXJyb3JzX3RvdGFsOworCisJCS8qIG1lYW5pbmdmdWwgb25seSB3aGVuIE5JQyBzdXBwb3J0cyBzdGF0cyB2MyAqLworCQlzdG9yYWdlLT5tdWx0aWNhc3QgPSBucC0+ZXN0YXRzLnJ4X211bHRpY2FzdDsKKworCQkvKiBkZXRhaWxlZCByeF9lcnJvcnMgKi8KKwkJc3RvcmFnZS0+cnhfbGVuZ3RoX2Vycm9ycyA9IG5wLT5lc3RhdHMucnhfbGVuZ3RoX2Vycm9yOworCQlzdG9yYWdlLT5yeF9vdmVyX2Vycm9ycyAgID0gbnAtPmVzdGF0cy5yeF9vdmVyX2Vycm9yczsKKwkJc3RvcmFnZS0+cnhfY3JjX2Vycm9ycyAgICA9IG5wLT5lc3RhdHMucnhfY3JjX2Vycm9yczsKKwkJc3RvcmFnZS0+cnhfZnJhbWVfZXJyb3JzICA9IG5wLT5lc3RhdHMucnhfZnJhbWVfYWxpZ25fZXJyb3I7CisJCXN0b3JhZ2UtPnJ4X2ZpZm9fZXJyb3JzICAgPSBucC0+ZXN0YXRzLnJ4X2Ryb3BfZnJhbWU7CisKKwkJLyogZGV0YWlsZWQgdHhfZXJyb3JzICovCisJCXN0b3JhZ2UtPnR4X2NhcnJpZXJfZXJyb3JzID0gbnAtPmVzdGF0cy50eF9jYXJyaWVyX2Vycm9yczsKKwkJc3RvcmFnZS0+dHhfZmlmb19lcnJvcnMgICAgPSBucC0+ZXN0YXRzLnR4X2ZpZm9fZXJyb3JzOworCisJCXNwaW5fdW5sb2NrX2JoKCZucC0+aHdzdGF0c19sb2NrKTsKIAl9CiAKLQlyZXR1cm4gJmRldi0+c3RhdHM7CisJcmV0dXJuIHN0b3JhZ2U7CiB9CiAKIC8qCkBAIC0xNzU5LDggKzE4MzAsMTIgQEAKIAkJCQlucC0+cHV0X3J4Lm9yaWcgPSBucC0+Zmlyc3Rfcngub3JpZzsKIAkJCWlmICh1bmxpa2VseShucC0+cHV0X3J4X2N0eCsrID09IG5wLT5sYXN0X3J4X2N0eCkpCiAJCQkJbnAtPnB1dF9yeF9jdHggPSBucC0+Zmlyc3RfcnhfY3R4OwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKKwkJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJm5wLT5zd3N0YXRzX3J4X3N5bmNwKTsKKwkJCW5wLT5zdGF0X3J4X2Ryb3BwZWQrKzsKKwkJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZucC0+c3dzdGF0c19yeF9zeW5jcCk7CiAJCQlyZXR1cm4gMTsKKwkJfQogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTE3OTEsOCArMTg2NiwxMiBAQAogCQkJCW5wLT5wdXRfcnguZXggPSBucC0+Zmlyc3RfcnguZXg7CiAJCQlpZiAodW5saWtlbHkobnAtPnB1dF9yeF9jdHgrKyA9PSBucC0+bGFzdF9yeF9jdHgpKQogCQkJCW5wLT5wdXRfcnhfY3R4ID0gbnAtPmZpcnN0X3J4X2N0eDsKLQkJfSBlbHNlCisJCX0gZWxzZSB7CisJCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZucC0+c3dzdGF0c19yeF9zeW5jcCk7CisJCQlucC0+c3RhdF9yeF9kcm9wcGVkKys7CisJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmbnAtPnN3c3RhdHNfcnhfc3luY3ApOwogCQkJcmV0dXJuIDE7CisJCX0KIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xODQ5LDYgKzE5MjgsNyBAQAogCQlucC0+bGFzdF90eC5leCA9ICZucC0+dHhfcmluZy5leFtucC0+dHhfcmluZ19zaXplLTFdOwogCW5wLT5nZXRfdHhfY3R4ID0gbnAtPnB1dF90eF9jdHggPSBucC0+Zmlyc3RfdHhfY3R4ID0gbnAtPnR4X3NrYjsKIAlucC0+bGFzdF90eF9jdHggPSAmbnAtPnR4X3NrYltucC0+dHhfcmluZ19zaXplLTFdOworCW5ldGRldl9yZXNldF9xdWV1ZShucC0+ZGV2KTsKIAlucC0+dHhfcGt0c19pbl9wcm9ncmVzcyA9IDA7CiAJbnAtPnR4X2NoYW5nZV9vd25lciA9IE5VTEw7CiAJbnAtPnR4X2VuZF9mbGlwID0gTlVMTDsKQEAgLTE5MjcsOCArMjAwNywxMSBAQAogCQkJbnAtPnR4X3JpbmcuZXhbaV0uYnVmaGlnaCA9IDA7CiAJCQlucC0+dHhfcmluZy5leFtpXS5idWZsb3cgPSAwOwogCQl9Ci0JCWlmIChudl9yZWxlYXNlX3R4c2tiKG5wLCAmbnAtPnR4X3NrYltpXSkpCi0JCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJaWYgKG52X3JlbGVhc2VfdHhza2IobnAsICZucC0+dHhfc2tiW2ldKSkgeworCQkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmbnAtPnN3c3RhdHNfdHhfc3luY3ApOworCQkJbnAtPnN0YXRfdHhfZHJvcHBlZCsrOworCQkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJm5wLT5zd3N0YXRzX3R4X3N5bmNwKTsKKwkJfQogCQlucC0+dHhfc2tiW2ldLmRtYSA9IDA7CiAJCW5wLT50eF9za2JbaV0uZG1hX2xlbiA9IDA7CiAJCW5wLT50eF9za2JbaV0uZG1hX3NpbmdsZSA9IDA7CkBAIC0yMTk0LDYgKzIyNzcsOSBAQAogCiAJLyogc2V0IHR4IGZsYWdzICovCiAJc3RhcnRfdHgtPmZsYWdsZW4gfD0gY3B1X3RvX2xlMzIodHhfZmxhZ3MgfCB0eF9mbGFnc19leHRyYSk7CisKKwluZXRkZXZfc2VudF9xdWV1ZShucC0+ZGV2LCBza2ItPmxlbik7CisKIAlucC0+cHV0X3R4Lm9yaWcgPSBwdXRfdHg7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOwpAQCAtMjMzOCw2ICsyNDI0LDkgQEAKIAogCS8qIHNldCB0eCBmbGFncyAqLwogCXN0YXJ0X3R4LT5mbGFnbGVuIHw9IGNwdV90b19sZTMyKHR4X2ZsYWdzIHwgdHhfZmxhZ3NfZXh0cmEpOworCisJbmV0ZGV2X3NlbnRfcXVldWUobnAtPmRldiwgc2tiLT5sZW4pOworCiAJbnAtPnB1dF90eC5leCA9IHB1dF90eDsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7CkBAIC0yMzc1LDYgKzI0NjQsNyBAQAogCXUzMiBmbGFnczsKIAlpbnQgdHhfd29yayA9IDA7CiAJc3RydWN0IHJpbmdfZGVzYyAqb3JpZ19nZXRfdHggPSBucC0+Z2V0X3R4Lm9yaWc7CisJdW5zaWduZWQgaW50IGJ5dGVzX2NvbXBsID0gMDsKIAogCXdoaWxlICgobnAtPmdldF90eC5vcmlnICE9IG5wLT5wdXRfdHgub3JpZykgJiYKIAkgICAgICAgISgoZmxhZ3MgPSBsZTMyX3RvX2NwdShucC0+Z2V0X3R4Lm9yaWctPmZsYWdsZW4pKSAmIE5WX1RYX1ZBTElEKSAmJgpAQCAtMjM4NSwxMiArMjQ3NSwxNiBAQAogCQlpZiAobnAtPmRlc2NfdmVyID09IERFU0NfVkVSXzEpIHsKIAkJCWlmIChmbGFncyAmIE5WX1RYX0xBU1RQQUNLRVQpIHsKIAkJCQlpZiAoZmxhZ3MgJiBOVl9UWF9FUlJPUikgewotCQkJCQlpZiAoKGZsYWdzICYgTlZfVFhfUkVUUllFUlJPUikgJiYgIShmbGFncyAmIE5WX1RYX1JFVFJZQ09VTlRfTUFTSykpCisJCQkJCWlmICgoZmxhZ3MgJiBOVl9UWF9SRVRSWUVSUk9SKQorCQkJCQkgICAgJiYgIShmbGFncyAmIE5WX1RYX1JFVFJZQ09VTlRfTUFTSykpCiAJCQkJCQludl9sZWdhY3liYWNrb2ZmX3Jlc2VlZChkZXYpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IG5wLT5nZXRfdHhfY3R4LT5za2ItPmxlbjsKKwkJCQkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmbnAtPnN3c3RhdHNfdHhfc3luY3ApOworCQkJCQlucC0+c3RhdF90eF9wYWNrZXRzKys7CisJCQkJCW5wLT5zdGF0X3R4X2J5dGVzICs9IG5wLT5nZXRfdHhfY3R4LT5za2ItPmxlbjsKKwkJCQkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJm5wLT5zd3N0YXRzX3R4X3N5bmNwKTsKIAkJCQl9CisJCQkJYnl0ZXNfY29tcGwgKz0gbnAtPmdldF90eF9jdHgtPnNrYi0+bGVuOwogCQkJCWRldl9rZnJlZV9za2JfYW55KG5wLT5nZXRfdHhfY3R4LT5za2IpOwogCQkJCW5wLT5nZXRfdHhfY3R4LT5za2IgPSBOVUxMOwogCQkJCXR4X3dvcmsrKzsKQEAgLTIzOTgsMTIgKzI0OTIsMTYgQEAKIAkJfSBlbHNlIHsKIAkJCWlmIChmbGFncyAmIE5WX1RYMl9MQVNUUEFDS0VUKSB7CiAJCQkJaWYgKGZsYWdzICYgTlZfVFgyX0VSUk9SKSB7Ci0JCQkJCWlmICgoZmxhZ3MgJiBOVl9UWDJfUkVUUllFUlJPUikgJiYgIShmbGFncyAmIE5WX1RYMl9SRVRSWUNPVU5UX01BU0spKQorCQkJCQlpZiAoKGZsYWdzICYgTlZfVFgyX1JFVFJZRVJST1IpCisJCQkJCSAgICAmJiAhKGZsYWdzICYgTlZfVFgyX1JFVFJZQ09VTlRfTUFTSykpCiAJCQkJCQludl9sZWdhY3liYWNrb2ZmX3Jlc2VlZChkZXYpOwogCQkJCX0gZWxzZSB7Ci0JCQkJCWRldi0+c3RhdHMudHhfcGFja2V0cysrOwotCQkJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IG5wLT5nZXRfdHhfY3R4LT5za2ItPmxlbjsKKwkJCQkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmbnAtPnN3c3RhdHNfdHhfc3luY3ApOworCQkJCQlucC0+c3RhdF90eF9wYWNrZXRzKys7CisJCQkJCW5wLT5zdGF0X3R4X2J5dGVzICs9IG5wLT5nZXRfdHhfY3R4LT5za2ItPmxlbjsKKwkJCQkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJm5wLT5zd3N0YXRzX3R4X3N5bmNwKTsKIAkJCQl9CisJCQkJYnl0ZXNfY29tcGwgKz0gbnAtPmdldF90eF9jdHgtPnNrYi0+bGVuOwogCQkJCWRldl9rZnJlZV9za2JfYW55KG5wLT5nZXRfdHhfY3R4LT5za2IpOwogCQkJCW5wLT5nZXRfdHhfY3R4LT5za2IgPSBOVUxMOwogCQkJCXR4X3dvcmsrKzsKQEAgLTI0MTQsNiArMjUxMiw5IEBACiAJCWlmICh1bmxpa2VseShucC0+Z2V0X3R4X2N0eCsrID09IG5wLT5sYXN0X3R4X2N0eCkpCiAJCQlucC0+Z2V0X3R4X2N0eCA9IG5wLT5maXJzdF90eF9jdHg7CiAJfQorCisJbmV0ZGV2X2NvbXBsZXRlZF9xdWV1ZShucC0+ZGV2LCB0eF93b3JrLCBieXRlc19jb21wbCk7CisKIAlpZiAodW5saWtlbHkoKG5wLT50eF9zdG9wID09IDEpICYmIChucC0+Z2V0X3R4Lm9yaWcgIT0gb3JpZ19nZXRfdHgpKSkgewogCQlucC0+dHhfc3RvcCA9IDA7CiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKQEAgLTI0MjcsNiArMjUyOCw3IEBACiAJdTMyIGZsYWdzOwogCWludCB0eF93b3JrID0gMDsKIAlzdHJ1Y3QgcmluZ19kZXNjX2V4ICpvcmlnX2dldF90eCA9IG5wLT5nZXRfdHguZXg7CisJdW5zaWduZWQgbG9uZyBieXRlc19jbGVhbmVkID0gMDsKIAogCXdoaWxlICgobnAtPmdldF90eC5leCAhPSBucC0+cHV0X3R4LmV4KSAmJgogCSAgICAgICAhKChmbGFncyA9IGxlMzJfdG9fY3B1KG5wLT5nZXRfdHguZXgtPmZsYWdsZW4pKSAmIE5WX1RYMl9WQUxJRCkgJiYKQEAgLTI0MzYsMTcgKzI1MzgsMjEgQEAKIAogCQlpZiAoZmxhZ3MgJiBOVl9UWDJfTEFTVFBBQ0tFVCkgewogCQkJaWYgKGZsYWdzICYgTlZfVFgyX0VSUk9SKSB7Ci0JCQkJaWYgKChmbGFncyAmIE5WX1RYMl9SRVRSWUVSUk9SKSAmJiAhKGZsYWdzICYgTlZfVFgyX1JFVFJZQ09VTlRfTUFTSykpIHsKKwkJCQlpZiAoKGZsYWdzICYgTlZfVFgyX1JFVFJZRVJST1IpCisJCQkJICAgICYmICEoZmxhZ3MgJiBOVl9UWDJfUkVUUllDT1VOVF9NQVNLKSkgewogCQkJCQlpZiAobnAtPmRyaXZlcl9kYXRhICYgREVWX0hBU19HRUFSX01PREUpCiAJCQkJCQludl9nZWFyX2JhY2tvZmZfcmVzZWVkKGRldik7CiAJCQkJCWVsc2UKIAkJCQkJCW52X2xlZ2FjeWJhY2tvZmZfcmVzZWVkKGRldik7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQlkZXYtPnN0YXRzLnR4X3BhY2tldHMrKzsKLQkJCQlkZXYtPnN0YXRzLnR4X2J5dGVzICs9IG5wLT5nZXRfdHhfY3R4LT5za2ItPmxlbjsKKwkJCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZucC0+c3dzdGF0c190eF9zeW5jcCk7CisJCQkJbnAtPnN0YXRfdHhfcGFja2V0cysrOworCQkJCW5wLT5zdGF0X3R4X2J5dGVzICs9IG5wLT5nZXRfdHhfY3R4LT5za2ItPmxlbjsKKwkJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmbnAtPnN3c3RhdHNfdHhfc3luY3ApOwogCQkJfQogCisJCQlieXRlc19jbGVhbmVkICs9IG5wLT5nZXRfdHhfY3R4LT5za2ItPmxlbjsKIAkJCWRldl9rZnJlZV9za2JfYW55KG5wLT5nZXRfdHhfY3R4LT5za2IpOwogCQkJbnAtPmdldF90eF9jdHgtPnNrYiA9IE5VTEw7CiAJCQl0eF93b3JrKys7CkBAIC0yNDU0LDExICsyNTYwLDE1IEBACiAJCQlpZiAobnAtPnR4X2xpbWl0KQogCQkJCW52X3R4X2ZsaXBfb3duZXJzaGlwKGRldik7CiAJCX0KKwogCQlpZiAodW5saWtlbHkobnAtPmdldF90eC5leCsrID09IG5wLT5sYXN0X3R4LmV4KSkKIAkJCW5wLT5nZXRfdHguZXggPSBucC0+Zmlyc3RfdHguZXg7CiAJCWlmICh1bmxpa2VseShucC0+Z2V0X3R4X2N0eCsrID09IG5wLT5sYXN0X3R4X2N0eCkpCiAJCQlucC0+Z2V0X3R4X2N0eCA9IG5wLT5maXJzdF90eF9jdHg7CiAJfQorCisJbmV0ZGV2X2NvbXBsZXRlZF9xdWV1ZShucC0+ZGV2LCB0eF93b3JrLCBieXRlc19jbGVhbmVkKTsKKwogCWlmICh1bmxpa2VseSgobnAtPnR4X3N0b3AgPT0gMSkgJiYgKG5wLT5nZXRfdHguZXggIT0gb3JpZ19nZXRfdHgpKSkgewogCQlucC0+dHhfc3RvcCA9IDA7CiAJCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKQEAgLTI0NzcsNTYgKzI1ODcsNjQgQEAKIAl1MzIgc3RhdHVzOwogCXVuaW9uIHJpbmdfdHlwZSBwdXRfdHg7CiAJaW50IHNhdmVkX3R4X2xpbWl0OwotCWludCBpOwogCiAJaWYgKG5wLT5tc2lfZmxhZ3MgJiBOVl9NU0lfWF9FTkFCTEVEKQogCQlzdGF0dXMgPSByZWFkbChiYXNlICsgTnZSZWdNU0lYSXJxU3RhdHVzKSAmIE5WUkVHX0lSUVNUQVRfTUFTSzsKIAllbHNlCiAJCXN0YXR1cyA9IHJlYWRsKGJhc2UgKyBOdlJlZ0lycVN0YXR1cykgJiBOVlJFR19JUlFTVEFUX01BU0s7CiAKLQluZXRkZXZfaW5mbyhkZXYsICJHb3QgdHhfdGltZW91dC4gaXJxOiAlMDh4XG4iLCBzdGF0dXMpOworCW5ldGRldl93YXJuKGRldiwgIkdvdCB0eF90aW1lb3V0LiBpcnEgc3RhdHVzOiAlMDh4XG4iLCBzdGF0dXMpOwogCi0JbmV0ZGV2X2luZm8oZGV2LCAiUmluZyBhdCAlbHhcbiIsICh1bnNpZ25lZCBsb25nKW5wLT5yaW5nX2FkZHIpOwotCW5ldGRldl9pbmZvKGRldiwgIkR1bXBpbmcgdHggcmVnaXN0ZXJzXG4iKTsKLQlmb3IgKGkgPSAwOyBpIDw9IG5wLT5yZWdpc3Rlcl9zaXplOyBpICs9IDMyKSB7Ci0JCW5ldGRldl9pbmZvKGRldiwKLQkJCSAgICAiJTN4OiAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHhcbiIsCi0JCQkgICAgaSwKLQkJCSAgICByZWFkbChiYXNlICsgaSArIDApLCByZWFkbChiYXNlICsgaSArIDQpLAotCQkJICAgIHJlYWRsKGJhc2UgKyBpICsgOCksIHJlYWRsKGJhc2UgKyBpICsgMTIpLAotCQkJICAgIHJlYWRsKGJhc2UgKyBpICsgMTYpLCByZWFkbChiYXNlICsgaSArIDIwKSwKLQkJCSAgICByZWFkbChiYXNlICsgaSArIDI0KSwgcmVhZGwoYmFzZSArIGkgKyAyOCkpOwotCX0KLQluZXRkZXZfaW5mbyhkZXYsICJEdW1waW5nIHR4IHJpbmdcbiIpOwotCWZvciAoaSA9IDA7IGkgPCBucC0+dHhfcmluZ19zaXplOyBpICs9IDQpIHsKLQkJaWYgKCFudl9vcHRpbWl6ZWQobnApKSB7CisJaWYgKHVubGlrZWx5KGRlYnVnX3R4X3RpbWVvdXQpKSB7CisJCWludCBpOworCisJCW5ldGRldl9pbmZvKGRldiwgIlJpbmcgYXQgJWx4XG4iLCAodW5zaWduZWQgbG9uZylucC0+cmluZ19hZGRyKTsKKwkJbmV0ZGV2X2luZm8oZGV2LCAiRHVtcGluZyB0eCByZWdpc3RlcnNcbiIpOworCQlmb3IgKGkgPSAwOyBpIDw9IG5wLT5yZWdpc3Rlcl9zaXplOyBpICs9IDMyKSB7CiAJCQluZXRkZXZfaW5mbyhkZXYsCi0JCQkJICAgICIlMDN4OiAlMDh4ICUwOHggLy8gJTA4eCAlMDh4IC8vICUwOHggJTA4eCAvLyAlMDh4ICUwOHhcbiIsCisJCQkJICAgICIlM3g6ICUwOHggJTA4eCAlMDh4ICUwOHggIgorCQkJCSAgICAiJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwKIAkJCQkgICAgaSwKLQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3Jpbmcub3JpZ1tpXS5idWYpLAotCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2ldLmZsYWdsZW4pLAotCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krMV0uYnVmKSwKLQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3Jpbmcub3JpZ1tpKzFdLmZsYWdsZW4pLAotCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krMl0uYnVmKSwKLQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3Jpbmcub3JpZ1tpKzJdLmZsYWdsZW4pLAotCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krM10uYnVmKSwKLQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3Jpbmcub3JpZ1tpKzNdLmZsYWdsZW4pKTsKLQkJfSBlbHNlIHsKLQkJCW5ldGRldl9pbmZvKGRldiwKLQkJCQkgICAgIiUwM3g6ICUwOHggJTA4eCAlMDh4IC8vICUwOHggJTA4eCAlMDh4IC8vICUwOHggJTA4eCAlMDh4IC8vICUwOHggJTA4eCAlMDh4XG4iLAotCQkJCSAgICBpLAotCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpXS5idWZoaWdoKSwKLQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaV0uYnVmbG93KSwKLQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaV0uZmxhZ2xlbiksCi0JCQkJICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krMV0uYnVmaGlnaCksCi0JCQkJICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krMV0uYnVmbG93KSwKLQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSsxXS5mbGFnbGVuKSwKLQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSsyXS5idWZoaWdoKSwKLQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSsyXS5idWZsb3cpLAotCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzJdLmZsYWdsZW4pLAotCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzNdLmJ1ZmhpZ2gpLAotCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzNdLmJ1ZmxvdyksCi0JCQkJICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krM10uZmxhZ2xlbikpOworCQkJCSAgICByZWFkbChiYXNlICsgaSArIDApLCByZWFkbChiYXNlICsgaSArIDQpLAorCQkJCSAgICByZWFkbChiYXNlICsgaSArIDgpLCByZWFkbChiYXNlICsgaSArIDEyKSwKKwkJCQkgICAgcmVhZGwoYmFzZSArIGkgKyAxNiksIHJlYWRsKGJhc2UgKyBpICsgMjApLAorCQkJCSAgICByZWFkbChiYXNlICsgaSArIDI0KSwgcmVhZGwoYmFzZSArIGkgKyAyOCkpOworCQl9CisJCW5ldGRldl9pbmZvKGRldiwgIkR1bXBpbmcgdHggcmluZ1xuIik7CisJCWZvciAoaSA9IDA7IGkgPCBucC0+dHhfcmluZ19zaXplOyBpICs9IDQpIHsKKwkJCWlmICghbnZfb3B0aW1pemVkKG5wKSkgeworCQkJCW5ldGRldl9pbmZvKGRldiwKKwkJCQkJICAgICIlMDN4OiAlMDh4ICUwOHggLy8gJTA4eCAlMDh4ICIKKwkJCQkJICAgICIvLyAlMDh4ICUwOHggLy8gJTA4eCAlMDh4XG4iLAorCQkJCQkgICAgaSwKKwkJCQkJICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaV0uYnVmKSwKKwkJCQkJICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaV0uZmxhZ2xlbiksCisJCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krMV0uYnVmKSwKKwkJCQkJICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaSsxXS5mbGFnbGVuKSwKKwkJCQkJICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLm9yaWdbaSsyXS5idWYpLAorCQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3Jpbmcub3JpZ1tpKzJdLmZsYWdsZW4pLAorCQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3Jpbmcub3JpZ1tpKzNdLmJ1ZiksCisJCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5vcmlnW2krM10uZmxhZ2xlbikpOworCQkJfSBlbHNlIHsKKwkJCQluZXRkZXZfaW5mbyhkZXYsCisJCQkJCSAgICAiJTAzeDogJTA4eCAlMDh4ICUwOHggIgorCQkJCQkgICAgIi8vICUwOHggJTA4eCAlMDh4ICIKKwkJCQkJICAgICIvLyAlMDh4ICUwOHggJTA4eCAiCisJCQkJCSAgICAiLy8gJTA4eCAlMDh4ICUwOHhcbiIsCisJCQkJCSAgICBpLAorCQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaV0uYnVmaGlnaCksCisJCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpXS5idWZsb3cpLAorCQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaV0uZmxhZ2xlbiksCisJCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzFdLmJ1ZmhpZ2gpLAorCQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSsxXS5idWZsb3cpLAorCQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSsxXS5mbGFnbGVuKSwKKwkJCQkJICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krMl0uYnVmaGlnaCksCisJCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzJdLmJ1ZmxvdyksCisJCQkJCSAgICBsZTMyX3RvX2NwdShucC0+dHhfcmluZy5leFtpKzJdLmZsYWdsZW4pLAorCQkJCQkgICAgbGUzMl90b19jcHUobnAtPnR4X3JpbmcuZXhbaSszXS5idWZoaWdoKSwKKwkJCQkJICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krM10uYnVmbG93KSwKKwkJCQkJICAgIGxlMzJfdG9fY3B1KG5wLT50eF9yaW5nLmV4W2krM10uZmxhZ2xlbikpOworCQkJfQogCQl9CiAJfQogCkBAIC0yNjQ5LDggKzI3NjcsMTEgQEAKIAkJCQkJfQogCQkJCQkvKiB0aGUgcmVzdCBhcmUgaGFyZCBlcnJvcnMgKi8KIAkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoZmxhZ3MgJiBOVl9SWF9NSVNTRURGUkFNRSkKLQkJCQkJCQlkZXYtPnN0YXRzLnJ4X21pc3NlZF9lcnJvcnMrKzsKKwkJCQkJCWlmIChmbGFncyAmIE5WX1JYX01JU1NFREZSQU1FKSB7CisJCQkJCQkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmbnAtPnN3c3RhdHNfcnhfc3luY3ApOworCQkJCQkJCW5wLT5zdGF0X3J4X21pc3NlZF9lcnJvcnMrKzsKKwkJCQkJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmbnAtPnN3c3RhdHNfcnhfc3luY3ApOworCQkJCQkJfQogCQkJCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQkJCQkJZ290byBuZXh0X3BrdDsKIAkJCQkJfQpAQCAtMjY5Myw4ICsyODE0LDEwIEBACiAJCXNrYl9wdXQoc2tiLCBsZW4pOwogCQlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBkZXYpOwogCQluYXBpX2dyb19yZWNlaXZlKCZucC0+bmFwaSwgc2tiKTsKLQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzKys7Ci0JCWRldi0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOworCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZucC0+c3dzdGF0c19yeF9zeW5jcCk7CisJCW5wLT5zdGF0X3J4X3BhY2tldHMrKzsKKwkJbnAtPnN0YXRfcnhfYnl0ZXMgKz0gbGVuOworCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmbnAtPnN3c3RhdHNfcnhfc3luY3ApOwogbmV4dF9wa3Q6CiAJCWlmICh1bmxpa2VseShucC0+Z2V0X3J4Lm9yaWcrKyA9PSBucC0+bGFzdF9yeC5vcmlnKSkKIAkJCW5wLT5nZXRfcngub3JpZyA9IG5wLT5maXJzdF9yeC5vcmlnOwpAQCAtMjc3Nyw4ICsyOTAwLDEwIEBACiAJCQkJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIHZpZCk7CiAJCQl9CiAJCQluYXBpX2dyb19yZWNlaXZlKCZucC0+bmFwaSwgc2tiKTsKLQkJCWRldi0+c3RhdHMucnhfcGFja2V0cysrOwotCQkJZGV2LT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CisJCQl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZucC0+c3dzdGF0c19yeF9zeW5jcCk7CisJCQlucC0+c3RhdF9yeF9wYWNrZXRzKys7CisJCQlucC0+c3RhdF9yeF9ieXRlcyArPSBsZW47CisJCQl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmbnAtPnN3c3RhdHNfcnhfc3luY3ApOwogCQl9IGVsc2UgewogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCQl9CkBAIC0zMDIxLDYgKzMxNDYsNzMgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIG52X2ZvcmNlX2xpbmtzcGVlZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgc3BlZWQsIGludCBkdXBsZXgpCit7CisJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOworCXUzMiBwaHlyZWcsIHR4cmVnOworCWludCBtaWlfc3RhdHVzOworCisJbnAtPmxpbmtzcGVlZCA9IE5WUkVHX0xJTktTUEVFRF9GT1JDRXxzcGVlZDsKKwlucC0+ZHVwbGV4ID0gZHVwbGV4OworCisJLyogc2VlIGlmIGdpZ2FiaXQgcGh5ICovCisJbWlpX3N0YXR1cyA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQk1TUiwgTUlJX1JFQUQpOworCWlmIChtaWlfc3RhdHVzICYgUEhZX0dJR0FCSVQpIHsKKwkJbnAtPmdpZ2FiaXQgPSBQSFlfR0lHQUJJVDsKKwkJcGh5cmVnID0gcmVhZGwoYmFzZSArIE52UmVnU2xvdFRpbWUpOworCQlwaHlyZWcgJj0gfigweDNGRjAwKTsKKwkJaWYgKChucC0+bGlua3NwZWVkICYgMHhGRkYpID09IE5WUkVHX0xJTktTUEVFRF8xMCkKKwkJCXBoeXJlZyB8PSBOVlJFR19TTE9UVElNRV8xMF8xMDBfRlVMTDsKKwkJZWxzZSBpZiAoKG5wLT5saW5rc3BlZWQgJiAweEZGRikgPT0gTlZSRUdfTElOS1NQRUVEXzEwMCkKKwkJCXBoeXJlZyB8PSBOVlJFR19TTE9UVElNRV8xMF8xMDBfRlVMTDsKKwkJZWxzZSBpZiAoKG5wLT5saW5rc3BlZWQgJiAweEZGRikgPT0gTlZSRUdfTElOS1NQRUVEXzEwMDApCisJCQlwaHlyZWcgfD0gTlZSRUdfU0xPVFRJTUVfMTAwMF9GVUxMOworCQl3cml0ZWwocGh5cmVnLCBiYXNlICsgTnZSZWdTbG90VGltZSk7CisJfQorCisJcGh5cmVnID0gcmVhZGwoYmFzZSArIE52UmVnUGh5SW50ZXJmYWNlKTsKKwlwaHlyZWcgJj0gfihQSFlfSEFMRnxQSFlfMTAwfFBIWV8xMDAwKTsKKwlpZiAobnAtPmR1cGxleCA9PSAwKQorCQlwaHlyZWcgfD0gUEhZX0hBTEY7CisJaWYgKChucC0+bGlua3NwZWVkICYgTlZSRUdfTElOS1NQRUVEX01BU0spID09IE5WUkVHX0xJTktTUEVFRF8xMDApCisJCXBoeXJlZyB8PSBQSFlfMTAwOworCWVsc2UgaWYgKChucC0+bGlua3NwZWVkICYgTlZSRUdfTElOS1NQRUVEX01BU0spID09CisJCQkJCQkJTlZSRUdfTElOS1NQRUVEXzEwMDApCisJCXBoeXJlZyB8PSBQSFlfMTAwMDsKKwl3cml0ZWwocGh5cmVnLCBiYXNlICsgTnZSZWdQaHlJbnRlcmZhY2UpOworCisJaWYgKHBoeXJlZyAmIFBIWV9SR01JSSkgeworCQlpZiAoKG5wLT5saW5rc3BlZWQgJiBOVlJFR19MSU5LU1BFRURfTUFTSykgPT0KKwkJCQkJCQlOVlJFR19MSU5LU1BFRURfMTAwMCkKKwkJCXR4cmVnID0gTlZSRUdfVFhfREVGRVJSQUxfUkdNSUlfMTAwMDsKKwkJZWxzZQorCQkJdHhyZWcgPSBOVlJFR19UWF9ERUZFUlJBTF9SR01JSV8xMF8xMDA7CisJfSBlbHNlIHsKKwkJdHhyZWcgPSBOVlJFR19UWF9ERUZFUlJBTF9ERUZBVUxUOworCX0KKwl3cml0ZWwodHhyZWcsIGJhc2UgKyBOdlJlZ1R4RGVmZXJyYWwpOworCisJaWYgKG5wLT5kZXNjX3ZlciA9PSBERVNDX1ZFUl8xKSB7CisJCXR4cmVnID0gTlZSRUdfVFhfV01fREVTQzFfREVGQVVMVDsKKwl9IGVsc2UgeworCQlpZiAoKG5wLT5saW5rc3BlZWQgJiBOVlJFR19MSU5LU1BFRURfTUFTSykgPT0KKwkJCQkJIE5WUkVHX0xJTktTUEVFRF8xMDAwKQorCQkJdHhyZWcgPSBOVlJFR19UWF9XTV9ERVNDMl8zXzEwMDA7CisJCWVsc2UKKwkJCXR4cmVnID0gTlZSRUdfVFhfV01fREVTQzJfM19ERUZBVUxUOworCX0KKwl3cml0ZWwodHhyZWcsIGJhc2UgKyBOdlJlZ1R4V2F0ZXJtYXJrKTsKKworCXdyaXRlbChOVlJFR19NSVNDMV9GT1JDRSB8IChucC0+ZHVwbGV4ID8gMCA6IE5WUkVHX01JU0MxX0hEKSwKKwkJCWJhc2UgKyBOdlJlZ01pc2MxKTsKKwlwY2lfcHVzaChiYXNlKTsKKwl3cml0ZWwobnAtPmxpbmtzcGVlZCwgYmFzZSArIE52UmVnTGlua1NwZWVkKTsKKwlwY2lfcHVzaChiYXNlKTsKKworCXJldHVybjsKK30KKwogLyoqCiAgKiBudl91cGRhdGVfbGlua3NwZWVkOiBTZXR1cCB0aGUgTUFDIGFjY29yZGluZyB0byB0aGUgbGluayBwYXJ0bmVyCiAgKiBAZGV2OiBOZXR3b3JrIGRldmljZSB0byBiZSBjb25maWd1cmVkCkBAIC0zMDQyLDExICszMjM0LDI1IEBACiAJaW50IG5ld2xzID0gbnAtPmxpbmtzcGVlZDsKIAlpbnQgbmV3ZHVwID0gbnAtPmR1cGxleDsKIAlpbnQgbWlpX3N0YXR1czsKKwl1MzIgYm1jcjsKIAlpbnQgcmV0dmFsID0gMDsKIAl1MzIgY29udHJvbF8xMDAwLCBzdGF0dXNfMTAwMCwgcGh5cmVnLCBwYXVzZV9mbGFncywgdHhyZWc7CiAJdTMyIHR4cnhGbGFncyA9IDA7CiAJdTMyIHBoeV9leHA7CiAKKwkvKiBJZiBkZXZpY2UgbG9vcGJhY2sgaXMgZW5hYmxlZCwgc2V0IGNhcnJpZXIgb24gYW5kIGVuYWJsZSBtYXggbGluaworCSAqIHNwZWVkLgorCSAqLworCWJtY3IgPSBtaWlfcncoZGV2LCBucC0+cGh5YWRkciwgTUlJX0JNQ1IsIE1JSV9SRUFEKTsKKwlpZiAoYm1jciAmIEJNQ1JfTE9PUEJBQ0spIHsKKwkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJbnZfZm9yY2VfbGlua3NwZWVkKGRldiwgTlZSRUdfTElOS1NQRUVEXzEwMDAsIDEpOworCQkJaWYgKCFuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCQl9CisJCXJldHVybiAxOworCX0KKwogCS8qIEJNU1JfTFNUQVRVUyBpcyBsYXRjaGVkLCByZWFkIGl0IHR3aWNlOgogCSAqIHdlIHdhbnQgdGhlIGN1cnJlbnQgdmFsdWUuCiAJICovCkBAIC0zNzI5LDYgKzM5MzUsNyBAQAogCQkJCXdyaXRlbCgwLCBiYXNlICsgTnZSZWdNU0lYTWFwMCk7CiAJCQkJd3JpdGVsKDAsIGJhc2UgKyBOdlJlZ01TSVhNYXAxKTsKIAkJCX0KKwkJCW5ldGRldl9pbmZvKGRldiwgIk1TSS1YIGVuYWJsZWRcbiIpOwogCQl9CiAJfQogCWlmIChyZXQgIT0gMCAmJiBucC0+bXNpX2ZsYWdzICYgTlZfTVNJX0NBUEFCTEUpIHsKQEAgLTM3NTAsNiArMzk1Nyw3IEBACiAJCQl3cml0ZWwoMCwgYmFzZSArIE52UmVnTVNJTWFwMSk7CiAJCQkvKiBlbmFibGUgbXNpIHZlY3RvciAwICovCiAJCQl3cml0ZWwoTlZSRUdfTVNJX1ZFQ1RPUl8wX0VOQUJMRUQsIGJhc2UgKyBOdlJlZ01TSUlycU1hc2spOworCQkJbmV0ZGV2X2luZm8oZGV2LCAiTVNJIGVuYWJsZWRcbiIpOwogCQl9CiAJfQogCWlmIChyZXQgIT0gMCkgewpAQCAtMzkwNCwxMSArNDExMiwxOCBAQAogI2VuZGlmCiAKIHN0YXRpYyB2b2lkIG52X2RvX3N0YXRzX3BvbGwodW5zaWduZWQgbG9uZyBkYXRhKQorCV9fYWNxdWlyZXMoJm5ldGRldl9wcml2KGRldiktPmh3c3RhdHNfbG9jaykKKwlfX3JlbGVhc2VzKCZuZXRkZXZfcHJpdihkZXYpLT5od3N0YXRzX2xvY2spCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBkYXRhOwogCXN0cnVjdCBmZV9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CiAKLQludl9nZXRfaHdfc3RhdHMoZGV2KTsKKwkvKiBJZiBsb2NrIGlzIGN1cnJlbnRseSB0YWtlbiwgdGhlIHN0YXRzIGFyZSBiZWluZyByZWZyZXNoZWQKKwkgKiBhbmQgaGVuY2UgZnJlc2ggZW5vdWdoICovCisJaWYgKHNwaW5fdHJ5bG9jaygmbnAtPmh3c3RhdHNfbG9jaykpIHsKKwkJbnZfdXBkYXRlX3N0YXRzKGRldik7CisJCXNwaW5fdW5sb2NrKCZucC0+aHdzdGF0c19sb2NrKTsKKwl9CiAKIAlpZiAoIW5wLT5pbl9zaHV0ZG93bikKIAkJbW9kX3RpbWVyKCZucC0+c3RhdHNfcG9sbCwKQEAgLTM5MTgsOSArNDEzMyw5IEBACiBzdGF0aWMgdm9pZCBudl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCXN0cnVjdCBmZV9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7Ci0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBGT1JDRURFVEhfVkVSU0lPTik7Ci0Jc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShucC0+cGNpX2RldikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRk9SQ0VERVRIX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBjaV9kZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIHZvaWQgbnZfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2xpbmZvKQpAQCAtNDQ3Myw3ICs0Njg4LDYzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgbnZfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgbnZfc2V0X2xvb3BiYWNrKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQoreworCXN0cnVjdCBmZV9wcml2ICpucCA9IG5ldGRldl9wcml2KGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgbWlpY29udHJvbDsKKwlpbnQgZXJyLCByZXR2YWwgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm5wLT5sb2NrLCBmbGFncyk7CisJbWlpY29udHJvbCA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQk1DUiwgTUlJX1JFQUQpOworCWlmIChmZWF0dXJlcyAmIE5FVElGX0ZfTE9PUEJBQ0spIHsKKwkJaWYgKG1paWNvbnRyb2wgJiBCTUNSX0xPT1BCQUNLKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCQkJbmV0ZGV2X2luZm8oZGV2LCAiTG9vcGJhY2sgYWxyZWFkeSBlbmFibGVkXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCW52X2Rpc2FibGVfaXJxKGRldik7CisJCS8qIFR1cm4gb24gbG9vcGJhY2sgbW9kZSAqLworCQltaWljb250cm9sIHw9IEJNQ1JfTE9PUEJBQ0sgfCBCTUNSX0ZVTExEUExYIHwgQk1DUl9TUEVFRDEwMDA7CisJCWVyciA9IG1paV9ydyhkZXYsIG5wLT5waHlhZGRyLCBNSUlfQk1DUiwgbWlpY29udHJvbCk7CisJCWlmIChlcnIpIHsKKwkJCXJldHZhbCA9IFBIWV9FUlJPUjsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7CisJCQlwaHlfaW5pdChkZXYpOworCQl9IGVsc2UgeworCQkJaWYgKG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQkJCS8qIEZvcmNlIDEwMDAgTWJwcyBmdWxsLWR1cGxleCAqLworCQkJCW52X2ZvcmNlX2xpbmtzcGVlZChkZXYsIE5WUkVHX0xJTktTUEVFRF8xMDAwLAorCQkJCQkJCQkJIDEpOworCQkJCS8qIEZvcmNlIGxpbmsgdXAgKi8KKwkJCQluZXRpZl9jYXJyaWVyX29uKGRldik7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCQkJbmV0ZGV2X2luZm8oZGV2LAorCQkJCSJJbnRlcm5hbCBQSFkgbG9vcGJhY2sgbW9kZSBlbmFibGVkLlxuIik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIShtaWljb250cm9sICYgQk1DUl9MT09QQkFDSykpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7CisJCQluZXRkZXZfaW5mbyhkZXYsICJMb29wYmFjayBhbHJlYWR5IGRpc2FibGVkXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCW52X2Rpc2FibGVfaXJxKGRldik7CisJCS8qIFR1cm4gb2ZmIGxvb3BiYWNrICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm5wLT5sb2NrLCBmbGFncyk7CisJCW5ldGRldl9pbmZvKGRldiwgIkludGVybmFsIFBIWSBsb29wYmFjayBtb2RlIGRpc2FibGVkLlxuIik7CisJCXBoeV9pbml0KGRldik7CisJfQorCW1zbGVlcCg1MDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZucC0+bG9jaywgZmxhZ3MpOworCW52X2VuYWJsZV9pcnEoZGV2KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZucC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIG5ldGRldl9mZWF0dXJlc190IG52X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCS8qIHZsYW4gaXMgZGVwZW5kZW50IG9uIHJ4IGNoZWNrc3VtIG9mZmxvYWQgKi8KIAlpZiAoZmVhdHVyZXMgJiAoTkVUSUZfRl9IV19WTEFOX1RYfE5FVElGX0ZfSFdfVkxBTl9SWCkpCkBAIC00NDgyLDcgKzQ3NTMsNyBAQAogCXJldHVybiBmZWF0dXJlczsKIH0KIAotc3RhdGljIHZvaWQgbnZfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyB2b2lkIG52X3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgZmVfcHJpdiAqbnAgPSBnZXRfbnZwcml2KGRldik7CiAKQEAgLTQ1MDMsMTEgKzQ3NzQsMTggQEAKIAlzcGluX3VubG9ja19pcnEoJm5wLT5sb2NrKTsKIH0KIAotc3RhdGljIGludCBudl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIGludCBudl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1OCBfX2lvbWVtICpiYXNlID0gZ2V0X2h3YmFzZShkZXYpOwotCXUzMiBjaGFuZ2VkID0gZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisJaW50IHJldHZhbDsKKworCWlmICgoY2hhbmdlZCAmIE5FVElGX0ZfTE9PUEJBQ0spICYmIG5ldGlmX3J1bm5pbmcoZGV2KSkgeworCQlyZXR2YWwgPSBudl9zZXRfbG9vcGJhY2soZGV2LCBmZWF0dXJlcyk7CisJCWlmIChyZXR2YWwgIT0gMCkKKwkJCXJldHVybiByZXR2YWw7CisJfQogCiAJaWYgKGNoYW5nZWQgJiBORVRJRl9GX1JYQ1NVTSkgewogCQlzcGluX2xvY2tfaXJxKCZucC0+bG9jayk7CkBAIC00NTUzLDE0ICs0ODMxLDE4IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBudl9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9zdGF0cyAqZXN0YXRzLCB1NjQgKmJ1ZmZlcikKK3N0YXRpYyB2b2lkIG52X2dldF9ldGh0b29sX3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJIHN0cnVjdCBldGh0b29sX3N0YXRzICplc3RhdHMsIHU2NCAqYnVmZmVyKQorCV9fYWNxdWlyZXMoJm5ldGRldl9wcml2KGRldiktPmh3c3RhdHNfbG9jaykKKwlfX3JlbGVhc2VzKCZuZXRkZXZfcHJpdihkZXYpLT5od3N0YXRzX2xvY2spCiB7CiAJc3RydWN0IGZlX3ByaXYgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCS8qIHVwZGF0ZSBzdGF0cyAqLwotCW52X2dldF9od19zdGF0cyhkZXYpOwotCi0JbWVtY3B5KGJ1ZmZlciwgJm5wLT5lc3RhdHMsIG52X2dldF9zc2V0X2NvdW50KGRldiwgRVRIX1NTX1NUQVRTKSpzaXplb2YodTY0KSk7CisJc3Bpbl9sb2NrX2JoKCZucC0+aHdzdGF0c19sb2NrKTsKKwludl91cGRhdGVfc3RhdHMoZGV2KTsKKwltZW1jcHkoYnVmZmVyLCAmbnAtPmVzdGF0cywKKwkgICAgICAgbnZfZ2V0X3NzZXRfY291bnQoZGV2LCBFVEhfU1NfU1RBVFMpKnNpemVvZih1NjQpKTsKKwlzcGluX3VubG9ja19iaCgmbnAtPmh3c3RhdHNfbG9jayk7CiB9CiAKIHN0YXRpYyBpbnQgbnZfbGlua190ZXN0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC01MTQyLDYgKzU0MjQsMTIgQEAKIAogCXNwaW5fdW5sb2NrX2lycSgmbnAtPmxvY2spOwogCisJLyogSWYgdGhlIGxvb3BiYWNrIGZlYXR1cmUgd2FzIHNldCB3aGlsZSB0aGUgZGV2aWNlIHdhcyBkb3duLCBtYWtlIHN1cmUKKwkgKiB0aGF0IGl0J3Mgc2V0IGNvcnJlY3RseSBub3cuCisJICovCisJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0xPT1BCQUNLKQorCQludl9zZXRfbG9vcGJhY2soZGV2LCBkZXYtPmZlYXR1cmVzKTsKKwogCXJldHVybiAwOwogb3V0X2RyYWluOgogCW52X2RyYWluX3J4dHgoZGV2KTsKQEAgLTUxOTgsNyArNTQ4Niw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIG52X25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQk9IG52X29wZW4sCiAJLm5kb19zdG9wCQk9IG52X2Nsb3NlLAotCS5uZG9fZ2V0X3N0YXRzCQk9IG52X2dldF9zdGF0cywKKwkubmRvX2dldF9zdGF0czY0CT0gbnZfZ2V0X3N0YXRzNjQsCiAJLm5kb19zdGFydF94bWl0CQk9IG52X3N0YXJ0X3htaXQsCiAJLm5kb190eF90aW1lb3V0CQk9IG52X3R4X3RpbWVvdXQsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IG52X2NoYW5nZV9tdHUsCkBAIC01MjE1LDcgKzU1MDMsNyBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBudl9uZXRkZXZfb3BzX29wdGltaXplZCA9IHsKIAkubmRvX29wZW4JCT0gbnZfb3BlbiwKIAkubmRvX3N0b3AJCT0gbnZfY2xvc2UsCi0JLm5kb19nZXRfc3RhdHMJCT0gbnZfZ2V0X3N0YXRzLAorCS5uZG9fZ2V0X3N0YXRzNjQJPSBudl9nZXRfc3RhdHM2NCwKIAkubmRvX3N0YXJ0X3htaXQJCT0gbnZfc3RhcnRfeG1pdF9vcHRpbWl6ZWQsCiAJLm5kb190eF90aW1lb3V0CQk9IG52X3R4X3RpbWVvdXQsCiAJLm5kb19jaGFuZ2VfbXR1CQk9IG52X2NoYW5nZV9tdHUsCkBAIC01MjU0LDYgKzU1NDIsNyBAQAogCW5wLT5kZXYgPSBkZXY7CiAJbnAtPnBjaV9kZXYgPSBwY2lfZGV2OwogCXNwaW5fbG9ja19pbml0KCZucC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJm5wLT5od3N0YXRzX2xvY2spOwogCVNFVF9ORVRERVZfREVWKGRldiwgJnBjaV9kZXYtPmRldik7CiAKIAlpbml0X3RpbWVyKCZucC0+b29tX2tpY2spOwpAQCAtNTI2Miw3ICs1NTUxLDcgQEAKIAlpbml0X3RpbWVyKCZucC0+bmljX3BvbGwpOwogCW5wLT5uaWNfcG9sbC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKIAlucC0+bmljX3BvbGwuZnVuY3Rpb24gPSBudl9kb19uaWNfcG9sbDsJLyogdGltZXIgaGFuZGxlciAqLwotCWluaXRfdGltZXIoJm5wLT5zdGF0c19wb2xsKTsKKwlpbml0X3RpbWVyX2RlZmVycmFibGUoJm5wLT5zdGF0c19wb2xsKTsKIAlucC0+c3RhdHNfcG9sbC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpIGRldjsKIAlucC0+c3RhdHNfcG9sbC5mdW5jdGlvbiA9IG52X2RvX3N0YXRzX3BvbGw7CS8qIHRpbWVyIGhhbmRsZXIgKi8KIApAQCAtNTM0Niw2ICs1NjM1LDkgQEAKIAogCWRldi0+ZmVhdHVyZXMgfD0gZGV2LT5od19mZWF0dXJlczsKIAorCS8qIEFkZCBsb29wYmFjayBjYXBhYmlsaXR5IHRvIHRoZSBkZXZpY2UuICovCisJZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX0xPT1BCQUNLOworCiAJbnAtPnBhdXNlX2ZsYWdzID0gTlZfUEFVU0VGUkFNRV9SWF9DQVBBQkxFIHwgTlZfUEFVU0VGUkFNRV9SWF9SRVEgfCBOVl9QQVVTRUZSQU1FX0FVVE9ORUc7CiAJaWYgKChpZC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjEpIHx8CiAJICAgIChpZC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX1BBVVNFRlJBTUVfVFhfVjIpIHx8CkBAIC01NjIxLDEyICs1OTEzLDE0IEBACiAJZGV2X2luZm8oJnBjaV9kZXYtPmRldiwgImlmbmFtZSAlcywgUEhZIE9VSSAweCV4IEAgJWQsIGFkZHIgJXBNXG4iLAogCQkgZGV2LT5uYW1lLCBucC0+cGh5X291aSwgbnAtPnBoeWFkZHIsIGRldi0+ZGV2X2FkZHIpOwogCi0JZGV2X2luZm8oJnBjaV9kZXYtPmRldiwgIiVzJXMlcyVzJXMlcyVzJXMlcyVzZGVzYy12JXVcbiIsCisJZGV2X2luZm8oJnBjaV9kZXYtPmRldiwgIiVzJXMlcyVzJXMlcyVzJXMlcyVzJXNkZXNjLXYldVxuIiwKIAkJIGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hJR0hETUEgPyAiaGlnaGRtYSAiIDogIiIsCiAJCSBkZXYtPmZlYXR1cmVzICYgKE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfU0cpID8KIAkJCSJjc3VtICIgOiAiIiwKIAkJIGRldi0+ZmVhdHVyZXMgJiAoTkVUSUZfRl9IV19WTEFOX1JYIHwgTkVUSUZfRl9IV19WTEFOX1RYKSA/CiAJCQkidmxhbiAiIDogIiIsCisJCSBkZXYtPmZlYXR1cmVzICYgKE5FVElGX0ZfTE9PUEJBQ0spID8KKwkJCSJsb29wYmFjayAiIDogIiIsCiAJCSBpZC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX1BPV0VSX0NOVFJMID8gInB3cmN0bCAiIDogIiIsCiAJCSBpZC0+ZHJpdmVyX2RhdGEgJiBERVZfSEFTX01HTVRfVU5JVCA/ICJtZ210ICIgOiAiIiwKIAkJIGlkLT5kcml2ZXJfZGF0YSAmIERFVl9ORUVEX1RJTUVSSVJRID8gInRpbWlycSAiIDogIiIsCkBAIC02MDAwLDYgKzYyOTQsOSBAQAogTU9EVUxFX1BBUk1fREVTQyhwaHlfY3Jvc3MsICJQaHkgY3Jvc3NvdmVyIGRldGVjdGlvbiBmb3IgUmVhbHRlayA4MjAxIHBoeSBpcyBlbmFibGVkIGJ5IHNldHRpbmcgdG8gMSBhbmQgZGlzYWJsZWQgYnkgc2V0dGluZyB0byAwLiIpOwogbW9kdWxlX3BhcmFtKHBoeV9wb3dlcl9kb3duLCBpbnQsIDApOwogTU9EVUxFX1BBUk1fREVTQyhwaHlfcG93ZXJfZG93biwgIlBvd2VyIGRvd24gcGh5IGFuZCBkaXNhYmxlIGxpbmsgd2hlbiBpbnRlcmZhY2UgaXMgZG93biAoMSksIG9yIGxlYXZlIHBoeSBwb3dlcmVkIHVwICgwKS4iKTsKK21vZHVsZV9wYXJhbShkZWJ1Z190eF90aW1lb3V0LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWdfdHhfdGltZW91dCwKKwkJICJEdW1wIHR4IHJlbGF0ZWQgcmVnaXN0ZXJzIGFuZCByaW5nIHdoZW4gdHhfdGltZW91dCBoYXBwZW5zIik7CiAKIE1PRFVMRV9BVVRIT1IoIk1hbmZyZWQgU3ByYXVsIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlJldmVyc2UgRW5naW5lZXJlZCBuRm9yY2UgZXRoZXJuZXQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2tpLXNlbWkvcGNoX2diZS9wY2hfZ2JlX2V0aHRvb2wuYwppbmRleCA4YzgwMjcxLi5hYzRlNzJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9ldGh0b29sLmMKQEAgLTE2MSwxMCArMTYxLDEwIEBACiB7CiAJc3RydWN0IHBjaF9nYmVfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKLQlzdHJjcHkoZHJ2aW5mby0+ZHJpdmVyLCBLQlVJTERfTU9ETkFNRSk7Ci0Jc3RyY3B5KGRydmluZm8tPnZlcnNpb24sIHBjaF9kcml2ZXJfdmVyc2lvbik7Ci0Jc3RyY3B5KGRydmluZm8tPmZ3X3ZlcnNpb24sICJOL0EiKTsKLQlzdHJjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpKTsKKwlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgS0JVSUxEX01PRE5BTUUsIHNpemVvZihkcnZpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIHBjaF9kcml2ZXJfdmVyc2lvbiwgc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKKwkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CiAJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSBwY2hfZ2JlX2dldF9yZWdzX2xlbihuZXRkZXYpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvb2tpLXNlbWkvcGNoX2diZS9wY2hfZ2JlX21haW4uYwppbmRleCA0ODQwNmNhLi45NjRlOWMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9va2ktc2VtaS9wY2hfZ2JlL3BjaF9nYmVfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L29raS1zZW1pL3BjaF9nYmUvcGNoX2diZV9tYWluLmMKQEAgLTIxMDksMTAgKzIxMDksMTEgQEAKICAqIFJldHVybnMKICAqCTA6CQlIVyBzdGF0ZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseQogICovCi1zdGF0aWMgaW50IHBjaF9nYmVfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBpbnQgcGNoX2diZV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgcGNoX2diZV9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MzIgY2hhbmdlZCA9IGZlYXR1cmVzIF4gbmV0ZGV2LT5mZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdCBjaGFuZ2VkID0gZmVhdHVyZXMgXiBuZXRkZXYtPmZlYXR1cmVzOwogCiAJaWYgKCEoY2hhbmdlZCAmIE5FVElGX0ZfUlhDU1VNKSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9wYXNlbWkvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9wYXNlbWkvTWFrZWZpbGUKaW5kZXggMDVkYjU0My4uOTA0OTdmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcGFzZW1pL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Bhc2VtaS9NYWtlZmlsZQpAQCAtMiw0ICsyLDUgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBBIFNlbWkgbmV0d29yayBkZXZpY2UgZHJpdmVycy4KICMKIAotb2JqLSQoQ09ORklHX1BBU0VNSV9NQUMpICs9IHBhc2VtaV9tYWMubyBwYXNlbWlfbWFjX2V0aHRvb2wubworb2JqLSQoQ09ORklHX1BBU0VNSV9NQUMpICs9IHBhc2VtaV9tYWNfZHJpdmVyLm8KK3Bhc2VtaV9tYWNfZHJpdmVyLW9ianMgOj0gcGFzZW1pX21hYy5vIHBhc2VtaV9tYWNfZXRodG9vbC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvbmV0eGVuL25ldHhlbl9uaWNfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL25ldHhlbi9uZXR4ZW5fbmljX2V0aHRvb2wuYwppbmRleCBlMDllYTgzLi44YTM3MTk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvbmV0eGVuL25ldHhlbl9uaWNfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9uZXR4ZW4vbmV0eGVuX25pY19ldGh0b29sLmMKQEAgLTgzLDE0ICs4MywxOCBAQAogCXUzMiBmd19taW5vciA9IDA7CiAJdTMyIGZ3X2J1aWxkID0gMDsKIAotCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLCAzMik7Ci0Jc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBORVRYRU5fTklDX0xJTlVYX1ZFUlNJT05JRCwgMzIpOworCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCBuZXR4ZW5fbmljX2RyaXZlcl9uYW1lLAorCQlzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShkcnZpbmZvLT52ZXJzaW9uLCBORVRYRU5fTklDX0xJTlVYX1ZFUlNJT05JRCwKKwkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKIAlmd19tYWpvciA9IE5YUkQzMihhZGFwdGVyLCBORVRYRU5fRldfVkVSU0lPTl9NQUpPUik7CiAJZndfbWlub3IgPSBOWFJEMzIoYWRhcHRlciwgTkVUWEVOX0ZXX1ZFUlNJT05fTUlOT1IpOwogCWZ3X2J1aWxkID0gTlhSRDMyKGFkYXB0ZXIsIE5FVFhFTl9GV19WRVJTSU9OX1NVQik7Ci0Jc3ByaW50ZihkcnZpbmZvLT5md192ZXJzaW9uLCAiJWQuJWQuJWQiLCBmd19tYWpvciwgZndfbWlub3IsIGZ3X2J1aWxkKTsKKwlzbnByaW50ZihkcnZpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbiksCisJCSIlZC4lZC4lZCIsIGZ3X21ham9yLCBmd19taW5vciwgZndfYnVpbGQpOwogCi0Jc3RybmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoYWRhcHRlci0+cGRldiksIDMyKTsKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKKwkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CiAJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSBORVRYRU5fTklDX1JFR1NfTEVOOwogCWRydmluZm8tPmVlZHVtcF9sZW4gPSBuZXR4ZW5fbmljX2dldF9lZXByb21fbGVuKGRldik7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL25ldHhlbi9uZXR4ZW5fbmljX21haW4uYwppbmRleCA4Y2YzMTczLi43ZGQ5YTRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvbmV0eGVuL25ldHhlbl9uaWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9uZXR4ZW4vbmV0eGVuX25pY19tYWluLmMKQEAgLTU0NCw3ICs1NDQsOCBAQAogCWFkYXB0ZXItPnNldF9tdWx0aShkZXYpOwogfQogCi1zdGF0aWMgdTMyIG5ldHhlbl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IG5ldHhlbl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlpZiAoIShmZWF0dXJlcyAmIE5FVElGX0ZfUlhDU1VNKSkgewogCQluZXRkZXZfaW5mbyhkZXYsICJkaXNhYmxpbmcgTFJPIGFzIFJYQ1NVTSBpcyBvZmZcbiIpOwpAQCAtNTU1LDcgKzU1Niw4IEBACiAJcmV0dXJuIGZlYXR1cmVzOwogfQogCi1zdGF0aWMgaW50IG5ldHhlbl9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIGludCBuZXR4ZW5fc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IG5ldHhlbl9hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgaHdfbHJvOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsYTN4eHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGEzeHh4LmMKaW5kZXggYTRiZGZmNC4uNzkzMTUzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsYTN4eHguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxhM3h4eC5jCkBAIC0xNzM1LDEwICsxNzM1LDExIEBACiAJCQkgICBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICpkcnZpbmZvKQogewogCXN0cnVjdCBxbDNfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBxbDN4eHhfZHJpdmVyX25hbWUsIDMyKTsKLQlzdHJuY3B5KGRydmluZm8tPnZlcnNpb24sIHFsM3h4eF9kcml2ZXJfdmVyc2lvbiwgMzIpOwotCXN0cm5jcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIk4vQSIsIDMyKTsKLQlzdHJuY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShxZGV2LT5wZGV2KSwgMzIpOworCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCBxbDN4eHhfZHJpdmVyX25hbWUsIHNpemVvZihkcnZpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGRydmluZm8tPnZlcnNpb24sIHFsM3h4eF9kcml2ZXJfdmVyc2lvbiwKKwkJc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShxZGV2LT5wZGV2KSwKKwkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CiAJZHJ2aW5mby0+cmVnZHVtcF9sZW4gPSAwOwogCWRydmluZm8tPmVlZHVtcF9sZW4gPSAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljLmgKaW5kZXggN2VkNTNkYi4uNjA5NzZmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWMuaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pYy5oCkBAIC0xNDY2LDggKzE0NjYsOSBAQAogCiBpbnQgcWxjbmljX2Z3X2NtZF9zZXRfbXR1KHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgaW50IG10dSk7CiBpbnQgcWxjbmljX2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpOwotdTMyIHFsY25pY19maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKTsKLWludCBxbGNuaWNfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcyk7CituZXRkZXZfZmVhdHVyZXNfdCBxbGNuaWNfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOworaW50IHFsY25pY19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOwogaW50IHFsY25pY19jb25maWdfaHdfbHJvKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciwgaW50IGVuYWJsZSk7CiBpbnQgcWxjbmljX2NvbmZpZ19icmlkZ2VkX21vZGUoc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyLCB1MzIgZW5hYmxlKTsKIGludCBxbGNuaWNfc2VuZF9scm9fY2xlYW51cChzdHJ1Y3QgcWxjbmljX2FkYXB0ZXIgKmFkYXB0ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfZXRodG9vbC5jCmluZGV4IDhhYTFjNmUuLmNjMjI4Y2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19ldGh0b29sLmMKQEAgLTE0MCwxMSArMTQwLDE0IEBACiAJZndfbWFqb3IgPSBRTENSRDMyKGFkYXB0ZXIsIFFMQ05JQ19GV19WRVJTSU9OX01BSk9SKTsKIAlmd19taW5vciA9IFFMQ1JEMzIoYWRhcHRlciwgUUxDTklDX0ZXX1ZFUlNJT05fTUlOT1IpOwogCWZ3X2J1aWxkID0gUUxDUkQzMihhZGFwdGVyLCBRTENOSUNfRldfVkVSU0lPTl9TVUIpOwotCXNwcmludGYoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIiVkLiVkLiVkIiwgZndfbWFqb3IsIGZ3X21pbm9yLCBmd19idWlsZCk7CisJc25wcmludGYoZHJ2aW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGRydmluZm8tPmZ3X3ZlcnNpb24pLAorCQkiJWQuJWQuJWQiLCBmd19tYWpvciwgZndfbWlub3IsIGZ3X2J1aWxkKTsKIAotCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLCAzMik7Ci0Jc3RybGNweShkcnZpbmZvLT5kcml2ZXIsIHFsY25pY19kcml2ZXJfbmFtZSwgMzIpOwotCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgUUxDTklDX0xJTlVYX1ZFUlNJT05JRCwgMzIpOworCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGFkYXB0ZXItPnBkZXYpLAorCQlzaXplb2YoZHJ2aW5mby0+YnVzX2luZm8pKTsKKwlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgcWxjbmljX2RyaXZlcl9uYW1lLCBzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShkcnZpbmZvLT52ZXJzaW9uLCBRTENOSUNfTElOVVhfVkVSU0lPTklELAorCQlzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOwogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19ody5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfaHcuYwppbmRleCBiY2I4MWU0Li5iNTI4ZTUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19ody5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX2h3LmMKQEAgLTgxNywxMiArODE3LDEzIEBACiB9CiAKIAotdTMyIHFsY25pY19maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQorbmV0ZGV2X2ZlYXR1cmVzX3QgcWxjbmljX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlpZiAoKGFkYXB0ZXItPmZsYWdzICYgUUxDTklDX0VTV0lUQ0hfRU5BQkxFRCkpIHsKLQkJdTMyIGNoYW5nZWQgPSBmZWF0dXJlcyBeIG5ldGRldi0+ZmVhdHVyZXM7CisJCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBmZWF0dXJlcyBeIG5ldGRldi0+ZmVhdHVyZXM7CiAJCWZlYXR1cmVzIF49IGNoYW5nZWQgJiAoTkVUSUZfRl9BTExfQ1NVTSB8IE5FVElGX0ZfUlhDU1VNKTsKIAl9CiAKQEAgLTgzMywxMCArODM0LDEwIEBACiB9CiAKIAotaW50IHFsY25pY19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKQoraW50IHFsY25pY19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHFsY25pY19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKLQl1MzIgY2hhbmdlZCA9IG5ldGRldi0+ZmVhdHVyZXMgXiBmZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdCBjaGFuZ2VkID0gbmV0ZGV2LT5mZWF0dXJlcyBeIGZlYXR1cmVzOwogCWludCBod19scm8gPSAoZmVhdHVyZXMgJiBORVRJRl9GX0xSTykgPyBRTENOSUNfTFJPX0VOQUJMRUQgOiAwOwogCiAJaWYgKCEoY2hhbmdlZCAmIE5FVElGX0ZfTFJPKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGNuaWMvcWxjbmljX21haW4uYwppbmRleCAwYmQxNjM4Li42OWI4ZTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxjbmljL3FsY25pY19tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsY25pYy9xbGNuaWNfbWFpbi5jCkBAIC05Nyw4ICs5Nyw4IEBACiBzdGF0aWMgaW50IHFsY25pY3ZmX3N0YXJ0X2Zpcm13YXJlKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqKTsKIHN0YXRpYyB2b2lkIHFsY25pY19zZXRfbmV0ZGV2X2ZlYXR1cmVzKHN0cnVjdCBxbGNuaWNfYWRhcHRlciAqLAogCQkJCXN0cnVjdCBxbGNuaWNfZXN3X2Z1bmNfY2ZnICopOwotc3RhdGljIHZvaWQgcWxjbmljX3ZsYW5fcnhfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNik7Ci1zdGF0aWMgdm9pZCBxbGNuaWNfdmxhbl9yeF9kZWwoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTE2KTsKK3N0YXRpYyBpbnQgcWxjbmljX3ZsYW5fcnhfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICosIHUxNik7CitzdGF0aWMgaW50IHFsY25pY192bGFuX3J4X2RlbChzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MTYpOwogCiAvKiAgUENJIERldmljZSBJRCBUYWJsZSAgKi8KICNkZWZpbmUgRU5UUlkoZGV2aWNlKSBcCkBAIC03MzUsMjAgKzczNSwyMiBAQAogCQlhZGFwdGVyLT5wdmlkID0gMDsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIHFsY25pY192bGFuX3J4X2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc2V0X2JpdCh2aWQsIGFkYXB0ZXItPnZsYW5zKTsKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIHFsY25pY192bGFuX3J4X2RlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBxbGNuaWNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlxbGNuaWNfcmVzdG9yZV9pbmRldl9hZGRyKG5ldGRldiwgTkVUREVWX0RPV04pOwogCWNsZWFyX2JpdCh2aWQsIGFkYXB0ZXItPnZsYW5zKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTc5Miw3ICs3OTQsNyBAQAogCQlzdHJ1Y3QgcWxjbmljX2Vzd19mdW5jX2NmZyAqZXN3X2NmZykKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gYWRhcHRlci0+bmV0ZGV2OwotCXVuc2lnbmVkIGxvbmcgZmVhdHVyZXMsIHZsYW5fZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMsIHZsYW5fZmVhdHVyZXM7CiAKIAlmZWF0dXJlcyA9IChORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9SWENTVU0gfAogCQkJTkVUSUZfRl9JUFY2X0NTVU0gfCBORVRJRl9GX0dSTyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxnZS9xbGdlLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxnZS9xbGdlLmgKaW5kZXggODczMWY3OS4uYjg0NzhhYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcWxvZ2ljL3FsZ2UvcWxnZS5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2UuaApAQCAtNTgsMTAgKzU4LDggQEAKIAogCiAjZGVmaW5lIFRYX0RFU0NfUEVSX0lPQ0IgOAotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGZyYWdzIHdlIGhhbmRsZSBpcyBiYXNlZAotICogb24gUEFHRV9TSVpFLi4uCi0gKi8KLSNpZiAoUEFHRV9TSElGVCA9PSAxMikgfHwgKFBBR0VfU0hJRlQgPT0gMTMpCS8qIDRrICYgOGsgcGFnZXMgKi8KKworI2lmICgoTUFYX1NLQl9GUkFHUyAtIFRYX0RFU0NfUEVSX0lPQ0IpICsgMikgPiAwCiAjZGVmaW5lIFRYX0RFU0NfUEVSX09BTCAoKE1BWF9TS0JfRlJBR1MgLSBUWF9ERVNDX1BFUl9JT0NCKSArIDIpCiAjZWxzZSAvKiBhbGwgb3RoZXIgcGFnZSBzaXplcyAqLwogI2RlZmluZSBUWF9ERVNDX1BFUl9PQUwgMApAQCAtMTM1Myw3ICsxMzUxLDcgQEAKIAlzdHJ1Y3Qgb2JfbWFjX2lvY2JfcmVxICpxdWV1ZV9lbnRyeTsKIAl1MzIgaW5kZXg7CiAJc3RydWN0IG9hbCBvYWw7Ci0Jc3RydWN0IG1hcF9saXN0IG1hcFtNQVhfU0tCX0ZSQUdTICsgMV07CisJc3RydWN0IG1hcF9saXN0IG1hcFtNQVhfU0tCX0ZSQUdTICsgMl07CiAJaW50IG1hcF9jbnQ7CiAJc3RydWN0IHR4X3JpbmdfZGVzYyAqbmV4dDsKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxnZS9xbGdlX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfZXRodG9vbC5jCmluZGV4IDliNjdiZmUuLjhlMmMyYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfZXRodG9vbC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfZXRodG9vbC5jCkBAIC0zNjYsMTMgKzM2NiwxNiBAQAogCQkJICAgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqZHJ2aW5mbykKIHsKIAlzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXN0cm5jcHkoZHJ2aW5mby0+ZHJpdmVyLCBxbGdlX2RyaXZlcl9uYW1lLCAzMik7Ci0Jc3RybmNweShkcnZpbmZvLT52ZXJzaW9uLCBxbGdlX2RyaXZlcl92ZXJzaW9uLCAzMik7Ci0Jc25wcmludGYoZHJ2aW5mby0+ZndfdmVyc2lvbiwgMzIsICJ2JWQuJWQuJWQiLAorCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCBxbGdlX2RyaXZlcl9uYW1lLCBzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShkcnZpbmZvLT52ZXJzaW9uLCBxbGdlX2RyaXZlcl92ZXJzaW9uLAorCQlzaXplb2YoZHJ2aW5mby0+dmVyc2lvbikpOworCXNucHJpbnRmKGRydmluZm8tPmZ3X3ZlcnNpb24sIHNpemVvZihkcnZpbmZvLT5md192ZXJzaW9uKSwKKwkJICJ2JWQuJWQuJWQiLAogCQkgKHFkZXYtPmZ3X3Jldl9pZCAmIDB4MDBmZjAwMDApID4+IDE2LAogCQkgKHFkZXYtPmZ3X3Jldl9pZCAmIDB4MDAwMGZmMDApID4+IDgsCiAJCSAocWRldi0+ZndfcmV2X2lkICYgMHgwMDAwMDBmZikpOwotCXN0cm5jcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHFkZXYtPnBkZXYpLCAzMik7CisJc3RybGNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocWRldi0+cGRldiksCisJCXNpemVvZihkcnZpbmZvLT5idXNfaW5mbykpOwogCWRydmluZm8tPm5fc3RhdHMgPSAwOwogCWRydmluZm8tPnRlc3RpbmZvX2xlbiA9IDA7CiAJaWYgKCF0ZXN0X2JpdChRTF9GUkNfQ09SRURVTVAsICZxZGV2LT5mbGFncykpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9xbG9naWMvcWxnZS9xbGdlX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfbWFpbi5jCmluZGV4IGM5MmFmY2QuLmI1NDg5ODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Fsb2dpYy9xbGdlL3FsZ2VfbWFpbi5jCkBAIC0yMzA3LDcgKzIzMDcsNyBAQAogCXJldHVybiB3b3JrX2RvbmU7CiB9CiAKLXN0YXRpYyB2b2lkIHFsZ2Vfdmxhbl9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgdm9pZCBxbGdlX3ZsYW5fbW9kZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIApAQCAtMjMyMyw3ICsyMzIzLDggQEAKIAl9CiB9CiAKLXN0YXRpYyB1MzIgcWxnZV9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBxbGdlX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAkvKgogCSAqIFNpbmNlIHRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHJ4L3R4IHZsYW4gYWNjZWwKQEAgLTIzMzcsOSArMjMzOCwxMCBAQAogCXJldHVybiBmZWF0dXJlczsKIH0KIAotc3RhdGljIGludCBxbGdlX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIGludCBxbGdlX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKLQl1MzIgY2hhbmdlZCA9IG5kZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgY2hhbmdlZCA9IG5kZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CiAKIAlpZiAoY2hhbmdlZCAmIE5FVElGX0ZfSFdfVkxBTl9SWCkKIAkJcWxnZV92bGFuX21vZGUobmRldiwgZmVhdHVyZXMpOwpAQCAtMjM0Nyw1NiArMjM0OSw2NiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBfX3FsZ2Vfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MTYgdmlkKQorc3RhdGljIGludCBfX3FsZ2Vfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBxbF9hZGFwdGVyICpxZGV2LCB1MTYgdmlkKQogewogCXUzMiBlbmFibGVfYml0ID0gTUFDX0FERFJfRTsKKwlpbnQgZXJyOwogCi0JaWYgKHFsX3NldF9tYWNfYWRkcl9yZWcKLQkgICAgKHFkZXYsICh1OCAqKSAmZW5hYmxlX2JpdCwgTUFDX0FERFJfVFlQRV9WTEFOLCB2aWQpKSB7CisJZXJyID0gcWxfc2V0X21hY19hZGRyX3JlZyhxZGV2LCAodTggKikgJmVuYWJsZV9iaXQsCisJCQkJICBNQUNfQUREUl9UWVBFX1ZMQU4sIHZpZCk7CisJaWYgKGVycikKIAkJbmV0aWZfZXJyKHFkZXYsIGlmdXAsIHFkZXYtPm5kZXYsCiAJCQkgICJGYWlsZWQgdG8gaW5pdCB2bGFuIGFkZHJlc3MuXG4iKTsKLQl9CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgcWxnZV92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUxNiB2aWQpCitzdGF0aWMgaW50IHFsZ2Vfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCBxbF9hZGFwdGVyICpxZGV2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJaW50IHN0YXR1czsKKwlpbnQgZXJyOwogCiAJc3RhdHVzID0gcWxfc2VtX3NwaW5sb2NrKHFkZXYsIFNFTV9NQUNfQUREUl9NQVNLKTsKIAlpZiAoc3RhdHVzKQotCQlyZXR1cm47CisJCXJldHVybiBzdGF0dXM7CiAKLQlfX3FsZ2Vfdmxhbl9yeF9hZGRfdmlkKHFkZXYsIHZpZCk7CisJZXJyID0gX19xbGdlX3ZsYW5fcnhfYWRkX3ZpZChxZGV2LCB2aWQpOwogCXNldF9iaXQodmlkLCBxZGV2LT5hY3RpdmVfdmxhbnMpOwogCiAJcWxfc2VtX3VubG9jayhxZGV2LCBTRU1fTUFDX0FERFJfTUFTSyk7CisKKwlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgdm9pZCBfX3FsZ2Vfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldiwgdTE2IHZpZCkKK3N0YXRpYyBpbnQgX19xbGdlX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYsIHUxNiB2aWQpCiB7CiAJdTMyIGVuYWJsZV9iaXQgPSAwOworCWludCBlcnI7CiAKLQlpZiAocWxfc2V0X21hY19hZGRyX3JlZwotCSAgICAocWRldiwgKHU4ICopICZlbmFibGVfYml0LCBNQUNfQUREUl9UWVBFX1ZMQU4sIHZpZCkpIHsKKwllcnIgPSBxbF9zZXRfbWFjX2FkZHJfcmVnKHFkZXYsICh1OCAqKSAmZW5hYmxlX2JpdCwKKwkJCQkgIE1BQ19BRERSX1RZUEVfVkxBTiwgdmlkKTsKKwlpZiAoZXJyKQogCQluZXRpZl9lcnIocWRldiwgaWZ1cCwgcWRldi0+bmRldiwKIAkJCSAgIkZhaWxlZCB0byBjbGVhciB2bGFuIGFkZHJlc3MuXG4iKTsKLQl9CisJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgcWxnZV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCB1MTYgdmlkKQorc3RhdGljIGludCBxbGdlX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHUxNiB2aWQpCiB7CiAJc3RydWN0IHFsX2FkYXB0ZXIgKnFkZXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlpbnQgc3RhdHVzOworCWludCBlcnI7CiAKIAlzdGF0dXMgPSBxbF9zZW1fc3BpbmxvY2socWRldiwgU0VNX01BQ19BRERSX01BU0spOwogCWlmIChzdGF0dXMpCi0JCXJldHVybjsKKwkJcmV0dXJuIHN0YXR1czsKIAotCV9fcWxnZV92bGFuX3J4X2tpbGxfdmlkKHFkZXYsIHZpZCk7CisJZXJyID0gX19xbGdlX3ZsYW5fcnhfa2lsbF92aWQocWRldiwgdmlkKTsKIAljbGVhcl9iaXQodmlkLCBxZGV2LT5hY3RpdmVfdmxhbnMpOwogCiAJcWxfc2VtX3VubG9jayhxZGV2LCBTRU1fTUFDX0FERFJfTUFTSyk7CisKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgdm9pZCBxbGdlX3Jlc3RvcmVfdmxhbihzdHJ1Y3QgcWxfYWRhcHRlciAqcWRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JkYy9yNjA0MC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmRjL3I2MDQwLmMKaW5kZXggNGJmNjhjZi4uODdhYTQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmRjL3I2MDQwLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmRjL3I2MDQwLmMKQEAgLTUyLDEyICs1Miw2IEBACiAjZGVmaW5lIERSVl9WRVJTSU9OCSIwLjI4IgogI2RlZmluZSBEUlZfUkVMREFURQkiMDdPY3QyMDExIgogCi0vKiBQSFkgQ0hJUCBBZGRyZXNzICovCi0jZGVmaW5lIFBIWTFfQUREUgkxCS8qIEZvciBNQUMxICovCi0jZGVmaW5lIFBIWTJfQUREUgkzCS8qIEZvciBNQUMyICovCi0jZGVmaW5lIFBIWV9NT0RFCTB4MzEwMAkvKiBQSFkgQ0hJUCBSZWdpc3RlciAwICovCi0jZGVmaW5lIFBIWV9DQVAJCTB4MDFFMQkvKiBQSFkgQ0hJUCBSZWdpc3RlciA0ICovCi0KIC8qIFRpbWUgaW4gamlmZmllcyBiZWZvcmUgY29uY2x1ZGluZyB0aGUgdHJhbnNtaXR0ZXIgaXMgaHVuZy4gKi8KICNkZWZpbmUgVFhfVElNRU9VVAkoNjAwMCAqIEhaIC8gMTAwMCkKIApAQCAtNjksOCArNjMsMTEgQEAKIAogLyogTUFDIHJlZ2lzdGVycyAqLwogI2RlZmluZSBNQ1IwCQkweDAwCS8qIENvbnRyb2wgcmVnaXN0ZXIgMCAqLworI2RlZmluZSAgTUNSMF9SQ1ZFTgkweDAwMDIJLyogUmVjZWl2ZSBlbmFibGUgKi8KICNkZWZpbmUgIE1DUjBfUFJPTUlTQwkweDAwMjAJLyogUHJvbWlzY3VvdXMgbW9kZSAqLwogI2RlZmluZSAgTUNSMF9IQVNIX0VOCTB4MDEwMAkvKiBFbmFibGUgbXVsdGljYXN0IGhhc2ggdGFibGUgZnVuY3Rpb24gKi8KKyNkZWZpbmUgIE1DUjBfWE1URU4JMHgxMDAwCS8qIFRyYW5zbWlzc2lvbiBlbmFibGUgKi8KKyNkZWZpbmUgIE1DUjBfRkQJMHg4MDAwCS8qIEZ1bGwvSGFsZiBkdXBsZXggKi8KICNkZWZpbmUgTUNSMQkJMHgwNAkvKiBDb250cm9sIHJlZ2lzdGVyIDEgKi8KICNkZWZpbmUgIE1BQ19SU1QJMHgwMDAxCS8qIFJlc2V0IHRoZSBNQUMgKi8KICNkZWZpbmUgTUJDUgkJMHgwOAkvKiBCdXMgY29udHJvbCAqLwpAQCAtMTI5LDYgKzEyNiw3IEBACiAjZGVmaW5lIFBIWV9DQwkJMHg4OAkvKiBQSFkgc3RhdHVzIGNoYW5nZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyICovCiAjZGVmaW5lIFBIWV9TVAkJMHg4QQkvKiBQSFkgc3RhdHVzIHJlZ2lzdGVyICovCiAjZGVmaW5lIE1BQ19TTQkJMHhBQwkvKiBNQUMgc3RhdHVzIG1hY2hpbmUgKi8KKyNkZWZpbmUgIE1BQ19TTV9SU1QJMHgwMDAyCS8qIE1BQyBzdGF0dXMgbWFjaGluZSByZXNldCAqLwogI2RlZmluZSBNQUNfSUQJCTB4QkUJLyogSWRlbnRpZmllciByZWdpc3RlciAqLwogCiAjZGVmaW5lIFRYX0RDTlQJCTB4ODAJLyogVFggZGVzY3JpcHRvciBjb3VudCAqLwpAQCAtMTU0LDkgKzE1Miw2IEBACiAjZGVmaW5lIERTQ19SWF9NSURIX0hJVAkweDAwMDQJLyogUlggTUlEIHRhYmxlIGhpdCAobm8gZXJyb3IpICovCiAjZGVmaW5lIERTQ19SWF9JRFhfTUlEX01BU0sgMwkvKiBSWCBtYXNrIGZvciB0aGUgaW5kZXggb2YgbWF0Y2hlZCBNSUR4ICovCiAKLS8qIFBIWSBzZXR0aW5ncyAqLwotI2RlZmluZSBJQ1BMVVNfUEhZX0lECTB4MDI0MwotCiBNT0RVTEVfQVVUSE9SKCJTdGVuIFdhbmcgPHN0ZW4ud2FuZ0ByZGMuY29tLnR3PiwiCiAJIkRhbmllbCBHaW1wZWxldmljaCA8ZGFuaWVsQGdpbXBlbGV2aWNoLnNhbi1mcmFuY2lzY28uY2EudXM+LCIKIAkiRmxvcmlhbiBGYWluZWxsaSA8ZmxvcmlhbkBvcGVud3J0Lm9yZz4iKTsKQEAgLTE3OCw3ICsxNzMsNyBAQAogCXN0cnVjdCByNjA0MF9kZXNjcmlwdG9yICp2bmRlc2NwOwkvKiAxNC0xNyAqLwogCXN0cnVjdCBza19idWZmICpza2JfcHRyOwkvKiAxOC0xQiAqLwogCXUzMglyZXYyOwkJCS8qIDFDLTFGICovCi19IF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7Cit9IF9fYWxpZ25lZCgzMik7CiAKIHN0cnVjdCByNjA0MF9wcml2YXRlIHsKIAlzcGlubG9ja190IGxvY2s7CQkvKiBkcml2ZXIgbG9jayAqLwpAQCAtMTkxLDcgKzE4Niw3IEBACiAJc3RydWN0IHI2MDQwX2Rlc2NyaXB0b3IgKnR4X3Jpbmc7CiAJZG1hX2FkZHJfdCByeF9yaW5nX2RtYTsKIAlkbWFfYWRkcl90IHR4X3JpbmdfZG1hOwotCXUxNgl0eF9mcmVlX2Rlc2MsIHBoeV9hZGRyOworCXUxNgl0eF9mcmVlX2Rlc2M7CiAJdTE2CW1jcjAsIG1jcjE7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbWlpX2J1cyAqbWlpX2J1czsKQEAgLTIwNiw4ICsyMDEsNiBAQAogCSI6IFJEQyBSNjA0MCBOQVBJIG5ldCBkcml2ZXIsIgogCSJ2ZXJzaW9uICJEUlZfVkVSU0lPTiAiICgiIERSVl9SRUxEQVRFICIpIjsKIAotc3RhdGljIGludCBwaHlfdGFibGVbXSA9IHsgUEhZMV9BRERSLCBQSFkyX0FERFIgfTsKLQogLyogUmVhZCBhIHdvcmQgZGF0YSBmcm9tIFBIWSBDaGlwICovCiBzdGF0aWMgaW50IHI2MDQwX3BoeV9yZWFkKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgcGh5X2FkZHIsIGludCByZWcpCiB7CkBAIC0zNzksMTEgKzM3MiwxMSBAQAogCWlvd3JpdGUxNihNQUNfUlNULCBpb2FkZHIgKyBNQ1IxKTsKIAl3aGlsZSAobGltaXQtLSkgewogCQljbWQgPSBpb3JlYWQxNihpb2FkZHIgKyBNQ1IxKTsKLQkJaWYgKGNtZCAmIDB4MSkKKwkJaWYgKGNtZCAmIE1BQ19SU1QpCiAJCQlicmVhazsKIAl9CiAJLyogUmVzZXQgaW50ZXJuYWwgc3RhdGUgbWFjaGluZSAqLwotCWlvd3JpdGUxNigyLCBpb2FkZHIgKyBNQUNfU00pOworCWlvd3JpdGUxNihNQUNfU01fUlNULCBpb2FkZHIgKyBNQUNfU00pOwogCWlvd3JpdGUxNigwLCBpb2FkZHIgKyBNQUNfU00pOwogCW1kZWxheSg1KTsKIApAQCAtNDA5LDcgKzQwMiw3IEBACiAJaW93cml0ZTE2KElOVF9NQVNLLCBpb2FkZHIgKyBNSUVSKTsKIAogCS8qIEVuYWJsZSBUWCBhbmQgUlggKi8KLQlpb3dyaXRlMTYobHAtPm1jcjAgfCAweDAwMDIsIGlvYWRkcik7CisJaW93cml0ZTE2KGxwLT5tY3IwIHwgTUNSMF9SQ1ZFTiwgaW9hZGRyKTsKIAogCS8qIExldCBUWCBwb2xsIHRoZSBkZXNjcmlwdG9ycwogCSAqIHdlIG1heSBnb3QgY2FsbGVkIGJ5IHI2MDQwX3R4X3RpbWVvdXQgd2hpY2ggaGFzIGxlZnQKQEAgLTQ2MSw3ICs0NTQsNyBAQAogCWlvd3JpdGUxNihNQUNfUlNULCBpb2FkZHIgKyBNQ1IxKTsJLyogUmVzZXQgUkRDIE1BQyAqLwogCXdoaWxlIChsaW1pdC0tKSB7CiAJCWNtZCA9IGlvcmVhZDE2KGlvYWRkciArIE1DUjEpOwotCQlpZiAoY21kICYgMHgxKQorCQlpZiAoY21kICYgTUFDX1JTVCkKIAkJCWJyZWFrOwogCX0KIApAQCAtNzQyLDkgKzczNSwxMCBAQAogCXZvaWQgX19pb21lbSAqaW9hZGRyID0gbHAtPmJhc2U7CiAJdTE2ICphZHJwOwogCi0JLyogTUFDIG9wZXJhdGlvbiByZWdpc3RlciAqLwotCWlvd3JpdGUxNigweDAxLCBpb2FkZHIgKyBNQ1IxKTsgLyogUmVzZXQgTUFDICovCi0JaW93cml0ZTE2KDIsIGlvYWRkciArIE1BQ19TTSk7IC8qIFJlc2V0IGludGVybmFsIHN0YXRlIG1hY2hpbmUgKi8KKwkvKiBSZXNldCBNQUMgKi8KKwlpb3dyaXRlMTYoTUFDX1JTVCwgaW9hZGRyICsgTUNSMSk7CisJLyogUmVzZXQgaW50ZXJuYWwgc3RhdGUgbWFjaGluZSAqLworCWlvd3JpdGUxNihNQUNfU01fUlNULCBpb2FkZHIgKyBNQUNfU00pOwogCWlvd3JpdGUxNigwLCBpb2FkZHIgKyBNQUNfU00pOwogCW1kZWxheSg1KTsKIApAQCAtMTAxMyw3ICsxMDA3LDcgQEAKIAogCS8qIHJlZmxlY3QgZHVwbGV4IGNoYW5nZSAqLwogCWlmIChwaHlkZXYtPmxpbmsgJiYgKGxwLT5vbGRfZHVwbGV4ICE9IHBoeWRldi0+ZHVwbGV4KSkgewotCQlscC0+bWNyMCB8PSAocGh5ZGV2LT5kdXBsZXggPT0gRFVQTEVYX0ZVTEwgPyAweDgwMDAgOiAwKTsKKwkJbHAtPm1jcjAgfD0gKHBoeWRldi0+ZHVwbGV4ID09IERVUExFWF9GVUxMID8gTUNSMF9GRCA6IDApOwogCQlpb3dyaXRlMTYobHAtPm1jcjAsIGlvYWRkcik7CiAKIAkJc3RhdHVzX2NoYW5nZWQgPSAxOwpAQCAtMTE2Niw4ICsxMTYwLDcgQEAKIAlscC0+ZGV2ID0gZGV2OwogCiAJLyogSW5pdCBSREMgcHJpdmF0ZSBkYXRhICovCi0JbHAtPm1jcjAgPSAweDEwMDI7Ci0JbHAtPnBoeV9hZGRyID0gcGh5X3RhYmxlW2NhcmRfaWR4XTsKKwlscC0+bWNyMCA9IE1DUjBfWE1URU4gfCBNQ1IwOwogCiAJLyogVGhlIFJEQy1zcGVjaWZpYyBlbnRyaWVzIGluIHRoZSBkZXZpY2Ugc3RydWN0dXJlLiAqLwogCWRldi0+bmV0ZGV2X29wcyA9ICZyNjA0MF9uZXRkZXZfb3BzOwpAQCAtMTE4OCw3ICsxMTgxLDggQEAKIAlscC0+bWlpX2J1cy0+d3JpdGUgPSByNjA0MF9tZGlvYnVzX3dyaXRlOwogCWxwLT5taWlfYnVzLT5yZXNldCA9IHI2MDQwX21kaW9idXNfcmVzZXQ7CiAJbHAtPm1paV9idXMtPm5hbWUgPSAicjYwNDBfZXRoX21paSI7Ci0Jc25wcmludGYobHAtPm1paV9idXMtPmlkLCBNSUlfQlVTX0lEX1NJWkUsICIleCIsIGNhcmRfaWR4KTsKKwlzbnByaW50ZihscC0+bWlpX2J1cy0+aWQsIE1JSV9CVVNfSURfU0laRSwgIiVzLSV4IiwKKwkJZGV2X25hbWUoJnBkZXYtPmRldiksIGNhcmRfaWR4KTsKIAlscC0+bWlpX2J1cy0+aXJxID0ga21hbGxvYyhzaXplb2YoaW50KSpQSFlfTUFYX0FERFIsIEdGUF9LRVJORUwpOwogCWlmICghbHAtPm1paV9idXMtPmlycSkgewogCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJtaWlfYnVzIGlycSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrLzgxMzljcC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay84MTM5Y3AuYwppbmRleCBlZTVkYTkyLi5jYzZiMzkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrLzgxMzljcC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvODEzOWNwLmMKQEAgLTg1OSw3ICs4NTksNiBAQAogCXN0cnVjdCBjcF9wcml2YXRlICpjcCA9IG5ldGRldl9wcml2KGRldik7CiAJdTMyIG1jX2ZpbHRlclsyXTsJLyogTXVsdGljYXN0IGhhc2ggZmlsdGVyICovCiAJaW50IHJ4X21vZGU7Ci0JdTMyIHRtcDsKIAogCS8qIE5vdGU6IGRvIG5vdCByZW9yZGVyLCBHQ0MgaXMgY2xldmVyIGFib3V0IGNvbW1vbiBzdGF0ZW1lbnRzLiAqLwogCWlmIChkZXYtPmZsYWdzICYgSUZGX1BST01JU0MpIHsKQEAgLTg4NiwxMSArODg1LDkgQEAKIAl9CiAKIAkvKiBXZSBjYW4gc2FmZWx5IHVwZGF0ZSB3aXRob3V0IHN0b3BwaW5nIHRoZSBjaGlwLiAqLwotCXRtcCA9IGNwX3J4X2NvbmZpZyB8IHJ4X21vZGU7Ci0JaWYgKGNwLT5yeF9jb25maWcgIT0gdG1wKSB7Ci0JCWNwdzMyX2YgKFJ4Q29uZmlnLCB0bXApOwotCQljcC0+cnhfY29uZmlnID0gdG1wOwotCX0KKwljcC0+cnhfY29uZmlnID0gY3BfcnhfY29uZmlnIHwgcnhfbW9kZTsKKwljcHczMl9mKFJ4Q29uZmlnLCBjcC0+cnhfY29uZmlnKTsKKwogCWNwdzMyX2YgKE1BUjAgKyAwLCBtY19maWx0ZXJbMF0pOwogCWNwdzMyX2YgKE1BUjAgKyA0LCBtY19maWx0ZXJbMV0pOwogfQpAQCAtMTMxOSw5ICsxMzE2LDkgQEAKIHsKIAlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0Jc3RyY3B5IChpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkgKGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKLQlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShjcC0+cGRldikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoY3AtPnBkZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIH0KIAogc3RhdGljIHZvaWQgY3BfZ2V0X3JpbmdwYXJhbShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtMTM5Miw3ICsxMzg5LDcgQEAKIAljcC0+bXNnX2VuYWJsZSA9IHZhbHVlOwogfQogCi1zdGF0aWMgaW50IGNwX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgaW50IGNwX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgY3BfcHJpdmF0ZSAqY3AgPSBuZXRkZXZfcHJpdihkZXYpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0xNTg5LDcgKzE1ODYsNyBAQAogICAgTm8gZXh0cmEgZGVsYXkgaXMgbmVlZGVkIHdpdGggMzNNaHogUENJLCBidXQgNjZNaHogbWF5IGNoYW5nZSB0aGlzLgogICovCiAKLSNkZWZpbmUgZWVwcm9tX2RlbGF5KCkJcmVhZGwoZWVfYWRkcikKKyNkZWZpbmUgZWVwcm9tX2RlbGF5KCkJcmVhZGIoZWVfYWRkcikKIAogLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCiAjZGVmaW5lIEVFX0VYVEVORF9DTUQJKDQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrLzgxMzl0b28uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvODEzOXRvby5jCmluZGV4IDRkNmIyNTQuLmE4Nzc5YmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvODEzOXRvby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvODEzOXRvby5jCkBAIC0xMTIyLDcgKzExMjIsNyBAQAogICAgTm8gZXh0cmEgZGVsYXkgaXMgbmVlZGVkIHdpdGggMzNNaHogUENJLCBidXQgNjZNaHogbWF5IGNoYW5nZSB0aGlzLgogICovCiAKLSNkZWZpbmUgZWVwcm9tX2RlbGF5KCkJKHZvaWQpUlRMX1IzMihDZmc5MzQ2KQorI2RlZmluZSBlZXByb21fZGVsYXkoKQkodm9pZClSVExfUjgoQ2ZnOTM0NikKIAogLyogVGhlIEVFUFJPTSBjb21tYW5kcyBpbmNsdWRlIHRoZSBhbHdheS1zZXQgbGVhZGluZyBiaXQuICovCiAjZGVmaW5lIEVFX1dSSVRFX0NNRAkoNSkKQEAgLTIzMzAsOSArMjMzMCw5IEBACiBzdGF0aWMgdm9pZCBydGw4MTM5X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IHJ0bDgxMzlfcHJpdmF0ZSAqdHAgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUodHAtPnBjaV9kZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHRwLT5wY2lfZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiAJaW5mby0+cmVnZHVtcF9sZW4gPSB0cC0+cmVnc19sZW47CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvcjgxNjkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlYWx0ZWsvcjgxNjkuYwppbmRleCA2ZjA2YWExLi43YTBjODAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZWFsdGVrL3I4MTY5LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVhbHRlay9yODE2OS5jCkBAIC02OSw5ICs2OSw2IEBACiAgICBUaGUgUlRMIGNoaXBzIHVzZSBhIDY0IGVsZW1lbnQgaGFzaCB0YWJsZSBiYXNlZCBvbiB0aGUgRXRoZXJuZXQgQ1JDLiAqLwogc3RhdGljIGNvbnN0IGludCBtdWx0aWNhc3RfZmlsdGVyX2xpbWl0ID0gMzI7CiAKLS8qIE1BQyBhZGRyZXNzIGxlbmd0aCAqLwotI2RlZmluZSBNQUNfQUREUl9MRU4JNgotCiAjZGVmaW5lIE1BWF9SRUFEX1JFUVVFU1RfU0hJRlQJMTIKICNkZWZpbmUgVFhfRE1BX0JVUlNUCTYJLyogTWF4aW11bSBQQ0kgYnVyc3QsICc2JyBpcyAxMDI0ICovCiAjZGVmaW5lIFNhZmVNdHUJCTB4MWMyMAkvKiAuLi4gYWN0dWFsbHkgbGlmZSBzdWNrcyBiZXlvbmQgfjdrICovCkBAIC00NzcsNyArNDc0LDYgQEAKIAkvKiBDb25maWcxIHJlZ2lzdGVyIHAuMjQgKi8KIAlMRURTMQkJPSAoMSA8PCA3KSwKIAlMRURTMAkJPSAoMSA8PCA2KSwKLQlNU0lFbmFibGUJPSAoMSA8PCA1KSwJLyogRW5hYmxlIE1lc3NhZ2UgU2lnbmFsZWQgSW50ZXJydXB0ICovCiAJU3BlZWRfZG93bgk9ICgxIDw8IDQpLAogCU1FTU1BUAkJPSAoMSA8PCAzKSwKIAlJT01BUAkJPSAoMSA8PCAyKSwKQEAgLTQ4NSw2ICs0ODEsNyBAQAogCVBNRW5hYmxlCT0gKDEgPDwgMCksCS8qIFBvd2VyIE1hbmFnZW1lbnQgRW5hYmxlICovCiAKIAkvKiBDb25maWcyIHJlZ2lzdGVyIHAuIDI1ICovCisJTVNJRW5hYmxlCT0gKDEgPDwgNSksCS8qIDgxNjkgb25seS4gUmVzZXJ2ZWQgaW4gdGhlIDgxNjguICovCiAJUENJX0Nsb2NrXzY2TUh6ID0gMHgwMSwKIAlQQ0lfQ2xvY2tfMzNNSHogPSAweDAwLAogCkBAIC0xMTgzLDExICsxMTgwLDEzIEBACiAJcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgdm9pZCBydGw4MTY5X2lycV9tYXNrX2FuZF9hY2sodm9pZCBfX2lvbWVtICppb2FkZHIpCitzdGF0aWMgdm9pZCBydGw4MTY5X2lycV9tYXNrX2FuZF9hY2soc3RydWN0IHJ0bDgxNjlfcHJpdmF0ZSAqdHApCiB7Ci0JUlRMX1cxNihJbnRyTWFzaywgMHgwMDAwKTsKKwl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CiAKLQlSVExfVzE2KEludHJTdGF0dXMsIDB4ZmZmZik7CisJUlRMX1cxNihJbnRyTWFzaywgMHgwMDAwKTsKKwlSVExfVzE2KEludHJTdGF0dXMsIHRwLT5pbnRyX2V2ZW50KTsKKwlSVExfUjgoQ2hpcENtZCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcnRsODE2OV90YmlfcmVzZXRfcGVuZGluZyhzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCkKQEAgLTE0MDQsMTIgKzE0MDMsMTMgQEAKIAlzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHJ0bF9mdyAqcnRsX2Z3ID0gdHAtPnJ0bF9mdzsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIE1PRFVMRU5BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBSVEw4MTY5X1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUodHAtPnBjaV9kZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgTU9EVUxFTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgUlRMODE2OV9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHRwLT5wY2lfZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiAJQlVJTERfQlVHX09OKHNpemVvZihpbmZvLT5md192ZXJzaW9uKSA8IHNpemVvZihydGxfZnctPnZlcnNpb24pKTsKLQlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgSVNfRVJSX09SX05VTEwocnRsX2Z3KSA/ICJOL0EiIDoKLQkgICAgICAgcnRsX2Z3LT52ZXJzaW9uKTsKKwlpZiAoIUlTX0VSUl9PUl9OVUxMKHJ0bF9mdykpCisJCXN0cmxjcHkoaW5mby0+ZndfdmVyc2lvbiwgcnRsX2Z3LT52ZXJzaW9uLAorCQkJc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pKTsKIH0KIAogc3RhdGljIGludCBydGw4MTY5X2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtMTU1Myw3ICsxNTUzLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdTMyIHJ0bDgxNjlfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBydGw4MTY5X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtMTU2Nyw3ICsxNTY4LDggQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLXN0YXRpYyBpbnQgcnRsODE2OV9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIGludCBydGw4MTY5X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CkBAIC0zNDI0LDIyICszNDI2LDI0IEBACiB9OwogCiAvKiBDZmc5MzQ2X1VubG9jayBhc3N1bWVkLiAqLwotc3RhdGljIHVuc2lnbmVkIHJ0bF90cnlfbXNpKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCB2b2lkIF9faW9tZW0gKmlvYWRkciwKK3N0YXRpYyB1bnNpZ25lZCBydGxfdHJ5X21zaShzdHJ1Y3QgcnRsODE2OV9wcml2YXRlICp0cCwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgcnRsX2NmZ19pbmZvICpjZmcpCiB7CisJdm9pZCBfX2lvbWVtICppb2FkZHIgPSB0cC0+bW1pb19hZGRyOwogCXVuc2lnbmVkIG1zaSA9IDA7CiAJdTggY2ZnMjsKIAogCWNmZzIgPSBSVExfUjgoQ29uZmlnMikgJiB+TVNJRW5hYmxlOwogCWlmIChjZmctPmZlYXR1cmVzICYgUlRMX0ZFQVRVUkVfTVNJKSB7Ci0JCWlmIChwY2lfZW5hYmxlX21zaShwZGV2KSkgewotCQkJZGV2X2luZm8oJnBkZXYtPmRldiwgIm5vIE1TSS4gQmFjayB0byBJTlR4LlxuIik7CisJCWlmIChwY2lfZW5hYmxlX21zaSh0cC0+cGNpX2RldikpIHsKKwkJCW5ldGlmX2luZm8odHAsIGh3LCB0cC0+ZGV2LCAibm8gTVNJLiBCYWNrIHRvIElOVHguXG4iKTsKIAkJfSBlbHNlIHsKIAkJCWNmZzIgfD0gTVNJRW5hYmxlOwogCQkJbXNpID0gUlRMX0ZFQVRVUkVfTVNJOwogCQl9CiAJfQotCVJUTF9XOChDb25maWcyLCBjZmcyKTsKKwlpZiAodHAtPm1hY192ZXJzaW9uIDw9IFJUTF9HSUdBX01BQ19WRVJfMDYpCisJCVJUTF9XOChDb25maWcyLCBjZmcyKTsKIAlyZXR1cm4gbXNpOwogfQogCkBAIC0zOTMzLDggKzM5MzcsNiBAQAogCQkJYnJlYWs7CiAJCXVkZWxheSgxMDApOwogCX0KLQotCXJ0bDgxNjlfaW5pdF9yaW5nX2luZGV4ZXModHApOwogfQogCiBzdGF0aWMgaW50IF9fZGV2aW5pdApAQCAtNDA3Nyw3ICs0MDc5LDcgQEAKIAkJdHAtPmZlYXR1cmVzIHw9IFJUTF9GRUFUVVJFX1dPTDsKIAlpZiAoKFJUTF9SOChDb25maWc1KSAmIChVV0YgfCBCV0YgfCBNV0YpKSAhPSAwKQogCQl0cC0+ZmVhdHVyZXMgfD0gUlRMX0ZFQVRVUkVfV09MOwotCXRwLT5mZWF0dXJlcyB8PSBydGxfdHJ5X21zaShwZGV2LCBpb2FkZHIsIGNmZyk7CisJdHAtPmZlYXR1cmVzIHw9IHJ0bF90cnlfbXNpKHRwLCBjZmcpOwogCVJUTF9XOChDZmc5MzQ2LCBDZmc5MzQ2X0xvY2spOwogCiAJaWYgKHJ0bF90YmlfZW5hYmxlZCh0cCkpIHsKQEAgLTQwOTksNyArNDEwMSw3IEBACiAJc3Bpbl9sb2NrX2luaXQoJnRwLT5sb2NrKTsKIAogCS8qIEdldCBNQUMgYWRkcmVzcyAqLwotCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKIAkJZGV2LT5kZXZfYWRkcltpXSA9IFJUTF9SOChNQUMwICsgaSk7CiAJbWVtY3B5KGRldi0+cGVybV9hZGRyLCBkZXYtPmRldl9hZGRyLCBkZXYtPmFkZHJfbGVuKTsKIApAQCAtNDMzOSw3ICs0MzQxLDcgQEAKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CiAKIAkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLQlydGw4MTY5X2lycV9tYXNrX2FuZF9hY2soaW9hZGRyKTsKKwlydGw4MTY5X2lycV9tYXNrX2FuZF9hY2sodHApOwogCiAJcnRsX3J4X2Nsb3NlKHRwKTsKIApAQCAtNDg4NSw4ICs0ODg3LDcgQEAKIAlSVExfVzE2KEludHJNaXRpZ2F0ZSwgMHg1MTUxKTsKIAogCS8qIFdvcmsgYXJvdW5kIGZvciBSeEZJRk8gb3ZlcmZsb3cuICovCi0JaWYgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzExIHx8Ci0JICAgIHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzIyKSB7CisJaWYgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzExKSB7CiAJCXRwLT5pbnRyX2V2ZW50IHw9IFJ4RklGT092ZXIgfCBQQ1NUaW1lb3V0OwogCQl0cC0+aW50cl9ldmVudCAmPSB+UnhPdmVyZmxvdzsKIAl9CkBAIC01MDc2LDYgKzUwNzcsMTEgQEAKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHRwLT5tbWlvX2FkZHI7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0cC0+cGNpX2RldjsKIAorCWlmICh0cC0+bWFjX3ZlcnNpb24gPj0gUlRMX0dJR0FfTUFDX1ZFUl8zMCkgeworCQl0cC0+aW50cl9ldmVudCAmPSB+UnhGSUZPT3ZlcjsKKwkJdHAtPm5hcGlfZXZlbnQgJj0gflJ4RklGT092ZXI7CisJfQorCiAJaWYgKHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzEzIHx8CiAJICAgIHRwLT5tYWNfdmVyc2lvbiA9PSBSVExfR0lHQV9NQUNfVkVSXzE2KSB7CiAJCWludCBjYXAgPSBwY2lfcGNpZV9jYXAocGRldik7CkBAIC01MzQyLDcgKzUzNDgsNyBAQAogCS8qIFdhaXQgZm9yIGFueSBwZW5kaW5nIE5BUEkgdGFzayB0byBjb21wbGV0ZSAqLwogCW5hcGlfZGlzYWJsZSgmdHAtPm5hcGkpOwogCi0JcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKGlvYWRkcik7CisJcnRsODE2OV9pcnFfbWFza19hbmRfYWNrKHRwKTsKIAogCXRwLT5pbnRyX21hc2sgPSAweGZmZmY7CiAJUlRMX1cxNihJbnRyTWFzaywgdHAtPmludHJfZXZlbnQpOwpAQCAtNTM4OSwxNCArNTM5NSwxNiBAQAogCWlmICghbmV0aWZfcnVubmluZyhkZXYpKQogCQlnb3RvIG91dF91bmxvY2s7CiAKKwlydGw4MTY5X2h3X3Jlc2V0KHRwKTsKKwogCXJ0bDgxNjlfd2FpdF9mb3JfcXVpZXNjZW5jZShkZXYpOwogCiAJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9ERVNDOyBpKyspCiAJCXJ0bDgxNjlfbWFya190b19hc2ljKHRwLT5SeERlc2NBcnJheSArIGksIHJ4X2J1Zl9zeik7CiAKIAlydGw4MTY5X3R4X2NsZWFyKHRwKTsKKwlydGw4MTY5X2luaXRfcmluZ19pbmRleGVzKHRwKTsKIAotCXJ0bDgxNjlfaHdfcmVzZXQodHApOwogCXJ0bF9od19zdGFydChkZXYpOwogCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKIAlydGw4MTY5X2NoZWNrX2xpbmtfc3RhdHVzKGRldiwgdHAsIHRwLT5tbWlvX2FkZHIpOwpAQCAtNTQwNywxMSArNTQxNSw2IEBACiAKIHN0YXRpYyB2b2lkIHJ0bDgxNjlfdHhfdGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBydGw4MTY5X3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQotCXJ0bDgxNjlfaHdfcmVzZXQodHApOwotCi0JLyogTGV0J3Mgd2FpdCBhIGJpdCB3aGlsZSBhbnkgKGFzeW5jKSBpcnEgbGFuZHMgb24gKi8KIAlydGw4MTY5X3NjaGVkdWxlX3dvcmsoZGV2LCBydGw4MTY5X3Jlc2V0X3Rhc2spOwogfQogCkBAIC01ODA0LDYgKzU4MDcsMTAgQEAKIAkgKi8KIAlzdGF0dXMgPSBSVExfUjE2KEludHJTdGF0dXMpOwogCXdoaWxlIChzdGF0dXMgJiYgc3RhdHVzICE9IDB4ZmZmZikgeworCQlzdGF0dXMgJj0gdHAtPmludHJfZXZlbnQ7CisJCWlmICghc3RhdHVzKQorCQkJYnJlYWs7CisKIAkJaGFuZGxlZCA9IDE7CiAKIAkJLyogSGFuZGxlIGFsbCBvZiB0aGUgZXJyb3IgY2FzZXMgZmlyc3QuIFRoZXNlIHdpbGwgcmVzZXQKQEAgLTU4MTgsMjcgKzU4MjUsOSBAQAogCQkJc3dpdGNoICh0cC0+bWFjX3ZlcnNpb24pIHsKIAkJCS8qIFdvcmsgYXJvdW5kIGZvciByeCBmaWZvIG92ZXJmbG93ICovCiAJCQljYXNlIFJUTF9HSUdBX01BQ19WRVJfMTE6Ci0JCQljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjI6Ci0JCQljYXNlIFJUTF9HSUdBX01BQ19WRVJfMjY6CiAJCQkJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwogCQkJCXJ0bDgxNjlfdHhfdGltZW91dChkZXYpOwogCQkJCWdvdG8gZG9uZTsKLQkJCS8qIFRlc3RlcnMgbmVlZGVkLiAqLwotCQkJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzE3OgotCQkJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzE5OgotCQkJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIwOgotCQkJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIxOgotCQkJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzIzOgotCQkJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzI0OgotCQkJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzI3OgotCQkJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzI4OgotCQkJY2FzZSBSVExfR0lHQV9NQUNfVkVSXzMxOgotCQkJLyogRXhwZXJpbWVudGFsIHNjaWVuY2UuIFBrdGdlbiBwcm9vZi4gKi8KLQkJCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8xMjoKLQkJCWNhc2UgUlRMX0dJR0FfTUFDX1ZFUl8yNToKLQkJCQlpZiAoc3RhdHVzID09IFJ4RklGT092ZXIpCi0JCQkJCWdvdG8gZG9uZTsKLQkJCQlicmVhazsKIAkJCWRlZmF1bHQ6CiAJCQkJYnJlYWs7CiAJCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvcmVuZXNhcy9zaF9ldGguYwppbmRleCA5YjIzMDc0Li5mYzliZGE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9yZW5lc2FzL3NoX2V0aC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3JlbmVzYXMvc2hfZXRoLmMKQEAgLTEzNjksMTMgKzEzNjksMTMgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZXRodG9vbF9vcHMgc2hfZXRoX2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBzaF9ldGhfZXRodG9vbF9vcHMgPSB7CiAJLmdldF9zZXR0aW5ncwk9IHNoX2V0aF9nZXRfc2V0dGluZ3MsCiAJLnNldF9zZXR0aW5ncwk9IHNoX2V0aF9zZXRfc2V0dGluZ3MsCi0JLm53YXlfcmVzZXQJCT0gc2hfZXRoX253YXlfcmVzZXQsCisJLm53YXlfcmVzZXQJPSBzaF9ldGhfbndheV9yZXNldCwKIAkuZ2V0X21zZ2xldmVsCT0gc2hfZXRoX2dldF9tc2dsZXZlbCwKIAkuc2V0X21zZ2xldmVsCT0gc2hfZXRoX3NldF9tc2dsZXZlbCwKLQkuZ2V0X2xpbmsJCT0gZXRodG9vbF9vcF9nZXRfbGluaywKKwkuZ2V0X2xpbmsJPSBldGh0b29sX29wX2dldF9saW5rLAogCS5nZXRfc3RyaW5ncwk9IHNoX2V0aF9nZXRfc3RyaW5ncywKIAkuZ2V0X2V0aHRvb2xfc3RhdHMgID0gc2hfZXRoX2dldF9ldGh0b29sX3N0YXRzLAogCS5nZXRfc3NldF9jb3VudCAgICAgPSBzaF9ldGhfZ2V0X3NzZXRfY291bnQsCkBAIC0xOTU3LDE4ICsxOTU3LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgc2hfZXRoX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaF9ldGhfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHNoX2V0aF9jbGVhbnVwKHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNoX2V0aF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChzaF9ldGhfaW5pdCk7Ci1tb2R1bGVfZXhpdChzaF9ldGhfY2xlYW51cCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHNoX2V0aF9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJOb2J1aGlybyBJd2FtYXRzdSwgWW9zaGloaXJvIFNoaW1vZGEiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiUmVuZXNhcyBTdXBlckggRXRoZXJuZXQgZHJpdmVyIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZWVxL3NnaXNlZXEuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NlZXEvc2dpc2VlcS5jCmluZGV4IGMzNjczZjEuLmY5NTVhMTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NlZXEvc2dpc2VlcS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NlZXEvc2dpc2VlcS5jCkBAIC04MzQsMjMgKzgzNCw3IEBACiAJfQogfTsKIAotc3RhdGljIGludCBfX2luaXQgc2dpc2VlcV9tb2R1bGVfaW5pdCh2b2lkKQotewotCWlmIChwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNnaXNlZXFfZHJpdmVyKSkgewotCQlwcmludGsoS0VSTl9FUlIgIkRyaXZlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzZ2lzZWVxX21vZHVsZV9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnNnaXNlZXFfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc2dpc2VlcV9tb2R1bGVfaW5pdCk7Ci1tb2R1bGVfZXhpdChzZ2lzZWVxX21vZHVsZV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2dpc2VlcV9kcml2ZXIpOwogCiBNT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBTZWVxIDgwMDMgZHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJMaW51eC9NSVBTIE1haWxpbmcgTGlzdCA8bGludXgtbWlwc0BsaW51eC1taXBzLm9yZz4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguYwppbmRleCBkNTczMWYxLi5lNDM3MDJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5jCkBAIC0xMzM2LDcgKzEzMzYsOCBAQAogCWlmIChlZngtPm5fY2hhbm5lbHMgPiAxKQogCQlnZXRfcmFuZG9tX2J5dGVzKCZlZngtPnJ4X2hhc2hfa2V5LCBzaXplb2YoZWZ4LT5yeF9oYXNoX2tleSkpOwogCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGVmeC0+cnhfaW5kaXJfdGFibGUpOyBpKyspCi0JCWVmeC0+cnhfaW5kaXJfdGFibGVbaV0gPSBpICUgZWZ4LT5uX3J4X2NoYW5uZWxzOworCQllZngtPnJ4X2luZGlyX3RhYmxlW2ldID0KKwkJCWV0aHRvb2xfcnhmaF9pbmRpcl9kZWZhdWx0KGksIGVmeC0+bl9yeF9jaGFubmVscyk7CiAKIAllZnhfc2V0X2NoYW5uZWxzKGVmeCk7CiAJbmV0aWZfc2V0X3JlYWxfbnVtX3R4X3F1ZXVlcyhlZngtPm5ldF9kZXYsIGVmeC0+bl90eF9jaGFubmVscyk7CkBAIC0xOTAwLDcgKzE5MDEsNyBAQAogCS8qIE90aGVyd2lzZSBlZnhfc3RhcnRfcG9ydCgpIHdpbGwgZG8gdGhpcyAqLwogfQogCi1zdGF0aWMgaW50IGVmeF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHUzMiBkYXRhKQorc3RhdGljIGludCBlZnhfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBkYXRhKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIApAQCAtMjIzNSw5ICsyMjM2LDkgQEAKIAl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NPTEFSRkxBUkUsCiAJCSAgICBQQ0lfREVWSUNFX0lEX1NPTEFSRkxBUkVfU0ZDNDAwMEIpLAogCSAuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykgJmZhbGNvbl9iMF9uaWNfdHlwZX0sCi0Je1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFLCBCRVRIUEFHRV9BX1BfREVWSUQpLAorCXtQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfU09MQVJGTEFSRSwgMHgwODAzKSwJLyogU0ZDOTAyMCAqLwogCSAuZHJpdmVyX2RhdGEgPSAodW5zaWduZWQgbG9uZykgJnNpZW5hX2EwX25pY190eXBlfSwKLQl7UENJX0RFVklDRShQQ0lfVkVORE9SX0lEX1NPTEFSRkxBUkUsIFNJRU5BX0FfUF9ERVZJRCksCisJe1BDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TT0xBUkZMQVJFLCAweDA4MTMpLAkvKiBTRkw5MDIxICovCiAJIC5kcml2ZXJfZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmc2llbmFfYTBfbmljX3R5cGV9LAogCXswfQkJCS8qIGVuZCBvZiBsaXN0ICovCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2VmeC5oCmluZGV4IDQ3NjQ3OTMuLmEzNTQxYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9lZnguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZWZ4LmgKQEAgLTE0LDEwICsxNCw2IEBACiAjaW5jbHVkZSAibmV0X2RyaXZlci5oIgogI2luY2x1ZGUgImZpbHRlci5oIgogCi0vKiBQQ0kgSURzICovCi0jZGVmaW5lIEJFVEhQQUdFX0FfUF9ERVZJRCAgICAgIDB4MDgwMwotI2RlZmluZSBTSUVOQV9BX1BfREVWSUQgICAgICAgICAweDA4MTMKLQogLyogU29sYXJzdG9ybSBjb250cm9sbGVycyB1c2UgQkFSIDAgZm9yIEkvTyBzcGFjZSBhbmQgQkFSIDIoJjMpIGZvciBtZW1vcnkgKi8KICNkZWZpbmUgRUZYX01FTV9CQVIgMgogCkBAIC02NSwxMyArNjEsMjMgQEAKIGV4dGVybiBpbnQgZWZ4X3Byb2JlX2ZpbHRlcnMoc3RydWN0IGVmeF9uaWMgKmVmeCk7CiBleHRlcm4gdm9pZCBlZnhfcmVzdG9yZV9maWx0ZXJzKHN0cnVjdCBlZnhfbmljICplZngpOwogZXh0ZXJuIHZvaWQgZWZ4X3JlbW92ZV9maWx0ZXJzKHN0cnVjdCBlZnhfbmljICplZngpOwotZXh0ZXJuIGludCBlZnhfZmlsdGVyX2luc2VydF9maWx0ZXIoc3RydWN0IGVmeF9uaWMgKmVmeCwKK2V4dGVybiBzMzIgZWZ4X2ZpbHRlcl9pbnNlcnRfZmlsdGVyKHN0cnVjdCBlZnhfbmljICplZngsCiAJCQkJICAgIHN0cnVjdCBlZnhfZmlsdGVyX3NwZWMgKnNwZWMsCiAJCQkJICAgIGJvb2wgcmVwbGFjZSk7Ci1leHRlcm4gaW50IGVmeF9maWx0ZXJfcmVtb3ZlX2ZpbHRlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAotCQkJCSAgICBzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjKTsKK2V4dGVybiBpbnQgZWZ4X2ZpbHRlcl9yZW1vdmVfaWRfc2FmZShzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAorCQkJCSAgICAgZW51bSBlZnhfZmlsdGVyX3ByaW9yaXR5IHByaW9yaXR5LAorCQkJCSAgICAgdTMyIGZpbHRlcl9pZCk7CitleHRlcm4gaW50IGVmeF9maWx0ZXJfZ2V0X2ZpbHRlcl9zYWZlKHN0cnVjdCBlZnhfbmljICplZngsCisJCQkJICAgICAgZW51bSBlZnhfZmlsdGVyX3ByaW9yaXR5IHByaW9yaXR5LAorCQkJCSAgICAgIHUzMiBmaWx0ZXJfaWQsIHN0cnVjdCBlZnhfZmlsdGVyX3NwZWMgKik7CiBleHRlcm4gdm9pZCBlZnhfZmlsdGVyX2NsZWFyX3J4KHN0cnVjdCBlZnhfbmljICplZngsCiAJCQkJZW51bSBlZnhfZmlsdGVyX3ByaW9yaXR5IHByaW9yaXR5KTsKK2V4dGVybiB1MzIgZWZ4X2ZpbHRlcl9jb3VudF9yeF91c2VkKHN0cnVjdCBlZnhfbmljICplZngsCisJCQkJICAgIGVudW0gZWZ4X2ZpbHRlcl9wcmlvcml0eSBwcmlvcml0eSk7CitleHRlcm4gdTMyIGVmeF9maWx0ZXJfZ2V0X3J4X2lkX2xpbWl0KHN0cnVjdCBlZnhfbmljICplZngpOworZXh0ZXJuIHMzMiBlZnhfZmlsdGVyX2dldF9yeF9pZHMoc3RydWN0IGVmeF9uaWMgKmVmeCwKKwkJCQkgZW51bSBlZnhfZmlsdGVyX3ByaW9yaXR5IHByaW9yaXR5LAorCQkJCSB1MzIgKmJ1ZiwgdTMyIHNpemUpOwogI2lmZGVmIENPTkZJR19SRlNfQUNDRUwKIGV4dGVybiBpbnQgZWZ4X2ZpbHRlcl9yZnMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgIHUxNiByeHFfaW5kZXgsIHUzMiBmbG93X2lkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZXRodG9vbC5jCmluZGV4IGYzY2Q5NmQuLjI5YjJlYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2V0aHRvb2wuYwpAQCAtODE4LDkgKzgxOCw1OCBAQAogCXJldHVybiBlZnhfcmVzZXQoZWZ4LCByYyk7CiB9CiAKK3N0YXRpYyBpbnQgZWZ4X2V0aHRvb2xfZ2V0X2NsYXNzX3J1bGUoc3RydWN0IGVmeF9uaWMgKmVmeCwKKwkJCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9yeF9mbG93X3NwZWMgKnJ1bGUpCit7CisJc3RydWN0IGV0aHRvb2xfdGNwaXA0X3NwZWMgKmlwX2VudHJ5ID0gJnJ1bGUtPmhfdS50Y3BfaXA0X3NwZWM7CisJc3RydWN0IGV0aHRvb2xfdGNwaXA0X3NwZWMgKmlwX21hc2sgPSAmcnVsZS0+bV91LnRjcF9pcDRfc3BlYzsKKwlzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjIHNwZWM7CisJdTE2IHZpZDsKKwl1OCBwcm90bzsKKwlpbnQgcmM7CisKKwlyYyA9IGVmeF9maWx0ZXJfZ2V0X2ZpbHRlcl9zYWZlKGVmeCwgRUZYX0ZJTFRFUl9QUklfTUFOVUFMLAorCQkJCQlydWxlLT5sb2NhdGlvbiwgJnNwZWMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKHNwZWMuZG1hcV9pZCA9PSAweGZmZikKKwkJcnVsZS0+cmluZ19jb29raWUgPSBSWF9DTFNfRkxPV19ESVNDOworCWVsc2UKKwkJcnVsZS0+cmluZ19jb29raWUgPSBzcGVjLmRtYXFfaWQ7CisKKwlyYyA9IGVmeF9maWx0ZXJfZ2V0X2V0aF9sb2NhbCgmc3BlYywgJnZpZCwKKwkJCQkgICAgICBydWxlLT5oX3UuZXRoZXJfc3BlYy5oX2Rlc3QpOworCWlmIChyYyA9PSAwKSB7CisJCXJ1bGUtPmZsb3dfdHlwZSA9IEVUSEVSX0ZMT1c7CisJCW1lbXNldChydWxlLT5tX3UuZXRoZXJfc3BlYy5oX2Rlc3QsIH4wLCBFVEhfQUxFTik7CisJCWlmICh2aWQgIT0gRUZYX0ZJTFRFUl9WSURfVU5TUEVDKSB7CisJCQlydWxlLT5mbG93X3R5cGUgfD0gRkxPV19FWFQ7CisJCQlydWxlLT5oX2V4dC52bGFuX3RjaSA9IGh0b25zKHZpZCk7CisJCQlydWxlLT5tX2V4dC52bGFuX3RjaSA9IGh0b25zKDB4ZmZmKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlyYyA9IGVmeF9maWx0ZXJfZ2V0X2lwdjRfbG9jYWwoJnNwZWMsICZwcm90bywKKwkJCQkgICAgICAgJmlwX2VudHJ5LT5pcDRkc3QsICZpcF9lbnRyeS0+cGRzdCk7CisJaWYgKHJjICE9IDApIHsKKwkJcmMgPSBlZnhfZmlsdGVyX2dldF9pcHY0X2Z1bGwoCisJCQkmc3BlYywgJnByb3RvLCAmaXBfZW50cnktPmlwNHNyYywgJmlwX2VudHJ5LT5wc3JjLAorCQkJJmlwX2VudHJ5LT5pcDRkc3QsICZpcF9lbnRyeS0+cGRzdCk7CisJCUVGWF9XQVJOX09OX1BBUkFOT0lEKHJjKTsKKwkJaXBfbWFzay0+aXA0c3JjID0gfjA7CisJCWlwX21hc2stPnBzcmMgPSB+MDsKKwl9CisJcnVsZS0+Zmxvd190eXBlID0gKHByb3RvID09IElQUFJPVE9fVENQKSA/IFRDUF9WNF9GTE9XIDogVURQX1Y0X0ZMT1c7CisJaXBfbWFzay0+aXA0ZHN0ID0gfjA7CisJaXBfbWFzay0+cGRzdCA9IH4wOworCXJldHVybiByYzsKK30KKwogc3RhdGljIGludAogZWZ4X2V0aHRvb2xfZ2V0X3J4bmZjKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAotCQkgICAgICBzdHJ1Y3QgZXRodG9vbF9yeG5mYyAqaW5mbywgdTMyICpydWxlcyBfX2Fsd2F5c191bnVzZWQpCisJCSAgICAgIHN0cnVjdCBldGh0b29sX3J4bmZjICppbmZvLCB1MzIgKnJ1bGVfbG9jcykKIHsKIAlzdHJ1Y3QgZWZ4X25pYyAqZWZ4ID0gbmV0ZGV2X3ByaXYobmV0X2Rldik7CiAKQEAgLTg2Miw0MiArOTExLDgwIEBACiAJCXJldHVybiAwOwogCX0KIAorCWNhc2UgRVRIVE9PTF9HUlhDTFNSTENOVDoKKwkJaW5mby0+ZGF0YSA9IGVmeF9maWx0ZXJfZ2V0X3J4X2lkX2xpbWl0KGVmeCk7CisJCWlmIChpbmZvLT5kYXRhID09IDApCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWluZm8tPmRhdGEgfD0gUlhfQ0xTX0xPQ19TUEVDSUFMOworCQlpbmZvLT5ydWxlX2NudCA9CisJCQllZnhfZmlsdGVyX2NvdW50X3J4X3VzZWQoZWZ4LCBFRlhfRklMVEVSX1BSSV9NQU5VQUwpOworCQlyZXR1cm4gMDsKKworCWNhc2UgRVRIVE9PTF9HUlhDTFNSVUxFOgorCQlpZiAoZWZ4X2ZpbHRlcl9nZXRfcnhfaWRfbGltaXQoZWZ4KSA9PSAwKQorCQkJcmV0dXJuIC1FT1BOT1RTVVBQOworCQlyZXR1cm4gZWZ4X2V0aHRvb2xfZ2V0X2NsYXNzX3J1bGUoZWZ4LCAmaW5mby0+ZnMpOworCisJY2FzZSBFVEhUT09MX0dSWENMU1JMQUxMOiB7CisJCXMzMiByYzsKKwkJaW5mby0+ZGF0YSA9IGVmeF9maWx0ZXJfZ2V0X3J4X2lkX2xpbWl0KGVmeCk7CisJCWlmIChpbmZvLT5kYXRhID09IDApCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCXJjID0gZWZ4X2ZpbHRlcl9nZXRfcnhfaWRzKGVmeCwgRUZYX0ZJTFRFUl9QUklfTUFOVUFMLAorCQkJCQkgICBydWxlX2xvY3MsIGluZm8tPnJ1bGVfY250KTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwkJaW5mby0+cnVsZV9jbnQgPSByYzsKKwkJcmV0dXJuIDA7CisJfQorCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIH0KIAotc3RhdGljIGludCBlZnhfZXRodG9vbF9zZXRfcnhfbnR1cGxlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAotCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlICpudHVwbGUpCitzdGF0aWMgaW50IGVmeF9ldGh0b29sX3NldF9jbGFzc19ydWxlKHN0cnVjdCBlZnhfbmljICplZngsCisJCQkJICAgICAgc3RydWN0IGV0aHRvb2xfcnhfZmxvd19zcGVjICpydWxlKQogewotCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlzdHJ1Y3QgZXRodG9vbF90Y3BpcDRfc3BlYyAqaXBfZW50cnkgPSAmbnR1cGxlLT5mcy5oX3UudGNwX2lwNF9zcGVjOwotCXN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjICppcF9tYXNrID0gJm50dXBsZS0+ZnMubV91LnRjcF9pcDRfc3BlYzsKLQlzdHJ1Y3QgZXRoaGRyICptYWNfZW50cnkgPSAmbnR1cGxlLT5mcy5oX3UuZXRoZXJfc3BlYzsKLQlzdHJ1Y3QgZXRoaGRyICptYWNfbWFzayA9ICZudHVwbGUtPmZzLm1fdS5ldGhlcl9zcGVjOwotCXN0cnVjdCBlZnhfZmlsdGVyX3NwZWMgZmlsdGVyOworCXN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjICppcF9lbnRyeSA9ICZydWxlLT5oX3UudGNwX2lwNF9zcGVjOworCXN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjICppcF9tYXNrID0gJnJ1bGUtPm1fdS50Y3BfaXA0X3NwZWM7CisJc3RydWN0IGV0aGhkciAqbWFjX2VudHJ5ID0gJnJ1bGUtPmhfdS5ldGhlcl9zcGVjOworCXN0cnVjdCBldGhoZHIgKm1hY19tYXNrID0gJnJ1bGUtPm1fdS5ldGhlcl9zcGVjOworCXN0cnVjdCBlZnhfZmlsdGVyX3NwZWMgc3BlYzsKIAlpbnQgcmM7CiAKLQkvKiBSYW5nZS1jaGVjayBhY3Rpb24gKi8KLQlpZiAobnR1cGxlLT5mcy5hY3Rpb24gPCBFVEhUT09MX1JYTlRVUExFX0FDVElPTl9DTEVBUiB8fAotCSAgICBudHVwbGUtPmZzLmFjdGlvbiA+PSAoczMyKWVmeC0+bl9yeF9jaGFubmVscykKKwkvKiBDaGVjayB0aGF0IHVzZXIgd2FudHMgdXMgdG8gY2hvb3NlIHRoZSBsb2NhdGlvbiAqLworCWlmIChydWxlLT5sb2NhdGlvbiAhPSBSWF9DTFNfTE9DX0FOWSAmJgorCSAgICBydWxlLT5sb2NhdGlvbiAhPSBSWF9DTFNfTE9DX0ZJUlNUICYmCisJICAgIHJ1bGUtPmxvY2F0aW9uICE9IFJYX0NMU19MT0NfTEFTVCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAofm50dXBsZS0+ZnMuZGF0YV9tYXNrKQorCS8qIFJhbmdlLWNoZWNrIHJpbmdfY29va2llICovCisJaWYgKHJ1bGUtPnJpbmdfY29va2llID49IGVmeC0+bl9yeF9jaGFubmVscyAmJgorCSAgICBydWxlLT5yaW5nX2Nvb2tpZSAhPSBSWF9DTFNfRkxPV19ESVNDKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWVmeF9maWx0ZXJfaW5pdF9yeCgmZmlsdGVyLCBFRlhfRklMVEVSX1BSSV9NQU5VQUwsIDAsCi0JCQkgICAobnR1cGxlLT5mcy5hY3Rpb24gPT0gRVRIVE9PTF9SWE5UVVBMRV9BQ1RJT05fRFJPUCkgPwotCQkJICAgMHhmZmYgOiBudHVwbGUtPmZzLmFjdGlvbik7CisJLyogQ2hlY2sgZm9yIHVuc3VwcG9ydGVkIGV4dGVuc2lvbnMgKi8KKwlpZiAoKHJ1bGUtPmZsb3dfdHlwZSAmIEZMT1dfRVhUKSAmJgorCSAgICAocnVsZS0+bV9leHQudmxhbl9ldHlwZSB8IHJ1bGUtPm1fZXh0LmRhdGFbMF0gfAorCSAgICAgcnVsZS0+bV9leHQuZGF0YVsxXSkpCisJCXJldHVybiAtRUlOVkFMOwogCi0Jc3dpdGNoIChudHVwbGUtPmZzLmZsb3dfdHlwZSkgeworCWVmeF9maWx0ZXJfaW5pdF9yeCgmc3BlYywgRUZYX0ZJTFRFUl9QUklfTUFOVUFMLAorCQkJICAgKHJ1bGUtPmxvY2F0aW9uID09IFJYX0NMU19MT0NfRklSU1QpID8KKwkJCSAgIEVGWF9GSUxURVJfRkxBR19SWF9PVkVSUklERV9JUCA6IDAsCisJCQkgICAocnVsZS0+cmluZ19jb29raWUgPT0gUlhfQ0xTX0ZMT1dfRElTQykgPworCQkJICAgMHhmZmYgOiBydWxlLT5yaW5nX2Nvb2tpZSk7CisKKwlzd2l0Y2ggKHJ1bGUtPmZsb3dfdHlwZSkgewogCWNhc2UgVENQX1Y0X0ZMT1c6CiAJY2FzZSBVRFBfVjRfRkxPVzogewotCQl1OCBwcm90byA9IChudHVwbGUtPmZzLmZsb3dfdHlwZSA9PSBUQ1BfVjRfRkxPVyA/CisJCXU4IHByb3RvID0gKHJ1bGUtPmZsb3dfdHlwZSA9PSBUQ1BfVjRfRkxPVyA/CiAJCQkgICAgSVBQUk9UT19UQ1AgOiBJUFBST1RPX1VEUCk7CiAKIAkJLyogTXVzdCBtYXRjaCBhbGwgb2YgZGVzdGluYXRpb24sICovCi0JCWlmIChpcF9tYXNrLT5pcDRkc3QgfCBpcF9tYXNrLT5wZHN0KQorCQlpZiAoKF9fZm9yY2UgdTMyKX5pcF9tYXNrLT5pcDRkc3QgfAorCQkgICAgKF9fZm9yY2UgdTE2KX5pcF9tYXNrLT5wZHN0KQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCS8qIGFsbCBvciBub25lIG9mIHNvdXJjZSwgKi8KIAkJaWYgKChpcF9tYXNrLT5pcDRzcmMgfCBpcF9tYXNrLT5wc3JjKSAmJgpAQCAtOTA1LDE3ICs5OTIsMTcgQEAKIAkJICAgICAoX19mb3JjZSB1MTYpfmlwX21hc2stPnBzcmMpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCS8qIGFuZCBub3RoaW5nIGVsc2UgKi8KLQkJaWYgKCh1OCl+aXBfbWFzay0+dG9zIHwgKHUxNil+bnR1cGxlLT5mcy52bGFuX3RhZ19tYXNrKQorCQlpZiAoaXBfbWFzay0+dG9zIHwgcnVsZS0+bV9leHQudmxhbl90Y2kpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQlpZiAoIWlwX21hc2stPmlwNHNyYykKLQkJCXJjID0gZWZ4X2ZpbHRlcl9zZXRfaXB2NF9mdWxsKCZmaWx0ZXIsIHByb3RvLAorCQlpZiAoaXBfbWFzay0+aXA0c3JjKQorCQkJcmMgPSBlZnhfZmlsdGVyX3NldF9pcHY0X2Z1bGwoJnNwZWMsIHByb3RvLAogCQkJCQkJICAgICAgaXBfZW50cnktPmlwNGRzdCwKIAkJCQkJCSAgICAgIGlwX2VudHJ5LT5wZHN0LAogCQkJCQkJICAgICAgaXBfZW50cnktPmlwNHNyYywKIAkJCQkJCSAgICAgIGlwX2VudHJ5LT5wc3JjKTsKIAkJZWxzZQotCQkJcmMgPSBlZnhfZmlsdGVyX3NldF9pcHY0X2xvY2FsKCZmaWx0ZXIsIHByb3RvLAorCQkJcmMgPSBlZnhfZmlsdGVyX3NldF9pcHY0X2xvY2FsKCZzcGVjLCBwcm90bywKIAkJCQkJCSAgICAgICBpcF9lbnRyeS0+aXA0ZHN0LAogCQkJCQkJICAgICAgIGlwX2VudHJ5LT5wZHN0KTsKIAkJaWYgKHJjKQpAQCAtOTIzLDIzICsxMDEwLDI0IEBACiAJCWJyZWFrOwogCX0KIAotCWNhc2UgRVRIRVJfRkxPVzoKLQkJLyogTXVzdCBtYXRjaCBhbGwgb2YgZGVzdGluYXRpb24sICovCi0JCWlmICghaXNfemVyb19ldGhlcl9hZGRyKG1hY19tYXNrLT5oX2Rlc3QpKQorCWNhc2UgRVRIRVJfRkxPVyB8IEZMT1dfRVhUOgorCQkvKiBNdXN0IG1hdGNoIGFsbCBvciBub25lIG9mIFZJRCAqLworCQlpZiAocnVsZS0+bV9leHQudmxhbl90Y2kgIT0gaHRvbnMoMHhmZmYpICYmCisJCSAgICBydWxlLT5tX2V4dC52bGFuX3RjaSAhPSAwKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCS8qIGFsbCBvciBub25lIG9mIFZJRCwgKi8KLQkJaWYgKG50dXBsZS0+ZnMudmxhbl90YWdfbWFzayAhPSAweGYwMDAgJiYKLQkJICAgIG50dXBsZS0+ZnMudmxhbl90YWdfbWFzayAhPSAweGZmZmYpCisJY2FzZSBFVEhFUl9GTE9XOgorCQkvKiBNdXN0IG1hdGNoIGFsbCBvZiBkZXN0aW5hdGlvbiAqLworCQlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKG1hY19tYXNrLT5oX2Rlc3QpKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCS8qIGFuZCBub3RoaW5nIGVsc2UgKi8KLQkJaWYgKCFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihtYWNfbWFzay0+aF9zb3VyY2UpIHx8Ci0JCSAgICBtYWNfbWFzay0+aF9wcm90byAhPSBodG9ucygweGZmZmYpKQorCQlpZiAoIWlzX3plcm9fZXRoZXJfYWRkcihtYWNfbWFzay0+aF9zb3VyY2UpIHx8CisJCSAgICBtYWNfbWFzay0+aF9wcm90bykKIAkJCXJldHVybiAtRUlOVkFMOwogCiAJCXJjID0gZWZ4X2ZpbHRlcl9zZXRfZXRoX2xvY2FsKAotCQkJJmZpbHRlciwKLQkJCShudHVwbGUtPmZzLnZsYW5fdGFnX21hc2sgPT0gMHhmMDAwKSA/Ci0JCQludHVwbGUtPmZzLnZsYW5fdGFnIDogRUZYX0ZJTFRFUl9WSURfVU5TUEVDLAorCQkJJnNwZWMsCisJCQkocnVsZS0+Zmxvd190eXBlICYgRkxPV19FWFQgJiYgcnVsZS0+bV9leHQudmxhbl90Y2kpID8KKwkJCW50b2hzKHJ1bGUtPmhfZXh0LnZsYW5fdGNpKSA6IEVGWF9GSUxURVJfVklEX1VOU1BFQywKIAkJCW1hY19lbnRyeS0+aF9kZXN0KTsKIAkJaWYgKHJjKQogCQkJcmV0dXJuIHJjOwpAQCAtOTQ5LDQ3ICsxMDM3LDU3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCWlmIChudHVwbGUtPmZzLmFjdGlvbiA9PSBFVEhUT09MX1JYTlRVUExFX0FDVElPTl9DTEVBUikKLQkJcmV0dXJuIGVmeF9maWx0ZXJfcmVtb3ZlX2ZpbHRlcihlZngsICZmaWx0ZXIpOworCXJjID0gZWZ4X2ZpbHRlcl9pbnNlcnRfZmlsdGVyKGVmeCwgJnNwZWMsIHRydWUpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKIAotCXJjID0gZWZ4X2ZpbHRlcl9pbnNlcnRfZmlsdGVyKGVmeCwgJmZpbHRlciwgdHJ1ZSk7Ci0JcmV0dXJuIHJjIDwgMCA/IHJjIDogMDsKKwlydWxlLT5sb2NhdGlvbiA9IHJjOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGVmeF9ldGh0b29sX2dldF9yeGZoX2luZGlyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAotCQkJCSAgICAgIHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKmluZGlyKQorc3RhdGljIGludCBlZnhfZXRodG9vbF9zZXRfcnhuZmMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsCisJCQkJIHN0cnVjdCBldGh0b29sX3J4bmZjICppbmZvKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKLQlzaXplX3QgY29weV9zaXplID0KLQkJbWluX3Qoc2l6ZV90LCBpbmRpci0+c2l6ZSwgQVJSQVlfU0laRShlZngtPnJ4X2luZGlyX3RhYmxlKSk7CiAKLQlpZiAoZWZ4X25pY19yZXYoZWZ4KSA8IEVGWF9SRVZfRkFMQ09OX0IwKQorCWlmIChlZnhfZmlsdGVyX2dldF9yeF9pZF9saW1pdChlZngpID09IDApCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWluZGlyLT5zaXplID0gQVJSQVlfU0laRShlZngtPnJ4X2luZGlyX3RhYmxlKTsKLQltZW1jcHkoaW5kaXItPnJpbmdfaW5kZXgsIGVmeC0+cnhfaW5kaXJfdGFibGUsCi0JICAgICAgIGNvcHlfc2l6ZSAqIHNpemVvZihpbmRpci0+cmluZ19pbmRleFswXSkpOworCXN3aXRjaCAoaW5mby0+Y21kKSB7CisJY2FzZSBFVEhUT09MX1NSWENMU1JMSU5TOgorCQlyZXR1cm4gZWZ4X2V0aHRvb2xfc2V0X2NsYXNzX3J1bGUoZWZ4LCAmaW5mby0+ZnMpOworCisJY2FzZSBFVEhUT09MX1NSWENMU1JMREVMOgorCQlyZXR1cm4gZWZ4X2ZpbHRlcl9yZW1vdmVfaWRfc2FmZShlZngsIEVGWF9GSUxURVJfUFJJX01BTlVBTCwKKwkJCQkJCSBpbmZvLT5mcy5sb2NhdGlvbik7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorfQorCitzdGF0aWMgdTMyIGVmeF9ldGh0b29sX2dldF9yeGZoX2luZGlyX3NpemUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCit7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCisJcmV0dXJuIChlZnhfbmljX3JldihlZngpIDwgRUZYX1JFVl9GQUxDT05fQjAgPworCQkwIDogQVJSQVlfU0laRShlZngtPnJ4X2luZGlyX3RhYmxlKSk7Cit9CisKK3N0YXRpYyBpbnQgZWZ4X2V0aHRvb2xfZ2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYsIHUzMiAqaW5kaXIpCit7CisJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOworCisJbWVtY3B5KGluZGlyLCBlZngtPnJ4X2luZGlyX3RhYmxlLCBzaXplb2YoZWZ4LT5yeF9pbmRpcl90YWJsZSkpOwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGVmeF9ldGh0b29sX3NldF9yeGZoX2luZGlyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2LAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKmluZGlyKQorCQkJCSAgICAgIGNvbnN0IHUzMiAqaW5kaXIpCiB7CiAJc3RydWN0IGVmeF9uaWMgKmVmeCA9IG5ldGRldl9wcml2KG5ldF9kZXYpOwotCXNpemVfdCBpOwogCi0JaWYgKGVmeF9uaWNfcmV2KGVmeCkgPCBFRlhfUkVWX0ZBTENPTl9CMCkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JLyogVmFsaWRhdGUgc2l6ZSBhbmQgaW5kaWNlcyAqLwotCWlmIChpbmRpci0+c2l6ZSAhPSBBUlJBWV9TSVpFKGVmeC0+cnhfaW5kaXJfdGFibGUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShlZngtPnJ4X2luZGlyX3RhYmxlKTsgaSsrKQotCQlpZiAoaW5kaXItPnJpbmdfaW5kZXhbaV0gPj0gZWZ4LT5uX3J4X2NoYW5uZWxzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltZW1jcHkoZWZ4LT5yeF9pbmRpcl90YWJsZSwgaW5kaXItPnJpbmdfaW5kZXgsCi0JICAgICAgIHNpemVvZihlZngtPnJ4X2luZGlyX3RhYmxlKSk7CisJbWVtY3B5KGVmeC0+cnhfaW5kaXJfdGFibGUsIGluZGlyLCBzaXplb2YoZWZ4LT5yeF9pbmRpcl90YWJsZSkpOwogCWVmeF9uaWNfcHVzaF9yeF9pbmRpcl90YWJsZShlZngpOwogCXJldHVybiAwOwogfQpAQCAtMTAxOSw3ICsxMTE3LDggQEAKIAkuc2V0X3dvbCAgICAgICAgICAgICAgICA9IGVmeF9ldGh0b29sX3NldF93b2wsCiAJLnJlc2V0CQkJPSBlZnhfZXRodG9vbF9yZXNldCwKIAkuZ2V0X3J4bmZjCQk9IGVmeF9ldGh0b29sX2dldF9yeG5mYywKLQkuc2V0X3J4X250dXBsZQkJPSBlZnhfZXRodG9vbF9zZXRfcnhfbnR1cGxlLAorCS5zZXRfcnhuZmMJCT0gZWZ4X2V0aHRvb2xfc2V0X3J4bmZjLAorCS5nZXRfcnhmaF9pbmRpcl9zaXplCT0gZWZ4X2V0aHRvb2xfZ2V0X3J4ZmhfaW5kaXJfc2l6ZSwKIAkuZ2V0X3J4ZmhfaW5kaXIJCT0gZWZ4X2V0aHRvb2xfZ2V0X3J4ZmhfaW5kaXIsCiAJLnNldF9yeGZoX2luZGlyCQk9IGVmeF9ldGh0b29sX3NldF9yeGZoX2luZGlyLAogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb24uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9mYWxjb24uYwppbmRleCA5N2I2MDZiLi44YWUxZWJkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmFsY29uLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZhbGNvbi5jCkBAIC02MTAsNyArNjEwLDcgQEAKIAlpZiAoIW5pY19kYXRhLT5zdGF0c19wZW5kaW5nKQogCQlyZXR1cm47CiAKLQluaWNfZGF0YS0+c3RhdHNfcGVuZGluZyA9IDA7CisJbmljX2RhdGEtPnN0YXRzX3BlbmRpbmcgPSBmYWxzZTsKIAlpZiAoKm5pY19kYXRhLT5zdGF0c19kbWFfZG9uZSA9PSBGQUxDT05fU1RBVFNfRE9ORSkgewogCQlybWIoKTsgLyogcmVhZCB0aGUgZG9uZSBmbGFnIGJlZm9yZSB0aGUgc3RhdHMgKi8KIAkJZWZ4LT5tYWNfb3AtPnVwZGF0ZV9zdGF0cyhlZngpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZpbHRlci5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZpbHRlci5jCmluZGV4IDJiOTYzNmYuLjFmYmJiZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9maWx0ZXIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmlsdGVyLmMKQEAgLTE1NSw2ICsxNTUsMTYgQEAKIAlzcGVjLT5kYXRhWzJdID0gbnRvaGwoaG9zdDIpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgX19lZnhfZmlsdGVyX2dldF9pcHY0KGNvbnN0IHN0cnVjdCBlZnhfZmlsdGVyX3NwZWMgKnNwZWMsCisJCQkJCSBfX2JlMzIgKmhvc3QxLCBfX2JlMTYgKnBvcnQxLAorCQkJCQkgX19iZTMyICpob3N0MiwgX19iZTE2ICpwb3J0MikKK3sKKwkqaG9zdDEgPSBodG9ubChzcGVjLT5kYXRhWzBdID4+IDE2IHwgc3BlYy0+ZGF0YVsxXSA8PCAxNik7CisJKnBvcnQxID0gaHRvbnMoc3BlYy0+ZGF0YVswXSk7CisJKmhvc3QyID0gaHRvbmwoc3BlYy0+ZGF0YVsyXSk7CisJKnBvcnQyID0gaHRvbnMoc3BlYy0+ZGF0YVsxXSA+PiAxNik7Cit9CisKIC8qKgogICogZWZ4X2ZpbHRlcl9zZXRfaXB2NF9sb2NhbCAtIHNwZWNpZnkgSVB2NCBob3N0LCB0cmFuc3BvcnQgcHJvdG9jb2wgYW5kIHBvcnQKICAqIEBzcGVjOiBTcGVjaWZpY2F0aW9uIHRvIGluaXRpYWxpc2UKQEAgLTIwNSw2ICsyMTUsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGVmeF9maWx0ZXJfZ2V0X2lwdjRfbG9jYWwoY29uc3Qgc3RydWN0IGVmeF9maWx0ZXJfc3BlYyAqc3BlYywKKwkJCSAgICAgIHU4ICpwcm90bywgX19iZTMyICpob3N0LCBfX2JlMTYgKnBvcnQpCit7CisJX19iZTMyIGhvc3QxOworCV9fYmUxNiBwb3J0MTsKKworCXN3aXRjaCAoc3BlYy0+dHlwZSkgeworCWNhc2UgRUZYX0ZJTFRFUl9UQ1BfV0lMRDoKKwkJKnByb3RvID0gSVBQUk9UT19UQ1A7CisJCV9fZWZ4X2ZpbHRlcl9nZXRfaXB2NChzcGVjLCAmaG9zdDEsICZwb3J0MSwgaG9zdCwgcG9ydCk7CisJCXJldHVybiAwOworCWNhc2UgRUZYX0ZJTFRFUl9VRFBfV0lMRDoKKwkJKnByb3RvID0gSVBQUk9UT19VRFA7CisJCV9fZWZ4X2ZpbHRlcl9nZXRfaXB2NChzcGVjLCAmaG9zdDEsIHBvcnQsIGhvc3QsICZwb3J0MSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKwogLyoqCiAgKiBlZnhfZmlsdGVyX3NldF9pcHY0X2Z1bGwgLSBzcGVjaWZ5IElQdjQgaG9zdHMsIHRyYW5zcG9ydCBwcm90b2NvbCBhbmQgcG9ydHMKICAqIEBzcGVjOiBTcGVjaWZpY2F0aW9uIHRvIGluaXRpYWxpc2UKQEAgLTI0Miw2ICsyNzIsMjUgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IGVmeF9maWx0ZXJfZ2V0X2lwdjRfZnVsbChjb25zdCBzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjLAorCQkJICAgICB1OCAqcHJvdG8sIF9fYmUzMiAqaG9zdCwgX19iZTE2ICpwb3J0LAorCQkJICAgICBfX2JlMzIgKnJob3N0LCBfX2JlMTYgKnJwb3J0KQoreworCXN3aXRjaCAoc3BlYy0+dHlwZSkgeworCWNhc2UgRUZYX0ZJTFRFUl9UQ1BfRlVMTDoKKwkJKnByb3RvID0gSVBQUk9UT19UQ1A7CisJCWJyZWFrOworCWNhc2UgRUZYX0ZJTFRFUl9VRFBfRlVMTDoKKwkJKnByb3RvID0gSVBQUk9UT19VRFA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCV9fZWZ4X2ZpbHRlcl9nZXRfaXB2NChzcGVjLCByaG9zdCwgcnBvcnQsIGhvc3QsIHBvcnQpOworCXJldHVybiAwOworfQorCiAvKioKICAqIGVmeF9maWx0ZXJfc2V0X2V0aF9sb2NhbCAtIHNwZWNpZnkgbG9jYWwgRXRoZXJuZXQgYWRkcmVzcyBhbmQgb3B0aW9uYWwgVklECiAgKiBAc3BlYzogU3BlY2lmaWNhdGlvbiB0byBpbml0aWFsaXNlCkBAIC0yNzAsNiArMzE5LDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKK2ludCBlZnhfZmlsdGVyX2dldF9ldGhfbG9jYWwoY29uc3Qgc3RydWN0IGVmeF9maWx0ZXJfc3BlYyAqc3BlYywKKwkJCSAgICAgdTE2ICp2aWQsIHU4ICphZGRyKQoreworCXN3aXRjaCAoc3BlYy0+dHlwZSkgeworCWNhc2UgRUZYX0ZJTFRFUl9NQUNfV0lMRDoKKwkJKnZpZCA9IEVGWF9GSUxURVJfVklEX1VOU1BFQzsKKwkJYnJlYWs7CisJY2FzZSBFRlhfRklMVEVSX01BQ19GVUxMOgorCQkqdmlkID0gc3BlYy0+ZGF0YVswXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYWRkclswXSA9IHNwZWMtPmRhdGFbMl0gPj4gODsKKwlhZGRyWzFdID0gc3BlYy0+ZGF0YVsyXTsKKwlhZGRyWzJdID0gc3BlYy0+ZGF0YVsxXSA+PiAyNDsKKwlhZGRyWzNdID0gc3BlYy0+ZGF0YVsxXSA+PiAxNjsKKwlhZGRyWzRdID0gc3BlYy0+ZGF0YVsxXSA+PiA4OworCWFkZHJbNV0gPSBzcGVjLT5kYXRhWzFdOworCXJldHVybiAwOworfQorCiAvKiBCdWlsZCBhIGZpbHRlciBlbnRyeSBhbmQgcmV0dXJuIGl0cyBuLXR1cGxlIGtleS4gKi8KIHN0YXRpYyB1MzIgZWZ4X2ZpbHRlcl9idWlsZChlZnhfb3dvcmRfdCAqZmlsdGVyLCBzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjKQogewpAQCAtMzMyLDcgKzQwNCw3IEBACiAKIHN0YXRpYyBpbnQgZWZ4X2ZpbHRlcl9zZWFyY2goc3RydWN0IGVmeF9maWx0ZXJfdGFibGUgKnRhYmxlLAogCQkJICAgICBzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjLCB1MzIga2V5LAotCQkJICAgICBib29sIGZvcl9pbnNlcnQsIGludCAqZGVwdGhfcmVxdWlyZWQpCisJCQkgICAgIGJvb2wgZm9yX2luc2VydCwgdW5zaWduZWQgaW50ICpkZXB0aF9yZXF1aXJlZCkKIHsKIAl1bnNpZ25lZCBoYXNoLCBpbmNyLCBmaWx0ZXJfaWR4LCBkZXB0aCwgZGVwdGhfbWF4OwogCkBAIC0zNjYsMTIgKzQzOCw1OSBAQAogCX0KIH0KIAotLyogQ29uc3RydWN0L2RlY29uc3RydWN0IGV4dGVybmFsIGZpbHRlciBJRHMgKi8KKy8qCisgKiBDb25zdHJ1Y3QvZGVjb25zdHJ1Y3QgZXh0ZXJuYWwgZmlsdGVyIElEcy4gIFRoZXNlIG11c3QgYmUgb3JkZXJlZAorICogYnkgbWF0Y2hpbmcgcHJpb3JpdHksIGZvciBSWCBORkMgc2VtYW50aWNzLgorICoKKyAqIEVhY2ggUlggTUFDIGZpbHRlciBlbnRyeSBoYXMgYSBmbGFnIGZvciB3aGV0aGVyIGl0IGNhbiBvdmVycmlkZSBhbgorICogUlggSVAgZmlsdGVyIHRoYXQgYWxzbyBtYXRjaGVzLiAgU28gd2UgYXNzaWduIGxvY2F0aW9ucyBmb3IgTUFDCisgKiBmaWx0ZXJzIHdpdGggb3ZlcnJpZGluZyBiZWhhdmlvdXIsIHRoZW4gZm9yIElQIGZpbHRlcnMsIHRoZW4gZm9yCisgKiBNQUMgZmlsdGVycyB3aXRob3V0IG92ZXJyaWRpbmcgYmVoYXZpb3VyLgorICovCiAKLXN0YXRpYyBpbmxpbmUgaW50Ci1lZnhfZmlsdGVyX21ha2VfaWQoZW51bSBlZnhfZmlsdGVyX3RhYmxlX2lkIHRhYmxlX2lkLCB1bnNpZ25lZCBpbmRleCkKKyNkZWZpbmUgRUZYX0ZJTFRFUl9JTkRFWF9XSURUSAkxMworI2RlZmluZSBFRlhfRklMVEVSX0lOREVYX01BU0sJKCgxIDw8IEVGWF9GSUxURVJfSU5ERVhfV0lEVEgpIC0gMSkKKworc3RhdGljIGlubGluZSB1MzIgZWZ4X2ZpbHRlcl9tYWtlX2lkKGVudW0gZWZ4X2ZpbHRlcl90YWJsZV9pZCB0YWJsZV9pZCwKKwkJCQkgICAgIHVuc2lnbmVkIGludCBpbmRleCwgdTggZmxhZ3MpCiB7Ci0JcmV0dXJuIHRhYmxlX2lkIDw8IDE2IHwgaW5kZXg7CisJcmV0dXJuICh0YWJsZV9pZCA9PSBFRlhfRklMVEVSX1RBQkxFX1JYX01BQyAmJgorCQlmbGFncyAmIEVGWF9GSUxURVJfRkxBR19SWF9PVkVSUklERV9JUCkgPworCQlpbmRleCA6CisJCSh0YWJsZV9pZCArIDEpIDw8IEVGWF9GSUxURVJfSU5ERVhfV0lEVEggfCBpbmRleDsKK30KKworc3RhdGljIGlubGluZSBlbnVtIGVmeF9maWx0ZXJfdGFibGVfaWQgZWZ4X2ZpbHRlcl9pZF90YWJsZV9pZCh1MzIgaWQpCit7CisJcmV0dXJuIChpZCA8PSBFRlhfRklMVEVSX0lOREVYX01BU0spID8KKwkJRUZYX0ZJTFRFUl9UQUJMRV9SWF9NQUMgOgorCQkoaWQgPj4gRUZYX0ZJTFRFUl9JTkRFWF9XSURUSCkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlZnhfZmlsdGVyX2lkX2luZGV4KHUzMiBpZCkKK3sKKwlyZXR1cm4gaWQgJiBFRlhfRklMVEVSX0lOREVYX01BU0s7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggZWZ4X2ZpbHRlcl9pZF9mbGFncyh1MzIgaWQpCit7CisJcmV0dXJuIChpZCA8PSBFRlhfRklMVEVSX0lOREVYX01BU0spID8KKwkJRUZYX0ZJTFRFUl9GTEFHX1JYIHwgRUZYX0ZJTFRFUl9GTEFHX1JYX09WRVJSSURFX0lQIDoKKwkJRUZYX0ZJTFRFUl9GTEFHX1JYOworfQorCit1MzIgZWZ4X2ZpbHRlcl9nZXRfcnhfaWRfbGltaXQoc3RydWN0IGVmeF9uaWMgKmVmeCkKK3sKKwlzdHJ1Y3QgZWZ4X2ZpbHRlcl9zdGF0ZSAqc3RhdGUgPSBlZngtPmZpbHRlcl9zdGF0ZTsKKworCWlmIChzdGF0ZS0+dGFibGVbRUZYX0ZJTFRFUl9UQUJMRV9SWF9NQUNdLnNpemUgIT0gMCkKKwkJcmV0dXJuICgoRUZYX0ZJTFRFUl9UQUJMRV9SWF9NQUMgKyAxKSA8PCBFRlhfRklMVEVSX0lOREVYX1dJRFRIKQorCQkJKyBzdGF0ZS0+dGFibGVbRUZYX0ZJTFRFUl9UQUJMRV9SWF9NQUNdLnNpemU7CisJZWxzZSBpZiAoc3RhdGUtPnRhYmxlW0VGWF9GSUxURVJfVEFCTEVfUlhfSVBdLnNpemUgIT0gMCkKKwkJcmV0dXJuICgoRUZYX0ZJTFRFUl9UQUJMRV9SWF9JUCArIDEpIDw8IEVGWF9GSUxURVJfSU5ERVhfV0lEVEgpCisJCQkrIHN0YXRlLT50YWJsZVtFRlhfRklMVEVSX1RBQkxFX1JYX0lQXS5zaXplOworCWVsc2UKKwkJcmV0dXJuIDA7CiB9CiAKIC8qKgpAQCAtMzg0LDE0ICs1MDMsMTQgQEAKICAqIE9uIHN1Y2Nlc3MsIHJldHVybiB0aGUgZmlsdGVyIElELgogICogT24gZmFpbHVyZSwgcmV0dXJuIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KICAqLwotaW50IGVmeF9maWx0ZXJfaW5zZXJ0X2ZpbHRlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjLAorczMyIGVmeF9maWx0ZXJfaW5zZXJ0X2ZpbHRlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjLAogCQkJICAgICBib29sIHJlcGxhY2UpCiB7CiAJc3RydWN0IGVmeF9maWx0ZXJfc3RhdGUgKnN0YXRlID0gZWZ4LT5maWx0ZXJfc3RhdGU7CiAJc3RydWN0IGVmeF9maWx0ZXJfdGFibGUgKnRhYmxlID0gZWZ4X2ZpbHRlcl9zcGVjX3RhYmxlKHN0YXRlLCBzcGVjKTsKIAlzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzYXZlZF9zcGVjOwogCWVmeF9vd29yZF90IGZpbHRlcjsKLQlpbnQgZmlsdGVyX2lkeCwgZGVwdGg7CisJdW5zaWduZWQgaW50IGZpbHRlcl9pZHgsIGRlcHRoOwogCXUzMiBrZXk7CiAJaW50IHJjOwogCkBAIC00MzksNyArNTU4LDcgQEAKIAluZXRpZl92ZGJnKGVmeCwgaHcsIGVmeC0+bmV0X2RldiwKIAkJICAgIiVzOiBmaWx0ZXIgdHlwZSAlZCBpbmRleCAlZCByeHEgJXUgc2V0IiwKIAkJICAgX19mdW5jX18sIHNwZWMtPnR5cGUsIGZpbHRlcl9pZHgsIHNwZWMtPmRtYXFfaWQpOwotCXJjID0gZWZ4X2ZpbHRlcl9tYWtlX2lkKHRhYmxlLT5pZCwgZmlsdGVyX2lkeCk7CisJcmMgPSBlZnhfZmlsdGVyX21ha2VfaWQodGFibGUtPmlkLCBmaWx0ZXJfaWR4LCBzcGVjLT5mbGFncyk7CiAKIG91dDoKIAlzcGluX3VubG9ja19iaCgmc3RhdGUtPmxvY2spOwpAQCAtNDQ4LDcgKzU2Nyw3IEBACiAKIHN0YXRpYyB2b2lkIGVmeF9maWx0ZXJfdGFibGVfY2xlYXJfZW50cnkoc3RydWN0IGVmeF9uaWMgKmVmeCwKIAkJCQkJIHN0cnVjdCBlZnhfZmlsdGVyX3RhYmxlICp0YWJsZSwKLQkJCQkJIGludCBmaWx0ZXJfaWR4KQorCQkJCQkgdW5zaWduZWQgaW50IGZpbHRlcl9pZHgpCiB7CiAJc3RhdGljIGVmeF9vd29yZF90IGZpbHRlcjsKIApAQCAtNDYzLDQ4ICs1ODIsMTAxIEBACiB9CiAKIC8qKgotICogZWZ4X2ZpbHRlcl9yZW1vdmVfZmlsdGVyIC0gcmVtb3ZlIGEgZmlsdGVyIGJ5IHNwZWNpZmljYXRpb24KKyAqIGVmeF9maWx0ZXJfcmVtb3ZlX2lkX3NhZmUgLSByZW1vdmUgYSBmaWx0ZXIgYnkgSUQsIGNhcmVmdWxseQogICogQGVmeDogTklDIGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBmaWx0ZXIKLSAqIEBzcGVjOiBTcGVjaWZpY2F0aW9uIGZvciB0aGUgZmlsdGVyCisgKiBAcHJpb3JpdHk6IFByaW9yaXR5IG9mIGZpbHRlciwgYXMgcGFzc2VkIHRvIEBlZnhfZmlsdGVyX2luc2VydF9maWx0ZXIKKyAqIEBmaWx0ZXJfaWQ6IElEIG9mIGZpbHRlciwgYXMgcmV0dXJuZWQgYnkgQGVmeF9maWx0ZXJfaW5zZXJ0X2ZpbHRlcgogICoKLSAqIE9uIHN1Y2Nlc3MsIHJldHVybiB6ZXJvLgotICogT24gZmFpbHVyZSwgcmV0dXJuIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCByYW5nZS1jaGVjayBAZmlsdGVyX2lkLCBzbyBpdCBpcyBzYWZlIHRvIGNhbGwKKyAqIHdpdGggYSB2YWx1ZSBwYXNzZWQgZnJvbSB1c2VybGFuZC4KICAqLwotaW50IGVmeF9maWx0ZXJfcmVtb3ZlX2ZpbHRlcihzdHJ1Y3QgZWZ4X25pYyAqZWZ4LCBzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjKQoraW50IGVmeF9maWx0ZXJfcmVtb3ZlX2lkX3NhZmUoc3RydWN0IGVmeF9uaWMgKmVmeCwKKwkJCSAgICAgIGVudW0gZWZ4X2ZpbHRlcl9wcmlvcml0eSBwcmlvcml0eSwKKwkJCSAgICAgIHUzMiBmaWx0ZXJfaWQpCiB7CiAJc3RydWN0IGVmeF9maWx0ZXJfc3RhdGUgKnN0YXRlID0gZWZ4LT5maWx0ZXJfc3RhdGU7Ci0Jc3RydWN0IGVmeF9maWx0ZXJfdGFibGUgKnRhYmxlID0gZWZ4X2ZpbHRlcl9zcGVjX3RhYmxlKHN0YXRlLCBzcGVjKTsKLQlzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzYXZlZF9zcGVjOwotCWVmeF9vd29yZF90IGZpbHRlcjsKLQlpbnQgZmlsdGVyX2lkeCwgZGVwdGg7Ci0JdTMyIGtleTsKKwllbnVtIGVmeF9maWx0ZXJfdGFibGVfaWQgdGFibGVfaWQ7CisJc3RydWN0IGVmeF9maWx0ZXJfdGFibGUgKnRhYmxlOworCXVuc2lnbmVkIGludCBmaWx0ZXJfaWR4OworCXN0cnVjdCBlZnhfZmlsdGVyX3NwZWMgKnNwZWM7CisJdTggZmlsdGVyX2ZsYWdzOwogCWludCByYzsKIAotCWlmICghdGFibGUpCi0JCXJldHVybiAtRUlOVkFMOworCXRhYmxlX2lkID0gZWZ4X2ZpbHRlcl9pZF90YWJsZV9pZChmaWx0ZXJfaWQpOworCWlmICgodW5zaWduZWQgaW50KXRhYmxlX2lkID49IEVGWF9GSUxURVJfVEFCTEVfQ09VTlQpCisJCXJldHVybiAtRU5PRU5UOworCXRhYmxlID0gJnN0YXRlLT50YWJsZVt0YWJsZV9pZF07CiAKLQlrZXkgPSBlZnhfZmlsdGVyX2J1aWxkKCZmaWx0ZXIsIHNwZWMpOworCWZpbHRlcl9pZHggPSBlZnhfZmlsdGVyX2lkX2luZGV4KGZpbHRlcl9pZCk7CisJaWYgKGZpbHRlcl9pZHggPj0gdGFibGUtPnNpemUpCisJCXJldHVybiAtRU5PRU5UOworCXNwZWMgPSAmdGFibGUtPnNwZWNbZmlsdGVyX2lkeF07CisKKwlmaWx0ZXJfZmxhZ3MgPSBlZnhfZmlsdGVyX2lkX2ZsYWdzKGZpbHRlcl9pZCk7CiAKIAlzcGluX2xvY2tfYmgoJnN0YXRlLT5sb2NrKTsKIAotCXJjID0gZWZ4X2ZpbHRlcl9zZWFyY2godGFibGUsIHNwZWMsIGtleSwgZmFsc2UsICZkZXB0aCk7Ci0JaWYgKHJjIDwgMCkKLQkJZ290byBvdXQ7Ci0JZmlsdGVyX2lkeCA9IHJjOwotCXNhdmVkX3NwZWMgPSAmdGFibGUtPnNwZWNbZmlsdGVyX2lkeF07Ci0KLQlpZiAoc3BlYy0+cHJpb3JpdHkgPCBzYXZlZF9zcGVjLT5wcmlvcml0eSkgewotCQlyYyA9IC1FUEVSTTsKLQkJZ290byBvdXQ7CisJaWYgKHRlc3RfYml0KGZpbHRlcl9pZHgsIHRhYmxlLT51c2VkX2JpdG1hcCkgJiYKKwkgICAgc3BlYy0+cHJpb3JpdHkgPT0gcHJpb3JpdHkgJiYgc3BlYy0+ZmxhZ3MgPT0gZmlsdGVyX2ZsYWdzKSB7CisJCWVmeF9maWx0ZXJfdGFibGVfY2xlYXJfZW50cnkoZWZ4LCB0YWJsZSwgZmlsdGVyX2lkeCk7CisJCWlmICh0YWJsZS0+dXNlZCA9PSAwKQorCQkJZWZ4X2ZpbHRlcl90YWJsZV9yZXNldF9zZWFyY2hfZGVwdGgodGFibGUpOworCQlyYyA9IDA7CisJfSBlbHNlIHsKKwkJcmMgPSAtRU5PRU5UOwogCX0KIAotCWVmeF9maWx0ZXJfdGFibGVfY2xlYXJfZW50cnkoZWZ4LCB0YWJsZSwgZmlsdGVyX2lkeCk7Ci0JaWYgKHRhYmxlLT51c2VkID09IDApCi0JCWVmeF9maWx0ZXJfdGFibGVfcmVzZXRfc2VhcmNoX2RlcHRoKHRhYmxlKTsKLQlyYyA9IDA7Ci0KLW91dDoKIAlzcGluX3VubG9ja19iaCgmc3RhdGUtPmxvY2spOworCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGVmeF9maWx0ZXJfZ2V0X2ZpbHRlcl9zYWZlIC0gcmV0cmlldmUgYSBmaWx0ZXIgYnkgSUQsIGNhcmVmdWxseQorICogQGVmeDogTklDIGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBmaWx0ZXIKKyAqIEBwcmlvcml0eTogUHJpb3JpdHkgb2YgZmlsdGVyLCBhcyBwYXNzZWQgdG8gQGVmeF9maWx0ZXJfaW5zZXJ0X2ZpbHRlcgorICogQGZpbHRlcl9pZDogSUQgb2YgZmlsdGVyLCBhcyByZXR1cm5lZCBieSBAZWZ4X2ZpbHRlcl9pbnNlcnRfZmlsdGVyCisgKiBAc3BlYzogQnVmZmVyIGluIHdoaWNoIHRvIHN0b3JlIGZpbHRlciBzcGVjaWZpY2F0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJhbmdlLWNoZWNrIEBmaWx0ZXJfaWQsIHNvIGl0IGlzIHNhZmUgdG8gY2FsbAorICogd2l0aCBhIHZhbHVlIHBhc3NlZCBmcm9tIHVzZXJsYW5kLgorICovCitpbnQgZWZ4X2ZpbHRlcl9nZXRfZmlsdGVyX3NhZmUoc3RydWN0IGVmeF9uaWMgKmVmeCwKKwkJCSAgICAgICBlbnVtIGVmeF9maWx0ZXJfcHJpb3JpdHkgcHJpb3JpdHksCisJCQkgICAgICAgdTMyIGZpbHRlcl9pZCwgc3RydWN0IGVmeF9maWx0ZXJfc3BlYyAqc3BlY19idWYpCit7CisJc3RydWN0IGVmeF9maWx0ZXJfc3RhdGUgKnN0YXRlID0gZWZ4LT5maWx0ZXJfc3RhdGU7CisJZW51bSBlZnhfZmlsdGVyX3RhYmxlX2lkIHRhYmxlX2lkOworCXN0cnVjdCBlZnhfZmlsdGVyX3RhYmxlICp0YWJsZTsKKwlzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjOworCXVuc2lnbmVkIGludCBmaWx0ZXJfaWR4OworCXU4IGZpbHRlcl9mbGFnczsKKwlpbnQgcmM7CisKKwl0YWJsZV9pZCA9IGVmeF9maWx0ZXJfaWRfdGFibGVfaWQoZmlsdGVyX2lkKTsKKwlpZiAoKHVuc2lnbmVkIGludCl0YWJsZV9pZCA+PSBFRlhfRklMVEVSX1RBQkxFX0NPVU5UKQorCQlyZXR1cm4gLUVOT0VOVDsKKwl0YWJsZSA9ICZzdGF0ZS0+dGFibGVbdGFibGVfaWRdOworCisJZmlsdGVyX2lkeCA9IGVmeF9maWx0ZXJfaWRfaW5kZXgoZmlsdGVyX2lkKTsKKwlpZiAoZmlsdGVyX2lkeCA+PSB0YWJsZS0+c2l6ZSkKKwkJcmV0dXJuIC1FTk9FTlQ7CisJc3BlYyA9ICZ0YWJsZS0+c3BlY1tmaWx0ZXJfaWR4XTsKKworCWZpbHRlcl9mbGFncyA9IGVmeF9maWx0ZXJfaWRfZmxhZ3MoZmlsdGVyX2lkKTsKKworCXNwaW5fbG9ja19iaCgmc3RhdGUtPmxvY2spOworCisJaWYgKHRlc3RfYml0KGZpbHRlcl9pZHgsIHRhYmxlLT51c2VkX2JpdG1hcCkgJiYKKwkgICAgc3BlYy0+cHJpb3JpdHkgPT0gcHJpb3JpdHkgJiYgc3BlYy0+ZmxhZ3MgPT0gZmlsdGVyX2ZsYWdzKSB7CisJCSpzcGVjX2J1ZiA9ICpzcGVjOworCQlyYyA9IDA7CisJfSBlbHNlIHsKKwkJcmMgPSAtRU5PRU5UOworCX0KKworCXNwaW5fdW5sb2NrX2JoKCZzdGF0ZS0+bG9jayk7CisKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTUxNCw3ICs2ODYsNyBAQAogewogCXN0cnVjdCBlZnhfZmlsdGVyX3N0YXRlICpzdGF0ZSA9IGVmeC0+ZmlsdGVyX3N0YXRlOwogCXN0cnVjdCBlZnhfZmlsdGVyX3RhYmxlICp0YWJsZSA9ICZzdGF0ZS0+dGFibGVbdGFibGVfaWRdOwotCWludCBmaWx0ZXJfaWR4OworCXVuc2lnbmVkIGludCBmaWx0ZXJfaWR4OwogCiAJc3Bpbl9sb2NrX2JoKCZzdGF0ZS0+bG9jayk7CiAKQEAgLTUzOCw2ICs3MTAsNjggQEAKIAllZnhfZmlsdGVyX3RhYmxlX2NsZWFyKGVmeCwgRUZYX0ZJTFRFUl9UQUJMRV9SWF9NQUMsIHByaW9yaXR5KTsKIH0KIAordTMyIGVmeF9maWx0ZXJfY291bnRfcnhfdXNlZChzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAorCQkJICAgICBlbnVtIGVmeF9maWx0ZXJfcHJpb3JpdHkgcHJpb3JpdHkpCit7CisJc3RydWN0IGVmeF9maWx0ZXJfc3RhdGUgKnN0YXRlID0gZWZ4LT5maWx0ZXJfc3RhdGU7CisJZW51bSBlZnhfZmlsdGVyX3RhYmxlX2lkIHRhYmxlX2lkOworCXN0cnVjdCBlZnhfZmlsdGVyX3RhYmxlICp0YWJsZTsKKwl1bnNpZ25lZCBpbnQgZmlsdGVyX2lkeDsKKwl1MzIgY291bnQgPSAwOworCisJc3Bpbl9sb2NrX2JoKCZzdGF0ZS0+bG9jayk7CisKKwlmb3IgKHRhYmxlX2lkID0gRUZYX0ZJTFRFUl9UQUJMRV9SWF9JUDsKKwkgICAgIHRhYmxlX2lkIDw9IEVGWF9GSUxURVJfVEFCTEVfUlhfTUFDOworCSAgICAgdGFibGVfaWQrKykgeworCQl0YWJsZSA9ICZzdGF0ZS0+dGFibGVbdGFibGVfaWRdOworCQlmb3IgKGZpbHRlcl9pZHggPSAwOyBmaWx0ZXJfaWR4IDwgdGFibGUtPnNpemU7IGZpbHRlcl9pZHgrKykgeworCQkJaWYgKHRlc3RfYml0KGZpbHRlcl9pZHgsIHRhYmxlLT51c2VkX2JpdG1hcCkgJiYKKwkJCSAgICB0YWJsZS0+c3BlY1tmaWx0ZXJfaWR4XS5wcmlvcml0eSA9PSBwcmlvcml0eSkKKwkJCQkrK2NvdW50OworCQl9CisJfQorCisJc3Bpbl91bmxvY2tfYmgoJnN0YXRlLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKworczMyIGVmeF9maWx0ZXJfZ2V0X3J4X2lkcyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4LAorCQkJICBlbnVtIGVmeF9maWx0ZXJfcHJpb3JpdHkgcHJpb3JpdHksCisJCQkgIHUzMiAqYnVmLCB1MzIgc2l6ZSkKK3sKKwlzdHJ1Y3QgZWZ4X2ZpbHRlcl9zdGF0ZSAqc3RhdGUgPSBlZngtPmZpbHRlcl9zdGF0ZTsKKwllbnVtIGVmeF9maWx0ZXJfdGFibGVfaWQgdGFibGVfaWQ7CisJc3RydWN0IGVmeF9maWx0ZXJfdGFibGUgKnRhYmxlOworCXVuc2lnbmVkIGludCBmaWx0ZXJfaWR4OworCXMzMiBjb3VudCA9IDA7CisKKwlzcGluX2xvY2tfYmgoJnN0YXRlLT5sb2NrKTsKKworCWZvciAodGFibGVfaWQgPSBFRlhfRklMVEVSX1RBQkxFX1JYX0lQOworCSAgICAgdGFibGVfaWQgPD0gRUZYX0ZJTFRFUl9UQUJMRV9SWF9NQUM7CisJICAgICB0YWJsZV9pZCsrKSB7CisJCXRhYmxlID0gJnN0YXRlLT50YWJsZVt0YWJsZV9pZF07CisJCWZvciAoZmlsdGVyX2lkeCA9IDA7IGZpbHRlcl9pZHggPCB0YWJsZS0+c2l6ZTsgZmlsdGVyX2lkeCsrKSB7CisJCQlpZiAodGVzdF9iaXQoZmlsdGVyX2lkeCwgdGFibGUtPnVzZWRfYml0bWFwKSAmJgorCQkJICAgIHRhYmxlLT5zcGVjW2ZpbHRlcl9pZHhdLnByaW9yaXR5ID09IHByaW9yaXR5KSB7CisJCQkJaWYgKGNvdW50ID09IHNpemUpIHsKKwkJCQkJY291bnQgPSAtRU1TR1NJWkU7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlidWZbY291bnQrK10gPSBlZnhfZmlsdGVyX21ha2VfaWQoCisJCQkJCXRhYmxlX2lkLCBmaWx0ZXJfaWR4LAorCQkJCQl0YWJsZS0+c3BlY1tmaWx0ZXJfaWR4XS5mbGFncyk7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJc3Bpbl91bmxvY2tfYmgoJnN0YXRlLT5sb2NrKTsKKworCXJldHVybiBjb3VudDsKK30KKwogLyogUmVzdG9yZSBmaWx0ZXIgc3RhdGVyIGFmdGVyIHJlc2V0ICovCiB2b2lkIGVmeF9yZXN0b3JlX2ZpbHRlcnMoc3RydWN0IGVmeF9uaWMgKmVmeCkKIHsKQEAgLTU0NSw3ICs3NzksNyBAQAogCWVudW0gZWZ4X2ZpbHRlcl90YWJsZV9pZCB0YWJsZV9pZDsKIAlzdHJ1Y3QgZWZ4X2ZpbHRlcl90YWJsZSAqdGFibGU7CiAJZWZ4X293b3JkX3QgZmlsdGVyOwotCWludCBmaWx0ZXJfaWR4OworCXVuc2lnbmVkIGludCBmaWx0ZXJfaWR4OwogCiAJc3Bpbl9sb2NrX2JoKCZzdGF0ZS0+bG9jayk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9maWx0ZXIuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9maWx0ZXIuaAppbmRleCA4NzJmMjEzLi4zZDQxMDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvZmlsdGVyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL2ZpbHRlci5oCkBAIC03OCw2ICs3OCwxMSBAQAogICoKICAqIFVzZSB0aGUgZWZ4X2ZpbHRlcl9zZXRfKigpIGZ1bmN0aW9ucyB0byBpbml0aWFsaXNlIHRoZSBAdHlwZSBhbmQKICAqIEBkYXRhIGZpZWxkcy4KKyAqCisgKiBUaGUgQHByaW9yaXR5IGZpZWxkIGlzIHVzZWQgYnkgc29mdHdhcmUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBuZXcKKyAqIGZpbHRlciBtYXkgcmVwbGFjZSBhbiBvbGQgb25lLiAgVGhlIGhhcmR3YXJlIHByaW9yaXR5IG9mIGEgZmlsdGVyCisgKiBkZXBlbmRzIG9uIHRoZSBmaWx0ZXIgdHlwZSBhbmQgJUVGWF9GSUxURVJfRkxBR19SWF9PVkVSUklERV9JUAorICogZmxhZy4KICAqLwogc3RydWN0IGVmeF9maWx0ZXJfc3BlYyB7CiAJdTgJdHlwZTo0OwpAQCAtMTAwLDExICsxMDUsMTggQEAKIAogZXh0ZXJuIGludCBlZnhfZmlsdGVyX3NldF9pcHY0X2xvY2FsKHN0cnVjdCBlZnhfZmlsdGVyX3NwZWMgKnNwZWMsIHU4IHByb3RvLAogCQkJCSAgICAgX19iZTMyIGhvc3QsIF9fYmUxNiBwb3J0KTsKK2V4dGVybiBpbnQgZWZ4X2ZpbHRlcl9nZXRfaXB2NF9sb2NhbChjb25zdCBzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjLAorCQkJCSAgICAgdTggKnByb3RvLCBfX2JlMzIgKmhvc3QsIF9fYmUxNiAqcG9ydCk7CiBleHRlcm4gaW50IGVmeF9maWx0ZXJfc2V0X2lwdjRfZnVsbChzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjLCB1OCBwcm90bywKIAkJCQkgICAgX19iZTMyIGhvc3QsIF9fYmUxNiBwb3J0LAogCQkJCSAgICBfX2JlMzIgcmhvc3QsIF9fYmUxNiBycG9ydCk7CitleHRlcm4gaW50IGVmeF9maWx0ZXJfZ2V0X2lwdjRfZnVsbChjb25zdCBzdHJ1Y3QgZWZ4X2ZpbHRlcl9zcGVjICpzcGVjLAorCQkJCSAgICB1OCAqcHJvdG8sIF9fYmUzMiAqaG9zdCwgX19iZTE2ICpwb3J0LAorCQkJCSAgICBfX2JlMzIgKnJob3N0LCBfX2JlMTYgKnJwb3J0KTsKIGV4dGVybiBpbnQgZWZ4X2ZpbHRlcl9zZXRfZXRoX2xvY2FsKHN0cnVjdCBlZnhfZmlsdGVyX3NwZWMgKnNwZWMsCiAJCQkJICAgIHUxNiB2aWQsIGNvbnN0IHU4ICphZGRyKTsKK2V4dGVybiBpbnQgZWZ4X2ZpbHRlcl9nZXRfZXRoX2xvY2FsKGNvbnN0IHN0cnVjdCBlZnhfZmlsdGVyX3NwZWMgKnNwZWMsCisJCQkJICAgIHUxNiAqdmlkLCB1OCAqYWRkcik7CiBlbnVtIHsKIAlFRlhfRklMVEVSX1ZJRF9VTlNQRUMgPSAweGZmZmYsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL210ZC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL210ZC5jCmluZGV4IGI2MzA0NDguLmJjOWRjZDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9tdGQuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbXRkLmMKQEAgLTQ5Niw3ICs0OTYsNyBAQAogCQlyYyA9IGVmeF9tY2RpX252cmFtX3VwZGF0ZV9zdGFydChlZngsIHBhcnQtPm1jZGkubnZyYW1fdHlwZSk7CiAJCWlmIChyYykKIAkJCWdvdG8gb3V0OwotCQlwYXJ0LT5tY2RpLnVwZGF0aW5nID0gMTsKKwkJcGFydC0+bWNkaS51cGRhdGluZyA9IHRydWU7CiAJfQogCiAJLyogVGhlIE1DREkgaW50ZXJmYWNlIGNhbiBpbiBmYWN0IGRvIG11bHRpcGxlIGVyYXNlIGJsb2NrcyBhdCBvbmNlOwpAQCAtNTI4LDcgKzUyOCw3IEBACiAJCXJjID0gZWZ4X21jZGlfbnZyYW1fdXBkYXRlX3N0YXJ0KGVmeCwgcGFydC0+bWNkaS5udnJhbV90eXBlKTsKIAkJaWYgKHJjKQogCQkJZ290byBvdXQ7Ci0JCXBhcnQtPm1jZGkudXBkYXRpbmcgPSAxOworCQlwYXJ0LT5tY2RpLnVwZGF0aW5nID0gdHJ1ZTsKIAl9CiAKIAl3aGlsZSAob2Zmc2V0IDwgZW5kKSB7CkBAIC01NTMsNyArNTUzLDcgQEAKIAlpbnQgcmMgPSAwOwogCiAJaWYgKHBhcnQtPm1jZGkudXBkYXRpbmcpIHsKLQkJcGFydC0+bWNkaS51cGRhdGluZyA9IDA7CisJCXBhcnQtPm1jZGkudXBkYXRpbmcgPSBmYWxzZTsKIAkJcmMgPSBlZnhfbWNkaV9udnJhbV91cGRhdGVfZmluaXNoKGVmeCwgcGFydC0+bWNkaS5udnJhbV90eXBlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uZXRfZHJpdmVyLmggYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvbmV0X2RyaXZlci5oCmluZGV4IGI4ZTI1MWEuLmM0OTUwMmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9uZXRfZHJpdmVyLmgKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL25ldF9kcml2ZXIuaApAQCAtOTA4LDcgKzkwOCw3IEBACiAJdW5zaWduZWQgaW50IHBoeXNfYWRkcl9jaGFubmVsczsKIAl1bnNpZ25lZCBpbnQgdHhfZGNfYmFzZTsKIAl1bnNpZ25lZCBpbnQgcnhfZGNfYmFzZTsKLQl1MzIgb2ZmbG9hZF9mZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdCBvZmZsb2FkX2ZlYXR1cmVzOwogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvcnguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9yeC5jCmluZGV4IDc1MmQ1MjEuLmFjYTM0OTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy9yeC5jCkBAIC00NzksMTEgKzQ3OSw4IEBACiAJCWlmIChlZngtPm5ldF9kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpCiAJCQlza2ItPnJ4aGFzaCA9IGVmeF9yeF9idWZfaGFzaChlaCk7CiAKLQkJc2tiX2ZyYWdfc2V0X3BhZ2Uoc2tiLCAwLCBwYWdlKTsKLQkJc2tiX3NoaW5mbyhza2IpLT5mcmFnc1swXS5wYWdlX29mZnNldCA9Ci0JCQllZnhfcnhfYnVmX29mZnNldChlZngsIHJ4X2J1Zik7Ci0JCXNrYl9mcmFnX3NpemVfc2V0KCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzWzBdLCByeF9idWYtPmxlbik7Ci0JCXNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3MgPSAxOworCQlza2JfZmlsbF9wYWdlX2Rlc2Moc2tiLCAwLCBwYWdlLAorCQkJCSAgIGVmeF9yeF9idWZfb2Zmc2V0KGVmeCwgcnhfYnVmKSwgcnhfYnVmLT5sZW4pOwogCiAJCXNrYi0+bGVuID0gcnhfYnVmLT5sZW47CiAJCXNrYi0+ZGF0YV9sZW4gPSByeF9idWYtPmxlbjsKQEAgLTY2OSw3ICs2NjYsNyBAQAogCQkgIHJ4X3F1ZXVlLT5wdHJfbWFzayk7CiAKIAkvKiBBbGxvY2F0ZSBSWCBidWZmZXJzICovCi0JcnhfcXVldWUtPmJ1ZmZlciA9IGt6YWxsb2MoZW50cmllcyAqIHNpemVvZigqcnhfcXVldWUtPmJ1ZmZlciksCisJcnhfcXVldWUtPmJ1ZmZlciA9IGtjYWxsb2MoZW50cmllcywgc2l6ZW9mKCpyeF9xdWV1ZS0+YnVmZmVyKSwKIAkJCQkgICBHRlBfS0VSTkVMKTsKIAlpZiAoIXJ4X3F1ZXVlLT5idWZmZXIpCiAJCXJldHVybiAtRU5PTUVNOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NlbGZ0ZXN0LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuYwppbmRleCA4MjJmNmMyLi41MmVkZDI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2VsZnRlc3QuYwpAQCAtNTAzLDggKzUwMyw4IEBACiAJCS8qIERldGVybWluZSBob3cgbWFueSBwYWNrZXRzIHRvIHNlbmQgKi8KIAkJc3RhdGUtPnBhY2tldF9jb3VudCA9IGVmeC0+dHhxX2VudHJpZXMgLyAzOwogCQlzdGF0ZS0+cGFja2V0X2NvdW50ID0gbWluKDEgPDwgKGkgPDwgMiksIHN0YXRlLT5wYWNrZXRfY291bnQpOwotCQlzdGF0ZS0+c2ticyA9IGt6YWxsb2Moc2l6ZW9mKHN0YXRlLT5za2JzWzBdKSAqCi0JCQkJICAgICAgc3RhdGUtPnBhY2tldF9jb3VudCwgR0ZQX0tFUk5FTCk7CisJCXN0YXRlLT5za2JzID0ga2NhbGxvYyhzdGF0ZS0+cGFja2V0X2NvdW50LAorCQkJCSAgICAgIHNpemVvZihzdGF0ZS0+c2tic1swXSksIEdGUF9LRVJORUwpOwogCQlpZiAoIXN0YXRlLT5za2JzKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJCXN0YXRlLT5mbHVzaCA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2ZjL3NpZW5hLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2llbmEuYwppbmRleCBjYzI1NDljLi40ZDVkNjE5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2llbmEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvc2llbmEuYwpAQCAtMjMyLDcgKzIzMiw3IEBACiBzdGF0aWMgaW50IHNpZW5hX3Byb2JlX25pYyhzdHJ1Y3QgZWZ4X25pYyAqZWZ4KQogewogCXN0cnVjdCBzaWVuYV9uaWNfZGF0YSAqbmljX2RhdGE7Ci0JYm9vbCBhbHJlYWR5X2F0dGFjaGVkID0gMDsKKwlib29sIGFscmVhZHlfYXR0YWNoZWQgPSBmYWxzZTsKIAllZnhfb3dvcmRfdCByZWc7CiAJaW50IHJjOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvdHguYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NmYy90eC5jCmluZGV4IGRmODhjNTQzLi43MmYwZmJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvdHguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZmMvdHguYwpAQCAtMzEsNyArMzEsOSBAQAogI2RlZmluZSBFRlhfVFhRX1RIUkVTSE9MRChfZWZ4KSAoKF9lZngpLT50eHFfZW50cmllcyAvIDJ1KQogCiBzdGF0aWMgdm9pZCBlZnhfZGVxdWV1ZV9idWZmZXIoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUsCi0JCQkgICAgICAgc3RydWN0IGVmeF90eF9idWZmZXIgKmJ1ZmZlcikKKwkJCSAgICAgICBzdHJ1Y3QgZWZ4X3R4X2J1ZmZlciAqYnVmZmVyLAorCQkJICAgICAgIHVuc2lnbmVkIGludCAqcGt0c19jb21wbCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgKmJ5dGVzX2NvbXBsKQogewogCWlmIChidWZmZXItPnVubWFwX2xlbikgewogCQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IHR4X3F1ZXVlLT5lZngtPnBjaV9kZXY7CkBAIC00OCw2ICs1MCw4IEBACiAJfQogCiAJaWYgKGJ1ZmZlci0+c2tiKSB7CisJCSgqcGt0c19jb21wbCkrKzsKKwkJKCpieXRlc19jb21wbCkgKz0gYnVmZmVyLT5za2ItPmxlbjsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoKHN0cnVjdCBza19idWZmICopIGJ1ZmZlci0+c2tiKTsKIAkJYnVmZmVyLT5za2IgPSBOVUxMOwogCQluZXRpZl92ZGJnKHR4X3F1ZXVlLT5lZngsIHR4X2RvbmUsIHR4X3F1ZXVlLT5lZngtPm5ldF9kZXYsCkBAIC0yNTAsNiArMjU0LDggQEAKIAlidWZmZXItPnNrYiA9IHNrYjsKIAlidWZmZXItPmNvbnRpbnVhdGlvbiA9IGZhbHNlOwogCisJbmV0ZGV2X3R4X3NlbnRfcXVldWUodHhfcXVldWUtPmNvcmVfdHhxLCBza2ItPmxlbik7CisKIAkvKiBQYXNzIG9mZiB0byBoYXJkd2FyZSAqLwogCWVmeF9uaWNfcHVzaF9idWZmZXJzKHR4X3F1ZXVlKTsKIApAQCAtMjY3LDEwICsyNzMsMTEgQEAKICB1bndpbmQ6CiAJLyogV29yayBiYWNrd2FyZHMgdW50aWwgd2UgaGl0IHRoZSBvcmlnaW5hbCBpbnNlcnQgcG9pbnRlciB2YWx1ZSAqLwogCXdoaWxlICh0eF9xdWV1ZS0+aW5zZXJ0X2NvdW50ICE9IHR4X3F1ZXVlLT53cml0ZV9jb3VudCkgeworCQl1bnNpZ25lZCBpbnQgcGt0c19jb21wbCA9IDAsIGJ5dGVzX2NvbXBsID0gMDsKIAkJLS10eF9xdWV1ZS0+aW5zZXJ0X2NvdW50OwogCQlpbnNlcnRfcHRyID0gdHhfcXVldWUtPmluc2VydF9jb3VudCAmIHR4X3F1ZXVlLT5wdHJfbWFzazsKIAkJYnVmZmVyID0gJnR4X3F1ZXVlLT5idWZmZXJbaW5zZXJ0X3B0cl07Ci0JCWVmeF9kZXF1ZXVlX2J1ZmZlcih0eF9xdWV1ZSwgYnVmZmVyKTsKKwkJZWZ4X2RlcXVldWVfYnVmZmVyKHR4X3F1ZXVlLCBidWZmZXIsICZwa3RzX2NvbXBsLCAmYnl0ZXNfY29tcGwpOwogCQlidWZmZXItPmxlbiA9IDA7CiAJfQogCkBAIC0yOTMsNyArMzAwLDkgQEAKICAqIHNwZWNpZmllZCBpbmRleC4KICAqLwogc3RhdGljIHZvaWQgZWZ4X2RlcXVldWVfYnVmZmVycyhzdHJ1Y3QgZWZ4X3R4X3F1ZXVlICp0eF9xdWV1ZSwKLQkJCQl1bnNpZ25lZCBpbnQgaW5kZXgpCisJCQkJdW5zaWduZWQgaW50IGluZGV4LAorCQkJCXVuc2lnbmVkIGludCAqcGt0c19jb21wbCwKKwkJCQl1bnNpZ25lZCBpbnQgKmJ5dGVzX2NvbXBsKQogewogCXN0cnVjdCBlZnhfbmljICplZnggPSB0eF9xdWV1ZS0+ZWZ4OwogCXVuc2lnbmVkIGludCBzdG9wX2luZGV4LCByZWFkX3B0cjsKQEAgLTMxMSw3ICszMjAsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAKLQkJZWZ4X2RlcXVldWVfYnVmZmVyKHR4X3F1ZXVlLCBidWZmZXIpOworCQllZnhfZGVxdWV1ZV9idWZmZXIodHhfcXVldWUsIGJ1ZmZlciwgcGt0c19jb21wbCwgYnl0ZXNfY29tcGwpOwogCQlidWZmZXItPmNvbnRpbnVhdGlvbiA9IHRydWU7CiAJCWJ1ZmZlci0+bGVuID0gMDsKIApAQCAtNDIyLDEwICs0MzEsMTIgQEAKIHsKIAl1bnNpZ25lZCBmaWxsX2xldmVsOwogCXN0cnVjdCBlZnhfbmljICplZnggPSB0eF9xdWV1ZS0+ZWZ4OworCXVuc2lnbmVkIGludCBwa3RzX2NvbXBsID0gMCwgYnl0ZXNfY29tcGwgPSAwOwogCiAJRUZYX0JVR19PTl9QQVJBTk9JRChpbmRleCA+IHR4X3F1ZXVlLT5wdHJfbWFzayk7CiAKLQllZnhfZGVxdWV1ZV9idWZmZXJzKHR4X3F1ZXVlLCBpbmRleCk7CisJZWZ4X2RlcXVldWVfYnVmZmVycyh0eF9xdWV1ZSwgaW5kZXgsICZwa3RzX2NvbXBsLCAmYnl0ZXNfY29tcGwpOworCW5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUodHhfcXVldWUtPmNvcmVfdHhxLCBwa3RzX2NvbXBsLCBieXRlc19jb21wbCk7CiAKIAkvKiBTZWUgaWYgd2UgbmVlZCB0byByZXN0YXJ0IHRoZSBuZXRpZiBxdWV1ZS4gIFRoaXMgYmFycmllcgogCSAqIHNlcGFyYXRlcyB0aGUgdXBkYXRlIG9mIHJlYWRfY291bnQgZnJvbSB0aGUgdGVzdCBvZiB0aGUKQEAgLTQ2OCw3ICs0NzksNyBAQAogCQkgIHR4X3F1ZXVlLT5xdWV1ZSwgZWZ4LT50eHFfZW50cmllcywgdHhfcXVldWUtPnB0cl9tYXNrKTsKIAogCS8qIEFsbG9jYXRlIHNvZnR3YXJlIHJpbmcgKi8KLQl0eF9xdWV1ZS0+YnVmZmVyID0ga3phbGxvYyhlbnRyaWVzICogc2l6ZW9mKCp0eF9xdWV1ZS0+YnVmZmVyKSwKKwl0eF9xdWV1ZS0+YnVmZmVyID0ga2NhbGxvYyhlbnRyaWVzLCBzaXplb2YoKnR4X3F1ZXVlLT5idWZmZXIpLAogCQkJCSAgIEdGUF9LRVJORUwpOwogCWlmICghdHhfcXVldWUtPmJ1ZmZlcikKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC01MTUsMTMgKzUyNiwxNSBAQAogCiAJLyogRnJlZSBhbnkgYnVmZmVycyBsZWZ0IGluIHRoZSByaW5nICovCiAJd2hpbGUgKHR4X3F1ZXVlLT5yZWFkX2NvdW50ICE9IHR4X3F1ZXVlLT53cml0ZV9jb3VudCkgeworCQl1bnNpZ25lZCBpbnQgcGt0c19jb21wbCA9IDAsIGJ5dGVzX2NvbXBsID0gMDsKIAkJYnVmZmVyID0gJnR4X3F1ZXVlLT5idWZmZXJbdHhfcXVldWUtPnJlYWRfY291bnQgJiB0eF9xdWV1ZS0+cHRyX21hc2tdOwotCQllZnhfZGVxdWV1ZV9idWZmZXIodHhfcXVldWUsIGJ1ZmZlcik7CisJCWVmeF9kZXF1ZXVlX2J1ZmZlcih0eF9xdWV1ZSwgYnVmZmVyLCAmcGt0c19jb21wbCwgJmJ5dGVzX2NvbXBsKTsKIAkJYnVmZmVyLT5jb250aW51YXRpb24gPSB0cnVlOwogCQlidWZmZXItPmxlbiA9IDA7CiAKIAkJKyt0eF9xdWV1ZS0+cmVhZF9jb3VudDsKIAl9CisJbmV0ZGV2X3R4X3Jlc2V0X3F1ZXVlKHR4X3F1ZXVlLT5jb3JlX3R4cSk7CiB9CiAKIHZvaWQgZWZ4X2ZpbmlfdHhfcXVldWUoc3RydWN0IGVmeF90eF9xdWV1ZSAqdHhfcXVldWUpCkBAIC0xMTYwLDYgKzExNzMsOCBAQAogCQkJZ290byBtZW1fZXJyOwogCX0KIAorCW5ldGRldl90eF9zZW50X3F1ZXVlKHR4X3F1ZXVlLT5jb3JlX3R4cSwgc2tiLT5sZW4pOworCiAJLyogUGFzcyBvZmYgdG8gaGFyZHdhcmUgKi8KIAllZnhfbmljX3B1c2hfYnVmZmVycyh0eF9xdWV1ZSk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NnaS9tZXRoLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zZ2kvbWV0aC5jCmluZGV4IDYwMTM1YWEuLjUzZWZlN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3NnaS9tZXRoLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2dpL21ldGguYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3RjcC5oPiAgICAgICAgIC8qIHN0cnVjdCB0Y3BoZHIgKi8KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlIDxsaW51eC9taWkuaD4gICAgICAgICAvKiBNSUkgZGVmaW5pdGlvbnMgKi8KKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPgogCiAjaW5jbHVkZSA8YXNtL2lwMzIvbWFjZS5oPgogI2luY2x1ZGUgPGFzbS9pcDMyL2lwMzJfaW50cy5oPgpAQCAtNTgsMTIgKzU5LDE5IEBACiBtb2R1bGVfcGFyYW0odGltZW91dCwgaW50LCAwKTsKIAogLyoKKyAqIE1heGltdW0gbnVtYmVyIG9mIG11bHRpY2FzdCBhZGRyZXNzZXMgdG8gZmlsdGVyICh2cy4gUngtYWxsLW11bHRpY2FzdCkuCisgKiBNQUNFIEV0aGVybmV0IHVzZXMgYSA2NCBlbGVtZW50IGhhc2ggdGFibGUgYmFzZWQgb24gdGhlIEV0aGVybmV0IENSQy4KKyAqLworI2RlZmluZSBNRVRIX01DRl9MSU1JVCAzMgorCisvKgogICogVGhpcyBzdHJ1Y3R1cmUgaXMgcHJpdmF0ZSB0byBlYWNoIGRldmljZS4gSXQgaXMgdXNlZCB0byBwYXNzCiAgKiBwYWNrZXRzIGluIGFuZCBvdXQsIHNvIHRoZXJlIGlzIHBsYWNlIGZvciBhIHBhY2tldAogICovCiBzdHJ1Y3QgbWV0aF9wcml2YXRlIHsKIAkvKiBpbi1tZW1vcnkgY29weSBvZiBNQUMgQ29udHJvbCByZWdpc3RlciAqLwotCXVuc2lnbmVkIGxvbmcgbWFjX2N0cmw7CisJdTY0IG1hY19jdHJsOworCiAJLyogaW4tbWVtb3J5IGNvcHkgb2YgRE1BIENvbnRyb2wgcmVnaXN0ZXIgKi8KIAl1bnNpZ25lZCBsb25nIGRtYV9jdHJsOwogCS8qIGFkZHJlc3Mgb2YgUEhZLCB1c2VkIGJ5IG1kaW9fKiBmdW5jdGlvbnMsIGluaXRpYWxpemVkIGluIG1kaW9fcHJvYmUgKi8KQEAgLTc5LDYgKzg3LDkgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqcnhfc2tic1tSWF9SSU5HX0VOVFJJRVNdOwogCXVuc2lnbmVkIGxvbmcgcnhfd3JpdGU7CiAKKwkvKiBNdWx0aWNhc3QgZmlsdGVyLiAqLworCXU2NCBtY2FzdF9maWx0ZXI7CisKIAlzcGlubG9ja190IG1ldGhfbG9jazsKIH07CiAKQEAgLTc2NSw2ICs3NzYsNDAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIG1ldGhfc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbWV0aF9wcml2YXRlICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbmV0aWZfc3RvcF9xdWV1ZShkZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5tZXRoX2xvY2ssIGZsYWdzKTsKKwlwcml2LT5tYWNfY3RybCAmPSB+TUVUSF9QUk9NSVNDOworCisJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfUFJPTUlTQykgeworCQlwcml2LT5tYWNfY3RybCB8PSBNRVRIX1BST01JU0M7CisJCXByaXYtPm1jYXN0X2ZpbHRlciA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMOworCX0gZWxzZSBpZiAoKG5ldGRldl9tY19jb3VudChkZXYpID4gTUVUSF9NQ0ZfTElNSVQpIHx8CisJCSAgIChkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJKSkgeworCQlwcml2LT5tYWNfY3RybCB8PSBNRVRIX0FDQ0VQVF9BTUNBU1Q7CisJCXByaXYtPm1jYXN0X2ZpbHRlciA9IDB4ZmZmZmZmZmZmZmZmZmZmZlVMOworCX0gZWxzZSB7CisJCXN0cnVjdCBuZXRkZXZfaHdfYWRkciAqaGE7CisJCXByaXYtPm1hY19jdHJsIHw9IE1FVEhfQUNDRVBUX01DQVNUOworCisJCW5ldGRldl9mb3JfZWFjaF9tY19hZGRyKGhhLCBkZXYpCisJCQlzZXRfYml0KChldGhlcl9jcmMoRVRIX0FMRU4sIGhhLT5hZGRyKSA+PiAyNiksCisJCQkgICAgICAgICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopJnByaXYtPm1jYXN0X2ZpbHRlcik7CisJfQorCisJLyogV3JpdGUgdGhlIGNoYW5nZXMgdG8gdGhlIGNoaXAgcmVnaXN0ZXJzLiAqLworCW1hY2UtPmV0aC5tYWNfY3RybCA9IHByaXYtPm1hY19jdHJsOworCW1hY2UtPmV0aC5tY2FzdF9maWx0ZXIgPSBwcml2LT5tY2FzdF9maWx0ZXI7CisKKwkvKiBEb25lISAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPm1ldGhfbG9jaywgZmxhZ3MpOworCW5ldGlmX3dha2VfcXVldWUoZGV2KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBtZXRoX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuCQk9IG1ldGhfb3BlbiwKIAkubmRvX3N0b3AJCT0gbWV0aF9yZWxlYXNlLApAQCAtNzc0LDYgKzgxOSw3IEBACiAJLm5kb19jaGFuZ2VfbXR1CQk9IGV0aF9jaGFuZ2VfbXR1LAogCS5uZG9fdmFsaWRhdGVfYWRkcgk9IGV0aF92YWxpZGF0ZV9hZGRyLAogCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gZXRoX21hY19hZGRyLAorCS5uZG9fc2V0X3J4X21vZGUgICAgCT0gbWV0aF9zZXRfcnhfbW9kZSwKIH07CiAKIC8qCkBAIC04MzAsMjQgKzg3Niw3IEBACiAJfQogfTsKIAotc3RhdGljIGludCBfX2luaXQgbWV0aF9pbml0X21vZHVsZSh2b2lkKQotewotCWludCBlcnI7Ci0KLQllcnIgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJm1ldGhfZHJpdmVyKTsKLQlpZiAoZXJyKQotCQlwcmludGsoS0VSTl9FUlIgIkRyaXZlciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKLQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBtZXRoX2V4aXRfbW9kdWxlKHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJm1ldGhfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQobWV0aF9pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChtZXRoX2V4aXRfbW9kdWxlKTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobWV0aF9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJJbHlhIFZvbHluZXRzIDxpbHlhQHRoZUlseWEuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTR0kgTzIgQnVpbHRpbiBGYXN0IEV0aGVybmV0IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczE5MC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczE5MC5jCmluZGV4IDFiNDY1OGMuLjViMTE4Y2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXMxOTAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzMTkwLmMKQEAgLTQ3LDggKzQ3LDYgQEAKICNkZWZpbmUgc2lzMTkwX3J4X3NrYgkJCW5ldGlmX3J4CiAjZGVmaW5lIHNpczE5MF9yeF9xdW90YShjb3VudCwgcXVvdGEpCWNvdW50CiAKLSNkZWZpbmUgTUFDX0FERFJfTEVOCQk2Ci0KICNkZWZpbmUgTlVNX1RYX0RFU0MJCTY0CS8qIFs4Li4xMDI0XSAqLwogI2RlZmluZSBOVU1fUlhfREVTQwkJNjQJLyogWzguLjgxOTJdICovCiAjZGVmaW5lIFRYX1JJTkdfQllURVMJCShOVU1fVFhfREVTQyAqIHNpemVvZihzdHJ1Y3QgVHhEZXNjKSkKQEAgLTE2MDEsNyArMTU5OSw3IEBACiAJfQogCiAJLyogR2V0IE1BQyBhZGRyZXNzIGZyb20gRUVQUk9NICovCi0JZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTiAvIDI7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTiAvIDI7IGkrKykgewogCQl1MTYgdyA9IHNpczE5MF9yZWFkX2VlcHJvbShpb2FkZHIsIEVFUFJPTU1BQ0FkZHIgKyBpKTsKIAogCQkoKF9fbGUxNiAqKWRldi0+ZGV2X2FkZHIpW2ldID0gY3B1X3RvX2xlMTYodyk7CkBAIC0xNjUzLDcgKzE2NTEsNyBAQAogCXVkZWxheSg1MCk7CiAJcGNpX3JlYWRfY29uZmlnX2J5dGUoaXNhX2JyaWRnZSwgMHg0OCwgJnJlZyk7CiAKLSAgICAgICAgZm9yIChpID0gMDsgaSA8IE1BQ19BRERSX0xFTjsgaSsrKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBFVEhfQUxFTjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgb3V0YigweDkgKyBpLCAweDc4KTsKICAgICAgICAgICAgICAgICBkZXYtPmRldl9hZGRyW2ldID0gaW5iKDB4NzkpOwogICAgICAgICB9CkBAIC0xNjkyLDcgKzE2OTAsNyBAQAogCSAqLwogCVNJU19XMTYoUnhNYWNDb250cm9sLCBjdGwgJiB+MHgwZjAwKTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQUNfQUREUl9MRU47IGkrKykKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKIAkJU0lTX1c4KFJ4TWFjQWRkciArIGksIGRldi0+ZGV2X2FkZHJbaV0pOwogCiAJU0lTX1cxNihSeE1hY0NvbnRyb2wsIGN0bCk7CkBAIC0xNzYwLDkgKzE3NTgsMTAgQEAKIHsKIAlzdHJ1Y3Qgc2lzMTkwX3ByaXZhdGUgKnRwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUodHAtPnBjaV9kZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHRwLT5wY2lfZGV2KSwKKwkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyBpbnQgc2lzMTkwX2dldF9yZWdzX2xlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczkwMC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc2lzL3NpczkwMC5jCmluZGV4IGExODRhYmMuLmM4ZWZjNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Npcy9zaXM5MDAuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zaXMvc2lzOTAwLmMKQEAgLTE5OTEsOSArMTk5MSwxMCBAQAogewogCXN0cnVjdCBzaXM5MDBfcHJpdmF0ZSAqc2lzX3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAotCXN0cmNweSAoaW5mby0+ZHJpdmVyLCBTSVM5MDBfTU9EVUxFX05BTUUpOwotCXN0cmNweSAoaW5mby0+dmVyc2lvbiwgU0lTOTAwX0RSVl9WRVJTSU9OKTsKLQlzdHJjcHkgKGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShzaXNfcHJpdi0+cGNpX2RldikpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBTSVM5MDBfTU9EVUxFX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIFNJUzkwMF9EUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShzaXNfcHJpdi0+cGNpX2RldiksCisJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiBzdGF0aWMgdTMyIHNpczkwMF9nZXRfbXNnbGV2ZWwoc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL2VwaWMxMDAuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2MvZXBpYzEwMC5jCmluZGV4IDBhNWRmYjguLjJjMDc3Y2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2MvZXBpYzEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2MvZXBpYzEwMC5jCkBAIC0xNDE0LDkgKzE0MTQsOSBAQAogewogCXN0cnVjdCBlcGljX3ByaXZhdGUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXN0cmNweSAoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5IChpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7Ci0Jc3RyY3B5IChpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBjaV9kZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKG5wLT5wY2lfZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyBpbnQgbmV0ZGV2X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTExeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MTF4LmMKaW5kZXggOGY2MWZlOS4uMzEzYmEzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MTF4LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MTF4LmMKQEAgLTIxOTYsMTUgKzIxOTYsNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzbWM5MTF4X2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzbWM5MTF4X2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzbWM5MTF4X2NsZWFudXAodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc21jOTExeF9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChzbWM5MTF4X2luaXQpOwotbW9kdWxlX2V4aXQoc21jOTExeF9jbGVhbnVwKTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc21jOTExeF9kcml2ZXIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MWM5Ml9jcy5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MWM5Ml9jcy5jCmluZGV4IGNiZmE5ODEuLmFkYTkyN2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTFjOTJfY3MuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxYzkyX2NzLmMKQEAgLTE5MDksOCArMTkwOSw4IEBACiAKIHN0YXRpYyB2b2lkIHNtY19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CiB9CiAKIHN0YXRpYyBpbnQgc21jX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmVjbWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbWM5MXguYwppbmRleCBmNDdmODFlLi42NGFkM2VkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3NtYzkxeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21jOTF4LmMKQEAgLTI0MTcsMTUgKzI0MTcsNCBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzbWNfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNtY19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgc21jX2NsZWFudXAodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc21jX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHNtY19pbml0KTsKLW1vZHVsZV9leGl0KHNtY19jbGVhbnVwKTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc21jX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5MTF4LmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5MTF4LmMKaW5kZXggODg0MzA3MS4uOWQwYjhjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTExeC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzkxMXguYwpAQCAtNDQsNiArNDQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPgogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9idWcuaD4KQEAgLTg4LDYgKzg5LDggQEAKIAkJCQl1bnNpZ25lZCBpbnQgKmJ1ZiwgdW5zaWduZWQgaW50IHdvcmRjb3VudCk7CiB9OwogCisjZGVmaW5lIFNNU0M5MTFYX05VTV9TVVBQTElFUyAyCisKIHN0cnVjdCBzbXNjOTExeF9kYXRhIHsKIAl2b2lkIF9faW9tZW0gKmlvYWRkcjsKIApAQCAtMTM4LDYgKzE0MSw5IEBACiAKIAkvKiByZWdpc3RlciBhY2Nlc3MgZnVuY3Rpb25zICovCiAJY29uc3Qgc3RydWN0IHNtc2M5MTF4X29wcyAqb3BzOworCisJLyogcmVndWxhdG9ycyAqLworCXN0cnVjdCByZWd1bGF0b3JfYnVsa19kYXRhIHN1cHBsaWVzW1NNU0M5MTFYX05VTV9TVVBQTElFU107CiB9OwogCiAvKiBFYXN5IGFjY2VzcyB0byBpbmZvcm1hdGlvbiAqLwpAQCAtMzYyLDYgKzM2OCw3NiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBkYXRhLT5kZXZfbG9jaywgZmxhZ3MpOwogfQogCisvKgorICogZW5hYmxlIHJlc291cmNlcywgY3VycmVudGx5IGp1c3QgcmVndWxhdG9ycy4KKyAqLworc3RhdGljIGludCBzbXNjOTExeF9lbmFibGVfcmVzb3VyY2VzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc21zYzkxMXhfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCXJldCA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZShBUlJBWV9TSVpFKHBkYXRhLT5zdXBwbGllcyksCisJCQlwZGF0YS0+c3VwcGxpZXMpOworCWlmIChyZXQpCisJCW5ldGRldl9lcnIobmRldiwgImZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9ycyAlZFxuIiwKKwkJCQlyZXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBkaXNhYmxlIHJlc291cmNlcywgY3VycmVudGx5IGp1c3QgcmVndWxhdG9ycy4KKyAqLworc3RhdGljIGludCBzbXNjOTExeF9kaXNhYmxlX3Jlc291cmNlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmRldik7CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19kaXNhYmxlKEFSUkFZX1NJWkUocGRhdGEtPnN1cHBsaWVzKSwKKwkJCXBkYXRhLT5zdXBwbGllcyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFJlcXVlc3QgcmVzb3VyY2VzLCBjdXJyZW50bHkganVzdCByZWd1bGF0b3JzLgorICoKKyAqIFRoZSBTTVNDOTExeCBoYXMgdHdvIHBvd2VyIHBpbnM6IHZkZHZhcmlvIGFuZCB2ZGQzM2EsIGluIGRlc2lnbnMgd2hlcmUKKyAqIHRoZXNlIGFyZSBub3QgYWx3YXlzLW9uIHdlIG5lZWQgdG8gcmVxdWVzdCByZWd1bGF0b3JzIHRvIGJlIHR1cm5lZCBvbgorICogYmVmb3JlIHdlIGNhbiB0cnkgdG8gYWNjZXNzIHRoZSBkZXZpY2UgcmVnaXN0ZXJzLgorICovCitzdGF0aWMgaW50IHNtc2M5MTF4X3JlcXVlc3RfcmVzb3VyY2VzKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlzdHJ1Y3Qgc21zYzkxMXhfZGF0YSAqcGRhdGEgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIFJlcXVlc3QgcmVndWxhdG9ycyAqLworCXBkYXRhLT5zdXBwbGllc1swXS5zdXBwbHkgPSAidmRkMzNhIjsKKwlwZGF0YS0+c3VwcGxpZXNbMV0uc3VwcGx5ID0gInZkZHZhcmlvIjsKKwlyZXQgPSByZWd1bGF0b3JfYnVsa19nZXQoJnBkZXYtPmRldiwKKwkJCUFSUkFZX1NJWkUocGRhdGEtPnN1cHBsaWVzKSwKKwkJCXBkYXRhLT5zdXBwbGllcyk7CisJaWYgKHJldCkKKwkJbmV0ZGV2X2VycihuZGV2LCAiY291bGRuJ3QgZ2V0IHJlZ3VsYXRvcnMgJWRcbiIsCisJCQkJcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogRnJlZSByZXNvdXJjZXMsIGN1cnJlbnRseSBqdXN0IHJlZ3VsYXRvcnMuCisgKgorICovCitzdGF0aWMgdm9pZCBzbXNjOTExeF9mcmVlX3Jlc291cmNlcyhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwkvKiBGcmVlIHJlZ3VsYXRvcnMgKi8KKwlyZWd1bGF0b3JfYnVsa19mcmVlKEFSUkFZX1NJWkUocGRhdGEtPnN1cHBsaWVzKSwKKwkJCXBkYXRhLT5zdXBwbGllcyk7Cit9CisKIC8qIHdhaXRzIGZvciBNQUMgbm90IGJ1c3ksIHdpdGggdGltZW91dC4gIE9ubHkgY2FsbGVkIGJ5IHNtc2M5MTF4X21hY19yZWFkCiAgKiBhbmQgc21zYzkxMXhfbWFjX3dyaXRlLCBzbyBhc3N1bWVzIG1hY19sb2NrIGlzIGhlbGQgKi8KIHN0YXRpYyBpbnQgc21zYzkxMXhfbWFjX2NvbXBsZXRlKHN0cnVjdCBzbXNjOTExeF9kYXRhICpwZGF0YSkKQEAgLTEyNDMsMTAgKzEzMTksOTIgQEAKIAlzcGluX3VubG9jaygmcGRhdGEtPm1hY19sb2NrKTsKIH0KIAorc3RhdGljIGludCBzbXNjOTExeF9waHlfZGlzYWJsZV9lbmVyZ3lfZGV0ZWN0KHN0cnVjdCBzbXNjOTExeF9kYXRhICpwZGF0YSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCFwZGF0YS0+cGh5X2RldikKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwaHlfcmVhZChwZGF0YS0+cGh5X2RldiwgTUlJX0xBTjgzQzE4NV9DVFJMX1NUQVRVUyk7CisKKwlpZiAocmMgPCAwKSB7CisJCVNNU0NfV0FSTihwZGF0YSwgZHJ2LCAiRmFpbGVkIHJlYWRpbmcgUEhZIGNvbnRyb2wgcmVnIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKgorCSAqIElmIGVuZXJneSBpcyBkZXRlY3RlZCB0aGUgUEhZIGlzIGFscmVhZHkgYXdha2Ugc28gaXMgbm90IG5lY2Vzc2FyeQorCSAqIHRvIGRpc2FibGUgdGhlIGVuZXJneSBkZXRlY3QgcG93ZXItZG93biBtb2RlLgorCSAqLworCWlmICgocmMgJiBNSUlfTEFOODNDMTg1X0VEUFdSRE9XTikgJiYKKwkgICAgIShyYyAmIE1JSV9MQU44M0MxODVfRU5FUkdZT04pKSB7CisJCS8qIERpc2FibGUgZW5lcmd5IGRldGVjdCBtb2RlIGZvciB0aGlzIFNNU0MgVHJhbnNjZWl2ZXJzICovCisJCXJjID0gcGh5X3dyaXRlKHBkYXRhLT5waHlfZGV2LCBNSUlfTEFOODNDMTg1X0NUUkxfU1RBVFVTLAorCQkJICAgICAgIHJjICYgKH5NSUlfTEFOODNDMTg1X0VEUFdSRE9XTikpOworCisJCWlmIChyYyA8IDApIHsKKwkJCVNNU0NfV0FSTihwZGF0YSwgZHJ2LCAiRmFpbGVkIHdyaXRpbmcgUEhZIGNvbnRyb2wgcmVnIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQltZGVsYXkoMSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc21zYzkxMXhfcGh5X2VuYWJsZV9lbmVyZ3lfZGV0ZWN0KHN0cnVjdCBzbXNjOTExeF9kYXRhICpwZGF0YSkKK3sKKwlpbnQgcmMgPSAwOworCisJaWYgKCFwZGF0YS0+cGh5X2RldikKKwkJcmV0dXJuIHJjOworCisJcmMgPSBwaHlfcmVhZChwZGF0YS0+cGh5X2RldiwgTUlJX0xBTjgzQzE4NV9DVFJMX1NUQVRVUyk7CisKKwlpZiAocmMgPCAwKSB7CisJCVNNU0NfV0FSTihwZGF0YSwgZHJ2LCAiRmFpbGVkIHJlYWRpbmcgUEhZIGNvbnRyb2wgcmVnIik7CisJCXJldHVybiByYzsKKwl9CisKKwkvKiBPbmx5IGVuYWJsZSBpZiBlbmVyZ3kgZGV0ZWN0IG1vZGUgaXMgYWxyZWFkeSBkaXNhYmxlZCAqLworCWlmICghKHJjICYgTUlJX0xBTjgzQzE4NV9FRFBXUkRPV04pKSB7CisJCW1kZWxheSgxMDApOworCQkvKiBFbmFibGUgZW5lcmd5IGRldGVjdCBtb2RlIGZvciB0aGlzIFNNU0MgVHJhbnNjZWl2ZXJzICovCisJCXJjID0gcGh5X3dyaXRlKHBkYXRhLT5waHlfZGV2LCBNSUlfTEFOODNDMTg1X0NUUkxfU1RBVFVTLAorCQkJICAgICAgIHJjIHwgTUlJX0xBTjgzQzE4NV9FRFBXUkRPV04pOworCisJCWlmIChyYyA8IDApIHsKKwkJCVNNU0NfV0FSTihwZGF0YSwgZHJ2LCAiRmFpbGVkIHdyaXRpbmcgUEhZIGNvbnRyb2wgcmVnIik7CisJCQlyZXR1cm4gcmM7CisJCX0KKworCQltZGVsYXkoMSk7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHNtc2M5MTF4X3NvZnRfcmVzZXQoc3RydWN0IHNtc2M5MTF4X2RhdGEgKnBkYXRhKQogewogCXVuc2lnbmVkIGludCB0aW1lb3V0OwogCXVuc2lnbmVkIGludCB0ZW1wOworCWludCByZXQ7CisKKwkvKgorCSAqIExBTjkyMTAvTEFOOTIxMS9MQU45MjIwL0xBTjkyMjEgY2hpcHMgaGF2ZSBhbiBpbnRlcm5hbCBQSFkgdGhhdAorCSAqIGFyZSBpbml0aWFsaXplZCBpbiBhIEVuZXJneSBEZXRlY3QgUG93ZXItRG93biBtb2RlIHRoYXQgcHJldmVudHMKKwkgKiB0aGUgTUFDIGNoaXAgdG8gYmUgc29mdHdhcmUgcmVzZXRlZC4gU28gd2UgaGF2ZSB0byB3YWtldXAgdGhlIFBIWQorCSAqIGJlZm9yZS4KKwkgKi8KKwlpZiAocGRhdGEtPmdlbmVyYXRpb24gPT0gNCkgeworCQlyZXQgPSBzbXNjOTExeF9waHlfZGlzYWJsZV9lbmVyZ3lfZGV0ZWN0KHBkYXRhKTsKKworCQlpZiAocmV0KSB7CisJCQlTTVNDX1dBUk4ocGRhdGEsIGRydiwgIkZhaWxlZCB0byB3YWtldXAgdGhlIFBIWSBjaGlwIik7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQogCiAJLyogUmVzZXQgdGhlIExBTjkxMXggKi8KIAlzbXNjOTExeF9yZWdfd3JpdGUocGRhdGEsIEhXX0NGRywgSFdfQ0ZHX1NSU1RfKTsKQEAgLTEyNjAsNiArMTQxOCwxNiBAQAogCQlTTVNDX1dBUk4ocGRhdGEsIGRydiwgIkZhaWxlZCB0byBjb21wbGV0ZSByZXNldCIpOwogCQlyZXR1cm4gLUVJTzsKIAl9CisKKwlpZiAocGRhdGEtPmdlbmVyYXRpb24gPT0gNCkgeworCQlyZXQgPSBzbXNjOTExeF9waHlfZW5hYmxlX2VuZXJneV9kZXRlY3QocGRhdGEpOworCisJCWlmIChyZXQpIHsKKwkJCVNNU0NfV0FSTihwZGF0YSwgZHJ2LCAiRmFpbGVkIHRvIHdha2V1cCB0aGUgUEhZIGNoaXAiKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjA5Miw2ICsyMjYwLDkgQEAKIAogCWlvdW5tYXAocGRhdGEtPmlvYWRkcik7CiAKKwkodm9pZClzbXNjOTExeF9kaXNhYmxlX3Jlc291cmNlcyhwZGV2KTsKKwlzbXNjOTExeF9mcmVlX3Jlc291cmNlcyhwZGV2KTsKKwogCWZyZWVfbmV0ZGV2KGRldik7CiAKIAlyZXR1cm4gMDsKQEAgLTIyMTgsMTAgKzIzODksMjAgQEAKIAlwZGF0YS0+ZGV2ID0gZGV2OwogCXBkYXRhLT5tc2dfZW5hYmxlID0gKCgxIDw8IGRlYnVnKSAtIDEpOwogCisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGV2KTsKKworCXJldHZhbCA9IHNtc2M5MTF4X3JlcXVlc3RfcmVzb3VyY2VzKHBkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3JldHVybl9yZXNvdXJjZXM7CisKKwlyZXR2YWwgPSBzbXNjOTExeF9lbmFibGVfcmVzb3VyY2VzKHBkZXYpOworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X2Rpc2FibGVfcmVzb3VyY2VzOworCiAJaWYgKHBkYXRhLT5pb2FkZHIgPT0gTlVMTCkgewogCQlTTVNDX1dBUk4ocGRhdGEsIHByb2JlLCAiRXJyb3Igc21zYzkxMXggYmFzZSBhZGRyZXNzIGludmFsaWQiKTsKIAkJcmV0dmFsID0gLUVOT01FTTsKLQkJZ290byBvdXRfZnJlZV9uZXRkZXZfMjsKKwkJZ290byBvdXRfZGlzYWJsZV9yZXNvdXJjZXM7CiAJfQogCiAJcmV0dmFsID0gc21zYzkxMXhfcHJvYmVfY29uZmlnX2R0KCZwZGF0YS0+Y29uZmlnLCBucCk7CkBAIC0yMjMzLDcgKzI0MTQsNyBAQAogCiAJaWYgKHJldHZhbCkgewogCQlTTVNDX1dBUk4ocGRhdGEsIHByb2JlLCAiRXJyb3Igc21zYzkxMXggY29uZmlnIG5vdCBmb3VuZCIpOwotCQlnb3RvIG91dF91bm1hcF9pb18zOworCQlnb3RvIG91dF9kaXNhYmxlX3Jlc291cmNlczsKIAl9CiAKIAkvKiBhc3N1bWUgc3RhbmRhcmQsIG5vbi1zaGlmdGVkLCBhY2Nlc3MgdG8gSFcgcmVnaXN0ZXJzICovCkBAIC0yMjQ0LDcgKzI0MjUsNyBAQAogCiAJcmV0dmFsID0gc21zYzkxMXhfaW5pdChkZXYpOwogCWlmIChyZXR2YWwgPCAwKQotCQlnb3RvIG91dF91bm1hcF9pb18zOworCQlnb3RvIG91dF9kaXNhYmxlX3Jlc291cmNlczsKIAogCS8qIGNvbmZpZ3VyZSBpcnEgcG9sYXJpdHkgYW5kIHR5cGUgYmVmb3JlIGNvbm5lY3RpbmcgaXNyICovCiAJaWYgKHBkYXRhLT5jb25maWcuaXJxX3BvbGFyaXR5ID09IFNNU0M5MTFYX0lSUV9QT0xBUklUWV9BQ1RJVkVfSElHSCkKQEAgLTIyNjQsMTUgKzI0NDUsMTMgQEAKIAlpZiAocmV0dmFsKSB7CiAJCVNNU0NfV0FSTihwZGF0YSwgcHJvYmUsCiAJCQkgICJVbmFibGUgdG8gY2xhaW0gcmVxdWVzdGVkIGlycTogJWQiLCBkZXYtPmlycSk7Ci0JCWdvdG8gb3V0X3VubWFwX2lvXzM7CisJCWdvdG8gb3V0X2ZyZWVfaXJxOwogCX0KIAotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGRldik7Ci0KIAlyZXR2YWwgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKIAlpZiAocmV0dmFsKSB7CiAJCVNNU0NfV0FSTihwZGF0YSwgcHJvYmUsICJFcnJvciAlaSByZWdpc3RlcmluZyBkZXZpY2UiLCByZXR2YWwpOwotCQlnb3RvIG91dF91bnNldF9kcnZkYXRhXzQ7CisJCWdvdG8gb3V0X2ZyZWVfaXJxOwogCX0gZWxzZSB7CiAJCVNNU0NfVFJBQ0UocGRhdGEsIHByb2JlLAogCQkJICAgIk5ldHdvcmsgaW50ZXJmYWNlOiBcIiVzXCIiLCBkZXYtPm5hbWUpOwpAQCAtMjMyMSwxMiArMjUwMCwxNCBAQAogCiBvdXRfdW5yZWdpc3Rlcl9uZXRkZXZfNToKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotb3V0X3Vuc2V0X2RydmRhdGFfNDoKLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKK291dF9mcmVlX2lycToKIAlmcmVlX2lycShkZXYtPmlycSwgZGV2KTsKLW91dF91bm1hcF9pb18zOgorb3V0X2Rpc2FibGVfcmVzb3VyY2VzOgorCSh2b2lkKXNtc2M5MTF4X2Rpc2FibGVfcmVzb3VyY2VzKHBkZXYpOworb3V0X3JldHVybl9yZXNvdXJjZXM6CisJc21zYzkxMXhfZnJlZV9yZXNvdXJjZXMocGRldik7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CiAJaW91bm1hcChwZGF0YS0+aW9hZGRyKTsKLW91dF9mcmVlX25ldGRldl8yOgogCWZyZWVfbmV0ZGV2KGRldik7CiBvdXRfcmVsZWFzZV9pb18xOgogCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTExeC5oIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTExeC5oCmluZGV4IDhkNjdhYWMuLjkzOGVjZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzkxMXguaAorKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5MTF4LmgKQEAgLTQwMSw0ICs0MDEsOCBAQAogI2luY2x1ZGUgPGFzbS9zbXNjOTExeC5oPgogI2VuZGlmCiAKKyNpZmRlZiBDT05GSUdfU01TQ19QSFkKKyNpbmNsdWRlIDxsaW51eC9zbXNjcGh5Lmg+CisjZW5kaWYKKwogI2VuZGlmCQkJCS8qIF9fU01TQzkxMVhfSF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5NDIwLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zbXNjL3Ntc2M5NDIwLmMKaW5kZXggZWRiMjRiMC4uYTllZmJkZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc21zYy9zbXNjOTQyMC5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Ntc2Mvc21zYzk0MjAuYwpAQCAtMjc5LDkgKzI3OSwxMCBAQAogewogCXN0cnVjdCBzbXNjOTQyMF9wZGF0YSAqcGQgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCi0Jc3RyY3B5KGRydmluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShkcnZpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocGQtPnBkZXYpKTsKLQlzdHJjcHkoZHJ2aW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmxjcHkoZHJ2aW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoZHJ2aW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHBkLT5wZGV2KSwKKwkJc2l6ZW9mKGRydmluZm8tPmJ1c19pbmZvKSk7CisJc3RybGNweShkcnZpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGRydmluZm8tPnZlcnNpb24pKTsKIH0KIAogc3RhdGljIHUzMiBzbXNjOTQyMF9ldGh0b29sX2dldF9tc2dsZXZlbChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL0tjb25maWcKaW5kZXggMjI3NDVkNy4uMDM2NDI4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9LY29uZmlnCkBAIC0xMiwxMSArMTIsMzYgQEAKIAogaWYgU1RNTUFDX0VUSAogCitjb25maWcgU1RNTUFDX1BMQVRGT1JNCisJdHJpc3RhdGUgIlNUTU1BQyBwbGF0Zm9ybSBidXMgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNUTU1BQ19FVEgKKwlkZWZhdWx0IHkKKwktLS1oZWxwLS0tCisJICBUaGlzIHNlbGVjdHMgdGhlIHBsYXRmb3JtIHNwZWNpZmljIGJ1cyBzdXBwb3J0IGZvcgorCSAgdGhlIHN0bW1hYyBkZXZpY2UgZHJpdmVyLiBUaGlzIGlzIHRoZSBkcml2ZXIgdXNlZAorCSAgb24gbWFueSBlbWJlZGRlZCBTVE0gcGxhdGZvcm1zIGJhc2VkIG9uIEFSTSBhbmQgU3VwZXJICisJICBwcm9jZXNzb3JzLgorCSAgSWYgeW91IGhhdmUgYSBjb250cm9sbGVyIHdpdGggdGhpcyBpbnRlcmZhY2UsIHNheSBZIG9yIE0gaGVyZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKworY29uZmlnIFNUTU1BQ19QQ0kKKwl0cmlzdGF0ZSAiU1RNTUFDIHN1cHBvcnQgb24gUENJIGJ1cyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFNUTU1BQ19FVEggJiYgUENJICYmIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgaXMgdG8gc2VsZWN0IHRoZSBTeW5vcHN5cyBEV01BQyBhdmFpbGFibGUgb24gUENJIGRldmljZXMsCisJICBpZiB5b3UgaGF2ZSBhIGNvbnRyb2xsZXIgd2l0aCB0aGlzIGludGVyZmFjZSwgc2F5IFkgb3IgTSBoZXJlLgorCisJICBUaGlzIFBDSSBzdXBwb3J0IGlzIHRlc3RlZCBvbiBYTElOWCBYQzJWMzAwMCBGRjExNTJBTVQwMjIxCisJICBEMTIxNTk5NEEgVklSVEVYIEZQR0EgYm9hcmQuCisKKwkgIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBTVE1NQUNfREVCVUdfRlMKIAlib29sICJFbmFibGUgbW9uaXRvcmluZyB2aWEgc3lzRlMgIgogCWRlZmF1bHQgbgogCWRlcGVuZHMgb24gU1RNTUFDX0VUSCAmJiBERUJVR19GUwotCS0tIGhlbHAKKwktLS1oZWxwLS0tCiAJICBUaGUgc3RtbWFjIGVudHJ5IGluIC9zeXMgcmVwb3J0cyBETUEgVFgvUlggcmluZ3MKIAkgIG9yIChpZiBzdXBwb3J0ZWQpIHRoZSBIVyBjYXAgcmVnaXN0ZXIuCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvTWFrZWZpbGUKaW5kZXggZDdjNDUxNi4uYmM5NjVhYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvTWFrZWZpbGUKQEAgLTIsNiArMiw4IEBACiBzdG1tYWMtJChDT05GSUdfU1RNTUFDX1RJTUVSKSArPSBzdG1tYWNfdGltZXIubwogc3RtbWFjLSQoQ09ORklHX1NUTU1BQ19SSU5HKSArPSByaW5nX21vZGUubwogc3RtbWFjLSQoQ09ORklHX1NUTU1BQ19DSEFJTkVEKSArPSBjaGFpbl9tb2RlLm8KK3N0bW1hYy0kKENPTkZJR19TVE1NQUNfUExBVEZPUk0pICs9IHN0bW1hY19wbGF0Zm9ybS5vCitzdG1tYWMtJChDT05GSUdfU1RNTUFDX1BDSSkgKz0gc3RtbWFjX3BjaS5vCiBzdG1tYWMtb2Jqczo9IHN0bW1hY19tYWluLm8gc3RtbWFjX2V0aHRvb2wubyBzdG1tYWNfbWRpby5vCVwKIAkgICAgICBkd21hY19saWIubyBkd21hYzEwMDBfY29yZS5vICBkd21hYzEwMDBfZG1hLm8JXAogCSAgICAgIGR3bWFjMTAwX2NvcmUubyBkd21hYzEwMF9kbWEubyBlbmhfZGVzYy5vICBub3JtX2Rlc2MubyBcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9jb21tb24uaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2NvbW1vbi5oCmluZGV4IDJjYzExOTIuLmQwYjgxNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL2NvbW1vbi5oCkBAIC0yMiw3ICsyMiwxMSBAQAogICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpZiBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRKSB8fCBkZWZpbmVkKENPTkZJR19WTEFOXzgwMjFRX01PRFVMRSkKICNkZWZpbmUgU1RNTUFDX1ZMQU5fVEFHX1VTRUQKICNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CkBAIC0zMTUsNSArMzE5LDggQEAKIAkJCQl1bnNpZ25lZCBpbnQgaGlnaCwgdW5zaWduZWQgaW50IGxvdyk7CiBleHRlcm4gdm9pZCBzdG1tYWNfZ2V0X21hY19hZGRyKHZvaWQgX19pb21lbSAqaW9hZGRyLCB1bnNpZ25lZCBjaGFyICphZGRyLAogCQkJCXVuc2lnbmVkIGludCBoaWdoLCB1bnNpZ25lZCBpbnQgbG93KTsKKworZXh0ZXJuIHZvaWQgc3RtbWFjX3NldF9tYWModm9pZCBfX2lvbWVtICppb2FkZHIsIGJvb2wgZW5hYmxlKTsKKwogZXh0ZXJuIHZvaWQgZHdtYWNfZG1hX2ZsdXNoX3R4X2ZpZm8odm9pZCBfX2lvbWVtICppb2FkZHIpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBzdG1tYWNfcmluZ19tb2RlX29wcyByaW5nX21vZGVfb3BzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvZHdtYWNfbGliLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hY19saWIuYwppbmRleCBlMjUwOTM1Li5mMjBhYTEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hY19saWIuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9kd21hY19saWIuYwpAQCAtMjM4LDYgKzIzOCwxOSBAQAogCXdyaXRlbChkYXRhLCBpb2FkZHIgKyBsb3cpOwogfQogCisvKiBFbmFibGUgZGlzYWJsZSBNQUMgUlgvVFggKi8KK3ZvaWQgc3RtbWFjX3NldF9tYWModm9pZCBfX2lvbWVtICppb2FkZHIsIGJvb2wgZW5hYmxlKQoreworCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIE1BQ19DVFJMX1JFRyk7CisKKwlpZiAoZW5hYmxlKQorCQl2YWx1ZSB8PSBNQUNfUk5BQkxFX1JYIHwgTUFDX0VOQUJMRV9UWDsKKwllbHNlCisJCXZhbHVlICY9IH4oTUFDX0VOQUJMRV9UWCB8IE1BQ19STkFCTEVfUlgpOworCisJd3JpdGVsKHZhbHVlLCBpb2FkZHIgKyBNQUNfQ1RSTF9SRUcpOworfQorCiB2b2lkIHN0bW1hY19nZXRfbWFjX2FkZHIodm9pZCBfX2lvbWVtICppb2FkZHIsIHVuc2lnbmVkIGNoYXIgKmFkZHIsCiAJCQkgdW5zaWduZWQgaW50IGhpZ2gsIHVuc2lnbmVkIGludCBsb3cpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWMuaCBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hYy5oCmluZGV4IGExNDBhOGYuLjEyMDc0MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hYy5oCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hYy5oCkBAIC0yMCw3ICsyMCw4IEBACiAgIEF1dGhvcjogR2l1c2VwcGUgQ2F2YWxsYXJvIDxwZXBwZS5jYXZhbGxhcm9Ac3QuY29tPgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2RlZmluZSBEUlZfTU9EVUxFX1ZFUlNJT04JIk9jdF8yMDExIgorI2RlZmluZSBTVE1NQUNfUkVTT1VSQ0VfTkFNRSAgICJzdG1tYWNldGgiCisjZGVmaW5lIERSVl9NT0RVTEVfVkVSU0lPTgkiRGVjXzIwMTEiCiAjaW5jbHVkZSA8bGludXgvc3RtbWFjLmg+CiAjaW5jbHVkZSA8bGludXgvcGh5Lmg+CiAjaW5jbHVkZSAiY29tbW9uLmgiCkBAIC04Miw4ICs4MywxOCBAQAogCWludCBod19jYXBfc3VwcG9ydDsKIH07CiAKK2V4dGVybiBpbnQgcGh5YWRkcjsKKwogZXh0ZXJuIGludCBzdG1tYWNfbWRpb191bnJlZ2lzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKIGV4dGVybiBpbnQgc3RtbWFjX21kaW9fcmVnaXN0ZXIoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOwogZXh0ZXJuIHZvaWQgc3RtbWFjX3NldF9ldGh0b29sX29wcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KTsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc3RtbWFjX2Rlc2Nfb3BzIGVuaF9kZXNjX29wczsKIGV4dGVybiBjb25zdCBzdHJ1Y3Qgc3RtbWFjX2Rlc2Nfb3BzIG5kZXNjX29wczsKKworaW50IHN0bW1hY19mcmVlemUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOworaW50IHN0bW1hY19yZXN0b3JlKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKK2ludCBzdG1tYWNfcmVzdW1lKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KTsKK2ludCBzdG1tYWNfc3VzcGVuZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldik7CitpbnQgc3RtbWFjX2R2cl9yZW1vdmUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpOworc3RydWN0IHN0bW1hY19wcml2ICpzdG1tYWNfZHZyX3Byb2JlKHN0cnVjdCBkZXZpY2UgKmRldmljZSwKKwkJCQlzdHJ1Y3QgcGxhdF9zdG1tYWNlbmV0X2RhdGEgKnBsYXRfZGF0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19ldGh0b29sLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfZXRodG9vbC5jCmluZGV4IDAzOTVmOWUuLjk1NzMzMDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19ldGh0b29sLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX2V0aHRvb2wuYwpAQCAtMTg1LDkgKzE4NSwxMCBAQAogCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CiAKIAlpZiAocHJpdi0+cGxhdC0+aGFzX2dtYWMpCi0JCXN0cmNweShpbmZvLT5kcml2ZXIsIEdNQUNfRVRIVE9PTF9OQU1FKTsKKwkJc3RybGNweShpbmZvLT5kcml2ZXIsIEdNQUNfRVRIVE9PTF9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiAJZWxzZQotCQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBNQUMxMDBfRVRIVE9PTF9OQU1FKTsKKwkJc3RybGNweShpbmZvLT5kcml2ZXIsIE1BQzEwMF9FVEhUT09MX05BTUUsCisJCQlzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiAKIAlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX01PRFVMRV9WRVJTSU9OKTsKIAlpbmZvLT5md192ZXJzaW9uWzBdID0gJ1wwJzsKQEAgLTQ1OCw3ICs0NTksNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIHN0bW1hY19ldGh0b29sX29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgc3RtbWFjX2V0aHRvb2xfb3BzID0gewogCS5iZWdpbiA9IHN0bW1hY19jaGVja19pZl9ydW5uaW5nLAogCS5nZXRfZHJ2aW5mbyA9IHN0bW1hY19ldGh0b29sX2dldGRydmluZm8sCiAJLmdldF9zZXR0aW5ncyA9IHN0bW1hY19ldGh0b29sX2dldHNldHRpbmdzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX21haW4uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19tYWluLmMKaW5kZXggOGVhNzcwYS4uMzczOGI0NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX21haW4uYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfbWFpbi5jCkBAIC0yOCwxMiArMjgsOCBAQAogCWh0dHBzOi8vYnVnemlsbGEuc3RsaW51eC5jb20vCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC90Y3AuaD4KICNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KQEAgLTUyLDggKzQ4LDYgQEAKICNlbmRpZgogI2luY2x1ZGUgInN0bW1hYy5oIgogCi0jZGVmaW5lIFNUTU1BQ19SRVNPVVJDRV9OQU1FCSJzdG1tYWNldGgiCi0KICN1bmRlZiBTVE1NQUNfREVCVUcKIC8qI2RlZmluZSBTVE1NQUNfREVCVUcqLwogI2lmZGVmIFNUTU1BQ19ERUJVRwpAQCAtOTMsNyArODcsNyBAQAogbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKIE1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJNZXNzYWdlIExldmVsICgwOiBubyBvdXRwdXQsIDE2OiBhbGwpIik7CiAKLXN0YXRpYyBpbnQgcGh5YWRkciA9IC0xOworaW50IHBoeWFkZHIgPSAtMTsKIG1vZHVsZV9wYXJhbShwaHlhZGRyLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhwaHlhZGRyLCAiUGh5c2ljYWwgZGV2aWNlIGFkZHJlc3MiKTsKIApAQCAtMTQxLDYgKzEzNSwxMSBAQAogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgc3RtbWFjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogCisjaWZkZWYgQ09ORklHX1NUTU1BQ19ERUJVR19GUworc3RhdGljIGludCBzdG1tYWNfaW5pdF9mcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK3N0YXRpYyB2b2lkIHN0bW1hY19leGl0X2ZzKHZvaWQpOworI2VuZGlmCisKIC8qKgogICogc3RtbWFjX3ZlcmlmeV9hcmdzIC0gdmVyaWZ5IHRoZSBkcml2ZXIgcGFyYW1ldGVycy4KICAqIERlc2NyaXB0aW9uOiBpdCB2ZXJpZmllcyBpZiBzb21lIHdyb25nIHBhcmFtZXRlciBpcyBwYXNzZWQgdG8gdGhlIGRyaXZlci4KQEAgLTM0NSwyMiArMzQ0LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHN0bW1hY19lbmFibGVfbWFjKHZvaWQgX19pb21lbSAqaW9hZGRyKQotewotCXUzMiB2YWx1ZSA9IHJlYWRsKGlvYWRkciArIE1BQ19DVFJMX1JFRyk7Ci0KLQl2YWx1ZSB8PSBNQUNfUk5BQkxFX1JYIHwgTUFDX0VOQUJMRV9UWDsKLQl3cml0ZWwodmFsdWUsIGlvYWRkciArIE1BQ19DVFJMX1JFRyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzdG1tYWNfZGlzYWJsZV9tYWModm9pZCBfX2lvbWVtICppb2FkZHIpCi17Ci0JdTMyIHZhbHVlID0gcmVhZGwoaW9hZGRyICsgTUFDX0NUUkxfUkVHKTsKLQotCXZhbHVlICY9IH4oTUFDX0VOQUJMRV9UWCB8IE1BQ19STkFCTEVfUlgpOwotCXdyaXRlbCh2YWx1ZSwgaW9hZGRyICsgTUFDX0NUUkxfUkVHKTsKLX0KLQogLyoqCiAgKiBkaXNwbGF5X3JpbmcKICAqIEBwOiBwb2ludGVyIHRvIHRoZSByaW5nLgpAQCAtNzgxLDEwICs3NjQsMTUgQEAKIAl1bnNpZ25lZCBpbnQgbW9kZSA9IE1NQ19DTlRSTF9SRVNFVF9PTl9SRUFEIHwgTU1DX0NOVFJMX0NPVU5URVJfUkVTRVQgfAogCQkJICAgIE1NQ19DTlRSTF9QUkVTRVQgfCBNTUNfQ05UUkxfRlVMTF9IQUxGX1BSRVNFVDsKIAotCS8qIERvIG5vdCBtYW5hZ2UgTU1DIElSUSAoRklYTUUpICovCisJLyogTWFzayBNTUMgaXJxLCBjb3VudGVycyBhcmUgbWFuYWdlZCBpbiBTVyBhbmQgcmVnaXN0ZXJzCisJICogYXJlIGNsZWFyZWQgb24gZWFjaCBSRUFEIGV2ZW50dWFsbHkuICovCiAJZHdtYWNfbW1jX2ludHJfYWxsX21hc2socHJpdi0+aW9hZGRyKTsKLQlkd21hY19tbWNfY3RybChwcml2LT5pb2FkZHIsIG1vZGUpOwotCW1lbXNldCgmcHJpdi0+bW1jLCAwLCBzaXplb2Yoc3RydWN0IHN0bW1hY19jb3VudGVycykpOworCisJaWYgKHByaXYtPmRtYV9jYXAucm1vbikgeworCQlkd21hY19tbWNfY3RybChwcml2LT5pb2FkZHIsIG1vZGUpOworCQltZW1zZXQoJnByaXYtPm1tYywgMCwgc2l6ZW9mKHN0cnVjdCBzdG1tYWNfY291bnRlcnMpKTsKKwl9IGVsc2UKKwkJcHJfaW5mbygiIE5vIE1BQyBNYW5hZ2VtZW50IENvdW50ZXJzIGF2YWlsYWJsZSIpOwogfQogCiBzdGF0aWMgdTMyIHN0bW1hY19nZXRfc3lub3BzeXNfaWQoc3RydWN0IHN0bW1hY19wcml2ICpwcml2KQpAQCAtODgyLDYgKzg3MCw1MyBAQAogfQogCiAvKioKKyAqIHN0bW1hY19tYWNfZGV2aWNlX3NldHVwCisgKiBAZGV2IDogZGV2aWNlIHBvaW50ZXIKKyAqIERlc2NyaXB0aW9uOiB0aGlzIGlzIHRvIGF0dGFjaCB0aGUgR01BQyBvciBNQUMgMTAvMTAwCisgKiBtYWluIGNvcmUgc3RydWN0dXJlcyB0aGF0IHdpbGwgYmUgY29tcGxldGVkIGR1cmluZyB0aGUKKyAqIG9wZW4gc3RlcC4KKyAqLworc3RhdGljIGludCBzdG1tYWNfbWFjX2RldmljZV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CisKKwlzdHJ1Y3QgbWFjX2RldmljZV9pbmZvICpkZXZpY2U7CisKKwlpZiAocHJpdi0+cGxhdC0+aGFzX2dtYWMpCisJCWRldmljZSA9IGR3bWFjMTAwMF9zZXR1cChwcml2LT5pb2FkZHIpOworCWVsc2UKKwkJZGV2aWNlID0gZHdtYWMxMDBfc2V0dXAocHJpdi0+aW9hZGRyKTsKKworCWlmICghZGV2aWNlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXByaXYtPmh3ID0gZGV2aWNlOworCXByaXYtPmh3LT5yaW5nID0gJnJpbmdfbW9kZV9vcHM7CisKKwlpZiAoZGV2aWNlX2Nhbl93YWtldXAocHJpdi0+ZGV2aWNlKSkgeworCQlwcml2LT53b2xvcHRzID0gV0FLRV9NQUdJQzsgLyogTWFnaWMgRnJhbWUgYXMgZGVmYXVsdCAqLworCQllbmFibGVfaXJxX3dha2UocHJpdi0+d29sX2lycSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0bW1hY19jaGVja19ldGhlcl9hZGRyKHN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdikKK3sKKwkvKiB2ZXJpZnkgaWYgdGhlIE1BQyBhZGRyZXNzIGlzIHZhbGlkLCBpbiBjYXNlIG9mIGZhaWx1cmVzIGl0CisJICogZ2VuZXJhdGVzIGEgcmFuZG9tIE1BQyBhZGRyZXNzICovCisJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPmRldi0+ZGV2X2FkZHIpKSB7CisJCXByaXYtPmh3LT5tYWMtPmdldF91bWFjX2FkZHIoKHZvaWQgX19pb21lbSAqKQorCQkJCQkgICAgIHByaXYtPmRldi0+YmFzZV9hZGRyLAorCQkJCQkgICAgIHByaXYtPmRldi0+ZGV2X2FkZHIsIDApOworCQlpZiAgKCFpc192YWxpZF9ldGhlcl9hZGRyKHByaXYtPmRldi0+ZGV2X2FkZHIpKQorCQkJcmFuZG9tX2V0aGVyX2FkZHIocHJpdi0+ZGV2LT5kZXZfYWRkcik7CisJfQorCXByX3dhcm5pbmcoIiVzOiBkZXZpY2UgTUFDIGFkZHJlc3MgJXBNXG4iLCBwcml2LT5kZXYtPm5hbWUsCisJCQkJCQkgICBwcml2LT5kZXYtPmRldl9hZGRyKTsKK30KKworLyoqCiAgKiAgc3RtbWFjX29wZW4gLSBvcGVuIGVudHJ5IHBvaW50IG9mIHRoZSBkcml2ZXIKICAqICBAZGV2IDogcG9pbnRlciB0byB0aGUgZGV2aWNlIHN0cnVjdHVyZS4KICAqICBEZXNjcmlwdGlvbjoKQEAgLTg5NSwxOCArOTMwLDI4IEBACiAJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlpbnQgcmV0OwogCi0JLyogQ2hlY2sgdGhhdCB0aGUgTUFDIGFkZHJlc3MgaXMgdmFsaWQuICBJZiBpdHMgbm90LCByZWZ1c2UKLQkgKiB0byBicmluZyB0aGUgZGV2aWNlIHVwLiBUaGUgdXNlciBtdXN0IHNwZWNpZnkgYW4KLQkgKiBhZGRyZXNzIHVzaW5nIHRoZSBmb2xsb3dpbmcgbGludXggY29tbWFuZDoKLQkgKiAgICAgIGlmY29uZmlnIGV0aDAgaHcgZXRoZXIgeHg6eHg6eHg6eHg6eHg6eHggICovCi0JaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpKSB7Ci0JCXJhbmRvbV9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIpOwotCQlwcl93YXJuaW5nKCIlczogZ2VuZXJhdGVkIHJhbmRvbSBNQUMgYWRkcmVzcyAlcE1cbiIsIGRldi0+bmFtZSwKLQkJCWRldi0+ZGV2X2FkZHIpOwotCX0KKwkvKiBNQUMgSFcgZGV2aWNlIHNldHVwICovCisJcmV0ID0gc3RtbWFjX21hY19kZXZpY2Vfc2V0dXAoZGV2KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXN0bW1hY19jaGVja19ldGhlcl9hZGRyKHByaXYpOwogCiAJc3RtbWFjX3ZlcmlmeV9hcmdzKCk7CiAKKwkvKiBPdmVycmlkZSB3aXRoIGtlcm5lbCBwYXJhbWV0ZXJzIGlmIHN1cHBsaWVkIFhYWCBDUlMgWFhYCisJICogdGhpcyBuZWVkcyB0byBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyAqLworCWlmICgocGh5YWRkciA+PSAwKSAmJiAocGh5YWRkciA8PSAzMSkpCisJCXByaXYtPnBsYXQtPnBoeV9hZGRyID0gcGh5YWRkcjsKKworCS8qIE1ESU8gYnVzIFJlZ2lzdHJhdGlvbiAqLworCXJldCA9IHN0bW1hY19tZGlvX3JlZ2lzdGVyKGRldik7CisJaWYgKHJldCA8IDApIHsKKwkJcHJfZGVidWcoIiVzOiBNRElPIGJ1cyAoaWQ6ICVkKSByZWdpc3RyYXRpb24gZmFpbGVkIiwKKwkJCSBfX2Z1bmNfXywgcHJpdi0+cGxhdC0+YnVzX2lkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKICNpZmRlZiBDT05GSUdfU1RNTUFDX1RJTUVSCiAJcHJpdi0+dG0gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RtbWFjX3RpbWVyICopLCBHRlBfS0VSTkVMKTsKIAlpZiAodW5saWtlbHkocHJpdi0+dG0gPT0gTlVMTCkpIHsKQEAgLTEwMDMsNyArMTA0OCw3IEBACiAJfQogCiAJLyogRW5hYmxlIHRoZSBNQUMgUngvVHggKi8KLQlzdG1tYWNfZW5hYmxlX21hYyhwcml2LT5pb2FkZHIpOworCXN0bW1hY19zZXRfbWFjKHByaXYtPmlvYWRkciwgdHJ1ZSk7CiAKIAkvKiBTZXQgdGhlIEhXIERNQSBtb2RlIGFuZCB0aGUgQ09FICovCiAJc3RtbWFjX2RtYV9vcGVyYXRpb25fbW9kZShwcml2KTsKQEAgLTEwMTIsOSArMTA1NywxMyBAQAogCW1lbXNldCgmcHJpdi0+eHN0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHN0bW1hY19leHRyYV9zdGF0cykpOwogCXByaXYtPnhzdGF0cy50aHJlc2hvbGQgPSB0YzsKIAotCWlmIChwcml2LT5kbWFfY2FwLnJtb24pCi0JCXN0bW1hY19tbWNfc2V0dXAocHJpdik7CisJc3RtbWFjX21tY19zZXR1cChwcml2KTsKIAorI2lmZGVmIENPTkZJR19TVE1NQUNfREVCVUdfRlMKKwlyZXQgPSBzdG1tYWNfaW5pdF9mcyhkZXYpOworCWlmIChyZXQgPCAwKQorCQlwcl93YXJuaW5nKCJcdEZhaWxlZCBkZWJ1Z0ZTIHJlZ2lzdHJhdGlvbiIpOworI2VuZGlmCiAJLyogU3RhcnQgdGhlIGJhbGwgcm9sbGluZy4uLiAqLwogCURCRyhwcm9iZSwgREVCVUcsICIlczogRE1BIFJYL1RYIHByb2Nlc3NlcyBzdGFydGVkLi4uXG4iLCBkZXYtPm5hbWUpOwogCXByaXYtPmh3LT5kbWEtPnN0YXJ0X3R4KHByaXYtPmlvYWRkcik7CkBAIC0xMDg3LDEwICsxMTM2LDE1IEBACiAJZnJlZV9kbWFfZGVzY19yZXNvdXJjZXMocHJpdik7CiAKIAkvKiBEaXNhYmxlIHRoZSBNQUMgUngvVHggKi8KLQlzdG1tYWNfZGlzYWJsZV9tYWMocHJpdi0+aW9hZGRyKTsKKwlzdG1tYWNfc2V0X21hYyhwcml2LT5pb2FkZHIsIGZhbHNlKTsKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAKKyNpZmRlZiBDT05GSUdfU1RNTUFDX0RFQlVHX0ZTCisJc3RtbWFjX2V4aXRfZnMoKTsKKyNlbmRpZgorCXN0bW1hY19tZGlvX3VucmVnaXN0ZXIoZGV2KTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xNDY2LDcgKzE1MjAsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdTMyIHN0bW1hY19maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IHN0bW1hY19maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC0xNzM0LDI4ICsxNzg5LDQxIEBACiB9OwogCiAvKioKLSAqIHN0bW1hY19wcm9iZSAtIEluaXRpYWxpemF0aW9uIG9mIHRoZSBhZGFwdGVyIC4KLSAqIEBkZXYgOiBkZXZpY2UgcG9pbnRlcgotICogRGVzY3JpcHRpb246IFRoZSBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgbmV0d29yayBkZXZpY2Ugc3RydWN0dXJlIGZvcgotICogdGhlIFNUTU1BQyBkcml2ZXIuIEl0IGFsc28gY2FsbHMgdGhlIGxvdyBsZXZlbCByb3V0aW5lcwotICogaW4gb3JkZXIgdG8gaW5pdCB0aGUgSFcgKGkuZS4gdGhlIERNQSBlbmdpbmUpCisgKiBzdG1tYWNfZHZyX3Byb2JlCisgKiBAZGV2aWNlOiBkZXZpY2UgcG9pbnRlcgorICogRGVzY3JpcHRpb246IHRoaXMgaXMgdGhlIG1haW4gcHJvYmUgZnVuY3Rpb24gdXNlZCB0bworICogY2FsbCB0aGUgYWxsb2NfZXRoZXJkZXYsIGFsbG9jYXRlIHRoZSBwcml2IHN0cnVjdHVyZS4KICAqLwotc3RhdGljIGludCBzdG1tYWNfcHJvYmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0cnVjdCBzdG1tYWNfcHJpdiAqc3RtbWFjX2R2cl9wcm9iZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UsCisJCQkJCXN0cnVjdCBwbGF0X3N0bW1hY2VuZXRfZGF0YSAqcGxhdF9kYXQpCiB7CiAJaW50IHJldCA9IDA7Ci0Jc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IE5VTEw7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2OwogCi0JZXRoZXJfc2V0dXAoZGV2KTsKKwluZGV2ID0gYWxsb2NfZXRoZXJkZXYoc2l6ZW9mKHN0cnVjdCBzdG1tYWNfcHJpdikpOworCWlmICghbmRldikgeworCQlwcl9lcnIoIiVzOiBFUlJPUjogYWxsb2NhdGluZyB0aGUgZGV2aWNlXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiBOVUxMOworCX0KIAotCWRldi0+bmV0ZGV2X29wcyA9ICZzdG1tYWNfbmV0ZGV2X29wczsKLQlzdG1tYWNfc2V0X2V0aHRvb2xfb3BzKGRldik7CisJU0VUX05FVERFVl9ERVYobmRldiwgZGV2aWNlKTsKIAotCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9JUF9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU07Ci0JZGV2LT5mZWF0dXJlcyB8PSBkZXYtPmh3X2ZlYXR1cmVzIHwgTkVUSUZfRl9ISUdIRE1BOwotCWRldi0+d2F0Y2hkb2dfdGltZW8gPSBtc2Vjc190b19qaWZmaWVzKHdhdGNoZG9nKTsKKwlwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisJcHJpdi0+ZGV2aWNlID0gZGV2aWNlOworCXByaXYtPmRldiA9IG5kZXY7CisKKwlldGhlcl9zZXR1cChuZGV2KTsKKworCW5kZXYtPm5ldGRldl9vcHMgPSAmc3RtbWFjX25ldGRldl9vcHM7CisJc3RtbWFjX3NldF9ldGh0b29sX29wcyhuZGV2KTsKKworCW5kZXYtPmh3X2ZlYXR1cmVzID0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfSVBfQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNOworCW5kZXYtPmZlYXR1cmVzIHw9IG5kZXYtPmh3X2ZlYXR1cmVzIHwgTkVUSUZfRl9ISUdIRE1BOworCW5kZXYtPndhdGNoZG9nX3RpbWVvID0gbXNlY3NfdG9famlmZmllcyh3YXRjaGRvZyk7CiAjaWZkZWYgU1RNTUFDX1ZMQU5fVEFHX1VTRUQKIAkvKiBCb3RoIG1hYzEwMCBhbmQgZ21hYyBzdXBwb3J0IHJlY2VpdmUgVkxBTiB0YWcgZGV0ZWN0aW9uICovCi0JZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fUlg7CisJbmRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1JYOwogI2VuZGlmCiAJcHJpdi0+bXNnX2VuYWJsZSA9IG5ldGlmX21zZ19pbml0KGRlYnVnLCBkZWZhdWx0X21zZ19sZXZlbCk7CiAKQEAgLTE3NjMsMjQ4ICsxODMxLDYwIEBACiAJCXByaXYtPmZsb3dfY3RybCA9IEZMT1dfQVVUTzsJLyogUlgvVFggcGF1c2Ugb24gKi8KIAogCXByaXYtPnBhdXNlID0gcGF1c2U7Ci0JbmV0aWZfbmFwaV9hZGQoZGV2LCAmcHJpdi0+bmFwaSwgc3RtbWFjX3BvbGwsIDY0KTsKLQotCS8qIEdldCB0aGUgTUFDIGFkZHJlc3MgKi8KLQlwcml2LT5ody0+bWFjLT5nZXRfdW1hY19hZGRyKCh2b2lkIF9faW9tZW0gKikgZGV2LT5iYXNlX2FkZHIsCi0JCQkJICAgICBkZXYtPmRldl9hZGRyLCAwKTsKLQotCWlmICghaXNfdmFsaWRfZXRoZXJfYWRkcihkZXYtPmRldl9hZGRyKSkKLQkJcHJfd2FybmluZygiXHRubyB2YWxpZCBNQUMgYWRkcmVzczsiCi0JCQkicGxlYXNlLCB1c2UgaWZjb25maWcgb3Igbndod2NvbmZpZyFcbiIpOworCXByaXYtPnBsYXQgPSBwbGF0X2RhdDsKKwluZXRpZl9uYXBpX2FkZChuZGV2LCAmcHJpdi0+bmFwaSwgc3RtbWFjX3BvbGwsIDY0KTsKIAogCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dHhfbG9jayk7CiAKLQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoZGV2KTsKKwlyZXQgPSByZWdpc3Rlcl9uZXRkZXYobmRldik7CiAJaWYgKHJldCkgewogCQlwcl9lcnIoIiVzOiBFUlJPUiAlaSByZWdpc3RlcmluZyB0aGUgZGV2aWNlXG4iLAogCQkgICAgICAgX19mdW5jX18sIHJldCk7Ci0JCXJldHVybiAtRU5PREVWOworCQlnb3RvIGVycm9yOwogCX0KIAogCURCRyhwcm9iZSwgREVCVUcsICIlczogU2NhdHRlci9HYXRoZXI6ICVzIC0gSFcgY2hlY2tzdW1zOiAlc1xuIiwKLQkgICAgZGV2LT5uYW1lLCAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfU0cpID8gIm9uIiA6ICJvZmYiLAotCSAgICAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSVBfQ1NVTSkgPyAib24iIDogIm9mZiIpOworCSAgICBuZGV2LT5uYW1lLCAobmRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKSA/ICJvbiIgOiAib2ZmIiwKKwkgICAgKG5kZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9JUF9DU1VNKSA/ICJvbiIgOiAib2ZmIik7CiAKLQlyZXR1cm4gcmV0OwotfQorCXJldHVybiBwcml2OwogCi0vKioKLSAqIHN0bW1hY19tYWNfZGV2aWNlX3NldHVwCi0gKiBAZGV2IDogZGV2aWNlIHBvaW50ZXIKLSAqIERlc2NyaXB0aW9uOiBzZWxlY3QgYW5kIGluaXRpYWxpc2UgdGhlIG1hYyBkZXZpY2UgKG1hYzEwMCBvciBHbWFjKS4KLSAqLwotc3RhdGljIGludCBzdG1tYWNfbWFjX2RldmljZV9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7CitlcnJvcjoKKwluZXRpZl9uYXBpX2RlbCgmcHJpdi0+bmFwaSk7CiAKLQlzdHJ1Y3QgbWFjX2RldmljZV9pbmZvICpkZXZpY2U7Ci0KLQlpZiAocHJpdi0+cGxhdC0+aGFzX2dtYWMpIHsKLQkJZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9VTklDQVNUX0ZMVDsKLQkJZGV2aWNlID0gZHdtYWMxMDAwX3NldHVwKHByaXYtPmlvYWRkcik7Ci0JfSBlbHNlIHsKLQkJZGV2aWNlID0gZHdtYWMxMDBfc2V0dXAocHJpdi0+aW9hZGRyKTsKLQl9Ci0KLQlpZiAoIWRldmljZSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcml2LT5odyA9IGRldmljZTsKLQlwcml2LT5ody0+cmluZyA9ICZyaW5nX21vZGVfb3BzOwotCi0JaWYgKGRldmljZV9jYW5fd2FrZXVwKHByaXYtPmRldmljZSkpIHsKLQkJcHJpdi0+d29sb3B0cyA9IFdBS0VfTUFHSUM7IC8qIE1hZ2ljIEZyYW1lIGFzIGRlZmF1bHQgKi8KLQkJZW5hYmxlX2lycV93YWtlKHByaXYtPndvbF9pcnEpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIHN0bW1hY19kdnJfcHJvYmUKLSAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgcG9pbnRlcgotICogRGVzY3JpcHRpb246IHRoZSBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQgdGhyb3VnaCBwbGF0Zm9ybV9kZXZpY2UuCi0gKi8KLXN0YXRpYyBpbnQgc3RtbWFjX2R2cl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCByZXNvdXJjZSAqcmVzOwotCXZvaWQgX19pb21lbSAqYWRkciA9IE5VTEw7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBOVUxMOwotCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IE5VTEw7Ci0Jc3RydWN0IHBsYXRfc3RtbWFjZW5ldF9kYXRhICpwbGF0X2RhdDsKLQotCXByX2luZm8oIlNUTU1BQyBkcml2ZXI6XG5cdHBsYXRmb3JtIHJlZ2lzdHJhdGlvbi4uLiAiKTsKLQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwotCWlmICghcmVzKQotCQlyZXR1cm4gLUVOT0RFVjsKLQlwcl9pbmZvKCJcdGRvbmUhXG4iKTsKLQotCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSwKLQkJCQlwZGV2LT5uYW1lKSkgewotCQlwcl9lcnIoIiVzOiBFUlJPUjogbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIgotCQkgICAgICAgImNhbm5vdCBnZXQgdGhlIEkvTyBhZGRyIDB4JXhcbiIsCi0JCSAgICAgICBfX2Z1bmNfXywgKHVuc2lnbmVkIGludClyZXMtPnN0YXJ0KTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlhZGRyID0gaW9yZW1hcChyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOwotCWlmICghYWRkcikgewotCQlwcl9lcnIoIiVzOiBFUlJPUjogbWVtb3J5IG1hcHBpbmcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOwotCX0KLQotCW5kZXYgPSBhbGxvY19ldGhlcmRldihzaXplb2Yoc3RydWN0IHN0bW1hY19wcml2KSk7Ci0JaWYgKCFuZGV2KSB7Ci0JCXByX2VycigiJXM6IEVSUk9SOiBhbGxvY2F0aW5nIHRoZSBkZXZpY2VcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXRfdW5tYXA7Ci0JfQotCi0JU0VUX05FVERFVl9ERVYobmRldiwgJnBkZXYtPmRldik7Ci0KLQkvKiBHZXQgdGhlIE1BQyBpbmZvcm1hdGlvbiAqLwotCW5kZXYtPmlycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJtYWNpcnEiKTsKLQlpZiAobmRldi0+aXJxID09IC1FTlhJTykgewotCQlwcl9lcnIoIiVzOiBFUlJPUjogTUFDIElSUSBjb25maWd1cmF0aW9uICIKLQkJICAgICAgICJpbmZvcm1hdGlvbiBub3QgZm91bmRcbiIsIF9fZnVuY19fKTsKLQkJcmV0ID0gLUVOWElPOwotCQlnb3RvIG91dF9mcmVlX25kZXY7Ci0JfQotCi0JcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotCXByaXYtPmRldmljZSA9ICYocGRldi0+ZGV2KTsKLQlwcml2LT5kZXYgPSBuZGV2OwotCXBsYXRfZGF0ID0gcGRldi0+ZGV2LnBsYXRmb3JtX2RhdGE7Ci0KLQlwcml2LT5wbGF0ID0gcGxhdF9kYXQ7Ci0KLQlwcml2LT5pb2FkZHIgPSBhZGRyOwotCi0JLyoKLQkgKiBPbiBzb21lIHBsYXRmb3JtcyBlLmcuIFNQRUFyIHRoZSB3YWtlIHVwIGlycSBkaWZmZXJzIGZyb20gdGhlIG1hYyBpcnEKLQkgKiBUaGUgZXh0ZXJuYWwgd2FrZSB1cCBpcnEgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIHRoZSBwbGF0Zm9ybSBjb2RlCi0JICogbmFtZWQgYXMgImV0aF93YWtlX2lycSIKLQkgKgotCSAqIEluIGNhc2UgdGhlIHdha2UgdXAgaW50ZXJydXB0IGlzIG5vdCBwYXNzZWQgZnJvbSB0aGUgcGxhdGZvcm0KLQkgKiBzbyB0aGUgZHJpdmVyIHdpbGwgY29udGludWUgdG8gdXNlIHRoZSBtYWMgaXJxIChuZGV2LT5pcnEpCi0JICovCi0JcHJpdi0+d29sX2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJldGhfd2FrZV9pcnEiKTsKLQlpZiAocHJpdi0+d29sX2lycSA9PSAtRU5YSU8pCi0JCXByaXYtPndvbF9pcnEgPSBuZGV2LT5pcnE7Ci0KLQlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBuZGV2KTsKLQotCS8qIFNldCB0aGUgSS9PIGJhc2UgYWRkciAqLwotCW5kZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWFkZHI7Ci0KLQkvKiBDdXN0b20gaW5pdGlhbGlzYXRpb24gKi8KLQlpZiAocHJpdi0+cGxhdC0+aW5pdCkgewotCQlyZXQgPSBwcml2LT5wbGF0LT5pbml0KHBkZXYpOwotCQlpZiAodW5saWtlbHkocmV0KSkKLQkJCWdvdG8gb3V0X2ZyZWVfbmRldjsKLQl9Ci0KLQkvKiBNQUMgSFcgZGV2aWNlIGRldGVjdGlvbiAqLwotCXJldCA9IHN0bW1hY19tYWNfZGV2aWNlX3NldHVwKG5kZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9wbGF0X2V4aXQ7Ci0KLQkvKiBOZXR3b3JrIERldmljZSBSZWdpc3RyYXRpb24gKi8KLQlyZXQgPSBzdG1tYWNfcHJvYmUobmRldik7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X3BsYXRfZXhpdDsKLQotCS8qIE92ZXJyaWRlIHdpdGgga2VybmVsIHBhcmFtZXRlcnMgaWYgc3VwcGxpZWQgWFhYIENSUyBYWFgKLQkgKiB0aGlzIG5lZWRzIHRvIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzICovCi0JaWYgKChwaHlhZGRyID49IDApICYmIChwaHlhZGRyIDw9IDMxKSkKLQkJcHJpdi0+cGxhdC0+cGh5X2FkZHIgPSBwaHlhZGRyOwotCi0JcHJfaW5mbygiXHQlcyAtIChkZXYuIG5hbWU6ICVzIC0gaWQ6ICVkLCBJUlEgIyVkXG4iCi0JICAgICAgICJcdElPIGJhc2UgYWRkcjogMHglcClcbiIsIG5kZXYtPm5hbWUsIHBkZXYtPm5hbWUsCi0JICAgICAgIHBkZXYtPmlkLCBuZGV2LT5pcnEsIGFkZHIpOwotCi0JLyogTURJTyBidXMgUmVnaXN0cmF0aW9uICovCi0JcHJfZGVidWcoIlx0TURJTyBidXMgKGlkOiAlZCkuLi4iLCBwcml2LT5wbGF0LT5idXNfaWQpOwotCXJldCA9IHN0bW1hY19tZGlvX3JlZ2lzdGVyKG5kZXYpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF91bnJlZ2lzdGVyOwotCXByX2RlYnVnKCJyZWdpc3RlcmVkIVxuIik7Ci0KLSNpZmRlZiBDT05GSUdfU1RNTUFDX0RFQlVHX0ZTCi0JcmV0ID0gc3RtbWFjX2luaXRfZnMobmRldik7Ci0JaWYgKHJldCA8IDApCi0JCXByX3dhcm5pbmcoIlx0RmFpbGVkIGRlYnVnRlMgcmVnaXN0cmF0aW9uIik7Ci0jZW5kaWYKLQotCXJldHVybiAwOwotCi1vdXRfdW5yZWdpc3RlcjoKIAl1bnJlZ2lzdGVyX25ldGRldihuZGV2KTsKLW91dF9wbGF0X2V4aXQ6Ci0JaWYgKHByaXYtPnBsYXQtPmV4aXQpCi0JCXByaXYtPnBsYXQtPmV4aXQocGRldik7Ci1vdXRfZnJlZV9uZGV2OgogCWZyZWVfbmV0ZGV2KG5kZXYpOwotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwotb3V0X3VubWFwOgotCWlvdW5tYXAoYWRkcik7Ci1vdXRfcmVsZWFzZV9yZWdpb246Ci0JcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CiAKLQlyZXR1cm4gcmV0OworCXJldHVybiBOVUxMOwogfQogCiAvKioKICAqIHN0bW1hY19kdnJfcmVtb3ZlCi0gKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIKKyAqIEBuZGV2OiBuZXQgZGV2aWNlIHBvaW50ZXIKICAqIERlc2NyaXB0aW9uOiB0aGlzIGZ1bmN0aW9uIHJlc2V0cyB0aGUgVFgvUlggcHJvY2Vzc2VzLCBkaXNhYmxlcyB0aGUgTUFDIFJYL1RYCi0gKiBjaGFuZ2VzIHRoZSBsaW5rIHN0YXR1cywgcmVsZWFzZXMgdGhlIERNQSBkZXNjcmlwdG9yIHJpbmdzLAotICogdW5yZWdpc3RlcnMgdGhlIE1ESU8gYnVzIGFuZCB1bm1hcHMgdGhlIGFsbG9jYXRlZCBtZW1vcnkuCisgKiBjaGFuZ2VzIHRoZSBsaW5rIHN0YXR1cywgcmVsZWFzZXMgdGhlIERNQSBkZXNjcmlwdG9yIHJpbmdzLgogICovCi1zdGF0aWMgaW50IHN0bW1hY19kdnJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCitpbnQgc3RtbWFjX2R2cl9yZW1vdmUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKIAlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAogCXByX2luZm8oIiVzOlxuXHRyZW1vdmluZyBkcml2ZXIiLCBfX2Z1bmNfXyk7CiAKIAlwcml2LT5ody0+ZG1hLT5zdG9wX3J4KHByaXYtPmlvYWRkcik7CiAJcHJpdi0+aHctPmRtYS0+c3RvcF90eChwcml2LT5pb2FkZHIpOwogCi0Jc3RtbWFjX2Rpc2FibGVfbWFjKHByaXYtPmlvYWRkcik7Ci0KKwlzdG1tYWNfc2V0X21hYyhwcml2LT5pb2FkZHIsIGZhbHNlKTsKIAluZXRpZl9jYXJyaWVyX29mZihuZGV2KTsKLQotCXN0bW1hY19tZGlvX3VucmVnaXN0ZXIobmRldik7Ci0KLQlpZiAocHJpdi0+cGxhdC0+ZXhpdCkKLQkJcHJpdi0+cGxhdC0+ZXhpdChwZGV2KTsKLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCXVucmVnaXN0ZXJfbmV0ZGV2KG5kZXYpOwotCi0JaW91bm1hcCgodm9pZCAqKXByaXYtPmlvYWRkcik7Ci0JcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlyZWxlYXNlX21lbV9yZWdpb24ocmVzLT5zdGFydCwgcmVzb3VyY2Vfc2l6ZShyZXMpKTsKLQotI2lmZGVmIENPTkZJR19TVE1NQUNfREVCVUdfRlMKLQlzdG1tYWNfZXhpdF9mcygpOwotI2VuZGlmCi0KIAlmcmVlX25ldGRldihuZGV2KTsKIAogCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IHN0bW1hY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK2ludCBzdG1tYWNfc3VzcGVuZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwogCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwogCWludCBkaXNfaWMgPSAwOwogCkBAIC0yMDM4LDE1ICsxOTE4LDE0IEBACiAJaWYgKGRldmljZV9tYXlfd2FrZXVwKHByaXYtPmRldmljZSkpCiAJCXByaXYtPmh3LT5tYWMtPnBtdChwcml2LT5pb2FkZHIsIHByaXYtPndvbG9wdHMpOwogCWVsc2UKLQkJc3RtbWFjX2Rpc2FibGVfbWFjKHByaXYtPmlvYWRkcik7CisJCXN0bW1hY19zZXRfbWFjKHByaXYtPmlvYWRkciwgZmFsc2UpOwogCiAJc3Bpbl91bmxvY2soJnByaXYtPmxvY2spOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHN0bW1hY19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoraW50IHN0bW1hY19yZXN1bWUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAogCWlmICghbmV0aWZfcnVubmluZyhuZGV2KSkKQEAgLTIwNjUsNyArMTk0NCw3IEBACiAJbmV0aWZfZGV2aWNlX2F0dGFjaChuZGV2KTsKIAogCS8qIEVuYWJsZSB0aGUgTUFDIGFuZCBETUEgKi8KLQlzdG1tYWNfZW5hYmxlX21hYyhwcml2LT5pb2FkZHIpOworCXN0bW1hY19zZXRfbWFjKHByaXYtPmlvYWRkciwgdHJ1ZSk7CiAJcHJpdi0+aHctPmRtYS0+c3RhcnRfdHgocHJpdi0+aW9hZGRyKTsKIAlwcml2LT5ody0+ZG1hLT5zdGFydF9yeChwcml2LT5pb2FkZHIpOwogCkBAIC0yMDg1LDY4ICsxOTY0LDIzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc3RtbWFjX2ZyZWV6ZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitpbnQgc3RtbWFjX2ZyZWV6ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOwotCiAJaWYgKCFuZGV2IHx8ICFuZXRpZl9ydW5uaW5nKG5kZXYpKQogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzdG1tYWNfcmVsZWFzZShuZGV2KTsKIH0KIAotc3RhdGljIGludCBzdG1tYWNfcmVzdG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYpCitpbnQgc3RtbWFjX3Jlc3RvcmUoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKLQogCWlmICghbmRldiB8fCAhbmV0aWZfcnVubmluZyhuZGV2KSkKIAkJcmV0dXJuIDA7CiAKIAlyZXR1cm4gc3RtbWFjX29wZW4obmRldik7CiB9Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZGV2X3BtX29wcyBzdG1tYWNfcG1fb3BzID0gewotCS5zdXNwZW5kID0gc3RtbWFjX3N1c3BlbmQsCi0JLnJlc3VtZSA9IHN0bW1hY19yZXN1bWUsCi0JLmZyZWV6ZSA9IHN0bW1hY19mcmVlemUsCi0JLnRoYXcgPSBzdG1tYWNfcmVzdG9yZSwKLQkucmVzdG9yZSA9IHN0bW1hY19yZXN0b3JlLAotfTsKLSNlbHNlCi1zdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc3RtbWFjX3BtX29wczsKICNlbmRpZiAvKiBDT05GSUdfUE0gKi8KIAotc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgc3RtbWFjX2RyaXZlciA9IHsKLQkucHJvYmUgPSBzdG1tYWNfZHZyX3Byb2JlLAotCS5yZW1vdmUgPSBzdG1tYWNfZHZyX3JlbW92ZSwKLQkuZHJpdmVyID0gewotCQkubmFtZSA9IFNUTU1BQ19SRVNPVVJDRV9OQU1FLAotCQkub3duZXIgPSBUSElTX01PRFVMRSwKLQkJLnBtID0gJnN0bW1hY19wbV9vcHMsCi0JfSwKLX07Ci0KLS8qKgotICogc3RtbWFjX2luaXRfbW9kdWxlIC0gRW50cnkgcG9pbnQgZm9yIHRoZSBkcml2ZXIKLSAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGRyaXZlci4KLSAqLwotc3RhdGljIGludCBfX2luaXQgc3RtbWFjX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3RtbWFjX2RyaXZlcik7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBzdG1tYWNfY2xlYW51cF9tb2R1bGUgLSBDbGVhbnVwIHJvdXRpbmUgZm9yIHRoZSBkcml2ZXIKLSAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBjbGVhbnVwIHJvdXRpbmUgZm9yIHRoZSBkcml2ZXIuCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCBzdG1tYWNfY2xlYW51cF9tb2R1bGUodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc3RtbWFjX2RyaXZlcik7Ci19Ci0KICNpZm5kZWYgTU9EVUxFCiBzdGF0aWMgaW50IF9faW5pdCBzdG1tYWNfY21kbGluZV9vcHQoY2hhciAqc3RyKQogewpAQCAtMjIwNiw5ICsyMDQwLDYgQEAKIF9fc2V0dXAoInN0bW1hY2V0aD0iLCBzdG1tYWNfY21kbGluZV9vcHQpOwogI2VuZGlmCiAKLW1vZHVsZV9pbml0KHN0bW1hY19pbml0X21vZHVsZSk7Ci1tb2R1bGVfZXhpdChzdG1tYWNfY2xlYW51cF9tb2R1bGUpOwotCi1NT0RVTEVfREVTQ1JJUFRJT04oIlNUTU1BQyAxMC8xMDAvMTAwMCBFdGhlcm5ldCBkcml2ZXIiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU1RNTUFDIDEwLzEwMC8xMDAwIEV0aGVybmV0IGRldmljZSBkcml2ZXIiKTsKIE1PRFVMRV9BVVRIT1IoIkdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4iKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19tZGlvLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfbWRpby5jCmluZGV4IDljM2I5ZDUuLjUxZjQ0MTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19tZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX21kaW8uYwpAQCAtMTA5LDYgKzEwOSw3IEBACiAgKi8KIHN0YXRpYyBpbnQgc3RtbWFjX21kaW9fcmVzZXQoc3RydWN0IG1paV9idXMgKmJ1cykKIHsKKyNpZiBkZWZpbmVkKENPTkZJR19TVE1NQUNfUExBVEZPUk0pCiAJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBidXMtPnByaXY7CiAJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CiAJdW5zaWduZWQgaW50IG1paV9hZGRyZXNzID0gcHJpdi0+aHctPm1paS5hZGRyOwpAQCAtMTIzLDcgKzEyNCw3IEBACiAJICogb24gTURDLCBzbyBwZXJmb3JtIGEgZHVtbXkgbWRpbyByZWFkLgogCSAqLwogCXdyaXRlbCgwLCBwcml2LT5pb2FkZHIgKyBtaWlfYWRkcmVzcyk7Ci0KKyNlbmRpZgogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcGNpLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdG1pY3JvL3N0bW1hYy9zdG1tYWNfcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRhODE5YQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wY2kuYwpAQCAtMCwwICsxLDIyMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGhpcyBjb250YWlucyB0aGUgZnVuY3Rpb25zIHRvIGhhbmRsZSB0aGUgcGNpIGRyaXZlci4KKworICBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxMiAgVmF5YXZ5YSBMYWJzIFB2dCBMdGQKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKworICBBdXRob3I6IFJheWFnb25kIEtva2F0YW51ciA8cmF5YWdvbmRAdmF5YXZ5YWxhYnMuY29tPgorICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlICJzdG1tYWMuaCIKKworc3RydWN0IHBsYXRfc3RtbWFjZW5ldF9kYXRhIHBsYXRfZGF0Oworc3RydWN0IHN0bW1hY19tZGlvX2J1c19kYXRhIG1kaW9fZGF0YTsKKworc3RhdGljIHZvaWQgc3RtbWFjX2RlZmF1bHRfZGF0YSh2b2lkKQoreworCW1lbXNldCgmcGxhdF9kYXQsIDAsIHNpemVvZihzdHJ1Y3QgcGxhdF9zdG1tYWNlbmV0X2RhdGEpKTsKKwlwbGF0X2RhdC5idXNfaWQgPSAxOworCXBsYXRfZGF0LnBoeV9hZGRyID0gMDsKKwlwbGF0X2RhdC5pbnRlcmZhY2UgPSBQSFlfSU5URVJGQUNFX01PREVfR01JSTsKKwlwbGF0X2RhdC5wYmwgPSAzMjsKKwlwbGF0X2RhdC5jbGtfY3NyID0gMjsJLyogY2xrX2Nzcl9pID0gMjAtMzVNSHogJiBNREMgPSBjbGtfY3NyX2kvMTYgKi8KKwlwbGF0X2RhdC5oYXNfZ21hYyA9IDE7CisJcGxhdF9kYXQuZm9yY2Vfc2ZfZG1hX21vZGUgPSAxOworCisJbWRpb19kYXRhLmJ1c19pZCA9IDE7CisJbWRpb19kYXRhLnBoeV9yZXNldCA9IE5VTEw7CisJbWRpb19kYXRhLnBoeV9tYXNrID0gMDsKKwlwbGF0X2RhdC5tZGlvX2J1c19kYXRhID0gJm1kaW9fZGF0YTsKK30KKworLyoqCisgKiBzdG1tYWNfcGNpX3Byb2JlCisgKgorICogQHBkZXY6IHBjaSBkZXZpY2UgcG9pbnRlcgorICogQGlkOiBwb2ludGVyIHRvIHRhYmxlIG9mIGRldmljZSBpZC9pZCdzLgorICoKKyAqIERlc2NyaXB0aW9uOiBUaGlzIHByb2JpbmcgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZm9yIGFsbCBQQ0kgZGV2aWNlcyB3aGljaAorICogbWF0Y2ggdGhlIElEIHRhYmxlIGFuZCBhcmUgbm90ICJvd25lZCIgYnkgb3RoZXIgZHJpdmVyIHlldC4gVGhpcyBmdW5jdGlvbgorICogZ2V0cyBwYXNzZWQgYSAic3RydWN0IHBjaV9kZXYgKiIgZm9yIGVhY2ggZGV2aWNlIHdob3NlIGVudHJ5IGluIHRoZSBJRCB0YWJsZQorICogbWF0Y2hlcyB0aGUgZGV2aWNlLiBUaGUgcHJvYmUgZnVuY3Rpb25zIHJldHVybnMgemVybyB3aGVuIHRoZSBkcml2ZXIgY2hvb3NlCisgKiB0byB0YWtlICJvd25lcnNoaXAiIG9mIHRoZSBkZXZpY2Ugb3IgYW4gZXJyb3IgY29kZSgtdmUgbm8pIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBfX2RldmluaXQgc3RtbWFjX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisJaW50IHJldCA9IDA7CisJdm9pZCBfX2lvbWVtICphZGRyID0gTlVMTDsKKwlzdHJ1Y3Qgc3RtbWFjX3ByaXYgKnByaXYgPSBOVUxMOworCWludCBpOworCisJLyogRW5hYmxlIHBjaSBkZXZpY2UgKi8KKwlyZXQgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2KTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiJXMgOiBFUlJPUjogZmFpbGVkIHRvIGVuYWJsZSAlcyBkZXZpY2VcbiIsIF9fZnVuY19fLAorCQkgICAgICAgcGNpX25hbWUocGRldikpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAocGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBTVE1NQUNfUkVTT1VSQ0VfTkFNRSkpIHsKKwkJcHJfZXJyKCIlczogRVJST1I6IGZhaWxlZCB0byBnZXQgUENJIHJlZ2lvblxuIiwgX19mdW5jX18pOworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIGVycl9vdXRfcmVxX3JlZ19mYWlsZWQ7CisJfQorCisJLyogR2V0IHRoZSBiYXNlIGFkZHJlc3Mgb2YgZGV2aWNlICovCisJZm9yIChpID0gMDsgaSA8PSA1OyBpKyspIHsKKwkJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRldiwgaSkgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlhZGRyID0gcGNpX2lvbWFwKHBkZXYsIGksIDApOworCQlpZiAoYWRkciA9PSBOVUxMKSB7CisJCQlwcl9lcnIoIiVzOiBFUlJPUjogY2Fubm90IG1hcCByZWdpc2VyIG1lbW9yeSwgYWJvcnRpbmciLAorCQkJICAgICAgIF9fZnVuY19fKTsKKwkJCXJldCA9IC1FSU87CisJCQlnb3RvIGVycl9vdXRfbWFwX2ZhaWxlZDsKKwkJfQorCQlicmVhazsKKwl9CisJcGNpX3NldF9tYXN0ZXIocGRldik7CisKKwlzdG1tYWNfZGVmYXVsdF9kYXRhKCk7CisKKwlwcml2ID0gc3RtbWFjX2R2cl9wcm9iZSgmKHBkZXYtPmRldiksICZwbGF0X2RhdCk7CisJaWYgKCFwcml2KSB7CisJCXByX2VycigiJXM6IG1haW4gZHJpdnIgcHJvYmUgZmFpbGVkIiwgX19mdW5jX18pOworCQlnb3RvIGVycl9vdXQ7CisJfQorCXByaXYtPmlvYWRkciA9IGFkZHI7CisJcHJpdi0+ZGV2LT5iYXNlX2FkZHIgPSAodW5zaWduZWQgbG9uZylhZGRyOworCXByaXYtPmRldi0+aXJxID0gcGRldi0+aXJxOworCXByaXYtPndvbF9pcnEgPSBwZGV2LT5pcnE7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgcHJpdi0+ZGV2KTsKKworCXByX2RlYnVnKCJTVE1NQUMgcGxhdGZvcm0gZHJpdmVyIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZWQiKTsKKworCXJldHVybiAwOworCitlcnJfb3V0OgorCXBjaV9jbGVhcl9tYXN0ZXIocGRldik7CitlcnJfb3V0X21hcF9mYWlsZWQ6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK2Vycl9vdXRfcmVxX3JlZ19mYWlsZWQ6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzdG1tYWNfZHZyX3JlbW92ZQorICoKKyAqIEBwZGV2OiBwbGF0Zm9ybSBkZXZpY2UgcG9pbnRlcgorICogRGVzY3JpcHRpb246IHRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIG1haW4gdG8gZnJlZSB0aGUgbmV0IHJlc291cmNlcworICogYW5kIHJlbGVhc2VzIHRoZSBQQ0kgcmVzb3VyY2VzLgorICovCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgc3RtbWFjX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlzdG1tYWNfZHZyX3JlbW92ZShuZGV2KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwlwY2lfaW91bm1hcChwZGV2LCBwcml2LT5pb2FkZHIpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHN0bW1hY19wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWludCByZXQ7CisKKwlyZXQgPSBzdG1tYWNfc3VzcGVuZChuZGV2KTsKKwlwY2lfc2F2ZV9zdGF0ZShwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3RtbWFjX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CisJcGNpX3Jlc3RvcmVfc3RhdGUocGRldik7CisKKwlyZXR1cm4gc3RtbWFjX3Jlc3VtZShuZGV2KTsKK30KKyNlbmRpZgorCisjZGVmaW5lIFNUTU1BQ19WRU5ET1JfSUQgMHg3MDAKKyNkZWZpbmUgU1RNTUFDX0RFVklDRV9JRCAweDExMDgKKworc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKHN0bW1hY19pZF90YWJsZSkgPSB7CisJeworCVBDSV9ERVZJQ0UoU1RNTUFDX1ZFTkRPUl9JRCwgU1RNTUFDX0RFVklDRV9JRCl9LCB7CisJfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHN0bW1hY19pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBzdG1tYWNfZHJpdmVyID0geworCS5uYW1lID0gU1RNTUFDX1JFU09VUkNFX05BTUUsCisJLmlkX3RhYmxlID0gc3RtbWFjX2lkX3RhYmxlLAorCS5wcm9iZSA9IHN0bW1hY19wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKHN0bW1hY19wY2lfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZCA9IHN0bW1hY19wY2lfc3VzcGVuZCwKKwkucmVzdW1lID0gc3RtbWFjX3BjaV9yZXN1bWUsCisjZW5kaWYKK307CisKKy8qKgorICogc3RtbWFjX2luaXRfbW9kdWxlIC0gRW50cnkgcG9pbnQgZm9yIHRoZSBkcml2ZXIKKyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgdGhlIGRyaXZlci4KKyAqLworc3RhdGljIGludCBfX2luaXQgc3RtbWFjX2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnN0bW1hY19kcml2ZXIpOworCWlmIChyZXQgPCAwKQorCQlwcl9lcnIoIiVzOiBFUlJPUjogZHJpdmVyIHJlZ2lzdHJhdGlvbiBmYWlsZWRcbiIsIF9fZnVuY19fKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogc3RtbWFjX2NsZWFudXBfbW9kdWxlIC0gQ2xlYW51cCByb3V0aW5lIGZvciB0aGUgZHJpdmVyCisgKiBEZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBpcyB0aGUgY2xlYW51cCByb3V0aW5lIGZvciB0aGUgZHJpdmVyLgorICovCitzdGF0aWMgdm9pZCBfX2V4aXQgc3RtbWFjX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzdG1tYWNfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoc3RtbWFjX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHN0bW1hY19jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9ERVNDUklQVElPTigiU1RNTUFDIDEwLzEwMC8xMDAwIEV0aGVybmV0IFBDSSBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIlJheWFnb25kIEtva2F0YW51ciA8cmF5YWdvbmQua29rYXRhbnVyQHZheWF2eWFsYWJzLmNvbT4iKTsKK01PRFVMRV9BVVRIT1IoIkdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wbGF0Zm9ybS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3RtaWNyby9zdG1tYWMvc3RtbWFjX3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxNTk0ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N0bWljcm8vc3RtbWFjL3N0bW1hY19wbGF0Zm9ybS5jCkBAIC0wLDAgKzEsMTk4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaGlzIGNvbnRhaW5zIHRoZSBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoZSBwbGF0Zm9ybSBkcml2ZXIuCisKKyAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMTEgIFNUTWljcm9lbGVjdHJvbmljcyBMdGQKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorCisgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAgdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgIDUxIEZyYW5rbGluIFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisKKyAgVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4KKyAgdGhlIGZpbGUgY2FsbGVkICJDT1BZSU5HIi4KKworICBBdXRob3I6IEdpdXNlcHBlIENhdmFsbGFybyA8cGVwcGUuY2F2YWxsYXJvQHN0LmNvbT4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorI2luY2x1ZGUgInN0bW1hYy5oIgorCisvKioKKyAqIHN0bW1hY19wbHRmcl9wcm9iZQorICogQHBkZXY6IHBsYXRmb3JtIGRldmljZSBwb2ludGVyCisgKiBEZXNjcmlwdGlvbjogcGxhdGZvcm1fZGV2aWNlIHByb2JlIGZ1bmN0aW9uLiBJdCBhbGxvY2F0ZXMKKyAqIHRoZSBuZWNlc3NhcnkgcmVzb3VyY2VzIGFuZCBpbnZva2VzIHRoZSBtYWluIHRvIGluaXQKKyAqIHRoZSBuZXQgZGV2aWNlLCByZWdpc3RlciB0aGUgbWRpbyBidXMgZXRjLgorICovCitzdGF0aWMgaW50IHN0bW1hY19wbHRmcl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWludCByZXQgPSAwOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXZvaWQgX19pb21lbSAqYWRkciA9IE5VTEw7CisJc3RydWN0IHN0bW1hY19wcml2ICpwcml2ID0gTlVMTDsKKwlzdHJ1Y3QgcGxhdF9zdG1tYWNlbmV0X2RhdGEgKnBsYXRfZGF0OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpZiAoIXJlcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcyksIHBkZXYtPm5hbWUpKSB7CisJCXByX2VycigiJXM6IEVSUk9SOiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQiCisJCSAgICAgICAiY2Fubm90IGdldCB0aGUgSS9PIGFkZHIgMHgleFxuIiwKKwkJICAgICAgIF9fZnVuY19fLCAodW5zaWduZWQgaW50KXJlcy0+c3RhcnQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWFkZHIgPSBpb3JlbWFwKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisJaWYgKCFhZGRyKSB7CisJCXByX2VycigiJXM6IEVSUk9SOiBtZW1vcnkgbWFwcGluZyBmYWlsZWQiLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0KKwlwbGF0X2RhdCA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOworCXByaXYgPSBzdG1tYWNfZHZyX3Byb2JlKCYocGRldi0+ZGV2KSwgcGxhdF9kYXQpOworCWlmICghcHJpdikgeworCQlwcl9lcnIoIiVzOiBtYWluIGRyaXZyIHByb2JlIGZhaWxlZCIsIF9fZnVuY19fKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJfQorCisJcHJpdi0+aW9hZGRyID0gYWRkcjsKKwkvKiBTZXQgdGhlIEkvTyBiYXNlIGFkZHIgKi8KKwlwcml2LT5kZXYtPmJhc2VfYWRkciA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CisKKwkvKiBHZXQgdGhlIE1BQyBpbmZvcm1hdGlvbiAqLworCXByaXYtPmRldi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycV9ieW5hbWUocGRldiwgIm1hY2lycSIpOworCWlmIChwcml2LT5kZXYtPmlycSA9PSAtRU5YSU8pIHsKKwkJcHJfZXJyKCIlczogRVJST1I6IE1BQyBJUlEgY29uZmlndXJhdGlvbiAiCisJCSAgICAgICAiaW5mb3JtYXRpb24gbm90IGZvdW5kXG4iLCBfX2Z1bmNfXyk7CisJCXJldCA9IC1FTlhJTzsKKwkJZ290byBvdXRfdW5tYXA7CisJfQorCisJLyoKKwkgKiBPbiBzb21lIHBsYXRmb3JtcyBlLmcuIFNQRUFyIHRoZSB3YWtlIHVwIGlycSBkaWZmZXJzIGZyb20gdGhlIG1hYyBpcnEKKwkgKiBUaGUgZXh0ZXJuYWwgd2FrZSB1cCBpcnEgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIHRoZSBwbGF0Zm9ybSBjb2RlCisJICogbmFtZWQgYXMgImV0aF93YWtlX2lycSIKKwkgKgorCSAqIEluIGNhc2UgdGhlIHdha2UgdXAgaW50ZXJydXB0IGlzIG5vdCBwYXNzZWQgZnJvbSB0aGUgcGxhdGZvcm0KKwkgKiBzbyB0aGUgZHJpdmVyIHdpbGwgY29udGludWUgdG8gdXNlIHRoZSBtYWMgaXJxIChuZGV2LT5pcnEpCisJICovCisJcHJpdi0+d29sX2lycSA9IHBsYXRmb3JtX2dldF9pcnFfYnluYW1lKHBkZXYsICJldGhfd2FrZV9pcnEiKTsKKwlpZiAocHJpdi0+d29sX2lycSA9PSAtRU5YSU8pCisJCXByaXYtPndvbF9pcnEgPSBwcml2LT5kZXYtPmlycTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHByaXYtPmRldik7CisKKwkvKiBDdXN0b20gaW5pdGlhbGlzYXRpb24gKi8KKwlpZiAocHJpdi0+cGxhdC0+aW5pdCkgeworCQlyZXQgPSBwcml2LT5wbGF0LT5pbml0KHBkZXYpOworCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCWdvdG8gb3V0X3VubWFwOworCX0KKworCXByX2RlYnVnKCJTVE1NQUMgcGxhdGZvcm0gZHJpdmVyIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZWQiKTsKKworCXJldHVybiAwOworCitvdXRfdW5tYXA6CisJaW91bm1hcChhZGRyKTsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworb3V0X3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihyZXMtPnN0YXJ0LCByZXNvdXJjZV9zaXplKHJlcykpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzdG1tYWNfcGx0ZnJfcmVtb3ZlCisgKiBAcGRldjogcGxhdGZvcm0gZGV2aWNlIHBvaW50ZXIKKyAqIERlc2NyaXB0aW9uOiB0aGlzIGZ1bmN0aW9uIGNhbGxzIHRoZSBtYWluIHRvIGZyZWUgdGhlIG5ldCByZXNvdXJjZXMKKyAqIGFuZCBjYWxscyB0aGUgcGxhdGZvcm1zIGhvb2sgYW5kIHJlbGVhc2UgdGhlIHJlc291cmNlcyAoZS5nLiBtZW0pLgorICovCitzdGF0aWMgaW50IHN0bW1hY19wbHRmcl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBzdG1tYWNfcHJpdiAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCByZXQgPSBzdG1tYWNfZHZyX3JlbW92ZShuZGV2KTsKKworCWlmIChwcml2LT5wbGF0LT5leGl0KQorCQlwcml2LT5wbGF0LT5leGl0KHBkZXYpOworCisJaWYgKHByaXYtPnBsYXQtPmV4aXQpCisJCXByaXYtPnBsYXQtPmV4aXQocGRldik7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWlvdW5tYXAoKHZvaWQgKilwcml2LT5pb2FkZHIpOworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJcmVsZWFzZV9tZW1fcmVnaW9uKHJlcy0+c3RhcnQsIHJlc291cmNlX3NpemUocmVzKSk7CisKKwlyZXR1cm4gcmV0OworfQorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHN0bW1hY19wbHRmcl9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHN0bW1hY19zdXNwZW5kKG5kZXYpOworfQorCitzdGF0aWMgaW50IHN0bW1hY19wbHRmcl9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3RtbWFjX3Jlc3VtZShuZGV2KTsKK30KKworaW50IHN0bW1hY19wbHRmcl9mcmVlemUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gc3RtbWFjX2ZyZWV6ZShuZGV2KTsKK30KKworaW50IHN0bW1hY19wbHRmcl9yZXN0b3JlKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHN0bW1hY19yZXN0b3JlKG5kZXYpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgc3RtbWFjX3BsdGZyX3BtX29wcyA9IHsKKwkuc3VzcGVuZCA9IHN0bW1hY19wbHRmcl9zdXNwZW5kLAorCS5yZXN1bWUgPSBzdG1tYWNfcGx0ZnJfcmVzdW1lLAorCS5mcmVlemUgPSBzdG1tYWNfcGx0ZnJfZnJlZXplLAorCS50aGF3ID0gc3RtbWFjX3BsdGZyX3Jlc3RvcmUsCisJLnJlc3RvcmUgPSBzdG1tYWNfcGx0ZnJfcmVzdG9yZSwKK307CisjZWxzZQorc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHN0bW1hY19wbHRmcl9wbV9vcHM7CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHN0bW1hY19kcml2ZXIgPSB7CisJLnByb2JlID0gc3RtbWFjX3BsdGZyX3Byb2JlLAorCS5yZW1vdmUgPSBzdG1tYWNfcGx0ZnJfcmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCSAgIC5uYW1lID0gU1RNTUFDX1JFU09VUkNFX05BTUUsCisJCSAgIC5vd25lciA9IFRISVNfTU9EVUxFLAorCQkgICAucG0gPSAmc3RtbWFjX3BsdGZyX3BtX29wcywKKwkJICAgfSwKK307CisKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc3RtbWFjX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiU1RNTUFDIDEwLzEwMC8xMDAwIEV0aGVybmV0IFBMQVRGT1JNIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiR2l1c2VwcGUgQ2F2YWxsYXJvIDxwZXBwZS5jYXZhbGxhcm9Ac3QuY29tPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL2Nhc3NpbmkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N1bi9jYXNzaW5pLmMKaW5kZXggZmQ0MDk4OC4uZjEwNjY1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL2Nhc3NpbmkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vY2Fzc2luaS5jCkBAIC00NTMyLDEwICs0NTMyLDkgQEAKIHN0YXRpYyB2b2lkIGNhc19nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewogCXN0cnVjdCBjYXMgKmNwID0gbmV0ZGV2X3ByaXYoZGV2KTsKLQlzdHJuY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FLCBFVEhUT09MX0JVU0lORk9fTEVOKTsKLQlzdHJuY3B5KGluZm8tPnZlcnNpb24sIERSVl9NT0RVTEVfVkVSU0lPTiwgRVRIVE9PTF9CVVNJTkZPX0xFTik7Ci0JaW5mby0+ZndfdmVyc2lvblswXSA9ICdcMCc7Ci0Jc3RybmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoY3AtPnBkZXYpLCBFVEhUT09MX0JVU0lORk9fTEVOKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUoY3AtPnBkZXYpLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIAlpbmZvLT5yZWdkdW1wX2xlbiA9IGNwLT5jYXNyZWdfbGVuIDwgQ0FTX01BWF9SRUdTID8KIAkJY3AtPmNhc3JlZ19sZW4gOiBDQVNfTUFYX1JFR1M7CiAJaW5mby0+bl9zdGF0cyA9IENBU19OVU1fU1RBVF9LRVlTOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL25pdS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL25pdS5jCmluZGV4IDczYzcwODEuLmNmNDMzOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N1bi9uaXUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vbml1LmMKQEAgLTExNTEsMTkgKzExNTEsOCBAQAogCQlzdXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwMDBiYXNlVF9GdWxsOwogCWxwLT5zdXBwb3J0ZWQgPSBzdXBwb3J0ZWQ7CiAKLQlhZHZlcnRpc2luZyA9IDA7Ci0JaWYgKGFkdmVydCAmIEFEVkVSVElTRV8xMEhBTEYpCi0JCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOwotCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VfMTBGVUxMKQotCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKLQlpZiAoYWR2ZXJ0ICYgQURWRVJUSVNFXzEwMEhBTEYpCi0JCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfSGFsZjsKLQlpZiAoYWR2ZXJ0ICYgQURWRVJUSVNFXzEwMEZVTEwpCi0JCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKLQlpZiAoY3RybDEwMDAgJiBBRFZFUlRJU0VfMTAwMEhBTEYpCi0JCWFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGY7Ci0JaWYgKGN0cmwxMDAwICYgQURWRVJUSVNFXzEwMDBGVUxMKQotCQlhZHZlcnRpc2luZyB8PSBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOworCWFkdmVydGlzaW5nID0gbWlpX2Fkdl90b19ldGh0b29sX2Fkdl90KGFkdmVydCk7CisJYWR2ZXJ0aXNpbmcgfD0gbWlpX2N0cmwxMDAwX3RvX2V0aHRvb2xfYWR2X3QoY3RybDEwMDApOwogCiAJaWYgKGJtY3IgJiBCTUNSX0FORU5BQkxFKSB7CiAJCWludCBuZWcsIG5lZzEwMDA7CkBAIC0zNjA5LDYgKzM1OTgsNyBAQAogc3RhdGljIHZvaWQgbml1X3R4X3dvcmsoc3RydWN0IG5pdSAqbnAsIHN0cnVjdCB0eF9yaW5nX2luZm8gKnJwKQogewogCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKwl1bnNpZ25lZCBpbnQgdHhfYnl0ZXM7CiAJdTE2IHBrdF9jbnQsIHRtcDsKIAlpbnQgY29ucywgaW5kZXg7CiAJdTY0IGNzOwpAQCAtMzYzMSwxMiArMzYyMSwxOCBAQAogCW5ldGlmX3ByaW50ayhucCwgdHhfZG9uZSwgS0VSTl9ERUJVRywgbnAtPmRldiwKIAkJICAgICAiJXMoKSBwa3RfY250WyV1XSBjb25zWyVkXVxuIiwgX19mdW5jX18sIHBrdF9jbnQsIGNvbnMpOwogCi0Jd2hpbGUgKHBrdF9jbnQtLSkKKwl0eF9ieXRlcyA9IDA7CisJdG1wID0gcGt0X2NudDsKKwl3aGlsZSAodG1wLS0pIHsKKwkJdHhfYnl0ZXMgKz0gcnAtPnR4X2J1ZmZzW2NvbnNdLnNrYi0+bGVuOwogCQljb25zID0gcmVsZWFzZV90eF9wYWNrZXQobnAsIHJwLCBjb25zKTsKKwl9CiAKIAlycC0+Y29ucyA9IGNvbnM7CiAJc21wX21iKCk7CiAKKwluZXRkZXZfdHhfY29tcGxldGVkX3F1ZXVlKHR4cSwgcGt0X2NudCwgdHhfYnl0ZXMpOworCiBvdXQ6CiAJaWYgKHVubGlrZWx5KG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSAmJgogCQkgICAgIChuaXVfdHhfYXZhaWwocnApID4gTklVX1RYX1dBS0VVUF9USFJFU0gocnApKSkpIHsKQEAgLTQzMzcsNiArNDMzMyw3IEBACiAJCQlzdHJ1Y3QgdHhfcmluZ19pbmZvICpycCA9ICZucC0+dHhfcmluZ3NbaV07CiAKIAkJCW5pdV9mcmVlX3R4X3JpbmdfaW5mbyhucCwgcnApOworCQkJbmV0ZGV2X3R4X3Jlc2V0X3F1ZXVlKG5ldGRldl9nZXRfdHhfcXVldWUobnAtPmRldiwgaSkpOwogCQl9CiAJCWtmcmVlKG5wLT50eF9yaW5ncyk7CiAJCW5wLT50eF9yaW5ncyA9IE5VTEw7CkBAIC02NzQyLDYgKzY3MzksOCBAQAogCQlwcm9kID0gTkVYVF9UWChycCwgcHJvZCk7CiAJfQogCisJbmV0ZGV2X3R4X3NlbnRfcXVldWUodHhxLCBza2ItPmxlbik7CisKIAlpZiAocHJvZCA8IHJwLT5wcm9kKQogCQlycC0+d3JhcF9iaXQgXj0gVFhfUklOR19LSUNLX1dSQVA7CiAJcnAtPnByb2QgPSBwcm9kOwpAQCAtNjgyMywxMiArNjgyMiwxMyBAQAogCXN0cnVjdCBuaXUgKm5wID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgbml1X3ZwZCAqdnBkID0gJm5wLT52cGQ7CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTU9EVUxFX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04pOwotCXNwcmludGYoaW5mby0+ZndfdmVyc2lvbiwgIiVkLiVkIiwKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX01PRFVMRV9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfTU9EVUxFX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CisJc25wcmludGYoaW5mby0+ZndfdmVyc2lvbiwgc2l6ZW9mKGluZm8tPmZ3X3ZlcnNpb24pLCAiJWQuJWQiLAogCQl2cGQtPmZjb2RlX21ham9yLCB2cGQtPmZjb2RlX21pbm9yKTsKIAlpZiAobnAtPnBhcmVudC0+cGxhdF90eXBlICE9IFBMQVRfVFlQRV9OSVUpCi0JCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBkZXYpKTsKKwkJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUobnAtPnBkZXYpLAorCQkJc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyBpbnQgbml1X2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKQEAgLTg1ODksOSArODU4OSwxMSBAQAogCWlmIChkZXZfaWRfMSA8IDAgfHwgZGV2X2lkXzIgPCAwKQogCQlyZXR1cm4gMDsKIAlpZiAodHlwZSA9PSBQSFlfVFlQRV9QTUFfUE1EIHx8IHR5cGUgPT0gUEhZX1RZUEVfUENTKSB7CisJCS8qIEJlY2F1c2Ugb2YgdGhlIE5JVV9QSFlfSURfTUFTSyBiZWluZyBhcHBsaWVkLCB0aGUgODcwNAorCQkgKiB0ZXN0IGNvdmVycyB0aGUgODcwNiBhcyB3ZWxsLgorCQkgKi8KIAkJaWYgKCgoaWQgJiBOSVVfUEhZX0lEX01BU0spICE9IE5JVV9QSFlfSURfQkNNODcwNCkgJiYKLQkJICAgICgoaWQgJiBOSVVfUEhZX0lEX01BU0spICE9IE5JVV9QSFlfSURfTVJWTDg4WDIwMTEpICYmCi0JCSAgICAoKGlkICYgTklVX1BIWV9JRF9NQVNLKSAhPSBOSVVfUEhZX0lEX0JDTTg3MDYpKQorCQkgICAgKChpZCAmIE5JVV9QSFlfSURfTUFTSykgIT0gTklVX1BIWV9JRF9NUlZMODhYMjAxMSkpCiAJCQlyZXR1cm4gMDsKIAl9IGVsc2UgewogCQlpZiAoKGlkICYgTklVX1BIWV9JRF9NQVNLKSAhPSBOSVVfUEhZX0lEX0JDTTU0NjRSKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL3N1bmJtYWMuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N1bi9zdW5ibWFjLmMKaW5kZXggMGQ4Y2ZkOS4uMjIwZjcyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL3N1bmJtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vc3VuYm1hYy5jCkBAIC0xMjkzLDE1ICsxMjkzLDQgQEAKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGJpZ21hY19zYnVzX3JlbW92ZSksCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBiaWdtYWNfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmJpZ21hY19zYnVzX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBiaWdtYWNfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZiaWdtYWNfc2J1c19kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChiaWdtYWNfaW5pdCk7Ci1tb2R1bGVfZXhpdChiaWdtYWNfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJpZ21hY19zYnVzX2RyaXZlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vc3VuZ2VtLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vc3VuZ2VtLmMKaW5kZXggY2VhYjIxNS4uMzE0NDFhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL3N1bmdlbS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N1bi9zdW5nZW0uYwpAQCAtMjUxNyw5ICsyNTE3LDkgQEAKIHsKIAlzdHJ1Y3QgZ2VtICpncCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKGdwLT5wZGV2KSk7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShncC0+cGRldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiBzdGF0aWMgaW50IGdlbV9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vc3VuaG1lLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC9zdW4vc3VuaG1lLmMKaW5kZXggY2YxNGFiOS4uMDljNTE4NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvc3VuL3N1bmhtZS5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3N1bi9zdW5obWUuYwpAQCAtMjQ1NywxMSArMjQ1NywxMSBAQAogewogCXN0cnVjdCBoYXBweV9tZWFsICpocCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCAic3VuaG1lIik7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sICIyLjAyIik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsICJzdW5obWUiLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCAiMi4wMiIsIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CiAJaWYgKGhwLT5oYXBweV9mbGFncyAmIEhGTEFHX1BDSSkgewogCQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGhwLT5oYXBweV9kZXY7Ci0JCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocGRldikpOworCQlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiAJfQogI2lmZGVmIENPTkZJR19TQlVTCiAJZWxzZSB7CkBAIC0yNDY5LDcgKzI0NjksOCBAQAogCQlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpvcCA9IGhwLT5oYXBweV9kZXY7CiAJCXJlZ3MgPSBvZl9nZXRfcHJvcGVydHkob3AtPmRldi5vZl9ub2RlLCAicmVncyIsIE5VTEwpOwogCQlpZiAocmVncykKLQkJCXNwcmludGYoaW5mby0+YnVzX2luZm8sICJTQlVTOiVkIiwKKwkJCXNucHJpbnRmKGluZm8tPmJ1c19pbmZvLCBzaXplb2YoaW5mby0+YnVzX2luZm8pLAorCQkJCSJTQlVTOiVkIiwKIAkJCQlyZWdzLT53aGljaF9pbyk7CiAJfQogI2VuZGlmCkBAIC0yODQ5LDcgKzI4NTAsNyBAQAogc3RhdGljIGludCBpc19xdWF0dHJvX3Aoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiB7CiAJc3RydWN0IHBjaV9kZXYgKmJ1c2RldiA9IHBkZXYtPmJ1cy0+c2VsZjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IHBjaV9kZXYgKnRoaXNfcGRldjsKIAlpbnQgbl9obWVzOwogCiAJaWYgKGJ1c2RldiA9PSBOVUxMIHx8CkBAIC0yODU4LDE1ICsyODU5LDEwIEBACiAJCXJldHVybiAwOwogCiAJbl9obWVzID0gMDsKLQl0bXAgPSBwZGV2LT5idXMtPmRldmljZXMubmV4dDsKLQl3aGlsZSAodG1wICE9ICZwZGV2LT5idXMtPmRldmljZXMpIHsKLQkJc3RydWN0IHBjaV9kZXYgKnRoaXNfcGRldiA9IHBjaV9kZXZfYih0bXApOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzX3BkZXYsICZwZGV2LT5idXMtPmRldmljZXMsIGJ1c19saXN0KSB7CiAJCWlmICh0aGlzX3BkZXYtPnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX1NVTiAmJgogCQkgICAgdGhpc19wZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9TVU5fSEFQUFlNRUFMKQogCQkJbl9obWVzKys7Ci0KLQkJdG1wID0gdG1wLT5uZXh0OwogCX0KIAogCWlmIChuX2htZXMgIT0gNCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RlaHV0aS90ZWh1dGkuYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RlaHV0aS90ZWh1dGkuYwppbmRleCAzYTkwYWY2Li40YjE5ZTliIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90ZWh1dGkvdGVodXRpLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGVodXRpL3RlaHV0aS5jCkBAIC03MjcsOSArNzI3LDEwIEBACiAgKiBAbmRldiBuZXR3b3JrIGRldmljZQogICogQHZpZCAgVkxBTiB2aWQgdG8gYWRkCiAgKi8KLXN0YXRpYyB2b2lkIGJkeF92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHVpbnQxNl90IHZpZCkKK3N0YXRpYyBpbnQgYmR4X3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdWludDE2X3QgdmlkKQogewogCV9fYmR4X3ZsYW5fcnhfdmlkKG5kZXYsIHZpZCwgMSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qCkBAIC03MzcsOSArNzM4LDEwIEBACiAgKiBAbmRldiBuZXR3b3JrIGRldmljZQogICogQHZpZCAgVkxBTiB2aWQgdG8ga2lsbAogICovCi1zdGF0aWMgdm9pZCBiZHhfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQorc3RhdGljIGludCBiZHhfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQogewogCV9fYmR4X3ZsYW5fcnhfdmlkKG5kZXYsIHZpZCwgMCk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9jcGRtYS5jCmluZGV4IGRjYTlkMzMuLmM5N2QyZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpL2RhdmluY2lfY3BkbWEuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2NwZG1hLmMKQEAgLTgzNiwxMSArODM2LDEzIEBACiAJY2hhbl93cml0ZShjaGFuLCBjcCwgQ1BETUFfVEVBUkRPV05fVkFMVUUpOwogCiAJLyogaGFuZGxlIGNvbXBsZXRlZCBwYWNrZXRzICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2hhbi0+bG9jaywgZmxhZ3MpOwogCWRvIHsKIAkJcmV0ID0gX19jcGRtYV9jaGFuX3Byb2Nlc3MoY2hhbik7CiAJCWlmIChyZXQgPCAwKQogCQkJYnJlYWs7CiAJfSB3aGlsZSAoKHJldCAmIENQRE1BX0RFU0NfVERfQ09NUExFVEUpID09IDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZjaGFuLT5sb2NrLCBmbGFncyk7CiAKIAkvKiByZW1haW5pbmcgcGFja2V0cyBoYXZlbid0IGJlZW4gdHgvcngnZWQsIGNsZWFuIHRoZW0gdXAgKi8KIAl3aGlsZSAoY2hhbi0+aGVhZCkgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdGkvZGF2aW5jaV9lbWFjLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYwppbmRleCA4MTVjNzk3Li43OTRhYzMwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90aS9kYXZpbmNpX2VtYWMuYwpAQCAtMTE1LDYgKzExNSw3IEBACiAjZGVmaW5lIEVNQUNfREVGX1RYX0NICQkJKDApIC8qIERlZmF1bHQgMHRoIGNoYW5uZWwgKi8KICNkZWZpbmUgRU1BQ19ERUZfUlhfQ0gJCQkoMCkgLyogRGVmYXVsdCAwdGggY2hhbm5lbCAqLwogI2RlZmluZSBFTUFDX0RFRl9SWF9OVU1fREVTQwkJKDEyOCkKKyNkZWZpbmUgRU1BQ19ERUZfVFhfTlVNX0RFU0MJCSgxMjgpCiAjZGVmaW5lIEVNQUNfREVGX01BWF9UWF9DSAkJKDEpIC8qIE1heCBUWCBjaGFubmVscyBjb25maWd1cmVkICovCiAjZGVmaW5lIEVNQUNfREVGX01BWF9SWF9DSAkJKDEpIC8qIE1heCBSWCBjaGFubmVscyBjb25maWd1cmVkICovCiAjZGVmaW5lIEVNQUNfUE9MTF9XRUlHSFQJCSg2NCkgLyogRGVmYXVsdCBOQVBJIHBvbGwgd2VpZ2h0ICovCkBAIC0zMzYsNiArMzM3LDcgQEAKIAl1MzIgbWFjX2hhc2gyOwogCXUzMiBtdWx0aWNhc3RfaGFzaF9jbnRbRU1BQ19OVU1fTVVMVElDQVNUX0JJVFNdOwogCXUzMiByeF9hZGRyX3R5cGU7CisJYXRvbWljX3QgY3VyX3R4OwogCWNvbnN0IGNoYXIgKnBoeV9pZDsKIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogCXNwaW5sb2NrX3QgbG9jazsKQEAgLTEwNDQsNiArMTA0Niw5IEBACiB7CiAJc3RydWN0IHNrX2J1ZmYJCSpza2IgPSB0b2tlbjsKIAlzdHJ1Y3QgbmV0X2RldmljZQkqbmRldiA9IHNrYi0+ZGV2OworCXN0cnVjdCBlbWFjX3ByaXYJKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKKworCWF0b21pY19kZWMoJnByaXYtPmN1cl90eCk7CiAKIAlpZiAodW5saWtlbHkobmV0aWZfcXVldWVfc3RvcHBlZChuZGV2KSkpCiAJCW5ldGlmX3N0YXJ0X3F1ZXVlKG5kZXYpOwpAQCAtMTA5Miw2ICsxMDk3LDkgQEAKIAkJZ290byBmYWlsX3R4OwogCX0KIAorCWlmIChhdG9taWNfaW5jX3JldHVybigmcHJpdi0+Y3VyX3R4KSA+PSBFTUFDX0RFRl9UWF9OVU1fREVTQykKKwkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKKwogCXJldHVybiBORVRERVZfVFhfT0s7CiAKIGZhaWxfdHg6CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90aWxlL3RpbGVwcm8uYyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpbGUvdGlsZXByby5jCmluZGV4IDEwODI2ZDguLjZiNzUwNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpbGUvdGlsZXByby5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3RpbGUvdGlsZXByby5jCkBAIC05MjYsNyArOTI2LDcgQEAKIAkJZ290byBkb25lOwogCiAJLyogUmUtZW5hYmxlIHRoZSBpbmdyZXNzIGludGVycnVwdC4gKi8KLQllbmFibGVfcGVyY3B1X2lycShwcml2LT5pbnRyX2lkKTsKKwllbmFibGVfcGVyY3B1X2lycShwcml2LT5pbnRyX2lkLCAwKTsKIAogCS8qIEhBQ0s6IEF2b2lkIHRoZSAicm90dGluZyBwYWNrZXQiIHByb2JsZW0gKHNlZSBhYm92ZSkuICovCiAJaWYgKHF1cC0+X19wYWNrZXRfcmVjZWl2ZV9yZWFkICE9CkBAIC0xMjU2LDcgKzEyNTYsNyBAQAogCQkJICBzaXplb2YoZHVtbXkpLCBORVRJT19JUFBfU1RPUF9TSElNX09GRikgPCAwKQogCQlwYW5pYygiRmFpbGVkIHRvIHN0b3AgTElQUC9MRVBQIVxuIik7CiAKLQlwcml2LT5wYXJ0bHlfb3BlbmVkID0gMDsKKwlwcml2LT5wYXJ0bHlfb3BlbmVkID0gZmFsc2U7CiB9CiAKIApAQCAtMTI5Niw3ICsxMjk2LDcgQEAKIAlpbmZvLT5uYXBpX2VuYWJsZWQgPSB0cnVlOwogCiAJLyogRW5hYmxlIHRoZSBpbmdyZXNzIGludGVycnVwdC4gKi8KLQllbmFibGVfcGVyY3B1X2lycShwcml2LT5pbnRyX2lkKTsKKwllbmFibGVfcGVyY3B1X2lycShwcml2LT5pbnRyX2lkLCAwKTsKIH0KIAogCkBAIC0xNTA3LDcgKzE1MDcsNyBAQAogCQkgICAgICAgcHJpdi0+bmV0d29ya19jcHVzX2NvdW50LCBwcml2LT5uZXR3b3JrX2NwdXNfY3JlZGl0cyk7CiAjZW5kaWYKIAotCQlwcml2LT5wYXJ0bHlfb3BlbmVkID0gMTsKKwkJcHJpdi0+cGFydGx5X29wZW5lZCA9IHRydWU7CiAKIAl9IGVsc2UgewogCQkvKiBGSVhNRTogSXMgdGhpcyBwb3NzaWJsZT8gKi8KQEAgLTE2OTcsNyArMTY5Nyw3IEBACiAJZm9yIChpID0gMDsgaSA8IHNoLT5ucl9mcmFnczsgaSsrKSB7CiAKIAkJc2tiX2ZyYWdfdCAqZiA9ICZzaC0+ZnJhZ3NbaV07Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4oZi0+cGFnZSk7CisJCXVuc2lnbmVkIGxvbmcgcGZuID0gcGFnZV90b19wZm4oc2tiX2ZyYWdfcGFnZShmKSk7CiAKIAkJLyogRklYTUU6IENvbXB1dGUgImhhc2hfZm9yX2hvbWUiIHByb3Blcmx5LiAqLwogCQkvKiBJU1NVRTogVGhlIGh5cGVydmlzb3IgY2hlY2tzIENISVBfSEFTX1JFVjFfRE1BX1BBQ0tFVFMoKS4gKi8KQEAgLTE3MDYsNyArMTcwNiw3IEBACiAJCS8qIEZJWE1FOiBIbW1tLiAqLwogCQlpZiAoIWhhc2hfZGVmYXVsdCkgewogCQkJdm9pZCAqdmEgPSBwZm5fdG9fa2FkZHIocGZuKSArIGYtPnBhZ2Vfb2Zmc2V0OwotCQkJQlVHX09OKFBhZ2VIaWdoTWVtKGYtPnBhZ2UpKTsKKwkJCUJVR19PTihQYWdlSGlnaE1lbShza2JfZnJhZ19wYWdlKGYpKSk7CiAJCQlmaW52X2J1ZmZlcl9yZW1vdGUodmEsIGYtPnNpemUsIDApOwogCQl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3Rvc2hpYmEvcHMzX2dlbGljX25ldC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmMKaW5kZXggN2JmMWUyMC4uNWVlODJhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdG9zaGliYS9wczNfZ2VsaWNfbmV0LmMKQEAgLTY0MCw3ICs2NDAsNyBAQAogCWludCBzdGF0dXM7CiAKIAkvKiB0aGlzIGh2YyBibG9ja3MgdW50aWwgdGhlIERNQSBpbiBwcm9ncmVzcyByZWFsbHkgc3RvcHBlZCAqLwotCXN0YXR1cyA9IGx2MV9uZXRfc3RvcF9yeF9kbWEoYnVzX2lkKGNhcmQpLCBkZXZfaWQoY2FyZCksIDApOworCXN0YXR1cyA9IGx2MV9uZXRfc3RvcF9yeF9kbWEoYnVzX2lkKGNhcmQpLCBkZXZfaWQoY2FyZCkpOwogCWlmIChzdGF0dXMpCiAJCWRldl9lcnIoY3RvZGV2KGNhcmQpLAogCQkJImx2MV9uZXRfc3RvcF9yeF9kbWEgZmFpbGVkLCAlZFxuIiwgc3RhdHVzKTsKQEAgLTY1OCw3ICs2NTgsNyBAQAogCWludCBzdGF0dXM7CiAKIAkvKiB0aGlzIGh2YyBibG9ja3MgdW50aWwgdGhlIERNQSBpbiBwcm9ncmVzcyByZWFsbHkgc3RvcHBlZCAqLwotCXN0YXR1cyA9IGx2MV9uZXRfc3RvcF90eF9kbWEoYnVzX2lkKGNhcmQpLCBkZXZfaWQoY2FyZCksIDApOworCXN0YXR1cyA9IGx2MV9uZXRfc3RvcF90eF9kbWEoYnVzX2lkKGNhcmQpLCBkZXZfaWQoY2FyZCkpOwogCWlmIChzdGF0dXMpCiAJCWRldl9lcnIoY3RvZGV2KGNhcmQpLAogCQkJImx2MV9uZXRfc3RvcF90eF9kbWEgZmFpbGVkLCBzdGF0dXM9JWRcbiIsIHN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC90dW5kcmEvdHNpMTA4X2V0aC5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdHVuZHJhL3RzaTEwOF9ldGguYwppbmRleCBhOGRmN2VjLi5hOWNlMDFiYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdHVuZHJhL3RzaTEwOF9ldGguYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC90dW5kcmEvdHNpMTA4X2V0aC5jCkBAIC0xNjg4LDE4ICsxNjg4LDYgQEAKIAltb2RfdGltZXIoJmRhdGEtPnRpbWVyLCBqaWZmaWVzICsgQ0hFQ0tfUEhZX0lOVEVSVkFMKTsKIH0KIAotc3RhdGljIGludCB0c2kxMDhfZXRoZXJfaW5pdCh2b2lkKQotewotCWludCByZXQ7Ci0JcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyICgmdHNpX2V0aF9kcml2ZXIpOwotCWlmIChyZXQgPCAwKXsKLQkJcHJpbnRrKCJ0c2kxMDhfZXRoZXJfaW5pdDogZXJyb3IgaW5pdGlhbGl6aW5nIGV0aGVybmV0ICIKLQkJICAgICAgICJkZXZpY2VcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCB0c2kxMDhfZXRoZXJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOwpAQCAtMTcxNCwxMyArMTcwMiw3IEBACiAKIAlyZXR1cm4gMDsKIH0KLXN0YXRpYyB2b2lkIHRzaTEwOF9ldGhlcl9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnRzaV9ldGhfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQodHNpMTA4X2V0aGVyX2luaXQpOwotbW9kdWxlX2V4aXQodHNpMTA4X2V0aGVyX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih0c2lfZXRoX2RyaXZlcik7CiAKIE1PRFVMRV9BVVRIT1IoIlR1bmRyYSBTZW1pY29uZHVjdG9yIENvcnBvcmF0aW9uIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlRzaTEwOCBHaWdhYml0IEV0aGVybmV0IGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS1yaGluZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS1yaGluZS5jCmluZGV4IGYzNGRkOTkuLjVjNDk4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtcmhpbmUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXJoaW5lLmMKQEAgLTM1LDYgKzM1LDcgQEAKICNkZWZpbmUgRFJWX1ZFUlNJT04JIjEuNS4wIgogI2RlZmluZSBEUlZfUkVMREFURQkiMjAxMC0xMC0wOSIKIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKIC8qIEEgZmV3IHVzZXItY29uZmlndXJhYmxlIHZhbHVlcy4KICAgIFRoZXNlIG1heSBiZSBtb2RpZmllZCB3aGVuIGEgZHJpdmVyIG1vZHVsZSBpcyBsb2FkZWQuICovCkBAIC01NSw3ICs1Niw3IEBACiAKIC8qIFdvcmstYXJvdW5kIGZvciBicm9rZW4gQklPU2VzOiB0aGV5IGFyZSB1bmFibGUgdG8gZ2V0IHRoZSBjaGlwIGJhY2sgb3V0IG9mCiAgICBwb3dlciBzdGF0ZSBEMyBzbyBQWEUgYm9vdGluZyBmYWlscy4gYm9vdHBhcmFtKDcpOiB2aWEtcmhpbmUuYXZvaWRfRDM9MSAqLwotc3RhdGljIGludCBhdm9pZF9EMzsKK3N0YXRpYyBib29sIGF2b2lkX0QzOwogCiAvKgogICogSW4gY2FzZSB5b3UgYXJlIGxvb2tpbmcgZm9yICdvcHRpb25zW10nIG9yICdmdWxsX2R1cGxleFtdJywgdGhleQpAQCAtNDg4LDggKzQ4OSw4IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIG5ldGRldl9ldGh0b29sX29wczsKIHN0YXRpYyBpbnQgIHJoaW5lX2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgcmhpbmVfc2h1dGRvd24gKHN0cnVjdCBwY2lfZGV2ICpwZGV2KTsKLXN0YXRpYyB2b2lkIHJoaW5lX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpOwotc3RhdGljIHZvaWQgcmhpbmVfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpOworc3RhdGljIGludCByaGluZV92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKTsKK3N0YXRpYyBpbnQgcmhpbmVfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpOwogc3RhdGljIHZvaWQgcmhpbmVfc2V0X2NhbSh2b2lkIF9faW9tZW0gKmlvYWRkciwgaW50IGlkeCwgdTggKmFkZHIpOwogc3RhdGljIHZvaWQgcmhpbmVfc2V0X3ZsYW5fY2FtKHZvaWQgX19pb21lbSAqaW9hZGRyLCBpbnQgaWR4LCB1OCAqYWRkcik7CiBzdGF0aWMgdm9pZCByaGluZV9zZXRfY2FtX21hc2sodm9pZCBfX2lvbWVtICppb2FkZHIsIHUzMiBtYXNrKTsKQEAgLTEyNjEsNyArMTI2Miw3IEBACiAJcmhpbmVfc2V0X3ZsYW5fY2FtX21hc2soaW9hZGRyLCB2Q0FNbWFzayk7CiB9CiAKLXN0YXRpYyB2b2lkIHJoaW5lX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCitzdGF0aWMgaW50IHJoaW5lX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CiAJc3RydWN0IHJoaW5lX3ByaXZhdGUgKnJwID0gbmV0ZGV2X3ByaXYoZGV2KTsKIApAQCAtMTI2OSw5ICsxMjcwLDEwIEBACiAJc2V0X2JpdCh2aWQsIHJwLT5hY3RpdmVfdmxhbnMpOwogCXJoaW5lX3VwZGF0ZV92Y2FtKGRldik7CiAJc3Bpbl91bmxvY2tfaXJxKCZycC0+bG9jayk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHJoaW5lX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQorc3RhdGljIGludCByaGluZV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgcmhpbmVfcHJpdmF0ZSAqcnAgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC0xMjc5LDYgKzEyODEsNyBAQAogCWNsZWFyX2JpdCh2aWQsIHJwLT5hY3RpdmVfdmxhbnMpOwogCXJoaW5lX3VwZGF0ZV92Y2FtKGRldik7CiAJc3Bpbl91bmxvY2tfaXJxKCZycC0+bG9jayk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGluaXRfcmVnaXN0ZXJzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCkBAIC0yMDA5LDkgKzIwMTIsOSBAQAogewogCXN0cnVjdCByaGluZV9wcml2YXRlICpycCA9IG5ldGRldl9wcml2KGRldik7CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHJwLT5wZGV2KSk7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShycC0+cGRldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiBzdGF0aWMgaW50IG5ldGRldl9nZXRfc2V0dGluZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpCkBAIC0yMzIwLDcgKzIzMjMsNyBAQAogI2VuZGlmCiAJaWYgKGRtaV9jaGVja19zeXN0ZW0ocmhpbmVfZG1pX3RhYmxlKSkgewogCQkvKiB0aGVzZSBCSU9TZXMgZmFpbCBhdCBQWEUgYm9vdCBpZiBjaGlwIGlzIGluIEQzICovCi0JCWF2b2lkX0QzID0gMTsKKwkJYXZvaWRfRDMgPSB0cnVlOwogCQlwcl93YXJuKCJCcm9rZW4gQklPUyBkZXRlY3RlZCwgYXZvaWRfRDMgZW5hYmxlZFxuIik7CiAJfQogCWVsc2UgaWYgKGF2b2lkX0QzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS12ZWxvY2l0eS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQvdmlhL3ZpYS12ZWxvY2l0eS5jCmluZGV4IDQ1MzVkN2MuLjQxMjhkNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3ZpYS92aWEtdmVsb2NpdHkuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC92aWEvdmlhLXZlbG9jaXR5LmMKQEAgLTUyMiw3ICs1MjIsNyBAQAogCW1hY19zZXRfdmxhbl9jYW1fbWFzayhyZWdzLCB2cHRyLT52Q0FNbWFzayk7CiB9CiAKLXN0YXRpYyB2b2lkIHZlbG9jaXR5X3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCitzdGF0aWMgaW50IHZlbG9jaXR5X3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CiAJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC01MzAsOSArNTMwLDEwIEBACiAJc2V0X2JpdCh2aWQsIHZwdHItPmFjdGl2ZV92bGFucyk7CiAJdmVsb2NpdHlfaW5pdF9jYW1fZmlsdGVyKHZwdHIpOwogCXNwaW5fdW5sb2NrX2lycSgmdnB0ci0+bG9jayk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHZlbG9jaXR5X3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQorc3RhdGljIGludCB2ZWxvY2l0eV92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgdmVsb2NpdHlfaW5mbyAqdnB0ciA9IG5ldGRldl9wcml2KGRldik7CiAKQEAgLTU0MCw2ICs1NDEsNyBAQAogCWNsZWFyX2JpdCh2aWQsIHZwdHItPmFjdGl2ZV92bGFucyk7CiAJdmVsb2NpdHlfaW5pdF9jYW1fZmlsdGVyKHZwdHIpOwogCXNwaW5fdW5sb2NrX2lycSgmdnB0ci0+bG9jayk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIHZlbG9jaXR5X2luaXRfcnhfcmluZ19pbmRleGVzKHN0cnVjdCB2ZWxvY2l0eV9pbmZvICp2cHRyKQpAQCAtMzI3MCw5ICszMjcyLDkgQEAKIHN0YXRpYyB2b2lkIHZlbG9jaXR5X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7CiAJc3RydWN0IHZlbG9jaXR5X2luZm8gKnZwdHIgPSBuZXRkZXZfcHJpdihkZXYpOwotCXN0cmNweShpbmZvLT5kcml2ZXIsIFZFTE9DSVRZX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBWRUxPQ0lUWV9WRVJTSU9OKTsKLQlzdHJjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHZwdHItPnBkZXYpKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgVkVMT0NJVFlfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgVkVMT0NJVFlfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZSh2cHRyLT5wZGV2KSwgc2l6ZW9mKGluZm8tPmJ1c19pbmZvKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHZlbG9jaXR5X2V0aHRvb2xfZ2V0X3dvbChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF93b2xpbmZvICp3b2wpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvbGxfdGVtYWNfbWFpbi5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L2xsX3RlbWFjX21haW4uYwppbmRleCAyNjgxYjUzLi5mMjFhZGRiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngvbGxfdGVtYWNfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC9sbF90ZW1hY19tYWluLmMKQEAgLTIzNyw3ICsyMzcsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGk7CiAKLQlscC0+cnhfc2tiID0ga3phbGxvYyhzaXplb2YoKmxwLT5yeF9za2IpICogUlhfQkRfTlVNLCBHRlBfS0VSTkVMKTsKKwlscC0+cnhfc2tiID0ga2NhbGxvYyhSWF9CRF9OVU0sIHNpemVvZigqbHAtPnJ4X3NrYiksIEdGUF9LRVJORUwpOwogCWlmICghbHAtPnJ4X3NrYikgewogCQlkZXZfZXJyKCZuZGV2LT5kZXYsCiAJCQkJImNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgRE1BIFJYIGJ1ZmZlclxuIik7CkBAIC05MjAsMTIgKzkyMCwyNiBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgdGVtYWNfaW9jdGwoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpZnJlcSAqcnEsIGludCBjbWQpCit7CisJc3RydWN0IHRlbWFjX2xvY2FsICpscCA9IG5ldGRldl9wcml2KG5kZXYpOworCisJaWYgKCFuZXRpZl9ydW5uaW5nKG5kZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghbHAtPnBoeV9kZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIHBoeV9taWlfaW9jdGwobHAtPnBoeV9kZXYsIHJxLCBjbWQpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHRlbWFjX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuID0gdGVtYWNfb3BlbiwKIAkubmRvX3N0b3AgPSB0ZW1hY19zdG9wLAogCS5uZG9fc3RhcnRfeG1pdCA9IHRlbWFjX3N0YXJ0X3htaXQsCiAJLm5kb19zZXRfbWFjX2FkZHJlc3MgPSBuZXRkZXZfc2V0X21hY19hZGRyZXNzLAogCS5uZG9fdmFsaWRhdGVfYWRkciA9IGV0aF92YWxpZGF0ZV9hZGRyLAorCS5uZG9fZG9faW9jdGwgPSB0ZW1hY19pb2N0bCwKICNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgogCS5uZG9fcG9sbF9jb250cm9sbGVyID0gdGVtYWNfcG9sbF9jb250cm9sbGVyLAogI2VuZGlmCkBAIC0xMDc3LDcgKzEwOTEsNyBAQAogCiAJb2Zfbm9kZV9wdXQobnApOyAvKiBGaW5pc2hlZCB3aXRoIHRoZSBETUEgbm9kZTsgZHJvcCB0aGUgcmVmZXJlbmNlICovCiAKLQlpZiAoKGxwLT5yeF9pcnEgPT0gTk9fSVJRKSB8fCAobHAtPnR4X2lycSA9PSBOT19JUlEpKSB7CisJaWYgKCFscC0+cnhfaXJxIHx8ICFscC0+dHhfaXJxKSB7CiAJCWRldl9lcnIoJm9wLT5kZXYsICJjb3VsZCBub3QgZGV0ZXJtaW5lIGlycXNcbiIpOwogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyX2lvdW5tYXBfMjsKQEAgLTExNjcsMTcgKzExODEsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCB0ZW1hY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdGVtYWNfb2ZfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KHRlbWFjX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdGVtYWNfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ0ZW1hY19vZl9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQodGVtYWNfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRlbWFjX29mX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiWGlsaW54IExMX1RFTUFDIEV0aGVybmV0IGRyaXZlciIpOwogTU9EVUxFX0FVVEhPUigiWW9zaGlvIEthc2hpd2FnaSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9lbWFjbGl0ZS5jIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlsaW54L3hpbGlueF9lbWFjbGl0ZS5jCmluZGV4IDgwMThkN2QuLjc5MDEzZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpbGlueC94aWxpbnhfZW1hY2xpdGUuYworKysgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aWxpbngveGlsaW54X2VtYWNsaXRlLmMKQEAgLTY2Miw3ICs2NjIsNyBAQAogICovCiBzdGF0aWMgaXJxcmV0dXJuX3QgeGVtYWNsaXRlX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JYm9vbCB0eF9jb21wbGV0ZSA9IDA7CisJYm9vbCB0eF9jb21wbGV0ZSA9IGZhbHNlOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkZXZfaWQ7CiAJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSBuZXRkZXZfcHJpdihkZXYpOwogCXZvaWQgX19pb21lbSAqYmFzZV9hZGRyID0gbHAtPmJhc2VfYWRkcjsKQEAgLTY4Myw3ICs2ODMsNyBAQAogCQl0eF9zdGF0dXMgJj0gflhFTF9UU1JfWE1JVF9BQ1RJVkVfTUFTSzsKIAkJb3V0X2JlMzIoYmFzZV9hZGRyICsgWEVMX1RTUl9PRkZTRVQsIHR4X3N0YXR1cyk7CiAKLQkJdHhfY29tcGxldGUgPSAxOworCQl0eF9jb21wbGV0ZSA9IHRydWU7CiAJfQogCiAJLyogQ2hlY2sgaWYgdGhlIFRyYW5zbWlzc2lvbiBmb3IgdGhlIHNlY29uZCBidWZmZXIgaXMgY29tcGxldGVkICovCkBAIC02OTUsNyArNjk1LDcgQEAKIAkJb3V0X2JlMzIoYmFzZV9hZGRyICsgWEVMX0JVRkZFUl9PRkZTRVQgKyBYRUxfVFNSX09GRlNFVCwKIAkJCSB0eF9zdGF0dXMpOwogCi0JCXR4X2NvbXBsZXRlID0gMTsKKwkJdHhfY29tcGxldGUgPSB0cnVlOwogCX0KIAogCS8qIElmIHRoZXJlIHdhcyBhIFR4IGludGVycnVwdCwgY2FsbCB0aGUgVHggSGFuZGxlciAqLwpAQCAtMTEyOSw3ICsxMTI5LDcgQEAKIAogCS8qIEdldCBJUlEgZm9yIHRoZSBkZXZpY2UgKi8KIAlyYyA9IG9mX2lycV90b19yZXNvdXJjZShvZmRldi0+ZGV2Lm9mX25vZGUsIDAsICZyX2lycSk7Ci0JaWYgKHJjID09IE5PX0lSUSkgeworCWlmICghcmMpIHsKIAkJZGV2X2VycihkZXYsICJubyBJUlEgZm91bmRcbiIpOwogCQlyZXR1cm4gcmM7CiAJfQpAQCAtMTMwMywyNyArMTMwMyw3IEBACiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh4ZW1hY2xpdGVfb2ZfcmVtb3ZlKSwKIH07CiAKLS8qKgotICogeGdwaW9wc3NfaW5pdCAtIEluaXRpYWwgZHJpdmVyIHJlZ2lzdHJhdGlvbiBjYWxsCi0gKgotICogUmV0dXJuOgkwIHVwb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciB1cG9uIGZhaWx1cmUuCi0gKi8KLXN0YXRpYyBpbnQgX19pbml0IHhlbWFjbGl0ZV9pbml0KHZvaWQpCi17Ci0JLyogTm8ga2VybmVsIGJvb3Qgb3B0aW9ucyB1c2VkLCB3ZSBqdXN0IG5lZWQgdG8gcmVnaXN0ZXIgdGhlIGRyaXZlciAqLwotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnhlbWFjbGl0ZV9vZl9kcml2ZXIpOwotfQotCi0vKioKLSAqIHhlbWFjbGl0ZV9jbGVhbnVwIC0gRHJpdmVyIHVuLXJlZ2lzdHJhdGlvbiBjYWxsCi0gKi8KLXN0YXRpYyB2b2lkIF9fZXhpdCB4ZW1hY2xpdGVfY2xlYW51cCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZ4ZW1hY2xpdGVfb2ZfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoeGVtYWNsaXRlX2luaXQpOwotbW9kdWxlX2V4aXQoeGVtYWNsaXRlX2NsZWFudXApOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcih4ZW1hY2xpdGVfb2ZfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiWGlsaW54LCBJbmMuIik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlhpbGlueCBFdGhlcm5ldCBNQUMgTGl0ZSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpcmNvbS94aXJjMnBzX2NzLmMgYi9kcml2ZXJzL25ldC9ldGhlcm5ldC94aXJjb20veGlyYzJwc19jcy5jCmluZGV4IGJiZThiN2QuLjMzOTc5YzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2V0aGVybmV0L3hpcmNvbS94aXJjMnBzX2NzLmMKKysrIGIvZHJpdmVycy9uZXQvZXRoZXJuZXQveGlyY29tL3hpcmMycHNfY3MuYwpAQCAtMTQxMSw3ICsxNDExLDcgQEAKIHN0YXRpYyB2b2lkIG5ldGRldl9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RyY3B5KGluZm8tPmRyaXZlciwgInhpcmMycHNfY3MiKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgInhpcmMycHNfY3MiLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CiAJc3ByaW50ZihpbmZvLT5idXNfaW5mbywgIlBDTUNJQSAweCVseCIsIGRldi0+YmFzZV9hZGRyKTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaWZiLmMgYi9kcml2ZXJzL25ldC9pZmIuYwppbmRleCA0NmI1ZjVmLi5lMDViNjQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pZmIuYworKysgYi9kcml2ZXJzL25ldC9pZmIuYwpAQCAtMTY0LDcgKzE2NCw3IEBACiAJLm5kb192YWxpZGF0ZV9hZGRyID0gZXRoX3ZhbGlkYXRlX2FkZHIsCiB9OwogCi0jZGVmaW5lIElGQl9GRUFUVVJFUyAoTkVUSUZfRl9OT19DU1VNIHwgTkVUSUZfRl9TRyAgfCBORVRJRl9GX0ZSQUdMSVNUCXwgXAorI2RlZmluZSBJRkJfRkVBVFVSRVMgKE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfU0cgIHwgTkVUSUZfRl9GUkFHTElTVAl8IFwKIAkJICAgICAgTkVUSUZfRl9UU09fRUNOIHwgTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYJfCBcCiAJCSAgICAgIE5FVElGX0ZfSElHSERNQSB8IE5FVElGX0ZfSFdfVkxBTl9UWCkKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9iZmluX3Npci5jIGIvZHJpdmVycy9uZXQvaXJkYS9iZmluX3Npci5jCmluZGV4IDlkNGNlMWEuLmE1NjFhZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvYmZpbl9zaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2JmaW5fc2lyLmMKQEAgLTgwNiwxOCArODA2LDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgYmZpbl9zaXJfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmJmaW5faXJfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IGJmaW5fc2lyX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmYmZpbl9pcl9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChiZmluX3Npcl9pbml0KTsKLW1vZHVsZV9leGl0KGJmaW5fc2lyX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihiZmluX2lyX2RyaXZlcik7CiAKIG1vZHVsZV9wYXJhbShtYXhfcmF0ZSwgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobWF4X3JhdGUsICJNYXhpbXVtIGJhdWQgcmF0ZSAoMTE1MjAwLCA1NzYwMCwgMzg0MDAsIDE5MjAwLCA5NjAwKSIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jIGIvZHJpdmVycy9uZXQvaXJkYS9kb25hdWJvZS5jCmluZGV4IGI0NWIyY2MuLjY0ZjQwM2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2lyZGEvZG9uYXVib2UuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL2RvbmF1Ym9lLmMKQEAgLTE5Nyw3ICsxOTcsNyBAQAogCiBzdGF0aWMgaW50IG1heF9iYXVkID0gNDAwMDAwMDsKICNpZmRlZiBVU0VfUFJPQkUKLXN0YXRpYyBpbnQgZG9fcHJvYmUgPSAwOworc3RhdGljIGJvb2wgZG9fcHJvYmUgPSBmYWxzZTsKICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvcHhhZmljcF9pci5jIGIvZHJpdmVycy9uZXQvaXJkYS9weGFmaWNwX2lyLmMKaW5kZXggZDA4NTFkZi4uODFkNTI3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9weGFmaWNwX2lyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9weGFmaWNwX2lyLmMKQEAgLTk2NiwxOCArOTY2LDcgQEAKIAkucmVzdW1lCQk9IHB4YV9pcmRhX3Jlc3VtZSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHB4YV9pcmRhX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZweGFfaXJfZHJpdmVyKTsKLX0KLQotc3RhdGljIHZvaWQgX19leGl0IHB4YV9pcmRhX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcHhhX2lyX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHB4YV9pcmRhX2luaXQpOwotbW9kdWxlX2V4aXQocHhhX2lyZGFfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHB4YV9pcl9kcml2ZXIpOwogCiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnB4YTJ4eC1pciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaF9pcmRhLmMgYi9kcml2ZXJzL25ldC9pcmRhL3NoX2lyZGEuYwppbmRleCBkMjc1ZTI3Li43MjVkNmIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9pcmRhL3NoX2lyZGEuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3NoX2lyZGEuYwpAQCAtODczLDE4ICs4NzMsNyBAQAogCX0sCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBzaF9pcmRhX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZzaF9pcmRhX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzaF9pcmRhX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc2hfaXJkYV9kcml2ZXIpOwotfQotCi1tb2R1bGVfaW5pdChzaF9pcmRhX2luaXQpOwotbW9kdWxlX2V4aXQoc2hfaXJkYV9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoc2hfaXJkYV9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJLdW5pbm9yaSBNb3JpbW90byA8a3VuaW5vcmkubW9yaW1vdG8uZ3hAcmVuZXNhcy5jb20+Iik7CiBNT0RVTEVfREVTQ1JJUFRJT04oIlN1cGVySCBJckRBIGRyaXZlciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvaXJkYS9zaF9zaXIuYyBiL2RyaXZlcnMvbmV0L2lyZGEvc2hfc2lyLmMKaW5kZXggZWQ3ZDdkNi4uZTY2NjFiNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zaF9zaXIuYworKysgYi9kcml2ZXJzL25ldC9pcmRhL3NoX3Npci5jCkBAIC04MDgsMTggKzgwOCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHNoX3Npcl9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc2hfc2lyX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBzaF9zaXJfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzaF9zaXJfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoc2hfc2lyX2luaXQpOwotbW9kdWxlX2V4aXQoc2hfc2lyX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihzaF9zaXJfZHJpdmVyKTsKIAogTU9EVUxFX0FVVEhPUigiS3VuaW5vcmkgTW9yaW1vdG8gPG1vcmltb3RvLmt1bmlub3JpQHJlbmVzYXMuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJTdXBlckggSXJEQSBkcml2ZXIiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2lyZGEvc21zYy1pcmNjMi5jIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKaW5kZXggOGIxYzM0OC4uNmM5NWQ0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKKysrIGIvZHJpdmVycy9uZXQvaXJkYS9zbXNjLWlyY2MyLmMKQEAgLTc5LDcgKzc5LDcgQEAKIE1PRFVMRV9ERVNDUklQVElPTigiU01DIElyQ0MgU0lSL0ZJUiBjb250cm9sbGVyIGRyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1zdGF0aWMgaW50IHNtc2Nfbm9wbnAgPSAxOworc3RhdGljIGJvb2wgc21zY19ub3BucCA9IHRydWU7CiBtb2R1bGVfcGFyYW1fbmFtZWQobm9wbnAsIHNtc2Nfbm9wbnAsIGJvb2wsIDApOwogTU9EVUxFX1BBUk1fREVTQyhub3BucCwgIkRvIG5vdCB1c2UgUE5QIHRvIGRldGVjdCBjb250cm9sbGVyIHNldHRpbmdzLCBkZWZhdWx0cyB0byB0cnVlIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMgYi9kcml2ZXJzL25ldC9sb29wYmFjay5jCmluZGV4IDRjZTllNWYuLmI3MTk5OGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L2xvb3BiYWNrLmMKKysrIGIvZHJpdmVycy9uZXQvbG9vcGJhY2suYwpAQCAtMTY5LDcgKzE2OSw3IEBACiAJZGV2LT5mZWF0dXJlcyAJCT0gTkVUSUZfRl9TRyB8IE5FVElGX0ZfRlJBR0xJU1QKIAkJfCBORVRJRl9GX0FMTF9UU08KIAkJfCBORVRJRl9GX1VGTwotCQl8IE5FVElGX0ZfTk9fQ1NVTQorCQl8IE5FVElGX0ZfSFdfQ1NVTQogCQl8IE5FVElGX0ZfUlhDU1VNCiAJCXwgTkVUSUZfRl9ISUdIRE1BCiAJCXwgTkVUSUZfRl9MTFRYCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9tYWN2bGFuLmMgYi9kcml2ZXJzL25ldC9tYWN2bGFuLmMKaW5kZXggNzQxMzQ5Ny4uZjJmODIwYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvbWFjdmxhbi5jCisrKyBiL2RyaXZlcnMvbmV0L21hY3ZsYW4uYwpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfbWFjdmxhbi5oPgogI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KQEAgLTUyMCwyNiArNTIxLDIzIEBACiAJcmV0dXJuIHN0YXRzOwogfQogCi1zdGF0aWMgdm9pZCBtYWN2bGFuX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIGludCBtYWN2bGFuX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgICB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CiAJc3RydWN0IG1hY3ZsYW5fZGV2ICp2bGFuID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbG93ZXJkZXYgPSB2bGFuLT5sb3dlcmRldjsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IGxvd2VyZGV2LT5uZXRkZXZfb3BzOwogCi0JaWYgKG9wcy0+bmRvX3ZsYW5fcnhfYWRkX3ZpZCkKLQkJb3BzLT5uZG9fdmxhbl9yeF9hZGRfdmlkKGxvd2VyZGV2LCB2aWQpOworCXJldHVybiB2bGFuX3ZpZF9hZGQobG93ZXJkZXYsIHZpZCk7CiB9CiAKLXN0YXRpYyB2b2lkIG1hY3ZsYW5fdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIGludCBtYWN2bGFuX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICAgIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgbWFjdmxhbl9kZXYgKnZsYW4gPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpsb3dlcmRldiA9IHZsYW4tPmxvd2VyZGV2OwotCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gbG93ZXJkZXYtPm5ldGRldl9vcHM7CiAKLQlpZiAob3BzLT5uZG9fdmxhbl9yeF9raWxsX3ZpZCkKLQkJb3BzLT5uZG9fdmxhbl9yeF9raWxsX3ZpZChsb3dlcmRldiwgdmlkKTsKKwl2bGFuX3ZpZF9kZWwobG93ZXJkZXYsIHZpZCk7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIG1hY3ZsYW5fZXRodG9vbF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvbWFjdnRhcC5jIGIvZHJpdmVycy9uZXQvbWFjdnRhcC5jCmluZGV4IDFiNzA4MmQuLjU4ZGMxMTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21hY3Z0YXAuYworKysgYi9kcml2ZXJzL25ldC9tYWN2dGFwLmMKQEAgLTE0NSw4ICsxNDUsOCBAQAogCWlmICh2bGFuKSB7CiAJCWludCBpbmRleCA9IGdldF9zbG90KHZsYW4sIHEpOwogCi0JCXJjdV9hc3NpZ25fcG9pbnRlcih2bGFuLT50YXBzW2luZGV4XSwgTlVMTCk7Ci0JCXJjdV9hc3NpZ25fcG9pbnRlcihxLT52bGFuLCBOVUxMKTsKKwkJUkNVX0lOSVRfUE9JTlRFUih2bGFuLT50YXBzW2luZGV4XSwgTlVMTCk7CisJCVJDVV9JTklUX1BPSU5URVIocS0+dmxhbiwgTlVMTCk7CiAJCXNvY2tfcHV0KCZxLT5zayk7CiAJCS0tdmxhbi0+bnVtdnRhcHM7CiAJfQpAQCAtMTc1LDYgKzE3NSwxNCBAQAogCWlmICghbnVtdnRhcHMpCiAJCWdvdG8gb3V0OwogCisJLyogQ2hlY2sgaWYgd2UgY2FuIHVzZSBmbG93IHRvIHNlbGVjdCBhIHF1ZXVlICovCisJcnhxID0gc2tiX2dldF9yeGhhc2goc2tiKTsKKwlpZiAocnhxKSB7CisJCXRhcCA9IHJjdV9kZXJlZmVyZW5jZSh2bGFuLT50YXBzW3J4cSAlIG51bXZ0YXBzXSk7CisJCWlmICh0YXApCisJCQlnb3RvIG91dDsKKwl9CisKIAlpZiAobGlrZWx5KHNrYl9yeF9xdWV1ZV9yZWNvcmRlZChza2IpKSkgewogCQlyeHEgPSBza2JfZ2V0X3J4X3F1ZXVlKHNrYik7CiAKQEAgLTE4NiwxNCArMTk0LDYgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAotCS8qIENoZWNrIGlmIHdlIGNhbiB1c2UgZmxvdyB0byBzZWxlY3QgYSBxdWV1ZSAqLwotCXJ4cSA9IHNrYl9nZXRfcnhoYXNoKHNrYik7Ci0JaWYgKHJ4cSkgewotCQl0YXAgPSByY3VfZGVyZWZlcmVuY2Uodmxhbi0+dGFwc1tyeHEgJSBudW12dGFwc10pOwotCQlpZiAodGFwKQotCQkJZ290byBvdXQ7Ci0JfQotCiAJLyogRXZlcnl0aGluZyBmYWlsZWQgLSBmaW5kIGZpcnN0IGF2YWlsYWJsZSBxdWV1ZSAqLwogCWZvciAocnhxID0gMDsgcnhxIDwgTUFYX01BQ1ZUQVBfUVVFVUVTOyByeHErKykgewogCQl0YXAgPSByY3VfZGVyZWZlcmVuY2Uodmxhbi0+dGFwc1tyeHFdKTsKQEAgLTIyMyw4ICsyMjMsOCBAQAogCQkJCQkgICAgICBsb2NrZGVwX2lzX2hlbGQoJm1hY3Z0YXBfbG9jaykpOwogCQlpZiAocSkgewogCQkJcWxpc3RbaisrXSA9IHE7Ci0JCQlyY3VfYXNzaWduX3BvaW50ZXIodmxhbi0+dGFwc1tpXSwgTlVMTCk7Ci0JCQlyY3VfYXNzaWduX3BvaW50ZXIocS0+dmxhbiwgTlVMTCk7CisJCQlSQ1VfSU5JVF9QT0lOVEVSKHZsYW4tPnRhcHNbaV0sIE5VTEwpOworCQkJUkNVX0lOSVRfUE9JTlRFUihxLT52bGFuLCBOVUxMKTsKIAkJCXZsYW4tPm51bXZ0YXBzLS07CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9taWkuYyBiL2RyaXZlcnMvbmV0L21paS5jCmluZGV4IGM2MmU3ODEuLmM3MGMyMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L21paS5jCisrKyBiL2RyaXZlcnMvbmV0L21paS5jCkBAIC0zNSwyNiArMzUsMTEgQEAKIAogc3RhdGljIHUzMiBtaWlfZ2V0X2FuKHN0cnVjdCBtaWlfaWZfaW5mbyAqbWlpLCB1MTYgYWRkcikKIHsKLQl1MzIgcmVzdWx0ID0gMDsKIAlpbnQgYWR2ZXJ0OwogCiAJYWR2ZXJ0ID0gbWlpLT5tZGlvX3JlYWQobWlpLT5kZXYsIG1paS0+cGh5X2lkLCBhZGRyKTsKLQlpZiAoYWR2ZXJ0ICYgTFBBX0xQQUNLKQotCQlyZXN1bHQgfD0gQURWRVJUSVNFRF9BdXRvbmVnOwotCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VfMTBIQUxGKQotCQlyZXN1bHQgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0hhbGY7Ci0JaWYgKGFkdmVydCAmIEFEVkVSVElTRV8xMEZVTEwpCi0JCXJlc3VsdCB8PSBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbDsKLQlpZiAoYWR2ZXJ0ICYgQURWRVJUSVNFXzEwMEhBTEYpCi0JCXJlc3VsdCB8PSBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGY7Ci0JaWYgKGFkdmVydCAmIEFEVkVSVElTRV8xMDBGVUxMKQotCQlyZXN1bHQgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsOwotCWlmIChhZHZlcnQgJiBBRFZFUlRJU0VfUEFVU0VfQ0FQKQotCQlyZXN1bHQgfD0gQURWRVJUSVNFRF9QYXVzZTsKLQlpZiAoYWR2ZXJ0ICYgQURWRVJUSVNFX1BBVVNFX0FTWU0pCi0JCXJlc3VsdCB8PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CiAKLQlyZXR1cm4gcmVzdWx0OworCXJldHVybiBtaWlfbHBhX3RvX2V0aHRvb2xfbHBhX3QoYWR2ZXJ0KTsKIH0KIAogLyoqCkBAIC0xMDQsMTkgKzg5LDE0IEBACiAJCWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKIAogCQllY21kLT5hZHZlcnRpc2luZyB8PSBtaWlfZ2V0X2FuKG1paSwgTUlJX0FEVkVSVElTRSk7Ci0JCWlmIChjdHJsMTAwMCAmIEFEVkVSVElTRV8xMDAwSEFMRikKLQkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGY7Ci0JCWlmIChjdHJsMTAwMCAmIEFEVkVSVElTRV8xMDAwRlVMTCkKLQkJCWVjbWQtPmFkdmVydGlzaW5nIHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisJCWlmIChtaWktPnN1cHBvcnRzX2dtaWkpCisJCQllY21kLT5hZHZlcnRpc2luZyB8PQorCQkJCQltaWlfY3RybDEwMDBfdG9fZXRodG9vbF9hZHZfdChjdHJsMTAwMCk7CiAKIAkJaWYgKGJtc3IgJiBCTVNSX0FORUdDT01QTEVURSkgewogCQkJZWNtZC0+bHBfYWR2ZXJ0aXNpbmcgPSBtaWlfZ2V0X2FuKG1paSwgTUlJX0xQQSk7Ci0JCQlpZiAoc3RhdDEwMDAgJiBMUEFfMTAwMEhBTEYpCi0JCQkJZWNtZC0+bHBfYWR2ZXJ0aXNpbmcgfD0KLQkJCQkJQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZjsKLQkJCWlmIChzdGF0MTAwMCAmIExQQV8xMDAwRlVMTCkKLQkJCQllY21kLT5scF9hZHZlcnRpc2luZyB8PQotCQkJCQlBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsOworCQkJZWNtZC0+bHBfYWR2ZXJ0aXNpbmcgfD0KKwkJCQkJbWlpX3N0YXQxMDAwX3RvX2V0aHRvb2xfbHBhX3Qoc3RhdDEwMDApOwogCQl9IGVsc2UgewogCQkJZWNtZC0+bHBfYWR2ZXJ0aXNpbmcgPSAwOwogCQl9CkBAIC0yMDQsMjAgKzE4NCwxMSBAQAogCQkJYWR2ZXJ0MiA9IG1paS0+bWRpb19yZWFkKGRldiwgbWlpLT5waHlfaWQsIE1JSV9DVFJMMTAwMCk7CiAJCQl0bXAyID0gYWR2ZXJ0MiAmIH4oQURWRVJUSVNFXzEwMDBIQUxGIHwgQURWRVJUSVNFXzEwMDBGVUxMKTsKIAkJfQotCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfSGFsZikKLQkJCXRtcCB8PSBBRFZFUlRJU0VfMTBIQUxGOwotCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwYmFzZVRfRnVsbCkKLQkJCXRtcCB8PSBBRFZFUlRJU0VfMTBGVUxMOwotCQlpZiAoZWNtZC0+YWR2ZXJ0aXNpbmcgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCi0JCQl0bXAgfD0gQURWRVJUSVNFXzEwMEhBTEY7Ci0JCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbCkKLQkJCXRtcCB8PSBBRFZFUlRJU0VfMTAwRlVMTDsKLQkJaWYgKG1paS0+c3VwcG9ydHNfZ21paSkgewotCQkJaWYgKGVjbWQtPmFkdmVydGlzaW5nICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZikKLQkJCQl0bXAyIHw9IEFEVkVSVElTRV8xMDAwSEFMRjsKLQkJCWlmIChlY21kLT5hZHZlcnRpc2luZyAmIEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGwpCi0JCQkJdG1wMiB8PSBBRFZFUlRJU0VfMTAwMEZVTEw7Ci0JCX0KKwkJdG1wIHw9IGV0aHRvb2xfYWR2X3RvX21paV9hZHZfdChlY21kLT5hZHZlcnRpc2luZyk7CisKKwkJaWYgKG1paS0+c3VwcG9ydHNfZ21paSkKKwkJCXRtcDIgfD0KKwkJCSAgICAgIGV0aHRvb2xfYWR2X3RvX21paV9jdHJsMTAwMF90KGVjbWQtPmFkdmVydGlzaW5nKTsKIAkJaWYgKGFkdmVydCAhPSB0bXApIHsKIAkJCW1paS0+bWRpb193cml0ZShkZXYsIG1paS0+cGh5X2lkLCBNSUlfQURWRVJUSVNFLCB0bXApOwogCQkJbWlpLT5hZHZlcnRpc2luZyA9IHRtcDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9LY29uZmlnIGIvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKaW5kZXggYmI4OGUxMi4uZmJkY2RmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKKysrIGIvZHJpdmVycy9uZXQvcGh5L0tjb25maWcKQEAgLTMsNyArMyw3IEBACiAjCiAKIG1lbnVjb25maWcgUEhZTElCCi0JYm9vbCAiUEhZIERldmljZSBzdXBwb3J0IGFuZCBpbmZyYXN0cnVjdHVyZSIKKwl0cmlzdGF0ZSAiUEhZIERldmljZSBzdXBwb3J0IGFuZCBpbmZyYXN0cnVjdHVyZSIKIAlkZXBlbmRzIG9uICFTMzkwCiAJZGVwZW5kcyBvbiBORVRERVZJQ0VTCiAJaGVscApAQCAtMTMxLDMgKzEzMSw3IEBACiAJICBJZiBpbiBkb3VidCwgc2F5IFkuCiAKIGVuZGlmICMgUEhZTElCCisKK2NvbmZpZyBNSUNSRUxfS1M4OTk1TUEKKwl0cmlzdGF0ZSAiTWljcmVsIEtTODk5NU1BIDUtcG9ydHMgMTAvMTAwIG1hbmFnZWQgRXRoZXJuZXQgc3dpdGNoIgorCWRlcGVuZHMgb24gU1BJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC9waHkvTWFrZWZpbGUKaW5kZXggMjMzMzIxNS4uZTE1YzgzZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcGh5L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9NYWtlZmlsZQpAQCAtMjMsMyArMjMsNCBAQAogb2JqLSQoQ09ORklHX1NURTEwWFApCQkrPSBzdGUxMFhwLm8KIG9iai0kKENPTkZJR19NSUNSRUxfUEhZKQkrPSBtaWNyZWwubwogb2JqLSQoQ09ORklHX01ESU9fT0NURU9OKQkrPSBtZGlvLW9jdGVvbi5vCitvYmotJChDT05GSUdfTUlDUkVMX0tTODk5NU1BKQkrPSBzcGlfa3M4OTk1Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvLWJpdGJhbmcuYyBiL2RyaXZlcnMvbmV0L3BoeS9tZGlvLWJpdGJhbmcuYwppbmRleCA2NTM5MTg5Li5kYWVjOWIwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvbWRpby1iaXRiYW5nLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L21kaW8tYml0YmFuZy5jCkBAIC0yMDIsNiArMjAyLDE0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgbWRpb2JiX3Jlc2V0KHN0cnVjdCBtaWlfYnVzICpidXMpCit7CisJc3RydWN0IG1kaW9iYl9jdHJsICpjdHJsID0gYnVzLT5wcml2OworCWlmIChjdHJsLT5yZXNldCkKKwkJY3RybC0+cmVzZXQoYnVzKTsKKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IG1paV9idXMgKmFsbG9jX21kaW9fYml0YmFuZyhzdHJ1Y3QgbWRpb2JiX2N0cmwgKmN0cmwpCiB7CiAJc3RydWN0IG1paV9idXMgKmJ1czsKQEAgLTIxNCw2ICsyMjIsNyBAQAogCiAJYnVzLT5yZWFkID0gbWRpb2JiX3JlYWQ7CiAJYnVzLT53cml0ZSA9IG1kaW9iYl93cml0ZTsKKwlidXMtPnJlc2V0ID0gbWRpb2JiX3Jlc2V0OwogCWJ1cy0+cHJpdiA9IGN0cmw7CiAKIAlyZXR1cm4gYnVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcGh5L21kaW8tZ3Bpby5jIGIvZHJpdmVycy9uZXQvcGh5L21kaW8tZ3Bpby5jCmluZGV4IDI4NDNjOTAuLjg5YzVhM2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9tZGlvLWdwaW8uYworKysgYi9kcml2ZXJzL25ldC9waHkvbWRpby1ncGlvLmMKQEAgLTk1LDYgKzk1LDcgQEAKIAkJZ290byBvdXQ7CiAKIAliaXRiYW5nLT5jdHJsLm9wcyA9ICZtZGlvX2dwaW9fb3BzOworCWJpdGJhbmctPmN0cmwucmVzZXQgPSBwZGF0YS0+cmVzZXQ7CiAJYml0YmFuZy0+bWRjID0gcGRhdGEtPm1kYzsKIAliaXRiYW5nLT5tZGlvID0gcGRhdGEtPm1kaW87CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMgYi9kcml2ZXJzL25ldC9waHkvcGh5X2RldmljZS5jCmluZGV4IDgzYTVhNWEuLmYzMjBmNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3BoeS9waHlfZGV2aWNlLmMKKysrIGIvZHJpdmVycy9uZXQvcGh5L3BoeV9kZXZpY2UuYwpAQCAtNTYzLDIwICs1NjMsOSBAQAogCWlmIChhZHYgPCAwKQogCQlyZXR1cm4gYWR2OwogCi0JYWR2ICY9IH4oQURWRVJUSVNFX0FMTCB8IEFEVkVSVElTRV8xMDBCQVNFNCB8IEFEVkVSVElTRV9QQVVTRV9DQVAgfCAKKwlhZHYgJj0gfihBRFZFUlRJU0VfQUxMIHwgQURWRVJUSVNFXzEwMEJBU0U0IHwgQURWRVJUSVNFX1BBVVNFX0NBUCB8CiAJCSBBRFZFUlRJU0VfUEFVU0VfQVNZTSk7Ci0JaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQotCQlhZHYgfD0gQURWRVJUSVNFXzEwSEFMRjsKLQlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCi0JCWFkdiB8PSBBRFZFUlRJU0VfMTBGVUxMOwotCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCi0JCWFkdiB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKLQlpZiAoYWR2ZXJ0aXNlICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQotCQlhZHYgfD0gQURWRVJUSVNFXzEwMEZVTEw7Ci0JaWYgKGFkdmVydGlzZSAmIEFEVkVSVElTRURfUGF1c2UpCi0JCWFkdiB8PSBBRFZFUlRJU0VfUEFVU0VfQ0FQOwotCWlmIChhZHZlcnRpc2UgJiBBRFZFUlRJU0VEX0FzeW1fUGF1c2UpCi0JCWFkdiB8PSBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKKwlhZHYgfD0gZXRodG9vbF9hZHZfdG9fbWlpX2Fkdl90KGFkdmVydGlzZSk7CiAKIAlpZiAoYWR2ICE9IG9sZGFkdikgewogCQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfQURWRVJUSVNFLCBhZHYpOwpAQCAtNTk1LDEwICs1ODQsNyBAQAogCQkJcmV0dXJuIGFkdjsKIAogCQlhZHYgJj0gfihBRFZFUlRJU0VfMTAwMEZVTEwgfCBBRFZFUlRJU0VfMTAwMEhBTEYpOwotCQlpZiAoYWR2ZXJ0aXNlICYgU1VQUE9SVEVEXzEwMDBiYXNlVF9IYWxmKQotCQkJYWR2IHw9IEFEVkVSVElTRV8xMDAwSEFMRjsKLQkJaWYgKGFkdmVydGlzZSAmIFNVUFBPUlRFRF8xMDAwYmFzZVRfRnVsbCkKLQkJCWFkdiB8PSBBRFZFUlRJU0VfMTAwMEZVTEw7CisJCWFkdiB8PSBldGh0b29sX2Fkdl90b19taWlfY3RybDEwMDBfdChhZHZlcnRpc2UpOwogCiAJCWlmIChhZHYgIT0gb2xkYWR2KSB7CiAJCQllcnIgPSBwaHlfd3JpdGUocGh5ZGV2LCBNSUlfQ1RSTDEwMDAsIGFkdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC9waHkvc21zYy5jIGIvZHJpdmVycy9uZXQvcGh5L3Ntc2MuYwppbmRleCAzNDI1MDVjLi5mYzNlN2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC9waHkvc21zYy5jCisrKyBiL2RyaXZlcnMvbmV0L3BoeS9zbXNjLmMKQEAgLTIyLDI2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L3BoeS5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotCi0jZGVmaW5lIE1JSV9MQU44M0MxODVfSVNGIDI5IC8qIEludGVycnVwdCBTb3VyY2UgRmxhZ3MgKi8KLSNkZWZpbmUgTUlJX0xBTjgzQzE4NV9JTSAgMzAgLyogSW50ZXJydXB0IE1hc2sgKi8KLSNkZWZpbmUgTUlJX0xBTjgzQzE4NV9DVFJMX1NUQVRVUyAxNyAvKiBNb2RlL1N0YXR1cyBSZWdpc3RlciAqLwotCi0jZGVmaW5lIE1JSV9MQU44M0MxODVfSVNGX0lOVDEgKDE8PDEpIC8qIEF1dG8tTmVnb3RpYXRpb24gUGFnZSBSZWNlaXZlZCAqLwotI2RlZmluZSBNSUlfTEFOODNDMTg1X0lTRl9JTlQyICgxPDwyKSAvKiBQYXJhbGxlbCBEZXRlY3Rpb24gRmF1bHQgKi8KLSNkZWZpbmUgTUlJX0xBTjgzQzE4NV9JU0ZfSU5UMyAoMTw8MykgLyogQXV0by1OZWdvdGlhdGlvbiBMUCBBY2sgKi8KLSNkZWZpbmUgTUlJX0xBTjgzQzE4NV9JU0ZfSU5UNCAoMTw8NCkgLyogTGluayBEb3duICovCi0jZGVmaW5lIE1JSV9MQU44M0MxODVfSVNGX0lOVDUgKDE8PDUpIC8qIFJlbW90ZSBGYXVsdCBEZXRlY3RlZCAqLwotI2RlZmluZSBNSUlfTEFOODNDMTg1X0lTRl9JTlQ2ICgxPDw2KSAvKiBBdXRvLU5lZ290aWF0aW9uIGNvbXBsZXRlICovCi0jZGVmaW5lIE1JSV9MQU44M0MxODVfSVNGX0lOVDcgKDE8PDcpIC8qIEVORVJHWU9OICovCi0KLSNkZWZpbmUgTUlJX0xBTjgzQzE4NV9JU0ZfSU5UX0FMTCAoMHgwZSkKLQotI2RlZmluZSBNSUlfTEFOODNDMTg1X0lTRl9JTlRfUEhZTElCX0VWRU5UUyBcCi0JKE1JSV9MQU44M0MxODVfSVNGX0lOVDYgfCBNSUlfTEFOODNDMTg1X0lTRl9JTlQ0IHwgXAotCSBNSUlfTEFOODNDMTg1X0lTRl9JTlQ3KQotCi0jZGVmaW5lIE1JSV9MQU44M0MxODVfRURQV1JET1dOCSgxIDw8IDEzKSAvKiBFRFBXUkRPV04gKi8KKyNpbmNsdWRlIDxsaW51eC9zbXNjcGh5Lmg+CiAKIHN0YXRpYyBpbnQgc21zY19waHlfY29uZmlnX2ludHIoc3RydWN0IHBoeV9kZXZpY2UgKnBoeWRldikKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3BoeS9zcGlfa3M4OTk1LmMgYi9kcml2ZXJzL25ldC9waHkvc3BpX2tzODk5NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNmEyZGQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC9waHkvc3BpX2tzODk5NS5jCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogU1BJIGRyaXZlciBmb3IgTWljcmVsL0tlbmRpbiBLUzg5OTVNIGV0aGVybmV0IHN3aXRjaAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBHYWJvciBKdWhvcyA8anVob3NnIGF0IG9wZW53cnQub3JnPgorICoKKyAqIFRoaXMgZmlsZSB3YXMgYmFzZWQgb246IGRyaXZlcnMvc3BpL2F0MjUuYworICogICAgIENvcHlyaWdodCAoQykgMjAwNiBEYXZpZCBCcm93bmVsbAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+CisKKyNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisKKyNkZWZpbmUgRFJWX1ZFUlNJT04JCSIwLjEuMSIKKyNkZWZpbmUgRFJWX0RFU0MJCSJNaWNyZWwgS1M4OTk1IEV0aGVybmV0IHN3aXRjaCBTUEkgZHJpdmVyIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLUzg5OTVfUkVHX0lEMAkJMHgwMCAgICAvKiBDaGlwIElEMCAqLworI2RlZmluZSBLUzg5OTVfUkVHX0lEMQkJMHgwMSAgICAvKiBDaGlwIElEMSAqLworCisjZGVmaW5lIEtTODk5NV9SRUdfR0MwCQkweDAyICAgIC8qIEdsb2JhbCBDb250cm9sIDAgKi8KKyNkZWZpbmUgS1M4OTk1X1JFR19HQzEJCTB4MDMgICAgLyogR2xvYmFsIENvbnRyb2wgMSAqLworI2RlZmluZSBLUzg5OTVfUkVHX0dDMgkJMHgwNCAgICAvKiBHbG9iYWwgQ29udHJvbCAyICovCisjZGVmaW5lIEtTODk5NV9SRUdfR0MzCQkweDA1ICAgIC8qIEdsb2JhbCBDb250cm9sIDMgKi8KKyNkZWZpbmUgS1M4OTk1X1JFR19HQzQJCTB4MDYgICAgLyogR2xvYmFsIENvbnRyb2wgNCAqLworI2RlZmluZSBLUzg5OTVfUkVHX0dDNQkJMHgwNyAgICAvKiBHbG9iYWwgQ29udHJvbCA1ICovCisjZGVmaW5lIEtTODk5NV9SRUdfR0M2CQkweDA4ICAgIC8qIEdsb2JhbCBDb250cm9sIDYgKi8KKyNkZWZpbmUgS1M4OTk1X1JFR19HQzcJCTB4MDkgICAgLyogR2xvYmFsIENvbnRyb2wgNyAqLworI2RlZmluZSBLUzg5OTVfUkVHX0dDOAkJMHgwYSAgICAvKiBHbG9iYWwgQ29udHJvbCA4ICovCisjZGVmaW5lIEtTODk5NV9SRUdfR0M5CQkweDBiICAgIC8qIEdsb2JhbCBDb250cm9sIDkgKi8KKworI2RlZmluZSBLUzg5OTVfUkVHX1BDKHAsIHIpCSgoMHgxMCAqIHApICsgcikJIC8qIFBvcnQgQ29udHJvbCAqLworI2RlZmluZSBLUzg5OTVfUkVHX1BTKHAsIHIpCSgoMHgxMCAqIHApICsgciArIDB4ZSkgIC8qIFBvcnQgU3RhdHVzICovCisKKyNkZWZpbmUgS1M4OTk1X1JFR19UUEMwCQkweDYwICAgIC8qIFRPUyBQcmlvcml0eSBDb250cm9sIDAgKi8KKyNkZWZpbmUgS1M4OTk1X1JFR19UUEMxCQkweDYxICAgIC8qIFRPUyBQcmlvcml0eSBDb250cm9sIDEgKi8KKyNkZWZpbmUgS1M4OTk1X1JFR19UUEMyCQkweDYyICAgIC8qIFRPUyBQcmlvcml0eSBDb250cm9sIDIgKi8KKyNkZWZpbmUgS1M4OTk1X1JFR19UUEMzCQkweDYzICAgIC8qIFRPUyBQcmlvcml0eSBDb250cm9sIDMgKi8KKyNkZWZpbmUgS1M4OTk1X1JFR19UUEM0CQkweDY0ICAgIC8qIFRPUyBQcmlvcml0eSBDb250cm9sIDQgKi8KKyNkZWZpbmUgS1M4OTk1X1JFR19UUEM1CQkweDY1ICAgIC8qIFRPUyBQcmlvcml0eSBDb250cm9sIDUgKi8KKyNkZWZpbmUgS1M4OTk1X1JFR19UUEM2CQkweDY2ICAgIC8qIFRPUyBQcmlvcml0eSBDb250cm9sIDYgKi8KKyNkZWZpbmUgS1M4OTk1X1JFR19UUEM3CQkweDY3ICAgIC8qIFRPUyBQcmlvcml0eSBDb250cm9sIDcgKi8KKworI2RlZmluZSBLUzg5OTVfUkVHX01BQzAJCTB4NjggICAgLyogTUFDIGFkZHJlc3MgMCAqLworI2RlZmluZSBLUzg5OTVfUkVHX01BQzEJCTB4NjkgICAgLyogTUFDIGFkZHJlc3MgMSAqLworI2RlZmluZSBLUzg5OTVfUkVHX01BQzIJCTB4NmEgICAgLyogTUFDIGFkZHJlc3MgMiAqLworI2RlZmluZSBLUzg5OTVfUkVHX01BQzMJCTB4NmIgICAgLyogTUFDIGFkZHJlc3MgMyAqLworI2RlZmluZSBLUzg5OTVfUkVHX01BQzQJCTB4NmMgICAgLyogTUFDIGFkZHJlc3MgNCAqLworI2RlZmluZSBLUzg5OTVfUkVHX01BQzUJCTB4NmQgICAgLyogTUFDIGFkZHJlc3MgNSAqLworCisjZGVmaW5lIEtTODk5NV9SRUdfSUFDMAkJMHg2ZSAgICAvKiBJbmRpcmVjdCBBY2Nlc3MgQ29udHJvbCAwICovCisjZGVmaW5lIEtTODk5NV9SRUdfSUFDMQkJMHg2ZiAgICAvKiBJbmRpcmVjdCBBY2Nlc3MgQ29udHJvbCAwICovCisjZGVmaW5lIEtTODk5NV9SRUdfSUFENwkJMHg3MCAgICAvKiBJbmRpcmVjdCBBY2Nlc3MgRGF0YSA3ICovCisjZGVmaW5lIEtTODk5NV9SRUdfSUFENgkJMHg3MSAgICAvKiBJbmRpcmVjdCBBY2Nlc3MgRGF0YSA2ICovCisjZGVmaW5lIEtTODk5NV9SRUdfSUFENQkJMHg3MiAgICAvKiBJbmRpcmVjdCBBY2Nlc3MgRGF0YSA1ICovCisjZGVmaW5lIEtTODk5NV9SRUdfSUFENAkJMHg3MyAgICAvKiBJbmRpcmVjdCBBY2Nlc3MgRGF0YSA0ICovCisjZGVmaW5lIEtTODk5NV9SRUdfSUFEMwkJMHg3NCAgICAvKiBJbmRpcmVjdCBBY2Nlc3MgRGF0YSAzICovCisjZGVmaW5lIEtTODk5NV9SRUdfSUFEMgkJMHg3NSAgICAvKiBJbmRpcmVjdCBBY2Nlc3MgRGF0YSAyICovCisjZGVmaW5lIEtTODk5NV9SRUdfSUFEMQkJMHg3NiAgICAvKiBJbmRpcmVjdCBBY2Nlc3MgRGF0YSAxICovCisjZGVmaW5lIEtTODk5NV9SRUdfSUFEMAkJMHg3NyAgICAvKiBJbmRpcmVjdCBBY2Nlc3MgRGF0YSAwICovCisKKyNkZWZpbmUgS1M4OTk1X1JFR1NfU0laRQkweDgwCisKKyNkZWZpbmUgSUQxX0NISVBJRF9NCQkweGYKKyNkZWZpbmUgSUQxX0NISVBJRF9TCQk0CisjZGVmaW5lIElEMV9SRVZJU0lPTl9NCQkweDcKKyNkZWZpbmUgSUQxX1JFVklTSU9OX1MJCTEKKyNkZWZpbmUgSUQxX1NUQVJUX1NXCQkxCS8qIHN0YXJ0IHRoZSBzd2l0Y2ggKi8KKworI2RlZmluZSBGQU1JTFlfS1M4OTk1CQkweDk1CisjZGVmaW5lIENISVBJRF9NCQkwCisKKyNkZWZpbmUgS1M4OTk1X0NNRF9XUklURQkweDAyVQorI2RlZmluZSBLUzg5OTVfQ01EX1JFQUQJCTB4MDNVCisKKyNkZWZpbmUgS1M4OTk1X1JFU0VUX0RFTEFZCTEwIC8qIHVzZWMgKi8KKworc3RydWN0IGtzODk5NV9wZGF0YSB7CisJLyogbm90IHlldCBpbXBsZW1lbnRlZCAqLworfTsKKworc3RydWN0IGtzODk5NV9zd2l0Y2ggeworCXN0cnVjdCBzcGlfZGV2aWNlCSpzcGk7CisJc3RydWN0IG11dGV4CQlsb2NrOworCXN0cnVjdCBrczg5OTVfcGRhdGEJKnBkYXRhOworfTsKKworc3RhdGljIGlubGluZSB1OCBnZXRfY2hpcF9pZCh1OCB2YWwpCit7CisJcmV0dXJuICh2YWwgPj4gSUQxX0NISVBJRF9TKSAmIElEMV9DSElQSURfTTsKK30KKworc3RhdGljIGlubGluZSB1OCBnZXRfY2hpcF9yZXYodTggdmFsKQoreworCXJldHVybiAodmFsID4+IElEMV9SRVZJU0lPTl9TKSAmIElEMV9SRVZJU0lPTl9NOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQga3M4OTk1X3JlYWQoc3RydWN0IGtzODk5NV9zd2l0Y2ggKmtzLCBjaGFyICpidWYsCisJCSB1bnNpZ25lZCBvZmZzZXQsIHNpemVfdCBjb3VudCkKK3sKKwl1OCBjbWRbMl07CisJc3RydWN0IHNwaV90cmFuc2ZlciB0WzJdOworCXN0cnVjdCBzcGlfbWVzc2FnZSBtOworCWludCBlcnI7CisKKwlzcGlfbWVzc2FnZV9pbml0KCZtKTsKKworCW1lbXNldCgmdCwgMCwgc2l6ZW9mKHQpKTsKKworCXRbMF0udHhfYnVmID0gY21kOworCXRbMF0ubGVuID0gc2l6ZW9mKGNtZCk7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMF0sICZtKTsKKworCXRbMV0ucnhfYnVmID0gYnVmOworCXRbMV0ubGVuID0gY291bnQ7CisJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMV0sICZtKTsKKworCWNtZFswXSA9IEtTODk5NV9DTURfUkVBRDsKKwljbWRbMV0gPSBvZmZzZXQ7CisKKwltdXRleF9sb2NrKCZrcy0+bG9jayk7CisJZXJyID0gc3BpX3N5bmMoa3MtPnNwaSwgJm0pOworCW11dGV4X3VubG9jaygma3MtPmxvY2spOworCisJcmV0dXJuIGVyciA/IGVyciA6IGNvdW50OworfQorCisKK3N0YXRpYyBpbnQga3M4OTk1X3dyaXRlKHN0cnVjdCBrczg5OTVfc3dpdGNoICprcywgY2hhciAqYnVmLAorCQkgdW5zaWduZWQgb2Zmc2V0LCBzaXplX3QgY291bnQpCit7CisJdTggY21kWzJdOworCXN0cnVjdCBzcGlfdHJhbnNmZXIgdFsyXTsKKwlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKKwlpbnQgZXJyOworCisJc3BpX21lc3NhZ2VfaW5pdCgmbSk7CisKKwltZW1zZXQoJnQsIDAsIHNpemVvZih0KSk7CisKKwl0WzBdLnR4X2J1ZiA9IGNtZDsKKwl0WzBdLmxlbiA9IHNpemVvZihjbWQpOworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzBdLCAmbSk7CisKKwl0WzFdLnR4X2J1ZiA9IGJ1ZjsKKwl0WzFdLmxlbiA9IGNvdW50OworCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7CisKKwljbWRbMF0gPSBLUzg5OTVfQ01EX1dSSVRFOworCWNtZFsxXSA9IG9mZnNldDsKKworCW11dGV4X2xvY2soJmtzLT5sb2NrKTsKKwllcnIgPSBzcGlfc3luYyhrcy0+c3BpLCAmbSk7CisJbXV0ZXhfdW5sb2NrKCZrcy0+bG9jayk7CisKKwlyZXR1cm4gZXJyID8gZXJyIDogY291bnQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGtzODk5NV9yZWFkX3JlZyhzdHJ1Y3Qga3M4OTk1X3N3aXRjaCAqa3MsIHU4IGFkZHIsIHU4ICpidWYpCit7CisJcmV0dXJuIChrczg5OTVfcmVhZChrcywgYnVmLCBhZGRyLCAxKSAhPSAxKTsKK30KKworc3RhdGljIGlubGluZSBpbnQga3M4OTk1X3dyaXRlX3JlZyhzdHJ1Y3Qga3M4OTk1X3N3aXRjaCAqa3MsIHU4IGFkZHIsIHU4IHZhbCkKK3sKKwljaGFyIGJ1ZiA9IHZhbDsKKworCXJldHVybiAoa3M4OTk1X3dyaXRlKGtzLCAmYnVmLCBhZGRyLCAxKSAhPSAxKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQga3M4OTk1X3N0b3Aoc3RydWN0IGtzODk5NV9zd2l0Y2ggKmtzKQoreworCXJldHVybiBrczg5OTVfd3JpdGVfcmVnKGtzLCBLUzg5OTVfUkVHX0lEMSwgMCk7Cit9CisKK3N0YXRpYyBpbnQga3M4OTk1X3N0YXJ0KHN0cnVjdCBrczg5OTVfc3dpdGNoICprcykKK3sKKwlyZXR1cm4ga3M4OTk1X3dyaXRlX3JlZyhrcywgS1M4OTk1X1JFR19JRDEsIDEpOworfQorCitzdGF0aWMgaW50IGtzODk5NV9yZXNldChzdHJ1Y3Qga3M4OTk1X3N3aXRjaCAqa3MpCit7CisJaW50IGVycjsKKworCWVyciA9IGtzODk5NV9zdG9wKGtzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJdWRlbGF5KEtTODk5NV9SRVNFVF9ERUxBWSk7CisKKwlyZXR1cm4ga3M4OTk1X3N0YXJ0KGtzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzc2l6ZV90IGtzODk5NV9yZWdpc3RlcnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgc3RydWN0IGtvYmplY3QgKmtvYmosCisJc3RydWN0IGJpbl9hdHRyaWJ1dGUgKmJpbl9hdHRyLCBjaGFyICpidWYsIGxvZmZfdCBvZmYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGtzODk5NV9zd2l0Y2ggKmtzODk5NTsKKworCWRldiA9IGNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgZGV2aWNlLCBrb2JqKTsKKwlrczg5OTUgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICh1bmxpa2VseShvZmYgPiBLUzg5OTVfUkVHU19TSVpFKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoKG9mZiArIGNvdW50KSA+IEtTODk5NV9SRUdTX1NJWkUpCisJCWNvdW50ID0gS1M4OTk1X1JFR1NfU0laRSAtIG9mZjsKKworCWlmICh1bmxpa2VseSghY291bnQpKQorCQlyZXR1cm4gY291bnQ7CisKKwlyZXR1cm4ga3M4OTk1X3JlYWQoa3M4OTk1LCBidWYsIG9mZiwgY291bnQpOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGtzODk5NV9yZWdpc3RlcnNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCXN0cnVjdCBiaW5fYXR0cmlidXRlICpiaW5fYXR0ciwgY2hhciAqYnVmLCBsb2ZmX3Qgb2ZmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBrczg5OTVfc3dpdGNoICprczg5OTU7CisKKwlkZXYgPSBjb250YWluZXJfb2Yoa29iaiwgc3RydWN0IGRldmljZSwga29iaik7CisJa3M4OTk1ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAodW5saWtlbHkob2ZmID49IEtTODk5NV9SRUdTX1NJWkUpKQorCQlyZXR1cm4gLUVGQklHOworCisJaWYgKChvZmYgKyBjb3VudCkgPiBLUzg5OTVfUkVHU19TSVpFKQorCQljb3VudCA9IEtTODk5NV9SRUdTX1NJWkUgLSBvZmY7CisKKwlpZiAodW5saWtlbHkoIWNvdW50KSkKKwkJcmV0dXJuIGNvdW50OworCisJcmV0dXJuIGtzODk5NV93cml0ZShrczg5OTUsIGJ1Ziwgb2ZmLCBjb3VudCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBiaW5fYXR0cmlidXRlIGtzODk5NV9yZWdpc3RlcnNfYXR0ciA9IHsKKwkuYXR0ciA9IHsKKwkJLm5hbWUgICA9ICJyZWdpc3RlcnMiLAorCQkubW9kZSAgID0gU19JUlVTUiB8IFNfSVdVU1IsCisJfSwKKwkuc2l6ZSAgID0gS1M4OTk1X1JFR1NfU0laRSwKKwkucmVhZCAgID0ga3M4OTk1X3JlZ2lzdGVyc19yZWFkLAorCS53cml0ZSAgPSBrczg5OTVfcmVnaXN0ZXJzX3dyaXRlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGtzODk5NV9wcm9iZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBrczg5OTVfc3dpdGNoICAgICprczsKKwlzdHJ1Y3Qga3M4OTk1X3BkYXRhICAgICAqcGRhdGE7CisJdTggICAgICBpZHNbMl07CisJaW50ICAgICBlcnI7CisKKwkvKiBDaGlwIGRlc2NyaXB0aW9uICovCisJcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOworCisJa3MgPSBremFsbG9jKHNpemVvZigqa3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtzKSB7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gbWVtb3J5IGZvciBwcml2YXRlIGRhdGFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltdXRleF9pbml0KCZrcy0+bG9jayk7CisJa3MtPnBkYXRhID0gcGRhdGE7CisJa3MtPnNwaSA9IHNwaV9kZXZfZ2V0KHNwaSk7CisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwga3MpOworCisJc3BpLT5tb2RlID0gU1BJX01PREVfMDsKKwlzcGktPmJpdHNfcGVyX3dvcmQgPSA4OworCWVyciA9IHNwaV9zZXR1cChzcGkpOworCWlmIChlcnIpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJzcGlfc2V0dXAgZmFpbGVkLCBlcnI9JWRcbiIsIGVycik7CisJCWdvdG8gZXJyX2RydmRhdGE7CisJfQorCisJZXJyID0ga3M4OTk1X3JlYWQoa3MsIGlkcywgS1M4OTk1X1JFR19JRDAsIHNpemVvZihpZHMpKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgInVuYWJsZSB0byByZWFkIGlkIHJlZ2lzdGVycywgZXJyPSVkXG4iLAorCQkJCWVycik7CisJCWdvdG8gZXJyX2RydmRhdGE7CisJfQorCisJc3dpdGNoIChpZHNbMF0pIHsKKwljYXNlIEZBTUlMWV9LUzg5OTU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAidW5rbm93biBmYW1pbHkgaWQ6JTAyeFxuIiwgaWRzWzBdKTsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZHJ2ZGF0YTsKKwl9CisKKwllcnIgPSBrczg5OTVfcmVzZXQoa3MpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX2RydmRhdGE7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfYmluX2ZpbGUoJnNwaS0+ZGV2LmtvYmosICZrczg5OTVfcmVnaXN0ZXJzX2F0dHIpOworCWlmIChlcnIpIHsKKwkJZGV2X2Vycigmc3BpLT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIHN5c2ZzIGZpbGUsIGVycj0lZFxuIiwKKwkJCQkgICAgZXJyKTsKKwkJZ290byBlcnJfZHJ2ZGF0YTsKKwl9CisKKwlkZXZfaW5mbygmc3BpLT5kZXYsICJLUzg5JTAyWCBkZXZpY2UgZm91bmQsIENoaXAgSUQ6JTAxeCwgIgorCQkJIlJldmlzaW9uOiUwMXhcbiIsIGlkc1swXSwKKwkJCWdldF9jaGlwX2lkKGlkc1sxXSksIGdldF9jaGlwX3JldihpZHNbMV0pKTsKKworCXJldHVybiAwOworCitlcnJfZHJ2ZGF0YToKKwlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCBOVUxMKTsKKwlrZnJlZShrcyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQga3M4OTk1X3JlbW92ZShzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpKQoreworCXN0cnVjdCBrczg5OTVfZGF0YSAgICAgICprczg5OTU7CisKKwlrczg5OTUgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKwlzeXNmc19yZW1vdmVfYmluX2ZpbGUoJnNwaS0+ZGV2LmtvYmosICZrczg5OTVfcmVnaXN0ZXJzX2F0dHIpOworCisJZGV2X3NldF9kcnZkYXRhKCZzcGktPmRldiwgTlVMTCk7CisJa2ZyZWUoa3M4OTk1KTsKKworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIGtzODk5NV9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJLm5hbWUJICAgID0gInNwaS1rczg5OTUiLAorCQkuYnVzCSAgICAgPSAmc3BpX2J1c190eXBlLAorCQkub3duZXIJICAgPSBUSElTX01PRFVMRSwKKwl9LAorCS5wcm9iZQkgID0ga3M4OTk1X3Byb2JlLAorCS5yZW1vdmUJICA9IF9fZGV2ZXhpdF9wKGtzODk5NV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQga3M4OTk1X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIERSVl9ERVNDICIgdmVyc2lvbiAiIERSVl9WRVJTSU9OIlxuIik7CisKKwlyZXR1cm4gc3BpX3JlZ2lzdGVyX2RyaXZlcigma3M4OTk1X2RyaXZlcik7Cit9Cittb2R1bGVfaW5pdChrczg5OTVfaW5pdCk7CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBrczg5OTVfZXhpdCh2b2lkKQoreworCXNwaV91bnJlZ2lzdGVyX2RyaXZlcigma3M4OTk1X2RyaXZlcik7Cit9Cittb2R1bGVfZXhpdChrczg5OTVfZXhpdCk7CisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQyk7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKCJHYWJvciBKdWhvcyA8anVob3NnIGF0IG9wZW53cnQub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvcHBwL3BwdHAuYyBiL2RyaXZlcnMvbmV0L3BwcC9wcHRwLmMKaW5kZXggODlmODI5Zi4uYzFjOTI5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvcHBwL3BwdHAuYworKysgYi9kcml2ZXJzL25ldC9wcHAvcHB0cC5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIHsKIAlzcGluX2xvY2soJmNoYW5fbG9jayk7CiAJY2xlYXJfYml0KHNvY2stPnByb3RvLnBwdHAuc3JjX2FkZHIuY2FsbF9pZCwgY2FsbGlkX2JpdG1hcCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGNhbGxpZF9zb2NrW3NvY2stPnByb3RvLnBwdHAuc3JjX2FkZHIuY2FsbF9pZF0sIE5VTEwpOworCVJDVV9JTklUX1BPSU5URVIoY2FsbGlkX3NvY2tbc29jay0+cHJvdG8ucHB0cC5zcmNfYWRkci5jYWxsX2lkXSwgTlVMTCk7CiAJc3Bpbl91bmxvY2soJmNoYW5fbG9jayk7CiAJc3luY2hyb25pemVfcmN1KCk7CiB9CkBAIC00MjMsMTAgKzQyMyw4IEBACiAJbG9ja19zb2NrKHNrKTsKIAogCW9wdC0+c3JjX2FkZHIgPSBzcC0+c2FfYWRkci5wcHRwOwotCWlmIChhZGRfY2hhbihwbykpIHsKLQkJcmVsZWFzZV9zb2NrKHNrKTsKKwlpZiAoYWRkX2NoYW4ocG8pKQogCQllcnJvciA9IC1FQlVTWTsKLQl9CiAKIAlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3RlYW0vS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3RlYW0vS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDhhMTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdGVhbS9LY29uZmlnCkBAIC0wLDAgKzEsNDMgQEAKK21lbnVjb25maWcgTkVUX1RFQU0KKwl0cmlzdGF0ZSAiRXRoZXJuZXQgdGVhbSBkcml2ZXIgc3VwcG9ydCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCS0tLWhlbHAtLS0KKwkgIFRoaXMgYWxsb3dzIG9uZSB0byBjcmVhdGUgdmlydHVhbCBpbnRlcmZhY2VzIHRoYXQgdGVhbXMgdG9nZXRoZXIKKwkgIG11bHRpcGxlIGV0aGVybmV0IGRldmljZXMuCisKKwkgIFRlYW0gZGV2aWNlcyBjYW4gYmUgYWRkZWQgdXNpbmcgdGhlICJpcCIgY29tbWFuZCBmcm9tIHRoZQorCSAgaXByb3V0ZTIgcGFja2FnZToKKworCSAgImlwIGxpbmsgYWRkIGxpbmsgWyBhZGRyZXNzIE1BQyBdIFsgTkFNRSBdIHR5cGUgdGVhbSIKKworCSAgVG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdGVhbS4KKworaWYgTkVUX1RFQU0KKworY29uZmlnIE5FVF9URUFNX01PREVfUk9VTkRST0JJTgorCXRyaXN0YXRlICJSb3VuZC1yb2JpbiBtb2RlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBORVRfVEVBTQorCS0tLWhlbHAtLS0KKwkgIEJhc2ljIG1vZGUgd2hlcmUgcG9ydCB1c2VkIGZvciB0cmFuc21pdHRpbmcgcGFja2V0cyBpcyBzZWxlY3RlZCBpbgorCSAgcm91bmQtcm9iaW4gZmFzaGlvbiB1c2luZyBwYWNrZXQgY291bnRlci4KKworCSAgQWxsIGFkZGVkIHBvcnRzIGFyZSBzZXR1cCB0byBoYXZlIGJvbmQncyBtYWMgYWRkcmVzcy4KKworCSAgVG8gY29tcGlsZSB0aGlzIHRlYW0gbW9kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZTogdGhlIG1vZHVsZQorCSAgd2lsbCBiZSBjYWxsZWQgdGVhbV9tb2RlX3JvdW5kcm9iaW4uCisKK2NvbmZpZyBORVRfVEVBTV9NT0RFX0FDVElWRUJBQ0tVUAorCXRyaXN0YXRlICJBY3RpdmUtYmFja3VwIG1vZGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIE5FVF9URUFNCisJLS0taGVscC0tLQorCSAgT25seSBvbmUgcG9ydCBpcyBhY3RpdmUgYXQgYSB0aW1lIGFuZCB0aGUgcmVzdCBvZiBwb3J0cyBhcmUgdXNlZAorCSAgZm9yIGJhY2t1cC4KKworCSAgTWFjIGFkZHJlc3NlcyBvZiBwb3J0cyBhcmUgbm90IG1vZGlmaWVkLiBVc2Vyc3BhY2UgaXMgcmVzcG9uc2libGUKKwkgIHRvIGRvIHNvLgorCisJICBUbyBjb21waWxlIHRoaXMgdGVhbSBtb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlCisJICB3aWxsIGJlIGNhbGxlZCB0ZWFtX21vZGVfYWN0aXZlYmFja3VwLgorCitlbmRpZiAjIE5FVF9URUFNCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZWFtL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvdGVhbS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWYyMDI4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdGVhbS9NYWtlZmlsZQpAQCAtMCwwICsxLDcgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIHRoZSBuZXR3b3JrIHRlYW0gZHJpdmVyCisjCisKK29iai0kKENPTkZJR19ORVRfVEVBTSkgKz0gdGVhbS5vCitvYmotJChDT05GSUdfTkVUX1RFQU1fTU9ERV9ST1VORFJPQklOKSArPSB0ZWFtX21vZGVfcm91bmRyb2Jpbi5vCitvYmotJChDT05GSUdfTkVUX1RFQU1fTU9ERV9BQ1RJVkVCQUNLVVApICs9IHRlYW1fbW9kZV9hY3RpdmViYWNrdXAubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGVhbS90ZWFtLmMgYi9kcml2ZXJzL25ldC90ZWFtL3RlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDJhODYyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdGVhbS90ZWFtLmMKQEAgLTAsMCArMSwxNjg0IEBACisvKgorICogbmV0L2RyaXZlcnMvdGVhbS90ZWFtLmMgLSBOZXR3b3JrIHRlYW0gZGV2aWNlIGRyaXZlcgorICogQ29weXJpZ2h0IChjKSAyMDExIEppcmkgUGlya28gPGpwaXJrb0ByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90ZWFtLmg+CisKKyNkZWZpbmUgRFJWX05BTUUgInRlYW0iCisKKworLyoqKioqKioqKioKKyAqIEhlbHBlcnMKKyAqKioqKioqKioqLworCisjZGVmaW5lIHRlYW1fcG9ydF9leGlzdHMoZGV2KSAoZGV2LT5wcml2X2ZsYWdzICYgSUZGX1RFQU1fUE9SVCkKKworc3RhdGljIHN0cnVjdCB0ZWFtX3BvcnQgKnRlYW1fcG9ydF9nZXRfcmN1KGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRlYW1fcG9ydCAqcG9ydCA9IHJjdV9kZXJlZmVyZW5jZShkZXYtPnJ4X2hhbmRsZXJfZGF0YSk7CisKKwlyZXR1cm4gdGVhbV9wb3J0X2V4aXN0cyhkZXYpID8gcG9ydCA6IE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGVhbV9wb3J0ICp0ZWFtX3BvcnRfZ2V0X3J0bmwoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0ID0gcnRubF9kZXJlZmVyZW5jZShkZXYtPnJ4X2hhbmRsZXJfZGF0YSk7CisKKwlyZXR1cm4gdGVhbV9wb3J0X2V4aXN0cyhkZXYpID8gcG9ydCA6IE5VTEw7Cit9CisKKy8qCisgKiBTaW5jZSB0aGUgYWJpbGl0eSB0byBjaGFuZ2UgbWFjIGFkZHJlc3MgZm9yIG9wZW4gcG9ydCBkZXZpY2UgaXMgdGVzdGVkIGluCisgKiB0ZWFtX3BvcnRfYWRkLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgd2l0aG91dCBjb250cm9sIG9mIHJldHVybiB2YWx1ZQorICovCitzdGF0aWMgaW50IF9fc2V0X3BvcnRfbWFjKHN0cnVjdCBuZXRfZGV2aWNlICpwb3J0X2RldiwKKwkJCSAgY29uc3QgdW5zaWduZWQgY2hhciAqZGV2X2FkZHIpCit7CisJc3RydWN0IHNvY2thZGRyIGFkZHI7CisKKwltZW1jcHkoYWRkci5zYV9kYXRhLCBkZXZfYWRkciwgRVRIX0FMRU4pOworCWFkZHIuc2FfZmFtaWx5ID0gQVJQSFJEX0VUSEVSOworCXJldHVybiBkZXZfc2V0X21hY19hZGRyZXNzKHBvcnRfZGV2LCAmYWRkcik7Cit9CisKK2ludCB0ZWFtX3BvcnRfc2V0X29yaWdfbWFjKHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIF9fc2V0X3BvcnRfbWFjKHBvcnQtPmRldiwgcG9ydC0+b3JpZy5kZXZfYWRkcik7Cit9CisKK2ludCB0ZWFtX3BvcnRfc2V0X3RlYW1fbWFjKHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQpCit7CisJcmV0dXJuIF9fc2V0X3BvcnRfbWFjKHBvcnQtPmRldiwgcG9ydC0+dGVhbS0+ZGV2LT5kZXZfYWRkcik7Cit9CitFWFBPUlRfU1lNQk9MKHRlYW1fcG9ydF9zZXRfdGVhbV9tYWMpOworCisKKy8qKioqKioqKioqKioqKioqKioqCisgKiBPcHRpb25zIGhhbmRsaW5nCisgKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IHRlYW1fb3B0aW9uICpfX3RlYW1fZmluZF9vcHRpb24oc3RydWN0IHRlYW0gKnRlYW0sIGNvbnN0IGNoYXIgKm9wdF9uYW1lKQoreworCXN0cnVjdCB0ZWFtX29wdGlvbiAqb3B0aW9uOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHRpb24sICZ0ZWFtLT5vcHRpb25fbGlzdCwgbGlzdCkgeworCQlpZiAoc3RyY21wKG9wdGlvbi0+bmFtZSwgb3B0X25hbWUpID09IDApCisJCQlyZXR1cm4gb3B0aW9uOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworaW50IHRlYW1fb3B0aW9uc19yZWdpc3RlcihzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCSAgY29uc3Qgc3RydWN0IHRlYW1fb3B0aW9uICpvcHRpb24sCisJCQkgIHNpemVfdCBvcHRpb25fY291bnQpCit7CisJaW50IGk7CisJc3RydWN0IHRlYW1fb3B0aW9uICoqZHN0X29wdHM7CisJaW50IGVycjsKKworCWRzdF9vcHRzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRlYW1fb3B0aW9uICopICogb3B0aW9uX2NvdW50LAorCQkJICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFkc3Rfb3B0cykKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChpID0gMDsgaSA8IG9wdGlvbl9jb3VudDsgaSsrLCBvcHRpb24rKykgeworCQlpZiAoX190ZWFtX2ZpbmRfb3B0aW9uKHRlYW0sIG9wdGlvbi0+bmFtZSkpIHsKKwkJCWVyciA9IC1FRVhJU1Q7CisJCQlnb3RvIHJvbGxiYWNrOworCQl9CisJCWRzdF9vcHRzW2ldID0ga21lbWR1cChvcHRpb24sIHNpemVvZigqb3B0aW9uKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZHN0X29wdHNbaV0pIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIHJvbGxiYWNrOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IG9wdGlvbl9jb3VudDsgaSsrKQorCQlsaXN0X2FkZF90YWlsKCZkc3Rfb3B0c1tpXS0+bGlzdCwgJnRlYW0tPm9wdGlvbl9saXN0KTsKKworCWtmcmVlKGRzdF9vcHRzKTsKKwlyZXR1cm4gMDsKKworcm9sbGJhY2s6CisJZm9yIChpID0gMDsgaSA8IG9wdGlvbl9jb3VudDsgaSsrKQorCQlrZnJlZShkc3Rfb3B0c1tpXSk7CisKKwlrZnJlZShkc3Rfb3B0cyk7CisJcmV0dXJuIGVycjsKK30KKworRVhQT1JUX1NZTUJPTCh0ZWFtX29wdGlvbnNfcmVnaXN0ZXIpOworCitzdGF0aWMgdm9pZCBfX3RlYW1fb3B0aW9uc19jaGFuZ2VfY2hlY2soc3RydWN0IHRlYW0gKnRlYW0sCisJCQkJCXN0cnVjdCB0ZWFtX29wdGlvbiAqY2hhbmdlZF9vcHRpb24pOworCitzdGF0aWMgdm9pZCBfX3RlYW1fb3B0aW9uc191bnJlZ2lzdGVyKHN0cnVjdCB0ZWFtICp0ZWFtLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCB0ZWFtX29wdGlvbiAqb3B0aW9uLAorCQkJCSAgICAgIHNpemVfdCBvcHRpb25fY291bnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgb3B0aW9uX2NvdW50OyBpKyssIG9wdGlvbisrKSB7CisJCXN0cnVjdCB0ZWFtX29wdGlvbiAqZGVsX29wdDsKKworCQlkZWxfb3B0ID0gX190ZWFtX2ZpbmRfb3B0aW9uKHRlYW0sIG9wdGlvbi0+bmFtZSk7CisJCWlmIChkZWxfb3B0KSB7CisJCQlsaXN0X2RlbCgmZGVsX29wdC0+bGlzdCk7CisJCQlrZnJlZShkZWxfb3B0KTsKKwkJfQorCX0KK30KKwordm9pZCB0ZWFtX29wdGlvbnNfdW5yZWdpc3RlcihzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCSAgICAgY29uc3Qgc3RydWN0IHRlYW1fb3B0aW9uICpvcHRpb24sCisJCQkgICAgIHNpemVfdCBvcHRpb25fY291bnQpCit7CisJX190ZWFtX29wdGlvbnNfdW5yZWdpc3Rlcih0ZWFtLCBvcHRpb24sIG9wdGlvbl9jb3VudCk7CisJX190ZWFtX29wdGlvbnNfY2hhbmdlX2NoZWNrKHRlYW0sIE5VTEwpOworfQorRVhQT1JUX1NZTUJPTCh0ZWFtX29wdGlvbnNfdW5yZWdpc3Rlcik7CisKK3N0YXRpYyBpbnQgdGVhbV9vcHRpb25fZ2V0KHN0cnVjdCB0ZWFtICp0ZWFtLCBzdHJ1Y3QgdGVhbV9vcHRpb24gKm9wdGlvbiwKKwkJCSAgIHZvaWQgKmFyZykKK3sKKwlyZXR1cm4gb3B0aW9uLT5nZXR0ZXIodGVhbSwgYXJnKTsKK30KKworc3RhdGljIGludCB0ZWFtX29wdGlvbl9zZXQoc3RydWN0IHRlYW0gKnRlYW0sIHN0cnVjdCB0ZWFtX29wdGlvbiAqb3B0aW9uLAorCQkJICAgdm9pZCAqYXJnKQoreworCWludCBlcnI7CisKKwllcnIgPSBvcHRpb24tPnNldHRlcih0ZWFtLCBhcmcpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlfX3RlYW1fb3B0aW9uc19jaGFuZ2VfY2hlY2sodGVhbSwgb3B0aW9uKTsKKwlyZXR1cm4gZXJyOworfQorCisvKioqKioqKioqKioqKioqKgorICogTW9kZSBoYW5kbGluZworICoqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBMSVNUX0hFQUQobW9kZV9saXN0KTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobW9kZV9saXN0X2xvY2spOworCitzdGF0aWMgc3RydWN0IHRlYW1fbW9kZSAqX19maW5kX21vZGUoY29uc3QgY2hhciAqa2luZCkKK3sKKwlzdHJ1Y3QgdGVhbV9tb2RlICptb2RlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlLCAmbW9kZV9saXN0LCBsaXN0KSB7CisJCWlmIChzdHJjbXAobW9kZS0+a2luZCwga2luZCkgPT0gMCkKKwkJCXJldHVybiBtb2RlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGJvb2wgaXNfZ29vZF9tb2RlX25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl3aGlsZSAoKm5hbWUgIT0gJ1wwJykgeworCQlpZiAoIWlzYWxwaGEoKm5hbWUpICYmICFpc2RpZ2l0KCpuYW1lKSAmJiAqbmFtZSAhPSAnXycpCisJCQlyZXR1cm4gZmFsc2U7CisJCW5hbWUrKzsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK2ludCB0ZWFtX21vZGVfcmVnaXN0ZXIoc3RydWN0IHRlYW1fbW9kZSAqbW9kZSkKK3sKKwlpbnQgZXJyID0gMDsKKworCWlmICghaXNfZ29vZF9tb2RlX25hbWUobW9kZS0+a2luZCkgfHwKKwkgICAgbW9kZS0+cHJpdl9zaXplID4gVEVBTV9NT0RFX1BSSVZfU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc3Bpbl9sb2NrKCZtb2RlX2xpc3RfbG9jayk7CisJaWYgKF9fZmluZF9tb2RlKG1vZGUtPmtpbmQpKSB7CisJCWVyciA9IC1FRVhJU1Q7CisJCWdvdG8gdW5sb2NrOworCX0KKwlsaXN0X2FkZF90YWlsKCZtb2RlLT5saXN0LCAmbW9kZV9saXN0KTsKK3VubG9jazoKKwlzcGluX3VubG9jaygmbW9kZV9saXN0X2xvY2spOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHRlYW1fbW9kZV9yZWdpc3Rlcik7CisKK2ludCB0ZWFtX21vZGVfdW5yZWdpc3RlcihzdHJ1Y3QgdGVhbV9tb2RlICptb2RlKQoreworCXNwaW5fbG9jaygmbW9kZV9saXN0X2xvY2spOworCWxpc3RfZGVsX2luaXQoJm1vZGUtPmxpc3QpOworCXNwaW5fdW5sb2NrKCZtb2RlX2xpc3RfbG9jayk7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHRlYW1fbW9kZV91bnJlZ2lzdGVyKTsKKworc3RhdGljIHN0cnVjdCB0ZWFtX21vZGUgKnRlYW1fbW9kZV9nZXQoY29uc3QgY2hhciAqa2luZCkKK3sKKwlzdHJ1Y3QgdGVhbV9tb2RlICptb2RlOworCisJc3Bpbl9sb2NrKCZtb2RlX2xpc3RfbG9jayk7CisJbW9kZSA9IF9fZmluZF9tb2RlKGtpbmQpOworCWlmICghbW9kZSkgeworCQlzcGluX3VubG9jaygmbW9kZV9saXN0X2xvY2spOworCQlyZXF1ZXN0X21vZHVsZSgidGVhbS1tb2RlLSVzIiwga2luZCk7CisJCXNwaW5fbG9jaygmbW9kZV9saXN0X2xvY2spOworCQltb2RlID0gX19maW5kX21vZGUoa2luZCk7CisJfQorCWlmIChtb2RlKQorCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KG1vZGUtPm93bmVyKSkKKwkJCW1vZGUgPSBOVUxMOworCisJc3Bpbl91bmxvY2soJm1vZGVfbGlzdF9sb2NrKTsKKwlyZXR1cm4gbW9kZTsKK30KKworc3RhdGljIHZvaWQgdGVhbV9tb2RlX3B1dChjb25zdCBzdHJ1Y3QgdGVhbV9tb2RlICptb2RlKQoreworCW1vZHVsZV9wdXQobW9kZS0+b3duZXIpOworfQorCitzdGF0aWMgYm9vbCB0ZWFtX2R1bW15X3RyYW5zbWl0KHN0cnVjdCB0ZWFtICp0ZWFtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJcmV0dXJuIGZhbHNlOworfQorCityeF9oYW5kbGVyX3Jlc3VsdF90IHRlYW1fZHVtbXlfcmVjZWl2ZShzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCQkgICAgICAgc3RydWN0IHRlYW1fcG9ydCAqcG9ydCwKKwkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gUlhfSEFORExFUl9BTk9USEVSOworfQorCitzdGF0aWMgdm9pZCB0ZWFtX2FkanVzdF9vcHMoc3RydWN0IHRlYW0gKnRlYW0pCit7CisJLyoKKwkgKiBUbyBhdm9pZCBjaGVja3MgaW4gcngvdHggc2tiIHBhdGhzLCBlbnN1cmUgaGVyZSB0aGF0IG5vbi1udWxsIGFuZAorCSAqIGNvcnJlY3Qgb3BzIGFyZSBhbHdheXMgc2V0LgorCSAqLworCisJaWYgKGxpc3RfZW1wdHkoJnRlYW0tPnBvcnRfbGlzdCkgfHwKKwkgICAgIXRlYW0tPm1vZGUgfHwgIXRlYW0tPm1vZGUtPm9wcy0+dHJhbnNtaXQpCisJCXRlYW0tPm9wcy50cmFuc21pdCA9IHRlYW1fZHVtbXlfdHJhbnNtaXQ7CisJZWxzZQorCQl0ZWFtLT5vcHMudHJhbnNtaXQgPSB0ZWFtLT5tb2RlLT5vcHMtPnRyYW5zbWl0OworCisJaWYgKGxpc3RfZW1wdHkoJnRlYW0tPnBvcnRfbGlzdCkgfHwKKwkgICAgIXRlYW0tPm1vZGUgfHwgIXRlYW0tPm1vZGUtPm9wcy0+cmVjZWl2ZSkKKwkJdGVhbS0+b3BzLnJlY2VpdmUgPSB0ZWFtX2R1bW15X3JlY2VpdmU7CisJZWxzZQorCQl0ZWFtLT5vcHMucmVjZWl2ZSA9IHRlYW0tPm1vZGUtPm9wcy0+cmVjZWl2ZTsKK30KKworLyoKKyAqIFdlIGNhbiBiZW5lZml0IGZyb20gdGhlIGZhY3QgdGhhdCBpdCdzIGVuc3VyZWQgbm8gcG9ydCBpcyBwcmVzZW50CisgKiBhdCB0aGUgdGltZSBvZiBtb2RlIGNoYW5nZS4gVGhlcmVmb3JlIG5vIHBhY2tldHMgYXJlIGluIGZseSBzbyB0aGVyZSdzIG5vCisgKiBuZWVkIHRvIHNldCBtb2RlIG9wZXJhdGlvbnMgaW4gYW55IHNwZWNpYWwgd2F5LgorICovCitzdGF0aWMgaW50IF9fdGVhbV9jaGFuZ2VfbW9kZShzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCB0ZWFtX21vZGUgKm5ld19tb2RlKQoreworCS8qIENoZWNrIGlmIG1vZGUgd2FzIHByZXZpb3VzbHkgc2V0IGFuZCBkbyBjbGVhbnVwIGlmIHNvICovCisJaWYgKHRlYW0tPm1vZGUpIHsKKwkJdm9pZCAoKmV4aXRfb3ApKHN0cnVjdCB0ZWFtICp0ZWFtKSA9IHRlYW0tPm9wcy5leGl0OworCisJCS8qIENsZWFyIG9wcyBhcmVhIHNvIG5vIGNhbGxiYWNrIGlzIGNhbGxlZCBhbnkgbG9uZ2VyICovCisJCW1lbXNldCgmdGVhbS0+b3BzLCAwLCBzaXplb2Yoc3RydWN0IHRlYW1fbW9kZV9vcHMpKTsKKwkJdGVhbV9hZGp1c3Rfb3BzKHRlYW0pOworCisJCWlmIChleGl0X29wKQorCQkJZXhpdF9vcCh0ZWFtKTsKKwkJdGVhbV9tb2RlX3B1dCh0ZWFtLT5tb2RlKTsKKwkJdGVhbS0+bW9kZSA9IE5VTEw7CisJCS8qIHplcm8gcHJpdmF0ZSBkYXRhIGFyZWEgKi8KKwkJbWVtc2V0KCZ0ZWFtLT5tb2RlX3ByaXYsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IHRlYW0pIC0gb2Zmc2V0b2Yoc3RydWN0IHRlYW0sIG1vZGVfcHJpdikpOworCX0KKworCWlmICghbmV3X21vZGUpCisJCXJldHVybiAwOworCisJaWYgKG5ld19tb2RlLT5vcHMtPmluaXQpIHsKKwkJaW50IGVycjsKKworCQllcnIgPSBuZXdfbW9kZS0+b3BzLT5pbml0KHRlYW0pOworCQlpZiAoZXJyKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwl0ZWFtLT5tb2RlID0gbmV3X21vZGU7CisJbWVtY3B5KCZ0ZWFtLT5vcHMsIG5ld19tb2RlLT5vcHMsIHNpemVvZihzdHJ1Y3QgdGVhbV9tb2RlX29wcykpOworCXRlYW1fYWRqdXN0X29wcyh0ZWFtKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlYW1fY2hhbmdlX21vZGUoc3RydWN0IHRlYW0gKnRlYW0sIGNvbnN0IGNoYXIgKmtpbmQpCit7CisJc3RydWN0IHRlYW1fbW9kZSAqbmV3X21vZGU7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRlYW0tPmRldjsKKwlpbnQgZXJyOworCisJaWYgKCFsaXN0X2VtcHR5KCZ0ZWFtLT5wb3J0X2xpc3QpKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiTm8gcG9ydHMgY2FuIGJlIHByZXNlbnQgZHVyaW5nIG1vZGUgY2hhbmdlXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAodGVhbS0+bW9kZSAmJiBzdHJjbXAodGVhbS0+bW9kZS0+a2luZCwga2luZCkgPT0gMCkgeworCQluZXRkZXZfZXJyKGRldiwgIlVuYWJsZSB0byBjaGFuZ2UgdG8gdGhlIHNhbWUgbW9kZSB0aGUgdGVhbSBpcyBpblxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW5ld19tb2RlID0gdGVhbV9tb2RlX2dldChraW5kKTsKKwlpZiAoIW5ld19tb2RlKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiTW9kZSBcIiVzXCIgbm90IGZvdW5kXG4iLCBraW5kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZXJyID0gX190ZWFtX2NoYW5nZV9tb2RlKHRlYW0sIG5ld19tb2RlKTsKKwlpZiAoZXJyKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGNoYW5nZSB0byBtb2RlIFwiJXNcIlxuIiwga2luZCk7CisJCXRlYW1fbW9kZV9wdXQobmV3X21vZGUpOworCQlyZXR1cm4gZXJyOworCX0KKworCW5ldGRldl9pbmZvKGRldiwgIk1vZGUgY2hhbmdlZCB0byBcIiVzXCJcbiIsIGtpbmQpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJ4IHBhdGggZnJhbWUgaGFuZGxlcgorICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogbm90ZTogYWxyZWFkeSBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrICovCitzdGF0aWMgcnhfaGFuZGxlcl9yZXN1bHRfdCB0ZWFtX2hhbmRsZV9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworCXN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQ7CisJc3RydWN0IHRlYW0gKnRlYW07CisJcnhfaGFuZGxlcl9yZXN1bHRfdCByZXM7CisKKwlza2IgPSBza2Jfc2hhcmVfY2hlY2soc2tiLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIFJYX0hBTkRMRVJfQ09OU1VNRUQ7CisKKwkqcHNrYiA9IHNrYjsKKworCXBvcnQgPSB0ZWFtX3BvcnRfZ2V0X3JjdShza2ItPmRldik7CisJdGVhbSA9IHBvcnQtPnRlYW07CisKKwlyZXMgPSB0ZWFtLT5vcHMucmVjZWl2ZSh0ZWFtLCBwb3J0LCBza2IpOworCWlmIChyZXMgPT0gUlhfSEFORExFUl9BTk9USEVSKSB7CisJCXN0cnVjdCB0ZWFtX3BjcHVfc3RhdHMgKnBjcHVfc3RhdHM7CisKKwkJcGNwdV9zdGF0cyA9IHRoaXNfY3B1X3B0cih0ZWFtLT5wY3B1X3N0YXRzKTsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcGNwdV9zdGF0cy0+c3luY3ApOworCQlwY3B1X3N0YXRzLT5yeF9wYWNrZXRzKys7CisJCXBjcHVfc3RhdHMtPnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTVVMVElDQVNUKQorCQkJcGNwdV9zdGF0cy0+cnhfbXVsdGljYXN0Kys7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZwY3B1X3N0YXRzLT5zeW5jcCk7CisKKwkJc2tiLT5kZXYgPSB0ZWFtLT5kZXY7CisJfSBlbHNlIHsKKwkJdGhpc19jcHVfaW5jKHRlYW0tPnBjcHVfc3RhdHMtPnJ4X2Ryb3BwZWQpOworCX0KKworCXJldHVybiByZXM7Cit9CisKKworLyoqKioqKioqKioqKioqKioKKyAqIFBvcnQgaGFuZGxpbmcKKyAqKioqKioqKioqKioqKioqLworCitzdGF0aWMgYm9vbCB0ZWFtX3BvcnRfZmluZChjb25zdCBzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCSAgIGNvbnN0IHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQpCit7CisJc3RydWN0IHRlYW1fcG9ydCAqY3VyOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXIsICZ0ZWFtLT5wb3J0X2xpc3QsIGxpc3QpCisJCWlmIChjdXIgPT0gcG9ydCkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworLyoKKyAqIEFkZC9kZWxldGUgcG9ydCB0byB0aGUgdGVhbSBwb3J0IGxpc3QuIFdyaXRlIGd1YXJkZWQgYnkgcnRubF9sb2NrLgorICogVGFrZXMgY2FyZSBvZiBjb3JyZWN0IHBvcnQtPmluZGV4IHNldHVwIChtaWdodCBiZSByYWN5KS4KKyAqLworc3RhdGljIHZvaWQgdGVhbV9wb3J0X2xpc3RfYWRkX3BvcnQoc3RydWN0IHRlYW0gKnRlYW0sCisJCQkJICAgIHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQpCit7CisJcG9ydC0+aW5kZXggPSB0ZWFtLT5wb3J0X2NvdW50Kys7CisJaGxpc3RfYWRkX2hlYWRfcmN1KCZwb3J0LT5obGlzdCwKKwkJCSAgIHRlYW1fcG9ydF9pbmRleF9oYXNoKHRlYW0sIHBvcnQtPmluZGV4KSk7CisJbGlzdF9hZGRfdGFpbF9yY3UoJnBvcnQtPmxpc3QsICZ0ZWFtLT5wb3J0X2xpc3QpOworfQorCitzdGF0aWMgdm9pZCBfX3JlY29uc3RydWN0X3BvcnRfaGxpc3Qoc3RydWN0IHRlYW0gKnRlYW0sIGludCBybV9pbmRleCkKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0OworCisJZm9yIChpID0gcm1faW5kZXggKyAxOyBpIDwgdGVhbS0+cG9ydF9jb3VudDsgaSsrKSB7CisJCXBvcnQgPSB0ZWFtX2dldF9wb3J0X2J5X2luZGV4KHRlYW0sIGkpOworCQlobGlzdF9kZWxfcmN1KCZwb3J0LT5obGlzdCk7CisJCXBvcnQtPmluZGV4LS07CisJCWhsaXN0X2FkZF9oZWFkX3JjdSgmcG9ydC0+aGxpc3QsCisJCQkJICAgdGVhbV9wb3J0X2luZGV4X2hhc2godGVhbSwgcG9ydC0+aW5kZXgpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRlYW1fcG9ydF9saXN0X2RlbF9wb3J0KHN0cnVjdCB0ZWFtICp0ZWFtLAorCQkJCSAgIHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQpCit7CisJaW50IHJtX2luZGV4ID0gcG9ydC0+aW5kZXg7CisKKwlobGlzdF9kZWxfcmN1KCZwb3J0LT5obGlzdCk7CisJbGlzdF9kZWxfcmN1KCZwb3J0LT5saXN0KTsKKwlfX3JlY29uc3RydWN0X3BvcnRfaGxpc3QodGVhbSwgcm1faW5kZXgpOworCXRlYW0tPnBvcnRfY291bnQtLTsKK30KKworI2RlZmluZSBURUFNX1ZMQU5fRkVBVFVSRVMgKE5FVElGX0ZfQUxMX0NTVU0gfCBORVRJRl9GX1NHIHwgXAorCQkJICAgIE5FVElGX0ZfRlJBR0xJU1QgfCBORVRJRl9GX0FMTF9UU08gfCBcCisJCQkgICAgTkVUSUZfRl9ISUdIRE1BIHwgTkVUSUZfRl9MUk8pCisKK3N0YXRpYyB2b2lkIF9fdGVhbV9jb21wdXRlX2ZlYXR1cmVzKHN0cnVjdCB0ZWFtICp0ZWFtKQoreworCXN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQ7CisJdTMyIHZsYW5fZmVhdHVyZXMgPSBURUFNX1ZMQU5fRkVBVFVSRVM7CisJdW5zaWduZWQgc2hvcnQgbWF4X2hhcmRfaGVhZGVyX2xlbiA9IEVUSF9ITEVOOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmdGVhbS0+cG9ydF9saXN0LCBsaXN0KSB7CisJCXZsYW5fZmVhdHVyZXMgPSBuZXRkZXZfaW5jcmVtZW50X2ZlYXR1cmVzKHZsYW5fZmVhdHVyZXMsCisJCQkJCXBvcnQtPmRldi0+dmxhbl9mZWF0dXJlcywKKwkJCQkJVEVBTV9WTEFOX0ZFQVRVUkVTKTsKKworCQlpZiAocG9ydC0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gPiBtYXhfaGFyZF9oZWFkZXJfbGVuKQorCQkJbWF4X2hhcmRfaGVhZGVyX2xlbiA9IHBvcnQtPmRldi0+aGFyZF9oZWFkZXJfbGVuOworCX0KKworCXRlYW0tPmRldi0+dmxhbl9mZWF0dXJlcyA9IHZsYW5fZmVhdHVyZXM7CisJdGVhbS0+ZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBtYXhfaGFyZF9oZWFkZXJfbGVuOworCisJbmV0ZGV2X2NoYW5nZV9mZWF0dXJlcyh0ZWFtLT5kZXYpOworfQorCitzdGF0aWMgdm9pZCB0ZWFtX2NvbXB1dGVfZmVhdHVyZXMoc3RydWN0IHRlYW0gKnRlYW0pCit7CisJbXV0ZXhfbG9jaygmdGVhbS0+bG9jayk7CisJX190ZWFtX2NvbXB1dGVfZmVhdHVyZXModGVhbSk7CisJbXV0ZXhfdW5sb2NrKCZ0ZWFtLT5sb2NrKTsKK30KKworc3RhdGljIGludCB0ZWFtX3BvcnRfZW50ZXIoc3RydWN0IHRlYW0gKnRlYW0sIHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQpCit7CisJaW50IGVyciA9IDA7CisKKwlkZXZfaG9sZCh0ZWFtLT5kZXYpOworCXBvcnQtPmRldi0+cHJpdl9mbGFncyB8PSBJRkZfVEVBTV9QT1JUOworCWlmICh0ZWFtLT5vcHMucG9ydF9lbnRlcikgeworCQllcnIgPSB0ZWFtLT5vcHMucG9ydF9lbnRlcih0ZWFtLCBwb3J0KTsKKwkJaWYgKGVycikgeworCQkJbmV0ZGV2X2Vycih0ZWFtLT5kZXYsICJEZXZpY2UgJXMgZmFpbGVkIHRvIGVudGVyIHRlYW0gbW9kZVxuIiwKKwkJCQkgICBwb3J0LT5kZXYtPm5hbWUpOworCQkJZ290byBlcnJfcG9ydF9lbnRlcjsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnJfcG9ydF9lbnRlcjoKKwlwb3J0LT5kZXYtPnByaXZfZmxhZ3MgJj0gfklGRl9URUFNX1BPUlQ7CisJZGV2X3B1dCh0ZWFtLT5kZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdGVhbV9wb3J0X2xlYXZlKHN0cnVjdCB0ZWFtICp0ZWFtLCBzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0KQoreworCWlmICh0ZWFtLT5vcHMucG9ydF9sZWF2ZSkKKwkJdGVhbS0+b3BzLnBvcnRfbGVhdmUodGVhbSwgcG9ydCk7CisJcG9ydC0+ZGV2LT5wcml2X2ZsYWdzICY9IH5JRkZfVEVBTV9QT1JUOworCWRldl9wdXQodGVhbS0+ZGV2KTsKK30KKworc3RhdGljIHZvaWQgX190ZWFtX3BvcnRfY2hhbmdlX2NoZWNrKHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQsIGJvb2wgbGlua3VwKTsKKworc3RhdGljIGludCB0ZWFtX3BvcnRfYWRkKHN0cnVjdCB0ZWFtICp0ZWFtLCBzdHJ1Y3QgbmV0X2RldmljZSAqcG9ydF9kZXYpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHRlYW0tPmRldjsKKwlzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0OworCWNoYXIgKnBvcnRuYW1lID0gcG9ydF9kZXYtPm5hbWU7CisJaW50IGVycjsKKworCWlmIChwb3J0X2Rldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0sgfHwKKwkgICAgcG9ydF9kZXYtPnR5cGUgIT0gQVJQSFJEX0VUSEVSKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiRGV2aWNlICVzIGlzIG9mIGFuIHVuc3VwcG9ydGVkIHR5cGVcbiIsCisJCQkgICBwb3J0bmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICh0ZWFtX3BvcnRfZXhpc3RzKHBvcnRfZGV2KSkgeworCQluZXRkZXZfZXJyKGRldiwgIkRldmljZSAlcyBpcyBhbHJlYWR5IGEgcG9ydCAiCisJCQkJIm9mIGEgdGVhbSBkZXZpY2VcbiIsIHBvcnRuYW1lKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAocG9ydF9kZXYtPmZsYWdzICYgSUZGX1VQKSB7CisJCW5ldGRldl9lcnIoZGV2LCAiRGV2aWNlICVzIGlzIHVwLiBTZXQgaXQgZG93biBiZWZvcmUgYWRkaW5nIGl0IGFzIGEgdGVhbSBwb3J0XG4iLAorCQkJICAgcG9ydG5hbWUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXBvcnQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGVhbV9wb3J0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwb3J0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBvcnQtPmRldiA9IHBvcnRfZGV2OworCXBvcnQtPnRlYW0gPSB0ZWFtOworCisJcG9ydC0+b3JpZy5tdHUgPSBwb3J0X2Rldi0+bXR1OworCWVyciA9IGRldl9zZXRfbXR1KHBvcnRfZGV2LCBkZXYtPm10dSk7CisJaWYgKGVycikgeworCQluZXRkZXZfZGJnKGRldiwgIkVycm9yICVkIGNhbGxpbmcgZGV2X3NldF9tdHVcbiIsIGVycik7CisJCWdvdG8gZXJyX3NldF9tdHU7CisJfQorCisJbWVtY3B5KHBvcnQtPm9yaWcuZGV2X2FkZHIsIHBvcnRfZGV2LT5kZXZfYWRkciwgRVRIX0FMRU4pOworCisJZXJyID0gdGVhbV9wb3J0X2VudGVyKHRlYW0sIHBvcnQpOworCWlmIChlcnIpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJEZXZpY2UgJXMgZmFpbGVkIHRvIGVudGVyIHRlYW0gbW9kZVxuIiwKKwkJCSAgIHBvcnRuYW1lKTsKKwkJZ290byBlcnJfcG9ydF9lbnRlcjsKKwl9CisKKwllcnIgPSBkZXZfb3Blbihwb3J0X2Rldik7CisJaWYgKGVycikgeworCQluZXRkZXZfZGJnKGRldiwgIkRldmljZSAlcyBvcGVuaW5nIGZhaWxlZFxuIiwKKwkJCSAgIHBvcnRuYW1lKTsKKwkJZ290byBlcnJfZGV2X29wZW47CisJfQorCisJZXJyID0gdmxhbl92aWRzX2FkZF9ieV9kZXYocG9ydF9kZXYsIGRldik7CisJaWYgKGVycikgeworCQluZXRkZXZfZXJyKGRldiwgIkZhaWxlZCB0byBhZGQgdmxhbiBpZHMgdG8gZGV2aWNlICVzXG4iLAorCQkJCXBvcnRuYW1lKTsKKwkJZ290byBlcnJfdmlkc19hZGQ7CisJfQorCisJZXJyID0gbmV0ZGV2X3NldF9tYXN0ZXIocG9ydF9kZXYsIGRldik7CisJaWYgKGVycikgeworCQluZXRkZXZfZXJyKGRldiwgIkRldmljZSAlcyBmYWlsZWQgdG8gc2V0IG1hc3RlclxuIiwgcG9ydG5hbWUpOworCQlnb3RvIGVycl9zZXRfbWFzdGVyOworCX0KKworCWVyciA9IG5ldGRldl9yeF9oYW5kbGVyX3JlZ2lzdGVyKHBvcnRfZGV2LCB0ZWFtX2hhbmRsZV9mcmFtZSwKKwkJCQkJIHBvcnQpOworCWlmIChlcnIpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJEZXZpY2UgJXMgZmFpbGVkIHRvIHJlZ2lzdGVyIHJ4X2hhbmRsZXJcbiIsCisJCQkgICBwb3J0bmFtZSk7CisJCWdvdG8gZXJyX2hhbmRsZXJfcmVnaXN0ZXI7CisJfQorCisJdGVhbV9wb3J0X2xpc3RfYWRkX3BvcnQodGVhbSwgcG9ydCk7CisJdGVhbV9hZGp1c3Rfb3BzKHRlYW0pOworCV9fdGVhbV9jb21wdXRlX2ZlYXR1cmVzKHRlYW0pOworCV9fdGVhbV9wb3J0X2NoYW5nZV9jaGVjayhwb3J0LCAhIW5ldGlmX2NhcnJpZXJfb2socG9ydF9kZXYpKTsKKworCW5ldGRldl9pbmZvKGRldiwgIlBvcnQgZGV2aWNlICVzIGFkZGVkXG4iLCBwb3J0bmFtZSk7CisKKwlyZXR1cm4gMDsKKworZXJyX2hhbmRsZXJfcmVnaXN0ZXI6CisJbmV0ZGV2X3NldF9tYXN0ZXIocG9ydF9kZXYsIE5VTEwpOworCitlcnJfc2V0X21hc3RlcjoKKwl2bGFuX3ZpZHNfZGVsX2J5X2Rldihwb3J0X2RldiwgZGV2KTsKKworZXJyX3ZpZHNfYWRkOgorCWRldl9jbG9zZShwb3J0X2Rldik7CisKK2Vycl9kZXZfb3BlbjoKKwl0ZWFtX3BvcnRfbGVhdmUodGVhbSwgcG9ydCk7CisJdGVhbV9wb3J0X3NldF9vcmlnX21hYyhwb3J0KTsKKworZXJyX3BvcnRfZW50ZXI6CisJZGV2X3NldF9tdHUocG9ydF9kZXYsIHBvcnQtPm9yaWcubXR1KTsKKworZXJyX3NldF9tdHU6CisJa2ZyZWUocG9ydCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRlYW1fcG9ydF9kZWwoc3RydWN0IHRlYW0gKnRlYW0sIHN0cnVjdCBuZXRfZGV2aWNlICpwb3J0X2RldikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gdGVhbS0+ZGV2OworCXN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQ7CisJY2hhciAqcG9ydG5hbWUgPSBwb3J0X2Rldi0+bmFtZTsKKworCXBvcnQgPSB0ZWFtX3BvcnRfZ2V0X3J0bmwocG9ydF9kZXYpOworCWlmICghcG9ydCB8fCAhdGVhbV9wb3J0X2ZpbmQodGVhbSwgcG9ydCkpIHsKKwkJbmV0ZGV2X2VycihkZXYsICJEZXZpY2UgJXMgZG9lcyBub3QgYWN0IGFzIGEgcG9ydCBvZiB0aGlzIHRlYW1cbiIsCisJCQkgICBwb3J0bmFtZSk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCV9fdGVhbV9wb3J0X2NoYW5nZV9jaGVjayhwb3J0LCBmYWxzZSk7CisJdGVhbV9wb3J0X2xpc3RfZGVsX3BvcnQodGVhbSwgcG9ydCk7CisJdGVhbV9hZGp1c3Rfb3BzKHRlYW0pOworCW5ldGRldl9yeF9oYW5kbGVyX3VucmVnaXN0ZXIocG9ydF9kZXYpOworCW5ldGRldl9zZXRfbWFzdGVyKHBvcnRfZGV2LCBOVUxMKTsKKwl2bGFuX3ZpZHNfZGVsX2J5X2Rldihwb3J0X2RldiwgZGV2KTsKKwlkZXZfY2xvc2UocG9ydF9kZXYpOworCXRlYW1fcG9ydF9sZWF2ZSh0ZWFtLCBwb3J0KTsKKwl0ZWFtX3BvcnRfc2V0X29yaWdfbWFjKHBvcnQpOworCWRldl9zZXRfbXR1KHBvcnRfZGV2LCBwb3J0LT5vcmlnLm10dSk7CisJc3luY2hyb25pemVfcmN1KCk7CisJa2ZyZWUocG9ydCk7CisJbmV0ZGV2X2luZm8oZGV2LCAiUG9ydCBkZXZpY2UgJXMgcmVtb3ZlZFxuIiwgcG9ydG5hbWUpOworCV9fdGVhbV9jb21wdXRlX2ZlYXR1cmVzKHRlYW0pOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqCisgKiBOZXQgZGV2aWNlIG9wcworICoqKioqKioqKioqKioqKioqLworCitzdGF0aWMgY29uc3QgY2hhciB0ZWFtX25vX21vZGVfa2luZFtdID0gIipOT01PREUqIjsKKworc3RhdGljIGludCB0ZWFtX21vZGVfb3B0aW9uX2dldChzdHJ1Y3QgdGVhbSAqdGVhbSwgdm9pZCAqYXJnKQoreworCWNvbnN0IGNoYXIgKipzdHIgPSBhcmc7CisKKwkqc3RyID0gdGVhbS0+bW9kZSA/IHRlYW0tPm1vZGUtPmtpbmQgOiB0ZWFtX25vX21vZGVfa2luZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWFtX21vZGVfb3B0aW9uX3NldChzdHJ1Y3QgdGVhbSAqdGVhbSwgdm9pZCAqYXJnKQoreworCWNvbnN0IGNoYXIgKipzdHIgPSBhcmc7CisKKwlyZXR1cm4gdGVhbV9jaGFuZ2VfbW9kZSh0ZWFtLCAqc3RyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWFtX29wdGlvbiB0ZWFtX29wdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lID0gIm1vZGUiLAorCQkudHlwZSA9IFRFQU1fT1BUSU9OX1RZUEVfU1RSSU5HLAorCQkuZ2V0dGVyID0gdGVhbV9tb2RlX29wdGlvbl9nZXQsCisJCS5zZXR0ZXIgPSB0ZWFtX21vZGVfb3B0aW9uX3NldCwKKwl9LAorfTsKKworc3RhdGljIGludCB0ZWFtX2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGVhbSAqdGVhbSA9IG5ldGRldl9wcml2KGRldik7CisJaW50IGk7CisJaW50IGVycjsKKworCXRlYW0tPmRldiA9IGRldjsKKwltdXRleF9pbml0KCZ0ZWFtLT5sb2NrKTsKKworCXRlYW0tPnBjcHVfc3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IHRlYW1fcGNwdV9zdGF0cyk7CisJaWYgKCF0ZWFtLT5wY3B1X3N0YXRzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoaSA9IDA7IGkgPCBURUFNX1BPUlRfSEFTSEVOVFJJRVM7IGkrKykKKwkJSU5JVF9ITElTVF9IRUFEKCZ0ZWFtLT5wb3J0X2hsaXN0W2ldKTsKKwlJTklUX0xJU1RfSEVBRCgmdGVhbS0+cG9ydF9saXN0KTsKKworCXRlYW1fYWRqdXN0X29wcyh0ZWFtKTsKKworCUlOSVRfTElTVF9IRUFEKCZ0ZWFtLT5vcHRpb25fbGlzdCk7CisJZXJyID0gdGVhbV9vcHRpb25zX3JlZ2lzdGVyKHRlYW0sIHRlYW1fb3B0aW9ucywgQVJSQVlfU0laRSh0ZWFtX29wdGlvbnMpKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9vcHRpb25zX3JlZ2lzdGVyOworCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CisKKwlyZXR1cm4gMDsKKworZXJyX29wdGlvbnNfcmVnaXN0ZXI6CisJZnJlZV9wZXJjcHUodGVhbS0+cGNwdV9zdGF0cyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB0ZWFtX3VuaW5pdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZWFtICp0ZWFtID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0OworCXN0cnVjdCB0ZWFtX3BvcnQgKnRtcDsKKworCW11dGV4X2xvY2soJnRlYW0tPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3J0LCB0bXAsICZ0ZWFtLT5wb3J0X2xpc3QsIGxpc3QpCisJCXRlYW1fcG9ydF9kZWwodGVhbSwgcG9ydC0+ZGV2KTsKKworCV9fdGVhbV9jaGFuZ2VfbW9kZSh0ZWFtLCBOVUxMKTsgLyogY2xlYW51cCAqLworCV9fdGVhbV9vcHRpb25zX3VucmVnaXN0ZXIodGVhbSwgdGVhbV9vcHRpb25zLCBBUlJBWV9TSVpFKHRlYW1fb3B0aW9ucykpOworCW11dGV4X3VubG9jaygmdGVhbS0+bG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHRlYW1fZGVzdHJ1Y3RvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZWFtICp0ZWFtID0gbmV0ZGV2X3ByaXYoZGV2KTsKKworCWZyZWVfcGVyY3B1KHRlYW0tPnBjcHVfc3RhdHMpOworCWZyZWVfbmV0ZGV2KGRldik7Cit9CisKK3N0YXRpYyBpbnQgdGVhbV9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJbmV0aWZfY2Fycmllcl9vbihkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlYW1fY2xvc2Uoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwluZXRpZl9jYXJyaWVyX29mZihkZXYpOworCXJldHVybiAwOworfQorCisvKgorICogbm90ZTogYWxyZWFkeSBjYWxsZWQgd2l0aCByY3VfcmVhZF9sb2NrCisgKi8KK3N0YXRpYyBuZXRkZXZfdHhfdCB0ZWFtX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGVhbSAqdGVhbSA9IG5ldGRldl9wcml2KGRldik7CisJYm9vbCB0eF9zdWNjZXNzID0gZmFsc2U7CisJdW5zaWduZWQgaW50IGxlbiA9IHNrYi0+bGVuOworCisJdHhfc3VjY2VzcyA9IHRlYW0tPm9wcy50cmFuc21pdCh0ZWFtLCBza2IpOworCWlmICh0eF9zdWNjZXNzKSB7CisJCXN0cnVjdCB0ZWFtX3BjcHVfc3RhdHMgKnBjcHVfc3RhdHM7CisKKwkJcGNwdV9zdGF0cyA9IHRoaXNfY3B1X3B0cih0ZWFtLT5wY3B1X3N0YXRzKTsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcGNwdV9zdGF0cy0+c3luY3ApOworCQlwY3B1X3N0YXRzLT50eF9wYWNrZXRzKys7CisJCXBjcHVfc3RhdHMtPnR4X2J5dGVzICs9IGxlbjsKKwkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnBjcHVfc3RhdHMtPnN5bmNwKTsKKwl9IGVsc2UgeworCQl0aGlzX2NwdV9pbmModGVhbS0+cGNwdV9zdGF0cy0+dHhfZHJvcHBlZCk7CisJfQorCisJcmV0dXJuIE5FVERFVl9UWF9PSzsKK30KKworc3RhdGljIHZvaWQgdGVhbV9jaGFuZ2VfcnhfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNoYW5nZSkKK3sKKwlzdHJ1Y3QgdGVhbSAqdGVhbSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRlYW1fcG9ydCAqcG9ydDsKKwlpbnQgaW5jOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvcnQsICZ0ZWFtLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKGNoYW5nZSAmIElGRl9QUk9NSVNDKSB7CisJCQlpbmMgPSBkZXYtPmZsYWdzICYgSUZGX1BST01JU0MgPyAxIDogLTE7CisJCQlkZXZfc2V0X3Byb21pc2N1aXR5KHBvcnQtPmRldiwgaW5jKTsKKwkJfQorCQlpZiAoY2hhbmdlICYgSUZGX0FMTE1VTFRJKSB7CisJCQlpbmMgPSBkZXYtPmZsYWdzICYgSUZGX0FMTE1VTFRJID8gMSA6IC0xOworCQkJZGV2X3NldF9hbGxtdWx0aShwb3J0LT5kZXYsIGluYyk7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlYW1fc2V0X3J4X21vZGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGVhbSAqdGVhbSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHRlYW1fcG9ydCAqcG9ydDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwb3J0LCAmdGVhbS0+cG9ydF9saXN0LCBsaXN0KSB7CisJCWRldl91Y19zeW5jKHBvcnQtPmRldiwgZGV2KTsKKwkJZGV2X21jX3N5bmMocG9ydC0+ZGV2LCBkZXYpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIGludCB0ZWFtX3NldF9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCB0ZWFtICp0ZWFtID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0OworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShwb3J0LCAmdGVhbS0+cG9ydF9saXN0LCBsaXN0KQorCQlpZiAodGVhbS0+b3BzLnBvcnRfY2hhbmdlX21hYykKKwkJCXRlYW0tPm9wcy5wb3J0X2NoYW5nZV9tYWModGVhbSwgcG9ydCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVhbV9jaGFuZ2VfbXR1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCB0ZWFtICp0ZWFtID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0OworCWludCBlcnI7CisKKwkvKgorCSAqIEFsaG91Z2ggdGhpcyBpcyByZWFkZXIsIGl0J3MgZ3VhcmRlZCBieSB0ZWFtIGxvY2suIEl0J3Mgbm90IHBvc3NpYmxlCisJICogdG8gdHJhdmVyc2UgbGlzdCBpbiByZXZlcnNlIHVuZGVyIHJjdV9yZWFkX2xvY2sKKwkgKi8KKwltdXRleF9sb2NrKCZ0ZWFtLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZ0ZWFtLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJZXJyID0gZGV2X3NldF9tdHUocG9ydC0+ZGV2LCBuZXdfbXR1KTsKKwkJaWYgKGVycikgeworCQkJbmV0ZGV2X2VycihkZXYsICJEZXZpY2UgJXMgZmFpbGVkIHRvIGNoYW5nZSBtdHUiLAorCQkJCSAgIHBvcnQtPmRldi0+bmFtZSk7CisJCQlnb3RvIHVud2luZDsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJnRlYW0tPmxvY2spOworCisJZGV2LT5tdHUgPSBuZXdfbXR1OworCisJcmV0dXJuIDA7CisKK3Vud2luZDoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocG9ydCwgJnRlYW0tPnBvcnRfbGlzdCwgbGlzdCkKKwkJZGV2X3NldF9tdHUocG9ydC0+ZGV2LCBkZXYtPm10dSk7CisJbXV0ZXhfdW5sb2NrKCZ0ZWFtLT5sb2NrKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKgordGVhbV9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQoreworCXN0cnVjdCB0ZWFtICp0ZWFtID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGVhbV9wY3B1X3N0YXRzICpwOworCXU2NCByeF9wYWNrZXRzLCByeF9ieXRlcywgcnhfbXVsdGljYXN0LCB0eF9wYWNrZXRzLCB0eF9ieXRlczsKKwl1MzIgcnhfZHJvcHBlZCA9IDAsIHR4X2Ryb3BwZWQgPSAwOworCXVuc2lnbmVkIGludCBzdGFydDsKKwlpbnQgaTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXAgPSBwZXJfY3B1X3B0cih0ZWFtLT5wY3B1X3N0YXRzLCBpKTsKKwkJZG8geworCQkJc3RhcnQgPSB1NjRfc3RhdHNfZmV0Y2hfYmVnaW5fYmgoJnAtPnN5bmNwKTsKKwkJCXJ4X3BhY2tldHMJPSBwLT5yeF9wYWNrZXRzOworCQkJcnhfYnl0ZXMJPSBwLT5yeF9ieXRlczsKKwkJCXJ4X211bHRpY2FzdAk9IHAtPnJ4X211bHRpY2FzdDsKKwkJCXR4X3BhY2tldHMJPSBwLT50eF9wYWNrZXRzOworCQkJdHhfYnl0ZXMJPSBwLT50eF9ieXRlczsKKwkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2JoKCZwLT5zeW5jcCwgc3RhcnQpKTsKKworCQlzdGF0cy0+cnhfcGFja2V0cwkrPSByeF9wYWNrZXRzOworCQlzdGF0cy0+cnhfYnl0ZXMJCSs9IHJ4X2J5dGVzOworCQlzdGF0cy0+bXVsdGljYXN0CSs9IHJ4X211bHRpY2FzdDsKKwkJc3RhdHMtPnR4X3BhY2tldHMJKz0gdHhfcGFja2V0czsKKwkJc3RhdHMtPnR4X2J5dGVzCQkrPSB0eF9ieXRlczsKKwkJLyoKKwkJICogcnhfZHJvcHBlZCAmIHR4X2Ryb3BwZWQgYXJlIHUzMiwgdXBkYXRlZAorCQkgKiB3aXRob3V0IHN5bmNwIHByb3RlY3Rpb24uCisJCSAqLworCQlyeF9kcm9wcGVkCSs9IHAtPnJ4X2Ryb3BwZWQ7CisJCXR4X2Ryb3BwZWQJKz0gcC0+dHhfZHJvcHBlZDsKKwl9CisJc3RhdHMtPnJ4X2Ryb3BwZWQJPSByeF9kcm9wcGVkOworCXN0YXRzLT50eF9kcm9wcGVkCT0gdHhfZHJvcHBlZDsKKwlyZXR1cm4gc3RhdHM7Cit9CisKK3N0YXRpYyBpbnQgdGVhbV92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDE2X3QgdmlkKQoreworCXN0cnVjdCB0ZWFtICp0ZWFtID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0OworCWludCBlcnI7CisKKwkvKgorCSAqIEFsaG91Z2ggdGhpcyBpcyByZWFkZXIsIGl0J3MgZ3VhcmRlZCBieSB0ZWFtIGxvY2suIEl0J3Mgbm90IHBvc3NpYmxlCisJICogdG8gdHJhdmVyc2UgbGlzdCBpbiByZXZlcnNlIHVuZGVyIHJjdV9yZWFkX2xvY2sKKwkgKi8KKwltdXRleF9sb2NrKCZ0ZWFtLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZ0ZWFtLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJZXJyID0gdmxhbl92aWRfYWRkKHBvcnQtPmRldiwgdmlkKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwltdXRleF91bmxvY2soJnRlYW0tPmxvY2spOworCisJcmV0dXJuIDA7CisKK3Vud2luZDoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocG9ydCwgJnRlYW0tPnBvcnRfbGlzdCwgbGlzdCkKKwkJdmxhbl92aWRfZGVsKHBvcnQtPmRldiwgdmlkKTsKKwltdXRleF91bmxvY2soJnRlYW0tPmxvY2spOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZWFtX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdWludDE2X3QgdmlkKQoreworCXN0cnVjdCB0ZWFtICp0ZWFtID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0OworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvcnQsICZ0ZWFtLT5wb3J0X2xpc3QsIGxpc3QpCisJCXZsYW5fdmlkX2RlbChwb3J0LT5kZXYsIHZpZCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWFtX2FkZF9zbGF2ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmV0X2RldmljZSAqcG9ydF9kZXYpCit7CisJc3RydWN0IHRlYW0gKnRlYW0gPSBuZXRkZXZfcHJpdihkZXYpOworCWludCBlcnI7CisKKwltdXRleF9sb2NrKCZ0ZWFtLT5sb2NrKTsKKwllcnIgPSB0ZWFtX3BvcnRfYWRkKHRlYW0sIHBvcnRfZGV2KTsKKwltdXRleF91bmxvY2soJnRlYW0tPmxvY2spOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGVhbV9kZWxfc2xhdmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKnBvcnRfZGV2KQoreworCXN0cnVjdCB0ZWFtICp0ZWFtID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlpbnQgZXJyOworCisJbXV0ZXhfbG9jaygmdGVhbS0+bG9jayk7CisJZXJyID0gdGVhbV9wb3J0X2RlbCh0ZWFtLCBwb3J0X2Rldik7CisJbXV0ZXhfdW5sb2NrKCZ0ZWFtLT5sb2NrKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgdGVhbV9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCit7CisJc3RydWN0IHRlYW1fcG9ydCAqcG9ydDsKKwlzdHJ1Y3QgdGVhbSAqdGVhbSA9IG5ldGRldl9wcml2KGRldik7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgbWFzazsKKworCW1hc2sgPSBmZWF0dXJlczsKKwlmZWF0dXJlcyAmPSB+TkVUSUZfRl9PTkVfRk9SX0FMTDsKKwlmZWF0dXJlcyB8PSBORVRJRl9GX0FMTF9GT1JfQUxMOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvcnQsICZ0ZWFtLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJZmVhdHVyZXMgPSBuZXRkZXZfaW5jcmVtZW50X2ZlYXR1cmVzKGZlYXR1cmVzLAorCQkJCQkJICAgICBwb3J0LT5kZXYtPmZlYXR1cmVzLAorCQkJCQkJICAgICBtYXNrKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGZlYXR1cmVzOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIHRlYW1fbmV0ZGV2X29wcyA9IHsKKwkubmRvX2luaXQJCT0gdGVhbV9pbml0LAorCS5uZG9fdW5pbml0CQk9IHRlYW1fdW5pbml0LAorCS5uZG9fb3BlbgkJPSB0ZWFtX29wZW4sCisJLm5kb19zdG9wCQk9IHRlYW1fY2xvc2UsCisJLm5kb19zdGFydF94bWl0CQk9IHRlYW1feG1pdCwKKwkubmRvX2NoYW5nZV9yeF9mbGFncwk9IHRlYW1fY2hhbmdlX3J4X2ZsYWdzLAorCS5uZG9fc2V0X3J4X21vZGUJPSB0ZWFtX3NldF9yeF9tb2RlLAorCS5uZG9fc2V0X21hY19hZGRyZXNzCT0gdGVhbV9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19jaGFuZ2VfbXR1CQk9IHRlYW1fY2hhbmdlX210dSwKKwkubmRvX2dldF9zdGF0czY0CT0gdGVhbV9nZXRfc3RhdHM2NCwKKwkubmRvX3ZsYW5fcnhfYWRkX3ZpZAk9IHRlYW1fdmxhbl9yeF9hZGRfdmlkLAorCS5uZG9fdmxhbl9yeF9raWxsX3ZpZAk9IHRlYW1fdmxhbl9yeF9raWxsX3ZpZCwKKwkubmRvX2FkZF9zbGF2ZQkJPSB0ZWFtX2FkZF9zbGF2ZSwKKwkubmRvX2RlbF9zbGF2ZQkJPSB0ZWFtX2RlbF9zbGF2ZSwKKwkubmRvX2ZpeF9mZWF0dXJlcwk9IHRlYW1fZml4X2ZlYXR1cmVzLAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHJ0IG5ldGxpbmsgaW50ZXJmYWNlCisgKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIHRlYW1fc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlldGhlcl9zZXR1cChkZXYpOworCisJZGV2LT5uZXRkZXZfb3BzID0gJnRlYW1fbmV0ZGV2X29wczsKKwlkZXYtPmRlc3RydWN0b3IJPSB0ZWFtX2Rlc3RydWN0b3I7CisJZGV2LT50eF9xdWV1ZV9sZW4gPSAwOworCWRldi0+ZmxhZ3MgfD0gSUZGX01VTFRJQ0FTVDsKKwlkZXYtPnByaXZfZmxhZ3MgJj0gfihJRkZfWE1JVF9EU1RfUkVMRUFTRSB8IElGRl9UWF9TS0JfU0hBUklORyk7CisKKwkvKgorCSAqIEluZGljYXRlIHdlIHN1cHBvcnQgdW5pY2FzdCBhZGRyZXNzIGZpbHRlcmluZy4gVGhhdCB3YXkgY29yZSB3b24ndAorCSAqIGJyaW5nIHVzIHRvIHByb21pc2MgbW9kZSBpbiBjYXNlIGEgdW5pY2FzdCBhZGRyIGlzIGFkZGVkLgorCSAqIExldCB0aGlzIHVwIHRvIHVuZGVybGF5IGRyaXZlcnMuCisJICovCisJZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9VTklDQVNUX0ZMVDsKKworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9MTFRYOworCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9HUk87CisJZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfSFdfVkxBTl9UWCB8CisJCQkgICBORVRJRl9GX0hXX1ZMQU5fUlggfAorCQkJICAgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUjsKKworCWRldi0+ZmVhdHVyZXMgfD0gZGV2LT5od19mZWF0dXJlczsKK30KKworc3RhdGljIGludCB0ZWFtX25ld2xpbmsoc3RydWN0IG5ldCAqc3JjX25ldCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCXN0cnVjdCBubGF0dHIgKnRiW10sIHN0cnVjdCBubGF0dHIgKmRhdGFbXSkKK3sKKwlpbnQgZXJyOworCisJaWYgKHRiW0lGTEFfQUREUkVTU10gPT0gTlVMTCkKKwkJcmFuZG9tX2V0aGVyX2FkZHIoZGV2LT5kZXZfYWRkcik7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2UoZGV2KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVhbV92YWxpZGF0ZShzdHJ1Y3QgbmxhdHRyICp0YltdLCBzdHJ1Y3QgbmxhdHRyICpkYXRhW10pCit7CisJaWYgKHRiW0lGTEFfQUREUkVTU10pIHsKKwkJaWYgKG5sYV9sZW4odGJbSUZMQV9BRERSRVNTXSkgIT0gRVRIX0FMRU4pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKG5sYV9kYXRhKHRiW0lGTEFfQUREUkVTU10pKSkKKwkJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX29wcyB0ZWFtX2xpbmtfb3BzIF9fcmVhZF9tb3N0bHkgPSB7CisJLmtpbmQJCT0gRFJWX05BTUUsCisJLnByaXZfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgdGVhbSksCisJLnNldHVwCQk9IHRlYW1fc2V0dXAsCisJLm5ld2xpbmsJPSB0ZWFtX25ld2xpbmssCisJLnZhbGlkYXRlCT0gdGVhbV92YWxpZGF0ZSwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBHZW5lcmljIG5ldGxpbmsgY3VzdG9tIGludGVyZmFjZQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IHRlYW1fbmxfZmFtaWx5ID0geworCS5pZAkJPSBHRU5MX0lEX0dFTkVSQVRFLAorCS5uYW1lCQk9IFRFQU1fR0VOTF9OQU1FLAorCS52ZXJzaW9uCT0gVEVBTV9HRU5MX1ZFUlNJT04sCisJLm1heGF0dHIJPSBURUFNX0FUVFJfTUFYLAorCS5uZXRuc29rCT0gdHJ1ZSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSB0ZWFtX25sX3BvbGljeVtURUFNX0FUVFJfTUFYICsgMV0gPSB7CisJW1RFQU1fQVRUUl9VTlNQRUNdCQkJPSB7IC50eXBlID0gTkxBX1VOU1BFQywgfSwKKwlbVEVBTV9BVFRSX1RFQU1fSUZJTkRFWF0JCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbVEVBTV9BVFRSX0xJU1RfT1BUSU9OXQkJCT0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKKwlbVEVBTV9BVFRSX0xJU1RfUE9SVF0JCQk9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kKK3RlYW1fbmxfb3B0aW9uX3BvbGljeVtURUFNX0FUVFJfT1BUSU9OX01BWCArIDFdID0geworCVtURUFNX0FUVFJfT1BUSU9OX1VOU1BFQ10JCT0geyAudHlwZSA9IE5MQV9VTlNQRUMsIH0sCisJW1RFQU1fQVRUUl9PUFRJT05fTkFNRV0gPSB7CisJCS50eXBlID0gTkxBX1NUUklORywKKwkJLmxlbiA9IFRFQU1fU1RSSU5HX01BWF9MRU4sCisJfSwKKwlbVEVBTV9BVFRSX09QVElPTl9DSEFOR0VEXQkJPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKKwlbVEVBTV9BVFRSX09QVElPTl9UWVBFXQkJCT0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtURUFNX0FUVFJfT1BUSU9OX0RBVEFdID0geworCQkudHlwZSA9IE5MQV9CSU5BUlksCisJCS5sZW4gPSBURUFNX1NUUklOR19NQVhfTEVOLAorCX0sCit9OworCitzdGF0aWMgaW50IHRlYW1fbmxfY21kX25vb3Aoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXZvaWQgKmhkcjsKKwlpbnQgZXJyOworCisJbXNnID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwloZHIgPSBnZW5sbXNnX3B1dChtc2csIGluZm8tPnNuZF9waWQsIGluZm8tPnNuZF9zZXEsCisJCQkgICZ0ZWFtX25sX2ZhbWlseSwgMCwgVEVBTV9DTURfTk9PUCk7CisJaWYgKElTX0VSUihoZHIpKSB7CisJCWVyciA9IFBUUl9FUlIoaGRyKTsKKwkJZ290byBlcnJfbXNnX3B1dDsKKwl9CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisKKwlyZXR1cm4gZ2VubG1zZ191bmljYXN0KGdlbmxfaW5mb19uZXQoaW5mbyksIG1zZywgaW5mby0+c25kX3BpZCk7CisKK2Vycl9tc2dfcHV0OgorCW5sbXNnX2ZyZWUobXNnKTsKKworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiBOZXRsaW5rIGNtZCBmdW5jdGlvbnMgc2hvdWxkIGJlIGxvY2tlZCBieSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucy4KKyAqIFNpbmNlIGRldiBnZXRzIGhlbGQgaGVyZSwgdGhhdCBlbnN1cmVzIGRldiB3b24ndCBkaXNhcHBlYXIgaW4gYmV0d2Vlbi4KKyAqLworc3RhdGljIHN0cnVjdCB0ZWFtICp0ZWFtX25sX3RlYW1fZ2V0KHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5ldCAqbmV0ID0gZ2VubF9pbmZvX25ldChpbmZvKTsKKwlpbnQgaWZpbmRleDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCB0ZWFtICp0ZWFtOworCisJaWYgKCFpbmZvLT5hdHRyc1tURUFNX0FUVFJfVEVBTV9JRklOREVYXSkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZmluZGV4ID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbVEVBTV9BVFRSX1RFQU1fSUZJTkRFWF0pOworCWRldiA9IGRldl9nZXRfYnlfaW5kZXgobmV0LCBpZmluZGV4KTsKKwlpZiAoIWRldiB8fCBkZXYtPm5ldGRldl9vcHMgIT0gJnRlYW1fbmV0ZGV2X29wcykgeworCQlpZiAoZGV2KQorCQkJZGV2X3B1dChkZXYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwl0ZWFtID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwltdXRleF9sb2NrKCZ0ZWFtLT5sb2NrKTsKKwlyZXR1cm4gdGVhbTsKK30KKworc3RhdGljIHZvaWQgdGVhbV9ubF90ZWFtX3B1dChzdHJ1Y3QgdGVhbSAqdGVhbSkKK3sKKwltdXRleF91bmxvY2soJnRlYW0tPmxvY2spOworCWRldl9wdXQodGVhbS0+ZGV2KTsKK30KKworc3RhdGljIGludCB0ZWFtX25sX3NlbmRfZ2VuZXJpYyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLCBzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCQlpbnQgKCpmaWxsX2Z1bmMpKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCQkgc3RydWN0IGdlbmxfaW5mbyAqaW5mbywKKwkJCQkJCSBpbnQgZmxhZ3MsIHN0cnVjdCB0ZWFtICp0ZWFtKSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisKKwlza2IgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVyciA9IGZpbGxfZnVuYyhza2IsIGluZm8sIE5MTV9GX0FDSywgdGVhbSk7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX2ZpbGw7CisKKwllcnIgPSBnZW5sbXNnX3VuaWNhc3QoZ2VubF9pbmZvX25ldChpbmZvKSwgc2tiLCBpbmZvLT5zbmRfcGlkKTsKKwlyZXR1cm4gZXJyOworCitlcnJfZmlsbDoKKwlubG1zZ19mcmVlKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZWFtX25sX2ZpbGxfb3B0aW9uc19nZXRfY2hhbmdlZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgdTMyIHBpZCwgdTMyIHNlcSwgaW50IGZsYWdzLAorCQkJCQkgICAgc3RydWN0IHRlYW0gKnRlYW0sCisJCQkJCSAgICBzdHJ1Y3QgdGVhbV9vcHRpb24gKmNoYW5nZWRfb3B0aW9uKQoreworCXN0cnVjdCBubGF0dHIgKm9wdGlvbl9saXN0OworCXZvaWQgKmhkcjsKKwlzdHJ1Y3QgdGVhbV9vcHRpb24gKm9wdGlvbjsKKworCWhkciA9IGdlbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsICZ0ZWFtX25sX2ZhbWlseSwgZmxhZ3MsCisJCQkgIFRFQU1fQ01EX09QVElPTlNfR0VUKTsKKwlpZiAoSVNfRVJSKGhkcikpCisJCXJldHVybiBQVFJfRVJSKGhkcik7CisKKwlOTEFfUFVUX1UzMihza2IsIFRFQU1fQVRUUl9URUFNX0lGSU5ERVgsIHRlYW0tPmRldi0+aWZpbmRleCk7CisJb3B0aW9uX2xpc3QgPSBubGFfbmVzdF9zdGFydChza2IsIFRFQU1fQVRUUl9MSVNUX09QVElPTik7CisJaWYgKCFvcHRpb25fbGlzdCkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkob3B0aW9uLCAmdGVhbS0+b3B0aW9uX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IG5sYXR0ciAqb3B0aW9uX2l0ZW07CisJCWxvbmcgYXJnOworCisJCW9wdGlvbl9pdGVtID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBURUFNX0FUVFJfSVRFTV9PUFRJT04pOworCQlpZiAoIW9wdGlvbl9pdGVtKQorCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJCU5MQV9QVVRfU1RSSU5HKHNrYiwgVEVBTV9BVFRSX09QVElPTl9OQU1FLCBvcHRpb24tPm5hbWUpOworCQlpZiAob3B0aW9uID09IGNoYW5nZWRfb3B0aW9uKQorCQkJTkxBX1BVVF9GTEFHKHNrYiwgVEVBTV9BVFRSX09QVElPTl9DSEFOR0VEKTsKKwkJc3dpdGNoIChvcHRpb24tPnR5cGUpIHsKKwkJY2FzZSBURUFNX09QVElPTl9UWVBFX1UzMjoKKwkJCU5MQV9QVVRfVTgoc2tiLCBURUFNX0FUVFJfT1BUSU9OX1RZUEUsIE5MQV9VMzIpOworCQkJdGVhbV9vcHRpb25fZ2V0KHRlYW0sIG9wdGlvbiwgJmFyZyk7CisJCQlOTEFfUFVUX1UzMihza2IsIFRFQU1fQVRUUl9PUFRJT05fREFUQSwgYXJnKTsKKwkJCWJyZWFrOworCQljYXNlIFRFQU1fT1BUSU9OX1RZUEVfU1RSSU5HOgorCQkJTkxBX1BVVF9VOChza2IsIFRFQU1fQVRUUl9PUFRJT05fVFlQRSwgTkxBX1NUUklORyk7CisJCQl0ZWFtX29wdGlvbl9nZXQodGVhbSwgb3B0aW9uLCAmYXJnKTsKKwkJCU5MQV9QVVRfU1RSSU5HKHNrYiwgVEVBTV9BVFRSX09QVElPTl9EQVRBLAorCQkJCSAgICAgICAoY2hhciAqKSBhcmcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCQlubGFfbmVzdF9lbmQoc2tiLCBvcHRpb25faXRlbSk7CisJfQorCisJbmxhX25lc3RfZW5kKHNrYiwgb3B0aW9uX2xpc3QpOworCXJldHVybiBnZW5sbXNnX2VuZChza2IsIGhkcik7CisKK25sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChza2IsIGhkcik7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCB0ZWFtX25sX2ZpbGxfb3B0aW9uc19nZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbywgaW50IGZsYWdzLAorCQkJCSAgICBzdHJ1Y3QgdGVhbSAqdGVhbSkKK3sKKwlyZXR1cm4gdGVhbV9ubF9maWxsX29wdGlvbnNfZ2V0X2NoYW5nZWQoc2tiLCBpbmZvLT5zbmRfcGlkLAorCQkJCQkJaW5mby0+c25kX3NlcSwgTkxNX0ZfQUNLLAorCQkJCQkJdGVhbSwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgdGVhbV9ubF9jbWRfb3B0aW9uc19nZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdGVhbSAqdGVhbTsKKwlpbnQgZXJyOworCisJdGVhbSA9IHRlYW1fbmxfdGVhbV9nZXQoaW5mbyk7CisJaWYgKCF0ZWFtKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVyciA9IHRlYW1fbmxfc2VuZF9nZW5lcmljKGluZm8sIHRlYW0sIHRlYW1fbmxfZmlsbF9vcHRpb25zX2dldCk7CisKKwl0ZWFtX25sX3RlYW1fcHV0KHRlYW0pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZWFtX25sX2NtZF9vcHRpb25zX3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCB0ZWFtICp0ZWFtOworCWludCBlcnIgPSAwOworCWludCBpOworCXN0cnVjdCBubGF0dHIgKm5sX29wdGlvbjsKKworCXRlYW0gPSB0ZWFtX25sX3RlYW1fZ2V0KGluZm8pOworCWlmICghdGVhbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcnIgPSAtRUlOVkFMOworCWlmICghaW5mby0+YXR0cnNbVEVBTV9BVFRSX0xJU1RfT1BUSU9OXSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHRlYW1fcHV0OworCX0KKworCW5sYV9mb3JfZWFjaF9uZXN0ZWQobmxfb3B0aW9uLCBpbmZvLT5hdHRyc1tURUFNX0FUVFJfTElTVF9PUFRJT05dLCBpKSB7CisJCXN0cnVjdCBubGF0dHIgKm1vZGVfYXR0cnNbVEVBTV9BVFRSX09QVElPTl9NQVggKyAxXTsKKwkJZW51bSB0ZWFtX29wdGlvbl90eXBlIG9wdF90eXBlOworCQlzdHJ1Y3QgdGVhbV9vcHRpb24gKm9wdGlvbjsKKwkJY2hhciAqb3B0X25hbWU7CisJCWJvb2wgb3B0X2ZvdW5kID0gZmFsc2U7CisKKwkJaWYgKG5sYV90eXBlKG5sX29wdGlvbikgIT0gVEVBTV9BVFRSX0lURU1fT1BUSU9OKSB7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byB0ZWFtX3B1dDsKKwkJfQorCQllcnIgPSBubGFfcGFyc2VfbmVzdGVkKG1vZGVfYXR0cnMsIFRFQU1fQVRUUl9PUFRJT05fTUFYLAorCQkJCSAgICAgICBubF9vcHRpb24sIHRlYW1fbmxfb3B0aW9uX3BvbGljeSk7CisJCWlmIChlcnIpCisJCQlnb3RvIHRlYW1fcHV0OworCQlpZiAoIW1vZGVfYXR0cnNbVEVBTV9BVFRSX09QVElPTl9OQU1FXSB8fAorCQkgICAgIW1vZGVfYXR0cnNbVEVBTV9BVFRSX09QVElPTl9UWVBFXSB8fAorCQkgICAgIW1vZGVfYXR0cnNbVEVBTV9BVFRSX09QVElPTl9EQVRBXSkgeworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWdvdG8gdGVhbV9wdXQ7CisJCX0KKwkJc3dpdGNoIChubGFfZ2V0X3U4KG1vZGVfYXR0cnNbVEVBTV9BVFRSX09QVElPTl9UWVBFXSkpIHsKKwkJY2FzZSBOTEFfVTMyOgorCQkJb3B0X3R5cGUgPSBURUFNX09QVElPTl9UWVBFX1UzMjsKKwkJCWJyZWFrOworCQljYXNlIE5MQV9TVFJJTkc6CisJCQlvcHRfdHlwZSA9IFRFQU1fT1BUSU9OX1RZUEVfU1RSSU5HOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlnb3RvIHRlYW1fcHV0OworCQl9CisKKwkJb3B0X25hbWUgPSBubGFfZGF0YShtb2RlX2F0dHJzW1RFQU1fQVRUUl9PUFRJT05fTkFNRV0pOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG9wdGlvbiwgJnRlYW0tPm9wdGlvbl9saXN0LCBsaXN0KSB7CisJCQlsb25nIGFyZzsKKwkJCXN0cnVjdCBubGF0dHIgKm9wdF9kYXRhX2F0dHI7CisKKwkJCWlmIChvcHRpb24tPnR5cGUgIT0gb3B0X3R5cGUgfHwKKwkJCSAgICBzdHJjbXAob3B0aW9uLT5uYW1lLCBvcHRfbmFtZSkpCisJCQkJY29udGludWU7CisJCQlvcHRfZm91bmQgPSB0cnVlOworCQkJb3B0X2RhdGFfYXR0ciA9IG1vZGVfYXR0cnNbVEVBTV9BVFRSX09QVElPTl9EQVRBXTsKKwkJCXN3aXRjaCAob3B0X3R5cGUpIHsKKwkJCWNhc2UgVEVBTV9PUFRJT05fVFlQRV9VMzI6CisJCQkJYXJnID0gbmxhX2dldF91MzIob3B0X2RhdGFfYXR0cik7CisJCQkJYnJlYWs7CisJCQljYXNlIFRFQU1fT1BUSU9OX1RZUEVfU1RSSU5HOgorCQkJCWFyZyA9IChsb25nKSBubGFfZGF0YShvcHRfZGF0YV9hdHRyKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQlVHKCk7CisJCQl9CisJCQllcnIgPSB0ZWFtX29wdGlvbl9zZXQodGVhbSwgb3B0aW9uLCAmYXJnKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byB0ZWFtX3B1dDsKKwkJfQorCQlpZiAoIW9wdF9mb3VuZCkgeworCQkJZXJyID0gLUVOT0VOVDsKKwkJCWdvdG8gdGVhbV9wdXQ7CisJCX0KKwl9CisKK3RlYW1fcHV0OgorCXRlYW1fbmxfdGVhbV9wdXQodGVhbSk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHRlYW1fbmxfZmlsbF9wb3J0X2xpc3RfZ2V0X2NoYW5nZWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkJICAgICAgdTMyIHBpZCwgdTMyIHNlcSwgaW50IGZsYWdzLAorCQkJCQkgICAgICBzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCQkJICAgICAgc3RydWN0IHRlYW1fcG9ydCAqY2hhbmdlZF9wb3J0KQoreworCXN0cnVjdCBubGF0dHIgKnBvcnRfbGlzdDsKKwl2b2lkICpoZHI7CisJc3RydWN0IHRlYW1fcG9ydCAqcG9ydDsKKworCWhkciA9IGdlbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsICZ0ZWFtX25sX2ZhbWlseSwgZmxhZ3MsCisJCQkgIFRFQU1fQ01EX1BPUlRfTElTVF9HRVQpOworCWlmIChJU19FUlIoaGRyKSkKKwkJcmV0dXJuIFBUUl9FUlIoaGRyKTsKKworCU5MQV9QVVRfVTMyKHNrYiwgVEVBTV9BVFRSX1RFQU1fSUZJTkRFWCwgdGVhbS0+ZGV2LT5pZmluZGV4KTsKKwlwb3J0X2xpc3QgPSBubGFfbmVzdF9zdGFydChza2IsIFRFQU1fQVRUUl9MSVNUX1BPUlQpOworCWlmICghcG9ydF9saXN0KQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmdGVhbS0+cG9ydF9saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBubGF0dHIgKnBvcnRfaXRlbTsKKworCQlwb3J0X2l0ZW0gPSBubGFfbmVzdF9zdGFydChza2IsIFRFQU1fQVRUUl9JVEVNX1BPUlQpOworCQlpZiAoIXBvcnRfaXRlbSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCQlOTEFfUFVUX1UzMihza2IsIFRFQU1fQVRUUl9QT1JUX0lGSU5ERVgsIHBvcnQtPmRldi0+aWZpbmRleCk7CisJCWlmIChwb3J0ID09IGNoYW5nZWRfcG9ydCkKKwkJCU5MQV9QVVRfRkxBRyhza2IsIFRFQU1fQVRUUl9QT1JUX0NIQU5HRUQpOworCQlpZiAocG9ydC0+bGlua3VwKQorCQkJTkxBX1BVVF9GTEFHKHNrYiwgVEVBTV9BVFRSX1BPUlRfTElOS1VQKTsKKwkJTkxBX1BVVF9VMzIoc2tiLCBURUFNX0FUVFJfUE9SVF9TUEVFRCwgcG9ydC0+c3BlZWQpOworCQlOTEFfUFVUX1U4KHNrYiwgVEVBTV9BVFRSX1BPUlRfRFVQTEVYLCBwb3J0LT5kdXBsZXgpOworCQlubGFfbmVzdF9lbmQoc2tiLCBwb3J0X2l0ZW0pOworCX0KKworCW5sYV9uZXN0X2VuZChza2IsIHBvcnRfbGlzdCk7CisJcmV0dXJuIGdlbmxtc2dfZW5kKHNrYiwgaGRyKTsKKworbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKHNrYiwgaGRyKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IHRlYW1fbmxfZmlsbF9wb3J0X2xpc3RfZ2V0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgc3RydWN0IGdlbmxfaW5mbyAqaW5mbywgaW50IGZsYWdzLAorCQkJCSAgICAgIHN0cnVjdCB0ZWFtICp0ZWFtKQoreworCXJldHVybiB0ZWFtX25sX2ZpbGxfcG9ydF9saXN0X2dldF9jaGFuZ2VkKHNrYiwgaW5mby0+c25kX3BpZCwKKwkJCQkJCSAgaW5mby0+c25kX3NlcSwgTkxNX0ZfQUNLLAorCQkJCQkJICB0ZWFtLCBOVUxMKTsKK30KKworc3RhdGljIGludCB0ZWFtX25sX2NtZF9wb3J0X2xpc3RfZ2V0KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCB0ZWFtICp0ZWFtOworCWludCBlcnI7CisKKwl0ZWFtID0gdGVhbV9ubF90ZWFtX2dldChpbmZvKTsKKwlpZiAoIXRlYW0pCisJCXJldHVybiAtRUlOVkFMOworCisJZXJyID0gdGVhbV9ubF9zZW5kX2dlbmVyaWMoaW5mbywgdGVhbSwgdGVhbV9ubF9maWxsX3BvcnRfbGlzdF9nZXQpOworCisJdGVhbV9ubF90ZWFtX3B1dCh0ZWFtKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9vcHMgdGVhbV9ubF9vcHNbXSA9IHsKKwl7CisJCS5jbWQgPSBURUFNX0NNRF9OT09QLAorCQkuZG9pdCA9IHRlYW1fbmxfY21kX25vb3AsCisJCS5wb2xpY3kgPSB0ZWFtX25sX3BvbGljeSwKKwl9LAorCXsKKwkJLmNtZCA9IFRFQU1fQ01EX09QVElPTlNfU0VULAorCQkuZG9pdCA9IHRlYW1fbmxfY21kX29wdGlvbnNfc2V0LAorCQkucG9saWN5ID0gdGVhbV9ubF9wb2xpY3ksCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwl9LAorCXsKKwkJLmNtZCA9IFRFQU1fQ01EX09QVElPTlNfR0VULAorCQkuZG9pdCA9IHRlYW1fbmxfY21kX29wdGlvbnNfZ2V0LAorCQkucG9saWN5ID0gdGVhbV9ubF9wb2xpY3ksCisJCS5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwKKwl9LAorCXsKKwkJLmNtZCA9IFRFQU1fQ01EX1BPUlRfTElTVF9HRVQsCisJCS5kb2l0ID0gdGVhbV9ubF9jbWRfcG9ydF9saXN0X2dldCwKKwkJLnBvbGljeSA9IHRlYW1fbmxfcG9saWN5LAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgdGVhbV9jaGFuZ2VfZXZlbnRfbWNncnAgPSB7CisJLm5hbWUgPSBURUFNX0dFTkxfQ0hBTkdFX0VWRU5UX01DX0dSUF9OQU1FLAorfTsKKworc3RhdGljIGludCB0ZWFtX25sX3NlbmRfZXZlbnRfb3B0aW9uc19nZXQoc3RydWN0IHRlYW0gKnRlYW0sCisJCQkJCSAgc3RydWN0IHRlYW1fb3B0aW9uICpjaGFuZ2VkX29wdGlvbikKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldCh0ZWFtLT5kZXYpOworCisJc2tiID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSB0ZWFtX25sX2ZpbGxfb3B0aW9uc19nZXRfY2hhbmdlZChza2IsIDAsIDAsIDAsIHRlYW0sCisJCQkJCSAgICAgICBjaGFuZ2VkX29wdGlvbik7CisJaWYgKGVyciA8IDApCisJCWdvdG8gZXJyX2ZpbGw7CisKKwllcnIgPSBnZW5sbXNnX211bHRpY2FzdF9uZXRucyhuZXQsIHNrYiwgMCwgdGVhbV9jaGFuZ2VfZXZlbnRfbWNncnAuaWQsCisJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJcmV0dXJuIGVycjsKKworZXJyX2ZpbGw6CisJbmxtc2dfZnJlZShza2IpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGVhbV9ubF9zZW5kX2V2ZW50X3BvcnRfbGlzdF9nZXQoc3RydWN0IHRlYW1fcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBlcnI7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChwb3J0LT50ZWFtLT5kZXYpOworCisJc2tiID0gbmxtc2dfbmV3KE5MTVNHX0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllcnIgPSB0ZWFtX25sX2ZpbGxfcG9ydF9saXN0X2dldF9jaGFuZ2VkKHNrYiwgMCwgMCwgMCwKKwkJCQkJCSBwb3J0LT50ZWFtLCBwb3J0KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJfZmlsbDsKKworCWVyciA9IGdlbmxtc2dfbXVsdGljYXN0X25ldG5zKG5ldCwgc2tiLCAwLCB0ZWFtX2NoYW5nZV9ldmVudF9tY2dycC5pZCwKKwkJCQkgICAgICBHRlBfS0VSTkVMKTsKKwlyZXR1cm4gZXJyOworCitlcnJfZmlsbDoKKwlubG1zZ19mcmVlKHNrYik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZWFtX25sX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gZ2VubF9yZWdpc3Rlcl9mYW1pbHlfd2l0aF9vcHMoJnRlYW1fbmxfZmFtaWx5LCB0ZWFtX25sX29wcywKKwkJCQkJICAgIEFSUkFZX1NJWkUodGVhbV9ubF9vcHMpKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZXJyID0gZ2VubF9yZWdpc3Rlcl9tY19ncm91cCgmdGVhbV9ubF9mYW1pbHksICZ0ZWFtX2NoYW5nZV9ldmVudF9tY2dycCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfY2hhbmdlX2V2ZW50X2dycF9yZWc7CisKKwlyZXR1cm4gMDsKKworZXJyX2NoYW5nZV9ldmVudF9ncnBfcmVnOgorCWdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoJnRlYW1fbmxfZmFtaWx5KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHRlYW1fbmxfZmluaSh2b2lkKQoreworCWdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoJnRlYW1fbmxfZmFtaWx5KTsKK30KKworCisvKioqKioqKioqKioqKioqKioqCisgKiBDaGFuZ2UgY2hlY2tlcnMKKyAqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIF9fdGVhbV9vcHRpb25zX2NoYW5nZV9jaGVjayhzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCQkJc3RydWN0IHRlYW1fb3B0aW9uICpjaGFuZ2VkX29wdGlvbikKK3sKKwlpbnQgZXJyOworCisJZXJyID0gdGVhbV9ubF9zZW5kX2V2ZW50X29wdGlvbnNfZ2V0KHRlYW0sIGNoYW5nZWRfb3B0aW9uKTsKKwlpZiAoZXJyKQorCQluZXRkZXZfd2Fybih0ZWFtLT5kZXYsICJGYWlsZWQgdG8gc2VuZCBvcHRpb25zIGNoYW5nZSB2aWEgbmV0bGlua1xuIik7Cit9CisKKy8qIHJ0bmwgbG9jayBpcyBoZWxkICovCitzdGF0aWMgdm9pZCBfX3RlYW1fcG9ydF9jaGFuZ2VfY2hlY2soc3RydWN0IHRlYW1fcG9ydCAqcG9ydCwgYm9vbCBsaW5rdXApCit7CisJaW50IGVycjsKKworCWlmIChwb3J0LT5saW5rdXAgPT0gbGlua3VwKQorCQlyZXR1cm47CisKKwlwb3J0LT5saW5rdXAgPSBsaW5rdXA7CisJaWYgKGxpbmt1cCkgeworCQlzdHJ1Y3QgZXRodG9vbF9jbWQgZWNtZDsKKworCQllcnIgPSBfX2V0aHRvb2xfZ2V0X3NldHRpbmdzKHBvcnQtPmRldiwgJmVjbWQpOworCQlpZiAoIWVycikgeworCQkJcG9ydC0+c3BlZWQgPSBldGh0b29sX2NtZF9zcGVlZCgmZWNtZCk7CisJCQlwb3J0LT5kdXBsZXggPSBlY21kLmR1cGxleDsKKwkJCWdvdG8gc2VuZF9ldmVudDsKKwkJfQorCX0KKwlwb3J0LT5zcGVlZCA9IDA7CisJcG9ydC0+ZHVwbGV4ID0gMDsKKworc2VuZF9ldmVudDoKKwllcnIgPSB0ZWFtX25sX3NlbmRfZXZlbnRfcG9ydF9saXN0X2dldChwb3J0KTsKKwlpZiAoZXJyKQorCQluZXRkZXZfd2Fybihwb3J0LT50ZWFtLT5kZXYsICJGYWlsZWQgdG8gc2VuZCBwb3J0IGNoYW5nZSBvZiBkZXZpY2UgJXMgdmlhIG5ldGxpbmtcbiIsCisJCQkgICAgcG9ydC0+ZGV2LT5uYW1lKTsKKworfQorCitzdGF0aWMgdm9pZCB0ZWFtX3BvcnRfY2hhbmdlX2NoZWNrKHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQsIGJvb2wgbGlua3VwKQoreworCXN0cnVjdCB0ZWFtICp0ZWFtID0gcG9ydC0+dGVhbTsKKworCW11dGV4X2xvY2soJnRlYW0tPmxvY2spOworCV9fdGVhbV9wb3J0X2NoYW5nZV9jaGVjayhwb3J0LCBsaW5rdXApOworCW11dGV4X3VubG9jaygmdGVhbS0+bG9jayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5ldCBkZXZpY2Ugbm90aWZpZXIgZXZlbnQgaGFuZGxlcgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCB0ZWFtX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgcHRyOworCXN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQ7CisKKwlwb3J0ID0gdGVhbV9wb3J0X2dldF9ydG5sKGRldik7CisJaWYgKCFwb3J0KQorCQlyZXR1cm4gTk9USUZZX0RPTkU7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBORVRERVZfVVA6CisJCWlmIChuZXRpZl9jYXJyaWVyX29rKGRldikpCisJCQl0ZWFtX3BvcnRfY2hhbmdlX2NoZWNrKHBvcnQsIHRydWUpOworCWNhc2UgTkVUREVWX0RPV046CisJCXRlYW1fcG9ydF9jaGFuZ2VfY2hlY2socG9ydCwgZmFsc2UpOworCWNhc2UgTkVUREVWX0NIQU5HRToKKwkJaWYgKG5ldGlmX3J1bm5pbmcocG9ydC0+ZGV2KSkKKwkJCXRlYW1fcG9ydF9jaGFuZ2VfY2hlY2socG9ydCwKKwkJCQkJICAgICAgICEhbmV0aWZfY2Fycmllcl9vayhwb3J0LT5kZXYpKTsKKwkJYnJlYWs7CisJY2FzZSBORVRERVZfVU5SRUdJU1RFUjoKKwkJdGVhbV9kZWxfc2xhdmUocG9ydC0+dGVhbS0+ZGV2LCBkZXYpOworCQlicmVhazsKKwljYXNlIE5FVERFVl9GRUFUX0NIQU5HRToKKwkJdGVhbV9jb21wdXRlX2ZlYXR1cmVzKHBvcnQtPnRlYW0pOworCQlicmVhazsKKwljYXNlIE5FVERFVl9DSEFOR0VNVFU6CisJCS8qIEZvcmJpZCB0byBjaGFuZ2UgbXR1IG9mIHVuZGVybGF5aW5nIGRldmljZSAqLworCQlyZXR1cm4gTk9USUZZX0JBRDsKKwljYXNlIE5FVERFVl9QUkVfVFlQRV9DSEFOR0U6CisJCS8qIEZvcmJpZCB0byBjaGFuZ2UgdHlwZSBvZiB1bmRlcmxheWluZyBkZXZpY2UgKi8KKwkJcmV0dXJuIE5PVElGWV9CQUQ7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB0ZWFtX25vdGlmaWVyX2Jsb2NrIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB0ZWFtX2RldmljZV9ldmVudCwKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqCisgKiBNb2R1bGUgaW5pdCBhbmQgZXhpdAorICoqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCB0ZWFtX21vZHVsZV9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmdGVhbV9ub3RpZmllcl9ibG9jayk7CisKKwllcnIgPSBydG5sX2xpbmtfcmVnaXN0ZXIoJnRlYW1fbGlua19vcHMpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3J0bmxfcmVnOworCisJZXJyID0gdGVhbV9ubF9pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBlcnJfbmxfaW5pdDsKKworCXJldHVybiAwOworCitlcnJfbmxfaW5pdDoKKwlydG5sX2xpbmtfdW5yZWdpc3RlcigmdGVhbV9saW5rX29wcyk7CisKK2Vycl9ydG5sX3JlZzoKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmdGVhbV9ub3RpZmllcl9ibG9jayk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdGVhbV9tb2R1bGVfZXhpdCh2b2lkKQoreworCXRlYW1fbmxfZmluaSgpOworCXJ0bmxfbGlua191bnJlZ2lzdGVyKCZ0ZWFtX2xpbmtfb3BzKTsKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmdGVhbV9ub3RpZmllcl9ibG9jayk7Cit9CisKK21vZHVsZV9pbml0KHRlYW1fbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQodGVhbV9tb2R1bGVfZXhpdCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsKK01PRFVMRV9BVVRIT1IoIkppcmkgUGlya28gPGpwaXJrb0ByZWRoYXQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFdGhlcm5ldCB0ZWFtIGRldmljZSBkcml2ZXIiKTsKK01PRFVMRV9BTElBU19SVE5MX0xJTksoRFJWX05BTUUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdGVhbS90ZWFtX21vZGVfYWN0aXZlYmFja3VwLmMgYi9kcml2ZXJzL25ldC90ZWFtL3RlYW1fbW9kZV9hY3RpdmViYWNrdXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQ5NjBlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvdGVhbS90ZWFtX21vZGVfYWN0aXZlYmFja3VwLmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBuZXQvZHJpdmVycy90ZWFtL3RlYW1fbW9kZV9hY3RpdmViYWNrdXAuYyAtIEFjdGl2ZS1iYWNrdXAgbW9kZSBmb3IgdGVhbQorICogQ29weXJpZ2h0IChjKSAyMDExIEppcmkgUGlya28gPGpwaXJrb0ByZWRoYXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3RlYW0uaD4KKworc3RydWN0IGFiX3ByaXYgeworCXN0cnVjdCB0ZWFtX3BvcnQgX19yY3UgKmFjdGl2ZV9wb3J0OworfTsKKworc3RhdGljIHN0cnVjdCBhYl9wcml2ICphYl9wcml2KHN0cnVjdCB0ZWFtICp0ZWFtKQoreworCXJldHVybiAoc3RydWN0IGFiX3ByaXYgKikgJnRlYW0tPm1vZGVfcHJpdjsKK30KKworc3RhdGljIHJ4X2hhbmRsZXJfcmVzdWx0X3QgYWJfcmVjZWl2ZShzdHJ1Y3QgdGVhbSAqdGVhbSwgc3RydWN0IHRlYW1fcG9ydCAqcG9ydCwKKwkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSB7CisJc3RydWN0IHRlYW1fcG9ydCAqYWN0aXZlX3BvcnQ7CisKKwlhY3RpdmVfcG9ydCA9IHJjdV9kZXJlZmVyZW5jZShhYl9wcml2KHRlYW0pLT5hY3RpdmVfcG9ydCk7CisJaWYgKGFjdGl2ZV9wb3J0ICE9IHBvcnQpCisJCXJldHVybiBSWF9IQU5ETEVSX0VYQUNUOworCXJldHVybiBSWF9IQU5ETEVSX0FOT1RIRVI7Cit9CisKK3N0YXRpYyBib29sIGFiX3RyYW5zbWl0KHN0cnVjdCB0ZWFtICp0ZWFtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0ZWFtX3BvcnQgKmFjdGl2ZV9wb3J0OworCisJYWN0aXZlX3BvcnQgPSByY3VfZGVyZWZlcmVuY2UoYWJfcHJpdih0ZWFtKS0+YWN0aXZlX3BvcnQpOworCWlmICh1bmxpa2VseSghYWN0aXZlX3BvcnQpKQorCQlnb3RvIGRyb3A7CisJc2tiLT5kZXYgPSBhY3RpdmVfcG9ydC0+ZGV2OworCWlmIChkZXZfcXVldWVfeG1pdChza2IpKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIHRydWU7CisKK2Ryb3A6CisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIGFiX3BvcnRfbGVhdmUoc3RydWN0IHRlYW0gKnRlYW0sIHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQpCit7CisJaWYgKGFiX3ByaXYodGVhbSktPmFjdGl2ZV9wb3J0ID09IHBvcnQpCisJCVJDVV9JTklUX1BPSU5URVIoYWJfcHJpdih0ZWFtKS0+YWN0aXZlX3BvcnQsIE5VTEwpOworfQorCitzdGF0aWMgaW50IGFiX2FjdGl2ZV9wb3J0X2dldChzdHJ1Y3QgdGVhbSAqdGVhbSwgdm9pZCAqYXJnKQoreworCXUzMiAqaWZpbmRleCA9IGFyZzsKKworCSppZmluZGV4ID0gMDsKKwlpZiAoYWJfcHJpdih0ZWFtKS0+YWN0aXZlX3BvcnQpCisJCSppZmluZGV4ID0gYWJfcHJpdih0ZWFtKS0+YWN0aXZlX3BvcnQtPmRldi0+aWZpbmRleDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYl9hY3RpdmVfcG9ydF9zZXQoc3RydWN0IHRlYW0gKnRlYW0sIHZvaWQgKmFyZykKK3sKKwl1MzIgKmlmaW5kZXggPSBhcmc7CisJc3RydWN0IHRlYW1fcG9ydCAqcG9ydDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvcnQsICZ0ZWFtLT5wb3J0X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHBvcnQtPmRldi0+aWZpbmRleCA9PSAqaWZpbmRleCkgeworCQkJcmN1X2Fzc2lnbl9wb2ludGVyKGFiX3ByaXYodGVhbSktPmFjdGl2ZV9wb3J0LCBwb3J0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlYW1fb3B0aW9uIGFiX29wdGlvbnNbXSA9IHsKKwl7CisJCS5uYW1lID0gImFjdGl2ZXBvcnQiLAorCQkudHlwZSA9IFRFQU1fT1BUSU9OX1RZUEVfVTMyLAorCQkuZ2V0dGVyID0gYWJfYWN0aXZlX3BvcnRfZ2V0LAorCQkuc2V0dGVyID0gYWJfYWN0aXZlX3BvcnRfc2V0LAorCX0sCit9OworCitpbnQgYWJfaW5pdChzdHJ1Y3QgdGVhbSAqdGVhbSkKK3sKKwlyZXR1cm4gdGVhbV9vcHRpb25zX3JlZ2lzdGVyKHRlYW0sIGFiX29wdGlvbnMsIEFSUkFZX1NJWkUoYWJfb3B0aW9ucykpOworfQorCit2b2lkIGFiX2V4aXQoc3RydWN0IHRlYW0gKnRlYW0pCit7CisJdGVhbV9vcHRpb25zX3VucmVnaXN0ZXIodGVhbSwgYWJfb3B0aW9ucywgQVJSQVlfU0laRShhYl9vcHRpb25zKSk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGVhbV9tb2RlX29wcyBhYl9tb2RlX29wcyA9IHsKKwkuaW5pdAkJCT0gYWJfaW5pdCwKKwkuZXhpdAkJCT0gYWJfZXhpdCwKKwkucmVjZWl2ZQkJPSBhYl9yZWNlaXZlLAorCS50cmFuc21pdAkJPSBhYl90cmFuc21pdCwKKwkucG9ydF9sZWF2ZQkJPSBhYl9wb3J0X2xlYXZlLAorfTsKKworc3RhdGljIHN0cnVjdCB0ZWFtX21vZGUgYWJfbW9kZSA9IHsKKwkua2luZAkJPSAiYWN0aXZlYmFja3VwIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnByaXZfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgYWJfcHJpdiksCisJLm9wcwkJPSAmYWJfbW9kZV9vcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhYl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiB0ZWFtX21vZGVfcmVnaXN0ZXIoJmFiX21vZGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgYWJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl0ZWFtX21vZGVfdW5yZWdpc3RlcigmYWJfbW9kZSk7Cit9CisKK21vZHVsZV9pbml0KGFiX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGFiX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiSmlyaSBQaXJrbyA8anBpcmtvQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFjdGl2ZS1iYWNrdXAgbW9kZSBmb3IgdGVhbSIpOworTU9EVUxFX0FMSUFTKCJ0ZWFtLW1vZGUtYWN0aXZlYmFja3VwIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC90ZWFtL3RlYW1fbW9kZV9yb3VuZHJvYmluLmMgYi9kcml2ZXJzL25ldC90ZWFtL3RlYW1fbW9kZV9yb3VuZHJvYmluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBlOGY4MAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3RlYW0vdGVhbV9tb2RlX3JvdW5kcm9iaW4uYwpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIG5ldC9kcml2ZXJzL3RlYW0vdGVhbV9tb2RlX3JvdW5kcm9iaW4uYyAtIFJvdW5kLXJvYmluIG1vZGUgZm9yIHRlYW0KKyAqIENvcHlyaWdodCAoYykgMjAxMSBKaXJpIFBpcmtvIDxqcGlya29AcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3RlYW0uaD4KKworc3RydWN0IHJyX3ByaXYgeworCXVuc2lnbmVkIGludCBzZW50X3BhY2tldHM7Cit9OworCitzdGF0aWMgc3RydWN0IHJyX3ByaXYgKnJyX3ByaXYoc3RydWN0IHRlYW0gKnRlYW0pCit7CisJcmV0dXJuIChzdHJ1Y3QgcnJfcHJpdiAqKSAmdGVhbS0+bW9kZV9wcml2OworfQorCitzdGF0aWMgc3RydWN0IHRlYW1fcG9ydCAqX19nZXRfZmlyc3RfcG9ydF91cChzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCQkJICAgICBzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0KQoreworCXN0cnVjdCB0ZWFtX3BvcnQgKmN1cjsKKworCWlmIChwb3J0LT5saW5rdXApCisJCXJldHVybiBwb3J0OworCWN1ciA9IHBvcnQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZV9yY3UoY3VyLCAmdGVhbS0+cG9ydF9saXN0LCBsaXN0KQorCQlpZiAoY3VyLT5saW5rdXApCisJCQlyZXR1cm4gY3VyOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGN1ciwgJnRlYW0tPnBvcnRfbGlzdCwgbGlzdCkgeworCQlpZiAoY3VyID09IHBvcnQpCisJCQlicmVhazsKKwkJaWYgKGN1ci0+bGlua3VwKQorCQkJcmV0dXJuIGN1cjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBib29sIHJyX3RyYW5zbWl0KHN0cnVjdCB0ZWFtICp0ZWFtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQ7CisJaW50IHBvcnRfaW5kZXg7CisKKwlwb3J0X2luZGV4ID0gcnJfcHJpdih0ZWFtKS0+c2VudF9wYWNrZXRzKysgJSB0ZWFtLT5wb3J0X2NvdW50OworCXBvcnQgPSB0ZWFtX2dldF9wb3J0X2J5X2luZGV4X3JjdSh0ZWFtLCBwb3J0X2luZGV4KTsKKwlwb3J0ID0gX19nZXRfZmlyc3RfcG9ydF91cCh0ZWFtLCBwb3J0KTsKKwlpZiAodW5saWtlbHkoIXBvcnQpKQorCQlnb3RvIGRyb3A7CisJc2tiLT5kZXYgPSBwb3J0LT5kZXY7CisJaWYgKGRldl9xdWV1ZV94bWl0KHNrYikpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHJ1ZTsKKworZHJvcDoKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBycl9wb3J0X2VudGVyKHN0cnVjdCB0ZWFtICp0ZWFtLCBzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0KQoreworCXJldHVybiB0ZWFtX3BvcnRfc2V0X3RlYW1fbWFjKHBvcnQpOworfQorCitzdGF0aWMgdm9pZCBycl9wb3J0X2NoYW5nZV9tYWMoc3RydWN0IHRlYW0gKnRlYW0sIHN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQpCit7CisJdGVhbV9wb3J0X3NldF90ZWFtX21hYyhwb3J0KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZWFtX21vZGVfb3BzIHJyX21vZGVfb3BzID0geworCS50cmFuc21pdAkJPSBycl90cmFuc21pdCwKKwkucG9ydF9lbnRlcgkJPSBycl9wb3J0X2VudGVyLAorCS5wb3J0X2NoYW5nZV9tYWMJPSBycl9wb3J0X2NoYW5nZV9tYWMsCit9OworCitzdGF0aWMgc3RydWN0IHRlYW1fbW9kZSBycl9tb2RlID0geworCS5raW5kCQk9ICJyb3VuZHJvYmluIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLnByaXZfc2l6ZQk9IHNpemVvZihzdHJ1Y3QgcnJfcHJpdiksCisJLm9wcwkJPSAmcnJfbW9kZV9vcHMsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBycl9pbml0X21vZHVsZSh2b2lkKQoreworCXJldHVybiB0ZWFtX21vZGVfcmVnaXN0ZXIoJnJyX21vZGUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcnJfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl0ZWFtX21vZGVfdW5yZWdpc3RlcigmcnJfbW9kZSk7Cit9CisKK21vZHVsZV9pbml0KHJyX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHJyX2NsZWFudXBfbW9kdWxlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOworTU9EVUxFX0FVVEhPUigiSmlyaSBQaXJrbyA8anBpcmtvQHJlZGhhdC5jb20+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlJvdW5kLXJvYmluIG1vZGUgZm9yIHRlYW0iKTsKK01PRFVMRV9BTElBUygidGVhbS1tb2RlLXJvdW5kcm9iaW4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3R1bi5jIGIvZHJpdmVycy9uZXQvdHVuLmMKaW5kZXggN2JlYTljNi4uOTNjNWQ3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdHVuLmMKKysrIGIvZHJpdmVycy9uZXQvdHVuLmMKQEAgLTEyMyw3ICsxMjMsNyBAQAogCWdpZF90CQkJZ3JvdXA7CiAKIAlzdHJ1Y3QgbmV0X2RldmljZQkqZGV2OwotCXUzMgkJCXNldF9mZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdAlzZXRfZmVhdHVyZXM7CiAjZGVmaW5lIFRVTl9VU0VSX0ZFQVRVUkVTIChORVRJRl9GX0hXX0NTVU18TkVUSUZfRl9UU09fRUNOfE5FVElGX0ZfVFNPfCBcCiAJCQkgIE5FVElGX0ZfVFNPNnxORVRJRl9GX1VGTykKIAlzdHJ1Y3QgZmFzeW5jX3N0cnVjdAkqZmFzeW5jOwpAQCAtNDU0LDcgKzQ1NCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgdHVuX25ldF9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IHR1bl9uZXRfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CiAKQEAgLTExOTYsNyArMTE5Nyw3IEBACiAgKiBwcml2cyByZXF1aXJlZC4gKi8KIHN0YXRpYyBpbnQgc2V0X29mZmxvYWQoc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biwgdW5zaWduZWQgbG9uZyBhcmcpCiB7Ci0JdTMyIGZlYXR1cmVzID0gMDsKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyA9IDA7CiAKIAlpZiAoYXJnICYgVFVOX0ZfQ1NVTSkgewogCQlmZWF0dXJlcyB8PSBORVRJRl9GX0hXX0NTVU07CkBAIC0xNTg5LDE2ICsxNTkwLDE1IEBACiB7CiAJc3RydWN0IHR1bl9zdHJ1Y3QgKnR1biA9IG5ldGRldl9wcml2KGRldik7CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKLQlzdHJjcHkoaW5mby0+ZndfdmVyc2lvbiwgIk4vQSIpOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CiAKIAlzd2l0Y2ggKHR1bi0+ZmxhZ3MgJiBUVU5fVFlQRV9NQVNLKSB7CiAJY2FzZSBUVU5fVFVOX0RFVjoKLQkJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCAidHVuIik7CisJCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sICJ0dW4iLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIAkJYnJlYWs7CiAJY2FzZSBUVU5fVEFQX0RFVjoKLQkJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCAidGFwIik7CisJCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sICJ0YXAiLCBzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL2FzaXguYyBiL2RyaXZlcnMvbmV0L3VzYi9hc2l4LmMKaW5kZXggZTZmZWQ0ZC4uZGJkY2EyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL2FzaXguYworKysgYi9kcml2ZXJzL25ldC91c2IvYXNpeC5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvdXNiL3VzYm5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMDgtTm92LTIwMTEiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIyMi1EZWMtMjAxMSIKICNkZWZpbmUgRFJJVkVSX05BTUUgImFzaXgiCiAKIC8qIEFTSVggQVg4ODE3WCBiYXNlZCBVU0IgMi4wIEV0aGVybmV0IERldmljZXMgKi8KQEAgLTY4OSw2ICs2ODksMTAgQEAKIAl9CiAJd29saW5mby0+c3VwcG9ydGVkID0gV0FLRV9QSFkgfCBXQUtFX01BR0lDOwogCXdvbGluZm8tPndvbG9wdHMgPSAwOworCWlmIChvcHQgJiBBWF9NT05JVE9SX0xJTkspCisJCXdvbGluZm8tPndvbG9wdHMgfD0gV0FLRV9QSFk7CisJaWYgKG9wdCAmIEFYX01PTklUT1JfTUFHSUMpCisJCXdvbGluZm8tPndvbG9wdHMgfD0gV0FLRV9NQUdJQzsKIH0KIAogc3RhdGljIGludApAQCAtMTY1NSw2ICsxNjU5LDEwIEBACiAJLy8gQVNJWCA4ODc3MmEKIAlVU0JfREVWSUNFKDB4MGRiMCwgMHhhODc3KSwKIAkuZHJpdmVyX2luZm8gPSAodW5zaWduZWQgbG9uZykgJmF4ODg3NzJfaW5mbywKK30sIHsKKwkvLyBBc3VzIFVTQiBFdGhlcm5ldCBBZGFwdGVyCisJVVNCX0RFVklDRSAoMHgwYjk1LCAweDdlMmIpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmYXg4ODc3Ml9pbmZvLAogfSwKIAl7IH0sCQkvLyBFTkQKIH07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2RjLXBob25ldC5jIGIvZHJpdmVycy9uZXQvdXNiL2NkYy1waG9uZXQuYwppbmRleCBhNjBkMDA2Li4zMzFlNDQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2RjLXBob25ldC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGMtcGhvbmV0LmMKQEAgLTEzMCw3ICsxMzAsNyBAQAogCXN0cnVjdCBwYWdlICpwYWdlOwogCWludCBlcnI7CiAKLQlwYWdlID0gX19uZXRkZXZfYWxsb2NfcGFnZShkZXYsIGdmcF9mbGFncyk7CisJcGFnZSA9IGFsbG9jX3BhZ2UoZ2ZwX2ZsYWdzKTsKIAlpZiAoIXBhZ2UpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0xNDAsNyArMTQwLDcgQEAKIAllcnIgPSB1c2Jfc3VibWl0X3VyYihyZXEsIGdmcF9mbGFncyk7CiAJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJZGV2X2RiZygmZGV2LT5kZXYsICJSWCBzdWJtaXQgZXJyb3IgKCVkKVxuIiwgZXJyKTsKLQkJbmV0ZGV2X2ZyZWVfcGFnZShkZXYsIHBhZ2UpOworCQlwdXRfcGFnZShwYWdlKTsKIAl9CiAJcmV0dXJuIGVycjsKIH0KQEAgLTIwOCw5ICsyMDgsOSBAQAogCWRldi0+c3RhdHMucnhfZXJyb3JzKys7CiByZXN1Ym1pdDoKIAlpZiAocGFnZSkKLQkJbmV0ZGV2X2ZyZWVfcGFnZShkZXYsIHBhZ2UpOworCQlwdXRfcGFnZShwYWdlKTsKIAlpZiAocmVxKQotCQlyeF9zdWJtaXQocG5kLCByZXEsIEdGUF9BVE9NSUMpOworCQlyeF9zdWJtaXQocG5kLCByZXEsIEdGUF9BVE9NSUMgfCBfX0dGUF9DT0xEKTsKIH0KIAogc3RhdGljIGludCB1c2Jwbl9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTIyOSw3ICsyMjksNyBAQAogCWZvciAoaSA9IDA7IGkgPCByeHFfc2l6ZTsgaSsrKSB7CiAJCXN0cnVjdCB1cmIgKnJlcSA9IHVzYl9hbGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CiAKLQkJaWYgKCFyZXEgfHwgcnhfc3VibWl0KHBuZCwgcmVxLCBHRlBfS0VSTkVMKSkgeworCQlpZiAoIXJlcSB8fCByeF9zdWJtaXQocG5kLCByZXEsIEdGUF9LRVJORUwgfCBfX0dGUF9DT0xEKSkgewogCQkJdXNicG5fY2xvc2UoZGV2KTsKIAkJCXJldHVybiAtRU5PTUVNOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jIGIvZHJpdmVycy9uZXQvdXNiL2NkY19uY20uYwppbmRleCBmMDZmYjc4Li4wMDlkZDBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC91c2IvY2RjX25jbS5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9jZGNfbmNtLmMKQEAgLTQ2NSwxMiArNDY1LDEwIEBACiAJaW50IHRlbXA7CiAJdTggaWZhY2Vfbm87CiAKLQljdHggPSBrbWFsbG9jKHNpemVvZigqY3R4KSwgR0ZQX0tFUk5FTCk7CisJY3R4ID0ga3phbGxvYyhzaXplb2YoKmN0eCksIEdGUF9LRVJORUwpOwogCWlmIChjdHggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOwotCiAJaW5pdF90aW1lcigmY3R4LT50eF90aW1lcik7CiAJc3Bpbl9sb2NrX2luaXQoJmN0eC0+bXR4KTsKIAljdHgtPm5ldGRldiA9IGRldi0+bmV0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYyBiL2RyaXZlcnMvbmV0L3VzYi9wZWdhc3VzLmMKaW5kZXggNzY5ZjUwOS4uNWQ5OWI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdXNiL3BlZ2FzdXMuYworKysgYi9kcml2ZXJzL25ldC91c2IvcGVnYXN1cy5jCkBAIC01NSw4ICs1NSw4IEBACiAjZGVmaW5lCUJNU1JfTUVESUEJKEJNU1JfMTBIQUxGIHwgQk1TUl8xMEZVTEwgfCBCTVNSXzEwMEhBTEYgfCBcCiAJCQlCTVNSXzEwMEZVTEwgfCBCTVNSX0FORUdDQVBBQkxFKQogCi1zdGF0aWMgaW50IGxvb3BiYWNrOwotc3RhdGljIGludCBtaWlfbW9kZTsKK3N0YXRpYyBib29sIGxvb3BiYWNrOworc3RhdGljIGJvb2wgbWlpX21vZGU7CiBzdGF0aWMgY2hhciAqZGV2aWQ7CiAKIHN0YXRpYyBzdHJ1Y3QgdXNiX2V0aF9kZXYgdXNiX2Rldl9pZFtdID0gewpAQCAtNTE3LDcgKzUxNyw3IEBACiAJZm9yIChpID0gMDsgaSA8IFJFR19USU1FT1VUOyBpKyspIHsKIAkJZ2V0X3JlZ2lzdGVycyhwZWdhc3VzLCBFdGhDdHJsMSwgMSwgJmRhdGEpOwogCQlpZiAofmRhdGEgJiAweDA4KSB7Ci0JCQlpZiAobG9vcGJhY2sgJiAxKQorCQkJaWYgKGxvb3BiYWNrKQogCQkJCWJyZWFrOwogCQkJaWYgKG1paV9tb2RlICYmIChwZWdhc3VzLT5mZWF0dXJlcyAmIEhBU19IT01FX1BOQSkpCiAJCQkJc2V0X3JlZ2lzdGVyKHBlZ2FzdXMsIEdwaW8xLCAweDM0KTsKQEAgLTU2MSw3ICs1NjEsNyBAQAogCQlkYXRhWzFdIHw9IDB4MTA7CS8qIHNldCAxMDAgTWJwcyAqLwogCWlmIChtaWlfbW9kZSkKIAkJZGF0YVsxXSA9IDA7Ci0JZGF0YVsyXSA9IChsb29wYmFjayAmIDEpID8gMHgwOSA6IDB4MDE7CisJZGF0YVsyXSA9IGxvb3BiYWNrID8gMHgwOSA6IDB4MDE7CiAKIAltZW1jcHkocGVnYXN1cy0+ZXRoX3JlZ3MsIGRhdGEsIHNpemVvZihkYXRhKSk7CiAJcmV0ID0gc2V0X3JlZ2lzdGVycyhwZWdhc3VzLCBFdGhDdHJsMCwgMywgZGF0YSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Ivc21zYzc1eHguYyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjNzV4eC5jCmluZGV4IGE1YjliMTIuLjBkNWRhODIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjNzV4eC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjNzV4eC5jCkBAIC03Niw3ICs3Niw3IEBACiAJc3RydWN0IHVzYm5ldCAqZGV2OwogfTsKIAotc3RhdGljIGludCB0dXJib19tb2RlID0gdHJ1ZTsKK3N0YXRpYyBib29sIHR1cmJvX21vZGUgPSB0cnVlOwogbW9kdWxlX3BhcmFtKHR1cmJvX21vZGUsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyh0dXJib19tb2RlLCAiRW5hYmxlIG11bHRpcGxlIGZyYW1lcyBwZXIgUnggdHJhbnNhY3Rpb24iKTsKIApAQCAtNzI4LDcgKzcyOCw4IEBACiB9CiAKIC8qIEVuYWJsZSBvciBkaXNhYmxlIFJ4IGNoZWNrc3VtIG9mZmxvYWQgZW5naW5lICovCi1zdGF0aWMgaW50IHNtc2M3NXh4X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgaW50IHNtc2M3NXh4X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJc3RydWN0IHNtc2M3NXh4X3ByaXYgKnBkYXRhID0gKHN0cnVjdCBzbXNjNzV4eF9wcml2ICopKGRldi0+ZGF0YVswXSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC91c2Ivc21zYzk1eHguYyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jCmluZGV4IGVmZjY3NjcuLmRiMjE3YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jCisrKyBiL2RyaXZlcnMvbmV0L3VzYi9zbXNjOTV4eC5jCkBAIC01OSw3ICs1OSw3IEBACiAJc3RydWN0IHVzYm5ldCAqZGV2OwogfTsKIAotc3RhdGljIGludCB0dXJib19tb2RlID0gdHJ1ZTsKK3N0YXRpYyBib29sIHR1cmJvX21vZGUgPSB0cnVlOwogbW9kdWxlX3BhcmFtKHR1cmJvX21vZGUsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyh0dXJib19tb2RlLCAiRW5hYmxlIG11bHRpcGxlIGZyYW1lcyBwZXIgUnggdHJhbnNhY3Rpb24iKTsKIApAQCAtNTE2LDcgKzUxNiw4IEBACiB9CiAKIC8qIEVuYWJsZSBvciBkaXNhYmxlIFR4ICYgUnggY2hlY2tzdW0gb2ZmbG9hZCBlbmdpbmVzICovCi1zdGF0aWMgaW50IHNtc2M5NXh4X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgaW50IHNtc2M5NXh4X3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCB1c2JuZXQgKmRldiA9IG5ldGRldl9wcml2KG5ldGRldik7CiAJdTMyIHJlYWRfYnVmOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdmV0aC5jIGIvZHJpdmVycy9uZXQvdmV0aC5jCmluZGV4IGVmODgzZTkuLjQ5ZjQ2NjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3ZldGguYworKysgYi9kcml2ZXJzL25ldC92ZXRoLmMKQEAgLTI3LDggKzI3LDggQEAKIAogc3RydWN0IHZldGhfbmV0X3N0YXRzIHsKIAl1NjQJCQlyeF9wYWNrZXRzOwotCXU2NAkJCXR4X3BhY2tldHM7CiAJdTY0CQkJcnhfYnl0ZXM7CisJdTY0CQkJdHhfcGFja2V0czsKIAl1NjQJCQl0eF9ieXRlczsKIAl1NjQJCQlyeF9kcm9wcGVkOwogCXN0cnVjdCB1NjRfc3RhdHNfc3luYwlzeW5jcDsKQEAgLTY2LDkgKzY2LDggQEAKIAogc3RhdGljIHZvaWQgdmV0aF9nZXRfZHJ2aW5mbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvICppbmZvKQogewotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOwotCXN0cmNweShpbmZvLT5md192ZXJzaW9uLCAiTi9BIik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKIH0KIAogc3RhdGljIHZvaWQgdmV0aF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5nc2V0LCB1OCAqYnVmKQpAQCAtMjcxLDcgKzI3MCw3IEBACiAJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0xMVFg7CiAJZGV2LT5kZXN0cnVjdG9yID0gdmV0aF9kZXZfZnJlZTsKIAotCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX05PX0NTVU0gfCBORVRJRl9GX1NHIHwgTkVUSUZfRl9SWENTVU07CisJZGV2LT5od19mZWF0dXJlcyA9IE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfU0cgfCBORVRJRl9GX1JYQ1NVTTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYyBiL2RyaXZlcnMvbmV0L3ZpcnRpb19uZXQuYwppbmRleCA2ZWU4NDEwLi43NmZlMTRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92aXJ0aW9fbmV0LmMKKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCkBAIC0zMCw3ICszMCw3IEBACiBzdGF0aWMgaW50IG5hcGlfd2VpZ2h0ID0gMTI4OwogbW9kdWxlX3BhcmFtKG5hcGlfd2VpZ2h0LCBpbnQsIDA0NDQpOwogCi1zdGF0aWMgaW50IGNzdW0gPSAxLCBnc28gPSAxOworc3RhdGljIGJvb2wgY3N1bSA9IHRydWUsIGdzbyA9IHRydWU7CiBtb2R1bGVfcGFyYW0oY3N1bSwgYm9vbCwgMDQ0NCk7CiBtb2R1bGVfcGFyYW0oZ3NvLCBib29sLCAwNDQ0KTsKIApAQCAtMzksNiArMzksNyBAQAogI2RlZmluZSBHT09EX0NPUFlfTEVOCTEyOAogCiAjZGVmaW5lIFZJUlRORVRfU0VORF9DT01NQU5EX1NHX01BWCAgICAyCisjZGVmaW5lIFZJUlRORVRfRFJJVkVSX1ZFUlNJT04gIjEuMC4wIgogCiBzdHJ1Y3QgdmlydG5ldF9zdGF0cyB7CiAJc3RydWN0IHU2NF9zdGF0c19zeW5jIHN5bmNwOwpAQCAtMTU1LDYgKzE1Niw3IEBACiAJKmxlbiAtPSBzaXplOwogfQogCisvKiBDYWxsZWQgZnJvbSBib3R0b20gaGFsZiBjb250ZXh0ICovCiBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnBhZ2VfdG9fc2tiKHN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpLAogCQkJCSAgIHN0cnVjdCBwYWdlICpwYWdlLCB1bnNpZ25lZCBpbnQgbGVuKQogewpAQCAtMzU3LDcgKzM1OSw3IEBACiAJc3RydWN0IHNrYl92bmV0X2hkciAqaGRyOwogCWludCBlcnI7CiAKLQlza2IgPSBuZXRkZXZfYWxsb2Nfc2tiX2lwX2FsaWduKHZpLT5kZXYsIE1BWF9QQUNLRVRfTEVOKTsKKwlza2IgPSBfX25ldGRldl9hbGxvY19za2JfaXBfYWxpZ24odmktPmRldiwgTUFYX1BBQ0tFVF9MRU4sIGdmcCk7CiAJaWYgKHVubGlrZWx5KCFza2IpKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNDM5LDcgKzQ0MSwxMyBAQAogCXJldHVybiBlcnI7CiB9CiAKLS8qIFJldHVybnMgZmFsc2UgaWYgd2UgY291bGRuJ3QgZmlsbCBlbnRpcmVseSAoT09NKS4gKi8KKy8qCisgKiBSZXR1cm5zIGZhbHNlIGlmIHdlIGNvdWxkbid0IGZpbGwgZW50aXJlbHkgKE9PTSkuCisgKgorICogTm9ybWFsbHkgcnVuIGluIHRoZSByZWNlaXZlIHBhdGgsIGJ1dCBjYW4gYWxzbyBiZSBydW4gZnJvbSBuZG9fb3BlbgorICogYmVmb3JlIHdlJ3JlIHJlY2VpdmluZyBwYWNrZXRzLCBvciBmcm9tIHJlZmlsbF93b3JrIHdoaWNoIGlzCisgKiBjYXJlZnVsIHRvIGRpc2FibGUgcmVjZWl2aW5nICh1c2luZyBuYXBpX2Rpc2FibGUpLgorICovCiBzdGF0aWMgYm9vbCB0cnlfZmlsbF9yZWN2KHN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpLCBnZnBfdCBnZnApCiB7CiAJaW50IGVycjsKQEAgLTUwMSw3ICs1MDksNyBAQAogCS8qIEluIHRoZW9yeSwgdGhpcyBjYW4gaGFwcGVuOiBpZiB3ZSBkb24ndCBnZXQgYW55IGJ1ZmZlcnMgaW4KIAkgKiB3ZSB3aWxsICpuZXZlciogdHJ5IHRvIGZpbGwgYWdhaW4uICovCiAJaWYgKHN0aWxsX2VtcHR5KQotCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnZpLT5yZWZpbGwsIEhaLzIpOworCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX25ydF93cSwgJnZpLT5yZWZpbGwsIEhaLzIpOwogfQogCiBzdGF0aWMgaW50IHZpcnRuZXRfcG9sbChzdHJ1Y3QgbmFwaV9zdHJ1Y3QgKm5hcGksIGludCBidWRnZXQpCkBAIC01MjAsNyArNTI4LDcgQEAKIAogCWlmICh2aS0+bnVtIDwgdmktPm1heCAvIDIpIHsKIAkJaWYgKCF0cnlfZmlsbF9yZWN2KHZpLCBHRlBfQVRPTUlDKSkKLQkJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmdmktPnJlZmlsbCwgMCk7CisJCQlxdWV1ZV9kZWxheWVkX3dvcmsoc3lzdGVtX25ydF93cSwgJnZpLT5yZWZpbGwsIDApOwogCX0KIAogCS8qIE91dCBvZiBwYWNrZXRzPyAqLwpAQCAtNjk5LDYgKzcwNyw3IEBACiAJfQogCiAJdG90LT50eF9kcm9wcGVkID0gZGV2LT5zdGF0cy50eF9kcm9wcGVkOworCXRvdC0+dHhfZmlmb19lcnJvcnMgPSBkZXYtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzOwogCXRvdC0+cnhfZHJvcHBlZCA9IGRldi0+c3RhdHMucnhfZHJvcHBlZDsKIAl0b3QtPnJ4X2xlbmd0aF9lcnJvcnMgPSBkZXYtPnN0YXRzLnJ4X2xlbmd0aF9lcnJvcnM7CiAJdG90LT5yeF9mcmFtZV9lcnJvcnMgPSBkZXYtPnN0YXRzLnJ4X2ZyYW1lX2Vycm9yczsKQEAgLTcxOSw2ICs3MjgsMTAgQEAKIHsKIAlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IG5ldGRldl9wcml2KGRldik7CiAKKwkvKiBNYWtlIHN1cmUgd2UgaGF2ZSBzb21lIGJ1ZmZlcnM6IGlmIG9vbSB1c2Ugd3EuICovCisJaWYgKCF0cnlfZmlsbF9yZWN2KHZpLCBHRlBfS0VSTkVMKSkKKwkJcXVldWVfZGVsYXllZF93b3JrKHN5c3RlbV9ucnRfd3EsICZ2aS0+cmVmaWxsLCAwKTsKKwogCXZpcnRuZXRfbmFwaV9lbmFibGUodmkpOwogCXJldHVybiAwOwogfQpAQCAtNzcyLDYgKzc4NSw4IEBACiB7CiAJc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkgPSBuZXRkZXZfcHJpdihkZXYpOwogCisJLyogTWFrZSBzdXJlIHJlZmlsbF93b3JrIGRvZXNuJ3QgcmUtZW5hYmxlIG5hcGkhICovCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ2aS0+cmVmaWxsKTsKIAluYXBpX2Rpc2FibGUoJnZpLT5uYXBpKTsKIAogCXJldHVybiAwOwpAQCAtODUzLDcgKzg2OCw3IEBACiAJa2ZyZWUoYnVmKTsKIH0KIAotc3RhdGljIHZvaWQgdmlydG5ldF92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHZpZCkKK3N0YXRpYyBpbnQgdmlydG5ldF92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHZpZCkKIHsKIAlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IG5ldGRldl9wcml2KGRldik7CiAJc3RydWN0IHNjYXR0ZXJsaXN0IHNnOwpAQCAtODYzLDkgKzg3OCwxMCBAQAogCWlmICghdmlydG5ldF9zZW5kX2NvbW1hbmQodmksIFZJUlRJT19ORVRfQ1RSTF9WTEFOLAogCQkJCSAgVklSVElPX05FVF9DVFJMX1ZMQU5fQURELCAmc2csIDEsIDApKQogCQlkZXZfd2FybigmZGV2LT5kZXYsICJGYWlsZWQgdG8gYWRkIFZMQU4gSUQgJWQuXG4iLCB2aWQpOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB2aXJ0bmV0X3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHZpZCkKK3N0YXRpYyBpbnQgdmlydG5ldF92bGFuX3J4X2tpbGxfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB2aWQpCiB7CiAJc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkgPSBuZXRkZXZfcHJpdihkZXYpOwogCXN0cnVjdCBzY2F0dGVybGlzdCBzZzsKQEAgLTg3NSw2ICs4OTEsNyBAQAogCWlmICghdmlydG5ldF9zZW5kX2NvbW1hbmQodmksIFZJUlRJT19ORVRfQ1RSTF9WTEFOLAogCQkJCSAgVklSVElPX05FVF9DVFJMX1ZMQU5fREVMLCAmc2csIDEsIDApKQogCQlkZXZfd2FybigmZGV2LT5kZXYsICJGYWlsZWQgdG8ga2lsbCBWTEFOIElEICVkLlxuIiwgdmlkKTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgdmlydG5ldF9nZXRfcmluZ3BhcmFtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC04ODksNyArOTA2LDIxIEBACiAKIH0KIAorCitzdGF0aWMgdm9pZCB2aXJ0bmV0X2dldF9kcnZpbmZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IG5ldGRldl9wcml2KGRldik7CisJc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYgPSB2aS0+dmRldjsKKworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBLQlVJTERfTU9ETkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgVklSVE5FVF9EUklWRVJfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKKwlzdHJsY3B5KGluZm8tPmJ1c19pbmZvLCB2aXJ0aW9fYnVzX25hbWUodmRldiksIHNpemVvZihpbmZvLT5idXNfaW5mbykpOworCit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZXRodG9vbF9vcHMgdmlydG5ldF9ldGh0b29sX29wcyA9IHsKKwkuZ2V0X2RydmluZm8gPSB2aXJ0bmV0X2dldF9kcnZpbmZvLAogCS5nZXRfbGluayA9IGV0aHRvb2xfb3BfZ2V0X2xpbmssCiAJLmdldF9yaW5ncGFyYW0gPSB2aXJ0bmV0X2dldF9yaW5ncGFyYW0sCiB9OwpAQCAtMTA4Miw3ICsxMTEzLDYgQEAKIAogdW5yZWdpc3RlcjoKIAl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmdmktPnJlZmlsbCk7CiBmcmVlX3ZxczoKIAl2ZGV2LT5jb25maWctPmRlbF92cXModmRldik7CiBmcmVlX3N0YXRzOgpAQCAtMTEyMSw5ICsxMTUxLDcgQEAKIAkvKiBTdG9wIGFsbCB0aGUgdmlydHF1ZXVlcy4gKi8KIAl2ZGV2LT5jb25maWctPnJlc2V0KHZkZXYpOwogCi0KIAl1bnJlZ2lzdGVyX25ldGRldih2aS0+ZGV2KTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnZpLT5yZWZpbGwpOwogCiAJLyogRnJlZSB1bnVzZWQgYnVmZmVycyBpbiBib3RoIHNlbmQgYW5kIHJlY3YsIGlmIGFueS4gKi8KIAlmcmVlX3VudXNlZF9idWZzKHZpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19kcnYuYwppbmRleCBkOTZiZmIxLi5kZTdmYzM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZHJ2LmMKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2Rydi5jCkBAIC0xOTI2LDcgKzE5MjYsNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiB2bXhuZXQzX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwpAQCAtMTk0MywxMCArMTk0MywxMiBAQAogCX0KIAogCXNldF9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOworCisJcmV0dXJuIDA7CiB9CiAKIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIHZteG5ldDNfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MTYgdmlkKQogewogCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwpAQCAtMTk2Myw2ICsxOTY1LDggQEAKIAl9CiAKIAljbGVhcl9iaXQodmlkLCBhZGFwdGVyLT5hY3RpdmVfdmxhbnMpOworCisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjE2Myw3ICsyMTY3LDggQEAKIAkJcnNzQ29uZi0+aW5kVGFibGVTaXplID0gVk1YTkVUM19SU1NfSU5EX1RBQkxFX1NJWkU7CiAJCWdldF9yYW5kb21fYnl0ZXMoJnJzc0NvbmYtPmhhc2hLZXlbMF0sIHJzc0NvbmYtPmhhc2hLZXlTaXplKTsKIAkJZm9yIChpID0gMDsgaSA8IHJzc0NvbmYtPmluZFRhYmxlU2l6ZTsgaSsrKQotCQkJcnNzQ29uZi0+aW5kVGFibGVbaV0gPSBpICUgYWRhcHRlci0+bnVtX3J4X3F1ZXVlczsKKwkJCXJzc0NvbmYtPmluZFRhYmxlW2ldID0gZXRodG9vbF9yeGZoX2luZGlyX2RlZmF1bHQoCisJCQkJaSwgYWRhcHRlci0+bnVtX3J4X3F1ZXVlcyk7CiAKIAkJZGV2UmVhZC0+cnNzQ29uZkRlc2MuY29uZlZlciA9IDE7CiAJCWRldlJlYWQtPnJzc0NvbmZEZXNjLmNvbmZMZW4gPSBzaXplb2YoKnJzc0NvbmYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2V0aHRvb2wuYyBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19ldGh0b29sLmMKaW5kZXggZTY2MmNiYy4uNTg3YTIxOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfZXRodG9vbC5jCkBAIC0yMDIsMTQgKzIwMiw5IEBACiAJc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciA9IG5ldGRldl9wcml2KG5ldGRldik7CiAKIAlzdHJsY3B5KGRydmluZm8tPmRyaXZlciwgdm14bmV0M19kcml2ZXJfbmFtZSwgc2l6ZW9mKGRydmluZm8tPmRyaXZlcikpOwotCWRydmluZm8tPmRyaXZlcltzaXplb2YoZHJ2aW5mby0+ZHJpdmVyKSAtIDFdID0gJ1wwJzsKIAogCXN0cmxjcHkoZHJ2aW5mby0+dmVyc2lvbiwgVk1YTkVUM19EUklWRVJfVkVSU0lPTl9SRVBPUlQsCiAJCXNpemVvZihkcnZpbmZvLT52ZXJzaW9uKSk7Ci0JZHJ2aW5mby0+ZHJpdmVyW3NpemVvZihkcnZpbmZvLT52ZXJzaW9uKSAtIDFdID0gJ1wwJzsKLQotCXN0cmxjcHkoZHJ2aW5mby0+ZndfdmVyc2lvbiwgIk4vQSIsIHNpemVvZihkcnZpbmZvLT5md192ZXJzaW9uKSk7Ci0JZHJ2aW5mby0+ZndfdmVyc2lvbltzaXplb2YoZHJ2aW5mby0+ZndfdmVyc2lvbikgLSAxXSA9ICdcMCc7CiAKIAlzdHJsY3B5KGRydmluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShhZGFwdGVyLT5wZGV2KSwKIAkJRVRIVE9PTF9CVVNJTkZPX0xFTik7CkBAIC0yNjIsMTEgKzI1NywxMSBAQAogCX0KIH0KIAotaW50IHZteG5ldDNfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiBmZWF0dXJlcykKK2ludCB2bXhuZXQzX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUzMiBjaGFuZ2VkID0gZmVhdHVyZXMgXiBuZXRkZXYtPmZlYXR1cmVzOworCW5ldGRldl9mZWF0dXJlc190IGNoYW5nZWQgPSBmZWF0dXJlcyBeIG5ldGRldi0+ZmVhdHVyZXM7CiAKIAlpZiAoY2hhbmdlZCAmIChORVRJRl9GX1JYQ1NVTSB8IE5FVElGX0ZfTFJPIHwgTkVUSUZfRl9IV19WTEFOX1JYKSkgewogCQlpZiAoZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkKQEAgLTU3MCw0NCArNTY1LDM4IEBACiB9CiAKICNpZmRlZiBWTVhORVQzX1JTUwotc3RhdGljIGludAotdm14bmV0M19nZXRfcnNzX2luZGlyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCi0JCSAgICAgIHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKnApCitzdGF0aWMgdTMyCit2bXhuZXQzX2dldF9yc3NfaW5kaXJfc2l6ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQogewogCXN0cnVjdCB2bXhuZXQzX2FkYXB0ZXIgKmFkYXB0ZXIgPSBuZXRkZXZfcHJpdihuZXRkZXYpOwogCXN0cnVjdCBVUFQxX1JTU0NvbmYgKnJzc0NvbmYgPSBhZGFwdGVyLT5yc3NfY29uZjsKLQl1bnNpZ25lZCBpbnQgbiA9IG1pbl90KHVuc2lnbmVkIGludCwgcC0+c2l6ZSwgcnNzQ29uZi0+aW5kVGFibGVTaXplKTsKIAotCXAtPnNpemUgPSByc3NDb25mLT5pbmRUYWJsZVNpemU7CisJcmV0dXJuIHJzc0NvbmYtPmluZFRhYmxlU2l6ZTsKK30KKworc3RhdGljIGludAordm14bmV0M19nZXRfcnNzX2luZGlyKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIHUzMiAqcCkKK3sKKwlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKwlzdHJ1Y3QgVVBUMV9SU1NDb25mICpyc3NDb25mID0gYWRhcHRlci0+cnNzX2NvbmY7CisJdW5zaWduZWQgaW50IG4gPSByc3NDb25mLT5pbmRUYWJsZVNpemU7CisKIAl3aGlsZSAobi0tKQotCQlwLT5yaW5nX2luZGV4W25dID0gcnNzQ29uZi0+aW5kVGFibGVbbl07CisJCXBbbl0gPSByc3NDb25mLT5pbmRUYWJsZVtuXTsKIAlyZXR1cm4gMDsKIAogfQogCiBzdGF0aWMgaW50Ci12bXhuZXQzX3NldF9yc3NfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKLQkJICAgICAgY29uc3Qgc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciAqcCkKK3ZteG5ldDNfc2V0X3Jzc19pbmRpcihzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBjb25zdCB1MzIgKnApCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3Qgdm14bmV0M19hZGFwdGVyICphZGFwdGVyID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKIAlzdHJ1Y3QgVVBUMV9SU1NDb25mICpyc3NDb25mID0gYWRhcHRlci0+cnNzX2NvbmY7CiAKLQlpZiAocC0+c2l6ZSAhPSByc3NDb25mLT5pbmRUYWJsZVNpemUpCi0JCXJldHVybiAtRUlOVkFMOwotCWZvciAoaSA9IDA7IGkgPCByc3NDb25mLT5pbmRUYWJsZVNpemU7IGkrKykgewotCQkvKgotCQkgKiBSZXR1cm4gd2l0aCBlcnJvciBjb2RlIGlmIGFueSBvZiB0aGUgcXVldWUgaW5kaWNlcwotCQkgKiBpcyBvdXQgb2YgcmFuZ2UKLQkJICovCi0JCWlmIChwLT5yaW5nX2luZGV4W2ldIDwgMCB8fAotCQkgICAgcC0+cmluZ19pbmRleFtpXSA+PSBhZGFwdGVyLT5udW1fcnhfcXVldWVzKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJZm9yIChpID0gMDsgaSA8IHJzc0NvbmYtPmluZFRhYmxlU2l6ZTsgaSsrKQotCQlyc3NDb25mLT5pbmRUYWJsZVtpXSA9IHAtPnJpbmdfaW5kZXhbaV07CisJCXJzc0NvbmYtPmluZFRhYmxlW2ldID0gcFtpXTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5jbWRfbG9jaywgZmxhZ3MpOwogCVZNWE5FVDNfV1JJVEVfQkFSMV9SRUcoYWRhcHRlciwgVk1YTkVUM19SRUdfQ01ELApAQCAtNjE5LDcgKzYwOCw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB2bXhuZXQzX2V0aHRvb2xfb3BzID0geworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyB2bXhuZXQzX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MgICAgICA9IHZteG5ldDNfZ2V0X3NldHRpbmdzLAogCS5nZXRfZHJ2aW5mbyAgICAgICA9IHZteG5ldDNfZ2V0X2RydmluZm8sCiAJLmdldF9yZWdzX2xlbiAgICAgID0gdm14bmV0M19nZXRfcmVnc19sZW4sCkBAIC02MzQsNiArNjIzLDcgQEAKIAkuc2V0X3JpbmdwYXJhbSAgICAgPSB2bXhuZXQzX3NldF9yaW5ncGFyYW0sCiAJLmdldF9yeG5mYyAgICAgICAgID0gdm14bmV0M19nZXRfcnhuZmMsCiAjaWZkZWYgVk1YTkVUM19SU1MKKwkuZ2V0X3J4ZmhfaW5kaXJfc2l6ZSA9IHZteG5ldDNfZ2V0X3Jzc19pbmRpcl9zaXplLAogCS5nZXRfcnhmaF9pbmRpciAgICA9IHZteG5ldDNfZ2V0X3Jzc19pbmRpciwKIAkuc2V0X3J4ZmhfaW5kaXIgICAgPSB2bXhuZXQzX3NldF9yc3NfaW5kaXIsCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaCBiL2RyaXZlcnMvbmV0L3ZteG5ldDMvdm14bmV0M19pbnQuaAppbmRleCBiMThlYWMxLi5lZDU0Nzk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC92bXhuZXQzL3ZteG5ldDNfaW50LmgKKysrIGIvZHJpdmVycy9uZXQvdm14bmV0My92bXhuZXQzX2ludC5oCkBAIC00MDEsNyArNDAxLDcgQEAKIHZteG5ldDNfcnFfZGVzdHJveV9hbGwoc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlcik7CiAKIGludAotdm14bmV0M19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgdTMyIGZlYXR1cmVzKTsKK3ZteG5ldDNfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKTsKIAogaW50CiB2bXhuZXQzX2NyZWF0ZV9xdWV1ZXMoc3RydWN0IHZteG5ldDNfYWRhcHRlciAqYWRhcHRlciwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMgYi9kcml2ZXJzL25ldC93YW4vc2JuaS5jCmluZGV4IDc4MzE2OGMuLmQ0M2Y0ZWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9zYm5pLmMKKysrIGIvZHJpdmVycy9uZXQvd2FuL3NibmkuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiBzdGF0aWMgY29uc3QgY2hhciAgdmVyc2lvbltdID0KIAkiR3JhbmNoIFNCTkkxMiBkcml2ZXIgdmVyIDUuMC4xICBKdW4gMjIgMjAwMSAgRGVuaXMgSS5UaW1vZmVldi5cbiI7CiAKLXN0YXRpYyBpbnQgIHNraXBfcGNpX3Byb2JlCV9faW5pdGRhdGEgPSAwOworc3RhdGljIGJvb2wgc2tpcF9wY2lfcHJvYmUJX19pbml0ZGF0YSA9IGZhbHNlOwogc3RhdGljIGludCAgc2NhbmRvbmUJX19pbml0ZGF0YSA9IDA7CiBzdGF0aWMgaW50ICBudW0JCV9faW5pdGRhdGEgPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93YW4vc2VhbGV2ZWwuYyBiL2RyaXZlcnMvbmV0L3dhbi9zZWFsZXZlbC5jCmluZGV4IDBiNGZkMDUuLjRmNzc0ODQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dhbi9zZWFsZXZlbC5jCisrKyBiL2RyaXZlcnMvbmV0L3dhbi9zZWFsZXZlbC5jCkBAIC0zNjIsNyArMzYyLDcgQEAKIHN0YXRpYyBpbnQgdHhkbWE9MTsKIHN0YXRpYyBpbnQgcnhkbWE9MzsKIHN0YXRpYyBpbnQgaXJxPTU7Ci1zdGF0aWMgaW50IHNsb3c9MDsKK3N0YXRpYyBib29sIHNsb3c9ZmFsc2U7CiAKIG1vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoaW8sICJUaGUgSS9PIGJhc2Ugb2YgdGhlIFNlYWxldmVsIGNhcmQiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS90eC5jIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3R4LmMKaW5kZXggNGI5ZWNiMi4uZjIwODg2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3R4LmMKQEAgLTU2Miw3ICs1NjIsNyBAQAogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9IGkyNDAwbV9kZXYoaTI0MDBtKTsKIAlzdHJ1Y3QgaTI0MDBtX21zZ19oZHIgKnR4X21zZzsKLQlib29sIHRyeV9oZWFkID0gMDsKKwlib29sIHRyeV9oZWFkID0gZmFsc2U7CiAJQlVHX09OKGkyNDAwbS0+dHhfbXNnICE9IE5VTEwpOwogCS8qCiAJICogSW4gY2VydGFpbiBzaXR1YXRpb25zLCBUWCBxdWV1ZSBtaWdodCBoYXZlIGVub3VnaCBzcGFjZSB0bwpAQCAtNTgwLDcgKzU4MCw3IEBACiAJZWxzZSBpZiAodHhfbXNnID09IFRBSUxfRlVMTCkgewogCQlpMjQwMG1fdHhfc2tpcF90YWlsKGkyNDAwbSk7CiAJCWRfcHJpbnRmKDIsIGRldiwgIm5ldyBUWCBtZXNzYWdlOiB0YWlsIGZ1bGwsIHRyeWluZyBoZWFkXG4iKTsKLQkJdHJ5X2hlYWQgPSAxOworCQl0cnlfaGVhZCA9IHRydWU7CiAJCWdvdG8gdHJ5X2hlYWQ7CiAJfQogCW1lbXNldCh0eF9tc2csIDAsIEkyNDAwTV9UWF9QTERfU0laRSk7CkBAIC03MjAsNyArNzIwLDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNpemVfdCBwYWRkZWRfbGVuOwogCXZvaWQgKnB0cjsKLQlib29sIHRyeV9oZWFkID0gMDsKKwlib29sIHRyeV9oZWFkID0gZmFsc2U7CiAJdW5zaWduZWQgaXNfc2luZ2xldG9uID0gcGxfdHlwZSA9PSBJMjQwME1fUFRfUkVTRVRfV0FSTQogCQl8fCBwbF90eXBlID09IEkyNDAwTV9QVF9SRVNFVF9DT0xEOwogCkBAIC03NzEsNyArNzcxLDcgQEAKIAkJZF9wcmludGYoMiwgZGV2LCAicGwgYXBwZW5kOiB0YWlsIGZ1bGxcbiIpOwogCQlpMjQwMG1fdHhfY2xvc2UoaTI0MDBtKTsKIAkJaTI0MDBtX3R4X3NraXBfdGFpbChpMjQwMG0pOwotCQl0cnlfaGVhZCA9IDE7CisJCXRyeV9oZWFkID0gdHJ1ZTsKIAkJZ290byB0cnlfbmV3OwogCX0gZWxzZSBpZiAocHRyID09IE5VTEwpIHsJLyogQWxsIGZ1bGwgKi8KIAkJcmVzdWx0ID0gLUVOT1NQQzsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItdHguYyBiL2RyaXZlcnMvbmV0L3dpbWF4L2kyNDAwbS91c2ItdHguYwppbmRleCBhYzM1N2FjLi45OWVmODFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aW1heC9pMjQwMG0vdXNiLXR4LmMKKysrIGIvZHJpdmVycy9uZXQvd2ltYXgvaTI0MDBtL3VzYi10eC5jCkBAIC0xNzcsNyArMTc3LDYgQEAKIHN0YXRpYwogaW50IGkyNDAwbXVfdHhkKHZvaWQgKl9pMjQwMG11KQogewotCWludCByZXN1bHQgPSAwOwogCXN0cnVjdCBpMjQwMG11ICppMjQwMG11ID0gX2kyNDAwbXU7CiAJc3RydWN0IGkyNDAwbSAqaTI0MDBtID0gJmkyNDAwbXUtPmkyNDAwbTsKIAlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaTI0MDBtdS0+dXNiX2lmYWNlLT5kZXY7CkBAIC0yMDgsMTYgKzIwNywxNCBAQAogCQkvKiBZZWFoLCB3ZSBpZ25vcmUgZXJyb3JzIC4uLiBub3QgbXVjaCB3ZSBjYW4gZG8gKi8KIAkJaTI0MDBtdV90eChpMjQwMG11LCB0eF9tc2csIHR4X21zZ19zaXplKTsKIAkJaTI0MDBtX3R4X21zZ19zZW50KGkyNDAwbSk7CS8qIGFjayBpdCwgYWR2YW5jZSB0aGUgRklGTyAqLwotCQlpZiAocmVzdWx0IDwgMCkKLQkJCWJyZWFrOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKIAlpMjQwMG11LT50eF9rdGhyZWFkID0gTlVMTDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMjQwMG0tPnR4X2xvY2ssIGZsYWdzKTsKIAotCWRfZm5lbmQoNCwgZGV2LCAiKGkyNDAwbXUgJXApID0gJWRcbiIsIGkyNDAwbXUsIHJlc3VsdCk7Ci0JcmV0dXJuIHJlc3VsdDsKKwlkX2ZuZW5kKDQsIGRldiwgIihpMjQwMG11ICVwKVxuIiwgaTI0MDBtdSk7CisJcmV0dXJuIDA7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQppbmRleCAwYTMwNGIwLi45OGRiNzYxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQpAQCAtNDIsNyArNDIsNyBAQAogb2JqLSQoQ09ORklHX01XTDhLKQkrPSBtd2w4ay5vCiAKIG9iai0kKENPTkZJR19JV0xXSUZJKQkrPSBpd2x3aWZpLwotb2JqLSQoQ09ORklHX0lXTFdJRklfTEVHQUNZKQkrPSBpd2xlZ2FjeS8KK29iai0kKENPTkZJR19JV0xFR0FDWSkJKz0gaXdsZWdhY3kvCiBvYmotJChDT05GSUdfUlQyWDAwKQkrPSBydDJ4MDAvCiAKIG9iai0kKENPTkZJR19QNTRfQ09NTU9OKQkrPSBwNTQvCkBAIC01OCw2ICs1OCw2IEBACiBvYmotJChDT05GSUdfSVdNKQkrPSBpd21jMzIwMHdpZmkvCiAKIG9iai0kKENPTkZJR19NV0lGSUVYKQkrPSBtd2lmaWV4Lwotb2JqLSQoQ09ORklHX0JSQ01GTUFDKSArPSBicmNtODAyMTEvCi1vYmotJChDT05GSUdfQlJDTVVNQUMpICs9IGJyY204MDIxMS8KLW9iai0kKENPTkZJR19CUkNNU01BQykgKz0gYnJjbTgwMjExLworCitvYmotJChDT05GSUdfQlJDTUZNQUMpCSs9IGJyY204MDIxMS8KK29iai0kKENPTkZJR19CUkNNU01BQykJKz0gYnJjbTgwMjExLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYWlyby5jCmluZGV4IGFjMTE3NmEuLjFjMDA4YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2Fpcm8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9haXJvLmMKQEAgLTE0MTgsNyArMTQxOCw3IEBACiAJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCxmcmFtZS0+ZGEsRVRIX0FMRU4gKiAyKTsgLy8gREEsU0EKIAllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCh1OCopJm1pYy0+dHlwZWxlbiwxMCk7IC8vIFR5cGUvTGVuZ3RoIGFuZCBTbmFwCiAJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwodTgqKSZtaWMtPnNlcSxzaXplb2YobWljLT5zZXEpKTsgLy9TRVEKLQllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLGZyYW1lLT5kYSArIEVUSF9BTEVOICogMixwYXlMZW4pOyAvL3BheWxvYWQKKwllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCh1OCopKGZyYW1lICsgMSkscGF5TGVuKTsgLy9wYXlsb2FkCiAJZW1taDMyX2ZpbmFsKCZjb250ZXh0LT5zZWVkLCAodTgqKSZtaWMtPm1pYyk7CiAKIAkvKiAgICBOZXcgVHlwZS9sZW5ndGggPz8/Pz8/Pz8/PyAqLwpAQCAtMTUwNiw3ICsxNTA2LDcgQEAKIAkJZW1taDMyX3VwZGF0ZSgmY29udGV4dC0+c2VlZCwgZXRoLT5kYSwgRVRIX0FMRU4qMik7IAogCQllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCAodTggKikmbWljLT50eXBlbGVuLCBzaXplb2YobWljLT50eXBlbGVuKStzaXplb2YobWljLT51LnNuYXApKTsgCiAJCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsICh1OCAqKSZtaWMtPnNlcSxzaXplb2YobWljLT5zZXEpKTsJCi0JCWVtbWgzMl91cGRhdGUoJmNvbnRleHQtPnNlZWQsIGV0aC0+ZGEgKyBFVEhfQUxFTioyLHBheUxlbik7CQorCQllbW1oMzJfdXBkYXRlKCZjb250ZXh0LT5zZWVkLCAodTggKikoZXRoICsgMSkscGF5TGVuKTsJCiAJCS8vQ2FsY3VsYXRlIE1JQwogCQllbW1oMzJfZmluYWwoJmNvbnRleHQtPnNlZWQsIGRpZ2VzdCk7CiAJCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvTWFrZWZpbGUKaW5kZXggZDEyMTQ2OS4uZDcxNmI3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9NYWtlZmlsZQpAQCAtMTEsMyArMTEsNCBAQAogCQlrZXkubwogCiBhdGgtJChDT05GSUdfQVRIX0RFQlVHKSArPSBkZWJ1Zy5vCitjY2ZsYWdzLXkgKz0gLURfX0NIRUNLX0VORElBTl9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoLmgKaW5kZXggMGY5ZWU0NmMuLmVmYzAxMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoLmgKQEAgLTE1Miw2ICsxNTIsNyBAQAogCXN0cnVjdCBhdGhfY3ljbGVfY291bnRlcnMgY2Nfc3VydmV5OwogCiAJc3RydWN0IGF0aF9yZWd1bGF0b3J5IHJlZ3VsYXRvcnk7CisJc3RydWN0IGF0aF9yZWd1bGF0b3J5IHJlZ193b3JsZF9jb3B5OwogCWNvbnN0IHN0cnVjdCBhdGhfb3BzICpvcHM7CiAJY29uc3Qgc3RydWN0IGF0aF9idXNfb3BzICpidXNfb3BzOwogCkBAIC0yMTQsNiArMjE1LDEwIEBACiAgKiBAQVRIX0RCR19IV1RJTUVSOiBoYXJkd2FyZSB0aW1lciBoYW5kbGluZwogICogQEFUSF9EQkdfQlRDT0VYOiBibHVldG9vdGggY29leGlzdGFuY2UKICAqIEBBVEhfREJHX0JTVFVDSzogc3R1Y2sgYmVhY29ucworICogQEFUSF9EQkdfTUNJOiBNZXNzYWdlIENvZXhpc3RlbmNlIEludGVyZmFjZSwgYSBwcml2YXRlIHByb3RvY29sCisgKgl1c2VkIGV4Y2x1c2l2ZWx5IGZvciBXTEFOLUJUIGNvZXhpc3RlbmNlIHN0YXJ0aW5nIGZyb20KKyAqCUFSOTQ2Mi4KKyAqIEBBVEhfREJHX0RGUzogcmFkYXIgZGF0ZWN0aW9uCiAgKiBAQVRIX0RCR19BTlk6IGVuYWJsZSBhbGwgZGVidWdnaW5nCiAgKgogICogVGhlIGRlYnVnIGxldmVsIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgYW1vdW50IGFuZCB0eXBlIG9mIGRlYnVnZ2luZyBvdXRwdXQKQEAgLTIzOSw2ICsyNDQsOCBAQAogCUFUSF9EQkdfQlRDT0VYCQk9IDB4MDAwMDIwMDAsCiAJQVRIX0RCR19XTUkJCT0gMHgwMDAwNDAwMCwKIAlBVEhfREJHX0JTVFVDSwkJPSAweDAwMDA4MDAwLAorCUFUSF9EQkdfTUNJCQk9IDB4MDAwMTAwMDAsCisJQVRIX0RCR19ERlMJCT0gMHgwMDAyMDAwMCwKIAlBVEhfREJHX0FOWQkJPSAweGZmZmZmZmZmCiB9OwogCkBAIC0yNDgsNyArMjU1LDcgQEAKIAogI2RlZmluZSBhdGhfZGJnKGNvbW1vbiwgZGJnX21hc2ssIGZtdCwgLi4uKQkJCQlcCiBkbyB7CQkJCQkJCQkJXAotCWlmICgoY29tbW9uKS0+ZGVidWdfbWFzayAmIGRiZ19tYXNrKQkJCQlcCisJaWYgKChjb21tb24pLT5kZWJ1Z19tYXNrICYgQVRIX0RCR18jI2RiZ19tYXNrKQkJCVwKIAkJX2F0aF9wcmludGsoS0VSTl9ERUJVRywgY29tbW9uLCBmbXQsICMjX19WQV9BUkdTX18pOwlcCiB9IHdoaWxlICgwKQogCkBAIC0yNTgsMTAgKzI2NSwxMyBAQAogI2Vsc2UKIAogc3RhdGljIGlubGluZSAgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAzLCA0KSkpCi12b2lkIGF0aF9kYmcoc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiwgZW51bSBBVEhfREVCVUcgZGJnX21hc2ssCit2b2lkIF9hdGhfZGJnKHN0cnVjdCBhdGhfY29tbW9uICpjb21tb24sIGVudW0gQVRIX0RFQlVHIGRiZ19tYXNrLAogCSAgICAgY29uc3QgY2hhciAqZm10LCAuLi4pCiB7CiB9CisjZGVmaW5lIGF0aF9kYmcoY29tbW9uLCBkYmdfbWFzaywgZm10LCAuLi4pCQkJCVwKKwlfYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfIyNkYmdfbWFzaywgZm10LCAjI19fVkFfQVJHU19fKQorCiAjZGVmaW5lIEFUSF9EQkdfV0FSTihmb28sIGFyZy4uLikgZG8ge30gd2hpbGUgKDApCiAjZGVmaW5lIEFUSF9EQkdfV0FSTl9PTl9PTkNFKGZvbykgKHsJCQkJXAogCWludCBfX3JldF93YXJuX29uY2UgPSAhIShmb28pOwkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYWhiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYWhiLmMKaW5kZXggZTViZTdlNzAuLmVlN2VhNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9haGIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYWhiLmMKQEAgLTE2Niw3ICsxNjYsOSBAQAogCQlpZiAodG9fcGxhdGZvcm1fZGV2aWNlKGFoLT5kZXYpLT5pZCA9PSAwICYmCiAJCSAgICAoYmNmZy0+Y29uZmlnLT5mbGFncyAmIChCRF9XTEFOMCB8IEJEX1dMQU4xKSkgPT0KIAkJICAgICAoQkRfV0xBTjEgfCBCRF9XTEFOMCkpCi0JCQlfX3NldF9iaXQoQVRIX1NUQVRfMkdfRElTQUJMRUQsIGFoLT5zdGF0dXMpOworCQkJYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbmVlZHNfMkdIel9vdnIgPSB0cnVlOworCQllbHNlCisJCQlhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9uZWVkc18yR0h6X292ciA9IGZhbHNlOwogCX0KIAogCXJldCA9IGF0aDVrX2luaXRfYWgoYWgsICZhdGhfYWhiX2J1c19vcHMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5jCmluZGV4IGJlYTkwZTYuLmJmNjc0MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hbmkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmMKQEAgLTI3LDE1ICsyNywyMSBAQAogICogb3IgcmVkdWNpbmcgc2Vuc2l0aXZpdHkgYXMgbmVjZXNzYXJ5LgogICoKICAqIFRoZSBwYXJhbWV0ZXJzIGFyZToKKyAqCiAgKiAgIC0gIm5vaXNlIGltbXVuaXR5IgorICoKICAqICAgLSAic3B1ciBpbW11bml0eSIKKyAqCiAgKiAgIC0gImZpcnN0ZXAgbGV2ZWwiCisgKgogICogICAtICJPRkRNIHdlYWsgc2lnbmFsIGRldGVjdGlvbiIKKyAqCiAgKiAgIC0gIkNDSyB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24iCiAgKgogICogQmFzaWNhbGx5IHdlIGxvb2sgYXQgdGhlIGFtb3VudCBvZiBPREZNIGFuZCBDQ0sgdGltaW5nIGVycm9ycyB3ZSBnZXQgYW5kIHRoZW4KICAqIHJhaXNlIG9yIGxvd2VyIGltbXVuaXR5IGFjY29yZGluZ2x5IGJ5IHNldHRpbmcgb25lIG9yIG1vcmUgb2YgdGhlc2UKICAqIHBhcmFtZXRlcnMuCisgKgogICogTmV3ZXIgY2hpcHNldHMgaGF2ZSBQSFkgZXJyb3IgY291bnRlcnMgaW4gaGFyZHdhcmUgd2hpY2ggd2lsbCBnZW5lcmF0ZSBhIE1JQgogICogaW50ZXJydXB0IHdoZW4gdGhleSBvdmVyZmxvdy4gT2xkZXIgaGFyZHdhcmUgaGFzIHRvbyBlbmFibGUgUEhZIGVycm9yIGZyYW1lcwogICogYnkgc2V0dGluZyBhIFJYIGZsYWcgYW5kIHRoZW4gY291bnQgZXZlcnkgc2luZ2xlIFBIWSBlcnJvci4gV2hlbiBhIHNwZWNpZmllZApAQCAtNDUsMTEgKzUxLDEzIEBACiAgKi8KIAogCi0vKioqIEFOSSBwYXJhbWV0ZXIgY29udHJvbCAqKiovCisvKioqKioqKioqKioqKioqKioqKioqKipcCisqIEFOSSBwYXJhbWV0ZXIgY29udHJvbCAqCitcKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKgogICogYXRoNWtfYW5pX3NldF9ub2lzZV9pbW11bml0eV9sZXZlbCgpIC0gU2V0IG5vaXNlIGltbXVuaXR5IGxldmVsCi0gKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGxldmVsOiBsZXZlbCBiZXR3ZWVuIDAgYW5kIEBBVEg1S19BTklfTUFYX05PSVNFX0lNTV9MVkwKICAqLwogdm9pZApAQCAtOTEsMTIgKzk5LDExIEBACiAJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0FOSSwgIm5ldyBsZXZlbCAlZCIsIGxldmVsKTsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9zZXRfc3B1cl9pbW11bml0eV9sZXZlbCgpIC0gU2V0IHNwdXIgaW1tdW5pdHkgbGV2ZWwKLSAqCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAbGV2ZWw6IGxldmVsIGJldHdlZW4gMCBhbmQgQG1heF9zcHVyX2xldmVsICh0aGUgbWF4aW11bSBsZXZlbCBpcyBkZXBlbmRlbnQKLSAqCW9uIHRoZSBjaGlwIHJldmlzaW9uKS4KKyAqIG9uIHRoZSBjaGlwIHJldmlzaW9uKS4KICAqLwogdm9pZAogYXRoNWtfYW5pX3NldF9zcHVyX2ltbXVuaXR5X2xldmVsKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBsZXZlbCkKQEAgLTExNywxMCArMTI0LDkgQEAKIAlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQU5JLCAibmV3IGxldmVsICVkIiwgbGV2ZWwpOwogfQogCi0KIC8qKgogICogYXRoNWtfYW5pX3NldF9maXJzdGVwX2xldmVsKCkgLSBTZXQgImZpcnN0ZXAiIGxldmVsCi0gKgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGxldmVsOiBsZXZlbCBiZXR3ZWVuIDAgYW5kIEBBVEg1S19BTklfTUFYX0ZJUlNURVBfTFZMCiAgKi8KIHZvaWQKQEAgLTE0MCwxMSArMTQ2LDkgQEAKIAlBVEg1S19EQkdfVU5MSU1JVChhaCwgQVRINUtfREVCVUdfQU5JLCAibmV3IGxldmVsICVkIiwgbGV2ZWwpOwogfQogCi0KIC8qKgotICogYXRoNWtfYW5pX3NldF9vZmRtX3dlYWtfc2lnbmFsX2RldGVjdGlvbigpIC0gQ29udHJvbCBPRkRNIHdlYWsgc2lnbmFsCi0gKgkJCQkJCWRldGVjdGlvbgotICoKKyAqIGF0aDVrX2FuaV9zZXRfb2ZkbV93ZWFrX3NpZ25hbF9kZXRlY3Rpb24oKSAtIFNldCBPRkRNIHdlYWsgc2lnbmFsIGRldGVjdGlvbgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQG9uOiB0dXJuIG9uIG9yIG9mZgogICovCiB2b2lkCkBAIC0xODIsMTAgKzE4Niw5IEBACiAJCQkgIG9uID8gIm9uIiA6ICJvZmYiKTsKIH0KIAotCiAvKioKLSAqIGF0aDVrX2FuaV9zZXRfY2NrX3dlYWtfc2lnbmFsX2RldGVjdGlvbigpIC0gY29udHJvbCBDQ0sgd2VhayBzaWduYWwgZGV0ZWN0aW9uCi0gKgorICogYXRoNWtfYW5pX3NldF9jY2tfd2Vha19zaWduYWxfZGV0ZWN0aW9uKCkgLSBTZXQgQ0NLIHdlYWsgc2lnbmFsIGRldGVjdGlvbgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQG9uOiB0dXJuIG9uIG9yIG9mZgogICovCiB2b2lkCkBAIC0yMDAsMTMgKzIwMywxNiBAQAogfQogCiAKLS8qKiogQU5JIGFsZ29yaXRobSAqKiovCisvKioqKioqKioqKioqKioqXAorKiBBTkkgYWxnb3JpdGhtICoKK1wqKioqKioqKioqKioqKiovCiAKIC8qKgogICogYXRoNWtfYW5pX3JhaXNlX2ltbXVuaXR5KCkgLSBJbmNyZWFzZSBub2lzZSBpbW11bml0eQotICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhczogVGhlICZzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlCiAgKiBAb2ZkbV90cmlnZ2VyOiBJZiB0aGlzIGlzIHRydWUgd2UgYXJlIGNhbGxlZCBiZWNhdXNlIG9mIHRvbyBtYW55IE9GRE0gZXJyb3JzLAotICoJdGhlIGFsZ29yaXRobSB3aWxsIHR1bmUgbW9yZSBwYXJhbWV0ZXJzIHRoZW4uCisgKiB0aGUgYWxnb3JpdGhtIHdpbGwgdHVuZSBtb3JlIHBhcmFtZXRlcnMgdGhlbi4KICAqCiAgKiBUcnkgdG8gcmFpc2Ugbm9pc2UgaW1tdW5pdHkgKD1kZWNyZWFzZSBzZW5zaXRpdml0eSkgaW4gc2V2ZXJhbCBzdGVwcwogICogZGVwZW5kaW5nIG9uIHRoZSBhdmVyYWdlIFJTU0kgb2YgdGhlIGJlYWNvbnMgd2UgcmVjZWl2ZWQuCkBAIC0yOTAsOSArMjk2LDEwIEBACiAJKi8KIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9sb3dlcl9pbW11bml0eSgpIC0gRGVjcmVhc2Ugbm9pc2UgaW1tdW5pdHkKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhczogVGhlICZzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlCiAgKgogICogVHJ5IHRvIGxvd2VyIG5vaXNlIGltbXVuaXR5ICg9aW5jcmVhc2Ugc2Vuc2l0aXZpdHkpIGluIHNldmVyYWwgc3RlcHMKICAqIGRlcGVuZGluZyBvbiB0aGUgYXZlcmFnZSBSU1NJIG9mIHRoZSBiZWFjb25zIHdlIHJlY2VpdmVkLgpAQCAtMzUyLDkgKzM1OSwxMCBAQAogCX0KIH0KIAotCiAvKioKICAqIGF0aDVrX2h3X2FuaV9nZXRfbGlzdGVuX3RpbWUoKSAtIFVwZGF0ZSBjb3VudGVycyBhbmQgcmV0dXJuIGxpc3RlbmluZyB0aW1lCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAYXM6IFRoZSAmc3RydWN0IGF0aDVrX2FuaV9zdGF0ZQogICoKICAqIFJldHVybiBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSB0aW1lIHNwZW50ICJsaXN0ZW5pbmciIGluIG1pbGxpc2Vjb25kcyAobXMpCiAgKiBzaW5jZSB0aGUgbGFzdCBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uCkBAIC0zNzksOSArMzg3LDEwIEBACiAJcmV0dXJuIGxpc3RlbjsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9zYXZlX2FuZF9jbGVhcl9waHlfZXJyb3JzKCkgLSBDbGVhciBhbmQgc2F2ZSBQSFkgZXJyb3IgY291bnRlcnMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBhczogVGhlICZzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlCiAgKgogICogQ2xlYXIgdGhlIFBIWSBlcnJvciBjb3VudGVycyBhcyBzb29uIGFzIHBvc3NpYmxlLCBzaW5jZSB0aGlzIG1pZ2h0IGJlIGNhbGxlZAogICogZnJvbSBhIE1JQiBpbnRlcnJ1cHQgYW5kIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IGdldCBpbnRlcnJ1cHRlZCBhZ2Fpbi4KQEAgLTQyOSwxNCArNDM4LDE0IEBACiAJcmV0dXJuIDE7CiB9CiAKLQogLyoqCiAgKiBhdGg1a19hbmlfcGVyaW9kX3Jlc3RhcnQoKSAtIFJlc3RhcnQgQU5JIHBlcmlvZAorICogQGFzOiBUaGUgJnN0cnVjdCBhdGg1a19hbmlfc3RhdGUKICAqCiAgKiBKdXN0IHJlc2V0IGNvdW50ZXJzLCBzbyB0aGV5IGFyZSBjbGVhciBmb3IgdGhlIG5leHQgImFuaSBwZXJpb2QiLgogICovCiBzdGF0aWMgdm9pZAotYXRoNWtfYW5pX3BlcmlvZF9yZXN0YXJ0KHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzKQorYXRoNWtfYW5pX3BlcmlvZF9yZXN0YXJ0KHN0cnVjdCBhdGg1a19hbmlfc3RhdGUgKmFzKQogewogCS8qIGtlZXAgbGFzdCB2YWx1ZXMgZm9yIGRlYnVnZ2luZyAqLwogCWFzLT5sYXN0X29mZG1fZXJyb3JzID0gYXMtPm9mZG1fZXJyb3JzOwpAQCAtNDQ4LDkgKzQ1Nyw5IEBACiAJYXMtPmxpc3Rlbl90aW1lID0gMDsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9jYWxpYnJhdGlvbigpIC0gVGhlIG1haW4gQU5JIGNhbGlicmF0aW9uIGZ1bmN0aW9uCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogV2UgY291bnQgT0ZETSBhbmQgQ0NLIGVycm9ycyByZWxhdGl2ZSB0byB0aGUgdGltZSB3aGVyZSB3ZSBkaWQgbm90IHNlbmQgb3IKICAqIHJlY2VpdmUgKCJsaXN0ZW4iIHRpbWUpIGFuZCByYWlzZSBvciBsb3dlciBpbW11bml0eSBhY2NvcmRpbmdseS4KQEAgLTQ5Miw3ICs1MDEsNyBAQAogCQkvKiB0b28gbWFueSBQSFkgZXJyb3JzIC0gd2UgaGF2ZSB0byByYWlzZSBpbW11bml0eSAqLwogCQlib29sIG9mZG1fZmxhZyA9IGFzLT5vZmRtX2Vycm9ycyA+IG9mZG1faGlnaCA/IHRydWUgOiBmYWxzZTsKIAkJYXRoNWtfYW5pX3JhaXNlX2ltbXVuaXR5KGFoLCBhcywgb2ZkbV9mbGFnKTsKLQkJYXRoNWtfYW5pX3BlcmlvZF9yZXN0YXJ0KGFoLCBhcyk7CisJCWF0aDVrX2FuaV9wZXJpb2RfcmVzdGFydChhcyk7CiAKIAl9IGVsc2UgaWYgKGFzLT5saXN0ZW5fdGltZSA+IDUgKiBBVEg1S19BTklfTElTVEVOX1BFUklPRCkgewogCQkvKiBJZiBtb3JlIHRoYW4gNSAoVE9ETzogd2h5IDU/KSBwZXJpb2RzIGhhdmUgcGFzc2VkIGFuZCB3ZSBnb3QKQEAgLTUwNCwxNSArNTEzLDE4IEBACiAJCWlmIChhcy0+b2ZkbV9lcnJvcnMgPD0gb2ZkbV9sb3cgJiYgYXMtPmNja19lcnJvcnMgPD0gY2NrX2xvdykKIAkJCWF0aDVrX2FuaV9sb3dlcl9pbW11bml0eShhaCwgYXMpOwogCi0JCWF0aDVrX2FuaV9wZXJpb2RfcmVzdGFydChhaCwgYXMpOworCQlhdGg1a19hbmlfcGVyaW9kX3Jlc3RhcnQoYXMpOwogCX0KIH0KIAogCi0vKioqIElOVEVSUlVQVCBIQU5ETEVSICoqKi8KKy8qKioqKioqKioqKioqKioqKioqXAorKiBJbnRlcnJ1cHQgaGFuZGxlciAqCitcKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCiAgKiBhdGg1a19hbmlfbWliX2ludHIoKSAtIEludGVycnVwdCBoYW5kbGVyIGZvciBBTkkgTUlCIGNvdW50ZXJzCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogSnVzdCByZWFkICYgcmVzZXQgdGhlIHJlZ2lzdGVycyBxdWlja2x5LCBzbyB0aGV5IGRvbid0IGdlbmVyYXRlIG1vcmUKICAqIGludGVycnVwdHMsIHNhdmUgdGhlIGNvdW50ZXJzIGFuZCBzY2hlZHVsZSB0aGUgdGFza2xldCB0byBkZWNpZGUgd2hldGhlcgpAQCAtNTQ5LDkgKzU2MSwxMSBAQAogCQl0YXNrbGV0X3NjaGVkdWxlKCZhaC0+YW5pX3Rhc2tsZXQpOwogfQogCi0KIC8qKgotICogYXRoNWtfYW5pX3BoeV9lcnJvcl9yZXBvcnQoKSAtIFVzZWQgYnkgb2xkZXIgSFcgdG8gcmVwb3J0IFBIWSBlcnJvcnMKKyAqIGF0aDVrX2FuaV9waHlfZXJyb3JfcmVwb3J0IC0gVXNlZCBieSBvbGRlciBIVyB0byByZXBvcnQgUEhZIGVycm9ycworICoKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBwaHllcnI6IE9uZSBvZiBlbnVtIGF0aDVrX3BoeV9lcnJvcl9jb2RlCiAgKgogICogVGhpcyBpcyB1c2VkIGJ5IGhhcmR3YXJlIHdpdGhvdXQgUEhZIGVycm9yIGNvdW50ZXJzIHRvIHJlcG9ydCBQSFkgZXJyb3JzCiAgKiBvbiBhIGZyYW1lLWJ5LWZyYW1lIGJhc2lzLCBpbnN0ZWFkIG9mIHRoZSBpbnRlcnJ1cHQuCkBAIC01NzQsMTAgKzU4OCwxMyBAQAogfQogCiAKLS8qKiogSU5JVCAqKiovCisvKioqKioqKioqKioqKioqKlwKKyogSW5pdGlhbGl6YXRpb24gKgorXCoqKioqKioqKioqKioqKiovCiAKIC8qKgogICogYXRoNWtfZW5hYmxlX3BoeV9lcnJfY291bnRlcnMoKSAtIEVuYWJsZSBQSFkgZXJyb3IgY291bnRlcnMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCiAgKiBFbmFibGUgUEhZIGVycm9yIGNvdW50ZXJzIGZvciBPRkRNIGFuZCBDQ0sgdGltaW5nIGVycm9ycy4KICAqLwpAQCAtNTk2LDkgKzYxMyw5IEBACiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX0NDS19GSUxfQ05UKTsKIH0KIAotCiAvKioKICAqIGF0aDVrX2Rpc2FibGVfcGh5X2Vycl9jb3VudGVycygpIC0gRGlzYWJsZSBQSFkgZXJyb3IgY291bnRlcnMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCiAgKiBEaXNhYmxlIFBIWSBlcnJvciBjb3VudGVycyBmb3IgT0ZETSBhbmQgQ0NLIHRpbWluZyBlcnJvcnMuCiAgKi8KQEAgLTYxNSwxMCArNjMyLDEwIEBACiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAwLCBBUjVLX0NDS19GSUxfQ05UKTsKIH0KIAotCiAvKioKICAqIGF0aDVrX2FuaV9pbml0KCkgLSBJbml0aWFsaXplIEFOSQotICogQG1vZGU6IFdoaWNoIG1vZGUgdG8gdXNlIChhdXRvLCBtYW51YWwgaGlnaCwgbWFudWFsIGxvdywgb2ZmKQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2FuaV9tb2RlCiAgKgogICogSW5pdGlhbGl6ZSBBTkkgYWNjb3JkaW5nIHRvIG1vZGUuCiAgKi8KQEAgLTY5NSwxMCArNzEyLDE4IEBACiB9CiAKIAotLyoqKiBERUJVRyAqKiovCisvKioqKioqKioqKioqKipcCisqIERlYnVnIG91dHB1dCAqCitcKioqKioqKioqKioqKiovCiAKICNpZmRlZiBDT05GSUdfQVRINUtfREVCVUcKIAorLyoqCisgKiBhdGg1a19hbmlfcHJpbnRfY291bnRlcnMoKSAtIFByaW50IEFOSSBjb3VudGVycworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIFVzZWQgZm9yIGRlYnVnZ2luZyBBTkkKKyAqLwogdm9pZAogYXRoNWtfYW5pX3ByaW50X2NvdW50ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYW5pLmgKaW5kZXggNzM1OGI2Yy4uMjFhYTM1NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2FuaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hbmkuaApAQCAtNDAsMTMgKzQwLDEzIEBACiAgKiBlbnVtIGF0aDVrX2FuaV9tb2RlIC0gbW9kZSBmb3IgQU5JIC8gbm9pc2Ugc2Vuc2l0aXZpdHkKICAqCiAgKiBAQVRINUtfQU5JX01PREVfT0ZGOiBUdXJuIEFOSSBvZmYuIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byBqdXN0IHN0b3AgdGhlIEFOSQotICoJYWxnb3JpdGhtIGFmdGVyIGl0IGhhcyBiZWVuIG9uIGF1dG8gbW9kZS4KLSAqIEFUSDVLX0FOSV9NT0RFX01BTlVBTF9MT1c6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBsb3csCi0gKgltYXhpbWl6aW5nIHNlbnNpdGl2aXR5LiBBTkkgd2lsbCBub3QgcnVuLgotICogQVRINUtfQU5JX01PREVfTUFOVUFMX0hJR0g6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBoaWdoLAotICoJbWluaW1pemluZyBzZW5zaXRpdml0eS4gQU5JIHdpbGwgbm90IHJ1bi4KLSAqIEFUSDVLX0FOSV9NT0RFX0FVVE86IEF1dG9tYXRpY2FsbHkgY29udHJvbCBpbW11bml0eSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZQotICoJYW1vdW50IG9mIE9GRE0gYW5kIENDSyBmcmFtZSBlcnJvcnMgKGRlZmF1bHQpLgorICoJCQlhbGdvcml0aG0gYWZ0ZXIgaXQgaGFzIGJlZW4gb24gYXV0byBtb2RlLgorICogQEFUSDVLX0FOSV9NT0RFX01BTlVBTF9MT1c6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBsb3csCisgKgkJCW1heGltaXppbmcgc2Vuc2l0aXZpdHkuIEFOSSB3aWxsIG5vdCBydW4uCisgKiBAQVRINUtfQU5JX01PREVfTUFOVUFMX0hJR0g6IE1hbnVhbGx5IHNldCBhbGwgaW1tdW5pdHkgcGFyYW1ldGVycyB0byBoaWdoLAorICoJCQltaW5pbWl6aW5nIHNlbnNpdGl2aXR5LiBBTkkgd2lsbCBub3QgcnVuLgorICogQEFUSDVLX0FOSV9NT0RFX0FVVE86IEF1dG9tYXRpY2FsbHkgY29udHJvbCBpbW11bml0eSBwYXJhbWV0ZXJzIGJhc2VkIG9uIHRoZQorICoJCQlhbW91bnQgb2YgT0ZETSBhbmQgQ0NLIGZyYW1lIGVycm9ycyAoZGVmYXVsdCkuCiAgKi8KIGVudW0gYXRoNWtfYW5pX21vZGUgewogCUFUSDVLX0FOSV9NT0RFX09GRgkJPSAwLApAQCAtNTgsOCArNTgsMjIgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlIC0gQU5JIHN0YXRlIGFuZCBhc3NvY2lhdGVkIGNvdW50ZXJzCi0gKgotICogQG1heF9zcHVyX2xldmVsOiB0aGUgbWF4aW11bSBzcHVyIGxldmVsIGlzIGNoaXAgZGVwZW5kZW50CisgKiBAYW5pX21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2FuaV9tb2RlCisgKiBAbm9pc2VfaW1tX2xldmVsOiBOb2lzZSBpbW11bml0eSBsZXZlbAorICogQHNwdXJfbGV2ZWw6IFNwdXIgaW1tdW5pdHkgbGV2ZWwKKyAqIEBmaXJzdGVwX2xldmVsOiBGSVJzdGVwIGxldmVsCisgKiBAb2ZkbV93ZWFrX3NpZzogT0ZETSB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24gc3RhdGUgKG9uL29mZikKKyAqIEBjY2tfd2Vha19zaWc6IENDSyB3ZWFrIHNpZ25hbCBkZXRlY3Rpb24gc3RhdGUgKG9uL29mZikKKyAqIEBtYXhfc3B1cl9sZXZlbDogTWF4IHNwdXIgaW1tdW5pdHkgbGV2ZWwgKGNoaXAgc3BlY2lmaWMpCisgKiBAbGlzdGVuX3RpbWU6IExpc3RlbiB0aW1lCisgKiBAb2ZkbV9lcnJvcnM6IE9GRE0gdGltaW5nIGVycm9yIGNvdW50CisgKiBAY2NrX2Vycm9yczogQ0NLIHRpbWluZyBlcnJvciBjb3VudAorICogQGxhc3RfY2M6IFRoZSAmc3RydWN0IGF0aF9jeWNsZV9jb3VudGVycyAoZm9yIHN0YXRzKQorICogQGxhc3RfbGlzdGVuOiBMaXN0ZW4gdGltZSBmcm9tIHByZXZpb3VzIHJ1biAoZm9yIHN0YXRzKQorICogQGxhc3Rfb2ZkbV9lcnJvcnM6IE9GRE0gdGltaW5nIGVycm9yIGNvdW50IGZyb20gcHJldmlvdXMgcnVuIChmb3IgdGF0cykKKyAqIEBsYXN0X2Nja19lcnJvcnM6IENDSyB0aW1pbmcgZXJyb3IgY291bnQgZnJvbSBwcmV2aW91cyBydW4gKGZvciBzdGF0cykKKyAqIEBzdW1fb2ZkbV9lcnJvcnM6IFN1bSBvZiBPRkRNIHRpbWluZyBlcnJvcnMgKGZvciBzdGF0cykKKyAqIEBzdW1fY2NrX2Vycm9yczogU3VtIG9mIGFsbCBDQ0sgdGltaW5nIGVycm9ycyAoZm9yIHN0YXRzKQogICovCiBzdHJ1Y3QgYXRoNWtfYW5pX3N0YXRlIHsKIAllbnVtIGF0aDVrX2FuaV9tb2RlCWFuaV9tb2RlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0aDVrLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaAppbmRleCBmZWNiY2Q5Li5jMmIyNTE4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXRoNWsuaApAQCAtMTg3LDEwICsxODcsOSBAQAogI2RlZmluZSBBUjVLX1RVTkVfTUFYX1RYUE9XRVIJCQk2MwogI2RlZmluZSBBUjVLX1RVTkVfREVGQVVMVF9UWFBPV0VSCQkyNQogI2RlZmluZSBBUjVLX1RVTkVfVFBDX1RYUE9XRVIJCQlmYWxzZQotI2RlZmluZSBBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0ZVTEwgICAgMTAwMDAgICAvKiAxMCBzZWMgKi8KKyNkZWZpbmUgQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9GVUxMICAgIDYwMDAwICAgLyogNjAgc2VjICovCisjZGVmaW5lCUFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfU0hPUlQJMTAwMDAJLyogMTAgc2VjICovCiAjZGVmaW5lIEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfQU5JCTEwMDAJLyogMSBzZWMgKi8KLSNkZWZpbmUgQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9ORgk2MDAwMAkvKiA2MCBzZWMgKi8KLQogI2RlZmluZSBBVEg1S19UWF9DT01QTEVURV9QT0xMX0lOVAkJMzAwMAkvKiAzIHNlYyAqLwogCiAjZGVmaW5lIEFSNUtfSU5JVF9DQVJSX1NFTlNFX0VOCQkJMQpAQCAtMjYyLDE2ICsyNjEsMzQgQEAKICNkZWZpbmUJQVI1S19BR0NfU0VUVExJTkdfVFVSQk8JCQkzNwogCiAKLS8qIEdFTkVSSUMgQ0hJUFNFVCBERUZJTklUSU9OUyAqLwogCi0vKiBNQUMgQ2hpcHMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogR0VORVJJQyBDSElQU0VUIERFRklOSVRJT05TICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqCisgKiBlbnVtIGF0aDVrX3ZlcnNpb24gLSBNQUMgQ2hpcHMKKyAqIEBBUjVLX0FSNTIxMDogQVI1MjEwIChDcmV0ZSkKKyAqIEBBUjVLX0FSNTIxMTogQVI1MjExIChPYWh1L01hdWkpCisgKiBAQVI1S19BUjUyMTI6IEFSNTIxMiAoVmVuaWNlKSBhbmQgbmV3ZXIKKyAqLwogZW51bSBhdGg1a192ZXJzaW9uIHsKIAlBUjVLX0FSNTIxMAk9IDAsCiAJQVI1S19BUjUyMTEJPSAxLAogCUFSNUtfQVI1MjEyCT0gMiwKIH07CiAKLS8qIFBIWSBDaGlwcyAqLworLyoqCisgKiBlbnVtIGF0aDVrX3JhZGlvIC0gUEhZIENoaXBzCisgKiBAQVI1S19SRjUxMTA6IFJGNTExMCAoRmV6KQorICogQEFSNUtfUkY1MTExOiBSRjUxMTEgKFNvbWJyZXJvKQorICogQEFSNUtfUkY1MTEyOiBSRjIxMTIvNTExMihBKSAoRGVyYnkvRGVyYnkyKQorICogQEFSNUtfUkYyNDEzOiBSRjI0MTMvMjQxNCAoR3JpZmZpbi9HcmlmZmluLUxpdGUpCisgKiBAQVI1S19SRjU0MTM6IFJGNTQxMy81NDE0LzU0MjQgKEVhZ2xlL0NvbmRvcikKKyAqIEBBUjVLX1JGMjMxNjogUkYyMzE1LzIzMTYgKENvYnJhIFNvQykKKyAqIEBBUjVLX1JGMjMxNzogUkYyMzE3IChTcGlkZXIgU29DKQorICogQEFSNUtfUkYyNDI1OiBSRjI0MjUvMjQxNyAoU3dhbi9OYWxsYSkKKyAqLwogZW51bSBhdGg1a19yYWRpbyB7CiAJQVI1S19SRjUxMTAJPSAwLAogCUFSNUtfUkY1MTExCT0gMSwKQEAgLTMwMywxMSArMzIwLDExIEBACiAjZGVmaW5lIEFSNUtfU1JFVl9BUjUyMTNBCTB4NTkgLyogSGFpbmFuICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjI0MTMJMHg3OCAvKiBHcmlmZmluIGxpdGUgKi8KICNkZWZpbmUgQVI1S19TUkVWX0FSMjQxNAkweDcwIC8qIEdyaWZmaW4gKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxNV9SNiAweDg2IC8qIEFQNTEtTGlnaHQgKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxNV9SNyAweDg3IC8qIEFQNTEtRnVsbCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE1X1I2CTB4ODYgLyogQVA1MS1MaWdodCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE1X1I3CTB4ODcgLyogQVA1MS1GdWxsICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MjQJMHg5MCAvKiBDb25kb3IgKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxN19SMSAweDkwIC8qIEFQNjEtTGlnaHQgKi8KLSNkZWZpbmUgQVI1S19TUkVWX0FSMjMxN19SMiAweDkxIC8qIEFQNjEtRnVsbCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE3X1IxCTB4OTAgLyogQVA2MS1MaWdodCAqLworI2RlZmluZSBBUjVLX1NSRVZfQVIyMzE3X1IyCTB4OTEgLyogQVA2MS1GdWxsICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MTMJMHhhNCAvKiBFYWdsZSBsaXRlICovCiAjZGVmaW5lIEFSNUtfU1JFVl9BUjU0MTQJMHhhMCAvKiBFYWdsZSAqLwogI2RlZmluZSBBUjVLX1NSRVZfQVIyNDE1CTB4YjAgLyogVGFsb24gKi8KQEAgLTM0NCwzMiArMzYxLDQwIEBACiAKIC8qIFRPRE8gYWRkIHN1cHBvcnQgdG8gbWFjODAyMTEgZm9yIHZlbmRvci1zcGVjaWZpYyByYXRlcyBhbmQgbW9kZXMgKi8KIAotLyoKKy8qKgorICogRE9DOiBBdGhlcm9zIFhSCisgKgogICogU29tZSBvZiB0aGlzIGluZm9ybWF0aW9uIGlzIGJhc2VkIG9uIERvY3VtZW50YXRpb24gZnJvbToKICAqCiAgKiBodHRwOi8vbWFkd2lmaS1wcm9qZWN0Lm9yZy93aWtpL0NoaXBzZXRGZWF0dXJlcy9TdXBlckFHCiAgKgotICogTW9kdWxhdGlvbiBmb3IgQXRoZXJvcycgZVh0ZW5kZWQgUmFuZ2UgLSByYW5nZSBlbmhhbmNpbmcgZXh0ZW5zaW9uIHRoYXQgaXMKLSAqIHN1cHBvc2VkIHRvIGRvdWJsZSB0aGUgZGlzdGFuY2UgYW4gQXRoZXJvcyBjbGllbnQgZGV2aWNlIGNhbiBrZWVwIGEKLSAqIGNvbm5lY3Rpb24gd2l0aCBhbiBBdGhlcm9zIGFjY2VzcyBwb2ludC4gVGhpcyBpcyBhY2hpZXZlZCBieSBpbmNyZWFzaW5nCi0gKiB0aGUgcmVjZWl2ZXIgc2Vuc2l0aXZpdHkgdXAgdG8sIC0xMDVkQm0sIHdoaWNoIGlzIGFib3V0IDIwZEIgYWJvdmUgd2hhdAotICogdGhlIDgwMi4xMSBzcGVjaWZpY2F0aW9ucyBkZW1hbmQuIEluIGFkZGl0aW9uLCBuZXcgKHByb3ByaWV0YXJ5KSBkYXRhIHJhdGVzCi0gKiBhcmUgaW50cm9kdWNlZDogMywgMiwgMSwgMC41IGFuZCAwLjI1IE1CaXQvcy4KKyAqIEF0aGVyb3MnIGVYdGVuZGVkIFJhbmdlIC0gcmFuZ2UgZW5oYW5jaW5nIGV4dGVuc2lvbiBpcyBhIG1vZHVsYXRpb24gc2NoZW1lCisgKiB0aGF0IGlzIHN1cHBvc2VkIHRvIGRvdWJsZSB0aGUgbGluayBkaXN0YW5jZSBiZXR3ZWVuIGFuIEF0aGVyb3MgWFItZW5hYmxlZAorICogY2xpZW50IGRldmljZSB3aXRoIGFuIEF0aGVyb3MgWFItZW5hYmxlZCBhY2Nlc3MgcG9pbnQuIFRoaXMgaXMgYWNoaWV2ZWQKKyAqIGJ5IGluY3JlYXNpbmcgdGhlIHJlY2VpdmVyIHNlbnNpdGl2aXR5IHVwIHRvLCAtMTA1ZEJtLCB3aGljaCBpcyBhYm91dCAyMGRCCisgKiBhYm92ZSB3aGF0IHRoZSA4MDIuMTEgc3BlY2lmaWNhdGlvbnMgZGVtYW5kLiBJbiBhZGRpdGlvbiwgbmV3IChwcm9wcmlldGFyeSkKKyAqIGRhdGEgcmF0ZXMgYXJlIGludHJvZHVjZWQ6IDMsIDIsIDEsIDAuNSBhbmQgMC4yNSBNQml0L3MuCiAgKgogICogUGxlYXNlIG5vdGUgdGhhdCBjYW4geW91IGVpdGhlciB1c2UgWFIgb3IgVFVSQk8gYnV0IHlvdSBjYW5ub3QgdXNlIGJvdGgsCiAgKiB0aGV5IGFyZSBleGNsdXNpdmUuCiAgKgorICogQWxzbyBub3RlIHRoYXQgd2UgZG8gbm90IHBsYW4gdG8gc3VwcG9ydCBYUiBtb2RlIGF0IGxlYXN0IGZvciBub3cuIFlvdSBjYW4KKyAqIGdldCBhIG1vZGUgc2ltaWxhciB0byBYUiBieSB1c2luZyA1TUh6IGJ3bW9kZS4KICAqLwotI2RlZmluZSBNT0RVTEFUSU9OX1hSCQkweDAwMDAwMjAwCi0vKgotICogTW9kdWxhdGlvbiBmb3IgQXRoZXJvcycgVHVyYm8gRyBhbmQgVHVyYm8gQSwgaXRzIHN1cHBvc2VkIHRvIHByb3ZpZGUgYQotICogdGhyb3VnaHB1dCB0cmFuc21pc3Npb24gc3BlZWQgdXAgdG8gNDBNYml0L3MtNjBNYml0L3MgYXQgYSAxMDhNYml0L3MKLSAqIHNpZ25hbGluZyByYXRlIGFjaGlldmVkIHRocm91Z2ggdGhlIGJvbmRpbmcgb2YgdHdvIDU0TWJpdC9zIDgwMi4xMWcKLSAqIGNoYW5uZWxzLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdXIgQWNjZXNzIFBvaW50IG11c3QgYWxzbyBzdXBwb3J0IGl0LgorCisKKy8qKgorICogRE9DOiBBdGhlcm9zIFN1cGVyQUcKKyAqCisgKiBJbiBhZGRpdGlvbiB0byBYUiB3ZSBoYXZlIGFub3RoZXIgbW9kdWxhdGlvbiBzY2hlbWUgY2FsbGVkIFRVUkJPIG1vZGUKKyAqIHRoYXQgaXMgc3VwcG9zZWQgdG8gcHJvdmlkZSBhIHRocm91Z2hwdXQgdHJhbnNtaXNzaW9uIHNwZWVkIHVwIHRvIDQwTWJpdC9zCisgKiAtNjBNYml0L3MgYXQgYSAxMDhNYml0L3Mgc2lnbmFsaW5nIHJhdGUgYWNoaWV2ZWQgdGhyb3VnaCB0aGUgYm9uZGluZyBvZiB0d28KKyAqIDU0TWJpdC9zIDgwMi4xMWcgY2hhbm5lbHMuIFRvIHVzZSB0aGlzIGZlYXR1cmUgYm90aCBlbmRzIG11c3Qgc3VwcG9ydCBpdC4KICAqIFRoZXJlIGlzIGFsc28gYSBkaXN0aW5jdGlvbiBiZXR3ZWVuICJzdGF0aWMiIGFuZCAiZHluYW1pYyIgdHVyYm8gbW9kZXM6CiAgKgogICogLSBTdGF0aWM6IGlzIHRoZSBkdW1iIHZlcnNpb246IGRldmljZXMgc2V0IHRvIHRoaXMgbW9kZSBzdGljayB0byBpdCB1bnRpbAogICogICAgIHRoZSBtb2RlIGlzIHR1cm5lZCBvZmYuCisgKgogICogLSBEeW5hbWljOiBpcyB0aGUgaW50ZWxsaWdlbnQgdmVyc2lvbiwgdGhlIG5ldHdvcmsgZGVjaWRlcyBpdHNlbGYgaWYgaXQKICAqICAgICBpcyBvayB0byB1c2UgdHVyYm8uIEFzIHNvb24gYXMgdHJhZmZpYyBpcyBkZXRlY3RlZCBvbiBhZGphY2VudCBjaGFubmVscwogICogICAgICh3aGljaCB3b3VsZCBnZXQgdXNlZCBpbiB0dXJibyBtb2RlKSwgb3Igd2hlbiBhIG5vbi10dXJibyBzdGF0aW9uIGpvaW5zCkBAIC0zODMsMjQgKzQwOCwzOSBAQAogICoKICAqIGh0dHA6Ly93d3cucGN3b3JsZC5jb20vYXJ0aWNsZS9pZCwxMTM0MjgtcGFnZSwxL2FydGljbGUuaHRtbAogICoKLSAqIFRoZSBjaGFubmVsIGJvbmRpbmcgc2VlbXMgdG8gYmUgZHJpdmVyIHNwZWNpZmljIHRob3VnaC4gSW4gYWRkaXRpb24gdG8KLSAqIGRlY2lkaW5nIHdoYXQgY2hhbm5lbHMgd2lsbCBiZSB1c2VkLCB0aGVzZSAiVHVyYm8iIG1vZGVzIGFyZSBhY2NvbXBsaXNoZWQKLSAqIGJ5IGFsc28gZW5hYmxpbmcgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKyAqIFRoZSBjaGFubmVsIGJvbmRpbmcgc2VlbXMgdG8gYmUgZHJpdmVyIHNwZWNpZmljIHRob3VnaC4KKyAqCisgKiBJbiBhZGRpdGlvbiB0byBUVVJCTyBtb2RlcyB3ZSBhbHNvIGhhdmUgdGhlIGZvbGxvd2luZyBmZWF0dXJlcyBmb3IgZXZlbgorICogZ3JlYXRlciBzcGVlZC11cDoKICAqCiAgKiAtIEJ1cnN0aW5nOiBhbGxvd3MgbXVsdGlwbGUgZnJhbWVzIHRvIGJlIHNlbnQgYXQgb25jZSwgcmF0aGVyIHRoYW4gcGF1c2luZwogICogICAgIGFmdGVyIGVhY2ggZnJhbWUuIEJ1cnN0aW5nIGlzIGEgc3RhbmRhcmRzLWNvbXBsaWFudCBmZWF0dXJlIHRoYXQgY2FuIGJlCiAgKiAgICAgdXNlZCB3aXRoIGFueSBBY2Nlc3MgUG9pbnQuCisgKgogICogLSBGYXN0IGZyYW1lczogaW5jcmVhc2VzIHRoZSBhbW91bnQgb2YgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgc2VudCBwZXIKICAqICAgICBmcmFtZSwgYWxzbyByZXN1bHRpbmcgaW4gYSByZWR1Y3Rpb24gb2YgdHJhbnNtaXNzaW9uIG92ZXJoZWFkLiBJdCBpcyBhCiAgKiAgICAgcHJvcHJpZXRhcnkgZmVhdHVyZSB0aGF0IG5lZWRzIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUgQWNjZXNzIFBvaW50LgorICoKICAqIC0gQ29tcHJlc3Npb246IGRhdGEgZnJhbWVzIGFyZSBjb21wcmVzc2VkIGluIHJlYWwgdGltZSB1c2luZyBhIExlbXBlbCBaaXYKICAqICAgICBhbGdvcml0aG0uIFRoaXMgaXMgZG9uZSB0cmFuc3BhcmVudGx5LiBPbmNlIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLAogICogICAgIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uIHRha2VzIHBsYWNlIGluc2lkZSB0aGUgY2hpcHNldCwgd2l0aG91dAogICogICAgIHB1dHRpbmcgYWRkaXRpb25hbCBsb2FkIG9uIHRoZSBob3N0IENQVS4KICAqCisgKiBBcyB3aXRoIFhSIHdlIGFsc28gZG9uJ3QgcGxhbiB0byBzdXBwb3J0IFN1cGVyQUcgZmVhdHVyZXMgZm9yIG5vdy4gWW91IGNhbgorICogZ2V0IGEgbW9kZSBzaW1pbGFyIHRvIFRVUkJPIGJ5IHVzaW5nIDQwTUh6IGJ3bW9kZS4KICAqLwotI2RlZmluZSBNT0RVTEFUSU9OX1RVUkJPCTB4MDAwMDAwODAKIAorCisvKioKKyAqIGVudW0gYXRoNWtfZHJpdmVyX21vZGUgLSBQSFkgb3BlcmF0aW9uIG1vZGUKKyAqIEBBUjVLX01PREVfMTFBOiA4MDIuMTFhCisgKiBAQVI1S19NT0RFXzExQjogODAyLjExYgorICogQEFSNUtfTU9ERV8xMUc6IDgwMS4xMWcKKyAqIEBBUjVLX01PREVfTUFYOiBVc2VkIGZvciBib3VuZGFyeSBjaGVja3MKKyAqCisgKiBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBoZXJlLCB3ZSB1c2UgdGhlc2UgYXMKKyAqIGFycmF5IGluZGljZXMgYW5kIGl0IGFsc28gbWFwcyBFRVBST00gc3RydWN0dXJlcy4KKyAqLwogZW51bSBhdGg1a19kcml2ZXJfbW9kZSB7CiAJQVI1S19NT0RFXzExQQkJPQkwLAogCUFSNUtfTU9ERV8xMUIJCT0JMSwKQEAgLTQwOCwzMCArNDQ4LDY0IEBACiAJQVI1S19NT0RFX01BWAkJPQkzCiB9OwogCisvKioKKyAqIGVudW0gYXRoNWtfYW50X21vZGUgLSBBbnRlbm5hIG9wZXJhdGlvbiBtb2RlCisgKiBAQVI1S19BTlRNT0RFX0RFRkFVTFQ6IERlZmF1bHQgYW50ZW5uYSBzZXR1cAorICogQEFSNUtfQU5UTU9ERV9GSVhFRF9BOiBPbmx5IGFudGVubmEgQSBpcyBwcmVzZW50CisgKiBAQVI1S19BTlRNT0RFX0ZJWEVEX0I6IE9ubHkgYW50ZW5uYSBCIGlzIHByZXNlbnQKKyAqIEBBUjVLX0FOVE1PREVfU0lOR0xFX0FQOiBTVEEgbG9ja2VkIG9uIGEgc2luZ2xlIGFwCisgKiBAQVI1S19BTlRNT0RFX1NFQ1RPUl9BUDogQVAgd2l0aCB0eCBhbnRlbm5hIHNldCBvbiB0eCBkZXNjCisgKiBAQVI1S19BTlRNT0RFX1NFQ1RPUl9TVEE6IFNUQSB3aXRoIHR4IGFudGVubmEgc2V0IG9uIHR4IGRlc2MKKyAqIEBBUjVLX0FOVE1PREVfREVCVUc6IERlYnVnIG1vZGUgLUEgLT4gUngsIEItPiBUeC0KKyAqIEBBUjVLX0FOVE1PREVfTUFYOiBVc2VkIGZvciBib3VuZGFyeSBjaGVja3MKKyAqCisgKiBGb3IgbW9yZSBpbmZvcyBvbiBhbnRlbm5hIGNvbnRyb2wgY2hlY2sgb3V0IHBoeS5jCisgKi8KIGVudW0gYXRoNWtfYW50X21vZGUgewotCUFSNUtfQU5UTU9ERV9ERUZBVUxUCT0gMCwJLyogZGVmYXVsdCBhbnRlbm5hIHNldHVwICovCi0JQVI1S19BTlRNT0RFX0ZJWEVEX0EJPSAxLAkvKiBvbmx5IGFudGVubmEgQSBpcyBwcmVzZW50ICovCi0JQVI1S19BTlRNT0RFX0ZJWEVEX0IJPSAyLAkvKiBvbmx5IGFudGVubmEgQiBpcyBwcmVzZW50ICovCi0JQVI1S19BTlRNT0RFX1NJTkdMRV9BUAk9IDMsCS8qIHN0YSBsb2NrZWQgb24gYSBzaW5nbGUgYXAgKi8KLQlBUjVLX0FOVE1PREVfU0VDVE9SX0FQCT0gNCwJLyogQVAgd2l0aCB0eCBhbnRlbm5hIHNldCBvbiB0eCBkZXNjICovCi0JQVI1S19BTlRNT0RFX1NFQ1RPUl9TVEEJPSA1LAkvKiBTVEEgd2l0aCB0eCBhbnRlbm5hIHNldCBvbiB0eCBkZXNjICovCi0JQVI1S19BTlRNT0RFX0RFQlVHCT0gNiwJLyogRGVidWcgbW9kZSAtQSAtPiBSeCwgQi0+IFR4LSAqLworCUFSNUtfQU5UTU9ERV9ERUZBVUxUCT0gMCwKKwlBUjVLX0FOVE1PREVfRklYRURfQQk9IDEsCisJQVI1S19BTlRNT0RFX0ZJWEVEX0IJPSAyLAorCUFSNUtfQU5UTU9ERV9TSU5HTEVfQVAJPSAzLAorCUFSNUtfQU5UTU9ERV9TRUNUT1JfQVAJPSA0LAorCUFSNUtfQU5UTU9ERV9TRUNUT1JfU1RBCT0gNSwKKwlBUjVLX0FOVE1PREVfREVCVUcJPSA2LAogCUFSNUtfQU5UTU9ERV9NQVgsCiB9OwogCisvKioKKyAqIGVudW0gYXRoNWtfYndfbW9kZSAtIEJhbmR3aWR0aCBvcGVyYXRpb24gbW9kZQorICogQEFSNUtfQldNT0RFX0RFRkFVTFQ6IDIwTUh6LCBkZWZhdWx0IG9wZXJhdGlvbgorICogQEFSNUtfQldNT0RFXzVNSFo6IFF1YXJ0ZXIgcmF0ZQorICogQEFSNUtfQldNT0RFXzEwTUhaOiBIYWxmIHJhdGUKKyAqIEBBUjVLX0JXTU9ERV80ME1IWjogVHVyYm8KKyAqLwogZW51bSBhdGg1a19id19tb2RlIHsKLQlBUjVLX0JXTU9ERV9ERUZBVUxUCT0gMCwJLyogMjBNSHosIGRlZmF1bHQgb3BlcmF0aW9uICovCi0JQVI1S19CV01PREVfNU1IWgk9IDEsCS8qIFF1YXJ0ZXIgcmF0ZSAqLwotCUFSNUtfQldNT0RFXzEwTUhaCT0gMiwJLyogSGFsZiByYXRlICovCi0JQVI1S19CV01PREVfNDBNSFoJPSAzCS8qIFR1cmJvICovCisJQVI1S19CV01PREVfREVGQVVMVAk9IDAsCisJQVI1S19CV01PREVfNU1IWgk9IDEsCisJQVI1S19CV01PREVfMTBNSFoJPSAyLAorCUFSNUtfQldNT0RFXzQwTUhaCT0gMwogfTsKIAorCisKIC8qKioqKioqKioqKioqKioqXAogICBUWCBERUZJTklUSU9OUwogXCoqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBUWCBTdGF0dXMgZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfdHhfc3RhdHVzIC0gVFggU3RhdHVzIGRlc2NyaXB0b3IKKyAqIEB0c19zZXFudW06IFNlcXVlbmNlIG51bWJlcgorICogQHRzX3RzdGFtcDogVGltZXN0YW1wCisgKiBAdHNfc3RhdHVzOiBTdGF0dXMgY29kZQorICogQHRzX2ZpbmFsX2lkeDogRmluYWwgdHJhbnNtaXNzaW9uIHNlcmllcyBpbmRleAorICogQHRzX2ZpbmFsX3JldHJ5OiBGaW5hbCByZXRyeSBjb3VudAorICogQHRzX3Jzc2k6IFJTU0kgZm9yIHJlY2VpdmVkIEFDSworICogQHRzX3Nob3J0cmV0cnk6IFNob3J0IHJldHJ5IGNvdW50CisgKiBAdHNfdmlydGNvbDogVmlydHVhbCBjb2xsaXNpb24gY291bnQKKyAqIEB0c19hbnRlbm5hOiBBbnRlbm5hIHVzZWQKKyAqCisgKiBUWCBzdGF0dXMgZGVzY3JpcHRvciBnZXRzIGZpbGxlZCBieSB0aGUgaHcKKyAqIG9uIGVhY2ggdHJhbnNtaXNzaW9uIGF0dGVtcHQuCiAgKi8KIHN0cnVjdCBhdGg1a190eF9zdGF0dXMgewogCXUxNgl0c19zZXFudW07CkBAIC00NTQsNyArNTI4LDYgQEAKICAqIGVudW0gYXRoNWtfdHhfcXVldWUgLSBRdWV1ZSB0eXBlcyB1c2VkIHRvIGNsYXNzaWZ5IHR4IHF1ZXVlcy4KICAqIEBBUjVLX1RYX1FVRVVFX0lOQUNUSVZFOiBxIGlzIHVudXNlZCAtLSBzZWUgYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZQogICogQEFSNUtfVFhfUVVFVUVfREFUQTogQSBub3JtYWwgZGF0YSBxdWV1ZQotICogQEFSNUtfVFhfUVVFVUVfWFJfREFUQTogQW4gWFItZGF0YSBxdWV1ZQogICogQEFSNUtfVFhfUVVFVUVfQkVBQ09OOiBUaGUgYmVhY29uIHF1ZXVlCiAgKiBAQVI1S19UWF9RVUVVRV9DQUI6IFRoZSBhZnRlci1iZWFjb24gcXVldWUKICAqIEBBUjVLX1RYX1FVRVVFX1VBUFNEOiBVbnNjaGVkdWxlZCBBdXRvbWF0aWMgUG93ZXIgU2F2ZSBEZWxpdmVyeSBxdWV1ZQpAQCAtNDYyLDcgKzUzNSw2IEBACiBlbnVtIGF0aDVrX3R4X3F1ZXVlIHsKIAlBUjVLX1RYX1FVRVVFX0lOQUNUSVZFID0gMCwKIAlBUjVLX1RYX1FVRVVFX0RBVEEsCi0JQVI1S19UWF9RVUVVRV9YUl9EQVRBLAogCUFSNUtfVFhfUVVFVUVfQkVBQ09OLAogCUFSNUtfVFhfUVVFVUVfQ0FCLAogCUFSNUtfVFhfUVVFVUVfVUFQU0QsCkBAIC00NzEsMzYgKzU0Myw0NiBAQAogI2RlZmluZQlBUjVLX05VTV9UWF9RVUVVRVMJCTEwCiAjZGVmaW5lCUFSNUtfTlVNX1RYX1FVRVVFU19OT1FDVQkyCiAKLS8qCi0gKiBRdWV1ZSBzeWItdHlwZXMgdG8gY2xhc3NpZnkgbm9ybWFsIGRhdGEgcXVldWVzLgorLyoqCisgKiBlbnVtIGF0aDVrX3R4X3F1ZXVlX3N1YnR5cGUgLSBRdWV1ZSBzdWItdHlwZXMgdG8gY2xhc3NpZnkgbm9ybWFsIGRhdGEgcXVldWVzCisgKiBAQVI1S19XTUVfQUNfQks6IEJhY2tncm91bmQgdHJhZmZpYworICogQEFSNUtfV01FX0FDX0JFOiBCZXN0LWVmZm9ydCAobm9ybWFsKSB0cmFmZmljCisgKiBAQVI1S19XTUVfQUNfVkk6IFZpZGVvIHRyYWZmaWMKKyAqIEBBUjVLX1dNRV9BQ19WTzogVm9pY2UgdHJhZmZpYworICoKICAqIFRoZXNlIGFyZSB0aGUgNCBBY2Nlc3MgQ2F0ZWdvcmllcyBhcyBkZWZpbmVkIGluCiAgKiBXTUUgc3BlYy4gMCBpcyB0aGUgbG93ZXN0IHByaW9yaXR5IGFuZCA0IGlzIHRoZQogICogaGlnaGVzdC4gTm9ybWFsIGRhdGEgdGhhdCBoYXNuJ3QgYmVlbiBjbGFzc2lmaWVkCiAgKiBnb2VzIHRvIHRoZSBCZXN0IEVmZm9ydCBBQy4KICAqLwogZW51bSBhdGg1a190eF9xdWV1ZV9zdWJ0eXBlIHsKLQlBUjVLX1dNRV9BQ19CSyA9IDAsCS8qQmFja2dyb3VuZCB0cmFmZmljKi8KLQlBUjVLX1dNRV9BQ19CRSwJCS8qQmVzdC1lZmZvcnQgKG5vcm1hbCkgdHJhZmZpYyovCi0JQVI1S19XTUVfQUNfVkksCQkvKlZpZGVvIHRyYWZmaWMqLwotCUFSNUtfV01FX0FDX1ZPLAkJLypWb2ljZSB0cmFmZmljKi8KKwlBUjVLX1dNRV9BQ19CSyA9IDAsCisJQVI1S19XTUVfQUNfQkUsCisJQVI1S19XTUVfQUNfVkksCisJQVI1S19XTUVfQUNfVk8sCiB9OwogCi0vKgotICogUXVldWUgSUQgbnVtYmVycyBhcyByZXR1cm5lZCBieSB0aGUgaHcgZnVuY3Rpb25zLCBlYWNoIG51bWJlcgotICogcmVwcmVzZW50cyBhIGh3IHF1ZXVlLiBJZiBodyBkb2VzIG5vdCBzdXBwb3J0IGh3IHF1ZXVlcwotICogKGVnIDUyMTApIGFsbCBkYXRhIGdvZXMgaW4gb25lIHF1ZXVlLiBUaGVzZSBtYXRjaAotICogZDgwMjExIGRlZmluaXRpb25zIChuZXQ4MDIxMS9NYWRXaUZpIGRvbid0IHVzZSB0aGVtKS4KKy8qKgorICogZW51bSBhdGg1a190eF9xdWV1ZV9pZCAtIFF1ZXVlIElEIG51bWJlcnMgYXMgcmV0dXJuZWQgYnkgdGhlIGh3IGZ1bmN0aW9ucworICogQEFSNUtfVFhfUVVFVUVfSURfTk9RQ1VfREFUQTogRGF0YSBxdWV1ZSBvbiBBUjUyMTAgKG5vIFFDVSBhdmFpbGFibGUpCisgKiBAQVI1S19UWF9RVUVVRV9JRF9OT1FDVV9CRUFDT046IEJlYWNvbiBxdWV1ZSBvbiBBUjUyMTAgKG5vIFFDVSBhdmFpbGFibGUpCisgKiBAQVI1S19UWF9RVUVVRV9JRF9EQVRBX01JTjogRGF0YSBxdWV1ZSBtaW4gaW5kZXgKKyAqIEBBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUFYOiBEYXRhIHF1ZXVlIG1heCBpbmRleAorICogQEFSNUtfVFhfUVVFVUVfSURfQ0FCOiBDb250ZW50IGFmdGVyIGJlYWNvbiBxdWV1ZQorICogQEFSNUtfVFhfUVVFVUVfSURfQkVBQ09OOiBCZWFjb24gcXVldWUKKyAqIEBBUjVLX1RYX1FVRVVFX0lEX1VBUFNEOiBVcmdlbnQgQXV0b21hdGljIFBvd2VyIFNhdmUgRGVsaXZlcnksCisgKgorICogRWFjaCBudW1iZXIgcmVwcmVzZW50cyBhIGh3IHF1ZXVlLiBJZiBodyBkb2VzIG5vdCBzdXBwb3J0IGh3IHF1ZXVlcworICogKGVnIDUyMTApIGFsbCBkYXRhIGdvZXMgaW4gb25lIHF1ZXVlLgogICovCiBlbnVtIGF0aDVrX3R4X3F1ZXVlX2lkIHsKIAlBUjVLX1RYX1FVRVVFX0lEX05PUUNVX0RBVEEJPSAwLAogCUFSNUtfVFhfUVVFVUVfSURfTk9RQ1VfQkVBQ09OCT0gMSwKLQlBUjVLX1RYX1FVRVVFX0lEX0RBVEFfTUlOCT0gMCwgLypJRUVFODAyMTFfVFhfUVVFVUVfREFUQTAqLwotCUFSNUtfVFhfUVVFVUVfSURfREFUQV9NQVgJPSAzLCAvKklFRUU4MDIxMV9UWF9RVUVVRV9EQVRBMyovCi0JQVI1S19UWF9RVUVVRV9JRF9EQVRBX1NWUAk9IDUsIC8qSUVFRTgwMjExX1RYX1FVRVVFX1NWUCAtIFNwZWN0cmFsaW5rIFZvaWNlIFByb3RvY29sKi8KLQlBUjVLX1RYX1FVRVVFX0lEX0NBQgkJPSA2LCAvKklFRUU4MDIxMV9UWF9RVUVVRV9BRlRFUl9CRUFDT04qLwotCUFSNUtfVFhfUVVFVUVfSURfQkVBQ09OCQk9IDcsIC8qSUVFRTgwMjExX1RYX1FVRVVFX0JFQUNPTiovCi0JQVI1S19UWF9RVUVVRV9JRF9VQVBTRAkJPSA4LAotCUFSNUtfVFhfUVVFVUVfSURfWFJfREFUQQk9IDksCisJQVI1S19UWF9RVUVVRV9JRF9EQVRBX01JTgk9IDAsCisJQVI1S19UWF9RVUVVRV9JRF9EQVRBX01BWAk9IDMsCisJQVI1S19UWF9RVUVVRV9JRF9VQVBTRAkJPSA3LAorCUFSNUtfVFhfUVVFVUVfSURfQ0FCCQk9IDgsCisJQVI1S19UWF9RVUVVRV9JRF9CRUFDT04JCT0gOSwKIH07CiAKIC8qCkBAIC01MjEsNDYgKzYwMyw3MCBAQAogI2RlZmluZSBBUjVLX1RYUV9GTEFHX1BPU1RfRlJfQktPRkZfRElTCQkweDEwMDAJLyogRGlzYWJsZSBiYWNrb2ZmIHdoaWxlIGJ1cnN0aW5nICovCiAjZGVmaW5lIEFSNUtfVFhRX0ZMQUdfQ09NUFJFU1NJT05fRU5BQkxFCTB4MjAwMAkvKiBFbmFibGUgaHcgY29tcHJlc3Npb24gLW5vdCBpbXBsZW1lbnRlZC0qLwogCi0vKgotICogRGF0YSB0cmFuc21pdCBxdWV1ZSBzdGF0ZS4gIE9uZSBvZiB0aGVzZSBleGlzdHMgZm9yIGVhY2gKLSAqIGhhcmR3YXJlIHRyYW5zbWl0IHF1ZXVlLiAgUGFja2V0cyBzZW50IHRvIHVzIGZyb20gYWJvdmUKLSAqIGFyZSBhc3NpZ25lZCB0byBxdWV1ZXMgYmFzZWQgb24gdGhlaXIgcHJpb3JpdHkuICBOb3QgYWxsCi0gKiBkZXZpY2VzIHN1cHBvcnQgYSBjb21wbGV0ZSBzZXQgb2YgaGFyZHdhcmUgdHJhbnNtaXQgcXVldWVzLgotICogRm9yIHRob3NlIGRldmljZXMgdGhlIGFycmF5IHNjX2FjMnEgd2lsbCBtYXAgbXVsdGlwbGUKLSAqIHByaW9yaXRpZXMgdG8gZmV3ZXIgaGFyZHdhcmUgcXVldWVzICh0eXBpY2FsbHkgYWxsIHRvIG9uZQotICogaGFyZHdhcmUgcXVldWUpLgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfdHhxIC0gVHJhbnNtaXQgcXVldWUgc3RhdGUKKyAqIEBxbnVtOiBIYXJkd2FyZSBxIG51bWJlcgorICogQGxpbms6IExpbmsgcHRyIGluIGxhc3QgVFggZGVzYworICogQHE6IFRyYW5zbWl0IHF1ZXVlICgmc3RydWN0IGxpc3RfaGVhZCkKKyAqIEBsb2NrOiBMb2NrIG9uIHEgYW5kIGxpbmsKKyAqIEBzZXR1cDogSXMgdGhlIHF1ZXVlIGNvbmZpZ3VyZWQKKyAqIEB0eHFfbGVuOk51bWJlciBvZiBxdWV1ZWQgYnVmZmVycworICogQHR4cV9tYXg6IE1heCBhbGxvd2VkIG51bSBvZiBxdWV1ZWQgYnVmZmVycworICogQHR4cV9wb2xsX21hcms6IFVzZWQgdG8gY2hlY2sgaWYgcXVldWUgZ290IHN0dWNrCisgKiBAdHhxX3N0dWNrOiBRdWV1ZSBzdHVjayBjb3VudGVyCisgKgorICogT25lIG9mIHRoZXNlIGV4aXN0cyBmb3IgZWFjaCBoYXJkd2FyZSB0cmFuc21pdCBxdWV1ZS4KKyAqIFBhY2tldHMgc2VudCB0byB1cyBmcm9tIGFib3ZlIGFyZSBhc3NpZ25lZCB0byBxdWV1ZXMgYmFzZWQKKyAqIG9uIHRoZWlyIHByaW9yaXR5LiAgTm90IGFsbCBkZXZpY2VzIHN1cHBvcnQgYSBjb21wbGV0ZSBzZXQKKyAqIG9mIGhhcmR3YXJlIHRyYW5zbWl0IHF1ZXVlcy4gRm9yIHRob3NlIGRldmljZXMgdGhlIGFycmF5CisgKiBzY19hYzJxIHdpbGwgbWFwIG11bHRpcGxlIHByaW9yaXRpZXMgdG8gZmV3ZXIgaGFyZHdhcmUgcXVldWVzCisgKiAodHlwaWNhbGx5IGFsbCB0byBvbmUgaGFyZHdhcmUgcXVldWUpLgogICovCiBzdHJ1Y3QgYXRoNWtfdHhxIHsKLQl1bnNpZ25lZCBpbnQJCXFudW07CS8qIGhhcmR3YXJlIHEgbnVtYmVyICovCi0JdTMyCQkJKmxpbms7CS8qIGxpbmsgcHRyIGluIGxhc3QgVFggZGVzYyAqLwotCXN0cnVjdCBsaXN0X2hlYWQJcTsJLyogdHJhbnNtaXQgcXVldWUgKi8KLQlzcGlubG9ja190CQlsb2NrOwkvKiBsb2NrIG9uIHEgYW5kIGxpbmsgKi8KKwl1bnNpZ25lZCBpbnQJCXFudW07CisJdTMyCQkJKmxpbms7CisJc3RydWN0IGxpc3RfaGVhZAlxOworCXNwaW5sb2NrX3QJCWxvY2s7CiAJYm9vbAkJCXNldHVwOwotCWludAkJCXR4cV9sZW47IC8qIG51bWJlciBvZiBxdWV1ZWQgYnVmZmVycyAqLwotCWludAkJCXR4cV9tYXg7IC8qIG1heCBhbGxvd2VkIG51bSBvZiBxdWV1ZWQgYnVmZmVycyAqLworCWludAkJCXR4cV9sZW47CisJaW50CQkJdHhxX21heDsKIAlib29sCQkJdHhxX3BvbGxfbWFyazsKLQl1bnNpZ25lZCBpbnQJCXR4cV9zdHVjazsJLyogaW5mb3JtYXRpb25hbCBjb3VudGVyICovCisJdW5zaWduZWQgaW50CQl0eHFfc3R1Y2s7CiB9OwogCi0vKgotICogQSBzdHJ1Y3QgdG8gaG9sZCB0eCBxdWV1ZSdzIHBhcmFtZXRlcnMKKy8qKgorICogc3RydWN0IGF0aDVrX3R4cV9pbmZvIC0gQSBzdHJ1Y3QgdG8gaG9sZCBUWCBxdWV1ZSdzIHBhcmFtZXRlcnMKKyAqIEB0cWlfdHlwZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWUKKyAqIEB0cWlfc3VidHlwZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWVfc3VidHlwZQorICogQHRxaV9mbGFnczogVFggcXVldWUgZmxhZ3MgKHNlZSBhYm92ZSkKKyAqIEB0cWlfYWlmczogQXJiaXRyYXRlZCBJbnRlci1mcmFtZSBTcGFjZQorICogQHRxaV9jd19taW46IE1pbmltdW0gQ29udGVudGlvbiBXaW5kb3cKKyAqIEB0cWlfY3dfbWF4OiBNYXhpbXVtIENvbnRlbnRpb24gV2luZG93CisgKiBAdHFpX2Nicl9wZXJpb2Q6IENvbnN0YW50IGJpdCByYXRlIHBlcmlvZAorICogQHRxaV9yZWFkeV90aW1lOiBUaW1lIHF1ZXVlIHdhaXRzIGFmdGVyIGFuIGV2ZW50IHdoZW4gUkRZVElNRSBpcyBlbmFibGVkCiAgKi8KIHN0cnVjdCBhdGg1a190eHFfaW5mbyB7CiAJZW51bSBhdGg1a190eF9xdWV1ZSB0cWlfdHlwZTsKIAllbnVtIGF0aDVrX3R4X3F1ZXVlX3N1YnR5cGUgdHFpX3N1YnR5cGU7Ci0JdTE2CXRxaV9mbGFnczsJLyogVHggcXVldWUgZmxhZ3MgKHNlZSBhYm92ZSkgKi8KLQl1OAl0cWlfYWlmczsJLyogQXJiaXRyYXRlZCBJbnRlcmZyYW1lIFNwYWNlICovCi0JdTE2CXRxaV9jd19taW47CS8qIE1pbmltdW0gQ29udGVudGlvbiBXaW5kb3cgKi8KLQl1MTYJdHFpX2N3X21heDsJLyogTWF4aW11bSBDb250ZW50aW9uIFdpbmRvdyAqLwotCXUzMgl0cWlfY2JyX3BlcmlvZDsgLyogQ29uc3RhbnQgYml0IHJhdGUgcGVyaW9kICovCisJdTE2CXRxaV9mbGFnczsKKwl1OAl0cWlfYWlmczsKKwl1MTYJdHFpX2N3X21pbjsKKwl1MTYJdHFpX2N3X21heDsKKwl1MzIJdHFpX2Nicl9wZXJpb2Q7CiAJdTMyCXRxaV9jYnJfb3ZlcmZsb3dfbGltaXQ7CiAJdTMyCXRxaV9idXJzdF90aW1lOwotCXUzMgl0cWlfcmVhZHlfdGltZTsgLyogVGltZSBxdWV1ZSB3YWl0cyBhZnRlciBhbiBldmVudCAqLworCXUzMgl0cWlfcmVhZHlfdGltZTsKIH07CiAKLS8qCi0gKiBUcmFuc21pdCBwYWNrZXQgdHlwZXMuCi0gKiB1c2VkIG9uIHR4IGNvbnRyb2wgZGVzY3JpcHRvcgorLyoqCisgKiBlbnVtIGF0aDVrX3BrdF90eXBlIC0gVHJhbnNtaXQgcGFja2V0IHR5cGVzCisgKiBAQVI1S19QS1RfVFlQRV9OT1JNQUw6IE5vcm1hbCBkYXRhCisgKiBAQVI1S19QS1RfVFlQRV9BVElNOiBBVElNCisgKiBAQVI1S19QS1RfVFlQRV9QU1BPTEw6IFBTLVBvbGwKKyAqIEBBUjVLX1BLVF9UWVBFX0JFQUNPTjogQmVhY29uCisgKiBAQVI1S19QS1RfVFlQRV9QUk9CRV9SRVNQOiBQcm9iZSByZXNwb25zZQorICogQEFSNUtfUEtUX1RZUEVfUElGUzogUElGUworICogVXNlZCBvbiB0eCBjb250cm9sIGRlc2NyaXB0b3IKICAqLwogZW51bSBhdGg1a19wa3RfdHlwZSB7CiAJQVI1S19QS1RfVFlQRV9OT1JNQUwJCT0gMCwKQEAgLTU4MywyNyArNjg5LDIzIEBACiAJKGFoLT5haF90eHBvd2VyLnR4cF9yYXRlc19wb3dlcl90YWJsZVsoX3IpXSAmIDB4M2YpIDw8IChfdikJXAogKQogCi0vKgotICogRE1BIHNpemUgZGVmaW5pdGlvbnMgKDJeKG4rMikpCi0gKi8KLWVudW0gYXRoNWtfZG1hc2l6ZSB7Ci0JQVI1S19ETUFTSVpFXzRCCT0gMCwKLQlBUjVLX0RNQVNJWkVfOEIsCi0JQVI1S19ETUFTSVpFXzE2QiwKLQlBUjVLX0RNQVNJWkVfMzJCLAotCUFSNUtfRE1BU0laRV82NEIsCi0JQVI1S19ETUFTSVpFXzEyOEIsCi0JQVI1S19ETUFTSVpFXzI1NkIsCi0JQVI1S19ETUFTSVpFXzUxMkIKLX07CiAKIAogLyoqKioqKioqKioqKioqKipcCiAgIFJYIERFRklOSVRJT05TCiBcKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIFJYIFN0YXR1cyBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgLSBSWCBTdGF0dXMgZGVzY3JpcHRvcgorICogQHJzX2RhdGFsZW46IERhdGEgbGVuZ3RoCisgKiBAcnNfdHN0YW1wOiBUaW1lc3RhbXAKKyAqIEByc19zdGF0dXM6IFN0YXR1cyBjb2RlCisgKiBAcnNfcGh5ZXJyOiBQSFkgZXJyb3IgbWFzaworICogQHJzX3Jzc2k6IFJTU0kgaW4gMC41ZGJtIHVuaXRzCisgKiBAcnNfa2V5aXg6IEluZGV4IHRvIHRoZSBrZXkgdXNlZCBmb3IgZGVjcnlwdGluZworICogQHJzX3JhdGU6IFJhdGUgdXNlZCB0byBkZWNvZGUgdGhlIGZyYW1lCisgKiBAcnNfYW50ZW5uYTogQW50ZW5uYSB1c2VkIHRvIHJlY2VpdmUgdGhlIGZyYW1lCisgKiBAcnNfbW9yZTogSW5kaWNhdGVzIHRoaXMgaXMgYSBmcmFtZSBmcmFnbWVudCAoRmFzdCBmcmFtZXMpCiAgKi8KIHN0cnVjdCBhdGg1a19yeF9zdGF0dXMgewogCXUxNglyc19kYXRhbGVuOwpAQCAtNjQ1LDEwICs3NDcsMTggQEAKICNkZWZpbmUgVFNGX1RPX1RVKF90c2YpICh1MzIpKChfdHNmKSA+PiAxMCkKIAogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAogICBHQUlOIE9QVElNSVpBVElPTiBERUZJTklUSU9OUwogXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qKgorICogZW51bSBhdGg1a19yZmdhaW4gLSBSRiBHYWluIG9wdGltaXphdGlvbiBlbmdpbmUgc3RhdGUKKyAqIEBBUjVLX1JGR0FJTl9JTkFDVElWRTogRW5naW5lIGRpc2FibGVkCisgKiBAQVI1S19SRkdBSU5fQUNUSVZFOiBQcm9iZSBhY3RpdmUKKyAqIEBBUjVLX1JGR0FJTl9SRUFEX1JFUVVFU1RFRDogUHJvYmUgcmVxdWVzdGVkCisgKiBAQVI1S19SRkdBSU5fTkVFRF9DSEFOR0U6IEdhaW5fRiBuZWVkcyBjaGFuZ2UKKyAqLwogZW51bSBhdGg1a19yZmdhaW4gewogCUFSNUtfUkZHQUlOX0lOQUNUSVZFID0gMCwKIAlBUjVLX1JGR0FJTl9BQ1RJVkUsCkBAIC02NTYsNiArNzY2LDE2IEBACiAJQVI1S19SRkdBSU5fTkVFRF9DSEFOR0UsCiB9OwogCisvKioKKyAqIHN0cnVjdCBhdGg1a19nYWluIC0gUkYgR2FpbiBvcHRpbWl6YXRpb24gZW5naW5lIHN0YXRlIGRhdGEKKyAqIEBnX3N0ZXBfaWR4OiBDdXJyZW50IHN0ZXAgaW5kZXgKKyAqIEBnX2N1cnJlbnQ6IEN1cnJlbnQgZ2FpbgorICogQGdfdGFyZ2V0OiBUYXJnZXQgZ2FpbgorICogQGdfbG93OiBMb3cgZ2FpbiBib3VuZGFyeQorICogQGdfaGlnaDogSGlnaCBnYWluIGJvdW5kYXJ5CisgKiBAZ19mX2NvcnI6IEdhaW5fRiBjb3JyZWN0aW9uCisgKiBAZ19zdGF0ZTogT25lIG9mIGVudW0gYXRoNWtfcmZnYWluCisgKi8KIHN0cnVjdCBhdGg1a19nYWluIHsKIAl1OAkJCWdfc3RlcF9pZHg7CiAJdTgJCQlnX2N1cnJlbnQ7CkBAIC02NjYsNiArNzg2LDggQEAKIAl1OAkJCWdfc3RhdGU7CiB9OwogCisKKwogLyoqKioqKioqKioqKioqKioqKioqXAogICBDT01NT04gREVGSU5JVElPTlMKIFwqKioqKioqKioqKioqKioqKioqKi8KQEAgLTY3NCw5ICs3OTYsMTQgQEAKICNkZWZpbmUgQVI1S19TTE9UX1RJTUVfMjAJODgwCiAjZGVmaW5lIEFSNUtfU0xPVF9USU1FX01BWAkweGZmZmYKIAotLyoKLSAqIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGlzIHVzZWQgdG8gbWFwIDJHSHogY2hhbm5lbHMgdG8KLSAqIDVHSHogQXRoZXJvcyBjaGFubmVscy4KKy8qKgorICogc3RydWN0IGF0aDVrX2F0aGNoYW5fMmdoeiAtIDJHSHogdG8gNUdIWiBtYXAgZm9yIFJGNTExMQorICogQGEyX2ZsYWdzOiBDaGFubmVsIGZsYWdzIChpbnRlcm5hbCkKKyAqIEBhMl9hdGhjaGFuOiBIVyBjaGFubmVsIG51bWJlciAoaW50ZXJuYWwpCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYXAgMkdIeiBjaGFubmVscyB0bworICogNUdIeiBBdGhlcm9zIGNoYW5uZWxzIG9uIDIxMTEgZnJlcXVlbmN5IGNvbnZlcnRlcgorICogdGhhdCBjb21lcyB0b2dldGhlciB3aXRoIFJGNTExMQogICogVE9ETzogQ2xlYW4gdXAKICAqLwogc3RydWN0IGF0aDVrX2F0aGNoYW5fMmdoeiB7CkBAIC02ODQsMzYgKzgxMSw4MCBAQAogCXUxNglhMl9hdGhjaGFuOwogfTsKIAorLyoqCisgKiBlbnVtIGF0aDVrX2RtYXNpemUgLSAgRE1BIHNpemUgZGVmaW5pdGlvbnMgKDJeKG4rMikpCisgKiBAQVI1S19ETUFTSVpFXzRCOiA0Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfOEI6IDhCeXRlcworICogQEFSNUtfRE1BU0laRV8xNkI6IDE2Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfMzJCOiAzMkJ5dGVzCisgKiBAQVI1S19ETUFTSVpFXzY0QjogNjRCeXRlcyAoRGVmYXVsdCkKKyAqIEBBUjVLX0RNQVNJWkVfMTI4QjogMTI4Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfMjU2QjogMjU2Qnl0ZXMKKyAqIEBBUjVLX0RNQVNJWkVfNTEyQjogNTEyQnl0ZXMKKyAqCisgKiBUaGVzZSBhcmUgdXNlZCB0byBzZXQgRE1BIGJ1cnN0IHNpemUgb24gaHcKKyAqCisgKiBOb3RlOiBTb21lIHBsYXRmb3JtcyBjYW4ndCBoYW5kbGUgbW9yZSB0aGFuIDRCeXRlcworICogYmUgY2FyZWZ1bCBvbiBlbWJlZGRlZCBib2FyZHMuCisgKi8KK2VudW0gYXRoNWtfZG1hc2l6ZSB7CisJQVI1S19ETUFTSVpFXzRCCT0gMCwKKwlBUjVLX0RNQVNJWkVfOEIsCisJQVI1S19ETUFTSVpFXzE2QiwKKwlBUjVLX0RNQVNJWkVfMzJCLAorCUFSNUtfRE1BU0laRV82NEIsCisJQVI1S19ETUFTSVpFXzEyOEIsCisJQVI1S19ETUFTSVpFXzI1NkIsCisJQVI1S19ETUFTSVpFXzUxMkIKK307CisKKwogCiAvKioqKioqKioqKioqKioqKioqXAogICBSQVRFIERFRklOSVRJT05TCiBcKioqKioqKioqKioqKioqKioqLwogCiAvKioKKyAqIERPQzogUmF0ZSBjb2RlcworICoKICAqIFNlZW1zIHRoZSBhcjV4eHggaGFyZHdhcmUgc3VwcG9ydHMgdXAgdG8gMzIgcmF0ZXMsIGluZGV4ZWQgYnkgMS0zMi4KICAqCiAgKiBUaGUgcmF0ZSBjb2RlIGlzIHVzZWQgdG8gZ2V0IHRoZSBSWCByYXRlIG9yIHNldCB0aGUgVFggcmF0ZSBvbiB0aGUKICAqIGhhcmR3YXJlIGRlc2NyaXB0b3JzLiBJdCBpcyBhbHNvIHVzZWQgZm9yIGludGVybmFsIG1vZHVsYXRpb24gY29udHJvbAogICogYW5kIHNldHRpbmdzLgogICoKLSAqIFRoaXMgaXMgdGhlIGhhcmR3YXJlIHJhdGUgbWFwIHdlIGFyZSBhd2FyZSBvZjoKKyAqIFRoaXMgaXMgdGhlIGhhcmR3YXJlIHJhdGUgbWFwIHdlIGFyZSBhd2FyZSBvZiAoaHRtbCB1bmZyaWVuZGx5KToKICAqCi0gKiByYXRlX2NvZGUgICAweDAxICAgIDB4MDIgICAgMHgwMyAgICAweDA0ICAgIDB4MDUgICAgMHgwNiAgICAweDA3ICAgIDB4MDgKLSAqIHJhdGVfa2JwcyAgIDMwMDAgICAgMTAwMCAgICA/ICAgICAgID8gICAgICAgPyAgICAgICAyMDAwICAgIDUwMCAgICAgNDgwMDAKKyAqIFJhdGUgY29kZQlSYXRlIChLYnBzKQorICogLS0tLS0tLS0tCS0tLS0tLS0tLS0tCisgKiAweDAxCQkgMzAwMCAoWFIpCisgKiAweDAyCQkgMTAwMCAoWFIpCisgKiAweDAzCQkgIDI1MCAoWFIpCisgKiAweDA0IC0gMDUJLVJlc2VydmVkLQorICogMHgwNgkJIDIwMDAgKFhSKQorICogMHgwNwkJICA1MDAgKFhSKQorICogMHgwOAkJNDgwMDAgKE9GRE0pCisgKiAweDA5CQkyNDAwMCAoT0ZETSkKKyAqIDB4MEEJCTEyMDAwIChPRkRNKQorICogMHgwQgkJIDYwMDAgKE9GRE0pCisgKiAweDBDCQk1NDAwMCAoT0ZETSkKKyAqIDB4MEQJCTM2MDAwIChPRkRNKQorICogMHgwRQkJMTgwMDAgKE9GRE0pCisgKiAweDBGCQkgOTAwMCAoT0ZETSkKKyAqIDB4MTAgLSAxNwktUmVzZXJ2ZWQtCisgKiAweDE4CQkxMTAwMEwgKENDSykKKyAqIDB4MTkJCSA1NTAwTCAoQ0NLKQorICogMHgxQQkJIDIwMDBMIChDQ0spCisgKiAweDFCCQkgMTAwMEwgKENDSykKKyAqIDB4MUMJCTExMDAwUyAoQ0NLKQorICogMHgxRAkJIDU1MDBTIChDQ0spCisgKiAweDFFCQkgMjAwMFMgKENDSykKKyAqIDB4MUYJCS1SZXNlcnZlZC0KICAqCi0gKiByYXRlX2NvZGUgICAweDA5ICAgIDB4MEEgICAgMHgwQiAgICAweDBDICAgIDB4MEQgICAgMHgwRSAgICAweDBGICAgIDB4MTAKLSAqIHJhdGVfa2JwcyAgIDI0MDAwICAgMTIwMDAgICA2MDAwICAgIDU0MDAwICAgMzYwMDAgICAxODAwMCAgIDkwMDAgICAgPwotICoKLSAqIHJhdGVfY29kZSAgIDE3ICAgICAgMTggICAgICAxOSAgICAgIDIwICAgICAgMjEgICAgICAyMiAgICAgIDIzICAgICAgMjQKLSAqIHJhdGVfa2JwcyAgID8gICAgICAgPyAgICAgICA/ICAgICAgID8gICAgICAgPyAgICAgICA/ICAgICAgID8gICAgICAgMTEwMDAKLSAqCi0gKiByYXRlX2NvZGUgICAyNSAgICAgIDI2ICAgICAgMjcgICAgICAyOCAgICAgIDI5ICAgICAgMzAgICAgICAzMSAgICAgIDMyCi0gKiByYXRlX2ticHMgICA1NTAwICAgIDIwMDAgICAgMTAwMCAgICAxMTAwMFMgIDU1MDBTICAgMjAwMFMgICA/ICAgICAgID8KLSAqCi0gKiAiUyIgaW5kaWNhdGVzIENDSyByYXRlcyB3aXRoIHNob3J0IHByZWFtYmxlLgorICogIlMiIGluZGljYXRlcyBDQ0sgcmF0ZXMgd2l0aCBzaG9ydCBwcmVhbWJsZSBhbmQgIkwiIHdpdGggbG9uZyBwcmVhbWJsZS4KICAqCiAgKiBBUjUyMTEgaGFzIGRpZmZlcmVudCByYXRlIGNvZGVzIGZvciBDQ0sgKDgwMi4xMUIpIHJhdGVzLiBJdCBvbmx5IHVzZXMgdGhlCi0gKiBsb3dlc3QgNCBiaXRzLCBzbyB0aGV5IGFyZSB0aGUgc2FtZSBhcyBiZWxvdyB3aXRoIGEgMHhGIG1hc2suCisgKiBsb3dlc3QgNCBiaXRzLCBzbyB0aGV5IGFyZSB0aGUgc2FtZSBhcyBhYm92ZSB3aXRoIGEgMHhGIG1hc2suCiAgKiAoMHhCLCAweEEsIDB4OSBhbmQgMHg4IGZvciAxTSwgMk0sIDUuNU0gYW5kIDExTSkuCiAgKiBXZSBoYW5kbGUgdGhpcyBpbiBhdGg1a19zZXR1cF9iYW5kcygpLgogICovCkBAIC03MzMsMTMgKzkwNCw5IEBACiAjZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV8zNk0JMHgwRAogI2RlZmluZSBBVEg1S19SQVRFX0NPREVfNDhNCTB4MDgKICNkZWZpbmUgQVRINUtfUkFURV9DT0RFXzU0TQkweDBDCi0vKiBYUiAqLwotI2RlZmluZSBBVEg1S19SQVRFX0NPREVfWFJfNTAwSwkweDA3Ci0jZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8xTQkweDAyCi0jZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8yTQkweDA2Ci0jZGVmaW5lIEFUSDVLX1JBVEVfQ09ERV9YUl8zTQkweDAxCiAKLS8qIGFkZGluZyB0aGlzIGZsYWcgdG8gcmF0ZV9jb2RlIGVuYWJsZXMgc2hvcnQgcHJlYW1ibGUgKi8KKy8qIEFkZGluZyB0aGlzIGZsYWcgdG8gcmF0ZV9jb2RlIG9uIEIgcmF0ZXMKKyAqIGVuYWJsZXMgc2hvcnQgcHJlYW1ibGUgKi8KICNkZWZpbmUgQVI1S19TRVRfU0hPUlRfUFJFQU1CTEUgMHgwNAogCiAvKgpAQCAtNzQ3LDcgKzkxNCw3IEBACiAgKi8KIAogI2RlZmluZSBBUjVLX0tFWUNBQ0hFX1NJWkUJOAotZXh0ZXJuIGludCBhdGg1a19tb2RwYXJhbV9ub2h3Y3J5cHQ7CitleHRlcm4gYm9vbCBhdGg1a19tb2RwYXJhbV9ub2h3Y3J5cHQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKlwKICBIVyBSRUxBVEVEIERFRklOSVRJT05TCkBAIC03NjksNDkgKzkzNiw2NSBAQAogCiAvKioKICAqIGVudW0gYXRoNWtfaW50IC0gSGFyZHdhcmUgaW50ZXJydXB0IG1hc2tzIGhlbHBlcnMKKyAqIEBBUjVLX0lOVF9SWE9LOiBGcmFtZSBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQKKyAqIEBBUjVLX0lOVF9SWERFU0M6IFJlcXVlc3QgUlggZGVzY3JpcHRvci9SZWFkIFJYIGRlc2NyaXB0b3IKKyAqIEBBUjVLX0lOVF9SWEVSUjogRnJhbWUgcmVjZXB0aW9uIGZhaWxlZAorICogQEFSNUtfSU5UX1JYTk9GUk06IE5vIGZyYW1lIHJlY2VpdmVkIHdpdGhpbiBhIHNwZWNpZmllZCB0aW1lIHBlcmlvZAorICogQEFSNUtfSU5UX1JYRU9MOiBSZWFjaGVkICJFbmQgT2YgTGlzdCIsIG1lYW5zIHdlIG5lZWQgbW9yZSBSWCBkZXNjcmlwdG9ycworICogQEFSNUtfSU5UX1JYT1JOOiBJbmRpY2F0ZXMgd2UgZ290IFJYIEZJRk8gb3ZlcnJ1bi4gTm90ZSB0aGF0IFJ4IG92ZXJydW4gaXMKKyAqCQlub3QgYWx3YXlzIGZhdGFsLCBvbiBzb21lIGNoaXBzIHdlIGNhbiBjb250aW51ZSBvcGVyYXRpb24KKyAqCQl3aXRob3V0IHJlc2V0dGluZyB0aGUgY2FyZCwgdGhhdCdzIHdoeSAlQVI1S19JTlRfRkFUQUwgaXMgbm90CisgKgkJY29tbW9uIGZvciBhbGwgY2hpcHMuCisgKiBAQVI1S19JTlRfUlhfQUxMOiBNYXNrIHRvIGlkZW50aWZ5IGFsbCBSWCByZWxhdGVkIGludGVycnVwdHMKICAqCi0gKiBAQVI1S19JTlRfUlg6IG1hc2sgdG8gaWRlbnRpZnkgcmVjZWl2ZWQgZnJhbWUgaW50ZXJydXB0cywgb2YgdHlwZQotICoJQVI1S19JU1JfUlhPSyBvciBBUjVLX0lTUl9SWEVSUgotICogQEFSNUtfSU5UX1JYREVTQzogUmVxdWVzdCBSWCBkZXNjcmlwdG9yL1JlYWQgUlggZGVzY3JpcHRvciAoPykKLSAqIEBBUjVLX0lOVF9SWE5PRlJNOiBObyBmcmFtZSByZWNlaXZlZCAoPykKLSAqIEBBUjVLX0lOVF9SWEVPTDogcmVjZWl2ZWQgRW5kIE9mIExpc3QgZm9yIFZFT0wgKFZpcnR1YWwgRW5kIE9mIExpc3QpLiBUaGUKLSAqCVF1ZXVlIENvbnRyb2wgVW5pdCAoUUNVKSBzaWduYWxzIGFuIEVPTCBpbnRlcnJ1cHQgb25seSBpZiBhIGRlc2NyaXB0b3IncwotICoJTGlua1B0ciBpcyBOVUxMLiBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0bzoKLSAqCWh0dHA6Ly93d3cuZnJlZXBhdGVudHNvbmxpbmUuY29tLzIwMDMwMjI1NzM5Lmh0bWwKLSAqIEBBUjVLX0lOVF9SWE9STjogSW5kaWNhdGVzIHdlIGdvdCBSWCBvdmVycnVuIChlZy4gbm8gbW9yZSBkZXNjcmlwdG9ycykuCi0gKglOb3RlIHRoYXQgUnggb3ZlcnJ1biBpcyBub3QgYWx3YXlzIGZhdGFsLCBvbiBzb21lIGNoaXBzIHdlIGNhbiBjb250aW51ZQotICoJb3BlcmF0aW9uIHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBjYXJkLCB0aGF0J3Mgd2h5IGludF9mYXRhbCBpcyBub3QKLSAqCWNvbW1vbiBmb3IgYWxsIGNoaXBzLgotICogQEFSNUtfSU5UX1RYOiBtYXNrIHRvIGlkZW50aWZ5IHJlY2VpdmVkIGZyYW1lIGludGVycnVwdHMsIG9mIHR5cGUKLSAqCUFSNUtfSVNSX1RYT0sgb3IgQVI1S19JU1JfVFhFUlIKLSAqIEBBUjVLX0lOVF9UWERFU0M6IFJlcXVlc3QgVFggZGVzY3JpcHRvci9SZWFkIFRYIHN0YXR1cyBkZXNjcmlwdG9yICg/KQotICogQEFSNUtfSU5UX1RYVVJOOiByZWNlaXZlZCB3aGVuIHdlIHNob3VsZCBpbmNyZWFzZSB0aGUgVFggdHJpZ2dlciB0aHJlc2hvbGQKLSAqCVdlIGN1cnJlbnRseSBkbyBpbmNyZW1lbnRzIG9uIGludGVycnVwdCBieQotICoJKEFSNUtfVFVORV9NQVhfVFhfRklGT19USFJFUyAtIGN1cnJlbnRfdHJpZ2dlcl9sZXZlbCkgLyAyCisgKiBAQVI1S19JTlRfVFhPSzogRnJhbWUgdHJhbnNtaXNzaW9uIHN1Y2Nlc3MKKyAqIEBBUjVLX0lOVF9UWERFU0M6IFJlcXVlc3QgVFggZGVzY3JpcHRvci9SZWFkIFRYIHN0YXR1cyBkZXNjcmlwdG9yCisgKiBAQVI1S19JTlRfVFhFUlI6IEZyYW1lIHRyYW5zbWlzc2lvbiBmYWlsdXJlCisgKiBAQVI1S19JTlRfVFhFT0w6IFJlY2VpdmVkIEVuZCBPZiBMaXN0IGZvciBWRU9MIChWaXJ0dWFsIEVuZCBPZiBMaXN0KS4gVGhlCisgKgkJUXVldWUgQ29udHJvbCBVbml0IChRQ1UpIHNpZ25hbHMgYW4gRU9MIGludGVycnVwdCBvbmx5IGlmIGEKKyAqCQlkZXNjcmlwdG9yJ3MgTGlua1B0ciBpcyBOVUxMLiBGb3IgbW9yZSBkZXRhaWxzLCByZWZlciB0bzoKKyAqCQkiaHR0cDovL3d3dy5mcmVlcGF0ZW50c29ubGluZS5jb20vMjAwMzAyMjU3MzkuaHRtbCIKKyAqIEBBUjVLX0lOVF9UWE5PRlJNOiBObyBmcmFtZSB3YXMgdHJhbnNtaXR0ZWQgd2l0aGluIGEgc3BlY2lmaWVkIHRpbWUgcGVyaW9kCisgKiBAQVI1S19JTlRfVFhVUk46IEluZGljYXRlcyB3ZSBnb3QgVFggRklGTyB1bmRlcnJ1bi4gSW4gc3VjaCBjYXNlIHdlIHNob3VsZAorICoJCWluY3JlYXNlIHRoZSBUWCB0cmlnZ2VyIHRocmVzaG9sZC4KKyAqIEBBUjVLX0lOVF9UWF9BTEw6IE1hc2sgdG8gaWRlbnRpZnkgYWxsIFRYIHJlbGF0ZWQgaW50ZXJydXB0cworICoKICAqIEBBUjVLX0lOVF9NSUI6IEluZGljYXRlcyB0aGUgZWl0aGVyIE1hbmFnZW1lbnQgSW5mb3JtYXRpb24gQmFzZSBjb3VudGVycyBvcgotICoJb25lIG9mIHRoZSBQSFkgZXJyb3IgY291bnRlcnMgcmVhY2hlZCB0aGUgbWF4aW11bSB2YWx1ZSBhbmQgc2hvdWxkIGJlCi0gKglyZWFkIGFuZCBjbGVhcmVkLgorICoJCW9uZSBvZiB0aGUgUEhZIGVycm9yIGNvdW50ZXJzIHJlYWNoZWQgdGhlIG1heGltdW0gdmFsdWUgYW5kCisgKgkJc2hvdWxkIGJlIHJlYWQgYW5kIGNsZWFyZWQuCisgKiBAQVI1S19JTlRfU1dJOiBTb2Z0d2FyZSB0cmlnZ2VyZWQgaW50ZXJydXB0LgogICogQEFSNUtfSU5UX1JYUEhZOiBSWCBQSFkgRXJyb3IKICAqIEBBUjVLX0lOVF9SWEtDTTogUlggS2V5IGNhY2hlIG1pc3MKICAqIEBBUjVLX0lOVF9TV0JBOiBTb2Z0V2FyZSBCZWFjb24gQWxlcnQgLSBpbmRpY2F0ZXMgaXRzIHRpbWUgdG8gc2VuZCBhCi0gKgliZWFjb24gdGhhdCBtdXN0IGJlIGhhbmRsZWQgaW4gc29mdHdhcmUuIFRoZSBhbHRlcm5hdGl2ZSBpcyBpZiB5b3UKLSAqCWhhdmUgVkVPTCBzdXBwb3J0LCBpbiB0aGF0IGNhc2UgeW91IGxldCB0aGUgaGFyZHdhcmUgZGVhbCB3aXRoIHRoaW5ncy4KKyAqCQliZWFjb24gdGhhdCBtdXN0IGJlIGhhbmRsZWQgaW4gc29mdHdhcmUuIFRoZSBhbHRlcm5hdGl2ZSBpcyBpZgorICoJCXlvdSBoYXZlIFZFT0wgc3VwcG9ydCwgaW4gdGhhdCBjYXNlIHlvdSBsZXQgdGhlIGhhcmR3YXJlIGRlYWwKKyAqCQl3aXRoIHRoaW5ncy4KKyAqIEBBUjVLX0lOVF9CUlNTSTogQmVhY29uIHJlY2VpdmVkIHdpdGggYW4gUlNTSSB2YWx1ZSBiZWxvdyBvdXIgdGhyZXNob2xkCiAgKiBAQVI1S19JTlRfQk1JU1M6IElmIGluIFNUQSBtb2RlIHRoaXMgaW5kaWNhdGVzIHdlIGhhdmUgc3RvcHBlZCBzZWVpbmcKLSAqCWJlYWNvbnMgZnJvbSB0aGUgQVAgaGF2ZSBhc3NvY2lhdGVkIHdpdGgsIHdlIHNob3VsZCBwcm9iYWJseSB0cnkgdG8KLSAqCXJlYXNzb2NpYXRlLiBXaGVuIGluIElCU1MgbW9kZSB0aGlzIG1pZ2h0IG1lYW4gd2UgaGF2ZSBub3QgcmVjZWl2ZWQKLSAqCWFueSBiZWFjb25zIGZyb20gYW55IGxvY2FsIHN0YXRpb25zLiBOb3RlIHRoYXQgZXZlcnkgc3RhdGlvbiBpbiBhbgotICoJSUJTUyBzY2hlZHVsZXMgdG8gc2VuZCBiZWFjb25zIGF0IHRoZSBUYXJnZXQgQmVhY29uIFRyYW5zbWlzc2lvbiBUaW1lCi0gKgkoVEJUVCkgd2l0aCBhIHJhbmRvbSBiYWNrb2ZmLgotICogQEFSNUtfSU5UX0JOUjogQmVhY29uIE5vdCBSZWFkeSBpbnRlcnJ1cHQgLSA/PwotICogQEFSNUtfSU5UX0dQSU86IEdQSU8gaW50ZXJydXB0IGlzIHVzZWQgZm9yIFJGIEtpbGwsIGRpc2FibGVkIGZvciBub3cKLSAqCXVudGlsIHByb3Blcmx5IGhhbmRsZWQKLSAqIEBBUjVLX0lOVF9GQVRBTDogRmF0YWwgZXJyb3JzIHdlcmUgZW5jb3VudGVyZWQsIHR5cGljYWxseSBjYXVzZWQgYnkgRE1BCi0gKgllcnJvcnMuIFRoZXNlIHR5cGVzIG9mIGVycm9ycyB3ZSBjYW4gZW5hYmxlIHNlZW0gdG8gYmUgb2YgdHlwZQotICoJQVI1S19TSU1SMl9NQ0FCVCwgQVI1S19TSU1SMl9TU0VSUiBhbmQgQVI1S19TSU1SMl9EUEVSUi4KKyAqCQliZWFjb25zIGZyb20gdGhlIEFQIGhhdmUgYXNzb2NpYXRlZCB3aXRoLCB3ZSBzaG91bGQgcHJvYmFibHkKKyAqCQl0cnkgdG8gcmVhc3NvY2lhdGUuIFdoZW4gaW4gSUJTUyBtb2RlIHRoaXMgbWlnaHQgbWVhbiB3ZSBoYXZlCisgKgkJbm90IHJlY2VpdmVkIGFueSBiZWFjb25zIGZyb20gYW55IGxvY2FsIHN0YXRpb25zLiBOb3RlIHRoYXQKKyAqCQlldmVyeSBzdGF0aW9uIGluIGFuIElCU1Mgc2NoZWR1bGVzIHRvIHNlbmQgYmVhY29ucyBhdCB0aGUKKyAqCQlUYXJnZXQgQmVhY29uIFRyYW5zbWlzc2lvbiBUaW1lIChUQlRUKSB3aXRoIGEgcmFuZG9tIGJhY2tvZmYuCisgKiBAQVI1S19JTlRfQk5SOiBCZWFjb24gcXVldWUgZ290IHRyaWdnZXJlZCAoRE1BIGJlYWNvbiBhbGVydCkgd2hpbGUgZW1wdHkuCisgKiBAQVI1S19JTlRfVElNOiBCZWFjb24gd2l0aCBsb2NhbCBzdGF0aW9uJ3MgVElNIGJpdCBzZXQKKyAqIEBBUjVLX0lOVF9EVElNOiBCZWFjb24gd2l0aCBEVElNIGJpdCBhbmQgemVybyBEVElNIGNvdW50IHJlY2VpdmVkCisgKiBAQVI1S19JTlRfRFRJTV9TWU5DOiBEVElNIHN5bmMgbG9zdAorICogQEFSNUtfSU5UX0dQSU86IEdQSU8gaW50ZXJydXB0IGlzIHVzZWQgZm9yIFJGIEtpbGwgc3dpdGNoZXMgY29ubmVjdGVkIHRvCisgKgkJb3VyIEdQSU8gcGlucy4KKyAqIEBBUjVLX0lOVF9CQ05fVElNRU9VVDogQmVhY29uIHRpbWVvdXQsIHdlIHdhaXRlZCBhZnRlciBUQlRUIGJ1dCBnb3Qgbm90aW5nCisgKiBAQVI1S19JTlRfQ0FCX1RJTUVPVVQ6IFdlIHdhaXRlZCBmb3IgQ0FCIHRyYWZmaWMgYWZ0ZXIgdGhlIGJlYWNvbiBidXQgZ290CisgKgkJbm90aGluZyBvciBhbiBpbmNvbXBsZXRlIENBQiBmcmFtZSBzZXF1ZW5jZS4KKyAqIEBBUjVLX0lOVF9RQ0JST1JOOiBBIHF1ZXVlIGdvdCBpdCdzIENCUiBjb3VudGVyIGV4cGlyZWQKKyAqIEBBUjVLX0lOVF9RQ0JSVVJOOiBBIHF1ZXVlIGdvdCB0cmlnZ2VyZWQgd2lsZSBlbXB0eQorICogQEFSNUtfSU5UX1FUUklHOiBBIHF1ZXVlIGdvdCB0cmlnZ2VyZWQKKyAqCisgKiBAQVI1S19JTlRfRkFUQUw6IEZhdGFsIGVycm9ycyB3ZXJlIGVuY291bnRlcmVkLCB0eXBpY2FsbHkgY2F1c2VkIGJ5IGJ1cy9ETUEKKyAqCQllcnJvcnMuIEluZGljYXRlcyB3ZSBuZWVkIHRvIHJlc2V0IHRoZSBjYXJkLgogICogQEFSNUtfSU5UX0dMT0JBTDogVXNlZCB0byBjbGVhciBhbmQgc2V0IHRoZSBJRVIKLSAqIEBBUjVLX0lOVF9OT0NBUkQ6IHNpZ25hbHMgdGhlIGNhcmQgaGFzIGJlZW4gcmVtb3ZlZAotICogQEFSNUtfSU5UX0NPTU1PTjogY29tbW9uIGludGVycnVwdHMgc2hhcmVkIGFtb25nIE1BQ3Mgd2l0aCB0aGUgc2FtZQotICoJYml0IHZhbHVlCisgKiBAQVI1S19JTlRfTk9DQVJEOiBTaWduYWxzIHRoZSBjYXJkIGhhcyBiZWVuIHJlbW92ZWQKKyAqIEBBUjVLX0lOVF9DT01NT046IENvbW1vbiBpbnRlcnJ1cHRzIHNoYXJlZCBhbW9uZyBNQUNzIHdpdGggdGhlIHNhbWUKKyAqCQliaXQgdmFsdWUKICAqCiAgKiBUaGVzZSBhcmUgbWFwcGVkIHRvIHRha2UgYWR2YW50YWdlIG9mIHNvbWUgY29tbW9uIGJpdHMKICAqIGJldHdlZW4gdGhlIE1BQ3MsIHRvIGJlIGFibGUgdG8gc2V0IGludHIgcHJvcGVydGllcwpAQCAtODQ3LDE1ICsxMDMwLDE1IEBACiAJQVI1S19JTlRfR1BJTwk9CTB4MDEwMDAwMDAsCiAJQVI1S19JTlRfQkNOX1RJTUVPVVQgPQkweDAyMDAwMDAwLCAvKiBOb24gY29tbW9uICovCiAJQVI1S19JTlRfQ0FCX1RJTUVPVVQgPQkweDA0MDAwMDAwLCAvKiBOb24gY29tbW9uICovCi0JQVI1S19JTlRfUlhfRE9QUExFUiA9CTB4MDgwMDAwMDAsIC8qIE5vbiBjb21tb24gKi8KLQlBUjVLX0lOVF9RQ0JST1JOID0JMHgxMDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLwotCUFSNUtfSU5UX1FDQlJVUk4gPQkweDIwMDAwMDAwLCAvKiBOb24gY29tbW9uICovCi0JQVI1S19JTlRfUVRSSUcJPQkweDQwMDAwMDAwLCAvKiBOb24gY29tbW9uICovCisJQVI1S19JTlRfUUNCUk9STiA9CTB4MDgwMDAwMDAsIC8qIE5vbiBjb21tb24gKi8KKwlBUjVLX0lOVF9RQ0JSVVJOID0JMHgxMDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLworCUFSNUtfSU5UX1FUUklHCT0JMHgyMDAwMDAwMCwgLyogTm9uIGNvbW1vbiAqLwogCUFSNUtfSU5UX0dMT0JBTCA9CTB4ODAwMDAwMDAsCiAKIAlBUjVLX0lOVF9UWF9BTEwgPSBBUjVLX0lOVF9UWE9LCiAJCXwgQVI1S19JTlRfVFhERVNDCiAJCXwgQVI1S19JTlRfVFhFUlIKKwkJfCBBUjVLX0lOVF9UWE5PRlJNCiAJCXwgQVI1S19JTlRfVFhFT0wKIAkJfCBBUjVLX0lOVF9UWFVSTiwKIApAQCAtODkxLDE1ICsxMDc0LDMyIEBACiAJQVI1S19JTlRfTk9DQVJECT0gMHhmZmZmZmZmZgogfTsKIAotLyogbWFzayB3aGljaCBjYWxpYnJhdGlvbiBpcyBhY3RpdmUgYXQgdGhlIG1vbWVudCAqLworLyoqCisgKiBlbnVtIGF0aDVrX2NhbGlicmF0aW9uX21hc2sgLSBNYXNrIHdoaWNoIGNhbGlicmF0aW9uIGlzIGFjdGl2ZSBhdCB0aGUgbW9tZW50CisgKiBAQVI1S19DQUxJQlJBVElPTl9GVUxMOiBGdWxsIGNhbGlicmF0aW9uIChBR0MgKyBTSE9SVCkKKyAqIEBBUjVLX0NBTElCUkFUSU9OX1NIT1JUOiBTaG9ydCBjYWxpYnJhdGlvbiAoTkYgKyBJL1EpCisgKiBAQVI1S19DQUxJQlJBVElPTl9ORjogTm9pc2UgRmxvb3IgY2FsaWJyYXRpb24KKyAqIEBBUjVLX0NBTElCUkFUSU9OX0FOSTogQWRhcHRpdmUgTm9pc2UgSW1tdW5pdHkKKyAqLwogZW51bSBhdGg1a19jYWxpYnJhdGlvbl9tYXNrIHsKIAlBUjVLX0NBTElCUkFUSU9OX0ZVTEwgPSAweDAxLAogCUFSNUtfQ0FMSUJSQVRJT05fU0hPUlQgPSAweDAyLAotCUFSNUtfQ0FMSUJSQVRJT05fQU5JID0gMHgwNCwKKwlBUjVLX0NBTElCUkFUSU9OX05GID0gMHgwNCwKKwlBUjVLX0NBTElCUkFUSU9OX0FOSSA9IDB4MDgsCiB9OwogCi0vKgotICogUG93ZXIgbWFuYWdlbWVudAorLyoqCisgKiBlbnVtIGF0aDVrX3Bvd2VyX21vZGUgLSBQb3dlciBtYW5hZ2VtZW50IG1vZGVzCisgKiBAQVI1S19QTV9VTkRFRklORUQ6IFVuZGVmaW5lZAorICogQEFSNUtfUE1fQVVUTzogQWxsb3cgY2FyZCB0byBzbGVlcCBpZiBwb3NzaWJsZQorICogQEFSNUtfUE1fQVdBS0U6IEZvcmNlIGNhcmQgdG8gd2FrZSB1cAorICogQEFSNUtfUE1fRlVMTF9TTEVFUDogRm9yY2UgY2FyZCB0byBmdWxsIHNsZWVwIChEQU5HRVJPVVMpCisgKiBAQVI1S19QTV9ORVRXT1JLX1NMRUVQOiBBbGxvdyB0byBzbGVlcCBmb3IgYSBzcGVjaWZpZWQgZHVyYXRpb24KKyAqCisgKiBDdXJyZW50bHkgb25seSBQTV9BV0FLRSBpcyB1c2VkLCBGVUxMX1NMRUVQIGFuZCBORVRXT1JLX1NMRUVQL0FVVE8KKyAqIGFyZSBhbHNvIGtub3duIHRvIGhhdmUgcHJvYmxlbXMgb24gc29tZSBjYXJkcy4gVGhpcyBpcyBub3QgYSBiaWcKKyAqIHByb2JsZW0gdGhvdWdoIGJlY2F1c2Ugd2UgY2FuIGhhdmUgYWxtb3N0IHRoZSBzYW1lIGVmZmVjdCBhcworICogRlVMTF9TTEVFUCBieSBwdXR0aW5nIGNhcmQgb24gd2FybSByZXNldCAoaXQncyBhbG1vc3QgcG93ZXJlZCBkb3duKS4KICAqLwogZW51bSBhdGg1a19wb3dlcl9tb2RlIHsKIAlBUjVLX1BNX1VOREVGSU5FRCA9IDAsCkBAIC05NTcsNiArMTE1Nyw4IEBACiAJfSBjYXBfcXVldWVzOwogCiAJYm9vbCBjYXBfaGFzX3BoeWVycl9jb3VudGVyczsKKwlib29sIGNhcF9oYXNfbXJyX3N1cHBvcnQ7CisJYm9vbCBjYXBfbmVlZHNfMkdIel9vdnI7CiB9OwogCiAvKiBzaXplIG9mIG5vaXNlIGZsb29yIGhpc3RvcnkgKGtlZXAgaXQgYSBwb3dlciBvZiB0d28pICovCkBAIC0xMDcyLDEzICsxMjc0LDExIEBACiAJZG1hX2FkZHJfdAkJZGVzY19kYWRkcjsJLyogRE1BIChwaHlzaWNhbCkgYWRkcmVzcyAqLwogCXNpemVfdAkJCWRlc2NfbGVuOwkvKiBzaXplIG9mIFRYL1JYIGRlc2NyaXB0b3JzICovCiAKLQlERUNMQVJFX0JJVE1BUChzdGF0dXMsIDYpOworCURFQ0xBUkVfQklUTUFQKHN0YXR1cywgNCk7CiAjZGVmaW5lIEFUSF9TVEFUX0lOVkFMSUQJMAkJLyogZGlzYWJsZSBoYXJkd2FyZSBhY2Nlc3NlcyAqLwotI2RlZmluZSBBVEhfU1RBVF9NUlJFVFJZCTEJCS8qIG11bHRpLXJhdGUgcmV0cnkgc3VwcG9ydCAqLwotI2RlZmluZSBBVEhfU1RBVF9QUk9NSVNDCTIKLSNkZWZpbmUgQVRIX1NUQVRfTEVEU09GVAkzCQkvKiBlbmFibGUgTEVEIGdwaW8gc3RhdHVzICovCi0jZGVmaW5lIEFUSF9TVEFUX1NUQVJURUQJNAkJLyogb3BlbmVkICYgaXJxcyBlbmFibGVkICovCi0jZGVmaW5lIEFUSF9TVEFUXzJHX0RJU0FCTEVECTUJCS8qIG11bHRpYmFuZCByYWRpbyB3aXRob3V0IDJHICovCisjZGVmaW5lIEFUSF9TVEFUX1BST01JU0MJMQorI2RlZmluZSBBVEhfU1RBVF9MRURTT0ZUCTIJCS8qIGVuYWJsZSBMRUQgZ3BpbyBzdGF0dXMgKi8KKyNkZWZpbmUgQVRIX1NUQVRfU1RBUlRFRAkzCQkvKiBvcGVuZWQgJiBpcnFzIGVuYWJsZWQgKi8KIAogCXVuc2lnbmVkIGludAkJZmlsdGVyX2ZsYWdzOwkvKiBIVyBmbGFncywgQVI1S19SWF9GSUxURVJfKiAqLwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VyY2hhbjsJLyogY3VycmVudCBoL3cgY2hhbm5lbCAqLwpAQCAtMTA5Nyw2ICsxMjk3LDcgQEAKIAkJCQlsZWRfb247CQkvKiBwaW4gc2V0dGluZyBmb3IgTEVEIG9uICovCiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcmVzZXRfd29yazsJLyogZGVmZXJyZWQgY2hpcCByZXNldCAqLworCXN0cnVjdCB3b3JrX3N0cnVjdAljYWxpYl93b3JrOwkvKiBkZWZlcnJlZCBwaHkgY2FsaWJyYXRpb24gKi8KIAogCXN0cnVjdCBsaXN0X2hlYWQJcnhidWY7CQkvKiByZWNlaXZlIGJ1ZmZlciAqLwogCXNwaW5sb2NrX3QJCXJ4YnVmbG9jazsKQEAgLTExMTMsOCArMTMxNCw2IEBACiAKIAlzdHJ1Y3QgYXRoNWtfcmZraWxsCXJmX2tpbGw7CiAKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJY2FsaWI7CQkvKiBjYWxpYnJhdGlvbiB0YXNrbGV0ICovCi0KIAlzcGlubG9ja190CQlibG9jazsJCS8qIHByb3RlY3RzIGJlYWNvbiAqLwogCXN0cnVjdCB0YXNrbGV0X3N0cnVjdAliZWFjb250cTsJLyogYmVhY29uIGludHIgdGFza2xldCAqLwogCXN0cnVjdCBsaXN0X2hlYWQJYmNidWY7CQkvKiBiZWFjb24gYnVmZmVyICovCkBAIC0xMTQ0LDcgKzEzNDMsNyBAQAogCWVudW0gYXRoNWtfaW50CQlhaF9pbXI7CiAKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmFoX2N1cnJlbnRfY2hhbm5lbDsKLQlib29sCQkJYWhfY2FsaWJyYXRpb247CisJYm9vbAkJCWFoX2lxX2NhbF9uZWVkZWQ7CiAJYm9vbAkJCWFoX3NpbmdsZV9jaGlwOwogCiAJZW51bSBhdGg1a192ZXJzaW9uCWFoX3ZlcnNpb247CkBAIC0xMTg3LDcgKzEzODYsMTMgQEAKIAl1MzIJCQlhaF90eHFfaW1yX2NicnVybjsKIAl1MzIJCQlhaF90eHFfaW1yX3F0cmlnOwogCXUzMgkJCWFoX3R4cV9pbXJfbm9mcm07Ci0JdTMyCQkJYWhfdHhxX2lzcjsKKworCXUzMgkJCWFoX3R4cV9pc3JfdHhva19hbGw7CisJdTMyCQkJYWhfdHhxX2lzcl90eHVybjsKKwl1MzIJCQlhaF90eHFfaXNyX3FjYm9ybjsKKwl1MzIJCQlhaF90eHFfaXNyX3FjYnVybjsKKwl1MzIJCQlhaF90eHFfaXNyX3F0cmlnOworCiAJdTMyCQkJKmFoX3JmX2JhbmtzOwogCXNpemVfdAkJCWFoX3JmX2JhbmtzX3NpemU7CiAJc2l6ZV90CQkJYWhfcmZfcmVnc19jb3VudDsKQEAgLTEyMjgsOCArMTQzMyw4IEBACiAKIAkvKiBDYWxpYnJhdGlvbiB0aW1lc3RhbXAgKi8KIAl1bnNpZ25lZCBsb25nCQlhaF9jYWxfbmV4dF9mdWxsOworCXVuc2lnbmVkIGxvbmcJCWFoX2NhbF9uZXh0X3Nob3J0OwogCXVuc2lnbmVkIGxvbmcJCWFoX2NhbF9uZXh0X2FuaTsKLQl1bnNpZ25lZCBsb25nCQlhaF9jYWxfbmV4dF9uZjsKIAogCS8qIENhbGlicmF0aW9uIG1hc2sgKi8KIAl1OAkJCWFoX2NhbF9tYXNrOwpAQCAtMTMzOCwxMSArMTU0MywxMSBAQAogdTY0IGF0aDVrX2h3X2dldF90c2Y2NChzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKIHZvaWQgYXRoNWtfaHdfc2V0X3RzZjY0KHN0cnVjdCBhdGg1a19odyAqYWgsIHU2NCB0c2Y2NCk7CiB2b2lkIGF0aDVrX2h3X3Jlc2V0X3RzZihzdHJ1Y3QgYXRoNWtfaHcgKmFoKTsKLXZvaWQgYXRoNWtfaHdfaW5pdF9iZWFjb24oc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIG5leHRfYmVhY29uLCB1MzIgaW50ZXJ2YWwpOwordm9pZCBhdGg1a19od19pbml0X2JlYWNvbl90aW1lcnMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIG5leHRfYmVhY29uLAorCQkJCQkJCXUzMiBpbnRlcnZhbCk7CiBib29sIGF0aDVrX2h3X2NoZWNrX2JlYWNvbl90aW1lcnMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IGludHZhbCk7CiAvKiBJbml0IGZ1bmN0aW9uICovCi12b2lkIGF0aDVrX2h3X3BjdV9pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3BfbW9kZSwKLQkJCQkJCQkJdTggbW9kZSk7Cit2b2lkIGF0aDVrX2h3X3BjdV9pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3BfbW9kZSk7CiAKIC8qIFF1ZXVlIENvbnRyb2wgVW5pdCwgREZTIENvbnRyb2wgVW5pdCBGdW5jdGlvbnMgKi8KIGludCBhdGg1a19od19nZXRfdHhfcXVldWVwcm9wcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBpbnQgcXVldWUsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXR0YWNoLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYXR0YWNoLmMKaW5kZXggOTE2MjdkZC4uZDcxMTRjNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2F0dGFjaC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9hdHRhY2guYwpAQCAtMjcsOCArMjcsNyBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAKIC8qKgotICogYXRoNWtfaHdfcG9zdCAtIFBvd2VyIE9uIFNlbGYgVGVzdCBoZWxwZXIgZnVuY3Rpb24KLSAqCisgKiBhdGg1a19od19wb3N0KCkgLSBQb3dlciBPbiBTZWxmIFRlc3QgaGVscGVyIGZ1bmN0aW9uCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKi8KIHN0YXRpYyBpbnQgYXRoNWtfaHdfcG9zdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQpAQCAtOTIsOCArOTEsNyBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X2luaXQgLSBDaGVjayBpZiBodyBpcyBzdXBwb3J0ZWQgYW5kIGluaXQgdGhlIG5lZWRlZCBzdHJ1Y3RzCi0gKgorICogYXRoNWtfaHdfaW5pdCgpIC0gQ2hlY2sgaWYgaHcgaXMgc3VwcG9ydGVkIGFuZCBpbml0IHRoZSBuZWVkZWQgc3RydWN0cwogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odyBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZQogICoKICAqIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkLCBwZXJmb3JtIGEgUE9TVCBhbmQgaW5pdGlhbGl6ZSB0aGUgbmVlZGVkCkBAIC0yOTgsNyArMjk2LDcgQEAKIAogCQkvKiBSZXNldCBTRVJERVMgdG8gbG9hZCBuZXcgc2V0dGluZ3MgKi8KIAkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCAweDAwMDAwMDAwLCBBUjVLX1BDSUVfU0VSREVTX1JFU0VUKTsKLQkJbWRlbGF5KDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CiAJfQogCiAJLyogR2V0IG1pc2MgY2FwYWJpbGl0aWVzICovCkBAIC0zMDgsMTEgKzMwNiw2IEBACiAJCWdvdG8gZXJyOwogCX0KIAotCWlmICh0ZXN0X2JpdChBVEhfU1RBVF8yR19ESVNBQkxFRCwgYWgtPnN0YXR1cykpIHsKLQkJX19jbGVhcl9iaXQoQVI1S19NT0RFXzExQiwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfbW9kZSk7Ci0JCV9fY2xlYXJfYml0KEFSNUtfTU9ERV8xMUcsIGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX21vZGUpOwotCX0KLQogCS8qIENyeXB0byBzZXR0aW5ncyAqLwogCWNvbW1vbi0+a2V5bWF4ID0gKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwID8KIAkJCSAgQVI1S19LRVlUQUJMRV9TSVpFXzUyMTAgOiBBUjVLX0tFWVRBQkxFX1NJWkVfNTIxMSk7CkBAIC0zNDksOCArMzQyLDcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19kZWluaXQgLSBGcmVlIHRoZSBhdGg1a19odyBzdHJ1Y3QKLSAqCisgKiBhdGg1a19od19kZWluaXQoKSAtIEZyZWUgdGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqLwogdm9pZCBhdGg1a19od19kZWluaXQoc3RydWN0IGF0aDVrX2h3ICphaCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvYmFzZS5jCmluZGV4IGIzNDZkMDQuLmQzNjZkYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9iYXNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Jhc2UuYwpAQCAtNjgsMTggKzY4LDIzIEBACiAjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKICNpbmNsdWRlICJ0cmFjZS5oIgogCi1pbnQgYXRoNWtfbW9kcGFyYW1fbm9od2NyeXB0OworYm9vbCBhdGg1a19tb2RwYXJhbV9ub2h3Y3J5cHQ7CiBtb2R1bGVfcGFyYW1fbmFtZWQobm9od2NyeXB0LCBhdGg1a19tb2RwYXJhbV9ub2h3Y3J5cHQsIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhub2h3Y3J5cHQsICJEaXNhYmxlIGhhcmR3YXJlIGVuY3J5cHRpb24uIik7CiAKLXN0YXRpYyBpbnQgbW9kcGFyYW1fYWxsX2NoYW5uZWxzOworc3RhdGljIGJvb2wgbW9kcGFyYW1fYWxsX2NoYW5uZWxzOwogbW9kdWxlX3BhcmFtX25hbWVkKGFsbF9jaGFubmVscywgbW9kcGFyYW1fYWxsX2NoYW5uZWxzLCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MoYWxsX2NoYW5uZWxzLCAiRXhwb3NlIGFsbCBjaGFubmVscyB0aGUgZGV2aWNlIGNhbiB1c2UuIik7CiAKLXN0YXRpYyBpbnQgbW9kcGFyYW1fZmFzdGNoYW5zd2l0Y2g7CitzdGF0aWMgYm9vbCBtb2RwYXJhbV9mYXN0Y2hhbnN3aXRjaDsKIG1vZHVsZV9wYXJhbV9uYW1lZChmYXN0Y2hhbnN3aXRjaCwgbW9kcGFyYW1fZmFzdGNoYW5zd2l0Y2gsIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhmYXN0Y2hhbnN3aXRjaCwgIkVuYWJsZSBmYXN0IGNoYW5uZWwgc3dpdGNoaW5nIGZvciBBUjI0MTMvQVI1NDEzIHJhZGlvcy4iKTsKIAorc3RhdGljIGludCBhdGg1a19tb2RwYXJhbV9ub19od19yZmtpbGxfc3dpdGNoOworbW9kdWxlX3BhcmFtX25hbWVkKG5vX2h3X3Jma2lsbF9zd2l0Y2gsIGF0aDVrX21vZHBhcmFtX25vX2h3X3Jma2lsbF9zd2l0Y2gsCisJCQkJCQkJCWJvb2wsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhub19od19yZmtpbGxfc3dpdGNoLCAiSWdub3JlIHRoZSBHUElPIFJGS2lsbCBzd2l0Y2ggc3RhdGUiKTsKKwogCiAvKiBNb2R1bGUgaW5mbyAqLwogTU9EVUxFX0FVVEhPUigiSmlyaSBTbGFieSIpOwpAQCAtMTgzLDcgKzE4OCw2IEBACiAJeyAuYml0cmF0ZSA9IDU0MCwKIAkgIC5od192YWx1ZSA9IEFUSDVLX1JBVEVfQ09ERV81NE0sCiAJICAuZmxhZ3MgPSAwIH0sCi0JLyogWFIgbWlzc2luZyAqLwogfTsKIAogc3RhdGljIGlubGluZSB1NjQgYXRoNWtfZXh0ZW5kX3RzZihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgcnN0YW1wKQpAQCAtNzIxLDIyICs3MjUsMjUgQEAKIAlpZiAocmV0KQogCQlnb3RvIGVycl91bm1hcDsKIAotCW1lbXNldChtcnJfcmF0ZSwgMCwgc2l6ZW9mKG1ycl9yYXRlKSk7Ci0JbWVtc2V0KG1ycl90cmllcywgMCwgc2l6ZW9mKG1ycl90cmllcykpOwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJcmF0ZSA9IGllZWU4MDIxMV9nZXRfYWx0X3JldHJ5X3JhdGUoYWgtPmh3LCBpbmZvLCBpKTsKLQkJaWYgKCFyYXRlKQotCQkJYnJlYWs7CisJLyogU2V0IHVwIE1SUiBkZXNjcmlwdG9yICovCisJaWYgKGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2hhc19tcnJfc3VwcG9ydCkgeworCQltZW1zZXQobXJyX3JhdGUsIDAsIHNpemVvZihtcnJfcmF0ZSkpOworCQltZW1zZXQobXJyX3RyaWVzLCAwLCBzaXplb2YobXJyX3RyaWVzKSk7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJCXJhdGUgPSBpZWVlODAyMTFfZ2V0X2FsdF9yZXRyeV9yYXRlKGFoLT5odywgaW5mbywgaSk7CisJCQlpZiAoIXJhdGUpCisJCQkJYnJlYWs7CiAKLQkJbXJyX3JhdGVbaV0gPSByYXRlLT5od192YWx1ZTsKLQkJbXJyX3RyaWVzW2ldID0gaW5mby0+Y29udHJvbC5yYXRlc1tpICsgMV0uY291bnQ7CisJCQltcnJfcmF0ZVtpXSA9IHJhdGUtPmh3X3ZhbHVlOworCQkJbXJyX3RyaWVzW2ldID0gaW5mby0+Y29udHJvbC5yYXRlc1tpICsgMV0uY291bnQ7CisJCX0KKworCQlhdGg1a19od19zZXR1cF9tcnJfdHhfZGVzYyhhaCwgZHMsCisJCQltcnJfcmF0ZVswXSwgbXJyX3RyaWVzWzBdLAorCQkJbXJyX3JhdGVbMV0sIG1ycl90cmllc1sxXSwKKwkJCW1ycl9yYXRlWzJdLCBtcnJfdHJpZXNbMl0pOwogCX0KIAotCWF0aDVrX2h3X3NldHVwX21ycl90eF9kZXNjKGFoLCBkcywKLQkJbXJyX3JhdGVbMF0sIG1ycl90cmllc1swXSwKLQkJbXJyX3JhdGVbMV0sIG1ycl90cmllc1sxXSwKLQkJbXJyX3JhdGVbMl0sIG1ycl90cmllc1syXSk7Ci0KIAlkcy0+ZHNfbGluayA9IDA7CiAJZHMtPmRzX2RhdGEgPSBiZi0+c2tiYWRkcjsKIApAQCAtMTY4OSw3ICsxNjk2LDcgQEAKIAlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gKHZvaWQgKilkYXRhOwogCiAJZm9yIChpID0gMDsgaSA8IEFSNUtfTlVNX1RYX1FVRVVFUzsgaSsrKQotCQlpZiAoYWgtPnR4cXNbaV0uc2V0dXAgJiYgKGFoLT5haF90eHFfaXNyICYgQklUKGkpKSkKKwkJaWYgKGFoLT50eHFzW2ldLnNldHVwICYmIChhaC0+YWhfdHhxX2lzcl90eG9rX2FsbCAmIEJJVChpKSkpCiAJCQlhdGg1a190eF9wcm9jZXNzcShhaCwgJmFoLT50eHFzW2ldKTsKIAogCWFoLT50eF9wZW5kaW5nID0gZmFsc2U7CkBAIC0yMDA1LDcgKzIwMTIsNyBAQAogCWFoLT5uZXh0dGJ0dCA9IG5leHR0YnR0OwogCiAJaW50dmFsIHw9IEFSNUtfQkVBQ09OX0VOQTsKLQlhdGg1a19od19pbml0X2JlYWNvbihhaCwgbmV4dHRidHQsIGludHZhbCk7CisJYXRoNWtfaHdfaW5pdF9iZWFjb25fdGltZXJzKGFoLCBuZXh0dGJ0dCwgaW50dmFsKTsKIAogCS8qCiAJICogZGVidWdnaW5nIG91dHB1dCBsYXN0IGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSB0aW1lIGNyaXRpY2FsIGFzcGVjdApAQCAtMjExMiwxNiArMjExOSwyOSBAQAogYXRoNWtfaW50cl9jYWxpYnJhdGlvbl9wb2xsKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJaWYgKHRpbWVfaXNfYmVmb3JlX2VxX2ppZmZpZXMoYWgtPmFoX2NhbF9uZXh0X2FuaSkgJiYKLQkgICAgIShhaC0+YWhfY2FsX21hc2sgJiBBUjVLX0NBTElCUkFUSU9OX0ZVTEwpKSB7Ci0JCS8qIHJ1biBBTkkgb25seSB3aGVuIGZ1bGwgY2FsaWJyYXRpb24gaXMgbm90IGFjdGl2ZSAqLworCSAgICEoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9GVUxMKSAmJgorCSAgICEoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9TSE9SVCkpIHsKKworCQkvKiBSdW4gQU5JIG9ubHkgd2hlbiBjYWxpYnJhdGlvbiBpcyBub3QgYWN0aXZlICovCisKIAkJYWgtPmFoX2NhbF9uZXh0X2FuaSA9IGppZmZpZXMgKwogCQkJbXNlY3NfdG9famlmZmllcyhBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0FOSSk7CiAJCXRhc2tsZXRfc2NoZWR1bGUoJmFoLT5hbmlfdGFza2xldCk7CiAKLQl9IGVsc2UgaWYgKHRpbWVfaXNfYmVmb3JlX2VxX2ppZmZpZXMoYWgtPmFoX2NhbF9uZXh0X2Z1bGwpKSB7Ci0JCWFoLT5haF9jYWxfbmV4dF9mdWxsID0gamlmZmllcyArCi0JCQltc2Vjc190b19qaWZmaWVzKEFUSDVLX1RVTkVfQ0FMSUJSQVRJT05fSU5URVJWQUxfRlVMTCk7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJmFoLT5jYWxpYik7CisJfSBlbHNlIGlmICh0aW1lX2lzX2JlZm9yZV9lcV9qaWZmaWVzKGFoLT5haF9jYWxfbmV4dF9zaG9ydCkgJiYKKwkJIShhaC0+YWhfY2FsX21hc2sgJiBBUjVLX0NBTElCUkFUSU9OX0ZVTEwpICYmCisJCSEoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9TSE9SVCkpIHsKKworCQkvKiBSdW4gY2FsaWJyYXRpb24gb25seSB3aGVuIGFub3RoZXIgY2FsaWJyYXRpb24KKwkJICogaXMgbm90IHJ1bm5pbmcuCisJCSAqCisJCSAqIE5vdGU6IFRoaXMgaXMgZm9yIGJvdGggZnVsbC9zaG9ydCBjYWxpYnJhdGlvbiwKKwkJICogaWYgaXQncyB0aW1lIGZvciBhIGZ1bGwgb25lLCBhdGg1a19jYWxpYnJhdGVfd29yayB3aWxsIGRlYWwKKwkJICogd2l0aCBpdC4gKi8KKworCQlhaC0+YWhfY2FsX25leHRfc2hvcnQgPSBqaWZmaWVzICsKKwkJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9TSE9SVCk7CisJCWllZWU4MDIxMV9xdWV1ZV93b3JrKGFoLT5odywgJmFoLT5jYWxpYl93b3JrKTsKIAl9CiAJLyogd2UgY291bGQgdXNlIFNXSSB0byBnZW5lcmF0ZSBlbm91Z2ggaW50ZXJydXB0cyB0byBtZWV0IG91cgogCSAqIGNhbGlicmF0aW9uIGludGVydmFsIHJlcXVpcmVtZW50cywgaWYgbmVjZXNzYXJ5OgpAQCAtMjE0OSw2OSArMjE2OSwxMTAgQEAKIAllbnVtIGF0aDVrX2ludCBzdGF0dXM7CiAJdW5zaWduZWQgaW50IGNvdW50ZXIgPSAxMDAwOwogCisKKwkvKgorCSAqIElmIGh3IGlzIG5vdCByZWFkeSAob3IgZGV0YWNoZWQpIGFuZCB3ZSBnZXQgYW4KKwkgKiBpbnRlcnJ1cHQsIG9yIGlmIHdlIGhhdmUgbm8gaW50ZXJydXB0cyBwZW5kaW5nCisJICogKHRoYXQgbWVhbnMgaXQncyBub3QgZm9yIHVzKSBza2lwIGl0LgorCSAqCisJICogTk9URTogR3JvdXAgMC8xIFBDSSBpbnRlcmZhY2UgcmVnaXN0ZXJzIGFyZSBub3QKKwkgKiBzdXBwb3J0ZWQgb24gV2lTT0NzLCBzbyB3ZSBjYW4ndCBjaGVjayBmb3IgcGVuZGluZworCSAqIGludGVycnVwdHMgKElTUiBiZWxvbmdzIHRvIGFub3RoZXIgcmVnaXN0ZXIgZ3JvdXAKKwkgKiBzbyB3ZSBhcmUgb2spLgorCSAqLwogCWlmICh1bmxpa2VseSh0ZXN0X2JpdChBVEhfU1RBVF9JTlZBTElELCBhaC0+c3RhdHVzKSB8fAotCQkoKGF0aDVrX2dldF9idXNfdHlwZShhaCkgIT0gQVRIX0FIQikgJiYKLQkJCQkhYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nKGFoKSkpKQorCQkJKChhdGg1a19nZXRfYnVzX3R5cGUoYWgpICE9IEFUSF9BSEIpICYmCisJCQkhYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nKGFoKSkpKQogCQlyZXR1cm4gSVJRX05PTkU7CiAKKwkvKiogTWFpbiBsb29wICoqLwogCWRvIHsKLQkJYXRoNWtfaHdfZ2V0X2lzcihhaCwgJnN0YXR1cyk7CQkvKiBOQjogY2xlYXJzIElSUSB0b28gKi8KKwkJYXRoNWtfaHdfZ2V0X2lzcihhaCwgJnN0YXR1cyk7CS8qIE5COiBjbGVhcnMgSVJRIHRvbyAqLworCiAJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfSU5UUiwgInN0YXR1cyAweCV4LzB4JXhcbiIsCiAJCQkJc3RhdHVzLCBhaC0+aW1hc2spOworCisJCS8qCisJCSAqIEZhdGFsIGh3IGVycm9yIC0+IExvZyBhbmQgcmVzZXQKKwkJICoKKwkJICogRmF0YWwgZXJyb3JzIGFyZSB1bnJlY292ZXJhYmxlIHNvIHdlIGhhdmUgdG8KKwkJICogcmVzZXQgdGhlIGNhcmQuIFRoZXNlIGVycm9ycyBpbmNsdWRlIGJ1cyBhbmQKKwkJICogZG1hIGVycm9ycy4KKwkJICovCiAJCWlmICh1bmxpa2VseShzdGF0dXMgJiBBUjVLX0lOVF9GQVRBTCkpIHsKLQkJCS8qCi0JCQkgKiBGYXRhbCBlcnJvcnMgYXJlIHVucmVjb3ZlcmFibGUuCi0JCQkgKiBUeXBpY2FsbHkgdGhlc2UgYXJlIGNhdXNlZCBieSBETUEgZXJyb3JzLgotCQkJICovCisKIAkJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsCiAJCQkJICAiZmF0YWwgaW50LCByZXNldHRpbmdcbiIpOwogCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoYWgtPmh3LCAmYWgtPnJlc2V0X3dvcmspOworCisJCS8qCisJCSAqIFJYIE92ZXJydW4gLT4gQ291bnQgYW5kIHJlc2V0IGlmIG5lZWRlZAorCQkgKgorCQkgKiBSZWNlaXZlIGJ1ZmZlcnMgYXJlIGZ1bGwuIEVpdGhlciB0aGUgYnVzIGlzIGJ1c3kgb3IKKwkJICogdGhlIENQVSBpcyBub3QgZmFzdCBlbm91Z2ggdG8gcHJvY2VzcyBhbGwgcmVjZWl2ZWQKKwkJICogZnJhbWVzLgorCQkgKi8KIAkJfSBlbHNlIGlmICh1bmxpa2VseShzdGF0dXMgJiBBUjVLX0lOVF9SWE9STikpIHsKKwogCQkJLyoKLQkJCSAqIFJlY2VpdmUgYnVmZmVycyBhcmUgZnVsbC4gRWl0aGVyIHRoZSBidXMgaXMgYnVzeSBvcgotCQkJICogdGhlIENQVSBpcyBub3QgZmFzdCBlbm91Z2ggdG8gcHJvY2VzcyBhbGwgcmVjZWl2ZWQKLQkJCSAqIGZyYW1lcy4KIAkJCSAqIE9sZGVyIGNoaXBzZXRzIG5lZWQgYSByZXNldCB0byBjb21lIG91dCBvZiB0aGlzCiAJCQkgKiBjb25kaXRpb24sIGJ1dCB3ZSB0cmVhdCBpdCBhcyBSWCBmb3IgbmV3ZXIgY2hpcHMuCi0JCQkgKiBXZSBkb24ndCBrbm93IGV4YWN0bHkgd2hpY2ggdmVyc2lvbnMgbmVlZCBhIHJlc2V0IC0KKwkJCSAqIFdlIGRvbid0IGtub3cgZXhhY3RseSB3aGljaCB2ZXJzaW9ucyBuZWVkIGEgcmVzZXQKIAkJCSAqIHRoaXMgZ3Vlc3MgaXMgY29waWVkIGZyb20gdGhlIEhBTC4KIAkJCSAqLwogCQkJYWgtPnN0YXRzLnJ4b3JuX2ludHIrKzsKKwogCQkJaWYgKGFoLT5haF9tYWNfc3JldiA8IEFSNUtfU1JFVl9BUjUyMTIpIHsKIAkJCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX1JFU0VULAogCQkJCQkgICJyeCBvdmVycnVuLCByZXNldHRpbmdcbiIpOwogCQkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKGFoLT5odywgJmFoLT5yZXNldF93b3JrKTsKIAkJCX0gZWxzZQogCQkJCWF0aDVrX3NjaGVkdWxlX3J4KGFoKTsKKwogCQl9IGVsc2UgeworCisJCQkvKiBTb2Z0d2FyZSBCZWFjb24gQWxlcnQgLT4gU2NoZWR1bGUgYmVhY29uIHRhc2tsZXQgKi8KIAkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9TV0JBKQogCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJmFoLT5iZWFjb250cSk7CiAKLQkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9SWEVPTCkgewotCQkJCS8qCi0JCQkJKiBOQjogdGhlIGhhcmR3YXJlIHNob3VsZCByZS1yZWFkIHRoZSBsaW5rIHdoZW4KLQkJCQkqICAgICBSWEUgYml0IGlzIHdyaXR0ZW4sIGJ1dCBpdCBkb2Vzbid0IHdvcmsgYXQKLQkJCQkqICAgICBsZWFzdCBvbiBvbGRlciBoYXJkd2FyZSByZXZzLgotCQkJCSovCisJCQkvKgorCQkJICogTm8gbW9yZSBSWCBkZXNjcmlwdG9ycyAtPiBKdXN0IGNvdW50CisJCQkgKgorCQkJICogTkI6IHRoZSBoYXJkd2FyZSBzaG91bGQgcmUtcmVhZCB0aGUgbGluayB3aGVuCisJCQkgKiAgICAgUlhFIGJpdCBpcyB3cml0dGVuLCBidXQgaXQgZG9lc24ndCB3b3JrIGF0CisJCQkgKiAgICAgbGVhc3Qgb24gb2xkZXIgaGFyZHdhcmUgcmV2cy4KKwkJCSAqLworCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX1JYRU9MKQogCQkJCWFoLT5zdGF0cy5yeGVvbF9pbnRyKys7Ci0JCQl9Ci0JCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfVFhVUk4pIHsKLQkJCQkvKiBidW1wIHR4IHRyaWdnZXIgbGV2ZWwgKi8KKworCisJCQkvKiBUWCBVbmRlcnJ1biAtPiBCdW1wIHR4IHRyaWdnZXIgbGV2ZWwgKi8KKwkJCWlmIChzdGF0dXMgJiBBUjVLX0lOVF9UWFVSTikKIAkJCQlhdGg1a19od191cGRhdGVfdHhfdHJpZ2xldmVsKGFoLCB0cnVlKTsKLQkJCX0KKworCQkJLyogUlggLT4gU2NoZWR1bGUgcnggdGFza2xldCAqLwogCQkJaWYgKHN0YXR1cyAmIChBUjVLX0lOVF9SWE9LIHwgQVI1S19JTlRfUlhFUlIpKQogCQkJCWF0aDVrX3NjaGVkdWxlX3J4KGFoKTsKLQkJCWlmIChzdGF0dXMgJiAoQVI1S19JTlRfVFhPSyB8IEFSNUtfSU5UX1RYREVTQwotCQkJCQl8IEFSNUtfSU5UX1RYRVJSIHwgQVI1S19JTlRfVFhFT0wpKQorCisJCQkvKiBUWCAtPiBTY2hlZHVsZSB0eCB0YXNrbGV0ICovCisJCQlpZiAoc3RhdHVzICYgKEFSNUtfSU5UX1RYT0sKKwkJCQkJfCBBUjVLX0lOVF9UWERFU0MKKwkJCQkJfCBBUjVLX0lOVF9UWEVSUgorCQkJCQl8IEFSNUtfSU5UX1RYRU9MKSkKIAkJCQlhdGg1a19zY2hlZHVsZV90eChhaCk7Ci0JCQlpZiAoc3RhdHVzICYgQVI1S19JTlRfQk1JU1MpIHsKLQkJCQkvKiBUT0RPICovCi0JCQl9CisKKwkJCS8qIE1pc3NlZCBiZWFjb24gLT4gVE9ETworCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX0JNSVNTKQorCQkJKi8KKworCQkJLyogTUlCIGV2ZW50IC0+IFVwZGF0ZSBjb3VudGVycyBhbmQgbm90aWZ5IEFOSSAqLwogCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX01JQikgewogCQkJCWFoLT5zdGF0cy5taWJfaW50cisrOwogCQkJCWF0aDVrX2h3X3VwZGF0ZV9taWJfY291bnRlcnMoYWgpOwogCQkJCWF0aDVrX2FuaV9taWJfaW50cihhaCk7CiAJCQl9CisKKwkJCS8qIEdQSU8gLT4gTm90aWZ5IFJGS2lsbCBsYXllciAqLwogCQkJaWYgKHN0YXR1cyAmIEFSNUtfSU5UX0dQSU8pCiAJCQkJdGFza2xldF9zY2hlZHVsZSgmYWgtPnJmX2tpbGwudG9nZ2xlcSk7CiAKQEAgLTIyMjIsMTIgKzIyODMsMTkgQEAKIAogCX0gd2hpbGUgKGF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhhaCkgJiYgLS1jb3VudGVyID4gMCk7CiAKKwkvKgorCSAqIFVudGlsIHdlIGhhbmRsZSByeC90eCBpbnRlcnJ1cHRzIG1hc2sgdGhlbSBvbiBJTVIKKwkgKgorCSAqIE5PVEU6IGFoLT4ocngvdHgpX3BlbmRpbmcgYXJlIHNldCB3aGVuIHNjaGVkdWxpbmcgdGhlIHRhc2tsZXRzCisJICogYW5kIHVuc2V0IGFmdGVyIHdlICd2ZSBoYW5kbGVkIHRoZSBpbnRlcnJ1cHRzLgorCSAqLwogCWlmIChhaC0+cnhfcGVuZGluZyB8fCBhaC0+dHhfcGVuZGluZykKIAkJYXRoNWtfc2V0X2N1cnJlbnRfaW1hc2soYWgpOwogCiAJaWYgKHVubGlrZWx5KCFjb3VudGVyKSkKIAkJQVRINUtfV0FSTihhaCwgInRvbyBtYW55IGludGVycnVwdHMsIGdpdmluZyB1cCBmb3Igbm93XG4iKTsKIAorCS8qIEZpcmUgdXAgY2FsaWJyYXRpb24gcG9sbCAqLwogCWF0aDVrX2ludHJfY2FsaWJyYXRpb25fcG9sbChhaCk7CiAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CkBAIC0yMjM4LDQxICsyMzA2LDU4IEBACiAgKiBmb3IgdGVtcGVyYXR1cmUvZW52aXJvbm1lbnQgY2hhbmdlcy4KICAqLwogc3RhdGljIHZvaWQKLWF0aDVrX3Rhc2tsZXRfY2FsaWJyYXRlKHVuc2lnbmVkIGxvbmcgZGF0YSkKK2F0aDVrX2NhbGlicmF0ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgYXRoNWtfaHcgKmFoID0gKHZvaWQgKilkYXRhOworCXN0cnVjdCBhdGg1a19odyAqYWggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGF0aDVrX2h3LAorCQljYWxpYl93b3JrKTsKIAotCS8qIE9ubHkgZnVsbCBjYWxpYnJhdGlvbiBmb3Igbm93ICovCi0JYWgtPmFoX2NhbF9tYXNrIHw9IEFSNUtfQ0FMSUJSQVRJT05fRlVMTDsKKwkvKiBTaG91bGQgd2UgcnVuIGEgZnVsbCBjYWxpYnJhdGlvbiA/ICovCisJaWYgKHRpbWVfaXNfYmVmb3JlX2VxX2ppZmZpZXMoYWgtPmFoX2NhbF9uZXh0X2Z1bGwpKSB7CisKKwkJYWgtPmFoX2NhbF9uZXh0X2Z1bGwgPSBqaWZmaWVzICsKKwkJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9GVUxMKTsKKwkJYWgtPmFoX2NhbF9tYXNrIHw9IEFSNUtfQ0FMSUJSQVRJT05fRlVMTDsKKworCQlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwKKwkJCQkicnVubmluZyBmdWxsIGNhbGlicmF0aW9uXG4iKTsKKworCQlpZiAoYXRoNWtfaHdfZ2FpbmZfY2FsaWJyYXRlKGFoKSA9PSBBUjVLX1JGR0FJTl9ORUVEX0NIQU5HRSkgeworCQkJLyoKKwkJCSAqIFJmZ2FpbiBpcyBvdXQgb2YgYm91bmRzLCByZXNldCB0aGUgY2hpcAorCQkJICogdG8gbG9hZCBuZXcgZ2FpbiB2YWx1ZXMuCisJCQkgKi8KKwkJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsCisJCQkJCSJnb3QgbmV3IHJmZ2FpbiwgcmVzZXR0aW5nXG4iKTsKKwkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKGFoLT5odywgJmFoLT5yZXNldF93b3JrKTsKKwkJfQorCisJCS8qIFRPRE86IE9uIGZ1bGwgY2FsaWJyYXRpb24gd2Ugc2hvdWxkIHN0b3AgVFggaGVyZSwKKwkJICogc28gdGhhdCBpdCBkb2Vzbid0IGludGVyZmVyZSAobW9zdGx5IGR1ZSB0byBnYWluX2YKKwkJICogY2FsaWJyYXRpb24gdGhhdCBtZXNzZXMgd2l0aCB0eCBwYWNrZXRzIC1zZWUgcGh5LmMpLgorCQkgKgorCQkgKiBOT1RFOiBTdG9wcGluZyB0aGUgcXVldWVzIGZyb20gYWJvdmUgaXMgbm90IGVub3VnaAorCQkgKiB0byBzdG9wIFRYIGJ1dCBzYXZlcyB1cyBmcm9tIGRpc2NvbmVjdGluZyAoYXQgbGVhc3QKKwkJICogd2UgZG9uJ3QgbG9zZSBwYWNrZXRzKS4gKi8KKwkJaWVlZTgwMjExX3N0b3BfcXVldWVzKGFoLT5odyk7CisJfSBlbHNlCisJCWFoLT5haF9jYWxfbWFzayB8PSBBUjVLX0NBTElCUkFUSU9OX1NIT1JUOworCiAKIAlBVEg1S19EQkcoYWgsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwgImNoYW5uZWwgJXUvJXhcbiIsCiAJCWllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChhaC0+Y3VyY2hhbi0+Y2VudGVyX2ZyZXEpLAogCQlhaC0+Y3VyY2hhbi0+aHdfdmFsdWUpOwogCi0JaWYgKGF0aDVrX2h3X2dhaW5mX2NhbGlicmF0ZShhaCkgPT0gQVI1S19SRkdBSU5fTkVFRF9DSEFOR0UpIHsKLQkJLyoKLQkJICogUmZnYWluIGlzIG91dCBvZiBib3VuZHMsIHJlc2V0IHRoZSBjaGlwCi0JCSAqIHRvIGxvYWQgbmV3IGdhaW4gdmFsdWVzLgotCQkgKi8KLQkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19SRVNFVCwgImNhbGlicmF0aW9uLCByZXNldHRpbmdcbiIpOwotCQlpZWVlODAyMTFfcXVldWVfd29yayhhaC0+aHcsICZhaC0+cmVzZXRfd29yayk7Ci0JfQogCWlmIChhdGg1a19od19waHlfY2FsaWJyYXRlKGFoLCBhaC0+Y3VyY2hhbikpCiAJCUFUSDVLX0VSUihhaCwgImNhbGlicmF0aW9uIG9mIGNoYW5uZWwgJXUgZmFpbGVkXG4iLAogCQkJaWVlZTgwMjExX2ZyZXF1ZW5jeV90b19jaGFubmVsKAogCQkJCWFoLT5jdXJjaGFuLT5jZW50ZXJfZnJlcSkpOwogCi0JLyogTm9pc2UgZmxvb3IgY2FsaWJyYXRpb24gaW50ZXJydXB0cyByeC90eCBwYXRoIHdoaWxlIEkvUSBjYWxpYnJhdGlvbgotCSAqIGRvZXNuJ3QuCi0JICogVE9ETzogV2Ugc2hvdWxkIHN0b3AgVFggaGVyZSwgc28gdGhhdCBpdCBkb2Vzbid0IGludGVyZmVyZS4KLQkgKiBOb3RlIHRoYXQgc3RvcHBpbmcgdGhlIHF1ZXVlcyBpcyBub3QgZW5vdWdoIHRvIHN0b3AgVFghICovCi0JaWYgKHRpbWVfaXNfYmVmb3JlX2VxX2ppZmZpZXMoYWgtPmFoX2NhbF9uZXh0X25mKSkgewotCQlhaC0+YWhfY2FsX25leHRfbmYgPSBqaWZmaWVzICsKLQkJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9ORik7Ci0JCWF0aDVrX2h3X3VwZGF0ZV9ub2lzZV9mbG9vcihhaCk7Ci0JfQotCi0JYWgtPmFoX2NhbF9tYXNrICY9IH5BUjVLX0NBTElCUkFUSU9OX0ZVTEw7CisJLyogQ2xlYXIgY2FsaWJyYXRpb24gZmxhZ3MgKi8KKwlpZiAoYWgtPmFoX2NhbF9tYXNrICYgQVI1S19DQUxJQlJBVElPTl9GVUxMKSB7CisJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhhaC0+aHcpOworCQlhaC0+YWhfY2FsX21hc2sgJj0gfkFSNUtfQ0FMSUJSQVRJT05fRlVMTDsKKwl9IGVsc2UgaWYgKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fU0hPUlQpCisJCWFoLT5haF9jYWxfbWFzayAmPSB+QVI1S19DQUxJQlJBVElPTl9TSE9SVDsKIH0KIAogCkBAIC0yNDA3LDggKzI0OTIsOCBAQAogCWlmIChyZXQpCiAJCWdvdG8gZXJyX2lycTsKIAotCS8qIHNldCB1cCBtdWx0aS1yYXRlIHJldHJ5IGNhcGFiaWxpdGllcyAqLwotCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikgeworCS8qIFNldCB1cCBtdWx0aS1yYXRlIHJldHJ5IGNhcGFiaWxpdGllcyAqLworCWlmIChhaC0+YWhfY2FwYWJpbGl0aWVzLmNhcF9oYXNfbXJyX3N1cHBvcnQpIHsKIAkJaHctPm1heF9yYXRlcyA9IDQ7CiAJCWh3LT5tYXhfcmF0ZV90cmllcyA9IG1heChBUjVLX0lOSVRfUkVUUllfU0hPUlQsCiAJCQkJCSBBUjVLX0lOSVRfUkVUUllfTE9ORyk7CkBAIC0yNTQ0LDE1ICsyNjI5LDIyIEBACiAJICogYW5kIHRoZW4gc2V0dXAgb2YgdGhlIGludGVycnVwdCBtYXNrLgogCSAqLwogCWFoLT5jdXJjaGFuID0gYWgtPmh3LT5jb25mLmNoYW5uZWw7Ci0JYWgtPmltYXNrID0gQVI1S19JTlRfUlhPSyB8IEFSNUtfSU5UX1JYRVJSIHwgQVI1S19JTlRfUlhFT0wgfAotCQlBUjVLX0lOVF9SWE9STiB8IEFSNUtfSU5UX1RYREVTQyB8IEFSNUtfSU5UX1RYRU9MIHwKLQkJQVI1S19JTlRfRkFUQUwgfCBBUjVLX0lOVF9HTE9CQUwgfCBBUjVLX0lOVF9NSUI7CisJYWgtPmltYXNrID0gQVI1S19JTlRfUlhPSworCQl8IEFSNUtfSU5UX1JYRVJSCisJCXwgQVI1S19JTlRfUlhFT0wKKwkJfCBBUjVLX0lOVF9SWE9STgorCQl8IEFSNUtfSU5UX1RYREVTQworCQl8IEFSNUtfSU5UX1RYRU9MCisJCXwgQVI1S19JTlRfRkFUQUwKKwkJfCBBUjVLX0lOVF9HTE9CQUwKKwkJfCBBUjVLX0lOVF9NSUI7CiAKIAlyZXQgPSBhdGg1a19yZXNldChhaCwgTlVMTCwgZmFsc2UpOwogCWlmIChyZXQpCiAJCWdvdG8gZG9uZTsKIAotCWF0aDVrX3Jma2lsbF9od19zdGFydChhaCk7CisJaWYgKCFhdGg1a19tb2RwYXJhbV9ub19od19yZmtpbGxfc3dpdGNoKQorCQlhdGg1a19yZmtpbGxfaHdfc3RhcnQoYWgpOwogCiAJLyoKIAkgKiBSZXNldCB0aGUga2V5IGNhY2hlIHNpbmNlIHNvbWUgcGFydHMgZG8gbm90IHJlc2V0IHRoZQpAQCAtMjU4NSw3ICsyNjc3LDYgQEAKIAlhaC0+dHhfcGVuZGluZyA9IGZhbHNlOwogCXRhc2tsZXRfa2lsbCgmYWgtPnJ4dHEpOwogCXRhc2tsZXRfa2lsbCgmYWgtPnR4dHEpOwotCXRhc2tsZXRfa2lsbCgmYWgtPmNhbGliKTsKIAl0YXNrbGV0X2tpbGwoJmFoLT5iZWFjb250cSk7CiAJdGFza2xldF9raWxsKCZhaC0+YW5pX3Rhc2tsZXQpOwogfQpAQCAtMjYzNyw3ICsyNzI4LDggQEAKIAogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmYWgtPnR4X2NvbXBsZXRlX3dvcmspOwogCi0JYXRoNWtfcmZraWxsX2h3X3N0b3AoYWgpOworCWlmICghYXRoNWtfbW9kcGFyYW1fbm9faHdfcmZraWxsX3N3aXRjaCkKKwkJYXRoNWtfcmZraWxsX2h3X3N0b3AoYWgpOwogfQogCiAvKgpAQCAtMjY4OSw5ICsyNzgxLDI0IEBACiAKIAlhdGg1a19hbmlfaW5pdChhaCwgYW5pX21vZGUpOwogCi0JYWgtPmFoX2NhbF9uZXh0X2Z1bGwgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOwotCWFoLT5haF9jYWxfbmV4dF9hbmkgPSBqaWZmaWVzOwotCWFoLT5haF9jYWxfbmV4dF9uZiA9IGppZmZpZXM7CisJLyoKKwkgKiBTZXQgY2FsaWJyYXRpb24gaW50ZXJ2YWxzCisJICoKKwkgKiBOb3RlOiBXZSBkb24ndCBuZWVkIHRvIHJ1biBjYWxpYnJhdGlvbiBpbWVkaWF0ZWx5CisJICogc2luY2Ugc29tZSBpbml0aWFsIGNhbGlicmF0aW9uIGlzIGRvbmUgb24gcmVzZXQKKwkgKiBldmVuIGZvciBmYXN0IGNoYW5uZWwgc3dpdGNoaW5nLiBBbHNvIG9uIHNjYW5uaW5nCisJICogdGhpcyB3aWxsIGdldCBzZXQgYWdhaW4gYW5kIGFnYWluIGFuZCBpdCB3b24ndCBnZXQKKwkgKiBleGVjdXRlZCB1bmxlc3Mgd2UgY29ubmVjdCBzb21ld2hlcmUgYW5kIHNwZW5kIHNvbWUKKwkgKiB0aW1lIG9uIHRoZSBjaGFubmVsICh0aGF0J3Mgd2hhdCBjYWxpYnJhdGlvbiBuZWVkcworCSAqIGFueXdheSB0byBiZSBhY2N1cmF0ZSkuCisJICovCisJYWgtPmFoX2NhbF9uZXh0X2Z1bGwgPSBqaWZmaWVzICsKKwkJbXNlY3NfdG9famlmZmllcyhBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0ZVTEwpOworCWFoLT5haF9jYWxfbmV4dF9hbmkgPSBqaWZmaWVzICsKKwkJbXNlY3NfdG9famlmZmllcyhBVEg1S19UVU5FX0NBTElCUkFUSU9OX0lOVEVSVkFMX0FOSSk7CisJYWgtPmFoX2NhbF9uZXh0X3Nob3J0ID0gamlmZmllcyArCisJCW1zZWNzX3RvX2ppZmZpZXMoQVRINUtfVFVORV9DQUxJQlJBVElPTl9JTlRFUlZBTF9TSE9SVCk7CisKIAlld21hX2luaXQoJmFoLT5haF9iZWFjb25fcnNzaV9hdmcsIDEwMjQsIDgpOwogCiAJLyogY2xlYXIgc3VydmV5IGRhdGEgYW5kIGN5Y2xlIGNvdW50ZXJzICovCkBAIC0yNzQ1LDIwICsyODUyLDYgQEAKIAogCiAJLyoKLQkgKiBDaGVjayBpZiB0aGUgTUFDIGhhcyBtdWx0aS1yYXRlIHJldHJ5IHN1cHBvcnQuCi0JICogV2UgZG8gdGhpcyBieSB0cnlpbmcgdG8gc2V0dXAgYSBmYWtlIGV4dGVuZGVkCi0JICogZGVzY3JpcHRvci4gIE1BQ3MgdGhhdCBkb24ndCBoYXZlIHN1cHBvcnQgd2lsbAotCSAqIHJldHVybiBmYWxzZSB3L28gZG9pbmcgYW55dGhpbmcuICBNQUNzIHRoYXQgZG8KLQkgKiBzdXBwb3J0IGl0IHdpbGwgcmV0dXJuIHRydWUgdy9vIGRvaW5nIGFueXRoaW5nLgotCSAqLwotCXJldCA9IGF0aDVrX2h3X3NldHVwX21ycl90eF9kZXNjKGFoLCBOVUxMLCAwLCAwLCAwLCAwLCAwLCAwKTsKLQotCWlmIChyZXQgPCAwKQotCQlnb3RvIGVycjsKLQlpZiAocmV0ID4gMCkKLQkJX19zZXRfYml0KEFUSF9TVEFUX01SUkVUUlksIGFoLT5zdGF0dXMpOwotCi0JLyoKIAkgKiBDb2xsZWN0IHRoZSBjaGFubmVsIGxpc3QuICBUaGUgODAyLjExIGxheWVyCiAJICogaXMgcmVzcG9uc2libGUgZm9yIGZpbHRlcmluZyB0aGlzIGxpc3QgYmFzZWQKIAkgKiBvbiBzZXR0aW5ncyBsaWtlIHRoZSBwaHkgbW9kZSBhbmQgcmVndWxhdG9yeQpAQCAtMjg0MSwxMSArMjkzNCwxMSBAQAogCiAJdGFza2xldF9pbml0KCZhaC0+cnh0cSwgYXRoNWtfdGFza2xldF9yeCwgKHVuc2lnbmVkIGxvbmcpYWgpOwogCXRhc2tsZXRfaW5pdCgmYWgtPnR4dHEsIGF0aDVrX3Rhc2tsZXRfdHgsICh1bnNpZ25lZCBsb25nKWFoKTsKLQl0YXNrbGV0X2luaXQoJmFoLT5jYWxpYiwgYXRoNWtfdGFza2xldF9jYWxpYnJhdGUsICh1bnNpZ25lZCBsb25nKWFoKTsKIAl0YXNrbGV0X2luaXQoJmFoLT5iZWFjb250cSwgYXRoNWtfdGFza2xldF9iZWFjb24sICh1bnNpZ25lZCBsb25nKWFoKTsKIAl0YXNrbGV0X2luaXQoJmFoLT5hbmlfdGFza2xldCwgYXRoNWtfdGFza2xldF9hbmksICh1bnNpZ25lZCBsb25nKWFoKTsKIAogCUlOSVRfV09SSygmYWgtPnJlc2V0X3dvcmssIGF0aDVrX3Jlc2V0X3dvcmspOworCUlOSVRfV09SSygmYWgtPmNhbGliX3dvcmssIGF0aDVrX2NhbGlicmF0ZV93b3JrKTsKIAlJTklUX0RFTEFZRURfV09SSygmYWgtPnR4X2NvbXBsZXRlX3dvcmssIGF0aDVrX3R4X2NvbXBsZXRlX3BvbGxfd29yayk7CiAKIAlyZXQgPSBhdGg1a19od19jb21tb24oYWgpLT5idXNfb3BzLT5lZXByb21fcmVhZF9tYWMoYWgsIG1hYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvY2Fwcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2NhcHMuYwppbmRleCA4MTBmYmE5Li45OTQxNjlhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvY2Fwcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9jYXBzLmMKQEAgLTg1LDEyICs4NSwxOSBAQAogCQkJY2Fwcy0+Y2FwX3JhbmdlLnJhbmdlXzJnaHpfbWluID0gMjQxMjsKIAkJCWNhcHMtPmNhcF9yYW5nZS5yYW5nZV8yZ2h6X21heCA9IDI3MzI7CiAKLQkJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFCKGVlX2hlYWRlcikpCi0JCQkJX19zZXRfYml0KEFSNUtfTU9ERV8xMUIsIGNhcHMtPmNhcF9tb2RlKTsKKwkJCS8qIE92ZXJyaWRlIDJHSHogbW9kZXMgb24gU29DcyB0aGF0IG5lZWQgaXQKKwkJCSAqIE5PVEU6IGNhcF9uZWVkc18yR0h6X292ciBnZXRzIHNldCBmcm9tCisJCQkgKiBhdGhfYWhiX3Byb2JlICovCisJCQlpZiAoIWNhcHMtPmNhcF9uZWVkc18yR0h6X292cikgeworCQkJCWlmIChBUjVLX0VFUFJPTV9IRFJfMTFCKGVlX2hlYWRlcikpCisJCQkJCV9fc2V0X2JpdChBUjVLX01PREVfMTFCLAorCQkJCQkJCWNhcHMtPmNhcF9tb2RlKTsKIAotCQkJaWYgKEFSNUtfRUVQUk9NX0hEUl8xMUcoZWVfaGVhZGVyKSAmJgotCQkJICAgIGFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjExKQotCQkJCV9fc2V0X2JpdChBUjVLX01PREVfMTFHLCBjYXBzLT5jYXBfbW9kZSk7CisJCQkJaWYgKEFSNUtfRUVQUk9NX0hEUl8xMUcoZWVfaGVhZGVyKSAmJgorCQkJCWFoLT5haF92ZXJzaW9uICE9IEFSNUtfQVI1MjExKQorCQkJCQlfX3NldF9iaXQoQVI1S19NT0RFXzExRywKKwkJCQkJCQljYXBzLT5jYXBfbW9kZSk7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTEwMywxMiArMTEwLDE4IEBACiAJZWxzZQogCQljYXBzLT5jYXBfcXVldWVzLnFfdHhfbnVtID0gQVI1S19OVU1fVFhfUVVFVUVTOwogCi0JLyogbmV3ZXIgaGFyZHdhcmUgaGFzIFBIWSBlcnJvciBjb3VudGVycyAqLworCS8qIE5ld2VyIGhhcmR3YXJlIGhhcyBQSFkgZXJyb3IgY291bnRlcnMgKi8KIAlpZiAoYWgtPmFoX21hY19zcmV2ID49IEFSNUtfU1JFVl9BUjUyMTNBKQogCQljYXBzLT5jYXBfaGFzX3BoeWVycl9jb3VudGVycyA9IHRydWU7CiAJZWxzZQogCQljYXBzLT5jYXBfaGFzX3BoeWVycl9jb3VudGVycyA9IGZhbHNlOwogCisJLyogTUFDcyBzaW5jZSBBUjUyMTIgaGF2ZSBNUlIgc3VwcG9ydCAqLworCWlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMikKKwkJY2Fwcy0+Y2FwX2hhc19tcnJfc3VwcG9ydCA9IHRydWU7CisJZWxzZQorCQljYXBzLT5jYXBfaGFzX21ycl9zdXBwb3J0ID0gZmFsc2U7CisKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmMKaW5kZXggN2U4OGRkYS4uZjhiZmEzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZGVzYy5jCkBAIC0yNiwyMCArMjYsNjEgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAKKy8qKgorICogRE9DOiBIYXJkd2FyZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucworICoKKyAqIEhlcmUgd2UgaGFuZGxlIHRoZSBwcm9jZXNzaW5nIG9mIHRoZSBsb3ctbGV2ZWwgaHcgZGVzY3JpcHRvcnMKKyAqIHRoYXQgaHcgcmVhZHMgYW5kIHdyaXRlcyB2aWEgRE1BIGZvciBlYWNoIFRYIGFuZCBSWCBhdHRlbXB0ICh0aGF0IG1lYW5zCisgKiB3ZSBjYW4gYWxzbyBoYXZlIGRlc2NyaXB0b3JzIGZvciBmYWlsZWQgVFgvUlggdHJpZXMpLiBXZSBoYXZlIHR3byBraW5kIG9mCisgKiBkZXNjcmlwdG9ycyBmb3IgUlggYW5kIFRYLCBjb250cm9sIGRlc2NyaXB0b3JzIHRlbGwgdGhlIGh3IGhvdyB0byBzZW5kIG9yCisgKiByZWNlaXZlIGEgcGFja2V0IHdoZXJlIHRvIHJlYWQvd3JpdGUgaXQgZnJvbS90byBldGMgYW5kIHN0YXR1cyBkZXNjcmlwdG9ycworICogdGhhdCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgcGFja2V0IHdhcyBzZW50IG9yIHJlY2VpdmVkIChlcnJvcnMKKyAqIGluY2x1ZGVkKS4KKyAqCisgKiBEZXNjcmlwdG9yIGZvcm1hdCBpcyBub3QgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCBNQUMgY2hpcCB2ZXJzaW9uIHNvIHdlCisgKiBoYXZlIGZ1bmN0aW9uIHBvaW50ZXJzIG9uICZzdHJ1Y3QgYXRoNWtfaHcgd2UgaW5pdGlhbGl6ZSBhdCBydW50aW1lIGJhc2VkIG9uCisgKiB0aGUgY2hpcCB1c2VkLgorICovCisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKlwKICogVFggQ29udHJvbCBkZXNjcmlwdG9ycyAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogSW5pdGlhbGl6ZSB0aGUgMi13b3JkIHR4IGNvbnRyb2wgZGVzY3JpcHRvciBvbiA1MjEwLzUyMTEKKy8qKgorICogYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYygpIC0gSW5pdGlhbGl6ZSBhIDItd29yZCB0eCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAcGt0X2xlbjogRnJhbWUgbGVuZ3RoIGluIGJ5dGVzCisgKiBAaGRyX2xlbjogSGVhZGVyIGxlbmd0aCBpbiBieXRlcyAob25seSB1c2VkIG9uIEFSNTIxMCkKKyAqIEBwYWRzaXplOiBBbnkgcGFkZGluZyB3ZSd2ZSBhZGRlZCB0byB0aGUgZnJhbWUgbGVuZ3RoCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcGt0X3R5cGUKKyAqIEB0eF9wb3dlcjogVHggcG93ZXIgaW4gMC41ZEIgc3RlcHMKKyAqIEB0eF9yYXRlMDogSFcgaWR4IGZvciB0cmFuc21pc3Npb24gcmF0ZQorICogQHR4X3RyaWVzMDogTWF4IG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMKKyAqIEBrZXlfaW5kZXg6IEluZGV4IG9uIGtleSB0YWJsZSB0byB1c2UgZm9yIGVuY3J5cHRpb24KKyAqIEBhbnRlbm5hX21vZGU6IFdoaWNoIGFudGVubmEgdG8gdXNlICgwIGZvciBhdXRvKQorICogQGZsYWdzOiBPbmUgb2YgQVI1S19UWERFU0NfKiBmbGFncyAoZGVzYy5oKQorICogQHJ0c2N0c19yYXRlOiBIVyBpZHggZm9yIFJUUy9DVFMgdHJhbnNtaXNzaW9uIHJhdGUKKyAqIEBydHNjdHNfZHVyYXRpb246IFdoYXQgdG8gcHV0IG9uIGR1cmF0aW9uIGZpZWxkIG9uIHRoZSBoZWFkZXIgb2YgUlRTL0NUUworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYSAyLVdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisgKiBmb3VuZCBvbiBBUjUyMTAgYW5kIEFSNTIxMSBNQUNzIGNoaXBzLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU5WQUwgb24gZmFsc2UgaW5wdXQKICAqLwogc3RhdGljIGludAotYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKLQl1bnNpZ25lZCBpbnQgcGt0X2xlbiwgdW5zaWduZWQgaW50IGhkcl9sZW4sIGludCBwYWRzaXplLAotCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwKLQl1bnNpZ25lZCBpbnQgdHhfcG93ZXIsIHVuc2lnbmVkIGludCB0eF9yYXRlMCwgdW5zaWduZWQgaW50IHR4X3RyaWVzMCwKLQl1bnNpZ25lZCBpbnQga2V5X2luZGV4LCB1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLCB1bnNpZ25lZCBpbnQgcnRzY3RzX2R1cmF0aW9uKQorYXRoNWtfaHdfc2V0dXBfMndvcmRfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCisJCQl1bnNpZ25lZCBpbnQgcGt0X2xlbiwgdW5zaWduZWQgaW50IGhkcl9sZW4sCisJCQlpbnQgcGFkc2l6ZSwKKwkJCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwKKwkJCXVuc2lnbmVkIGludCB0eF9wb3dlciwKKwkJCXVuc2lnbmVkIGludCB0eF9yYXRlMCwgdW5zaWduZWQgaW50IHR4X3RyaWVzMCwKKwkJCXVuc2lnbmVkIGludCBrZXlfaW5kZXgsCisJCQl1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLAorCQkJdW5zaWduZWQgaW50IGZsYWdzLAorCQkJdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLCB1bnNpZ25lZCBpbnQgcnRzY3RzX2R1cmF0aW9uKQogewogCXUzMiBmcmFtZV90eXBlOwogCXN0cnVjdCBhdGg1a19od18yd190eF9jdGwgKnR4X2N0bDsKQEAgLTE3MiwxNyArMjEzLDQwIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBJbml0aWFsaXplIHRoZSA0LXdvcmQgdHggY29udHJvbCBkZXNjcmlwdG9yIG9uIDUyMTIKKy8qKgorICogYXRoNWtfaHdfc2V0dXBfNHdvcmRfdHhfZGVzYygpIC0gSW5pdGlhbGl6ZSBhIDQtd29yZCB0eCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAcGt0X2xlbjogRnJhbWUgbGVuZ3RoIGluIGJ5dGVzCisgKiBAaGRyX2xlbjogSGVhZGVyIGxlbmd0aCBpbiBieXRlcyAob25seSB1c2VkIG9uIEFSNTIxMCkKKyAqIEBwYWRzaXplOiBBbnkgcGFkZGluZyB3ZSd2ZSBhZGRlZCB0byB0aGUgZnJhbWUgbGVuZ3RoCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcGt0X3R5cGUKKyAqIEB0eF9wb3dlcjogVHggcG93ZXIgaW4gMC41ZEIgc3RlcHMKKyAqIEB0eF9yYXRlMDogSFcgaWR4IGZvciB0cmFuc21pc3Npb24gcmF0ZQorICogQHR4X3RyaWVzMDogTWF4IG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMKKyAqIEBrZXlfaW5kZXg6IEluZGV4IG9uIGtleSB0YWJsZSB0byB1c2UgZm9yIGVuY3J5cHRpb24KKyAqIEBhbnRlbm5hX21vZGU6IFdoaWNoIGFudGVubmEgdG8gdXNlICgwIGZvciBhdXRvKQorICogQGZsYWdzOiBPbmUgb2YgQVI1S19UWERFU0NfKiBmbGFncyAoZGVzYy5oKQorICogQHJ0c2N0c19yYXRlOiBIVyBpZHggZm9yIFJUUy9DVFMgdHJhbnNtaXNzaW9uIHJhdGUKKyAqIEBydHNjdHNfZHVyYXRpb246IFdoYXQgdG8gcHV0IG9uIGR1cmF0aW9uIGZpZWxkIG9uIHRoZSBoZWFkZXIgb2YgUlRTL0NUUworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYSA0LVdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisgKiBmb3VuZCBvbiBBUjUyMTIgYW5kIGxhdGVyIE1BQ3MgY2hpcHMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBmYWxzZSBpbnB1dAogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3NldHVwXzR3b3JkX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwKLQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IHBrdF9sZW4sIHVuc2lnbmVkIGludCBoZHJfbGVuLAotCWludCBwYWRzaXplLAotCWVudW0gYXRoNWtfcGt0X3R5cGUgdHlwZSwgdW5zaWduZWQgaW50IHR4X3Bvd2VyLCB1bnNpZ25lZCBpbnQgdHhfcmF0ZTAsCi0JdW5zaWduZWQgaW50IHR4X3RyaWVzMCwgdW5zaWduZWQgaW50IGtleV9pbmRleCwKLQl1bnNpZ25lZCBpbnQgYW50ZW5uYV9tb2RlLCB1bnNpZ25lZCBpbnQgZmxhZ3MsCi0JdW5zaWduZWQgaW50IHJ0c2N0c19yYXRlLAotCXVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCitzdGF0aWMgaW50CithdGg1a19od19zZXR1cF80d29yZF90eF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCXVuc2lnbmVkIGludCBwa3RfbGVuLCB1bnNpZ25lZCBpbnQgaGRyX2xlbiwKKwkJCWludCBwYWRzaXplLAorCQkJZW51bSBhdGg1a19wa3RfdHlwZSB0eXBlLAorCQkJdW5zaWduZWQgaW50IHR4X3Bvd2VyLAorCQkJdW5zaWduZWQgaW50IHR4X3JhdGUwLCB1bnNpZ25lZCBpbnQgdHhfdHJpZXMwLAorCQkJdW5zaWduZWQgaW50IGtleV9pbmRleCwKKwkJCXVuc2lnbmVkIGludCBhbnRlbm5hX21vZGUsCisJCQl1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQl1bnNpZ25lZCBpbnQgcnRzY3RzX3JhdGUsIHVuc2lnbmVkIGludCBydHNjdHNfZHVyYXRpb24pCiB7CiAJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOwogCXVuc2lnbmVkIGludCBmcmFtZV9sZW47CkBAIC0yOTIsMTMgKzM1NiwyOSBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogSW5pdGlhbGl6ZSBhIDQtd29yZCBtdWx0aSByYXRlIHJldHJ5IHR4IGNvbnRyb2wgZGVzY3JpcHRvciBvbiA1MjEyCisvKioKKyAqIGF0aDVrX2h3X3NldHVwX21ycl90eF9kZXNjKCkgLSBJbml0aWFsaXplIGFuIE1SUiB0eCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAdHhfcmF0ZTE6IEhXIGlkeCBmb3IgcmF0ZSB1c2VkIG9uIHRyYW5zbWlzc2lvbiBzZXJpZXMgMQorICogQHR4X3RyaWVzMTogTWF4IG51bWJlciBvZiByZXRyYW5zbWlzc2lvbnMgZm9yIHRyYW5zbWlzc2lvbiBzZXJpZXMgMQorICogQHR4X3JhdGUyOiBIVyBpZHggZm9yIHJhdGUgdXNlZCBvbiB0cmFuc21pc3Npb24gc2VyaWVzIDIKKyAqIEB0eF90cmllczI6IE1heCBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIGZvciB0cmFuc21pc3Npb24gc2VyaWVzIDIKKyAqIEB0eF9yYXRlMzogSFcgaWR4IGZvciByYXRlIHVzZWQgb24gdHJhbnNtaXNzaW9uIHNlcmllcyAzCisgKiBAdHhfdHJpZXMzOiBNYXggbnVtYmVyIG9mIHJldHJhbnNtaXNzaW9ucyBmb3IgdHJhbnNtaXNzaW9uIHNlcmllcyAzCisgKgorICogTXVsdGkgcmF0ZSByZXRyeSAoTVJSKSB0eCBjb250cm9sIGRlc2NyaXB0b3JzIGFyZSBhdmFpbGFibGUgb25seSBvbiBBUjUyMTIKKyAqIE1BQ3MsIHRoZXkgYXJlIHBhcnQgb2YgdGhlIG5vcm1hbCA0LXdvcmQgdHggY29udHJvbCBkZXNjcmlwdG9yIChzZWUgYWJvdmUpCisgKiBidXQgd2UgaGFuZGxlIHRoZW0gdGhyb3VnaCBhIHNlcGFyYXRlIGZ1bmN0aW9uIGZvciBiZXR0ZXIgYWJzdHJhY3Rpb24uCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlZBTCBvbiBpbnZhbGlkIGlucHV0CiAgKi8KIGludAotYXRoNWtfaHdfc2V0dXBfbXJyX3R4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCi0JdW5zaWduZWQgaW50IHR4X3JhdGUxLCB1X2ludCB0eF90cmllczEsIHVfaW50IHR4X3JhdGUyLAotCXVfaW50IHR4X3RyaWVzMiwgdW5zaWduZWQgaW50IHR4X3JhdGUzLCB1X2ludCB0eF90cmllczMpCithdGg1a19od19zZXR1cF9tcnJfdHhfZGVzYyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCisJCQl1X2ludCB0eF9yYXRlMSwgdV9pbnQgdHhfdHJpZXMxLAorCQkJdV9pbnQgdHhfcmF0ZTIsIHVfaW50IHR4X3RyaWVzMiwKKwkJCXVfaW50IHR4X3JhdGUzLCB1X2ludCB0eF90cmllczMpCiB7CiAJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bCAqdHhfY3RsOwogCkBAIC0zNTAsMTEgKzQzMCwxNiBAQAogKiBUWCBTdGF0dXMgZGVzY3JpcHRvcnMgKgogXCoqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogUHJvY2VzcyB0aGUgdHggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC81MjExCisvKioKKyAqIGF0aDVrX2h3X3Byb2NfMndvcmRfdHhfc3RhdHVzKCkgLSBQcm9jZXNzIGEgdHggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC8xCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZGVzYzogVGhlICZzdHJ1Y3QgYXRoNWtfZGVzYworICogQHRzOiBUaGUgJnN0cnVjdCBhdGg1a190eF9zdGF0dXMKICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzJ3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqdHMpCitzdGF0aWMgaW50CithdGg1a19od19wcm9jXzJ3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAorCQkJCXN0cnVjdCBhdGg1a190eF9zdGF0dXMgKnRzKQogewogCXN0cnVjdCBhdGg1a19od18yd190eF9jdGwgKnR4X2N0bDsKIAlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzICp0eF9zdGF0dXM7CkBAIC0zOTksMTEgKzQ4NCwxNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUHJvY2VzcyBhIHR4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTIKKy8qKgorICogYXRoNWtfaHdfcHJvY180d29yZF90eF9zdGF0dXMoKSAtIFByb2Nlc3MgYSB0eCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEyCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZGVzYzogVGhlICZzdHJ1Y3QgYXRoNWtfZGVzYworICogQHRzOiBUaGUgJnN0cnVjdCBhdGg1a190eF9zdGF0dXMKICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzR3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywgc3RydWN0IGF0aDVrX3R4X3N0YXR1cyAqdHMpCitzdGF0aWMgaW50CithdGg1a19od19wcm9jXzR3b3JkX3R4X3N0YXR1cyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAorCQkJCXN0cnVjdCBhdGg1a190eF9zdGF0dXMgKnRzKQogewogCXN0cnVjdCBhdGg1a19od180d190eF9jdGwgKnR4X2N0bDsKIAlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzICp0eF9zdGF0dXM7CkBAIC00NjAsMTEgKzU1MCwxNyBAQAogKiBSWCBEZXNjcmlwdG9ycyAqCiBcKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIEluaXRpYWxpemUgYW4gcnggY29udHJvbCBkZXNjcmlwdG9yCisvKioKKyAqIGF0aDVrX2h3X3NldHVwX3J4X2Rlc2MoKSAtIEluaXRpYWxpemUgYW4gcnggY29udHJvbCBkZXNjcmlwdG9yCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZGVzYzogVGhlICZzdHJ1Y3QgYXRoNWtfZGVzYworICogQHNpemU6IFJYIGJ1ZmZlciBsZW5ndGggaW4gYnl0ZXMKKyAqIEBmbGFnczogT25lIG9mIEFSNUtfUlhERVNDXyogZmxhZ3MKICAqLwotaW50IGF0aDVrX2h3X3NldHVwX3J4X2Rlc2Moc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGF0aDVrX2Rlc2MgKmRlc2MsCi0JCQkgICB1MzIgc2l6ZSwgdW5zaWduZWQgaW50IGZsYWdzKQoraW50CithdGg1a19od19zZXR1cF9yeF9kZXNjKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCXUzMiBzaXplLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGF0aDVrX2h3X3J4X2N0bCAqcnhfY3RsOwogCkBAIC00OTEsMTEgKzU4NywyMiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUHJvY2VzcyB0aGUgcnggc3RhdHVzIGRlc2NyaXB0b3Igb24gNTIxMC81MjExCisvKioKKyAqIGF0aDVrX2h3X3Byb2NfNTIxMF9yeF9zdGF0dXMoKSAtIFByb2Nlc3MgdGhlIHJ4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTAvMQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGRlc2M6IFRoZSAmc3RydWN0IGF0aDVrX2Rlc2MKKyAqIEByczogVGhlICZzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzCisgKgorICogSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCB0byBwcm9jZXNzIGFuIFJYIHN0YXR1cyBkZXNjcmlwdG9yCisgKiBvbiBBUjUyMTAvNTIxMSBNQUMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlBST0dSRVNTIGluIGNhc2Ugd2UgaGF2ZW4ndCByZWNlaXZlZCB0aGUgd2hvO2UKKyAqIGZyYW1lIHlldC4KICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzUyMTBfcnhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLCBzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3Byb2NfNTIxMF9yeF9zdGF0dXMoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCQlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKIHsKIAlzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzICpyeF9zdGF0dXM7CiAKQEAgLTU3NCwxMiArNjgxLDIyIEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBQcm9jZXNzIHRoZSByeCBzdGF0dXMgZGVzY3JpcHRvciBvbiA1MjEyCisvKioKKyAqIGF0aDVrX2h3X3Byb2NfNTIxMl9yeF9zdGF0dXMoKSAtIFByb2Nlc3MgdGhlIHJ4IHN0YXR1cyBkZXNjcmlwdG9yIG9uIDUyMTIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBkZXNjOiBUaGUgJnN0cnVjdCBhdGg1a19kZXNjCisgKiBAcnM6IFRoZSAmc3RydWN0IGF0aDVrX3J4X3N0YXR1cworICoKKyAqIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8gcHJvY2VzcyBhbiBSWCBzdGF0dXMgZGVzY3JpcHRvcgorICogb24gQVI1MjEyIGFuZCBsYXRlciBNQUMuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgLUVJTlBST0dSRVNTIGluIGNhc2Ugd2UgaGF2ZW4ndCByZWNlaXZlZCB0aGUgd2hvO2UKKyAqIGZyYW1lIHlldC4KICAqLwotc3RhdGljIGludCBhdGg1a19od19wcm9jXzUyMTJfcnhfc3RhdHVzKHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCQkJCXN0cnVjdCBhdGg1a19kZXNjICpkZXNjLAotCQkJCQlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3Byb2NfNTIxMl9yeF9zdGF0dXMoc3RydWN0IGF0aDVrX2h3ICphaCwKKwkJCQlzdHJ1Y3QgYXRoNWtfZGVzYyAqZGVzYywKKwkJCQlzdHJ1Y3QgYXRoNWtfcnhfc3RhdHVzICpycykKIHsKIAlzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzICpyeF9zdGF0dXM7CiAJdTMyIHJ4c3RhdDAsIHJ4c3RhdDE7CkBAIC02NDYsMTAgKzc2MywxNiBAQAogKiBBdHRhY2ggKgogXCoqKioqKioqLwogCi0vKgotICogSW5pdCBmdW5jdGlvbiBwb2ludGVycyBpbnNpZGUgYXRoNWtfaHcgc3RydWN0CisvKioKKyAqIGF0aDVrX2h3X2luaXRfZGVzY19mdW5jdGlvbnMoKSAtIEluaXQgZnVuY3Rpb24gcG9pbnRlcnMgaW5zaWRlIGFoCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogTWFwcyB0aGUgaW50ZXJuYWwgZGVzY3JpcHRvciBmdW5jdGlvbnMgdG8gdGhlIGZ1bmN0aW9uIHBvaW50ZXJzIG9uIGFoLCB1c2VkCisgKiBmcm9tIGFib3ZlLiBUaGlzIGlzIHVzZWQgYXMgYW4gYWJzdHJhY3Rpb24gbGF5ZXIgdG8gaGFuZGxlIHRoZSB2YXJpb3VzIGNoaXBzCisgKiB0aGUgc2FtZSB3YXkuCiAgKi8KLWludCBhdGg1a19od19pbml0X2Rlc2NfZnVuY3Rpb25zKHN0cnVjdCBhdGg1a19odyAqYWgpCitpbnQKK2F0aDVrX2h3X2luaXRfZGVzY19mdW5jdGlvbnMoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTIpIHsKIAkJYWgtPmFoX3NldHVwX3R4X2Rlc2MgPSBhdGg1a19od19zZXR1cF80d29yZF90eF9kZXNjOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmgKaW5kZXggY2ZkNTI5YjUuLjhkNmMwMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kZXNjLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2Rlc2MuaApAQCAtMjAsMjUgKzIwLDMwIEBACiAgKiBSWC9UWCBkZXNjcmlwdG9yIHN0cnVjdHVyZXMKICAqLwogCi0vKgotICogQ29tbW9uIGhhcmR3YXJlIFJYIGNvbnRyb2wgZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfcnhfY3RsIC0gQ29tbW9uIGhhcmR3YXJlIFJYIGNvbnRyb2wgZGVzY3JpcHRvcgorICogQHJ4X2NvbnRyb2xfMDogUlggY29udHJvbCB3b3JkIDAKKyAqIEByeF9jb250cm9sXzE6IFJYIGNvbnRyb2wgd29yZCAxCiAgKi8KIHN0cnVjdCBhdGg1a19od19yeF9jdGwgewotCXUzMglyeF9jb250cm9sXzA7IC8qIFJYIGNvbnRyb2wgd29yZCAwICovCi0JdTMyCXJ4X2NvbnRyb2xfMTsgLyogUlggY29udHJvbCB3b3JkIDEgKi8KKwl1MzIJcnhfY29udHJvbF8wOworCXUzMglyeF9jb250cm9sXzE7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogLyogUlggY29udHJvbCB3b3JkIDEgZmllbGRzL2ZsYWdzICovCiAjZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwxX0JVRl9MRU4JCTB4MDAwMDBmZmYgLyogZGF0YSBidWZmZXIgbGVuZ3RoICovCiAjZGVmaW5lIEFSNUtfREVTQ19SWF9DVEwxX0lOVFJFUQkJMHgwMDAwMjAwMCAvKiBSWCBpbnRlcnJ1cHQgcmVxdWVzdCAqLwogCi0vKgotICogQ29tbW9uIGhhcmR3YXJlIFJYIHN0YXR1cyBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgLSBDb21tb24gaGFyZHdhcmUgUlggc3RhdHVzIGRlc2NyaXB0b3IKKyAqIEByeF9zdGF0dXNfMDogUlggc3RhdHVzIHdvcmQgMAorICogQHJ4X3N0YXR1c18xOiBSWCBzdGF0dXMgd29yZCAxCisgKgogICogNTIxMCwgNTIxMSBhbmQgNTIxMiBkaWZmZXIgb25seSBpbiB0aGUgZmllbGRzIGFuZCBmbGFncyBkZWZpbmVkIGJlbG93CiAgKi8KIHN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMgewotCXUzMglyeF9zdGF0dXNfMDsgLyogUlggc3RhdHVzIHdvcmQgMCAqLwotCXUzMglyeF9zdGF0dXNfMTsgLyogUlggc3RhdHVzIHdvcmQgMSAqLworCXUzMglyeF9zdGF0dXNfMDsKKwl1MzIJcnhfc3RhdHVzXzE7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogLyogNTIxMC81MjExICovCkBAIC05OCwxNyArMTAzLDM2IEBACiAKIC8qKgogICogZW51bSBhdGg1a19waHlfZXJyb3JfY29kZSAtIFBIWSBFcnJvciBjb2RlcworICogQEFSNUtfUlhfUEhZX0VSUk9SX1VOREVSUlVOOiBUcmFuc21pdCB1bmRlcnJ1biwgWzUyMTBdIE5vIGVycm9yCisgKiBAQVI1S19SWF9QSFlfRVJST1JfVElNSU5HOiBUaW1pbmcgZXJyb3IKKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9QQVJJVFk6IElsbGVnYWwgcGFyaXR5CisgKiBAQVI1S19SWF9QSFlfRVJST1JfUkFURTogSWxsZWdhbCByYXRlCisgKiBAQVI1S19SWF9QSFlfRVJST1JfTEVOR1RIOiBJbGxlZ2FsIGxlbmd0aAorICogQEFSNUtfUlhfUEhZX0VSUk9SX1JBREFSOiBSYWRhciBkZXRlY3QsIFs1MjEwXSA2NCBRQU0gcmF0ZQorICogQEFSNUtfUlhfUEhZX0VSUk9SX1NFUlZJQ0U6IElsbGVnYWwgc2VydmljZQorICogQEFSNUtfUlhfUEhZX0VSUk9SX1RPUjogVHJhbnNtaXQgb3ZlcnJpZGUgcmVjZWl2ZQorICogQEFSNUtfUlhfUEhZX0VSUk9SX09GRE1fVElNSU5HOiBPRkRNIFRpbWluZyBlcnJvciBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9TSUdOQUxfUEFSSVRZOiBPRkRNIFNpZ25hbCBwYXJpdHkgZXJyb3IgWzUyMTIrXQorICogQEFSNUtfUlhfUEhZX0VSUk9SX09GRE1fUkFURV9JTExFR0FMOiBPRkRNIElsbGVnYWwgcmF0ZSBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9MRU5HVEhfSUxMRUdBTDogT0ZETSBJbGxlZ2FsIGxlbmd0aCBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9QT1dFUl9EUk9QOiBPRkRNIFBvd2VyIGRyb3AgWzUyMTIrXQorICogQEFSNUtfUlhfUEhZX0VSUk9SX09GRE1fU0VSVklDRTogT0ZETSBTZXJ2aWNlICg/KSBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfT0ZETV9SRVNUQVJUOiBPRkRNIFJlc3RhcnQgKD8pIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfVElNSU5HOiBDQ0sgVGltaW5nIGVycm9yIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfSEVBREVSX0NSQzogSGVhZGVyIENSQyBlcnJvciBbNTIxMitdCisgKiBAQVI1S19SWF9QSFlfRVJST1JfQ0NLX1JBVEVfSUxMRUdBTDogSWxsZWdhbCByYXRlIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfU0VSVklDRTogQ0NLIFNlcnZpY2UgKD8pIFs1MjEyK10KKyAqIEBBUjVLX1JYX1BIWV9FUlJPUl9DQ0tfUkVTVEFSVDogQ0NLIFJlc3RhcnQgKD8pIFs1MjEyK10KICAqLwogZW51bSBhdGg1a19waHlfZXJyb3JfY29kZSB7Ci0JQVI1S19SWF9QSFlfRVJST1JfVU5ERVJSVU4JCT0gMCwJLyogVHJhbnNtaXQgdW5kZXJydW4sIFs1MjEwXSBObyBlcnJvciAqLwotCUFSNUtfUlhfUEhZX0VSUk9SX1RJTUlORwkJPSAxLAkvKiBUaW1pbmcgZXJyb3IgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9QQVJJVFkJCT0gMiwJLyogSWxsZWdhbCBwYXJpdHkgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9SQVRFCQkJPSAzLAkvKiBJbGxlZ2FsIHJhdGUgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9MRU5HVEgJCT0gNCwJLyogSWxsZWdhbCBsZW5ndGggKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9SQURBUgkJCT0gNSwJLyogUmFkYXIgZGV0ZWN0LCBbNTIxMF0gNjQgUUFNIHJhdGUgKi8KLQlBUjVLX1JYX1BIWV9FUlJPUl9TRVJWSUNFCQk9IDYsCS8qIElsbGVnYWwgc2VydmljZSAqLwotCUFSNUtfUlhfUEhZX0VSUk9SX1RPUgkJCT0gNywJLyogVHJhbnNtaXQgb3ZlcnJpZGUgcmVjZWl2ZSAqLwotCS8qIHRoZXNlIGFyZSBzcGVjaWZpYyB0byB0aGUgNTIxMiAqLworCUFSNUtfUlhfUEhZX0VSUk9SX1VOREVSUlVOCQk9IDAsCisJQVI1S19SWF9QSFlfRVJST1JfVElNSU5HCQk9IDEsCisJQVI1S19SWF9QSFlfRVJST1JfUEFSSVRZCQk9IDIsCisJQVI1S19SWF9QSFlfRVJST1JfUkFURQkJCT0gMywKKwlBUjVLX1JYX1BIWV9FUlJPUl9MRU5HVEgJCT0gNCwKKwlBUjVLX1JYX1BIWV9FUlJPUl9SQURBUgkJCT0gNSwKKwlBUjVLX1JYX1BIWV9FUlJPUl9TRVJWSUNFCQk9IDYsCisJQVI1S19SWF9QSFlfRVJST1JfVE9SCQkJPSA3LAogCUFSNUtfUlhfUEhZX0VSUk9SX09GRE1fVElNSU5HCQk9IDE3LAogCUFSNUtfUlhfUEhZX0VSUk9SX09GRE1fU0lHTkFMX1BBUklUWQk9IDE4LAogCUFSNUtfUlhfUEhZX0VSUk9SX09GRE1fUkFURV9JTExFR0FMCT0gMTksCkBAIC0xMjMsMTIgKzE0NywxNCBAQAogCUFSNUtfUlhfUEhZX0VSUk9SX0NDS19SRVNUQVJUCQk9IDMxLAogfTsKIAotLyoKLSAqIDUyMTAvNTIxMSBoYXJkd2FyZSAyLXdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od18yd190eF9jdGwgIC0gNTIxMC81MjExIGhhcmR3YXJlIDItd29yZCBUWCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEB0eF9jb250cm9sXzA6IFRYIGNvbnRyb2wgd29yZCAwCisgKiBAdHhfY29udHJvbF8xOiBUWCBjb250cm9sIHdvcmQgMQogICovCiBzdHJ1Y3QgYXRoNWtfaHdfMndfdHhfY3RsIHsKLQl1MzIJdHhfY29udHJvbF8wOyAvKiBUWCBjb250cm9sIHdvcmQgMCAqLwotCXUzMgl0eF9jb250cm9sXzE7IC8qIFRYIGNvbnRyb2wgd29yZCAxICovCisJdTMyCXR4X2NvbnRyb2xfMDsKKwl1MzIJdHhfY29udHJvbF8xOwogfSBfX3BhY2tlZCBfX2FsaWduZWQoNCk7CiAKIC8qIFRYIGNvbnRyb2wgd29yZCAwIGZpZWxkcy9mbGFncyAqLwpAQCAtMTc3LDE0ICsyMDMsMTggQEAKICNkZWZpbmUgQVI1S19BUjUyMTBfVFhfREVTQ19GUkFNRV9UWVBFX1BJRlMJNAogI2RlZmluZSBBUjVLX0FSNTIxMV9UWF9ERVNDX0ZSQU1FX1RZUEVfUFJFU1AJNAogCi0vKgotICogNTIxMiBoYXJkd2FyZSA0LXdvcmQgVFggY29udHJvbCBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od180d190eF9jdGwgLSA1MjEyIGhhcmR3YXJlIDQtd29yZCBUWCBjb250cm9sIGRlc2NyaXB0b3IKKyAqIEB0eF9jb250cm9sXzA6IFRYIGNvbnRyb2wgd29yZCAwCisgKiBAdHhfY29udHJvbF8xOiBUWCBjb250cm9sIHdvcmQgMQorICogQHR4X2NvbnRyb2xfMjogVFggY29udHJvbCB3b3JkIDIKKyAqIEB0eF9jb250cm9sXzM6IFRYIGNvbnRyb2wgd29yZCAzCiAgKi8KIHN0cnVjdCBhdGg1a19od180d190eF9jdGwgewotCXUzMgl0eF9jb250cm9sXzA7IC8qIFRYIGNvbnRyb2wgd29yZCAwICovCi0JdTMyCXR4X2NvbnRyb2xfMTsgLyogVFggY29udHJvbCB3b3JkIDEgKi8KLQl1MzIJdHhfY29udHJvbF8yOyAvKiBUWCBjb250cm9sIHdvcmQgMiAqLwotCXUzMgl0eF9jb250cm9sXzM7IC8qIFRYIGNvbnRyb2wgd29yZCAzICovCisJdTMyCXR4X2NvbnRyb2xfMDsKKwl1MzIJdHhfY29udHJvbF8xOworCXUzMgl0eF9jb250cm9sXzI7CisJdTMyCXR4X2NvbnRyb2xfMzsKIH0gX19wYWNrZWQgX19hbGlnbmVkKDQpOwogCiAvKiBUWCBjb250cm9sIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KQEAgLTIzOCwxMiArMjY4LDE0IEBACiAjZGVmaW5lIEFSNUtfNFdfVFhfREVTQ19DVEwzX1JUU19DVFNfUkFURQkweDAxZjAwMDAwIC8qIFJUUyBvciBDVFMgcmF0ZSAqLwogI2RlZmluZSBBUjVLXzRXX1RYX0RFU0NfQ1RMM19SVFNfQ1RTX1JBVEVfUwkyMAogCi0vKgotICogQ29tbW9uIFRYIHN0YXR1cyBkZXNjcmlwdG9yCisvKioKKyAqIHN0cnVjdCBhdGg1a19od190eF9zdGF0dXMgLSBDb21tb24gVFggc3RhdHVzIGRlc2NyaXB0b3IKKyAqIEB0eF9zdGF0dXNfMDogVFggc3RhdHVzIHdvcmQgMAorICogQHR4X3N0YXR1c18xOiBUWCBzdGF0dXMgd29yZCAxCiAgKi8KIHN0cnVjdCBhdGg1a19od190eF9zdGF0dXMgewotCXUzMgl0eF9zdGF0dXNfMDsgLyogVFggc3RhdHVzIHdvcmQgMCAqLwotCXUzMgl0eF9zdGF0dXNfMTsgLyogVFggc3RhdHVzIHdvcmQgMSAqLworCXUzMgl0eF9zdGF0dXNfMDsKKwl1MzIJdHhfc3RhdHVzXzE7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAogLyogVFggc3RhdHVzIHdvcmQgMCBmaWVsZHMvZmxhZ3MgKi8KQEAgLTI3NiwzNyArMzA4LDQ3IEBACiAjZGVmaW5lIEFSNUtfREVTQ19UWF9TVEFUVVMxX0NPTVBfU1VDQ0VTU181MjEyCTB4MDA4MDAwMDAgLyogWzUyMTJdIGNvbXByZXNzaW9uIHN0YXR1cyAqLwogI2RlZmluZSBBUjVLX0RFU0NfVFhfU1RBVFVTMV9YTUlUX0FOVEVOTkFfNTIxMgkweDAxMDAwMDAwIC8qIFs1MjEyXSB0cmFuc21pdCBhbnRlbm5hICovCiAKLS8qCi0gKiA1MjEwLzUyMTEgaGFyZHdhcmUgVFggZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfNTIxMF90eF9kZXNjIC0gNTIxMC81MjExIGhhcmR3YXJlIFRYIGRlc2NyaXB0b3IKKyAqIEB0eF9jdGw6IFRoZSAmc3RydWN0IGF0aDVrX2h3XzJ3X3R4X2N0bAorICogQHR4X3N0YXQ6IFRoZSAmc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cwogICovCiBzdHJ1Y3QgYXRoNWtfaHdfNTIxMF90eF9kZXNjIHsKIAlzdHJ1Y3QgYXRoNWtfaHdfMndfdHhfY3RsCXR4X2N0bDsKIAlzdHJ1Y3QgYXRoNWtfaHdfdHhfc3RhdHVzCXR4X3N0YXQ7CiB9IF9fcGFja2VkIF9fYWxpZ25lZCg0KTsKIAotLyoKLSAqIDUyMTIgaGFyZHdhcmUgVFggZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfNTIxMl90eF9kZXNjIC0gNTIxMiBoYXJkd2FyZSBUWCBkZXNjcmlwdG9yCisgKiBAdHhfY3RsOiBUaGUgJnN0cnVjdCBhdGg1a19od180d190eF9jdGwKKyAqIEB0eF9zdGF0OiBUaGUgJnN0cnVjdCBhdGg1a19od190eF9zdGF0dXMKICAqLwogc3RydWN0IGF0aDVrX2h3XzUyMTJfdHhfZGVzYyB7CiAJc3RydWN0IGF0aDVrX2h3XzR3X3R4X2N0bAl0eF9jdGw7CiAJc3RydWN0IGF0aDVrX2h3X3R4X3N0YXR1cwl0eF9zdGF0OwogfSBfX3BhY2tlZCBfX2FsaWduZWQoNCk7CiAKLS8qCi0gKiBDb21tb24gaGFyZHdhcmUgUlggZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfaHdfYWxsX3J4X2Rlc2MgLSBDb21tb24gaGFyZHdhcmUgUlggZGVzY3JpcHRvcgorICogQHJ4X2N0bDogVGhlICZzdHJ1Y3QgYXRoNWtfaHdfcnhfY3RsCisgKiBAcnhfc3RhdDogVGhlICZzdHJ1Y3QgYXRoNWtfaHdfcnhfc3RhdHVzCiAgKi8KIHN0cnVjdCBhdGg1a19od19hbGxfcnhfZGVzYyB7CiAJc3RydWN0IGF0aDVrX2h3X3J4X2N0bAkJcnhfY3RsOwogCXN0cnVjdCBhdGg1a19od19yeF9zdGF0dXMJcnhfc3RhdDsKIH0gX19wYWNrZWQgX19hbGlnbmVkKDQpOwogCi0vKgotICogQXRoZXJvcyBoYXJkd2FyZSBETUEgZGVzY3JpcHRvcgorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfZGVzYyAtIEF0aGVyb3MgaGFyZHdhcmUgRE1BIGRlc2NyaXB0b3IKKyAqIEBkc19saW5rOiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBuZXh0IGRlc2NyaXB0b3IKKyAqIEBkc19kYXRhOiBQaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIChza2IpCisgKiBAdWQ6IFVuaW9uIGNvbnRhaW5pbmcgaHdfNXh4eF90eF9kZXNjIHN0cnVjdHMgYW5kIGh3X2FsbF9yeF9kZXNjCisgKgogICogVGhpcyBpcyByZWFkIGFuZCB3cml0dGVuIHRvIGJ5IHRoZSBoYXJkd2FyZQogICovCiBzdHJ1Y3QgYXRoNWtfZGVzYyB7Ci0JdTMyCWRzX2xpbms7CS8qIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIG5leHQgZGVzY3JpcHRvciAqLwotCXUzMglkc19kYXRhOwkvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIGRhdGEgYnVmZmVyIChza2IpICovCisJdTMyCWRzX2xpbms7CisJdTMyCWRzX2RhdGE7CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCBhdGg1a19od181MjEwX3R4X2Rlc2MJZHNfdHg1MjEwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RtYS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2RtYS5jCmluZGV4IDI0ODFmOWMuLjVjYzlhYTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9kbWEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZG1hLmMKQEAgLTIwLDE2ICsyMCwxMyBAQAogKiBETUEgYW5kIGludGVycnVwdCBtYXNraW5nIGZ1bmN0aW9ucyAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIGRtYS5jIC0gRE1BIGFuZCBpbnRlcnJ1cHQgbWFza2luZyBmdW5jdGlvbnMKKy8qKgorICogRE9DOiBETUEgYW5kIGludGVycnVwdCBtYXNraW5nIGZ1bmN0aW9ucwogICoKICAqIEhlcmUgd2Ugc2V0dXAgZGVzY3JpcHRvciBwb2ludGVycyAocnhkcC90eGRwKSBzdGFydC9zdG9wIGRtYSBlbmdpbmUgYW5kCiAgKiBoYW5kbGUgcXVldWUgc2V0dXAgZm9yIDUyMTAgY2hpcHNldCAocmVzdCBhcmUgaGFuZGxlZCBvbiBxY3UuYykuCiAgKiBBbHNvIHdlIHNldHVwIGludGVycnVwdCBtYXNrIHJlZ2lzdGVyIChJTVIpIGFuZCByZWFkIHRoZSB2YXJpb3VzIGludGVycnVwdAogICogc3RhdHVzIHJlZ2lzdGVycyAoSVNSKS4KLSAqCi0gKiBUT0RPOiBIYW5kbGUgU0lTUiBvbiA1MjExKyBhbmQgaW50cm9kdWNlIGEgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBxdWV1ZQotICogbnVtYmVyIHRoYXQgcmVzdWx0ZWQgdGhlIGludGVycnVwdC4KICAqLwogCiAjaW5jbHVkZSAiYXRoNWsuaCIKQEAgLTQyLDIyICszOSwyMiBAQAogXCoqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19zdGFydF9yeF9kbWEgLSBTdGFydCBETUEgcmVjZWl2ZQotICoKKyAqIGF0aDVrX2h3X3N0YXJ0X3J4X2RtYSgpIC0gU3RhcnQgRE1BIHJlY2VpdmUKICAqIEBhaDoJVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqLwotdm9pZCBhdGg1a19od19zdGFydF9yeF9kbWEoc3RydWN0IGF0aDVrX2h3ICphaCkKK3ZvaWQKK2F0aDVrX2h3X3N0YXJ0X3J4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19DUl9SWEUsIEFSNUtfQ1IpOwogCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0NSKTsKIH0KIAogLyoqCi0gKiBhdGg1a19od19zdG9wX3J4X2RtYSAtIFN0b3AgRE1BIHJlY2VpdmUKLSAqCisgKiBhdGg1a19od19zdG9wX3J4X2RtYSgpIC0gU3RvcCBETUEgcmVjZWl2ZQogICogQGFoOglUaGUgJnN0cnVjdCBhdGg1a19odwogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3N0b3BfcnhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgpCitzdGF0aWMgaW50CithdGg1a19od19zdG9wX3J4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXVuc2lnbmVkIGludCBpOwogCkBAIC03OSwyNCArNzYsMjQgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfcnhkcCAtIEdldCBSWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcwotICoKKyAqIGF0aDVrX2h3X2dldF9yeGRwKCkgLSBHZXQgUlggRGVzY3JpcHRvcidzIGFkZHJlc3MKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqLwotdTMyIGF0aDVrX2h3X2dldF9yeGRwKHN0cnVjdCBhdGg1a19odyAqYWgpCit1MzIKK2F0aDVrX2h3X2dldF9yeGRwKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JYRFApOwogfQogCiAvKioKLSAqIGF0aDVrX2h3X3NldF9yeGRwIC0gU2V0IFJYIERlc2NyaXB0b3IncyBhZGRyZXNzCi0gKgorICogYXRoNWtfaHdfc2V0X3J4ZHAoKSAtIFNldCBSWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcwogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQHBoeXNfYWRkcjogUlggZGVzY3JpcHRvciBhZGRyZXNzCiAgKgogICogUmV0dXJucyAtRUlPIGlmIHJ4IGlzIGFjdGl2ZQogICovCi1pbnQgYXRoNWtfaHdfc2V0X3J4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHBoeXNfYWRkcikKK2ludAorYXRoNWtfaHdfc2V0X3J4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHBoeXNfYWRkcikKIHsKIAlpZiAoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfQ1IpICYgQVI1S19DUl9SWEUpIHsKIAkJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19ETUEsCkBAIC0xMTQsOCArMTExLDcgQEAKIFwqKioqKioqKioqLwogCiAvKioKLSAqIGF0aDVrX2h3X3N0YXJ0X3R4X2RtYSAtIFN0YXJ0IERNQSB0cmFuc21pdCBmb3IgYSBzcGVjaWZpYyBxdWV1ZQotICoKKyAqIGF0aDVrX2h3X3N0YXJ0X3R4X2RtYSgpIC0gU3RhcnQgRE1BIHRyYW5zbWl0IGZvciBhIHNwZWNpZmljIHF1ZXVlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKICAqCkBAIC0xMjgsNyArMTI0LDggQEAKICAqIE5PVEU6IE11c3QgYmUgY2FsbGVkIGFmdGVyIHNldHRpbmcgdXAgdHggY29udHJvbCBkZXNjcmlwdG9yIGZvciB0aGF0CiAgKiBxdWV1ZSAoc2VlIGJlbG93KS4KICAqLwotaW50IGF0aDVrX2h3X3N0YXJ0X3R4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCitpbnQKK2F0aDVrX2h3X3N0YXJ0X3R4X2RtYShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCiB7CiAJdTMyIHR4X3F1ZXVlOwogCkBAIC0xNzcsMTcgKzE3NCwxNiBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3N0b3BfdHhfZG1hIC0gU3RvcCBETUEgdHJhbnNtaXQgb24gYSBzcGVjaWZpYyBxdWV1ZQotICoKKyAqIGF0aDVrX2h3X3N0b3BfdHhfZG1hKCkgLSBTdG9wIERNQSB0cmFuc21pdCBvbiBhIHNwZWNpZmljIHF1ZXVlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAcXVldWU6IFRoZSBodyBxdWV1ZSBudW1iZXIKICAqCiAgKiBTdG9wIERNQSB0cmFuc21pdCBvbiBhIHNwZWNpZmljIGh3IHF1ZXVlIGFuZCBkcmFpbiBxdWV1ZSBzbyB3ZSBkb24ndAogICogaGF2ZSBhbnkgcGVuZGluZyBmcmFtZXMuIFJldHVybnMgLUVCVVNZIGlmIHdlIHN0aWxsIGhhdmUgcGVuZGluZyBmcmFtZXMsCiAgKiAtRUlOVkFMIGlmIHF1ZXVlIG51bWJlciBpcyBvdXQgb2YgcmFuZ2Ugb3IgaW5hY3RpdmUuCi0gKgogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3N0b3BfdHhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3N0b3BfdHhfZG1hKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAl1bnNpZ25lZCBpbnQgaSA9IDQwOwogCXUzMiB0eF9xdWV1ZSwgcGVuZGluZzsKQEAgLTMyMCwxNCArMzE2LDE0IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc3RvcF9iZWFjb25fcXVldWUgLSBTdG9wIGJlYWNvbiBxdWV1ZQotICoKLSAqIEBhaCBUaGUgJnN0cnVjdCBhdGg1a19odwotICogQHF1ZXVlIFRoZSBxdWV1ZSBudW1iZXIKKyAqIGF0aDVrX2h3X3N0b3BfYmVhY29uX3F1ZXVlKCkgLSBTdG9wIGJlYWNvbiBxdWV1ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHF1ZXVlOiBUaGUgcXVldWUgbnVtYmVyCiAgKgogICogUmV0dXJucyAtRUlPIGlmIHF1ZXVlIGRpZG4ndCBzdG9wCiAgKi8KLWludCBhdGg1a19od19zdG9wX2JlYWNvbl9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCitpbnQKK2F0aDVrX2h3X3N0b3BfYmVhY29uX3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAlpbnQgcmV0OwogCXJldCA9IGF0aDVrX2h3X3N0b3BfdHhfZG1hKGFoLCBxdWV1ZSk7CkBAIC0zNDAsOCArMzM2LDcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfdHhkcCAtIEdldCBUWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZQotICoKKyAqIGF0aDVrX2h3X2dldF90eGRwKCkgLSBHZXQgVFggRGVzY3JpcHRvcidzIGFkZHJlc3MgZm9yIGEgc3BlY2lmaWMgcXVldWUKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBxdWV1ZTogVGhlIGh3IHF1ZXVlIG51bWJlcgogICoKQEAgLTM1Miw3ICszNDcsOCBAQAogICoKICAqIFhYWDogSXMgVFhEUCByZWFkIGFuZCBjbGVhciA/CiAgKi8KLXUzMiBhdGg1a19od19nZXRfdHhkcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCit1MzIKK2F0aDVrX2h3X2dldF90eGRwKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAl1MTYgdHhfcmVnOwogCkBAIC0zODIsMTAgKzM3OCwxMCBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3NldF90eGRwIC0gU2V0IFRYIERlc2NyaXB0b3IncyBhZGRyZXNzIGZvciBhIHNwZWNpZmljIHF1ZXVlCi0gKgorICogYXRoNWtfaHdfc2V0X3R4ZHAoKSAtIFNldCBUWCBEZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQHF1ZXVlOiBUaGUgaHcgcXVldWUgbnVtYmVyCisgKiBAcGh5c19hZGRyOiBUaGUgcGh5c2ljYWwgYWRkcmVzcwogICoKICAqIFNldCBUWCBkZXNjcmlwdG9yJ3MgYWRkcmVzcyBmb3IgYSBzcGVjaWZpYyBxdWV1ZS4gRm9yIDUyMTAgd2UgaWdub3JlCiAgKiB0aGUgcXVldWUgbnVtYmVyIGFuZCB3ZSB1c2UgdHggcXVldWUgdHlwZSBzaW5jZSB3ZSBvbmx5IGhhdmUgMiBxdWV1ZXMKQEAgLTM5NCw3ICszOTAsOCBAQAogICogUmV0dXJucyAtRUlOVkFMIGlmIHF1ZXVlIHR5cGUgaXMgaW52YWxpZCBmb3IgNTIxMCBhbmQgLUVJTyBpZiBxdWV1ZSBpcyBzdGlsbAogICogYWN0aXZlLgogICovCi1pbnQgYXRoNWtfaHdfc2V0X3R4ZHAoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlLCB1MzIgcGh5c19hZGRyKQoraW50CithdGg1a19od19zZXRfdHhkcChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUsIHUzMiBwaHlzX2FkZHIpCiB7CiAJdTE2IHR4X3JlZzsKIApAQCAtNDM1LDggKzQzMiw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbCAtIFVwZGF0ZSB0eCB0cmlnZ2VyIGxldmVsCi0gKgorICogYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbCgpIC0gVXBkYXRlIHR4IHRyaWdnZXIgbGV2ZWwKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBpbmNyZWFzZTogRmxhZyB0byBmb3JjZSBpbmNyZWFzZSBvZiB0cmlnZ2VyIGxldmVsCiAgKgpAQCAtNDQ0LDE1ICs0NDAsMTUgQEAKICAqIGJ1ZmZlciAoYWthIEZJRk8gdGhyZXNob2xkKSB0aGF0IGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hlbiBQQ1UgZmx1c2hlcwogICogdGhlIGJ1ZmZlciBhbmQgdHJhbnNtaXRzIGl0cyBkYXRhLiBMb3dlcmluZyB0aGlzIHJlc3VsdHMgc2VuZGluZyBzbWFsbAogICogZnJhbWVzIG1vcmUgcXVpY2tseSBidXQgY2FuIGxlYWQgdG8gdHggdW5kZXJydW5zLCByYWlzaW5nIGl0IGEgbG90IGNhbgotICogcmVzdWx0IG90aGVyIHByb2JsZW1zIChpIHRoaW5rIGJtaXNzIGlzIHJlbGF0ZWQpLiBSaWdodCBub3cgd2Ugc3RhcnQgd2l0aAotICogdGhlIGxvd2VzdCBwb3NzaWJsZSAoNjRCeXRlcykgYW5kIGlmIHdlIGdldCB0eCB1bmRlcnJ1biB3ZSBpbmNyZWFzZSBpdCB1c2luZwotICogdGhlIGluY3JlYXNlIGZsYWcuIFJldHVybnMgLUVJTyBpZiB3ZSBoYXZlIHJlYWNoZWQgbWF4aW11bS9taW5pbXVtLgorICogcmVzdWx0IG90aGVyIHByb2JsZW1zLiBSaWdodCBub3cgd2Ugc3RhcnQgd2l0aCB0aGUgbG93ZXN0IHBvc3NpYmxlCisgKiAoNjRCeXRlcykgYW5kIGlmIHdlIGdldCB0eCB1bmRlcnJ1biB3ZSBpbmNyZWFzZSBpdCB1c2luZyB0aGUgaW5jcmVhc2UKKyAqIGZsYWcuIFJldHVybnMgLUVJTyBpZiB3ZSBoYXZlIHJlYWNoZWQgbWF4aW11bS9taW5pbXVtLgogICoKICAqIFhYWDogTGluayB0aGlzIHdpdGggdHggRE1BIHNpemUgPwotICogWFhYOiBVc2UgaXQgdG8gc2F2ZSBpbnRlcnJ1cHRzID8KLSAqIFRPRE86IE5lZWRzIHRlc3RpbmcsIGkgdGhpbmsgaXQncyByZWxhdGVkIHRvIGJtaXNzLi4uCisgKiBYWFgyOiBVc2UgaXQgdG8gc2F2ZSBpbnRlcnJ1cHRzID8KICAqLwotaW50IGF0aDVrX2h3X3VwZGF0ZV90eF90cmlnbGV2ZWwoc3RydWN0IGF0aDVrX2h3ICphaCwgYm9vbCBpbmNyZWFzZSkKK2ludAorYXRoNWtfaHdfdXBkYXRlX3R4X3RyaWdsZXZlbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBib29sIGluY3JlYXNlKQogewogCXUzMiB0cmlnZ2VyX2xldmVsLCBpbXI7CiAJaW50IHJldCA9IC1FSU87CkBAIC00OTgsMjEgKzQ5NCwyMCBAQAogXCoqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nIC0gQ2hlY2sgaWYgd2UgaGF2ZSBwZW5kaW5nIGludGVycnVwdHMKLSAqCisgKiBhdGg1a19od19pc19pbnRyX3BlbmRpbmcoKSAtIENoZWNrIGlmIHdlIGhhdmUgcGVuZGluZyBpbnRlcnJ1cHRzCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKgogICogQ2hlY2sgaWYgd2UgaGF2ZSBwZW5kaW5nIGludGVycnVwdHMgdG8gcHJvY2Vzcy4gUmV0dXJucyAxIGlmIHdlCiAgKiBoYXZlIHBlbmRpbmcgaW50ZXJydXB0cyBhbmQgMCBpZiB3ZSBoYXZlbid0LgogICovCi1ib29sIGF0aDVrX2h3X2lzX2ludHJfcGVuZGluZyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorYm9vbAorYXRoNWtfaHdfaXNfaW50cl9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJcmV0dXJuIGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX0lOVFBFTkQpID09IDEgPyAxIDogMDsKIH0KIAogLyoqCi0gKiBhdGg1a19od19nZXRfaXNyIC0gR2V0IGludGVycnVwdCBzdGF0dXMKLSAqCisgKiBhdGg1a19od19nZXRfaXNyKCkgLSBHZXQgaW50ZXJydXB0IHN0YXR1cwogICogQGFoOiBUaGUgQHN0cnVjdCBhdGg1a19odwogICogQGludGVycnVwdF9tYXNrOiBEcml2ZXIncyBpbnRlcnJ1cHQgbWFzayB1c2VkIHRvIGZpbHRlciBvdXQKICAqIGludGVycnVwdHMgaW4gc3cuCkBAIC01MjMsNjIgKzUxOCwxNjIgQEAKICAqIGJlaW5nIG1hcHBlZCBvbiBzb21lIHN0YW5kYXJkIG5vbiBody1zcGVjaWZpYyBwb3NpdGlvbnMKICAqIChjaGVjayBvdXQgJmF0aDVrX2ludCkuCiAgKgotICogTk9URTogV2UgdXNlIHJlYWQtYW5kLWNsZWFyIHJlZ2lzdGVyLCBzbyBhZnRlciB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBJU1IKLSAqIGlzIHplcm9lZC4KKyAqIE5PVEU6IFdlIGRvIHdyaXRlLXRvLWNsZWFyLCBzbyB0aGUgYWN0aXZlIFBJU1IvU0lTUiBiaXRzIGF0IHRoZSB0aW1lIHRoaXMKKyAqIGZ1bmN0aW9uIGdldHMgY2FsbGVkIGFyZSBjbGVhcmVkIG9uIHJldHVybi4KICAqLwotaW50IGF0aDVrX2h3X2dldF9pc3Ioc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19pbnQgKmludGVycnVwdF9tYXNrKQoraW50CithdGg1a19od19nZXRfaXNyKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfaW50ICppbnRlcnJ1cHRfbWFzaykKIHsKLQl1MzIgZGF0YTsKKwl1MzIgZGF0YSA9IDA7CiAKIAkvKgotCSAqIFJlYWQgaW50ZXJydXB0IHN0YXR1cyBmcm9tIHRoZSBJbnRlcnJ1cHQgU3RhdHVzIHJlZ2lzdGVyCi0JICogb24gNTIxMAorCSAqIFJlYWQgaW50ZXJydXB0IHN0YXR1cyBmcm9tIFByaW1hcnkgSW50ZXJydXB0CisJICogUmVnaXN0ZXIuCisJICoKKwkgKiBOb3RlOiBQSVNSL1NJU1IgTm90IGF2YWlsYWJsZSBvbiA1MjEwCiAJICovCiAJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEwKSB7Ci0JCWRhdGEgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19JU1IpOwotCQlpZiAodW5saWtlbHkoZGF0YSA9PSBBUjVLX0lOVF9OT0NBUkQpKSB7Ci0JCQkqaW50ZXJydXB0X21hc2sgPSBkYXRhOworCQl1MzIgaXNyID0gMDsKKwkJaXNyID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfSVNSKTsKKwkJaWYgKHVubGlrZWx5KGlzciA9PSBBUjVLX0lOVF9OT0NBUkQpKSB7CisJCQkqaW50ZXJydXB0X21hc2sgPSBpc3I7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQotCX0gZWxzZSB7CisKIAkJLyoKLQkJICogUmVhZCBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gSW50ZXJydXB0Ci0JCSAqIFN0YXR1cyBSZWdpc3RlciBzaGFkb3cgY29weSAoUmVhZCBBbmQgQ2xlYXIpCi0JCSAqCi0JCSAqIE5vdGU6IFBJU1IvU0lTUiBOb3QgYXZhaWxhYmxlIG9uIDUyMTAKKwkJICogRmlsdGVyIG91dCB0aGUgbm9uLWNvbW1vbiBiaXRzIGZyb20gdGhlIGludGVycnVwdAorCQkgKiBzdGF0dXMuCiAJCSAqLwotCQlkYXRhID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1BJU1IpOwotCQlpZiAodW5saWtlbHkoZGF0YSA9PSBBUjVLX0lOVF9OT0NBUkQpKSB7Ci0JCQkqaW50ZXJydXB0X21hc2sgPSBkYXRhOworCQkqaW50ZXJydXB0X21hc2sgPSAoaXNyICYgQVI1S19JTlRfQ09NTU9OKSAmIGFoLT5haF9pbXI7CisKKwkJLyogSGFubGRlIElOVF9GQVRBTCAqLworCQlpZiAodW5saWtlbHkoaXNyICYgKEFSNUtfSVNSX1NTRVJSIHwgQVI1S19JU1JfTUNBQlQKKwkJCQkJCXwgQVI1S19JU1JfRFBFUlIpKSkKKwkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9GQVRBTDsKKworCQkvKgorCQkgKiBYWFg6IEJNSVNTIGludGVycnVwdHMgbWF5IG9jY3VyIGFmdGVyIGFzc29jaWF0aW9uLgorCQkgKiBJIGZvdW5kIHRoaXMgb24gNTIxMCBjb2RlIGJ1dCBpdCBuZWVkcyB0ZXN0aW5nLiBJZiB0aGlzIGlzCisJCSAqIHRydWUgd2Ugc2hvdWxkIGRpc2FibGUgdGhlbSBiZWZvcmUgYXNzb2MgYW5kIHJlLWVuYWJsZSB0aGVtCisJCSAqIGFmdGVyIGEgc3VjY2Vzc2Z1bCBhc3NvYyArIHNvbWUgamlmZmllcy4KKwkJCWludGVycnVwdF9tYXNrICY9IH5BUjVLX0lOVF9CTUlTUzsKKwkJICovCisKKwkJZGF0YSA9IGlzcjsKKwl9IGVsc2UgeworCQl1MzIgcGlzciA9IDA7CisJCXUzMiBwaXNyX2NsZWFyID0gMDsKKwkJdTMyIHNpc3IwID0gMDsKKwkJdTMyIHNpc3IxID0gMDsKKwkJdTMyIHNpc3IyID0gMDsKKwkJdTMyIHNpc3IzID0gMDsKKwkJdTMyIHNpc3I0ID0gMDsKKworCQkvKiBSZWFkIFBJU1IgYW5kIFNJU1JzLi4uICovCisJCXBpc3IgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSVNSKTsKKwkJaWYgKHVubGlrZWx5KHBpc3IgPT0gQVI1S19JTlRfTk9DQVJEKSkgeworCQkJKmludGVycnVwdF9tYXNrID0gcGlzcjsKIAkJCXJldHVybiAtRU5PREVWOwogCQl9Ci0JfQogCi0JLyoKLQkgKiBHZXQgYWJzdHJhY3QgaW50ZXJydXB0IG1hc2sgKGRyaXZlci1jb21wYXRpYmxlKQotCSAqLwotCSppbnRlcnJ1cHRfbWFzayA9IChkYXRhICYgQVI1S19JTlRfQ09NTU9OKSAmIGFoLT5haF9pbXI7CisJCXNpc3IwID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU0lTUjApOworCQlzaXNyMSA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NJU1IxKTsKKwkJc2lzcjIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19TSVNSMik7CisJCXNpc3IzID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfU0lTUjMpOworCQlzaXNyNCA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1NJU1I0KTsKIAotCWlmIChhaC0+YWhfdmVyc2lvbiAhPSBBUjVLX0FSNTIxMCkgewotCQl1MzIgc2lzcjIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SQUNfU0lTUjIpOworCQkvKgorCQkgKiBQSVNSIGhvbGRzIHRoZSBsb2dpY2FsIE9SIG9mIGludGVycnVwdCBiaXRzCisJCSAqIGZyb20gU0lTUiByZWdpc3RlcnM6CisJCSAqCisJCSAqIFRYT0sgYW5kIFRYREVTQyAgLT4gTG9naWNhbCBPUiBvZiBUWE9LIGFuZCBUWERFU0MKKwkJICoJCQlwZXItcXVldWUgYml0cyBvbiBTSVNSMAorCQkgKgorCQkgKiBUWEVSUiBhbmQgVFhFT0wgLT4gTG9naWNhbCBPUiBvZiBUWEVSUiBhbmQgVFhFT0wKKwkJICoJCQlwZXItcXVldWUgYml0cyBvbiBTSVNSMQorCQkgKgorCQkgKiBUWFVSTiAtPiBMb2dpY2FsIE9SIG9mIFRYVVJOIHBlci1xdWV1ZSBiaXRzIG9uIFNJU1IyCisJCSAqCisJCSAqIEhJVUVSUiAtPiBMb2dpY2FsIE9SIG9mIE1DQUJULCBTU0VSUiBhbmQgRFBFUiBiaXRzIG9uIFNJU1IyCisJCSAqCisJCSAqIEJDTk1JU0MgLT4gTG9naWNhbCBPUiBvZiBUSU0sIENBQl9FTkQsIERUSU1fU1lOQworCQkgKgkJQkNOX1RJTUVPVVQsIENBQl9USU1FT1VUIGFuZCBEVElNCisJCSAqCQkoYW5kIFRTRk9PUiA/KSBiaXRzIG9uIFNJU1IyCisJCSAqCisJCSAqIFFDQlJPUk4gYW5kIFFDQlJVUk4gLT4gTG9naWNhbCBPUiBvZiBRQ0JST1JOIGFuZAorCQkgKgkJCVFDQlJVUk4gcGVyLXF1ZXVlIGJpdHMgb24gU0lTUjMKKwkJICogUVRSSUcgLT4gTG9naWNhbCBPUiBvZiBRVFJJRyBwZXItcXVldWUgYml0cyBvbiBTSVNSNAorCQkgKgorCQkgKiBJZiB3ZSBjbGVhbiB0aGVzZSBiaXRzIG9uIFBJU1Igd2UgJ2xsIGFsc28gY2xlYXIgYWxsCisJCSAqIHJlbGF0ZWQgYml0cyBmcm9tIFNJU1JzLCBlLmcuIGlmIHdlIHdyaXRlIHRoZSBUWE9LIGJpdCBvbgorCQkgKiBQSVNSIHdlICdsbCBjbGVhbiBhbGwgVFhPSyBiaXRzIGZyb20gU0lTUjAgc28gaWYgYSBuZXcgVFhPSworCQkgKiBpbnRlcnJ1cHQgZ290IGZpcmVkIGZvciBhbm90aGVyIHF1ZXVlIHdoaWxlIHdlIHdlcmUgcmVhZGluZworCQkgKiB0aGUgaW50ZXJydXB0IHJlZ2lzdGVycyBhbmQgd2Ugd3JpdGUgYmFjayB0aGUgVFhPSyBiaXQgb24KKwkJICogUElTUiB3ZSAnbGwgbG9zZSBpdC4gU28gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3Qgd3JpdGUgYmFjaworCQkgKiBvbiBQSVNSIGFueSBiaXRzIHRoYXQgY29tZSBmcm9tIFNJU1JzLiBDbGVhcmluZyB0aGVtIGZyb20KKwkJICogU0lTUnMgd2lsbCBhbHNvIGNsZWFyIFBJU1Igc28gbm8gbmVlZCB0byB3b3JyeSBoZXJlLgorCQkgKi8KIAotCQkvKkhJVSA9IEhvc3QgSW50ZXJmYWNlIFVuaXQgKFBDSSBldGMpKi8KLQkJaWYgKHVubGlrZWx5KGRhdGEgJiAoQVI1S19JU1JfSElVRVJSKSkpCi0JCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRkFUQUw7CisJCXBpc3JfY2xlYXIgPSBwaXNyICYgfkFSNUtfSVNSX0JJVFNfRlJPTV9TSVNSUzsKIAotCQkvKkJlYWNvbiBOb3QgUmVhZHkqLwotCQlpZiAodW5saWtlbHkoZGF0YSAmIChBUjVLX0lTUl9CTlIpKSkKLQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9CTlI7CisJCS8qCisJCSAqIFdyaXRlIHRvIGNsZWFyIHRoZW0uLi4KKwkJICogTm90ZTogVGhpcyBtZWFucyB0aGF0IGVhY2ggYml0IHdlIHdyaXRlIGJhY2sKKwkJICogdG8gdGhlIHJlZ2lzdGVycyB3aWxsIGdldCBjbGVhcmVkLCBsZWF2aW5nIHRoZQorCQkgKiByZXN0IHVuYWZmZWN0ZWQuIFNvIHRoaXMgd29uJ3QgYWZmZWN0IG5ldyBpbnRlcnJ1cHRzCisJCSAqIHdlIGRpZG4ndCBjYXRjaCB3aGlsZSByZWFkaW5nL3Byb2Nlc3NpbmcsIHdlICdsbCBnZXQKKwkJICogdGhlbSBuZXh0IHRpbWUgZ2V0X2lzciBnZXRzIGNhbGxlZC4KKwkJICovCisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc2lzcjAsIEFSNUtfU0lTUjApOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNpc3IxLCBBUjVLX1NJU1IxKTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBzaXNyMiwgQVI1S19TSVNSMik7CisJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc2lzcjMsIEFSNUtfU0lTUjMpOworCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIHNpc3I0LCBBUjVLX1NJU1I0KTsKKwkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBwaXNyX2NsZWFyLCBBUjVLX1BJU1IpOworCQkvKiBGbHVzaCBwcmV2aW91cyB3cml0ZSAqLworCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSVNSKTsKIAotCQlpZiAodW5saWtlbHkoc2lzcjIgJiAoQVI1S19TSVNSMl9TU0VSUiB8Ci0JCQkJCUFSNUtfU0lTUjJfRFBFUlIgfAotCQkJCQlBUjVLX1NJU1IyX01DQUJUKSkpCi0JCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfRkFUQUw7CisJCS8qCisJCSAqIEZpbHRlciBvdXQgdGhlIG5vbi1jb21tb24gYml0cyBmcm9tIHRoZSBpbnRlcnJ1cHQKKwkJICogc3RhdHVzLgorCQkgKi8KKwkJKmludGVycnVwdF9tYXNrID0gKHBpc3IgJiBBUjVLX0lOVF9DT01NT04pICYgYWgtPmFoX2ltcjsKIAotCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1RJTSkKKworCQkvKiBXZSB0cmVhdCBUWE9LLFRYREVTQywgVFhFUlIgYW5kIFRYRU9MCisJCSAqIHRoZSBzYW1lIHdheSAoc2NoZWR1bGUgdGhlIHR4IHRhc2tsZXQpCisJCSAqIHNvIHdlIHRyYWNrIHRoZW0gYWxsIHRvZ2V0aGVyIHBlciBxdWV1ZSAqLworCQlpZiAocGlzciAmIEFSNUtfSVNSX1RYT0spCisJCQlhaC0+YWhfdHhxX2lzcl90eG9rX2FsbCB8PSBBUjVLX1JFR19NUyhzaXNyMCwKKwkJCQkJCUFSNUtfU0lTUjBfUUNVX1RYT0spOworCisJCWlmIChwaXNyICYgQVI1S19JU1JfVFhERVNDKQorCQkJYWgtPmFoX3R4cV9pc3JfdHhva19hbGwgfD0gQVI1S19SRUdfTVMoc2lzcjAsCisJCQkJCQlBUjVLX1NJU1IwX1FDVV9UWERFU0MpOworCisJCWlmIChwaXNyICYgQVI1S19JU1JfVFhFUlIpCisJCQlhaC0+YWhfdHhxX2lzcl90eG9rX2FsbCB8PSBBUjVLX1JFR19NUyhzaXNyMSwKKwkJCQkJCUFSNUtfU0lTUjFfUUNVX1RYRVJSKTsKKworCQlpZiAocGlzciAmIEFSNUtfSVNSX1RYRU9MKQorCQkJYWgtPmFoX3R4cV9pc3JfdHhva19hbGwgfD0gQVI1S19SRUdfTVMoc2lzcjEsCisJCQkJCQlBUjVLX1NJU1IxX1FDVV9UWEVPTCk7CisKKwkJLyogQ3VycmVudGx5IHRoaXMgaXMgbm90IG11Y2ggdXNlZnVsbCBzaW5jZSB3ZSB0cmVhdAorCQkgKiBhbGwgcXVldWVzIHRoZSBzYW1lIHdheSBpZiB3ZSBnZXQgYSBUWFVSTiAodXBkYXRlCisJCSAqIHR4IHRyaWdnZXIgbGV2ZWwpIGJ1dCB3ZSBtaWdodCBuZWVkIGl0IGxhdGVyIG9uKi8KKwkJaWYgKHBpc3IgJiBBUjVLX0lTUl9UWFVSTikKKwkJCWFoLT5haF90eHFfaXNyX3R4dXJuIHw9IEFSNUtfUkVHX01TKHNpc3IyLAorCQkJCQkJQVI1S19TSVNSMl9RQ1VfVFhVUk4pOworCisJCS8qIE1pc2MgQmVhY29uIHJlbGF0ZWQgaW50ZXJydXB0cyAqLworCisJCS8qIEZvciBBUjUyMTEgKi8KKwkJaWYgKHBpc3IgJiBBUjVLX0lTUl9USU0pCiAJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfVElNOwogCi0JCWlmIChkYXRhICYgQVI1S19JU1JfQkNOTUlTQykgeworCQkvKiBGb3IgQVI1MjEyKyAqLworCQlpZiAocGlzciAmIEFSNUtfSVNSX0JDTk1JU0MpIHsKIAkJCWlmIChzaXNyMiAmIEFSNUtfU0lTUjJfVElNKQogCQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9USU07CiAJCQlpZiAoc2lzcjIgJiBBUjVLX1NJU1IyX0RUSU0pCkBAIC01OTEsNjMgKzY4NiwzOSBAQAogCQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9DQUJfVElNRU9VVDsKIAkJfQogCi0JCWlmIChkYXRhICYgQVI1S19JU1JfUlhET1BQTEVSKQotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1JYX0RPUFBMRVI7Ci0JCWlmIChkYXRhICYgQVI1S19JU1JfUUNCUk9STikgewotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FDQlJPUk47Ci0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IzKSwKLQkJCQkJQVI1S19TSVNSM19RQ0JST1JOKTsKLQkJfQotCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1FDQlJVUk4pIHsKLQkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9RQ0JSVVJOOwotCQkJYWgtPmFoX3R4cV9pc3IgfD0gQVI1S19SRUdfTVMoCi0JCQkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19TSVNSMyksCi0JCQkJCUFSNUtfU0lTUjNfUUNCUlVSTik7Ci0JCX0KLQkJaWYgKGRhdGEgJiBBUjVLX0lTUl9RVFJJRykgewotCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FUUklHOwotCQkJYWgtPmFoX3R4cV9pc3IgfD0gQVI1S19SRUdfTVMoCi0JCQkJCWF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1JBQ19TSVNSNCksCi0JCQkJCUFSNUtfU0lTUjRfUVRSSUcpOwotCQl9CisJCS8qIEJlbG93IGludGVycnVwdHMgYXJlIHVubGlrZWx5IHRvIGhhcHBlbiAqLwogCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhPSykKLQkJCWFoLT5haF90eHFfaXNyIHw9IEFSNUtfUkVHX01TKAotCQkJCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SQUNfU0lTUjApLAotCQkJCQlBUjVLX1NJU1IwX1FDVV9UWE9LKTsKLQotCQlpZiAoZGF0YSAmIEFSNUtfSVNSX1RYREVTQykKLQkJCWFoLT5haF90eHFfaXNyIHw9IEFSNUtfUkVHX01TKAotCQkJCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19SQUNfU0lTUjApLAotCQkJCQlBUjVLX1NJU1IwX1FDVV9UWERFU0MpOwotCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhFUlIpCi0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IxKSwKLQkJCQkJQVI1S19TSVNSMV9RQ1VfVFhFUlIpOwotCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhFT0wpCi0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IxKSwKLQkJCQkJQVI1S19TSVNSMV9RQ1VfVFhFT0wpOwotCi0JCWlmIChkYXRhICYgQVI1S19JU1JfVFhVUk4pCi0JCQlhaC0+YWhfdHhxX2lzciB8PSBBUjVLX1JFR19NUygKLQkJCQkJYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUkFDX1NJU1IyKSwKLQkJCQkJQVI1S19TSVNSMl9RQ1VfVFhVUk4pOwotCX0gZWxzZSB7Ci0JCWlmICh1bmxpa2VseShkYXRhICYgKEFSNUtfSVNSX1NTRVJSIHwgQVI1S19JU1JfTUNBQlQKLQkJCQl8IEFSNUtfSVNSX0hJVUVSUiB8IEFSNUtfSVNSX0RQRVJSKSkpCisJCS8qIEhJVSA9IEhvc3QgSW50ZXJmYWNlIFVuaXQgKFBDSSBldGMpCisJCSAqIENhbiBiZSBvbmUgb2YgTUNBQlQsIFNTRVJSLCBEUEVSUiBmcm9tIFNJU1IyICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX0hJVUVSUikpKQogCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX0ZBVEFMOwogCi0JCS8qCi0JCSAqIFhYWDogQk1JU1MgaW50ZXJydXB0cyBtYXkgb2NjdXIgYWZ0ZXIgYXNzb2NpYXRpb24uCi0JCSAqIEkgZm91bmQgdGhpcyBvbiA1MjEwIGNvZGUgYnV0IGl0IG5lZWRzIHRlc3RpbmcuIElmIHRoaXMgaXMKLQkJICogdHJ1ZSB3ZSBzaG91bGQgZGlzYWJsZSB0aGVtIGJlZm9yZSBhc3NvYyBhbmQgcmUtZW5hYmxlIHRoZW0KLQkJICogYWZ0ZXIgYSBzdWNjZXNzZnVsIGFzc29jICsgc29tZSBqaWZmaWVzLgotCQkJaW50ZXJydXB0X21hc2sgJj0gfkFSNUtfSU5UX0JNSVNTOwotCQkgKi8KKwkJLypCZWFjb24gTm90IFJlYWR5Ki8KKwkJaWYgKHVubGlrZWx5KHBpc3IgJiAoQVI1S19JU1JfQk5SKSkpCisJCQkqaW50ZXJydXB0X21hc2sgfD0gQVI1S19JTlRfQk5SOworCisJCS8qIEEgcXVldWUgZ290IENCUiBvdmVycnVuICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX1FDQlJPUk4pKSkgeworCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FDQlJPUk47CisJCQlhaC0+YWhfdHhxX2lzcl9xY2Jvcm4gfD0gQVI1S19SRUdfTVMoc2lzcjMsCisJCQkJCQlBUjVLX1NJU1IzX1FDQlJPUk4pOworCQl9CisKKwkJLyogQSBxdWV1ZSBnb3QgQ0JSIHVuZGVycnVuICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX1FDQlJVUk4pKSkgeworCQkJKmludGVycnVwdF9tYXNrIHw9IEFSNUtfSU5UX1FDQlJVUk47CisJCQlhaC0+YWhfdHhxX2lzcl9xY2J1cm4gfD0gQVI1S19SRUdfTVMoc2lzcjMsCisJCQkJCQlBUjVLX1NJU1IzX1FDQlJVUk4pOworCQl9CisKKwkJLyogQSBxdWV1ZSBnb3QgdHJpZ2dlcmVkICovCisJCWlmICh1bmxpa2VseShwaXNyICYgKEFSNUtfSVNSX1FUUklHKSkpIHsKKwkJCSppbnRlcnJ1cHRfbWFzayB8PSBBUjVLX0lOVF9RVFJJRzsKKwkJCWFoLT5haF90eHFfaXNyX3F0cmlnIHw9IEFSNUtfUkVHX01TKHNpc3I0LAorCQkJCQkJQVI1S19TSVNSNF9RVFJJRyk7CisJCX0KKworCQlkYXRhID0gcGlzcjsKIAl9CiAKIAkvKgpAQCAtNjYxLDggKzczMiw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc2V0X2ltciAtIFNldCBpbnRlcnJ1cHQgbWFzawotICoKKyAqIGF0aDVrX2h3X3NldF9pbXIoKSAtIFNldCBpbnRlcnJ1cHQgbWFzawogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQG5ld19tYXNrOiBUaGUgbmV3IGludGVycnVwdCBtYXNrIHRvIGJlIHNldAogICoKQEAgLTY3MCw3ICs3NDAsOCBAQAogICogYXRoNWtfaW50IGJpdHMgdG8gaHctc3BlY2lmaWMgYml0cyB0byByZW1vdmUgYWJzdHJhY3Rpb24gYW5kIHdyaXRpbmcKICAqIEludGVycnVwdCBNYXNrIFJlZ2lzdGVyLgogICovCi1lbnVtIGF0aDVrX2ludCBhdGg1a19od19zZXRfaW1yKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfaW50IG5ld19tYXNrKQorZW51bSBhdGg1a19pbnQKK2F0aDVrX2h3X3NldF9pbXIoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19pbnQgbmV3X21hc2spCiB7CiAJZW51bSBhdGg1a19pbnQgb2xkX21hc2ssIGludF9tYXNrOwogCkBAIC02OTcsMTYgKzc2OCwxNCBAQAogCQl1MzIgc2ltcjIgPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19TSU1SMikKIAkJCQkmIEFSNUtfU0lNUjJfUUNVX1RYVVJOOwogCisJCS8qIEZhdGFsIGludGVycnVwdCBhYnN0cmFjdGlvbiBmb3IgNTIxMSsgKi8KIAkJaWYgKG5ld19tYXNrICYgQVI1S19JTlRfRkFUQUwpIHsKIAkJCWludF9tYXNrIHw9IEFSNUtfSU1SX0hJVUVSUjsKIAkJCXNpbXIyIHw9IChBUjVLX1NJTVIyX01DQUJUIHwgQVI1S19TSU1SMl9TU0VSUgogCQkJCXwgQVI1S19TSU1SMl9EUEVSUik7CiAJCX0KIAotCQkvKkJlYWNvbiBOb3QgUmVhZHkqLwotCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9CTlIpCi0JCQlpbnRfbWFzayB8PSBBUjVLX0lOVF9CTlI7Ci0KKwkJLyogTWlzYyBiZWFjb24gcmVsYXRlZCBpbnRlcnJ1cHRzICovCiAJCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX1RJTSkKIAkJCWludF9tYXNrIHw9IEFSNUtfSU1SX1RJTTsKIApAQCAtNzIxLDggKzc5MCw5IEBACiAJCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX0NBQl9USU1FT1VUKQogCQkJc2ltcjIgfD0gQVI1S19TSVNSMl9DQUJfVElNRU9VVDsKIAotCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9SWF9ET1BQTEVSKQotCQkJaW50X21hc2sgfD0gQVI1S19JTVJfUlhET1BQTEVSOworCQkvKkJlYWNvbiBOb3QgUmVhZHkqLworCQlpZiAobmV3X21hc2sgJiBBUjVLX0lOVF9CTlIpCisJCQlpbnRfbWFzayB8PSBBUjVLX0lOVF9CTlI7CiAKIAkJLyogTm90ZTogUGVyIHF1ZXVlIGludGVycnVwdCBtYXNrcwogCQkgKiBhcmUgc2V0IHZpYSBhdGg1a19od19yZXNldF90eF9xdWV1ZSgpIChxY3UuYykgKi8KQEAgLTczMCwxMCArODAwLDEyIEBACiAJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgc2ltcjIsIEFSNUtfU0lNUjIpOwogCiAJfSBlbHNlIHsKKwkJLyogRmF0YWwgaW50ZXJydXB0IGFic3RyYWN0aW9uIGZvciA1MjEwICovCiAJCWlmIChuZXdfbWFzayAmIEFSNUtfSU5UX0ZBVEFMKQogCQkJaW50X21hc2sgfD0gKEFSNUtfSU1SX1NTRVJSIHwgQVI1S19JTVJfTUNBQlQKIAkJCQl8IEFSNUtfSU1SX0hJVUVSUiB8IEFSNUtfSU1SX0RQRVJSKTsKIAorCQkvKiBPbmx5IGNvbW1vbiBpbnRlcnJ1cHRzIGxlZnQgZm9yIDUyMTAgKG5vIFNJTVJzKSAqLwogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGludF9tYXNrLCBBUjVLX0lNUik7CiAJfQogCkBAIC03NjAsOCArODMyLDcgQEAKIFwqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19kbWFfaW5pdCAtIEluaXRpYWxpemUgRE1BIHVuaXQKLSAqCisgKiBhdGg1a19od19kbWFfaW5pdCgpIC0gSW5pdGlhbGl6ZSBETUEgdW5pdAogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFNldCBETUEgc2l6ZSBhbmQgcHJlLWVuYWJsZSBpbnRlcnJ1cHRzCkBAIC03NzAsNyArODQxLDggQEAKICAqCiAgKiBYWFg6IFNhdmUvcmVzdG9yZSBSWERQL1RYRFAgcmVnaXN0ZXJzID8KICAqLwotdm9pZCBhdGg1a19od19kbWFfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordm9pZAorYXRoNWtfaHdfZG1hX2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAkvKgogCSAqIFNldCBSeC9UeCBETUEgQ29uZmlndXJhdGlvbgpAQCAtNzk5LDggKzg3MSw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfZG1hX3N0b3AgLSBzdG9wIERNQSB1bml0Ci0gKgorICogYXRoNWtfaHdfZG1hX3N0b3AoKSAtIHN0b3AgRE1BIHVuaXQKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCiAgKiBTdG9wIHR4L3J4IERNQSBhbmQgaW50ZXJydXB0cy4gUmV0dXJucwpAQCAtODEwLDcgKzg4MSw4IEBACiAgKiBzdHVjayBmcmFtZXMgb24gdHggcXVldWVzLCBvbmx5IGEgcmVzZXQKICAqIGNhbiBmaXggdGhhdC4KICAqLwotaW50IGF0aDVrX2h3X2RtYV9zdG9wKHN0cnVjdCBhdGg1a19odyAqYWgpCitpbnQKK2F0aDVrX2h3X2RtYV9zdG9wKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJaW50IGksIHFtYXgsIGVycjsKIAllcnIgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2dwaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9ncGlvLmMKaW5kZXggODU5Mjk3OC4uNzNkM2RkOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2dwaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvZ3Bpby5jCkBAIC0yNCwxMCArMjQsMzMgQEAKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi0vKgotICogU2V0IGxlZCBzdGF0ZQorCisvKioKKyAqIERPQzogR1BJTy9MRUQgZnVuY3Rpb25zCisgKgorICogSGVyZSB3ZSBjb250cm9sIHRoZSA2IGJpZGlyZWN0aW9uYWwgR1BJTyBwaW5zIHByb3ZpZGVkIGJ5IHRoZSBody4KKyAqIFdlIGNhbiBzZXQgYSBHUElPIHBpbiB0byBiZSBhbiBpbnB1dCBvciBhbiBvdXRwdXQgcGluIG9uIEdQSU8gY29udHJvbAorICogcmVnaXN0ZXIgYW5kIHRoZW4gcmVhZCBvciBzZXQgaXRzIHN0YXR1cyBmcm9tIEdQSU8gZGF0YSBpbnB1dC9vdXRwdXQKKyAqIHJlZ2lzdGVycy4KKyAqCisgKiBXZSBhbHNvIGNvbnRyb2wgdGhlIHR3byBMRUQgcGlucyBwcm92aWRlZCBieSB0aGUgaHcsIExFRF8wIGlzIG91cgorICogInBvd2VyIiBMRUQgYW5kIExFRF8xIGlzIG91ciAibmV0d29yayBhY3Rpdml0eSIgTEVEIGJ1dCBtYW55IHNjZW5hcmlvcworICogYXJlIGF2YWlsYWJsZSBmcm9tIGh3LiBWZW5kb3JzIG1pZ2h0IGFsc28gcHJvdmlkZSBMRURzIGNvbm5lY3RlZCB0byB0aGUKKyAqIEdQSU8gcGlucywgd2UgaGFuZGxlIHRoZW0gdGhyb3VnaCB0aGUgTEVEIHN1YnN5c3RlbSBvbiBsZWQuYwogICovCi12b2lkIGF0aDVrX2h3X3NldF9sZWRzdGF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgc3RhdGUpCisKKworLyoqCisgKiBhdGg1a19od19zZXRfbGVkc3RhdGUoKSAtIFNldCBsZWQgc3RhdGUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBzdGF0ZTogT25lIG9mIEFSNUtfTEVEXyoKKyAqCisgKiBVc2VkIHRvIHNldCB0aGUgTEVEIGJsaW5raW5nIHN0YXRlLiBUaGlzIG9ubHkKKyAqIHdvcmtzIGZvciB0aGUgTEVEIGNvbm5lY3RlZCB0byB0aGUgTEVEXzAsIExFRF8xIHBpbnMsCisgKiBub3QgdGhlIEdQSU8gYmFzZWQuCisgKi8KK3ZvaWQKK2F0aDVrX2h3X3NldF9sZWRzdGF0ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgc3RhdGUpCiB7CiAJdTMyIGxlZDsKIAkvKjUyMTAgaGFzIGRpZmZlcmVudCBsZWQgbW9kZSBoYW5kbGluZyovCkBAIC03NCwxMCArOTcsMTMgQEAKIAkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUENJQ0ZHLCBsZWRfNTIxMCk7CiB9CiAKLS8qCi0gKiBTZXQgR1BJTyBpbnB1dHMKKy8qKgorICogYXRoNWtfaHdfc2V0X2dwaW9faW5wdXQoKSAtIFNldCBHUElPIGlucHV0cworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGdwaW86IEdQSU8gcGluIHRvIHNldCBhcyBpbnB1dAogICovCi1pbnQgYXRoNWtfaHdfc2V0X2dwaW9faW5wdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pCitpbnQKK2F0aDVrX2h3X3NldF9ncGlvX2lucHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQogewogCWlmIChncGlvID49IEFSNUtfTlVNX0dQSU8pCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtODksMTAgKzExNSwxMyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IEdQSU8gb3V0cHV0cworLyoqCisgKiBhdGg1a19od19zZXRfZ3Bpb19vdXRwdXQoKSAtIFNldCBHUElPIG91dHB1dHMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBncGlvOiBUaGUgR1BJTyBwaW4gdG8gc2V0IGFzIG91dHB1dAogICovCi1pbnQgYXRoNWtfaHdfc2V0X2dwaW9fb3V0cHV0KHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQoraW50CithdGg1a19od19zZXRfZ3Bpb19vdXRwdXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGdwaW8pCiB7CiAJaWYgKGdwaW8gPj0gQVI1S19OVU1fR1BJTykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xMDQsMTAgKzEzMywxMyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogR2V0IEdQSU8gc3RhdGUKKy8qKgorICogYXRoNWtfaHdfZ2V0X2dwaW8oKSAtIEdldCBHUElPIHN0YXRlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAZ3BpbzogVGhlIEdQSU8gcGluIHRvIHJlYWQKICAqLwotdTMyIGF0aDVrX2h3X2dldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvKQordTMyCithdGg1a19od19nZXRfZ3BpbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbykKIHsKIAlpZiAoZ3BpbyA+PSBBUjVLX05VTV9HUElPKQogCQlyZXR1cm4gMHhmZmZmZmZmZjsKQEAgLTExNywxMCArMTQ5LDE0IEBACiAJCTB4MTsKIH0KIAotLyoKLSAqIFNldCBHUElPIHN0YXRlCisvKioKKyAqIGF0aDVrX2h3X3NldF9ncGlvKCkgLSBTZXQgR1BJTyBzdGF0ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGdwaW86IFRoZSBHUElPIHBpbiB0byBzZXQKKyAqIEB2YWw6IFZhbHVlIHRvIHNldCAoYm9vbGVhbikKICAqLwotaW50IGF0aDVrX2h3X3NldF9ncGlvKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBncGlvLCB1MzIgdmFsKQoraW50CithdGg1a19od19zZXRfZ3BpbyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZ3BpbywgdTMyIHZhbCkKIHsKIAl1MzIgZGF0YTsKIApAQCAtMTM4LDEwICsxNzQsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEluaXRpYWxpemUgdGhlIEdQSU8gaW50ZXJydXB0IChSRktpbGwgc3dpdGNoKQorLyoqCisgKiBhdGg1a19od19zZXRfZ3Bpb19pbnRyKCkgLSBJbml0aWFsaXplIHRoZSBHUElPIGludGVycnVwdCAoUkZLaWxsIHN3aXRjaCkKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBncGlvOiBUaGUgR1BJTyBwaW4gdG8gdXNlCisgKiBAaW50ZXJydXB0X2xldmVsOiBUcnVlIHRvIGdlbmVyYXRlIGludGVycnVwdCBvbiBhY3RpdmUgcGluIChoaWdoKQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgdXAgdGhlIEdQSU8gaW50ZXJydXB0IGZvciB0aGUgaHcgUkZLaWxsIHN3aXRjaC4KKyAqIFRoYXQgc3dpdGNoIGlzIGNvbm5lY3RlZCB0byBhIEdQSU8gcGluIGFuZCBpdCdzIG51bWJlciBpcyBzdG9yZWQgb24gRUVQUk9NLgorICogSXQgY2FuIGVpdGhlciBvcGVuIG9yIGNsb3NlIHRoZSBjaXJjdWl0IHRvIGluZGljYXRlIHRoYXQgd2Ugc2hvdWxkIGRpc2FibGUKKyAqIFJGL1dpcmVsZXNzIHRvIHNhdmUgcG93ZXIgKHdlIGFsc28gZ2V0IHRoYXQgZnJvbSBFRVBST00pLgogICovCi12b2lkIGF0aDVrX2h3X3NldF9ncGlvX2ludHIoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IGdwaW8sCit2b2lkCithdGg1a19od19zZXRfZ3Bpb19pbnRyKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBncGlvLAogCQl1MzIgaW50ZXJydXB0X2xldmVsKQogewogCXUzMiBkYXRhOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL2luaXR2YWxzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYwppbmRleCAxZmZlY2MwLi5hMWVhNzhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvaW5pdHZhbHMuYwpAQCAtMjMsMjQgKzIzLDI3IEBACiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotLyoKLSAqIE1vZGUtaW5kZXBlbmRlbnQgaW5pdGlhbCByZWdpc3RlciB3cml0ZXMKKy8qKgorICogc3RydWN0IGF0aDVrX2luaSAtIE1vZGUtaW5kZXBlbmRlbnQgaW5pdGlhbCByZWdpc3RlciB3cml0ZXMKKyAqIEBpbmlfcmVnaXN0ZXI6IFJlZ2lzdGVyIGFkZHJlc3MKKyAqIEBpbmlfdmFsdWU6IERlZmF1bHQgdmFsdWUKKyAqIEBpbmlfbW9kZTogMCB0byB3cml0ZSAxIHRvIHJlYWQgKGFuZCBjbGVhcikKICAqLwotCiBzdHJ1Y3QgYXRoNWtfaW5pIHsKIAl1MTYJaW5pX3JlZ2lzdGVyOwogCXUzMglpbmlfdmFsdWU7CiAKIAllbnVtIHsKIAkJQVI1S19JTklfV1JJVEUgPSAwLAkvKiBEZWZhdWx0ICovCi0JCUFSNUtfSU5JX1JFQUQgPSAxLAkvKiBDbGVhcmVkIG9uIHJlYWQgKi8KKwkJQVI1S19JTklfUkVBRCA9IDEsCiAJfSBpbmlfbW9kZTsKIH07CiAKLS8qCi0gKiBNb2RlIHNwZWNpZmljIGluaXRpYWwgcmVnaXN0ZXIgdmFsdWVzCisvKioKKyAqIHN0cnVjdCBhdGg1a19pbmlfbW9kZSAtIE1vZGUgc3BlY2lmaWMgaW5pdGlhbCByZWdpc3RlciB2YWx1ZXMKKyAqIEBtb2RlX3JlZ2lzdGVyOiBSZWdpc3RlciBhZGRyZXNzCisgKiBAbW9kZV92YWx1ZTogU2V0IG9mIHZhbHVlcyBmb3IgZWFjaCBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCiAgKi8KLQogc3RydWN0IGF0aDVrX2luaV9tb2RlIHsKIAl1MTYJbW9kZV9yZWdpc3RlcjsKIAl1MzIJbW9kZV92YWx1ZVszXTsKQEAgLTM4NiwxMSArMzg5LDEwIEBACiAKIC8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjExCiAgKiA1MjExIHN1cHBvcnRzIE9GRE0tb25seSBnIChkcmFmdCBnKSBidXQgd2UKLSAqIG5lZWQgdG8gdGVzdCBpdCAhCi0gKi8KKyAqIG5lZWQgdG8gdGVzdCBpdCAhICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIGFyNTIxMV9pbmlfbW9kZVtdID0gewogCXsgQVI1S19UWENGRywKLQkvKglBL1hSICAgICAgICAgIEIgICAgICAgICAgIEcgICAgICAgKi8KKwkvKglBICAgICAgICAgIEIgICAgICAgICAgIEcgICAgICAgKi8KIAkgICB7IDB4MDAwMDAwMTUsIDB4MDAwMDAwMWQsIDB4MDAwMDAwMTUgfSB9LAogCXsgQVI1S19RVUVVRV9ERlNfTE9DQUxfSUZTKDApLAogCSAgIHsgMHgwMDJmZmMwZiwgMHgwMDJmZmMxZiwgMHgwMDJmZmMwZiB9IH0sCkBAIC00NjAsNyArNDYyLDcgQEAKIAkgICB7IDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAgfSB9LAogfTsKIAotLyogSW5pdGlhbCByZWdpc3RlciBzZXR0aW5ncyBmb3IgQVI1MjEyICovCisvKiBJbml0aWFsIHJlZ2lzdGVyIHNldHRpbmdzIGZvciBBUjUyMTIgYW5kIG5ld2VyIGNoaXBzICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaSBhcjUyMTJfaW5pX2NvbW1vbl9zdGFydFtdID0gewogCXsgQVI1S19SWERQLAkJMHgwMDAwMDAwMCB9LAogCXsgQVI1S19SWENGRywJCTB4MDAwMDAwMDUgfSwKQEAgLTcyNCw3ICs3MjYsOCBAQAogCSAgIHsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDEwOCB9IH0sCiB9OwogCi0vKiBJbml0aWFsIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIEFSNTIxMiArIFJGNTExMSAoV3JpdHRlbiBhZnRlciBhcjUyMTJfaW5pKSAqLworLyogSW5pdGlhbCBtb2RlLXNwZWNpZmljIHNldHRpbmdzIGZvciBBUjUyMTIgKyBSRjUxMTEKKyAqIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIHJmNTExMV9pbmlfbW9kZV9lbmRbXSA9IHsKIAl7IEFSNUtfVFhDRkcsCiAJLyoJQS9YUiAgICAgICAgICBCICAgICAgICAgICBHICAgICAgICovCkBAIC03NTcsNiArNzYwLDcgQEAKIAkgICB7IDB4MTg4MzgwMGEsIDB4MTg3MzgwMGEsIDB4MTg4MzgwMGEgfSB9LAogfTsKIAorLyogQ29tbW9uIGZvciBhbGwgbW9kZXMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pIHJmNTExMV9pbmlfY29tbW9uX2VuZFtdID0gewogCXsgQVI1S19EQ1VfRlAsCQkweDAwMDAwMDAwIH0sCiAJeyBBUjVLX1BIWV9BR0MsCQkweDAwMDAwMDAwIH0sCkBAIC03NzQsNyArNzc4LDkgQEAKIAl7IDB4YTIzYywJCTB4MTNjODg5YWYgfSwKIH07CiAKLS8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjEyICsgUkY1MTEyIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgQVI1MjEyICsgUkY1MTEyCisgKiAoV3JpdHRlbiBhZnRlciBhcjUyMTJfaW5pKSAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfbW9kZSByZjUxMTJfaW5pX21vZGVfZW5kW10gPSB7CiAJeyBBUjVLX1RYQ0ZHLAogCS8qCUEvWFIgICAgICAgICAgQiAgICAgICAgICAgRyAgICAgICAqLwpAQCAtODI1LDcgKzgzMSw5IEBACiAJeyAweGEyM2MsCQkweDEzYzg4OWFmIH0sCiB9OwogCi0vKiBJbml0aWFsIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIFJGNTQxMy81NDE0IChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCisKKy8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgUkY1NDEzLzU0MTQKKyAqIChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGF0aDVrX2luaV9tb2RlIHJmNTQxM19pbmlfbW9kZV9lbmRbXSA9IHsKIAl7IEFSNUtfVFhDRkcsCiAJLyoJQS9YUiAgICAgICAgICBCICAgICAgICAgICBHICAgICAgICovCkBAIC05NjMsNyArOTcxLDggQEAKIAl7IDB4YTM4NCwgMHhmMzMwN2ZmMCB9LAogfTsKIAotLyogSW5pdGlhbCBtb2RlLXNwZWNpZmljIHNldHRpbmdzIGZvciBSRjI0MTMvMjQxNCAoV3JpdHRlbiBhZnRlciBhcjUyMTJfaW5pKSAqLworLyogSW5pdGlhbCBtb2RlLXNwZWNpZmljIHNldHRpbmdzIGZvciBSRjI0MTMvMjQxNAorICogKFdyaXR0ZW4gYWZ0ZXIgYXI1MjEyX2luaSkgKi8KIC8qIFhYWDogYSBtb2RlID8gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX21vZGUgcmYyNDEzX2luaV9tb2RlX2VuZFtdID0gewogCXsgQVI1S19UWENGRywKQEAgLTEwODUsNyArMTA5NCw4IEBACiAJeyAweGEzODQsIDB4ZjMzMDdmZjAgfSwKIH07CiAKLS8qIEluaXRpYWwgbW9kZS1zcGVjaWZpYyBzZXR0aW5ncyBmb3IgUkYyNDI1IChXcml0dGVuIGFmdGVyIGFyNTIxMl9pbmkpICovCisvKiBJbml0aWFsIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgZm9yIFJGMjQyNQorICogKFdyaXR0ZW4gYWZ0ZXIgYXI1MjEyX2luaSkgKi8KIC8qIFhYWDogYSBtb2RlID8gKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX21vZGUgcmYyNDI1X2luaV9tb2RlX2VuZFtdID0gewogCXsgQVI1S19UWENGRywKQEAgLTEzNTcsMTAgKzEzNjcsMTUgQEAKIH07CiAKIAotLyoKLSAqIFdyaXRlIGluaXRpYWwgcmVnaXN0ZXIgZHVtcAorLyoqCisgKiBhdGg1a19od19pbmlfcmVnaXN0ZXJzKCkgLSBXcml0ZSBpbml0aWFsIHJlZ2lzdGVyIGR1bXAgY29tbW9uIGZvciBhbGwgbW9kZXMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBzaXplOiBEdW1wIHNpemUKKyAqIEBpbmlfcmVnczogVGhlIGFycmF5IG9mICZzdHJ1Y3QgYXRoNWtfaW5pCisgKiBAc2tpcF9wY3U6IFNraXAgUENVIHJlZ2lzdGVycwogICovCi1zdGF0aWMgdm9pZCBhdGg1a19od19pbmlfcmVnaXN0ZXJzKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBzaXplLAorc3RhdGljIHZvaWQKK2F0aDVrX2h3X2luaV9yZWdpc3RlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHNpemUsCiAJCWNvbnN0IHN0cnVjdCBhdGg1a19pbmkgKmluaV9yZWdzLCBib29sIHNraXBfcGN1KQogewogCXVuc2lnbmVkIGludCBpOwpAQCAtMTM4OCw3ICsxNDAzLDE1IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGg1a19od19pbmlfbW9kZV9yZWdpc3RlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwKKy8qKgorICogYXRoNWtfaHdfaW5pX21vZGVfcmVnaXN0ZXJzKCkgLSBXcml0ZSBpbml0aWFsIG1vZGUtc3BlY2lmaWMgcmVnaXN0ZXIgZHVtcAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHNpemU6IER1bXAgc2l6ZQorICogQGluaV9tb2RlOiBUaGUgYXJyYXkgb2YgJnN0cnVjdCBhdGg1a19pbmlfbW9kZQorICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKi8KK3N0YXRpYyB2b2lkCithdGg1a19od19pbmlfbW9kZV9yZWdpc3RlcnMoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJdW5zaWduZWQgaW50IHNpemUsIGNvbnN0IHN0cnVjdCBhdGg1a19pbmlfbW9kZSAqaW5pX21vZGUsCiAJCXU4IG1vZGUpCiB7CkBAIC0xNDAyLDcgKzE0MjUsMTcgQEAKIAogfQogCi1pbnQgYXRoNWtfaHdfd3JpdGVfaW5pdHZhbHMoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggbW9kZSwgYm9vbCBza2lwX3BjdSkKKy8qKgorICogYXRoNWtfaHdfd3JpdGVfaW5pdHZhbHMoKSAtIFdyaXRlIGluaXRpYWwgY2hpcC1zcGVjaWZpYyByZWdpc3RlciBkdW1wCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqIEBza2lwX3BjdTogU2tpcCBQQ1UgcmVnaXN0ZXJzCisgKgorICogV3JpdGUgaW5pdGlhbCBjaGlwLXNwZWNpZmljIHJlZ2lzdGVyIGR1bXAsIHRvIGdldCB0aGUgY2hpcHNldCBvbiBhCisgKiBjbGVhbiBhbmQgcmVhZHktdG8td29yayBzdGF0ZSBhZnRlciB3YXJtIHJlc2V0LgorICovCitpbnQKK2F0aDVrX2h3X3dyaXRlX2luaXR2YWxzKHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IG1vZGUsIGJvb2wgc2tpcF9wY3UpCiB7CiAJLyoKIAkgKiBXcml0ZSBpbml0aWFsIHJlZ2lzdGVyIHNldHRpbmdzCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGNpLmMKaW5kZXggZGZhNDhlYi4uODQ5ZmEwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY2kuYwpAQCAtOTgsNyArOTgsNyBAQAogCQkJCQkweGZmZmYpOwogCQkJcmV0dXJuIHRydWU7CiAJCX0KLQkJdWRlbGF5KDE1KTsKKwkJdXNsZWVwX3JhbmdlKDE1LCAyMCk7CiAJfQogCiAJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjdS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BjdS5jCmluZGV4IGE3ZWFmYTMuLmNlYmZkNmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9wY3UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGN1LmMKQEAgLTMwLDExICszMCw0NyBAQAogI2luY2x1ZGUgInJlZy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLS8qCisvKioKKyAqIERPQzogUHJvdG9jb2wgQ29udHJvbCBVbml0IChQQ1UpIGZ1bmN0aW9ucworICoKKyAqIFByb3RvY29sIGNvbnRyb2wgdW5pdCBpcyByZXNwb25zaWJsZSB0byBtYWludGFpbiB2YXJpb3VzIHByb3RvY29sCisgKiBwcm9wZXJ0aWVzIGJlZm9yZSBhIGZyYW1lIGlzIHNlbmQgYW5kIGFmdGVyIGEgZnJhbWUgaXMgcmVjZWl2ZWQgdG8vZnJvbQorICogYmFzZWJhbmQuIFRvIGJlIG1vcmUgc3BlY2lmaWMsIFBDVSBoYW5kbGVzOgorICoKKyAqIC0gQnVmZmVyaW5nIG9mIFJYIGFuZCBUWCBmcmFtZXMgKGFmdGVyIFFDVS9EQ1VzKQorICoKKyAqIC0gRW5jcnlwdGluZyBhbmQgZGVjcnlwdGluZyAodXNpbmcgdGhlIGJ1aWx0LWluIGVuZ2luZSkKKyAqCisgKiAtIEdlbmVyYXRpbmcgQUNLcywgUlRTL0NUUyBmcmFtZXMKKyAqCisgKiAtIE1haW50YWluaW5nIFRTRgorICoKKyAqIC0gRkNTCisgKgorICogLSBVcGRhdGluZyBiZWFjb24gZGF0YSAod2l0aCBUU0YgZXRjKQorICoKKyAqIC0gR2VuZXJhdGluZyB2aXJ0dWFsIENDQQorICoKKyAqIC0gUlgvTXVsdGljYXN0IGZpbHRlcmluZworICoKKyAqIC0gQlNTSUQgZmlsdGVyaW5nCisgKgorICogLSBWYXJpb3VzIHN0YXRpc3RpY3MKKyAqCisgKiAtRGlmZmVyZW50IG9wZXJhdGluZyBtb2RlczogQVAsIFNUQSwgSUJTUworICoKKyAqIE5vdGU6IE1vc3Qgb2YgdGhlc2UgZnVuY3Rpb25zIGNhbiBiZSB0d2Vha2VkL2J5cGFzc2VkIHNvIHlvdSBjYW4gZG8KKyAqIHRoZW0gb24gc3cgYWJvdmUgZm9yIGRlYnVnZ2luZyBvciByZXNlYXJjaC4gRm9yIG1vcmUgaW5mb3MgY2hlY2sgb3V0IFBDVQorICogcmVnaXN0ZXJzIG9uIHJlZy5oLgorICovCisKKy8qKgorICogRE9DOiBBQ0sgcmF0ZXMKKyAqCiAgKiBBUjUyMTIrIGNhbiB1c2UgaGlnaGVyIHJhdGVzIGZvciBhY2sgdHJhbnNtaXNzaW9uCiAgKiBiYXNlZCBvbiBjdXJyZW50IHR4IHJhdGUgaW5zdGVhZCBvZiB0aGUgYmFzZSByYXRlLgogICogSXQgZG9lcyB0aGlzIHRvIGJldHRlciB1dGlsaXplIGNoYW5uZWwgdXNhZ2UuCi0gKiBUaGlzIGlzIGEgbWFwcGluZyBiZXR3ZWVuIEcgcmF0ZXMgKHRoYXQgY292ZXIgYm90aAorICogVGhlcmUgaXMgYSBtYXBwaW5nIGJldHdlZW4gRyByYXRlcyAodGhhdCBjb3ZlciBib3RoCiAgKiBDQ0sgYW5kIE9GRE0pIGFuZCBhY2sgcmF0ZXMgdGhhdCB3ZSB1c2Ugd2hlbiBzZXR0aW5nCiAgKiByYXRlIC0+IGR1cmF0aW9uIHRhYmxlLiBUaGlzIG1hcHBpbmcgaXMgaHctYmFzZWQgc28KICAqIGRvbid0IGNoYW5nZSBhbnl0aGluZy4KQEAgLTYzLDE3ICs5OSwxOCBAQAogXCoqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogYXRoNWtfaHdfZ2V0X2ZyYW1lX2R1cmF0aW9uIC0gR2V0IHR4IHRpbWUgb2YgYSBmcmFtZQotICoKKyAqIGF0aDVrX2h3X2dldF9mcmFtZV9kdXJhdGlvbigpIC0gR2V0IHR4IHRpbWUgb2YgYSBmcmFtZQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGxlbjogRnJhbWUncyBsZW5ndGggaW4gYnl0ZXMKICAqIEByYXRlOiBUaGUgQHN0cnVjdCBpZWVlODAyMTFfcmF0ZQorICogQHNob3J0cHJlOiBJbmRpY2F0ZSBzaG9ydCBwcmVhbXBsZQogICoKICAqIENhbGN1bGF0ZSB0eCBkdXJhdGlvbiBvZiBhIGZyYW1lIGdpdmVuIGl0J3MgcmF0ZSBhbmQgbGVuZ3RoCiAgKiBJdCBleHRlbmRzIGllZWU4MDIxMV9nZW5lcmljX2ZyYW1lX2R1cmF0aW9uIGZvciBub24gc3RhbmRhcmQKICAqIGJ3bW9kZXMuCiAgKi8KLWludCBhdGg1a19od19nZXRfZnJhbWVfZHVyYXRpb24oc3RydWN0IGF0aDVrX2h3ICphaCwKK2ludAorYXRoNWtfaHdfZ2V0X2ZyYW1lX2R1cmF0aW9uKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCWludCBsZW4sIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZSwgYm9vbCBzaG9ydHByZSkKIHsKIAlpbnQgc2lmcywgcHJlYW1ibGUsIHBsY3BfYml0cywgc3ltX3RpbWU7CkBAIC0xMjksMTEgKzE2NiwxMSBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X2dldF9kZWZhdWx0X3Nsb3R0aW1lIC0gR2V0IHRoZSBkZWZhdWx0IHNsb3QgdGltZSBmb3IgY3VycmVudCBtb2RlCi0gKgorICogYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2xvdHRpbWUoKSAtIEdldCB0aGUgZGVmYXVsdCBzbG90IHRpbWUgZm9yIGN1cnJlbnQgbW9kZQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICovCi11bnNpZ25lZCBpbnQgYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2xvdHRpbWUoc3RydWN0IGF0aDVrX2h3ICphaCkKK3Vuc2lnbmVkIGludAorYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2xvdHRpbWUoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBhaC0+YWhfY3VycmVudF9jaGFubmVsOwogCXVuc2lnbmVkIGludCBzbG90X3RpbWU7CkBAIC0xNjAsMTEgKzE5NywxMSBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X2dldF9kZWZhdWx0X3NpZnMgLSBHZXQgdGhlIGRlZmF1bHQgU0lGUyBmb3IgY3VycmVudCBtb2RlCi0gKgorICogYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2lmcygpIC0gR2V0IHRoZSBkZWZhdWx0IFNJRlMgZm9yIGN1cnJlbnQgbW9kZQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICovCi11bnNpZ25lZCBpbnQgYXRoNWtfaHdfZ2V0X2RlZmF1bHRfc2lmcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordW5zaWduZWQgaW50CithdGg1a19od19nZXRfZGVmYXVsdF9zaWZzKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gYWgtPmFoX2N1cnJlbnRfY2hhbm5lbDsKIAl1bnNpZ25lZCBpbnQgc2lmczsKQEAgLTE5MSwxNyArMjI4LDE3IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfdXBkYXRlX21pYl9jb3VudGVycyAtIFVwZGF0ZSBNSUIgY291bnRlcnMgKG1hYyBsYXllciBzdGF0aXN0aWNzKQotICoKKyAqIGF0aDVrX2h3X3VwZGF0ZV9taWJfY291bnRlcnMoKSAtIFVwZGF0ZSBNSUIgY291bnRlcnMgKG1hYyBsYXllciBzdGF0aXN0aWNzKQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFJlYWRzIE1JQiBjb3VudGVycyBmcm9tIFBDVSBhbmQgdXBkYXRlcyBzdyBzdGF0aXN0aWNzLiBJcyBjYWxsZWQgYWZ0ZXIgYQogICogTUlCIGludGVycnVwdCwgYmVjYXVzZSBvbmUgb2YgdGhlc2UgY291bnRlcnMgbWlnaHQgaGF2ZSByZWFjaGVkIHRoZWlyIG1heGltdW0KICAqIGFuZCB0cmlnZ2VyZWQgdGhlIE1JQiBpbnRlcnJ1cHQsIHRvIGxldCB1cyByZWFkIGFuZCBjbGVhciB0aGUgY291bnRlci4KICAqCi0gKiBJcyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQhCisgKiBOT1RFOiBJcyBjYWxsZWQgaW4gaW50ZXJydXB0IGNvbnRleHQhCiAgKi8KLXZvaWQgYXRoNWtfaHdfdXBkYXRlX21pYl9jb3VudGVycyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordm9pZAorYXRoNWtfaHdfdXBkYXRlX21pYl9jb3VudGVycyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXN0cnVjdCBhdGg1a19zdGF0aXN0aWNzICpzdGF0cyA9ICZhaC0+c3RhdHM7CiAKQEAgLTIxOSwxMCArMjU2LDggQEAKIFwqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogYXRoNWtfaHdfd3JpdGVfcmF0ZV9kdXJhdGlvbiAtIGZpbGwgcmF0ZSBjb2RlIHRvIGR1cmF0aW9uIHRhYmxlCi0gKgotICogQGFoOiB0aGUgJnN0cnVjdCBhdGg1a19odwotICogQG1vZGU6IG9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKiBhdGg1a19od193cml0ZV9yYXRlX2R1cmF0aW9uKCkgLSBGaWxsIHJhdGUgY29kZSB0byBkdXJhdGlvbiB0YWJsZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFdyaXRlIHRoZSByYXRlIGNvZGUgdG8gZHVyYXRpb24gdGFibGUgdXBvbiBodyByZXNldC4gVGhpcyBpcyBhIGhlbHBlciBmb3IKICAqIGF0aDVrX2h3X3BjdV9pbml0KCkuIEl0IHNlZW1zIGFsbCB0aGlzIGlzIGRvaW5nIGlzIHNldHRpbmcgYW4gQUNLIHRpbWVvdXQgb24KQEAgLTIzNiw3ICsyNzEsOCBAQAogICogdGhhdCBpbmNsdWRlIGFsbCBPRkRNIGFuZCBDQ0sgcmF0ZXMuCiAgKgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYXRoNWtfaHdfd3JpdGVfcmF0ZV9kdXJhdGlvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorc3RhdGljIGlubGluZSB2b2lkCithdGg1a19od193cml0ZV9yYXRlX2R1cmF0aW9uKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlOwogCXVuc2lnbmVkIGludCBpOwpAQCAtMjgwLDEyICszMTYsMTIgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od19zZXRfYWNrX3RpbWVvdXQgLSBTZXQgQUNLIHRpbWVvdXQgb24gUENVCi0gKgorICogYXRoNWtfaHdfc2V0X2Fja190aW1lb3V0KCkgLSBTZXQgQUNLIHRpbWVvdXQgb24gUENVCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAdGltZW91dDogVGltZW91dCBpbiB1c2VjCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfc2V0X2Fja190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQorc3RhdGljIGludAorYXRoNWtfaHdfc2V0X2Fja190aW1lb3V0KHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCB0aW1lb3V0KQogewogCWlmIChhdGg1a19od19jbG9ja3RvaChhaCwgQVI1S19SRUdfTVMoMHhmZmZmZmZmZiwgQVI1S19USU1FX09VVF9BQ0spKQogCQkJPD0gdGltZW91dCkKQEAgLTI5OCwxMiArMzM0LDEyIEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc2V0X2N0c190aW1lb3V0IC0gU2V0IENUUyB0aW1lb3V0IG9uIFBDVQotICoKKyAqIGF0aDVrX2h3X3NldF9jdHNfdGltZW91dCgpIC0gU2V0IENUUyB0aW1lb3V0IG9uIFBDVQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQHRpbWVvdXQ6IFRpbWVvdXQgaW4gdXNlYwogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3NldF9jdHNfdGltZW91dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgdGltZW91dCkKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3NldF9jdHNfdGltZW91dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgdGltZW91dCkKIHsKIAlpZiAoYXRoNWtfaHdfY2xvY2t0b2goYWgsIEFSNUtfUkVHX01TKDB4ZmZmZmZmZmYsIEFSNUtfVElNRV9PVVRfQ1RTKSkKIAkJCTw9IHRpbWVvdXQpCkBAIC0zMjEsMTQgKzM1NywxNCBAQAogXCoqKioqKioqKioqKioqKioqKiovCiAKIC8qKgotICogYXRoNWtfaHdfc2V0X2xsYWRkciAtIFNldCBzdGF0aW9uIGlkCi0gKgorICogYXRoNWtfaHdfc2V0X2xsYWRkcigpIC0gU2V0IHN0YXRpb24gaWQKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKLSAqIEBtYWM6IFRoZSBjYXJkJ3MgbWFjIGFkZHJlc3MKKyAqIEBtYWM6IFRoZSBjYXJkJ3MgbWFjIGFkZHJlc3MgKGFycmF5IG9mIG9jdGV0cykKICAqCiAgKiBTZXQgc3RhdGlvbiBpZCBvbiBodyB1c2luZyB0aGUgcHJvdmlkZWQgbWFjIGFkZHJlc3MKICAqLwotaW50IGF0aDVrX2h3X3NldF9sbGFkZHIoc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3QgdTggKm1hYykKK2ludAorYXRoNWtfaHdfc2V0X2xsYWRkcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBjb25zdCB1OCAqbWFjKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwogCXUzMiBsb3dfaWQsIGhpZ2hfaWQ7CkBAIC0zNDksMTQgKzM4NSwxNCBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3NldF9ic3NpZCAtIFNldCBjdXJyZW50IEJTU0lEIG9uIGh3Ci0gKgorICogYXRoNWtfaHdfc2V0X2Jzc2lkKCkgLSBTZXQgY3VycmVudCBCU1NJRCBvbiBodwogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFNldHMgdGhlIGN1cnJlbnQgQlNTSUQgYW5kIEJTU0lEIG1hc2sgd2UgaGF2ZSBmcm9tIHRoZQogICogY29tbW9uIHN0cnVjdCBpbnRvIHRoZSBoYXJkd2FyZQogICovCi12b2lkIGF0aDVrX2h3X3NldF9ic3NpZChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordm9pZAorYXRoNWtfaHdfc2V0X2Jzc2lkKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJdTE2IHRpbV9vZmZzZXQgPSAwOwpAQCAtMzg5LDcgKzQyNSwyMyBAQAogCWF0aDVrX2h3X2VuYWJsZV9wc3BvbGwoYWgsIE5VTEwsIDApOwogfQogCi12b2lkIGF0aDVrX2h3X3NldF9ic3NpZF9tYXNrKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICptYXNrKQorLyoqCisgKiBhdGg1a19od19zZXRfYnNzaWRfbWFzaygpIC0gRmlsdGVyIG91dCBic3NpZHMgd2UgbGlzdGVuCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbWFzazogVGhlIEJTU0lEIG1hc2sgdG8gc2V0IChhcnJheSBvZiBvY3RldHMpCisgKgorICogQlNTSUQgbWFza2luZyBpcyBhIG1ldGhvZCB1c2VkIGJ5IEFSNTIxMiBhbmQgbmV3ZXIgaGFyZHdhcmUgdG8gaW5mb3JtIFBDVQorICogd2hpY2ggYml0cyBvZiB0aGUgaW50ZXJmYWNlJ3MgTUFDIGFkZHJlc3Mgc2hvdWxkIGJlIGxvb2tlZCBhdCB3aGVuIHRyeWluZworICogdG8gZGVjaWRlIHdoaWNoIHBhY2tldHMgdG8gQUNLLiBJbiBzdGF0aW9uIG1vZGUgYW5kIEFQIG1vZGUgd2l0aCBhIHNpbmdsZQorICogQlNTIGV2ZXJ5IGJpdCBtYXR0ZXJzIHNpbmNlIHdlIGxvY2sgdG8gb25seSBvbmUgQlNTLiBJbiBBUCBtb2RlIHdpdGgKKyAqIG11bHRpcGxlIEJTU2VzICh2aXJ0dWFsIGludGVyZmFjZXMpIG5vdCBldmVyeSBiaXQgbWF0dGVycyBiZWNhdXNlIGh3IG11c3QKKyAqIGFjY2VwdCBmcmFtZXMgZm9yIGFsbCBCU1NlcyBhbmQgc28gd2UgdHdlYWsgc29tZSBiaXRzIG9mIG91ciBtYWMgYWRkcmVzcworICogaW4gb3JkZXIgdG8gaGF2ZSBtdWx0aXBsZSBCU1Nlcy4KKyAqCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBjaGVjayBvdXQgLi4vaHcuYyBvZiB0aGUgY29tbW9uIGF0aCBtb2R1bGUuCisgKi8KK3ZvaWQKK2F0aDVrX2h3X3NldF9ic3NpZF9tYXNrKHN0cnVjdCBhdGg1a19odyAqYWgsIGNvbnN0IHU4ICptYXNrKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwogCkBAIC00MDAsMTggKzQ1MiwyMSBAQAogCQlhdGhfaHdfc2V0YnNzaWRtYXNrKGNvbW1vbik7CiB9CiAKLS8qCi0gKiBTZXQgbXVsdGljYXN0IGZpbHRlcgorLyoqCisgKiBhdGg1a19od19zZXRfbWNhc3RfZmlsdGVyKCkgLSBTZXQgbXVsdGljYXN0IGZpbHRlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGZpbHRlcjA6IExvd2VyIDMyYml0cyBvZiBtdXRpY2FzdCBmaWx0ZXIKKyAqIEBmaWx0ZXIxOiBIaWdoZXIgMTZiaXRzIG9mIG11bHRpY2FzdCBmaWx0ZXIKICAqLwotdm9pZCBhdGg1a19od19zZXRfbWNhc3RfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgsIHUzMiBmaWx0ZXIwLCB1MzIgZmlsdGVyMSkKK3ZvaWQKK2F0aDVrX2h3X3NldF9tY2FzdF9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIGZpbHRlcjAsIHUzMiBmaWx0ZXIxKQogewogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZmlsdGVyMCwgQVI1S19NQ0FTVF9GSUxURVIwKTsKIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIGZpbHRlcjEsIEFSNUtfTUNBU1RfRklMVEVSMSk7CiB9CiAKIC8qKgotICogYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlciAtIEdldCBjdXJyZW50IHJ4IGZpbHRlcgotICoKKyAqIGF0aDVrX2h3X2dldF9yeF9maWx0ZXIoKSAtIEdldCBjdXJyZW50IHJ4IGZpbHRlcgogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFJldHVybnMgdGhlIFJYIGZpbHRlciBieSByZWFkaW5nIHJ4IGZpbHRlciBhbmQKQEAgLTQyMCw3ICs0NzUsOCBAQAogICogYW5kIHBhc3MgdG8gdGhlIGRyaXZlci4gRm9yIGEgbGlzdCBvZiBmcmFtZSB0eXBlcwogICogY2hlY2sgb3V0IHJlZy5oLgogICovCi11MzIgYXRoNWtfaHdfZ2V0X3J4X2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQordTMyCithdGg1a19od19nZXRfcnhfZmlsdGVyKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJdTMyIGRhdGEsIGZpbHRlciA9IDA7CiAKQEAgLTQ0MCw4ICs0OTYsNyBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3NldF9yeF9maWx0ZXIgLSBTZXQgcnggZmlsdGVyCi0gKgorICogYXRoNWtfaHdfc2V0X3J4X2ZpbHRlcigpIC0gU2V0IHJ4IGZpbHRlcgogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQGZpbHRlcjogUlggZmlsdGVyIG1hc2sgKHNlZSByZWcuaCkKICAqCkBAIC00NDksNyArNTA0LDggQEAKICAqIHJlZ2lzdGVyIG9uIDUyMTIgYW5kIG5ld2VyIGNoaXBzIHNvIHRoYXQgd2UgaGF2ZSBwcm9wZXIgUEhZCiAgKiBlcnJvciByZXBvcnRpbmcuCiAgKi8KLXZvaWQgYXRoNWtfaHdfc2V0X3J4X2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZmlsdGVyKQordm9pZAorYXRoNWtfaHdfc2V0X3J4X2ZpbHRlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZmlsdGVyKQogewogCXUzMiBkYXRhID0gMDsKIApAQCAtNDkzLDEzICs1NDksMTMgQEAKICNkZWZpbmUgQVRINUtfTUFYX1RTRl9SRUFEIDEwCiAKIC8qKgotICogYXRoNWtfaHdfZ2V0X3RzZjY0IC0gR2V0IHRoZSBmdWxsIDY0Yml0IFRTRgotICoKKyAqIGF0aDVrX2h3X2dldF90c2Y2NCgpIC0gR2V0IHRoZSBmdWxsIDY0Yml0IFRTRgogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFJldHVybnMgdGhlIGN1cnJlbnQgVFNGCiAgKi8KLXU2NCBhdGg1a19od19nZXRfdHNmNjQoc3RydWN0IGF0aDVrX2h3ICphaCkKK3U2NAorYXRoNWtfaHdfZ2V0X3RzZjY0KHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJdTMyIHRzZl9sb3dlciwgdHNmX3VwcGVyMSwgdHNmX3VwcGVyMjsKIAlpbnQgaTsKQEAgLTUzNiwyOCArNTkyLDMwIEBACiAJcmV0dXJuICgodTY0KXRzZl91cHBlcjEgPDwgMzIpIHwgdHNmX2xvd2VyOwogfQogCisjdW5kZWYgQVRINUtfTUFYX1RTRl9SRUFECisKIC8qKgotICogYXRoNWtfaHdfc2V0X3RzZjY0IC0gU2V0IGEgbmV3IDY0Yml0IFRTRgotICoKKyAqIGF0aDVrX2h3X3NldF90c2Y2NCgpIC0gU2V0IGEgbmV3IDY0Yml0IFRTRgogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICogQHRzZjY0OiBUaGUgbmV3IDY0Yml0IFRTRgogICoKICAqIFNldHMgdGhlIG5ldyBUU0YKICAqLwotdm9pZCBhdGg1a19od19zZXRfdHNmNjQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTY0IHRzZjY0KQordm9pZAorYXRoNWtfaHdfc2V0X3RzZjY0KHN0cnVjdCBhdGg1a19odyAqYWgsIHU2NCB0c2Y2NCkKIHsKIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIHRzZjY0ICYgMHhmZmZmZmZmZiwgQVI1S19UU0ZfTDMyKTsKIAlhdGg1a19od19yZWdfd3JpdGUoYWgsICh0c2Y2NCA+PiAzMikgJiAweGZmZmZmZmZmLCBBUjVLX1RTRl9VMzIpOwogfQogCiAvKioKLSAqIGF0aDVrX2h3X3Jlc2V0X3RzZiAtIEZvcmNlIGEgVFNGIHJlc2V0Ci0gKgorICogYXRoNWtfaHdfcmVzZXRfdHNmKCkgLSBGb3JjZSBhIFRTRiByZXNldAogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIEZvcmNlcyBhIFRTRiByZXNldCBvbiBQQ1UKICAqLwotdm9pZCBhdGg1a19od19yZXNldF90c2Yoc3RydWN0IGF0aDVrX2h3ICphaCkKK3ZvaWQKK2F0aDVrX2h3X3Jlc2V0X3RzZihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXUzMiB2YWw7CiAKQEAgLTU3MywxMCArNjMxLDE3IEBACiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCB2YWwsIEFSNUtfQkVBQ09OKTsKIH0KIAotLyoKLSAqIEluaXRpYWxpemUgYmVhY29uIHRpbWVycworLyoqCisgKiBhdGg1a19od19pbml0X2JlYWNvbl90aW1lcnMoKSAtIEluaXRpYWxpemUgYmVhY29uIHRpbWVycworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQG5leHRfYmVhY29uOiBOZXh0IFRCVFQKKyAqIEBpbnRlcnZhbDogQ3VycmVudCBiZWFjb24gaW50ZXJ2YWwKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBiZWFjb24gdGltZXJzIGJhc2VkIG9uIGN1cnJlbnQKKyAqIG9wZXJhdGlvbiBtb2RlIGFuZCBzZXR0aW5ncy4KICAqLwotdm9pZCBhdGg1a19od19pbml0X2JlYWNvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgbmV4dF9iZWFjb24sIHUzMiBpbnRlcnZhbCkKK3ZvaWQKK2F0aDVrX2h3X2luaXRfYmVhY29uX3RpbWVycyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgbmV4dF9iZWFjb24sIHUzMiBpbnRlcnZhbCkKIHsKIAl1MzIgdGltZXIxLCB0aW1lcjIsIHRpbWVyMzsKIApAQCAtNjU1LDggKzcyMCw3IEBACiB9CiAKIC8qKgotICogYXRoNWtfY2hlY2tfdGltZXJfd2luIC0gQ2hlY2sgaWYgdGltZXIgQiBpcyB0aW1lciBBICsgd2luZG93Ci0gKgorICogYXRoNWtfY2hlY2tfdGltZXJfd2luKCkgLSBDaGVjayBpZiB0aW1lciBCIGlzIHRpbWVyIEEgKyB3aW5kb3cKICAqIEBhOiB0aW1lciBhIChiZWZvcmUgYikKICAqIEBiOiB0aW1lciBiIChhZnRlciBhKQogICogQHdpbmRvdzogZGlmZmVyZW5jZSBiZXR3ZWVuIGEgYW5kIGIKQEAgLTY4NiwxMiArNzUwLDExIEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfY2hlY2tfYmVhY29uX3RpbWVycyAtIENoZWNrIGlmIHRoZSBiZWFjb24gdGltZXJzIGFyZSBjb3JyZWN0Ci0gKgorICogYXRoNWtfaHdfY2hlY2tfYmVhY29uX3RpbWVycygpIC0gQ2hlY2sgaWYgdGhlIGJlYWNvbiB0aW1lcnMgYXJlIGNvcnJlY3QKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBpbnR2YWw6IGJlYWNvbiBpbnRlcnZhbAogICoKLSAqIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBJQlNTIG1vZGU6CisgKiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgSUJTUyBtb2RlCiAgKgogICogVGhlIG5lZWQgZm9yIHRoaXMgZnVuY3Rpb24gYXJpc2VzIGZyb20gdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIDQgc2VwYXJhdGUKICAqIEhXIHRpbWVyIHJlZ2lzdGVycyAoVElNRVIwIC0gVElNRVIzKSwgd2hpY2ggYXJlIGNsb3NlbHkgcmVsYXRlZCB0byB0aGUKQEAgLTc0NiwxNCArODA5LDE0IEBACiB9CiAKIC8qKgotICogYXRoNWtfaHdfc2V0X2NvdmVyYWdlX2NsYXNzIC0gU2V0IElFRUUgODAyLjExIGNvdmVyYWdlIGNsYXNzCi0gKgorICogYXRoNWtfaHdfc2V0X2NvdmVyYWdlX2NsYXNzKCkgLSBTZXQgSUVFRSA4MDIuMTEgY292ZXJhZ2UgY2xhc3MKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBjb3ZlcmFnZV9jbGFzczogSUVFRSA4MDIuMTEgY292ZXJhZ2UgY2xhc3MgbnVtYmVyCiAgKgogICogU2V0cyBJRlMgaW50ZXJ2YWxzIGFuZCBBQ0svQ1RTIHRpbWVvdXRzIGZvciBnaXZlbiBjb3ZlcmFnZSBjbGFzcy4KICAqLwotdm9pZCBhdGg1a19od19zZXRfY292ZXJhZ2VfY2xhc3Moc3RydWN0IGF0aDVrX2h3ICphaCwgdTggY292ZXJhZ2VfY2xhc3MpCit2b2lkCithdGg1a19od19zZXRfY292ZXJhZ2VfY2xhc3Moc3RydWN0IGF0aDVrX2h3ICphaCwgdTggY292ZXJhZ2VfY2xhc3MpCiB7CiAJLyogQXMgZGVmaW5lZCBieSBJRUVFIDgwMi4xMS0yMDA3IDE3LjMuOC42ICovCiAJaW50IHNsb3RfdGltZSA9IGF0aDVrX2h3X2dldF9kZWZhdWx0X3Nsb3R0aW1lKGFoKSArIDMgKiBjb3ZlcmFnZV9jbGFzczsKQEAgLTc3Miw4ICs4MzUsNyBAQAogXCoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19zdGFydF9yeF9wY3UgLSBTdGFydCBSWCBlbmdpbmUKLSAqCisgKiBhdGg1a19od19zdGFydF9yeF9wY3UoKSAtIFN0YXJ0IFJYIGVuZ2luZQogICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKICAqIFN0YXJ0cyBSWCBlbmdpbmUgb24gUENVIHNvIHRoYXQgaHcgY2FuIHByb2Nlc3MgUlhlZCBmcmFtZXMKQEAgLTc4MSwzMiArODQzLDMzIEBACiAgKgogICogTk9URTogUlggRE1BIHNob3VsZCBiZSBhbHJlYWR5IGVuYWJsZWQgdXNpbmcgYXRoNWtfaHdfc3RhcnRfcnhfZG1hCiAgKi8KLXZvaWQgYXRoNWtfaHdfc3RhcnRfcnhfcGN1KHN0cnVjdCBhdGg1a19odyAqYWgpCit2b2lkCithdGg1a19od19zdGFydF9yeF9wY3Uoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfRElBR19TVywgQVI1S19ESUFHX1NXX0RJU19SWCk7CiB9CiAKIC8qKgotICogYXQ1a19od19zdG9wX3J4X3BjdSAtIFN0b3AgUlggZW5naW5lCi0gKgorICogYXQ1a19od19zdG9wX3J4X3BjdSgpIC0gU3RvcCBSWCBlbmdpbmUKICAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCiAgKiBTdG9wcyBSWCBlbmdpbmUgb24gUENVCiAgKi8KLXZvaWQgYXRoNWtfaHdfc3RvcF9yeF9wY3Uoc3RydWN0IGF0aDVrX2h3ICphaCkKK3ZvaWQKK2F0aDVrX2h3X3N0b3BfcnhfcGN1KHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfRElBR19TVywgQVI1S19ESUFHX1NXX0RJU19SWCk7CiB9CiAKIC8qKgotICogYXRoNWtfaHdfc2V0X29wbW9kZSAtIFNldCBQQ1Ugb3BlcmF0aW5nIG1vZGUKLSAqCisgKiBhdGg1a19od19zZXRfb3Btb2RlKCkgLSBTZXQgUENVIG9wZXJhdGluZyBtb2RlCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3Ci0gKiBAb3BfbW9kZTogJmVudW0gbmw4MDIxMV9pZnR5cGUgb3BlcmF0aW5nIG1vZGUKKyAqIEBvcF9tb2RlOiBPbmUgb2YgZW51bSBubDgwMjExX2lmdHlwZQogICoKICAqIENvbmZpZ3VyZSBQQ1UgZm9yIHRoZSB2YXJpb3VzIG9wZXJhdGluZyBtb2RlcyAoQVAvU1RBIGV0YykKICAqLwotaW50IGF0aDVrX2h3X3NldF9vcG1vZGUoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBubDgwMjExX2lmdHlwZSBvcF9tb2RlKQoraW50CithdGg1a19od19zZXRfb3Btb2RlKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3BfbW9kZSkKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKIAl1MzIgcGN1X3JlZywgYmVhY29uX3JlZywgbG93X2lkLCBoaWdoX2lkOwpAQCAtODczLDggKzkzNiwxNyBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGF0aDVrX2h3X3BjdV9pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3BfbW9kZSwKLQkJCQkJCQkJdTggbW9kZSkKKy8qKgorICogYXRoNWtfaHdfcGN1X2luaXQoKSAtIEluaXRpYWxpemUgUENVCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAb3BfbW9kZTogT25lIG9mIGVudW0gbmw4MDIxMV9pZnR5cGUKKyAqIEBtb2RlOiBPbmUgb2YgZW51bSBhdGg1a19kcml2ZXJfbW9kZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIFBDVSBieSBzZXR0aW5nIGN1cnJlbnQKKyAqIG9wZXJhdGlvbiBtb2RlIGFuZCB2YXJpb3VzIG90aGVyIHNldHRpbmdzLgorICovCit2b2lkCithdGg1a19od19wY3VfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIG5sODAyMTFfaWZ0eXBlIG9wX21vZGUpCiB7CiAJLyogU2V0IGJzc2lkIGFuZCBic3NpZCBtYXNrICovCiAJYXRoNWtfaHdfc2V0X2Jzc2lkKGFoKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9waHkuYwppbmRleCAwMWNiNzJkLi5lMWY4NjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3BoeS5jCkBAIC0xLDYgKzEsNCBAQAogLyoKLSAqIFBIWSBmdW5jdGlvbnMKLSAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNyBSZXlrIEZsb2V0ZXIgPHJleWtAb3BlbmJzZC5vcmc+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBOaWNrIEtvc3NpZmlkaXMgPG1pY2tmbGVtbUBnbWFpbC5jb20+CiAgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAwOCBKaXJpIFNsYWJ5IDxqaXJpc2xhYnlAZ21haWwuY29tPgpAQCAtMjAsNiArMTgsMTAgQEAKICAqCiAgKi8KIAorLyoqKioqKioqKioqKioqKioqKioqKioqXAorKiBQSFkgcmVsYXRlZCBmdW5jdGlvbnMgKgorXCoqKioqKioqKioqKioqKioqKioqKioqLworCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgpAQCAtMzEsMTQgKzMzLDUzIEBACiAjaW5jbHVkZSAiLi4vcmVnZC5oIgogCiAKKy8qKgorICogRE9DOiBQSFkgcmVsYXRlZCBmdW5jdGlvbnMKKyAqCisgKiBIZXJlIHdlIGhhbmRsZSB0aGUgbG93LWxldmVsIGZ1bmN0aW9ucyByZWxhdGVkIHRvIGJhc2ViYW5kCisgKiBhbmQgYW5hbG9nIGZyb250ZW5kIChSRikgcGFydHMuIFRoaXMgaXMgYnkgZmFyIHRoZSBtb3N0IGNvbXBsZXgKKyAqIHBhcnQgb2YgdGhlIGh3IGNvZGUgc28gbWFrZSBzdXJlIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKyAqCisgKiBIZXJlIGlzIGEgbGlzdCBvZiB3aGF0IHRoaXMgaXMgYWxsIGFib3V0OgorICoKKyAqIC0gQ2hhbm5lbCBzZXR0aW5nL3N3aXRjaGluZworICoKKyAqIC0gQXV0b21hdGljIEdhaW4gQ29udHJvbCAoQUdDKSBjYWxpYnJhdGlvbgorICoKKyAqIC0gTm9pc2UgRmxvb3IgY2FsaWJyYXRpb24KKyAqCisgKiAtIEkvUSBpbWJhbGFuY2UgY2FsaWJyYXRpb24gKFFBTSBjb3JyZWN0aW9uKQorICoKKyAqIC0gQ2FsaWJyYXRpb24gZHVlIHRvIHRoZXJtYWwgY2hhbmdlcyAoZ2Fpbl9GKQorICoKKyAqIC0gU3B1ciBub2lzZSBtaXRpZ2F0aW9uCisgKgorICogLSBSRi9QSFkgaW5pdGlhbGl6YXRpb24gZm9yIHRoZSB2YXJpb3VzIG9wZXJhdGluZyBtb2RlcyBhbmQgYndtb2RlcworICoKKyAqIC0gQW50ZW5uYSBjb250cm9sCisgKgorICogLSBUWCBwb3dlciBjb250cm9sIHBlciBjaGFubmVsL3JhdGUvcGFja2V0IHR5cGUKKyAqCisgKiBBbHNvIGhhdmUgaW4gbWluZCB3ZSBuZXZlciBnb3QgZG9jdW1lbnRhdGlvbiBmb3IgbW9zdCBvZiB0aGVzZQorICogZnVuY3Rpb25zLCB3aGF0IHdlIGhhdmUgY29tZXMgbW9zdGx5IGZyb20gQXRoZXJvcydzIGNvZGUsIHJldmVyc2UKKyAqIGVuZ2luZWVyaW5nIGFuZCBwYXRlbnQgZG9jcy9wcmVzZW50YXRpb25zIGV0Yy4KKyAqLworCisKIC8qKioqKioqKioqKioqKioqKipcCiAqIEhlbHBlciBmdW5jdGlvbnMgKgogXCoqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIEdldCB0aGUgUEhZIENoaXAgcmV2aXNpb24KKy8qKgorICogYXRoNWtfaHdfcmFkaW9fcmV2aXNpb24oKSAtIEdldCB0aGUgUEhZIENoaXAgcmV2aXNpb24KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBiYW5kOiBPbmUgb2YgZW51bSBpZWVlODAyMTFfYmFuZAorICoKKyAqIFJldHVybnMgdGhlIHJldmlzaW9uIG51bWJlciBvZiBhIDJHSHosIDVHSHogb3Igc2luZ2xlIGNoaXAKKyAqIHJhZGlvLgogICovCi11MTYgYXRoNWtfaHdfcmFkaW9fcmV2aXNpb24oc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQordTE2CithdGg1a19od19yYWRpb19yZXZpc2lvbihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAJdTMyIHNyZXY7CkBAIC01OCw3ICs5OSw3IEBACiAJCXJldHVybiAwOwogCX0KIAotCW1kZWxheSgyKTsKKwl1c2xlZXBfcmFuZ2UoMjAwMCwgMjUwMCk7CiAKIAkvKiAuLi53YWl0IHVudGlsIFBIWSBpcyByZWFkeSBhbmQgcmVhZCB0aGUgc2VsZWN0ZWQgcmFkaW8gcmV2aXNpb24gKi8KIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIDB4MDAwMDFjMTYsIEFSNUtfUEhZKDB4MzQpKTsKQEAgLTgxLDEwICsxMjIsMTYgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogQ2hlY2sgaWYgYSBjaGFubmVsIGlzIHN1cHBvcnRlZAorLyoqCisgKiBhdGg1a19jaGFubmVsX29rKCkgLSBDaGVjayBpZiBhIGNoYW5uZWwgaXMgc3VwcG9ydGVkIGJ5IHRoZSBodworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKgorICogTm90ZTogV2UgZG9uJ3QgZG8gYW55IHJlZ3VsYXRvcnkgZG9tYWluIGNoZWNrcyBoZXJlLCBpdCdzIGp1c3QKKyAqIGEgc2FuaXR5IGNoZWNrLgogICovCi1ib29sIGF0aDVrX2NoYW5uZWxfb2soc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQorYm9vbAorYXRoNWtfY2hhbm5lbF9vayhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJdTE2IGZyZXEgPSBjaGFubmVsLT5jZW50ZXJfZnJlcTsKIApAQCAtMTAxLDcgKzE0OCwxMyBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBhdGg1a19od19jaGFuX2hhc19zcHVyX25vaXNlKHN0cnVjdCBhdGg1a19odyAqYWgsCisvKioKKyAqIGF0aDVrX2h3X2NoYW5faGFzX3NwdXJfbm9pc2UoKSAtIENoZWNrIGlmIGNoYW5uZWwgaXMgc2Vuc2l0aXZlIHRvIHNwdXIgbm9pc2UKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICovCitib29sCithdGg1a19od19jaGFuX2hhc19zcHVyX25vaXNlKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCXU4IHJlZmNsa19mcmVxOwpAQCAtMTIyLDExICsxNzUsMjAgQEAKIAkJcmV0dXJuIGZhbHNlOwogfQogCi0vKgotICogVXNlZCB0byBtb2RpZnkgUkYgQmFua3MgYmVmb3JlIHdyaXRpbmcgdGhlbSB0byBBUjVLX1JGX0JVRkZFUgorLyoqCisgKiBhdGg1a19od19yZmJfb3AoKSAtIFBlcmZvcm0gYW4gb3BlcmF0aW9uIG9uIHRoZSBnaXZlbiBSRiBCdWZmZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEByZl9yZWdzOiBUaGUgc3RydWN0IGF0aDVrX3JmX3JlZworICogQHZhbDogTmV3IHZhbHVlCisgKiBAcmVnX2lkOiBSRiByZWdpc3RlciBJRAorICogQHNldDogSW5kaWNhdGUgd2UgbmVlZCB0byBzd2FwIGRhdGEKKyAqCisgKiBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8gbW9kaWZ5IFJGIEJhbmtzIGJlZm9yZQorICogd3JpdGluZyB0aGVtIHRvIEFSNUtfUkZfQlVGRkVSLiBDaGVjayBvdXQgcmZidWZmZXIuaCBmb3IgbW9yZQorICogaW5mb3MuCiAgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgYXRoNWtfaHdfcmZiX29wKHN0cnVjdCBhdGg1a19odyAqYWgsCi0JCQkJCWNvbnN0IHN0cnVjdCBhdGg1a19yZl9yZWcgKnJmX3JlZ3MsCitzdGF0aWMgdW5zaWduZWQgaW50CithdGg1a19od19yZmJfb3Aoc3RydWN0IGF0aDVrX2h3ICphaCwgY29uc3Qgc3RydWN0IGF0aDVrX3JmX3JlZyAqcmZfcmVncywKIAkJCQkJdTMyIHZhbCwgdTggcmVnX2lkLCBib29sIHNldCkKIHsKIAljb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnICpyZnJlZyA9IE5VTEw7CkBAIC0yMDQsOCArMjY2LDcgQEAKIH0KIAogLyoqCi0gKiBhdGg1a19od193cml0ZV9vZmRtX3RpbWluZ3MgLSBzZXQgT0ZETSB0aW1pbmdzIG9uIEFSNTIxMgotICoKKyAqIGF0aDVrX2h3X3dyaXRlX29mZG1fdGltaW5ncygpIC0gc2V0IE9GRE0gdGltaW5ncyBvbiBBUjUyMTIKICAqIEBhaDogdGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBjaGFubmVsOiB0aGUgY3VycmVudGx5IHNldCBjaGFubmVsIHVwb24gcmVzZXQKICAqCkBAIC0yMTYsMTAgKzI3NywxMSBAQAogICogbWFudGlzc2EgYW5kIHByb3ZpZGUgdGhlc2UgdmFsdWVzIG9uIGh3LgogICoKICAqIEZvciBtb3JlIGluZm9zIGkgdGhpbmsgdGhpcyBwYXRlbnQgaXMgcmVsYXRlZAotICogaHR0cDovL3d3dy5mcmVlcGF0ZW50c29ubGluZS5jb20vNzE4NDQ5NS5odG1sCisgKiAiaHR0cDovL3d3dy5mcmVlcGF0ZW50c29ubGluZS5jb20vNzE4NDQ5NS5odG1sIgogICovCi1zdGF0aWMgaW5saW5lIGludCBhdGg1a19od193cml0ZV9vZmRtX3RpbWluZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCitzdGF0aWMgaW5saW5lIGludAorYXRoNWtfaHdfd3JpdGVfb2ZkbV90aW1pbmdzKHN0cnVjdCBhdGg1a19odyAqYWgsCisJCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCS8qIEdldCBleHBvbmVudCBhbmQgbWFudGlzc2EgYW5kIHNldCBpdCAqLwogCXUzMiBjb2VmX3NjYWxlZCwgY29lZl9leHAsIGNvZWZfbWFuLApAQCAtMjc4LDYgKzM0MCwxMCBAQAogCXJldHVybiAwOwogfQogCisvKioKKyAqIGF0aDVrX2h3X3BoeV9kaXNhYmxlKCkgLSBEaXNhYmxlIFBIWQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICovCiBpbnQgYXRoNWtfaHdfcGh5X2Rpc2FibGUoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAkvKkp1c3QgYSB0cnkgTS5GLiovCkBAIC0yODYsMTAgKzM1MiwxMyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogV2FpdCBmb3Igc3ludGggdG8gc2V0dGxlCisvKioKKyAqIGF0aDVrX2h3X3dhaXRfZm9yX3N5bnRoKCkgLSBXYWl0IGZvciBzeW50aCB0byBzZXR0bGUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAogICovCi1zdGF0aWMgdm9pZCBhdGg1a19od193YWl0X2Zvcl9zeW50aChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorc3RhdGljIHZvaWQKK2F0aDVrX2h3X3dhaXRfZm9yX3N5bnRoKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJLyoKQEAgLTMwOCw5ICszNzcsOSBAQAogCQkJZGVsYXkgPSBkZWxheSA8PCAyOwogCQkvKiBYWFg6IC8yIG9uIHR1cmJvID8gTGV0J3MgYmUgc2FmZQogCQkgKiBmb3Igbm93ICovCi0JCXVkZWxheSgxMDAgKyBkZWxheSk7CisJCXVzbGVlcF9yYW5nZSgxMDAgKyBkZWxheSwgMTAwICsgKDIgKiBkZWxheSkpOwogCX0gZWxzZSB7Ci0JCW1kZWxheSgxKTsKKwkJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCX0KIH0KIApAQCAtMzE5LDcgKzM4OCw5IEBACiAqIFJGIEdhaW4gb3B0aW1pemF0aW9uICoKIFwqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgorLyoqCisgKiBET0M6IFJGIEdhaW4gb3B0aW1pemF0aW9uCisgKgogICogVGhpcyBjb2RlIGlzIHVzZWQgdG8gb3B0aW1pemUgUkYgZ2FpbiBvbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzCiAgKiAodGVtcGVyYXR1cmUgbW9zdGx5KSBiYXNlZCBvbiBmZWVkYmFjayBmcm9tIGEgcG93ZXIgZGV0ZWN0b3IuCiAgKgpAQCAtMzI4LDIyICszOTksMjIgQEAKICAqIG5vIGdhaW4gb3B0aW1pemF0aW9uIGxhZGRlci0uCiAgKgogICogRm9yIG1vcmUgaW5mb3MgY2hlY2sgb3V0IHRoaXMgcGF0ZW50IGRvYwotICogaHR0cDovL3d3dy5mcmVlcGF0ZW50c29ubGluZS5jb20vNzQwMDY5MS5odG1sCisgKiAiaHR0cDovL3d3dy5mcmVlcGF0ZW50c29ubGluZS5jb20vNzQwMDY5MS5odG1sIgogICoKICAqIFRoaXMgcGFwZXIgZGVzY3JpYmVzIHBvd2VyIGRyb3BzIGFzIHNlZW4gb24gdGhlIHJlY2VpdmVyIGR1ZSB0bwogICogcHJvYmUgcGFja2V0cwotICogaHR0cDovL3d3dy5jbnJpLmRpdC5pZS9wdWJsaWNhdGlvbnMvSUNUMDglMjAtJTIwUHJhY3RpY2FsJTIwSXNzdWVzCi0gKiAlMjBvZiUyMFBvd2VyJTIwQ29udHJvbC5wZGYKKyAqICJodHRwOi8vd3d3LmNucmkuZGl0LmllL3B1YmxpY2F0aW9ucy9JQ1QwOCUyMC0lMjBQcmFjdGljYWwlMjBJc3N1ZXMKKyAqICUyMG9mJTIwUG93ZXIlMjBDb250cm9sLnBkZiIKICAqCiAgKiBBbmQgdGhpcyBpcyB0aGUgTWFkV2lGaSBidWcgZW50cnkgcmVsYXRlZCB0byB0aGUgYWJvdmUKLSAqIGh0dHA6Ly9tYWR3aWZpLXByb2plY3Qub3JnL3RpY2tldC8xNjU5CisgKiAiaHR0cDovL21hZHdpZmktcHJvamVjdC5vcmcvdGlja2V0LzE2NTkiCiAgKiB3aXRoIHZhcmlvdXMgbWVhc3VyZW1lbnRzIGFuZCBkaWFncmFtcwotICoKLSAqIFRPRE86IERlYWwgd2l0aCBwb3dlciBkcm9wcyBkdWUgdG8gcHJvYmVzIGJ5IHNldHRpbmcgYW4gYXBwcm9wcmlhdGUKLSAqIHR4IHBvd2VyIG9uIHRoZSBwcm9iZSBwYWNrZXRzICEgTWFrZSB0aGlzIHBhcnQgb2YgdGhlIGNhbGlicmF0aW9uIHByb2Nlc3MuCiAgKi8KIAotLyogSW5pdGlhbGl6ZSBhaF9nYWluIGR1cmluZyBhdHRhY2ggKi8KKy8qKgorICogYXRoNWtfaHdfcmZnYWluX29wdF9pbml0KCkgLSBJbml0aWFsaXplIGFoX2dhaW4gZHVyaW5nIGF0dGFjaAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICovCiBpbnQgYXRoNWtfaHdfcmZnYWluX29wdF9pbml0KHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJLyogSW5pdGlhbGl6ZSB0aGUgZ2FpbiBvcHRpbWl6YXRpb24gdmFsdWVzICovCkBAIC0zNjcsMTcgKzQzOCwyMSBAQAogCXJldHVybiAwOwogfQogCi0vKiBTY2hlZHVsZSBhIGdhaW4gcHJvYmUgY2hlY2sgb24gdGhlIG5leHQgdHJhbnNtaXR0ZWQgcGFja2V0LgorLyoqCisgKiBhdGg1a19od19yZXF1ZXN0X3JmZ2Fpbl9wcm9iZSgpIC0gUmVxdWVzdCBhIFBBUEQgcHJvYmUgcGFja2V0CisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogU2NoZWR1bGVzIGEgZ2FpbiBwcm9iZSBjaGVjayBvbiB0aGUgbmV4dCB0cmFuc21pdHRlZCBwYWNrZXQuCiAgKiBUaGF0IG1lYW5zIG91ciBuZXh0IHBhY2tldCBpcyBnb2luZyB0byBiZSBzZW50IHdpdGggbG93ZXIKICAqIHR4IHBvd2VyIGFuZCBhIFBlYWsgdG8gQXZlcmFnZSBQb3dlciBEZXRlY3RvciAoUEFQRCkgd2lsbCB0cnkKICAqIHRvIG1lYXN1cmUgdGhlIGdhaW4uCiAgKgotICogWFhYOiAgSG93IGFib3V0IGZvcmNpbmcgYSB0eCBwYWNrZXQgKGJ5cGFzc2luZyBQQ1UgYXJiaXRyYXRvciBldGMpCisgKiBUT0RPOiBGb3JjZSBhIHR4IHBhY2tldCAoYnlwYXNzaW5nIFBDVSBhcmJpdHJhdG9yIGV0YykKICAqIGp1c3QgYWZ0ZXIgd2UgZW5hYmxlIHRoZSBwcm9iZSBzbyB0aGF0IHdlIGRvbid0IG1lc3Mgd2l0aAotICogc3RhbmRhcmQgdHJhZmZpYyA/IE1heWJlIGl0J3MgdGltZSB0byB1c2Ugc3cgaW50ZXJydXB0cyBhbmQKLSAqIGEgcHJvYmUgdGFza2xldCAhISEKKyAqIHN0YW5kYXJkIHRyYWZmaWMuCiAgKi8KLXN0YXRpYyB2b2lkIGF0aDVrX2h3X3JlcXVlc3RfcmZnYWluX3Byb2JlKHN0cnVjdCBhdGg1a19odyAqYWgpCitzdGF0aWMgdm9pZAorYXRoNWtfaHdfcmVxdWVzdF9yZmdhaW5fcHJvYmUoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAogCS8qIFNraXAgaWYgZ2FpbiBjYWxpYnJhdGlvbiBpcyBpbmFjdGl2ZSBvcgpAQCAtMzk1LDkgKzQ3MCwxNSBAQAogCiB9CiAKLS8qIENhbGN1bGF0ZSBnYWluX0YgbWVhc3VyZW1lbnQgY29ycmVjdGlvbgotICogYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RlcCBmb3IgUkY1MTEyIHJldi4gMiAqLwotc3RhdGljIHUzMiBhdGg1a19od19yZl9nYWluZl9jb3JyKHN0cnVjdCBhdGg1a19odyAqYWgpCisvKioKKyAqIGF0aDVrX2h3X3JmX2dhaW5mX2NvcnIoKSAtIENhbGN1bGF0ZSBHYWluX0YgbWVhc3VyZW1lbnQgY29ycmVjdGlvbgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICoKKyAqIENhbGN1bGF0ZSBHYWluX0YgbWVhc3VyZW1lbnQgY29ycmVjdGlvbgorICogYmFzZWQgb24gdGhlIGN1cnJlbnQgc3RlcCBmb3IgUkY1MTEyIHJldi4gMgorICovCitzdGF0aWMgdTMyCithdGg1a19od19yZl9nYWluZl9jb3JyKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJdTMyIG1peCwgc3RlcDsKIAl1MzIgKnJmOwpAQCAtNDUwLDExICs1MzEsMTkgQEAKIAlyZXR1cm4gYWgtPmFoX2dhaW4uZ19mX2NvcnI7CiB9CiAKLS8qIENoZWNrIGlmIGN1cnJlbnQgZ2Fpbl9GIG1lYXN1cmVtZW50IGlzIGluIHRoZSByYW5nZSBvZiBvdXIKKy8qKgorICogYXRoNWtfaHdfcmZfY2hlY2tfZ2FpbmZfcmVhZGJhY2soKSAtIFZhbGlkYXRlIEdhaW5fRiBmZWVkYmFjayBmcm9tIGRldGVjdG9yCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogQ2hlY2sgaWYgY3VycmVudCBnYWluX0YgbWVhc3VyZW1lbnQgaXMgaW4gdGhlIHJhbmdlIG9mIG91cgogICogcG93ZXIgZGV0ZWN0b3Igd2luZG93cy4gSWYgd2UgZ2V0IGEgbWVhc3VyZW1lbnQgb3V0c2lkZSByYW5nZQogICogd2Uga25vdyBpdCdzIG5vdCBhY2N1cmF0ZSAoZGV0ZWN0b3JzIGNhbid0IG1lYXN1cmUgYW55dGhpbmcgb3V0c2lkZQotICogdGhlaXIgZGV0ZWN0aW9uIHdpbmRvdykgc28gd2UgbXVzdCBpZ25vcmUgaXQgKi8KLXN0YXRpYyBib29sIGF0aDVrX2h3X3JmX2NoZWNrX2dhaW5mX3JlYWRiYWNrKHN0cnVjdCBhdGg1a19odyAqYWgpCisgKiB0aGVpciBkZXRlY3Rpb24gd2luZG93KSBzbyB3ZSBtdXN0IGlnbm9yZSBpdC4KKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgcmVhZGJhY2sgd2FzIE8uSy4gb3IgZmFsc2Ugb24gZmFpbHVyZQorICovCitzdGF0aWMgYm9vbAorYXRoNWtfaHdfcmZfY2hlY2tfZ2FpbmZfcmVhZGJhY2soc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAljb25zdCBzdHJ1Y3QgYXRoNWtfcmZfcmVnICpyZl9yZWdzOwogCXUzMiBzdGVwLCBtaXhfb3ZyLCBsZXZlbFs0XTsKQEAgLTUwNiw5ICs1OTUsMTUgQEAKIAkJCWFoLT5haF9nYWluLmdfY3VycmVudCA8PSBsZXZlbFszXSk7CiB9CiAKLS8qIFBlcmZvcm0gZ2Fpbl9GIGFkanVzdG1lbnQgYnkgY2hvb3NpbmcgdGhlIHJpZ2h0IHNldAotICogb2YgcGFyYW1ldGVycyBmcm9tIFJGIGdhaW4gb3B0aW1pemF0aW9uIGxhZGRlciAqLwotc3RhdGljIHM4IGF0aDVrX2h3X3JmX2dhaW5mX2FkanVzdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorLyoqCisgKiBhdGg1a19od19yZl9nYWluZl9hZGp1c3QoKSAtIFBlcmZvcm0gR2Fpbl9GIGFkanVzdG1lbnQKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqCisgKiBDaG9vc2UgdGhlIHJpZ2h0IHRhcmdldCBnYWluIGJhc2VkIG9uIGN1cnJlbnQgZ2FpbgorICogYW5kIFJGIGdhaW4gb3B0aW1pemF0aW9uIGxhZGRlcgorICovCitzdGF0aWMgczgKK2F0aDVrX2h3X3JmX2dhaW5mX2FkanVzdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCWNvbnN0IHN0cnVjdCBhdGg1a19nYWluX29wdCAqZ287CiAJY29uc3Qgc3RydWN0IGF0aDVrX2dhaW5fb3B0X3N0ZXAgKmdfc3RlcDsKQEAgLTU3MiwxMyArNjY3LDE4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyogTWFpbiBjYWxsYmFjayBmb3IgdGhlcm1hbCBSRiBnYWluIGNhbGlicmF0aW9uIGVuZ2luZQorLyoqCisgKiBhdGg1a19od19nYWluZl9jYWxpYnJhdGUoKSAtIERvIGEgZ2Fpbl9GIGNhbGlicmF0aW9uCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogTWFpbiBjYWxsYmFjayBmb3IgdGhlcm1hbCBSRiBnYWluIGNhbGlicmF0aW9uIGVuZ2luZQogICogQ2hlY2sgZm9yIGEgbmV3IGdhaW4gcmVhZGluZyBhbmQgc2NoZWR1bGUgYW4gYWRqdXN0bWVudAogICogaWYgbmVlZGVkLgogICoKLSAqIFRPRE86IFVzZSBzdyBpbnRlcnJ1cHQgdG8gc2NoZWR1bGUgcmVzZXQgaWYgZ2Fpbl9GIG5lZWRzCi0gKiBhZGp1c3RtZW50ICovCi1lbnVtIGF0aDVrX3JmZ2FpbiBhdGg1a19od19nYWluZl9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCkKKyAqIFJldHVybnMgb25lIG9mIGVudW0gYXRoNWtfcmZnYWluIGNvZGVzCisgKi8KK2VudW0gYXRoNWtfcmZnYWluCithdGg1a19od19nYWluZl9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAl1MzIgZGF0YSwgdHlwZTsKIAlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKQEAgLTYzOCwxMCArNzM4LDE4IEBACiAJcmV0dXJuIGFoLT5haF9nYWluLmdfc3RhdGU7CiB9CiAKLS8qIFdyaXRlIGluaXRpYWwgUkYgZ2FpbiB0YWJsZSB0byBzZXQgdGhlIFJGIHNlbnNpdGl2aXR5Ci0gKiB0aGlzIG9uZSB3b3JrcyBvbiBhbGwgUkYgY2hpcHMgYW5kIGhhcyBub3RoaW5nIHRvIGRvCi0gKiB3aXRoIGdhaW5fRiBjYWxpYnJhdGlvbiAqLwotc3RhdGljIGludCBhdGg1a19od19yZmdhaW5faW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCisvKioKKyAqIGF0aDVrX2h3X3JmZ2Fpbl9pbml0KCkgLSBXcml0ZSBpbml0aWFsIFJGIGdhaW4gc2V0dGluZ3MgdG8gaHcKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBiYW5kOiBPbmUgb2YgZW51bSBpZWVlODAyMTFfYmFuZAorICoKKyAqIFdyaXRlIGluaXRpYWwgUkYgZ2FpbiB0YWJsZSB0byBzZXQgdGhlIFJGIHNlbnNpdGl2aXR5LgorICoKKyAqIE5PVEU6IFRoaXMgb25lIHdvcmtzIG9uIGFsbCBSRiBjaGlwcyBhbmQgaGFzIG5vdGhpbmcgdG8gZG8KKyAqIHdpdGggR2Fpbl9GIGNhbGlicmF0aW9uCisgKi8KK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3JmZ2Fpbl9pbml0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKIHsKIAljb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX3JmZ2FpbiAqYXRoNWtfcmZnOwogCXVuc2lnbmVkIGludCBpLCBzaXplLCBpbmRleDsKQEAgLTY4OCwxNiArNzk2LDIzIEBACiB9CiAKIAotCiAvKioqKioqKioqKioqKioqKioqKipcCiAqIFJGIFJlZ2lzdGVycyBzZXR1cCAqCiBcKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBTZXR1cCBSRiByZWdpc3RlcnMgYnkgd3JpdGluZyBSRiBidWZmZXIgb24gaHcKKy8qKgorICogYXRoNWtfaHdfcmZyZWdzX2luaXQoKSAtIEluaXRpYWxpemUgUkYgcmVnaXN0ZXIgc2V0dGluZ3MKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKgorICogU2V0dXAgUkYgcmVnaXN0ZXJzIGJ5IHdyaXRpbmcgUkYgYnVmZmVyIG9uIGh3LiBGb3IKKyAqIG1vcmUgaW5mb3Mgb24gdGhpcywgY2hlY2sgb3V0IHJmYnVmZmVyLmgKICAqLwotc3RhdGljIGludCBhdGg1a19od19yZnJlZ3NfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwgdW5zaWduZWQgaW50IG1vZGUpCitzdGF0aWMgaW50CithdGg1a19od19yZnJlZ3NfaW5pdChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAorCQkJdW5zaWduZWQgaW50IG1vZGUpCiB7CiAJY29uc3Qgc3RydWN0IGF0aDVrX3JmX3JlZyAqcmZfcmVnczsKIAljb25zdCBzdHJ1Y3QgYXRoNWtfaW5pX3JmYnVmZmVyICppbmlfcmZiOwpAQCAtMTA1NSwxOSArMTE3MCwxOCBAQAogICBQSFkvUkYgY2hhbm5lbCBmdW5jdGlvbnMKIFwqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIENvbnZlcnNpb24gbmVlZGVkIGZvciBSRjUxMTAKKy8qKgorICogYXRoNWtfaHdfcmY1MTEwX2NoYW4yYXRoY2hhbigpIC0gQ29udmVydCBjaGFubmVsIGZyZXEgb24gUkY1MTEwCisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCisgKiBNYXAgY2hhbm5lbCBmcmVxdWVuY3kgdG8gSUVFRSBjaGFubmVsIG51bWJlciBhbmQgY29udmVydCBpdAorICogdG8gYW4gaW50ZXJuYWwgY2hhbm5lbCB2YWx1ZSB1c2VkIGJ5IHRoZSBSRjUxMTAgY2hpcHNldC4KICAqLwotc3RhdGljIHUzMiBhdGg1a19od19yZjUxMTBfY2hhbjJhdGhjaGFuKHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKK3N0YXRpYyB1MzIKK2F0aDVrX2h3X3JmNTExMF9jaGFuMmF0aGNoYW4oc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCXUzMiBhdGhjaGFuOwogCi0JLyoKLQkgKiBDb252ZXJ0IElFRUUgY2hhbm5lbC9NSHogdG8gYW4gaW50ZXJuYWwgY2hhbm5lbCB2YWx1ZSB1c2VkCi0JICogYnkgdGhlIEFSNTIxMCBjaGlwc2V0LiBUaGlzIGhhcyBub3QgYmVlbiB2ZXJpZmllZCB3aXRoCi0JICogbmV3ZXIgY2hpcHNldHMgbGlrZSB0aGUgQVI1MjEyQSB3aG8gaGF2ZSBhIGNvbXBsZXRlbHkKLQkgKiBkaWZmZXJlbnQgUkYvUEhZIHBhcnQuCi0JICovCiAJYXRoY2hhbiA9IChhdGg1a19od19iaXRzd2FwKAogCQkJKGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbCgKIAkJCQljaGFubmVsLT5jZW50ZXJfZnJlcSkgLSAyNCkgLyAyLCA1KQpAQCAtMTA3NSwxMCArMTE4OSwxMyBAQAogCXJldHVybiBhdGhjaGFuOwogfQogCi0vKgotICogU2V0IGNoYW5uZWwgb24gUkY1MTEwCisvKioKKyAqIGF0aDVrX2h3X3JmNTExMF9jaGFubmVsKCkgLSBTZXQgY2hhbm5lbCBmcmVxdWVuY3kgb24gUkY1MTEwCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKICAqLwotc3RhdGljIGludCBhdGg1a19od19yZjUxMTBfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorc3RhdGljIGludAorYXRoNWtfaHdfcmY1MTEwX2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCXUzMiBkYXRhOwpAQCAtMTA4OSwxNSArMTIwNiwyMyBAQAogCWRhdGEgPSBhdGg1a19od19yZjUxMTBfY2hhbjJhdGhjaGFuKGNoYW5uZWwpOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgZGF0YSwgQVI1S19SRl9CVUZGRVIpOwogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgMCwgQVI1S19SRl9CVUZGRVJfQ09OVFJPTF8wKTsKLQltZGVsYXkoMSk7CisJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBDb252ZXJzaW9uIG5lZWRlZCBmb3IgNTExMQorLyoqCisgKiBhdGg1a19od19yZjUxMTFfY2hhbjJhdGhjaGFuKCkgLSBIYW5kbGUgMkdIeiBjaGFubmVscyBvbiBSRjUxMTEvMjExMQorICogQGllZWU6IElFRUUgY2hhbm5lbCBudW1iZXIKKyAqIEBhdGhjaGFuOiBUaGUgJnN0cnVjdCBhdGg1a19hdGhjaGFuXzJnaHoKKyAqCisgKiBJbiBvcmRlciB0byBlbmFibGUgdGhlIFJGMjExMSBmcmVxdWVuY3kgY29udmVydGVyIG9uIFJGNTExMS8yMTExIHNldHVwcworICogd2UgbmVlZCB0byBhZGQgc29tZSBvZmZzZXRzIGFuZCBleHRyYSBmbGFncyB0byB0aGUgZGF0YSB2YWx1ZXMgd2UgcGFzcworICogb24gdG8gdGhlIFBIWS4gU28gZm9yIGV2ZXJ5IDJHSHogY2hhbm5lbCB0aGlzIGZ1bmN0aW9uIGdldHMgY2FsbGVkCisgKiB0byBkbyB0aGUgY29udmVyc2lvbi4KICAqLwotc3RhdGljIGludCBhdGg1a19od19yZjUxMTFfY2hhbjJhdGhjaGFuKHVuc2lnbmVkIGludCBpZWVlLAorc3RhdGljIGludAorYXRoNWtfaHdfcmY1MTExX2NoYW4yYXRoY2hhbih1bnNpZ25lZCBpbnQgaWVlZSwKIAkJc3RydWN0IGF0aDVrX2F0aGNoYW5fMmdoeiAqYXRoY2hhbikKIHsKIAlpbnQgY2hhbm5lbDsKQEAgLTExMjMsMTAgKzEyNDgsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFNldCBjaGFubmVsIG9uIDUxMTEKKy8qKgorICogYXRoNWtfaHdfcmY1MTExX2NoYW5uZWwoKSAtIFNldCBjaGFubmVsIGZyZXF1ZW5jeSBvbiBSRjUxMTEvMjExMQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfcmY1MTExX2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3JmNTExMV9jaGFubmVsKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAlzdHJ1Y3QgYXRoNWtfYXRoY2hhbl8yZ2h6IGF0aDVrX2NoYW5uZWxfMmdoejsKQEAgLTExNzEsMTAgKzEyOTksMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFNldCBjaGFubmVsIG9uIDUxMTIgYW5kIG5ld2VyCisvKioKKyAqIGF0aDVrX2h3X3JmNTExMl9jaGFubmVsKCkgLSBTZXQgY2hhbm5lbCBmcmVxdWVuY3kgb24gNTExMiBhbmQgbmV3ZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIE9uIFJGNTExMi8yMTEyIGFuZCBuZXdlciB3ZSBkb24ndCBuZWVkIHRvIGRvIGFueSBjb252ZXJzaW9uLgorICogV2UgcGFzcyB0aGUgZnJlcXVlbmN5IHZhbHVlIGFmdGVyIGEgZmV3IG1vZGlmaWNhdGlvbnMgdG8gdGhlCisgKiBjaGlwIGRpcmVjdGx5LgorICoKKyAqIE5PVEU6IE1ha2Ugc3VyZSBjaGFubmVsIGZyZXF1ZW5jeSBnaXZlbiBpcyB3aXRoaW4gb3VyIHJhbmdlIG9yIGVsc2UKKyAqIHdlIG1pZ2h0IGRhbWFnZSB0aGUgY2hpcCAhIFVzZSBhdGg1a19jaGFubmVsX29rIGJlZm9yZSBjYWxsaW5nIHRoaXMgb25lLgogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3JmNTExMl9jaGFubmVsKHN0cnVjdCBhdGg1a19odyAqYWgsCitzdGF0aWMgaW50CithdGg1a19od19yZjUxMTJfY2hhbm5lbChzdHJ1Y3QgYXRoNWtfaHcgKmFoLAogCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJdTMyIGRhdGEsIGRhdGEwLCBkYXRhMSwgZGF0YTI7CkBAIC0xMTgzLDE3ICsxMzIxLDM3IEBACiAJZGF0YSA9IGRhdGEwID0gZGF0YTEgPSBkYXRhMiA9IDA7CiAJYyA9IGNoYW5uZWwtPmNlbnRlcl9mcmVxOwogCisJLyogTXkgZ3Vlc3MgYmFzZWQgb24gY29kZToKKwkgKiAyR0h6IFJGIGhhcyAyIHN5bnRoIG1vZGVzLCBvbmUgd2l0aCBhIExvY2FsIE9zY2lsbGF0b3IKKwkgKiBhdCAyMjI0SHogYW5kIG9uZSB3aXRoIGEgTE8gYXQgMjE5Mkh6LiBJRiBpcyAxNTIwSHoKKwkgKiAoMzA0MC8yKS4gZGF0YTAgaXMgdXNlZCB0byBzZXQgdGhlIFBMTCBkaXZpZGVyIGFuZCBkYXRhMQorCSAqIHNlbGVjdHMgc3ludGggbW9kZS4gKi8KIAlpZiAoYyA8IDQ4MDApIHsKKwkJLyogQ2hhbm5lbCAxNCBhbmQgYWxsIGZyZXF1ZW5jaWVzIHdpdGggMkh6IHNwYWNpbmcKKwkJICogYmVsb3cvYWJvdmUgKG5vbi1zdGFuZGFyZCBjaGFubmVscykgKi8KIAkJaWYgKCEoKGMgLSAyMjI0KSAlIDUpKSB7CisJCQkvKiBTYW1lIGFzIChjIC0gMjIyNCkgLyA1ICovCiAJCQlkYXRhMCA9ICgoMiAqIChjIC0gNzA0KSkgLSAzMDQwKSAvIDEwOwogCQkJZGF0YTEgPSAxOworCQkvKiBDaGFubmVsIDEgYW5kIGFsbCBmcmVxdWVuY2llcyB3aXRoIDVIeiBzcGFjaW5nCisJCSAqIGJlbG93L2Fib3ZlIChzdGFuZGFyZCBjaGFubmVscyB3aXRob3V0IGNoYW5uZWwgMTQpICovCiAJCX0gZWxzZSBpZiAoISgoYyAtIDIxOTIpICUgNSkpIHsKKwkJCS8qIFNhbWUgYXMgKGMgLSAyMTkyKSAvIDUgKi8KIAkJCWRhdGEwID0gKCgyICogKGMgLSA2NzIpKSAtIDMwNDApIC8gMTA7CiAJCQlkYXRhMSA9IDA7CiAJCX0gZWxzZQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJZGF0YTAgPSBhdGg1a19od19iaXRzd2FwKChkYXRhMCA8PCAyKSAmIDB4ZmYsIDgpOworCS8qIFRoaXMgaXMgbW9yZSBjb21wbGV4LCB3ZSBoYXZlIGEgc2luZ2xlIHN5bnRoZXNpemVyIHdpdGgKKwkgKiA0IHJlZmVyZW5jZSBjbG9jayBzZXR0aW5ncyAoPykgYmFzZWQgb24gZnJlcXVlbmN5IHNwYWNpbmcKKwkgKiBhbmQgc2V0IHVzaW5nIGRhdGEyLiBMTyBpcyBhdCA0ODAwSHogYW5kIGRhdGEwIGlzIGFnYWluIHVzZWQKKwkgKiB0byBzZXQgc29tZSBkaXZpZGVyLgorCSAqCisJICogTk9URTogVGhlcmUgaXMgYW4gb2xkIGF0aGVyb3MgcHJlc2VudGF0aW9uIGF0IFN0YW5mb3JkCisJICogdGhhdCBtZW50aW9ucyBhIG1ldGhvZCBjYWxsZWQgZHVhbCBkaXJlY3QgY29udmVyc2lvbgorCSAqIHdpdGggMUdIeiBzbGlkaW5nIElGIGZvciBSRjUxMTAuIE1heWJlIHRoYXQncyB3aGF0IHdlCisJICogaGF2ZSBoZXJlLCBvciBhbiB1cGRhdGVkIHZlcnNpb24uICovCiAJfSBlbHNlIGlmICgoYyAlIDUpICE9IDIgfHwgYyA+IDU0MzUpIHsKIAkJaWYgKCEoYyAlIDIwKSAmJiBjID49IDUxMjApIHsKIAkJCWRhdGEwID0gYXRoNWtfaHdfYml0c3dhcCgoKGMgLSA0ODAwKSAvIDIwIDw8IDIpLCA4KTsKQEAgLTEyMTksMTAgKzEzNzcsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFNldCB0aGUgY2hhbm5lbCBvbiB0aGUgUkYyNDI1CisvKioKKyAqIGF0aDVrX2h3X3JmMjQyNV9jaGFubmVsKCkgLSBTZXQgY2hhbm5lbCBmcmVxdWVuY3kgb24gUkYyNDI1CisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCisgKiBBUjI0MjUvMjQxNyBoYXZlIGEgZGlmZmVyZW50IDJHSHogUkYgc28gY29kZSBjaGFuZ2VzCisgKiBhIGxpdHRsZSBiaXQgZnJvbSBSRjUxMTIuCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfcmYyNDI1X2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3JmMjQyNV9jaGFubmVsKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKIHsKIAl1MzIgZGF0YSwgZGF0YTAsIGRhdGEyOwpAQCAtMTI1OCwxMCArMTQyMiwxNiBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IGEgY2hhbm5lbCBvbiB0aGUgcmFkaW8gY2hpcAorLyoqCisgKiBhdGg1a19od19jaGFubmVsKCkgLSBTZXQgYSBjaGFubmVsIG9uIHRoZSByYWRpbyBjaGlwCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCisgKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIGNhbGxlZCB0byBzZXQgYSBjaGFubmVsIG9uIHRoZQorICogcmFkaW8gY2hpcCBiYXNlZCBvbiB0aGUgcmFkaW8gY2hpcCB2ZXJzaW9uLgogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X2NoYW5uZWwoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCWludCByZXQ7CkBAIC0xMzEzLDExICsxNDgzLDQ2IEBACiAJcmV0dXJuIDA7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqXAogICBQSFkgY2FsaWJyYXRpb24KIFwqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHMzMiBhdGg1a19od19yZWFkX21lYXN1cmVkX25vaXNlX2Zsb29yKHN0cnVjdCBhdGg1a19odyAqYWgpCisvKioKKyAqIERPQzogUEhZIENhbGlicmF0aW9uIHJvdXRpbmVzCisgKgorICogTm9pc2UgZmxvb3IgY2FsaWJyYXRpb246IFdoZW4gd2UgdGVsbCB0aGUgaGFyZHdhcmUgdG8KKyAqIHBlcmZvcm0gYSBub2lzZSBmbG9vciBjYWxpYnJhdGlvbiBieSBzZXR0aW5nIHRoZQorICogQVI1S19QSFlfQUdDQ1RMX05GIGJpdCBvbiBBUjVLX1BIWV9BR0NDVEwsIGl0IHdpbGwgcGVyaW9kaWNhbGx5CisgKiBzYW1wbGUtYW5kLWhvbGQgdGhlIG1pbmltdW0gbm9pc2UgbGV2ZWwgc2VlbiBhdCB0aGUgYW50ZW5uYXMuCisgKiBUaGlzIHZhbHVlIGlzIHRoZW4gc3RvcmVkIGluIGEgcmluZyBidWZmZXIgb2YgcmVjZW50bHkgbWVhc3VyZWQKKyAqIG5vaXNlIGZsb29yIHZhbHVlcyBzbyB3ZSBoYXZlIGEgbW92aW5nIHdpbmRvdyBvZiB0aGUgbGFzdCBmZXcKKyAqIHNhbXBsZXMuIFRoZSBtZWRpYW4gb2YgdGhlIHZhbHVlcyBpbiB0aGUgaGlzdG9yeSBpcyB0aGVuIGxvYWRlZAorICogaW50byB0aGUgaGFyZHdhcmUgZm9yIGl0cyBvd24gdXNlIGZvciBSU1NJIGFuZCBDQ0EgbWVhc3VyZW1lbnRzLgorICogVGhpcyB0eXBlIG9mIGNhbGlicmF0aW9uIGRvZXNuJ3QgaW50ZXJmZXJlIHdpdGggdHJhZmZpYy4KKyAqCisgKiBBR0MgY2FsaWJyYXRpb246IFdoZW4gd2UgdGVsbCB0aGUgaGFyZHdhcmUgdG8gcGVyZm9ybQorICogYW4gQUdDIChBdXRvbWF0aWMgR2FpbiBDb250cm9sKSBjYWxpYnJhdGlvbiBieSBzZXR0aW5nIHRoZQorICogQVI1S19QSFlfQUdDQ1RMX0NBTCwgaHcgZGlzY29ubmVjdHMgdGhlIGFudGVubmFzIGFuZCBkb2VzCisgKiBhIGNhbGlicmF0aW9uIG9uIHRoZSBEQyBvZmZzZXRzIG9mIEFEQ3MuIER1cmluZyB0aGlzIHBlcmlvZAorICogcngvdHggZ2V0cyBkaXNhYmxlZCBzbyB3ZSBoYXZlIHRvIGRlYWwgd2l0aCBpdCBvbiB0aGUgZHJpdmVyCisgKiBwYXJ0LgorICoKKyAqIEkvUSBjYWxpYnJhdGlvbjogV2hlbiB3ZSB0ZWxsIHRoZSBoYXJkd2FyZSB0byBwZXJmb3JtCisgKiBhbiBJL1EgY2FsaWJyYXRpb24sIGl0IHRyaWVzIHRvIGNvcnJlY3QgSS9RIGltYmFsYW5jZSBhbmQKKyAqIGZpeCBRQU0gY29uc3RlbGxhdGlvbiBieSBzYW1wbGluZyBkYXRhIGZyb20gcnhlZCBmcmFtZXMuCisgKiBJdCBkb2Vzbid0IGludGVyZmVyZSB3aXRoIHRyYWZmaWMuCisgKgorICogRm9yIG1vcmUgaW5mb3Mgb24gQUdDIGFuZCBJL1EgY2FsaWJyYXRpb24gY2hlY2sgb3V0IHBhdGVudCBkb2MKKyAqICMwMy8wOTQ0NjMuCisgKi8KKworLyoqCisgKiBhdGg1a19od19yZWFkX21lYXN1cmVkX25vaXNlX2Zsb29yKCkgLSBSZWFkIG1lYXN1cmVkIE5GIGZyb20gaHcKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqLworc3RhdGljIHMzMgorYXRoNWtfaHdfcmVhZF9tZWFzdXJlZF9ub2lzZV9mbG9vcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXMzMiB2YWw7CiAKQEAgLTEzMjUsNyArMTUzMCwxMiBAQAogCXJldHVybiBzaWduX2V4dGVuZDMyKEFSNUtfUkVHX01TKHZhbCwgQVI1S19QSFlfTkZfTUlOQ0NBX1BXUiksIDgpOwogfQogCi12b2lkIGF0aDVrX2h3X2luaXRfbmZjYWxfaGlzdChzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorLyoqCisgKiBhdGg1a19od19pbml0X25mY2FsX2hpc3QoKSAtIEluaXRpYWxpemUgTkYgY2FsaWJyYXRpb24gaGlzdG9yeSBidWZmZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqLwordm9pZAorYXRoNWtfaHdfaW5pdF9uZmNhbF9oaXN0KHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJaW50IGk7CiAKQEAgLTEzMzQsNiArMTU0NCwxMSBAQAogCQlhaC0+YWhfbmZjYWxfaGlzdC5uZnZhbFtpXSA9IEFSNUtfVFVORV9DQ0FfTUFYX0dPT0RfVkFMVUU7CiB9CiAKKy8qKgorICogYXRoNWtfaHdfdXBkYXRlX25mY2FsX2hpc3QoKSAtIFVwZGF0ZSBORiBjYWxpYnJhdGlvbiBoaXN0b3J5IGJ1ZmZlcgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQG5vaXNlX2Zsb29yOiBUaGUgTkYgd2UgZ290IGZyb20gaHcKKyAqLwogc3RhdGljIHZvaWQgYXRoNWtfaHdfdXBkYXRlX25mY2FsX2hpc3Qoc3RydWN0IGF0aDVrX2h3ICphaCwgczE2IG5vaXNlX2Zsb29yKQogewogCXN0cnVjdCBhdGg1a19uZmNhbF9oaXN0ICpoaXN0ID0gJmFoLT5haF9uZmNhbF9oaXN0OwpAQCAtMTM0MSw3ICsxNTU2LDEyIEBACiAJaGlzdC0+bmZ2YWxbaGlzdC0+aW5kZXhdID0gbm9pc2VfZmxvb3I7CiB9CiAKLXN0YXRpYyBzMTYgYXRoNWtfaHdfZ2V0X21lZGlhbl9ub2lzZV9mbG9vcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQorLyoqCisgKiBhdGg1a19od19nZXRfbWVkaWFuX25vaXNlX2Zsb29yKCkgLSBHZXQgbWVkaWFuIE5GIGZyb20gaGlzdG9yeSBidWZmZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqLworc3RhdGljIHMxNgorYXRoNWtfaHdfZ2V0X21lZGlhbl9ub2lzZV9mbG9vcihzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCXMxNiBzb3J0W0FUSDVLX05GX0NBTF9ISVNUX01BWF07CiAJczE2IHRtcDsKQEAgLTEzNjQsMTggKzE1ODQsMTYgQEAKIAlyZXR1cm4gc29ydFsoQVRINUtfTkZfQ0FMX0hJU1RfTUFYIC0gMSkgLyAyXTsKIH0KIAotLyoKLSAqIFdoZW4gd2UgdGVsbCB0aGUgaGFyZHdhcmUgdG8gcGVyZm9ybSBhIG5vaXNlIGZsb29yIGNhbGlicmF0aW9uCi0gKiBieSBzZXR0aW5nIHRoZSBBUjVLX1BIWV9BR0NDVExfTkYgYml0LCBpdCB3aWxsIHBlcmlvZGljYWxseQotICogc2FtcGxlLWFuZC1ob2xkIHRoZSBtaW5pbXVtIG5vaXNlIGxldmVsIHNlZW4gYXQgdGhlIGFudGVubmFzLgotICogVGhpcyB2YWx1ZSBpcyB0aGVuIHN0b3JlZCBpbiBhIHJpbmcgYnVmZmVyIG9mIHJlY2VudGx5IG1lYXN1cmVkCi0gKiBub2lzZSBmbG9vciB2YWx1ZXMgc28gd2UgaGF2ZSBhIG1vdmluZyB3aW5kb3cgb2YgdGhlIGxhc3QgZmV3Ci0gKiBzYW1wbGVzLgorLyoqCisgKiBhdGg1a19od191cGRhdGVfbm9pc2VfZmxvb3IoKSAtIFVwZGF0ZSBORiBvbiBoYXJkd2FyZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKLSAqIFRoZSBtZWRpYW4gb2YgdGhlIHZhbHVlcyBpbiB0aGUgaGlzdG9yeSBpcyB0aGVuIGxvYWRlZCBpbnRvIHRoZQotICogaGFyZHdhcmUgZm9yIGl0cyBvd24gdXNlIGZvciBSU1NJIGFuZCBDQ0EgbWVhc3VyZW1lbnRzLgorICogVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbiB3ZSBjYWxsIHRvIHBlcmZvcm0gYSBORiBjYWxpYnJhdGlvbiwKKyAqIGl0IHJlYWRzIE5GIGZyb20gaGFyZHdhcmUsIGNhbGN1bGF0ZXMgdGhlIG1lZGlhbiBhbmQgdXBkYXRlcworICogTkYgb24gaHcuCiAgKi8KLXZvaWQgYXRoNWtfaHdfdXBkYXRlX25vaXNlX2Zsb29yKHN0cnVjdCBhdGg1a19odyAqYWgpCit2b2lkCithdGg1a19od191cGRhdGVfbm9pc2VfZmxvb3Ioc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgYXRoNWtfZWVwcm9tX2luZm8gKmVlID0gJmFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX2VlcHJvbTsKIAl1MzIgdmFsOwpAQCAtMTM5MCw2ICsxNjA4LDggQEAKIAkJcmV0dXJuOwogCX0KIAorCWFoLT5haF9jYWxfbWFzayB8PSBBUjVLX0NBTElCUkFUSU9OX05GOworCiAJZWVfbW9kZSA9IGF0aDVrX2VlcHJvbV9tb2RlX2Zyb21fY2hhbm5lbChhaC0+YWhfY3VycmVudF9jaGFubmVsKTsKIAogCS8qIGNvbXBsZXRlZCBORiBjYWxpYnJhdGlvbiwgdGVzdCB0aHJlc2hvbGQgKi8KQEAgLTE0MzQsMjAgKzE2NTQsMjkgQEAKIAogCWFoLT5haF9ub2lzZV9mbG9vciA9IG5mOwogCisJYWgtPmFoX2NhbF9tYXNrICY9IH5BUjVLX0NBTElCUkFUSU9OX05GOworCiAJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19DQUxJQlJBVEUsCiAJCSJub2lzZSBmbG9vciBjYWxpYnJhdGVkOiAlZFxuIiwgbmYpOwogfQogCi0vKgotICogUGVyZm9ybSBhIFBIWSBjYWxpYnJhdGlvbiBvbiBSRjUxMTAKLSAqIC1GaXggQlBTSy9RQU0gQ29uc3RlbGxhdGlvbiAoSS9RIGNvcnJlY3Rpb24pCisvKioKKyAqIGF0aDVrX2h3X3JmNTExMF9jYWxpYnJhdGUoKSAtIFBlcmZvcm0gYSBQSFkgY2FsaWJyYXRpb24gb24gUkY1MTEwCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCisgKiBEbyBhIGNvbXBsZXRlIFBIWSBjYWxpYnJhdGlvbiAoQUdDICsgTkYgKyBJL1EpIG9uIFJGNTExMAogICovCi1zdGF0aWMgaW50IGF0aDVrX2h3X3JmNTExMF9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCwKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X3JmNTExMF9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCXUzMiBwaHlfc2lnLCBwaHlfYWdjLCBwaHlfc2F0LCBiZWFjb247CiAJaW50IHJldDsKIAorCWlmICghKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fRlVMTCkpCisJCXJldHVybiAwOworCiAJLyoKIAkgKiBEaXNhYmxlIGJlYWNvbnMgYW5kIFJYL1RYIHF1ZXVlcywgd2FpdAogCSAqLwpAQCAtMTQ1Niw3ICsxNjg1LDcgQEAKIAliZWFjb24gPSBhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19CRUFDT05fNTIxMCk7CiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBiZWFjb24gJiB+QVI1S19CRUFDT05fRU5BQkxFLCBBUjVLX0JFQUNPTl81MjEwKTsKIAotCW1kZWxheSgyKTsKKwl1c2xlZXBfcmFuZ2UoMjAwMCwgMjUwMCk7CiAKIAkvKgogCSAqIFNldCB0aGUgY2hhbm5lbCAod2l0aCBBR0MgdHVybmVkIG9mZikKQEAgLTE0NjksNyArMTY5OCw3IEBACiAJICogQWN0aXZhdGUgUEhZIGFuZCB3YWl0CiAJICovCiAJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9BQ1RfRU5BQkxFLCBBUjVLX1BIWV9BQ1QpOwotCW1kZWxheSgxKTsKKwl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CiAKIAlBUjVLX1JFR19ESVNBQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0FHQywgQVI1S19QSFlfQUdDX0RJU0FCTEUpOwogCkBAIC0xNTA2LDcgKzE3MzUsNyBAQAogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgQVI1S19QSFlfUkZTVEdfRElTQUJMRSwgQVI1S19QSFlfUkZTVEcpOwogCUFSNUtfUkVHX0RJU0FCTEVfQklUUyhhaCwgQVI1S19QSFlfQUdDLCBBUjVLX1BIWV9BR0NfRElTQUJMRSk7CiAKLQltZGVsYXkoMSk7CisJdXNsZWVwX3JhbmdlKDEwMDAsIDE1MDApOwogCiAJLyoKIAkgKiBFbmFibGUgY2FsaWJyYXRpb24gYW5kIHdhaXQgdW50aWwgY29tcGxldGlvbgpAQCAtMTUzNyw4ICsxNzY2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIFBlcmZvcm0gSS9RIGNhbGlicmF0aW9uIG9uIFJGNTExMS81MTEyIGFuZCBuZXdlciBjaGlwcworLyoqCisgKiBhdGg1a19od19yZjUxMXhfaXFfY2FsaWJyYXRlKCkgLSBQZXJmb3JtIEkvUSBjYWxpYnJhdGlvbiBvbiBSRjUxMTEgYW5kIG5ld2VyCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKi8KIHN0YXRpYyBpbnQKIGF0aDVrX2h3X3JmNTExeF9pcV9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCkKQEAgLTE1NDcsMTIgKzE3NzcsMTkgQEAKIAlzMzIgaXFfY29yciwgaV9jb2ZmLCBpX2NvZmZkLCBxX2NvZmYsIHFfY29mZmQ7CiAJaW50IGk7CiAKLQlpZiAoIWFoLT5haF9jYWxpYnJhdGlvbiB8fAotCQlhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfSVEpICYgQVI1S19QSFlfSVFfUlVOKQotCQlyZXR1cm4gMDsKKwkvKiBTa2lwIGlmIEkvUSBjYWxpYnJhdGlvbiBpcyBub3QgbmVlZGVkIG9yIGlmIGl0J3Mgc3RpbGwgcnVubmluZyAqLworCWlmICghYWgtPmFoX2lxX2NhbF9uZWVkZWQpCisJCXJldHVybiAtRUlOVkFMOworCWVsc2UgaWYgKGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9JUSkgJiBBUjVLX1BIWV9JUV9SVU4pIHsKKwkJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwKKwkJCQkiSS9RIGNhbGlicmF0aW9uIHN0aWxsIHJ1bm5pbmciKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CiAKIAkvKiBDYWxpYnJhdGlvbiBoYXMgZmluaXNoZWQsIGdldCB0aGUgcmVzdWx0cyBhbmQgcmUtcnVuICovCi0JLyogd29yayBhcm91bmQgZW1wdHkgcmVzdWx0cyB3aGljaCBjYW4gYXBwYXJlbnRseSBoYXBwZW4gb24gNTIxMiAqLworCisJLyogV29yayBhcm91bmQgZm9yIGVtcHR5IHJlc3VsdHMgd2hpY2ggY2FuIGFwcGFyZW50bHkgaGFwcGVuIG9uIDUyMTI6CisJICogUmVhZCByZWdpc3RlcnMgdXAgdG8gMTAgdGltZXMgdW50aWwgd2UgZ2V0IGJvdGggaV9wciBhbmQgcV9wd3IgKi8KIAlmb3IgKGkgPSAwOyBpIDw9IDEwOyBpKyspIHsKIAkJaXFfY29yciA9IGF0aDVrX2h3X3JlZ19yZWFkKGFoLCBBUjVLX1BIWV9JUVJFU19DQUxfQ09SUik7CiAJCWlfcHdyID0gYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX0lRUkVTX0NBTF9QV1JfSSk7CkBAIC0xNTcwLDkgKzE4MDcsMTMgQEAKIAllbHNlCiAJCXFfY29mZmQgPSBxX3B3ciA+PiA3OwogCi0JLyogcHJvdGVjdCBhZ2FpbnN0IGRpdmlkZSBieSAwIGFuZCBsb3NzIG9mIHNpZ24gYml0cyAqLworCS8qIEluIGNhc2UgaV9jb2ZmZCBiZWNhbWUgemVybywgY2FuY2VsIGNhbGlicmF0aW9uCisJICogbm90IG9ubHkgaXQncyB0b28gc21hbGwsIGl0J2xsIGFsc28gcmVzdWx0IGEgZGl2aWRlCisJICogYnkgemVybyBsYXRlciBvbi4gKi8KIAlpZiAoaV9jb2ZmZCA9PSAwIHx8IHFfY29mZmQgPCAyKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIC1FQ0FOQ0VMRUQ7CisKKwkvKiBQcm90ZWN0IGFnYWluc3QgbG9zcyBvZiBzaWduIGJpdHMgKi8KIAogCWlfY29mZiA9ICgtaXFfY29ycikgLyBpX2NvZmZkOwogCWlfY29mZiA9IGNsYW1wKGlfY29mZiwgLTMyLCAzMSk7IC8qIHNpZ25lZCA2IGJpdCAqLwpAQCAtMTYwMSwxMCArMTg0MiwxNyBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUGVyZm9ybSBhIFBIWSBjYWxpYnJhdGlvbgorLyoqCisgKiBhdGg1a19od19waHlfY2FsaWJyYXRlKCkgLSBQZXJmb3JtIGEgUEhZIGNhbGlicmF0aW9uCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCisgKiBUaGUgbWFpbiBmdW5jdGlvbiB3ZSBjYWxsIGZyb20gYWJvdmUgdG8gcGVyZm9ybQorICogYSBzaG9ydCBvciBmdWxsIFBIWSBjYWxpYnJhdGlvbiBiYXNlZCBvbiBSRiBjaGlwCisgKiBhbmQgY3VycmVudCBjaGFubmVsCiAgKi8KLWludCBhdGg1a19od19waHlfY2FsaWJyYXRlKHN0cnVjdCBhdGg1a19odyAqYWgsCitpbnQKK2F0aDVrX2h3X3BoeV9jYWxpYnJhdGUoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCWludCByZXQ7CkBAIC0xNjEzLDEwICsxODYxLDQzIEBACiAJCXJldHVybiBhdGg1a19od19yZjUxMTBfY2FsaWJyYXRlKGFoLCBjaGFubmVsKTsKIAogCXJldCA9IGF0aDVrX2h3X3JmNTExeF9pcV9jYWxpYnJhdGUoYWgpOworCWlmIChyZXQpIHsKKwkJQVRINUtfREJHX1VOTElNSVQoYWgsIEFUSDVLX0RFQlVHX0NBTElCUkFURSwKKwkJCSJObyBJL1EgY29ycmVjdGlvbiBwZXJmb3JtZWQgKCV1TUh6KVxuIiwKKwkJCWNoYW5uZWwtPmNlbnRlcl9mcmVxKTsKIAotCWlmICgoYWgtPmFoX3JhZGlvID09IEFSNUtfUkY1MTExIHx8IGFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMikgJiYKLQkgICAgKGNoYW5uZWwtPmh3X3ZhbHVlICE9IEFSNUtfTU9ERV8xMUIpKQotCQlhdGg1a19od19yZXF1ZXN0X3JmZ2Fpbl9wcm9iZShhaCk7CisJCS8qIEhhcHBlbnMgYWxsIHRoZSB0aW1lIGlmIHRoZXJlIGlzIG5vdCBtdWNoCisJCSAqIHRyYWZmaWMsIGNvbnNpZGVyIGl0IG5vcm1hbCBiZWhhdmlvdXIuICovCisJCXJldCA9IDA7CisJfQorCisJLyogT24gZnVsbCBjYWxpYnJhdGlvbiBkbyBhbiBBR0MgY2FsaWJyYXRpb24gYW5kCisJICogcmVxdWVzdCBhIFBBUEQgcHJvYmUgZm9yIGdhaW5mIGNhbGlicmF0aW9uIGlmCisJICogbmVlZGVkICovCisJaWYgKGFoLT5haF9jYWxfbWFzayAmIEFSNUtfQ0FMSUJSQVRJT05fRlVMTCkgeworCisJCUFSNUtfUkVHX0VOQUJMRV9CSVRTKGFoLCBBUjVLX1BIWV9BR0NDVEwsCisJCQkJCUFSNUtfUEhZX0FHQ0NUTF9DQUwpOworCisJCXJldCA9IGF0aDVrX2h3X3JlZ2lzdGVyX3RpbWVvdXQoYWgsIEFSNUtfUEhZX0FHQ0NUTCwKKwkJCUFSNUtfUEhZX0FHQ0NUTF9DQUwgfCBBUjVLX1BIWV9BR0NDVExfTkYsCisJCQkwLCBmYWxzZSk7CisJCWlmIChyZXQpIHsKKwkJCUFUSDVLX0VSUihhaCwKKwkJCQkiZ2FpbiBjYWxpYnJhdGlvbiB0aW1lb3V0ICgldU1IeilcbiIsCisJCQkJY2hhbm5lbC0+Y2VudGVyX2ZyZXEpOworCQl9CisKKwkJaWYgKChhaC0+YWhfcmFkaW8gPT0gQVI1S19SRjUxMTEgfHwKKwkJCWFoLT5haF9yYWRpbyA9PSBBUjVLX1JGNTExMikKKwkJCSYmIChjaGFubmVsLT5od192YWx1ZSAhPSBBUjVLX01PREVfMTFCKSkKKwkJCWF0aDVrX2h3X3JlcXVlc3RfcmZnYWluX3Byb2JlKGFoKTsKKwl9CisKKwkvKiBVcGRhdGUgbm9pc2UgZmxvb3IKKwkgKiBYWFg6IE9ubHkgZG8gdGhpcyBhZnRlciBBR0MgY2FsaWJyYXRpb24gKi8KKwlpZiAoIShhaC0+YWhfY2FsX21hc2sgJiBBUjVLX0NBTElCUkFUSU9OX05GKSkKKwkJYXRoNWtfaHdfdXBkYXRlX25vaXNlX2Zsb29yKGFoKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNjI2LDYgKzE5MDcsMTYgQEAKICogU3B1ciBtaXRpZ2F0aW9uIGZ1bmN0aW9ucyAqCiBcKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCisvKioKKyAqIGF0aDVrX2h3X3NldF9zcHVyX21pdGlnYXRpb25fZmlsdGVyKCkgLSBDb25maWd1cmUgU1BVUiBmaWx0ZXIKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgZHVyaW5nIFBIWSBpbml0aWFsaXphdGlvbiB0bworICogY29uZmlndXJlIHRoZSBzcHVyIGZpbHRlciBmb3IgdGhlIGdpdmVuIGNoYW5uZWwuIFNwdXIgaXMgbm9pc2UKKyAqIGdlbmVyYXRlZCBkdWUgdG8gInJlZmxlY3Rpb24iIGVmZmVjdHMsIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMKKyAqIG1ldGhvZCBjaGVjayBvdXQgcGF0ZW50IFVTNzY0MzgxMAorICovCiBzdGF0aWMgdm9pZAogYXRoNWtfaHdfc2V0X3NwdXJfbWl0aWdhdGlvbl9maWx0ZXIoc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCkBAIC0xODY1LDE1ICsyMTU2LDczIEBACiAqIEFudGVubmEgY29udHJvbCAqCiBcKioqKioqKioqKioqKioqKiovCiAKLXN0YXRpYyB2b2lkIC8qVE9ETzpCb3VuZGFyeSBjaGVjayovCisvKioKKyAqIERPQzogQW50ZW5uYSBjb250cm9sCisgKgorICogSHcgc3VwcG9ydHMgdXAgdG8gMTQgYW50ZW5uYXMgISBJIGhhdmVuJ3QgZm91bmQgYW55IGNhcmQgdGhhdCBpbXBsZW1lbnRzCisgKiB0aGF0LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYW50ZW5uYXMgSSd2ZSBzZWVuIGlzIHVwIHRvIDQgKDIgZm9yIDJHSHogYW5kIDIKKyAqIGZvciA1R0h6KS4gQW50ZW5uYSAxIChNQUlOKSBzaG91bGQgYmUgb21uaWRpcmVjdGlvbmFsLCAyIChBVVgpCisgKiBvbW5pZGlyZWN0aW9uYWwgb3Igc2VjdG9yaWFsIGFuZCBhbnRlbm5hcyAzLTE0IHNlY3RvcmlhbCAob3IgZGlyZWN0aW9uYWwpLgorICoKKyAqIFdlIGNhbiBoYXZlIGEgc2luZ2xlIGFudGVubmEgZm9yIFJYIGFuZCBtdWx0aXBsZSBhbnRlbm5hcyBmb3IgVFguCisgKiBSWCBhbnRlbm5hIGlzIG91ciAiZGVmYXVsdCIgYW50ZW5uYSAodXN1YWxseSBhbnRlbm5hIDEpIHNldCBvbgorICogREVGQVVMVF9BTlRFTk5BIHJlZ2lzdGVyIGFuZCBUWCBhbnRlbm5hIGlzIHNldCBvbiBlYWNoIFRYIGNvbnRyb2wgZGVzY3JpcHRvcgorICogKDAgZm9yIGF1dG9tYXRpYyBzZWxlY3Rpb24sIDEgLSAxNCBhbnRlbm5hIG51bWJlcikuCisgKgorICogV2UgY2FuIGxldCBodyBkbyBhbGwgdGhlIHdvcmsgZG9pbmcgZmFzdCBhbnRlbm5hIGRpdmVyc2l0eSBmb3IgYm90aAorICogdHggYW5kIHJ4IG9yIHdlIGNhbiBkbyB0aGluZ3MgbWFudWFsbHkuIEhlcmUgYXJlIHRoZSBvcHRpb25zIHdlIGhhdmUKKyAqIChhbGwgYXJlIGJpdHMgb2YgU1RBX0lEMSByZWdpc3Rlcik6CisgKgorICogQVI1S19TVEFfSUQxX0RFRkFVTFRfQU5URU5OQSAtPiBXaGVuIDAgaXMgc2V0IGFzIHRoZSBUWCBhbnRlbm5hIG9uIFRYCisgKiBjb250cm9sIGRlc2NyaXB0b3IsIHVzZSB0aGUgZGVmYXVsdCBhbnRlbm5hIHRvIHRyYW5zbWl0IG9yIGVsc2UgdXNlIHRoZSBsYXN0CisgKiBhbnRlbm5hIG9uIHdoaWNoIHdlIHJlY2VpdmVkIGFuIEFDSy4KKyAqCisgKiBBUjVLX1NUQV9JRDFfREVTQ19BTlRFTk5BIC0+IFVwZGF0ZSBkZWZhdWx0IGFudGVubmEgYWZ0ZXIgZWFjaCBUWCBmcmFtZSB0bworICogdGhlIGFudGVubmEgb24gd2hpY2ggd2UgZ290IHRoZSBBQ0sgZm9yIHRoYXQgZnJhbWUuCisgKgorICogQVI1S19TVEFfSUQxX1JUU19ERUZfQU5URU5OQSAtPiBVc2UgZGVmYXVsdCBhbnRlbm5hIGZvciBSVFMgb3IgZWxzZSB1c2UgdGhlCisgKiBvbmUgb24gdGhlIFRYIGRlc2NyaXB0b3IuCisgKgorICogQVI1S19TVEFfSUQxX1NFTEZHRU5fREVGX0FOVCAtPiBVc2UgZGVmYXVsdCBhbnRlbm5hIGZvciBzZWxmIGdlbmVyYXRlZCBmcmFtZXMKKyAqIChBQ0tzIGV0YyksIG9yIGVsc2UgdXNlIGN1cnJlbnQgYW50ZW5uYSAodGhlIG9uZSB3ZSBqdXN0IHVzZWQgZm9yIFRYKS4KKyAqCisgKiBVc2luZyB0aGUgYWJvdmUgd2Ugc3VwcG9ydCB0aGUgZm9sbG93aW5nIHNjZW5hcmlvczoKKyAqCisgKiBBUjVLX0FOVE1PREVfREVGQVVMVCAtPiBIdyBoYW5kbGVzIGFudGVubmEgZGl2ZXJzaXR5IGV0YyBhdXRvbWF0aWNhbGx5CisgKgorICogQVI1S19BTlRNT0RFX0ZJWEVEX0EJLT4gT25seSBhbnRlbm5hIEEgKE1BSU4pIGlzIHByZXNlbnQKKyAqCisgKiBBUjVLX0FOVE1PREVfRklYRURfQgktPiBPbmx5IGFudGVubmEgQiAoQVVYKSBpcyBwcmVzZW50CisgKgorICogQVI1S19BTlRNT0RFX1NJTkdMRV9BUCAtPiBTdGEgbG9ja2VkIG9uIGEgc2luZ2xlIGFwCisgKgorICogQVI1S19BTlRNT0RFX1NFQ1RPUl9BUCAtPiBBUCB3aXRoIHR4IGFudGVubmEgc2V0IG9uIHR4IGRlc2MKKyAqCisgKiBBUjVLX0FOVE1PREVfU0VDVE9SX1NUQSAtPiBTVEEgd2l0aCB0eCBhbnRlbm5hIHNldCBvbiB0eCBkZXNjCisgKgorICogQVI1S19BTlRNT0RFX0RFQlVHIERlYnVnIG1vZGUgLUEgLT4gUngsIEItPiBUeC0KKyAqCisgKiBBbHNvIG5vdGUgdGhhdCB3aGVuIHNldHRpbmcgYW50ZW5uYSB0byBGIG9uIHR4IGRlc2NyaXB0b3IgY2FyZCBpbnZlcnRzCisgKiBjdXJyZW50IHR4IGFudGVubmEuCisgKi8KKworLyoqCisgKiBhdGg1a19od19zZXRfZGVmX2FudGVubmEoKSAtIFNldCBkZWZhdWx0IHJ4IGFudGVubmEgb24gQVI1MjExLzUyMTIgYW5kIG5ld2VyCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAYW50OiBBbnRlbm5hIG51bWJlcgorICovCitzdGF0aWMgdm9pZAogYXRoNWtfaHdfc2V0X2RlZl9hbnRlbm5hKHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IGFudCkKIHsKIAlpZiAoYWgtPmFoX3ZlcnNpb24gIT0gQVI1S19BUjUyMTApCiAJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgYW50ICYgMHg3LCBBUjVLX0RFRkFVTFRfQU5URU5OQSk7CiB9CiAKLS8qCi0gKiBFbmFibGUvZGlzYWJsZSBmYXN0IHJ4IGFudGVubmEgZGl2ZXJzaXR5CisvKioKKyAqIGF0aDVrX2h3X3NldF9mYXN0X2RpdigpIC0gIEVuYWJsZS9kaXNhYmxlIGZhc3QgcnggYW50ZW5uYSBkaXZlcnNpdHkKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBlZV9tb2RlOiBPbmUgb2YgZW51bSBhdGg1a19kcml2ZXJfbW9kZQorICogQGVuYWJsZTogVHJ1ZSB0byBlbmFibGUsIGZhbHNlIHRvIGRpc2FibGUKICAqLwogc3RhdGljIHZvaWQKIGF0aDVrX2h3X3NldF9mYXN0X2RpdihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1OCBlZV9tb2RlLCBib29sIGVuYWJsZSkKQEAgLTE5MTMsNiArMjI2MiwxNCBAQAogCX0KIH0KIAorLyoqCisgKiBhdGg1a19od19zZXRfYW50ZW5uYV9zd2l0Y2goKSAtIFNldCB1cCBhbnRlbm5hIHN3aXRjaCB0YWJsZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGVlX21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKgorICogU3dpdGNoIHRhYmxlIGNvbWVzIGZyb20gRUVQUk9NIGFuZCBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiBjb250cm9sbGluZworICogdGhlIDIgYW50ZW5uYSBSWCBhdHRlbnVhdG9ycworICovCiB2b2lkCiBhdGg1a19od19zZXRfYW50ZW5uYV9zd2l0Y2goc3RydWN0IGF0aDVrX2h3ICphaCwgdTggZWVfbW9kZSkKIHsKQEAgLTE5NDQsOCArMjMwMSwxMCBAQAogCQlBUjVLX1BIWV9BTlRfU1dJVENIX1RBQkxFXzEpOwogfQogCi0vKgotICogU2V0IGFudGVubmEgb3BlcmF0aW5nIG1vZGUKKy8qKgorICogYXRoNWtfaHdfc2V0X2FudGVubmFfbW9kZSgpIC0gIFNldCBhbnRlbm5hIG9wZXJhdGluZyBtb2RlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAYW50X21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2FudF9tb2RlCiAgKi8KIHZvaWQKIGF0aDVrX2h3X3NldF9hbnRlbm5hX21vZGUoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggYW50X21vZGUpCkBAIC0yMDY4LDggKzI0MjcsMTMgQEAKICAqIEhlbHBlciBmdW5jdGlvbnMKICAqLwogCi0vKgotICogRG8gbGluZWFyIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gZ2l2ZW4gKHgsIHkpIHBvaW50cworLyoqCisgKiBhdGg1a19nZXRfaW50ZXJwb2xhdGVkX3ZhbHVlKCkgLSBHZXQgaW50ZXJwb2xhdGVkIFkgdmFsIGJldHdlZW4gdHdvIHBvaW50cworICogQHRhcmdldDogWCB2YWx1ZSBvZiB0aGUgbWlkZGxlIHBvaW50CisgKiBAeF9sZWZ0OiBYIHZhbHVlIG9mIHRoZSBsZWZ0IHBvaW50CisgKiBAeF9yaWdodDogWCB2YWx1ZSBvZiB0aGUgcmlnaHQgcG9pbnQKKyAqIEB5X2xlZnQ6IFkgdmFsdWUgb2YgdGhlIGxlZnQgcG9pbnQKKyAqIEB5X3JpZ2h0OiBZIHZhbHVlIG9mIHRoZSByaWdodCBwb2ludAogICovCiBzdGF0aWMgczE2CiBhdGg1a19nZXRfaW50ZXJwb2xhdGVkX3ZhbHVlKHMxNiB0YXJnZXQsIHMxNiB4X2xlZnQsIHMxNiB4X3JpZ2h0LApAQCAtMjA5NiwxMyArMjQ2MCwxOCBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLS8qCi0gKiBGaW5kIHZlcnRpY2FsIGJvdW5kYXJ5IChtaW4gcHdyKSBmb3IgdGhlIGxpbmVhciBQQ0RBQyBjdXJ2ZS4KKy8qKgorICogYXRoNWtfZ2V0X2xpbmVhcl9wY2RhY19taW4oKSAtIEZpbmQgdmVydGljYWwgYm91bmRhcnkgKG1pbiBwd3IpIGZvciB0aGUKKyAqIGxpbmVhciBQQ0RBQyBjdXJ2ZQorICogQHN0ZXBMOiBMZWZ0IGFycmF5IHdpdGggeSB2YWx1ZXMgKHBjZGFjIHN0ZXBzKQorICogQHN0ZXBSOiBSaWdodCBhcnJheSB3aXRoIHkgdmFsdWVzIChwY2RhYyBzdGVwcykKKyAqIEBwd3JMOiBMZWZ0IGFycmF5IHdpdGggeCB2YWx1ZXMgKHBvd2VyIHN0ZXBzKQorICogQHB3clI6IFJpZ2h0IGFycmF5IHdpdGggeCB2YWx1ZXMgKHBvd2VyIHN0ZXBzKQogICoKICAqIFNpbmNlIHdlIGhhdmUgdGhlIHRvcCBvZiB0aGUgY3VydmUgYW5kIHdlIGRyYXcgdGhlIGxpbmUgYmVsb3cKICAqIHVudGlsIHdlIHJlYWNoIDEgKDEgcGNkYWMgc3RlcCkgd2UgbmVlZCB0byBrbm93IHdoaWNoIHBvaW50Ci0gKiAoeCB2YWx1ZSkgdGhhdCBpcyBzbyB0aGF0IHdlIGRvbid0IGdvIGJlbG93IHkgYXhpcyBhbmQgaGF2ZSBuZWdhdGl2ZQotICogcGNkYWMgdmFsdWVzIHdoZW4gY3JlYXRpbmcgdGhlIGN1cnZlLCBvciBmaWxsIHRoZSB0YWJsZSB3aXRoIHplcm9lcy4KKyAqICh4IHZhbHVlKSB0aGF0IGlzIHNvIHRoYXQgd2UgZG9uJ3QgZ28gYmVsb3cgeCBheGlzIGFuZCBoYXZlIG5lZ2F0aXZlCisgKiBwY2RhYyB2YWx1ZXMgd2hlbiBjcmVhdGluZyB0aGUgY3VydmUsIG9yIGZpbGwgdGhlIHRhYmxlIHdpdGggemVyb3MuCiAgKi8KIHN0YXRpYyBzMTYKIGF0aDVrX2dldF9saW5lYXJfcGNkYWNfbWluKGNvbnN0IHU4ICpzdGVwTCwgY29uc3QgdTggKnN0ZXBSLApAQCAtMjE0OCw3ICsyNTE3LDE2IEBACiAJcmV0dXJuIG1heChtaW5fcHdyTCwgbWluX3B3clIpOwogfQogCi0vKgorLyoqCisgKiBhdGg1a19jcmVhdGVfcG93ZXJfY3VydmUoKSAtIENyZWF0ZSBhIFBvd2VyIHRvIFBEQURDIG9yIFBDREFDIGN1cnZlCisgKiBAcG1pbjogTWluaW11bSBwb3dlciB2YWx1ZSAoeG1pbikKKyAqIEBwbWF4OiBNYXhpbXVtIHBvd2VyIHZhbHVlICh4bWF4KQorICogQHB3cjogQXJyYXkgb2YgcG93ZXIgc3RlcHMgKHggdmFsdWVzKQorICogQHZwZDogQXJyYXkgb2YgbWF0Y2hpbmcgUENEQUMvUERBREMgc3RlcHMgKHkgdmFsdWVzKQorICogQG51bV9wb2ludHM6IE51bWJlciBvZiBwcm92aWRlZCBwb2ludHMKKyAqIEB2cGRfdGFibGU6IEFycmF5IHRvIGZpbGwgd2l0aCB0aGUgZnVsbCBQQ0RBQy9QREFEQyB2YWx1ZXMgKHkgdmFsdWVzKQorICogQHR5cGU6IE9uZSBvZiBlbnVtIGF0aDVrX3Bvd2VydGFibGVfdHlwZSAoZWVwcm9tLmgpCisgKgogICogSW50ZXJwb2xhdGUgKHB3cix2cGQpIHBvaW50cyB0byBjcmVhdGUgYSBQb3dlciB0byBQREFEQyBvciBhCiAgKiBQb3dlciB0byBQQ0RBQyBjdXJ2ZS4KICAqCkBAIC0yMjA2LDcgKzI1ODQsMTQgQEAKIAl9CiB9CiAKLS8qCisvKioKKyAqIGF0aDVrX2dldF9jaGFuX3BjYWxfc3Vycm91bmRpbmdfcGllcnMoKSAtIEdldCBzdXJyb3VuZGluZyBjYWxpYnJhdGlvbiBwaWVycworICogZm9yIGEgZ2l2ZW4gY2hhbm5lbC4KKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICogQHBjaW5mb19sOiBUaGUgJnN0cnVjdCBhdGg1a19jaGFuX3BjYWxfaW5mbyB0byBwdXQgdGhlIGxlZnQgY2FsLiBwaWVyCisgKiBAcGNpbmZvX3I6IFRoZSAmc3RydWN0IGF0aDVrX2NoYW5fcGNhbF9pbmZvIHRvIHB1dCB0aGUgcmlnaHQgY2FsLiBwaWVyCisgKgogICogR2V0IHRoZSBzdXJyb3VuZGluZyBwZXItY2hhbm5lbCBwb3dlciBjYWxpYnJhdGlvbiBwaWVycwogICogZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5IHNvIHRoYXQgd2UgY2FuIGludGVycG9sYXRlIGJldHdlZW4KICAqIHRoZW0gYW5kIGNvbWUgdXAgd2l0aCBhbiBhcHByb3ByaWF0ZSBkYXRhc2V0IGZvciBvdXIgY3VycmVudApAQCAtMjI4OSwxMSArMjY3NCwxNyBAQAogCSpwY2luZm9fciA9ICZwY2luZm9baWR4X3JdOwogfQogCi0vKgorLyoqCisgKiBhdGg1a19nZXRfcmF0ZV9wY2FsX2RhdGEoKSAtIEdldCB0aGUgaW50ZXJwb2xhdGVkIHBlci1yYXRlIHBvd2VyCisgKiBjYWxpYnJhdGlvbiBkYXRhCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3ICphaCwKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICogQHJhdGVzOiBUaGUgJnN0cnVjdCBhdGg1a19yYXRlX3BjYWxfaW5mbyB0byBmaWxsCisgKgogICogR2V0IHRoZSBzdXJyb3VuZGluZyBwZXItcmF0ZSBwb3dlciBjYWxpYnJhdGlvbiBkYXRhCiAgKiBmb3IgYSBnaXZlbiBmcmVxdWVuY3kgYW5kIGludGVycG9sYXRlIGJldHdlZW4gcG93ZXIKICAqIHZhbHVlcyB0byBzZXQgbWF4IHRhcmdldCBwb3dlciBzdXBwb3J0ZWQgYnkgaHcgZm9yCi0gKiBlYWNoIHJhdGUuCisgKiBlYWNoIHJhdGUgb24gdGhpcyBmcmVxdWVuY3kuCiAgKi8KIHN0YXRpYyB2b2lkCiBhdGg1a19nZXRfcmF0ZV9wY2FsX2RhdGEoc3RydWN0IGF0aDVrX2h3ICphaCwKQEAgLTIzODEsNyArMjc3MiwxMSBAQAogCQkJCQlycGluZm9baWR4X3JdLnRhcmdldF9wb3dlcl81NCk7CiB9CiAKLS8qCisvKioKKyAqIGF0aDVrX2dldF9tYXhfY3RsX3Bvd2VyKCkgLSBHZXQgbWF4IGVkZ2UgcG93ZXIgZm9yIGEgZ2l2ZW4gZnJlcXVlbmN5CisgKiBAYWg6IHRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCiAgKiBHZXQgdGhlIG1heCBlZGdlIHBvd2VyIGZvciB0aGlzIGNoYW5uZWwgaWYKICAqIHdlIGhhdmUgc3VjaCBkYXRhIGZyb20gRUVQUk9NJ3MgQ29uZm9ybWFuY2UgVGVzdAogICogTGltaXRzIChDVEwpLCBhbmQgbGltaXQgbWF4IHBvd2VyIGlmIG5lZWRlZC4KQEAgLTI0NjEsOCArMjg1NiwzOSBAQAogICogUG93ZXIgdG8gUENEQUMgdGFibGUgZnVuY3Rpb25zCiAgKi8KIAotLyoKLSAqIEZpbGwgUG93ZXIgdG8gUENEQUMgdGFibGUgb24gUkY1MTExCisvKioKKyAqIERPQzogUG93ZXIgdG8gUENEQUMgdGFibGUgZnVuY3Rpb25zCisgKgorICogRm9yIFJGNTExMSB3ZSBoYXZlIGFuIFhQRCAtZVh0ZXJuYWwgUG93ZXIgRGV0ZWN0b3ItIGN1cnZlCisgKiBmb3IgZWFjaCBjYWxpYnJhdGVkIGNoYW5uZWwuIEVhY2ggY3VydmUgaGFzIDAsNWRCIFBvd2VyIHN0ZXBzCisgKiBvbiB4IGF4aXMgYW5kIFBDREFDIHN0ZXBzIChvZmZzZXRzKSBvbiB5IGF4aXMgYW5kIGxvb2tzIGxpa2UgYW4KKyAqIGV4cG9uZW50aWFsIGZ1bmN0aW9uLiBUbyByZWNyZWF0ZSB0aGUgY3VydmUgd2UgcmVhZCAxMSBwb2ludHMKKyAqIGZyb20gZWVwcm9tIChlZXByb20uYykgYW5kIGludGVycG9sYXRlIGhlcmUuCisgKgorICogRm9yIFJGNTExMiB3ZSBoYXZlIDQgWFBEIC1lWHRlcm5hbCBQb3dlciBEZXRlY3Rvci0gY3VydmVzCisgKiBmb3IgZWFjaCBjYWxpYnJhdGVkIGNoYW5uZWwgb24gMCwgLTYsIC0xMiBhbmQgLTE4ZEJtIGJ1dCB3ZSBvbmx5CisgKiB1c2UgdGhlIGhpZ2hlciAoMykgYW5kIHRoZSBsb3dlciAoMCkgY3VydmVzLiBFYWNoIGN1cnZlIGFnYWluIGhhcyAwLjVkQgorICogcG93ZXIgc3RlcHMgb24geCBheGlzIGFuZCBQQ0RBQyBzdGVwcyBvbiB5IGF4aXMgYW5kIGxvb2tzIGxpa2UgYQorICogbGluZWFyIGZ1bmN0aW9uLiBUbyByZWNyZWF0ZSB0aGUgY3VydmUgYW5kIHBhc3MgdGhlIHBvd2VyIHZhbHVlcworICogb24gaHcsIHdlIGdldCA0IHBvaW50cyBmb3IgeHBkIDAgKGxvd2VyIGdhaW4gLT4gbWF4IHBvd2VyKQorICogYW5kIDMgcG9pbnRzIGZvciB4cGQgMyAoaGlnaGVyIGdhaW4gLT4gbG93ZXIgcG93ZXIpIGZyb20gZWVwcm9tIChlZXByb20uYykKKyAqIGFuZCBpbnRlcnBvbGF0ZSBoZXJlLgorICoKKyAqIEZvciBhIGdpdmVuIGNoYW5uZWwgd2UgZ2V0IHRoZSBjYWxpYnJhdGVkIHBvaW50cyAocGllcnMpIGZvciBpdCBvcgorICogLWlmIHdlIGRvbid0IGhhdmUgY2FsaWJyYXRpb24gZGF0YSBmb3IgdGhpcyBzcGVjaWZpYyBjaGFubmVsLSBmcm9tIHRoZQorICogYXZhaWxhYmxlIHN1cnJvdW5kaW5nIGNoYW5uZWxzIHdlIGhhdmUgY2FsaWJyYXRpb24gZGF0YSBmb3IsIGFmdGVyIHdlIGRvIGEKKyAqIGxpbmVhciBpbnRlcnBvbGF0aW9uIGJldHdlZW4gdGhlbS4gVGhlbiBzaW5jZSB3ZSBoYXZlIG91ciBjYWxpYnJhdGVkIHBvaW50cworICogZm9yIHRoaXMgY2hhbm5lbCwgd2UgZG8gYWdhaW4gYSBsaW5lYXIgaW50ZXJwb2xhdGlvbiBiZXR3ZWVuIHRoZW0gdG8gZ2V0IHRoZQorICogd2hvbGUgY3VydmUuCisgKgorICogV2UgZmluYWxseSB3cml0ZSB0aGUgWSB2YWx1ZXMgb2YgdGhlIGN1cnZlKHMpICh0aGUgUENEQUMgdmFsdWVzKSBvbiBodworICovCisKKy8qKgorICogYXRoNWtfZmlsbF9wd3JfdG9fcGNkYWNfdGFibGUoKSAtIEZpbGwgUG93ZXIgdG8gUENEQUMgdGFibGUgb24gUkY1MTExCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAdGFibGVfbWluOiBNaW5pbXVtIHBvd2VyICh4IG1pbikKKyAqIEB0YWJsZV9tYXg6IE1heGltdW0gcG93ZXIgKHggbWF4KQogICoKICAqIE5vIGZ1cnRoZXIgcHJvY2Vzc2luZyBpcyBuZWVkZWQgZm9yIFJGNTExMSwgdGhlIG9ubHkgdGhpbmcgd2UgaGF2ZSB0bwogICogZG8gaXMgZmlsbCB0aGUgdmFsdWVzIGJlbG93IGFuZCBhYm92ZSBjYWxpYnJhdGlvbiByYW5nZSBzaW5jZSBlZXByb20gZGF0YQpAQCAtMjUwMywxMCArMjkyOSwxNCBAQAogCiB9CiAKLS8qCi0gKiBDb21iaW5lIGF2YWlsYWJsZSBYUEQgQ3VydmVzIGFuZCBmaWxsIExpbmVhciBQb3dlciB0byBQQ0RBQyB0YWJsZQotICogb24gUkY1MTEyCisvKioKKyAqIGF0aDVrX2NvbWJpbmVfbGluZWFyX3BjZGFjX2N1cnZlcygpIC0gQ29tYmluZSBhdmFpbGFibGUgUENEQUMgQ3VydmVzCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAdGFibGVfbWluOiBNaW5pbXVtIHBvd2VyICh4IG1pbikKKyAqIEB0YWJsZV9tYXg6IE1heGltdW0gcG93ZXIgKHggbWF4KQorICogQHBkY3VydmVzOiBOdW1iZXIgb2YgcGQgY3VydmVzCiAgKgorICogQ29tYmluZSBhdmFpbGFibGUgWFBEIEN1cnZlcyBhbmQgZmlsbCBMaW5lYXIgUG93ZXIgdG8gUENEQUMgdGFibGUgb24gUkY1MTEyCiAgKiBSRlgxMTIgY2FuIGhhdmUgdXAgdG8gMiBjdXJ2ZXMgKG9uZSBmb3IgbG93IHR4cG93ZXIgcmFuZ2UgYW5kIG9uZSBmb3IKICAqIGhpZ2hlciB0eHBvd2VyIHJhbmdlKS4gV2UgbmVlZCB0byBwdXQgdGhlbSBib3RoIG9uIHBjZGFjX291dCBhbmQgcGxhY2UKICAqIHRoZW0gaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uIEluIGNhc2Ugd2Ugb25seSBoYXZlIG9uZSBjdXJ2ZSBhdmFpbGFibGUKQEAgLTI2MDgsNyArMzAzOCwxMCBAQAogCX0KIH0KIAotLyogV3JpdGUgUENEQUMgdmFsdWVzIG9uIGh3ICovCisvKioKKyAqIGF0aDVrX3dyaXRlX3BjZGFjX3RhYmxlKCkgLSBXcml0ZSB0aGUgUENEQUMgdmFsdWVzIG9uIGh3CisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKi8KIHN0YXRpYyB2b2lkCiBhdGg1a193cml0ZV9wY2RhY190YWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewpAQCAtMjYzMSw5ICszMDY0LDMyIEBACiAgKiBQb3dlciB0byBQREFEQyB0YWJsZSBmdW5jdGlvbnMKICAqLwogCi0vKgotICogU2V0IHRoZSBnYWluIGJvdW5kYXJpZXMgYW5kIGNyZWF0ZSBmaW5hbCBQb3dlciB0byBQREFEQyB0YWJsZQorLyoqCisgKiBET0M6IFBvd2VyIHRvIFBEQURDIHRhYmxlIGZ1bmN0aW9ucwogICoKKyAqIEZvciBSRjI0MTMgYW5kIGxhdGVyIHdlIGhhdmUgYSBQb3dlciB0byBQREFEQyB0YWJsZSAoUG93ZXIgRGV0ZWN0b3IpCisgKiBpbnN0ZWFkIG9mIGEgUENEQUMgKFBvd2VyIENvbnRyb2wpIGFuZCA0IHBkIGdhaW4gY3VydmVzIGZvciBlYWNoCisgKiBjYWxpYnJhdGVkIGNoYW5uZWwuIEVhY2ggY3VydmUgaGFzIHBvd2VyIG9uIHggYXhpcyBpbiAwLjUgZGIgc3RlcHMgYW5kCisgKiBQREFEQyBzdGVwcyBvbiB5IGF4aXMgYW5kIGxvb2tzIGxpa2UgYW4gZXhwb25lbnRpYWwgZnVuY3Rpb24gbGlrZSB0aGUKKyAqIFJGNTExMSBjdXJ2ZS4KKyAqCisgKiBUbyByZWNyZWF0ZSB0aGUgY3VydmVzIHdlIHJlYWQgdGhlIHBvaW50cyBmcm9tIGVlcHJvbSAoZWVwcm9tLmMpCisgKiBhbmQgaW50ZXJwb2xhdGUgaGVyZS4gTm90ZSB0aGF0IGluIG1vc3QgY2FzZXMgb25seSAyIChoaWdoZXIgYW5kIGxvd2VyKQorICogY3VydmVzIGFyZSB1c2VkIChsaWtlIFJGNTExMikgYnV0IHZlbmRvcnMgaGF2ZSB0aGUgb3Bwb3J0dW5pdHkgdG8gaW5jbHVkZQorICogYWxsIDQgY3VydmVzIG9uIGVlcHJvbS4gVGhlIGZpbmFsIGN1cnZlIChoaWdoZXIgcG93ZXIpIGhhcyBhbiBleHRyYQorICogcG9pbnQgZm9yIGJldHRlciBhY2N1cmFjeSBsaWtlIFJGNTExMi4KKyAqCisgKiBUaGUgcHJvY2VzcyBpcyBzaW1pbGFyIHRvIHdoYXQgd2UgZG8gYWJvdmUgZm9yIFJGNTExMS81MTEyCisgKi8KKworLyoqCisgKiBhdGg1a19jb21iaW5lX3B3cl90b19wZGFkY19jdXJ2ZXMoKSAtIENvbWJpbmUgdGhlIHZhcmlvdXMgUERBREMgY3VydmVzCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcHdyX21pbjogTWluaW11bSBwb3dlciAoeCBtaW4pCisgKiBAcHdyX21heDogTWF4aW11bSBwb3dlciAoeCBtYXgpCisgKiBAcGRjdXJ2ZXM6IE51bWJlciBvZiBhdmFpbGFibGUgY3VydmVzCisgKgorICogQ29tYmluZSB0aGUgdmFyaW91cyBwZCBjdXJ2ZXMgYW5kIGNyZWF0ZSB0aGUgZmluYWwgUG93ZXIgdG8gUERBREMgdGFibGUKICAqIFdlIGNhbiBoYXZlIHVwIHRvIDQgcGQgY3VydmVzLCB3ZSBuZWVkIHRvIGRvIGEgc2ltaWxhciBwcm9jZXNzCiAgKiBhcyB3ZSBkbyBmb3IgUkY1MTEyLiBUaGlzIHRpbWUgd2UgZG9uJ3QgaGF2ZSBhbiBlZGdlX2ZsYWcgYnV0IHdlCiAgKiBzZXQgdGhlIGdhaW4gYm91bmRhcmllcyBvbiBhIHNlcGFyYXRlIHJlZ2lzdGVyLgpAQCAtMjc1Nyw3ICszMjEzLDExIEBACiAKIH0KIAotLyogV3JpdGUgUERBREMgdmFsdWVzIG9uIGh3ICovCisvKioKKyAqIGF0aDVrX3dyaXRlX3B3cl90b19wZGFkY190YWJsZSgpIC0gV3JpdGUgdGhlIFBEQURDIHZhbHVlcyBvbiBodworICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGVlX21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKi8KIHN0YXRpYyB2b2lkCiBhdGg1a193cml0ZV9wd3JfdG9fcGRhZGNfdGFibGUoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggZWVfbW9kZSkKIHsKQEAgLTI4MTQsNyArMzI3NCwxMyBAQAogICogQ29tbW9uIGNvZGUgZm9yIFBDREFDL1BEQURDIHRhYmxlcwogICovCiAKLS8qCisvKioKKyAqIGF0aDVrX3NldHVwX2NoYW5uZWxfcG93ZXJ0YWJsZSgpIC0gU2V0IHVwIHBvd2VyIHRhYmxlIGZvciB0aGlzIGNoYW5uZWwKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICogQGVlX21vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKiBAdHlwZTogT25lIG9mIGVudW0gYXRoNWtfcG93ZXJ0YWJsZV90eXBlIChlZXByb20uaCkKKyAqCiAgKiBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHRoYXQgdXNlcyBhbGwgb2YgdGhlIGFib3ZlCiAgKiB0byBzZXQgUENEQUMvUERBREMgdGFibGUgb24gaHcgZm9yIHRoZSBjdXJyZW50IGNoYW5uZWwuCiAgKiBUaGlzIHRhYmxlIGlzIHVzZWQgZm9yIHR4IHBvd2VyIGNhbGlicmF0aW9uIG9uIHRoZSBiYXNlYmFuZCwKQEAgLTMwMTIsNyArMzQ3OCwxMiBAQAogCXJldHVybiAwOwogfQogCi0vKiBXcml0ZSBwb3dlciB0YWJsZSBmb3IgY3VycmVudCBjaGFubmVsIHRvIGh3ICovCisvKioKKyAqIGF0aDVrX3dyaXRlX2NoYW5uZWxfcG93ZXJ0YWJsZSgpIC0gU2V0IHBvd2VyIHRhYmxlIGZvciBjdXJyZW50IGNoYW5uZWwgb24gaHcKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBlZV9tb2RlOiBPbmUgb2YgZW51bSBhdGg1a19kcml2ZXJfbW9kZQorICogQHR5cGU6IE9uZSBvZiBlbnVtIGF0aDVrX3Bvd2VydGFibGVfdHlwZSAoZWVwcm9tLmgpCisgKi8KIHN0YXRpYyB2b2lkCiBhdGg1a193cml0ZV9jaGFubmVsX3Bvd2VydGFibGUoc3RydWN0IGF0aDVrX2h3ICphaCwgdTggZWVfbW9kZSwgdTggdHlwZSkKIHsKQEAgLTMwMjIsMjggKzM0OTMsMzYgQEAKIAkJYXRoNWtfd3JpdGVfcGNkYWNfdGFibGUoYWgpOwogfQogCi0vKgotICogUGVyLXJhdGUgdHggcG93ZXIgc2V0dGluZwotICoKLSAqIFRoaXMgaXMgdGhlIGNvZGUgdGhhdCBzZXRzIHRoZSBkZXNpcmVkIHR4IHBvd2VyIChiZWxvdwotICogbWF4aW11bSkgb24gaHcgZm9yIGVhY2ggcmF0ZSAod2UgYWxzbyBoYXZlIFRQQyB0aGF0IHNldHMKLSAqIHBvd2VyIHBlciBwYWNrZXQpLiBXZSBkbyB0aGF0IGJ5IHByb3ZpZGluZyBhbiBpbmRleCBvbiB0aGUKLSAqIFBDREFDL1BEQURDIHRhYmxlIHdlIHNldCB1cC4KLSAqLwogCi0vKgotICogU2V0IHJhdGUgcG93ZXIgdGFibGUKKy8qKgorICogRE9DOiBQZXItcmF0ZSB0eCBwb3dlciBzZXR0aW5nCisgKgorICogVGhpcyBpcyB0aGUgY29kZSB0aGF0IHNldHMgdGhlIGRlc2lyZWQgdHggcG93ZXIgbGltaXQgKGJlbG93CisgKiBtYXhpbXVtKSBvbiBodyBmb3IgZWFjaCByYXRlICh3ZSBhbHNvIGhhdmUgVFBDIHRoYXQgc2V0cworICogcG93ZXIgcGVyIHBhY2tldCB0eXBlKS4gV2UgZG8gdGhhdCBieSBwcm92aWRpbmcgYW4gaW5kZXggb24gdGhlCisgKiBQQ0RBQy9QREFEQyB0YWJsZSB3ZSBzZXQgdXAgYWJvdmUsIGZvciBlYWNoIHJhdGUuCiAgKgogICogRm9yIG5vdyB3ZSBvbmx5IGxpbWl0IHR4cG93ZXIgYmFzZWQgb24gbWF4aW11bSB0eCBwb3dlcgotICogc3VwcG9ydGVkIGJ5IGh3ICh3aGF0J3MgaW5zaWRlIHJhdGVfaW5mbykuIFdlIG5lZWQgdG8gbGltaXQKLSAqIHRoaXMgZXZlbiBtb3JlLCBiYXNlZCBvbiByZWd1bGF0b3J5IGRvbWFpbiBldGMuCisgKiBzdXBwb3J0ZWQgYnkgaHcgKHdoYXQncyBpbnNpZGUgcmF0ZV9pbmZvKSArIGNvbmZvcm1hbmNlIHRlc3QKKyAqIGxpbWl0cy4gV2UgbmVlZCB0byBsaW1pdCB0aGlzIGV2ZW4gbW9yZSwgYmFzZWQgb24gcmVndWxhdG9yeSBkb21haW4KKyAqIGV0YyB0byBiZSBzYWZlLiBOb3JtYWxseSB0aGlzIGlzIGRvbmUgZnJvbSBhYm92ZSBzbyB3ZSBkb24ndCBjYXJlCisgKiBoZXJlLCBhbGwgd2UgY2FyZSBpcyB0aGF0IHRoZSB0eCBwb3dlciB3ZSBzZXQgd2lsbCBiZSBPLksuCisgKiBmb3IgdGhlIGh3IChlLmcuIHdvbid0IGNyZWF0ZSBub2lzZSBvbiBQQSBldGMpLgogICoKLSAqIFJhdGUgcG93ZXIgdGFibGUgY29udGFpbnMgaW5kaWNlcyB0byBQQ0RBQy9QREFEQyB0YWJsZSAoMC41ZEIgc3RlcHMpCi0gKiBhbmQgaXMgaW5kZXhlZCBhcyBmb2xsb3dzOgorICogUmF0ZSBwb3dlciB0YWJsZSBjb250YWlucyBpbmRpY2VzIHRvIFBDREFDL1BEQURDIHRhYmxlICgwLjVkQiBzdGVwcyAtCisgKiB4IHZhbHVlcykgYW5kIGlzIGluZGV4ZWQgYXMgZm9sbG93czoKICAqIHJhdGVzWzBdIC0gcmF0ZXNbN10gLT4gT0ZETSByYXRlcwogICogcmF0ZXNbOF0gLSByYXRlc1sxNF0gLT4gQ0NLIHJhdGVzCiAgKiByYXRlc1sxNV0gLT4gWFIgcmF0ZXMgKHRoZXkgYWxsIGhhdmUgdGhlIHNhbWUgcG93ZXIpCiAgKi8KKworLyoqCisgKiBhdGg1a19zZXR1cF9yYXRlX3Bvd2VydGFibGUoKSAtIFNldCB1cCByYXRlIHBvd2VyIHRhYmxlIGZvciBhIGdpdmVuIHR4IHBvd2VyCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAbWF4X3B3cjogVGhlIG1heGltdW0gdHggcG93ZXIgcmVxdWVzdGVkIGluIDAuNWRCIHN0ZXBzCisgKiBAcmF0ZV9pbmZvOiBUaGUgJnN0cnVjdCBhdGg1a19yYXRlX3BjYWxfaW5mbyB0byBmaWxsCisgKiBAZWVfbW9kZTogT25lIG9mIGVudW0gYXRoNWtfZHJpdmVyX21vZGUKKyAqLwogc3RhdGljIHZvaWQKIGF0aDVrX3NldHVwX3JhdGVfcG93ZXJ0YWJsZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MTYgbWF4X3B3ciwKIAkJCXN0cnVjdCBhdGg1a19yYXRlX3BjYWxfaW5mbyAqcmF0ZV9pbmZvLApAQCAtMzExNCw4ICszNTkzLDE0IEBACiB9CiAKIAotLyoKLSAqIFNldCB0cmFuc21pc3Npb24gcG93ZXIKKy8qKgorICogYXRoNWtfaHdfdHhwb3dlcigpIC0gU2V0IHRyYW5zbWlzc2lvbiBwb3dlciBsaW1pdCBmb3IgYSBnaXZlbiBjaGFubmVsCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqIEB0eHBvd2VyOiBSZXF1ZXN0ZWQgdHggcG93ZXIgaW4gMC41ZEIgc3RlcHMKKyAqCisgKiBDb21iaW5lcyBhbGwgb2YgdGhlIGFib3ZlIHRvIHNldCB0aGUgcmVxdWVzdGVkIHR4IHBvd2VyIGxpbWl0CisgKiBvbiBody4KICAqLwogc3RhdGljIGludAogYXRoNWtfaHdfdHhwb3dlcihzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCkBAIC0zMjMzLDcgKzM3MTgsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGF0aDVrX2h3X3NldF90eHBvd2VyX2xpbWl0KHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IHR4cG93ZXIpCisvKioKKyAqIGF0aDVrX2h3X3NldF90eHBvd2VyX2xpbWl0KCkgLSBTZXQgdHhwb3dlciBsaW1pdCBmb3IgdGhlIGN1cnJlbnQgY2hhbm5lbAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHR4cG93ZXI6IFRoZSByZXF1ZXN0ZWQgdHggcG93ZXIgbGltaXQgaW4gMC41ZEIgc3RlcHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGFjY2VzcyB0byBhdGg1a19od190eHBvd2VyIHRvIHRoZSBkcml2ZXIgaW4KKyAqIGNhc2UgdXNlciBvciBhbiBhcHBsaWNhdGlvbiBjaGFuZ2VzIGl0IHdoaWxlIFBIWSBpcyBydW5uaW5nLgorICovCitpbnQKK2F0aDVrX2h3X3NldF90eHBvd2VyX2xpbWl0KHN0cnVjdCBhdGg1a19odyAqYWgsIHU4IHR4cG93ZXIpCiB7CiAJQVRINUtfREJHKGFoLCBBVEg1S19ERUJVR19UWFBPV0VSLAogCQkiY2hhbmdpbmcgdHhwb3dlciB0byAlZFxuIiwgdHhwb3dlcik7CkBAIC0zMjQxLDExICszNzM1LDI2IEBACiAJcmV0dXJuIGF0aDVrX2h3X3R4cG93ZXIoYWgsIGFoLT5haF9jdXJyZW50X2NoYW5uZWwsIHR4cG93ZXIpOwogfQogCisKIC8qKioqKioqKioqKioqXAogIEluaXQgZnVuY3Rpb24KIFwqKioqKioqKioqKioqLwogCi1pbnQgYXRoNWtfaHdfcGh5X2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAorLyoqCisgKiBhdGg1a19od19waHlfaW5pdCgpIC0gSW5pdGlhbGl6ZSBQSFkKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgQHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICogQG1vZGU6IE9uZSBvZiBlbnVtIGF0aDVrX2RyaXZlcl9tb2RlCisgKiBAZmFzdDogVHJ5IGEgZmFzdCBjaGFubmVsIHN3aXRjaCBpbnN0ZWFkCisgKgorICogVGhpcyBpcyB0aGUgbWFpbiBmdW5jdGlvbiB1c2VkIGR1cmluZyByZXNldCB0byBpbml0aWFsaXplIFBIWQorICogb3IgZG8gYSBmYXN0IGNoYW5uZWwgY2hhbmdlIGlmIHBvc3NpYmxlLgorICoKKyAqIE5PVEU6IERvIG5vdCBjYWxsIHRoaXMgb25lIGZyb20gdGhlIGRyaXZlciwgaXQgYXNzdW1lcyBQSFkgaXMgaW4gYQorICogd2FybSByZXNldCBzdGF0ZSAhCisgKi8KK2ludAorYXRoNWtfaHdfcGh5X2luaXQoc3RydWN0IGF0aDVrX2h3ICphaCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAogCQkgICAgICB1OCBtb2RlLCBib29sIGZhc3QpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjdXJyX2NoYW5uZWw7CkBAIC0zMzU1LDcgKzM4NjQsNyBAQAogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKIAotCQltZGVsYXkoMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKIAogCQkvKgogCQkgKiBXcml0ZSBSRiBidWZmZXIKQEAgLTMzNzYsMTAgKzM4ODUsMTAgQEAKIAkJfQogCiAJfSBlbHNlIGlmIChhaC0+YWhfdmVyc2lvbiA9PSBBUjVLX0FSNTIxMCkgewotCQltZGVsYXkoMSk7CisJCXVzbGVlcF9yYW5nZSgxMDAwLCAxNTAwKTsKIAkJLyogRGlzYWJsZSBwaHkgYW5kIHdhaXQgKi8KIAkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBBUjVLX1BIWV9BQ1RfRElTQUJMRSwgQVI1S19QSFlfQUNUKTsKLQkJbWRlbGF5KDEpOworCQl1c2xlZXBfcmFuZ2UoMTAwMCwgMTUwMCk7CiAJfQogCiAJLyogU2V0IGNoYW5uZWwgb24gUEhZICovCkBAIC0zNDA1LDcgKzM5MTQsNyBAQAogCWZvciAoaSA9IDA7IGkgPD0gMjA7IGkrKykgewogCQlpZiAoIShhdGg1a19od19yZWdfcmVhZChhaCwgQVI1S19QSFlfQURDX1RFU1QpICYgMHgxMCkpCiAJCQlicmVhazsKLQkJdWRlbGF5KDIwMCk7CisJCXVzbGVlcF9yYW5nZSgyMDAsIDI1MCk7CiAJfQogCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgcGh5X3RzdDEsIEFSNUtfUEhZX1RTVDEpOwogCkBAIC0zNDMzLDkgKzM5NDIsOSBAQAogCiAJLyogQXQgdGhlIHNhbWUgdGltZSBzdGFydCBJL1EgY2FsaWJyYXRpb24gZm9yIFFBTSBjb25zdGVsbGF0aW9uCiAJICogLW5vIG5lZWQgZm9yIENDSy0gKi8KLQlhaC0+YWhfY2FsaWJyYXRpb24gPSBmYWxzZTsKKwlhaC0+YWhfaXFfY2FsX25lZWRlZCA9IGZhbHNlOwogCWlmICghKG1vZGUgPT0gQVI1S19NT0RFXzExQikpIHsKLQkJYWgtPmFoX2NhbGlicmF0aW9uID0gdHJ1ZTsKKwkJYWgtPmFoX2lxX2NhbF9uZWVkZWQgPSB0cnVlOwogCQlBUjVLX1JFR19XUklURV9CSVRTKGFoLCBBUjVLX1BIWV9JUSwKIAkJCQlBUjVLX1BIWV9JUV9DQUxfTlVNX0xPR19NQVgsIDE1KTsKIAkJQVI1S19SRUdfRU5BQkxFX0JJVFMoYWgsIEFSNUtfUEhZX0lRLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3FjdS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3FjdS5jCmluZGV4IDc3NjY1NDIuLjMwYjUwZjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9xY3UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcWN1LmMKQEAgLTE3LDIzICsxNyw0OCBAQAogICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKLVF1ZXVlIENvbnRyb2wgVW5pdCwgREZTIENvbnRyb2wgVW5pdCBGdW5jdGlvbnMKK1F1ZXVlIENvbnRyb2wgVW5pdCwgRENGIENvbnRyb2wgVW5pdCBGdW5jdGlvbnMKIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2luY2x1ZGUgImF0aDVrLmgiCiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisKKy8qKgorICogRE9DOiBRdWV1ZSBDb250cm9sIFVuaXQgKFFDVSkvRENGIENvbnRyb2wgVW5pdCAoRENVKSBmdW5jdGlvbnMKKyAqCisgKiBIZXJlIHdlIHNldHVwIHBhcmFtZXRlcnMgZm9yIHRoZSAxMiBhdmFpbGFibGUgVFggcXVldWVzLiBOb3RlIHRoYXQKKyAqIG9uIHRoZSB2YXJpb3VzIHJlZ2lzdGVycyB3ZSBjYW4gdXN1YWxseSBvbmx5IG1hcCB0aGUgZmlyc3QgMTAgb2YgdGhlbSBzbworICogYmFzaWNhbGx5IHdlIGhhdmUgMTAgcXVldWVzIHRvIHBsYXkgd2l0aC4gRWFjaCBxdWV1ZSBoYXMgYSBtYXRjaGluZworICogUUNVIHRoYXQgY29udHJvbHMgd2hlbiB0aGUgcXVldWUgd2lsbCBnZXQgdHJpZ2dlcmVkIGFuZCBtdWx0aXBsZSBRQ1VzCisgKiBjYW4gYmUgbWFwcGVkIHRvIGEgc2luZ2xlIERDVSB0aGF0IGNvbnRyb2xzIHRoZSB2YXJpb3VzIERGUyBwYXJhbWV0ZXJzCisgKiBmb3IgdGhlIHZhcmlvdXMgcXVldWVzLiBJbiBvdXIgc2V0dXAgd2UgaGF2ZSBhIDE6MSBtYXBwaW5nIGJldHdlZW4gUUNVcworICogYW5kIERDVXMgYWxsb3dpbmcgdXMgdG8gaGF2ZSBkaWZmZXJlbnQgREZTIHNldHRpbmdzIGZvciBlYWNoIHF1ZXVlLgorICoKKyAqIFdoZW4gYSBmcmFtZSBnb2VzIGludG8gYSBUWCBxdWV1ZSwgUUNVIGRlY2lkZXMgd2hlbiBpdCdsbCB0cmlnZ2VyIGEKKyAqIHRyYW5zbWlzc2lvbiBiYXNlZCBvbiB2YXJpb3VzIGNyaXRlcmlhIChzdWNoIGFzIGhvdyBtYW55IGRhdGEgd2UgaGF2ZSBpbnNpZGUKKyAqIGl0J3MgYnVmZmVyIG9yIC1pZiBpdCdzIGEgYmVhY29uIHF1ZXVlLSBpZiBpdCdzIHRpbWUgdG8gZmlyZSB1cCB0aGUgcXVldWUKKyAqIGJhc2VkIG9uIFRTRiBldGMpLCBEQ1UgYWRkcyBiYWNrb2ZmLCBJRlNlcyBldGMgYW5kIHRoZW4gYSBzY2hlZHVsZXIKKyAqIChhcmJpdHJhdG9yKSBkZWNpZGVzIHRoZSBwcmlvcml0eSBvZiBlYWNoIFFDVSBiYXNlZCBvbiBpdCdzIGNvbmZpZ3VyYXRpb24KKyAqIChlLmcuIGJlYWNvbnMgYXJlIGFsd2F5cyB0cmFuc21pdHRlZCB3aGVuIHRoZXkgbGVhdmUgRENVIGJ5cGFzc2luZyBhbGwgb3RoZXIKKyAqIGZyYW1lcyBmcm9tIG90aGVyIHF1ZXVlcyB3YWl0aW5nIHRvIGJlIHRyYW5zbWl0dGVkKS4gQWZ0ZXIgYSBmcmFtZSBsZWF2ZXMKKyAqIHRoZSBEQ1UgaXQgZ29lcyB0byBQQ1UgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZyBhbmQgdGhlbiB0byBQSFkgZm9yCisgKiB0aGUgYWN0dWFsIHRyYW5zbWlzc2lvbi4KKyAqLwogCiAKIC8qKioqKioqKioqKioqKioqKipcCiAqIEhlbHBlciBmdW5jdGlvbnMgKgogXCoqKioqKioqKioqKioqKioqKi8KIAotLyoKLSAqIEdldCBudW1iZXIgb2YgcGVuZGluZyBmcmFtZXMKLSAqIGZvciBhIHNwZWNpZmljIHF1ZXVlIFs1MjExK10KKy8qKgorICogYXRoNWtfaHdfbnVtX3R4X3BlbmRpbmcoKSAtIEdldCBudW1iZXIgb2YgcGVuZGluZyBmcmFtZXMgZm9yIGEgIGdpdmVuIHF1ZXVlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IE9uZSBvZiBlbnVtIGF0aDVrX3R4X3F1ZXVlX2lkCiAgKi8KLXUzMiBhdGg1a19od19udW1fdHhfcGVuZGluZyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCit1MzIKK2F0aDVrX2h3X251bV90eF9wZW5kaW5nKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKIHsKIAl1MzIgcGVuZGluZzsKIAlBUjVLX0FTU0VSVF9FTlRSWShxdWV1ZSwgYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfcXVldWVzLnFfdHhfbnVtKTsKQEAgLTU4LDEwICs4MywxMyBAQAogCXJldHVybiBwZW5kaW5nOwogfQogCi0vKgotICogU2V0IGEgdHJhbnNtaXQgcXVldWUgaW5hY3RpdmUKKy8qKgorICogYXRoNWtfaHdfcmVsZWFzZV90eF9xdWV1ZSgpIC0gU2V0IGEgdHJhbnNtaXQgcXVldWUgaW5hY3RpdmUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBxdWV1ZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWVfaWQKICAqLwotdm9pZCBhdGg1a19od19yZWxlYXNlX3R4X3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBxdWV1ZSkKK3ZvaWQKK2F0aDVrX2h3X3JlbGVhc2VfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQogewogCWlmIChXQVJOX09OKHF1ZXVlID49IGFoLT5haF9jYXBhYmlsaXRpZXMuY2FwX3F1ZXVlcy5xX3R4X251bSkpCiAJCXJldHVybjsKQEAgLTcyLDM0ICsxMDAsNTYgQEAKIAlBUjVLX1FfRElTQUJMRV9CSVRTKGFoLT5haF90eHFfc3RhdHVzLCBxdWV1ZSk7CiB9CiAKLS8qCisvKioKKyAqIGF0aDVrX2N3X3ZhbGlkYXRlKCkgLSBNYWtlIHN1cmUgdGhlIGdpdmVuIGN3IGlzIHZhbGlkCisgKiBAY3dfcmVxOiBUaGUgY29udGVudGlvbiB3aW5kb3cgdmFsdWUgdG8gY2hlY2sKKyAqCiAgKiBNYWtlIHN1cmUgY3cgaXMgYSBwb3dlciBvZiAyIG1pbnVzIDEgYW5kIHNtYWxsZXIgdGhhbiAxMDI0CiAgKi8KLXN0YXRpYyB1MTYgYXRoNWtfY3dfdmFsaWRhdGUodTE2IGN3X3JlcSkKK3N0YXRpYyB1MTYKK2F0aDVrX2N3X3ZhbGlkYXRlKHUxNiBjd19yZXEpCiB7Ci0JdTMyIGN3ID0gMTsKIAljd19yZXEgPSBtaW4oY3dfcmVxLCAodTE2KTEwMjMpOwogCi0Jd2hpbGUgKGN3IDwgY3dfcmVxKQotCQljdyA9IChjdyA8PCAxKSB8IDE7CisJLyogQ2hlY2sgaWYgY3dfcmVxICsgMSBhIHBvd2VyIG9mIDIgKi8KKwlpZiAoaXNfcG93ZXJfb2ZfMihjd19yZXEgKyAxKSkKKwkJcmV0dXJuIGN3X3JlcTsKIAotCXJldHVybiBjdzsKKwkvKiBDaGVjayBpZiBjd19yZXEgaXMgYSBwb3dlciBvZiAyICovCisJaWYgKGlzX3Bvd2VyX29mXzIoY3dfcmVxKSkKKwkJcmV0dXJuIGN3X3JlcSAtIDE7CisKKwkvKiBJZiBub25lIG9mIHRoZSBhYm92ZSBpcyBjb3JyZWN0CisJICogZmluZCB0aGUgY2xvc2VzdCBwb3dlciBvZiAyICovCisJY3dfcmVxID0gKHUxNikgcm91bmR1cF9wb3dfb2ZfdHdvKGN3X3JlcSkgLSAxOworCisJcmV0dXJuIGN3X3JlcTsKIH0KIAotLyoKLSAqIEdldCBwcm9wZXJ0aWVzIGZvciBhIHRyYW5zbWl0IHF1ZXVlCisvKioKKyAqIGF0aDVrX2h3X2dldF90eF9xdWV1ZXByb3BzKCkgLSBHZXQgcHJvcGVydGllcyBmb3IgYSB0cmFuc21pdCBxdWV1ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHF1ZXVlOiBPbmUgb2YgZW51bSBhdGg1a190eF9xdWV1ZV9pZAorICogQHF1ZXVlX2luZm86IFRoZSAmc3RydWN0IGF0aDVrX3R4cV9pbmZvIHRvIGZpbGwKICAqLwotaW50IGF0aDVrX2h3X2dldF90eF9xdWV1ZXByb3BzKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBxdWV1ZSwKK2ludAorYXRoNWtfaHdfZ2V0X3R4X3F1ZXVlcHJvcHMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IHF1ZXVlLAogCQlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnF1ZXVlX2luZm8pCiB7CiAJbWVtY3B5KHF1ZXVlX2luZm8sICZhaC0+YWhfdHhxW3F1ZXVlXSwgc2l6ZW9mKHN0cnVjdCBhdGg1a190eHFfaW5mbykpOwogCXJldHVybiAwOwogfQogCi0vKgotICogU2V0IHByb3BlcnRpZXMgZm9yIGEgdHJhbnNtaXQgcXVldWUKKy8qKgorICogYXRoNWtfaHdfc2V0X3R4X3F1ZXVlcHJvcHMoKSAtIFNldCBwcm9wZXJ0aWVzIGZvciBhIHRyYW5zbWl0IHF1ZXVlCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAcXVldWU6IE9uZSBvZiBlbnVtIGF0aDVrX3R4X3F1ZXVlX2lkCisgKiBAcWluZm86IFRoZSAmc3RydWN0IGF0aDVrX3R4cV9pbmZvIHRvIHVzZQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzIG9yIC1FSU8gaWYgcXVldWUgaXMgaW5hY3RpdmUKICAqLwotaW50IGF0aDVrX2h3X3NldF90eF9xdWV1ZXByb3BzKHN0cnVjdCBhdGg1a19odyAqYWgsIGludCBxdWV1ZSwKK2ludAorYXRoNWtfaHdfc2V0X3R4X3F1ZXVlcHJvcHMoc3RydWN0IGF0aDVrX2h3ICphaCwgaW50IHF1ZXVlLAogCQkJCWNvbnN0IHN0cnVjdCBhdGg1a190eHFfaW5mbyAqcWluZm8pCiB7CiAJc3RydWN0IGF0aDVrX3R4cV9pbmZvICpxaTsKQEAgLTEzOSwxMCArMTg5LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLS8qCi0gKiBJbml0aWFsaXplIGEgdHJhbnNtaXQgcXVldWUKKy8qKgorICogYXRoNWtfaHdfc2V0dXBfdHhfcXVldWUoKSAtIEluaXRpYWxpemUgYSB0cmFuc21pdCBxdWV1ZQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHF1ZXVlX3R5cGU6IE9uZSBvZiBlbnVtIGF0aDVrX3R4X3F1ZXVlCisgKiBAcXVldWVfaW5mbzogVGhlICZzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gdG8gdXNlCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU5WQUwgb24gaW52YWxpZCBhcmd1bWVudHMKICAqLwotaW50IGF0aDVrX2h3X3NldHVwX3R4X3F1ZXVlKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfdHhfcXVldWUgcXVldWVfdHlwZSwKK2ludAorYXRoNWtfaHdfc2V0dXBfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a190eF9xdWV1ZSBxdWV1ZV90eXBlLAogCQlzdHJ1Y3QgYXRoNWtfdHhxX2luZm8gKnF1ZXVlX2luZm8pCiB7CiAJdW5zaWduZWQgaW50IHF1ZXVlOwpAQCAtMjE3LDEwICsyNzMsMTYgQEAKICogU2luZ2xlIFFDVS9EQ1UgaW5pdGlhbGl6YXRpb24gKgogXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBTZXQgdHggcmV0cnkgbGltaXRzIG9uIERDVQorLyoqCisgKiBhdGg1a19od19zZXRfdHhfcmV0cnlfbGltaXRzKCkgLSBTZXQgdHggcmV0cnkgbGltaXRzIG9uIERDVQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQHF1ZXVlOiBPbmUgb2YgZW51bSBhdGg1a190eF9xdWV1ZV9pZAorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGVuIGluaXRpYWxpemluZyBhIHF1ZXVlLCB0byBzZXQKKyAqIHJldHJ5IGxpbWl0cyBiYXNlZCBvbiBhaC0+YWhfcmV0cnlfKiBhbmQgdGhlIGNoaXBzZXQgdXNlZC4KICAqLwotdm9pZCBhdGg1a19od19zZXRfdHhfcmV0cnlfbGltaXRzKHN0cnVjdCBhdGg1a19odyAqYWgsCit2b2lkCithdGg1a19od19zZXRfdHhfcmV0cnlfbGltaXRzKHN0cnVjdCBhdGg1a19odyAqYWgsCiAJCQkJICB1bnNpZ25lZCBpbnQgcXVldWUpCiB7CiAJLyogU2luZ2xlIGRhdGEgcXVldWUgb24gQVI1MjEwICovCkBAIC0yNTUsMTUgKzMxNywxNSBAQAogfQogCiAvKioKLSAqIGF0aDVrX2h3X3Jlc2V0X3R4X3F1ZXVlIC0gSW5pdGlhbGl6ZSBhIHNpbmdsZSBodyBxdWV1ZQorICogYXRoNWtfaHdfcmVzZXRfdHhfcXVldWUoKSAtIEluaXRpYWxpemUgYSBzaW5nbGUgaHcgcXVldWUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBxdWV1ZTogT25lIG9mIGVudW0gYXRoNWtfdHhfcXVldWVfaWQKICAqCi0gKiBAYWggVGhlICZzdHJ1Y3QgYXRoNWtfaHcKLSAqIEBxdWV1ZSBUaGUgaHcgcXVldWUgbnVtYmVyCi0gKgotICogU2V0IERGUyBwcm9wZXJ0aWVzIGZvciB0aGUgZ2l2ZW4gdHJhbnNtaXQgcXVldWUgb24gRENVCisgKiBTZXQgRENGIHByb3BlcnRpZXMgZm9yIHRoZSBnaXZlbiB0cmFuc21pdCBxdWV1ZSBvbiBEQ1UKICAqIGFuZCBjb25maWd1cmVzIGFsbCBxdWV1ZS1zcGVjaWZpYyBwYXJhbWV0ZXJzLgogICovCi1pbnQgYXRoNWtfaHdfcmVzZXRfdHhfcXVldWUoc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHF1ZXVlKQoraW50CithdGg1a19od19yZXNldF90eF9xdWV1ZShzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgcXVldWUpCiB7CiAJc3RydWN0IGF0aDVrX3R4cV9pbmZvICp0cSA9ICZhaC0+YWhfdHhxW3F1ZXVlXTsKIApAQCAtNDkxLDEwICs1NTMsOSBAQAogXCoqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKLSAqIGF0aDVrX2h3X3NldF9pZnNfaW50ZXJ2YWxzICAtIFNldCBnbG9iYWwgaW50ZXItZnJhbWUgc3BhY2VzIG9uIERDVQotICoKLSAqIEBhaCBUaGUgJnN0cnVjdCBhdGg1a19odwotICogQHNsb3RfdGltZSBTbG90IHRpbWUgaW4gdXMKKyAqIGF0aDVrX2h3X3NldF9pZnNfaW50ZXJ2YWxzKCkgIC0gU2V0IGdsb2JhbCBpbnRlci1mcmFtZSBzcGFjZXMgb24gRENVCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAc2xvdF90aW1lOiBTbG90IHRpbWUgaW4gdXMKICAqCiAgKiBTZXRzIHRoZSBnbG9iYWwgSUZTIGludGVydmFscyBvbiBEQ1UgKGFsc28gd29ya3Mgb24gQVI1MjEwKSBmb3IKICAqIHRoZSBnaXZlbiBzbG90IHRpbWUgYW5kIHRoZSBjdXJyZW50IGJ3bW9kZS4KQEAgLTU5Nyw3ICs2NTgsMTUgQEAKIH0KIAogCi1pbnQgYXRoNWtfaHdfaW5pdF9xdWV1ZXMoc3RydWN0IGF0aDVrX2h3ICphaCkKKy8qKgorICogYXRoNWtfaHdfaW5pdF9xdWV1ZXMoKSAtIEluaXRpYWxpemUgdHggcXVldWVzCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKgorICogSW5pdGlhbGl6ZXMgYWxsIHR4IHF1ZXVlcyBiYXNlZCBvbiBpbmZvcm1hdGlvbiBvbgorICogYWgtPmFoX3R4cSogc2V0IGJ5IHRoZSBkcml2ZXIKKyAqLworaW50CithdGg1a19od19pbml0X3F1ZXVlcyhzdHJ1Y3QgYXRoNWtfaHcgKmFoKQogewogCWludCBpLCByZXQ7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZWcuaAppbmRleCBmNWMxMDAwLi4wZWExNjA4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JlZy5oCkBAIC0yODAsNiArMjgwLDEwIEBACiAgKiA1MjExLzUyMTIgd2UgaGF2ZSBvbmUgcHJpbWFyeSBhbmQgNCBzZWNvbmRhcnkgcmVnaXN0ZXJzLgogICogU28gd2UgaGF2ZSBBUjVLX0lTUiBmb3IgNTIxMCBhbmQgQVI1S19QSVNSIC9TSVNSeCBmb3IgNTIxMS81MjEyLgogICogTW9zdCBvZiB0aGVzZSBiaXRzIGFyZSBjb21tb24gZm9yIGFsbCBjaGlwc2V0cy4KKyAqCisgKiBOT1RFOiBPbiA1MjExKyBUWE9LLCBUWERFU0MsIFRYRVJSLCBUWEVPTCBhbmQgVFhVUk4gY29udGFpbgorICogdGhlIGxvZ2ljYWwgT1IgZnJvbSBwZXItcXVldWUgaW50ZXJydXB0IGJpdHMgZm91bmQgb24gU0lTUiByZWdpc3RlcnMKKyAqIChzZWUgYmVsb3cpLgogICovCiAjZGVmaW5lIEFSNUtfSVNSCQkweDAwMWMJCQkvKiBSZWdpc3RlciBBZGRyZXNzIFs1MjEwXSAqLwogI2RlZmluZSBBUjVLX1BJU1IJCTB4MDA4MAkJCS8qIFJlZ2lzdGVyIEFkZHJlc3MgWzUyMTErXSAqLwpAQCAtMjkyLDcgKzI5NiwxMCBAQAogI2RlZmluZSBBUjVLX0lTUl9UWE9LCQkweDAwMDAwMDQwCS8qIEZyYW1lIHN1Y2Nlc3NmdWxseSB0cmFuc21pdHRlZCAqLwogI2RlZmluZSBBUjVLX0lTUl9UWERFU0MJCTB4MDAwMDAwODAJLyogVFggZGVzY3JpcHRvciByZXF1ZXN0ICovCiAjZGVmaW5lIEFSNUtfSVNSX1RYRVJSCQkweDAwMDAwMTAwCS8qIFRyYW5zbWl0IGVycm9yICovCi0jZGVmaW5lIEFSNUtfSVNSX1RYTk9GUk0JMHgwMDAwMDIwMAkvKiBObyBmcmFtZSB0cmFuc21pdHRlZCAodHJhbnNtaXQgdGltZW91dCkgKi8KKyNkZWZpbmUgQVI1S19JU1JfVFhOT0ZSTQkweDAwMDAwMjAwCS8qIE5vIGZyYW1lIHRyYW5zbWl0dGVkICh0cmFuc21pdCB0aW1lb3V0KQorCQkJCQkJICogTk9URTogV2UgZG9uJ3QgaGF2ZSBwZXItcXVldWUgaW5mbyBmb3IgdGhpcworCQkJCQkJICogb25lLCBidXQgd2UgY2FuIGVuYWJsZSBpdCBwZXItcXVldWUgdGhyb3VnaAorCQkJCQkJICogVFhOT0ZSTV9RQ1UgZmllbGQgb24gVFhOT0ZSTSByZWdpc3RlciAqLwogI2RlZmluZSBBUjVLX0lTUl9UWEVPTAkJMHgwMDAwMDQwMAkvKiBFbXB0eSBUWCBkZXNjcmlwdG9yICovCiAjZGVmaW5lIEFSNUtfSVNSX1RYVVJOCQkweDAwMDAwODAwCS8qIFRyYW5zbWl0IEZJRk8gdW5kZXJydW4gKi8KICNkZWZpbmUgQVI1S19JU1JfTUlCCQkweDAwMDAxMDAwCS8qIFVwZGF0ZSBNSUIgY291bnRlcnMgKi8KQEAgLTMwMiwyMSArMzA5LDI5IEBACiAjZGVmaW5lIEFSNUtfSVNSX1NXQkEJCTB4MDAwMTAwMDAJLyogU29mdHdhcmUgYmVhY29uIGFsZXJ0ICovCiAjZGVmaW5lIEFSNUtfSVNSX0JSU1NJCQkweDAwMDIwMDAwCS8qIEJlYWNvbiByc3NpIGJlbG93IHRocmVzaG9sZCAoPykgKi8KICNkZWZpbmUgQVI1S19JU1JfQk1JU1MJCTB4MDAwNDAwMDAJLyogQmVhY29uIG1pc3NlZCAqLwotI2RlZmluZSBBUjVLX0lTUl9ISVVFUlIJCTB4MDAwODAwMDAJLyogSG9zdCBJbnRlcmZhY2UgVW5pdCBlcnJvciBbNTIxMStdICovCisjZGVmaW5lIEFSNUtfSVNSX0hJVUVSUgkJMHgwMDA4MDAwMAkvKiBIb3N0IEludGVyZmFjZSBVbml0IGVycm9yIFs1MjExK10KKwkJCQkJCSAqICdvcicgb2YgTUNBQlQsIFNTRVJSLCBEUEVSUiBmcm9tIFNJU1IyICovCiAjZGVmaW5lIEFSNUtfSVNSX0JOUgkJMHgwMDEwMDAwMAkvKiBCZWFjb24gbm90IHJlYWR5IFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19JU1JfTUNBQlQJCTB4MDAxMDAwMDAJLyogTWFzdGVyIEN5Y2xlIEFib3J0IFs1MjEwXSAqLwogI2RlZmluZSBBUjVLX0lTUl9SWENISVJQCTB4MDAyMDAwMDAJLyogQ0hJUlAgUmVjZWl2ZWQgWzUyMTIrXSAqLwogI2RlZmluZSBBUjVLX0lTUl9TU0VSUgkJMHgwMDIwMDAwMAkvKiBTaWduYWxlZCBTeXN0ZW0gRXJyb3IgWzUyMTBdICovCi0jZGVmaW5lIEFSNUtfSVNSX0RQRVJSCQkweDAwNDAwMDAwCS8qIERldCBwYXIgRXJyb3IgKD8pIFs1MjEwXSAqLworI2RlZmluZSBBUjVLX0lTUl9EUEVSUgkJMHgwMDQwMDAwMAkvKiBCdXMgcGFyaXR5IGVycm9yIFs1MjEwXSAqLwogI2RlZmluZSBBUjVLX0lTUl9SWERPUFBMRVIJMHgwMDQwMDAwMAkvKiBEb3BwbGVyIGNoaXJwIHJlY2VpdmVkIFs1MjEyK10gKi8KICNkZWZpbmUgQVI1S19JU1JfVElNCQkweDAwODAwMDAwCS8qIFs1MjExK10gKi8KLSNkZWZpbmUgQVI1S19JU1JfQkNOTUlTQwkweDAwODAwMDAwCS8qICdvcicgb2YgVElNLCBDQUJfRU5ELCBEVElNX1NZTkMsIEJDTl9USU1FT1VULAotCQkJCQkJQ0FCX1RJTUVPVVQgYW5kIERUSU0gYml0cyBmcm9tIFNJU1IyIFs1MjEyK10gKi8KKyNkZWZpbmUgQVI1S19JU1JfQkNOTUlTQwkweDAwODAwMDAwCS8qIE1pc2MgYmVhY29uIHJlbGF0ZWQgaW50ZXJydXB0CisJCQkJCQkgKiAnb3InIG9mIFRJTSwgQ0FCX0VORCwgRFRJTV9TWU5DLCBCQ05fVElNRU9VVCwKKwkJCQkJCSAqIENBQl9USU1FT1VUIGFuZCBEVElNIGJpdHMgZnJvbSBTSVNSMiBbNTIxMitdICovCiAjZGVmaW5lIEFSNUtfSVNSX0dQSU8JCTB4MDEwMDAwMDAJLyogR1BJTyAocmYga2lsbCkgKi8KICNkZWZpbmUgQVI1S19JU1JfUUNCUk9STgkweDAyMDAwMDAwCS8qIFFDVSBDQlIgb3ZlcnJ1biBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfSVNSX1FDQlJVUk4JMHgwNDAwMDAwMAkvKiBRQ1UgQ0JSIHVuZGVycnVuIFs1MjExK10gKi8KICNkZWZpbmUgQVI1S19JU1JfUVRSSUcJCTB4MDgwMDAwMDAJLyogUUNVIHNjaGVkdWxpbmcgdHJpZ2dlciBbNTIxMStdICovCiAKKyNkZWZpbmUJQVI1S19JU1JfQklUU19GUk9NX1NJU1JTCShBUjVLX0lTUl9UWE9LIHwgQVI1S19JU1JfVFhERVNDIHxcCisJCQkJCUFSNUtfSVNSX1RYRVJSIHwgQVI1S19JU1JfVFhFT0wgfFwKKwkJCQkJQVI1S19JU1JfVFhVUk4gfCBBUjVLX0lTUl9ISVVFUlIgfFwKKwkJCQkJQVI1S19JU1JfQkNOTUlTQyB8IEFSNUtfSVNSX1FDQlJPUk4gfFwKKwkJCQkJQVI1S19JU1JfUUNCUlVSTiB8IEFSNUtfSVNSX1FUUklHKQorCiAvKgogICogU2Vjb25kYXJ5IHN0YXR1cyByZWdpc3RlcnMgWzUyMTErXSAoMCAtIDQpCiAgKgpAQCAtMzQ3LDcgKzM2Miw3IEBACiAjZGVmaW5lCUFSNUtfU0lTUjJfQkNOX1RJTUVPVVQJMHgwODAwMDAwMAkvKiBCZWFjb24gVGltZW91dCBbNTIxMitdICovCiAjZGVmaW5lCUFSNUtfU0lTUjJfQ0FCX1RJTUVPVVQJMHgxMDAwMDAwMAkvKiBDQUIgVGltZW91dCBbNTIxMitdICovCiAjZGVmaW5lCUFSNUtfU0lTUjJfRFRJTQkJMHgyMDAwMDAwMAkvKiBbNTIxMitdICovCi0jZGVmaW5lCUFSNUtfU0lTUjJfVFNGT09SCTB4ODAwMDAwMDAJLyogVFNGIE9PUiAoPykgKi8KKyNkZWZpbmUJQVI1S19TSVNSMl9UU0ZPT1IJMHg4MDAwMDAwMAkvKiBUU0YgT3V0IG9mIHJhbmdlICovCiAKICNkZWZpbmUgQVI1S19TSVNSMwkJMHgwMDkwCQkJLyogUmVnaXN0ZXIgQWRkcmVzcyBbNTIxMStdICovCiAjZGVmaW5lIEFSNUtfU0lTUjNfUUNCUk9STgkweDAwMDAwM2ZmCS8qIE1hc2sgZm9yIFFDQlJPUk4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZXNldC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3Jlc2V0LmMKaW5kZXggMmFiYWMyNS4uMjUwZGI0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3Jlc2V0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3Jlc2V0LmMKQEAgLTE5LDkgKzE5LDkgQEAKICAqCiAgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAotICBSZXNldCBmdW5jdGlvbnMgYW5kIGhlbHBlcnMKLVwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICBSZXNldCBmdW5jdGlvbiBhbmQgaGVscGVycworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKQEAgLTMzLDE0ICszMywzNiBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAKIAorLyoqCisgKiBET0M6IFJlc2V0IGZ1bmN0aW9uIGFuZCBoZWxwZXJzCisgKgorICogSGVyZSB3ZSBpbXBsZW1lbnQgdGhlIG1haW4gcmVzZXQgcm91dGluZSwgdXNlZCB0byBicmluZyB0aGUgY2FyZAorICogdG8gYSB3b3JraW5nIHN0YXRlIGFuZCByZWFkeSB0byByZWNlaXZlLiBXZSBhbHNvIGhhbmRsZSByb3V0aW5lcworICogdGhhdCBkb24ndCBmaXQgb24gb3RoZXIgcGxhY2VzIHN1Y2ggYXMgY2xvY2ssIHNsZWVwIGFuZCBwb3dlciBjb250cm9sCisgKi8KKworCiAvKioqKioqKioqKioqKioqKioqXAogKiBIZWxwZXIgZnVuY3Rpb25zICoKIFwqKioqKioqKioqKioqKioqKiovCiAKLS8qCi0gKiBDaGVjayBpZiBhIHJlZ2lzdGVyIHdyaXRlIGhhcyBiZWVuIGNvbXBsZXRlZAorLyoqCisgKiBhdGg1a19od19yZWdpc3Rlcl90aW1lb3V0KCkgLSBQb2xsIGEgcmVnaXN0ZXIgZm9yIGEgZmxhZy9maWVsZCBjaGFuZ2UKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEByZWc6IFRoZSByZWdpc3RlciB0byByZWFkCisgKiBAZmxhZzogVGhlIGZsYWcvZmllbGQgdG8gY2hlY2sgb24gdGhlIHJlZ2lzdGVyCisgKiBAdmFsOiBUaGUgZmllbGQgdmFsdWUgd2UgZXhwZWN0IChpZiB3ZSBjaGVjayBhIGZpZWxkKQorICogQGlzX3NldDogSW5zdGVhZCBvZiBjaGVja2luZyBpZiB0aGUgZmxhZyBnb3QgY2xlYXJlZCwgY2hlY2sgaWYgaXQgZ290IHNldAorICoKKyAqIFNvbWUgcmVnaXN0ZXJzIGNvbnRhaW4gZmxhZ3MgdGhhdCBpbmRpY2F0ZSB0aGF0IGFuIG9wZXJhdGlvbiBpcworICogcnVubmluZy4gV2UgdXNlIHRoaXMgZnVuY3Rpb24gdG8gcG9sbCB0aGVzZSByZWdpc3RlcnMgYW5kIGNoZWNrCisgKiBpZiB0aGVzZSBmbGFncyBnZXQgY2xlYXJlZC4gV2UgYWxzbyB1c2UgaXQgdG8gcG9sbCBhIHJlZ2lzdGVyCisgKiBmaWVsZCAoY29udGFpbmluZyBtdWx0aXBsZSBmbGFncykgdW50aWwgaXQgZ2V0cyBhIHNwZWNpZmljIHZhbHVlLgorICoKKyAqIFJldHVybnMgLUVBR0FJTiBpZiB3ZSBleGNlZWRlZCBBUjVLX1RVTkVfUkVHSVNURVJfVElNRU9VVCAqIDE1dXMgb3IgMAogICovCi1pbnQgYXRoNWtfaHdfcmVnaXN0ZXJfdGltZW91dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgcmVnLCB1MzIgZmxhZywgdTMyIHZhbCwKK2ludAorYXRoNWtfaHdfcmVnaXN0ZXJfdGltZW91dChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgcmVnLCB1MzIgZmxhZywgdTMyIHZhbCwKIAkJCSAgICAgIGJvb2wgaXNfc2V0KQogewogCWludCBpOwpAQCAtNjQsMzUgKzg2LDQ4IEBACiBcKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBhdGg1a19od19odG9jbG9jayAtIFRyYW5zbGF0ZSB1c2VjIHRvIGh3IGNsb2NrIHVuaXRzCi0gKgorICogYXRoNWtfaHdfaHRvY2xvY2soKSAtIFRyYW5zbGF0ZSB1c2VjIHRvIGh3IGNsb2NrIHVuaXRzCiAgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CiAgKiBAdXNlYzogdmFsdWUgaW4gbWljcm9zZWNvbmRzCisgKgorICogVHJhbnNsYXRlIHVzZWNzIHRvIGh3IGNsb2NrIHVuaXRzIGJhc2VkIG9uIHRoZSBjdXJyZW50CisgKiBodyBjbG9jayByYXRlLgorICoKKyAqIFJldHVybnMgbnVtYmVyIG9mIGNsb2NrIHVuaXRzCiAgKi8KLXVuc2lnbmVkIGludCBhdGg1a19od19odG9jbG9jayhzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1bnNpZ25lZCBpbnQgdXNlYykKK3Vuc2lnbmVkIGludAorYXRoNWtfaHdfaHRvY2xvY2soc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IHVzZWMpCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDVrX2h3X2NvbW1vbihhaCk7CiAJcmV0dXJuIHVzZWMgKiBjb21tb24tPmNsb2NrcmF0ZTsKIH0KIAogLyoqCi0gKiBhdGg1a19od19jbG9ja3RvaCAtIFRyYW5zbGF0ZSBodyBjbG9jayB1bml0cyB0byB1c2VjCisgKiBhdGg1a19od19jbG9ja3RvaCgpIC0gVHJhbnNsYXRlIGh3IGNsb2NrIHVuaXRzIHRvIHVzZWMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqIEBjbG9jazogdmFsdWUgaW4gaHcgY2xvY2sgdW5pdHMKKyAqCisgKiBUcmFuc2xhdGUgaHcgY2xvY2sgdW5pdHMgdG8gdXNlY3MgYmFzZWQgb24gdGhlIGN1cnJlbnQKKyAqIGh3IGNsb2NrIHJhdGUuCisgKgorICogUmV0dXJucyBudW1iZXIgb2YgdXNlY3MKICAqLwotdW5zaWduZWQgaW50IGF0aDVrX2h3X2Nsb2NrdG9oKHN0cnVjdCBhdGg1a19odyAqYWgsIHVuc2lnbmVkIGludCBjbG9jaykKK3Vuc2lnbmVkIGludAorYXRoNWtfaHdfY2xvY2t0b2goc3RydWN0IGF0aDVrX2h3ICphaCwgdW5zaWduZWQgaW50IGNsb2NrKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg1a19od19jb21tb24oYWgpOwogCXJldHVybiBjbG9jayAvIGNvbW1vbi0+Y2xvY2tyYXRlOwogfQogCiAvKioKLSAqIGF0aDVrX2h3X2luaXRfY29yZV9jbG9jayAtIEluaXRpYWxpemUgY29yZSBjbG9jaworICogYXRoNWtfaHdfaW5pdF9jb3JlX2Nsb2NrKCkgLSBJbml0aWFsaXplIGNvcmUgY2xvY2sKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKICAqCi0gKiBAYWggVGhlICZzdHJ1Y3QgYXRoNWtfaHcKLSAqCi0gKiBJbml0aWFsaXplIGNvcmUgY2xvY2sgcGFyYW1ldGVycyAodXNlYywgdXNlYzMyLCBsYXRlbmNpZXMgZXRjKS4KKyAqIEluaXRpYWxpemUgY29yZSBjbG9jayBwYXJhbWV0ZXJzICh1c2VjLCB1c2VjMzIsIGxhdGVuY2llcyBldGMpLAorICogYmFzZWQgb24gY3VycmVudCBid21vZGUgYW5kIGNoaXBzZXQgcHJvcGVydGllcy4KICAqLwotc3RhdGljIHZvaWQgYXRoNWtfaHdfaW5pdF9jb3JlX2Nsb2NrKHN0cnVjdCBhdGg1a19odyAqYWgpCitzdGF0aWMgdm9pZAorYXRoNWtfaHdfaW5pdF9jb3JlX2Nsb2NrKHN0cnVjdCBhdGg1a19odyAqYWgpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gYWgtPmFoX2N1cnJlbnRfY2hhbm5lbDsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoNWtfaHdfY29tbW9uKGFoKTsKQEAgLTIyNywxNiArMjYyLDIxIEBACiAJfQogfQogCi0vKgorLyoqCisgKiBhdGg1a19od19zZXRfc2xlZXBfY2xvY2soKSAtIFNldHVwIHNsZWVwIGNsb2NrIG9wZXJhdGlvbgorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGVuYWJsZTogRW5hYmxlIHNsZWVwIGNsb2NrIG9wZXJhdGlvbiAoZmFsc2UgdG8gZGlzYWJsZSkKKyAqCiAgKiBJZiB0aGVyZSBpcyBhbiBleHRlcm5hbCAzMktIeiBjcnlzdGFsIGF2YWlsYWJsZSwgdXNlIGl0CiAgKiBhcyByZWYuIGNsb2NrIGluc3RlYWQgb2YgMzIvNDBNSHogY2xvY2sgYW5kIGJhc2ViYW5kIGNsb2NrcwogICogdG8gc2F2ZSBwb3dlciBkdXJpbmcgc2xlZXAgb3IgcmVzdG9yZSBub3JtYWwgMzIvNDBNSHoKICAqIG9wZXJhdGlvbi4KICAqCi0gKiBYWFg6IFdoZW4gb3BlcmF0aW5nIG9uIDMyS0h6IGNlcnRhaW4gUEhZIHJlZ2lzdGVycyAoMjcgLSAzMSwKLSAqCTEyMyAtIDEyNykgcmVxdWlyZSBkZWxheSBvbiBhY2Nlc3MuCisgKiBOT1RFOiBXaGVuIG9wZXJhdGluZyBvbiAzMktIeiBjZXJ0YWluIFBIWSByZWdpc3RlcnMgKDI3IC0gMzEsCisgKiAxMjMgLSAxMjcpIHJlcXVpcmUgZGVsYXkgb24gYWNjZXNzLgogICovCi1zdGF0aWMgdm9pZCBhdGg1a19od19zZXRfc2xlZXBfY2xvY2soc3RydWN0IGF0aDVrX2h3ICphaCwgYm9vbCBlbmFibGUpCitzdGF0aWMgdm9pZAorYXRoNWtfaHdfc2V0X3NsZWVwX2Nsb2NrKHN0cnVjdCBhdGg1a19odyAqYWgsIGJvb2wgZW5hYmxlKQogewogCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwogCXUzMiBzY2FsLCBzcGVuZGluZywgc2Nsb2NrOwpAQCAtMzQwLDEwICszODAsMTkgQEAKICogUmVzZXQvU2xlZXAgY29udHJvbCAqCiBcKioqKioqKioqKioqKioqKioqKioqLwogCi0vKgotICogUmVzZXQgY2hpcHNldAorLyoqCisgKiBhdGg1a19od19uaWNfcmVzZXQoKSAtIFJlc2V0IHRoZSB2YXJpb3VzIGNoaXBzZXQgdW5pdHMKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEB2YWw6IE1hc2sgdG8gaW5kaWNhdGUgd2hhdCB1bml0cyB0byByZXNldAorICoKKyAqIFRvIHJlc2V0IHRoZSB2YXJpb3VzIGNoaXBzZXQgdW5pdHMgd2UgbmVlZCB0byB3cml0ZQorICogdGhlIG1hc2sgdG8gQVI1S19SRVNFVF9DVEwgYW5kIHBvbGwgdGhlIHJlZ2lzdGVyIHVudGlsCisgKiBhbGwgZmxhZ3MgYXJlIGNsZWFyZWQuCisgKgorICogUmV0dXJucyAwIGlmIHdlIGFyZSBPLksuIG9yIC1FQUdBSU4gKGZyb20gYXRoazVfaHdfcmVnaXN0ZXJfdGltZW91dCkKICAqLwotc3RhdGljIGludCBhdGg1a19od19uaWNfcmVzZXQoc3RydWN0IGF0aDVrX2h3ICphaCwgdTMyIHZhbCkKK3N0YXRpYyBpbnQKK2F0aDVrX2h3X25pY19yZXNldChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgdmFsKQogewogCWludCByZXQ7CiAJdTMyIG1hc2sgPSB2YWwgPyB2YWwgOiB+MFU7CkBAIC0zNTcsNyArNDA2LDcgQEAKIAlhdGg1a19od19yZWdfd3JpdGUoYWgsIHZhbCwgQVI1S19SRVNFVF9DVEwpOwogCiAJLyogV2FpdCBhdCBsZWFzdCAxMjggUENJIGNsb2NrcyAqLwotCXVkZWxheSgxNSk7CisJdXNsZWVwX3JhbmdlKDE1LCAyMCk7CiAKIAlpZiAoYWgtPmFoX3ZlcnNpb24gPT0gQVI1S19BUjUyMTApIHsKIAkJdmFsICY9IEFSNUtfUkVTRVRfQ1RMX1BDVSB8IEFSNUtfUkVTRVRfQ1RMX0RNQQpAQCAtMzgyLDEyICs0MzEsMTcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi0vKgotICogUmVzZXQgQUhCIGNoaXBzZXQKLSAqIEFSNUtfUkVTRVRfQ1RMX1BDVSBmbGFnIHJlc2V0cyBXTUFDCi0gKiBBUjVLX1JFU0VUX0NUTF9CQVNFQkFORCBmbGFnIHJlc2V0cyBXQkIKKy8qKgorICogYXRoNWtfaHdfd2lzb2NfcmVzZXQoKSAtICBSZXNldCBBSEIgY2hpcHNldAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGZsYWdzOiBNYXNrIHRvIGluZGljYXRlIHdoYXQgdW5pdHMgdG8gcmVzZXQKKyAqCisgKiBTYW1lIGFzIGF0aDVrX2h3X25pY19yZXNldCBidXQgZm9yIEFIQiBiYXNlZCBkZXZpY2VzCisgKgorICogUmV0dXJucyAwIGlmIHdlIGFyZSBPLksuIG9yIC1FQUdBSU4gKGZyb20gYXRoazVfaHdfcmVnaXN0ZXJfdGltZW91dCkKICAqLwotc3RhdGljIGludCBhdGg1a19od193aXNvY19yZXNldChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZmxhZ3MpCitzdGF0aWMgaW50CithdGg1a19od193aXNvY19yZXNldChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCB1MzIgZmxhZ3MpCiB7CiAJdTMyIG1hc2sgPSBmbGFncyA/IGZsYWdzIDogfjBVOwogCXUzMiBfX2lvbWVtICpyZWc7CkBAIC00MjIsNyArNDc2LDcgQEAKIAlyZWd2YWwgPSBfX3Jhd19yZWFkbChyZWcpOwogCV9fcmF3X3dyaXRlbChyZWd2YWwgfCB2YWwsIHJlZyk7CiAJcmVndmFsID0gX19yYXdfcmVhZGwocmVnKTsKLQl1ZGVsYXkoMTAwKTsKKwl1c2xlZXBfcmFuZ2UoMTAwLCAxNTApOwogCiAJLyogQnJpbmcgQkIvTUFDIG91dCBvZiByZXNldCAqLwogCV9fcmF3X3dyaXRlbChyZWd2YWwgJiB+dmFsLCByZWcpOwpAQCAtNDM5LDExICs0OTMsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotCi0vKgotICogU2xlZXAgY29udHJvbAorLyoqCisgKiBhdGg1a19od19zZXRfcG93ZXJfbW9kZSgpIC0gU2V0IHBvd2VyIG1vZGUKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBtb2RlOiBPbmUgb2YgZW51bSBhdGg1a19wb3dlcl9tb2RlCisgKiBAc2V0X2NoaXA6IFNldCB0byB0cnVlIHRvIHdyaXRlIHNsZWVwIGNvbnRyb2wgcmVnaXN0ZXIKKyAqIEBzbGVlcF9kdXJhdGlvbjogSG93IG11Y2ggdGltZSB0aGUgZGV2aWNlIGlzIGFsbG93ZWQgdG8gc2xlZXAKKyAqIHdoZW4gc2xlZXAgbG9naWMgaXMgZW5hYmxlZCAoaW4gMTI4IG1pY3Jvc2Vjb25kIGluY3JlbWVudHMpLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjb25maWd1cmUgc2xlZXAgcG9saWN5IGFuZCBhbGxvd2VkCisgKiBzbGVlcCBtb2Rlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gY2hlY2sgb3V0IHRoZSBzbGVlcCBjb250cm9sCisgKiByZWdpc3RlciBvbiByZWcuaCBhbmQgU1RBX0lEMS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLUVJTyBpZiBjaGlwIGRpZG4ndCB3YWtlIHVwIG9yIC1FSU5WQUwgaWYgYW4gaW52YWxpZAorICogbW9kZSBpcyByZXF1ZXN0ZWQuCiAgKi8KLXN0YXRpYyBpbnQgYXRoNWtfaHdfc2V0X3Bvd2VyKHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gYXRoNWtfcG93ZXJfbW9kZSBtb2RlLAorc3RhdGljIGludAorYXRoNWtfaHdfc2V0X3Bvd2VyX21vZGUoc3RydWN0IGF0aDVrX2h3ICphaCwgZW51bSBhdGg1a19wb3dlcl9tb2RlIG1vZGUsCiAJCQkgICAgICBib29sIHNldF9jaGlwLCB1MTYgc2xlZXBfZHVyYXRpb24pCiB7CiAJdW5zaWduZWQgaW50IGk7CkBAIC00OTMsNyArNTU5LDcgQEAKIAogCQlhdGg1a19od19yZWdfd3JpdGUoYWgsIGRhdGEgfCBBUjVLX1NMRUVQX0NUTF9TTEVfV0FLRSwKIAkJCQkJCQlBUjVLX1NMRUVQX0NUTCk7Ci0JCXVkZWxheSgxNSk7CisJCXVzbGVlcF9yYW5nZSgxNSwgMjApOwogCiAJCWZvciAoaSA9IDIwMDsgaSA+IDA7IGktLSkgewogCQkJLyogQ2hlY2sgaWYgdGhlIGNoaXAgZGlkIHdha2UgdXAgKi8KQEAgLTUwMiw3ICs1NjgsNyBAQAogCQkJCWJyZWFrOwogCiAJCQkvKiBXYWl0IGEgYml0IGFuZCByZXRyeSAqLwotCQkJdWRlbGF5KDUwKTsKKwkJCXVzbGVlcF9yYW5nZSg1MCwgNzUpOwogCQkJYXRoNWtfaHdfcmVnX3dyaXRlKGFoLCBkYXRhIHwgQVI1S19TTEVFUF9DVExfU0xFX1dBS0UsCiAJCQkJCQkJQVI1S19TTEVFUF9DVEwpOwogCQl9CkBAIC01MjMsMTcgKzU4OSwyMCBAQAogCXJldHVybiAwOwogfQogCi0vKgotICogUHV0IGRldmljZSBvbiBob2xkCisvKioKKyAqIGF0aDVrX2h3X29uX2hvbGQoKSAtIFB1dCBkZXZpY2Ugb24gaG9sZAorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odwogICoKLSAqIFB1dCBNQUMgYW5kIEJhc2ViYW5kIG9uIHdhcm0gcmVzZXQgYW5kCi0gKiBrZWVwIHRoYXQgc3RhdGUgKGRvbid0IGNsZWFuIHNsZWVwIGNvbnRyb2wKLSAqIHJlZ2lzdGVyKS4gQWZ0ZXIgdGhpcyBNQUMgYW5kIEJhc2ViYW5kIGFyZQotICogZGlzYWJsZWQgYW5kIGEgZnVsbCByZXNldCBpcyBuZWVkZWQgdG8gY29tZQotICogYmFjay4gVGhpcyB3YXkgd2Ugc2F2ZSBhcyBtdWNoIHBvd2VyIGFzIHBvc3NpYmxlCisgKiBQdXQgTUFDIGFuZCBCYXNlYmFuZCBvbiB3YXJtIHJlc2V0IGFuZCBrZWVwIHRoYXQgc3RhdGUKKyAqIChkb24ndCBjbGVhbiBzbGVlcCBjb250cm9sIHJlZ2lzdGVyKS4gQWZ0ZXIgdGhpcyBNQUMKKyAqIGFuZCBCYXNlYmFuZCBhcmUgZGlzYWJsZWQgYW5kIGEgZnVsbCByZXNldCBpcyBuZWVkZWQKKyAqIHRvIGNvbWUgYmFjay4gVGhpcyB3YXkgd2Ugc2F2ZSBhcyBtdWNoIHBvd2VyIGFzIHBvc3NpYmxlCiAgKiB3aXRob3V0IHB1dHRpbmcgdGhlIGNhcmQgb24gZnVsbCBzbGVlcC4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcyBvciAtRUlPIG9uIGVycm9yCiAgKi8KLWludCBhdGg1a19od19vbl9ob2xkKHN0cnVjdCBhdGg1a19odyAqYWgpCitpbnQKK2F0aDVrX2h3X29uX2hvbGQoc3RydWN0IGF0aDVrX2h3ICphaCkKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGFoLT5wZGV2OwogCXUzMiBidXNfZmxhZ3M7CkBAIC01NDMsNyArNjEyLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBNYWtlIHN1cmUgZGV2aWNlIGlzIGF3YWtlICovCi0JcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKKwlyZXQgPSBhdGg1a19od19zZXRfcG93ZXJfbW9kZShhaCwgQVI1S19QTV9BV0FLRSwgdHJ1ZSwgMCk7CiAJaWYgKHJldCkgewogCQlBVEg1S19FUlIoYWgsICJmYWlsZWQgdG8gd2FrZXVwIHRoZSBNQUMgQ2hpcFxuIik7CiAJCXJldHVybiByZXQ7CkBAIC01NjMsNyArNjMyLDcgQEAKIAkJcmV0ID0gYXRoNWtfaHdfbmljX3Jlc2V0KGFoLCBBUjVLX1JFU0VUX0NUTF9QQ1UgfAogCQkJQVI1S19SRVNFVF9DVExfTUFDIHwgQVI1S19SRVNFVF9DVExfRE1BIHwKIAkJCUFSNUtfUkVTRVRfQ1RMX1BIWSB8IEFSNUtfUkVTRVRfQ1RMX1BDSSk7Ci0JCQltZGVsYXkoMik7CisJCQl1c2xlZXBfcmFuZ2UoMjAwMCwgMjUwMCk7CiAJfSBlbHNlIHsKIAkJcmV0ID0gYXRoNWtfaHdfbmljX3Jlc2V0KGFoLCBBUjVLX1JFU0VUX0NUTF9QQ1UgfAogCQkJQVI1S19SRVNFVF9DVExfQkFTRUJBTkQgfCBidXNfZmxhZ3MpOwpAQCAtNTc1LDcgKzY0NCw3IEBACiAJfQogCiAJLyogLi4ud2FrZXVwIGFnYWluISovCi0JcmV0ID0gYXRoNWtfaHdfc2V0X3Bvd2VyKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKKwlyZXQgPSBhdGg1a19od19zZXRfcG93ZXJfbW9kZShhaCwgQVI1S19QTV9BV0FLRSwgdHJ1ZSwgMCk7CiAJaWYgKHJldCkgewogCQlBVEg1S19FUlIoYWgsICJmYWlsZWQgdG8gcHV0IGRldmljZSBvbiBob2xkXG4iKTsKIAkJcmV0dXJuIHJldDsKQEAgLTU4NCwxMSArNjUzLDE4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKKy8qKgorICogYXRoNWtfaHdfbmljX3dha2V1cCgpIC0gRm9yY2UgY2FyZCBvdXQgb2Ygc2xlZXAKKyAqIEBhaDogVGhlICZzdHJ1Y3QgYXRoNWtfaHcKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICoKICAqIEJyaW5nIHVwIE1BQyArIFBIWSBDaGlwcyBhbmQgcHJvZ3JhbSBQTEwKLSAqIENoYW5uZWwgaXMgTlVMTCBmb3IgdGhlIGluaXRpYWwgd2FrZXVwLgorICogTk9URTogQ2hhbm5lbCBpcyBOVUxMIGZvciB0aGUgaW5pdGlhbCB3YWtldXAuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FSU8gb24gaHcgZmFpbHVyZSBvciAtRUlOVkFMIGZvciBmYWxzZSBjaGFubmVsIGluZm9zCiAgKi8KLWludCBhdGg1a19od19uaWNfd2FrZXVwKHN0cnVjdCBhdGg1a19odyAqYWgsIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCkKK2ludAorYXRoNWtfaHdfbmljX3dha2V1cChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBhaC0+cGRldjsKIAl1MzIgdHVyYm8sIG1vZGUsIGNsb2NrLCBidXNfZmxhZ3M7CkBAIC02MDAsNyArNjc2LDcgQEAKIAogCWlmICgoYXRoNWtfZ2V0X2J1c190eXBlKGFoKSAhPSBBVEhfQUhCKSB8fCBjaGFubmVsKSB7CiAJCS8qIFdha2V1cCB0aGUgZGV2aWNlICovCi0JCXJldCA9IGF0aDVrX2h3X3NldF9wb3dlcihhaCwgQVI1S19QTV9BV0FLRSwgdHJ1ZSwgMCk7CisJCXJldCA9IGF0aDVrX2h3X3NldF9wb3dlcl9tb2RlKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKIAkJaWYgKHJldCkgewogCQkJQVRINUtfRVJSKGFoLCAiZmFpbGVkIHRvIHdha2V1cCB0aGUgTUFDIENoaXBcbiIpOwogCQkJcmV0dXJuIHJldDsKQEAgLTYyMSw3ICs2OTcsNyBAQAogCQlyZXQgPSBhdGg1a19od19uaWNfcmVzZXQoYWgsIEFSNUtfUkVTRVRfQ1RMX1BDVSB8CiAJCQlBUjVLX1JFU0VUX0NUTF9NQUMgfCBBUjVLX1JFU0VUX0NUTF9ETUEgfAogCQkJQVI1S19SRVNFVF9DVExfUEhZIHwgQVI1S19SRVNFVF9DVExfUENJKTsKLQkJCW1kZWxheSgyKTsKKwkJCXVzbGVlcF9yYW5nZSgyMDAwLCAyNTAwKTsKIAl9IGVsc2UgewogCQlpZiAoYXRoNWtfZ2V0X2J1c190eXBlKGFoKSA9PSBBVEhfQUhCKQogCQkJcmV0ID0gYXRoNWtfaHdfd2lzb2NfcmVzZXQoYWgsIEFSNUtfUkVTRVRfQ1RMX1BDVSB8CkBAIC02MzcsNyArNzEzLDcgQEAKIAl9CiAKIAkvKiAuLi53YWtldXAgYWdhaW4hLi4uKi8KLQlyZXQgPSBhdGg1a19od19zZXRfcG93ZXIoYWgsIEFSNUtfUE1fQVdBS0UsIHRydWUsIDApOworCXJldCA9IGF0aDVrX2h3X3NldF9wb3dlcl9tb2RlKGFoLCBBUjVLX1BNX0FXQUtFLCB0cnVlLCAwKTsKIAlpZiAocmV0KSB7CiAJCUFUSDVLX0VSUihhaCwgImZhaWxlZCB0byByZXN1bWUgdGhlIE1BQyBDaGlwXG4iKTsKIAkJcmV0dXJuIHJldDsKQEAgLTczOSw3ICs4MTUsNyBAQAogCQkvKiAuLi51cGRhdGUgUExMIGlmIG5lZWRlZCAqLwogCQlpZiAoYXRoNWtfaHdfcmVnX3JlYWQoYWgsIEFSNUtfUEhZX1BMTCkgIT0gY2xvY2spIHsKIAkJCWF0aDVrX2h3X3JlZ193cml0ZShhaCwgY2xvY2ssIEFSNUtfUEhZX1BMTCk7Ci0JCQl1ZGVsYXkoMzAwKTsKKwkJCXVzbGVlcF9yYW5nZSgzMDAsIDM1MCk7CiAJCX0KIAogCQkvKiAuLi5zZXQgdGhlIFBIWSBvcGVyYXRpbmcgbW9kZSAqLwpAQCAtNzU1LDggKzgzMSwxOSBAQAogKiBQb3N0LWluaXR2YWxzIHJlZ2lzdGVyIG1vZGlmaWNhdGlvbnMgKgogXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBUT0RPOiBIYWxmL1F1YXJ0ZXIgcmF0ZSAqLwotc3RhdGljIHZvaWQgYXRoNWtfaHdfdHdlYWtfaW5pdHZhbF9zZXR0aW5ncyhzdHJ1Y3QgYXRoNWtfaHcgKmFoLAorLyoqCisgKiBhdGg1a19od190d2Vha19pbml0dmFsX3NldHRpbmdzKCkgLSBUd2VhayBpbml0aWFsIHNldHRpbmdzCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAY2hhbm5lbDogVGhlICZzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKyAqCisgKiBTb21lIHNldHRpbmdzIGFyZSBub3QgaGFuZGxlZCBvbiBpbml0dmFscywgZS5nLiBid21vZGUKKyAqIHNldHRpbmdzLCBzb21lIHBoeSBzZXR0aW5ncywgd29ya2Fyb3VuZHMgZXRjIHRoYXQgaW4gZ2VuZXJhbAorICogZG9uJ3QgZml0IGFueXdoZXJlIGVsc2Ugb3IgYXJlIHRvbyBzbWFsbCB0byBpbnRyb2R1Y2UgYSBzZXBhcmF0ZQorICogZnVuY3Rpb24gZm9yIGVhY2ggb25lLiBTbyB3ZSBoYXZlIHRoaXMgZnVuY3Rpb24gdG8gaGFuZGxlCisgKiB0aGVtIGFsbCBkdXJpbmcgcmVzZXQgYW5kIGNvbXBsZXRlIGNhcmQncyBpbml0aWFsaXphdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2F0aDVrX2h3X3R3ZWFrX2luaXR2YWxfc2V0dGluZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwpCiB7CiAJaWYgKGFoLT5haF92ZXJzaW9uID09IEFSNUtfQVI1MjEyICYmCkBAIC04NzUsNyArOTYyLDE2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBhdGg1a19od19jb21taXRfZWVwcm9tX3NldHRpbmdzKHN0cnVjdCBhdGg1a19odyAqYWgsCisvKioKKyAqIGF0aDVrX2h3X2NvbW1pdF9lZXByb21fc2V0dGluZ3MoKSAtIENvbW1pdCBzZXR0aW5ncyBmcm9tIEVFUFJPTQorICogQGFoOiBUaGUgJnN0cnVjdCBhdGg1a19odworICogQGNoYW5uZWw6IFRoZSAmc3RydWN0IGllZWU4MDIxMV9jaGFubmVsCisgKgorICogVXNlIHNldHRpbmdzIHN0b3JlZCBvbiBFRVBST00gdG8gcHJvcGVybHkgaW5pdGlhbGl6ZSB0aGUgY2FyZAorICogYmFzZWQgb24gdmFyaW91cyBpbmZvcyBhbmQgcGVyLW1vZGUgY2FsaWJyYXRpb24gZGF0YS4KKyAqLworc3RhdGljIHZvaWQKK2F0aDVrX2h3X2NvbW1pdF9lZXByb21fc2V0dGluZ3Moc3RydWN0IGF0aDVrX2h3ICphaCwKIAkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsKQogewogCXN0cnVjdCBhdGg1a19lZXByb21faW5mbyAqZWUgPSAmYWgtPmFoX2NhcGFiaWxpdGllcy5jYXBfZWVwcm9tOwpAQCAtMTAyOSw3ICsxMTI1LDIzIEBACiAqIE1haW4gcmVzZXQgZnVuY3Rpb24gKgogXCoqKioqKioqKioqKioqKioqKioqKi8KIAotaW50IGF0aDVrX2h3X3Jlc2V0KHN0cnVjdCBhdGg1a19odyAqYWgsIGVudW0gbmw4MDIxMV9pZnR5cGUgb3BfbW9kZSwKKy8qKgorICogYXRoNWtfaHdfcmVzZXQoKSAtIFRoZSBtYWluIHJlc2V0IGZ1bmN0aW9uCisgKiBAYWg6IFRoZSAmc3RydWN0IGF0aDVrX2h3CisgKiBAb3BfbW9kZTogT25lIG9mIGVudW0gbmw4MDIxMV9pZnR5cGUKKyAqIEBjaGFubmVsOiBUaGUgJnN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbAorICogQGZhc3Q6IEVuYWJsZSBmYXN0IGNoYW5uZWwgc3dpdGNoaW5nCisgKiBAc2tpcF9wY3U6IFNraXAgcGN1IGluaXRpYWxpemF0aW9uCisgKgorICogVGhpcyBpcyB0aGUgZnVuY3Rpb24gd2UgY2FsbCBlYWNoIHRpbWUgd2Ugd2FudCB0byAocmUpaW5pdGlhbGl6ZSB0aGUKKyAqIGNhcmQgYW5kIHBhc3MgbmV3IHNldHRpbmdzIHRvIGh3LiBXZSBhbHNvIGNhbGwgaXQgd2hlbiBodyBydW5zIGludG8KKyAqIHRyb3VibGUgdG8gbWFrZSBpdCBjb21lIGJhY2sgdG8gYSB3b3JraW5nIHN0YXRlLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIG9uIGZhbHNlIG9wX21vZGUgb3IgY2hhbm5lbCBpbmZvcywgb3IgLUVJTworICogb24gZmFpbHVyZS4KKyAqLworaW50CithdGg1a19od19yZXNldChzdHJ1Y3QgYXRoNWtfaHcgKmFoLCBlbnVtIG5sODAyMTFfaWZ0eXBlIG9wX21vZGUsCiAJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwgYm9vbCBmYXN0LCBib29sIHNraXBfcGN1KQogewogCXUzMiBzX3NlcVsxMF0sIHNfbGVkWzNdLCB0c2ZfdXAsIHRzZl9sbzsKQEAgLTEwNDcsNyArMTE1OSw3IEBACiAJICovCiAJaWYgKGZhc3QgJiYgKGFoLT5haF9yYWRpbyAhPSBBUjVLX1JGMjQxMykgJiYKIAkoYWgtPmFoX3JhZGlvICE9IEFSNUtfUkY1NDEzKSkKLQkJZmFzdCA9IDA7CisJCWZhc3QgPSBmYWxzZTsKIAogCS8qIERpc2FibGUgc2xlZXAgY2xvY2sgb3BlcmF0aW9uCiAJICogdG8gYXZvaWQgcmVnaXN0ZXIgYWNjZXNzIGRlbGF5IG9uIGNlcnRhaW4KQEAgLTEwNzMsNyArMTE4NSw3IEBACiAJaWYgKHJldCAmJiBmYXN0KSB7CiAJCUFUSDVLX0RCRyhhaCwgQVRINUtfREVCVUdfUkVTRVQsCiAJCQkiRE1BIGRpZG4ndCBzdG9wLCBmYWxsaW5nIGJhY2sgdG8gbm9ybWFsIHJlc2V0XG4iKTsKLQkJZmFzdCA9IDA7CisJCWZhc3QgPSBmYWxzZTsKIAkJLyogTm9uIGZhdGFsLCBqdXN0IGNvbnRpbnVlIHdpdGgKIAkJICogbm9ybWFsIHJlc2V0ICovCiAJCXJldCA9IDA7CkBAIC0xMjQyLDcgKzEzNTQsNyBAQAogCS8qCiAJICogSW5pdGlhbGl6ZSBQQ1UKIAkgKi8KLQlhdGg1a19od19wY3VfaW5pdChhaCwgb3BfbW9kZSwgbW9kZSk7CisJYXRoNWtfaHdfcGN1X2luaXQoYWgsIG9wX21vZGUpOwogCiAJLyoKIAkgKiBJbml0aWFsaXplIFBIWQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmYnVmZmVyLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmZidWZmZXIuaAppbmRleCA1ZDExYzIzLi5hZWQzNGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmZidWZmZXIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmZidWZmZXIuaApAQCAtMTgsNyArMTgsOSBAQAogICovCiAKIAotLyoKKy8qKgorICogRE9DOiBSRiBCdWZmZXIgcmVnaXN0ZXJzCisgKgogICogVGhlcmUgYXJlIHNvbWUgc3BlY2lhbCByZWdpc3RlcnMgb24gdGhlIFJGIGNoaXAKICAqIHRoYXQgY29udHJvbCB2YXJpb3VzIG9wZXJhdGlvbiBzZXR0aW5ncyByZWxhdGVkIG1vc3RseSB0bwogICogdGhlIGFuYWxvZyBwYXJ0cyAoY2hhbm5lbCwgZ2FpbiBhZGp1c3RtZW50IGV0YykuCkBAIC00NCw0MCArNDYsNjMgQEAKICAqLwogCiAKLS8qCisvKioKKyAqIHN0cnVjdCBhdGg1a19pbmlfcmZidWZmZXIgLSBJbml0aWFsIFJGIEJ1ZmZlciBzZXR0aW5ncworICogQHJmYl9iYW5rOiBSRiBCYW5rIG51bWJlcgorICogQHJmYl9jdHJsX3JlZ2lzdGVyOiBSRiBCdWZmZXIgY29udHJvbCByZWdpc3RlcgorICogQHJmYl9tb2RlX2RhdGE6IFJGIEJ1ZmZlciBkYXRhIGZvciBlYWNoIG1vZGUKKyAqCiAgKiBTdHJ1Y3QgdG8gaG9sZCBkZWZhdWx0IG1vZGUgc3BlY2lmaWMgUkYKLSAqIHJlZ2lzdGVyIHZhbHVlcyAoUkYgQmFua3MpCisgKiByZWdpc3RlciB2YWx1ZXMgKFJGIEJhbmtzKSBmb3IgZWFjaCBjaGlwLgogICovCiBzdHJ1Y3QgYXRoNWtfaW5pX3JmYnVmZmVyIHsKLQl1OAlyZmJfYmFuazsJCS8qIFJGIEJhbmsgbnVtYmVyICovCi0JdTE2CXJmYl9jdHJsX3JlZ2lzdGVyOwkvKiBSRiBCdWZmZXIgY29udHJvbCByZWdpc3RlciAqLwotCXUzMglyZmJfbW9kZV9kYXRhWzNdOwkvKiBSRiBCdWZmZXIgZGF0YSBmb3IgZWFjaCBtb2RlICovCisJdTgJcmZiX2Jhbms7CisJdTE2CXJmYl9jdHJsX3JlZ2lzdGVyOworCXUzMglyZmJfbW9kZV9kYXRhWzNdOwogfTsKIAotLyoKKy8qKgorICogc3RydWN0IGF0aDVrX3JmYl9maWVsZCAtIEFuIFJGIEJ1ZmZlciBmaWVsZCAocmVnaXN0ZXIvdmFsdWUpCisgKiBAbGVuOiBGaWVsZCBsZW5ndGgKKyAqIEBwb3M6IE9mZnNldCBvbiB0aGUgcmF3IHBhY2tldAorICogQGNvbDogVXNlZCBmb3Igc2hpZnRpbmcKKyAqCiAgKiBTdHJ1Y3QgdG8gaG9sZCBSRiBCdWZmZXIgZmllbGQKICAqIGluZm9zIHVzZWQgdG8gYWNjZXNzIGNlcnRhaW4gUkYKICAqIGFuYWxvZyByZWdpc3RlcnMKICAqLwogc3RydWN0IGF0aDVrX3JmYl9maWVsZCB7Ci0JdTgJbGVuOwkvKiBGaWVsZCBsZW5ndGggKi8KLQl1MTYJcG9zOwkvKiBPZmZzZXQgb24gdGhlIHJhdyBwYWNrZXQgKi8KLQl1OAljb2w7CS8qIENvbHVtbiAtdXNlZCBmb3Igc2hpZnRpbmcgKi8KKwl1OAlsZW47CisJdTE2CXBvczsKKwl1OAljb2w7CiB9OwogCi0vKgotICogUkYgYW5hbG9nIHJlZ2lzdGVyIGRlZmluaXRpb24KKy8qKgorICogc3RydWN0IGF0aDVrX3JmX3JlZyAtIFJGIGFuYWxvZyByZWdpc3RlciBkZWZpbml0aW9uCisgKiBAYmFuazogUkYgQnVmZmVyIEJhbmsgbnVtYmVyCisgKiBAaW5kZXg6IFJlZ2lzdGVyJ3MgaW5kZXggb24gYXRoNWtfcmZfcmVneF9pZHgKKyAqIEBmaWVsZDogVGhlICZzdHJ1Y3QgYXRoNWtfcmZiX2ZpZWxkCisgKgorICogV2UgdXNlIHRoaXMgc3RydWN0IHRvIGRlZmluZSB0aGUgc2V0IG9mIFJGIHJlZ2lzdGVycworICogb24gZWFjaCBjaGlwIHRoYXQgd2Ugd2FudCB0byB0d2Vhay4gU29tZSBSRiByZWdpc3RlcnMKKyAqIGFyZSBjb21tb24gYmV0d2VlbiBkaWZmZXJlbnQgY2hpcCB2ZXJzaW9ucyBzbyB0aGlzIHNhdmVzCisgKiB1cyBzcGFjZSBhbmQgY29tcGxleGl0eSBiZWNhdXNlIHdlIGNhbiByZWZlciB0byBhbiByZgorICogcmVnaXN0ZXIgYnkgaXQncyBpbmRleCBubyBtYXR0ZXIgd2hhdCBjaGlwIHdlIHdvcmsgd2l0aAorICogYXMgbG9uZyBhcyBpdCBoYXMgdGhhdCByZWdpc3Rlci4KICAqLwogc3RydWN0IGF0aDVrX3JmX3JlZyB7Ci0JdTgJCQliYW5rOwkvKiBSRiBCdWZmZXIgQmFuayBudW1iZXIgKi8KLQl1OAkJCWluZGV4OwkvKiBSZWdpc3RlcidzIGluZGV4IG9uIHJmX3JlZ3NfaWR4ICovCi0Jc3RydWN0IGF0aDVrX3JmYl9maWVsZAlmaWVsZDsJLyogUkYgQnVmZmVyIGZpZWxkIGZvciB0aGlzIHJlZ2lzdGVyICovCisJdTgJCQliYW5rOworCXU4CQkJaW5kZXg7CisJc3RydWN0IGF0aDVrX3JmYl9maWVsZAlmaWVsZDsKIH07CiAKLS8qIE1hcCBSRiByZWdpc3RlcnMgdG8gaW5kZXhlcworLyoqCisgKiBlbnVtIGF0aDVrX3JmX3JlZ3NfaWR4IC0gTWFwIFJGIHJlZ2lzdGVycyB0byBpbmRleGVzCisgKgogICogV2UgZG8gdGhpcyB0byBoYW5kbGUgY29tbW9uIGJpdHMgYW5kIG1ha2Ugb3VyCiAgKiBsaWZlIGVhc2llciBieSB1c2luZyBhbiBpbmRleCBmb3IgZWFjaCByZWdpc3RlcgotICogaW5zdGVhZCBvZiBhIGZ1bGwgcmZiX2ZpZWxkICovCisgKiBpbnN0ZWFkIG9mIGEgZnVsbCByZmJfZmllbGQKKyAqLwogZW51bSBhdGg1a19yZl9yZWdzX2lkeCB7CiAJLyogQkFOSyAyICovCiAJQVI1S19SRl9UVVJCTyA9IDAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmZnYWluLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsvcmZnYWluLmgKaW5kZXggZWJmYWUwNS4uNGQyMWRmMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3JmZ2Fpbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay9yZmdhaW4uaApAQCAtMTgsMTMgKzE4LDE3IEBACiAgKgogICovCiAKLS8qCisvKioKKyAqIHN0cnVjdCBhdGg1a19pbmlfcmZnYWluIC0gUkYgR2FpbiB0YWJsZQorICogQHJmZ19yZWdpc3RlcjogUkYgR2FpbiByZWdpc3RlciBhZGRyZXNzCisgKiBAcmZnX3ZhbHVlOiBSZWdpc3RlciB2YWx1ZSBmb3IgNSBhbmQgMkdIegorICoKICAqIE1vZGUtc3BlY2lmaWMgUkYgR2FpbiB0YWJsZSAoNjRieXRlcykgZm9yIFJGNTExMS81MTEyCiAgKiAoUkY1MTEwIG9ubHkgY29tZXMgd2l0aCBBUjUyMTAgYW5kIG9ubHkgc3VwcG9ydHMgYS90dXJibyBhIG1vZGUgc28gaW5pdGlhbAogICogUkYgR2FpbiB2YWx1ZXMgYXJlIGluY2x1ZGVkIGluIEFSNUtfQVI1MjEwX0lOSSkKICAqLwogc3RydWN0IGF0aDVrX2luaV9yZmdhaW4gewotCXUxNglyZmdfcmVnaXN0ZXI7CS8qIFJGIEdhaW4gcmVnaXN0ZXIgYWRkcmVzcyAqLworCXUxNglyZmdfcmVnaXN0ZXI7CiAJdTMyCXJmZ192YWx1ZVsyXTsJLyogW2ZyZXEgKHNlZSBiZWxvdyldICovCiB9OwogCkBAIC00NTUsMTggKzQ1OSwzMSBAQAogI2RlZmluZSBBUjVLX0dBSU5fQ0hFQ0tfQURKVVNUKF9nKQkJXAogCSgoX2cpLT5nX2N1cnJlbnQgPD0gKF9nKS0+Z19sb3cgfHwgKF9nKS0+Z19jdXJyZW50ID49IChfZyktPmdfaGlnaCkKIAorLyoqCisgKiBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHRfc3RlcCAtIEFuIFJGIGdhaW4gb3B0aW1pemF0aW9uIHN0ZXAKKyAqIEBnb3NfcGFyYW06IFNldCBvZiBwYXJhbWV0ZXJzCisgKiBAZ29zX2dhaW46IEdhaW4KKyAqLwogc3RydWN0IGF0aDVrX2dhaW5fb3B0X3N0ZXAgewogCXM4CQkJCWdvc19wYXJhbVtBUjVLX0dBSU5fQ1JOX01BWF9GSVhfQklUU107CiAJczgJCQkJZ29zX2dhaW47CiB9OwogCisvKioKKyAqIHN0cnVjdCBhdGg1a19nYWluX29wdCAtIFJGIEdhaW4gb3B0aW1pemF0aW9uIGxhZGRlcgorICogQGdvX2RlZmF1bHQ6IFRoZSBkZWZhdWx0IHN0ZXAKKyAqIEBnb19zdGVwc19jb3VudDogSG93IG1hbnkgb3B0aW1pemF0aW9uIHN0ZXBzCisgKiBAZ29fc3RlcDogQXJyYXkgb2YgJnN0cnVjdCBhdGg1a19nYWluX29wdF9zdGVwCisgKi8KIHN0cnVjdCBhdGg1a19nYWluX29wdCB7CiAJdTgJCQkJZ29fZGVmYXVsdDsKIAl1OAkJCQlnb19zdGVwc19jb3VudDsKIAljb25zdCBzdHJ1Y3QgYXRoNWtfZ2Fpbl9vcHRfc3RlcAlnb19zdGVwW0FSNUtfR0FJTl9TVEVQX0NPVU5UXTsKIH07CiAKKwogLyoKKyAqIFJGNTExMQogICogUGFyYW1ldGVycyBvbiBnb3NfcGFyYW06CiAgKiAxKSBUeCBjbGlwIFBIWSByZWdpc3RlcgogICogMikgUFdEIDkwIFJGIHJlZ2lzdGVyCkBAIC00OTAsNiArNTA3LDcgQEAKIH07CiAKIC8qCisgKiBSRjUxMTIKICAqIFBhcmFtZXRlcnMgb24gZ29zX3BhcmFtOgogICogMSkgTWl4Z2FpbiBvdnIgUkYgcmVnaXN0ZXIKICAqIDIpIFBXRCAxMzggUkYgcmVnaXN0ZXIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg1ay90cmFjZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3RyYWNlLmgKaW5kZXggMzlmMDAyZS4uMDBmMDE1OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3RyYWNlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDVrL3RyYWNlLmgKQEAgLTMsNyArMyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CiAKLSNpZm5kZWYgQ09ORklHX0FUSDVLX1RSQUNFUgorCisjaWYgIWRlZmluZWQoQ09ORklHX0FUSDVLX1RSQUNFUikgfHwgZGVmaW5lZChfX0NIRUNLRVJfXykKICN1bmRlZiBUUkFDRV9FVkVOVAogI2RlZmluZSBUUkFDRV9FVkVOVChuYW1lLCBwcm90bywgLi4uKSBcCiBzdGF0aWMgaW5saW5lIHZvaWQgdHJhY2VfICMjIG5hbWUocHJvdG8pIHt9CkBAIC05Myw3ICs5NCw3IEBACiAKICNlbmRpZiAvKiBfX1RSQUNFX0FUSDVLX0ggKi8KIAotI2lmZGVmIENPTkZJR19BVEg1S19UUkFDRVIKKyNpZiBkZWZpbmVkKENPTkZJR19BVEg1S19UUkFDRVIpICYmICFkZWZpbmVkKF9fQ0hFQ0tFUl9fKQogCiAjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICiAjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuLi8uLi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNWsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL01ha2VmaWxlCmluZGV4IDhmN2EwZDEuLjcwNzA2OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9NYWtlZmlsZQpAQCAtMjMsNyArMjMsNyBAQAogCiBvYmotJChDT05GSUdfQVRINktMKSA6PSBhdGg2a2wubwogYXRoNmtsLXkgKz0gZGVidWcubwotYXRoNmtsLXkgKz0gaHRjX2hpZi5vCithdGg2a2wteSArPSBoaWYubwogYXRoNmtsLXkgKz0gaHRjLm8KIGF0aDZrbC15ICs9IGJtaS5vCiBhdGg2a2wteSArPSBjZmc4MDIxMS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2JtaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9ibWkuYwppbmRleCBjNWQxMWNjLi5iY2UzNTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2JtaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvYm1pLmMKQEAgLTE5LDE2NSArMTksNiBAQAogI2luY2x1ZGUgInRhcmdldC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLXN0YXRpYyBpbnQgYXRoNmtsX2dldF9ibWlfY21kX2NyZWRpdHMoc3RydWN0IGF0aDZrbCAqYXIpCi17Ci0JdTMyIGFkZHI7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCWludCByZXQ7Ci0KLQlhci0+Ym1pLmNtZF9jcmVkaXRzID0gMDsKLQotCS8qIFJlYWQgdGhlIGNvdW50ZXIgcmVnaXN0ZXIgdG8gZ2V0IHRoZSBjb21tYW5kIGNyZWRpdHMgKi8KLQlhZGRyID0gQ09VTlRfREVDX0FERFJFU1MgKyAoSFRDX01BSUxCT1hfTlVNX01BWCArIEVORFBPSU5UMSkgKiA0OwotCi0JdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKEJNSV9DT01NVU5JQ0FUSU9OX1RJTUVPVVQpOwotCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAhYXItPmJtaS5jbWRfY3JlZGl0cykgewotCi0JCS8qCi0JCSAqIEhpdCB0aGUgY3JlZGl0IGNvdW50ZXIgd2l0aCBhIDQtYnl0ZSBhY2Nlc3MsIHRoZSBmaXJzdCBieXRlCi0JCSAqIHJlYWQgd2lsbCBoaXQgdGhlIGNvdW50ZXIgYW5kIGNhdXNlIGEgZGVjcmVtZW50LCB3aGlsZSB0aGUKLQkJICogcmVtYWluaW5nIDMgYnl0ZXMgaGFzIG5vIGVmZmVjdC4gVGhlIHJhdGlvbmFsZSBiZWhpbmQgdGhpcwotCQkgKiBpcyB0byBtYWtlIGFsbCBISUYgYWNjZXNzZXMgNC1ieXRlIGFsaWduZWQuCi0JCSAqLwotCQlyZXQgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGFyLCBhZGRyLAotCQkJCQkgKHU4ICopJmFyLT5ibWkuY21kX2NyZWRpdHMsIDQsCi0JCQkJCSBISUZfUkRfU1lOQ19CWVRFX0lOQyk7Ci0JCWlmIChyZXQpIHsKLQkJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byBkZWNyZW1lbnQgdGhlIGNvbW1hbmQgY3JlZGl0IGNvdW50IHJlZ2lzdGVyOiAlZFxuIiwKLQkJCQkgICByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCS8qIFRoZSBjb3VudGVyIGlzIG9ubHkgOCBiaXRzLgotCQkgKiBJZ25vcmUgYW55dGhpbmcgaW4gdGhlIHVwcGVyIDMgYnl0ZXMKLQkJICovCi0JCWFyLT5ibWkuY21kX2NyZWRpdHMgJj0gMHhGRjsKLQl9Ci0KLQlpZiAoIWFyLT5ibWkuY21kX2NyZWRpdHMpIHsKLQkJYXRoNmtsX2VycigiYm1pIGNvbW11bmljYXRpb24gdGltZW91dFxuIik7Ci0JCXJldHVybiAtRVRJTUVET1VUOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGF0aDZrbF9ibWlfZ2V0X3J4X2xrYWhkKHN0cnVjdCBhdGg2a2wgKmFyKQotewotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQl1MzIgcnhfd29yZCA9IDA7Ci0JaW50IHJldCA9IDA7Ci0KLQl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQk1JX0NPTU1VTklDQVRJT05fVElNRU9VVCk7Ci0Jd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICFyeF93b3JkKSB7Ci0JCXJldCA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoYXIsIFJYX0xPT0tBSEVBRF9WQUxJRF9BRERSRVNTLAotCQkJCQkgICh1OCAqKSZyeF93b3JkLCBzaXplb2Yocnhfd29yZCksCi0JCQkJCSAgSElGX1JEX1NZTkNfQllURV9JTkMpOwotCQlpZiAocmV0KSB7Ci0JCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gcmVhZCBSWF9MT09LQUhFQURfVkFMSURcbiIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCSAvKiBhbGwgd2UgcmVhbGx5IHdhbnQgaXMgb25lIGJpdCAqLwotCQlyeF93b3JkICY9ICgxIDw8IEVORFBPSU5UMSk7Ci0JfQotCi0JaWYgKCFyeF93b3JkKSB7Ci0JCWF0aDZrbF9lcnIoImJtaV9yZWN2X2J1ZiBGSUZPIGVtcHR5XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdGg2a2xfYm1pX3NlbmRfYnVmKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqYnVmLCB1MzIgbGVuKQotewotCWludCByZXQ7Ci0JdTMyIGFkZHI7Ci0KLQlyZXQgPSBhdGg2a2xfZ2V0X2JtaV9jbWRfY3JlZGl0cyhhcik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWFkZHIgPSBhci0+bWJveF9pbmZvLmh0Y19hZGRyOwotCi0JcmV0ID0gaGlmX3JlYWRfd3JpdGVfc3luYyhhciwgYWRkciwgYnVmLCBsZW4sCi0JCQkJICBISUZfV1JfU1lOQ19CWVRFX0lOQyk7Ci0JaWYgKHJldCkKLQkJYXRoNmtsX2VycigidW5hYmxlIHRvIHNlbmQgdGhlIGJtaSBkYXRhIHRvIHRoZSBkZXZpY2VcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBhdGg2a2xfYm1pX3JlY3ZfYnVmKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqYnVmLCB1MzIgbGVuKQotewotCWludCByZXQ7Ci0JdTMyIGFkZHI7Ci0KLQkvKgotCSAqIER1cmluZyBub3JtYWwgYm9vdHVwLCBzbWFsbCByZWFkcyBtYXkgYmUgcmVxdWlyZWQuCi0JICogUmF0aGVyIHRoYW4gaXNzdWUgYW4gSElGIFJlYWQgYW5kIHRoZW4gd2FpdCBhcyB0aGUgVGFyZ2V0Ci0JICogYWRkcyBzdWNjZXNzaXZlIGJ5dGVzIHRvIHRoZSBGSUZPLCB3ZSB3YWl0IGhlcmUgdW50aWwKLQkgKiB3ZSBrbm93IHRoYXQgcmVzcG9uc2UgZGF0YSBpcyBhdmFpbGFibGUuCi0JICoKLQkgKiBUaGlzIGFsbG93cyB1cyB0byBjbGVhbmx5IHRpbWVvdXQgb24gYW4gdW5leHBlY3RlZAotCSAqIFRhcmdldCBmYWlsdXJlIHJhdGhlciB0aGFuIHJpc2sgcHJvYmxlbXMgYXQgdGhlIEhJRiBsZXZlbC4KLQkgKiBJbiBwYXJ0aWN1bGFyLCB0aGlzIGF2b2lkcyBTRElPIHRpbWVvdXRzIGFuZCBwb3NzaWJseSBnYXJiYWdlCi0JICogZGF0YSBvbiBzb21lIGhvc3QgY29udHJvbGxlcnMuICBBbmQgb24gYW4gaW50ZXJjb25uZWN0Ci0JICogc3VjaCBhcyBDb21wYWN0IEZsYXNoIChhcyB3ZWxsIGFzIHNvbWUgU0RJTyBtYXN0ZXJzKSB3aGljaAotCSAqIGRvZXMgbm90IHByb3ZpZGUgYW55IGluZGljYXRpb24gb24gZGF0YSB0aW1lb3V0LCBpdCBhdm9pZHMKLQkgKiBhIHBvdGVudGlhbCBoYW5nIG9yIGdhcmJhZ2UgcmVzcG9uc2UuCi0JICoKLQkgKiBTeW5jaHJvbml6YXRpb24gaXMgbW9yZSBkaWZmaWN1bHQgZm9yIHJlYWRzIGxhcmdlciB0aGFuIHRoZQotCSAqIHNpemUgb2YgdGhlIE1CT1ggRklGTyAoMTI4QiksIGJlY2F1c2UgdGhlIFRhcmdldCBpcyB1bmFibGUKLQkgKiB0byBwdXNoIHRoZSAxMjl0aCBieXRlIG9mIGRhdGEgdW50aWwgQUZURVIgdGhlIEhvc3QgcG9zdHMgYW4KLQkgKiBISUYgUmVhZCBhbmQgcmVtb3ZlcyBzb21lIEZJRk8gZGF0YS4gIFNvIGZvciBsYXJnZSByZWFkcyB0aGUKLQkgKiBIb3N0IHByb2NlZWRzIHRvIHBvc3QgYW4gSElGIFJlYWQgQkVGT1JFIGFsbCB0aGUgZGF0YSBpcwotCSAqIGFjdHVhbGx5IGF2YWlsYWJsZSB0byByZWFkLiAgRm9ydHVuYXRlbHksIGxhcmdlIEJNSSByZWFkcyBkbwotCSAqIG5vdCBvY2N1ciBpbiBwcmFjdGljZSAtLSB0aGV5J3JlIHN1cHBvcnRlZCBmb3IgZGVidWcvZGV2ZWxvcG1lbnQuCi0JICoKLQkgKiBTbyBIb3N0L1RhcmdldCBCTUkgc3luY2hyb25pemF0aW9uIGlzIGRpdmlkZWQgaW50byB0aGVzZSBjYXNlczoKLQkgKiAgQ0FTRSAxOiBsZW5ndGggPCA0Ci0JICogICAgICAgIFNob3VsZCBub3QgaGFwcGVuCi0JICoKLQkgKiAgQ0FTRSAyOiA0IDw9IGxlbmd0aCA8PSAxMjgKLQkgKiAgICAgICAgV2FpdCBmb3IgZmlyc3QgNCBieXRlcyB0byBiZSBpbiBGSUZPCi0JICogICAgICAgIElmIENPTlNFUlZBVElWRV9CTUlfUkVBRCBpcyBlbmFibGVkLCBhbHNvIHdhaXQgZm9yCi0JICogICAgICAgIGEgQk1JIGNvbW1hbmQgY3JlZGl0LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgRU5USVJFCi0JICogICAgICAgIHJlc3BvbnNlIGlzIGF2YWlsYWJsZSBpbiB0aGUgdGhlIEZJRk8KLQkgKgotCSAqICBDQVNFIDM6IGxlbmd0aCA+IDEyOAotCSAqICAgICAgICBXYWl0IGZvciB0aGUgZmlyc3QgNCBieXRlcyB0byBiZSBpbiBGSUZPCi0JICoKLQkgKiBGb3IgbW9zdCB1c2VzLCBhIHNtYWxsIHRpbWVvdXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgYW5kIHdlIHdpbGwKLQkgKiB1c3VhbGx5IHNlZSBhIHJlc3BvbnNlIHF1aWNrbHk7IGJ1dCB0aGVyZSBtYXkgYmUgc29tZSB1bnVzdWFsCi0JICogKGRlYnVnKSBjYXNlcyBvZiBCTUlfRVhFQ1VURSB3aGVyZSB3ZSB3YW50IGFuIGxhcmdlciB0aW1lb3V0LgotCSAqIEZvciBub3csIHdlIHVzZSBhbiB1bmJvdW5kZWQgYnVzeSBsb29wIHdoaWxlIHdhaXRpbmcgZm9yCi0JICogQk1JX0VYRUNVVEUuCi0JICoKLQkgKiBJZiBCTUlfRVhFQ1VURSBldmVyIG5lZWRzIHRvIHN1cHBvcnQgbG9uZ2VyLWxhdGVuY3kgZXhlY3V0aW9uLAotCSAqIGVzcGVjaWFsbHkgaW4gcHJvZHVjdGlvbiwgdGhpcyBjb2RlIG5lZWRzIHRvIGJlIGVuaGFuY2VkIHRvIHNsZWVwCi0JICogYW5kIHlpZWxkLiAgQWxzbyBub3RlIHRoYXQgQk1JX0NPTU1VTklDQVRJT05fVElNRU9VVCBpcyBjdXJyZW50bHkKLQkgKiBhIGZ1bmN0aW9uIG9mIEhvc3QgcHJvY2Vzc29yIHNwZWVkLgotCSAqLwotCWlmIChsZW4gPj0gNCkgeyAvKiBOQjogQ3VycmVudGx5LCBhbHdheXMgdHJ1ZSAqLwotCQlyZXQgPSBhdGg2a2xfYm1pX2dldF9yeF9sa2FoZChhcik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCWFkZHIgPSBhci0+bWJveF9pbmZvLmh0Y19hZGRyOwotCXJldCA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoYXIsIGFkZHIsIGJ1ZiwgbGVuLAotCQkJCSAgSElGX1JEX1NZTkNfQllURV9JTkMpOwotCWlmIChyZXQpIHsKLQkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHJlYWQgdGhlIGJtaSBkYXRhIGZyb20gdGhlIGRldmljZTogJWRcbiIsCi0JCQkgICByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCiBpbnQgYXRoNmtsX2JtaV9kb25lKHN0cnVjdCBhdGg2a2wgKmFyKQogewogCWludCByZXQ7CkBAIC0xOTAsMTQgKzMxLDEyIEBACiAKIAlhci0+Ym1pLmRvbmVfc2VudCA9IHRydWU7CiAKLQlyZXQgPSBhdGg2a2xfYm1pX3NlbmRfYnVmKGFyLCAodTggKikmY2lkLCBzaXplb2YoY2lkKSk7CisJcmV0ID0gYXRoNmtsX2hpZl9ibWlfd3JpdGUoYXIsICh1OCAqKSZjaWQsIHNpemVvZihjaWQpKTsKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byBzZW5kIGJtaSBkb25lOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlhdGg2a2xfYm1pX2NsZWFudXAoYXIpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTIxMiwxMyArNTEsMTMgQEAKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCi0JcmV0ID0gYXRoNmtsX2JtaV9zZW5kX2J1ZihhciwgKHU4ICopJmNpZCwgc2l6ZW9mKGNpZCkpOworCXJldCA9IGF0aDZrbF9oaWZfYm1pX3dyaXRlKGFyLCAodTggKikmY2lkLCBzaXplb2YoY2lkKSk7CiAJaWYgKHJldCkgewogCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gc2VuZCBnZXQgdGFyZ2V0IGluZm86ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIAotCXJldCA9IGF0aDZrbF9ibWlfcmVjdl9idWYoYXIsICh1OCAqKSZ0YXJnX2luZm8tPnZlcnNpb24sCisJcmV0ID0gYXRoNmtsX2hpZl9ibWlfcmVhZChhciwgKHU4ICopJnRhcmdfaW5mby0+dmVyc2lvbiwKIAkJCQkgIHNpemVvZih0YXJnX2luZm8tPnZlcnNpb24pKTsKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byByZWN2IHRhcmdldCBpbmZvOiAlZFxuIiwgcmV0KTsKQEAgLTIyNyw3ICs2Niw3IEBACiAKIAlpZiAobGUzMl90b19jcHUodGFyZ19pbmZvLT52ZXJzaW9uKSA9PSBUQVJHRVRfVkVSU0lPTl9TRU5USU5BTCkgewogCQkvKiBEZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgYXJlIGluIHRoZSBUYXJnZXQncyB0YXJnX2luZm8gKi8KLQkJcmV0ID0gYXRoNmtsX2JtaV9yZWN2X2J1ZihhciwKKwkJcmV0ID0gYXRoNmtsX2hpZl9ibWlfcmVhZChhciwKIAkJCQkgICAodTggKikmdGFyZ19pbmZvLT5ieXRlX2NvdW50LAogCQkJCSAgIHNpemVvZih0YXJnX2luZm8tPmJ5dGVfY291bnQpKTsKIAkJaWYgKHJldCkgewpAQCAtMjQ2LDcgKzg1LDcgQEAKIAkJfQogCiAJCS8qIFJlYWQgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGFyZ19pbmZvICovCi0JCXJldCA9IGF0aDZrbF9ibWlfcmVjdl9idWYoYXIsCisJCXJldCA9IGF0aDZrbF9oaWZfYm1pX3JlYWQoYXIsCiAJCQkJICAgKCh1OCAqKXRhcmdfaW5mbykgKwogCQkJCSAgIHNpemVvZih0YXJnX2luZm8tPmJ5dGVfY291bnQpLAogCQkJCSAgIHNpemVvZigqdGFyZ19pbmZvKSAtCkBAIC0yNzgsOCArMTE3LDggQEAKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCi0Jc2l6ZSA9IEJNSV9EQVRBU1pfTUFYICsgc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcikgKyBzaXplb2YobGVuKTsKLQlpZiAoc2l6ZSA+IE1BWF9CTUlfQ01EQlVGX1NaKSB7CisJc2l6ZSA9IGFyLT5ibWkubWF4X2RhdGFfc2l6ZSArIHNpemVvZihjaWQpICsgc2l6ZW9mKGFkZHIpICsgc2l6ZW9mKGxlbik7CisJaWYgKHNpemUgPiBhci0+Ym1pLm1heF9jbWRfc2l6ZSkgewogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0yOTIsOCArMTMxLDggQEAKIAlsZW5fcmVtYWluID0gbGVuOwogCiAJd2hpbGUgKGxlbl9yZW1haW4pIHsKLQkJcnhfbGVuID0gKGxlbl9yZW1haW4gPCBCTUlfREFUQVNaX01BWCkgPwotCQkJCQlsZW5fcmVtYWluIDogQk1JX0RBVEFTWl9NQVg7CisJCXJ4X2xlbiA9IChsZW5fcmVtYWluIDwgYXItPmJtaS5tYXhfZGF0YV9zaXplKSA/CisJCQkJCWxlbl9yZW1haW4gOiBhci0+Ym1pLm1heF9kYXRhX3NpemU7CiAJCW9mZnNldCA9IDA7CiAJCW1lbWNweSgmKGFyLT5ibWkuY21kX2J1ZltvZmZzZXRdKSwgJmNpZCwgc2l6ZW9mKGNpZCkpOwogCQlvZmZzZXQgKz0gc2l6ZW9mKGNpZCk7CkBAIC0zMDIsMTMgKzE0MSwxMyBAQAogCQltZW1jcHkoJihhci0+Ym1pLmNtZF9idWZbb2Zmc2V0XSksICZyeF9sZW4sIHNpemVvZihyeF9sZW4pKTsKIAkJb2Zmc2V0ICs9IHNpemVvZihsZW4pOwogCi0JCXJldCA9IGF0aDZrbF9ibWlfc2VuZF9idWYoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKKwkJcmV0ID0gYXRoNmtsX2hpZl9ibWlfd3JpdGUoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKIAkJaWYgKHJldCkgewogCQkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2U6ICVkXG4iLAogCQkJCSAgIHJldCk7CiAJCQlyZXR1cm4gcmV0OwogCQl9Ci0JCXJldCA9IGF0aDZrbF9ibWlfcmVjdl9idWYoYXIsIGFyLT5ibWkuY21kX2J1ZiwgcnhfbGVuKTsKKwkJcmV0ID0gYXRoNmtsX2hpZl9ibWlfcmVhZChhciwgYXItPmJtaS5jbWRfYnVmLCByeF9sZW4pOwogCQlpZiAocmV0KSB7CiAJCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gcmVhZCBmcm9tIHRoZSBkZXZpY2U6ICVkXG4iLAogCQkJCSAgIHJldCk7CkBAIC0zMjgsNyArMTY3LDcgQEAKIAl1MzIgb2Zmc2V0OwogCXUzMiBsZW5fcmVtYWluLCB0eF9sZW47CiAJY29uc3QgdTMyIGhlYWRlciA9IHNpemVvZihjaWQpICsgc2l6ZW9mKGFkZHIpICsgc2l6ZW9mKGxlbik7Ci0JdTggYWxpZ25lZF9idWZbQk1JX0RBVEFTWl9NQVhdOworCXU4IGFsaWduZWRfYnVmWzQwMF07CiAJdTggKnNyYzsKIAogCWlmIChhci0+Ym1pLmRvbmVfc2VudCkgewpAQCAtMzM2LDEyICsxNzUsMTUgQEAKIAkJcmV0dXJuIC1FQUNDRVM7CiAJfQogCi0JaWYgKChCTUlfREFUQVNaX01BWCArIGhlYWRlcikgPiBNQVhfQk1JX0NNREJVRl9TWikgeworCWlmICgoYXItPmJtaS5tYXhfZGF0YV9zaXplICsgaGVhZGVyKSA+IGFyLT5ibWkubWF4X2NtZF9zaXplKSB7CiAJCVdBUk5fT04oMSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCW1lbXNldChhci0+Ym1pLmNtZF9idWYsIDAsIEJNSV9EQVRBU1pfTUFYICsgaGVhZGVyKTsKKwlpZiAoV0FSTl9PTihhci0+Ym1pLm1heF9kYXRhX3NpemUgPiBzaXplb2YoYWxpZ25lZF9idWYpKSkKKwkJcmV0dXJuIC1FMkJJRzsKKworCW1lbXNldChhci0+Ym1pLmNtZF9idWYsIDAsIGFyLT5ibWkubWF4X2RhdGFfc2l6ZSArIGhlYWRlcik7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk1JLAogCQkgICJibWkgd3JpdGUgbWVtb3J5OiBhZGRyOiAweCV4LCBsZW46ICVkXG4iLCBhZGRyLCBsZW4pOwpAQCAtMzUwLDcgKzE5Miw3IEBACiAJd2hpbGUgKGxlbl9yZW1haW4pIHsKIAkJc3JjID0gJmJ1ZltsZW4gLSBsZW5fcmVtYWluXTsKIAotCQlpZiAobGVuX3JlbWFpbiA8IChCTUlfREFUQVNaX01BWCAtIGhlYWRlcikpIHsKKwkJaWYgKGxlbl9yZW1haW4gPCAoYXItPmJtaS5tYXhfZGF0YV9zaXplIC0gaGVhZGVyKSkgewogCQkJaWYgKGxlbl9yZW1haW4gJiAzKSB7CiAJCQkJLyogYWxpZ24gaXQgd2l0aCA0IGJ5dGVzICovCiAJCQkJbGVuX3JlbWFpbiA9IGxlbl9yZW1haW4gKwpAQCAtMzYwLDcgKzIwMiw3IEBACiAJCQl9CiAJCQl0eF9sZW4gPSBsZW5fcmVtYWluOwogCQl9IGVsc2UgewotCQkJdHhfbGVuID0gKEJNSV9EQVRBU1pfTUFYIC0gaGVhZGVyKTsKKwkJCXR4X2xlbiA9IChhci0+Ym1pLm1heF9kYXRhX3NpemUgLSBoZWFkZXIpOwogCQl9CiAKIAkJb2Zmc2V0ID0gMDsKQEAgLTM3Myw3ICsyMTUsNyBAQAogCQltZW1jcHkoJihhci0+Ym1pLmNtZF9idWZbb2Zmc2V0XSksIHNyYywgdHhfbGVuKTsKIAkJb2Zmc2V0ICs9IHR4X2xlbjsKIAotCQlyZXQgPSBhdGg2a2xfYm1pX3NlbmRfYnVmKGFyLCBhci0+Ym1pLmNtZF9idWYsIG9mZnNldCk7CisJCXJldCA9IGF0aDZrbF9oaWZfYm1pX3dyaXRlKGFyLCBhci0+Ym1pLmNtZF9idWYsIG9mZnNldCk7CiAJCWlmIChyZXQpIHsKIAkJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byB3cml0ZSB0byB0aGUgZGV2aWNlOiAlZFxuIiwKIAkJCQkgICByZXQpOwpAQCAtMzk4LDcgKzI0MCw3IEBACiAJfQogCiAJc2l6ZSA9IHNpemVvZihjaWQpICsgc2l6ZW9mKGFkZHIpICsgc2l6ZW9mKHBhcmFtKTsKLQlpZiAoc2l6ZSA+IE1BWF9CTUlfQ01EQlVGX1NaKSB7CisJaWYgKHNpemUgPiBhci0+Ym1pLm1heF9jbWRfc2l6ZSkgewogCQlXQVJOX09OKDEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00MTUsMTMgKzI1NywxMyBAQAogCW1lbWNweSgmKGFyLT5ibWkuY21kX2J1ZltvZmZzZXRdKSwgcGFyYW0sIHNpemVvZigqcGFyYW0pKTsKIAlvZmZzZXQgKz0gc2l6ZW9mKCpwYXJhbSk7CiAKLQlyZXQgPSBhdGg2a2xfYm1pX3NlbmRfYnVmKGFyLCBhci0+Ym1pLmNtZF9idWYsIG9mZnNldCk7CisJcmV0ID0gYXRoNmtsX2hpZl9ibWlfd3JpdGUoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byB3cml0ZSB0byB0aGUgZGV2aWNlOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBhdGg2a2xfYm1pX3JlY3ZfYnVmKGFyLCBhci0+Ym1pLmNtZF9idWYsIHNpemVvZigqcGFyYW0pKTsKKwlyZXQgPSBhdGg2a2xfaGlmX2JtaV9yZWFkKGFyLCBhci0+Ym1pLmNtZF9idWYsIHNpemVvZigqcGFyYW0pKTsKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byByZWFkIGZyb20gdGhlIGRldmljZTogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC00NDUsNyArMjg3LDcgQEAKIAl9CiAKIAlzaXplID0gc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcik7Ci0JaWYgKHNpemUgPiBNQVhfQk1JX0NNREJVRl9TWikgeworCWlmIChzaXplID4gYXItPmJtaS5tYXhfY21kX3NpemUpIHsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDU5LDcgKzMwMSw3IEBACiAJbWVtY3B5KCYoYXItPmJtaS5jbWRfYnVmW29mZnNldF0pLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKIAlvZmZzZXQgKz0gc2l6ZW9mKGFkZHIpOwogCi0JcmV0ID0gYXRoNmtsX2JtaV9zZW5kX2J1ZihhciwgYXItPmJtaS5jbWRfYnVmLCBvZmZzZXQpOworCXJldCA9IGF0aDZrbF9oaWZfYm1pX3dyaXRlKGFyLCBhci0+Ym1pLmNtZF9idWYsIG9mZnNldCk7CiAJaWYgKHJldCkgewogCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gd3JpdGUgdG8gdGhlIGRldmljZTogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC00ODEsNyArMzIzLDcgQEAKIAl9CiAKIAlzaXplID0gc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcik7Ci0JaWYgKHNpemUgPiBNQVhfQk1JX0NNREJVRl9TWikgeworCWlmIChzaXplID4gYXItPmJtaS5tYXhfY21kX3NpemUpIHsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNDk1LDEzICszMzcsMTMgQEAKIAltZW1jcHkoJihhci0+Ym1pLmNtZF9idWZbb2Zmc2V0XSksICZhZGRyLCBzaXplb2YoYWRkcikpOwogCW9mZnNldCArPSBzaXplb2YoYWRkcik7CiAKLQlyZXQgPSBhdGg2a2xfYm1pX3NlbmRfYnVmKGFyLCBhci0+Ym1pLmNtZF9idWYsIG9mZnNldCk7CisJcmV0ID0gYXRoNmtsX2hpZl9ibWlfd3JpdGUoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byB3cml0ZSB0byB0aGUgZGV2aWNlOiAlZFxuIiwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlyZXQgPSBhdGg2a2xfYm1pX3JlY3ZfYnVmKGFyLCBhci0+Ym1pLmNtZF9idWYsIHNpemVvZigqcGFyYW0pKTsKKwlyZXQgPSBhdGg2a2xfaGlmX2JtaV9yZWFkKGFyLCBhci0+Ym1pLmNtZF9idWYsIHNpemVvZigqcGFyYW0pKTsKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF9lcnIoIlVuYWJsZSB0byByZWFkIGZyb20gdGhlIGRldmljZTogJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CkBAIC01MjQsNyArMzY2LDcgQEAKIAl9CiAKIAlzaXplID0gc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcikgKyBzaXplb2YocGFyYW0pOwotCWlmIChzaXplID4gTUFYX0JNSV9DTURCVUZfU1opIHsKKwlpZiAoc2l6ZSA+IGFyLT5ibWkubWF4X2NtZF9zaXplKSB7CiAJCVdBUk5fT04oMSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTU0Miw3ICszODQsNyBAQAogCW1lbWNweSgmKGFyLT5ibWkuY21kX2J1ZltvZmZzZXRdKSwgJnBhcmFtLCBzaXplb2YocGFyYW0pKTsKIAlvZmZzZXQgKz0gc2l6ZW9mKHBhcmFtKTsKIAotCXJldCA9IGF0aDZrbF9ibWlfc2VuZF9idWYoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKKwlyZXQgPSBhdGg2a2xfaGlmX2JtaV93cml0ZShhciwgYXItPmJtaS5jbWRfYnVmLCBvZmZzZXQpOwogCWlmIChyZXQpIHsKIAkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2U6ICVkXG4iLCByZXQpOwogCQlyZXR1cm4gcmV0OwpAQCAtNTY1LDggKzQwNyw4IEBACiAJCXJldHVybiAtRUFDQ0VTOwogCX0KIAotCXNpemUgPSBCTUlfREFUQVNaX01BWCArIGhlYWRlcjsKLQlpZiAoc2l6ZSA+IE1BWF9CTUlfQ01EQlVGX1NaKSB7CisJc2l6ZSA9IGFyLT5ibWkubWF4X2RhdGFfc2l6ZSArIGhlYWRlcjsKKwlpZiAoc2l6ZSA+IGFyLT5ibWkubWF4X2NtZF9zaXplKSB7CiAJCVdBUk5fT04oMSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTU3Nyw4ICs0MTksOCBAQAogCiAJbGVuX3JlbWFpbiA9IGxlbjsKIAl3aGlsZSAobGVuX3JlbWFpbikgewotCQl0eF9sZW4gPSAobGVuX3JlbWFpbiA8IChCTUlfREFUQVNaX01BWCAtIGhlYWRlcikpID8KLQkJCSAgbGVuX3JlbWFpbiA6IChCTUlfREFUQVNaX01BWCAtIGhlYWRlcik7CisJCXR4X2xlbiA9IChsZW5fcmVtYWluIDwgKGFyLT5ibWkubWF4X2RhdGFfc2l6ZSAtIGhlYWRlcikpID8KKwkJCSAgbGVuX3JlbWFpbiA6IChhci0+Ym1pLm1heF9kYXRhX3NpemUgLSBoZWFkZXIpOwogCiAJCW9mZnNldCA9IDA7CiAJCW1lbWNweSgmKGFyLT5ibWkuY21kX2J1ZltvZmZzZXRdKSwgJmNpZCwgc2l6ZW9mKGNpZCkpOwpAQCAtNTg5LDcgKzQzMSw3IEBACiAJCQl0eF9sZW4pOwogCQlvZmZzZXQgKz0gdHhfbGVuOwogCi0JCXJldCA9IGF0aDZrbF9ibWlfc2VuZF9idWYoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKKwkJcmV0ID0gYXRoNmtsX2hpZl9ibWlfd3JpdGUoYXIsIGFyLT5ibWkuY21kX2J1Ziwgb2Zmc2V0KTsKIAkJaWYgKHJldCkgewogCQkJYXRoNmtsX2VycigiVW5hYmxlIHRvIHdyaXRlIHRvIHRoZSBkZXZpY2U6ICVkXG4iLAogCQkJCSAgIHJldCk7CkBAIC02MTUsNyArNDU3LDcgQEAKIAl9CiAKIAlzaXplID0gc2l6ZW9mKGNpZCkgKyBzaXplb2YoYWRkcik7Ci0JaWYgKHNpemUgPiBNQVhfQk1JX0NNREJVRl9TWikgeworCWlmIChzaXplID4gYXItPmJtaS5tYXhfY21kX3NpemUpIHsKIAkJV0FSTl9PTigxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtNjMxLDcgKzQ3Myw3IEBACiAJbWVtY3B5KCYoYXItPmJtaS5jbWRfYnVmW29mZnNldF0pLCAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKIAlvZmZzZXQgKz0gc2l6ZW9mKGFkZHIpOwogCi0JcmV0ID0gYXRoNmtsX2JtaV9zZW5kX2J1ZihhciwgYXItPmJtaS5jbWRfYnVmLCBvZmZzZXQpOworCXJldCA9IGF0aDZrbF9oaWZfYm1pX3dyaXRlKGFyLCBhci0+Ym1pLmNtZF9idWYsIG9mZnNldCk7CiAJaWYgKHJldCkgewogCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gc3RhcnQgTFogc3RyZWFtIHRvIHRoZSBkZXZpY2U6ICVkXG4iLAogCQkJICAgcmV0KTsKQEAgLTY3MiwxMCArNTE0LDIwIEBACiAJcmV0dXJuIHJldDsKIH0KIAordm9pZCBhdGg2a2xfYm1pX3Jlc2V0KHN0cnVjdCBhdGg2a2wgKmFyKQoreworCWFyLT5ibWkuZG9uZV9zZW50ID0gZmFsc2U7Cit9CisKIGludCBhdGg2a2xfYm1pX2luaXQoc3RydWN0IGF0aDZrbCAqYXIpCiB7Ci0JYXItPmJtaS5jbWRfYnVmID0ga3phbGxvYyhNQVhfQk1JX0NNREJVRl9TWiwgR0ZQX0FUT01JQyk7CisJaWYgKFdBUk5fT04oYXItPmJtaS5tYXhfZGF0YV9zaXplID09IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKIAorCS8qIGNtZCArIGFkZHIgKyBsZW4gKyBkYXRhX3NpemUgKi8KKwlhci0+Ym1pLm1heF9jbWRfc2l6ZSA9IGFyLT5ibWkubWF4X2RhdGFfc2l6ZSArIChzaXplb2YodTMyKSAqIDMpOworCisJYXItPmJtaS5jbWRfYnVmID0ga3phbGxvYyhhci0+Ym1pLm1heF9jbWRfc2l6ZSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFhci0+Ym1pLmNtZF9idWYpCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2JtaS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9ibWkuaAppbmRleCA5Njg1MWQ1Li5mMWNhNjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2JtaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvYm1pLmgKQEAgLTQ0LDEyICs0NCw2IEBACiAgKiBCTUkgaGFuZGxlcyBhbGwgcmVxdWlyZWQgVGFyZ2V0LXNpZGUgY2FjaGUgZmx1c2hpbmcuCiAgKi8KIAotI2RlZmluZSBNQVhfQk1JX0NNREJVRl9TWiAoQk1JX0RBVEFTWl9NQVggKyBcCi0JCQkgICAoc2l6ZW9mKHUzMikgKiAzIC8qIGNtZCArIGFkZHIgKyBsZW4gKi8pKQotCi0vKiBNYXhpbXVtIGRhdGEgc2l6ZSB1c2VkIGZvciBCTUkgdHJhbnNmZXJzICovCi0jZGVmaW5lIEJNSV9EQVRBU1pfTUFYICAgICAgICAgICAgICAgICAgICAgIDI1NgotCiAvKiBCTUkgQ29tbWFuZHMgKi8KIAogI2RlZmluZSBCTUlfTk9fQ09NTUFORCAgICAgICAgICAgICAgICAgICAgICAwCkBAIC0yMzAsNiArMjI0LDggQEAKIAogaW50IGF0aDZrbF9ibWlfaW5pdChzdHJ1Y3QgYXRoNmtsICphcik7CiB2b2lkIGF0aDZrbF9ibWlfY2xlYW51cChzdHJ1Y3QgYXRoNmtsICphcik7Cit2b2lkIGF0aDZrbF9ibWlfcmVzZXQoc3RydWN0IGF0aDZrbCAqYXIpOworCiBpbnQgYXRoNmtsX2JtaV9kb25lKHN0cnVjdCBhdGg2a2wgKmFyKTsKIGludCBhdGg2a2xfYm1pX2dldF90YXJnZXRfaW5mbyhzdHJ1Y3QgYXRoNmtsICphciwKIAkJCSAgICAgICBzdHJ1Y3QgYXRoNmtsX2JtaV90YXJnZXRfaW5mbyAqdGFyZ19pbmZvKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuYwppbmRleCBmNTE3ZWI4Li42YzU5YTIxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5jCkBAIC0xMjMsMTcgKzEyMyw1MCBAQAogCS5iaXRyYXRlcyA9IGF0aDZrbF9hX3JhdGVzLAogfTsKIAotc3RhdGljIGludCBhdGg2a2xfc2V0X3dwYV92ZXJzaW9uKHN0cnVjdCBhdGg2a2wgKmFyLAorI2RlZmluZSBDQ0tNX0tSS19DSVBIRVJfU1VJVEUgMHgwMDQwOTZmZiAvKiB1c2UgZm9yIEtSSyAqLworCisvKiByZXR1cm5zIHRydWUgaWYgc2NoZWR1bGVkIHNjYW4gd2FzIHN0b3BwZWQgKi8KK3N0YXRpYyBib29sIF9fYXRoNmtsX2NmZzgwMjExX3NzY2FuX3N0b3Aoc3RydWN0IGF0aDZrbF92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CisKKwlpZiAoYXItPnN0YXRlICE9IEFUSDZLTF9TVEFURV9TQ0hFRF9TQ0FOKQorCQlyZXR1cm4gZmFsc2U7CisKKwlkZWxfdGltZXJfc3luYygmdmlmLT5zY2hlZF9zY2FuX3RpbWVyKTsKKworCWF0aDZrbF93bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgICBBVEg2S0xfSE9TVF9NT0RFX0FXQUtFKTsKKworCWFyLT5zdGF0ZSA9IEFUSDZLTF9TVEFURV9PTjsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBhdGg2a2xfY2ZnODAyMTFfc3NjYW5fZGlzYWJsZShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKKwlib29sIHN0b3BwZWQ7CisKKwlzdG9wcGVkID0gX19hdGg2a2xfY2ZnODAyMTFfc3NjYW5fc3RvcCh2aWYpOworCisJaWYgKCFzdG9wcGVkKQorCQlyZXR1cm47CisKKwljZmc4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWQoYXItPndpcGh5KTsKK30KKworc3RhdGljIGludCBhdGg2a2xfc2V0X3dwYV92ZXJzaW9uKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsCiAJCQkJICBlbnVtIG5sODAyMTFfd3BhX3ZlcnNpb25zIHdwYV92ZXJzaW9uKQogewogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiAldVxuIiwgX19mdW5jX18sIHdwYV92ZXJzaW9uKTsKIAogCWlmICghd3BhX3ZlcnNpb24pIHsKLQkJYXItPmF1dGhfbW9kZSA9IE5PTkVfQVVUSDsKKwkJdmlmLT5hdXRoX21vZGUgPSBOT05FX0FVVEg7CiAJfSBlbHNlIGlmICh3cGFfdmVyc2lvbiAmIE5MODAyMTFfV1BBX1ZFUlNJT05fMikgewotCQlhci0+YXV0aF9tb2RlID0gV1BBMl9BVVRIOworCQl2aWYtPmF1dGhfbW9kZSA9IFdQQTJfQVVUSDsKIAl9IGVsc2UgaWYgKHdwYV92ZXJzaW9uICYgTkw4MDIxMV9XUEFfVkVSU0lPTl8xKSB7Ci0JCWFyLT5hdXRoX21vZGUgPSBXUEFfQVVUSDsKKwkJdmlmLT5hdXRoX21vZGUgPSBXUEFfQVVUSDsKIAl9IGVsc2UgewogCQlhdGg2a2xfZXJyKCIlczogJXUgbm90IHN1cHBvcnRlZFxuIiwgX19mdW5jX18sIHdwYV92ZXJzaW9uKTsKIAkJcmV0dXJuIC1FTk9UU1VQUDsKQEAgLTE0MiwyNSArMTc1LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3NldF9hdXRoX3R5cGUoc3RydWN0IGF0aDZrbCAqYXIsCitzdGF0aWMgaW50IGF0aDZrbF9zZXRfYXV0aF90eXBlKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsCiAJCQkJZW51bSBubDgwMjExX2F1dGhfdHlwZSBhdXRoX3R5cGUpCiB7Ci0KIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogMHgleFxuIiwgX19mdW5jX18sIGF1dGhfdHlwZSk7CiAKIAlzd2l0Y2ggKGF1dGhfdHlwZSkgewogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTToKLQkJYXItPmRvdDExX2F1dGhfbW9kZSA9IE9QRU5fQVVUSDsKKwkJdmlmLT5kb3QxMV9hdXRoX21vZGUgPSBPUEVOX0FVVEg7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9TSEFSRURfS0VZOgotCQlhci0+ZG90MTFfYXV0aF9tb2RlID0gU0hBUkVEX0FVVEg7CisJCXZpZi0+ZG90MTFfYXV0aF9tb2RlID0gU0hBUkVEX0FVVEg7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9BVVRIVFlQRV9ORVRXT1JLX0VBUDoKLQkJYXItPmRvdDExX2F1dGhfbW9kZSA9IExFQVBfQVVUSDsKKwkJdmlmLT5kb3QxMV9hdXRoX21vZGUgPSBMRUFQX0FVVEg7CiAJCWJyZWFrOwogCiAJY2FzZSBOTDgwMjExX0FVVEhUWVBFX0FVVE9NQVRJQzoKLQkJYXItPmRvdDExX2F1dGhfbW9kZSA9IE9QRU5fQVVUSCB8IFNIQVJFRF9BVVRIOworCQl2aWYtPmRvdDExX2F1dGhfbW9kZSA9IE9QRU5fQVVUSCB8IFNIQVJFRF9BVVRIOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC0xNzEsMTEgKzIwMywxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF9zZXRfY2lwaGVyKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgY2lwaGVyLCBib29sIHVjYXN0KQorc3RhdGljIGludCBhdGg2a2xfc2V0X2NpcGhlcihzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1MzIgY2lwaGVyLCBib29sIHVjYXN0KQogewotCXU4ICphcl9jaXBoZXIgPSB1Y2FzdCA/ICZhci0+cHJ3aXNlX2NyeXB0byA6ICZhci0+Z3JwX2NyeXB0bzsKLQl1OCAqYXJfY2lwaGVyX2xlbiA9IHVjYXN0ID8gJmFyLT5wcndpc2VfY3J5cHRvX2xlbiA6Ci0JCSZhci0+Z3JwX2NyeXB0b19sZW47CisJdTggKmFyX2NpcGhlciA9IHVjYXN0ID8gJnZpZi0+cHJ3aXNlX2NyeXB0byA6ICZ2aWYtPmdycF9jcnlwdG87CisJdTggKmFyX2NpcGhlcl9sZW4gPSB1Y2FzdCA/ICZ2aWYtPnByd2lzZV9jcnlwdG9fbGVuIDoKKwkJJnZpZi0+Z3JwX2NyeXB0b19sZW47CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogY2lwaGVyIDB4JXgsIHVjYXN0ICV1XG4iLAogCQkgICBfX2Z1bmNfXywgY2lwaGVyLCB1Y2FzdCk7CkBAIC0yMDIsNiArMjM0LDEwIEBACiAJCSphcl9jaXBoZXIgPSBBRVNfQ1JZUFQ7CiAJCSphcl9jaXBoZXJfbGVuID0gMDsKIAkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0OgorCQkqYXJfY2lwaGVyID0gV0FQSV9DUllQVDsKKwkJKmFyX2NpcGhlcl9sZW4gPSAwOworCQlicmVhazsKIAlkZWZhdWx0OgogCQlhdGg2a2xfZXJyKCJjaXBoZXIgMHgleCBub3Qgc3VwcG9ydGVkXG4iLCBjaXBoZXIpOwogCQlyZXR1cm4gLUVOT1RTVVBQOwpAQCAtMjEwLDI4ICsyNDYsMzUgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYXRoNmtsX3NldF9rZXlfbWdtdChzdHJ1Y3QgYXRoNmtsICphciwgdTMyIGtleV9tZ210KQorc3RhdGljIHZvaWQgYXRoNmtsX3NldF9rZXlfbWdtdChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1MzIga2V5X21nbXQpCiB7CiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IDB4JXhcbiIsIF9fZnVuY19fLCBrZXlfbWdtdCk7CiAKIAlpZiAoa2V5X21nbXQgPT0gV0xBTl9BS01fU1VJVEVfUFNLKSB7Ci0JCWlmIChhci0+YXV0aF9tb2RlID09IFdQQV9BVVRIKQotCQkJYXItPmF1dGhfbW9kZSA9IFdQQV9QU0tfQVVUSDsKLQkJZWxzZSBpZiAoYXItPmF1dGhfbW9kZSA9PSBXUEEyX0FVVEgpCi0JCQlhci0+YXV0aF9tb2RlID0gV1BBMl9QU0tfQVVUSDsKKwkJaWYgKHZpZi0+YXV0aF9tb2RlID09IFdQQV9BVVRIKQorCQkJdmlmLT5hdXRoX21vZGUgPSBXUEFfUFNLX0FVVEg7CisJCWVsc2UgaWYgKHZpZi0+YXV0aF9tb2RlID09IFdQQTJfQVVUSCkKKwkJCXZpZi0+YXV0aF9tb2RlID0gV1BBMl9QU0tfQVVUSDsKKwl9IGVsc2UgaWYgKGtleV9tZ210ID09IDB4MDA0MDk2MDApIHsKKwkJaWYgKHZpZi0+YXV0aF9tb2RlID09IFdQQV9BVVRIKQorCQkJdmlmLT5hdXRoX21vZGUgPSBXUEFfQVVUSF9DQ0tNOworCQllbHNlIGlmICh2aWYtPmF1dGhfbW9kZSA9PSBXUEEyX0FVVEgpCisJCQl2aWYtPmF1dGhfbW9kZSA9IFdQQTJfQVVUSF9DQ0tNOwogCX0gZWxzZSBpZiAoa2V5X21nbXQgIT0gV0xBTl9BS01fU1VJVEVfODAyMVgpIHsKLQkJYXItPmF1dGhfbW9kZSA9IE5PTkVfQVVUSDsKKwkJdmlmLT5hdXRoX21vZGUgPSBOT05FX0FVVEg7CiAJfQogfQogCi1zdGF0aWMgYm9vbCBhdGg2a2xfY2ZnODAyMTFfcmVhZHkoc3RydWN0IGF0aDZrbCAqYXIpCitzdGF0aWMgYm9vbCBhdGg2a2xfY2ZnODAyMTFfcmVhZHkoc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CisKIAlpZiAoIXRlc3RfYml0KFdNSV9SRUFEWSwgJmFyLT5mbGFnKSkgewogCQlhdGg2a2xfZXJyKCJ3bWkgaXMgbm90IHJlYWR5XG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCWlmICghdGVzdF9iaXQoV0xBTl9FTkFCTEVELCAmYXItPmZsYWcpKSB7CisJaWYgKCF0ZXN0X2JpdChXTEFOX0VOQUJMRUQsICZ2aWYtPmZsYWdzKSkgewogCQlhdGg2a2xfZXJyKCJ3bGFuIGRpc2FibGVkXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTIzOSwxNSArMjgyLDE0NiBAQAogCXJldHVybiB0cnVlOwogfQogCitzdGF0aWMgYm9vbCBhdGg2a2xfaXNfd3BhX2llKGNvbnN0IHU4ICpwb3MpCit7CisJcmV0dXJuIHBvc1swXSA9PSBXTEFOX0VJRF9XUEEgJiYgcG9zWzFdID49IDQgJiYKKwkJcG9zWzJdID09IDB4MDAgJiYgcG9zWzNdID09IDB4NTAgJiYKKwkJcG9zWzRdID09IDB4ZjIgJiYgcG9zWzVdID09IDB4MDE7Cit9CisKK3N0YXRpYyBib29sIGF0aDZrbF9pc19yc25faWUoY29uc3QgdTggKnBvcykKK3sKKwlyZXR1cm4gcG9zWzBdID09IFdMQU5fRUlEX1JTTjsKK30KKworc3RhdGljIGJvb2wgYXRoNmtsX2lzX3dwc19pZShjb25zdCB1OCAqcG9zKQoreworCXJldHVybiAocG9zWzBdID09IFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQyAmJgorCQlwb3NbMV0gPj0gNCAmJgorCQlwb3NbMl0gPT0gMHgwMCAmJiBwb3NbM10gPT0gMHg1MCAmJiBwb3NbNF0gPT0gMHhmMiAmJgorCQlwb3NbNV0gPT0gMHgwNCk7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3NldF9hc3NvY19yZXFfaWVzKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIGNvbnN0IHU4ICppZXMsCisJCQkJICAgIHNpemVfdCBpZXNfbGVuKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKKwljb25zdCB1OCAqcG9zOworCXU4ICpidWYgPSBOVUxMOworCXNpemVfdCBsZW4gPSAwOworCWludCByZXQ7CisKKwkvKgorCSAqIENsZWFyIHByZXZpb3VzbHkgc2V0IGZsYWcKKwkgKi8KKworCWFyLT5jb25uZWN0X2N0cmxfZmxhZ3MgJj0gfkNPTk5FQ1RfV1BTX0ZMQUc7CisKKwkvKgorCSAqIEZpbHRlciBvdXQgUlNOL1dQQSBJRShzKQorCSAqLworCisJaWYgKGllcyAmJiBpZXNfbGVuKSB7CisJCWJ1ZiA9IGttYWxsb2MoaWVzX2xlbiwgR0ZQX0tFUk5FTCk7CisJCWlmIChidWYgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQlwb3MgPSBpZXM7CisKKwkJd2hpbGUgKHBvcyArIDEgPCBpZXMgKyBpZXNfbGVuKSB7CisJCQlpZiAocG9zICsgMiArIHBvc1sxXSA+IGllcyArIGllc19sZW4pCisJCQkJYnJlYWs7CisJCQlpZiAoIShhdGg2a2xfaXNfd3BhX2llKHBvcykgfHwgYXRoNmtsX2lzX3Jzbl9pZShwb3MpKSkgeworCQkJCW1lbWNweShidWYgKyBsZW4sIHBvcywgMiArIHBvc1sxXSk7CisJCQkJbGVuICs9IDIgKyBwb3NbMV07CisJCQl9CisKKwkJCWlmIChhdGg2a2xfaXNfd3BzX2llKHBvcykpCisJCQkJYXItPmNvbm5lY3RfY3RybF9mbGFncyB8PSBDT05ORUNUX1dQU19GTEFHOworCisJCQlwb3MgKz0gMiArIHBvc1sxXTsKKwkJfQorCX0KKworCXJldCA9IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJICAgICAgIFdNSV9GUkFNRV9BU1NPQ19SRVEsIGJ1ZiwgbGVuKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX25saWZ0eXBlX3RvX2Rydl9pZnR5cGUoZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLCB1OCAqbndfdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCSpud190eXBlID0gSU5GUkFfTkVUV09SSzsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJKm53X3R5cGUgPSBBREhPQ19ORVRXT1JLOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCQkqbndfdHlwZSA9IEFQX05FVFdPUks7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKKwkJKm53X3R5cGUgPSBJTkZSQV9ORVRXT1JLOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKKwkJKm53X3R5cGUgPSBBUF9ORVRXT1JLOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhdGg2a2xfZXJyKCJpbnZhbGlkIGludGVyZmFjZSB0eXBlICV1XG4iLCB0eXBlKTsKKwkJcmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgYXRoNmtsX2lzX3ZhbGlkX2lmdHlwZShzdHJ1Y3QgYXRoNmtsICphciwgZW51bSBubDgwMjExX2lmdHlwZSB0eXBlLAorCQkJCSAgIHU4ICppZl9pZHgsIHU4ICpud190eXBlKQoreworCWludCBpOworCisJaWYgKGF0aDZrbF9ubGlmdHlwZV90b19kcnZfaWZ0eXBlKHR5cGUsIG53X3R5cGUpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoYXItPmlic3NfaWZfYWN0aXZlIHx8ICgodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgJiYKKwkgICAgYXItPm51bV92aWYpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8CisJICAgIHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwgdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCQlmb3IgKGkgPSAwOyBpIDwgYXItPnZpZl9tYXg7IGkrKykgeworCQkJaWYgKChhci0+YXZhaWxfaWR4X21hcCA+PiBpKSAmIEJJVCgwKSkgeworCQkJCSppZl9pZHggPSBpOworCQkJCXJldHVybiB0cnVlOworCQkJfQorCQl9CisJfQorCisJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCB8fAorCSAgICB0eXBlID09IE5MODAyMTFfSUZUWVBFX1AyUF9HTykgeworCQlmb3IgKGkgPSBhci0+bWF4X25vcm1faWZhY2U7IGkgPCBhci0+dmlmX21heDsgaSsrKSB7CisJCQlpZiAoKGFyLT5hdmFpbF9pZHhfbWFwID4+IGkpICYgQklUKDApKSB7CisJCQkJKmlmX2lkeCA9IGk7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKIHN0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2Nvbm5lY3Qoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkgICBzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgKnNtZSkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHN0YXR1czsKKwl1OCBud19zdWJ0eXBlID0gKGFyLT5wMnApID8gU1VCVFlQRV9QMlBERVYgOiBTVUJUWVBFX05PTkU7CiAKLQlhci0+c21lX3N0YXRlID0gU01FX0NPTk5FQ1RJTkc7CisJYXRoNmtsX2NmZzgwMjExX3NzY2FuX2Rpc2FibGUodmlmKTsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwl2aWYtPnNtZV9zdGF0ZSA9IFNNRV9DT05ORUNUSU5HOworCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAodGVzdF9iaXQoREVTVFJPWV9JTl9QUk9HUkVTUywgJmFyLT5mbGFnKSkgewpAQCAtMjg3LDEyICs0NjEsMjIgQEAKIAkJfQogCX0KIAotCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykgJiYKLQkgICAgYXItPnNzaWRfbGVuID09IHNtZS0+c3NpZF9sZW4gJiYKLQkgICAgIW1lbWNtcChhci0+c3NpZCwgc21lLT5zc2lkLCBhci0+c3NpZF9sZW4pKSB7Ci0JCWFyLT5yZWNvbm5lY3RfZmxhZyA9IHRydWU7Ci0JCXN0YXR1cyA9IGF0aDZrbF93bWlfcmVjb25uZWN0X2NtZChhci0+d21pLCBhci0+cmVxX2Jzc2lkLAotCQkJCQkJICBhci0+Y2hfaGludCk7CisJaWYgKHNtZS0+aWUgJiYgKHNtZS0+aWVfbGVuID4gMCkpIHsKKwkJc3RhdHVzID0gYXRoNmtsX3NldF9hc3NvY19yZXFfaWVzKHZpZiwgc21lLT5pZSwgc21lLT5pZV9sZW4pOworCQlpZiAoc3RhdHVzKSB7CisJCQl1cCgmYXItPnNlbSk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJfSBlbHNlCisJCWFyLT5jb25uZWN0X2N0cmxfZmxhZ3MgJj0gfkNPTk5FQ1RfV1BTX0ZMQUc7CisKKwlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykgJiYKKwkgICAgdmlmLT5zc2lkX2xlbiA9PSBzbWUtPnNzaWRfbGVuICYmCisJICAgICFtZW1jbXAodmlmLT5zc2lkLCBzbWUtPnNzaWQsIHZpZi0+c3NpZF9sZW4pKSB7CisJCXZpZi0+cmVjb25uZWN0X2ZsYWcgPSB0cnVlOworCQlzdGF0dXMgPSBhdGg2a2xfd21pX3JlY29ubmVjdF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJICB2aWYtPnJlcV9ic3NpZCwKKwkJCQkJCSAgdmlmLT5jaF9oaW50KTsKIAogCQl1cCgmYXItPnNlbSk7CiAJCWlmIChzdGF0dXMpIHsKQEAgLTMwMCw0MiArNDg0LDQzIEBACiAJCQlyZXR1cm4gLUVJTzsKIAkJfQogCQlyZXR1cm4gMDsKLQl9IGVsc2UgaWYgKGFyLT5zc2lkX2xlbiA9PSBzbWUtPnNzaWRfbGVuICYmCi0JCSAgICFtZW1jbXAoYXItPnNzaWQsIHNtZS0+c3NpZCwgYXItPnNzaWRfbGVuKSkgewotCQlhdGg2a2xfZGlzY29ubmVjdChhcik7CisJfSBlbHNlIGlmICh2aWYtPnNzaWRfbGVuID09IHNtZS0+c3NpZF9sZW4gJiYKKwkJICAgIW1lbWNtcCh2aWYtPnNzaWQsIHNtZS0+c3NpZCwgdmlmLT5zc2lkX2xlbikpIHsKKwkJYXRoNmtsX2Rpc2Nvbm5lY3QodmlmKTsKIAl9CiAKLQltZW1zZXQoYXItPnNzaWQsIDAsIHNpemVvZihhci0+c3NpZCkpOwotCWFyLT5zc2lkX2xlbiA9IHNtZS0+c3NpZF9sZW47Ci0JbWVtY3B5KGFyLT5zc2lkLCBzbWUtPnNzaWQsIHNtZS0+c3NpZF9sZW4pOworCW1lbXNldCh2aWYtPnNzaWQsIDAsIHNpemVvZih2aWYtPnNzaWQpKTsKKwl2aWYtPnNzaWRfbGVuID0gc21lLT5zc2lkX2xlbjsKKwltZW1jcHkodmlmLT5zc2lkLCBzbWUtPnNzaWQsIHNtZS0+c3NpZF9sZW4pOwogCiAJaWYgKHNtZS0+Y2hhbm5lbCkKLQkJYXItPmNoX2hpbnQgPSBzbWUtPmNoYW5uZWwtPmNlbnRlcl9mcmVxOworCQl2aWYtPmNoX2hpbnQgPSBzbWUtPmNoYW5uZWwtPmNlbnRlcl9mcmVxOwogCi0JbWVtc2V0KGFyLT5yZXFfYnNzaWQsIDAsIHNpemVvZihhci0+cmVxX2Jzc2lkKSk7CisJbWVtc2V0KHZpZi0+cmVxX2Jzc2lkLCAwLCBzaXplb2YodmlmLT5yZXFfYnNzaWQpKTsKIAlpZiAoc21lLT5ic3NpZCAmJiAhaXNfYnJvYWRjYXN0X2V0aGVyX2FkZHIoc21lLT5ic3NpZCkpCi0JCW1lbWNweShhci0+cmVxX2Jzc2lkLCBzbWUtPmJzc2lkLCBzaXplb2YoYXItPnJlcV9ic3NpZCkpOworCQltZW1jcHkodmlmLT5yZXFfYnNzaWQsIHNtZS0+YnNzaWQsIHNpemVvZih2aWYtPnJlcV9ic3NpZCkpOwogCi0JYXRoNmtsX3NldF93cGFfdmVyc2lvbihhciwgc21lLT5jcnlwdG8ud3BhX3ZlcnNpb25zKTsKKwlhdGg2a2xfc2V0X3dwYV92ZXJzaW9uKHZpZiwgc21lLT5jcnlwdG8ud3BhX3ZlcnNpb25zKTsKIAotCXN0YXR1cyA9IGF0aDZrbF9zZXRfYXV0aF90eXBlKGFyLCBzbWUtPmF1dGhfdHlwZSk7CisJc3RhdHVzID0gYXRoNmtsX3NldF9hdXRoX3R5cGUodmlmLCBzbWUtPmF1dGhfdHlwZSk7CiAJaWYgKHN0YXR1cykgewogCQl1cCgmYXItPnNlbSk7CiAJCXJldHVybiBzdGF0dXM7CiAJfQogCiAJaWYgKHNtZS0+Y3J5cHRvLm5fY2lwaGVyc19wYWlyd2lzZSkKLQkJYXRoNmtsX3NldF9jaXBoZXIoYXIsIHNtZS0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0sIHRydWUpOworCQlhdGg2a2xfc2V0X2NpcGhlcih2aWYsIHNtZS0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0sIHRydWUpOwogCWVsc2UKLQkJYXRoNmtsX3NldF9jaXBoZXIoYXIsIDAsIHRydWUpOworCQlhdGg2a2xfc2V0X2NpcGhlcih2aWYsIDAsIHRydWUpOwogCi0JYXRoNmtsX3NldF9jaXBoZXIoYXIsIHNtZS0+Y3J5cHRvLmNpcGhlcl9ncm91cCwgZmFsc2UpOworCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgc21lLT5jcnlwdG8uY2lwaGVyX2dyb3VwLCBmYWxzZSk7CiAKIAlpZiAoc21lLT5jcnlwdG8ubl9ha21fc3VpdGVzKQotCQlhdGg2a2xfc2V0X2tleV9tZ210KGFyLCBzbWUtPmNyeXB0by5ha21fc3VpdGVzWzBdKTsKKwkJYXRoNmtsX3NldF9rZXlfbWdtdCh2aWYsIHNtZS0+Y3J5cHRvLmFrbV9zdWl0ZXNbMF0pOwogCiAJaWYgKChzbWUtPmtleV9sZW4pICYmCi0JICAgIChhci0+YXV0aF9tb2RlID09IE5PTkVfQVVUSCkgJiYgKGFyLT5wcndpc2VfY3J5cHRvID09IFdFUF9DUllQVCkpIHsKKwkgICAgKHZpZi0+YXV0aF9tb2RlID09IE5PTkVfQVVUSCkgJiYKKwkgICAgKHZpZi0+cHJ3aXNlX2NyeXB0byA9PSBXRVBfQ1JZUFQpKSB7CiAJCXN0cnVjdCBhdGg2a2xfa2V5ICprZXkgPSBOVUxMOwogCiAJCWlmIChzbWUtPmtleV9pZHggPCBXTUlfTUlOX0tFWV9JTkRFWCB8fApAQCAtMzQ2LDU2ICs1MzEsNjAgQEAKIAkJCXJldHVybiAtRU5PRU5UOwogCQl9CiAKLQkJa2V5ID0gJmFyLT5rZXlzW3NtZS0+a2V5X2lkeF07CisJCWtleSA9ICZ2aWYtPmtleXNbc21lLT5rZXlfaWR4XTsKIAkJa2V5LT5rZXlfbGVuID0gc21lLT5rZXlfbGVuOwogCQltZW1jcHkoa2V5LT5rZXksIHNtZS0+a2V5LCBrZXktPmtleV9sZW4pOwotCQlrZXktPmNpcGhlciA9IGFyLT5wcndpc2VfY3J5cHRvOwotCQlhci0+ZGVmX3R4a2V5X2luZGV4ID0gc21lLT5rZXlfaWR4OworCQlrZXktPmNpcGhlciA9IHZpZi0+cHJ3aXNlX2NyeXB0bzsKKwkJdmlmLT5kZWZfdHhrZXlfaW5kZXggPSBzbWUtPmtleV9pZHg7CiAKLQkJYXRoNmtsX3dtaV9hZGRrZXlfY21kKGFyLT53bWksIHNtZS0+a2V5X2lkeCwKLQkJCQkgICAgICBhci0+cHJ3aXNlX2NyeXB0bywKKwkJYXRoNmtsX3dtaV9hZGRrZXlfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgc21lLT5rZXlfaWR4LAorCQkJCSAgICAgIHZpZi0+cHJ3aXNlX2NyeXB0bywKIAkJCQkgICAgICBHUk9VUF9VU0FHRSB8IFRYX1VTQUdFLAogCQkJCSAgICAgIGtleS0+a2V5X2xlbiwKLQkJCQkgICAgICBOVUxMLAorCQkJCSAgICAgIE5VTEwsIDAsCiAJCQkJICAgICAga2V5LT5rZXksIEtFWV9PUF9JTklUX1ZBTCwgTlVMTCwKIAkJCQkgICAgICBOT19TWU5DX1dNSUZMQUcpOwogCX0KIAogCWlmICghYXItPnVzcl9ic3NfZmlsdGVyKSB7Ci0JCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmYXItPmZsYWcpOwotCQlpZiAoYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIEFMTF9CU1NfRklMVEVSLCAwKSAhPSAwKSB7CisJCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmdmlmLT5mbGFncyk7CisJCWlmIChhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkgICAgQUxMX0JTU19GSUxURVIsIDApICE9IDApIHsKIAkJCWF0aDZrbF9lcnIoImNvdWxkbid0IHNldCBic3MgZmlsdGVyaW5nXG4iKTsKIAkJCXVwKCZhci0+c2VtKTsKIAkJCXJldHVybiAtRUlPOwogCQl9CiAJfQogCi0JYXItPm53X3R5cGUgPSBhci0+bmV4dF9tb2RlOworCXZpZi0+bndfdHlwZSA9IHZpZi0+bmV4dF9tb2RlOworCisJaWYgKHZpZi0+d2Rldi5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkKKwkJbndfc3VidHlwZSA9IFNVQlRZUEVfUDJQQ0xJRU5UOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLAogCQkgICAiJXM6IGNvbm5lY3QgY2FsbGVkIHdpdGggYXV0aG1vZGUgJWQgZG90MTEgYXV0aCAlZCIKIAkJICAgIiBQVyBjcnlwdG8gJWQgUFcgY3J5cHRvIGxlbiAlZCBHUlAgY3J5cHRvICVkIgogCQkgICAiIEdSUCBjcnlwdG8gbGVuICVkIGNoYW5uZWwgaGludCAldVxuIiwKIAkJICAgX19mdW5jX18sCi0JCSAgIGFyLT5hdXRoX21vZGUsIGFyLT5kb3QxMV9hdXRoX21vZGUsIGFyLT5wcndpc2VfY3J5cHRvLAotCQkgICBhci0+cHJ3aXNlX2NyeXB0b19sZW4sIGFyLT5ncnBfY3J5cHRvLAotCQkgICBhci0+Z3JwX2NyeXB0b19sZW4sIGFyLT5jaF9oaW50KTsKKwkJICAgdmlmLT5hdXRoX21vZGUsIHZpZi0+ZG90MTFfYXV0aF9tb2RlLCB2aWYtPnByd2lzZV9jcnlwdG8sCisJCSAgIHZpZi0+cHJ3aXNlX2NyeXB0b19sZW4sIHZpZi0+Z3JwX2NyeXB0bywKKwkJICAgdmlmLT5ncnBfY3J5cHRvX2xlbiwgdmlmLT5jaF9oaW50KTsKIAotCWFyLT5yZWNvbm5lY3RfZmxhZyA9IDA7Ci0Jc3RhdHVzID0gYXRoNmtsX3dtaV9jb25uZWN0X2NtZChhci0+d21pLCBhci0+bndfdHlwZSwKLQkJCQkJYXItPmRvdDExX2F1dGhfbW9kZSwgYXItPmF1dGhfbW9kZSwKLQkJCQkJYXItPnByd2lzZV9jcnlwdG8sCi0JCQkJCWFyLT5wcndpc2VfY3J5cHRvX2xlbiwKLQkJCQkJYXItPmdycF9jcnlwdG8sIGFyLT5ncnBfY3J5cHRvX2xlbiwKLQkJCQkJYXItPnNzaWRfbGVuLCBhci0+c3NpZCwKLQkJCQkJYXItPnJlcV9ic3NpZCwgYXItPmNoX2hpbnQsCi0JCQkJCWFyLT5jb25uZWN0X2N0cmxfZmxhZ3MpOworCXZpZi0+cmVjb25uZWN0X2ZsYWcgPSAwOworCXN0YXR1cyA9IGF0aDZrbF93bWlfY29ubmVjdF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LCB2aWYtPm53X3R5cGUsCisJCQkJCXZpZi0+ZG90MTFfYXV0aF9tb2RlLCB2aWYtPmF1dGhfbW9kZSwKKwkJCQkJdmlmLT5wcndpc2VfY3J5cHRvLAorCQkJCQl2aWYtPnByd2lzZV9jcnlwdG9fbGVuLAorCQkJCQl2aWYtPmdycF9jcnlwdG8sIHZpZi0+Z3JwX2NyeXB0b19sZW4sCisJCQkJCXZpZi0+c3NpZF9sZW4sIHZpZi0+c3NpZCwKKwkJCQkJdmlmLT5yZXFfYnNzaWQsIHZpZi0+Y2hfaGludCwKKwkJCQkJYXItPmNvbm5lY3RfY3RybF9mbGFncywgbndfc3VidHlwZSk7CiAKIAl1cCgmYXItPnNlbSk7CiAKIAlpZiAoc3RhdHVzID09IC1FSU5WQUwpIHsKLQkJbWVtc2V0KGFyLT5zc2lkLCAwLCBzaXplb2YoYXItPnNzaWQpKTsKLQkJYXItPnNzaWRfbGVuID0gMDsKKwkJbWVtc2V0KHZpZi0+c3NpZCwgMCwgc2l6ZW9mKHZpZi0+c3NpZCkpOworCQl2aWYtPnNzaWRfbGVuID0gMDsKIAkJYXRoNmtsX2VycigiaW52YWxpZCByZXF1ZXN0XG4iKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfSBlbHNlIGlmIChzdGF0dXMpIHsKQEAgLTQwNCwyOCArNTkzLDQwIEBACiAJfQogCiAJaWYgKCghKGFyLT5jb25uZWN0X2N0cmxfZmxhZ3MgJiBDT05ORUNUX0RPX1dQQV9PRkZMT0FEKSkgJiYKLQkgICAgKChhci0+YXV0aF9tb2RlID09IFdQQV9QU0tfQVVUSCkKLQkgICAgIHx8IChhci0+YXV0aF9tb2RlID09IFdQQTJfUFNLX0FVVEgpKSkgewotCQltb2RfdGltZXIoJmFyLT5kaXNjb25uZWN0X3RpbWVyLAorCSAgICAoKHZpZi0+YXV0aF9tb2RlID09IFdQQV9QU0tfQVVUSCkKKwkgICAgIHx8ICh2aWYtPmF1dGhfbW9kZSA9PSBXUEEyX1BTS19BVVRIKSkpIHsKKwkJbW9kX3RpbWVyKCZ2aWYtPmRpc2Nvbm5lY3RfdGltZXIsCiAJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKERJU0NPTl9USU1FUl9JTlRWQUwpKTsKIAl9CiAKIAlhci0+Y29ubmVjdF9jdHJsX2ZsYWdzICY9IH5DT05ORUNUX0RPX1dQQV9PRkZMT0FEOwotCXNldF9iaXQoQ09OTkVDVF9QRU5ELCAmYXItPmZsYWcpOworCXNldF9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfYWRkX2Jzc19pZl9uZWVkZWQoc3RydWN0IGF0aDZrbCAqYXIsIGNvbnN0IHU4ICpic3NpZCwKK3N0YXRpYyBpbnQgYXRoNmtsX2FkZF9ic3NfaWZfbmVlZGVkKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsCisJCQkJICAgIGVudW0gbmV0d29ya190eXBlIG53X3R5cGUsCisJCQkJICAgIGNvbnN0IHU4ICpic3NpZCwKIAkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAogCQkJCSAgICBjb25zdCB1OCAqYmVhY29uX2llLCBzaXplX3QgYmVhY29uX2llX2xlbikKIHsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOworCXUxNiBjYXBfbWFzaywgY2FwX3ZhbDsKIAl1OCAqaWU7CiAKLQlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKGFyLT53ZGV2LT53aXBoeSwgY2hhbiwgYnNzaWQsCi0JCQkgICAgICAgYXItPnNzaWQsIGFyLT5zc2lkX2xlbiwgV0xBTl9DQVBBQklMSVRZX0VTUywKLQkJCSAgICAgICBXTEFOX0NBUEFCSUxJVFlfRVNTKTsKKwlpZiAobndfdHlwZSAmIEFESE9DX05FVFdPUkspIHsKKwkJY2FwX21hc2sgPSBXTEFOX0NBUEFCSUxJVFlfSUJTUzsKKwkJY2FwX3ZhbCA9IFdMQU5fQ0FQQUJJTElUWV9JQlNTOworCX0gZWxzZSB7CisJCWNhcF9tYXNrID0gV0xBTl9DQVBBQklMSVRZX0VTUzsKKwkJY2FwX3ZhbCA9IFdMQU5fQ0FQQUJJTElUWV9FU1M7CisJfQorCisJYnNzID0gY2ZnODAyMTFfZ2V0X2Jzcyhhci0+d2lwaHksIGNoYW4sIGJzc2lkLAorCQkJICAgICAgIHZpZi0+c3NpZCwgdmlmLT5zc2lkX2xlbiwKKwkJCSAgICAgICBjYXBfbWFzaywgY2FwX3ZhbCk7CiAJaWYgKGJzcyA9PSBOVUxMKSB7CiAJCS8qCiAJCSAqIFNpbmNlIGNmZzgwMjExIG1heSBub3QgeWV0IGtub3cgYWJvdXQgdGhlIEJTUywKQEAgLTQzNSwyMSArNjM2LDIwIEBACiAJCSAqIFByZXBlbmQgU1NJRCBlbGVtZW50IHNpbmNlIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgQmVhY29uCiAJCSAqIElFcyBmcm9tIHRoZSB0YXJnZXQuCiAJCSAqLwotCQlpZSA9IGttYWxsb2MoMiArIGFyLT5zc2lkX2xlbiArIGJlYWNvbl9pZV9sZW4sIEdGUF9LRVJORUwpOworCQlpZSA9IGttYWxsb2MoMiArIHZpZi0+c3NpZF9sZW4gKyBiZWFjb25faWVfbGVuLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGllID09IE5VTEwpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJaWVbMF0gPSBXTEFOX0VJRF9TU0lEOwotCQlpZVsxXSA9IGFyLT5zc2lkX2xlbjsKLQkJbWVtY3B5KGllICsgMiwgYXItPnNzaWQsIGFyLT5zc2lkX2xlbik7Ci0JCW1lbWNweShpZSArIDIgKyBhci0+c3NpZF9sZW4sIGJlYWNvbl9pZSwgYmVhY29uX2llX2xlbik7Ci0JCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3MoYXItPndkZXYtPndpcGh5LCBjaGFuLAotCQkJCQkgIGJzc2lkLCAwLCBXTEFOX0NBUEFCSUxJVFlfRVNTLCAxMDAsCi0JCQkJCSAgaWUsIDIgKyBhci0+c3NpZF9sZW4gKyBiZWFjb25faWVfbGVuLAorCQlpZVsxXSA9IHZpZi0+c3NpZF9sZW47CisJCW1lbWNweShpZSArIDIsIHZpZi0+c3NpZCwgdmlmLT5zc2lkX2xlbik7CisJCW1lbWNweShpZSArIDIgKyB2aWYtPnNzaWRfbGVuLCBiZWFjb25faWUsIGJlYWNvbl9pZV9sZW4pOworCQlic3MgPSBjZmc4MDIxMV9pbmZvcm1fYnNzKGFyLT53aXBoeSwgY2hhbiwKKwkJCQkJICBic3NpZCwgMCwgY2FwX3ZhbCwgMTAwLAorCQkJCQkgIGllLCAyICsgdmlmLT5zc2lkX2xlbiArIGJlYWNvbl9pZV9sZW4sCiAJCQkJCSAgMCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChic3MpCi0JCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICJhZGRlZCBkdW1teSBic3MgZm9yICIKLQkJCQkgICAiJXBNIHByaW9yIHRvIGluZGljYXRpbmcgY29ubmVjdC9yb2FtZWQgIgotCQkJCSAgICJldmVudFxuIiwgYnNzaWQpOworCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiYWRkZWQgYnNzICVwTSB0byAiCisJCQkJICAgImNmZzgwMjExXG4iLCBic3NpZCk7CiAJCWtmcmVlKGllKTsKIAl9IGVsc2UKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiY2ZnODAyMTEgYWxyZWFkeSBoYXMgYSBic3MgIgpAQCAtNDYzLDcgKzY2Myw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgYXRoNmtsX2NmZzgwMjExX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBjaGFubmVsLAordm9pZCBhdGg2a2xfY2ZnODAyMTFfY29ubmVjdF9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1MTYgY2hhbm5lbCwKIAkJCQkgICB1OCAqYnNzaWQsIHUxNiBsaXN0ZW5faW50dmwsCiAJCQkJICAgdTE2IGJlYWNvbl9pbnR2bCwKIAkJCQkgICBlbnVtIG5ldHdvcmtfdHlwZSBud190eXBlLApAQCAtNDcxLDYgKzY3MSw3IEBACiAJCQkJICAgdTggYXNzb2NfcmVzcF9sZW4sIHU4ICphc3NvY19pbmZvKQogewogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAKIAkvKiBjYXBpbmZvICsgbGlzdGVuIGludGVydmFsICovCiAJdTggYXNzb2NfcmVxX2llX29mZnNldCA9IHNpemVvZih1MTYpICsgc2l6ZW9mKHUxNik7CkBAIC00ODksMTEgKzY5MCwxMSBAQAogCSAqIFN0b3JlIEJlYWNvbiBpbnRlcnZhbCBoZXJlOyBEVElNIHBlcmlvZCB3aWxsIGJlIGF2YWlsYWJsZSBvbmx5IG9uY2UKIAkgKiBhIEJlYWNvbiBmcmFtZSBmcm9tIHRoZSBBUCBpcyBzZWVuLgogCSAqLwotCWFyLT5hc3NvY19ic3NfYmVhY29uX2ludCA9IGJlYWNvbl9pbnR2bDsKLQljbGVhcl9iaXQoRFRJTV9QRVJJT0RfQVZBSUwsICZhci0+ZmxhZyk7CisJdmlmLT5hc3NvY19ic3NfYmVhY29uX2ludCA9IGJlYWNvbl9pbnR2bDsKKwljbGVhcl9iaXQoRFRJTV9QRVJJT0RfQVZBSUwsICZ2aWYtPmZsYWdzKTsKIAogCWlmIChud190eXBlICYgQURIT0NfTkVUV09SSykgewotCQlpZiAoYXItPndkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCQlpZiAodmlmLT53ZGV2LmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLAogCQkJCSAgICIlczogYXRoNmsgbm90IGluIGlic3MgbW9kZVxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwpAQCAtNTAxLDM5ICs3MDIsMzkgQEAKIAl9CiAKIAlpZiAobndfdHlwZSAmIElORlJBX05FVFdPUkspIHsKLQkJaWYgKGFyLT53ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgotCQkgICAgYXItPndkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSB7CisJCWlmICh2aWYtPndkZXYuaWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkJICAgIHZpZi0+d2Rldi5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkgewogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLAogCQkJCSAgICIlczogYXRoNmsgbm90IGluIHN0YXRpb24gbW9kZVxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwogCQl9CiAJfQogCi0JY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChhci0+d2Rldi0+d2lwaHksIChpbnQpIGNoYW5uZWwpOworCWNoYW4gPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwoYXItPndpcGh5LCAoaW50KSBjaGFubmVsKTsKIAorCWlmIChhdGg2a2xfYWRkX2Jzc19pZl9uZWVkZWQodmlmLCBud190eXBlLCBic3NpZCwgY2hhbiwgYXNzb2NfaW5mbywKKwkJCQkgICAgIGJlYWNvbl9pZV9sZW4pIDwgMCkgeworCQlhdGg2a2xfZXJyKCJjb3VsZCBub3QgYWRkIGNmZzgwMjExIGJzcyBlbnRyeVxuIik7CisJCXJldHVybjsKKwl9CiAKIAlpZiAobndfdHlwZSAmIEFESE9DX05FVFdPUkspIHsKLQkJY2ZnODAyMTFfaWJzc19qb2luZWQoYXItPm5ldF9kZXYsIGJzc2lkLCBHRlBfS0VSTkVMKTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiYWQtaG9jICVzIHNlbGVjdGVkXG4iLAorCQkJICAgbndfdHlwZSAmIEFESE9DX0NSRUFUT1IgPyAiY3JlYXRvciIgOiAiam9pbmVyIik7CisJCWNmZzgwMjExX2lic3Nfam9pbmVkKHZpZi0+bmRldiwgYnNzaWQsIEdGUF9LRVJORUwpOwogCQlyZXR1cm47CiAJfQogCi0JaWYgKGF0aDZrbF9hZGRfYnNzX2lmX25lZWRlZChhciwgYnNzaWQsIGNoYW4sIGFzc29jX2luZm8sCi0JCQkJICAgICBiZWFjb25faWVfbGVuKSA8IDApIHsKLQkJYXRoNmtsX2VycigiY291bGQgbm90IGFkZCBjZmc4MDIxMSBic3MgZW50cnkgZm9yICIKLQkJCSAgICJjb25uZWN0L3JvYW1lZCBub3RpZmljYXRpb25cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKGFyLT5zbWVfc3RhdGUgPT0gU01FX0NPTk5FQ1RJTkcpIHsKKwlpZiAodmlmLT5zbWVfc3RhdGUgPT0gU01FX0NPTk5FQ1RJTkcpIHsKIAkJLyogaW5mb3JtIGNvbm5lY3QgcmVzdWx0IHRvIGNmZzgwMjExICovCi0JCWFyLT5zbWVfc3RhdGUgPSBTTUVfQ09OTkVDVEVEOwotCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChhci0+bmV0X2RldiwgYnNzaWQsCisJCXZpZi0+c21lX3N0YXRlID0gU01FX0NPTk5FQ1RFRDsKKwkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQodmlmLT5uZGV2LCBic3NpZCwKIAkJCQkJYXNzb2NfcmVxX2llLCBhc3NvY19yZXFfbGVuLAogCQkJCQlhc3NvY19yZXNwX2llLCBhc3NvY19yZXNwX2xlbiwKIAkJCQkJV0xBTl9TVEFUVVNfU1VDQ0VTUywgR0ZQX0tFUk5FTCk7Ci0JfSBlbHNlIGlmIChhci0+c21lX3N0YXRlID09IFNNRV9DT05ORUNURUQpIHsKKwl9IGVsc2UgaWYgKHZpZi0+c21lX3N0YXRlID09IFNNRV9DT05ORUNURUQpIHsKIAkJLyogaW5mb3JtIHJvYW0gZXZlbnQgdG8gY2ZnODAyMTEgKi8KLQkJY2ZnODAyMTFfcm9hbWVkKGFyLT5uZXRfZGV2LCBjaGFuLCBic3NpZCwKKwkJY2ZnODAyMTFfcm9hbWVkKHZpZi0+bmRldiwgY2hhbiwgYnNzaWQsCiAJCQkJYXNzb2NfcmVxX2llLCBhc3NvY19yZXFfbGVuLAogCQkJCWFzc29jX3Jlc3BfaWUsIGFzc29jX3Jlc3BfbGVuLCBHRlBfS0VSTkVMKTsKIAl9CkBAIC01NDIsMTIgKzc0MywxNSBAQAogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfZGlzY29ubmVjdChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiByZWFzb25fY29kZSkKIHsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IChzdHJ1Y3QgYXRoNmtsICopYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogcmVhc29uPSV1XG4iLCBfX2Z1bmNfXywKIAkJICAgcmVhc29uX2NvZGUpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWF0aDZrbF9jZmc4MDIxMV9zc2Nhbl9kaXNhYmxlKHZpZik7CisKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQogCQlyZXR1cm4gLUVJTzsKIAogCWlmICh0ZXN0X2JpdChERVNUUk9ZX0lOX1BST0dSRVNTLCAmYXItPmZsYWcpKSB7CkBAIC01NjAsNDQgKzc2NCw0NiBAQAogCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwogCX0KIAotCWFyLT5yZWNvbm5lY3RfZmxhZyA9IDA7Ci0JYXRoNmtsX2Rpc2Nvbm5lY3QoYXIpOwotCW1lbXNldChhci0+c3NpZCwgMCwgc2l6ZW9mKGFyLT5zc2lkKSk7Ci0JYXItPnNzaWRfbGVuID0gMDsKKwl2aWYtPnJlY29ubmVjdF9mbGFnID0gMDsKKwlhdGg2a2xfZGlzY29ubmVjdCh2aWYpOworCW1lbXNldCh2aWYtPnNzaWQsIDAsIHNpemVvZih2aWYtPnNzaWQpKTsKKwl2aWYtPnNzaWRfbGVuID0gMDsKIAogCWlmICghdGVzdF9iaXQoU0tJUF9TQ0FOLCAmYXItPmZsYWcpKQotCQltZW1zZXQoYXItPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKGFyLT5yZXFfYnNzaWQpKTsKKwkJbWVtc2V0KHZpZi0+cmVxX2Jzc2lkLCAwLCBzaXplb2YodmlmLT5yZXFfYnNzaWQpKTsKIAogCXVwKCZhci0+c2VtKTsKIAotCWFyLT5zbWVfc3RhdGUgPSBTTUVfRElTQ09OTkVDVEVEOworCXZpZi0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKIAogCXJldHVybiAwOwogfQogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCByZWFzb24sCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IHJlYXNvbiwKIAkJCQkgICAgICB1OCAqYnNzaWQsIHU4IGFzc29jX3Jlc3BfbGVuLAogCQkJCSAgICAgIHU4ICphc3NvY19pbmZvLCB1MTYgcHJvdG9fcmVhc29uKQogewotCWlmIChhci0+c2Nhbl9yZXEpIHsKLQkJY2ZnODAyMTFfc2Nhbl9kb25lKGFyLT5zY2FuX3JlcSwgdHJ1ZSk7Ci0JCWFyLT5zY2FuX3JlcSA9IE5VTEw7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOworCisJaWYgKHZpZi0+c2Nhbl9yZXEpIHsKKwkJY2ZnODAyMTFfc2Nhbl9kb25lKHZpZi0+c2Nhbl9yZXEsIHRydWUpOworCQl2aWYtPnNjYW5fcmVxID0gTlVMTDsKIAl9CiAKLQlpZiAoYXItPm53X3R5cGUgJiBBREhPQ19ORVRXT1JLKSB7Ci0JCWlmIChhci0+d2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CisJaWYgKHZpZi0+bndfdHlwZSAmIEFESE9DX05FVFdPUkspIHsKKwkJaWYgKHZpZi0+d2Rldi5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJCQkgICAiJXM6IGF0aDZrIG5vdCBpbiBpYnNzIG1vZGVcbiIsIF9fZnVuY19fKTsKIAkJCXJldHVybjsKIAkJfQogCQltZW1zZXQoYnNzaWQsIDAsIEVUSF9BTEVOKTsKLQkJY2ZnODAyMTFfaWJzc19qb2luZWQoYXItPm5ldF9kZXYsIGJzc2lkLCBHRlBfS0VSTkVMKTsKKwkJY2ZnODAyMTFfaWJzc19qb2luZWQodmlmLT5uZGV2LCBic3NpZCwgR0ZQX0tFUk5FTCk7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoYXItPm53X3R5cGUgJiBJTkZSQV9ORVRXT1JLKSB7Ci0JCWlmIChhci0+d2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKLQkJICAgIGFyLT53ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkgeworCWlmICh2aWYtPm53X3R5cGUgJiBJTkZSQV9ORVRXT1JLKSB7CisJCWlmICh2aWYtPndkZXYuaWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkJICAgIHZpZi0+d2Rldi5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVCkgewogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLAogCQkJCSAgICIlczogYXRoNmsgbm90IGluIHN0YXRpb24gbW9kZVxuIiwgX19mdW5jX18pOwogCQkJcmV0dXJuOwpAQCAtNjE0LDQyICs4MjAsNDYgQEAKIAkgKi8KIAogCWlmIChyZWFzb24gIT0gRElTQ09OTkVDVF9DTUQpIHsKLQkJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZChhci0+d21pKTsKKwkJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgpOwogCQlyZXR1cm47CiAJfQogCi0JY2xlYXJfYml0KENPTk5FQ1RfUEVORCwgJmFyLT5mbGFnKTsKKwljbGVhcl9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CiAKLQlpZiAoYXItPnNtZV9zdGF0ZSA9PSBTTUVfQ09OTkVDVElORykgewotCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChhci0+bmV0X2RldiwKKwlpZiAodmlmLT5zbWVfc3RhdGUgPT0gU01FX0NPTk5FQ1RJTkcpIHsKKwkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQodmlmLT5uZGV2LAogCQkJCWJzc2lkLCBOVUxMLCAwLAogCQkJCU5VTEwsIDAsCiAJCQkJV0xBTl9TVEFUVVNfVU5TUEVDSUZJRURfRkFJTFVSRSwKIAkJCQlHRlBfS0VSTkVMKTsKLQl9IGVsc2UgaWYgKGFyLT5zbWVfc3RhdGUgPT0gU01FX0NPTk5FQ1RFRCkgewotCQljZmc4MDIxMV9kaXNjb25uZWN0ZWQoYXItPm5ldF9kZXYsIHJlYXNvbiwKKwl9IGVsc2UgaWYgKHZpZi0+c21lX3N0YXRlID09IFNNRV9DT05ORUNURUQpIHsKKwkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKHZpZi0+bmRldiwgcmVhc29uLAogCQkJCU5VTEwsIDAsIEdGUF9LRVJORUwpOwogCX0KIAotCWFyLT5zbWVfc3RhdGUgPSBTTUVfRElTQ09OTkVDVEVEOworCXZpZi0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfc2NhbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKIAkJCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0KQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKilhdGg2a2xfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KG5kZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzOCBuX2NoYW5uZWxzID0gMDsKIAl1MTYgKmNoYW5uZWxzID0gTlVMTDsKIAlpbnQgcmV0ID0gMDsKKwl1MzIgZm9yY2VfZmdfc2NhbiA9IDA7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKKwlhdGg2a2xfY2ZnODAyMTFfc3NjYW5fZGlzYWJsZSh2aWYpOworCiAJaWYgKCFhci0+dXNyX2Jzc19maWx0ZXIpIHsKLQkJY2xlYXJfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZhci0+ZmxhZyk7CisJCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmdmlmLT5mbGFncyk7CiAJCXJldCA9IGF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZCgKLQkJCWFyLT53bWksCi0JCQkodGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpID8KKwkJCWFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCSh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSA/CiAJCQkgQUxMX0JVVF9CU1NfRklMVEVSIDogQUxMX0JTU19GSUxURVIpLCAwKTsKIAkJaWYgKHJldCkgewogCQkJYXRoNmtsX2VycigiY291bGRuJ3Qgc2V0IGJzcyBmaWx0ZXJpbmdcbiIpOwpAQCAtNjY0LDE0ICs4NzQsMTkgQEAKIAkJCXJlcXVlc3QtPm5fc3NpZHMgPSBNQVhfUFJPQkVEX1NTSURfSU5ERVggLSAxOwogCiAJCWZvciAoaSA9IDA7IGkgPCByZXF1ZXN0LT5uX3NzaWRzOyBpKyspCi0JCQlhdGg2a2xfd21pX3Byb2JlZHNzaWRfY21kKGFyLT53bWksIGkgKyAxLAotCQkJCQkJICBTUEVDSUZJQ19TU0lEX0ZMQUcsCisJCQlhdGg2a2xfd21pX3Byb2JlZHNzaWRfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJCSAgaSArIDEsIFNQRUNJRklDX1NTSURfRkxBRywKIAkJCQkJCSAgcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4sCiAJCQkJCQkgIHJlcXVlc3QtPnNzaWRzW2ldLnNzaWQpOwogCX0KIAorCS8qCisJICogRklYTUU6IHdlIHNob3VsZCBjbGVhciB0aGUgSUUgaW4gZncgaWYgaXQncyBub3Qgc2V0IHNvIGp1c3QKKwkgKiByZW1vdmUgdGhlIGNoZWNrIGFsdG9nZXRoZXIKKwkgKi8KIAlpZiAocmVxdWVzdC0+aWUpIHsKLQkJcmV0ID0gYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKGFyLT53bWksIFdNSV9GUkFNRV9QUk9CRV9SRVEsCisJCXJldCA9IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgICAgICBXTUlfRlJBTUVfUFJPQkVfUkVRLAogCQkJCQkgICAgICAgcmVxdWVzdC0+aWUsIHJlcXVlc3QtPmllX2xlbik7CiAJCWlmIChyZXQpIHsKIAkJCWF0aDZrbF9lcnIoImZhaWxlZCB0byBzZXQgUHJvYmUgUmVxdWVzdCBhcHBpZSBmb3IgIgpAQCAtNzAyLDQ0ICs5MTcsNjMgQEAKIAkJCWNoYW5uZWxzW2ldID0gcmVxdWVzdC0+Y2hhbm5lbHNbaV0tPmNlbnRlcl9mcmVxOwogCX0KIAotCXJldCA9IGF0aDZrbF93bWlfc3RhcnRzY2FuX2NtZChhci0+d21pLCBXTUlfTE9OR19TQ0FOLCAwLAotCQkJCSAgICAgICBmYWxzZSwgMCwgMCwgbl9jaGFubmVscywgY2hhbm5lbHMpOworCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkKKwkJZm9yY2VfZmdfc2NhbiA9IDE7CisKKwlpZiAodGVzdF9iaXQoQVRINktMX0ZXX0NBUEFCSUxJVFlfU1RBX1AyUERFVl9EVVBMRVgsCisJCSAgICBhci0+ZndfY2FwYWJpbGl0aWVzKSkgeworCQkvKgorCQkgKiBJZiBjYXBhYmxlIG9mIGRvaW5nIFAyUCBtZ210IG9wZXJhdGlvbnMgdXNpbmcKKwkJICogc3RhdGlvbiBpbnRlcmZhY2UsIHNlbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBsaWtlCisJCSAqIHN1cHBvcnRlZCByYXRlcyB0byBhZHZlcnRpc2UgYW5kIHhtaXQgcmF0ZXMgZm9yCisJCSAqIHByb2JlIHJlcXVlc3RzCisJCSAqLworCQlyZXQgPSBhdGg2a2xfd21pX2JlZ2luc2Nhbl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJV01JX0xPTkdfU0NBTiwgZm9yY2VfZmdfc2NhbiwKKwkJCQkJCWZhbHNlLCAwLCAwLCBuX2NoYW5uZWxzLAorCQkJCQkJY2hhbm5lbHMsIHJlcXVlc3QtPm5vX2NjaywKKwkJCQkJCXJlcXVlc3QtPnJhdGVzKTsKKwl9IGVsc2UgeworCQlyZXQgPSBhdGg2a2xfd21pX3N0YXJ0c2Nhbl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJV01JX0xPTkdfU0NBTiwgZm9yY2VfZmdfc2NhbiwKKwkJCQkJCWZhbHNlLCAwLCAwLCBuX2NoYW5uZWxzLAorCQkJCQkJY2hhbm5lbHMpOworCX0KIAlpZiAocmV0KQogCQlhdGg2a2xfZXJyKCJ3bWlfc3RhcnRzY2FuX2NtZCBmYWlsZWRcbiIpOwogCWVsc2UKLQkJYXItPnNjYW5fcmVxID0gcmVxdWVzdDsKKwkJdmlmLT5zY2FuX3JlcSA9IHJlcXVlc3Q7CiAKIAlrZnJlZShjaGFubmVscyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV9zY2FuX2NvbXBsZXRlX2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCBpbnQgc3RhdHVzKQordm9pZCBhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBib29sIGFib3J0ZWQpCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCWludCBpOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IHN0YXR1cyAlZFxuIiwgX19mdW5jX18sIHN0YXR1cyk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IHN0YXR1cyVzXG4iLCBfX2Z1bmNfXywKKwkJICAgYWJvcnRlZCA/ICIgYWJvcnRlZCIgOiAiIik7CiAKLQlpZiAoIWFyLT5zY2FuX3JlcSkKKwlpZiAoIXZpZi0+c2Nhbl9yZXEpCiAJCXJldHVybjsKIAotCWlmICgoc3RhdHVzID09IC1FQ0FOQ0VMRUQpIHx8IChzdGF0dXMgPT0gLUVCVVNZKSkgewotCQljZmc4MDIxMV9zY2FuX2RvbmUoYXItPnNjYW5fcmVxLCB0cnVlKTsKKwlpZiAoYWJvcnRlZCkKIAkJZ290byBvdXQ7Ci0JfQogCi0JY2ZnODAyMTFfc2Nhbl9kb25lKGFyLT5zY2FuX3JlcSwgZmFsc2UpOwotCi0JaWYgKGFyLT5zY2FuX3JlcS0+bl9zc2lkcyAmJiBhci0+c2Nhbl9yZXEtPnNzaWRzWzBdLnNzaWRfbGVuKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBhci0+c2Nhbl9yZXEtPm5fc3NpZHM7IGkrKykgewotCQkJYXRoNmtsX3dtaV9wcm9iZWRzc2lkX2NtZChhci0+d21pLCBpICsgMSwKLQkJCQkJCSAgRElTQUJMRV9TU0lEX0ZMQUcsCisJaWYgKHZpZi0+c2Nhbl9yZXEtPm5fc3NpZHMgJiYgdmlmLT5zY2FuX3JlcS0+c3NpZHNbMF0uc3NpZF9sZW4pIHsKKwkJZm9yIChpID0gMDsgaSA8IHZpZi0+c2Nhbl9yZXEtPm5fc3NpZHM7IGkrKykgeworCQkJYXRoNmtsX3dtaV9wcm9iZWRzc2lkX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCQkgIGkgKyAxLCBESVNBQkxFX1NTSURfRkxBRywKIAkJCQkJCSAgMCwgTlVMTCk7CiAJCX0KIAl9CiAKIG91dDoKLQlhci0+c2Nhbl9yZXEgPSBOVUxMOworCWNmZzgwMjExX3NjYW5fZG9uZSh2aWYtPnNjYW5fcmVxLCBhYm9ydGVkKTsKKwl2aWYtPnNjYW5fcmVxID0gTlVMTDsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfYWRkX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKQEAgLTc0NywxNSArOTgxLDIyIEBACiAJCQkJICAgY29uc3QgdTggKm1hY19hZGRyLAogCQkJCSAgIHN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSAoc3RydWN0IGF0aDZrbCAqKWF0aDZrbF9wcml2KG5kZXYpOworCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYobmRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBhdGg2a2xfa2V5ICprZXkgPSBOVUxMOwogCXU4IGtleV91c2FnZTsKIAl1OCBrZXlfdHlwZTsKLQlpbnQgc3RhdHVzID0gMDsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQogCQlyZXR1cm4gLUVJTzsKIAorCWlmIChwYXJhbXMtPmNpcGhlciA9PSBDQ0tNX0tSS19DSVBIRVJfU1VJVEUpIHsKKwkJaWYgKHBhcmFtcy0+a2V5X2xlbiAhPSBXTUlfS1JLX0xFTikKKwkJCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gYXRoNmtsX3dtaV9hZGRfa3JrX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgICAgIHBhcmFtcy0+a2V5KTsKKwl9CisKIAlpZiAoa2V5X2luZGV4IDwgV01JX01JTl9LRVlfSU5ERVggfHwga2V5X2luZGV4ID4gV01JX01BWF9LRVlfSU5ERVgpIHsKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLAogCQkJICAgIiVzOiBrZXkgaW5kZXggJWQgb3V0IG9mIGJvdW5kc1xuIiwgX19mdW5jX18sCkBAIC03NjMsNyArMTAwNCw3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWtleSA9ICZhci0+a2V5c1trZXlfaW5kZXhdOworCWtleSA9ICZ2aWYtPmtleXNba2V5X2luZGV4XTsKIAltZW1zZXQoa2V5LCAwLCBzaXplb2Yoc3RydWN0IGF0aDZrbF9rZXkpKTsKIAogCWlmIChwYWlyd2lzZSkKQEAgLTc3MiwxMyArMTAxMywxOSBAQAogCQlrZXlfdXNhZ2UgPSBHUk9VUF9VU0FHRTsKIAogCWlmIChwYXJhbXMpIHsKKwkJaW50IHNlcV9sZW4gPSBwYXJhbXMtPnNlcV9sZW47CisJCWlmIChwYXJhbXMtPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9TTVM0ICYmCisJCSAgICBzZXFfbGVuID4gQVRINktMX0tFWV9TRVFfTEVOKSB7CisJCQkvKiBPbmx5IGZpcnN0IGhhbGYgb2YgdGhlIFdQSSBQTiBpcyBjb25maWd1cmVkICovCisJCQlzZXFfbGVuID0gQVRINktMX0tFWV9TRVFfTEVOOworCQl9CiAJCWlmIChwYXJhbXMtPmtleV9sZW4gPiBXTEFOX01BWF9LRVlfTEVOIHx8Ci0JCSAgICBwYXJhbXMtPnNlcV9sZW4gPiBzaXplb2Yoa2V5LT5zZXEpKQorCQkgICAgc2VxX2xlbiA+IHNpemVvZihrZXktPnNlcSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAogCQlrZXktPmtleV9sZW4gPSBwYXJhbXMtPmtleV9sZW47CiAJCW1lbWNweShrZXktPmtleSwgcGFyYW1zLT5rZXksIGtleS0+a2V5X2xlbik7Ci0JCWtleS0+c2VxX2xlbiA9IHBhcmFtcy0+c2VxX2xlbjsKKwkJa2V5LT5zZXFfbGVuID0gc2VxX2xlbjsKIAkJbWVtY3B5KGtleS0+c2VxLCBwYXJhbXMtPnNlcSwga2V5LT5zZXFfbGVuKTsKIAkJa2V5LT5jaXBoZXIgPSBwYXJhbXMtPmNpcGhlcjsKIAl9CkBAIC03OTYsMzEgKzEwNDMsMzMgQEAKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCWtleV90eXBlID0gQUVTX0NSWVBUOwogCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1NNUzQ6CisJCWtleV90eXBlID0gV0FQSV9DUllQVDsKKwkJYnJlYWs7CiAKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1RTVVBQOwogCX0KIAotCWlmICgoKGFyLT5hdXRoX21vZGUgPT0gV1BBX1BTS19BVVRIKQotCSAgICAgfHwgKGFyLT5hdXRoX21vZGUgPT0gV1BBMl9QU0tfQVVUSCkpCisJaWYgKCgodmlmLT5hdXRoX21vZGUgPT0gV1BBX1BTS19BVVRIKQorCSAgICAgfHwgKHZpZi0+YXV0aF9tb2RlID09IFdQQTJfUFNLX0FVVEgpKQogCSAgICAmJiAoa2V5X3VzYWdlICYgR1JPVVBfVVNBR0UpKQotCQlkZWxfdGltZXIoJmFyLT5kaXNjb25uZWN0X3RpbWVyKTsKKwkJZGVsX3RpbWVyKCZ2aWYtPmRpc2Nvbm5lY3RfdGltZXIpOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLAogCQkgICAiJXM6IGluZGV4ICVkLCBrZXlfbGVuICVkLCBrZXlfdHlwZSAweCV4LCBrZXlfdXNhZ2UgMHgleCwgc2VxX2xlbiAlZFxuIiwKIAkJICAgX19mdW5jX18sIGtleV9pbmRleCwga2V5LT5rZXlfbGVuLCBrZXlfdHlwZSwKIAkJICAga2V5X3VzYWdlLCBrZXktPnNlcV9sZW4pOwogCi0JYXItPmRlZl90eGtleV9pbmRleCA9IGtleV9pbmRleDsKLQotCWlmIChhci0+bndfdHlwZSA9PSBBUF9ORVRXT1JLICYmICFwYWlyd2lzZSAmJgotCSAgICAoa2V5X3R5cGUgPT0gVEtJUF9DUllQVCB8fCBrZXlfdHlwZSA9PSBBRVNfQ1JZUFQpICYmIHBhcmFtcykgeworCWlmICh2aWYtPm53X3R5cGUgPT0gQVBfTkVUV09SSyAmJiAhcGFpcndpc2UgJiYKKwkgICAgKGtleV90eXBlID09IFRLSVBfQ1JZUFQgfHwga2V5X3R5cGUgPT0gQUVTX0NSWVBUIHx8CisJICAgICBrZXlfdHlwZSA9PSBXQVBJX0NSWVBUKSAmJiBwYXJhbXMpIHsKIAkJYXItPmFwX21vZGVfYmtleS52YWxpZCA9IHRydWU7CiAJCWFyLT5hcF9tb2RlX2JrZXkua2V5X2luZGV4ID0ga2V5X2luZGV4OwogCQlhci0+YXBfbW9kZV9ia2V5LmtleV90eXBlID0ga2V5X3R5cGU7CiAJCWFyLT5hcF9tb2RlX2JrZXkua2V5X2xlbiA9IGtleS0+a2V5X2xlbjsKIAkJbWVtY3B5KGFyLT5hcF9tb2RlX2JrZXkua2V5LCBrZXktPmtleSwga2V5LT5rZXlfbGVuKTsKLQkJaWYgKCF0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykpIHsKKwkJaWYgKCF0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkgewogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiRGVsYXkgaW5pdGlhbCBncm91cCAiCiAJCQkJICAgImtleSBjb25maWd1cmF0aW9uIHVudGlsIEFQIG1vZGUgaGFzIGJlZW4gIgogCQkJCSAgICJzdGFydGVkXG4iKTsKQEAgLTgzMiw4ICsxMDgxLDggQEAKIAkJfQogCX0KIAotCWlmIChhci0+bmV4dF9tb2RlID09IEFQX05FVFdPUksgJiYga2V5X3R5cGUgPT0gV0VQX0NSWVBUICYmCi0JICAgICF0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykpIHsKKwlpZiAodmlmLT5uZXh0X21vZGUgPT0gQVBfTkVUV09SSyAmJiBrZXlfdHlwZSA9PSBXRVBfQ1JZUFQgJiYKKwkgICAgIXRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKSB7CiAJCS8qCiAJCSAqIFN0b3JlIHRoZSBrZXkgbG9jYWxseSBzbyB0aGF0IGl0IGNhbiBiZSByZS1jb25maWd1cmVkIGFmdGVyCiAJCSAqIHRoZSBBUCBtb2RlIGhhcyBwcm9wZXJseSBzdGFydGVkCkBAIC04NDEsMzEgKzEwOTAsMjkgQEAKIAkJICovCiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIkRlbGF5IFdFUCBrZXkgY29uZmlndXJhdGlvbiAiCiAJCQkgICAidW50aWwgQVAgbW9kZSBoYXMgYmVlbiBzdGFydGVkXG4iKTsKLQkJYXItPndlcF9rZXlfbGlzdFtrZXlfaW5kZXhdLmtleV9sZW4gPSBrZXktPmtleV9sZW47Ci0JCW1lbWNweShhci0+d2VwX2tleV9saXN0W2tleV9pbmRleF0ua2V5LCBrZXktPmtleSwga2V5LT5rZXlfbGVuKTsKKwkJdmlmLT53ZXBfa2V5X2xpc3Rba2V5X2luZGV4XS5rZXlfbGVuID0ga2V5LT5rZXlfbGVuOworCQltZW1jcHkodmlmLT53ZXBfa2V5X2xpc3Rba2V5X2luZGV4XS5rZXksIGtleS0+a2V5LAorCQkgICAgICAga2V5LT5rZXlfbGVuKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0Jc3RhdHVzID0gYXRoNmtsX3dtaV9hZGRrZXlfY21kKGFyLT53bWksIGFyLT5kZWZfdHhrZXlfaW5kZXgsCi0JCQkJICAgICAgIGtleV90eXBlLCBrZXlfdXNhZ2UsIGtleS0+a2V5X2xlbiwKLQkJCQkgICAgICAga2V5LT5zZXEsIGtleS0+a2V5LCBLRVlfT1BfSU5JVF9WQUwsCi0JCQkJICAgICAgICh1OCAqKSBtYWNfYWRkciwgU1lOQ19CT1RIX1dNSUZMQUcpOwotCi0JaWYgKHN0YXR1cykKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYXRoNmtsX3dtaV9hZGRrZXlfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwga2V5X2luZGV4LAorCQkJCSAgICAga2V5X3R5cGUsIGtleV91c2FnZSwga2V5LT5rZXlfbGVuLAorCQkJCSAgICAga2V5LT5zZXEsIGtleS0+c2VxX2xlbiwga2V5LT5rZXksCisJCQkJICAgICBLRVlfT1BfSU5JVF9WQUwsCisJCQkJICAgICAodTggKikgbWFjX2FkZHIsIFNZTkNfQk9USF9XTUlGTEFHKTsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfZGVsX2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKIAkJCQkgICB1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsCiAJCQkJICAgY29uc3QgdTggKm1hY19hZGRyKQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKilhdGg2a2xfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KG5kZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBpbmRleCAlZFxuIiwgX19mdW5jX18sIGtleV9pbmRleCk7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoa2V5X2luZGV4IDwgV01JX01JTl9LRVlfSU5ERVggfHwga2V5X2luZGV4ID4gV01JX01BWF9LRVlfSU5ERVgpIHsKQEAgLTg3NSwxNSArMTEyMiwxNSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlpZiAoIWFyLT5rZXlzW2tleV9pbmRleF0ua2V5X2xlbikgeworCWlmICghdmlmLT5rZXlzW2tleV9pbmRleF0ua2V5X2xlbikgewogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsCiAJCQkgICAiJXM6IGluZGV4ICVkIGlzIGVtcHR5XG4iLCBfX2Z1bmNfXywga2V5X2luZGV4KTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JYXItPmtleXNba2V5X2luZGV4XS5rZXlfbGVuID0gMDsKKwl2aWYtPmtleXNba2V5X2luZGV4XS5rZXlfbGVuID0gMDsKIAotCXJldHVybiBhdGg2a2xfd21pX2RlbGV0ZWtleV9jbWQoYXItPndtaSwga2V5X2luZGV4KTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9kZWxldGVrZXlfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwga2V5X2luZGV4KTsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfZ2V0X2tleShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKQEAgLTg5MiwxMyArMTEzOSwxMyBAQAogCQkJCSAgIHZvaWQgKCpjYWxsYmFjaykgKHZvaWQgKmNvb2tpZSwKIAkJCQkJCSAgICAgc3RydWN0IGtleV9wYXJhbXMgKikpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSAoc3RydWN0IGF0aDZrbCAqKWF0aDZrbF9wcml2KG5kZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihuZGV2KTsKIAlzdHJ1Y3QgYXRoNmtsX2tleSAqa2V5ID0gTlVMTDsKIAlzdHJ1Y3Qga2V5X3BhcmFtcyBwYXJhbXM7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogaW5kZXggJWRcbiIsIF9fZnVuY19fLCBrZXlfaW5kZXgpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQorCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCiAJCXJldHVybiAtRUlPOwogCiAJaWYgKGtleV9pbmRleCA8IFdNSV9NSU5fS0VZX0lOREVYIHx8IGtleV9pbmRleCA+IFdNSV9NQVhfS0VZX0lOREVYKSB7CkBAIC05MDgsNyArMTE1NSw3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KIAotCWtleSA9ICZhci0+a2V5c1trZXlfaW5kZXhdOworCWtleSA9ICZ2aWYtPmtleXNba2V5X2luZGV4XTsKIAltZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwogCXBhcmFtcy5jaXBoZXIgPSBrZXktPmNpcGhlcjsKIAlwYXJhbXMua2V5X2xlbiA9IGtleS0+a2V5X2xlbjsKQEAgLTkyNiwxNSArMTE3MywxNSBAQAogCQkJCQkgICB1OCBrZXlfaW5kZXgsIGJvb2wgdW5pY2FzdCwKIAkJCQkJICAgYm9vbCBtdWx0aWNhc3QpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSAoc3RydWN0IGF0aDZrbCAqKWF0aDZrbF9wcml2KG5kZXYpOworCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYobmRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBhdGg2a2xfa2V5ICprZXkgPSBOVUxMOwotCWludCBzdGF0dXMgPSAwOwogCXU4IGtleV91c2FnZTsKIAllbnVtIGNyeXB0b190eXBlIGtleV90eXBlID0gTk9ORV9DUllQVDsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBpbmRleCAlZFxuIiwgX19mdW5jX18sIGtleV9pbmRleCk7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoa2V5X2luZGV4IDwgV01JX01JTl9LRVlfSU5ERVggfHwga2V5X2luZGV4ID4gV01JX01BWF9LRVlfSU5ERVgpIHsKQEAgLTk0NCw0MyArMTE5MSw0MSBAQAogCQlyZXR1cm4gLUVOT0VOVDsKIAl9CiAKLQlpZiAoIWFyLT5rZXlzW2tleV9pbmRleF0ua2V5X2xlbikgeworCWlmICghdmlmLT5rZXlzW2tleV9pbmRleF0ua2V5X2xlbikgewogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogaW52YWxpZCBrZXkgaW5kZXggJWRcbiIsCiAJCQkgICBfX2Z1bmNfXywga2V5X2luZGV4KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JYXItPmRlZl90eGtleV9pbmRleCA9IGtleV9pbmRleDsKLQlrZXkgPSAmYXItPmtleXNbYXItPmRlZl90eGtleV9pbmRleF07CisJdmlmLT5kZWZfdHhrZXlfaW5kZXggPSBrZXlfaW5kZXg7CisJa2V5ID0gJnZpZi0+a2V5c1t2aWYtPmRlZl90eGtleV9pbmRleF07CiAJa2V5X3VzYWdlID0gR1JPVVBfVVNBR0U7Ci0JaWYgKGFyLT5wcndpc2VfY3J5cHRvID09IFdFUF9DUllQVCkKKwlpZiAodmlmLT5wcndpc2VfY3J5cHRvID09IFdFUF9DUllQVCkKIAkJa2V5X3VzYWdlIHw9IFRYX1VTQUdFOwogCWlmICh1bmljYXN0KQotCQlrZXlfdHlwZSA9IGFyLT5wcndpc2VfY3J5cHRvOworCQlrZXlfdHlwZSA9IHZpZi0+cHJ3aXNlX2NyeXB0bzsKIAlpZiAobXVsdGljYXN0KQotCQlrZXlfdHlwZSA9IGFyLT5ncnBfY3J5cHRvOworCQlrZXlfdHlwZSA9IHZpZi0+Z3JwX2NyeXB0bzsKIAotCWlmIChhci0+bmV4dF9tb2RlID09IEFQX05FVFdPUksgJiYgIXRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSkKKwlpZiAodmlmLT5uZXh0X21vZGUgPT0gQVBfTkVUV09SSyAmJiAhdGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpCiAJCXJldHVybiAwOyAvKiBEZWxheSB1bnRpbCBBUCBtb2RlIGhhcyBiZWVuIHN0YXJ0ZWQgKi8KIAotCXN0YXR1cyA9IGF0aDZrbF93bWlfYWRka2V5X2NtZChhci0+d21pLCBhci0+ZGVmX3R4a2V5X2luZGV4LAotCQkJCSAgICAgICBrZXlfdHlwZSwga2V5X3VzYWdlLAotCQkJCSAgICAgICBrZXktPmtleV9sZW4sIGtleS0+c2VxLCBrZXktPmtleSwKLQkJCQkgICAgICAgS0VZX09QX0lOSVRfVkFMLCBOVUxMLAotCQkJCSAgICAgICBTWU5DX0JPVEhfV01JRkxBRyk7Ci0JaWYgKHN0YXR1cykKLQkJcmV0dXJuIC1FSU87Ci0KLQlyZXR1cm4gMDsKKwlyZXR1cm4gYXRoNmtsX3dtaV9hZGRrZXlfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkgICAgIHZpZi0+ZGVmX3R4a2V5X2luZGV4LAorCQkJCSAgICAga2V5X3R5cGUsIGtleV91c2FnZSwKKwkJCQkgICAgIGtleS0+a2V5X2xlbiwga2V5LT5zZXEsIGtleS0+c2VxX2xlbiwKKwkJCQkgICAgIGtleS0+a2V5LAorCQkJCSAgICAgS0VZX09QX0lOSVRfVkFMLCBOVUxMLAorCQkJCSAgICAgU1lOQ19CT1RIX1dNSUZMQUcpOwogfQogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV90a2lwX21pY2Vycl9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTgga2V5aWQsCit2b2lkIGF0aDZrbF9jZmc4MDIxMV90a2lwX21pY2Vycl9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCBrZXlpZCwKIAkJCQkgICAgICAgYm9vbCBpc21jYXN0KQogewogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywKIAkJICAgIiVzOiBrZXlpZCAlZCwgaXNtY2FzdCAlZFxuIiwgX19mdW5jX18sIGtleWlkLCBpc21jYXN0KTsKIAotCWNmZzgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUoYXItPm5ldF9kZXYsIGFyLT5ic3NpZCwKKwljZmc4MDIxMV9taWNoYWVsX21pY19mYWlsdXJlKHZpZi0+bmRldiwgdmlmLT5ic3NpZCwKIAkJCQkgICAgIChpc21jYXN0ID8gTkw4MDIxMV9LRVlUWVBFX0dST1VQIDoKIAkJCQkgICAgICBOTDgwMjExX0tFWVRZUEVfUEFJUldJU0UpLCBrZXlpZCwgTlVMTCwKIAkJCQkgICAgIEdGUF9LRVJORUwpOwpAQCAtOTg5LDEyICsxMjM0LDE3IEBACiBzdGF0aWMgaW50IGF0aDZrbF9jZmc4MDIxMV9zZXRfd2lwaHlfcGFyYW1zKHN0cnVjdCB3aXBoeSAqd2lwaHksIHUzMiBjaGFuZ2VkKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKil3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOwogCWludCByZXQ7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogY2hhbmdlZCAweCV4XG4iLCBfX2Z1bmNfXywKIAkJICAgY2hhbmdlZCk7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAoY2hhbmdlZCAmIFdJUEhZX1BBUkFNX1JUU19USFJFU0hPTEQpIHsKQEAgLTEwMTQsMTUgKzEyNjQsMjEgQEAKICovCiBzdGF0aWMgaW50IGF0aDZrbF9jZmc4MDIxMV9zZXRfdHhwb3dlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgICAgICBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLAotCQkJCSAgICAgICBpbnQgZGJtKQorCQkJCSAgICAgICBpbnQgbWJtKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gKHN0cnVjdCBhdGg2a2wgKil3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOwogCXU4IGF0aDZrbF9kYm07CisJaW50IGRibSA9IE1CTV9UT19EQk0obWJtKTsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiB0eXBlIDB4JXgsIGRibSAlZFxuIiwgX19mdW5jX18sCiAJCSAgIHR5cGUsIGRibSk7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlzd2l0Y2ggKHR5cGUpIHsKQEAgLTEwMzcsNyArMTI5Myw3IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQlhdGg2a2xfd21pX3NldF90eF9wd3JfY21kKGFyLT53bWksIGF0aDZrbF9kYm0pOworCWF0aDZrbF93bWlfc2V0X3R4X3B3cl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LCBhdGg2a2xfZGJtKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTA0NSwxNCArMTMwMSwxOSBAQAogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfZ2V0X3R4cG93ZXIoc3RydWN0IHdpcGh5ICp3aXBoeSwgaW50ICpkYm0pCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSAoc3RydWN0IGF0aDZrbCAqKXdpcGh5X3ByaXYod2lwaHkpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpCiAJCXJldHVybiAtRUlPOwogCi0JaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSkgeworCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KHZpZikpCisJCXJldHVybiAtRUlPOworCisJaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKSB7CiAJCWFyLT50eF9wd3IgPSAwOwogCi0JCWlmIChhdGg2a2xfd21pX2dldF90eF9wd3JfY21kKGFyLT53bWkpICE9IDApIHsKKwkJaWYgKGF0aDZrbF93bWlfZ2V0X3R4X3B3cl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4KSAhPSAwKSB7CiAJCQlhdGg2a2xfZXJyKCJhdGg2a2xfd21pX2dldF90eF9wd3JfY21kIGZhaWxlZFxuIik7CiAJCQlyZXR1cm4gLUVJTzsKIAkJfQpAQCAtMTA3NiwxMSArMTMzNywxMiBAQAogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgd21pX3Bvd2VyX21vZGVfY21kIG1vZGU7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogcG1nbXQgJWQsIHRpbWVvdXQgJWRcbiIsCiAJCSAgIF9fZnVuY19fLCBwbWdtdCwgdGltZW91dCk7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKIAlpZiAocG1nbXQpIHsKQEAgLTEwOTEsNyArMTM1Myw4IEBACiAJCW1vZGUucHdyX21vZGUgPSBNQVhfUEVSRl9QT1dFUjsKIAl9CiAKLQlpZiAoYXRoNmtsX3dtaV9wb3dlcm1vZGVfY21kKGFyLT53bWksIG1vZGUucHdyX21vZGUpICE9IDApIHsKKwlpZiAoYXRoNmtsX3dtaV9wb3dlcm1vZGVfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkgICAgIG1vZGUucHdyX21vZGUpICE9IDApIHsKIAkJYXRoNmtsX2Vycigid21pX3Bvd2VybW9kZV9jbWQgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMTA5OSw0MSArMTM2Miw4MyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmF0aDZrbF9jZmc4MDIxMV9hZGRfaWZhY2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkJCSAgICBjaGFyICpuYW1lLAorCQkJCQkJICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwKKwkJCQkJCSAgICB1MzIgKmZsYWdzLAorCQkJCQkJICAgIHN0cnVjdCB2aWZfcGFyYW1zICpwYXJhbXMpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwl1OCBpZl9pZHgsIG53X3R5cGU7CisKKwlpZiAoYXItPm51bV92aWYgPT0gYXItPnZpZl9tYXgpIHsKKwkJYXRoNmtsX2VycigiUmVhY2hlZCBtYXhpbXVtIG51bWJlciBvZiBzdXBwb3J0ZWQgdmlmXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJaWYgKCFhdGg2a2xfaXNfdmFsaWRfaWZ0eXBlKGFyLCB0eXBlLCAmaWZfaWR4LCAmbndfdHlwZSkpIHsKKwkJYXRoNmtsX2VycigiTm90IGEgc3VwcG9ydGVkIGludGVyZmFjZSB0eXBlXG4iKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJbmRldiA9IGF0aDZrbF9pbnRlcmZhY2VfYWRkKGFyLCBuYW1lLCB0eXBlLCBpZl9pZHgsIG53X3R5cGUpOworCWlmICghbmRldikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlhci0+bnVtX3ZpZisrOworCisJcmV0dXJuIG5kZXY7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX2RlbF9pZmFjZShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgICAgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB3aXBoeV9wcml2KHdpcGh5KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYobmRldik7CisKKwlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCWxpc3RfZGVsKCZ2aWYtPmxpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKworCWF0aDZrbF9jbGVhbnVwX3ZpZih2aWYsIHRlc3RfYml0KFdNSV9SRUFEWSwgJmFyLT5mbGFnKSk7CisKKwlhdGg2a2xfZGVpbml0X2lmX2RhdGEodmlmKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGF0aDZrbF9jZmc4MDIxMV9jaGFuZ2VfaWZhY2Uoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwgdTMyICpmbGFncywKIAkJCQkJc3RydWN0IHZpZl9wYXJhbXMgKnBhcmFtcykKIHsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KG5kZXYpOwotCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBhci0+d2RldjsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYobmRldik7CiAKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICIlczogdHlwZSAldVxuIiwgX19mdW5jX18sIHR5cGUpOwogCi0JaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkoYXIpKQotCQlyZXR1cm4gLUVJTzsKLQogCXN3aXRjaCAodHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJYXItPm5leHRfbW9kZSA9IElORlJBX05FVFdPUks7CisJCXZpZi0+bmV4dF9tb2RlID0gSU5GUkFfTkVUV09SSzsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJYXItPm5leHRfbW9kZSA9IEFESE9DX05FVFdPUks7CisJCXZpZi0+bmV4dF9tb2RlID0gQURIT0NfTkVUV09SSzsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQkJYXItPm5leHRfbW9kZSA9IEFQX05FVFdPUks7CisJCXZpZi0+bmV4dF9tb2RlID0gQVBfTkVUV09SSzsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UOgotCQlhci0+bmV4dF9tb2RlID0gSU5GUkFfTkVUV09SSzsKKwkJdmlmLT5uZXh0X21vZGUgPSBJTkZSQV9ORVRXT1JLOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKLQkJYXItPm5leHRfbW9kZSA9IEFQX05FVFdPUks7CisJCXZpZi0+bmV4dF9tb2RlID0gQVBfTkVUV09SSzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYXRoNmtsX2VycigiaW52YWxpZCBpbnRlcmZhY2UgdHlwZSAldVxuIiwgdHlwZSk7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQl3ZGV2LT5pZnR5cGUgPSB0eXBlOworCXZpZi0+d2Rldi5pZnR5cGUgPSB0eXBlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMTQzLDE2ICsxNDQ4LDE3IEBACiAJCQkJICAgICBzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgKmlic3NfcGFyYW0pCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCWludCBzdGF0dXM7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlhci0+c3NpZF9sZW4gPSBpYnNzX3BhcmFtLT5zc2lkX2xlbjsKLQltZW1jcHkoYXItPnNzaWQsIGlic3NfcGFyYW0tPnNzaWQsIGFyLT5zc2lkX2xlbik7CisJdmlmLT5zc2lkX2xlbiA9IGlic3NfcGFyYW0tPnNzaWRfbGVuOworCW1lbWNweSh2aWYtPnNzaWQsIGlic3NfcGFyYW0tPnNzaWQsIHZpZi0+c3NpZF9sZW4pOwogCiAJaWYgKGlic3NfcGFyYW0tPmNoYW5uZWwpCi0JCWFyLT5jaF9oaW50ID0gaWJzc19wYXJhbS0+Y2hhbm5lbC0+Y2VudGVyX2ZyZXE7CisJCXZpZi0+Y2hfaGludCA9IGlic3NfcGFyYW0tPmNoYW5uZWwtPmNlbnRlcl9mcmVxOwogCiAJaWYgKGlic3NfcGFyYW0tPmNoYW5uZWxfZml4ZWQpIHsKIAkJLyoKQEAgLTExNjQsNDQgKzE0NzAsNDUgQEAKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCW1lbXNldChhci0+cmVxX2Jzc2lkLCAwLCBzaXplb2YoYXItPnJlcV9ic3NpZCkpOworCW1lbXNldCh2aWYtPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKHZpZi0+cmVxX2Jzc2lkKSk7CiAJaWYgKGlic3NfcGFyYW0tPmJzc2lkICYmICFpc19icm9hZGNhc3RfZXRoZXJfYWRkcihpYnNzX3BhcmFtLT5ic3NpZCkpCi0JCW1lbWNweShhci0+cmVxX2Jzc2lkLCBpYnNzX3BhcmFtLT5ic3NpZCwgc2l6ZW9mKGFyLT5yZXFfYnNzaWQpKTsKKwkJbWVtY3B5KHZpZi0+cmVxX2Jzc2lkLCBpYnNzX3BhcmFtLT5ic3NpZCwKKwkJICAgICAgIHNpemVvZih2aWYtPnJlcV9ic3NpZCkpOwogCi0JYXRoNmtsX3NldF93cGFfdmVyc2lvbihhciwgMCk7CisJYXRoNmtsX3NldF93cGFfdmVyc2lvbih2aWYsIDApOwogCi0Jc3RhdHVzID0gYXRoNmtsX3NldF9hdXRoX3R5cGUoYXIsIE5MODAyMTFfQVVUSFRZUEVfT1BFTl9TWVNURU0pOworCXN0YXR1cyA9IGF0aDZrbF9zZXRfYXV0aF90eXBlKHZpZiwgTkw4MDIxMV9BVVRIVFlQRV9PUEVOX1NZU1RFTSk7CiAJaWYgKHN0YXR1cykKIAkJcmV0dXJuIHN0YXR1czsKIAogCWlmIChpYnNzX3BhcmFtLT5wcml2YWN5KSB7Ci0JCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCwgdHJ1ZSk7Ci0JCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCwgZmFsc2UpOworCQlhdGg2a2xfc2V0X2NpcGhlcih2aWYsIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwLCB0cnVlKTsKKwkJYXRoNmtsX3NldF9jaXBoZXIodmlmLCBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCwgZmFsc2UpOwogCX0gZWxzZSB7Ci0JCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCAwLCB0cnVlKTsKLQkJYXRoNmtsX3NldF9jaXBoZXIoYXIsIDAsIGZhbHNlKTsKKwkJYXRoNmtsX3NldF9jaXBoZXIodmlmLCAwLCB0cnVlKTsKKwkJYXRoNmtsX3NldF9jaXBoZXIodmlmLCAwLCBmYWxzZSk7CiAJfQogCi0JYXItPm53X3R5cGUgPSBhci0+bmV4dF9tb2RlOworCXZpZi0+bndfdHlwZSA9IHZpZi0+bmV4dF9tb2RlOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLAogCQkgICAiJXM6IGNvbm5lY3QgY2FsbGVkIHdpdGggYXV0aG1vZGUgJWQgZG90MTEgYXV0aCAlZCIKIAkJICAgIiBQVyBjcnlwdG8gJWQgUFcgY3J5cHRvIGxlbiAlZCBHUlAgY3J5cHRvICVkIgogCQkgICAiIEdSUCBjcnlwdG8gbGVuICVkIGNoYW5uZWwgaGludCAldVxuIiwKIAkJICAgX19mdW5jX18sCi0JCSAgIGFyLT5hdXRoX21vZGUsIGFyLT5kb3QxMV9hdXRoX21vZGUsIGFyLT5wcndpc2VfY3J5cHRvLAotCQkgICBhci0+cHJ3aXNlX2NyeXB0b19sZW4sIGFyLT5ncnBfY3J5cHRvLAotCQkgICBhci0+Z3JwX2NyeXB0b19sZW4sIGFyLT5jaF9oaW50KTsKKwkJICAgdmlmLT5hdXRoX21vZGUsIHZpZi0+ZG90MTFfYXV0aF9tb2RlLCB2aWYtPnByd2lzZV9jcnlwdG8sCisJCSAgIHZpZi0+cHJ3aXNlX2NyeXB0b19sZW4sIHZpZi0+Z3JwX2NyeXB0bywKKwkJICAgdmlmLT5ncnBfY3J5cHRvX2xlbiwgdmlmLT5jaF9oaW50KTsKIAotCXN0YXR1cyA9IGF0aDZrbF93bWlfY29ubmVjdF9jbWQoYXItPndtaSwgYXItPm53X3R5cGUsCi0JCQkJCWFyLT5kb3QxMV9hdXRoX21vZGUsIGFyLT5hdXRoX21vZGUsCi0JCQkJCWFyLT5wcndpc2VfY3J5cHRvLAotCQkJCQlhci0+cHJ3aXNlX2NyeXB0b19sZW4sCi0JCQkJCWFyLT5ncnBfY3J5cHRvLCBhci0+Z3JwX2NyeXB0b19sZW4sCi0JCQkJCWFyLT5zc2lkX2xlbiwgYXItPnNzaWQsCi0JCQkJCWFyLT5yZXFfYnNzaWQsIGFyLT5jaF9oaW50LAotCQkJCQlhci0+Y29ubmVjdF9jdHJsX2ZsYWdzKTsKLQlzZXRfYml0KENPTk5FQ1RfUEVORCwgJmFyLT5mbGFnKTsKKwlzdGF0dXMgPSBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgdmlmLT5ud190eXBlLAorCQkJCQl2aWYtPmRvdDExX2F1dGhfbW9kZSwgdmlmLT5hdXRoX21vZGUsCisJCQkJCXZpZi0+cHJ3aXNlX2NyeXB0bywKKwkJCQkJdmlmLT5wcndpc2VfY3J5cHRvX2xlbiwKKwkJCQkJdmlmLT5ncnBfY3J5cHRvLCB2aWYtPmdycF9jcnlwdG9fbGVuLAorCQkJCQl2aWYtPnNzaWRfbGVuLCB2aWYtPnNzaWQsCisJCQkJCXZpZi0+cmVxX2Jzc2lkLCB2aWYtPmNoX2hpbnQsCisJCQkJCWFyLT5jb25uZWN0X2N0cmxfZmxhZ3MsIFNVQlRZUEVfTk9ORSk7CisJc2V0X2JpdChDT05ORUNUX1BFTkQsICZ2aWYtPmZsYWdzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIwOSwxNCArMTUxNiwxNCBAQAogc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfbGVhdmVfaWJzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSAoc3RydWN0IGF0aDZrbCAqKWF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlhdGg2a2xfZGlzY29ubmVjdChhcik7Ci0JbWVtc2V0KGFyLT5zc2lkLCAwLCBzaXplb2YoYXItPnNzaWQpKTsKLQlhci0+c3NpZF9sZW4gPSAwOworCWF0aDZrbF9kaXNjb25uZWN0KHZpZik7CisJbWVtc2V0KHZpZi0+c3NpZCwgMCwgc2l6ZW9mKHZpZi0+c3NpZCkpOworCXZpZi0+c3NpZF9sZW4gPSAwOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMjI2LDYgKzE1MzMsOCBAQAogCVdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCwKIAlXTEFOX0NJUEhFUl9TVUlURV9US0lQLAogCVdMQU5fQ0lQSEVSX1NVSVRFX0NDTVAsCisJQ0NLTV9LUktfQ0lQSEVSX1NVSVRFLAorCVdMQU5fQ0lQSEVSX1NVSVRFX1NNUzQsCiB9OwogCiBzdGF0aWMgYm9vbCBpc19yYXRlX2xlZ2FjeShzMzIgcmF0ZSkKQEAgLTEyOTMsMjEgKzE2MDIsMjIgQEAKIAkJCSAgICAgIHU4ICptYWMsIHN0cnVjdCBzdGF0aW9uX2luZm8gKnNpbmZvKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlsb25nIGxlZnQ7CiAJYm9vbCBzZ2k7CiAJczMyIHJhdGU7CiAJaW50IHJldDsKIAl1OCBtY3M7CiAKLQlpZiAobWVtY21wKG1hYywgYXItPmJzc2lkLCBFVEhfQUxFTikgIT0gMCkKKwlpZiAobWVtY21wKG1hYywgdmlmLT5ic3NpZCwgRVRIX0FMRU4pICE9IDApCiAJCXJldHVybiAtRU5PRU5UOwogCiAJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXItPnNlbSkpCiAJCXJldHVybiAtRUJVU1k7CiAKLQlzZXRfYml0KFNUQVRTX1VQREFURV9QRU5ELCAmYXItPmZsYWcpOworCXNldF9iaXQoU1RBVFNfVVBEQVRFX1BFTkQsICZ2aWYtPmZsYWdzKTsKIAotCXJldCA9IGF0aDZrbF93bWlfZ2V0X3N0YXRzX2NtZChhci0+d21pKTsKKwlyZXQgPSBhdGg2a2xfd21pX2dldF9zdGF0c19jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4KTsKIAogCWlmIChyZXQgIT0gMCkgewogCQl1cCgmYXItPnNlbSk7CkBAIC0xMzE2LDcgKzE2MjYsNyBAQAogCiAJbGVmdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGFyLT5ldmVudF93cSwKIAkJCQkJCSF0ZXN0X2JpdChTVEFUU19VUERBVEVfUEVORCwKLQkJCQkJCQkgICZhci0+ZmxhZyksCisJCQkJCQkJICAmdmlmLT5mbGFncyksCiAJCQkJCQlXTUlfVElNRU9VVCk7CiAKIAl1cCgmYXItPnNlbSk7CkBAIC0xMzI2LDI0ICsxNjM2LDI0IEBACiAJZWxzZSBpZiAobGVmdCA8IDApCiAJCXJldHVybiBsZWZ0OwogCi0JaWYgKGFyLT50YXJnZXRfc3RhdHMucnhfYnl0ZSkgewotCQlzaW5mby0+cnhfYnl0ZXMgPSBhci0+dGFyZ2V0X3N0YXRzLnJ4X2J5dGU7CisJaWYgKHZpZi0+dGFyZ2V0X3N0YXRzLnJ4X2J5dGUpIHsKKwkJc2luZm8tPnJ4X2J5dGVzID0gdmlmLT50YXJnZXRfc3RhdHMucnhfYnl0ZTsKIAkJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fUlhfQllURVM7Ci0JCXNpbmZvLT5yeF9wYWNrZXRzID0gYXItPnRhcmdldF9zdGF0cy5yeF9wa3Q7CisJCXNpbmZvLT5yeF9wYWNrZXRzID0gdmlmLT50YXJnZXRfc3RhdHMucnhfcGt0OwogCQlzaW5mby0+ZmlsbGVkIHw9IFNUQVRJT05fSU5GT19SWF9QQUNLRVRTOwogCX0KIAotCWlmIChhci0+dGFyZ2V0X3N0YXRzLnR4X2J5dGUpIHsKLQkJc2luZm8tPnR4X2J5dGVzID0gYXItPnRhcmdldF9zdGF0cy50eF9ieXRlOworCWlmICh2aWYtPnRhcmdldF9zdGF0cy50eF9ieXRlKSB7CisJCXNpbmZvLT50eF9ieXRlcyA9IHZpZi0+dGFyZ2V0X3N0YXRzLnR4X2J5dGU7CiAJCXNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX1RYX0JZVEVTOwotCQlzaW5mby0+dHhfcGFja2V0cyA9IGFyLT50YXJnZXRfc3RhdHMudHhfcGt0OworCQlzaW5mby0+dHhfcGFja2V0cyA9IHZpZi0+dGFyZ2V0X3N0YXRzLnR4X3BrdDsKIAkJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fVFhfUEFDS0VUUzsKIAl9CiAKLQlzaW5mby0+c2lnbmFsID0gYXItPnRhcmdldF9zdGF0cy5jc19yc3NpOworCXNpbmZvLT5zaWduYWwgPSB2aWYtPnRhcmdldF9zdGF0cy5jc19yc3NpOwogCXNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX1NJR05BTDsKIAotCXJhdGUgPSBhci0+dGFyZ2V0X3N0YXRzLnR4X3VjYXN0X3JhdGU7CisJcmF0ZSA9IHZpZi0+dGFyZ2V0X3N0YXRzLnR4X3VjYXN0X3JhdGU7CiAKIAlpZiAoaXNfcmF0ZV9sZWdhY3kocmF0ZSkpIHsKIAkJc2luZm8tPnR4cmF0ZS5sZWdhY3kgPSByYXRlIC8gMTAwOwpAQCAtMTM3NSwxMyArMTY4NSwxMyBAQAogCiAJc2luZm8tPmZpbGxlZCB8PSBTVEFUSU9OX0lORk9fVFhfQklUUkFURTsKIAotCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykgJiYKLQkgICAgdGVzdF9iaXQoRFRJTV9QRVJJT0RfQVZBSUwsICZhci0+ZmxhZykgJiYKLQkgICAgYXItPm53X3R5cGUgPT0gSU5GUkFfTkVUV09SSykgeworCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSAmJgorCSAgICB0ZXN0X2JpdChEVElNX1BFUklPRF9BVkFJTCwgJnZpZi0+ZmxhZ3MpICYmCisJICAgIHZpZi0+bndfdHlwZSA9PSBJTkZSQV9ORVRXT1JLKSB7CiAJCXNpbmZvLT5maWxsZWQgfD0gU1RBVElPTl9JTkZPX0JTU19QQVJBTTsKIAkJc2luZm8tPmJzc19wYXJhbS5mbGFncyA9IDA7Ci0JCXNpbmZvLT5ic3NfcGFyYW0uZHRpbV9wZXJpb2QgPSBhci0+YXNzb2NfYnNzX2R0aW1fcGVyaW9kOwotCQlzaW5mby0+YnNzX3BhcmFtLmJlYWNvbl9pbnRlcnZhbCA9IGFyLT5hc3NvY19ic3NfYmVhY29uX2ludDsKKwkJc2luZm8tPmJzc19wYXJhbS5kdGltX3BlcmlvZCA9IHZpZi0+YXNzb2NfYnNzX2R0aW1fcGVyaW9kOworCQlzaW5mby0+YnNzX3BhcmFtLmJlYWNvbl9pbnRlcnZhbCA9IHZpZi0+YXNzb2NfYnNzX2JlYWNvbl9pbnQ7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC0xMzkxLDcgKzE3MDEsOSBAQAogCQkJICAgIHN0cnVjdCBjZmc4MDIxMV9wbWtzYSAqcG1rc2EpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihuZXRkZXYpOwotCXJldHVybiBhdGg2a2xfd21pX3NldHBta2lkX2NtZChhci0+d21pLCBwbWtzYS0+YnNzaWQsCisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KG5ldGRldik7CisKKwlyZXR1cm4gYXRoNmtsX3dtaV9zZXRwbWtpZF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LCBwbWtzYS0+YnNzaWQsCiAJCQkJICAgICAgIHBta3NhLT5wbWtpZCwgdHJ1ZSk7CiB9CiAKQEAgLTEzOTksMjUgKzE3MTEsMzAyIEBACiAJCQkgICAgc3RydWN0IGNmZzgwMjExX3Bta3NhICpwbWtzYSkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KG5ldGRldik7Ci0JcmV0dXJuIGF0aDZrbF93bWlfc2V0cG1raWRfY21kKGFyLT53bWksIHBta3NhLT5ic3NpZCwKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCXJldHVybiBhdGg2a2xfd21pX3NldHBta2lkX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIHBta3NhLT5ic3NpZCwKIAkJCQkgICAgICAgcG1rc2EtPnBta2lkLCBmYWxzZSk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2ZsdXNoX3Bta3NhKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihuZXRkZXYpOwotCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykpCi0JCXJldHVybiBhdGg2a2xfd21pX3NldHBta2lkX2NtZChhci0+d21pLCBhci0+YnNzaWQsIE5VTEwsIGZhbHNlKTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKKworCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkKKwkJcmV0dXJuIGF0aDZrbF93bWlfc2V0cG1raWRfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgICAgIHZpZi0+YnNzaWQsIE5VTEwsIGZhbHNlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGg2a2xfd293X3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIsIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdykKK3sKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOworCWludCByZXQsIHBvcywgbGVmdDsKKwl1MzIgZmlsdGVyID0gMDsKKwl1MTYgaTsKKwl1OCBtYXNrW1dPV19NQVNLX1NJWkVdOworCisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIXRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIENsZWFyIGV4aXN0aW5nIFdPVyBwYXR0ZXJucyAqLworCWZvciAoaSA9IDA7IGkgPCBXT1dfTUFYX0ZJTFRFUlNfUEVSX0xJU1Q7IGkrKykKKwkJYXRoNmtsX3dtaV9kZWxfd293X3BhdHRlcm5fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgICAgIFdPV19MSVNUX0lELCBpKTsKKwkvKiBDb25maWd1cmUgbmV3IFdPVyBwYXR0ZXJucyAqLworCWZvciAoaSA9IDA7IGkgPCB3b3ctPm5fcGF0dGVybnM7IGkrKykgeworCisJCS8qCisJCSAqIENvbnZlcnQgZ2l2ZW4gbmw4MDIxMSBzcGVjaWZpYyBtYXNrIHZhbHVlIHRvIGVxdWl2YWxlbnQKKwkJICogZHJpdmVyIHNwZWNpZmljIG1hc2sgdmFsdWUgYW5kIHNlbmQgaXQgdG8gdGhlIGNoaXAgYWxvbmcKKwkJICogd2l0aCBwYXR0ZXJucy4gRm9yIGV4YW1wbGUsIElmIHRoZSBtYXNrIHZhbHVlIGRlZmluZWQgaW4KKwkJICogc3RydWN0IGNmZzgwMjExX3dvd2xhbiBpcyAweEEgKGVxdWl2YWxlbnQgYmluYXJ5IGlzIDEwMTApLAorCQkgKiB0aGVuIGVxdWl2YWxlbnQgZHJpdmVyIHNwZWNpZmljIG1hc2sgdmFsdWUgaXMKKwkJICogIjB4RkYgMHgwMCAweEZGIDB4MDAiLgorCQkgKi8KKwkJbWVtc2V0KCZtYXNrLCAwLCBzaXplb2YobWFzaykpOworCQlmb3IgKHBvcyA9IDA7IHBvcyA8IHdvdy0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW47IHBvcysrKSB7CisJCQlpZiAod293LT5wYXR0ZXJuc1tpXS5tYXNrW3BvcyAvIDhdICYgKDB4MSA8PCAocG9zICUgOCkpKQorCQkJCW1hc2tbcG9zXSA9IDB4RkY7CisJCX0KKwkJLyoKKwkJICogTm90ZTogUGF0dGVybidzIG9mZnNldCBpcyBub3QgcGFzc2VkIGFzIHBhcnQgb2Ygd293bGFuCisJCSAqIHBhcmFtZXRlciBmcm9tIENGRyBsYXllci4gU28gaXQncyBhbHdheXMgcGFzc2VkIGFzIFpFUk8KKwkJICogdG8gdGhlIGZpcm13YXJlLiBJdCBtZWFucywgZ2l2ZW4gV09XIHBhdHRlcm5zIGFyZSBhbHdheXMKKwkJICogbWF0Y2hlZCBmcm9tIHRoZSBmaXJzdCBieXRlIG9mIHJlY2VpdmVkIHBrdCBpbiB0aGUgZmlybXdhcmUuCisJCSAqLworCQlyZXQgPSBhdGg2a2xfd21pX2FkZF93b3dfcGF0dGVybl9jbWQoYXItPndtaSwKKwkJCQkJdmlmLT5md192aWZfaWR4LCBXT1dfTElTVF9JRCwKKwkJCQkJd293LT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX2xlbiwKKwkJCQkJMCAvKiBwYXR0ZXJuIG9mZnNldCAqLywKKwkJCQkJd293LT5wYXR0ZXJuc1tpXS5wYXR0ZXJuLCBtYXNrKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHdvdy0+ZGlzY29ubmVjdCkKKwkJZmlsdGVyIHw9IFdPV19GSUxURVJfT1BUSU9OX05XS19ESVNBU1NPQzsKKworCWlmICh3b3ctPm1hZ2ljX3BrdCkKKwkJZmlsdGVyIHw9IFdPV19GSUxURVJfT1BUSU9OX01BR0lDX1BBQ0tFVDsKKworCWlmICh3b3ctPmd0a19yZWtleV9mYWlsdXJlKQorCQlmaWx0ZXIgfD0gV09XX0ZJTFRFUl9PUFRJT05fR1RLX0VSUk9SOworCisJaWYgKHdvdy0+ZWFwX2lkZW50aXR5X3JlcSkKKwkJZmlsdGVyIHw9IFdPV19GSUxURVJfT1BUSU9OX0VBUF9SRVE7CisKKwlpZiAod293LT5mb3VyX3dheV9oYW5kc2hha2UpCisJCWZpbHRlciB8PSBXT1dfRklMVEVSX09QVElPTl84MDIxWF80V0FZSFM7CisKKwlyZXQgPSBhdGg2a2xfd21pX3NldF93b3dfbW9kZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgIEFUSDZLTF9XT1dfTU9ERV9FTkFCTEUsCisJCQkJCSAgZmlsdGVyLAorCQkJCQkgIFdPV19IT1NUX1JFUV9ERUxBWSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGF0aDZrbF93bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJIEFUSDZLTF9IT1NUX01PREVfQVNMRUVQKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaWYgKGFyLT50eF9wZW5kaW5nW2FyLT5jdHJsX2VwXSkgeworCQlsZWZ0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXItPmV2ZW50X3dxLAorCQkJCWFyLT50eF9wZW5kaW5nW2FyLT5jdHJsX2VwXSA9PSAwLCBXTUlfVElNRU9VVCk7CisJCWlmIChsZWZ0ID09IDApIHsKKwkJCWF0aDZrbF93YXJuKCJjbGVhciB3bWkgY3RybCBkYXRhIHRpbWVvdXRcbiIpOworCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJfSBlbHNlIGlmIChsZWZ0IDwgMCkgeworCQkJYXRoNmtsX3dhcm4oImNsZWFyIHdtaSBjdHJsIGRhdGEgZmFpbGVkOiAlZFxuIiwgbGVmdCk7CisJCQlyZXQgPSBsZWZ0OworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdGg2a2xfd293X3Jlc3VtZShzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOworCWludCByZXQ7CisKKwl2aWYgPSBhdGg2a2xfdmlmX2ZpcnN0KGFyKTsKKwlpZiAoIXZpZikKKwkJcmV0dXJuIC1FSU87CisKKwlyZXQgPSBhdGg2a2xfd21pX3NldF9ob3N0X3NsZWVwX21vZGVfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJCSBBVEg2S0xfSE9TVF9NT0RFX0FXQUtFKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgYXRoNmtsX2NmZzgwMjExX3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIsCisJCQkgICAgZW51bSBhdGg2a2xfY2ZnX3N1c3BlbmRfbW9kZSBtb2RlLAorCQkJICAgIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdykKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBBVEg2S0xfQ0ZHX1NVU1BFTkRfV09XOgorCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19TVVNQRU5ELCAid293IG1vZGUgc3VzcGVuZFxuIik7CisKKwkJLyogRmx1c2ggYWxsIG5vbiBjb250cm9sIHBrdHMgaW4gVFggcGF0aCAqLworCQlhdGg2a2xfdHhfZGF0YV9jbGVhbnVwKGFyKTsKKworCQlyZXQgPSBhdGg2a2xfd293X3N1c3BlbmQoYXIsIHdvdyk7CisJCWlmIChyZXQpIHsKKwkJCWF0aDZrbF9lcnIoIndvdyBzdXNwZW5kIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJCWFyLT5zdGF0ZSA9IEFUSDZLTF9TVEFURV9XT1c7CisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfQ0ZHX1NVU1BFTkRfREVFUFNMRUVQOgorCisJCWF0aDZrbF9jZmc4MDIxMV9zdG9wX2FsbChhcik7CisKKwkJLyogc2F2ZSB0aGUgY3VycmVudCBwb3dlciBtb2RlIGJlZm9yZSBlbmFibGluZyBwb3dlciBzYXZlICovCisJCWFyLT53bWktPnNhdmVkX3B3cl9tb2RlID0gYXItPndtaS0+cHdyX21vZGU7CisKKwkJcmV0ID0gYXRoNmtsX3dtaV9wb3dlcm1vZGVfY21kKGFyLT53bWksIDAsIFJFQ19QT1dFUik7CisJCWlmIChyZXQpIHsKKwkJCWF0aDZrbF93YXJuKCJ3bWkgcG93ZXJtb2RlIGNvbW1hbmQgZmFpbGVkIGR1cmluZyBzdXNwZW5kOiAlZFxuIiwKKwkJCQkgICAgcmV0KTsKKwkJfQorCisJCWFyLT5zdGF0ZSA9IEFUSDZLTF9TVEFURV9ERUVQU0xFRVA7CisKKwkJYnJlYWs7CisKKwljYXNlIEFUSDZLTF9DRkdfU1VTUEVORF9DVVRQT1dFUjoKKworCQlhdGg2a2xfY2ZnODAyMTFfc3RvcF9hbGwoYXIpOworCisJCWlmIChhci0+c3RhdGUgPT0gQVRINktMX1NUQVRFX09GRikgeworCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NVU1BFTkQsCisJCQkJICAgInN1c3BlbmQgaHcgb2ZmLCBubyBhY3Rpb24gZm9yIGN1dHBvd2VyXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NVU1BFTkQsICJzdXNwZW5kIGN1dHRpbmcgcG93ZXJcbiIpOworCisJCXJldCA9IGF0aDZrbF9pbml0X2h3X3N0b3AoYXIpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIHN0b3AgaHcgZHVyaW5nIHN1c3BlbmQ6ICVkXG4iLAorCQkJCSAgICByZXQpOworCQl9CisKKwkJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX0NVVFBPV0VSOworCisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfQ0ZHX1NVU1BFTkRfU0NIRURfU0NBTjoKKwkJLyoKKwkJICogTm90aGluZyBuZWVkZWQgZm9yIHNjaGVkdWxlIHNjYW4sIGZpcm13YXJlIGlzIGFscmVhZHkgaW4KKwkJICogd293IG1vZGUgYW5kIHNsZWVwaW5nIG1vc3Qgb2YgdGhlIHRpbWUuCisJCSAqLworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgYXRoNmtsX2NmZzgwMjExX3Jlc3VtZShzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChhci0+c3RhdGUpIHsKKwljYXNlICBBVEg2S0xfU1RBVEVfV09XOgorCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU1VTUEVORCwgIndvdyBtb2RlIHJlc3VtZVxuIik7CisKKwkJcmV0ID0gYXRoNmtsX3dvd19yZXN1bWUoYXIpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfd2Fybigid293IG1vZGUgcmVzdW1lIGZhaWxlZDogJWRcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX09OOworCQlicmVhazsKKworCWNhc2UgQVRINktMX1NUQVRFX0RFRVBTTEVFUDoKKwkJaWYgKGFyLT53bWktPnB3cl9tb2RlICE9IGFyLT53bWktPnNhdmVkX3B3cl9tb2RlKSB7CisJCQlyZXQgPSBhdGg2a2xfd21pX3Bvd2VybW9kZV9jbWQoYXItPndtaSwgMCwKKwkJCQkJCSAgICAgICBhci0+d21pLT5zYXZlZF9wd3JfbW9kZSk7CisJCQlpZiAocmV0KSB7CisJCQkJYXRoNmtsX3dhcm4oIndtaSBwb3dlcm1vZGUgY29tbWFuZCBmYWlsZWQgZHVyaW5nIHJlc3VtZTogJWRcbiIsCisJCQkJCSAgICByZXQpOworCQkJfQorCQl9CisKKwkJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX09OOworCisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfU1RBVEVfQ1VUUE9XRVI6CisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19TVVNQRU5ELCAicmVzdW1lIHJlc3RvcmluZyBwb3dlclxuIik7CisKKwkJcmV0ID0gYXRoNmtsX2luaXRfaHdfc3RhcnQoYXIpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfd2FybigiRmFpbGVkIHRvIGJvb3QgaHcgaW4gcmVzdW1lOiAlZFxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEFUSDZLTF9TVEFURV9TQ0hFRF9TQ0FOOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogCXJldHVybiAwOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCi1zdGF0aWMgaW50IGFyNmtfY2ZnODAyMTFfc3VzcGVuZChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCisvKiBoaWYgbGF5ZXIgZGVjaWRlcyB3aGF0IHN1c3BlbmQgbW9kZSB0byB1c2UgKi8KK3N0YXRpYyBpbnQgX19hdGg2a2xfY2ZnODAyMTFfc3VzcGVuZChzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSB3aXBoeV9wcml2KHdpcGh5KTsKIAotCXJldHVybiBhdGg2a2xfaGlmX3N1c3BlbmQoYXIpOworCXJldHVybiBhdGg2a2xfaGlmX3N1c3BlbmQoYXIsIHdvdyk7Cit9CisKK3N0YXRpYyBpbnQgX19hdGg2a2xfY2ZnODAyMTFfcmVzdW1lKHN0cnVjdCB3aXBoeSAqd2lwaHkpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB3aXBoeV9wcml2KHdpcGh5KTsKKworCXJldHVybiBhdGg2a2xfaGlmX3Jlc3VtZShhcik7Cit9CisKKy8qCisgKiBGSVhNRTogV09XIHN1c3BlbmQgbW9kZSBpcyBzZWxlY3RlZCBpZiB0aGUgaG9zdCBzZGlvIGNvbnRyb2xsZXIgc3VwcG9ydHMKKyAqIGJvdGggc2RpbyBpcnEgd2FrZSB1cCBhbmQga2VlcCBwb3dlci4gVGhlIHRhcmdldCBwdWxscyBzZGlvIGRhdGEgbGluZSB0bworICogd2FrZSB1cCB0aGUgaG9zdCB3aGVuIFdPVyBwYXR0ZXJuIG1hdGNoZXMuIFRoaXMgY2F1c2VzIHNkaW8gaXJxIGhhbmRsZXIKKyAqIGlzIGJlaW5nIGNhbGxlZCBpbiB0aGUgaG9zdCBzaWRlIHdoaWNoIGludGVybmFsbHkgaGl0cyBhdGg2a2wncyBSWCBwYXRoLgorICoKKyAqIFNpbmNlIHNkaW8gaW50ZXJydXB0IGlzIG5vdCBkaXNhYmxlZCwgUlggcGF0aCBleGVjdXRlcyBldmVuIGJlZm9yZQorICogdGhlIGhvc3QgZXhlY3V0ZXMgdGhlIGFjdHVhbCByZXN1bWUgb3BlcmF0aW9uIGZyb20gUE0gbW9kdWxlLgorICoKKyAqIEluIHRoZSBjdXJyZW50IHNjZW5hcmlvLCBXT1cgcmVzdW1lIHNob3VsZCBoYXBwZW4gYmVmb3JlIHN0YXJ0IHByb2Nlc3NpbmcKKyAqIGFueSBkYXRhIGZyb20gdGhlIHRhcmdldC4gU28gSXQncyByZXF1aXJlZCB0byBwZXJmb3JtIFdPVyByZXN1bWUgaW4gUlggcGF0aC4KKyAqIElkZWFsbHkgd2Ugc2hvdWxkIHBlcmZvcm0gV09XIHJlc3VtZSBvbmx5IGluIHRoZSBhY3R1YWwgcGxhdGZvcm0KKyAqIHJlc3VtZSBwYXRoLiBUaGlzIGFyZWEgbmVlZHMgYml0IHJld29yayB0byBhdm9pZCBXT1cgcmVzdW1lIGluIFJYIHBhdGguCisgKgorICogYXRoNmtsX2NoZWNrX3dvd19zdGF0dXMoKSBpcyBjYWxsZWQgZnJvbSBhdGg2a2xfcngoKS4KKyAqLwordm9pZCBhdGg2a2xfY2hlY2tfd293X3N0YXR1cyhzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlpZiAoYXItPnN0YXRlID09IEFUSDZLTF9TVEFURV9XT1cpCisJCWF0aDZrbF9jZmc4MDIxMV9yZXN1bWUoYXIpOworfQorCisjZWxzZQorCit2b2lkIGF0aDZrbF9jaGVja193b3dfc3RhdHVzKHN0cnVjdCBhdGg2a2wgKmFyKQorewogfQogI2VuZGlmCiAKQEAgLTE0MjUsMTQgKzIwMTQsMTQgQEAKIAkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKIAkJCSAgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlKQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCWlmICghYXRoNmtsX2NmZzgwMjExX3JlYWR5KGFyKSkKKwlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeSh2aWYpKQogCQlyZXR1cm4gLUVJTzsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIiVzOiBjZW50ZXJfZnJlcT0ldSBod192YWx1ZT0ldVxuIiwKIAkJICAgX19mdW5jX18sIGNoYW4tPmNlbnRlcl9mcmVxLCBjaGFuLT5od192YWx1ZSk7Ci0JYXItPm5leHRfY2hhbiA9IGNoYW4tPmNlbnRlcl9mcmVxOworCXZpZi0+bmV4dF9jaGFuID0gY2hhbi0+Y2VudGVyX2ZyZXE7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE0NDQsOSArMjAzMywxMCBAQAogCQlwb3NbNF0gPT0gMHg5YSAmJiBwb3NbNV0gPT0gMHgwOTsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2V0X2FwX3Byb2JlX3Jlc3BfaWVzKHN0cnVjdCBhdGg2a2wgKmFyLCBjb25zdCB1OCAqaWVzLAotCQkJCQlzaXplX3QgaWVzX2xlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3NldF9hcF9wcm9iZV9yZXNwX2llcyhzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLAorCQkJCQljb25zdCB1OCAqaWVzLCBzaXplX3QgaWVzX2xlbikKIHsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJY29uc3QgdTggKnBvczsKIAl1OCAqYnVmID0gTlVMTDsKIAlzaXplX3QgbGVuID0gMDsKQEAgLTE0NzMsOCArMjA2Myw4IEBACiAJCX0KIAl9CiAKLQlyZXQgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgV01JX0ZSQU1FX1BST0JFX1JFU1AsCi0JCQkJICAgICAgIGJ1ZiwgbGVuKTsKKwlyZXQgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCSAgICAgICBXTUlfRlJBTUVfUFJPQkVfUkVTUCwgYnVmLCBsZW4pOwogCWtmcmVlKGJ1Zik7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE0ODMsMzYgKzIwNzMsMzkgQEAKIAkJCSAgICBzdHJ1Y3QgYmVhY29uX3BhcmFtZXRlcnMgKmluZm8sIGJvb2wgYWRkKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7CiAJdTggKmllczsKIAlpbnQgaWVzX2xlbjsKIAlzdHJ1Y3Qgd21pX2Nvbm5lY3RfY21kIHA7CiAJaW50IHJlczsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0OwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IGFkZD0lZFxuIiwgX19mdW5jX18sIGFkZCk7CiAKLQlpZiAoIWF0aDZrbF9jZmc4MDIxMV9yZWFkeShhcikpCisJaWYgKCFhdGg2a2xfY2ZnODAyMTFfcmVhZHkodmlmKSkKIAkJcmV0dXJuIC1FSU87CiAKLQlpZiAoYXItPm5leHRfbW9kZSAhPSBBUF9ORVRXT1JLKQorCWlmICh2aWYtPm5leHRfbW9kZSAhPSBBUF9ORVRXT1JLKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoaW5mby0+YmVhY29uX2llcykgewotCQlyZXMgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgV01JX0ZSQU1FX0JFQUNPTiwKKwkJcmVzID0gYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgICAgIFdNSV9GUkFNRV9CRUFDT04sCiAJCQkJCSAgICAgICBpbmZvLT5iZWFjb25faWVzLAogCQkJCQkgICAgICAgaW5mby0+YmVhY29uX2llc19sZW4pOwogCQlpZiAocmVzKQogCQkJcmV0dXJuIHJlczsKIAl9CiAJaWYgKGluZm8tPnByb2JlcmVzcF9pZXMpIHsKLQkJcmVzID0gYXRoNmtsX3NldF9hcF9wcm9iZV9yZXNwX2llcyhhciwgaW5mby0+cHJvYmVyZXNwX2llcywKKwkJcmVzID0gYXRoNmtsX3NldF9hcF9wcm9iZV9yZXNwX2llcyh2aWYsIGluZm8tPnByb2JlcmVzcF9pZXMsCiAJCQkJCQkgICBpbmZvLT5wcm9iZXJlc3BfaWVzX2xlbik7CiAJCWlmIChyZXMpCiAJCQlyZXR1cm4gcmVzOwogCX0KIAlpZiAoaW5mby0+YXNzb2NyZXNwX2llcykgewotCQlyZXMgPSBhdGg2a2xfd21pX3NldF9hcHBpZV9jbWQoYXItPndtaSwgV01JX0ZSQU1FX0FTU09DX1JFU1AsCisJCXJlcyA9IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgICAgICBXTUlfRlJBTUVfQVNTT0NfUkVTUCwKIAkJCQkJICAgICAgIGluZm8tPmFzc29jcmVzcF9pZXMsCiAJCQkJCSAgICAgICBpbmZvLT5hc3NvY3Jlc3BfaWVzX2xlbik7CiAJCWlmIChyZXMpCkBAIC0xNTM5LDEyICsyMTMyLDE0IEBACiAKIAlpZiAoaW5mby0+c3NpZCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKLQltZW1jcHkoYXItPnNzaWQsIGluZm8tPnNzaWQsIGluZm8tPnNzaWRfbGVuKTsKLQlhci0+c3NpZF9sZW4gPSBpbmZvLT5zc2lkX2xlbjsKKwltZW1jcHkodmlmLT5zc2lkLCBpbmZvLT5zc2lkLCBpbmZvLT5zc2lkX2xlbik7CisJdmlmLT5zc2lkX2xlbiA9IGluZm8tPnNzaWRfbGVuOwogCWlmIChpbmZvLT5oaWRkZW5fc3NpZCAhPSBOTDgwMjExX0hJRERFTl9TU0lEX05PVF9JTl9VU0UpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsgLyogVE9ETyAqLwogCi0JYXItPmRvdDExX2F1dGhfbW9kZSA9IE9QRU5fQVVUSDsKKwlyZXQgPSBhdGg2a2xfc2V0X2F1dGhfdHlwZSh2aWYsIGluZm8tPmF1dGhfdHlwZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKIAogCW1lbXNldCgmcCwgMCwgc2l6ZW9mKHApKTsKIApAQCAtMTU2Niw3ICsyMTYxLDcgQEAKIAl9CiAJaWYgKHAuYXV0aF9tb2RlID09IDApCiAJCXAuYXV0aF9tb2RlID0gTk9ORV9BVVRIOwotCWFyLT5hdXRoX21vZGUgPSBwLmF1dGhfbW9kZTsKKwl2aWYtPmF1dGhfbW9kZSA9IHAuYXV0aF9tb2RlOwogCiAJZm9yIChpID0gMDsgaSA8IGluZm8tPmNyeXB0by5uX2NpcGhlcnNfcGFpcndpc2U7IGkrKykgewogCQlzd2l0Y2ggKGluZm8tPmNyeXB0by5jaXBoZXJzX3BhaXJ3aXNlW2ldKSB7CkBAIC0xNTgwLDEzICsyMTc1LDE2IEBACiAJCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKIAkJCXAucHJ3aXNlX2NyeXB0b190eXBlIHw9IEFFU19DUllQVDsKIAkJCWJyZWFrOworCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1NNUzQ6CisJCQlwLnByd2lzZV9jcnlwdG9fdHlwZSB8PSBXQVBJX0NSWVBUOworCQkJYnJlYWs7CiAJCX0KIAl9CiAJaWYgKHAucHJ3aXNlX2NyeXB0b190eXBlID09IDApIHsKIAkJcC5wcndpc2VfY3J5cHRvX3R5cGUgPSBOT05FX0NSWVBUOwotCQlhdGg2a2xfc2V0X2NpcGhlcihhciwgMCwgdHJ1ZSk7CisJCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgMCwgdHJ1ZSk7CiAJfSBlbHNlIGlmIChpbmZvLT5jcnlwdG8ubl9jaXBoZXJzX3BhaXJ3aXNlID09IDEpCi0JCWF0aDZrbF9zZXRfY2lwaGVyKGFyLCBpbmZvLT5jcnlwdG8uY2lwaGVyc19wYWlyd2lzZVswXSwgdHJ1ZSk7CisJCWF0aDZrbF9zZXRfY2lwaGVyKHZpZiwgaW5mby0+Y3J5cHRvLmNpcGhlcnNfcGFpcndpc2VbMF0sIHRydWUpOwogCiAJc3dpdGNoIChpbmZvLT5jcnlwdG8uY2lwaGVyX2dyb3VwKSB7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKQEAgLTE1OTksMjEgKzIxOTcsMzQgQEAKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCXAuZ3JwX2NyeXB0b190eXBlID0gQUVTX0NSWVBUOwogCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1NNUzQ6CisJCXAuZ3JwX2NyeXB0b190eXBlID0gV0FQSV9DUllQVDsKKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcC5ncnBfY3J5cHRvX3R5cGUgPSBOT05FX0NSWVBUOwogCQlicmVhazsKIAl9Ci0JYXRoNmtsX3NldF9jaXBoZXIoYXIsIGluZm8tPmNyeXB0by5jaXBoZXJfZ3JvdXAsIGZhbHNlKTsKKwlhdGg2a2xfc2V0X2NpcGhlcih2aWYsIGluZm8tPmNyeXB0by5jaXBoZXJfZ3JvdXAsIGZhbHNlKTsKIAogCXAubndfdHlwZSA9IEFQX05FVFdPUks7Ci0JYXItPm53X3R5cGUgPSBhci0+bmV4dF9tb2RlOworCXZpZi0+bndfdHlwZSA9IHZpZi0+bmV4dF9tb2RlOwogCi0JcC5zc2lkX2xlbiA9IGFyLT5zc2lkX2xlbjsKLQltZW1jcHkocC5zc2lkLCBhci0+c3NpZCwgYXItPnNzaWRfbGVuKTsKLQlwLmRvdDExX2F1dGhfbW9kZSA9IGFyLT5kb3QxMV9hdXRoX21vZGU7Ci0JcC5jaCA9IGNwdV90b19sZTE2KGFyLT5uZXh0X2NoYW4pOworCXAuc3NpZF9sZW4gPSB2aWYtPnNzaWRfbGVuOworCW1lbWNweShwLnNzaWQsIHZpZi0+c3NpZCwgdmlmLT5zc2lkX2xlbik7CisJcC5kb3QxMV9hdXRoX21vZGUgPSB2aWYtPmRvdDExX2F1dGhfbW9kZTsKKwlwLmNoID0gY3B1X3RvX2xlMTYodmlmLT5uZXh0X2NoYW4pOwogCi0JcmVzID0gYXRoNmtsX3dtaV9hcF9wcm9maWxlX2NvbW1pdChhci0+d21pLCAmcCk7CisJaWYgKHZpZi0+d2Rldi5pZnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB7CisJCXAubndfc3VidHlwZSA9IFNVQlRZUEVfUDJQR087CisJfSBlbHNlIHsKKwkJLyoKKwkJICogRHVlIHRvIGZpcm13YXJlIGxpbWl0YXRpb24sIGl0IGlzIG5vdCBwb3NzaWJsZSB0bworCQkgKiBkbyBQMlAgbWdtdCBvcGVyYXRpb25zIGluIEFQIG1vZGUKKwkJICovCisJCXAubndfc3VidHlwZSA9IFNVQlRZUEVfTk9ORTsKKwl9CisKKwlyZXMgPSBhdGg2a2xfd21pX2FwX3Byb2ZpbGVfY29tbWl0KGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgJnApOwogCWlmIChyZXMgPCAwKQogCQlyZXR1cm4gcmVzOwogCkBAIC0xNjM1LDE0ICsyMjQ2LDE1IEBACiBzdGF0aWMgaW50IGF0aDZrbF9kZWxfYmVhY29uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaWYgKGFyLT5ud190eXBlICE9IEFQX05FVFdPUkspCisJaWYgKHZpZi0+bndfdHlwZSAhPSBBUF9ORVRXT1JLKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JaWYgKCF0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykpCisJaWYgKCF0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkKIAkJcmV0dXJuIC1FTk9UQ09OTjsKIAotCWF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoYXItPndtaSk7Ci0JY2xlYXJfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKTsKKwlhdGg2a2xfd21pX2Rpc2Nvbm5lY3RfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCk7CisJY2xlYXJfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNjUxLDggKzIyNjMsOSBAQAogCQkJCSB1OCAqbWFjLCBzdHJ1Y3Qgc3RhdGlvbl9wYXJhbWV0ZXJzICpwYXJhbXMpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaWYgKGFyLT5ud190eXBlICE9IEFQX05FVFdPUkspCisJaWYgKHZpZi0+bndfdHlwZSAhPSBBUF9ORVRXT1JLKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBVc2UgdGhpcyBvbmx5IGZvciBhdXRob3JpemluZy91bmF1dGhvcml6aW5nIGEgc3RhdGlvbiAqLwpAQCAtMTY2MCwxMCArMjI3MywxMCBAQAogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAocGFyYW1zLT5zdGFfZmxhZ3Nfc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCkpCi0JCXJldHVybiBhdGg2a2xfd21pX2FwX3NldF9tbG1lKGFyLT53bWksIFdNSV9BUF9NTE1FX0FVVEhPUklaRSwKLQkJCQkJICAgICAgbWFjLCAwKTsKLQlyZXR1cm4gYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShhci0+d21pLCBXTUlfQVBfTUxNRV9VTkFVVEhPUklaRSwgbWFjLAotCQkJCSAgICAgIDApOworCQlyZXR1cm4gYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgICAgIFdNSV9BUF9NTE1FX0FVVEhPUklaRSwgbWFjLCAwKTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJICAgICAgV01JX0FQX01MTUVfVU5BVVRIT1JJWkUsIG1hYywgMCk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX3JlbWFpbl9vbl9jaGFubmVsKHN0cnVjdCB3aXBoeSAqd2lwaHksCkBAIC0xNjc0LDEzICsyMjg3LDIwIEBACiAJCQkJICAgIHU2NCAqY29va2llKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MzIgaWQ7CiAKIAkvKiBUT0RPOiBpZiBhbHJlYWR5IHBlbmRpbmcgb3Igb25nb2luZyByZW1haW4tb24tY2hhbm5lbCwKIAkgKiByZXR1cm4gLUVCVVNZICovCi0JKmNvb2tpZSA9IDE7IC8qIG9ubHkgYSBzaW5nbGUgcGVuZGluZyByZXF1ZXN0IGlzIHN1cHBvcnRlZCAqLworCWlkID0gKyt2aWYtPmxhc3Rfcm9jX2lkOworCWlmIChpZCA9PSAwKSB7CisJCS8qIERvIG5vdCB1c2UgMCBhcyB0aGUgY29va2llIHZhbHVlICovCisJCWlkID0gKyt2aWYtPmxhc3Rfcm9jX2lkOworCX0KKwkqY29va2llID0gaWQ7CiAKLQlyZXR1cm4gYXRoNmtsX3dtaV9yZW1haW5fb25fY2hubF9jbWQoYXItPndtaSwgY2hhbi0+Y2VudGVyX2ZyZXEsCi0JCQkJCSAgICAgZHVyYXRpb24pOworCXJldHVybiBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgICAgY2hhbi0+Y2VudGVyX2ZyZXEsIGR1cmF0aW9uKTsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKHN0cnVjdCB3aXBoeSAqd2lwaHksCkBAIC0xNjg4LDE2ICsyMzA4LDIwIEBACiAJCQkJCSAgIHU2NCBjb29raWUpCiB7CiAJc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCi0JaWYgKGNvb2tpZSAhPSAxKQorCWlmIChjb29raWUgIT0gdmlmLT5sYXN0X3JvY19pZCkKIAkJcmV0dXJuIC1FTk9FTlQ7CisJdmlmLT5sYXN0X2NhbmNlbF9yb2NfaWQgPSBjb29raWU7CiAKLQlyZXR1cm4gYXRoNmtsX3dtaV9jYW5jZWxfcmVtYWluX29uX2NobmxfY21kKGFyLT53bWkpOworCXJldHVybiBhdGg2a2xfd21pX2NhbmNlbF9yZW1haW5fb25fY2hubF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4KTsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2VuZF9nb19wcm9iZV9yZXNwKHN0cnVjdCBhdGg2a2wgKmFyLCBjb25zdCB1OCAqYnVmLAotCQkJCSAgICAgc2l6ZV90IGxlbiwgdW5zaWduZWQgaW50IGZyZXEpCitzdGF0aWMgaW50IGF0aDZrbF9zZW5kX2dvX3Byb2JlX3Jlc3Aoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwKKwkJCQkgICAgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sCisJCQkJICAgICB1bnNpZ25lZCBpbnQgZnJlcSkKIHsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJY29uc3QgdTggKnBvczsKIAl1OCAqcDJwOwogCWludCBwMnBfbGVuOwpAQCAtMTcyNCw4ICsyMzQ4LDggQEAKIAkJcG9zICs9IDIgKyBwb3NbMV07CiAJfQogCi0JcmV0ID0gYXRoNmtsX3dtaV9zZW5kX3Byb2JlX3Jlc3BvbnNlX2NtZChhci0+d21pLCBmcmVxLCBtZ210LT5kYSwKLQkJCQkJCSBwMnAsIHAycF9sZW4pOworCXJldCA9IGF0aDZrbF93bWlfc2VuZF9wcm9iZV9yZXNwb25zZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LCBmcmVxLAorCQkJCQkJIG1nbXQtPmRhLCBwMnAsIHAycF9sZW4pOwogCWtmcmVlKHAycCk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE3MzQsNDQgKzIzNTgsNjEgQEAKIAkJCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLCBib29sIG9mZmNoYW4sCiAJCQkgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAogCQkJICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwgdW5zaWduZWQgaW50IHdhaXQsCi0JCQkgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sIGJvb2wgbm9fY2NrLCB1NjQgKmNvb2tpZSkKKwkJCSAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCBub19jY2ssCisJCQkgIGJvb2wgZG9udF93YWl0X2Zvcl9hY2ssIHU2NCAqY29va2llKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAl1MzIgaWQ7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210OwogCiAJbWdtdCA9IChjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgYnVmOwogCWlmIChidWYgKyBsZW4gPj0gbWdtdC0+dS5wcm9iZV9yZXNwLnZhcmlhYmxlICYmCi0JICAgIGFyLT5ud190eXBlID09IEFQX05FVFdPUksgJiYgdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpICYmCisJICAgIHZpZi0+bndfdHlwZSA9PSBBUF9ORVRXT1JLICYmIHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpICYmCiAJICAgIGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKG1nbXQtPmZyYW1lX2NvbnRyb2wpKSB7CiAJCS8qCiAJCSAqIFNlbmQgUHJvYmUgUmVzcG9uc2UgZnJhbWUgaW4gQVAgbW9kZSB1c2luZyBhIHNlcGFyYXRlIFdNSQogCQkgKiBjb21tYW5kIHRvIGFsbG93IHRoZSB0YXJnZXQgdG8gZmlsbCBpbiB0aGUgZ2VuZXJpYyBJRXMuCiAJCSAqLwogCQkqY29va2llID0gMDsgLyogVFggc3RhdHVzIG5vdCBzdXBwb3J0ZWQgKi8KLQkJcmV0dXJuIGF0aDZrbF9zZW5kX2dvX3Byb2JlX3Jlc3AoYXIsIGJ1ZiwgbGVuLAorCQlyZXR1cm4gYXRoNmtsX3NlbmRfZ29fcHJvYmVfcmVzcCh2aWYsIGJ1ZiwgbGVuLAogCQkJCQkJIGNoYW4tPmNlbnRlcl9mcmVxKTsKIAl9CiAKLQlpZCA9IGFyLT5zZW5kX2FjdGlvbl9pZCsrOworCWlkID0gdmlmLT5zZW5kX2FjdGlvbl9pZCsrOwogCWlmIChpZCA9PSAwKSB7CiAJCS8qCiAJCSAqIDAgaXMgYSByZXNlcnZlZCB2YWx1ZSBpbiB0aGUgV01JIGNvbW1hbmQgYW5kIHNoYWxsIG5vdCBiZQogCQkgKiB1c2VkIGZvciB0aGUgY29tbWFuZC4KIAkJICovCi0JCWlkID0gYXItPnNlbmRfYWN0aW9uX2lkKys7CisJCWlkID0gdmlmLT5zZW5kX2FjdGlvbl9pZCsrOwogCX0KIAogCSpjb29raWUgPSBpZDsKLQlyZXR1cm4gYXRoNmtsX3dtaV9zZW5kX2FjdGlvbl9jbWQoYXItPndtaSwgaWQsIGNoYW4tPmNlbnRlcl9mcmVxLCB3YWl0LAotCQkJCQkgIGJ1ZiwgbGVuKTsKKworCWlmICh0ZXN0X2JpdChBVEg2S0xfRldfQ0FQQUJJTElUWV9TVEFfUDJQREVWX0RVUExFWCwKKwkJICAgIGFyLT5md19jYXBhYmlsaXRpZXMpKSB7CisJCS8qCisJCSAqIElmIGNhcGFibGUgb2YgZG9pbmcgUDJQIG1nbXQgb3BlcmF0aW9ucyB1c2luZworCQkgKiBzdGF0aW9uIGludGVyZmFjZSwgc2VuZCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGxpa2UKKwkJICogc3VwcG9ydGVkIHJhdGVzIHRvIGFkdmVydGlzZSBhbmQgeG1pdCByYXRlcyBmb3IKKwkJICogcHJvYmUgcmVxdWVzdHMKKwkJICovCisJCXJldHVybiBhdGg2a2xfd21pX3NlbmRfbWdtdF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LCBpZCwKKwkJCQkJCWNoYW4tPmNlbnRlcl9mcmVxLCB3YWl0LAorCQkJCQkJYnVmLCBsZW4sIG5vX2Njayk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIGF0aDZrbF93bWlfc2VuZF9hY3Rpb25fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgaWQsCisJCQkJCQkgIGNoYW4tPmNlbnRlcl9mcmVxLCB3YWl0LAorCQkJCQkJICBidWYsIGxlbik7CisJfQogfQogCiBzdGF0aWMgdm9pZCBhdGg2a2xfbWdtdF9mcmFtZV9yZWdpc3RlcihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgICAgICB1MTYgZnJhbWVfdHlwZSwgYm9vbCByZWcpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiJXM6IGZyYW1lX3R5cGU9MHgleCByZWc9JWRcbiIsCiAJCSAgIF9fZnVuY19fLCBmcmFtZV90eXBlLCByZWcpOwpAQCAtMTc4MSwxMCArMjQyMiw5NCBAQAogCQkgKiB3ZSBjYW5ub3Qgc2VuZCBXTUlfUFJPQkVfUkVRX1JFUE9SVF9DTUQgaGVyZS4gSW5zdGVhZCwgd2UKIAkJICogaGFyZGNvZGUgdGFyZ2V0IHRvIHJlcG9ydCBQcm9iZSBSZXF1ZXN0IGZyYW1lcyBhbGwgdGhlIHRpbWUuCiAJCSAqLwotCQlhci0+cHJvYmVfcmVxX3JlcG9ydCA9IHJlZzsKKwkJdmlmLT5wcm9iZV9yZXFfcmVwb3J0ID0gcmVnOwogCX0KIH0KIAorc3RhdGljIGludCBhdGg2a2xfY2ZnODAyMTFfc3NjYW5fc3RhcnQoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgY2ZnODAyMTFfc2NoZWRfc2Nhbl9yZXF1ZXN0ICpyZXF1ZXN0KQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwl1MTYgaW50ZXJ2YWw7CisJaW50IHJldDsKKwl1OCBpOworCisJaWYgKGFyLT5zdGF0ZSAhPSBBVEg2S0xfU1RBVEVfT04pCisJCXJldHVybiAtRUlPOworCisJaWYgKHZpZi0+c21lX3N0YXRlICE9IFNNRV9ESVNDT05ORUNURUQpCisJCXJldHVybiAtRUJVU1k7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXItPndpcGh5LT5tYXhfc2NoZWRfc2Nhbl9zc2lkczsgaSsrKSB7CisJCWF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkgIGksIERJU0FCTEVfU1NJRF9GTEFHLAorCQkJCQkgIDAsIE5VTEwpOworCX0KKworCS8qIGZ3IHVzZXMgc2Vjb25kcywgYWxzbyBtYWtlIHN1cmUgdGhhdCBpdCdzID4wICovCisJaW50ZXJ2YWwgPSBtYXhfdCh1MTYsIDEsIHJlcXVlc3QtPmludGVydmFsIC8gMTAwMCk7CisKKwlhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkgIGludGVydmFsLCBpbnRlcnZhbCwKKwkJCQkgIDEwLCAwLCAwLCAwLCAzLCAwLCAwLCAwKTsKKworCWlmIChyZXF1ZXN0LT5uX3NzaWRzICYmIHJlcXVlc3QtPnNzaWRzWzBdLnNzaWRfbGVuKSB7CisJCWZvciAoaSA9IDA7IGkgPCByZXF1ZXN0LT5uX3NzaWRzOyBpKyspIHsKKwkJCWF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJICBpLCBTUEVDSUZJQ19TU0lEX0ZMQUcsCisJCQkJCQkgIHJlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuLAorCQkJCQkJICByZXF1ZXN0LT5zc2lkc1tpXS5zc2lkKTsKKwkJfQorCX0KKworCXJldCA9IGF0aDZrbF93bWlfc2V0X3dvd19tb2RlX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgQVRINktMX1dPV19NT0RFX0VOQUJMRSwKKwkJCQkJICBXT1dfRklMVEVSX1NTSUQsCisJCQkJCSAgV09XX0hPU1RfUkVRX0RFTEFZKTsKKwlpZiAocmV0KSB7CisJCWF0aDZrbF93YXJuKCJGYWlsZWQgdG8gZW5hYmxlIHdvdyB3aXRoIHNzaWQgZmlsdGVyOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiB0aGlzIGFsc28gY2xlYXJzIElFIGluIGZ3IGlmIGl0J3Mgbm90IHNldCAqLworCXJldCA9IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJICAgICAgIFdNSV9GUkFNRV9QUk9CRV9SRVEsCisJCQkJICAgICAgIHJlcXVlc3QtPmllLCByZXF1ZXN0LT5pZV9sZW4pOworCWlmIChyZXQpIHsKKwkJYXRoNmtsX3dhcm4oIkZhaWxlZCB0byBzZXQgcHJvYmUgcmVxdWVzdCBJRSBmb3Igc2NoZWR1bGVkIHNjYW46ICVkIiwKKwkJCSAgICByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGF0aDZrbF93bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJIEFUSDZLTF9IT1NUX01PREVfQVNMRUVQKTsKKwlpZiAocmV0KSB7CisJCWF0aDZrbF93YXJuKCJGYWlsZWQgdG8gZW5hYmxlIGhvc3Qgc2xlZXAgbW9kZSBmb3Igc2NoZWQgc2NhbjogJWRcbiIsCisJCQkgICAgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlhci0+c3RhdGUgPSBBVEg2S0xfU1RBVEVfU0NIRURfU0NBTjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX2NmZzgwMjExX3NzY2FuX3N0b3Aoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOworCWJvb2wgc3RvcHBlZDsKKworCXN0b3BwZWQgPSBfX2F0aDZrbF9jZmc4MDIxMV9zc2Nhbl9zdG9wKHZpZik7CisKKwlpZiAoIXN0b3BwZWQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4cnhfc3R5cGVzCiBhdGg2a2xfbWdtdF9zdHlwZXNbTlVNX05MODAyMTFfSUZUWVBFU10gPSB7CiAJW05MODAyMTFfSUZUWVBFX1NUQVRJT05dID0gewpAQCAtMTgwOCw2ICsyNTMzLDggQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfb3BzIGF0aDZrbF9jZmc4MDIxMV9vcHMgPSB7CisJLmFkZF92aXJ0dWFsX2ludGYgPSBhdGg2a2xfY2ZnODAyMTFfYWRkX2lmYWNlLAorCS5kZWxfdmlydHVhbF9pbnRmID0gYXRoNmtsX2NmZzgwMjExX2RlbF9pZmFjZSwKIAkuY2hhbmdlX3ZpcnR1YWxfaW50ZiA9IGF0aDZrbF9jZmc4MDIxMV9jaGFuZ2VfaWZhY2UsCiAJLnNjYW4gPSBhdGg2a2xfY2ZnODAyMTFfc2NhbiwKIAkuY29ubmVjdCA9IGF0aDZrbF9jZmc4MDIxMV9jb25uZWN0LApAQCAtMTgyOCw3ICsyNTU1LDggQEAKIAkuZmx1c2hfcG1rc2EgPSBhdGg2a2xfZmx1c2hfcG1rc2EsCiAJQ0ZHODAyMTFfVEVTVE1PREVfQ01EKGF0aDZrbF90bV9jbWQpCiAjaWZkZWYgQ09ORklHX1BNCi0JLnN1c3BlbmQgPSBhcjZrX2NmZzgwMjExX3N1c3BlbmQsCisJLnN1c3BlbmQgPSBfX2F0aDZrbF9jZmc4MDIxMV9zdXNwZW5kLAorCS5yZXN1bWUgPSBfX2F0aDZrbF9jZmc4MDIxMV9yZXN1bWUsCiAjZW5kaWYKIAkuc2V0X2NoYW5uZWwgPSBhdGg2a2xfc2V0X2NoYW5uZWwsCiAJLmFkZF9iZWFjb24gPSBhdGg2a2xfYWRkX2JlYWNvbiwKQEAgLTE4MzksNzggKzI1NjcsMjc3IEBACiAJLmNhbmNlbF9yZW1haW5fb25fY2hhbm5lbCA9IGF0aDZrbF9jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwsCiAJLm1nbXRfdHggPSBhdGg2a2xfbWdtdF90eCwKIAkubWdtdF9mcmFtZV9yZWdpc3RlciA9IGF0aDZrbF9tZ210X2ZyYW1lX3JlZ2lzdGVyLAorCS5zY2hlZF9zY2FuX3N0YXJ0ID0gYXRoNmtsX2NmZzgwMjExX3NzY2FuX3N0YXJ0LAorCS5zY2hlZF9zY2FuX3N0b3AgPSBhdGg2a2xfY2ZnODAyMTFfc3NjYW5fc3RvcCwKIH07CiAKLXN0cnVjdCB3aXJlbGVzc19kZXYgKmF0aDZrbF9jZmc4MDIxMV9pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKK3ZvaWQgYXRoNmtsX2NmZzgwMjExX3N0b3Aoc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwotCXN0cnVjdCBhdGg2a2wgKmFyOworCWF0aDZrbF9jZmc4MDIxMV9zc2Nhbl9kaXNhYmxlKHZpZik7CiAKLQl3ZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHdpcmVsZXNzX2RldiksIEdGUF9LRVJORUwpOwotCWlmICghd2RldikgewotCQlhdGg2a2xfZXJyKCJjb3VsZG4ndCBhbGxvY2F0ZSB3aXJlbGVzcyBkZXZpY2VcbiIpOwotCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKHZpZi0+c21lX3N0YXRlKSB7CisJY2FzZSBTTUVfRElTQ09OTkVDVEVEOgorCQlicmVhazsKKwljYXNlIFNNRV9DT05ORUNUSU5HOgorCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdCh2aWYtPm5kZXYsIHZpZi0+YnNzaWQsIE5VTEwsIDAsCisJCQkJCU5VTEwsIDAsCisJCQkJCVdMQU5fU1RBVFVTX1VOU1BFQ0lGSUVEX0ZBSUxVUkUsCisJCQkJCUdGUF9LRVJORUwpOworCQlicmVhazsKKwljYXNlIFNNRV9DT05ORUNURUQ6CisJCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZCh2aWYtPm5kZXYsIDAsIE5VTEwsIDAsIEdGUF9LRVJORUwpOworCQlicmVhazsKIAl9CiAKLQkvKiBjcmVhdGUgYSBuZXcgd2lwaHkgZm9yIHVzZSB3aXRoIGNmZzgwMjExICovCi0Jd2Rldi0+d2lwaHkgPSB3aXBoeV9uZXcoJmF0aDZrbF9jZmc4MDIxMV9vcHMsIHNpemVvZihzdHJ1Y3QgYXRoNmtsKSk7Ci0JaWYgKCF3ZGV2LT53aXBoeSkgewotCQlhdGg2a2xfZXJyKCJjb3VsZG4ndCBhbGxvY2F0ZSB3aXBoeSBkZXZpY2VcbiIpOwotCQlrZnJlZSh3ZGV2KTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQorCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSB8fAorCSAgICB0ZXN0X2JpdChDT05ORUNUX1BFTkQsICZ2aWYtPmZsYWdzKSkKKwkJYXRoNmtsX3dtaV9kaXNjb25uZWN0X2NtZCh2aWYtPmFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCk7CiAKLQlhciA9IHdpcGh5X3ByaXYod2Rldi0+d2lwaHkpOwotCWFyLT5wMnAgPSAhIWF0aDZrbF9wMnA7CisJdmlmLT5zbWVfc3RhdGUgPSBTTUVfRElTQ09OTkVDVEVEOworCWNsZWFyX2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKTsKKwljbGVhcl9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CiAKLQl3ZGV2LT53aXBoeS0+bWdtdF9zdHlwZXMgPSBhdGg2a2xfbWdtdF9zdHlwZXM7CisJLyogZGlzYWJsZSBzY2FubmluZyAqLworCWlmIChhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKHZpZi0+YXItPndtaSwgdmlmLT5md192aWZfaWR4LCAweEZGRkYsCisJCQkJICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkgIT0gMCkKKwkJYXRoNmtsX3dhcm4oImZhaWxlZCB0byBkaXNhYmxlIHNjYW4gZHVyaW5nIHN0b3BcbiIpOwogCi0Jd2Rldi0+d2lwaHktPm1heF9yZW1haW5fb25fY2hhbm5lbF9kdXJhdGlvbiA9IDUwMDA7Ci0KLQkvKiBzZXQgZGV2aWNlIHBvaW50ZXIgZm9yIHdpcGh5ICovCi0Jc2V0X3dpcGh5X2Rldih3ZGV2LT53aXBoeSwgZGV2KTsKLQotCXdkZXYtPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAotCQlCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpIHwgQklUKE5MODAyMTFfSUZUWVBFX0FQKTsKLQlpZiAoYXItPnAycCkgewotCQl3ZGV2LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIHwKLQkJCUJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKTsKLQl9Ci0JLyogbWF4IG51bSBvZiBzc2lkcyB0aGF0IGNhbiBiZSBwcm9iZWQgZHVyaW5nIHNjYW5uaW5nICovCi0Jd2Rldi0+d2lwaHktPm1heF9zY2FuX3NzaWRzID0gTUFYX1BST0JFRF9TU0lEX0lOREVYOwotCXdkZXYtPndpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSAxMDAwOyAvKiBGSVg6IHdoYXQgaXMgY29ycmVjdCBsaW1pdD8gKi8KLQl3ZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSAmYXRoNmtsX2JhbmRfMmdoejsKLQl3ZGV2LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSAmYXRoNmtsX2JhbmRfNWdoejsKLQl3ZGV2LT53aXBoeS0+c2lnbmFsX3R5cGUgPSBDRkc4MDIxMV9TSUdOQUxfVFlQRV9NQk07Ci0KLQl3ZGV2LT53aXBoeS0+Y2lwaGVyX3N1aXRlcyA9IGNpcGhlcl9zdWl0ZXM7Ci0Jd2Rldi0+d2lwaHktPm5fY2lwaGVyX3N1aXRlcyA9IEFSUkFZX1NJWkUoY2lwaGVyX3N1aXRlcyk7Ci0KLQlyZXQgPSB3aXBoeV9yZWdpc3Rlcih3ZGV2LT53aXBoeSk7Ci0JaWYgKHJldCA8IDApIHsKLQkJYXRoNmtsX2VycigiY291bGRuJ3QgcmVnaXN0ZXIgd2lwaHkgZGV2aWNlXG4iKTsKLQkJd2lwaHlfZnJlZSh3ZGV2LT53aXBoeSk7Ci0JCWtmcmVlKHdkZXYpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlyZXR1cm4gd2RldjsKKwlhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudCh2aWYsIHRydWUpOwogfQogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV9kZWluaXQoc3RydWN0IGF0aDZrbCAqYXIpCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9zdG9wX2FsbChzdHJ1Y3QgYXRoNmtsICphcikKIHsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gYXItPndkZXY7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZjsKIAotCWlmIChhci0+c2Nhbl9yZXEpIHsKLQkJY2ZnODAyMTFfc2Nhbl9kb25lKGFyLT5zY2FuX3JlcSwgdHJ1ZSk7Ci0JCWFyLT5zY2FuX3JlcSA9IE5VTEw7CisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpIHsKKwkJLyogc2F2ZSB0aGUgY3VycmVudCBwb3dlciBtb2RlIGJlZm9yZSBlbmFibGluZyBwb3dlciBzYXZlICovCisJCWFyLT53bWktPnNhdmVkX3B3cl9tb2RlID0gYXItPndtaS0+cHdyX21vZGU7CisKKwkJaWYgKGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChhci0+d21pLCAwLCBSRUNfUE9XRVIpICE9IDApCisJCQlhdGg2a2xfd2FybigiYXRoNmtsX2RlZXBfc2xlZXBfZW5hYmxlOiAiCisJCQkJICAgICJ3bWlfcG93ZXJtb2RlX2NtZCBmYWlsZWRcbiIpOworCQlyZXR1cm47CiAJfQogCi0JaWYgKCF3ZGV2KQotCQlyZXR1cm47CisJLyoKKwkgKiBGSVhNRTogd2Ugc2hvdWxkIHRha2UgYXItPmxpc3RfbG9jayB0byBwcm90ZWN0IGNoYW5nZXMgaW4gdGhlCisJICogdmlmX2xpc3QsIGJ1dCB0aGF0J3Mgbm90IHRyaXZpYWwgdG8gZG8gYXMgYXRoNmtsX2NmZzgwMjExX3N0b3AoKQorCSAqIHNsZWVwcy4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZpZiwgJmFyLT52aWZfbGlzdCwgbGlzdCkKKwkJYXRoNmtsX2NmZzgwMjExX3N0b3AodmlmKTsKK30KIAotCXdpcGh5X3VucmVnaXN0ZXIod2Rldi0+d2lwaHkpOwotCXdpcGh5X2ZyZWUod2Rldi0+d2lwaHkpOwotCWtmcmVlKHdkZXYpOworc3RydWN0IGF0aDZrbCAqYXRoNmtsX2NvcmVfYWxsb2Moc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCBhdGg2a2wgKmFyOworCXN0cnVjdCB3aXBoeSAqd2lwaHk7CisJdTggY3RyOworCisJLyogY3JlYXRlIGEgbmV3IHdpcGh5IGZvciB1c2Ugd2l0aCBjZmc4MDIxMSAqLworCXdpcGh5ID0gd2lwaHlfbmV3KCZhdGg2a2xfY2ZnODAyMTFfb3BzLCBzaXplb2Yoc3RydWN0IGF0aDZrbCkpOworCisJaWYgKCF3aXBoeSkgeworCQlhdGg2a2xfZXJyKCJjb3VsZG4ndCBhbGxvY2F0ZSB3aXBoeSBkZXZpY2VcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlhciA9IHdpcGh5X3ByaXYod2lwaHkpOworCWFyLT5wMnAgPSAhIWF0aDZrbF9wMnA7CisJYXItPndpcGh5ID0gd2lwaHk7CisJYXItPmRldiA9IGRldjsKKworCWFyLT52aWZfbWF4ID0gMTsKKworCWFyLT5tYXhfbm9ybV9pZmFjZSA9IDE7CisKKwlzcGluX2xvY2tfaW5pdCgmYXItPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZhci0+bWNhc3Rwc3FfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmFyLT5saXN0X2xvY2spOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmYXItPmV2ZW50X3dxKTsKKwlzZW1hX2luaXQoJmFyLT5zZW0sIDEpOworCisJSU5JVF9MSVNUX0hFQUQoJmFyLT5hbXNkdV9yeF9idWZmZXJfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZhci0+dmlmX2xpc3QpOworCisJY2xlYXJfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpOworCWNsZWFyX2JpdChTS0lQX1NDQU4sICZhci0+ZmxhZyk7CisJY2xlYXJfYml0KERFU1RST1lfSU5fUFJPR1JFU1MsICZhci0+ZmxhZyk7CisKKwlhci0+bGlzdGVuX2ludHZsX3QgPSBBX0RFRkFVTFRfTElTVEVOX0lOVEVSVkFMOworCWFyLT5saXN0ZW5faW50dmxfYiA9IDA7CisJYXItPnR4X3B3ciA9IDA7CisKKwlhci0+aW50cmFfYnNzID0gMTsKKwlhci0+bHJzc2lfcm9hbV90aHJlc2hvbGQgPSBERUZfTFJTU0lfUk9BTV9USFJFU0hPTEQ7CisKKwlhci0+c3RhdGUgPSBBVEg2S0xfU1RBVEVfT0ZGOworCisJbWVtc2V0KCh1OCAqKWFyLT5zdGFfbGlzdCwgMCwKKwkgICAgICAgQVBfTUFYX05VTV9TVEEgKiBzaXplb2Yoc3RydWN0IGF0aDZrbF9zdGEpKTsKKworCS8qIEluaXQgdGhlIFBTIHF1ZXVlcyAqLworCWZvciAoY3RyID0gMDsgY3RyIDwgQVBfTUFYX05VTV9TVEE7IGN0cisrKSB7CisJCXNwaW5fbG9ja19pbml0KCZhci0+c3RhX2xpc3RbY3RyXS5wc3FfbG9jayk7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmFyLT5zdGFfbGlzdFtjdHJdLnBzcSk7CisJfQorCisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXItPm1jYXN0cHNxKTsKKworCW1lbWNweShhci0+YXBfY291bnRyeV9jb2RlLCBERUZfQVBfQ09VTlRSWV9DT0RFLCAzKTsKKworCXJldHVybiBhcjsKK30KKworaW50IGF0aDZrbF9yZWdpc3Rlcl9pZWVlODAyMTFfaHcoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJc3RydWN0IHdpcGh5ICp3aXBoeSA9IGFyLT53aXBoeTsKKwlpbnQgcmV0OworCisJd2lwaHktPm1nbXRfc3R5cGVzID0gYXRoNmtsX21nbXRfc3R5cGVzOworCisJd2lwaHktPm1heF9yZW1haW5fb25fY2hhbm5lbF9kdXJhdGlvbiA9IDUwMDA7CisKKwkvKiBzZXQgZGV2aWNlIHBvaW50ZXIgZm9yIHdpcGh5ICovCisJc2V0X3dpcGh5X2Rldih3aXBoeSwgYXItPmRldik7CisKKwl3aXBoeS0+aW50ZXJmYWNlX21vZGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHwKKwkJCQkgQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKSB8CisJCQkJIEJJVChOTDgwMjExX0lGVFlQRV9BUCk7CisJaWYgKGFyLT5wMnApIHsKKwkJd2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB8CisJCQkJCSAgQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpOworCX0KKworCS8qIG1heCBudW0gb2Ygc3NpZHMgdGhhdCBjYW4gYmUgcHJvYmVkIGR1cmluZyBzY2FubmluZyAqLworCXdpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IE1BWF9QUk9CRURfU1NJRF9JTkRFWDsKKwl3aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gMTAwMDsgLyogRklYOiB3aGF0IGlzIGNvcnJlY3QgbGltaXQ/ICovCisJd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJmF0aDZrbF9iYW5kXzJnaHo7CisJd2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gJmF0aDZrbF9iYW5kXzVnaHo7CisJd2lwaHktPnNpZ25hbF90eXBlID0gQ0ZHODAyMTFfU0lHTkFMX1RZUEVfTUJNOworCisJd2lwaHktPmNpcGhlcl9zdWl0ZXMgPSBjaXBoZXJfc3VpdGVzOworCXdpcGh5LT5uX2NpcGhlcl9zdWl0ZXMgPSBBUlJBWV9TSVpFKGNpcGhlcl9zdWl0ZXMpOworCisJd2lwaHktPndvd2xhbi5mbGFncyA9IFdJUEhZX1dPV0xBTl9NQUdJQ19QS1QgfAorCQkJICAgICAgV0lQSFlfV09XTEFOX0RJU0NPTk5FQ1QgfAorCQkJICAgICAgV0lQSFlfV09XTEFOX0dUS19SRUtFWV9GQUlMVVJFICB8CisJCQkgICAgICBXSVBIWV9XT1dMQU5fU1VQUE9SVFNfR1RLX1JFS0VZIHwKKwkJCSAgICAgIFdJUEhZX1dPV0xBTl9FQVBfSURFTlRJVFlfUkVRICAgfAorCQkJICAgICAgV0lQSFlfV09XTEFOXzRXQVlfSEFORFNIQUtFOworCXdpcGh5LT53b3dsYW4ubl9wYXR0ZXJucyA9IFdPV19NQVhfRklMVEVSU19QRVJfTElTVDsKKwl3aXBoeS0+d293bGFuLnBhdHRlcm5fbWluX2xlbiA9IDE7CisJd2lwaHktPndvd2xhbi5wYXR0ZXJuX21heF9sZW4gPSBXT1dfUEFUVEVSTl9TSVpFOworCisJd2lwaHktPm1heF9zY2hlZF9zY2FuX3NzaWRzID0gMTA7CisKKwlyZXQgPSB3aXBoeV9yZWdpc3Rlcih3aXBoeSk7CisJaWYgKHJldCA8IDApIHsKKwkJYXRoNmtsX2VycigiY291bGRuJ3QgcmVnaXN0ZXIgd2lwaHkgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGg2a2xfaW5pdF9pZl9kYXRhKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCit7CisJdmlmLT5hZ2dyX2NudHh0ID0gYWdncl9pbml0KHZpZi0+bmRldik7CisJaWYgKCF2aWYtPmFnZ3JfY250eHQpIHsKKwkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgYWdnclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXNldHVwX3RpbWVyKCZ2aWYtPmRpc2Nvbm5lY3RfdGltZXIsIGRpc2Nvbm5lY3RfdGltZXJfaGFuZGxlciwKKwkJICAgICh1bnNpZ25lZCBsb25nKSB2aWYtPm5kZXYpOworCXNldHVwX3RpbWVyKCZ2aWYtPnNjaGVkX3NjYW5fdGltZXIsIGF0aDZrbF93bWlfc3NjYW5fdGltZXIsCisJCSAgICAodW5zaWduZWQgbG9uZykgdmlmKTsKKworCXNldF9iaXQoV01NX0VOQUJMRUQsICZ2aWYtPmZsYWdzKTsKKwlzcGluX2xvY2tfaW5pdCgmdmlmLT5pZl9sb2NrKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGF0aDZrbF9kZWluaXRfaWZfZGF0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKKworCWFnZ3JfbW9kdWxlX2Rlc3Ryb3kodmlmLT5hZ2dyX2NudHh0KTsKKworCWFyLT5hdmFpbF9pZHhfbWFwIHw9IEJJVCh2aWYtPmZ3X3ZpZl9pZHgpOworCisJaWYgKHZpZi0+bndfdHlwZSA9PSBBREhPQ19ORVRXT1JLKQorCQlhci0+aWJzc19pZl9hY3RpdmUgPSBmYWxzZTsKKworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlKHZpZi0+bmRldik7CisKKwlhci0+bnVtX3ZpZi0tOworfQorCitzdHJ1Y3QgbmV0X2RldmljZSAqYXRoNmtsX2ludGVyZmFjZV9hZGQoc3RydWN0IGF0aDZrbCAqYXIsIGNoYXIgKm5hbWUsCisJCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwgdTggZndfdmlmX2lkeCwKKwkJCQkJdTggbndfdHlwZSkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOworCisJbmRldiA9IGFsbG9jX25ldGRldihzaXplb2YoKnZpZiksIG5hbWUsIGV0aGVyX3NldHVwKTsKKwlpZiAoIW5kZXYpCisJCXJldHVybiBOVUxMOworCisJdmlmID0gbmV0ZGV2X3ByaXYobmRldik7CisJbmRldi0+aWVlZTgwMjExX3B0ciA9ICZ2aWYtPndkZXY7CisJdmlmLT53ZGV2LndpcGh5ID0gYXItPndpcGh5OworCXZpZi0+YXIgPSBhcjsKKwl2aWYtPm5kZXYgPSBuZGV2OworCVNFVF9ORVRERVZfREVWKG5kZXYsIHdpcGh5X2Rldih2aWYtPndkZXYud2lwaHkpKTsKKwl2aWYtPndkZXYubmV0ZGV2ID0gbmRldjsKKwl2aWYtPndkZXYuaWZ0eXBlID0gdHlwZTsKKwl2aWYtPmZ3X3ZpZl9pZHggPSBmd192aWZfaWR4OworCXZpZi0+bndfdHlwZSA9IHZpZi0+bmV4dF9tb2RlID0gbndfdHlwZTsKKworCW1lbWNweShuZGV2LT5kZXZfYWRkciwgYXItPm1hY19hZGRyLCBFVEhfQUxFTik7CisJaWYgKGZ3X3ZpZl9pZHggIT0gMCkKKwkJbmRldi0+ZGV2X2FkZHJbMF0gPSAobmRldi0+ZGV2X2FkZHJbMF0gXiAoMSA8PCBmd192aWZfaWR4KSkgfAorCQkJCSAgICAgMHgyOworCisJaW5pdF9uZXRkZXYobmRldik7CisKKwlhdGg2a2xfaW5pdF9jb250cm9sX2luZm8odmlmKTsKKworCS8qIFRPRE86IFBhc3MgaW50ZXJmYWNlIHNwZWNpZmljIHBvaW50ZXIgaW5zdGVhZCBvZiBhciAqLworCWlmIChhdGg2a2xfaW5pdF9pZl9kYXRhKHZpZikpCisJCWdvdG8gZXJyOworCisJaWYgKHJlZ2lzdGVyX25ldGRldmljZShuZGV2KSkKKwkJZ290byBlcnI7CisKKwlhci0+YXZhaWxfaWR4X21hcCAmPSB+QklUKGZ3X3ZpZl9pZHgpOworCXZpZi0+c21lX3N0YXRlID0gU01FX0RJU0NPTk5FQ1RFRDsKKwlzZXRfYml0KFdMQU5fRU5BQkxFRCwgJnZpZi0+ZmxhZ3MpOworCWFyLT53bGFuX3B3cl9zdGF0ZSA9IFdMQU5fUE9XRVJfU1RBVEVfT047CisJc2V0X2JpdChORVRERVZfUkVHSVNURVJFRCwgJnZpZi0+ZmxhZ3MpOworCisJaWYgKHR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpCisJCWFyLT5pYnNzX2lmX2FjdGl2ZSA9IHRydWU7CisKKwlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCWxpc3RfYWRkX3RhaWwoJnZpZi0+bGlzdCwgJmFyLT52aWZfbGlzdCk7CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCisJcmV0dXJuIG5kZXY7CisKK2VycjoKKwlhZ2dyX21vZHVsZV9kZXN0cm95KHZpZi0+YWdncl9jbnR4dCk7CisJZnJlZV9uZXRkZXYobmRldik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgYXRoNmtsX2RlaW5pdF9pZWVlODAyMTFfaHcoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJd2lwaHlfdW5yZWdpc3Rlcihhci0+d2lwaHkpOworCXdpcGh5X2ZyZWUoYXItPndpcGh5KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY2ZnODAyMTEuaAppbmRleCBhODRhZGMyLi44MWYyMGE1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NmZzgwMjExLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jZmc4MDIxMS5oCkBAIC0xNywyMyArMTcsNDMgQEAKICNpZm5kZWYgQVRINktMX0NGRzgwMjExX0gKICNkZWZpbmUgQVRINktMX0NGRzgwMjExX0gKIAotc3RydWN0IHdpcmVsZXNzX2RldiAqYXRoNmtsX2NmZzgwMjExX2luaXQoc3RydWN0IGRldmljZSAqZGV2KTsKLXZvaWQgYXRoNmtsX2NmZzgwMjExX2RlaW5pdChzdHJ1Y3QgYXRoNmtsICphcik7CitlbnVtIGF0aDZrbF9jZmdfc3VzcGVuZF9tb2RlIHsKKwlBVEg2S0xfQ0ZHX1NVU1BFTkRfREVFUFNMRUVQLAorCUFUSDZLTF9DRkdfU1VTUEVORF9DVVRQT1dFUiwKKwlBVEg2S0xfQ0ZHX1NVU1BFTkRfV09XLAorCUFUSDZLTF9DRkdfU1VTUEVORF9TQ0hFRF9TQ0FOLAorfTsKIAotdm9pZCBhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgaW50IHN0YXR1cyk7CitzdHJ1Y3QgbmV0X2RldmljZSAqYXRoNmtsX2ludGVyZmFjZV9hZGQoc3RydWN0IGF0aDZrbCAqYXIsIGNoYXIgKm5hbWUsCisJCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgdHlwZSwKKwkJCQkJdTggZndfdmlmX2lkeCwgdTggbndfdHlwZSk7CitpbnQgYXRoNmtsX3JlZ2lzdGVyX2llZWU4MDIxMV9odyhzdHJ1Y3QgYXRoNmtsICphcik7CitzdHJ1Y3QgYXRoNmtsICphdGg2a2xfY29yZV9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYpOwordm9pZCBhdGg2a2xfZGVpbml0X2llZWU4MDIxMV9odyhzdHJ1Y3QgYXRoNmtsICphcik7CiAKLXZvaWQgYXRoNmtsX2NmZzgwMjExX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBjaGFubmVsLAordm9pZCBhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBib29sIGFib3J0ZWQpOworCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9jb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHUxNiBjaGFubmVsLAogCQkJCSAgIHU4ICpic3NpZCwgdTE2IGxpc3Rlbl9pbnR2bCwKIAkJCQkgICB1MTYgYmVhY29uX2ludHZsLAogCQkJCSAgIGVudW0gbmV0d29ya190eXBlIG53X3R5cGUsCiAJCQkJICAgdTggYmVhY29uX2llX2xlbiwgdTggYXNzb2NfcmVxX2xlbiwKIAkJCQkgICB1OCBhc3NvY19yZXNwX2xlbiwgdTggKmFzc29jX2luZm8pOwogCi12b2lkIGF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCByZWFzb24sCit2b2lkIGF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IHJlYXNvbiwKIAkJCQkgICAgICB1OCAqYnNzaWQsIHU4IGFzc29jX3Jlc3BfbGVuLAogCQkJCSAgICAgIHU4ICphc3NvY19pbmZvLCB1MTYgcHJvdG9fcmVhc29uKTsKIAotdm9pZCBhdGg2a2xfY2ZnODAyMTFfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtleWlkLAordm9pZCBhdGg2a2xfY2ZnODAyMTFfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTgga2V5aWQsCiAJCQkJICAgICBib29sIGlzbWNhc3QpOwogCitpbnQgYXRoNmtsX2NmZzgwMjExX3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIsCisJCQkgICAgZW51bSBhdGg2a2xfY2ZnX3N1c3BlbmRfbW9kZSBtb2RlLAorCQkJICAgIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdyk7CisKK2ludCBhdGg2a2xfY2ZnODAyMTFfcmVzdW1lKHN0cnVjdCBhdGg2a2wgKmFyKTsKKwordm9pZCBhdGg2a2xfY2ZnODAyMTFfc3RvcChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKTsKK3ZvaWQgYXRoNmtsX2NmZzgwMjExX3N0b3BfYWxsKHN0cnVjdCBhdGg2a2wgKmFyKTsKKwogI2VuZGlmIC8qIEFUSDZLTF9DRkc4MDIxMV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9jb21tb24uaAppbmRleCBiOTJmMGU1Li5iZmQ2NTk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29tbW9uLmgKQEAgLTIzLDggKzIzLDYgQEAKIAogZXh0ZXJuIGludCBhdGg2a2xfcHJpbnRrKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CiAKLSNkZWZpbmUgQV9DQUNIRV9MSU5FX1BBRCAgICAgICAgICAgIDEyOAotCiAvKgogICogUmVmbGVjdHMgdGhlIHZlcnNpb24gb2YgYmluYXJ5IGludGVyZmFjZSBleHBvc2VkIGJ5IEFUSDZLTCB0YXJnZXQKICAqIGZpcm13YXJlLiBOZWVkcyB0byBiZSBpbmNyZW1lbnRlZCBieSAxIGZvciBhbnkgY2hhbmdlIGluIHRoZSBmaXJtd2FyZQpAQCAtNzMsMjUgKzcxLDE2IEBACiAJV0VQX0NSWVBUICAgICAgICAgICA9IDB4MDIsCiAJVEtJUF9DUllQVCAgICAgICAgICA9IDB4MDQsCiAJQUVTX0NSWVBUICAgICAgICAgICA9IDB4MDgsCisJV0FQSV9DUllQVCAgICAgICAgICA9IDB4MTAsCiB9OwogCiBzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0Owogc3RydWN0IGF0aDZrbDsKIGVudW0gaHRjX2NyZWRpdF9kaXN0X3JlYXNvbjsKLXN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm87CitzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbzsKIAotaW50IGF0aDZrX3NldHVwX2NyZWRpdF9kaXN0KHZvaWQgKmh0Y19oYW5kbGUsCi0JCQkgICAgc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvKTsKLXZvaWQgYXRoNmtfY3JlZGl0X2Rpc3RyaWJ1dGUoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmYsCi0JCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVwZGlzdF9saXN0LAotCQkJICAgICBlbnVtIGh0Y19jcmVkaXRfZGlzdF9yZWFzb24gcmVhc29uKTsKLXZvaWQgYXRoNmtfY3JlZGl0X2luaXQoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmYsCi0JCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICplcF9saXN0LAotCQkgICAgICAgaW50IHRvdF9jcmVkaXRzKTsKLXZvaWQgYXRoNmtfc2Vla19jcmVkaXRzKHN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm8gKmNyZWRfaW5mLAotCQkJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCk7CiBzdHJ1Y3QgYXRoNmtsICphdGg2a2xfY29yZV9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpzZGV2KTsKIGludCBhdGg2a2xfY29yZV9pbml0KHN0cnVjdCBhdGg2a2wgKmFyKTsKLWludCBhdGg2a2xfdW5hdmFpbF9ldihzdHJ1Y3QgYXRoNmtsICphcik7Cit2b2lkIGF0aDZrbF9jb3JlX2NsZWFudXAoc3RydWN0IGF0aDZrbCAqYXIpOwogc3RydWN0IHNrX2J1ZmYgKmF0aDZrbF9idWZfYWxsb2MoaW50IHNpemUpOwogI2VuZGlmIC8qIENPTU1PTl9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2NvcmUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29yZS5oCmluZGV4IDZkOGE0ODQuLmM4NjNhMjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29yZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvY29yZS5oCkBAIC03MCwxMCArNzAsMjAgQEAKIAlBVEg2S0xfRldfSUVfUkVTRVJWRURfUkFNX1NJWkUgPSA1LAogCUFUSDZLTF9GV19JRV9DQVBBQklMSVRJRVMgPSA2LAogCUFUSDZLTF9GV19JRV9QQVRDSF9BRERSID0gNywKKwlBVEg2S0xfRldfSUVfQk9BUkRfQUREUiA9IDgsCisJQVRINktMX0ZXX0lFX1ZJRl9NQVggPSA5LAogfTsKIAogZW51bSBhdGg2a2xfZndfY2FwYWJpbGl0eSB7CiAJQVRINktMX0ZXX0NBUEFCSUxJVFlfSE9TVF9QMlAgPSAwLAorCUFUSDZLTF9GV19DQVBBQklMSVRZX1NDSEVEX1NDQU4gPSAxLAorCisJLyoKKwkgKiBGaXJtd2FyZSBpcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcgUDJQIG1nbXQgb3BlcmF0aW9ucyBvbiBhCisJICogc3RhdGlvbiBpbnRlcmZhY2UuIEFmdGVyIGdyb3VwIGZvcm1hdGlvbiwgdGhlIHN0YXRpb24KKwkgKiBpbnRlcmZhY2Ugd2lsbCBiZWNvbWUgYSBQMlAgY2xpZW50L0dPIGludGVyZmFjZSBhcyB0aGUgY2FzZSBtYXkgYmUKKwkgKi8KKwlBVEg2S0xfRldfQ0FQQUJJTElUWV9TVEFfUDJQREVWX0RVUExFWCwKIAogCS8qIHRoaXMgbmVlZHMgdG8gYmUgbGFzdCAqLwogCUFUSDZLTF9GV19DQVBBQklMSVRZX01BWCwKQEAgLTg4LDM3ICs5OCw0NyBAQAogfTsKIAogLyogQVI2MDAzIDEuMCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBBUjYwMDNfUkVWMV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDMwMDAwMmJhCisjZGVmaW5lIEFSNjAwM19IV18xXzBfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgzMDAwMDJiYQogCiAvKiBBUjYwMDMgMi4wIGRlZmluaXRpb25zICovCi0jZGVmaW5lIEFSNjAwM19SRVYyX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MzAwMDAzODQKLSNkZWZpbmUgQVI2MDAzX1JFVjJfUEFUQ0hfRE9XTkxPQURfQUREUkVTUyAgMHg1N2U5MTAKLSNkZWZpbmUgQVI2MDAzX1JFVjJfT1RQX0ZJTEUgICAgICAgICAgICAgICAgImF0aDZrL0FSNjAwMy9odzIuMC9vdHAuYmluLno3NyIKLSNkZWZpbmUgQVI2MDAzX1JFVjJfRklSTVdBUkVfRklMRSAgICAgICAgICAgImF0aDZrL0FSNjAwMy9odzIuMC9hdGh3bGFuLmJpbi56NzciCi0jZGVmaW5lIEFSNjAwM19SRVYyX1RDTURfRklSTVdBUkVfRklMRSAgICAgICJhdGg2ay9BUjYwMDMvaHcyLjAvYXRodGNtZF9yYW0uYmluIgotI2RlZmluZSBBUjYwMDNfUkVWMl9QQVRDSF9GSUxFICAgICAgICAgICAgICAiYXRoNmsvQVI2MDAzL2h3Mi4wL2RhdGEucGF0Y2guYmluIgotI2RlZmluZSBBUjYwMDNfUkVWMl9GSVJNV0FSRV8yX0ZJTEUgICAgICAgICAiYXRoNmsvQVI2MDAzL2h3Mi4wL2Z3LTIuYmluIgotI2RlZmluZSBBUjYwMDNfUkVWMl9CT0FSRF9EQVRBX0ZJTEUgICAgICAgICAiYXRoNmsvQVI2MDAzL2h3Mi4wL2JkYXRhLmJpbiIKLSNkZWZpbmUgQVI2MDAzX1JFVjJfREVGQVVMVF9CT0FSRF9EQVRBX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMC9iZGF0YS5TRDMxLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMF9WRVJTSU9OICAgICAgICAgICAgICAgICAweDMwMDAwMzg0CisjZGVmaW5lIEFSNjAwM19IV18yXzBfUEFUQ0hfRE9XTkxPQURfQUREUkVTUyAgMHg1N2U5MTAKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMF9PVFBfRklMRSAiYXRoNmsvQVI2MDAzL2h3Mi4wL290cC5iaW4uejc3IgorI2RlZmluZSBBUjYwMDNfSFdfMl8wX0ZJUk1XQVJFX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMC9hdGh3bGFuLmJpbi56NzciCisjZGVmaW5lIEFSNjAwM19IV18yXzBfVENNRF9GSVJNV0FSRV9GSUxFICJhdGg2ay9BUjYwMDMvaHcyLjAvYXRodGNtZF9yYW0uYmluIgorI2RlZmluZSBBUjYwMDNfSFdfMl8wX1BBVENIX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMC9kYXRhLnBhdGNoLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMF9GSVJNV0FSRV8yX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMC9mdy0yLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMF9CT0FSRF9EQVRBX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMC9iZGF0YS5iaW4iCisjZGVmaW5lIEFSNjAwM19IV18yXzBfREVGQVVMVF9CT0FSRF9EQVRBX0ZJTEUgXAorCQkJImF0aDZrL0FSNjAwMy9odzIuMC9iZGF0YS5TRDMxLmJpbiIKIAogLyogQVI2MDAzIDMuMCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBBUjYwMDNfUkVWM19WRVJTSU9OICAgICAgICAgICAgICAgICAweDMwMDAwNTgyCi0jZGVmaW5lIEFSNjAwM19SRVYzX09UUF9GSUxFICAgICAgICAgICAgICAgICJhdGg2ay9BUjYwMDMvaHcyLjEuMS9vdHAuYmluIgotI2RlZmluZSBBUjYwMDNfUkVWM19GSVJNV0FSRV9GSUxFICAgICAgICAgICAiYXRoNmsvQVI2MDAzL2h3Mi4xLjEvYXRod2xhbi5iaW4iCi0jZGVmaW5lIEFSNjAwM19SRVYzX1RDTURfRklSTVdBUkVfRklMRSAgICAiYXRoNmsvQVI2MDAzL2h3Mi4xLjEvYXRodGNtZF9yYW0uYmluIgotI2RlZmluZSBBUjYwMDNfUkVWM19QQVRDSF9GSUxFICAgICAgICAgICAgImF0aDZrL0FSNjAwMy9odzIuMS4xL2RhdGEucGF0Y2guYmluIgotI2RlZmluZSBBUjYwMDNfUkVWM19GSVJNV0FSRV8yX0ZJTEUgICAgICAgICAgICJhdGg2ay9BUjYwMDMvaHcyLjEuMS9mdy0yLmJpbiIKLSNkZWZpbmUgQVI2MDAzX1JFVjNfQk9BUkRfREFUQV9GSUxFICAgICAgICJhdGg2ay9BUjYwMDMvaHcyLjEuMS9iZGF0YS5iaW4iCi0jZGVmaW5lIEFSNjAwM19SRVYzX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFCVwKLQkiYXRoNmsvQVI2MDAzL2h3Mi4xLjEvYmRhdGEuU0QzMS5iaW4iCisjZGVmaW5lIEFSNjAwM19IV18yXzFfMV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDMwMDAwNTgyCisjZGVmaW5lIEFSNjAwM19IV18yXzFfMV9PVFBfRklMRSAiYXRoNmsvQVI2MDAzL2h3Mi4xLjEvb3RwLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMV8xX0ZJUk1XQVJFX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMS4xL2F0aHdsYW4uYmluIgorI2RlZmluZSBBUjYwMDNfSFdfMl8xXzFfVENNRF9GSVJNV0FSRV9GSUxFIFwKKwkJCSJhdGg2ay9BUjYwMDMvaHcyLjEuMS9hdGh0Y21kX3JhbS5iaW4iCisjZGVmaW5lIEFSNjAwM19IV18yXzFfMV9QQVRDSF9GSUxFICJhdGg2ay9BUjYwMDMvaHcyLjEuMS9kYXRhLnBhdGNoLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMV8xX0ZJUk1XQVJFXzJfRklMRSAiYXRoNmsvQVI2MDAzL2h3Mi4xLjEvZnctMi5iaW4iCisjZGVmaW5lIEFSNjAwM19IV18yXzFfMV9CT0FSRF9EQVRBX0ZJTEUgImF0aDZrL0FSNjAwMy9odzIuMS4xL2JkYXRhLmJpbiIKKyNkZWZpbmUgQVI2MDAzX0hXXzJfMV8xX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFCVwKKwkJCSJhdGg2ay9BUjYwMDMvaHcyLjEuMS9iZGF0YS5TRDMxLmJpbiIKIAogLyogQVI2MDA0IDEuMCBkZWZpbml0aW9ucyAqLwotI2RlZmluZSBBUjYwMDRfUkVWMV9WRVJTSU9OICAgICAgICAgICAgICAgICAweDMwMDAwNjIzCi0jZGVmaW5lIEFSNjAwNF9SRVYxX0ZJUk1XQVJFX0ZJTEUgICAgICAgICAgICJhdGg2ay9BUjYwMDQvaHc2LjEvZncucmFtLmJpbiIKLSNkZWZpbmUgQVI2MDA0X1JFVjFfRklSTVdBUkVfMl9GSUxFICAgICAgICAgImF0aDZrL0FSNjAwNC9odzYuMS9mdy0yLmJpbiIKLSNkZWZpbmUgQVI2MDA0X1JFVjFfQk9BUkRfREFUQV9GSUxFICAgICAgICAgImF0aDZrL0FSNjAwNC9odzYuMS9iZGF0YS5iaW4iCi0jZGVmaW5lIEFSNjAwNF9SRVYxX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFICJhdGg2ay9BUjYwMDQvaHc2LjEvYmRhdGEuREIxMzIuYmluIgotI2RlZmluZSBBUjYwMDRfUkVWMV9FUFBJTkdfRklSTVdBUkVfRklMRSAiYXRoNmsvQVI2MDA0L2h3Ni4xL2VuZHBvaW50cGluZy5iaW4iCisjZGVmaW5lIEFSNjAwNF9IV18xXzBfVkVSU0lPTiAgICAgICAgICAgICAgICAgMHgzMDAwMDYyMworI2RlZmluZSBBUjYwMDRfSFdfMV8wX0ZJUk1XQVJFXzJfRklMRSAgICAgICAgICJhdGg2ay9BUjYwMDQvaHcxLjAvZnctMi5iaW4iCisjZGVmaW5lIEFSNjAwNF9IV18xXzBfRklSTVdBUkVfRklMRSAgICAgICAgICAgImF0aDZrL0FSNjAwNC9odzEuMC9mdy5yYW0uYmluIgorI2RlZmluZSBBUjYwMDRfSFdfMV8wX0JPQVJEX0RBVEFfRklMRSAgICAgICAgICJhdGg2ay9BUjYwMDQvaHcxLjAvYmRhdGEuYmluIgorI2RlZmluZSBBUjYwMDRfSFdfMV8wX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFIFwKKwkiYXRoNmsvQVI2MDA0L2h3MS4wL2JkYXRhLkRCMTMyLmJpbiIKKworLyogQVI2MDA0IDEuMSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBBUjYwMDRfSFdfMV8xX1ZFUlNJT04gICAgICAgICAgICAgICAgIDB4MzAwMDAwMDEKKyNkZWZpbmUgQVI2MDA0X0hXXzFfMV9GSVJNV0FSRV8yX0ZJTEUgICAgICAgICAiYXRoNmsvQVI2MDA0L2h3MS4xL2Z3LTIuYmluIgorI2RlZmluZSBBUjYwMDRfSFdfMV8xX0ZJUk1XQVJFX0ZJTEUgICAgICAgICAgICJhdGg2ay9BUjYwMDQvaHcxLjEvZncucmFtLmJpbiIKKyNkZWZpbmUgQVI2MDA0X0hXXzFfMV9CT0FSRF9EQVRBX0ZJTEUgICAgICAgICAiYXRoNmsvQVI2MDA0L2h3MS4xL2JkYXRhLmJpbiIKKyNkZWZpbmUgQVI2MDA0X0hXXzFfMV9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSBcCisJImF0aDZrL0FSNjAwNC9odzEuMS9iZGF0YS5EQjEzMi5iaW4iCiAKIC8qIFBlciBTVEEgZGF0YSwgdXNlZCBpbiBBUCBtb2RlICovCiAjZGVmaW5lIFNUQV9QU19BV0FLRQkJQklUKDApCkBAIC0xNjYsNiArMTg2LDcgQEAKICNkZWZpbmUgQVRINktMX0NPTkZfSUdOT1JFX1BTX0ZBSUxfRVZUX0lOX1NDQU4gIEJJVCgxKQogI2RlZmluZSBBVEg2S0xfQ09ORl9FTkFCTEVfMTFOCQkJQklUKDIpCiAjZGVmaW5lIEFUSDZLTF9DT05GX0VOQUJMRV9UWF9CVVJTVAkJQklUKDMpCisjZGVmaW5lIEFUSDZLTF9DT05GX1NVU1BFTkRfQ1VUUE9XRVIJCUJJVCg0KQogCiBlbnVtIHdsYW5fbG93X3B3cl9zdGF0ZSB7CiAJV0xBTl9QT1dFUl9TVEFURV9PTiwKQEAgLTI3MSw2ICsyOTIsOCBAQAogCXUzMiBjbWRfY3JlZGl0czsKIAlib29sIGRvbmVfc2VudDsKIAl1OCAqY21kX2J1ZjsKKwl1MzIgbWF4X2RhdGFfc2l6ZTsKKwl1MzIgbWF4X2NtZF9zaXplOwogfTsKIAogc3RydWN0IHRhcmdldF9zdGF0cyB7CkBAIC0zODAsNDAgKzQwMyw0MiBAQAogCXU4IGtleV9sZW47CiB9OwogCi0vKiBGbGFnIGluZm8gKi8KLSNkZWZpbmUgV01JX0VOQUJMRUQJMAotI2RlZmluZSBXTUlfUkVBRFkJMQotI2RlZmluZSBDT05ORUNURUQJMgotI2RlZmluZSBTVEFUU19VUERBVEVfUEVORCAzCi0jZGVmaW5lIENPTk5FQ1RfUEVORAkgIDQKLSNkZWZpbmUgV01NX0VOQUJMRUQJICA1Ci0jZGVmaW5lIE5FVFFfU1RPUFBFRAkgIDYKLSNkZWZpbmUgV01JX0NUUkxfRVBfRlVMTCAgNwotI2RlZmluZSBEVElNX0VYUElSRUQJICA4Ci0jZGVmaW5lIERFU1RST1lfSU5fUFJPR1JFU1MgIDkKLSNkZWZpbmUgTkVUREVWX1JFR0lTVEVSRUQgICAgMTAKLSNkZWZpbmUgU0tJUF9TQ0FOCSAgICAgMTEKLSNkZWZpbmUgV0xBTl9FTkFCTEVECSAgICAgMTIKLSNkZWZpbmUgVEVTVE1PREUJICAgICAxMwotI2RlZmluZSBDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OIDE0Ci0jZGVmaW5lIERUSU1fUEVSSU9EX0FWQUlMICAgIDE1CitlbnVtIGF0aDZrbF9oaWZfdHlwZSB7CisJQVRINktMX0hJRl9UWVBFX1NESU8sCisJQVRINktMX0hJRl9UWVBFX1VTQiwKK307CiAKLXN0cnVjdCBhdGg2a2wgewotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0X2RldjsKLQlzdHJ1Y3QgYXRoNmtsX2JtaSBibWk7Ci0JY29uc3Qgc3RydWN0IGF0aDZrbF9oaWZfb3BzICpoaWZfb3BzOwotCXN0cnVjdCB3bWkgKndtaTsKLQlpbnQgdHhfcGVuZGluZ1tFTkRQT0lOVF9NQVhdOwotCWludCB0b3RhbF90eF9kYXRhX3BlbmQ7Ci0Jc3RydWN0IGh0Y190YXJnZXQgKmh0Y190YXJnZXQ7Ci0Jdm9pZCAqaGlmX3ByaXY7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworLyoKKyAqIERyaXZlcidzIG1heGltdW0gbGltaXQsIG5vdGUgdGhhdCBzb21lIGZpcm13YXJlcyBzdXBwb3J0IG9ubHkgb25lIHZpZgorICogYW5kIHRoZSBydW50aW1lIChjdXJyZW50KSBsaW1pdCBtdXN0IGJlIGNoZWNrZWQgZnJvbSBhci0+dmlmX21heC4KKyAqLworI2RlZmluZSBBVEg2S0xfVklGX01BWAkzCisKKy8qIHZpZiBmbGFncyBpbmZvICovCitlbnVtIGF0aDZrbF92aWZfc3RhdGUgeworCUNPTk5FQ1RFRCwKKwlDT05ORUNUX1BFTkQsCisJV01NX0VOQUJMRUQsCisJTkVUUV9TVE9QUEVELAorCURUSU1fRVhQSVJFRCwKKwlORVRERVZfUkVHSVNURVJFRCwKKwlDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLAorCURUSU1fUEVSSU9EX0FWQUlMLAorCVdMQU5fRU5BQkxFRCwKKwlTVEFUU19VUERBVEVfUEVORCwKK307CisKK3N0cnVjdCBhdGg2a2xfdmlmIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHdpcmVsZXNzX2RldiB3ZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBhdGg2a2wgKmFyOworCS8qIExvY2sgdG8gcHJvdGVjdCB2aWYgc3BlY2lmaWMgbmV0X3N0YXRzIGFuZCBmbGFncyAqLworCXNwaW5sb2NrX3QgaWZfbG9jazsKKwl1OCBmd192aWZfaWR4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHNzaWRfbGVuOwogCXU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07Ci0JdTggbmV4dF9tb2RlOwotCXU4IG53X3R5cGU7CiAJdTggZG90MTFfYXV0aF9tb2RlOwogCXU4IGF1dGhfbW9kZTsKIAl1OCBwcndpc2VfY3J5cHRvOwpAQCAtNDIxLDIxICs0NDYsOTEgQEAKIAl1OCBncnBfY3J5cHRvOwogCXU4IGdycF9jcnlwdG9fbGVuOwogCXU4IGRlZl90eGtleV9pbmRleDsKLQlzdHJ1Y3QgYXRoNmtsX3dlcF9rZXkgd2VwX2tleV9saXN0W1dNSV9NQVhfS0VZX0lOREVYICsgMV07CisJdTggbmV4dF9tb2RlOworCXU4IG53X3R5cGU7CiAJdTggYnNzaWRbRVRIX0FMRU5dOwogCXU4IHJlcV9ic3NpZFtFVEhfQUxFTl07CiAJdTE2IGNoX2hpbnQ7CiAJdTE2IGJzc19jaDsKKwlzdHJ1Y3QgYXRoNmtsX3dlcF9rZXkgd2VwX2tleV9saXN0W1dNSV9NQVhfS0VZX0lOREVYICsgMV07CisJc3RydWN0IGF0aDZrbF9rZXkga2V5c1tXTUlfTUFYX0tFWV9JTkRFWCArIDFdOworCXN0cnVjdCBhZ2dyX2luZm8gKmFnZ3JfY250eHQ7CisKKwlzdHJ1Y3QgdGltZXJfbGlzdCBkaXNjb25uZWN0X3RpbWVyOworCXN0cnVjdCB0aW1lcl9saXN0IHNjaGVkX3NjYW5fdGltZXI7CisKKwlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcTsKKwllbnVtIHNtZV9zdGF0ZSBzbWVfc3RhdGU7CisJaW50IHJlY29ubmVjdF9mbGFnOworCXUzMiBsYXN0X3JvY19pZDsKKwl1MzIgbGFzdF9jYW5jZWxfcm9jX2lkOworCXUzMiBzZW5kX2FjdGlvbl9pZDsKKwlib29sIHByb2JlX3JlcV9yZXBvcnQ7CisJdTE2IG5leHRfY2hhbjsKKwl1MTYgYXNzb2NfYnNzX2JlYWNvbl9pbnQ7CisJdTggYXNzb2NfYnNzX2R0aW1fcGVyaW9kOworCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIG5ldF9zdGF0czsKKwlzdHJ1Y3QgdGFyZ2V0X3N0YXRzIHRhcmdldF9zdGF0czsKK307CisKKyNkZWZpbmUgV09XX0xJU1RfSUQJCTAKKyNkZWZpbmUgV09XX0hPU1RfUkVRX0RFTEFZCTUwMCAvKiBtcyAqLworCisjZGVmaW5lIEFUSDZLTF9TQ0hFRF9TQ0FOX1JFU1VMVF9ERUxBWSA1MDAwIC8qIG1zICovCisKKy8qIEZsYWcgaW5mbyAqLworZW51bSBhdGg2a2xfZGV2X3N0YXRlIHsKKwlXTUlfRU5BQkxFRCwKKwlXTUlfUkVBRFksCisJV01JX0NUUkxfRVBfRlVMTCwKKwlURVNUTU9ERSwKKwlERVNUUk9ZX0lOX1BST0dSRVNTLAorCVNLSVBfU0NBTiwKKwlST0FNX1RCTF9QRU5ELAorCUZJUlNUX0JPT1QsCit9OworCitlbnVtIGF0aDZrbF9zdGF0ZSB7CisJQVRINktMX1NUQVRFX09GRiwKKwlBVEg2S0xfU1RBVEVfT04sCisJQVRINktMX1NUQVRFX0RFRVBTTEVFUCwKKwlBVEg2S0xfU1RBVEVfQ1VUUE9XRVIsCisJQVRINktMX1NUQVRFX1dPVywKKwlBVEg2S0xfU1RBVEVfU0NIRURfU0NBTiwKK307CisKK3N0cnVjdCBhdGg2a2wgeworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5OworCisJZW51bSBhdGg2a2xfc3RhdGUgc3RhdGU7CisKKwlzdHJ1Y3QgYXRoNmtsX2JtaSBibWk7CisJY29uc3Qgc3RydWN0IGF0aDZrbF9oaWZfb3BzICpoaWZfb3BzOworCXN0cnVjdCB3bWkgKndtaTsKKwlpbnQgdHhfcGVuZGluZ1tFTkRQT0lOVF9NQVhdOworCWludCB0b3RhbF90eF9kYXRhX3BlbmQ7CisJc3RydWN0IGh0Y190YXJnZXQgKmh0Y190YXJnZXQ7CisJZW51bSBhdGg2a2xfaGlmX3R5cGUgaGlmX3R5cGU7CisJdm9pZCAqaGlmX3ByaXY7CisJc3RydWN0IGxpc3RfaGVhZCB2aWZfbGlzdDsKKwkvKiBMb2NrIHRvIGF2b2lkIHJhY2UgaW4gdmlmX2xpc3QgZW50cmllcyBhbW9uZyBhZGQvZGVsL3RyYXZlcnNlICovCisJc3BpbmxvY2tfdCBsaXN0X2xvY2s7CisJdTggbnVtX3ZpZjsKKwl1bnNpZ25lZCBpbnQgdmlmX21heDsKKwl1OCBtYXhfbm9ybV9pZmFjZTsKKwl1OCBhdmFpbF9pZHhfbWFwOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKIAl1MTYgbGlzdGVuX2ludHZsX2I7CiAJdTE2IGxpc3Rlbl9pbnR2bF90OwogCXU4IGxyc3NpX3JvYW1fdGhyZXNob2xkOwogCXN0cnVjdCBhdGg2a2xfdmVyc2lvbiB2ZXJzaW9uOwogCXUzMiB0YXJnZXRfdHlwZTsKIAl1OCB0eF9wd3I7Ci0Jc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgbmV0X3N0YXRzOwotCXN0cnVjdCB0YXJnZXRfc3RhdHMgdGFyZ2V0X3N0YXRzOwogCXN0cnVjdCBhdGg2a2xfbm9kZV9tYXBwaW5nIG5vZGVfbWFwW01BWF9OT0RFX05VTV07CiAJdTggaWJzc19wc19lbmFibGU7CisJYm9vbCBpYnNzX2lmX2FjdGl2ZTsKIAl1OCBub2RlX251bTsKIAl1OCBuZXh0X2VwX2lkOwogCXN0cnVjdCBhdGg2a2xfY29va2llICpjb29raWVfbGlzdDsKQEAgLTQ0Niw3ICs1NDEsNyBAQAogCXU4IGhpYWNfc3RyZWFtX2FjdGl2ZV9wcmk7CiAJdTggZXAyYWNfbWFwW0VORFBPSU5UX01BWF07CiAJZW51bSBodGNfZW5kcG9pbnRfaWQgY3RybF9lcDsKLQlzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvIGNyZWRpdF9zdGF0ZV9pbmZvOworCXN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvIGNyZWRpdF9zdGF0ZV9pbmZvOwogCXUzMiBjb25uZWN0X2N0cmxfZmxhZ3M7CiAJdTMyIHVzZXJfa2V5X2N0cmw7CiAJdTggdXNyX2Jzc19maWx0ZXI7CkBAIC00NTYsMzAgKzU1MSwzNyBAQAogCXN0cnVjdCBza19idWZmX2hlYWQgbWNhc3Rwc3E7CiAJc3BpbmxvY2tfdCBtY2FzdHBzcV9sb2NrOwogCXU4IGludHJhX2JzczsKLQlzdHJ1Y3QgYWdncl9pbmZvICphZ2dyX2NudHh0OwogCXN0cnVjdCB3bWlfYXBfbW9kZV9zdGF0IGFwX3N0YXRzOwogCXU4IGFwX2NvdW50cnlfY29kZVszXTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGFtc2R1X3J4X2J1ZmZlcl9xdWV1ZTsKLQlzdHJ1Y3QgdGltZXJfbGlzdCBkaXNjb25uZWN0X3RpbWVyOwogCXU4IHJ4X21ldGFfdmVyOwotCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXY7Ci0Jc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXE7Ci0Jc3RydWN0IGF0aDZrbF9rZXkga2V5c1tXTUlfTUFYX0tFWV9JTkRFWCArIDFdOwotCWVudW0gc21lX3N0YXRlIHNtZV9zdGF0ZTsKIAllbnVtIHdsYW5fbG93X3B3cl9zdGF0ZSB3bGFuX3B3cl9zdGF0ZTsKLQlzdHJ1Y3Qgd21pX3NjYW5fcGFyYW1zX2NtZCBzY19wYXJhbXM7CisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwogI2RlZmluZSBBUl9NQ0FTVF9GSUxURVJfTUFDX0FERFJfU0laRSAgNAogCXN0cnVjdCB7CiAJCXZvaWQgKnJ4X3JlcG9ydDsKIAkJc2l6ZV90IHJ4X3JlcG9ydF9sZW47CiAJfSB0bTsKIAotCXN0cnVjdCB7CisJc3RydWN0IGF0aDZrbF9odyB7CisJCXUzMiBpZDsKKwkJY29uc3QgY2hhciAqbmFtZTsKIAkJdTMyIGRhdGFzZXRfcGF0Y2hfYWRkcjsKIAkJdTMyIGFwcF9sb2FkX2FkZHI7CiAJCXUzMiBhcHBfc3RhcnRfb3ZlcnJpZGVfYWRkcjsKIAkJdTMyIGJvYXJkX2V4dF9kYXRhX2FkZHI7CiAJCXUzMiByZXNlcnZlZF9yYW1fc2l6ZTsKKwkJdTMyIGJvYXJkX2FkZHI7CisJCXUzMiByZWZjbGtfaHo7CisJCXUzMiB1YXJ0dHhfcGluOworCisJCWNvbnN0IGNoYXIgKmZ3X290cDsKKwkJY29uc3QgY2hhciAqZnc7CisJCWNvbnN0IGNoYXIgKmZ3X3RjbWQ7CisJCWNvbnN0IGNoYXIgKmZ3X3BhdGNoOworCQljb25zdCBjaGFyICpmd19hcGkyOworCQljb25zdCBjaGFyICpmd19ib2FyZDsKKwkJY29uc3QgY2hhciAqZndfZGVmYXVsdF9ib2FyZDsKIAl9IGh3OwogCiAJdTE2IGNvbmZfZmxhZ3M7CkBAIC00ODcsNyArNTg5LDYgQEAKIAlzdHJ1Y3QgYXRoNmtsX21ib3hfaW5mbyBtYm94X2luZm87CiAKIAlzdHJ1Y3QgYXRoNmtsX2Nvb2tpZSBjb29raWVfbWVtW01BWF9DT09LSUVfTlVNXTsKLQlpbnQgcmVjb25uZWN0X2ZsYWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnOwogCiAJdTggKmZ3X2JvYXJkOwpAQCAtNTA4LDEzICs2MDksNyBAQAogCiAJc3RydWN0IGRlbnRyeSAqZGVidWdmc19waHk7CiAKLQl1MzIgc2VuZF9hY3Rpb25faWQ7Ci0JYm9vbCBwcm9iZV9yZXFfcmVwb3J0OwotCXUxNiBuZXh0X2NoYW47Ci0KIAlib29sIHAycDsKLQl1MTYgYXNzb2NfYnNzX2JlYWNvbl9pbnQ7Ci0JdTggYXNzb2NfYnNzX2R0aW1fcGVyaW9kOwogCiAjaWZkZWYgQ09ORklHX0FUSDZLTF9ERUJVRwogCXN0cnVjdCB7CkBAIC01MjksMjMgKzYyNCwxOSBAQAogCQlzdHJ1Y3QgewogCQkJdW5zaWduZWQgaW50IGludmFsaWRfcmF0ZTsKIAkJfSB3YXJfc3RhdHM7CisKKwkJdTggKnJvYW1fdGJsOworCQl1bnNpZ25lZCBpbnQgcm9hbV90YmxfbGVuOworCisJCXU4IGtlZXBhbGl2ZTsKKwkJdTggZGlzY190aW1lb3V0OwogCX0gZGVidWc7CiAjZW5kaWYgLyogQ09ORklHX0FUSDZLTF9ERUJVRyAqLwogfTsKIAotc3RhdGljIGlubGluZSB2b2lkICphdGg2a2xfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorc3RhdGljIGlubGluZSBzdHJ1Y3QgYXRoNmtsICphdGg2a2xfcHJpdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiB3ZGV2X3ByaXYoZGV2LT5pZWVlODAyMTFfcHRyKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGF0aDZrbF9kZXBvc2l0X2NyZWRpdF90b19lcChzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvCi0JCQkJCSAgICAgICAqY3JlZF9pbmZvLAotCQkJCQkgICAgICAgc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdAotCQkJCQkgICAgICAgKmVwX2Rpc3QsIGludCBjcmVkaXRzKQotewotCWVwX2Rpc3QtPmNyZWRpdHMgKz0gY3JlZGl0czsKLQllcF9kaXN0LT5jcmVkX2Fzc25nZCArPSBjcmVkaXRzOwotCWNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyAtPSBjcmVkaXRzOworCXJldHVybiAoKHN0cnVjdCBhdGg2a2xfdmlmICopIG5ldGRldl9wcml2KGRldikpLT5hcjsKIH0KIAogc3RhdGljIGlubGluZSB1MzIgYXRoNmtsX2dldF9oaV9pdGVtX2FkZHIoc3RydWN0IGF0aDZrbCAqYXIsCkBAIC01NjEsNyArNjUyLDYgQEAKIAlyZXR1cm4gYWRkcjsKIH0KIAotdm9pZCBhdGg2a2xfZGVzdHJveShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgdW5yZWdpc3Rlcik7CiBpbnQgYXRoNmtsX2NvbmZpZ3VyZV90YXJnZXQoc3RydWN0IGF0aDZrbCAqYXIpOwogdm9pZCBhdGg2a2xfZGV0ZWN0X2Vycm9yKHVuc2lnbmVkIGxvbmcgcHRyKTsKIHZvaWQgZGlzY29ubmVjdF90aW1lcl9oYW5kbGVyKHVuc2lnbmVkIGxvbmcgcHRyKTsKQEAgLTU3OSwxMCArNjY5LDggQEAKIGludCBhdGg2a2xfZGlhZ19yZWFkMzIoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLCB1MzIgKnZhbHVlKTsKIGludCBhdGg2a2xfZGlhZ19yZWFkKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgYWRkcmVzcywgdm9pZCAqZGF0YSwgdTMyIGxlbmd0aCk7CiBpbnQgYXRoNmtsX3JlYWRfZndsb2dzKHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKHN0cnVjdCBhdGg2a2wgKmFyKTsKK3ZvaWQgYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpOwogdm9pZCBhdGg2a2xfdHhfZGF0YV9jbGVhbnVwKHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYXRoNmtsX3N0b3BfZW5kcG9pbnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgYm9vbCBrZWVwX3Byb2ZpbGUsCi0JCQkgIGJvb2wgZ2V0X2RiZ2xvZ3MpOwogCiBzdHJ1Y3QgYXRoNmtsX2Nvb2tpZSAqYXRoNmtsX2FsbG9jX2Nvb2tpZShzdHJ1Y3QgYXRoNmtsICphcik7CiB2b2lkIGF0aDZrbF9mcmVlX2Nvb2tpZShzdHJ1Y3QgYXRoNmtsICphciwgc3RydWN0IGF0aDZrbF9jb29raWUgKmNvb2tpZSk7CkBAIC01OTgsNDAgKzY4Niw0OSBAQAogdm9pZCBhZ2dyX21vZHVsZV9kZXN0cm95KHN0cnVjdCBhZ2dyX2luZm8gKmFnZ3JfaW5mbyk7CiB2b2lkIGFnZ3JfcmVzZXRfc3RhdGUoc3RydWN0IGFnZ3JfaW5mbyAqYWdncl9pbmZvKTsKIAotc3RydWN0IGF0aDZrbF9zdGEgKmF0aDZrbF9maW5kX3N0YShzdHJ1Y3QgYXRoNmtsICphciwgdTggKiBub2RlX2FkZHIpOworc3RydWN0IGF0aDZrbF9zdGEgKmF0aDZrbF9maW5kX3N0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCAqIG5vZGVfYWRkcik7CiBzdHJ1Y3QgYXRoNmtsX3N0YSAqYXRoNmtsX2ZpbmRfc3RhX2J5X2FpZChzdHJ1Y3QgYXRoNmtsICphciwgdTggYWlkKTsKIAogdm9pZCBhdGg2a2xfcmVhZHlfZXZlbnQodm9pZCAqZGV2dCwgdTggKiBkYXRhcCwgdTMyIHN3X3ZlciwgdTMyIGFiaV92ZXIpOwogaW50IGF0aDZrbF9jb250cm9sX3R4KHZvaWQgKmRldnQsIHN0cnVjdCBza19idWZmICpza2IsCiAJCSAgICAgIGVudW0gaHRjX2VuZHBvaW50X2lkIGVpZCk7Ci12b2lkIGF0aDZrbF9jb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1MTYgY2hhbm5lbCwKK3ZvaWQgYXRoNmtsX2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGNoYW5uZWwsCiAJCQkgIHU4ICpic3NpZCwgdTE2IGxpc3Rlbl9pbnQsCiAJCQkgIHUxNiBiZWFjb25faW50LCBlbnVtIG5ldHdvcmtfdHlwZSBuZXRfdHlwZSwKIAkJCSAgdTggYmVhY29uX2llX2xlbiwgdTggYXNzb2NfcmVxX2xlbiwKIAkJCSAgdTggYXNzb2NfcmVzcF9sZW4sIHU4ICphc3NvY19pbmZvKTsKLXZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9ic3Moc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBjaGFubmVsKTsKLXZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9zdGEoc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBhaWQsIHU4ICptYWNfYWRkciwKK3ZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9ic3Moc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGNoYW5uZWwpOwordm9pZCBhdGg2a2xfY29ubmVjdF9hcF9tb2RlX3N0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1MTYgYWlkLCB1OCAqbWFjX2FkZHIsCiAJCQkJdTgga2V5bWdtdCwgdTggdWNpcGhlciwgdTggYXV0aCwKIAkJCQl1OCBhc3NvY19yZXFfbGVuLCB1OCAqYXNzb2NfaW5mbyk7Ci12b2lkIGF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCByZWFzb24sCit2b2lkIGF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IHJlYXNvbiwKIAkJCSAgICAgdTggKmJzc2lkLCB1OCBhc3NvY19yZXNwX2xlbiwKIAkJCSAgICAgdTggKmFzc29jX2luZm8sIHUxNiBwcm90X3JlYXNvbl9zdGF0dXMpOwotdm9pZCBhdGg2a2xfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtleWlkLCBib29sIGlzbWNhc3QpOwordm9pZCBhdGg2a2xfdGtpcF9taWNlcnJfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTgga2V5aWQsIGJvb2wgaXNtY2FzdCk7CiB2b2lkIGF0aDZrbF90eHB3cl9yeF9ldnQodm9pZCAqZGV2dCwgdTggdHhfcHdyKTsKLXZvaWQgYXRoNmtsX3NjYW5fY29tcGxldGVfZXZ0KHN0cnVjdCBhdGg2a2wgKmFyLCBpbnQgc3RhdHVzKTsKLXZvaWQgYXRoNmtsX3RndF9zdGF0c19ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTggKnB0ciwgdTMyIGxlbik7Cit2b2lkIGF0aDZrbF9zY2FuX2NvbXBsZXRlX2V2dChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBpbnQgc3RhdHVzKTsKK3ZvaWQgYXRoNmtsX3RndF9zdGF0c19ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCAqcHRyLCB1MzIgbGVuKTsKIHZvaWQgYXRoNmtsX2luZGljYXRlX3R4X2FjdGl2aXR5KHZvaWQgKmRldnQsIHU4IHRyYWZmaWNfY2xhc3MsIGJvb2wgYWN0aXZlKTsKIGVudW0gaHRjX2VuZHBvaW50X2lkIGF0aDZrbF9hYzJfZW5kcG9pbnRfaWQodm9pZCAqZGV2dCwgdTggYWMpOwogCi12b2lkIGF0aDZrbF9wc3BvbGxfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGFpZCk7Cit2b2lkIGF0aDZrbF9wc3BvbGxfZXZlbnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggYWlkKTsKIAotdm9pZCBhdGg2a2xfZHRpbWV4cGlyeV9ldmVudChzdHJ1Y3QgYXRoNmtsICphcik7Ci12b2lkIGF0aDZrbF9kaXNjb25uZWN0KHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYXRoNmtsX2RlZXBfc2xlZXBfZW5hYmxlKHN0cnVjdCBhdGg2a2wgKmFyKTsKLXZvaWQgYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHRpZCk7Ci12b2lkIGFnZ3JfcmVjdl9hZGRiYV9yZXFfZXZ0KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCB0aWQsIHUxNiBzZXFfbm8sCit2b2lkIGF0aDZrbF9kdGltZXhwaXJ5X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpOwordm9pZCBhdGg2a2xfZGlzY29ubmVjdChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKTsKK3ZvaWQgYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggdGlkKTsKK3ZvaWQgYWdncl9yZWN2X2FkZGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggdGlkLCB1MTYgc2VxX25vLAogCQkJICAgICB1OCB3aW5fc3opOwogdm9pZCBhdGg2a2xfd2FrZXVwX2V2ZW50KHZvaWQgKmRldik7Ci12b2lkIGF0aDZrbF90YXJnZXRfZmFpbHVyZShzdHJ1Y3QgYXRoNmtsICphcik7CisKK3ZvaWQgYXRoNmtsX3Jlc2V0X2RldmljZShzdHJ1Y3QgYXRoNmtsICphciwgdTMyIHRhcmdldF90eXBlLAorCQkJIGJvb2wgd2FpdF9mb3RfY29tcGx0biwgYm9vbCBjb2xkX3Jlc2V0KTsKK3ZvaWQgYXRoNmtsX2luaXRfY29udHJvbF9pbmZvKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpOwordm9pZCBhdGg2a2xfZGVpbml0X2lmX2RhdGEoc3RydWN0IGF0aDZrbF92aWYgKnZpZik7Cit2b2lkIGF0aDZrbF9jb3JlX2ZyZWUoc3RydWN0IGF0aDZrbCAqYXIpOworc3RydWN0IGF0aDZrbF92aWYgKmF0aDZrbF92aWZfZmlyc3Qoc3RydWN0IGF0aDZrbCAqYXIpOwordm9pZCBhdGg2a2xfY2xlYW51cF92aWYoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgYm9vbCB3bWlfcmVhZHkpOworaW50IGF0aDZrbF9pbml0X2h3X3N0YXJ0KHN0cnVjdCBhdGg2a2wgKmFyKTsKK2ludCBhdGg2a2xfaW5pdF9od19zdG9wKHN0cnVjdCBhdGg2a2wgKmFyKTsKK3ZvaWQgYXRoNmtsX2NoZWNrX3dvd19zdGF0dXMoc3RydWN0IGF0aDZrbCAqYXIpOwogCiAjZW5kaWYgLyogQ09SRV9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmMKaW5kZXggNzg3OWI1My4uZWI4MDhiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvZGVidWcuYwpAQCAtMTQzLDQ5ICsxNDMsNDggQEAKIAogc3RhdGljIHZvaWQgZHVtcF9jcmVkX2Rpc3Qoc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCkKIHsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsCiAJCSAgICItLS0gZW5kcG9pbnQ6ICVkICBzdmNfaWQ6IDB4JVggLS0tXG4iLAogCQkgICBlcF9kaXN0LT5lbmRwb2ludCwgZXBfZGlzdC0+c3ZjX2lkKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLCAiIGRpc3RfZmxhZ3MgICAgIDogMHglWFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULCAiIGRpc3RfZmxhZ3MgICAgIDogMHglWFxuIiwKIAkJICAgZXBfZGlzdC0+ZGlzdF9mbGFncyk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX25vcm0gICAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9ub3JtICAgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9ub3JtKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLCAiIGNyZWRfbWluICAgICAgIDogJWRcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgIiBjcmVkX21pbiAgICAgICA6ICVkXG4iLAogCQkgICBlcF9kaXN0LT5jcmVkX21pbik7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkaXRzICAgICAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZGl0cyAgICAgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZGl0cyk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX2Fzc25nZCAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9hc3NuZ2QgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9hc3NuZ2QpOwotCWF0aDZrbF9kYmcoQVRINktMX0RCR19BTlksICIgc2Vla19jcmVkICAgICAgOiAlZFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULCAiIHNlZWtfY3JlZCAgICAgIDogJWRcbiIsCiAJCSAgIGVwX2Rpc3QtPnNlZWtfY3JlZCk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX3N6ICAgICAgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9zeiAgICAgICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9zeik7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwgIiBjcmVkX3Blcl9tc2cgICA6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICIgY3JlZF9wZXJfbXNnICAgOiAlZFxuIiwKIAkJICAgZXBfZGlzdC0+Y3JlZF9wZXJfbXNnKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQU5ZLCAiIGNyZWRfdG9fZGlzdCAgIDogJWRcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgIiBjcmVkX3RvX2Rpc3QgICA6ICVkXG4iLAogCQkgICBlcF9kaXN0LT5jcmVkX3RvX2Rpc3QpOwotCWF0aDZrbF9kYmcoQVRINktMX0RCR19BTlksICIgdHhxX2RlcHRoICAgICAgOiAlZFxuIiwKLQkJICAgZ2V0X3F1ZXVlX2RlcHRoKCYoKHN0cnVjdCBodGNfZW5kcG9pbnQgKikKLQkJCQkgICAgIGVwX2Rpc3QtPmh0Y19yc3ZkKS0+dHhxKSk7Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0FOWSwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULCAiIHR4cV9kZXB0aCAgICAgIDogJWRcbiIsCisJCSAgIGdldF9xdWV1ZV9kZXB0aCgmZXBfZGlzdC0+aHRjX2VwLT50eHEpKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULAogCQkgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiB9CiAKKy8qIEZJWE1FOiBtb3ZlIHRvIGh0Yy5jICovCiB2b2lkIGR1bXBfY3JlZF9kaXN0X3N0YXRzKHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQpCiB7CiAJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfbGlzdDsKIAotCWlmICghQVJfREJHX0xWTF9DSEVDSyhBVEg2S0xfREJHX1RSQykpCisJaWYgKCFBUl9EQkdfTFZMX0NIRUNLKEFUSDZLTF9EQkdfQ1JFRElUKSkKIAkJcmV0dXJuOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlcF9saXN0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwgbGlzdCkKIAkJZHVtcF9jcmVkX2Rpc3QoZXBfbGlzdCk7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICJjdHh0OiVwIGRpc3Q6JXBcbiIsCi0JCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCBOVUxMKTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiY3JlZGl0IGRpc3RyaWJ1dGlvbiwgdG90YWwgOiAlZCwgZnJlZSA6ICVkXG4iLAotCQkgICB0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dC0+dG90YWxfYXZhaWxfY3JlZGl0cywKLQkJICAgdGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQtPmN1cl9mcmVlX2NyZWRpdHMpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsCisJCSAgICJjcmVkaXQgZGlzdHJpYnV0aW9uIHRvdGFsICVkIGZyZWUgJWRcbiIsCisJCSAgIHRhcmdldC0+Y3JlZGl0X2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMsCisJCSAgIHRhcmdldC0+Y3JlZGl0X2luZm8tPmN1cl9mcmVlX2NyZWRpdHMpOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF9kZWJ1Z2ZzX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCkBAIC0zOTcsMTMgKzM5NiwyMCBAQAogCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCB0YXJnZXRfc3RhdHMgKnRndF9zdGF0cyA9ICZhci0+dGFyZ2V0X3N0YXRzOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CisJc3RydWN0IHRhcmdldF9zdGF0cyAqdGd0X3N0YXRzOwogCWNoYXIgKmJ1ZjsKIAl1bnNpZ25lZCBpbnQgbGVuID0gMCwgYnVmX2xlbiA9IDE1MDA7CiAJaW50IGk7CiAJbG9uZyBsZWZ0OwogCXNzaXplX3QgcmV0X2NudDsKIAorCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQorCQlyZXR1cm4gLUVJTzsKKworCXRndF9zdGF0cyA9ICZ2aWYtPnRhcmdldF9zdGF0czsKKwogCWJ1ZiA9IGt6YWxsb2MoYnVmX2xlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFidWYpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNDEzLDkgKzQxOSw5IEBACiAJCXJldHVybiAtRUJVU1k7CiAJfQogCi0Jc2V0X2JpdChTVEFUU19VUERBVEVfUEVORCwgJmFyLT5mbGFnKTsKKwlzZXRfYml0KFNUQVRTX1VQREFURV9QRU5ELCAmdmlmLT5mbGFncyk7CiAKLQlpZiAoYXRoNmtsX3dtaV9nZXRfc3RhdHNfY21kKGFyLT53bWkpKSB7CisJaWYgKGF0aDZrbF93bWlfZ2V0X3N0YXRzX2NtZChhci0+d21pLCAwKSkgewogCQl1cCgmYXItPnNlbSk7CiAJCWtmcmVlKGJ1Zik7CiAJCXJldHVybiAtRUlPOwpAQCAtNDIzLDcgKzQyOSw3IEBACiAKIAlsZWZ0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoYXItPmV2ZW50X3dxLAogCQkJCQkJIXRlc3RfYml0KFNUQVRTX1VQREFURV9QRU5ELAotCQkJCQkJJmFyLT5mbGFnKSwgV01JX1RJTUVPVVQpOworCQkJCQkJJnZpZi0+ZmxhZ3MpLCBXTUlfVElNRU9VVCk7CiAKIAl1cCgmYXItPnNlbSk7CiAKQEAgLTU1NSwxMCArNTYxLDEwIEBACiAKIAlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwgIiUyNXMlNWRcbiIsCiAJCQkgIlRvdGFsIEF2YWlsIENyZWRpdHM6ICIsCi0JCQkgdGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQtPnRvdGFsX2F2YWlsX2NyZWRpdHMpOworCQkJIHRhcmdldC0+Y3JlZGl0X2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMpOwogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiJTI1cyU1ZFxuIiwKIAkJCSAiRnJlZSBjcmVkaXRzIDoiLAotCQkJIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LT5jdXJfZnJlZV9jcmVkaXRzKTsKKwkJCSB0YXJnZXQtPmNyZWRpdF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzKTsKIAogCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLAogCQkJICIgRXBpZCAgRmxhZ3MgICAgQ3JlZF9ub3JtICBDcmVkX21pbiAgQ3JlZGl0cyAgQ3JlZF9hc3NuZ2QiCkBAIC01NzcsOCArNTgzLDcgQEAKIAkJcHJpbnRfY3JlZGl0X2luZm8oIiU5ZCIsIGNyZWRfcGVyX21zZyk7CiAJCXByaW50X2NyZWRpdF9pbmZvKCIlMTRkIiwgY3JlZF90b19kaXN0KTsKIAkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlMTJkXG4iLAotCQkJCSBnZXRfcXVldWVfZGVwdGgoJigoc3RydWN0IGh0Y19lbmRwb2ludCAqKQotCQkJCQkJIGVwX2xpc3QtPmh0Y19yc3ZkKS0+dHhxKSk7CisJCQkJIGdldF9xdWV1ZV9kZXB0aCgmZXBfbGlzdC0+aHRjX2VwLT50eHEpKTsKIAl9CiAKIAlpZiAobGVuID4gYnVmX2xlbikKQEAgLTU5Niw2ICs2MDEsMTA3IEBACiAJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAogfTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBwcmludF9lbmRwb2ludF9zdGF0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQsIGNoYXIgKmJ1ZiwKKwkJCQkJdW5zaWduZWQgaW50IGJ1Zl9sZW4sIHVuc2lnbmVkIGludCBsZW4sCisJCQkJCWludCBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisJc3RydWN0IGh0Y19lbmRwb2ludF9zdGF0cyAqZXBfc3Q7CisJdTMyICpjb3VudGVyOworCisJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIlczoiLCBuYW1lKTsKKwlmb3IgKGkgPSAwOyBpIDwgRU5EUE9JTlRfTUFYOyBpKyspIHsKKwkJZXBfc3QgPSAmdGFyZ2V0LT5lbmRwb2ludFtpXS5lcF9zdDsKKwkJY291bnRlciA9ICgodTMyICopIGVwX3N0KSArIChvZmZzZXQgLyA0KTsKKwkJbGVuICs9IHNjbnByaW50ZihidWYgKyBsZW4sIGJ1Zl9sZW4gLSBsZW4sICIgJXUiLCAqY291bnRlcik7CisJfQorCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLCAiXG4iKTsKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9lbmRwb2ludF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0ID0gYXItPmh0Y190YXJnZXQ7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBidWZfbGVuLCBsZW4gPSAwOworCXNzaXplX3QgcmV0X2NudDsKKworCWJ1Zl9sZW4gPSBzaXplb2Yoc3RydWN0IGh0Y19lbmRwb2ludF9zdGF0cykgLyBzaXplb2YodTMyKSAqCisJCSgyNSArIEVORFBPSU5UX01BWCAqIDExKTsKKwlidWYgPSBrbWFsbG9jKGJ1Zl9sZW4sIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworI2RlZmluZSBFUFNUQVQobmFtZSkJCQkJCQkJXAorCWxlbiA9IHByaW50X2VuZHBvaW50X3N0YXQodGFyZ2V0LCBidWYsIGJ1Zl9sZW4sIGxlbiwJCVwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBodGNfZW5kcG9pbnRfc3RhdHMsIG5hbWUpLCBcCisJCQkJICAjbmFtZSkKKwlFUFNUQVQoY3JlZF9sb3dfaW5kaWNhdGUpOworCUVQU1RBVCh0eF9pc3N1ZWQpOworCUVQU1RBVCh0eF9wa3RfYnVuZGxlZCk7CisJRVBTVEFUKHR4X2J1bmRsZXMpOworCUVQU1RBVCh0eF9kcm9wcGVkKTsKKwlFUFNUQVQodHhfY3JlZF9ycHQpOworCUVQU1RBVChjcmVkX3JwdF9mcm9tX3J4KTsKKwlFUFNUQVQoY3JlZF9ycHRfZnJvbV9vdGhlcik7CisJRVBTVEFUKGNyZWRfcnB0X2VwMCk7CisJRVBTVEFUKGNyZWRfZnJvbV9yeCk7CisJRVBTVEFUKGNyZWRfZnJvbV9vdGhlcik7CisJRVBTVEFUKGNyZWRfZnJvbV9lcDApOworCUVQU1RBVChjcmVkX2Nvc3VtZCk7CisJRVBTVEFUKGNyZWRfcmV0bmQpOworCUVQU1RBVChyeF9wa3RzKTsKKwlFUFNUQVQocnhfbGthaGRzKTsKKwlFUFNUQVQocnhfYnVuZGwpOworCUVQU1RBVChyeF9idW5kbGVfbGthaGQpOworCUVQU1RBVChyeF9idW5kbGVfZnJvbV9oZHIpOworCUVQU1RBVChyeF9hbGxvY190aHJlc2hfaGl0KTsKKwlFUFNUQVQocnhhbGxvY190aHJlc2hfYnl0ZSk7CisjdW5kZWYgRVBTVEFUCisKKwlpZiAobGVuID4gYnVmX2xlbikKKwkJbGVuID0gYnVmX2xlbjsKKworCXJldF9jbnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXRfY250OworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfZW5kcG9pbnRfc3RhdHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCA9IGFyLT5odGNfdGFyZ2V0OworCWludCByZXQsIGk7CisJdTMyIHZhbDsKKwlzdHJ1Y3QgaHRjX2VuZHBvaW50X3N0YXRzICplcF9zdDsKKworCXJldCA9IGtzdHJ0b3UzMl9mcm9tX3VzZXIodXNlcl9idWYsIGNvdW50LCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCWlmICh2YWwgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgRU5EUE9JTlRfTUFYOyBpKyspIHsKKwkJCWVwX3N0ID0gJnRhcmdldC0+ZW5kcG9pbnRbaV0uZXBfc3Q7CisJCQltZW1zZXQoZXBfc3QsIDAsIHNpemVvZigqZXBfc3QpKTsKKwkJfQorCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19lbmRwb2ludF9zdGF0cyA9IHsKKwkub3BlbiA9IGF0aDZrbF9kZWJ1Z2ZzX29wZW4sCisJLnJlYWQgPSBhdGg2a2xfZW5kcG9pbnRfc3RhdHNfcmVhZCwKKwkud3JpdGUgPSBhdGg2a2xfZW5kcG9pbnRfc3RhdHNfd3JpdGUsCisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgYXRoNmtsX2dldF9udW1fcmVnKHZvaWQpCiB7CiAJaW50IGk7CkBAIC04NjgsNiArOTc0LDY2MCBAQAogCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKIH07CiAKK2ludCBhdGg2a2xfZGVidWdfcm9hbV90YmxfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIGNvbnN0IHZvaWQgKmJ1ZiwKKwkJCQlzaXplX3QgbGVuKQoreworCWNvbnN0IHN0cnVjdCB3bWlfdGFyZ2V0X3JvYW1fdGJsICp0Ymw7CisJdTE2IG51bV9lbnRyaWVzOworCisJaWYgKGxlbiA8IHNpemVvZigqdGJsKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0YmwgPSAoY29uc3Qgc3RydWN0IHdtaV90YXJnZXRfcm9hbV90YmwgKikgYnVmOworCW51bV9lbnRyaWVzID0gbGUxNl90b19jcHUodGJsLT5udW1fZW50cmllcyk7CisJaWYgKHNpemVvZigqdGJsKSArIG51bV9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCB3bWlfYnNzX3JvYW1faW5mbykgPgorCSAgICBsZW4pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGFyLT5kZWJ1Zy5yb2FtX3RibCA9PSBOVUxMIHx8CisJICAgIGFyLT5kZWJ1Zy5yb2FtX3RibF9sZW4gPCAodW5zaWduZWQgaW50KSBsZW4pIHsKKwkJa2ZyZWUoYXItPmRlYnVnLnJvYW1fdGJsKTsKKwkJYXItPmRlYnVnLnJvYW1fdGJsID0ga21hbGxvYyhsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAoYXItPmRlYnVnLnJvYW1fdGJsID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltZW1jcHkoYXItPmRlYnVnLnJvYW1fdGJsLCBidWYsIGxlbik7CisJYXItPmRlYnVnLnJvYW1fdGJsX2xlbiA9IGxlbjsKKworCWlmICh0ZXN0X2JpdChST0FNX1RCTF9QRU5ELCAmYXItPmZsYWcpKSB7CisJCWNsZWFyX2JpdChST0FNX1RCTF9QRU5ELCAmYXItPmZsYWcpOworCQl3YWtlX3VwKCZhci0+ZXZlbnRfd3EpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfcm9hbV90YWJsZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKwlsb25nIGxlZnQ7CisJc3RydWN0IHdtaV90YXJnZXRfcm9hbV90YmwgKnRibDsKKwl1MTYgbnVtX2VudHJpZXMsIGk7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGludCBsZW4sIGJ1Zl9sZW47CisJc3NpemVfdCByZXRfY250OworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYXItPnNlbSkpCisJCXJldHVybiAtRUJVU1k7CisKKwlzZXRfYml0KFJPQU1fVEJMX1BFTkQsICZhci0+ZmxhZyk7CisKKwlyZXQgPSBhdGg2a2xfd21pX2dldF9yb2FtX3RibF9jbWQoYXItPndtaSk7CisJaWYgKHJldCkgeworCQl1cCgmYXItPnNlbSk7CisJCXJldHVybiByZXQ7CisJfQorCisJbGVmdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KAorCQlhci0+ZXZlbnRfd3EsICF0ZXN0X2JpdChST0FNX1RCTF9QRU5ELCAmYXItPmZsYWcpLCBXTUlfVElNRU9VVCk7CisJdXAoJmFyLT5zZW0pOworCisJaWYgKGxlZnQgPD0gMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisKKwlpZiAoYXItPmRlYnVnLnJvYW1fdGJsID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdGJsID0gKHN0cnVjdCB3bWlfdGFyZ2V0X3JvYW1fdGJsICopIGFyLT5kZWJ1Zy5yb2FtX3RibDsKKwludW1fZW50cmllcyA9IGxlMTZfdG9fY3B1KHRibC0+bnVtX2VudHJpZXMpOworCisJYnVmX2xlbiA9IDEwMCArIG51bV9lbnRyaWVzICogMTAwOworCWJ1ZiA9IGt6YWxsb2MoYnVmX2xlbiwgR0ZQX0tFUk5FTCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlsZW4gPSAwOworCWxlbiArPSBzY25wcmludGYoYnVmICsgbGVuLCBidWZfbGVuIC0gbGVuLAorCQkJICJyb2FtX21vZGU9JXVcblxuIgorCQkJICIjIHJvYW1fdXRpbCBic3NpZCByc3NpIHJzc2lkdCBsYXN0X3Jzc2kgdXRpbCBiaWFzXG4iLAorCQkJIGxlMTZfdG9fY3B1KHRibC0+cm9hbV9tb2RlKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2VudHJpZXM7IGkrKykgeworCQlzdHJ1Y3Qgd21pX2Jzc19yb2FtX2luZm8gKmluZm8gPSAmdGJsLT5pbmZvW2ldOworCQlsZW4gKz0gc2NucHJpbnRmKGJ1ZiArIGxlbiwgYnVmX2xlbiAtIGxlbiwKKwkJCQkgIiVkICVwTSAlZCAlZCAlZCAlZCAlZFxuIiwKKwkJCQkgYV9zbGUzMl90b19jcHUoaW5mby0+cm9hbV91dGlsKSwgaW5mby0+YnNzaWQsCisJCQkJIGluZm8tPnJzc2ksIGluZm8tPnJzc2lkdCwgaW5mby0+bGFzdF9yc3NpLAorCQkJCSBpbmZvLT51dGlsLCBpbmZvLT5iaWFzKTsKKwl9CisKKwlpZiAobGVuID4gYnVmX2xlbikKKwkJbGVuID0gYnVmX2xlbjsKKworCXJldF9jbnQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKKworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldF9jbnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcm9hbV90YWJsZSA9IHsKKwkucmVhZCA9IGF0aDZrbF9yb2FtX3RhYmxlX3JlYWQsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9mb3JjZV9yb2FtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisJY2hhciBidWZbMjBdOworCXNpemVfdCBsZW47CisJdTggYnNzaWRbRVRIX0FMRU5dOworCWludCBpOworCWludCBhZGRyW0VUSF9BTEVOXTsKKworCWxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2xlbl0gPSAnXDAnOworCisJaWYgKHNzY2FuZihidWYsICIlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCSAgICZhZGRyWzBdLCAmYWRkclsxXSwgJmFkZHJbMl0sICZhZGRyWzNdLCAmYWRkcls0XSwgJmFkZHJbNV0pCisJICAgICE9IEVUSF9BTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlmb3IgKGkgPSAwOyBpIDwgRVRIX0FMRU47IGkrKykKKwkJYnNzaWRbaV0gPSBhZGRyW2ldOworCisJcmV0ID0gYXRoNmtsX3dtaV9mb3JjZV9yb2FtX2NtZChhci0+d21pLCBic3NpZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19mb3JjZV9yb2FtID0geworCS53cml0ZSA9IGF0aDZrbF9mb3JjZV9yb2FtX3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfcm9hbV9tb2RlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCWNoYXIgYnVmWzIwXTsKKwlzaXplX3QgbGVuOworCWVudW0gd21pX3JvYW1fbW9kZSBtb2RlOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbbGVuXSA9ICdcMCc7CisJaWYgKGxlbiA+IDAgJiYgYnVmW2xlbiAtIDFdID09ICdcbicpCisJCWJ1ZltsZW4gLSAxXSA9ICdcMCc7CisKKwlpZiAoc3RyY2FzZWNtcChidWYsICJkZWZhdWx0IikgPT0gMCkKKwkJbW9kZSA9IFdNSV9ERUZBVUxUX1JPQU1fTU9ERTsKKwllbHNlIGlmIChzdHJjYXNlY21wKGJ1ZiwgImJzc2JpYXMiKSA9PSAwKQorCQltb2RlID0gV01JX0hPU1RfQklBU19ST0FNX01PREU7CisJZWxzZSBpZiAoc3RyY2FzZWNtcChidWYsICJsb2NrIikgPT0gMCkKKwkJbW9kZSA9IFdNSV9MT0NLX0JTU19NT0RFOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBhdGg2a2xfd21pX3NldF9yb2FtX21vZGVfY21kKGFyLT53bWksIG1vZGUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfcm9hbV9tb2RlID0geworCS53cml0ZSA9IGF0aDZrbF9yb2FtX21vZGVfd3JpdGUsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3ZvaWQgYXRoNmtsX2RlYnVnX3NldF9rZWVwYWxpdmUoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGtlZXBhbGl2ZSkKK3sKKwlhci0+ZGVidWcua2VlcGFsaXZlID0ga2VlcGFsaXZlOworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfa2VlcGFsaXZlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzE2XTsKKwlpbnQgbGVuOworCisJbGVuID0gc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1XG4iLCBhci0+ZGVidWcua2VlcGFsaXZlKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QgYXRoNmtsX2tlZXBhbGl2ZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKwl1OCB2YWw7CisKKwlyZXQgPSBrc3RydG91OF9mcm9tX3VzZXIodXNlcl9idWYsIGNvdW50LCAwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYXRoNmtsX3dtaV9zZXRfa2VlcGFsaXZlX2NtZChhci0+d21pLCAwLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfa2VlcGFsaXZlID0geworCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkucmVhZCA9IGF0aDZrbF9rZWVwYWxpdmVfcmVhZCwKKwkud3JpdGUgPSBhdGg2a2xfa2VlcGFsaXZlX3dyaXRlLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3ZvaWQgYXRoNmtsX2RlYnVnX3NldF9kaXNjb25uZWN0X3RpbWVvdXQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHRpbWVvdXQpCit7CisJYXItPmRlYnVnLmRpc2NfdGltZW91dCA9IHRpbWVvdXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9kaXNjb25uZWN0X3RpbWVvdXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJICAgICAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1ZlsxNl07CisJaW50IGxlbjsKKworCWxlbiA9IHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIldVxuIiwgYXItPmRlYnVnLmRpc2NfdGltZW91dCk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9kaXNjb25uZWN0X3RpbWVvdXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCSAgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0OworCXU4IHZhbDsKKworCXJldCA9IGtzdHJ0b3U4X2Zyb21fdXNlcih1c2VyX2J1ZiwgY291bnQsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChhci0+d21pLCAwLCB2YWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfZGlzY29ubmVjdF90aW1lb3V0ID0geworCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkucmVhZCA9IGF0aDZrbF9kaXNjb25uZWN0X3RpbWVvdXRfcmVhZCwKKwkud3JpdGUgPSBhdGg2a2xfZGlzY29ubmVjdF90aW1lb3V0X3dyaXRlLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9jcmVhdGVfcW9zX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOworCWNoYXIgYnVmWzIwMF07CisJc3NpemVfdCBsZW47CisJY2hhciAqc3B0ciwgKnRva2VuOworCXN0cnVjdCB3bWlfY3JlYXRlX3BzdHJlYW1fY21kIHBzdHJlYW07CisJdTMyIHZhbDMyOworCXUxNiB2YWwxNjsKKworCXZpZiA9IGF0aDZrbF92aWZfZmlyc3QoYXIpOworCWlmICghdmlmKQorCQlyZXR1cm4gLUVJTzsKKworCWxlbiA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgbGVuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJYnVmW2xlbl0gPSAnXDAnOworCXNwdHIgPSBidWY7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTgodG9rZW4sIDAsICZwc3RyZWFtLnVzZXJfcHJpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTgodG9rZW4sIDAsICZwc3RyZWFtLnRyYWZmaWNfZGlyZWMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnBzdHJlYW0udHJhZmZpY19jbGFzcykpCisJCXJldHVybiAtRUlOVkFMOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3U4KHRva2VuLCAwLCAmcHN0cmVhbS50cmFmZmljX3R5cGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnBzdHJlYW0udm9pY2VfcHNjX2NhcCkpCisJCXJldHVybiAtRUlOVkFMOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5taW5fc2VydmljZV9pbnQgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLm1heF9zZXJ2aWNlX2ludCA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0uaW5hY3Rpdml0eV9pbnQgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLnN1c3BlbnNpb25faW50ID0gY3B1X3RvX2xlMzIodmFsMzIpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5zZXJ2aWNlX3N0YXJ0X3RpbWUgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTgodG9rZW4sIDAsICZwc3RyZWFtLnRzaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MTYodG9rZW4sIDAsICZ2YWwxNikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0ubm9taW5hbF9tc2R1ID0gY3B1X3RvX2xlMTYodmFsMTYpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UxNih0b2tlbiwgMCwgJnZhbDE2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5tYXhfbXNkdSA9IGNwdV90b19sZTE2KHZhbDE2KTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0ubWluX2RhdGFfcmF0ZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0ubWVhbl9kYXRhX3JhdGUgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLnBlYWtfZGF0YV9yYXRlID0gY3B1X3RvX2xlMzIodmFsMzIpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5tYXhfYnVyc3Rfc2l6ZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0uZGVsYXlfYm91bmQgPSBjcHVfdG9fbGUzMih2YWwzMik7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTMyKHRva2VuLCAwLCAmdmFsMzIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwc3RyZWFtLm1pbl9waHlfcmF0ZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MzIodG9rZW4sIDAsICZ2YWwzMikpCisJCXJldHVybiAtRUlOVkFMOworCXBzdHJlYW0uc2JhID0gY3B1X3RvX2xlMzIodmFsMzIpOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UzMih0b2tlbiwgMCwgJnZhbDMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcHN0cmVhbS5tZWRpdW1fdGltZSA9IGNwdV90b19sZTMyKHZhbDMyKTsKKworCWF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwgJnBzdHJlYW0pOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX2NyZWF0ZV9xb3MgPSB7CisJLndyaXRlID0gYXRoNmtsX2NyZWF0ZV9xb3Nfd3JpdGUsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9kZWxldGVfcW9zX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CisJY2hhciBidWZbMTAwXTsKKwlzc2l6ZV90IGxlbjsKKwljaGFyICpzcHRyLCAqdG9rZW47CisJdTggdHJhZmZpY19jbGFzczsKKwl1OCB0c2lkOworCisJdmlmID0gYXRoNmtsX3ZpZl9maXJzdChhcik7CisJaWYgKCF2aWYpCisJCXJldHVybiAtRUlPOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlidWZbbGVuXSA9ICdcMCc7CisJc3B0ciA9IGJ1ZjsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnRyYWZmaWNfY2xhc3MpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91OCh0b2tlbiwgMCwgJnRzaWQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWF0aDZrbF93bWlfZGVsZXRlX3BzdHJlYW1fY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkgICAgICB0cmFmZmljX2NsYXNzLCB0c2lkKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19kZWxldGVfcW9zID0geworCS53cml0ZSA9IGF0aDZrbF9kZWxldGVfcW9zX3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfYmdzY2FuX2ludF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdTE2IGJnc2Nhbl9pbnQ7CisJY2hhciBidWZbMzJdOworCXNzaXplX3QgbGVuOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1ZltsZW5dID0gJ1wwJzsKKwlpZiAoa3N0cnRvdTE2KGJ1ZiwgMCwgJmJnc2Nhbl9pbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChiZ3NjYW5faW50ID09IDApCisJCWJnc2Nhbl9pbnQgPSAweGZmZmY7CisKKwlhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKGFyLT53bWksIDAsIDAsIDAsIGJnc2Nhbl9pbnQsIDAsIDAsIDAsIDMsCisJCQkJICAwLCAwLCAwKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19iZ3NjYW5faW50ID0geworCS53cml0ZSA9IGF0aDZrbF9iZ3NjYW5faW50X3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfbGlzdGVuX2ludF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGg2a2wgKmFyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXUxNiBsaXN0ZW5faW50X3QsIGxpc3Rlbl9pbnRfYjsKKwljaGFyIGJ1ZlszMl07CisJY2hhciAqc3B0ciwgKnRva2VuOworCXNzaXplX3QgbGVuOworCisJbGVuID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBsZW4pKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWJ1ZltsZW5dID0gJ1wwJzsKKwlzcHRyID0gYnVmOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoa3N0cnRvdTE2KHRva2VuLCAwLCAmbGlzdGVuX2ludF90KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoa3N0cnRvdTE2KHNwdHIsIDAsICZsaXN0ZW5faW50X2IpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgobGlzdGVuX2ludF90IDwgMTUpIHx8IChsaXN0ZW5faW50X3QgPiA1MDAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGxpc3Rlbl9pbnRfYiA8IDEpIHx8IChsaXN0ZW5faW50X2IgPiA1MCkpCisJCXJldHVybiAtRUlOVkFMOworCisJYXItPmxpc3Rlbl9pbnR2bF90ID0gbGlzdGVuX2ludF90OworCWFyLT5saXN0ZW5faW50dmxfYiA9IGxpc3Rlbl9pbnRfYjsKKworCWF0aDZrbF93bWlfbGlzdGVuaW50ZXJ2YWxfY21kKGFyLT53bWksIDAsIGFyLT5saXN0ZW5faW50dmxfdCwKKwkJCQkgICAgICBhci0+bGlzdGVuX2ludHZsX2IpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBhdGg2a2xfbGlzdGVuX2ludF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF0aDZrbCAqYXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbMzJdOworCWludCBsZW47CisKKwlsZW4gPSBzY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiV1ICV1XG4iLCBhci0+bGlzdGVuX2ludHZsX3QsCisJCQkJCWFyLT5saXN0ZW5faW50dmxfYik7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcHNfbGlzdGVuX2ludCA9IHsKKwkucmVhZCA9IGF0aDZrbF9saXN0ZW5faW50X3JlYWQsCisJLndyaXRlID0gYXRoNmtsX2xpc3Rlbl9pbnRfd3JpdGUsCisJLm9wZW4gPSBhdGg2a2xfZGVidWdmc19vcGVuLAorCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90IGF0aDZrbF9wb3dlcl9wYXJhbXNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYXRoNmtsICphciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1OCBidWZbMTAwXTsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMDsKKwljaGFyICpzcHRyLCAqdG9rZW47CisJdTE2IGlkbGVfcGVyaW9kLCBwc19wb2xsX251bSwgZHRpbSwKKwkJdHhfd2FrZXVwLCBudW1fdHg7CisKKwlsZW4gPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCWJ1ZltsZW5dID0gJ1wwJzsKKwlzcHRyID0gYnVmOworCisJdG9rZW4gPSBzdHJzZXAoJnNwdHIsICIgIik7CisJaWYgKCF0b2tlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGtzdHJ0b3UxNih0b2tlbiwgMCwgJmlkbGVfcGVyaW9kKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTE2KHRva2VuLCAwLCAmcHNfcG9sbF9udW0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXRva2VuID0gc3Ryc2VwKCZzcHRyLCAiICIpOworCWlmICghdG9rZW4pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChrc3RydG91MTYodG9rZW4sIDAsICZkdGltKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTE2KHRva2VuLCAwLCAmdHhfd2FrZXVwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0b2tlbiA9IHN0cnNlcCgmc3B0ciwgIiAiKTsKKwlpZiAoIXRva2VuKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoa3N0cnRvdTE2KHRva2VuLCAwLCAmbnVtX3R4KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhdGg2a2xfd21pX3BtcGFyYW1zX2NtZChhci0+d21pLCAwLCBpZGxlX3BlcmlvZCwgcHNfcG9sbF9udW0sCisJCQkJZHRpbSwgdHhfd2FrZXVwLCBudW1fdHgsIDApOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmb3BzX3Bvd2VyX3BhcmFtcyA9IHsKKwkud3JpdGUgPSBhdGg2a2xfcG93ZXJfcGFyYW1zX3dyaXRlLAorCS5vcGVuID0gYXRoNmtsX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCiBpbnQgYXRoNmtsX2RlYnVnX2luaXQoc3RydWN0IGF0aDZrbCAqYXIpCiB7CiAJYXItPmRlYnVnLmZ3bG9nX2J1Zi5idWYgPSB2bWFsbG9jKEFUSDZLTF9GV0xPR19TSVpFKTsKQEAgLTg4OSw3ICsxNjQ5LDcgQEAKIAlhci0+ZGVidWcuZndsb2dfbWFzayA9IDA7CiAKIAlhci0+ZGVidWdmc19waHkgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImF0aDZrbCIsCi0JCQkJCSAgICAgYXItPndkZXYtPndpcGh5LT5kZWJ1Z2ZzZGlyKTsKKwkJCQkJICAgICBhci0+d2lwaHktPmRlYnVnZnNkaXIpOwogCWlmICghYXItPmRlYnVnZnNfcGh5KSB7CiAJCXZmcmVlKGFyLT5kZWJ1Zy5md2xvZ19idWYuYnVmKTsKIAkJa2ZyZWUoYXItPmRlYnVnLmZ3bG9nX3RtcCk7CkBAIC05MDIsNiArMTY2Miw5IEBACiAJZGVidWdmc19jcmVhdGVfZmlsZSgiY3JlZGl0X2Rpc3Rfc3RhdHMiLCBTX0lSVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAogCQkJICAgICZmb3BzX2NyZWRpdF9kaXN0X3N0YXRzKTsKIAorCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImVuZHBvaW50X3N0YXRzIiwgU19JUlVTUiB8IFNfSVdVU1IsCisJCQkgICAgYXItPmRlYnVnZnNfcGh5LCBhciwgJmZvcHNfZW5kcG9pbnRfc3RhdHMpOworCiAJZGVidWdmc19jcmVhdGVfZmlsZSgiZndsb2ciLCBTX0lSVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAogCQkJICAgICZmb3BzX2Z3bG9nKTsKIApAQCAtOTIzLDYgKzE2ODYsMzMgQEAKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ3YXJfc3RhdHMiLCBTX0lSVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAogCQkJICAgICZmb3BzX3dhcl9zdGF0cyk7CiAKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyb2FtX3RhYmxlIiwgU19JUlVTUiwgYXItPmRlYnVnZnNfcGh5LCBhciwKKwkJCSAgICAmZm9wc19yb2FtX3RhYmxlKTsKKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImZvcmNlX3JvYW0iLCBTX0lXVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAorCQkJICAgICZmb3BzX2ZvcmNlX3JvYW0pOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgicm9hbV9tb2RlIiwgU19JV1VTUiwgYXItPmRlYnVnZnNfcGh5LCBhciwKKwkJCSAgICAmZm9wc19yb2FtX21vZGUpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgia2VlcGFsaXZlIiwgU19JUlVTUiB8IFNfSVdVU1IsIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsCisJCQkgICAgJmZvcHNfa2VlcGFsaXZlKTsKKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImRpc2Nvbm5lY3RfdGltZW91dCIsIFNfSVJVU1IgfCBTX0lXVVNSLAorCQkJICAgIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsICZmb3BzX2Rpc2Nvbm5lY3RfdGltZW91dCk7CisKKwlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJjcmVhdGVfcW9zIiwgU19JV1VTUiwgYXItPmRlYnVnZnNfcGh5LCBhciwKKwkJCQkmZm9wc19jcmVhdGVfcW9zKTsKKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImRlbGV0ZV9xb3MiLCBTX0lXVVNSLCBhci0+ZGVidWdmc19waHksIGFyLAorCQkJCSZmb3BzX2RlbGV0ZV9xb3MpOworCisJZGVidWdmc19jcmVhdGVfZmlsZSgiYmdzY2FuX2ludGVydmFsIiwgU19JV1VTUiwKKwkJCQlhci0+ZGVidWdmc19waHksIGFyLCAmZm9wc19iZ3NjYW5faW50KTsKKworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoInBvd2VyX3BhcmFtcyIsIFNfSVdVU1IsIGFyLT5kZWJ1Z2ZzX3BoeSwgYXIsCisJCQkJCQkmZm9wc19wb3dlcl9wYXJhbXMpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTkzMCw2ICsxNzIwLDcgQEAKIHsKIAl2ZnJlZShhci0+ZGVidWcuZndsb2dfYnVmLmJ1Zik7CiAJa2ZyZWUoYXItPmRlYnVnLmZ3bG9nX3RtcCk7CisJa2ZyZWUoYXItPmRlYnVnLnJvYW1fdGJsKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2RlYnVnLmgKaW5kZXggN2I3Njc1Zi4uOTg1M2M5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9kZWJ1Zy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvZGVidWcuaApAQCAtMTcsMTkgKzE3LDE5IEBACiAjaWZuZGVmIERFQlVHX0gKICNkZWZpbmUgREVCVUdfSAogCi0jaW5jbHVkZSAiaHRjX2hpZi5oIgorI2luY2x1ZGUgImhpZi5oIgogCiBlbnVtIEFUSDZLX0RFQlVHX01BU0sgewotCUFUSDZLTF9EQkdfV0xBTl9DT05ORUNUID0gQklUKDApLCAgICAgLyogd2xhbiBjb25uZWN0ICovCi0JQVRINktMX0RCR19XTEFOX1NDQU4gICAgPSBCSVQoMSksICAgICAvKiB3bGFuIHNjYW4gKi8KKwlBVEg2S0xfREJHX0NSRURJVAk9IEJJVCgwKSwKKwkvKiBob2xlICovCiAJQVRINktMX0RCR19XTEFOX1RYICAgICAgPSBCSVQoMiksICAgICAvKiB3bGFuIHR4ICovCiAJQVRINktMX0RCR19XTEFOX1JYICAgICAgPSBCSVQoMyksICAgICAvKiB3bGFuIHJ4ICovCiAJQVRINktMX0RCR19CTUkJCT0gQklUKDQpLCAgICAgLyogYm1pIHRyYWNpbmcgKi8KLQlBVEg2S0xfREJHX0hUQ19TRU5EICAgICA9IEJJVCg1KSwgICAgIC8qIGh0YyBzZW5kICovCi0JQVRINktMX0RCR19IVENfUkVDViAgICAgPSBCSVQoNiksICAgICAvKiBodGMgcmVjdiAqLworCUFUSDZLTF9EQkdfSFRDCQk9IEJJVCg1KSwKKwlBVEg2S0xfREJHX0hJRgkJPSBCSVQoNiksCiAJQVRINktMX0RCR19JUlEJCT0gQklUKDcpLCAgICAgLyogaW50ZXJydXB0IHByb2Nlc3NpbmcgKi8KLQlBVEg2S0xfREJHX1BNICAgICAgICAgICA9IEJJVCg4KSwgICAgIC8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KLQlBVEg2S0xfREJHX1dMQU5fTk9ERSAgICA9IEJJVCg5KSwgICAgIC8qIGdlbmVyYWwgd2xhbiBub2RlIHRyYWNpbmcgKi8KKwkvKiBob2xlICovCisJLyogaG9sZSAqLwogCUFUSDZLTF9EQkdfV01JICAgICAgICAgID0gQklUKDEwKSwgICAgLyogd21pIHRyYWNpbmcgKi8KIAlBVEg2S0xfREJHX1RSQwkgICAgICAgID0gQklUKDExKSwgICAgLyogZ2VuZXJpYyBmdW5jIHRyYWNpbmcgKi8KIAlBVEg2S0xfREJHX1NDQVRURVIJPSBCSVQoMTIpLCAgICAvKiBoaWYgc2NhdHRlciB0cmFjaW5nICovCkBAIC00MCw2ICs0MCw3IEBACiAJQVRINktMX0RCR19TRElPX0RVTVAJPSBCSVQoMTcpLAogCUFUSDZLTF9EQkdfQk9PVAkJPSBCSVQoMTgpLCAgICAvKiBkcml2ZXIgaW5pdCBhbmQgZncgYm9vdCAqLwogCUFUSDZLTF9EQkdfV01JX0RVTVAJPSBCSVQoMTkpLAorCUFUSDZLTF9EQkdfU1VTUEVORAk9IEJJVCgyMCksCiAJQVRINktMX0RCR19BTlkJICAgICAgICA9IDB4ZmZmZmZmZmYgIC8qIGVuYWJsZSBhbGwgbG9ncyAqLwogfTsKIApAQCAtOTAsNiArOTEsMTAgQEAKIHZvaWQgZHVtcF9jcmVkX2Rpc3Rfc3RhdHMoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCk7CiB2b2lkIGF0aDZrbF9kZWJ1Z19md2xvZ19ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuKTsKIHZvaWQgYXRoNmtsX2RlYnVnX3dhcihzdHJ1Y3QgYXRoNmtsICphciwgZW51bSBhdGg2a2xfd2FyIHdhcik7CitpbnQgYXRoNmtsX2RlYnVnX3JvYW1fdGJsX2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCBjb25zdCB2b2lkICpidWYsCisJCQkJc2l6ZV90IGxlbik7Cit2b2lkIGF0aDZrbF9kZWJ1Z19zZXRfa2VlcGFsaXZlKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCBrZWVwYWxpdmUpOwordm9pZCBhdGg2a2xfZGVidWdfc2V0X2Rpc2Nvbm5lY3RfdGltZW91dChzdHJ1Y3QgYXRoNmtsICphciwgdTggdGltZW91dCk7CiBpbnQgYXRoNmtsX2RlYnVnX2luaXQoc3RydWN0IGF0aDZrbCAqYXIpOwogdm9pZCBhdGg2a2xfZGVidWdfY2xlYW51cChzdHJ1Y3QgYXRoNmtsICphcik7CiAKQEAgLTEyNSw2ICsxMzAsMjEgQEAKIHsKIH0KIAorc3RhdGljIGlubGluZSBpbnQgYXRoNmtsX2RlYnVnX3JvYW1fdGJsX2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLAorCQkJCQkgICAgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg2a2xfZGVidWdfc2V0X2tlZXBhbGl2ZShzdHJ1Y3QgYXRoNmtsICphciwgdTgga2VlcGFsaXZlKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoNmtsX2RlYnVnX3NldF9kaXNjb25uZWN0X3RpbWVvdXQoc3RydWN0IGF0aDZrbCAqYXIsCisJCQkJCQkgICAgICAgdTggdGltZW91dCkKK3sKK30KKwogc3RhdGljIGlubGluZSBpbnQgYXRoNmtsX2RlYnVnX2luaXQoc3RydWN0IGF0aDZrbCAqYXIpCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi1vcHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLW9wcy5oCmluZGV4IGQ2Yzg5OGYuLjJmZTFkYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLW9wcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLW9wcy5oCkBAIC0xOCwxMCArMTgsMTYgQEAKICNkZWZpbmUgSElGX09QU19ICiAKICNpbmNsdWRlICJoaWYuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogCiBzdGF0aWMgaW5saW5lIGludCBoaWZfcmVhZF93cml0ZV9zeW5jKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgYWRkciwgdTggKmJ1ZiwKIAkJCQkgICAgICB1MzIgbGVuLCB1MzIgcmVxdWVzdCkKIHsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLAorCQkgICAiaGlmICVzIHN5bmMgYWRkciAweCV4IGJ1ZiAweCVwIGxlbiAlZCByZXF1ZXN0IDB4JXhcbiIsCisJCSAgIChyZXF1ZXN0ICYgSElGX1dSSVRFKSA/ICJ3cml0ZSIgOiAicmVhZCIsCisJCSAgIGFkZHIsIGJ1ZiwgbGVuLCByZXF1ZXN0KTsKKwogCXJldHVybiBhci0+aGlmX29wcy0+cmVhZF93cml0ZV9zeW5jKGFyLCBhZGRyLCBidWYsIGxlbiwgcmVxdWVzdCk7CiB9CiAKQEAgLTI5LDE2ICszNSwyNCBAQAogCQkJCSAgdTMyIGxlbmd0aCwgdTMyIHJlcXVlc3QsCiAJCQkJICBzdHJ1Y3QgaHRjX3BhY2tldCAqcGFja2V0KQogeworCWF0aDZrbF9kYmcoQVRINktMX0RCR19ISUYsCisJCSAgICJoaWYgd3JpdGUgYXN5bmMgYWRkciAweCV4IGJ1ZiAweCVwIGxlbiAlZCByZXF1ZXN0IDB4JXhcbiIsCisJCSAgIGFkZHJlc3MsIGJ1ZmZlciwgbGVuZ3RoLCByZXF1ZXN0KTsKKwogCXJldHVybiBhci0+aGlmX29wcy0+d3JpdGVfYXN5bmMoYXIsIGFkZHJlc3MsIGJ1ZmZlciwgbGVuZ3RoLAogCQkJCQlyZXF1ZXN0LCBwYWNrZXQpOwogfQogc3RhdGljIGlubGluZSB2b2lkIGF0aDZrbF9oaWZfaXJxX2VuYWJsZShzdHJ1Y3QgYXRoNmtsICphcikKIHsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIGlycSBlbmFibGVcbiIpOworCiAJcmV0dXJuIGFyLT5oaWZfb3BzLT5pcnFfZW5hYmxlKGFyKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGF0aDZrbF9oaWZfaXJxX2Rpc2FibGUoc3RydWN0IGF0aDZrbCAqYXIpCiB7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiBpcnEgZGlzYWJsZVxuIik7CisKIAlyZXR1cm4gYXItPmhpZl9vcHMtPmlycV9kaXNhYmxlKGFyKTsKIH0KIApAQCAtNjksOSArODMsNzAgQEAKIAlyZXR1cm4gYXItPmhpZl9vcHMtPmNsZWFudXBfc2NhdHRlcihhcik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9oaWZfc3VzcGVuZChzdHJ1Y3QgYXRoNmtsICphcikKK3N0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9oaWZfc3VzcGVuZChzdHJ1Y3QgYXRoNmtsICphciwKKwkJCQkgICAgIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdykKIHsKLQlyZXR1cm4gYXItPmhpZl9vcHMtPnN1c3BlbmQoYXIpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19ISUYsICJoaWYgc3VzcGVuZFxuIik7CisKKwlyZXR1cm4gYXItPmhpZl9vcHMtPnN1c3BlbmQoYXIsIHdvdyk7Cit9CisKKy8qCisgKiBSZWFkIGZyb20gdGhlIEFUSDZLTCB0aHJvdWdoIGl0cyBkaWFnbm9zdGljIHdpbmRvdy4gTm8gY29vcGVyYXRpb24gZnJvbQorICogdGhlIFRhcmdldCBpcyByZXF1aXJlZCBmb3IgdGhpcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXRoNmtsX2hpZl9kaWFnX3JlYWQzMihzdHJ1Y3QgYXRoNmtsICphciwgdTMyIGFkZHJlc3MsCisJCQkJCSB1MzIgKnZhbHVlKQoreworCXJldHVybiBhci0+aGlmX29wcy0+ZGlhZ19yZWFkMzIoYXIsIGFkZHJlc3MsIHZhbHVlKTsKK30KKworLyoKKyAqIFdyaXRlIHRvIHRoZSBBVEg2S0wgdGhyb3VnaCBpdHMgZGlhZ25vc3RpYyB3aW5kb3cuIE5vIGNvb3BlcmF0aW9uIGZyb20KKyAqIHRoZSBUYXJnZXQgaXMgcmVxdWlyZWQgZm9yIHRoaXMuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9oaWZfZGlhZ193cml0ZTMyKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgYWRkcmVzcywKKwkJCQkJICBfX2xlMzIgdmFsdWUpCit7CisJcmV0dXJuIGFyLT5oaWZfb3BzLT5kaWFnX3dyaXRlMzIoYXIsIGFkZHJlc3MsIHZhbHVlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRoNmtsX2hpZl9ibWlfcmVhZChzdHJ1Y3QgYXRoNmtsICphciwgdTggKmJ1ZiwgdTMyIGxlbikKK3sKKwlyZXR1cm4gYXItPmhpZl9vcHMtPmJtaV9yZWFkKGFyLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9oaWZfYm1pX3dyaXRlKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqYnVmLCB1MzIgbGVuKQoreworCXJldHVybiBhci0+aGlmX29wcy0+Ym1pX3dyaXRlKGFyLCBidWYsIGxlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGF0aDZrbF9oaWZfcmVzdW1lKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCWF0aDZrbF9kYmcoQVRINktMX0RCR19ISUYsICJoaWYgcmVzdW1lXG4iKTsKKworCXJldHVybiBhci0+aGlmX29wcy0+cmVzdW1lKGFyKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgYXRoNmtsX2hpZl9wb3dlcl9vbihzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIHBvd2VyIG9uXG4iKTsKKworCXJldHVybiBhci0+aGlmX29wcy0+cG93ZXJfb24oYXIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBhdGg2a2xfaGlmX3Bvd2VyX29mZihzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIHBvd2VyIG9mZlxuIik7CisKKwlyZXR1cm4gYXItPmhpZl9vcHMtPnBvd2VyX29mZihhcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhdGg2a2xfaGlmX3N0b3Aoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiBzdG9wXG4iKTsKKworCWFyLT5oaWZfb3BzLT5zdG9wKGFyKTsKIH0KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Y19oaWYuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMKc2ltaWxhcml0eSBpbmRleCA4MCUKcmVuYW1lIGZyb20gZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGNfaGlmLmMKcmVuYW1lIHRvIGRyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmMKaW5kZXggODZiMWNjNy4uZTU3ZGEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGNfaGlmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuYwpAQCAtMTMsMTggKzEzLDE5IEBACiAgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgogICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAqLworI2luY2x1ZGUgImhpZi5oIgogCiAjaW5jbHVkZSAiY29yZS5oIgogI2luY2x1ZGUgInRhcmdldC5oIgogI2luY2x1ZGUgImhpZi1vcHMuaCIKLSNpbmNsdWRlICJodGNfaGlmLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBNQUlMQk9YX0ZPUl9CTE9DS19TSVpFICAgICAgICAgIDEKIAogI2RlZmluZSBBVEg2S0xfVElNRV9RVUFOVFVNCTEwICAvKiBpbiBtcyAqLwogCi1zdGF0aWMgaW50IGF0aDZrbGRldl9jcF9zY2F0X2RtYV9idWYoc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqcmVxLCBib29sIGZyb21fZG1hKQorc3RhdGljIGludCBhdGg2a2xfaGlmX2NwX3NjYXRfZG1hX2J1ZihzdHJ1Y3QgaGlmX3NjYXR0ZXJfcmVxICpyZXEsCisJCQkJICAgICAgYm9vbCBmcm9tX2RtYSkKIHsKIAl1OCAqYnVmOwogCWludCBpOwpAQCAtNDYsMTIgKzQ3LDExIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBhdGg2a2xkZXZfcndfY29tcF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpCitpbnQgYXRoNmtsX2hpZl9yd19jb21wX2hhbmRsZXIodm9pZCAqY29udGV4dCwgaW50IHN0YXR1cykKIHsKIAlzdHJ1Y3QgaHRjX3BhY2tldCAqcGFja2V0ID0gY29udGV4dDsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwKLQkJICAgImF0aDZrbGRldl9yd19jb21wX2hhbmRsZXIgKHBrdDoweCVwICwgc3RhdHVzOiAlZFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIHJ3IGNvbXBsZXRpb24gcGt0IDB4JXAgc3RhdHVzICVkXG4iLAogCQkgICBwYWNrZXQsIHN0YXR1cyk7CiAKIAlwYWNrZXQtPnN0YXR1cyA9IHN0YXR1czsKQEAgLTU5LDMwICs1OSw4MyBAQAogCiAJcmV0dXJuIDA7CiB9CisjZGVmaW5lIFJFR19EVU1QX0NPVU5UX0FSNjAwMyAgIDYwCisjZGVmaW5lIFJFR0lTVEVSX0RVTVBfTEVOX01BWCAgIDYwCiAKLXN0YXRpYyBpbnQgYXRoNmtsZGV2X3Byb2NfZGJnX2ludHIoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK3N0YXRpYyB2b2lkIGF0aDZrbF9oaWZfZHVtcF9md19jcmFzaChzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlfX2xlMzIgcmVnZHVtcF92YWxbUkVHSVNURVJfRFVNUF9MRU5fTUFYXTsKKwl1MzIgaSwgYWRkcmVzcywgcmVnZHVtcF9hZGRyID0gMDsKKwlpbnQgcmV0OworCisJaWYgKGFyLT50YXJnZXRfdHlwZSAhPSBUQVJHRVRfVFlQRV9BUjYwMDMpCisJCXJldHVybjsKKworCS8qIHRoZSByZWcgZHVtcCBwb2ludGVyIGlzIGNvcGllZCB0byB0aGUgaG9zdCBpbnRlcmVzdCBhcmVhICovCisJYWRkcmVzcyA9IGF0aDZrbF9nZXRfaGlfaXRlbV9hZGRyKGFyLCBISV9JVEVNKGhpX2ZhaWx1cmVfc3RhdGUpKTsKKwlhZGRyZXNzID0gVEFSR19WVE9QKGFyLT50YXJnZXRfdHlwZSwgYWRkcmVzcyk7CisKKwkvKiByZWFkIFJBTSBsb2NhdGlvbiB0aHJvdWdoIGRpYWdub3N0aWMgd2luZG93ICovCisJcmV0ID0gYXRoNmtsX2RpYWdfcmVhZDMyKGFyLCBhZGRyZXNzLCAmcmVnZHVtcF9hZGRyKTsKKworCWlmIChyZXQgfHwgIXJlZ2R1bXBfYWRkcikgeworCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIGdldCBwdHIgdG8gcmVnaXN0ZXIgZHVtcCBhcmVhOiAlZFxuIiwKKwkJCSAgICByZXQpOworCQlyZXR1cm47CisJfQorCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0lSUSwgInJlZ2lzdGVyIGR1bXAgZGF0YSBhZGRyZXNzIDB4JXhcbiIsCisJCXJlZ2R1bXBfYWRkcik7CisJcmVnZHVtcF9hZGRyID0gVEFSR19WVE9QKGFyLT50YXJnZXRfdHlwZSwgcmVnZHVtcF9hZGRyKTsKKworCS8qIGZldGNoIHJlZ2lzdGVyIGR1bXAgZGF0YSAqLworCXJldCA9IGF0aDZrbF9kaWFnX3JlYWQoYXIsIHJlZ2R1bXBfYWRkciwgKHU4ICopJnJlZ2R1bXBfdmFsWzBdLAorCQkJCSAgUkVHX0RVTVBfQ09VTlRfQVI2MDAzICogKHNpemVvZih1MzIpKSk7CisJaWYgKHJldCkgeworCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIGdldCByZWdpc3RlciBkdW1wOiAlZFxuIiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKworCWF0aDZrbF9pbmZvKCJjcmFzaCBkdW1wOlxuIik7CisJYXRoNmtsX2luZm8oImh3IDB4JXggZncgJXNcbiIsIGFyLT53aXBoeS0+aHdfdmVyc2lvbiwKKwkJICAgIGFyLT53aXBoeS0+ZndfdmVyc2lvbik7CisKKwlCVUlMRF9CVUdfT04oUkVHX0RVTVBfQ09VTlRfQVI2MDAzICUgNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkVHX0RVTVBfQ09VTlRfQVI2MDAzIC8gNDsgaSsrKSB7CisJCWF0aDZrbF9pbmZvKCIlZDogMHglOC44eCAweCU4Ljh4IDB4JTguOHggMHglOC44eFxuIiwKKwkJCSAgICA0ICogaSwKKwkJCSAgICBsZTMyX3RvX2NwdShyZWdkdW1wX3ZhbFtpXSksCisJCQkgICAgbGUzMl90b19jcHUocmVnZHVtcF92YWxbaSArIDFdKSwKKwkJCSAgICBsZTMyX3RvX2NwdShyZWdkdW1wX3ZhbFtpICsgMl0pLAorCQkJICAgIGxlMzJfdG9fY3B1KHJlZ2R1bXBfdmFsW2kgKyAzXSkpOworCX0KKworfQorCitzdGF0aWMgaW50IGF0aDZrbF9oaWZfcHJvY19kYmdfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQogewogCXUzMiBkdW1teTsKLQlpbnQgc3RhdHVzOworCWludCByZXQ7CiAKLQlhdGg2a2xfZXJyKCJ0YXJnZXQgZGVidWcgaW50ZXJydXB0XG4iKTsKLQotCWF0aDZrbF90YXJnZXRfZmFpbHVyZShkZXYtPmFyKTsKKwlhdGg2a2xfd2FybigiZmlybXdhcmUgY3Jhc2hlZFxuIik7CiAKIAkvKgogCSAqIHJlYWQgY291bnRlciB0byBjbGVhciB0aGUgaW50ZXJydXB0LCB0aGUgZGVidWcgZXJyb3IgaW50ZXJydXB0IGlzCiAJICogY291bnRlciAwLgogCSAqLwotCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoZGV2LT5hciwgQ09VTlRfREVDX0FERFJFU1MsCisJcmV0ID0gaGlmX3JlYWRfd3JpdGVfc3luYyhkZXYtPmFyLCBDT1VOVF9ERUNfQUREUkVTUywKIAkJCQkgICAgICh1OCAqKSZkdW1teSwgNCwgSElGX1JEX1NZTkNfQllURV9JTkMpOwotCWlmIChzdGF0dXMpCi0JCVdBUk5fT04oMSk7CisJaWYgKHJldCkKKwkJYXRoNmtsX3dhcm4oIkZhaWxlZCB0byBjbGVhciBkZWJ1ZyBpbnRlcnJ1cHQ6ICVkXG4iLCByZXQpOwogCi0JcmV0dXJuIHN0YXR1czsKKwlhdGg2a2xfaGlmX2R1bXBfZndfY3Jhc2goZGV2LT5hcik7CisKKwlyZXR1cm4gcmV0OwogfQogCiAvKiBtYWlsYm94IHJlY3YgbWVzc2FnZSBwb2xsaW5nICovCi1pbnQgYXRoNmtsZGV2X3BvbGxfbWJveG1zZ19yeChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LCB1MzIgKmxrX2FoZCwKK2ludCBhdGg2a2xfaGlmX3BvbGxfbWJveG1zZ19yeChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LCB1MzIgKmxrX2FoZCwKIAkJCSAgICAgIGludCB0aW1lb3V0KQogewogCXN0cnVjdCBhdGg2a2xfaXJxX3Byb2NfcmVnaXN0ZXJzICpyZzsKQEAgLTExOCw3ICsxNzEsNyBAQAogCiAJCS8qIGRlbGF5IGEgbGl0dGxlICAqLwogCQltZGVsYXkoQVRINktMX1RJTUVfUVVBTlRVTSk7Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwgInJldHJ5IG1ib3ggcG9sbCA6ICVkXG4iLCBpKTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiByZXRyeSBtYm94IHBvbGwgdHJ5ICVkXG4iLCBpKTsKIAl9CiAKIAlpZiAoaSA9PSAwKSB7CkBAIC0xMzEsNyArMTg0LDcgQEAKIAkJCSAqIFRhcmdldCBmYWlsdXJlIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQgaW4gY2FzZSBvZgogCQkJICogYW4gYXNzZXJ0LgogCQkJICovCi0JCQlhdGg2a2xkZXZfcHJvY19kYmdfaW50cihkZXYpOworCQkJYXRoNmtsX2hpZl9wcm9jX2RiZ19pbnRyKGRldik7CiAJfQogCiAJcmV0dXJuIHN0YXR1czsKQEAgLTE0MSwxMSArMTk0LDE0IEBACiAgKiBEaXNhYmxlIHBhY2tldCByZWNlcHRpb24gKHVzZWQgaW4gY2FzZSB0aGUgaG9zdCBydW5zIG91dCBvZiBidWZmZXJzKQogICogdXNpbmcgdGhlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXJzIHRocm91Z2ggdGhlIGhvc3QgSS9GCiAgKi8KLWludCBhdGg2a2xkZXZfcnhfY29udHJvbChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LCBib29sIGVuYWJsZV9yeCkKK2ludCBhdGg2a2xfaGlmX3J4X2NvbnRyb2woc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGVfcngpCiB7CiAJc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyByZWdzOwogCWludCBzdGF0dXMgPSAwOwogCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hJRiwgImhpZiByeCAlc1xuIiwKKwkJICAgZW5hYmxlX3J4ID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCiAJLyogdGFrZSB0aGUgbG9jayB0byBwcm90ZWN0IGludGVycnVwdCBlbmFibGUgc2hhZG93cyAqLwogCXNwaW5fbG9ja19iaCgmZGV2LT5sb2NrKTsKIApAQCAtMTY4LDcgKzIyNCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotaW50IGF0aDZrbGRldl9zdWJtaXRfc2NhdF9yZXEoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwKK2ludCBhdGg2a2xfaGlmX3N1Ym1pdF9zY2F0X3JlcShzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LAogCQkJICAgICAgc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqc2NhdF9yZXEsIGJvb2wgcmVhZCkKIHsKIAlpbnQgc3RhdHVzID0gMDsKQEAgLTE4NSwxNCArMjQxLDE0IEBACiAJCQlkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHI7CiAJfQogCi0JYXRoNmtsX2RiZygoQVRINktMX0RCR19IVENfUkVDViB8IEFUSDZLTF9EQkdfSFRDX1NFTkQpLAotCQkgICAiYXRoNmtsZGV2X3N1Ym1pdF9zY2F0X3JlcSwgZW50cmllczogJWQsIHRvdGFsIGxlbjogJWQgbWJveDoweCVYIChtb2RlOiAlcyA6ICVzKVxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLAorCQkgICAiaGlmIHN1Ym1pdCBzY2F0dGVyIHJlcXVlc3QgZW50cmllcyAlZCBsZW4gJWQgbWJveCAweCV4ICVzICVzXG4iLAogCQkgICBzY2F0X3JlcS0+c2NhdF9lbnRyaWVzLCBzY2F0X3JlcS0+bGVuLAogCQkgICBzY2F0X3JlcS0+YWRkciwgIXJlYWQgPyAiYXN5bmMiIDogInN5bmMiLAogCQkgICAocmVhZCkgPyAicmQiIDogIndyIik7CiAKIAlpZiAoIXJlYWQgJiYgc2NhdF9yZXEtPnZpcnRfc2NhdCkgewotCQlzdGF0dXMgPSBhdGg2a2xkZXZfY3Bfc2NhdF9kbWFfYnVmKHNjYXRfcmVxLCBmYWxzZSk7CisJCXN0YXR1cyA9IGF0aDZrbF9oaWZfY3Bfc2NhdF9kbWFfYnVmKHNjYXRfcmVxLCBmYWxzZSk7CiAJCWlmIChzdGF0dXMpIHsKIAkJCXNjYXRfcmVxLT5zdGF0dXMgPSBzdGF0dXM7CiAJCQlzY2F0X3JlcS0+Y29tcGxldGUoZGV2LT5hci0+aHRjX3RhcmdldCwgc2NhdF9yZXEpOwpAQCAtMjA3LDEzICsyNjMsMTMgQEAKIAkJc2NhdF9yZXEtPnN0YXR1cyA9IHN0YXR1czsKIAkJaWYgKCFzdGF0dXMgJiYgc2NhdF9yZXEtPnZpcnRfc2NhdCkKIAkJCXNjYXRfcmVxLT5zdGF0dXMgPQotCQkJCWF0aDZrbGRldl9jcF9zY2F0X2RtYV9idWYoc2NhdF9yZXEsIHRydWUpOworCQkJCWF0aDZrbF9oaWZfY3Bfc2NhdF9kbWFfYnVmKHNjYXRfcmVxLCB0cnVlKTsKIAl9CiAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbGRldl9wcm9jX2NvdW50ZXJfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhdGg2a2xfaGlmX3Byb2NfY291bnRlcl9pbnRyKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCiB7CiAJdTggY291bnRlcl9pbnRfc3RhdHVzOwogCkBAIC0yMzIsMTIgKzI4OCwxMiBAQAogCSAqIHRoZSBkZWJ1ZyBhc3NlcnRpb24gY291bnRlciBpbnRlcnJ1cHQuCiAJICovCiAJaWYgKGNvdW50ZXJfaW50X3N0YXR1cyAmIEFUSDZLTF9UQVJHRVRfREVCVUdfSU5UUl9NQVNLKQotCQlyZXR1cm4gYXRoNmtsZGV2X3Byb2NfZGJnX2ludHIoZGV2KTsKKwkJcmV0dXJuIGF0aDZrbF9oaWZfcHJvY19kYmdfaW50cihkZXYpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsZGV2X3Byb2NfZXJyX2ludHIoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbnQgYXRoNmtsX2hpZl9wcm9jX2Vycl9pbnRyKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCiB7CiAJaW50IHN0YXR1czsKIAl1OCBlcnJvcl9pbnRfc3RhdHVzOwpAQCAtMjgyLDcgKzMzOCw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBhdGg2a2xkZXZfcHJvY19jcHVfaW50cihzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQorc3RhdGljIGludCBhdGg2a2xfaGlmX3Byb2NfY3B1X2ludHIoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKIHsKIAlpbnQgc3RhdHVzOwogCXU4IGNwdV9pbnRfc3RhdHVzOwpAQCAtNDE3LDcgKzQ3Myw3IEBACiAJCSAqIHdlIHJhcGlkbHkgcHVsbCBwYWNrZXRzLgogCQkgKi8KIAkJc3RhdHVzID0gYXRoNmtsX2h0Y19yeG1zZ19wZW5kaW5nX2hhbmRsZXIoZGV2LT5odGNfY254dCwKLQkJCQkJCQkgICZsa19haGQsICZmZXRjaGVkKTsKKwkJCQkJCQkgIGxrX2FoZCwgJmZldGNoZWQpOwogCQlpZiAoc3RhdHVzKQogCQkJZ290byBvdXQ7CiAKQEAgLTQzNiwyMSArNDkyLDIxIEBACiAKIAlpZiAoTVMoSE9TVF9JTlRfU1RBVFVTX0NQVSwgaG9zdF9pbnRfc3RhdHVzKSkgewogCQkvKiBDUFUgSW50ZXJydXB0ICovCi0JCXN0YXR1cyA9IGF0aDZrbGRldl9wcm9jX2NwdV9pbnRyKGRldik7CisJCXN0YXR1cyA9IGF0aDZrbF9oaWZfcHJvY19jcHVfaW50cihkZXYpOwogCQlpZiAoc3RhdHVzKQogCQkJZ290byBvdXQ7CiAJfQogCiAJaWYgKE1TKEhPU1RfSU5UX1NUQVRVU19FUlJPUiwgaG9zdF9pbnRfc3RhdHVzKSkgewogCQkvKiBFcnJvciBJbnRlcnJ1cHQgKi8KLQkJc3RhdHVzID0gYXRoNmtsZGV2X3Byb2NfZXJyX2ludHIoZGV2KTsKKwkJc3RhdHVzID0gYXRoNmtsX2hpZl9wcm9jX2Vycl9pbnRyKGRldik7CiAJCWlmIChzdGF0dXMpCiAJCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAoTVMoSE9TVF9JTlRfU1RBVFVTX0NPVU5URVIsIGhvc3RfaW50X3N0YXR1cykpCiAJCS8qIENvdW50ZXIgSW50ZXJydXB0ICovCi0JCXN0YXR1cyA9IGF0aDZrbGRldl9wcm9jX2NvdW50ZXJfaW50cihkZXYpOworCQlzdGF0dXMgPSBhdGg2a2xfaGlmX3Byb2NfY291bnRlcl9pbnRyKGRldik7CiAKIG91dDoKIAkvKgpAQCAtNDc5LDkgKzUzNSwxMCBAQAogfQogCiAvKiBpbnRlcnJ1cHQgaGFuZGxlciwga2lja3Mgb2ZmIGFsbCBpbnRlcnJ1cHQgcHJvY2Vzc2luZyAqLwotaW50IGF0aDZrbGRldl9pbnRyX2JoX2hhbmRsZXIoc3RydWN0IGF0aDZrbCAqYXIpCitpbnQgYXRoNmtsX2hpZl9pbnRyX2JoX2hhbmRsZXIoc3RydWN0IGF0aDZrbCAqYXIpCiB7CiAJc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiA9IGFyLT5odGNfdGFyZ2V0LT5kZXY7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCWludCBzdGF0dXMgPSAwOwogCWJvb2wgZG9uZSA9IGZhbHNlOwogCkBAIC00OTUsNyArNTUyLDggQEAKIAkgKiBJUlEgcHJvY2Vzc2luZyBpcyBzeW5jaHJvbm91cywgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlcnMgY2FuIGJlCiAJICogcmUtcmVhZC4KIAkgKi8KLQl3aGlsZSAoIWRvbmUpIHsKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQVRINktMX0hJRl9DT01NVU5JQ0FUSU9OX1RJTUVPVVQpOworCXdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSAmJiAhZG9uZSkgewogCQlzdGF0dXMgPSBwcm9jX3BlbmRpbmdfaXJxcyhkZXYsICZkb25lKTsKIAkJaWYgKHN0YXR1cykKIAkJCWJyZWFrOwpAQCAtNTA0LDcgKzU2Miw3IEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdGljIGludCBhdGg2a2xkZXZfZW5hYmxlX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCitzdGF0aWMgaW50IGF0aDZrbF9oaWZfZW5hYmxlX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyByZWdzOwogCWludCBzdGF0dXM7CkBAIC01NTIsNyArNjEwLDcgQEAKIAlyZXR1cm4gc3RhdHVzOwogfQogCi1pbnQgYXRoNmtsZGV2X2Rpc2FibGVfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKK2ludCBhdGg2a2xfaGlmX2Rpc2FibGVfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIHJlZ3M7CiAKQEAgLTU3MSw3ICs2MjksNyBAQAogfQogCiAvKiBlbmFibGUgZGV2aWNlIGludGVycnVwdHMgKi8KLWludCBhdGg2a2xkZXZfdW5tYXNrX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCitpbnQgYXRoNmtsX2hpZl91bm1hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldikKIHsKIAlpbnQgc3RhdHVzID0gMDsKIApAQCAtNTgzLDI5ICs2NDEsMjkgQEAKIAkgKiB0YXJnZXQgInNvZnQiIHJlc2V0cy4gVGhlIEFUSDZLTCBpbnRlcnJ1cHQgZW5hYmxlcyByZXNldCBiYWNrIHRvIGFuCiAJICogImVuYWJsZWQiIHN0YXRlIHdoZW4gdGhpcyBoYXBwZW5zLgogCSAqLwotCWF0aDZrbGRldl9kaXNhYmxlX2ludHJzKGRldik7CisJYXRoNmtsX2hpZl9kaXNhYmxlX2ludHJzKGRldik7CiAKIAkvKiB1bm1hc2sgdGhlIGhvc3QgY29udHJvbGxlciBpbnRlcnJ1cHRzICovCiAJYXRoNmtsX2hpZl9pcnFfZW5hYmxlKGRldi0+YXIpOwotCXN0YXR1cyA9IGF0aDZrbGRldl9lbmFibGVfaW50cnMoZGV2KTsKKwlzdGF0dXMgPSBhdGg2a2xfaGlmX2VuYWJsZV9pbnRycyhkZXYpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KIAogLyogZGlzYWJsZSBhbGwgZGV2aWNlIGludGVycnVwdHMgKi8KLWludCBhdGg2a2xkZXZfbWFza19pbnRycyhzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQoraW50IGF0aDZrbF9oaWZfbWFza19pbnRycyhzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQogewogCS8qCiAJICogTWFzayB0aGUgaW50ZXJydXB0IGF0IHRoZSBISUYgbGF5ZXIgdG8gYXZvaWQgYW55IHN0cmF5IGludGVycnVwdAogCSAqIHRha2VuIHdoaWxlIHdlIHplcm8gb3V0IG91ciBzaGFkb3cgcmVnaXN0ZXJzIGluCi0JICogYXRoNmtsZGV2X2Rpc2FibGVfaW50cnMoKS4KKwkgKiBhdGg2a2xfaGlmX2Rpc2FibGVfaW50cnMoKS4KIAkgKi8KIAlhdGg2a2xfaGlmX2lycV9kaXNhYmxlKGRldi0+YXIpOwogCi0JcmV0dXJuIGF0aDZrbGRldl9kaXNhYmxlX2ludHJzKGRldik7CisJcmV0dXJuIGF0aDZrbF9oaWZfZGlzYWJsZV9pbnRycyhkZXYpOwogfQogCi1pbnQgYXRoNmtsZGV2X3NldHVwKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpCitpbnQgYXRoNmtsX2hpZl9zZXR1cChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KQogewogCWludCBzdGF0dXMgPSAwOwogCkBAIC02MjEsMTkgKzY3OSwxNyBAQAogCS8qIG11c3QgYmUgYSBwb3dlciBvZiAyICovCiAJaWYgKChkZXYtPmh0Y19jbnh0LT5ibG9ja19zeiAmIChkZXYtPmh0Y19jbnh0LT5ibG9ja19zeiAtIDEpKSAhPSAwKSB7CiAJCVdBUk5fT04oMSk7CisJCXN0YXR1cyA9IC1FSU5WQUw7CiAJCWdvdG8gZmFpbF9zZXR1cDsKIAl9CiAKIAkvKiBhc3NlbWJsZSBtYXNrLCB1c2VkIGZvciBwYWRkaW5nIHRvIGEgYmxvY2sgKi8KIAlkZXYtPmh0Y19jbnh0LT5ibG9ja19tYXNrID0gZGV2LT5odGNfY254dC0+YmxvY2tfc3ogLSAxOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgImJsb2NrIHNpemU6ICVkLCBtYm94IGFkZHI6MHglWFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSElGLCAiaGlmIGJsb2NrIHNpemUgJWQgbWJveCBhZGRyIDB4JXhcbiIsCiAJCSAgIGRldi0+aHRjX2NueHQtPmJsb2NrX3N6LCBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIpOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywKLQkJICAgImhpZiBpbnRlcnJ1cHQgcHJvY2Vzc2luZyBpcyBzeW5jIG9ubHlcbiIpOwotCi0Jc3RhdHVzID0gYXRoNmtsZGV2X2Rpc2FibGVfaW50cnMoZGV2KTsKKwlzdGF0dXMgPSBhdGg2a2xfaGlmX2Rpc2FibGVfaW50cnMoZGV2KTsKIAogZmFpbF9zZXR1cDoKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaGlmLmgKaW5kZXggNzk3ZTJkMS4uNjk5YTAzNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9oaWYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2hpZi5oCkBAIC0zNSw2ICszNSw3IEBACiAjZGVmaW5lIE1BWF9TQ0FUVEVSX1JFUV9UUkFOU0ZFUl9TSVpFICAgICgzMiAqIDEwMjQpCiAKICNkZWZpbmUgTUFOVUZBQ1RVUkVSX0lEX0FSNjAwM19CQVNFICAgICAgICAweDMwMAorI2RlZmluZSBNQU5VRkFDVFVSRVJfSURfQVI2MDA0X0JBU0UgICAgICAgIDB4NDAwCiAgICAgLyogU0RJTyBtYW51ZmFjdHVyZXIgSUQgYW5kIENvZGVzICovCiAjZGVmaW5lIE1BTlVGQUNUVVJFUl9JRF9BVEg2S0xfQkFTRV9NQVNLICAgICAweEZGMDAKICNkZWZpbmUgTUFOVUZBQ1RVUkVSX0NPREUgICAgICAgICAgICAgICAgICAweDI3MQkvKiBBdGhlcm9zICovCkBAIC01OSw2ICs2MCwxOCBAQAogLyogbW9kZSB0byBlbmFibGUgc3BlY2lhbCA0LWJpdCBpbnRlcnJ1cHQgYXNzZXJ0aW9uIHdpdGhvdXQgY2xvY2sgKi8KICNkZWZpbmUgU0RJT19JUlFfTU9ERV9BU1lOQ180QklUX0lSUSAgICgxIDw8IDApCiAKKy8qIEhUQyBydW5zIG92ZXIgbWFpbGJveCAwICovCisjZGVmaW5lIEhUQ19NQUlMQk9YCTAKKworI2RlZmluZSBBVEg2S0xfVEFSR0VUX0RFQlVHX0lOVFJfTUFTSyAgICAgMHgwMQorCisvKiBGSVhNRTogYXJlIHRoZXNlIGR1cGxpY2F0ZXMgd2l0aCBNQVhfU0NBVFRFUl8gdmFsdWVzIGluIGhpZi5oPyAqLworI2RlZmluZSBBVEg2S0xfU0NBVFRFUl9FTlRSSUVTX1BFUl9SRVEgICAgICAgICAgICAxNgorI2RlZmluZSBBVEg2S0xfTUFYX1RSQU5TRkVSX1NJWkVfUEVSX1NDQVRURVIgICAgICAoMTYgKiAxMDI0KQorI2RlZmluZSBBVEg2S0xfU0NBVFRFUl9SRVFTICAgICAgICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgQVRINktMX0hJRl9DT01NVU5JQ0FUSU9OX1RJTUVPVVQJMTAwMAorCiBzdHJ1Y3QgYnVzX3JlcXVlc3QgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIApAQCAtMTg2LDYgKzE5OSwzNCBAQAogCXN0cnVjdCBoaWZfc2NhdHRlcl9pdGVtIHNjYXRfbGlzdFsxXTsKIH07CiAKK3N0cnVjdCBhdGg2a2xfaXJxX3Byb2NfcmVnaXN0ZXJzIHsKKwl1OCBob3N0X2ludF9zdGF0dXM7CisJdTggY3B1X2ludF9zdGF0dXM7CisJdTggZXJyb3JfaW50X3N0YXR1czsKKwl1OCBjb3VudGVyX2ludF9zdGF0dXM7CisJdTggbWJveF9mcmFtZTsKKwl1OCByeF9sa2FoZF92YWxpZDsKKwl1OCBob3N0X2ludF9zdGF0dXMyOworCXU4IGdtYm94X3J4X2F2YWlsOworCV9fbGUzMiByeF9sa2FoZFsyXTsKKwlfX2xlMzIgcnhfZ21ib3hfbGthaGRfYWxpYXNbMl07Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgYXRoNmtsX2lycV9lbmFibGVfcmVnIHsKKwl1OCBpbnRfc3RhdHVzX2VuOworCXU4IGNwdV9pbnRfc3RhdHVzX2VuOworCXU4IGVycl9pbnRfc3RhdHVzX2VuOworCXU4IGNudHJfaW50X3N0YXR1c19lbjsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBhdGg2a2xfZGV2aWNlIHsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IGF0aDZrbF9pcnFfcHJvY19yZWdpc3RlcnMgaXJxX3Byb2NfcmVnOworCXN0cnVjdCBhdGg2a2xfaXJxX2VuYWJsZV9yZWcgaXJxX2VuX3JlZzsKKwlzdHJ1Y3QgaHRjX3RhcmdldCAqaHRjX2NueHQ7CisJc3RydWN0IGF0aDZrbCAqYXI7Cit9OworCiBzdHJ1Y3QgYXRoNmtsX2hpZl9vcHMgewogCWludCAoKnJlYWRfd3JpdGVfc3luYykoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyLCB1OCAqYnVmLAogCQkJICAgICAgIHUzMiBsZW4sIHUzMiByZXF1ZXN0KTsKQEAgLTIwMiw3ICsyNDMsMzAgQEAKIAlpbnQgKCpzY2F0X3JlcV9ydykgKHN0cnVjdCBhdGg2a2wgKmFyLAogCQkJICAgIHN0cnVjdCBoaWZfc2NhdHRlcl9yZXEgKnNjYXRfcmVxKTsKIAl2b2lkICgqY2xlYW51cF9zY2F0dGVyKShzdHJ1Y3QgYXRoNmtsICphcik7Ci0JaW50ICgqc3VzcGVuZCkoc3RydWN0IGF0aDZrbCAqYXIpOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCBhdGg2a2wgKmFyLCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpOworCWludCAoKnJlc3VtZSkoc3RydWN0IGF0aDZrbCAqYXIpOworCWludCAoKmRpYWdfcmVhZDMyKShzdHJ1Y3QgYXRoNmtsICphciwgdTMyIGFkZHJlc3MsIHUzMiAqdmFsdWUpOworCWludCAoKmRpYWdfd3JpdGUzMikoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLCBfX2xlMzIgdmFsdWUpOworCWludCAoKmJtaV9yZWFkKShzdHJ1Y3QgYXRoNmtsICphciwgdTggKmJ1ZiwgdTMyIGxlbik7CisJaW50ICgqYm1pX3dyaXRlKShzdHJ1Y3QgYXRoNmtsICphciwgdTggKmJ1ZiwgdTMyIGxlbik7CisJaW50ICgqcG93ZXJfb24pKHN0cnVjdCBhdGg2a2wgKmFyKTsKKwlpbnQgKCpwb3dlcl9vZmYpKHN0cnVjdCBhdGg2a2wgKmFyKTsKKwl2b2lkICgqc3RvcCkoc3RydWN0IGF0aDZrbCAqYXIpOwogfTsKIAoraW50IGF0aDZrbF9oaWZfc2V0dXAoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7CitpbnQgYXRoNmtsX2hpZl91bm1hc2tfaW50cnMoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldik7CitpbnQgYXRoNmtsX2hpZl9tYXNrX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpOworaW50IGF0aDZrbF9oaWZfcG9sbF9tYm94bXNnX3J4KHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYsCisJCQkgICAgICAgdTMyICpsa19haGQsIGludCB0aW1lb3V0KTsKK2ludCBhdGg2a2xfaGlmX3J4X2NvbnRyb2woc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGVfcngpOworaW50IGF0aDZrbF9oaWZfZGlzYWJsZV9pbnRycyhzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KTsKKworaW50IGF0aDZrbF9oaWZfcndfY29tcF9oYW5kbGVyKHZvaWQgKmNvbnRleHQsIGludCBzdGF0dXMpOworaW50IGF0aDZrbF9oaWZfaW50cl9iaF9oYW5kbGVyKHN0cnVjdCBhdGg2a2wgKmFyKTsKKworLyogU2NhdHRlciBGdW5jdGlvbiBhbmQgRGVmaW5pdGlvbnMgKi8KK2ludCBhdGg2a2xfaGlmX3N1Ym1pdF9zY2F0X3JlcShzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2LAorCQkJICAgICAgIHN0cnVjdCBoaWZfc2NhdHRlcl9yZXEgKnNjYXRfcmVxLCBib29sIHJlYWQpOworCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Yy5jCmluZGV4IGY4OGE3YzkuLmYzYjYzY2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGMuYwpAQCAtMTUsMTMgKzE1LDMyMSBAQAogICovCiAKICNpbmNsdWRlICJjb3JlLmgiCi0jaW5jbHVkZSAiaHRjX2hpZi5oIgorI2luY2x1ZGUgImhpZi5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiaGlmLW9wcy5oIgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KIAogI2RlZmluZSBDQUxDX1RYUlhfUEFEREVEX0xFTihkZXYsIGxlbikgIChfX0FMSUdOX01BU0soKGxlbiksIChkZXYpLT5ibG9ja19tYXNrKSkKIAorLyogRnVuY3Rpb25zIGZvciBUeCBjcmVkaXQgaGFuZGxpbmcgKi8KK3N0YXRpYyB2b2lkIGF0aDZrbF9jcmVkaXRfZGVwb3NpdChzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbyAqY3JlZF9pbmZvLAorCQkJCSAgc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCwKKwkJCQkgIGludCBjcmVkaXRzKQoreworCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsICJjcmVkaXQgZGVwb3NpdCBlcCAlZCBjcmVkaXRzICVkXG4iLAorCQkgICBlcF9kaXN0LT5lbmRwb2ludCwgY3JlZGl0cyk7CisKKwllcF9kaXN0LT5jcmVkaXRzICs9IGNyZWRpdHM7CisJZXBfZGlzdC0+Y3JlZF9hc3NuZ2QgKz0gY3JlZGl0czsKKwljcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgLT0gY3JlZGl0czsKK30KKworc3RhdGljIHZvaWQgYXRoNmtsX2NyZWRpdF9pbml0KHN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvICpjcmVkX2luZm8sCisJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqZXBfbGlzdCwKKwkJCSAgICAgICBpbnQgdG90X2NyZWRpdHMpCit7CisJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqY3VyX2VwX2Rpc3Q7CisJaW50IGNvdW50OworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgImNyZWRpdCBpbml0IHRvdGFsICVkXG4iLCB0b3RfY3JlZGl0cyk7CisKKwljcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgPSB0b3RfY3JlZGl0czsKKwljcmVkX2luZm8tPnRvdGFsX2F2YWlsX2NyZWRpdHMgPSB0b3RfY3JlZGl0czsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2VwX2Rpc3QsIGVwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN1cl9lcF9kaXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQorCQkJY29udGludWU7CisKKwkJY3VyX2VwX2Rpc3QtPmNyZWRfbWluID0gY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZzsKKworCQlpZiAodG90X2NyZWRpdHMgPiA0KSB7CisJCQlpZiAoKGN1cl9lcF9kaXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfQktfU1ZDKSB8fAorCQkJICAgIChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JFX1NWQykpIHsKKwkJCQlhdGg2a2xfY3JlZGl0X2RlcG9zaXQoY3JlZF9pbmZvLAorCQkJCQkJICAgICAgY3VyX2VwX2Rpc3QsCisJCQkJCQkgICAgICBjdXJfZXBfZGlzdC0+Y3JlZF9taW4pOworCQkJCWN1cl9lcF9kaXN0LT5kaXN0X2ZsYWdzIHw9IEhUQ19FUF9BQ1RJVkU7CisJCQl9CisJCX0KKworCQlpZiAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfQ09OVFJPTF9TVkMpIHsKKwkJCWF0aDZrbF9jcmVkaXRfZGVwb3NpdChjcmVkX2luZm8sIGN1cl9lcF9kaXN0LAorCQkJCQkgICAgICBjdXJfZXBfZGlzdC0+Y3JlZF9taW4pOworCQkJLyoKKwkJCSAqIENvbnRyb2wgc2VydmljZSBpcyBhbHdheXMgbWFya2VkIGFjdGl2ZSwgaXQKKwkJCSAqIG5ldmVyIGdvZXMgaW5hY3RpdmUgRVZFUi4KKwkJCSAqLworCQkJY3VyX2VwX2Rpc3QtPmRpc3RfZmxhZ3MgfD0gSFRDX0VQX0FDVElWRTsKKwkJfSBlbHNlIGlmIChjdXJfZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JLX1NWQykKKwkJCS8qIHRoaXMgaXMgdGhlIGxvd2VzdCBwcmlvcml0eSBkYXRhIGVuZHBvaW50ICovCisJCQkvKiBGSVhNRTogdGhpcyBsb29rcyBmaXNoeSwgY2hlY2sgKi8KKwkJCWNyZWRfaW5mby0+bG93ZXN0cHJpX2VwX2Rpc3QgPSBjdXJfZXBfZGlzdC0+bGlzdDsKKworCQkvKgorCQkgKiBTdHJlYW1zIGhhdmUgdG8gYmUgY3JlYXRlZCAoZXhwbGljaXQgfCBpbXBsaWNpdCkgZm9yIGFsbAorCQkgKiBraW5kcyBvZiB0cmFmZmljLiBCRSBlbmRwb2ludHMgYXJlIGFsc28gaW5hY3RpdmUgaW4gdGhlCisJCSAqIGJlZ2lubmluZy4gV2hlbiBCRSB0cmFmZmljIHN0YXJ0cyBpdCBjcmVhdGVzIGltcGxpY2l0CisJCSAqIHN0cmVhbXMgdGhhdCByZWRpc3RyaWJ1dGVzIGNyZWRpdHMuCisJCSAqCisJCSAqIE5vdGU6IGFsbCBvdGhlciBlbmRwb2ludHMgaGF2ZSBtaW5pbXVtcyBzZXQgYnV0IGFyZQorCQkgKiBpbml0aWFsbHkgZ2l2ZW4gTk8gY3JlZGl0cy4gY3JlZGl0cyB3aWxsIGJlIGRpc3RyaWJ1dGVkCisJCSAqIGFzIHRyYWZmaWMgYWN0aXZpdHkgZGVtYW5kcworCQkgKi8KKwl9CisKKwlXQVJOX09OKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA8PSAwKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2VwX2Rpc3QsIGVwX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGN1cl9lcF9kaXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQorCQkJY29udGludWU7CisKKwkJaWYgKGN1cl9lcF9kaXN0LT5zdmNfaWQgPT0gV01JX0NPTlRST0xfU1ZDKQorCQkJY3VyX2VwX2Rpc3QtPmNyZWRfbm9ybSA9IGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2c7CisJCWVsc2UgeworCQkJLyoKKwkJCSAqIEZvciB0aGUgcmVtYWluaW5nIGRhdGEgZW5kcG9pbnRzLCB3ZSBhc3N1bWUgdGhhdAorCQkJICogZWFjaCBjcmVkX3Blcl9tc2cgYXJlIHRoZSBzYW1lLiBXZSB1c2UgYSBzaW1wbGUKKwkJCSAqIGNhbGN1bGF0aW9uIGhlcmUsIHdlIHRha2UgdGhlIHJlbWFpbmluZyBjcmVkaXRzCisJCQkgKiBhbmQgZGV0ZXJtaW5lIGhvdyBtYW55IG1heCBtZXNzYWdlcyB0aGlzIGNhbgorCQkJICogY292ZXIgYW5kIHRoZW4gc2V0IGVhY2ggZW5kcG9pbnQncyBub3JtYWwgdmFsdWUKKwkJCSAqIGVxdWFsIHRvIDMvNCB0aGlzIGFtb3VudC4KKwkJCSAqLworCQkJY291bnQgPSAoY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzIC8KKwkJCQkgY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZykKKwkJCQkqIGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2c7CisJCQljb3VudCA9IChjb3VudCAqIDMpID4+IDI7CisJCQljb3VudCA9IG1heChjb3VudCwgY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZyk7CisJCQljdXJfZXBfZGlzdC0+Y3JlZF9ub3JtID0gY291bnQ7CisKKwkJfQorCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19DUkVESVQsCisJCQkgICAiY3JlZGl0IGVwICVkIHN2Y19pZCAlZCBjcmVkaXRzICVkIHBlcl9tc2cgJWQgbm9ybSAlZCBtaW4gJWRcbiIsCisJCQkgICBjdXJfZXBfZGlzdC0+ZW5kcG9pbnQsCisJCQkgICBjdXJfZXBfZGlzdC0+c3ZjX2lkLAorCQkJICAgY3VyX2VwX2Rpc3QtPmNyZWRpdHMsCisJCQkgICBjdXJfZXBfZGlzdC0+Y3JlZF9wZXJfbXNnLAorCQkJICAgY3VyX2VwX2Rpc3QtPmNyZWRfbm9ybSwKKwkJCSAgIGN1cl9lcF9kaXN0LT5jcmVkX21pbik7CisJfQorfQorCisvKiBpbml0aWFsaXplIGFuZCBzZXR1cCBjcmVkaXQgZGlzdHJpYnV0aW9uICovCitpbnQgYXRoNmtsX2NyZWRpdF9zZXR1cCh2b2lkICpodGNfaGFuZGxlLAorCQkJc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbykKK3sKKwl1MTYgc2VydmljZXByaW9yaXR5WzVdOworCisJbWVtc2V0KGNyZWRfaW5mbywgMCwgc2l6ZW9mKHN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvKSk7CisKKwlzZXJ2aWNlcHJpb3JpdHlbMF0gPSBXTUlfQ09OVFJPTF9TVkM7ICAvKiBoaWdoZXN0ICovCisJc2VydmljZXByaW9yaXR5WzFdID0gV01JX0RBVEFfVk9fU1ZDOworCXNlcnZpY2Vwcmlvcml0eVsyXSA9IFdNSV9EQVRBX1ZJX1NWQzsKKwlzZXJ2aWNlcHJpb3JpdHlbM10gPSBXTUlfREFUQV9CRV9TVkM7CisJc2VydmljZXByaW9yaXR5WzRdID0gV01JX0RBVEFfQktfU1ZDOyAvKiBsb3dlc3QgKi8KKworCS8qIHNldCBwcmlvcml0eSBsaXN0ICovCisJYXRoNmtsX2h0Y19zZXRfY3JlZGl0X2Rpc3QoaHRjX2hhbmRsZSwgY3JlZF9pbmZvLCBzZXJ2aWNlcHJpb3JpdHksIDUpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlZHVjZSBhbiBlcCdzIGNyZWRpdHMgYmFjayB0byBhIHNldCBsaW1pdCAqLworc3RhdGljIHZvaWQgYXRoNmtsX2NyZWRpdF9yZWR1Y2Uoc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbywKKwkJCQkgc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqZXBfZGlzdCwKKwkJCQkgaW50IGxpbWl0KQoreworCWludCBjcmVkaXRzOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgImNyZWRpdCByZWR1Y2UgZXAgJWQgbGltaXQgJWRcbiIsCisJCSAgIGVwX2Rpc3QtPmVuZHBvaW50LCBsaW1pdCk7CisKKwllcF9kaXN0LT5jcmVkX2Fzc25nZCA9IGxpbWl0OworCisJaWYgKGVwX2Rpc3QtPmNyZWRpdHMgPD0gbGltaXQpCisJCXJldHVybjsKKworCWNyZWRpdHMgPSBlcF9kaXN0LT5jcmVkaXRzIC0gbGltaXQ7CisJZXBfZGlzdC0+Y3JlZGl0cyAtPSBjcmVkaXRzOworCWNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyArPSBjcmVkaXRzOworfQorCitzdGF0aWMgdm9pZCBhdGg2a2xfY3JlZGl0X3VwZGF0ZShzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbyAqY3JlZF9pbmZvLAorCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICplcGRpc3RfbGlzdCkKK3sKKwlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICpjdXJfZGlzdF9saXN0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJfZGlzdF9saXN0LCBlcGRpc3RfbGlzdCwgbGlzdCkgeworCQlpZiAoY3VyX2Rpc3RfbGlzdC0+ZW5kcG9pbnQgPT0gRU5EUE9JTlRfMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjdXJfZGlzdF9saXN0LT5jcmVkX3RvX2Rpc3QgPiAwKSB7CisJCQljdXJfZGlzdF9saXN0LT5jcmVkaXRzICs9CisJCQkJCWN1cl9kaXN0X2xpc3QtPmNyZWRfdG9fZGlzdDsKKwkJCWN1cl9kaXN0X2xpc3QtPmNyZWRfdG9fZGlzdCA9IDA7CisJCQlpZiAoY3VyX2Rpc3RfbGlzdC0+Y3JlZGl0cyA+CisJCQkgICAgY3VyX2Rpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QpCisJCQkJYXRoNmtsX2NyZWRpdF9yZWR1Y2UoY3JlZF9pbmZvLAorCQkJCQkJY3VyX2Rpc3RfbGlzdCwKKwkJCQkJCWN1cl9kaXN0X2xpc3QtPmNyZWRfYXNzbmdkKTsKKworCQkJaWYgKGN1cl9kaXN0X2xpc3QtPmNyZWRpdHMgPgorCQkJICAgIGN1cl9kaXN0X2xpc3QtPmNyZWRfbm9ybSkKKwkJCQlhdGg2a2xfY3JlZGl0X3JlZHVjZShjcmVkX2luZm8sIGN1cl9kaXN0X2xpc3QsCisJCQkJCQkgICAgIGN1cl9kaXN0X2xpc3QtPmNyZWRfbm9ybSk7CisKKwkJCWlmICghKGN1cl9kaXN0X2xpc3QtPmRpc3RfZmxhZ3MgJiBIVENfRVBfQUNUSVZFKSkgeworCQkJCWlmIChjdXJfZGlzdF9saXN0LT50eHFfZGVwdGggPT0gMCkKKwkJCQkJYXRoNmtsX2NyZWRpdF9yZWR1Y2UoY3JlZF9pbmZvLAorCQkJCQkJCSAgICAgY3VyX2Rpc3RfbGlzdCwgMCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBIVEMgaGFzIGFuIGVuZHBvaW50IHRoYXQgbmVlZHMgY3JlZGl0cywgZXBfZGlzdCBpcyB0aGUgZW5kcG9pbnQgaW4KKyAqIHF1ZXN0aW9uLgorICovCitzdGF0aWMgdm9pZCBhdGg2a2xfY3JlZGl0X3NlZWsoc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbywKKwkJCQlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICplcF9kaXN0KQoreworCXN0cnVjdCBodGNfZW5kcG9pbnRfY3JlZGl0X2Rpc3QgKmN1cmRpc3RfbGlzdDsKKwlpbnQgY3JlZGl0cyA9IDA7CisJaW50IG5lZWQ7CisKKwlpZiAoZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9DT05UUk9MX1NWQykKKwkJZ290byBvdXQ7CisKKwlpZiAoKGVwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9WSV9TVkMpIHx8CisJICAgIChlcF9kaXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfVk9fU1ZDKSkKKwkJaWYgKChlcF9kaXN0LT5jcmVkX2Fzc25nZCA+PSBlcF9kaXN0LT5jcmVkX25vcm0pKQorCQkJZ290byBvdXQ7CisKKwkvKgorCSAqIEZvciBhbGwgb3RoZXIgc2VydmljZXMsIHdlIGZvbGxvdyBhIHNpbXBsZSBhbGdvcml0aG0gb2Y6CisJICoKKwkgKiAxLiBjaGVja2luZyB0aGUgZnJlZSBwb29sIGZvciBjcmVkaXRzCisJICogMi4gY2hlY2tpbmcgbG93ZXIgcHJpb3JpdHkgZW5kcG9pbnRzIGZvciBjcmVkaXRzIHRvIHRha2UKKwkgKi8KKworCWNyZWRpdHMgPSBtaW4oY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzLCBlcF9kaXN0LT5zZWVrX2NyZWQpOworCisJaWYgKGNyZWRpdHMgPj0gZXBfZGlzdC0+c2Vla19jcmVkKQorCQlnb3RvIG91dDsKKworCS8qCisJICogV2UgZG9uJ3QgaGF2ZSBlbm91Z2ggaW4gdGhlIGZyZWUgcG9vbCwgdHJ5IHRha2luZyBhd2F5IGZyb20KKwkgKiBsb3dlciBwcmlvcml0eSBzZXJ2aWNlcyBUaGUgcnVsZSBmb3IgdGFraW5nIGF3YXkgY3JlZGl0czoKKwkgKgorCSAqICAgMS4gT25seSB0YWtlIGZyb20gbG93ZXIgcHJpb3JpdHkgZW5kcG9pbnRzCisJICogICAyLiBPbmx5IHRha2Ugd2hhdCBpcyBhbGxvY2F0ZWQgYWJvdmUgdGhlIG1pbmltdW0gKG5ldmVyCisJICogICAgICBzdGFydmUgYW4gZW5kcG9pbnQgY29tcGxldGVseSkKKwkgKiAgIDMuIE9ubHkgdGFrZSB3aGF0IHlvdSBuZWVkLgorCSAqLworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yZXZlcnNlKGN1cmRpc3RfbGlzdCwKKwkJCQkgICAgJmNyZWRfaW5mby0+bG93ZXN0cHJpX2VwX2Rpc3QsCisJCQkJICAgIGxpc3QpIHsKKwkJaWYgKGN1cmRpc3RfbGlzdCA9PSBlcF9kaXN0KQorCQkJYnJlYWs7CisKKwkJbmVlZCA9IGVwX2Rpc3QtPnNlZWtfY3JlZCAtIGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0czsKKworCQlpZiAoKGN1cmRpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QgLSBuZWVkKSA+PQorCQkgICAgIGN1cmRpc3RfbGlzdC0+Y3JlZF9taW4pIHsKKwkJCS8qCisJCQkgKiBUaGUgY3VycmVudCBvbmUgaGFzIGJlZW4gYWxsb2NhdGVkIG1vcmUgdGhhbgorCQkJICogaXQncyBtaW5pbXVtIGFuZCBpdCBoYXMgZW5vdWdoIGNyZWRpdHMgYXNzaWduZWQKKwkJCSAqIGFib3ZlIGl0J3MgbWluaW11bSB0byBmdWxmaWxsIG91ciBuZWVkIHRyeSB0bworCQkJICogdGFrZSBhd2F5IGp1c3QgZW5vdWdoIHRvIGZ1bGZpbGwgb3VyIG5lZWQuCisJCQkgKi8KKwkJCWF0aDZrbF9jcmVkaXRfcmVkdWNlKGNyZWRfaW5mbywgY3VyZGlzdF9saXN0LAorCQkJCQkgICAgIGN1cmRpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QgLSBuZWVkKTsKKworCQkJaWYgKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA+PQorCQkJICAgIGVwX2Rpc3QtPnNlZWtfY3JlZCkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChjdXJkaXN0X2xpc3QtPmVuZHBvaW50ID09IEVORFBPSU5UXzApCisJCQlicmVhazsKKwl9CisKKwljcmVkaXRzID0gbWluKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cywgZXBfZGlzdC0+c2Vla19jcmVkKTsKKworb3V0OgorCS8qIGRpZCB3ZSBmaW5kIHNvbWUgY3JlZGl0cz8gKi8KKwlpZiAoY3JlZGl0cykKKwkJYXRoNmtsX2NyZWRpdF9kZXBvc2l0KGNyZWRfaW5mbywgZXBfZGlzdCwgY3JlZGl0cyk7CisKKwllcF9kaXN0LT5zZWVrX2NyZWQgPSAwOworfQorCisvKiByZWRpc3RyaWJ1dGUgY3JlZGl0cyBiYXNlZCBvbiBhY3Rpdml0eSBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIGF0aDZrbF9jcmVkaXRfcmVkaXN0cmlidXRlKHN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvICppbmZvLAorCQkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICplcF9kaXN0X2xpc3QpCit7CisJc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqY3VyZGlzdF9saXN0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJkaXN0X2xpc3QsIGVwX2Rpc3RfbGlzdCwgbGlzdCkgeworCQlpZiAoY3VyZGlzdF9saXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQorCQkJY29udGludWU7CisKKwkJaWYgKChjdXJkaXN0X2xpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9CS19TVkMpICB8fAorCQkgICAgKGN1cmRpc3RfbGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JFX1NWQykpCisJCQljdXJkaXN0X2xpc3QtPmRpc3RfZmxhZ3MgfD0gSFRDX0VQX0FDVElWRTsKKworCQlpZiAoKGN1cmRpc3RfbGlzdC0+c3ZjX2lkICE9IFdNSV9DT05UUk9MX1NWQykgJiYKKwkJICAgICEoY3VyZGlzdF9saXN0LT5kaXN0X2ZsYWdzICYgSFRDX0VQX0FDVElWRSkpIHsKKwkJCWlmIChjdXJkaXN0X2xpc3QtPnR4cV9kZXB0aCA9PSAwKQorCQkJCWF0aDZrbF9jcmVkaXRfcmVkdWNlKGluZm8sIGN1cmRpc3RfbGlzdCwgMCk7CisJCQllbHNlCisJCQkJYXRoNmtsX2NyZWRpdF9yZWR1Y2UoaW5mbywKKwkJCQkJCSAgICAgY3VyZGlzdF9saXN0LAorCQkJCQkJICAgICBjdXJkaXN0X2xpc3QtPmNyZWRfbWluKTsKKwkJfQorCX0KK30KKworLyoKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIGludm9rZWQgd2hlbmV2ZXIgZW5kcG9pbnRzIHJlcXVpcmUgY3JlZGl0CisgKiBkaXN0cmlidXRpb25zLiBBIGxvY2sgaXMgaGVsZCB3aGlsZSB0aGlzIGZ1bmN0aW9uIGlzIGludm9rZWQsIHRoaXMKKyAqIGZ1bmN0aW9uIHNoYWxsIE5PVCBibG9jay4gVGhlIGVwX2Rpc3RfbGlzdCBpcyBhIGxpc3Qgb2YgZGlzdHJpYnV0aW9uCisgKiBzdHJ1Y3R1cmVzIGluIHByaW9yaXRpemVkIG9yZGVyIGFzIGRlZmluZWQgYnkgdGhlIGNhbGwgdG8gdGhlCisgKiBodGNfc2V0X2NyZWRpdF9kaXN0KCkgYXBpLgorICovCitzdGF0aWMgdm9pZCBhdGg2a2xfY3JlZGl0X2Rpc3RyaWJ1dGUoc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbywKKwkJCQkgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVwX2Rpc3RfbGlzdCwKKwkJCSAgICAgIGVudW0gaHRjX2NyZWRpdF9kaXN0X3JlYXNvbiByZWFzb24pCit7CisJc3dpdGNoIChyZWFzb24pIHsKKwljYXNlIEhUQ19DUkVESVRfRElTVF9TRU5EX0NPTVBMRVRFOgorCQlhdGg2a2xfY3JlZGl0X3VwZGF0ZShjcmVkX2luZm8sIGVwX2Rpc3RfbGlzdCk7CisJCWJyZWFrOworCWNhc2UgSFRDX0NSRURJVF9ESVNUX0FDVElWSVRZX0NIQU5HRToKKwkJYXRoNmtsX2NyZWRpdF9yZWRpc3RyaWJ1dGUoY3JlZF9pbmZvLCBlcF9kaXN0X2xpc3QpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlXQVJOX09OKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA+IGNyZWRfaW5mby0+dG90YWxfYXZhaWxfY3JlZGl0cyk7CisJV0FSTl9PTihjcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMgPCAwKTsKK30KKwogc3RhdGljIHZvaWQgYXRoNmtsX2h0Y190eF9idWZfYWxpZ24odTggKipidWYsIHVuc2lnbmVkIGxvbmcgbGVuKQogewogCXU4ICphbGlnbl9hZGRyOwpAQCAtMTAyLDEyICs0MTAsMTIgQEAKIAkJCQlwYWNrZXQtPmluZm8udHguY3JlZF91c2VkOwogCWVuZHBvaW50LT5jcmVkX2Rpc3QudHhxX2RlcHRoID0gZ2V0X3F1ZXVlX2RlcHRoKCZlbmRwb2ludC0+dHhxKTsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImN0eHQ6MHglcCBkaXN0OjB4JXBcbiIsCi0JCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyB0eCBjdHh0IDB4JXAgZGlzdCAweCVwXG4iLAorCQkgICB0YXJnZXQtPmNyZWRpdF9pbmZvLCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCk7CiAKLQlhdGg2a19jcmVkaXRfZGlzdHJpYnV0ZSh0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwKLQkJCQkmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwKLQkJCQlIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CisJYXRoNmtsX2NyZWRpdF9kaXN0cmlidXRlKHRhcmdldC0+Y3JlZGl0X2luZm8sCisJCQkJICZ0YXJnZXQtPmNyZWRfZGlzdF9saXN0LAorCQkJCSBIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CiAKIAlzcGluX3VubG9ja19iaCgmdGFyZ2V0LT50eF9sb2NrKTsKIH0KQEAgLTExOCw4ICs0MjYsOCBAQAogCWlmIChsaXN0X2VtcHR5KHR4cSkpCiAJCXJldHVybjsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJICAgInNlbmQgY29tcGxldGUgZXAgJWQsICglZCBwa3RzKVxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkgICAiaHRjIHR4IGNvbXBsZXRlIGVwICVkIHBrdHMgJWRcbiIsCiAJCSAgIGVuZHBvaW50LT5laWQsIGdldF9xdWV1ZV9kZXB0aCh0eHEpKTsKIAogCWF0aDZrbF90eF9jb21wbGV0ZShlbmRwb2ludC0+dGFyZ2V0LT5kZXYtPmFyLCB0eHEpOwpAQCAtMTMxLDYgKzQzOSw5IEBACiAJc3RydWN0IGh0Y19lbmRwb2ludCAqZW5kcG9pbnQgPSAmdGFyZ2V0LT5lbmRwb2ludFtwYWNrZXQtPmVuZHBvaW50XTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNvbnRhaW5lcjsKIAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsICJodGMgdHggY29tcGxldGUgc2Vxbm8gJWRcbiIsCisJCSAgIHBhY2tldC0+aW5mby50eC5zZXFubyk7CisKIAlodGNfdHhfY29tcF91cGRhdGUodGFyZ2V0LCBlbmRwb2ludCwgcGFja2V0KTsKIAlJTklUX0xJU1RfSEVBRCgmY29udGFpbmVyKTsKIAlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3QsICZjb250YWluZXIpOwpAQCAtMTQ4LDggKzQ1OSw4IEBACiAKIAlJTklUX0xJU1RfSEVBRCgmdHhfY29tcHEpOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkiaHRjX2FzeW5jX3R4X3NjYXRfY29tcGxldGUgIHRvdGFsIGxlbjogJWQgIGVudHJpZXM6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCSJodGMgdHggc2NhdCBjb21wbGV0ZSBsZW4gJWQgZW50cmllcyAlZFxuIiwKIAkJc2NhdF9yZXEtPmxlbiwgc2NhdF9yZXEtPnNjYXRfZW50cmllcyk7CiAKIAlpZiAoc2NhdF9yZXEtPnN0YXR1cykKQEAgLTE5MCwxNiArNTAxLDEzIEBACiAKIAlzZW5kX2xlbiA9IHBhY2tldC0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAiJXM6IHRyYW5zbWl0IGxlbiA6ICVkICglcylcbiIsCi0JCSAgIF9fZnVuY19fLCBzZW5kX2xlbiwgc3luYyA/ICJzeW5jIiA6ICJhc3luYyIpOwotCiAJcGFkZGVkX2xlbiA9IENBTENfVFhSWF9QQURERURfTEVOKHRhcmdldCwgc2VuZF9sZW4pOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkiRGV2U2VuZFBhY2tldCwgcGFkZGVkIGxlbjogJWQgbWJveDoweCVYIChtb2RlOiVzKVxuIiwKLQkJcGFkZGVkX2xlbiwKLQkJdGFyZ2V0LT5kZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsCi0JCXN5bmMgPyAic3luYyIgOiAiYXN5bmMiKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkgICAiaHRjIHR4IGlzc3VlIGxlbiAlZCBzZXFubyAlZCBwYWRkZWRfbGVuICVkIG1ib3ggMHglWCAlc1xuIiwKKwkJICAgc2VuZF9sZW4sIHBhY2tldC0+aW5mby50eC5zZXFubywgcGFkZGVkX2xlbiwKKwkJICAgdGFyZ2V0LT5kZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsCisJCSAgIHN5bmMgPyAic3luYyIgOiAiYXN5bmMiKTsKIAogCWlmIChzeW5jKSB7CiAJCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmModGFyZ2V0LT5kZXYtPmFyLApAQCAtMjI3LDcgKzUzNSw3IEBACiAJKnJlcV9jcmVkID0gKGxlbiA+IHRhcmdldC0+dGd0X2NyZWRfc3opID8KIAkJICAgICBESVZfUk9VTkRfVVAobGVuLCB0YXJnZXQtPnRndF9jcmVkX3N6KSA6IDE7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICJjcmVkcyByZXF1aXJlZDolZCBnb3Q6JWRcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwgImNyZWRpdCBjaGVjayBuZWVkICVkIGdvdCAlZFxuIiwKIAkJICAgKnJlcV9jcmVkLCBlcC0+Y3JlZF9kaXN0LmNyZWRpdHMpOwogCiAJaWYgKGVwLT5jcmVkX2Rpc3QuY3JlZGl0cyA8ICpyZXFfY3JlZCkgewpAQCAtMjM3LDE2ICs1NDUsMTMgQEAKIAkJLyogU2VlayBtb3JlIGNyZWRpdHMgKi8KIAkJZXAtPmNyZWRfZGlzdC5zZWVrX2NyZWQgPSAqcmVxX2NyZWQgLSBlcC0+Y3JlZF9kaXN0LmNyZWRpdHM7CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAiY3R4dDoweCVwIGRpc3Q6MHglcFxuIiwKLQkJCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmZXAtPmNyZWRfZGlzdCk7Ci0KLQkJYXRoNmtfc2Vla19jcmVkaXRzKHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmZXAtPmNyZWRfZGlzdCk7CisJCWF0aDZrbF9jcmVkaXRfc2Vlayh0YXJnZXQtPmNyZWRpdF9pbmZvLCAmZXAtPmNyZWRfZGlzdCk7CiAKIAkJZXAtPmNyZWRfZGlzdC5zZWVrX2NyZWQgPSAwOwogCiAJCWlmIChlcC0+Y3JlZF9kaXN0LmNyZWRpdHMgPCAqcmVxX2NyZWQpIHsKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCQkgICAibm90IGVub3VnaCBjcmVkaXRzIGZvciBlcCAlZCAtIGxlYXZpbmcgcGFja2V0IGluIHF1ZXVlXG4iLAorCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwKKwkJCQkgICAiY3JlZGl0IG5vdCBmb3VuZCBmb3IgZXAgJWRcbiIsCiAJCQkJICAgZWlkKTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9CkBAIC0yNjAsMTcgKzU2NSwxNSBAQAogCQllcC0+Y3JlZF9kaXN0LnNlZWtfY3JlZCA9CiAJCWVwLT5jcmVkX2Rpc3QuY3JlZF9wZXJfbXNnIC0gZXAtPmNyZWRfZGlzdC5jcmVkaXRzOwogCi0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImN0eHQ6MHglcCBkaXN0OjB4JXBcbiIsCi0JCQkgICB0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJmVwLT5jcmVkX2Rpc3QpOwotCi0JCWF0aDZrX3NlZWtfY3JlZGl0cyh0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJmVwLT5jcmVkX2Rpc3QpOworCQlhdGg2a2xfY3JlZGl0X3NlZWsodGFyZ2V0LT5jcmVkaXRfaW5mbywgJmVwLT5jcmVkX2Rpc3QpOwogCiAJCS8qIHNlZSBpZiB3ZSB3ZXJlIHN1Y2Nlc3NmdWwgaW4gZ2V0dGluZyBtb3JlICovCiAJCWlmIChlcC0+Y3JlZF9kaXN0LmNyZWRpdHMgPCBlcC0+Y3JlZF9kaXN0LmNyZWRfcGVyX21zZykgewogCQkJLyogdGVsbCB0aGUgdGFyZ2V0IHdlIG5lZWQgY3JlZGl0cyBBU0FQISAqLwogCQkJKmZsYWdzIHw9IEhUQ19GTEFHU19ORUVEX0NSRURJVF9VUERBVEU7CiAJCQllcC0+ZXBfc3QuY3JlZF9sb3dfaW5kaWNhdGUgKz0gMTsKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImhvc3QgbmVlZHMgY3JlZGl0c1xuIik7CisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQ1JFRElULAorCQkJCSAgICJjcmVkaXQgd2UgbmVlZCBjcmVkaXRzIGFzYXBcbiIpOwogCQl9CiAJfQogCkBAIC0yOTUsOCArNTk4LDggQEAKIAkJcGFja2V0ID0gbGlzdF9maXJzdF9lbnRyeSgmZW5kcG9pbnQtPnR4cSwgc3RydWN0IGh0Y19wYWNrZXQsCiAJCQkJCSAgbGlzdCk7CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkJImdvdCBoZWFkIHBrdDoweCVwICwgcXVldWUgZGVwdGg6ICVkXG4iLAorCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJImh0YyB0eCBnb3QgcGFja2V0IDB4JXAgcXVldWUgZGVwdGggJWRcbiIsCiAJCQlwYWNrZXQsIGdldF9xdWV1ZV9kZXB0aCgmZW5kcG9pbnQtPnR4cSkpOwogCiAJCWxlbiA9IENBTENfVFhSWF9QQURERURfTEVOKHRhcmdldCwKQEAgLTQwNCw5ICs3MDcsOSBAQAogCiAJCXNjYXRfcmVxLT5sZW4gKz0gbGVuOwogCQlzY2F0X3JlcS0+c2NhdF9lbnRyaWVzKys7Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCSAgICIlZCwgYWRkaW5nIHBrdCA6IDB4JXAgbGVuOiVkIChyZW1haW5pbmcgc3BhY2U6JWQpXG4iLAotCQkJICAgaSwgcGFja2V0LCBsZW4sIHJlbV9zY2F0KTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSAgICJodGMgdHggYWRkaW5nICglZCkgcGt0IDB4JXAgc2Vxbm8gJWQgbGVuICVkIHJlbWFpbmluZyAlZFxuIiwKKwkJCSAgIGksIHBhY2tldCwgcGFja2V0LT5pbmZvLnR4LnNlcW5vLCBsZW4sIHJlbV9zY2F0KTsKIAl9CiAKIAkvKiBSb2xsIGJhY2sgc2NhdHRlciBzZXR1cCBpbiBjYXNlIG9mIGFueSBmYWlsdXJlICovCkBAIC00NTUsMTIgKzc1OCwxMiBAQAogCiAJCWlmICghc2NhdF9yZXEpIHsKIAkJCS8qIG5vIHNjYXR0ZXIgcmVzb3VyY2VzICAqLwotCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkJCSJubyBtb3JlIHNjYXR0ZXIgcmVzb3VyY2VzXG4iKTsKKwkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCQkJImh0YyB0eCBubyBtb3JlIHNjYXR0ZXIgcmVzb3VyY2VzXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAicGt0cyB0byBzY2F0dGVyOiAlZFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyB0eCBwa3RzIHRvIHNjYXR0ZXI6ICVkXG4iLAogCQkJICAgbl9zY2F0KTsKIAogCQlzY2F0X3JlcS0+bGVuID0gMDsKQEAgLTQ3OSwxMCArNzgyLDEwIEBACiAJCW5fc2VudF9idW5kbGUrKzsKIAkJdG90X3BrdHNfYnVuZGxlICs9IHNjYXRfcmVxLT5zY2F0X2VudHJpZXM7CiAKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkJICAgInNlbmQgc2NhdHRlciB0b3RhbCBieXRlczogJWQgLCBlbnRyaWVzOiAlZFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSAgICJodGMgdHggc2NhdHRlciBieXRlcyAlZCBlbnRyaWVzICVkXG4iLAogCQkJICAgc2NhdF9yZXEtPmxlbiwgc2NhdF9yZXEtPnNjYXRfZW50cmllcyk7Ci0JCWF0aDZrbGRldl9zdWJtaXRfc2NhdF9yZXEodGFyZ2V0LT5kZXYsIHNjYXRfcmVxLCBmYWxzZSk7CisJCWF0aDZrbF9oaWZfc3VibWl0X3NjYXRfcmVxKHRhcmdldC0+ZGV2LCBzY2F0X3JlcSwgZmFsc2UpOwogCiAJCWlmIChzdGF0dXMpCiAJCQlicmVhazsKQEAgLTQ5MCw4ICs3OTMsOCBAQAogCiAJKnNlbnRfYnVuZGxlID0gbl9zZW50X2J1bmRsZTsKIAkqbl9idW5kbGVfcGt0cyA9IHRvdF9wa3RzX2J1bmRsZTsKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICIlcyAoc2VudDolZClcbiIsCi0JCSAgIF9fZnVuY19fLCBuX3NlbnRfYnVuZGxlKTsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLCAiaHRjIHR4IGJ1bmRsZSBzZW50ICVkIHBrdHNcbiIsCisJCSAgIG5fc2VudF9idW5kbGUpOwogCiAJcmV0dXJuOwogfQpAQCAtNTEwLDcgKzgxMyw3IEBACiAJaWYgKGVuZHBvaW50LT50eF9wcm9jX2NudCA+IDEpIHsKIAkJZW5kcG9pbnQtPnR4X3Byb2NfY250LS07CiAJCXNwaW5fdW5sb2NrX2JoKCZ0YXJnZXQtPnR4X2xvY2spOwotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICJodGNfdHJ5X3NlbmQgKGJ1c3kpXG4iKTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyB0eCBidXN5XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtNTg4LDE1ICs4OTEsMTIgQEAKIAkJb3ZlcmZsb3cgPSB0cnVlOwogCiAJaWYgKG92ZXJmbG93KQotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsCi0JCQkgICAiZXAgJWQsIHR4IHF1ZXVlIHdpbGwgb3ZlcmZsb3cgOiVkICwgdHggZGVwdGg6JWQsIG1heDolZFxuIiwKLQkJCSAgIGVuZHBvaW50LT5laWQsIG92ZXJmbG93LCB0eHFfZGVwdGgsCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCQkgICAiaHRjIHR4IG92ZXJmbG93IGVwICVkIGRlcHRoICVkIG1heCAlZFxuIiwKKwkJCSAgIGVuZHBvaW50LT5laWQsIHR4cV9kZXB0aCwKIAkJCSAgIGVuZHBvaW50LT5tYXhfdHhxX2RlcHRoKTsKIAogCWlmIChvdmVyZmxvdyAmJiBlcF9jYi50eF9mdWxsKSB7Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCSAgICJpbmRpY2F0aW5nIG92ZXJmbG93ZWQgdHggcGFja2V0OiAweCVwXG4iLCB0eF9wa3QpOwotCiAJCWlmIChlcF9jYi50eF9mdWxsKGVuZHBvaW50LT50YXJnZXQsIHR4X3BrdCkgPT0KIAkJICAgIEhUQ19TRU5EX0ZVTExfRFJPUCkgewogCQkJZW5kcG9pbnQtPmVwX3N0LnR4X2Ryb3BwZWQgKz0gMTsKQEAgLTYyNSwxMiArOTI1LDEyIEBACiAJICogYXJlIG5vdCBtb2RpZnlpbmcgYW55IHN0YXRlLgogCSAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3JlZF9kaXN0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwgbGlzdCkgewotCQllbmRwb2ludCA9IChzdHJ1Y3QgaHRjX2VuZHBvaW50ICopY3JlZF9kaXN0LT5odGNfcnN2ZDsKKwkJZW5kcG9pbnQgPSBjcmVkX2Rpc3QtPmh0Y19lcDsKIAogCQlzcGluX2xvY2tfYmgoJnRhcmdldC0+dHhfbG9jayk7CiAJCWlmICghbGlzdF9lbXB0eSgmZW5kcG9pbnQtPnR4cSkpIHsKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwKLQkJCQkgICAiZXAgJWQgaGFzICVkIGNyZWRpdHMgYW5kICVkIHBhY2tldHMgaW4gdHggcXVldWVcbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSAgICJodGMgY3JlZHMgZXAgJWQgY3JlZGl0cyAlZCBwa3RzICVkXG4iLAogCQkJCSAgIGNyZWRfZGlzdC0+ZW5kcG9pbnQsCiAJCQkJICAgZW5kcG9pbnQtPmNyZWRfZGlzdC5jcmVkaXRzLAogCQkJCSAgIGdldF9xdWV1ZV9kZXB0aCgmZW5kcG9pbnQtPnR4cSkpOwpAQCAtNzA0LDEzICsxMDA0LDEzIEBACiB9CiAKIHZvaWQgYXRoNmtsX2h0Y19zZXRfY3JlZGl0X2Rpc3Qoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCwKLQkJCQlzdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvICpjcmVkX2Rpc3RfY250eHQsCisJCQkJc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRpdF9pbmZvLAogCQkJCXUxNiBzcnZjX3ByaV9vcmRlcltdLCBpbnQgbGlzdF9sZW4pCiB7CiAJc3RydWN0IGh0Y19lbmRwb2ludCAqZW5kcG9pbnQ7CiAJaW50IGksIGVwOwogCi0JdGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQgPSBjcmVkX2Rpc3RfY250eHQ7CisJdGFyZ2V0LT5jcmVkaXRfaW5mbyA9IGNyZWRpdF9pbmZvOwogCiAJbGlzdF9hZGRfdGFpbCgmdGFyZ2V0LT5lbmRwb2ludFtFTkRQT0lOVF8wXS5jcmVkX2Rpc3QubGlzdCwKIAkJICAgICAgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOwpAQCAtNzM2LDggKzEwMzYsOCBAQAogCXN0cnVjdCBodGNfZW5kcG9pbnQgKmVuZHBvaW50OwogCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsCi0JCSAgICJodGNfdHg6IGVwIGlkOiAlZCwgYnVmOiAweCVwLCBsZW46ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCSAgICJodGMgdHggZXAgaWQgJWQgYnVmIDB4JXAgbGVuICVkXG4iLAogCQkgICBwYWNrZXQtPmVuZHBvaW50LCBwYWNrZXQtPmJ1ZiwgcGFja2V0LT5hY3RfbGVuKTsKIAogCWlmIChwYWNrZXQtPmVuZHBvaW50ID49IEVORFBPSU5UX01BWCkgewpAQCAtNzg3LDggKzEwODcsOCBAQAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXQsIHRtcF9wa3QsICZkaXNjYXJkX3EsIGxpc3QpIHsKIAkJcGFja2V0LT5zdGF0dXMgPSAtRUNBTkNFTEVEOwogCQlsaXN0X2RlbCgmcGFja2V0LT5saXN0KTsKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywKLQkJCSJmbHVzaGluZyB0eCBwa3Q6MHglcCwgbGVuOiVkLCBlcDolZCB0YWc6MHglWFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSJodGMgdHggZmx1c2hpbmcgcGt0IDB4JXAgbGVuICVkICBlcCAlZCB0YWcgMHgleFxuIiwKIAkJCXBhY2tldCwgcGFja2V0LT5hY3RfbGVuLAogCQkJcGFja2V0LT5lbmRwb2ludCwgcGFja2V0LT5pbmZvLnR4LnRhZyk7CiAKQEAgLTg0NCwxMiArMTE0NCwxMyBAQAogCQllbmRwb2ludC0+Y3JlZF9kaXN0LnR4cV9kZXB0aCA9CiAJCQlnZXRfcXVldWVfZGVwdGgoJmVuZHBvaW50LT50eHEpOwogCi0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfU0VORCwgImN0eHQ6MHglcCBkaXN0OjB4JXBcbiIsCi0JCQkgICB0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOworCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJICAgImh0YyB0eCBhY3Rpdml0eSBjdHh0IDB4JXAgZGlzdCAweCVwXG4iLAorCQkJICAgdGFyZ2V0LT5jcmVkaXRfaW5mbywgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOwogCi0JCWF0aDZrX2NyZWRpdF9kaXN0cmlidXRlKHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LAotCQkJCQkmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCwKLQkJCQkJSFRDX0NSRURJVF9ESVNUX0FDVElWSVRZX0NIQU5HRSk7CisJCWF0aDZrbF9jcmVkaXRfZGlzdHJpYnV0ZSh0YXJnZXQtPmNyZWRpdF9pbmZvLAorCQkJCQkgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QsCisJCQkJCSBIVENfQ1JFRElUX0RJU1RfQUNUSVZJVFlfQ0hBTkdFKTsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmdGFyZ2V0LT50eF9sb2NrKTsKQEAgLTkxOSwxNSArMTIyMCwxNSBAQAogCXBhZGRlZF9sZW4gPSBDQUxDX1RYUlhfUEFEREVEX0xFTih0YXJnZXQsIHJ4X2xlbik7CiAKIAlpZiAocGFkZGVkX2xlbiA+IHBhY2tldC0+YnVmX2xlbikgewotCQlhdGg2a2xfZXJyKCJub3QgZW5vdWdoIHJlY2VpdmUgc3BhY2UgZm9yIHBhY2tldCAtIHBhZGxlbjolZCByZWN2bGVuOiVkIGJ1ZmZlcmxlbjolZFxuIiwKKwkJYXRoNmtsX2Vycigibm90IGVub3VnaCByZWNlaXZlIHNwYWNlIGZvciBwYWNrZXQgLSBwYWRsZW4gJWQgcmVjdmxlbiAlZCBidWZmZXJsZW4gJWRcbiIsCiAJCQkgICBwYWRkZWRfbGVuLCByeF9sZW4sIHBhY2tldC0+YnVmX2xlbik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwKLQkJICAgImRldl9yeF9wa3QgKDB4JXAgOiBoZHI6MHglWCkgcGFkZGVkIGxlbjogJWQgbWJveDoweCVYIChtb2RlOiVzKVxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkgICAiaHRjIHJ4IDB4JXAgaGRyIHgleCBsZW4gJWQgbWJveCAweCV4XG4iLAogCQkgICBwYWNrZXQsIHBhY2tldC0+aW5mby5yeC5leHBfaGRyLAotCQkgICBwYWRkZWRfbGVuLCBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsICJzeW5jIik7CisJCSAgIHBhZGRlZF9sZW4sIGRldi0+YXItPm1ib3hfaW5mby5odGNfYWRkcik7CiAKIAlzdGF0dXMgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGRldi0+YXIsCiAJCQkJICAgICBkZXYtPmFyLT5tYm94X2luZm8uaHRjX2FkZHIsCkBAIC0xMTM3LDggKzE0MzgsOCBAQAogCQkJfQogCiAJCQllbmRwb2ludC0+ZXBfc3QucnhfYnVuZGxlX2Zyb21faGRyICs9IDE7Ci0JCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCQkJICAgImh0YyBoZHIgaW5kaWNhdGVzIDolZCBtc2cgY2FuIGJlIGZldGNoZWQgYXMgYSBidW5kbGVcbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSAgICJodGMgcnggYnVuZGxlIHBrdHMgJWRcbiIsCiAJCQkJICAgbl9tc2cpOwogCQl9IGVsc2UKIAkJCS8qIEhUQyBoZWFkZXIgb25seSBpbmRpY2F0ZXMgMSBtZXNzYWdlIHRvIGZldGNoICovCkBAIC0xMTkxLDggKzE0OTIsOCBAQAogCQlhdGg2a2xfZXJyKCJodGNfY3RybF9yeCwgZ290IG1lc3NhZ2Ugd2l0aCBsZW46JXp1XG4iLAogCQkJcGFja2V0cy0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIKTsKIAotCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsCi0JCQkJIlVuZXhwZWN0ZWQgRU5EUE9JTlQgMCBNZXNzYWdlIiwgIiIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywKKwkJCQkiaHRjIHJ4IHVuZXhwZWN0ZWQgZW5kcG9pbnQgMCBtZXNzYWdlIiwgIiIsCiAJCQkJcGFja2V0cy0+YnVmIC0gSFRDX0hEUl9MRU5HVEgsCiAJCQkJcGFja2V0cy0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIKTsKIAl9CkBAIC0xMjA5LDkgKzE1MTAsNiBAQAogCWludCB0b3RfY3JlZGl0cyA9IDAsIGk7CiAJYm9vbCBkaXN0ID0gZmFsc2U7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsCi0JCSAgICJodGNfcHJvY19jcmVkX3JwdCwgY3JlZGl0IHJlcG9ydCBlbnRyaWVzOiVkXG4iLCBuX2VudHJpZXMpOwotCiAJc3Bpbl9sb2NrX2JoKCZ0YXJnZXQtPnR4X2xvY2spOwogCiAJZm9yIChpID0gMDsgaSA8IG5fZW50cmllczsgaSsrLCBycHQrKykgewpAQCAtMTIyMyw4ICsxNTIxLDkgQEAKIAogCQllbmRwb2ludCA9ICZ0YXJnZXQtPmVuZHBvaW50W3JwdC0+ZWlkXTsKIAotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1NFTkQsICIgZXAgJWQgZ290ICVkIGNyZWRpdHNcbiIsCi0JCQlycHQtPmVpZCwgcnB0LT5jcmVkaXRzKTsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0NSRURJVCwKKwkJCSAgICJjcmVkaXQgcmVwb3J0IGVwICVkIGNyZWRpdHMgJWRcbiIsCisJCQkgICBycHQtPmVpZCwgcnB0LT5jcmVkaXRzKTsKIAogCQllbmRwb2ludC0+ZXBfc3QudHhfY3JlZF9ycHQgKz0gMTsKIAkJZW5kcG9pbnQtPmVwX3N0LmNyZWRfcmV0bmQgKz0gcnB0LT5jcmVkaXRzOwpAQCAtMTI2NCwyMSArMTU2MywxNCBAQAogCQl0b3RfY3JlZGl0cyArPSBycHQtPmNyZWRpdHM7CiAJfQogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELAotCQkgICAicmVwb3J0IGluZGljYXRlZCAlZCBjcmVkaXRzIHRvIGRpc3RyaWJ1dGVcbiIsCi0JCSAgIHRvdF9jcmVkaXRzKTsKLQogCWlmIChkaXN0KSB7CiAJCS8qCiAJCSAqIFRoaXMgd2FzIGEgY3JlZGl0IHJldHVybiBiYXNlZCBvbiBhIGNvbXBsZXRlZCBzZW5kCiAJCSAqIG9wZXJhdGlvbnMgbm90ZSwgdGhpcyBpcyBkb25lIHdpdGggdGhlIGxvY2sgaGVsZAogCQkgKi8KLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19TRU5ELCAiY3R4dDoweCVwIGRpc3Q6MHglcFxuIiwKLQkJCSAgIHRhcmdldC0+Y3JlZF9kaXN0X2NudHh0LCAmdGFyZ2V0LT5jcmVkX2Rpc3RfbGlzdCk7Ci0KLQkJYXRoNmtfY3JlZGl0X2Rpc3RyaWJ1dGUodGFyZ2V0LT5jcmVkX2Rpc3RfY250eHQsCi0JCQkJCSZ0YXJnZXQtPmNyZWRfZGlzdF9saXN0LAotCQkJCQlIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CisJCWF0aDZrbF9jcmVkaXRfZGlzdHJpYnV0ZSh0YXJnZXQtPmNyZWRpdF9pbmZvLAorCQkJCQkgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QsCisJCQkJCSBIVENfQ1JFRElUX0RJU1RfU0VORF9DT01QTEVURSk7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnRhcmdldC0+dHhfbG9jayk7CkBAIC0xMzIwLDE0ICsxNjEyLDE1IEBACiAJCWlmICgobGtfYWhkLT5wcmVfdmFsaWQgPT0gKCh+bGtfYWhkLT5wb3N0X3ZhbGlkKSAmIDB4RkYpKQogCQkgICAgJiYgbmV4dF9sa19haGRzKSB7CiAKLQkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwKLQkJCQkgICAibGtfYWhkIHJlcG9ydCBmb3VuZCAocHJlIHZhbGlkOjB4JVgsIHBvc3QgdmFsaWQ6MHglWClcbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSAgICJodGMgcnggbGtfYWhkIGZvdW5kIHByZV92YWxpZCAweCV4IHBvc3RfdmFsaWQgMHgleFxuIiwKIAkJCQkgICBsa19haGQtPnByZV92YWxpZCwgbGtfYWhkLT5wb3N0X3ZhbGlkKTsKIAogCQkJLyogbG9vayBhaGVhZCBieXRlcyBhcmUgdmFsaWQsIGNvcHkgdGhlbSBvdmVyICovCiAJCQltZW1jcHkoKHU4ICopJm5leHRfbGtfYWhkc1swXSwgbGtfYWhkLT5sa19haGQsIDQpOwogCi0JCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsICJOZXh0IExvb2sgQWhlYWQiLAorCQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfSFRDLAorCQkJCQkiaHRjIHJ4IG5leHQgbG9vayBhaGVhZCIsCiAJCQkJCSIiLCBuZXh0X2xrX2FoZHMsIDQpOwogCiAJCQkqbl9sa19haGRzID0gMTsKQEAgLTEzNDYsNyArMTYzOSw3IEBACiAJCQlidW5kbGVfbGthaGRfcnB0ID0KIAkJCQkoc3RydWN0IGh0Y19idW5kbGVfbGthaGRfcnB0ICopIHJlY29yZF9idWY7CiAKLQkJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX1JBV19CWVRFUywgIkJ1bmRsZSBsa19haGQiLAorCQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfSFRDLCAiaHRjIHJ4IGJ1bmRsZSBsa19haGQiLAogCQkJCQkiIiwgcmVjb3JkX2J1ZiwgcmVjb3JkLT5sZW4pOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKQEAgLTEzNzgsMTAgKzE2NzEsOCBAQAogCXU4ICpyZWNvcmRfYnVmOwogCXU4ICpvcmlnX2J1ZjsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVENfUkVDViwgIitodGNfcHJvY190cmFpbGVyIChsZW46JWQpXG4iLCBsZW4pOwotCi0JYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLCAiUmVjdiBUcmFpbGVyIiwgIiIsCi0JCQlidWYsIGxlbik7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywgImh0YyByeCB0cmFpbGVyIGxlbiAlZFxuIiwgbGVuKTsKKwlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19IVEMsIE5VTEwsICIiLCBidWYsIGxlbik7CiAKIAlvcmlnX2J1ZiA9IGJ1ZjsKIAlvcmlnX2xlbiA9IGxlbjsKQEAgLTE0MTgsNyArMTcwOSw3IEBACiAJfQogCiAJaWYgKHN0YXR1cykKLQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLCAiQkFEIFJlY3YgVHJhaWxlciIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywgImh0YyByeCBiYWQgdHJhaWxlciIsCiAJCQkJIiIsIG9yaWdfYnVmLCBvcmlnX2xlbik7CiAKIAlyZXR1cm4gc3RhdHVzOwpAQCAtMTQzNiw5ICsxNzI3LDYgQEAKIAlpZiAobl9sa2FoZHMgIT0gTlVMTCkKIAkJKm5fbGthaGRzID0gMDsKIAotCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX1JBV19CWVRFUywgIkhUQyBSZWN2IFBLVCIsICJodGMgIiwKLQkJCXBhY2tldC0+YnVmLCBwYWNrZXQtPmFjdF9sZW4pOwotCiAJLyoKIAkgKiBOT1RFOiB3ZSBjYW5ub3QgYXNzdW1lIHRoZSBhbGlnbm1lbnQgb2YgYnVmLCBzbyB3ZSB1c2UgdGhlIHNhZmUKIAkgKiBtYWNyb3MgdG8gcmV0cmlldmUgMTYgYml0IGZpZWxkcy4KQEAgLTE0ODAsOSArMTc2OCw5IEBACiAJaWYgKGxrX2FoZCAhPSBwYWNrZXQtPmluZm8ucnguZXhwX2hkcikgewogCQlhdGg2a2xfZXJyKCIlcygpOiBsa19haGQgbWlzbWF0Y2ghIChwUGt0OjB4JXAgZmxhZ3M6MHglWClcbiIsCiAJCQkgICBfX2Z1bmNfXywgcGFja2V0LCBwYWNrZXQtPmluZm8ucngucnhfZmxhZ3MpOwotCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsICJFeHBlY3RlZCBNZXNzYWdlIGxrX2FoZCIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywgImh0YyByeCBleHBlY3RlZCBsa19haGQiLAogCQkJCSIiLCAmcGFja2V0LT5pbmZvLnJ4LmV4cF9oZHIsIDQpOwotCQlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19SQVdfQllURVMsICJDdXJyZW50IEZyYW1lIEhlYWRlciIsCisJCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX0hUQywgImh0YyByeCBjdXJyZW50IGhlYWRlciIsCiAJCQkJIiIsICh1OCAqKSZsa19haGQsIHNpemVvZihsa19haGQpKTsKIAkJc3RhdHVzID0gLUVOT01FTTsKIAkJZ290byBmYWlsX3J4OwpAQCAtMTUxOCwxNSArMTgwNiw4IEBACiAKIGZhaWxfcng6CiAJaWYgKHN0YXR1cykKLQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLCAiQkFEIEhUQyBSZWN2IFBLVCIsCi0JCQkJIiIsIHBhY2tldC0+YnVmLAotCQkJCXBhY2tldC0+YWN0X2xlbiA8IDI1NiA/IHBhY2tldC0+YWN0X2xlbiA6IDI1Nik7Ci0JZWxzZSB7Ci0JCWlmIChwYWNrZXQtPmFjdF9sZW4gPiAwKQotCQkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfUkFXX0JZVEVTLAotCQkJCQkiSFRDIC0gQXBwbGljYXRpb24gTXNnIiwgIiIsCi0JCQkJCXBhY2tldC0+YnVmLCBwYWNrZXQtPmFjdF9sZW4pOwotCX0KKwkJYXRoNmtsX2RiZ19kdW1wKEFUSDZLTF9EQkdfSFRDLCAiaHRjIHJ4IGJhZCBwYWNrZXQiLAorCQkJCSIiLCBwYWNrZXQtPmJ1ZiwgcGFja2V0LT5hY3RfbGVuKTsKIAogCXJldHVybiBzdGF0dXM7CiB9CkBAIC0xNTM0LDggKzE4MTUsOCBAQAogc3RhdGljIHZvaWQgYXRoNmtsX2h0Y19yeF9jb21wbGV0ZShzdHJ1Y3QgaHRjX2VuZHBvaW50ICplbmRwb2ludCwKIAkJCQkgICBzdHJ1Y3QgaHRjX3BhY2tldCAqcGFja2V0KQogewotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCQkgICAiaHRjIGNhbGxpbmcgZXAgJWQgcmVjdiBjYWxsYmFjayBvbiBwYWNrZXQgMHglcFxuIiwKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCSAgICJodGMgcnggY29tcGxldGUgZXAgJWQgcGFja2V0IDB4JXBcbiIsCiAJCQkgICBlbmRwb2ludC0+ZWlkLCBwYWNrZXQpOwogCQllbmRwb2ludC0+ZXBfY2IucngoZW5kcG9pbnQtPnRhcmdldCwgcGFja2V0KTsKIH0KQEAgLTE1NzEsOSArMTg1Miw5IEBACiAKIAlsZW4gPSAwOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19SRUNWLAotCQkgICAiJXMoKTogKG51bXBhY2tldHM6ICVkICwgYWN0dWFsIDogJWQpXG4iLAotCQkgICBfX2Z1bmNfXywgZ2V0X3F1ZXVlX2RlcHRoKHJ4cSksIG5fc2NhdF9wa3QpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19IVEMsCisJCSAgICJodGMgcnggYnVuZGxlIGRlcHRoICVkIHBrdHMgJWRcbiIsCisJCSAgIGdldF9xdWV1ZV9kZXB0aChyeHEpLCBuX3NjYXRfcGt0KTsKIAogCXNjYXRfcmVxID0gaGlmX3NjYXR0ZXJfcmVxX2dldCh0YXJnZXQtPmRldi0+YXIpOwogCkBAIC0xNjIwLDcgKzE5MDEsNyBAQAogCXNjYXRfcmVxLT5sZW4gPSBsZW47CiAJc2NhdF9yZXEtPnNjYXRfZW50cmllcyA9IGk7CiAKLQlzdGF0dXMgPSBhdGg2a2xkZXZfc3VibWl0X3NjYXRfcmVxKHRhcmdldC0+ZGV2LCBzY2F0X3JlcSwgdHJ1ZSk7CisJc3RhdHVzID0gYXRoNmtsX2hpZl9zdWJtaXRfc2NhdF9yZXEodGFyZ2V0LT5kZXYsIHNjYXRfcmVxLCB0cnVlKTsKIAogCWlmICghc3RhdHVzKQogCQkqbl9wa3RfZmV0Y2hlZCA9IGk7CkBAIC0xNjQzLDcgKzE5MjQsNiBAQAogCWludCBzdGF0dXMgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldCwgdG1wX3BrdCwgY29tcF9wa3RxLCBsaXN0KSB7Ci0JCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3QpOwogCQllcCA9ICZ0YXJnZXQtPmVuZHBvaW50W3BhY2tldC0+ZW5kcG9pbnRdOwogCiAJCS8qIHByb2Nlc3MgaGVhZGVyIGZvciBlYWNoIG9mIHRoZSByZWN2IHBhY2tldCAqLwpAQCAtMTY1Miw2ICsxOTMyLDggQEAKIAkJaWYgKHN0YXR1cykKIAkJCXJldHVybiBzdGF0dXM7CiAKKwkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdCk7CisKIAkJaWYgKGxpc3RfZW1wdHkoY29tcF9wa3RxKSkgewogCQkJLyoKIAkJCSAqIExhc3QgcGFja2V0J3MgbW9yZSBwYWNrZXQgZmxhZyBpcyBzZXQKQEAgLTE2ODYsMTEgKzE5NjgsMTUgQEAKIAlpbnQgZmV0Y2hlZF9wa3RzOwogCWJvb2wgcGFydF9idW5kbGUgPSBmYWxzZTsKIAlpbnQgc3RhdHVzID0gMDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHRtcF9yeHE7CisJc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCwgKnRtcF9wa3Q7CiAKIAkvKiBub3cgZ28gZmV0Y2ggdGhlIGxpc3Qgb2YgSFRDIHBhY2tldHMgKi8KIAl3aGlsZSAoIWxpc3RfZW1wdHkocnhfcGt0cSkpIHsKIAkJZmV0Y2hlZF9wa3RzID0gMDsKIAorCQlJTklUX0xJU1RfSEVBRCgmdG1wX3J4cSk7CisKIAkJaWYgKHRhcmdldC0+cnhfYm5kbF9lbmFibGUgJiYgKGdldF9xdWV1ZV9kZXB0aChyeF9wa3RxKSA+IDEpKSB7CiAJCQkvKgogCQkJICogVGhlcmUgYXJlIGVub3VnaCBwYWNrZXRzIHRvIGF0dGVtcHQgYQpAQCAtMTY5OCwyOCArMTk4NCwyNyBAQAogCQkJICogYWxsb3dlZC4KIAkJCSAqLwogCQkJc3RhdHVzID0gYXRoNmtsX2h0Y19yeF9idW5kbGUodGFyZ2V0LCByeF9wa3RxLAotCQkJCQkJICAgICAgY29tcF9wa3RxLAorCQkJCQkJICAgICAgJnRtcF9yeHEsCiAJCQkJCQkgICAgICAmZmV0Y2hlZF9wa3RzLAogCQkJCQkJICAgICAgcGFydF9idW5kbGUpOwogCQkJaWYgKHN0YXR1cykKLQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCWdvdG8gZmFpbF9yeDsKIAogCQkJaWYgKCFsaXN0X2VtcHR5KHJ4X3BrdHEpKQogCQkJCXBhcnRfYnVuZGxlID0gdHJ1ZTsKKworCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ0bXBfcnhxLCBjb21wX3BrdHEpOwogCQl9CiAKIAkJaWYgKCFmZXRjaGVkX3BrdHMpIHsKLQkJCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQ7CiAKIAkJCXBhY2tldCA9IGxpc3RfZmlyc3RfZW50cnkocnhfcGt0cSwgc3RydWN0IGh0Y19wYWNrZXQsCiAJCQkJCQkgICBsaXN0KTsKIAotCQkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdCk7Ci0KIAkJCS8qIGZ1bGx5IHN5bmNocm9ub3VzICovCiAJCQlwYWNrZXQtPmNvbXBsZXRpb24gPSBOVUxMOwogCi0JCQlpZiAoIWxpc3RfZW1wdHkocnhfcGt0cSkpCisJCQlpZiAoIWxpc3RfaXNfc2luZ3VsYXIocnhfcGt0cSkpCiAJCQkJLyoKIAkJCQkgKiBsb29rX2FoZWFkcyBpbiBhbGwgcGFja2V0CiAJCQkJICogZXhjZXB0IHRoZSBsYXN0IG9uZSBpbiB0aGUKQEAgLTE3MzEsMTggKzIwMTYsNDIgQEAKIAkJCS8qIGdvIGZldGNoIHRoZSBwYWNrZXQgKi8KIAkJCXN0YXR1cyA9IGF0aDZrbF9odGNfcnhfcGFja2V0KHRhcmdldCwgcGFja2V0LAogCQkJCQkJICAgICAgcGFja2V0LT5hY3RfbGVuKTsKLQkJCWlmIChzdGF0dXMpCi0JCQkJcmV0dXJuIHN0YXR1czsKIAotCQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCBjb21wX3BrdHEpOworCQkJbGlzdF9tb3ZlX3RhaWwoJnBhY2tldC0+bGlzdCwgJnRtcF9yeHEpOworCisJCQlpZiAoc3RhdHVzKQorCQkJCWdvdG8gZmFpbF9yeDsKKworCQkJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ0bXBfcnhxLCBjb21wX3BrdHEpOwogCQl9CiAJfQogCisJcmV0dXJuIDA7CisKK2ZhaWxfcng6CisKKwkvKgorCSAqIENsZWFudXAgYW55IHBhY2tldHMgd2UgYWxsb2NhdGVkIGJ1dCBkaWRuJ3QgdXNlIHRvCisJICogYWN0dWFsbHkgZmV0Y2ggYW55IHBhY2tldHMuCisJICovCisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0LCB0bXBfcGt0LCByeF9wa3RxLCBsaXN0KSB7CisJCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3QpOworCQlodGNfcmVjbGFpbV9yeGJ1Zih0YXJnZXQsIHBhY2tldCwKKwkJCQkmdGFyZ2V0LT5lbmRwb2ludFtwYWNrZXQtPmVuZHBvaW50XSk7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHBhY2tldCwgdG1wX3BrdCwgJnRtcF9yeHEsIGxpc3QpIHsKKwkJbGlzdF9kZWwoJnBhY2tldC0+bGlzdCk7CisJCWh0Y19yZWNsYWltX3J4YnVmKHRhcmdldCwgcGFja2V0LAorCQkJCSZ0YXJnZXQtPmVuZHBvaW50W3BhY2tldC0+ZW5kcG9pbnRdKTsKKwl9CisKIAlyZXR1cm4gc3RhdHVzOwogfQogCiBpbnQgYXRoNmtsX2h0Y19yeG1zZ19wZW5kaW5nX2hhbmRsZXIoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCwKLQkJCQkgICAgIHUzMiBtc2dfbG9va19haGVhZFtdLCBpbnQgKm51bV9wa3RzKQorCQkJCSAgICAgdTMyIG1zZ19sb29rX2FoZWFkLCBpbnQgKm51bV9wa3RzKQogewogCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXRzLCAqdG1wX3BrdDsKIAlzdHJ1Y3QgaHRjX2VuZHBvaW50ICplbmRwb2ludDsKQEAgLTE3NTksNyArMjA2OCw3IEBACiAJICogT24gZmlyc3QgZW50cnkgY29weSB0aGUgbG9va19haGVhZHMgaW50byBvdXIgdGVtcCBhcnJheSBmb3IKIAkgKiBwcm9jZXNzaW5nCiAJICovCi0JbWVtY3B5KGxvb2tfYWhlYWRzLCBtc2dfbG9va19haGVhZCwgc2l6ZW9mKGxvb2tfYWhlYWRzKSk7CisJbG9va19haGVhZHNbMF0gPSBtc2dfbG9va19haGVhZDsKIAogCXdoaWxlICh0cnVlKSB7CiAKQEAgLTE4MjcsMTUgKzIxMzYsNiBAQAogCWlmIChzdGF0dXMpIHsKIAkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGdldCBwZW5kaW5nIHJlY3YgbWVzc2FnZXM6ICVkXG4iLAogCQkJICAgc3RhdHVzKTsKLQkJLyoKLQkJICogQ2xlYW51cCBhbnkgcGFja2V0cyB3ZSBhbGxvY2F0ZWQgYnV0IGRpZG4ndCB1c2UgdG8KLQkJICogYWN0dWFsbHkgZmV0Y2ggYW55IHBhY2tldHMuCi0JCSAqLwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFja2V0cywgdG1wX3BrdCwgJnJ4X3BrdHEsIGxpc3QpIHsKLQkJCWxpc3RfZGVsKCZwYWNrZXRzLT5saXN0KTsKLQkJCWh0Y19yZWNsYWltX3J4YnVmKHRhcmdldCwgcGFja2V0cywKLQkJCQkJJnRhcmdldC0+ZW5kcG9pbnRbcGFja2V0cy0+ZW5kcG9pbnRdKTsKLQkJfQogCiAJCS8qIGNsZWFudXAgYW55IHBhY2tldHMgaW4gc3luYyBjb21wbGV0aW9uIHF1ZXVlICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwYWNrZXRzLCB0bXBfcGt0LCAmY29tcF9wa3RxLCBsaXN0KSB7CkBAIC0xODQ2LDcgKzIxNDYsNyBAQAogCiAJCWlmICh0YXJnZXQtPmh0Y19mbGFncyAmIEhUQ19PUF9TVEFURV9TVE9QUElORykgewogCQkJYXRoNmtsX3dhcm4oImhvc3QgaXMgZ29pbmcgdG8gc3RvcCBibG9ja2luZyByZWNlaXZlciBmb3IgaHRjX3N0b3BcbiIpOwotCQkJYXRoNmtsZGV2X3J4X2NvbnRyb2wodGFyZ2V0LT5kZXYsIGZhbHNlKTsKKwkJCWF0aDZrbF9oaWZfcnhfY29udHJvbCh0YXJnZXQtPmRldiwgZmFsc2UpOwogCQl9CiAJfQogCkBAIC0xODU2LDcgKzIxNTYsNyBAQAogCSAqLwogCWlmICh0YXJnZXQtPnJ4X3N0X2ZsYWdzICYgSFRDX1JFQ1ZfV0FJVF9CVUZGRVJTKSB7CiAJCWF0aDZrbF93YXJuKCJob3N0IGhhcyBubyByeCBidWZmZXJzIGJsb2NraW5nIHJlY2VpdmVyIHRvIHByZXZlbnQgb3ZlcnJ1blxuIik7Ci0JCWF0aDZrbGRldl9yeF9jb250cm9sKHRhcmdldC0+ZGV2LCBmYWxzZSk7CisJCWF0aDZrbF9oaWZfcnhfY29udHJvbCh0YXJnZXQtPmRldiwgZmFsc2UpOwogCX0KIAkqbnVtX3BrdHMgPSBuX2ZldGNoZWQ7CiAKQEAgLTE4NzQsMTIgKzIxNzQsMTIgQEAKIAlzdHJ1Y3QgaHRjX2ZyYW1lX2hkciAqaHRjX2hkcjsKIAl1MzIgbG9va19haGVhZDsKIAotCWlmIChhdGg2a2xkZXZfcG9sbF9tYm94bXNnX3J4KHRhcmdldC0+ZGV2LCAmbG9va19haGVhZCwKKwlpZiAoYXRoNmtsX2hpZl9wb2xsX21ib3htc2dfcngodGFyZ2V0LT5kZXYsICZsb29rX2FoZWFkLAogCQkJICAgICAgIEhUQ19UQVJHRVRfUkVTUE9OU0VfVElNRU9VVCkpCiAJCXJldHVybiBOVUxMOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19SRUNWLAotCQkiaHRjX3dhaXRfZm9yX2N0cmxfbXNnOiBsb29rX2FoZWFkIDogMHglWFxuIiwgbG9va19haGVhZCk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJImh0YyByeCB3YWl0IGN0cmwgbG9va19haGVhZCAweCVYXG4iLCBsb29rX2FoZWFkKTsKIAogCWh0Y19oZHIgPSAoc3RydWN0IGh0Y19mcmFtZV9oZHIgKikmbG9va19haGVhZDsKIApAQCAtMTk0Myw4ICsyMjQzLDggQEAKIAogCWRlcHRoID0gZ2V0X3F1ZXVlX2RlcHRoKHBrdF9xdWV1ZSk7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCSJodGNfYWRkX3J4YnVmX211bHRpcGxlOiBlcCBpZDogJWQsIGNudDolZCwgbGVuOiAlZFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkiaHRjIHJ4IGFkZCBtdWx0aXBsZSBlcCBpZCAlZCBjbnQgJWQgbGVuICVkXG4iLAogCQlmaXJzdF9wa3QtPmVuZHBvaW50LCBkZXB0aCwgZmlyc3RfcGt0LT5idWZfbGVuKTsKIAogCWVuZHBvaW50ID0gJnRhcmdldC0+ZW5kcG9pbnRbZmlyc3RfcGt0LT5lbmRwb2ludF07CkBAIC0xOTY5LDggKzIyNjksOCBAQAogCS8qIGNoZWNrIGlmIHdlIGFyZSBibG9ja2VkIHdhaXRpbmcgZm9yIGEgbmV3IGJ1ZmZlciAqLwogCWlmICh0YXJnZXQtPnJ4X3N0X2ZsYWdzICYgSFRDX1JFQ1ZfV0FJVF9CVUZGRVJTKSB7CiAJCWlmICh0YXJnZXQtPmVwX3dhaXRpbmcgPT0gZmlyc3RfcGt0LT5lbmRwb2ludCkgewotCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQ19SRUNWLAotCQkJCSJyZWNlaXZlciB3YXMgYmxvY2tlZCBvbiBlcDolZCwgdW5ibG9ja2luZy5cbiIsCisJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDLAorCQkJCSJodGMgcnggYmxvY2tlZCBvbiBlcCAlZCwgdW5ibG9ja2luZ1xuIiwKIAkJCQl0YXJnZXQtPmVwX3dhaXRpbmcpOwogCQkJdGFyZ2V0LT5yeF9zdF9mbGFncyAmPSB+SFRDX1JFQ1ZfV0FJVF9CVUZGRVJTOwogCQkJdGFyZ2V0LT5lcF93YWl0aW5nID0gRU5EUE9JTlRfTUFYOwpAQCAtMTk4Miw3ICsyMjgyLDcgQEAKIAogCWlmIChyeF91bmJsb2NrICYmICEodGFyZ2V0LT5odGNfZmxhZ3MgJiBIVENfT1BfU1RBVEVfU1RPUFBJTkcpKQogCQkvKiBUT0RPIDogaW1wbGVtZW50IGEgYnVmZmVyIHRocmVzaG9sZCBjb3VudD8gKi8KLQkJYXRoNmtsZGV2X3J4X2NvbnRyb2wodGFyZ2V0LT5kZXYsIHRydWUpOworCQlhdGg2a2xfaGlmX3J4X2NvbnRyb2wodGFyZ2V0LT5kZXYsIHRydWUpOwogCiAJcmV0dXJuIHN0YXR1czsKIH0KQEAgLTIwMDQsOCArMjMwNCw4IEBACiAJCQkJCSAmZW5kcG9pbnQtPnJ4X2J1ZnEsIGxpc3QpIHsKIAkJCWxpc3RfZGVsKCZwYWNrZXQtPmxpc3QpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnRhcmdldC0+cnhfbG9jayk7Ci0JCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCQkJICAgImZsdXNoaW5nIHJ4IHBrdDoweCVwLCBsZW46JWQsIGVwOiVkXG4iLAorCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJCQkgICAiaHRjIHJ4IGZsdXNoIHBrdCAweCVwICBsZW4gJWQgIGVwICVkXG4iLAogCQkJCSAgIHBhY2tldCwgcGFja2V0LT5idWZfbGVuLAogCQkJCSAgIHBhY2tldC0+ZW5kcG9pbnQpOwogCQkJZGV2X2tmcmVlX3NrYihwYWNrZXQtPnBrdF9jbnR4dCk7CkBAIC0yMDI4LDggKzIzMjgsOCBAQAogCXVuc2lnbmVkIGludCBtYXhfbXNnX3N6ID0gMDsKIAlpbnQgc3RhdHVzID0gMDsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsCi0JCSAgICJodGNfY29ubl9zZXJ2aWNlLCB0YXJnZXQ6MHglcCBzZXJ2aWNlIGlkOjB4JVhcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0hUQywKKwkJICAgImh0YyBjb25uZWN0IHNlcnZpY2UgdGFyZ2V0IDB4JXAgc2VydmljZSBpZCAweCV4XG4iLAogCQkgICB0YXJnZXQsIGNvbm5fcmVxLT5zdmNfaWQpOwogCiAJaWYgKGNvbm5fcmVxLT5zdmNfaWQgPT0gSFRDX0NUUkxfUlNWRF9TVkMpIHsKQEAgLTIxMTUsNyArMjQxNSw3IEBACiAJZW5kcG9pbnQtPmxlbl9tYXggPSBtYXhfbXNnX3N6OwogCWVuZHBvaW50LT5lcF9jYiA9IGNvbm5fcmVxLT5lcF9jYjsKIAllbmRwb2ludC0+Y3JlZF9kaXN0LnN2Y19pZCA9IGNvbm5fcmVxLT5zdmNfaWQ7Ci0JZW5kcG9pbnQtPmNyZWRfZGlzdC5odGNfcnN2ZCA9IGVuZHBvaW50OworCWVuZHBvaW50LT5jcmVkX2Rpc3QuaHRjX2VwID0gZW5kcG9pbnQ7CiAJZW5kcG9pbnQtPmNyZWRfZGlzdC5lbmRwb2ludCA9IGFzc2lnbmVkX2VwOwogCWVuZHBvaW50LT5jcmVkX2Rpc3QuY3JlZF9zeiA9IHRhcmdldC0+dGd0X2NyZWRfc3o7CiAKQEAgLTIxNzIsNiArMjQ3Miw3IEBACiAJfQogCiAJLyogcmVzZXQgZGlzdHJpYnV0aW9uIGxpc3QgKi8KKwkvKiBGSVhNRTogZnJlZSBleGlzdGluZyBlbnRyaWVzICovCiAJSU5JVF9MSVNUX0hFQUQoJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QpOwogfQogCkBAIC0yMjAxLDggKzI1MDIsOCBAQAogCXRhcmdldC0+bXNnX3Blcl9ibmRsX21heCA9IG1pbih0YXJnZXQtPm1heF9zY2F0X2VudHJpZXMsCiAJCQkJICAgICAgIHRhcmdldC0+bXNnX3Blcl9ibmRsX21heCk7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLAotCQkgICAiaHRjIGJ1bmRsaW5nIGFsbG93ZWQuIG1heCBtc2cgcGVyIGh0YyBidW5kbGU6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkgICAiaHRjIGJ1bmRsaW5nIGFsbG93ZWQgbXNnX3Blcl9ibmRsX21heCAlZFxuIiwKIAkJICAgdGFyZ2V0LT5tc2dfcGVyX2JuZGxfbWF4KTsKIAogCS8qIE1heCByeCBidW5kbGUgc2l6ZSBpcyBsaW1pdGVkIGJ5IHRoZSBtYXggdHggYnVuZGxlIHNpemUgKi8KQEAgLTIyMTEsNyArMjUxMiw3IEBACiAJdGFyZ2V0LT5tYXhfdHhfYm5kbF9zeiA9IG1pbihISUZfTUJPWDBfRVhUX1dJRFRILAogCQkJCSAgICAgdGFyZ2V0LT5tYXhfeGZlcl9zenBlcl9zY2F0cmVxKTsKIAotCWF0aDZrbF9kYmcoQVRINktMX0RCR19BTlksICJtYXggcmVjdjogJWQgbWF4IHNlbmQ6ICVkXG4iLAorCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiaHRjIG1heF9yeF9ibmRsX3N6ICVkIG1heF90eF9ibmRsX3N6ICVkXG4iLAogCQkgICB0YXJnZXQtPm1heF9yeF9ibmRsX3N6LCB0YXJnZXQtPm1heF90eF9ibmRsX3N6KTsKIAogCWlmICh0YXJnZXQtPm1heF90eF9ibmRsX3N6KQpAQCAtMjI2NSw4ICsyNTY2LDggQEAKIAl0YXJnZXQtPnRndF9jcmVkcyA9IGxlMTZfdG9fY3B1KHJkeV9tc2ctPnZlcjJfMF9pbmZvLmNyZWRfY250KTsKIAl0YXJnZXQtPnRndF9jcmVkX3N6ID0gbGUxNl90b19jcHUocmR5X21zZy0+dmVyMl8wX2luZm8uY3JlZF9zeik7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfSFRDX1JFQ1YsCi0JCSAgICJ0YXJnZXQgcmVhZHk6IGNyZWRpdHM6ICVkIGNyZWRpdCBzaXplOiAlZFxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwKKwkJICAgImh0YyB0YXJnZXQgcmVhZHkgY3JlZGl0cyAlZCBzaXplICVkXG4iLAogCQkgICB0YXJnZXQtPnRndF9jcmVkcywgdGFyZ2V0LT50Z3RfY3JlZF9zeik7CiAKIAkvKiBjaGVjayBpZiB0aGlzIGlzIGFuIGV4dGVuZGVkIHJlYWR5IG1lc3NhZ2UgKi8KQEAgLTIyODAsNyArMjU4MSw3IEBACiAJCXRhcmdldC0+bXNnX3Blcl9ibmRsX21heCA9IDA7CiAJfQogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgInVzaW5nIGh0YyBwcm90b2NvbCB2ZXJzaW9uIDogJXMgKCVkKVxuIiwKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImh0YyB1c2luZyBwcm90b2NvbCAlcyAoJWQpXG4iLAogCQkgICh0YXJnZXQtPmh0Y190Z3RfdmVyID09IEhUQ19WRVJTSU9OXzJQMCkgPyAiMi4wIiA6ICI+PSAyLjEiLAogCQkgIHRhcmdldC0+aHRjX3RndF92ZXIpOwogCkBAIC0yMzAwLDYgKzI2MDEsMTAgQEAKIAlzdGF0dXMgPSBhdGg2a2xfaHRjX2Nvbm5fc2VydmljZSgodm9pZCAqKXRhcmdldCwgJmNvbm5lY3QsICZyZXNwKTsKIAogCWlmIChzdGF0dXMpCisJCS8qCisJCSAqIEZJWE1FOiB0aGlzIGNhbGwgZG9lc24ndCBtYWtlIHNlbnNlLCB0aGUgY2FsbGVyIHNob3VsZAorCQkgKiBjYWxsIGF0aDZrbF9odGNfY2xlYW51cCgpIHdoZW4gaXQgd2FudHMgcmVtb3ZlIGh0YworCQkgKi8KIAkJYXRoNmtsX2hpZl9jbGVhbnVwX3NjYXR0ZXIodGFyZ2V0LT5kZXYtPmFyKTsKIAogZmFpbF93YWl0X3RhcmdldDoKQEAgLTIzMjAsOCArMjYyNSwxMSBAQAogCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQ7CiAJaW50IHN0YXR1czsKIAorCW1lbXNldCgmdGFyZ2V0LT5kZXYtPmlycV9wcm9jX3JlZywgMCwKKwkgICAgICAgc2l6ZW9mKHRhcmdldC0+ZGV2LT5pcnFfcHJvY19yZWcpKTsKKwogCS8qIERpc2FibGUgaW50ZXJydXB0cyBhdCB0aGUgY2hpcCBsZXZlbCAqLwotCWF0aDZrbGRldl9kaXNhYmxlX2ludHJzKHRhcmdldC0+ZGV2KTsKKwlhdGg2a2xfaGlmX2Rpc2FibGVfaW50cnModGFyZ2V0LT5kZXYpOwogCiAJdGFyZ2V0LT5odGNfZmxhZ3MgPSAwOwogCXRhcmdldC0+cnhfc3RfZmxhZ3MgPSAwOwpAQCAtMjMzNCw4ICsyNjQyLDggQEAKIAl9CiAKIAkvKiBOT1RFOiB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGRpc3RyaWJ1dGlvbiBsaXN0IGlzIEVORFBPSU5UXzAgKi8KLQlhdGg2a19jcmVkaXRfaW5pdCh0YXJnZXQtPmNyZWRfZGlzdF9jbnR4dCwgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QsCi0JCQkgIHRhcmdldC0+dGd0X2NyZWRzKTsKKwlhdGg2a2xfY3JlZGl0X2luaXQodGFyZ2V0LT5jcmVkaXRfaW5mbywgJnRhcmdldC0+Y3JlZF9kaXN0X2xpc3QsCisJCQkgICB0YXJnZXQtPnRndF9jcmVkcyk7CiAKIAlkdW1wX2NyZWRfZGlzdF9zdGF0cyh0YXJnZXQpOwogCkBAIC0yMzQ2LDcgKzI2NTQsNyBAQAogCQlyZXR1cm4gc3RhdHVzOwogCiAJLyogdW5tYXNrIGludGVycnVwdHMgKi8KLQlzdGF0dXMgPSBhdGg2a2xkZXZfdW5tYXNrX2ludHJzKHRhcmdldC0+ZGV2KTsKKwlzdGF0dXMgPSBhdGg2a2xfaGlmX3VubWFza19pbnRycyh0YXJnZXQtPmRldik7CiAKIAlpZiAoc3RhdHVzKQogCQlhdGg2a2xfaHRjX3N0b3AodGFyZ2V0KTsKQEAgLTIzNTQsNiArMjY2Miw0NCBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXRpYyBpbnQgYXRoNmtsX2h0Y19yZXNldChzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0KQoreworCXUzMiBibG9ja19zaXplLCBjdHJsX2J1ZnN6OworCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQ7CisJaW50IGk7CisKKwlyZXNldF9lcF9zdGF0ZSh0YXJnZXQpOworCisJYmxvY2tfc2l6ZSA9IHRhcmdldC0+ZGV2LT5hci0+bWJveF9pbmZvLmJsb2NrX3NpemU7CisKKwljdHJsX2J1ZnN6ID0gKGJsb2NrX3NpemUgPiBIVENfTUFYX0NUUkxfTVNHX0xFTikgPworCQkgICAgICAoYmxvY2tfc2l6ZSArIEhUQ19IRFJfTEVOR1RIKSA6CisJCSAgICAgIChIVENfTUFYX0NUUkxfTVNHX0xFTiArIEhUQ19IRFJfTEVOR1RIKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fQ09OVFJPTF9CVUZGRVJTOyBpKyspIHsKKwkJcGFja2V0ID0ga3phbGxvYyhzaXplb2YoKnBhY2tldCksIEdGUF9LRVJORUwpOworCQlpZiAoIXBhY2tldCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXBhY2tldC0+YnVmX3N0YXJ0ID0ga3phbGxvYyhjdHJsX2J1ZnN6LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwYWNrZXQtPmJ1Zl9zdGFydCkgeworCQkJa2ZyZWUocGFja2V0KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJcGFja2V0LT5idWZfbGVuID0gY3RybF9idWZzejsKKwkJaWYgKGkgPCBOVU1fQ09OVFJPTF9SWF9CVUZGRVJTKSB7CisJCQlwYWNrZXQtPmFjdF9sZW4gPSAwOworCQkJcGFja2V0LT5idWYgPSBwYWNrZXQtPmJ1Zl9zdGFydDsKKwkJCXBhY2tldC0+ZW5kcG9pbnQgPSBFTkRQT0lOVF8wOworCQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCAmdGFyZ2V0LT5mcmVlX2N0cmxfcnhidWYpOworCQl9IGVsc2UKKwkJCWxpc3RfYWRkX3RhaWwoJnBhY2tldC0+bGlzdCwgJnRhcmdldC0+ZnJlZV9jdHJsX3R4YnVmKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwogLyogaHRjX3N0b3A6IHN0b3AgaW50ZXJydXB0IHJlY2VwdGlvbiwgYW5kIGZsdXNoIGFsbCBxdWV1ZWQgYnVmZmVycyAqLwogdm9pZCBhdGg2a2xfaHRjX3N0b3Aoc3RydWN0IGh0Y190YXJnZXQgKnRhcmdldCkKIHsKQEAgLTIzNjYsMjEgKzI3MTIsMTkgQEAKIAkgKiBmdW5jdGlvbiByZXR1cm5zIGFsbCBwZW5kaW5nIEhJRiBJL08gaGFzIGNvbXBsZXRlZCwgd2UgY2FuCiAJICogc2FmZWx5IGZsdXNoIHRoZSBxdWV1ZXMuCiAJICovCi0JYXRoNmtsZGV2X21hc2tfaW50cnModGFyZ2V0LT5kZXYpOworCWF0aDZrbF9oaWZfbWFza19pbnRycyh0YXJnZXQtPmRldik7CiAKIAlhdGg2a2xfaHRjX2ZsdXNoX3R4ZXBfYWxsKHRhcmdldCk7CiAKIAlhdGg2a2xfaHRjX2ZsdXNoX3J4X2J1Zih0YXJnZXQpOwogCi0JcmVzZXRfZXBfc3RhdGUodGFyZ2V0KTsKKwlhdGg2a2xfaHRjX3Jlc2V0KHRhcmdldCk7CiB9CiAKIHZvaWQgKmF0aDZrbF9odGNfY3JlYXRlKHN0cnVjdCBhdGg2a2wgKmFyKQogewogCXN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQgPSBOVUxMOwotCXN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQ7Ci0JaW50IHN0YXR1cyA9IDAsIGkgPSAwOwotCXUzMiBibG9ja19zaXplLCBjdHJsX2J1ZnN6OworCWludCBzdGF0dXMgPSAwOwogCiAJdGFyZ2V0ID0ga3phbGxvYyhzaXplb2YoKnRhcmdldCksIEdGUF9LRVJORUwpOwogCWlmICghdGFyZ2V0KSB7CkBAIC0yMzkyLDcgKzI3MzYsNyBAQAogCWlmICghdGFyZ2V0LT5kZXYpIHsKIAkJYXRoNmtsX2VycigidW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CiAJCXN0YXR1cyA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbF9jcmVhdGVfaHRjOworCQlnb3RvIGVycl9odGNfY2xlYW51cDsKIAl9CiAKIAlzcGluX2xvY2tfaW5pdCgmdGFyZ2V0LT5odGNfbG9jayk7CkBAIC0yNDA3LDQ5ICsyNzUxLDIwIEBACiAJdGFyZ2V0LT5kZXYtPmh0Y19jbnh0ID0gdGFyZ2V0OwogCXRhcmdldC0+ZXBfd2FpdGluZyA9IEVORFBPSU5UX01BWDsKIAotCXJlc2V0X2VwX3N0YXRlKHRhcmdldCk7Ci0KLQlzdGF0dXMgPSBhdGg2a2xkZXZfc2V0dXAodGFyZ2V0LT5kZXYpOwotCisJc3RhdHVzID0gYXRoNmtsX2hpZl9zZXR1cCh0YXJnZXQtPmRldik7CiAJaWYgKHN0YXR1cykKLQkJZ290byBmYWlsX2NyZWF0ZV9odGM7CisJCWdvdG8gZXJyX2h0Y19jbGVhbnVwOwogCi0JYmxvY2tfc2l6ZSA9IGFyLT5tYm94X2luZm8uYmxvY2tfc2l6ZTsKLQotCWN0cmxfYnVmc3ogPSAoYmxvY2tfc2l6ZSA+IEhUQ19NQVhfQ1RSTF9NU0dfTEVOKSA/Ci0JCSAgICAgIChibG9ja19zaXplICsgSFRDX0hEUl9MRU5HVEgpIDoKLQkJICAgICAgKEhUQ19NQVhfQ1RSTF9NU0dfTEVOICsgSFRDX0hEUl9MRU5HVEgpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9DT05UUk9MX0JVRkZFUlM7IGkrKykgewotCQlwYWNrZXQgPSBremFsbG9jKHNpemVvZigqcGFja2V0KSwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFja2V0KQotCQkJYnJlYWs7Ci0KLQkJcGFja2V0LT5idWZfc3RhcnQgPSBremFsbG9jKGN0cmxfYnVmc3osIEdGUF9LRVJORUwpOwotCQlpZiAoIXBhY2tldC0+YnVmX3N0YXJ0KSB7Ci0JCQlrZnJlZShwYWNrZXQpOwotCQkJYnJlYWs7Ci0JCX0KLQotCQlwYWNrZXQtPmJ1Zl9sZW4gPSBjdHJsX2J1ZnN6OwotCQlpZiAoaSA8IE5VTV9DT05UUk9MX1JYX0JVRkZFUlMpIHsKLQkJCXBhY2tldC0+YWN0X2xlbiA9IDA7Ci0JCQlwYWNrZXQtPmJ1ZiA9IHBhY2tldC0+YnVmX3N0YXJ0OwotCQkJcGFja2V0LT5lbmRwb2ludCA9IEVORFBPSU5UXzA7Ci0JCQlsaXN0X2FkZF90YWlsKCZwYWNrZXQtPmxpc3QsICZ0YXJnZXQtPmZyZWVfY3RybF9yeGJ1Zik7Ci0JCX0gZWxzZQotCQkJbGlzdF9hZGRfdGFpbCgmcGFja2V0LT5saXN0LCAmdGFyZ2V0LT5mcmVlX2N0cmxfdHhidWYpOwotCX0KLQotZmFpbF9jcmVhdGVfaHRjOgotCWlmIChpICE9IE5VTV9DT05UUk9MX0JVRkZFUlMgfHwgc3RhdHVzKSB7Ci0JCWlmICh0YXJnZXQpIHsKLQkJCWF0aDZrbF9odGNfY2xlYW51cCh0YXJnZXQpOwotCQkJdGFyZ2V0ID0gTlVMTDsKLQkJfQotCX0KKwlzdGF0dXMgPSBhdGg2a2xfaHRjX3Jlc2V0KHRhcmdldCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBlcnJfaHRjX2NsZWFudXA7CiAKIAlyZXR1cm4gdGFyZ2V0OworCitlcnJfaHRjX2NsZWFudXA6CisJYXRoNmtsX2h0Y19jbGVhbnVwKHRhcmdldCk7CisKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyogY2xlYW51cCB0aGUgSFRDIGluc3RhbmNlICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Yy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9odGMuaAppbmRleCA4Y2UwYzJjLi41NzY3MmUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Yy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjLmgKQEAgLTM5Myw3ICszOTMsNyBAQAogCWludCBjcmVkX3Blcl9tc2c7CiAKIAkvKiByZXNlcnZlZCBmb3IgSFRDIHVzZSAqLwotCXZvaWQgKmh0Y19yc3ZkOworCXN0cnVjdCBodGNfZW5kcG9pbnQgKmh0Y19lcDsKIAogCS8qCiAJICogY3VycmVudCBkZXB0aCBvZiBUWCBxdWV1ZSAsIGkuZS4gbWVzc2FnZXMgd2FpdGluZyBmb3IgY3JlZGl0cwpAQCAtNDE0LDkgKzQxNCwxMSBAQAogCUhUQ19DUkVESVRfRElTVF9TRUVLX0NSRURJVFMsCiB9OwogCi1zdHJ1Y3QgaHRjX2NyZWRpdF9zdGF0ZV9pbmZvIHsKK3N0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvIHsKIAlpbnQgdG90YWxfYXZhaWxfY3JlZGl0czsKIAlpbnQgY3VyX2ZyZWVfY3JlZGl0czsKKworCS8qIGxpc3Qgb2YgbG93ZXN0IHByaW9yaXR5IGVuZHBvaW50cyAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbG93ZXN0cHJpX2VwX2Rpc3Q7CiB9OwogCkBAIC01MDgsMTAgKzUxMCwxMyBAQAogLyogb3VyIEhUQyB0YXJnZXQgc3RhdGUgKi8KIHN0cnVjdCBodGNfdGFyZ2V0IHsKIAlzdHJ1Y3QgaHRjX2VuZHBvaW50IGVuZHBvaW50W0VORFBPSU5UX01BWF07CisKKwkvKiBjb250YWlucyBzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZCBjcmVkX2Rpc3RfbGlzdDsKKwogCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9jdHJsX3R4YnVmOwogCXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9jdHJsX3J4YnVmOwotCXN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm8gKmNyZWRfZGlzdF9jbnR4dDsKKwlzdHJ1Y3QgYXRoNmtsX2h0Y19jcmVkaXRfaW5mbyAqY3JlZGl0X2luZm87CiAJaW50IHRndF9jcmVkczsKIAl1bnNpZ25lZCBpbnQgdGd0X2NyZWRfc3o7CiAJc3BpbmxvY2tfdCBodGNfbG9jazsKQEAgLTU0Miw3ICs1NDcsNyBAQAogCiB2b2lkICphdGg2a2xfaHRjX2NyZWF0ZShzdHJ1Y3QgYXRoNmtsICphcik7CiB2b2lkIGF0aDZrbF9odGNfc2V0X2NyZWRpdF9kaXN0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQsCi0JCQkJc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAorCQkJCXN0cnVjdCBhdGg2a2xfaHRjX2NyZWRpdF9pbmZvICpjcmVkX2luZm8sCiAJCQkJdTE2IHN2Y19wcmlfb3JkZXJbXSwgaW50IGxlbik7CiBpbnQgYXRoNmtsX2h0Y193YWl0X3RhcmdldChzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0KTsKIGludCBhdGg2a2xfaHRjX3N0YXJ0KHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQpOwpAQCAtNTYzLDcgKzU2OCwxMCBAQAogaW50IGF0aDZrbF9odGNfYWRkX3J4YnVmX211bHRpcGxlKHN0cnVjdCBodGNfdGFyZ2V0ICp0YXJnZXQsCiAJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpwa3RxKTsKIGludCBhdGg2a2xfaHRjX3J4bXNnX3BlbmRpbmdfaGFuZGxlcihzdHJ1Y3QgaHRjX3RhcmdldCAqdGFyZ2V0LAotCQkJCSAgICAgdTMyIG1zZ19sb29rX2FoZWFkW10sIGludCAqbl9wa3RzKTsKKwkJCQkgICAgIHUzMiBtc2dfbG9va19haGVhZCwgaW50ICpuX3BrdHMpOworCitpbnQgYXRoNmtsX2NyZWRpdF9zZXR1cCh2b2lkICpodGNfaGFuZGxlLAorCQkJc3RydWN0IGF0aDZrbF9odGNfY3JlZGl0X2luZm8gKmNyZWRfaW5mbyk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaHRjX3BrdF9pbmZvKHN0cnVjdCBodGNfcGFja2V0ICpwYWNrZXQsIHZvaWQgKmNvbnRleHQsCiAJCQkJICAgIHU4ICpidWYsIHVuc2lnbmVkIGludCBsZW4sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2h0Y19oaWYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX2hpZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzFhZDYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvaHRjX2hpZi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwNy0yMDExIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCi0gKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KLSAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCi0gKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgSFRDX0hJRl9ICi0jZGVmaW5lIEhUQ19ISUZfSAotCi0jaW5jbHVkZSAiaHRjLmgiCi0jaW5jbHVkZSAiaGlmLmgiCi0KLSNkZWZpbmUgQVRINktMX01BSUxCT1hFUwk0Ci0KLS8qIEhUQyBydW5zIG92ZXIgbWFpbGJveCAwICovCi0jZGVmaW5lIEhUQ19NQUlMQk9YCTAKLQotI2RlZmluZSBBVEg2S0xfVEFSR0VUX0RFQlVHX0lOVFJfTUFTSyAgICAgMHgwMQotCi0jZGVmaW5lIE9USEVSX0lOVFNfRU5BQkxFRAkJKElOVF9TVEFUVVNfRU5BQkxFX0VSUk9SX01BU0sgfAlcCi0JCQkJCUlOVF9TVEFUVVNfRU5BQkxFX0NQVV9NQVNLICAgfAlcCi0JCQkJCUlOVF9TVEFUVVNfRU5BQkxFX0NPVU5URVJfTUFTSykKLQotI2RlZmluZSBBVEg2S0xfUkVHX0lPX0JVRkZFUl9TSVpFCQkJMzIKLSNkZWZpbmUgQVRINktMX01BWF9SRUdfSU9fQlVGRkVSUwkJCTgKLSNkZWZpbmUgQVRINktMX1NDQVRURVJfRU5UUklFU19QRVJfUkVRICAgICAgICAgICAgMTYKLSNkZWZpbmUgQVRINktMX01BWF9UUkFOU0ZFUl9TSVpFX1BFUl9TQ0FUVEVSICAgICAgKDE2ICogMTAyNCkKLSNkZWZpbmUgQVRINktMX1NDQVRURVJfUkVRUyAgICAgICAgICAgICAgICAgICAgICAgNAotCi0jaWZuZGVmIEFfQ0FDSEVfTElORV9QQUQKLSNkZWZpbmUgQV9DQUNIRV9MSU5FX1BBRCAgICAgICAgICAgICAgICAgICAgICAgIDEyOAotI2VuZGlmCi0jZGVmaW5lIEFUSDZLTF9NSU5fU0NBVFRFUl9FTlRSSUVTX1BFUl9SRVEgICAgICAgIDIKLSNkZWZpbmUgQVRINktMX01JTl9UUkFOU0ZFUl9TSVpFX1BFUl9TQ0FUVEVSICAgICAgKDQgKiAxMDI0KQotCi1zdHJ1Y3QgYXRoNmtsX2lycV9wcm9jX3JlZ2lzdGVycyB7Ci0JdTggaG9zdF9pbnRfc3RhdHVzOwotCXU4IGNwdV9pbnRfc3RhdHVzOwotCXU4IGVycm9yX2ludF9zdGF0dXM7Ci0JdTggY291bnRlcl9pbnRfc3RhdHVzOwotCXU4IG1ib3hfZnJhbWU7Ci0JdTggcnhfbGthaGRfdmFsaWQ7Ci0JdTggaG9zdF9pbnRfc3RhdHVzMjsKLQl1OCBnbWJveF9yeF9hdmFpbDsKLQlfX2xlMzIgcnhfbGthaGRbMl07Ci0JX19sZTMyIHJ4X2dtYm94X2xrYWhkX2FsaWFzWzJdOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyB7Ci0JdTggaW50X3N0YXR1c19lbjsKLQl1OCBjcHVfaW50X3N0YXR1c19lbjsKLQl1OCBlcnJfaW50X3N0YXR1c19lbjsKLQl1OCBjbnRyX2ludF9zdGF0dXNfZW47Ci19IF9fcGFja2VkOwotCi1zdHJ1Y3QgYXRoNmtsX2RldmljZSB7Ci0Jc3BpbmxvY2tfdCBsb2NrOwotCXU4IHBhZDFbQV9DQUNIRV9MSU5FX1BBRF07Ci0Jc3RydWN0IGF0aDZrbF9pcnFfcHJvY19yZWdpc3RlcnMgaXJxX3Byb2NfcmVnOwotCXU4IHBhZDJbQV9DQUNIRV9MSU5FX1BBRF07Ci0Jc3RydWN0IGF0aDZrbF9pcnFfZW5hYmxlX3JlZyBpcnFfZW5fcmVnOwotCXU4IHBhZDNbQV9DQUNIRV9MSU5FX1BBRF07Ci0Jc3RydWN0IGh0Y190YXJnZXQgKmh0Y19jbnh0OwotCXN0cnVjdCBhdGg2a2wgKmFyOwotfTsKLQotaW50IGF0aDZrbGRldl9zZXR1cChzdHJ1Y3QgYXRoNmtsX2RldmljZSAqZGV2KTsKLWludCBhdGg2a2xkZXZfdW5tYXNrX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpOwotaW50IGF0aDZrbGRldl9tYXNrX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpOwotaW50IGF0aDZrbGRldl9wb2xsX21ib3htc2dfcngoc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwKLQkJCSAgICAgIHUzMiAqbGtfYWhkLCBpbnQgdGltZW91dCk7Ci1pbnQgYXRoNmtsZGV2X3J4X2NvbnRyb2woc3RydWN0IGF0aDZrbF9kZXZpY2UgKmRldiwgYm9vbCBlbmFibGVfcngpOwotaW50IGF0aDZrbGRldl9kaXNhYmxlX2ludHJzKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYpOwotCi1pbnQgYXRoNmtsZGV2X3J3X2NvbXBfaGFuZGxlcih2b2lkICpjb250ZXh0LCBpbnQgc3RhdHVzKTsKLWludCBhdGg2a2xkZXZfaW50cl9iaF9oYW5kbGVyKHN0cnVjdCBhdGg2a2wgKmFyKTsKLQotLyogU2NhdHRlciBGdW5jdGlvbiBhbmQgRGVmaW5pdGlvbnMgKi8KLWludCBhdGg2a2xkZXZfc3VibWl0X3NjYXRfcmVxKHN0cnVjdCBhdGg2a2xfZGV2aWNlICpkZXYsCi0JCQkgICAgc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqc2NhdF9yZXEsIGJvb2wgcmVhZCk7Ci0KLSNlbmRpZiAvKkFUSDZLTF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9pbml0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2luaXQuYwppbmRleCBjMWQyMzY2Li43ZjU1YmUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL2luaXQuYwpAQCAtMTYsNiArMTYsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+CiAjaW5jbHVkZSAiY29yZS5oIgpAQCAtMjYsOSArMjcsODUgQEAKIAogdW5zaWduZWQgaW50IGRlYnVnX21hc2s7CiBzdGF0aWMgdW5zaWduZWQgaW50IHRlc3Rtb2RlOworc3RhdGljIGJvb2wgc3VzcGVuZF9jdXRwb3dlcjsKIAogbW9kdWxlX3BhcmFtKGRlYnVnX21hc2ssIHVpbnQsIDA2NDQpOwogbW9kdWxlX3BhcmFtKHRlc3Rtb2RlLCB1aW50LCAwNjQ0KTsKK21vZHVsZV9wYXJhbShzdXNwZW5kX2N1dHBvd2VyLCBib29sLCAwNDQ0KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhdGg2a2xfaHcgaHdfbGlzdFtdID0geworCXsKKwkJLmlkCQkJCT0gQVI2MDAzX0hXXzJfMF9WRVJTSU9OLAorCQkubmFtZQkJCQk9ICJhcjYwMDMgaHcgMi4wIiwKKwkJLmRhdGFzZXRfcGF0Y2hfYWRkcgkJPSAweDU3ZTg4NCwKKwkJLmFwcF9sb2FkX2FkZHIJCQk9IDB4NTQzMTgwLAorCQkuYm9hcmRfZXh0X2RhdGFfYWRkcgkJPSAweDU3ZTUwMCwKKwkJLnJlc2VydmVkX3JhbV9zaXplCQk9IDY5MTIsCisJCS5yZWZjbGtfaHoJCQk9IDI2MDAwMDAwLAorCQkudWFydHR4X3BpbgkJCT0gOCwKKworCQkvKiBodzIuMCBuZWVkcyBvdmVycmlkZSBhZGRyZXNzIGhhcmRjb2RlZCAqLworCQkuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIJPSAweDk0NEMwMCwKKworCQkuZndfb3RwCQkJPSBBUjYwMDNfSFdfMl8wX09UUF9GSUxFLAorCQkuZncJCQk9IEFSNjAwM19IV18yXzBfRklSTVdBUkVfRklMRSwKKwkJLmZ3X3RjbWQJCT0gQVI2MDAzX0hXXzJfMF9UQ01EX0ZJUk1XQVJFX0ZJTEUsCisJCS5md19wYXRjaAkJPSBBUjYwMDNfSFdfMl8wX1BBVENIX0ZJTEUsCisJCS5md19hcGkyCQk9IEFSNjAwM19IV18yXzBfRklSTVdBUkVfMl9GSUxFLAorCQkuZndfYm9hcmQJCT0gQVI2MDAzX0hXXzJfMF9CT0FSRF9EQVRBX0ZJTEUsCisJCS5md19kZWZhdWx0X2JvYXJkCT0gQVI2MDAzX0hXXzJfMF9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSwKKwl9LAorCXsKKwkJLmlkCQkJCT0gQVI2MDAzX0hXXzJfMV8xX1ZFUlNJT04sCisJCS5uYW1lCQkJCT0gImFyNjAwMyBodyAyLjEuMSIsCisJCS5kYXRhc2V0X3BhdGNoX2FkZHIJCT0gMHg1N2ZmNzQsCisJCS5hcHBfbG9hZF9hZGRyCQkJPSAweDEyMzQsCisJCS5ib2FyZF9leHRfZGF0YV9hZGRyCQk9IDB4NTQyMzMwLAorCQkucmVzZXJ2ZWRfcmFtX3NpemUJCT0gNTEyLAorCQkucmVmY2xrX2h6CQkJPSAyNjAwMDAwMCwKKwkJLnVhcnR0eF9waW4JCQk9IDgsCisKKwkJLmZ3X290cAkJCT0gQVI2MDAzX0hXXzJfMV8xX09UUF9GSUxFLAorCQkuZncJCQk9IEFSNjAwM19IV18yXzFfMV9GSVJNV0FSRV9GSUxFLAorCQkuZndfdGNtZAkJPSBBUjYwMDNfSFdfMl8xXzFfVENNRF9GSVJNV0FSRV9GSUxFLAorCQkuZndfcGF0Y2gJCT0gQVI2MDAzX0hXXzJfMV8xX1BBVENIX0ZJTEUsCisJCS5md19hcGkyCQk9IEFSNjAwM19IV18yXzFfMV9GSVJNV0FSRV8yX0ZJTEUsCisJCS5md19ib2FyZAkJPSBBUjYwMDNfSFdfMl8xXzFfQk9BUkRfREFUQV9GSUxFLAorCQkuZndfZGVmYXVsdF9ib2FyZAk9IEFSNjAwM19IV18yXzFfMV9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSwKKwl9LAorCXsKKwkJLmlkCQkJCT0gQVI2MDA0X0hXXzFfMF9WRVJTSU9OLAorCQkubmFtZQkJCQk9ICJhcjYwMDQgaHcgMS4wIiwKKwkJLmRhdGFzZXRfcGF0Y2hfYWRkcgkJPSAweDU3ZTg4NCwKKwkJLmFwcF9sb2FkX2FkZHIJCQk9IDB4MTIzNCwKKwkJLmJvYXJkX2V4dF9kYXRhX2FkZHIJCT0gMHg0MzcwMDAsCisJCS5yZXNlcnZlZF9yYW1fc2l6ZQkJPSAxOTQ1NiwKKwkJLmJvYXJkX2FkZHIJCQk9IDB4NDMzOTAwLAorCQkucmVmY2xrX2h6CQkJPSAyNjAwMDAwMCwKKwkJLnVhcnR0eF9waW4JCQk9IDExLAorCisJCS5mdwkJCT0gQVI2MDA0X0hXXzFfMF9GSVJNV0FSRV9GSUxFLAorCQkuZndfYXBpMgkJPSBBUjYwMDRfSFdfMV8wX0ZJUk1XQVJFXzJfRklMRSwKKwkJLmZ3X2JvYXJkCQk9IEFSNjAwNF9IV18xXzBfQk9BUkRfREFUQV9GSUxFLAorCQkuZndfZGVmYXVsdF9ib2FyZAk9IEFSNjAwNF9IV18xXzBfREVGQVVMVF9CT0FSRF9EQVRBX0ZJTEUsCisJfSwKKwl7CisJCS5pZAkJCQk9IEFSNjAwNF9IV18xXzFfVkVSU0lPTiwKKwkJLm5hbWUJCQkJPSAiYXI2MDA0IGh3IDEuMSIsCisJCS5kYXRhc2V0X3BhdGNoX2FkZHIJCT0gMHg1N2U4ODQsCisJCS5hcHBfbG9hZF9hZGRyCQkJPSAweDEyMzQsCisJCS5ib2FyZF9leHRfZGF0YV9hZGRyCQk9IDB4NDM3MDAwLAorCQkucmVzZXJ2ZWRfcmFtX3NpemUJCT0gMTEyNjQsCisJCS5ib2FyZF9hZGRyCQkJPSAweDQzZDQwMCwKKwkJLnJlZmNsa19oegkJCT0gNDAwMDAwMDAsCisJCS51YXJ0dHhfcGluCQkJPSAxMSwKKworCQkuZncJCQk9IEFSNjAwNF9IV18xXzFfRklSTVdBUkVfRklMRSwKKwkJLmZ3X2FwaTIJCT0gQVI2MDA0X0hXXzFfMV9GSVJNV0FSRV8yX0ZJTEUsCisJCS5md19ib2FyZAkJPSBBUjYwMDRfSFdfMV8xX0JPQVJEX0RBVEFfRklMRSwKKwkJLmZ3X2RlZmF1bHRfYm9hcmQJPSBBUjYwMDRfSFdfMV8xX0RFRkFVTFRfQk9BUkRfREFUQV9GSUxFLAorCX0sCit9OwogCiAvKgogICogSW5jbHVkZSBkZWZpbml0aW9ucyBoZXJlIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHVuZSB0aGUgV0xBTiBtb2R1bGUKQEAgLTU1LDcgKzEzMiw2IEBACiAgKi8KICNkZWZpbmUgV0xBTl9DT05GSUdfRElTQ09OTkVDVF9USU1FT1VUIDEwCiAKLSNkZWZpbmUgQ09ORklHX0FSNjAweF9ERUJVR19VQVJUX1RYX1BJTiA4CiAKICNkZWZpbmUgQVRINktMX0RBVEFfT0ZGU0VUICAgIDY0CiBzdHJ1Y3Qgc2tfYnVmZiAqYXRoNmtsX2J1Zl9hbGxvYyhpbnQgc2l6ZSkKQEAgLTczLDM3ICsxNDksMjEgQEAKIAlyZXR1cm4gc2tiOwogfQogCi12b2lkIGF0aDZrbF9pbml0X3Byb2ZpbGVfaW5mbyhzdHJ1Y3QgYXRoNmtsICphcikKK3ZvaWQgYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7Ci0JYXItPnNzaWRfbGVuID0gMDsKLQltZW1zZXQoYXItPnNzaWQsIDAsIHNpemVvZihhci0+c3NpZCkpOworCXZpZi0+c3NpZF9sZW4gPSAwOworCW1lbXNldCh2aWYtPnNzaWQsIDAsIHNpemVvZih2aWYtPnNzaWQpKTsKIAotCWFyLT5kb3QxMV9hdXRoX21vZGUgPSBPUEVOX0FVVEg7Ci0JYXItPmF1dGhfbW9kZSA9IE5PTkVfQVVUSDsKLQlhci0+cHJ3aXNlX2NyeXB0byA9IE5PTkVfQ1JZUFQ7Ci0JYXItPnByd2lzZV9jcnlwdG9fbGVuID0gMDsKLQlhci0+Z3JwX2NyeXB0byA9IE5PTkVfQ1JZUFQ7Ci0JYXItPmdycF9jcnlwdG9fbGVuID0gMDsKLQltZW1zZXQoYXItPndlcF9rZXlfbGlzdCwgMCwgc2l6ZW9mKGFyLT53ZXBfa2V5X2xpc3QpKTsKLQltZW1zZXQoYXItPnJlcV9ic3NpZCwgMCwgc2l6ZW9mKGFyLT5yZXFfYnNzaWQpKTsKLQltZW1zZXQoYXItPmJzc2lkLCAwLCBzaXplb2YoYXItPmJzc2lkKSk7Ci0JYXItPmJzc19jaCA9IDA7Ci0JYXItPm53X3R5cGUgPSBhci0+bmV4dF9tb2RlID0gSU5GUkFfTkVUV09SSzsKLX0KLQotc3RhdGljIHU4IGF0aDZrbF9nZXRfZndfaWZ0eXBlKHN0cnVjdCBhdGg2a2wgKmFyKQotewotCXN3aXRjaCAoYXItPm53X3R5cGUpIHsKLQljYXNlIElORlJBX05FVFdPUks6Ci0JCXJldHVybiBISV9PUFRJT05fRldfTU9ERV9CU1NfU1RBOwotCWNhc2UgQURIT0NfTkVUV09SSzoKLQkJcmV0dXJuIEhJX09QVElPTl9GV19NT0RFX0lCU1M7Ci0JY2FzZSBBUF9ORVRXT1JLOgotCQlyZXR1cm4gSElfT1BUSU9OX0ZXX01PREVfQVA7Ci0JZGVmYXVsdDoKLQkJYXRoNmtsX2VycigiVW5zdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGUgOiVkXG4iLCBhci0+bndfdHlwZSk7Ci0JCXJldHVybiAweGZmOwotCX0KKwl2aWYtPmRvdDExX2F1dGhfbW9kZSA9IE9QRU5fQVVUSDsKKwl2aWYtPmF1dGhfbW9kZSA9IE5PTkVfQVVUSDsKKwl2aWYtPnByd2lzZV9jcnlwdG8gPSBOT05FX0NSWVBUOworCXZpZi0+cHJ3aXNlX2NyeXB0b19sZW4gPSAwOworCXZpZi0+Z3JwX2NyeXB0byA9IE5PTkVfQ1JZUFQ7CisJdmlmLT5ncnBfY3J5cHRvX2xlbiA9IDA7CisJbWVtc2V0KHZpZi0+d2VwX2tleV9saXN0LCAwLCBzaXplb2YodmlmLT53ZXBfa2V5X2xpc3QpKTsKKwltZW1zZXQodmlmLT5yZXFfYnNzaWQsIDAsIHNpemVvZih2aWYtPnJlcV9ic3NpZCkpOworCW1lbXNldCh2aWYtPmJzc2lkLCAwLCBzaXplb2YodmlmLT5ic3NpZCkpOworCXZpZi0+YnNzX2NoID0gMDsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfc2V0X2hvc3RfYXBwX2FyZWEoc3RydWN0IGF0aDZrbCAqYXIpCkBAIC0xMjAsNyArMTgwLDcgQEAKIAkJcmV0dXJuIC1FSU87CiAKIAlhZGRyZXNzID0gVEFSR19WVE9QKGFyLT50YXJnZXRfdHlwZSwgZGF0YSk7Ci0JaG9zdF9hcHBfYXJlYS53bWlfcHJvdG9jb2xfdmVyID0gV01JX1BST1RPQ09MX1ZFUlNJT047CisJaG9zdF9hcHBfYXJlYS53bWlfcHJvdG9jb2xfdmVyID0gY3B1X3RvX2xlMzIoV01JX1BST1RPQ09MX1ZFUlNJT04pOwogCWlmIChhdGg2a2xfZGlhZ193cml0ZShhciwgYWRkcmVzcywgKHU4ICopICZob3N0X2FwcF9hcmVhLAogCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBob3N0X2FwcF9hcmVhKSkpCiAJCXJldHVybiAtRUlPOwpAQCAtMjU4LDQwICszMTgsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYXRoNmtsX2luaXRfY29udHJvbF9pbmZvKHN0cnVjdCBhdGg2a2wgKmFyKQordm9pZCBhdGg2a2xfaW5pdF9jb250cm9sX2luZm8oc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKLQl1OCBjdHI7Ci0KLQljbGVhcl9iaXQoV01JX0VOQUJMRUQsICZhci0+ZmxhZyk7Ci0JYXRoNmtsX2luaXRfcHJvZmlsZV9pbmZvKGFyKTsKLQlhci0+ZGVmX3R4a2V5X2luZGV4ID0gMDsKLQltZW1zZXQoYXItPndlcF9rZXlfbGlzdCwgMCwgc2l6ZW9mKGFyLT53ZXBfa2V5X2xpc3QpKTsKLQlhci0+Y2hfaGludCA9IDA7Ci0JYXItPmxpc3Rlbl9pbnR2bF90ID0gQV9ERUZBVUxUX0xJU1RFTl9JTlRFUlZBTDsKLQlhci0+bGlzdGVuX2ludHZsX2IgPSAwOwotCWFyLT50eF9wd3IgPSAwOwotCWNsZWFyX2JpdChTS0lQX1NDQU4sICZhci0+ZmxhZyk7Ci0Jc2V0X2JpdChXTU1fRU5BQkxFRCwgJmFyLT5mbGFnKTsKLQlhci0+aW50cmFfYnNzID0gMTsKLQltZW1zZXQoJmFyLT5zY19wYXJhbXMsIDAsIHNpemVvZihhci0+c2NfcGFyYW1zKSk7Ci0JYXItPnNjX3BhcmFtcy5zaG9ydF9zY2FuX3JhdGlvID0gV01JX1NIT1JUU0NBTlJBVElPX0RFRkFVTFQ7Ci0JYXItPnNjX3BhcmFtcy5zY2FuX2N0cmxfZmxhZ3MgPSBERUZBVUxUX1NDQU5fQ1RSTF9GTEFHUzsKLQlhci0+bHJzc2lfcm9hbV90aHJlc2hvbGQgPSBERUZfTFJTU0lfUk9BTV9USFJFU0hPTEQ7Ci0KLQltZW1zZXQoKHU4ICopYXItPnN0YV9saXN0LCAwLAotCSAgICAgICBBUF9NQVhfTlVNX1NUQSAqIHNpemVvZihzdHJ1Y3QgYXRoNmtsX3N0YSkpOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmFyLT5tY2FzdHBzcV9sb2NrKTsKLQotCS8qIEluaXQgdGhlIFBTIHF1ZXVlcyAqLwotCWZvciAoY3RyID0gMDsgY3RyIDwgQVBfTUFYX05VTV9TVEE7IGN0cisrKSB7Ci0JCXNwaW5fbG9ja19pbml0KCZhci0+c3RhX2xpc3RbY3RyXS5wc3FfbG9jayk7Ci0JCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmFyLT5zdGFfbGlzdFtjdHJdLnBzcSk7Ci0JfQotCi0Jc2tiX3F1ZXVlX2hlYWRfaW5pdCgmYXItPm1jYXN0cHNxKTsKLQotCW1lbWNweShhci0+YXBfY291bnRyeV9jb2RlLCBERUZfQVBfQ09VTlRSWV9DT0RFLCAzKTsKKwlhdGg2a2xfaW5pdF9wcm9maWxlX2luZm8odmlmKTsKKwl2aWYtPmRlZl90eGtleV9pbmRleCA9IDA7CisJbWVtc2V0KHZpZi0+d2VwX2tleV9saXN0LCAwLCBzaXplb2YodmlmLT53ZXBfa2V5X2xpc3QpKTsKKwl2aWYtPmNoX2hpbnQgPSAwOwogfQogCiAvKgpAQCAtMzQxLDYyICszNzMsNyBAQAogCXJldHVybiBzdGF0dXM7CiB9CiAKLSNkZWZpbmUgUkVHX0RVTVBfQ09VTlRfQVI2MDAzICAgNjAKLSNkZWZpbmUgUkVHSVNURVJfRFVNUF9MRU5fTUFYICAgNjAKLQotc3RhdGljIHZvaWQgYXRoNmtsX2R1bXBfdGFyZ2V0X2Fzc2VydF9pbmZvKHN0cnVjdCBhdGg2a2wgKmFyKQotewotCXUzMiBhZGRyZXNzOwotCXUzMiByZWdkdW1wX2xvYyA9IDA7Ci0JaW50IHN0YXR1czsKLQl1MzIgcmVnZHVtcF92YWxbUkVHSVNURVJfRFVNUF9MRU5fTUFYXTsKLQl1MzIgaTsKLQotCWlmIChhci0+dGFyZ2V0X3R5cGUgIT0gVEFSR0VUX1RZUEVfQVI2MDAzKQotCQlyZXR1cm47Ci0KLQkvKiB0aGUgcmVnIGR1bXAgcG9pbnRlciBpcyBjb3BpZWQgdG8gdGhlIGhvc3QgaW50ZXJlc3QgYXJlYSAqLwotCWFkZHJlc3MgPSBhdGg2a2xfZ2V0X2hpX2l0ZW1fYWRkcihhciwgSElfSVRFTShoaV9mYWlsdXJlX3N0YXRlKSk7Ci0JYWRkcmVzcyA9IFRBUkdfVlRPUChhci0+dGFyZ2V0X3R5cGUsIGFkZHJlc3MpOwotCi0JLyogcmVhZCBSQU0gbG9jYXRpb24gdGhyb3VnaCBkaWFnbm9zdGljIHdpbmRvdyAqLwotCXN0YXR1cyA9IGF0aDZrbF9kaWFnX3JlYWQzMihhciwgYWRkcmVzcywgJnJlZ2R1bXBfbG9jKTsKLQotCWlmIChzdGF0dXMgfHwgIXJlZ2R1bXBfbG9jKSB7Ci0JCWF0aDZrbF9lcnIoImZhaWxlZCB0byBnZXQgcHRyIHRvIHJlZ2lzdGVyIGR1bXAgYXJlYVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAibG9jYXRpb24gb2YgcmVnaXN0ZXIgZHVtcCBkYXRhOiAweCVYXG4iLAotCQlyZWdkdW1wX2xvYyk7Ci0JcmVnZHVtcF9sb2MgPSBUQVJHX1ZUT1AoYXItPnRhcmdldF90eXBlLCByZWdkdW1wX2xvYyk7Ci0KLQkvKiBmZXRjaCByZWdpc3RlciBkdW1wIGRhdGEgKi8KLQlzdGF0dXMgPSBhdGg2a2xfZGlhZ19yZWFkKGFyLCByZWdkdW1wX2xvYywgKHU4ICopJnJlZ2R1bXBfdmFsWzBdLAotCQkJCSAgUkVHX0RVTVBfQ09VTlRfQVI2MDAzICogKHNpemVvZih1MzIpKSk7Ci0KLQlpZiAoc3RhdHVzKSB7Ci0JCWF0aDZrbF9lcnIoImZhaWxlZCB0byBnZXQgcmVnaXN0ZXIgZHVtcFxuIik7Ci0JCXJldHVybjsKLQl9Ci0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgIlJlZ2lzdGVyIER1bXA6XG4iKTsKLQotCWZvciAoaSA9IDA7IGkgPCBSRUdfRFVNUF9DT1VOVF9BUjYwMDM7IGkrKykKLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgIiAlZCA6ICAweCU4LjhYXG4iLAotCQkJICAgaSwgcmVnZHVtcF92YWxbaV0pOwotCi19Ci0KLXZvaWQgYXRoNmtsX3RhcmdldF9mYWlsdXJlKHN0cnVjdCBhdGg2a2wgKmFyKQotewotCWF0aDZrbF9lcnIoInRhcmdldCBhc3NlcnRlZFxuIik7Ci0KLQkvKiB0cnkgZHVtcGluZyB0YXJnZXQgYXNzZXJ0aW9uIGluZm9ybWF0aW9uIChpZiBhbnkpICovCi0JYXRoNmtsX2R1bXBfdGFyZ2V0X2Fzc2VydF9pbmZvKGFyKTsKLQotfQotCi1zdGF0aWMgaW50IGF0aDZrbF90YXJnZXRfY29uZmlnX3dsYW5fcGFyYW1zKHN0cnVjdCBhdGg2a2wgKmFyKQorc3RhdGljIGludCBhdGg2a2xfdGFyZ2V0X2NvbmZpZ193bGFuX3BhcmFtcyhzdHJ1Y3QgYXRoNmtsICphciwgaW50IGlkeCkKIHsKIAlpbnQgc3RhdHVzID0gMDsKIAlpbnQgcmV0OwpAQCAtNDA2LDQ2ICszODMsNDYgQEAKIAkgKiBkZWZhdWx0IHZhbHVlcy4gUmVxdWlyZWQgaWYgY2hlY2tzdW0gb2ZmbG9hZCBpcyBuZWVkZWQuIFNldAogCSAqIFJ4TWV0YVZlcnNpb24gdG8gMi4KIAkgKi8KLQlpZiAoYXRoNmtsX3dtaV9zZXRfcnhfZnJhbWVfZm9ybWF0X2NtZChhci0+d21pLAorCWlmIChhdGg2a2xfd21pX3NldF9yeF9mcmFtZV9mb3JtYXRfY21kKGFyLT53bWksIGlkeCwKIAkJCQkJICAgICAgIGFyLT5yeF9tZXRhX3ZlciwgMCwgMCkpIHsKIAkJYXRoNmtsX2VycigidW5hYmxlIHRvIHNldCB0aGUgcnggZnJhbWUgZm9ybWF0XG4iKTsKIAkJc3RhdHVzID0gLUVJTzsKIAl9CiAKIAlpZiAoYXItPmNvbmZfZmxhZ3MgJiBBVEg2S0xfQ09ORl9JR05PUkVfUFNfRkFJTF9FVlRfSU5fU0NBTikKLQkJaWYgKChhdGg2a2xfd21pX3BtcGFyYW1zX2NtZChhci0+d21pLCAwLCAxLCAwLCAwLCAxLAorCQlpZiAoKGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKGFyLT53bWksIGlkeCwgMCwgMSwgMCwgMCwgMSwKIAkJICAgICBJR05PUkVfUE9XRVJfU0FWRV9GQUlMX0VWRU5UX0RVUklOR19TQ0FOKSkgIT0gMCkgewogCQkJYXRoNmtsX2VycigidW5hYmxlIHRvIHNldCBwb3dlciBzYXZlIGZhaWwgZXZlbnQgcG9saWN5XG4iKTsKIAkJCXN0YXR1cyA9IC1FSU87CiAJCX0KIAogCWlmICghKGFyLT5jb25mX2ZsYWdzICYgQVRINktMX0NPTkZfSUdOT1JFX0VSUF9CQVJLRVIpKQotCQlpZiAoKGF0aDZrbF93bWlfc2V0X2xwcmVhbWJsZV9jbWQoYXItPndtaSwgMCwKKwkJaWYgKChhdGg2a2xfd21pX3NldF9scHJlYW1ibGVfY21kKGFyLT53bWksIGlkeCwgMCwKIAkJICAgICBXTUlfRE9OT1RfSUdOT1JFX0JBUktFUl9JTl9FUlApKSAhPSAwKSB7CiAJCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gc2V0IGJhcmtlciBwcmVhbWJsZSBwb2xpY3lcbiIpOwogCQkJc3RhdHVzID0gLUVJTzsKIAkJfQogCi0JaWYgKGF0aDZrbF93bWlfc2V0X2tlZXBhbGl2ZV9jbWQoYXItPndtaSwKKwlpZiAoYXRoNmtsX3dtaV9zZXRfa2VlcGFsaXZlX2NtZChhci0+d21pLCBpZHgsCiAJCQlXTEFOX0NPTkZJR19LRUVQX0FMSVZFX0lOVEVSVkFMKSkgewogCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gc2V0IGtlZXAgYWxpdmUgaW50ZXJ2YWxcbiIpOwogCQlzdGF0dXMgPSAtRUlPOwogCX0KIAotCWlmIChhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChhci0+d21pLAorCWlmIChhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChhci0+d21pLCBpZHgsCiAJCQlXTEFOX0NPTkZJR19ESVNDT05ORUNUX1RJTUVPVVQpKSB7CiAJCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQgZGlzY29ubmVjdCB0aW1lb3V0XG4iKTsKIAkJc3RhdHVzID0gLUVJTzsKIAl9CiAKIAlpZiAoIShhci0+Y29uZl9mbGFncyAmIEFUSDZLTF9DT05GX0VOQUJMRV9UWF9CVVJTVCkpCi0JCWlmIChhdGg2a2xfd21pX3NldF93bW1fdHhvcChhci0+d21pLCBXTUlfVFhPUF9ESVNBQkxFRCkpIHsKKwkJaWYgKGF0aDZrbF93bWlfc2V0X3dtbV90eG9wKGFyLT53bWksIGlkeCwgV01JX1RYT1BfRElTQUJMRUQpKSB7CiAJCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gc2V0IHR4b3AgYnVyc3RpbmdcbiIpOwogCQkJc3RhdHVzID0gLUVJTzsKIAkJfQogCi0JaWYgKGFyLT5wMnApIHsKLQkJcmV0ID0gYXRoNmtsX3dtaV9pbmZvX3JlcV9jbWQoYXItPndtaSwKKwlpZiAoYXItPnAycCAmJiAoYXItPnZpZl9tYXggPT0gMSB8fCBpZHgpKSB7CisJCXJldCA9IGF0aDZrbF93bWlfaW5mb19yZXFfY21kKGFyLT53bWksIGlkeCwKIAkJCQkJICAgICAgUDJQX0ZMQUdfQ0FQQUJJTElUSUVTX1JFUSB8CiAJCQkJCSAgICAgIFAyUF9GTEFHX01BQ0FERFJfUkVRIHwKIAkJCQkJICAgICAgUDJQX0ZMQUdfSE1PREVMX1JFUSk7CkBAIC00NTMsMTMgKzQzMCwxMyBAQAogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgImZhaWxlZCB0byByZXF1ZXN0IFAyUCAiCiAJCQkJICAgImNhcGFiaWxpdGllcyAoJWQpIC0gYXNzdW1pbmcgUDJQIG5vdCAiCiAJCQkJICAgInN1cHBvcnRlZFxuIiwgcmV0KTsKLQkJCWFyLT5wMnAgPSAwOworCQkJYXItPnAycCA9IGZhbHNlOwogCQl9CiAJfQogCi0JaWYgKGFyLT5wMnApIHsKKwlpZiAoYXItPnAycCAmJiAoYXItPnZpZl9tYXggPT0gMSB8fCBpZHgpKSB7CiAJCS8qIEVuYWJsZSBQcm9iZSBSZXF1ZXN0IHJlcG9ydGluZyBmb3IgUDJQICovCi0JCXJldCA9IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoYXItPndtaSwgdHJ1ZSk7CisJCXJldCA9IGF0aDZrbF93bWlfcHJvYmVfcmVwb3J0X3JlcV9jbWQoYXItPndtaSwgaWR4LCB0cnVlKTsKIAkJaWYgKHJldCkgewogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgImZhaWxlZCB0byBlbmFibGUgUHJvYmUgIgogCQkJCSAgICJSZXF1ZXN0IHJlcG9ydGluZyAoJWQpXG4iLCByZXQpOwpAQCAtNDcyLDEzICs0NDksNDAgQEAKIGludCBhdGg2a2xfY29uZmlndXJlX3RhcmdldChzdHJ1Y3QgYXRoNmtsICphcikKIHsKIAl1MzIgcGFyYW0sIHJhbV9yZXNlcnZlZF9zaXplOwotCXU4IGZ3X2lmdHlwZTsKKwl1OCBmd19pZnR5cGUsIGZ3X21vZGUgPSAwLCBmd19zdWJtb2RlID0gMDsKKwlpbnQgaSwgc3RhdHVzOwogCi0JZndfaWZ0eXBlID0gYXRoNmtsX2dldF9md19pZnR5cGUoYXIpOwotCWlmIChmd19pZnR5cGUgPT0gMHhmZikKLQkJcmV0dXJuIC1FSU5WQUw7CisJLyoKKwkgKiBOb3RlOiBFdmVuIHRob3VnaCB0aGUgZmlybXdhcmUgaW50ZXJmYWNlIHR5cGUgaXMKKwkgKiBjaG9zZW4gYXMgQlNTX1NUQSBmb3IgYWxsIHRocmVlIGludGVyZmFjZXMsIGNhbgorCSAqIGJlIGNvbmZpZ3VyZWQgdG8gSUJTUy9BUCBhcyBsb25nIGFzIHRoZSBmdyBzdWJtb2RlCisJICogcmVtYWlucyBub3JtYWwgbW9kZSAoMCAtIEFQLCBTVEEgYW5kIElCU1MpLiBCdXQKKwkgKiBkdWUgdG8gYW4gdGFyZ2V0IGFzc2VydCBpbiBmaXJtd2FyZSBvbmx5IG9uZSBpbnRlcmZhY2UgaXMKKwkgKiBjb25maWd1cmVkIGZvciBub3cuCisJICovCisJZndfaWZ0eXBlID0gSElfT1BUSU9OX0ZXX01PREVfQlNTX1NUQTsKIAotCS8qIFRlbGwgdGFyZ2V0IHdoaWNoIEhUQyB2ZXJzaW9uIGl0IGlzIHVzZWQqLworCWZvciAoaSA9IDA7IGkgPCBhci0+dmlmX21heDsgaSsrKQorCQlmd19tb2RlIHw9IGZ3X2lmdHlwZSA8PCAoaSAqIEhJX09QVElPTl9GV19NT0RFX0JJVFMpOworCisJLyoKKwkgKiBCeSBkZWZhdWx0LCBzdWJtb2RlcyA6CisJICoJCXZpZlswXSAtIEFQL1NUQS9JQlNTCisJICoJCXZpZlsxXSAtICJQMlAgZGV2Ii8iUDJQIEdPIi8iUDJQIENsaWVudCIKKwkgKgkJdmlmWzJdIC0gIlAyUCBkZXYiLyJQMlAgR08iLyJQMlAgQ2xpZW50IgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IGFyLT5tYXhfbm9ybV9pZmFjZTsgaSsrKQorCQlmd19zdWJtb2RlIHw9IEhJX09QVElPTl9GV19TVUJNT0RFX05PTkUgPDwKKwkJCSAgICAgIChpICogSElfT1BUSU9OX0ZXX1NVQk1PREVfQklUUyk7CisKKwlmb3IgKGkgPSBhci0+bWF4X25vcm1faWZhY2U7IGkgPCBhci0+dmlmX21heDsgaSsrKQorCQlmd19zdWJtb2RlIHw9IEhJX09QVElPTl9GV19TVUJNT0RFX1AyUERFViA8PAorCQkJICAgICAgKGkgKiBISV9PUFRJT05fRldfU1VCTU9ERV9CSVRTKTsKKworCWlmIChhci0+cDJwICYmIGFyLT52aWZfbWF4ID09IDEpCisJCWZ3X3N1Ym1vZGUgPSBISV9PUFRJT05fRldfU1VCTU9ERV9QMlBERVY7CisKIAlwYXJhbSA9IEhUQ19QUk9UT0NPTF9WRVJTSU9OOwogCWlmIChhdGg2a2xfYm1pX3dyaXRlKGFyLAogCQkJICAgICBhdGg2a2xfZ2V0X2hpX2l0ZW1fYWRkcihhciwKQEAgLTQ5OSwxMiArNTAzLDEwIEBACiAJCXJldHVybiAtRUlPOwogCX0KIAotCXBhcmFtIHw9ICgxIDw8IEhJX09QVElPTl9OVU1fREVWX1NISUZUKTsKLQlwYXJhbSB8PSAoZndfaWZ0eXBlIDw8IEhJX09QVElPTl9GV19NT0RFX1NISUZUKTsKLQlpZiAoYXItPnAycCAmJiBmd19pZnR5cGUgPT0gSElfT1BUSU9OX0ZXX01PREVfQlNTX1NUQSkgewotCQlwYXJhbSB8PSBISV9PUFRJT05fRldfU1VCTU9ERV9QMlBERVYgPDwKLQkJCUhJX09QVElPTl9GV19TVUJNT0RFX1NISUZUOwotCX0KKwlwYXJhbSB8PSAoYXItPnZpZl9tYXggPDwgSElfT1BUSU9OX05VTV9ERVZfU0hJRlQpOworCXBhcmFtIHw9IGZ3X21vZGUgPDwgSElfT1BUSU9OX0ZXX01PREVfU0hJRlQ7CisJcGFyYW0gfD0gZndfc3VibW9kZSA8PCBISV9PUFRJT05fRldfU1VCTU9ERV9TSElGVDsKKwogCXBhcmFtIHw9ICgwIDw8IEhJX09QVElPTl9NQUNfQUREUl9NRVRIT0RfU0hJRlQpOwogCXBhcmFtIHw9ICgwIDw8IEhJX09QVElPTl9GV19CUklER0VfU0hJRlQpOwogCkBAIC01NTAsNzEgKzU1Miw1NSBAQAogCQkvKiB1c2UgZGVmYXVsdCBudW1iZXIgb2YgY29udHJvbCBidWZmZXJzICovCiAJCXJldHVybiAtRUlPOwogCisJLyogQ29uZmlndXJlIEdQSU8gQVI2MDB4IFVBUlQgKi8KKwlwYXJhbSA9IGFyLT5ody51YXJ0dHhfcGluOworCXN0YXR1cyA9IGF0aDZrbF9ibWlfd3JpdGUoYXIsCisJCQkJYXRoNmtsX2dldF9oaV9pdGVtX2FkZHIoYXIsCisJCQkJSElfSVRFTShoaV9kYmdfdWFydF90eHBpbikpLAorCQkJCSh1OCAqKSZwYXJhbSwgNCk7CisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIENvbmZpZ3VyZSB0YXJnZXQgcmVmY2xrX2h6ICovCisJcGFyYW0gPSAgYXItPmh3LnJlZmNsa19oejsKKwlzdGF0dXMgPSBhdGg2a2xfYm1pX3dyaXRlKGFyLAorCQkJCWF0aDZrbF9nZXRfaGlfaXRlbV9hZGRyKGFyLAorCQkJCUhJX0lURU0oaGlfcmVmY2xrX2h6KSksCisJCQkJKHU4ICopJnBhcmFtLCA0KTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0cnVjdCBhdGg2a2wgKmF0aDZrbF9jb3JlX2FsbG9jKHN0cnVjdCBkZXZpY2UgKnNkZXYpCit2b2lkIGF0aDZrbF9jb3JlX2ZyZWUoc3RydWN0IGF0aDZrbCAqYXIpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQlzdHJ1Y3QgYXRoNmtsICphcjsKLQlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2OwotCi0Jd2RldiA9IGF0aDZrbF9jZmc4MDIxMV9pbml0KHNkZXYpOwotCWlmICghd2RldikgewotCQlhdGg2a2xfZXJyKCJhdGg2a2xfY2ZnODAyMTFfaW5pdCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlhciA9IHdkZXZfcHJpdih3ZGV2KTsKLQlhci0+ZGV2ID0gc2RldjsKLQlhci0+d2RldiA9IHdkZXY7Ci0Jd2Rldi0+aWZ0eXBlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKLQotCWlmIChhdGg2a2xfZGVidWdfaW5pdChhcikpIHsKLQkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGluaXRpYWxpemUgZGVidWdmc1xuIik7Ci0JCWF0aDZrbF9jZmc4MDIxMV9kZWluaXQoYXIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0KLQlkZXYgPSBhbGxvY19uZXRkZXYoMCwgIndsYW4lZCIsIGV0aGVyX3NldHVwKTsKLQlpZiAoIWRldikgewotCQlhdGg2a2xfZXJyKCJubyBtZW1vcnkgZm9yIG5ldHdvcmsgZGV2aWNlIGluc3RhbmNlXG4iKTsKLQkJYXRoNmtsX2NmZzgwMjExX2RlaW5pdChhcik7Ci0JCXJldHVybiBOVUxMOwotCX0KLQotCWRldi0+aWVlZTgwMjExX3B0ciA9IHdkZXY7Ci0JU0VUX05FVERFVl9ERVYoZGV2LCB3aXBoeV9kZXYod2Rldi0+d2lwaHkpKTsKLQl3ZGV2LT5uZXRkZXYgPSBkZXY7Ci0JYXItPnNtZV9zdGF0ZSA9IFNNRV9ESVNDT05ORUNURUQ7Ci0KLQlpbml0X25ldGRldihkZXYpOwotCi0JYXItPm5ldF9kZXYgPSBkZXY7Ci0Jc2V0X2JpdChXTEFOX0VOQUJMRUQsICZhci0+ZmxhZyk7Ci0KLQlhci0+d2xhbl9wd3Jfc3RhdGUgPSBXTEFOX1BPV0VSX1NUQVRFX09OOwotCi0Jc3Bpbl9sb2NrX2luaXQoJmFyLT5sb2NrKTsKLQotCWF0aDZrbF9pbml0X2NvbnRyb2xfaW5mbyhhcik7Ci0JaW5pdF93YWl0cXVldWVfaGVhZCgmYXItPmV2ZW50X3dxKTsKLQlzZW1hX2luaXQoJmFyLT5zZW0sIDEpOwotCWNsZWFyX2JpdChERVNUUk9ZX0lOX1BST0dSRVNTLCAmYXItPmZsYWcpOwotCi0JSU5JVF9MSVNUX0hFQUQoJmFyLT5hbXNkdV9yeF9idWZmZXJfcXVldWUpOwotCi0Jc2V0dXBfdGltZXIoJmFyLT5kaXNjb25uZWN0X3RpbWVyLCBkaXNjb25uZWN0X3RpbWVyX2hhbmRsZXIsCi0JCSAgICAodW5zaWduZWQgbG9uZykgZGV2KTsKLQotCXJldHVybiBhcjsKKwl3aXBoeV9mcmVlKGFyLT53aXBoeSk7CiB9CiAKLWludCBhdGg2a2xfdW5hdmFpbF9ldihzdHJ1Y3QgYXRoNmtsICphcikKK3ZvaWQgYXRoNmtsX2NvcmVfY2xlYW51cChzdHJ1Y3QgYXRoNmtsICphcikKIHsKLQlhdGg2a2xfZGVzdHJveShhci0+bmV0X2RldiwgMSk7CisJYXRoNmtsX2hpZl9wb3dlcl9vZmYoYXIpOwogCi0JcmV0dXJuIDA7CisJZGVzdHJveV93b3JrcXVldWUoYXItPmF0aDZrbF93cSk7CisKKwlpZiAoYXItPmh0Y190YXJnZXQpCisJCWF0aDZrbF9odGNfY2xlYW51cChhci0+aHRjX3RhcmdldCk7CisKKwlhdGg2a2xfY29va2llX2NsZWFudXAoYXIpOworCisJYXRoNmtsX2NsZWFudXBfYW1zZHVfcnhidWZzKGFyKTsKKworCWF0aDZrbF9ibWlfY2xlYW51cChhcik7CisKKwlhdGg2a2xfZGVidWdfY2xlYW51cChhcik7CisKKwlrZnJlZShhci0+ZndfYm9hcmQpOworCWtmcmVlKGFyLT5md19vdHApOworCWtmcmVlKGFyLT5mdyk7CisJa2ZyZWUoYXItPmZ3X3BhdGNoKTsKKworCWF0aDZrbF9kZWluaXRfaWVlZTgwMjExX2h3KGFyKTsKIH0KIAogLyogZmlybXdhcmUgdXBsb2FkICovCkBAIC02NDMsMTEgKzYyOSwxMSBAQAogc3RhdGljIGNvbnN0IGNoYXIgKmdldF90YXJnZXRfdmVyX2Rpcihjb25zdCBzdHJ1Y3QgYXRoNmtsICphcikKIHsKIAlzd2l0Y2ggKGFyLT52ZXJzaW9uLnRhcmdldF92ZXIpIHsKLQljYXNlIEFSNjAwM19SRVYxX1ZFUlNJT046CisJY2FzZSBBUjYwMDNfSFdfMV8wX1ZFUlNJT046CiAJCXJldHVybiAiYXRoNmsvQVI2MDAzL2h3MS4wIjsKLQljYXNlIEFSNjAwM19SRVYyX1ZFUlNJT046CisJY2FzZSBBUjYwMDNfSFdfMl8wX1ZFUlNJT046CiAJCXJldHVybiAiYXRoNmsvQVI2MDAzL2h3Mi4wIjsKLQljYXNlIEFSNjAwM19SRVYzX1ZFUlNJT046CisJY2FzZSBBUjYwMDNfSFdfMl8xXzFfVkVSU0lPTjoKIAkJcmV0dXJuICJhdGg2ay9BUjYwMDMvaHcyLjEuMSI7CiAJfQogCWF0aDZrbF93YXJuKCIlczogdW5zdXBwb3J0ZWQgdGFyZ2V0IHZlcnNpb24gMHgleC5cbiIsIF9fZnVuY19fLApAQCAtNzA1LDE3ICs2OTEsMTAgQEAKIAlpZiAoYXItPmZ3X2JvYXJkICE9IE5VTEwpCiAJCXJldHVybiAwOwogCi0Jc3dpdGNoIChhci0+dmVyc2lvbi50YXJnZXRfdmVyKSB7Ci0JY2FzZSBBUjYwMDNfUkVWMl9WRVJTSU9OOgotCQlmaWxlbmFtZSA9IEFSNjAwM19SRVYyX0JPQVJEX0RBVEFfRklMRTsKLQkJYnJlYWs7Ci0JY2FzZSBBUjYwMDRfUkVWMV9WRVJTSU9OOgotCQlmaWxlbmFtZSA9IEFSNjAwNF9SRVYxX0JPQVJEX0RBVEFfRklMRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWM19CT0FSRF9EQVRBX0ZJTEU7Ci0JCWJyZWFrOwotCX0KKwlpZiAoV0FSTl9PTihhci0+aHcuZndfYm9hcmQgPT0gTlVMTCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZmlsZW5hbWUgPSBhci0+aHcuZndfYm9hcmQ7CiAKIAlyZXQgPSBhdGg2a2xfZ2V0X2Z3KGFyLCBmaWxlbmFtZSwgJmFyLT5md19ib2FyZCwKIAkJCSAgICAmYXItPmZ3X2JvYXJkX2xlbik7CkBAIC03MzMsMTcgKzcxMiw3IEBACiAJYXRoNmtsX3dhcm4oIkZhaWxlZCB0byBnZXQgYm9hcmQgZmlsZSAlcyAoJWQpLCB0cnlpbmcgdG8gZmluZCBkZWZhdWx0IGJvYXJkIGZpbGUuXG4iLAogCQkgICAgZmlsZW5hbWUsIHJldCk7CiAKLQlzd2l0Y2ggKGFyLT52ZXJzaW9uLnRhcmdldF92ZXIpIHsKLQljYXNlIEFSNjAwM19SRVYyX1ZFUlNJT046Ci0JCWZpbGVuYW1lID0gQVI2MDAzX1JFVjJfREVGQVVMVF9CT0FSRF9EQVRBX0ZJTEU7Ci0JCWJyZWFrOwotCWNhc2UgQVI2MDA0X1JFVjFfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDRfUkVWMV9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWM19ERUZBVUxUX0JPQVJEX0RBVEFfRklMRTsKLQkJYnJlYWs7Ci0JfQorCWZpbGVuYW1lID0gYXItPmh3LmZ3X2RlZmF1bHRfYm9hcmQ7CiAKIAlyZXQgPSBhdGg2a2xfZ2V0X2Z3KGFyLCBmaWxlbmFtZSwgJmFyLT5md19ib2FyZCwKIAkJCSAgICAmYXItPmZ3X2JvYXJkX2xlbik7CkBAIC03NjcsMTkgKzczNiwxNCBAQAogCWlmIChhci0+Zndfb3RwICE9IE5VTEwpCiAJCXJldHVybiAwOwogCi0Jc3dpdGNoIChhci0+dmVyc2lvbi50YXJnZXRfdmVyKSB7Ci0JY2FzZSBBUjYwMDNfUkVWMl9WRVJTSU9OOgotCQlmaWxlbmFtZSA9IEFSNjAwM19SRVYyX09UUF9GSUxFOwotCQlicmVhazsKLQljYXNlIEFSNjAwNF9SRVYxX1ZFUlNJT046Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICJBUjYwMDQgZG9lc24ndCBuZWVkIE9UUCBmaWxlXG4iKTsKKwlpZiAoYXItPmh3LmZ3X290cCA9PSBOVUxMKSB7CisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkJICAgIm5vIE9UUCBmaWxlIGNvbmZpZ3VyZWQgZm9yIHRoaXMgaHdcbiIpOwogCQlyZXR1cm4gMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWM19PVFBfRklMRTsKLQkJYnJlYWs7CiAJfQogCisJZmlsZW5hbWUgPSBhci0+aHcuZndfb3RwOworCiAJcmV0ID0gYXRoNmtsX2dldF9mdyhhciwgZmlsZW5hbWUsICZhci0+Zndfb3RwLAogCQkJICAgICZhci0+Zndfb3RwX2xlbik7CiAJaWYgKHJldCkgewpAQCAtODAwLDM4ICs3NjQsMjIgQEAKIAkJcmV0dXJuIDA7CiAKIAlpZiAodGVzdG1vZGUpIHsKLQkJc3dpdGNoIChhci0+dmVyc2lvbi50YXJnZXRfdmVyKSB7Ci0JCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJCWZpbGVuYW1lID0gQVI2MDAzX1JFVjJfVENNRF9GSVJNV0FSRV9GSUxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVI2MDAzX1JFVjNfVkVSU0lPTjoKLQkJCWZpbGVuYW1lID0gQVI2MDAzX1JFVjNfVENNRF9GSVJNV0FSRV9GSUxFOwotCQkJYnJlYWs7Ci0JCWNhc2UgQVI2MDA0X1JFVjFfVkVSU0lPTjoKLQkJCWF0aDZrbF93YXJuKCJ0ZXN0bW9kZSBub3Qgc3VwcG9ydGVkIHdpdGggYXI2MDA0XG4iKTsKKwkJaWYgKGFyLT5ody5md190Y21kID09IE5VTEwpIHsKKwkJCWF0aDZrbF93YXJuKCJ0ZXN0bW9kZSBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKLQkJZGVmYXVsdDoKLQkJCWF0aDZrbF93YXJuKCJ1bmtub3duIHRhcmdldCB2ZXJzaW9uOiAweCV4XG4iLAotCQkJCSAgICAgICBhci0+dmVyc2lvbi50YXJnZXRfdmVyKTsKLQkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAKKwkJZmlsZW5hbWUgPSBhci0+aHcuZndfdGNtZDsKKwogCQlzZXRfYml0KFRFU1RNT0RFLCAmYXItPmZsYWcpOwogCiAJCWdvdG8gZ2V0X2Z3OwogCX0KIAotCXN3aXRjaCAoYXItPnZlcnNpb24udGFyZ2V0X3ZlcikgewotCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWMl9GSVJNV0FSRV9GSUxFOwotCQlicmVhazsKLQljYXNlIEFSNjAwNF9SRVYxX1ZFUlNJT046Ci0JCWZpbGVuYW1lID0gQVI2MDA0X1JFVjFfRklSTVdBUkVfRklMRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWM19GSVJNV0FSRV9GSUxFOwotCQlicmVhazsKLQl9CisJaWYgKFdBUk5fT04oYXItPmh3LmZ3ID09IE5VTEwpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpbGVuYW1lID0gYXItPmh3LmZ3OwogCiBnZXRfZnc6CiAJcmV0ID0gYXRoNmtsX2dldF9mdyhhciwgZmlsZW5hbWUsICZhci0+ZncsICZhci0+ZndfbGVuKTsKQEAgLTg0OSwyNyArNzk3LDIwIEBACiAJY29uc3QgY2hhciAqZmlsZW5hbWU7CiAJaW50IHJldDsKIAotCXN3aXRjaCAoYXItPnZlcnNpb24udGFyZ2V0X3ZlcikgewotCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWMl9QQVRDSF9GSUxFOwotCQlicmVhazsKLQljYXNlIEFSNjAwNF9SRVYxX1ZFUlNJT046Ci0JCS8qIEZJWE1FOiBpbXBsZW1lbnQgZm9yIEFSNjAwNCAqLworCWlmIChhci0+ZndfcGF0Y2ggIT0gTlVMTCkKIAkJcmV0dXJuIDA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZpbGVuYW1lID0gQVI2MDAzX1JFVjNfUEFUQ0hfRklMRTsKLQkJYnJlYWs7Ci0JfQogCi0JaWYgKGFyLT5md19wYXRjaCA9PSBOVUxMKSB7Ci0JCXJldCA9IGF0aDZrbF9nZXRfZncoYXIsIGZpbGVuYW1lLCAmYXItPmZ3X3BhdGNoLAotCQkJCSAgICAmYXItPmZ3X3BhdGNoX2xlbik7Ci0JCWlmIChyZXQpIHsKLQkJCWF0aDZrbF9lcnIoIkZhaWxlZCB0byBnZXQgcGF0Y2ggZmlsZSAlczogJWRcbiIsCi0JCQkJICAgZmlsZW5hbWUsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9CisJaWYgKGFyLT5ody5md19wYXRjaCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWZpbGVuYW1lID0gYXItPmh3LmZ3X3BhdGNoOworCisJcmV0ID0gYXRoNmtsX2dldF9mdyhhciwgZmlsZW5hbWUsICZhci0+ZndfcGF0Y2gsCisJCQkgICAgJmFyLT5md19wYXRjaF9sZW4pOworCWlmIChyZXQpIHsKKwkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGdldCBwYXRjaCBmaWxlICVzOiAlZFxuIiwKKwkJCSAgIGZpbGVuYW1lLCByZXQpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCXJldHVybiAwOwpAQCAtOTA0LDE5ICs4NDUsMTAgQEAKIAlpbnQgcmV0LCBpZV9pZCwgaSwgaW5kZXgsIGJpdDsKIAlfX2xlMzIgKnZhbDsKIAotCXN3aXRjaCAoYXItPnZlcnNpb24udGFyZ2V0X3ZlcikgewotCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWMl9GSVJNV0FSRV8yX0ZJTEU7Ci0JCWJyZWFrOwotCWNhc2UgQVI2MDAzX1JFVjNfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDNfUkVWM19GSVJNV0FSRV8yX0ZJTEU7Ci0JCWJyZWFrOwotCWNhc2UgQVI2MDA0X1JFVjFfVkVSU0lPTjoKLQkJZmlsZW5hbWUgPSBBUjYwMDRfUkVWMV9GSVJNV0FSRV8yX0ZJTEU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6CisJaWYgKGFyLT5ody5md19hcGkyID09IE5VTEwpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9CisKKwlmaWxlbmFtZSA9IGFyLT5ody5md19hcGkyOwogCiAJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZpbGVuYW1lLCBhci0+ZGV2KTsKIAlpZiAocmV0KQpAQCAtMTAwNiwxMiArOTM4LDE1IEBACiAJCQkJICAgYXItPmh3LnJlc2VydmVkX3JhbV9zaXplKTsKIAkJCWJyZWFrOwogCQljYXNlIEFUSDZLTF9GV19JRV9DQVBBQklMSVRJRVM6CisJCQlpZiAoaWVfbGVuIDwgRElWX1JPVU5EX1VQKEFUSDZLTF9GV19DQVBBQklMSVRZX01BWCwgOCkpCisJCQkJYnJlYWs7CisKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAogCQkJCSAgICJmb3VuZCBmaXJtd2FyZSBjYXBhYmlsaXRpZXMgaWUgKCV6ZCBCKVxuIiwKIAkJCQkgICBpZV9sZW4pOwogCiAJCQlmb3IgKGkgPSAwOyBpIDwgQVRINktMX0ZXX0NBUEFCSUxJVFlfTUFYOyBpKyspIHsKLQkJCQlpbmRleCA9IEFMSUdOKGksIDgpIC8gODsKKwkJCQlpbmRleCA9IGkgLyA4OwogCQkJCWJpdCA9IGkgJSA4OwogCiAJCQkJaWYgKGRhdGFbaW5kZXhdICYgKDEgPDwgYml0KSkKQEAgLTEwMzAsOSArOTY1LDM0IEBACiAJCQlhci0+aHcuZGF0YXNldF9wYXRjaF9hZGRyID0gbGUzMl90b19jcHVwKHZhbCk7CiAKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAotCQkJCSAgICJmb3VuZCBwYXRjaCBhZGRyZXNzIGllIDB4JWRcbiIsCisJCQkJICAgImZvdW5kIHBhdGNoIGFkZHJlc3MgaWUgMHgleFxuIiwKIAkJCQkgICBhci0+aHcuZGF0YXNldF9wYXRjaF9hZGRyKTsKIAkJCWJyZWFrOworCQljYXNlIEFUSDZLTF9GV19JRV9CT0FSRF9BRERSOgorCQkJaWYgKGllX2xlbiAhPSBzaXplb2YoKnZhbCkpCisJCQkJYnJlYWs7CisKKwkJCXZhbCA9IChfX2xlMzIgKikgZGF0YTsKKwkJCWFyLT5ody5ib2FyZF9hZGRyID0gbGUzMl90b19jcHVwKHZhbCk7CisKKwkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkJCSAgICJmb3VuZCBib2FyZCBhZGRyZXNzIGllIDB4JXhcbiIsCisJCQkJICAgYXItPmh3LmJvYXJkX2FkZHIpOworCQkJYnJlYWs7CisJCWNhc2UgQVRINktMX0ZXX0lFX1ZJRl9NQVg6CisJCQlpZiAoaWVfbGVuICE9IHNpemVvZigqdmFsKSkKKwkJCQlicmVhazsKKworCQkJdmFsID0gKF9fbGUzMiAqKSBkYXRhOworCQkJYXItPnZpZl9tYXggPSBtaW5fdCh1bnNpZ25lZCBpbnQsIGxlMzJfdG9fY3B1cCh2YWwpLAorCQkJCQkgICAgQVRINktMX1ZJRl9NQVgpOworCisJCQlpZiAoYXItPnZpZl9tYXggPiAxICYmICFhci0+cDJwKQorCQkJCWFyLT5tYXhfbm9ybV9pZmFjZSA9IDI7CisKKwkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkJCSAgICJmb3VuZCB2aWYgbWF4IGllICVkXG4iLCBhci0+dmlmX21heCk7CisJCQlicmVhazsKIAkJZGVmYXVsdDoKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiVW5rbm93biBmdyBpZTogJXVcbiIsCiAJCQkJICAgbGUzMl90b19jcHVwKCZoZHItPmlkKSk7CkBAIC0xMDg3LDggKzEwNDcsOCBAQAogCSAqIEZvciBBUjYwMDQsIGhvc3QgZGV0ZXJtaW5lIFRhcmdldCBSQU0gYWRkcmVzcyBmb3IKIAkgKiB3cml0aW5nIGJvYXJkIGRhdGEuCiAJICovCi0JaWYgKGFyLT50YXJnZXRfdHlwZSA9PSBUQVJHRVRfVFlQRV9BUjYwMDQpIHsKLQkJYm9hcmRfYWRkcmVzcyA9IEFSNjAwNF9SRVYxX0JPQVJEX0RBVEFfQUREUkVTUzsKKwlpZiAoYXItPmh3LmJvYXJkX2FkZHIgIT0gMCkgeworCQlib2FyZF9hZGRyZXNzID0gYXItPmh3LmJvYXJkX2FkZHI7CiAJCWF0aDZrbF9ibWlfd3JpdGUoYXIsCiAJCQkJYXRoNmtsX2dldF9oaV9pdGVtX2FkZHIoYXIsCiAJCQkJSElfSVRFTShoaV9ib2FyZF9kYXRhKSksCkBAIC0xMTA2LDcgKzEwNjYsOCBAQAogCQkJSElfSVRFTShoaV9ib2FyZF9leHRfZGF0YSkpLAogCQkJKHU4ICopICZib2FyZF9leHRfYWRkcmVzcywgNCk7CiAKLQlpZiAoYm9hcmRfZXh0X2FkZHJlc3MgPT0gMCkgeworCWlmIChhci0+dGFyZ2V0X3R5cGUgPT0gVEFSR0VUX1RZUEVfQVI2MDAzICYmCisJICAgIGJvYXJkX2V4dF9hZGRyZXNzID09IDApIHsKIAkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGdldCBib2FyZCBmaWxlIHRhcmdldCBhZGRyZXNzLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTExMjYsOCArMTA4Nyw4IEBACiAJCWJyZWFrOwogCX0KIAotCWlmIChhci0+ZndfYm9hcmRfbGVuID09IChib2FyZF9kYXRhX3NpemUgKwotCQkJCSBib2FyZF9leHRfZGF0YV9zaXplKSkgeworCWlmIChib2FyZF9leHRfYWRkcmVzcyAmJgorCSAgICBhci0+ZndfYm9hcmRfbGVuID09IChib2FyZF9kYXRhX3NpemUgKyBib2FyZF9leHRfZGF0YV9zaXplKSkgewogCiAJCS8qIHdyaXRlIGV4dGVuZGVkIGJvYXJkIGRhdGEgKi8KIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCkBAIC0xMTgyLDEwICsxMTQzLDExIEBACiBzdGF0aWMgaW50IGF0aDZrbF91cGxvYWRfb3RwKHN0cnVjdCBhdGg2a2wgKmFyKQogewogCXUzMiBhZGRyZXNzLCBwYXJhbTsKKwlib29sIGZyb21faHcgPSBmYWxzZTsKIAlpbnQgcmV0OwogCi0JaWYgKFdBUk5fT04oYXItPmZ3X290cCA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FTk9FTlQ7CisJaWYgKGFyLT5md19vdHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAKIAlhZGRyZXNzID0gYXItPmh3LmFwcF9sb2FkX2FkZHI7CiAKQEAgLTEyMTAsMTUgKzExNzIsMjAgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIgPSBhZGRyZXNzOworCWlmIChhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIgPT0gMCkgeworCQlhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIgPSBhZGRyZXNzOworCQlmcm9tX2h3ID0gdHJ1ZTsKKwl9CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImFwcF9zdGFydF9vdmVycmlkZV9hZGRyIDB4JXhcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsICJhcHBfc3RhcnRfb3ZlcnJpZGVfYWRkciVzIDB4JXhcbiIsCisJCSAgIGZyb21faHcgPyAiIChmcm9tIGh3KSIgOiAiIiwKIAkJICAgYXItPmh3LmFwcF9zdGFydF9vdmVycmlkZV9hZGRyKTsKIAogCS8qIGV4ZWN1dGUgdGhlIE9UUCBjb2RlICovCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsICJleGVjdXRpbmcgT1RQIGF0IDB4JXhcbiIsIGFkZHJlc3MpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiZXhlY3V0aW5nIE9UUCBhdCAweCV4XG4iLAorCQkgICBhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIpOwogCXBhcmFtID0gMDsKLQlhdGg2a2xfYm1pX2V4ZWN1dGUoYXIsIGFkZHJlc3MsICZwYXJhbSk7CisJYXRoNmtsX2JtaV9leGVjdXRlKGFyLCBhci0+aHcuYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIsICZwYXJhbSk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTIyOSw3ICsxMTk2LDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKFdBUk5fT04oYXItPmZ3ID09IE5VTEwpKQotCQlyZXR1cm4gLUVOT0VOVDsKKwkJcmV0dXJuIDA7CiAKIAlhZGRyZXNzID0gYXItPmh3LmFwcF9sb2FkX2FkZHI7CiAKQEAgLTEyNTksOCArMTIyNiw4IEBACiAJdTMyIGFkZHJlc3MsIHBhcmFtOwogCWludCByZXQ7CiAKLQlpZiAoV0FSTl9PTihhci0+ZndfcGF0Y2ggPT0gTlVMTCkpCi0JCXJldHVybiAtRU5PRU5UOworCWlmIChhci0+ZndfcGF0Y2ggPT0gTlVMTCkKKwkJcmV0dXJuIDA7CiAKIAlhZGRyZXNzID0gYXItPmh3LmRhdGFzZXRfcGF0Y2hfYWRkcjsKIApAQCAtMTM0NSw3ICsxMzEyLDcgQEAKIAkJcmV0dXJuIHN0YXR1czsKIAogCS8qIFdBUiB0byBhdm9pZCBTRElPIENSQyBlcnIgKi8KLQlpZiAoYXItPnZlcnNpb24udGFyZ2V0X3ZlciA9PSBBUjYwMDNfUkVWMl9WRVJTSU9OKSB7CisJaWYgKGFyLT52ZXJzaW9uLnRhcmdldF92ZXIgPT0gQVI2MDAzX0hXXzJfMF9WRVJTSU9OKSB7CiAJCWF0aDZrbF9lcnIoInRlbXBvcmFyeSB3YXIgdG8gYXZvaWQgc2RpbyBjcmMgZXJyb3JcbiIpOwogCiAJCXBhcmFtID0gMHgyMDsKQEAgLTE0MDIsNDMgKzEzNjksMjkgQEAKIAlpZiAoc3RhdHVzKQogCQlyZXR1cm4gc3RhdHVzOwogCi0JLyogQ29uZmlndXJlIEdQSU8gQVI2MDAzIFVBUlQgKi8KLQlwYXJhbSA9IENPTkZJR19BUjYwMHhfREVCVUdfVUFSVF9UWF9QSU47Ci0Jc3RhdHVzID0gYXRoNmtsX2JtaV93cml0ZShhciwKLQkJCQkgIGF0aDZrbF9nZXRfaGlfaXRlbV9hZGRyKGFyLAotCQkJCSAgSElfSVRFTShoaV9kYmdfdWFydF90eHBpbikpLAotCQkJCSAgKHU4ICopJnBhcmFtLCA0KTsKLQogCXJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX2luaXRfaHdfcGFyYW1zKHN0cnVjdCBhdGg2a2wgKmFyKQogewotCXN3aXRjaCAoYXItPnZlcnNpb24udGFyZ2V0X3ZlcikgewotCWNhc2UgQVI2MDAzX1JFVjJfVkVSU0lPTjoKLQkJYXItPmh3LmRhdGFzZXRfcGF0Y2hfYWRkciA9IEFSNjAwM19SRVYyX0RBVEFTRVRfUEFUQ0hfQUREUkVTUzsKLQkJYXItPmh3LmFwcF9sb2FkX2FkZHIgPSBBUjYwMDNfUkVWMl9BUFBfTE9BRF9BRERSRVNTOwotCQlhci0+aHcuYm9hcmRfZXh0X2RhdGFfYWRkciA9IEFSNjAwM19SRVYyX0JPQVJEX0VYVF9EQVRBX0FERFJFU1M7Ci0JCWFyLT5ody5yZXNlcnZlZF9yYW1fc2l6ZSA9IEFSNjAwM19SRVYyX1JBTV9SRVNFUlZFX1NJWkU7Ci0JCWJyZWFrOwotCWNhc2UgQVI2MDAzX1JFVjNfVkVSU0lPTjoKLQkJYXItPmh3LmRhdGFzZXRfcGF0Y2hfYWRkciA9IEFSNjAwM19SRVYzX0RBVEFTRVRfUEFUQ0hfQUREUkVTUzsKLQkJYXItPmh3LmFwcF9sb2FkX2FkZHIgPSAweDEyMzQ7Ci0JCWFyLT5ody5ib2FyZF9leHRfZGF0YV9hZGRyID0gQVI2MDAzX1JFVjNfQk9BUkRfRVhUX0RBVEFfQUREUkVTUzsKLQkJYXItPmh3LnJlc2VydmVkX3JhbV9zaXplID0gQVI2MDAzX1JFVjNfUkFNX1JFU0VSVkVfU0laRTsKLQkJYnJlYWs7Ci0JY2FzZSBBUjYwMDRfUkVWMV9WRVJTSU9OOgotCQlhci0+aHcuZGF0YXNldF9wYXRjaF9hZGRyID0gQVI2MDAzX1JFVjJfREFUQVNFVF9QQVRDSF9BRERSRVNTOwotCQlhci0+aHcuYXBwX2xvYWRfYWRkciA9IEFSNjAwM19SRVYzX0FQUF9MT0FEX0FERFJFU1M7Ci0JCWFyLT5ody5ib2FyZF9leHRfZGF0YV9hZGRyID0gQVI2MDA0X1JFVjFfQk9BUkRfRVhUX0RBVEFfQUREUkVTUzsKLQkJYXItPmh3LnJlc2VydmVkX3JhbV9zaXplID0gQVI2MDA0X1JFVjFfUkFNX1JFU0VSVkVfU0laRTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKKwljb25zdCBzdHJ1Y3QgYXRoNmtsX2h3ICpodzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGh3X2xpc3QpOyBpKyspIHsKKwkJaHcgPSAmaHdfbGlzdFtpXTsKKworCQlpZiAoaHctPmlkID09IGFyLT52ZXJzaW9uLnRhcmdldF92ZXIpCisJCQlicmVhazsKKwl9CisKKwlpZiAoaSA9PSBBUlJBWV9TSVpFKGh3X2xpc3QpKSB7CiAJCWF0aDZrbF9lcnIoIlVuc3VwcG9ydGVkIGhhcmR3YXJlIHZlcnNpb246IDB4JXhcbiIsCiAJCQkgICBhci0+dmVyc2lvbi50YXJnZXRfdmVyKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJYXItPmh3ID0gKmh3OworCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCiAJCSAgICJ0YXJnZXRfdmVyIDB4JXggdGFyZ2V0X3R5cGUgMHgleCBkYXRhc2V0X3BhdGNoIDB4JXggYXBwX2xvYWRfYWRkciAweCV4XG4iLAogCQkgICBhci0+dmVyc2lvbi50YXJnZXRfdmVyLCBhci0+dGFyZ2V0X3R5cGUsCkBAIC0xNDQ3LDUxICsxNDAwLDI0NiBAQAogCQkgICAiYXBwX3N0YXJ0X292ZXJyaWRlX2FkZHIgMHgleCBib2FyZF9leHRfZGF0YV9hZGRyIDB4JXggcmVzZXJ2ZWRfcmFtX3NpemUgMHgleCIsCiAJCSAgIGFyLT5ody5hcHBfc3RhcnRfb3ZlcnJpZGVfYWRkciwgYXItPmh3LmJvYXJkX2V4dF9kYXRhX2FkZHIsCiAJCSAgIGFyLT5ody5yZXNlcnZlZF9yYW1fc2l6ZSk7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCisJCSAgICJyZWZjbGtfaHogJWQgdWFydHR4X3BpbiAlZCIsCisJCSAgIGFyLT5ody5yZWZjbGtfaHosIGFyLT5ody51YXJ0dHhfcGluKTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF9pbml0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCitzdGF0aWMgY29uc3QgY2hhciAqYXRoNmtsX2luaXRfZ2V0X2hpZl9uYW1lKGVudW0gYXRoNmtsX2hpZl90eXBlIHR5cGUpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOwotCWludCBzdGF0dXMgPSAwOwotCXMzMiB0aW1lbGVmdDsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIEFUSDZLTF9ISUZfVFlQRV9TRElPOgorCQlyZXR1cm4gInNkaW8iOworCWNhc2UgQVRINktMX0hJRl9UWVBFX1VTQjoKKwkJcmV0dXJuICJ1c2IiOworCX0KIAotCWlmICghYXIpCi0JCXJldHVybiAtRUlPOworCXJldHVybiBOVUxMOworfQorCitpbnQgYXRoNmtsX2luaXRfaHdfc3RhcnQoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJbG9uZyB0aW1lbGVmdDsKKwlpbnQgcmV0LCBpOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsICJodyBzdGFydFxuIik7CisKKwlyZXQgPSBhdGg2a2xfaGlmX3Bvd2VyX29uKGFyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0ID0gYXRoNmtsX2NvbmZpZ3VyZV90YXJnZXQoYXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKworCXJldCA9IGF0aDZrbF9pbml0X3VwbG9hZChhcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcG93ZXJfb2ZmOwogCiAJLyogRG8gd2UgbmVlZCB0byBmaW5pc2ggdGhlIEJNSSBwaGFzZSAqLworCS8qIEZJWE1FOiByZXR1cm4gZXJyb3IgZnJvbSBhdGg2a2xfYm1pX2RvbmUoKSAqLwogCWlmIChhdGg2a2xfYm1pX2RvbmUoYXIpKSB7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gYXRoNmtsX2luaXRfZG9uZTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfcG93ZXJfb2ZmOwogCX0KIAotCS8qIEluZGljYXRlIHRoYXQgV01JIGlzIGVuYWJsZWQgKGFsdGhvdWdoIG5vdCByZWFkeSB5ZXQpICovCi0Jc2V0X2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKTsKLQlhci0+d21pID0gYXRoNmtsX3dtaV9pbml0KGFyKTsKLQlpZiAoIWFyLT53bWkpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGluaXRpYWxpemUgd21pXG4iKTsKLQkJc3RhdHVzID0gLUVJTzsKLQkJZ290byBhdGg2a2xfaW5pdF9kb25lOwotCX0KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICIlczogZ290IHdtaSBAIDB4JXAuXG4iLCBfX2Z1bmNfXywgYXItPndtaSk7Ci0KIAkvKgogCSAqIFRoZSByZWFzb24gd2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgdGFyZ2V0IGhlcmUgaXMgdGhhdCB0aGUKIAkgKiBkcml2ZXIgbGF5ZXIgaGFzIHRvIGluaXQgQk1JIGluIG9yZGVyIHRvIHNldCB0aGUgaG9zdCBibG9jawogCSAqIHNpemUuCiAJICovCiAJaWYgKGF0aDZrbF9odGNfd2FpdF90YXJnZXQoYXItPmh0Y190YXJnZXQpKSB7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gZXJyX25vZGVfY2xlYW51cDsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfcG93ZXJfb2ZmOwogCX0KIAogCWlmIChhdGg2a2xfaW5pdF9zZXJ2aWNlX2VwKGFyKSkgewotCQlzdGF0dXMgPSAtRUlPOworCQlyZXQgPSAtRUlPOwogCQlnb3RvIGVycl9jbGVhbnVwX3NjYXR0ZXI7CiAJfQogCisJLyogc2V0dXAgY3JlZGl0IGRpc3RyaWJ1dGlvbiAqLworCWF0aDZrbF9jcmVkaXRfc2V0dXAoYXItPmh0Y190YXJnZXQsICZhci0+Y3JlZGl0X3N0YXRlX2luZm8pOworCisJLyogc3RhcnQgSFRDICovCisJcmV0ID0gYXRoNmtsX2h0Y19zdGFydChhci0+aHRjX3RhcmdldCk7CisJaWYgKHJldCkgeworCQkvKiBGSVhNRTogY2FsbCB0aGlzICovCisJCWF0aDZrbF9jb29raWVfY2xlYW51cChhcik7CisJCWdvdG8gZXJyX2NsZWFudXBfc2NhdHRlcjsKKwl9CisKKwkvKiBXYWl0IGZvciBXbWkgZXZlbnQgdG8gYmUgcmVhZHkgKi8KKwl0aW1lbGVmdCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KGFyLT5ldmVudF93cSwKKwkJCQkJCSAgICB0ZXN0X2JpdChXTUlfUkVBRFksCisJCQkJCQkJICAgICAmYXItPmZsYWcpLAorCQkJCQkJICAgIFdNSV9USU1FT1VUKTsKKworCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiZmlybXdhcmUgYm9vdGVkXG4iKTsKKworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChGSVJTVF9CT09ULCAmYXItPmZsYWcpKSB7CisJCWF0aDZrbF9pbmZvKCIlcyAlcyBmdyAlcyVzXG4iLAorCQkJICAgIGFyLT5ody5uYW1lLAorCQkJICAgIGF0aDZrbF9pbml0X2dldF9oaWZfbmFtZShhci0+aGlmX3R5cGUpLAorCQkJICAgIGFyLT53aXBoeS0+ZndfdmVyc2lvbiwKKwkJCSAgICB0ZXN0X2JpdChURVNUTU9ERSwgJmFyLT5mbGFnKSA/ICIgdGVzdG1vZGUiIDogIiIpOworCX0KKworCWlmIChhci0+dmVyc2lvbi5hYmlfdmVyICE9IEFUSDZLTF9BQklfVkVSU0lPTikgeworCQlhdGg2a2xfZXJyKCJhYmkgdmVyc2lvbiBtaXNtYXRjaDogaG9zdCgweCV4KSwgdGFyZ2V0KDB4JXgpXG4iLAorCQkJICAgQVRINktMX0FCSV9WRVJTSU9OLCBhci0+dmVyc2lvbi5hYmlfdmVyKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfaHRjX3N0b3A7CisJfQorCisJaWYgKCF0aW1lbGVmdCB8fCBzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQlhdGg2a2xfZXJyKCJ3bWkgaXMgbm90IHJlYWR5IG9yIHdhaXQgd2FzIGludGVycnVwdGVkXG4iKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfaHRjX3N0b3A7CisJfQorCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgIiVzOiB3bWkgaXMgcmVhZHlcbiIsIF9fZnVuY19fKTsKKworCS8qIGNvbW11bmljYXRlIHRoZSB3bWkgcHJvdG9jb2wgdmVyaXNpb24gdG8gdGhlIHRhcmdldCAqLworCS8qIEZJWE1FOiByZXR1cm4gZXJyb3IgKi8KKwlpZiAoKGF0aDZrbF9zZXRfaG9zdF9hcHBfYXJlYShhcikpICE9IDApCisJCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQgdGhlIGhvc3QgYXBwIGFyZWFcbiIpOworCisJZm9yIChpID0gMDsgaSA8IGFyLT52aWZfbWF4OyBpKyspIHsKKwkJcmV0ID0gYXRoNmtsX3RhcmdldF9jb25maWdfd2xhbl9wYXJhbXMoYXIsIGkpOworCQlpZiAocmV0KQorCQkJZ290byBlcnJfaHRjX3N0b3A7CisJfQorCisJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX09OOworCisJcmV0dXJuIDA7CisKK2Vycl9odGNfc3RvcDoKKwlhdGg2a2xfaHRjX3N0b3AoYXItPmh0Y190YXJnZXQpOworZXJyX2NsZWFudXBfc2NhdHRlcjoKKwlhdGg2a2xfaGlmX2NsZWFudXBfc2NhdHRlcihhcik7CitlcnJfcG93ZXJfb2ZmOgorCWF0aDZrbF9oaWZfcG93ZXJfb2ZmKGFyKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhdGg2a2xfaW5pdF9od19zdG9wKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCWludCByZXQ7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImh3IHN0b3BcbiIpOworCisJYXRoNmtsX2h0Y19zdG9wKGFyLT5odGNfdGFyZ2V0KTsKKworCWF0aDZrbF9oaWZfc3RvcChhcik7CisKKwlhdGg2a2xfYm1pX3Jlc2V0KGFyKTsKKworCXJldCA9IGF0aDZrbF9oaWZfcG93ZXJfb2ZmKGFyKTsKKwlpZiAocmV0KQorCQlhdGg2a2xfd2FybigiZmFpbGVkIHRvIHBvd2VyIG9mZiBoaWY6ICVkXG4iLCByZXQpOworCisJYXItPnN0YXRlID0gQVRINktMX1NUQVRFX09GRjsKKworCXJldHVybiAwOworfQorCitpbnQgYXRoNmtsX2NvcmVfaW5pdChzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwlzdHJ1Y3QgYXRoNmtsX2JtaV90YXJnZXRfaW5mbyB0YXJnX2luZm87CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJaW50IHJldCA9IDAsIGk7CisKKwlhci0+YXRoNmtsX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImF0aDZrbCIpOworCWlmICghYXItPmF0aDZrbF93cSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBhdGg2a2xfYm1pX2luaXQoYXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3dxOworCisJLyoKKwkgKiBUdXJuIG9uIHBvd2VyIHRvIGdldCBoYXJkd2FyZSAodGFyZ2V0KSB2ZXJzaW9uIGFuZCBsZWF2ZSBwb3dlcgorCSAqIG9uIGRlbGlicmF0ZWx5IGFzIHdlIHdpbGwgYm9vdCB0aGUgaGFyZHdhcmUgYW55d2F5IHdpdGhpbiBmZXcKKwkgKiBzZWNvbmRzLgorCSAqLworCXJldCA9IGF0aDZrbF9oaWZfcG93ZXJfb24oYXIpOworCWlmIChyZXQpCisJCWdvdG8gZXJyX2JtaV9jbGVhbnVwOworCisJcmV0ID0gYXRoNmtsX2JtaV9nZXRfdGFyZ2V0X2luZm8oYXIsICZ0YXJnX2luZm8pOworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKworCWFyLT52ZXJzaW9uLnRhcmdldF92ZXIgPSBsZTMyX3RvX2NwdSh0YXJnX2luZm8udmVyc2lvbik7CisJYXItPnRhcmdldF90eXBlID0gbGUzMl90b19jcHUodGFyZ19pbmZvLnR5cGUpOworCWFyLT53aXBoeS0+aHdfdmVyc2lvbiA9IGxlMzJfdG9fY3B1KHRhcmdfaW5mby52ZXJzaW9uKTsKKworCXJldCA9IGF0aDZrbF9pbml0X2h3X3BhcmFtcyhhcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfcG93ZXJfb2ZmOworCisJYXItPmh0Y190YXJnZXQgPSBhdGg2a2xfaHRjX2NyZWF0ZShhcik7CisKKwlpZiAoIWFyLT5odGNfdGFyZ2V0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3Bvd2VyX29mZjsKKwl9CisKKwlyZXQgPSBhdGg2a2xfZmV0Y2hfZmlybXdhcmVzKGFyKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycl9odGNfY2xlYW51cDsKKworCS8qIEZJWE1FOiB3ZSBzaG91bGQgZnJlZSBhbGwgZmlybXdhcmVzIGluIHRoZSBlcnJvciBjYXNlcyBiZWxvdyAqLworCisJLyogSW5kaWNhdGUgdGhhdCBXTUkgaXMgZW5hYmxlZCAoYWx0aG91Z2ggbm90IHJlYWR5IHlldCkgKi8KKwlzZXRfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpOworCWFyLT53bWkgPSBhdGg2a2xfd21pX2luaXQoYXIpOworCWlmICghYXItPndtaSkgeworCQlhdGg2a2xfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSB3bWlcbiIpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGVycl9odGNfY2xlYW51cDsKKwl9CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiJXM6IGdvdCB3bWkgQCAweCVwLlxuIiwgX19mdW5jX18sIGFyLT53bWkpOworCisJcmV0ID0gYXRoNmtsX3JlZ2lzdGVyX2llZWU4MDIxMV9odyhhcik7CisJaWYgKHJldCkKKwkJZ290byBlcnJfbm9kZV9jbGVhbnVwOworCisJcmV0ID0gYXRoNmtsX2RlYnVnX2luaXQoYXIpOworCWlmIChyZXQpIHsKKwkJd2lwaHlfdW5yZWdpc3Rlcihhci0+d2lwaHkpOworCQlnb3RvIGVycl9ub2RlX2NsZWFudXA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGFyLT52aWZfbWF4OyBpKyspCisJCWFyLT5hdmFpbF9pZHhfbWFwIHw9IEJJVChpKTsKKworCXJ0bmxfbG9jaygpOworCisJLyogQWRkIGFuIGluaXRpYWwgc3RhdGlvbiBpbnRlcmZhY2UgKi8KKwluZGV2ID0gYXRoNmtsX2ludGVyZmFjZV9hZGQoYXIsICJ3bGFuJWQiLCBOTDgwMjExX0lGVFlQRV9TVEFUSU9OLCAwLAorCQkJCSAgICBJTkZSQV9ORVRXT1JLKTsKKworCXJ0bmxfdW5sb2NrKCk7CisKKwlpZiAoIW5kZXYpIHsKKwkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGEgbmV0d29yayBkZXZpY2VcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQl3aXBoeV91bnJlZ2lzdGVyKGFyLT53aXBoeSk7CisJCWdvdG8gZXJyX2RlYnVnX2luaXQ7CisJfQorCisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiJXM6IG5hbWU9JXMgZGV2PTB4JXAsIGFyPTB4JXBcbiIsCisJCQlfX2Z1bmNfXywgbmRldi0+bmFtZSwgbmRldiwgYXIpOworCiAJLyogc2V0dXAgYWNjZXNzIGNsYXNzIHByaW9yaXR5IG1hcHBpbmdzICovCiAJYXItPmFjX3N0cmVhbV9wcmlfbWFwW1dNTV9BQ19CS10gPSAwOyAvKiBsb3dlc3QgICovCiAJYXItPmFjX3N0cmVhbV9wcmlfbWFwW1dNTV9BQ19CRV0gPSAxOwpAQCAtMTUwNSwxNTYgKzE2NTMsMTAwIEBACiAJLyogYWxsb2NhdGUgc29tZSBidWZmZXJzIHRoYXQgaGFuZGxlIGxhcmdlciBBTVNEVSBmcmFtZXMgKi8KIAlhdGg2a2xfcmVmaWxsX2Ftc2R1X3J4YnVmcyhhciwgQVRINktMX01BWF9BTVNEVV9SWF9CVUZGRVJTKTsKIAotCS8qIHNldHVwIGNyZWRpdCBkaXN0cmlidXRpb24gKi8KLQlhdGg2a19zZXR1cF9jcmVkaXRfZGlzdChhci0+aHRjX3RhcmdldCwgJmFyLT5jcmVkaXRfc3RhdGVfaW5mbyk7Ci0KIAlhdGg2a2xfY29va2llX2luaXQoYXIpOwogCi0JLyogc3RhcnQgSFRDICovCi0Jc3RhdHVzID0gYXRoNmtsX2h0Y19zdGFydChhci0+aHRjX3RhcmdldCk7Ci0KLQlpZiAoc3RhdHVzKSB7Ci0JCWF0aDZrbF9jb29raWVfY2xlYW51cChhcik7Ci0JCWdvdG8gZXJyX3J4YnVmX2NsZWFudXA7Ci0JfQotCi0JLyogV2FpdCBmb3IgV21pIGV2ZW50IHRvIGJlIHJlYWR5ICovCi0JdGltZWxlZnQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChhci0+ZXZlbnRfd3EsCi0JCQkJCQkgICAgdGVzdF9iaXQoV01JX1JFQURZLAotCQkJCQkJCSAgICAgJmFyLT5mbGFnKSwKLQkJCQkJCSAgICBXTUlfVElNRU9VVCk7Ci0KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgImZpcm13YXJlIGJvb3RlZFxuIik7Ci0KLQlpZiAoYXItPnZlcnNpb24uYWJpX3ZlciAhPSBBVEg2S0xfQUJJX1ZFUlNJT04pIHsKLQkJYXRoNmtsX2VycigiYWJpIHZlcnNpb24gbWlzbWF0Y2g6IGhvc3QoMHgleCksIHRhcmdldCgweCV4KVxuIiwKLQkJCSAgIEFUSDZLTF9BQklfVkVSU0lPTiwgYXItPnZlcnNpb24uYWJpX3Zlcik7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gZXJyX2h0Y19zdG9wOwotCX0KLQotCWlmICghdGltZWxlZnQgfHwgc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKLQkJYXRoNmtsX2Vycigid21pIGlzIG5vdCByZWFkeSBvciB3YWl0IHdhcyBpbnRlcnJ1cHRlZFxuIik7Ci0JCXN0YXR1cyA9IC1FSU87Ci0JCWdvdG8gZXJyX2h0Y19zdG9wOwotCX0KLQotCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICIlczogd21pIGlzIHJlYWR5XG4iLCBfX2Z1bmNfXyk7Ci0KLQkvKiBjb21tdW5pY2F0ZSB0aGUgd21pIHByb3RvY29sIHZlcmlzaW9uIHRvIHRoZSB0YXJnZXQgKi8KLQlpZiAoKGF0aDZrbF9zZXRfaG9zdF9hcHBfYXJlYShhcikpICE9IDApCi0JCWF0aDZrbF9lcnIoInVuYWJsZSB0byBzZXQgdGhlIGhvc3QgYXBwIGFyZWFcbiIpOwotCiAJYXItPmNvbmZfZmxhZ3MgPSBBVEg2S0xfQ09ORl9JR05PUkVfRVJQX0JBUktFUiB8CiAJCQkgQVRINktMX0NPTkZfRU5BQkxFXzExTiB8IEFUSDZLTF9DT05GX0VOQUJMRV9UWF9CVVJTVDsKIAotCWFyLT53ZGV2LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19TVVBQT1JUU19GV19ST0FNOworCWlmIChzdXNwZW5kX2N1dHBvd2VyKQorCQlhci0+Y29uZl9mbGFncyB8PSBBVEg2S0xfQ09ORl9TVVNQRU5EX0NVVFBPV0VSOwogCi0Jc3RhdHVzID0gYXRoNmtsX3RhcmdldF9jb25maWdfd2xhbl9wYXJhbXMoYXIpOwotCWlmICghc3RhdHVzKQotCQlnb3RvIGF0aDZrbF9pbml0X2RvbmU7CisJYXItPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX1NVUFBPUlRTX0ZXX1JPQU0gfAorCQkJICAgIFdJUEhZX0ZMQUdfSEFWRV9BUF9TTUUgfAorCQkJICAgIFdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMIHwKKwkJCSAgICBXSVBIWV9GTEFHX0FQX1BST0JFX1JFU1BfT0ZGTE9BRDsKIAotZXJyX2h0Y19zdG9wOgotCWF0aDZrbF9odGNfc3RvcChhci0+aHRjX3RhcmdldCk7CisJaWYgKHRlc3RfYml0KEFUSDZLTF9GV19DQVBBQklMSVRZX1NDSEVEX1NDQU4sIGFyLT5md19jYXBhYmlsaXRpZXMpKQorCQlhci0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfU1VQUE9SVFNfU0NIRURfU0NBTjsKKworCWFyLT53aXBoeS0+cHJvYmVfcmVzcF9vZmZsb2FkID0KKwkJTkw4MDIxMV9QUk9CRV9SRVNQX09GRkxPQURfU1VQUE9SVF9XUFMgfAorCQlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1dQUzIgfAorCQlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1AyUCB8CisJCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfODAyMTFVOworCisJc2V0X2JpdChGSVJTVF9CT09ULCAmYXItPmZsYWcpOworCisJcmV0ID0gYXRoNmtsX2luaXRfaHdfc3RhcnQoYXIpOworCWlmIChyZXQpIHsKKwkJYXRoNmtsX2VycigiRmFpbGVkIHRvIHN0YXJ0IGhhcmR3YXJlOiAlZFxuIiwgcmV0KTsKKwkJZ290byBlcnJfcnhidWZfY2xlYW51cDsKKwl9CisKKwkvKgorCSAqIFNldCBtYWMgYWRkcmVzcyB3aGljaCBpcyByZWNlaXZlZCBpbiByZWFkeSBldmVudAorCSAqIEZJWE1FOiBNb3ZlIHRvIGF0aDZrbF9pbnRlcmZhY2VfYWRkKCkKKwkgKi8KKwltZW1jcHkobmRldi0+ZGV2X2FkZHIsIGFyLT5tYWNfYWRkciwgRVRIX0FMRU4pOworCisJcmV0dXJuIHJldDsKKwogZXJyX3J4YnVmX2NsZWFudXA6CiAJYXRoNmtsX2h0Y19mbHVzaF9yeF9idWYoYXItPmh0Y190YXJnZXQpOwogCWF0aDZrbF9jbGVhbnVwX2Ftc2R1X3J4YnVmcyhhcik7Ci1lcnJfY2xlYW51cF9zY2F0dGVyOgotCWF0aDZrbF9oaWZfY2xlYW51cF9zY2F0dGVyKGFyKTsKKwlydG5sX2xvY2soKTsKKwlhdGg2a2xfZGVpbml0X2lmX2RhdGEobmV0ZGV2X3ByaXYobmRldikpOworCXJ0bmxfdW5sb2NrKCk7CisJd2lwaHlfdW5yZWdpc3Rlcihhci0+d2lwaHkpOworZXJyX2RlYnVnX2luaXQ6CisJYXRoNmtsX2RlYnVnX2NsZWFudXAoYXIpOwogZXJyX25vZGVfY2xlYW51cDoKIAlhdGg2a2xfd21pX3NodXRkb3duKGFyLT53bWkpOwogCWNsZWFyX2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKTsKIAlhci0+d21pID0gTlVMTDsKLQotYXRoNmtsX2luaXRfZG9uZToKLQlyZXR1cm4gc3RhdHVzOwotfQotCi1pbnQgYXRoNmtsX2NvcmVfaW5pdChzdHJ1Y3QgYXRoNmtsICphcikKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3QgYXRoNmtsX2JtaV90YXJnZXRfaW5mbyB0YXJnX2luZm87Ci0KLQlhci0+YXRoNmtsX3dxID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImF0aDZrbCIpOwotCWlmICghYXItPmF0aDZrbF93cSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSBhdGg2a2xfYm1pX2luaXQoYXIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX3dxOwotCi0JcmV0ID0gYXRoNmtsX2JtaV9nZXRfdGFyZ2V0X2luZm8oYXIsICZ0YXJnX2luZm8pOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2JtaV9jbGVhbnVwOwotCi0JYXItPnZlcnNpb24udGFyZ2V0X3ZlciA9IGxlMzJfdG9fY3B1KHRhcmdfaW5mby52ZXJzaW9uKTsKLQlhci0+dGFyZ2V0X3R5cGUgPSBsZTMyX3RvX2NwdSh0YXJnX2luZm8udHlwZSk7Ci0JYXItPndkZXYtPndpcGh5LT5od192ZXJzaW9uID0gbGUzMl90b19jcHUodGFyZ19pbmZvLnZlcnNpb24pOwotCi0JcmV0ID0gYXRoNmtsX2luaXRfaHdfcGFyYW1zKGFyKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9ibWlfY2xlYW51cDsKLQotCXJldCA9IGF0aDZrbF9jb25maWd1cmVfdGFyZ2V0KGFyKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9ibWlfY2xlYW51cDsKLQotCWFyLT5odGNfdGFyZ2V0ID0gYXRoNmtsX2h0Y19jcmVhdGUoYXIpOwotCi0JaWYgKCFhci0+aHRjX3RhcmdldCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9ibWlfY2xlYW51cDsKLQl9Ci0KLQlhci0+YWdncl9jbnR4dCA9IGFnZ3JfaW5pdChhci0+bmV0X2Rldik7Ci0JaWYgKCFhci0+YWdncl9jbnR4dCkgewotCQlhdGg2a2xfZXJyKCJmYWlsZWQgdG8gaW5pdGlhbGl6ZSBhZ2dyXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfaHRjX2NsZWFudXA7Ci0JfQotCi0JcmV0ID0gYXRoNmtsX2ZldGNoX2Zpcm13YXJlcyhhcik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJfaHRjX2NsZWFudXA7Ci0KLQlyZXQgPSBhdGg2a2xfaW5pdF91cGxvYWQoYXIpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2h0Y19jbGVhbnVwOwotCi0JcmV0ID0gYXRoNmtsX2luaXQoYXItPm5ldF9kZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyX2h0Y19jbGVhbnVwOwotCi0JLyogVGhpcyBydW5zIHRoZSBpbml0IGZ1bmN0aW9uIGlmIHJlZ2lzdGVyZWQgKi8KLQlyZXQgPSByZWdpc3Rlcl9uZXRkZXYoYXItPm5ldF9kZXYpOwotCWlmIChyZXQpIHsKLQkJYXRoNmtsX2VycigicmVnaXN0ZXJfbmV0ZGV2IGZhaWxlZFxuIik7Ci0JCWF0aDZrbF9kZXN0cm95KGFyLT5uZXRfZGV2LCAwKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlzZXRfYml0KE5FVERFVl9SRUdJU1RFUkVELCAmYXItPmZsYWcpOwotCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywgIiVzOiBuYW1lPSVzIGRldj0weCVwLCBhcj0weCVwXG4iLAotCQkJX19mdW5jX18sIGFyLT5uZXRfZGV2LT5uYW1lLCBhci0+bmV0X2RldiwgYXIpOwotCi0JcmV0dXJuIHJldDsKLQogZXJyX2h0Y19jbGVhbnVwOgogCWF0aDZrbF9odGNfY2xlYW51cChhci0+aHRjX3RhcmdldCk7CitlcnJfcG93ZXJfb2ZmOgorCWF0aDZrbF9oaWZfcG93ZXJfb2ZmKGFyKTsKIGVycl9ibWlfY2xlYW51cDoKIAlhdGg2a2xfYm1pX2NsZWFudXAoYXIpOwogZXJyX3dxOgogCWRlc3Ryb3lfd29ya3F1ZXVlKGFyLT5hdGg2a2xfd3EpOworCiAJcmV0dXJuIHJldDsKIH0KIAordm9pZCBhdGg2a2xfY2xlYW51cF92aWYoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgYm9vbCB3bWlfcmVhZHkpCit7CisJc3RhdGljIHU4IGJjYXN0X21hY1tdID0gezB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZmZ9OworCWJvb2wgZGlzY29uX2lzc3VlZDsKKworCW5ldGlmX3N0b3BfcXVldWUodmlmLT5uZGV2KTsKKworCWNsZWFyX2JpdChXTEFOX0VOQUJMRUQsICZ2aWYtPmZsYWdzKTsKKworCWlmICh3bWlfcmVhZHkpIHsKKwkJZGlzY29uX2lzc3VlZCA9IHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpIHx8CisJCQkJdGVzdF9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CisJCWF0aDZrbF9kaXNjb25uZWN0KHZpZik7CisJCWRlbF90aW1lcigmdmlmLT5kaXNjb25uZWN0X3RpbWVyKTsKKworCQlpZiAoZGlzY29uX2lzc3VlZCkKKwkJCWF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHZpZiwgRElTQ09OTkVDVF9DTUQsCisJCQkJCQkodmlmLT5ud190eXBlICYgQVBfTkVUV09SSykgPworCQkJCQkJYmNhc3RfbWFjIDogdmlmLT5ic3NpZCwKKwkJCQkJCTAsIE5VTEwsIDApOworCX0KKworCWlmICh2aWYtPnNjYW5fcmVxKSB7CisJCWNmZzgwMjExX3NjYW5fZG9uZSh2aWYtPnNjYW5fcmVxLCB0cnVlKTsKKwkJdmlmLT5zY2FuX3JlcSA9IE5VTEw7CisJfQorfQorCiB2b2lkIGF0aDZrbF9zdG9wX3R4cngoc3RydWN0IGF0aDZrbCAqYXIpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYgPSBhci0+bmV0X2RldjsKLQotCWlmICghbmRldikKLQkJcmV0dXJuOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYsICp0bXBfdmlmOwogCiAJc2V0X2JpdChERVNUUk9ZX0lOX1BST0dSRVNTLCAmYXItPmZsYWcpOwogCkBAIC0xNjYzLDY1ICsxNzU1LDQ0IEBACiAJCXJldHVybjsKIAl9CiAKLQlpZiAoYXItPndsYW5fcHdyX3N0YXRlICE9IFdMQU5fUE9XRVJfU1RBVEVfQ1VUX1BXUikKLQkJYXRoNmtsX3N0b3BfZW5kcG9pbnQobmRldiwgZmFsc2UsIHRydWUpOworCXNwaW5fbG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHZpZiwgdG1wX3ZpZiwgJmFyLT52aWZfbGlzdCwgbGlzdCkgeworCQlsaXN0X2RlbCgmdmlmLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCQlhdGg2a2xfY2xlYW51cF92aWYodmlmLCB0ZXN0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZykpOworCQlydG5sX2xvY2soKTsKKwkJYXRoNmtsX2RlaW5pdF9pZl9kYXRhKHZpZik7CisJCXJ0bmxfdW5sb2NrKCk7CisJCXNwaW5fbG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisJfQorCXNwaW5fdW5sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKworCWNsZWFyX2JpdChXTUlfUkVBRFksICZhci0+ZmxhZyk7CisKKwkvKgorCSAqIEFmdGVyIHdtaV9zaHVkb3duIGFsbCBXTUkgZXZlbnRzIHdpbGwgYmUgZHJvcHBlZC4gV2UKKwkgKiBuZWVkIHRvIGNsZWFudXAgdGhlIGJ1ZmZlcnMgYWxsb2NhdGVkIGluIEFQIG1vZGUgYW5kCisJICogZ2l2ZSBkaXNjb25uZWN0IG5vdGlmaWNhdGlvbiB0byBzdGFjaywgd2hpY2ggdXN1YWxseQorCSAqIGhhcHBlbnMgaW4gdGhlIGRpc2Nvbm5lY3RfZXZlbnQuIFNpbXVsYXRlIHRoZSBkaXNjb25uZWN0CisJICogZXZlbnQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gZGlyZWN0bHkuIFNvbWV0aW1lcworCSAqIGRpc2Nvbm5lY3RfZXZlbnQgd2lsbCBiZSByZWNlaXZlZCB3aGVuIHRoZSBkZWJ1ZyBsb2dzCisJICogYXJlIGNvbGxlY3RlZC4KKwkgKi8KKwlhdGg2a2xfd21pX3NodXRkb3duKGFyLT53bWkpOworCisJY2xlYXJfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpOworCWlmIChhci0+aHRjX3RhcmdldCkgeworCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLCAiJXM6IHNodXQgZG93biBodGNcbiIsIF9fZnVuY19fKTsKKwkJYXRoNmtsX2h0Y19zdG9wKGFyLT5odGNfdGFyZ2V0KTsKKwl9CisKKwkvKgorCSAqIFRyeSB0byByZXNldCB0aGUgZGV2aWNlIGlmIHdlIGNhbi4gVGhlIGRyaXZlciBtYXkgaGF2ZSBiZWVuCisJICogY29uZmlndXJlIE5PVCB0byByZXNldCB0aGUgdGFyZ2V0IGR1cmluZyBhIGRlYnVnIHNlc3Npb24uCisJICovCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1RSQywKKwkJCSJhdHRlbXB0aW5nIHRvIHJlc2V0IHRhcmdldCBvbiBpbnN0YW5jZSBkZXN0cm95XG4iKTsKKwlhdGg2a2xfcmVzZXRfZGV2aWNlKGFyLCBhci0+dGFyZ2V0X3R5cGUsIHRydWUsIHRydWUpOwogCiAJY2xlYXJfYml0KFdMQU5fRU5BQkxFRCwgJmFyLT5mbGFnKTsKIH0KLQotLyoKLSAqIFdlIG5lZWQgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIHRoZSBzdXJwcmlzZSBhbmQgcGxhbm5lZCByZW1vdmFsIG9mIHRoZQotICogZGV2aWNlIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBjb25zaWRlcmF0aW9uOgotICoKLSAqIC0gSW4gY2FzZSBvZiBzdXJwcmlzZSByZW1vdmFsLCB0aGUgaGNkIGFscmVhZHkgZnJlZXMgdXAgdGhlIHBlbmRpbmcKLSAqICAgZm9yIHRoZSBkZXZpY2UgYW5kIGhlbmNlIHRoZXJlIGlzIG5vIG5lZWQgdG8gdW5yZWdpc3RlciB0aGUgZnVuY3Rpb24KLSAqICAgZHJpdmVyIGlub3JkZXIgdG8gZ2V0IHRoZXNlIHJlcXVlc3RzLiBGb3IgcGxhbm5lZCByZW1vdmFsLCB0aGUgZnVuY3Rpb24KLSAqICAgZHJpdmVyIGhhcyB0byBleHBsaWNpdGx5IHVucmVnaXN0ZXIgaXRzZWxmIHRvIGhhdmUgdGhlIGhjZCByZXR1cm4gYWxsIHRoZQotICogICBwZW5kaW5nIHJlcXVlc3RzIGJlZm9yZSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgZGV2aWNlcyBhcmUgZnJlZWQgdXAuCi0gKiAgIE5vdGUgdGhhdCBhcyBwZXIgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHRoZSBmdW5jdGlvbiBkcml2ZXIgd2lsbAotICogICBlbmQgdXAgcmVsZWFzaW5nIGFsbCB0aGUgZGV2aWNlcyBzaW5jZSB0aGVyZSBpcyBubyBBUEkgdG8gc2VsZWN0aXZlbHkKLSAqICAgcmVsZWFzZSBhIHBhcnRpY3VsYXIgZGV2aWNlLgotICoKLSAqIC0gQ2VydGFpbiBjb21tYW5kcyBpc3N1ZWQgdG8gdGhlIHRhcmdldCBjYW4gYmUgc2tpcHBlZCBmb3Igc3VycHJpc2UKLSAqICAgcmVtb3ZhbCBzaW5jZSB0aGV5IHdpbGwgYW55d2F5IG5vdCBnbyB0aHJvdWdoLgotICovCi12b2lkIGF0aDZrbF9kZXN0cm95KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCB1bnJlZ2lzdGVyKQotewotCXN0cnVjdCBhdGg2a2wgKmFyOwotCi0JaWYgKCFkZXYgfHwgIWF0aDZrbF9wcml2KGRldikpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIGdldCBkZXZpY2Ugc3RydWN0dXJlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWFyID0gYXRoNmtsX3ByaXYoZGV2KTsKLQotCWRlc3Ryb3lfd29ya3F1ZXVlKGFyLT5hdGg2a2xfd3EpOwotCi0JaWYgKGFyLT5odGNfdGFyZ2V0KQotCQlhdGg2a2xfaHRjX2NsZWFudXAoYXItPmh0Y190YXJnZXQpOwotCi0JYWdncl9tb2R1bGVfZGVzdHJveShhci0+YWdncl9jbnR4dCk7Ci0KLQlhdGg2a2xfY29va2llX2NsZWFudXAoYXIpOwotCi0JYXRoNmtsX2NsZWFudXBfYW1zZHVfcnhidWZzKGFyKTsKLQotCWF0aDZrbF9ibWlfY2xlYW51cChhcik7Ci0KLQlhdGg2a2xfZGVidWdfY2xlYW51cChhcik7Ci0KLQlpZiAodW5yZWdpc3RlciAmJiB0ZXN0X2JpdChORVRERVZfUkVHSVNURVJFRCwgJmFyLT5mbGFnKSkgewotCQl1bnJlZ2lzdGVyX25ldGRldihkZXYpOwotCQljbGVhcl9iaXQoTkVUREVWX1JFR0lTVEVSRUQsICZhci0+ZmxhZyk7Ci0JfQotCi0JZnJlZV9uZXRkZXYoZGV2KTsKLQotCWtmcmVlKGFyLT5md19ib2FyZCk7Ci0Ja2ZyZWUoYXItPmZ3X290cCk7Ci0Ja2ZyZWUoYXItPmZ3KTsKLQlrZnJlZShhci0+ZndfcGF0Y2gpOwotCi0JYXRoNmtsX2NmZzgwMjExX2RlaW5pdChhcik7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvbWFpbi5jCmluZGV4IDMwYjVhNTMuLmVlYTNjNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvbWFpbi5jCkBAIC0yMCwxMiArMjAsMTMgQEAKICNpbmNsdWRlICJ0YXJnZXQuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi1zdHJ1Y3QgYXRoNmtsX3N0YSAqYXRoNmtsX2ZpbmRfc3RhKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqbm9kZV9hZGRyKQorc3RydWN0IGF0aDZrbF9zdGEgKmF0aDZrbF9maW5kX3N0YShzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCAqbm9kZV9hZGRyKQogeworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAlzdHJ1Y3QgYXRoNmtsX3N0YSAqY29ubiA9IE5VTEw7CiAJdTggaSwgbWF4X2Nvbm47CiAKLQltYXhfY29ubiA9IChhci0+bndfdHlwZSA9PSBBUF9ORVRXT1JLKSA/IEFQX01BWF9OVU1fU1RBIDogMDsKKwltYXhfY29ubiA9ICh2aWYtPm53X3R5cGUgPT0gQVBfTkVUV09SSykgPyBBUF9NQVhfTlVNX1NUQSA6IDA7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nvbm47IGkrKykgewogCQlpZiAobWVtY21wKG5vZGVfYWRkciwgYXItPnN0YV9saXN0W2ldLm1hYywgRVRIX0FMRU4pID09IDApIHsKQEAgLTE3NCw2NCArMTc1LDYgQEAKIAlhci0+Y29va2llX2NvdW50Kys7CiB9CiAKLS8qIHNldCB0aGUgd2luZG93IGFkZHJlc3MgcmVnaXN0ZXIgKHVzaW5nIDQtYnl0ZSByZWdpc3RlciBhY2Nlc3MgKS4gKi8KLXN0YXRpYyBpbnQgYXRoNmtsX3NldF9hZGRyd2luX3JlZyhzdHJ1Y3QgYXRoNmtsICphciwgdTMyIHJlZ19hZGRyLCB1MzIgYWRkcikKLXsKLQlpbnQgc3RhdHVzOwotCXMzMiBpOwotCV9fbGUzMiBhZGRyX3ZhbDsKLQotCS8qCi0JICogV3JpdGUgYnl0ZXMgMSwyLDMgb2YgdGhlIHJlZ2lzdGVyIHRvIHNldCB0aGUgdXBwZXIgYWRkcmVzcyBieXRlcywKLQkgKiB0aGUgTFNCIGlzIHdyaXR0ZW4gbGFzdCB0byBpbml0aWF0ZSB0aGUgYWNjZXNzIGN5Y2xlCi0JICovCi0KLQlmb3IgKGkgPSAxOyBpIDw9IDM7IGkrKykgewotCQkvKgotCQkgKiBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgYWRkcmVzcyBieXRlIHZhbHVlIHdlIHdhbnQgdG8KLQkJICogaGl0IDQgdGltZXMuIE5vIG5lZWQgdG8gd29ycnkgYWJvdXQgZW5kaWFubmVzcyBhcyB0aGUKLQkJICogc2FtZSBieXRlIGlzIGNvcGllZCB0byBhbGwgZm91ciBieXRlcyBvZiBhZGRyX3ZhbCBhdAotCQkgKiBhbnkgdGltZS4KLQkJICovCi0JCW1lbXNldCgodTggKikmYWRkcl92YWwsICgodTggKikmYWRkcilbaV0sIDQpOwotCi0JCS8qCi0JCSAqIEhpdCBlYWNoIGJ5dGUgb2YgdGhlIHJlZ2lzdGVyIGFkZHJlc3Mgd2l0aCBhIDQtYnl0ZQotCQkgKiB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIHNhbWUgYWRkcmVzcywgdGhpcyBpcyBhIGhhcm1sZXNzCi0JCSAqIG9wZXJhdGlvbi4KLQkJICovCi0JCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoYXIsIHJlZ19hZGRyICsgaSwgKHU4ICopJmFkZHJfdmFsLAotCQkJCQkgICAgIDQsIEhJRl9XUl9TWU5DX0JZVEVfRklYKTsKLQkJaWYgKHN0YXR1cykKLQkJCWJyZWFrOwotCX0KLQotCWlmIChzdGF0dXMpIHsKLQkJYXRoNmtsX2VycigiZmFpbGVkIHRvIHdyaXRlIGluaXRpYWwgYnl0ZXMgb2YgMHgleCB0byB3aW5kb3cgcmVnOiAweCVYXG4iLAotCQkJICAgYWRkciwgcmVnX2FkZHIpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qCi0JICogV3JpdGUgdGhlIGFkZHJlc3MgcmVnaXN0ZXIgYWdhaW4sIHRoaXMgdGltZSB3cml0ZSB0aGUgd2hvbGUKLQkgKiA0LWJ5dGUgdmFsdWUuIFRoZSBlZmZlY3QgaGVyZSBpcyB0aGF0IHRoZSBMU0Igd3JpdGUgY2F1c2VzIHRoZQotCSAqIGN5Y2xlIHRvIHN0YXJ0LCB0aGUgZXh0cmEgMyBieXRlIHdyaXRlIHRvIGJ5dGVzIDEsMiwzIGhhcyBubwotCSAqIGVmZmVjdCBzaW5jZSB3ZSBhcmUgd3JpdGluZyB0aGUgc2FtZSB2YWx1ZXMgYWdhaW4KLQkgKi8KLQlhZGRyX3ZhbCA9IGNwdV90b19sZTMyKGFkZHIpOwotCXN0YXR1cyA9IGhpZl9yZWFkX3dyaXRlX3N5bmMoYXIsIHJlZ19hZGRyLAotCQkJCSAgICAgKHU4ICopJihhZGRyX3ZhbCksCi0JCQkJICAgICA0LCBISUZfV1JfU1lOQ19CWVRFX0lOQyk7Ci0KLQlpZiAoc3RhdHVzKSB7Ci0JCWF0aDZrbF9lcnIoImZhaWxlZCB0byB3cml0ZSAweCV4IHRvIHdpbmRvdyByZWc6IDB4JVhcbiIsCi0JCQkgICBhZGRyLCByZWdfYWRkcik7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBSZWFkIGZyb20gdGhlIGhhcmR3YXJlIHRocm91Z2ggaXRzIGRpYWdub3N0aWMgd2luZG93LiBObyBjb29wZXJhdGlvbgogICogZnJvbSB0aGUgZmlybXdhcmUgaXMgcmVxdWlyZWQgZm9yIHRoaXMuCkBAIC0yNDAsMTQgKzE4Myw3IEBACiB7CiAJaW50IHJldDsKIAotCS8qIHNldCB3aW5kb3cgcmVnaXN0ZXIgdG8gc3RhcnQgcmVhZCBjeWNsZSAqLwotCXJldCA9IGF0aDZrbF9zZXRfYWRkcndpbl9yZWcoYXIsIFdJTkRPV19SRUFEX0FERFJfQUREUkVTUywgYWRkcmVzcyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIHJlYWQgdGhlIGRhdGEgKi8KLQlyZXQgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGFyLCBXSU5ET1dfREFUQV9BRERSRVNTLCAodTggKikgdmFsdWUsCi0JCQkJICBzaXplb2YoKnZhbHVlKSwgSElGX1JEX1NZTkNfQllURV9JTkMpOworCXJldCA9IGF0aDZrbF9oaWZfZGlhZ19yZWFkMzIoYXIsIGFkZHJlc3MsIHZhbHVlKTsKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF93YXJuKCJmYWlsZWQgdG8gcmVhZDMyIHRocm91Z2ggZGlhZ25vc2Ugd2luZG93OiAlZFxuIiwKIAkJCSAgICByZXQpOwpAQCAtMjY1LDE4ICsyMDEsMTUgQEAKIHsKIAlpbnQgcmV0OwogCi0JLyogc2V0IHdyaXRlIGRhdGEgKi8KLQlyZXQgPSBoaWZfcmVhZF93cml0ZV9zeW5jKGFyLCBXSU5ET1dfREFUQV9BRERSRVNTLCAodTggKikgJnZhbHVlLAotCQkJCSAgc2l6ZW9mKHZhbHVlKSwgSElGX1dSX1NZTkNfQllURV9JTkMpOworCXJldCA9IGF0aDZrbF9oaWZfZGlhZ193cml0ZTMyKGFyLCBhZGRyZXNzLCB2YWx1ZSk7CisKIAlpZiAocmV0KSB7CiAJCWF0aDZrbF9lcnIoImZhaWxlZCB0byB3cml0ZSAweCV4IGR1cmluZyBkaWFnbm9zZSB3aW5kb3cgdG8gMHglZFxuIiwKIAkJCSAgIGFkZHJlc3MsIHZhbHVlKTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQkvKiBzZXQgd2luZG93IHJlZ2lzdGVyLCB3aGljaCBzdGFydHMgdGhlIHdyaXRlIGN5Y2xlICovCi0JcmV0dXJuIGF0aDZrbF9zZXRfYWRkcndpbl9yZWcoYXIsIFdJTkRPV19XUklURV9BRERSX0FERFJFU1MsCi0JCQkJICAgICAgYWRkcmVzcyk7CisJcmV0dXJuIDA7CiB9CiAKIGludCBhdGg2a2xfZGlhZ19yZWFkKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgYWRkcmVzcywgdm9pZCAqZGF0YSwgdTMyIGxlbmd0aCkKQEAgLTM5Myw4ICszMjYsOCBAQAogI2RlZmluZSBBUjYwMDNfUkVTRVRfQ09OVFJPTF9BRERSRVNTIDB4MDAwMDQwMDAKICNkZWZpbmUgQVI2MDA0X1JFU0VUX0NPTlRST0xfQUREUkVTUyAweDAwMDA0MDAwCiAKLXN0YXRpYyB2b2lkIGF0aDZrbF9yZXNldF9kZXZpY2Uoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiB0YXJnZXRfdHlwZSwKLQkJCQlib29sIHdhaXRfZm90X2NvbXBsdG4sIGJvb2wgY29sZF9yZXNldCkKK3ZvaWQgYXRoNmtsX3Jlc2V0X2RldmljZShzdHJ1Y3QgYXRoNmtsICphciwgdTMyIHRhcmdldF90eXBlLAorCQkJIGJvb2wgd2FpdF9mb3RfY29tcGx0biwgYm9vbCBjb2xkX3Jlc2V0KQogewogCWludCBzdGF0dXMgPSAwOwogCXUzMiBhZGRyZXNzOwpAQCAtNDI1LDEwMiArMzU4LDMzIEBACiAJCWF0aDZrbF9lcnIoImZhaWxlZCB0byByZXNldCB0YXJnZXRcbiIpOwogfQogCi12b2lkIGF0aDZrbF9zdG9wX2VuZHBvaW50KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGJvb2wga2VlcF9wcm9maWxlLAotCQkJICBib29sIGdldF9kYmdsb2dzKQotewotCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKLQlzdGF0aWMgdTggYmNhc3RfbWFjW10gPSB7MHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZn07Ci0JYm9vbCBkaXNjb25faXNzdWVkOwotCi0JbmV0aWZfc3RvcF9xdWV1ZShkZXYpOwotCi0JLyogZGlzYWJsZSB0aGUgdGFyZ2V0IGFuZCB0aGUgaW50ZXJydXB0cyBhc3NvY2lhdGVkIHdpdGggaXQgKi8KLQlpZiAodGVzdF9iaXQoV01JX1JFQURZLCAmYXItPmZsYWcpKSB7Ci0JCWRpc2Nvbl9pc3N1ZWQgPSAodGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpIHx8Ci0JCQkJIHRlc3RfYml0KENPTk5FQ1RfUEVORCwgJmFyLT5mbGFnKSk7Ci0JCWF0aDZrbF9kaXNjb25uZWN0KGFyKTsKLQkJaWYgKCFrZWVwX3Byb2ZpbGUpCi0JCQlhdGg2a2xfaW5pdF9wcm9maWxlX2luZm8oYXIpOwotCi0JCWRlbF90aW1lcigmYXItPmRpc2Nvbm5lY3RfdGltZXIpOwotCi0JCWNsZWFyX2JpdChXTUlfUkVBRFksICZhci0+ZmxhZyk7Ci0JCWF0aDZrbF93bWlfc2h1dGRvd24oYXItPndtaSk7Ci0JCWNsZWFyX2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKTsKLQkJYXItPndtaSA9IE5VTEw7Ci0KLQkJLyoKLQkJICogQWZ0ZXIgd21pX3NodWRvd24gYWxsIFdNSSBldmVudHMgd2lsbCBiZSBkcm9wcGVkLiBXZQotCQkgKiBuZWVkIHRvIGNsZWFudXAgdGhlIGJ1ZmZlcnMgYWxsb2NhdGVkIGluIEFQIG1vZGUgYW5kCi0JCSAqIGdpdmUgZGlzY29ubmVjdCBub3RpZmljYXRpb24gdG8gc3RhY2ssIHdoaWNoIHVzdWFsbHkKLQkJICogaGFwcGVucyBpbiB0aGUgZGlzY29ubmVjdF9ldmVudC4gU2ltdWxhdGUgdGhlIGRpc2Nvbm5lY3QKLQkJICogZXZlbnQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gZGlyZWN0bHkuIFNvbWV0aW1lcwotCQkgKiBkaXNjb25uZWN0X2V2ZW50IHdpbGwgYmUgcmVjZWl2ZWQgd2hlbiB0aGUgZGVidWcgbG9ncwotCQkgKiBhcmUgY29sbGVjdGVkLgotCQkgKi8KLQkJaWYgKGRpc2Nvbl9pc3N1ZWQpCi0JCQlhdGg2a2xfZGlzY29ubmVjdF9ldmVudChhciwgRElTQ09OTkVDVF9DTUQsCi0JCQkJCQkoYXItPm53X3R5cGUgJiBBUF9ORVRXT1JLKSA/Ci0JCQkJCQliY2FzdF9tYWMgOiBhci0+YnNzaWQsCi0JCQkJCQkwLCBOVUxMLCAwKTsKLQotCQlhci0+dXNlcl9rZXlfY3RybCA9IDA7Ci0KLQl9IGVsc2UgewotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLAotCQkJICAgIiVzOiB3bWkgaXMgbm90IHJlYWR5IDB4JXAgMHglcFxuIiwKLQkJCSAgIF9fZnVuY19fLCBhciwgYXItPndtaSk7Ci0KLQkJLyogU2h1dCBkb3duIFdNSSBpZiB3ZSBoYXZlIHN0YXJ0ZWQgaXQgKi8KLQkJaWYgKHRlc3RfYml0KFdNSV9FTkFCTEVELCAmYXItPmZsYWcpKSB7Ci0JCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLAotCQkJCSAgICIlczogc2h1dCBkb3duIHdtaVxuIiwgX19mdW5jX18pOwotCQkJYXRoNmtsX3dtaV9zaHV0ZG93bihhci0+d21pKTsKLQkJCWNsZWFyX2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKTsKLQkJCWFyLT53bWkgPSBOVUxMOwotCQl9Ci0JfQotCi0JaWYgKGFyLT5odGNfdGFyZ2V0KSB7Ci0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICIlczogc2h1dCBkb3duIGh0Y1xuIiwgX19mdW5jX18pOwotCQlhdGg2a2xfaHRjX3N0b3AoYXItPmh0Y190YXJnZXQpOwotCX0KLQotCS8qCi0JICogVHJ5IHRvIHJlc2V0IHRoZSBkZXZpY2UgaWYgd2UgY2FuLiBUaGUgZHJpdmVyIG1heSBoYXZlIGJlZW4KLQkgKiBjb25maWd1cmUgTk9UIHRvIHJlc2V0IHRoZSB0YXJnZXQgZHVyaW5nIGEgZGVidWcgc2Vzc2lvbi4KLQkgKi8KLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfVFJDLAotCQkgICAiYXR0ZW1wdGluZyB0byByZXNldCB0YXJnZXQgb24gaW5zdGFuY2UgZGVzdHJveVxuIik7Ci0JYXRoNmtsX3Jlc2V0X2RldmljZShhciwgYXItPnRhcmdldF90eXBlLCB0cnVlLCB0cnVlKTsKLX0KLQotc3RhdGljIHZvaWQgYXRoNmtsX2luc3RhbGxfc3RhdGljX3dlcF9rZXlzKHN0cnVjdCBhdGg2a2wgKmFyKQorc3RhdGljIHZvaWQgYXRoNmtsX2luc3RhbGxfc3RhdGljX3dlcF9rZXlzKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJdTggaW5kZXg7CiAJdTgga2V5dXNhZ2U7CiAKIAlmb3IgKGluZGV4ID0gV01JX01JTl9LRVlfSU5ERVg7IGluZGV4IDw9IFdNSV9NQVhfS0VZX0lOREVYOyBpbmRleCsrKSB7Ci0JCWlmIChhci0+d2VwX2tleV9saXN0W2luZGV4XS5rZXlfbGVuKSB7CisJCWlmICh2aWYtPndlcF9rZXlfbGlzdFtpbmRleF0ua2V5X2xlbikgewogCQkJa2V5dXNhZ2UgPSBHUk9VUF9VU0FHRTsKLQkJCWlmIChpbmRleCA9PSBhci0+ZGVmX3R4a2V5X2luZGV4KQorCQkJaWYgKGluZGV4ID09IHZpZi0+ZGVmX3R4a2V5X2luZGV4KQogCQkJCWtleXVzYWdlIHw9IFRYX1VTQUdFOwogCi0JCQlhdGg2a2xfd21pX2FkZGtleV9jbWQoYXItPndtaSwKKwkJCWF0aDZrbF93bWlfYWRka2V5X2NtZCh2aWYtPmFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKIAkJCQkJICAgICAgaW5kZXgsCiAJCQkJCSAgICAgIFdFUF9DUllQVCwKIAkJCQkJICAgICAga2V5dXNhZ2UsCi0JCQkJCSAgICAgIGFyLT53ZXBfa2V5X2xpc3RbaW5kZXhdLmtleV9sZW4sCi0JCQkJCSAgICAgIE5VTEwsCi0JCQkJCSAgICAgIGFyLT53ZXBfa2V5X2xpc3RbaW5kZXhdLmtleSwKKwkJCQkJICAgICAgdmlmLT53ZXBfa2V5X2xpc3RbaW5kZXhdLmtleV9sZW4sCisJCQkJCSAgICAgIE5VTEwsIDAsCisJCQkJCSAgICAgIHZpZi0+d2VwX2tleV9saXN0W2luZGV4XS5rZXksCiAJCQkJCSAgICAgIEtFWV9PUF9JTklUX1ZBTCwgTlVMTCwKIAkJCQkJICAgICAgTk9fU1lOQ19XTUlGTEFHKTsKIAkJfQogCX0KIH0KIAotdm9pZCBhdGg2a2xfY29ubmVjdF9hcF9tb2RlX2JzcyhzdHJ1Y3QgYXRoNmtsICphciwgdTE2IGNoYW5uZWwpCit2b2lkIGF0aDZrbF9jb25uZWN0X2FwX21vZGVfYnNzKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHUxNiBjaGFubmVsKQogeworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAlzdHJ1Y3QgYXRoNmtsX3JlcV9rZXkgKmlrOwogCWludCByZXM7CiAJdTgga2V5X3JzY1tBVEg2S0xfS0VZX1NFUV9MRU5dOwpAQCAtNTI5LDExICszOTMsMTMgQEAKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgIkFQIG1vZGUgc3RhcnRlZCBvbiAldSBNSHpcbiIsIGNoYW5uZWwpOwogCi0Jc3dpdGNoIChhci0+YXV0aF9tb2RlKSB7CisJc3dpdGNoICh2aWYtPmF1dGhfbW9kZSkgewogCWNhc2UgTk9ORV9BVVRIOgotCQlpZiAoYXItPnByd2lzZV9jcnlwdG8gPT0gV0VQX0NSWVBUKQotCQkJYXRoNmtsX2luc3RhbGxfc3RhdGljX3dlcF9rZXlzKGFyKTsKLQkJYnJlYWs7CisJCWlmICh2aWYtPnByd2lzZV9jcnlwdG8gPT0gV0VQX0NSWVBUKQorCQkJYXRoNmtsX2luc3RhbGxfc3RhdGljX3dlcF9rZXlzKHZpZik7CisJCWlmICghaWstPnZhbGlkIHx8IGlrLT5rZXlfdHlwZSAhPSBXQVBJX0NSWVBUKQorCQkJYnJlYWs7CisJCS8qIGZvciBXQVBJLCB3ZSBuZWVkIHRvIHNldCB0aGUgZGVsYXllZCBncm91cCBrZXksIGNvbnRpbnVlOiAqLwogCWNhc2UgV1BBX1BTS19BVVRIOgogCWNhc2UgV1BBMl9QU0tfQVVUSDoKIAljYXNlIChXUEFfUFNLX0FVVEggfCBXUEEyX1BTS19BVVRIKToKQEAgLTU0NCw4ICs0MTAsOSBAQAogCQkJICAgInRoZSBpbml0aWFsIGdyb3VwIGtleSBmb3IgQVAgbW9kZVxuIik7CiAJCW1lbXNldChrZXlfcnNjLCAwLCBzaXplb2Yoa2V5X3JzYykpOwogCQlyZXMgPSBhdGg2a2xfd21pX2FkZGtleV9jbWQoCi0JCQlhci0+d21pLCBpay0+a2V5X2luZGV4LCBpay0+a2V5X3R5cGUsCi0JCQlHUk9VUF9VU0FHRSwgaWstPmtleV9sZW4sIGtleV9yc2MsIGlrLT5rZXksCisJCQlhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIGlrLT5rZXlfaW5kZXgsIGlrLT5rZXlfdHlwZSwKKwkJCUdST1VQX1VTQUdFLCBpay0+a2V5X2xlbiwga2V5X3JzYywgQVRINktMX0tFWV9TRVFfTEVOLAorCQkJaWstPmtleSwKIAkJCUtFWV9PUF9JTklUX1ZBTCwgTlVMTCwgU1lOQ19CT1RIX1dNSUZMQUcpOwogCQlpZiAocmVzKSB7CiAJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DRkcsICJEZWxheWVkICIKQEAgLTU1NCwxNSArNDIxLDE2IEBACiAJCWJyZWFrOwogCX0KIAotCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCBOT05FX0JTU19GSUxURVIsIDApOwotCXNldF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpOwotCW5ldGlmX2NhcnJpZXJfb24oYXItPm5ldF9kZXYpOworCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIE5PTkVfQlNTX0ZJTFRFUiwgMCk7CisJc2V0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKTsKKwluZXRpZl9jYXJyaWVyX29uKHZpZi0+bmRldik7CiB9CiAKLXZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9zdGEoc3RydWN0IGF0aDZrbCAqYXIsIHUxNiBhaWQsIHU4ICptYWNfYWRkciwKK3ZvaWQgYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9zdGEoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTE2IGFpZCwgdTggKm1hY19hZGRyLAogCQkJCXU4IGtleW1nbXQsIHU4IHVjaXBoZXIsIHU4IGF1dGgsCiAJCQkJdTggYXNzb2NfcmVxX2xlbiwgdTggKmFzc29jX2luZm8pCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCXU4ICppZXMgPSBOVUxMLCAqd3BhX2llID0gTlVMTCwgKnBvczsKIAlzaXplX3QgaWVzX2xlbiA9IDA7CiAJc3RydWN0IHN0YXRpb25faW5mbyBzaW5mbzsKQEAgLTYwMCw2ICs0NjgsMTggQEAKIAkJCQl3cGFfaWUgPSBwb3M7IC8qIFdQUyBJRSAqLwogCQkJCWJyZWFrOyAvKiBvdmVycmlkZXMgV1BBL1JTTiBJRSAqLwogCQkJfQorCQl9IGVsc2UgaWYgKHBvc1swXSA9PSAweDQ0ICYmIHdwYV9pZSA9PSBOVUxMKSB7CisJCQkvKgorCQkJICogTm90ZTogV0FQSSBQYXJhbWV0ZXIgU2V0IElFIHJlLXVzZXMgRWxlbWVudCBJRCB0aGF0CisJCQkgKiB3YXMgb2ZmaWNpYWxseSBhbGxvY2F0ZWQgZm9yIEJTUyBBQyBBY2Nlc3MgRGVsYXkuIEFzCisJCQkgKiBzdWNoLCB3ZSBuZWVkIHRvIGJlIGEgYml0IG1vcmUgY2FyZWZ1bCBvbiB3aGVuCisJCQkgKiBwYXJzaW5nIHRoZSBmcmFtZS4gSG93ZXZlciwgQlNTIEFDIEFjY2VzcyBEZWxheQorCQkJICogZWxlbWVudCBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgaW5jbHVkZWQgaW4KKwkJCSAqIChSZSlBc3NvY2lhdGlvbiBSZXF1ZXN0IGZyYW1lcywgc28gdGhpcyBzaG91bGQgbm90CisJCQkgKiBjYXVzZSBwcm9ibGVtcy4KKwkJCSAqLworCQkJd3BhX2llID0gcG9zOyAvKiBXQVBJIElFICovCisJCQlicmVhazsKIAkJfQogCQlwb3MgKz0gMiArIHBvc1sxXTsKIAl9CkBAIC02MTcsMzgwICs0OTcsNDkgQEAKIAlzaW5mby5hc3NvY19yZXFfaWVzX2xlbiA9IGllc19sZW47CiAJc2luZm8uZmlsbGVkIHw9IFNUQVRJT05fSU5GT19BU1NPQ19SRVFfSUVTOwogCi0JY2ZnODAyMTFfbmV3X3N0YShhci0+bmV0X2RldiwgbWFjX2FkZHIsICZzaW5mbywgR0ZQX0tFUk5FTCk7CisJY2ZnODAyMTFfbmV3X3N0YSh2aWYtPm5kZXYsIG1hY19hZGRyLCAmc2luZm8sIEdGUF9LRVJORUwpOwogCi0JbmV0aWZfd2FrZV9xdWV1ZShhci0+bmV0X2Rldik7Ci19Ci0KLS8qIEZ1bmN0aW9ucyBmb3IgVHggY3JlZGl0IGhhbmRsaW5nICovCi12b2lkIGF0aDZrX2NyZWRpdF9pbml0KHN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm8gKmNyZWRfaW5mbywKLQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVwX2xpc3QsCi0JCSAgICAgICBpbnQgdG90X2NyZWRpdHMpCi17Ci0Jc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqY3VyX2VwX2Rpc3Q7Ci0JaW50IGNvdW50OwotCi0JY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzID0gdG90X2NyZWRpdHM7Ci0JY3JlZF9pbmZvLT50b3RhbF9hdmFpbF9jcmVkaXRzID0gdG90X2NyZWRpdHM7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cl9lcF9kaXN0LCBlcF9saXN0LCBsaXN0KSB7Ci0JCWlmIChjdXJfZXBfZGlzdC0+ZW5kcG9pbnQgPT0gRU5EUE9JTlRfMCkKLQkJCWNvbnRpbnVlOwotCi0JCWN1cl9lcF9kaXN0LT5jcmVkX21pbiA9IGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2c7Ci0KLQkJaWYgKHRvdF9jcmVkaXRzID4gNCkKLQkJCWlmICgoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9CS19TVkMpIHx8Ci0JCQkgICAgKGN1cl9lcF9kaXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfQkVfU1ZDKSkgewotCQkJCWF0aDZrbF9kZXBvc2l0X2NyZWRpdF90b19lcChjcmVkX2luZm8sCi0JCQkJCQljdXJfZXBfZGlzdCwKLQkJCQkJCWN1cl9lcF9kaXN0LT5jcmVkX21pbik7Ci0JCQkJY3VyX2VwX2Rpc3QtPmRpc3RfZmxhZ3MgfD0gSFRDX0VQX0FDVElWRTsKLQkJCX0KLQotCQlpZiAoY3VyX2VwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfQ09OVFJPTF9TVkMpIHsKLQkJCWF0aDZrbF9kZXBvc2l0X2NyZWRpdF90b19lcChjcmVkX2luZm8sIGN1cl9lcF9kaXN0LAotCQkJCQkJICAgIGN1cl9lcF9kaXN0LT5jcmVkX21pbik7Ci0JCQkvKgotCQkJICogQ29udHJvbCBzZXJ2aWNlIGlzIGFsd2F5cyBtYXJrZWQgYWN0aXZlLCBpdAotCQkJICogbmV2ZXIgZ29lcyBpbmFjdGl2ZSBFVkVSLgotCQkJICovCi0JCQljdXJfZXBfZGlzdC0+ZGlzdF9mbGFncyB8PSBIVENfRVBfQUNUSVZFOwotCQl9IGVsc2UgaWYgKGN1cl9lcF9kaXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfQktfU1ZDKQotCQkJLyogdGhpcyBpcyB0aGUgbG93ZXN0IHByaW9yaXR5IGRhdGEgZW5kcG9pbnQgKi8KLQkJCWNyZWRfaW5mby0+bG93ZXN0cHJpX2VwX2Rpc3QgPSBjdXJfZXBfZGlzdC0+bGlzdDsKLQotCQkvKgotCQkgKiBTdHJlYW1zIGhhdmUgdG8gYmUgY3JlYXRlZCAoZXhwbGljaXQgfCBpbXBsaWNpdCkgZm9yIGFsbAotCQkgKiBraW5kcyBvZiB0cmFmZmljLiBCRSBlbmRwb2ludHMgYXJlIGFsc28gaW5hY3RpdmUgaW4gdGhlCi0JCSAqIGJlZ2lubmluZy4gV2hlbiBCRSB0cmFmZmljIHN0YXJ0cyBpdCBjcmVhdGVzIGltcGxpY2l0Ci0JCSAqIHN0cmVhbXMgdGhhdCByZWRpc3RyaWJ1dGVzIGNyZWRpdHMuCi0JCSAqCi0JCSAqIE5vdGU6IGFsbCBvdGhlciBlbmRwb2ludHMgaGF2ZSBtaW5pbXVtcyBzZXQgYnV0IGFyZQotCQkgKiBpbml0aWFsbHkgZ2l2ZW4gTk8gY3JlZGl0cy4gY3JlZGl0cyB3aWxsIGJlIGRpc3RyaWJ1dGVkCi0JCSAqIGFzIHRyYWZmaWMgYWN0aXZpdHkgZGVtYW5kcwotCQkgKi8KLQl9Ci0KLQlXQVJOX09OKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA8PSAwKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyX2VwX2Rpc3QsIGVwX2xpc3QsIGxpc3QpIHsKLQkJaWYgKGN1cl9lcF9kaXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGN1cl9lcF9kaXN0LT5zdmNfaWQgPT0gV01JX0NPTlRST0xfU1ZDKQotCQkJY3VyX2VwX2Rpc3QtPmNyZWRfbm9ybSA9IGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2c7Ci0JCWVsc2UgewotCQkJLyoKLQkJCSAqIEZvciB0aGUgcmVtYWluaW5nIGRhdGEgZW5kcG9pbnRzLCB3ZSBhc3N1bWUgdGhhdAotCQkJICogZWFjaCBjcmVkX3Blcl9tc2cgYXJlIHRoZSBzYW1lLiBXZSB1c2UgYSBzaW1wbGUKLQkJCSAqIGNhbGN1bGF0aW9uIGhlcmUsIHdlIHRha2UgdGhlIHJlbWFpbmluZyBjcmVkaXRzCi0JCQkgKiBhbmQgZGV0ZXJtaW5lIGhvdyBtYW55IG1heCBtZXNzYWdlcyB0aGlzIGNhbgotCQkJICogY292ZXIgYW5kIHRoZW4gc2V0IGVhY2ggZW5kcG9pbnQncyBub3JtYWwgdmFsdWUKLQkJCSAqIGVxdWFsIHRvIDMvNCB0aGlzIGFtb3VudC4KLQkJCSAqLwotCQkJY291bnQgPSAoY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzIC8KLQkJCQkgY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZykKLQkJCQkqIGN1cl9lcF9kaXN0LT5jcmVkX3Blcl9tc2c7Ci0JCQljb3VudCA9IChjb3VudCAqIDMpID4+IDI7Ci0JCQljb3VudCA9IG1heChjb3VudCwgY3VyX2VwX2Rpc3QtPmNyZWRfcGVyX21zZyk7Ci0JCQljdXJfZXBfZGlzdC0+Y3JlZF9ub3JtID0gY291bnQ7Ci0KLQkJfQotCX0KLX0KLQotLyogaW5pdGlhbGl6ZSBhbmQgc2V0dXAgY3JlZGl0IGRpc3RyaWJ1dGlvbiAqLwotaW50IGF0aDZrX3NldHVwX2NyZWRpdF9kaXN0KHZvaWQgKmh0Y19oYW5kbGUsCi0JCQkgICAgc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvKQotewotCXUxNiBzZXJ2aWNlcHJpb3JpdHlbNV07Ci0KLQltZW1zZXQoY3JlZF9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbykpOwotCi0Jc2VydmljZXByaW9yaXR5WzBdID0gV01JX0NPTlRST0xfU1ZDOyAgLyogaGlnaGVzdCAqLwotCXNlcnZpY2Vwcmlvcml0eVsxXSA9IFdNSV9EQVRBX1ZPX1NWQzsKLQlzZXJ2aWNlcHJpb3JpdHlbMl0gPSBXTUlfREFUQV9WSV9TVkM7Ci0Jc2VydmljZXByaW9yaXR5WzNdID0gV01JX0RBVEFfQkVfU1ZDOwotCXNlcnZpY2Vwcmlvcml0eVs0XSA9IFdNSV9EQVRBX0JLX1NWQzsgLyogbG93ZXN0ICovCi0KLQkvKiBzZXQgcHJpb3JpdHkgbGlzdCAqLwotCWF0aDZrbF9odGNfc2V0X2NyZWRpdF9kaXN0KGh0Y19oYW5kbGUsIGNyZWRfaW5mbywgc2VydmljZXByaW9yaXR5LCA1KTsKLQotCXJldHVybiAwOwotfQotCi0vKiByZWR1Y2UgYW4gZXAncyBjcmVkaXRzIGJhY2sgdG8gYSBzZXQgbGltaXQgKi8KLXN0YXRpYyB2b2lkIGF0aDZrX3JlZHVjZV9jcmVkaXRzKHN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm8gKmNyZWRfaW5mbywKLQkJCQkgc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAgKmVwX2Rpc3QsCi0JCQkJIGludCBsaW1pdCkKLXsKLQlpbnQgY3JlZGl0czsKLQotCWVwX2Rpc3QtPmNyZWRfYXNzbmdkID0gbGltaXQ7Ci0KLQlpZiAoZXBfZGlzdC0+Y3JlZGl0cyA8PSBsaW1pdCkKLQkJcmV0dXJuOwotCi0JY3JlZGl0cyA9IGVwX2Rpc3QtPmNyZWRpdHMgLSBsaW1pdDsKLQllcF9kaXN0LT5jcmVkaXRzIC09IGNyZWRpdHM7Ci0JY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzICs9IGNyZWRpdHM7Ci19Ci0KLXN0YXRpYyB2b2lkIGF0aDZrX2NyZWRpdF91cGRhdGUoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAotCQkJCXN0cnVjdCBsaXN0X2hlYWQgKmVwZGlzdF9saXN0KQotewotCXN0cnVjdCBodGNfZW5kcG9pbnRfY3JlZGl0X2Rpc3QgKmN1cl9kaXN0X2xpc3Q7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cl9kaXN0X2xpc3QsIGVwZGlzdF9saXN0LCBsaXN0KSB7Ci0JCWlmIChjdXJfZGlzdF9saXN0LT5lbmRwb2ludCA9PSBFTkRQT0lOVF8wKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGN1cl9kaXN0X2xpc3QtPmNyZWRfdG9fZGlzdCA+IDApIHsKLQkJCWN1cl9kaXN0X2xpc3QtPmNyZWRpdHMgKz0KLQkJCQkJY3VyX2Rpc3RfbGlzdC0+Y3JlZF90b19kaXN0OwotCQkJY3VyX2Rpc3RfbGlzdC0+Y3JlZF90b19kaXN0ID0gMDsKLQkJCWlmIChjdXJfZGlzdF9saXN0LT5jcmVkaXRzID4KLQkJCSAgICBjdXJfZGlzdF9saXN0LT5jcmVkX2Fzc25nZCkKLQkJCQlhdGg2a19yZWR1Y2VfY3JlZGl0cyhjcmVkX2luZm8sCi0JCQkJCQljdXJfZGlzdF9saXN0LAotCQkJCQkJY3VyX2Rpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QpOwotCi0JCQlpZiAoY3VyX2Rpc3RfbGlzdC0+Y3JlZGl0cyA+Ci0JCQkgICAgY3VyX2Rpc3RfbGlzdC0+Y3JlZF9ub3JtKQotCQkJCWF0aDZrX3JlZHVjZV9jcmVkaXRzKGNyZWRfaW5mbywgY3VyX2Rpc3RfbGlzdCwKLQkJCQkJCSAgICAgY3VyX2Rpc3RfbGlzdC0+Y3JlZF9ub3JtKTsKLQotCQkJaWYgKCEoY3VyX2Rpc3RfbGlzdC0+ZGlzdF9mbGFncyAmIEhUQ19FUF9BQ1RJVkUpKSB7Ci0JCQkJaWYgKGN1cl9kaXN0X2xpc3QtPnR4cV9kZXB0aCA9PSAwKQotCQkJCQlhdGg2a19yZWR1Y2VfY3JlZGl0cyhjcmVkX2luZm8sCi0JCQkJCQkJICAgICBjdXJfZGlzdF9saXN0LCAwKTsKLQkJCX0KLQkJfQotCX0KLX0KLQotLyoKLSAqIEhUQyBoYXMgYW4gZW5kcG9pbnQgdGhhdCBuZWVkcyBjcmVkaXRzLCBlcF9kaXN0IGlzIHRoZSBlbmRwb2ludCBpbgotICogcXVlc3Rpb24uCi0gKi8KLXZvaWQgYXRoNmtfc2Vla19jcmVkaXRzKHN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm8gKmNyZWRfaW5mbywKLQkJCXN0cnVjdCBodGNfZW5kcG9pbnRfY3JlZGl0X2Rpc3QgKmVwX2Rpc3QpCi17Ci0Jc3RydWN0IGh0Y19lbmRwb2ludF9jcmVkaXRfZGlzdCAqY3VyZGlzdF9saXN0OwotCWludCBjcmVkaXRzID0gMDsKLQlpbnQgbmVlZDsKLQotCWlmIChlcF9kaXN0LT5zdmNfaWQgPT0gV01JX0NPTlRST0xfU1ZDKQotCQlnb3RvIG91dDsKLQotCWlmICgoZXBfZGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX1ZJX1NWQykgfHwKLQkgICAgKGVwX2Rpc3QtPnN2Y19pZCA9PSBXTUlfREFUQV9WT19TVkMpKQotCQlpZiAoKGVwX2Rpc3QtPmNyZWRfYXNzbmdkID49IGVwX2Rpc3QtPmNyZWRfbm9ybSkpCi0JCQlnb3RvIG91dDsKLQotCS8qCi0JICogRm9yIGFsbCBvdGhlciBzZXJ2aWNlcywgd2UgZm9sbG93IGEgc2ltcGxlIGFsZ29yaXRobSBvZjoKLQkgKgotCSAqIDEuIGNoZWNraW5nIHRoZSBmcmVlIHBvb2wgZm9yIGNyZWRpdHMKLQkgKiAyLiBjaGVja2luZyBsb3dlciBwcmlvcml0eSBlbmRwb2ludHMgZm9yIGNyZWRpdHMgdG8gdGFrZQotCSAqLwotCi0JY3JlZGl0cyA9IG1pbihjcmVkX2luZm8tPmN1cl9mcmVlX2NyZWRpdHMsIGVwX2Rpc3QtPnNlZWtfY3JlZCk7Ci0KLQlpZiAoY3JlZGl0cyA+PSBlcF9kaXN0LT5zZWVrX2NyZWQpCi0JCWdvdG8gb3V0OwotCi0JLyoKLQkgKiBXZSBkb24ndCBoYXZlIGVub3VnaCBpbiB0aGUgZnJlZSBwb29sLCB0cnkgdGFraW5nIGF3YXkgZnJvbQotCSAqIGxvd2VyIHByaW9yaXR5IHNlcnZpY2VzIFRoZSBydWxlIGZvciB0YWtpbmcgYXdheSBjcmVkaXRzOgotCSAqCi0JICogICAxLiBPbmx5IHRha2UgZnJvbSBsb3dlciBwcmlvcml0eSBlbmRwb2ludHMKLQkgKiAgIDIuIE9ubHkgdGFrZSB3aGF0IGlzIGFsbG9jYXRlZCBhYm92ZSB0aGUgbWluaW11bSAobmV2ZXIKLQkgKiAgICAgIHN0YXJ2ZSBhbiBlbmRwb2ludCBjb21wbGV0ZWx5KQotCSAqICAgMy4gT25seSB0YWtlIHdoYXQgeW91IG5lZWQuCi0JICovCi0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoY3VyZGlzdF9saXN0LAotCQkJCSAgICAmY3JlZF9pbmZvLT5sb3dlc3RwcmlfZXBfZGlzdCwKLQkJCQkgICAgbGlzdCkgewotCQlpZiAoY3VyZGlzdF9saXN0ID09IGVwX2Rpc3QpCi0JCQlicmVhazsKLQotCQluZWVkID0gZXBfZGlzdC0+c2Vla19jcmVkIC0gY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzOwotCi0JCWlmICgoY3VyZGlzdF9saXN0LT5jcmVkX2Fzc25nZCAtIG5lZWQpID49Ci0JCSAgICAgY3VyZGlzdF9saXN0LT5jcmVkX21pbikgewotCQkJLyoKLQkJCSAqIFRoZSBjdXJyZW50IG9uZSBoYXMgYmVlbiBhbGxvY2F0ZWQgbW9yZSB0aGFuCi0JCQkgKiBpdCdzIG1pbmltdW0gYW5kIGl0IGhhcyBlbm91Z2ggY3JlZGl0cyBhc3NpZ25lZAotCQkJICogYWJvdmUgaXQncyBtaW5pbXVtIHRvIGZ1bGZpbGwgb3VyIG5lZWQgdHJ5IHRvCi0JCQkgKiB0YWtlIGF3YXkganVzdCBlbm91Z2ggdG8gZnVsZmlsbCBvdXIgbmVlZC4KLQkJCSAqLwotCQkJYXRoNmtfcmVkdWNlX2NyZWRpdHMoY3JlZF9pbmZvLCBjdXJkaXN0X2xpc3QsCi0JCQkJCWN1cmRpc3RfbGlzdC0+Y3JlZF9hc3NuZ2QgLSBuZWVkKTsKLQotCQkJaWYgKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA+PQotCQkJICAgIGVwX2Rpc3QtPnNlZWtfY3JlZCkKLQkJCQlicmVhazsKLQkJfQotCi0JCWlmIChjdXJkaXN0X2xpc3QtPmVuZHBvaW50ID09IEVORFBPSU5UXzApCi0JCQlicmVhazsKLQl9Ci0KLQljcmVkaXRzID0gbWluKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cywgZXBfZGlzdC0+c2Vla19jcmVkKTsKLQotb3V0OgotCS8qIGRpZCB3ZSBmaW5kIHNvbWUgY3JlZGl0cz8gKi8KLQlpZiAoY3JlZGl0cykKLQkJYXRoNmtsX2RlcG9zaXRfY3JlZGl0X3RvX2VwKGNyZWRfaW5mbywgZXBfZGlzdCwgY3JlZGl0cyk7Ci0KLQllcF9kaXN0LT5zZWVrX2NyZWQgPSAwOwotfQotCi0vKiByZWRpc3RyaWJ1dGUgY3JlZGl0cyBiYXNlZCBvbiBhY3Rpdml0eSBjaGFuZ2UgKi8KLXN0YXRpYyB2b2lkIGF0aDZrX3JlZGlzdHJpYnV0ZV9jcmVkaXRzKHN0cnVjdCBodGNfY3JlZGl0X3N0YXRlX2luZm8gKmluZm8sCi0JCQkJICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKmVwX2Rpc3RfbGlzdCkKLXsKLQlzdHJ1Y3QgaHRjX2VuZHBvaW50X2NyZWRpdF9kaXN0ICpjdXJkaXN0X2xpc3Q7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cmRpc3RfbGlzdCwgZXBfZGlzdF9saXN0LCBsaXN0KSB7Ci0JCWlmIChjdXJkaXN0X2xpc3QtPmVuZHBvaW50ID09IEVORFBPSU5UXzApCi0JCQljb250aW51ZTsKLQotCQlpZiAoKGN1cmRpc3RfbGlzdC0+c3ZjX2lkID09IFdNSV9EQVRBX0JLX1NWQykgIHx8Ci0JCSAgICAoY3VyZGlzdF9saXN0LT5zdmNfaWQgPT0gV01JX0RBVEFfQkVfU1ZDKSkKLQkJCWN1cmRpc3RfbGlzdC0+ZGlzdF9mbGFncyB8PSBIVENfRVBfQUNUSVZFOwotCi0JCWlmICgoY3VyZGlzdF9saXN0LT5zdmNfaWQgIT0gV01JX0NPTlRST0xfU1ZDKSAmJgotCQkgICAgIShjdXJkaXN0X2xpc3QtPmRpc3RfZmxhZ3MgJiBIVENfRVBfQUNUSVZFKSkgewotCQkJaWYgKGN1cmRpc3RfbGlzdC0+dHhxX2RlcHRoID09IDApCi0JCQkJYXRoNmtfcmVkdWNlX2NyZWRpdHMoaW5mbywKLQkJCQkJCWN1cmRpc3RfbGlzdCwgMCk7Ci0JCQllbHNlCi0JCQkJYXRoNmtfcmVkdWNlX2NyZWRpdHMoaW5mbywKLQkJCQkJCWN1cmRpc3RfbGlzdCwKLQkJCQkJCWN1cmRpc3RfbGlzdC0+Y3JlZF9taW4pOwotCQl9Ci0JfQotfQotCi0vKgotICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCB3aGVuZXZlciBlbmRwb2ludHMgcmVxdWlyZSBjcmVkaXQKLSAqIGRpc3RyaWJ1dGlvbnMuIEEgbG9jayBpcyBoZWxkIHdoaWxlIHRoaXMgZnVuY3Rpb24gaXMgaW52b2tlZCwgdGhpcwotICogZnVuY3Rpb24gc2hhbGwgTk9UIGJsb2NrLiBUaGUgZXBfZGlzdF9saXN0IGlzIGEgbGlzdCBvZiBkaXN0cmlidXRpb24KLSAqIHN0cnVjdHVyZXMgaW4gcHJpb3JpdGl6ZWQgb3JkZXIgYXMgZGVmaW5lZCBieSB0aGUgY2FsbCB0byB0aGUKLSAqIGh0Y19zZXRfY3JlZGl0X2Rpc3QoKSBhcGkuCi0gKi8KLXZvaWQgYXRoNmtfY3JlZGl0X2Rpc3RyaWJ1dGUoc3RydWN0IGh0Y19jcmVkaXRfc3RhdGVfaW5mbyAqY3JlZF9pbmZvLAotCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICplcF9kaXN0X2xpc3QsCi0JCQkgICAgIGVudW0gaHRjX2NyZWRpdF9kaXN0X3JlYXNvbiByZWFzb24pCi17Ci0Jc3dpdGNoIChyZWFzb24pIHsKLQljYXNlIEhUQ19DUkVESVRfRElTVF9TRU5EX0NPTVBMRVRFOgotCQlhdGg2a19jcmVkaXRfdXBkYXRlKGNyZWRfaW5mbywgZXBfZGlzdF9saXN0KTsKLQkJYnJlYWs7Ci0JY2FzZSBIVENfQ1JFRElUX0RJU1RfQUNUSVZJVFlfQ0hBTkdFOgotCQlhdGg2a19yZWRpc3RyaWJ1dGVfY3JlZGl0cyhjcmVkX2luZm8sIGVwX2Rpc3RfbGlzdCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCVdBUk5fT04oY3JlZF9pbmZvLT5jdXJfZnJlZV9jcmVkaXRzID4gY3JlZF9pbmZvLT50b3RhbF9hdmFpbF9jcmVkaXRzKTsKLQlXQVJOX09OKGNyZWRfaW5mby0+Y3VyX2ZyZWVfY3JlZGl0cyA8IDApOworCW5ldGlmX3dha2VfcXVldWUodmlmLT5uZGV2KTsKIH0KIAogdm9pZCBkaXNjb25uZWN0X3RpbWVyX2hhbmRsZXIodW5zaWduZWQgbG9uZyBwdHIpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKXB0cjsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlhdGg2a2xfaW5pdF9wcm9maWxlX2luZm8oYXIpOwotCWF0aDZrbF9kaXNjb25uZWN0KGFyKTsKKwlhdGg2a2xfaW5pdF9wcm9maWxlX2luZm8odmlmKTsKKwlhdGg2a2xfZGlzY29ubmVjdCh2aWYpOwogfQogCi12b2lkIGF0aDZrbF9kaXNjb25uZWN0KHN0cnVjdCBhdGg2a2wgKmFyKQordm9pZCBhdGg2a2xfZGlzY29ubmVjdChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewotCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykgfHwKLQkgICAgdGVzdF9iaXQoQ09OTkVDVF9QRU5ELCAmYXItPmZsYWcpKSB7Ci0JCWF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoYXItPndtaSk7CisJaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpIHx8CisJICAgIHRlc3RfYml0KENPTk5FQ1RfUEVORCwgJnZpZi0+ZmxhZ3MpKSB7CisJCWF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQodmlmLT5hci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgpOwogCQkvKgogCQkgKiBEaXNjb25uZWN0IGNvbW1hbmQgaXMgaXNzdWVkLCBjbGVhciB0aGUgY29ubmVjdCBwZW5kaW5nCiAJCSAqIGZsYWcuIFRoZSBjb25uZWN0ZWQgZmxhZyB3aWxsIGJlIGNsZWFyZWQgaW4KIAkJICogZGlzY29ubmVjdCBldmVudCBub3RpZmljYXRpb24uCiAJCSAqLwotCQljbGVhcl9iaXQoQ09OTkVDVF9QRU5ELCAmYXItPmZsYWcpOworCQljbGVhcl9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CiAJfQogfQogCi12b2lkIGF0aDZrbF9kZWVwX3NsZWVwX2VuYWJsZShzdHJ1Y3QgYXRoNmtsICphcikKLXsKLQlzd2l0Y2ggKGFyLT5zbWVfc3RhdGUpIHsKLQljYXNlIFNNRV9DT05ORUNUSU5HOgotCQljZmc4MDIxMV9jb25uZWN0X3Jlc3VsdChhci0+bmV0X2RldiwgYXItPmJzc2lkLCBOVUxMLCAwLAotCQkJCQlOVUxMLCAwLAotCQkJCQlXTEFOX1NUQVRVU19VTlNQRUNJRklFRF9GQUlMVVJFLAotCQkJCQlHRlBfS0VSTkVMKTsKLQkJYnJlYWs7Ci0JY2FzZSBTTUVfQ09OTkVDVEVEOgotCWRlZmF1bHQ6Ci0JCS8qCi0JCSAqIEZJWE1FOiBvZGRseSBlbm91Z2ggc21lU3RhdGUgaXMgaW4gRElTQ09OTkVDVEVEIGR1cmluZwotCQkgKiBzdXNwZW5kLCB3aHk/IE5lZWQgdG8gc2VuZCBkaXNjb25uZWN0ZWQgZXZlbnQgaW4gdGhhdAotCQkgKiBzdGF0ZS4KLQkJICovCi0JCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZChhci0+bmV0X2RldiwgMCwgTlVMTCwgMCwgR0ZQX0tFUk5FTCk7Ci0JCWJyZWFrOwotCX0KLQotCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZhci0+ZmxhZykgfHwKLQkgICAgdGVzdF9iaXQoQ09OTkVDVF9QRU5ELCAmYXItPmZsYWcpKQotCQlhdGg2a2xfd21pX2Rpc2Nvbm5lY3RfY21kKGFyLT53bWkpOwotCi0JYXItPnNtZV9zdGF0ZSA9IFNNRV9ESVNDT05ORUNURUQ7Ci0KLQkvKiBkaXNhYmxlIHNjYW5uaW5nICovCi0JaWYgKGF0aDZrbF93bWlfc2NhbnBhcmFtc19jbWQoYXItPndtaSwgMHhGRkZGLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCQkJCSAgICAgIDAsIDApICE9IDApCi0JCXByaW50ayhLRVJOX1dBUk5JTkcgImF0aDZrbDogZmFpbGVkIHRvIGRpc2FibGUgc2NhbiAiCi0JCSAgICAgICAiZHVyaW5nIHN1c3BlbmRcbiIpOwotCi0JYXRoNmtsX2NmZzgwMjExX3NjYW5fY29tcGxldGVfZXZlbnQoYXIsIC1FQ0FOQ0VMRUQpOwotfQotCiAvKiBXTUkgRXZlbnQgaGFuZGxlcnMgKi8KIAotc3RhdGljIGNvbnN0IGNoYXIgKmdldF9od19pZF9zdHJpbmcodTMyIGlkKQotewotCXN3aXRjaCAoaWQpIHsKLQljYXNlIEFSNjAwM19SRVYxX1ZFUlNJT046Ci0JCXJldHVybiAiMS4wIjsKLQljYXNlIEFSNjAwM19SRVYyX1ZFUlNJT046Ci0JCXJldHVybiAiMi4wIjsKLQljYXNlIEFSNjAwM19SRVYzX1ZFUlNJT046Ci0JCXJldHVybiAiMi4xLjEiOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAidW5rbm93biI7Ci0JfQotfQotCiB2b2lkIGF0aDZrbF9yZWFkeV9ldmVudCh2b2lkICpkZXZ0LCB1OCAqZGF0YXAsIHUzMiBzd192ZXIsIHUzMiBhYmlfdmVyKQogewogCXN0cnVjdCBhdGg2a2wgKmFyID0gZGV2dDsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYXItPm5ldF9kZXY7CiAKLQltZW1jcHkoZGV2LT5kZXZfYWRkciwgZGF0YXAsIEVUSF9BTEVOKTsKKwltZW1jcHkoYXItPm1hY19hZGRyLCBkYXRhcCwgRVRIX0FMRU4pOwogCWF0aDZrbF9kYmcoQVRINktMX0RCR19UUkMsICIlczogbWFjIGFkZHIgPSAlcE1cbiIsCi0JCSAgIF9fZnVuY19fLCBkZXYtPmRldl9hZGRyKTsKKwkJICAgX19mdW5jX18sIGFyLT5tYWNfYWRkcik7CiAKIAlhci0+dmVyc2lvbi53bGFuX3ZlciA9IHN3X3ZlcjsKIAlhci0+dmVyc2lvbi5hYmlfdmVyID0gYWJpX3ZlcjsKIAotCXNucHJpbnRmKGFyLT53ZGV2LT53aXBoeS0+ZndfdmVyc2lvbiwKLQkJIHNpemVvZihhci0+d2Rldi0+d2lwaHktPmZ3X3ZlcnNpb24pLAorCXNucHJpbnRmKGFyLT53aXBoeS0+ZndfdmVyc2lvbiwKKwkJIHNpemVvZihhci0+d2lwaHktPmZ3X3ZlcnNpb24pLAogCQkgIiV1LiV1LiV1LiV1IiwKIAkJIChhci0+dmVyc2lvbi53bGFuX3ZlciAmIDB4ZjAwMDAwMDApID4+IDI4LAogCQkgKGFyLT52ZXJzaW9uLndsYW5fdmVyICYgMHgwZjAwMDAwMCkgPj4gMjQsCkBAIC0xMDAwLDc5ICs1NDksODUgQEAKIAkvKiBpbmRpY2F0ZSB0byB0aGUgd2FpdGluZyB0aHJlYWQgdGhhdCB0aGUgcmVhZHkgZXZlbnQgd2FzIHJlY2VpdmVkICovCiAJc2V0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZyk7CiAJd2FrZV91cCgmYXItPmV2ZW50X3dxKTsKLQotCWF0aDZrbF9pbmZvKCJodyAlcyBmdyAlcyVzXG4iLAotCQkgICAgZ2V0X2h3X2lkX3N0cmluZyhhci0+d2Rldi0+d2lwaHktPmh3X3ZlcnNpb24pLAotCQkgICAgYXItPndkZXYtPndpcGh5LT5md192ZXJzaW9uLAotCQkgICAgdGVzdF9iaXQoVEVTVE1PREUsICZhci0+ZmxhZykgPyAiIHRlc3Rtb2RlIiA6ICIiKTsKIH0KIAotdm9pZCBhdGg2a2xfc2Nhbl9jb21wbGV0ZV9ldnQoc3RydWN0IGF0aDZrbCAqYXIsIGludCBzdGF0dXMpCit2b2lkIGF0aDZrbF9zY2FuX2NvbXBsZXRlX2V2dChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBpbnQgc3RhdHVzKQogewotCWF0aDZrbF9jZmc4MDIxMV9zY2FuX2NvbXBsZXRlX2V2ZW50KGFyLCBzdGF0dXMpOworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKKwlib29sIGFib3J0ZWQgPSBmYWxzZTsKKworCWlmIChzdGF0dXMgIT0gV01JX1NDQU5fU1RBVFVTX1NVQ0NFU1MpCisJCWFib3J0ZWQgPSB0cnVlOworCisJYXRoNmtsX2NmZzgwMjExX3NjYW5fY29tcGxldGVfZXZlbnQodmlmLCBhYm9ydGVkKTsKIAogCWlmICghYXItPnVzcl9ic3NfZmlsdGVyKSB7Ci0JCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmYXItPmZsYWcpOwotCQlhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoYXItPndtaSwgTk9ORV9CU1NfRklMVEVSLCAwKTsKKwkJY2xlYXJfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZ2aWYtPmZsYWdzKTsKKwkJYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJIE5PTkVfQlNTX0ZJTFRFUiwgMCk7CiAJfQogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fU0NBTiwgInNjYW4gY29tcGxldGU6ICVkXG4iLCBzdGF0dXMpOworCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX0NGRywgInNjYW4gY29tcGxldGU6ICVkXG4iLCBzdGF0dXMpOwogfQogCi12b2lkIGF0aDZrbF9jb25uZWN0X2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1MTYgY2hhbm5lbCwgdTggKmJzc2lkLAordm9pZCBhdGg2a2xfY29ubmVjdF9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1MTYgY2hhbm5lbCwgdTggKmJzc2lkLAogCQkJICB1MTYgbGlzdGVuX2ludCwgdTE2IGJlYWNvbl9pbnQsCiAJCQkgIGVudW0gbmV0d29ya190eXBlIG5ldF90eXBlLCB1OCBiZWFjb25faWVfbGVuLAogCQkJICB1OCBhc3NvY19yZXFfbGVuLCB1OCBhc3NvY19yZXNwX2xlbiwKIAkJCSAgdTggKmFzc29jX2luZm8pCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAKLQlhdGg2a2xfY2ZnODAyMTFfY29ubmVjdF9ldmVudChhciwgY2hhbm5lbCwgYnNzaWQsCisJYXRoNmtsX2NmZzgwMjExX2Nvbm5lY3RfZXZlbnQodmlmLCBjaGFubmVsLCBic3NpZCwKIAkJCQkgICAgICBsaXN0ZW5faW50LCBiZWFjb25faW50LAogCQkJCSAgICAgIG5ldF90eXBlLCBiZWFjb25faWVfbGVuLAogCQkJCSAgICAgIGFzc29jX3JlcV9sZW4sIGFzc29jX3Jlc3BfbGVuLAogCQkJCSAgICAgIGFzc29jX2luZm8pOwogCi0JbWVtY3B5KGFyLT5ic3NpZCwgYnNzaWQsIHNpemVvZihhci0+YnNzaWQpKTsKLQlhci0+YnNzX2NoID0gY2hhbm5lbDsKKwltZW1jcHkodmlmLT5ic3NpZCwgYnNzaWQsIHNpemVvZih2aWYtPmJzc2lkKSk7CisJdmlmLT5ic3NfY2ggPSBjaGFubmVsOwogCi0JaWYgKChhci0+bndfdHlwZSA9PSBJTkZSQV9ORVRXT1JLKSkKLQkJYXRoNmtsX3dtaV9saXN0ZW5pbnRlcnZhbF9jbWQoYXItPndtaSwgYXItPmxpc3Rlbl9pbnR2bF90LAorCWlmICgodmlmLT5ud190eXBlID09IElORlJBX05FVFdPUkspKQorCQlhdGg2a2xfd21pX2xpc3RlbmludGVydmFsX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSAgICAgIGFyLT5saXN0ZW5faW50dmxfdCwKIAkJCQkJICAgICAgYXItPmxpc3Rlbl9pbnR2bF9iKTsKIAotCW5ldGlmX3dha2VfcXVldWUoYXItPm5ldF9kZXYpOworCW5ldGlmX3dha2VfcXVldWUodmlmLT5uZGV2KTsKIAogCS8qIFVwZGF0ZSBjb25uZWN0ICYgbGluayBzdGF0dXMgYXRvbWljYWxseSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZhci0+bG9jaywgZmxhZ3MpOwotCXNldF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpOwotCWNsZWFyX2JpdChDT05ORUNUX1BFTkQsICZhci0+ZmxhZyk7Ci0JbmV0aWZfY2Fycmllcl9vbihhci0+bmV0X2Rldik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXItPmxvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfYmgoJnZpZi0+aWZfbG9jayk7CisJc2V0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKTsKKwljbGVhcl9iaXQoQ09OTkVDVF9QRU5ELCAmdmlmLT5mbGFncyk7CisJbmV0aWZfY2Fycmllcl9vbih2aWYtPm5kZXYpOworCXNwaW5fdW5sb2NrX2JoKCZ2aWYtPmlmX2xvY2spOwogCi0JYWdncl9yZXNldF9zdGF0ZShhci0+YWdncl9jbnR4dCk7Ci0JYXItPnJlY29ubmVjdF9mbGFnID0gMDsKKwlhZ2dyX3Jlc2V0X3N0YXRlKHZpZi0+YWdncl9jbnR4dCk7CisJdmlmLT5yZWNvbm5lY3RfZmxhZyA9IDA7CiAKLQlpZiAoKGFyLT5ud190eXBlID09IEFESE9DX05FVFdPUkspICYmIGFyLT5pYnNzX3BzX2VuYWJsZSkgeworCWlmICgodmlmLT5ud190eXBlID09IEFESE9DX05FVFdPUkspICYmIGFyLT5pYnNzX3BzX2VuYWJsZSkgewogCQltZW1zZXQoYXItPm5vZGVfbWFwLCAwLCBzaXplb2YoYXItPm5vZGVfbWFwKSk7CiAJCWFyLT5ub2RlX251bSA9IDA7CiAJCWFyLT5uZXh0X2VwX2lkID0gRU5EUE9JTlRfMjsKIAl9CiAKIAlpZiAoIWFyLT51c3JfYnNzX2ZpbHRlcikgewotCQlzZXRfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZhci0+ZmxhZyk7Ci0JCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCBDVVJSRU5UX0JTU19GSUxURVIsIDApOworCQlzZXRfYml0KENMRUFSX0JTU0ZJTFRFUl9PTl9CRUFDT04sICZ2aWYtPmZsYWdzKTsKKwkJYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJIENVUlJFTlRfQlNTX0ZJTFRFUiwgMCk7CiAJfQogfQogCi12b2lkIGF0aDZrbF90a2lwX21pY2Vycl9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTgga2V5aWQsIGJvb2wgaXNtY2FzdCkKK3ZvaWQgYXRoNmtsX3RraXBfbWljZXJyX2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IGtleWlkLCBib29sIGlzbWNhc3QpCiB7CiAJc3RydWN0IGF0aDZrbF9zdGEgKnN0YTsKKwlzdHJ1Y3QgYXRoNmtsICphciA9IHZpZi0+YXI7CiAJdTggdHNjWzZdOworCiAJLyoKIAkgKiBGb3IgQVAgY2FzZSwga2V5aWQgd2lsbCBoYXZlIGFpZCBvZiBTVEEgd2hpY2ggc2VudCBwa3Qgd2l0aAogCSAqIE1JQyBlcnJvci4gVXNlIHRoaXMgYWlkIHRvIGdldCBNQUMgJiBzZW5kIGl0IHRvIGhvc3RhcGQuCiAJICovCi0JaWYgKGFyLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKIAkJc3RhID0gYXRoNmtsX2ZpbmRfc3RhX2J5X2FpZChhciwgKGtleWlkID4+IDIpKTsKIAkJaWYgKCFzdGEpCiAJCQlyZXR1cm47CkBAIC0xMDgxLDE5ICs2MzYsMjAgQEAKIAkJCSAgICJhcCB0a2lwIG1pYyBlcnJvciByZWNlaXZlZCBmcm9tIGFpZD0lZFxuIiwga2V5aWQpOwogCiAJCW1lbXNldCh0c2MsIDAsIHNpemVvZih0c2MpKTsgLyogRklYOiBnZXQgY29ycmVjdCBUU0MgKi8KLQkJY2ZnODAyMTFfbWljaGFlbF9taWNfZmFpbHVyZShhci0+bmV0X2Rldiwgc3RhLT5tYWMsCisJCWNmZzgwMjExX21pY2hhZWxfbWljX2ZhaWx1cmUodmlmLT5uZGV2LCBzdGEtPm1hYywKIAkJCQkJICAgICBOTDgwMjExX0tFWVRZUEVfUEFJUldJU0UsIGtleWlkLAogCQkJCQkgICAgIHRzYywgR0ZQX0tFUk5FTCk7CiAJfSBlbHNlCi0JCWF0aDZrbF9jZmc4MDIxMV90a2lwX21pY2Vycl9ldmVudChhciwga2V5aWQsIGlzbWNhc3QpOworCQlhdGg2a2xfY2ZnODAyMTFfdGtpcF9taWNlcnJfZXZlbnQodmlmLCBrZXlpZCwgaXNtY2FzdCk7CiAKIH0KIAotc3RhdGljIHZvaWQgYXRoNmtsX3VwZGF0ZV90YXJnZXRfc3RhdHMoc3RydWN0IGF0aDZrbCAqYXIsIHU4ICpwdHIsIHUzMiBsZW4pCitzdGF0aWMgdm9pZCBhdGg2a2xfdXBkYXRlX3RhcmdldF9zdGF0cyhzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCAqcHRyLCB1MzIgbGVuKQogewogCXN0cnVjdCB3bWlfdGFyZ2V0X3N0YXRzICp0Z3Rfc3RhdHMgPQogCQkoc3RydWN0IHdtaV90YXJnZXRfc3RhdHMgKikgcHRyOwotCXN0cnVjdCB0YXJnZXRfc3RhdHMgKnN0YXRzID0gJmFyLT50YXJnZXRfc3RhdHM7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOworCXN0cnVjdCB0YXJnZXRfc3RhdHMgKnN0YXRzID0gJnZpZi0+dGFyZ2V0X3N0YXRzOwogCXN0cnVjdCB0a2lwX2NjbXBfc3RhdHMgKmNjbXBfc3RhdHM7CiAJdTggYWM7CiAKQEAgLTExODksOCArNzQ1LDggQEAKIAlzdGF0cy0+d293X2V2dF9kaXNjYXJkZWQgKz0KIAkJbGUxNl90b19jcHUodGd0X3N0YXRzLT53b3dfc3RhdHMud293X2V2dF9kaXNjYXJkZWQpOwogCi0JaWYgKHRlc3RfYml0KFNUQVRTX1VQREFURV9QRU5ELCAmYXItPmZsYWcpKSB7Ci0JCWNsZWFyX2JpdChTVEFUU19VUERBVEVfUEVORCwgJmFyLT5mbGFnKTsKKwlpZiAodGVzdF9iaXQoU1RBVFNfVVBEQVRFX1BFTkQsICZ2aWYtPmZsYWdzKSkgeworCQljbGVhcl9iaXQoU1RBVFNfVVBEQVRFX1BFTkQsICZ2aWYtPmZsYWdzKTsKIAkJd2FrZV91cCgmYXItPmV2ZW50X3dxKTsKIAl9CiB9CkBAIC0xMjAwLDE0ICs3NTYsMTUgQEAKIAkqdmFyID0gY3B1X3RvX2xlMzIobGUzMl90b19jcHUoKnZhcikgKyBsZTMyX3RvX2NwdSh2YWwpKTsKIH0KIAotdm9pZCBhdGg2a2xfdGd0X3N0YXRzX2V2ZW50KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqcHRyLCB1MzIgbGVuKQordm9pZCBhdGg2a2xfdGd0X3N0YXRzX2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4ICpwdHIsIHUzMiBsZW4pCiB7CiAJc3RydWN0IHdtaV9hcF9tb2RlX3N0YXQgKnAgPSAoc3RydWN0IHdtaV9hcF9tb2RlX3N0YXQgKikgcHRyOworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAlzdHJ1Y3Qgd21pX2FwX21vZGVfc3RhdCAqYXAgPSAmYXItPmFwX3N0YXRzOwogCXN0cnVjdCB3bWlfcGVyX3N0YV9zdGF0ICpzdF9hcCwgKnN0X3A7CiAJdTggYWM7CiAKLQlpZiAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykgeworCWlmICh2aWYtPm53X3R5cGUgPT0gQVBfTkVUV09SSykgewogCQlpZiAobGVuIDwgc2l6ZW9mKCpwKSkKIAkJCXJldHVybjsKIApAQCAtMTIyNiw3ICs3ODMsNyBAQAogCQl9CiAKIAl9IGVsc2UgewotCQlhdGg2a2xfdXBkYXRlX3RhcmdldF9zdGF0cyhhciwgcHRyLCBsZW4pOworCQlhdGg2a2xfdXBkYXRlX3RhcmdldF9zdGF0cyh2aWYsIHB0ciwgbGVuKTsKIAl9CiB9CiAKQEAgLTEyNDUsMTEgKzgwMiwxMiBAQAogCXdha2VfdXAoJmFyLT5ldmVudF93cSk7CiB9CiAKLXZvaWQgYXRoNmtsX3BzcG9sbF9ldmVudChzdHJ1Y3QgYXRoNmtsICphciwgdTggYWlkKQordm9pZCBhdGg2a2xfcHNwb2xsX2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsIHU4IGFpZCkKIHsKIAlzdHJ1Y3QgYXRoNmtsX3N0YSAqY29ubjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWJvb2wgcHNxX2VtcHR5ID0gZmFsc2U7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCiAJY29ubiA9IGF0aDZrbF9maW5kX3N0YV9ieV9haWQoYXIsIGFpZCk7CiAKQEAgLTEyNzIsNyArODMwLDcgQEAKIAlzcGluX3VubG9ja19iaCgmY29ubi0+cHNxX2xvY2spOwogCiAJY29ubi0+c3RhX2ZsYWdzIHw9IFNUQV9QU19QT0xMRUQ7Ci0JYXRoNmtsX2RhdGFfdHgoc2tiLCBhci0+bmV0X2Rldik7CisJYXRoNmtsX2RhdGFfdHgoc2tiLCB2aWYtPm5kZXYpOwogCWNvbm4tPnN0YV9mbGFncyAmPSB+U1RBX1BTX1BPTExFRDsKIAogCXNwaW5fbG9ja19iaCgmY29ubi0+cHNxX2xvY2spOwpAQCAtMTI4MCwxMyArODM4LDE0IEBACiAJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnBzcV9sb2NrKTsKIAogCWlmIChwc3FfZW1wdHkpCi0JCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwgY29ubi0+YWlkLCAwKTsKKwkJYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIGNvbm4tPmFpZCwgMCk7CiB9CiAKLXZvaWQgYXRoNmtsX2R0aW1leHBpcnlfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIpCit2b2lkIGF0aDZrbF9kdGltZXhwaXJ5X2V2ZW50KHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJYm9vbCBtY2FzdHFfZW1wdHkgPSBmYWxzZTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBhdGg2a2wgKmFyID0gdmlmLT5hcjsKIAogCS8qCiAJICogSWYgdGhlcmUgYXJlIG5vIGFzc29jaWF0ZWQgU1RBcywgaWdub3JlIHRoZSBEVElNIGV4cGlyeSBldmVudC4KQEAgLTEzMDgsMzEgKzg2NywzMSBAQAogCQlyZXR1cm47CiAKIAkvKiBzZXQgdGhlIFNUQSBmbGFnIHRvIGR0aW1fZXhwaXJlZCBmb3IgdGhlIGZyYW1lIHRvIGdvIG91dCAqLwotCXNldF9iaXQoRFRJTV9FWFBJUkVELCAmYXItPmZsYWcpOworCXNldF9iaXQoRFRJTV9FWFBJUkVELCAmdmlmLT5mbGFncyk7CiAKIAlzcGluX2xvY2tfYmgoJmFyLT5tY2FzdHBzcV9sb2NrKTsKIAl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZhci0+bWNhc3Rwc3EpKSAhPSBOVUxMKSB7CiAJCXNwaW5fdW5sb2NrX2JoKCZhci0+bWNhc3Rwc3FfbG9jayk7CiAKLQkJYXRoNmtsX2RhdGFfdHgoc2tiLCBhci0+bmV0X2Rldik7CisJCWF0aDZrbF9kYXRhX3R4KHNrYiwgdmlmLT5uZGV2KTsKIAogCQlzcGluX2xvY2tfYmgoJmFyLT5tY2FzdHBzcV9sb2NrKTsKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmFyLT5tY2FzdHBzcV9sb2NrKTsKIAotCWNsZWFyX2JpdChEVElNX0VYUElSRUQsICZhci0+ZmxhZyk7CisJY2xlYXJfYml0KERUSU1fRVhQSVJFRCwgJnZpZi0+ZmxhZ3MpOwogCiAJLyogY2xlYXIgdGhlIExTQiBvZiB0aGUgQml0TWFwQ3RsIGZpZWxkIG9mIHRoZSBUSU0gSUUgKi8KLQlhdGg2a2xfd21pX3NldF9wdmJfY21kKGFyLT53bWksIE1DQVNUX0FJRCwgMCk7CisJYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsIE1DQVNUX0FJRCwgMCk7CiB9CiAKLXZvaWQgYXRoNmtsX2Rpc2Nvbm5lY3RfZXZlbnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHJlYXNvbiwgdTggKmJzc2lkLAordm9pZCBhdGg2a2xfZGlzY29ubmVjdF9ldmVudChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCB1OCByZWFzb24sIHU4ICpic3NpZCwKIAkJCSAgICAgdTggYXNzb2NfcmVzcF9sZW4sIHU4ICphc3NvY19pbmZvLAogCQkJICAgICB1MTYgcHJvdF9yZWFzb25fc3RhdHVzKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCi0JaWYgKGFyLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKIAkJaWYgKCFhdGg2a2xfcmVtb3ZlX3N0YShhciwgYnNzaWQsIHByb3RfcmVhc29uX3N0YXR1cykpCiAJCQlyZXR1cm47CiAKQEAgLTEzNDQsMzEgKzkwMywzMSBAQAogCiAJCQkvKiBjbGVhciB0aGUgTFNCIG9mIHRoZSBUSU0gSUUncyBCaXRNYXBDdGwgZmllbGQgKi8KIAkJCWlmICh0ZXN0X2JpdChXTUlfUkVBRFksICZhci0+ZmxhZykpCi0JCQkJYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChhci0+d21pLCBNQ0FTVF9BSUQsIDApOworCQkJCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwgdmlmLT5md192aWZfaWR4LAorCQkJCQkJICAgICAgIE1DQVNUX0FJRCwgMCk7CiAJCX0KIAogCQlpZiAoIWlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGJzc2lkKSkgewogCQkJLyogc2VuZCBldmVudCB0byBhcHBsaWNhdGlvbiAqLwotCQkJY2ZnODAyMTFfZGVsX3N0YShhci0+bmV0X2RldiwgYnNzaWQsIEdGUF9LRVJORUwpOworCQkJY2ZnODAyMTFfZGVsX3N0YSh2aWYtPm5kZXYsIGJzc2lkLCBHRlBfS0VSTkVMKTsKIAkJfQogCi0JCWlmIChtZW1jbXAoYXItPm5ldF9kZXYtPmRldl9hZGRyLCBic3NpZCwgRVRIX0FMRU4pID09IDApIHsKLQkJCW1lbXNldChhci0+d2VwX2tleV9saXN0LCAwLCBzaXplb2YoYXItPndlcF9rZXlfbGlzdCkpOwotCQkJY2xlYXJfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKTsKKwkJaWYgKG1lbWNtcCh2aWYtPm5kZXYtPmRldl9hZGRyLCBic3NpZCwgRVRIX0FMRU4pID09IDApIHsKKwkJCW1lbXNldCh2aWYtPndlcF9rZXlfbGlzdCwgMCwgc2l6ZW9mKHZpZi0+d2VwX2tleV9saXN0KSk7CisJCQljbGVhcl9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncyk7CiAJCX0KIAkJcmV0dXJuOwogCX0KIAotCWF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KGFyLCByZWFzb24sIGJzc2lkLAorCWF0aDZrbF9jZmc4MDIxMV9kaXNjb25uZWN0X2V2ZW50KHZpZiwgcmVhc29uLCBic3NpZCwKIAkJCQkgICAgICAgYXNzb2NfcmVzcF9sZW4sIGFzc29jX2luZm8sCiAJCQkJICAgICAgIHByb3RfcmVhc29uX3N0YXR1cyk7CiAKLQlhZ2dyX3Jlc2V0X3N0YXRlKGFyLT5hZ2dyX2NudHh0KTsKKwlhZ2dyX3Jlc2V0X3N0YXRlKHZpZi0+YWdncl9jbnR4dCk7CiAKLQlkZWxfdGltZXIoJmFyLT5kaXNjb25uZWN0X3RpbWVyKTsKKwlkZWxfdGltZXIoJnZpZi0+ZGlzY29ubmVjdF90aW1lcik7CiAKLQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV0xBTl9DT05ORUNULAotCQkgICAiZGlzY29ubmVjdCByZWFzb24gaXMgJWRcbiIsIHJlYXNvbik7CisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fQ0ZHLCAiZGlzY29ubmVjdCByZWFzb24gaXMgJWRcbiIsIHJlYXNvbik7CiAKIAkvKgogCSAqIElmIHRoZSBldmVudCBpcyBkdWUgdG8gZGlzY29ubmVjdCBjbWQgZnJvbSB0aGUgaG9zdCwgb25seSB0aGV5CkBAIC0xMzc3LDgzICs5MzYsODggQEAKIAkgKi8KIAlpZiAocmVhc29uID09IERJU0NPTk5FQ1RfQ01EKSB7CiAJCWlmICghYXItPnVzcl9ic3NfZmlsdGVyICYmIHRlc3RfYml0KFdNSV9SRUFEWSwgJmFyLT5mbGFnKSkKLQkJCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCBOT05FX0JTU19GSUxURVIsIDApOworCQkJYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJCSBOT05FX0JTU19GSUxURVIsIDApOwogCX0gZWxzZSB7Ci0JCXNldF9iaXQoQ09OTkVDVF9QRU5ELCAmYXItPmZsYWcpOworCQlzZXRfYml0KENPTk5FQ1RfUEVORCwgJnZpZi0+ZmxhZ3MpOwogCQlpZiAoKChyZWFzb24gPT0gQVNTT0NfRkFJTEVEKSAmJgogCQkgICAgKHByb3RfcmVhc29uX3N0YXR1cyA9PSAweDExKSkgfHwKIAkJICAgICgocmVhc29uID09IEFTU09DX0ZBSUxFRCkgJiYgKHByb3RfcmVhc29uX3N0YXR1cyA9PSAweDApCi0JCSAgICAgJiYgKGFyLT5yZWNvbm5lY3RfZmxhZyA9PSAxKSkpIHsKLQkJCXNldF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpOworCQkgICAgICYmICh2aWYtPnJlY29ubmVjdF9mbGFnID09IDEpKSkgeworCQkJc2V0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKTsKIAkJCXJldHVybjsKIAkJfQogCX0KIAogCS8qIHVwZGF0ZSBjb25uZWN0ICYgbGluayBzdGF0dXMgYXRvbWljYWxseSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZhci0+bG9jaywgZmxhZ3MpOwotCWNsZWFyX2JpdChDT05ORUNURUQsICZhci0+ZmxhZyk7Ci0JbmV0aWZfY2Fycmllcl9vZmYoYXItPm5ldF9kZXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyLT5sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZ2aWYtPmlmX2xvY2spOworCWNsZWFyX2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKTsKKwluZXRpZl9jYXJyaWVyX29mZih2aWYtPm5kZXYpOworCXNwaW5fdW5sb2NrX2JoKCZ2aWYtPmlmX2xvY2spOwogCi0JaWYgKChyZWFzb24gIT0gQ1NFUlZfRElTQ09OTkVDVCkgfHwgKGFyLT5yZWNvbm5lY3RfZmxhZyAhPSAxKSkKLQkJYXItPnJlY29ubmVjdF9mbGFnID0gMDsKKwlpZiAoKHJlYXNvbiAhPSBDU0VSVl9ESVNDT05ORUNUKSB8fCAodmlmLT5yZWNvbm5lY3RfZmxhZyAhPSAxKSkKKwkJdmlmLT5yZWNvbm5lY3RfZmxhZyA9IDA7CiAKIAlpZiAocmVhc29uICE9IENTRVJWX0RJU0NPTk5FQ1QpCiAJCWFyLT51c2VyX2tleV9jdHJsID0gMDsKIAotCW5ldGlmX3N0b3BfcXVldWUoYXItPm5ldF9kZXYpOwotCW1lbXNldChhci0+YnNzaWQsIDAsIHNpemVvZihhci0+YnNzaWQpKTsKLQlhci0+YnNzX2NoID0gMDsKKwluZXRpZl9zdG9wX3F1ZXVlKHZpZi0+bmRldik7CisJbWVtc2V0KHZpZi0+YnNzaWQsIDAsIHNpemVvZih2aWYtPmJzc2lkKSk7CisJdmlmLT5ic3NfY2ggPSAwOwogCiAJYXRoNmtsX3R4X2RhdGFfY2xlYW51cChhcik7CiB9CiAKK3N0cnVjdCBhdGg2a2xfdmlmICphdGg2a2xfdmlmX2ZpcnN0KHN0cnVjdCBhdGg2a2wgKmFyKQoreworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CisKKwlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCWlmIChsaXN0X2VtcHR5KCZhci0+dmlmX2xpc3QpKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJdmlmID0gbGlzdF9maXJzdF9lbnRyeSgmYXItPnZpZl9saXN0LCBzdHJ1Y3QgYXRoNmtsX3ZpZiwgbGlzdCk7CisKKwlzcGluX3VubG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisKKwlyZXR1cm4gdmlmOworfQorCiBzdGF0aWMgaW50IGF0aDZrbF9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSBhdGg2a2xfcHJpdihkZXYpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGF0aDZrbF92aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXItPmxvY2ssIGZsYWdzKTsKKwlzZXRfYml0KFdMQU5fRU5BQkxFRCwgJnZpZi0+ZmxhZ3MpOwogCi0Jc2V0X2JpdChXTEFOX0VOQUJMRUQsICZhci0+ZmxhZyk7Ci0KLQlpZiAodGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKSB7CisJaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJnZpZi0+ZmxhZ3MpKSB7CiAJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKIAkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwogCX0gZWxzZQogCQluZXRpZl9jYXJyaWVyX29mZihkZXYpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXItPmxvY2ssIGZsYWdzKTsKLQogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGF0aDZrbF9jbG9zZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKIAotCWF0aDZrbF9kaXNjb25uZWN0KGFyKTsKKwlhdGg2a2xfY2ZnODAyMTFfc3RvcCh2aWYpOwogCi0JaWYgKHRlc3RfYml0KFdNSV9SRUFEWSwgJmFyLT5mbGFnKSkgewotCQlpZiAoYXRoNmtsX3dtaV9zY2FucGFyYW1zX2NtZChhci0+d21pLCAweEZGRkYsIDAsIDAsIDAsIDAsIDAsIDAsCi0JCQkJCSAgICAgIDAsIDAsIDApKQotCQkJcmV0dXJuIC1FSU87Ci0KLQkJY2xlYXJfYml0KFdMQU5fRU5BQkxFRCwgJmFyLT5mbGFnKTsKLQl9Ci0KLQlhdGg2a2xfY2ZnODAyMTFfc2Nhbl9jb21wbGV0ZV9ldmVudChhciwgLUVDQU5DRUxFRCk7CisJY2xlYXJfYml0KFdMQU5fRU5BQkxFRCwgJnZpZi0+ZmxhZ3MpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqYXRoNmtsX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCBhdGg2a2wgKmFyID0gYXRoNmtsX3ByaXYoZGV2KTsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAotCXJldHVybiAmYXItPm5ldF9zdGF0czsKKwlyZXR1cm4gJnZpZi0+bmV0X3N0YXRzOwogfQogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfb3BzIGF0aDZrbF9uZXRkZXZfb3BzID0gewpAQCAtMTQ2Niw2ICsxMDMwLDcgQEAKIHZvaWQgaW5pdF9uZXRkZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlkZXYtPm5ldGRldl9vcHMgPSAmYXRoNmtsX25ldGRldl9vcHM7CisJZGV2LT5kZXN0cnVjdG9yID0gZnJlZV9uZXRkZXY7CiAJZGV2LT53YXRjaGRvZ190aW1lbyA9IEFUSDZLTF9UWF9USU1FT1VUOwogCiAJZGV2LT5uZWVkZWRfaGVhZHJvb20gPSBFVEhfSExFTjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9zZGlvLmMKaW5kZXggMDY2ZDRmOC4uOTQ3NWUyZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC9zZGlvLmMKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19pZHMuaD4KICNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpby5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZC5oPgotI2luY2x1ZGUgImh0Y19oaWYuaCIKKyNpbmNsdWRlICJoaWYuaCIKICNpbmNsdWRlICJoaWYtb3BzLmgiCiAjaW5jbHVkZSAidGFyZ2V0LmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTQwLDEyICs0MCwxOCBAQAogCXN0cnVjdCBidXNfcmVxdWVzdCBidXNfcmVxW0JVU19SRVFVRVNUX01BWF9OVU1dOwogCiAJc3RydWN0IGF0aDZrbCAqYXI7CisKIAl1OCAqZG1hX2J1ZmZlcjsKIAorCS8qIHByb3RlY3RzIGFjY2VzcyB0byBkbWFfYnVmZmVyICovCisJc3RydWN0IG11dGV4IGRtYV9idWZmZXJfbXV0ZXg7CisKIAkvKiBzY2F0dGVyIHJlcXVlc3QgbGlzdCBoZWFkICovCiAJc3RydWN0IGxpc3RfaGVhZCBzY2F0X3JlcTsKIAogCXNwaW5sb2NrX3Qgc2NhdF9sb2NrOworCWJvb2wgc2NhdHRlcl9lbmFibGVkOworCiAJYm9vbCBpc19kaXNhYmxlZDsKIAlhdG9taWNfdCBpcnFfaGFuZGxpbmc7CiAJY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkICppZDsKQEAgLTEzNSw2ICsxNDEsOCBAQAogewogCWludCByZXQgPSAwOwogCisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCiAJaWYgKHJlcXVlc3QgJiBISUZfV1JJVEUpIHsKIAkJLyogRklYTUU6IGxvb2tzIGxpa2UgdWdseSB3b3JrYXJvdW5kIGZvciBzb21ldGhpbmcgKi8KIAkJaWYgKGFkZHIgPj0gSElGX01CT1hfQkFTRV9BRERSICYmCkBAIC0xNTYsNiArMTY0LDggQEAKIAkJCXJldCA9IHNkaW9fbWVtY3B5X2Zyb21pbyhmdW5jLCBidWYsIGFkZHIsIGxlbik7CiAJfQogCisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU0RJTywgIiVzIGFkZHIgMHgleCVzIGJ1ZiAweCVwIGxlbiAlZFxuIiwKIAkJICAgcmVxdWVzdCAmIEhJRl9XUklURSA/ICJ3ciIgOiAicmQiLCBhZGRyLAogCQkgICByZXF1ZXN0ICYgSElGX0ZJWEVEX0FERFJFU1MgPyAiIChmaXhlZCkiIDogIiIsIGJ1ZiwgbGVuKTsKQEAgLTE2NywxMiArMTc3LDExIEBACiBzdGF0aWMgc3RydWN0IGJ1c19yZXF1ZXN0ICphdGg2a2xfc2Rpb19hbGxvY19idXNyZXEoc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvKQogewogCXN0cnVjdCBidXNfcmVxdWVzdCAqYnVzX3JlcTsKLQl1bnNpZ25lZCBsb25nIGZsYWc7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJfc2Rpby0+bG9jaywgZmxhZyk7CisJc3Bpbl9sb2NrX2JoKCZhcl9zZGlvLT5sb2NrKTsKIAogCWlmIChsaXN0X2VtcHR5KCZhcl9zZGlvLT5idXNfcmVxX2ZyZWVxKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT5sb2NrLCBmbGFnKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPmxvY2spOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTE4MCw3ICsxODksNyBAQAogCQkJCSAgIHN0cnVjdCBidXNfcmVxdWVzdCwgbGlzdCk7CiAJbGlzdF9kZWwoJmJ1c19yZXEtPmxpc3QpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJfc2Rpby0+bG9jaywgZmxhZyk7CisJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPmxvY2spOwogCWF0aDZrbF9kYmcoQVRINktMX0RCR19TQ0FUVEVSLCAiJXM6IGJ1cyByZXF1ZXN0IDB4JXBcbiIsCiAJCSAgIF9fZnVuY19fLCBidXNfcmVxKTsKIApAQCAtMTkwLDE0ICsxOTksMTIgQEAKIHN0YXRpYyB2b2lkIGF0aDZrbF9zZGlvX2ZyZWVfYnVzX3JlcShzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8sCiAJCQkJICAgICBzdHJ1Y3QgYnVzX3JlcXVlc3QgKmJ1c19yZXEpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnOwotCiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NDQVRURVIsICIlczogYnVzIHJlcXVlc3QgMHglcFxuIiwKIAkJICAgX19mdW5jX18sIGJ1c19yZXEpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFyX3NkaW8tPmxvY2ssIGZsYWcpOworCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+bG9jayk7CiAJbGlzdF9hZGRfdGFpbCgmYnVzX3JlcS0+bGlzdCwgJmFyX3NkaW8tPmJ1c19yZXFfZnJlZXEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPmxvY2ssIGZsYWcpOworCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT5sb2NrKTsKIH0KIAogc3RhdGljIHZvaWQgYXRoNmtsX3NkaW9fc2V0dXBfc2NhdF9kYXRhKHN0cnVjdCBoaWZfc2NhdHRlcl9yZXEgKnNjYXRfcmVxLApAQCAtMjkxLDEwICsyOTgsMTQgQEAKIAltbWNfcmVxLmNtZCA9ICZjbWQ7CiAJbW1jX3JlcS5kYXRhID0gJmRhdGE7CiAKKwlzZGlvX2NsYWltX2hvc3QoYXJfc2Rpby0+ZnVuYyk7CisKIAltbWNfc2V0X2RhdGFfdGltZW91dCgmZGF0YSwgYXJfc2Rpby0+ZnVuYy0+Y2FyZCk7CiAJLyogc3luY2hyb25vdXMgY2FsbCB0byBwcm9jZXNzIHJlcXVlc3QgKi8KIAltbWNfd2FpdF9mb3JfcmVxKGFyX3NkaW8tPmZ1bmMtPmNhcmQtPmhvc3QsICZtbWNfcmVxKTsKIAorCXNkaW9fcmVsZWFzZV9ob3N0KGFyX3NkaW8tPmZ1bmMpOworCiAJc3RhdHVzID0gY21kLmVycm9yID8gY21kLmVycm9yIDogZGF0YS5lcnJvcjsKIAogc2NhdF9jb21wbGV0ZToKQEAgLTM4OSwxNyArNDAwLDE5IEBACiAJaWYgKGJ1Zl9uZWVkc19ib3VuY2UoYnVmKSkgewogCQlpZiAoIWFyX3NkaW8tPmRtYV9idWZmZXIpCiAJCQlyZXR1cm4gLUVOT01FTTsKKwkJbXV0ZXhfbG9jaygmYXJfc2Rpby0+ZG1hX2J1ZmZlcl9tdXRleCk7CiAJCXRidWYgPSBhcl9zZGlvLT5kbWFfYnVmZmVyOwogCQltZW1jcHkodGJ1ZiwgYnVmLCBsZW4pOwogCQlib3VuY2VkID0gdHJ1ZTsKIAl9IGVsc2UKIAkJdGJ1ZiA9IGJ1ZjsKIAotCXNkaW9fY2xhaW1faG9zdChhcl9zZGlvLT5mdW5jKTsKIAlyZXQgPSBhdGg2a2xfc2Rpb19pbyhhcl9zZGlvLT5mdW5jLCByZXF1ZXN0LCBhZGRyLCB0YnVmLCBsZW4pOwogCWlmICgocmVxdWVzdCAmIEhJRl9SRUFEKSAmJiBib3VuY2VkKQogCQltZW1jcHkoYnVmLCB0YnVmLCBsZW4pOwotCXNkaW9fcmVsZWFzZV9ob3N0KGFyX3NkaW8tPmZ1bmMpOworCisJaWYgKGJvdW5jZWQpCisJCW11dGV4X3VubG9jaygmYXJfc2Rpby0+ZG1hX2J1ZmZlcl9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNDE4LDI5ICs0MzEsMjUgQEAKIAkJCQkJCSAgICAgcmVxLT5yZXF1ZXN0KTsKIAkJY29udGV4dCA9IHJlcS0+cGFja2V0OwogCQlhdGg2a2xfc2Rpb19mcmVlX2J1c19yZXEoYXJfc2RpbywgcmVxKTsKLQkJYXRoNmtsZGV2X3J3X2NvbXBfaGFuZGxlcihjb250ZXh0LCBzdGF0dXMpOworCQlhdGg2a2xfaGlmX3J3X2NvbXBfaGFuZGxlcihjb250ZXh0LCBzdGF0dXMpOwogCX0KIH0KIAogc3RhdGljIHZvaWQgYXRoNmtsX3NkaW9fd3JpdGVfYXN5bmNfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7CiAJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGJ1c19yZXF1ZXN0ICpyZXEsICp0bXBfcmVxOwogCiAJYXJfc2RpbyA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYXRoNmtsX3NkaW8sIHdyX2FzeW5jX3dvcmspOwotCXNkaW9fY2xhaW1faG9zdChhcl9zZGlvLT5mdW5jKTsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZhcl9zZGlvLT53cl9hc3luY19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVxLCB0bXBfcmVxLCAmYXJfc2Rpby0+d3JfYXN5bmNxLCBsaXN0KSB7CiAJCWxpc3RfZGVsKCZyZXEtPmxpc3QpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7CisJCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT53cl9hc3luY19sb2NrKTsKIAkJX19hdGg2a2xfc2Rpb193cml0ZV9hc3luYyhhcl9zZGlvLCByZXEpOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jaywgZmxhZ3MpOworCQlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7Ci0KLQlzZGlvX3JlbGVhc2VfaG9zdChhcl9zZGlvLT5mdW5jKTsKKwlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jayk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDZrbF9zZGlvX2lycV9oYW5kbGVyKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCkBAIC00NTksMjAgKzQ2OCwyMyBAQAogCSAqLwogCXNkaW9fcmVsZWFzZV9ob3N0KGFyX3NkaW8tPmZ1bmMpOwogCi0Jc3RhdHVzID0gYXRoNmtsZGV2X2ludHJfYmhfaGFuZGxlcihhcl9zZGlvLT5hcik7CisJc3RhdHVzID0gYXRoNmtsX2hpZl9pbnRyX2JoX2hhbmRsZXIoYXJfc2Rpby0+YXIpOwogCXNkaW9fY2xhaW1faG9zdChhcl9zZGlvLT5mdW5jKTsKIAlhdG9taWNfc2V0KCZhcl9zZGlvLT5pcnFfaGFuZGxpbmcsIDApOwogCVdBUk5fT04oc3RhdHVzICYmIHN0YXR1cyAhPSAtRUNBTkNFTEVEKTsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2Rpb19wb3dlcl9vbihzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8pCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX3Bvd2VyX29uKHN0cnVjdCBhdGg2a2wgKmFyKQogeworCXN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbyA9IGF0aDZrbF9zZGlvX3ByaXYoYXIpOwogCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBhcl9zZGlvLT5mdW5jOwogCWludCByZXQgPSAwOwogCiAJaWYgKCFhcl9zZGlvLT5pc19kaXNhYmxlZCkKIAkJcmV0dXJuIDA7CiAKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgInNkaW8gcG93ZXIgb25cbiIpOworCiAJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOwogCiAJcmV0ID0gc2Rpb19lbmFibGVfZnVuYyhmdW5jKTsKQEAgLTQ5NSwxMyArNTA3LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2Rpb19wb3dlcl9vZmYoc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvKQorc3RhdGljIGludCBhdGg2a2xfc2Rpb19wb3dlcl9vZmYoc3RydWN0IGF0aDZrbCAqYXIpCiB7CisJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvID0gYXRoNmtsX3NkaW9fcHJpdihhcik7CiAJaW50IHJldDsKIAogCWlmIChhcl9zZGlvLT5pc19kaXNhYmxlZCkKIAkJcmV0dXJuIDA7CiAKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfQk9PVCwgInNkaW8gcG93ZXIgb2ZmXG4iKTsKKwogCS8qIERpc2FibGUgdGhlIGNhcmQgKi8KIAlzZGlvX2NsYWltX2hvc3QoYXJfc2Rpby0+ZnVuYyk7CiAJcmV0ID0gc2Rpb19kaXNhYmxlX2Z1bmMoYXJfc2Rpby0+ZnVuYyk7CkBAIC01MjEsNyArNTM2LDYgQEAKIHsKIAlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKIAlzdHJ1Y3QgYnVzX3JlcXVlc3QgKmJ1c19yZXE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWJ1c19yZXEgPSBhdGg2a2xfc2Rpb19hbGxvY19idXNyZXEoYXJfc2Rpbyk7CiAKQEAgLTUzNCw5ICs1NDgsOSBAQAogCWJ1c19yZXEtPnJlcXVlc3QgPSByZXF1ZXN0OwogCWJ1c19yZXEtPnBhY2tldCA9IHBhY2tldDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7CisJc3Bpbl9sb2NrX2JoKCZhcl9zZGlvLT53cl9hc3luY19sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZidXNfcmVxLT5saXN0LCAmYXJfc2Rpby0+d3JfYXN5bmNxKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhcl9zZGlvLT53cl9hc3luY19sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCXF1ZXVlX3dvcmsoYXItPmF0aDZrbF93cSwgJmFyX3NkaW8tPndyX2FzeW5jX3dvcmspOwogCiAJcmV0dXJuIDA7CkBAIC01ODIsOSArNTk2LDggQEAKIHsKIAlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKIAlzdHJ1Y3QgaGlmX3NjYXR0ZXJfcmVxICpub2RlID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWc7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJfc2Rpby0+c2NhdF9sb2NrLCBmbGFnKTsKKwlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiAKIAlpZiAoIWxpc3RfZW1wdHkoJmFyX3NkaW8tPnNjYXRfcmVxKSkgewogCQlub2RlID0gbGlzdF9maXJzdF9lbnRyeSgmYXJfc2Rpby0+c2NhdF9yZXEsCkBAIC01OTIsNyArNjA1LDcgQEAKIAkJbGlzdF9kZWwoJm5vZGUtPmxpc3QpOwogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPnNjYXRfbG9jaywgZmxhZyk7CisJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiAKIAlyZXR1cm4gbm9kZTsKIH0KQEAgLTYwMSwxMyArNjE0LDEyIEBACiAJCQkJCXN0cnVjdCBoaWZfc2NhdHRlcl9yZXEgKnNfcmVxKQogewogCXN0cnVjdCBhdGg2a2xfc2RpbyAqYXJfc2RpbyA9IGF0aDZrbF9zZGlvX3ByaXYoYXIpOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT5zY2F0X2xvY2ssIGZsYWcpOworCXNwaW5fbG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAogCWxpc3RfYWRkX3RhaWwoJnNfcmVxLT5saXN0LCAmYXJfc2Rpby0+c2NhdF9yZXEpOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJfc2Rpby0+c2NhdF9sb2NrLCBmbGFnKTsKKwlzcGluX3VubG9ja19iaCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAogfQogCkBAIC02MTgsNyArNjMwLDYgQEAKIAlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKIAl1MzIgcmVxdWVzdCA9IHNjYXRfcmVxLT5yZXE7CiAJaW50IHN0YXR1cyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmICghc2NhdF9yZXEtPmxlbikKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC02MjcsMTQgKzYzOCwxMiBAQAogCQkiaGlmLXNjYXR0ZXI6IHRvdGFsIGxlbjogJWQgc2NhdHRlciBlbnRyaWVzOiAlZFxuIiwKIAkJc2NhdF9yZXEtPmxlbiwgc2NhdF9yZXEtPnNjYXRfZW50cmllcyk7CiAKLQlpZiAocmVxdWVzdCAmIEhJRl9TWU5DSFJPTk9VUykgewotCQlzZGlvX2NsYWltX2hvc3QoYXJfc2Rpby0+ZnVuYyk7CisJaWYgKHJlcXVlc3QgJiBISUZfU1lOQ0hST05PVVMpCiAJCXN0YXR1cyA9IGF0aDZrbF9zZGlvX3NjYXRfcncoYXJfc2Rpbywgc2NhdF9yZXEtPmJ1c3JlcXVlc3QpOwotCQlzZGlvX3JlbGVhc2VfaG9zdChhcl9zZGlvLT5mdW5jKTsKLQl9IGVsc2UgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jaywgZmxhZ3MpOworCWVsc2UgeworCQlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCQlsaXN0X2FkZF90YWlsKCZzY2F0X3JlcS0+YnVzcmVxdWVzdC0+bGlzdCwgJmFyX3NkaW8tPndyX2FzeW5jcSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2ssIGZsYWdzKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOwogCQlxdWV1ZV93b3JrKGFyLT5hdGg2a2xfd3EsICZhcl9zZGlvLT53cl9hc3luY193b3JrKTsKIAl9CiAKQEAgLTY0NiwyMyArNjU1LDI3IEBACiB7CiAJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvID0gYXRoNmtsX3NkaW9fcHJpdihhcik7CiAJc3RydWN0IGhpZl9zY2F0dGVyX3JlcSAqc19yZXEsICp0bXBfcmVxOwotCXVuc2lnbmVkIGxvbmcgZmxhZzsKIAogCS8qIGVtcHR5IHRoZSBmcmVlIGxpc3QgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYXJfc2Rpby0+c2NhdF9sb2NrLCBmbGFnKTsKKwlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNfcmVxLCB0bXBfcmVxLCAmYXJfc2Rpby0+c2NhdF9yZXEsIGxpc3QpIHsKIAkJbGlzdF9kZWwoJnNfcmVxLT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYXJfc2Rpby0+c2NhdF9sb2NrLCBmbGFnKTsKKwkJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiAKKwkJLyoKKwkJICogRklYTUU6IHNob3VsZCB3ZSBhbHNvIGNhbGwgY29tcGxldGlvbiBoYW5kbGVyIHdpdGgKKwkJICogYXRoNmtsX2hpZl9yd19jb21wX2hhbmRsZXIoKSB3aXRoIHN0YXR1cyAtRUNBTkNFTEVEIHNvCisJCSAqIHRoYXQgdGhlIHBhY2tldCBpcyBwcm9wZXJseSBmcmVlZD8KKwkJICovCiAJCWlmIChzX3JlcS0+YnVzcmVxdWVzdCkKIAkJCWF0aDZrbF9zZGlvX2ZyZWVfYnVzX3JlcShhcl9zZGlvLCBzX3JlcS0+YnVzcmVxdWVzdCk7CiAJCWtmcmVlKHNfcmVxLT52aXJ0X2RtYV9idWYpOwogCQlrZnJlZShzX3JlcS0+c2dlbnRyaWVzKTsKIAkJa2ZyZWUoc19yZXEpOwogCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZhcl9zZGlvLT5zY2F0X2xvY2ssIGZsYWcpOworCQlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiAJfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFyX3NkaW8tPnNjYXRfbG9jaywgZmxhZyk7CisJc3Bpbl91bmxvY2tfYmgoJmFyX3NkaW8tPnNjYXRfbG9jayk7CiB9CiAKIC8qIHNldHVwIG9mIEhJRiBzY2F0dGVyIHJlc291cmNlcyAqLwpAQCAtNjczLDYgKzY4NiwxMSBAQAogCWludCByZXQ7CiAJYm9vbCB2aXJ0X3NjYXQgPSBmYWxzZTsKIAorCWlmIChhcl9zZGlvLT5zY2F0dGVyX2VuYWJsZWQpCisJCXJldHVybiAwOworCisJYXJfc2Rpby0+c2NhdHRlcl9lbmFibGVkID0gdHJ1ZTsKKwogCS8qIGNoZWNrIGlmIGhvc3Qgc3VwcG9ydHMgc2NhdHRlciBhbmQgaXQgbWVldHMgb3VyIHJlcXVpcmVtZW50cyAqLwogCWlmIChhcl9zZGlvLT5mdW5jLT5jYXJkLT5ob3N0LT5tYXhfc2VncyA8IE1BWF9TQ0FUVEVSX0VOVFJJRVNfUEVSX1JFUSkgewogCQlhdGg2a2xfZXJyKCJob3N0IG9ubHkgc3VwcG9ydHMgc2NhdHRlciBvZiA6JWQgZW50cmllcywgbmVlZDogJWRcbiIsCkBAIC02ODcsOCArNzA1LDggQEAKIAkJCQlNQVhfU0NBVFRFUl9SRVFVRVNUUywgdmlydF9zY2F0KTsKIAogCQlpZiAoIXJldCkgewotCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NDQVRURVIsCi0JCQkJICAgImhpZi1zY2F0dGVyIGVuYWJsZWQ6IG1heCBzY2F0dGVyIHJlcSA6ICVkIGVudHJpZXM6ICVkXG4iLAorCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCisJCQkJICAgImhpZi1zY2F0dGVyIGVuYWJsZWQgcmVxdWVzdHMgJWQgZW50cmllcyAlZFxuIiwKIAkJCQkgICBNQVhfU0NBVFRFUl9SRVFVRVNUUywKIAkJCQkgICBNQVhfU0NBVFRFUl9FTlRSSUVTX1BFUl9SRVEpOwogCkBAIC03MTIsOCArNzMwLDggQEAKIAkJCXJldHVybiByZXQ7CiAJCX0KIAotCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU0NBVFRFUiwKLQkJCSAgICJWaXR1YWwgc2NhdHRlciBlbmFibGVkLCBtYXhfc2NhdF9yZXE6JWQsIGVudHJpZXM6JWRcbiIsCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULAorCQkJICAgInZpcnR1YWwgc2NhdHRlciBlbmFibGVkIHJlcXVlc3RzICVkIGVudHJpZXMgJWRcbiIsCiAJCQkgICBBVEg2S0xfU0NBVFRFUl9SRVFTLCBBVEg2S0xfU0NBVFRFUl9FTlRSSUVTX1BFUl9SRVEpOwogCiAJCXRhcmdldC0+bWF4X3NjYXRfZW50cmllcyA9IEFUSDZLTF9TQ0FUVEVSX0VOVFJJRVNfUEVSX1JFUTsKQEAgLTcyNCw3ICs3NDIsNDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfc2Rpb19zdXNwZW5kKHN0cnVjdCBhdGg2a2wgKmFyKQorc3RhdGljIGludCBhdGg2a2xfc2Rpb19jb25maWcoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvID0gYXRoNmtsX3NkaW9fcHJpdihhcik7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGFyX3NkaW8tPmZ1bmM7CisJaW50IHJldDsKKworCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKKworCWlmICgoYXJfc2Rpby0+aWQtPmRldmljZSAmIE1BTlVGQUNUVVJFUl9JRF9BVEg2S0xfQkFTRV9NQVNLKSA+PQorCSAgICBNQU5VRkFDVFVSRVJfSURfQVI2MDAzX0JBU0UpIHsKKwkJLyogZW5hYmxlIDQtYml0IEFTWU5DIGludGVycnVwdCBvbiBBUjYwMDMgb3IgbGF0ZXIgKi8KKwkJcmV0ID0gYXRoNmtsX3NkaW9fZnVuYzBfY21kNTJfd3JfYnl0ZShmdW5jLT5jYXJkLAorCQkJCQkJQ0NDUl9TRElPX0lSUV9NT0RFX1JFRywKKwkJCQkJCVNESU9fSVJRX01PREVfQVNZTkNfNEJJVF9JUlEpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfZXJyKCJGYWlsZWQgdG8gZW5hYmxlIDQtYml0IGFzeW5jIGlycSBtb2RlICVkXG4iLAorCQkJCSAgIHJldCk7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWF0aDZrbF9kYmcoQVRINktMX0RCR19CT09ULCAiNC1iaXQgYXN5bmMgaXJxIG1vZGUgZW5hYmxlZFxuIik7CisJfQorCisJLyogZ2l2ZSB1cyBzb21lIHRpbWUgdG8gZW5hYmxlLCBpbiBtcyAqLworCWZ1bmMtPmVuYWJsZV90aW1lb3V0ID0gMTAwOworCisJcmV0ID0gc2Rpb19zZXRfYmxvY2tfc2l6ZShmdW5jLCBISUZfTUJPWF9CTE9DS19TSVpFKTsKKwlpZiAocmV0KSB7CisJCWF0aDZrbF9lcnIoIlNldCBzZGlvIGJsb2NrIHNpemUgJWQgZmFpbGVkOiAlZClcbiIsCisJCQkgICBISUZfTUJPWF9CTE9DS19TSVpFLCByZXQpOworCQlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKKwkJZ290byBvdXQ7CisJfQorCitvdXQ6CisJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX3N1c3BlbmQoc3RydWN0IGF0aDZrbCAqYXIsIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdykKIHsKIAlzdHJ1Y3QgYXRoNmtsX3NkaW8gKmFyX3NkaW8gPSBhdGg2a2xfc2Rpb19wcml2KGFyKTsKIAlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gYXJfc2Rpby0+ZnVuYzsKQEAgLTczMywxMiArNzkxLDE0IEBACiAKIAlmbGFncyA9IHNkaW9fZ2V0X2hvc3RfcG1fY2FwcyhmdW5jKTsKIAotCWlmICghKGZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpKQotCQkvKiBhcyBob3N0IGRvZXNuJ3Qgc3VwcG9ydCBrZWVwIHBvd2VyIHdlIG5lZWQgdG8gYmFpbCBvdXQgKi8KLQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NESU8sCi0JCQkgICAiZnVuYyAlZCBkb2Vzbid0IHN1cHBvcnQgTU1DX1BNX0tFRVBfUE9XRVJcbiIsCi0JCQkgICBmdW5jLT5udW0pOwotCQlyZXR1cm4gLUVJTlZBTDsKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU1VTUEVORCwgInNkaW8gc3VzcGVuZCBwbV9jYXBzIDB4JXhcbiIsIGZsYWdzKTsKKworCWlmICghKGZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpIHx8CisJICAgIChhci0+Y29uZl9mbGFncyAmIEFUSDZLTF9DT05GX1NVU1BFTkRfQ1VUUE9XRVIpKSB7CisJCS8qIGFzIGhvc3QgZG9lc24ndCBzdXBwb3J0IGtlZXAgcG93ZXIgd2UgbmVlZCB0byBjdXQgcG93ZXIgKi8KKwkJcmV0dXJuIGF0aDZrbF9jZmc4MDIxMV9zdXNwZW5kKGFyLCBBVEg2S0xfQ0ZHX1NVU1BFTkRfQ1VUUE9XRVIsCisJCQkJCSAgICAgICBOVUxMKTsKKwl9CiAKIAlyZXQgPSBzZGlvX3NldF9ob3N0X3BtX2ZsYWdzKGZ1bmMsIE1NQ19QTV9LRUVQX1BPV0VSKTsKIAlpZiAocmV0KSB7CkBAIC03NDcsMTEgKzgwNywzNjcgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlhdGg2a2xfZGVlcF9zbGVlcF9lbmFibGUoYXIpOworCWlmICghKGZsYWdzICYgTU1DX1BNX1dBS0VfU0RJT19JUlEpKQorCQlnb3RvIGRlZXBzbGVlcDsKKworCS8qIHNkaW8gaXJxIHdha2VzIHVwIGhvc3QgKi8KKworCWlmIChhci0+c3RhdGUgPT0gQVRINktMX1NUQVRFX1NDSEVEX1NDQU4pIHsKKwkJcmV0ID0gIGF0aDZrbF9jZmc4MDIxMV9zdXNwZW5kKGFyLAorCQkJCQkgICAgICAgQVRINktMX0NGR19TVVNQRU5EX1NDSEVEX1NDQU4sCisJCQkJCSAgICAgICBOVUxMKTsKKwkJaWYgKHJldCkgeworCQkJYXRoNmtsX3dhcm4oIlNjaGVkdWxlIHNjYW4gc3VzcGVuZCBmYWlsZWQ6ICVkIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlyZXQgPSBzZGlvX3NldF9ob3N0X3BtX2ZsYWdzKGZ1bmMsIE1NQ19QTV9XQUtFX1NESU9fSVJRKTsKKwkJaWYgKHJldCkKKwkJCWF0aDZrbF93YXJuKCJzZXQgc2RpbyB3YWtlIGlycSBmbGFnIGZhaWxlZDogJWRcbiIsIHJldCk7CisKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAod293KSB7CisJCS8qCisJCSAqIFRoZSBob3N0IHNkaW8gY29udHJvbGxlciBpcyBjYXBhYmxlIG9mIGtlZXAgcG93ZXIgYW5kCisJCSAqIHNkaW8gaXJxIHdha2UgdXAgYXQgdGhpcyBwb2ludC4gSXQncyBmaW5lIHRvIGNvbnRpbnVlCisJCSAqIHdvdyBzdXNwZW5kIG9wZXJhdGlvbi4KKwkJICovCisJCXJldCA9IGF0aDZrbF9jZmc4MDIxMV9zdXNwZW5kKGFyLCBBVEg2S0xfQ0ZHX1NVU1BFTkRfV09XLCB3b3cpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSBzZGlvX3NldF9ob3N0X3BtX2ZsYWdzKGZ1bmMsIE1NQ19QTV9XQUtFX1NESU9fSVJRKTsKKwkJaWYgKHJldCkKKwkJCWF0aDZrbF9lcnIoInNldCBzZGlvIHdha2UgaXJxIGZsYWcgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKworCQlyZXR1cm4gcmV0OworCX0KKworZGVlcHNsZWVwOgorCXJldHVybiBhdGg2a2xfY2ZnODAyMTFfc3VzcGVuZChhciwgQVRINktMX0NGR19TVVNQRU5EX0RFRVBTTEVFUCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3NkaW9fcmVzdW1lKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCXN3aXRjaCAoYXItPnN0YXRlKSB7CisJY2FzZSBBVEg2S0xfU1RBVEVfT0ZGOgorCWNhc2UgQVRINktMX1NUQVRFX0NVVFBPV0VSOgorCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU1VTUEVORCwKKwkJCSAgICJzZGlvIHJlc3VtZSBjb25maWd1cmluZyBzZGlvXG4iKTsKKworCQkvKiBuZWVkIHRvIHNldCBzZGlvIHNldHRpbmdzIGFmdGVyIHBvd2VyIGlzIGN1dCBmcm9tIHNkaW8gKi8KKwkJYXRoNmtsX3NkaW9fY29uZmlnKGFyKTsKKwkJYnJlYWs7CisKKwljYXNlIEFUSDZLTF9TVEFURV9PTjoKKwkJYnJlYWs7CisKKwljYXNlIEFUSDZLTF9TVEFURV9ERUVQU0xFRVA6CisJCWJyZWFrOworCisJY2FzZSBBVEg2S0xfU1RBVEVfV09XOgorCQlicmVhazsKKwljYXNlIEFUSDZLTF9TVEFURV9TQ0hFRF9TQ0FOOgorCQlicmVhazsKKwl9CisKKwlhdGg2a2xfY2ZnODAyMTFfcmVzdW1lKGFyKTsKIAogCXJldHVybiAwOwogfQogCisvKiBzZXQgdGhlIHdpbmRvdyBhZGRyZXNzIHJlZ2lzdGVyICh1c2luZyA0LWJ5dGUgcmVnaXN0ZXIgYWNjZXNzICkuICovCitzdGF0aWMgaW50IGF0aDZrbF9zZXRfYWRkcndpbl9yZWcoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiByZWdfYWRkciwgdTMyIGFkZHIpCit7CisJaW50IHN0YXR1czsKKwl1OCBhZGRyX3ZhbFs0XTsKKwlzMzIgaTsKKworCS8qCisJICogV3JpdGUgYnl0ZXMgMSwyLDMgb2YgdGhlIHJlZ2lzdGVyIHRvIHNldCB0aGUgdXBwZXIgYWRkcmVzcyBieXRlcywKKwkgKiB0aGUgTFNCIGlzIHdyaXR0ZW4gbGFzdCB0byBpbml0aWF0ZSB0aGUgYWNjZXNzIGN5Y2xlCisJICovCisKKwlmb3IgKGkgPSAxOyBpIDw9IDM7IGkrKykgeworCQkvKgorCQkgKiBGaWxsIHRoZSBidWZmZXIgd2l0aCB0aGUgYWRkcmVzcyBieXRlIHZhbHVlIHdlIHdhbnQgdG8KKwkJICogaGl0IDQgdGltZXMuCisJCSAqLworCQltZW1zZXQoYWRkcl92YWwsICgodTggKikmYWRkcilbaV0sIDQpOworCisJCS8qCisJCSAqIEhpdCBlYWNoIGJ5dGUgb2YgdGhlIHJlZ2lzdGVyIGFkZHJlc3Mgd2l0aCBhIDQtYnl0ZQorCQkgKiB3cml0ZSBvcGVyYXRpb24gdG8gdGhlIHNhbWUgYWRkcmVzcywgdGhpcyBpcyBhIGhhcm1sZXNzCisJCSAqIG9wZXJhdGlvbi4KKwkJICovCisJCXN0YXR1cyA9IGF0aDZrbF9zZGlvX3JlYWRfd3JpdGVfc3luYyhhciwgcmVnX2FkZHIgKyBpLCBhZGRyX3ZhbCwKKwkJCQkJICAgICA0LCBISUZfV1JfU1lOQ19CWVRFX0ZJWCk7CisJCWlmIChzdGF0dXMpCisJCQlicmVhazsKKwl9CisKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDZrbF9lcnIoIiVzOiBmYWlsZWQgdG8gd3JpdGUgaW5pdGlhbCBieXRlcyBvZiAweCV4ICIKKwkJCSAgICJ0byB3aW5kb3cgcmVnOiAweCVYXG4iLCBfX2Z1bmNfXywKKwkJCSAgIGFkZHIsIHJlZ19hZGRyKTsKKwkJcmV0dXJuIHN0YXR1czsKKwl9CisKKwkvKgorCSAqIFdyaXRlIHRoZSBhZGRyZXNzIHJlZ2lzdGVyIGFnYWluLCB0aGlzIHRpbWUgd3JpdGUgdGhlIHdob2xlCisJICogNC1ieXRlIHZhbHVlLiBUaGUgZWZmZWN0IGhlcmUgaXMgdGhhdCB0aGUgTFNCIHdyaXRlIGNhdXNlcyB0aGUKKwkgKiBjeWNsZSB0byBzdGFydCwgdGhlIGV4dHJhIDMgYnl0ZSB3cml0ZSB0byBieXRlcyAxLDIsMyBoYXMgbm8KKwkgKiBlZmZlY3Qgc2luY2Ugd2UgYXJlIHdyaXRpbmcgdGhlIHNhbWUgdmFsdWVzIGFnYWluCisJICovCisJc3RhdHVzID0gYXRoNmtsX3NkaW9fcmVhZF93cml0ZV9zeW5jKGFyLCByZWdfYWRkciwgKHU4ICopKCZhZGRyKSwKKwkJCQkgICAgIDQsIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKKworCWlmIChzdGF0dXMpIHsKKwkJYXRoNmtsX2VycigiJXM6IGZhaWxlZCB0byB3cml0ZSAweCV4IHRvIHdpbmRvdyByZWc6IDB4JVhcbiIsCisJCQkgICBfX2Z1bmNfXywgYWRkciwgcmVnX2FkZHIpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX2RpYWdfcmVhZDMyKHN0cnVjdCBhdGg2a2wgKmFyLCB1MzIgYWRkcmVzcywgdTMyICpkYXRhKQoreworCWludCBzdGF0dXM7CisKKwkvKiBzZXQgd2luZG93IHJlZ2lzdGVyIHRvIHN0YXJ0IHJlYWQgY3ljbGUgKi8KKwlzdGF0dXMgPSBhdGg2a2xfc2V0X2FkZHJ3aW5fcmVnKGFyLCBXSU5ET1dfUkVBRF9BRERSX0FERFJFU1MsCisJCQkJCWFkZHJlc3MpOworCisJaWYgKHN0YXR1cykKKwkJcmV0dXJuIHN0YXR1czsKKworCS8qIHJlYWQgdGhlIGRhdGEgKi8KKwlzdGF0dXMgPSBhdGg2a2xfc2Rpb19yZWFkX3dyaXRlX3N5bmMoYXIsIFdJTkRPV19EQVRBX0FERFJFU1MsCisJCQkJKHU4ICopZGF0YSwgc2l6ZW9mKHUzMiksIEhJRl9SRF9TWU5DX0JZVEVfSU5DKTsKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDZrbF9lcnIoIiVzOiBmYWlsZWQgdG8gcmVhZCBmcm9tIHdpbmRvdyBkYXRhIGFkZHJcbiIsCisJCQlfX2Z1bmNfXyk7CisJCXJldHVybiBzdGF0dXM7CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KKworc3RhdGljIGludCBhdGg2a2xfc2Rpb19kaWFnX3dyaXRlMzIoc3RydWN0IGF0aDZrbCAqYXIsIHUzMiBhZGRyZXNzLAorCQkJCSAgICBfX2xlMzIgZGF0YSkKK3sKKwlpbnQgc3RhdHVzOworCXUzMiB2YWwgPSAoX19mb3JjZSB1MzIpIGRhdGE7CisKKwkvKiBzZXQgd3JpdGUgZGF0YSAqLworCXN0YXR1cyA9IGF0aDZrbF9zZGlvX3JlYWRfd3JpdGVfc3luYyhhciwgV0lORE9XX0RBVEFfQUREUkVTUywKKwkJCQkodTggKikgJnZhbCwgc2l6ZW9mKHUzMiksIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKKwlpZiAoc3RhdHVzKSB7CisJCWF0aDZrbF9lcnIoIiVzOiBmYWlsZWQgdG8gd3JpdGUgMHgleCB0byB3aW5kb3cgZGF0YSBhZGRyXG4iLAorCQkJICAgX19mdW5jX18sIGRhdGEpOworCQlyZXR1cm4gc3RhdHVzOworCX0KKworCS8qIHNldCB3aW5kb3cgcmVnaXN0ZXIsIHdoaWNoIHN0YXJ0cyB0aGUgd3JpdGUgY3ljbGUgKi8KKwlyZXR1cm4gYXRoNmtsX3NldF9hZGRyd2luX3JlZyhhciwgV0lORE9XX1dSSVRFX0FERFJfQUREUkVTUywKKwkJCQkgICAgICBhZGRyZXNzKTsKK30KKworc3RhdGljIGludCBhdGg2a2xfc2Rpb19ibWlfY3JlZGl0cyhzdHJ1Y3QgYXRoNmtsICphcikKK3sKKwl1MzIgYWRkcjsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJaW50IHJldDsKKworCWFyLT5ibWkuY21kX2NyZWRpdHMgPSAwOworCisJLyogUmVhZCB0aGUgY291bnRlciByZWdpc3RlciB0byBnZXQgdGhlIGNvbW1hbmQgY3JlZGl0cyAqLworCWFkZHIgPSBDT1VOVF9ERUNfQUREUkVTUyArIChIVENfTUFJTEJPWF9OVU1fTUFYICsgRU5EUE9JTlQxKSAqIDQ7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQk1JX0NPTU1VTklDQVRJT05fVElNRU9VVCk7CisJd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHRpbWVvdXQpICYmICFhci0+Ym1pLmNtZF9jcmVkaXRzKSB7CisKKwkJLyoKKwkJICogSGl0IHRoZSBjcmVkaXQgY291bnRlciB3aXRoIGEgNC1ieXRlIGFjY2VzcywgdGhlIGZpcnN0IGJ5dGUKKwkJICogcmVhZCB3aWxsIGhpdCB0aGUgY291bnRlciBhbmQgY2F1c2UgYSBkZWNyZW1lbnQsIHdoaWxlIHRoZQorCQkgKiByZW1haW5pbmcgMyBieXRlcyBoYXMgbm8gZWZmZWN0LiBUaGUgcmF0aW9uYWxlIGJlaGluZCB0aGlzCisJCSAqIGlzIHRvIG1ha2UgYWxsIEhJRiBhY2Nlc3NlcyA0LWJ5dGUgYWxpZ25lZC4KKwkJICovCisJCXJldCA9IGF0aDZrbF9zZGlvX3JlYWRfd3JpdGVfc3luYyhhciwgYWRkciwKKwkJCQkJICh1OCAqKSZhci0+Ym1pLmNtZF9jcmVkaXRzLCA0LAorCQkJCQkgSElGX1JEX1NZTkNfQllURV9JTkMpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gZGVjcmVtZW50IHRoZSBjb21tYW5kIGNyZWRpdCAiCisJCQkJCQkiY291bnQgcmVnaXN0ZXI6ICVkXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIFRoZSBjb3VudGVyIGlzIG9ubHkgOCBiaXRzLgorCQkgKiBJZ25vcmUgYW55dGhpbmcgaW4gdGhlIHVwcGVyIDMgYnl0ZXMKKwkJICovCisJCWFyLT5ibWkuY21kX2NyZWRpdHMgJj0gMHhGRjsKKwl9CisKKwlpZiAoIWFyLT5ibWkuY21kX2NyZWRpdHMpIHsKKwkJYXRoNmtsX2VycigiYm1pIGNvbW11bmljYXRpb24gdGltZW91dFxuIik7CisJCXJldHVybiAtRVRJTUVET1VUOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF0aDZrbF9ibWlfZ2V0X3J4X2xrYWhkKHN0cnVjdCBhdGg2a2wgKmFyKQoreworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwl1MzIgcnhfd29yZCA9IDA7CisJaW50IHJldCA9IDA7CisKKwl0aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQk1JX0NPTU1VTklDQVRJT05fVElNRU9VVCk7CisJd2hpbGUgKCh0aW1lX2JlZm9yZShqaWZmaWVzLCB0aW1lb3V0KSkgJiYgIXJ4X3dvcmQpIHsKKwkJcmV0ID0gYXRoNmtsX3NkaW9fcmVhZF93cml0ZV9zeW5jKGFyLAorCQkJCQlSWF9MT09LQUhFQURfVkFMSURfQUREUkVTUywKKwkJCQkJKHU4ICopJnJ4X3dvcmQsIHNpemVvZihyeF93b3JkKSwKKwkJCQkJSElGX1JEX1NZTkNfQllURV9JTkMpOworCQlpZiAocmV0KSB7CisJCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gcmVhZCBSWF9MT09LQUhFQURfVkFMSURcbiIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCSAvKiBhbGwgd2UgcmVhbGx5IHdhbnQgaXMgb25lIGJpdCAqLworCQlyeF93b3JkICY9ICgxIDw8IEVORFBPSU5UMSk7CisJfQorCisJaWYgKCFyeF93b3JkKSB7CisJCWF0aDZrbF9lcnIoImJtaV9yZWN2X2J1ZiBGSUZPIGVtcHR5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhdGg2a2xfc2Rpb19ibWlfd3JpdGUoc3RydWN0IGF0aDZrbCAqYXIsIHU4ICpidWYsIHUzMiBsZW4pCit7CisJaW50IHJldDsKKwl1MzIgYWRkcjsKKworCXJldCA9IGF0aDZrbF9zZGlvX2JtaV9jcmVkaXRzKGFyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJYWRkciA9IGFyLT5tYm94X2luZm8uaHRjX2FkZHI7CisKKwlyZXQgPSBhdGg2a2xfc2Rpb19yZWFkX3dyaXRlX3N5bmMoYXIsIGFkZHIsIGJ1ZiwgbGVuLAorCQkJCQkgIEhJRl9XUl9TWU5DX0JZVEVfSU5DKTsKKwlpZiAocmV0KQorCQlhdGg2a2xfZXJyKCJ1bmFibGUgdG8gc2VuZCB0aGUgYm1pIGRhdGEgdG8gdGhlIGRldmljZVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGF0aDZrbF9zZGlvX2JtaV9yZWFkKHN0cnVjdCBhdGg2a2wgKmFyLCB1OCAqYnVmLCB1MzIgbGVuKQoreworCWludCByZXQ7CisJdTMyIGFkZHI7CisKKwkvKgorCSAqIER1cmluZyBub3JtYWwgYm9vdHVwLCBzbWFsbCByZWFkcyBtYXkgYmUgcmVxdWlyZWQuCisJICogUmF0aGVyIHRoYW4gaXNzdWUgYW4gSElGIFJlYWQgYW5kIHRoZW4gd2FpdCBhcyB0aGUgVGFyZ2V0CisJICogYWRkcyBzdWNjZXNzaXZlIGJ5dGVzIHRvIHRoZSBGSUZPLCB3ZSB3YWl0IGhlcmUgdW50aWwKKwkgKiB3ZSBrbm93IHRoYXQgcmVzcG9uc2UgZGF0YSBpcyBhdmFpbGFibGUuCisJICoKKwkgKiBUaGlzIGFsbG93cyB1cyB0byBjbGVhbmx5IHRpbWVvdXQgb24gYW4gdW5leHBlY3RlZAorCSAqIFRhcmdldCBmYWlsdXJlIHJhdGhlciB0aGFuIHJpc2sgcHJvYmxlbXMgYXQgdGhlIEhJRiBsZXZlbC4KKwkgKiBJbiBwYXJ0aWN1bGFyLCB0aGlzIGF2b2lkcyBTRElPIHRpbWVvdXRzIGFuZCBwb3NzaWJseSBnYXJiYWdlCisJICogZGF0YSBvbiBzb21lIGhvc3QgY29udHJvbGxlcnMuICBBbmQgb24gYW4gaW50ZXJjb25uZWN0CisJICogc3VjaCBhcyBDb21wYWN0IEZsYXNoIChhcyB3ZWxsIGFzIHNvbWUgU0RJTyBtYXN0ZXJzKSB3aGljaAorCSAqIGRvZXMgbm90IHByb3ZpZGUgYW55IGluZGljYXRpb24gb24gZGF0YSB0aW1lb3V0LCBpdCBhdm9pZHMKKwkgKiBhIHBvdGVudGlhbCBoYW5nIG9yIGdhcmJhZ2UgcmVzcG9uc2UuCisJICoKKwkgKiBTeW5jaHJvbml6YXRpb24gaXMgbW9yZSBkaWZmaWN1bHQgZm9yIHJlYWRzIGxhcmdlciB0aGFuIHRoZQorCSAqIHNpemUgb2YgdGhlIE1CT1ggRklGTyAoMTI4QiksIGJlY2F1c2UgdGhlIFRhcmdldCBpcyB1bmFibGUKKwkgKiB0byBwdXNoIHRoZSAxMjl0aCBieXRlIG9mIGRhdGEgdW50aWwgQUZURVIgdGhlIEhvc3QgcG9zdHMgYW4KKwkgKiBISUYgUmVhZCBhbmQgcmVtb3ZlcyBzb21lIEZJRk8gZGF0YS4gIFNvIGZvciBsYXJnZSByZWFkcyB0aGUKKwkgKiBIb3N0IHByb2NlZWRzIHRvIHBvc3QgYW4gSElGIFJlYWQgQkVGT1JFIGFsbCB0aGUgZGF0YSBpcworCSAqIGFjdHVhbGx5IGF2YWlsYWJsZSB0byByZWFkLiAgRm9ydHVuYXRlbHksIGxhcmdlIEJNSSByZWFkcyBkbworCSAqIG5vdCBvY2N1ciBpbiBwcmFjdGljZSAtLSB0aGV5J3JlIHN1cHBvcnRlZCBmb3IgZGVidWcvZGV2ZWxvcG1lbnQuCisJICoKKwkgKiBTbyBIb3N0L1RhcmdldCBCTUkgc3luY2hyb25pemF0aW9uIGlzIGRpdmlkZWQgaW50byB0aGVzZSBjYXNlczoKKwkgKiAgQ0FTRSAxOiBsZW5ndGggPCA0CisJICogICAgICAgIFNob3VsZCBub3QgaGFwcGVuCisJICoKKwkgKiAgQ0FTRSAyOiA0IDw9IGxlbmd0aCA8PSAxMjgKKwkgKiAgICAgICAgV2FpdCBmb3IgZmlyc3QgNCBieXRlcyB0byBiZSBpbiBGSUZPCisJICogICAgICAgIElmIENPTlNFUlZBVElWRV9CTUlfUkVBRCBpcyBlbmFibGVkLCBhbHNvIHdhaXQgZm9yCisJICogICAgICAgIGEgQk1JIGNvbW1hbmQgY3JlZGl0LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUgRU5USVJFCisJICogICAgICAgIHJlc3BvbnNlIGlzIGF2YWlsYWJsZSBpbiB0aGUgdGhlIEZJRk8KKwkgKgorCSAqICBDQVNFIDM6IGxlbmd0aCA+IDEyOAorCSAqICAgICAgICBXYWl0IGZvciB0aGUgZmlyc3QgNCBieXRlcyB0byBiZSBpbiBGSUZPCisJICoKKwkgKiBGb3IgbW9zdCB1c2VzLCBhIHNtYWxsIHRpbWVvdXQgc2hvdWxkIGJlIHN1ZmZpY2llbnQgYW5kIHdlIHdpbGwKKwkgKiB1c3VhbGx5IHNlZSBhIHJlc3BvbnNlIHF1aWNrbHk7IGJ1dCB0aGVyZSBtYXkgYmUgc29tZSB1bnVzdWFsCisJICogKGRlYnVnKSBjYXNlcyBvZiBCTUlfRVhFQ1VURSB3aGVyZSB3ZSB3YW50IGFuIGxhcmdlciB0aW1lb3V0LgorCSAqIEZvciBub3csIHdlIHVzZSBhbiB1bmJvdW5kZWQgYnVzeSBsb29wIHdoaWxlIHdhaXRpbmcgZm9yCisJICogQk1JX0VYRUNVVEUuCisJICoKKwkgKiBJZiBCTUlfRVhFQ1VURSBldmVyIG5lZWRzIHRvIHN1cHBvcnQgbG9uZ2VyLWxhdGVuY3kgZXhlY3V0aW9uLAorCSAqIGVzcGVjaWFsbHkgaW4gcHJvZHVjdGlvbiwgdGhpcyBjb2RlIG5lZWRzIHRvIGJlIGVuaGFuY2VkIHRvIHNsZWVwCisJICogYW5kIHlpZWxkLiAgQWxzbyBub3RlIHRoYXQgQk1JX0NPTU1VTklDQVRJT05fVElNRU9VVCBpcyBjdXJyZW50bHkKKwkgKiBhIGZ1bmN0aW9uIG9mIEhvc3QgcHJvY2Vzc29yIHNwZWVkLgorCSAqLworCWlmIChsZW4gPj0gNCkgeyAvKiBOQjogQ3VycmVudGx5LCBhbHdheXMgdHJ1ZSAqLworCQlyZXQgPSBhdGg2a2xfYm1pX2dldF9yeF9sa2FoZChhcik7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKworCWFkZHIgPSBhci0+bWJveF9pbmZvLmh0Y19hZGRyOworCXJldCA9IGF0aDZrbF9zZGlvX3JlYWRfd3JpdGVfc3luYyhhciwgYWRkciwgYnVmLCBsZW4sCisJCQkJICBISUZfUkRfU1lOQ19CWVRFX0lOQyk7CisJaWYgKHJldCkgeworCQlhdGg2a2xfZXJyKCJVbmFibGUgdG8gcmVhZCB0aGUgYm1pIGRhdGEgZnJvbSB0aGUgZGV2aWNlOiAlZFxuIiwKKwkJCSAgIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF0aDZrbF9zZGlvX3N0b3Aoc3RydWN0IGF0aDZrbCAqYXIpCit7CisJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvID0gYXRoNmtsX3NkaW9fcHJpdihhcik7CisJc3RydWN0IGJ1c19yZXF1ZXN0ICpyZXEsICp0bXBfcmVxOworCXZvaWQgKmNvbnRleHQ7CisKKwkvKiBGSVhNRTogbWFrZSBzdXJlIHRoYXQgd3EgaXMgbm90IHF1ZXVlZCBhZ2FpbiAqLworCisJY2FuY2VsX3dvcmtfc3luYygmYXJfc2Rpby0+d3JfYXN5bmNfd29yayk7CisKKwlzcGluX2xvY2tfYmgoJmFyX3NkaW8tPndyX2FzeW5jX2xvY2spOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgdG1wX3JlcSwgJmFyX3NkaW8tPndyX2FzeW5jcSwgbGlzdCkgeworCQlsaXN0X2RlbCgmcmVxLT5saXN0KTsKKworCQlpZiAocmVxLT5zY2F0X3JlcSkgeworCQkJLyogdGhpcyBpcyBhIHNjYXR0ZXIgZ2F0aGVyIHJlcXVlc3QgKi8KKwkJCXJlcS0+c2NhdF9yZXEtPnN0YXR1cyA9IC1FQ0FOQ0VMRUQ7CisJCQlyZXEtPnNjYXRfcmVxLT5jb21wbGV0ZShhcl9zZGlvLT5hci0+aHRjX3RhcmdldCwKKwkJCQkJCXJlcS0+c2NhdF9yZXEpOworCQl9IGVsc2UgeworCQkJY29udGV4dCA9IHJlcS0+cGFja2V0OworCQkJYXRoNmtsX3NkaW9fZnJlZV9idXNfcmVxKGFyX3NkaW8sIHJlcSk7CisJCQlhdGg2a2xfaGlmX3J3X2NvbXBfaGFuZGxlcihjb250ZXh0LCAtRUNBTkNFTEVEKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2JoKCZhcl9zZGlvLT53cl9hc3luY19sb2NrKTsKKworCVdBUk5fT04oZ2V0X3F1ZXVlX2RlcHRoKCZhcl9zZGlvLT5zY2F0X3JlcSkgIT0gNCk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXRoNmtsX2hpZl9vcHMgYXRoNmtsX3NkaW9fb3BzID0gewogCS5yZWFkX3dyaXRlX3N5bmMgPSBhdGg2a2xfc2Rpb19yZWFkX3dyaXRlX3N5bmMsCiAJLndyaXRlX2FzeW5jID0gYXRoNmtsX3NkaW9fd3JpdGVfYXN5bmMsCkBAIC03NjMsOCArMTE3OSw0NyBAQAogCS5zY2F0X3JlcV9ydyA9IGF0aDZrbF9zZGlvX2FzeW5jX3J3X3NjYXR0ZXIsCiAJLmNsZWFudXBfc2NhdHRlciA9IGF0aDZrbF9zZGlvX2NsZWFudXBfc2NhdHRlciwKIAkuc3VzcGVuZCA9IGF0aDZrbF9zZGlvX3N1c3BlbmQsCisJLnJlc3VtZSA9IGF0aDZrbF9zZGlvX3Jlc3VtZSwKKwkuZGlhZ19yZWFkMzIgPSBhdGg2a2xfc2Rpb19kaWFnX3JlYWQzMiwKKwkuZGlhZ193cml0ZTMyID0gYXRoNmtsX3NkaW9fZGlhZ193cml0ZTMyLAorCS5ibWlfcmVhZCA9IGF0aDZrbF9zZGlvX2JtaV9yZWFkLAorCS5ibWlfd3JpdGUgPSBhdGg2a2xfc2Rpb19ibWlfd3JpdGUsCisJLnBvd2VyX29uID0gYXRoNmtsX3NkaW9fcG93ZXJfb24sCisJLnBvd2VyX29mZiA9IGF0aDZrbF9zZGlvX3Bvd2VyX29mZiwKKwkuc3RvcCA9IGF0aDZrbF9zZGlvX3N0b3AsCiB9OwogCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisKKy8qCisgKiBFbXB0eSBoYW5kbGVycyBzbyB0aGF0IG1tYyBzdWJzeXN0ZW0gZG9lc24ndCByZW1vdmUgdXMgZW50aXJlbHkgZHVyaW5nCisgKiBzdXNwZW5kLiBXZSBpbnN0ZWFkIGZvbGxvdyBjZmc4MDIxMSBzdXNwZW5kL3Jlc3VtZSBoYW5kbGVycy4KKyAqLworc3RhdGljIGludCBhdGg2a2xfc2Rpb19wbV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSkKK3sKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfU1VTUEVORCwgInNkaW8gcG0gc3VzcGVuZFxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhdGg2a2xfc2Rpb19wbV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCWF0aDZrbF9kYmcoQVRINktMX0RCR19TVVNQRU5ELCAic2RpbyBwbSByZXN1bWVcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBTSU1QTEVfREVWX1BNX09QUyhhdGg2a2xfc2Rpb19wbV9vcHMsIGF0aDZrbF9zZGlvX3BtX3N1c3BlbmQsCisJCQkgYXRoNmtsX3NkaW9fcG1fcmVzdW1lKTsKKworI2RlZmluZSBBVEg2S0xfU0RJT19QTV9PUFMgKCZhdGg2a2xfc2Rpb19wbV9vcHMpCisKKyNlbHNlCisKKyNkZWZpbmUgQVRINktMX1NESU9fUE1fT1BTIE5VTEwKKworI2VuZGlmIC8qIENPTkZJR19QTV9TTEVFUCAqLworCiBzdGF0aWMgaW50IGF0aDZrbF9zZGlvX3Byb2JlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQpCiB7CkBAIC03NzMsOCArMTIyOCw4IEBACiAJc3RydWN0IGF0aDZrbCAqYXI7CiAJaW50IGNvdW50OwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NESU8sCi0JCSAgICJuZXcgZnVuYyAlZCB2ZW5kb3IgMHgleCBkZXZpY2UgMHgleCBibG9jayAweCV4LzB4JXhcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCisJCSAgICJzZGlvIG5ldyBmdW5jICVkIHZlbmRvciAweCV4IGRldmljZSAweCV4IGJsb2NrIDB4JXgvMHgleFxuIiwKIAkJICAgZnVuYy0+bnVtLCBmdW5jLT52ZW5kb3IsIGZ1bmMtPmRldmljZSwKIAkJICAgZnVuYy0+bWF4X2Jsa3NpemUsIGZ1bmMtPmN1cl9ibGtzaXplKTsKIApAQCAtNzk3LDYgKzEyNTIsNyBAQAogCXNwaW5fbG9ja19pbml0KCZhcl9zZGlvLT5sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYXJfc2Rpby0+c2NhdF9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmYXJfc2Rpby0+d3JfYXN5bmNfbG9jayk7CisJbXV0ZXhfaW5pdCgmYXJfc2Rpby0+ZG1hX2J1ZmZlcl9tdXRleCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmYXJfc2Rpby0+c2NhdF9yZXEpOwogCUlOSVRfTElTVF9IRUFEKCZhcl9zZGlvLT5idXNfcmVxX2ZyZWVxKTsKQEAgLTgxNSw2MiArMTI3MSwyOSBAQAogCX0KIAogCWFyX3NkaW8tPmFyID0gYXI7CisJYXItPmhpZl90eXBlID0gQVRINktMX0hJRl9UWVBFX1NESU87CiAJYXItPmhpZl9wcml2ID0gYXJfc2RpbzsKIAlhci0+aGlmX29wcyA9ICZhdGg2a2xfc2Rpb19vcHM7CisJYXItPmJtaS5tYXhfZGF0YV9zaXplID0gMjU2OwogCiAJYXRoNmtsX3NkaW9fc2V0X21ib3hfaW5mbyhhcik7CiAKLQlzZGlvX2NsYWltX2hvc3QoZnVuYyk7Ci0KLQlpZiAoKGFyX3NkaW8tPmlkLT5kZXZpY2UgJiBNQU5VRkFDVFVSRVJfSURfQVRINktMX0JBU0VfTUFTSykgPj0KLQkgICAgTUFOVUZBQ1RVUkVSX0lEX0FSNjAwM19CQVNFKSB7Ci0JCS8qIGVuYWJsZSA0LWJpdCBBU1lOQyBpbnRlcnJ1cHQgb24gQVI2MDAzIG9yIGxhdGVyICovCi0JCXJldCA9IGF0aDZrbF9zZGlvX2Z1bmMwX2NtZDUyX3dyX2J5dGUoZnVuYy0+Y2FyZCwKLQkJCQkJCUNDQ1JfU0RJT19JUlFfTU9ERV9SRUcsCi0JCQkJCQlTRElPX0lSUV9NT0RFX0FTWU5DXzRCSVRfSVJRKTsKLQkJaWYgKHJldCkgewotCQkJYXRoNmtsX2VycigiRmFpbGVkIHRvIGVuYWJsZSA0LWJpdCBhc3luYyBpcnEgbW9kZSAlZFxuIiwKLQkJCQkgICByZXQpOwotCQkJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7Ci0JCQlnb3RvIGVycl9jZmc4MDIxMTsKLQkJfQotCi0JCWF0aDZrbF9kYmcoQVRINktMX0RCR19TRElPLCAiNC1iaXQgYXN5bmMgaXJxIG1vZGUgZW5hYmxlZFxuIik7Ci0JfQotCi0JLyogZ2l2ZSB1cyBzb21lIHRpbWUgdG8gZW5hYmxlLCBpbiBtcyAqLwotCWZ1bmMtPmVuYWJsZV90aW1lb3V0ID0gMTAwOwotCi0Jc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7Ci0KLQlyZXQgPSBhdGg2a2xfc2Rpb19wb3dlcl9vbihhcl9zZGlvKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycl9jZmc4MDIxMTsKLQotCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKLQotCXJldCA9IHNkaW9fc2V0X2Jsb2NrX3NpemUoZnVuYywgSElGX01CT1hfQkxPQ0tfU0laRSk7CisJcmV0ID0gYXRoNmtsX3NkaW9fY29uZmlnKGFyKTsKIAlpZiAocmV0KSB7Ci0JCWF0aDZrbF9lcnIoIlNldCBzZGlvIGJsb2NrIHNpemUgJWQgZmFpbGVkOiAlZClcbiIsCi0JCQkgICBISUZfTUJPWF9CTE9DS19TSVpFLCByZXQpOwotCQlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKLQkJZ290byBlcnJfb2ZmOworCQlhdGg2a2xfZXJyKCJGYWlsZWQgdG8gY29uZmlnIHNkaW86ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9jb3JlX2FsbG9jOwogCX0KIAotCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwotCiAJcmV0ID0gYXRoNmtsX2NvcmVfaW5pdChhcik7CiAJaWYgKHJldCkgewogCQlhdGg2a2xfZXJyKCJGYWlsZWQgdG8gaW5pdCBhdGg2a2wgY29yZVxuIik7Ci0JCWdvdG8gZXJyX29mZjsKKwkJZ290byBlcnJfY29yZV9hbGxvYzsKIAl9CiAKIAlyZXR1cm4gcmV0OwogCi1lcnJfb2ZmOgotCWF0aDZrbF9zZGlvX3Bvd2VyX29mZihhcl9zZGlvKTsKLWVycl9jZmc4MDIxMToKLQlhdGg2a2xfY2ZnODAyMTFfZGVpbml0KGFyX3NkaW8tPmFyKTsKK2Vycl9jb3JlX2FsbG9jOgorCWF0aDZrbF9jb3JlX2ZyZWUoYXJfc2Rpby0+YXIpOwogZXJyX2RtYToKIAlrZnJlZShhcl9zZGlvLT5kbWFfYnVmZmVyKTsKIGVycl9oaWY6CkBAIC04ODMsOCArMTMwNiw4IEBACiB7CiAJc3RydWN0IGF0aDZrbF9zZGlvICphcl9zZGlvOwogCi0JYXRoNmtsX2RiZyhBVEg2S0xfREJHX1NESU8sCi0JCSAgICJyZW1vdmVkIGZ1bmMgJWQgdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX0JPT1QsCisJCSAgICJzZGlvIHJlbW92ZWQgZnVuYyAlZCB2ZW5kb3IgMHgleCBkZXZpY2UgMHgleFxuIiwKIAkJICAgZnVuYy0+bnVtLCBmdW5jLT52ZW5kb3IsIGZ1bmMtPmRldmljZSk7CiAKIAlhcl9zZGlvID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKQEAgLTg5Miw5ICsxMzE1LDcgQEAKIAlhdGg2a2xfc3RvcF90eHJ4KGFyX3NkaW8tPmFyKTsKIAljYW5jZWxfd29ya19zeW5jKCZhcl9zZGlvLT53cl9hc3luY193b3JrKTsKIAotCWF0aDZrbF91bmF2YWlsX2V2KGFyX3NkaW8tPmFyKTsKLQotCWF0aDZrbF9zZGlvX3Bvd2VyX29mZihhcl9zZGlvKTsKKwlhdGg2a2xfY29yZV9jbGVhbnVwKGFyX3NkaW8tPmFyKTsKIAogCWtmcmVlKGFyX3NkaW8tPmRtYV9idWZmZXIpOwogCWtmcmVlKGFyX3NkaW8pOwpAQCAtOTAzLDE2ICsxMzI0LDE5IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkIGF0aDZrbF9zZGlvX2RldmljZXNbXSA9IHsKIAl7U0RJT19ERVZJQ0UoTUFOVUZBQ1RVUkVSX0NPREUsIChNQU5VRkFDVFVSRVJfSURfQVI2MDAzX0JBU0UgfCAweDApKX0sCiAJe1NESU9fREVWSUNFKE1BTlVGQUNUVVJFUl9DT0RFLCAoTUFOVUZBQ1RVUkVSX0lEX0FSNjAwM19CQVNFIHwgMHgxKSl9LAorCXtTRElPX0RFVklDRShNQU5VRkFDVFVSRVJfQ09ERSwgKE1BTlVGQUNUVVJFUl9JRF9BUjYwMDRfQkFTRSB8IDB4MCkpfSwKKwl7U0RJT19ERVZJQ0UoTUFOVUZBQ1RVUkVSX0NPREUsIChNQU5VRkFDVFVSRVJfSURfQVI2MDA0X0JBU0UgfCAweDEpKX0sCiAJe30sCiB9OwogCiBNT0RVTEVfREVWSUNFX1RBQkxFKHNkaW8sIGF0aDZrbF9zZGlvX2RldmljZXMpOwogCiBzdGF0aWMgc3RydWN0IHNkaW9fZHJpdmVyIGF0aDZrbF9zZGlvX2RyaXZlciA9IHsKLQkubmFtZSA9ICJhdGg2a2xfc2RpbyIsCisJLm5hbWUgPSAiYXRoNmtsIiwKIAkuaWRfdGFibGUgPSBhdGg2a2xfc2Rpb19kZXZpY2VzLAogCS5wcm9iZSA9IGF0aDZrbF9zZGlvX3Byb2JlLAogCS5yZW1vdmUgPSBhdGg2a2xfc2Rpb19yZW1vdmUsCisJLmRydi5wbSA9IEFUSDZLTF9TRElPX1BNX09QUywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGF0aDZrbF9zZGlvX2luaXQodm9pZCkKQEAgLTkzOCwxMyArMTM2MiwxOSBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJEcml2ZXIgc3VwcG9ydCBmb3IgQXRoZXJvcyBBUjYwMHggU0RJTyBkZXZpY2VzIik7CiBNT0RVTEVfTElDRU5TRSgiRHVhbCBCU0QvR1BMIik7CiAKLU1PRFVMRV9GSVJNV0FSRShBUjYwMDNfUkVWMl9PVFBfRklMRSk7Ci1NT0RVTEVfRklSTVdBUkUoQVI2MDAzX1JFVjJfRklSTVdBUkVfRklMRSk7Ci1NT0RVTEVfRklSTVdBUkUoQVI2MDAzX1JFVjJfUEFUQ0hfRklMRSk7Ci1NT0RVTEVfRklSTVdBUkUoQVI2MDAzX1JFVjJfQk9BUkRfREFUQV9GSUxFKTsKLU1PRFVMRV9GSVJNV0FSRShBUjYwMDNfUkVWMl9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSk7Ci1NT0RVTEVfRklSTVdBUkUoQVI2MDAzX1JFVjNfT1RQX0ZJTEUpOwotTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19SRVYzX0ZJUk1XQVJFX0ZJTEUpOwotTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19SRVYzX1BBVENIX0ZJTEUpOwotTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19SRVYzX0JPQVJEX0RBVEFfRklMRSk7Ci1NT0RVTEVfRklSTVdBUkUoQVI2MDAzX1JFVjNfREVGQVVMVF9CT0FSRF9EQVRBX0ZJTEUpOworTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19IV18yXzBfT1RQX0ZJTEUpOworTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19IV18yXzBfRklSTVdBUkVfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDAzX0hXXzJfMF9QQVRDSF9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDNfSFdfMl8wX0JPQVJEX0RBVEFfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDAzX0hXXzJfMF9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDAzX0hXXzJfMV8xX09UUF9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDNfSFdfMl8xXzFfRklSTVdBUkVfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDAzX0hXXzJfMV8xX1BBVENIX0ZJTEUpOworTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19IV18yXzFfMV9CT0FSRF9EQVRBX0ZJTEUpOworTU9EVUxFX0ZJUk1XQVJFKEFSNjAwM19IV18yXzFfMV9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDA0X0hXXzFfMF9GSVJNV0FSRV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDRfSFdfMV8wX0JPQVJEX0RBVEFfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDA0X0hXXzFfMF9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDA0X0hXXzFfMV9GSVJNV0FSRV9GSUxFKTsKK01PRFVMRV9GSVJNV0FSRShBUjYwMDRfSFdfMV8xX0JPQVJEX0RBVEFfRklMRSk7CitNT0RVTEVfRklSTVdBUkUoQVI2MDA0X0hXXzFfMV9ERUZBVUxUX0JPQVJEX0RBVEFfRklMRSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3RhcmdldC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC90YXJnZXQuaAppbmRleCBjOWE3NjA1Li4xMDhhNzIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3RhcmdldC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvdGFyZ2V0LmgKQEAgLTIwLDcgKzIwLDcgQEAKICNkZWZpbmUgQVI2MDAzX0JPQVJEX0RBVEFfU1oJCTEwMjQKICNkZWZpbmUgQVI2MDAzX0JPQVJEX0VYVF9EQVRBX1NaCTc2OAogCi0jZGVmaW5lIEFSNjAwNF9CT0FSRF9EQVRBX1NaICAgICA3MTY4CisjZGVmaW5lIEFSNjAwNF9CT0FSRF9EQVRBX1NaICAgICA2MTQ0CiAjZGVmaW5lIEFSNjAwNF9CT0FSRF9FWFRfREFUQV9TWiAwCiAKICNkZWZpbmUgUkVTRVRfQ09OVFJPTF9BRERSRVNTCQkweDAwMDAwMDAwCkBAIC0zMjAsNyArMzIwLDEwIEBACiB8ICAgKDIpICAgfCAgICgyKSAgIHwgICAoMikgICB8ICAgKDIpICAgfCAgICgyKSAgIHwgICAoMikgICB8ICAgKDIpICAgfCAgICgyKQogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKICovCisjZGVmaW5lIEhJX09QVElPTl9GV19NT0RFX0JJVFMJICAgICAgIDB4MgogI2RlZmluZSBISV9PUFRJT05fRldfTU9ERV9TSElGVCAgICAgICAgMHhDCisKKyNkZWZpbmUgSElfT1BUSU9OX0ZXX1NVQk1PREVfQklUUyAgICAgIDB4MgogI2RlZmluZSBISV9PUFRJT05fRldfU1VCTU9ERV9TSElGVCAgICAgMHgxNAogCiAvKiBDb252ZXJ0IGEgVGFyZ2V0IHZpcnR1YWwgYWRkcmVzcyBpbnRvIGEgVGFyZ2V0IHBoeXNpY2FsIGFkZHJlc3MgKi8KQEAgLTMzMSwyMCArMzM0LDYgQEAKIAkoKCh0YXJnZXRfdHlwZSkgPT0gVEFSR0VUX1RZUEVfQVI2MDAzKSA/IEFSNjAwM19WVE9QKHZhZGRyKSA6IFwKIAkoKCh0YXJnZXRfdHlwZSkgPT0gVEFSR0VUX1RZUEVfQVI2MDA0KSA/IEFSNjAwNF9WVE9QKHZhZGRyKSA6IDApKQogCi0jZGVmaW5lIEFSNjAwM19SRVYyX0FQUF9MT0FEX0FERFJFU1MgICAgICAgICAgICAweDU0MzE4MAotI2RlZmluZSBBUjYwMDNfUkVWMl9CT0FSRF9FWFRfREFUQV9BRERSRVNTICAgICAgMHg1N0U1MDAKLSNkZWZpbmUgQVI2MDAzX1JFVjJfREFUQVNFVF9QQVRDSF9BRERSRVNTICAgICAgIDB4NTdlODg0Ci0jZGVmaW5lIEFSNjAwM19SRVYyX1JBTV9SRVNFUlZFX1NJWkUgICAgICAgICAgICA2OTEyCi0KLSNkZWZpbmUgQVI2MDAzX1JFVjNfQVBQX0xPQURfQUREUkVTUyAgICAgICAgICAgIDB4NTQ1MDAwCi0jZGVmaW5lIEFSNjAwM19SRVYzX0JPQVJEX0VYVF9EQVRBX0FERFJFU1MgICAgICAweDU0MjMzMAotI2RlZmluZSBBUjYwMDNfUkVWM19EQVRBU0VUX1BBVENIX0FERFJFU1MgICAgICAgMHg1N0ZGNzQKLSNkZWZpbmUgQVI2MDAzX1JFVjNfUkFNX1JFU0VSVkVfU0laRSAgICAgICAgICAgIDUxMgotCi0jZGVmaW5lIEFSNjAwNF9SRVYxX0JPQVJEX0RBVEFfQUREUkVTUyAgICAgICAgICAweDQzNTQwMAotI2RlZmluZSBBUjYwMDRfUkVWMV9CT0FSRF9FWFRfREFUQV9BRERSRVNTICAgICAgMHg0MzcwMDAKLSNkZWZpbmUgQVI2MDA0X1JFVjFfUkFNX1JFU0VSVkVfU0laRSAgICAgICAgICAgIDExMjY0Ci0KICNkZWZpbmUgQVRINktMX0ZXTE9HX1BBWUxPQURfU0laRQkJMTUwMAogCiBzdHJ1Y3QgYXRoNmtsX2RiZ2xvZ19idWYgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC90eHJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3R4cnguYwppbmRleCBhNzExNzA3Li41MDZhMzAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3R4cnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3R4cnguYwpAQCAtNzcsMTIgKzc3LDEzIEBACiAJcmV0dXJuIGFyLT5ub2RlX21hcFtlcF9tYXBdLmVwX2lkOwogfQogCi1zdGF0aWMgYm9vbCBhdGg2a2xfcG93ZXJzYXZlX2FwKHN0cnVjdCBhdGg2a2wgKmFyLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorc3RhdGljIGJvb2wgYXRoNmtsX3Bvd2Vyc2F2ZV9hcChzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCWJvb2wgKm1vcmVfZGF0YSkKIHsKIAlzdHJ1Y3QgZXRoaGRyICpkYXRhcCA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYi0+ZGF0YTsKIAlzdHJ1Y3QgYXRoNmtsX3N0YSAqY29ubiA9IE5VTEw7CiAJYm9vbCBwc19xdWV1ZWQgPSBmYWxzZSwgaXNfcHNxX2VtcHR5ID0gZmFsc2U7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRhdGFwLT5oX2Rlc3QpKSB7CiAJCXU4IGN0ciA9IDA7CkBAIC0xMDAsNyArMTAxLDcgQEAKIAkJCSAqIElmIHRoaXMgdHJhbnNtaXQgaXMgbm90IGJlY2F1c2Ugb2YgYSBEdGltIEV4cGlyeQogCQkJICogcSBpdC4KIAkJCSAqLwotCQkJaWYgKCF0ZXN0X2JpdChEVElNX0VYUElSRUQsICZhci0+ZmxhZykpIHsKKwkJCWlmICghdGVzdF9iaXQoRFRJTV9FWFBJUkVELCAmdmlmLT5mbGFncykpIHsKIAkJCQlib29sIGlzX21jYXN0cV9lbXB0eSA9IGZhbHNlOwogCiAJCQkJc3Bpbl9sb2NrX2JoKCZhci0+bWNhc3Rwc3FfbG9jayk7CkBAIC0xMTYsNiArMTE3LDcgQEAKIAkJCQkgKi8KIAkJCQlpZiAoaXNfbWNhc3RxX2VtcHR5KQogCQkJCQlhdGg2a2xfd21pX3NldF9wdmJfY21kKGFyLT53bWksCisJCQkJCQkJICAgICAgIHZpZi0+ZndfdmlmX2lkeCwKIAkJCQkJCQkgICAgICAgTUNBU1RfQUlELCAxKTsKIAogCQkJCXBzX3F1ZXVlZCA9IHRydWU7CkBAIC0xMzEsNyArMTMzLDcgQEAKIAkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCWNvbm4gPSBhdGg2a2xfZmluZF9zdGEoYXIsIGRhdGFwLT5oX2Rlc3QpOworCQljb25uID0gYXRoNmtsX2ZpbmRfc3RhKHZpZiwgZGF0YXAtPmhfZGVzdCk7CiAJCWlmICghY29ubikgewogCQkJZGV2X2tmcmVlX3NrYihza2IpOwogCkBAIC0xNTQsNiArMTU2LDcgQEAKIAkJCQkgKi8KIAkJCQlpZiAoaXNfcHNxX2VtcHR5KQogCQkJCQlhdGg2a2xfd21pX3NldF9wdmJfY21kKGFyLT53bWksCisJCQkJCQkJICAgICAgIHZpZi0+ZndfdmlmX2lkeCwKIAkJCQkJCQkgICAgICAgY29ubi0+YWlkLCAxKTsKIAogCQkJCXBzX3F1ZXVlZCA9IHRydWU7CkBAIC0yMzUsNiArMjM4LDcgQEAKIAlzdHJ1Y3QgYXRoNmtsICphciA9IGF0aDZrbF9wcml2KGRldik7CiAJc3RydWN0IGF0aDZrbF9jb29raWUgKmNvb2tpZSA9IE5VTEw7CiAJZW51bSBodGNfZW5kcG9pbnRfaWQgZWlkID0gRU5EUE9JTlRfVU5VU0VEOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWYgPSBuZXRkZXZfcHJpdihkZXYpOwogCXUzMiBtYXBfbm8gPSAwOwogCXUxNiBodGNfdGFnID0gQVRINktMX0RBVEFfUEtUX1RBRzsKIAl1OCBhYyA9IDk5IDsgLyogaW5pdGlhbGl6ZSB0byB1bm1hcHBlZCBhYyAqLwpAQCAtMjQ2LDcgKzI1MCw3IEBACiAJCSAgIHNrYiwgc2tiLT5kYXRhLCBza2ItPmxlbik7CiAKIAkvKiBJZiB0YXJnZXQgaXMgbm90IGFzc29jaWF0ZWQgKi8KLQlpZiAoIXRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSkgeworCWlmICghdGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykpIHsKIAkJZGV2X2tmcmVlX3NrYihza2IpOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yNTUsMTUgKzI1OSwyMSBAQAogCQlnb3RvIGZhaWxfdHg7CiAKIAkvKiBBUCBtb2RlIFBvd2VyIHNhdmluZyBwcm9jZXNzaW5nICovCi0JaWYgKGFyLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKLQkJaWYgKGF0aDZrbF9wb3dlcnNhdmVfYXAoYXIsIHNrYiwgJm1vcmVfZGF0YSkpCisJaWYgKHZpZi0+bndfdHlwZSA9PSBBUF9ORVRXT1JLKSB7CisJCWlmIChhdGg2a2xfcG93ZXJzYXZlX2FwKHZpZiwgc2tiLCAmbW9yZV9kYXRhKSkKIAkJCXJldHVybiAwOwogCX0KIAogCWlmICh0ZXN0X2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKSkgewogCQlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBkZXYtPm5lZWRlZF9oZWFkcm9vbSkgewotCQkJV0FSTl9PTigxKTsKLQkJCWdvdG8gZmFpbF90eDsKKwkJCXN0cnVjdCBza19idWZmICp0bXBfc2tiID0gc2tiOworCisJCQlza2IgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIGRldi0+bmVlZGVkX2hlYWRyb29tKTsKKwkJCWtmcmVlX3NrYih0bXBfc2tiKTsKKwkJCWlmIChza2IgPT0gTlVMTCkgeworCQkJCXZpZi0+bmV0X3N0YXRzLnR4X2Ryb3BwZWQrKzsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KIAkJfQogCiAJCWlmIChhdGg2a2xfd21pX2RpeF8yX2RvdDMoYXItPndtaSwgc2tiKSkgewpAQCAtMjcyLDE4ICsyODIsMjAgQEAKIAkJfQogCiAJCWlmIChhdGg2a2xfd21pX2RhdGFfaGRyX2FkZChhci0+d21pLCBza2IsIERBVEFfTVNHVFlQRSwKLQkJCQkJICAgIG1vcmVfZGF0YSwgMCwgMCwgTlVMTCkpIHsKKwkJCQkJICAgIG1vcmVfZGF0YSwgMCwgMCwgTlVMTCwKKwkJCQkJICAgIHZpZi0+ZndfdmlmX2lkeCkpIHsKIAkJCWF0aDZrbF9lcnIoIndtaV9kYXRhX2hkcl9hZGQgZmFpbGVkXG4iKTsKIAkJCWdvdG8gZmFpbF90eDsKIAkJfQogCi0JCWlmICgoYXItPm53X3R5cGUgPT0gQURIT0NfTkVUV09SSykgJiYKLQkJICAgICBhci0+aWJzc19wc19lbmFibGUgJiYgdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpKQorCQlpZiAoKHZpZi0+bndfdHlwZSA9PSBBREhPQ19ORVRXT1JLKSAmJgorCQkgICAgIGFyLT5pYnNzX3BzX2VuYWJsZSAmJiB0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSkKIAkJCWNoa19hZGhvY19wc19tYXBwaW5nID0gdHJ1ZTsKIAkJZWxzZSB7CiAJCQkvKiBnZXQgdGhlIHN0cmVhbSBtYXBwaW5nICovCi0JCQlyZXQgPSBhdGg2a2xfd21pX2ltcGxpY2l0X2NyZWF0ZV9wc3RyZWFtKGFyLT53bWksIHNrYiwKLQkJCQkgICAgMCwgdGVzdF9iaXQoV01NX0VOQUJMRUQsICZhci0+ZmxhZyksICZhYyk7CisJCQlyZXQgPSBhdGg2a2xfd21pX2ltcGxpY2l0X2NyZWF0ZV9wc3RyZWFtKGFyLT53bWksCisJCQkJICAgIHZpZi0+ZndfdmlmX2lkeCwgc2tiLAorCQkJCSAgICAwLCB0ZXN0X2JpdChXTU1fRU5BQkxFRCwgJnZpZi0+ZmxhZ3MpLCAmYWMpOwogCQkJaWYgKHJldCkKIAkJCQlnb3RvIGZhaWxfdHg7CiAJCX0KQEAgLTM1NCw4ICszNjYsOCBAQAogZmFpbF90eDoKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CiAKLQlhci0+bmV0X3N0YXRzLnR4X2Ryb3BwZWQrKzsKLQlhci0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CisJdmlmLT5uZXRfc3RhdHMudHhfZHJvcHBlZCsrOworCXZpZi0+bmV0X3N0YXRzLnR4X2Fib3J0ZWRfZXJyb3JzKys7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQyNiw3ICs0MzgsOSBAQAogCQkJCQkgICAgICAgc3RydWN0IGh0Y19wYWNrZXQgKnBhY2tldCkKIHsKIAlzdHJ1Y3QgYXRoNmtsICphciA9IHRhcmdldC0+ZGV2LT5hcjsKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmOwogCWVudW0gaHRjX2VuZHBvaW50X2lkIGVuZHBvaW50ID0gcGFja2V0LT5lbmRwb2ludDsKKwllbnVtIGh0Y19zZW5kX2Z1bGxfYWN0aW9uIGFjdGlvbiA9IEhUQ19TRU5EX0ZVTExfS0VFUDsKIAogCWlmIChlbmRwb2ludCA9PSBhci0+Y3RybF9lcCkgewogCQkvKgpAQCAtNDM5LDE5ICs0NTMsMTEgQEAKIAkJc2V0X2JpdChXTUlfQ1RSTF9FUF9GVUxMLCAmYXItPmZsYWcpOwogCQlzcGluX3VubG9ja19iaCgmYXItPmxvY2spOwogCQlhdGg2a2xfZXJyKCJ3bWkgY3RybCBlcCBpcyBmdWxsXG4iKTsKLQkJcmV0dXJuIEhUQ19TRU5EX0ZVTExfS0VFUDsKKwkJcmV0dXJuIGFjdGlvbjsKIAl9CiAKIAlpZiAocGFja2V0LT5pbmZvLnR4LnRhZyA9PSBBVEg2S0xfQ09OVFJPTF9QS1RfVEFHKQotCQlyZXR1cm4gSFRDX1NFTkRfRlVMTF9LRUVQOwotCi0JaWYgKGFyLT5ud190eXBlID09IEFESE9DX05FVFdPUkspCi0JCS8qCi0JCSAqIEluIGFkaG9jIG1vZGUsIHdlIGNhbm5vdCBkaWZmZXJlbnRpYXRlIHRyYWZmaWMKLQkJICogcHJpb3JpdGllcyBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIGNvbnRpbnVlLCBob3dldmVyIHdlCi0JCSAqIHNob3VsZCBzdG9wIHRoZSBuZXR3b3JrLgotCQkgKi8KLQkJZ290byBzdG9wX25ldF9xdWV1ZXM7CisJCXJldHVybiBhY3Rpb247CiAKIAkvKgogCSAqIFRoZSBsYXN0IE1BWF9ISV9DT09LSUVfTlVNICJiYXRjaCIgb2YgY29va2llcyBhcmUgcmVzZXJ2ZWQgZm9yCkBAIC00NjQsMjQgKzQ3MCwzNiBAQAogCQkgKiBHaXZlIHByZWZlcmVuY2UgdG8gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgc3RyZWFtIGJ5CiAJCSAqIGRyb3BwaW5nIHRoZSBwYWNrZXRzIHdoaWNoIG92ZXJmbG93ZWQuCiAJCSAqLwotCQlyZXR1cm4gSFRDX1NFTkRfRlVMTF9EUk9QOworCQlhY3Rpb24gPSBIVENfU0VORF9GVUxMX0RST1A7CiAKLXN0b3BfbmV0X3F1ZXVlczoKLQlzcGluX2xvY2tfYmgoJmFyLT5sb2NrKTsKLQlzZXRfYml0KE5FVFFfU1RPUFBFRCwgJmFyLT5mbGFnKTsKLQlzcGluX3VubG9ja19iaCgmYXItPmxvY2spOwotCW5ldGlmX3N0b3BfcXVldWUoYXItPm5ldF9kZXYpOworCS8qIEZJWE1FOiBMb2NraW5nICovCisJc3Bpbl9sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZpZiwgJmFyLT52aWZfbGlzdCwgbGlzdCkgeworCQlpZiAodmlmLT5ud190eXBlID09IEFESE9DX05FVFdPUksgfHwKKwkJICAgIGFjdGlvbiAhPSBIVENfU0VORF9GVUxMX0RST1ApIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKIAotCXJldHVybiBIVENfU0VORF9GVUxMX0tFRVA7CisJCQlzcGluX2xvY2tfYmgoJnZpZi0+aWZfbG9jayk7CisJCQlzZXRfYml0KE5FVFFfU1RPUFBFRCwgJnZpZi0+ZmxhZ3MpOworCQkJc3Bpbl91bmxvY2tfYmgoJnZpZi0+aWZfbG9jayk7CisJCQluZXRpZl9zdG9wX3F1ZXVlKHZpZi0+bmRldik7CisKKwkJCXJldHVybiBhY3Rpb247CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCisJcmV0dXJuIGFjdGlvbjsKIH0KIAogLyogVE9ETyB0aGlzIG5lZWRzIHRvIGJlIGxvb2tlZCBhdCAqLwotc3RhdGljIHZvaWQgYXRoNmtsX3R4X2NsZWFyX25vZGVfbWFwKHN0cnVjdCBhdGg2a2wgKmFyLAorc3RhdGljIHZvaWQgYXRoNmtsX3R4X2NsZWFyX25vZGVfbWFwKHN0cnVjdCBhdGg2a2xfdmlmICp2aWYsCiAJCQkJICAgICBlbnVtIGh0Y19lbmRwb2ludF9pZCBlaWQsIHUzMiBtYXBfbm8pCiB7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB2aWYtPmFyOwogCXUzMiBpOwogCi0JaWYgKGFyLT5ud190eXBlICE9IEFESE9DX05FVFdPUkspCisJaWYgKHZpZi0+bndfdHlwZSAhPSBBREhPQ19ORVRXT1JLKQogCQlyZXR1cm47CiAKIAlpZiAoIWFyLT5pYnNzX3BzX2VuYWJsZSkKQEAgLTUyMyw3ICs1NDEsOSBAQAogCWludCBzdGF0dXM7CiAJZW51bSBodGNfZW5kcG9pbnRfaWQgZWlkOwogCWJvb2wgd2FrZV9ldmVudCA9IGZhbHNlOwotCWJvb2wgZmx1c2hpbmcgPSBmYWxzZTsKKwlib29sIGZsdXNoaW5nW0FUSDZLTF9WSUZfTUFYXSA9IHtmYWxzZX07CisJdTggaWZfaWR4OworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CiAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZza2JfcXVldWUpOwogCkBAIC01NDksOCArNTY5LDYgQEAKIAkJaWYgKCFza2IgfHwgIXNrYi0+ZGF0YSkKIAkJCWdvdG8gZmF0YWw7CiAKLQkJcGFja2V0LT5idWYgPSBza2ItPmRhdGE7Ci0KIAkJX19za2JfcXVldWVfdGFpbCgmc2tiX3F1ZXVlLCBza2IpOwogCiAJCWlmICghc3RhdHVzICYmIChwYWNrZXQtPmFjdF9sZW4gIT0gc2tiLT5sZW4pKQpAQCAtNTY5LDE1ICs1ODcsMzAgQEAKIAkJCQl3YWtlX2V2ZW50ID0gdHJ1ZTsKIAkJfQogCisJCWlmIChlaWQgPT0gYXItPmN0cmxfZXApIHsKKwkJCWlmX2lkeCA9IHdtaV9jbWRfaGRyX2dldF9pZl9pZHgoCisJCQkJKHN0cnVjdCB3bWlfY21kX2hkciAqKSBwYWNrZXQtPmJ1Zik7CisJCX0gZWxzZSB7CisJCQlpZl9pZHggPSB3bWlfZGF0YV9oZHJfZ2V0X2lmX2lkeCgKKwkJCQkoc3RydWN0IHdtaV9kYXRhX2hkciAqKSBwYWNrZXQtPmJ1Zik7CisJCX0KKworCQl2aWYgPSBhdGg2a2xfZ2V0X3ZpZl9ieV9pbmRleChhciwgaWZfaWR4KTsKKwkJaWYgKCF2aWYpIHsKKwkJCWF0aDZrbF9mcmVlX2Nvb2tpZShhciwgYXRoNmtsX2Nvb2tpZSk7CisJCQljb250aW51ZTsKKwkJfQorCiAJCWlmIChzdGF0dXMpIHsKIAkJCWlmIChzdGF0dXMgPT0gLUVDQU5DRUxFRCkKIAkJCQkvKiBhIHBhY2tldCB3YXMgZmx1c2hlZCAgKi8KLQkJCQlmbHVzaGluZyA9IHRydWU7CisJCQkJZmx1c2hpbmdbaWZfaWR4XSA9IHRydWU7CiAKLQkJCWFyLT5uZXRfc3RhdHMudHhfZXJyb3JzKys7CisJCQl2aWYtPm5ldF9zdGF0cy50eF9lcnJvcnMrKzsKIAotCQkJaWYgKHN0YXR1cyAhPSAtRU5PU1BDKQotCQkJCWF0aDZrbF9lcnIoInR4IGVycm9yLCBzdGF0dXM6IDB4JXhcbiIsIHN0YXR1cyk7CisJCQlpZiAoc3RhdHVzICE9IC1FTk9TUEMgJiYgc3RhdHVzICE9IC1FQ0FOQ0VMRUQpCisJCQkJYXRoNmtsX3dhcm4oInR4IGNvbXBsZXRlIGVycm9yOiAlZFxuIiwgc3RhdHVzKTsKKwogCQkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dMQU5fVFgsCiAJCQkJICAgIiVzOiBza2I9MHglcCBkYXRhPTB4JXAgbGVuPTB4JXggZWlkPSVkICVzXG4iLAogCQkJCSAgIF9fZnVuY19fLCBza2IsIHBhY2tldC0+YnVmLCBwYWNrZXQtPmFjdF9sZW4sCkBAIC01ODgsMjcgKzYyMSwzNCBAQAogCQkJCSAgIF9fZnVuY19fLCBza2IsIHBhY2tldC0+YnVmLCBwYWNrZXQtPmFjdF9sZW4sCiAJCQkJICAgZWlkLCAiT0siKTsKIAotCQkJZmx1c2hpbmcgPSBmYWxzZTsKLQkJCWFyLT5uZXRfc3RhdHMudHhfcGFja2V0cysrOwotCQkJYXItPm5ldF9zdGF0cy50eF9ieXRlcyArPSBza2ItPmxlbjsKKwkJCWZsdXNoaW5nW2lmX2lkeF0gPSBmYWxzZTsKKwkJCXZpZi0+bmV0X3N0YXRzLnR4X3BhY2tldHMrKzsKKwkJCXZpZi0+bmV0X3N0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwogCQl9CiAKLQkJYXRoNmtsX3R4X2NsZWFyX25vZGVfbWFwKGFyLCBlaWQsIG1hcF9ubyk7CisJCWF0aDZrbF90eF9jbGVhcl9ub2RlX21hcCh2aWYsIGVpZCwgbWFwX25vKTsKIAogCQlhdGg2a2xfZnJlZV9jb29raWUoYXIsIGF0aDZrbF9jb29raWUpOwogCi0JCWlmICh0ZXN0X2JpdChORVRRX1NUT1BQRUQsICZhci0+ZmxhZykpCi0JCQljbGVhcl9iaXQoTkVUUV9TVE9QUEVELCAmYXItPmZsYWcpOworCQlpZiAodGVzdF9iaXQoTkVUUV9TVE9QUEVELCAmdmlmLT5mbGFncykpCisJCQljbGVhcl9iaXQoTkVUUV9TVE9QUEVELCAmdmlmLT5mbGFncyk7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJmFyLT5sb2NrKTsKIAogCV9fc2tiX3F1ZXVlX3B1cmdlKCZza2JfcXVldWUpOwogCi0JaWYgKHRlc3RfYml0KENPTk5FQ1RFRCwgJmFyLT5mbGFnKSkgewotCQlpZiAoIWZsdXNoaW5nKQotCQkJbmV0aWZfd2FrZV9xdWV1ZShhci0+bmV0X2Rldik7CisJLyogRklYTUU6IExvY2tpbmcgKi8KKwlzcGluX2xvY2tfYmgoJmFyLT5saXN0X2xvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkodmlmLCAmYXItPnZpZl9saXN0LCBsaXN0KSB7CisJCWlmICh0ZXN0X2JpdChDT05ORUNURUQsICZ2aWYtPmZsYWdzKSAmJgorCQkgICAgIWZsdXNoaW5nW3ZpZi0+ZndfdmlmX2lkeF0pIHsKKwkJCXNwaW5fdW5sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwkJCW5ldGlmX3dha2VfcXVldWUodmlmLT5uZGV2KTsKKwkJCXNwaW5fbG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisJCX0KIAl9CisJc3Bpbl91bmxvY2tfYmgoJmFyLT5saXN0X2xvY2spOwogCiAJaWYgKHdha2VfZXZlbnQpCiAJCXdha2VfdXAoJmFyLT5ldmVudF93cSk7CkBAIC0xMDQxLDggKzEwODEsOSBAQAogCXN0cnVjdCBhdGg2a2xfc3RhICpjb25uID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMSA9IE5VTEw7CiAJc3RydWN0IGV0aGhkciAqZGF0YXAgPSBOVUxMOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CiAJdTE2IHNlcV9ubywgb2Zmc2V0OwotCXU4IHRpZDsKKwl1OCB0aWQsIGlmX2lkeDsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTEFOX1JYLAogCQkgICAiJXM6IGFyPTB4JXAgZWlkPSVkLCBza2I9MHglcCwgZGF0YT0weCVwLCBsZW49MHgleCBzdGF0dXM6JWQiLApAQCAtMTA1MCw3ICsxMDkxLDIzIEBACiAJCSAgIHBhY2tldC0+YWN0X2xlbiwgc3RhdHVzKTsKIAogCWlmIChzdGF0dXMgfHwgIShza2ItPmRhdGEgKyBIVENfSERSX0xFTkdUSCkpIHsKLQkJYXItPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJZGV2X2tmcmVlX3NrYihza2IpOworCQlyZXR1cm47CisJfQorCisJc2tiX3B1dChza2IsIHBhY2tldC0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIKTsKKwlza2JfcHVsbChza2IsIEhUQ19IRFJfTEVOR1RIKTsKKworCWlmIChlcHQgPT0gYXItPmN0cmxfZXApIHsKKwkJaWZfaWR4ID0KKwkJd21pX2NtZF9oZHJfZ2V0X2lmX2lkeCgoc3RydWN0IHdtaV9jbWRfaGRyICopIHNrYi0+ZGF0YSk7CisJfSBlbHNlIHsKKwkJaWZfaWR4ID0KKwkJd21pX2RhdGFfaGRyX2dldF9pZl9pZHgoKHN0cnVjdCB3bWlfZGF0YV9oZHIgKikgc2tiLT5kYXRhKTsKKwl9CisKKwl2aWYgPSBhdGg2a2xfZ2V0X3ZpZl9ieV9pbmRleChhciwgaWZfaWR4KTsKKwlpZiAoIXZpZikgewogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybjsKIAl9CkBAIC0xMDU5LDI4ICsxMTE2LDI4IEBACiAJICogVGFrZSBsb2NrIHRvIHByb3RlY3QgYnVmZmVyIGNvdW50cyBhbmQgYWRhcHRpdmUgcG93ZXIgdGhyb3VnaHB1dAogCSAqIHN0YXRlLgogCSAqLwotCXNwaW5fbG9ja19iaCgmYXItPmxvY2spOworCXNwaW5fbG9ja19iaCgmdmlmLT5pZl9sb2NrKTsKIAotCWFyLT5uZXRfc3RhdHMucnhfcGFja2V0cysrOwotCWFyLT5uZXRfc3RhdHMucnhfYnl0ZXMgKz0gcGFja2V0LT5hY3RfbGVuOworCXZpZi0+bmV0X3N0YXRzLnJ4X3BhY2tldHMrKzsKKwl2aWYtPm5ldF9zdGF0cy5yeF9ieXRlcyArPSBwYWNrZXQtPmFjdF9sZW47CiAKLQlzcGluX3VubG9ja19iaCgmYXItPmxvY2spOworCXNwaW5fdW5sb2NrX2JoKCZ2aWYtPmlmX2xvY2spOwogCi0Jc2tiX3B1dChza2IsIHBhY2tldC0+YWN0X2xlbiArIEhUQ19IRFJfTEVOR1RIKTsKLQlza2JfcHVsbChza2IsIEhUQ19IRFJfTEVOR1RIKTsKIAogCWF0aDZrbF9kYmdfZHVtcChBVEg2S0xfREJHX1JBV19CWVRFUywgX19mdW5jX18sICJyeCAiLAogCQkJc2tiLT5kYXRhLCBza2ItPmxlbik7CiAKLQlza2ItPmRldiA9IGFyLT5uZXRfZGV2OworCXNrYi0+ZGV2ID0gdmlmLT5uZGV2OwogCiAJaWYgKCF0ZXN0X2JpdChXTUlfRU5BQkxFRCwgJmFyLT5mbGFnKSkgewogCQlpZiAoRVBQSU5HX0FMSUdOTUVOVF9QQUQgPiAwKQogCQkJc2tiX3B1bGwoc2tiLCBFUFBJTkdfQUxJR05NRU5UX1BBRCk7Ci0JCWF0aDZrbF9kZWxpdmVyX2ZyYW1lc190b19ud19zdGFjayhhci0+bmV0X2Rldiwgc2tiKTsKKwkJYXRoNmtsX2RlbGl2ZXJfZnJhbWVzX3RvX253X3N0YWNrKHZpZi0+bmRldiwgc2tiKTsKIAkJcmV0dXJuOwogCX0KIAorCWF0aDZrbF9jaGVja193b3dfc3RhdHVzKGFyKTsKKwogCWlmIChlcHQgPT0gYXItPmN0cmxfZXApIHsKIAkJYXRoNmtsX3dtaV9jb250cm9sX3J4KGFyLT53bWksIHNrYik7CiAJCXJldHVybjsKQEAgLTEwOTYsMTggKzExNTMsMTggQEAKIAkgKiB0aGF0IGRvIG5vdCBoYXZlIExMQyBoZHIuIFRoZXkgYXJlIDE2IGJ5dGVzIGluIHNpemUuCiAJICogQWxsb3cgdGhlc2UgZnJhbWVzIGluIHRoZSBBUCBtb2RlLgogCSAqLwotCWlmIChhci0+bndfdHlwZSAhPSBBUF9ORVRXT1JLICYmCisJaWYgKHZpZi0+bndfdHlwZSAhPSBBUF9ORVRXT1JLICYmCiAJICAgICgocGFja2V0LT5hY3RfbGVuIDwgbWluX2hkcl9sZW4pIHx8CiAJICAgICAocGFja2V0LT5hY3RfbGVuID4gV01JX01BWF9BTVNEVV9SWF9EQVRBX0ZSQU1FX0xFTkdUSCkpKSB7CiAJCWF0aDZrbF9pbmZvKCJmcmFtZSBsZW4gaXMgdG9vIHNob3J0IG9yIHRvbyBsb25nXG4iKTsKLQkJYXItPm5ldF9zdGF0cy5yeF9lcnJvcnMrKzsKLQkJYXItPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CisJCXZpZi0+bmV0X3N0YXRzLnJ4X2Vycm9ycysrOworCQl2aWYtPm5ldF9zdGF0cy5yeF9sZW5ndGhfZXJyb3JzKys7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuOwogCX0KIAogCS8qIEdldCB0aGUgUG93ZXIgc2F2ZSBzdGF0ZSBvZiB0aGUgU1RBICovCi0JaWYgKGFyLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKIAkJbWV0YV90eXBlID0gd21pX2RhdGFfaGRyX2dldF9tZXRhKGRoZHIpOwogCiAJCXBzX3N0YXRlID0gISEoKGRoZHItPmluZm8gPj4gV01JX0RBVEFfSERSX1BTX1NISUZUKSAmCkBAIC0xMTI5LDcgKzExODYsNyBAQAogCQl9CiAKIAkJZGF0YXAgPSAoc3RydWN0IGV0aGhkciAqKSAoc2tiLT5kYXRhICsgb2Zmc2V0KTsKLQkJY29ubiA9IGF0aDZrbF9maW5kX3N0YShhciwgZGF0YXAtPmhfc291cmNlKTsKKwkJY29ubiA9IGF0aDZrbF9maW5kX3N0YSh2aWYsIGRhdGFwLT5oX3NvdXJjZSk7CiAKIAkJaWYgKCFjb25uKSB7CiAJCQlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC0xMTYwLDEyICsxMjE3LDEzIEBACiAJCQkJd2hpbGUgKChza2J1ZmYgPSBza2JfZGVxdWV1ZSgmY29ubi0+cHNxKSkKIAkJCQkgICAgICAgIT0gTlVMTCkgewogCQkJCQlzcGluX3VubG9ja19iaCgmY29ubi0+cHNxX2xvY2spOwotCQkJCQlhdGg2a2xfZGF0YV90eChza2J1ZmYsIGFyLT5uZXRfZGV2KTsKKwkJCQkJYXRoNmtsX2RhdGFfdHgoc2tidWZmLCB2aWYtPm5kZXYpOwogCQkJCQlzcGluX2xvY2tfYmgoJmNvbm4tPnBzcV9sb2NrKTsKIAkJCQl9CiAJCQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPnBzcV9sb2NrKTsKIAkJCQkvKiBDbGVhciB0aGUgUFZCIGZvciB0aGlzIFNUQSAqLwotCQkJCWF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoYXItPndtaSwgY29ubi0+YWlkLCAwKTsKKwkJCQlhdGg2a2xfd21pX3NldF9wdmJfY21kKGFyLT53bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJCSAgICAgICBjb25uLT5haWQsIDApOwogCQkJfQogCQl9CiAKQEAgLTEyMTUsMTIgKzEyNzMsMTIgQEAKIAkJcmV0dXJuOwogCX0KIAotCWlmICghKGFyLT5uZXRfZGV2LT5mbGFncyAmIElGRl9VUCkpIHsKKwlpZiAoISh2aWYtPm5kZXYtPmZsYWdzICYgSUZGX1VQKSkgewogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykgeworCWlmICh2aWYtPm53X3R5cGUgPT0gQVBfTkVUV09SSykgewogCQlkYXRhcCA9IChzdHJ1Y3QgZXRoaGRyICopIHNrYi0+ZGF0YTsKIAkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGRhdGFwLT5oX2Rlc3QpKQogCQkJLyoKQEAgLTEyMzUsOCArMTI5Myw3IEBACiAJCQkgKiBmcmFtZSB0byBpdCBvbiB0aGUgYWlyIGVsc2Ugc2VuZCB0aGUKIAkJCSAqIGZyYW1lIHVwIHRoZSBzdGFjay4KIAkJCSAqLwotCQkJc3RydWN0IGF0aDZrbF9zdGEgKmNvbm4gPSBOVUxMOwotCQkJY29ubiA9IGF0aDZrbF9maW5kX3N0YShhciwgZGF0YXAtPmhfZGVzdCk7CisJCQljb25uID0gYXRoNmtsX2ZpbmRfc3RhKHZpZiwgZGF0YXAtPmhfZGVzdCk7CiAKIAkJCWlmIChjb25uICYmIGFyLT5pbnRyYV9ic3MpIHsKIAkJCQlza2IxID0gc2tiOwpAQCAtMTI0NywxOCArMTMwNCwyMyBAQAogCQkJfQogCQl9CiAJCWlmIChza2IxKQotCQkJYXRoNmtsX2RhdGFfdHgoc2tiMSwgYXItPm5ldF9kZXYpOworCQkJYXRoNmtsX2RhdGFfdHgoc2tiMSwgdmlmLT5uZGV2KTsKKworCQlpZiAoc2tiID09IE5VTEwpIHsKKwkJCS8qIG5vdGhpbmcgdG8gZGVsaXZlciB1cCB0aGUgc3RhY2sgKi8KKwkJCXJldHVybjsKKwkJfQogCX0KIAogCWRhdGFwID0gKHN0cnVjdCBldGhoZHIgKikgc2tiLT5kYXRhOwogCiAJaWYgKGlzX3VuaWNhc3RfZXRoZXJfYWRkcihkYXRhcC0+aF9kZXN0KSAmJgotCSAgICBhZ2dyX3Byb2Nlc3NfcmVjdl9mcm0oYXItPmFnZ3JfY250eHQsIHRpZCwgc2VxX25vLAorCSAgICBhZ2dyX3Byb2Nlc3NfcmVjdl9mcm0odmlmLT5hZ2dyX2NudHh0LCB0aWQsIHNlcV9ubywKIAkJCQkgIGlzX2Ftc2R1LCBza2IpKQogCQkvKiBhZ2dyZWdhdGlvbiBjb2RlIHdpbGwgaGFuZGxlIHRoZSBza2IgKi8KIAkJcmV0dXJuOwogCi0JYXRoNmtsX2RlbGl2ZXJfZnJhbWVzX3RvX253X3N0YWNrKGFyLT5uZXRfZGV2LCBza2IpOworCWF0aDZrbF9kZWxpdmVyX2ZyYW1lc190b19ud19zdGFjayh2aWYtPm5kZXYsIHNrYik7CiB9CiAKIHN0YXRpYyB2b2lkIGFnZ3JfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKQEAgLTEzMzYsOSArMTM5OCwxMCBAQAogCW1lbXNldChzdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCByeHRpZF9zdGF0cykpOwogfQogCi12b2lkIGFnZ3JfcmVjdl9hZGRiYV9yZXFfZXZ0KHN0cnVjdCBhdGg2a2wgKmFyLCB1OCB0aWQsIHUxNiBzZXFfbm8sIHU4IHdpbl9zeikKK3ZvaWQgYWdncl9yZWN2X2FkZGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggdGlkLCB1MTYgc2VxX25vLAorCQkJICAgICB1OCB3aW5fc3opCiB7Ci0Jc3RydWN0IGFnZ3JfaW5mbyAqcF9hZ2dyID0gYXItPmFnZ3JfY250eHQ7CisJc3RydWN0IGFnZ3JfaW5mbyAqcF9hZ2dyID0gdmlmLT5hZ2dyX2NudHh0OwogCXN0cnVjdCByeHRpZCAqcnh0aWQ7CiAJc3RydWN0IHJ4dGlkX3N0YXRzICpzdGF0czsKIAl1MTYgaG9sZF9xX3NpemU7CkBAIC0xNDA1LDkgKzE0NjgsOSBAQAogCXJldHVybiBwX2FnZ3I7CiB9CiAKLXZvaWQgYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbCAqYXIsIHU4IHRpZCkKK3ZvaWQgYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQoc3RydWN0IGF0aDZrbF92aWYgKnZpZiwgdTggdGlkKQogewotCXN0cnVjdCBhZ2dyX2luZm8gKnBfYWdnciA9IGFyLT5hZ2dyX2NudHh0OworCXN0cnVjdCBhZ2dyX2luZm8gKnBfYWdnciA9IHZpZi0+YWdncl9jbnR4dDsKIAlzdHJ1Y3Qgcnh0aWQgKnJ4dGlkOwogCiAJaWYgKCFwX2FnZ3IpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuYwppbmRleCBhN2RlMjNjLi5mNmYyYWEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmMKQEAgLTIxLDcgKzIxLDcgQEAKICNpbmNsdWRlICIuLi9yZWdkLmgiCiAjaW5jbHVkZSAiLi4vcmVnZF9jb21tb24uaCIKIAotc3RhdGljIGludCBhdGg2a2xfd21pX3N5bmNfcG9pbnQoc3RydWN0IHdtaSAqd21pKTsKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9zeW5jX3BvaW50KHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4KTsKIAogc3RhdGljIGNvbnN0IHMzMiB3bWlfcmF0ZV90YmxbXVsyXSA9IHsKIAkvKiB7Vy9PIFNHSSwgd2l0aCBTR0l9ICovCkBAIC04MSw2ICs4MSwyNiBAQAogCXJldHVybiB3bWktPmVwX2lkOwogfQogCitzdHJ1Y3QgYXRoNmtsX3ZpZiAqYXRoNmtsX2dldF92aWZfYnlfaW5kZXgoc3RydWN0IGF0aDZrbCAqYXIsIHU4IGlmX2lkeCkKK3sKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmLCAqZm91bmQgPSBOVUxMOworCisJaWYgKFdBUk5fT04oaWZfaWR4ID4gKGFyLT52aWZfbWF4IC0gMSkpKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEZJWE1FOiBMb2NraW5nICovCisJc3Bpbl9sb2NrX2JoKCZhci0+bGlzdF9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZpZiwgJmFyLT52aWZfbGlzdCwgbGlzdCkgeworCQlpZiAodmlmLT5md192aWZfaWR4ID09IGlmX2lkeCkgeworCQkJZm91bmQgPSB2aWY7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9ja19iaCgmYXItPmxpc3RfbG9jayk7CisKKwlyZXR1cm4gZm91bmQ7Cit9CisKIC8qICBQZXJmb3JtcyBESVggdG8gODAyLjMgZW5jYXBzdWxhdGlvbiBmb3IgdHJhbnNtaXQgcGFja2V0cy4KICAqICBBc3N1bWVzIHRoZSBlbnRpcmUgRElYIGhlYWRlciBpcyBjb250aWdvdXMgYW5kIHRoYXQgdGhlcmUgaXMKICAqICBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyIGZvciBhIDgwMi4zIG1hYyBoZWFkZXIgYW5kIExMQytTTkFQIGhlYWRlcnMuCkBAIC0xNjIsMTIgKzE4MiwxMiBAQAogaW50IGF0aDZrbF93bWlfZGF0YV9oZHJfYWRkKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICB1OCBtc2dfdHlwZSwgYm9vbCBtb3JlX2RhdGEsCiAJCQkgICAgZW51bSB3bWlfZGF0YV9oZHJfZGF0YV90eXBlIGRhdGFfdHlwZSwKLQkJCSAgICB1OCBtZXRhX3Zlciwgdm9pZCAqdHhfbWV0YV9pbmZvKQorCQkJICAgIHU4IG1ldGFfdmVyLCB2b2lkICp0eF9tZXRhX2luZm8sIHU4IGlmX2lkeCkKIHsKIAlzdHJ1Y3Qgd21pX2RhdGFfaGRyICpkYXRhX2hkcjsKIAlpbnQgcmV0OwogCi0JaWYgKFdBUk5fT04oc2tiID09IE5VTEwpKQorCWlmIChXQVJOX09OKHNrYiA9PSBOVUxMIHx8IChpZl9pZHggPiB3bWktPnBhcmVudF9kZXYtPnZpZl9tYXggLSAxKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJaWYgKHR4X21ldGFfaW5mbykgewpAQCAtMTg5LDcgKzIwOSw3IEBACiAJCSAgICBXTUlfREFUQV9IRFJfTU9SRV9NQVNLIDw8IFdNSV9EQVRBX0hEUl9NT1JFX1NISUZUOwogCiAJZGF0YV9oZHItPmluZm8yID0gY3B1X3RvX2xlMTYobWV0YV92ZXIgPDwgV01JX0RBVEFfSERSX01FVEFfU0hJRlQpOwotCWRhdGFfaGRyLT5pbmZvMyA9IDA7CisJZGF0YV9oZHItPmluZm8zID0gY3B1X3RvX2xlMTYoaWZfaWR4ICYgV01JX0RBVEFfSERSX0lGX0lEWF9NQVNLKTsKIAogCXJldHVybiAwOwogfQpAQCAtMjE2LDcgKzIzNiw4IEBACiAJCXJldHVybiBpcF9wcmk7CiB9CiAKLWludCBhdGg2a2xfd21pX2ltcGxpY2l0X2NyZWF0ZV9wc3RyZWFtKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2ludCBhdGg2a2xfd21pX2ltcGxpY2l0X2NyZWF0ZV9wc3RyZWFtKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCSAgICAgICB1MzIgbGF5ZXIyX3ByaW9yaXR5LCBib29sIHdtbV9lbmFibGVkLAogCQkJCSAgICAgICB1OCAqYWMpCiB7CkBAIC0yNjIsNyArMjgzLDEyIEBACiAJCQl1c3JfcHJpID0gbGF5ZXIyX3ByaW9yaXR5ICYgMHg3OwogCX0KIAotCS8qIHdvcmthcm91bmQgZm9yIFdNTSBTNSAqLworCS8qCisJICogd29ya2Fyb3VuZCBmb3IgV01NIFM1CisJICoKKwkgKiBGSVhNRTogd21pLT50cmFmZmljX2NsYXNzIGlzIGFsd2F5cyAxMDAgc28gdGhpcyB0ZXN0IGRvZXNuJ3QKKwkgKiBtYWtlIHNlbnNlCisJICovCiAJaWYgKCh3bWktPnRyYWZmaWNfY2xhc3MgPT0gV01NX0FDX1ZJKSAmJgogCSAgICAoKHVzcl9wcmkgPT0gNSkgfHwgKHVzcl9wcmkgPT0gNCkpKQogCQl1c3JfcHJpID0gMTsKQEAgLTI4NCw3ICszMTAsNyBAQAogCQkJY3B1X3RvX2xlMzIoV01JX0lNUExJQ0lUX1BTVFJFQU1fSU5BQ1RJVklUWV9JTlQpOwogCQkvKiBJbXBsaWNpdCBzdHJlYW1zIGFyZSBjcmVhdGVkIHdpdGggVFNJRCAweEZGICovCiAJCWNtZC50c2lkID0gV01JX0lNUExJQ0lUX1BTVFJFQU07Ci0JCWF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKHdtaSwgJmNtZCk7CisJCWF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKHdtaSwgaWZfaWR4LCAmY21kKTsKIAl9CiAKIAkqYWMgPSB0cmFmZmljX2NsYXNzOwpAQCAtNDEwLDEzICs0MzYsMTQgQEAKIH0KIAogc3RhdGljIGludCBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLAotCQkJCQkgICAgICBpbnQgbGVuKQorCQkJCQkgICAgICBpbnQgbGVuLCBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfcmVtYWluX29uX2NobmxfZXZlbnQgKmV2OwogCXUzMiBmcmVxOwogCXUzMiBkdXI7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOwogCXN0cnVjdCBhdGg2a2wgKmFyID0gd21pLT5wYXJlbnRfZGV2OworCXUzMiBpZDsKIAogCWlmIChsZW4gPCBzaXplb2YoKmV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MjYsMjYgKzQ1MywyOSBAQAogCWR1ciA9IGxlMzJfdG9fY3B1KGV2LT5kdXJhdGlvbik7CiAJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgInJlbWFpbl9vbl9jaG5sOiBmcmVxPSV1IGR1cj0ldVxuIiwKIAkJICAgZnJlcSwgZHVyKTsKLQljaGFuID0gaWVlZTgwMjExX2dldF9jaGFubmVsKGFyLT53ZGV2LT53aXBoeSwgZnJlcSk7CisJY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChhci0+d2lwaHksIGZyZXEpOwogCWlmICghY2hhbikgewogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAicmVtYWluX29uX2Nobmw6IFVua25vd24gY2hhbm5lbCAiCiAJCQkgICAiKGZyZXE9JXUpXG4iLCBmcmVxKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQotCWNmZzgwMjExX3JlYWR5X29uX2NoYW5uZWwoYXItPm5ldF9kZXYsIDEsIGNoYW4sIE5MODAyMTFfQ0hBTl9OT19IVCwKKwlpZCA9IHZpZi0+bGFzdF9yb2NfaWQ7CisJY2ZnODAyMTFfcmVhZHlfb25fY2hhbm5lbCh2aWYtPm5kZXYsIGlkLCBjaGFuLCBOTDgwMjExX0NIQU5fTk9fSFQsCiAJCQkJICBkdXIsIEdGUF9BVE9NSUMpOwogCiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX3dtaV9jYW5jZWxfcmVtYWluX29uX2NobmxfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLAotCQkJCQkJICAgICB1OCAqZGF0YXAsIGludCBsZW4pCisJCQkJCQkgICAgIHU4ICpkYXRhcCwgaW50IGxlbiwKKwkJCQkJCSAgICAgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX2NhbmNlbF9yZW1haW5fb25fY2hubF9ldmVudCAqZXY7CiAJdTMyIGZyZXE7CiAJdTMyIGR1cjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAJc3RydWN0IGF0aDZrbCAqYXIgPSB3bWktPnBhcmVudF9kZXY7CisJdTMyIGlkOwogCiAJaWYgKGxlbiA8IHNpemVvZigqZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ1NSwyMyArNDg1LDI5IEBACiAJZHVyID0gbGUzMl90b19jcHUoZXYtPmR1cmF0aW9uKTsKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiY2FuY2VsX3JlbWFpbl9vbl9jaG5sOiBmcmVxPSV1IGR1cj0ldSAiCiAJCSAgICJzdGF0dXM9JXVcbiIsIGZyZXEsIGR1ciwgZXYtPnN0YXR1cyk7Ci0JY2hhbiA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChhci0+d2Rldi0+d2lwaHksIGZyZXEpOworCWNoYW4gPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwoYXItPndpcGh5LCBmcmVxKTsKIAlpZiAoIWNoYW4pIHsKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgImNhbmNlbF9yZW1haW5fb25fY2hubDogVW5rbm93biAiCiAJCQkgICAiY2hhbm5lbCAoZnJlcT0ldSlcbiIsIGZyZXEpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JY2ZnODAyMTFfcmVtYWluX29uX2NoYW5uZWxfZXhwaXJlZChhci0+bmV0X2RldiwgMSwgY2hhbiwKKwlpZiAodmlmLT5sYXN0X2NhbmNlbF9yb2NfaWQgJiYKKwkgICAgdmlmLT5sYXN0X2NhbmNlbF9yb2NfaWQgKyAxID09IHZpZi0+bGFzdF9yb2NfaWQpCisJCWlkID0gdmlmLT5sYXN0X2NhbmNlbF9yb2NfaWQ7IC8qIGV2ZW50IGZvciBjYW5jZWwgY29tbWFuZCAqLworCWVsc2UKKwkJaWQgPSB2aWYtPmxhc3Rfcm9jX2lkOyAvKiB0aW1lb3V0IG9uIHVuY2FuY2VsZWQgci1vLWMgKi8KKwl2aWYtPmxhc3RfY2FuY2VsX3JvY19pZCA9IDA7CisJY2ZnODAyMTFfcmVtYWluX29uX2NoYW5uZWxfZXhwaXJlZCh2aWYtPm5kZXYsIGlkLCBjaGFuLAogCQkJCQkgICBOTDgwMjExX0NIQU5fTk9fSFQsIEdGUF9BVE9NSUMpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV90eF9zdGF0dXNfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfdHhfc3RhdHVzX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCQkgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX3R4X3N0YXR1c19ldmVudCAqZXY7CiAJdTMyIGlkOwotCXN0cnVjdCBhdGg2a2wgKmFyID0gd21pLT5wYXJlbnRfZGV2OwogCiAJaWYgKGxlbiA8IHNpemVvZigqZXYpKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ4MSw3ICs1MTcsNyBAQAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJ0eF9zdGF0dXM6IGlkPSV4IGFja19zdGF0dXM9JXVcbiIsCiAJCSAgIGlkLCBldi0+YWNrX3N0YXR1cyk7CiAJaWYgKHdtaS0+bGFzdF9tZ210X3R4X2ZyYW1lKSB7Ci0JCWNmZzgwMjExX21nbXRfdHhfc3RhdHVzKGFyLT5uZXRfZGV2LCBpZCwKKwkJY2ZnODAyMTFfbWdtdF90eF9zdGF0dXModmlmLT5uZGV2LCBpZCwKIAkJCQkJd21pLT5sYXN0X21nbXRfdHhfZnJhbWUsCiAJCQkJCXdtaS0+bGFzdF9tZ210X3R4X2ZyYW1lX2xlbiwKIAkJCQkJISFldi0+YWNrX3N0YXR1cywgR0ZQX0FUT01JQyk7CkBAIC00OTMsMTIgKzUyOSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfcnhfcHJvYmVfcmVxX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX3J4X3Byb2JlX3JlcV9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbiwKKwkJCQkJICAgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9wMnBfcnhfcHJvYmVfcmVxX2V2ZW50ICpldjsKIAl1MzIgZnJlcTsKIAl1MTYgZGxlbjsKLQlzdHJ1Y3QgYXRoNmtsICphciA9IHdtaS0+cGFyZW50X2RldjsKIAogCWlmIChsZW4gPCBzaXplb2YoKmV2KSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC01MTMsMTAgKzU0OSwxMCBAQAogCX0KIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAicnhfcHJvYmVfcmVxOiBsZW49JXUgZnJlcT0ldSAiCiAJCSAgICJwcm9iZV9yZXFfcmVwb3J0PSVkXG4iLAotCQkgICBkbGVuLCBmcmVxLCBhci0+cHJvYmVfcmVxX3JlcG9ydCk7CisJCSAgIGRsZW4sIGZyZXEsIHZpZi0+cHJvYmVfcmVxX3JlcG9ydCk7CiAKLQlpZiAoYXItPnByb2JlX3JlcV9yZXBvcnQgfHwgYXItPm53X3R5cGUgPT0gQVBfTkVUV09SSykKLQkJY2ZnODAyMTFfcnhfbWdtdChhci0+bmV0X2RldiwgZnJlcSwgZXYtPmRhdGEsIGRsZW4sIEdGUF9BVE9NSUMpOworCWlmICh2aWYtPnByb2JlX3JlcV9yZXBvcnQgfHwgdmlmLT5ud190eXBlID09IEFQX05FVFdPUkspCisJCWNmZzgwMjExX3J4X21nbXQodmlmLT5uZGV2LCBmcmVxLCBldi0+ZGF0YSwgZGxlbiwgR0ZQX0FUT01JQyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUzNiwxMiArNTcyLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9yeF9hY3Rpb25fZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfcnhfYWN0aW9uX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCQkgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX3J4X2FjdGlvbl9ldmVudCAqZXY7CiAJdTMyIGZyZXE7CiAJdTE2IGRsZW47Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSB3bWktPnBhcmVudF9kZXY7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKCpldikpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtNTU1LDcgKzU5MSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAicnhfYWN0aW9uOiBsZW49JXUgZnJlcT0ldVxuIiwgZGxlbiwgZnJlcSk7Ci0JY2ZnODAyMTFfcnhfbWdtdChhci0+bmV0X2RldiwgZnJlcSwgZXYtPmRhdGEsIGRsZW4sIEdGUF9BVE9NSUMpOworCWNmZzgwMjExX3J4X21nbXQodmlmLT5uZGV2LCBmcmVxLCBldi0+ZGF0YSwgZGxlbiwgR0ZQX0FUT01JQyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTYyMCw3ICs2NTYsOCBAQAogfQogCiAvKiBTZW5kIGEgInNpbXBsZSIgd21pIGNvbW1hbmQgLS0gb25lIHdpdGggbm8gYXJndW1lbnRzICovCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfc2ltcGxlX2NtZChzdHJ1Y3Qgd21pICp3bWksIGVudW0gd21pX2NtZF9pZCBjbWRfaWQpCitzdGF0aWMgaW50IGF0aDZrbF93bWlfc2ltcGxlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgZW51bSB3bWlfY21kX2lkIGNtZF9pZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCByZXQ7CkBAIC02MjksNyArNjY2LDcgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBjbWRfaWQsIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBjbWRfaWQsIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjQxLDcgKzY3OCw2IEBACiAJaWYgKGxlbiA8IHNpemVvZihzdHJ1Y3Qgd21pX3JlYWR5X2V2ZW50XzIpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXdtaS0+cmVhZHkgPSB0cnVlOwogCWF0aDZrbF9yZWFkeV9ldmVudCh3bWktPnBhcmVudF9kZXYsIGV2LT5tYWNfYWRkciwKIAkJCSAgIGxlMzJfdG9fY3B1KGV2LT5zd192ZXJzaW9uKSwKIAkJCSAgIGxlMzJfdG9fY3B1KGV2LT5hYmlfdmVyc2lvbikpOwpAQCAtNjczLDMyICs3MDksNzMgQEAKIAljbWQtPmluZm8ucGFyYW1zLnJvYW1fcnNzaV9mbG9vciA9IERFRl9MUlNTSV9ST0FNX0ZMT09SOwogCWNtZC0+cm9hbV9jdHJsID0gV01JX1NFVF9MUlNTSV9TQ0FOX1BBUkFNUzsKIAotCWF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfUk9BTV9DVFJMX0NNRElELCBOT19TWU5DX1dNSUZMQUcpOworCWF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9TRVRfUk9BTV9DVFJMX0NNRElELAorCQkJICAgIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX2Nvbm5lY3RfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitpbnQgYXRoNmtsX3dtaV9mb3JjZV9yb2FtX2NtZChzdHJ1Y3Qgd21pICp3bWksIGNvbnN0IHU4ICpic3NpZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCByb2FtX2N0cmxfY21kICpjbWQ7CisKKwlza2IgPSBhdGg2a2xfd21pX2dldF9uZXdfYnVmKHNpemVvZigqY21kKSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kID0gKHN0cnVjdCByb2FtX2N0cmxfY21kICopIHNrYi0+ZGF0YTsKKwltZW1zZXQoY21kLCAwLCBzaXplb2YoKmNtZCkpOworCisJbWVtY3B5KGNtZC0+aW5mby5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKKwljbWQtPnJvYW1fY3RybCA9IFdNSV9GT1JDRV9ST0FNOworCisJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgImZvcmNlIHJvYW0gdG8gJXBNXG4iLCBic3NpZCk7CisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9TRVRfUk9BTV9DVFJMX0NNRElELAorCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7Cit9CisKK2ludCBhdGg2a2xfd21pX3NldF9yb2FtX21vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgZW51bSB3bWlfcm9hbV9tb2RlIG1vZGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgcm9hbV9jdHJsX2NtZCAqY21kOworCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplb2YoKmNtZCkpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZCA9IChzdHJ1Y3Qgcm9hbV9jdHJsX2NtZCAqKSBza2ItPmRhdGE7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKKworCWNtZC0+aW5mby5yb2FtX21vZGUgPSBtb2RlOworCWNtZC0+cm9hbV9jdHJsID0gV01JX1NFVF9ST0FNX01PREU7CisKKwlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAic2V0IHJvYW0gbW9kZSAlZFxuIiwgbW9kZSk7CisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9TRVRfUk9BTV9DVFJMX0NNRElELAorCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9jb25uZWN0X2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCSAgICAgICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfY29ubmVjdF9ldmVudCAqZXY7CiAJdTggKnBpZSwgKnBlaWU7Ci0Jc3RydWN0IGF0aDZrbCAqYXIgPSB3bWktPnBhcmVudF9kZXY7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCB3bWlfY29ubmVjdF9ldmVudCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJZXYgPSAoc3RydWN0IHdtaV9jb25uZWN0X2V2ZW50ICopIGRhdGFwOwogCi0JaWYgKGFyLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKKwlpZiAodmlmLT5ud190eXBlID09IEFQX05FVFdPUkspIHsKIAkJLyogQVAgbW9kZSBzdGFydC9TVEEgY29ubmVjdGVkIGV2ZW50ICovCi0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhci0+bmV0X2RldjsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZpZi0+bmRldjsKIAkJaWYgKG1lbWNtcChkZXYtPmRldl9hZGRyLCBldi0+dS5hcF9ic3MuYnNzaWQsIEVUSF9BTEVOKSA9PSAwKSB7CiAJCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiJXM6IGZyZXEgJWQgYnNzaWQgJXBNICIKIAkJCQkgICAiKEFQIHN0YXJ0ZWQpXG4iLAogCQkJCSAgIF9fZnVuY19fLCBsZTE2X3RvX2NwdShldi0+dS5hcF9ic3MuY2gpLAogCQkJCSAgIGV2LT51LmFwX2Jzcy5ic3NpZCk7CiAJCQlhdGg2a2xfY29ubmVjdF9hcF9tb2RlX2JzcygKLQkJCQlhciwgbGUxNl90b19jcHUoZXYtPnUuYXBfYnNzLmNoKSk7CisJCQkJdmlmLCBsZTE2X3RvX2NwdShldi0+dS5hcF9ic3MuY2gpKTsKIAkJfSBlbHNlIHsKIAkJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICIlczogYWlkICV1IG1hY19hZGRyICVwTSAiCiAJCQkJICAgImF1dGg9JXUga2V5bWdtdD0ldSBjaXBoZXI9JXUgYXBzZF9pbmZvPSV1ICIKQEAgLTcxMCw3ICs3ODcsNyBAQAogCQkJCSAgIGxlMTZfdG9fY3B1KGV2LT51LmFwX3N0YS5jaXBoZXIpLAogCQkJCSAgIGV2LT51LmFwX3N0YS5hcHNkX2luZm8pOwogCQkJYXRoNmtsX2Nvbm5lY3RfYXBfbW9kZV9zdGEoCi0JCQkJYXIsIGV2LT51LmFwX3N0YS5haWQsIGV2LT51LmFwX3N0YS5tYWNfYWRkciwKKwkJCQl2aWYsIGV2LT51LmFwX3N0YS5haWQsIGV2LT51LmFwX3N0YS5tYWNfYWRkciwKIAkJCQlldi0+dS5hcF9zdGEua2V5bWdtdCwKIAkJCQlsZTE2X3RvX2NwdShldi0+dS5hcF9zdGEuY2lwaGVyKSwKIAkJCQlldi0+dS5hcF9zdGEuYXV0aCwgZXYtPmFzc29jX3JlcV9sZW4sCkBAIC03NTUsNyArODMyLDcgQEAKIAkJcGllICs9IHBpZVsxXSArIDI7CiAJfQogCi0JYXRoNmtsX2Nvbm5lY3RfZXZlbnQod21pLT5wYXJlbnRfZGV2LCBsZTE2X3RvX2NwdShldi0+dS5zdGEuY2gpLAorCWF0aDZrbF9jb25uZWN0X2V2ZW50KHZpZiwgbGUxNl90b19jcHUoZXYtPnUuc3RhLmNoKSwKIAkJCSAgICAgZXYtPnUuc3RhLmJzc2lkLAogCQkJICAgICBsZTE2X3RvX2NwdShldi0+dS5zdGEubGlzdGVuX2ludHZsKSwKIAkJCSAgICAgbGUxNl90b19jcHUoZXYtPnUuc3RhLmJlYWNvbl9pbnR2bCksCkBAIC04MzQsMTQgKzkxMSwxNSBAQAogCQlhbHBoYTJbMF0gPSBjb3VudHJ5LT5pc29OYW1lWzBdOwogCQlhbHBoYTJbMV0gPSBjb3VudHJ5LT5pc29OYW1lWzFdOwogCi0JCXJlZ3VsYXRvcnlfaGludCh3bWktPnBhcmVudF9kZXYtPndkZXYtPndpcGh5LCBhbHBoYTIpOworCQlyZWd1bGF0b3J5X2hpbnQod21pLT5wYXJlbnRfZGV2LT53aXBoeSwgYWxwaGEyKTsKIAogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiQ291bnRyeSBhbHBoYTIgYmVpbmcgdXNlZDogJWMlY1xuIiwKIAkJCQlhbHBoYTJbMF0sIGFscGhhMlsxXSk7CiAJfQogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfZGlzY29ubmVjdF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9kaXNjb25uZWN0X2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCQkgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9kaXNjb25uZWN0X2V2ZW50ICpldjsKIAl3bWktPnRyYWZmaWNfY2xhc3MgPSAxMDA7CkBAIC04NTcsMTAgKzkzNSw4IEBACiAJCSAgIGV2LT5kaXNjb25uX3JlYXNvbiwgZXYtPmFzc29jX3Jlc3BfbGVuKTsKIAogCXdtaS0+aXNfd21tX2VuYWJsZWQgPSBmYWxzZTsKLQl3bWktPnBhaXJfY3J5cHRvX3R5cGUgPSBOT05FX0NSWVBUOwotCXdtaS0+Z3JwX2NyeXB0b190eXBlID0gTk9ORV9DUllQVDsKIAotCWF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHdtaS0+cGFyZW50X2RldiwgZXYtPmRpc2Nvbm5fcmVhc29uLAorCWF0aDZrbF9kaXNjb25uZWN0X2V2ZW50KHZpZiwgZXYtPmRpc2Nvbm5fcmVhc29uLAogCQkJCWV2LT5ic3NpZCwgZXYtPmFzc29jX3Jlc3BfbGVuLCBldi0+YXNzb2NfaW5mbywKIAkJCQlsZTE2X3RvX2NwdShldi0+cHJvdG9fcmVhc29uX3N0YXR1cykpOwogCkBAIC04ODYsNyArOTYyLDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX3RraXBfbWljZXJyX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX3RraXBfbWljZXJyX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCQkgICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfdGtpcF9taWNlcnJfZXZlbnQgKmV2OwogCkBAIC04OTUsMTIgKzk3MiwyMCBAQAogCiAJZXYgPSAoc3RydWN0IHdtaV90a2lwX21pY2Vycl9ldmVudCAqKSBkYXRhcDsKIAotCWF0aDZrbF90a2lwX21pY2Vycl9ldmVudCh3bWktPnBhcmVudF9kZXYsIGV2LT5rZXlfaWQsIGV2LT5pc19tY2FzdCk7CisJYXRoNmtsX3RraXBfbWljZXJyX2V2ZW50KHZpZiwgZXYtPmtleV9pZCwgZXYtPmlzX21jYXN0KTsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfYnNzaW5mb19ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3ZvaWQgYXRoNmtsX3dtaV9zc2Nhbl90aW1lcih1bnNpZ25lZCBsb25nIHB0cikKK3sKKwlzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmID0gKHN0cnVjdCBhdGg2a2xfdmlmICopIHB0cjsKKworCWNmZzgwMjExX3NjaGVkX3NjYW5fcmVzdWx0cyh2aWYtPmFyLT53aXBoeSk7Cit9CisKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9ic3NpbmZvX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCSAgICAgICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfYnNzX2luZm9faGRyMiAqYmloOwogCXU4ICpidWY7CkBAIC05MjcsMjYgKzEwMTIsMjcgQEAKIAkJcmV0dXJuIDA7IC8qIE9ubHkgdXBkYXRlIEJTUyB0YWJsZSBmb3Igbm93ICovCiAKIAlpZiAoYmloLT5mcmFtZV90eXBlID09IEJFQUNPTl9GVFlQRSAmJgotCSAgICB0ZXN0X2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmYXItPmZsYWcpKSB7Ci0JCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmYXItPmZsYWcpOwotCQlhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoYXItPndtaSwgTk9ORV9CU1NfRklMVEVSLCAwKTsKKwkgICAgdGVzdF9iaXQoQ0xFQVJfQlNTRklMVEVSX09OX0JFQUNPTiwgJnZpZi0+ZmxhZ3MpKSB7CisJCWNsZWFyX2JpdChDTEVBUl9CU1NGSUxURVJfT05fQkVBQ09OLCAmdmlmLT5mbGFncyk7CisJCWF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChhci0+d21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCSBOT05FX0JTU19GSUxURVIsIDApOwogCX0KIAotCWNoYW5uZWwgPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwoYXItPndkZXYtPndpcGh5LCBsZTE2X3RvX2NwdShiaWgtPmNoKSk7CisJY2hhbm5lbCA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChhci0+d2lwaHksIGxlMTZfdG9fY3B1KGJpaC0+Y2gpKTsKIAlpZiAoY2hhbm5lbCA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChsZW4gPCA4ICsgMiArIDIpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGJpaC0+ZnJhbWVfdHlwZSA9PSBCRUFDT05fRlRZUEUgJiYgdGVzdF9iaXQoQ09OTkVDVEVELCAmYXItPmZsYWcpICYmCi0JICAgIG1lbWNtcChiaWgtPmJzc2lkLCBhci0+YnNzaWQsIEVUSF9BTEVOKSA9PSAwKSB7CisJaWYgKGJpaC0+ZnJhbWVfdHlwZSA9PSBCRUFDT05fRlRZUEUgJiYgdGVzdF9iaXQoQ09OTkVDVEVELCAmdmlmLT5mbGFncykKKwkgICAgJiYgbWVtY21wKGJpaC0+YnNzaWQsIHZpZi0+YnNzaWQsIEVUSF9BTEVOKSA9PSAwKSB7CiAJCWNvbnN0IHU4ICp0aW07CiAJCXRpbSA9IGNmZzgwMjExX2ZpbmRfaWUoV0xBTl9FSURfVElNLCBidWYgKyA4ICsgMiArIDIsCiAJCQkJICAgICAgIGxlbiAtIDggLSAyIC0gMik7CiAJCWlmICh0aW0gJiYgdGltWzFdID49IDIpIHsKLQkJCWFyLT5hc3NvY19ic3NfZHRpbV9wZXJpb2QgPSB0aW1bM107Ci0JCQlzZXRfYml0KERUSU1fUEVSSU9EX0FWQUlMLCAmYXItPmZsYWcpOworCQkJdmlmLT5hc3NvY19ic3NfZHRpbV9wZXJpb2QgPSB0aW1bM107CisJCQlzZXRfYml0KERUSU1fUEVSSU9EX0FWQUlMLCAmdmlmLT5mbGFncyk7CiAJCX0KIAl9CiAKQEAgLTk2Niw3ICsxMDUyLDcgQEAKIAkJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0JFQUNPTik7CiAJCW1lbXNldChtZ210LT5kYSwgMHhmZiwgRVRIX0FMRU4pOwogCX0gZWxzZSB7Ci0JCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBhci0+bmV0X2RldjsKKwkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZpZi0+bmRldjsKIAogCQltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAogCQkJCQkJICBJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk7CkBAIC05NzksNyArMTA2NSw3IEBACiAKIAltZW1jcHkoJm1nbXQtPnUuYmVhY29uLCBidWYsIGxlbik7CiAKLQlic3MgPSBjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lKGFyLT53ZGV2LT53aXBoeSwgY2hhbm5lbCwgbWdtdCwKKwlic3MgPSBjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lKGFyLT53aXBoeSwgY2hhbm5lbCwgbWdtdCwKIAkJCQkJMjQgKyBsZW4sIChiaWgtPnNuciAtIDk1KSAqIDEwMCwKIAkJCQkJR0ZQX0FUT01JQyk7CiAJa2ZyZWUobWdtdCk7CkBAIC05ODcsNiArMTA3MywyMSBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAljZmc4MDIxMV9wdXRfYnNzKGJzcyk7CiAKKwkvKgorCSAqIEZpcm13YXJlIGRvZXNuJ3QgcmV0dXJuIGFueSBldmVudCB3aGVuIHNjaGVkdWxlZCBzY2FuIGhhcworCSAqIGZpbmlzaGVkLCBzbyB3ZSBuZWVkIHRvIHVzZSBhIHRpbWVyIHRvIGZpbmQgb3V0IHdoZW4gdGhlcmUgYXJlCisJICogbm8gbW9yZSByZXN1bHRzLgorCSAqCisJICogVGhlIHRpbWVyIGlzIHN0YXJ0ZWQgZnJvbSB0aGUgZmlyc3QgYnNzIGluZm8gcmVjZWl2ZWQsIG90aGVyd2lzZQorCSAqIHRoZSB0aW1lciB3b3VsZCBub3QgZXZlciBmaXJlIGlmIHRoZSBzY2FuIGludGVydmFsIGlzIHNob3J0CisJICogZW5vdWdoLgorCSAqLworCWlmIChhci0+c3RhdGUgPT0gQVRINktMX1NUQVRFX1NDSEVEX1NDQU4gJiYKKwkgICAgIXRpbWVyX3BlbmRpbmcoJnZpZi0+c2NoZWRfc2Nhbl90aW1lcikpIHsKKwkJbW9kX3RpbWVyKCZ2aWYtPnNjaGVkX3NjYW5fdGltZXIsIGppZmZpZXMgKworCQkJICBtc2Vjc190b19qaWZmaWVzKEFUSDZLTF9TQ0hFRF9TQ0FOX1JFU1VMVF9ERUxBWSkpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMDk0LDIwICsxMTk1LDIxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9zY2FuX2NvbXBsZXRlX3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX3NjYW5fY29tcGxldGVfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJICAgICAgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9zY2FuX2NvbXBsZXRlX2V2ZW50ICpldjsKIAogCWV2ID0gKHN0cnVjdCB3bWlfc2Nhbl9jb21wbGV0ZV9ldmVudCAqKSBkYXRhcDsKIAotCWF0aDZrbF9zY2FuX2NvbXBsZXRlX2V2dCh3bWktPnBhcmVudF9kZXYsIGFfc2xlMzJfdG9fY3B1KGV2LT5zdGF0dXMpKTsKKwlhdGg2a2xfc2Nhbl9jb21wbGV0ZV9ldnQodmlmLCBhX3NsZTMyX3RvX2NwdShldi0+c3RhdHVzKSk7CiAJd21pLT5pc19wcm9iZV9zc2lkID0gZmFsc2U7CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfd21pX25laWdoYm9yX3JlcG9ydF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwKLQkJCQkJICAgICAgIGludCBsZW4pCisJCQkJCSAgICAgICBpbnQgbGVuLCBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfbmVpZ2hib3JfcmVwb3J0X2V2ZW50ICpldjsKIAl1OCBpOwpAQCAtMTEyNSw3ICsxMjI3LDcgQEAKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIm5laWdoYm9yICVkLyVkIC0gJXBNIDB4JXhcbiIsCiAJCQkgICBpICsgMSwgZXYtPm51bV9uZWlnaGJvcnMsIGV2LT5uZWlnaGJvcltpXS5ic3NpZCwKIAkJCSAgIGV2LT5uZWlnaGJvcltpXS5ic3NfZmxhZ3MpOwotCQljZmc4MDIxMV9wbWtzYV9jYW5kaWRhdGVfbm90aWZ5KHdtaS0+cGFyZW50X2Rldi0+bmV0X2RldiwgaSwKKwkJY2ZnODAyMTFfcG1rc2FfY2FuZGlkYXRlX25vdGlmeSh2aWYtPm5kZXYsIGksCiAJCQkJCQlldi0+bmVpZ2hib3JbaV0uYnNzaWQsCiAJCQkJCQkhIShldi0+bmVpZ2hib3JbaV0uYnNzX2ZsYWdzICYKIAkJCQkJCSAgIFdNSV9QUkVBVVRIX0NBUEFCTEVfQlNTKSwKQEAgLTExNjYsOSArMTI2OCwxMCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfc3RhdHNfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfc3RhdHNfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJICAgICBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewotCWF0aDZrbF90Z3Rfc3RhdHNfZXZlbnQod21pLT5wYXJlbnRfZGV2LCBkYXRhcCwgbGVuKTsKKwlhdGg2a2xfdGd0X3N0YXRzX2V2ZW50KHZpZiwgZGF0YXAsIGxlbik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEyMjIsNyArMTMyNSw3IEBACiAJY21kID0gKHN0cnVjdCB3bWlfcnNzaV90aHJlc2hvbGRfcGFyYW1zX2NtZCAqKSBza2ItPmRhdGE7CiAJbWVtY3B5KGNtZCwgcnNzaV9jbWQsIHNpemVvZihzdHJ1Y3Qgd21pX3Jzc2lfdGhyZXNob2xkX3BhcmFtc19jbWQpKTsKIAotCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfUlNTSV9USFJFU0hPTERfUEFSQU1TX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfUlNTSV9USFJFU0hPTERfUEFSQU1TX0NNRElELAogCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7CiB9CiAKQEAgLTEzMjIsNyArMTQyNSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9jYWNfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCitzdGF0aWMgaW50IGF0aDZrbF93bWlfY2FjX2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuLAorCQkJCSAgIHN0cnVjdCBhdGg2a2xfdmlmICp2aWYpCiB7CiAJc3RydWN0IHdtaV9jYWNfZXZlbnQgKnJlcGx5OwogCXN0cnVjdCBpZWVlODAyMTFfdHNwZWNfaWUgKnRzOwpAQCAtMTM0Myw3ICsxNDQ3LDggQEAKIAkJdHNpZCA9ICh0c2luZm8gPj4gSUVFRTgwMjExX1dNTV9JRV9UU1BFQ19USURfU0hJRlQpICYKIAkJCUlFRUU4MDIxMV9XTU1fSUVfVFNQRUNfVElEX01BU0s7CiAKLQkJYXRoNmtsX3dtaV9kZWxldGVfcHN0cmVhbV9jbWQod21pLCByZXBseS0+YWMsIHRzaWQpOworCQlhdGg2a2xfd21pX2RlbGV0ZV9wc3RyZWFtX2NtZCh3bWksIHZpZi0+ZndfdmlmX2lkeCwKKwkJCQkJICAgICAgcmVwbHktPmFjLCB0c2lkKTsKIAl9IGVsc2UgaWYgKHJlcGx5LT5jYWNfaW5kaWNhdGlvbiA9PSBDQUNfSU5ESUNBVElPTl9OT19SRVNQKSB7CiAJCS8qCiAJCSAqIEZvbGxvd2luZyBhc3N1bWVzIHRoYXQgdGhlcmUgaXMgb25seSBvbmUgb3V0c3RhbmRpbmcKQEAgLTEzNTgsNyArMTQ2Myw4IEBACiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKGluZGV4IDwgKHNpemVvZihhY3RpdmVfdHNpZHMpICogOCkpCi0JCQlhdGg2a2xfd21pX2RlbGV0ZV9wc3RyZWFtX2NtZCh3bWksIHJlcGx5LT5hYywgaW5kZXgpOworCQkJYXRoNmtsX3dtaV9kZWxldGVfcHN0cmVhbV9jbWQod21pLCB2aWYtPmZ3X3ZpZl9pZHgsCisJCQkJCQkgICAgICByZXBseS0+YWMsIGluZGV4KTsKIAl9CiAKIAkvKgpAQCAtMTQwMyw3ICsxNTA5LDcgQEAKIAljbWQgPSAoc3RydWN0IHdtaV9zbnJfdGhyZXNob2xkX3BhcmFtc19jbWQgKikgc2tiLT5kYXRhOwogCW1lbWNweShjbWQsIHNucl9jbWQsIHNpemVvZihzdHJ1Y3Qgd21pX3Nucl90aHJlc2hvbGRfcGFyYW1zX2NtZCkpOwogCi0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TTlJfVEhSRVNIT0xEX1BBUkFNU19DTURJRCwKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIDAsIHNrYiwgV01JX1NOUl9USFJFU0hPTERfUEFSQU1TX0NNRElELAogCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7CiB9CiAKQEAgLTE1MjgsMTQgKzE2MzQsMTUgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGF0aDZrbF93bWlfY21kX3NlbmQoc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAoraW50IGF0aDZrbF93bWlfY21kX3NlbmQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQllbnVtIHdtaV9jbWRfaWQgY21kX2lkLCBlbnVtIHdtaV9zeW5jX2ZsYWcgc3luY19mbGFnKQogewogCXN0cnVjdCB3bWlfY21kX2hkciAqY21kX2hkcjsKIAllbnVtIGh0Y19lbmRwb2ludF9pZCBlcF9pZCA9IHdtaS0+ZXBfaWQ7CiAJaW50IHJldDsKKwl1MTYgaW5mbzE7CiAKLQlpZiAoV0FSTl9PTihza2IgPT0gTlVMTCkpCisJaWYgKFdBUk5fT04oc2tiID09IE5VTEwgfHwgKGlmX2lkeCA+ICh3bWktPnBhcmVudF9kZXYtPnZpZl9tYXggLSAxKSkpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJ3bWkgdHggaWQgJWQgbGVuICVkIGZsYWcgJWRcbiIsCkBAIC0xNTU0LDE5ICsxNjYxLDIwIEBACiAJCSAqIE1ha2Ugc3VyZSBhbGwgZGF0YSBjdXJyZW50bHkgcXVldWVkIGlzIHRyYW5zbWl0dGVkIGJlZm9yZQogCQkgKiB0aGUgY21kIGV4ZWN1dGlvbi4gIEVzdGFibGlzaCBhIG5ldyBzeW5jIHBvaW50LgogCQkgKi8KLQkJYXRoNmtsX3dtaV9zeW5jX3BvaW50KHdtaSk7CisJCWF0aDZrbF93bWlfc3luY19wb2ludCh3bWksIGlmX2lkeCk7CiAJfQogCiAJc2tiX3B1c2goc2tiLCBzaXplb2Yoc3RydWN0IHdtaV9jbWRfaGRyKSk7CiAKIAljbWRfaGRyID0gKHN0cnVjdCB3bWlfY21kX2hkciAqKSBza2ItPmRhdGE7CiAJY21kX2hkci0+Y21kX2lkID0gY3B1X3RvX2xlMTYoY21kX2lkKTsKLQljbWRfaGRyLT5pbmZvMSA9IDA7CS8qIGFkZGVkIGZvciB2aXJ0dWFsIGludGVyZmFjZSAqLworCWluZm8xID0gaWZfaWR4ICYgV01JX0NNRF9IRFJfSUZfSURfTUFTSzsKKwljbWRfaGRyLT5pbmZvMSA9IGNwdV90b19sZTE2KGluZm8xKTsKIAogCS8qIE9ubHkgZm9yIE9QVF9UWF9DTUQsIHVzZSBCRSBlbmRwb2ludC4gKi8KIAlpZiAoY21kX2lkID09IFdNSV9PUFRfVFhfRlJBTUVfQ01ESUQpIHsKIAkJcmV0ID0gYXRoNmtsX3dtaV9kYXRhX2hkcl9hZGQod21pLCBza2IsIE9QVF9NU0dUWVBFLAotCQkJCQkgICAgICBmYWxzZSwgZmFsc2UsIDAsIE5VTEwpOworCQkJCQkgICAgICBmYWxzZSwgZmFsc2UsIDAsIE5VTEwsIGlmX2lkeCk7CiAJCWlmIChyZXQpIHsKIAkJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJCXJldHVybiByZXQ7CkBAIC0xNTgyLDIwICsxNjkwLDIyIEBACiAJCSAqIE1ha2Ugc3VyZSBhbGwgbmV3IGRhdGEgcXVldWVkIHdhaXRzIGZvciB0aGUgY29tbWFuZCB0bwogCQkgKiBleGVjdXRlLiBFc3RhYmxpc2ggYSBuZXcgc3luYyBwb2ludC4KIAkJICovCi0JCWF0aDZrbF93bWlfc3luY19wb2ludCh3bWkpOworCQlhdGg2a2xfd21pX3N5bmNfcG9pbnQod21pLCBpZl9pZHgpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1pbnQgYXRoNmtsX3dtaV9jb25uZWN0X2NtZChzdHJ1Y3Qgd21pICp3bWksIGVudW0gbmV0d29ya190eXBlIG53X3R5cGUsCitpbnQgYXRoNmtsX3dtaV9jb25uZWN0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCSAgIGVudW0gbmV0d29ya190eXBlIG53X3R5cGUsCiAJCQkgICBlbnVtIGRvdDExX2F1dGhfbW9kZSBkb3QxMV9hdXRoX21vZGUsCiAJCQkgICBlbnVtIGF1dGhfbW9kZSBhdXRoX21vZGUsCiAJCQkgICBlbnVtIGNyeXB0b190eXBlIHBhaXJ3aXNlX2NyeXB0bywKIAkJCSAgIHU4IHBhaXJ3aXNlX2NyeXB0b19sZW4sCiAJCQkgICBlbnVtIGNyeXB0b190eXBlIGdyb3VwX2NyeXB0bywKIAkJCSAgIHU4IGdyb3VwX2NyeXB0b19sZW4sIGludCBzc2lkX2xlbiwgdTggKnNzaWQsCi0JCQkgICB1OCAqYnNzaWQsIHUxNiBjaGFubmVsLCB1MzIgY3RybF9mbGFncykKKwkJCSAgIHU4ICpic3NpZCwgdTE2IGNoYW5uZWwsIHUzMiBjdHJsX2ZsYWdzLAorCQkJICAgdTggbndfc3VidHlwZSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfY29ubmVjdF9jbWQgKmNjOwpAQCAtMTYzNSwxOSArMTc0NSwxOSBAQAogCWNjLT5ncnBfY3J5cHRvX2xlbiA9IGdyb3VwX2NyeXB0b19sZW47CiAJY2MtPmNoID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7CiAJY2MtPmN0cmxfZmxhZ3MgPSBjcHVfdG9fbGUzMihjdHJsX2ZsYWdzKTsKKwljYy0+bndfc3VidHlwZSA9IG53X3N1YnR5cGU7CiAKIAlpZiAoYnNzaWQgIT0gTlVMTCkKIAkJbWVtY3B5KGNjLT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKIAotCXdtaS0+cGFpcl9jcnlwdG9fdHlwZSA9IHBhaXJ3aXNlX2NyeXB0bzsKLQl3bWktPmdycF9jcnlwdG9fdHlwZSA9IGdyb3VwX2NyeXB0bzsKLQotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9DT05ORUNUX0NNRElELCBOT19TWU5DX1dNSUZMQUcpOworCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0NPTk5FQ1RfQ01ESUQsCisJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfcmVjb25uZWN0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4ICpic3NpZCwgdTE2IGNoYW5uZWwpCitpbnQgYXRoNmtsX3dtaV9yZWNvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCAqYnNzaWQsCisJCQkgICAgIHUxNiBjaGFubmVsKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9yZWNvbm5lY3RfY21kICpjYzsKQEAgLTE2NjgsMTMgKzE3NzgsMTMgQEAKIAlpZiAoYnNzaWQgIT0gTlVMTCkKIAkJbWVtY3B5KGNjLT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9SRUNPTk5FQ1RfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfUkVDT05ORUNUX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX2Rpc2Nvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSkKK2ludCBhdGg2a2xfd21pX2Rpc2Nvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4KQogewogCWludCByZXQ7CiAKQEAgLTE2ODMsMTIgKzE3OTMsNzkgQEAKIAl3bWktPnRyYWZmaWNfY2xhc3MgPSAxMDA7CiAKIAkvKiBEaXNjb25uZWN0IGNvbW1hbmQgZG9lcyBub3QgbmVlZCB0byBkbyBhIFNZTkMgYmVmb3JlLiAqLwotCXJldCA9IGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIFdNSV9ESVNDT05ORUNUX0NNRElEKTsKKwlyZXQgPSBhdGg2a2xfd21pX3NpbXBsZV9jbWQod21pLCBpZl9pZHgsIFdNSV9ESVNDT05ORUNUX0NNRElEKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX3N0YXJ0c2Nhbl9jbWQoc3RydWN0IHdtaSAqd21pLCBlbnVtIHdtaV9zY2FuX3R5cGUgc2Nhbl90eXBlLAoraW50IGF0aDZrbF93bWlfYmVnaW5zY2FuX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCSAgICAgZW51bSB3bWlfc2Nhbl90eXBlIHNjYW5fdHlwZSwKKwkJCSAgICAgdTMyIGZvcmNlX2Znc2NhbiwgdTMyIGlzX2xlZ2FjeSwKKwkJCSAgICAgdTMyIGhvbWVfZHdlbGxfdGltZSwgdTMyIGZvcmNlX3NjYW5faW50ZXJ2YWwsCisJCQkgICAgIHM4IG51bV9jaGFuLCB1MTYgKmNoX2xpc3QsIHUzMiBub19jY2ssIHUzMiAqcmF0ZXMpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgd21pX2JlZ2luX3NjYW5fY21kICpzYzsKKwlzOCBzaXplOworCWludCBpLCBiYW5kLCByZXQ7CisJc3RydWN0IGF0aDZrbCAqYXIgPSB3bWktPnBhcmVudF9kZXY7CisJaW50IG51bV9yYXRlczsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IHdtaV9iZWdpbl9zY2FuX2NtZCk7CisKKwlpZiAoKHNjYW5fdHlwZSAhPSBXTUlfTE9OR19TQ0FOKSAmJiAoc2Nhbl90eXBlICE9IFdNSV9TSE9SVF9TQ0FOKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobnVtX2NoYW4gPiBXTUlfTUFYX0NIQU5ORUxTKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChudW1fY2hhbikKKwkJc2l6ZSArPSBzaXplb2YodTE2KSAqIChudW1fY2hhbiAtIDEpOworCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzYyA9IChzdHJ1Y3Qgd21pX2JlZ2luX3NjYW5fY21kICopIHNrYi0+ZGF0YTsKKwlzYy0+c2Nhbl90eXBlID0gc2Nhbl90eXBlOworCXNjLT5mb3JjZV9mZ19zY2FuID0gY3B1X3RvX2xlMzIoZm9yY2VfZmdzY2FuKTsKKwlzYy0+aXNfbGVnYWN5ID0gY3B1X3RvX2xlMzIoaXNfbGVnYWN5KTsKKwlzYy0+aG9tZV9kd2VsbF90aW1lID0gY3B1X3RvX2xlMzIoaG9tZV9kd2VsbF90aW1lKTsKKwlzYy0+Zm9yY2Vfc2Nhbl9pbnR2bCA9IGNwdV90b19sZTMyKGZvcmNlX3NjYW5faW50ZXJ2YWwpOworCXNjLT5ub19jY2sgPSBjcHVfdG9fbGUzMihub19jY2spOworCXNjLT5udW1fY2ggPSBudW1fY2hhbjsKKworCWZvciAoYmFuZCA9IDA7IGJhbmQgPCBJRUVFODAyMTFfTlVNX0JBTkRTOyBiYW5kKyspIHsKKwkJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPQorCQkgICAgYXItPndpcGh5LT5iYW5kc1tiYW5kXTsKKwkJdTMyIHJhdGVtYXNrID0gcmF0ZXNbYmFuZF07CisJCXU4ICpzdXBwX3JhdGVzID0gc2MtPnN1cHBfcmF0ZXNbYmFuZF0ucmF0ZXM7CisJCW51bV9yYXRlcyA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IHNiYW5kLT5uX2JpdHJhdGVzOyBpKyspIHsKKwkJCWlmICgoQklUKGkpICYgcmF0ZW1hc2spID09IDApCisJCQkJY29udGludWU7IC8qIHNraXAgcmF0ZSAqLworCQkJc3VwcF9yYXRlc1tudW1fcmF0ZXMrK10gPQorCQkJICAgICh1OCkgKHNiYW5kLT5iaXRyYXRlc1tpXS5iaXRyYXRlIC8gNSk7CisJCX0KKwkJc2MtPnN1cHBfcmF0ZXNbYmFuZF0ubnJhdGVzID0gbnVtX3JhdGVzOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBudW1fY2hhbjsgaSsrKQorCQlzYy0+Y2hfbGlzdFtpXSA9IGNwdV90b19sZTE2KGNoX2xpc3RbaV0pOworCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfQkVHSU5fU0NBTl9DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBhdGg2a2xfd21pX3N0YXJ0X3NjYW5fY21kIGlzIHRvIGJlIGRlcHJlY2F0ZWQuIFVzZQorICogYXRoNmtsX3dtaV9iZWdpbl9zY2FuX2NtZCBpbnN0ZWFkLiBUaGUgbmV3IGZ1bmN0aW9uIHN1cHBvcnRzIFAyUAorICogbWdtdCBvcGVyYXRpb25zIHVzaW5nIHN0YXRpb24gaW50ZXJmYWNlLgorICovCitpbnQgYXRoNmtsX3dtaV9zdGFydHNjYW5fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJICAgICBlbnVtIHdtaV9zY2FuX3R5cGUgc2Nhbl90eXBlLAogCQkJICAgICB1MzIgZm9yY2VfZmdzY2FuLCB1MzIgaXNfbGVnYWN5LAogCQkJICAgICB1MzIgaG9tZV9kd2VsbF90aW1lLCB1MzIgZm9yY2Vfc2Nhbl9pbnRlcnZhbCwKIAkJCSAgICAgczggbnVtX2NoYW4sIHUxNiAqY2hfbGlzdCkKQEAgLTE3MjQsMTMgKzE5MDEsMTQgQEAKIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NoYW47IGkrKykKIAkJc2MtPmNoX2xpc3RbaV0gPSBjcHVfdG9fbGUxNihjaF9saXN0W2ldKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TVEFSVF9TQ0FOX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NUQVJUX1NDQU5fQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2NhbnBhcmFtc19jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgZmdfc3RhcnRfc2VjLAoraW50IGF0aDZrbF93bWlfc2NhbnBhcmFtc19jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkgICAgICB1MTYgZmdfc3RhcnRfc2VjLAogCQkJICAgICAgdTE2IGZnX2VuZF9zZWMsIHUxNiBiZ19zZWMsCiAJCQkgICAgICB1MTYgbWluYWN0X2NoZHdfbXNlYywgdTE2IG1heGFjdF9jaGR3X21zZWMsCiAJCQkgICAgICB1MTYgcGFzX2NoZHdfbXNlYywgdTggc2hvcnRfc2Nhbl9yYXRpbywKQEAgLTE3NTcsMTIgKzE5MzUsMTIgQEAKIAlzYy0+bWF4X2Rmc2NoX2FjdF90aW1lID0gY3B1X3RvX2xlMzIobWF4X2Rmc2NoX2FjdF90aW1lKTsKIAlzYy0+bWF4YWN0X3NjYW5fcGVyX3NzaWQgPSBjcHVfdG9fbGUxNihtYXhhY3Rfc2Nhbl9wZXJfc3NpZCk7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX1NDQU5fUEFSQU1TX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9TQ0FOX1BBUkFNU19DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfYnNzZmlsdGVyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGZpbHRlciwgdTMyIGllX21hc2spCitpbnQgYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBmaWx0ZXIsIHUzMiBpZV9tYXNrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9ic3NfZmlsdGVyX2NtZCAqY21kOwpAQCAtMTc3OSwxMiArMTk1NywxMiBAQAogCWNtZC0+YnNzX2ZpbHRlciA9IGZpbHRlcjsKIAljbWQtPmllX21hc2sgPSBjcHVfdG9fbGUzMihpZV9tYXNrKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfQlNTX0ZJTFRFUl9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfQlNTX0ZJTFRFUl9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfcHJvYmVkc3NpZF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpbmRleCwgdTggZmxhZywKK2ludCBhdGg2a2xfd21pX3Byb2JlZHNzaWRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBpbmRleCwgdTggZmxhZywKIAkJCSAgICAgIHU4IHNzaWRfbGVuLCB1OCAqc3NpZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTgxNiwxMiArMTk5NCwxMyBAQAogCWNtZC0+c3NpZF9sZW4gPSBzc2lkX2xlbjsKIAltZW1jcHkoY21kLT5zc2lkLCBzc2lkLCBzc2lkX2xlbik7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX1BST0JFRF9TU0lEX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9QUk9CRURfU1NJRF9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfbGlzdGVuaW50ZXJ2YWxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTE2IGxpc3Rlbl9pbnRlcnZhbCwKK2ludCBhdGg2a2xfd21pX2xpc3RlbmludGVydmFsX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgIHUxNiBsaXN0ZW5faW50ZXJ2YWwsCiAJCQkJICB1MTYgbGlzdGVuX2JlYWNvbnMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTE4MzYsMTIgKzIwMTUsMTIgQEAKIAljbWQtPmxpc3Rlbl9pbnR2bCA9IGNwdV90b19sZTE2KGxpc3Rlbl9pbnRlcnZhbCk7CiAJY21kLT5udW1fYmVhY29ucyA9IGNwdV90b19sZTE2KGxpc3Rlbl9iZWFjb25zKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfTElTVEVOX0lOVF9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfTElTVEVOX0lOVF9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IHB3cl9tb2RlKQoraW50IGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggcHdyX21vZGUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3Bvd2VyX21vZGVfY21kICpjbWQ7CkBAIC0xODU1LDEyICsyMDM0LDEyIEBACiAJY21kLT5wd3JfbW9kZSA9IHB3cl9tb2RlOwogCXdtaS0+cHdyX21vZGUgPSBwd3JfbW9kZTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfUE9XRVJfTU9ERV9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfUE9XRVJfTU9ERV9DTURJRCwKIAkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTE2IGlkbGVfcGVyaW9kLAoraW50IGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MTYgaWRsZV9wZXJpb2QsCiAJCQkgICAgdTE2IHBzX3BvbGxfbnVtLCB1MTYgZHRpbV9wb2xpY3ksCiAJCQkgICAgdTE2IHR4X3dha2V1cF9wb2xpY3ksIHUxNiBudW1fdHhfdG9fd2FrZXVwLAogCQkJICAgIHUxNiBwc19mYWlsX2V2ZW50X3BvbGljeSkKQEAgLTE4ODEsMTIgKzIwNjAsMTIgQEAKIAlwbS0+bnVtX3R4X3RvX3dha2V1cCA9IGNwdV90b19sZTE2KG51bV90eF90b193YWtldXApOwogCXBtLT5wc19mYWlsX2V2ZW50X3BvbGljeSA9IGNwdV90b19sZTE2KHBzX2ZhaWxfZXZlbnRfcG9saWN5KTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfUE9XRVJfUEFSQU1TX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9QT1dFUl9QQVJBTVNfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IHRpbWVvdXQpCitpbnQgYXRoNmtsX3dtaV9kaXNjdGltZW91dF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IHRpbWVvdXQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2Rpc2NfdGltZW91dF9jbWQgKmNtZDsKQEAgLTE4OTksMTUgKzIwNzgsMjAgQEAKIAljbWQgPSAoc3RydWN0IHdtaV9kaXNjX3RpbWVvdXRfY21kICopIHNrYi0+ZGF0YTsKIAljbWQtPmRpc2Nvbl90aW1lb3V0ID0gdGltZW91dDsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfRElTQ19USU1FT1VUX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9ESVNDX1RJTUVPVVRfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOworCisJaWYgKHJldCA9PSAwKQorCQlhdGg2a2xfZGVidWdfc2V0X2Rpc2Nvbm5lY3RfdGltZW91dCh3bWktPnBhcmVudF9kZXYsIHRpbWVvdXQpOworCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfYWRka2V5X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGtleV9pbmRleCwKK2ludCBhdGg2a2xfd21pX2FkZGtleV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGtleV9pbmRleCwKIAkJCSAgZW51bSBjcnlwdG9fdHlwZSBrZXlfdHlwZSwKIAkJCSAgdTgga2V5X3VzYWdlLCB1OCBrZXlfbGVuLAotCQkJICB1OCAqa2V5X3JzYywgdTggKmtleV9tYXRlcmlhbCwKKwkJCSAgdTggKmtleV9yc2MsIHVuc2lnbmVkIGludCBrZXlfcnNjX2xlbiwKKwkJCSAgdTggKmtleV9tYXRlcmlhbCwKIAkJCSAgdTgga2V5X29wX2N0cmwsIHU4ICptYWNfYWRkciwKIAkJCSAgZW51bSB3bWlfc3luY19mbGFnIHN5bmNfZmxhZykKIHsKQEAgLTE5MjAsNyArMjEwNCw3IEBACiAJCSAgIGtleV9pbmRleCwga2V5X3R5cGUsIGtleV91c2FnZSwga2V5X2xlbiwga2V5X29wX2N0cmwpOwogCiAJaWYgKChrZXlfaW5kZXggPiBXTUlfTUFYX0tFWV9JTkRFWCkgfHwgKGtleV9sZW4gPiBXTUlfTUFYX0tFWV9MRU4pIHx8Ci0JICAgIChrZXlfbWF0ZXJpYWwgPT0gTlVMTCkpCisJICAgIChrZXlfbWF0ZXJpYWwgPT0gTlVMTCkgfHwga2V5X3JzY19sZW4gPiA4KQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmICgoV0VQX0NSWVBUICE9IGtleV90eXBlKSAmJiAoTlVMTCA9PSBrZXlfcnNjKSkKQEAgLTE5MzgsMjAgKzIxMjIsMjAgQEAKIAltZW1jcHkoY21kLT5rZXksIGtleV9tYXRlcmlhbCwga2V5X2xlbik7CiAKIAlpZiAoa2V5X3JzYyAhPSBOVUxMKQotCQltZW1jcHkoY21kLT5rZXlfcnNjLCBrZXlfcnNjLCBzaXplb2YoY21kLT5rZXlfcnNjKSk7CisJCW1lbWNweShjbWQtPmtleV9yc2MsIGtleV9yc2MsIGtleV9yc2NfbGVuKTsKIAogCWNtZC0+a2V5X29wX2N0cmwgPSBrZXlfb3BfY3RybDsKIAogCWlmIChtYWNfYWRkcikKIAkJbWVtY3B5KGNtZC0+a2V5X21hY19hZGRyLCBtYWNfYWRkciwgRVRIX0FMRU4pOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0FERF9DSVBIRVJfS0VZX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0FERF9DSVBIRVJfS0VZX0NNRElELAogCQkJCSAgc3luY19mbGFnKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX2FkZF9rcmtfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggKmtyaykKK2ludCBhdGg2a2xfd21pX2FkZF9rcmtfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCAqa3JrKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9hZGRfa3JrX2NtZCAqY21kOwpAQCAtMTk2NCwxMiArMjE0OCwxMyBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX2FkZF9rcmtfY21kICopIHNrYi0+ZGF0YTsKIAltZW1jcHkoY21kLT5rcmssIGtyaywgV01JX0tSS19MRU4pOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0FERF9LUktfQ01ESUQsIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfQUREX0tSS19DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9kZWxldGVrZXlfY21kKHN0cnVjdCB3bWkgKndtaSwgdTgga2V5X2luZGV4KQoraW50IGF0aDZrbF93bWlfZGVsZXRla2V5X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTgga2V5X2luZGV4KQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9kZWxldGVfY2lwaGVyX2tleV9jbWQgKmNtZDsKQEAgLTE5ODUsMTMgKzIxNzAsMTMgQEAKIAljbWQgPSAoc3RydWN0IHdtaV9kZWxldGVfY2lwaGVyX2tleV9jbWQgKikgc2tiLT5kYXRhOwogCWNtZC0+a2V5X2luZGV4ID0ga2V5X2luZGV4OwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0RFTEVURV9DSVBIRVJfS0VZX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0RFTEVURV9DSVBIRVJfS0VZX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX3NldHBta2lkX2NtZChzdHJ1Y3Qgd21pICp3bWksIGNvbnN0IHU4ICpic3NpZCwKK2ludCBhdGg2a2xfd21pX3NldHBta2lkX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgY29uc3QgdTggKmJzc2lkLAogCQkJICAgIGNvbnN0IHU4ICpwbWtpZCwgYm9vbCBzZXQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTIwMTgsMTQgKzIyMDMsMTQgQEAKIAkJY21kLT5lbmFibGUgPSBQTUtJRF9ESVNBQkxFOwogCX0KIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfUE1LSURfQ01ESUQsCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VUX1BNS0lEX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAogCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX3dtaV9kYXRhX3N5bmNfc2VuZChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICBlbnVtIGh0Y19lbmRwb2ludF9pZCBlcF9pZCkKKwkJCSAgICAgIGVudW0gaHRjX2VuZHBvaW50X2lkIGVwX2lkLCB1OCBpZl9pZHgpCiB7CiAJc3RydWN0IHdtaV9kYXRhX2hkciAqZGF0YV9oZHI7CiAJaW50IHJldDsKQEAgLTIwMzcsMTQgKzIyMjIsMTQgQEAKIAogCWRhdGFfaGRyID0gKHN0cnVjdCB3bWlfZGF0YV9oZHIgKikgc2tiLT5kYXRhOwogCWRhdGFfaGRyLT5pbmZvID0gU1lOQ19NU0dUWVBFIDw8IFdNSV9EQVRBX0hEUl9NU0dfVFlQRV9TSElGVDsKLQlkYXRhX2hkci0+aW5mbzMgPSAwOworCWRhdGFfaGRyLT5pbmZvMyA9IGNwdV90b19sZTE2KGlmX2lkeCAmIFdNSV9EQVRBX0hEUl9JRl9JRFhfTUFTSyk7CiAKIAlyZXQgPSBhdGg2a2xfY29udHJvbF90eCh3bWktPnBhcmVudF9kZXYsIHNrYiwgZXBfaWQpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX3N5bmNfcG9pbnQoc3RydWN0IHdtaSAqd21pKQorc3RhdGljIGludCBhdGg2a2xfd21pX3N5bmNfcG9pbnQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3N5bmNfY21kICpjbWQ7CkBAIC0yMTAwLDcgKzIyODUsNyBAQAogCSAqIFNlbmQgc3luYyBjbWQgZm9sbG93ZWQgYnkgc3luYyBkYXRhIG1lc3NhZ2VzIG9uIGFsbAogCSAqIGVuZHBvaW50cyBiZWluZyB1c2VkCiAJICovCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NZTkNIUk9OSVpFX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NZTkNIUk9OSVpFX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAogCWlmIChyZXQpCkBAIC0yMTE5LDcgKzIzMDQsNyBAQAogCQkJCQkgICAgICAgdHJhZmZpY19jbGFzcyk7CiAJCXJldCA9CiAJCSAgICBhdGg2a2xfd21pX2RhdGFfc3luY19zZW5kKHdtaSwgZGF0YV9zeW5jX2J1ZnNbaW5kZXhdLnNrYiwKLQkJCQkJICAgICAgZXBfaWQpOworCQkJCQkgICAgICBlcF9pZCwgaWZfaWR4KTsKIAogCQlpZiAocmV0KQogCQkJYnJlYWs7CkBAIC0yMTQyLDcgKzIzMjcsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX2NyZWF0ZV9wc3RyZWFtX2NtZChzdHJ1Y3Qgd21pICp3bWksCitpbnQgYXRoNmtsX3dtaV9jcmVhdGVfcHN0cmVhbV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCiAJCQkJICBzdHJ1Y3Qgd21pX2NyZWF0ZV9wc3RyZWFtX2NtZCAqcGFyYW1zKQogewogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0yMjMxLDEyICsyNDE2LDEzIEBACiAJCWF0aDZrbF9pbmRpY2F0ZV90eF9hY3Rpdml0eSh3bWktPnBhcmVudF9kZXYsCiAJCQkJCSAgICBwYXJhbXMtPnRyYWZmaWNfY2xhc3MsIHRydWUpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0NSRUFURV9QU1RSRUFNX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0NSRUFURV9QU1RSRUFNX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9kZWxldGVfcHN0cmVhbV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCB0cmFmZmljX2NsYXNzLCB1OCB0c2lkKQoraW50IGF0aDZrbF93bWlfZGVsZXRlX3BzdHJlYW1fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCB0cmFmZmljX2NsYXNzLAorCQkJCSAgdTggdHNpZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfZGVsZXRlX3BzdHJlYW1fY21kICpjbWQ7CkBAIC0yMjcyLDcgKzI0NTgsNyBAQAogCQkgICAic2VuZGluZyBkZWxldGVfcHN0cmVhbV9jbWQ6IHRyYWZmaWMgY2xhc3M6ICVkIHRzaWQ9JWRcbiIsCiAJCSAgIHRyYWZmaWNfY2xhc3MsIHRzaWQpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0RFTEVURV9QU1RSRUFNX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0RFTEVURV9QU1RSRUFNX0NNRElELAogCQkJCSAgU1lOQ19CRUZPUkVfV01JRkxBRyk7CiAKIAlzcGluX2xvY2tfYmgoJndtaS0+bG9jayk7CkBAIC0yMzExLDE3ICsyNDk3LDE3MyBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF9pcF9jbWQgKikgc2tiLT5kYXRhOwogCW1lbWNweShjbWQsIGlwX2NtZCwgc2l6ZW9mKHN0cnVjdCB3bWlfc2V0X2lwX2NtZCkpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9JUF9DTURJRCwgTk9fU1lOQ19XTUlGTEFHKTsKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfU0VUX0lQX0NNRElELAorCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IGF0aDZrbF93bWlfZ2V0X3dvd19saXN0X2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKiBkYXRhcCwKLQkJCQkJICAgIGludCBsZW4pCitzdGF0aWMgdm9pZCBhdGg2a2xfd21pX3JlbGlucXVpc2hfaW1wbGljaXRfcHN0cmVhbV9jcmVkaXRzKHN0cnVjdCB3bWkgKndtaSkKIHsKLQlpZiAobGVuIDwgc2l6ZW9mKHN0cnVjdCB3bWlfZ2V0X3dvd19saXN0X3JlcGx5KSkKLQkJcmV0dXJuIC1FSU5WQUw7CisJdTE2IGFjdGl2ZV90c2lkczsKKwl1OCBzdHJlYW1fZXhpc3Q7CisJaW50IGk7CiAKLQlyZXR1cm4gMDsKKwkvKgorCSAqIFJlbGlucXVpc2ggY3JlZGl0cyBmcm9tIGFsbCBpbXBsaWNpdGx5IGNyZWF0ZWQgcHN0cmVhbXMKKwkgKiBzaW5jZSB3aGVuIHdlIGdvIHRvIHNsZWVwLiBJZiB1c2VyIGNyZWF0ZWQgZXhwbGljaXQKKwkgKiB0aGluc3RyZWFtcyBleGlzdHMgd2l0aCBpbiBhIGZhdHBpcGUgbGVhdmUgdGhlbSBpbnRhY3QKKwkgKiBmb3IgdGhlIHVzZXIgdG8gZGVsZXRlLgorCSAqLworCXNwaW5fbG9ja19iaCgmd21pLT5sb2NrKTsKKwlzdHJlYW1fZXhpc3QgPSB3bWktPmZhdF9waXBlX2V4aXN0OworCXNwaW5fdW5sb2NrX2JoKCZ3bWktPmxvY2spOworCisJZm9yIChpID0gMDsgaSA8IFdNTV9OVU1fQUM7IGkrKykgeworCQlpZiAoc3RyZWFtX2V4aXN0ICYgKDEgPDwgaSkpIHsKKworCQkJLyoKKwkJCSAqIEZJWE1FOiBJcyB0aGlzIGxvY2sgJiB1bmxvY2sgaW5zaWRlCisJCQkgKiBmb3IgbG9vcCBjb3JyZWN0PyBtYXkgbmVlZCByZXdvcmsuCisJCQkgKi8KKwkJCXNwaW5fbG9ja19iaCgmd21pLT5sb2NrKTsKKwkJCWFjdGl2ZV90c2lkcyA9IHdtaS0+c3RyZWFtX2V4aXN0X2Zvcl9hY1tpXTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZ3bWktPmxvY2spOworCisJCQkvKgorCQkJICogSWYgdGhlcmUgYXJlIG5vIHVzZXIgY3JlYXRlZCB0aGluIHN0cmVhbXMKKwkJCSAqIGRlbGV0ZSB0aGUgZmF0cGlwZQorCQkJICovCisJCQlpZiAoIWFjdGl2ZV90c2lkcykgeworCQkJCXN0cmVhbV9leGlzdCAmPSB+KDEgPDwgaSk7CisJCQkJLyoKKwkJCQkgKiBJbmRpY2F0ZSBpbmFjdGl2aXR5IHRvIGRyaXZlciBsYXllciBmb3IKKwkJCQkgKiB0aGlzIGZhdHBpcGUgKHBzdHJlYW0pCisJCQkJICovCisJCQkJYXRoNmtsX2luZGljYXRlX3R4X2FjdGl2aXR5KHdtaS0+cGFyZW50X2RldiwKKwkJCQkJCQkgICAgaSwgZmFsc2UpOworCQkJfQorCQl9CisJfQorCisJLyogRklYTUU6IENhbiB3ZSBkbyB0aGlzIGFzc2lnbm1lbnQgd2l0aG91dCBsb2NraW5nID8gKi8KKwlzcGluX2xvY2tfYmgoJndtaS0+bG9jayk7CisJd21pLT5mYXRfcGlwZV9leGlzdCA9IHN0cmVhbV9leGlzdDsKKwlzcGluX3VubG9ja19iaCgmd21pLT5sb2NrKTsKK30KKworaW50IGF0aDZrbF93bWlfc2V0X2hvc3Rfc2xlZXBfbW9kZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgICAgIGVudW0gYXRoNmtsX2hvc3RfbW9kZSBob3N0X21vZGUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgd21pX3NldF9ob3N0X3NsZWVwX21vZGVfY21kICpjbWQ7CisJaW50IHJldDsKKworCWlmICgoaG9zdF9tb2RlICE9IEFUSDZLTF9IT1NUX01PREVfQVNMRUVQKSAmJgorCSAgICAoaG9zdF9tb2RlICE9IEFUSDZLTF9IT1NUX01PREVfQVdBS0UpKSB7CisJCWF0aDZrbF9lcnIoImludmFsaWQgaG9zdCBzbGVlcCBtb2RlOiAlZFxuIiwgaG9zdF9tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplb2YoKmNtZCkpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF9ob3N0X3NsZWVwX21vZGVfY21kICopIHNrYi0+ZGF0YTsKKworCWlmIChob3N0X21vZGUgPT0gQVRINktMX0hPU1RfTU9ERV9BU0xFRVApIHsKKwkJYXRoNmtsX3dtaV9yZWxpbnF1aXNoX2ltcGxpY2l0X3BzdHJlYW1fY3JlZGl0cyh3bWkpOworCQljbWQtPmFzbGVlcCA9IGNwdV90b19sZTMyKDEpOworCX0gZWxzZQorCQljbWQtPmF3YWtlID0gY3B1X3RvX2xlMzIoMSk7CisKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsCisJCQkJICBXTUlfU0VUX0hPU1RfU0xFRVBfTU9ERV9DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGF0aDZrbF93bWlfc2V0X3dvd19tb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQllbnVtIGF0aDZrbF93b3dfbW9kZSB3b3dfbW9kZSwKKwkJCQl1MzIgZmlsdGVyLCB1MTYgaG9zdF9yZXFfZGVsYXkpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgd21pX3NldF93b3dfbW9kZV9jbWQgKmNtZDsKKwlpbnQgcmV0OworCisJaWYgKCh3b3dfbW9kZSAhPSBBVEg2S0xfV09XX01PREVfRU5BQkxFKSAmJgorCSAgICAgd293X21vZGUgIT0gQVRINktMX1dPV19NT0RFX0RJU0FCTEUpIHsKKwkJYXRoNmtsX2VycigiaW52YWxpZCB3b3cgbW9kZTogJWRcbiIsIHdvd19tb2RlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplb2YoKmNtZCkpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF93b3dfbW9kZV9jbWQgKikgc2tiLT5kYXRhOworCWNtZC0+ZW5hYmxlX3dvdyA9IGNwdV90b19sZTMyKHdvd19tb2RlKTsKKwljbWQtPmZpbHRlciA9IGNwdV90b19sZTMyKGZpbHRlcik7CisJY21kLT5ob3N0X3JlcV9kZWxheSA9IGNwdV90b19sZTE2KGhvc3RfcmVxX2RlbGF5KTsKKworCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9XT1dfTU9ERV9DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CisJcmV0dXJuIHJldDsKK30KKworaW50IGF0aDZrbF93bWlfYWRkX3dvd19wYXR0ZXJuX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICB1OCBsaXN0X2lkLCB1OCBmaWx0ZXJfc2l6ZSwKKwkJCQkgICB1OCBmaWx0ZXJfb2Zmc2V0LCB1OCAqZmlsdGVyLCB1OCAqbWFzaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCB3bWlfYWRkX3dvd19wYXR0ZXJuX2NtZCAqY21kOworCXUxNiBzaXplOworCXU4ICpmaWx0ZXJfbWFzazsKKwlpbnQgcmV0OworCisJLyoKKwkgKiBBbGxvY2F0ZSBhZGRpdGlvbmFsIG1lbW9yeSBpbiB0aGUgYnVmZmVyIHRvIGhvbGQKKwkgKiBmaWx0ZXIgYW5kIG1hc2sgdmFsdWUsIHdoaWNoIGlzIHR3aWNlIG9mIGZpbHRlcl9zaXplLgorCSAqLworCXNpemUgPSBzaXplb2YoKmNtZCkgKyAoMiAqIGZpbHRlcl9zaXplKTsKKworCXNrYiA9IGF0aDZrbF93bWlfZ2V0X25ld19idWYoc2l6ZSk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJY21kID0gKHN0cnVjdCB3bWlfYWRkX3dvd19wYXR0ZXJuX2NtZCAqKSBza2ItPmRhdGE7CisJY21kLT5maWx0ZXJfbGlzdF9pZCA9IGxpc3RfaWQ7CisJY21kLT5maWx0ZXJfc2l6ZSA9IGZpbHRlcl9zaXplOworCWNtZC0+ZmlsdGVyX29mZnNldCA9IGZpbHRlcl9vZmZzZXQ7CisKKwltZW1jcHkoY21kLT5maWx0ZXIsIGZpbHRlciwgZmlsdGVyX3NpemUpOworCisJZmlsdGVyX21hc2sgPSAodTggKikgKGNtZC0+ZmlsdGVyICsgZmlsdGVyX3NpemUpOworCW1lbWNweShmaWx0ZXJfbWFzaywgbWFzaywgZmlsdGVyX3NpemUpOworCisJcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfQUREX1dPV19QQVRURVJOX0NNRElELAorCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludCBhdGg2a2xfd21pX2RlbF93b3dfcGF0dGVybl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgdTE2IGxpc3RfaWQsIHUxNiBmaWx0ZXJfaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgd21pX2RlbF93b3dfcGF0dGVybl9jbWQgKmNtZDsKKwlpbnQgcmV0OworCisJc2tiID0gYXRoNmtsX3dtaV9nZXRfbmV3X2J1ZihzaXplb2YoKmNtZCkpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNtZCA9IChzdHJ1Y3Qgd21pX2RlbF93b3dfcGF0dGVybl9jbWQgKikgc2tiLT5kYXRhOworCWNtZC0+ZmlsdGVyX2xpc3RfaWQgPSBjcHVfdG9fbGUxNihsaXN0X2lkKTsKKwljbWQtPmZpbHRlcl9pZCA9IGNwdV90b19sZTE2KGZpbHRlcl9pZCk7CisKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9ERUxfV09XX1BBVFRFUk5fQ01ESUQsCisJCQkJICBOT19TWU5DX1dNSUZMQUcpOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgYXRoNmtsX3dtaV9jbWRfc2VuZF94dG5kKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKQEAgLTIzMzYsNyArMjY3OCw3IEBACiAJY21kX2hkciA9IChzdHJ1Y3Qgd21peF9jbWRfaGRyICopIHNrYi0+ZGF0YTsKIAljbWRfaGRyLT5jbWRfaWQgPSBjcHVfdG9fbGUzMihjbWRfaWQpOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0VYVEVOU0lPTl9DTURJRCwgc3luY19mbGFnKTsKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfRVhURU5TSU9OX0NNRElELCBzeW5jX2ZsYWcpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTIzNzksMTIgKzI3MjEsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgYXRoNmtsX3dtaV9nZXRfc3RhdHNfY21kKHN0cnVjdCB3bWkgKndtaSkKK2ludCBhdGg2a2xfd21pX2dldF9zdGF0c19jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpCiB7Ci0JcmV0dXJuIGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIFdNSV9HRVRfU1RBVElTVElDU19DTURJRCk7CisJcmV0dXJuIGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIGlmX2lkeCwgV01JX0dFVF9TVEFUSVNUSUNTX0NNRElEKTsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X3R4X3B3cl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBkYk0pCitpbnQgYXRoNmtsX3dtaV9zZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggZGJNKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9zZXRfdHhfcHdyX2NtZCAqY21kOwpAQCAtMjM5NywxOCArMjczOSwyNCBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF90eF9wd3JfY21kICopIHNrYi0+ZGF0YTsKIAljbWQtPmRiTSA9IGRiTTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfVFhfUFdSX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9UWF9QV1JfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfZ2V0X3R4X3B3cl9jbWQoc3RydWN0IHdtaSAqd21pKQoraW50IGF0aDZrbF93bWlfZ2V0X3R4X3B3cl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpCiB7Ci0JcmV0dXJuIGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIFdNSV9HRVRfVFhfUFdSX0NNRElEKTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgaWZfaWR4LCBXTUlfR0VUX1RYX1BXUl9DTURJRCk7CiB9CiAKLWludCBhdGg2a2xfd21pX3NldF9scHJlYW1ibGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggc3RhdHVzLCB1OCBwcmVhbWJsZV9wb2xpY3kpCitpbnQgYXRoNmtsX3dtaV9nZXRfcm9hbV90YmxfY21kKHN0cnVjdCB3bWkgKndtaSkKK3sKKwlyZXR1cm4gYXRoNmtsX3dtaV9zaW1wbGVfY21kKHdtaSwgMCwgV01JX0dFVF9ST0FNX1RCTF9DTURJRCk7Cit9CisKK2ludCBhdGg2a2xfd21pX3NldF9scHJlYW1ibGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBzdGF0dXMsCisJCQkJIHU4IHByZWFtYmxlX3BvbGljeSkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfc2V0X2xwcmVhbWJsZV9jbWQgKmNtZDsKQEAgLTI0MjIsNyArMjc3MCw3IEBACiAJY21kLT5zdGF0dXMgPSBzdGF0dXM7CiAJY21kLT5wcmVhbWJsZV9wb2xpY3kgPSBwcmVhbWJsZV9wb2xpY3k7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX0xQUkVBTUJMRV9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfTFBSRUFNQkxFX0NNRElELAogCQkJCSAgTk9fU1lOQ19XTUlGTEFHKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMjQ0MCwxMSArMjc4OCwxMiBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX3NldF9ydHNfY21kICopIHNrYi0+ZGF0YTsKIAljbWQtPnRocmVzaG9sZCA9IGNwdV90b19sZTE2KHRocmVzaG9sZCk7CiAKLQlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VUX1JUU19DTURJRCwgTk9fU1lOQ19XTUlGTEFHKTsKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgMCwgc2tiLCBXTUlfU0VUX1JUU19DTURJRCwKKwkJCQkgIE5PX1NZTkNfV01JRkxBRyk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X3dtbV90eG9wKHN0cnVjdCB3bWkgKndtaSwgZW51bSB3bWlfdHhvcF9jZmcgY2ZnKQoraW50IGF0aDZrbF93bWlfc2V0X3dtbV90eG9wKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBlbnVtIHdtaV90eG9wX2NmZyBjZmcpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3NldF93bW1fdHhvcF9jbWQgKmNtZDsKQEAgLTI0NjAsMTIgKzI4MDksMTMgQEAKIAljbWQgPSAoc3RydWN0IHdtaV9zZXRfd21tX3R4b3BfY21kICopIHNrYi0+ZGF0YTsKIAljbWQtPnR4b3BfZW5hYmxlID0gY2ZnOwogCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9XTU1fVFhPUF9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfV01NX1RYT1BfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCXJldHVybiByZXQ7CiB9CiAKLWludCBhdGg2a2xfd21pX3NldF9rZWVwYWxpdmVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTgga2VlcF9hbGl2ZV9pbnR2bCkKK2ludCBhdGg2a2xfd21pX3NldF9rZWVwYWxpdmVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSB1OCBrZWVwX2FsaXZlX2ludHZsKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9zZXRfa2VlcGFsaXZlX2NtZCAqY21kOwpAQCAtMjQ3NywxMCArMjgyNywxMyBAQAogCiAJY21kID0gKHN0cnVjdCB3bWlfc2V0X2tlZXBhbGl2ZV9jbWQgKikgc2tiLT5kYXRhOwogCWNtZC0+a2VlcF9hbGl2ZV9pbnR2bCA9IGtlZXBfYWxpdmVfaW50dmw7Ci0Jd21pLT5rZWVwX2FsaXZlX2ludHZsID0ga2VlcF9hbGl2ZV9pbnR2bDsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9TRVRfS0VFUEFMSVZFX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFVF9LRUVQQUxJVkVfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOworCisJaWYgKHJldCA9PSAwKQorCQlhdGg2a2xfZGVidWdfc2V0X2tlZXBhbGl2ZSh3bWktPnBhcmVudF9kZXYsIGtlZXBfYWxpdmVfaW50dmwpOworCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjQ5NSw3ICsyODQ4LDcgQEAKIAogCW1lbWNweShza2ItPmRhdGEsIGJ1ZiwgbGVuKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9URVNUX0NNRElELCBOT19TWU5DX1dNSUZMQUcpOworCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCAwLCBza2IsIFdNSV9URVNUX0NNRElELCBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTI1MjgsMjggKzI4ODEsMzEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX2FkZGJhX3JlcV9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9hZGRiYV9yZXFfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJCSBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfYWRkYmFfcmVxX2V2ZW50ICpjbWQgPSAoc3RydWN0IHdtaV9hZGRiYV9yZXFfZXZlbnQgKikgZGF0YXA7CiAKLQlhZ2dyX3JlY3ZfYWRkYmFfcmVxX2V2dCh3bWktPnBhcmVudF9kZXYsIGNtZC0+dGlkLAorCWFnZ3JfcmVjdl9hZGRiYV9yZXFfZXZ0KHZpZiwgY21kLT50aWQsCiAJCQkJbGUxNl90b19jcHUoY21kLT5zdF9zZXFfbm8pLCBjbWQtPndpbl9zeik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX2RlbGJhX3JlcV9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9kZWxiYV9yZXFfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJCSBzdHJ1Y3QgYXRoNmtsX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bWlfZGVsYmFfZXZlbnQgKmNtZCA9IChzdHJ1Y3Qgd21pX2RlbGJhX2V2ZW50ICopIGRhdGFwOwogCi0JYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQod21pLT5wYXJlbnRfZGV2LCBjbWQtPnRpZCk7CisJYWdncl9yZWN2X2RlbGJhX3JlcV9ldnQodmlmLCBjbWQtPnRpZCk7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyogIEFQIG1vZGUgZnVuY3Rpb25zICovCiAKLWludCBhdGg2a2xfd21pX2FwX3Byb2ZpbGVfY29tbWl0KHN0cnVjdCB3bWkgKndtaXAsIHN0cnVjdCB3bWlfY29ubmVjdF9jbWQgKnApCitpbnQgYXRoNmtsX3dtaV9hcF9wcm9maWxlX2NvbW1pdChzdHJ1Y3Qgd21pICp3bWlwLCB1OCBpZl9pZHgsCisJCQkJIHN0cnVjdCB3bWlfY29ubmVjdF9jbWQgKnApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2Nvbm5lY3RfY21kICpjbTsKQEAgLTI1NjIsNyArMjkxOCw3IEBACiAJY20gPSAoc3RydWN0IHdtaV9jb25uZWN0X2NtZCAqKSBza2ItPmRhdGE7CiAJbWVtY3B5KGNtLCBwLCBzaXplb2YoKmNtKSk7CiAKLQlyZXMgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaXAsIHNrYiwgV01JX0FQX0NPTkZJR19DT01NSVRfQ01ESUQsCisJcmVzID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWlwLCBpZl9pZHgsIHNrYiwgV01JX0FQX0NPTkZJR19DT01NSVRfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICIlczogbndfdHlwZT0ldSBhdXRoX21vZGU9JXUgY2g9JXUgIgogCQkgICAiY3RybF9mbGFncz0weCV4LT4gcmVzPSVkXG4iLApAQCAtMjU3MSw3ICsyOTI3LDggQEAKIAlyZXR1cm4gcmVzOwogfQogCi1pbnQgYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShzdHJ1Y3Qgd21pICp3bWlwLCB1OCBjbWQsIGNvbnN0IHU4ICptYWMsIHUxNiByZWFzb24pCitpbnQgYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShzdHJ1Y3Qgd21pICp3bWlwLCB1OCBpZl9pZHgsIHU4IGNtZCwgY29uc3QgdTggKm1hYywKKwkJCSAgIHUxNiByZWFzb24pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX2FwX3NldF9tbG1lX2NtZCAqY207CkBAIC0yNTg1LDExICsyOTQyLDEyIEBACiAJY20tPnJlYXNvbiA9IGNwdV90b19sZTE2KHJlYXNvbik7CiAJY20tPmNtZCA9IGNtZDsKIAotCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaXAsIHNrYiwgV01JX0FQX1NFVF9NTE1FX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaXAsIGlmX2lkeCwgc2tiLCBXTUlfQVBfU0VUX01MTUVfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotc3RhdGljIGludCBhdGg2a2xfd21pX3BzcG9sbF9ldmVudF9yeChzdHJ1Y3Qgd21pICp3bWksIHU4ICpkYXRhcCwgaW50IGxlbikKK3N0YXRpYyBpbnQgYXRoNmtsX3dtaV9wc3BvbGxfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJICAgICAgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKIAlzdHJ1Y3Qgd21pX3BzcG9sbF9ldmVudCAqZXY7CiAKQEAgLTI1OTgsMTkgKzI5NTYsMjEgQEAKIAogCWV2ID0gKHN0cnVjdCB3bWlfcHNwb2xsX2V2ZW50ICopIGRhdGFwOwogCi0JYXRoNmtsX3BzcG9sbF9ldmVudCh3bWktPnBhcmVudF9kZXYsIGxlMTZfdG9fY3B1KGV2LT5haWQpKTsKKwlhdGg2a2xfcHNwb2xsX2V2ZW50KHZpZiwgbGUxNl90b19jcHUoZXYtPmFpZCkpOwogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYXRoNmtsX3dtaV9kdGltZXhwaXJ5X2V2ZW50X3J4KHN0cnVjdCB3bWkgKndtaSwgdTggKmRhdGFwLCBpbnQgbGVuKQorc3RhdGljIGludCBhdGg2a2xfd21pX2R0aW1leHBpcnlfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4sCisJCQkJCSAgc3RydWN0IGF0aDZrbF92aWYgKnZpZikKIHsKLQlhdGg2a2xfZHRpbWV4cGlyeV9ldmVudCh3bWktPnBhcmVudF9kZXYpOworCWF0aDZrbF9kdGltZXhwaXJ5X2V2ZW50KHZpZik7CiAKIAlyZXR1cm4gMDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgYWlkLCBib29sIGZsYWcpCitpbnQgYXRoNmtsX3dtaV9zZXRfcHZiX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTE2IGFpZCwKKwkJCSAgIGJvb2wgZmxhZykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfYXBfc2V0X3B2Yl9jbWQgKmNtZDsKQEAgLTI2MjUsMTMgKzI5ODUsMTQgQEAKIAljbWQtPnJzdmQgPSBjcHVfdG9fbGUxNigwKTsKIAljbWQtPmZsYWcgPSBjcHVfdG9fbGUzMihmbGFnKTsKIAotCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9BUF9TRVRfUFZCX0NNRElELAorCXJldCA9IGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX0FQX1NFVF9QVkJfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBhdGg2a2xfd21pX3NldF9yeF9mcmFtZV9mb3JtYXRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggcnhfbWV0YV92ZXIsCitpbnQgYXRoNmtsX3dtaV9zZXRfcnhfZnJhbWVfZm9ybWF0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICAgICAgdTggcnhfbWV0YV92ZXIsCiAJCQkJICAgICAgIGJvb2wgcnhfZG90MTFfaGRyLCBib29sIGRlZnJhZ19vbl9ob3N0KQogewogCXN0cnVjdCBza19idWZmICpza2I7CkBAIC0yNjQ4LDE0ICszMDA5LDE0IEBACiAJY21kLT5tZXRhX3ZlciA9IHJ4X21ldGFfdmVyOwogCiAJLyogRGVsZXRlIHRoZSBsb2NhbCBhZ2dyIHN0YXRlLCBvbiBob3N0ICovCi0JcmV0ID0gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1JYX0ZSQU1FX0ZPUk1BVF9DTURJRCwKKwlyZXQgPSBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9SWF9GUkFNRV9GT1JNQVRfQ01ESUQsCiAJCQkJICBOT19TWU5DX1dNSUZMQUcpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IG1nbXRfZnJtX3R5cGUsIGNvbnN0IHU4ICppZSwKLQkJCSAgICAgdTggaWVfbGVuKQoraW50IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggbWdtdF9mcm1fdHlwZSwKKwkJCSAgICAgY29uc3QgdTggKmllLCB1OCBpZV9sZW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3NldF9hcHBpZV9jbWQgKnA7CkBAIC0yNjY5LDggKzMwMzAsMTEgQEAKIAlwID0gKHN0cnVjdCB3bWlfc2V0X2FwcGllX2NtZCAqKSBza2ItPmRhdGE7CiAJcC0+bWdtdF9mcm1fdHlwZSA9IG1nbXRfZnJtX3R5cGU7CiAJcC0+aWVfbGVuID0gaWVfbGVuOwotCW1lbWNweShwLT5pZV9pbmZvLCBpZSwgaWVfbGVuKTsKLQlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX1NFVF9BUFBJRV9DTURJRCwKKworCWlmIChpZSAhPSBOVUxMICYmIGllX2xlbiA+IDApCisJCW1lbWNweShwLT5pZV9pbmZvLCBpZSwgaWVfbGVuKTsKKworCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9TRVRfQVBQSUVfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIApAQCAtMjY4OCwxMSArMzA1MiwxMSBAQAogCWNtZCA9IChzdHJ1Y3Qgd21pX2Rpc2FibGVfMTFiX3JhdGVzX2NtZCAqKSBza2ItPmRhdGE7CiAJY21kLT5kaXNhYmxlID0gZGlzYWJsZSA/IDEgOiAwOwogCi0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9ESVNBQkxFXzExQl9SQVRFU19DTURJRCwKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIDAsIHNrYiwgV01JX0RJU0FCTEVfMTFCX1JBVEVTX0NNRElELAogCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7CiB9CiAKLWludCBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUzMiBmcmVxLCB1MzIgZHVyKQoraW50IGF0aDZrbF93bWlfcmVtYWluX29uX2NobmxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgZnJlcSwgdTMyIGR1cikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfcmVtYWluX29uX2NobmxfY21kICpwOwpAQCAtMjcwNiwxMiArMzA3MCwxNiBAQAogCXAgPSAoc3RydWN0IHdtaV9yZW1haW5fb25fY2hubF9jbWQgKikgc2tiLT5kYXRhOwogCXAtPmZyZXEgPSBjcHVfdG9fbGUzMihmcmVxKTsKIAlwLT5kdXJhdGlvbiA9IGNwdV90b19sZTMyKGR1cik7Ci0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9SRU1BSU5fT05fQ0hOTF9DTURJRCwKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfUkVNQUlOX09OX0NITkxfQ01ESUQsCiAJCQkJICAgTk9fU1lOQ19XTUlGTEFHKTsKIH0KIAotaW50IGF0aDZrbF93bWlfc2VuZF9hY3Rpb25fY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGlkLCB1MzIgZnJlcSwgdTMyIHdhaXQsCi0JCQkgICAgICAgY29uc3QgdTggKmRhdGEsIHUxNiBkYXRhX2xlbikKKy8qIGF0aDZrbF93bWlfc2VuZF9hY3Rpb25fY21kIGlzIHRvIGJlIGRlcHJlY2F0ZWQuIFVzZQorICogYXRoNmtsX3dtaV9zZW5kX21nbXRfY21kIGluc3RlYWQuIFRoZSBuZXcgZnVuY3Rpb24gc3VwcG9ydHMgUDJQCisgKiBtZ210IG9wZXJhdGlvbnMgdXNpbmcgc3RhdGlvbiBpbnRlcmZhY2UuCisgKi8KK2ludCBhdGg2a2xfd21pX3NlbmRfYWN0aW9uX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTMyIGlkLCB1MzIgZnJlcSwKKwkJCSAgICAgICB1MzIgd2FpdCwgY29uc3QgdTggKmRhdGEsIHUxNiBkYXRhX2xlbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfc2VuZF9hY3Rpb25fY21kICpwOwpAQCAtMjczMSw2ICszMDk5LDcgQEAKIAl9CiAKIAlrZnJlZSh3bWktPmxhc3RfbWdtdF90eF9mcmFtZSk7CisJbWVtY3B5KGJ1ZiwgZGF0YSwgZGF0YV9sZW4pOwogCXdtaS0+bGFzdF9tZ210X3R4X2ZyYW1lID0gYnVmOwogCXdtaS0+bGFzdF9tZ210X3R4X2ZyYW1lX2xlbiA9IGRhdGFfbGVuOwogCkBAIC0yNzQyLDE4ICszMTExLDYxIEBACiAJcC0+d2FpdCA9IGNwdV90b19sZTMyKHdhaXQpOwogCXAtPmxlbiA9IGNwdV90b19sZTE2KGRhdGFfbGVuKTsKIAltZW1jcHkocC0+ZGF0YSwgZGF0YSwgZGF0YV9sZW4pOwotCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VORF9BQ1RJT05fQ01ESUQsCisJcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBpZl9pZHgsIHNrYiwgV01JX1NFTkRfQUNUSU9OX0NNRElELAogCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7CiB9CiAKLWludCBhdGg2a2xfd21pX3NlbmRfcHJvYmVfcmVzcG9uc2VfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGZyZXEsCi0JCQkJICAgICAgIGNvbnN0IHU4ICpkc3QsCi0JCQkJICAgICAgIGNvbnN0IHU4ICpkYXRhLCB1MTYgZGF0YV9sZW4pCitpbnQgYXRoNmtsX3dtaV9zZW5kX21nbXRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgaWQsIHUzMiBmcmVxLAorCQkJICAgICAgIHUzMiB3YWl0LCBjb25zdCB1OCAqZGF0YSwgdTE2IGRhdGFfbGVuLAorCQkJICAgICAgIHUzMiBub19jY2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgd21pX3NlbmRfbWdtdF9jbWQgKnA7CisJdTggKmJ1ZjsKKworCWlmICh3YWl0KQorCQlyZXR1cm4gLUVJTlZBTDsgLyogT2ZmbG9hZCBmb3Igd2FpdCBub3Qgc3VwcG9ydGVkICovCisKKwlidWYgPSBrbWFsbG9jKGRhdGFfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2IgPSBhdGg2a2xfd21pX2dldF9uZXdfYnVmKHNpemVvZigqcCkgKyBkYXRhX2xlbik7CisJaWYgKCFza2IpIHsKKwkJa2ZyZWUoYnVmKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJa2ZyZWUod21pLT5sYXN0X21nbXRfdHhfZnJhbWUpOworCW1lbWNweShidWYsIGRhdGEsIGRhdGFfbGVuKTsKKwl3bWktPmxhc3RfbWdtdF90eF9mcmFtZSA9IGJ1ZjsKKwl3bWktPmxhc3RfbWdtdF90eF9mcmFtZV9sZW4gPSBkYXRhX2xlbjsKKworCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJzZW5kX2FjdGlvbl9jbWQ6IGlkPSV1IGZyZXE9JXUgd2FpdD0ldSAiCisJCSAgICJsZW49JXVcbiIsIGlkLCBmcmVxLCB3YWl0LCBkYXRhX2xlbik7CisJcCA9IChzdHJ1Y3Qgd21pX3NlbmRfbWdtdF9jbWQgKikgc2tiLT5kYXRhOworCXAtPmlkID0gY3B1X3RvX2xlMzIoaWQpOworCXAtPmZyZXEgPSBjcHVfdG9fbGUzMihmcmVxKTsKKwlwLT53YWl0ID0gY3B1X3RvX2xlMzIod2FpdCk7CisJcC0+bm9fY2NrID0gY3B1X3RvX2xlMzIobm9fY2NrKTsKKwlwLT5sZW4gPSBjcHVfdG9fbGUxNihkYXRhX2xlbik7CisJbWVtY3B5KHAtPmRhdGEsIGRhdGEsIGRhdGFfbGVuKTsKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfU0VORF9NR01UX0NNRElELAorCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7Cit9CisKK2ludCBhdGg2a2xfd21pX3NlbmRfcHJvYmVfcmVzcG9uc2VfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MzIgZnJlcSwKKwkJCQkgICAgICAgY29uc3QgdTggKmRzdCwgY29uc3QgdTggKmRhdGEsCisJCQkJICAgICAgIHUxNiBkYXRhX2xlbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCB3bWlfcDJwX3Byb2JlX3Jlc3BvbnNlX2NtZCAqcDsKKwlzaXplX3QgY21kX2xlbiA9IHNpemVvZigqcCkgKyBkYXRhX2xlbjsKIAotCXNrYiA9IGF0aDZrbF93bWlfZ2V0X25ld19idWYoc2l6ZW9mKCpwKSArIGRhdGFfbGVuKTsKKwlpZiAoZGF0YV9sZW4gPT0gMCkKKwkJY21kX2xlbisrOyAvKiB3b3JrIGFyb3VuZCB0YXJnZXQgbWluaW11bSBsZW5ndGggcmVxdWlyZW1lbnQgKi8KKworCXNrYiA9IGF0aDZrbF93bWlfZ2V0X25ld19idWYoY21kX2xlbik7CiAJaWYgKCFza2IpCiAJCXJldHVybiAtRU5PTUVNOwogCkBAIC0yNzY0LDExICszMTc2LDEyIEBACiAJbWVtY3B5KHAtPmRlc3RpbmF0aW9uX2FkZHIsIGRzdCwgRVRIX0FMRU4pOwogCXAtPmxlbiA9IGNwdV90b19sZTE2KGRhdGFfbGVuKTsKIAltZW1jcHkocC0+ZGF0YSwgZGF0YSwgZGF0YV9sZW4pOwotCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgc2tiLCBXTUlfU0VORF9QUk9CRV9SRVNQT05TRV9DTURJRCwKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLAorCQkJCSAgIFdNSV9TRU5EX1BST0JFX1JFU1BPTlNFX0NNRElELAogCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7CiB9CiAKLWludCBhdGg2a2xfd21pX3Byb2JlX3JlcG9ydF9yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgYm9vbCBlbmFibGUpCitpbnQgYXRoNmtsX3dtaV9wcm9iZV9yZXBvcnRfcmVxX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3Qgd21pX3Byb2JlX3JlcV9yZXBvcnRfY21kICpwOwpAQCAtMjc4MSwxMSArMzE5NCwxMSBAQAogCQkgICBlbmFibGUpOwogCXAgPSAoc3RydWN0IHdtaV9wcm9iZV9yZXFfcmVwb3J0X2NtZCAqKSBza2ItPmRhdGE7CiAJcC0+ZW5hYmxlID0gZW5hYmxlID8gMSA6IDA7Ci0JcmV0dXJuIGF0aDZrbF93bWlfY21kX3NlbmQod21pLCBza2IsIFdNSV9QUk9CRV9SRVFfUkVQT1JUX0NNRElELAorCXJldHVybiBhdGg2a2xfd21pX2NtZF9zZW5kKHdtaSwgaWZfaWR4LCBza2IsIFdNSV9QUk9CRV9SRVFfUkVQT1JUX0NNRElELAogCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7CiB9CiAKLWludCBhdGg2a2xfd21pX2luZm9fcmVxX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUzMiBpbmZvX3JlcV9mbGFncykKK2ludCBhdGg2a2xfd21pX2luZm9fcmVxX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTMyIGluZm9fcmVxX2ZsYWdzKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHdtaV9nZXRfcDJwX2luZm8gKnA7CkBAIC0yNzk4LDE0ICszMjExLDE1IEBACiAJCSAgIGluZm9fcmVxX2ZsYWdzKTsKIAlwID0gKHN0cnVjdCB3bWlfZ2V0X3AycF9pbmZvICopIHNrYi0+ZGF0YTsKIAlwLT5pbmZvX3JlcV9mbGFncyA9IGNwdV90b19sZTMyKGluZm9fcmVxX2ZsYWdzKTsKLQlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIHNrYiwgV01JX0dFVF9QMlBfSU5GT19DTURJRCwKKwlyZXR1cm4gYXRoNmtsX3dtaV9jbWRfc2VuZCh3bWksIGlmX2lkeCwgc2tiLCBXTUlfR0VUX1AyUF9JTkZPX0NNRElELAogCQkJCSAgIE5PX1NZTkNfV01JRkxBRyk7CiB9CiAKLWludCBhdGg2a2xfd21pX2NhbmNlbF9yZW1haW5fb25fY2hubF9jbWQoc3RydWN0IHdtaSAqd21pKQoraW50IGF0aDZrbF93bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCkKIHsKIAlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2NtZFxuIik7Ci0JcmV0dXJuIGF0aDZrbF93bWlfc2ltcGxlX2NtZCh3bWksIFdNSV9DQU5DRUxfUkVNQUlOX09OX0NITkxfQ01ESUQpOworCXJldHVybiBhdGg2a2xfd21pX3NpbXBsZV9jbWQod21pLCBpZl9pZHgsCisJCQkJICAgICBXTUlfQ0FOQ0VMX1JFTUFJTl9PTl9DSE5MX0NNRElEKTsKIH0KIAogc3RhdGljIGludCBhdGg2a2xfd21pX2NvbnRyb2xfcnhfeHRuZChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0yODE4LDcgKzMyMzIsNiBAQAogCiAJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCB3bWl4X2NtZF9oZHIpKSB7CiAJCWF0aDZrbF9lcnIoImJhZCBwYWNrZXQgMVxuIik7Ci0JCXdtaS0+c3RhdC5jbWRfbGVuX2VycisrOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTI4NDAsNyArMzI1Myw2IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWF0aDZrbF93YXJuKCJ1bmtub3duIGNtZCBpZCAweCV4XG4iLCBpZCk7Ci0JCXdtaS0+c3RhdC5jbWRfaWRfZXJyKys7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KQEAgLTI4NDgsMTIgKzMyNjAsMTkgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IGF0aDZrbF93bWlfcm9hbV90YmxfZXZlbnRfcngoc3RydWN0IHdtaSAqd21pLCB1OCAqZGF0YXAsIGludCBsZW4pCit7CisJcmV0dXJuIGF0aDZrbF9kZWJ1Z19yb2FtX3RibF9ldmVudCh3bWktPnBhcmVudF9kZXYsIGRhdGFwLCBsZW4pOworfQorCiAvKiBDb250cm9sIFBhdGggKi8KIGludCBhdGg2a2xfd21pX2NvbnRyb2xfcngoc3RydWN0IHdtaSAqd21pLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB3bWlfY21kX2hkciAqY21kOworCXN0cnVjdCBhdGg2a2xfdmlmICp2aWY7CiAJdTMyIGxlbjsKIAl1MTYgaWQ7CisJdTggaWZfaWR4OwogCXU4ICpkYXRhcDsKIAlpbnQgcmV0ID0gMDsKIApAQCAtMjg2MywxMiArMzI4MiwxMiBAQAogCWlmIChza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3Qgd21pX2NtZF9oZHIpKSB7CiAJCWF0aDZrbF9lcnIoImJhZCBwYWNrZXQgMVxuIik7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJd21pLT5zdGF0LmNtZF9sZW5fZXJyKys7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWNtZCA9IChzdHJ1Y3Qgd21pX2NtZF9oZHIgKikgc2tiLT5kYXRhOwogCWlkID0gbGUxNl90b19jcHUoY21kLT5jbWRfaWQpOworCWlmX2lkeCA9IGxlMTZfdG9fY3B1KGNtZC0+aW5mbzEpICYgV01JX0NNRF9IRFJfSUZfSURfTUFTSzsKIAogCXNrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCB3bWlfY21kX2hkcikpOwogCkBAIC0yODc5LDYgKzMyOTgsMTUgQEAKIAlhdGg2a2xfZGJnX2R1bXAoQVRINktMX0RCR19XTUlfRFVNUCwgTlVMTCwgIndtaSByeCAiLAogCQkJZGF0YXAsIGxlbik7CiAKKwl2aWYgPSBhdGg2a2xfZ2V0X3ZpZl9ieV9pbmRleCh3bWktPnBhcmVudF9kZXYsIGlmX2lkeCk7CisJaWYgKCF2aWYpIHsKKwkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwKKwkJCSAgICJXbWkgZXZlbnQgZm9yIHVuYXZhaWxhYmxlIHZpZiwgdmlmX2luZGV4OiVkXG4iLAorCQkJICAgIGlmX2lkeCk7CisJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCiAJc3dpdGNoIChpZCkgewogCWNhc2UgV01JX0dFVF9CSVRSQVRFX0NNRElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0dFVF9CSVRSQVRFX0NNRElEXG4iKTsKQEAgLTI4OTgsMTEgKzMzMjYsMTEgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfQ09OTkVDVF9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0NPTk5FQ1RfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfY29ubmVjdF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX2Nvbm5lY3RfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9ESVNDT05ORUNUX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfRElTQ09OTkVDVF9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9kaXNjb25uZWN0X2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfZGlzY29ubmVjdF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX1BFRVJfTk9ERV9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1BFRVJfTk9ERV9FVkVOVElEXG4iKTsKQEAgLTI5MTAsMTEgKzMzMzgsMTEgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfVEtJUF9NSUNFUlJfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9US0lQX01JQ0VSUl9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV90a2lwX21pY2Vycl9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3RraXBfbWljZXJyX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfQlNTSU5GT19FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0JTU0lORk9fRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfYnNzaW5mb19ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX2Jzc2luZm9fZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9SRUdET01BSU5fRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9SRUdET01BSU5fRVZFTlRJRFxuIik7CkBAIC0yOTI2LDExICszMzU0LDEyIEBACiAJCWJyZWFrOwogCWNhc2UgV01JX05FSUdIQk9SX1JFUE9SVF9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX05FSUdIQk9SX1JFUE9SVF9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9uZWlnaGJvcl9yZXBvcnRfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9uZWlnaGJvcl9yZXBvcnRfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLAorCQkJCQkJCSAgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfU0NBTl9DT01QTEVURV9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1NDQU5fQ09NUExFVEVfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfc2Nhbl9jb21wbGV0ZV9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3NjYW5fY29tcGxldGVfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9DTURFUlJPUl9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0NNREVSUk9SX0VWRU5USURcbiIpOwpAQCAtMjkzOCw3ICszMzY3LDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUkVQT1JUX1NUQVRJU1RJQ1NfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9SRVBPUlRfU1RBVElTVElDU19FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9zdGF0c19ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3N0YXRzX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUlNTSV9USFJFU0hPTERfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9SU1NJX1RIUkVTSE9MRF9FVkVOVElEXG4iKTsKQEAgLTI5NTMsNiArMzM4Miw3IEBACiAJCWJyZWFrOwogCWNhc2UgV01JX1JFUE9SVF9ST0FNX1RCTF9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1JFUE9SVF9ST0FNX1RCTF9FVkVOVElEXG4iKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9yb2FtX3RibF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOwogCQlicmVhazsKIAljYXNlIFdNSV9FWFRFTlNJT05fRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9FWFRFTlNJT05fRVZFTlRJRFxuIik7CkBAIC0yOTYwLDcgKzMzOTAsNyBAQAogCQlicmVhazsKIAljYXNlIFdNSV9DQUNfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9DQUNfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfY2FjX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbik7CisJCXJldCA9IGF0aDZrbF93bWlfY2FjX2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfQ0hBTk5FTF9DSEFOR0VfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9DSEFOTkVMX0NIQU5HRV9FVkVOVElEXG4iKTsKQEAgLTI5OTYsNyArMzQyNiw2IEBACiAJCWJyZWFrOwogCWNhc2UgV01JX0dFVF9XT1dfTElTVF9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0dFVF9XT1dfTElTVF9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9nZXRfd293X2xpc3RfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfR0VUX1BNS0lEX0xJU1RfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9HRVRfUE1LSURfTElTVF9FVkVOVElEXG4iKTsKQEAgLTMwMDQsMjUgKzM0MzMsMjUgQEAKIAkJYnJlYWs7CiAJY2FzZSBXTUlfUFNQT0xMX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUFNQT0xMX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX3BzcG9sbF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3BzcG9sbF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0RUSU1FWFBJUllfRVZFTlRJRDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgIldNSV9EVElNRVhQSVJZX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX2R0aW1leHBpcnlfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9kdGltZXhwaXJ5X2V2ZW50X3J4KHdtaSwgZGF0YXAsIGxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfU0VUX1BBUkFNU19SRVBMWV9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1NFVF9QQVJBTVNfUkVQTFlfRVZFTlRJRFxuIik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0FEREJBX1JFUV9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX0FEREJBX1JFUV9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9hZGRiYV9yZXFfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9hZGRiYV9yZXFfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9BRERCQV9SRVNQX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfQUREQkFfUkVTUF9FVkVOVElEXG4iKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfREVMQkFfUkVRX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfREVMQkFfUkVRX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX2RlbGJhX3JlcV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX2RlbGJhX3JlcV9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX1JFUE9SVF9CVENPRVhfQ09ORklHX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksCkBAIC0zMDM4LDIxICszNDY3LDIxIEBACiAJCWJyZWFrOwogCWNhc2UgV01JX1JFTUFJTl9PTl9DSE5MX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUkVNQUlOX09OX0NITkxfRVZFTlRJRFxuIik7Ci0JCXJldCA9IGF0aDZrbF93bWlfcmVtYWluX29uX2NobmxfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9yZW1haW5fb25fY2hubF9ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX0NBTkNFTF9SRU1BSU5fT05fQ0hOTF9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLAogCQkJICAgIldNSV9DQU5DRUxfUkVNQUlOX09OX0NITkxfRVZFTlRJRFxuIik7CiAJCXJldCA9IGF0aDZrbF93bWlfY2FuY2VsX3JlbWFpbl9vbl9jaG5sX2V2ZW50X3J4KHdtaSwgZGF0YXAsCi0JCQkJCQkJCWxlbik7CisJCQkJCQkJCWxlbiwgdmlmKTsKIAkJYnJlYWs7CiAJY2FzZSBXTUlfVFhfU1RBVFVTX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfVFhfU1RBVFVTX0VWRU5USURcbiIpOwotCQlyZXQgPSBhdGg2a2xfd21pX3R4X3N0YXR1c19ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4pOworCQlyZXQgPSBhdGg2a2xfd21pX3R4X3N0YXR1c19ldmVudF9yeCh3bWksIGRhdGFwLCBsZW4sIHZpZik7CiAJCWJyZWFrOwogCWNhc2UgV01JX1JYX1BST0JFX1JFUV9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1JYX1BST0JFX1JFUV9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9yeF9wcm9iZV9yZXFfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9yeF9wcm9iZV9yZXFfZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9QMlBfQ0FQQUJJTElUSUVTX0VWRU5USUQ6CiAJCWF0aDZrbF9kYmcoQVRINktMX0RCR19XTUksICJXTUlfUDJQX0NBUEFCSUxJVElFU19FVkVOVElEXG4iKTsKQEAgLTMwNjAsNyArMzQ4OSw3IEBACiAJCWJyZWFrOwogCWNhc2UgV01JX1JYX0FDVElPTl9FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1JYX0FDVElPTl9FVkVOVElEXG4iKTsKLQkJcmV0ID0gYXRoNmtsX3dtaV9yeF9hY3Rpb25fZXZlbnRfcngod21pLCBkYXRhcCwgbGVuKTsKKwkJcmV0ID0gYXRoNmtsX3dtaV9yeF9hY3Rpb25fZXZlbnRfcngod21pLCBkYXRhcCwgbGVuLCB2aWYpOwogCQlicmVhazsKIAljYXNlIFdNSV9QMlBfSU5GT19FVkVOVElEOgogCQlhdGg2a2xfZGJnKEFUSDZLTF9EQkdfV01JLCAiV01JX1AyUF9JTkZPX0VWRU5USURcbiIpOwpAQCAtMzA2OCw3ICszNDk3LDYgQEAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYXRoNmtsX2RiZyhBVEg2S0xfREJHX1dNSSwgInVua25vd24gY21kIGlkIDB4JXhcbiIsIGlkKTsKLQkJd21pLT5zdGF0LmNtZF9pZF9lcnIrKzsKIAkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQpAQCAtMzA3OCwxMSArMzUwNiw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgYXRoNmtsX3dtaV9xb3Nfc3RhdGVfaW5pdChzdHJ1Y3Qgd21pICp3bWkpCit2b2lkIGF0aDZrbF93bWlfcmVzZXQoc3RydWN0IHdtaSAqd21pKQogewotCWlmICghd21pKQotCQlyZXR1cm47Ci0KIAlzcGluX2xvY2tfYmgoJndtaS0+bG9jayk7CiAKIAl3bWktPmZhdF9waXBlX2V4aXN0ID0gMDsKQEAgLTMxMDMsMTYgKzM1MjgsOSBAQAogCiAJd21pLT5wYXJlbnRfZGV2ID0gZGV2OwogCi0JYXRoNmtsX3dtaV9xb3Nfc3RhdGVfaW5pdCh3bWkpOwotCiAJd21pLT5wd3JfbW9kZSA9IFJFQ19QT1dFUjsKLQl3bWktPnBoeV9tb2RlID0gV01JXzExR19NT0RFOwogCi0Jd21pLT5wYWlyX2NyeXB0b190eXBlID0gTk9ORV9DUllQVDsKLQl3bWktPmdycF9jcnlwdG9fdHlwZSA9IE5PTkVfQ1JZUFQ7Ci0KLQl3bWktPmh0X2FsbG93ZWRbQV9CQU5EXzI0R0haXSA9IDE7Ci0Jd21pLT5odF9hbGxvd2VkW0FfQkFORF81R0haXSA9IDE7CisJYXRoNmtsX3dtaV9yZXNldCh3bWkpOwogCiAJcmV0dXJuIHdtaTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoNmtsL3dtaS5oCmluZGV4IGY4ZTY0NGQuLjQyYWMzMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg2a2wvd21pLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDZrbC93bWkuaApAQCAtOTMsMTEgKzkzLDYgQEAKIAl1OCBsYXN0X3Jzc2lfcG9sbF9ldmVudDsKIH07CiAKLXN0cnVjdCB3bWlfc3RhdHMgewotCXUzMiBjbWRfbGVuX2VycjsKLQl1MzIgY21kX2lkX2VycjsKLX07Ci0KIHN0cnVjdCB3bWlfZGF0YV9zeW5jX2J1ZnMgewogCXU4IHRyYWZmaWNfY2xhc3M7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKQEAgLTExMSwzMiArMTA2LDI2IEBACiAjZGVmaW5lIFdNTV9BQ19WTyAgIDMJCS8qIHZvaWNlICovCiAKIHN0cnVjdCB3bWkgewotCWJvb2wgcmVhZHk7CiAJdTE2IHN0cmVhbV9leGlzdF9mb3JfYWNbV01NX05VTV9BQ107CiAJdTggZmF0X3BpcGVfZXhpc3Q7CiAJc3RydWN0IGF0aDZrbCAqcGFyZW50X2RldjsKLQlzdHJ1Y3Qgd21pX3N0YXRzIHN0YXQ7CiAJdTggcHdyX21vZGU7Ci0JdTggcGh5X21vZGU7Ci0JdTgga2VlcF9hbGl2ZV9pbnR2bDsKIAlzcGlubG9ja190IGxvY2s7CiAJZW51bSBodGNfZW5kcG9pbnRfaWQgZXBfaWQ7CiAJc3RydWN0IHNxX3RocmVzaG9sZF9wYXJhbXMKIAkgICAgc3FfdGhyZXNobGRbU0lHTkFMX1FVQUxJVFlfTUVUUklDU19OVU1fTUFYXTsKLQllbnVtIGNyeXB0b190eXBlIHBhaXJfY3J5cHRvX3R5cGU7Ci0JZW51bSBjcnlwdG9fdHlwZSBncnBfY3J5cHRvX3R5cGU7CiAJYm9vbCBpc193bW1fZW5hYmxlZDsKLQl1OCBodF9hbGxvd2VkW0FfTlVNX0JBTkRTXTsKIAl1OCB0cmFmZmljX2NsYXNzOwogCWJvb2wgaXNfcHJvYmVfc3NpZDsKIAogCXU4ICpsYXN0X21nbXRfdHhfZnJhbWU7CiAJc2l6ZV90IGxhc3RfbWdtdF90eF9mcmFtZV9sZW47CisJdTggc2F2ZWRfcHdyX21vZGU7CiB9OwogCiBzdHJ1Y3QgaG9zdF9hcHBfYXJlYSB7Ci0JdTMyIHdtaV9wcm90b2NvbF92ZXI7Ci19OworCV9fbGUzMiB3bWlfcHJvdG9jb2xfdmVyOworfSBfX3BhY2tlZDsKIAogZW51bSB3bWlfbXNnX3R5cGUgewogCURBVEFfTVNHVFlQRSA9IDB4MCwKQEAgLTE4NCw2ICsxNzMsOCBAQAogI2RlZmluZSBXTUlfREFUQV9IRFJfTUVUQV9NQVNLICAgICAgMHg3CiAjZGVmaW5lIFdNSV9EQVRBX0hEUl9NRVRBX1NISUZUICAgICAxMwogCisjZGVmaW5lIFdNSV9EQVRBX0hEUl9JRl9JRFhfTUFTSyAgICAweEYKKwogc3RydWN0IHdtaV9kYXRhX2hkciB7CiAJczggcnNzaTsKIApAQCAtMjA4LDYgKzE5OSwxMiBAQAogCSAqIGIxNTpiMTMgICAgICAtIE1FVEFfREFUQV9WRVJTSU9OIDAgLSA3CiAJICovCiAJX19sZTE2IGluZm8yOworCisJLyoKKwkgKiB1c2FnZSBvZiBpbmZvMywgMTYtYml0OgorCSAqIGIzOmIwCS0gSW50ZXJmYWNlIGluZGV4CisJICogYjE1OmI0CS0gUmVzZXJ2ZWQKKwkgKi8KIAlfX2xlMTYgaW5mbzM7CiB9IF9fcGFja2VkOwogCkBAIC0yNTAsNiArMjQ3LDExIEBACiAJCQkgICAgICAgV01JX0RBVEFfSERSX01FVEFfTUFTSzsKIH0KIAorc3RhdGljIGlubGluZSB1OCB3bWlfZGF0YV9oZHJfZ2V0X2lmX2lkeChzdHJ1Y3Qgd21pX2RhdGFfaGRyICpkaGRyKQoreworCXJldHVybiBsZTE2X3RvX2NwdShkaGRyLT5pbmZvMykgJiBXTUlfREFUQV9IRFJfSUZfSURYX01BU0s7Cit9CisKIC8qIFR4IG1ldGEgdmVyc2lvbiBkZWZpbml0aW9ucyAqLwogI2RlZmluZSBXTUlfTUFYX1RYX01FVEFfU1oJMTIKICNkZWZpbmUgV01JX01FVEFfVkVSU0lPTl8xCTB4MDEKQEAgLTI5OSw2ICszMDEsOCBAQAogCXU4IGNzdW1fZmxhZ3M7CiB9IF9fcGFja2VkOwogCisjZGVmaW5lIFdNSV9DTURfSERSX0lGX0lEX01BU0sgMHhGCisKIC8qIENvbnRyb2wgUGF0aCAqLwogc3RydWN0IHdtaV9jbWRfaGRyIHsKIAlfX2xlMTYgY21kX2lkOwpAQCAtMzEyLDYgKzMxNiwxMSBAQAogCV9fbGUxNiByZXNlcnZlZDsKIH0gX19wYWNrZWQ7CiAKK3N0YXRpYyBpbmxpbmUgdTggd21pX2NtZF9oZHJfZ2V0X2lmX2lkeChzdHJ1Y3Qgd21pX2NtZF9oZHIgKmNoZHIpCit7CisJcmV0dXJuIGxlMTZfdG9fY3B1KGNoZHItPmluZm8xKSAmIFdNSV9DTURfSERSX0lGX0lEX01BU0s7Cit9CisKIC8qIExpc3Qgb2YgV01JIGNvbW1hbmRzICovCiBlbnVtIHdtaV9jbWRfaWQgewogCVdNSV9DT05ORUNUX0NNRElEID0gMHgwMDAxLApAQCAtMzIwLDYgKzMyOSwxMCBAQAogCVdNSV9TWU5DSFJPTklaRV9DTURJRCwKIAlXTUlfQ1JFQVRFX1BTVFJFQU1fQ01ESUQsCiAJV01JX0RFTEVURV9QU1RSRUFNX0NNRElELAorCS8qIFdNSV9TVEFSVF9TQ0FOX0NNRElEIGlzIHRvIGJlIGRlcHJlY2F0ZWQuIFVzZQorCSAqIFdNSV9CRUdJTl9TQ0FOX0NNRElEIGluc3RlYWQuIFRoZSBuZXcgY21kIHN1cHBvcnRzIFAyUCBtZ210CisJICogb3BlcmF0aW9ucyB1c2luZyBzdGF0aW9uIGludGVyZmFjZS4KKwkgKi8KIAlXTUlfU1RBUlRfU0NBTl9DTURJRCwKIAlXTUlfU0VUX1NDQU5fUEFSQU1TX0NNRElELAogCVdNSV9TRVRfQlNTX0ZJTFRFUl9DTURJRCwKQEAgLTUzMywxMiArNTQ2LDYxIEBACiAJV01JX0dUS19PRkZMT0FEX09QX0NNRElELAogCVdNSV9SRU1BSU5fT05fQ0hOTF9DTURJRCwKIAlXTUlfQ0FOQ0VMX1JFTUFJTl9PTl9DSE5MX0NNRElELAorCS8qIFdNSV9TRU5EX0FDVElPTl9DTURJRCBpcyB0byBiZSBkZXByZWNhdGVkLiBVc2UKKwkgKiBXTUlfU0VORF9NR01UX0NNRElEIGluc3RlYWQuIFRoZSBuZXcgY21kIHN1cHBvcnRzIFAyUCBtZ210CisJICogb3BlcmF0aW9ucyB1c2luZyBzdGF0aW9uIGludGVyZmFjZS4KKwkgKi8KIAlXTUlfU0VORF9BQ1RJT05fQ01ESUQsCiAJV01JX1BST0JFX1JFUV9SRVBPUlRfQ01ESUQsCiAJV01JX0RJU0FCTEVfMTFCX1JBVEVTX0NNRElELAogCVdNSV9TRU5EX1BST0JFX1JFU1BPTlNFX0NNRElELAogCVdNSV9HRVRfUDJQX0lORk9fQ01ESUQsCiAJV01JX0FQX0pPSU5fQlNTX0NNRElELAorCisJV01JX1NNUFNfRU5BQkxFX0NNRElELAorCVdNSV9TTVBTX0NPTkZJR19DTURJRCwKKwlXTUlfU0VUX1JBVEVDVFJMX1BBUk1fQ01ESUQsCisJLyogIExQTCBzcGVjaWZpYyBjb21tYW5kcyovCisJV01JX0xQTF9GT1JDRV9FTkFCTEVfQ01ESUQsCisJV01JX0xQTF9TRVRfUE9MSUNZX0NNRElELAorCVdNSV9MUExfR0VUX1BPTElDWV9DTURJRCwKKwlXTUlfTFBMX0dFVF9IV1NUQVRFX0NNRElELAorCVdNSV9MUExfU0VUX1BBUkFNU19DTURJRCwKKwlXTUlfTFBMX0dFVF9QQVJBTVNfQ01ESUQsCisKKwlXTUlfU0VUX0JVTkRMRV9QQVJBTV9DTURJRCwKKworCS8qR3JlZW5UeCBzcGVjaWZpYyBjb21tYW5kcyovCisKKwlXTUlfR1JFRU5UWF9QQVJBTVNfQ01ESUQsCisKKwlXTUlfUlRUX01FQVNSRVFfQ01ESUQsCisJV01JX1JUVF9DQVBSRVFfQ01ESUQsCisJV01JX1JUVF9TVEFUVVNSRVFfQ01ESUQsCisKKwkvKiBXUFMgQ29tbWFuZHMgKi8KKwlXTUlfV1BTX1NUQVJUX0NNRElELAorCVdNSV9HRVRfV1BTX1NUQVRVU19DTURJRCwKKworCS8qIE1vcmUgUDJQIGNvbW1hbmRzICovCisJV01JX1NFVF9OT0FfQ01ESUQsCisJV01JX0dFVF9OT0FfQ01ESUQsCisJV01JX1NFVF9PUFBQU19DTURJRCwKKwlXTUlfR0VUX09QUFBTX0NNRElELAorCVdNSV9BRERfUE9SVF9DTURJRCwKKwlXTUlfREVMX1BPUlRfQ01ESUQsCisKKwkvKiA4MDIuMTF3IGNtZCAqLworCVdNSV9TRVRfUlNOX0NBUF9DTURJRCwKKwlXTUlfR0VUX1JTTl9DQVBfQ01ESUQsCisJV01JX1NFVF9JR1RLX0NNRElELAorCisJV01JX1JYX0ZJTFRFUl9DT0FMRVNDRV9GSUxURVJfT1BfQ01ESUQsCisJV01JX1JYX0ZJTFRFUl9TRVRfRlJBTUVfVEVTVF9MSVNUX0NNRElELAorCisJV01JX1NFTkRfTUdNVF9DTURJRCwKKwlXTUlfQkVHSU5fU0NBTl9DTURJRCwKKwogfTsKIAogZW51bSB3bWlfbWdtdF9mcmFtZV90eXBlIHsKQEAgLTU1OCw2ICs2MjAsMTQgQEAKIAlBUF9ORVRXT1JLID0gMHgxMCwKIH07CiAKK2VudW0gbmV0d29ya19zdWJ0eXBlIHsKKwlTVUJUWVBFX05PTkUsCisJU1VCVFlQRV9CVCwKKwlTVUJUWVBFX1AyUERFViwKKwlTVUJUWVBFX1AyUENMSUVOVCwKKwlTVUJUWVBFX1AyUEdPLAorfTsKKwogZW51bSBkb3QxMV9hdXRoX21vZGUgewogCU9QRU5fQVVUSCA9IDB4MDEsCiAJU0hBUkVEX0FVVEggPSAweDAyLApAQCAtNTc2LDkgKzY0Niw2IEBACiAJV1BBMl9BVVRIX0NDS00gPSAweDQwLAogfTsKIAotI2RlZmluZSBXTUlfTUlOX0NSWVBUT19UWVBFIE5PTkVfQ1JZUFQKLSNkZWZpbmUgV01JX01BWF9DUllQVE9fVFlQRSAoQUVTX0NSWVBUICsgMSkKLQogI2RlZmluZSBXTUlfTUlOX0tFWV9JTkRFWCAgIDAKICNkZWZpbmUgV01JX01BWF9LRVlfSU5ERVggICAzCiAKQEAgLTYxNyw2ICs2ODQsNyBAQAogCUNPTk5FQ1RfQ1NBX0ZPTExPV19CU1MgPSAweDAwMjAsCiAJQ09OTkVDVF9ET19XUEFfT0ZGTE9BRCA9IDB4MDA0MCwKIAlDT05ORUNUX0RPX05PVF9ERUFVVEggPSAweDAwODAsCisJQ09OTkVDVF9XUFNfRkxBRyA9IDB4MDEwMCwKIH07CiAKIHN0cnVjdCB3bWlfY29ubmVjdF9jbWQgewpAQCAtNjMyLDYgKzcwMCw3IEBACiAJX19sZTE2IGNoOwogCXU4IGJzc2lkW0VUSF9BTEVOXTsKIAlfX2xlMzIgY3RybF9mbGFnczsKKwl1OCBud19zdWJ0eXBlOwogfSBfX3BhY2tlZDsKIAogLyogV01JX1JFQ09OTkVDVF9DTURJRCAqLwpAQCAtNzE5LDYgKzc4OCw0MyBAQAogCVdNSV9TSE9SVF9TQ0FOID0gMSwKIH07CiAKK3N0cnVjdCB3bWlfc3VwcF9yYXRlcyB7CisJdTggbnJhdGVzOworCXU4IHJhdGVzW0FUSDZLTF9SQVRFX01BWFNJWkVdOworfTsKKworc3RydWN0IHdtaV9iZWdpbl9zY2FuX2NtZCB7CisJX19sZTMyIGZvcmNlX2ZnX3NjYW47CisKKwkvKiBmb3IgbGVnYWN5IGNpc2NvIEFQIGNvbXBhdGliaWxpdHkgKi8KKwlfX2xlMzIgaXNfbGVnYWN5OworCisJLyogbWF4IGR1cmF0aW9uIGluIHRoZSBob21lIGNoYW5uZWwobXNlYykgKi8KKwlfX2xlMzIgaG9tZV9kd2VsbF90aW1lOworCisJLyogdGltZSBpbnRlcnZhbCBiZXR3ZWVuIHNjYW5zIChtc2VjKSAqLworCV9fbGUzMiBmb3JjZV9zY2FuX2ludHZsOworCisJLyogbm8gQ0NLIHJhdGVzICovCisJX19sZTMyIG5vX2NjazsKKworCS8qIGVudW0gd21pX3NjYW5fdHlwZSAqLworCXU4IHNjYW5fdHlwZTsKKworCS8qIFN1cHBvcnRlZCByYXRlcyB0byBhZHZlcnRpc2UgaW4gdGhlIHByb2JlIHJlcXVlc3QgZnJhbWVzICovCisJc3RydWN0IHdtaV9zdXBwX3JhdGVzIHN1cHBfcmF0ZXNbSUVFRTgwMjExX05VTV9CQU5EU107CisKKwkvKiBob3cgbWFueSBjaGFubmVscyBmb2xsb3cgKi8KKwl1OCBudW1fY2g7CisKKwkvKiBjaGFubmVscyBpbiBNaHogKi8KKwlfX2xlMTYgY2hfbGlzdFsxXTsKK30gX19wYWNrZWQ7CisKKy8qIHdtaV9zdGFydF9zY2FuX2NtZCBpcyB0byBiZSBkZXByZWNhdGVkLiBVc2UKKyAqIHdtaV9iZWdpbl9zY2FuX2NtZCBpbnN0ZWFkLiBUaGUgbmV3IHN0cnVjdHVyZSBzdXBwb3J0cyBQMlAgbWdtdAorICogb3BlcmF0aW9ucyB1c2luZyBzdGF0aW9uIGludGVyZmFjZS4KKyAqLwogc3RydWN0IHdtaV9zdGFydF9zY2FuX2NtZCB7CiAJX19sZTMyIGZvcmNlX2ZnX3NjYW47CiAKQEAgLTc0MSw5ICs4NDcsNiBAQAogCV9fbGUxNiBjaF9saXN0WzFdOwogfSBfX3BhY2tlZDsKIAotLyogV01JX1NFVF9TQ0FOX1BBUkFNU19DTURJRCAqLwotI2RlZmluZSBXTUlfU0hPUlRTQ0FOUkFUSU9fREVGQVVMVCAgICAgIDMKLQogLyoKICAqICBXYXJuaW5nOiBzY2FuIGNvbnRyb2wgZmxhZyB2YWx1ZSBvZiAweEZGIGlzIHVzZWQgdG8gZGlzYWJsZQogICogIGFsbCBmbGFncyBpbiBXTUlfU0NBTl9QQVJBTVNfQ01ELiBEbyBub3QgYWRkIGFueSBtb3JlCkBAIC03NzYsMTMgKzg3OSw2IEBACiAJRU5BQkxFX1NDQU5fQUJPUlRfRVZFTlQgPSAweDQwCiB9OwogCi0jZGVmaW5lIERFRkFVTFRfU0NBTl9DVFJMX0ZMQUdTCQkJXAotCShDT05ORUNUX1NDQU5fQ1RSTF9GTEFHUyB8CQlcCi0JIFNDQU5fQ09OTkVDVEVEX0NUUkxfRkxBR1MgfAkJXAotCSBBQ1RJVkVfU0NBTl9DVFJMX0ZMQUdTIHwJCVwKLQkgUk9BTV9TQ0FOX0NUUkxfRkxBR1MgfAkJCVwKLQkgRU5BQkxFX0FVVE9fQ1RSTF9GTEFHUykKLQogc3RydWN0IHdtaV9zY2FuX3BhcmFtc19jbWQgewogCSAgLyogc2VjICovCiAJX19sZTE2IGZnX3N0YXJ0X3BlcmlvZDsKQEAgLTEzNjUsMTQgKzE0NjEsMjAgQEAKIAlXTUlfU0VUX0xSU1NJX1NDQU5fUEFSQU1TLAogfTsKIAorZW51bSB3bWlfcm9hbV9tb2RlIHsKKwlXTUlfREVGQVVMVF9ST0FNX01PREUgPSAxLCAvKiBSU1NJIGJhc2VkIHJvYW0gKi8KKwlXTUlfSE9TVF9CSUFTX1JPQU1fTU9ERSA9IDIsIC8qIEhvc3QgYmlhcyBiYXNlZCByb2FtICovCisJV01JX0xPQ0tfQlNTX01PREUgPSAzLCAvKiBMb2NrIHRvIHRoZSBjdXJyZW50IEJTUyAqLworfTsKKwogc3RydWN0IGJzc19iaWFzIHsKIAl1OCBic3NpZFtFVEhfQUxFTl07Ci0JdTggIGJpYXM7CisJczggYmlhczsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBic3NfYmlhc19pbmZvIHsKIAl1OCBudW1fYnNzOwotCXN0cnVjdCBic3NfYmlhcyBic3NfYmlhc1sxXTsKKwlzdHJ1Y3QgYnNzX2JpYXMgYnNzX2JpYXNbMF07CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgbG93X3Jzc2lfc2Nhbl9wYXJhbXMgewpAQCAtMTM4NSwxMCArMTQ4NywxMSBAQAogCiBzdHJ1Y3Qgcm9hbV9jdHJsX2NtZCB7CiAJdW5pb24gewotCQl1OCBic3NpZFtFVEhfQUxFTl07Ci0JCXU4IHJvYW1fbW9kZTsKLQkJc3RydWN0IGJzc19iaWFzX2luZm8gYnNzOwotCQlzdHJ1Y3QgbG93X3Jzc2lfc2Nhbl9wYXJhbXMgcGFyYW1zOworCQl1OCBic3NpZFtFVEhfQUxFTl07IC8qIFdNSV9GT1JDRV9ST0FNICovCisJCXU4IHJvYW1fbW9kZTsgLyogV01JX1NFVF9ST0FNX01PREUgKi8KKwkJc3RydWN0IGJzc19iaWFzX2luZm8gYnNzOyAvKiBXTUlfU0VUX0hPU1RfQklBUyAqLworCQlzdHJ1Y3QgbG93X3Jzc2lfc2Nhbl9wYXJhbXMgcGFyYW1zOyAvKiBXTUlfU0VUX0xSU1NJX1NDQU5fUEFSQU1TCisJCQkJCQkgICAgICovCiAJfSBfX3BhY2tlZCBpbmZvOwogCXU4IHJvYW1fY3RybDsKIH0gX19wYWNrZWQ7CkBAIC0xNDU1LDYgKzE1NTgsMTAgQEAKIAl1OCBpc19tY2FzdDsKIH0gX19wYWNrZWQ7CiAKK2VudW0gd21pX3NjYW5fc3RhdHVzIHsKKwlXTUlfU0NBTl9TVEFUVVNfU1VDQ0VTUyA9IDAsCit9OworCiAvKiBXTUlfU0NBTl9DT01QTEVURV9FVkVOVElEICovCiBzdHJ1Y3Qgd21pX3NjYW5fY29tcGxldGVfZXZlbnQgewogCWFfc2xlMzIgc3RhdHVzOwpAQCAtMTYzNSw2ICsxNzQyLDEyIEBACiAJdTggcmVzZXJ2ZWQ7CiB9IF9fcGFja2VkOwogCitzdHJ1Y3Qgd21pX3RhcmdldF9yb2FtX3RibCB7CisJX19sZTE2IHJvYW1fbW9kZTsKKwlfX2xlMTYgbnVtX2VudHJpZXM7CisJc3RydWN0IHdtaV9ic3Nfcm9hbV9pbmZvIGluZm9bXTsKK30gX19wYWNrZWQ7CisKIC8qIFdNSV9DQUNfRVZFTlRJRCAqLwogZW51bSBjYWNfaW5kaWNhdGlvbiB7CiAJQ0FDX0lORElDQVRJT05fQURNSVNTSU9OID0gMHgwMCwKQEAgLTE3NzEsNyArMTg4NCw2IEBACiAjZGVmaW5lIFdTQ19SRUdfQUNUSVZFICAgICAxCiAjZGVmaW5lIFdTQ19SRUdfSU5BQ1RJVkUgICAwCiAKLSNkZWZpbmUgV09XX01BWF9GSUxURVJfTElTVFMJIDEKICNkZWZpbmUgV09XX01BWF9GSUxURVJTX1BFUl9MSVNUIDQKICNkZWZpbmUgV09XX1BBVFRFUk5fU0laRQkgNjQKICNkZWZpbmUgV09XX01BU0tfU0laRQkJIDY0CkBAIC0xNzk0LDE3ICsxOTA2LDUyIEBACiAJX19sZTMyIGlwc1tNQVhfSVBfQUREUlNdOwogfSBfX3BhY2tlZDsKIAotLyogV01JX0dFVF9XT1dfTElTVF9DTUQgcmVwbHkgICovCi1zdHJ1Y3Qgd21pX2dldF93b3dfbGlzdF9yZXBseSB7Ci0JLyogbnVtYmVyIG9mIHBhdHRlcm5zIGluIHJlcGx5ICovCi0JdTggbnVtX2ZpbHRlcnM7CitlbnVtIGF0aDZrbF93b3dfZmlsdGVycyB7CisJV09XX0ZJTFRFUl9TU0lECQkJPSBCSVQoMSksCisJV09XX0ZJTFRFUl9PUFRJT05fTUFHSUNfUEFDS0VUICA9IEJJVCgyKSwKKwlXT1dfRklMVEVSX09QVElPTl9FQVBfUkVRCT0gQklUKDMpLAorCVdPV19GSUxURVJfT1BUSU9OX1BBVFRFUk5TCT0gQklUKDQpLAorCVdPV19GSUxURVJfT1BUSU9OX09GRkxPQURfQVJQCT0gQklUKDUpLAorCVdPV19GSUxURVJfT1BUSU9OX09GRkxPQURfTlMJPSBCSVQoNiksCisJV09XX0ZJTFRFUl9PUFRJT05fT0ZGTE9BRF9HVEsJPSBCSVQoNyksCisJV09XX0ZJTFRFUl9PUFRJT05fODAyMVhfNFdBWUhTCT0gQklUKDgpLAorCVdPV19GSUxURVJfT1BUSU9OX05MT19ESVNDVlJZCT0gQklUKDkpLAorCVdPV19GSUxURVJfT1BUSU9OX05XS19ESVNBU1NPQwk9IEJJVCgxMCksCisJV09XX0ZJTFRFUl9PUFRJT05fR1RLX0VSUk9SCT0gQklUKDExKSwKKwlXT1dfRklMVEVSX09QVElPTl9URVNUX01PREUJPSBCSVQoMTUpLAorfTsKIAotCS8qIHRoaXMgaXMgZmlsdGVyICMgeCBvZiB0b3RhbCBudW1fZmlsdGVycyAqLwotCXU4IHRoaXNfZmlsdGVyX251bTsKK2VudW0gYXRoNmtsX2hvc3RfbW9kZSB7CisJQVRINktMX0hPU1RfTU9ERV9BV0FLRSwKKwlBVEg2S0xfSE9TVF9NT0RFX0FTTEVFUCwKK307CiAKLQl1OCB3b3dfbW9kZTsKLQl1OCBob3N0X21vZGU7Ci0Jc3RydWN0IHdvd19maWx0ZXIgd293X2ZpbHRlcnNbMV07CitzdHJ1Y3Qgd21pX3NldF9ob3N0X3NsZWVwX21vZGVfY21kIHsKKwlfX2xlMzIgYXdha2U7CisJX19sZTMyIGFzbGVlcDsKK30gX19wYWNrZWQ7CisKK2VudW0gYXRoNmtsX3dvd19tb2RlIHsKKwlBVEg2S0xfV09XX01PREVfRElTQUJMRSwKKwlBVEg2S0xfV09XX01PREVfRU5BQkxFLAorfTsKKworc3RydWN0IHdtaV9zZXRfd293X21vZGVfY21kIHsKKwlfX2xlMzIgZW5hYmxlX3dvdzsKKwlfX2xlMzIgZmlsdGVyOworCV9fbGUxNiBob3N0X3JlcV9kZWxheTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB3bWlfYWRkX3dvd19wYXR0ZXJuX2NtZCB7CisJdTggZmlsdGVyX2xpc3RfaWQ7CisJdTggZmlsdGVyX3NpemU7CisJdTggZmlsdGVyX29mZnNldDsKKwl1OCBmaWx0ZXJbMF07Cit9IF9fcGFja2VkOworCitzdHJ1Y3Qgd21pX2RlbF93b3dfcGF0dGVybl9jbWQgeworCV9fbGUxNiBmaWx0ZXJfbGlzdF9pZDsKKwlfX2xlMTYgZmlsdGVyX2lkOwogfSBfX3BhY2tlZDsKIAogLyogV01JX1NFVF9BS01QX1BBUkFNU19DTUQgKi8KQEAgLTE5MDUsNyArMjA1Miw3IEBACiAgKiAhISEgV2FybmluZyAhISEKICAqIC1DaGFuZ2luZyB0aGUgZm9sbG93aW5nIHZhbHVlcyBuZWVkcyBjb21waWxhdGlvbiBvZiBib3RoIGRyaXZlciBhbmQgZmlybXdhcmUKICAqLwotI2RlZmluZSBBUF9NQVhfTlVNX1NUQSAgICAgICAgICA4CisjZGVmaW5lIEFQX01BWF9OVU1fU1RBICAgICAgICAgIDEwCiAKIC8qIFNwbC4gQUlEIHVzZWQgdG8gc2V0IERUSU0gZmxhZyBpbiB0aGUgYmVhY29ucyAqLwogI2RlZmluZSBNQ0FTVF9BSUQgICAgICAgICAgICAgICAweEZGCkBAIC0xOTg4LDYgKzIxMzUsMTAgQEAKIAlfX2xlMzIgZHVyYXRpb247CiB9IF9fcGFja2VkOwogCisvKiB3bWlfc2VuZF9hY3Rpb25fY21kIGlzIHRvIGJlIGRlcHJlY2F0ZWQuIFVzZQorICogd21pX3NlbmRfbWdtdF9jbWQgaW5zdGVhZC4gVGhlIG5ldyBzdHJ1Y3R1cmUgc3VwcG9ydHMgUDJQIG1nbXQKKyAqIG9wZXJhdGlvbnMgdXNpbmcgc3RhdGlvbiBpbnRlcmZhY2UuCisgKi8KIHN0cnVjdCB3bWlfc2VuZF9hY3Rpb25fY21kIHsKIAlfX2xlMzIgaWQ7CiAJX19sZTMyIGZyZXE7CkBAIC0xOTk2LDYgKzIxNDcsMTUgQEAKIAl1OCBkYXRhWzBdOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IHdtaV9zZW5kX21nbXRfY21kIHsKKwlfX2xlMzIgaWQ7CisJX19sZTMyIGZyZXE7CisJX19sZTMyIHdhaXQ7CisJX19sZTMyIG5vX2NjazsKKwlfX2xlMTYgbGVuOworCXU4IGRhdGFbMF07Cit9IF9fcGFja2VkOworCiBzdHJ1Y3Qgd21pX3R4X3N0YXR1c19ldmVudCB7CiAJX19sZTMyIGlkOwogCXU4IGFja19zdGF0dXM7CkBAIC0yMTYzLDEyMCArMjMyMywxNjIgQEAKIGludCBhdGg2a2xfd21pX2RhdGFfaGRyX2FkZChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgdTggbXNnX3R5cGUsIGJvb2wgbW9yZV9kYXRhLAogCQkJICAgIGVudW0gd21pX2RhdGFfaGRyX2RhdGFfdHlwZSBkYXRhX3R5cGUsCi0JCQkgICAgdTggbWV0YV92ZXIsIHZvaWQgKnR4X21ldGFfaW5mbyk7CisJCQkgICAgdTggbWV0YV92ZXIsIHZvaWQgKnR4X21ldGFfaW5mbywgdTggaWZfaWR4KTsKIAogaW50IGF0aDZrbF93bWlfZG90MTFfaGRyX3JlbW92ZShzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IGF0aDZrbF93bWlfZG90M18yX2RpeChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCBhdGg2a2xfd21pX2ltcGxpY2l0X2NyZWF0ZV9wc3RyZWFtKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgICAgICAgdTMyIGxheWVyMl9wcmlvcml0eSwgYm9vbCB3bW1fZW5hYmxlZCwKLQkJCQkgICAgICAgdTggKmFjKTsKK2ludCBhdGg2a2xfd21pX2ltcGxpY2l0X2NyZWF0ZV9wc3RyZWFtKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgbGF5ZXIyX3ByaW9yaXR5LAorCQkJCSAgICAgICBib29sIHdtbV9lbmFibGVkLCB1OCAqYWMpOwogCiBpbnQgYXRoNmtsX3dtaV9jb250cm9sX3J4KHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKLWludCBhdGg2a2xfd21pX2NtZF9zZW5kKHN0cnVjdCB3bWkgKndtaSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK2ludCBhdGg2a2xfd21pX2NtZF9zZW5kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJZW51bSB3bWlfY21kX2lkIGNtZF9pZCwgZW51bSB3bWlfc3luY19mbGFnIHN5bmNfZmxhZyk7CiAKLWludCBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgZW51bSBuZXR3b3JrX3R5cGUgbndfdHlwZSwKK2ludCBhdGg2a2xfd21pX2Nvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJICAgZW51bSBuZXR3b3JrX3R5cGUgbndfdHlwZSwKIAkJCSAgIGVudW0gZG90MTFfYXV0aF9tb2RlIGRvdDExX2F1dGhfbW9kZSwKIAkJCSAgIGVudW0gYXV0aF9tb2RlIGF1dGhfbW9kZSwKIAkJCSAgIGVudW0gY3J5cHRvX3R5cGUgcGFpcndpc2VfY3J5cHRvLAogCQkJICAgdTggcGFpcndpc2VfY3J5cHRvX2xlbiwKIAkJCSAgIGVudW0gY3J5cHRvX3R5cGUgZ3JvdXBfY3J5cHRvLAogCQkJICAgdTggZ3JvdXBfY3J5cHRvX2xlbiwgaW50IHNzaWRfbGVuLCB1OCAqc3NpZCwKLQkJCSAgIHU4ICpic3NpZCwgdTE2IGNoYW5uZWwsIHUzMiBjdHJsX2ZsYWdzKTsKKwkJCSAgIHU4ICpic3NpZCwgdTE2IGNoYW5uZWwsIHUzMiBjdHJsX2ZsYWdzLAorCQkJICAgdTggbndfc3VidHlwZSk7CiAKLWludCBhdGg2a2xfd21pX3JlY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCAqYnNzaWQsIHUxNiBjaGFubmVsKTsKLWludCBhdGg2a2xfd21pX2Rpc2Nvbm5lY3RfY21kKHN0cnVjdCB3bWkgKndtaSk7Ci1pbnQgYXRoNmtsX3dtaV9zdGFydHNjYW5fY21kKHN0cnVjdCB3bWkgKndtaSwgZW51bSB3bWlfc2Nhbl90eXBlIHNjYW5fdHlwZSwKK2ludCBhdGg2a2xfd21pX3JlY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4ICpic3NpZCwKKwkJCSAgICAgdTE2IGNoYW5uZWwpOworaW50IGF0aDZrbF93bWlfZGlzY29ubmVjdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpOworaW50IGF0aDZrbF93bWlfc3RhcnRzY2FuX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCSAgICAgZW51bSB3bWlfc2Nhbl90eXBlIHNjYW5fdHlwZSwKIAkJCSAgICAgdTMyIGZvcmNlX2Znc2NhbiwgdTMyIGlzX2xlZ2FjeSwKIAkJCSAgICAgdTMyIGhvbWVfZHdlbGxfdGltZSwgdTMyIGZvcmNlX3NjYW5faW50ZXJ2YWwsCiAJCQkgICAgIHM4IG51bV9jaGFuLCB1MTYgKmNoX2xpc3QpOwotaW50IGF0aDZrbF93bWlfc2NhbnBhcmFtc19jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgZmdfc3RhcnRfc2VjLAorCitpbnQgYXRoNmtsX3dtaV9iZWdpbnNjYW5fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJICAgICBlbnVtIHdtaV9zY2FuX3R5cGUgc2Nhbl90eXBlLAorCQkJICAgICB1MzIgZm9yY2VfZmdzY2FuLCB1MzIgaXNfbGVnYWN5LAorCQkJICAgICB1MzIgaG9tZV9kd2VsbF90aW1lLCB1MzIgZm9yY2Vfc2Nhbl9pbnRlcnZhbCwKKwkJCSAgICAgczggbnVtX2NoYW4sIHUxNiAqY2hfbGlzdCwgdTMyIG5vX2NjaywKKwkJCSAgICAgdTMyICpyYXRlcyk7CisKK2ludCBhdGg2a2xfd21pX3NjYW5wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MTYgZmdfc3RhcnRfc2VjLAogCQkJICAgICAgdTE2IGZnX2VuZF9zZWMsIHUxNiBiZ19zZWMsCiAJCQkgICAgICB1MTYgbWluYWN0X2NoZHdfbXNlYywgdTE2IG1heGFjdF9jaGR3X21zZWMsCiAJCQkgICAgICB1MTYgcGFzX2NoZHdfbXNlYywgdTggc2hvcnRfc2Nhbl9yYXRpbywKIAkJCSAgICAgIHU4IHNjYW5fY3RybF9mbGFnLCB1MzIgbWF4X2Rmc2NoX2FjdF90aW1lLAogCQkJICAgICAgdTE2IG1heGFjdF9zY2FuX3Blcl9zc2lkKTsKLWludCBhdGg2a2xfd21pX2Jzc2ZpbHRlcl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBmaWx0ZXIsIHUzMiBpZV9tYXNrKTsKLWludCBhdGg2a2xfd21pX3Byb2JlZHNzaWRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaW5kZXgsIHU4IGZsYWcsCitpbnQgYXRoNmtsX3dtaV9ic3NmaWx0ZXJfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBmaWx0ZXIsCisJCQkgICAgIHUzMiBpZV9tYXNrKTsKK2ludCBhdGg2a2xfd21pX3Byb2JlZHNzaWRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBpbmRleCwgdTggZmxhZywKIAkJCSAgICAgIHU4IHNzaWRfbGVuLCB1OCAqc3NpZCk7Ci1pbnQgYXRoNmtsX3dtaV9saXN0ZW5pbnRlcnZhbF9jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgbGlzdGVuX2ludGVydmFsLAoraW50IGF0aDZrbF93bWlfbGlzdGVuaW50ZXJ2YWxfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgdTE2IGxpc3Rlbl9pbnRlcnZhbCwKIAkJCQkgIHUxNiBsaXN0ZW5fYmVhY29ucyk7Ci1pbnQgYXRoNmtsX3dtaV9wb3dlcm1vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggcHdyX21vZGUpOwotaW50IGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTE2IGlkbGVfcGVyaW9kLAoraW50IGF0aDZrbF93bWlfcG93ZXJtb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggcHdyX21vZGUpOworaW50IGF0aDZrbF93bWlfcG1wYXJhbXNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1MTYgaWRsZV9wZXJpb2QsCiAJCQkgICAgdTE2IHBzX3BvbGxfbnVtLCB1MTYgZHRpbV9wb2xpY3ksCiAJCQkgICAgdTE2IHR4X3dha3VwX3BvbGljeSwgdTE2IG51bV90eF90b193YWtldXAsCiAJCQkgICAgdTE2IHBzX2ZhaWxfZXZlbnRfcG9saWN5KTsKLWludCBhdGg2a2xfd21pX2Rpc2N0aW1lb3V0X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IHRpbWVvdXQpOwotaW50IGF0aDZrbF93bWlfY3JlYXRlX3BzdHJlYW1fY21kKHN0cnVjdCB3bWkgKndtaSwKK2ludCBhdGg2a2xfd21pX2NyZWF0ZV9wc3RyZWFtX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKIAkJCQkgIHN0cnVjdCB3bWlfY3JlYXRlX3BzdHJlYW1fY21kICpwc3RyZWFtKTsKLWludCBhdGg2a2xfd21pX2RlbGV0ZV9wc3RyZWFtX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IHRyYWZmaWNfY2xhc3MsIHU4IHRzaWQpOworaW50IGF0aDZrbF93bWlfZGVsZXRlX3BzdHJlYW1fY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCB0cmFmZmljX2NsYXNzLAorCQkJCSAgdTggdHNpZCk7CitpbnQgYXRoNmtsX3dtaV9kaXNjdGltZW91dF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IHRpbWVvdXQpOwogCiBpbnQgYXRoNmtsX3dtaV9zZXRfcnRzX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUxNiB0aHJlc2hvbGQpOwotaW50IGF0aDZrbF93bWlfc2V0X2xwcmVhbWJsZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBzdGF0dXMsCitpbnQgYXRoNmtsX3dtaV9zZXRfbHByZWFtYmxlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggc3RhdHVzLAogCQkJCSB1OCBwcmVhbWJsZV9wb2xpY3kpOwogCiBpbnQgYXRoNmtsX3dtaV9nZXRfY2hhbGxlbmdlX3Jlc3BfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGNvb2tpZSwgdTMyIHNvdXJjZSk7CiBpbnQgYXRoNmtsX3dtaV9jb25maWdfZGVidWdfbW9kdWxlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUzMiB2YWxpZCwgdTMyIGNvbmZpZyk7CiAKLWludCBhdGg2a2xfd21pX2dldF9zdGF0c19jbWQoc3RydWN0IHdtaSAqd21pKTsKLWludCBhdGg2a2xfd21pX2FkZGtleV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBrZXlfaW5kZXgsCitpbnQgYXRoNmtsX3dtaV9nZXRfc3RhdHNfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4KTsKK2ludCBhdGg2a2xfd21pX2FkZGtleV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGtleV9pbmRleCwKIAkJCSAgZW51bSBjcnlwdG9fdHlwZSBrZXlfdHlwZSwKIAkJCSAgdTgga2V5X3VzYWdlLCB1OCBrZXlfbGVuLAotCQkJICB1OCAqa2V5X3JzYywgdTggKmtleV9tYXRlcmlhbCwKKwkJCSAgdTggKmtleV9yc2MsIHVuc2lnbmVkIGludCBrZXlfcnNjX2xlbiwKKwkJCSAgdTggKmtleV9tYXRlcmlhbCwKIAkJCSAgdTgga2V5X29wX2N0cmwsIHU4ICptYWNfYWRkciwKIAkJCSAgZW51bSB3bWlfc3luY19mbGFnIHN5bmNfZmxhZyk7Ci1pbnQgYXRoNmtsX3dtaV9hZGRfa3JrX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4ICprcmspOwotaW50IGF0aDZrbF93bWlfZGVsZXRla2V5X2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGtleV9pbmRleCk7Ci1pbnQgYXRoNmtsX3dtaV9zZXRwbWtpZF9jbWQoc3RydWN0IHdtaSAqd21pLCBjb25zdCB1OCAqYnNzaWQsCitpbnQgYXRoNmtsX3dtaV9hZGRfa3JrX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggKmtyayk7CitpbnQgYXRoNmtsX3dtaV9kZWxldGVrZXlfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBrZXlfaW5kZXgpOworaW50IGF0aDZrbF93bWlfc2V0cG1raWRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBjb25zdCB1OCAqYnNzaWQsCiAJCQkgICAgY29uc3QgdTggKnBta2lkLCBib29sIHNldCk7Ci1pbnQgYXRoNmtsX3dtaV9zZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGRiTSk7Ci1pbnQgYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWkpOworaW50IGF0aDZrbF93bWlfc2V0X3R4X3B3cl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHU4IGRiTSk7CitpbnQgYXRoNmtsX3dtaV9nZXRfdHhfcHdyX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCk7CitpbnQgYXRoNmtsX3dtaV9nZXRfcm9hbV90YmxfY21kKHN0cnVjdCB3bWkgKndtaSk7CiAKLWludCBhdGg2a2xfd21pX3NldF93bW1fdHhvcChzdHJ1Y3Qgd21pICp3bWksIGVudW0gd21pX3R4b3BfY2ZnIGNmZyk7Ci1pbnQgYXRoNmtsX3dtaV9zZXRfa2VlcGFsaXZlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGtlZXBfYWxpdmVfaW50dmwpOworaW50IGF0aDZrbF93bWlfc2V0X3dtbV90eG9wKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBlbnVtIHdtaV90eG9wX2NmZyBjZmcpOworaW50IGF0aDZrbF93bWlfc2V0X2tlZXBhbGl2ZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJIHU4IGtlZXBfYWxpdmVfaW50dmwpOwogaW50IGF0aDZrbF93bWlfdGVzdF9jbWQoc3RydWN0IHdtaSAqd21pLCB2b2lkICpidWYsIHNpemVfdCBsZW4pOwogCiBzMzIgYXRoNmtsX3dtaV9nZXRfcmF0ZShzOCByYXRlX2luZGV4KTsKIAogaW50IGF0aDZrbF93bWlfc2V0X2lwX2NtZChzdHJ1Y3Qgd21pICp3bWksIHN0cnVjdCB3bWlfc2V0X2lwX2NtZCAqaXBfY21kKTsKK2ludCBhdGg2a2xfd21pX3NldF9ob3N0X3NsZWVwX21vZGVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LAorCQkJCSAgICAgICBlbnVtIGF0aDZrbF9ob3N0X21vZGUgaG9zdF9tb2RlKTsKK2ludCBhdGg2a2xfd21pX3NldF93b3dfbW9kZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJZW51bSBhdGg2a2xfd293X21vZGUgd293X21vZGUsCisJCQkJdTMyIGZpbHRlciwgdTE2IGhvc3RfcmVxX2RlbGF5KTsKK2ludCBhdGg2a2xfd21pX2FkZF93b3dfcGF0dGVybl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgdTggbGlzdF9pZCwgdTggZmlsdGVyX3NpemUsCisJCQkJICAgdTggZmlsdGVyX29mZnNldCwgdTggKmZpbHRlciwgdTggKm1hc2spOworaW50IGF0aDZrbF93bWlfZGVsX3dvd19wYXR0ZXJuX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwKKwkJCQkgICB1MTYgbGlzdF9pZCwgdTE2IGZpbHRlcl9pZCk7CiBpbnQgYXRoNmtsX3dtaV9zZXRfcm9hbV9scnNzaV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBscnNzaSk7CitpbnQgYXRoNmtsX3dtaV9mb3JjZV9yb2FtX2NtZChzdHJ1Y3Qgd21pICp3bWksIGNvbnN0IHU4ICpic3NpZCk7CitpbnQgYXRoNmtsX3dtaV9zZXRfcm9hbV9tb2RlX2NtZChzdHJ1Y3Qgd21pICp3bWksIGVudW0gd21pX3JvYW1fbW9kZSBtb2RlKTsKIAogLyogQVAgbW9kZSAqLwotaW50IGF0aDZrbF93bWlfYXBfcHJvZmlsZV9jb21taXQoc3RydWN0IHdtaSAqd21pcCwgc3RydWN0IHdtaV9jb25uZWN0X2NtZCAqcCk7CitpbnQgYXRoNmtsX3dtaV9hcF9wcm9maWxlX2NvbW1pdChzdHJ1Y3Qgd21pICp3bWlwLCB1OCBpZl9pZHgsCisJCQkJIHN0cnVjdCB3bWlfY29ubmVjdF9jbWQgKnApOwogCi1pbnQgYXRoNmtsX3dtaV9hcF9zZXRfbWxtZShzdHJ1Y3Qgd21pICp3bWlwLCB1OCBjbWQsIGNvbnN0IHU4ICptYWMsIHUxNiByZWFzb24pOworaW50IGF0aDZrbF93bWlfYXBfc2V0X21sbWUoc3RydWN0IHdtaSAqd21pcCwgdTggaWZfaWR4LCB1OCBjbWQsCisJCQkgICBjb25zdCB1OCAqbWFjLCB1MTYgcmVhc29uKTsKIAotaW50IGF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoc3RydWN0IHdtaSAqd21pLCB1MTYgYWlkLCBib29sIGZsYWcpOworaW50IGF0aDZrbF93bWlfc2V0X3B2Yl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUxNiBhaWQsIGJvb2wgZmxhZyk7CiAKLWludCBhdGg2a2xfd21pX3NldF9yeF9mcmFtZV9mb3JtYXRfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggcnhfbWV0YV92ZXJzaW9uLAoraW50IGF0aDZrbF93bWlfc2V0X3J4X2ZyYW1lX2Zvcm1hdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsCisJCQkJICAgICAgIHU4IHJ4X21ldGFfdmVyc2lvbiwKIAkJCQkgICAgICAgYm9vbCByeF9kb3QxMV9oZHIsIGJvb2wgZGVmcmFnX29uX2hvc3QpOwogCi1pbnQgYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggbWdtdF9mcm1fdHlwZSwgY29uc3QgdTggKmllLAotCQkJICAgICB1OCBpZV9sZW4pOworaW50IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTggbWdtdF9mcm1fdHlwZSwKKwkJCSAgICAgY29uc3QgdTggKmllLCB1OCBpZV9sZW4pOwogCiAvKiBQMlAgKi8KIGludCBhdGg2a2xfd21pX2Rpc2FibGVfMTFiX3JhdGVzX2NtZChzdHJ1Y3Qgd21pICp3bWksIGJvb2wgZGlzYWJsZSk7CiAKLWludCBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUzMiBmcmVxLCB1MzIgZHVyKTsKK2ludCBhdGg2a2xfd21pX3JlbWFpbl9vbl9jaG5sX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTMyIGZyZXEsCisJCQkJICB1MzIgZHVyKTsKIAotaW50IGF0aDZrbF93bWlfc2VuZF9hY3Rpb25fY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGlkLCB1MzIgZnJlcSwgdTMyIHdhaXQsCi0JCQkgICAgICAgY29uc3QgdTggKmRhdGEsIHUxNiBkYXRhX2xlbik7CitpbnQgYXRoNmtsX3dtaV9zZW5kX2FjdGlvbl9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUzMiBpZCwgdTMyIGZyZXEsCisJCQkgICAgICAgdTMyIHdhaXQsIGNvbnN0IHU4ICpkYXRhLCB1MTYgZGF0YV9sZW4pOwogCi1pbnQgYXRoNmtsX3dtaV9zZW5kX3Byb2JlX3Jlc3BvbnNlX2NtZChzdHJ1Y3Qgd21pICp3bWksIHUzMiBmcmVxLAotCQkJCSAgICAgICBjb25zdCB1OCAqZHN0LAotCQkJCSAgICAgICBjb25zdCB1OCAqZGF0YSwgdTE2IGRhdGFfbGVuKTsKK2ludCBhdGg2a2xfd21pX3NlbmRfbWdtdF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUzMiBpZCwgdTMyIGZyZXEsCisJCQkgICAgICAgdTMyIHdhaXQsIGNvbnN0IHU4ICpkYXRhLCB1MTYgZGF0YV9sZW4sCisJCQkgICAgICAgdTMyIG5vX2Njayk7CiAKLWludCBhdGg2a2xfd21pX3Byb2JlX3JlcG9ydF9yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgYm9vbCBlbmFibGUpOworaW50IGF0aDZrbF93bWlfc2VuZF9wcm9iZV9yZXNwb25zZV9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgsIHUzMiBmcmVxLAorCQkJCSAgICAgICBjb25zdCB1OCAqZHN0LCBjb25zdCB1OCAqZGF0YSwKKwkJCQkgICAgICAgdTE2IGRhdGFfbGVuKTsKIAotaW50IGF0aDZrbF93bWlfaW5mb19yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgdTMyIGluZm9fcmVxX2ZsYWdzKTsKK2ludCBhdGg2a2xfd21pX3Byb2JlX3JlcG9ydF9yZXFfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCBib29sIGVuYWJsZSk7CiAKLWludCBhdGg2a2xfd21pX2NhbmNlbF9yZW1haW5fb25fY2hubF9jbWQoc3RydWN0IHdtaSAqd21pKTsKK2ludCBhdGg2a2xfd21pX2luZm9fcmVxX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IGlmX2lkeCwgdTMyIGluZm9fcmVxX2ZsYWdzKTsKIAotaW50IGF0aDZrbF93bWlfc2V0X2FwcGllX2NtZChzdHJ1Y3Qgd21pICp3bWksIHU4IG1nbXRfZnJtX3R5cGUsIGNvbnN0IHU4ICppZSwKLQkJCSAgICAgdTggaWVfbGVuKTsKK2ludCBhdGg2a2xfd21pX2NhbmNlbF9yZW1haW5fb25fY2hubF9jbWQoc3RydWN0IHdtaSAqd21pLCB1OCBpZl9pZHgpOwogCitpbnQgYXRoNmtsX3dtaV9zZXRfYXBwaWVfY21kKHN0cnVjdCB3bWkgKndtaSwgdTggaWZfaWR4LCB1OCBtZ210X2ZybV90eXBlLAorCQkJICAgICBjb25zdCB1OCAqaWUsIHU4IGllX2xlbik7CisKK3ZvaWQgYXRoNmtsX3dtaV9zc2Nhbl90aW1lcih1bnNpZ25lZCBsb25nIHB0cik7CisKK3N0cnVjdCBhdGg2a2xfdmlmICphdGg2a2xfZ2V0X3ZpZl9ieV9pbmRleChzdHJ1Y3QgYXRoNmtsICphciwgdTggaWZfaWR4KTsKIHZvaWQgKmF0aDZrbF93bWlfaW5pdChzdHJ1Y3QgYXRoNmtsICpkZXZ0KTsKIHZvaWQgYXRoNmtsX3dtaV9zaHV0ZG93bihzdHJ1Y3Qgd21pICp3bWkpOwordm9pZCBhdGg2a2xfd21pX3Jlc2V0KHN0cnVjdCB3bWkgKndtaSk7CiAKICNlbmRpZiAvKiBXTUlfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZwppbmRleCBkOWMwOGM2Li5kYzZiZTRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvS2NvbmZpZwpAQCAtMiw2ICsyLDkgQEAKIAl0cmlzdGF0ZQogY29uZmlnIEFUSDlLX0NPTU1PTgogCXRyaXN0YXRlCitjb25maWcgQVRIOUtfREZTX0RFQlVHRlMKKwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBBVEg5S19ERUJVR0ZTICYmIEFUSDlLX0RGU19DRVJUSUZJRUQKIAogY29uZmlnIEFUSDlLCiAJdHJpc3RhdGUgIkF0aGVyb3MgODAyLjExbiB3aXJlbGVzcyBjYXJkcyBzdXBwb3J0IgpAQCAtMjUsNiArMjgsNyBAQAogCiBjb25maWcgQVRIOUtfUENJCiAJYm9vbCAiQXRoZXJvcyBhdGg5ayBQQ0kvUENJZSBidXMgc3VwcG9ydCIKKwlkZWZhdWx0IHkKIAlkZXBlbmRzIG9uIEFUSDlLICYmIFBDSQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIFBDSSBidXMgc3VwcG9ydCBpbiBhdGg5ay4KQEAgLTUwLDYgKzU0LDI1IEBACiAKIAkgIEFsc28gcmVxdWlyZWQgZm9yIGNoYW5naW5nIGRlYnVnIG1lc3NhZ2UgZmxhZ3MgYXQgcnVuIHRpbWUuCiAKK2NvbmZpZyBBVEg5S19ERlNfQ0VSVElGSUVECisJYm9vbCAiQXRoZXJvcyBERlMgc3VwcG9ydCBmb3IgY2VydGlmaWVkIHBsYXRmb3JtcyIKKwlkZXBlbmRzIG9uIEFUSDlLICYmIEVYUEVSVAorCWRlZmF1bHQgbgorCS0tLWhlbHAtLS0KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgREZTIHN1cHBvcnQgZm9yIGluaXRpYXRpbmcgcmFkaWF0aW9uIG9uCisJICBhdGg5ay4gVGhlcmUgaXMgbm8gd2F5IHRvIGR5bmFtaWNhbGx5IGRldGVjdCBpZiBhIGNhcmQgd2FzIERGUworCSAgY2VydGlmaWVkIGFuZCBhcyBzdWNoIHRoaXMgaXMgbGVmdCBhcyBhIGJ1aWxkIHRpbWUgb3B0aW9uLiBUaGlzCisJICBvcHRpb24gc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCBieSBzeXN0ZW0gaW50ZWdyYXRvcnMgdGhhdCBjYW4KKwkgIGd1YXJhbnRlZSB0aGF0IGFsbCB0aGUgcGxhdGZvcm1zIHRoYXQgdGhlaXIga2VybmVsIHdpbGwgcnVuIG9uCisJICBoYXZlIG9idGFpbmVkIGFwcHJvcHJpYXRlIHJlZ3VsYXRvcnkgYm9keSBjZXJ0aWZpY2F0aW9uIGZvciBhCisJICByZXNwZWN0aXZlIEF0aGVyb3MgY2FyZCBieSB1c2luZyBhdGg5ayBvbiB0aGUgdGFyZ2V0IHNoaXBwaW5nCisJICBwbGF0Zm9ybXMuCisKKwkgIFRoaXMgaXMgY3VycmVudGx5IG9ubHkgYSBwbGFjZWhvbGRlciBmb3IgZnV0dXJlIERGUyBzdXBwb3J0LAorCSAgYXMgREZTIHN1cHBvcnQgcmVxdWlyZXMgbW9yZSBjb21wb25lbnRzIHRoYXQgc3RpbGwgbmVlZCB0byBiZQorCSAgZGV2ZWxvcGVkLiBBdCB0aGlzIHBvaW50IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdvbid0IGRvIGFueXRoaW5nCisJICBleGNlcHQgaW5jcmVhc2UgY29kZSBzaXplLgorCiBjb25maWcgQVRIOUtfUkFURV9DT05UUk9MCiAJYm9vbCAiQXRoZXJvcyBhdGg5ayByYXRlIGNvbnRyb2wiCiAJZGVwZW5kcyBvbiBBVEg5SwpAQCAtNTgsNiArODEsMTQgQEAKIAkgIFNheSBZLCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGF0aDlrIHNwZWNpZmljIHJhdGUgY29udHJvbAogCSAgbW9kdWxlIGluc3RlYWQgb2YgbWluc3RyZWxfaHQuCiAKK2NvbmZpZyBBVEg5S19CVENPRVhfU1VQUE9SVAorCWJvb2wgIkF0aGVyb3MgYXRoOWsgYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBBVEg5SworCWRlZmF1bHQgeQorCS0tLWhlbHAtLS0KKwkgIFNheSBZLCBpZiB5b3Ugd2FudCB0byB1c2UgdGhlIGF0aDlrIHJhZGlvcyB0b2dldGhlciB3aXRoCisJICBCbHVldG9vdGggbW9kdWxlcyBpbiB0aGUgc2FtZSBzeXN0ZW0uCisKIGNvbmZpZyBBVEg5S19IVEMKICAgICAgICB0cmlzdGF0ZSAiQXRoZXJvcyBIVEMgYmFzZWQgd2lyZWxlc3MgY2FyZHMgc3VwcG9ydCIKICAgICAgICBkZXBlbmRzIG9uIFVTQiAmJiBNQUM4MDIxMQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL01ha2VmaWxlCmluZGV4IDM2ZWQzYzQuLmRhMDIyNDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvTWFrZWZpbGUKQEAgLTQsMTEgKzQsMTQgQEAKIAkJbWFpbi5vIFwKIAkJcmVjdi5vIFwKIAkJeG1pdC5vIFwKKwkJbWNpLm8gXAogCiBhdGg5ay0kKENPTkZJR19BVEg5S19SQVRFX0NPTlRST0wpICs9IHJjLm8KIGF0aDlrLSQoQ09ORklHX0FUSDlLX1BDSSkgKz0gcGNpLm8KIGF0aDlrLSQoQ09ORklHX0FUSDlLX0FIQikgKz0gYWhiLm8KIGF0aDlrLSQoQ09ORklHX0FUSDlLX0RFQlVHRlMpICs9IGRlYnVnLm8KK2F0aDlrLSQoQ09ORklHX0FUSDlLX0RGU19ERUJVR0ZTKSArPSBkZnNfZGVidWcubworYXRoOWstJChDT05GSUdfQVRIOUtfREZTX0NFUlRJRklFRCkgKz0gZGZzLm8KIAogb2JqLSQoQ09ORklHX0FUSDlLKSArPSBhdGg5ay5vCiAKQEAgLTMzLDcgKzM2LDggQEAKIAkJYXI5MDAyX21hYy5vIFwKIAkJYXI5MDAzX21hYy5vIFwKIAkJYXI5MDAzX2VlcHJvbS5vIFwKLQkJYXI5MDAzX3BhcHJkLm8KKwkJYXI5MDAzX3BhcHJkLm8gXAorCQlhcjkwMDNfbWNpLm8KIAogb2JqLSQoQ09ORklHX0FUSDlLX0hXKSArPSBhdGg5a19ody5vCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hbmkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hbmkuYwppbmRleCBhNjM5Yjk0Li5iYzU2ZjU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYW5pLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FuaS5jCkBAIC0xMzYsOCArMTM2LDggQEAKIAkJY2NrX2Jhc2UgPSBBUl9QSFlfQ09VTlRNQVggLSBhaC0+Y29uZmlnLmNja190cmlnX2hpZ2g7CiAJfQogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAotCQkiV3JpdGluZyBvZmRtYmFzZT0ldSAgIGNja2Jhc2U9JXVcbiIsIG9mZG1fYmFzZSwgY2NrX2Jhc2UpOworCWF0aF9kYmcoY29tbW9uLCBBTkksICJXcml0aW5nIG9mZG1iYXNlPSV1ICAgY2NrYmFzZT0ldVxuIiwKKwkJb2ZkbV9iYXNlLCBjY2tfYmFzZSk7CiAKIAlFTkFCTEVfUkVHV1JJVEVfQlVGRkVSKGFoKTsKIApAQCAtMjY4LDggKzI2OCw3IEBACiAKIAlhbmlTdGF0ZS0+bm9pc2VGbG9vciA9IEJFQUNPTl9SU1NJKGFoKTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKLQkJIioqKiogb2ZkbWxldmVsICVkPT4lZCwgcnNzaT0lZFtsbz0lZCBoaT0lZF1cbiIsCisJYXRoX2RiZyhjb21tb24sIEFOSSwgIioqKiogb2ZkbWxldmVsICVkPT4lZCwgcnNzaT0lZFtsbz0lZCBoaT0lZF1cbiIsCiAJCWFuaVN0YXRlLT5vZmRtTm9pc2VJbW11bml0eUxldmVsLAogCQlpbW11bml0eUxldmVsLCBhbmlTdGF0ZS0+bm9pc2VGbG9vciwKIAkJYW5pU3RhdGUtPnJzc2lUaHJMb3csIGFuaVN0YXRlLT5yc3NpVGhySGlnaCk7CkBAIC0zMzYsOCArMzM1LDcgQEAKIAljb25zdCBzdHJ1Y3QgYW5pX2Nja19sZXZlbF9lbnRyeSAqZW50cnlfY2NrOwogCiAJYW5pU3RhdGUtPm5vaXNlRmxvb3IgPSBCRUFDT05fUlNTSShhaCk7Ci0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAotCQkiKioqKiBjY2tsZXZlbCAlZD0+JWQsIHJzc2k9JWRbbG89JWQgaGk9JWRdXG4iLAorCWF0aF9kYmcoY29tbW9uLCBBTkksICIqKioqIGNja2xldmVsICVkPT4lZCwgcnNzaT0lZFtsbz0lZCBoaT0lZF1cbiIsCiAJCWFuaVN0YXRlLT5jY2tOb2lzZUltbXVuaXR5TGV2ZWwsIGltbXVuaXR5TGV2ZWwsCiAJCWFuaVN0YXRlLT5ub2lzZUZsb29yLCBhbmlTdGF0ZS0+cnNzaVRockxvdywKIAkJYW5pU3RhdGUtPnJzc2lUaHJIaWdoKTsKQEAgLTQ4MSw4ICs0NzksNyBAQAogCiAJaWYgKGFoLT5vcG1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTgogCSAgICAmJiBhaC0+b3Btb2RlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKLQkJCSJSZXNldCBBTkkgc3RhdGUgb3Btb2RlICV1XG4iLCBhaC0+b3Btb2RlKTsKKwkJYXRoX2RiZyhjb21tb24sIEFOSSwgIlJlc2V0IEFOSSBzdGF0ZSBvcG1vZGUgJXVcbiIsIGFoLT5vcG1vZGUpOwogCQlhaC0+c3RhdHMuYXN0X2FuaV9yZXNldCsrOwogCiAJCWlmIChhaC0+b3Btb2RlID09IE5MODAyMTFfSUZUWVBFX0FQKSB7CkBAIC01ODIsNyArNTc5LDcgQEAKIAkJICAgIEFUSDlLX0FOSV9PRkRNX0RFRl9MRVZFTCB8fAogCQkgICAgYW5pU3RhdGUtPmNja05vaXNlSW1tdW5pdHlMZXZlbCAhPQogCQkgICAgQVRIOUtfQU5JX0NDS19ERUZfTEVWRUwpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCWF0aF9kYmcoY29tbW9uLCBBTkksCiAJCQkJIlJlc3RvcmUgZGVmYXVsdHM6IG9wbW9kZSAldSBjaGFuICVkIE1oei8weCV4IGlzX3NjYW5uaW5nPSVkIG9mZG06JWQgY2NrOiVkXG4iLAogCQkJCWFoLT5vcG1vZGUsCiAJCQkJY2hhbi0+Y2hhbm5lbCwKQEAgLTU5OSw3ICs1OTYsNyBAQAogCQkvKgogCQkgKiByZXN0b3JlIGhpc3RvcmljYWwgbGV2ZWxzIGZvciB0aGlzIGNoYW5uZWwKIAkJICovCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJYXRoX2RiZyhjb21tb24sIEFOSSwKIAkJCSJSZXN0b3JlIGhpc3Rvcnk6IG9wbW9kZSAldSBjaGFuICVkIE1oei8weCV4IGlzX3NjYW5uaW5nPSVkIG9mZG06JWQgY2NrOiVkXG4iLAogCQkJYWgtPm9wbW9kZSwKIAkJCWNoYW4tPmNoYW5uZWwsCkBAIC02NjIsNyArNjU5LDcgQEAKIAogCWlmICghdXNlX25ld19hbmkoYWgpICYmIChwaHlDbnQxIDwgb2ZkbV9iYXNlIHx8IHBoeUNudDIgPCBjY2tfYmFzZSkpIHsKIAkJaWYgKHBoeUNudDEgPCBvZmRtX2Jhc2UpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCWF0aF9kYmcoY29tbW9uLCBBTkksCiAJCQkJInBoeUNudDEgMHgleCwgcmVzZXR0aW5nIGNvdW50ZXIgdmFsdWUgdG8gMHgleFxuIiwKIAkJCQlwaHlDbnQxLCBvZmRtX2Jhc2UpOwogCQkJUkVHX1dSSVRFKGFoLCBBUl9QSFlfRVJSXzEsIG9mZG1fYmFzZSk7CkBAIC02NzAsNyArNjY3LDcgQEAKIAkJCQkgIEFSX1BIWV9FUlJfT0ZETV9USU1JTkcpOwogCQl9CiAJCWlmIChwaHlDbnQyIDwgY2NrX2Jhc2UpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCWF0aF9kYmcoY29tbW9uLCBBTkksCiAJCQkJInBoeUNudDIgMHgleCwgcmVzZXR0aW5nIGNvdW50ZXIgdmFsdWUgdG8gMHgleFxuIiwKIAkJCQlwaHlDbnQyLCBjY2tfYmFzZSk7CiAJCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9FUlJfMiwgY2NrX2Jhc2UpOwpAQCAtNzEzLDcgKzcxMCw3IEBACiAJY2NrUGh5RXJyUmF0ZSA9ICBhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQgKiAxMDAwIC8KIAkJCSBhbmlTdGF0ZS0+bGlzdGVuVGltZTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwlhdGhfZGJnKGNvbW1vbiwgQU5JLAogCQkibGlzdGVuVGltZT0lZCBPRkRNOiVkIGVycnM9JWQvcyBDQ0s6JWQgZXJycz0lZC9zIG9mZG1fdHVybj0lZFxuIiwKIAkJYW5pU3RhdGUtPmxpc3RlblRpbWUsCiAJCWFuaVN0YXRlLT5vZmRtTm9pc2VJbW11bml0eUxldmVsLApAQCAtNzQ4LDcgKzc0NSw3IEBACiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksICJFbmFibGUgTUlCIGNvdW50ZXJzXG4iKTsKKwlhdGhfZGJnKGNvbW1vbiwgQU5JLCAiRW5hYmxlIE1JQiBjb3VudGVyc1xuIik7CiAKIAlhdGg5a19od191cGRhdGVfbWlic3RhdHMoYWgsICZhaC0+YWhfbWliU3RhdHMpOwogCkBAIC03NzAsNyArNzY3LDcgQEAKIHsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwgIkRpc2FibGUgTUlCIGNvdW50ZXJzXG4iKTsKKwlhdGhfZGJnKGNvbW1vbiwgQU5JLCAiRGlzYWJsZSBNSUIgY291bnRlcnNcbiIpOwogCiAJUkVHX1dSSVRFKGFoLCBBUl9NSUJDLCBBUl9NSUJDX0ZNQyk7CiAJYXRoOWtfaHdfdXBkYXRlX21pYnN0YXRzKGFoLCAmYWgtPmFoX21pYlN0YXRzKTsKQEAgLTg0NSw3ICs4NDIsNyBAQAogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCWludCBpOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLCAiSW5pdGlhbGl6ZSBBTklcbiIpOworCWF0aF9kYmcoY29tbW9uLCBBTkksICJJbml0aWFsaXplIEFOSVxuIik7CiAKIAlpZiAodXNlX25ld19hbmkoYWgpKSB7CiAJCWFoLT5jb25maWcub2ZkbV90cmlnX2hpZ2ggPSBBVEg5S19BTklfT0ZETV9UUklHX0hJR0hfTkVXOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjUwMDhfcGh5LmMKaW5kZXggZjE5OWU5ZS4uZjkwMWExNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyNTAwOF9waHkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI1MDA4X3BoeS5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIAkvKiBwcmUtcmV2ZXJzZSB0aGlzIGZpZWxkICovCiAJdG1wX3JlZyA9IGF0aDlrX2h3X3JldmVyc2VfYml0cyhuZXdfYmlhcywgMyk7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJGb3JjZSByZl9wd2RfaWNzeW5kaXYgdG8gJTFkIG9uICU0ZFxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiRm9yY2UgcmZfcHdkX2ljc3luZGl2IHRvICUxZCBvbiAlNGRcbiIsCiAJCW5ld19iaWFzLCBzeW50aF9mcmVxKTsKIAogCS8qIHN3aXp6bGUgcmZfcHdkX2ljc3luZGl2ICovCkBAIC0xMDUzLDggKzEwNTMsNyBAQAogCQl1MzIgbGV2ZWwgPSBwYXJhbTsKIAogCQlpZiAobGV2ZWwgPj0gQVJSQVlfU0laRShhaC0+dG90YWxTaXplRGVzaXJlZCkpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKLQkJCQkibGV2ZWwgb3V0IG9mIHJhbmdlICgldSA+ICV6dSlcbiIsCisJCQlhdGhfZGJnKGNvbW1vbiwgQU5JLCAibGV2ZWwgb3V0IG9mIHJhbmdlICgldSA+ICV6dSlcbiIsCiAJCQkJbGV2ZWwsIEFSUkFZX1NJWkUoYWgtPnRvdGFsU2l6ZURlc2lyZWQpKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtMTE1Nyw4ICsxMTU2LDcgQEAKIAkJdTMyIGxldmVsID0gcGFyYW07CiAKIAkJaWYgKGxldmVsID49IEFSUkFZX1NJWkUoZmlyc3RlcCkpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKLQkJCQkibGV2ZWwgb3V0IG9mIHJhbmdlICgldSA+ICV6dSlcbiIsCisJCQlhdGhfZGJnKGNvbW1vbiwgQU5JLCAibGV2ZWwgb3V0IG9mIHJhbmdlICgldSA+ICV6dSlcbiIsCiAJCQkJbGV2ZWwsIEFSUkFZX1NJWkUoZmlyc3RlcCkpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CkBAIC0xMTc3LDggKzExNzUsNyBAQAogCQl1MzIgbGV2ZWwgPSBwYXJhbTsKIAogCQlpZiAobGV2ZWwgPj0gQVJSQVlfU0laRShjeWNwd3JUaHIxKSkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAotCQkJCSJsZXZlbCBvdXQgb2YgcmFuZ2UgKCV1ID4gJXp1KVxuIiwKKwkJCWF0aF9kYmcoY29tbW9uLCBBTkksICJsZXZlbCBvdXQgb2YgcmFuZ2UgKCV1ID4gJXp1KVxuIiwKIAkJCQlsZXZlbCwgQVJSQVlfU0laRShjeWNwd3JUaHIxKSk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KQEAgLTExOTUsMjMgKzExOTIsMjIgQEAKIAljYXNlIEFUSDlLX0FOSV9QUkVTRU5UOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksICJpbnZhbGlkIGNtZCAldVxuIiwgY21kKTsKKwkJYXRoX2RiZyhjb21tb24sIEFOSSwgImludmFsaWQgY21kICV1XG4iLCBjbWQpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLCAiQU5JIHBhcmFtZXRlcnM6XG4iKTsKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksCisJYXRoX2RiZyhjb21tb24sIEFOSSwgIkFOSSBwYXJhbWV0ZXJzOlxuIik7CisJYXRoX2RiZyhjb21tb24sIEFOSSwKIAkJIm5vaXNlSW1tdW5pdHlMZXZlbD0lZCwgc3B1ckltbXVuaXR5TGV2ZWw9JWQsIG9mZG1XZWFrU2lnRGV0ZWN0T2ZmPSVkXG4iLAogCQlhbmlTdGF0ZS0+bm9pc2VJbW11bml0eUxldmVsLAogCQlhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwsCiAJCSFhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpOwotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwlhdGhfZGJnKGNvbW1vbiwgQU5JLAogCQkiY2NrV2Vha1NpZ1RocmVzaG9sZD0lZCwgZmlyc3RlcExldmVsPSVkLCBsaXN0ZW5UaW1lPSVkXG4iLAogCQlhbmlTdGF0ZS0+Y2NrV2Vha1NpZ1RocmVzaG9sZCwKIAkJYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCwKIAkJYW5pU3RhdGUtPmxpc3RlblRpbWUpOwotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKLQkJIm9mZG1QaHlFcnJDb3VudD0lZCwgY2NrUGh5RXJyQ291bnQ9JWRcblxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgQU5JLCAib2ZkbVBoeUVyckNvdW50PSVkLCBjY2tQaHlFcnJDb3VudD0lZFxuXG4iLAogCQlhbmlTdGF0ZS0+b2ZkbVBoeUVyckNvdW50LAogCQlhbmlTdGF0ZS0+Y2NrUGh5RXJyQ291bnQpOwogCkBAIC0xMjk1LDcgKzEyOTEsNyBAQAogCQkJCSAgICBBUl9QSFlfU0ZDT1JSX0xPV19VU0VfU0VMRl9DT1JSX0xPVyk7CiAKIAkJaWYgKCFvbiAhPSBhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCWF0aF9kYmcoY29tbW9uLCBBTkksCiAJCQkJIioqIGNoICVkOiBvZmRtIHdlYWsgc2lnbmFsOiAlcz0+JXNcbiIsCiAJCQkJY2hhbi0+Y2hhbm5lbCwKIAkJCQkhYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmID8KQEAgLTEzMTMsNyArMTMwOSw3IEBACiAJCXUzMiBsZXZlbCA9IHBhcmFtOwogCiAJCWlmIChsZXZlbCA+PSBBUlJBWV9TSVpFKGZpcnN0ZXBfdGFibGUpKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQlhdGhfZGJnKGNvbW1vbiwgQU5JLAogCQkJCSJBVEg5S19BTklfRklSU1RFUF9MRVZFTDogbGV2ZWwgb3V0IG9mIHJhbmdlICgldSA+ICV6dSlcbiIsCiAJCQkJbGV2ZWwsIEFSUkFZX1NJWkUoZmlyc3RlcF90YWJsZSkpOwogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTM1MCw3ICsxMzQ2LDcgQEAKIAkJCSAgICAgIEFSX1BIWV9GSU5EX1NJR19GSVJTVEVQX0xPVywgdmFsdWUyKTsKIAogCQlpZiAobGV2ZWwgIT0gYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAorCQkJYXRoX2RiZyhjb21tb24sIEFOSSwKIAkJCQkiKiogY2ggJWQ6IGxldmVsICVkPT4lZFtkZWY6JWRdIGZpcnN0ZXBbbGV2ZWxdPSVkIGluaT0lZFxuIiwKIAkJCQljaGFuLT5jaGFubmVsLAogCQkJCWFuaVN0YXRlLT5maXJzdGVwTGV2ZWwsCkBAIC0xMzU4LDcgKzEzNTQsNyBAQAogCQkJCUFUSDlLX0FOSV9GSVJTVEVQX0xWTF9ORVcsCiAJCQkJdmFsdWUsCiAJCQkJYW5pU3RhdGUtPmluaURlZi5maXJzdGVwKTsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCWF0aF9kYmcoY29tbW9uLCBBTkksCiAJCQkJIioqIGNoICVkOiBsZXZlbCAlZD0+JWRbZGVmOiVkXSBmaXJzdGVwX2xvd1tsZXZlbF09JWQgaW5pPSVkXG4iLAogCQkJCWNoYW4tPmNoYW5uZWwsCiAJCQkJYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCwKQEAgLTEzNzgsNyArMTM3NCw3IEBACiAJCXUzMiBsZXZlbCA9IHBhcmFtOwogCiAJCWlmIChsZXZlbCA+PSBBUlJBWV9TSVpFKGN5Y3B3clRocjFfdGFibGUpKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQlhdGhfZGJnKGNvbW1vbiwgQU5JLAogCQkJCSJBVEg5S19BTklfU1BVUl9JTU1VTklUWV9MRVZFTDogbGV2ZWwgb3V0IG9mIHJhbmdlICgldSA+ICV6dSlcbiIsCiAJCQkJbGV2ZWwsIEFSUkFZX1NJWkUoY3ljcHdyVGhyMV90YWJsZSkpOwogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTQxNCw3ICsxNDEwLDcgQEAKIAkJCSAgICAgIEFSX1BIWV9FWFRfVElNSU5HNV9DWUNQV1JfVEhSMSwgdmFsdWUyKTsKIAogCQlpZiAobGV2ZWwgIT0gYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQlhdGhfZGJnKGNvbW1vbiwgQU5JLAogCQkJCSIqKiBjaCAlZDogbGV2ZWwgJWQ9PiVkW2RlZjolZF0gY3ljcHdyVGhyMVtsZXZlbF09JWQgaW5pPSVkXG4iLAogCQkJCWNoYW4tPmNoYW5uZWwsCiAJCQkJYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsLApAQCAtMTQyMiw3ICsxNDE4LDcgQEAKIAkJCQlBVEg5S19BTklfU1BVUl9JTU1VTkVfTFZMX05FVywKIAkJCQl2YWx1ZSwKIAkJCQlhbmlTdGF0ZS0+aW5pRGVmLmN5Y3B3clRocjEpOwotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAorCQkJYXRoX2RiZyhjb21tb24sIEFOSSwKIAkJCQkiKiogY2ggJWQ6IGxldmVsICVkPT4lZFtkZWY6JWRdIGN5Y3B3clRocjFFeHRbbGV2ZWxdPSVkIGluaT0lZFxuIiwKIAkJCQljaGFuLT5jaGFubmVsLAogCQkJCWFuaVN0YXRlLT5zcHVySW1tdW5pdHlMZXZlbCwKQEAgLTE0NDgsMTEgKzE0NDQsMTEgQEAKIAljYXNlIEFUSDlLX0FOSV9QUkVTRU5UOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksICJpbnZhbGlkIGNtZCAldVxuIiwgY21kKTsKKwkJYXRoX2RiZyhjb21tb24sIEFOSSwgImludmFsaWQgY21kICV1XG4iLCBjbWQpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAorCWF0aF9kYmcoY29tbW9uLCBBTkksCiAJCSJBTkkgcGFyYW1ldGVyczogU0k9JWQsIG9mZG1XUz0lcyBGUz0lZCBNUkNjY2s9JXMgbGlzdGVuVGltZT0lZCBvZmRtRXJycz0lZCBjY2tFcnJzPSVkXG4iLAogCQlhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwsCiAJCSFhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYgPyAib24iIDogIm9mZiIsCkBAIC0xNTA2LDcgKzE1MDIsNyBAQAogCiAJaW5pRGVmID0gJmFuaVN0YXRlLT5pbmlEZWY7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksICJ2ZXIgJWQuJWQgb3Btb2RlICV1IGNoYW4gJWQgTWh6LzB4JXhcbiIsCisJYXRoX2RiZyhjb21tb24sIEFOSSwgInZlciAlZC4lZCBvcG1vZGUgJXUgY2hhbiAlZCBNaHovMHgleFxuIiwKIAkJYWgtPmh3X3ZlcnNpb24ubWFjVmVyc2lvbiwKIAkJYWgtPmh3X3ZlcnNpb24ubWFjUmV2LAogCQlhaC0+b3Btb2RlLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9jYWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9jYWxpYi5jCmluZGV4IDg4Mjc5ZTMuLmM1NWU1YmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX2NhbGliLmMKQEAgLTYxLDE4ICs2MSwxNiBAQAogCXN3aXRjaCAoY3VyckNhbC0+Y2FsRGF0YS0+Y2FsVHlwZSkgewogCWNhc2UgSVFfTUlTTUFUQ0hfQ0FMOgogCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9DQUxNT0RFLCBBUl9QSFlfQ0FMTU9ERV9JUSk7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCSJzdGFydGluZyBJUSBNaXNtYXRjaCBDYWxpYnJhdGlvblxuIik7CiAJCWJyZWFrOwogCWNhc2UgQURDX0dBSU5fQ0FMOgogCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9DQUxNT0RFLCBBUl9QSFlfQ0FMTU9ERV9BRENfR0FJTik7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCSJzdGFydGluZyBBREMgR2FpbiBDYWxpYnJhdGlvblxuIik7CisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJzdGFydGluZyBBREMgR2FpbiBDYWxpYnJhdGlvblxuIik7CiAJCWJyZWFrOwogCWNhc2UgQURDX0RDX0NBTDoKIAkJUkVHX1dSSVRFKGFoLCBBUl9QSFlfQ0FMTU9ERSwgQVJfUEhZX0NBTE1PREVfQURDX0RDX1BFUik7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCSJzdGFydGluZyBBREMgREMgQ2FsaWJyYXRpb25cbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLCAic3RhcnRpbmcgQURDIERDIENhbGlicmF0aW9uXG4iKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0xMjksNyArMTI3LDcgQEAKIAkJCVJFR19SRUFEKGFoLCBBUl9QSFlfQ0FMX01FQVNfMShpKSk7CiAJCWFoLT50b3RhbElxQ29yck1lYXNbaV0gKz0KIAkJCShpbnQzMl90KSBSRUdfUkVBRChhaCwgQVJfUEhZX0NBTF9NRUFTXzIoaSkpOwotCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIENBTElCUkFURSwKIAkJCSIlZDogQ2huICVkIHBtaT0weCUwOHg7cG1xPTB4JTA4eDtpcWNtPTB4JTA4eDtcbiIsCiAJCQlhaC0+Y2FsX3NhbXBsZXMsIGksIGFoLT50b3RhbFBvd2VyTWVhc0lbaV0sCiAJCQlhaC0+dG90YWxQb3dlck1lYXNRW2ldLApAQCAtMTUxLDcgKzE0OSw3IEBACiAJCWFoLT50b3RhbEFkY1FFdmVuUGhhc2VbaV0gKz0KIAkJCVJFR19SRUFEKGFoLCBBUl9QSFlfQ0FMX01FQVNfMyhpKSk7CiAKLQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBBVEhfREJHX0NBTElCUkFURSwKKwkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBDQUxJQlJBVEUsCiAJCQkiJWQ6IENobiAlZCBvZGRpPTB4JTA4eDsgZXZlbmk9MHglMDh4OyBvZGRxPTB4JTA4eDsgZXZlbnE9MHglMDh4O1xuIiwKIAkJCWFoLT5jYWxfc2FtcGxlcywgaSwKIAkJCWFoLT50b3RhbEFkY0lPZGRQaGFzZVtpXSwKQEAgLTE3NSw3ICsxNzMsNyBAQAogCQlhaC0+dG90YWxBZGNEY09mZnNldFFFdmVuUGhhc2VbaV0gKz0KIAkJCShpbnQzMl90KSBSRUdfUkVBRChhaCwgQVJfUEhZX0NBTF9NRUFTXzMoaSkpOwogCi0JCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19DQUxJQlJBVEUsCisJCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQ0FMSUJSQVRFLAogCQkJIiVkOiBDaG4gJWQgb2RkaT0weCUwOHg7IGV2ZW5pPTB4JTA4eDsgb2RkcT0weCUwOHg7IGV2ZW5xPTB4JTA4eDtcbiIsCiAJCQlhaC0+Y2FsX3NhbXBsZXMsIGksCiAJCQlhaC0+dG90YWxBZGNEY09mZnNldElPZGRQaGFzZVtpXSwKQEAgLTE5OCwxMiArMTk2LDEyIEBACiAJCXBvd2VyTWVhc1EgPSBhaC0+dG90YWxQb3dlck1lYXNRW2ldOwogCQlpcUNvcnJNZWFzID0gYWgtPnRvdGFsSXFDb3JyTWVhc1tpXTsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCiAJCQkiU3RhcnRpbmcgSVEgQ2FsIGFuZCBDb3JyZWN0aW9uIGZvciBDaGFpbiAlZFxuIiwKIAkJCWkpOwogCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCSJPcmlnbmFsOiBDaG4gJWRpcV9jb3JyX21lYXMgPSAweCUwOHhcbiIsCisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCisJCQkiT3JpZ2luYWw6IENobiAlZCBpcV9jb3JyX21lYXMgPSAweCUwOHhcbiIsCiAJCQlpLCBhaC0+dG90YWxJcUNvcnJNZWFzW2ldKTsKIAogCQlpcUNvcnJOZWcgPSAwOwpAQCAtMjEzLDEyICsyMTEsMTEgQEAKIAkJCWlxQ29yck5lZyA9IDE7CiAJCX0KIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkiQ2huICVkIHB3cl9tZWFzX2kgPSAweCUwOHhcbiIsIGksIHBvd2VyTWVhc0kpOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkiQ2huICVkIHB3cl9tZWFzX3EgPSAweCUwOHhcbiIsIGksIHBvd2VyTWVhc1EpOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsICJpcUNvcnJOZWcgaXMgMHglMDh4XG4iLAotCQkJaXFDb3JyTmVnKTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgIkNobiAlZCBwd3JfbWVhc19pID0gMHglMDh4XG4iLAorCQkJaSwgcG93ZXJNZWFzSSk7CisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJDaG4gJWQgcHdyX21lYXNfcSA9IDB4JTA4eFxuIiwKKwkJCWksIHBvd2VyTWVhc1EpOworCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLCAiaXFDb3JyTmVnIGlzIDB4JTA4eFxuIiwgaXFDb3JyTmVnKTsKIAogCQlpQ29mZkRlbm9tID0gKHBvd2VyTWVhc0kgLyAyICsgcG93ZXJNZWFzUSAvIDIpIC8gMTI4OwogCQlxQ29mZkRlbm9tID0gcG93ZXJNZWFzUSAvIDY0OwpAQCAtMjI3LDEzICsyMjQsMTMgQEAKIAkJICAgIChxQ29mZkRlbm9tICE9IDApKSB7CiAJCQlpQ29mZiA9IGlxQ29yck1lYXMgLyBpQ29mZkRlbm9tOwogCQkJcUNvZmYgPSBwb3dlck1lYXNJIC8gcUNvZmZEZW5vbSAtIDY0OwotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJCSJDaG4gJWQgaUNvZmYgPSAweCUwOHhcbiIsIGksIGlDb2ZmKTsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCQkiQ2huICVkIHFDb2ZmID0gMHglMDh4XG4iLCBpLCBxQ29mZik7CisJCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLCAiQ2huICVkIGlDb2ZmID0gMHglMDh4XG4iLAorCQkJCWksIGlDb2ZmKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJDaG4gJWQgcUNvZmYgPSAweCUwOHhcbiIsCisJCQkJaSwgcUNvZmYpOwogCiAJCQlpQ29mZiA9IGlDb2ZmICYgMHgzZjsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCiAJCQkJIk5ldzogQ2huICVkIGlDb2ZmID0gMHglMDh4XG4iLCBpLCBpQ29mZik7CiAJCQlpZiAoaXFDb3JyTmVnID09IDB4MCkKIAkJCQlpQ29mZiA9IDB4NDAgLSBpQ29mZjsKQEAgLTI0Myw3ICsyNDAsNyBAQAogCQkJZWxzZSBpZiAocUNvZmYgPD0gLTE2KQogCQkJCXFDb2ZmID0gLTE2OwogCi0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJCSJDaG4gJWQgOiBpQ29mZiA9IDB4JXggIHFDb2ZmID0gMHgleFxuIiwKIAkJCQlpLCBpQ29mZiwgcUNvZmYpOwogCkBAIC0yNTMsNyArMjUwLDcgQEAKIAkJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9USU1JTkdfQ1RSTDQoaSksCiAJCQkJICAgICAgQVJfUEhZX1RJTUlOR19DVFJMNF9JUUNPUlJfUV9RX0NPRkYsCiAJCQkJICAgICAgcUNvZmYpOwotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCQkiSVEgQ2FsIGFuZCBDb3JyZWN0aW9uIGRvbmUgZm9yIENoYWluICVkXG4iLAogCQkJCWkpOwogCQl9CkBAIC0yNzUsMjEgKzI3MiwxNyBAQAogCQlxT2RkTWVhc09mZnNldCA9IGFoLT50b3RhbEFkY1FPZGRQaGFzZVtpXTsKIAkJcUV2ZW5NZWFzT2Zmc2V0ID0gYWgtPnRvdGFsQWRjUUV2ZW5QaGFzZVtpXTsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCiAJCQkiU3RhcnRpbmcgQURDIEdhaW4gQ2FsIGZvciBDaGFpbiAlZFxuIiwgaSk7CiAKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIkNobiAlZCBwd3JfbWVhc19vZGRfaSA9IDB4JTA4eFxuIiwgaSwKLQkJCWlPZGRNZWFzT2Zmc2V0KTsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIkNobiAlZCBwd3JfbWVhc19ldmVuX2kgPSAweCUwOHhcbiIsIGksCi0JCQlpRXZlbk1lYXNPZmZzZXQpOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkiQ2huICVkIHB3cl9tZWFzX29kZF9xID0gMHglMDh4XG4iLCBpLAotCQkJcU9kZE1lYXNPZmZzZXQpOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkiQ2huICVkIHB3cl9tZWFzX2V2ZW5fcSA9IDB4JTA4eFxuIiwgaSwKLQkJCXFFdmVuTWVhc09mZnNldCk7CisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJDaG4gJWQgcHdyX21lYXNfb2RkX2kgPSAweCUwOHhcbiIsCisJCQlpLCBpT2RkTWVhc09mZnNldCk7CisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJDaG4gJWQgcHdyX21lYXNfZXZlbl9pID0gMHglMDh4XG4iLAorCQkJaSwgaUV2ZW5NZWFzT2Zmc2V0KTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgIkNobiAlZCBwd3JfbWVhc19vZGRfcSA9IDB4JTA4eFxuIiwKKwkJCWksIHFPZGRNZWFzT2Zmc2V0KTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgIkNobiAlZCBwd3JfbWVhc19ldmVuX3EgPSAweCUwOHhcbiIsCisJCQlpLCBxRXZlbk1lYXNPZmZzZXQpOwogCiAJCWlmIChpT2RkTWVhc09mZnNldCAhPSAwICYmIHFFdmVuTWVhc09mZnNldCAhPSAwKSB7CiAJCQlpR2Fpbk1pc21hdGNoID0KQEAgLTI5OSwxOSArMjkyLDE5IEBACiAJCQkJKChxT2RkTWVhc09mZnNldCAqIDMyKSAvCiAJCQkJIHFFdmVuTWVhc09mZnNldCkgJiAweDNmOwogCi0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkJIkNobiAlZCBnYWluX21pc21hdGNoX2kgPSAweCUwOHhcbiIsIGksCi0JCQkJaUdhaW5NaXNtYXRjaCk7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkJIkNobiAlZCBnYWluX21pc21hdGNoX3EgPSAweCUwOHhcbiIsIGksCi0JCQkJcUdhaW5NaXNtYXRjaCk7CisJCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAorCQkJCSJDaG4gJWQgZ2Fpbl9taXNtYXRjaF9pID0gMHglMDh4XG4iLAorCQkJCWksIGlHYWluTWlzbWF0Y2gpOworCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKKwkJCQkiQ2huICVkIGdhaW5fbWlzbWF0Y2hfcSA9IDB4JTA4eFxuIiwKKwkJCQlpLCBxR2Fpbk1pc21hdGNoKTsKIAogCQkJdmFsID0gUkVHX1JFQUQoYWgsIEFSX1BIWV9ORVdfQURDX0RDX0dBSU5fQ09SUihpKSk7CiAJCQl2YWwgJj0gMHhmZmZmZjAwMDsKIAkJCXZhbCB8PSAocUdhaW5NaXNtYXRjaCkgfCAoaUdhaW5NaXNtYXRjaCA8PCA2KTsKIAkJCVJFR19XUklURShhaCwgQVJfUEhZX05FV19BRENfRENfR0FJTl9DT1JSKGkpLCB2YWwpOwogCi0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJCSJBREMgR2FpbiBDYWwgZG9uZSBmb3IgQ2hhaW4gJWRcbiIsIGkpOwogCQl9CiAJfQpAQCAtMzM3LDQwICszMzAsMzYgQEAKIAkJcU9kZE1lYXNPZmZzZXQgPSBhaC0+dG90YWxBZGNEY09mZnNldFFPZGRQaGFzZVtpXTsKIAkJcUV2ZW5NZWFzT2Zmc2V0ID0gYWgtPnRvdGFsQWRjRGNPZmZzZXRRRXZlblBoYXNlW2ldOwogCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCSJTdGFydGluZyBBREMgREMgT2Zmc2V0IENhbCBmb3IgQ2hhaW4gJWRcbiIsIGkpOwogCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCSJDaG4gJWQgcHdyX21lYXNfb2RkX2kgPSAlZFxuIiwgaSwKLQkJCWlPZGRNZWFzT2Zmc2V0KTsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIkNobiAlZCBwd3JfbWVhc19ldmVuX2kgPSAlZFxuIiwgaSwKLQkJCWlFdmVuTWVhc09mZnNldCk7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCSJDaG4gJWQgcHdyX21lYXNfb2RkX3EgPSAlZFxuIiwgaSwKLQkJCXFPZGRNZWFzT2Zmc2V0KTsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIkNobiAlZCBwd3JfbWVhc19ldmVuX3EgPSAlZFxuIiwgaSwKLQkJCXFFdmVuTWVhc09mZnNldCk7CisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJDaG4gJWQgcHdyX21lYXNfb2RkX2kgPSAlZFxuIiwKKwkJCWksIGlPZGRNZWFzT2Zmc2V0KTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgIkNobiAlZCBwd3JfbWVhc19ldmVuX2kgPSAlZFxuIiwKKwkJCWksIGlFdmVuTWVhc09mZnNldCk7CisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJDaG4gJWQgcHdyX21lYXNfb2RkX3EgPSAlZFxuIiwKKwkJCWksIHFPZGRNZWFzT2Zmc2V0KTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgIkNobiAlZCBwd3JfbWVhc19ldmVuX3EgPSAlZFxuIiwKKwkJCWksIHFFdmVuTWVhc09mZnNldCk7CiAKIAkJaURjTWlzbWF0Y2ggPSAoKChpRXZlbk1lYXNPZmZzZXQgLSBpT2RkTWVhc09mZnNldCkgKiAyKSAvCiAJCQkgICAgICAgbnVtU2FtcGxlcykgJiAweDFmZjsKIAkJcURjTWlzbWF0Y2ggPSAoKChxT2RkTWVhc09mZnNldCAtIHFFdmVuTWVhc09mZnNldCkgKiAyKSAvCiAJCQkgICAgICAgbnVtU2FtcGxlcykgJiAweDFmZjsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkiQ2huICVkIGRjX29mZnNldF9taXNtYXRjaF9pID0gMHglMDh4XG4iLCBpLAotCQkJaURjTWlzbWF0Y2gpOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkiQ2huICVkIGRjX29mZnNldF9taXNtYXRjaF9xID0gMHglMDh4XG4iLCBpLAotCQkJcURjTWlzbWF0Y2gpOworCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAorCQkJIkNobiAlZCBkY19vZmZzZXRfbWlzbWF0Y2hfaSA9IDB4JTA4eFxuIiwKKwkJCWksIGlEY01pc21hdGNoKTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKKwkJCSJDaG4gJWQgZGNfb2Zmc2V0X21pc21hdGNoX3EgPSAweCUwOHhcbiIsCisJCQlpLCBxRGNNaXNtYXRjaCk7CiAKIAkJdmFsID0gUkVHX1JFQUQoYWgsIEFSX1BIWV9ORVdfQURDX0RDX0dBSU5fQ09SUihpKSk7CiAJCXZhbCAmPSAweGMwMDAwZmZmOwogCQl2YWwgfD0gKHFEY01pc21hdGNoIDw8IDEyKSB8IChpRGNNaXNtYXRjaCA8PCAyMSk7CiAJCVJFR19XUklURShhaCwgQVJfUEhZX05FV19BRENfRENfR0FJTl9DT1JSKGkpLCB2YWwpOwogCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCSJBREMgREMgT2Zmc2V0IENhbCBkb25lIGZvciBDaGFpbiAlZFxuIiwgaSk7CiAJfQogCkBAIC01NjAsNyArNTQ5LDcgQEAKIAkJeyAweDc4MzgsIDAgfSwKIAl9OwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLCAiUnVubmluZyBQQSBDYWxpYnJhdGlvblxuIik7CisJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgIlJ1bm5pbmcgUEEgQ2FsaWJyYXRpb25cbiIpOwogCiAJLyogUEEgQ0FMIGlzIG5vdCBuZWVkZWQgZm9yIGhpZ2ggcG93ZXIgc29sdXRpb24gKi8KIAlpZiAoYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9UWEdBSU5fVFlQRSkgPT0KQEAgLTc0MSw3ICs3MzAsNyBAQAogCQlSRUdfU0VUX0JJVChhaCwgQVJfUEhZX0FHQ19DT05UUk9MLCBBUl9QSFlfQUdDX0NPTlRST0xfQ0FMKTsKIAkJaWYgKCFhdGg5a19od193YWl0KGFoLCBBUl9QSFlfQUdDX0NPTlRST0wsCiAJCQkJICBBUl9QSFlfQUdDX0NPTlRST0xfQ0FMLCAwLCBBSF9XQUlUX1RJTUVPVVQpKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJCSJvZmZzZXQgY2FsaWJyYXRpb24gZmFpbGVkIHRvIGNvbXBsZXRlIGluIDFtczsgbm9pc3kgZW52aXJvbm1lbnQ/XG4iKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtNzU1LDcgKzc0NCw3IEBACiAJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9BR0NfQ09OVFJPTCwgQVJfUEhZX0FHQ19DT05UUk9MX0NBTCk7CiAJaWYgKCFhdGg5a19od193YWl0KGFoLCBBUl9QSFlfQUdDX0NPTlRST0wsIEFSX1BIWV9BR0NfQ09OVFJPTF9DQUwsCiAJCQkgIDAsIEFIX1dBSVRfVElNRU9VVCkpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJIm9mZnNldCBjYWxpYnJhdGlvbiBmYWlsZWQgdG8gY29tcGxldGUgaW4gMW1zOyBub2lzeSBlbnZpcm9ubWVudD9cbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtODUxLDcgKzg0MCw3IEBACiAJCWlmICghYXRoOWtfaHdfd2FpdChhaCwgQVJfUEhZX0FHQ19DT05UUk9MLAogCQkJCSAgIEFSX1BIWV9BR0NfQ09OVFJPTF9DQUwsCiAJCQkJICAgMCwgQUhfV0FJVF9USU1FT1VUKSkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCQkib2Zmc2V0IGNhbGlicmF0aW9uIGZhaWxlZCB0byBjb21wbGV0ZSBpbiAxbXM7IG5vaXN5IGVudmlyb25tZW50P1xuIik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KQEAgLTg4NiwyMiArODc1LDIxIEBACiAJCWlmIChhcjkwMDJfaHdfaXNfY2FsX3N1cHBvcnRlZChhaCwgY2hhbiwgQURDX0dBSU5fQ0FMKSkgewogCQkJSU5JVF9DQUwoJmFoLT5hZGNnYWluX2NhbGRhdGEpOwogCQkJSU5TRVJUX0NBTChhaCwgJmFoLT5hZGNnYWluX2NhbGRhdGEpOwotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJCQkiZW5hYmxpbmcgQURDIEdhaW4gQ2FsaWJyYXRpb24uXG4iKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCisJCQkJCSJlbmFibGluZyBBREMgR2FpbiBDYWxpYnJhdGlvblxuIik7CiAJCX0KIAogCQlpZiAoYXI5MDAyX2h3X2lzX2NhbF9zdXBwb3J0ZWQoYWgsIGNoYW4sIEFEQ19EQ19DQUwpKSB7CiAJCQlJTklUX0NBTCgmYWgtPmFkY2RjX2NhbGRhdGEpOwogCQkJSU5TRVJUX0NBTChhaCwgJmFoLT5hZGNkY19jYWxkYXRhKTsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCQkJImVuYWJsaW5nIEFEQyBEQyBDYWxpYnJhdGlvbi5cbiIpOworCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKKwkJCQkJImVuYWJsaW5nIEFEQyBEQyBDYWxpYnJhdGlvblxuIik7CiAJCX0KIAogCQlpZiAoYXI5MDAyX2h3X2lzX2NhbF9zdXBwb3J0ZWQoYWgsIGNoYW4sIElRX01JU01BVENIX0NBTCkpIHsKIAkJCUlOSVRfQ0FMKCZhaC0+aXFfY2FsZGF0YSk7CiAJCQlJTlNFUlRfQ0FMKGFoLCAmYWgtPmlxX2NhbGRhdGEpOwotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJCQkiZW5hYmxpbmcgSVEgQ2FsaWJyYXRpb24uXG4iKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJlbmFibGluZyBJUSBDYWxpYnJhdGlvblxuIik7CiAJCX0KIAogCQlhaC0+Y2FsX2xpc3RfY3VyciA9IGFoLT5jYWxfbGlzdDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAyX21hYy5jCmluZGV4IGI1OTIwMTYuLjdiNjQxN2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDJfbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwMl9tYWMuYwpAQCAtMTA3LDcgKzEwNyw3IEBACiAJCX0KIAogCQlpZiAoaXNyICYgQVJfSVNSX1JYT1JOKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19JTlRFUlJVUFQsCisJCQlhdGhfZGJnKGNvbW1vbiwgSU5URVJSVVBULAogCQkJCSJyZWNlaXZlIEZJRk8gb3ZlcnJ1biBpbnRlcnJ1cHRcbiIpOwogCQl9CiAKQEAgLTE0MywyNCArMTQzLDI0IEBACiAKIAkJaWYgKGZhdGFsX2ludCkgewogCQkJaWYgKHN5bmNfY2F1c2UgJiBBUl9JTlRSX1NZTkNfSE9TVDFfRkFUQUwpIHsKLQkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTlksCisJCQkJYXRoX2RiZyhjb21tb24sIEFOWSwKIAkJCQkJInJlY2VpdmVkIFBDSSBGQVRBTCBpbnRlcnJ1cHRcbiIpOwogCQkJfQogCQkJaWYgKHN5bmNfY2F1c2UgJiBBUl9JTlRSX1NZTkNfSE9TVDFfUEVSUikgewotCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOWSwKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQU5ZLAogCQkJCQkicmVjZWl2ZWQgUENJIFBFUlIgaW50ZXJydXB0XG4iKTsKIAkJCX0KIAkJCSptYXNrZWQgfD0gQVRIOUtfSU5UX0ZBVEFMOwogCQl9CiAJCWlmIChzeW5jX2NhdXNlICYgQVJfSU5UUl9TWU5DX1JBRE1fQ1BMX1RJTUVPVVQpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0lOVEVSUlVQVCwKKwkJCWF0aF9kYmcoY29tbW9uLCBJTlRFUlJVUFQsCiAJCQkJIkFSX0lOVFJfU1lOQ19SQURNX0NQTF9USU1FT1VUXG4iKTsKIAkJCVJFR19XUklURShhaCwgQVJfUkMsIEFSX1JDX0hPU1RJRik7CiAJCQlSRUdfV1JJVEUoYWgsIEFSX1JDLCAwKTsKIAkJCSptYXNrZWQgfD0gQVRIOUtfSU5UX0ZBVEFMOwogCQl9CiAJCWlmIChzeW5jX2NhdXNlICYgQVJfSU5UUl9TWU5DX0xPQ0FMX1RJTUVPVVQpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0lOVEVSUlVQVCwKKwkJCWF0aF9kYmcoY29tbW9uLCBJTlRFUlJVUFQsCiAJCQkJIkFSX0lOVFJfU1lOQ19MT0NBTF9USU1FT1VUXG4iKTsKIAkJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2NhbGliLmMKaW5kZXggMTJhNzMwZC4uOGU3MGYwYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19jYWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfY2FsaWIuYwpAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgImh3LW9wcy5oIgogI2luY2x1ZGUgImFyOTAwM19waHkuaCIKICNpbmNsdWRlICJhcjkwMDNfcnR0LmgiCisjaW5jbHVkZSAiYXI5MDAzX21jaS5oIgogCiAjZGVmaW5lIE1BWF9NRUFTVVJFTUVOVAlNQVhfSVFDQUxfTUVBU1VSRU1FTlQKICNkZWZpbmUgTUFYX01BR19ERUxUQQkxMQpAQCAtNTEsNyArNTIsNyBAQAogCQljdXJyQ2FsLT5jYWxEYXRhLT5jYWxDb3VudE1heCk7CiAJCVJFR19XUklURShhaCwgQVJfUEhZX0NBTE1PREUsIEFSX1BIWV9DQUxNT0RFX0lRKTsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCiAJCQkic3RhcnRpbmcgSVEgTWlzbWF0Y2ggQ2FsaWJyYXRpb25cbiIpOwogCiAJCS8qIEtpY2stb2ZmIGNhbCAqLwpAQCAtNjMsNyArNjQsNyBAQAogCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfNjVOTV9DSDBfVEhFUk0sCiAJCQkgICAgICBBUl9QSFlfNjVOTV9DSDBfVEhFUk1fU1RBUlQsIDEpOwogCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCSJzdGFydGluZyBUZW1wZXJhdHVyZSBDb21wZW5zYXRpb24gQ2FsaWJyYXRpb25cbiIpOwogCQlicmVhazsKIAl9CkBAIC0xOTMsNyArMTk0LDcgQEAKIAkJCQlSRUdfUkVBRChhaCwgQVJfUEhZX0NBTF9NRUFTXzEoaSkpOwogCQkJYWgtPnRvdGFsSXFDb3JyTWVhc1tpXSArPQogCQkJCShpbnQzMl90KSBSRUdfUkVBRChhaCwgQVJfUEhZX0NBTF9NRUFTXzIoaSkpOwotCQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBBVEhfREJHX0NBTElCUkFURSwKKwkJCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQ0FMSUJSQVRFLAogCQkJCSIlZDogQ2huICVkIHBtaT0weCUwOHg7cG1xPTB4JTA4eDtpcWNtPTB4JTA4eDtcbiIsCiAJCQkJYWgtPmNhbF9zYW1wbGVzLCBpLCBhaC0+dG90YWxQb3dlck1lYXNJW2ldLAogCQkJCWFoLT50b3RhbFBvd2VyTWVhc1FbaV0sCkBAIC0yMjAsMTIgKzIyMSwxMSBAQAogCQlwb3dlck1lYXNRID0gYWgtPnRvdGFsUG93ZXJNZWFzUVtpXTsKIAkJaXFDb3JyTWVhcyA9IGFoLT50b3RhbElxQ29yck1lYXNbaV07CiAKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIlN0YXJ0aW5nIElRIENhbCBhbmQgQ29ycmVjdGlvbiBmb3IgQ2hhaW4gJWRcbiIsCi0JCQlpKTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKKwkJCSJTdGFydGluZyBJUSBDYWwgYW5kIENvcnJlY3Rpb24gZm9yIENoYWluICVkXG4iLCBpKTsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkiT3JpZ25hbDogQ2huICVkaXFfY29ycl9tZWFzID0gMHglMDh4XG4iLAorCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAorCQkJIk9yaWdpbmFsOiBDaG4gJWQgaXFfY29ycl9tZWFzID0gMHglMDh4XG4iLAogCQkJaSwgYWgtPnRvdGFsSXFDb3JyTWVhc1tpXSk7CiAKIAkJaXFDb3JyTmVnID0gMDsKQEAgLTIzNSwxMiArMjM1LDExIEBACiAJCQlpcUNvcnJOZWcgPSAxOwogCQl9CiAKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIkNobiAlZCBwd3JfbWVhc19pID0gMHglMDh4XG4iLCBpLCBwb3dlck1lYXNJKTsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIkNobiAlZCBwd3JfbWVhc19xID0gMHglMDh4XG4iLCBpLCBwb3dlck1lYXNRKTsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLCAiaXFDb3JyTmVnIGlzIDB4JTA4eFxuIiwKLQkJCWlxQ29yck5lZyk7CisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJDaG4gJWQgcHdyX21lYXNfaSA9IDB4JTA4eFxuIiwKKwkJCWksIHBvd2VyTWVhc0kpOworCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLCAiQ2huICVkIHB3cl9tZWFzX3EgPSAweCUwOHhcbiIsCisJCQlpLCBwb3dlck1lYXNRKTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgImlxQ29yck5lZyBpcyAweCUwOHhcbiIsIGlxQ29yck5lZyk7CiAKIAkJaUNvZmZEZW5vbSA9IChwb3dlck1lYXNJIC8gMiArIHBvd2VyTWVhc1EgLyAyKSAvIDI1NjsKIAkJcUNvZmZEZW5vbSA9IHBvd2VyTWVhc1EgLyA2NDsKQEAgLTI0OCwxMCArMjQ3LDEwIEBACiAJCWlmICgoaUNvZmZEZW5vbSAhPSAwKSAmJiAocUNvZmZEZW5vbSAhPSAwKSkgewogCQkJaUNvZmYgPSBpcUNvcnJNZWFzIC8gaUNvZmZEZW5vbTsKIAkJCXFDb2ZmID0gcG93ZXJNZWFzSSAvIHFDb2ZmRGVub20gLSA2NDsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCQkiQ2huICVkIGlDb2ZmID0gMHglMDh4XG4iLCBpLCBpQ29mZik7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkJIkNobiAlZCBxQ29mZiA9IDB4JTA4eFxuIiwgaSwgcUNvZmYpOworCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgIkNobiAlZCBpQ29mZiA9IDB4JTA4eFxuIiwKKwkJCQlpLCBpQ29mZik7CisJCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLCAiQ2huICVkIHFDb2ZmID0gMHglMDh4XG4iLAorCQkJCWksIHFDb2ZmKTsKIAogCQkJLyogRm9yY2UgYm91bmRzIG9uIGlDb2ZmICovCiAJCQlpZiAoaUNvZmYgPj0gNjMpCkBAIC0yNzIsMTAgKzI3MSwxMCBAQAogCQkJaUNvZmYgPSBpQ29mZiAmIDB4N2Y7CiAJCQlxQ29mZiA9IHFDb2ZmICYgMHg3ZjsKIAotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCQkiQ2huICVkIDogaUNvZmYgPSAweCV4ICBxQ29mZiA9IDB4JXhcbiIsCiAJCQkJaSwgaUNvZmYsIHFDb2ZmKTsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCiAJCQkJIlJlZ2lzdGVyIG9mZnNldCAoMHglMDR4KSBiZWZvcmUgdXBkYXRlID0gMHgleFxuIiwKIAkJCQlvZmZzZXRfYXJyYXlbaV0sCiAJCQkJUkVHX1JFQUQoYWgsIG9mZnNldF9hcnJheVtpXSkpOwpAQCAtMjg2LDI1ICsyODUsMjUgQEAKIAkJCVJFR19STVdfRklFTEQoYWgsIG9mZnNldF9hcnJheVtpXSwKIAkJCQkgICAgICBBUl9QSFlfUlhfSVFDQUxfQ09SUl9JUUNPUlJfUV9RX0NPRkYsCiAJCQkJICAgICAgcUNvZmYpOwotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCQkiUmVnaXN0ZXIgb2Zmc2V0ICgweCUwNHgpIFFJIENPRkYgKGJpdGZpZWxkcyAweCUwOHgpIGFmdGVyIHVwZGF0ZSA9IDB4JXhcbiIsCiAJCQkJb2Zmc2V0X2FycmF5W2ldLAogCQkJCUFSX1BIWV9SWF9JUUNBTF9DT1JSX0lRQ09SUl9RX0lfQ09GRiwKIAkJCQlSRUdfUkVBRChhaCwgb2Zmc2V0X2FycmF5W2ldKSk7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJCSJSZWdpc3RlciBvZmZzZXQgKDB4JTA0eCkgUVEgQ09GRiAoYml0ZmllbGRzIDB4JTA4eCkgYWZ0ZXIgdXBkYXRlID0gMHgleFxuIiwKIAkJCQlvZmZzZXRfYXJyYXlbaV0sCiAJCQkJQVJfUEhZX1JYX0lRQ0FMX0NPUlJfSVFDT1JSX1FfUV9DT0ZGLAogCQkJCVJFR19SRUFEKGFoLCBvZmZzZXRfYXJyYXlbaV0pKTsKIAotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCQkiSVEgQ2FsIGFuZCBDb3JyZWN0aW9uIGRvbmUgZm9yIENoYWluICVkXG4iLCBpKTsKIAkJfQogCX0KIAogCVJFR19TRVRfQklUKGFoLCBBUl9QSFlfUlhfSVFDQUxfQ09SUl9CMCwKIAkJICAgIEFSX1BIWV9SWF9JUUNBTF9DT1JSX0lRQ09SUl9FTkFCTEUpOwotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkiSVEgQ2FsIGFuZCBDb3JyZWN0aW9uIChvZmZzZXQgMHglMDR4KSBlbmFibGVkIChiaXQgcG9zaXRpb24gMHglMDh4KS4gTmV3IFZhbHVlIDB4JTA4eFxuIiwKIAkJKHVuc2lnbmVkKSAoQVJfUEhZX1JYX0lRQ0FMX0NPUlJfQjApLAogCQlBUl9QSFlfUlhfSVFDQUxfQ09SUl9JUUNPUlJfRU5BQkxFLApAQCAtMzQ4LDcgKzM0Nyw3IEBACiAJZjIgPSAoZjEgKiBmMSArIGYzICogZjMpIC8gcmVzdWx0X3NoaWZ0OwogCiAJaWYgKCFmMikgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsICJEaXZpZGUgYnkgMFxuIik7CisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJEaXZpZGUgYnkgMFxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTQ2OSw3ICs0NjgsNyBAQAogCiAJaWYgKChpMl9wX3EyX2EwX2QwID09IDApIHx8IChpMl9wX3EyX2EwX2QxID09IDApIHx8CiAJICAgIChpMl9wX3EyX2ExX2QwID09IDApIHx8IChpMl9wX3EyX2ExX2QxID09IDApKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCSJEaXZpZGUgYnkgMDpcbiIKIAkJCSJhMF9kMD0lZFxuIgogCQkJImEwX2QxPSVkXG4iCkBAIC01MDksOCArNTA4LDcgQEAKIAltYWcyID0gYXI5MDAzX2h3X2ZpbmRfbWFnX2FwcHJveChhaCwgY29zXzJwaGlfMiwgc2luXzJwaGlfMik7CiAKIAlpZiAoKG1hZzEgPT0gMCkgfHwgKG1hZzIgPT0gMCkpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIkRpdmlkZSBieSAwOiBtYWcxPSVkLCBtYWcyPSVkXG4iLAorCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLCAiRGl2aWRlIGJ5IDA6IG1hZzE9JWQsIG1hZzI9JWRcbiIsCiAJCQltYWcxLCBtYWcyKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTUyOCw4ICs1MjYsOCBAQAogCQkJICAgICBtYWdfYTBfZDAsIHBoc19hMF9kMCwKIAkJCSAgICAgbWFnX2ExX2QwLAogCQkJICAgICBwaHNfYTFfZDAsIHNvbHZlZF9lcSkpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIkNhbGwgdG8gYXI5MDAzX2h3X3NvbHZlX2lxX2NhbCgpIGZhaWxlZC5cbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAorCQkJIkNhbGwgdG8gYXI5MDAzX2h3X3NvbHZlX2lxX2NhbCgpIGZhaWxlZFxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTUzOCwxMiArNTM2LDEyIEBACiAJbWFnX3J4ID0gc29sdmVkX2VxWzJdOwogCXBoc19yeCA9IHNvbHZlZF9lcVszXTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkiY2hhaW4gJWQ6IG1hZyBtaXNtYXRjaD0lZCBwaGFzZSBtaXNtYXRjaD0lZFxuIiwKIAkJY2hhaW5faWR4LCBtYWdfdHgvcmVzX3NjYWxlLCBwaHNfdHgvcmVzX3NjYWxlKTsKIAogCWlmIChyZXNfc2NhbGUgPT0gbWFnX3R4KSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCSJEaXZpZGUgYnkgMDogbWFnX3R4PSVkLCByZXNfc2NhbGU9JWRcbiIsCiAJCQltYWdfdHgsIHJlc19zY2FsZSk7CiAJCXJldHVybiBmYWxzZTsKQEAgLTU1Niw4ICs1NTQsNyBAQAogCXFfcV9jb2ZmID0gKG1hZ19jb3JyX3R4ICogMTI4IC8gcmVzX3NjYWxlKTsKIAlxX2lfY29mZiA9IChwaHNfY29ycl90eCAqIDI1NiAvIHJlc19zY2FsZSk7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSJ0eCBjaGFpbiAlZDogbWFnIGNvcnI9JWQgIHBoYXNlIGNvcnI9JWRcbiIsCisJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgInR4IGNoYWluICVkOiBtYWcgY29ycj0lZCAgcGhhc2UgY29ycj0lZFxuIiwKIAkJY2hhaW5faWR4LCBxX3FfY29mZiwgcV9pX2NvZmYpOwogCiAJaWYgKHFfaV9jb2ZmIDwgLTYzKQpAQCAtNTcxLDEyICs1NjgsMTEgQEAKIAogCWlxY19jb2VmZlswXSA9IChxX3FfY29mZiAqIDEyOCkgKyBxX2lfY29mZjsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJInR4IGNoYWluICVkOiBpcSBjb3JyIGNvZWZmPSV4XG4iLAorCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJ0eCBjaGFpbiAlZDogaXEgY29yciBjb2VmZj0leFxuIiwKIAkJY2hhaW5faWR4LCBpcWNfY29lZmZbMF0pOwogCiAJaWYgKC1tYWdfcnggPT0gcmVzX3NjYWxlKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCSJEaXZpZGUgYnkgMDogbWFnX3J4PSVkLCByZXNfc2NhbGU9JWRcbiIsCiAJCQltYWdfcngsIHJlc19zY2FsZSk7CiAJCXJldHVybiBmYWxzZTsKQEAgLTU4OSw4ICs1ODUsNyBAQAogCXFfcV9jb2ZmID0gKG1hZ19jb3JyX3J4ICogMTI4IC8gcmVzX3NjYWxlKTsKIAlxX2lfY29mZiA9IChwaHNfY29ycl9yeCAqIDI1NiAvIHJlc19zY2FsZSk7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSJyeCBjaGFpbiAlZDogbWFnIGNvcnI9JWQgIHBoYXNlIGNvcnI9JWRcbiIsCisJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgInJ4IGNoYWluICVkOiBtYWcgY29ycj0lZCAgcGhhc2UgY29ycj0lZFxuIiwKIAkJY2hhaW5faWR4LCBxX3FfY29mZiwgcV9pX2NvZmYpOwogCiAJaWYgKHFfaV9jb2ZmIDwgLTYzKQpAQCAtNjA0LDggKzU5OSw3IEBACiAKIAlpcWNfY29lZmZbMV0gPSAocV9xX2NvZmYgKiAxMjgpICsgcV9pX2NvZmY7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSJyeCBjaGFpbiAlZDogaXEgY29yciBjb2VmZj0leFxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLCAicnggY2hhaW4gJWQ6IGlxIGNvcnIgY29lZmY9JXhcbiIsCiAJCWNoYWluX2lkeCwgaXFjX2NvZWZmWzFdKTsKIAogCXJldHVybiB0cnVlOwpAQCAtNzUyLDggKzc0Niw3IEBACiAJaWYgKCFhdGg5a19od193YWl0KGFoLCBBUl9QSFlfVFhfSVFDQUxfU1RBUlQsCiAJCQlBUl9QSFlfVFhfSVFDQUxfU1RBUlRfRE9fQ0FMLCAwLAogCQkJQUhfV0FJVF9USU1FT1VUKSkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkiVHggSVEgQ2FsIGlzIG5vdCBjb21wbGV0ZWQuXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgIlR4IElRIENhbCBpcyBub3QgY29tcGxldGVkXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAlyZXR1cm4gdHJ1ZTsKQEAgLTc5MSwxMyArNzg0LDEzIEBACiAJCQlubWVhc3VyZW1lbnQgPSBNQVhfTUVBU1VSRU1FTlQ7CiAKIAkJZm9yIChpbSA9IDA7IGltIDwgbm1lYXN1cmVtZW50OyBpbSsrKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkJIkRvaW5nIFR4IElRIENhbCBmb3IgY2hhaW4gJWQuXG4iLCBpKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCisJCQkJIkRvaW5nIFR4IElRIENhbCBmb3IgY2hhaW4gJWRcbiIsIGkpOwogCiAJCQlpZiAoUkVHX1JFQUQoYWgsIHR4aXFjYWxfc3RhdHVzW2ldKSAmCiAJCQkJCUFSX1BIWV9UWF9JUUNBTF9TVEFUVVNfRkFJTEVEKSB7Ci0JCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJCQkiVHggSVEgQ2FsIGZhaWxlZCBmb3IgY2hhaW4gJWQuXG4iLCBpKTsKKwkJCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAorCQkJCQkiVHggSVEgQ2FsIGZhaWxlZCBmb3IgY2hhaW4gJWRcbiIsIGkpOwogCQkJCWdvdG8gdHhfaXFjYWxfZmFpbDsKIAkJCX0KIApAQCAtODIzLDE4ICs4MTYsMTYgQEAKIAkJCQlpcV9yZXNbaWR4ICsgMV0gPSAweGZmZmYgJiBSRUdfUkVBRChhaCwKIAkJCQkJCWNoYW5faW5mb190YWJbaV0gKyBvZmZzZXQpOwogCi0JCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJCQkiSVEgUkVTWyVkXT0weCV4IgotCQkJCQkiSVFfUkVTWyVkXT0weCV4XG4iLAorCQkJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCisJCQkJCSJJUV9SRVNbJWRdPTB4JXggSVFfUkVTWyVkXT0weCV4XG4iLAogCQkJCQlpZHgsIGlxX3Jlc1tpZHhdLCBpZHggKyAxLAogCQkJCQlpcV9yZXNbaWR4ICsgMV0pOwogCQkJfQogCiAJCQlpZiAoIWFyOTAwM19od19jYWxjX2lxX2NvcnIoYWgsIGksIGlxX3JlcywKIAkJCQkJCWNvZWZmLmlxY19jb2VmZikpIHsKLQkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkJCSJGYWlsZWQgaW4gY2FsY3VsYXRpb24gb2YgXAotCQkJCQlJUSBjb3JyZWN0aW9uLlxuIik7CisJCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKKwkJCQkJIkZhaWxlZCBpbiBjYWxjdWxhdGlvbiBvZiBJUSBjb3JyZWN0aW9uXG4iKTsKIAkJCQlnb3RvIHR4X2lxY2FsX2ZhaWw7CiAJCQl9CiAKQEAgLTg1NCw3ICs4NDUsNyBAQAogCXJldHVybjsKIAogdHhfaXFjYWxfZmFpbDoKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsICJUeCBJUSBDYWwgZmFpbGVkXG4iKTsKKwlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLCAiVHggSVEgQ2FsIGZhaWxlZFxuIik7CiAJcmV0dXJuOwogfQogCkBAIC05MzQsMTAgKzkyNSwxMiBAQAogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXN0cnVjdCBhdGg5a19od19jYWxfZGF0YSAqY2FsZGF0YSA9IGFoLT5jYWxkYXRhOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaV9odyA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKIAlib29sIHR4aXFjYWxfZG9uZSA9IGZhbHNlLCB0eGNsY2FsX2RvbmUgPSBmYWxzZTsKIAlib29sIGlzX3JldXNhYmxlID0gdHJ1ZSwgc3RhdHVzID0gdHJ1ZTsKIAlib29sIHJ1bl9ydHRfY2FsID0gZmFsc2UsIHJ1bl9hZ2NfY2FsOwogCWJvb2wgcnR0ID0gISEoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9SVFQpOworCWJvb2wgbWNpID0gISEoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpOwogCXUzMiBhZ2NfY3RybCA9IDAsIGFnY19zdXBwX2NhbHMgPSBBUl9QSFlfQUdDX0NPTlRST0xfT0ZGU0VUX0NBTCB8CiAJCQkJCSAgQVJfUEhZX0FHQ19DT05UUk9MX0ZMVFJfQ0FMICAgfAogCQkJCQkgIEFSX1BIWV9BR0NfQ09OVFJPTF9QS0RFVF9DQUw7CkBAIC05NTAsNyArOTQzLDcgQEAKIAkJaWYgKCFhcjkwMDNfaHdfcnR0X3Jlc3RvcmUoYWgsIGNoYW4pKQogCQkJcnVuX3J0dF9jYWwgPSB0cnVlOwogCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwgIlJUVCByZXN0b3JlICVzXG4iLAorCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLCAiUlRUIHJlc3RvcmUgJXNcbiIsCiAJCQlydW5fcnR0X2NhbCA/ICJmYWlsZWQiIDogInN1Y2NlZWQiKTsKIAl9CiAJcnVuX2FnY19jYWwgPSBydW5fcnR0X2NhbDsKQEAgLTEwMDUsNiArOTk4LDMxIEBACiAJfSBlbHNlIGlmIChjYWxkYXRhICYmICFjYWxkYXRhLT5kb25lX3R4aXFjYWxfb25jZSkKIAkJcnVuX2FnY19jYWwgPSB0cnVlOwogCisJaWYgKG1jaSAmJiBJU19DSEFOXzJHSFooY2hhbikgJiYKKwkgICAgKG1jaV9ody0+YnRfc3RhdGUgID09IE1DSV9CVF9BV0FLRSkgJiYKKwkgICAgcnVuX2FnY19jYWwgJiYKKwkgICAgIShtY2lfaHctPmNvbmZpZyAmIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfTUNJX0NBTCkpIHsKKworCQl1MzIgcGxkWzRdID0gezAsIDAsIDAsIDB9OworCisJCS8qIHNlbmQgQ0FMX1JFUSBvbmx5IHdoZW4gQlQgaXMgQVdBS0UuICovCisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgc2VuZCBXTEFOX0NBTF9SRVEgMHgleFxuIiwKKwkJCW1jaV9ody0+d2xhbl9jYWxfc2VxKTsKKwkJTUNJX0dQTV9TRVRfQ0FMX1RZUEUocGxkLCBNQ0lfR1BNX1dMQU5fQ0FMX1JFUSk7CisJCXBsZFtNQ0lfR1BNX1dMQU5fQ0FMX1dfU0VRVUVOQ0VdID0gbWNpX2h3LT53bGFuX2NhbF9zZXErKzsKKwkJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBsZCwgMTYsIHRydWUsIGZhbHNlKTsKKworCQkvKiBXYWl0IEJUX0NBTF9HUkFOVCBmb3IgNTBtcyAqLworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIHdhaXQgZm9yIEJUX0NBTF9HUkFOVFxuIik7CisKKwkJaWYgKGFyOTAwM19tY2lfd2FpdF9mb3JfZ3BtKGFoLCBNQ0lfR1BNX0JUX0NBTF9HUkFOVCwgMCwgNTAwMDApKQorCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBnb3QgQlRfQ0FMX0dSQU5UXG4iKTsKKwkJZWxzZSB7CisJCQlpc19yZXVzYWJsZSA9IGZhbHNlOworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgIlxuTUNJIEJUIGlzIG5vdCByZXNwb25kaW5nXG4iKTsKKwkJfQorCX0KKwogCXR4aXFjYWxfZG9uZSA9IGFyOTAwM19od190eF9pcV9jYWxfcnVuKGFoKTsKIAlSRUdfV1JJVEUoYWgsIEFSX1BIWV9BQ1RJVkUsIEFSX1BIWV9BQ1RJVkVfRElTKTsKIAl1ZGVsYXkoNSk7CkBAIC0xMDIyLDYgKzEwNDAsMjEgQEAKIAkJCQkgICAgICAgQVJfUEhZX0FHQ19DT05UUk9MX0NBTCwKIAkJCQkgICAgICAgMCwgQUhfV0FJVF9USU1FT1VUKTsKIAl9CisKKwlpZiAobWNpICYmIElTX0NIQU5fMkdIWihjaGFuKSAmJgorCSAgICAobWNpX2h3LT5idF9zdGF0ZSAgPT0gTUNJX0JUX0FXQUtFKQkmJgorCSAgICBydW5fYWdjX2NhbAkmJgorCSAgICAhKG1jaV9ody0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfRElTQUJMRV9NQ0lfQ0FMKSkgeworCisJCXUzMiBwbGRbNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBTZW5kIFdMQU5fQ0FMX0RPTkUgMHgleFxuIiwKKwkJCW1jaV9ody0+d2xhbl9jYWxfZG9uZSk7CisJCU1DSV9HUE1fU0VUX0NBTF9UWVBFKHBsZCwgTUNJX0dQTV9XTEFOX0NBTF9ET05FKTsKKwkJcGxkW01DSV9HUE1fV0xBTl9DQUxfV19TRVFVRU5DRV0gPSBtY2lfaHctPndsYW5fY2FsX2RvbmUrKzsKKwkJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBsZCwgMTYsIHRydWUsIGZhbHNlKTsKKwl9CisKIAlpZiAocnR0ICYmICFydW5fcnR0X2NhbCkgewogCQlhZ2NfY3RybCB8PSBhZ2Nfc3VwcF9jYWxzOwogCQlSRUdfV1JJVEUoYWgsIEFSX1BIWV9BR0NfQ09OVFJPTCwgYWdjX2N0cmwpOwpAQCAtMTAzMSw5ICsxMDY0LDggQEAKIAkJaWYgKHJ1bl9ydHRfY2FsKQogCQkJYXI5MDAzX2h3X3J0dF9kaXNhYmxlKGFoKTsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkib2Zmc2V0IGNhbGlicmF0aW9uIGZhaWxlZCB0byBjb21wbGV0ZSBpbiAxbXM7IgotCQkJIm5vaXN5IGVudmlyb25tZW50P1xuIik7CisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCisJCQkib2Zmc2V0IGNhbGlicmF0aW9uIGZhaWxlZCB0byBjb21wbGV0ZSBpbiAxbXM7IG5vaXN5IGVudmlyb25tZW50P1xuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTEwOTIsMTUgKzExMjQsMTQgQEAKIAlpZiAoYWgtPnN1cHBfY2FscyAmIElRX01JU01BVENIX0NBTCkgewogCQlJTklUX0NBTCgmYWgtPmlxX2NhbGRhdGEpOwogCQlJTlNFUlRfQ0FMKGFoLCAmYWgtPmlxX2NhbGRhdGEpOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkiZW5hYmxpbmcgSVEgQ2FsaWJyYXRpb24uXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgImVuYWJsaW5nIElRIENhbGlicmF0aW9uXG4iKTsKIAl9CiAKIAlpZiAoYWgtPnN1cHBfY2FscyAmIFRFTVBfQ09NUF9DQUwpIHsKIAkJSU5JVF9DQUwoJmFoLT50ZW1wQ29tcENhbERhdGEpOwogCQlJTlNFUlRfQ0FMKGFoLCAmYWgtPnRlbXBDb21wQ2FsRGF0YSk7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCSJlbmFibGluZyBUZW1wZXJhdHVyZSBDb21wZW5zYXRpb24gQ2FsaWJyYXRpb24uXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKKwkJCSJlbmFibGluZyBUZW1wZXJhdHVyZSBDb21wZW5zYXRpb24gQ2FsaWJyYXRpb25cbiIpOwogCX0KIAogCS8qIEluaXRpYWxpemUgY3VycmVudCBwb2ludGVyIHRvIGZpcnN0IGVsZW1lbnQgaW4gbGlzdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmMKaW5kZXggM2IyNjJiYS4uOWZiY2JkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5jCkBAIC0xMjEsMTAgKzEyMSw4IEBACiAJCSAqIGlmIHRoZSByZWdpc3RlciBpcyBwZXIgY2hhaW4KIAkJICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MSwgMSwgMX0sLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UyID0gezEsIDEsIDF9LCAvKiAzIGNoYWluICAqLwotCQkuZGJfc3RhZ2UzID0gezAsIDAsIDB9LAotCQkuZGJfc3RhZ2U0ID0gezAsIDAsIDB9LAorCQkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisJCS5xdWlja19kcm9wID0gMCwKIAkJLnhwYUJpYXNMdmwgPSAwLAogCQkudHhGcmFtZVRvRGF0YVN0YXJ0ID0gMHgwZSwKIAkJLnR4RnJhbWVUb1BhT24gPSAweDBlLApAQCAtMTQ0LDcgKzE0Miw3IEBACiAJIH0sCiAJLmJhc2VfZXh0MSA9IHsKIAkJLmFudF9kaXZfY29udHJvbCA9IDAsCi0JCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKwkJLmZ1dHVyZSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQogCX0sCiAJLmNhbEZyZXFQaWVyMkcgPSB7CiAJCUZSRVEyRkJJTigyNDEyLCAxKSwKQEAgLTMyMywxMCArMzIxLDggQEAKIAkJLnNwdXJDaGFucyA9IHswLCAwLCAwLCAwLCAwfSwKIAkJLyogbm9pc2VGbG9vclRocmVzaENoIENoZWNrIGlmIHRoZSByZWdpc3RlciBpcyBwZXIgY2hhaW4gKi8KIAkJLm5vaXNlRmxvb3JUaHJlc2hDaCA9IHstMSwgMCwgMH0sCi0JCS5vYiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UyID0gezMsIDMsIDN9LCAvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTMgPSB7MywgMywgM30sIC8qIGRvZXNuJ3QgZXhpc3QgZm9yIDJHICovCi0JCS5kYl9zdGFnZTQgPSB7MywgMywgM30sCSAvKiBkb24ndCBleGlzdCBmb3IgMkcgKi8KKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTY5OCwxMCArNjk0LDggQEAKIAkJICogaWYgdGhlIHJlZ2lzdGVyIGlzIHBlciBjaGFpbgogCQkgKi8KIAkJLm5vaXNlRmxvb3JUaHJlc2hDaCA9IHstMSwgMCwgMH0sCi0JCS5vYiA9IHsxLCAxLCAxfSwvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTIgPSB7MSwgMSwgMX0sIC8qIDMgY2hhaW4gICovCi0JCS5kYl9zdGFnZTMgPSB7MCwgMCwgMH0sCi0JCS5kYl9zdGFnZTQgPSB7MCwgMCwgMH0sCisJCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKwkJLnF1aWNrX2Ryb3AgPSAwLAogCQkueHBhQmlhc0x2bCA9IDAsCiAJCS50eEZyYW1lVG9EYXRhU3RhcnQgPSAweDBlLAogCQkudHhGcmFtZVRvUGFPbiA9IDB4MGUsCkBAIC03MjEsNyArNzE1LDcgQEAKIAkgfSwKIAkgLmJhc2VfZXh0MSA9IHsKIAkJLmFudF9kaXZfY29udHJvbCA9IDAsCi0JCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKwkJLmZ1dHVyZSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQogCSB9LAogCS5jYWxGcmVxUGllcjJHID0gewogCQlGUkVRMkZCSU4oMjQxMiwgMSksCkBAIC05MDAsMTAgKzg5NCw4IEBACiAJCS5zcHVyQ2hhbnMgPSB7RlJFUTJGQklOKDU1MDAsIDApLCAwLCAwLCAwLCAwfSwKIAkJLyogbm9pc2VGbG9vclRocmVzaENoIENoZWNrIGlmIHRoZSByZWdpc3RlciBpcyBwZXIgY2hhaW4gKi8KIAkJLm5vaXNlRmxvb3JUaHJlc2hDaCA9IHstMSwgMCwgMH0sCi0JCS5vYiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UyID0gezMsIDMsIDN9LCAvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTMgPSB7MywgMywgM30sIC8qIGRvZXNuJ3QgZXhpc3QgZm9yIDJHICovCi0JCS5kYl9zdGFnZTQgPSB7MywgMywgM30sCSAvKiBkb24ndCBleGlzdCBmb3IgMkcgKi8KKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMHhmLAogCQkudHhGcmFtZVRvRGF0YVN0YXJ0ID0gMHgwZSwKIAkJLnR4RnJhbWVUb1BhT24gPSAweDBlLApAQCAtMTI3NiwxMCArMTI2OCw4IEBACiAJCSAqIGlmIHRoZSByZWdpc3RlciBpcyBwZXIgY2hhaW4KIAkJICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MSwgMSwgMX0sLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UyID0gezEsIDEsIDF9LCAvKiAzIGNoYWluICAqLwotCQkuZGJfc3RhZ2UzID0gezAsIDAsIDB9LAotCQkuZGJfc3RhZ2U0ID0gezAsIDAsIDB9LAorCQkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisJCS5xdWlja19kcm9wID0gMCwKIAkJLnhwYUJpYXNMdmwgPSAwLAogCQkudHhGcmFtZVRvRGF0YVN0YXJ0ID0gMHgwZSwKIAkJLnR4RnJhbWVUb1BhT24gPSAweDBlLApAQCAtMTI5MSwyMCArMTI4MSwyMCBAQAogCQkudHhFbmRUb1J4T24gPSAweDIsCiAJCS50eEZyYW1lVG9YcGFPbiA9IDB4ZSwKIAkJLnRocmVzaDYyID0gMjgsCi0JCS5wYXBkUmF0ZU1hc2tIdDIwID0gTEUzMigweDgwYzA4MCksCi0JCS5wYXBkUmF0ZU1hc2tIdDQwID0gTEUzMigweDgwYzA4MCksCisJCS5wYXBkUmF0ZU1hc2tIdDIwID0gTEUzMigweDBjODBjMDgwKSwKKwkJLnBhcGRSYXRlTWFza0h0NDAgPSBMRTMyKDB4MDA4MGMwODApLAogCQkuZnV0dXJlTW9kYWwgPSB7CiAJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAogCQl9LAogCX0sCiAJLmJhc2VfZXh0MSA9IHsKIAkJLmFudF9kaXZfY29udHJvbCA9IDAsCi0JCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKwkJLmZ1dHVyZSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQogCX0sCiAJLmNhbEZyZXFQaWVyMkcgPSB7CiAJCUZSRVEyRkJJTigyNDEyLCAxKSwKIAkJRlJFUTJGQklOKDI0MzcsIDEpLAotCQlGUkVRMkZCSU4oMjQ3MiwgMSksCisJCUZSRVEyRkJJTigyNDYyLCAxKSwKIAl9LAogCS8qIGFyOTMwMF9jYWxfZGF0YV9wZXJfZnJlcV9vcF9sb29wIDJnICovCiAJLmNhbFBpZXJEYXRhMkcgPSB7CkBAIC0xMzE0LDcgKzEzMDQsNyBAQAogCX0sCiAJLmNhbFRhcmdldF9mcmVxYmluX0NjayA9IHsKIAkJRlJFUTJGQklOKDI0MTIsIDEpLAotCQlGUkVRMkZCSU4oMjQ4NCwgMSksCisJCUZSRVEyRkJJTigyNDcyLCAxKSwKIAl9LAogCS5jYWxUYXJnZXRfZnJlcWJpbl8yRyA9IHsKIAkJRlJFUTJGQklOKDI0MTIsIDEpLApAQCAtMTQ3OCwxMCArMTQ2OCw4IEBACiAJCS5zcHVyQ2hhbnMgPSB7MCwgMCwgMCwgMCwgMH0sCiAJCS8qIG5vaXNlRmxvb3JUaHJlc2hDaCBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UzID0gezMsIDMsIDN9LCAvKiBkb2Vzbid0IGV4aXN0IGZvciAyRyAqLwotCQkuZGJfc3RhZ2U0ID0gezMsIDMsIDN9LAkgLyogZG9uJ3QgZXhpc3QgZm9yIDJHICovCisJCS5yZXNlcnZlZCA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfSwKKwkJLnF1aWNrX2Ryb3AgPSAwLAogCQkueHBhQmlhc0x2bCA9IDAsCiAJCS50eEZyYW1lVG9EYXRhU3RhcnQgPSAweDBlLAogCQkudHhGcmFtZVRvUGFPbiA9IDB4MGUsCkBAIC0xNTE1LDcgKzE1MDMsNyBAQAogCQlGUkVRMkZCSU4oNTUwMCwgMCksCiAJCUZSRVEyRkJJTig1NjAwLCAwKSwKIAkJRlJFUTJGQklOKDU3MDAsIDApLAotCQlGUkVRMkZCSU4oNTgyNSwgMCkKKwkJRlJFUTJGQklOKDU3ODUsIDApCiAJfSwKIAkuY2FsUGllckRhdGE1RyA9IHsKIAkJewpAQCAtMTg1NCwxMCArMTg0Miw4IEBACiAJCSAqIGlmIHRoZSByZWdpc3RlciBpcyBwZXIgY2hhaW4KIAkJICovCiAJCS5ub2lzZUZsb29yVGhyZXNoQ2ggPSB7LTEsIDAsIDB9LAotCQkub2IgPSB7MSwgMSwgMX0sLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UyID0gezEsIDEsIDF9LCAvKiAzIGNoYWluICAqLwotCQkuZGJfc3RhZ2UzID0gezAsIDAsIDB9LAotCQkuZGJfc3RhZ2U0ID0gezAsIDAsIDB9LAorCQkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisJCS5xdWlja19kcm9wID0gMCwKIAkJLnhwYUJpYXNMdmwgPSAwLAogCQkudHhGcmFtZVRvRGF0YVN0YXJ0ID0gMHgwZSwKIAkJLnR4RnJhbWVUb1BhT24gPSAweDBlLApAQCAtMTg3Nyw3ICsxODYzLDcgQEAKIAl9LAogCS5iYXNlX2V4dDEgPSB7CiAJCS5hbnRfZGl2X2NvbnRyb2wgPSAwLAotCQkuZnV0dXJlID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9CisJCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KIAl9LAogCS5jYWxGcmVxUGllcjJHID0gewogCQlGUkVRMkZCSU4oMjQxMiwgMSksCkBAIC0yMDU2LDEwICsyMDQyLDggQEAKIAkJLnNwdXJDaGFucyA9IHswLCAwLCAwLCAwLCAwfSwKIAkJLyogbm9pc2VGbG9vclRocmVzaGNoIGNoZWNrIGlmIHRoZSByZWdpc3RlciBpcyBwZXIgY2hhaW4gKi8KIAkJLm5vaXNlRmxvb3JUaHJlc2hDaCA9IHstMSwgMCwgMH0sCi0JCS5vYiA9IHszLCAzLCAzfSwgLyogMyBjaGFpbiAqLwotCQkuZGJfc3RhZ2UyID0gezMsIDMsIDN9LCAvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTMgPSB7MywgMywgM30sIC8qIGRvZXNuJ3QgZXhpc3QgZm9yIDJHICovCi0JCS5kYl9zdGFnZTQgPSB7MywgMywgM30sCSAvKiBkb24ndCBleGlzdCBmb3IgMkcgKi8KKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTI0MzEsMTAgKzI0MTUsOCBAQAogCQkgKiBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluCiAJCSAqLwogCQkubm9pc2VGbG9vclRocmVzaENoID0gey0xLCAwLCAwfSwKLQkJLm9iID0gezEsIDEsIDF9LC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMiA9IHsxLCAxLCAxfSwgLyogMyBjaGFpbiAgKi8KLQkJLmRiX3N0YWdlMyA9IHswLCAwLCAwfSwKLQkJLmRiX3N0YWdlNCA9IHswLCAwLCAwfSwKKwkJLnJlc2VydmVkID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9LAorCQkucXVpY2tfZHJvcCA9IDAsCiAJCS54cGFCaWFzTHZsID0gMCwKIAkJLnR4RnJhbWVUb0RhdGFTdGFydCA9IDB4MGUsCiAJCS50eEZyYW1lVG9QYU9uID0gMHgwZSwKQEAgLTI0NTQsMTIgKzI0MzYsMTIgQEAKIAkgfSwKIAkgLmJhc2VfZXh0MSA9IHsKIAkJLmFudF9kaXZfY29udHJvbCA9IDAsCi0JCS5mdXR1cmUgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0KKwkJLmZ1dHVyZSA9IHswLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfQogCSB9LAogCS5jYWxGcmVxUGllcjJHID0gewogCQlGUkVRMkZCSU4oMjQxMiwgMSksCiAJCUZSRVEyRkJJTigyNDM3LCAxKSwKLQkJRlJFUTJGQklOKDI0NzIsIDEpLAorCQlGUkVRMkZCSU4oMjQ2MiwgMSksCiAJIH0sCiAJLyogYXI5MzAwX2NhbF9kYXRhX3Blcl9mcmVxX29wX2xvb3AgMmcgKi8KIAkuY2FsUGllckRhdGEyRyA9IHsKQEAgLTI2MzMsMTAgKzI2MTUsOCBAQAogCQkuc3B1ckNoYW5zID0gezAsIDAsIDAsIDAsIDB9LAogCQkvKiBub2lzZUZsb29yVGhyZXNoQ2ggQ2hlY2sgaWYgdGhlIHJlZ2lzdGVyIGlzIHBlciBjaGFpbiAqLwogCQkubm9pc2VGbG9vclRocmVzaENoID0gey0xLCAwLCAwfSwKLQkJLm9iID0gezMsIDMsIDN9LCAvKiAzIGNoYWluICovCi0JCS5kYl9zdGFnZTIgPSB7MywgMywgM30sIC8qIDMgY2hhaW4gKi8KLQkJLmRiX3N0YWdlMyA9IHszLCAzLCAzfSwgLyogZG9lc24ndCBleGlzdCBmb3IgMkcgKi8KLQkJLmRiX3N0YWdlNCA9IHszLCAzLCAzfSwJIC8qIGRvbid0IGV4aXN0IGZvciAyRyAqLworCQkucmVzZXJ2ZWQgPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH0sCisJCS5xdWlja19kcm9wID0gMCwKIAkJLnhwYUJpYXNMdmwgPSAwLAogCQkudHhGcmFtZVRvRGF0YVN0YXJ0ID0gMHgwZSwKIAkJLnR4RnJhbWVUb1BhT24gPSAweDBlLApAQCAtMjY2Myw3ICsyNjQzLDcgQEAKIAkJLnhhdHRlbjFNYXJnaW5IaWdoID0gezAsIDAsIDB9CiAJIH0sCiAJLmNhbEZyZXFQaWVyNUcgPSB7Ci0JCUZSRVEyRkJJTig1MTgwLCAwKSwKKwkJRlJFUTJGQklOKDUxNjAsIDApLAogCQlGUkVRMkZCSU4oNTIyMCwgMCksCiAJCUZSRVEyRkJJTig1MzIwLCAwKSwKIAkJRlJFUTJGQklOKDU0MDAsIDApLApAQCAtMzAyMyw2ICszMDAzLDggQEAKIAkJcmV0dXJuIGVlcC0+bW9kYWxIZWFkZXI1Ry5hbnRlbm5hR2FpbjsKIAljYXNlIEVFUF9BTlRFTk5BX0dBSU5fMkc6CiAJCXJldHVybiBlZXAtPm1vZGFsSGVhZGVyMkcuYW50ZW5uYUdhaW47CisJY2FzZSBFRVBfUVVJQ0tfRFJPUDoKKwkJcmV0dXJuIHBCYXNlLT5taXNjQ29uZmlndXJhdGlvbiAmIEJJVCgxKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKIAl9CkBAIC0zMDYxLDggKzMwNDMsNyBAQAogCWludCBpOwogCiAJaWYgKChhZGRyZXNzIDwgMCkgfHwgKChhZGRyZXNzICsgY291bnQpIC8gMiA+IEFSOTMwMF9FRVBST01fU0laRSAtIDEpKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKLQkJCSJlZXByb20gYWRkcmVzcyBub3QgaW4gcmFuZ2VcbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAiZWVwcm9tIGFkZHJlc3Mgbm90IGluIHJhbmdlXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMzA5Myw4ICszMDc0LDggQEAKIAlyZXR1cm4gdHJ1ZTsKIAogZXJyb3I6Ci0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfRUVQUk9NLAotCQkidW5hYmxlIHRvIHJlYWQgZWVwcm9tIHJlZ2lvbiBhdCBvZmZzZXQgJWRcbiIsIGFkZHJlc3MpOworCWF0aF9kYmcoY29tbW9uLCBFRVBST00sICJ1bmFibGUgdG8gcmVhZCBlZXByb20gcmVnaW9uIGF0IG9mZnNldCAlZFxuIiwKKwkJYWRkcmVzcyk7CiAJcmV0dXJuIGZhbHNlOwogfQogCkBAIC0zMTc4LDEzICszMTU5LDEzIEBACiAJCWxlbmd0aCAmPSAweGZmOwogCiAJCWlmIChsZW5ndGggPiAwICYmIHNwb3QgPj0gMCAmJiBzcG90K2xlbmd0aCA8PSBtZGF0YVNpemUpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKKwkJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sCiAJCQkJIlJlc3RvcmUgYXQgJWQ6IHNwb3Q9JWQgb2Zmc2V0PSVkIGxlbmd0aD0lZFxuIiwKIAkJCQlpdCwgc3BvdCwgb2Zmc2V0LCBsZW5ndGgpOwogCQkJbWVtY3B5KCZtcHRyW3Nwb3RdLCAmYmxvY2tbaXQrMl0sIGxlbmd0aCk7CiAJCQlzcG90ICs9IGxlbmd0aDsKIAkJfSBlbHNlIGlmIChsZW5ndGggPiAwKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCisJCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLAogCQkJCSJCYWQgcmVzdG9yZSBhdCAlZDogc3BvdD0lZCBvZmZzZXQ9JWQgbGVuZ3RoPSVkXG4iLAogCQkJCWl0LCBzcG90LCBvZmZzZXQsIGxlbmd0aCk7CiAJCQlyZXR1cm4gZmFsc2U7CkBAIC0zMjA2LDEzICszMTg3LDEzIEBACiAJc3dpdGNoIChjb2RlKSB7CiAJY2FzZSBfQ29tcHJlc3NOb25lOgogCQlpZiAobGVuZ3RoICE9IG1kYXRhX3NpemUpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKKwkJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sCiAJCQkJIkVFUFJPTSBzdHJ1Y3R1cmUgc2l6ZSBtaXNtYXRjaCBtZW1vcnk9JWQgZWVwcm9tPSVkXG4iLAogCQkJCW1kYXRhX3NpemUsIGxlbmd0aCk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAkJbWVtY3B5KG1wdHIsICh1OCAqKSAod29yZCArIENPTVBfSERSX0xFTiksIGxlbmd0aCk7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKKwkJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwKIAkJCSJyZXN0b3JlZCBlZXByb20gJWQ6IHVuY29tcHJlc3NlZCwgbGVuZ3RoICVkXG4iLAogCQkJaXQsIGxlbmd0aCk7CiAJCWJyZWFrOwpAQCAtMzIyMSwyMiArMzIwMiwyMSBAQAogCQl9IGVsc2UgewogCQkJZWVwID0gYXI5MDAzX2VlcHJvbV9zdHJ1Y3RfZmluZF9ieV9pZChyZWZlcmVuY2UpOwogCQkJaWYgKGVlcCA9PSBOVUxMKSB7Ci0JCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfRUVQUk9NLAorCQkJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sCiAJCQkJCSJjYW4ndCBmaW5kIHJlZmVyZW5jZSBlZXByb20gc3RydWN0ICVkXG4iLAogCQkJCQlyZWZlcmVuY2UpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJCW1lbWNweShtcHRyLCBlZXAsIG1kYXRhX3NpemUpOwogCQl9Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKKwkJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwKIAkJCSJyZXN0b3JlIGVlcHJvbSAlZDogYmxvY2ssIHJlZmVyZW5jZSAlZCwgbGVuZ3RoICVkXG4iLAogCQkJaXQsIHJlZmVyZW5jZSwgbGVuZ3RoKTsKIAkJYXI5MzAwX3VuY29tcHJlc3NfYmxvY2soYWgsIG1wdHIsIG1kYXRhX3NpemUsCiAJCQkJCSh1OCAqKSAod29yZCArIENPTVBfSERSX0xFTiksIGxlbmd0aCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKLQkJCSJ1bmtub3duIGNvbXByZXNzaW9uIGNvZGUgJWRcbiIsIGNvZGUpOworCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAidW5rbm93biBjb21wcmVzc2lvbiBjb2RlICVkXG4iLCBjb2RlKTsKIAkJcmV0dXJuIC0xOwogCX0KIAlyZXR1cm4gMDsKQEAgLTMzMTIsMzQgKzMyOTIsMzIgQEAKIAkJY3B0ciA9IEFSOTMwMF9CQVNFX0FERFJfNTEyOwogCWVsc2UKIAkJY3B0ciA9IEFSOTMwMF9CQVNFX0FERFI7Ci0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfRUVQUk9NLAotCQkiVHJ5aW5nIEVFUFJPTSBhY2Nlc3MgYXQgQWRkcmVzcyAweCUwNHhcbiIsIGNwdHIpOworCWF0aF9kYmcoY29tbW9uLCBFRVBST00sICJUcnlpbmcgRUVQUk9NIGFjY2VzcyBhdCBBZGRyZXNzIDB4JTA0eFxuIiwKKwkJY3B0cik7CiAJaWYgKGFyOTMwMF9jaGVja19lZXByb21faGVhZGVyKGFoLCByZWFkLCBjcHRyKSkKIAkJZ290byBmb3VuZDsKIAogCWNwdHIgPSBBUjkzMDBfQkFTRV9BRERSXzUxMjsKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCi0JCSJUcnlpbmcgRUVQUk9NIGFjY2VzcyBhdCBBZGRyZXNzIDB4JTA0eFxuIiwgY3B0cik7CisJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwgIlRyeWluZyBFRVBST00gYWNjZXNzIGF0IEFkZHJlc3MgMHglMDR4XG4iLAorCQljcHRyKTsKIAlpZiAoYXI5MzAwX2NoZWNrX2VlcHJvbV9oZWFkZXIoYWgsIHJlYWQsIGNwdHIpKQogCQlnb3RvIGZvdW5kOwogCiAJcmVhZCA9IGFyOTMwMF9yZWFkX290cDsKIAljcHRyID0gQVI5MzAwX0JBU0VfQUREUjsKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCi0JCSJUcnlpbmcgT1RQIGFjY2VzcyBhdCBBZGRyZXNzIDB4JTA0eFxuIiwgY3B0cik7CisJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwgIlRyeWluZyBPVFAgYWNjZXNzIGF0IEFkZHJlc3MgMHglMDR4XG4iLCBjcHRyKTsKIAlpZiAoYXI5MzAwX2NoZWNrX2VlcHJvbV9oZWFkZXIoYWgsIHJlYWQsIGNwdHIpKQogCQlnb3RvIGZvdW5kOwogCiAJY3B0ciA9IEFSOTMwMF9CQVNFX0FERFJfNTEyOwotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKLQkJIlRyeWluZyBPVFAgYWNjZXNzIGF0IEFkZHJlc3MgMHglMDR4XG4iLCBjcHRyKTsKKwlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAiVHJ5aW5nIE9UUCBhY2Nlc3MgYXQgQWRkcmVzcyAweCUwNHhcbiIsIGNwdHIpOwogCWlmIChhcjkzMDBfY2hlY2tfZWVwcm9tX2hlYWRlcihhaCwgcmVhZCwgY3B0cikpCiAJCWdvdG8gZm91bmQ7CiAKIAlnb3RvIGZhaWw7CiAKIGZvdW5kOgotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwgIkZvdW5kIHZhbGlkIEVFUFJPTSBkYXRhXG4iKTsKKwlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAiRm91bmQgdmFsaWQgRUVQUk9NIGRhdGFcbiIpOwogCiAJZm9yIChpdCA9IDA7IGl0IDwgTVNUQVRFOyBpdCsrKSB7CiAJCWlmICghcmVhZChhaCwgY3B0ciwgd29yZCwgQ09NUF9IRFJfTEVOKSkKQEAgLTMzNTAsMTMgKzMzMjgsMTIgQEAKIAogCQlhcjkzMDBfY29tcF9oZHJfdW5wYWNrKHdvcmQsICZjb2RlLCAmcmVmZXJlbmNlLAogCQkJCSAgICAgICAmbGVuZ3RoLCAmbWFqb3IsICZtaW5vcik7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKKwkJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwKIAkJCSJGb3VuZCBibG9jayBhdCAleDogY29kZT0lZCByZWY9JWQgbGVuZ3RoPSVkIG1ham9yPSVkIG1pbm9yPSVkXG4iLAogCQkJY3B0ciwgY29kZSwgcmVmZXJlbmNlLCBsZW5ndGgsIG1ham9yLCBtaW5vcik7CiAJCWlmICgoIUFSX1NSRVZfOTQ4NShhaCkgJiYgbGVuZ3RoID49IDEwMjQpIHx8CiAJCSAgICAoQVJfU1JFVl85NDg1KGFoKSAmJiBsZW5ndGggPiBFRVBST01fREFUQV9MRU5fOTQ4NSkpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKLQkJCQkiU2tpcHBpbmcgYmFkIGhlYWRlclxuIik7CisJCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAiU2tpcHBpbmcgYmFkIGhlYWRlclxuIik7CiAJCQljcHRyIC09IENPTVBfSERSX0xFTjsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0zMzY1LDEzICszMzQyLDEzIEBACiAJCXJlYWQoYWgsIGNwdHIsIHdvcmQsIENPTVBfSERSX0xFTiArIG9zaXplICsgQ09NUF9DS1NVTV9MRU4pOwogCQljaGVja3N1bSA9IGFyOTMwMF9jb21wX2Nrc3VtKCZ3b3JkW0NPTVBfSERSX0xFTl0sIGxlbmd0aCk7CiAJCW1jaGVja3N1bSA9IGdldF91bmFsaWduZWRfbGUxNigmd29yZFtDT01QX0hEUl9MRU4gKyBvc2l6ZV0pOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCi0JCQkiY2hlY2tzdW0gJXggJXhcbiIsIGNoZWNrc3VtLCBtY2hlY2tzdW0pOworCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAiY2hlY2tzdW0gJXggJXhcbiIsCisJCQljaGVja3N1bSwgbWNoZWNrc3VtKTsKIAkJaWYgKGNoZWNrc3VtID09IG1jaGVja3N1bSkgewogCQkJYXI5MzAwX2NvbXByZXNzX2RlY2lzaW9uKGFoLCBpdCwgY29kZSwgcmVmZXJlbmNlLCBtcHRyLAogCQkJCQkJIHdvcmQsIGxlbmd0aCwgbWRhdGFfc2l6ZSk7CiAJCX0gZWxzZSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCisJCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLAogCQkJCSJza2lwcGluZyBibG9jayB3aXRoIGJhZCBjaGVja3N1bVxuIik7CiAJCX0KIAkJY3B0ciAtPSAoQ09NUF9IRFJfTEVOICsgb3NpemUgKyBDT01QX0NLU1VNX0xFTik7CkBAIC0zNDI4LDI1ICszNDA1LDE0IEBACiAJUFJfRUVQKCJDaGFpbjAgTkYgVGhyZXNob2xkIiwgbW9kYWxfaGRyLT5ub2lzZUZsb29yVGhyZXNoQ2hbMF0pOwogCVBSX0VFUCgiQ2hhaW4xIE5GIFRocmVzaG9sZCIsIG1vZGFsX2hkci0+bm9pc2VGbG9vclRocmVzaENoWzFdKTsKIAlQUl9FRVAoIkNoYWluMiBORiBUaHJlc2hvbGQiLCBtb2RhbF9oZHItPm5vaXNlRmxvb3JUaHJlc2hDaFsyXSk7CisJUFJfRUVQKCJRdWljayBEcm9wIiwgbW9kYWxfaGRyLT5xdWlja19kcm9wKTsKKwlQUl9FRVAoInR4RW5kVG9YcGFPZmYiLCBtb2RhbF9oZHItPnR4RW5kVG9YcGFPZmYpOwogCVBSX0VFUCgieFBBIEJpYXMgTGV2ZWwiLCBtb2RhbF9oZHItPnhwYUJpYXNMdmwpOwogCVBSX0VFUCgidHhGcmFtZVRvRGF0YVN0YXJ0IiwgbW9kYWxfaGRyLT50eEZyYW1lVG9EYXRhU3RhcnQpOwogCVBSX0VFUCgidHhGcmFtZVRvUGFPbiIsIG1vZGFsX2hkci0+dHhGcmFtZVRvUGFPbik7CiAJUFJfRUVQKCJ0eEZyYW1lVG9YcGFPbiIsIG1vZGFsX2hkci0+dHhGcmFtZVRvWHBhT24pOwogCVBSX0VFUCgidHhDbGlwIiwgbW9kYWxfaGRyLT50eENsaXApOwogCVBSX0VFUCgiQURDIERlc2lyZWQgc2l6ZSIsIG1vZGFsX2hkci0+YWRjRGVzaXJlZFNpemUpOwotCVBSX0VFUCgiQ2hhaW4wIG9iIiwgbW9kYWxfaGRyLT5vYlswXSk7Ci0JUFJfRUVQKCJDaGFpbjEgb2IiLCBtb2RhbF9oZHItPm9iWzFdKTsKLQlQUl9FRVAoIkNoYWluMiBvYiIsIG1vZGFsX2hkci0+b2JbMl0pOwotCi0JUFJfRUVQKCJDaGFpbjAgZGJfc3RhZ2UyIiwgbW9kYWxfaGRyLT5kYl9zdGFnZTJbMF0pOwotCVBSX0VFUCgiQ2hhaW4xIGRiX3N0YWdlMiIsIG1vZGFsX2hkci0+ZGJfc3RhZ2UyWzFdKTsKLQlQUl9FRVAoIkNoYWluMiBkYl9zdGFnZTIiLCBtb2RhbF9oZHItPmRiX3N0YWdlMlsyXSk7Ci0JUFJfRUVQKCJDaGFpbjAgZGJfc3RhZ2UzIiwgbW9kYWxfaGRyLT5kYl9zdGFnZTNbMF0pOwotCVBSX0VFUCgiQ2hhaW4xIGRiX3N0YWdlMyIsIG1vZGFsX2hkci0+ZGJfc3RhZ2UzWzFdKTsKLQlQUl9FRVAoIkNoYWluMiBkYl9zdGFnZTMiLCBtb2RhbF9oZHItPmRiX3N0YWdlM1syXSk7Ci0JUFJfRUVQKCJDaGFpbjAgZGJfc3RhZ2U0IiwgbW9kYWxfaGRyLT5kYl9zdGFnZTRbMF0pOwotCVBSX0VFUCgiQ2hhaW4xIGRiX3N0YWdlNCIsIG1vZGFsX2hkci0+ZGJfc3RhZ2U0WzFdKTsKLQlQUl9FRVAoIkNoYWluMiBkYl9zdGFnZTQiLCBtb2RhbF9oZHItPmRiX3N0YWdlNFsyXSk7CiAKIAlyZXR1cm4gbGVuOwogfQpAQCAtMzUwMyw2ICszNDY5LDcgQEAKIAlQUl9FRVAoIkludGVybmFsIHJlZ3VsYXRvciIsICEhKHBCYXNlLT5mZWF0dXJlRW5hYmxlICYgQklUKDQpKSk7CiAJUFJfRUVQKCJFbmFibGUgUGFwcmQiLCAhIShwQmFzZS0+ZmVhdHVyZUVuYWJsZSAmIEJJVCg1KSkpOwogCVBSX0VFUCgiRHJpdmVyIFN0cmVuZ3RoIiwgISEocEJhc2UtPm1pc2NDb25maWd1cmF0aW9uICYgQklUKDApKSk7CisJUFJfRUVQKCJRdWljayBEcm9wIiwgISEocEJhc2UtPm1pc2NDb25maWd1cmF0aW9uICYgQklUKDEpKSk7CiAJUFJfRUVQKCJDaGFpbiBtYXNrIFJlZHVjZSIsIChwQmFzZS0+bWlzY0NvbmZpZ3VyYXRpb24gPj4gMHgzKSAmIDB4MSk7CiAJUFJfRUVQKCJXcml0ZSBlbmFibGUgR3BpbyIsIHBCYXNlLT5lZXByb21Xcml0ZUVuYWJsZUdwaW8pOwogCVBSX0VFUCgiV0xBTiBEaXNhYmxlIEdwaW8iLCBwQmFzZS0+d2xhbkRpc2FibGVHcGlvKTsKQEAgLTM1NzEsMTMgKzM1MzgsMTMgQEAKIHN0YXRpYyB1MTYgYXI5MDAzX3N3aXRjaF9jb21fc3BkdF9nZXQoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgaXNfMmdoeikKIHsKIAlzdHJ1Y3QgYXI5MzAwX2VlcHJvbSAqZWVwID0gJmFoLT5lZXByb20uYXI5MzAwX2VlcDsKLQlfX2xlMzIgdmFsOworCV9fbGUxNiB2YWw7CiAKIAlpZiAoaXNfMmdoeikKIAkJdmFsID0gZWVwLT5tb2RhbEhlYWRlcjJHLnN3aXRjaGNvbXNwZHQ7CiAJZWxzZQogCQl2YWwgPSBlZXAtPm1vZGFsSGVhZGVyNUcuc3dpdGNoY29tc3BkdDsKLQlyZXR1cm4gbGUzMl90b19jcHUodmFsKTsKKwlyZXR1cm4gbGUxNl90b19jcHUodmFsKTsKIH0KIAogCkBAIC0zOTY1LDYgKzM5MzIsNDAgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGFyOTAwM19od19xdWlja19kcm9wX2FwcGx5KHN0cnVjdCBhdGhfaHcgKmFoLCB1MTYgZnJlcSkKK3sKKwlzdHJ1Y3QgYXI5MzAwX2VlcHJvbSAqZWVwID0gJmFoLT5lZXByb20uYXI5MzAwX2VlcDsKKwlpbnQgcXVpY2tfZHJvcCA9IGF0aDlrX2h3X2FyOTMwMF9nZXRfZWVwcm9tKGFoLCBFRVBfUVVJQ0tfRFJPUCk7CisJczMyIHRbM10sIGZbM10gPSB7NTE4MCwgNTUwMCwgNTc4NX07CisKKwlpZiAoIXF1aWNrX2Ryb3ApCisJCXJldHVybjsKKworCWlmIChmcmVxIDwgNDAwMCkKKwkJcXVpY2tfZHJvcCA9IGVlcC0+bW9kYWxIZWFkZXIyRy5xdWlja19kcm9wOworCWVsc2UgeworCQl0WzBdID0gZWVwLT5iYXNlX2V4dDEucXVpY2tfZHJvcF9sb3c7CisJCXRbMV0gPSBlZXAtPm1vZGFsSGVhZGVyNUcucXVpY2tfZHJvcDsKKwkJdFsyXSA9IGVlcC0+YmFzZV9leHQxLnF1aWNrX2Ryb3BfaGlnaDsKKwkJcXVpY2tfZHJvcCA9IGFyOTAwM19od19wb3dlcl9pbnRlcnBvbGF0ZShmcmVxLCBmLCB0LCAzKTsKKwl9CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX0FHQywgQVJfUEhZX0FHQ19RVUlDS19EUk9QLCBxdWlja19kcm9wKTsKK30KKworc3RhdGljIHZvaWQgYXI5MDAzX2h3X3R4ZW5kX3RvX3hwYV9vZmZfYXBwbHkoc3RydWN0IGF0aF9odyAqYWgsIHUxNiBmcmVxKQoreworCXN0cnVjdCBhcjkzMDBfZWVwcm9tICplZXAgPSAmYWgtPmVlcHJvbS5hcjkzMDBfZWVwOworCXUzMiB2YWx1ZTsKKworCXZhbHVlID0gKGZyZXEgPCA0MDAwKSA/IGVlcC0+bW9kYWxIZWFkZXIyRy50eEVuZFRvWHBhT2ZmIDoKKwkJCQllZXAtPm1vZGFsSGVhZGVyNUcudHhFbmRUb1hwYU9mZjsKKworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9YUEFfVElNSU5HX0NUTCwKKwkJICAgICAgQVJfUEhZX1hQQV9USU1JTkdfQ1RMX1RYX0VORF9YUEFCX09GRiwgdmFsdWUpOworCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9YUEFfVElNSU5HX0NUTCwKKwkJICAgICAgQVJfUEhZX1hQQV9USU1JTkdfQ1RMX1RYX0VORF9YUEFBX09GRiwgdmFsdWUpOworfQorCiBzdGF0aWMgdm9pZCBhdGg5a19od19hcjkzMDBfc2V0X2JvYXJkX3ZhbHVlcyhzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCQkJICAgICBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbikKIHsKQEAgLTM5NzIsMTAgKzM5NzMsMTIgQEAKIAlhcjkwMDNfaHdfYW50X2N0cmxfYXBwbHkoYWgsIElTX0NIQU5fMkdIWihjaGFuKSk7CiAJYXI5MDAzX2h3X2RyaXZlX3N0cmVuZ3RoX2FwcGx5KGFoKTsKIAlhcjkwMDNfaHdfYXR0ZW5fYXBwbHkoYWgsIGNoYW4pOworCWFyOTAwM19od19xdWlja19kcm9wX2FwcGx5KGFoLCBjaGFuLT5jaGFubmVsKTsKIAlpZiAoIUFSX1NSRVZfOTMzMChhaCkgJiYgIUFSX1NSRVZfOTM0MChhaCkpCiAJCWFyOTAwM19od19pbnRlcm5hbF9yZWd1bGF0b3JfYXBwbHkoYWgpOwogCWlmIChBUl9TUkVWXzk0ODUoYWgpIHx8IEFSX1NSRVZfOTMzMChhaCkgfHwgQVJfU1JFVl85MzQwKGFoKSkKIAkJYXI5MDAzX2h3X2FwcGx5X3R1bmluZ19jYXBzKGFoKTsKKwlhcjkwMDNfaHdfdHhlbmRfdG9feHBhX29mZl9hcHBseShhaCwgY2hhbi0+Y2hhbm5lbCk7CiB9CiAKIHN0YXRpYyB2b2lkIGF0aDlrX2h3X2FyOTMwMF9zZXRfYWRkYWMoc3RydWN0IGF0aF9odyAqYWgsCkBAIC00NDE2LDggKzQ0MTksOCBAQAogCQkJCQkgICAgICBpczJHSHopICsgaHQ0MFBvd2VySW5jRm9yUGRhZGM7CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXI5MzAwUmF0ZVNpemU7IGkrKykgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCi0JCQkiVFBDWyUwMmRdIDB4JTA4eFxuIiwgaSwgdGFyZ2V0UG93ZXJWYWxUMltpXSk7CisJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sICJUUENbJTAyZF0gMHglMDh4XG4iLAorCQkJaSwgdGFyZ2V0UG93ZXJWYWxUMltpXSk7CiAJfQogfQogCkBAIC00NDM2LDcgKzQ0MzksNyBAQAogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCiAJaWYgKGljaGFpbiA+PSBBUjkzMDBfTUFYX0NIQUlOUykgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCisJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sCiAJCQkiSW52YWxpZCBjaGFpbiBpbmRleCwgbXVzdCBiZSBsZXNzIHRoYW4gJWRcbiIsCiAJCQlBUjkzMDBfTUFYX0NIQUlOUyk7CiAJCXJldHVybiAtMTsKQEAgLTQ0NDQsNyArNDQ0Nyw3IEBACiAKIAlpZiAobW9kZSkgewkJLyogNUdIeiAqLwogCQlpZiAoaXBpZXIgPj0gQVI5MzAwX05VTV81R19DQUxfUElFUlMpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKKwkJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sCiAJCQkJIkludmFsaWQgNUdIeiBjYWwgcGllciBpbmRleCwgbXVzdCBiZSBsZXNzIHRoYW4gJWRcbiIsCiAJCQkJQVI5MzAwX05VTV81R19DQUxfUElFUlMpOwogCQkJcmV0dXJuIC0xOwpAQCAtNDQ1NCw3ICs0NDU3LDcgQEAKIAkJaXMyR0h6ID0gMDsKIAl9IGVsc2UgewogCQlpZiAoaXBpZXIgPj0gQVI5MzAwX05VTV8yR19DQUxfUElFUlMpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKKwkJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sCiAJCQkJIkludmFsaWQgMkdIeiBjYWwgcGllciBpbmRleCwgbXVzdCBiZSBsZXNzIHRoYW4gJWRcbiIsCiAJCQkJQVI5MzAwX05VTV8yR19DQUxfUElFUlMpOwogCQkJcmV0dXJuIC0xOwpAQCAtNDYxNiw4ICs0NjE5LDcgQEAKIAogCS8qIGludGVycG9sYXRlICAqLwogCWZvciAoaWNoYWluID0gMDsgaWNoYWluIDwgQVI5MzAwX01BWF9DSEFJTlM7IGljaGFpbisrKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKLQkJCSJjaD0lZCBmPSVkIGxvdz0lZCAlZCBoPSVkICVkXG4iLAorCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAiY2g9JWQgZj0lZCBsb3c9JWQgJWQgaD0lZCAlZFxuIiwKIAkJCWljaGFpbiwgZnJlcXVlbmN5LCBsZnJlcXVlbmN5W2ljaGFpbl0sCiAJCQlsY29ycmVjdGlvbltpY2hhaW5dLCBoZnJlcXVlbmN5W2ljaGFpbl0sCiAJCQloY29ycmVjdGlvbltpY2hhaW5dKTsKQEAgLTQ2NzIsNyArNDY3NCw3IEBACiAJYXI5MDAzX2h3X3Bvd2VyX2NvbnRyb2xfb3ZlcnJpZGUoYWgsIGZyZXF1ZW5jeSwgY29ycmVjdGlvbiwgdm9sdGFnZSwKIAkJCQkJIHRlbXBlcmF0dXJlKTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKKwlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLAogCQkiZm9yIGZyZXF1ZW5jeT0lZCwgY2FsaWJyYXRpb24gY29ycmVjdGlvbiA9ICVkICVkICVkXG4iLAogCQlmcmVxdWVuY3ksIGNvcnJlY3Rpb25bMF0sIGNvcnJlY3Rpb25bMV0sIGNvcnJlY3Rpb25bMl0pOwogCkBAIC00NzcxLDcgKzQ3NzMsNyBAQAogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXN0cnVjdCBhcjkzMDBfZWVwcm9tICpwRWVwRGF0YSA9ICZhaC0+ZWVwcm9tLmFyOTMwMF9lZXA7Ci0JdTE2IHR3aWNlTWF4RWRnZVBvd2VyID0gTUFYX1JBVEVfUE9XRVI7CisJdTE2IHR3aWNlTWF4RWRnZVBvd2VyOwogCWludCBpOwogCXUxNiBzY2FsZWRQb3dlciA9IDAsIG1pbkN0bFBvd2VyOwogCXN0YXRpYyBjb25zdCB1MTYgY3RsTW9kZXNGb3IxMWFbXSA9IHsKQEAgLTQ4NTgsNyArNDg2MCw3IEBACiAJCWVsc2UKIAkJCWZyZXEgPSBjZW50ZXJzLmN0bF9jZW50ZXI7CiAKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUkVHVUxBVE9SWSwKKwkJYXRoX2RiZyhjb21tb24sIFJFR1VMQVRPUlksCiAJCQkiTE9PUC1Nb2RlIGN0bE1vZGUgJWQgPCAlZCwgaXNIdDQwQ3RsTW9kZSAlZCwgRVhUX0FERElUSVZFICVkXG4iLAogCQkJY3RsTW9kZSwgbnVtQ3RsTW9kZXMsIGlzSHQ0MEN0bE1vZGUsCiAJCQkocEN0bE1vZGVbY3RsTW9kZV0gJiBFWFRfQURESVRJVkUpKTsKQEAgLTQ4NzIsOCArNDg3NCw5IEBACiAJCQljdGxOdW0gPSBBUjkzMDBfTlVNX0NUTFNfNUc7CiAJCX0KIAorCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOwogCQlmb3IgKGkgPSAwOyAoaSA8IGN0bE51bSkgJiYgY3RsSW5kZXhbaV07IGkrKykgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUkVHVUxBVE9SWSwKKwkJCWF0aF9kYmcoY29tbW9uLCBSRUdVTEFUT1JZLAogCQkJCSJMT09QLUN0bGlkeCAlZDogY2ZnQ3RsIDB4JTIuMnggcEN0bE1vZGUgMHglMi4yeCBjdGxJbmRleCAweCUyLjJ4IGNoYW4gJWRcbiIsCiAJCQkJaSwgY2ZnQ3RsLCBwQ3RsTW9kZVtjdGxNb2RlXSwgY3RsSW5kZXhbaV0sCiAJCQkJY2hhbi0+Y2hhbm5lbCk7CkBAIC00OTE1LDcgKzQ5MTgsNyBAQAogCiAJCQltaW5DdGxQb3dlciA9ICh1OCltaW4odHdpY2VNYXhFZGdlUG93ZXIsIHNjYWxlZFBvd2VyKTsKIAotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUkVHVUxBVE9SWSwKKwkJCWF0aF9kYmcoY29tbW9uLCBSRUdVTEFUT1JZLAogCQkJCSJTRUwtTWluIGN0bE1vZGUgJWQgcEN0bE1vZGUgJWQgMnhNYXhFZGdlICVkIHNQICVkIG1pbkN0bFB3ciAlZFxuIiwKIAkJCQljdGxNb2RlLCBwQ3RsTW9kZVtjdGxNb2RlXSwgdHdpY2VNYXhFZGdlUG93ZXIsCiAJCQkJc2NhbGVkUG93ZXIsIG1pbkN0bFBvd2VyKTsKQEAgLTUwMzksNyArNTA0Miw3IEBACiAJCQkJdGFyZ2V0X3Bvd2VyX3ZhbF90Ml9lZXBbaV0pID4KIAkJCSAgICBwYXByZF9zY2FsZV9mYWN0b3IpKSB7CiAJCQkJYWgtPnBhcHJkX3JhdGVtYXNrICY9IH4oMSA8PCBpKTsKLQkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCisJCQkJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwKIAkJCQkJInBhcHJkIGRpc2FibGVkIGZvciBtY3MgJWRcbiIsIGkpOwogCQkJfQogCQl9CkBAIC01MDUxLDEyICs1MDU0LDE0IEBACiAJCQlyZWd1bGF0b3J5LT5tYXhfcG93ZXJfbGV2ZWwgPSB0YXJnZXRQb3dlclZhbFQyW2ldOwogCX0KIAorCWF0aDlrX2h3X3VwZGF0ZV9yZWd1bGF0b3J5X21heHBvd2VyKGFoKTsKKwogCWlmICh0ZXN0KQogCQlyZXR1cm47CiAKIAlmb3IgKGkgPSAwOyBpIDwgYXI5MzAwUmF0ZVNpemU7IGkrKykgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCi0JCQkiVFBDWyUwMmRdIDB4JTA4eFxuIiwgaSwgdGFyZ2V0UG93ZXJWYWxUMltpXSk7CisJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sICJUUENbJTAyZF0gMHglMDh4XG4iLAorCQkJaSwgdGFyZ2V0UG93ZXJWYWxUMltpXSk7CiAJfQogCiAJYWgtPnR4cG93ZXJfbGltaXQgPSByZWd1bGF0b3J5LT5tYXhfcG93ZXJfbGV2ZWw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19lZXByb20uaAppbmRleCA2MzM1YTg2Li5iYjIyM2ZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX2VlcHJvbS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfZWVwcm9tLmgKQEAgLTIxNiwxMCArMjE2LDggQEAKIAl1OCBzcHVyQ2hhbnNbQVJfRUVQUk9NX01PREFMX1NQVVJTXTsKIAkvKiAzICBDaGVjayBpZiB0aGUgcmVnaXN0ZXIgaXMgcGVyIGNoYWluICovCiAJaW50OF90IG5vaXNlRmxvb3JUaHJlc2hDaFtBUjkzMDBfTUFYX0NIQUlOU107Ci0JdTggb2JbQVI5MzAwX01BWF9DSEFJTlNdOwotCXU4IGRiX3N0YWdlMltBUjkzMDBfTUFYX0NIQUlOU107Ci0JdTggZGJfc3RhZ2UzW0FSOTMwMF9NQVhfQ0hBSU5TXTsKLQl1OCBkYl9zdGFnZTRbQVI5MzAwX01BWF9DSEFJTlNdOworCXU4IHJlc2VydmVkWzExXTsKKwlpbnQ4X3QgcXVpY2tfZHJvcDsKIAl1OCB4cGFCaWFzTHZsOwogCXU4IHR4RnJhbWVUb0RhdGFTdGFydDsKIAl1OCB0eEZyYW1lVG9QYU9uOwpAQCAtMjY5LDcgKzI2Nyw5IEBACiAKIHN0cnVjdCBhcjkzMDBfQmFzZUV4dGVuc2lvbl8xIHsKIAl1OCBhbnRfZGl2X2NvbnRyb2w7Ci0JdTggZnV0dXJlWzEzXTsKKwl1OCBmdXR1cmVbMTFdOworCWludDhfdCBxdWlja19kcm9wX2xvdzsKKwlpbnQ4X3QgcXVpY2tfZHJvcF9oaWdoOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IGFyOTMwMF9CYXNlRXh0ZW5zaW9uXzIgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmMKaW5kZXggY2NkZTc4NC4uODhjODFjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21hYy5jCkBAIC0xNzUsMjAgKzE3NSwyNCBAQAogCXUzMiBpc3IgPSAwOwogCXUzMiBtYXNrMiA9IDA7CiAJc3RydWN0IGF0aDlrX2h3X2NhcGFiaWxpdGllcyAqcENhcCA9ICZhaC0+Y2FwczsKLQl1MzIgc3luY19jYXVzZSA9IDA7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiBzeW5jX2NhdXNlID0gMCwgYXN5bmNfY2F1c2U7CiAKLQlpZiAoUkVHX1JFQUQoYWgsIEFSX0lOVFJfQVNZTkNfQ0FVU0UpICYgQVJfSU5UUl9NQUNfSVJRKSB7CisJYXN5bmNfY2F1c2UgPSBSRUdfUkVBRChhaCwgQVJfSU5UUl9BU1lOQ19DQVVTRSk7CisKKwlpZiAoYXN5bmNfY2F1c2UgJiAoQVJfSU5UUl9NQUNfSVJRIHwgQVJfSU5UUl9BU1lOQ19NQVNLX01DSSkpIHsKIAkJaWYgKChSRUdfUkVBRChhaCwgQVJfUlRDX1NUQVRVUykgJiBBUl9SVENfU1RBVFVTX00pCiAJCQkJPT0gQVJfUlRDX1NUQVRVU19PTikKIAkJCWlzciA9IFJFR19SRUFEKGFoLCBBUl9JU1IpOwogCX0KIAorCiAJc3luY19jYXVzZSA9IFJFR19SRUFEKGFoLCBBUl9JTlRSX1NZTkNfQ0FVU0UpICYgQVJfSU5UUl9TWU5DX0RFRkFVTFQ7CiAKIAkqbWFza2VkID0gMDsKIAotCWlmICghaXNyICYmICFzeW5jX2NhdXNlKQorCWlmICghaXNyICYmICFzeW5jX2NhdXNlICYmICFhc3luY19jYXVzZSkKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGlzcikgewpAQCAtMjk0LDYgKzI5OCwzMyBAQAogCQkJYXI5MDAzX2h3X2JiX3dhdGNoZG9nX3JlYWQoYWgpOwogCX0KIAorCWlmIChhc3luY19jYXVzZSAmIEFSX0lOVFJfQVNZTkNfTUFTS19NQ0kpIHsKKwkJdTMyIHJhd19pbnRyLCByeF9tc2dfaW50cjsKKworCQlyeF9tc2dfaW50ciA9IFJFR19SRUFEKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcpOworCQlyYXdfaW50ciA9IFJFR19SRUFEKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVyk7CisKKwkJaWYgKChyYXdfaW50ciA9PSAweGRlYWRiZWVmKSB8fCAocnhfbXNnX2ludHIgPT0gMHhkZWFkYmVlZikpCisJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJCSJNQ0kgZ2V0cyAweGRlYWRiZWVmIGR1cmluZyBNQ0kgaW50IHByb2Nlc3NpbmcgbmV3IHJhd19pbnRyPTB4JTA4eCwgbmV3IHJ4X21zZ19yYXc9MHglMDh4LCByYXdfaW50cj0weCUwOHgsIHJ4X21zZ19yYXc9MHglMDh4XG4iLAorCQkJCXJhd19pbnRyLCByeF9tc2dfaW50ciwgbWNpLT5yYXdfaW50ciwKKwkJCQltY2ktPnJ4X21zZ19pbnRyKTsKKwkJZWxzZSB7CisJCQltY2ktPnJ4X21zZ19pbnRyIHw9IHJ4X21zZ19pbnRyOworCQkJbWNpLT5yYXdfaW50ciB8PSByYXdfaW50cjsKKwkJCSptYXNrZWQgfD0gQVRIOUtfSU5UX01DSTsKKworCQkJaWYgKHJ4X21zZ19pbnRyICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9JTkZPKQorCQkJCW1jaS0+Y29udF9zdGF0dXMgPQorCQkJCQlSRUdfUkVBRChhaCwgQVJfTUNJX0NPTlRfU1RBVFVTKTsKKworCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsIHJ4X21zZ19pbnRyKTsKKwkJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcsIHJhd19pbnRyKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJBUl9JTlRSX1NZTkNfTUNJXG4iKTsKKworCQl9CisJfQorCiAJaWYgKHN5bmNfY2F1c2UpIHsKIAkJaWYgKHN5bmNfY2F1c2UgJiBBUl9JTlRSX1NZTkNfUkFETV9DUExfVElNRU9VVCkgewogCQkJUkVHX1dSSVRFKGFoLCBBUl9SQywgQVJfUkNfSE9TVElGKTsKQEAgLTMwMiw3ICszMzMsNyBAQAogCQl9CiAKIAkJaWYgKHN5bmNfY2F1c2UgJiBBUl9JTlRSX1NZTkNfTE9DQUxfVElNRU9VVCkKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0lOVEVSUlVQVCwKKwkJCWF0aF9kYmcoY29tbW9uLCBJTlRFUlJVUFQsCiAJCQkJIkFSX0lOVFJfU1lOQ19MT0NBTF9USU1FT1VUXG4iKTsKIAogCQlSRUdfV1JJVEUoYWgsIEFSX0lOVFJfU1lOQ19DQVVTRV9DTFIsIHN5bmNfY2F1c2UpOwpAQCAtMzMzLDcgKzM2NCw3IEBACiAKIAlpZiAoKE1TKGFkcy0+ZHNfaW5mbywgQVJfRGVzY0lkKSAhPSBBVEhFUk9TX1ZFTkRPUl9JRCkgfHwKIAkgICAgKE1TKGFkcy0+ZHNfaW5mbywgQVJfVHhSeERlc2MpICE9IDEpKSB7Ci0JCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19YTUlULAorCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIFhNSVQsCiAJCQkiVHggRGVzY3JpcHRvciBlcnJvciAleFxuIiwgYWRzLT5kc19pbmZvKTsKIAkJbWVtc2V0KGFkcywgMCwgc2l6ZW9mKCphZHMpKTsKIAkJcmV0dXJuIC1FSU87CkBAIC01NDEsNyArNTcyLDcgQEAKIAltZW1zZXQoKHZvaWQgKikgYWgtPnRzX3JpbmcsIDAsCiAJCWFoLT50c19zaXplICogc2l6ZW9mKHN0cnVjdCBhcjkwMDNfdHhzKSk7CiAKLQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfWE1JVCwKKwlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIFhNSVQsCiAJCSJUUyBTdGFydCAweCV4IEVuZCAweCV4IFZpcnQgJXAsIFNpemUgJWRcbiIsCiAJCWFoLT50c19wYWRkcl9zdGFydCwgYWgtPnRzX3BhZGRyX2VuZCwKIAkJYWgtPnRzX3JpbmcsIGFoLT50c19zaXplKTsKQEAgLTU1Miw3ICs1ODMsNyBAQAogCiB2b2lkIGF0aDlrX2h3X3NldHVwX3N0YXR1c3Jpbmcoc3RydWN0IGF0aF9odyAqYWgsIHZvaWQgKnRzX3N0YXJ0LAogCQkJICAgICAgIHUzMiB0c19wYWRkcl9zdGFydCwKLQkJCSAgICAgICB1OCBzaXplKQorCQkJICAgICAgIHUxNiBzaXplKQogewogCiAJYWgtPnRzX3BhZGRyX3N0YXJ0ID0gdHNfcGFkZHJfc3RhcnQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21hYy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tYWMuaAppbmRleCBjNTA0NDkzLi5lMjAzYjUxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX21hYy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWFjLmgKQEAgLTExOCw1ICsxMTgsNSBAQAogdm9pZCBhdGg5a19od19yZXNldF90eHN0YXR1c19yaW5nKHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXRoOWtfaHdfc2V0dXBfc3RhdHVzcmluZyhzdHJ1Y3QgYXRoX2h3ICphaCwgdm9pZCAqdHNfc3RhcnQsCiAJCQkgICAgICAgdTMyIHRzX3BhZGRyX3N0YXJ0LAotCQkJICAgICAgIHU4IHNpemUpOworCQkJICAgICAgIHUxNiBzaXplKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA5NTIwYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmMKQEAgLTAsMCArMSwxNDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTEgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgImh3LmgiCisjaW5jbHVkZSAiYXI5MDAzX3BoeS5oIgorI2luY2x1ZGUgImFyOTAwM19tY2kuaCIKKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9yZXNldF9yZXFfd2FrZXVwKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCWlmICghQVJfU1JFVl85NDYyXzIwKGFoKSkKKwkJcmV0dXJuOworCisJUkVHX1JNV19GSUVMRChhaCwgQVJfTUNJX0NPTU1BTkQyLAorCQkgICAgICBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUkVRX1dBS0VVUCwgMSk7CisJdWRlbGF5KDEpOworCVJFR19STVdfRklFTEQoYWgsIEFSX01DSV9DT01NQU5EMiwKKwkJICAgICAgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JFUV9XQUtFVVAsIDApOworfQorCitzdGF0aWMgaW50IGFyOTAwM19tY2lfd2FpdF9mb3JfaW50ZXJydXB0KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgYWRkcmVzcywKKwkJCQkJdTMyIGJpdF9wb3NpdGlvbiwgaW50IHRpbWVfb3V0KQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCisJd2hpbGUgKHRpbWVfb3V0KSB7CisKKwkJaWYgKFJFR19SRUFEKGFoLCBhZGRyZXNzKSAmIGJpdF9wb3NpdGlvbikgeworCisJCQlSRUdfV1JJVEUoYWgsIGFkZHJlc3MsIGJpdF9wb3NpdGlvbik7CisKKwkJCWlmIChhZGRyZXNzID09IEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JBVykgeworCisJCQkJaWYgKGJpdF9wb3NpdGlvbiAmCisJCQkJICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFKQorCQkJCQlhcjkwMDNfbWNpX3Jlc2V0X3JlcV93YWtldXAoYWgpOworCisJCQkJaWYgKGJpdF9wb3NpdGlvbiAmCisJCQkJICAgIChBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfU0xFRVBJTkcgfAorCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1dBS0lORykpCisJCQkJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcsCisJCQkJCUFSX01DSV9JTlRFUlJVUFRfUkVNT1RFX1NMRUVQX1VQREFURSk7CisKKwkJCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfUkFXLAorCQkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJdWRlbGF5KDEwKTsKKwkJdGltZV9vdXQgLT0gMTA7CisKKwkJaWYgKHRpbWVfb3V0IDwgMCkKKwkJCWJyZWFrOworCX0KKworCWlmICh0aW1lX291dCA8PSAwKSB7CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkiTUNJIFdhaXQgZm9yIFJlZyAweCUwOHggPSAweCUwOHggdGltZW91dFxuIiwKKwkJCWFkZHJlc3MsIGJpdF9wb3NpdGlvbik7CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkiTUNJIElOVF9SQVcgPSAweCUwOHgsIFJYX01TR19SQVcgPSAweCUwOHhcbiIsCisJCQlSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcpLAorCQkJUkVHX1JFQUQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JBVykpOworCQl0aW1lX291dCA9IDA7CisJfQorCisJcmV0dXJuIHRpbWVfb3V0OworfQorCit2b2lkIGFyOTAwM19tY2lfcmVtb3RlX3Jlc2V0KHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSkKK3sKKwl1MzIgcGF5bG9hZFs0XSA9IHsgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmZmZiwgMHhmZmZmZmYwMH07CisKKwlpZiAoIUFUSDlLX0hXX0NBUF9NQ0kpCisJCXJldHVybjsKKworCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfUkVNT1RFX1JFU0VULCAwLCBwYXlsb2FkLCAxNiwKKwkJCQl3YWl0X2RvbmUsIGZhbHNlKTsKKwl1ZGVsYXkoNSk7Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9zZW5kX2xuYV90cmFuc2ZlcihzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJdTMyIHBheWxvYWQgPSAweDAwMDAwMDAwOworCisJaWYgKCFBVEg5S19IV19DQVBfTUNJKQorCQlyZXR1cm47CisKKwlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX0xOQV9UUkFOUywgMCwgJnBheWxvYWQsIDEsCisJCQkJd2FpdF9kb25lLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfc2VuZF9yZXFfd2FrZShzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9SRVFfV0FLRSwgTUNJX0ZMQUdfRElTQUJMRV9USU1FU1RBTVAsCisJCQkJTlVMTCwgMCwgd2FpdF9kb25lLCBmYWxzZSk7CisJdWRlbGF5KDUpOworfQorCit2b2lkIGFyOTAwM19tY2lfc2VuZF9zeXNfd2FraW5nKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSkKK3sKKwlpZiAoIUFUSDlLX0hXX0NBUF9NQ0kpCisJCXJldHVybjsKKworCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfU1lTX1dBS0lORywgTUNJX0ZMQUdfRElTQUJMRV9USU1FU1RBTVAsCisJCQkJTlVMTCwgMCwgd2FpdF9kb25lLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfc2VuZF9sbmFfdGFrZShzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJdTMyIHBheWxvYWQgPSAweDcwMDAwMDAwOworCisJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9MTkFfVEFLRSwgMCwgJnBheWxvYWQsIDEsCisJCQkJd2FpdF9kb25lLCBmYWxzZSk7Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfc2VuZF9zeXNfc2xlZXBpbmcoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgd2FpdF9kb25lKQoreworCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfU1lTX1NMRUVQSU5HLAorCQkJCU1DSV9GTEFHX0RJU0FCTEVfVElNRVNUQU1QLAorCQkJCU5VTEwsIDAsIHdhaXRfZG9uZSwgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX3NlbmRfY29leF92ZXJzaW9uX3F1ZXJ5KHN0cnVjdCBhdGhfaHcgKmFoLAorCQkJCQkgICAgICAgYm9vbCB3YWl0X2RvbmUpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiBwYXlsb2FkWzRdID0gezAsIDAsIDAsIDB9OworCisJaWYgKCFtY2ktPmJ0X3ZlcnNpb25fa25vd24gJiYKKwkJCShtY2ktPmJ0X3N0YXRlICE9IE1DSV9CVF9TTEVFUCkpIHsKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBTZW5kIENvZXggdmVyc2lvbiBxdWVyeVxuIik7CisJCU1DSV9HUE1fU0VUX1RZUEVfT1BDT0RFKHBheWxvYWQsCisJCQkJTUNJX0dQTV9DT0VYX0FHRU5ULCBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9RVUVSWSk7CisJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLCAxNiwKKwkJCQl3YWl0X2RvbmUsIHRydWUpOworCX0KK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9zZW5kX2NvZXhfdmVyc2lvbl9yZXNwb25zZShzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJCSAgICAgYm9vbCB3YWl0X2RvbmUpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiBwYXlsb2FkWzRdID0gezAsIDAsIDAsIDB9OworCisJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBTZW5kIENvZXggdmVyc2lvbiByZXNwb25zZVxuIik7CisJTUNJX0dQTV9TRVRfVFlQRV9PUENPREUocGF5bG9hZCwgTUNJX0dQTV9DT0VYX0FHRU5ULAorCQkJTUNJX0dQTV9DT0VYX1ZFUlNJT05fUkVTUE9OU0UpOworCSooKCh1OCAqKXBheWxvYWQpICsgTUNJX0dQTV9DT0VYX0JfTUFKT1JfVkVSU0lPTikgPQorCQltY2ktPndsYW5fdmVyX21ham9yOworCSooKCh1OCAqKXBheWxvYWQpICsgTUNJX0dQTV9DT0VYX0JfTUlOT1JfVkVSU0lPTikgPQorCQltY2ktPndsYW5fdmVyX21pbm9yOworCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLCAxNiwgd2FpdF9kb25lLCB0cnVlKTsKK30KKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9zZW5kX2NvZXhfd2xhbl9jaGFubmVscyhzdHJ1Y3QgYXRoX2h3ICphaCwKKwkJCQkJCSAgYm9vbCB3YWl0X2RvbmUpCit7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiAqcGF5bG9hZCA9ICZtY2ktPndsYW5fY2hhbm5lbHNbMF07CisKKwlpZiAoKG1jaS0+d2xhbl9jaGFubmVsc191cGRhdGUgPT0gdHJ1ZSkgJiYKKwkJCShtY2ktPmJ0X3N0YXRlICE9IE1DSV9CVF9TTEVFUCkpIHsKKwkJTUNJX0dQTV9TRVRfVFlQRV9PUENPREUocGF5bG9hZCwKKwkJTUNJX0dQTV9DT0VYX0FHRU5ULCBNQ0lfR1BNX0NPRVhfV0xBTl9DSEFOTkVMUyk7CisJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLCAxNiwKKwkJCQkJd2FpdF9kb25lLCB0cnVlKTsKKwkJTUNJX0dQTV9TRVRfVFlQRV9PUENPREUocGF5bG9hZCwgMHhmZiwgMHhmZik7CisJfQorfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX3NlbmRfY29leF9idF9zdGF0dXNfcXVlcnkoc3RydWN0IGF0aF9odyAqYWgsCisJCQkJCQlib29sIHdhaXRfZG9uZSwgdTggcXVlcnlfdHlwZSkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIHBheWxvYWRbNF0gPSB7MCwgMCwgMCwgMH07CisJYm9vbCBxdWVyeV9idGluZm8gPSAhIShxdWVyeV90eXBlICYgKE1DSV9HUE1fQ09FWF9RVUVSWV9CVF9BTExfSU5GTyB8CisJCQkJCSAgICAgTUNJX0dQTV9DT0VYX1FVRVJZX0JUX1RPUE9MT0dZKSk7CisKKwlpZiAobWNpLT5idF9zdGF0ZSAhPSBNQ0lfQlRfU0xFRVApIHsKKworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIFNlbmQgQ29leCBCVCBTdGF0dXMgUXVlcnkgMHglMDJYXG4iLAorCQkJcXVlcnlfdHlwZSk7CisKKwkJTUNJX0dQTV9TRVRfVFlQRV9PUENPREUocGF5bG9hZCwKKwkJCQlNQ0lfR1BNX0NPRVhfQUdFTlQsIE1DSV9HUE1fQ09FWF9TVEFUVVNfUVVFUlkpOworCisJCSooKCh1OCAqKXBheWxvYWQpICsgTUNJX0dQTV9DT0VYX0JfQlRfQklUTUFQKSA9IHF1ZXJ5X3R5cGU7CisJCS8qCisJCSAqIElmIGJ0X3N0YXR1c19xdWVyeSBtZXNzYWdlIGlzICBub3Qgc2VudCBzdWNjZXNzZnVsbHksCisJCSAqIHRoZW4gbmVlZF9mbHVzaF9idGluZm8gc2hvdWxkIGJlIHNldCBhZ2Fpbi4KKwkJICovCisJCWlmICghYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBheWxvYWQsIDE2LAorCQkJCQkgICAgIHdhaXRfZG9uZSwgdHJ1ZSkpIHsKKwkJCWlmIChxdWVyeV9idGluZm8pIHsKKwkJCQltY2ktPm5lZWRfZmx1c2hfYnRpbmZvID0gdHJ1ZTsKKworCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJCSJNQ0kgc2VuZCBidF9zdGF0dXNfcXVlcnkgZmFpbCwgc2V0IGZsdXNoIGZsYWcgYWdhaW5cbiIpOworCQkJfQorCQl9CisKKwkJaWYgKHF1ZXJ5X2J0aW5mbykKKwkJCW1jaS0+cXVlcnlfYnQgPSBmYWxzZTsKKwl9Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9zZW5kX2NvZXhfaGFsdF9idF9ncG0oc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgaGFsdCwKKwkJCQkgICAgICBib29sIHdhaXRfZG9uZSkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIHBheWxvYWRbNF0gPSB7MCwgMCwgMCwgMH07CisKKwlpZiAoIUFUSDlLX0hXX0NBUF9NQ0kpCisJCXJldHVybjsKKworCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgU2VuZCBDb2V4ICVzIEJUIEdQTVxuIiwKKwkJKGhhbHQpID8gImhhbHQiIDogInVuaGFsdCIpOworCisJTUNJX0dQTV9TRVRfVFlQRV9PUENPREUocGF5bG9hZCwKKwkJCQlNQ0lfR1BNX0NPRVhfQUdFTlQsIE1DSV9HUE1fQ09FWF9IQUxUX0JUX0dQTSk7CisKKwlpZiAoaGFsdCkgeworCQltY2ktPnF1ZXJ5X2J0ID0gdHJ1ZTsKKwkJLyogU2VuZCBuZXh0IHVuaGFsdCBubyBtYXR0ZXIgaGFsdCBzZW50IG9yIG5vdCAqLworCQltY2ktPnVuaGFsdF9idF9ncG0gPSB0cnVlOworCQltY2ktPm5lZWRfZmx1c2hfYnRpbmZvID0gdHJ1ZTsKKwkJKigoKHU4ICopcGF5bG9hZCkgKyBNQ0lfR1BNX0NPRVhfQl9IQUxUX1NUQVRFKSA9CisJCQlNQ0lfR1BNX0NPRVhfQlRfR1BNX0hBTFQ7CisJfSBlbHNlCisJCSooKCh1OCAqKXBheWxvYWQpICsgTUNJX0dQTV9DT0VYX0JfSEFMVF9TVEFURSkgPQorCQkJTUNJX0dQTV9DT0VYX0JUX0dQTV9VTkhBTFQ7CisKKwlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX0dQTSwgMCwgcGF5bG9hZCwgMTYsIHdhaXRfZG9uZSwgdHJ1ZSk7Cit9CisKKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9wcmVwX2ludGVyZmFjZShzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIHNhdmVkX21jaV9pbnRfZW47CisJdTMyIG1jaV90aW1lb3V0ID0gMTUwOworCisJbWNpLT5idF9zdGF0ZSA9IE1DSV9CVF9TTEVFUDsKKwlzYXZlZF9tY2lfaW50X2VuID0gUkVHX1JFQUQoYWgsIEFSX01DSV9JTlRFUlJVUFRfRU4pOworCisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX0VOLCAwKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JBVywKKwkJICBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXKSk7CisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVywKKwkJICBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcpKTsKKworCS8qIFJlbW90ZSBSZXNldCAqLworCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgUmVzZXQgc2VxdWVuY2Ugc3RhcnRcbiIpOworCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgc2VuZCBSRU1PVEVfUkVTRVRcbiIpOworCWFyOTAwM19tY2lfcmVtb3RlX3Jlc2V0KGFoLCB0cnVlKTsKKworCS8qCisJICogVGhpcyBkZWxheSBpcyByZXF1aXJlZCBmb3IgdGhlIHJlc2V0IGRlbGF5IHdvcnN0IGNhc2UgdmFsdWUgMjU1IGluCisJICogTUNJX0NPTU1BTkQyIHJlZ2lzdGVyCisJICovCisKKwlpZiAoQVJfU1JFVl85NDYyXzEwKGFoKSkKKwkJdWRlbGF5KDI1Mik7CisKKwlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIFNlbmQgUkVRX1dBS0UgdG8gcmVtb3RlcihCVClcbiIpOworCWFyOTAwM19tY2lfc2VuZF9yZXFfd2FrZShhaCwgdHJ1ZSk7CisKKwlpZiAoYXI5MDAzX21jaV93YWl0X2Zvcl9pbnRlcnJ1cHQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JBVywKKwkJCQlBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HLCA1MDApKSB7CisKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBTWVNfV0FLSU5HIGZyb20gcmVtb3RlKEJUKVxuIik7CisJCW1jaS0+YnRfc3RhdGUgPSBNQ0lfQlRfQVdBS0U7CisKKwkJaWYgKEFSX1NSRVZfOTQ2Ml8xMChhaCkpCisJCQl1ZGVsYXkoMTApOworCQkvKgorCQkgKiB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgbW9yZSByZW1vdGVfcmVzZXQgYXQgdGhpcyBtb21lbnQuCisJCSAqIElmIEJUIHJlY2VpdmUgZmlyc3QgcmVtb3RlX3Jlc2V0LCB0aGVuIEJUIEhXIHdpbGwKKwkJICogYmUgY2xlYW5lZCB1cCBhbmQgd2lsbCBiZSBhYmxlIHRvIHJlY2VpdmUgcmVxX3dha2UKKwkJICogYW5kIEJUIEhXIHdpbGwgcmVzcG9uZCBzeXNfd2FraW5nLgorCQkgKiBJbiB0aGlzIGNhc2UsIFdMQU4gd2lsbCByZWNlaXZlIEJUJ3MgSFcgc3lzX3dha2luZy4KKwkJICogT3RoZXJ3aXNlLCBpZiBCVCBTVyBtaXNzZWQgaW5pdGlhbCByZW1vdGVfcmVzZXQsCisJCSAqIHRoYXQgcmVtb3RlX3Jlc2V0IHdpbGwgc3RpbGwgY2xlYW4gdXAgQlQgTUNJIFJYLAorCQkgKiBhbmQgdGhlIHJlcV93YWtlIHdpbGwgd2FrZSBCVCB1cCwKKwkJICogYW5kIEJUIFNXIHdpbGwgcmVzcG9uZCB0aGlzIHJlcV93YWtlIHdpdGggYSByZW1vdGVfcmVzZXQgYW5kCisJCSAqIHN5c193YWtpbmcuIEluIHRoaXMgY2FzZSwgV0xBTiB3aWxsIHJlY2VpdmUgQlQncyBTVworCQkgKiBzeXNfd2FraW5nLiBJbiBlaXRoZXIgY2FzZSwgQlQncyBSWCBpcyBjbGVhbmVkIHVwLiBTbyB3ZQorCQkgKiBkb24ndCBuZWVkIHRvIHJlcGx5IEJUJ3MgcmVtb3RlX3Jlc2V0IG5vdywgaWYgYW55LgorCQkgKiBTaW1pbGFybHksIGlmIGluIGFueSBjYXNlLCBXTEFOIGNhbiByZWNlaXZlIEJUJ3Mgc3lzX3dha2luZywKKwkJICogdGhhdCBtZWFucyBXTEFOJ3MgUlggaXMgYWxzbyBmaW5lLgorCQkgKi8KKworCQkvKiBTZW5kIFNZU19XQUtJTkcgdG8gQlQgKi8KKworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIHNlbmQgU1cgU1lTX1dBS0lORyB0byByZW1vdGUgQlRcbiIpOworCisJCWFyOTAwM19tY2lfc2VuZF9zeXNfd2FraW5nKGFoLCB0cnVlKTsKKwkJdWRlbGF5KDEwKTsKKworCQkvKgorCQkgKiBTZXQgQlQgcHJpb3JpdHkgaW50ZXJydXB0IHZhbHVlIHRvIGJlIDB4ZmYgdG8KKwkJICogYXZvaWQgaGF2aW5nIHRvbyBtYW55IEJUIFBSSU9SSVRZIGludGVycnVwdHMuCisJCSAqLworCisJCVJFR19XUklURShhaCwgQVJfTUNJX0JUX1BSSTAsIDB4RkZGRkZGRkYpOworCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9CVF9QUkkxLCAweEZGRkZGRkZGKTsKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQlRfUFJJMiwgMHhGRkZGRkZGRik7CisJCVJFR19XUklURShhaCwgQVJfTUNJX0JUX1BSSTMsIDB4RkZGRkZGRkYpOworCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9CVF9QUkksIDBYMDAwMDAwRkYpOworCisJCS8qCisJCSAqIEEgY29udGVudGlvbiByZXNldCB3aWxsIGJlIHJlY2VpdmVkIGFmdGVyIHNlbmQgb3V0CisJCSAqIHN5c193YWtpbmcuIEFsc28gQlQgcHJpb3JpdHkgaW50ZXJydXB0IGJpdHMgd2lsbCBiZSBzZXQuCisJCSAqIENsZWFyIHRob3NlIGJpdHMgYmVmb3JlIHRoZSBuZXh0IHN0ZXAuCisJCSAqLworCisJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXLAorCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVCk7CisJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcsCisJCQkgIEFSX01DSV9JTlRFUlJVUFRfQlRfUFJJKTsKKworCQlpZiAoQVJfU1JFVl85NDYyXzEwKGFoKSB8fCBtY2ktPmlzXzJnKSB7CisJCQkvKiBTZW5kIExOQV9UUkFOUyAqLworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBzZW5kIExOQV9UUkFOUyB0byBCVFxuIik7CisJCQlhcjkwMDNfbWNpX3NlbmRfbG5hX3RyYW5zZmVyKGFoLCB0cnVlKTsKKwkJCXVkZWxheSg1KTsKKwkJfQorCisJCWlmIChBUl9TUkVWXzk0NjJfMTAoYWgpIHx8IChtY2ktPmlzXzJnICYmCisJCQkJCSAgICAhbWNpLT51cGRhdGVfMmc1ZykpIHsKKwkJCWlmIChhcjkwMDNfbWNpX3dhaXRfZm9yX2ludGVycnVwdChhaCwKKwkJCQlBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0lORk8sCisJCQkJbWNpX3RpbWVvdXQpKQorCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJCSJNQ0kgV0xBTiBoYXMgY29udHJvbCBvdmVyIHRoZSBMTkEgJiBCVCBvYmV5cyBpdFxuIik7CisJCQllbHNlCisJCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkJIk1DSSBCVCBkaWRuJ3QgcmVzcG9uZCB0byBMTkFfVFJBTlNcbiIpOworCQl9CisKKwkJaWYgKEFSX1NSRVZfOTQ2Ml8xMChhaCkpIHsKKwkJCS8qIFNlbmQgYW5vdGhlciByZW1vdGVfcmVzZXQgdG8gZGVhc3NlcnQgQlQgY2xrX3JlcS4gKi8KKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJIk1DSSBhbm90aGVyIHJlbW90ZV9yZXNldCB0byBkZWFzc2VydCBjbGtfcmVxXG4iKTsKKwkJCWFyOTAwM19tY2lfcmVtb3RlX3Jlc2V0KGFoLCB0cnVlKTsKKwkJCXVkZWxheSgyNTIpOworCQl9CisJfQorCisJLyogQ2xlYXIgdGhlIGV4dHJhIHJlZHVuZGFudCBTWVNfV0FLSU5HIGZyb20gQlQgKi8KKwlpZiAoKG1jaS0+YnRfc3RhdGUgPT0gTUNJX0JUX0FXQUtFKSAmJgorCQkoUkVHX1JFQURfRklFTEQoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JBVywKKwkJCQlBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HKSkgJiYKKwkJKFJFR19SRUFEX0ZJRUxEKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkJQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1NMRUVQSU5HKSA9PSAwKSkgeworCisJCQlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JBVywKKwkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkcpOworCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVywKKwkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUkVNT1RFX1NMRUVQX1VQREFURSk7CisJfQorCisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX0VOLCBzYXZlZF9tY2lfaW50X2VuKTsKK30KKwordm9pZCBhcjkwMDNfbWNpX2Rpc2FibGVfaW50ZXJydXB0KHN0cnVjdCBhdGhfaHcgKmFoKQoreworCWlmICghQVRIOUtfSFdfQ0FQX01DSSkKKwkJcmV0dXJuOworCisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX0VOLCAwKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0VOLCAwKTsKK30KKwordm9pZCBhcjkwMDNfbWNpX2VuYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGF0aF9odyAqYWgpCit7CisJaWYgKCFBVEg5S19IV19DQVBfTUNJKQorCQlyZXR1cm47CisKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9JTlRFUlJVUFRfRU4sIEFSX01DSV9JTlRFUlJVUFRfREVGQVVMVCk7CisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19FTiwKKwkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19ERUZBVUxUKTsKK30KKworYm9vbCBhcjkwMDNfbWNpX2NoZWNrX2ludChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGludHMpCit7CisJdTMyIGludHI7CisKKwlpZiAoIUFUSDlLX0hXX0NBUF9NQ0kpCisJCXJldHVybiBmYWxzZTsKKworCWludHIgPSBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXKTsKKwlyZXR1cm4gKChpbnRyICYgaW50cykgPT0gaW50cyk7Cit9CisKK3ZvaWQgYXI5MDAzX21jaV9nZXRfaW50ZXJydXB0KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgKnJhd19pbnRyLAorCQkJICAgICAgdTMyICpyeF9tc2dfaW50cikKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisKKwlpZiAoIUFUSDlLX0hXX0NBUF9NQ0kpCisJCXJldHVybjsKKworCSpyYXdfaW50ciA9IG1jaS0+cmF3X2ludHI7CisJKnJ4X21zZ19pbnRyID0gbWNpLT5yeF9tc2dfaW50cjsKKworCS8qIENsZWFuIGludCBiaXRzIGFmdGVyIHRoZSB2YWx1ZXMgYXJlIHJlYWQuICovCisJbWNpLT5yYXdfaW50ciA9IDA7CisJbWNpLT5yeF9tc2dfaW50ciA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKGFyOTAwM19tY2lfZ2V0X2ludGVycnVwdCk7CisKK3ZvaWQgYXI5MDAzX21jaV8yZzVnX2NoYW5nZWQoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgaXNfMmcpCit7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCisJaWYgKCFBVEg5S19IV19DQVBfTUNJKQorCQlyZXR1cm47CisKKwlpZiAoIW1jaS0+dXBkYXRlXzJnNWcgJiYKKwkgICAgKG1jaS0+aXNfMmcgIT0gaXNfMmcpKQorCQltY2ktPnVwZGF0ZV8yZzVnID0gdHJ1ZTsKKworCW1jaS0+aXNfMmcgPSBpc18yZzsKK30KKworc3RhdGljIGJvb2wgYXI5MDAzX21jaV9pc19ncG1fdmFsaWQoc3RydWN0IGF0aF9odyAqYWgsIHUzMiBtc2dfaW5kZXgpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiAqcGF5bG9hZDsKKwl1MzIgcmVjdl90eXBlLCBvZmZzZXQ7CisKKwlpZiAobXNnX2luZGV4ID09IE1DSV9HUE1fSU5WQUxJRCkKKwkJcmV0dXJuIGZhbHNlOworCisJb2Zmc2V0ID0gbXNnX2luZGV4IDw8IDQ7CisKKwlwYXlsb2FkID0gKHUzMiAqKShtY2ktPmdwbV9idWYgKyBvZmZzZXQpOworCXJlY3ZfdHlwZSA9IE1DSV9HUE1fVFlQRShwYXlsb2FkKTsKKworCWlmIChyZWN2X3R5cGUgPT0gTUNJX0dQTV9SU1ZEX1BBVFRFUk4pIHsKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBTa2lwIFJTVkQgR1BNXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX29ic2VydmF0aW9uX3NldF91cChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJaWYgKG1jaS0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfTUNJX09CU19NQ0kpIHsKKworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAzLAorCQkJCQlBUl9HUElPX09VVFBVVF9NVVhfQVNfTUNJX1dMQU5fREFUQSk7CisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDIsIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfV0xBTl9DTEspOworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAxLCBBUl9HUElPX09VVFBVVF9NVVhfQVNfTUNJX0JUX0RBVEEpOworCQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCAwLCBBUl9HUElPX09VVFBVVF9NVVhfQVNfTUNJX0JUX0NMSyk7CisKKwl9IGVsc2UgaWYgKG1jaS0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfTUNJX09CU19UWFJYKSB7CisKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMywgQVJfR1BJT19PVVRQVVRfTVVYX0FTX1dMX0lOX1RYKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMiwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX1dMX0lOX1JYKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMSwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX0JUX0lOX1RYKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgMCwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX0JUX0lOX1JYKTsKKwkJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgNSwgQVJfR1BJT19PVVRQVVRfTVVYX0FTX09VVFBVVCk7CisKKwl9IGVsc2UgaWYgKG1jaS0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfTUNJX09CU19CVCkgeworCisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDMsIEFSX0dQSU9fT1VUUFVUX01VWF9BU19CVF9JTl9UWCk7CisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDIsIEFSX0dQSU9fT1VUUFVUX01VWF9BU19CVF9JTl9SWCk7CisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDEsIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfQlRfREFUQSk7CisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIDAsIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfQlRfQ0xLKTsKKworCX0gZWxzZQorCQlyZXR1cm47CisKKwlSRUdfU0VUX0JJVChhaCwgQVJfR1BJT19JTlBVVF9FTl9WQUwsIEFSX0dQSU9fSlRBR19ESVNBQkxFKTsKKworCWlmIChBUl9TUkVWXzk0NjJfMjBfT1JfTEFURVIoYWgpKSB7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX1BIWV9HTEJfQ09OVFJPTCwKKwkJCSAgICAgIEFSX0dMQl9EU19KVEFHX0RJU0FCTEUsIDEpOworCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QSFlfR0xCX0NPTlRST0wsCisJCQkgICAgICBBUl9HTEJfV0xBTl9VQVJUX0lOVEZfRU4sIDApOworCQlSRUdfU0VUX0JJVChhaCwgQVJfR0xCX0dQSU9fQ09OVFJPTCwKKwkJCSAgICBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0dQSU8pOworCX0KKworCVJFR19STVdfRklFTEQoYWgsIEFSX0JUQ09FWF9DVFJMMiwgQVJfQlRDT0VYX0NUUkwyX0dQSU9fT0JTX1NFTCwgMCk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfQlRDT0VYX0NUUkwyLCBBUl9CVENPRVhfQ1RSTDJfTUFDX0JCX09CU19TRUwsIDEpOworCVJFR19XUklURShhaCwgQVJfT0JTLCAweDRiKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9ESUFHX1NXLCBBUl9ESUFHX09CU19QVF9TRUwxLCAweDAzKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9ESUFHX1NXLCBBUl9ESUFHX09CU19QVF9TRUwyLCAweDAxKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQUNNSVNDLCBBUl9NQUNNSVNDX01JU0NfT0JTX0JVU19MU0IsIDB4MDIpOworCVJFR19STVdfRklFTEQoYWgsIEFSX01BQ01JU0MsIEFSX01BQ01JU0NfTUlTQ19PQlNfQlVTX01TQiwgMHgwMyk7CisJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX1RFU1RfQ1RMX1NUQVRVUywKKwkJICAgICAgQVJfUEhZX1RFU1RfQ1RMX0RFQlVHUE9SVF9TRUwsIDB4MDcpOworfQorCitzdGF0aWMgYm9vbCBhcjkwMDNfbWNpX3NlbmRfY29leF9idF9mbGFncyhzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUsCisJCQkJCQl1OCBvcGNvZGUsIHUzMiBidF9mbGFncykKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwl1MzIgcGxkWzRdID0gezAsIDAsIDAsIDB9OworCisJTUNJX0dQTV9TRVRfVFlQRV9PUENPREUocGxkLAorCQkJTUNJX0dQTV9DT0VYX0FHRU5ULCBNQ0lfR1BNX0NPRVhfQlRfVVBEQVRFX0ZMQUdTKTsKKworCSooKCh1OCAqKXBsZCkgKyBNQ0lfR1BNX0NPRVhfQl9CVF9GTEFHU19PUCkgID0gb3Bjb2RlOworCSooKCh1OCAqKXBsZCkgKyBNQ0lfR1BNX0NPRVhfV19CVF9GTEFHUyArIDApID0gYnRfZmxhZ3MgJiAweEZGOworCSooKCh1OCAqKXBsZCkgKyBNQ0lfR1BNX0NPRVhfV19CVF9GTEFHUyArIDEpID0gKGJ0X2ZsYWdzID4+IDgpICYgMHhGRjsKKwkqKCgodTggKilwbGQpICsgTUNJX0dQTV9DT0VYX1dfQlRfRkxBR1MgKyAyKSA9IChidF9mbGFncyA+PiAxNikgJiAweEZGOworCSooKCh1OCAqKXBsZCkgKyBNQ0lfR1BNX0NPRVhfV19CVF9GTEFHUyArIDMpID0gKGJ0X2ZsYWdzID4+IDI0KSAmIDB4RkY7CisKKwlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkiTUNJIEJUX01DSV9GTEFHUzogU2VuZCBDb2V4IEJUIFVwZGF0ZSBGbGFncyAlcyAweCUwOHhcbiIsCisJCW9wY29kZSA9PSBNQ0lfR1BNX0NPRVhfQlRfRkxBR1NfUkVBRCA/ICJSRUFEIiA6CisJCW9wY29kZSA9PSBNQ0lfR1BNX0NPRVhfQlRfRkxBR1NfU0VUID8gIlNFVCIgOiAiQ0xFQVIiLAorCQlidF9mbGFncyk7CisKKwlyZXR1cm4gYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9HUE0sIDAsIHBsZCwgMTYsCisJCQkJCQkJd2FpdF9kb25lLCB0cnVlKTsKK30KKwordm9pZCBhcjkwMDNfbWNpX3Jlc2V0KHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIGVuX2ludCwgYm9vbCBpc18yZywKKwkJICAgICAgYm9vbCBpc19mdWxsX3NsZWVwKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgcmVndmFsLCB0aHJlc2g7CisKKwlpZiAoIUFUSDlLX0hXX0NBUF9NQ0kpCisJCXJldHVybjsKKworCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgZnVsbF9zbGVlcCA9ICVkLCBpc18yZyA9ICVkXG4iLAorCQlpc19mdWxsX3NsZWVwLCBpc18yZyk7CisKKwkvKgorCSAqIEdQTSBidWZmZXIgYW5kIHNjaGVkdWxpbmcgbWVzc2FnZSBidWZmZXIgYXJlIG5vdCBhbGxvY2F0ZWQKKwkgKi8KKworCWlmICghbWNpLT5ncG1fYWRkciAmJiAhbWNpLT5zY2hlZF9hZGRyKSB7CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkiTUNJIEdQTSBhbmQgc2NoZWR1bGUgYnVmZmVycyBhcmUgbm90IGFsbG9jYXRlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoUkVHX1JFQUQoYWgsIEFSX0JUQ09FWF9DVFJMKSA9PSAweGRlYWRiZWVmKSB7CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgaXQncyBkZWFkYmVlZiwgcXVpdCBtY2lfcmVzZXRcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogUHJvZ3JhbSBNQ0kgRE1BIHJlbGF0ZWQgcmVnaXN0ZXJzICovCisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfR1BNXzAsIG1jaS0+Z3BtX2FkZHIpOworCVJFR19XUklURShhaCwgQVJfTUNJX0dQTV8xLCBtY2ktPmdwbV9sZW4pOworCVJFR19XUklURShhaCwgQVJfTUNJX1NDSERfVEFCTEVfMCwgbWNpLT5zY2hlZF9hZGRyKTsKKworCS8qCisJKiBUbyBhdm9pZCBNQ0kgc3RhdGUgbWFjaGluZSBiZSBhZmZlY3RlZCBieSBpbmNvbWluZyByZW1vdGUgTUNJIG1zZ3MsCisJKiBNQ0kgbW9kZSB3aWxsIGJlIGVuYWJsZWQgbGF0ZXIsIHJpZ2h0IGJlZm9yZSByZXNldCB0aGUgTUNJIFRYIGFuZCBSWC4KKwkqLworCisJcmVndmFsID0gU00oMSwgQVJfQlRDT0VYX0NUUkxfQVI5NDYyX01PREUpIHwKKwkJIFNNKDEsIEFSX0JUQ09FWF9DVFJMX1dCVElNRVJfRU4pIHwKKwkJIFNNKDEsIEFSX0JUQ09FWF9DVFJMX1BBX1NIQVJFRCkgfAorCQkgU00oMSwgQVJfQlRDT0VYX0NUUkxfTE5BX1NIQVJFRCkgfAorCQkgU00oMiwgQVJfQlRDT0VYX0NUUkxfTlVNX0FOVEVOTkFTKSB8CisJCSBTTSgzLCBBUl9CVENPRVhfQ1RSTF9SWF9DSEFJTl9NQVNLKSB8CisJCSBTTSgwLCBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0FDSykgfAorCQkgU00oMCwgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9CQ04pIHwKKwkJIFNNKDAsIEFSX0JUQ09FWF9DVFJMX09ORV9TVEVQX0xPT0tfQUhFQURfRU4pOworCisJaWYgKGlzXzJnICYmIChBUl9TUkVWXzk0NjJfMjAoYWgpKSAmJgorCQkhKG1jaS0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfRElTQUJMRV9PU0xBKSkgeworCisJCXJlZ3ZhbCB8PSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9PTkVfU1RFUF9MT09LX0FIRUFEX0VOKTsKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBzY2hlZCBvbmUgc3RlcCBsb29rIGFoZWFkXG4iKTsKKworCQlpZiAoIShtY2ktPmNvbmZpZyAmCisJCSAgICAgIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfQUdHUl9USFJFU0gpKSB7CisKKwkJCXRocmVzaCA9IE1TKG1jaS0+Y29uZmlnLAorCQkJCSAgICBBVEhfTUNJX0NPTkZJR19BR0dSX1RIUkVTSCk7CisJCQl0aHJlc2ggJj0gNzsKKwkJCXJlZ3ZhbCB8PSBTTSgxLAorCQkJCSAgICAgQVJfQlRDT0VYX0NUUkxfVElNRV9UT19ORVhUX0JUX1RIUkVTSF9FTik7CisJCQlyZWd2YWwgfD0gU00odGhyZXNoLCBBUl9CVENPRVhfQ1RSTF9BR0dSX1RIUkVTSCk7CisKKwkJCVJFR19STVdfRklFTEQoYWgsIEFSX01DSV9TQ0hEX1RBQkxFXzIsCisJCQkJICAgICAgQVJfTUNJX1NDSERfVEFCTEVfMl9IV19CQVNFRCwgMSk7CisJCQlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQ0lfU0NIRF9UQUJMRV8yLAorCQkJCSAgICAgIEFSX01DSV9TQ0hEX1RBQkxFXzJfTUVNX0JBU0VELCAxKTsKKworCQl9IGVsc2UKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgc2NoZWQgYWdnciB0aHJlc2g6IG9mZlxuIik7CisJfSBlbHNlCisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgU0NIRUQgb25lIHN0ZXAgbG9vayBhaGVhZCBvZmZcbiIpOworCisJaWYgKEFSX1NSRVZfOTQ2Ml8xMChhaCkpCisJCXJlZ3ZhbCB8PSBTTSgxLCBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRV8xMCk7CisKKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9DVFJMLCByZWd2YWwpOworCisJaWYgKEFSX1NSRVZfOTQ2Ml8yMChhaCkpIHsKKwkJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9HTEJfQ09OVFJPTCwKKwkJCSAgICBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRSk7CisJCVJFR19STVdfRklFTEQoYWgsIEFSX0JUQ09FWF9DVFJMMywKKwkJCSAgICAgIEFSX0JUQ09FWF9DVFJMM19DT05UX0lORk9fVElNRU9VVCwgMjApOworCX0KKworCVJFR19STVdfRklFTEQoYWgsIEFSX0JUQ09FWF9DVFJMMiwgQVJfQlRDT0VYX0NUUkwyX1JYX0RFV0VJR0hULCAxKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QQ1VfTUlTQywgQVJfUENVX0JUX0FOVF9QUkVWRU5UX1JYLCAwKTsKKworCXRocmVzaCA9IE1TKG1jaS0+Y29uZmlnLCBBVEhfTUNJX0NPTkZJR19DTEtfRElWKTsKKwlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9NQ0lfVFhfQ1RSTCwgQVJfTUNJX1RYX0NUUkxfQ0xLX0RJViwgdGhyZXNoKTsKKwlSRUdfU0VUX0JJVChhaCwgQVJfQlRDT0VYX0NUUkwsIEFSX0JUQ09FWF9DVFJMX01DSV9NT0RFX0VOKTsKKworCS8qIFJlc2V0dGluZyB0aGUgUnggYW5kIFR4IHBhdGhzIG9mIE1DSSAqLworCXJlZ3ZhbCA9IFJFR19SRUFEKGFoLCBBUl9NQ0lfQ09NTUFORDIpOworCXJlZ3ZhbCB8PSBTTSgxLCBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfVFgpOworCVJFR19XUklURShhaCwgQVJfTUNJX0NPTU1BTkQyLCByZWd2YWwpOworCisJdWRlbGF5KDEpOworCisJcmVndmFsICY9IH5TTSgxLCBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfVFgpOworCVJFR19XUklURShhaCwgQVJfTUNJX0NPTU1BTkQyLCByZWd2YWwpOworCisJaWYgKGlzX2Z1bGxfc2xlZXApIHsKKwkJYXI5MDAzX21jaV9tdXRlX2J0KGFoKTsKKwkJdWRlbGF5KDEwMCk7CisJfQorCisJcmVndmFsIHw9IFNNKDEsIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWCk7CisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQ09NTUFORDIsIHJlZ3ZhbCk7CisJdWRlbGF5KDEpOworCXJlZ3ZhbCAmPSB+U00oMSwgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JYKTsKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9DT01NQU5EMiwgcmVndmFsKTsKKworCWFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9JTklUX0dQTV9PRkZTRVQsIE5VTEwpOworCVJFR19XUklURShhaCwgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFLAorCQkgIChTTSgweGU4MDEsIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9JTlZBTElEX0hEUikgfAorCQkgICBTTSgweDAwMDAsIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9DSEVDS1NVTSkpKTsKKworCVJFR19DTFJfQklUKGFoLCBBUl9NQ0lfVFhfQ1RSTCwKKwkJCUFSX01DSV9UWF9DVFJMX0RJU0FCTEVfTE5BX1VQREFURSk7CisKKwlpZiAoQVJfU1JFVl85NDYyXzIwX09SX0xBVEVSKGFoKSkKKwkJYXI5MDAzX21jaV9vYnNlcnZhdGlvbl9zZXRfdXAoYWgpOworCisJbWNpLT5yZWFkeSA9IHRydWU7CisJYXI5MDAzX21jaV9wcmVwX2ludGVyZmFjZShhaCk7CisKKwlpZiAoZW5faW50KQorCQlhcjkwMDNfbWNpX2VuYWJsZV9pbnRlcnJ1cHQoYWgpOworfQorCit2b2lkIGFyOTAwM19tY2lfbXV0ZV9idChzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKworCWlmICghQVRIOUtfSFdfQ0FQX01DSSkKKwkJcmV0dXJuOworCisJLyogZGlzYWJsZSBhbGwgTUNJIG1lc3NhZ2VzICovCisJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfTVNHX0FUVFJJQlVURVNfVEFCTEUsIDB4ZmZmZjAwMDApOworCVJFR19XUklURShhaCwgQVJfQlRDT0VYX1dMX1dFSUdIVFMwLCAweGZmZmZmZmZmKTsKKwlSRUdfV1JJVEUoYWgsIEFSX0JUQ09FWF9XTF9XRUlHSFRTMSwgMHhmZmZmZmZmZik7CisJUkVHX1dSSVRFKGFoLCBBUl9CVENPRVhfV0xfV0VJR0hUUzIsIDB4ZmZmZmZmZmYpOworCVJFR19XUklURShhaCwgQVJfQlRDT0VYX1dMX1dFSUdIVFMzLCAweGZmZmZmZmZmKTsKKwlSRUdfU0VUX0JJVChhaCwgQVJfTUNJX1RYX0NUUkwsIEFSX01DSV9UWF9DVFJMX0RJU0FCTEVfTE5BX1VQREFURSk7CisKKwkvKiB3YWl0IHBlbmRpbmcgSFcgbWVzc2FnZXMgdG8gZmx1c2ggb3V0ICovCisJdWRlbGF5KDEwKTsKKworCS8qCisJICogU2VuZCBMTkFfVEFLRSBhbmQgU1lTX1NMRUVQSU5HIHdoZW4KKwkgKiAxLiByZXNldCBub3QgYWZ0ZXIgcmVzdW1pbmcgZnJvbSBmdWxsIHNsZWVwCisJICogMi4gYmVmb3JlIHJlc2V0IE1DSSBSWCwgdG8gcXVpZXQgQlQgYW5kIGF2b2lkIE1DSSBSWCBtaXNhbGlnbm1lbnQKKwkgKi8KKworCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgU2VuZCBMTkEgdGFrZVxuIik7CisJYXI5MDAzX21jaV9zZW5kX2xuYV90YWtlKGFoLCB0cnVlKTsKKworCXVkZWxheSg1KTsKKworCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgU2VuZCBzeXMgc2xlZXBpbmdcbiIpOworCWFyOTAwM19tY2lfc2VuZF9zeXNfc2xlZXBpbmcoYWgsIHRydWUpOworfQorCit2b2lkIGFyOTAwM19tY2lfc3luY19idF9zdGF0ZShzdHJ1Y3QgYXRoX2h3ICphaCkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJdTMyIGN1cl9idF9zdGF0ZTsKKworCWlmICghQVRIOUtfSFdfQ0FQX01DSSkKKwkJcmV0dXJuOworCisJY3VyX2J0X3N0YXRlID0gYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX1JFTU9URV9TTEVFUCwgTlVMTCk7CisKKwlpZiAobWNpLT5idF9zdGF0ZSAhPSBjdXJfYnRfc3RhdGUpIHsKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCSJNQ0kgQlQgc3RhdGUgbWlzbWF0Y2hlcy4gb2xkOiAlZCwgbmV3OiAlZFxuIiwKKwkJCW1jaS0+YnRfc3RhdGUsIGN1cl9idF9zdGF0ZSk7CisJCW1jaS0+YnRfc3RhdGUgPSBjdXJfYnRfc3RhdGU7CisJfQorCisJaWYgKG1jaS0+YnRfc3RhdGUgIT0gTUNJX0JUX1NMRUVQKSB7CisKKwkJYXI5MDAzX21jaV9zZW5kX2NvZXhfdmVyc2lvbl9xdWVyeShhaCwgdHJ1ZSk7CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3dsYW5fY2hhbm5lbHMoYWgsIHRydWUpOworCisJCWlmIChtY2ktPnVuaGFsdF9idF9ncG0gPT0gdHJ1ZSkgeworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSB1bmhhbHQgQlQgR1BNXG4iKTsKKwkJCWFyOTAwM19tY2lfc2VuZF9jb2V4X2hhbHRfYnRfZ3BtKGFoLCBmYWxzZSwgdHJ1ZSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFyOTAwM19tY2lfc2VuZF8yZzVnX3N0YXR1cyhzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCXUzMiBuZXdfZmxhZ3MsIHRvX3NldCwgdG9fY2xlYXI7CisKKwlpZiAoQVJfU1JFVl85NDYyXzIwKGFoKSAmJgorCSAgICBtY2ktPnVwZGF0ZV8yZzVnICYmCisJICAgIChtY2ktPmJ0X3N0YXRlICE9IE1DSV9CVF9TTEVFUCkpIHsKKworCQlpZiAobWNpLT5pc18yZykgeworCQkJbmV3X2ZsYWdzID0gTUNJXzJHX0ZMQUdTOworCQkJdG9fY2xlYXIgPSBNQ0lfMkdfRkxBR1NfQ0xFQVJfTUFTSzsKKwkJCXRvX3NldCA9IE1DSV8yR19GTEFHU19TRVRfTUFTSzsKKwkJfSBlbHNlIHsKKwkJCW5ld19mbGFncyA9IE1DSV81R19GTEFHUzsKKwkJCXRvX2NsZWFyID0gTUNJXzVHX0ZMQUdTX0NMRUFSX01BU0s7CisJCQl0b19zZXQgPSBNQ0lfNUdfRkxBR1NfU0VUX01BU0s7CisJCX0KKworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJIk1DSSBCVF9NQ0lfRkxBR1M6ICVzIDB4JTA4eCBjbHI9MHglMDh4LCBzZXQ9MHglMDh4XG4iLAorCQltY2ktPmlzXzJnID8gIjJHIiA6ICI1RyIsIG5ld19mbGFncywgdG9fY2xlYXIsIHRvX3NldCk7CisKKwkJaWYgKHRvX2NsZWFyKQorCQkJYXI5MDAzX21jaV9zZW5kX2NvZXhfYnRfZmxhZ3MoYWgsIHdhaXRfZG9uZSwKKwkJCQkJTUNJX0dQTV9DT0VYX0JUX0ZMQUdTX0NMRUFSLCB0b19jbGVhcik7CisKKwkJaWYgKHRvX3NldCkKKwkJCWFyOTAwM19tY2lfc2VuZF9jb2V4X2J0X2ZsYWdzKGFoLCB3YWl0X2RvbmUsCisJCQkJCU1DSV9HUE1fQ09FWF9CVF9GTEFHU19TRVQsIHRvX3NldCk7CisJfQorCisJaWYgKEFSX1NSRVZfOTQ2Ml8xMChhaCkgJiYgKG1jaS0+YnRfc3RhdGUgIT0gTUNJX0JUX1NMRUVQKSkKKwkJbWNpLT51cGRhdGVfMmc1ZyA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBhcjkwMDNfbWNpX3F1ZXVlX3Vuc2VudF9ncG0oc3RydWN0IGF0aF9odyAqYWgsIHU4IGhlYWRlciwKKwkJCQkJdTMyICpwYXlsb2FkLCBib29sIHF1ZXVlKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1OCB0eXBlLCBvcGNvZGU7CisKKwlpZiAocXVldWUpIHsKKworCQlpZiAocGF5bG9hZCkKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJIk1DSSBFUlJPUjogU2VuZCBmYWlsOiAlMDJ4OiAlMDJ4ICUwMnggJTAyeFxuIiwKKwkJCQloZWFkZXIsCisJCQkJKigoKHU4ICopcGF5bG9hZCkgKyA0KSwKKwkJCQkqKCgodTggKilwYXlsb2FkKSArIDUpLAorCQkJCSooKCh1OCAqKXBheWxvYWQpICsgNikpOworCQllbHNlCisJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIEVSUk9SOiBTZW5kIGZhaWw6ICUwMnhcbiIsCisJCQkJaGVhZGVyKTsKKwl9CisKKwkvKiBjaGVjayBpZiB0aGUgbWVzc2FnZSBpcyB0byBiZSBxdWV1ZWQgKi8KKwlpZiAoaGVhZGVyICE9IE1DSV9HUE0pCisJCXJldHVybjsKKworCXR5cGUgPSBNQ0lfR1BNX1RZUEUocGF5bG9hZCk7CisJb3Bjb2RlID0gTUNJX0dQTV9PUENPREUocGF5bG9hZCk7CisKKwlpZiAodHlwZSAhPSBNQ0lfR1BNX0NPRVhfQUdFTlQpCisJCXJldHVybjsKKworCXN3aXRjaCAob3Bjb2RlKSB7CisJY2FzZSBNQ0lfR1BNX0NPRVhfQlRfVVBEQVRFX0ZMQUdTOgorCisJCWlmIChBUl9TUkVWXzk0NjJfMTAoYWgpKQorCQkJYnJlYWs7CisKKwkJaWYgKCooKCh1OCAqKXBheWxvYWQpICsgTUNJX0dQTV9DT0VYX0JfQlRfRkxBR1NfT1ApID09CisJCQkJTUNJX0dQTV9DT0VYX0JUX0ZMQUdTX1JFQUQpCisJCQlicmVhazsKKworCQltY2ktPnVwZGF0ZV8yZzVnID0gcXVldWU7CisKKwkJaWYgKHF1ZXVlKQorCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkiTUNJIEJUX01DSV9GTEFHUzogMkc1RyBzdGF0dXMgPHF1ZXVlZD4gJXNcbiIsCisJCQkJbWNpLT5pc18yZyA/ICIyRyIgOiAiNUciKTsKKwkJZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkiTUNJIEJUX01DSV9GTEFHUzogMkc1RyBzdGF0dXMgPHNlbnQ+ICVzXG4iLAorCQkJCW1jaS0+aXNfMmcgPyAiMkciIDogIjVHIik7CisKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9HUE1fQ09FWF9XTEFOX0NIQU5ORUxTOgorCisJCW1jaS0+d2xhbl9jaGFubmVsc191cGRhdGUgPSBxdWV1ZTsKKwkJaWYgKHF1ZXVlKQorCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBXTEFOIGNoYW5uZWwgbWFwIDxxdWV1ZWQ+XG4iKTsKKwkJZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBXTEFOIGNoYW5uZWwgbWFwIDxzZW50PlxuIik7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfR1BNX0NPRVhfSEFMVF9CVF9HUE06CisKKwkJaWYgKCooKCh1OCAqKXBheWxvYWQpICsgTUNJX0dQTV9DT0VYX0JfSEFMVF9TVEFURSkgPT0KKwkJCQlNQ0lfR1BNX0NPRVhfQlRfR1BNX1VOSEFMVCkgeworCisJCQltY2ktPnVuaGFsdF9idF9ncG0gPSBxdWV1ZTsKKworCQkJaWYgKHF1ZXVlKQorCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJCSJNQ0kgVU5IQUxUIEJUIEdQTSA8cXVldWVkPlxuIik7CisJCQllbHNlIHsKKwkJCQltY2ktPmhhbHRlZF9idF9ncG0gPSBmYWxzZTsKKwkJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJCQkiTUNJIFVOSEFMVCBCVCBHUE0gPHNlbnQ+XG4iKTsKKwkJCX0KKwkJfQorCisJCWlmICgqKCgodTggKilwYXlsb2FkKSArIE1DSV9HUE1fQ09FWF9CX0hBTFRfU1RBVEUpID09CisJCQkJTUNJX0dQTV9DT0VYX0JUX0dQTV9IQUxUKSB7CisKKwkJCW1jaS0+aGFsdGVkX2J0X2dwbSA9ICFxdWV1ZTsKKworCQkJaWYgKHF1ZXVlKQorCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJCSJNQ0kgSEFMVCBCVCBHUE0gPG5vdCBzZW50PlxuIik7CisJCQllbHNlCisJCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkJIk1DSSBVTkhBTFQgQlQgR1BNIDxzZW50PlxuIik7CisJCX0KKworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgYXI5MDAzX21jaV8yZzVnX3N3aXRjaChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOworCisJaWYgKCFBVEg5S19IV19DQVBfTUNJKQorCQlyZXR1cm47CisKKwlpZiAobWNpLT51cGRhdGVfMmc1ZykgeworCQlpZiAobWNpLT5pc18yZykgeworCisJCQlhcjkwMDNfbWNpX3NlbmRfMmc1Z19zdGF0dXMoYWgsIHRydWUpOworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBTZW5kIExOQSB0cmFuc1xuIik7CisJCQlhcjkwMDNfbWNpX3NlbmRfbG5hX3RyYW5zZmVyKGFoLCB0cnVlKTsKKwkJCXVkZWxheSg1KTsKKworCQkJUkVHX0NMUl9CSVQoYWgsIEFSX01DSV9UWF9DVFJMLAorCQkJCSAgICBBUl9NQ0lfVFhfQ1RSTF9ESVNBQkxFX0xOQV9VUERBVEUpOworCisJCQlpZiAoQVJfU1JFVl85NDYyXzIwKGFoKSkgeworCQkJCVJFR19DTFJfQklUKGFoLCBBUl9QSFlfR0xCX0NPTlRST0wsCisJCQkJCSAgICBBUl9CVENPRVhfQ1RSTF9CVF9PV05fU1BEVF9DVFJMKTsKKwkJCQlpZiAoIShtY2ktPmNvbmZpZyAmCisJCQkJICAgICAgQVRIX01DSV9DT05GSUdfRElTQUJMRV9PU0xBKSkgeworCQkJCQlSRUdfU0VUX0JJVChhaCwgQVJfQlRDT0VYX0NUUkwsCisJCQkJCUFSX0JUQ09FWF9DVFJMX09ORV9TVEVQX0xPT0tfQUhFQURfRU4pOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgU2VuZCBMTkEgdGFrZVxuIik7CisJCQlhcjkwMDNfbWNpX3NlbmRfbG5hX3Rha2UoYWgsIHRydWUpOworCQkJdWRlbGF5KDUpOworCisJCQlSRUdfU0VUX0JJVChhaCwgQVJfTUNJX1RYX0NUUkwsCisJCQkJICAgIEFSX01DSV9UWF9DVFJMX0RJU0FCTEVfTE5BX1VQREFURSk7CisKKwkJCWlmIChBUl9TUkVWXzk0NjJfMjAoYWgpKSB7CisJCQkJUkVHX1NFVF9CSVQoYWgsIEFSX1BIWV9HTEJfQ09OVFJPTCwKKwkJCQkJICAgIEFSX0JUQ09FWF9DVFJMX0JUX09XTl9TUERUX0NUUkwpOworCQkJCVJFR19DTFJfQklUKGFoLCBBUl9CVENPRVhfQ1RSTCwKKwkJCQkJQVJfQlRDT0VYX0NUUkxfT05FX1NURVBfTE9PS19BSEVBRF9FTik7CisJCQl9CisKKwkJCWFyOTAwM19tY2lfc2VuZF8yZzVnX3N0YXR1cyhhaCwgdHJ1ZSk7CisJCX0KKwl9Cit9CisKK2Jvb2wgYXI5MDAzX21jaV9zZW5kX21lc3NhZ2Uoc3RydWN0IGF0aF9odyAqYWgsIHU4IGhlYWRlciwgdTMyIGZsYWcsCisJCQkgICAgIHUzMiAqcGF5bG9hZCwgdTggbGVuLCBib29sIHdhaXRfZG9uZSwKKwkJCSAgICAgYm9vbCBjaGVja19idCkKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwlzdHJ1Y3QgYXRoOWtfaHdfbWNpICptY2kgPSAmYWgtPmJ0Y29leF9ody5tY2k7CisJYm9vbCBtc2dfc2VudCA9IGZhbHNlOworCXUzMiByZWd2YWw7CisJdTMyIHNhdmVkX21jaV9pbnRfZW47CisJaW50IGk7CisKKwlpZiAoIUFUSDlLX0hXX0NBUF9NQ0kpCisJCXJldHVybiBmYWxzZTsKKworCXNhdmVkX21jaV9pbnRfZW4gPSBSRUdfUkVBRChhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTik7CisJcmVndmFsID0gUkVHX1JFQUQoYWgsIEFSX0JUQ09FWF9DVFJMKTsKKworCWlmICgocmVndmFsID09IDB4ZGVhZGJlZWYpIHx8ICEocmVndmFsICYgQVJfQlRDT0VYX0NUUkxfTUNJX01PREVfRU4pKSB7CisKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCSJNQ0kgTm90IHNlbmRpbmcgMHgleC4gTUNJIGlzIG5vdCBlbmFibGVkLiBmdWxsX3NsZWVwID0gJWRcbiIsCisJCQloZWFkZXIsCisJCQkoYWgtPnBvd2VyX21vZGUgPT0gQVRIOUtfUE1fRlVMTF9TTEVFUCkgPyAxIDogMCk7CisKKwkJYXI5MDAzX21jaV9xdWV1ZV91bnNlbnRfZ3BtKGFoLCBoZWFkZXIsIHBheWxvYWQsIHRydWUpOworCQlyZXR1cm4gZmFsc2U7CisKKwl9IGVsc2UgaWYgKGNoZWNrX2J0ICYmIChtY2ktPmJ0X3N0YXRlID09IE1DSV9CVF9TTEVFUCkpIHsKKworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJIk1DSSBEb24ndCBzZW5kIG1lc3NhZ2UgMHgleC4gQlQgaXMgaW4gc2xlZXAgc3RhdGVcbiIsCisJCQloZWFkZXIpOworCisJCWFyOTAwM19tY2lfcXVldWVfdW5zZW50X2dwbShhaCwgaGVhZGVyLCBwYXlsb2FkLCB0cnVlKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWlmICh3YWl0X2RvbmUpCisJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTiwgMCk7CisKKwkvKiBOZWVkIHRvIGNsZWFyIFNXX01TR19ET05FIHJhdyBiaXQgYmVmb3JlIHdhaXQgKi8KKworCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SQVcsCisJCSAgKEFSX01DSV9JTlRFUlJVUFRfU1dfTVNHX0RPTkUgfAorCQkgICBBUl9NQ0lfSU5URVJSVVBUX01TR19GQUlMX01BU0spKTsKKworCWlmIChwYXlsb2FkKSB7CisJCWZvciAoaSA9IDA7IChpICogNCkgPCBsZW47IGkrKykKKwkJCVJFR19XUklURShhaCwgKEFSX01DSV9UWF9QQVlMT0FEMCArIGkgKiA0KSwKKwkJCQkgICoocGF5bG9hZCArIGkpKTsKKwl9CisKKwlSRUdfV1JJVEUoYWgsIEFSX01DSV9DT01NQU5EMCwKKwkJICAoU00oKGZsYWcgJiBNQ0lfRkxBR19ESVNBQkxFX1RJTUVTVEFNUCksCisJCSAgICAgIEFSX01DSV9DT01NQU5EMF9ESVNBQkxFX1RJTUVTVEFNUCkgfAorCQkgICBTTShsZW4sIEFSX01DSV9DT01NQU5EMF9MRU4pIHwKKwkJICAgU00oaGVhZGVyLCBBUl9NQ0lfQ09NTUFORDBfSEVBREVSKSkpOworCisJaWYgKHdhaXRfZG9uZSAmJgorCSAgICAhKGFyOTAwM19tY2lfd2FpdF9mb3JfaW50ZXJydXB0KGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JBVywKKwkJCQkJQVJfTUNJX0lOVEVSUlVQVF9TV19NU0dfRE9ORSwgNTAwKSkpCisJCWFyOTAwM19tY2lfcXVldWVfdW5zZW50X2dwbShhaCwgaGVhZGVyLCBwYXlsb2FkLCB0cnVlKTsKKwllbHNlIHsKKwkJYXI5MDAzX21jaV9xdWV1ZV91bnNlbnRfZ3BtKGFoLCBoZWFkZXIsIHBheWxvYWQsIGZhbHNlKTsKKwkJbXNnX3NlbnQgPSB0cnVlOworCX0KKworCWlmICh3YWl0X2RvbmUpCisJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9FTiwgc2F2ZWRfbWNpX2ludF9lbik7CisKKwlyZXR1cm4gbXNnX3NlbnQ7Cit9CitFWFBPUlRfU1lNQk9MKGFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKTsKKwordm9pZCBhcjkwMDNfbWNpX3NldHVwKHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgZ3BtX2FkZHIsIHZvaWQgKmdwbV9idWYsCisJCSAgICAgIHUxNiBsZW4sIHUzMiBzY2hlZF9hZGRyKQoreworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl2b2lkICpzY2hlZF9idWYgPSAodm9pZCAqKSgoY2hhciAqKSBncG1fYnVmICsgKHNjaGVkX2FkZHIgLSBncG1fYWRkcikpOworCisJaWYgKCFBVEg5S19IV19DQVBfTUNJKQorCQlyZXR1cm47CisKKwltY2ktPmdwbV9hZGRyID0gZ3BtX2FkZHI7CisJbWNpLT5ncG1fYnVmID0gZ3BtX2J1ZjsKKwltY2ktPmdwbV9sZW4gPSBsZW47CisJbWNpLT5zY2hlZF9hZGRyID0gc2NoZWRfYWRkcjsKKwltY2ktPnNjaGVkX2J1ZiA9IHNjaGVkX2J1ZjsKKworCWFyOTAwM19tY2lfcmVzZXQoYWgsIHRydWUsIHRydWUsIHRydWUpOworfQorRVhQT1JUX1NZTUJPTChhcjkwMDNfbWNpX3NldHVwKTsKKwordm9pZCBhcjkwMDNfbWNpX2NsZWFudXAoc3RydWN0IGF0aF9odyAqYWgpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisKKwlpZiAoIUFUSDlLX0hXX0NBUF9NQ0kpCisJCXJldHVybjsKKworCS8qIFR1cm4gb2ZmIE1DSSBhbmQgSnVwaXRlciBtb2RlLiAqLworCVJFR19XUklURShhaCwgQVJfQlRDT0VYX0NUUkwsIDB4MDApOworCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgYXI5MDAzX21jaV9jbGVhbnVwXG4iKTsKKwlhcjkwMDNfbWNpX2Rpc2FibGVfaW50ZXJydXB0KGFoKTsKK30KK0VYUE9SVF9TWU1CT0woYXI5MDAzX21jaV9jbGVhbnVwKTsKKworc3RhdGljIHZvaWQgYXI5MDAzX21jaV9wcm9jZXNzX2dwbV9leHRyYShzdHJ1Y3QgYXRoX2h3ICphaCwgdTggZ3BtX3R5cGUsCisJCQkJCSB1OCBncG1fb3Bjb2RlLCB1MzIgKnBfZ3BtKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1OCAqcF9kYXRhID0gKHU4ICopIHBfZ3BtOworCisJaWYgKGdwbV90eXBlICE9IE1DSV9HUE1fQ09FWF9BR0VOVCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChncG1fb3Bjb2RlKSB7CisJY2FzZSBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9RVUVSWToKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBSZWN2IEdQTSBDT0VYIFZlcnNpb24gUXVlcnlcbiIpOworCQlhcjkwMDNfbWNpX3NlbmRfY29leF92ZXJzaW9uX3Jlc3BvbnNlKGFoLCB0cnVlKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9SRVNQT05TRToKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBSZWN2IEdQTSBDT0VYIFZlcnNpb24gUmVzcG9uc2VcbiIpOworCQltY2ktPmJ0X3Zlcl9tYWpvciA9CisJCQkqKHBfZGF0YSArIE1DSV9HUE1fQ09FWF9CX01BSk9SX1ZFUlNJT04pOworCQltY2ktPmJ0X3Zlcl9taW5vciA9CisJCQkqKHBfZGF0YSArIE1DSV9HUE1fQ09FWF9CX01JTk9SX1ZFUlNJT04pOworCQltY2ktPmJ0X3ZlcnNpb25fa25vd24gPSB0cnVlOworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIEJUIENvZXggdmVyc2lvbjogJWQuJWRcbiIsCisJCQltY2ktPmJ0X3Zlcl9tYWpvciwgbWNpLT5idF92ZXJfbWlub3IpOworCQlicmVhazsKKwljYXNlIE1DSV9HUE1fQ09FWF9TVEFUVVNfUVVFUlk6CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkiTUNJIFJlY3YgR1BNIENPRVggU3RhdHVzIFF1ZXJ5ID0gMHglMDJYXG4iLAorCQkJKihwX2RhdGEgKyBNQ0lfR1BNX0NPRVhfQl9XTEFOX0JJVE1BUCkpOworCQltY2ktPndsYW5fY2hhbm5lbHNfdXBkYXRlID0gdHJ1ZTsKKwkJYXI5MDAzX21jaV9zZW5kX2NvZXhfd2xhbl9jaGFubmVscyhhaCwgdHJ1ZSk7CisJCWJyZWFrOworCWNhc2UgTUNJX0dQTV9DT0VYX0JUX1BST0ZJTEVfSU5GTzoKKwkJbWNpLT5xdWVyeV9idCA9IHRydWU7CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgUmVjdiBHUE0gQ09FWCBCVF9Qcm9maWxlX0luZm9cbiIpOworCQlicmVhazsKKwljYXNlIE1DSV9HUE1fQ09FWF9CVF9TVEFUVVNfVVBEQVRFOgorCQltY2ktPnF1ZXJ5X2J0ID0gdHJ1ZTsKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCSJNQ0kgUmVjdiBHUE0gQ09FWCBCVF9TdGF0dXNfVXBkYXRlIFNFUT0lZCAoZHJvcCZxdWVyeSlcbiIsCisJCQkqKHBfZ3BtICsgMykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3UzMiBhcjkwMDNfbWNpX3dhaXRfZm9yX2dwbShzdHJ1Y3QgYXRoX2h3ICphaCwgdTggZ3BtX3R5cGUsCisJCQkgICAgdTggZ3BtX29wY29kZSwgaW50IHRpbWVfb3V0KQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgKnBfZ3BtID0gTlVMTCwgbWlzbWF0Y2ggPSAwLCBtb3JlX2RhdGE7CisJdTMyIG9mZnNldDsKKwl1OCByZWN2X3R5cGUgPSAwLCByZWN2X29wY29kZSA9IDA7CisJYm9vbCBiX2lzX2J0X2NhbF9kb25lID0gKGdwbV90eXBlID09IE1DSV9HUE1fQlRfQ0FMX0RPTkUpOworCisJaWYgKCFBVEg5S19IV19DQVBfTUNJKQorCQlyZXR1cm4gMDsKKworCW1vcmVfZGF0YSA9IHRpbWVfb3V0ID8gTUNJX0dQTV9OT01PUkUgOiBNQ0lfR1BNX01PUkU7CisKKwl3aGlsZSAodGltZV9vdXQgPiAwKSB7CisJCWlmIChwX2dwbSkgeworCQkJTUNJX0dQTV9SRUNZQ0xFKHBfZ3BtKTsKKwkJCXBfZ3BtID0gTlVMTDsKKwkJfQorCisJCWlmIChtb3JlX2RhdGEgIT0gTUNJX0dQTV9NT1JFKQorCQkJdGltZV9vdXQgPSBhcjkwMDNfbWNpX3dhaXRfZm9yX2ludGVycnVwdChhaCwKKwkJCQkJQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXLAorCQkJCQlBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19HUE0sCisJCQkJCXRpbWVfb3V0KTsKKworCQlpZiAoIXRpbWVfb3V0KQorCQkJYnJlYWs7CisKKwkJb2Zmc2V0ID0gYXI5MDAzX21jaV9zdGF0ZShhaCwKKwkJCQlNQ0lfU1RBVEVfTkVYVF9HUE1fT0ZGU0VULCAmbW9yZV9kYXRhKTsKKworCQlpZiAob2Zmc2V0ID09IE1DSV9HUE1fSU5WQUxJRCkKKwkJCWNvbnRpbnVlOworCisJCXBfZ3BtID0gKHUzMiAqKSAobWNpLT5ncG1fYnVmICsgb2Zmc2V0KTsKKwkJcmVjdl90eXBlID0gTUNJX0dQTV9UWVBFKHBfZ3BtKTsKKwkJcmVjdl9vcGNvZGUgPSBNQ0lfR1BNX09QQ09ERShwX2dwbSk7CisKKwkJaWYgKE1DSV9HUE1fSVNfQ0FMX1RZUEUocmVjdl90eXBlKSkgeworCisJCQlpZiAocmVjdl90eXBlID09IGdwbV90eXBlKSB7CisKKwkJCQlpZiAoKGdwbV90eXBlID09IE1DSV9HUE1fQlRfQ0FMX0RPTkUpICYmCisJCQkJICAgICFiX2lzX2J0X2NhbF9kb25lKSB7CisJCQkJCWdwbV90eXBlID0gTUNJX0dQTV9CVF9DQUxfR1JBTlQ7CisJCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJCQkiTUNJIFJlY3YgQlRfQ0FMX0RPTkUgd2FpdCBCVF9DQUxfR1JBTlRcbiIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIGlmICgocmVjdl90eXBlID09IGdwbV90eXBlKSAmJgorCQkJICAgKHJlY3Zfb3Bjb2RlID09IGdwbV9vcGNvZGUpKQorCQkJYnJlYWs7CisKKwkJLyogbm90IGV4cGVjdGVkIG1lc3NhZ2UgKi8KKworCQkvKgorCQkgKiBjaGVjayBpZiBpdCdzIGNhbF9ncmFudAorCQkgKgorCQkgKiBXaGVuIHdlJ3JlIHdhaXRpbmcgZm9yIGNhbF9ncmFudCBpbiByZXNldCByb3V0aW5lLAorCQkgKiBpdCdzIHBvc3NpYmxlIHRoYXQgQlQgc2VuZHMgb3V0IGNhbF9yZXF1ZXN0IGF0IHRoZQorCQkgKiBzYW1lIHRpbWUuIFNpbmNlIEJUJ3MgY2FsaWJyYXRpb24gZG9lc24ndCBoYXBwZW4KKwkJICogdGhhdCBvZnRlbiwgd2UnbGwgbGV0IEJUIGNvbXBsZXRlcyBjYWxpYnJhdGlvbiB0aGVuCisJCSAqIHdlIGNvbnRpbnVlIHRvIHdhaXQgZm9yIGNhbF9ncmFudCBmcm9tIEJULgorCQkgKiBPcmdpbmFsOiBXYWl0IEJUX0NBTF9HUkFOVC4KKwkJICogTmV3OiBSZWNlaXZlIEJUX0NBTF9SRVEgLT4gc2VuZCBXTEFOX0NBTF9HUkFOVC0+d2FpdAorCQkgKiBCVF9DQUxfRE9ORSAtPiBXYWl0IEJUX0NBTF9HUkFOVC4KKwkJICovCisKKwkJaWYgKChncG1fdHlwZSA9PSBNQ0lfR1BNX0JUX0NBTF9HUkFOVCkgJiYKKwkJICAgIChyZWN2X3R5cGUgPT0gTUNJX0dQTV9CVF9DQUxfUkVRKSkgeworCisJCQl1MzIgcGF5bG9hZFs0XSA9IHswLCAwLCAwLCAwfTsKKworCQkJZ3BtX3R5cGUgPSBNQ0lfR1BNX0JUX0NBTF9ET05FOworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkiTUNJIFJjdiBCVF9DQUxfUkVRLCBzZW5kIFdMQU5fQ0FMX0dSQU5UXG4iKTsKKworCQkJTUNJX0dQTV9TRVRfQ0FMX1RZUEUocGF5bG9hZCwKKwkJCQkJTUNJX0dQTV9XTEFOX0NBTF9HUkFOVCk7CisKKwkJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfR1BNLCAwLCBwYXlsb2FkLCAxNiwKKwkJCQkJCWZhbHNlLCBmYWxzZSk7CisKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgbm93IHdhaXQgZm9yIEJUX0NBTF9ET05FXG4iKTsKKworCQkJY29udGludWU7CisJCX0gZWxzZSB7CisJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIEdQTSBzdWJ0eXBlIG5vdCBtYXRjaCAweCV4XG4iLAorCQkJCSoocF9ncG0gKyAxKSk7CisJCQltaXNtYXRjaCsrOworCQkJYXI5MDAzX21jaV9wcm9jZXNzX2dwbV9leHRyYShhaCwgcmVjdl90eXBlLAorCQkJCQlyZWN2X29wY29kZSwgcF9ncG0pOworCQl9CisJfQorCWlmIChwX2dwbSkgeworCQlNQ0lfR1BNX1JFQ1lDTEUocF9ncG0pOworCQlwX2dwbSA9IE5VTEw7CisJfQorCisJaWYgKHRpbWVfb3V0IDw9IDApIHsKKwkJdGltZV9vdXQgPSAwOworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJIk1DSSBHUE0gcmVjZWl2ZWQgdGltZW91dCwgbWlzbWF0Y2ggPSAlZFxuIiwgbWlzbWF0Y2gpOworCX0gZWxzZQorCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIFJlY2VpdmUgR1BNIHR5cGU9MHgleCwgY29kZT0weCV4XG4iLAorCQkJZ3BtX3R5cGUsIGdwbV9vcGNvZGUpOworCisJd2hpbGUgKG1vcmVfZGF0YSA9PSBNQ0lfR1BNX01PUkUpIHsKKworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIGRpc2NhcmQgcmVtYWluaW5nIEdQTVxuIik7CisJCW9mZnNldCA9IGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9ORVhUX0dQTV9PRkZTRVQsCisJCQkJCSAgJm1vcmVfZGF0YSk7CisKKwkJaWYgKG9mZnNldCA9PSBNQ0lfR1BNX0lOVkFMSUQpCisJCQlicmVhazsKKworCQlwX2dwbSA9ICh1MzIgKikgKG1jaS0+Z3BtX2J1ZiArIG9mZnNldCk7CisJCXJlY3ZfdHlwZSA9IE1DSV9HUE1fVFlQRShwX2dwbSk7CisJCXJlY3Zfb3Bjb2RlID0gTUNJX0dQTV9PUENPREUocF9ncG0pOworCisJCWlmICghTUNJX0dQTV9JU19DQUxfVFlQRShyZWN2X3R5cGUpKQorCQkJYXI5MDAzX21jaV9wcm9jZXNzX2dwbV9leHRyYShhaCwgcmVjdl90eXBlLAorCQkJCQkJICAgICByZWN2X29wY29kZSwgcF9ncG0pOworCisJCU1DSV9HUE1fUkVDWUNMRShwX2dwbSk7CisJfQorCisJcmV0dXJuIHRpbWVfb3V0OworfQorCit1MzIgYXI5MDAzX21jaV9zdGF0ZShzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHN0YXRlX3R5cGUsIHUzMiAqcF9kYXRhKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaSA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKKwl1MzIgdmFsdWUgPSAwLCBtb3JlX2dwbSA9IDAsIGdwbV9wdHI7CisJdTggcXVlcnlfdHlwZTsKKworCWlmICghQVRIOUtfSFdfQ0FQX01DSSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKHN0YXRlX3R5cGUpIHsKKwljYXNlIE1DSV9TVEFURV9FTkFCTEU6CisJCWlmIChtY2ktPnJlYWR5KSB7CisKKwkJCXZhbHVlID0gUkVHX1JFQUQoYWgsIEFSX0JUQ09FWF9DVFJMKTsKKworCQkJaWYgKCh2YWx1ZSA9PSAweGRlYWRiZWVmKSB8fCAodmFsdWUgPT0gMHhmZmZmZmZmZikpCisJCQkJdmFsdWUgPSAwOworCQl9CisJCXZhbHVlICY9IEFSX0JUQ09FWF9DVFJMX01DSV9NT0RFX0VOOworCQlicmVhazsKKwljYXNlIE1DSV9TVEFURV9JTklUX0dQTV9PRkZTRVQ6CisJCXZhbHVlID0gTVMoUkVHX1JFQUQoYWgsIEFSX01DSV9HUE1fMSksIEFSX01DSV9HUE1fV1JJVEVfUFRSKTsKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBHUE0gaW5pdGlhbCBXUklURV9QVFI9JWRcbiIsIHZhbHVlKTsKKwkJbWNpLT5ncG1faWR4ID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgTUNJX1NUQVRFX05FWFRfR1BNX09GRlNFVDoKKwljYXNlIE1DSV9TVEFURV9MQVNUX0dQTV9PRkZTRVQ6CisJCS8qCisJCSogVGhpcyBjb3VsZCBiZSB1c2VmdWwgdG8gYXZvaWQgbmV3IEdQTSBtZXNzYWdlIGludGVycnVwdCB3aGljaAorCQkqIG1heSBsZWFkIHRvIHNwdXJpb3VzIGludGVycnVwdCBhZnRlciBwb3dlciBzbGVlcCwgb3IgbXVsdGlwbGUKKwkJKiBlbnRyeSBvZiBhdGhfbWNpX2ludHIoKS4KKwkJKiBBZGRpbmcgZW1wdHkgR1BNIGNoZWNrIGJ5IHJldHVybmluZyBIQUxfTUNJX0dQTV9JTlZBTElEIGNhbgorCQkqIGFsbGV2aWF0ZSB0aGlzIGVmZmVjdCwgYnV0IGNsZWFyaW5nIEdQTSBSWCBpbnRlcnJ1cHQgYml0IGlzCisJCSogc2FmZSwgYmVjYXVzZSB3aGV0aGVyIHRoaXMgaXMgY2FsbGVkIGZyb20gaHcgb3IgZHJpdmVyIGNvZGUKKwkJKiB0aGVyZSBtdXN0IGJlIGFuIGludGVycnVwdCBiaXQgc2V0L3RyaWdnZXJlZCBpbml0aWFsbHkKKwkJKi8KKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SQVcsCisJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTSk7CisKKwkJZ3BtX3B0ciA9IE1TKFJFR19SRUFEKGFoLCBBUl9NQ0lfR1BNXzEpLCBBUl9NQ0lfR1BNX1dSSVRFX1BUUik7CisJCXZhbHVlID0gZ3BtX3B0cjsKKworCQlpZiAodmFsdWUgPT0gMCkKKwkJCXZhbHVlID0gbWNpLT5ncG1fbGVuIC0gMTsKKwkJZWxzZSBpZiAodmFsdWUgPj0gbWNpLT5ncG1fbGVuKSB7CisJCQlpZiAodmFsdWUgIT0gMHhGRkZGKSB7CisJCQkJdmFsdWUgPSAwOworCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJCSJNQ0kgR1BNIG9mZnNldCBvdXQgb2YgcmFuZ2VcbiIpOworCQkJfQorCQl9IGVsc2UKKwkJCXZhbHVlLS07CisKKwkJaWYgKHZhbHVlID09IDB4RkZGRikgeworCQkJdmFsdWUgPSBNQ0lfR1BNX0lOVkFMSUQ7CisJCQltb3JlX2dwbSA9IE1DSV9HUE1fTk9NT1JFOworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkiTUNJIEdQTSBwdHIgaW52YWxpZCBAcHRyPSVkLCBvZmZzZXQ9JWQsIG1vcmU9R1BNX05PTU9SRVxuIiwKKwkJCQlncG1fcHRyLCB2YWx1ZSk7CisJCX0gZWxzZSBpZiAoc3RhdGVfdHlwZSA9PSBNQ0lfU1RBVEVfTkVYVF9HUE1fT0ZGU0VUKSB7CisKKwkJCWlmIChncG1fcHRyID09IG1jaS0+Z3BtX2lkeCkgeworCQkJCXZhbHVlID0gTUNJX0dQTV9JTlZBTElEOworCQkJCW1vcmVfZ3BtID0gTUNJX0dQTV9OT01PUkU7CisKKwkJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJCQkiTUNJIEdQTSBtZXNzYWdlIG5vdCBhdmFpbGFibGUgQHB0cj0lZCwgQG9mZnNldD0lZCwgbW9yZT1HUE1fTk9NT1JFXG4iLAorCQkJCQlncG1fcHRyLCB2YWx1ZSk7CisJCQl9IGVsc2UgeworCQkJCWZvciAoOzspIHsKKworCQkJCQl1MzIgdGVtcF9pbmRleDsKKworCQkJCQkvKiBza2lwIHJlc2VydmVkIEdQTSBpZiBhbnkgKi8KKworCQkJCQlpZiAodmFsdWUgIT0gbWNpLT5ncG1faWR4KQorCQkJCQkJbW9yZV9ncG0gPSBNQ0lfR1BNX01PUkU7CisJCQkJCWVsc2UKKwkJCQkJCW1vcmVfZ3BtID0gTUNJX0dQTV9OT01PUkU7CisKKwkJCQkJdGVtcF9pbmRleCA9IG1jaS0+Z3BtX2lkeDsKKwkJCQkJbWNpLT5ncG1faWR4Kys7CisKKwkJCQkJaWYgKG1jaS0+Z3BtX2lkeCA+PQorCQkJCQkgICAgbWNpLT5ncG1fbGVuKQorCQkJCQkJbWNpLT5ncG1faWR4ID0gMDsKKworCQkJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJCQkJIk1DSSBHUE0gbWVzc2FnZSBnb3QgcHRyPSVkLCBAb2Zmc2V0PSVkLCBtb3JlPSVkXG4iLAorCQkJCQkJZ3BtX3B0ciwgdGVtcF9pbmRleCwKKwkJCQkJCShtb3JlX2dwbSA9PSBNQ0lfR1BNX01PUkUpKTsKKworCQkJCQlpZiAoYXI5MDAzX21jaV9pc19ncG1fdmFsaWQoYWgsCisJCQkJCQkJCXRlbXBfaW5kZXgpKSB7CisJCQkJCQl2YWx1ZSA9IHRlbXBfaW5kZXg7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCisJCQkJCWlmIChtb3JlX2dwbSA9PSBNQ0lfR1BNX05PTU9SRSkgeworCQkJCQkJdmFsdWUgPSBNQ0lfR1BNX0lOVkFMSUQ7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChwX2RhdGEpCisJCQkJKnBfZGF0YSA9IG1vcmVfZ3BtOworCQkJfQorCisJCQlpZiAodmFsdWUgIT0gTUNJX0dQTV9JTlZBTElEKQorCQkJCXZhbHVlIDw8PSA0OworCisJCQlicmVhazsKKwljYXNlIE1DSV9TVEFURV9MQVNUX1NDSERfTVNHX09GRlNFVDoKKwkJdmFsdWUgPSBNUyhSRUdfUkVBRChhaCwgQVJfTUNJX1JYX1NUQVRVUyksCisJCQkJICAgIEFSX01DSV9SWF9MQVNUX1NDSERfTVNHX0lOREVYKTsKKwkJLyogTWFrZSBpdCBpbiBieXRlcyAqLworCQl2YWx1ZSA8PD0gNDsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9SRU1PVEVfU0xFRVA6CisJCXZhbHVlID0gTVMoUkVHX1JFQUQoYWgsIEFSX01DSV9SWF9TVEFUVVMpLAorCQkJICAgQVJfTUNJX1JYX1JFTU9URV9TTEVFUCkgPworCQkJTUNJX0JUX1NMRUVQIDogTUNJX0JUX0FXQUtFOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX0NPTlRfUlNTSV9QT1dFUjoKKwkJdmFsdWUgPSBNUyhtY2ktPmNvbnRfc3RhdHVzLCBBUl9NQ0lfQ09OVF9SU1NJX1BPV0VSKTsKKwkJCWJyZWFrOworCisJY2FzZSBNQ0lfU1RBVEVfQ09OVF9QUklPUklUWToKKwkJdmFsdWUgPSBNUyhtY2ktPmNvbnRfc3RhdHVzLCBBUl9NQ0lfQ09OVF9SUklPUklUWSk7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfU1RBVEVfQ09OVF9UWFJYOgorCQl2YWx1ZSA9IE1TKG1jaS0+Y29udF9zdGF0dXMsIEFSX01DSV9DT05UX1RYUlgpOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX0JUOgorCQl2YWx1ZSA9IG1jaS0+YnRfc3RhdGU7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfU1RBVEVfU0VUX0JUX1NMRUVQOgorCQltY2ktPmJ0X3N0YXRlID0gTUNJX0JUX1NMRUVQOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFVF9CVF9BV0FLRToKKwkJbWNpLT5idF9zdGF0ZSA9IE1DSV9CVF9BV0FLRTsKKwkJYXI5MDAzX21jaV9zZW5kX2NvZXhfdmVyc2lvbl9xdWVyeShhaCwgdHJ1ZSk7CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3dsYW5fY2hhbm5lbHMoYWgsIHRydWUpOworCisJCWlmIChtY2ktPnVuaGFsdF9idF9ncG0pIHsKKworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSB1bmhhbHQgQlQgR1BNXG4iKTsKKwkJCWFyOTAwM19tY2lfc2VuZF9jb2V4X2hhbHRfYnRfZ3BtKGFoLCBmYWxzZSwgdHJ1ZSk7CisJCX0KKworCQlhcjkwMDNfbWNpXzJnNWdfc3dpdGNoKGFoLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRVRfQlRfQ0FMX1NUQVJUOgorCQltY2ktPmJ0X3N0YXRlID0gTUNJX0JUX0NBTF9TVEFSVDsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRVRfQlRfQ0FMOgorCQltY2ktPmJ0X3N0YXRlID0gTUNJX0JUX0NBTDsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9SRVNFVF9SRVFfV0FLRToKKwkJYXI5MDAzX21jaV9yZXNldF9yZXFfd2FrZXVwKGFoKTsKKwkJbWNpLT51cGRhdGVfMmc1ZyA9IHRydWU7CisKKwkJaWYgKChBUl9TUkVWXzk0NjJfMjBfT1JfTEFURVIoYWgpKSAmJgorCQkgICAgKG1jaS0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfTUNJX09CU19NQVNLKSkgeworCQkJLyogQ2hlY2sgaWYgd2Ugc3RpbGwgaGF2ZSBjb250cm9sIG9mIHRoZSBHUElPcyAqLworCQkJaWYgKChSRUdfUkVBRChhaCwgQVJfR0xCX0dQSU9fQ09OVFJPTCkgJgorCQkJCSAgICAgIEFUSF9NQ0lfQ09ORklHX01DSV9PQlNfR1BJTykgIT0KKwkJCQkJQVRIX01DSV9DT05GSUdfTUNJX09CU19HUElPKSB7CisKKwkJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJCQkiTUNJIHJlY29uZmlndXJlIG9ic2VydmF0aW9uXG4iKTsKKwkJCQlhcjkwMDNfbWNpX29ic2VydmF0aW9uX3NldF91cChhaCk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRU5EX1dMQU5fQ09FWF9WRVJTSU9OOgorCQlhcjkwMDNfbWNpX3NlbmRfY29leF92ZXJzaW9uX3Jlc3BvbnNlKGFoLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRVRfQlRfQ09FWF9WRVJTSU9OOgorCisJCWlmICghcF9kYXRhKQorCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkiTUNJIFNldCBCVCBDb2V4IHZlcnNpb24gd2l0aCBOVUxMIGRhdGEhIVxuIik7CisJCWVsc2UgeworCQkJbWNpLT5idF92ZXJfbWFqb3IgPSAoKnBfZGF0YSA+PiA4KSAmIDB4ZmY7CisJCQltY2ktPmJ0X3Zlcl9taW5vciA9ICgqcF9kYXRhKSAmIDB4ZmY7CisJCQltY2ktPmJ0X3ZlcnNpb25fa25vd24gPSB0cnVlOworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBCVCB2ZXJzaW9uIHNldDogJWQuJWRcbiIsCisJCQkJbWNpLT5idF92ZXJfbWFqb3IsIG1jaS0+YnRfdmVyX21pbm9yKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFTkRfV0xBTl9DSEFOTkVMUzoKKwkJaWYgKHBfZGF0YSkgeworCQkJaWYgKCgobWNpLT53bGFuX2NoYW5uZWxzWzFdICYgMHhmZmZmMDAwMCkgPT0KKwkJCSAgICAgKCoocF9kYXRhICsgMSkgJiAweGZmZmYwMDAwKSkgJiYKKwkJCSAgICAobWNpLT53bGFuX2NoYW5uZWxzWzJdID09ICoocF9kYXRhICsgMikpICYmCisJCQkgICAgKG1jaS0+d2xhbl9jaGFubmVsc1szXSA9PSAqKHBfZGF0YSArIDMpKSkKKwkJCQlicmVhazsKKworCQkJbWNpLT53bGFuX2NoYW5uZWxzWzBdID0gKnBfZGF0YSsrOworCQkJbWNpLT53bGFuX2NoYW5uZWxzWzFdID0gKnBfZGF0YSsrOworCQkJbWNpLT53bGFuX2NoYW5uZWxzWzJdID0gKnBfZGF0YSsrOworCQkJbWNpLT53bGFuX2NoYW5uZWxzWzNdID0gKnBfZGF0YSsrOworCQl9CisJCW1jaS0+d2xhbl9jaGFubmVsc191cGRhdGUgPSB0cnVlOworCQlhcjkwMDNfbWNpX3NlbmRfY29leF93bGFuX2NoYW5uZWxzKGFoLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9TRU5EX1ZFUlNJT05fUVVFUlk6CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3ZlcnNpb25fcXVlcnkoYWgsIHRydWUpOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX1NFTkRfU1RBVFVTX1FVRVJZOgorCQlxdWVyeV90eXBlID0gKEFSX1NSRVZfOTQ2Ml8xMChhaCkpID8KKwkJCQlNQ0lfR1BNX0NPRVhfUVVFUllfQlRfQUxMX0lORk8gOgorCQkJCU1DSV9HUE1fQ09FWF9RVUVSWV9CVF9UT1BPTE9HWTsKKworCQlhcjkwMDNfbWNpX3NlbmRfY29leF9idF9zdGF0dXNfcXVlcnkoYWgsIHRydWUsIHF1ZXJ5X3R5cGUpOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX05FRURfRkxVU0hfQlRfSU5GTzoKKwkJCS8qCisJCQkgKiBidGNvZXhfaHcubWNpLnVuaGFsdF9idF9ncG0gbWVhbnMgd2hldGhlciBpdCdzCisJCQkgKiBuZWVkZWQgdG8gc2VuZCBVTkhBTFQgbWVzc2FnZS4gSXQncyBzZXQgd2hlbmV2ZXIKKwkJCSAqIHRoZXJlJ3MgYSByZXF1ZXN0IHRvIHNlbmQgSEFMVCBtZXNzYWdlLgorCQkJICogbWNpX2hhbHRlZF9idF9ncG0gbWVhbnMgd2hldGhlciBIQUxUIG1lc3NhZ2UgaXMgc2VudAorCQkJICogb3V0IHN1Y2Nlc3NmdWxseS4KKwkJCSAqCisJCQkgKiBDaGVja2luZyAobWNpX3VuaGFsdF9idF9ncG0gPT0gZmFsc2UpIGluc3RlYWQgb2YKKwkJCSAqIGNoZWNraW5nIChhaC0+bWNpX2hhbHRlZF9idF9ncG0gPT0gZmFsc2UpIHdpbGwgbWFrZQorCQkJICogc3VyZSBjdXJyZW50bHkgaXMgaW4gVU5IQUxULWVkIG1vZGUgYW5kIEJUIGNhbgorCQkJICogcmVzcG9uZCB0byBzdGF0dXMgcXVlcnkuCisJCQkgKi8KKwkJCXZhbHVlID0gKCFtY2ktPnVuaGFsdF9idF9ncG0gJiYKKwkJCQkgbWNpLT5uZWVkX2ZsdXNoX2J0aW5mbykgPyAxIDogMDsKKwkJCWlmIChwX2RhdGEpCisJCQkJbWNpLT5uZWVkX2ZsdXNoX2J0aW5mbyA9CisJCQkJCSgqcF9kYXRhICE9IDApID8gdHJ1ZSA6IGZhbHNlOworCQkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9SRUNPVkVSX1JYOgorCisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgaHcgUkVDT1ZFUl9SWFxuIik7CisJCWFyOTAwM19tY2lfcHJlcF9pbnRlcmZhY2UoYWgpOworCQltY2ktPnF1ZXJ5X2J0ID0gdHJ1ZTsKKwkJbWNpLT5uZWVkX2ZsdXNoX2J0aW5mbyA9IHRydWU7CisJCWFyOTAwM19tY2lfc2VuZF9jb2V4X3dsYW5fY2hhbm5lbHMoYWgsIHRydWUpOworCQlhcjkwMDNfbWNpXzJnNWdfc3dpdGNoKGFoLCB0cnVlKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9TVEFURV9ORUVEX0ZUUF9TVE9NUDoKKwkJdmFsdWUgPSAhKG1jaS0+Y29uZmlnICYgQVRIX01DSV9DT05GSUdfRElTQUJMRV9GVFBfU1RPTVApOworCQlicmVhazsKKworCWNhc2UgTUNJX1NUQVRFX05FRURfVFVOSU5HOgorCQl2YWx1ZSA9ICEobWNpLT5jb25maWcgJiBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX1RVTklORyk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisKKwl9CisKKwlyZXR1cm4gdmFsdWU7Cit9CitFWFBPUlRfU1lNQk9MKGFyOTAwM19tY2lfc3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19tY2kuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4ZGExMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfbWNpLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIEFSOTAwM19NQ0lfSAorI2RlZmluZSBBUjkwMDNfTUNJX0gKKworI2RlZmluZSBNQ0lfRkxBR19ESVNBQkxFX1RJTUVTVEFNUCAgICAgIDB4MDAwMDAwMDEgICAgICAvKiBEaXNhYmxlIHRpbWUgc3RhbXAgKi8KKworLyogRGVmYXVsdCByZW1vdGUgQlQgZGV2aWNlIE1DSSBDT0VYIHZlcnNpb24gKi8KKyNkZWZpbmUgTUNJX0dQTV9DT0VYX01BSk9SX1ZFUlNJT05fREVGQVVMVCAgMworI2RlZmluZSBNQ0lfR1BNX0NPRVhfTUlOT1JfVkVSU0lPTl9ERUZBVUxUICAwCisKKy8qIExvY2FsIFdMQU4gTUNJIENPRVggdmVyc2lvbiAqLworI2RlZmluZSBNQ0lfR1BNX0NPRVhfTUFKT1JfVkVSU0lPTl9XTEFOICAgICAzCisjZGVmaW5lIE1DSV9HUE1fQ09FWF9NSU5PUl9WRVJTSU9OX1dMQU4gICAgIDAKKworZW51bSBtY2lfZ3BtX2NvZXhfcXVlcnlfdHlwZSB7CisJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX0FMTF9JTkZPICAgICAgPSBCSVQoMCksCisJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX1RPUE9MT0dZICAgICAgPSBCSVQoMSksCisJTUNJX0dQTV9DT0VYX1FVRVJZX0JUX0RFQlVHICAgICAgICAgPSBCSVQoMiksCit9OworCitlbnVtIG1jaV9ncG1fY29leF9oYWx0X2J0X2dwbSB7CisJTUNJX0dQTV9DT0VYX0JUX0dQTV9VTkhBTFQsCisJTUNJX0dQTV9DT0VYX0JUX0dQTV9IQUxUCit9OworCitlbnVtIG1jaV9ncG1fY29leF9idF91cGRhdGVfZmxhZ3Nfb3AgeworCU1DSV9HUE1fQ09FWF9CVF9GTEFHU19SRUFELAorCU1DSV9HUE1fQ09FWF9CVF9GTEFHU19TRVQsCisJTUNJX0dQTV9DT0VYX0JUX0ZMQUdTX0NMRUFSCit9OworCisjZGVmaW5lIE1DSV9OVU1fQlRfQ0hBTk5FTFMgICAgIDc5CisKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19VUERBVEVfQ09SUiAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfVVBEQVRFX0hEUiAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX1VQREFURV9QTEQgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19MTkFfQ1RSTCAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfREVCVUcgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX1NDSEVEX01TRyAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19DT05UX01TRyAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfQ09FWF9HUE0gICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX0NQVV9JTlRfTVNHICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgTUNJX0JUX01DSV9GTEFHU19NQ0lfTU9ERSAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIE1DSV9CVF9NQ0lfRkxBR1NfQVI5NDYyX01PREUgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBNQ0lfQlRfTUNJX0ZMQUdTX09USEVSICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKworI2RlZmluZSBNQ0lfREVGQVVMVF9CVF9NQ0lfRkxBR1MgICAgICAgICAgICAgIDB4MDAwMTFkZGUKKworI2RlZmluZSBNQ0lfVE9HR0xFX0JUX01DSV9GTEFHUyAgKE1DSV9CVF9NQ0lfRkxBR1NfVVBEQVRFX0NPUlIgfCBcCisJCQkJICBNQ0lfQlRfTUNJX0ZMQUdTX1VQREFURV9IRFIgIHwgXAorCQkJCSAgTUNJX0JUX01DSV9GTEFHU19VUERBVEVfUExEICB8IFwKKwkJCQkgIE1DSV9CVF9NQ0lfRkxBR1NfTUNJX01PREUpCisKKyNkZWZpbmUgTUNJXzJHX0ZMQUdTX0NMRUFSX01BU0sgICAweDAwMDAwMDAwCisjZGVmaW5lIE1DSV8yR19GTEFHU19TRVRfTUFTSyAgICAgTUNJX1RPR0dMRV9CVF9NQ0lfRkxBR1MKKyNkZWZpbmUgTUNJXzJHX0ZMQUdTICAgICAgICAgICAgICBNQ0lfREVGQVVMVF9CVF9NQ0lfRkxBR1MKKworI2RlZmluZSBNQ0lfNUdfRkxBR1NfQ0xFQVJfTUFTSyAgIE1DSV9UT0dHTEVfQlRfTUNJX0ZMQUdTCisjZGVmaW5lIE1DSV81R19GTEFHU19TRVRfTUFTSyAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBNQ0lfNUdfRkxBR1MgICAgICAgICAgICAgIChNQ0lfREVGQVVMVF9CVF9NQ0lfRkxBR1MgJiBcCisJCQkJICAgfk1DSV9UT0dHTEVfQlRfTUNJX0ZMQUdTKQorCisvKgorICogRGVmYXVsdCB2YWx1ZSBmb3IgQVI5NDYyIGlzIDB4MDAwMDIyMDEKKyAqLworI2RlZmluZSBBVEhfTUNJX0NPTkZJR19DT05DVVJfVFggICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX01DSV9PQlNfTUNJICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfTUNJX09CU19UWFJYICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0JUICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfTUNJX0NBTCAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfRElTQUJMRV9PU0xBICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX0ZUUF9TVE9NUCAgICAweDAwMDAwMDgwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0FHR1JfVEhSRVNIICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfQUdHUl9USFJFU0hfUyAgICAgICAgOAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19ESVNBQkxFX0FHR1JfVEhSRVNIICAweDAwMDAwODAwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0NMS19ESVYgICAgICAgICAgICAgIDB4MDAwMDMwMDAKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfQ0xLX0RJVl9TICAgICAgICAgICAgMTIKKyNkZWZpbmUgQVRIX01DSV9DT05GSUdfRElTQUJMRV9UVU5JTkcgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfV0VJR0hUX0RCRyAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEFUSF9NQ0lfQ09ORklHX0RJU0FCTEVfTUNJICAgICAgICAgIDB4ODAwMDAwMDAKKworI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX01BU0sgICAgIChBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX01DSSAgfCBcCisJCQkJCSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX1RYUlggfCBcCisJCQkJCSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0JUKQorI2RlZmluZSBBVEhfTUNJX0NPTkZJR19NQ0lfT0JTX0dQSU8gICAgIDB4MDAwMDAwMkYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BhcHJkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BhcHJkLmMKaW5kZXggYTQ0NTBjYi4uNTk2NDdhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19wYXByZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGFwcmQuYwpAQCAtMTE5LDggKzExOSw4IEBACiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWRlbHRhID0gMDsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkiSW52YWxpZCB0eC1jaGFpbm1hc2s6ICV1XG4iLCBhaC0+dHhjaGFpbm1hc2spOworCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLCAiSW52YWxpZCB0eC1jaGFpbm1hc2s6ICV1XG4iLAorCQkJYWgtPnR4Y2hhaW5tYXNrKTsKIAl9CiAKIAlwb3dlciArPSBkZWx0YTsKQEAgLTE0OCwxMyArMTQ4LDEyIEBACiAJZWxzZQogCQl0cmFpbmluZ19wb3dlciA9IGFyOTAwM19nZXRfdHJhaW5pbmdfcG93ZXJfNWcoYWgpOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkiVHJhaW5pbmcgcG93ZXI6ICVkLCBUYXJnZXQgcG93ZXI6ICVkXG4iLAorCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJUcmFpbmluZyBwb3dlcjogJWQsIFRhcmdldCBwb3dlcjogJWRcbiIsCiAJCXRyYWluaW5nX3Bvd2VyLCBhaC0+cGFwcmRfdGFyZ2V0X3Bvd2VyKTsKIAogCWlmICh0cmFpbmluZ19wb3dlciA8IDApIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkJIlBBUFJEIHRhcmdldCBwb3dlciBkZWx0YSBvdXQgb2YgcmFuZ2UiKTsKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKKwkJCSJQQVBSRCB0YXJnZXQgcG93ZXIgZGVsdGEgb3V0IG9mIHJhbmdlXG4iKTsKIAkJcmV0dXJuIC1FUkFOR0U7CiAJfQogCWFoLT5wYXByZF90cmFpbmluZ19wb3dlciA9IHRyYWluaW5nX3Bvd2VyOwpAQCAtMzExLDggKzMxMCw4IEBACiAJCXJlZ19jbF9nYWluID0gQVJfUEhZX0NMX1RBQl8yOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfQ0FMSUJSQVRFLAotCQkiSW52YWxpZCBjaGFpbm1hc2s6ICVkXG4iLCBjaGFpbik7CisJCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQ0FMSUJSQVRFLAorCQkJIkludmFsaWQgY2hhaW5tYXNrOiAlZFxuIiwgY2hhaW4pOwogCQlicmVhazsKIAl9CiAKQEAgLTg1MCw3ICs4NDksNyBAQAogCQlhZ2MyX3B3ciA9IFJFR19SRUFEX0ZJRUxEKGFoLCBBUl9QSFlfUEFQUkRfVFJBSU5FUl9TVEFUMSwKIAkJCQlBUl9QSFlfUEFQUkRfVFJBSU5FUl9TVEFUMV9QQVBSRF9BR0MyX1BXUik7CiAKLQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBBVEhfREJHX0NBTElCUkFURSwKKwkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBDQUxJQlJBVEUsCiAJCQkiQUdDMl9QV1IgPSAweCV4IHRyYWluaW5nIGRvbmUgPSAweCV4XG4iLAogCQkJYWdjMl9wd3IsIHBhcHJkX2RvbmUpOwogCS8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuYwppbmRleCAyMzMwZTdlLi4yNTg5YjM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmMKQEAgLTE5OSwxMiArMTk5LDE0IEBACiAJCQlzeW50aF9mcmVxID0gY2hhbi0+Y2hhbm5lbDsKIAkJfQogCX0gZWxzZSB7Ci0JCXJhbmdlID0gMTA7CisJCXJhbmdlID0gQVJfU1JFVl85NDYyKGFoKSA/IDUgOiAxMDsKIAkJbWF4X3NwdXJfY250cyA9IDQ7CiAJCXN5bnRoX2ZyZXEgPSBjaGFuLT5jaGFubmVsOwogCX0KIAogCWZvciAoaSA9IDA7IGkgPCBtYXhfc3B1cl9jbnRzOyBpKyspIHsKKwkJaWYgKEFSX1NSRVZfOTQ2MihhaCkgJiYgKGkgPT0gMCB8fCBpID09IDMpKQorCQkJY29udGludWU7CiAJCW5lZ2F0aXZlID0gMDsKIAkJaWYgKEFSX1NSRVZfOTQ4NShhaCkgfHwgQVJfU1JFVl85MzQwKGFoKSB8fCBBUl9TUkVWXzkzMzAoYWgpKQogCQkJY3VyX2JiX3NwdXIgPSBGQklOMkZSRVEoc3B1cl9mYmluX3B0cltpXSwKQEAgLTg4MCw3ICs4ODIsNyBAQAogCQkJCSAgICBBUl9QSFlfU0ZDT1JSX0xPV19VU0VfU0VMRl9DT1JSX0xPVyk7CiAKIAkJaWYgKCFvbiAhPSBhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCWF0aF9kYmcoY29tbW9uLCBBTkksCiAJCQkJIioqIGNoICVkOiBvZmRtIHdlYWsgc2lnbmFsOiAlcz0+JXNcbiIsCiAJCQkJY2hhbi0+Y2hhbm5lbCwKIAkJCQkhYW5pU3RhdGUtPm9mZG1XZWFrU2lnRGV0ZWN0T2ZmID8KQEAgLTg5OCw3ICs5MDAsNyBAQAogCQl1MzIgbGV2ZWwgPSBwYXJhbTsKIAogCQlpZiAobGV2ZWwgPj0gQVJSQVlfU0laRShmaXJzdGVwX3RhYmxlKSkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAorCQkJYXRoX2RiZyhjb21tb24sIEFOSSwKIAkJCQkiQVRIOUtfQU5JX0ZJUlNURVBfTEVWRUw6IGxldmVsIG91dCBvZiByYW5nZSAoJXUgPiAlenUpXG4iLAogCQkJCWxldmVsLCBBUlJBWV9TSVpFKGZpcnN0ZXBfdGFibGUpKTsKIAkJCXJldHVybiBmYWxzZTsKQEAgLTkzNSw3ICs5MzcsNyBAQAogCQkJICAgICAgQVJfUEhZX0ZJTkRfU0lHX0xPV19GSVJTVEVQX0xPVywgdmFsdWUyKTsKIAogCQlpZiAobGV2ZWwgIT0gYW5pU3RhdGUtPmZpcnN0ZXBMZXZlbCkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAorCQkJYXRoX2RiZyhjb21tb24sIEFOSSwKIAkJCQkiKiogY2ggJWQ6IGxldmVsICVkPT4lZFtkZWY6JWRdIGZpcnN0ZXBbbGV2ZWxdPSVkIGluaT0lZFxuIiwKIAkJCQljaGFuLT5jaGFubmVsLAogCQkJCWFuaVN0YXRlLT5maXJzdGVwTGV2ZWwsCkBAIC05NDMsNyArOTQ1LDcgQEAKIAkJCQlBVEg5S19BTklfRklSU1RFUF9MVkxfTkVXLAogCQkJCXZhbHVlLAogCQkJCWFuaVN0YXRlLT5pbmlEZWYuZmlyc3RlcCk7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQlhdGhfZGJnKGNvbW1vbiwgQU5JLAogCQkJCSIqKiBjaCAlZDogbGV2ZWwgJWQ9PiVkW2RlZjolZF0gZmlyc3RlcF9sb3dbbGV2ZWxdPSVkIGluaT0lZFxuIiwKIAkJCQljaGFuLT5jaGFubmVsLAogCQkJCWFuaVN0YXRlLT5maXJzdGVwTGV2ZWwsCkBAIC05NjMsNyArOTY1LDcgQEAKIAkJdTMyIGxldmVsID0gcGFyYW07CiAKIAkJaWYgKGxldmVsID49IEFSUkFZX1NJWkUoY3ljcHdyVGhyMV90YWJsZSkpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCWF0aF9kYmcoY29tbW9uLCBBTkksCiAJCQkJIkFUSDlLX0FOSV9TUFVSX0lNTVVOSVRZX0xFVkVMOiBsZXZlbCBvdXQgb2YgcmFuZ2UgKCV1ID4gJXp1KVxuIiwKIAkJCQlsZXZlbCwgQVJSQVlfU0laRShjeWNwd3JUaHIxX3RhYmxlKSk7CiAJCQlyZXR1cm4gZmFsc2U7CkBAIC05OTksNyArMTAwMSw3IEBACiAJCQkgICAgICBBUl9QSFlfRVhUX0NZQ1BXUl9USFIxLCB2YWx1ZTIpOwogCiAJCWlmIChsZXZlbCAhPSBhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKKwkJCWF0aF9kYmcoY29tbW9uLCBBTkksCiAJCQkJIioqIGNoICVkOiBsZXZlbCAlZD0+JWRbZGVmOiVkXSBjeWNwd3JUaHIxW2xldmVsXT0lZCBpbmk9JWRcbiIsCiAJCQkJY2hhbi0+Y2hhbm5lbCwKIAkJCQlhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwsCkBAIC0xMDA3LDcgKzEwMDksNyBAQAogCQkJCUFUSDlLX0FOSV9TUFVSX0lNTVVORV9MVkxfTkVXLAogCQkJCXZhbHVlLAogCQkJCWFuaVN0YXRlLT5pbmlEZWYuY3ljcHdyVGhyMSk7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksCisJCQlhdGhfZGJnKGNvbW1vbiwgQU5JLAogCQkJCSIqKiBjaCAlZDogbGV2ZWwgJWQ9PiVkW2RlZjolZF0gY3ljcHdyVGhyMUV4dFtsZXZlbF09JWQgaW5pPSVkXG4iLAogCQkJCWNoYW4tPmNoYW5uZWwsCiAJCQkJYW5pU3RhdGUtPnNwdXJJbW11bml0eUxldmVsLApAQCAtMTAzNCw4ICsxMDM2LDcgQEAKIAkJUkVHX1JNV19GSUVMRChhaCwgQVJfUEhZX01SQ19DQ0tfQ1RSTCwKIAkJCSAgICAgIEFSX1BIWV9NUkNfQ0NLX01VWF9SRUcsIGlzX29uKTsKIAkJaWYgKCFpc19vbiAhPSBhbmlTdGF0ZS0+bXJjQ0NLT2ZmKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksCi0JCQkJIioqIGNoICVkOiBNUkMgQ0NLOiAlcz0+JXNcbiIsCisJCQlhdGhfZGJnKGNvbW1vbiwgQU5JLCAiKiogY2ggJWQ6IE1SQyBDQ0s6ICVzPT4lc1xuIiwKIAkJCQljaGFuLT5jaGFubmVsLAogCQkJCSFhbmlTdGF0ZS0+bXJjQ0NLT2ZmID8gIm9uIiA6ICJvZmYiLAogCQkJCWlzX29uID8gIm9uIiA6ICJvZmYiKTsKQEAgLTEwNTAsMTEgKzEwNTEsMTEgQEAKIAljYXNlIEFUSDlLX0FOSV9QUkVTRU5UOgogCQlicmVhazsKIAlkZWZhdWx0OgotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksICJpbnZhbGlkIGNtZCAldVxuIiwgY21kKTsKKwkJYXRoX2RiZyhjb21tb24sIEFOSSwgImludmFsaWQgY21kICV1XG4iLCBjbWQpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAorCWF0aF9kYmcoY29tbW9uLCBBTkksCiAJCSJBTkkgcGFyYW1ldGVyczogU0k9JWQsIG9mZG1XUz0lcyBGUz0lZCBNUkNjY2s9JXMgbGlzdGVuVGltZT0lZCBvZmRtRXJycz0lZCBjY2tFcnJzPSVkXG4iLAogCQlhbmlTdGF0ZS0+c3B1ckltbXVuaXR5TGV2ZWwsCiAJCSFhbmlTdGF0ZS0+b2ZkbVdlYWtTaWdEZXRlY3RPZmYgPyAib24iIDogIm9mZiIsCkBAIC0xMTIzLDggKzExMjQsNyBAQAogCWFuaVN0YXRlID0gJmFoLT5jdXJjaGFuLT5hbmk7CiAJaW5pRGVmID0gJmFuaVN0YXRlLT5pbmlEZWY7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksCi0JCSJ2ZXIgJWQuJWQgb3Btb2RlICV1IGNoYW4gJWQgTWh6LzB4JXhcbiIsCisJYXRoX2RiZyhjb21tb24sIEFOSSwgInZlciAlZC4lZCBvcG1vZGUgJXUgY2hhbiAlZCBNaHovMHgleFxuIiwKIAkJYWgtPmh3X3ZlcnNpb24ubWFjVmVyc2lvbiwKIAkJYWgtPmh3X3ZlcnNpb24ubWFjUmV2LAogCQlhaC0+b3Btb2RlLApAQCAtMTM4Niw3ICsxMzg2LDcgQEAKIAkJCSAgfihBUl9QSFlfV0FUQ0hET0dfTk9OX0lETEVfRU5BQkxFIHwKIAkJCSAgICBBUl9QSFlfV0FUQ0hET0dfSURMRV9FTkFCTEUpKTsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19SRVNFVCwgIkRpc2FibGVkIEJCIFdhdGNoZG9nXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIFJFU0VULCAiRGlzYWJsZWQgQkIgV2F0Y2hkb2dcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xNDIyLDggKzE0MjIsNyBAQAogCQkgIEFSX1BIWV9XQVRDSERPR19JRExFX01BU0sgfAogCQkgIChBUl9QSFlfV0FUQ0hET0dfTk9OX0lETEVfTUFTSyAmIChpZGxlX2NvdW50IDw8IDIpKSk7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19SRVNFVCwKLQkJIkVuYWJsZWQgQkIgV2F0Y2hkb2cgdGltZW91dCAoJXUgbXMpXG4iLAorCWF0aF9kYmcoY29tbW9uLCBSRVNFVCwgIkVuYWJsZWQgQkIgV2F0Y2hkb2cgdGltZW91dCAoJXUgbXMpXG4iLAogCQlpZGxlX3Rtb19tcyk7CiB9CiAKQEAgLTE0NTIsOSArMTQ1MSw5IEBACiAJCXJldHVybjsKIAogCXN0YXR1cyA9IGFoLT5iYl93YXRjaGRvZ19sYXN0X3N0YXR1czsKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19SRVNFVCwKKwlhdGhfZGJnKGNvbW1vbiwgUkVTRVQsCiAJCSJcbj09PT0gQkIgdXBkYXRlOiBCQiBzdGF0dXM9MHglMDh4ID09PT1cbiIsIHN0YXR1cyk7Ci0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUkVTRVQsCisJYXRoX2RiZyhjb21tb24sIFJFU0VULAogCQkiKiogQkIgc3RhdGU6IHdkPSV1IGRldD0ldSByZGFyPSV1IHJPRkRNPSVkIHJDQ0s9JXUgdE9GRE09JXUgdENDSz0ldSBhZ2M9JXUgc3JjPSV1ICoqXG4iLAogCQlNUyhzdGF0dXMsIEFSX1BIWV9XQVRDSERPR19JTkZPKSwKIAkJTVMoc3RhdHVzLCBBUl9QSFlfV0FUQ0hET0dfREVUX0hBTkcpLApAQCAtMTQ2NiwyMiArMTQ2NSwxOSBAQAogCQlNUyhzdGF0dXMsIEFSX1BIWV9XQVRDSERPR19BR0NfU00pLAogCQlNUyhzdGF0dXMsIEFSX1BIWV9XQVRDSERPR19TUkNIX1NNKSk7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19SRVNFVCwKLQkJIioqIEJCIFdEIGNudGw6IGNudGwxPTB4JTA4eCBjbnRsMj0weCUwOHggKipcbiIsCisJYXRoX2RiZyhjb21tb24sIFJFU0VULCAiKiogQkIgV0QgY250bDogY250bDE9MHglMDh4IGNudGwyPTB4JTA4eCAqKlxuIiwKIAkJUkVHX1JFQUQoYWgsIEFSX1BIWV9XQVRDSERPR19DVExfMSksCiAJCVJFR19SRUFEKGFoLCBBUl9QSFlfV0FUQ0hET0dfQ1RMXzIpKTsKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19SRVNFVCwKLQkJIioqIEJCIG1vZGU6IEJCX2dlbl9jb250cm9scz0weCUwOHggKipcbiIsCisJYXRoX2RiZyhjb21tb24sIFJFU0VULCAiKiogQkIgbW9kZTogQkJfZ2VuX2NvbnRyb2xzPTB4JTA4eCAqKlxuIiwKIAkJUkVHX1JFQUQoYWgsIEFSX1BIWV9HRU5fQ1RSTCkpOwogCiAjZGVmaW5lIFBDVChfZmllbGQpIChjb21tb24tPmNjX3N1cnZleS5fZmllbGQgKiAxMDAgLyBjb21tb24tPmNjX3N1cnZleS5jeWNsZXMpCiAJaWYgKGNvbW1vbi0+Y2Nfc3VydmV5LmN5Y2xlcykKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUkVTRVQsCisJCWF0aF9kYmcoY29tbW9uLCBSRVNFVCwKIAkJCSIqKiBCQiBidXN5IHRpbWVzOiByeF9jbGVhcj0lZCUlLCByeF9mcmFtZT0lZCUlLCB0eF9mcmFtZT0lZCUlICoqXG4iLAogCQkJUENUKHJ4X2J1c3kpLCBQQ1QocnhfZnJhbWUpLCBQQ1QodHhfZnJhbWUpKTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1JFU0VULAotCQkiPT09PSBCQiB1cGRhdGU6IGRvbmUgPT09PVxuXG4iKTsKKwlhdGhfZGJnKGNvbW1vbiwgUkVTRVQsICI9PT09IEJCIHVwZGF0ZTogZG9uZSA9PT09XG5cbiIpOwogfQogRVhQT1JUX1NZTUJPTChhcjkwMDNfaHdfYmJfd2F0Y2hkb2dfZGJnX2luZm8pOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19waHkuaAppbmRleCA0MTE0ZmU3Li5lZDY0MTE0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3BoeS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcGh5LmgKQEAgLTM4OSw2ICszODksOCBAQAogI2RlZmluZSBBUl9QSFlfREFHX0NUUkxDQ0tfUlNTSV9USFJfUyAgIDEwCiAKICNkZWZpbmUgQVJfUEhZX1JJRlNfSU5JVF9ERUxBWSAgICAgICAgIDB4M2ZmMDAwMAorI2RlZmluZSBBUl9QSFlfQUdDX1FVSUNLX0RST1AgICAgICAgMHgwM2MwMDAwMAorI2RlZmluZSBBUl9QSFlfQUdDX1FVSUNLX0RST1BfUyAgICAgMjIKICNkZWZpbmUgQVJfUEhZX0FHQ19DT0FSU0VfTE9XICAgICAgIDB4MDAwMDdGODAKICNkZWZpbmUgQVJfUEhZX0FHQ19DT0FSU0VfTE9XX1MgICAgIDcKICNkZWZpbmUgQVJfUEhZX0FHQ19DT0FSU0VfSElHSCAgICAgIDB4MDAzRjgwMDAKQEAgLTQ4OCw2ICs0OTAsOCBAQAogI2RlZmluZSBBUl9QSFlfVEVTVF9DVExfVFNUQURDX0VOX1MgICAgICAgOAogI2RlZmluZSBBUl9QSFlfVEVTVF9DVExfUlhfT0JTX1NFTCAgICAgICAgMHgzQzAwCiAjZGVmaW5lIEFSX1BIWV9URVNUX0NUTF9SWF9PQlNfU0VMX1MgICAgICAxMAorI2RlZmluZSBBUl9QSFlfVEVTVF9DVExfREVCVUdQT1JUX1NFTAkgIDB4ZTAwMDAwMDAKKyNkZWZpbmUgQVJfUEhZX1RFU1RfQ1RMX0RFQlVHUE9SVF9TRUxfUwkgIDI5CiAKIAogI2RlZmluZSBBUl9QSFlfVFNUREFDICAgICAgICAgICAgKEFSX1NNX0JBU0UgKyAweDE2OCkKQEAgLTk5OSw2ICsxMDAzLDcgQEAKIAogLyogR0xCIFJlZ2lzdGVycyAqLwogI2RlZmluZSBBUl9HTEJfQkFTRQkweDIwMDAwCisjZGVmaW5lIEFSX0dMQl9HUElPX0NPTlRST0wJKEFSX0dMQl9CQVNFKQogI2RlZmluZSBBUl9QSFlfR0xCX0NPTlRST0wJKEFSX0dMQl9CQVNFICsgMHg0NCkKICNkZWZpbmUgQVJfR0xCX1NDUkFUQ0goX2FoKQkoQVJfR0xCX0JBU0UgKyBcCiAJCQkJCShBUl9TUkVWXzk0NjJfMjAoX2FoKSA/IDB4NGMgOiAweDUwKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcnR0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5MDAzX3J0dC5jCmluZGV4IDQ4ODAzZWUuLjQ1OGJlZGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjkwMDNfcnR0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTAwM19ydHQuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJhcjkwMDNfcGh5LmgiCisjaW5jbHVkZSAiYXI5MDAzX3J0dC5oIgogCiAjZGVmaW5lIFJUVF9SRVNUT1JFX1RJTUVPVVQgICAgICAgICAgMTAwMAogI2RlZmluZSBSVFRfQUNDRVNTX1RJTUVPVVQgICAgICAgICAgIDEwMApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTQ2Ml8ycDBfaW5pdHZhbHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hcjk0NjJfMnAwX2luaXR2YWxzLmgKaW5kZXggOWM1MWIzOS4uZGMyMDU0ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2FyOTQ2Ml8ycDBfaW5pdHZhbHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXI5NDYyXzJwMF9pbml0dmFscy5oCkBAIC00MSwyNCArNDEsMjQgQEAKIAogc3RhdGljIGNvbnN0IHUzMiBhcjk0NjJfMnAwX2Jhc2ViYW5kX3Bvc3RhbWJsZVtdWzVdID0gewogCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KLQl7MHgwMDAwOTgxMCwgMHhkMDBhODAwNSwgMHhkMDBhODAwNSwgMHhkMDBhODAxMSwgMHhkMDBhODAxMX0sCi0JezB4MDAwMDk4MjAsIDB4MjA2YTAyMmUsIDB4MjA2YTAyMmUsIDB4MjA2YTAxMmUsIDB4MjA2YTAxMmV9LAotCXsweDAwMDA5ODI0LCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwLCAweDVhYzY0MGQwfSwKLQl7MHgwMDAwOTgyOCwgMHgwNjkwMzA4MSwgMHgwNjkwMzA4MSwgMHgwNjkwMzg4MSwgMHgwNjkwMzg4MX0sCisJezB4MDAwMDk4MTAsIDB4ZDAwYTgwMDUsIDB4ZDAwYTgwMDUsIDB4ZDAwYTgwMTEsIDB4ZDAwYTgwMGR9LAorCXsweDAwMDA5ODIwLCAweDIwNmEwMjJlLCAweDIwNmEwMjJlLCAweDIwNmEwMTJlLCAweDIwNmEwMWFlfSwKKwl7MHgwMDAwOTgyNCwgMHg1YWM2NDBkZSwgMHg1YWM2NDBkMCwgMHg1YWM2NDBkMCwgMHg2M2M2NDBkYX0sCisJezB4MDAwMDk4MjgsIDB4MDc5NmJlODksIDB4MDY5NmIwODEsIDB4MDY5NmI4ODEsIDB4MDkxNDNlODF9LAogCXsweDAwMDA5ODJjLCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0LCAweDA1ZWVhNmQ0fSwKIAl7MHgwMDAwOTgzMCwgMHgwMDAwMDU5YywgMHgwMDAwMDU5YywgMHgwMDAwMTE5YywgMHgwMDAwMTE5Y30sCiAJezB4MDAwMDljMDAsIDB4MDAwMDAwYzQsIDB4MDAwMDAwYzQsIDB4MDAwMDAwYzQsIDB4MDAwMDAwYzR9LAogCXsweDAwMDA5ZTAwLCAweDAzNzIxMTFhLCAweDAzNzIxMTFhLCAweDAzNzIxNmEwLCAweDAzNzIxNmEwfSwKIAl7MHgwMDAwOWUwNCwgMHgwMDFjMjAyMCwgMHgwMDFjMjAyMCwgMHgwMDFjMjAyMCwgMHgwMDFjMjAyMH0sCi0JezB4MDAwMDllMGMsIDB4NmM0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmM0MDAwZTJ9LAotCXsweDAwMDA5ZTEwLCAweDdlYzg4ZDJlLCAweDdlYzg4ZDJlLCAweDdlYzg0ZDJlLCAweDdlYzg0ZDJlfSwKLQl7MHgwMDAwOWUxNCwgMHgzN2I5NWQ1ZSwgMHgzN2I5NjA1ZSwgMHgzMDM5NjA1ZSwgMHgzMzc5NWQ1ZX0sCisJezB4MDAwMDllMGMsIDB4NmM0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmQ0MDAwZTIsIDB4NmM0MDAwZDh9LAorCXsweDAwMDA5ZTEwLCAweDkyYzg4ZDJlLCAweDdlYzg4ZDJlLCAweDdlYzg0ZDJlLCAweDdlYzg2ZDJlfSwKKwl7MHgwMDAwOWUxNCwgMHgzN2I5NWQ1ZSwgMHgzN2I5NjA1ZSwgMHgzMzc2NjA1ZSwgMHgzMzc5NWQ1ZX0sCiAJezB4MDAwMDllMTgsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAogCXsweDAwMDA5ZTFjLCAweDAwMDFjZjljLCAweDAwMDFjZjljLCAweDAwMDIxZjljLCAweDAwMDIxZjljfSwKIAl7MHgwMDAwOWUyMCwgMHgwMDAwMDNiNSwgMHgwMDAwMDNiNSwgMHgwMDAwMDNjZSwgMHgwMDAwMDNjZX0sCiAJezB4MDAwMDllMmMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMWMsIDB4MDAwMDAwMjEsIDB4MDAwMDAwMjF9LAotCXsweDAwMDA5ZTNjLCAweGNmOTQ2MjIwLCAweGNmOTQ2MjIwLCAweGNmZDVjNzgyLCAweGNmZDVjNzgyfSwKLQl7MHgwMDAwOWU0NCwgMHhmZTMyMWUyNywgMHhmZTMyMWUyNywgMHhmZTI5MWUyNywgMHhmZTI5MWUyN30sCisJezB4MDAwMDllM2MsIDB4Y2Y5NDYyMjAsIDB4Y2Y5NDYyMjAsIDB4Y2ZkNWM3ODIsIDB4Y2ZkNWMyODJ9LAorCXsweDAwMDA5ZTQ0LCAweDYyMzIxZTI3LCAweDYyMzIxZTI3LCAweGZlMjkxZTI3LCAweGZlMjkxZTI3fSwKIAl7MHgwMDAwOWU0OCwgMHg1MDMwMjAxYSwgMHg1MDMwMjAxYSwgMHg1MDMwMjAxMiwgMHg1MDMwMjAxMn0sCiAJezB4MDAwMDlmYzgsIDB4MDAwM2YwMDAsIDB4MDAwM2YwMDAsIDB4MDAwMWEwMDAsIDB4MDAwMWEwMDB9LAogCXsweDAwMDBhMjA0LCAweDAxMzE4N2MwLCAweDAxMzE4N2M0LCAweDAxMzE4N2M0LCAweDAxMzE4N2MwfSwKQEAgLTgxLDYgKzgxLDE1IEBACiAJezB4MDAwMGEyZDAsIDB4MDAwNDE5ODEsIDB4MDAwNDE5ODEsIDB4MDAwNDE5ODEsIDB4MDAwNDE5ODJ9LAogCXsweDAwMDBhMmQ4LCAweDc5OTlhODNiLCAweDc5OTlhODNiLCAweDc5OTlhODNiLCAweDc5OTlhODNifSwKIAl7MHgwMDAwYTM1OCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCisJezB4MDAwMGEzYTQsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDB9LAorCXsweDAwMDBhM2E4LCAweGFhYWFhYWFhLCAweGFhYWFhYWFhLCAweGFhYWFhYWFhLCAweGFhYWFhYWFhfSwKKwl7MHgwMDAwYTNhYywgMHhhYWFhYWEwMCwgMHhhYWFhYWEzMCwgMHhhYWFhYWEwMCwgMHhhYWFhYWEwMH0sCisJezB4MDAwMGE0MWMsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2UsIDB4MWNlNzM5Y2V9LAorCXsweDAwMDBhNDIwLCAweDAwMDAwMWNlLCAweDAwMDAwMWNlLCAweDAwMDAwMWNlLCAweDAwMDAwMWNlfSwKKwl7MHgwMDAwYTQyNCwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZX0sCisJezB4MDAwMGE0MjgsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2UsIDB4MDAwMDAxY2V9LAorCXsweDAwMDBhNDJjLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlLCAweDFjZTczOWNlfSwKKwl7MHgwMDAwYTQzMCwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZSwgMHgxY2U3MzljZX0sCiAJezB4MDAwMGE4MzAsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWMsIDB4MDAwMDAxOWN9LAogCXsweDAwMDBhZTA0LCAweDAwMWMwMDAwLCAweDAwMWMwMDAwLCAweDAwMWMwMDAwLCAweDAwMTAwMDAwfSwKIAl7MHgwMDAwYWUxOCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMH0sCkBAIC02ODgsOCArNjk3LDggQEAKIHN0YXRpYyBjb25zdCB1MzIgYXI5NDYyXzJwMF9yYWRpb19wb3N0YW1ibGVfc3lzM2FudFtdWzVdID0gewogCS8qIEFkZHIgICAgICA1R19IVDIwICAgICA1R19IVDQwICAgICAyR19IVDQwICAgICAyR19IVDIwICAgKi8KIAl7MHgwMDAxNjBhYywgMHhhNDY0NmMwOCwgMHhhNDY0NmMwOCwgMHgyNDY0NTgwOCwgMHgyNDY0NTgwOH0sCi0JezB4MDAwMTYxNDAsIDB4MTA4MDQwMDgsIDB4MTA4MDQwMDgsIDB4OTA4MDQwMDgsIDB4OTA4MDQwMDh9LAotCXsweDAwMDE2NTQwLCAweDEwODA0MDA4LCAweDEwODA0MDA4LCAweDkwODA0MDA4LCAweDkwODA0MDA4fSwKKwl7MHgwMDAxNjE0MCwgMHgxMDgwNDAwOCwgMHgxMDgwNDAwOCwgMHg1MDgwNDAwOCwgMHg1MDgwNDAwOH0sCisJezB4MDAwMTY1NDAsIDB4MTA4MDQwMDgsIDB4MTA4MDQwMDgsIDB4NTA4MDQwMDgsIDB4NTA4MDQwMDh9LAogfTsKIAogc3RhdGljIGNvbnN0IHUzMiBhcjk0NjJfMnAwX2Jhc2ViYW5kX3Bvc3RhbWJsZV9lbXVsYXRpb25bXVs1XSA9IHsKQEAgLTcxNyw4ICs3MjYsOCBAQAogc3RhdGljIGNvbnN0IHUzMiBhcjk0NjJfMnAwX3JhZGlvX3Bvc3RhbWJsZV9zeXMyYW50W11bNV0gPSB7CiAJLyogQWRkciAgICAgIDVHX0hUMjAgICAgIDVHX0hUNDAgICAgIDJHX0hUNDAgICAgIDJHX0hUMjAgICAqLwogCXsweDAwMDE2MGFjLCAweGE0NjQ2YzA4LCAweGE0NjQ2YzA4LCAweDI0NjQ1ODA4LCAweDI0NjQ1ODA4fSwKLQl7MHgwMDAxNjE0MCwgMHgxMDgwNDAwOCwgMHgxMDgwNDAwOCwgMHg5MDgwNDAwOCwgMHg5MDgwNDAwOH0sCi0JezB4MDAwMTY1NDAsIDB4MTA4MDQwMDgsIDB4MTA4MDQwMDgsIDB4OTA4MDQwMDgsIDB4OTA4MDQwMDh9LAorCXsweDAwMDE2MTQwLCAweDEwODA0MDA4LCAweDEwODA0MDA4LCAweDUwODA0MDA4LCAweDUwODA0MDA4fSwKKwl7MHgwMDAxNjU0MCwgMHgxMDgwNDAwOCwgMHgxMDgwNDAwOCwgMHg1MDgwNDAwOCwgMHg1MDgwNDAwOH0sCiB9OwogCiBzdGF0aWMgY29uc3QgdTMyIGFyOTQ2Ml9jb21tb25fd29feGxuYV9yeF9nYWluX3RhYmxlXzJwMFtdWzJdID0gewpAQCAtMTA1OSw3ICsxMDY4LDcgQEAKIAogc3RhdGljIGNvbnN0IHUzMiBhcjk0NjJfMnAwX3NvY19wb3N0YW1ibGVbXVs1XSA9IHsKIAkvKiBBZGRyICAgICAgNUdfSFQyMCAgICAgNUdfSFQ0MCAgICAgMkdfSFQ0MCAgICAgMkdfSFQyMCAgICovCi0JezB4MDAwMDcwMTAsIDB4MDAwMDIyMzMsIDB4MDAwMDIyMzMsIDB4MDAwMDIyMzMsIDB4MDAwMDIyMzN9LAorCXsweDAwMDA3MDEwLCAweDAwMDAwMDMzLCAweDAwMDAwMDMzLCAweDAwMDAwMDMzLCAweDAwMDAwMDMzfSwKIH07CiAKIHN0YXRpYyBjb25zdCB1MzIgYXI5NDYyXzJwMF9iYXNlYmFuZF9jb3JlW11bMl0gPSB7CkBAIC0xMTA3LDExICsxMTE2LDExIEBACiAJezB4MDAwMDllMzAsIDB4MDYzMzZmNzd9LAogCXsweDAwMDA5ZTM0LCAweDZhZjY1MzJmfSwKIAl7MHgwMDAwOWUzOCwgMHgwY2M4MGMwMH0sCi0JezB4MDAwMDllNDAsIDB4MGQyNjE4MjB9LAorCXsweDAwMDA5ZTQwLCAweDE1MjYyODIwfSwKIAl7MHgwMDAwOWU0YywgMHgwMDAwMTAwNH0sCiAJezB4MDAwMDllNTAsIDB4MDBmZjAzZjF9LAotCXsweDAwMDA5ZTU0LCAweGU0YzM1NWM3fSwKLQl7MHgwMDAwOWU1OCwgMHhmZDg5NzczNX0sCisJezB4MDAwMDllNTQsIDB4ZTRjNTU1YzJ9LAorCXsweDAwMDA5ZTU4LCAweGZkODU3NzIyfSwKIAl7MHgwMDAwOWU1YywgMHhlOTE5ODcyNH0sCiAJezB4MDAwMDlmYzAsIDB4ODAzZTQ3ODh9LAogCXsweDAwMDA5ZmM0LCAweDAwMDFlZmI1fSwKQEAgLTExNDIsOSArMTE1MSw2IEBACiAJezB4MDAwMGEzOTgsIDB4MDAxZjBlMGZ9LAogCXsweDAwMDBhMzljLCAweDAwNzUzOTNmfSwKIAl7MHgwMDAwYTNhMCwgMHhiNzlmNjQyN30sCi0JezB4MDAwMGEzYTQsIDB4MDAwMDAwMDB9LAotCXsweDAwMDBhM2E4LCAweGFhYWFhYWFhfSwKLQl7MHgwMDAwYTNhYywgMHgzYzQ2NjQ3OH0sCiAJezB4MDAwMGEzYzAsIDB4MjAyMDIwMjB9LAogCXsweDAwMDBhM2M0LCAweDIyMjIyMjIwfSwKIAl7MHgwMDAwYTNjOCwgMHgyMDIwMDAyMH0sCkBAIC0xMTY3LDEyICsxMTczLDYgQEAKIAl7MHgwMDAwYTQwYywgMHgwMDgyMDgyMH0sCiAJezB4MDAwMGE0MTQsIDB4MWNlNzM5Y2V9LAogCXsweDAwMDBhNDE4LCAweDJkMDAxZGNlfSwKLQl7MHgwMDAwYTQxYywgMHgxY2U3MzljZX0sCi0JezB4MDAwMGE0MjAsIDB4MDAwMDAxY2V9LAotCXsweDAwMDBhNDI0LCAweDFjZTczOWNlfSwKLQl7MHgwMDAwYTQyOCwgMHgwMDAwMDFjZX0sCi0JezB4MDAwMGE0MmMsIDB4MWNlNzM5Y2V9LAotCXsweDAwMDBhNDMwLCAweDFjZTczOWNlfSwKIAl7MHgwMDAwYTQzNCwgMHgwMDAwMDAwMH0sCiAJezB4MDAwMGE0MzgsIDB4MDAwMDE4MDF9LAogCXsweDAwMDBhNDNjLCAweDAwMTAwMDAwfSwKQEAgLTEyNTcsOCArMTI1Nyw4IEBACiAJezB4MDAwMGE1NDAsIDB4NDgwMjVlNmMsIDB4NDgwMjVlNmMsIDB4MzgwMDE2NjAsIDB4MzgwMDE2NjB9LAogCXsweDAwMDBhNTQ0LCAweDRlMDI1ZThlLCAweDRlMDI1ZThlLCAweDNiMDAxODYxLCAweDNiMDAxODYxfSwKIAl7MHgwMDAwYTU0OCwgMHg1MzAyNWViMiwgMHg1MzAyNWViMiwgMHgzZTAwMWE4MSwgMHgzZTAwMWE4MX0sCi0JezB4MDAwMGE1NGMsIDB4NTkwMjVlYjIsIDB4NTkwMjVlYjIsIDB4NDIwMDFhODMsIDB4NDIwMDFhODN9LAotCXsweDAwMDBhNTUwLCAweDVmMDI1ZWY2LCAweDVmMDI1ZWY2LCAweDQ0MDAxYzg0LCAweDQ0MDAxYzg0fSwKKwl7MHgwMDAwYTU0YywgMHg1OTAyNWViNiwgMHg1OTAyNWViNiwgMHg0MjAwMWE4MywgMHg0MjAwMWE4M30sCisJezB4MDAwMGE1NTAsIDB4NWQwMjVlZjYsIDB4NWQwMjVlZjYsIDB4NDQwMDFjODQsIDB4NDQwMDFjODR9LAogCXsweDAwMDBhNTU0LCAweDYyMDI1ZjU2LCAweDYyMDI1ZjU2LCAweDQ4MDAxY2UzLCAweDQ4MDAxY2UzfSwKIAl7MHgwMDAwYTU1OCwgMHg2NjAyN2Y1NiwgMHg2NjAyN2Y1NiwgMHg0YzAwMWNlNSwgMHg0YzAwMWNlNX0sCiAJezB4MDAwMGE1NWMsIDB4NmEwMjlmNTYsIDB4NmEwMjlmNTYsIDB4NTAwMDFjZTksIDB4NTAwMDFjZTl9LApAQCAtMTg1MCw4ICsxODUwLDggQEAKIAl7MHgwMDAwYTU0MCwgMHg0ODAyNWU2YywgMHg0ODAyNWU2YywgMHgzODAwMTY2MCwgMHgzODAwMTY2MH0sCiAJezB4MDAwMGE1NDQsIDB4NGUwMjVlOGUsIDB4NGUwMjVlOGUsIDB4M2IwMDE4NjEsIDB4M2IwMDE4NjF9LAogCXsweDAwMDBhNTQ4LCAweDUzMDI1ZWIyLCAweDUzMDI1ZWIyLCAweDNlMDAxYTgxLCAweDNlMDAxYTgxfSwKLQl7MHgwMDAwYTU0YywgMHg1OTAyNWViMiwgMHg1OTAyNWViMiwgMHg0MjAwMWE4MywgMHg0MjAwMWE4M30sCi0JezB4MDAwMGE1NTAsIDB4NWYwMjVlZjYsIDB4NWYwMjVlZjYsIDB4NDQwMDFjODQsIDB4NDQwMDFjODR9LAorCXsweDAwMDBhNTRjLCAweDU5MDI1ZWI2LCAweDU5MDI1ZWI2LCAweDQyMDAxYTgzLCAweDQyMDAxYTgzfSwKKwl7MHgwMDAwYTU1MCwgMHg1ZDAyNWVmNiwgMHg1ZDAyNWVmNiwgMHg0NDAwMWM4NCwgMHg0NDAwMWM4NH0sCiAJezB4MDAwMGE1NTQsIDB4NjIwMjVmNTYsIDB4NjIwMjVmNTYsIDB4NDgwMDFjZTMsIDB4NDgwMDFjZTN9LAogCXsweDAwMDBhNTU4LCAweDY2MDI3ZjU2LCAweDY2MDI3ZjU2LCAweDRjMDAxY2U1LCAweDRjMDAxY2U1fSwKIAl7MHgwMDAwYTU1YywgMHg2YTAyOWY1NiwgMHg2YTAyOWY1NiwgMHg1MDAwMWNlOSwgMHg1MDAwMWNlOX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYXRoOWsuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hdGg5ay5oCmluZGV4IDFjMjY5ZjUuLmIzMGU5ZmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hdGg5ay5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9hdGg5ay5oCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIm1jaS5oIgogCiAvKgogICogSGVhZGVyIGZvciB0aGUgYXRoOWsua28gZHJpdmVyIGNvcmUgKm9ubHkqIC0tIGh3IGNvZGUgbm9yIGFueSBvdGhlciBkcml2ZXIKQEAgLTk2LDcgKzk3LDcgQEAKICNkZWZpbmUgYmZfaXNhbXBkdShiZikJCShiZi0+YmZfc3RhdGUuYmZfdHlwZSAmIEJVRl9BTVBEVSkKICNkZWZpbmUgYmZfaXNhZ2dyKGJmKQkJKGJmLT5iZl9zdGF0ZS5iZl90eXBlICYgQlVGX0FHR1IpCiAKLSNkZWZpbmUgQVRIX1RYU1RBVFVTX1JJTkdfU0laRSA2NAorI2RlZmluZSBBVEhfVFhTVEFUVVNfUklOR19TSVpFIDUxMgogCiAjZGVmaW5lCURTMlBIWVMoX2RkLCBfZHMpCQkJCQkJXAogCSgoX2RkKS0+ZGRfZGVzY19wYWRkciArICgoY2FkZHJfdCkoX2RzKSAtIChjYWRkcl90KShfZGQpLT5kZF9kZXNjKSkKQEAgLTE1OCw2ICsxNTksOSBAQAogLyogcmV0dXJuIGJsb2NrLWFjayBiaXRtYXAgaW5kZXggZ2l2ZW4gc2VxdWVuY2UgYW5kIHN0YXJ0aW5nIHNlcXVlbmNlICovCiAjZGVmaW5lIEFUSF9CQV9JTkRFWChfc3QsIF9zZXEpICgoKF9zZXEpIC0gKF9zdCkpICYgKElFRUU4MDIxMV9TRVFfTUFYIC0gMSkpCiAKKy8qIHJldHVybiB0aGUgc2Vxbm8gZm9yIF9zdGFydCArIF9vZmZzZXQgKi8KKyNkZWZpbmUgQVRIX0JBX0lOREVYMlNFUShfc2VxLCBfb2Zmc2V0KSAoKChfc2VxKSArIChfb2Zmc2V0KSkgJiAoSUVFRTgwMjExX1NFUV9NQVggLSAxKSkKKwogLyogcmV0dXJucyBkZWxpbWl0ZXIgcGFkZGluZyByZXF1aXJlZCBnaXZlbiB0aGUgcGFja2V0IGxlbmd0aCAqLwogI2RlZmluZSBBVEhfQUdHUl9HRVRfTkRFTElNKF9sZW4pCQkJCQlcCiAgICAgICAgKCgoX2xlbikgPj0gQVRIX0FHR1JfTUlOUExFTikgPyAwIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTE5Miw2ICsxOTYsNyBAQAogCXU4IHR4cV9oZWFkaWR4OwogCXU4IHR4cV90YWlsaWR4OwogCWludCBwZW5kaW5nX2ZyYW1lczsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGNvbXBsZXRlX3E7CiB9OwogCiBzdHJ1Y3QgYXRoX2F0eF9hYyB7CkBAIC0yMzcsNiArMjQyLDcgQEAKIAlzdHJ1Y3QgYXRoX25vZGUgKmFuOwogCXN0cnVjdCBhdGhfYXR4X2FjICphYzsKIAl1bnNpZ25lZCBsb25nIHR4X2J1ZltCSVRTX1RPX0xPTkdTKEFUSF9USURfTUFYX0JVRlMpXTsKKwlpbnQgYmFyX2luZGV4OwogCXUxNiBzZXFfc3RhcnQ7CiAJdTE2IHNlcV9uZXh0OwogCXUxNiBiYXdfc2l6ZTsKQEAgLTI1MSw4ICsyNTcsOSBAQAogc3RydWN0IGF0aF9ub2RlIHsKICNpZmRlZiBDT05GSUdfQVRIOUtfREVCVUdGUwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsgLyogZm9yIHNjLT5ub2RlcyAqLwotCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7IC8qIHN0YXRpb24gc3RydWN0IHdlJ3JlIHBhcnQgb2YgKi8KICNlbmRpZgorCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7IC8qIHN0YXRpb24gc3RydWN0IHdlJ3JlIHBhcnQgb2YgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOyAvKiBpbnRlcmZhY2Ugd2l0aCB3aGljaCB3ZSdyZSBhc3NvY2lhdGVkICovCiAJc3RydWN0IGF0aF9hdHhfdGlkIHRpZFtXTUVfTlVNX1RJRF07CiAJc3RydWN0IGF0aF9hdHhfYWMgYWNbV01FX05VTV9BQ107CiAJaW50IHBzX2tleTsKQEAgLTI3NCw3ICsyODEsNiBAQAogfTsKIAogI2RlZmluZSBBVEhfVFhfRVJST1IgICAgICAgIDB4MDEKLSNkZWZpbmUgQVRIX1RYX0JBUiAgICAgICAgICAweDAyCiAKIC8qKgogICogQHR4cV9tYXA6ICBJbmRleCBpcyBtYWM4MDIxMSBxdWV1ZSBudW1iZXIuICBUaGlzIGlzCkBAIC00NDMsNyArNDQ5LDkgQEAKIAl1MzIgYnRjb2V4X25vX3N0b21wOyAvKiBpbiB1c2VjICovCiAJdTMyIGJ0Y29leF9wZXJpb2Q7IC8qIGluIHVzZWMgKi8KIAl1MzIgYnRzY2FuX25vX3N0b21wOyAvKiBpbiB1c2VjICovCisJdTMyIGR1dHlfY3ljbGU7CiAJc3RydWN0IGF0aF9nZW5fdGltZXIgKm5vX3N0b21wX3RpbWVyOyAvKiBUaW1lciBmb3Igbm8gQlQgc3RvbXBpbmcgKi8KKwlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlIG1jaTsKIH07CiAKIGludCBhdGhfaW5pdF9idGNvZXhfdGltZXIoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwpAQCAtNDU4LDcgKzQ2Niw3IEBACiAjZGVmaW5lIEFUSF9MRURfUElOXzkyODcJCTgKICNkZWZpbmUgQVRIX0xFRF9QSU5fOTMwMAkJMTAKICNkZWZpbmUgQVRIX0xFRF9QSU5fOTQ4NQkJNgotI2RlZmluZSBBVEhfTEVEX1BJTl85NDYyCQkwCisjZGVmaW5lIEFUSF9MRURfUElOXzk0NjIJCTQKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9MRURTCiB2b2lkIGF0aF9pbml0X2xlZHMoc3RydWN0IGF0aF9zb2Z0YyAqc2MpOwpAQCAtNTM4LDcgKzU0Niw3IEBACiAjZGVmaW5lIERFRkFVTFRfQ0FDSEVMSU5FICAgICAgIDMyCiAjZGVmaW5lIEFUSF9SRUdDTEFTU0lEU19NQVggICAgIDEwCiAjZGVmaW5lIEFUSF9DQUJRX1JFQURZX1RJTUUgICAgIDgwICAgICAgLyogJSBvZiBiZWFjb24gaW50ZXJ2YWwgKi8KLSNkZWZpbmUgQVRIX01BWF9TV19SRVRSSUVTICAgICAgMTAKKyNkZWZpbmUgQVRIX01BWF9TV19SRVRSSUVTICAgICAgMzAKICNkZWZpbmUgQVRIX0NIQU5fTUFYICAgICAgICAgICAgMjU1CiAKICNkZWZpbmUgQVRIX1RYUE9XRVJfTUFYICAgICAgICAgMTAwICAgICAvKiAuNSBkQm0gdW5pdHMgKi8KQEAgLTY0Myw2ICs2NTEsNyBAQAogCXN0cnVjdCBkZWxheWVkX3dvcmsgdHhfY29tcGxldGVfd29yazsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGh3X3BsbF93b3JrOwogCXN0cnVjdCBhdGhfYnRjb2V4IGJ0Y29leDsKKwlzdHJ1Y3QgYXRoX21jaV9jb2V4IG1jaV9jb2V4OwogCiAJc3RydWN0IGF0aF9kZXNjZG1hIHR4c2RtYTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2JlYWNvbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2JlYWNvbi5jCmluZGV4IGExM2NhYmIuLmI4OTY3ZTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9iZWFjb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYmVhY29uLmMKQEAgLTExNywxMSArMTE3LDEwIEBACiAJbWVtc2V0KCZ0eGN0bCwgMCwgc2l6ZW9mKHN0cnVjdCBhdGhfdHhfY29udHJvbCkpOwogCXR4Y3RsLnR4cSA9IHNjLT5iZWFjb24uY2FicTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsCi0JCSJ0cmFuc21pdHRpbmcgQ0FCUSBwYWNrZXQsIHNrYjogJXBcbiIsIHNrYik7CisJYXRoX2RiZyhjb21tb24sIFhNSVQsICJ0cmFuc21pdHRpbmcgQ0FCUSBwYWNrZXQsIHNrYjogJXBcbiIsIHNrYik7CiAKIAlpZiAoYXRoX3R4X3N0YXJ0KGh3LCBza2IsICZ0eGN0bCkgIT0gMCkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19YTUlULCAiQ0FCUSBUWCBmYWlsZWRcbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgWE1JVCwgIkNBQlEgVFggZmFpbGVkXG4iKTsKIAkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAl9CiB9CkBAIC0yMDQsNyArMjAzLDcgQEAKIAogCWlmIChza2IgJiYgY2FicV9kZXB0aCkgewogCQlpZiAoc2MtPm52aWZzID4gMSkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQkVBQ09OLAorCQkJYXRoX2RiZyhjb21tb24sIEJFQUNPTiwKIAkJCQkiRmx1c2hpbmcgcHJldmlvdXMgY2FicSB0cmFmZmljXG4iKTsKIAkJCWF0aF9kcmFpbnR4cShzYywgY2FicSwgZmFsc2UpOwogCQl9CkBAIC0yOTcsNyArMjk2LDcgQEAKIAkJdHNmYWRqdXN0ID0gVFVfVE9fVVNFQyhpbnR2YWwgKiBhdnAtPmF2X2JzbG90KSAvIEFUSF9CQ0JVRjsKIAkJYXZwLT50c2ZfYWRqdXN0ID0gY3B1X3RvX2xlNjQodHNmYWRqdXN0KTsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19CRUFDT04sCisJCWF0aF9kYmcoY29tbW9uLCBCRUFDT04sCiAJCQkic3RhZ2dlciBiZWFjb25zLCBic2xvdCAlZCBpbnR2YWwgJXUgdHNmYWRqdXN0ICVsbHVcbiIsCiAJCQlhdnAtPmF2X2JzbG90LCBpbnR2YWwsICh1bnNpZ25lZCBsb25nIGxvbmcpdHNmYWRqdXN0KTsKIApAQCAtMzU3LDYgKzM1Niw3IEBACiAJc3RydWN0IGF0aF9idWYgKmJmID0gTlVMTDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOwogCXN0cnVjdCBhdGhfdHhfc3RhdHVzIHRzOworCWJvb2wgZWRtYSA9ICEhKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSk7CiAJaW50IHNsb3Q7CiAJdTMyIGJmYWRkciwgYmMgPSAwOwogCkBAIC0zNzEsMTUgKzM3MSwxNCBAQAogCQlzYy0+YmVhY29uLmJtaXNzY250Kys7CiAKIAkJaWYgKHNjLT5iZWFjb24uYm1pc3NjbnQgPCBCU1RVQ0tfVEhSRVNIICogc2MtPm5iY252aWZzKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19CU1RVQ0ssCisJCQlhdGhfZGJnKGNvbW1vbiwgQlNUVUNLLAogCQkJCSJtaXNzZWQgJXUgY29uc2VjdXRpdmUgYmVhY29uc1xuIiwKIAkJCQlzYy0+YmVhY29uLmJtaXNzY250KTsKIAkJCWF0aDlrX2h3X3N0b3BfZG1hX3F1ZXVlKGFoLCBzYy0+YmVhY29uLmJlYWNvbnEpOwogCQkJaWYgKHNjLT5iZWFjb24uYm1pc3NjbnQgPiAzKQogCQkJCWF0aDlrX2h3X2JzdHVja19uZmNhbChhaCk7CiAJCX0gZWxzZSBpZiAoc2MtPmJlYWNvbi5ibWlzc2NudCA+PSBCU1RVQ0tfVEhSRVNIKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19CU1RVQ0ssCi0JCQkJImJlYWNvbiBpcyBvZmZpY2lhbGx5IHN0dWNrXG4iKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBCU1RVQ0ssICJiZWFjb24gaXMgb2ZmaWNpYWxseSBzdHVja1xuIik7CiAJCQlzYy0+c2NfZmxhZ3MgfD0gU0NfT1BfVFNGX1JFU0VUOwogCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoc2MtPmh3LCAmc2MtPmh3X3Jlc2V0X3dvcmspOwogCQl9CkBAIC00MDYsNyArNDA1LDcgQEAKIAkJc2xvdCA9ICh0c2Z0dSAlIChpbnR2YWwgKiBBVEhfQkNCVUYpKSAvIGludHZhbDsKIAkJdmlmID0gc2MtPmJlYWNvbi5ic2xvdFtzbG90XTsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19CRUFDT04sCisJCWF0aF9kYmcoY29tbW9uLCBCRUFDT04sCiAJCQkic2xvdCAlZCBbdHNmICVsbHUgdHNmdHUgJXUgaW50dmFsICV1XSB2aWYgJXBcbiIsCiAJCQlzbG90LCB0c2YsIHRzZnR1IC8gQVRIX0JDQlVGLCBpbnR2YWwsIHZpZik7CiAJfSBlbHNlIHsKQEAgLTQyNCw3ICs0MjMsNyBAQAogCQl9CiAKIAkJaWYgKHNjLT5iZWFjb24uYm1pc3NjbnQgIT0gMCkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQlNUVUNLLAorCQkJYXRoX2RiZyhjb21tb24sIEJTVFVDSywKIAkJCQkicmVzdW1lIGJlYWNvbiB4bWl0IGFmdGVyICV1IG1pc3Nlc1xuIiwKIAkJCQlzYy0+YmVhY29uLmJtaXNzY250KTsKIAkJCXNjLT5iZWFjb24uYm1pc3NjbnQgPSAwOwpAQCAtNDU4LDEwICs0NTcsMTIgQEAKIAlpZiAoYmZhZGRyICE9IDApIHsKIAkJLyogTkI6IGNhYnEgdHJhZmZpYyBzaG91bGQgYWxyZWFkeSBiZSBxdWV1ZWQgYW5kIHByaW1lZCAqLwogCQlhdGg5a19od19wdXR0eGJ1ZihhaCwgc2MtPmJlYWNvbi5iZWFjb25xLCBiZmFkZHIpOwotCQlhdGg5a19od190eHN0YXJ0KGFoLCBzYy0+YmVhY29uLmJlYWNvbnEpOworCisJCWlmICghZWRtYSkKKwkJCWF0aDlrX2h3X3R4c3RhcnQoYWgsIHNjLT5iZWFjb24uYmVhY29ucSk7CiAKIAkJc2MtPmJlYWNvbi5hc3RfYmVfeG1pdCArPSBiYzsgICAgIC8qIFhYWCBwZXItdmlmPyAqLwotCQlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9FRE1BKSB7CisJCWlmIChlZG1hKSB7CiAJCQlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAJCQlhdGg5a19od190eHByb2NkZXNjKGFoLCBiZi0+YmZfZGVzYywgKHZvaWQgKikmdHMpOwogCQkJc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CkBAIC01NDEsNyArNTQyLDcgQEAKIAogCS8qIE5vIG5lZWQgdG8gY29uZmlndXJlIGJlYWNvbiBpZiB3ZSBhcmUgbm90IGFzc29jaWF0ZWQgKi8KIAlpZiAoIWNvbW1vbi0+Y3VyYWlkKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0JFQUNPTiwKKwkJYXRoX2RiZyhjb21tb24sIEJFQUNPTiwKIAkJCSJTVEEgaXMgbm90IHlldCBhc3NvY2lhdGVkLi5za2lwcGluZyBiZWFjb24gY29uZmlnXG4iKTsKIAkJcmV0dXJuOwogCX0KQEAgLTYzMSw4ICs2MzIsOCBAQAogCS8qIFRTRiBvdXQgb2YgcmFuZ2UgdGhyZXNob2xkIGZpeGVkIGF0IDEgc2Vjb25kICovCiAJYnMuYnNfdHNmb29yX3RocmVzaG9sZCA9IEFUSDlLX1RTRk9PUl9USFJFU0hPTEQ7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19CRUFDT04sICJ0c2Y6ICVsbHUgdHNmdHU6ICV1XG4iLCB0c2YsIHRzZnR1KTsKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19CRUFDT04sCisJYXRoX2RiZyhjb21tb24sIEJFQUNPTiwgInRzZjogJWxsdSB0c2Z0dTogJXVcbiIsIHRzZiwgdHNmdHUpOworCWF0aF9kYmcoY29tbW9uLCBCRUFDT04sCiAJCSJibWlzczogJXUgc2xlZXA6ICV1IGNmcC1wZXJpb2Q6ICV1IG1heGR1cjogJXUgbmV4dDogJXVcbiIsCiAJCWJzLmJzX2JtaXNzdGhyZXNob2xkLCBicy5ic19zbGVlcGR1cmF0aW9uLAogCQlicy5ic19jZnBwZXJpb2QsIGJzLmJzX2NmcG1heGR1cmF0aW9uLCBicy5ic19jZnBuZXh0KTsKQEAgLTY2MCw4ICs2NjEsNyBAQAogCXRzZiA9IHJvdW5kdXAoYXRoOWtfaHdfZ2V0dHNmMzIoYWgpICsgVFVfVE9fVVNFQyhGVURHRSksIGludHZhbCk7CiAJbmV4dHRidHQgPSB0c2YgKyBpbnR2YWw7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19CRUFDT04sCi0JCSJJQlNTIG5leHR0YnR0ICV1IGludHZhbCAldSAoJXUpXG4iLAorCWF0aF9kYmcoY29tbW9uLCBCRUFDT04sICJJQlNTIG5leHR0YnR0ICV1IGludHZhbCAldSAoJXUpXG4iLAogCQluZXh0dGJ0dCwgaW50dmFsLCBjb25mLT5iZWFjb25faW50ZXJ2YWwpOwogCiAJLyoKQEAgLTY5OSw5ICs2OTksOCBAQAogCSAgICAoc2MtPm5iY252aWZzID4gMSkgJiYKIAkgICAgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgJiYKIAkgICAgKGN1cl9jb25mLT5iZWFjb25faW50ZXJ2YWwgIT0gYnNzX2NvbmYtPmJlYWNvbl9pbnQpKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJCSJDaGFuZ2luZyBiZWFjb24gaW50ZXJ2YWwgb2YgbXVsdGlwbGUgXAotCQkJQVAgaW50ZXJmYWNlcyAhXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywKKwkJCSJDaGFuZ2luZyBiZWFjb24gaW50ZXJ2YWwgb2YgbXVsdGlwbGUgQVAgaW50ZXJmYWNlcyAhXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAkvKgpAQCAtNzEwLDcgKzcwOSw3IEBACiAJICovCiAJaWYgKChzYy0+c2NfYWgtPm9wbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkgJiYKIAkgICAgKHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAorCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAogCQkJIlNUQSB2aWYncyBiZWFjb24gbm90IGFsbG93ZWQgb24gQVAgbW9kZVxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CkBAIC03MjIsNyArNzIxLDcgQEAKIAkgICAgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSAmJgogCSAgICAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfQkVBQ09OUykgJiYKIAkgICAgIWF2cC0+cHJpbWFyeV9zdGFfdmlmKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywKIAkJCSJCZWFjb24gYWxyZWFkeSBjb25maWd1cmVkIGZvciBhIHN0YXRpb24gaW50ZXJmYWNlXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTgwMiw4ICs4MDEsNyBAQAogCQlhdGhfYmVhY29uX2NvbmZpZ19zdGEoc2MsIGN1cl9jb25mKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkJIlVuc3VwcG9ydGVkIGJlYWNvbmluZyBtb2RlXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIlVuc3VwcG9ydGVkIGJlYWNvbmluZyBtb2RlXG4iKTsKIAkJcmV0dXJuOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5jCmluZGV4IDAxMjI2MzkuLmE2NzEyYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9idGNvZXguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmMKQEAgLTIxLDcgKzIxLDcgQEAKIAlBVEhfQlRfQ09FWF9NT0RFX0xFR0FDWSwgICAgICAgIC8qIGxlZ2FjeSByeF9jbGVhciBtb2RlICovCiAJQVRIX0JUX0NPRVhfTU9ERV9VTlNMT1RURUQsICAgICAvKiB1bnRpbWVkL3Vuc2xvdHRlZCBtb2RlICovCiAJQVRIX0JUX0NPRVhfTU9ERV9TTE9UVEVELCAgICAgICAvKiBzbG90dGVkIG1vZGUgKi8KLQlBVEhfQlRfQ09FWF9NT0RFX0RJU0FMQkVELCAgICAgIC8qIGNvZXhpc3RlbmNlIGRpc2FibGVkICovCisJQVRIX0JUX0NPRVhfTU9ERV9ESVNBQkxFRCwgICAgICAvKiBjb2V4aXN0ZW5jZSBkaXNhYmxlZCAqLwogfTsKIAogc3RydWN0IGF0aF9idGNvZXhfY29uZmlnIHsKQEAgLTM2LDYgKzM2LDIwIEBACiAJYm9vbCBidF9ob2xkX3J4X2NsZWFyOwogfTsKIAorc3RhdGljIGNvbnN0IHUzMiBhcjkwMDNfd2xhbl93ZWlnaHRzW0FUSF9CVENPRVhfU1RPTVBfTUFYXQorCQkJCSAgICBbQVI5MzAwX05VTV9XTEFOX1dFSUdIVFNdID0geworCXsgMHhmZmZmZmZmMCwgMHhmZmZmZmZmMCwgMHhmZmZmZmZmMCwgMHhmZmZmZmZmMCB9LCAvKiBTVE9NUF9BTEwgKi8KKwl7IDB4ODg4ODg4ODAsIDB4ODg4ODg4ODAsIDB4ODg4ODg4ODAsIDB4ODg4ODg4ODAgfSwgLyogU1RPTVBfTE9XICovCisJeyAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwIH0sIC8qIFNUT01QX05PTkUgKi8KK307CisKK3N0YXRpYyBjb25zdCB1MzIgYXI5NDYyX3dsYW5fd2VpZ2h0c1tBVEhfQlRDT0VYX1NUT01QX01BWF0KKwkJCQkgICAgW0FSOTMwMF9OVU1fV0xBTl9XRUlHSFRTXSA9IHsKKwl7IDB4MDEwMTdkMDEsIDB4NDE0MTQxMDEsIDB4NDE0MTQxMDEsIDB4NDE0MTQxNDEgfSwgLyogU1RPTVBfQUxMICovCisJeyAweDAxMDE3ZDAxLCAweDNiM2IzYjAxLCAweDNiM2IzYjAxLCAweDNiM2IzYjNiIH0sIC8qIFNUT01QX0xPVyAqLworCXsgMHgwMTAxN2QwMSwgMHgwMTAxMDEwMSwgMHgwMTAxMDEwMSwgMHgwMTAxMDEwMSB9LCAvKiBTVE9NUF9OT05FICovCisJeyAweDAxMDE3ZDAxLCAweDAxM2IwMTAxLCAweDNiM2IwMTAxLCAweDNiM2IwMTNiIH0sIC8qIFNUT01QX0xPV19GVFAgKi8KK307CiAKIHZvaWQgYXRoOWtfaHdfaW5pdF9idGNvZXhfaHcoc3RydWN0IGF0aF9odyAqYWgsIGludCBxbnVtKQogewpAQCAtNTQsNiArNjgsOSBAQAogCXUzMiBpLCBpZHg7CiAJYm9vbCByeGNsZWFyX3BvbGFyaXR5ID0gYXRoX2J0X2NvbmZpZy5idF9yeGNsZWFyX3BvbGFyaXR5OwogCisJaWYgKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSA9PSBBVEhfQlRDT0VYX0NGR19OT05FKQorCQlyZXR1cm47CisKIAlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkKIAkJcnhjbGVhcl9wb2xhcml0eSA9ICFhdGhfYnRfY29uZmlnLmJ0X3J4Y2xlYXJfcG9sYXJpdHk7CiAKQEAgLTg1LDYgKzEwMiw5IEBACiB7CiAJc3RydWN0IGF0aF9idGNvZXhfaHcgKmJ0Y29leF9odyA9ICZhaC0+YnRjb2V4X2h3OwogCisJaWYgKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSA9PSBBVEhfQlRDT0VYX0NGR19OT05FKQorCQlyZXR1cm47CisKIAkvKiBjb25uZWN0IGJ0X2FjdGl2ZSB0byBiYXNlYmFuZCAqLwogCVJFR19DTFJfQklUKGFoLCBBUl9HUElPX0lOUFVUX0VOX1ZBTCwKIAkJICAgIChBUl9HUElPX0lOUFVUX0VOX1ZBTF9CVF9QUklPUklUWV9ERUYgfApAQCAtMTA3LDYgKzEyNyw5IEBACiB7CiAJc3RydWN0IGF0aF9idGNvZXhfaHcgKmJ0Y29leF9odyA9ICZhaC0+YnRjb2V4X2h3OwogCisJaWYgKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSA9PSBBVEhfQlRDT0VYX0NGR19OT05FKQorCQlyZXR1cm47CisKIAkvKiBidGNvZXggMy13aXJlICovCiAJUkVHX1NFVF9CSVQoYWgsIEFSX0dQSU9fSU5QVVRfRU5fVkFMLAogCQkJKEFSX0dQSU9fSU5QVVRfRU5fVkFMX0JUX1BSSU9SSVRZX0JCIHwKQEAgLTEzMyw2ICsxNTYsOSBAQAogewogCXN0cnVjdCBhdGhfYnRjb2V4X2h3ICpidGNvZXhfaHcgPSAmYWgtPmJ0Y29leF9odzsKIAorCWlmIChhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgPT0gQVRIX0JUQ09FWF9DRkdfTk9ORSkKKwkJcmV0dXJuOworCiAJLyogQ29uZmlndXJlIHRoZSBkZXNpcmVkIEdQSU8gcG9ydCBmb3IgVFhfRlJBTUUgb3V0cHV0ICovCiAJYXRoOWtfaHdfY2ZnX291dHB1dChhaCwgYnRjb2V4X2h3LT53bGFuYWN0aXZlX2dwaW8sCiAJCQkgICAgQVJfR1BJT19PVVRQVVRfTVVYX0FTX1RYX0ZSQU1FKTsKQEAgLTE0NCw2ICsxNzAsOSBAQAogewogCXN0cnVjdCBhdGhfYnRjb2V4X2h3ICpidGNvZXhfaHcgPSAmYWgtPmJ0Y29leF9odzsKIAorCWlmIChhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgPT0gQVRIX0JUQ09FWF9DRkdfTk9ORSkKKwkJcmV0dXJuOworCiAJYnRjb2V4X2h3LT5idF9jb2V4X3dlaWdodHMgPSBTTShidF93ZWlnaHQsIEFSX0JUQ09FWF9CVF9XR0hUKSB8CiAJCQkJICAgICBTTSh3bGFuX3dlaWdodCwgQVJfQlRDT0VYX1dMX1dHSFQpOwogfQpAQCAtMTUyLDI3ICsxODEsMjYgQEAKIAogc3RhdGljIHZvaWQgYXRoOWtfaHdfYnRjb2V4X2VuYWJsZV8zd2lyZShzdHJ1Y3QgYXRoX2h3ICphaCkKIHsKLQlzdHJ1Y3QgYXRoX2J0Y29leF9odyAqYnRjb2V4X2h3ID0gJmFoLT5idGNvZXhfaHc7CisJc3RydWN0IGF0aF9idGNvZXhfaHcgKmJ0Y29leCA9ICZhaC0+YnRjb2V4X2h3OwogCXUzMiAgdmFsOworCWludCBpOwogCiAJLyoKIAkgKiBQcm9ncmFtIGNvZXggbW9kZSBhbmQgd2VpZ2h0IHJlZ2lzdGVycyB0bwogCSAqIGVuYWJsZSBjb2V4IDMtd2lyZQogCSAqLwotCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9NT0RFLCBidGNvZXhfaHctPmJ0X2NvZXhfbW9kZSk7Ci0JUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX01PREUyLCBidGNvZXhfaHctPmJ0X2NvZXhfbW9kZTIpOworCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9NT0RFLCBidGNvZXgtPmJ0X2NvZXhfbW9kZSk7CisJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX01PREUyLCBidGNvZXgtPmJ0X2NvZXhfbW9kZTIpOwogCiAKIAlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgewotCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzAsIGFoLT5idF9jb2V4X3dsYW5fd2VpZ2h0WzBdKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX1dMX1dFSUdIVFMxLCBhaC0+YnRfY29leF93bGFuX3dlaWdodFsxXSk7Ci0JCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMCwgYWgtPmJ0X2NvZXhfYnRfd2VpZ2h0WzBdKTsKLQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX0JUX1dFSUdIVFMxLCBhaC0+YnRfY29leF9idF93ZWlnaHRbMV0pOwotCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUzIsIGFoLT5idF9jb2V4X2J0X3dlaWdodFsyXSk7Ci0JCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMywgYWgtPmJ0X2NvZXhfYnRfd2VpZ2h0WzNdKTsKLQorCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzAsIGJ0Y29leC0+d2xhbl93ZWlnaHRbMF0pOworCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzEsIGJ0Y29leC0+d2xhbl93ZWlnaHRbMV0pOworCQlmb3IgKGkgPSAwOyBpIDwgQVI5MzAwX05VTV9CVF9XRUlHSFRTOyBpKyspCisJCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUyhpKSwKKwkJCQkgIGJ0Y29leC0+YnRfd2VpZ2h0W2ldKTsKIAl9IGVsc2UKLQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX1dFSUdIVCwgYnRjb2V4X2h3LT5idF9jb2V4X3dlaWdodHMpOworCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0VJR0hULCBidGNvZXgtPmJ0X2NvZXhfd2VpZ2h0cyk7CiAKIAogCkBAIC0xODUsMjMgKzIxMywzOSBAQAogCVJFR19STVdfRklFTEQoYWgsIEFSX1FVSUVUMSwgQVJfUVVJRVQxX1FVSUVUX0FDS19DVFNfRU5BQkxFLCAxKTsKIAlSRUdfUk1XX0ZJRUxEKGFoLCBBUl9QQ1VfTUlTQywgQVJfUENVX0JUX0FOVF9QUkVWRU5UX1JYLCAwKTsKIAotCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGJ0Y29leF9ody0+d2xhbmFjdGl2ZV9ncGlvLAorCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGJ0Y29leC0+d2xhbmFjdGl2ZV9ncGlvLAogCQkJICAgIEFSX0dQSU9fT1VUUFVUX01VWF9BU19SWF9DTEVBUl9FWFRFUk5BTCk7CiB9CiAKK3N0YXRpYyB2b2lkIGF0aDlrX2h3X2J0Y29leF9lbmFibGVfbWNpKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXN0cnVjdCBhdGhfYnRjb2V4X2h3ICpidGNvZXggPSAmYWgtPmJ0Y29leF9odzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUjkzMDBfTlVNX0JUX1dFSUdIVFM7IGkrKykKKwkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQ09FWF9XTF9XRUlHSFRTKGkpLAorCQkJICBidGNvZXgtPndsYW5fd2VpZ2h0W2ldKTsKKworCVJFR19STVdfRklFTEQoYWgsIEFSX1FVSUVUMSwgQVJfUVVJRVQxX1FVSUVUX0FDS19DVFNfRU5BQkxFLCAxKTsKKwlidGNvZXgtPmVuYWJsZWQgPSB0cnVlOworfQorCiB2b2lkIGF0aDlrX2h3X2J0Y29leF9lbmFibGUoc3RydWN0IGF0aF9odyAqYWgpCiB7CiAJc3RydWN0IGF0aF9idGNvZXhfaHcgKmJ0Y29leF9odyA9ICZhaC0+YnRjb2V4X2h3OwogCi0Jc3dpdGNoIChidGNvZXhfaHctPnNjaGVtZSkgeworCXN3aXRjaCAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpKSB7CiAJY2FzZSBBVEhfQlRDT0VYX0NGR19OT05FOgotCQlicmVhazsKKwkJcmV0dXJuOwogCWNhc2UgQVRIX0JUQ09FWF9DRkdfMldJUkU6CiAJCWF0aDlrX2h3X2J0Y29leF9lbmFibGVfMndpcmUoYWgpOwogCQlicmVhazsKIAljYXNlIEFUSF9CVENPRVhfQ0ZHXzNXSVJFOgogCQlhdGg5a19od19idGNvZXhfZW5hYmxlXzN3aXJlKGFoKTsKIAkJYnJlYWs7CisJY2FzZSBBVEhfQlRDT0VYX0NGR19NQ0k6CisJCWF0aDlrX2h3X2J0Y29leF9lbmFibGVfbWNpKGFoKTsKKwkJcmV0dXJuOwogCX0KIAogCVJFR19STVcoYWgsIEFSX0dQSU9fUERQVSwKQEAgLTIxNSw3ICsyNTksMTggQEAKIHZvaWQgYXRoOWtfaHdfYnRjb2V4X2Rpc2FibGUoc3RydWN0IGF0aF9odyAqYWgpCiB7CiAJc3RydWN0IGF0aF9idGNvZXhfaHcgKmJ0Y29leF9odyA9ICZhaC0+YnRjb2V4X2h3OworCWludCBpOwogCisJaWYgKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSA9PSBBVEhfQlRDT0VYX0NGR19OT05FKQorCQlyZXR1cm47CisKKwlidGNvZXhfaHctPmVuYWJsZWQgPSBmYWxzZTsKKwlpZiAoYnRjb2V4X2h3LT5zY2hlbWUgPT0gQVRIX0JUQ09FWF9DRkdfTUNJKSB7CisJCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgQVRIX0JUQ09FWF9TVE9NUF9OT05FKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSOTMwMF9OVU1fQlRfV0VJR0hUUzsgaSsrKQorCQkJUkVHX1dSSVRFKGFoLCBBUl9NQ0lfQ09FWF9XTF9XRUlHSFRTKGkpLAorCQkJCSAgYnRjb2V4X2h3LT53bGFuX3dlaWdodFtpXSk7CisJfQogCWF0aDlrX2h3X3NldF9ncGlvKGFoLCBidGNvZXhfaHctPndsYW5hY3RpdmVfZ3BpbywgMCk7CiAKIAlhdGg5a19od19jZmdfb3V0cHV0KGFoLCBidGNvZXhfaHctPndsYW5hY3RpdmVfZ3BpbywKQEAgLTIyOCw0OSArMjgzLDI3IEBACiAJCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7CiAJCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfV0xfV0VJR0hUUzAsIDApOwogCQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX1dMX1dFSUdIVFMxLCAwKTsKLQkJCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMCwgMCk7Ci0JCQlSRUdfV1JJVEUoYWgsIEFSX0JUX0NPRVhfQlRfV0VJR0hUUzEsIDApOwotCQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX0JUX1dFSUdIVFMyLCAwKTsKLQkJCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMywgMCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgQVI5MzAwX05VTV9CVF9XRUlHSFRTOyBpKyspCisJCQkJUkVHX1dSSVRFKGFoLCBBUl9CVF9DT0VYX0JUX1dFSUdIVFMoaSksIDApOwogCQl9IGVsc2UKIAkJCVJFR19XUklURShhaCwgQVJfQlRfQ09FWF9XRUlHSFQsIDApOwogCiAJfQotCi0JYWgtPmJ0Y29leF9ody5lbmFibGVkID0gZmFsc2U7CiB9CiBFWFBPUlRfU1lNQk9MKGF0aDlrX2h3X2J0Y29leF9kaXNhYmxlKTsKIAogc3RhdGljIHZvaWQgYXI5MDAzX2J0Y29leF9idF9zdG9tcChzdHJ1Y3QgYXRoX2h3ICphaCwKIAkJCSBlbnVtIGF0aF9zdG9tcF90eXBlIHN0b21wX3R5cGUpCiB7Ci0JYWgtPmJ0X2NvZXhfYnRfd2VpZ2h0WzBdID0gQVI5MzAwX0JUX1dHSFQ7Ci0JYWgtPmJ0X2NvZXhfYnRfd2VpZ2h0WzFdID0gQVI5MzAwX0JUX1dHSFQ7Ci0JYWgtPmJ0X2NvZXhfYnRfd2VpZ2h0WzJdID0gQVI5MzAwX0JUX1dHSFQ7Ci0JYWgtPmJ0X2NvZXhfYnRfd2VpZ2h0WzNdID0gQVI5MzAwX0JUX1dHSFQ7CisJc3RydWN0IGF0aF9idGNvZXhfaHcgKmJ0Y29leCA9ICZhaC0+YnRjb2V4X2h3OworCWNvbnN0IHUzMiAqd2VpZ2h0ID0gQVJfU1JFVl85NDYyKGFoKSA/IGFyOTAwM193bGFuX3dlaWdodHNbc3RvbXBfdHlwZV0gOgorCQkJCQkgICAgICAgYXI5NDYyX3dsYW5fd2VpZ2h0c1tzdG9tcF90eXBlXTsKKwlpbnQgaTsKIAotCi0Jc3dpdGNoIChzdG9tcF90eXBlKSB7Ci0JY2FzZSBBVEhfQlRDT0VYX1NUT01QX0FMTDoKLQkJYWgtPmJ0X2NvZXhfd2xhbl93ZWlnaHRbMF0gPSBBUjkzMDBfU1RPTVBfQUxMX1dMQU5fV0dIVDA7Ci0JCWFoLT5idF9jb2V4X3dsYW5fd2VpZ2h0WzFdID0gQVI5MzAwX1NUT01QX0FMTF9XTEFOX1dHSFQxOwotCQlicmVhazsKLQljYXNlIEFUSF9CVENPRVhfU1RPTVBfTE9XOgotCQlhaC0+YnRfY29leF93bGFuX3dlaWdodFswXSA9IEFSOTMwMF9TVE9NUF9MT1dfV0xBTl9XR0hUMDsKLQkJYWgtPmJ0X2NvZXhfd2xhbl93ZWlnaHRbMV0gPSBBUjkzMDBfU1RPTVBfTE9XX1dMQU5fV0dIVDE7Ci0JCWJyZWFrOwotCWNhc2UgQVRIX0JUQ09FWF9TVE9NUF9OT05FOgotCQlhaC0+YnRfY29leF93bGFuX3dlaWdodFswXSA9IEFSOTMwMF9TVE9NUF9OT05FX1dMQU5fV0dIVDA7Ci0JCWFoLT5idF9jb2V4X3dsYW5fd2VpZ2h0WzFdID0gQVI5MzAwX1NUT01QX05PTkVfV0xBTl9XR0hUMTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfQlRDT0VYLAotCQkJCSJJbnZhbGlkIFN0b21wdHlwZVxuIik7Ci0JCWJyZWFrOworCWZvciAoaSA9IDA7IGkgPCBBUjkzMDBfTlVNX1dMQU5fV0VJR0hUUzsgaSsrKSB7CisJCWJ0Y29leC0+YnRfd2VpZ2h0W2ldID0gQVI5MzAwX0JUX1dHSFQ7CisJCWJ0Y29leC0+d2xhbl93ZWlnaHRbaV0gPSB3ZWlnaHRbaV07CiAJfQotCi0JYXRoOWtfaHdfYnRjb2V4X2VuYWJsZShhaCk7CiB9CiAKIC8qCkBAIC0yNzksNiArMzEyLDkgQEAKIHZvaWQgYXRoOWtfaHdfYnRjb2V4X2J0X3N0b21wKHN0cnVjdCBhdGhfaHcgKmFoLAogCQkJICAgICAgZW51bSBhdGhfc3RvbXBfdHlwZSBzdG9tcF90eXBlKQogeworCWlmIChhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgPT0gQVRIX0JUQ09FWF9DRkdfTk9ORSkKKwkJcmV0dXJuOworCiAJaWYgKEFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpIHsKIAkJYXI5MDAzX2J0Y29leF9idF9zdG9tcChhaCwgc3RvbXBfdHlwZSk7CiAJCXJldHVybjsKQEAgLTI5OCwxMSArMzM0LDggQEAKIAkJCQlBUl9TVE9NUF9OT05FX1dMQU5fV0dIVCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19CVENPRVgsCi0JCQkJIkludmFsaWQgU3RvbXB0eXBlXG4iKTsKKwkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBCVENPRVgsICJJbnZhbGlkIFN0b21wdHlwZVxuIik7CiAJCWJyZWFrOwogCX0KLQotCWF0aDlrX2h3X2J0Y29leF9lbmFibGUoYWgpOwogfQogRVhQT1JUX1NZTUJPTChhdGg5a19od19idGNvZXhfYnRfc3RvbXApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2J0Y29leC5oCmluZGV4IDIzNGY3NzYuLjI3ODM2MWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9idGNvZXguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvYnRjb2V4LmgKQEAgLTM2LDIyICszNiw1NyBAQAogI2RlZmluZSBBVEhfQlRfQ05UX1RIUkVTSE9MRAkgICAgICAgMwogI2RlZmluZSBBVEhfQlRfQ05UX1NDQU5fVEhSRVNIT0xEICAgICAgMTUKIAorI2RlZmluZSBBUjkzMDBfTlVNX0JUX1dFSUdIVFMgICA0CisjZGVmaW5lIEFSOTMwMF9OVU1fV0xBTl9XRUlHSFRTIDQKIC8qIERlZmluZXMgdGhlIEJUIEFSX0JUX0NPRVhfV0dIVCB1c2VkICovCiBlbnVtIGF0aF9zdG9tcF90eXBlIHsKLQlBVEhfQlRDT0VYX05PX1NUT01QLAogCUFUSF9CVENPRVhfU1RPTVBfQUxMLAogCUFUSF9CVENPRVhfU1RPTVBfTE9XLAotCUFUSF9CVENPRVhfU1RPTVBfTk9ORQorCUFUSF9CVENPRVhfU1RPTVBfTk9ORSwKKwlBVEhfQlRDT0VYX1NUT01QX0xPV19GVFAsCisJQVRIX0JUQ09FWF9TVE9NUF9NQVgKIH07CiAKIGVudW0gYXRoX2J0Y29leF9zY2hlbWUgewogCUFUSF9CVENPRVhfQ0ZHX05PTkUsCiAJQVRIX0JUQ09FWF9DRkdfMldJUkUsCiAJQVRIX0JUQ09FWF9DRkdfM1dJUkUsCisJQVRIX0JUQ09FWF9DRkdfTUNJLAorfTsKKworc3RydWN0IGF0aDlrX2h3X21jaSB7CisJdTMyIHJhd19pbnRyOworCXUzMiByeF9tc2dfaW50cjsKKwl1MzIgY29udF9zdGF0dXM7CisJdTMyIGdwbV9hZGRyOworCXUzMiBncG1fbGVuOworCXUzMiBncG1faWR4OworCXUzMiBzY2hlZF9hZGRyOworCXUzMiB3bGFuX2NoYW5uZWxzWzRdOworCXUzMiB3bGFuX2NhbF9zZXE7CisJdTMyIHdsYW5fY2FsX2RvbmU7CisJdTMyIGNvbmZpZzsKKwl1OCAqZ3BtX2J1ZjsKKwl1OCAqc2NoZWRfYnVmOworCWJvb2wgcmVhZHk7CisJYm9vbCB1cGRhdGVfMmc1ZzsKKwlib29sIGlzXzJnOworCWJvb2wgcXVlcnlfYnQ7CisJYm9vbCB1bmhhbHRfYnRfZ3BtOyAvKiBuZWVkIHNlbmQgVU5IQUxUICovCisJYm9vbCBoYWx0ZWRfYnRfZ3BtOyAvKiBIQUxUIHNlbnQgKi8KKwlib29sIG5lZWRfZmx1c2hfYnRpbmZvOworCWJvb2wgYnRfdmVyc2lvbl9rbm93bjsKKwlib29sIHdsYW5fY2hhbm5lbHNfdXBkYXRlOworCXU4IHdsYW5fdmVyX21ham9yOworCXU4IHdsYW5fdmVyX21pbm9yOworCXU4IGJ0X3Zlcl9tYWpvcjsKKwl1OCBidF92ZXJfbWlub3I7CisJdTggYnRfc3RhdGU7CiB9OwogCiBzdHJ1Y3QgYXRoX2J0Y29leF9odyB7CiAJZW51bSBhdGhfYnRjb2V4X3NjaGVtZSBzY2hlbWU7CisJc3RydWN0IGF0aDlrX2h3X21jaSBtY2k7CiAJYm9vbCBlbmFibGVkOwogCXU4IHdsYW5hY3RpdmVfZ3BpbzsKIAl1OCBidGFjdGl2ZV9ncGlvOwpAQCAtNTksNiArOTQsOCBAQAogCXUzMiBidF9jb2V4X21vZGU7IAkvKiBSZWdpc3RlciBzZXR0aW5nIGZvciBBUl9CVF9DT0VYX01PREUgKi8KIAl1MzIgYnRfY29leF93ZWlnaHRzOyAJLyogUmVnaXN0ZXIgc2V0dGluZyBmb3IgQVJfQlRfQ09FWF9XRUlHSFQgKi8KIAl1MzIgYnRfY29leF9tb2RlMjsgCS8qIFJlZ2lzdGVyIHNldHRpbmcgZm9yIEFSX0JUX0NPRVhfTU9ERTIgKi8KKwl1MzIgYnRfd2VpZ2h0W0FSOTMwMF9OVU1fQlRfV0VJR0hUU107CisJdTMyIHdsYW5fd2VpZ2h0W0FSOTMwMF9OVU1fV0xBTl9XRUlHSFRTXTsKIH07CiAKIHZvaWQgYXRoOWtfaHdfYnRjb2V4X2luaXRfMndpcmUoc3RydWN0IGF0aF9odyAqYWgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2NhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwppbmRleCA5OTUzODgxLi4xNzJlMzNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvY2FsaWIuYwpAQCAtMTE2LDcgKzExNiw3IEBACiAJCWlmIChoW2ldLnByaXZORiA+IGxpbWl0LT5tYXgpIHsKIAkJCWhpZ2hfbmZfbWlkID0gdHJ1ZTsKIAotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCQkiTkZtaWRbJWRdICglZCkgPiBNQVggKCVkKSwgJXNcbiIsCiAJCQkJaSwgaFtpXS5wcml2TkYsIGxpbWl0LT5tYXgsCiAJCQkJKGNhbC0+bmZjYWxfaW50ZXJmZXJlbmNlID8KQEAgLTE5OSw4ICsxOTksNyBAQAogCQlyZXR1cm4gdHJ1ZTsKIAogCWlmIChjdXJyQ2FsLT5jYWxTdGF0ZSAhPSBDQUxfRE9ORSkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCQkiQ2FsaWJyYXRpb24gc3RhdGUgaW5jb3JyZWN0LCAlZFxuIiwKKwkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwgIkNhbGlicmF0aW9uIHN0YXRlIGluY29ycmVjdCwgJWRcbiIsCiAJCQljdXJyQ2FsLT5jYWxTdGF0ZSk7CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTIwOCw4ICsyMDcsNyBAQAogCWlmICghKGFoLT5zdXBwX2NhbHMgJiBjdXJyQ2FsLT5jYWxEYXRhLT5jYWxUeXBlKSkKIAkJcmV0dXJuIHRydWU7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCi0JCSJSZXNldHRpbmcgQ2FsICVkIHN0YXRlIGZvciBjaGFubmVsICV1XG4iLAorCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJSZXNldHRpbmcgQ2FsICVkIHN0YXRlIGZvciBjaGFubmVsICV1XG4iLAogCQljdXJyQ2FsLT5jYWxEYXRhLT5jYWxUeXBlLCBjb25mLT5jaGFubmVsLT5jZW50ZXJfZnJlcSk7CiAKIAlhaC0+Y2FsZGF0YS0+Q2FsVmFsaWQgJj0gfmN1cnJDYWwtPmNhbERhdGEtPmNhbFR5cGU7CkBAIC0zMDIsNyArMzAwLDcgQEAKIAkgKiBub2lzZWZsb29yIHVudGlsIHRoZSBuZXh0IGNhbGlicmF0aW9uIHRpbWVyLgogCSAqLwogCWlmIChqID09IDEwMDAwKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOWSwKKwkJYXRoX2RiZyhjb21tb24sIEFOWSwKIAkJCSJUaW1lb3V0IHdoaWxlIHdhaXRpbmcgZm9yIG5mIHRvIGxvYWQ6IEFSX1BIWV9BR0NfQ09OVFJPTD0weCV4XG4iLAogCQkJUkVHX1JFQUQoYWgsIEFSX1BIWV9BR0NfQ09OVFJPTCkpOwogCQlyZXR1cm47CkBAIC0zNDQsMTcgKzM0MiwxNyBAQAogCQlpZiAoIW5mW2ldKQogCQkJY29udGludWU7CiAKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJIk5GIGNhbGlicmF0ZWQgWyVzXSBbY2hhaW4gJWRdIGlzICVkXG4iLAogCQkJKGkgPj0gMyA/ICJleHQiIDogImN0bCIpLCBpICUgMywgbmZbaV0pOwogCiAJCWlmIChuZltpXSA+IEFUSDlLX05GX1RPT19ISUdIKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJCSJORlslZF0gKCVkKSA+IE1BWCAoJWQpLCBjb3JyZWN0aW5nIHRvIE1BWFxuIiwKIAkJCQlpLCBuZltpXSwgQVRIOUtfTkZfVE9PX0hJR0gpOwogCQkJbmZbaV0gPSBsaW1pdC0+bWF4OwogCQl9IGVsc2UgaWYgKG5mW2ldIDwgbGltaXQtPm1pbikgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQkJYXRoX2RiZyhjb21tb24sIENBTElCUkFURSwKIAkJCQkiTkZbJWRdICglZCkgPCBNSU4gKCVkKSwgY29ycmVjdGluZyB0byBOT01cbiIsCiAJCQkJaSwgbmZbaV0sIGxpbWl0LT5taW4pOwogCQkJbmZbaV0gPSBsaW1pdC0+bm9taW5hbDsKQEAgLTM3Myw3ICszNzEsNyBAQAogCiAJY2hhbi0+Y2hhbm5lbEZsYWdzICY9ICh+Q0hBTk5FTF9DV19JTlQpOwogCWlmIChSRUdfUkVBRChhaCwgQVJfUEhZX0FHQ19DT05UUk9MKSAmIEFSX1BIWV9BR0NfQ09OVFJPTF9ORikgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCiAJCQkiTkYgZGlkIG5vdCBjb21wbGV0ZSBpbiBjYWxpYnJhdGlvbiB3aW5kb3dcbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtMzgzLDcgKzM4MSw3IEBACiAJbmYgPSBuZmFycmF5WzBdOwogCWlmIChhdGg5a19od19nZXRfbmZfdGhyZXNoKGFoLCBjLT5iYW5kLCAmbmZUaHJlc2gpCiAJICAgICYmIG5mID4gbmZUaHJlc2gpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJIm5vaXNlIGZsb29yIGZhaWxlZCBkZXRlY3RlZDsgZGV0ZWN0ZWQgJWQsIHRocmVzaG9sZCAlZFxuIiwKIAkJCW5mLCBuZlRocmVzaCk7CiAJCWNoYW4tPmNoYW5uZWxGbGFncyB8PSBDSEFOTkVMX0NXX0lOVDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMKaW5kZXggMjc0MTIwMy4uNjhkOTcyYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmMKQEAgLTcwOSwyNCArNzA5LDI5IEBACiAKIAlsZW4gKz0gc25wcmludGYoYnVmICsgbGVuLCBzaXplIC0gbGVuLAogCQkJIlN0YXRpb25zOlxuIgotCQkJIiB0aWQ6IGFkZHIgc2NoZWQgcGF1c2VkIGJ1Zl9xLWVtcHR5IGFuIGFjXG4iCisJCQkiIHRpZDogYWRkciBzY2hlZCBwYXVzZWQgYnVmX3EtZW1wdHkgYW4gYWMgYmF3XG4iCiAJCQkiIGFjOiBhZGRyIHNjaGVkIHRpZF9xLWVtcHR5IHR4cVxuIik7CiAKIAlzcGluX2xvY2soJnNjLT5ub2Rlc19sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFuLCAmc2MtPm5vZGVzLCBsaXN0KSB7CisJCXVuc2lnbmVkIHNob3J0IG1hID0gYW4tPm1heGFtcGR1OworCQlpZiAobWEgPT0gMCkKKwkJCW1hID0gNjU1MzU7IC8qIHNlZSBhdGhfbG9va3VwX3JhdGUgKi8KIAkJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwKLQkJCQkiJXBNXG4iLCBhbi0+c3RhLT5hZGRyKTsKKwkJCQkiaWZhY2U6ICVwTSAgc3RhOiAlcE0gbWF4LWFtcGR1OiAlaHUgbXBkdS1kZW5zaXR5OiAldXVzXG4iLAorCQkJCWFuLT52aWYtPmFkZHIsIGFuLT5zdGEtPmFkZHIsIG1hLAorCQkJCSh1bnNpZ25lZCBpbnQpKGFuLT5tcGR1ZGVuc2l0eSkpOwogCQlpZiAobGVuID49IHNpemUpCiAJCQlnb3RvIGRvbmU7CiAKIAkJZm9yIChxID0gMDsgcSA8IFdNRV9OVU1fVElEOyBxKyspIHsKIAkJCXN0cnVjdCBhdGhfYXR4X3RpZCAqdGlkID0gJihhbi0+dGlkW3FdKTsKIAkJCWxlbiArPSBzbnByaW50ZihidWYgKyBsZW4sIHNpemUgLSBsZW4sCi0JCQkJCSIgdGlkOiAlcCAlcyAlcyAlaSAlcCAlcFxuIiwKKwkJCQkJIiB0aWQ6ICVwICVzICVzICVpICVwICVwICVodVxuIiwKIAkJCQkJdGlkLCB0aWQtPnNjaGVkID8gInNjaGVkIiA6ICJpZGxlIiwKIAkJCQkJdGlkLT5wYXVzZWQgPyAicGF1c2VkIiA6ICJydW5uaW5nIiwKIAkJCQkJc2tiX3F1ZXVlX2VtcHR5KCZ0aWQtPmJ1Zl9xKSwKLQkJCQkJdGlkLT5hbiwgdGlkLT5hYyk7CisJCQkJCXRpZC0+YW4sIHRpZC0+YWMsIHRpZC0+YmF3X3NpemUpOwogCQkJaWYgKGxlbiA+PSBzaXplKQogCQkJCWdvdG8gZG9uZTsKIAkJfQpAQCAtODUxLDcgKzg1Niw3IEBACiAJc2MtPmRlYnVnLnN0YXRzLnR4c3RhdHNbcW51bV0udHhfYnl0ZXNfYWxsICs9IGJmLT5iZl9tcGR1LT5sZW47CiAKIAlpZiAoYmZfaXNhbXBkdShiZikpIHsKLQkJaWYgKGZsYWdzICYgQVRIX1RYX0JBUikKKwkJaWYgKGZsYWdzICYgQVRIX1RYX0VSUk9SKQogCQkJVFhfU1RBVF9JTkMocW51bSwgYV94cmV0cmllcyk7CiAJCWVsc2UKIAkJCVRYX1NUQVRfSU5DKHFudW0sIGFfY29tcGxldGVkKTsKQEAgLTE2MjUsNiArMTYzMCw5IEBACiAJZGVidWdmc19jcmVhdGVfZmlsZSgiZGVidWciLCBTX0lSVVNSIHwgU19JV1VTUiwgc2MtPmRlYnVnLmRlYnVnZnNfcGh5LAogCQkJICAgIHNjLCAmZm9wc19kZWJ1Zyk7CiAjZW5kaWYKKworCWF0aDlrX2Rmc19pbml0X2RlYnVnKHNjKTsKKwogCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImRtYSIsIFNfSVJVU1IsIHNjLT5kZWJ1Zy5kZWJ1Z2ZzX3BoeSwgc2MsCiAJCQkgICAgJmZvcHNfZG1hKTsKIAlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJpbnRlcnJ1cHQiLCBTX0lSVVNSLCBzYy0+ZGVidWcuZGVidWdmc19waHksIHNjLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2RlYnVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuaAppbmRleCAzNTYzNTJhLi43NzZhMjRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGVidWcuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSAiaHcuaCIKICNpbmNsdWRlICJyYy5oIgorI2luY2x1ZGUgImRmc19kZWJ1Zy5oIgogCiBzdHJ1Y3QgYXRoX3R4cTsKIHN0cnVjdCBhdGhfYnVmOwpAQCAtMTg3LDYgKzE4OCw3IEBACiAJc3RydWN0IGF0aF9pbnRlcnJ1cHRfc3RhdHMgaXN0YXRzOwogCXN0cnVjdCBhdGhfdHhfc3RhdHMgdHhzdGF0c1tBVEg5S19OVU1fVFhfUVVFVUVTXTsKIAlzdHJ1Y3QgYXRoX3J4X3N0YXRzIHJ4c3RhdHM7CisJc3RydWN0IGF0aF9kZnNfc3RhdHMgZGZzX3N0YXRzOwogCXUzMiByZXNldFtfX1JFU0VUX1RZUEVfTUFYXTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGY1NmFmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmcy5jCkBAIC0wLDAgKzEsMjE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTEgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTmVyYXRlYyBTb2x1dGlvbnMgQUcKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaHcuaCIKKyNpbmNsdWRlICJody1vcHMuaCIKKyNpbmNsdWRlICJhdGg5ay5oIgorI2luY2x1ZGUgImRmcy5oIgorI2luY2x1ZGUgImRmc19kZWJ1Zy5oIgorCisvKgorICogVE9ETzogbW92ZSBpbnRvIG9yIHN5bmNocm9uaXplIHRoaXMgd2l0aCBnZW5lcmljIGhlYWRlcgorICoJIGFzIHNvb24gYXMgSUYgaXMgZGVmaW5lZAorICovCitzdHJ1Y3QgZGZzX3JhZGFyX3B1bHNlIHsKKwl1MTYgZnJlcTsKKwl1NjQgdHM7CisJdTMyIHdpZHRoOworCXU4IHJzc2k7Cit9OworCisvKiBpbnRlcm5hbCBzdHJ1Y3QgdG8gcGFzcyByYWRhciBkYXRhICovCitzdHJ1Y3QgYXRoX3JhZGFyX2RhdGEgeworCXU4IHB1bHNlX2J3X2luZm87CisJdTggcnNzaTsKKwl1OCBleHRfcnNzaTsKKwl1OCBwdWxzZV9sZW5ndGhfZXh0OworCXU4IHB1bHNlX2xlbmd0aF9wcmk7Cit9OworCisvKiBjb252ZXJ0IHB1bHNlIGR1cmF0aW9uIHRvIHVzZWNzLCBjb25zaWRlcmluZyBjbG9jayBtb2RlICovCitzdGF0aWMgdTMyIGR1cl90b191c2VjcyhzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGR1cikKK3sKKwljb25zdCB1MzIgQVI5M1hfTlNFQ1NfUEVSX0RVUiA9IDgwMDsKKwljb25zdCB1MzIgQVI5M1hfTlNFQ1NfUEVSX0RVUl9GQVNUID0gKDgwMDAgLyAxMSk7CisJdTMyIG5zZWNzOworCisJaWYgKElTX0NIQU5fQV9GQVNUX0NMT0NLKGFoLCBhaC0+Y3VyY2hhbikpCisJCW5zZWNzID0gZHVyICogQVI5M1hfTlNFQ1NfUEVSX0RVUl9GQVNUOworCWVsc2UKKwkJbnNlY3MgPSBkdXIgKiBBUjkzWF9OU0VDU19QRVJfRFVSOworCisJcmV0dXJuIChuc2VjcyArIDUwMCkgLyAxMDAwOworfQorCisjZGVmaW5lIFBSSV9DSF9SQURBUl9GT1VORCAweDAxCisjZGVmaW5lIEVYVF9DSF9SQURBUl9GT1VORCAweDAyCitzdGF0aWMgYm9vbAorYXRoOWtfcG9zdHByb2Nlc3NfcmFkYXJfZXZlbnQoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCisJCQkgICAgICBzdHJ1Y3QgYXRoX3JhZGFyX2RhdGEgKmFyZSwKKwkJCSAgICAgIHN0cnVjdCBkZnNfcmFkYXJfcHVsc2UgKmRycCkKK3sKKwl1OCByc3NpOworCXUxNiBkdXI7CisKKwlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpLCBERlMsCisJCSJwdWxzZV9id19pbmZvPTB4JXgsIHByaSxleHQgbGVuL3Jzc2k9KCV1LyV1LCAldS8ldSlcbiIsCisJCWFyZS0+cHVsc2VfYndfaW5mbywKKwkJYXJlLT5wdWxzZV9sZW5ndGhfcHJpLCBhcmUtPnJzc2ksCisJCWFyZS0+cHVsc2VfbGVuZ3RoX2V4dCwgYXJlLT5leHRfcnNzaSk7CisKKwkvKgorCSAqIE9ubHkgdGhlIGxhc3QgMiBiaXRzIG9mIHRoZSBCVyBpbmZvIGFyZSByZWxldmFudCwgdGhleSBpbmRpY2F0ZQorCSAqIHdoaWNoIGNoYW5uZWwgdGhlIHJhZGFyIHdhcyBkZXRlY3RlZCBpbi4KKwkgKi8KKwlhcmUtPnB1bHNlX2J3X2luZm8gJj0gMHgwMzsKKworCXN3aXRjaCAoYXJlLT5wdWxzZV9id19pbmZvKSB7CisJY2FzZSBQUklfQ0hfUkFEQVJfRk9VTkQ6CisJCS8qIHJhZGFyIGluIGN0cmwgY2hhbm5lbCAqLworCQlkdXIgPSBhcmUtPnB1bHNlX2xlbmd0aF9wcmk7CisJCURGU19TVEFUX0lOQyhzYywgcHJpX3BoeV9lcnJvcnMpOworCQkvKgorCQkgKiBjYW5ub3QgdXNlIGN0cmwgY2hhbm5lbCBSU1NJCisJCSAqIGlmIGV4dGVuc2lvbiBjaGFubmVsIGlzIHN0cm9uZ2VyCisJCSAqLworCQlyc3NpID0gKGFyZS0+ZXh0X3Jzc2kgPj0gKGFyZS0+cnNzaSArIDMpKSA/IDAgOiBhcmUtPnJzc2k7CisJCWJyZWFrOworCWNhc2UgRVhUX0NIX1JBREFSX0ZPVU5EOgorCQkvKiByYWRhciBpbiBleHRlbnNpb24gY2hhbm5lbCAqLworCQlkdXIgPSBhcmUtPnB1bHNlX2xlbmd0aF9leHQ7CisJCURGU19TVEFUX0lOQyhzYywgZXh0X3BoeV9lcnJvcnMpOworCQkvKgorCQkgKiBjYW5ub3QgdXNlIGV4dGVuc2lvbiBjaGFubmVsIFJTU0kKKwkJICogaWYgY29udHJvbCBjaGFubmVsIGlzIHN0cm9uZ2VyCisJCSAqLworCQlyc3NpID0gKGFyZS0+cnNzaSA+PSAoYXJlLT5leHRfcnNzaSArIDEyKSkgPyAwIDogYXJlLT5leHRfcnNzaTsKKwkJYnJlYWs7CisJY2FzZSAoUFJJX0NIX1JBREFSX0ZPVU5EIHwgRVhUX0NIX1JBREFSX0ZPVU5EKToKKwkJLyoKKwkJICogQ29uZHVjdGVkIHRlc3RpbmcsIHdoZW4gcHVsc2UgaXMgb24gREMsIGJvdGggcHJpIGFuZCBleHQKKwkJICogZHVyYXRpb25zIGFyZSByZXBvcnRlZCB0byBiZSBzYW1lCisJCSAqCisJCSAqIFJhZGlhdGVkIHRlc3RpbmcsIHdoZW4gcHVsc2UgaXMgb24gREMsIGRpZmZlcmVudCBwcmkgYW5kCisJCSAqIGV4dCBkdXJhdGlvbnMgYXJlIHJlcG9ydGVkLCBzbyB0YWtlIHRoZSBsYXJnZXIgb2YgdGhlIHR3bworCQkgKi8KKwkJaWYgKGFyZS0+cHVsc2VfbGVuZ3RoX2V4dCA+PSBhcmUtPnB1bHNlX2xlbmd0aF9wcmkpCisJCQlkdXIgPSBhcmUtPnB1bHNlX2xlbmd0aF9leHQ7CisJCWVsc2UKKwkJCWR1ciA9IGFyZS0+cHVsc2VfbGVuZ3RoX3ByaTsKKwkJREZTX1NUQVRfSU5DKHNjLCBkY19waHlfZXJyb3JzKTsKKworCQkvKiB3aGVuIGJvdGggYXJlIHByZXNlbnQgdXNlIHN0cm9uZ2VyIG9uZSAqLworCQlyc3NpID0gKGFyZS0+cnNzaSA8IGFyZS0+ZXh0X3Jzc2kpID8gYXJlLT5leHRfcnNzaSA6IGFyZS0+cnNzaTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyoKKwkJICogQm9ndXMgYmFuZHdpZHRoIGluZm8gd2FzIHJlY2VpdmVkIGluIGRlc2NyaXB0b3IsCisJCSAqIHNvIGlnbm9yZSB0aGlzIFBIWSBlcnJvcgorCQkgKi8KKwkJREZTX1NUQVRfSU5DKHNjLCBid2luZm9fZGlzY2FyZHMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKHJzc2kgPT0gMCkgeworCQlERlNfU1RBVF9JTkMoc2MsIHJzc2lfZGlzY2FyZHMpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBUT0RPOiBjaGVjayBjaGlycGluZyBwdWxzZXMKKwkgKgkgY2hlY2tzIGZvciBjaGlycGluZyBhcmUgZGVwZW5kZW50IG9uIHRoZSBERlMgcmVndWxhdG9yeSBkb21haW4KKwkgKgkgdXNlZCwgd2hpY2ggaXMgeWV0IFRCRAorCSAqLworCisJLyogY29udmVydCBkdXJhdGlvbiB0byB1c2VjcyAqLworCWRycC0+d2lkdGggPSBkdXJfdG9fdXNlY3Moc2MtPnNjX2FoLCBkdXIpOworCWRycC0+cnNzaSA9IHJzc2k7CisKKwlERlNfU1RBVF9JTkMoc2MsIHB1bHNlc19kZXRlY3RlZCk7CisJcmV0dXJuIHRydWU7Cit9CisjdW5kZWYgUFJJX0NIX1JBREFSX0ZPVU5ECisjdW5kZWYgRVhUX0NIX1JBREFSX0ZPVU5ECisKKy8qCisgKiBERlM6IGNoZWNrIFBIWS1lcnJvciBmb3IgcmFkYXIgcHVsc2UgYW5kIGZlZWQgdGhlIGRldGVjdG9yCisgKi8KK3ZvaWQgYXRoOWtfZGZzX3Byb2Nlc3NfcGh5ZXJyKHN0cnVjdCBhdGhfc29mdGMgKnNjLCB2b2lkICpkYXRhLAorCQkJICAgICAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJzLCB1NjQgbWFjdGltZSkKK3sKKwlzdHJ1Y3QgYXRoX3JhZGFyX2RhdGEgYXJkOworCXUxNiBkYXRhbGVuOworCWNoYXIgKnZkYXRhX2VuZDsKKwlzdHJ1Y3QgZGZzX3JhZGFyX3B1bHNlIGRycDsKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKworCWlmICgoIShycy0+cnNfcGh5ZXJyICE9IEFUSDlLX1BIWUVSUl9SQURBUikpICYmCisJICAgICghKHJzLT5yc19waHllcnIgIT0gQVRIOUtfUEhZRVJSX0ZBTFNFX1JBREFSX0VYVCkpKSB7CisJCWF0aF9kYmcoY29tbW9uLCBERlMsCisJCQkiRXJyb3I6IHJzX3BoeWVyPTB4JXggbm90IGEgcmFkYXIgZXJyb3JcbiIsCisJCQlycy0+cnNfcGh5ZXJyKTsKKwkJcmV0dXJuOworCX0KKworCWRhdGFsZW4gPSBycy0+cnNfZGF0YWxlbjsKKwlpZiAoZGF0YWxlbiA9PSAwKSB7CisJCURGU19TVEFUX0lOQyhzYywgZGF0YWxlbl9kaXNjYXJkcyk7CisJCXJldHVybjsKKwl9CisKKwlhcmQucnNzaSA9IHJzLT5yc19yc3NpX2N0bDA7CisJYXJkLmV4dF9yc3NpID0gcnMtPnJzX3Jzc2lfZXh0MDsKKworCS8qCisJICogaGFyZHdhcmUgc3RvcmVzIHRoaXMgYXMgOCBiaXQgc2lnbmVkIHZhbHVlLgorCSAqIHdlIHdpbGwgY2FwIGl0IGF0IDAgaWYgaXQgaXMgYSBuZWdhdGl2ZSBudW1iZXIKKwkgKi8KKwlpZiAoYXJkLnJzc2kgJiAweDgwKQorCQlhcmQucnNzaSA9IDA7CisJaWYgKGFyZC5leHRfcnNzaSAmIDB4ODApCisJCWFyZC5leHRfcnNzaSA9IDA7CisKKwl2ZGF0YV9lbmQgPSAoY2hhciAqKWRhdGEgKyBkYXRhbGVuOworCWFyZC5wdWxzZV9id19pbmZvID0gdmRhdGFfZW5kWy0xXTsKKwlhcmQucHVsc2VfbGVuZ3RoX2V4dCA9IHZkYXRhX2VuZFstMl07CisJYXJkLnB1bHNlX2xlbmd0aF9wcmkgPSB2ZGF0YV9lbmRbLTNdOworCisJYXRoX2RiZyhjb21tb24sIERGUywKKwkJImJ3X2luZm89JWQsIGxlbmd0aF9wcmk9JWQsIGxlbmd0aF9leHQ9JWQsICIKKwkJInJzc2lfcHJpPSVkLCByc3NpX2V4dD0lZFxuIiwKKwkJYXJkLnB1bHNlX2J3X2luZm8sIGFyZC5wdWxzZV9sZW5ndGhfcHJpLCBhcmQucHVsc2VfbGVuZ3RoX2V4dCwKKwkJYXJkLnJzc2ksIGFyZC5leHRfcnNzaSk7CisKKwlkcnAuZnJlcSA9IGFoLT5jdXJjaGFuLT5jaGFubmVsOworCWRycC50cyA9IG1hY3RpbWU7CisJaWYgKGF0aDlrX3Bvc3Rwcm9jZXNzX3JhZGFyX2V2ZW50KHNjLCAmYXJkLCAmZHJwKSkgeworCQlzdGF0aWMgdTY0IGxhc3RfdHM7CisJCWF0aF9kYmcoY29tbW9uLCBERlMsCisJCQkiYXRoOWtfZGZzX3Byb2Nlc3NfcGh5ZXJyOiBjaGFubmVsPSVkLCB0cz0lbGx1LCAiCisJCQkid2lkdGg9JWQsIHJzc2k9JWQsIGRlbHRhX3RzPSVsbHVcbiIsCisJCQlkcnAuZnJlcSwgZHJwLnRzLCBkcnAud2lkdGgsIGRycC5yc3NpLCBkcnAudHMtbGFzdF90cyk7CisJCWxhc3RfdHMgPSBkcnAudHM7CisJCS8qCisJCSAqIFRPRE86IGZvcndhcmQgcHVsc2UgdG8gcGF0dGVybiBkZXRlY3RvcgorCQkgKgorCQkgKiBpZWVlODAyMTFfYWRkX3JhZGFyX3B1bHNlKGRycC5mcmVxLCBkcnAudHMsCisJCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJwLndpZHRoLCBkcnAucnNzaSk7CisJCSAqLworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQxMjg1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmcy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBOZXJhdGVjIFNvbHV0aW9ucyBBRworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgQVRIOUtfREZTX0gKKyNkZWZpbmUgQVRIOUtfREZTX0gKKworI2lmIGRlZmluZWQoQ09ORklHX0FUSDlLX0RGU19DRVJUSUZJRUQpCisvKioKKyAqIGF0aDlrX2Rmc19wcm9jZXNzX3BoeWVyciAtIHByb2Nlc3MgcmFkYXIgUEhZIGVycm9yCisgKiBAc2M6IGF0aF9zb2Z0YworICogQGRhdGE6IFJYIHBheWxvYWQgZGF0YQorICogQHJzOiBSWCBzdGF0dXMgYWZ0ZXIgcHJvY2Vzc2luZyBkZXNjcmlwdG9yCisgKiBAbWFjdGltZTogcmVjZWl2ZSB0aW1lCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIEhXIERGUyBtb2R1bGUgZGV0ZWN0cyBhIHJhZGFyCisgKiBwdWxzZSBhbmQgcmVwb3J0cyBpdCBhcyBhIFBIWSBlcnJvci4KKyAqCisgKiBUaGUgcmFkYXIgaW5mb3JtYXRpb24gcHJvdmlkZWQgYXMgcmF3IHBheWxvYWQgZGF0YSBpcyB2YWxpZGF0ZWQgYW5kCisgKiBmaWx0ZXJlZCBmb3IgZmFsc2UgcHVsc2VzLiBFdmVudHMgcGFzc2luZyBhbGwgdGVzdHMgYXJlIGZvcndhcmRlZCB0bworICogdGhlIHVwcGVyIGxheWVyIGZvciBwYXR0ZXJuIGRldGVjdGlvbi4KKyAqLwordm9pZCBhdGg5a19kZnNfcHJvY2Vzc19waHllcnIoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHZvaWQgKmRhdGEsCisJCQkgICAgICBzdHJ1Y3QgYXRoX3J4X3N0YXR1cyAqcnMsIHU2NCBtYWN0aW1lKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoOWtfZGZzX3Byb2Nlc3NfcGh5ZXJyKHN0cnVjdCBhdGhfc29mdGMgKnNjLCB2b2lkICpkYXRhLAorCQkJCQkgICAgc3RydWN0IGF0aF9yeF9zdGF0dXMgKnJzLCB1NjQgbWFjdGltZSkgeyB9CisjZW5kaWYKKworI2VuZGlmIC8qIEFUSDlLX0RGU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGZzX2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZGZzX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2ZDAzMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnNfZGVidWcuYwpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTEgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEgTmVyYXRlYyBTb2x1dGlvbnMgQUcKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorCisjaW5jbHVkZSAiYXRoOWsuaCIKKyNpbmNsdWRlICJkZnNfZGVidWcuaCIKKworI2RlZmluZSBBVEg5S19ERlNfU1RBVChzLCBwKSBcCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgIiUyOHMgOiAlMTB1XG4iLCBzLCBcCisJCQlzYy0+ZGVidWcuc3RhdHMuZGZzX3N0YXRzLnApOworCitzdGF0aWMgc3NpemVfdCByZWFkX2ZpbGVfZGZzKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhdGg5a19od192ZXJzaW9uICpod192ZXIgPSAmc2MtPnNjX2FoLT5od192ZXJzaW9uOworCWNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBpbnQgbGVuID0gMCwgc2l6ZSA9IDgwMDA7CisJc3NpemVfdCByZXR2YWwgPSAwOworCisJYnVmID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbGVuICs9IHNucHJpbnRmKGJ1ZiArIGxlbiwgc2l6ZSAtIGxlbiwgIkRGUyBzdXBwb3J0IGZvciAiCisJCQkibWFjVmVyc2lvbiA9IDB4JXgsIG1hY1JldiA9IDB4JXg6ICVzXG4iLAorCQkJaHdfdmVyLT5tYWNWZXJzaW9uLCBod192ZXItPm1hY1JldiwKKwkJCShzYy0+c2NfYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9ERlMpID8KKwkJCQkJImVuYWJsZWQiIDogImRpc2FibGVkIik7CisJQVRIOUtfREZTX1NUQVQoIkRGUyBwdWxzZXMgZGV0ZWN0ZWQgICAgICIsIHB1bHNlc19kZXRlY3RlZCk7CisJQVRIOUtfREZTX1NUQVQoIkRhdGFsZW4gZGlzY2FyZHMgICAgICAgICIsIGRhdGFsZW5fZGlzY2FyZHMpOworCUFUSDlLX0RGU19TVEFUKCJSU1NJIGRpc2NhcmRzICAgICAgICAgICAiLCByc3NpX2Rpc2NhcmRzKTsKKwlBVEg5S19ERlNfU1RBVCgiQlcgaW5mbyBkaXNjYXJkcyAgICAgICAgIiwgYndpbmZvX2Rpc2NhcmRzKTsKKwlBVEg5S19ERlNfU1RBVCgiUHJpbWFyeSBjaGFubmVsIHB1bHNlcyAgIiwgcHJpX3BoeV9lcnJvcnMpOworCUFUSDlLX0RGU19TVEFUKCJTZWNvbmRhcnkgY2hhbm5lbCBwdWxzZXMiLCBleHRfcGh5X2Vycm9ycyk7CisJQVRIOUtfREZTX1NUQVQoIkR1YWwgY2hhbm5lbCBwdWxzZXMgICAgICIsIGRjX3BoeV9lcnJvcnMpOworCisJaWYgKGxlbiA+IHNpemUpCisJCWxlbiA9IHNpemU7CisKKwlyZXR2YWwgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKKwlrZnJlZShidWYpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBhdGg5a19kZnNfZGVidWdmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9wc19kZnNfc3RhdHMgPSB7CisJLnJlYWQgPSByZWFkX2ZpbGVfZGZzLAorCS5vcGVuID0gYXRoOWtfZGZzX2RlYnVnZnNfb3BlbiwKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCit9OworCit2b2lkIGF0aDlrX2Rmc19pbml0X2RlYnVnKHN0cnVjdCBhdGhfc29mdGMgKnNjKQoreworCWRlYnVnZnNfY3JlYXRlX2ZpbGUoImRmc19zdGF0cyIsIFNfSVJVU1IsCisJCQkgICAgc2MtPmRlYnVnLmRlYnVnZnNfcGh5LCBzYywgJmZvcHNfZGZzX3N0YXRzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnNfZGVidWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9kZnNfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTExNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2Rmc19kZWJ1Zy5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDgtMjAxMSBBdGhlcm9zIENvbW11bmljYXRpb25zIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBOZXJhdGVjIFNvbHV0aW9ucyBBRworICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKworI2lmbmRlZiBBVEg5S19ERlNfREVCVUdfSAorI2RlZmluZSBBVEg5S19ERlNfREVCVUdfSAorCisjaW5jbHVkZSAiaHcuaCIKKworLyoqCisgKiBzdHJ1Y3QgYXRoX2Rmc19zdGF0cyAtIERGUyBTdGF0aXN0aWNzCisgKgorICogQHB1bHNlc19kZXRlY3RlZDogIE5vLiBvZiBwdWxzZXMgZGV0ZWN0ZWQgc28gZmFyCisgKiBAZGF0YWxlbl9kaXNjYXJkczogTm8uIG9mIHB1bHNlcyBkaXNjYXJkZWQgZHVlIHRvIGludmFsaWQgZGF0YWxlbgorICogQHJzc2lfZGlzY2FyZHM6ICAgIE5vLiBvZiBwdWxzZXMgZGlzY2FyZGVkIGR1ZSB0byBpbnZhbGlkIFJTU0kKKyAqIEBid2luZm9fZGlzY2FyZHM6ICBOby4gb2YgcHVsc2VzIGRpc2NhcmRlZCBkdWUgdG8gaW52YWxpZCBCVyBpbmZvCisgKiBAcHJpX3BoeV9lcnJvcnM6ICAgTm8uIG9mIHB1bHNlcyByZXBvcnRlZCBmb3IgcHJpbWFyeSBjaGFubmVsCisgKiBAZXh0X3BoeV9lcnJvcnM6ICAgTm8uIG9mIHB1bHNlcyByZXBvcnRlZCBmb3IgZXh0ZW5zaW9uIGNoYW5uZWwKKyAqIEBkY19waHlfZXJyb3JzOiAgICBOby4gb2YgcHVsc2VzIHJlcG9ydGVkIGZvciBwcmltYXJ5ICsgZXh0ZW5zaW9uIGNoYW5uZWwKKyAqLworc3RydWN0IGF0aF9kZnNfc3RhdHMgeworCXUzMiBwdWxzZXNfZGV0ZWN0ZWQ7CisJdTMyIGRhdGFsZW5fZGlzY2FyZHM7CisJdTMyIHJzc2lfZGlzY2FyZHM7CisJdTMyIGJ3aW5mb19kaXNjYXJkczsKKwl1MzIgcHJpX3BoeV9lcnJvcnM7CisJdTMyIGV4dF9waHlfZXJyb3JzOworCXUzMiBkY19waHlfZXJyb3JzOworfTsKKworI2lmIGRlZmluZWQoQ09ORklHX0FUSDlLX0RGU19ERUJVR0ZTKQorCisjZGVmaW5lIERGU19TVEFUX0lOQyhzYywgYykgKHNjLT5kZWJ1Zy5zdGF0cy5kZnNfc3RhdHMuYysrKQordm9pZCBhdGg5a19kZnNfaW5pdF9kZWJ1ZyhzdHJ1Y3QgYXRoX3NvZnRjICpzYyk7CisKKyNlbHNlCisKKyNkZWZpbmUgREZTX1NUQVRfSU5DKHNjLCBjKSBkbyB7IH0gd2hpbGUgKDApCitzdGF0aWMgaW5saW5lIHZvaWQgYXRoOWtfZGZzX2luaXRfZGVidWcoc3RydWN0IGF0aF9zb2Z0YyAqc2MpIHsgfQorCisjZW5kaWYgLyogQ09ORklHX0FUSDlLX0RGU19ERUJVR0ZTICovCisKKyNlbmRpZiAvKiBBVEg5S19ERlNfREVCVUdfSCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbS5jCmluZGV4IGU0NmY3NTEuLmM0MzUyMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb20uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmMKQEAgLTMwNSw4ICszMDUsNyBAQAogCQlyZWd1bGF0b3J5LT5tYXhfcG93ZXJfbGV2ZWwgKz0gSU5DUkVBU0VfTUFYUE9XX0JZX1RIUkVFX0NIQUlOOwogCQlicmVhazsKIAlkZWZhdWx0OgotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCi0JCQkiSW52YWxpZCBjaGFpbm1hc2sgY29uZmlndXJhdGlvblxuIik7CisJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sICJJbnZhbGlkIGNoYWlubWFzayBjb25maWd1cmF0aW9uXG4iKTsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbS5oCmluZGV4IDQ5YWJkMzQuLjVmZjdhYjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb20uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tLmgKQEAgLTI0OSw3ICsyNDksOCBAQAogCUVFUF9BTlRfRElWX0NUTDEsCiAJRUVQX0NIQUlOX01BU0tfUkVEVUNFLAogCUVFUF9BTlRFTk5BX0dBSU5fMkcsCi0JRUVQX0FOVEVOTkFfR0FJTl81RworCUVFUF9BTlRFTk5BX0dBSU5fNUcsCisJRUVQX1FVSUNLX0RST1AKIH07CiAKIGVudW0gYXI1NDE2X3JhdGVzIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fNGsuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fNGsuYwppbmRleCA5YTc1MjBmLi40MzIyYWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzRrLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV80ay5jCkBAIC0zOCw3ICszOCw3IEBACiAKIAlmb3IgKGFkZHIgPSAwOyBhZGRyIDwgU0laRV9FRVBST01fNEs7IGFkZHIrKykgewogCQlpZiAoIWF0aDlrX2h3X252cmFtX3JlYWQoY29tbW9uLCBhZGRyICsgZWVwX3N0YXJ0X2xvYywgZWVwX2RhdGEpKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCisJCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLAogCQkJCSJVbmFibGUgdG8gcmVhZCBlZXByb20gcmVnaW9uXG4iKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtNjIsOCArNjIsNyBAQAogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCiAJaWYgKCFhdGg5a19od191c2VfZmxhc2goYWgpKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKLQkJCSJSZWFkaW5nIGZyb20gRUVQUk9NLCBub3QgZmxhc2hcbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAiUmVhZGluZyBmcm9tIEVFUFJPTSwgbm90IGZsYXNoXG4iKTsKIAl9CiAKIAlpZiAoY29tbW9uLT5idXNfb3BzLT5hdGhfYnVzX3R5cGUgPT0gQVRIX1VTQikKQEAgLTIwNCw4ICsyMDMsNyBAQAogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfRUVQUk9NLAotCQkJIlJlYWQgTWFnaWMgPSAweCUwNFhcbiIsIG1hZ2ljKTsKKwkJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwgIlJlYWQgTWFnaWMgPSAweCUwNFhcbiIsIG1hZ2ljKTsKIAogCQlpZiAobWFnaWMgIT0gQVI1NDE2X0VFUFJPTV9NQUdJQykgewogCQkJbWFnaWMyID0gc3dhYjE2KG1hZ2ljKTsKQEAgLTIyNyw3ICsyMjUsNyBAQAogCQl9CiAJfQogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfRUVQUk9NLCAibmVlZF9zd2FwID0gJXMuXG4iLAorCWF0aF9kYmcoY29tbW9uLCBFRVBST00sICJuZWVkX3N3YXAgPSAlc1xuIiwKIAkJbmVlZF9zd2FwID8gIlRydWUiIDogIkZhbHNlIik7CiAKIAlpZiAobmVlZF9zd2FwKQpAQCAtMjQ5LDcgKzI0Nyw3IEBACiAJCXUzMiBpbnRlZ2VyOwogCQl1MTYgd29yZDsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCisJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sCiAJCQkiRUVQUk9NIEVuZGlhbm5lc3MgaXMgbm90IG5hdGl2ZS4uIENoYW5naW5nXG4iKTsKIAogCQl3b3JkID0gc3dhYjE2KGVlcC0+YmFzZUVlcEhlYWRlci5sZW5ndGgpOwpAQCAtNDM1LDExICs0MzMsMTEgQEAKIAkJCQlyZWczMiA9IGdldF91bmFsaWduZWRfbGUzMigmcGRhZGNWYWx1ZXNbNCAqIGpdKTsKIAkJCQlSRUdfV1JJVEUoYWgsIHJlZ09mZnNldCwgcmVnMzIpOwogCi0JCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfRUVQUk9NLAorCQkJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sCiAJCQkJCSJQREFEQyAoJWQsJTR4KTogJTQuNHggJTguOHhcbiIsCiAJCQkJCWksIHJlZ0NoYWluT2Zmc2V0LCByZWdPZmZzZXQsCiAJCQkJCXJlZzMyKTsKLQkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCisJCQkJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwKIAkJCQkJIlBEQURDOiBDaGFpbiAlZCB8ICIKIAkJCQkJIlBEQURDICUzZCBWYWx1ZSAlM2QgfCAiCiAJCQkJCSJQREFEQyAlM2QgVmFsdWUgJTNkIHwgIgpAQCAtNDczLDcgKzQ3MSw3IEBACiAKIAlpbnQgaTsKIAl1MTYgdHdpY2VNaW5FZGdlUG93ZXI7Ci0JdTE2IHR3aWNlTWF4RWRnZVBvd2VyID0gTUFYX1JBVEVfUE9XRVI7CisJdTE2IHR3aWNlTWF4RWRnZVBvd2VyOwogCXUxNiBzY2FsZWRQb3dlciA9IDAsIG1pbkN0bFBvd2VyOwogCXUxNiBudW1DdGxNb2RlczsKIAljb25zdCB1MTYgKnBDdGxNb2RlOwpAQCAtNTQyLDkgKzU0MCw3IEBACiAJCWVsc2UKIAkJCWZyZXEgPSBjZW50ZXJzLmN0bF9jZW50ZXI7CiAKLQkJaWYgKGFoLT5lZXBfb3BzLT5nZXRfZWVwcm9tX3ZlcihhaCkgPT0gMTQgJiYKLQkJICAgIGFoLT5lZXBfb3BzLT5nZXRfZWVwcm9tX3JldihhaCkgPD0gMikKLQkJCXR3aWNlTWF4RWRnZVBvd2VyID0gTUFYX1JBVEVfUE9XRVI7CisJCXR3aWNlTWF4RWRnZVBvd2VyID0gTUFYX1JBVEVfUE9XRVI7CiAKIAkJZm9yIChpID0gMDsgKGkgPCBBUjU0MTZfRUVQNEtfTlVNX0NUTFMpICYmCiAJCQkgICAgIHBFZXBEYXRhLT5jdGxJbmRleFtpXTsgaSsrKSB7CkBAIC0xMDgxLDggKzEwNzcsNyBAQAogCiAJdTE2IHNwdXJfdmFsID0gQVJfTk9fU1BVUjsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKLQkJIkdldHRpbmcgc3B1ciBpZHg6JWQgaXMyR2h6OiVkIHZhbDoleFxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgQU5JLCAiR2V0dGluZyBzcHVyIGlkeDolZCBpczJHaHo6JWQgdmFsOiV4XG4iLAogCQlpLCBpczJHSHosIGFoLT5jb25maWcuc3B1cmNoYW5zW2ldW2lzMkdIel0pOwogCiAJc3dpdGNoIChhaC0+Y29uZmlnLnNwdXJtb2RlKSB7CkBAIC0xMDkwLDggKzEwODUsOCBAQAogCQlicmVhazsKIAljYXNlIFNQVVJfRU5BQkxFX0lPQ1RMOgogCQlzcHVyX3ZhbCA9IGFoLT5jb25maWcuc3B1cmNoYW5zW2ldW2lzMkdIel07Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKLQkJCSJHZXR0aW5nIHNwdXIgdmFsIGZyb20gbmV3IGxvYy4gJWRcbiIsIHNwdXJfdmFsKTsKKwkJYXRoX2RiZyhjb21tb24sIEFOSSwgIkdldHRpbmcgc3B1ciB2YWwgZnJvbSBuZXcgbG9jLiAlZFxuIiwKKwkJCXNwdXJfdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSBTUFVSX0VOQUJMRV9FRVBST006CiAJCXNwdXJfdmFsID0gRUVQX01BUDRLX1NQVVJDSEFOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV85Mjg3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYwppbmRleCA0ZjVjNTBhLi5mMjcyMjM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tXzkyODcuYwpAQCAtNDEsNyArNDEsNyBAQAogCWZvciAoYWRkciA9IDA7IGFkZHIgPCBTSVpFX0VFUFJPTV9BUjkyODc7IGFkZHIrKykgewogCQlpZiAoIWF0aDlrX2h3X252cmFtX3JlYWQoY29tbW9uLCBhZGRyICsgZWVwX3N0YXJ0X2xvYywKIAkJCQkJIGVlcF9kYXRhKSkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfRUVQUk9NLAorCQkJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwKIAkJCQkiVW5hYmxlIHRvIHJlYWQgZWVwcm9tIHJlZ2lvblxuIik7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KQEAgLTY2LDggKzY2LDcgQEAKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKIAogCWlmICghYXRoOWtfaHdfdXNlX2ZsYXNoKGFoKSkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCi0JCQkiUmVhZGluZyBmcm9tIEVFUFJPTSwgbm90IGZsYXNoXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwgIlJlYWRpbmcgZnJvbSBFRVBST00sIG5vdCBmbGFzaFxuIik7CiAJfQogCiAJaWYgKGNvbW1vbi0+YnVzX29wcy0+YXRoX2J1c190eXBlID09IEFUSF9VU0IpCkBAIC0xOTcsOCArMTk2LDcgQEAKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKLQkJCSJSZWFkIE1hZ2ljID0gMHglMDRYXG4iLCBtYWdpYyk7CisJCWF0aF9kYmcoY29tbW9uLCBFRVBST00sICJSZWFkIE1hZ2ljID0gMHglMDRYXG4iLCBtYWdpYyk7CiAKIAkJaWYgKG1hZ2ljICE9IEFSNTQxNl9FRVBST01fTUFHSUMpIHsKIAkJCW1hZ2ljMiA9IHN3YWIxNihtYWdpYyk7CkBAIC0yMjAsNyArMjE4LDcgQEAKIAkJfQogCX0KIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwgIm5lZWRfc3dhcCA9ICVzLlxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAibmVlZF9zd2FwID0gJXNcbiIsCiAJCW5lZWRfc3dhcCA/ICJUcnVlIiA6ICJGYWxzZSIpOwogCiAJaWYgKG5lZWRfc3dhcCkKQEAgLTU2OSw3ICs1NjcsNyBAQAogI2RlZmluZSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RXT19DSEFJTiAgICAgNgogI2RlZmluZSBSRURVQ0VfU0NBTEVEX1BPV0VSX0JZX1RIUkVFX0NIQUlOICAgMTAKIAotCXUxNiB0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOworCXUxNiB0d2ljZU1heEVkZ2VQb3dlcjsKIAlpbnQgaTsKIAlzdHJ1Y3QgY2FsX2N0bF9kYXRhX2FyOTI4NyAqcmVwOwogCXN0cnVjdCBjYWxfdGFyZ2V0X3Bvd2VyX2xlZyB0YXJnZXRQb3dlck9mZG0gPSB7MCwgezAsIDAsIDAsIDB9IH0sCkBAIC02NjksNiArNjY3LDcgQEAKIAkJZWxzZQogCQkJZnJlcSA9IGNlbnRlcnMuY3RsX2NlbnRlcjsKIAorCQl0d2ljZU1heEVkZ2VQb3dlciA9IE1BWF9SQVRFX1BPV0VSOwogCQkvKiBXYWxrIHRocm91Z2ggdGhlIENUTCBpbmRpY2VzIHN0b3JlZCBpbiBFRVBST00gKi8KIAkJZm9yIChpID0gMDsgKGkgPCBBUjkyODdfTlVNX0NUTFMpICYmIHBFZXBEYXRhLT5jdGxJbmRleFtpXTsgaSsrKSB7CiAJCQlzdHJ1Y3QgY2FsX2N0bF9lZGdlcyAqcFJkRWRnZXNQb3dlcjsKQEAgLTEwNDAsOCArMTAzOSw3IEBACiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CiAJdTE2IHNwdXJfdmFsID0gQVJfTk9fU1BVUjsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKLQkJIkdldHRpbmcgc3B1ciBpZHg6JWQgaXMyR2h6OiVkIHZhbDoleFxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgQU5JLCAiR2V0dGluZyBzcHVyIGlkeDolZCBpczJHaHo6JWQgdmFsOiV4XG4iLAogCQlpLCBpczJHSHosIGFoLT5jb25maWcuc3B1cmNoYW5zW2ldW2lzMkdIel0pOwogCiAJc3dpdGNoIChhaC0+Y29uZmlnLnNwdXJtb2RlKSB7CkBAIC0xMDQ5LDggKzEwNDcsOCBAQAogCQlicmVhazsKIAljYXNlIFNQVVJfRU5BQkxFX0lPQ1RMOgogCQlzcHVyX3ZhbCA9IGFoLT5jb25maWcuc3B1cmNoYW5zW2ldW2lzMkdIel07Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwKLQkJCSJHZXR0aW5nIHNwdXIgdmFsIGZyb20gbmV3IGxvYy4gJWRcbiIsIHNwdXJfdmFsKTsKKwkJYXRoX2RiZyhjb21tb24sIEFOSSwgIkdldHRpbmcgc3B1ciB2YWwgZnJvbSBuZXcgbG9jLiAlZFxuIiwKKwkJCXNwdXJfdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSBTUFVSX0VOQUJMRV9FRVBST006CiAJCXNwdXJfdmFsID0gRUVQX01BUDkyODdfU1BVUkNIQU47CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tX2RlZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2VlcHJvbV9kZWYuYwppbmRleCA4MWU2Mjk2Li42MTliOTVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZWVwcm9tX2RlZi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9lZXByb21fZGVmLmMKQEAgLTEyMSw4ICsxMjEsNyBAQAogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCiAJaWYgKCFhdGg5a19od191c2VfZmxhc2goYWgpKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKLQkJCSJSZWFkaW5nIGZyb20gRUVQUk9NLCBub3QgZmxhc2hcbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAiUmVhZGluZyBmcm9tIEVFUFJPTSwgbm90IGZsYXNoXG4iKTsKIAl9CiAKIAlpZiAoY29tbW9uLT5idXNfb3BzLT5hdGhfYnVzX3R5cGUgPT0gQVRIX1VTQikKQEAgLTI3OSw4ICsyNzgsNyBAQAogCX0KIAogCWlmICghYXRoOWtfaHdfdXNlX2ZsYXNoKGFoKSkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCi0JCQkiUmVhZCBNYWdpYyA9IDB4JTA0WFxuIiwgbWFnaWMpOworCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLCAiUmVhZCBNYWdpYyA9IDB4JTA0WFxuIiwgbWFnaWMpOwogCiAJCWlmIChtYWdpYyAhPSBBUjU0MTZfRUVQUk9NX01BR0lDKSB7CiAJCQltYWdpYzIgPSBzd2FiMTYobWFnaWMpOwpAQCAtMzAzLDcgKzMwMSw3IEBACiAJCX0KIAl9CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sICJuZWVkX3N3YXAgPSAlcy5cbiIsCisJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwgIm5lZWRfc3dhcCA9ICVzXG4iLAogCQluZWVkX3N3YXAgPyAiVHJ1ZSIgOiAiRmFsc2UiKTsKIAogCWlmIChuZWVkX3N3YXApCkBAIC0zMjUsNyArMzIzLDcgQEAKIAkJdTMyIGludGVnZXIsIGo7CiAJCXUxNiB3b3JkOwogCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKKwkJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwKIAkJCSJFRVBST00gRW5kaWFubmVzcyBpcyBub3QgbmF0aXZlLi4gQ2hhbmdpbmcuXG4iKTsKIAogCQl3b3JkID0gc3dhYjE2KGVlcC0+YmFzZUVlcEhlYWRlci5sZW5ndGgpOwpAQCAtMzg1LDcgKzM4Myw3IEBACiAJaWYgKChhaC0+aHdfdmVyc2lvbi5kZXZpZCA9PSBBUjkyODBfREVWSURfUENJKSAmJgogCSAgICAoKGVlcC0+YmFzZUVlcEhlYWRlci52ZXJzaW9uICYgMHhmZikgPiAweDBhKSAmJgogCSAgICAoZWVwLT5iYXNlRWVwSGVhZGVyLnB3ZGNsa2luZCA9PSAwKSkKLQkJYWgtPm5lZWRfYW5fdG9wMl9maXh1cCA9IDE7CisJCWFoLT5uZWVkX2FuX3RvcDJfZml4dXAgPSB0cnVlOwogCiAJaWYgKChjb21tb24tPmJ1c19vcHMtPmF0aF9idXNfdHlwZSA9PSBBVEhfVVNCKSAmJgogCSAgICAoQVJfU1JFVl85MjgwKGFoKSkpCkBAIC05NjUsMTUgKzk2MywxMiBAQAogCQkJCXJlZzMyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZwZGFkY1ZhbHVlc1s0ICogal0pOwogCQkJCVJFR19XUklURShhaCwgcmVnT2Zmc2V0LCByZWczMik7CiAKLQkJCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19FRVBST00sCisJCQkJYXRoX2RiZyhjb21tb24sIEVFUFJPTSwKIAkJCQkJIlBEQURDICglZCwlNHgpOiAlNC40eCAlOC44eFxuIiwKIAkJCQkJaSwgcmVnQ2hhaW5PZmZzZXQsIHJlZ09mZnNldCwKIAkJCQkJcmVnMzIpOwotCQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0VFUFJPTSwKLQkJCQkJIlBEQURDOiBDaGFpbiAlZCB8IFBEQURDICUzZCAiCi0JCQkJCSJWYWx1ZSAlM2QgfCBQREFEQyAlM2QgVmFsdWUgJTNkIHwgIgotCQkJCQkiUERBREMgJTNkIFZhbHVlICUzZCB8IFBEQURDICUzZCAiCi0JCQkJCSJWYWx1ZSAlM2QgfFxuIiwKKwkJCQlhdGhfZGJnKGNvbW1vbiwgRUVQUk9NLAorCQkJCQkiUERBREM6IENoYWluICVkIHwgUERBREMgJTNkIFZhbHVlICUzZCB8IFBEQURDICUzZCBWYWx1ZSAlM2QgfCBQREFEQyAlM2QgVmFsdWUgJTNkIHwgUERBREMgJTNkIFZhbHVlICUzZCB8XG4iLAogCQkJCQlpLCA0ICogaiwgcGRhZGNWYWx1ZXNbNCAqIGpdLAogCQkJCQk0ICogaiArIDEsIHBkYWRjVmFsdWVzWzQgKiBqICsgMV0sCiAJCQkJCTQgKiBqICsgMiwgcGRhZGNWYWx1ZXNbNCAqIGogKyAyXSwKQEAgLTEwMDAsNyArOTk1LDcgQEAKICNkZWZpbmUgUkVEVUNFX1NDQUxFRF9QT1dFUl9CWV9USFJFRV9DSEFJTiAgIDkgLyogMTAqbG9nMTAoMykqMiAqLwogCiAJc3RydWN0IGFyNTQxNl9lZXByb21fZGVmICpwRWVwRGF0YSA9ICZhaC0+ZWVwcm9tLmRlZjsKLQl1MTYgdHdpY2VNYXhFZGdlUG93ZXIgPSBNQVhfUkFURV9QT1dFUjsKKwl1MTYgdHdpY2VNYXhFZGdlUG93ZXI7CiAJaW50IGk7CiAJc3RydWN0IGNhbF9jdGxfZGF0YSAqcmVwOwogCXN0cnVjdCBjYWxfdGFyZ2V0X3Bvd2VyX2xlZyB0YXJnZXRQb3dlck9mZG0sIHRhcmdldFBvd2VyQ2NrID0gewpAQCAtMTEyMSw5ICsxMTE2LDcgQEAKIAkJZWxzZQogCQkJZnJlcSA9IGNlbnRlcnMuY3RsX2NlbnRlcjsKIAotCQlpZiAoYWgtPmVlcF9vcHMtPmdldF9lZXByb21fdmVyKGFoKSA9PSAxNCAmJgotCQkgICAgYWgtPmVlcF9vcHMtPmdldF9lZXByb21fcmV2KGFoKSA8PSAyKQotCQkJdHdpY2VNYXhFZGdlUG93ZXIgPSBNQVhfUkFURV9QT1dFUjsKKwkJdHdpY2VNYXhFZGdlUG93ZXIgPSBNQVhfUkFURV9QT1dFUjsKIAogCQlmb3IgKGkgPSAwOyAoaSA8IEFSNTQxNl9OVU1fQ1RMUykgJiYgcEVlcERhdGEtPmN0bEluZGV4W2ldOyBpKyspIHsKIAkJCWlmICgoKChjZmdDdGwgJiB+Q1RMX01PREVfTSkgfApAQCAtMTI4MCw3ICsxMjczLDcgQEAKIAkJcmVndWxhdG9yeS0+bWF4X3Bvd2VyX2xldmVsICs9IElOQ1JFQVNFX01BWFBPV19CWV9USFJFRV9DSEFJTjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBBVEhfREJHX0VFUFJPTSwKKwkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBFRVBST00sCiAJCQkiSW52YWxpZCBjaGFpbm1hc2sgY29uZmlndXJhdGlvblxuIik7CiAJCWJyZWFrOwogCX0KQEAgLTEzOTgsOCArMTM5MSw3IEBACiAKIAl1MTYgc3B1cl92YWwgPSBBUl9OT19TUFVSOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAotCQkiR2V0dGluZyBzcHVyIGlkeDolZCBpczJHaHo6JWQgdmFsOiV4XG4iLAorCWF0aF9kYmcoY29tbW9uLCBBTkksICJHZXR0aW5nIHNwdXIgaWR4OiVkIGlzMkdoejolZCB2YWw6JXhcbiIsCiAJCWksIGlzMkdIeiwgYWgtPmNvbmZpZy5zcHVyY2hhbnNbaV1baXMyR0h6XSk7CiAKIAlzd2l0Y2ggKGFoLT5jb25maWcuc3B1cm1vZGUpIHsKQEAgLTE0MDcsOCArMTM5OSw4IEBACiAJCWJyZWFrOwogCWNhc2UgU1BVUl9FTkFCTEVfSU9DVEw6CiAJCXNwdXJfdmFsID0gYWgtPmNvbmZpZy5zcHVyY2hhbnNbaV1baXMyR0h6XTsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAotCQkJIkdldHRpbmcgc3B1ciB2YWwgZnJvbSBuZXcgbG9jLiAlZFxuIiwgc3B1cl92YWwpOworCQlhdGhfZGJnKGNvbW1vbiwgQU5JLCAiR2V0dGluZyBzcHVyIHZhbCBmcm9tIG5ldyBsb2MuICVkXG4iLAorCQkJc3B1cl92YWwpOwogCQlicmVhazsKIAljYXNlIFNQVVJfRU5BQkxFX0VFUFJPTToKIAkJc3B1cl92YWwgPSBFRVBfREVGX1NQVVJDSEFOOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2dwaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ncGlvLmMKaW5kZXggNjU1NTc2Yy4uNTk3Yzg0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2dwaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvZ3Bpby5jCkBAIC0xMzAsMTIgKzEzMCwxMiBAQAogCQlzYy0+c2NfZmxhZ3MgJj0gfihTQ19PUF9CVF9QUklPUklUWV9ERVRFQ1RFRCB8IFNDX09QX0JUX1NDQU4pOwogCQkvKiBEZXRlY3QgaWYgY29sb2NhdGVkIGJ0IHN0YXJ0ZWQgc2Nhbm5pbmcgKi8KIAkJaWYgKGJ0Y29leC0+YnRfcHJpb3JpdHlfY250ID49IEFUSF9CVF9DTlRfU0NBTl9USFJFU0hPTEQpIHsKLQkJCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCksIEFUSF9EQkdfQlRDT0VYLAorCQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oc2MtPnNjX2FoKSwgQlRDT0VYLAogCQkJCSJCVCBzY2FuIGRldGVjdGVkXG4iKTsKIAkJCXNjLT5zY19mbGFncyB8PSAoU0NfT1BfQlRfU0NBTiB8CiAJCQkJCSBTQ19PUF9CVF9QUklPUklUWV9ERVRFQ1RFRCk7CiAJCX0gZWxzZSBpZiAoYnRjb2V4LT5idF9wcmlvcml0eV9jbnQgPj0gQVRIX0JUX0NOVF9USFJFU0hPTEQpIHsKLQkJCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCksIEFUSF9EQkdfQlRDT0VYLAorCQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oc2MtPnNjX2FoKSwgQlRDT0VYLAogCQkJCSJCVCBwcmlvcml0eSB0cmFmZmljIGRldGVjdGVkXG4iKTsKIAkJCXNjLT5zY19mbGFncyB8PSBTQ19PUF9CVF9QUklPUklUWV9ERVRFQ1RFRDsKIAkJfQpAQCAtMTg5LDggKzE4OSw4IEBACiAJYm9vbCBpc19idHNjYW47CiAKIAlhdGg5a19wc193YWtldXAoc2MpOwotCWF0aF9kZXRlY3RfYnRfcHJpb3JpdHkoc2MpOwotCisJaWYgKCEoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpKQorCQlhdGhfZGV0ZWN0X2J0X3ByaW9yaXR5KHNjKTsKIAlpc19idHNjYW4gPSBzYy0+c2NfZmxhZ3MgJiBTQ19PUF9CVF9TQ0FOOwogCiAJc3Bpbl9sb2NrX2JoKCZidGNvZXgtPmJ0Y29leF9sb2NrKTsKQEAgLTE5OCw2ICsxOTgsNyBAQAogCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgaXNfYnRzY2FuID8gQVRIX0JUQ09FWF9TVE9NUF9BTEwgOgogCQkJICAgICAgYnRjb2V4LT5idF9zdG9tcF90eXBlKTsKIAorCWF0aDlrX2h3X2J0Y29leF9lbmFibGUoYWgpOwogCXNwaW5fdW5sb2NrX2JoKCZidGNvZXgtPmJ0Y29leF9sb2NrKTsKIAogCWlmIChidGNvZXgtPmJ0Y29leF9wZXJpb2QgIT0gYnRjb2V4LT5idGNvZXhfbm9fc3RvbXApIHsKQEAgLTIxMiw4ICsyMTMsOSBAQAogCX0KIAogCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOworCXRpbWVyX3BlcmlvZCA9IGJ0Y29leC0+YnRjb2V4X3BlcmlvZCAvIDEwMDA7CiAJbW9kX3RpbWVyKCZidGNvZXgtPnBlcmlvZF90aW1lciwgamlmZmllcyArCi0JCQkJICBtc2Vjc190b19qaWZmaWVzKEFUSF9CVENPRVhfREVGX0JUX1BFUklPRCkpOworCQkJCSAgbXNlY3NfdG9famlmZmllcyh0aW1lcl9wZXJpb2QpKTsKIH0KIAogLyoKQEAgLTIyOCw4ICsyMzAsNyBAQAogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCWJvb2wgaXNfYnRzY2FuID0gc2MtPnNjX2ZsYWdzICYgU0NfT1BfQlRfU0NBTjsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0JUQ09FWCwKLQkJIm5vIHN0b21wIHRpbWVyIHJ1bm5pbmdcbiIpOworCWF0aF9kYmcoY29tbW9uLCBCVENPRVgsICJubyBzdG9tcCB0aW1lciBydW5uaW5nXG4iKTsKIAogCWF0aDlrX3BzX3dha2V1cChzYyk7CiAJc3Bpbl9sb2NrX2JoKCZidGNvZXgtPmJ0Y29leF9sb2NrKTsKQEAgLTIzOSw2ICsyNDAsNyBAQAogCSBlbHNlIGlmIChidGNvZXgtPmJ0X3N0b21wX3R5cGUgPT0gQVRIX0JUQ09FWF9TVE9NUF9BTEwpCiAJCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgQVRIX0JUQ09FWF9TVE9NUF9MT1cpOwogCisJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZShhaCk7CiAJc3Bpbl91bmxvY2tfYmgoJmJ0Y29leC0+YnRjb2V4X2xvY2spOwogCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwogfQpAQCAtMjQ3LDYgKzI0OSw5IEBACiB7CiAJc3RydWN0IGF0aF9idGNvZXggKmJ0Y29leCA9ICZzYy0+YnRjb2V4OwogCisJaWYgKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKHNjLT5zY19haCkgPT0gQVRIX0JUQ09FWF9DRkdfTk9ORSkKKwkJcmV0dXJuIDA7CisKIAlidGNvZXgtPmJ0Y29leF9wZXJpb2QgPSBBVEhfQlRDT0VYX0RFRl9CVF9QRVJJT0QgKiAxMDAwOwogCWJ0Y29leC0+YnRjb2V4X25vX3N0b21wID0gKDEwMCAtIEFUSF9CVENPRVhfREVGX0RVVFlfQ1lDTEUpICoKIAkJYnRjb2V4LT5idGNvZXhfcGVyaW9kIC8gMTAwOwpAQCAtMjc3LDggKzI4MiwxMCBAQAogCXN0cnVjdCBhdGhfYnRjb2V4ICpidGNvZXggPSAmc2MtPmJ0Y29leDsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKIAotCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19CVENPRVgsCi0JCSJTdGFydGluZyBidGNvZXggdGltZXJzXG4iKTsKKwlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEJUQ09FWCwgIlN0YXJ0aW5nIGJ0Y29leCB0aW1lcnNcbiIpOworCisJaWYgKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSA9PSBBVEhfQlRDT0VYX0NGR19OT05FKQorCQlyZXR1cm47CiAKIAkvKiBtYWtlIHN1cmUgZHV0eSBjeWNsZSB0aW1lciBpcyBhbHNvIHN0b3BwZWQgd2hlbiByZXN1bWluZyAqLwogCWlmIChidGNvZXgtPmh3X3RpbWVyX2VuYWJsZWQpCkBAIC0zMDAsNiArMzA3LDkgQEAKIAlzdHJ1Y3QgYXRoX2J0Y29leCAqYnRjb2V4ID0gJnNjLT5idGNvZXg7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CiAKKwlpZiAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpID09IEFUSF9CVENPRVhfQ0ZHX05PTkUpCisJCXJldHVybjsKKwogCWRlbF90aW1lcl9zeW5jKCZidGNvZXgtPnBlcmlvZF90aW1lcik7CiAKIAlpZiAoYnRjb2V4LT5od190aW1lcl9lbmFibGVkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfYmVhY29uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9iZWFjb24uYwppbmRleCA1N2ZlMjJiLi4yZWFkZmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9iZWFjb24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9iZWFjb24uYwpAQCAtMTY3LDkgKzE2Nyw5IEBACiAJLyogVFNGIG91dCBvZiByYW5nZSB0aHJlc2hvbGQgZml4ZWQgYXQgMSBzZWNvbmQgKi8KIAlicy5ic190c2Zvb3JfdGhyZXNob2xkID0gQVRIOUtfVFNGT09SX1RIUkVTSE9MRDsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywgImludHZhbDogJXUgdHNmOiAlbGx1IHRzZnR1OiAldVxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiaW50dmFsOiAldSB0c2Y6ICVsbHUgdHNmdHU6ICV1XG4iLAogCQlpbnR2YWwsIHRzZiwgdHNmdHUpOwotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAogCQkiYm1pc3M6ICV1IHNsZWVwOiAldSBjZnAtcGVyaW9kOiAldSBtYXhkdXI6ICV1IG5leHQ6ICV1XG4iLAogCQlicy5ic19ibWlzc3RocmVzaG9sZCwgYnMuYnNfc2xlZXBkdXJhdGlvbiwKIAkJYnMuYnNfY2ZwcGVyaW9kLCBicy5ic19jZnBtYXhkdXJhdGlvbiwgYnMuYnNfY2ZwbmV4dCk7CkBAIC0yMjQsOSArMjI0LDggQEAKIAlpZiAocHJpdi0+b3BfZmxhZ3MgJiBPUF9FTkFCTEVfQkVBQ09OKQogCQlpbWFzayB8PSBBVEg5S19JTlRfU1dCQTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJIkFQIEJlYWNvbiBjb25maWcsIGludHZhbDogJWQsIG5leHR0YnR0OiAldSwgcmVzcF90aW1lOiAlZCAiCi0JCSJpbWFzazogMHgleFxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAorCQkiQVAgQmVhY29uIGNvbmZpZywgaW50dmFsOiAlZCwgbmV4dHRidHQ6ICV1LCByZXNwX3RpbWU6ICVkIGltYXNrOiAweCV4XG4iLAogCQlic3NfY29uZi0+YmVhY29uX2ludGVydmFsLCBuZXh0dGJ0dCwKIAkJcHJpdi0+YWgtPmNvbmZpZy5zd19iZWFjb25fcmVzcG9uc2VfdGltZSwgaW1hc2spOwogCkBAIC0yNzMsOSArMjcyLDggQEAKIAlpZiAocHJpdi0+b3BfZmxhZ3MgJiBPUF9FTkFCTEVfQkVBQ09OKQogCQlpbWFzayB8PSBBVEg5S19JTlRfU1dCQTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJIklCU1MgQmVhY29uIGNvbmZpZywgaW50dmFsOiAlZCwgbmV4dHRidHQ6ICV1LCAiCi0JCSJyZXNwX3RpbWU6ICVkLCBpbWFzazogMHgleFxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAorCQkiSUJTUyBCZWFjb24gY29uZmlnLCBpbnR2YWw6ICVkLCBuZXh0dGJ0dDogJXUsIHJlc3BfdGltZTogJWQsIGltYXNrOiAweCV4XG4iLAogCQlic3NfY29uZi0+YmVhY29uX2ludGVydmFsLCBuZXh0dGJ0dCwKIAkJcHJpdi0+YWgtPmNvbmZpZy5zd19iZWFjb25fcmVzcG9uc2VfdGltZSwgaW1hc2spOwogCkBAIC0zMjMsNyArMzIxLDcgQEAKIAogCQl0eF9zbG90ID0gYXRoOWtfaHRjX3R4X2dldF9zbG90KHByaXYpOwogCQlpZiAodHhfc2xvdCA8IDApIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsICJObyBmcmVlIENBQiBzbG90XG4iKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBYTUlULCAiTm8gZnJlZSBDQUIgc2xvdFxuIik7CiAJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJZ290byBuZXh0OwogCQl9CkBAIC0zMzMsOCArMzMxLDcgQEAKIAkJCWF0aDlrX2h0Y190eF9jbGVhcl9zbG90KHByaXYsIHR4X3Nsb3QpOwogCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKIAotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfWE1JVCwKLQkJCQkiRmFpbGVkIHRvIHNlbmQgQ0FCIGZyYW1lXG4iKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBYTUlULCAiRmFpbGVkIHRvIHNlbmQgQ0FCIGZyYW1lXG4iKTsKIAkJfSBlbHNlIHsKIAkJCXNwaW5fbG9ja19iaCgmcHJpdi0+dHgudHhfbG9jayk7CiAJCQlwcml2LT50eC5xdWV1ZWRfY250Kys7CkBAIC00MDksNyArNDA2LDcgQEAKIAlyZXQgPSBodGNfc2VuZChwcml2LT5odGMsIGJlYWNvbik7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWlmIChyZXQgPT0gLUVOT01FTSkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQlNUVUNLLAorCQkJYXRoX2RiZyhjb21tb24sIEJTVFVDSywKIAkJCQkiRmFpbGVkIHRvIHNlbmQgYmVhY29uLCBubyBmcmVlIFRYIGJ1ZmZlclxuIik7CiAJCX0KIAkJZGV2X2tmcmVlX3NrYl9hbnkoYmVhY29uKTsKQEAgLTQzNCw3ICs0MzEsNyBAQAogCXNsb3QgPSAoKHRzZnR1ICUgaW50dmFsKSAqIEFUSDlLX0hUQ19NQVhfQkNOX1ZJRikgLyBpbnR2YWw7CiAJc2xvdCA9IEFUSDlLX0hUQ19NQVhfQkNOX1ZJRiAtIHNsb3QgLSAxOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQkVBQ09OLAorCWF0aF9kYmcoY29tbW9uLCBCRUFDT04sCiAJCSJDaG9vc2Ugc2xvdDogJWQsIHRzZjogJWxsdSwgdHNmdHU6ICV1LCBpbnR2YWw6ICV1XG4iLAogCQlzbG90LCB0c2YsIHRzZnR1LCBpbnR2YWwpOwogCkBAIC00NTAsOCArNDQ3LDcgQEAKIAlpZiAoc3diYS0+YmVhY29uX3BlbmRpbmcgIT0gMCkgewogCQlwcml2LT5jdXJfYmVhY29uX2NvbmYuYm1pc3NfY250Kys7CiAJCWlmIChwcml2LT5jdXJfYmVhY29uX2NvbmYuYm1pc3NfY250ID4gQlNUVUNLX1RIUkVTSE9MRCkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQlNUVUNLLAotCQkJCSJCZWFjb24gc3R1Y2ssIEhXIHJlc2V0XG4iKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBCU1RVQ0ssICJCZWFjb24gc3R1Y2ssIEhXIHJlc2V0XG4iKTsKIAkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKHByaXYtPmh3LAogCQkJCQkgICAgICZwcml2LT5mYXRhbF93b3JrKTsKIAkJfQpAQCAtNDU5LDcgKzQ1NSw3IEBACiAJfQogCiAJaWYgKHByaXYtPmN1cl9iZWFjb25fY29uZi5ibWlzc19jbnQpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQlNUVUNLLAorCQlhdGhfZGJnKGNvbW1vbiwgQlNUVUNLLAogCQkJIlJlc3VtaW5nIGJlYWNvbiB4bWl0IGFmdGVyICV1IG1pc3Nlc1xuIiwKIAkJCXByaXYtPmN1cl9iZWFjb25fY29uZi5ibWlzc19jbnQpOwogCQlwcml2LT5jdXJfYmVhY29uX2NvbmYuYm1pc3NfY250ID0gMDsKQEAgLTQ5NSw4ICs0OTEsOCBAQAogCXByaXYtPmN1cl9iZWFjb25fY29uZi5ic2xvdFthdnAtPmJzbG90XSA9IHZpZjsKIAlzcGluX3VubG9ja19iaCgmcHJpdi0+YmVhY29uX2xvY2spOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkiQWRkZWQgaW50ZXJmYWNlIGF0IGJlYWNvbiBzbG90OiAlZFxuIiwgYXZwLT5ic2xvdCk7CisJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIkFkZGVkIGludGVyZmFjZSBhdCBiZWFjb24gc2xvdDogJWRcbiIsCisJCWF2cC0+YnNsb3QpOwogfQogCiB2b2lkIGF0aDlrX2h0Y19yZW1vdmVfYnNsb3Qoc3RydWN0IGF0aDlrX2h0Y19wcml2ICpwcml2LApAQCAtNTA5LDggKzUwNSw4IEBACiAJcHJpdi0+Y3VyX2JlYWNvbl9jb25mLmJzbG90W2F2cC0+YnNsb3RdID0gTlVMTDsKIAlzcGluX3VubG9ja19iaCgmcHJpdi0+YmVhY29uX2xvY2spOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkiUmVtb3ZlZCBpbnRlcmZhY2UgYXQgYmVhY29uIHNsb3Q6ICVkXG4iLCBhdnAtPmJzbG90KTsKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiUmVtb3ZlZCBpbnRlcmZhY2UgYXQgYmVhY29uIHNsb3Q6ICVkXG4iLAorCQlhdnAtPmJzbG90KTsKIH0KIAogLyoKQEAgLTUzNiw4ICs1MzIsNyBAQAogCXRzZmFkanVzdCA9IGN1cl9jb25mLT5iZWFjb25faW50ZXJ2YWwgKiBhdnAtPmJzbG90IC8gQVRIOUtfSFRDX01BWF9CQ05fVklGOwogCWF2cC0+dHNmYWRqdXN0ID0gY3B1X3RvX2xlNjQoVFVfVE9fVVNFQyh0c2ZhZGp1c3QpKTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJInRzZmFkanVzdCBpczogJWxsdSBmb3IgYnNsb3Q6ICVkXG4iLAorCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJ0c2ZhZGp1c3QgaXM6ICVsbHUgZm9yIGJzbG90OiAlZFxuIiwKIAkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0c2ZhZGp1c3QsIGF2cC0+YnNsb3QpOwogfQogCkBAIC01NjgsNyArNTYzLDcgQEAKIAkgICAgKHByaXYtPm51bV9hcF92aWYgPiAxKSAmJgogCSAgICAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKSAmJgogCSAgICAoY3VyX2NvbmYtPmJlYWNvbl9pbnRlcnZhbCAhPSBic3NfY29uZi0+YmVhY29uX2ludCkpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAorCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAogCQkJIkNoYW5naW5nIGJlYWNvbiBpbnRlcnZhbCBvZiBtdWx0aXBsZSBBUCBpbnRlcmZhY2VzICFcbiIpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtNTc5LDcgKzU3NCw3IEBACiAJICovCiAJaWYgKHByaXYtPm51bV9hcF92aWYgJiYKIAkgICAgKHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCkpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAorCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAogCQkJIkhXIGluIEFQIG1vZGUsIGNhbm5vdCBzZXQgU1RBIGJlYWNvbiBwYXJhbWV0ZXJzXG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTU5Nyw3ICs1OTIsNyBAQAogCQkJCQkJCSAgICZiZWFjb25fY29uZmlndXJlZCk7CiAKIAkJaWYgKGJlYWNvbl9jb25maWd1cmVkKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAogCQkJCSJCZWFjb24gYWxyZWFkeSBjb25maWd1cmVkIGZvciBhIHN0YXRpb24gaW50ZXJmYWNlXG4iKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtNjM3LDggKzYzMiw3IEBACiAJCWF0aDlrX2h0Y19iZWFjb25fY29uZmlnX2FwKHByaXYsIGN1cl9jb25mKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkJIlVuc3VwcG9ydGVkIGJlYWNvbmluZyBtb2RlXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIlVuc3VwcG9ydGVkIGJlYWNvbmluZyBtb2RlXG4iKTsKIAkJcmV0dXJuOwogCX0KIH0KQEAgLTY1OSw4ICs2NTMsNyBAQAogCQlhdGg5a19odGNfYmVhY29uX2NvbmZpZ19hcChwcml2LCBjdXJfY29uZik7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJCSJVbnN1cHBvcnRlZCBiZWFjb25pbmcgbW9kZVxuIik7CisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJVbnN1cHBvcnRlZCBiZWFjb25pbmcgbW9kZVxuIik7CiAJCXJldHVybjsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9ncGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9ncGlvLmMKaW5kZXggZTNhMDJlYi4uNjUwNmUxZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfZ3Bpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2dwaW8uYwpAQCAtMzYsMTIgKzM2LDEyIEBACiAJCXByaXYtPm9wX2ZsYWdzICY9IH4oT1BfQlRfUFJJT1JJVFlfREVURUNURUQgfCBPUF9CVF9TQ0FOKTsKIAkJLyogRGV0ZWN0IGlmIGNvbG9jYXRlZCBidCBzdGFydGVkIHNjYW5uaW5nICovCiAJCWlmIChidGNvZXgtPmJ0X3ByaW9yaXR5X2NudCA+PSBBVEhfQlRfQ05UX1NDQU5fVEhSRVNIT0xEKSB7Ci0JCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfQlRDT0VYLAorCQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBCVENPRVgsCiAJCQkJIkJUIHNjYW4gZGV0ZWN0ZWRcbiIpOwogCQkJcHJpdi0+b3BfZmxhZ3MgfD0gKE9QX0JUX1NDQU4gfAogCQkJCQkgT1BfQlRfUFJJT1JJVFlfREVURUNURUQpOwogCQl9IGVsc2UgaWYgKGJ0Y29leC0+YnRfcHJpb3JpdHlfY250ID49IEFUSF9CVF9DTlRfVEhSRVNIT0xEKSB7Ci0JCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfQlRDT0VYLAorCQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBCVENPRVgsCiAJCQkJIkJUIHByaW9yaXR5IHRyYWZmaWMgZGV0ZWN0ZWRcbiIpOwogCQkJcHJpdi0+b3BfZmxhZ3MgfD0gT1BfQlRfUFJJT1JJVFlfREVURUNURUQ7CiAJCX0KQEAgLTgwLDYgKzgwLDcgQEAKIAlhdGg5a19od19idGNvZXhfYnRfc3RvbXAocHJpdi0+YWgsIGlzX2J0c2NhbiA/IEFUSF9CVENPRVhfU1RPTVBfQUxMIDoKIAkJCWJ0Y29leC0+YnRfc3RvbXBfdHlwZSk7CiAKKwlhdGg5a19od19idGNvZXhfZW5hYmxlKHByaXYtPmFoKTsKIAl0aW1lcl9wZXJpb2QgPSBpc19idHNjYW4gPyBidGNvZXgtPmJ0c2Nhbl9ub19zdG9tcCA6CiAJCWJ0Y29leC0+YnRjb2V4X25vX3N0b21wOwogCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+aHcsICZwcml2LT5kdXR5X2N5Y2xlX3dvcmssCkBAIC0xMDEsMTkgKzEwMiwyMiBAQAogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCWJvb2wgaXNfYnRzY2FuID0gcHJpdi0+b3BfZmxhZ3MgJiBPUF9CVF9TQ0FOOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQlRDT0VYLAotCQkidGltZSBzbGljZSB3b3JrIGZvciBidCBhbmQgd2xhblxuIik7CisJYXRoX2RiZyhjb21tb24sIEJUQ09FWCwgInRpbWUgc2xpY2Ugd29yayBmb3IgYnQgYW5kIHdsYW5cbiIpOwogCiAJaWYgKGJ0Y29leC0+YnRfc3RvbXBfdHlwZSA9PSBBVEhfQlRDT0VYX1NUT01QX0xPVyB8fCBpc19idHNjYW4pCiAJCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgQVRIX0JUQ09FWF9TVE9NUF9OT05FKTsKIAllbHNlIGlmIChidGNvZXgtPmJ0X3N0b21wX3R5cGUgPT0gQVRIX0JUQ09FWF9TVE9NUF9BTEwpCiAJCWF0aDlrX2h3X2J0Y29leF9idF9zdG9tcChhaCwgQVRIX0JUQ09FWF9TVE9NUF9MT1cpOworCWF0aDlrX2h3X2J0Y29leF9lbmFibGUocHJpdi0+YWgpOwogfQogCiB2b2lkIGF0aF9odGNfaW5pdF9idGNvZXhfd29yayhzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYpCiB7CiAJc3RydWN0IGF0aF9idGNvZXggKmJ0Y29leCA9ICZwcml2LT5idGNvZXg7CiAKKwlpZiAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUocHJpdi0+YWgpID09IEFUSF9CVENPRVhfQ0ZHX05PTkUpCisJCXJldHVybjsKKwogCWJ0Y29leC0+YnRjb2V4X3BlcmlvZCA9IEFUSF9CVENPRVhfREVGX0JUX1BFUklPRDsKIAlidGNvZXgtPmJ0Y29leF9ub19zdG9tcCA9ICgxMDAgLSBBVEhfQlRDT0VYX0RFRl9EVVRZX0NZQ0xFKSAqCiAJCWJ0Y29leC0+YnRjb2V4X3BlcmlvZCAvIDEwMDsKQEAgLTEzMiw3ICsxMzYsMTAgQEAKIAlzdHJ1Y3QgYXRoX2J0Y29leCAqYnRjb2V4ID0gJnByaXYtPmJ0Y29leDsKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHByaXYtPmFoOwogCi0JYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBBVEhfREJHX0JUQ09FWCwgIlN0YXJ0aW5nIGJ0Y29leCB3b3JrXG4iKTsKKwlpZiAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpID09IEFUSF9CVENPRVhfQ0ZHX05PTkUpCisJCXJldHVybjsKKworCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQlRDT0VYLCAiU3RhcnRpbmcgYnRjb2V4IHdvcmtcbiIpOwogCiAJYnRjb2V4LT5idF9wcmlvcml0eV9jbnQgPSAwOwogCWJ0Y29leC0+YnRfcHJpb3JpdHlfdGltZSA9IGppZmZpZXM7CkBAIC0xNDYsNiArMTUzLDkgQEAKICAqLwogdm9pZCBhdGhfaHRjX2NhbmNlbF9idGNvZXhfd29yayhzdHJ1Y3QgYXRoOWtfaHRjX3ByaXYgKnByaXYpCiB7CisJaWYgKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKHByaXYtPmFoKSA9PSBBVEhfQlRDT0VYX0NGR19OT05FKQorCQlyZXR1cm47CisKIAljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPmNvZXhfcGVyaW9kX3dvcmspOwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+ZHV0eV9jeWNsZV93b3JrKTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X2luaXQuYwppbmRleCA5NjY2NjFjLi45YmUxMGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9pbml0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfaW5pdC5jCkBAIC0yOTksOCArMjk5LDcgQEAKIAkJCSAgKHU4ICopICZ2YWwsIHNpemVvZih2YWwpLAogCQkJICAxMDApOwogCWlmICh1bmxpa2VseShyKSkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19XTUksCi0JCQkiUkVHSVNURVIgUkVBRCBGQUlMRUQ6ICgweCUwNHgsICVkKVxuIiwKKwkJYXRoX2RiZyhjb21tb24sIFdNSSwgIlJFR0lTVEVSIFJFQUQgRkFJTEVEOiAoMHglMDR4LCAlZClcbiIsCiAJCQlyZWdfb2Zmc2V0LCByKTsKIAkJcmV0dXJuIC1FSU87CiAJfQpAQCAtMzI3LDcgKzMyNiw3IEBACiAJCQkgICAodTggKil0bXB2YWwsIHNpemVvZih1MzIpICogY291bnQsCiAJCQkgICAxMDApOwogCWlmICh1bmxpa2VseShyZXQpKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1dNSSwKKwkJYXRoX2RiZyhjb21tb24sIFdNSSwKIAkJCSJNdWx0aXBsZSBSRUdJU1RFUiBSRUFEIEZBSUxFRCAoY291bnQ6ICVkKVxuIiwgY291bnQpOwogCX0KIApAQCAtMzUyLDggKzM1MSw3IEBACiAJCQkgICh1OCAqKSAmdmFsLCBzaXplb2YodmFsKSwKIAkJCSAgMTAwKTsKIAlpZiAodW5saWtlbHkocikpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfV01JLAotCQkJIlJFR0lTVEVSIFdSSVRFIEZBSUxFRDooMHglMDR4LCAlZClcbiIsCisJCWF0aF9kYmcoY29tbW9uLCBXTUksICJSRUdJU1RFUiBXUklURSBGQUlMRUQ6KDB4JTA0eCwgJWQpXG4iLAogCQkJcmVnX29mZnNldCwgcik7CiAJfQogfQpAQCAtMzg0LDcgKzM4Miw3IEBACiAJCQkgICh1OCAqKSAmcnNwX3N0YXR1cywgc2l6ZW9mKHJzcF9zdGF0dXMpLAogCQkJICAxMDApOwogCQlpZiAodW5saWtlbHkocikpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1dNSSwKKwkJCWF0aF9kYmcoY29tbW9uLCBXTUksCiAJCQkJIlJFR0lTVEVSIFdSSVRFIEZBSUxFRCwgbXVsdGkgbGVuOiAlZFxuIiwKIAkJCQlwcml2LT53bWktPm11bHRpX3dyaXRlX2lkeCk7CiAJCX0KQEAgLTQzNCw3ICs0MzIsNyBAQAogCQkJICAodTggKikgJnJzcF9zdGF0dXMsIHNpemVvZihyc3Bfc3RhdHVzKSwKIAkJCSAgMTAwKTsKIAkJaWYgKHVubGlrZWx5KHIpKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19XTUksCisJCQlhdGhfZGJnKGNvbW1vbiwgV01JLAogCQkJCSJSRUdJU1RFUiBXUklURSBGQUlMRUQsIG11bHRpIGxlbjogJWRcbiIsCiAJCQkJcHJpdi0+d21pLT5tdWx0aV93cml0ZV9pZHgpOwogCQl9CkBAIC01MTIsOCArNTEwLDcgQEAKIAl0eF9zdHJlYW1zID0gYXRoOWtfY21uX2NvdW50X3N0cmVhbXMocHJpdi0+YWgtPnR4Y2hhaW5tYXNrLCAyKTsKIAlyeF9zdHJlYW1zID0gYXRoOWtfY21uX2NvdW50X3N0cmVhbXMocHJpdi0+YWgtPnJ4Y2hhaW5tYXNrLCAyKTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJIlRYIHN0cmVhbXMgJWQsIFJYIHN0cmVhbXM6ICVkXG4iLAorCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJUWCBzdHJlYW1zICVkLCBSWCBzdHJlYW1zOiAlZFxuIiwKIAkJdHhfc3RyZWFtcywgcnhfc3RyZWFtcyk7CiAKIAlpZiAodHhfc3RyZWFtcyAhPSByeF9zdHJlYW1zKSB7CkBAIC02MTAsNyArNjA3LDcgQEAKIHsKIAlpbnQgcW51bTsKIAotCXN3aXRjaCAocHJpdi0+YWgtPmJ0Y29leF9ody5zY2hlbWUpIHsKKwlzd2l0Y2ggKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKHByaXYtPmFoKSkgewogCWNhc2UgQVRIX0JUQ09FWF9DRkdfTk9ORToKIAkJYnJlYWs7CiAJY2FzZSBBVEhfQlRDT0VYX0NGR18zV0lSRToKQEAgLTcwNCw3ICs3MDEsOCBAQAogCiAJaWYgKHByb2R1Y3QgJiYgc3RybmNtcChwcm9kdWN0LCBBVEhfSFRDX0JUQ09FWF9QUk9EVUNUX0lELCA1KSA9PSAwKSB7CiAJCWFoLT5idGNvZXhfaHcuc2NoZW1lID0gQVRIX0JUQ09FWF9DRkdfM1dJUkU7Ci0JCWF0aDlrX2luaXRfYnRjb2V4KHByaXYpOworCQlpZiAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpICE9IEFUSF9CVENPRVhfQ0ZHX05PTkUpCisJCQlhdGg5a19pbml0X2J0Y29leChwcml2KTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTg3Niw5ICs4NzQsOCBAQAogCQlnb3RvIGVycl93b3JsZDsKIAl9CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCi0JCSJXTUk6JWQsIEJDTjolZCwgQ0FCOiVkLCBVQVBTRDolZCwgTUdNVDolZCwgIgotCQkiQkU6JWQsIEJLOiVkLCBWSTolZCwgVk86JWRcbiIsCisJYXRoX2RiZyhjb21tb24sIENPTkZJRywKKwkJIldNSTolZCwgQkNOOiVkLCBDQUI6JWQsIFVBUFNEOiVkLCBNR01UOiVkLCBCRTolZCwgQks6JWQsIFZJOiVkLCBWTzolZFxuIiwKIAkJcHJpdi0+d21pX2NtZF9lcCwKIAkJcHJpdi0+YmVhY29uX2VwLAogCQlwcml2LT5jYWJfZXAsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl9tYWluLmMKaW5kZXggMGI5YTBlOC4uZWY0YzYwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X21haW4uYwpAQCAtMjY2LDcgKzI2Niw3IEBACiAKIAlhdGg5a193bWlfZXZlbnRfZHJhaW4ocHJpdik7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJYXRoX2RiZyhjb21tb24sIENPTkZJRywKIAkJIigldSBNSHopIC0+ICgldSBNSHopLCBIVDogJWQsIEhUNDA6ICVkIGZhc3RjYzogJWRcbiIsCiAJCXByaXYtPmFoLT5jdXJjaGFuLT5jaGFubmVsLAogCQljaGFubmVsLT5jZW50ZXJfZnJlcSwgY29uZl9pc19odChjb25mKSwgY29uZl9pc19odDQwKGNvbmYpLApAQCAtNDE1LDcgKzQxNSw3IEBACiAJcHJpdi0+dmlmX3N0YV9wb3NbcHJpdi0+bW9uX3ZpZl9pZHhdID0gc3RhX2lkeDsKIAlwcml2LT5haC0+aXNfbW9uaXRvcmluZyA9IHRydWU7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJYXRoX2RiZyhjb21tb24sIENPTkZJRywKIAkJIkF0dGFjaGVkIGEgbW9uaXRvciBpbnRlcmZhY2UgYXQgaWR4OiAlZCwgc3RhIGlkeDogJWRcbiIsCiAJCXByaXYtPm1vbl92aWZfaWR4LCBzdGFfaWR4KTsKIApAQCAtNDI3LDcgKzQyNyw3IEBACiAJICovCiAJX19hdGg5a19odGNfcmVtb3ZlX21vbml0b3JfaW50ZXJmYWNlKHByaXYpOwogZXJyX3ZpZjoKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19GQVRBTCwgIlVuYWJsZSB0byBhdHRhY2ggYSBtb25pdG9yIGludGVyZmFjZVxuIik7CisJYXRoX2RiZyhjb21tb24sIEZBVEFMLCAiVW5hYmxlIHRvIGF0dGFjaCBhIG1vbml0b3IgaW50ZXJmYWNlXG4iKTsKIAogCXJldHVybiByZXQ7CiB9CkBAIC00NTIsNyArNDUyLDcgQEAKIAlwcml2LT5uc3RhdGlvbnMtLTsKIAlwcml2LT5haC0+aXNfbW9uaXRvcmluZyA9IGZhbHNlOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAorCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCSJSZW1vdmVkIGEgbW9uaXRvciBpbnRlcmZhY2UgYXQgaWR4OiAlZCwgc3RhIGlkeDogJWRcbiIsCiAJCXByaXYtPm1vbl92aWZfaWR4LCBzdGFfaWR4KTsKIApAQCAtNTEyLDExICs1MTIsMTEgQEAKIAl9CiAKIAlpZiAoc3RhKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywKIAkJCSJBZGRlZCBhIHN0YXRpb24gZW50cnkgZm9yOiAlcE0gKGlkeDogJWQpXG4iLAogCQkJc3RhLT5hZGRyLCB0c3RhLnN0YV9pbmRleCk7CiAJfSBlbHNlIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAorCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAogCQkJIkFkZGVkIGEgc3RhdGlvbiBlbnRyeSBmb3IgVklGICVkIChpZHg6ICVkKVxuIiwKIAkJCWF2cC0+aW5kZXgsIHRzdGEuc3RhX2luZGV4KTsKIAl9CkBAIC01NTYsMTEgKzU1NiwxMSBAQAogCX0KIAogCWlmIChzdGEpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAorCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAogCQkJIlJlbW92ZWQgYSBzdGF0aW9uIGVudHJ5IGZvcjogJXBNIChpZHg6ICVkKVxuIiwKIAkJCXN0YS0+YWRkciwgc3RhX2lkeCk7CiAJfSBlbHNlIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAorCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLAogCQkJIlJlbW92ZWQgYSBzdGF0aW9uIGVudHJ5IGZvciBWSUYgJWQgKGlkeDogJWQpXG4iLAogCQkJYXZwLT5pbmRleCwgc3RhX2lkeCk7CiAJfQpAQCAtNjY1LDcgKzY2NSw3IEBACiAJYXRoOWtfaHRjX3NldHVwX3JhdGUocHJpdiwgc3RhLCAmdHJhdGUpOwogCXJldCA9IGF0aDlrX2h0Y19zZW5kX3JhdGVfY21kKHByaXYsICZ0cmF0ZSk7CiAJaWYgKCFyZXQpCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywKIAkJCSJVcGRhdGVkIHRhcmdldCBzdGE6ICVwTSwgcmF0ZSBjYXBzOiAweCVYXG4iLAogCQkJc3RhLT5hZGRyLCBiZTMyX3RvX2NwdSh0cmF0ZS5jYXBmbGFncykpOwogfQpAQCAtNjkyLDcgKzY5Miw3IEBACiAKIAlyZXQgPSBhdGg5a19odGNfc2VuZF9yYXRlX2NtZChwcml2LCAmdHJhdGUpOwogCWlmICghcmV0KQotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCQkiVXBkYXRlZCB0YXJnZXQgc3RhOiAlcE0sIHJhdGUgY2FwczogMHglWFxuIiwKIAkJCWJzc19jb25mLT5ic3NpZCwgYmUzMl90b19jcHUodHJhdGUuY2FwZmxhZ3MpKTsKIH0KQEAgLTcyMSwxMSArNzIxLDExIEBACiAKIAlXTUlfQ01EX0JVRihXTUlfVFhfQUdHUl9FTkFCTEVfQ01ESUQsICZhZ2dyKTsKIAlpZiAocmV0KQotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCQkiVW5hYmxlIHRvICVzIFRYIGFnZ3JlZ2F0aW9uIGZvciAoJXBNLCAlZClcbiIsCiAJCQkoYWdnci5hZ2dyX2VuYWJsZSkgPyAic3RhcnQiIDogInN0b3AiLCBzdGEtPmFkZHIsIHRpZCk7CiAJZWxzZQotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCQkiJXMgVFggYWdncmVnYXRpb24gZm9yICglcE0sICVkKVxuIiwKIAkJCShhZ2dyLmFnZ3JfZW5hYmxlKSA/ICJTdGFydGluZyIgOiAiU3RvcHBpbmciLAogCQkJc3RhLT5hZGRyLCB0aWQpOwpAQCAtNzg0LDcgKzc4NCw3IEBACiAJLyogTG9uZyBjYWxpYnJhdGlvbiBydW5zIGluZGVwZW5kZW50bHkgb2Ygc2hvcnQgY2FsaWJyYXRpb24uICovCiAJaWYgKCh0aW1lc3RhbXAgLSBjb21tb24tPmFuaS5sb25nY2FsX3RpbWVyKSA+PSBBVEhfTE9OR19DQUxJTlRFUlZBTCkgewogCQlsb25nY2FsID0gdHJ1ZTsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLCAibG9uZ2NhbCBAJWx1XG4iLCBqaWZmaWVzKTsKKwkJYXRoX2RiZyhjb21tb24sIEFOSSwgImxvbmdjYWwgQCVsdVxuIiwgamlmZmllcyk7CiAJCWNvbW1vbi0+YW5pLmxvbmdjYWxfdGltZXIgPSB0aW1lc3RhbXA7CiAJfQogCkBAIC03OTMsOCArNzkzLDcgQEAKIAkJaWYgKCh0aW1lc3RhbXAgLSBjb21tb24tPmFuaS5zaG9ydGNhbF90aW1lcikgPj0KIAkJICAgIHNob3J0X2NhbF9pbnRlcnZhbCkgewogCQkJc2hvcnRjYWwgPSB0cnVlOwotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5JLAotCQkJCSJzaG9ydGNhbCBAJWx1XG4iLCBqaWZmaWVzKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBTkksICJzaG9ydGNhbCBAJWx1XG4iLCBqaWZmaWVzKTsKIAkJCWNvbW1vbi0+YW5pLnNob3J0Y2FsX3RpbWVyID0gdGltZXN0YW1wOwogCQkJY29tbW9uLT5hbmkucmVzZXRjYWxfdGltZXIgPSB0aW1lc3RhbXA7CiAJCX0KQEAgLTgwOCw3ICs4MDcsOCBAQAogCX0KIAogCS8qIFZlcmlmeSB3aGV0aGVyIHdlIG11c3QgY2hlY2sgQU5JICovCi0JaWYgKCh0aW1lc3RhbXAgLSBjb21tb24tPmFuaS5jaGVja2FuaV90aW1lcikgPj0gQVRIX0FOSV9QT0xMSU5URVJWQUwpIHsKKwlpZiAoYWgtPmNvbmZpZy5lbmFibGVfYW5pICYmCisJICAgICh0aW1lc3RhbXAgLSBjb21tb24tPmFuaS5jaGVja2FuaV90aW1lcikgPj0gQVRIX0FOSV9QT0xMSU5URVJWQUwpIHsKIAkJYW5pZmxhZyA9IHRydWU7CiAJCWNvbW1vbi0+YW5pLmNoZWNrYW5pX3RpbWVyID0gdGltZXN0YW1wOwogCX0KQEAgLTgzOCw3ICs4MzgsNyBAQAogCSogc2hvcnQgY2FsaWJyYXRpb24gYW5kIGxvbmcgY2FsaWJyYXRpb24uCiAJKi8KIAljYWxfaW50ZXJ2YWwgPSBBVEhfTE9OR19DQUxJTlRFUlZBTDsKLQlpZiAocHJpdi0+YWgtPmNvbmZpZy5lbmFibGVfYW5pKQorCWlmIChhaC0+Y29uZmlnLmVuYWJsZV9hbmkpCiAJCWNhbF9pbnRlcnZhbCA9IG1pbihjYWxfaW50ZXJ2YWwsICh1MzIpQVRIX0FOSV9QT0xMSU5URVJWQUwpOwogCWlmICghY29tbW9uLT5hbmkuY2FsZG9uZSkKIAkJY2FsX2ludGVydmFsID0gbWluKGNhbF9pbnRlcnZhbCwgKHUzMilzaG9ydF9jYWxfaW50ZXJ2YWwpOwpAQCAtODY1LDcgKzg2NSw3IEBACiAJcGFkc2l6ZSA9IHBhZHBvcyAmIDM7CiAJaWYgKHBhZHNpemUgJiYgc2tiLT5sZW4gPiBwYWRwb3MpIHsKIAkJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgcGFkc2l6ZSkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfWE1JVCwgIk5vIHJvb20gZm9yIHBhZGRpbmdcbiIpOworCQkJYXRoX2RiZyhjb21tb24sIFhNSVQsICJObyByb29tIGZvciBwYWRkaW5nXG4iKTsKIAkJCWdvdG8gZmFpbF90eDsKIAkJfQogCQlza2JfcHVzaChza2IsIHBhZHNpemUpOwpAQCAtODc0LDEzICs4NzQsMTMgQEAKIAogCXNsb3QgPSBhdGg5a19odGNfdHhfZ2V0X3Nsb3QocHJpdik7CiAJaWYgKHNsb3QgPCAwKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsICJObyBmcmVlIFRYIHNsb3RcbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgWE1JVCwgIk5vIGZyZWUgVFggc2xvdFxuIik7CiAJCWdvdG8gZmFpbF90eDsKIAl9CiAKIAlyZXQgPSBhdGg5a19odGNfdHhfc3RhcnQocHJpdiwgc2tiLCBzbG90LCBmYWxzZSk7CiAJaWYgKHJldCAhPSAwKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsICJUeCBmYWlsZWRcbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgWE1JVCwgIlR4IGZhaWxlZFxuIik7CiAJCWdvdG8gY2xlYXJfc2xvdDsKIAl9CiAKQEAgLTkwOCw3ICs5MDgsNyBAQAogCiAJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAorCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCSJTdGFydGluZyBkcml2ZXIgd2l0aCBpbml0aWFsIGNoYW5uZWw6ICVkIE1IelxuIiwKIAkJY3VyY2hhbi0+Y2VudGVyX2ZyZXEpOwogCkBAIC05NDIsNyArOTQyLDcgQEAKIAogCXJldCA9IGF0aDlrX2h0Y191cGRhdGVfY2FwX3RhcmdldChwcml2LCAwKTsKIAlpZiAocmV0KQotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCQkiRmFpbGVkIHRvIHVwZGF0ZSBjYXBhYmlsaXR5IGluIHRhcmdldFxuIik7CiAKIAlwcml2LT5vcF9mbGFncyAmPSB+T1BfSU5WQUxJRDsKQEAgLTk1Nyw3ICs5NTcsNyBAQAogCW1vZF90aW1lcigmcHJpdi0+dHguY2xlYW51cF90aW1lciwKIAkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhBVEg5S19IVENfVFhfQ0xFQU5VUF9JTlRFUlZBTCkpOwogCi0JaWYgKGFoLT5idGNvZXhfaHcuc2NoZW1lID09IEFUSF9CVENPRVhfQ0ZHXzNXSVJFKSB7CisJaWYgKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSA9PSBBVEhfQlRDT0VYX0NGR18zV0lSRSkgewogCQlhdGg5a19od19idGNvZXhfc2V0X3dlaWdodChhaCwgQVJfQlRfQ09FWF9XR0hULAogCQkJCQkgICBBUl9TVE9NUF9MT1dfV0xBTl9XR0hUKTsKIAkJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZShhaCk7CkBAIC05NzksNyArOTc5LDcgQEAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAKIAlpZiAocHJpdi0+b3BfZmxhZ3MgJiBPUF9JTlZBTElEKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOWSwgIkRldmljZSBub3QgcHJlc2VudFxuIik7CisJCWF0aF9kYmcoY29tbW9uLCBBTlksICJEZXZpY2Ugbm90IHByZXNlbnRcbiIpOwogCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIAkJcmV0dXJuOwogCX0KQEAgLTEwMDksNyArMTAwOSw4IEBACiAKIAltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7CiAKLQlpZiAoYWgtPmJ0Y29leF9ody5lbmFibGVkKSB7CisJaWYgKGFoLT5idGNvZXhfaHcuZW5hYmxlZCAmJgorCSAgICBhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgIT0gQVRIX0JUQ09FWF9DRkdfTk9ORSkgewogCQlhdGg5a19od19idGNvZXhfZGlzYWJsZShhaCk7CiAJCWlmIChhaC0+YnRjb2V4X2h3LnNjaGVtZSA9PSBBVEhfQlRDT0VYX0NGR18zV0lSRSkKIAkJCWF0aF9odGNfY2FuY2VsX2J0Y29leF93b3JrKHByaXYpOwpAQCAtMTAyNiw3ICsxMDI3LDcgQEAKIAogCXByaXYtPm9wX2ZsYWdzIHw9IE9QX0lOVkFMSUQ7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJEcml2ZXIgaGFsdFxuIik7CisJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIkRyaXZlciBoYWx0XG4iKTsKIAltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKIH0KIApAQCAtMTExOSw4ICsxMTIwLDggQEAKIAkJYXRoOWtfaHRjX3N0YXJ0X2FuaShwcml2KTsKIAl9CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCi0JCSJBdHRhY2ggYSBWSUYgb2YgdHlwZTogJWQgYXQgaWR4OiAlZFxuIiwgdmlmLT50eXBlLCBhdnAtPmluZGV4KTsKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiQXR0YWNoIGEgVklGIG9mIHR5cGU6ICVkIGF0IGlkeDogJWRcbiIsCisJCXZpZi0+dHlwZSwgYXZwLT5pbmRleCk7CiAKIG91dDoKIAlhdGg5a19odGNfcHNfcmVzdG9yZShwcml2KTsKQEAgLTExNzYsNyArMTE3Nyw3IEBACiAJCQlhdGg5a19odGNfc3RvcF9hbmkocHJpdik7CiAJfQogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLCAiRGV0YWNoIEludGVyZmFjZSBhdCBpZHg6ICVkXG4iLCBhdnAtPmluZGV4KTsKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiRGV0YWNoIEludGVyZmFjZSBhdCBpZHg6ICVkXG4iLCBhdnAtPmluZGV4KTsKIAogCWF0aDlrX2h0Y19wc19yZXN0b3JlKHByaXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwpAQCAtMTIwMSw4ICsxMjAyLDcgQEAKIAkJbXV0ZXhfdW5sb2NrKCZwcml2LT5odGNfcG1fbG9jayk7CiAKIAkJaWYgKGVuYWJsZV9yYWRpbykgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkJCSJub3QtaWRsZTogZW5hYmxpbmcgcmFkaW9cbiIpOworCQkJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIm5vdC1pZGxlOiBlbmFibGluZyByYWRpb1xuIik7CiAJCQlhdGg5a19odGNfc2V0cG93ZXIocHJpdiwgQVRIOUtfUE1fQVdBS0UpOwogCQkJYXRoOWtfaHRjX3JhZGlvX2VuYWJsZShodyk7CiAJCX0KQEAgLTEyMjQsNyArMTIyNCw3IEBACiAJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY3VyY2hhbiA9IGh3LT5jb25mLmNoYW5uZWw7CiAJCWludCBwb3MgPSBjdXJjaGFuLT5od192YWx1ZTsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJTZXQgY2hhbm5lbDogJWQgTUh6XG4iLAorCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiU2V0IGNoYW5uZWw6ICVkIE1IelxuIiwKIAkJCWN1cmNoYW4tPmNlbnRlcl9mcmVxKTsKIAogCQlhdGg5a19jbW5fdXBkYXRlX2ljaGFubmVsKCZwcml2LT5haC0+Y2hhbm5lbHNbcG9zXSwKQEAgLTEyNjQsOCArMTI2NCw3IEBACiAJCX0KIAkJbXV0ZXhfdW5sb2NrKCZwcml2LT5odGNfcG1fbG9jayk7CiAKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkJImlkbGU6IGRpc2FibGluZyByYWRpb1xuIik7CisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJpZGxlOiBkaXNhYmxpbmcgcmFkaW9cbiIpOwogCQlhdGg5a19odGNfcmFkaW9fZGlzYWJsZShodyk7CiAJfQogCkBAIC0xMjk3LDcgKzEyOTYsNyBAQAogCSp0b3RhbF9mbGFncyAmPSBTVVBQT1JURURfRklMVEVSUzsKIAogCWlmIChwcml2LT5vcF9mbGFncyAmIE9QX0lOVkFMSUQpIHsKLQkJYXRoX2RiZyhhdGg5a19od19jb21tb24ocHJpdi0+YWgpLCBBVEhfREJHX0FOWSwKKwkJYXRoX2RiZyhhdGg5a19od19jb21tb24ocHJpdi0+YWgpLCBBTlksCiAJCQkiVW5hYmxlIHRvIGNvbmZpZ3VyZSBmaWx0ZXIgb24gaW52YWxpZCBzdGF0ZVxuIik7CiAJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwogCQlyZXR1cm47CkBAIC0xMzA4LDggKzEzMDcsOCBAQAogCXJmaWx0ID0gYXRoOWtfaHRjX2NhbGNyeGZpbHRlcihwcml2KTsKIAlhdGg5a19od19zZXRyeGZpbHRlcihwcml2LT5haCwgcmZpbHQpOwogCi0JYXRoX2RiZyhhdGg5a19od19jb21tb24ocHJpdi0+YWgpLCBBVEhfREJHX0NPTkZJRywKLQkJIlNldCBIVyBSWCBmaWx0ZXI6IDB4JXhcbiIsIHJmaWx0KTsKKwlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihwcml2LT5haCksIENPTkZJRywgIlNldCBIVyBSWCBmaWx0ZXI6IDB4JXhcbiIsCisJCXJmaWx0KTsKIAogCWF0aDlrX2h0Y19wc19yZXN0b3JlKHByaXYpOwogCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwpAQCAtMTM3Niw3ICsxMzc1LDcgQEAKIAogCXFudW0gPSBnZXRfaHdfcW51bShxdWV1ZSwgcHJpdi0+aHdxX21hcCk7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJYXRoX2RiZyhjb21tb24sIENPTkZJRywKIAkJIkNvbmZpZ3VyZSB0eCBbcXVldWUvaHdxXSBbJWQvJWRdLCAgYWlmczogJWQsIGN3X21pbjogJWQsIGN3X21heDogJWQsIHR4b3A6ICVkXG4iLAogCQlxdWV1ZSwgcW51bSwgcGFyYW1zLT5haWZzLCBwYXJhbXMtPmN3X21pbiwKIAkJcGFyYW1zLT5jd19tYXgsIHBhcmFtcy0+dHhvcCk7CkBAIC0xNDExLDcgKzE0MTAsNyBAQAogCQlyZXR1cm4gLUVOT1NQQzsKIAogCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJTZXQgSFcgS2V5XG4iKTsKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiU2V0IEhXIEtleVxuIik7CiAJYXRoOWtfaHRjX3BzX3dha2V1cChwcml2KTsKIAogCXN3aXRjaCAoY21kKSB7CkBAIC0xNDQ3LDggKzE0NDYsNyBAQAogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24ocHJpdi0+YWgpOwogCiAJYXRoOWtfaHdfd3JpdGVfYXNzb2NpZChwcml2LT5haCk7Ci0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkiQlNTSUQ6ICVwTSBhaWQ6IDB4JXhcbiIsCisJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIkJTU0lEOiAlcE0gYWlkOiAweCV4XG4iLAogCQljb21tb24tPmN1cmJzc2lkLCBjb21tb24tPmN1cmFpZCk7CiB9CiAKQEAgLTE0ODYsNyArMTQ4NCw3IEBACiAJYXRoOWtfaHRjX3BzX3dha2V1cChwcml2KTsKIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLCAiQlNTIENoYW5nZWQgQVNTT0MgJWRcbiIsCisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJCU1MgQ2hhbmdlZCBBU1NPQyAlZFxuIiwKIAkJCWJzc19jb25mLT5hc3NvYyk7CiAKIAkJYnNzX2NvbmYtPmFzc29jID8KQEAgLTE1MTEsOCArMTUwOSw4IEBACiAJfQogCiAJaWYgKChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpICYmIGJzc19jb25mLT5lbmFibGVfYmVhY29uKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJCSJCZWFjb24gZW5hYmxlZCBmb3IgQlNTOiAlcE1cbiIsIGJzc19jb25mLT5ic3NpZCk7CisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJCZWFjb24gZW5hYmxlZCBmb3IgQlNTOiAlcE1cbiIsCisJCQlic3NfY29uZi0+YnNzaWQpOwogCQlhdGg5a19odGNfc2V0X3RzZmFkanVzdChwcml2LCB2aWYpOwogCQlwcml2LT5vcF9mbGFncyB8PSBPUF9FTkFCTEVfQkVBQ09OOwogCQlhdGg5a19odGNfYmVhY29uX2NvbmZpZyhwcml2LCB2aWYpOwpAQCAtMTUyNCw3ICsxNTIyLDcgQEAKIAkJICogQVAvSUJTUyBpbnRlcmZhY2VzLgogCQkgKi8KIAkJaWYgKChwcml2LT5udW1fYXBfdmlmIDw9IDEpIHx8IHByaXYtPm51bV9pYnNzX3ZpZikgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAorCQkJYXRoX2RiZyhjb21tb24sIENPTkZJRywKIAkJCQkiQmVhY29uIGRpc2FibGVkIGZvciBCU1M6ICVwTVxuIiwKIAkJCQlic3NfY29uZi0+YnNzaWQpOwogCQkJcHJpdi0+b3BfZmxhZ3MgJj0gfk9QX0VOQUJMRV9CRUFDT047CkBAIC0xNTQyLDcgKzE1NDAsNyBAQAogCQkgICAgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCkpIHsKIAkJCXByaXYtPm9wX2ZsYWdzIHw9IE9QX1RTRl9SRVNFVDsKIAkJfQotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCQkiQmVhY29uIGludGVydmFsIGNoYW5nZWQgZm9yIEJTUzogJXBNXG4iLAogCQkJYnNzX2NvbmYtPmJzc2lkKTsKIAkJYXRoOWtfaHRjX2JlYWNvbl9jb25maWcocHJpdiwgdmlmKTsKQEAgLTE3MzIsOCArMTczMCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJIlNldCBiaXRyYXRlIG1hc2tzOiAweCV4LCAweCV4XG4iLAorCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJTZXQgYml0cmF0ZSBtYXNrczogMHgleCwgMHgleFxuIiwKIAkJbWFzay0+Y29udHJvbFtJRUVFODAyMTFfQkFORF8yR0haXS5sZWdhY3ksCiAJCW1hc2stPmNvbnRyb2xbSUVFRTgwMjExX0JBTkRfNUdIWl0ubGVnYWN5KTsKIG91dDoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X3R4cnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9odGNfZHJ2X3R4cnguYwppbmRleCAyZDgxYzcwLi4zZTQwYTY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHRjX2Rydl90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h0Y19kcnZfdHhyeC5jCkBAIC0zNTUsNyArMzU1LDcgQEAKIAkJdmlmX2lkeCA9IGF2cC0+aW5kZXg7CiAJfSBlbHNlIHsKIAkJaWYgKCFwcml2LT5haC0+aXNfbW9uaXRvcmluZykgewotCQkJYXRoX2RiZyhhdGg5a19od19jb21tb24ocHJpdi0+YWgpLCBBVEhfREJHX1hNSVQsCisJCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihwcml2LT5haCksIFhNSVQsCiAJCQkJIlZJRiBpcyBudWxsLCBidXQgbm8gbW9uaXRvciBpbnRlcmZhY2UgIVxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQpAQCAtNjIwLDggKzYyMCw3IEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVwaWRfcXVldWUtPmxvY2ssIGZsYWdzKTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsCi0JCSJObyBtYXRjaGluZyBwYWNrZXQgZm9yIGNvb2tpZTogJWQsIGVwaWQ6ICVkXG4iLAorCWF0aF9kYmcoY29tbW9uLCBYTUlULCAiTm8gbWF0Y2hpbmcgcGFja2V0IGZvciBjb29raWU6ICVkLCBlcGlkOiAlZFxuIiwKIAkJdHhzLT5jb29raWUsIGVwaWQpOwogCiAJcmV0dXJuIE5VTEw7CkBAIC03MDUsOCArNzA0LDcgQEAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLAogCQkgICAgICAgdHhfY3RsLT50aW1lc3RhbXAgKwogCQkgICAgICAgbXNlY3NfdG9famlmZmllcyhBVEg5S19IVENfVFhfVElNRU9VVF9JTlRFUlZBTCkpKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsCi0JCQkiRHJvcHBpbmcgYSBwYWNrZXQgZHVlIHRvIFRYIHRpbWVvdXRcbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgWE1JVCwgIkRyb3BwaW5nIGEgcGFja2V0IGR1ZSB0byBUWCB0aW1lb3V0XG4iKTsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC03NTMsNyArNzUxLDcgQEAKIAogCQlza2IgPSBhdGg5a19odGNfdHhfZ2V0X3BhY2tldChwcml2LCAmZXZlbnQtPnR4cyk7CiAJCWlmIChza2IpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsCisJCQlhdGhfZGJnKGNvbW1vbiwgWE1JVCwKIAkJCQkiRm91bmQgcGFja2V0IGZvciBjb29raWU6ICVkLCBlcGlkOiAlZFxuIiwKIAkJCQlldmVudC0+dHhzLmNvb2tpZSwKIAkJCQlNUyhldmVudC0+dHhzLnRzX3JhdGUsIEFUSDlLX0hUQ19UWFNUQVRfRVBJRCkpOwpAQCAtMTE2Nyw4ICsxMTY1LDcgQEAKIAlzcGluX3VubG9jaygmcHJpdi0+cngucnhidWZsb2NrKTsKIAogCWlmIChyeGJ1ZiA9PSBOVUxMKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOWSwKLQkJCSJObyBmcmVlIFJYIGJ1ZmZlclxuIik7CisJCWF0aF9kYmcoY29tbW9uLCBBTlksICJObyBmcmVlIFJYIGJ1ZmZlclxuIik7CiAJCWdvdG8gZXJyOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LW9wcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2h3LW9wcy5oCmluZGV4IGU3NGMyMzMuLmM0YWQwYjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody1vcHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHctb3BzLmgKQEAgLTIxMiw0ICsyMTIsMTMgQEAKIAlyZXR1cm4gYXRoOWtfaHdfcHJpdmF0ZV9vcHMoYWgpLT5mYXN0X2NoYW5fY2hhbmdlKGFoLCBjaGFuLAogCQkJCQkJCSAgaW5pX3JlbG9hZGVkKTsKIH0KKworc3RhdGljIGlubGluZSB2b2lkIGF0aDlrX2h3X3NldF9yYWRhcl9wYXJhbXMoc3RydWN0IGF0aF9odyAqYWgpCit7CisJaWYgKCFhdGg5a19od19wcml2YXRlX29wcyhhaCktPnNldF9yYWRhcl9wYXJhbXMpCisJCXJldHVybjsKKworCWF0aDlrX2h3X3ByaXZhdGVfb3BzKGFoKS0+c2V0X3JhZGFyX3BhcmFtcyhhaCwgJmFoLT5yYWRhcl9jb25mKTsKK30KKwogI2VuZGlmIC8qIEFUSDlLX0hXX09QU19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCmluZGV4IDg4NzNjNmUuLmVlNzc1OTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5jCkBAIC0xMzMsNyArMTMzLDcgQEAKIAkJdWRlbGF5KEFIX1RJTUVfUVVBTlRVTSk7CiAJfQogCi0JYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBBVEhfREJHX0FOWSwKKwlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFOWSwKIAkJInRpbWVvdXQgKCVkIHVzKSBvbiByZWcgMHgleDogMHglMDh4ICYgMHglMDh4ICE9IDB4JTA4eFxuIiwKIAkJdGltZW91dCwgcmVnLCBSRUdfUkVBRChhaCwgcmVnKSwgbWFzaywgdmFsKTsKIApAQCAtNDkxLDggKzQ5MSw3IEBACiAJaWYgKGVjb2RlICE9IDApCiAJCXJldHVybiBlY29kZTsKIAotCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19DT05GSUcsCi0JCSJFZXByb20gVkVSOiAlZCwgUkVWOiAlZFxuIiwKKwlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIENPTkZJRywgIkVlcHJvbSBWRVI6ICVkLCBSRVY6ICVkXG4iLAogCQlhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV92ZXIoYWgpLAogCQlhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbV9yZXYoYWgpKTsKIApAQCAtNTA0LDcgKzUwMyw3IEBACiAJCXJldHVybiBlY29kZTsKIAl9CiAKLQlpZiAoIUFSX1NSRVZfOTEwMChhaCkgJiYgIUFSX1NSRVZfOTM0MChhaCkpIHsKKwlpZiAoYWgtPmNvbmZpZy5lbmFibGVfYW5pKSB7CiAJCWF0aDlrX2h3X2FuaV9zZXR1cChhaCk7CiAJCWF0aDlrX2h3X2FuaV9pbml0KGFoKTsKIAl9CkBAIC01NjcsNyArNTY2LDcgQEAKIAkJfQogCX0KIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1JFU0VULCAic2VyaWFsaXplX3JlZ21vZGUgaXMgJWRcbiIsCisJYXRoX2RiZyhjb21tb24sIFJFU0VULCAic2VyaWFsaXplX3JlZ21vZGUgaXMgJWRcbiIsCiAJCWFoLT5jb25maWcuc2VyaWFsaXplX3JlZ21vZGUpOwogCiAJaWYgKEFSX1NSRVZfOTI4NShhaCkgfHwgQVJfU1JFVl85MjcxKGFoKSkKQEAgLTYxMCw2ICs2MDksMTAgQEAKIAlpZiAoIUFSX1NSRVZfOTMwMF8yMF9PUl9MQVRFUihhaCkpCiAJCWFoLT5hbmlfZnVuY3Rpb24gJj0gfkFUSDlLX0FOSV9NUkNfQ0NLOwogCisJLyogZGlzYWJsZSBBTkkgZm9yIDkzNDAgKi8KKwlpZiAoQVJfU1JFVl85MzQwKGFoKSkKKwkJYWgtPmNvbmZpZy5lbmFibGVfYW5pID0gZmFsc2U7CisKIAlhdGg5a19od19pbml0X21vZGVfcmVncyhhaCk7CiAKIAlpZiAoIWFoLT5pc19wY2lleHByZXNzKQpAQCAtOTU0LDggKzk1Nyw4IEBACiBzdGF0aWMgYm9vbCBhdGg5a19od19zZXRfZ2xvYmFsX3R4dGltZW91dChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHR1KQogewogCWlmICh0dSA+IDB4RkZGRikgewotCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfWE1JVCwKLQkJCSJiYWQgZ2xvYmFsIHR4IHRpbWVvdXQgJXVcbiIsIHR1KTsKKwkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBYTUlULCAiYmFkIGdsb2JhbCB0eCB0aW1lb3V0ICV1XG4iLAorCQkJdHUpOwogCQlhaC0+Z2xvYmFsdHh0aW1lb3V0ID0gKHUzMikgLTE7CiAJCXJldHVybiBmYWxzZTsKIAl9IGVsc2UgewpAQCAtOTc2LDcgKzk3OSw3IEBACiAJaW50IHJ4X2xhdCA9IDAsIHR4X2xhdCA9IDAsIGVpZnMgPSAwOwogCXUzMiByZWc7CiAKLQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfUkVTRVQsICJhaC0+bWlzY19tb2RlIDB4JXhcbiIsCisJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBSRVNFVCwgImFoLT5taXNjX21vZGUgMHgleFxuIiwKIAkJYWgtPm1pc2NfbW9kZSk7CiAKIAlpZiAoIWNoYW4pCkBAIC0xMjcxLDcgKzEyNzQsNyBAQAogCQkgICAgKG5wZW5kIHx8IHR5cGUgPT0gQVRIOUtfUkVTRVRfQ09MRCkpIHsKIAkJCWludCByZXNldF9lcnIgPSAwOwogCi0JCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfUkVTRVQsCisJCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIFJFU0VULAogCQkJCSJyZXNldCBNQUMgdmlhIGV4dGVybmFsIHJlc2V0XG4iKTsKIAogCQkJcmVzZXRfZXJyID0gYWgtPmV4dGVybmFsX3Jlc2V0KCk7CkBAIC0xMjk0LDggKzEyOTcsNyBAQAogCiAJUkVHX1dSSVRFKGFoLCBBUl9SVENfUkMsIDApOwogCWlmICghYXRoOWtfaHdfd2FpdChhaCwgQVJfUlRDX1JDLCBBUl9SVENfUkNfTSwgMCwgQUhfV0FJVF9USU1FT1VUKSkgewotCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfUkVTRVQsCi0JCQkiUlRDIHN0dWNrIGluIE1BQyByZXNldFxuIik7CisJCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgUkVTRVQsICJSVEMgc3R1Y2sgaW4gTUFDIHJlc2V0XG4iKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIApAQCAtMTM0MCw4ICsxMzQyLDcgQEAKIAkJCSAgIEFSX1JUQ19TVEFUVVNfTSwKIAkJCSAgIEFSX1JUQ19TVEFUVVNfT04sCiAJCQkgICBBSF9XQUlUX1RJTUVPVVQpKSB7Ci0JCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19SRVNFVCwKLQkJCSJSVEMgbm90IHdha2luZyB1cFxuIik7CisJCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgUkVTRVQsICJSVEMgbm90IHdha2luZyB1cFxuIik7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTEzNTAsNiArMTM1MSw3IEBACiAKIHN0YXRpYyBib29sIGF0aDlrX2h3X3NldF9yZXNldF9yZWcoc3RydWN0IGF0aF9odyAqYWgsIHUzMiB0eXBlKQogeworCWJvb2wgcmV0ID0gZmFsc2U7CiAKIAlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgewogCQlSRUdfV1JJVEUoYWgsIEFSX1dBLCBhaC0+V0FSZWdWYWwpOwpAQCAtMTM2MSwxMyArMTM2MywyMCBAQAogCiAJc3dpdGNoICh0eXBlKSB7CiAJY2FzZSBBVEg5S19SRVNFVF9QT1dFUl9PTjoKLQkJcmV0dXJuIGF0aDlrX2h3X3NldF9yZXNldF9wb3dlcl9vbihhaCk7CisJCXJldCA9IGF0aDlrX2h3X3NldF9yZXNldF9wb3dlcl9vbihhaCk7CisJCWJyZWFrOwogCWNhc2UgQVRIOUtfUkVTRVRfV0FSTToKIAljYXNlIEFUSDlLX1JFU0VUX0NPTEQ6Ci0JCXJldHVybiBhdGg5a19od19zZXRfcmVzZXQoYWgsIHR5cGUpOworCQlyZXQgPSBhdGg5a19od19zZXRfcmVzZXQoYWgsIHR5cGUpOworCQlicmVhazsKIAlkZWZhdWx0OgotCQlyZXR1cm4gZmFsc2U7CisJCWJyZWFrOwogCX0KKworCWlmIChhaC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSkKKwkJUkVHX1dSSVRFKGFoLCBBUl9SVENfS0VFUF9BV0FLRSwgMHgyKTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBib29sIGF0aDlrX2h3X2NoaXBfcmVzZXQoc3RydWN0IGF0aF9odyAqYWgsCkBAIC0xNDA2LDcgKzE0MTUsNyBAQAogCiAJZm9yIChxbnVtID0gMDsgcW51bSA8IEFSX05VTV9RQ1U7IHFudW0rKykgewogCQlpZiAoYXRoOWtfaHdfbnVtdHhwZW5kaW5nKGFoLCBxbnVtKSkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUVVFVUUsCisJCQlhdGhfZGJnKGNvbW1vbiwgUVVFVUUsCiAJCQkJIlRyYW5zbWl0IGZyYW1lcyBwZW5kaW5nIG9uIHF1ZXVlICVkXG4iLCBxbnVtKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtMTUwNiw2ICsxNTE1LDcgQEAKIAkJICAgc3RydWN0IGF0aDlrX2h3X2NhbF9kYXRhICpjYWxkYXRhLCBib29sIGJDaGFubmVsQ2hhbmdlKQogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXN0cnVjdCBhdGg5a19od19tY2kgKm1jaV9odyA9ICZhaC0+YnRjb2V4X2h3Lm1jaTsKIAl1MzIgc2F2ZUxlZFN0YXRlOwogCXN0cnVjdCBhdGg5a19jaGFubmVsICpjdXJjaGFuID0gYWgtPmN1cmNoYW47CiAJdTMyIHNhdmVEZWZBbnRlbm5hOwpAQCAtMTUxMyw2ICsxNTIzLDUyIEBACiAJdTY0IHRzZiA9IDA7CiAJaW50IGksIHI7CiAJYm9vbCBhbGxvd19mYnMgPSBmYWxzZTsKKwlib29sIG1jaSA9ICEhKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKTsKKwlib29sIHNhdmVfZnVsbHNsZWVwID0gYWgtPmNoaXBfZnVsbHNsZWVwOworCisJaWYgKG1jaSkgeworCisJCWFyOTAwM19tY2lfMmc1Z19jaGFuZ2VkKGFoLCBJU19DSEFOXzJHSFooY2hhbikpOworCisJCWlmIChtY2lfaHctPmJ0X3N0YXRlID09IE1DSV9CVF9DQUxfU1RBUlQpIHsKKwkJCXUzMiBwYXlsb2FkWzRdID0gezAsIDAsIDAsIDB9OworCisJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIHN0b3AgcnggZm9yIEJUIENBTFxuIik7CisKKwkJCW1jaV9ody0+YnRfc3RhdGUgPSBNQ0lfQlRfQ0FMOworCisJCQkvKgorCQkJICogTUNJIEZJWDogZGlzYWJsZSBtY2kgaW50ZXJydXB0IGhlcmUuIFRoaXMgaXMgdG8gYXZvaWQKKwkJCSAqIFNXX01TR19ET05FIG9yIFJYX01TRyBiaXRzIHRvIHRyaWdnZXIgTUNJX0lOVCBhbmQKKwkJCSAqIGxlYWQgdG8gbWNpX2ludHIgcmVlbnRyeS4KKwkJCSAqLworCisJCQlhcjkwMDNfbWNpX2Rpc2FibGVfaW50ZXJydXB0KGFoKTsKKworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgInNlbmQgV0xBTl9DQUxfR1JBTlRcbiIpOworCQkJTUNJX0dQTV9TRVRfQ0FMX1RZUEUocGF5bG9hZCwgTUNJX0dQTV9XTEFOX0NBTF9HUkFOVCk7CisJCQlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShhaCwgTUNJX0dQTSwgMCwgcGF5bG9hZCwKKwkJCQkJCTE2LCB0cnVlLCBmYWxzZSk7CisKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJcbk1DSSBCVCBpcyBjYWxpYnJhdGluZ1xuIik7CisKKwkJCS8qIFdhaXQgQlQgY2FsaWJyYXRpb24gdG8gYmUgY29tcGxldGVkIGZvciAyNW1zICovCisKKwkJCWlmIChhcjkwMDNfbWNpX3dhaXRfZm9yX2dwbShhaCwgTUNJX0dQTV9CVF9DQUxfRE9ORSwKKwkJCQkJCQkJICAwLCAyNTAwMCkpCisJCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkJIk1DSSBnb3QgQlRfQ0FMX0RPTkVcbiIpOworCQkJZWxzZQorCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJCSJNQ0kgIyMjIEJUIGNhbCB0YWtlcyB0byBsb25nLCBmb3JjZSBidF9zdGF0ZSB0byBiZSBidF9hd2FrZVxuIik7CisJCQltY2lfaHctPmJ0X3N0YXRlID0gTUNJX0JUX0FXQUtFOworCQkJLyogTUNJIEZJWDogZW5hYmxlIG1jaSBpbnRlcnJ1cHQgaGVyZSAqLworCQkJYXI5MDAzX21jaV9lbmFibGVfaW50ZXJydXB0KGFoKTsKKworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisKIAogCWlmICghYXRoOWtfaHdfc2V0cG93ZXIoYWgsIEFUSDlLX1BNX0FXQUtFKSkKIAkJcmV0dXJuIC1FSU87CkBAIC0xNTUwLDEyICsxNjA2LDI5IEBACiAJCWlmIChhdGg5a19od19jaGFubmVsX2NoYW5nZShhaCwgY2hhbikpIHsKIAkJCWF0aDlrX2h3X2xvYWRuZihhaCwgYWgtPmN1cmNoYW4pOwogCQkJYXRoOWtfaHdfc3RhcnRfbmZjYWwoYWgsIHRydWUpOworCQkJaWYgKG1jaSAmJiBtY2lfaHctPnJlYWR5KQorCQkJCWFyOTAwM19tY2lfMmc1Z19zd2l0Y2goYWgsIHRydWUpOworCiAJCQlpZiAoQVJfU1JFVl85MjcxKGFoKSkKIAkJCQlhcjkwMDJfaHdfbG9hZF9hbmlfcmVnKGFoLCBjaGFuKTsKIAkJCXJldHVybiAwOwogCQl9CiAJfQogCisJaWYgKG1jaSkgeworCQlhcjkwMDNfbWNpX2Rpc2FibGVfaW50ZXJydXB0KGFoKTsKKworCQlpZiAobWNpX2h3LT5yZWFkeSAmJiAhc2F2ZV9mdWxsc2xlZXApIHsKKwkJCWFyOTAwM19tY2lfbXV0ZV9idChhaCk7CisJCQl1ZGVsYXkoMjApOworCQkJUkVHX1dSSVRFKGFoLCBBUl9CVENPRVhfQ1RSTCwgMCk7CisJCX0KKworCQltY2lfaHctPmJ0X3N0YXRlID0gTUNJX0JUX1NMRUVQOworCQltY2lfaHctPnJlYWR5ID0gZmFsc2U7CisJfQorCisKIAlzYXZlRGVmQW50ZW5uYSA9IFJFR19SRUFEKGFoLCBBUl9ERUZfQU5URU5OQSk7CiAJaWYgKHNhdmVEZWZBbnRlbm5hID09IDApCiAJCXNhdmVEZWZBbnRlbm5hID0gMTsKQEAgLTE2MTEsNiArMTY4NCw5IEBACiAJaWYgKHIpCiAJCXJldHVybiByOwogCisJaWYgKG1jaSkKKwkJYXI5MDAzX21jaV9yZXNldChhaCwgZmFsc2UsIElTX0NIQU5fMkdIWihjaGFuKSwgc2F2ZV9mdWxsc2xlZXApOworCiAJLyoKIAkgKiBTb21lIEFSOTF4eCBTb0MgZGV2aWNlcyBmcmVxdWVudGx5IGZhaWwgdG8gYWNjZXB0IFRTRiB3cml0ZXMKIAkgKiByaWdodCBhZnRlciB0aGUgY2hpcCByZXNldC4gV2hlbiB0aGF0IGhhcHBlbnMsIHdyaXRlIGEgbmV3CkBAIC0xNzI4LDYgKzE4MDQsNTQgQEAKIAlhdGg5a19od19sb2FkbmYoYWgsIGNoYW4pOwogCWF0aDlrX2h3X3N0YXJ0X25mY2FsKGFoLCB0cnVlKTsKIAorCWlmIChtY2kgJiYgbWNpX2h3LT5yZWFkeSkgeworCisJCWlmIChJU19DSEFOXzJHSFooY2hhbikgJiYKKwkJICAgIChtY2lfaHctPmJ0X3N0YXRlID09IE1DSV9CVF9TTEVFUCkpIHsKKworCQkJaWYgKGFyOTAwM19tY2lfY2hlY2tfaW50KGFoLAorCQkJICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVCkgfHwKKwkJCSAgICBhcjkwMDNfbWNpX2NoZWNrX2ludChhaCwKKwkJCSAgICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRVFfV0FLRSkpIHsKKworCQkJCS8qCisJCQkJICogQlQgaXMgc2xlZXBpbmcuIENoZWNrIGlmIEJUIHdha2VzIHVwIGR1cmluZworCQkJCSAqIFdMQU4gY2FsaWJyYXRpb24uIElmIEJUIHdha2VzIHVwIGR1cmluZworCQkJCSAqIFdMQU4gY2FsaWJyYXRpb24sIG5lZWQgdG8gZ28gdGhyb3VnaCBhbGwKKwkJCQkgKiBtZXNzYWdlIGV4Y2hhbmdlcyBhZ2FpbiBhbmQgcmVjYWwuCisJCQkJICovCisKKwkJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJCQkiTUNJIEJUIHdha2VzIHVwIGR1cmluZyBXTEFOIGNhbGlicmF0aW9uXG4iKTsKKworCQkJCVJFR19XUklURShhaCwgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXLAorCQkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVCB8CisJCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0UpOworCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgc2VuZCBSRU1PVEVfUkVTRVRcbiIpOworCQkJCWFyOTAwM19tY2lfcmVtb3RlX3Jlc2V0KGFoLCB0cnVlKTsKKwkJCQlhcjkwMDNfbWNpX3NlbmRfc3lzX3dha2luZyhhaCwgdHJ1ZSk7CisJCQkJdWRlbGF5KDEpOworCQkJCWlmIChJU19DSEFOXzJHSFooY2hhbikpCisJCQkJCWFyOTAwM19tY2lfc2VuZF9sbmFfdHJhbnNmZXIoYWgsIHRydWUpOworCisJCQkJbWNpX2h3LT5idF9zdGF0ZSA9IE1DSV9CVF9BV0FLRTsKKworCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgcmUtY2FsXG4iKTsKKworCQkJCWlmIChjYWxkYXRhKSB7CisJCQkJCWNhbGRhdGEtPmRvbmVfdHhpcWNhbF9vbmNlID0gZmFsc2U7CisJCQkJCWNhbGRhdGEtPmRvbmVfdHhjbGNhbF9vbmNlID0gZmFsc2U7CisJCQkJCWNhbGRhdGEtPnJ0dF9oaXN0Lm51bV9yZWFkaW5ncyA9IDA7CisJCQkJfQorCisJCQkJaWYgKCFhdGg5a19od19pbml0X2NhbChhaCwgY2hhbikpCisJCQkJCXJldHVybiAtRUlPOworCisJCQl9CisJCX0KKwkJYXI5MDAzX21jaV9lbmFibGVfaW50ZXJydXB0KGFoKTsKKwl9CisKIAlFTkFCTEVfUkVHV1JJVEVfQlVGRkVSKGFoKTsKIAogCWF0aDlrX2h3X3Jlc3RvcmVfY2hhaW5tYXNrKGFoKTsKQEAgLTE3NDIsMTQgKzE4NjYsMTQgQEAKIAkJdTMyIG1hc2s7CiAJCW1hc2sgPSBSRUdfUkVBRChhaCwgQVJfQ0ZHKTsKIAkJaWYgKG1hc2sgJiAoQVJfQ0ZHX1NXUkIgfCBBUl9DRkdfU1dUQiB8IEFSX0NGR19TV1JHKSkgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUkVTRVQsCi0JCQkJIkNGRyBCeXRlIFN3YXAgU2V0IDB4JXhcbiIsIG1hc2spOworCQkJYXRoX2RiZyhjb21tb24sIFJFU0VULCAiQ0ZHIEJ5dGUgU3dhcCBTZXQgMHgleFxuIiwKKwkJCQltYXNrKTsKIAkJfSBlbHNlIHsKIAkJCW1hc2sgPQogCQkJCUlOSVRfQ09ORklHX1NUQVRVUyB8IEFSX0NGR19TV1JCIHwgQVJfQ0ZHX1NXVEI7CiAJCQlSRUdfV1JJVEUoYWgsIEFSX0NGRywgbWFzayk7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19SRVNFVCwKLQkJCQkiU2V0dGluZyBDRkcgMHgleFxuIiwgUkVHX1JFQUQoYWgsIEFSX0NGRykpOworCQkJYXRoX2RiZyhjb21tb24sIFJFU0VULCAiU2V0dGluZyBDRkcgMHgleFxuIiwKKwkJCQlSRUdfUkVBRChhaCwgQVJfQ0ZHKSk7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoY29tbW9uLT5idXNfb3BzLT5hdGhfYnVzX3R5cGUgPT0gQVRIX1VTQikgewpAQCAtMTc2Nyw5ICsxODkxLDI1IEBACiAjZW5kaWYKIAl9CiAKLQlpZiAoYWgtPmJ0Y29leF9ody5lbmFibGVkKQorCWlmIChhaC0+YnRjb2V4X2h3LmVuYWJsZWQgJiYKKwkgICAgYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpICE9IEFUSF9CVENPRVhfQ0ZHX05PTkUpCiAJCWF0aDlrX2h3X2J0Y29leF9lbmFibGUoYWgpOwogCisJaWYgKG1jaSAmJiBtY2lfaHctPnJlYWR5KSB7CisJCS8qCisJCSAqIGNoZWNrIEJUIHN0YXRlIGFnYWluIHRvIG1ha2UKKwkJICogc3VyZSBpdCdzIG5vdCBjaGFuZ2VkLgorCQkgKi8KKworCQlhcjkwMDNfbWNpX3N5bmNfYnRfc3RhdGUoYWgpOworCQlhcjkwMDNfbWNpXzJnNWdfc3dpdGNoKGFoLCB0cnVlKTsKKworCQlpZiAoKG1jaV9ody0+YnRfc3RhdGUgPT0gTUNJX0JUX0FXQUtFKSAmJgorCQkJCShtY2lfaHctPnF1ZXJ5X2J0ID09IHRydWUpKSB7CisJCQltY2lfaHctPm5lZWRfZmx1c2hfYnRpbmZvID0gdHJ1ZTsKKwkJfQorCX0KKwogCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7CiAJCWFyOTAwM19od19iYl93YXRjaGRvZ19jb25maWcoYWgpOwogCkBAIC0xOTM0LDYgKzIwNzQsNyBAQAogYm9vbCBhdGg5a19od19zZXRwb3dlcihzdHJ1Y3QgYXRoX2h3ICphaCwgZW51bSBhdGg5a19wb3dlcl9tb2RlIG1vZGUpCiB7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJc3RydWN0IGF0aDlrX2h3X21jaSAqbWNpID0gJmFoLT5idGNvZXhfaHcubWNpOwogCWludCBzdGF0dXMgPSB0cnVlLCBzZXRDaGlwID0gdHJ1ZTsKIAlzdGF0aWMgY29uc3QgY2hhciAqbW9kZXNbXSA9IHsKIAkJIkFXQUtFIiwKQEAgLTE5NDUsMTggKzIwODYsNDEgQEAKIAlpZiAoYWgtPnBvd2VyX21vZGUgPT0gbW9kZSkKIAkJcmV0dXJuIHN0YXR1czsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1JFU0VULCAiJXMgLT4gJXNcbiIsCisJYXRoX2RiZyhjb21tb24sIFJFU0VULCAiJXMgLT4gJXNcbiIsCiAJCW1vZGVzW2FoLT5wb3dlcl9tb2RlXSwgbW9kZXNbbW9kZV0pOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBBVEg5S19QTV9BV0FLRToKIAkJc3RhdHVzID0gYXRoOWtfaHdfc2V0X3Bvd2VyX2F3YWtlKGFoLCBzZXRDaGlwKTsKKworCQlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpCisJCQlSRUdfV1JJVEUoYWgsIEFSX1JUQ19LRUVQX0FXQUtFLCAweDIpOworCiAJCWJyZWFrOwogCWNhc2UgQVRIOUtfUE1fRlVMTF9TTEVFUDoKKworCQlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpIHsKKwkJCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfRU5BQkxFLCBOVUxMKSAmJgorCQkJCShtY2ktPmJ0X3N0YXRlICE9IE1DSV9CVF9TTEVFUCkgJiYKKwkJCQkhbWNpLT5oYWx0ZWRfYnRfZ3BtKSB7CisJCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkJIk1DSSBoYWx0IEJUIEdQTSAoZnVsbF9zbGVlcClcbiIpOworCQkJCWFyOTAwM19tY2lfc2VuZF9jb2V4X2hhbHRfYnRfZ3BtKGFoLAorCQkJCQkJCQkgdHJ1ZSwgdHJ1ZSk7CisJCQl9CisKKwkJCW1jaS0+cmVhZHkgPSBmYWxzZTsKKwkJCVJFR19XUklURShhaCwgQVJfUlRDX0tFRVBfQVdBS0UsIDB4Mik7CisJCX0KKwogCQlhdGg5a19zZXRfcG93ZXJfc2xlZXAoYWgsIHNldENoaXApOwogCQlhaC0+Y2hpcF9mdWxsc2xlZXAgPSB0cnVlOwogCQlicmVhazsKIAljYXNlIEFUSDlLX1BNX05FVFdPUktfU0xFRVA6CisKKwkJaWYgKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKQorCQkJUkVHX1dSSVRFKGFoLCBBUl9SVENfS0VFUF9BV0FLRSwgMHgyKTsKKwogCQlhdGg5a19zZXRfcG93ZXJfbmV0d29ya19zbGVlcChhaCwgc2V0Q2hpcCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CkBAIC0yMDA2LDkgKzIxNzAsOCBAQAogCQkJQVJfVEJUVF9USU1FUl9FTiB8IEFSX0RCQV9USU1FUl9FTiB8IEFSX1NXQkFfVElNRVJfRU47CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQVRIX0RCR19CRUFDT04sCi0JCQkiJXM6IHVuc3VwcG9ydGVkIG9wbW9kZTogJWRcbiIsCi0JCQlfX2Z1bmNfXywgYWgtPm9wbW9kZSk7CisJCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgQkVBQ09OLAorCQkJIiVzOiB1bnN1cHBvcnRlZCBvcG1vZGU6ICVkXG4iLCBfX2Z1bmNfXywgYWgtPm9wbW9kZSk7CiAJCXJldHVybjsKIAkJYnJlYWs7CiAJfQpAQCAtMjA1OSwxMCArMjIyMiwxMCBAQAogCWVsc2UKIAkJbmV4dFRidHQgPSBicy0+YnNfbmV4dHRidHQ7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19CRUFDT04sICJuZXh0IERUSU0gJWRcbiIsIGJzLT5ic19uZXh0ZHRpbSk7Ci0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQkVBQ09OLCAibmV4dCBiZWFjb24gJWRcbiIsIG5leHRUYnR0KTsKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19CRUFDT04sICJiZWFjb24gcGVyaW9kICVkXG4iLCBiZWFjb25pbnR2YWwpOwotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0JFQUNPTiwgIkRUSU0gcGVyaW9kICVkXG4iLCBkdGltcGVyaW9kKTsKKwlhdGhfZGJnKGNvbW1vbiwgQkVBQ09OLCAibmV4dCBEVElNICVkXG4iLCBicy0+YnNfbmV4dGR0aW0pOworCWF0aF9kYmcoY29tbW9uLCBCRUFDT04sICJuZXh0IGJlYWNvbiAlZFxuIiwgbmV4dFRidHQpOworCWF0aF9kYmcoY29tbW9uLCBCRUFDT04sICJiZWFjb24gcGVyaW9kICVkXG4iLCBiZWFjb25pbnR2YWwpOworCWF0aF9kYmcoY29tbW9uLCBCRUFDT04sICJEVElNIHBlcmlvZCAlZFxuIiwgZHRpbXBlcmlvZCk7CiAKIAlFTkFCTEVfUkVHV1JJVEVfQlVGRkVSKGFoKTsKIApAQCAtMjEwOSw2ICsyMjcyLDMwIEBACiAJCXJldHVybiBjaGlwX2NoYWlubWFzazsKIH0KIAorLyoqCisgKiBhdGg5a19od19kZnNfdGVzdGVkIC0gY2hlY2tzIGlmIERGUyBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCB1c2VkIGNoaXBzZXQKKyAqIEBhaDogdGhlIGF0aGVyb3MgaGFyZHdhcmUgZGF0YSBzdHJ1Y3R1cmUKKyAqCisgKiBXZSBlbmFibGUgREZTIHN1cHBvcnQgdXBzdHJlYW0gb24gY2hpcHNldHMgd2hpY2ggaGF2ZSBwYXNzZWQgYSBzZXJpZXMKKyAqIG9mIHRlc3RzLiBUaGUgdGVzdGluZyByZXF1aXJlbWVudHMgYXJlIGdvaW5nIHRvIGJlIGRvY3VtZW50ZWQuIERlc2lyZWQKKyAqIHRlc3QgcmVxdWlyZW1lbnRzIGFyZSBkb2N1bWVudGVkIGF0OgorICoKKyAqIGh0dHA6Ly93aXJlbGVzcy5rZXJuZWwub3JnL2VuL3VzZXJzL0RyaXZlcnMvYXRoOWsvZGZzCisgKgorICogT25jZSBhIG5ldyBjaGlwc2V0IGdldHMgcHJvcGVybHkgdGVzdGVkIGFuIGluZGl2aWR1YWwgY29tbWl0IGNhbiBiZSB1c2VkCisgKiB0byBkb2N1bWVudCB0aGUgdGVzdGluZyBmb3IgREZTIGZvciB0aGF0IGNoaXBzZXQuCisgKi8KK3N0YXRpYyBib29sIGF0aDlrX2h3X2Rmc190ZXN0ZWQoc3RydWN0IGF0aF9odyAqYWgpCit7CisKKwlzd2l0Y2ggKGFoLT5od192ZXJzaW9uLm1hY1ZlcnNpb24pIHsKKwkvKiBBUjk1ODAgd2lsbCBsaWtlbHkgYmUgb3VyIGZpcnN0IHRhcmdldCB0byBnZXQgdGVzdGluZyBvbiAqLworCWNhc2UgQVJfU1JFVl9WRVJTSU9OXzk1ODA6CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKwogaW50IGF0aDlrX2h3X2ZpbGxfY2FwX2luZm8oc3RydWN0IGF0aF9odyAqYWgpCiB7CiAJc3RydWN0IGF0aDlrX2h3X2NhcGFiaWxpdGllcyAqcENhcCA9ICZhaC0+Y2FwczsKQEAgLTIxMzAsOCArMjMxNyw4IEBACiAJCQlyZWd1bGF0b3J5LT5jdXJyZW50X3JkICs9IDU7CiAJCWVsc2UgaWYgKHJlZ3VsYXRvcnktPmN1cnJlbnRfcmQgPT0gMHg0MSkKIAkJCXJlZ3VsYXRvcnktPmN1cnJlbnRfcmQgPSAweDQzOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19SRUdVTEFUT1JZLAotCQkJInJlZ2RvbWFpbiBtYXBwZWQgdG8gMHgleFxuIiwgcmVndWxhdG9yeS0+Y3VycmVudF9yZCk7CisJCWF0aF9kYmcoY29tbW9uLCBSRUdVTEFUT1JZLCAicmVnZG9tYWluIG1hcHBlZCB0byAweCV4XG4iLAorCQkJcmVndWxhdG9yeS0+Y3VycmVudF9yZCk7CiAJfQogCiAJZWV2YWwgPSBhaC0+ZWVwX29wcy0+Z2V0X2VlcHJvbShhaCwgRUVQX09QX01PREUpOwpAQCAtMjE0OSw2ICsyMzM2LDggQEAKIAogCWlmIChBUl9TUkVWXzk0ODUoYWgpIHx8IEFSX1NSRVZfOTI4NShhaCkgfHwgQVJfU1JFVl85MzMwKGFoKSkKIAkJY2hpcF9jaGFpbm1hc2sgPSAxOworCWVsc2UgaWYgKEFSX1NSRVZfOTQ2MihhaCkpCisJCWNoaXBfY2hhaW5tYXNrID0gMzsKIAllbHNlIGlmICghQVJfU1JFVl85MjgwXzIwX09SX0xBVEVSKGFoKSkKIAkJY2hpcF9jaGFpbm1hc2sgPSA3OwogCWVsc2UgaWYgKCFBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpIHx8IEFSX1NSRVZfOTM0MChhaCkpCkBAIC0yMjA1LDEyICsyMzk0LDEwIEBACiAJZWxzZQogCQlwQ2FwLT5udW1fZ3Bpb19waW5zID0gQVJfTlVNX0dQSU87CiAKLQlpZiAoQVJfU1JFVl85MTYwXzEwX09SX0xBVEVSKGFoKSB8fCBBUl9TUkVWXzkxMDAoYWgpKSB7Ci0JCXBDYXAtPmh3X2NhcHMgfD0gQVRIOUtfSFdfQ0FQX0NTVDsKKwlpZiAoQVJfU1JFVl85MTYwXzEwX09SX0xBVEVSKGFoKSB8fCBBUl9TUkVWXzkxMDAoYWgpKQogCQlwQ2FwLT5ydHNfYWdncl9saW1pdCA9IEFUSF9BTVBEVV9MSU1JVF9NQVg7Ci0JfSBlbHNlIHsKKwllbHNlCiAJCXBDYXAtPnJ0c19hZ2dyX2xpbWl0ID0gKDggKiAxMDI0KTsKLQl9CiAKICNpZiBkZWZpbmVkKENPTkZJR19SRktJTEwpIHx8IGRlZmluZWQoQ09ORklHX1JGS0lMTF9NT0RVTEUpCiAJYWgtPnJmc2lsZW50ID0gYWgtPmVlcF9vcHMtPmdldF9lZXByb20oYWgsIEVFUF9SRl9TSUxFTlQpOwpAQCAtMjIzNCw3ICsyNDIxLDkgQEAKIAkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfNEtCX1NQTElUVFJBTlM7CiAKIAlpZiAoY29tbW9uLT5idGNvZXhfZW5hYmxlZCkgewotCQlpZiAoQVJfU1JFVl85MzAwXzIwX09SX0xBVEVSKGFoKSkgeworCQlpZiAoQVJfU1JFVl85NDYyKGFoKSkKKwkJCWJ0Y29leF9ody0+c2NoZW1lID0gQVRIX0JUQ09FWF9DRkdfTUNJOworCQllbHNlIGlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7CiAJCQlidGNvZXhfaHctPnNjaGVtZSA9IEFUSF9CVENPRVhfQ0ZHXzNXSVJFOwogCQkJYnRjb2V4X2h3LT5idGFjdGl2ZV9ncGlvID0gQVRIX0JUQUNUSVZFX0dQSU9fOTMwMDsKIAkJCWJ0Y29leF9ody0+d2xhbmFjdGl2ZV9ncGlvID0gQVRIX1dMQU5BQ1RJVkVfR1BJT185MzAwOwpAQCAtMjMxOCw2ICsyNTA3LDkgQEAKIAkJcENhcC0+cGNpZV9sY3Jfb2Zmc2V0ID0gMHg4MDsKIAl9CiAKKwlpZiAoYXRoOWtfaHdfZGZzX3Rlc3RlZChhaCkpCisJCXBDYXAtPmh3X2NhcHMgfD0gQVRIOUtfSFdfQ0FQX0RGUzsKKwogCXR4X2NoYWlubWFzayA9IHBDYXAtPnR4X2NoYWlubWFzazsKIAlyeF9jaGFpbm1hc2sgPSBwQ2FwLT5yeF9jaGFpbm1hc2s7CiAJd2hpbGUgKHR4X2NoYWlubWFzayB8fCByeF9jaGFpbm1hc2spIHsKQEAgLTIzMzIsMTEgKzI1MjQsMTEgQEAKIAogCWlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKSB7CiAJCWFoLT5lbmFibGVkX2NhbHMgfD0gVFhfSVFfQ0FMOwotCQlpZiAoIUFSX1NSRVZfOTMzMChhaCkpCisJCWlmIChBUl9TUkVWXzk0ODVfT1JfTEFURVIoYWgpKQogCQkJYWgtPmVuYWJsZWRfY2FscyB8PSBUWF9JUV9PTl9BR0NfQ0FMOwogCX0KIAlpZiAoQVJfU1JFVl85NDYyKGFoKSkKLQkJcENhcC0+aHdfY2FwcyB8PSBBVEg5S19IV19DQVBfUlRUOworCQlwQ2FwLT5od19jYXBzIHw9IEFUSDlLX0hXX0NBUF9SVFQgfCBBVEg5S19IV19DQVBfTUNJOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNTg0LDcgKzI3NzYsNyBAQAogCXN0cnVjdCBhdGg5a19jaGFubmVsICpjaGFuID0gYWgtPmN1cmNoYW47CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gY2hhbi0+Y2hhbjsKIAotCXJlZy0+cG93ZXJfbGltaXQgPSBtaW5fdChpbnQsIGxpbWl0LCBNQVhfUkFURV9QT1dFUik7CisJcmVnLT5wb3dlcl9saW1pdCA9IG1pbl90KHUzMiwgbGltaXQsIE1BWF9SQVRFX1BPV0VSKTsKIAlpZiAodGVzdCkKIAkJY2hhbm5lbC0+bWF4X3Bvd2VyID0gTUFYX1JBVEVfUE9XRVIgLyAyOwogCkBAIC0yNjUxLDcgKzI4NDMsNyBAQAogewogCWlmICghYXRoOWtfaHdfd2FpdChhaCwgQVJfU0xQMzJfTU9ERSwgQVJfU0xQMzJfVFNGX1dSSVRFX1NUQVRVUywgMCwKIAkJCSAgIEFIX1RTRl9XUklURV9USU1FT1VUKSkKLQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBBVEhfREJHX1JFU0VULAorCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIFJFU0VULAogCQkJIkFSX1NMUDMyX1RTRl9XUklURV9TVEFUVVMgbGltaXQgZXhjZWVkZWRcbiIpOwogCiAJUkVHX1dSSVRFKGFoLCBBUl9SRVNFVF9UU0YsIEFSX1JFU0VUX1RTRl9PTkNFKTsKQEAgLTI3NzYsNyArMjk2OCw3IEBACiAKIAl0aW1lcl9uZXh0ID0gdHNmICsgdHJpZ190aW1lb3V0OwogCi0JYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBBVEhfREJHX0hXVElNRVIsCisJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBIV1RJTUVSLAogCQkiY3VycmVudCB0c2YgJXggcGVyaW9kICV4IHRpbWVyX25leHQgJXhcbiIsCiAJCXRzZiwgdGltZXJfcGVyaW9kLCB0aW1lcl9uZXh0KTsKIApAQCAtMjg2NSw4ICszMDU3LDggQEAKIAkJaW5kZXggPSByaWdodG1vc3RfaW5kZXgodGltZXJfdGFibGUsICZ0aHJlc2hfbWFzayk7CiAJCXRpbWVyID0gdGltZXJfdGFibGUtPnRpbWVyc1tpbmRleF07CiAJCUJVR19PTighdGltZXIpOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19IV1RJTUVSLAotCQkJIlRTRiBvdmVyZmxvdyBmb3IgR2VuIHRpbWVyICVkXG4iLCBpbmRleCk7CisJCWF0aF9kYmcoY29tbW9uLCBIV1RJTUVSLCAiVFNGIG92ZXJmbG93IGZvciBHZW4gdGltZXIgJWRcbiIsCisJCQlpbmRleCk7CiAJCXRpbWVyLT5vdmVyZmxvdyh0aW1lci0+YXJnKTsKIAl9CiAKQEAgLTI4NzQsNyArMzA2Niw3IEBACiAJCWluZGV4ID0gcmlnaHRtb3N0X2luZGV4KHRpbWVyX3RhYmxlLCAmdHJpZ2dlcl9tYXNrKTsKIAkJdGltZXIgPSB0aW1lcl90YWJsZS0+dGltZXJzW2luZGV4XTsKIAkJQlVHX09OKCF0aW1lcik7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0hXVElNRVIsCisJCWF0aF9kYmcoY29tbW9uLCBIV1RJTUVSLAogCQkJIkdlbiB0aW1lclslZF0gdHJpZ2dlclxuIiwgaW5kZXgpOwogCQl0aW1lci0+dHJpZ2dlcih0aW1lci0+YXJnKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCmluZGV4IGYzODliM2MuLjZhMjkwMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9ody5oCkBAIC01OSw5ICs1OSw2IEBACiAjZGVmaW5lIEFUOTI4NV9DT0VYM1dJUkVfU0FfU1VCU1lTSUQJMHgzMGFhCiAjZGVmaW5lIEFUOTI4NV9DT0VYM1dJUkVfREFfU1VCU1lTSUQJMHgzMGFiCiAKLSNkZWZpbmUgQVI5MzAwX05VTV9CVF9XRUlHSFRTICAgNAotI2RlZmluZSBBUjkzMDBfTlVNX1dMQU5fV0VJR0hUUyA0Ci0KICNkZWZpbmUgQVRIX0FNUERVX0xJTUlUX01BWCAgICAgICAgKDY0ICogMTAyNCAtIDEpCiAKICNkZWZpbmUJQVRIX0RFRkFVTFRfTk9JU0VfRkxPT1IgLTk1CkBAIC0xMjksNiArMTI2LDE2IEBACiAjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19SWF9DTEVBUl9FWFRFUk5BTCAgNAogI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfTUFDX05FVFdPUktfTEVEICAgIDUKICNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01BQ19QT1dFUl9MRUQgICAgICA2CisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfV0xBTl9EQVRBICAgICAgMHgxNgorI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfTUNJX1dMQU5fQ0xLICAgICAgIDB4MTcKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX01DSV9CVF9EQVRBICAgICAgICAweDE4CisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19NQ0lfQlRfQ0xLICAgICAgICAgMHgxOQorI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfV0xfSU5fVFggICAgICAgICAgIDB4MTQKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX1dMX0lOX1JYICAgICAgICAgICAweDEzCisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19CVF9JTl9UWCAgICAgICAgICAgOQorI2RlZmluZSBBUl9HUElPX09VVFBVVF9NVVhfQVNfQlRfSU5fUlggICAgICAgICAgIDgKKyNkZWZpbmUgQVJfR1BJT19PVVRQVVRfTVVYX0FTX1JVQ0tVU19TVFJPQkUgICAgICAweDFkCisjZGVmaW5lIEFSX0dQSU9fT1VUUFVUX01VWF9BU19SVUNLVVNfREFUQSAgICAgICAgMHgxZQogCiAjZGVmaW5lIEFSX0dQSU9EX01BU0sgICAgICAgICAgICAgICAweDAwMDAxRkZGCiAjZGVmaW5lIEFSX0dQSU9fQklUKF9ncGlvKSAgICAgICAgICAoMSA8PCAoX2dwaW8pKQpAQCAtMTg5LDIwICsxOTYsMjUgQEAKIGVudW0gYXRoOWtfaHdfY2FwcyB7CiAJQVRIOUtfSFdfQ0FQX0hUICAgICAgICAgICAgICAgICAgICAgICAgID0gQklUKDApLAogCUFUSDlLX0hXX0NBUF9SRlNJTEVOVCAgICAgICAgICAgICAgICAgICA9IEJJVCgxKSwKLQlBVEg5S19IV19DQVBfQ1NUICAgICAgICAgICAgICAgICAgICAgICAgPSBCSVQoMiksCi0JQVRIOUtfSFdfQ0FQX0FVVE9TTEVFUCAgICAgICAgICAgICAgICAgID0gQklUKDQpLAotCUFUSDlLX0hXX0NBUF80S0JfU1BMSVRUUkFOUyAgICAgICAgICAgICA9IEJJVCg1KSwKLQlBVEg5S19IV19DQVBfRURNQQkJCT0gQklUKDYpLAotCUFUSDlLX0hXX0NBUF9SQUNfU1VQUE9SVEVECQk9IEJJVCg3KSwKLQlBVEg5S19IV19DQVBfTERQQwkJCT0gQklUKDgpLAotCUFUSDlLX0hXX0NBUF9GQVNUQ0xPQ0sJCQk9IEJJVCg5KSwKLQlBVEg5S19IV19DQVBfU0dJXzIwCQkJPSBCSVQoMTApLAotCUFUSDlLX0hXX0NBUF9QQVBSRAkJCT0gQklUKDExKSwKLQlBVEg5S19IV19DQVBfQU5UX0RJVl9DT01CCQk9IEJJVCgxMiksCi0JQVRIOUtfSFdfQ0FQXzJHSFoJCQk9IEJJVCgxMyksCi0JQVRIOUtfSFdfQ0FQXzVHSFoJCQk9IEJJVCgxNCksCi0JQVRIOUtfSFdfQ0FQX0FQTQkJCT0gQklUKDE1KSwKLQlBVEg5S19IV19DQVBfUlRUCQkJPSBCSVQoMTYpLAorCUFUSDlLX0hXX0NBUF9BVVRPU0xFRVAgICAgICAgICAgICAgICAgICA9IEJJVCgyKSwKKwlBVEg5S19IV19DQVBfNEtCX1NQTElUVFJBTlMgICAgICAgICAgICAgPSBCSVQoMyksCisJQVRIOUtfSFdfQ0FQX0VETUEJCQk9IEJJVCg0KSwKKwlBVEg5S19IV19DQVBfUkFDX1NVUFBPUlRFRAkJPSBCSVQoNSksCisJQVRIOUtfSFdfQ0FQX0xEUEMJCQk9IEJJVCg2KSwKKwlBVEg5S19IV19DQVBfRkFTVENMT0NLCQkJPSBCSVQoNyksCisJQVRIOUtfSFdfQ0FQX1NHSV8yMAkJCT0gQklUKDgpLAorCUFUSDlLX0hXX0NBUF9QQVBSRAkJCT0gQklUKDkpLAorCUFUSDlLX0hXX0NBUF9BTlRfRElWX0NPTUIJCT0gQklUKDEwKSwKKwlBVEg5S19IV19DQVBfMkdIWgkJCT0gQklUKDExKSwKKwlBVEg5S19IV19DQVBfNUdIWgkJCT0gQklUKDEyKSwKKwlBVEg5S19IV19DQVBfQVBNCQkJPSBCSVQoMTMpLAorCUFUSDlLX0hXX0NBUF9SVFQJCQk9IEJJVCgxNCksCisjaWZkZWYgQ09ORklHX0FUSDlLX0JUQ09FWF9TVVBQT1JUCisJQVRIOUtfSFdfQ0FQX01DSQkJCT0gQklUKDE1KSwKKyNlbHNlCisJQVRIOUtfSFdfQ0FQX01DSQkJCT0gMCwKKyNlbmRpZgorCUFUSDlLX0hXX0NBUF9ERlMJCQk9IEJJVCgxNiksCiB9OwogCiBzdHJ1Y3QgYXRoOWtfaHdfY2FwYWJpbGl0aWVzIHsKQEAgLTI2OCw2ICsyODAsNyBAQAogCUFUSDlLX0lOVF9UWCA9IDB4MDAwMDAwNDAsCiAJQVRIOUtfSU5UX1RYREVTQyA9IDB4MDAwMDAwODAsCiAJQVRIOUtfSU5UX1RJTV9USU1FUiA9IDB4MDAwMDAxMDAsCisJQVRIOUtfSU5UX01DSSA9IDB4MDAwMDAyMDAsCiAJQVRIOUtfSU5UX0JCX1dBVENIRE9HID0gMHgwMDAwMDQwMCwKIAlBVEg5S19JTlRfVFhVUk4gPSAweDAwMDAwODAwLAogCUFUSDlLX0lOVF9NSUIgPSAweDAwMDAxMDAwLApAQCAtNDE5LDYgKzQzMiwxNjEgQEAKIAlBVEg5S19SWF9RVUVVRV9NQVgsCiB9OwogCitlbnVtIG1jaV9tZXNzYWdlX2hlYWRlciB7CQkvKiBsZW5ndGggb2YgcGF5bG9hZCAqLworCU1DSV9MTkFfQ1RSTCAgICAgPSAweDEwLCAgICAgICAgLyogbGVuID0gMCAqLworCU1DSV9DT05UX05BQ0sgICAgPSAweDIwLCAgICAgICAgLyogbGVuID0gMCAqLworCU1DSV9DT05UX0lORk8gICAgPSAweDMwLCAgICAgICAgLyogbGVuID0gNCAqLworCU1DSV9DT05UX1JTVCAgICAgPSAweDQwLCAgICAgICAgLyogbGVuID0gMCAqLworCU1DSV9TQ0hEX0lORk8gICAgPSAweDUwLCAgICAgICAgLyogbGVuID0gMTYgKi8KKwlNQ0lfQ1BVX0lOVCAgICAgID0gMHg2MCwgICAgICAgIC8qIGxlbiA9IDQgKi8KKwlNQ0lfU1lTX1dBS0lORyAgID0gMHg3MCwgICAgICAgIC8qIGxlbiA9IDAgKi8KKwlNQ0lfR1BNICAgICAgICAgID0gMHg4MCwgICAgICAgIC8qIGxlbiA9IDE2ICovCisJTUNJX0xOQV9JTkZPICAgICA9IDB4OTAsICAgICAgICAvKiBsZW4gPSAxICovCisJTUNJX0xOQV9TVEFURSAgICA9IDB4OTQsCisJTUNJX0xOQV9UQUtFICAgICA9IDB4OTgsCisJTUNJX0xOQV9UUkFOUyAgICA9IDB4OWMsCisJTUNJX1NZU19TTEVFUElORyA9IDB4YTAsICAgICAgICAvKiBsZW4gPSAwICovCisJTUNJX1JFUV9XQUtFICAgICA9IDB4YzAsICAgICAgICAvKiBsZW4gPSAwICovCisJTUNJX0RFQlVHXzE2ICAgICA9IDB4ZmUsICAgICAgICAvKiBsZW4gPSAyICovCisJTUNJX1JFTU9URV9SRVNFVCA9IDB4ZmYgICAgICAgICAvKiBsZW4gPSAxNiAqLworfTsKKworZW51bSBhdGhfbWNpX2dwbV9jb2V4X3Byb2ZpbGVfdHlwZSB7CisJTUNJX0dQTV9DT0VYX1BST0ZJTEVfVU5LTk9XTiwKKwlNQ0lfR1BNX0NPRVhfUFJPRklMRV9SRkNPTU0sCisJTUNJX0dQTV9DT0VYX1BST0ZJTEVfQTJEUCwKKwlNQ0lfR1BNX0NPRVhfUFJPRklMRV9ISUQsCisJTUNJX0dQTV9DT0VYX1BST0ZJTEVfQk5FUCwKKwlNQ0lfR1BNX0NPRVhfUFJPRklMRV9WT0lDRSwKKwlNQ0lfR1BNX0NPRVhfUFJPRklMRV9NQVgKK307CisKKy8qIE1DSSBHUE0vQ29leCBvcGNvZGUvdHlwZSBkZWZpbml0aW9ucyAqLworZW51bSB7CisJTUNJX0dQTV9DT0VYX1dfR1BNX1BBWUxPQUQgICAgICA9IDEsCisJTUNJX0dQTV9DT0VYX0JfR1BNX1RZUEUgICAgICAgICA9IDQsCisJTUNJX0dQTV9DT0VYX0JfR1BNX09QQ09ERSAgICAgICA9IDUsCisJLyogTUNJX0dQTV9XTEFOX0NBTF9SRVEsIE1DSV9HUE1fV0xBTl9DQUxfRE9ORSAqLworCU1DSV9HUE1fV0xBTl9DQUxfV19TRVFVRU5DRSAgICAgPSAyLAorCisJLyogTUNJX0dQTV9DT0VYX1ZFUlNJT05fUVVFUlkgKi8KKwkvKiBNQ0lfR1BNX0NPRVhfVkVSU0lPTl9SRVNQT05TRSAqLworCU1DSV9HUE1fQ09FWF9CX01BSk9SX1ZFUlNJT04gICAgPSA2LAorCU1DSV9HUE1fQ09FWF9CX01JTk9SX1ZFUlNJT04gICAgPSA3LAorCS8qIE1DSV9HUE1fQ09FWF9TVEFUVVNfUVVFUlkgKi8KKwlNQ0lfR1BNX0NPRVhfQl9CVF9CSVRNQVAgICAgICAgID0gNiwKKwlNQ0lfR1BNX0NPRVhfQl9XTEFOX0JJVE1BUCAgICAgID0gNywKKwkvKiBNQ0lfR1BNX0NPRVhfSEFMVF9CVF9HUE0gKi8KKwlNQ0lfR1BNX0NPRVhfQl9IQUxUX1NUQVRFICAgICAgID0gNiwKKwkvKiBNQ0lfR1BNX0NPRVhfV0xBTl9DSEFOTkVMUyAqLworCU1DSV9HUE1fQ09FWF9CX0NIQU5ORUxfTUFQICAgICAgPSA2LAorCS8qIE1DSV9HUE1fQ09FWF9CVF9QUk9GSUxFX0lORk8gKi8KKwlNQ0lfR1BNX0NPRVhfQl9QUk9GSUxFX1RZUEUgICAgID0gNiwKKwlNQ0lfR1BNX0NPRVhfQl9QUk9GSUxFX0xJTktJRCAgID0gNywKKwlNQ0lfR1BNX0NPRVhfQl9QUk9GSUxFX1NUQVRFICAgID0gOCwKKwlNQ0lfR1BNX0NPRVhfQl9QUk9GSUxFX1JPTEUgICAgID0gOSwKKwlNQ0lfR1BNX0NPRVhfQl9QUk9GSUxFX1JBVEUgICAgID0gMTAsCisJTUNJX0dQTV9DT0VYX0JfUFJPRklMRV9WT1RZUEUgICA9IDExLAorCU1DSV9HUE1fQ09FWF9IX1BST0ZJTEVfVCAgICAgICAgPSAxMiwKKwlNQ0lfR1BNX0NPRVhfQl9QUk9GSUxFX1cgICAgICAgID0gMTQsCisJTUNJX0dQTV9DT0VYX0JfUFJPRklMRV9BICAgICAgICA9IDE1LAorCS8qIE1DSV9HUE1fQ09FWF9CVF9TVEFUVVNfVVBEQVRFICovCisJTUNJX0dQTV9DT0VYX0JfU1RBVFVTX1RZUEUgICAgICA9IDYsCisJTUNJX0dQTV9DT0VYX0JfU1RBVFVTX0xJTktJRCAgICA9IDcsCisJTUNJX0dQTV9DT0VYX0JfU1RBVFVTX1NUQVRFICAgICA9IDgsCisJLyogTUNJX0dQTV9DT0VYX0JUX1VQREFURV9GTEFHUyAqLworCU1DSV9HUE1fQ09FWF9XX0JUX0ZMQUdTICAgICAgICAgPSA2LAorCU1DSV9HUE1fQ09FWF9CX0JUX0ZMQUdTX09QICAgICAgPSAxMAorfTsKKworZW51bSBtY2lfZ3BtX3N1YnR5cGUgeworCU1DSV9HUE1fQlRfQ0FMX1JFUSAgICAgID0gMCwKKwlNQ0lfR1BNX0JUX0NBTF9HUkFOVCAgICA9IDEsCisJTUNJX0dQTV9CVF9DQUxfRE9ORSAgICAgPSAyLAorCU1DSV9HUE1fV0xBTl9DQUxfUkVRICAgID0gMywKKwlNQ0lfR1BNX1dMQU5fQ0FMX0dSQU5UICA9IDQsCisJTUNJX0dQTV9XTEFOX0NBTF9ET05FICAgPSA1LAorCU1DSV9HUE1fQ09FWF9BR0VOVCAgICAgID0gMHgwYywKKwlNQ0lfR1BNX1JTVkRfUEFUVEVSTiAgICA9IDB4ZmUsCisJTUNJX0dQTV9SU1ZEX1BBVFRFUk4zMiAgPSAweGZlZmVmZWZlLAorCU1DSV9HUE1fQlRfREVCVUcgICAgICAgID0gMHhmZgorfTsKKworZW51bSBtY2lfYnRfc3RhdGUgeworCU1DSV9CVF9TTEVFUCwKKwlNQ0lfQlRfQVdBS0UsCisJTUNJX0JUX0NBTF9TVEFSVCwKKwlNQ0lfQlRfQ0FMCit9OworCisvKiBUeXBlIG9mIHN0YXRlIHF1ZXJ5ICovCitlbnVtIG1jaV9zdGF0ZV90eXBlIHsKKwlNQ0lfU1RBVEVfRU5BQkxFLAorCU1DSV9TVEFURV9JTklUX0dQTV9PRkZTRVQsCisJTUNJX1NUQVRFX05FWFRfR1BNX09GRlNFVCwKKwlNQ0lfU1RBVEVfTEFTVF9HUE1fT0ZGU0VULAorCU1DSV9TVEFURV9CVCwKKwlNQ0lfU1RBVEVfU0VUX0JUX1NMRUVQLAorCU1DSV9TVEFURV9TRVRfQlRfQVdBS0UsCisJTUNJX1NUQVRFX1NFVF9CVF9DQUxfU1RBUlQsCisJTUNJX1NUQVRFX1NFVF9CVF9DQUwsCisJTUNJX1NUQVRFX0xBU1RfU0NIRF9NU0dfT0ZGU0VULAorCU1DSV9TVEFURV9SRU1PVEVfU0xFRVAsCisJTUNJX1NUQVRFX0NPTlRfUlNTSV9QT1dFUiwKKwlNQ0lfU1RBVEVfQ09OVF9QUklPUklUWSwKKwlNQ0lfU1RBVEVfQ09OVF9UWFJYLAorCU1DSV9TVEFURV9SRVNFVF9SRVFfV0FLRSwKKwlNQ0lfU1RBVEVfU0VORF9XTEFOX0NPRVhfVkVSU0lPTiwKKwlNQ0lfU1RBVEVfU0VUX0JUX0NPRVhfVkVSU0lPTiwKKwlNQ0lfU1RBVEVfU0VORF9XTEFOX0NIQU5ORUxTLAorCU1DSV9TVEFURV9TRU5EX1ZFUlNJT05fUVVFUlksCisJTUNJX1NUQVRFX1NFTkRfU1RBVFVTX1FVRVJZLAorCU1DSV9TVEFURV9ORUVEX0ZMVVNIX0JUX0lORk8sCisJTUNJX1NUQVRFX1NFVF9DT05DVVJfVFhfUFJJLAorCU1DSV9TVEFURV9SRUNPVkVSX1JYLAorCU1DSV9TVEFURV9ORUVEX0ZUUF9TVE9NUCwKKwlNQ0lfU1RBVEVfTkVFRF9UVU5JTkcsCisJTUNJX1NUQVRFX0RFQlVHLAorCU1DSV9TVEFURV9NQVgKK307CisKK2VudW0gbWNpX2dwbV9jb2V4X29wY29kZSB7CisJTUNJX0dQTV9DT0VYX1ZFUlNJT05fUVVFUlksCisJTUNJX0dQTV9DT0VYX1ZFUlNJT05fUkVTUE9OU0UsCisJTUNJX0dQTV9DT0VYX1NUQVRVU19RVUVSWSwKKwlNQ0lfR1BNX0NPRVhfSEFMVF9CVF9HUE0sCisJTUNJX0dQTV9DT0VYX1dMQU5fQ0hBTk5FTFMsCisJTUNJX0dQTV9DT0VYX0JUX1BST0ZJTEVfSU5GTywKKwlNQ0lfR1BNX0NPRVhfQlRfU1RBVFVTX1VQREFURSwKKwlNQ0lfR1BNX0NPRVhfQlRfVVBEQVRFX0ZMQUdTCit9OworCisjZGVmaW5lIE1DSV9HUE1fTk9NT1JFICAwCisjZGVmaW5lIE1DSV9HUE1fTU9SRSAgICAxCisjZGVmaW5lIE1DSV9HUE1fSU5WQUxJRCAweGZmZmZmZmZmCisKKyNkZWZpbmUgTUNJX0dQTV9SRUNZQ0xFKF9wX2dwbSkJZG8gewkJCSAgXAorCSooKCh1MzIgKilfcF9ncG0pICsgTUNJX0dQTV9DT0VYX1dfR1BNX1BBWUxPQUQpID0gXAorCQkJCU1DSV9HUE1fUlNWRF9QQVRURVJOMzI7ICAgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQ0lfR1BNX1RZUEUoX3BfZ3BtKQlcCisJKCooKCh1OCAqKShfcF9ncG0pKSArIE1DSV9HUE1fQ09FWF9CX0dQTV9UWVBFKSAmIDB4ZmYpCisKKyNkZWZpbmUgTUNJX0dQTV9PUENPREUoX3BfZ3BtKQlcCisJKCooKCh1OCAqKShfcF9ncG0pKSArIE1DSV9HUE1fQ09FWF9CX0dQTV9PUENPREUpICYgMHhmZikKKworI2RlZmluZSBNQ0lfR1BNX1NFVF9DQUxfVFlQRShfcF9ncG0sIF9jYWxfdHlwZSkJZG8gewkJCSAgIFwKKwkqKCgodTggKikoX3BfZ3BtKSkgKyBNQ0lfR1BNX0NPRVhfQl9HUE1fVFlQRSkgPSAoX2NhbF90eXBlKSAmIDB4ZmY7XAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQ0lfR1BNX1NFVF9UWVBFX09QQ09ERShfcF9ncG0sIF90eXBlLCBfb3Bjb2RlKSBkbyB7CQkgICBcCisJKigoKHU4ICopKF9wX2dwbSkpICsgTUNJX0dQTV9DT0VYX0JfR1BNX1RZUEUpID0gKF90eXBlKSAmIDB4ZmY7CSAgIFwKKwkqKCgodTggKikoX3BfZ3BtKSkgKyBNQ0lfR1BNX0NPRVhfQl9HUE1fT1BDT0RFKSA9IChfb3Bjb2RlKSAmIDB4ZmY7XAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBNQ0lfR1BNX0lTX0NBTF9UWVBFKF90eXBlKSAoKF90eXBlKSA8PSBNQ0lfR1BNX1dMQU5fQ0FMX0RPTkUpCisKIHN0cnVjdCBhdGg5a19iZWFjb25fc3RhdGUgewogCXUzMiBic19uZXh0dGJ0dDsKIAl1MzIgYnNfbmV4dGR0aW07CkBAIC03OTEsOCArOTU5LDYgQEAKIAogCS8qIEJsdWV0b290aCBjb2V4aXN0YW5jZSAqLwogCXN0cnVjdCBhdGhfYnRjb2V4X2h3IGJ0Y29leF9odzsKLQl1MzIgYnRfY29leF9idF93ZWlnaHRbQVI5MzAwX05VTV9CVF9XRUlHSFRTXTsKLQl1MzIgYnRfY29leF93bGFuX3dlaWdodFtBUjkzMDBfTlVNX1dMQU5fV0VJR0hUU107CiAKIAl1MzIgaW50cl90eHFzOwogCXU4IHR4Y2hhaW5tYXNrOwpAQCAtODUwLDcgKzEwMTYsNyBAQAogCXUzMiB0c19wYWRkcl9zdGFydDsKIAl1MzIgdHNfcGFkZHJfZW5kOwogCXUxNiB0c190YWlsOwotCXU4IHRzX3NpemU7CisJdTE2IHRzX3NpemU7CiAKIAl1MzIgYmJfd2F0Y2hkb2dfbGFzdF9zdGF0dXM7CiAJdTMyIGJiX3dhdGNoZG9nX3RpbWVvdXRfbXM7IC8qIGluIG1zLCAwIHRvIGRpc2FibGUgKi8KQEAgLTk0OCw3ICsxMTE0LDYgQEAKIHZvaWQgYXRoOWtfaHdfc2V0X3R4cG93ZXJsaW1pdChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGxpbWl0LCBib29sIHRlc3QpOwogdm9pZCBhdGg5a19od19zZXRvcG1vZGUoc3RydWN0IGF0aF9odyAqYWgpOwogdm9pZCBhdGg5a19od19zZXRtY2FzdGZpbHRlcihzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGZpbHRlcjAsIHUzMiBmaWx0ZXIxKTsKLXZvaWQgYXRoOWtfaHdfc2V0YnNzaWRtYXNrKHN0cnVjdCBhdGhfaHcgKmFoKTsKIHZvaWQgYXRoOWtfaHdfd3JpdGVfYXNzb2NpZChzdHJ1Y3QgYXRoX2h3ICphaCk7CiB1MzIgYXRoOWtfaHdfZ2V0dHNmMzIoc3RydWN0IGF0aF9odyAqYWgpOwogdTY0IGF0aDlrX2h3X2dldHRzZjY0KHN0cnVjdCBhdGhfaHcgKmFoKTsKQEAgLTEwNDEsNiArMTIwNiw0MiBAQAogdm9pZCBhdGg5a19od19wcm9jX21pYl9ldmVudChzdHJ1Y3QgYXRoX2h3ICphaCk7CiB2b2lkIGF0aDlrX2h3X2FuaV9tb25pdG9yKHN0cnVjdCBhdGhfaHcgKmFoLCBzdHJ1Y3QgYXRoOWtfY2hhbm5lbCAqY2hhbik7CiAKK2Jvb2wgYXI5MDAzX21jaV9zZW5kX21lc3NhZ2Uoc3RydWN0IGF0aF9odyAqYWgsIHU4IGhlYWRlciwgdTMyIGZsYWcsCisJCQkgICAgIHUzMiAqcGF5bG9hZCwgdTggbGVuLCBib29sIHdhaXRfZG9uZSwKKwkJCSAgICAgYm9vbCBjaGVja19idCk7Cit2b2lkIGFyOTAwM19tY2lfbXV0ZV9idChzdHJ1Y3QgYXRoX2h3ICphaCk7Cit1MzIgYXI5MDAzX21jaV9zdGF0ZShzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIHN0YXRlX3R5cGUsIHUzMiAqcF9kYXRhKTsKK3ZvaWQgYXI5MDAzX21jaV9zZXR1cChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGdwbV9hZGRyLCB2b2lkICpncG1fYnVmLAorCQkgICAgICB1MTYgbGVuLCB1MzIgc2NoZWRfYWRkcik7Cit2b2lkIGFyOTAwM19tY2lfY2xlYW51cChzdHJ1Y3QgYXRoX2h3ICphaCk7Cit2b2lkIGFyOTAwM19tY2lfc2VuZF9jb2V4X2hhbHRfYnRfZ3BtKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIGhhbHQsCisJCQkJICAgICAgYm9vbCB3YWl0X2RvbmUpOwordTMyIGFyOTAwM19tY2lfd2FpdF9mb3JfZ3BtKHN0cnVjdCBhdGhfaHcgKmFoLCB1OCBncG1fdHlwZSwKKwkJCSAgICB1OCBncG1fb3Bjb2RlLCBpbnQgdGltZV9vdXQpOwordm9pZCBhcjkwMDNfbWNpXzJnNWdfY2hhbmdlZChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCBpc18yZyk7Cit2b2lkIGFyOTAwM19tY2lfZGlzYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGF0aF9odyAqYWgpOwordm9pZCBhcjkwMDNfbWNpX2VuYWJsZV9pbnRlcnJ1cHQoc3RydWN0IGF0aF9odyAqYWgpOwordm9pZCBhcjkwMDNfbWNpXzJnNWdfc3dpdGNoKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSk7Cit2b2lkIGFyOTAwM19tY2lfcmVzZXQoc3RydWN0IGF0aF9odyAqYWgsIGJvb2wgZW5faW50LCBib29sIGlzXzJnLAorCQkgICAgICBib29sIGlzX2Z1bGxfc2xlZXApOworYm9vbCBhcjkwMDNfbWNpX2NoZWNrX2ludChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyIGludHMpOwordm9pZCBhcjkwMDNfbWNpX3JlbW90ZV9yZXNldChzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpOwordm9pZCBhcjkwMDNfbWNpX3NlbmRfc3lzX3dha2luZyhzdHJ1Y3QgYXRoX2h3ICphaCwgYm9vbCB3YWl0X2RvbmUpOwordm9pZCBhcjkwMDNfbWNpX3NlbmRfbG5hX3RyYW5zZmVyKHN0cnVjdCBhdGhfaHcgKmFoLCBib29sIHdhaXRfZG9uZSk7Cit2b2lkIGFyOTAwM19tY2lfc3luY19idF9zdGF0ZShzdHJ1Y3QgYXRoX2h3ICphaCk7Cit2b2lkIGFyOTAwM19tY2lfZ2V0X2ludGVycnVwdChzdHJ1Y3QgYXRoX2h3ICphaCwgdTMyICpyYXdfaW50ciwKKwkJCSAgICAgIHUzMiAqcnhfbXNnX2ludHIpOworCisjaWZkZWYgQ09ORklHX0FUSDlLX0JUQ09FWF9TVVBQT1JUCitzdGF0aWMgaW5saW5lIGVudW0gYXRoX2J0Y29leF9zY2hlbWUKK2F0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKHN0cnVjdCBhdGhfaHcgKmFoKQoreworCXJldHVybiBhaC0+YnRjb2V4X2h3LnNjaGVtZTsKK30KKyNlbHNlCisjZGVmaW5lIGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKC4uLikgQVRIX0JUQ09FWF9DRkdfTk9ORQorI2VuZGlmCisKICNkZWZpbmUgQVRIOUtfQ0xPQ0tfUkFURV9DQ0sJCTIyCiAjZGVmaW5lIEFUSDlLX0NMT0NLX1JBVEVfNUdIWl9PRkRNCTQwCiAjZGVmaW5lIEFUSDlLX0NMT0NLX1JBVEVfMkdIWl9PRkRNCTQ0CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL2luaXQuYwppbmRleCBkNGM5MDlmLi5hYmY5NDM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvaW5pdC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9pbml0LmMKQEAgLTI1OCw2ICsyNTgsOCBAQAogCiAJaWYgKEFSX1NSRVZfOTMzMChhaCkgfHwgQVJfU1JFVl85NDg1KGFoKSkKIAkJbWF4X3N0cmVhbXMgPSAxOworCWVsc2UgaWYgKEFSX1NSRVZfOTQ2MihhaCkpCisJCW1heF9zdHJlYW1zID0gMjsKIAllbHNlIGlmIChBUl9TUkVWXzkzMDBfMjBfT1JfTEFURVIoYWgpKQogCQltYXhfc3RyZWFtcyA9IDM7CiAJZWxzZQpAQCAtMjc0LDggKzI3Niw3IEBACiAJdHhfc3RyZWFtcyA9IGF0aDlrX2Ntbl9jb3VudF9zdHJlYW1zKGFoLT50eGNoYWlubWFzaywgbWF4X3N0cmVhbXMpOwogCXJ4X3N0cmVhbXMgPSBhdGg5a19jbW5fY291bnRfc3RyZWFtcyhhaC0+cnhjaGFpbm1hc2ssIG1heF9zdHJlYW1zKTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJIlRYIHN0cmVhbXMgJWQsIFJYIHN0cmVhbXM6ICVkXG4iLAorCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJUWCBzdHJlYW1zICVkLCBSWCBzdHJlYW1zOiAlZFxuIiwKIAkJdHhfc3RyZWFtcywgcnhfc3RyZWFtcyk7CiAKIAlpZiAodHhfc3RyZWFtcyAhPSByeF9zdHJlYW1zKSB7CkBAIC0yOTUsOSArMjk2LDIyIEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSB3aXBoeV90b19pZWVlODAyMTFfaHcod2lwaHkpOwogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7Ci0Jc3RydWN0IGF0aF9yZWd1bGF0b3J5ICpyZWcgPSBhdGg5a19od19yZWd1bGF0b3J5KHNjLT5zY19haCk7CisJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CisJc3RydWN0IGF0aF9yZWd1bGF0b3J5ICpyZWcgPSBhdGg5a19od19yZWd1bGF0b3J5KGFoKTsKKwlpbnQgcmV0OwogCi0JcmV0dXJuIGF0aF9yZWdfbm90aWZpZXJfYXBwbHkod2lwaHksIHJlcXVlc3QsIHJlZyk7CisJcmV0ID0gYXRoX3JlZ19ub3RpZmllcl9hcHBseSh3aXBoeSwgcmVxdWVzdCwgcmVnKTsKKworCS8qIFNldCB0eCBwb3dlciAqLworCWlmIChhaC0+Y3VyY2hhbikgeworCQlzYy0+Y29uZmlnLnR4cG93bGltaXQgPSAyICogYWgtPmN1cmNoYW4tPmNoYW4tPm1heF9wb3dlcjsKKwkJYXRoOWtfcHNfd2FrZXVwKHNjKTsKKwkJYXRoOWtfaHdfc2V0X3R4cG93ZXJsaW1pdChhaCwgc2MtPmNvbmZpZy50eHBvd2xpbWl0LCBmYWxzZSk7CisJCXNjLT5jdXJ0eHBvdyA9IGF0aDlrX2h3X3JlZ3VsYXRvcnkoYWgpLT5wb3dlcl9saW1pdDsKKwkJYXRoOWtfcHNfcmVzdG9yZShzYyk7CisJfQorCisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTMxNCw3ICszMjgsNyBAQAogCXN0cnVjdCBhdGhfYnVmICpiZjsKIAlpbnQgaSwgYnNpemUsIGVycm9yLCBkZXNjX2xlbjsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywgIiVzIERNQTogJXUgYnVmZmVycyAldSBkZXNjL2J1ZlxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiJXMgRE1BOiAldSBidWZmZXJzICV1IGRlc2MvYnVmXG4iLAogCQluYW1lLCBuYnVmLCBuZGVzYyk7CiAKIAlJTklUX0xJU1RfSEVBRChoZWFkKTsKQEAgLTM2MCw3ICszNzQsNyBAQAogCQlnb3RvIGZhaWw7CiAJfQogCWRzID0gKHU4ICopIGRkLT5kZF9kZXNjOwotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywgIiVzIERNQSBtYXA6ICVwICgldSkgLT4gJWxseCAoJXUpXG4iLAorCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICIlcyBETUEgbWFwOiAlcCAoJXUpIC0+ICVsbHggKCV1KVxuIiwKIAkJbmFtZSwgZHMsICh1MzIpIGRkLT5kZF9kZXNjX2xlbiwKIAkJaXRvNjQoZGQtPmRkX2Rlc2NfcGFkZHIpLCAvKlhYWCovKHUzMikgZGQtPmRkX2Rlc2NfbGVuKTsKIApAQCAtNDA4LDkgKzQyMiwxMCBAQAogc3RhdGljIGludCBhdGg5a19pbml0X2J0Y29leChzdHJ1Y3QgYXRoX3NvZnRjICpzYykKIHsKIAlzdHJ1Y3QgYXRoX3R4cSAqdHhxOworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOwogCWludCByOwogCi0Jc3dpdGNoIChzYy0+c2NfYWgtPmJ0Y29leF9ody5zY2hlbWUpIHsKKwlzd2l0Y2ggKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKHNjLT5zY19haCkpIHsKIAljYXNlIEFUSF9CVENPRVhfQ0ZHX05PTkU6CiAJCWJyZWFrOwogCWNhc2UgQVRIX0JUQ09FWF9DRkdfMldJUkU6CkBAIC00MjUsNiArNDQwLDM3IEBACiAJCWF0aDlrX2h3X2luaXRfYnRjb2V4X2h3KHNjLT5zY19haCwgdHhxLT5heHFfcW51bSk7CiAJCXNjLT5idGNvZXguYnRfc3RvbXBfdHlwZSA9IEFUSF9CVENPRVhfU1RPTVBfTE9XOwogCQlicmVhazsKKwljYXNlIEFUSF9CVENPRVhfQ0ZHX01DSToKKwkJc2MtPmJ0Y29leC5idF9zdG9tcF90eXBlID0gQVRIX0JUQ09FWF9TVE9NUF9MT1c7CisJCXNjLT5idGNvZXguZHV0eV9jeWNsZSA9IEFUSF9CVENPRVhfREVGX0RVVFlfQ1lDTEU7CisJCUlOSVRfTElTVF9IRUFEKCZzYy0+YnRjb2V4Lm1jaS5pbmZvKTsKKworCQlyID0gYXRoX21jaV9zZXR1cChzYyk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJaWYgKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX01DSSkgeworCQkJYWgtPmJ0Y29leF9ody5tY2kucmVhZHkgPSBmYWxzZTsKKwkJCWFoLT5idGNvZXhfaHcubWNpLmJ0X3N0YXRlID0gMDsKKwkJCWFoLT5idGNvZXhfaHcubWNpLmJ0X3Zlcl9tYWpvciA9IDM7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS5idF92ZXJfbWlub3IgPSAwOworCQkJYWgtPmJ0Y29leF9ody5tY2kuYnRfdmVyc2lvbl9rbm93biA9IGZhbHNlOworCQkJYWgtPmJ0Y29leF9ody5tY2kudXBkYXRlXzJnNWcgPSB0cnVlOworCQkJYWgtPmJ0Y29leF9ody5tY2kuaXNfMmcgPSB0cnVlOworCQkJYWgtPmJ0Y29leF9ody5tY2kud2xhbl9jaGFubmVsc191cGRhdGUgPSBmYWxzZTsKKwkJCWFoLT5idGNvZXhfaHcubWNpLndsYW5fY2hhbm5lbHNbMF0gPSAweDAwMDAwMDAwOworCQkJYWgtPmJ0Y29leF9ody5tY2kud2xhbl9jaGFubmVsc1sxXSA9IDB4ZmZmZmZmZmY7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS53bGFuX2NoYW5uZWxzWzJdID0gMHhmZmZmZmZmZjsKKwkJCWFoLT5idGNvZXhfaHcubWNpLndsYW5fY2hhbm5lbHNbM10gPSAweDdmZmZmZmZmOworCQkJYWgtPmJ0Y29leF9ody5tY2kucXVlcnlfYnQgPSB0cnVlOworCQkJYWgtPmJ0Y29leF9ody5tY2kudW5oYWx0X2J0X2dwbSA9IHRydWU7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS5oYWx0ZWRfYnRfZ3BtID0gZmFsc2U7CisJCQlhaC0+YnRjb2V4X2h3Lm1jaS5uZWVkX2ZsdXNoX2J0aW5mbyA9IGZhbHNlOworCQkJYWgtPmJ0Y29leF9ody5tY2kud2xhbl9jYWxfc2VxID0gMDsKKwkJCWFoLT5idGNvZXhfaHcubWNpLndsYW5fY2FsX2RvbmUgPSAwOworCQkJYWgtPmJ0Y29leF9ody5tY2kuY29uZmlnID0gMHgyMjAxOworCQl9CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCVdBUk5fT04oMSk7CiAJCWJyZWFrOwpAQCAtNjk1LDYgKzc0MSw3IEBACiAJCWh3LT53aXBoeS0+ZmxhZ3MgJj0gfldJUEhZX0ZMQUdfUFNfT05fQllfREVGQVVMVDsKIAogCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19JQlNTX1JTTjsKKwlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfU1VQUE9SVFNfVERMUzsKIAogCWh3LT5xdWV1ZXMgPSA0OwogCWh3LT5tYXhfcmF0ZXMgPSA0OwpAQCAtODMzLDkgKzg4MCwxMiBAQAogCQlrZnJlZShzYy0+c2JhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLmNoYW5uZWxzKTsKIAogICAgICAgICBpZiAoKHNjLT5idGNvZXgubm9fc3RvbXBfdGltZXIpICYmCi0JICAgIHNjLT5zY19haC0+YnRjb2V4X2h3LnNjaGVtZSA9PSBBVEhfQlRDT0VYX0NGR18zV0lSRSkKKwkgICAgYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoc2MtPnNjX2FoKSA9PSBBVEhfQlRDT0VYX0NGR18zV0lSRSkKIAkJYXRoX2dlbl90aW1lcl9mcmVlKHNjLT5zY19haCwgc2MtPmJ0Y29leC5ub19zdG9tcF90aW1lcik7CiAKKwlpZiAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoc2MtPnNjX2FoKSA9PSBBVEhfQlRDT0VYX0NGR19NQ0kpCisJCWF0aF9tY2lfY2xlYW51cChzYyk7CisKIAlmb3IgKGkgPSAwOyBpIDwgQVRIOUtfTlVNX1RYX1FVRVVFUzsgaSsrKQogCQlpZiAoQVRIX1RYUV9TRVRVUChzYywgaSkpCiAJCQlhdGhfdHhfY2xlYW51cHEoc2MsICZzYy0+dHgudHhxW2ldKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWMuYwppbmRleCBlY2RiNmZkLi5mZDNmMTljIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21hYy5jCkBAIC0yMSw3ICsyMSw3IEBACiBzdGF0aWMgdm9pZCBhdGg5a19od19zZXRfdHhxX2ludGVycnVwdHMoc3RydWN0IGF0aF9odyAqYWgsCiAJCQkJCXN0cnVjdCBhdGg5a190eF9xdWV1ZV9pbmZvICpxaSkKIHsKLQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfSU5URVJSVVBULAorCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKGFoKSwgSU5URVJSVVBULAogCQkidHggb2sgMHgleCBlcnIgMHgleCBkZXNjIDB4JXggZW9sIDB4JXggdXJuIDB4JXhcbiIsCiAJCWFoLT50eG9rX2ludGVycnVwdF9tYXNrLCBhaC0+dHhlcnJfaW50ZXJydXB0X21hc2ssCiAJCWFoLT50eGRlc2NfaW50ZXJydXB0X21hc2ssIGFoLT50eGVvbF9pbnRlcnJ1cHRfbWFzaywKQEAgLTU3LDggKzU3LDcgQEAKIAogdm9pZCBhdGg5a19od190eHN0YXJ0KHN0cnVjdCBhdGhfaHcgKmFoLCB1MzIgcSkKIHsKLQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihhaCksIEFUSF9EQkdfUVVFVUUsCi0JCSJFbmFibGUgVFhFIG9uIHF1ZXVlOiAldVxuIiwgcSk7CisJYXRoX2RiZyhhdGg5a19od19jb21tb24oYWgpLCBRVUVVRSwgIkVuYWJsZSBUWEUgb24gcXVldWU6ICV1XG4iLCBxKTsKIAlSRUdfV1JJVEUoYWgsIEFSX1FfVFhFLCAxIDw8IHEpOwogfQogRVhQT1JUX1NZTUJPTChhdGg5a19od190eHN0YXJ0KTsKQEAgLTIwMiwxMiArMjAxLDEyIEBACiAKIAlxaSA9ICZhaC0+dHhxW3FdOwogCWlmIChxaS0+dHFpX3R5cGUgPT0gQVRIOUtfVFhfUVVFVUVfSU5BQ1RJVkUpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUVVFVUUsCisJCWF0aF9kYmcoY29tbW9uLCBRVUVVRSwKIAkJCSJTZXQgVFhRIHByb3BlcnRpZXMsIGluYWN0aXZlIHF1ZXVlOiAldVxuIiwgcSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19RVUVVRSwgIlNldCBxdWV1ZSBwcm9wZXJ0aWVzIGZvcjogJXVcbiIsIHEpOworCWF0aF9kYmcoY29tbW9uLCBRVUVVRSwgIlNldCBxdWV1ZSBwcm9wZXJ0aWVzIGZvcjogJXVcbiIsIHEpOwogCiAJcWktPnRxaV92ZXIgPSBxaW5mby0+dHFpX3ZlcjsKIAlxaS0+dHFpX3N1YnR5cGUgPSBxaW5mby0+dHFpX3N1YnR5cGU7CkBAIC0yNjYsNyArMjY1LDcgQEAKIAogCXFpID0gJmFoLT50eHFbcV07CiAJaWYgKHFpLT50cWlfdHlwZSA9PSBBVEg5S19UWF9RVUVVRV9JTkFDVElWRSkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19RVUVVRSwKKwkJYXRoX2RiZyhjb21tb24sIFFVRVVFLAogCQkJIkdldCBUWFEgcHJvcGVydGllcywgaW5hY3RpdmUgcXVldWU6ICV1XG4iLCBxKTsKIAkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTMyNSw3ICszMjQsNyBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUVVFVUUsICJTZXR1cCBUWCBxdWV1ZTogJXVcbiIsIHEpOworCWF0aF9kYmcoY29tbW9uLCBRVUVVRSwgIlNldHVwIFRYIHF1ZXVlOiAldVxuIiwgcSk7CiAKIAlxaSA9ICZhaC0+dHhxW3FdOwogCWlmIChxaS0+dHFpX3R5cGUgIT0gQVRIOUtfVFhfUVVFVUVfSU5BQ1RJVkUpIHsKQEAgLTM0OCwxMiArMzQ3LDExIEBACiAKIAlxaSA9ICZhaC0+dHhxW3FdOwogCWlmIChxaS0+dHFpX3R5cGUgPT0gQVRIOUtfVFhfUVVFVUVfSU5BQ1RJVkUpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUVVFVUUsCi0JCQkiUmVsZWFzZSBUWFEsIGluYWN0aXZlIHF1ZXVlOiAldVxuIiwgcSk7CisJCWF0aF9kYmcoY29tbW9uLCBRVUVVRSwgIlJlbGVhc2UgVFhRLCBpbmFjdGl2ZSBxdWV1ZTogJXVcbiIsIHEpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUVVFVUUsICJSZWxlYXNlIFRYIHF1ZXVlOiAldVxuIiwgcSk7CisJYXRoX2RiZyhjb21tb24sIFFVRVVFLCAiUmVsZWFzZSBUWCBxdWV1ZTogJXVcbiIsIHEpOwogCiAJcWktPnRxaV90eXBlID0gQVRIOUtfVFhfUVVFVUVfSU5BQ1RJVkU7CiAJYWgtPnR4b2tfaW50ZXJydXB0X21hc2sgJj0gfigxIDw8IHEpOwpAQCAtMzc2LDEyICszNzQsMTEgQEAKIAogCXFpID0gJmFoLT50eHFbcV07CiAJaWYgKHFpLT50cWlfdHlwZSA9PSBBVEg5S19UWF9RVUVVRV9JTkFDVElWRSkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19RVUVVRSwKLQkJCSJSZXNldCBUWFEsIGluYWN0aXZlIHF1ZXVlOiAldVxuIiwgcSk7CisJCWF0aF9kYmcoY29tbW9uLCBRVUVVRSwgIlJlc2V0IFRYUSwgaW5hY3RpdmUgcXVldWU6ICV1XG4iLCBxKTsKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUVVFVUUsICJSZXNldCBUWCBxdWV1ZTogJXVcbiIsIHEpOworCWF0aF9kYmcoY29tbW9uLCBRVUVVRSwgIlJlc2V0IFRYIHF1ZXVlOiAldVxuIiwgcSk7CiAKIAlpZiAocWktPnRxaV9jd21pbiA9PSBBVEg5S19UWFFfVVNFREVGQVVMVCkgewogCQlpZiAoY2hhbiAmJiBJU19DSEFOX0IoY2hhbikpCkBAIC03NjAsNyArNzU3LDEwIEBACiAJCXJldHVybiB0cnVlOwogCiAJaG9zdF9pc3IgPSBSRUdfUkVBRChhaCwgQVJfSU5UUl9BU1lOQ19DQVVTRSk7Ci0JaWYgKChob3N0X2lzciAmIEFSX0lOVFJfTUFDX0lSUSkgJiYgKGhvc3RfaXNyICE9IEFSX0lOVFJfU1BVUklPVVMpKQorCisJaWYgKCgoaG9zdF9pc3IgJiBBUl9JTlRSX01BQ19JUlEpIHx8CisJICAgICAoaG9zdF9pc3IgJiBBUl9JTlRSX0FTWU5DX01BU0tfTUNJKSkgJiYKKwkgICAgKGhvc3RfaXNyICE9IEFSX0lOVFJfU1BVUklPVVMpKQogCQlyZXR1cm4gdHJ1ZTsKIAogCWhvc3RfaXNyID0gUkVHX1JFQUQoYWgsIEFSX0lOVFJfU1lOQ19DQVVTRSk7CkBAIC03ODEsNyArNzgxLDcgQEAKIAllbHNlCiAJCWF0b21pY19kZWMoJmFoLT5pbnRyX3JlZl9jbnQpOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfSU5URVJSVVBULCAiZGlzYWJsZSBJRVJcbiIpOworCWF0aF9kYmcoY29tbW9uLCBJTlRFUlJVUFQsICJkaXNhYmxlIElFUlxuIik7CiAJUkVHX1dSSVRFKGFoLCBBUl9JRVIsIEFSX0lFUl9ESVNBQkxFKTsKIAkodm9pZCkgUkVHX1JFQUQoYWgsIEFSX0lFUik7CiAJaWYgKCFBUl9TUkVWXzkxMDAoYWgpKSB7CkBAIC03OTgsMTMgKzc5OCwxMyBAQAogewogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOwogCXUzMiBzeW5jX2RlZmF1bHQgPSBBUl9JTlRSX1NZTkNfREVGQVVMVDsKKwl1MzIgYXN5bmNfbWFzazsKIAogCWlmICghKGFoLT5pbWFzayAmIEFUSDlLX0lOVF9HTE9CQUwpKQogCQlyZXR1cm47CiAKIAlpZiAoIWF0b21pY19pbmNfYW5kX3Rlc3QoJmFoLT5pbnRyX3JlZl9jbnQpKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0lOVEVSUlVQVCwKLQkJCSJEbyBub3QgZW5hYmxlIElFUiByZWYgY291bnQgJWRcbiIsCisJCWF0aF9kYmcoY29tbW9uLCBJTlRFUlJVUFQsICJEbyBub3QgZW5hYmxlIElFUiByZWYgY291bnQgJWRcbiIsCiAJCQlhdG9taWNfcmVhZCgmYWgtPmludHJfcmVmX2NudCkpOwogCQlyZXR1cm47CiAJfQpAQCAtODEyLDE4ICs4MTIsMjEgQEAKIAlpZiAoQVJfU1JFVl85MzQwKGFoKSkKIAkJc3luY19kZWZhdWx0ICY9IH5BUl9JTlRSX1NZTkNfSE9TVDFfRkFUQUw7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19JTlRFUlJVUFQsICJlbmFibGUgSUVSXG4iKTsKKwlhc3luY19tYXNrID0gQVJfSU5UUl9NQUNfSVJROworCisJaWYgKGFoLT5pbWFzayAmIEFUSDlLX0lOVF9NQ0kpCisJCWFzeW5jX21hc2sgfD0gQVJfSU5UUl9BU1lOQ19NQVNLX01DSTsKKworCWF0aF9kYmcoY29tbW9uLCBJTlRFUlJVUFQsICJlbmFibGUgSUVSXG4iKTsKIAlSRUdfV1JJVEUoYWgsIEFSX0lFUiwgQVJfSUVSX0VOQUJMRSk7CiAJaWYgKCFBUl9TUkVWXzkxMDAoYWgpKSB7Ci0JCVJFR19XUklURShhaCwgQVJfSU5UUl9BU1lOQ19FTkFCTEUsCi0JCQkgIEFSX0lOVFJfTUFDX0lSUSk7Ci0JCVJFR19XUklURShhaCwgQVJfSU5UUl9BU1lOQ19NQVNLLCBBUl9JTlRSX01BQ19JUlEpOwotCisJCVJFR19XUklURShhaCwgQVJfSU5UUl9BU1lOQ19FTkFCTEUsIGFzeW5jX21hc2spOworCQlSRUdfV1JJVEUoYWgsIEFSX0lOVFJfQVNZTkNfTUFTSywgYXN5bmNfbWFzayk7CiAKIAkJUkVHX1dSSVRFKGFoLCBBUl9JTlRSX1NZTkNfRU5BQkxFLCBzeW5jX2RlZmF1bHQpOwogCQlSRUdfV1JJVEUoYWgsIEFSX0lOVFJfU1lOQ19NQVNLLCBzeW5jX2RlZmF1bHQpOwogCX0KLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19JTlRFUlJVUFQsICJBUl9JTVIgMHgleCBJRVIgMHgleFxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgSU5URVJSVVBULCAiQVJfSU1SIDB4JXggSUVSIDB4JXhcbiIsCiAJCVJFR19SRUFEKGFoLCBBUl9JTVIpLCBSRUdfUkVBRChhaCwgQVJfSUVSKSk7CiB9CiBFWFBPUlRfU1lNQk9MKGF0aDlrX2h3X2VuYWJsZV9pbnRlcnJ1cHRzKTsKQEAgLTgzOCw3ICs4NDEsNyBAQAogCWlmICghKGludHMgJiBBVEg5S19JTlRfR0xPQkFMKSkKIAkJYXRoOWtfaHdfZGlzYWJsZV9pbnRlcnJ1cHRzKGFoKTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0lOVEVSUlVQVCwgIk5ldyBpbnRlcnJ1cHQgbWFzayAweCV4XG4iLCBpbnRzKTsKKwlhdGhfZGJnKGNvbW1vbiwgSU5URVJSVVBULCAiTmV3IGludGVycnVwdCBtYXNrIDB4JXhcbiIsIGludHMpOwogCiAJbWFzayA9IGludHMgJiBBVEg5S19JTlRfQ09NTU9OOwogCW1hc2syID0gMDsKQEAgLTkwMSw3ICs5MDQsNyBAQAogCQkJbWFzazIgfD0gQVJfSU1SX1MyX0NTVDsKIAl9CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19JTlRFUlJVUFQsICJuZXcgSU1SIDB4JXhcbiIsIG1hc2spOworCWF0aF9kYmcoY29tbW9uLCBJTlRFUlJVUFQsICJuZXcgSU1SIDB4JXhcbiIsIG1hc2spOwogCVJFR19XUklURShhaCwgQVJfSU1SLCBtYXNrKTsKIAlhaC0+aW1yczJfcmVnICY9IH4oQVJfSU1SX1MyX1RJTSB8IEFSX0lNUl9TMl9EVElNIHwgQVJfSU1SX1MyX0RUSU1TWU5DIHwKIAkJCSAgIEFSX0lNUl9TMl9DQUJFTkQgfCBBUl9JTVJfUzJfQ0FCVE8gfApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tYWluLmMKaW5kZXggOTNmYmU2Zi4uZTI2N2M5MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWFpbi5jCkBAIC0xMTgsNyArMTE4LDcgQEAKIAlpZiAoLS1zYy0+cHNfdXNlY291bnQgIT0gMCkKIAkJZ290byB1bmxvY2s7CiAKLQlpZiAoc2MtPnBzX2lkbGUpCisJaWYgKHNjLT5wc19pZGxlICYmIChzYy0+cHNfZmxhZ3MgJiBQU19XQUlUX0ZPUl9UWF9BQ0spKQogCQltb2RlID0gQVRIOUtfUE1fRlVMTF9TTEVFUDsKIAllbHNlIGlmIChzYy0+cHNfZW5hYmxlZCAmJgogCQkgIShzYy0+cHNfZmxhZ3MgJiAoUFNfV0FJVF9GT1JfQkVBQ09OIHwKQEAgLTI4Niw3ICsyODYsNyBAQAogCQkJYXRoX3N0YXJ0X2FuaShjb21tb24pOwogCX0KIAotCWlmIChhdGg5a19od19vcHMoYWgpLT5hbnRkaXZfY29tYl9jb25mX2dldCAmJiBzYy0+YW50X3J4ICE9IDMpIHsKKwlpZiAoKGFoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfQU5UX0RJVl9DT01CKSAmJiBzYy0+YW50X3J4ICE9IDMpIHsKIAkJc3RydWN0IGF0aF9od19hbnRjb21iX2NvbmYgZGl2X2FudF9jb25mOwogCQl1OCBsbmFfY29uZjsKIApAQCAtMzMyLDE0ICszMzIsMTQgQEAKIAkJaGNoYW4gPSBhaC0+Y3VyY2hhbjsKIAl9CiAKLQlpZiAoZmFzdGNjICYmICFhdGg5a19od19jaGVja19hbGl2ZShhaCkpCisJaWYgKGZhc3RjYyAmJiAoYWgtPmNoaXBfZnVsbHNsZWVwIHx8CisJICAgICFhdGg5a19od19jaGVja19hbGl2ZShhaCkpKQogCQlmYXN0Y2MgPSBmYWxzZTsKIAogCWlmICghYXRoX3ByZXBhcmVfcmVzZXQoc2MsIHJldHJ5X3R4LCBmbHVzaCkpCiAJCWZhc3RjYyA9IGZhbHNlOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkiUmVzZXQgdG8gJXUgTUh6LCBIVDQwOiAlZCBmYXN0Y2M6ICVkXG4iLAorCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJSZXNldCB0byAldSBNSHosIEhUNDA6ICVkIGZhc3RjYzogJWRcbiIsCiAJCWhjaGFuLT5jaGFubmVsLCAhIShoY2hhbi0+Y2hhbm5lbEZsYWdzICYgKENIQU5ORUxfSFQ0ME1JTlVTIHwKIAkJCQkJCQkgIENIQU5ORUxfSFQ0MFBMVVMpKSwKIAkJZmFzdGNjKTsKQEAgLTQyOCw3ICs0MjgsNyBAQAogCXR4Y3RsLnBhcHJkID0gQklUKGNoYWluKTsKIAogCWlmIChhdGhfdHhfc3RhcnQoaHcsIHNrYiwgJnR4Y3RsKSAhPSAwKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwgIlBBUFJEIFRYIGZhaWxlZFxuIik7CisJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsICJQQVBSRCBUWCBmYWlsZWRcbiIpOwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQpAQCAtNDM3LDcgKzQzNyw3IEBACiAJCQltc2Vjc190b19qaWZmaWVzKEFUSF9QQVBSRF9USU1FT1VUKSk7CiAKIAlpZiAoIXRpbWVfbGVmdCkKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJIlRpbWVvdXQgd2FpdGluZyBmb3IgcGFwcmQgdHJhaW5pbmcgb24gVFggY2hhaW4gJWRcbiIsCiAJCQljaGFpbik7CiAKQEAgLTQ4NiwyNyArNDg2LDI3IEBACiAKIAkJY2hhaW5fb2sgPSAwOwogCi0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKLQkJCSJTZW5kaW5nIFBBUFJEIGZyYW1lIGZvciB0aGVybWFsIG1lYXN1cmVtZW50ICIKLQkJCSJvbiBjaGFpbiAlZFxuIiwgY2hhaW4pOworCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAorCQkJIlNlbmRpbmcgUEFQUkQgZnJhbWUgZm9yIHRoZXJtYWwgbWVhc3VyZW1lbnQgb24gY2hhaW4gJWRcbiIsCisJCQljaGFpbik7CiAJCWlmICghYXRoX3BhcHJkX3NlbmRfZnJhbWUoc2MsIHNrYiwgY2hhaW4pKQogCQkJZ290byBmYWlsX3BhcHJkOwogCiAJCWFyOTAwM19wYXByZF9zZXR1cF9nYWluX3RhYmxlKGFoLCBjaGFpbik7CiAKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ0FMSUJSQVRFLAorCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJIlNlbmRpbmcgUEFQUkQgdHJhaW5pbmcgZnJhbWUgb24gY2hhaW4gJWRcbiIsIGNoYWluKTsKIAkJaWYgKCFhdGhfcGFwcmRfc2VuZF9mcmFtZShzYywgc2tiLCBjaGFpbikpCiAJCQlnb3RvIGZhaWxfcGFwcmQ7CiAKIAkJaWYgKCFhcjkwMDNfcGFwcmRfaXNfZG9uZShhaCkpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NBTElCUkFURSwKKwkJCWF0aF9kYmcoY29tbW9uLCBDQUxJQlJBVEUsCiAJCQkJIlBBUFJEIG5vdCB5ZXQgZG9uZSBvbiBjaGFpbiAlZFxuIiwgY2hhaW4pOwogCQkJYnJlYWs7CiAJCX0KIAogCQlpZiAoYXI5MDAzX3BhcHJkX2NyZWF0ZV9jdXJ2ZShhaCwgY2FsZGF0YSwgY2hhaW4pKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DQUxJQlJBVEUsCisJCQlhdGhfZGJnKGNvbW1vbiwgQ0FMSUJSQVRFLAogCQkJCSJQQVBSRCBjcmVhdGUgY3VydmUgZmFpbGVkIG9uIGNoYWluICVkXG4iLAogCQkJCQkJCQkgICBjaGFpbik7CiAJCQlicmVhazsKQEAgLTU2MSw3ICs1NjEsNiBAQAogCS8qIExvbmcgY2FsaWJyYXRpb24gcnVucyBpbmRlcGVuZGVudGx5IG9mIHNob3J0IGNhbGlicmF0aW9uLiAqLwogCWlmICgodGltZXN0YW1wIC0gY29tbW9uLT5hbmkubG9uZ2NhbF90aW1lcikgPj0gbG9uZ19jYWxfaW50ZXJ2YWwpIHsKIAkJbG9uZ2NhbCA9IHRydWU7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOSSwgImxvbmdjYWwgQCVsdVxuIiwgamlmZmllcyk7CiAJCWNvbW1vbi0+YW5pLmxvbmdjYWxfdGltZXIgPSB0aW1lc3RhbXA7CiAJfQogCkBAIC01NjksOCArNTY4LDYgQEAKIAlpZiAoIWNvbW1vbi0+YW5pLmNhbGRvbmUpIHsKIAkJaWYgKCh0aW1lc3RhbXAgLSBjb21tb24tPmFuaS5zaG9ydGNhbF90aW1lcikgPj0gc2hvcnRfY2FsX2ludGVydmFsKSB7CiAJCQlzaG9ydGNhbCA9IHRydWU7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTkksCi0JCQkJInNob3J0Y2FsIEAlbHVcbiIsIGppZmZpZXMpOwogCQkJY29tbW9uLT5hbmkuc2hvcnRjYWxfdGltZXIgPSB0aW1lc3RhbXA7CiAJCQljb21tb24tPmFuaS5yZXNldGNhbF90aW1lciA9IHRpbWVzdGFtcDsKIAkJfQpAQCAtNTg0LDggKzU4MSw5IEBACiAJfQogCiAJLyogVmVyaWZ5IHdoZXRoZXIgd2UgbXVzdCBjaGVjayBBTkkgKi8KLQlpZiAoKHRpbWVzdGFtcCAtIGNvbW1vbi0+YW5pLmNoZWNrYW5pX3RpbWVyKSA+PQotCSAgICAgYWgtPmNvbmZpZy5hbmlfcG9sbF9pbnRlcnZhbCkgeworCWlmIChzYy0+c2NfYWgtPmNvbmZpZy5lbmFibGVfYW5pCisJICAgICYmICh0aW1lc3RhbXAgLSBjb21tb24tPmFuaS5jaGVja2FuaV90aW1lcikgPj0KKwkgICAgYWgtPmNvbmZpZy5hbmlfcG9sbF9pbnRlcnZhbCkgewogCQlhbmlmbGFnID0gdHJ1ZTsKIAkJY29tbW9uLT5hbmkuY2hlY2thbmlfdGltZXIgPSB0aW1lc3RhbXA7CiAJfQpAQCAtNjA1LDYgKzYwMywxMiBAQAogCQkJCQkJYWgtPnJ4Y2hhaW5tYXNrLCBsb25nY2FsKTsKIAl9CiAKKwlhdGhfZGJnKGNvbW1vbiwgQU5JLAorCQkiQ2FsaWJyYXRpb24gQCVsdSBmaW5pc2hlZDogJXMgJXMgJXMsIGNhbGRvbmU6ICVzXG4iLAorCQlqaWZmaWVzLAorCQlsb25nY2FsID8gImxvbmciIDogIiIsIHNob3J0Y2FsID8gInNob3J0IiA6ICIiLAorCQlhbmlmbGFnID8gImFuaSIgOiAiIiwgY29tbW9uLT5hbmkuY2FsZG9uZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCiAJYXRoOWtfcHNfcmVzdG9yZShzYyk7CiAKIHNldF90aW1lcjoKQEAgLTYzMCw3ICs2MzQsOCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgYXRoX25vZGVfYXR0YWNoKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQorc3RhdGljIHZvaWQgYXRoX25vZGVfYXR0YWNoKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7CiAJc3RydWN0IGF0aF9ub2RlICphbjsKIAlhbiA9IChzdHJ1Y3QgYXRoX25vZGUgKilzdGEtPmRydl9wcml2OwpAQCAtNjM5LDggKzY0NCw5IEBACiAJc3Bpbl9sb2NrKCZzYy0+bm9kZXNfbG9jayk7CiAJbGlzdF9hZGQoJmFuLT5saXN0LCAmc2MtPm5vZGVzKTsKIAlzcGluX3VubG9jaygmc2MtPm5vZGVzX2xvY2spOwotCWFuLT5zdGEgPSBzdGE7CiAjZW5kaWYKKwlhbi0+c3RhID0gc3RhOworCWFuLT52aWYgPSB2aWY7CiAJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikgewogCQlhdGhfdHhfbm9kZV9pbml0KHNjLCBhbik7CiAJCWFuLT5tYXhhbXBkdSA9IDEgPDwgKElFRUU4MDIxMV9IVF9NQVhfQU1QRFVfRkFDVE9SICsKQEAgLTcwOSw4ICs3MTUsNyBAQAogCQkgKiBUU0Ygc3luYyBkb2VzIG5vdCBsb29rIGNvcnJlY3Q7IHJlbWFpbiBhd2FrZSB0byBzeW5jIHdpdGgKIAkJICogdGhlIG5leHQgQmVhY29uLgogCQkgKi8KLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUFMsCi0JCQkiVFNGT09SIC0gU3luYyB3aXRoIG5leHQgQmVhY29uXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIFBTLCAiVFNGT09SIC0gU3luYyB3aXRoIG5leHQgQmVhY29uXG4iKTsKIAkJc2MtPnBzX2ZsYWdzIHw9IFBTX1dBSVRfRk9SX0JFQUNPTiB8IFBTX0JFQUNPTl9TWU5DOwogCX0KIApAQCAtNzM2LDEwICs3NDEsMTMgQEAKIAkJCWF0aF90eF90YXNrbGV0KHNjKTsKIAl9CiAKLQlpZiAoYWgtPmJ0Y29leF9ody5zY2hlbWUgPT0gQVRIX0JUQ09FWF9DRkdfM1dJUkUpCisJaWYgKGF0aDlrX2h3X2dldF9idGNvZXhfc2NoZW1lKGFoKSA9PSBBVEhfQlRDT0VYX0NGR18zV0lSRSkKIAkJaWYgKHN0YXR1cyAmIEFUSDlLX0lOVF9HRU5USU1FUikKIAkJCWF0aF9nZW5fdGltZXJfaXNyKHNjLT5zY19haCk7CiAKKwlpZiAoKHN0YXR1cyAmIEFUSDlLX0lOVF9NQ0kpICYmIEFUSDlLX0hXX0NBUF9NQ0kpCisJCWF0aF9tY2lfaW50cihzYyk7CisKIG91dDoKIAkvKiByZS1lbmFibGUgaGFyZHdhcmUgaW50ZXJydXB0ICovCiAJYXRoOWtfaHdfZW5hYmxlX2ludGVycnVwdHMoYWgpOwpAQCAtNzYyLDcgKzc3MCw4IEBACiAJCUFUSDlLX0lOVF9CTUlTUyB8CQlcCiAJCUFUSDlLX0lOVF9DU1QgfAkJCVwKIAkJQVRIOUtfSU5UX1RTRk9PUiB8CQlcCi0JCUFUSDlLX0lOVF9HRU5USU1FUikKKwkJQVRIOUtfSU5UX0dFTlRJTUVSIHwJCVwKKwkJQVRIOUtfSU5UX01DSSkKIAogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gZGV2OwogCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOwpAQCAtODgwLDgyICs4ODksNiBAQAogI3VuZGVmIFNDSEVEX0lOVFIKIH0KIAotc3RhdGljIHZvaWQgYXRoX3JhZGlvX2VuYWJsZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7Ci0Jc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gaHctPmNvbmYuY2hhbm5lbDsKLQlpbnQgcjsKLQotCWF0aDlrX3BzX3dha2V1cChzYyk7Ci0Jc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOwotCWF0b21pY19zZXQoJmFoLT5pbnRyX3JlZl9jbnQsIC0xKTsKLQotCWF0aDlrX2h3X2NvbmZpZ3BjaXBvd2Vyc2F2ZShhaCwgZmFsc2UpOwotCi0JaWYgKCFhaC0+Y3VyY2hhbikKLQkJYWgtPmN1cmNoYW4gPSBhdGg5a19jbW5fZ2V0X2N1cmNoYW5uZWwoc2MtPmh3LCBhaCk7Ci0KLQlyID0gYXRoOWtfaHdfcmVzZXQoYWgsIGFoLT5jdXJjaGFuLCBhaC0+Y2FsZGF0YSwgZmFsc2UpOwotCWlmIChyKSB7Ci0JCWF0aF9lcnIoY29tbW9uLAotCQkJIlVuYWJsZSB0byByZXNldCBjaGFubmVsICgldSBNSHopLCByZXNldCBzdGF0dXMgJWRcbiIsCi0JCQljaGFubmVsLT5jZW50ZXJfZnJlcSwgcik7Ci0JfQotCi0JYXRoX2NvbXBsZXRlX3Jlc2V0KHNjLCB0cnVlKTsKLQotCS8qIEVuYWJsZSBMRUQgKi8KLQlhdGg5a19od19jZmdfb3V0cHV0KGFoLCBhaC0+bGVkX3BpbiwKLQkJCSAgICBBUl9HUElPX09VVFBVVF9NVVhfQVNfT1VUUFVUKTsKLQlhdGg5a19od19zZXRfZ3BpbyhhaCwgYWgtPmxlZF9waW4sIDApOwotCi0Jc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7Ci0KLQlhdGg5a19wc19yZXN0b3JlKHNjKTsKLX0KLQotdm9pZCBhdGhfcmFkaW9fZGlzYWJsZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gaHctPmNvbmYuY2hhbm5lbDsKLQlpbnQgcjsKLQotCWF0aDlrX3BzX3dha2V1cChzYyk7Ci0KLQlhdGhfY2FuY2VsX3dvcmsoc2MpOwotCi0Jc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOwotCi0JLyoKLQkgKiBLZWVwIHRoZSBMRUQgb24gd2hlbiB0aGUgcmFkaW8gaXMgZGlzYWJsZWQKLQkgKiBkdXJpbmcgaWRsZSB1bmFzc29jaWF0ZWQgc3RhdGUuCi0JICovCi0JaWYgKCFzYy0+cHNfaWRsZSkgewotCQlhdGg5a19od19zZXRfZ3BpbyhhaCwgYWgtPmxlZF9waW4sIDEpOwotCQlhdGg5a19od19jZmdfZ3Bpb19pbnB1dChhaCwgYWgtPmxlZF9waW4pOwotCX0KLQotCWF0aF9wcmVwYXJlX3Jlc2V0KHNjLCBmYWxzZSwgdHJ1ZSk7Ci0KLQlpZiAoIWFoLT5jdXJjaGFuKQotCQlhaC0+Y3VyY2hhbiA9IGF0aDlrX2Ntbl9nZXRfY3VyY2hhbm5lbChodywgYWgpOwotCi0JciA9IGF0aDlrX2h3X3Jlc2V0KGFoLCBhaC0+Y3VyY2hhbiwgYWgtPmNhbGRhdGEsIGZhbHNlKTsKLQlpZiAocikgewotCQlhdGhfZXJyKGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpLAotCQkJIlVuYWJsZSB0byByZXNldCBjaGFubmVsICgldSBNSHopLCByZXNldCBzdGF0dXMgJWRcbiIsCi0JCQljaGFubmVsLT5jZW50ZXJfZnJlcSwgcik7Ci0JfQotCi0JYXRoOWtfaHdfcGh5X2Rpc2FibGUoYWgpOwotCi0JYXRoOWtfaHdfY29uZmlncGNpcG93ZXJzYXZlKGFoLCB0cnVlKTsKLQotCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOwotCWF0aDlrX3BzX3Jlc3RvcmUoc2MpOwotfQotCiBzdGF0aWMgaW50IGF0aF9yZXNldChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgYm9vbCByZXRyeV90eCkKIHsKIAlpbnQgcjsKQEAgLTEwMDIsOCArOTM1LDggQEAKIAlidXN5ID0gYXRoX3VwZGF0ZV9zdXJ2ZXlfc3RhdHMoc2MpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNvbW1vbi0+Y2NfbG9jaywgZmxhZ3MpOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUkVTRVQsICJQb3NzaWJsZSBiYXNlYmFuZCBoYW5nLCAiCi0JCSJidXN5PSVkICh0cnkgJWQpXG4iLCBidXN5LCBzYy0+aHdfYnVzeV9jb3VudCArIDEpOworCWF0aF9kYmcoY29tbW9uLCBSRVNFVCwgIlBvc3NpYmxlIGJhc2ViYW5kIGhhbmcsIGJ1c3k9JWQgKHRyeSAlZClcbiIsCisJCWJ1c3ksIHNjLT5od19idXN5X2NvdW50ICsgMSk7CiAJaWYgKGJ1c3kgPj0gOTkpIHsKIAkJaWYgKCsrc2MtPmh3X2J1c3lfY291bnQgPj0gMykgewogCQkJUkVTRVRfU1RBVF9JTkMoc2MsIFJFU0VUX1RZUEVfQkJfSEFORyk7CkBAIC0xMDI2LDggKzk1OSw3IEBACiAJCWNvdW50Kys7CiAJCWlmIChjb3VudCA9PSAzKSB7CiAJCQkvKiBSeCBpcyBodW5nIGZvciBtb3JlIHRoYW4gNTAwbXMuIFJlc2V0IGl0ICovCi0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19SRVNFVCwKLQkJCQkiUG9zc2libGUgUlggaGFuZywgcmVzZXR0aW5nIik7CisJCQlhdGhfZGJnKGNvbW1vbiwgUkVTRVQsICJQb3NzaWJsZSBSWCBoYW5nLCByZXNldHRpbmdcbiIpOwogCQkJUkVTRVRfU1RBVF9JTkMoc2MsIFJFU0VUX1RZUEVfUExMX0hBTkcpOwogCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoc2MtPmh3LCAmc2MtPmh3X3Jlc2V0X3dvcmspOwogCQkJY291bnQgPSAwOwpAQCAtMTA2Nyw3ICs5OTksNyBAQAogCXN0cnVjdCBhdGg5a19jaGFubmVsICppbml0X2NoYW5uZWw7CiAJaW50IHI7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCisJYXRoX2RiZyhjb21tb24sIENPTkZJRywKIAkJIlN0YXJ0aW5nIGRyaXZlciB3aXRoIGluaXRpYWwgY2hhbm5lbDogJWQgTUh6XG4iLAogCQljdXJjaGFuLT5jZW50ZXJfZnJlcSk7CiAKQEAgLTEwOTEsNiArMTAyMyw5IEBACiAJICogYW5kIHRoZW4gc2V0dXAgb2YgdGhlIGludGVycnVwdCBtYXNrLgogCSAqLwogCXNwaW5fbG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKKworCWF0b21pY19zZXQoJmFoLT5pbnRyX3JlZl9jbnQsIC0xKTsKKwogCXIgPSBhdGg5a19od19yZXNldChhaCwgaW5pdF9jaGFubmVsLCBhaC0+Y2FsZGF0YSwgZmFsc2UpOwogCWlmIChyKSB7CiAJCWF0aF9lcnIoY29tbW9uLApAQCAtMTExNyw2ICsxMDUyLDkgQEAKIAlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9IVCkKIAkJYWgtPmltYXNrIHw9IEFUSDlLX0lOVF9DU1Q7CiAKKwlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9NQ0kpCisJCWFoLT5pbWFzayB8PSBBVEg5S19JTlRfTUNJOworCiAJc2MtPnNjX2ZsYWdzICY9IH5TQ19PUF9JTlZBTElEOwogCXNjLT5zY19haC0+aXNfbW9uaXRvcmluZyA9IGZhbHNlOwogCkBAIC0xMTI5LDE1ICsxMDY3LDI4IEBACiAJCWdvdG8gbXV0ZXhfdW5sb2NrOwogCX0KIAorCWlmIChhaC0+bGVkX3BpbiA+PSAwKSB7CisJCWF0aDlrX2h3X2NmZ19vdXRwdXQoYWgsIGFoLT5sZWRfcGluLAorCQkJCSAgICBBUl9HUElPX09VVFBVVF9NVVhfQVNfT1VUUFVUKTsKKwkJYXRoOWtfaHdfc2V0X2dwaW8oYWgsIGFoLT5sZWRfcGluLCAwKTsKKwl9CisKKwkvKgorCSAqIFJlc2V0IGtleSBjYWNoZSB0byBzYW5lIGRlZmF1bHRzIChhbGwgZW50cmllcyBjbGVhcmVkKSBpbnN0ZWFkIG9mCisJICogc2VtaS1yYW5kb20gdmFsdWVzIGFmdGVyIHN1c3BlbmQvcmVzdW1lLgorCSAqLworCWF0aDlrX2Ntbl9pbml0X2NyeXB0byhzYy0+c2NfYWgpOworCiAJc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAKLQlpZiAoKGFoLT5idGNvZXhfaHcuc2NoZW1lICE9IEFUSF9CVENPRVhfQ0ZHX05PTkUpICYmCisJaWYgKChhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgIT0gQVRIX0JUQ09FWF9DRkdfTk9ORSkgJiYKIAkgICAgIWFoLT5idGNvZXhfaHcuZW5hYmxlZCkgewotCQlhdGg5a19od19idGNvZXhfc2V0X3dlaWdodChhaCwgQVJfQlRfQ09FWF9XR0hULAotCQkJCQkgICBBUl9TVE9NUF9MT1dfV0xBTl9XR0hUKTsKKwkJaWYgKCEoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKSkKKwkJCWF0aDlrX2h3X2J0Y29leF9zZXRfd2VpZ2h0KGFoLCBBUl9CVF9DT0VYX1dHSFQsCisJCQkJCQkgICBBUl9TVE9NUF9MT1dfV0xBTl9XR0hUKTsKIAkJYXRoOWtfaHdfYnRjb2V4X2VuYWJsZShhaCk7CiAKLQkJaWYgKGFoLT5idGNvZXhfaHcuc2NoZW1lID09IEFUSF9CVENPRVhfQ0ZHXzNXSVJFKQorCQlpZiAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpID09IEFUSF9CVENPRVhfQ0ZHXzNXSVJFKQogCQkJYXRoOWtfYnRjb2V4X3RpbWVyX3Jlc3VtZShzYyk7CiAJfQogCkBAIC0xMTY3LDEyICsxMTE4LDE5IEBACiAJCWlmIChpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpICYmCiAJCSAgICAhaWVlZTgwMjExX2lzX251bGxmdW5jKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKIAkJICAgICFpZWVlODAyMTFfaGFzX3BtKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1BTLAorCQkJYXRoX2RiZyhjb21tb24sIFBTLAogCQkJCSJBZGQgUE09MSBmb3IgYSBUWCBmcmFtZSB3aGlsZSBpbiBQUyBtb2RlXG4iKTsKIAkJCWhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QTSk7CiAJCX0KIAl9CiAKKwkvKgorCSAqIENhbm5vdCB0eCB3aGlsZSB0aGUgaGFyZHdhcmUgaXMgaW4gZnVsbCBzbGVlcCwgaXQgZmlyc3QgbmVlZHMgYSBmdWxsCisJICogY2hpcCByZXNldCB0byByZWNvdmVyIGZyb20gdGhhdAorCSAqLworCWlmICh1bmxpa2VseShzYy0+c2NfYWgtPnBvd2VyX21vZGUgPT0gQVRIOUtfUE1fRlVMTF9TTEVFUCkpCisJCWdvdG8gZXhpdDsKKwogCWlmICh1bmxpa2VseShzYy0+c2NfYWgtPnBvd2VyX21vZGUgIT0gQVRIOUtfUE1fQVdBS0UpKSB7CiAJCS8qCiAJCSAqIFdlIGFyZSB1c2luZyBQUy1Qb2xsIGFuZCBtYWM4MDIxMSBjYW4gcmVxdWVzdCBUWCB3aGlsZSBpbgpAQCAtMTE4MywxMiArMTE0MSwxMSBAQAogCQlpZiAoIShzYy0+c2NfYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9BVVRPU0xFRVApKQogCQkJYXRoOWtfaHdfc2V0cnhhYm9ydChzYy0+c2NfYWgsIDApOwogCQlpZiAoaWVlZTgwMjExX2lzX3BzcG9sbChoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19QUywKKwkJCWF0aF9kYmcoY29tbW9uLCBQUywKIAkJCQkiU2VuZGluZyBQUy1Qb2xsIHRvIHBpY2sgYSBidWZmZXJlZCBmcmFtZVxuIik7CiAJCQlzYy0+cHNfZmxhZ3MgfD0gUFNfV0FJVF9GT1JfUFNQT0xMX0RBVEE7CiAJCX0gZWxzZSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19QUywKLQkJCQkiV2FrZSB1cCB0byBjb21wbGV0ZSBUWFxuIik7CisJCQlhdGhfZGJnKGNvbW1vbiwgUFMsICJXYWtlIHVwIHRvIGNvbXBsZXRlIFRYXG4iKTsKIAkJCXNjLT5wc19mbGFncyB8PSBQU19XQUlUX0ZPUl9UWF9BQ0s7CiAJCX0KIAkJLyoKQEAgLTEyMDIsMTAgKzExNTksMTAgQEAKIAltZW1zZXQoJnR4Y3RsLCAwLCBzaXplb2Yoc3RydWN0IGF0aF90eF9jb250cm9sKSk7CiAJdHhjdGwudHhxID0gc2MtPnR4LnR4cV9tYXBbc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYildOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfWE1JVCwgInRyYW5zbWl0dGluZyBwYWNrZXQsIHNrYjogJXBcbiIsIHNrYik7CisJYXRoX2RiZyhjb21tb24sIFhNSVQsICJ0cmFuc21pdHRpbmcgcGFja2V0LCBza2I6ICVwXG4iLCBza2IpOwogCiAJaWYgKGF0aF90eF9zdGFydChodywgc2tiLCAmdHhjdGwpICE9IDApIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfWE1JVCwgIlRYIGZhaWxlZFxuIik7CisJCWF0aF9kYmcoY29tbW9uLCBYTUlULCAiVFggZmFpbGVkXG4iKTsKIAkJZ290byBleGl0OwogCX0KIApAQCAtMTIxOSwxMyArMTE3NiwxNCBAQAogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CiAJc3RydWN0IGF0aF9odyAqYWggPSBzYy0+c2NfYWg7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihhaCk7CisJYm9vbCBwcmV2X2lkbGU7CiAKIAltdXRleF9sb2NrKCZzYy0+bXV0ZXgpOwogCiAJYXRoX2NhbmNlbF93b3JrKHNjKTsKIAogCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9JTlZBTElEKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOWSwgIkRldmljZSBub3QgcHJlc2VudFxuIik7CisJCWF0aF9kYmcoY29tbW9uLCBBTlksICJEZXZpY2Ugbm90IHByZXNlbnRcbiIpOwogCQltdXRleF91bmxvY2soJnNjLT5tdXRleCk7CiAJCXJldHVybjsKIAl9CkBAIC0xMjMzLDEwICsxMTkxLDEyIEBACiAJLyogRW5zdXJlIEhXIGlzIGF3YWtlIHdoZW4gd2UgdHJ5IHRvIHNodXQgaXQgZG93bi4gKi8KIAlhdGg5a19wc193YWtldXAoc2MpOwogCi0JaWYgKGFoLT5idGNvZXhfaHcuZW5hYmxlZCkgeworCWlmIChhaC0+YnRjb2V4X2h3LmVuYWJsZWQgJiYKKwkgICAgYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpICE9IEFUSF9CVENPRVhfQ0ZHX05PTkUpIHsKIAkJYXRoOWtfaHdfYnRjb2V4X2Rpc2FibGUoYWgpOwotCQlpZiAoYWgtPmJ0Y29leF9ody5zY2hlbWUgPT0gQVRIX0JUQ09FWF9DRkdfM1dJUkUpCisJCWlmIChhdGg5a19od19nZXRfYnRjb2V4X3NjaGVtZShhaCkgPT0gQVRIX0JUQ09FWF9DRkdfM1dJUkUpCiAJCQlhdGg5a19idGNvZXhfdGltZXJfcGF1c2Uoc2MpOworCQlhdGhfbWNpX2ZsdXNoX3Byb2ZpbGUoJnNjLT5idGNvZXgubWNpKTsKIAl9CiAKIAlzcGluX2xvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CkBAIC0xMjQ4LDIxICsxMjA4LDYgQEAKIAkgKiBiZWZvcmUgc2V0dGluZyB0aGUgaW52YWxpZCBmbGFnLiAqLwogCWF0aDlrX2h3X2Rpc2FibGVfaW50ZXJydXB0cyhhaCk7CiAKLQlpZiAoIShzYy0+c2NfZmxhZ3MgJiBTQ19PUF9JTlZBTElEKSkgewotCQlhdGhfZHJhaW5fYWxsX3R4cShzYywgZmFsc2UpOwotCQlhdGhfc3RvcHJlY3Yoc2MpOwotCQlhdGg5a19od19waHlfZGlzYWJsZShhaCk7Ci0JfSBlbHNlCi0JCXNjLT5yeC5yeGxpbmsgPSBOVUxMOwotCi0JaWYgKHNjLT5yeC5mcmFnKSB7Ci0JCWRldl9rZnJlZV9za2JfYW55KHNjLT5yeC5mcmFnKTsKLQkJc2MtPnJ4LmZyYWcgPSBOVUxMOwotCX0KLQotCS8qIGRpc2FibGUgSEFMIGFuZCBwdXQgaC93IHRvIHNsZWVwICovCi0JYXRoOWtfaHdfZGlzYWJsZShhaCk7Ci0KIAlzcGluX3VubG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKIAogCS8qIHdlIGNhbiBub3cgc3luYyBpcnEgYW5kIGtpbGwgYW55IHJ1bm5pbmcgdGFza2xldHMsIHNpbmNlIHdlIGFscmVhZHkKQEAgLTEyNzEsMTYgKzEyMTYsNDEgQEAKIAl0YXNrbGV0X2tpbGwoJnNjLT5pbnRyX3RxKTsKIAl0YXNrbGV0X2tpbGwoJnNjLT5iY29uX3Rhc2tsZXQpOwogCisJcHJldl9pZGxlID0gc2MtPnBzX2lkbGU7CisJc2MtPnBzX2lkbGUgPSB0cnVlOworCisJc3Bpbl9sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOworCisJaWYgKGFoLT5sZWRfcGluID49IDApIHsKKwkJYXRoOWtfaHdfc2V0X2dwaW8oYWgsIGFoLT5sZWRfcGluLCAxKTsKKwkJYXRoOWtfaHdfY2ZnX2dwaW9faW5wdXQoYWgsIGFoLT5sZWRfcGluKTsKKwl9CisKKwlhdGhfcHJlcGFyZV9yZXNldChzYywgZmFsc2UsIHRydWUpOworCisJaWYgKHNjLT5yeC5mcmFnKSB7CisJCWRldl9rZnJlZV9za2JfYW55KHNjLT5yeC5mcmFnKTsKKwkJc2MtPnJ4LmZyYWcgPSBOVUxMOworCX0KKworCWlmICghYWgtPmN1cmNoYW4pCisJCWFoLT5jdXJjaGFuID0gYXRoOWtfY21uX2dldF9jdXJjaGFubmVsKGh3LCBhaCk7CisKKwlhdGg5a19od19yZXNldChhaCwgYWgtPmN1cmNoYW4sIGFoLT5jYWxkYXRhLCBmYWxzZSk7CisJYXRoOWtfaHdfcGh5X2Rpc2FibGUoYWgpOworCisJYXRoOWtfaHdfY29uZmlncGNpcG93ZXJzYXZlKGFoLCB0cnVlKTsKKworCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOworCiAJYXRoOWtfcHNfcmVzdG9yZShzYyk7CiAKLQlzYy0+cHNfaWRsZSA9IHRydWU7Ci0JYXRoX3JhZGlvX2Rpc2FibGUoc2MsIGh3KTsKLQogCXNjLT5zY19mbGFncyB8PSBTQ19PUF9JTlZBTElEOworCXNjLT5wc19pZGxlID0gcHJldl9pZGxlOwogCiAJbXV0ZXhfdW5sb2NrKCZzYy0+bXV0ZXgpOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLCAiRHJpdmVyIGhhbHRcbiIpOworCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJEcml2ZXIgaGFsdFxuIik7CiB9CiAKIGJvb2wgYXRoOWtfdXNlc19iZWFjb25zKGludCB0eXBlKQpAQCAtMTQ5NSw4ICsxNDY1LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkiQXR0YWNoIGEgVklGIG9mIHR5cGU6ICVkXG4iLCB2aWYtPnR5cGUpOworCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJBdHRhY2ggYSBWSUYgb2YgdHlwZTogJWRcbiIsIHZpZi0+dHlwZSk7CiAKIAlzYy0+bnZpZnMrKzsKIApAQCAtMTUxNiw3ICsxNDg1LDcgQEAKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CiAJaW50IHJldCA9IDA7CiAKLQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJDaGFuZ2UgSW50ZXJmYWNlXG4iKTsKKwlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiQ2hhbmdlIEludGVyZmFjZVxuIik7CiAJbXV0ZXhfbG9jaygmc2MtPm11dGV4KTsKIAlhdGg5a19wc193YWtldXAoc2MpOwogCkBAIC0xNTU5LDcgKzE1MjgsNyBAQAogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CiAJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLCAiRGV0YWNoIEludGVyZmFjZVxuIik7CisJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIkRldGFjaCBJbnRlcmZhY2VcbiIpOwogCiAJYXRoOWtfcHNfd2FrZXVwKHNjKTsKIAltdXRleF9sb2NrKCZzYy0+bXV0ZXgpOwpAQCAtMTYxNiw4ICsxNTg1LDggQEAKIAlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7Ci0JYm9vbCBkaXNhYmxlX3JhZGlvID0gZmFsc2U7CiAKKwlhdGg5a19wc193YWtldXAoc2MpOwogCW11dGV4X2xvY2soJnNjLT5tdXRleCk7CiAKIAkvKgpAQCAtMTYyOCwxMyArMTU5Nyw4IEBACiAJICovCiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfSURMRSkgewogCQlzYy0+cHNfaWRsZSA9ICEhKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfSURMRSk7Ci0JCWlmICghc2MtPnBzX2lkbGUpIHsKLQkJCWF0aF9yYWRpb19lbmFibGUoc2MsIGh3KTsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJCQkibm90LWlkbGU6IGVuYWJsaW5nIHJhZGlvXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWRpc2FibGVfcmFkaW8gPSB0cnVlOwotCQl9CisJCWlmIChzYy0+cHNfaWRsZSkKKwkJCWF0aF9jYW5jZWxfd29yayhzYyk7CiAJfQogCiAJLyoKQEAgLTE2NTUsMTIgKzE2MTksMTAgQEAKIAogCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX01PTklUT1IpIHsKIAkJaWYgKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfTU9OSVRPUikgewotCQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkJCSJNb25pdG9yIG1vZGUgaXMgZW5hYmxlZFxuIik7CisJCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiTW9uaXRvciBtb2RlIGlzIGVuYWJsZWRcbiIpOwogCQkJc2MtPnNjX2FoLT5pc19tb25pdG9yaW5nID0gdHJ1ZTsKIAkJfSBlbHNlIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJCQkiTW9uaXRvciBtb2RlIGlzIGRpc2FibGVkXG4iKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJNb25pdG9yIG1vZGUgaXMgZGlzYWJsZWRcbiIpOwogCQkJc2MtPnNjX2FoLT5pc19tb25pdG9yaW5nID0gZmFsc2U7CiAJCX0KIAl9CkBAIC0xNjgwLDggKzE2NDIsNyBAQAogCQllbHNlCiAJCQlzYy0+c2NfZmxhZ3MgJj0gflNDX09QX09GRkNIQU5ORUw7CiAKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkJIlNldCBjaGFubmVsOiAlZCBNSHogdHlwZTogJWRcbiIsCisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJTZXQgY2hhbm5lbDogJWQgTUh6IHR5cGU6ICVkXG4iLAogCQkJY3VyY2hhbi0+Y2VudGVyX2ZyZXEsIGNvbmYtPmNoYW5uZWxfdHlwZSk7CiAKIAkJLyogdXBkYXRlIHN1cnZleSBzdGF0cyBmb3IgdGhlIG9sZCBjaGFubmVsIGJlZm9yZSBzd2l0Y2hpbmcgKi8KQEAgLTE3MzgsMjEgKzE2OTksMTQgQEAKIAl9CiAKIAlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QT1dFUikgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsCi0JCQkiU2V0IHBvd2VyOiAlZFxuIiwgY29uZi0+cG93ZXJfbGV2ZWwpOworCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiU2V0IHBvd2VyOiAlZFxuIiwgY29uZi0+cG93ZXJfbGV2ZWwpOwogCQlzYy0+Y29uZmlnLnR4cG93bGltaXQgPSAyICogY29uZi0+cG93ZXJfbGV2ZWw7Ci0JCWF0aDlrX3BzX3dha2V1cChzYyk7CiAJCWF0aDlrX2Ntbl91cGRhdGVfdHhwb3coYWgsIHNjLT5jdXJ0eHBvdywKIAkJCQkgICAgICAgc2MtPmNvbmZpZy50eHBvd2xpbWl0LCAmc2MtPmN1cnR4cG93KTsKLQkJYXRoOWtfcHNfcmVzdG9yZShzYyk7Ci0JfQotCi0JaWYgKGRpc2FibGVfcmFkaW8pIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLCAiaWRsZTogZGlzYWJsaW5nIHJhZGlvXG4iKTsKLQkJYXRoX3JhZGlvX2Rpc2FibGUoc2MsIGh3KTsKIAl9CiAKIAltdXRleF91bmxvY2soJnNjLT5tdXRleCk7CisJYXRoOWtfcHNfcmVzdG9yZShzYyk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3ODUsOCArMTczOSw4IEBACiAJYXRoOWtfaHdfc2V0cnhmaWx0ZXIoc2MtPnNjX2FoLCByZmlsdCk7CiAJYXRoOWtfcHNfcmVzdG9yZShzYyk7CiAKLQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpLCBBVEhfREJHX0NPTkZJRywKLQkJIlNldCBIVyBSWCBmaWx0ZXI6IDB4JXhcbiIsIHJmaWx0KTsKKwlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpLCBDT05GSUcsICJTZXQgSFcgUlggZmlsdGVyOiAweCV4XG4iLAorCQlyZmlsdCk7CiB9CiAKIHN0YXRpYyBpbnQgYXRoOWtfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKQEAgLTE3OTgsNyArMTc1Miw3IEBACiAJc3RydWN0IGF0aF9ub2RlICphbiA9IChzdHJ1Y3QgYXRoX25vZGUgKikgc3RhLT5kcnZfcHJpdjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mIHBzX2tleSA9IHsgfTsKIAotCWF0aF9ub2RlX2F0dGFjaChzYywgc3RhKTsKKwlhdGhfbm9kZV9hdHRhY2goc2MsIHN0YSwgdmlmKTsKIAogCWlmICh2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKIAkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCkBAIC0xODQzLDYgKzE3OTcsOSBAQAogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CiAJc3RydWN0IGF0aF9ub2RlICphbiA9IChzdHJ1Y3QgYXRoX25vZGUgKikgc3RhLT5kcnZfcHJpdjsKIAorCWlmICghKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikpCisJCXJldHVybjsKKwogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTVEFfTk9USUZZX1NMRUVQOgogCQlhbi0+c2xlZXBpbmcgPSB0cnVlOwpAQCAtMTg4MCw3ICsxODM3LDcgQEAKIAlxaS50cWlfY3dtYXggPSBwYXJhbXMtPmN3X21heDsKIAlxaS50cWlfYnVyc3RUaW1lID0gcGFyYW1zLT50eG9wOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAorCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsCiAJCSJDb25maWd1cmUgdHggW3F1ZXVlL2hhbHFdIFslZC8lZF0sIGFpZnM6ICVkLCBjd19taW46ICVkLCBjd19tYXg6ICVkLCB0eG9wOiAlZFxuIiwKIAkJcXVldWUsIHR4cS0+YXhxX3FudW0sIHBhcmFtcy0+YWlmcywgcGFyYW1zLT5jd19taW4sCiAJCXBhcmFtcy0+Y3dfbWF4LCBwYXJhbXMtPnR4b3ApOwpAQCAtMTkxMiw3ICsxODY5LDggQEAKIAlpZiAoYXRoOWtfbW9kcGFyYW1fbm9od2NyeXB0KQogCQlyZXR1cm4gLUVOT1NQQzsKIAotCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKKwlpZiAoKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fAorCSAgICAgdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpICYmCiAJICAgIChrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9US0lQIHx8CiAJICAgICBrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QKSAmJgogCSAgICAhKGtleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfUEFJUldJU0UpKSB7CkBAIC0xOTI4LDcgKzE4ODYsNyBAQAogCiAJbXV0ZXhfbG9jaygmc2MtPm11dGV4KTsKIAlhdGg5a19wc193YWtldXAoc2MpOwotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywgIlNldCBIVyBLZXlcbiIpOworCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJTZXQgSFcgS2V5XG4iKTsKIAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBTRVRfS0VZOgpAQCAtMTk4MCw5ICsxOTM4LDggQEAKIAkJbWVtY3B5KGNvbW1vbi0+Y3VyYnNzaWQsIGJzc19jb25mLT5ic3NpZCwgRVRIX0FMRU4pOwogCQljb21tb24tPmN1cmFpZCA9IGJzc19jb25mLT5haWQ7CiAJCWF0aDlrX2h3X3dyaXRlX2Fzc29jaWQoc2MtPnNjX2FoKTsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQ09ORklHLAotCQkJCSJCc3MgSW5mbyBBU1NPQyAlZCwgYnNzaWQ6ICVwTVxuIiwKLQkJCQlic3NfY29uZi0+YWlkLCBjb21tb24tPmN1cmJzc2lkKTsKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIkJzcyBJbmZvIEFTU09DICVkLCBic3NpZDogJXBNXG4iLAorCQkJYnNzX2NvbmYtPmFpZCwgY29tbW9uLT5jdXJic3NpZCk7CiAJCWF0aF9iZWFjb25fY29uZmlnKHNjLCB2aWYpOwogCQkvKgogCQkgKiBSZXF1ZXN0IGEgcmUtY29uZmlndXJhdGlvbiBvZiBCZWFjb24gcmVsYXRlZCB0aW1lcnMKQEAgLTIwMTMsOCArMTk3MCw3IEBACiAKIAkvKiBSZWNvbmZpZ3VyZSBic3MgaW5mbyAqLwogCWlmIChhdnAtPnByaW1hcnlfc3RhX3ZpZiAmJiAhYnNzX2NvbmYtPmFzc29jKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJCSJCc3MgSW5mbyBESVNBU1NPQyAlZCwgYnNzaWQgJXBNXG4iLAorCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiQnNzIEluZm8gRElTQVNTT0MgJWQsIGJzc2lkICVwTVxuIiwKIAkJCWNvbW1vbi0+Y3VyYWlkLCBjb21tb24tPmN1cmJzc2lkKTsKIAkJc2MtPnNjX2ZsYWdzICY9IH4oU0NfT1BfUFJJTV9TVEFfVklGIHwgU0NfT1BfQkVBQ09OUyk7CiAJCWF2cC0+cHJpbWFyeV9zdGFfdmlmID0gZmFsc2U7CkBAIC0yMDU2LDcgKzIwMTIsNyBAQAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQlNTSUQpIHsKIAkJYXRoOWtfY29uZmlnX2JzcyhzYywgdmlmKTsKIAotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJCU1NJRDogJXBNIGFpZDogMHgleFxuIiwKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIkJTU0lEOiAlcE0gYWlkOiAweCV4XG4iLAogCQkJY29tbW9uLT5jdXJic3NpZCwgY29tbW9uLT5jdXJhaWQpOwogCX0KIApAQCAtMjEzNCw3ICsyMDkwLDcgQEAKIAl9CiAKIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRSkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJCU1MgQ2hhbmdlZCBQUkVBTUJMRSAlZFxuIiwKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIkJTUyBDaGFuZ2VkIFBSRUFNQkxFICVkXG4iLAogCQkJYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSk7CiAJCWlmIChic3NfY29uZi0+dXNlX3Nob3J0X3ByZWFtYmxlKQogCQkJc2MtPnNjX2ZsYWdzIHw9IFNDX09QX1BSRUFNQkxFX1NIT1JUOwpAQCAtMjE0Myw3ICsyMDk5LDcgQEAKIAl9CiAKIAlpZiAoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0VSUF9DVFNfUFJPVCkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJCU1MgQ2hhbmdlZCBDVFMgUFJPVCAlZFxuIiwKKwkJYXRoX2RiZyhjb21tb24sIENPTkZJRywgIkJTUyBDaGFuZ2VkIENUUyBQUk9UICVkXG4iLAogCQkJYnNzX2NvbmYtPnVzZV9jdHNfcHJvdCk7CiAJCWlmIChic3NfY29uZi0+dXNlX2N0c19wcm90ICYmCiAJCSAgICBody0+Y29uZi5jaGFubmVsLT5iYW5kICE9IElFRUU4MDIxMV9CQU5EXzVHSFopCkBAIC0yMzA5LDIwICsyMjY1LDE3IEBACiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZzYy0+dHhfY29tcGxldGVfd29yayk7CiAKIAlpZiAoYWgtPmFoX2ZsYWdzICYgQUhfVU5QTFVHR0VEKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOWSwgIkRldmljZSBoYXMgYmVlbiB1bnBsdWdnZWQhXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIEFOWSwgIkRldmljZSBoYXMgYmVlbiB1bnBsdWdnZWQhXG4iKTsKIAkJbXV0ZXhfdW5sb2NrKCZzYy0+bXV0ZXgpOwogCQlyZXR1cm47CiAJfQogCiAJaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX0lOVkFMSUQpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfQU5ZLCAiRGV2aWNlIG5vdCBwcmVzZW50XG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIEFOWSwgIkRldmljZSBub3QgcHJlc2VudFxuIik7CiAJCW11dGV4X3VubG9jaygmc2MtPm11dGV4KTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChkcm9wKQotCQl0aW1lb3V0ID0gMTsKLQogCWZvciAoaiA9IDA7IGogPCB0aW1lb3V0OyBqKyspIHsKIAkJYm9vbCBucGVuZCA9IGZhbHNlOwogCkBAIC0yMzQwLDIxICsyMjkzLDIyIEBACiAJCX0KIAogCQlpZiAoIW5wZW5kKQotCQkgICAgZ290byBvdXQ7CisJCSAgICBicmVhazsKIAl9CiAKLQlhdGg5a19wc193YWtldXAoc2MpOwotCXNwaW5fbG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKLQlkcmFpbl90eHEgPSBhdGhfZHJhaW5fYWxsX3R4cShzYywgZmFsc2UpOwotCXNwaW5fdW5sb2NrX2JoKCZzYy0+c2NfcGN1X2xvY2spOworCWlmIChkcm9wKSB7CisJCWF0aDlrX3BzX3dha2V1cChzYyk7CisJCXNwaW5fbG9ja19iaCgmc2MtPnNjX3BjdV9sb2NrKTsKKwkJZHJhaW5fdHhxID0gYXRoX2RyYWluX2FsbF90eHEoc2MsIGZhbHNlKTsKKwkJc3Bpbl91bmxvY2tfYmgoJnNjLT5zY19wY3VfbG9jayk7CiAKLQlpZiAoIWRyYWluX3R4cSkKLQkJYXRoX3Jlc2V0KHNjLCBmYWxzZSk7CisJCWlmICghZHJhaW5fdHhxKQorCQkJYXRoX3Jlc2V0KHNjLCBmYWxzZSk7CiAKLQlhdGg5a19wc19yZXN0b3JlKHNjKTsKLQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMoaHcpOworCQlhdGg5a19wc19yZXN0b3JlKHNjKTsKKwkJaWVlZTgwMjExX3dha2VfcXVldWVzKGh3KTsKKwl9CiAKLW91dDoKIAlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKGh3LCAmc2MtPnR4X2NvbXBsZXRlX3dvcmssIDApOwogCW11dGV4X3VubG9jaygmc2MtPm11dGV4KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWMyM2VhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL21jaS5jCkBAIC0wLDAgKzEsNjY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMTEgQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiYXRoOWsuaCIKKyNpbmNsdWRlICJtY2kuaCIKKworc3RhdGljIGNvbnN0IHU4IGF0aF9tY2lfZHV0eV9jeWNsZVtdID0geyAwLCA1MCwgNjAsIDcwLCA4MCwgODUsIDkwLCA5NSwgOTggfTsKKworc3RhdGljIHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyoKK2F0aF9tY2lfZmluZF9wcm9maWxlKHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgKm1jaSwKKwkJICAgICBzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8gKmluZm8pCit7CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9pbmZvICplbnRyeTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZtY2ktPmluZm8sIGxpc3QpIHsKKwkJaWYgKGVudHJ5LT5jb25uX2hhbmRsZSA9PSBpbmZvLT5jb25uX2hhbmRsZSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZW50cnk7Cit9CisKK3N0YXRpYyBib29sIGF0aF9tY2lfYWRkX3Byb2ZpbGUoc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiwKKwkJCQlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlICptY2ksCisJCQkJc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9pbmZvICppbmZvKQoreworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyAqZW50cnk7CisKKwlpZiAoKG1jaS0+bnVtX3NjbyA9PSBBVEhfTUNJX01BWF9TQ09fUFJPRklMRSkgJiYKKwkgICAgKGluZm8tPnR5cGUgPT0gTUNJX0dQTV9DT0VYX1BST0ZJTEVfVk9JQ0UpKSB7CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkiVG9vIG1hbnkgU0NPIHByb2ZpbGUsIGZhaWxlZCB0byBhZGQgbmV3IHByb2ZpbGVcbiIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCgoTlVNX1BST0YobWNpKSAtIG1jaS0+bnVtX3NjbykgPT0gQVRIX01DSV9NQVhfQUNMX1BST0ZJTEUpICYmCisJICAgIChpbmZvLT50eXBlICE9IE1DSV9HUE1fQ09FWF9QUk9GSUxFX1ZPSUNFKSkgeworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJIlRvbyBtYW55IEFDTCBwcm9maWxlLCBmYWlsZWQgdG8gYWRkIG5ldyBwcm9maWxlXG4iKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCWVudHJ5ID0gYXRoX21jaV9maW5kX3Byb2ZpbGUobWNpLCBpbmZvKTsKKworCWlmIChlbnRyeSkKKwkJbWVtY3B5KGVudHJ5LCBpbmZvLCAxMCk7CisJZWxzZSB7CisJCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZW50cnkpCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJbWVtY3B5KGVudHJ5LCBpbmZvLCAxMCk7CisJCUlOQ19QUk9GKG1jaSwgaW5mbyk7CisJCWxpc3RfYWRkX3RhaWwoJmluZm8tPmxpc3QsICZtY2ktPmluZm8pOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYXRoX21jaV9kZWxfcHJvZmlsZShzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uLAorCQkJCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgKm1jaSwKKwkJCQlzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8gKmluZm8pCit7CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9pbmZvICplbnRyeTsKKworCWVudHJ5ID0gYXRoX21jaV9maW5kX3Byb2ZpbGUobWNpLCBpbmZvKTsKKworCWlmICghZW50cnkpIHsKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIlByb2ZpbGUgdG8gYmUgZGVsZXRlZCBub3QgZm91bmRcbiIpOworCQlyZXR1cm47CisJfQorCURFQ19QUk9GKG1jaSwgZW50cnkpOworCWxpc3RfZGVsKCZlbnRyeS0+bGlzdCk7CisJa2ZyZWUoZW50cnkpOworfQorCit2b2lkIGF0aF9tY2lfZmx1c2hfcHJvZmlsZShzdHJ1Y3QgYXRoX21jaV9wcm9maWxlICptY2kpCit7CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9pbmZvICppbmZvLCAqdGluZm87CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaW5mbywgdGluZm8sICZtY2ktPmluZm8sIGxpc3QpIHsKKwkJbGlzdF9kZWwoJmluZm8tPmxpc3QpOworCQlERUNfUFJPRihtY2ksIGluZm8pOworCQlrZnJlZShpbmZvKTsKKwl9CisJbWNpLT5hZ2dyX2xpbWl0ID0gMDsKK30KKworc3RhdGljIHZvaWQgYXRoX21jaV9hZGp1c3RfYWdncl9saW1pdChzdHJ1Y3QgYXRoX2J0Y29leCAqYnRjb2V4KQoreworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgKm1jaSA9ICZidGNvZXgtPm1jaTsKKwl1MzIgd2xhbl9haXJ0aW1lID0gYnRjb2V4LT5idGNvZXhfcGVyaW9kICoKKwkJCQkoMTAwIC0gYnRjb2V4LT5kdXR5X2N5Y2xlKSAvIDEwMDsKKworCS8qCisJICogU2NhbGU6IHdsYW5fYWlydGltZSBpcyBpbiBtcywgYWdncl9saW1pdCBpcyBpbiAwLjI1IG1zLgorCSAqIFdoZW4gd2xhbl9haXJ0aW1lIGlzIGxlc3MgdGhhbiA0bXMsIGFnZ3JlZ2F0aW9uIGxpbWl0IGhhcyB0byBiZQorCSAqIGFkanVzdGVkIGhhbGYgb2Ygd2xhbl9haXJ0aW1lIHRvIGVuc3VyZSB0aGF0IHRoZSBhZ2dyZWdhdGlvbiBjYW4gZml0CisJICogd2l0aG91dCBjb2xsaXNpb24gd2l0aCBCVCB0cmFmZmljLgorCSAqLworCWlmICgod2xhbl9haXJ0aW1lIDw9IDQpICYmCisJICAgICghbWNpLT5hZ2dyX2xpbWl0IHx8IChtY2ktPmFnZ3JfbGltaXQgPiAoMiAqIHdsYW5fYWlydGltZSkpKSkKKwkJbWNpLT5hZ2dyX2xpbWl0ID0gMiAqIHdsYW5fYWlydGltZTsKK30KKworc3RhdGljIHZvaWQgYXRoX21jaV91cGRhdGVfc2NoZW1lKHN0cnVjdCBhdGhfc29mdGMgKnNjKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oc2MtPnNjX2FoKTsKKwlzdHJ1Y3QgYXRoX2J0Y29leCAqYnRjb2V4ID0gJnNjLT5idGNvZXg7CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZSAqbWNpID0gJmJ0Y29leC0+bWNpOworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyAqaW5mbzsKKwl1MzIgbnVtX3Byb2ZpbGUgPSBOVU1fUFJPRihtY2kpOworCisJaWYgKG51bV9wcm9maWxlID09IDEpIHsKKwkJaW5mbyA9IGxpc3RfZmlyc3RfZW50cnkoJm1jaS0+aW5mbywKKwkJCQkJc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9pbmZvLAorCQkJCQlsaXN0KTsKKwkJaWYgKG1jaS0+bnVtX3NjbyAmJiBpbmZvLT5UID09IDEyKSB7CisJCQltY2ktPmFnZ3JfbGltaXQgPSA4OworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkiU2luZ2xlIFNDTywgYWdncmVnYXRpb24gbGltaXQgMiBtc1xuIik7CisJCX0gZWxzZSBpZiAoKGluZm8tPnR5cGUgPT0gTUNJX0dQTV9DT0VYX1BST0ZJTEVfQk5FUCkgJiYKKwkJCSAgICFpbmZvLT5tYXN0ZXIpIHsKKwkJCWJ0Y29leC0+YnRjb2V4X3BlcmlvZCA9IDYwOworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkiU2luZ2xlIHNsYXZlIFBBTi9GVFAsIGJ0IHBlcmlvZCA2MCBtc1xuIik7CisJCX0gZWxzZSBpZiAoKGluZm8tPnR5cGUgPT0gTUNJX0dQTV9DT0VYX1BST0ZJTEVfSElEKSAmJgorCQkJIChpbmZvLT5UID4gMCAmJiBpbmZvLT5UIDwgNTApICYmCisJCQkgKGluZm8tPkEgPiAxIHx8IGluZm8tPlcgPiAxKSkgeworCQkJYnRjb2V4LT5kdXR5X2N5Y2xlID0gMzA7CisJCQltY2ktPmFnZ3JfbGltaXQgPSA4OworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkiTXVsdGlwbGUgYXR0ZW1wdC90aW1lb3V0IHNpbmdsZSBISUQgIgorCQkJCSJhZ2dyZWdhdGlvbiBsaW1pdCAyIG1zIGR1dHljeWNsZSAzMCUlXG4iKTsKKwkJfQorCX0gZWxzZSBpZiAoKG51bV9wcm9maWxlID09IDIpICYmIChtY2ktPm51bV9oaWQgPT0gMikpIHsKKwkJYnRjb2V4LT5kdXR5X2N5Y2xlID0gMzA7CisJCW1jaS0+YWdncl9saW1pdCA9IDg7CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkiVHdvIEhJRHMgYWdncmVnYXRpb24gbGltaXQgMiBtcyBkdXR5Y3ljbGUgMzAlJVxuIik7CisJfSBlbHNlIGlmIChudW1fcHJvZmlsZSA+IDMpIHsKKwkJbWNpLT5hZ2dyX2xpbWl0ID0gNjsKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCSJUaHJlZSBvciBtb3JlIHByb2ZpbGVzIGFnZ3JlZ2F0aW9uIGxpbWl0IDEuNSBtc1xuIik7CisJfQorCisJaWYgKElTX0NIQU5fMkdIWihzYy0+c2NfYWgtPmN1cmNoYW4pKSB7CisJCWlmIChJU19DSEFOX0hUKHNjLT5zY19haC0+Y3VyY2hhbikpCisJCQlhdGhfbWNpX2FkanVzdF9hZ2dyX2xpbWl0KGJ0Y29leCk7CisJCWVsc2UKKwkJCWJ0Y29leC0+YnRjb2V4X3BlcmlvZCA+Pj0gMTsKKwl9CisKKwlhdGg5a19od19idGNvZXhfZGlzYWJsZShzYy0+c2NfYWgpOworCWF0aDlrX2J0Y29leF90aW1lcl9wYXVzZShzYyk7CisKKwlpZiAoSVNfQ0hBTl81R0haKHNjLT5zY19haC0+Y3VyY2hhbikpCisJCXJldHVybjsKKworCWJ0Y29leC0+ZHV0eV9jeWNsZSArPSAobWNpLT5udW1fYmRyID8gQVRIX01DSV9NQVhfRFVUWV9DWUNMRSA6IDApOworCWlmIChidGNvZXgtPmR1dHlfY3ljbGUgPiBBVEhfTUNJX01BWF9EVVRZX0NZQ0xFKQorCQlidGNvZXgtPmR1dHlfY3ljbGUgPSBBVEhfTUNJX01BWF9EVVRZX0NZQ0xFOworCisJYnRjb2V4LT5idGNvZXhfcGVyaW9kICo9IDEwMDA7CisJYnRjb2V4LT5idGNvZXhfbm9fc3RvbXAgPSAgYnRjb2V4LT5idGNvZXhfcGVyaW9kICoKKwkJCQkJKDEwMCAtIGJ0Y29leC0+ZHV0eV9jeWNsZSkgLyAxMDA7CisKKwlhdGg5a19od19idGNvZXhfZW5hYmxlKHNjLT5zY19haCk7CisJYXRoOWtfYnRjb2V4X3RpbWVyX3Jlc3VtZShzYyk7Cit9CisKKworc3RhdGljIHZvaWQgYXRoX21jaV9jYWxfbXNnKHN0cnVjdCBhdGhfc29mdGMgKnNjLCB1OCBvcGNvZGUsIHU4ICpyeF9wYXlsb2FkKQoreworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oYWgpOworCXUzMiBwYXlsb2FkWzRdID0gezAsIDAsIDAsIDB9OworCisJc3dpdGNoIChvcGNvZGUpIHsKKwljYXNlIE1DSV9HUE1fQlRfQ0FMX1JFUToKKworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIHJlY2VpdmVkIEJUX0NBTF9SRVFcbiIpOworCisJCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfQlQsIE5VTEwpID09IE1DSV9CVF9BV0FLRSkgeworCQkJYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX1NFVF9CVF9DQUxfU1RBUlQsIE5VTEwpOworCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoc2MtPmh3LCAmc2MtPmh3X3Jlc2V0X3dvcmspOworCQl9IGVsc2UKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgU3RhdGUgbWlzbWF0Y2hlczogJWRcbiIsCisJCQkJYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX0JULCBOVUxMKSk7CisKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9HUE1fQlRfQ0FMX0RPTkU6CisKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSByZWNlaXZlZCBCVF9DQUxfRE9ORVxuIik7CisKKwkJaWYgKGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9CVCwgTlVMTCkgPT0gTUNJX0JUX0NBTCkKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgZXJyb3IgaWxsZWdhbCFcbiIpOworCQllbHNlCisJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIEJUIG5vdCBpbiBDQUwgc3RhdGVcbiIpOworCisJCWJyZWFrOworCisJY2FzZSBNQ0lfR1BNX0JUX0NBTF9HUkFOVDoKKworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIHJlY2VpdmVkIEJUX0NBTF9HUkFOVFxuIik7CisKKwkJLyogU2VuZCBXTEFOX0NBTF9ET05FIGZvciBub3cgKi8KKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBzZW5kIFdMQU5fQ0FMX0RPTkVcbiIpOworCQlNQ0lfR1BNX1NFVF9DQUxfVFlQRShwYXlsb2FkLCBNQ0lfR1BNX1dMQU5fQ0FMX0RPTkUpOworCQlhcjkwMDNfbWNpX3NlbmRfbWVzc2FnZShzYy0+c2NfYWgsIE1DSV9HUE0sIDAsIHBheWxvYWQsCisJCQkJCTE2LCBmYWxzZSwgdHJ1ZSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBVbmtub3duIEdQTSBDQUwgbWVzc2FnZVxuIik7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgYXRoX21jaV9wcm9jZXNzX3Byb2ZpbGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsCisJCQkJICAgIHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCk7CisJc3RydWN0IGF0aF9idGNvZXggKmJ0Y29leCA9ICZzYy0+YnRjb2V4OworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgKm1jaSA9ICZidGNvZXgtPm1jaTsKKworCWlmIChpbmZvLT5zdGFydCkgeworCQlpZiAoIWF0aF9tY2lfYWRkX3Byb2ZpbGUoY29tbW9uLCBtY2ksIGluZm8pKQorCQkJcmV0dXJuOworCX0gZWxzZQorCQlhdGhfbWNpX2RlbF9wcm9maWxlKGNvbW1vbiwgbWNpLCBpbmZvKTsKKworCWJ0Y29leC0+YnRjb2V4X3BlcmlvZCA9IEFUSF9NQ0lfREVGX0JUX1BFUklPRDsKKwltY2ktPmFnZ3JfbGltaXQgPSBtY2ktPm51bV9zY28gPyA2IDogMDsKKwlpZiAoTlVNX1BST0YobWNpKSkgeworCQlidGNvZXgtPmJ0X3N0b21wX3R5cGUgPSBBVEhfQlRDT0VYX1NUT01QX0xPVzsKKwkJYnRjb2V4LT5kdXR5X2N5Y2xlID0gYXRoX21jaV9kdXR5X2N5Y2xlW05VTV9QUk9GKG1jaSldOworCX0gZWxzZSB7CisJCWJ0Y29leC0+YnRfc3RvbXBfdHlwZSA9IG1jaS0+bnVtX21nbXQgPyBBVEhfQlRDT0VYX1NUT01QX0FMTCA6CisJCQkJCQkJQVRIX0JUQ09FWF9TVE9NUF9MT1c7CisJCWJ0Y29leC0+ZHV0eV9jeWNsZSA9IEFUSF9CVENPRVhfREVGX0RVVFlfQ1lDTEU7CisJfQorCisJYXRoX21jaV91cGRhdGVfc2NoZW1lKHNjKTsKK30KKworc3RhdGljIHZvaWQgYXRoX21jaV9wcm9jZXNzX3N0YXR1cyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywKKwkJCQkgICBzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX3N0YXR1cyAqc3RhdHVzKQoreworCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oc2MtPnNjX2FoKTsKKwlzdHJ1Y3QgYXRoX2J0Y29leCAqYnRjb2V4ID0gJnNjLT5idGNvZXg7CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZSAqbWNpID0gJmJ0Y29leC0+bWNpOworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyBpbmZvOworCWludCBpID0gMCwgb2xkX251bV9tZ210ID0gbWNpLT5udW1fbWdtdDsKKworCS8qIExpbmsgc3RhdHVzIHR5cGUgYXJlIG5vdCBoYW5kbGVkICovCisJaWYgKHN0YXR1cy0+aXNfbGluaykgeworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiU2tpcCBsaW5rIHR5cGUgc3RhdHVzIHVwZGF0ZVxuIik7CisJCXJldHVybjsKKwl9CisKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihzdHJ1Y3QgYXRoX21jaV9wcm9maWxlX2luZm8pKTsKKworCWluZm8uY29ubl9oYW5kbGUgPSBzdGF0dXMtPmNvbm5faGFuZGxlOworCWlmIChhdGhfbWNpX2ZpbmRfcHJvZmlsZShtY2ksICZpbmZvKSkgeworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJIlNraXAgbm9uIGxpbmsgc3RhdGUgdXBkYXRlIGZvciBleGlzdGluZyBwcm9maWxlICVkXG4iLAorCQkJc3RhdHVzLT5jb25uX2hhbmRsZSk7CisJCXJldHVybjsKKwl9CisJaWYgKHN0YXR1cy0+Y29ubl9oYW5kbGUgPj0gQVRIX01DSV9NQVhfUFJPRklMRSkgeworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiSWdub3JlIHRvbyBtYW55IG5vbi1saW5rIHVwZGF0ZVxuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHN0YXR1cy0+aXNfY3JpdGljYWwpCisJCV9fc2V0X2JpdChzdGF0dXMtPmNvbm5faGFuZGxlLCBtY2ktPnN0YXR1cyk7CisJZWxzZQorCQlfX2NsZWFyX2JpdChzdGF0dXMtPmNvbm5faGFuZGxlLCBtY2ktPnN0YXR1cyk7CisKKwltY2ktPm51bV9tZ210ID0gMDsKKwlkbyB7CisJCWlmICh0ZXN0X2JpdChpLCBtY2ktPnN0YXR1cykpCisJCQltY2ktPm51bV9tZ210Kys7CisJfSB3aGlsZSAoKytpIDwgQVRIX01DSV9NQVhfUFJPRklMRSk7CisKKwlpZiAob2xkX251bV9tZ210ICE9IG1jaS0+bnVtX21nbXQpCisJCWF0aF9tY2lfdXBkYXRlX3NjaGVtZShzYyk7Cit9CisKK3N0YXRpYyB2b2lkIGF0aF9tY2lfbXNnKHN0cnVjdCBhdGhfc29mdGMgKnNjLCB1OCBvcGNvZGUsIHU4ICpyeF9wYXlsb2FkKQoreworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyBwcm9maWxlX2luZm87CisJc3RydWN0IGF0aF9tY2lfcHJvZmlsZV9zdGF0dXMgcHJvZmlsZV9zdGF0dXM7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOworCXUzMiB2ZXJzaW9uOworCXU4IG1ham9yOworCXU4IG1pbm9yOworCXUzMiBzZXFfbnVtOworCisJc3dpdGNoIChvcGNvZGUpIHsKKworCWNhc2UgTUNJX0dQTV9DT0VYX1ZFUlNJT05fUVVFUlk6CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgUmVjdiBHUE0gQ09FWCBWZXJzaW9uIFF1ZXJ5XG4iKTsKKwkJdmVyc2lvbiA9IGFyOTAwM19tY2lfc3RhdGUoYWgsCisJCQkJTUNJX1NUQVRFX1NFTkRfV0xBTl9DT0VYX1ZFUlNJT04sIE5VTEwpOworCQlicmVhazsKKworCWNhc2UgTUNJX0dQTV9DT0VYX1ZFUlNJT05fUkVTUE9OU0U6CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgUmVjdiBHUE0gQ09FWCBWZXJzaW9uIFJlc3BvbnNlXG4iKTsKKwkJbWFqb3IgPSAqKHJ4X3BheWxvYWQgKyBNQ0lfR1BNX0NPRVhfQl9NQUpPUl9WRVJTSU9OKTsKKwkJbWlub3IgPSAqKHJ4X3BheWxvYWQgKyBNQ0lfR1BNX0NPRVhfQl9NSU5PUl9WRVJTSU9OKTsKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBCVCBDb2V4IHZlcnNpb246ICVkLiVkXG4iLAorCQkJbWFqb3IsIG1pbm9yKTsKKwkJdmVyc2lvbiA9IChtYWpvciA8PCA4KSArIG1pbm9yOworCQl2ZXJzaW9uID0gYXI5MDAzX21jaV9zdGF0ZShhaCwKKwkJCSAgTUNJX1NUQVRFX1NFVF9CVF9DT0VYX1ZFUlNJT04sICZ2ZXJzaW9uKTsKKwkJYnJlYWs7CisKKwljYXNlIE1DSV9HUE1fQ09FWF9TVEFUVVNfUVVFUlk6CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkiTUNJIFJlY3YgR1BNIENPRVggU3RhdHVzIFF1ZXJ5ID0gMHglMDJ4XG4iLAorCQkJKihyeF9wYXlsb2FkICsgTUNJX0dQTV9DT0VYX0JfV0xBTl9CSVRNQVApKTsKKwkJYXI5MDAzX21jaV9zdGF0ZShhaCwKKwkJTUNJX1NUQVRFX1NFTkRfV0xBTl9DSEFOTkVMUywgTlVMTCk7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfR1BNX0NPRVhfQlRfUFJPRklMRV9JTkZPOgorCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIFJlY3YgR1BNIENvZXggQlQgcHJvZmlsZSBpbmZvXG4iKTsKKwkJbWVtY3B5KCZwcm9maWxlX2luZm8sCisJCSAgICAgICAocnhfcGF5bG9hZCArIE1DSV9HUE1fQ09FWF9CX1BST0ZJTEVfVFlQRSksIDEwKTsKKworCQlpZiAoKHByb2ZpbGVfaW5mby50eXBlID09IE1DSV9HUE1fQ09FWF9QUk9GSUxFX1VOS05PV04pCisJCSAgICB8fCAocHJvZmlsZV9pbmZvLnR5cGUgPj0KKwkJCQkJICAgIE1DSV9HUE1fQ09FWF9QUk9GSUxFX01BWCkpIHsKKworCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkiaWxsZWdhbCBwcm9maWxlIHR5cGUgPSAlZCwgc3RhdGUgPSAlZFxuIiwKKwkJCQlwcm9maWxlX2luZm8udHlwZSwKKwkJCQlwcm9maWxlX2luZm8uc3RhcnQpOworCQkJYnJlYWs7CisJCX0KKworCQlhdGhfbWNpX3Byb2Nlc3NfcHJvZmlsZShzYywgJnByb2ZpbGVfaW5mbyk7CisJCWJyZWFrOworCisJY2FzZSBNQ0lfR1BNX0NPRVhfQlRfU1RBVFVTX1VQREFURToKKwkJcHJvZmlsZV9zdGF0dXMuaXNfbGluayA9ICoocnhfcGF5bG9hZCArCisJCQkJCSAgIE1DSV9HUE1fQ09FWF9CX1NUQVRVU19UWVBFKTsKKwkJcHJvZmlsZV9zdGF0dXMuY29ubl9oYW5kbGUgPSAqKHJ4X3BheWxvYWQgKworCQkJCQkgICAgICAgTUNJX0dQTV9DT0VYX0JfU1RBVFVTX0xJTktJRCk7CisJCXByb2ZpbGVfc3RhdHVzLmlzX2NyaXRpY2FsID0gKihyeF9wYXlsb2FkICsKKwkJCQkJICAgICAgIE1DSV9HUE1fQ09FWF9CX1NUQVRVU19TVEFURSk7CisKKwkJc2VxX251bSA9ICooKHUzMiAqKShyeF9wYXlsb2FkICsgMTIpKTsKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCSJNQ0kgUmVjdiBHUE0gQ09FWCBCVF9TdGF0dXNfVXBkYXRlOiBpc19saW5rPSVkLCBsaW5rSWQ9JWQsIHN0YXRlPSVkLCBTRVE9JWRcbiIsCisJCQlwcm9maWxlX3N0YXR1cy5pc19saW5rLCBwcm9maWxlX3N0YXR1cy5jb25uX2hhbmRsZSwKKwkJCXByb2ZpbGVfc3RhdHVzLmlzX2NyaXRpY2FsLCBzZXFfbnVtKTsKKworCQlhdGhfbWNpX3Byb2Nlc3Nfc3RhdHVzKHNjLCAmcHJvZmlsZV9zdGF0dXMpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgVW5rbm93biBHUE0gQ09FWCBtZXNzYWdlID0gMHglMDJ4XG4iLAorCQkJb3Bjb2RlKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGF0aF9tY2lfYnVmX2FsbG9jKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX21jaV9idWYgKmJ1ZikKK3sKKwlpbnQgZXJyb3IgPSAwOworCisJYnVmLT5iZl9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KHNjLT5kZXYsIGJ1Zi0+YmZfbGVuLAorCQkJCQkgICZidWYtPmJmX3BhZGRyLCBHRlBfS0VSTkVMKTsKKworCWlmIChidWYtPmJmX2FkZHIgPT0gTlVMTCkgeworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIHZvaWQgYXRoX21jaV9idWZfZnJlZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9tY2lfYnVmICpidWYpCit7CisJaWYgKGJ1Zi0+YmZfYWRkcikgeworCQlkbWFfZnJlZV9jb2hlcmVudChzYy0+ZGV2LCBidWYtPmJmX2xlbiwgYnVmLT5iZl9hZGRyLAorCQkJCQkJCWJ1Zi0+YmZfcGFkZHIpOworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCX0KK30KKworaW50IGF0aF9tY2lfc2V0dXAoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpOworCXN0cnVjdCBhdGhfbWNpX2NvZXggKm1jaSA9ICZzYy0+bWNpX2NvZXg7CisJaW50IGVycm9yID0gMDsKKworCWlmICghQVRIOUtfSFdfQ0FQX01DSSkKKwkJcmV0dXJuIDA7CisKKwltY2ktPnNjaGVkX2J1Zi5iZl9sZW4gPSBBVEhfTUNJX1NDSEVEX0JVRl9TSVpFICsgQVRIX01DSV9HUE1fQlVGX1NJWkU7CisKKwlpZiAoYXRoX21jaV9idWZfYWxsb2Moc2MsICZtY2ktPnNjaGVkX2J1ZikpIHsKKwkJYXRoX2RiZyhjb21tb24sIEZBVEFMLCAiTUNJIGJ1ZmZlciBhbGxvYyBmYWlsZWRcbiIpOworCQllcnJvciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKKwl9CisKKwltY2ktPnNjaGVkX2J1Zi5iZl9sZW4gPSBBVEhfTUNJX1NDSEVEX0JVRl9TSVpFOworCisJbWVtc2V0KG1jaS0+c2NoZWRfYnVmLmJmX2FkZHIsIE1DSV9HUE1fUlNWRF9QQVRURVJOLAorCQkJCQkJbWNpLT5zY2hlZF9idWYuYmZfbGVuKTsKKworCW1jaS0+Z3BtX2J1Zi5iZl9sZW4gPSBBVEhfTUNJX0dQTV9CVUZfU0laRTsKKwltY2ktPmdwbV9idWYuYmZfYWRkciA9ICh1OCAqKW1jaS0+c2NoZWRfYnVmLmJmX2FkZHIgKworCQkJCQkJCW1jaS0+c2NoZWRfYnVmLmJmX2xlbjsKKwltY2ktPmdwbV9idWYuYmZfcGFkZHIgPSBtY2ktPnNjaGVkX2J1Zi5iZl9wYWRkciArIG1jaS0+c2NoZWRfYnVmLmJmX2xlbjsKKworCS8qIGluaXRpYWxpemUgdGhlIGJ1ZmZlciAqLworCW1lbXNldChtY2ktPmdwbV9idWYuYmZfYWRkciwgTUNJX0dQTV9SU1ZEX1BBVFRFUk4sIG1jaS0+Z3BtX2J1Zi5iZl9sZW4pOworCisJYXI5MDAzX21jaV9zZXR1cChzYy0+c2NfYWgsIG1jaS0+Z3BtX2J1Zi5iZl9wYWRkciwKKwkJCSBtY2ktPmdwbV9idWYuYmZfYWRkciwgKG1jaS0+Z3BtX2J1Zi5iZl9sZW4gPj4gNCksCisJCQkgbWNpLT5zY2hlZF9idWYuYmZfcGFkZHIpOworZmFpbDoKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3ZvaWQgYXRoX21jaV9jbGVhbnVwKHN0cnVjdCBhdGhfc29mdGMgKnNjKQoreworCXN0cnVjdCBhdGhfaHcgKmFoID0gc2MtPnNjX2FoOworCXN0cnVjdCBhdGhfbWNpX2NvZXggKm1jaSA9ICZzYy0+bWNpX2NvZXg7CisKKwlpZiAoIUFUSDlLX0hXX0NBUF9NQ0kpCisJCXJldHVybjsKKworCS8qCisJICogYm90aCBzY2hlZHVsZSBhbmQgZ3BtIGJ1ZmZlcnMgd2lsbCBiZSByZWxlYXNlZAorCSAqLworCWF0aF9tY2lfYnVmX2ZyZWUoc2MsICZtY2ktPnNjaGVkX2J1Zik7CisJYXI5MDAzX21jaV9jbGVhbnVwKGFoKTsKK30KKwordm9pZCBhdGhfbWNpX2ludHIoc3RydWN0IGF0aF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGF0aF9tY2lfY29leCAqbWNpID0gJnNjLT5tY2lfY29leDsKKwlzdHJ1Y3QgYXRoX2h3ICphaCA9IHNjLT5zY19haDsKKwlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKGFoKTsKKwl1MzIgbWNpX2ludCwgbWNpX2ludF9yeG1zZzsKKwl1MzIgb2Zmc2V0LCBzdWJ0eXBlLCBvcGNvZGU7CisJdTMyICpwZ3BtOworCXUzMiBtb3JlX2RhdGEgPSBNQ0lfR1BNX01PUkU7CisJYm9vbCBza2lwX2dwbSA9IGZhbHNlOworCisJaWYgKCFBVEg5S19IV19DQVBfTUNJKQorCQlyZXR1cm47CisKKwlhcjkwMDNfbWNpX2dldF9pbnRlcnJ1cHQoc2MtPnNjX2FoLCAmbWNpX2ludCwgJm1jaV9pbnRfcnhtc2cpOworCisJaWYgKGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9FTkFCTEUsIE5VTEwpID09IDApIHsKKworCQlhcjkwMDNfbWNpX3N0YXRlKHNjLT5zY19haCwgTUNJX1NUQVRFX0lOSVRfR1BNX09GRlNFVCwgTlVMTCk7CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgaW50ZXJydXB0IGJ1dCBNQ0kgZGlzYWJsZWRcbiIpOworCisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkiTUNJIGludGVycnVwdDogaW50ciA9IDB4JXgsIGludHJfcnhtc2cgPSAweCV4XG4iLAorCQkJbWNpX2ludCwgbWNpX2ludF9yeG1zZyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFKSB7CisJCXUzMiBwYXlsb2FkWzRdID0geyAweGZmZmZmZmZmLCAweGZmZmZmZmZmLAorCQkJCSAgIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmMDB9OworCisJCS8qCisJCSAqIFRoZSBmb2xsb3dpbmcgUkVNT1RFX1JFU0VUIGFuZCBTWVNfV0FLSU5HIHVzZWQgdG8gc2VudAorCQkgKiBvbmx5IHdoZW4gQlQgd2FrZSB1cC4gTm93IHRoZXkgYXJlIGFsd2F5cyBzZW50LCBhcyBhCisJCSAqIHJlY292ZXJ5IG1ldGhvZCB0byByZXNldCBCVCBNQ0kncyBSWCBhbGlnbm1lbnQuCisJCSAqLworCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIGludGVycnVwdCBzZW5kIFJFTU9URV9SRVNFVFxuIik7CisKKwkJYXI5MDAzX21jaV9zZW5kX21lc3NhZ2UoYWgsIE1DSV9SRU1PVEVfUkVTRVQsIDAsCisJCQkJCXBheWxvYWQsIDE2LCB0cnVlLCBmYWxzZSk7CisJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgaW50ZXJydXB0IHNlbmQgU1lTX1dBS0lOR1xuIik7CisJCWFyOTAwM19tY2lfc2VuZF9tZXNzYWdlKGFoLCBNQ0lfU1lTX1dBS0lORywgMCwKKwkJCQkJTlVMTCwgMCwgdHJ1ZSwgZmFsc2UpOworCisJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFUV9XQUtFOworCQlhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfUkVTRVRfUkVRX1dBS0UsIE5VTEwpOworCisJCS8qCisJCSAqIGFsd2F5cyBkbyB0aGlzIGZvciByZWNvdmVyeSBhbmQgMkcvNUcgdG9nZ2xpbmcgYW5kIExOQV9UUkFOUworCQkgKi8KKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBTZXQgQlQgc3RhdGUgdG8gQVdBS0VcbiIpOworCQlhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfU0VUX0JUX0FXQUtFLCBOVUxMKTsKKwl9CisKKwkvKiBQcm9jZXNzaW5nIFNZU19XQUtJTkcvU1lTX1NMRUVQSU5HICovCisJaWYgKG1jaV9pbnRfcnhtc2cgJiBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HKSB7CisJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkc7CisKKwkJaWYgKGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9CVCwgTlVMTCkgPT0gTUNJX0JUX1NMRUVQKSB7CisKKwkJCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfUkVNT1RFX1NMRUVQLCBOVUxMKQorCQkJCQk9PSBNQ0lfQlRfU0xFRVApCisJCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkJIk1DSSBCVCBzdGF5cyBpbiBzbGVlcCBtb2RlXG4iKTsKKwkJCWVsc2UgeworCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJCSJNQ0kgU2V0IEJUIHN0YXRlIHRvIEFXQUtFXG4iKTsKKwkJCQlhcjkwMDNfbWNpX3N0YXRlKGFoLAorCQkJCQkJIE1DSV9TVEFURV9TRVRfQlRfQVdBS0UsIE5VTEwpOworCQkJfQorCQl9IGVsc2UKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgQlQgc3RheXMgaW4gQVdBS0UgbW9kZVxuIik7CisJfQorCisJaWYgKG1jaV9pbnRfcnhtc2cgJiBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfU0xFRVBJTkcpIHsKKworCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfU0xFRVBJTkc7CisKKwkJaWYgKGFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9CVCwgTlVMTCkgPT0gTUNJX0JUX0FXQUtFKSB7CisKKwkJCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfUkVNT1RFX1NMRUVQLCBOVUxMKQorCQkJCQk9PSBNQ0lfQlRfQVdBS0UpCisJCQkJYXRoX2RiZyhjb21tb24sIE1DSSwKKwkJCQkJIk1DSSBCVCBzdGF5cyBpbiBBV0FLRSBtb2RlXG4iKTsKKwkJCWVsc2UgeworCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJCSJNQ0kgU2V0QlQgc3RhdGUgdG8gU0xFRVBcbiIpOworCQkJCWFyOTAwM19tY2lfc3RhdGUoYWgsIE1DSV9TVEFURV9TRVRfQlRfU0xFRVAsCisJCQkJCQkgTlVMTCk7CisJCQl9CisJCX0gZWxzZQorCQkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBCVCBzdGF5cyBpbiBTTEVFUCBtb2RlXG4iKTsKKwl9CisKKwlpZiAoKG1jaV9pbnQgJiBBUl9NQ0lfSU5URVJSVVBUX1JYX0lOVkFMSURfSERSKSB8fAorCSAgICAobWNpX2ludCAmIEFSX01DSV9JTlRFUlJVUFRfQ09OVF9JTkZPX1RJTUVPVVQpKSB7CisKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBSWCBicm9rZW4sIHNraXAgR1BNIG1zZ3NcbiIpOworCQlhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfUkVDT1ZFUl9SWCwgTlVMTCk7CisJCXNraXBfZ3BtID0gdHJ1ZTsKKwl9CisKKwlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTykgeworCisJCW1jaV9pbnRfcnhtc2cgJj0gfkFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTzsKKwkJb2Zmc2V0ID0gYXI5MDAzX21jaV9zdGF0ZShhaCwgTUNJX1NUQVRFX0xBU1RfU0NIRF9NU0dfT0ZGU0VULAorCQkJCQkgIE5VTEwpOworCX0KKworCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfR1BNKSB7CisKKwkJbWNpX2ludF9yeG1zZyAmPSB+QVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfR1BNOworCisJCXdoaWxlIChtb3JlX2RhdGEgPT0gTUNJX0dQTV9NT1JFKSB7CisKKwkJCXBncG0gPSBtY2ktPmdwbV9idWYuYmZfYWRkcjsKKwkJCW9mZnNldCA9IGFyOTAwM19tY2lfc3RhdGUoYWgsCisJCQkJCU1DSV9TVEFURV9ORVhUX0dQTV9PRkZTRVQsICZtb3JlX2RhdGEpOworCisJCQlpZiAob2Zmc2V0ID09IE1DSV9HUE1fSU5WQUxJRCkKKwkJCQlicmVhazsKKworCQkJcGdwbSArPSAob2Zmc2V0ID4+IDIpOworCisJCQkvKgorCQkJICogVGhlIGZpcnN0IGR3b3JkIGlzIHRpbWVyLgorCQkJICogVGhlIHJlYWwgZGF0YSBzdGFydHMgZnJvbSAybmQgZHdvcmQuCisJCQkgKi8KKworCQkJc3VidHlwZSA9IE1DSV9HUE1fVFlQRShwZ3BtKTsKKwkJCW9wY29kZSA9IE1DSV9HUE1fT1BDT0RFKHBncG0pOworCisJCQlpZiAoIXNraXBfZ3BtKSB7CisKKwkJCQlpZiAoTUNJX0dQTV9JU19DQUxfVFlQRShzdWJ0eXBlKSkKKwkJCQkJYXRoX21jaV9jYWxfbXNnKHNjLCBzdWJ0eXBlLAorCQkJCQkJCSh1OCAqKSBwZ3BtKTsKKwkJCQllbHNlIHsKKwkJCQkJc3dpdGNoIChzdWJ0eXBlKSB7CisJCQkJCWNhc2UgTUNJX0dQTV9DT0VYX0FHRU5UOgorCQkJCQkJYXRoX21jaV9tc2coc2MsIG9wY29kZSwKKwkJCQkJCQkgICAgKHU4ICopIHBncG0pOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCU1DSV9HUE1fUkVDWUNMRShwZ3BtKTsKKwkJfQorCX0KKworCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfTUFTSykgeworCisJCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0NPTlRST0wpCisJCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTDsKKworCQlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPKSB7CisJCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfSU5GTzsKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgTE5BX0lORk9cbiIpOworCQl9CisKKwkJaWYgKG1jaV9pbnRfcnhtc2cgJiBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk8pIHsKKworCQkJaW50IHZhbHVlX2RibSA9IGFyOTAwM19tY2lfc3RhdGUoYWgsCisJCQkJCU1DSV9TVEFURV9DT05UX1JTU0lfUE9XRVIsIE5VTEwpOworCisJCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk87CisKKwkJCWlmIChhcjkwMDNfbWNpX3N0YXRlKGFoLCBNQ0lfU1RBVEVfQ09OVF9UWFJYLCBOVUxMKSkKKwkJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLAorCQkJCQkiTUNJIENPTlRfSU5GTzogKHR4KSBwcmkgPSAlZCwgcHdyID0gJWQgZEJtXG4iLAorCQkJCQlhcjkwMDNfbWNpX3N0YXRlKGFoLAorCQkJCQkJTUNJX1NUQVRFX0NPTlRfUFJJT1JJVFksIE5VTEwpLAorCQkJCQl2YWx1ZV9kYm0pOworCQkJZWxzZQorCQkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksCisJCQkJCSJNQ0kgQ09OVF9JTkZPOiAocngpIHByaSA9ICVkLHB3ciA9ICVkIGRCbVxuIiwKKwkJCQkJYXI5MDAzX21jaV9zdGF0ZShhaCwKKwkJCQkJCU1DSV9TVEFURV9DT05UX1BSSU9SSVRZLCBOVUxMKSwKKwkJCQkJdmFsdWVfZGJtKTsKKwkJfQorCisJCWlmIChtY2lfaW50X3J4bXNnICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9OQUNLKSB7CisJCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX05BQ0s7CisJCQlhdGhfZGJnKGNvbW1vbiwgTUNJLCAiTUNJIENPTlRfTkFDS1xuIik7CisJCX0KKworCQlpZiAobWNpX2ludF9yeG1zZyAmIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUKSB7CisJCQltY2lfaW50X3J4bXNnICY9IH5BUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVDsKKwkJCWF0aF9kYmcoY29tbW9uLCBNQ0ksICJNQ0kgQ09OVF9SU1RcbiIpOworCQl9CisJfQorCisJaWYgKChtY2lfaW50ICYgQVJfTUNJX0lOVEVSUlVQVF9SWF9JTlZBTElEX0hEUikgfHwKKwkgICAgKG1jaV9pbnQgJiBBUl9NQ0lfSU5URVJSVVBUX0NPTlRfSU5GT19USU1FT1VUKSkKKwkJbWNpX2ludCAmPSB+KEFSX01DSV9JTlRFUlJVUFRfUlhfSU5WQUxJRF9IRFIgfAorCQkJICAgICBBUl9NQ0lfSU5URVJSVVBUX0NPTlRfSU5GT19USU1FT1VUKTsKKworCWlmIChtY2lfaW50X3J4bXNnICYgMHhmZmZmZmZmZSkKKwkJYXRoX2RiZyhjb21tb24sIE1DSSwgIk1DSSBub3QgcHJvY2Vzc2VkIG1jaV9pbnRfcnhtc2cgPSAweCV4XG4iLAorCQkJbWNpX2ludF9yeG1zZyk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWNpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvbWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllM2U1MQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9tY2kuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIEF0aGVyb3MgQ29tbXVuaWNhdGlvbnMgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgTUNJX0gKKyNkZWZpbmUgTUNJX0gKKworI2RlZmluZSBBVEhfTUNJX1NDSEVEX0JVRl9TSVpFCQkoMTYgKiAxNikgLyogMTYgZW50cmllcywgNCBkd29yZCBlYWNoICovCisjZGVmaW5lIEFUSF9NQ0lfR1BNX01BWF9FTlRSWQkJMTYKKyNkZWZpbmUgQVRIX01DSV9HUE1fQlVGX1NJWkUJCShBVEhfTUNJX0dQTV9NQVhfRU5UUlkgKiAxNikKKyNkZWZpbmUgQVRIX01DSV9ERUZfQlRfUEVSSU9ECQk0MAorI2RlZmluZSBBVEhfTUNJX0JEUl9EVVRZX0NZQ0xFCQkyMAorI2RlZmluZSBBVEhfTUNJX01BWF9EVVRZX0NZQ0xFCQk5MAorCisjZGVmaW5lIEFUSF9NQ0lfREVGX0FHR1JfTElNSVQJCTYgLyogaW4gMC4yNCBtcyAqLworI2RlZmluZSBBVEhfTUNJX01BWF9BQ0xfUFJPRklMRQkJNworI2RlZmluZSBBVEhfTUNJX01BWF9TQ09fUFJPRklMRQkJMQorI2RlZmluZSBBVEhfTUNJX01BWF9QUk9GSUxFCQkoQVRIX01DSV9NQVhfQUNMX1BST0ZJTEUgK1wKKwkJCQkJIEFUSF9NQ0lfTUFYX1NDT19QUk9GSUxFKQorCisjZGVmaW5lIElOQ19QUk9GKF9tY2ksIF9pbmZvKSBkbyB7CQkgXAorCQlzd2l0Y2ggKF9pbmZvLT50eXBlKSB7CQkgXAorCQljYXNlIE1DSV9HUE1fQ09FWF9QUk9GSUxFX1JGQ09NTTpcCisJCQlfbWNpLT5udW1fb3RoZXJfYWNsKys7CSBcCisJCQlicmVhazsJCQkgXAorCQljYXNlIE1DSV9HUE1fQ09FWF9QUk9GSUxFX0EyRFA6CSBcCisJCQlfbWNpLT5udW1fYTJkcCsrOwkgXAorCQkJaWYgKCFfaW5mby0+ZWRyKQkgXAorCQkJCV9tY2ktPm51bV9iZHIrKzsgXAorCQkJYnJlYWs7CQkJIFwKKwkJY2FzZSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9ISUQ6CSBcCisJCQlfbWNpLT5udW1faGlkKys7CSBcCisJCQlicmVhazsJCQkgXAorCQljYXNlIE1DSV9HUE1fQ09FWF9QUk9GSUxFX0JORVA6CSBcCisJCQlfbWNpLT5udW1fcGFuKys7CSBcCisJCQlicmVhazsJCQkgXAorCQljYXNlIE1DSV9HUE1fQ09FWF9QUk9GSUxFX1ZPSUNFOiBcCisJCQlfbWNpLT5udW1fc2NvKys7CSBcCisJCQlicmVhazsJCQkgXAorCQlkZWZhdWx0OgkJCSBcCisJCQlicmVhazsJCQkgXAorCQl9CQkJCSBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBERUNfUFJPRihfbWNpLCBfaW5mbykgZG8gewkJIFwKKwkJc3dpdGNoIChfaW5mby0+dHlwZSkgewkJIFwKKwkJY2FzZSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9SRkNPTU06XAorCQkJX21jaS0+bnVtX290aGVyX2FjbC0tOwkgXAorCQkJYnJlYWs7CQkJIFwKKwkJY2FzZSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9BMkRQOgkgXAorCQkJX21jaS0+bnVtX2EyZHAtLTsJIFwKKwkJCWlmICghX2luZm8tPmVkcikJIFwKKwkJCQlfbWNpLT5udW1fYmRyLS07IFwKKwkJCWJyZWFrOwkJCSBcCisJCWNhc2UgTUNJX0dQTV9DT0VYX1BST0ZJTEVfSElEOgkgXAorCQkJX21jaS0+bnVtX2hpZC0tOwkgXAorCQkJYnJlYWs7CQkJIFwKKwkJY2FzZSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9CTkVQOgkgXAorCQkJX21jaS0+bnVtX3Bhbi0tOwkgXAorCQkJYnJlYWs7CQkJIFwKKwkJY2FzZSBNQ0lfR1BNX0NPRVhfUFJPRklMRV9WT0lDRTogXAorCQkJX21jaS0+bnVtX3Njby0tOwkgXAorCQkJYnJlYWs7CQkJIFwKKwkJZGVmYXVsdDoJCQkgXAorCQkJYnJlYWs7CQkJIFwKKwkJfQkJCQkgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgTlVNX1BST0YoX21jaSkJKF9tY2ktPm51bV9vdGhlcl9hY2wgKyBfbWNpLT5udW1fYTJkcCArIFwKKwkJCSBfbWNpLT5udW1faGlkICsgX21jaS0+bnVtX3BhbiArIF9tY2ktPm51bV9zY28pCisKK3N0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfaW5mbyB7CisJdTggdHlwZTsKKwl1OCBjb25uX2hhbmRsZTsKKwlib29sIHN0YXJ0OworCWJvb2wgbWFzdGVyOworCWJvb2wgZWRyOworCXU4IHZvaWNlX3R5cGU7CisJdTE2IFQ7CQkvKiBWb2ljZTogVHZvaWNlLCBISUQ6IFRzbmlmZiwgICAgICAgIGluIHNsb3RzICovCisJdTggVzsJCS8qIFZvaWNlOiBXdm9pY2UsIEhJRDogU25pZmYgdGltZW91dCwgaW4gc2xvdHMgKi8KKwl1OCBBOwkJLyoJCSAgSElEOiBTbmlmZiBhdHRlbXB0LCBpbiBzbG90cyAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCBhdGhfbWNpX3Byb2ZpbGVfc3RhdHVzIHsKKwlib29sIGlzX2NyaXRpY2FsOworCWJvb2wgaXNfbGluazsKKwl1OCBjb25uX2hhbmRsZTsKK307CisKK3N0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgeworCXN0cnVjdCBsaXN0X2hlYWQgaW5mbzsKKwlERUNMQVJFX0JJVE1BUChzdGF0dXMsIEFUSF9NQ0lfTUFYX1BST0ZJTEUpOworCXUxNiBhZ2dyX2xpbWl0OworCXU4IG51bV9tZ210OworCXU4IG51bV9zY287CisJdTggbnVtX2EyZHA7CisJdTggbnVtX2hpZDsKKwl1OCBudW1fcGFuOworCXU4IG51bV9vdGhlcl9hY2w7CisJdTggbnVtX2JkcjsKK307CisKKworc3RydWN0IGF0aF9tY2lfYnVmIHsKKwl2b2lkICpiZl9hZGRyOwkJLyogdmlydHVhbCBhZGRyIG9mIGRlc2MgKi8KKwlkbWFfYWRkcl90IGJmX3BhZGRyOyAgICAvKiBwaHlzaWNhbCBhZGRyIG9mIGJ1ZmZlciAqLworCXUzMiBiZl9sZW47CQkvKiBsZW4gb2YgZGF0YSAqLworfTsKKworc3RydWN0IGF0aF9tY2lfY29leCB7CisJYXRvbWljX3QgbWNpX2NhbF9mbGFnOworCXN0cnVjdCBhdGhfbWNpX2J1ZiBzY2hlZF9idWY7CisJc3RydWN0IGF0aF9tY2lfYnVmIGdwbV9idWY7CisJdTMyIGJ0X2NhbF9zdGFydDsKK307CisKK3ZvaWQgYXRoX21jaV9mbHVzaF9wcm9maWxlKHN0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgKm1jaSk7CitpbnQgYXRoX21jaV9zZXR1cChzdHJ1Y3QgYXRoX3NvZnRjICpzYyk7Cit2b2lkIGF0aF9tY2lfY2xlYW51cChzdHJ1Y3QgYXRoX3NvZnRjICpzYyk7Cit2b2lkIGF0aF9tY2lfaW50cihzdHJ1Y3QgYXRoX3NvZnRjICpzYyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9wY2kuYwppbmRleCAyZGNkZjYzLi43N2RjMzI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcGNpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3BjaS5jCkBAIC0xMjEsNyArMTIxLDcgQEAKIAlpZiAoIXBhcmVudCkKIAkJcmV0dXJuOwogCi0JaWYgKGFoLT5idGNvZXhfaHcuc2NoZW1lICE9IEFUSF9CVENPRVhfQ0ZHX05PTkUpIHsKKwlpZiAoYXRoOWtfaHdfZ2V0X2J0Y29leF9zY2hlbWUoYWgpICE9IEFUSF9CVENPRVhfQ0ZHX05PTkUpIHsKIAkJLyogQmx1ZXRvb3RoIGNvZXhpc3RhbmNlIHJlcXVpcmVzIGRpc2FibGluZyBBU1BNLiAqLwogCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwZGV2LCBwb3MgKyBQQ0lfRVhQX0xOS0NUTCwgJmFzcG0pOwogCQlhc3BtICY9IH4oUENJRV9MSU5LX1NUQVRFX0wwUyB8IFBDSUVfTElOS19TVEFURV9MMSk7CkBAIC0zMDcsMTIgKzMwNywxMSBAQAogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwogCXN0cnVjdCBhdGhfc29mdGMgKnNjID0gaHctPnByaXY7CiAKLQlhdGg5a19od19zZXRfZ3BpbyhzYy0+c2NfYWgsIHNjLT5zY19haC0+bGVkX3BpbiwgMSk7Ci0KIAkvKiBUaGUgZGV2aWNlIGhhcyB0byBiZSBtb3ZlZCB0byBGVUxMU0xFRVAgZm9yY2libHkuCiAJICogT3RoZXJ3aXNlIHRoZSBjaGlwIG5ldmVyIG1vdmVkIHRvIGZ1bGwgc2xlZXAsCiAJICogd2hlbiBubyBpbnRlcmZhY2UgaXMgdXAuCiAJICovCisJYXRoOWtfaHdfZGlzYWJsZShzYy0+c2NfYWgpOwogCWF0aDlrX2h3X3NldHBvd2VyKHNjLT5zY19haCwgQVRIOUtfUE1fRlVMTF9TTEVFUCk7CiAKIAlyZXR1cm4gMDsKQEAgLTMyMSw4ICszMjAsNiBAQAogc3RhdGljIGludCBhdGhfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSBody0+cHJpdjsKIAl1MzIgdmFsOwogCiAJLyoKQEAgLTMzNCwyMiArMzMxLDYgQEAKIAlpZiAoKHZhbCAmIDB4MDAwMGZmMDApICE9IDApCiAJCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgdmFsICYgMHhmZmZmMDBmZik7CiAKLQlhdGg5a19wc193YWtldXAoc2MpOwotCS8qIEVuYWJsZSBMRUQgKi8KLQlhdGg5a19od19jZmdfb3V0cHV0KHNjLT5zY19haCwgc2MtPnNjX2FoLT5sZWRfcGluLAotCQkJICAgIEFSX0dQSU9fT1VUUFVUX01VWF9BU19PVVRQVVQpOwotCWF0aDlrX2h3X3NldF9ncGlvKHNjLT5zY19haCwgc2MtPnNjX2FoLT5sZWRfcGluLCAwKTsKLQotCSAgLyoKLQkgICAqIFJlc2V0IGtleSBjYWNoZSB0byBzYW5lIGRlZmF1bHRzIChhbGwgZW50cmllcyBjbGVhcmVkKSBpbnN0ZWFkIG9mCi0JICAgKiBzZW1pLXJhbmRvbSB2YWx1ZXMgYWZ0ZXIgc3VzcGVuZC9yZXN1bWUuCi0JICAgKi8KLQlhdGg5a19jbW5faW5pdF9jcnlwdG8oc2MtPnNjX2FoKTsKLQlhdGg5a19wc19yZXN0b3JlKHNjKTsKLQotCXNjLT5wc19pZGxlID0gdHJ1ZTsKLQlhdGhfcmFkaW9fZGlzYWJsZShzYywgaHcpOwotCiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmMKaW5kZXggODg4YWJjMi4uYjNjMzc5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JjLmMKQEAgLTExOTksNyArMTE5OSw3IEBACiAJCQlyZXR1cm4gJmFyNTQxNl8xMW5hX3JhdGV0YWJsZTsKIAkJcmV0dXJuICZhcjU0MTZfMTFhX3JhdGV0YWJsZTsKIAlkZWZhdWx0OgotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJJbnZhbGlkIGJhbmRcbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgQ09ORklHLCAiSW52YWxpZCBiYW5kXG4iKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogfQpAQCAtMTI3MSwxMSArMTI3MSwxMiBAQAogCiAJYXRoX3JjX3ByaXYtPm1heF92YWxpZF9yYXRlID0gazsKIAlhdGhfcmNfc29ydF92YWxpZHJhdGVzKHJhdGVfdGFibGUsIGF0aF9yY19wcml2KTsKLQlhdGhfcmNfcHJpdi0+cmF0ZV9tYXhfcGh5ID0gYXRoX3JjX3ByaXYtPnZhbGlkX3JhdGVfaW5kZXhbay00XTsKKwlhdGhfcmNfcHJpdi0+cmF0ZV9tYXhfcGh5ID0gKGsgPiA0KSA/CisJCQkJCWF0aF9yY19wcml2LT52YWxpZF9yYXRlX2luZGV4W2stNF0gOgorCQkJCQlhdGhfcmNfcHJpdi0+dmFsaWRfcmF0ZV9pbmRleFtrLTFdOwogCWF0aF9yY19wcml2LT5yYXRlX3RhYmxlID0gcmF0ZV90YWJsZTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0NPTkZJRywKLQkJIlJDIEluaXRpYWxpemVkIHdpdGggY2FwYWJpbGl0aWVzOiAweCV4XG4iLAorCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJSQyBJbml0aWFsaXplZCB3aXRoIGNhcGFiaWxpdGllczogMHgleFxuIiwKIAkJYXRoX3JjX3ByaXYtPmh0X2NhcCk7CiB9CiAKQEAgLTE0NzIsNyArMTQ3Myw3IEBACiAJCQkJCQkgICBvcGVyX2N3NDAsIG9wZXJfc2dpKTsKIAkJCWF0aF9yY19pbml0KHNjLCBwcml2X3N0YSwgc2JhbmQsIHN0YSwgcmF0ZV90YWJsZSk7CiAKLQkJCWF0aF9kYmcoYXRoOWtfaHdfY29tbW9uKHNjLT5zY19haCksIEFUSF9EQkdfQ09ORklHLAorCQkJYXRoX2RiZyhhdGg5a19od19jb21tb24oc2MtPnNjX2FoKSwgQ09ORklHLAogCQkJCSJPcGVyYXRpbmcgSFQgQmFuZHdpZHRoIGNoYW5nZWQgdG86ICVkXG4iLAogCQkJCXNjLT5ody0+Y29uZi5jaGFubmVsX3R5cGUpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVjdi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlY3YuYwppbmRleCA2N2I4NjJjLi4wZTY2NmZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVjdi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWN2LmMKQEAgLTE3Miw3ICsxNzIsNyBAQAogCXUzMiBuYnVmID0gMDsKIAogCWlmIChsaXN0X2VtcHR5KCZzYy0+cngucnhidWYpKSB7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1FVRVVFLCAiTm8gZnJlZSByeCBidWYgYXZhaWxhYmxlXG4iKTsKKwkJYXRoX2RiZyhjb21tb24sIFFVRVVFLCAiTm8gZnJlZSByeCBidWYgYXZhaWxhYmxlXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMzM3LDcgKzMzNyw3IEBACiAJaWYgKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpIHsKIAkJcmV0dXJuIGF0aF9yeF9lZG1hX2luaXQoc2MsIG5idWZzKTsKIAl9IGVsc2UgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19DT05GSUcsICJjYWNoZWxzeiAldSByeGJ1ZnNpemUgJXVcbiIsCisJCWF0aF9kYmcoY29tbW9uLCBDT05GSUcsICJjYWNoZWxzeiAldSByeGJ1ZnNpemUgJXVcbiIsCiAJCQljb21tb24tPmNhY2hlbHN6LCBjb21tb24tPnJ4X2J1ZnNpemUpOwogCiAJCS8qIEluaXRpYWxpemUgcnggZGVzY3JpcHRvcnMgKi8KQEAgLTQ3NSw3ICs0NzUsNiBAQAogCiAJcmV0dXJuIHJmaWx0OwogCi0jdW5kZWYgUlhfRklMVEVSX1BSRVNFUlZFCiB9CiAKIGludCBhdGhfc3RhcnRyZWN2KHN0cnVjdCBhdGhfc29mdGMgKnNjKQpAQCAtNTkyLDcgKzU5MSw3IEBACiAKIAlpZiAoc2MtPnBzX2ZsYWdzICYgUFNfQkVBQ09OX1NZTkMpIHsKIAkJc2MtPnBzX2ZsYWdzICY9IH5QU19CRUFDT05fU1lOQzsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUFMsCisJCWF0aF9kYmcoY29tbW9uLCBQUywKIAkJCSJSZWNvbmZpZ3VyZSBCZWFjb24gdGltZXJzIGJhc2VkIG9uIHRpbWVzdGFtcCBmcm9tIHRoZSBBUFxuIik7CiAJCWF0aF9zZXRfYmVhY29uKHNjKTsKIAl9CkBAIC02MDUsNyArNjA0LDcgQEAKIAkJICogYSBiYWNrdXAgdHJpZ2dlciBmb3IgcmV0dXJuaW5nIGludG8gTkVUV09SSyBTTEVFUCBzdGF0ZSwKIAkJICogc28gd2UgYXJlIHdhaXRpbmcgZm9yIGl0IGFzIHdlbGwuCiAJCSAqLwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19QUywKKwkJYXRoX2RiZyhjb21tb24sIFBTLAogCQkJIlJlY2VpdmVkIERUSU0gYmVhY29uIGluZGljYXRpbmcgYnVmZmVyZWQgYnJvYWRjYXN0L211bHRpY2FzdCBmcmFtZShzKVxuIik7CiAJCXNjLT5wc19mbGFncyB8PSBQU19XQUlUX0ZPUl9DQUIgfCBQU19XQUlUX0ZPUl9CRUFDT047CiAJCXJldHVybjsKQEAgLTYxOCw4ICs2MTcsNyBAQAogCQkgKiBiZWVuIGRlbGl2ZXJlZC4KIAkJICovCiAJCXNjLT5wc19mbGFncyAmPSB+UFNfV0FJVF9GT1JfQ0FCOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19QUywKLQkJCSJQUyB3YWl0IGZvciBDQUIgZnJhbWVzIHRpbWVkIG91dFxuIik7CisJCWF0aF9kYmcoY29tbW9uLCBQUywgIlBTIHdhaXQgZm9yIENBQiBmcmFtZXMgdGltZWQgb3V0XG4iKTsKIAl9CiB9CiAKQEAgLTY0NCwxMyArNjQyLDEzIEBACiAJCSAqIHBvaW50LgogCQkgKi8KIAkJc2MtPnBzX2ZsYWdzICY9IH4oUFNfV0FJVF9GT1JfQ0FCIHwgUFNfV0FJVF9GT1JfQkVBQ09OKTsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUFMsCisJCWF0aF9kYmcoY29tbW9uLCBQUywKIAkJCSJBbGwgUFMgQ0FCIGZyYW1lcyByZWNlaXZlZCwgYmFjayB0byBzbGVlcFxuIik7CiAJfSBlbHNlIGlmICgoc2MtPnBzX2ZsYWdzICYgUFNfV0FJVF9GT1JfUFNQT0xMX0RBVEEpICYmCiAJCSAgICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSAmJgogCQkgICAhaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoaGRyLT5mcmFtZV9jb250cm9sKSkgewogCQlzYy0+cHNfZmxhZ3MgJj0gflBTX1dBSVRfRk9SX1BTUE9MTF9EQVRBOwotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19QUywKKwkJYXRoX2RiZyhjb21tb24sIFBTLAogCQkJIkdvaW5nIGJhY2sgdG8gc2xlZXAgYWZ0ZXIgaGF2aW5nIHJlY2VpdmVkIFBTLVBvbGwgZGF0YSAoMHglbHgpXG4iLAogCQkJc2MtPnBzX2ZsYWdzICYgKFBTX1dBSVRfRk9SX0JFQUNPTiB8CiAJCQkJCVBTX1dBSVRfRk9SX0NBQiB8CkBAIC05MzMsNyArOTMxLDcgQEAKIAkgKiBObyB2YWxpZCBoYXJkd2FyZSBiaXRyYXRlIGZvdW5kIC0tIHdlIHNob3VsZCBub3QgZ2V0IGhlcmUKIAkgKiBiZWNhdXNlIGhhcmR3YXJlIGhhcyBhbHJlYWR5IHZhbGlkYXRlZCB0aGlzIGZyYW1lIGFzIE9LLgogCSAqLwotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOWSwKKwlhdGhfZGJnKGNvbW1vbiwgQU5ZLAogCQkidW5zdXBwb3J0ZWQgaHcgYml0cmF0ZSBkZXRlY3RlZCAweCUwMnggdXNpbmcgMSBNYml0XG4iLAogCQlyeF9zdGF0cy0+cnNfcmF0ZSk7CiAKQEAgLTE4MjQsNiArMTgyMiw3IEBACiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSAoaGRyX3NrYi0+ZGF0YSArIHJ4X3N0YXR1c19sZW4pOwogCQlyeHMgPSBJRUVFODAyMTFfU0tCX1JYQ0IoaGRyX3NrYik7CiAJCWlmIChpZWVlODAyMTFfaXNfYmVhY29uKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKKwkJICAgICFpc196ZXJvX2V0aGVyX2FkZHIoY29tbW9uLT5jdXJic3NpZCkgJiYKIAkJICAgICFjb21wYXJlX2V0aGVyX2FkZHIoaGRyLT5hZGRyMywgY29tbW9uLT5jdXJic3NpZCkpCiAJCQlycy5pc19teWJlYWNvbiA9IHRydWU7CiAJCWVsc2UKQEAgLTE4MzgsMTEgKzE4MzcsNiBAQAogCQlpZiAoc2MtPnNjX2ZsYWdzICYgU0NfT1BfUlhGTFVTSCkKIAkJCWdvdG8gcmVxdWV1ZV9kcm9wX2ZyYWc7CiAKLQkJcmV0dmFsID0gYXRoOWtfcnhfc2tiX3ByZXByb2Nlc3MoY29tbW9uLCBodywgaGRyLCAmcnMsCi0JCQkJCQkgcnhzLCAmZGVjcnlwdF9lcnJvcik7Ci0JCWlmIChyZXR2YWwpCi0JCQlnb3RvIHJlcXVldWVfZHJvcF9mcmFnOwotCiAJCXJ4cy0+bWFjdGltZSA9ICh0c2YgJiB+MHhmZmZmZmZmZlVMTCkgfCBycy5yc190c3RhbXA7CiAJCWlmIChycy5yc190c3RhbXAgPiB0c2ZfbG93ZXIgJiYKIAkJICAgIHVubGlrZWx5KHJzLnJzX3RzdGFtcCAtIHRzZl9sb3dlciA+IDB4MTAwMDAwMDApKQpAQCAtMTg1Miw2ICsxODQ2LDExIEBACiAJCSAgICB1bmxpa2VseSh0c2ZfbG93ZXIgLSBycy5yc190c3RhbXAgPiAweDEwMDAwMDAwKSkKIAkJCXJ4cy0+bWFjdGltZSArPSAweDEwMDAwMDAwMFVMTDsKIAorCQlyZXR2YWwgPSBhdGg5a19yeF9za2JfcHJlcHJvY2Vzcyhjb21tb24sIGh3LCBoZHIsICZycywKKwkJCQkJCSByeHMsICZkZWNyeXB0X2Vycm9yKTsKKwkJaWYgKHJldHZhbCkKKwkJCWdvdG8gcmVxdWV1ZV9kcm9wX2ZyYWc7CisKIAkJLyogRW5zdXJlIHdlIGFsd2F5cyBoYXZlIGFuIHNrYiB0byByZXF1ZXVlIG9uY2Ugd2UgYXJlIGRvbmUKIAkJICogcHJvY2Vzc2luZyB0aGUgY3VycmVudCBidWZmZXIncyBza2IgKi8KIAkJcmVxdWV1ZV9za2IgPSBhdGhfcnhidWZfYWxsb2MoY29tbW9uLCBjb21tb24tPnJ4X2J1ZnNpemUsIEdGUF9BVE9NSUMpOwpAQCAtMTkyMywxNSArMTkyMiwyMCBAQAogCQkJc2tiID0gaGRyX3NrYjsKIAkJfQogCi0JCS8qCi0JCSAqIGNoYW5nZSB0aGUgZGVmYXVsdCByeCBhbnRlbm5hIGlmIHJ4IGRpdmVyc2l0eSBjaG9vc2VzIHRoZQotCQkgKiBvdGhlciBhbnRlbm5hIDMgdGltZXMgaW4gYSByb3cuCi0JCSAqLwotCQlpZiAoc2MtPnJ4LmRlZmFudCAhPSBycy5yc19hbnRlbm5hKSB7Ci0JCQlpZiAoKytzYy0+cngucnhvdGhlcmFudCA+PSAzKQotCQkJCWF0aF9zZXRkZWZhbnRlbm5hKHNjLCBycy5yc19hbnRlbm5hKTsKLQkJfSBlbHNlIHsKLQkJCXNjLT5yeC5yeG90aGVyYW50ID0gMDsKKworCQlpZiAoYWgtPmNhcHMuaHdfY2FwcyAmIEFUSDlLX0hXX0NBUF9BTlRfRElWX0NPTUIpIHsKKworCQkJLyoKKwkJCSAqIGNoYW5nZSB0aGUgZGVmYXVsdCByeCBhbnRlbm5hIGlmIHJ4IGRpdmVyc2l0eQorCQkJICogY2hvb3NlcyB0aGUgb3RoZXIgYW50ZW5uYSAzIHRpbWVzIGluIGEgcm93LgorCQkJICovCisJCQlpZiAoc2MtPnJ4LmRlZmFudCAhPSBycy5yc19hbnRlbm5hKSB7CisJCQkJaWYgKCsrc2MtPnJ4LnJ4b3RoZXJhbnQgPj0gMykKKwkJCQkJYXRoX3NldGRlZmFudGVubmEoc2MsIHJzLnJzX2FudGVubmEpOworCQkJfSBlbHNlIHsKKwkJCQlzYy0+cngucnhvdGhlcmFudCA9IDA7CisJCQl9CisKIAkJfQogCiAJCWlmIChyeHMtPmZsYWcgJiBSWF9GTEFHX01NSUNfU1RSSVBQRUQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvcmVnLmgKaW5kZXggOGZjYjdlOS4uNmUyZjE4OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3JlZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay9yZWcuaApAQCAtMTAwNiw2ICsxMDA2LDggQEAKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAoQVJfU1JFVl85MzQwKGFoKSA/IDB4NDAxOCA6IDB4NDAzMCkKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19NQVNLX0dQSU8gICAgICAgICAgICAgICAgICAweEZGRkMwMDAwCiAjZGVmaW5lIEFSX0lOVFJfQVNZTkNfTUFTS19HUElPX1MgICAgICAgICAgICAgICAgMTgKKyNkZWZpbmUgQVJfSU5UUl9BU1lOQ19NQVNLX01DSSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEFSX0lOVFJfQVNZTkNfTUFTS19NQ0lfUyAgICAgICAgICAgICAgICAgNwogCiAjZGVmaW5lIEFSX0lOVFJfU1lOQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgKEFSX1NSRVZfOTM0MChhaCkgPyAweDQwMWMgOiAweDQwMzQpCiAjZGVmaW5lIEFSX0lOVFJfU1lOQ19NQVNLX0dQSU8gICAgICAgICAgICAgICAgICAgMHhGRkZDMDAwMApAQCAtMTAxMyw2ICsxMDE1LDE0IEBACiAKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19DQVVTRV9DTFIgICAgICAgICAgICAgICAgICAoQVJfU1JFVl85MzQwKGFoKSA/IDB4NDAyMCA6IDB4NDAzOCkKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19DQVVTRSAgICAgICAgICAgICAgICAgICAgICAoQVJfU1JFVl85MzQwKGFoKSA/IDB4NDAyMCA6IDB4NDAzOCkKKyNkZWZpbmUgQVJfSU5UUl9BU1lOQ19DQVVTRV9NQ0kJCQkgMHgwMDAwMDA4MAorI2RlZmluZSBBUl9JTlRSX0FTWU5DX1VTRUQJCQkgKEFSX0lOVFJfTUFDX0lSUSB8IFwKKwkJCQkJCSAgQVJfSU5UUl9BU1lOQ19DQVVTRV9NQ0kpCisKKy8qIEFzeW5jaHJvbm91cyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFSX0lOVFJfQVNZTkNfRU5BQkxFX01DSSAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQVJfSU5UUl9BU1lOQ19FTkFCTEVfTUNJX1MgICAgICAgNworCiAKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19FTkFCTEUgICAgICAgICAgICAgICAgICAgICAoQVJfU1JFVl85MzQwKGFoKSA/IDB4NDAyNCA6IDB4NDAzYykKICNkZWZpbmUgQVJfSU5UUl9BU1lOQ19FTkFCTEVfR1BJTyAgICAgICAgICAgICAgICAweEZGRkMwMDAwCkBAIC0xMjY5LDYgKzEyNzksOCBAQAogI2RlZmluZSBBUl9SVENfSU5UUl9NQVNLIFwKIAkoKEFSX1NSRVZfOTEwMChhaCkpID8gKEFSX1JUQ19CQVNFICsgMHgwMDU4KSA6IDB4NzA1OCkKIAorI2RlZmluZSBBUl9SVENfS0VFUF9BV0FLRQkweDcwMzQKKwogLyogUlRDX0RFUklWRURfKiAtIG9ubHkgZm9yIEFSOTEwMCAqLwogCiAjZGVmaW5lIEFSX1JUQ19ERVJJVkVEX0NMSyBcCkBAIC0xNTU1LDYgKzE1NjcsOCBAQAogI2RlZmluZSBBUl9ESUFHX0ZSQU1FX05WMCAgICAgICAgICAgMHgwMDAyMDAwMAogI2RlZmluZSBBUl9ESUFHX09CU19QVF9TRUwxICAgICAgICAgMHgwMDBDMDAwMAogI2RlZmluZSBBUl9ESUFHX09CU19QVF9TRUwxX1MgICAgICAgMTgKKyNkZWZpbmUgQVJfRElBR19PQlNfUFRfU0VMMiAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgQVJfRElBR19PQlNfUFRfU0VMMl9TICAgICAgIDI3CiAjZGVmaW5lIEFSX0RJQUdfRk9SQ0VfUlhfQ0xFQVIgICAgICAweDAwMTAwMDAwIC8qIGZvcmNlIHJ4X2NsZWFyIGhpZ2ggKi8KICNkZWZpbmUgQVJfRElBR19JR05PUkVfVklSVF9DUyAgICAgIDB4MDAyMDAwMDAKICNkZWZpbmUgQVJfRElBR19GT1JDRV9DSF9JRExFX0hJR0ggIDB4MDA0MDAwMDAKQEAgLTE3NTIsMTkgKzE3NjYsMTAgQEAKIAogI2RlZmluZSBBUl9CVF9DT0VYX1dMX1dFSUdIVFMwICAgICAweDgxNzQKICNkZWZpbmUgQVJfQlRfQ09FWF9XTF9XRUlHSFRTMSAgICAgMHg4MWM0CisjZGVmaW5lIEFSX01DSV9DT0VYX1dMX1dFSUdIVFMoX2kpICgweDE4YjAgKyAoX2kgPDwgMikpCisjZGVmaW5lIEFSX0JUX0NPRVhfQlRfV0VJR0hUUyhfaSkgICgweDgzYWMgKyAoX2kgPDwgMikpCiAKLSNkZWZpbmUgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMCAgICAgMHg4M2FjCi0jZGVmaW5lIEFSX0JUX0NPRVhfQlRfV0VJR0hUUzEgICAgIDB4ODNiMAotI2RlZmluZSBBUl9CVF9DT0VYX0JUX1dFSUdIVFMyICAgICAweDgzYjQKLSNkZWZpbmUgQVJfQlRfQ09FWF9CVF9XRUlHSFRTMyAgICAgMHg4M2I4Ci0KLSNkZWZpbmUgQVI5MzAwX0JUX1dHSFQgICAgICAgICAgICAgICAgICAgICAweGNjY2M0NDQ0Ci0jZGVmaW5lIEFSOTMwMF9TVE9NUF9BTExfV0xBTl9XR0hUMCAgICAgICAgMHhmZmZmZmZmMAotI2RlZmluZSBBUjkzMDBfU1RPTVBfQUxMX1dMQU5fV0dIVDEgICAgICAgIDB4ZmZmZmZmZjAKLSNkZWZpbmUgQVI5MzAwX1NUT01QX0xPV19XTEFOX1dHSFQwICAgICAgICAweDg4ODg4ODgwCi0jZGVmaW5lIEFSOTMwMF9TVE9NUF9MT1dfV0xBTl9XR0hUMSAgICAgICAgMHg4ODg4ODg4MAotI2RlZmluZSBBUjkzMDBfU1RPTVBfTk9ORV9XTEFOX1dHSFQwICAgICAgIDB4MDAwMDAwMDAKLSNkZWZpbmUgQVI5MzAwX1NUT01QX05PTkVfV0xBTl9XR0hUMSAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIEFSOTMwMF9CVF9XR0hUICAgICAgICAgICAgIDB4Y2NjYzQ0NDQKIAogI2RlZmluZSBBUl9CVF9DT0VYX01PREUyICAgICAgICAgICAweDgxN2MKICNkZWZpbmUgQVJfQlRfQkNOX01JU1NfVEhSRVNIICAgICAgMHgwMDAwMDBmZgpAQCAtMTkzOCwzNyArMTk0MywyNzcgQEAKICNkZWZpbmUgQVJfUEhZX0FHQ19DT05UUk9MX1lDT0tfTUFYX1MJCTYKIAogLyogTUNJIFJlZ2lzdGVycyAqLwotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19FTgkJMHgxODNjCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVCAgICAweDAwMDAwMDAxCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVF9TICAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9DT05UUk9MICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9DT05UUk9MX1MgICAxCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDSyAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDS19TICAgICAyCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfSU5GTyAgICAgICAweDAwMDAwMDA4Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfSU5GT19TICAgICAzCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUICAgICAgICAweDAwMDAwMDEwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUX1MgICAgICA0Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTyAgICAgICAweDAwMDAwMDIwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GT19TICAgICA1Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NQVV9JTlQgICAgICAgICAweDAwMDAwMDQwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NQVV9JTlRfUyAgICAgICA2Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTSAgICAgICAgICAgICAweDAwMDAwMTAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTV9TICAgICAgICAgICA4Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPICAgICAgICAweDAwMDAwMjAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPX1MgICAgICA5Ci0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElORyAgICAweDAwMDAwNDAwCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElOR19TICAxMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HICAgICAgMHgwMDAwMDgwMAotI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HX1MgICAgMTEKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0UgICAgICAgIDB4MDAwMDEwMDAKLSNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0VfUyAgICAgIDEyCi0jZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX01BU0sJKEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTyAgfCBcCisKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwCQkJCTB4MTgwMAorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfSEVBREVSCQkJMHhGRgorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfSEVBREVSX1MJCTAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwX0xFTgkJCTB4MWYwMAorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDBfTEVOX1MJCQk4CisjZGVmaW5lIEFSX01DSV9DT01NQU5EMF9ESVNBQkxFX1RJTUVTVEFNUAkweDIwMDAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQwX0RJU0FCTEVfVElNRVNUQU1QX1MJMTMKKworI2RlZmluZSBBUl9NQ0lfQ09NTUFORDEJCQkJMHgxODA0CisKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyCQkJCTB4MTgwOAorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfVFgJCTB4MDEKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1RYX1MJCTAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JYCQkweDAyCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWF9TCQkxCisjZGVmaW5lIEFSX01DSV9DT01NQU5EMl9SRVNFVF9SWF9OVU1fQ1lDTEVTICAgICAweDNGQworI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUlhfTlVNX0NZQ0xFU19TICAgMgorI2RlZmluZSBBUl9NQ0lfQ09NTUFORDJfUkVTRVRfUkVRX1dBS0VVUCAgICAgICAgMHg0MDAKKyNkZWZpbmUgQVJfTUNJX0NPTU1BTkQyX1JFU0VUX1JFUV9XQUtFVVBfUyAgICAgIDEwCisKKyNkZWZpbmUgQVJfTUNJX1JYX0NUUkwJCQkJMHgxODBjCisKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkwJCQkJMHgxODEwCisvKiAwID0gbm8gZGl2aXNpb24sIDEgPSBkaXZpZGUgYnkgMiwgMiA9IGRpdmlkZSBieSA0LCAzID0gZGl2aWRlIGJ5IDggKi8KKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfQ0xLX0RJVgkJCTB4MDMKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfQ0xLX0RJVl9TCQkwCisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0RJU0FCTEVfTE5BX1VQREFURQkweDA0CisjZGVmaW5lIEFSX01DSV9UWF9DVFJMX0RJU0FCTEVfTE5BX1VQREFURV9TCTIKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfR0FJTl9VUERBVEVfRlJFUQkJMHhGRkZGRjgKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfR0FJTl9VUERBVEVfRlJFUV9TCTMKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfR0FJTl9VUERBVEVfTlVNCQkweEYwMDAwMDAKKyNkZWZpbmUgQVJfTUNJX1RYX0NUUkxfR0FJTl9VUERBVEVfTlVNX1MJMjQKKworI2RlZmluZSBBUl9NQ0lfTVNHX0FUVFJJQlVURVNfVEFCTEUJCQkweDE4MTQKKyNkZWZpbmUgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFX0NIRUNLU1VNCQkweEZGRkYKKyNkZWZpbmUgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFX0NIRUNLU1VNX1MJCTAKKyNkZWZpbmUgQVJfTUNJX01TR19BVFRSSUJVVEVTX1RBQkxFX0lOVkFMSURfSERSCQkweEZGRkYwMDAwCisjZGVmaW5lIEFSX01DSV9NU0dfQVRUUklCVVRFU19UQUJMRV9JTlZBTElEX0hEUl9TCTE2CisKKyNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMAkJCQkweDE4MTgKKyNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMQkJCQkweDE4MWMKKyNkZWZpbmUgQVJfTUNJX0dQTV8wCQkJCQkweDE4MjAKKyNkZWZpbmUgQVJfTUNJX0dQTV8xCQkJCQkweDE4MjQKKyNkZWZpbmUgQVJfTUNJX0dQTV9XUklURV9QVFIJCQkJMHhGRkZGMDAwMAorI2RlZmluZSBBUl9NQ0lfR1BNX1dSSVRFX1BUUl9TCQkJCTE2CisjZGVmaW5lIEFSX01DSV9HUE1fQlVGX0xFTgkJCQkweDAwMDBGRkZGCisjZGVmaW5lIEFSX01DSV9HUE1fQlVGX0xFTl9TCQkJCTAKKworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JBVwkJCQkweDE4MjgKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9FTgkJCQkweDE4MmMKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9TV19NU0dfRE9ORQkJCTB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9TV19NU0dfRE9ORV9TCQkJMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0NQVV9JTlRfTVNHCQkJMHgwMDAwMDAwMgorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0NQVV9JTlRfTVNHX1MJCQkxCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfQ0tTVU1fRkFJTAkJCTB4MDAwMDAwMDQKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9DS1NVTV9GQUlMX1MJCTIKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9JTlZBTElEX0hEUgkJCTB4MDAwMDAwMDgKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9JTlZBTElEX0hEUl9TCQkzCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX0ZBSUwJCQkweDAwMDAwMDEwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX0ZBSUxfUwkJNAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX1NXX01TR19GQUlMCQkJMHgwMDAwMDAyMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX1NXX01TR19GQUlMX1MJCTUKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9UWF9IV19NU0dfRkFJTAkJCTB4MDAwMDAwODAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9UWF9IV19NU0dfRkFJTF9TCQk3CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfVFhfU1dfTVNHX0ZBSUwJCQkweDAwMDAwMTAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfVFhfU1dfTVNHX0ZBSUxfUwkJOAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TRwkJCQkweDAwMDAwMjAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1MJCQk5CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUkVNT1RFX1NMRUVQX1VQREFURQkJMHgwMDAwMDQwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JFTU9URV9TTEVFUF9VUERBVEVfUwkJMTAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9QUkkJCQkJMHgwN2ZmZjgwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX1BSSV9TCQkJMTEKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9QUklfVEhSRVNICQkJMHgwODAwMDAwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX1BSSV9USFJFU0hfUwkJMjcKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CVF9GUkVRCQkJMHgxMDAwMDAwMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0JUX0ZSRVFfUwkJCTI4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfU1RPTVAJCQkweDIwMDAwMDAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQlRfU1RPTVBfUwkJCTI5CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQkJfQUlDX0lSUQkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9CQl9BSUNfSVJRX1MJCQkzMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0NPTlRfSU5GT19USU1FT1VUCQkweDgwMDAwMDAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfQ09OVF9JTkZPX1RJTUVPVVRfUwkJMzEKKworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX0RFRkFVTFQgICAgKEFSX01DSV9JTlRFUlJVUFRfU1dfTVNHX0RPTkUJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfSU5WQUxJRF9IRFIJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX0ZBSUwJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfU1dfTVNHX0ZBSUwJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfVFhfSFdfTVNHX0ZBSUwJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfVFhfU1dfTVNHX0ZBSUwJICB8IFwKKwkJCQkgICAgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHCQkgIHwgXAorCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9SRU1PVEVfU0xFRVBfVVBEQVRFIHwgXAorCQkJCSAgICAgQVJfTUNJX0lOVEVSUlVQVF9DT05UX0lORk9fVElNRU9VVCkKKworI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX01TR19GQUlMX01BU0sgKEFSX01DSV9JTlRFUlJVUFRfUlhfSFdfTVNHX0ZBSUwgfCBcCisJCQkJCUFSX01DSV9JTlRFUlJVUFRfUlhfU1dfTVNHX0ZBSUwgfCBcCisJCQkJCUFSX01DSV9JTlRFUlJVUFRfVFhfSFdfTVNHX0ZBSUwgfCBcCisJCQkJCUFSX01DSV9JTlRFUlJVUFRfVFhfU1dfTVNHX0ZBSUwpCisKKyNkZWZpbmUgQVJfTUNJX1JFTU9URV9DUFVfSU5UCQkJCTB4MTgzMAorI2RlZmluZSBBUl9NQ0lfUkVNT1RFX0NQVV9JTlRfRU4JCQkweDE4MzQKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkFXCQkJMHgxODM4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0VOCQkJMHgxODNjCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1JFTU9URV9SRVNFVAkJMHgwMDAwMDAwMQorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19SRU1PVEVfUkVTRVRfUwkJMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTAkJMHgwMDAwMDAwMgorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTF9TCQkxCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDSwkJMHgwMDAwMDAwNAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX05BQ0tfUwkJMgorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk8JCTB4MDAwMDAwMDgKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9JTkZPX1MJCTMKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9SU1QJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9SU1RfUwkJNAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TQ0hEX0lORk8JCTB4MDAwMDAwMjAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU0NIRF9JTkZPX1MJCTUKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ1BVX0lOVAkJCTB4MDAwMDAwNDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ1BVX0lOVF9TCQk2CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0dQTQkJCTB4MDAwMDAxMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfR1BNX1MJCQk4CisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPCQkweDAwMDAwMjAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPX1MJCTkKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU1lTX1NMRUVQSU5HCQkweDAwMDAwNDAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElOR19TCQkxMAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HCQkweDAwMDAwODAwCisjZGVmaW5lIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19XQUtJTkdfUwkJMTEKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0UJCTB4MDAwMDEwMDAKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0VfUwkJMTIKKyNkZWZpbmUgQVJfTUNJX0lOVEVSUlVQVF9SWF9IV19NU0dfTUFTSwkgKEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NDSERfSU5GTyAgfCBcCiAJCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfTE5BX0NPTlRST0x8IFwKIAkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfSU5GTyAgIHwgXAogCQkJCQkgIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfTkFDSyAgfCBcCiAJCQkJCSAgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9JTkZPICB8IFwKIAkJCQkJICBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX1JTVCkKIAorI2RlZmluZSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19ERUZBVUxUIChBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19HUE0JIHwgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVNT1RFX1JFU0VUfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19TWVNfV0FLSU5HICB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX1NZU19TTEVFUElOR3wgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfU0NIRF9JTkZPICAgfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19MTkFfQ09OVFJPTCB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0xOQV9JTkZPICAgIHwgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfQ09OVF9OQUNLICAgfCBcCisJCQkJCSBBUl9NQ0lfSU5URVJSVVBUX1JYX01TR19DT05UX0lORk8gICB8IFwKKwkJCQkJIEFSX01DSV9JTlRFUlJVUFRfUlhfTVNHX0NPTlRfUlNUICAgIHwgXAorCQkJCQkgQVJfTUNJX0lOVEVSUlVQVF9SWF9NU0dfUkVRX1dBS0UpCisKKyNkZWZpbmUgQVJfTUNJX0NQVV9JTlQJCQkJCTB4MTg0MAorCisjZGVmaW5lIEFSX01DSV9SWF9TVEFUVVMJCQkweDE4NDQKKyNkZWZpbmUgQVJfTUNJX1JYX0xBU1RfU0NIRF9NU0dfSU5ERVgJCTB4MDAwMDBGMDAKKyNkZWZpbmUgQVJfTUNJX1JYX0xBU1RfU0NIRF9NU0dfSU5ERVhfUwkJOAorI2RlZmluZSBBUl9NQ0lfUlhfUkVNT1RFX1NMRUVQCQkJMHgwMDAwMTAwMAorI2RlZmluZSBBUl9NQ0lfUlhfUkVNT1RFX1NMRUVQX1MJCTEyCisjZGVmaW5lIEFSX01DSV9SWF9NQ0lfQ0xLX1JFUQkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgQVJfTUNJX1JYX01DSV9DTEtfUkVRX1MJCQkxMworCisjZGVmaW5lIEFSX01DSV9DT05UX1NUQVRVUwkJCTB4MTg0OAorI2RlZmluZSBBUl9NQ0lfQ09OVF9SU1NJX1BPV0VSCQkJMHgwMDAwMDBGRgorI2RlZmluZSBBUl9NQ0lfQ09OVF9SU1NJX1BPV0VSX1MJCTAKKyNkZWZpbmUgQVJfTUNJX0NPTlRfUlJJT1JJVFkJCQkweDAwMDBGRjAwCisjZGVmaW5lIEFSX01DSV9DT05UX1JSSU9SSVRZX1MJCQk4CisjZGVmaW5lIEFSX01DSV9DT05UX1RYUlgJCQkweDAwMDEwMDAwCisjZGVmaW5lIEFSX01DSV9DT05UX1RYUlhfUwkJCTE2CisKKyNkZWZpbmUgQVJfTUNJX0JUX1BSSTAJCQkJMHgxODRjCisjZGVmaW5lIEFSX01DSV9CVF9QUkkxCQkJCTB4MTg1MAorI2RlZmluZSBBUl9NQ0lfQlRfUFJJMgkJCQkweDE4NTQKKyNkZWZpbmUgQVJfTUNJX0JUX1BSSTMJCQkJMHgxODU4CisjZGVmaW5lIEFSX01DSV9CVF9QUkkJCQkJMHgxODVjCisjZGVmaW5lIEFSX01DSV9XTF9GUkVRMAkJCQkweDE4NjAKKyNkZWZpbmUgQVJfTUNJX1dMX0ZSRVExCQkJCTB4MTg2NAorI2RlZmluZSBBUl9NQ0lfV0xfRlJFUTIJCQkJMHgxODY4CisjZGVmaW5lIEFSX01DSV9HQUlOCQkJCTB4MTg2YworI2RlZmluZSBBUl9NQ0lfV0JUSU1FUjEJCQkJMHgxODcwCisjZGVmaW5lIEFSX01DSV9XQlRJTUVSMgkJCQkweDE4NzQKKyNkZWZpbmUgQVJfTUNJX1dCVElNRVIzCQkJCTB4MTg3OAorI2RlZmluZSBBUl9NQ0lfV0JUSU1FUjQJCQkJMHgxODdjCisjZGVmaW5lIEFSX01DSV9NQVhHQUlOCQkJCTB4MTg4MAorI2RlZmluZSBBUl9NQ0lfSFdfU0NIRF9UQkxfQ1RMCQkJMHgxODg0CisjZGVmaW5lIEFSX01DSV9IV19TQ0hEX1RCTF9EMAkJCTB4MTg4OAorI2RlZmluZSBBUl9NQ0lfSFdfU0NIRF9UQkxfRDEJCQkweDE4OGMKKyNkZWZpbmUgQVJfTUNJX0hXX1NDSERfVEJMX0QyCQkJMHgxODkwCisjZGVmaW5lIEFSX01DSV9IV19TQ0hEX1RCTF9EMwkJCTB4MTg5NAorI2RlZmluZSBBUl9NQ0lfVFhfUEFZTE9BRDAJCQkweDE4OTgKKyNkZWZpbmUgQVJfTUNJX1RYX1BBWUxPQUQxCQkJMHgxODljCisjZGVmaW5lIEFSX01DSV9UWF9QQVlMT0FEMgkJCTB4MThhMAorI2RlZmluZSBBUl9NQ0lfVFhfUEFZTE9BRDMJCQkweDE4YTQKKyNkZWZpbmUgQVJfQlRDT0VYX1dCVElNRVIJCQkweDE4YTgKKworI2RlZmluZSBBUl9CVENPRVhfQ1RSTAkJCQkJMHgxOGFjCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0FSOTQ2Ml9NT0RFCQkJMHgwMDAwMDAwMQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9BUjk0NjJfTU9ERV9TCQkJMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9XQlRJTUVSX0VOCQkJMHgwMDAwMDAwMgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9XQlRJTUVSX0VOX1MJCQkxCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX01DSV9NT0RFX0VOCQkJMHgwMDAwMDAwNAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9NQ0lfTU9ERV9FTl9TCQkJMgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9MTkFfU0hBUkVECQkJMHgwMDAwMDAwOAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9MTkFfU0hBUkVEX1MJCQkzCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1BBX1NIQVJFRAkJCTB4MDAwMDAwMTAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfUEFfU0hBUkVEX1MJCQk0CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX09ORV9TVEVQX0xPT0tfQUhFQURfRU4JCTB4MDAwMDAwMjAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfT05FX1NURVBfTE9PS19BSEVBRF9FTl9TCQk1CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1RJTUVfVE9fTkVYVF9CVF9USFJFU0hfRU4JMHgwMDAwMDA0MAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9USU1FX1RPX05FWFRfQlRfVEhSRVNIX0VOX1MJNgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9OVU1fQU5URU5OQVMJCQkweDAwMDAwMTgwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX05VTV9BTlRFTk5BU19TCQkJNworI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9SWF9DSEFJTl9NQVNLCQkJMHgwMDAwMEUwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9SWF9DSEFJTl9NQVNLX1MJCQk5CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0FHR1JfVEhSRVNICQkJMHgwMDAwNzAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9BR0dSX1RIUkVTSF9TCQkJMTIKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9CQ04JCQkweDAwMDgwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMXzFfQ0hBSU5fQkNOX1MJCQkxOQorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF8xX0NIQUlOX0FDSwkJCTB4MDAxMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfMV9DSEFJTl9BQ0tfUwkJCTIwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1dBSVRfQkFfTUFSR0lOCQkJMHgxRkUwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9XQUlUX0JBX01BUkdJTl9TCQkJMjgKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfUkVEVUNFX1RYUFdSCQkJMHgyMDAwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9SRURVQ0VfVFhQV1JfUwkJCTI5CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfRU5BQkxFXzEwCQkJMHg0MDAwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9TUERUX0VOQUJMRV8xMF9TCQkJMzAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9QT0xBUklUWQkJCTB4ODAwMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9QT0xBUklUWV9TCQkJMzEKKworI2RlZmluZSBBUl9CVENPRVhfV0xfV0VJR0hUUzAJCQkJMHgxOGIwCisjZGVmaW5lIEFSX0JUQ09FWF9XTF9XRUlHSFRTMQkJCQkweDE4YjQKKyNkZWZpbmUgQVJfQlRDT0VYX1dMX1dFSUdIVFMyCQkJCTB4MThiOAorI2RlZmluZSBBUl9CVENPRVhfV0xfV0VJR0hUUzMJCQkJMHgxOGJjCisjZGVmaW5lIEFSX0JUQ09FWF9NQVhfVFhQV1IoX3gpCQkJCSgweDE4YzAgKyAoKF94KSA8PCAyKSkKKyNkZWZpbmUgQVJfQlRDT0VYX1dMX0xOQQkJCQkweDE5NDAKKyNkZWZpbmUgQVJfQlRDT0VYX1JGR0FJTl9DVFJMCQkJCTB4MTk0NAorCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMgkJCQkJMHgxOTQ4CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9UWFBXUl9USFJFU0gJCQkweDAwMDdGODAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9UWFBXUl9USFJFU0hfUwkJCTExCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9UWF9DSEFJTl9NQVNLCQkJMHgwMDM4MDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfVFhfQ0hBSU5fTUFTS19TCQkJMTkKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX1JYX0RFV0VJR0hUCQkJMHgwMDQwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfUlhfREVXRUlHSFRfUwkJCTIyCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9HUElPX09CU19TRUwJCQkweDAwODAwMDAwCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9HUElPX09CU19TRUxfUwkJCTIzCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9NQUNfQkJfT0JTX1NFTAkJCTB4MDEwMDAwMDAKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkwyX01BQ19CQl9PQlNfU0VMX1MJCTI0CisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMl9ERVNDX0JBU0VEX1RYUFdSX0VOQUJMRQkJMHgwMjAwMDAwMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDJfREVTQ19CQVNFRF9UWFBXUl9FTkFCTEVfUwkyNQorCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX1NQRFRfRU5BQkxFICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfU1BEVF9FTkFCTEVfUyAgICAgICAgMAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9CVF9PV05fU1BEVF9DVFJMICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMX0JUX09XTl9TUERUX0NUUkxfUyAgIDEKKyNkZWZpbmUgQVJfQlRDT0VYX0NUUkxfVVNFX0xBVENIRURfQlRfQU5UICAgMHgwMDAwMDAwNAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTF9VU0VfTEFUQ0hFRF9CVF9BTlRfUyAyCisjZGVmaW5lIEFSX0dMQl9XTEFOX1VBUlRfSU5URl9FTiAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgQVJfR0xCX1dMQU5fVUFSVF9JTlRGX0VOX1MgICAgICAgICAgMTcKKyNkZWZpbmUgQVJfR0xCX0RTX0pUQUdfRElTQUJMRSAgICAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBBUl9HTEJfRFNfSlRBR19ESVNBQkxFX1MgICAgICAgICAgICAxOAorCisjZGVmaW5lIEFSX0JUQ09FWF9SQyAgICAgICAgICAgICAgICAgICAgMHgxOTRjCisjZGVmaW5lIEFSX0JUQ09FWF9NQVhfUkZHQUlOKF94KSAgICAgICAgKDB4MTk1MCArICgoX3gpIDw8IDIpKQorI2RlZmluZSBBUl9CVENPRVhfREJHICAgICAgICAgICAgICAgICAgIDB4MWE1MAorI2RlZmluZSBBUl9NQ0lfTEFTVF9IV19NU0dfSERSICAgICAgICAgIDB4MWE1NAorI2RlZmluZSBBUl9NQ0lfTEFTVF9IV19NU0dfQkRZICAgICAgICAgIDB4MWE1OAorCisjZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzIgICAgICAgICAgICAgMHgxYTVjCisjZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzJfTUVNX0JBU0VEICAgMHgwMDAwMDAwMQorI2RlZmluZSBBUl9NQ0lfU0NIRF9UQUJMRV8yX01FTV9CQVNFRF9TIDAKKyNkZWZpbmUgQVJfTUNJX1NDSERfVEFCTEVfMl9IV19CQVNFRCAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFSX01DSV9TQ0hEX1RBQkxFXzJfSFdfQkFTRURfUyAgMQorCisjZGVmaW5lIEFSX0JUQ09FWF9DVFJMMyAgICAgICAgICAgICAgIDB4MWE2MAorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDNfQ09OVF9JTkZPX1RJTUVPVVQJMHgwMDAwMGZmZgorI2RlZmluZSBBUl9CVENPRVhfQ1RSTDNfQ09OVF9JTkZPX1RJTUVPVVRfUwkwCisKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvd21pLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsvd21pLmMKaW5kZXggMzU0MjJmYy4uNjVjODg5NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3dtaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay93bWkuYwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJCQkJCQkgICBmYXRhbF93b3JrKTsKIAlzdHJ1Y3QgYXRoX2NvbW1vbiAqY29tbW9uID0gYXRoOWtfaHdfY29tbW9uKHByaXYtPmFoKTsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0ZBVEFMLCAiRkFUQUwgRXZlbnQgcmVjZWl2ZWQsIHJlc2V0dGluZyBkZXZpY2VcbiIpOworCWF0aF9kYmcoY29tbW9uLCBGQVRBTCwgIkZBVEFMIEV2ZW50IHJlY2VpdmVkLCByZXNldHRpbmcgZGV2aWNlXG4iKTsKIAlhdGg5a19odGNfcmVzZXQocHJpdik7CiB9CiAKQEAgLTMzMCw4ICszMzAsNyBAQAogCiAJdGltZV9sZWZ0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KCZ3bWktPmNtZF93YWl0LCB0aW1lb3V0KTsKIAlpZiAoIXRpbWVfbGVmdCkgewotCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19XTUksCi0JCQkiVGltZW91dCB3YWl0aW5nIGZvciBXTUkgY29tbWFuZDogJXNcbiIsCisJCWF0aF9kYmcoY29tbW9uLCBXTUksICJUaW1lb3V0IHdhaXRpbmcgZm9yIFdNSSBjb21tYW5kOiAlc1xuIiwKIAkJCXdtaV9jbWRfdG9fbmFtZShjbWRfaWQpKTsKIAkJbXV0ZXhfdW5sb2NrKCZ3bWktPm9wX211dGV4KTsKIAkJcmV0dXJuIC1FVElNRURPVVQ7CkBAIC0zNDIsOCArMzQxLDcgQEAKIAlyZXR1cm4gMDsKIAogb3V0OgotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1dNSSwKLQkJIldNSSBmYWlsdXJlIGZvcjogJXNcbiIsIHdtaV9jbWRfdG9fbmFtZShjbWRfaWQpKTsKKwlhdGhfZGJnKGNvbW1vbiwgV01JLCAiV01JIGZhaWx1cmUgZm9yOiAlc1xuIiwgd21pX2NtZF90b19uYW1lKGNtZF9pZCkpOwogCW11dGV4X3VubG9jaygmd21pLT5vcF9tdXRleCk7CiAJa2ZyZWVfc2tiKHNrYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvYXRoOWsveG1pdC5jCmluZGV4IDAzYjBhNjUuLjMxODI0MDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9hdGg5ay94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2F0aDlrL3htaXQuYwpAQCAtNTMsNyArNTMsNyBAQAogCQkJICAgIGludCB0eF9mbGFncywgc3RydWN0IGF0aF90eHEgKnR4cSk7CiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGVfYnVmKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsCiAJCQkJc3RydWN0IGF0aF90eHEgKnR4cSwgc3RydWN0IGxpc3RfaGVhZCAqYmZfcSwKLQkJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIGludCB0eG9rLCBpbnQgc2VuZGJhcik7CisJCQkJc3RydWN0IGF0aF90eF9zdGF0dXMgKnRzLCBpbnQgdHhvayk7CiBzdGF0aWMgdm9pZCBhdGhfdHhfdHhxYWRkYnVmKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxLAogCQkJICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBib29sIGludGVybmFsKTsKIHN0YXRpYyB2b2lkIGF0aF90eF9yY19zdGF0dXMoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfYnVmICpiZiwKQEAgLTEwNCw2ICsxMDQsMzIgQEAKIC8qIEFnZ3JlZ2F0aW9uIGxvZ2ljICovCiAvKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgdm9pZCBhdGhfdHhxX2xvY2soc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEpCisJX19hY3F1aXJlcygmdHhxLT5heHFfbG9jaykKK3sKKwlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBhdGhfdHhxX3VubG9jayhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF90eHEgKnR4cSkKKwlfX3JlbGVhc2VzKCZ0eHEtPmF4cV9sb2NrKQoreworCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgYXRoX3R4cV91bmxvY2tfY29tcGxldGUoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEpCisJX19yZWxlYXNlcygmdHhxLT5heHFfbG9jaykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcSk7CisJc2tiX3F1ZXVlX3NwbGljZV9pbml0KCZ0eHEtPmNvbXBsZXRlX3EsICZxKTsKKwlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisKKwl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJnEpKSkKKwkJaWVlZTgwMjExX3R4X3N0YXR1cyhzYy0+aHcsIHNrYik7Cit9CisKIHN0YXRpYyB2b2lkIGF0aF90eF9xdWV1ZV90aWQoc3RydWN0IGF0aF90eHEgKnR4cSwgc3RydWN0IGF0aF9hdHhfdGlkICp0aWQpCiB7CiAJc3RydWN0IGF0aF9hdHhfYWMgKmFjID0gdGlkLT5hYzsKQEAgLTEzMCw3ICsxNTYsNyBAQAogCiAJV0FSTl9PTighdGlkLT5wYXVzZWQpOwogCi0Jc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwlhdGhfdHhxX2xvY2soc2MsIHR4cSk7CiAJdGlkLT5wYXVzZWQgPSBmYWxzZTsKIAogCWlmIChza2JfcXVldWVfZW1wdHkoJnRpZC0+YnVmX3EpKQpAQCAtMTM5LDcgKzE2NSw3IEBACiAJYXRoX3R4X3F1ZXVlX3RpZCh0eHEsIHRpZCk7CiAJYXRoX3R4cV9zY2hlZHVsZShzYywgdHhxKTsKIHVubG9jazoKLQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJYXRoX3R4cV91bmxvY2tfY29tcGxldGUoc2MsIHR4cSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgYXRoX2ZyYW1lX2luZm8gKmdldF9mcmFtZV9pbmZvKHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xNTAsNiArMTc2LDEyIEBACiAJcmV0dXJuIChzdHJ1Y3QgYXRoX2ZyYW1lX2luZm8gKikgJnR4X2luZm8tPnJhdGVfZHJpdmVyX2RhdGFbMF07CiB9CiAKK3N0YXRpYyB2b2lkIGF0aF9zZW5kX2JhcihzdHJ1Y3QgYXRoX2F0eF90aWQgKnRpZCwgdTE2IHNlcW5vKQoreworCWllZWU4MDIxMV9zZW5kX2Jhcih0aWQtPmFuLT52aWYsIHRpZC0+YW4tPnN0YS0+YWRkciwgdGlkLT50aWRubywKKwkJCSAgIHNlcW5vIDw8IElFRUU4MDIxMV9TRVFfU0VRX1NISUZUKTsKK30KKwogc3RhdGljIHZvaWQgYXRoX3R4X2ZsdXNoX3RpZChzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9hdHhfdGlkICp0aWQpCiB7CiAJc3RydWN0IGF0aF90eHEgKnR4cSA9IHRpZC0+YWMtPnR4cTsKQEAgLTE1OCwyOCArMTkwLDM2IEBACiAJc3RydWN0IGxpc3RfaGVhZCBiZl9oZWFkOwogCXN0cnVjdCBhdGhfdHhfc3RhdHVzIHRzOwogCXN0cnVjdCBhdGhfZnJhbWVfaW5mbyAqZmk7CisJYm9vbCBzZW5kYmFyID0gZmFsc2U7CiAKIAlJTklUX0xJU1RfSEVBRCgmYmZfaGVhZCk7CiAKIAltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKLQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZ0aWQtPmJ1Zl9xKSkpIHsKIAkJZmkgPSBnZXRfZnJhbWVfaW5mbyhza2IpOwogCQliZiA9IGZpLT5iZjsKIAotCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAJCWlmIChiZiAmJiBmaS0+cmV0cmllcykgewogCQkJbGlzdF9hZGRfdGFpbCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKIAkJCWF0aF90eF91cGRhdGVfYmF3KHNjLCB0aWQsIGJmLT5iZl9zdGF0ZS5zZXFubyk7Ci0JCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgJnRzLCAwLCAxKTsKKwkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCAmdHMsIDApOworCQkJc2VuZGJhciA9IHRydWU7CiAJCX0gZWxzZSB7CiAJCQlhdGhfdHhfc2VuZF9ub3JtYWwoc2MsIHR4cSwgTlVMTCwgc2tiKTsKIAkJfQotCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCX0KIAotCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwlpZiAodGlkLT5iYXdfaGVhZCA9PSB0aWQtPmJhd190YWlsKSB7CisJCXRpZC0+c3RhdGUgJj0gfkFHR1JfQUREQkFfQ09NUExFVEU7CisJCXRpZC0+c3RhdGUgJj0gfkFHR1JfQ0xFQU5VUDsKKwl9CisKKwlpZiAoc2VuZGJhcikgeworCQlhdGhfdHhxX3VubG9jayhzYywgdHhxKTsKKwkJYXRoX3NlbmRfYmFyKHRpZCwgdGlkLT5zZXFfc3RhcnQpOworCQlhdGhfdHhxX2xvY2soc2MsIHR4cSk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfdXBkYXRlX2JhdyhzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IGF0aF9hdHhfdGlkICp0aWQsCkBAIC0xOTUsNiArMjM1LDggQEAKIAl3aGlsZSAodGlkLT5iYXdfaGVhZCAhPSB0aWQtPmJhd190YWlsICYmICF0ZXN0X2JpdCh0aWQtPmJhd19oZWFkLCB0aWQtPnR4X2J1ZikpIHsKIAkJSU5DUih0aWQtPnNlcV9zdGFydCwgSUVFRTgwMjExX1NFUV9NQVgpOwogCQlJTkNSKHRpZC0+YmF3X2hlYWQsIEFUSF9USURfTUFYX0JVRlMpOworCQlpZiAodGlkLT5iYXJfaW5kZXggPj0gMCkKKwkJCXRpZC0+YmFyX2luZGV4LS07CiAJfQogfQogCkBAIC0yMzgsOSArMjgwLDcgQEAKIAkJYmYgPSBmaS0+YmY7CiAKIAkJaWYgKCFiZikgewotCQkJc3Bpbl91bmxvY2soJnR4cS0+YXhxX2xvY2spOwogCQkJYXRoX3R4X2NvbXBsZXRlKHNjLCBza2IsIEFUSF9UWF9FUlJPUiwgdHhxKTsKLQkJCXNwaW5fbG9jaygmdHhxLT5heHFfbG9jayk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0yNDksMjQgKzI4OSwyNiBAQAogCQlpZiAoZmktPnJldHJpZXMpCiAJCQlhdGhfdHhfdXBkYXRlX2JhdyhzYywgdGlkLCBiZi0+YmZfc3RhdGUuc2Vxbm8pOwogCi0JCXNwaW5fdW5sb2NrKCZ0eHEtPmF4cV9sb2NrKTsKLQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsICZ0cywgMCwgMCk7Ci0JCXNwaW5fbG9jaygmdHhxLT5heHFfbG9jayk7CisJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCAmdHMsIDApOwogCX0KIAogCXRpZC0+c2VxX25leHQgPSB0aWQtPnNlcV9zdGFydDsKIAl0aWQtPmJhd190YWlsID0gdGlkLT5iYXdfaGVhZDsKKwl0aWQtPmJhcl9pbmRleCA9IC0xOwogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfc2V0X3JldHJ5KHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxLAotCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgY291bnQpCiB7CiAJc3RydWN0IGF0aF9mcmFtZV9pbmZvICpmaSA9IGdldF9mcmFtZV9pbmZvKHNrYik7CiAJc3RydWN0IGF0aF9idWYgKmJmID0gZmktPmJmOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJaW50IHByZXYgPSBmaS0+cmV0cmllczsKIAogCVRYX1NUQVRfSU5DKHR4cS0+YXhxX3FudW0sIGFfcmV0cmllcyk7Ci0JaWYgKGZpLT5yZXRyaWVzKysgPiAwKQorCWZpLT5yZXRyaWVzICs9IGNvdW50OworCisJaWYgKHByZXYgPiAwKQogCQlyZXR1cm47CiAKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CkBAIC0zNjUsNyArNDA3LDcgQEAKIAlzdHJ1Y3QgYXRoX2J1ZiAqYmZfbmV4dCwgKmJmX2xhc3QgPSBiZi0+YmZfbGFzdGJmOwogCXN0cnVjdCBsaXN0X2hlYWQgYmZfaGVhZDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGJmX3BlbmRpbmc7Ci0JdTE2IHNlcV9zdCA9IDAsIGFja2VkX2NudCA9IDAsIHR4ZmFpbF9jbnQgPSAwOworCXUxNiBzZXFfc3QgPSAwLCBhY2tlZF9jbnQgPSAwLCB0eGZhaWxfY250ID0gMCwgc2VxX2ZpcnN0OwogCXUzMiBiYVtXTUVfQkFfQk1QX1NJWkUgPj4gNV07CiAJaW50IGlzYWdnciwgdHhmYWlsLCB0eHBlbmRpbmcsIHNlbmRiYXIgPSAwLCBuZWVkcmVzZXQgPSAwLCBuYmFkID0gMDsKIAlib29sIHJjX3VwZGF0ZSA9IHRydWU7CkBAIC0zNzQsNiArNDE2LDggQEAKIAlpbnQgbmZyYW1lczsKIAl1OCB0aWRubzsKIAlib29sIGZsdXNoID0gISEodHMtPnRzX3N0YXR1cyAmIEFUSDlLX1RYX0ZMVVNIKTsKKwlpbnQgaSwgcmV0cmllczsKKwlpbnQgYmFyX2luZGV4ID0gLTE7CiAKIAlza2IgPSBiZi0+YmZfbXBkdTsKIAloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CkBAIC0zODIsNiArNDI2LDEwIEBACiAKIAltZW1jcHkocmF0ZXMsIHR4X2luZm8tPmNvbnRyb2wucmF0ZXMsIHNpemVvZihyYXRlcykpOwogCisJcmV0cmllcyA9IHRzLT50c19sb25ncmV0cnkgKyAxOworCWZvciAoaSA9IDA7IGkgPCB0cy0+dHNfcmF0ZWluZGV4OyBpKyspCisJCXJldHJpZXMgKz0gcmF0ZXNbaV0uY291bnQ7CisKIAlyY3VfcmVhZF9sb2NrKCk7CiAKIAlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGFfYnlfaWZhZGRyKGh3LCBoZHItPmFkZHIxLCBoZHItPmFkZHIyKTsKQEAgLTM5NSw4ICs0NDMsNyBAQAogCQkJaWYgKCFiZi0+YmZfc3RhbGUgfHwgYmZfbmV4dCAhPSBOVUxMKQogCQkJCWxpc3RfbW92ZV90YWlsKCZiZi0+bGlzdCwgJmJmX2hlYWQpOwogCi0JCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgdHMsCi0JCQkJMCwgMCk7CisJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgdHMsIDApOwogCiAJCQliZiA9IGJmX25leHQ7CiAJCX0KQEAgLTQwNiw2ICs0NTMsNyBAQAogCWFuID0gKHN0cnVjdCBhdGhfbm9kZSAqKXN0YS0+ZHJ2X3ByaXY7CiAJdGlkbm8gPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKVswXSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwogCXRpZCA9IEFUSF9BTl8yX1RJRChhbiwgdGlkbm8pOworCXNlcV9maXJzdCA9IHRpZC0+c2VxX3N0YXJ0OwogCiAJLyoKIAkgKiBUaGUgaGFyZHdhcmUgb2NjYXNpb25hbGx5IHNlbmRzIGEgdHggc3RhdHVzIGZvciB0aGUgd3JvbmcgVElELgpAQCAtNDU1LDI1ICs1MDMsMjUgQEAKIAkJfSBlbHNlIGlmICghaXNhZ2dyICYmIHR4b2spIHsKIAkJCS8qIHRyYW5zbWl0IGNvbXBsZXRpb24gKi8KIAkJCWFja2VkX2NudCsrOwotCQl9IGVsc2UgewotCQkJaWYgKCh0aWQtPnN0YXRlICYgQUdHUl9DTEVBTlVQKSB8fCAhcmV0cnkpIHsKLQkJCQkvKgotCQkJCSAqIGNsZWFudXAgaW4gcHJvZ3Jlc3MsIGp1c3QgZmFpbAotCQkJCSAqIHRoZSB1bi1hY2tlZCBzdWItZnJhbWVzCi0JCQkJICovCi0JCQkJdHhmYWlsID0gMTsKLQkJCX0gZWxzZSBpZiAoZmx1c2gpIHsKLQkJCQl0eHBlbmRpbmcgPSAxOwotCQkJfSBlbHNlIGlmIChmaS0+cmV0cmllcyA8IEFUSF9NQVhfU1dfUkVUUklFUykgewotCQkJCWlmICh0eG9rIHx8ICFhbi0+c2xlZXBpbmcpCi0JCQkJCWF0aF90eF9zZXRfcmV0cnkoc2MsIHR4cSwgYmYtPmJmX21wZHUpOworCQl9IGVsc2UgaWYgKCh0aWQtPnN0YXRlICYgQUdHUl9DTEVBTlVQKSB8fCAhcmV0cnkpIHsKKwkJCS8qCisJCQkgKiBjbGVhbnVwIGluIHByb2dyZXNzLCBqdXN0IGZhaWwKKwkJCSAqIHRoZSB1bi1hY2tlZCBzdWItZnJhbWVzCisJCQkgKi8KKwkJCXR4ZmFpbCA9IDE7CisJCX0gZWxzZSBpZiAoZmx1c2gpIHsKKwkJCXR4cGVuZGluZyA9IDE7CisJCX0gZWxzZSBpZiAoZmktPnJldHJpZXMgPCBBVEhfTUFYX1NXX1JFVFJJRVMpIHsKKwkJCWlmICh0eG9rIHx8ICFhbi0+c2xlZXBpbmcpCisJCQkJYXRoX3R4X3NldF9yZXRyeShzYywgdHhxLCBiZi0+YmZfbXBkdSwKKwkJCQkJCSByZXRyaWVzKTsKIAotCQkJCXR4cGVuZGluZyA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCXR4ZmFpbCA9IDE7Ci0JCQkJc2VuZGJhciA9IDE7Ci0JCQkJdHhmYWlsX2NudCsrOwotCQkJfQorCQkJdHhwZW5kaW5nID0gMTsKKwkJfSBlbHNlIHsKKwkJCXR4ZmFpbCA9IDE7CisJCQl0eGZhaWxfY250Kys7CisJCQliYXJfaW5kZXggPSBtYXhfdChpbnQsIGJhcl9pbmRleCwKKwkJCQlBVEhfQkFfSU5ERVgoc2VxX2ZpcnN0LCBzZXFubykpOwogCQl9CiAKIAkJLyoKQEAgLTQ5MCw5ICs1MzgsNyBAQAogCQkJICogY29tcGxldGUgdGhlIGFja2VkLW9uZXMveHJldHJpZWQgb25lczsgdXBkYXRlCiAJCQkgKiBibG9jay1hY2sgd2luZG93CiAJCQkgKi8KLQkJCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAJCQlhdGhfdHhfdXBkYXRlX2JhdyhzYywgdGlkLCBzZXFubyk7Ci0JCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAKIAkJCWlmIChyY191cGRhdGUgJiYgKGFja2VkX2NudCA9PSAxIHx8IHR4ZmFpbF9jbnQgPT0gMSkpIHsKIAkJCQltZW1jcHkodHhfaW5mby0+Y29udHJvbC5yYXRlcywgcmF0ZXMsIHNpemVvZihyYXRlcykpOwpAQCAtNTAxLDMzICs1NDcsMzAgQEAKIAkJCX0KIAogCQkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgJmJmX2hlYWQsIHRzLAotCQkJCSF0eGZhaWwsIHNlbmRiYXIpOworCQkJCSF0eGZhaWwpOwogCQl9IGVsc2UgewogCQkJLyogcmV0cnkgdGhlIHVuLWFja2VkIG9uZXMgKi8KLQkJCWlmICghKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpKSB7Ci0JCQkJaWYgKGJmLT5iZl9uZXh0ID09IE5VTEwgJiYgYmZfbGFzdC0+YmZfc3RhbGUpIHsKLQkJCQkJc3RydWN0IGF0aF9idWYgKnRiZjsKKwkJCWlmICghKHNjLT5zY19haC0+Y2Fwcy5od19jYXBzICYgQVRIOUtfSFdfQ0FQX0VETUEpICYmCisJCQkgICAgYmYtPmJmX25leHQgPT0gTlVMTCAmJiBiZl9sYXN0LT5iZl9zdGFsZSkgeworCQkJCXN0cnVjdCBhdGhfYnVmICp0YmY7CiAKLQkJCQkJdGJmID0gYXRoX2Nsb25lX3R4YnVmKHNjLCBiZl9sYXN0KTsKLQkJCQkJLyoKLQkJCQkJICogVXBkYXRlIHR4IGJhdyBhbmQgY29tcGxldGUgdGhlCi0JCQkJCSAqIGZyYW1lIHdpdGggZmFpbGVkIHN0YXR1cyBpZiB3ZQotCQkJCQkgKiBydW4gb3V0IG9mIHR4IGJ1Zi4KLQkJCQkJICovCi0JCQkJCWlmICghdGJmKSB7Ci0JCQkJCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwotCQkJCQkJYXRoX3R4X3VwZGF0ZV9iYXcoc2MsIHRpZCwgc2Vxbm8pOwotCQkJCQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOworCQkJCXRiZiA9IGF0aF9jbG9uZV90eGJ1ZihzYywgYmZfbGFzdCk7CisJCQkJLyoKKwkJCQkgKiBVcGRhdGUgdHggYmF3IGFuZCBjb21wbGV0ZSB0aGUKKwkJCQkgKiBmcmFtZSB3aXRoIGZhaWxlZCBzdGF0dXMgaWYgd2UKKwkJCQkgKiBydW4gb3V0IG9mIHR4IGJ1Zi4KKwkJCQkgKi8KKwkJCQlpZiAoIXRiZikgeworCQkJCQlhdGhfdHhfdXBkYXRlX2JhdyhzYywgdGlkLCBzZXFubyk7CiAKLQkJCQkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsCi0JCQkJCQkJCSAgICAmYmZfaGVhZCwKLQkJCQkJCQkJICAgIHRzLCAwLAotCQkJCQkJCQkgICAgIWZsdXNoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQkJZmktPmJmID0gdGJmOworCQkJCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLAorCQkJCQkJCSAgICAmYmZfaGVhZCwgdHMsIDApOworCQkJCQliYXJfaW5kZXggPSBtYXhfdChpbnQsIGJhcl9pbmRleCwKKwkJCQkJCUFUSF9CQV9JTkRFWChzZXFfZmlyc3QsIHNlcW5vKSk7CisJCQkJCWJyZWFrOwogCQkJCX0KKworCQkJCWZpLT5iZiA9IHRiZjsKIAkJCX0KIAogCQkJLyoKQEAgLTU0NSw3ICs1ODgsNiBAQAogCQlpZiAoYW4tPnNsZWVwaW5nKQogCQkJaWVlZTgwMjExX3N0YV9zZXRfYnVmZmVyZWQoc3RhLCB0aWQtPnRpZG5vLCB0cnVlKTsKIAotCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCQlza2JfcXVldWVfc3BsaWNlKCZiZl9wZW5kaW5nLCAmdGlkLT5idWZfcSk7CiAJCWlmICghYW4tPnNsZWVwaW5nKSB7CiAJCQlhdGhfdHhfcXVldWVfdGlkKHR4cSwgdGlkKTsKQEAgLTU1MywxOCArNTk1LDIyIEBACiAJCQlpZiAodHMtPnRzX3N0YXR1cyAmIEFUSDlLX1RYRVJSX0ZJTFQpCiAJCQkJdGlkLT5hYy0+Y2xlYXJfcHNfZmlsdGVyID0gdHJ1ZTsKIAkJfQotCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAJfQogCi0JaWYgKHRpZC0+c3RhdGUgJiBBR0dSX0NMRUFOVVApIHsKKwlpZiAoYmFyX2luZGV4ID49IDApIHsKKwkJdTE2IGJhcl9zZXEgPSBBVEhfQkFfSU5ERVgyU0VRKHNlcV9maXJzdCwgYmFyX2luZGV4KTsKKworCQlpZiAoQkFXX1dJVEhJTih0aWQtPnNlcV9zdGFydCwgdGlkLT5iYXdfc2l6ZSwgYmFyX3NlcSkpCisJCQl0aWQtPmJhcl9pbmRleCA9IEFUSF9CQV9JTkRFWCh0aWQtPnNlcV9zdGFydCwgYmFyX3NlcSk7CisKKwkJYXRoX3R4cV91bmxvY2soc2MsIHR4cSk7CisJCWF0aF9zZW5kX2Jhcih0aWQsIEFUSF9CQV9JTkRFWDJTRVEoc2VxX2ZpcnN0LCBiYXJfaW5kZXggKyAxKSk7CisJCWF0aF90eHFfbG9jayhzYywgdHhxKTsKKwl9CisKKwlpZiAodGlkLT5zdGF0ZSAmIEFHR1JfQ0xFQU5VUCkKIAkJYXRoX3R4X2ZsdXNoX3RpZChzYywgdGlkKTsKIAotCQlpZiAodGlkLT5iYXdfaGVhZCA9PSB0aWQtPmJhd190YWlsKSB7Ci0JCQl0aWQtPnN0YXRlICY9IH5BR0dSX0FEREJBX0NPTVBMRVRFOwotCQkJdGlkLT5zdGF0ZSAmPSB+QUdHUl9DTEVBTlVQOwotCQl9Ci0JfQotCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlpZiAobmVlZHJlc2V0KSB7CkBAIC02MDEsNiArNjQ3LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnJhdGVzOworCXN0cnVjdCBhdGhfbWNpX3Byb2ZpbGUgKm1jaSA9ICZzYy0+YnRjb2V4Lm1jaTsKIAl1MzIgbWF4XzRtc19mcmFtZWxlbiwgZnJtbGVuOwogCXUxNiBhZ2dyX2xpbWl0LCBsZWdhY3kgPSAwOwogCWludCBpOwpAQCAtNjE3LDI0ICs2NjQsMjYgQEAKIAltYXhfNG1zX2ZyYW1lbGVuID0gQVRIX0FNUERVX0xJTUlUX01BWDsKIAogCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKLQkJaWYgKHJhdGVzW2ldLmNvdW50KSB7Ci0JCQlpbnQgbW9kZWlkeDsKLQkJCWlmICghKHJhdGVzW2ldLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykpIHsKLQkJCQlsZWdhY3kgPSAxOwotCQkJCWJyZWFrOwotCQkJfQorCQlpbnQgbW9kZWlkeDsKIAotCQkJaWYgKHJhdGVzW2ldLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSCkKLQkJCQltb2RlaWR4ID0gTUNTX0hUNDA7Ci0JCQllbHNlCi0JCQkJbW9kZWlkeCA9IE1DU19IVDIwOworCQlpZiAoIXJhdGVzW2ldLmNvdW50KQorCQkJY29udGludWU7CiAKLQkJCWlmIChyYXRlc1tpXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSkKLQkJCQltb2RlaWR4Kys7Ci0KLQkJCWZybWxlbiA9IGF0aF9tYXhfNG1zX2ZyYW1lbGVuW21vZGVpZHhdW3JhdGVzW2ldLmlkeF07Ci0JCQltYXhfNG1zX2ZyYW1lbGVuID0gbWluKG1heF80bXNfZnJhbWVsZW4sIGZybWxlbik7CisJCWlmICghKHJhdGVzW2ldLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykpIHsKKwkJCWxlZ2FjeSA9IDE7CisJCQlicmVhazsKIAkJfQorCisJCWlmIChyYXRlc1tpXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEgpCisJCQltb2RlaWR4ID0gTUNTX0hUNDA7CisJCWVsc2UKKwkJCW1vZGVpZHggPSBNQ1NfSFQyMDsKKworCQlpZiAocmF0ZXNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kpCisJCQltb2RlaWR4Kys7CisKKwkJZnJtbGVuID0gYXRoX21heF80bXNfZnJhbWVsZW5bbW9kZWlkeF1bcmF0ZXNbaV0uaWR4XTsKKwkJbWF4XzRtc19mcmFtZWxlbiA9IG1pbihtYXhfNG1zX2ZyYW1lbGVuLCBmcm1sZW4pOwogCX0KIAogCS8qCkBAIC02NDUsNyArNjk0LDkgQEAKIAlpZiAodHhfaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRSB8fCBsZWdhY3kpCiAJCXJldHVybiAwOwogCi0JaWYgKHNjLT5zY19mbGFncyAmIFNDX09QX0JUX1BSSU9SSVRZX0RFVEVDVEVEKQorCWlmICgoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfTUNJKSAmJiBtY2ktPmFnZ3JfbGltaXQpCisJCWFnZ3JfbGltaXQgPSAobWF4XzRtc19mcmFtZWxlbiAqIG1jaS0+YWdncl9saW1pdCkgPj4gNDsKKwllbHNlIGlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9CVF9QUklPUklUWV9ERVRFQ1RFRCkKIAkJYWdncl9saW1pdCA9IG1pbigobWF4XzRtc19mcmFtZWxlbiAqIDMpIC8gOCwKIAkJCQkgKHUzMilBVEhfQU1QRFVfTElNSVRfTUFYKTsKIAllbHNlCkBAIC03NjgsOCArODE5LDYgQEAKIAogCQliZi0+YmZfc3RhdGUuYmZfdHlwZSA9IEJVRl9BTVBEVSB8IEJVRl9BR0dSOwogCQlzZXFubyA9IGJmLT5iZl9zdGF0ZS5zZXFubzsKLQkJaWYgKCFiZl9maXJzdCkKLQkJCWJmX2ZpcnN0ID0gYmY7CiAKIAkJLyogZG8gbm90IHN0ZXAgb3ZlciBibG9jay1hY2sgd2luZG93ICovCiAJCWlmICghQkFXX1dJVEhJTih0aWQtPnNlcV9zdGFydCwgdGlkLT5iYXdfc2l6ZSwgc2Vxbm8pKSB7CkBAIC03NzcsNiArODI2LDIxIEBACiAJCQlicmVhazsKIAkJfQogCisJCWlmICh0aWQtPmJhcl9pbmRleCA+IEFUSF9CQV9JTkRFWCh0aWQtPnNlcV9zdGFydCwgc2Vxbm8pKSB7CisJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyB0cyA9IHt9OworCQkJc3RydWN0IGxpc3RfaGVhZCBiZl9oZWFkOworCisJCQlJTklUX0xJU1RfSEVBRCgmYmZfaGVhZCk7CisJCQlsaXN0X2FkZCgmYmYtPmxpc3QsICZiZl9oZWFkKTsKKwkJCV9fc2tiX3VubGluayhza2IsICZ0aWQtPmJ1Zl9xKTsKKwkJCWF0aF90eF91cGRhdGVfYmF3KHNjLCB0aWQsIHNlcW5vKTsKKwkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCAmdHMsIDApOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoIWJmX2ZpcnN0KQorCQkJYmZfZmlyc3QgPSBiZjsKKwogCQlpZiAoIXJsKSB7CiAJCQlhZ2dyX2xpbWl0ID0gYXRoX2xvb2t1cF9yYXRlKHNjLCBiZiwgdGlkKTsKIAkJCXJsID0gMTsKQEAgLTExMTksNiArMTE4Myw3IEBACiAJdHh0aWQtPnN0YXRlIHw9IEFHR1JfQUREQkFfUFJPR1JFU1M7CiAJdHh0aWQtPnBhdXNlZCA9IHRydWU7CiAJKnNzbiA9IHR4dGlkLT5zZXFfc3RhcnQgPSB0eHRpZC0+c2VxX25leHQ7CisJdHh0aWQtPmJhcl9pbmRleCA9IC0xOwogCiAJbWVtc2V0KHR4dGlkLT50eF9idWYsIDAsIHNpemVvZih0eHRpZC0+dHhfYnVmKSk7CiAJdHh0aWQtPmJhd19oZWFkID0gdHh0aWQtPmJhd190YWlsID0gMDsKQEAgLTExNDAsNyArMTIwNSw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOworCWF0aF90eHFfbG9jayhzYywgdHhxKTsKIAl0eHRpZC0+cGF1c2VkID0gdHJ1ZTsKIAogCS8qCkBAIC0xMTUzLDkgKzEyMTgsOSBAQAogCQl0eHRpZC0+c3RhdGUgfD0gQUdHUl9DTEVBTlVQOwogCWVsc2UKIAkJdHh0aWQtPnN0YXRlICY9IH5BR0dSX0FEREJBX0NPTVBMRVRFOwotCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAogCWF0aF90eF9mbHVzaF90aWQoc2MsIHR4dGlkKTsKKwlhdGhfdHhxX3VubG9ja19jb21wbGV0ZShzYywgdHhxKTsKIH0KIAogdm9pZCBhdGhfdHhfYWdncl9zbGVlcChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCBzdHJ1Y3QgYXRoX3NvZnRjICpzYywKQEAgLTExNzYsNyArMTI0MSw3IEBACiAJCWFjID0gdGlkLT5hYzsKIAkJdHhxID0gYWMtPnR4cTsKIAotCQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOworCQlhdGhfdHhxX2xvY2soc2MsIHR4cSk7CiAKIAkJYnVmZmVyZWQgPSAhc2tiX3F1ZXVlX2VtcHR5KCZ0aWQtPmJ1Zl9xKTsKIApAQCAtMTE4OCw3ICsxMjUzLDcgQEAKIAkJCWxpc3RfZGVsKCZhYy0+bGlzdCk7CiAJCX0KIAotCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJCWF0aF90eHFfdW5sb2NrKHNjLCB0eHEpOwogCiAJCWllZWU4MDIxMV9zdGFfc2V0X2J1ZmZlcmVkKHN0YSwgdGlkbm8sIGJ1ZmZlcmVkKTsKIAl9CkBAIC0xMjA3LDcgKzEyNzIsNyBAQAogCQlhYyA9IHRpZC0+YWM7CiAJCXR4cSA9IGFjLT50eHE7CiAKLQkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwkJYXRoX3R4cV9sb2NrKHNjLCB0eHEpOwogCQlhYy0+Y2xlYXJfcHNfZmlsdGVyID0gdHJ1ZTsKIAogCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmdGlkLT5idWZfcSkgJiYgIXRpZC0+cGF1c2VkKSB7CkBAIC0xMjE1LDcgKzEyODAsNyBAQAogCQkJYXRoX3R4cV9zY2hlZHVsZShzYywgdHhxKTsKIAkJfQogCi0JCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwkJYXRoX3R4cV91bmxvY2tfY29tcGxldGUoc2MsIHR4cSk7CiAJfQogfQogCkBAIC0xMzE1LDYgKzEzODAsNyBAQAogCQl0eHEtPmF4cV9xbnVtID0gYXhxX3FudW07CiAJCXR4cS0+bWFjODAyMTFfcW51bSA9IC0xOwogCQl0eHEtPmF4cV9saW5rID0gTlVMTDsKKwkJX19za2JfcXVldWVfaGVhZF9pbml0KCZ0eHEtPmNvbXBsZXRlX3EpOwogCQlJTklUX0xJU1RfSEVBRCgmdHhxLT5heHFfcSk7CiAJCUlOSVRfTElTVF9IRUFEKCZ0eHEtPmF4cV9hY3EpOwogCQlzcGluX2xvY2tfaW5pdCgmdHhxLT5heHFfbG9jayk7CkBAIC0xMzk3LDggKzE0NjMsNiBAQAogCiBzdGF0aWMgdm9pZCBhdGhfZHJhaW5fdHhxX2xpc3Qoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEsCiAJCQkgICAgICAgc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgYm9vbCByZXRyeV90eCkKLQlfX3JlbGVhc2VzKHR4cS0+YXhxX2xvY2spCi0JX19hY3F1aXJlcyh0eHEtPmF4cV9sb2NrKQogewogCXN0cnVjdCBhdGhfYnVmICpiZiwgKmxhc3RiZjsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGJmX2hlYWQ7CkBAIC0xNDI1LDEzICsxNDg5LDExIEBACiAJCWlmIChiZl9pc19hbXBkdV9ub3RfcHJvYmluZyhiZikpCiAJCQl0eHEtPmF4cV9hbXBkdV9kZXB0aC0tOwogCi0JCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKIAkJaWYgKGJmX2lzYW1wZHUoYmYpKQogCQkJYXRoX3R4X2NvbXBsZXRlX2FnZ3Ioc2MsIHR4cSwgYmYsICZiZl9oZWFkLCAmdHMsIDAsCiAJCQkJCSAgICAgcmV0cnlfdHgpOwogCQllbHNlCi0JCQlhdGhfdHhfY29tcGxldGVfYnVmKHNjLCBiZiwgdHhxLCAmYmZfaGVhZCwgJnRzLCAwLCAwKTsKLQkJc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwkJCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsICZiZl9oZWFkLCAmdHMsIDApOwogCX0KIH0KIApAQCAtMTQ0Myw3ICsxNTA1LDggQEAKICAqLwogdm9pZCBhdGhfZHJhaW50eHEoc3RydWN0IGF0aF9zb2Z0YyAqc2MsIHN0cnVjdCBhdGhfdHhxICp0eHEsIGJvb2wgcmV0cnlfdHgpCiB7Ci0Jc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwlhdGhfdHhxX2xvY2soc2MsIHR4cSk7CisKIAlpZiAoc2MtPnNjX2FoLT5jYXBzLmh3X2NhcHMgJiBBVEg5S19IV19DQVBfRURNQSkgewogCQlpbnQgaWR4ID0gdHhxLT50eHFfdGFpbGlkeDsKIApAQCAtMTQ2NCw3ICsxNTI3LDcgQEAKIAlpZiAoKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikgJiYgIXJldHJ5X3R4KQogCQlhdGhfdHhxX2RyYWluX3BlbmRpbmdfYnVmZmVycyhzYywgdHhxKTsKIAotCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwlhdGhfdHhxX3VubG9ja19jb21wbGV0ZShzYywgdHhxKTsKIH0KIAogYm9vbCBhdGhfZHJhaW5fYWxsX3R4cShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgYm9vbCByZXRyeV90eCkKQEAgLTE1NTgsMTEgKzE2MjEsOSBAQAogCQkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKCFsaXN0X2VtcHR5KCZhYy0+dGlkX3EpKSB7Ci0JCQlpZiAoIWFjLT5zY2hlZCkgewotCQkJCWFjLT5zY2hlZCA9IHRydWU7Ci0JCQkJbGlzdF9hZGRfdGFpbCgmYWMtPmxpc3QsICZ0eHEtPmF4cV9hY3EpOwotCQkJfQorCQlpZiAoIWxpc3RfZW1wdHkoJmFjLT50aWRfcSkgJiYgIWFjLT5zY2hlZCkgeworCQkJYWMtPnNjaGVkID0gdHJ1ZTsKKwkJCWxpc3RfYWRkX3RhaWwoJmFjLT5saXN0LCAmdHhxLT5heHFfYWNxKTsKIAkJfQogCiAJCWlmIChhYyA9PSBsYXN0X2FjIHx8CkBAIC0xNjAwLDggKzE2NjEsOCBAQAogCWJmID0gbGlzdF9maXJzdF9lbnRyeShoZWFkLCBzdHJ1Y3QgYXRoX2J1ZiwgbGlzdCk7CiAJYmZfbGFzdCA9IGxpc3RfZW50cnkoaGVhZC0+cHJldiwgc3RydWN0IGF0aF9idWYsIGxpc3QpOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfUVVFVUUsCi0JCSJxbnVtOiAlZCwgdHhxIGRlcHRoOiAlZFxuIiwgdHhxLT5heHFfcW51bSwgdHhxLT5heHFfZGVwdGgpOworCWF0aF9kYmcoY29tbW9uLCBRVUVVRSwgInFudW06ICVkLCB0eHEgZGVwdGg6ICVkXG4iLAorCQl0eHEtPmF4cV9xbnVtLCB0eHEtPmF4cV9kZXB0aCk7CiAKIAlpZiAoZWRtYSAmJiBsaXN0X2VtcHR5KCZ0eHEtPnR4cV9maWZvW3R4cS0+dHhxX2hlYWRpZHhdKSkgewogCQlsaXN0X3NwbGljZV90YWlsX2luaXQoaGVhZCwgJnR4cS0+dHhxX2ZpZm9bdHhxLT50eHFfaGVhZGlkeF0pOwpAQCAtMTYxMiw4ICsxNjczLDcgQEAKIAogCQlpZiAodHhxLT5heHFfbGluaykgewogCQkJYXRoOWtfaHdfc2V0X2Rlc2NfbGluayhhaCwgdHhxLT5heHFfbGluaywgYmYtPmJmX2RhZGRyKTsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsCi0JCQkJImxpbmtbJXVdICglcCk9JWxseCAoJXApXG4iLAorCQkJYXRoX2RiZyhjb21tb24sIFhNSVQsICJsaW5rWyV1XSAoJXApPSVsbHggKCVwKVxuIiwKIAkJCQl0eHEtPmF4cV9xbnVtLCB0eHEtPmF4cV9saW5rLAogCQkJCWl0bzY0KGJmLT5iZl9kYWRkciksIGJmLT5iZl9kZXNjKTsKIAkJfSBlbHNlIGlmICghZWRtYSkKQEAgLTE2MjUsNyArMTY4NSw3IEBACiAJaWYgKHB1dHR4YnVmKSB7CiAJCVRYX1NUQVRfSU5DKHR4cS0+YXhxX3FudW0sIHB1dHR4YnVmKTsKIAkJYXRoOWtfaHdfcHV0dHhidWYoYWgsIHR4cS0+YXhxX3FudW0sIGJmLT5iZl9kYWRkcik7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1hNSVQsICJUWERQWyV1XSA9ICVsbHggKCVwKVxuIiwKKwkJYXRoX2RiZyhjb21tb24sIFhNSVQsICJUWERQWyV1XSA9ICVsbHggKCVwKVxuIiwKIAkJCXR4cS0+YXhxX3FudW0sIGl0bzY0KGJmLT5iZl9kYWRkciksIGJmLT5iZl9kZXNjKTsKIAl9CiAKQEAgLTE3MDUsMTAgKzE3NjUsNiBAQAogCWxpc3RfYWRkX3RhaWwoJmJmLT5saXN0LCAmYmZfaGVhZCk7CiAJYmYtPmJmX3N0YXRlLmJmX3R5cGUgPSAwOwogCi0JLyogdXBkYXRlIHN0YXJ0aW5nIHNlcXVlbmNlIG51bWJlciBmb3Igc3Vic2VxdWVudCBBRERCQSByZXF1ZXN0ICovCi0JaWYgKHRpZCkKLQkJSU5DUih0aWQtPnNlcV9zdGFydCwgSUVFRTgwMjExX1NFUV9NQVgpOwotCiAJYmYtPmJmX2xhc3RiZiA9IGJmOwogCWF0aF90eF9maWxsX2Rlc2Moc2MsIGJmLCB0eHEsIGZpLT5mcmFtZWxlbik7CiAJYXRoX3R4X3R4cWFkZGJ1ZihzYywgdHhxLCAmYmZfaGVhZCwgZmFsc2UpOwpAQCAtMTc3MSw3ICsxODI3LDcgQEAKIAogCWJmID0gYXRoX3R4X2dldF9idWZmZXIoc2MpOwogCWlmICghYmYpIHsKLQkJYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfWE1JVCwgIlRYIGJ1ZmZlcnMgYXJlIGZ1bGxcbiIpOworCQlhdGhfZGJnKGNvbW1vbiwgWE1JVCwgIlRYIGJ1ZmZlcnMgYXJlIGZ1bGxcbiIpOwogCQlnb3RvIGVycm9yOwogCX0KIApAQCAtMTgxNiw3ICsxODcyLDYgQEAKIAlzdHJ1Y3QgYXRoX2J1ZiAqYmY7CiAJdTggdGlkbm87CiAKLQlzcGluX2xvY2tfYmgoJnR4Y3RsLT50eHEtPmF4cV9sb2NrKTsKIAlpZiAoKHNjLT5zY19mbGFncyAmIFNDX09QX1RYQUdHUikgJiYgdHhjdGwtPmFuICYmCiAJCWllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7CiAJCXRpZG5vID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcilbMF0gJgpAQCAtMTgzNSw3ICsxODkwLDcgQEAKIAl9IGVsc2UgewogCQliZiA9IGF0aF90eF9zZXR1cF9idWZmZXIoc2MsIHR4Y3RsLT50eHEsIHRpZCwgc2tiKTsKIAkJaWYgKCFiZikKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuOwogCiAJCWJmLT5iZl9zdGF0ZS5iZnNfcGFwcmQgPSB0eGN0bC0+cGFwcmQ7CiAKQEAgLTE4NDQsOSArMTg5OSw2IEBACiAKIAkJYXRoX3R4X3NlbmRfbm9ybWFsKHNjLCB0eGN0bC0+dHhxLCB0aWQsIHNrYik7CiAJfQotCi1vdXQ6Ci0Jc3Bpbl91bmxvY2tfYmgoJnR4Y3RsLT50eHEtPmF4cV9sb2NrKTsKIH0KIAogLyogVXBvbiBmYWlsdXJlIGNhbGxlciBzaG91bGQgZnJlZSBza2IgKi8KQEAgLTE5MDcsMTUgKzE5NTksMTggQEAKIAkgKi8KIAogCXEgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKLQlzcGluX2xvY2tfYmgoJnR4cS0+YXhxX2xvY2spOworCisJYXRoX3R4cV9sb2NrKHNjLCB0eHEpOwogCWlmICh0eHEgPT0gc2MtPnR4LnR4cV9tYXBbcV0gJiYKIAkgICAgKyt0eHEtPnBlbmRpbmdfZnJhbWVzID4gQVRIX01BWF9RREVQVEggJiYgIXR4cS0+c3RvcHBlZCkgewogCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShzYy0+aHcsIHEpOwotCQl0eHEtPnN0b3BwZWQgPSAxOworCQl0eHEtPnN0b3BwZWQgPSB0cnVlOwogCX0KLQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAKIAlhdGhfdHhfc3RhcnRfZG1hKHNjLCBza2IsIHR4Y3RsKTsKKworCWF0aF90eHFfdW5sb2NrKHNjLCB0eHEpOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTE5MjYsMTYgKzE5ODEsMTIgQEAKIHN0YXRpYyB2b2lkIGF0aF90eF9jb21wbGV0ZShzdHJ1Y3QgYXRoX3NvZnRjICpzYywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgICBpbnQgdHhfZmxhZ3MsIHN0cnVjdCBhdGhfdHhxICp0eHEpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBzYy0+aHc7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCXN0cnVjdCBhdGhfY29tbW9uICpjb21tb24gPSBhdGg5a19od19jb21tb24oc2MtPnNjX2FoKTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqIGhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAlpbnQgcSwgcGFkcG9zLCBwYWRzaXplOwogCi0JYXRoX2RiZyhjb21tb24sIEFUSF9EQkdfWE1JVCwgIlRYIGNvbXBsZXRlOiBza2I6ICVwXG4iLCBza2IpOwotCi0JaWYgKHR4X2ZsYWdzICYgQVRIX1RYX0JBUikKLQkJdHhfaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQU1QRFVfTk9fQkFDSzsKKwlhdGhfZGJnKGNvbW1vbiwgWE1JVCwgIlRYIGNvbXBsZXRlOiBza2I6ICVwXG4iLCBza2IpOwogCiAJaWYgKCEodHhfZmxhZ3MgJiBBVEhfVFhfRVJST1IpKQogCQkvKiBGcmFtZSB3YXMgQUNLZWQgKi8KQEAgLTE5NTIsOSArMjAwMyw5IEBACiAJCXNrYl9wdWxsKHNrYiwgcGFkc2l6ZSk7CiAJfQogCi0JaWYgKHNjLT5wc19mbGFncyAmIFBTX1dBSVRfRk9SX1RYX0FDSykgeworCWlmICgoc2MtPnBzX2ZsYWdzICYgUFNfV0FJVF9GT1JfVFhfQUNLKSAmJiAhdHhxLT5heHFfZGVwdGgpIHsKIAkJc2MtPnBzX2ZsYWdzICY9IH5QU19XQUlUX0ZPUl9UWF9BQ0s7Ci0JCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1BTLAorCQlhdGhfZGJnKGNvbW1vbiwgUFMsCiAJCQkiR29pbmcgYmFjayB0byBzbGVlcCBhZnRlciBoYXZpbmcgcmVjZWl2ZWQgVFggc3RhdHVzICgweCVseClcbiIsCiAJCQlzYy0+cHNfZmxhZ3MgJiAoUFNfV0FJVF9GT1JfQkVBQ09OIHwKIAkJCQkJUFNfV0FJVF9GT1JfQ0FCIHwKQEAgLTE5NjQsMzIgKzIwMTUsMjcgQEAKIAogCXEgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKIAlpZiAodHhxID09IHNjLT50eC50eHFfbWFwW3FdKSB7Ci0JCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CiAJCWlmIChXQVJOX09OKC0tdHhxLT5wZW5kaW5nX2ZyYW1lcyA8IDApKQogCQkJdHhxLT5wZW5kaW5nX2ZyYW1lcyA9IDA7CiAKIAkJaWYgKHR4cS0+c3RvcHBlZCAmJiB0eHEtPnBlbmRpbmdfZnJhbWVzIDwgQVRIX01BWF9RREVQVEgpIHsKIAkJCWllZWU4MDIxMV93YWtlX3F1ZXVlKHNjLT5odywgcSk7Ci0JCQl0eHEtPnN0b3BwZWQgPSAwOworCQkJdHhxLT5zdG9wcGVkID0gZmFsc2U7CiAJCX0KLQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwogCX0KIAotCWllZWU4MDIxMV90eF9zdGF0dXMoaHcsIHNrYik7CisJX19za2JfcXVldWVfdGFpbCgmdHhxLT5jb21wbGV0ZV9xLCBza2IpOwogfQogCiBzdGF0aWMgdm9pZCBhdGhfdHhfY29tcGxldGVfYnVmKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsCiAJCQkJc3RydWN0IGF0aF90eHEgKnR4cSwgc3RydWN0IGxpc3RfaGVhZCAqYmZfcSwKLQkJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIGludCB0eG9rLCBpbnQgc2VuZGJhcikKKwkJCQlzdHJ1Y3QgYXRoX3R4X3N0YXR1cyAqdHMsIGludCB0eG9rKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBiZi0+YmZfbXBkdTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgdHhfZmxhZ3MgPSAwOwogCi0JaWYgKHNlbmRiYXIpCi0JCXR4X2ZsYWdzID0gQVRIX1RYX0JBUjsKLQogCWlmICghdHhvaykKIAkJdHhfZmxhZ3MgfD0gQVRIX1RYX0VSUk9SOwogCkBAIC0yMDgxLDggKzIxMjcsNiBAQAogc3RhdGljIHZvaWQgYXRoX3R4X3Byb2Nlc3NfYnVmZmVyKHN0cnVjdCBhdGhfc29mdGMgKnNjLCBzdHJ1Y3QgYXRoX3R4cSAqdHhxLAogCQkJCSAgc3RydWN0IGF0aF90eF9zdGF0dXMgKnRzLCBzdHJ1Y3QgYXRoX2J1ZiAqYmYsCiAJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpiZl9oZWFkKQotCV9fcmVsZWFzZXModHhxLT5heHFfbG9jaykKLQlfX2FjcXVpcmVzKHR4cS0+YXhxX2xvY2spCiB7CiAJaW50IHR4b2s7CiAKQEAgLTIwOTIsMTYgKzIxMzYsMTIgQEAKIAlpZiAoYmZfaXNfYW1wZHVfbm90X3Byb2JpbmcoYmYpKQogCQl0eHEtPmF4cV9hbXBkdV9kZXB0aC0tOwogCi0Jc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOwotCiAJaWYgKCFiZl9pc2FtcGR1KGJmKSkgewogCQlhdGhfdHhfcmNfc3RhdHVzKHNjLCBiZiwgdHMsIDEsIHR4b2sgPyAwIDogMSwgdHhvayk7Ci0JCWF0aF90eF9jb21wbGV0ZV9idWYoc2MsIGJmLCB0eHEsIGJmX2hlYWQsIHRzLCB0eG9rLCAwKTsKKwkJYXRoX3R4X2NvbXBsZXRlX2J1ZihzYywgYmYsIHR4cSwgYmZfaGVhZCwgdHMsIHR4b2spOwogCX0gZWxzZQogCQlhdGhfdHhfY29tcGxldGVfYWdncihzYywgdHhxLCBiZiwgYmZfaGVhZCwgdHMsIHR4b2ssIHRydWUpOwogCi0Jc3Bpbl9sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKLQogCWlmIChzYy0+c2NfZmxhZ3MgJiBTQ19PUF9UWEFHR1IpCiAJCWF0aF90eHFfc2NoZWR1bGUoc2MsIHR4cSk7CiB9CkBAIC0yMTE2LDExICsyMTU2LDExIEBACiAJc3RydWN0IGF0aF90eF9zdGF0dXMgdHM7CiAJaW50IHN0YXR1czsKIAotCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX1FVRVVFLCAidHggcXVldWUgJWQgKCV4KSwgbGluayAlcFxuIiwKKwlhdGhfZGJnKGNvbW1vbiwgUVVFVUUsICJ0eCBxdWV1ZSAlZCAoJXgpLCBsaW5rICVwXG4iLAogCQl0eHEtPmF4cV9xbnVtLCBhdGg5a19od19nZXR0eGJ1ZihzYy0+c2NfYWgsIHR4cS0+YXhxX3FudW0pLAogCQl0eHEtPmF4cV9saW5rKTsKIAotCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJYXRoX3R4cV9sb2NrKHNjLCB0eHEpOwogCWZvciAoOzspIHsKIAkJaWYgKHdvcmtfcGVuZGluZygmc2MtPmh3X3Jlc2V0X3dvcmspKQogCQkJYnJlYWs7CkBAIC0yMTc5LDcgKzIyMTksNyBAQAogCiAJCWF0aF90eF9wcm9jZXNzX2J1ZmZlcihzYywgdHhxLCAmdHMsIGJmLCAmYmZfaGVhZCk7CiAJfQotCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwlhdGhfdHhxX3VubG9ja19jb21wbGV0ZShzYywgdHhxKTsKIH0KIAogc3RhdGljIHZvaWQgYXRoX3R4X2NvbXBsZXRlX3BvbGxfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0yMTk2LDIxICsyMjM2LDIxIEBACiAJZm9yIChpID0gMDsgaSA8IEFUSDlLX05VTV9UWF9RVUVVRVM7IGkrKykKIAkJaWYgKEFUSF9UWFFfU0VUVVAoc2MsIGkpKSB7CiAJCQl0eHEgPSAmc2MtPnR4LnR4cVtpXTsKLQkJCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJCQlhdGhfdHhxX2xvY2soc2MsIHR4cSk7CiAJCQlpZiAodHhxLT5heHFfZGVwdGgpIHsKIAkJCQlpZiAodHhxLT5heHFfdHhfaW5wcm9ncmVzcykgewogCQkJCQluZWVkcmVzZXQgPSB0cnVlOwotCQkJCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJCQkJCWF0aF90eHFfdW5sb2NrKHNjLCB0eHEpOwogCQkJCQlicmVhazsKIAkJCQl9IGVsc2UgewogCQkJCQl0eHEtPmF4cV90eF9pbnByb2dyZXNzID0gdHJ1ZTsKIAkJCQl9CiAJCQl9Ci0JCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJCQlhdGhfdHhxX3VubG9ja19jb21wbGV0ZShzYywgdHhxKTsKIAkJfQogCiAJaWYgKG5lZWRyZXNldCkgewotCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpLCBBVEhfREJHX1JFU0VULAorCQlhdGhfZGJnKGF0aDlrX2h3X2NvbW1vbihzYy0+c2NfYWgpLCBSRVNFVCwKIAkJCSJ0eCBodW5nLCByZXNldHRpbmcgdGhlIGNoaXBcbiIpOwogCQlSRVNFVF9TVEFUX0lOQyhzYywgUkVTRVRfVFlQRV9UWF9IQU5HKTsKIAkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoc2MtPmh3LCAmc2MtPmh3X3Jlc2V0X3dvcmspOwpAQCAtMjI1Myw4ICsyMjkzLDcgQEAKIAkJaWYgKHN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCiAJCQlicmVhazsKIAkJaWYgKHN0YXR1cyA9PSAtRUlPKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19YTUlULAotCQkJCSJFcnJvciBwcm9jZXNzaW5nIHR4IHN0YXR1c1xuIik7CisJCQlhdGhfZGJnKGNvbW1vbiwgWE1JVCwgIkVycm9yIHByb2Nlc3NpbmcgdHggc3RhdHVzXG4iKTsKIAkJCWJyZWFrOwogCQl9CiAKQEAgLTIyNjQsMTAgKzIzMDMsMTAgQEAKIAogCQl0eHEgPSAmc2MtPnR4LnR4cVt0cy5xaWRdOwogCi0JCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJCWF0aF90eHFfbG9jayhzYywgdHhxKTsKIAogCQlpZiAobGlzdF9lbXB0eSgmdHhxLT50eHFfZmlmb1t0eHEtPnR4cV90YWlsaWR4XSkpIHsKLQkJCXNwaW5fdW5sb2NrX2JoKCZ0eHEtPmF4cV9sb2NrKTsKKwkJCWF0aF90eHFfdW5sb2NrKHNjLCB0eHEpOwogCQkJcmV0dXJuOwogCQl9CiAKQEAgLTIyOTMsNyArMjMzMiw3IEBACiAJCX0KIAogCQlhdGhfdHhfcHJvY2Vzc19idWZmZXIoc2MsIHR4cSwgJnRzLCBiZiwgJmJmX2hlYWQpOwotCQlzcGluX3VubG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJCWF0aF90eHFfdW5sb2NrX2NvbXBsZXRlKHNjLCB0eHEpOwogCX0KIH0KIApAQCAtMjQzMSw3ICsyNDcwLDcgQEAKIAkJYWMgPSB0aWQtPmFjOwogCQl0eHEgPSBhYy0+dHhxOwogCi0JCXNwaW5fbG9ja19iaCgmdHhxLT5heHFfbG9jayk7CisJCWF0aF90eHFfbG9jayhzYywgdHhxKTsKIAogCQlpZiAodGlkLT5zY2hlZCkgewogCQkJbGlzdF9kZWwoJnRpZC0+bGlzdCk7CkBAIC0yNDQ3LDYgKzI0ODYsNiBAQAogCQl0aWQtPnN0YXRlICY9IH5BR0dSX0FEREJBX0NPTVBMRVRFOwogCQl0aWQtPnN0YXRlICY9IH5BR0dSX0NMRUFOVVA7CiAKLQkJc3Bpbl91bmxvY2tfYmgoJnR4cS0+YXhxX2xvY2spOworCQlhdGhfdHhxX3VubG9jayhzYywgdHhxKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvZncuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9mdy5jCmluZGV4IGNiYTlkMDQuLjNkZTYxYWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9mdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9mdy5jCkBAIC0xNDYsMTMgKzE0NiwxNSBAQAogCXJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIGludCBjYXJsOTE3MF9mdyhzdHJ1Y3QgYXI5MTcwICphciwgY29uc3QgX191OCAqZGF0YSwgc2l6ZV90IGxlbikKK3N0YXRpYyBpbnQgY2FybDkxNzBfZndfY2hlY2tzdW0oc3RydWN0IGFyOTE3MCAqYXIsIGNvbnN0IF9fdTggKmRhdGEsCisJCQkJc2l6ZV90IGxlbikKIHsKIAljb25zdCBzdHJ1Y3QgY2FybDkxNzBmd19vdHVzX2Rlc2MgKm90dXNfZGVzYzsKLQljb25zdCBzdHJ1Y3QgY2FybDkxNzBmd19jaGtfZGVzYyAqY2hrX2Rlc2M7CiAJY29uc3Qgc3RydWN0IGNhcmw5MTcwZndfbGFzdF9kZXNjICpsYXN0X2Rlc2M7Ci0JY29uc3Qgc3RydWN0IGNhcmw5MTcwZndfdHhzcV9kZXNjICp0eHNxX2Rlc2M7Ci0JdTE2IGlmX2NvbWJfdHlwZXM7CisJY29uc3Qgc3RydWN0IGNhcmw5MTcwZndfY2hrX2Rlc2MgKmNoa19kZXNjOworCXVuc2lnbmVkIGxvbmcgZmluLCBkaWZmOworCXVuc2lnbmVkIGludCBkc2NfbGVuOworCXUzMiBjcmMzMjsKIAogCWxhc3RfZGVzYyA9IGNhcmw5MTcwX2Z3X2ZpbmRfZGVzYyhhciwgTEFTVF9NQUdJQywKIAkJc2l6ZW9mKCpsYXN0X2Rlc2MpLCBDQVJMOTE3MEZXX0xBU1RfREVTQ19DVVJfVkVSKTsKQEAgLTE3MCwzNiArMTcyLDY4IEBACiAJY2hrX2Rlc2MgPSBjYXJsOTE3MF9md19maW5kX2Rlc2MoYXIsIENIS19NQUdJQywKIAkJc2l6ZW9mKCpjaGtfZGVzYyksIENBUkw5MTcwRldfQ0hLX0RFU0NfQ1VSX1ZFUik7CiAKLQlpZiAoY2hrX2Rlc2MpIHsKLQkJdW5zaWduZWQgbG9uZyBmaW4sIGRpZmY7Ci0JCXVuc2lnbmVkIGludCBkc2NfbGVuOwotCQl1MzIgY3JjMzI7CisJaWYgKCFjaGtfZGVzYykgeworCQlkZXZfd2FybigmYXItPnVkZXYtPmRldiwgIlVucHJvdGVjdGVkIGZpcm13YXJlIGltYWdlLlxuIik7CisJCXJldHVybiAwOworCX0KIAotCQlkc2NfbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBsZW4sCisJZHNjX2xlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLAogCQkJKHVuc2lnbmVkIGxvbmcpY2hrX2Rlc2MgLSAodW5zaWduZWQgbG9uZylvdHVzX2Rlc2MpOwogCi0JCWZpbiA9ICh1bnNpZ25lZCBsb25nKSBsYXN0X2Rlc2MgKyBzaXplb2YoKmxhc3RfZGVzYyk7Ci0JCWRpZmYgPSBmaW4gLSAodW5zaWduZWQgbG9uZykgb3R1c19kZXNjOworCWZpbiA9ICh1bnNpZ25lZCBsb25nKSBsYXN0X2Rlc2MgKyBzaXplb2YoKmxhc3RfZGVzYyk7CisJZGlmZiA9IGZpbiAtICh1bnNpZ25lZCBsb25nKSBvdHVzX2Rlc2M7CiAKLQkJaWYgKGRpZmYgPCBsZW4pCi0JCQlsZW4gLT0gZGlmZjsKKwlpZiAoZGlmZiA8IGxlbikKKwkJbGVuIC09IGRpZmY7CiAKLQkJaWYgKGxlbiA8IDI1NikKLQkJCXJldHVybiAtRUlPOworCWlmIChsZW4gPCAyNTYpCisJCXJldHVybiAtRUlPOwogCi0JCWNyYzMyID0gY3JjMzJfbGUofjAsIGRhdGEsIGxlbik7Ci0JCWlmIChjcHVfdG9fbGUzMihjcmMzMikgIT0gY2hrX2Rlc2MtPmZ3X2NyYzMyKSB7Ci0JCQlkZXZfZXJyKCZhci0+dWRldi0+ZGV2LCAiZncgY2hlY2tzdW0gdGVzdCBmYWlsZWQuXG4iKTsKLQkJCXJldHVybiAtRU5PRVhFQzsKLQkJfQorCWNyYzMyID0gY3JjMzJfbGUofjAsIGRhdGEsIGxlbik7CisJaWYgKGNwdV90b19sZTMyKGNyYzMyKSAhPSBjaGtfZGVzYy0+ZndfY3JjMzIpIHsKKwkJZGV2X2VycigmYXItPnVkZXYtPmRldiwgImZ3IGNoZWNrc3VtIHRlc3QgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRU5PRVhFQzsKKwl9CiAKLQkJY3JjMzIgPSBjcmMzMl9sZShjcmMzMiwgKHZvaWQgKilvdHVzX2Rlc2MsIGRzY19sZW4pOwotCQlpZiAoY3B1X3RvX2xlMzIoY3JjMzIpICE9IGNoa19kZXNjLT5oZHJfY3JjMzIpIHsKLQkJCWRldl9lcnIoJmFyLT51ZGV2LT5kZXYsICJkZXNjcmlwdG9yIGNoZWNrIGZhaWxlZC5cbiIpOworCWNyYzMyID0gY3JjMzJfbGUoY3JjMzIsICh2b2lkICopb3R1c19kZXNjLCBkc2NfbGVuKTsKKwlpZiAoY3B1X3RvX2xlMzIoY3JjMzIpICE9IGNoa19kZXNjLT5oZHJfY3JjMzIpIHsKKwkJZGV2X2VycigmYXItPnVkZXYtPmRldiwgImRlc2NyaXB0b3IgY2hlY2sgZmFpbGVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjYXJsOTE3MF9md190eF9zZXF1ZW5jZShzdHJ1Y3QgYXI5MTcwICphcikKK3sKKwljb25zdCBzdHJ1Y3QgY2FybDkxNzBmd190eHNxX2Rlc2MgKnR4c3FfZGVzYzsKKworCXR4c3FfZGVzYyA9IGNhcmw5MTcwX2Z3X2ZpbmRfZGVzYyhhciwgVFhTUV9NQUdJQywgc2l6ZW9mKCp0eHNxX2Rlc2MpLAorCQkJCQkgIENBUkw5MTcwRldfVFhTUV9ERVNDX0NVUl9WRVIpOworCWlmICh0eHNxX2Rlc2MpIHsKKwkJYXItPmZ3LnR4X3NlcV90YWJsZSA9IGxlMzJfdG9fY3B1KHR4c3FfZGVzYy0+c2VxX3RhYmxlX2FkZHIpOworCQlpZiAoIXZhbGlkX2NwdV9hZGRyKGFyLT5mdy50eF9zZXFfdGFibGUpKQogCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KIAl9IGVsc2UgewotCQlkZXZfd2FybigmYXItPnVkZXYtPmRldiwgIlVucHJvdGVjdGVkIGZpcm13YXJlIGltYWdlLlxuIik7CisJCWFyLT5mdy50eF9zZXFfdGFibGUgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhcmw5MTcwX2Z3KHN0cnVjdCBhcjkxNzAgKmFyLCBjb25zdCBfX3U4ICpkYXRhLCBzaXplX3QgbGVuKQoreworCWNvbnN0IHN0cnVjdCBjYXJsOTE3MGZ3X290dXNfZGVzYyAqb3R1c19kZXNjOworCWludCBlcnI7CisJdTE2IGlmX2NvbWJfdHlwZXM7CisKKwllcnIgPSBjYXJsOTE3MF9md19jaGVja3N1bShhciwgZGF0YSwgbGVuKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJb3R1c19kZXNjID0gY2FybDkxNzBfZndfZmluZF9kZXNjKGFyLCBPVFVTX01BR0lDLAorCQlzaXplb2YoKm90dXNfZGVzYyksIENBUkw5MTcwRldfT1RVU19ERVNDX0NVUl9WRVIpOworCWlmICghb3R1c19kZXNjKSB7CisJCXJldHVybiAtRU5PREFUQTsKIAl9CiAKICNkZWZpbmUgU1VQUChmZWF0KQkJCQkJCVwKQEAgLTMyMSwxOSArMzU1LDggQEAKIAogCWFyLT5ody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBpZl9jb21iX3R5cGVzOwogCi0JdHhzcV9kZXNjID0gY2FybDkxNzBfZndfZmluZF9kZXNjKGFyLCBUWFNRX01BR0lDLAotCQlzaXplb2YoKnR4c3FfZGVzYyksIENBUkw5MTcwRldfVFhTUV9ERVNDX0NVUl9WRVIpOwotCi0JaWYgKHR4c3FfZGVzYykgewotCQlhci0+ZncudHhfc2VxX3RhYmxlID0gbGUzMl90b19jcHUodHhzcV9kZXNjLT5zZXFfdGFibGVfYWRkcik7Ci0JCWlmICghdmFsaWRfY3B1X2FkZHIoYXItPmZ3LnR4X3NlcV90YWJsZSkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQl9IGVsc2UgewotCQlhci0+ZncudHhfc2VxX3RhYmxlID0gMDsKLQl9Ci0KICN1bmRlZiBTVVBQT1JURUQKLQlyZXR1cm4gMDsKKwlyZXR1cm4gY2FybDkxNzBfZndfdHhfc2VxdWVuY2UoYXIpOwogfQogCiBzdGF0aWMgc3RydWN0IGNhcmw5MTcwZndfZGVzY19oZWFkICoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvY2FybDkxNzAvbWFpbi5jCmluZGV4IGYwNmUwNjkuLmRiNzc0MjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL21haW4uYwpAQCAtNDgsNyArNDgsNyBAQAogI2luY2x1ZGUgImNhcmw5MTcwLmgiCiAjaW5jbHVkZSAiY21kLmgiCiAKLXN0YXRpYyBpbnQgbW9kcGFyYW1fbm9od2NyeXB0Oworc3RhdGljIGJvb2wgbW9kcGFyYW1fbm9od2NyeXB0OwogbW9kdWxlX3BhcmFtX25hbWVkKG5vaHdjcnlwdCwgbW9kcGFyYW1fbm9od2NyeXB0LCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Mobm9od2NyeXB0LCAiRGlzYWJsZSBoYXJkd2FyZSBjcnlwdG8gb2ZmbG9hZC4iKTsKIApAQCAtNDQ2LDcgKzQ0Niw3IEBACiAKIAltdXRleF9sb2NrKCZhci0+bXV0ZXgpOwogCWlmIChJU19BQ0NFUFRJTkdfQ01EKGFyKSkgewotCQlyY3VfYXNzaWduX3BvaW50ZXIoYXItPmJlYWNvbl9pdGVyLCBOVUxMKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihhci0+YmVhY29uX2l0ZXIsIE5VTEwpOwogCiAJCWNhcmw5MTcwX2xlZF9zZXRfc3RhdGUoYXIsIDApOwogCkBAIC02NzgsNyArNjc4LDcgQEAKIAkJdmlmX3ByaXYtPmFjdGl2ZSA9IGZhbHNlOwogCQliaXRtYXBfcmVsZWFzZV9yZWdpb24oJmFyLT52aWZfYml0bWFwLCB2aWZfaWQsIDApOwogCQlhci0+dmlmcy0tOwotCQlyY3VfYXNzaWduX3BvaW50ZXIoYXItPnZpZl9wcml2W3ZpZl9pZF0udmlmLCBOVUxMKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihhci0+dmlmX3ByaXZbdmlmX2lkXS52aWYsIE5VTEwpOwogCQlsaXN0X2RlbF9yY3UoJnZpZl9wcml2LT5saXN0KTsKIAkJbXV0ZXhfdW5sb2NrKCZhci0+bXV0ZXgpOwogCQlzeW5jaHJvbml6ZV9yY3UoKTsKQEAgLTcxNiw3ICs3MTYsNyBAQAogCVdBUk5fT04odmlmX3ByaXYtPmVuYWJsZV9iZWFjb24pOwogCXZpZl9wcml2LT5lbmFibGVfYmVhY29uID0gZmFsc2U7CiAJbGlzdF9kZWxfcmN1KCZ2aWZfcHJpdi0+bGlzdCk7Ci0JcmN1X2Fzc2lnbl9wb2ludGVyKGFyLT52aWZfcHJpdltpZF0udmlmLCBOVUxMKTsKKwlSQ1VfSU5JVF9QT0lOVEVSKGFyLT52aWZfcHJpdltpZF0udmlmLCBOVUxMKTsKIAogCWlmICh2aWYgPT0gbWFpbl92aWYpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xMjU4LDcgKzEyNTgsNyBAQAogCQl9CiAKIAkJZm9yIChpID0gMDsgaSA8IENBUkw5MTcwX05VTV9USUQ7IGkrKykKLQkJCXJjdV9hc3NpZ25fcG9pbnRlcihzdGFfaW5mby0+YWdnW2ldLCBOVUxMKTsKKwkJCVJDVV9JTklUX1BPSU5URVIoc3RhX2luZm8tPmFnZ1tpXSwgTlVMTCk7CiAKIAkJc3RhX2luZm8tPmFtcGR1X21heF9sZW4gPSAxIDw8ICgzICsgc3RhLT5odF9jYXAuYW1wZHVfZmFjdG9yKTsKIAkJc3RhX2luZm8tPmh0X3N0YSA9IHRydWU7CkBAIC0xMjg1LDcgKzEyODUsNyBAQAogCQkJc3RydWN0IGNhcmw5MTcwX3N0YV90aWQgKnRpZF9pbmZvOwogCiAJCQl0aWRfaW5mbyA9IHJjdV9kZXJlZmVyZW5jZShzdGFfaW5mby0+YWdnW2ldKTsKLQkJCXJjdV9hc3NpZ25fcG9pbnRlcihzdGFfaW5mby0+YWdnW2ldLCBOVUxMKTsKKwkJCVJDVV9JTklUX1BPSU5URVIoc3RhX2luZm8tPmFnZ1tpXSwgTlVMTCk7CiAKIAkJCWlmICghdGlkX2luZm8pCiAJCQkJY29udGludWU7CkBAIC0xMzk4LDcgKzEzOTgsNyBAQAogCQkJc3Bpbl91bmxvY2tfYmgoJmFyLT50eF9hbXBkdV9saXN0X2xvY2spOwogCQl9CiAKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKHN0YV9pbmZvLT5hZ2dbdGlkXSwgTlVMTCk7CisJCVJDVV9JTklUX1BPSU5URVIoc3RhX2luZm8tPmFnZ1t0aWRdLCBOVUxMKTsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAkJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9jYXJsOTE3MC90eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3R4LmMKaW5kZXggNTk0NzJlMS4uZDE5YTllZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3R4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2Nhcmw5MTcwL3R4LmMKQEAgLTMxNCw3ICszMTQsNyBAQAogCQkJICogICAgZmVlZGJhY2sgZWl0aGVyIFtDVExfUkVRX1RYX1NUQVRVUyBub3Qgc2V0XQogCQkJICovCiAKLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCQlpZWVlODAyMTFfZnJlZV90eHNrYihhci0+aHcsIHNrYik7CiAJCQlyZXR1cm47CiAJCX0gZWxzZSB7CiAJCQkvKgpAQCAtMTQzMiw3ICsxNDMyLDcgQEAKIAogZXJyX2ZyZWU6CiAJYXItPnR4X2Ryb3BwZWQrKzsKLQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWllZWU4MDIxMV9mcmVlX3R4c2tiKGFyLT5odywgc2tiKTsKIH0KIAogdm9pZCBjYXJsOTE3MF90eF9zY2hlZHVsZXIoc3RydWN0IGFyOTE3MCAqYXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgva2V5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgva2V5LmMKaW5kZXggNGNmN2M1ZS4uMGU4MTkwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL2tleS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9rZXkuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJCWJyZWFrOwogCWNhc2UgQVRIX0NJUEhFUl9BRVNfQ0NNOgogCQlpZiAoIShjb21tb24tPmNyeXB0X2NhcHMgJiBBVEhfQ1JZUFRfQ0FQX0NJUEhFUl9BRVNDQ00pKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTlksCisJCQlhdGhfZGJnKGNvbW1vbiwgQU5ZLAogCQkJCSJBRVMtQ0NNIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBtYWMgcmV2XG4iKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQpAQCAtMTUyLDE1ICsxNTIsMTUgQEAKIAljYXNlIEFUSF9DSVBIRVJfVEtJUDoKIAkJa2V5VHlwZSA9IEFSX0tFWVRBQkxFX1RZUEVfVEtJUDsKIAkJaWYgKGVudHJ5ICsgNjQgPj0gY29tbW9uLT5rZXltYXgpIHsKLQkJCWF0aF9kYmcoY29tbW9uLCBBVEhfREJHX0FOWSwKKwkJCWF0aF9kYmcoY29tbW9uLCBBTlksCiAJCQkJImVudHJ5ICV1IGluYXBwcm9wcmlhdGUgZm9yIFRLSVBcbiIsIGVudHJ5KTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCQlicmVhazsKIAljYXNlIEFUSF9DSVBIRVJfV0VQOgogCQlpZiAoay0+a3ZfbGVuIDwgV0xBTl9LRVlfTEVOX1dFUDQwKSB7Ci0JCQlhdGhfZGJnKGNvbW1vbiwgQVRIX0RCR19BTlksCi0JCQkJIldFUCBrZXkgbGVuZ3RoICV1IHRvbyBzbWFsbFxuIiwgay0+a3ZfbGVuKTsKKwkJCWF0aF9kYmcoY29tbW9uLCBBTlksICJXRVAga2V5IGxlbmd0aCAldSB0b28gc21hbGxcbiIsCisJCQkJay0+a3ZfbGVuKTsKIAkJCXJldHVybiBmYWxzZTsKIAkJfQogCQlpZiAoay0+a3ZfbGVuIDw9IFdMQU5fS0VZX0xFTl9XRVA0MCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9yZWdkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9hdGgvcmVnZC5jCmluZGV4IDY1ZWNiNWIuLjEwZGVhMzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2F0aC9yZWdkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYXRoL3JlZ2QuYwpAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgInJlZ2QuaCIKICNpbmNsdWRlICJyZWdkX2NvbW1vbi5oIgogCitzdGF0aWMgaW50IF9fYXRoX3JlZ2RfaW5pdChzdHJ1Y3QgYXRoX3JlZ3VsYXRvcnkgKnJlZyk7CisKIC8qCiAgKiBUaGlzIGlzIGEgc2V0IG9mIGNvbW1vbiBydWxlcyB1c2VkIGJ5IG91ciB3b3JsZCByZWd1bGF0b3J5IGRvbWFpbnMuCiAgKiBXZSBoYXZlIDEyIHdvcmxkIHJlZ3VsYXRvcnkgZG9tYWlucy4gVG8gc2F2ZSBzcGFjZSB3ZSBjb25zb2xpZGF0ZQpAQCAtMzQ3LDEwICszNDksMjYgQEAKIAl9CiB9CiAKK3N0YXRpYyB1MTYgYXRoX3JlZ2RfZmluZF9jb3VudHJ5X2J5X25hbWUoY2hhciAqYWxwaGEyKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWxsQ291bnRyaWVzKTsgaSsrKSB7CisJCWlmICghbWVtY21wKGFsbENvdW50cmllc1tpXS5pc29OYW1lLCBhbHBoYTIsIDIpKQorCQkJcmV0dXJuIGFsbENvdW50cmllc1tpXS5jb3VudHJ5Q29kZTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKIGludCBhdGhfcmVnX25vdGlmaWVyX2FwcGx5KHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkgICBzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0LAogCQkJICAgc3RydWN0IGF0aF9yZWd1bGF0b3J5ICpyZWcpCiB7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGNvbnRhaW5lcl9vZihyZWcsIHN0cnVjdCBhdGhfY29tbW9uLAorCQkJCQkJIHJlZ3VsYXRvcnkpOworCXUxNiBjb3VudHJ5X2NvZGU7CisKIAkvKiBXZSBhbHdheXMgYXBwbHkgdGhpcyAqLwogCWF0aF9yZWdfYXBwbHlfcmFkYXJfZmxhZ3Mod2lwaHkpOwogCkBAIC0zNjMsMTQgKzM4MSwzNyBAQAogCQlyZXR1cm4gMDsKIAogCXN3aXRjaCAocmVxdWVzdC0+aW5pdGlhdG9yKSB7Ci0JY2FzZSBOTDgwMjExX1JFR0RPTV9TRVRfQllfRFJJVkVSOgogCWNhc2UgTkw4MDIxMV9SRUdET01fU0VUX0JZX0NPUkU6CisJCS8qCisJCSAqIElmIGNvbW1vbi0+cmVnX3dvcmxkX2NvcHkgaXMgd29ybGQgcm9hbWluZyBpdCBtZWFucyB3ZSAqd2VyZSoKKwkJICogd29ybGQgcm9hbWluZy4uLiBzbyB3ZSBub3cgaGF2ZSB0byByZXN0b3JlIHRoYXQgZGF0YS4KKwkJICovCisJCWlmICghYXRoX2lzX3dvcmxkX3JlZ2QoJmNvbW1vbi0+cmVnX3dvcmxkX2NvcHkpKQorCQkJYnJlYWs7CisKKwkJbWVtY3B5KHJlZywgJmNvbW1vbi0+cmVnX3dvcmxkX2NvcHksCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGF0aF9yZWd1bGF0b3J5KSk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUjoKIAljYXNlIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9VU0VSOgogCQlicmVhazsKIAljYXNlIE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFOgotCQlpZiAoYXRoX2lzX3dvcmxkX3JlZ2QocmVnKSkKLQkJCWF0aF9yZWdfYXBwbHlfd29ybGRfZmxhZ3Mod2lwaHksIHJlcXVlc3QtPmluaXRpYXRvciwKLQkJCQkJCSAgcmVnKTsKKwkJaWYgKCFhdGhfaXNfd29ybGRfcmVnZChyZWcpKQorCQkJYnJlYWs7CisKKwkJY291bnRyeV9jb2RlID0gYXRoX3JlZ2RfZmluZF9jb3VudHJ5X2J5X25hbWUocmVxdWVzdC0+YWxwaGEyKTsKKwkJaWYgKGNvdW50cnlfY29kZSA9PSAodTE2KSAtMSkKKwkJCWJyZWFrOworCisJCXJlZy0+Y3VycmVudF9yZCA9IENPVU5UUllfRVJEX0ZMQUc7CisJCXJlZy0+Y3VycmVudF9yZCB8PSBjb3VudHJ5X2NvZGU7CisKKwkJcHJpbnRrKEtFUk5fREVCVUcgImF0aDogcmVnZG9tYWluIDB4JTB4IHVwZGF0ZWQgYnkgQ291bnRyeUlFXG4iLAorCQkJcmVnLT5jdXJyZW50X3JkKTsKKwkJX19hdGhfcmVnZF9pbml0KHJlZyk7CisKKwkJYXRoX3JlZ19hcHBseV93b3JsZF9mbGFncyh3aXBoeSwgcmVxdWVzdC0+aW5pdGlhdG9yLCByZWcpOworCiAJCWJyZWFrOwogCX0KIApAQCAtNTA4LDExICs1NDksNyBAQAogCXJlZy0+Y3VycmVudF9yZCA9IDB4NjQ7CiB9CiAKLWludAotYXRoX3JlZ2RfaW5pdChzdHJ1Y3QgYXRoX3JlZ3VsYXRvcnkgKnJlZywKLQkgICAgICBzdHJ1Y3Qgd2lwaHkgKndpcGh5LAotCSAgICAgIGludCAoKnJlZ19ub3RpZmllcikoc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQkgIHN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKnJlcXVlc3QpKQorc3RhdGljIGludCBfX2F0aF9yZWdkX2luaXQoc3RydWN0IGF0aF9yZWd1bGF0b3J5ICpyZWcpCiB7CiAJc3RydWN0IGNvdW50cnlfY29kZV90b19lbnVtX3JkICpjb3VudHJ5ID0gTlVMTDsKIAl1MTYgcmVnZG1uOwpAQCAtNTgzLDcgKzYyMCwyOSBAQAogCXByaW50ayhLRVJOX0RFQlVHICJhdGg6IFJlZ3BhaXIgdXNlZDogMHglMHhcbiIsCiAJCXJlZy0+cmVncGFpci0+cmVnRG1uRW51bSk7CiAKKwlyZXR1cm4gMDsKK30KKworaW50CithdGhfcmVnZF9pbml0KHN0cnVjdCBhdGhfcmVndWxhdG9yeSAqcmVnLAorCSAgICAgIHN0cnVjdCB3aXBoeSAqd2lwaHksCisJICAgICAgaW50ICgqcmVnX25vdGlmaWVyKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVxdWVzdCkpCit7CisJc3RydWN0IGF0aF9jb21tb24gKmNvbW1vbiA9IGNvbnRhaW5lcl9vZihyZWcsIHN0cnVjdCBhdGhfY29tbW9uLAorCQkJCQkJIHJlZ3VsYXRvcnkpOworCWludCByOworCisJciA9IF9fYXRoX3JlZ2RfaW5pdChyZWcpOworCWlmIChyKQorCQlyZXR1cm4gcjsKKworCWlmIChhdGhfaXNfd29ybGRfcmVnZChyZWcpKQorCQltZW1jcHkoJmNvbW1vbi0+cmVnX3dvcmxkX2NvcHksIHJlZywKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgYXRoX3JlZ3VsYXRvcnkpKTsKKwogCWF0aF9yZWdkX2luaXRfd2lwaHkocmVnLCB3aXBoeSwgcmVnX25vdGlmaWVyKTsKKwogCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChhdGhfcmVnZF9pbml0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9iNDMuaAppbmRleCAzNzExMGRmLi4xNmU4ZjgwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvYjQzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2I0My5oCkBAIC0xOTEsNiArMTkxLDkgQEAKICNkZWZpbmUgQjQzX0JGSF9CVUNLQk9PU1QJCTB4MDAyMAkvKiBoYXMgYnVjay9ib29zdGVyICovCiAjZGVmaW5lIEI0M19CRkhfRkVNX0JUCQkJMHgwMDQwCS8qIGhhcyBGRU0gYW5kIHN3aXRjaCB0byBzaGFyZSBhbnRlbm5hCiAJCQkJCQkgKiB3aXRoIGJsdWV0b290aCAqLworI2RlZmluZSBCNDNfQkZIX05PQ0JVQ0sJCQkweDAwODAKKyNkZWZpbmUgQjQzX0JGSF9QQUxETwkJCTB4MDIwMAorI2RlZmluZSBCNDNfQkZIX0VYVExOQV81R0haCQkweDEwMDAJLyogaGFzIGFuIGV4dGVybmFsIExOQSAoNUdIeiBtb2RlKSAqLwogCiAvKiBTUFJPTSBib2FyZGZsYWdzMl9sbyB2YWx1ZXMgKi8KICNkZWZpbmUgQjQzX0JGTDJfUlhCQl9JTlRfUkVHX0RJUwkweDAwMDEJLyogZXh0ZXJuYWwgUlggQkIgcmVndWxhdG9yIHByZXNlbnQgKi8KQEAgLTIwNCw2ICsyMDcsMTQgQEAKICNkZWZpbmUgQjQzX0JGTDJfU0tXUktGRU1fQlJECQkweDAxMDAJLyogNDMyMW1jbTkzIHVzZXMgU2t5d29ya3MgRkVNICovCiAjZGVmaW5lIEI0M19CRkwyX1NQVVJfV0FSCQkweDAyMDAJLyogaGFzIGEgd29ya2Fyb3VuZCBmb3IgY2xvY2staGFybW9uaWMgc3B1cnMgKi8KICNkZWZpbmUgQjQzX0JGTDJfR1BMTF9XQVIJCTB4MDQwMAkvKiBhbHRlbmF0aXZlIEctYmFuZCBQTEwgc2V0dGluZ3MgaW1wbGVtZW50ZWQgKi8KKyNkZWZpbmUgQjQzX0JGTDJfU0lOR0xFQU5UX0NDSwkJMHgxMDAwCisjZGVmaW5lIEI0M19CRkwyXzJHX1NQVVJfV0FSCQkweDIwMDAKKworLyogU1BST00gYm9hcmRmbGFnczJfaGkgdmFsdWVzICovCisjZGVmaW5lIEI0M19CRkgyX0dQTExfV0FSMgkJMHgwMDAxCisjZGVmaW5lIEI0M19CRkgyX0lQQUxWTFNISUZUXzNQMwkweDAwMDIKKyNkZWZpbmUgQjQzX0JGSDJfSU5URVJOREVUX1RYSVFDQUwJMHgwMDA0CisjZGVmaW5lIEI0M19CRkgyX1hUQUxCVUZPVVRFTgkJMHgwMDA4CiAKIC8qIEdQSU8gcmVnaXN0ZXIgb2Zmc2V0LCBpbiBib3RoIENoaXBDb21tb24gYW5kIFBDSSBjb3JlLiAqLwogI2RlZmluZSBCNDNfR1BJT19DT05UUk9MCQkweDZjCkBAIC02NjcsNiArNjc4LDcgQEAKIH07CiAKIC8qIFNITSBvZmZzZXRzIHRvIHRoZSBRT1MgZGF0YSBzdHJ1Y3R1cmVzIGZvciB0aGUgNCBkaWZmZXJlbnQgcXVldWVzLiAqLworI2RlZmluZSBCNDNfUU9TX1FVRVVFX05VTQk0CiAjZGVmaW5lIEI0M19RT1NfUEFSQU1TKHF1ZXVlKQkoQjQzX1NITV9TSF9FRENGUSArIFwKIAkJCQkgKEI0M19OUl9RT1NQQVJBTVMgKiBzaXplb2YodTE2KSAqIChxdWV1ZSkpKQogI2RlZmluZSBCNDNfUU9TX0JBQ0tHUk9VTkQJQjQzX1FPU19QQVJBTVMoMCkKQEAgLTkwNCw3ICs5MTYsNyBAQAogCXN0cnVjdCB3b3JrX3N0cnVjdCBiZWFjb25fdXBkYXRlX3RyaWdnZXI7CiAKIAkvKiBUaGUgY3VycmVudCBRT1MgcGFyYW1ldGVycyBmb3IgdGhlIDQgcXVldWVzLiAqLwotCXN0cnVjdCBiNDNfcW9zX3BhcmFtcyBxb3NfcGFyYW1zWzRdOworCXN0cnVjdCBiNDNfcW9zX3BhcmFtcyBxb3NfcGFyYW1zW0I0M19RT1NfUVVFVUVfTlVNXTsKIAogCS8qIFdvcmsgZm9yIGFkanVzdG1lbnQgb2YgdGhlIHRyYW5zbWlzc2lvbiBwb3dlci4KIAkgKiBUaGlzIGlzIHNjaGVkdWxlZCB3aGVuIHdlIGRldGVybWluZSB0aGF0IHRoZSBhY3R1YWwgVFggb3V0cHV0CkBAIC05MTMsOCArOTI1LDEyIEBACiAKIAkvKiBQYWNrZXQgdHJhbnNtaXQgd29yayAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrOworCiAJLyogUXVldWUgb2YgcGFja2V0cyB0byBiZSB0cmFuc21pdHRlZC4gKi8KLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3F1ZXVlOworCXN0cnVjdCBza19idWZmX2hlYWQgdHhfcXVldWVbQjQzX1FPU19RVUVVRV9OVU1dOworCisJLyogRmxhZyB0aGF0IGltcGxlbWVudCB0aGUgcXVldWVzIHN0b3BwaW5nLiAqLworCWJvb2wgdHhfcXVldWVfc3RvcHBlZFtCNDNfUU9TX1FVRVVFX05VTV07CiAKIAkvKiBUaGUgZGV2aWNlIExFRHMuICovCiAJc3RydWN0IGI0M19sZWRzIGxlZHM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZG1hLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvZG1hLmMKaW5kZXggNWU0NTYwNC4uYjVmMWI5MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2RtYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9kbWEuYwpAQCAtODkwLDcgKzg5MCw3IEBACiAJZWxzZQogCQlyaW5nLT5vcHMgPSAmZG1hMzJfb3BzOwogCWlmIChmb3JfdHgpIHsKLQkJcmluZy0+dHggPSAxOworCQlyaW5nLT50eCA9IHRydWU7CiAJCXJpbmctPmN1cnJlbnRfc2xvdCA9IC0xOwogCX0gZWxzZSB7CiAJCWlmIChyaW5nLT5pbmRleCA9PSAwKSB7CkBAIC0xMDYxLDcgKzEwNjEsNyBAQAogc3RhdGljIGludCBiNDNfZG1hX3NldF9tYXNrKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTY0IG1hc2spCiB7CiAJdTY0IG9yaWdfbWFzayA9IG1hc2s7Ci0JYm9vbCBmYWxsYmFjayA9IDA7CisJYm9vbCBmYWxsYmFjayA9IGZhbHNlOwogCWludCBlcnI7CiAKIAkvKiBUcnkgdG8gc2V0IHRoZSBETUEgbWFzay4gSWYgaXQgZmFpbHMsIHRyeSBmYWxsaW5nIGJhY2sgdG8gYQpAQCAtMTA3NSwxMiArMTA3NSwxMiBAQAogCQl9CiAJCWlmIChtYXNrID09IERNQV9CSVRfTUFTSyg2NCkpIHsKIAkJCW1hc2sgPSBETUFfQklUX01BU0soMzIpOwotCQkJZmFsbGJhY2sgPSAxOworCQkJZmFsbGJhY2sgPSB0cnVlOwogCQkJY29udGludWU7CiAJCX0KIAkJaWYgKG1hc2sgPT0gRE1BX0JJVF9NQVNLKDMyKSkgewogCQkJbWFzayA9IERNQV9CSVRfTUFTSygzMCk7Ci0JCQlmYWxsYmFjayA9IDE7CisJCQlmYWxsYmFjayA9IHRydWU7CiAJCQljb250aW51ZTsKIAkJfQogCQliNDNlcnIoZGV2LT53bCwgIlRoZSBtYWNoaW5lL2tlcm5lbCBkb2VzIG5vdCBzdXBwb3J0ICIKQEAgLTEzMDcsNyArMTMwNyw3IEBACiAJbWVtc2V0KG1ldGEsIDAsIHNpemVvZigqbWV0YSkpOwogCiAJbWV0YS0+c2tiID0gc2tiOwotCW1ldGEtPmlzX2xhc3RfZnJhZ21lbnQgPSAxOworCW1ldGEtPmlzX2xhc3RfZnJhZ21lbnQgPSB0cnVlOwogCXByaXZfaW5mby0+Ym91bmNlYnVmZmVyID0gTlVMTDsKIAogCW1ldGEtPmRtYWFkZHIgPSBtYXBfZGVzY2J1ZmZlcihyaW5nLCBza2ItPmRhdGEsIHNrYi0+bGVuLCAxKTsKQEAgLTE0NjUsOCArMTQ2NSwxMCBAQAogCWlmICgoZnJlZV9zbG90cyhyaW5nKSA8IFRYX1NMT1RTX1BFUl9GUkFNRSkgfHwKIAkgICAgc2hvdWxkX2luamVjdF9vdmVyZmxvdyhyaW5nKSkgewogCQkvKiBUaGlzIFRYIHJpbmcgaXMgZnVsbC4gKi8KLQkJaWVlZTgwMjExX3N0b3BfcXVldWUoZGV2LT53bC0+aHcsIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKLQkJcmluZy0+c3RvcHBlZCA9IDE7CisJCXVuc2lnbmVkIGludCBza2JfbWFwcGluZyA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCQlpZWVlODAyMTFfc3RvcF9xdWV1ZShkZXYtPndsLT5odywgc2tiX21hcHBpbmcpOworCQlkZXYtPndsLT50eF9xdWV1ZV9zdG9wcGVkW3NrYl9tYXBwaW5nXSA9IDE7CisJCXJpbmctPnN0b3BwZWQgPSB0cnVlOwogCQlpZiAoYjQzX2RlYnVnKGRldiwgQjQzX0RCR19ETUFWRVJCT1NFKSkgewogCQkJYjQzZGJnKGRldi0+d2wsICJTdG9wcGVkIFRYIHJpbmcgJWRcbiIsIHJpbmctPmluZGV4KTsKIAkJfQpAQCAtMTU4NCwxMiArMTU4NiwyMSBAQAogCX0KIAlpZiAocmluZy0+c3RvcHBlZCkgewogCQlCNDNfV0FSTl9PTihmcmVlX3Nsb3RzKHJpbmcpIDwgVFhfU0xPVFNfUEVSX0ZSQU1FKTsKKwkJcmluZy0+c3RvcHBlZCA9IGZhbHNlOworCX0KKworCWlmIChkZXYtPndsLT50eF9xdWV1ZV9zdG9wcGVkW3JpbmctPnF1ZXVlX3ByaW9dKSB7CisJCWRldi0+d2wtPnR4X3F1ZXVlX3N0b3BwZWRbcmluZy0+cXVldWVfcHJpb10gPSAwOworCX0gZWxzZSB7CisJCS8qIElmIHRoZSBkcml2ZXIgcXVldWUgaXMgcnVubmluZyB3YWtlIHRoZSBjb3JyZXNwb25kaW5nCisJCSAqIG1hYzgwMjExIHF1ZXVlLiAqLwogCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShkZXYtPndsLT5odywgcmluZy0+cXVldWVfcHJpbyk7Ci0JCXJpbmctPnN0b3BwZWQgPSAwOwogCQlpZiAoYjQzX2RlYnVnKGRldiwgQjQzX0RCR19ETUFWRVJCT1NFKSkgewogCQkJYjQzZGJnKGRldi0+d2wsICJXb2tlIHVwIFRYIHJpbmcgJWRcbiIsIHJpbmctPmluZGV4KTsKIAkJfQogCX0KKwkvKiBBZGQgd29yayB0byB0aGUgcXVldWUuICovCisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoZGV2LT53bC0+aHcsICZkZXYtPndsLT50eF93b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX3J4KHN0cnVjdCBiNDNfZG1hcmluZyAqcmluZywgaW50ICpzbG90KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xlZHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9sZWRzLmMKaW5kZXggYTM4YzFjNi4uZDc5YWIyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xlZHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbGVkcy5jCkBAIC03NCw3ICs3NCw3IEBACiAJaWYgKHJhZGlvX2VuYWJsZWQpCiAJCXR1cm5fb24gPSBhdG9taWNfcmVhZCgmbGVkLT5zdGF0ZSkgIT0gTEVEX09GRjsKIAllbHNlCi0JCXR1cm5fb24gPSAwOworCQl0dXJuX29uID0gZmFsc2U7CiAJaWYgKHR1cm5fb24gPT0gbGVkLT5od19zdGF0ZSkKIAkJcmV0dXJuOwogCWxlZC0+aHdfc3RhdGUgPSB0dXJuX29uOwpAQCAtMjI1LDExICsyMjUsMTEgQEAKIAlpZiAoc3Byb21bbGVkX2luZGV4XSA9PSAweEZGKSB7CiAJCS8qIFRoZXJlIGlzIG5vIExFRCBpbmZvcm1hdGlvbiBpbiB0aGUgU1BST00KIAkJICogZm9yIHRoaXMgTEVELiBIYXJkY29kZSBpdCBoZXJlLiAqLwotCQkqYWN0aXZlbG93ID0gMDsKKwkJKmFjdGl2ZWxvdyA9IGZhbHNlOwogCQlzd2l0Y2ggKGxlZF9pbmRleCkgewogCQljYXNlIDA6CiAJCQkqYmVoYXZpb3VyID0gQjQzX0xFRF9BQ1RJVklUWTsKLQkJCSphY3RpdmVsb3cgPSAxOworCQkJKmFjdGl2ZWxvdyA9IHRydWU7CiAJCQlpZiAoZGV2LT5kZXYtPmJvYXJkX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTVBBUSkKIAkJCQkqYmVoYXZpb3VyID0gQjQzX0xFRF9SQURJT19BTEw7CiAJCQlicmVhazsKQEAgLTI2NywxMSArMjY3LDExIEBACiAJaWYgKGxlZC0+d2wpIHsKIAkJaWYgKGRldi0+cGh5LnJhZGlvX29uICYmIGI0M19pc19od19yYWRpb19lbmFibGVkKGRldikpIHsKIAkJCWI0M19sZWRfdHVybl9vbihkZXYsIGxlZC0+aW5kZXgsIGxlZC0+YWN0aXZlbG93KTsKLQkJCWxlZC0+aHdfc3RhdGUgPSAxOworCQkJbGVkLT5od19zdGF0ZSA9IHRydWU7CiAJCQlhdG9taWNfc2V0KCZsZWQtPnN0YXRlLCAxKTsKIAkJfSBlbHNlIHsKIAkJCWI0M19sZWRfdHVybl9vZmYoZGV2LCBsZWQtPmluZGV4LCBsZWQtPmFjdGl2ZWxvdyk7Ci0JCQlsZWQtPmh3X3N0YXRlID0gMDsKKwkJCWxlZC0+aHdfc3RhdGUgPSBmYWxzZTsKIAkJCWF0b21pY19zZXQoJmxlZC0+c3RhdGUsIDApOwogCQl9CiAJfQpAQCAtMjgwLDE5ICsyODAsMTkgQEAKIAlsZWQgPSAmZGV2LT53bC0+bGVkcy5sZWRfdHg7CiAJaWYgKGxlZC0+d2wpIHsKIAkJYjQzX2xlZF90dXJuX29mZihkZXYsIGxlZC0+aW5kZXgsIGxlZC0+YWN0aXZlbG93KTsKLQkJbGVkLT5od19zdGF0ZSA9IDA7CisJCWxlZC0+aHdfc3RhdGUgPSBmYWxzZTsKIAkJYXRvbWljX3NldCgmbGVkLT5zdGF0ZSwgMCk7CiAJfQogCWxlZCA9ICZkZXYtPndsLT5sZWRzLmxlZF9yeDsKIAlpZiAobGVkLT53bCkgewogCQliNDNfbGVkX3R1cm5fb2ZmKGRldiwgbGVkLT5pbmRleCwgbGVkLT5hY3RpdmVsb3cpOwotCQlsZWQtPmh3X3N0YXRlID0gMDsKKwkJbGVkLT5od19zdGF0ZSA9IGZhbHNlOwogCQlhdG9taWNfc2V0KCZsZWQtPnN0YXRlLCAwKTsKIAl9CiAJbGVkID0gJmRldi0+d2wtPmxlZHMubGVkX2Fzc29jOwogCWlmIChsZWQtPndsKSB7CiAJCWI0M19sZWRfdHVybl9vZmYoZGV2LCBsZWQtPmluZGV4LCBsZWQtPmFjdGl2ZWxvdyk7Ci0JCWxlZC0+aHdfc3RhdGUgPSAwOworCQlsZWQtPmh3X3N0YXRlID0gZmFsc2U7CiAJCWF0b21pY19zZXQoJmxlZC0+c3RhdGUsIDApOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL2xvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbG8uYwppbmRleCA0YzgyZDU4Li45MTYxMjNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbG8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbG8uYwpAQCAtODI2LDcgKzgyNiw3IEBACiAJY29uc3Qgc3RydWN0IGI0M19yZmF0dCAqcmZhdHQ7CiAJY29uc3Qgc3RydWN0IGI0M19iYmF0dCAqYmJhdHQ7CiAJdTY0IHBvd2VyX3ZlY3RvcjsKLQlib29sIHRhYmxlX2NoYW5nZWQgPSAwOworCWJvb2wgdGFibGVfY2hhbmdlZCA9IGZhbHNlOwogCiAJQlVJTERfQlVHX09OKEI0M19EQ19MVF9TSVpFICE9IDMyKTsKIAlCNDNfV0FSTl9PTihsby0+cmZhdHRfbGlzdC5sZW4gKiBsby0+YmJhdHRfbGlzdC5sZW4gPiA2NCk7CkBAIC04NzYsNyArODc2LDcgQEAKIAkJCWxvLT5kY19sdFtpZHhdID0gKGxvLT5kY19sdFtpZHhdICYgMHhGRjAwKQogCQkJCQkgfCAodmFsICYgMHgwMEZGKTsKIAkJfQotCQl0YWJsZV9jaGFuZ2VkID0gMTsKKwkJdGFibGVfY2hhbmdlZCA9IHRydWU7CiAJfQogCWlmICh0YWJsZV9jaGFuZ2VkKSB7CiAJCS8qIFRoZSB0YWJsZSBjaGFuZ2VkIGluIG1lbW9yeS4gVXBkYXRlIHRoZSBoYXJkd2FyZSB0YWJsZS4gKi8KQEAgLTkzOCw3ICs5MzgsNyBAQAogCXVuc2lnbmVkIGxvbmcgbm93OwogCXVuc2lnbmVkIGxvbmcgZXhwaXJlOwogCXN0cnVjdCBiNDNfbG9fY2FsaWIgKmNhbCwgKnRtcDsKLQlib29sIGN1cnJlbnRfaXRlbV9leHBpcmVkID0gMDsKKwlib29sIGN1cnJlbnRfaXRlbV9leHBpcmVkID0gZmFsc2U7CiAJYm9vbCBod3BjdGw7CiAKIAlpZiAoIWxvKQpAQCAtOTY4LDcgKzk2OCw3IEBACiAJCWlmIChiNDNfY29tcGFyZV9iYmF0dCgmY2FsLT5iYmF0dCwgJmdwaHktPmJiYXR0KSAmJgogCQkgICAgYjQzX2NvbXBhcmVfcmZhdHQoJmNhbC0+cmZhdHQsICZncGh5LT5yZmF0dCkpIHsKIAkJCUI0M19XQVJOX09OKGN1cnJlbnRfaXRlbV9leHBpcmVkKTsKLQkJCWN1cnJlbnRfaXRlbV9leHBpcmVkID0gMTsKKwkJCWN1cnJlbnRfaXRlbV9leHBpcmVkID0gdHJ1ZTsKIAkJfQogCQlpZiAoYjQzX2RlYnVnKGRldiwgQjQzX0RCR19MTykpIHsKIAkJCWI0M2RiZyhkZXYtPndsLCAiTE86IEl0ZW0gQkIoJXUpLCBSRigldSwldSksICIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvbWFpbi5jCmluZGV4IDU2MzRkOWEuLjFjNmYxOTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL21haW4uYwpAQCAtMTEyMiwxNyArMTEyMiwxNyBAQAogCUI0M19XQVJOX09OKChwc19mbGFncyAmIEI0M19QU19BV0FLRSkgJiYgKHBzX2ZsYWdzICYgQjQzX1BTX0FTTEVFUCkpOwogCiAJaWYgKHBzX2ZsYWdzICYgQjQzX1BTX0VOQUJMRUQpIHsKLQkJaHdwcyA9IDE7CisJCWh3cHMgPSB0cnVlOwogCX0gZWxzZSBpZiAocHNfZmxhZ3MgJiBCNDNfUFNfRElTQUJMRUQpIHsKLQkJaHdwcyA9IDA7CisJCWh3cHMgPSBmYWxzZTsKIAl9IGVsc2UgewogCQkvL1RPRE86IElmIHBvd2Vyc2F2ZSBpcyBub3Qgb2ZmIGFuZCBGSVhNRSBpcyBub3Qgc2V0IGFuZCB3ZSBhcmUgbm90IGluIGFkaG9jCiAJCS8vICAgICAgYW5kIHRodXMgaXMgbm90IGFuIEFQIGFuZCB3ZSBhcmUgYXNzb2NpYXRlZCwgc2V0IGJpdCAyNQogCX0KIAlpZiAocHNfZmxhZ3MgJiBCNDNfUFNfQVdBS0UpIHsKLQkJYXdha2UgPSAxOworCQlhd2FrZSA9IHRydWU7CiAJfSBlbHNlIGlmIChwc19mbGFncyAmIEI0M19QU19BU0xFRVApIHsKLQkJYXdha2UgPSAwOworCQlhd2FrZSA9IGZhbHNlOwogCX0gZWxzZSB7CiAJCS8vVE9ETzogSWYgdGhlIGRldmljZSBpcyBhd2FrZSBvciB0aGlzIGlzIGFuIEFQLCBvciB3ZSBhcmUgc2Nhbm5pbmcsIG9yIEZJWE1FLAogCQkvLyAgICAgIG9yIHdlIGFyZSBhc3NvY2lhdGVkLCBvciBGSVhNRSwgb3IgdGhlIGxhdGVzdCBQUy1Qb2xsIHBhY2tldCBzZW50IHdhcwpAQCAtMTE0MCw4ICsxMTQwLDggQEAKIAl9CiAKIC8qIEZJWE1FOiBGb3Igbm93IHdlIGZvcmNlIGF3YWtlLW9uIGFuZCBod3BzLW9mZiAqLwotCWh3cHMgPSAwOwotCWF3YWtlID0gMTsKKwlod3BzID0gZmFsc2U7CisJYXdha2UgPSB0cnVlOwogCiAJbWFjY3RsID0gYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCk7CiAJaWYgKGh3cHMpCkBAIC0xMzM5LDcgKzEzMzksNyBAQAogCQlyZXR1cm47CiAJaWYgKGRldi0+bm9pc2VjYWxjLmNhbGN1bGF0aW9uX3J1bm5pbmcpCiAJCXJldHVybjsKLQlkZXYtPm5vaXNlY2FsYy5jYWxjdWxhdGlvbl9ydW5uaW5nID0gMTsKKwlkZXYtPm5vaXNlY2FsYy5jYWxjdWxhdGlvbl9ydW5uaW5nID0gdHJ1ZTsKIAlkZXYtPm5vaXNlY2FsYy5ucl9zYW1wbGVzID0gMDsKIAogCWI0M19nZW5lcmF0ZV9ub2lzZV9zYW1wbGUoZGV2KTsKQEAgLTE0MDgsNyArMTQwOCw3IEBACiAJCQlhdmVyYWdlIC09IDQ4OwogCiAJCWRldi0+c3RhdHMubGlua19ub2lzZSA9IGF2ZXJhZ2U7Ci0JCWRldi0+bm9pc2VjYWxjLmNhbGN1bGF0aW9uX3J1bm5pbmcgPSAwOworCQlkZXYtPm5vaXNlY2FsYy5jYWxjdWxhdGlvbl9ydW5uaW5nID0gZmFsc2U7CiAJCXJldHVybjsKIAl9CiBnZW5lcmF0ZV9uZXc6CkBAIC0xNDI0LDcgKzE0MjQsNyBAQAogCQkJYjQzX3Bvd2VyX3NhdmluZ19jdGxfYml0cyhkZXYsIDApOwogCX0KIAlpZiAoYjQzX2lzX21vZGUoZGV2LT53bCwgTkw4MDIxMV9JRlRZUEVfQURIT0MpKQotCQlkZXYtPmRmcV92YWxpZCA9IDE7CisJCWRldi0+ZGZxX3ZhbGlkID0gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgaGFuZGxlX2lycV9hdGltX2VuZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCkBAIC0xNDMzLDcgKzE0MzMsNyBAQAogCQliNDNfd3JpdGUzMihkZXYsIEI0M19NTUlPX01BQ0NNRCwKIAkJCSAgICBiNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ01EKQogCQkJICAgIHwgQjQzX01BQ0NNRF9ERlFfVkFMSUQpOwotCQlkZXYtPmRmcV92YWxpZCA9IDA7CisJCWRldi0+ZGZxX3ZhbGlkID0gZmFsc2U7CiAJfQogfQogCkBAIC0xNTM5LDcgKzE1MzksNyBAQAogCXVuc2lnbmVkIGludCBpLCBsZW4sIHZhcmlhYmxlX2xlbjsKIAljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKmJjbjsKIAljb25zdCB1OCAqaWU7Ci0JYm9vbCB0aW1fZm91bmQgPSAwOworCWJvb2wgdGltX2ZvdW5kID0gZmFsc2U7CiAJdW5zaWduZWQgaW50IHJhdGU7CiAJdTE2IGN0bDsKIAlpbnQgYW50ZW5uYTsKQEAgLTE1ODgsNyArMTU4OCw3IEBACiAJCQkvKiBBIHZhbGlkIFRJTSBpcyBhdCBsZWFzdCA0IGJ5dGVzIGxvbmcuICovCiAJCQlpZiAoaWVfbGVuIDwgNCkKIAkJCQlicmVhazsKLQkJCXRpbV9mb3VuZCA9IDE7CisJCQl0aW1fZm91bmQgPSB0cnVlOwogCiAJCQl0aW1fcG9zaXRpb24gPSBzaXplb2Yoc3RydWN0IGI0M19wbGNwX2hkcjYpOwogCQkJdGltX3Bvc2l0aW9uICs9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5iZWFjb24udmFyaWFibGUpOwpAQCAtMTYyNSw3ICsxNjI1LDcgQEAKIAlpZiAod2wtPmJlYWNvbjBfdXBsb2FkZWQpCiAJCXJldHVybjsKIAliNDNfd3JpdGVfYmVhY29uX3RlbXBsYXRlKGRldiwgMHg2OCwgMHgxOCk7Ci0Jd2wtPmJlYWNvbjBfdXBsb2FkZWQgPSAxOworCXdsLT5iZWFjb24wX3VwbG9hZGVkID0gdHJ1ZTsKIH0KIAogc3RhdGljIHZvaWQgYjQzX3VwbG9hZF9iZWFjb24xKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKQEAgLTE2MzUsNyArMTYzNSw3IEBACiAJaWYgKHdsLT5iZWFjb24xX3VwbG9hZGVkKQogCQlyZXR1cm47CiAJYjQzX3dyaXRlX2JlYWNvbl90ZW1wbGF0ZShkZXYsIDB4NDY4LCAweDFBKTsKLQl3bC0+YmVhY29uMV91cGxvYWRlZCA9IDE7CisJd2wtPmJlYWNvbjFfdXBsb2FkZWQgPSB0cnVlOwogfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVfaXJxX2JlYWNvbihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCkBAIC0xNjY3LDcgKzE2NjcsNyBAQAogCWlmICh1bmxpa2VseSh3bC0+YmVhY29uX3RlbXBsYXRlc192aXJnaW4pKSB7CiAJCS8qIFdlIG5ldmVyIHVwbG9hZGVkIGEgYmVhY29uIGJlZm9yZS4KIAkJICogVXBsb2FkIGJvdGggdGVtcGxhdGVzIG5vdywgYnV0IG9ubHkgbWFyayBvbmUgdmFsaWQuICovCi0JCXdsLT5iZWFjb25fdGVtcGxhdGVzX3ZpcmdpbiA9IDA7CisJCXdsLT5iZWFjb25fdGVtcGxhdGVzX3ZpcmdpbiA9IGZhbHNlOwogCQliNDNfdXBsb2FkX2JlYWNvbjAoZGV2KTsKIAkJYjQzX3VwbG9hZF9iZWFjb24xKGRldik7CiAJCWNtZCA9IGI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19NQUNDTUQpOwpAQCAtMTc1NSw4ICsxNzU1LDggQEAKIAlpZiAod2wtPmN1cnJlbnRfYmVhY29uKQogCQlkZXZfa2ZyZWVfc2tiX2FueSh3bC0+Y3VycmVudF9iZWFjb24pOwogCXdsLT5jdXJyZW50X2JlYWNvbiA9IGJlYWNvbjsKLQl3bC0+YmVhY29uMF91cGxvYWRlZCA9IDA7Ci0Jd2wtPmJlYWNvbjFfdXBsb2FkZWQgPSAwOworCXdsLT5iZWFjb24wX3VwbG9hZGVkID0gZmFsc2U7CisJd2wtPmJlYWNvbjFfdXBsb2FkZWQgPSBmYWxzZTsKIAlpZWVlODAyMTFfcXVldWVfd29yayh3bC0+aHcsICZ3bC0+YmVhY29uX3VwZGF0ZV90cmlnZ2VyKTsKIH0KIApAQCAtMTkxMyw3ICsxOTEzLDcgQEAKIAkJCWI0M2VycihkZXYtPndsLCAiVGhpcyBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBETUEgIgogCQkJICAgICAgICJvbiB5b3VyIHN5c3RlbS4gSXQgd2lsbCBub3cgYmUgc3dpdGNoZWQgdG8gUElPLlxuIik7CiAJCQkvKiBGYWxsIGJhY2sgdG8gUElPIHRyYW5zZmVycyBpZiB3ZSBnZXQgZmF0YWwgRE1BIGVycm9ycyEgKi8KLQkJCWRldi0+dXNlX3BpbyA9IDE7CisJCQlkZXYtPnVzZV9waW8gPSB0cnVlOwogCQkJYjQzX2NvbnRyb2xsZXJfcmVzdGFydChkZXYsICJETUEgZXJyb3IiKTsKIAkJCXJldHVybjsKIAkJfQpAQCAtMjI0MCwxMiArMjI0MCwxMiBAQAogCQlmaWxlbmFtZSA9IE5VTEw7CiAJZWxzZQogCQlnb3RvIGVycl9ub19wY207Ci0JZnctPnBjbV9yZXF1ZXN0X2ZhaWxlZCA9IDA7CisJZnctPnBjbV9yZXF1ZXN0X2ZhaWxlZCA9IGZhbHNlOwogCWVyciA9IGI0M19kb19yZXF1ZXN0X2Z3KGN0eCwgZmlsZW5hbWUsICZmdy0+cGNtKTsKIAlpZiAoZXJyID09IC1FTk9FTlQpIHsKIAkJLyogV2UgZGlkIG5vdCBmaW5kIGEgUENNIGZpbGU/IE5vdCBmYXRhbCwgYnV0CiAJCSAqIGNvcmUgcmV2IDw9IDEwIG11c3QgZG8gd2l0aG91dCBod2NyeXB0byB0aGVuLiAqLwotCQlmdy0+cGNtX3JlcXVlc3RfZmFpbGVkID0gMTsKKwkJZnctPnBjbV9yZXF1ZXN0X2ZhaWxlZCA9IHRydWU7CiAJfSBlbHNlIGlmIChlcnIpCiAJCWdvdG8gZXJyX2xvYWQ7CiAKQEAgLTI1MzUsNyArMjUzNSw3IEBACiAJZGV2LT53bC0+aHctPnF1ZXVlcyA9IGRldi0+d2wtPm1hYzgwMjExX2luaXRpYWxseV9yZWdpc3RlcmVkX3F1ZXVlczsKIAlkZXYtPnFvc19lbmFibGVkID0gISFtb2RwYXJhbV9xb3M7CiAJLyogRGVmYXVsdCB0byBmaXJtd2FyZS9oYXJkd2FyZSBjcnlwdG8gYWNjZWxlcmF0aW9uLiAqLwotCWRldi0+aHdjcnlwdG9fZW5hYmxlZCA9IDE7CisJZGV2LT5od2NyeXB0b19lbmFibGVkID0gdHJ1ZTsKIAogCWlmIChkZXYtPmZ3Lm9wZW5zb3VyY2UpIHsKIAkJdTE2IGZ3Y2FwYTsKQEAgLTI1NDksNyArMjU0OSw3IEBACiAJCWlmICghKGZ3Y2FwYSAmIEI0M19GV0NBUEFfSFdDUllQVE8pIHx8IGRldi0+ZncucGNtX3JlcXVlc3RfZmFpbGVkKSB7CiAJCQliNDNpbmZvKGRldi0+d2wsICJIYXJkd2FyZSBjcnlwdG8gYWNjZWxlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgYnkgZmlybXdhcmVcbiIpOwogCQkJLyogRGlzYWJsZSBoYXJkd2FyZSBjcnlwdG8gYW5kIGZhbGwgYmFjayB0byBzb2Z0d2FyZSBjcnlwdG8uICovCi0JCQlkZXYtPmh3Y3J5cHRvX2VuYWJsZWQgPSAwOworCQkJZGV2LT5od2NyeXB0b19lbmFibGVkID0gZmFsc2U7CiAJCX0KIAkJaWYgKCEoZndjYXBhICYgQjQzX0ZXQ0FQQV9RT1MpKSB7CiAJCQliNDNpbmZvKGRldi0+d2wsICJRb1Mgbm90IHN1cHBvcnRlZCBieSBmaXJtd2FyZVxuIik7CkBAIC0yNTU3LDcgKzI1NTcsNyBAQAogCQkJICogaWVlZTgwMjExX3VucmVnaXN0ZXIgdG8gbWFrZSBzdXJlIHRoZSBuZXR3b3JraW5nIGNvcmUgY2FuCiAJCQkgKiBwcm9wZXJseSBmcmVlIHBvc3NpYmxlIHJlc291cmNlcy4gKi8KIAkJCWRldi0+d2wtPmh3LT5xdWV1ZXMgPSAxOwotCQkJZGV2LT5xb3NfZW5hYmxlZCA9IDA7CisJCQlkZXYtPnFvc19lbmFibGVkID0gZmFsc2U7CiAJCX0KIAl9IGVsc2UgewogCQliNDNpbmZvKGRldi0+d2wsICJMb2FkaW5nIGZpcm13YXJlIHZlcnNpb24gJXUuJXUgIgpAQCAtMzM2MSwxMCArMzM2MSwxMCBAQAogCXdsLT5ybmcubmFtZSA9IHdsLT5ybmdfbmFtZTsKIAl3bC0+cm5nLmRhdGFfcmVhZCA9IGI0M19ybmdfcmVhZDsKIAl3bC0+cm5nLnByaXYgPSAodW5zaWduZWQgbG9uZyl3bDsKLQl3bC0+cm5nX2luaXRpYWxpemVkID0gMTsKKwl3bC0+cm5nX2luaXRpYWxpemVkID0gdHJ1ZTsKIAllcnIgPSBod3JuZ19yZWdpc3Rlcigmd2wtPnJuZyk7CiAJaWYgKGVycikgewotCQl3bC0+cm5nX2luaXRpYWxpemVkID0gMDsKKwkJd2wtPnJuZ19pbml0aWFsaXplZCA9IGZhbHNlOwogCQliNDNlcnIod2wsICJGYWlsZWQgdG8gcmVnaXN0ZXIgdGhlIHJhbmRvbSAiCiAJCSAgICAgICAibnVtYmVyIGdlbmVyYXRvciAoJWQpXG4iLCBlcnIpOwogCX0KQEAgLTMzNzgsNiArMzM3OCw3IEBACiAJc3RydWN0IGI0M193bCAqd2wgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGI0M193bCwgdHhfd29yayk7CiAJc3RydWN0IGI0M193bGRldiAqZGV2OwogCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHF1ZXVlX251bTsKIAlpbnQgZXJyID0gMDsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CkBAIC0zMzg3LDE1ICszMzg4LDI2IEBACiAJCXJldHVybjsKIAl9CiAKLQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmd2wtPnR4X3F1ZXVlKSkgewotCQlza2IgPSBza2JfZGVxdWV1ZSgmd2wtPnR4X3F1ZXVlKTsKKwlmb3IgKHF1ZXVlX251bSA9IDA7IHF1ZXVlX251bSA8IEI0M19RT1NfUVVFVUVfTlVNOyBxdWV1ZV9udW0rKykgeworCQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmd2wtPnR4X3F1ZXVlW3F1ZXVlX251bV0pKSB7CisJCQlza2IgPSBza2JfZGVxdWV1ZSgmd2wtPnR4X3F1ZXVlW3F1ZXVlX251bV0pOworCQkJaWYgKGI0M191c2luZ19waW9fdHJhbnNmZXJzKGRldikpCisJCQkJZXJyID0gYjQzX3Bpb190eChkZXYsIHNrYik7CisJCQllbHNlCisJCQkJZXJyID0gYjQzX2RtYV90eChkZXYsIHNrYik7CisJCQlpZiAoZXJyID09IC1FTk9TUEMpIHsKKwkJCQl3bC0+dHhfcXVldWVfc3RvcHBlZFtxdWV1ZV9udW1dID0gMTsKKwkJCQlpZWVlODAyMTFfc3RvcF9xdWV1ZSh3bC0+aHcsIHF1ZXVlX251bSk7CisJCQkJc2tiX3F1ZXVlX2hlYWQoJndsLT50eF9xdWV1ZVtxdWV1ZV9udW1dLCBza2IpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHVubGlrZWx5KGVycikpCisJCQkJZGV2X2tmcmVlX3NrYihza2IpOyAvKiBEcm9wIGl0ICovCisJCQllcnIgPSAwOworCQl9CiAKLQkJaWYgKGI0M191c2luZ19waW9fdHJhbnNmZXJzKGRldikpCi0JCQllcnIgPSBiNDNfcGlvX3R4KGRldiwgc2tiKTsKLQkJZWxzZQotCQkJZXJyID0gYjQzX2RtYV90eChkZXYsIHNrYik7Ci0JCWlmICh1bmxpa2VseShlcnIpKQotCQkJZGV2X2tmcmVlX3NrYihza2IpOyAvKiBEcm9wIGl0ICovCisJCWlmICghZXJyKQorCQkJd2wtPnR4X3F1ZXVlX3N0b3BwZWRbcXVldWVfbnVtXSA9IDA7CiAJfQogCiAjaWYgQjQzX0RFQlVHCkBAIC0zNDE2LDggKzM0MjgsMTIgQEAKIAl9CiAJQjQzX1dBUk5fT04oc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyk7CiAKLQlza2JfcXVldWVfdGFpbCgmd2wtPnR4X3F1ZXVlLCBza2IpOwotCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywgJndsLT50eF93b3JrKTsKKwlza2JfcXVldWVfdGFpbCgmd2wtPnR4X3F1ZXVlW3NrYi0+cXVldWVfbWFwcGluZ10sIHNrYik7CisJaWYgKCF3bC0+dHhfcXVldWVfc3RvcHBlZFtza2ItPnF1ZXVlX21hcHBpbmddKSB7CisJCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywgJndsLT50eF93b3JrKTsKKwl9IGVsc2UgeworCQlpZWVlODAyMTFfc3RvcF9xdWV1ZSh3bC0+aHcsIHNrYi0+cXVldWVfbWFwcGluZyk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBiNDNfcW9zX3BhcmFtc191cGxvYWQoc3RydWN0IGI0M193bGRldiAqZGV2LApAQCAtMzcwMiwxMyArMzcxOCwxMyBAQAogCQljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6CiAJCQlpZiAoZC0+cGh5LnN1cHBvcnRzXzVnaHopIHsKIAkJCQl1cF9kZXYgPSBkOwotCQkJCWdtb2RlID0gMDsKKwkJCQlnbW9kZSA9IGZhbHNlOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKIAkJCWlmIChkLT5waHkuc3VwcG9ydHNfMmdoeikgewogCQkJCXVwX2RldiA9IGQ7Ci0JCQkJZ21vZGUgPSAxOworCQkJCWdtb2RlID0gdHJ1ZTsKIAkJCX0KIAkJCWJyZWFrOwogCQlkZWZhdWx0OgpAQCAtNDE0Nyw2ICs0MTYzLDcgQEAKIAlzdHJ1Y3QgYjQzX3dsICp3bDsKIAlzdHJ1Y3QgYjQzX3dsZGV2ICpvcmlnX2RldjsKIAl1MzIgbWFzazsKKwlpbnQgcXVldWVfbnVtOwogCiAJaWYgKCFkZXYpCiAJCXJldHVybiBOVUxMOwpAQCAtNDE5OSw5ICs0MjE2LDExIEBACiAJbWFzayA9IGI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19HRU5fSVJRX01BU0spOwogCUI0M19XQVJOX09OKG1hc2sgIT0gMHhGRkZGRkZGRiAmJiBtYXNrKTsKIAotCS8qIERyYWluIHRoZSBUWCBxdWV1ZSAqLwotCXdoaWxlIChza2JfcXVldWVfbGVuKCZ3bC0+dHhfcXVldWUpKQotCQlkZXZfa2ZyZWVfc2tiKHNrYl9kZXF1ZXVlKCZ3bC0+dHhfcXVldWUpKTsKKwkvKiBEcmFpbiBhbGwgVFggcXVldWVzLiAqLworCWZvciAocXVldWVfbnVtID0gMDsgcXVldWVfbnVtIDwgQjQzX1FPU19RVUVVRV9OVU07IHF1ZXVlX251bSsrKSB7CisJCXdoaWxlIChza2JfcXVldWVfbGVuKCZ3bC0+dHhfcXVldWVbcXVldWVfbnVtXSkpCisJCQlkZXZfa2ZyZWVfc2tiKHNrYl9kZXF1ZXVlKCZ3bC0+dHhfcXVldWVbcXVldWVfbnVtXSkpOworCX0KIAogCWI0M19tYWNfc3VzcGVuZChkZXYpOwogCWI0M19sZWRzX2V4aXQoZGV2KTsKQEAgLTQ0MjUsMTggKzQ0NDQsMTggQEAKIAlhdG9taWNfc2V0KCZwaHktPnR4ZXJyX2NudCwgQjQzX1BIWV9UWF9CQURORVNTX0xJTUlUKTsKIAogI2lmIEI0M19ERUJVRwotCXBoeS0+cGh5X2xvY2tlZCA9IDA7Ci0JcGh5LT5yYWRpb19sb2NrZWQgPSAwOworCXBoeS0+cGh5X2xvY2tlZCA9IGZhbHNlOworCXBoeS0+cmFkaW9fbG9ja2VkID0gZmFsc2U7CiAjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgc2V0dXBfc3RydWN0X3dsZGV2X2Zvcl9pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQlkZXYtPmRmcV92YWxpZCA9IDA7CisJZGV2LT5kZnFfdmFsaWQgPSBmYWxzZTsKIAogCS8qIEFzc3VtZSB0aGUgcmFkaW8gaXMgZW5hYmxlZC4gSWYgaXQncyBub3QgZW5hYmxlZCwgdGhlIHN0YXRlIHdpbGwKIAkgKiBpbW1lZGlhdGVseSBnZXQgZml4ZWQgb24gdGhlIGZpcnN0IHBlcmlvZGljIHdvcmsgcnVuLiAqLwotCWRldi0+cmFkaW9faHdfZW5hYmxlID0gMTsKKwlkZXYtPnJhZGlvX2h3X2VuYWJsZSA9IHRydWU7CiAKIAkvKiBTdGF0cyAqLwogCW1lbXNldCgmZGV2LT5zdGF0cywgMCwgc2l6ZW9mKGRldi0+c3RhdHMpKTsKQEAgLTQ2NzAsMTYgKzQ2ODksMTYgQEAKIAogCWlmIChiNDNfYnVzX2hvc3RfaXNfcGNtY2lhKGRldi0+ZGV2KSB8fAogCSAgICBiNDNfYnVzX2hvc3RfaXNfc2RpbyhkZXYtPmRldikpIHsKLQkJZGV2LT5fX3VzaW5nX3Bpb190cmFuc2ZlcnMgPSAxOworCQlkZXYtPl9fdXNpbmdfcGlvX3RyYW5zZmVycyA9IHRydWU7CiAJCWVyciA9IGI0M19waW9faW5pdChkZXYpOwogCX0gZWxzZSBpZiAoZGV2LT51c2VfcGlvKSB7CiAJCWI0M3dhcm4oZGV2LT53bCwgIkZvcmNlZCBQSU8gYnkgdXNlX3BpbyBtb2R1bGUgcGFyYW1ldGVyLiAiCiAJCQkiVGhpcyBzaG91bGQgbm90IGJlIG5lZWRlZCBhbmQgd2lsbCByZXN1bHQgaW4gbG93ZXIgIgogCQkJInBlcmZvcm1hbmNlLlxuIik7Ci0JCWRldi0+X191c2luZ19waW9fdHJhbnNmZXJzID0gMTsKKwkJZGV2LT5fX3VzaW5nX3Bpb190cmFuc2ZlcnMgPSB0cnVlOwogCQllcnIgPSBiNDNfcGlvX2luaXQoZGV2KTsKIAl9IGVsc2UgewotCQlkZXYtPl9fdXNpbmdfcGlvX3RyYW5zZmVycyA9IDA7CisJCWRldi0+X191c2luZ19waW9fdHJhbnNmZXJzID0gZmFsc2U7CiAJCWVyciA9IGI0M19kbWFfaW5pdChkZXYpOwogCX0KIAlpZiAoZXJyKQpAQCAtNDczMyw3ICs0NzUyLDcgQEAKIAliNDNkYmcod2wsICJBZGRpbmcgSW50ZXJmYWNlIHR5cGUgJWRcbiIsIHZpZi0+dHlwZSk7CiAKIAlkZXYgPSB3bC0+Y3VycmVudF9kZXY7Ci0Jd2wtPm9wZXJhdGluZyA9IDE7CisJd2wtPm9wZXJhdGluZyA9IHRydWU7CiAJd2wtPnZpZiA9IHZpZjsKIAl3bC0+aWZfdHlwZSA9IHZpZi0+dHlwZTsKIAltZW1jcHkod2wtPm1hY19hZGRyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKQEAgLTQ3NjcsNyArNDc4Niw3IEBACiAJQjQzX1dBUk5fT04od2wtPnZpZiAhPSB2aWYpOwogCXdsLT52aWYgPSBOVUxMOwogCi0Jd2wtPm9wZXJhdGluZyA9IDA7CisJd2wtPm9wZXJhdGluZyA9IGZhbHNlOwogCiAJYjQzX2FkanVzdF9vcG1vZGUoZGV2KTsKIAltZW1zZXQod2wtPm1hY19hZGRyLCAwLCBFVEhfQUxFTik7CkBAIC00Nzg5LDEyICs0ODA4LDEyIEBACiAJbWVtc2V0KHdsLT5ic3NpZCwgMCwgRVRIX0FMRU4pOwogCW1lbXNldCh3bC0+bWFjX2FkZHIsIDAsIEVUSF9BTEVOKTsKIAl3bC0+ZmlsdGVyX2ZsYWdzID0gMDsKLQl3bC0+cmFkaW90YXBfZW5hYmxlZCA9IDA7CisJd2wtPnJhZGlvdGFwX2VuYWJsZWQgPSBmYWxzZTsKIAliNDNfcW9zX2NsZWFyKHdsKTsKLQl3bC0+YmVhY29uMF91cGxvYWRlZCA9IDA7Ci0Jd2wtPmJlYWNvbjFfdXBsb2FkZWQgPSAwOwotCXdsLT5iZWFjb25fdGVtcGxhdGVzX3ZpcmdpbiA9IDE7Ci0Jd2wtPnJhZGlvX2VuYWJsZWQgPSAxOworCXdsLT5iZWFjb24wX3VwbG9hZGVkID0gZmFsc2U7CisJd2wtPmJlYWNvbjFfdXBsb2FkZWQgPSBmYWxzZTsKKwl3bC0+YmVhY29uX3RlbXBsYXRlc192aXJnaW4gPSB0cnVlOworCXdsLT5yYWRpb19lbmFibGVkID0gdHJ1ZTsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAKQEAgLTQ4NDAsNyArNDg1OSw3IEBACiAJCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCWI0M193aXJlbGVzc19jb3JlX2V4aXQoZGV2KTsKLQl3bC0+cmFkaW9fZW5hYmxlZCA9IDA7CisJd2wtPnJhZGlvX2VuYWJsZWQgPSBmYWxzZTsKIAogb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CkBAIC01MDI4LDcgKzUwNDcsNyBAQAogCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gTlVMTDsKIAlpbnQgZXJyOwogCXUzMiB0bXA7Ci0JYm9vbCBoYXZlXzJnaHpfcGh5ID0gMCwgaGF2ZV81Z2h6X3BoeSA9IDA7CisJYm9vbCBoYXZlXzJnaHpfcGh5ID0gZmFsc2UsIGhhdmVfNWdoel9waHkgPSBmYWxzZTsKIAogCS8qIERvIE5PVCBkbyBhbnkgZGV2aWNlIGluaXRpYWxpemF0aW9uIGhlcmUuCiAJICogRG8gaXQgaW4gd2lyZWxlc3NfY29yZV9pbml0KCkgaW5zdGVhZC4KQEAgLTUwNzEsNyArNTA5MCw3IEBACiAJfQogCiAJZGV2LT5waHkuZ21vZGUgPSBoYXZlXzJnaHpfcGh5OwotCWRldi0+cGh5LnJhZGlvX29uID0gMTsKKwlkZXYtPnBoeS5yYWRpb19vbiA9IHRydWU7CiAJYjQzX3dpcmVsZXNzX2NvcmVfcmVzZXQoZGV2LCBkZXYtPnBoeS5nbW9kZSk7CiAKIAllcnIgPSBiNDNfcGh5X3ZlcnNpb25pbmcoZGV2KTsKQEAgLTUwODIsMTEgKzUxMDEsMTEgQEAKIAkgICAgKHBkZXYtPmRldmljZSAhPSAweDQzMTIgJiYKIAkgICAgIHBkZXYtPmRldmljZSAhPSAweDQzMTkgJiYgcGRldi0+ZGV2aWNlICE9IDB4NDMyNCkpIHsKIAkJLyogTm8gbXVsdGliYW5kIHN1cHBvcnQuICovCi0JCWhhdmVfMmdoel9waHkgPSAwOwotCQloYXZlXzVnaHpfcGh5ID0gMDsKKwkJaGF2ZV8yZ2h6X3BoeSA9IGZhbHNlOworCQloYXZlXzVnaHpfcGh5ID0gZmFsc2U7CiAJCXN3aXRjaCAoZGV2LT5waHkudHlwZSkgewogCQljYXNlIEI0M19QSFlUWVBFX0E6Ci0JCQloYXZlXzVnaHpfcGh5ID0gMTsKKwkJCWhhdmVfNWdoel9waHkgPSB0cnVlOwogCQkJYnJlYWs7CiAJCWNhc2UgQjQzX1BIWVRZUEVfTFA6IC8vRklYTUUgbm90IGFsd2F5cyEKICNpZiAwIC8vRklYTUUgZW5hYmxpbmcgNUdIeiBjYXVzZXMgYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UKQEAgLTUwOTYsNyArNTExNSw3IEBACiAJCWNhc2UgQjQzX1BIWVRZUEVfTjoKIAkJY2FzZSBCNDNfUEhZVFlQRV9IVDoKIAkJY2FzZSBCNDNfUEhZVFlQRV9MQ046Ci0JCQloYXZlXzJnaHpfcGh5ID0gMTsKKwkJCWhhdmVfMmdoel9waHkgPSB0cnVlOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQlCNDNfV0FSTl9PTigxKTsKQEAgLTUxMTIsOCArNTEzMSw4IEBACiAJCS8qIEZJWE1FOiBGb3Igbm93IHdlIGRpc2FibGUgdGhlIEEtUEhZIG9uIG11bHRpLVBIWSBkZXZpY2VzLiAqLwogCQlpZiAoZGV2LT5waHkudHlwZSAhPSBCNDNfUEhZVFlQRV9OICYmCiAJCSAgICBkZXYtPnBoeS50eXBlICE9IEI0M19QSFlUWVBFX0xQKSB7Ci0JCQloYXZlXzJnaHpfcGh5ID0gMTsKLQkJCWhhdmVfNWdoel9waHkgPSAwOworCQkJaGF2ZV8yZ2h6X3BoeSA9IHRydWU7CisJCQloYXZlXzVnaHpfcGh5ID0gZmFsc2U7CiAJCX0KIAl9CiAKQEAgLTUyNDUsNiArNTI2NCw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJc3RydWN0IGI0M193bCAqd2w7CiAJY2hhciBjaGlwX25hbWVbNl07CisJaW50IHF1ZXVlX251bTsKIAogCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZigqd2wpLCAmYjQzX2h3X29wcyk7CiAJaWYgKCFodykgewpAQCAtNTI2NCw3ICs1Mjg0LDcgQEAKIAkJQklUKE5MODAyMTFfSUZUWVBFX1dEUykgfAogCQlCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpOwogCi0JaHctPnF1ZXVlcyA9IG1vZHBhcmFtX3FvcyA/IDQgOiAxOworCWh3LT5xdWV1ZXMgPSBtb2RwYXJhbV9xb3MgPyBCNDNfUU9TX1FVRVVFX05VTSA6IDE7CiAJd2wtPm1hYzgwMjExX2luaXRpYWxseV9yZWdpc3RlcmVkX3F1ZXVlcyA9IGh3LT5xdWV1ZXM7CiAJaHctPm1heF9yYXRlcyA9IDI7CiAJU0VUX0lFRUU4MDIxMV9ERVYoaHcsIGRldi0+ZGV2KTsKQEAgLTUyODEsNyArNTMwMSwxMiBAQAogCUlOSVRfV09SSygmd2wtPmJlYWNvbl91cGRhdGVfdHJpZ2dlciwgYjQzX2JlYWNvbl91cGRhdGVfdHJpZ2dlcl93b3JrKTsKIAlJTklUX1dPUksoJndsLT50eHBvd2VyX2FkanVzdF93b3JrLCBiNDNfcGh5X3R4cG93ZXJfYWRqdXN0X3dvcmspOwogCUlOSVRfV09SSygmd2wtPnR4X3dvcmssIGI0M190eF93b3JrKTsKLQlza2JfcXVldWVfaGVhZF9pbml0KCZ3bC0+dHhfcXVldWUpOworCisJLyogSW5pdGlhbGl6ZSBxdWV1ZXMgYW5kIGZsYWdzLiAqLworCWZvciAocXVldWVfbnVtID0gMDsgcXVldWVfbnVtIDwgQjQzX1FPU19RVUVVRV9OVU07IHF1ZXVlX251bSsrKSB7CisJCXNrYl9xdWV1ZV9oZWFkX2luaXQoJndsLT50eF9xdWV1ZVtxdWV1ZV9udW1dKTsKKwkJd2wtPnR4X3F1ZXVlX3N0b3BwZWRbcXVldWVfbnVtXSA9IDA7CisJfQogCiAJc25wcmludGYoY2hpcF9uYW1lLCBBUlJBWV9TSVpFKGNoaXBfbmFtZSksCiAJCSAoZGV2LT5jaGlwX2lkID4gMHg5OTk5KSA/ICIlZCIgOiAiJTA0WCIsIGRldi0+Y2hpcF9pZCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9jb21tb24uYwppbmRleCAzZWE0NGJiLi4zZjg4ODNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2NvbW1vbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfY29tbW9uLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCiAjaWYgQjQzX0RFQlVHCiAJQjQzX1dBUk5fT04oZGV2LT5waHkucmFkaW9fbG9ja2VkKTsKLQlkZXYtPnBoeS5yYWRpb19sb2NrZWQgPSAxOworCWRldi0+cGh5LnJhZGlvX2xvY2tlZCA9IHRydWU7CiAjZW5kaWYKIAogCW1hY2N0bCA9IGI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwpOwpAQCAtMTYzLDcgKzE2Myw3IEBACiAKICNpZiBCNDNfREVCVUcKIAlCNDNfV0FSTl9PTighZGV2LT5waHkucmFkaW9fbG9ja2VkKTsKLQlkZXYtPnBoeS5yYWRpb19sb2NrZWQgPSAwOworCWRldi0+cGh5LnJhZGlvX2xvY2tlZCA9IGZhbHNlOwogI2VuZGlmCiAKIAkvKiBDb21taXQgYW55IHdyaXRlICovCkBAIC0xNzgsNyArMTc4LDcgQEAKIHsKICNpZiBCNDNfREVCVUcKIAlCNDNfV0FSTl9PTihkZXYtPnBoeS5waHlfbG9ja2VkKTsKLQlkZXYtPnBoeS5waHlfbG9ja2VkID0gMTsKKwlkZXYtPnBoeS5waHlfbG9ja2VkID0gdHJ1ZTsKICNlbmRpZgogCUI0M19XQVJOX09OKGRldi0+ZGV2LT5jb3JlX3JldiA8IDMpOwogCkBAIC0xOTAsNyArMTkwLDcgQEAKIHsKICNpZiBCNDNfREVCVUcKIAlCNDNfV0FSTl9PTighZGV2LT5waHkucGh5X2xvY2tlZCk7Ci0JZGV2LT5waHkucGh5X2xvY2tlZCA9IDA7CisJZGV2LT5waHkucGh5X2xvY2tlZCA9IGZhbHNlOwogI2VuZGlmCiAJQjQzX1dBUk5fT04oZGV2LT5kZXYtPmNvcmVfcmV2IDwgMyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfZy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9nLmMKaW5kZXggOGUxNTdiYy4uMTJmNDY3YiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9nLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9nLmMKQEAgLTg5Nyw3ICs4OTcsNyBAQAogCQlpZiAoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDMzKSAmIDB4MDgwMCkKIAkJCWJyZWFrOwogCi0JCWdwaHktPmFjaV9lbmFibGUgPSAxOworCQlncGh5LT5hY2lfZW5hYmxlID0gdHJ1ZTsKIAogCQlwaHlfc3RhY2tzYXZlKEI0M19QSFlfUkFESU9fQklURklFTEQpOwogCQlwaHlfc3RhY2tzYXZlKEI0M19QSFlfR19DUlMpOwpAQCAtMTAzOCw3ICsxMDM4LDcgQEAKIAkJaWYgKCEoYjQzX3BoeV9yZWFkKGRldiwgMHgwMDMzKSAmIDB4MDgwMCkpCiAJCQlicmVhazsKIAotCQlncGh5LT5hY2lfZW5hYmxlID0gMDsKKwkJZ3BoeS0+YWNpX2VuYWJsZSA9IGZhbHNlOwogCiAJCXBoeV9zdGFja3Jlc3RvcmUoQjQzX1BIWV9SQURJT19CSVRGSUVMRCk7CiAJCXBoeV9zdGFja3Jlc3RvcmUoQjQzX1BIWV9HX0NSUyk7CkBAIC0xOTU2LDEwICsxOTU2LDEwIEBACiAJCQliYmF0dC5hdHQgPSAxMTsKIAkJCWlmIChwaHktPnJhZGlvX3JldiA9PSA4KSB7CiAJCQkJcmZhdHQuYXR0ID0gMTU7Ci0JCQkJcmZhdHQud2l0aF9wYWRtaXggPSAxOworCQkJCXJmYXR0LndpdGhfcGFkbWl4ID0gdHJ1ZTsKIAkJCX0gZWxzZSB7CiAJCQkJcmZhdHQuYXR0ID0gOTsKLQkJCQlyZmF0dC53aXRoX3BhZG1peCA9IDA7CisJCQkJcmZhdHQud2l0aF9wYWRtaXggPSBmYWxzZTsKIAkJCX0KIAkJCWI0M19zZXRfdHhwb3dlcl9nKGRldiwgJmJiYXR0LCAmcmZhdHQsIDApOwogCQl9CkBAIC0yMTM3LDcgKzIxMzcsNyBAQAogCXN0cnVjdCBiNDNfYnVzX2RldiAqYmRldiA9IGRldi0+ZGV2OwogCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CiAKLQlyZi0+d2l0aF9wYWRtaXggPSAwOworCXJmLT53aXRoX3BhZG1peCA9IGZhbHNlOwogCiAJaWYgKGRldi0+ZGV2LT5ib2FyZF92ZW5kb3IgPT0gU1NCX0JPQVJEVkVORE9SX0JDTSAmJgogCSAgICBkZXYtPmRldi0+Ym9hcmRfdHlwZSA9PSBTU0JfQk9BUkRfQkNNNDMwOUcpIHsKQEAgLTIyMjEsNyArMjIyMSw3IEBACiAJCQlyZXR1cm47CiAJCWNhc2UgODoKIAkJCXJmLT5hdHQgPSAweEE7Ci0JCQlyZi0+d2l0aF9wYWRtaXggPSAxOworCQkJcmYtPndpdGhfcGFkbWl4ID0gdHJ1ZTsKIAkJCXJldHVybjsKIAkJY2FzZSA5OgogCQlkZWZhdWx0OgpAQCAtMjM4OSw3ICsyMzg5LDcgQEAKIAlCNDNfV0FSTl9PTigoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0MzAxKSAmJgogCQkgICAgKHBoeS0+cmFkaW9fdmVyICE9IDB4MjA1MCkpOyAvKiBOb3Qgc3VwcG9ydGVkIGFueW1vcmUgKi8KIAotCWdwaHktPmR5bl90c3NpX3RibCA9IDA7CisJZ3BoeS0+ZHluX3Rzc2lfdGJsID0gZmFsc2U7CiAKIAlpZiAocGFiMCAhPSAwICYmIHBhYjEgIT0gMCAmJiBwYWIyICE9IDAgJiYKIAkgICAgcGFiMCAhPSAtMSAmJiBwYWIxICE9IC0xICYmIHBhYjIgIT0gLTEpIHsKQEAgLTI0MDQsNyArMjQwNCw3IEBACiAJCQkJCQkJICAgICAgIHBhYjEsIHBhYjIpOwogCQlpZiAoIWdwaHktPnRzc2kyZGJtKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCWdwaHktPmR5bl90c3NpX3RibCA9IDE7CisJCWdwaHktPmR5bl90c3NpX3RibCA9IHRydWU7CiAJfSBlbHNlIHsKIAkJLyogcGFiWCB2YWx1ZXMgbm90IHNldCBpbiBTUFJPTS4gKi8KIAkJZ3BoeS0+dGd0X2lkbGVfdHNzaSA9IDUyOwpAQCAtMjUwNCw3ICsyNTA0LDcgQEAKIAogCWlmIChncGh5LT5keW5fdHNzaV90YmwpCiAJCWtmcmVlKGdwaHktPnRzc2kyZGJtKTsKLQlncGh5LT5keW5fdHNzaV90YmwgPSAwOworCWdwaHktPmR5bl90c3NpX3RibCA9IGZhbHNlOwogCWdwaHktPnRzc2kyZGJtID0gTlVMTDsKIAogCWtmcmVlKGdwaHkpOwpAQCAtMjUzMSwxMCArMjUzMSwxMCBAQAogCWlmIChwaHktPnJldiA9PSAxKSB7CiAJCS8qIFdvcmthcm91bmQ6IFRlbXBvcmFybHkgZGlzYWJsZSBnbW9kZSB0aHJvdWdoIHRoZSBlYXJseSBpbml0CiAJCSAqIHBoYXNlLCBhcyB0aGUgZ21vZGUgc3R1ZmYgaXMgbm90IG5lZWRlZCBmb3IgcGh5IHJldiAxICovCi0JCXBoeS0+Z21vZGUgPSAwOworCQlwaHktPmdtb2RlID0gZmFsc2U7CiAJCWI0M193aXJlbGVzc19jb3JlX3Jlc2V0KGRldiwgMCk7CiAJCWI0M19waHlfaW5pdGcoZGV2KTsKLQkJcGh5LT5nbW9kZSA9IDE7CisJCXBoeS0+Z21vZGUgPSB0cnVlOwogCQliNDNfd2lyZWxlc3NfY29yZV9yZXNldChkZXYsIDEpOwogCX0KIApAQCAtMjYxMyw3ICsyNjEzLDcgQEAKIAkJCQkgICAgICBncGh5LT5yYWRpb19vZmZfY29udGV4dC5yZm92ZXIpOwogCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSVkFMLAogCQkJCSAgICAgIGdwaHktPnJhZGlvX29mZl9jb250ZXh0LnJmb3ZlcnZhbCk7Ci0JCQlncGh5LT5yYWRpb19vZmZfY29udGV4dC52YWxpZCA9IDA7CisJCQlncGh5LT5yYWRpb19vZmZfY29udGV4dC52YWxpZCA9IGZhbHNlOwogCQl9CiAJCWNoYW5uZWwgPSBwaHktPmNoYW5uZWw7CiAJCWI0M19ncGh5X2NoYW5uZWxfc3dpdGNoKGRldiwgNiwgMSk7CkBAIC0yNjI2LDcgKzI2MjYsNyBAQAogCQlyZm92ZXJ2YWwgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfUEhZX1JGT1ZFUlZBTCk7CiAJCWdwaHktPnJhZGlvX29mZl9jb250ZXh0LnJmb3ZlciA9IHJmb3ZlcjsKIAkJZ3BoeS0+cmFkaW9fb2ZmX2NvbnRleHQucmZvdmVydmFsID0gcmZvdmVydmFsOwotCQlncGh5LT5yYWRpb19vZmZfY29udGV4dC52YWxpZCA9IDE7CisJCWdwaHktPnJhZGlvX29mZl9jb250ZXh0LnZhbGlkID0gdHJ1ZTsKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfUkZPVkVSLCByZm92ZXIgfCAweDAwOEMpOwogCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX1BIWV9SRk9WRVJWQUwsIHJmb3ZlcnZhbCAmIDB4RkY3Myk7CiAJfQpAQCAtMjcxMSwxMCArMjcxMSwxMCBAQAogCWlmICgocGh5LT5yZXYgPT0gMCkgfHwgKCFwaHktPmdtb2RlKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlncGh5LT5hY2lfd2xhbl9hdXRvbWF0aWMgPSAwOworCWdwaHktPmFjaV93bGFuX2F1dG9tYXRpYyA9IGZhbHNlOwogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgQjQzX0lOVEVSRk1PREVfQVVUT1dMQU46Ci0JCWdwaHktPmFjaV93bGFuX2F1dG9tYXRpYyA9IDE7CisJCWdwaHktPmFjaV93bGFuX2F1dG9tYXRpYyA9IHRydWU7CiAJCWlmIChncGh5LT5hY2lfZW5hYmxlKQogCQkJbW9kZSA9IEI0M19JTlRFUkZNT0RFX01BTlVBTFdMQU47CiAJCWVsc2UKQEAgLTI3MzUsOCArMjczNSw4IEBACiAJCWI0M19yYWRpb19pbnRlcmZlcmVuY2VfbWl0aWdhdGlvbl9kaXNhYmxlKGRldiwgY3VycmVudG1vZGUpOwogCiAJaWYgKG1vZGUgPT0gQjQzX0lOVEVSRk1PREVfTk9ORSkgewotCQlncGh5LT5hY2lfZW5hYmxlID0gMDsKLQkJZ3BoeS0+YWNpX2h3X3Jzc2kgPSAwOworCQlncGh5LT5hY2lfZW5hYmxlID0gZmFsc2U7CisJCWdwaHktPmFjaV9od19yc3NpID0gZmFsc2U7CiAJfSBlbHNlCiAJCWI0M19yYWRpb19pbnRlcmZlcmVuY2VfbWl0aWdhdGlvbl9lbmFibGUoZGV2LCBtb2RlKTsKIAlncGh5LT5pbnRlcmZtb2RlID0gbW9kZTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbHAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbHAuYwppbmRleCBmOTNkNjZiLi4zYWUyODU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X2xwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9scC5jCkBAIC03MzYsOSArNzM2LDkgQEAKIAlzdHJ1Y3QgYjQzX3BoeV9scCAqbHBwaHkgPSBkZXYtPnBoeS5scDsKIAogCWlmICh1c2VyKQotCQlscHBoeS0+Y3JzX3Vzcl9kaXNhYmxlID0gMTsKKwkJbHBwaHktPmNyc191c3JfZGlzYWJsZSA9IHRydWU7CiAJZWxzZQotCQlscHBoeS0+Y3JzX3N5c19kaXNhYmxlID0gMTsKKwkJbHBwaHktPmNyc19zeXNfZGlzYWJsZSA9IHRydWU7CiAJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX0xQUEhZX0NSU0dBSU5fQ1RMLCAweEZGMUYsIDB4ODApOwogfQogCkBAIC03NDcsOSArNzQ3LDkgQEAKIAlzdHJ1Y3QgYjQzX3BoeV9scCAqbHBwaHkgPSBkZXYtPnBoeS5scDsKIAogCWlmICh1c2VyKQotCQlscHBoeS0+Y3JzX3Vzcl9kaXNhYmxlID0gMDsKKwkJbHBwaHktPmNyc191c3JfZGlzYWJsZSA9IGZhbHNlOwogCWVsc2UKLQkJbHBwaHktPmNyc19zeXNfZGlzYWJsZSA9IDA7CisJCWxwcGh5LT5jcnNfc3lzX2Rpc2FibGUgPSBmYWxzZTsKIAogCWlmICghbHBwaHktPmNyc191c3JfZGlzYWJsZSAmJiAhbHBwaHktPmNyc19zeXNfZGlzYWJsZSkgewogCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3BoeV9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYwppbmRleCBiMTdkOWI2Li5iZjVhNDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uYwpAQCAtNzgsMTkgKzc4LDYgQEAKIAlCNDNfTlBIWV9SU1NJX1RCRCwKIH07CiAKLS8qIFRPRE86IHJlb3JkZXIgZnVuY3Rpb25zICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9zdGF5X2luX2NhcnJpZXJfc2VhcmNoKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKLQkJCQkJCWJvb2wgZW5hYmxlKTsKLXN0YXRpYyB2b2lkIGI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHU4IGNtZCwKLQkJCQkJdTggKmV2ZW50cywgdTggKmRlbGF5cywgdTggbGVuZ3RoKTsKLXN0YXRpYyB2b2lkIGI0M19ucGh5X2ZvcmNlX3JmX3NlcXVlbmNlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKLQkJCQkgICAgICAgZW51bSBiNDNfbnBoeV9yZl9zZXF1ZW5jZSBzZXEpOwotc3RhdGljIHZvaWQgYjQzX25waHlfcmZfY29udHJvbF9vdmVycmlkZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBmaWVsZCwKLQkJCQkJCXUxNiB2YWx1ZSwgdTggY29yZSwgYm9vbCBvZmYpOwotc3RhdGljIHZvaWQgYjQzX25waHlfcmZfY29udHJvbF9pbnRjX292ZXJyaWRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggZmllbGQsCi0JCQkJCQl1MTYgdmFsdWUsIHU4IGNvcmUpOwotc3RhdGljIGNvbnN0IHUzMiAqYjQzX25waHlfZ2V0X2lwYV9nYWluX3RhYmxlKHN0cnVjdCBiNDNfd2xkZXYgKmRldik7Ci0KIHN0YXRpYyBpbmxpbmUgYm9vbCBiNDNfbnBoeV9pcGEoc3RydWN0IGI0M193bGRldiAqZGV2KQogewogCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCk7CkBAIC05OCw1NyArODUsMzk0IEBACiAJCShkZXYtPnBoeS5uLT5pcGE1Z19vbiAmJiBiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopKTsKIH0KIAotdm9pZCBiNDNfbnBoeV9zZXRfcnhhbnRlbm5hKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgaW50IGFudGVubmEpCi17Ly9UT0RPCi19Ci0KLXN0YXRpYyB2b2lkIGI0M19ucGh5X29wX2FkanVzdF90eHBvd2VyKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsvL1RPRE8KLX0KLQotc3RhdGljIGVudW0gYjQzX3R4cHdyX3Jlc3VsdCBiNDNfbnBoeV9vcF9yZWNhbGNfdHhwb3dlcihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCi0JCQkJCQkJYm9vbCBpZ25vcmVfdHNzaSkKLXsvL1RPRE8KLQlyZXR1cm4gQjQzX1RYUFdSX1JFU19ET05FOwotfQotCi1zdGF0aWMgdm9pZCBiNDNfY2hhbnRhYl9yYWRpb191cGxvYWQoc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkJCWNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjIgKmUpCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL0dldElwYUdhaW5UYmwgKi8KK3N0YXRpYyBjb25zdCB1MzIgKmI0M19ucGh5X2dldF9pcGFfZ2Fpbl90YWJsZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfUExMX1JFRiwgZS0+cmFkaW9fcGxsX3JlZik7Ci0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfUkZfUExMTU9EMCwgZS0+cmFkaW9fcmZfcGxsbW9kMCk7Ci0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfUkZfUExMTU9EMSwgZS0+cmFkaW9fcmZfcGxsbW9kMSk7Ci0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfVkNPX0NBUFRBSUwsIGUtPnJhZGlvX3Zjb19jYXB0YWlsKTsKLQliNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKTsgLyogZmx1c2ggd3JpdGVzICovCi0KLQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9WQ09fQ0FMMSwgZS0+cmFkaW9fdmNvX2NhbDEpOwotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X1ZDT19DQUwyLCBlLT5yYWRpb192Y29fY2FsMik7Ci0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfUExMX0xGQzEsIGUtPnJhZGlvX3BsbF9sZmMxKTsKLQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9QTExfTEZSMSwgZS0+cmFkaW9fcGxsX2xmcjEpOwotCWI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwpOyAvKiBmbHVzaCB3cml0ZXMgKi8KLQotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X1BMTF9MRkMyLCBlLT5yYWRpb19wbGxfbGZjMik7Ci0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfTEdCVUZfQ0VOQlVGLCBlLT5yYWRpb19sZ2J1Zl9jZW5idWYpOwotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X0xHRU5fVFVORTEsIGUtPnJhZGlvX2xnZW5fdHVuZTEpOwotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X0xHRU5fVFVORTIsIGUtPnJhZGlvX2xnZW5fdHVuZTIpOwotCWI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwpOyAvKiBmbHVzaCB3cml0ZXMgKi8KLQotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X0MxX0xHQlVGX0FUVU5FLCBlLT5yYWRpb19jMV9sZ2J1Zl9hdHVuZSk7Ci0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfQzFfTEdCVUZfR1RVTkUsIGUtPnJhZGlvX2MxX2xnYnVmX2d0dW5lKTsKLQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9DMV9SWF9SRlIxLCBlLT5yYWRpb19jMV9yeF9yZnIxKTsKLQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9DMV9UWF9QR0FQQURUTiwgZS0+cmFkaW9fYzFfdHhfcGdhcGFkdG4pOwotCWI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwpOyAvKiBmbHVzaCB3cml0ZXMgKi8KLQotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X0MxX1RYX01YQkdUUklNLCBlLT5yYWRpb19jMV90eF9teGJndHJpbSk7Ci0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfQzJfTEdCVUZfQVRVTkUsIGUtPnJhZGlvX2MyX2xnYnVmX2F0dW5lKTsKLQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9DMl9MR0JVRl9HVFVORSwgZS0+cmFkaW9fYzJfbGdidWZfZ3R1bmUpOwotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X0MyX1JYX1JGUjEsIGUtPnJhZGlvX2MyX3J4X3JmcjEpOwotCWI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwpOyAvKiBmbHVzaCB3cml0ZXMgKi8KLQotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X0MyX1RYX1BHQVBBRFROLCBlLT5yYWRpb19jMl90eF9wZ2FwYWR0bik7Ci0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfQzJfVFhfTVhCR1RSSU0sIGUtPnJhZGlvX2MyX3R4X214Ymd0cmltKTsKKwlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKSB7CisJCWlmIChkZXYtPnBoeS5yZXYgPj0gNikgeworCQkJaWYgKGRldi0+ZGV2LT5jaGlwX2lkID09IDQ3MTYyKQorCQkJCXJldHVybiB0eHB3cmN0cmxfdHhfZ2Fpbl9pcGFfcmV2NTsKKwkJCXJldHVybiB0eHB3cmN0cmxfdHhfZ2Fpbl9pcGFfcmV2NjsKKwkJfSBlbHNlIGlmIChkZXYtPnBoeS5yZXYgPj0gNSkgeworCQkJcmV0dXJuIHR4cHdyY3RybF90eF9nYWluX2lwYV9yZXY1OworCQl9IGVsc2UgeworCQkJcmV0dXJuIHR4cHdyY3RybF90eF9nYWluX2lwYTsKKwkJfQorCX0gZWxzZSB7CisJCXJldHVybiB0eHB3cmN0cmxfdHhfZ2Fpbl9pcGFfNWc7CisJfQogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJGIChqdXN0IHdpdGhvdXQgYjQzX25waHlfcmZfY29udHJvbF9pbnRjX292ZXJyaWRlKQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL0ZvcmNlUkZTZXEgKi8KK3N0YXRpYyB2b2lkIGI0M19ucGh5X2ZvcmNlX3JmX3NlcXVlbmNlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKKwkJCQkgICAgICAgZW51bSBiNDNfbnBoeV9yZl9zZXF1ZW5jZSBzZXEpCit7CisJc3RhdGljIGNvbnN0IHUxNiB0cmlnZ2VyW10gPSB7CisJCVtCNDNfUkZTRVFfUlgyVFhdCQk9IEI0M19OUEhZX1JGU0VRVFJfUlgyVFgsCisJCVtCNDNfUkZTRVFfVFgyUlhdCQk9IEI0M19OUEhZX1JGU0VRVFJfVFgyUlgsCisJCVtCNDNfUkZTRVFfUkVTRVQyUlhdCQk9IEI0M19OUEhZX1JGU0VRVFJfUlNUMlJYLAorCQlbQjQzX1JGU0VRX1VQREFURV9HQUlOSF0JPSBCNDNfTlBIWV9SRlNFUVRSX1VQR0gsCisJCVtCNDNfUkZTRVFfVVBEQVRFX0dBSU5MXQk9IEI0M19OUEhZX1JGU0VRVFJfVVBHTCwKKwkJW0I0M19SRlNFUV9VUERBVEVfR0FJTlVdCT0gQjQzX05QSFlfUkZTRVFUUl9VUEdVLAorCX07CisJaW50IGk7CisJdTE2IHNlcV9tb2RlID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZTRVFNT0RFKTsKKworCUI0M19XQVJOX09OKHNlcSA+PSBBUlJBWV9TSVpFKHRyaWdnZXIpKTsKKworCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfUkZTRVFNT0RFLAorCQkgICAgQjQzX05QSFlfUkZTRVFNT0RFX0NBT1ZFUiB8IEI0M19OUEhZX1JGU0VRTU9ERV9UUk9WRVIpOworCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfUkZTRVFUUiwgdHJpZ2dlcltzZXFdKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjAwOyBpKyspIHsKKwkJaWYgKCEoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZTRVFTVCkgJiB0cmlnZ2VyW3NlcV0pKQorCQkJZ290byBvazsKKwkJbXNsZWVwKDEpOworCX0KKwliNDNlcnIoZGV2LT53bCwgIlJGIHNlcXVlbmNlIHN0YXR1cyB0aW1lb3V0XG4iKTsKK29rOgorCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRlNFUU1PREUsIHNlcV9tb2RlKTsKK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9SRkN0cmxPdmVycmlkZSAqLworc3RhdGljIHZvaWQgYjQzX25waHlfcmZfY29udHJvbF9vdmVycmlkZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBmaWVsZCwKKwkJCQkJCXUxNiB2YWx1ZSwgdTggY29yZSwgYm9vbCBvZmYpCit7CisJaW50IGk7CisJdTggaW5kZXggPSBmbHMoZmllbGQpOworCXU4IGFkZHIsIGVuX2FkZHIsIHZhbF9hZGRyOworCS8qIHdlIGV4cGVjdCBvbmx5IG9uZSBiaXQgc2V0ICovCisJQjQzX1dBUk5fT04oZmllbGQgJiAofigxIDw8IChpbmRleCAtIDEpKSkpOworCisJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7CisJCWNvbnN0IHN0cnVjdCBucGh5X3JmX2NvbnRyb2xfb3ZlcnJpZGVfcmV2MyAqcmZfY3RybDsKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkJaWYgKGluZGV4ID09IDAgfHwgaW5kZXggPT0gMTYpIHsKKwkJCQliNDNlcnIoZGV2LT53bCwKKwkJCQkJIlVuc3VwcG9ydGVkIFJGIEN0cmwgT3ZlcnJpZGUgY2FsbFxuIik7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQlyZl9jdHJsID0gJnRibF9yZl9jb250cm9sX292ZXJyaWRlX3JldjNbaW5kZXggLSAxXTsKKwkJCWVuX2FkZHIgPSBCNDNfUEhZX04oKGkgPT0gMCkgPworCQkJCXJmX2N0cmwtPmVuX2FkZHIwIDogcmZfY3RybC0+ZW5fYWRkcjEpOworCQkJdmFsX2FkZHIgPSBCNDNfUEhZX04oKGkgPT0gMCkgPworCQkJCXJmX2N0cmwtPnZhbF9hZGRyMCA6IHJmX2N0cmwtPnZhbF9hZGRyMSk7CisKKwkJCWlmIChvZmYpIHsKKwkJCQliNDNfcGh5X21hc2soZGV2LCBlbl9hZGRyLCB+KGZpZWxkKSk7CisJCQkJYjQzX3BoeV9tYXNrKGRldiwgdmFsX2FkZHIsCisJCQkJCQl+KHJmX2N0cmwtPnZhbF9tYXNrKSk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjb3JlID09IDAgfHwgKCgxIDw8IGkpICYgY29yZSkpIHsKKwkJCQkJYjQzX3BoeV9zZXQoZGV2LCBlbl9hZGRyLCBmaWVsZCk7CisJCQkJCWI0M19waHlfbWFza3NldChkZXYsIHZhbF9hZGRyLAorCQkJCQkJfihyZl9jdHJsLT52YWxfbWFzayksCisJCQkJCQkodmFsdWUgPDwgcmZfY3RybC0+dmFsX3NoaWZ0KSk7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IG5waHlfcmZfY29udHJvbF9vdmVycmlkZV9yZXYyICpyZl9jdHJsOworCQlpZiAob2ZmKSB7CisJCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLCB+KGZpZWxkKSk7CisJCQl2YWx1ZSA9IDA7CisJCX0gZWxzZSB7CisJCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsIGZpZWxkKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCWlmIChpbmRleCA8PSAxIHx8IGluZGV4ID09IDE2KSB7CisJCQkJYjQzZXJyKGRldi0+d2wsCisJCQkJCSJVbnN1cHBvcnRlZCBSRiBDdHJsIE92ZXJyaWRlIGNhbGxcbiIpOworCQkJCXJldHVybjsKKwkJCX0KKworCQkJaWYgKGluZGV4ID09IDIgfHwgaW5kZXggPT0gMTAgfHwKKwkJCSAgICAoaW5kZXggPj0gMTMgJiYgaW5kZXggPD0gMTUpKSB7CisJCQkJY29yZSA9IDE7CisJCQl9CisKKwkJCXJmX2N0cmwgPSAmdGJsX3JmX2NvbnRyb2xfb3ZlcnJpZGVfcmV2MltpbmRleCAtIDJdOworCQkJYWRkciA9IEI0M19QSFlfTigoaSA9PSAwKSA/CisJCQkJcmZfY3RybC0+YWRkcjAgOiByZl9jdHJsLT5hZGRyMSk7CisKKwkJCWlmICgoMSA8PCBpKSAmIGNvcmUpCisJCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgYWRkciwgfihyZl9jdHJsLT5ibWFzayksCisJCQkJCQkodmFsdWUgPDwgcmZfY3RybC0+c2hpZnQpKTsKKworCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLCAweDEpOworCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQsCisJCQkJCUI0M19OUEhZX1JGQ1RMX0NNRF9TVEFSVCk7CisJCQl1ZGVsYXkoMSk7CisJCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLCAweEZGRkUpOworCQl9CisJfQorfQorCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1JGQ3RybEludGNPdmVycmlkZSAqLworc3RhdGljIHZvaWQgYjQzX25waHlfcmZfY29udHJvbF9pbnRjX292ZXJyaWRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggZmllbGQsCisJCQkJCQl1MTYgdmFsdWUsIHU4IGNvcmUpCit7CisJdTggaSwgajsKKwl1MTYgcmVnLCB0bXAsIHZhbDsKKworCUI0M19XQVJOX09OKGRldi0+cGh5LnJldiA8IDMpOworCUI0M19XQVJOX09OKGZpZWxkID4gNCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWlmICgoY29yZSA9PSAxICYmIGkgPT0gMSkgfHwgKGNvcmUgPT0gMiAmJiAhaSkpCisJCQljb250aW51ZTsKKworCQlyZWcgPSAoaSA9PSAwKSA/CisJCQlCNDNfTlBIWV9SRkNUTF9JTlRDMSA6IEI0M19OUEhZX1JGQ1RMX0lOVEMyOworCQliNDNfcGh5X21hc2soZGV2LCByZWcsIDB4RkJGRik7CisKKwkJc3dpdGNoIChmaWVsZCkgeworCQljYXNlIDA6CisJCQliNDNfcGh5X3dyaXRlKGRldiwgcmVnLCAwKTsKKwkJCWI0M19ucGh5X2ZvcmNlX3JmX3NlcXVlbmNlKGRldiwgQjQzX1JGU0VRX1JFU0VUMlJYKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlpZiAoIWkpIHsKKwkJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMSwKKwkJCQkJCTB4RkMzRiwgKHZhbHVlIDw8IDYpKTsKKwkJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9UWEZfNDBDT19CMVMxLAorCQkJCQkJMHhGRkZFLCAxKTsKKwkJCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKKwkJCQkJCUI0M19OUEhZX1JGQ1RMX0NNRF9TVEFSVCk7CisJCQkJZm9yIChqID0gMDsgaiA8IDEwMDsgaisrKSB7CisJCQkJCWlmIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQpICYgQjQzX05QSFlfUkZDVExfQ01EX1NUQVJUKSB7CisJCQkJCQlqID0gMDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCXVkZWxheSgxMCk7CisJCQkJfQorCQkJCWlmIChqKQorCQkJCQliNDNlcnIoZGV2LT53bCwKKwkJCQkJCSJpbnRjIG92ZXJyaWRlIHRpbWVvdXRcbiIpOworCQkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1RYRl80MENPX0IxUzEsCisJCQkJCQkweEZGRkUpOworCQkJfSBlbHNlIHsKKwkJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMiwKKwkJCQkJCTB4RkMzRiwgKHZhbHVlIDw8IDYpKTsKKwkJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLAorCQkJCQkJMHhGRkZFLCAxKTsKKwkJCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKKwkJCQkJCUI0M19OUEhZX1JGQ1RMX0NNRF9SWFRYKTsKKwkJCQlmb3IgKGogPSAwOyBqIDwgMTAwOyBqKyspIHsKKwkJCQkJaWYgKGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCkgJiBCNDNfTlBIWV9SRkNUTF9DTURfUlhUWCkgeworCQkJCQkJaiA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQl1ZGVsYXkoMTApOworCQkJCX0KKwkJCQlpZiAoaikKKwkJCQkJYjQzZXJyKGRldi0+d2wsCisJCQkJCQkiaW50YyBvdmVycmlkZSB0aW1lb3V0XG4iKTsKKwkJCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLAorCQkJCQkJMHhGRkZFKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCQkJdG1wID0gMHgwMDIwOworCQkJCXZhbCA9IHZhbHVlIDw8IDU7CisJCQl9IGVsc2UgeworCQkJCXRtcCA9IDB4MDAxMDsKKwkJCQl2YWwgPSB2YWx1ZSA8PCA0OworCQkJfQorCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgcmVnLCB+dG1wLCB2YWwpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJCQl0bXAgPSAweDAwMDE7CisJCQkJdmFsID0gdmFsdWU7CisJCQl9IGVsc2UgeworCQkJCXRtcCA9IDB4MDAwNDsKKwkJCQl2YWwgPSB2YWx1ZSA8PCAyOworCQkJfQorCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgcmVnLCB+dG1wLCB2YWwpOworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJCQl0bXAgPSAweDAwMDI7CisJCQkJdmFsID0gdmFsdWUgPDwgMTsKKwkJCX0gZWxzZSB7CisJCQkJdG1wID0gMHgwMDA4OworCQkJCXZhbCA9IHZhbHVlIDw8IDM7CisJCQl9CisJCQliNDNfcGh5X21hc2tzZXQoZGV2LCByZWcsIH50bXAsIHZhbCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBWYXJpb3VzIFBIWSBvcHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9jbGlwLWRldGVjdGlvbiAqLworc3RhdGljIHZvaWQgYjQzX25waHlfd3JpdGVfY2xpcF9kZXRlY3Rpb24oc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCQkgIGNvbnN0IHUxNiAqY2xpcF9zdCkKK3sKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzFfQ0xJUDFUSFJFUywgY2xpcF9zdFswXSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MyX0NMSVAxVEhSRVMsIGNsaXBfc3RbMV0pOworfQorCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL2NsaXAtZGV0ZWN0aW9uICovCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9yZWFkX2NsaXBfZGV0ZWN0aW9uKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2ICpjbGlwX3N0KQoreworCWNsaXBfc3RbMF0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9DMV9DTElQMVRIUkVTKTsKKwljbGlwX3N0WzFdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfQzJfQ0xJUDFUSFJFUyk7Cit9CisKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vY2xhc3NpZmllciAqLworc3RhdGljIHUxNiBiNDNfbnBoeV9jbGFzc2lmaWVyKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG1hc2ssIHUxNiB2YWwpCit7CisJdTE2IHRtcDsKKworCWlmIChkZXYtPmRldi0+Y29yZV9yZXYgPT0gMTYpCisJCWI0M19tYWNfc3VzcGVuZChkZXYpOworCisJdG1wID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfQ0xBU1NDVEwpOworCXRtcCAmPSAoQjQzX05QSFlfQ0xBU1NDVExfQ0NLRU4gfCBCNDNfTlBIWV9DTEFTU0NUTF9PRkRNRU4gfAorCQlCNDNfTlBIWV9DTEFTU0NUTF9XQUlURURFTik7CisJdG1wICY9IH5tYXNrOworCXRtcCB8PSAodmFsICYgbWFzayk7CisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQ0xBU1NDVEwsIDB4RkZGOCwgdG1wKTsKKworCWlmIChkZXYtPmRldi0+Y29yZV9yZXYgPT0gMTYpCisJCWI0M19tYWNfZW5hYmxlKGRldik7CisKKwlyZXR1cm4gdG1wOworfQorCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL0NDQSAqLworc3RhdGljIHZvaWQgYjQzX25waHlfcmVzZXRfY2NhKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwl1MTYgYmJjZmc7CisKKwliNDNfcGh5X2ZvcmNlX2Nsb2NrKGRldiwgMSk7CisJYmJjZmcgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9CQkNGRyk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0JCQ0ZHLCBiYmNmZyB8IEI0M19OUEhZX0JCQ0ZHX1JTVENDQSk7CisJdWRlbGF5KDEpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CQkNGRywgYmJjZmcgJiB+QjQzX05QSFlfQkJDRkdfUlNUQ0NBKTsKKwliNDNfcGh5X2ZvcmNlX2Nsb2NrKGRldiwgMCk7CisJYjQzX25waHlfZm9yY2VfcmZfc2VxdWVuY2UoZGV2LCBCNDNfUkZTRVFfUkVTRVQyUlgpOworfQorCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL2NhcnJpZXJzZWFyY2ggKi8KK3N0YXRpYyB2b2lkIGI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBwaHktPm47CisKKwlpZiAoZW5hYmxlKSB7CisJCXN0YXRpYyBjb25zdCB1MTYgY2xpcFtdID0geyAweEZGRkYsIDB4RkZGRiB9OworCQlpZiAobnBoeS0+ZGVhZl9jb3VudCsrID09IDApIHsKKwkJCW5waHktPmNsYXNzaWZpZXJfc3RhdGUgPSBiNDNfbnBoeV9jbGFzc2lmaWVyKGRldiwgMCwgMCk7CisJCQliNDNfbnBoeV9jbGFzc2lmaWVyKGRldiwgMHg3LCAwKTsKKwkJCWI0M19ucGh5X3JlYWRfY2xpcF9kZXRlY3Rpb24oZGV2LCBucGh5LT5jbGlwX3N0YXRlKTsKKwkJCWI0M19ucGh5X3dyaXRlX2NsaXBfZGV0ZWN0aW9uKGRldiwgY2xpcCk7CisJCX0KKwkJYjQzX25waHlfcmVzZXRfY2NhKGRldik7CisJfSBlbHNlIHsKKwkJaWYgKC0tbnBoeS0+ZGVhZl9jb3VudCA9PSAwKSB7CisJCQliNDNfbnBoeV9jbGFzc2lmaWVyKGRldiwgMHg3LCBucGh5LT5jbGFzc2lmaWVyX3N0YXRlKTsKKwkJCWI0M19ucGh5X3dyaXRlX2NsaXBfZGV0ZWN0aW9uKGRldiwgbnBoeS0+Y2xpcF9zdGF0ZSk7CisJCX0KKwl9Cit9CisKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vQWRqdXN0TG5hR2FpblRibCAqLworc3RhdGljIHZvaWQgYjQzX25waHlfYWRqdXN0X2xuYV9nYWluX3RhYmxlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gZGV2LT5waHkubjsKKworCXU4IGk7CisJczE2IHRtcDsKKwl1MTYgZGF0YVs0XTsKKwlzMTYgZ2FpblsyXTsKKwl1MTYgbWlubWF4WzJdOworCXN0YXRpYyBjb25zdCB1MTYgbG5hX2dhaW5bNF0gPSB7IC0yLCAxMCwgMTksIDI1IH07CisKKwlpZiAobnBoeS0+aGFuZ19hdm9pZCkKKwkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIDEpOworCisJaWYgKG5waHktPmdhaW5fYm9vc3QpIHsKKwkJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgeworCQkJZ2FpblswXSA9IDY7CisJCQlnYWluWzFdID0gNjsKKwkJfSBlbHNlIHsKKwkJCXRtcCA9IDQwMzcwIC0gMzE1ICogZGV2LT5waHkuY2hhbm5lbDsKKwkJCWdhaW5bMF0gPSAoKHRtcCA+PiAxMykgKyAoKHRtcCA+PiAxMikgJiAxKSk7CisJCQl0bXAgPSAyMzI0MiAtIDIyNCAqIGRldi0+cGh5LmNoYW5uZWw7CisJCQlnYWluWzFdID0gKCh0bXAgPj4gMTMpICsgKCh0bXAgPj4gMTIpICYgMSkpOworCQl9CisJfSBlbHNlIHsKKwkJZ2FpblswXSA9IDA7CisJCWdhaW5bMV0gPSAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJaWYgKG5waHktPmVsbmFfZ2Fpbl9jb25maWcpIHsKKwkJCWRhdGFbMF0gPSAxOSArIGdhaW5baV07CisJCQlkYXRhWzFdID0gMjUgKyBnYWluW2ldOworCQkJZGF0YVsyXSA9IDI1ICsgZ2FpbltpXTsKKwkJCWRhdGFbM10gPSAyNSArIGdhaW5baV07CisJCX0gZWxzZSB7CisJCQlkYXRhWzBdID0gbG5hX2dhaW5bMF0gKyBnYWluW2ldOworCQkJZGF0YVsxXSA9IGxuYV9nYWluWzFdICsgZ2FpbltpXTsKKwkJCWRhdGFbMl0gPSBsbmFfZ2FpblsyXSArIGdhaW5baV07CisJCQlkYXRhWzNdID0gbG5hX2dhaW5bM10gKyBnYWluW2ldOworCQl9CisJCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjE2KGksIDgpLCA0LCBkYXRhKTsKKworCQltaW5tYXhbaV0gPSAyMyArIGdhaW5baV07CisJfQorCisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzFfTUlOTUFYX0dBSU4sIH5CNDNfTlBIWV9DMV9NSU5HQUlOLAorCQkJCW1pbm1heFswXSA8PCBCNDNfTlBIWV9DMV9NSU5HQUlOX1NISUZUKTsKKwliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMl9NSU5NQVhfR0FJTiwgfkI0M19OUEhZX0MyX01JTkdBSU4sCisJCQkJbWlubWF4WzFdIDw8IEI0M19OUEhZX0MyX01JTkdBSU5fU0hJRlQpOworCisJaWYgKG5waHktPmhhbmdfYXZvaWQpCisJCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCAwKTsKK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9TZXRSZlNlcSAqLworc3RhdGljIHZvaWQgYjQzX25waHlfc2V0X3JmX3NlcXVlbmNlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggY21kLAorCQkJCQl1OCAqZXZlbnRzLCB1OCAqZGVsYXlzLCB1OCBsZW5ndGgpCit7CisJc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IGRldi0+cGh5Lm47CisJdTggaTsKKwl1OCBlbmQgPSAoZGV2LT5waHkucmV2ID49IDMpID8gMHgxRiA6IDB4MEY7CisJdTE2IG9mZnNldDEgPSBjbWQgPDwgNDsKKwl1MTYgb2Zmc2V0MiA9IG9mZnNldDEgKyAweDgwOworCisJaWYgKG5waHktPmhhbmdfYXZvaWQpCisJCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCB0cnVlKTsKKworCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoNywgb2Zmc2V0MSksIGxlbmd0aCwgZXZlbnRzKTsKKwliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUI4KDcsIG9mZnNldDIpLCBsZW5ndGgsIGRlbGF5cyk7CisKKwlmb3IgKGkgPSBsZW5ndGg7IGkgPCAxNjsgaSsrKSB7CisJCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUI4KDcsIG9mZnNldDEgKyBpKSwgZW5kKTsKKwkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjgoNywgb2Zmc2V0MiArIGkpLCAxKTsKKwl9CisKKwlpZiAobnBoeS0+aGFuZ19hdm9pZCkKKwkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIGZhbHNlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSYWRpbyAweDIwNTYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogc3RhdGljIHZvaWQgYjQzX2NoYW50YWJfcmFkaW9fMjA1Nl91cGxvYWQoc3RydWN0IGI0M193bGRldiAqZGV2LAogCQkJCWNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjMgKmUpCiB7CkBAIC0yMjgsMTAgKzU1Miw5OCBAQAogc3RhdGljIHZvaWQgYjQzX3JhZGlvXzIwNTZfc2V0dXAoc3RydWN0IGI0M193bGRldiAqZGV2LAogCQkJCWNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjMgKmUpCiB7CisJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCk7CisJdTE2IG9mZnNldDsKKwl1OCBpOworCXUxNiBiaWFzLCBjYmlhcywgcGFnX2Jvb3N0LCBwZ2FnX2Jvb3N0LCBtaXhnX2Jvb3N0LCBwYWRnX2Jvb3N0OworCiAJQjQzX1dBUk5fT04oZGV2LT5waHkucmV2IDwgMyk7CiAKIAliNDNfY2hhbnRhYl9yYWRpb18yMDU2X3VwbG9hZChkZXYsIGUpOwotCS8qIFRPRE8gKi8KKwliMjA1Nl91cGxvYWRfc3luX3BsbF9jcDIoZGV2LCBiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopOworCisJaWYgKHNwcm9tLT5ib2FyZGZsYWdzMl9sbyAmIEI0M19CRkwyX0dQTExfV0FSICYmCisJICAgIGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgeworCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIxLCAweDFGKTsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSMiwgMHgxRik7CisJCWlmIChkZXYtPmRldi0+Y2hpcF9pZCA9PSAweDQ3MTYpIHsKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjQsIDB4MTQpOworCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9DUDIsIDApOworCQl9IGVsc2UgeworCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSNCwgMHgwQik7CisJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0NQMiwgMHgxNCk7CisJCX0KKwl9CisJaWYgKHNwcm9tLT5ib2FyZGZsYWdzMl9sbyAmIEI0M19CRkwyX0FQTExfV0FSICYmCisJICAgIGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgeworCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIxLCAweDFGKTsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSMiwgMHgxRik7CisJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjQsIDB4MDUpOworCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX0NQMiwgMHgwQyk7CisJfQorCisJaWYgKGRldi0+cGh5Lm4tPmlwYTJnX29uICYmIGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgeworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCQlvZmZzZXQgPSBpID8gQjIwNTZfVFgxIDogQjIwNTZfVFgwOworCQkJaWYgKGRldi0+cGh5LnJldiA+PSA1KSB7CisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwKKwkJCQkJb2Zmc2V0IHwgQjIwNTZfVFhfUEFER19JREFDLCAweGNjKTsKKworCQkJCWlmIChkZXYtPmRldi0+Y2hpcF9pZCA9PSAweDQ3MTYpIHsKKwkJCQkJYmlhcyA9IDB4NDA7CisJCQkJCWNiaWFzID0gMHg0NTsKKwkJCQkJcGFnX2Jvb3N0ID0gMHg1OworCQkJCQlwZ2FnX2Jvb3N0ID0gMHgzMzsKKwkJCQkJbWl4Z19ib29zdCA9IDB4NTU7CisJCQkJfSBlbHNlIHsKKwkJCQkJYmlhcyA9IDB4MjU7CisJCQkJCWNiaWFzID0gMHgyMDsKKwkJCQkJcGFnX2Jvb3N0ID0gMHg0OworCQkJCQlwZ2FnX2Jvb3N0ID0gMHgwMzsKKwkJCQkJbWl4Z19ib29zdCA9IDB4NjU7CisJCQkJfQorCQkJCXBhZGdfYm9vc3QgPSAweDc3OworCisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwKKwkJCQkJb2Zmc2V0IHwgQjIwNTZfVFhfSU5UUEFHX0lNQUlOX1NUQVQsCisJCQkJCWJpYXMpOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsCisJCQkJCW9mZnNldCB8IEIyMDU2X1RYX0lOVFBBR19JQVVYX1NUQVQsCisJCQkJCWJpYXMpOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsCisJCQkJCW9mZnNldCB8IEIyMDU2X1RYX0lOVFBBR19DQVNDQklBUywKKwkJCQkJY2JpYXMpOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsCisJCQkJCW9mZnNldCB8IEIyMDU2X1RYX0lOVFBBR19CT09TVF9UVU5FLAorCQkJCQlwYWdfYm9vc3QpOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsCisJCQkJCW9mZnNldCB8IEIyMDU2X1RYX1BHQUdfQk9PU1RfVFVORSwKKwkJCQkJcGdhZ19ib29zdCk7CisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwKKwkJCQkJb2Zmc2V0IHwgQjIwNTZfVFhfUEFER19CT09TVF9UVU5FLAorCQkJCQlwYWRnX2Jvb3N0KTsKKwkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LAorCQkJCQlvZmZzZXQgfCBCMjA1Nl9UWF9NSVhHX0JPT1NUX1RVTkUsCisJCQkJCW1peGdfYm9vc3QpOworCQkJfSBlbHNlIHsKKwkJCQliaWFzID0gZGV2LT5waHkuaXNfNDBtaHogPyAweDQwIDogMHgyMDsKKwkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LAorCQkJCQlvZmZzZXQgfCBCMjA1Nl9UWF9JTlRQQUdfSU1BSU5fU1RBVCwKKwkJCQkJYmlhcyk7CisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwKKwkJCQkJb2Zmc2V0IHwgQjIwNTZfVFhfSU5UUEFHX0lBVVhfU1RBVCwKKwkJCQkJYmlhcyk7CisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwKKwkJCQkJb2Zmc2V0IHwgQjIwNTZfVFhfSU5UUEFHX0NBU0NCSUFTLAorCQkJCQkweDMwKTsKKwkJCX0KKwkJCWI0M19yYWRpb193cml0ZShkZXYsIG9mZnNldCB8IEIyMDU2X1RYX1BBX1NQQVJFMSwgMHhlZSk7CisJCX0KKwl9IGVsc2UgaWYgKGRldi0+cGh5Lm4tPmlwYTVnX29uICYmIGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgeworCQkvKiBUT0RPICovCisJfQorCiAJdWRlbGF5KDUwKTsKIAkvKiBWQ08gY2FsaWJyYXRpb24gKi8KIAliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUExMX1ZDT0NBTDEyLCAweDAwKTsKQEAgLTI0MiwyODUgKzY1NCw4NCBAQAogCXVkZWxheSgzMDApOwogfQogCi1zdGF0aWMgdm9pZCBiNDNfY2hhbnRhYl9waHlfdXBsb2FkKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKLQkJCQkgICBjb25zdCBzdHJ1Y3QgYjQzX3BoeV9uX3Nmb19jZmcgKmUpCitzdGF0aWMgdm9pZCBiNDNfcmFkaW9faW5pdDIwNTZfcHJlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQlcxQSwgZS0+cGh5X2J3MWEpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzIsIGUtPnBoeV9idzIpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzMsIGUtPnBoeV9idzMpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzQsIGUtPnBoeV9idzQpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzUsIGUtPnBoeV9idzUpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzYsIGUtPnBoeV9idzYpOworCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKKwkJICAgICB+QjQzX05QSFlfUkZDVExfQ01EX0NISVAwUFUpOworCS8qIE1heWJlIHdsIG1lYW50IHRvIHJlc2V0IGFuZCBzZXQgKG9yZGVyPykgUkZDVExfQ01EX09FUE9SRk9SQ0U/ICovCisJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUkZDVExfQ01ELAorCQkgICAgIEI0M19OUEhZX1JGQ1RMX0NNRF9PRVBPUkZPUkNFKTsKKwliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKKwkJICAgIH5CNDNfTlBIWV9SRkNUTF9DTURfT0VQT1JGT1JDRSk7CisJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQsCisJCSAgICBCNDNfTlBIWV9SRkNUTF9DTURfQ0hJUDBQVSk7CiB9CiAKLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vVHhQd3JDdHJsRW5hYmxlICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV90eF9wb3dlcl9jdHJsKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCBlbmFibGUpCitzdGF0aWMgdm9pZCBiNDNfcmFkaW9faW5pdDIwNTZfcG9zdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IGRldi0+cGh5Lm47Ci0JdTggaTsKLQl1MTYgYm1hc2ssIHZhbCwgdG1wOwotCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCA9IGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCk7Ci0KLQlpZiAobnBoeS0+aGFuZ19hdm9pZCkKLQkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIDEpOwotCi0JbnBoeS0+dHhwd3JjdHJsID0gZW5hYmxlOwotCWlmICghZW5hYmxlKSB7Ci0JCWlmIChkZXYtPnBoeS5yZXYgPj0gMyAmJgotCQkgICAgKGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RYUENUTF9DTUQpICYKLQkJICAgICAoQjQzX05QSFlfVFhQQ1RMX0NNRF9DT0VGRiB8Ci0JCSAgICAgIEI0M19OUEhZX1RYUENUTF9DTURfSFdQQ1RMRU4gfAotCQkgICAgICBCNDNfTlBIWV9UWFBDVExfQ01EX1BDVExFTikpKSB7Ci0JCQkvKiBXZSBkaXNhYmxlIGVuYWJsZWQgVFggcHdyIGN0bCwgc2F2ZSBpdCdzIHN0YXRlICovCi0JCQlucGh5LT50eF9wd3JfaWR4WzBdID0gYjQzX3BoeV9yZWFkKGRldiwKLQkJCQkJCUI0M19OUEhZX0MxX1RYUENUTF9TVEFUKSAmIDB4N2Y7Ci0JCQlucGh5LT50eF9wd3JfaWR4WzFdID0gYjQzX3BoeV9yZWFkKGRldiwKLQkJCQkJCUI0M19OUEhZX0MyX1RYUENUTF9TVEFUKSAmIDB4N2Y7Ci0JCX0KLQotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfQUREUiwgMHg2ODQwKTsKLQkJZm9yIChpID0gMDsgaSA8IDg0OyBpKyspCi0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAwKTsKLQotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfQUREUiwgMHg2QzQwKTsKLQkJZm9yIChpID0gMDsgaSA8IDg0OyBpKyspCi0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAwKTsKLQotCQl0bXAgPSBCNDNfTlBIWV9UWFBDVExfQ01EX0NPRUZGIHwgQjQzX05QSFlfVFhQQ1RMX0NNRF9IV1BDVExFTjsKLQkJaWYgKGRldi0+cGh5LnJldiA+PSAzKQotCQkJdG1wIHw9IEI0M19OUEhZX1RYUENUTF9DTURfUENUTEVOOwotCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9UWFBDVExfQ01ELCB+dG1wKTsKLQotCQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKLQkJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIxLCAweDAxMDApOwotCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwgMHgwMTAwKTsKLQkJfSBlbHNlIHsKLQkJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIDB4NDAwMCk7Ci0JCX0KLQotCQlpZiAoZGV2LT5waHkucmV2ID09IDIpCi0JCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9CUEhZX0NUTDMsCi0JCQkJfkI0M19OUEhZX0JQSFlfQ1RMM19TQ0FMRSwgMHg1Myk7Ci0JCWVsc2UgaWYgKGRldi0+cGh5LnJldiA8IDIpCi0JCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9CUEhZX0NUTDMsCi0JCQkJfkI0M19OUEhZX0JQSFlfQ1RMM19TQ0FMRSwgMHg1QSk7Ci0KLQkJaWYgKGRldi0+cGh5LnJldiA8IDIgJiYgZGV2LT5waHkuaXNfNDBtaHopCi0JCQliNDNfaGZfd3JpdGUoZGV2LCBiNDNfaGZfcmVhZChkZXYpIHwgQjQzX0hGX1RTU0lSUFNNVyk7Ci0JfSBlbHNlIHsKLQkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMTYoMjYsIDY0KSwgODQsCi0JCQkJICAgIG5waHktPmFkal9wd3JfdGJsKTsKLQkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMTYoMjcsIDY0KSwgODQsCi0JCQkJICAgIG5waHktPmFkal9wd3JfdGJsKTsKLQotCQlibWFzayA9IEI0M19OUEhZX1RYUENUTF9DTURfQ09FRkYgfAotCQkJQjQzX05QSFlfVFhQQ1RMX0NNRF9IV1BDVExFTjsKLQkJLyogd2wgZG9lcyB1c2VsZXNzIGNoZWNrIGZvciAiZW5hYmxlIiBwYXJhbSBoZXJlICovCi0JCXZhbCA9IEI0M19OUEhZX1RYUENUTF9DTURfQ09FRkYgfCBCNDNfTlBIWV9UWFBDVExfQ01EX0hXUENUTEVOOwotCQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKLQkJCWJtYXNrIHw9IEI0M19OUEhZX1RYUENUTF9DTURfUENUTEVOOwotCQkJaWYgKHZhbCkKLQkJCQl2YWwgfD0gQjQzX05QSFlfVFhQQ1RMX0NNRF9QQ1RMRU47Ci0JCX0KLQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfVFhQQ1RMX0NNRCwgfihibWFzayksIHZhbCk7Ci0KLQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgewotCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfVFhQQ1RMX0NNRCwKLQkJCQkJfkI0M19OUEhZX1RYUENUTF9DTURfSU5JVCwgMHg2NCk7Ci0JCQlpZiAoZGV2LT5waHkucmV2ID4gMSkKLQkJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9UWFBDVExfSU5JVCwKLQkJCQkJCX5CNDNfTlBIWV9UWFBDVExfSU5JVF9QSURYSTEsCi0JCQkJCQkweDY0KTsKLQkJfQotCi0JCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgewotCQkJaWYgKG5waHktPnR4X3B3cl9pZHhbMF0gIT0gMTI4ICYmCi0JCQkgICAgbnBoeS0+dHhfcHdyX2lkeFsxXSAhPSAxMjgpIHsKLQkJCQkvKiBSZWNvdmVyIFRYIHB3ciBjdGwgc3RhdGUgKi8KLQkJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9UWFBDVExfQ01ELAotCQkJCQkJfkI0M19OUEhZX1RYUENUTF9DTURfSU5JVCwKLQkJCQkJCW5waHktPnR4X3B3cl9pZHhbMF0pOwotCQkJCWlmIChkZXYtPnBoeS5yZXYgPiAxKQotCQkJCQliNDNfcGh5X21hc2tzZXQoZGV2LAotCQkJCQkJQjQzX05QSFlfVFhQQ1RMX0lOSVQsCi0JCQkJCQl+MHhmZiwgbnBoeS0+dHhfcHdyX2lkeFsxXSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKLQkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSMSwgfjB4MTAwKTsKLQkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSLCB+MHgxMDApOwotCQl9IGVsc2UgewotCQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIH4weDQwMDApOwotCQl9Ci0KLQkJaWYgKGRldi0+cGh5LnJldiA9PSAyKQotCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQlBIWV9DVEwzLCB+MHhGRiwgMHgzYik7Ci0JCWVsc2UgaWYgKGRldi0+cGh5LnJldiA8IDIpCi0JCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9CUEhZX0NUTDMsIH4weEZGLCAweDQwKTsKLQotCQlpZiAoZGV2LT5waHkucmV2IDwgMiAmJiBkZXYtPnBoeS5pc180MG1oeikKLQkJCWI0M19oZl93cml0ZShkZXYsIGI0M19oZl9yZWFkKGRldikgJiB+QjQzX0hGX1RTU0lSUFNNVyk7Ci0KLQkJaWYgKGI0M19ucGh5X2lwYShkZXYpKSB7Ci0JCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9QQVBEX0VOMCwgfjB4NCk7Ci0JCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9QQVBEX0VOMSwgfjB4NCk7Ci0JCX0KLQl9Ci0KLQlpZiAobnBoeS0+aGFuZ19hdm9pZCkKLQkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIDApOwotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1R4UHdyRml4ICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV90eF9wb3dlcl9maXgoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBkZXYtPnBoeS5uOwotCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gZGV2LT5kZXYtPmJ1c19zcHJvbTsKLQotCXU4IHR4cGlbMl0sIGJibXVsdCwgaTsKLQl1MTYgdG1wLCByYWRpb19nYWluLCBkYWNfZ2FpbjsKLQl1MTYgZnJlcSA9IGRldi0+cGh5LmNoYW5uZWxfZnJlcTsKLQl1MzIgdHhnYWluOwotCS8qIHUzMiBnYWludGJsOyByZXYzKyAqLwotCi0JaWYgKG5waHktPmhhbmdfYXZvaWQpCi0JCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCAxKTsKLQotCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgewotCQl0eHBpWzBdID0gNDA7Ci0JCXR4cGlbMV0gPSA0MDsKLQl9IGVsc2UgaWYgKHNwcm9tLT5yZXZpc2lvbiA8IDQpIHsKLQkJdHhwaVswXSA9IDcyOwotCQl0eHBpWzFdID0gNzI7Ci0JfSBlbHNlIHsKLQkJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgewotCQkJdHhwaVswXSA9IHNwcm9tLT50eHBpZDJnWzBdOwotCQkJdHhwaVsxXSA9IHNwcm9tLT50eHBpZDJnWzFdOwotCQl9IGVsc2UgaWYgKGZyZXEgPj0gNDkwMCAmJiBmcmVxIDwgNTEwMCkgewotCQkJdHhwaVswXSA9IHNwcm9tLT50eHBpZDVnbFswXTsKLQkJCXR4cGlbMV0gPSBzcHJvbS0+dHhwaWQ1Z2xbMV07Ci0JCX0gZWxzZSBpZiAoZnJlcSA+PSA1MTAwICYmIGZyZXEgPCA1NTAwKSB7Ci0JCQl0eHBpWzBdID0gc3Byb20tPnR4cGlkNWdbMF07Ci0JCQl0eHBpWzFdID0gc3Byb20tPnR4cGlkNWdbMV07Ci0JCX0gZWxzZSBpZiAoZnJlcSA+PSA1NTAwKSB7Ci0JCQl0eHBpWzBdID0gc3Byb20tPnR4cGlkNWdoWzBdOwotCQkJdHhwaVsxXSA9IHNwcm9tLT50eHBpZDVnaFsxXTsKLQkJfSBlbHNlIHsKLQkJCXR4cGlbMF0gPSA5MTsKLQkJCXR4cGlbMV0gPSA5MTsKLQkJfQotCX0KLQorCWI0M19yYWRpb19zZXQoZGV2LCBCMjA1Nl9TWU5fQ09NX0NUUkwsIDB4Qik7CisJYjQzX3JhZGlvX3NldChkZXYsIEIyMDU2X1NZTl9DT01fUFUsIDB4Mik7CisJYjQzX3JhZGlvX3NldChkZXYsIEIyMDU2X1NZTl9DT01fUkVTRVQsIDB4Mik7CisJbXNsZWVwKDEpOworCWI0M19yYWRpb19tYXNrKGRldiwgQjIwNTZfU1lOX0NPTV9SRVNFVCwgfjB4Mik7CisJYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1Nl9TWU5fUExMX01BU1QyLCB+MHhGQyk7CisJYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1Nl9TWU5fUkNDQUxfQ1RSTDAsIH4weDEpOwogCS8qCi0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQlucGh5LT50eHB3cmluZGV4W2ldLmluZGV4X2ludGVybmFsID0gdHhwaVtpXTsKLQkJbnBoeS0+dHhwd3JpbmRleFtpXS5pbmRleF9pbnRlcm5hbF9zYXZlID0gdHhwaVtpXTsKLQl9CisJaWYgKG5waHktPmluaXRfcG9yKQorCQlDYWxsIFJhZGlvIDIwNTYgUmVjYWxpYnJhdGUKIAkqLwotCi0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKLQkJCS8qIEZJWE1FOiBzdXBwb3J0IDVHSHogKi8KLQkJCXR4Z2FpbiA9IGI0M19udGFiX3R4X2dhaW5fcmV2M3BsdXNfMmdoelt0eHBpW2ldXTsKLQkJCXJhZGlvX2dhaW4gPSAodHhnYWluID4+IDE2KSAmIDB4MUZGRkY7Ci0JCX0gZWxzZSB7Ci0JCQl0eGdhaW4gPSBiNDNfbnRhYl90eF9nYWluX3JldjBfMV8yW3R4cGlbaV1dOwotCQkJcmFkaW9fZ2FpbiA9ICh0eGdhaW4gPj4gMTYpICYgMHgxRkZGOwotCQl9Ci0KLQkJZGFjX2dhaW4gPSAodHhnYWluID4+IDgpICYgMHgzRjsKLQkJYmJtdWx0ID0gdHhnYWluICYgMHhGRjsKLQotCQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKLQkJCWlmIChpID09IDApCi0JCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUjEsIDB4MDEwMCk7Ci0JCQllbHNlCi0JCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwgMHgwMTAwKTsKLQkJfSBlbHNlIHsKLQkJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIDB4NDAwMCk7Ci0JCX0KLQotCQlpZiAoaSA9PSAwKQotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9EQUNHQUlOMSwgZGFjX2dhaW4pOwotCQllbHNlCi0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFQ1RMX0RBQ0dBSU4yLCBkYWNfZ2Fpbik7Ci0KLQkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDB4NywgMHgxMTAgKyBpKSwgcmFkaW9fZ2Fpbik7Ci0KLQkJdG1wID0gYjQzX250YWJfcmVhZChkZXYsIEI0M19OVEFCMTYoMHhGLCAweDU3KSk7Ci0JCWlmIChpID09IDApCi0JCQl0bXAgPSAodG1wICYgMHgwMEZGKSB8IChiYm11bHQgPDwgOCk7Ci0JCWVsc2UKLQkJCXRtcCA9ICh0bXAgJiAweEZGMDApIHwgYmJtdWx0OwotCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoMHhGLCAweDU3KSwgdG1wKTsKLQotCQlpZiAoYjQzX25waHlfaXBhKGRldikpIHsKLQkJCXUzMiB0bXAzMjsKLQkJCXUxNiByZWcgPSAoaSA9PSAwKSA/Ci0JCQkJQjQzX05QSFlfUEFQRF9FTjAgOiBCNDNfTlBIWV9QQVBEX0VOMTsKLQkJCXRtcDMyID0gYjQzX250YWJfcmVhZChkZXYsIEI0M19OVEFCMzIoMjYgKyBpLCB0eHBpW2ldKSk7Ci0JCQliNDNfcGh5X21hc2tzZXQoZGV2LCByZWcsIDB4RTAwRiwgKHUzMikgdG1wMzIgPDwgNCk7Ci0JCQliNDNfcGh5X3NldChkZXYsIHJlZywgMHg0KTsKLQkJfQotCX0KLQotCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX0JQSFlfQ1RMMiwgfkI0M19OUEhZX0JQSFlfQ1RMMl9MVVQpOwotCi0JaWYgKG5waHktPmhhbmdfYXZvaWQpCi0JCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCAwKTsKIH0KIAotc3RhdGljIHZvaWQgYjQzX25waHlfdHhfZ2Fpbl90YWJsZV91cGxvYWQoc3RydWN0IGI0M193bGRldiAqZGV2KQorLyoKKyAqIEluaXRpYWxpemUgYSBCcm9hZGNvbSAyMDU2IE4tcmFkaW8KKyAqIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUmFkaW8vMjA1Ni9Jbml0CisgKi8KK3N0YXRpYyB2b2lkIGI0M19yYWRpb19pbml0MjA1NihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7Ci0Jc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwliNDNfcmFkaW9faW5pdDIwNTZfcHJlKGRldik7CisJYjIwNTZfdXBsb2FkX2luaXR0YWJzKGRldiwgMCwgMCk7CisJYjQzX3JhZGlvX2luaXQyMDU2X3Bvc3QoZGV2KTsKK30KIAotCWNvbnN0IHUzMiAqdGFibGUgPSBOVUxMOwotI2lmIDAKLQlUT0RPOiBiNDNfbnRhYl9wYXBkX3BnYV9nYWluX2RlbHRhX2lwYV8yKgotCXUzMiByZnB3cl9vZmZzZXQ7Ci0JdTggcGdhX2dhaW47Ci0JaW50IGk7Ci0jZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUmFkaW8gMHgyMDU1CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQlpZiAocGh5LT5yZXYgPj0gMykgewotCQlpZiAoYjQzX25waHlfaXBhKGRldikpIHsKLQkJCXRhYmxlID0gYjQzX25waHlfZ2V0X2lwYV9nYWluX3RhYmxlKGRldik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7Ci0JCQkJaWYgKHBoeS0+cmV2ID09IDMpCi0JCQkJCXRhYmxlID0gYjQzX250YWJfdHhfZ2Fpbl9yZXYzXzVnaHo7Ci0JCQkJaWYgKHBoeS0+cmV2ID09IDQpCi0JCQkJCXRhYmxlID0gYjQzX250YWJfdHhfZ2Fpbl9yZXY0XzVnaHo7Ci0JCQkJZWxzZQotCQkJCQl0YWJsZSA9IGI0M19udGFiX3R4X2dhaW5fcmV2NXBsdXNfNWdoejsKLQkJCX0gZWxzZSB7Ci0JCQkJdGFibGUgPSBiNDNfbnRhYl90eF9nYWluX3JldjNwbHVzXzJnaHo7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQl0YWJsZSA9IGI0M19udGFiX3R4X2dhaW5fcmV2MF8xXzI7Ci0JfQotCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjMyKDI2LCAxOTIpLCAxMjgsIHRhYmxlKTsKLQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUIzMigyNywgMTkyKSwgMTI4LCB0YWJsZSk7CitzdGF0aWMgdm9pZCBiNDNfY2hhbnRhYl9yYWRpb191cGxvYWQoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBiNDNfbnBoeV9jaGFubmVsdGFiX2VudHJ5X3JldjIgKmUpCit7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfUExMX1JFRiwgZS0+cmFkaW9fcGxsX3JlZik7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfUkZfUExMTU9EMCwgZS0+cmFkaW9fcmZfcGxsbW9kMCk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfUkZfUExMTU9EMSwgZS0+cmFkaW9fcmZfcGxsbW9kMSk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfVkNPX0NBUFRBSUwsIGUtPnJhZGlvX3Zjb19jYXB0YWlsKTsKKwliNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKTsgLyogZmx1c2ggd3JpdGVzICovCiAKLQlpZiAocGh5LT5yZXYgPj0gMykgewotI2lmIDAKLQkJbnBoeS0+Z212YWwgPSAodGFibGVbMF0gPj4gMTYpICYgMHg3MDAwOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X1ZDT19DQUwxLCBlLT5yYWRpb192Y29fY2FsMSk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfVkNPX0NBTDIsIGUtPnJhZGlvX3Zjb19jYWwyKTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9QTExfTEZDMSwgZS0+cmFkaW9fcGxsX2xmYzEpOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X1BMTF9MRlIxLCBlLT5yYWRpb19wbGxfbGZyMSk7CisJYjQzX3JlYWQzMihkZXYsIEI0M19NTUlPX01BQ0NUTCk7IC8qIGZsdXNoIHdyaXRlcyAqLwogCi0JCWZvciAoaSA9IDA7IGkgPCAxMjg7IGkrKykgewotCQkJcGdhX2dhaW4gPSAodGFibGVbaV0gPj4gMjQpICYgMHhGOwotCQkJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKLQkJCQlyZnB3cl9vZmZzZXQgPSBiNDNfbnRhYl9wYXBkX3BnYV9nYWluX2RlbHRhX2lwYV8yZ1twZ2FfZ2Fpbl07Ci0JCQllbHNlCi0JCQkJcmZwd3Jfb2Zmc2V0ID0gYjQzX250YWJfcGFwZF9wZ2FfZ2Fpbl9kZWx0YV9pcGFfNWdbcGdhX2dhaW5dOwotCQkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjMyKDI2LCA1NzYgKyBpKSwKLQkJCQkgICAgICAgcmZwd3Jfb2Zmc2V0KTsKLQkJCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIzMigyNywgNTc2ICsgaSksCi0JCQkJICAgICAgIHJmcHdyX29mZnNldCk7Ci0JCX0KLSNlbmRpZgotCX0KKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9QTExfTEZDMiwgZS0+cmFkaW9fcGxsX2xmYzIpOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X0xHQlVGX0NFTkJVRiwgZS0+cmFkaW9fbGdidWZfY2VuYnVmKTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9MR0VOX1RVTkUxLCBlLT5yYWRpb19sZ2VuX3R1bmUxKTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9MR0VOX1RVTkUyLCBlLT5yYWRpb19sZ2VuX3R1bmUyKTsKKwliNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKTsgLyogZmx1c2ggd3JpdGVzICovCisKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9DMV9MR0JVRl9BVFVORSwgZS0+cmFkaW9fYzFfbGdidWZfYXR1bmUpOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X0MxX0xHQlVGX0dUVU5FLCBlLT5yYWRpb19jMV9sZ2J1Zl9ndHVuZSk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfQzFfUlhfUkZSMSwgZS0+cmFkaW9fYzFfcnhfcmZyMSk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfQzFfVFhfUEdBUEFEVE4sIGUtPnJhZGlvX2MxX3R4X3BnYXBhZHRuKTsKKwliNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKTsgLyogZmx1c2ggd3JpdGVzICovCisKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9DMV9UWF9NWEJHVFJJTSwgZS0+cmFkaW9fYzFfdHhfbXhiZ3RyaW0pOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X0MyX0xHQlVGX0FUVU5FLCBlLT5yYWRpb19jMl9sZ2J1Zl9hdHVuZSk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTVfQzJfTEdCVUZfR1RVTkUsIGUtPnJhZGlvX2MyX2xnYnVmX2d0dW5lKTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9DMl9SWF9SRlIxLCBlLT5yYWRpb19jMl9yeF9yZnIxKTsKKwliNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKTsgLyogZmx1c2ggd3JpdGVzICovCisKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1NV9DMl9UWF9QR0FQQURUTiwgZS0+cmFkaW9fYzJfdHhfcGdhcGFkdG4pOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU1X0MyX1RYX01YQkdUUklNLCBlLT5yYWRpb19jMl90eF9teGJndHJpbSk7CiB9CiAKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL1JhZGlvLzIwNTVTZXR1cCAqLwpAQCAtNjIyLDEwODkgKzgzMyw5IEBACiAJYjQzX3JhZGlvX2luaXQyMDU1X3Bvc3QoZGV2KTsKIH0KIAotc3RhdGljIHZvaWQgYjQzX3JhZGlvX2luaXQyMDU2X3ByZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUkZDVExfQ01ELAotCQkgICAgIH5CNDNfTlBIWV9SRkNUTF9DTURfQ0hJUDBQVSk7Ci0JLyogTWF5YmUgd2wgbWVhbnQgdG8gcmVzZXQgYW5kIHNldCAob3JkZXI/KSBSRkNUTF9DTURfT0VQT1JGT1JDRT8gKi8KLQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQsCi0JCSAgICAgQjQzX05QSFlfUkZDVExfQ01EX09FUE9SRk9SQ0UpOwotCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfUkZDVExfQ01ELAotCQkgICAgfkI0M19OUEhZX1JGQ1RMX0NNRF9PRVBPUkZPUkNFKTsKLQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKLQkJICAgIEI0M19OUEhZX1JGQ1RMX0NNRF9DSElQMFBVKTsKLX0KLQotc3RhdGljIHZvaWQgYjQzX3JhZGlvX2luaXQyMDU2X3Bvc3Qoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCWI0M19yYWRpb19zZXQoZGV2LCBCMjA1Nl9TWU5fQ09NX0NUUkwsIDB4Qik7Ci0JYjQzX3JhZGlvX3NldChkZXYsIEIyMDU2X1NZTl9DT01fUFUsIDB4Mik7Ci0JYjQzX3JhZGlvX3NldChkZXYsIEIyMDU2X1NZTl9DT01fUkVTRVQsIDB4Mik7Ci0JbXNsZWVwKDEpOwotCWI0M19yYWRpb19tYXNrKGRldiwgQjIwNTZfU1lOX0NPTV9SRVNFVCwgfjB4Mik7Ci0JYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1Nl9TWU5fUExMX01BU1QyLCB+MHhGQyk7Ci0JYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1Nl9TWU5fUkNDQUxfQ1RSTDAsIH4weDEpOwotCS8qCi0JaWYgKG5waHktPmluaXRfcG9yKQotCQlDYWxsIFJhZGlvIDIwNTYgUmVjYWxpYnJhdGUKLQkqLwotfQotCi0vKgotICogSW5pdGlhbGl6ZSBhIEJyb2FkY29tIDIwNTYgTi1yYWRpbwotICogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9SYWRpby8yMDU2L0luaXQKLSAqLwotc3RhdGljIHZvaWQgYjQzX3JhZGlvX2luaXQyMDU2KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQliNDNfcmFkaW9faW5pdDIwNTZfcHJlKGRldik7Ci0JYjIwNTZfdXBsb2FkX2luaXR0YWJzKGRldiwgMCwgMCk7Ci0JYjQzX3JhZGlvX2luaXQyMDU2X3Bvc3QoZGV2KTsKLX0KLQotLyoKLSAqIFVwbG9hZCB0aGUgTi1QSFkgdGFibGVzLgotICogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9Jbml0VGFibGVzCi0gKi8KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3RhYmxlc19pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlpZiAoZGV2LT5waHkucmV2IDwgMykKLQkJYjQzX25waHlfcmV2MF8xXzJfdGFibGVzX2luaXQoZGV2KTsKLQllbHNlCi0JCWI0M19ucGh5X3JldjNwbHVzX3RhYmxlc19pbml0KGRldik7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUEElMjBvdmVycmlkZSAqLwotc3RhdGljIHZvaWQgYjQzX25waHlfcGFfb3ZlcnJpZGUoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gZGV2LT5waHkubjsKLQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7Ci0JdTE2IHRtcDsKLQotCWlmICghZW5hYmxlKSB7Ci0JCW5waHktPnJmY3RybF9pbnRjMV9zYXZlID0gYjQzX3BoeV9yZWFkKGRldiwKLQkJCQkJCSAgICAgICBCNDNfTlBIWV9SRkNUTF9JTlRDMSk7Ci0JCW5waHktPnJmY3RybF9pbnRjMl9zYXZlID0gYjQzX3BoeV9yZWFkKGRldiwKLQkJCQkJCSAgICAgICBCNDNfTlBIWV9SRkNUTF9JTlRDMik7Ci0JCWJhbmQgPSBiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpOwotCQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKLQkJCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCQkJdG1wID0gMHg2MDA7Ci0JCQllbHNlCi0JCQkJdG1wID0gMHg0ODA7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJCXRtcCA9IDB4MTgwOwotCQkJZWxzZQotCQkJCXRtcCA9IDB4MTIwOwotCQl9Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMSwgdG1wKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEMyLCB0bXApOwotCX0gZWxzZSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMSwKLQkJCQlucGh5LT5yZmN0cmxfaW50YzFfc2F2ZSk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMiwKLQkJCQlucGh5LT5yZmN0cmxfaW50YzJfc2F2ZSk7Ci0JfQotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1R4THBGYncgKi8KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3R4X2xwX2ZidyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JdTE2IHRtcDsKLQotCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgewotCQlpZiAoYjQzX25waHlfaXBhKGRldikpIHsKLQkJCXRtcCA9IDQ7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVFhGXzQwQ09fQjMyUzIsCi0JCQkgICAgICAoKCgoKHRtcCA8PCAzKSB8IHRtcCkgPDwgMykgfCB0bXApIDw8IDMpIHwgdG1wKTsKLQkJfQotCi0JCXRtcCA9IDE7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UWEZfNDBDT19CMVMyLAotCQkJICAgICAgKCgoKCh0bXAgPDwgMykgfCB0bXApIDw8IDMpIHwgdG1wKSA8PCAzKSB8IHRtcCk7Ci0JfQotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL0NDQSAqLwotc3RhdGljIHZvaWQgYjQzX25waHlfcmVzZXRfY2NhKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQl1MTYgYmJjZmc7Ci0KLQliNDNfcGh5X2ZvcmNlX2Nsb2NrKGRldiwgMSk7Ci0JYmJjZmcgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9CQkNGRyk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0JCQ0ZHLCBiYmNmZyB8IEI0M19OUEhZX0JCQ0ZHX1JTVENDQSk7Ci0JdWRlbGF5KDEpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CQkNGRywgYmJjZmcgJiB+QjQzX05QSFlfQkJDRkdfUlNUQ0NBKTsKLQliNDNfcGh5X2ZvcmNlX2Nsb2NrKGRldiwgMCk7Ci0JYjQzX25waHlfZm9yY2VfcmZfc2VxdWVuY2UoZGV2LCBCNDNfUkZTRVFfUkVTRVQyUlgpOwotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL01JTU9Db25maWcgKi8KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3VwZGF0ZV9taW1vX2NvbmZpZyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHMzMiBwcmVhbWJsZSkKLXsKLQl1MTYgbWltb2NmZyA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX01JTU9DRkcpOwotCi0JbWltb2NmZyB8PSBCNDNfTlBIWV9NSU1PQ0ZHX0FVVE87Ci0JaWYgKHByZWFtYmxlID09IDEpCi0JCW1pbW9jZmcgfD0gQjQzX05QSFlfTUlNT0NGR19HRk1JWDsKLQllbHNlCi0JCW1pbW9jZmcgJj0gfkI0M19OUEhZX01JTU9DRkdfR0ZNSVg7Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfTUlNT0NGRywgbWltb2NmZyk7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vQ2hhaW5zICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV91cGRhdGVfdHhyeF9jaGFpbihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IGRldi0+cGh5Lm47Ci0KLQlib29sIG92ZXJyaWRlID0gZmFsc2U7Ci0JdTE2IGNoYWluID0gMHgzMzsKLQotCWlmIChucGh5LT50eHJ4X2NoYWluID09IDApIHsKLQkJY2hhaW4gPSAweDExOwotCQlvdmVycmlkZSA9IHRydWU7Ci0JfSBlbHNlIGlmIChucGh5LT50eHJ4X2NoYWluID09IDEpIHsKLQkJY2hhaW4gPSAweDIyOwotCQlvdmVycmlkZSA9IHRydWU7Ci0JfQotCi0JYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfUkZTRVFDQSwKLQkJCX4oQjQzX05QSFlfUkZTRVFDQV9UWEVOIHwgQjQzX05QSFlfUkZTRVFDQV9SWEVOKSwKLQkJCWNoYWluKTsKLQotCWlmIChvdmVycmlkZSkKLQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRlNFUU1PREUsCi0JCQkJQjQzX05QSFlfUkZTRVFNT0RFX0NBT1ZFUik7Ci0JZWxzZQotCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRlNFUU1PREUsCi0JCQkJfkI0M19OUEhZX1JGU0VRTU9ERV9DQU9WRVIpOwotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1J4SXFFc3QgKi8KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3J4X2lxX2VzdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHN0cnVjdCBucGh5X2lxX2VzdCAqZXN0LAotCQkJCXUxNiBzYW1wcywgdTggdGltZSwgYm9vbCB3YWl0KQotewotCWludCBpOwotCXUxNiB0bXA7Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfSVFFU1RfU0FNQ05ULCBzYW1wcyk7Ci0JYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfSVFFU1RfV1QsIH5CNDNfTlBIWV9JUUVTVF9XVF9WQUwsIHRpbWUpOwotCWlmICh3YWl0KQotCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX0lRRVNUX0NNRCwgQjQzX05QSFlfSVFFU1RfQ01EX01PREUpOwotCWVsc2UKLQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfSVFFU1RfQ01ELCB+QjQzX05QSFlfSVFFU1RfQ01EX01PREUpOwotCi0JYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9JUUVTVF9DTUQsIEI0M19OUEhZX0lRRVNUX0NNRF9TVEFSVCk7Ci0KLQlmb3IgKGkgPSAxMDAwOyBpOyBpLS0pIHsKLQkJdG1wID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfQ01EKTsKLQkJaWYgKCEodG1wICYgQjQzX05QSFlfSVFFU1RfQ01EX1NUQVJUKSkgewotCQkJZXN0LT5pMF9wd3IgPSAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfSVBBQ0NfSEkwKSA8PCAxNikgfAotCQkJCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9JUUVTVF9JUEFDQ19MTzApOwotCQkJZXN0LT5xMF9wd3IgPSAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfUVBBQ0NfSEkwKSA8PCAxNikgfAotCQkJCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9JUUVTVF9RUEFDQ19MTzApOwotCQkJZXN0LT5pcTBfcHJvZCA9IChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9JUUVTVF9JUUFDQ19ISTApIDw8IDE2KSB8Ci0JCQkJCWI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0lRRVNUX0lRQUNDX0xPMCk7Ci0KLQkJCWVzdC0+aTFfcHdyID0gKGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0lRRVNUX0lQQUNDX0hJMSkgPDwgMTYpIHwKLQkJCQkJYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfSVBBQ0NfTE8xKTsKLQkJCWVzdC0+cTFfcHdyID0gKGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0lRRVNUX1FQQUNDX0hJMSkgPDwgMTYpIHwKLQkJCQkJYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfUVBBQ0NfTE8xKTsKLQkJCWVzdC0+aXExX3Byb2QgPSAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfSVFBQ0NfSEkxKSA8PCAxNikgfAotCQkJCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9JUUVTVF9JUUFDQ19MTzEpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXVkZWxheSgxMCk7Ci0JfQotCW1lbXNldChlc3QsIDAsIHNpemVvZigqZXN0KSk7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUnhJcUNvZWZmcyAqLwotc3RhdGljIHZvaWQgYjQzX25waHlfcnhfaXFfY29lZmZzKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCB3cml0ZSwKLQkJCQkJc3RydWN0IGI0M19waHlfbl9pcV9jb21wICpwY29tcCkKLXsKLQlpZiAod3JpdGUpIHsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MxX1JYSVFfQ09NUEEwLCBwY29tcC0+YTApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzFfUlhJUV9DT01QQjAsIHBjb21wLT5iMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMl9SWElRX0NPTVBBMSwgcGNvbXAtPmExKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MyX1JYSVFfQ09NUEIxLCBwY29tcC0+YjEpOwotCX0gZWxzZSB7Ci0JCXBjb21wLT5hMCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0MxX1JYSVFfQ09NUEEwKTsKLQkJcGNvbXAtPmIwID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfQzFfUlhJUV9DT01QQjApOwotCQlwY29tcC0+YTEgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9DMl9SWElRX0NPTVBBMSk7Ci0JCXBjb21wLT5iMSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0MyX1JYSVFfQ09NUEIxKTsKLQl9Ci19Ci0KLSNpZiAwCi0vKiBSZWFkeSBidXQgbm90IHVzZWQgYW55d2hlcmUgKi8KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUnhDYWxQaHlDbGVhbnVwICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9yeF9jYWxfcGh5X2NsZWFudXAoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBjb3JlKQotewotCXUxNiAqcmVncyA9IGRldi0+cGh5Lm4tPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3M7Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZTRVFDQSwgcmVnc1swXSk7Ci0JaWYgKGNvcmUgPT0gMCkgewotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFQ1RMX0MxLCByZWdzWzFdKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSMSwgcmVnc1syXSk7Ci0JfSBlbHNlIHsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9DMiwgcmVnc1sxXSk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwgcmVnc1syXSk7Ci0JfQotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMSwgcmVnc1szXSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEMyLCByZWdzWzRdKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfUlNTSU8xLCByZWdzWzVdKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfUlNTSU8yLCByZWdzWzZdKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVFhGXzQwQ09fQjFTMSwgcmVnc1s3XSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsIHJlZ3NbOF0pOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QQVBEX0VOMCwgcmVnc1s5XSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BBUERfRU4xLCByZWdzWzEwXSk7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUnhDYWxQaHlTZXR1cCAqLwotc3RhdGljIHZvaWQgYjQzX25waHlfcnhfY2FsX3BoeV9zZXR1cChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHU4IGNvcmUpCi17Ci0JdTggcnh2YWwsIHR4dmFsOwotCXUxNiAqcmVncyA9IGRldi0+cGh5Lm4tPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3M7Ci0KLQlyZWdzWzBdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZTRVFDQSk7Ci0JaWYgKGNvcmUgPT0gMCkgewotCQlyZWdzWzFdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfQUZFQ1RMX0MxKTsKLQkJcmVnc1syXSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSMSk7Ci0JfSBlbHNlIHsKLQkJcmVnc1sxXSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0FGRUNUTF9DMik7Ci0JCXJlZ3NbMl0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUik7Ci0JfQotCXJlZ3NbM10gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMSk7Ci0JcmVnc1s0XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEMyKTsKLQlyZWdzWzVdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZDVExfUlNTSU8xKTsKLQlyZWdzWzZdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZDVExfUlNTSU8yKTsKLQlyZWdzWzddID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfVFhGXzQwQ09fQjFTMSk7Ci0JcmVnc1s4XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIpOwotCXJlZ3NbOV0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9QQVBEX0VOMCk7Ci0JcmVnc1sxMF0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9QQVBEX0VOMSk7Ci0KLQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9QQVBEX0VOMCwgfjB4MDAwMSk7Ci0JYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUEFQRF9FTjEsIH4weDAwMDEpOwotCi0JYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfUkZTRVFDQSwKLQkJCX5CNDNfTlBIWV9SRlNFUUNBX1JYRElTICYgMHhGRkZGLAotCQkJKCgxIC0gY29yZSkgPDwgQjQzX05QSFlfUkZTRVFDQV9SWERJU19TSElGVCkpOwotCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX1JGU0VRQ0EsIH5CNDNfTlBIWV9SRlNFUUNBX1RYRU4sCi0JCQkoKDEgLSBjb3JlKSA8PCBCNDNfTlBIWV9SRlNFUUNBX1RYRU5fU0hJRlQpKTsKLQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRlNFUUNBLCB+QjQzX05QSFlfUkZTRVFDQV9SWEVOLAotCQkJKGNvcmUgPDwgQjQzX05QSFlfUkZTRVFDQV9SWEVOX1NISUZUKSk7Ci0JYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfUkZTRVFDQSwgfkI0M19OUEhZX1JGU0VRQ0FfVFhESVMsCi0JCQkoY29yZSA8PCBCNDNfTlBIWV9SRlNFUUNBX1RYRElTX1NISUZUKSk7Ci0KLQlpZiAoY29yZSA9PSAwKSB7Ci0JCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX0FGRUNUTF9DMSwgfjB4MDAwNyk7Ci0JCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIxLCAweDAwMDcpOwotCX0gZWxzZSB7Ci0JCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX0FGRUNUTF9DMiwgfjB4MDAwNyk7Ci0JCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIDB4MDAwNyk7Ci0JfQotCi0JYjQzX25waHlfcmZfY29udHJvbF9pbnRjX292ZXJyaWRlKGRldiwgMiwgMCwgMyk7Ci0JYjQzX25waHlfcmZfY29udHJvbF9vdmVycmlkZShkZXYsIDgsIDAsIDMsIGZhbHNlKTsKLQliNDNfbnBoeV9mb3JjZV9yZl9zZXF1ZW5jZShkZXYsIEI0M19SRlNFUV9SWDJUWCk7Ci0KLQlpZiAoY29yZSA9PSAwKSB7Ci0JCXJ4dmFsID0gMTsKLQkJdHh2YWwgPSA4OwotCX0gZWxzZSB7Ci0JCXJ4dmFsID0gNDsKLQkJdHh2YWwgPSAyOwotCX0KLQliNDNfbnBoeV9yZl9jb250cm9sX2ludGNfb3ZlcnJpZGUoZGV2LCAxLCByeHZhbCwgKGNvcmUgKyAxKSk7Ci0JYjQzX25waHlfcmZfY29udHJvbF9pbnRjX292ZXJyaWRlKGRldiwgMSwgdHh2YWwsICgyIC0gY29yZSkpOwotfQotI2VuZGlmCi0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vQ2FsY1J4SXFDb21wICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9jYWxjX3J4X2lxX2NvbXAoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBtYXNrKQotewotCWludCBpOwotCXMzMiBpcTsKLQl1MzIgaWk7Ci0JdTMyIHFxOwotCWludCBpcV9uYml0cywgcXFfbmJpdHM7Ci0JaW50IGFyc2gsIGJyc2g7Ci0JdTE2IHRtcCwgYSwgYjsKLQotCXN0cnVjdCBucGh5X2lxX2VzdCBlc3Q7Ci0Jc3RydWN0IGI0M19waHlfbl9pcV9jb21wIG9sZDsKLQlzdHJ1Y3QgYjQzX3BoeV9uX2lxX2NvbXAgbmV3ID0geyB9OwotCWJvb2wgZXJyb3IgPSBmYWxzZTsKLQotCWlmIChtYXNrID09IDApCi0JCXJldHVybjsKLQotCWI0M19ucGh5X3J4X2lxX2NvZWZmcyhkZXYsIGZhbHNlLCAmb2xkKTsKLQliNDNfbnBoeV9yeF9pcV9jb2VmZnMoZGV2LCB0cnVlLCAmbmV3KTsKLQliNDNfbnBoeV9yeF9pcV9lc3QoZGV2LCAmZXN0LCAweDQwMDAsIDMyLCBmYWxzZSk7Ci0JbmV3ID0gb2xkOwotCi0JZm9yIChpID0gMDsgaSA8IDI7IGkrKykgewotCQlpZiAoaSA9PSAwICYmIChtYXNrICYgMSkpIHsKLQkJCWlxID0gZXN0LmlxMF9wcm9kOwotCQkJaWkgPSBlc3QuaTBfcHdyOwotCQkJcXEgPSBlc3QucTBfcHdyOwotCQl9IGVsc2UgaWYgKGkgPT0gMSAmJiAobWFzayAmIDIpKSB7Ci0JCQlpcSA9IGVzdC5pcTFfcHJvZDsKLQkJCWlpID0gZXN0LmkxX3B3cjsKLQkJCXFxID0gZXN0LnExX3B3cjsKLQkJfSBlbHNlIHsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKGlpICsgcXEgPCAyKSB7Ci0JCQllcnJvciA9IHRydWU7Ci0JCQlicmVhazsKLQkJfQotCi0JCWlxX25iaXRzID0gZmxzKGFicyhpcSkpOwotCQlxcV9uYml0cyA9IGZscyhxcSk7Ci0KLQkJYXJzaCA9IGlxX25iaXRzIC0gMjA7Ci0JCWlmIChhcnNoID49IDApIHsKLQkJCWEgPSAtKChpcSA8PCAoMzAgLSBpcV9uYml0cykpICsgKGlpID4+ICgxICsgYXJzaCkpKTsKLQkJCXRtcCA9IGlpID4+IGFyc2g7Ci0JCX0gZWxzZSB7Ci0JCQlhID0gLSgoaXEgPDwgKDMwIC0gaXFfbmJpdHMpKSArIChpaSA8PCAoLTEgLSBhcnNoKSkpOwotCQkJdG1wID0gaWkgPDwgLWFyc2g7Ci0JCX0KLQkJaWYgKHRtcCA9PSAwKSB7Ci0JCQllcnJvciA9IHRydWU7Ci0JCQlicmVhazsKLQkJfQotCQlhIC89IHRtcDsKLQotCQlicnNoID0gcXFfbmJpdHMgLSAxMTsKLQkJaWYgKGJyc2ggPj0gMCkgewotCQkJYiA9IChxcSA8PCAoMzEgLSBxcV9uYml0cykpOwotCQkJdG1wID0gaWkgPj4gYnJzaDsKLQkJfSBlbHNlIHsKLQkJCWIgPSAocXEgPDwgKDMxIC0gcXFfbmJpdHMpKTsKLQkJCXRtcCA9IGlpIDw8IC1icnNoOwotCQl9Ci0JCWlmICh0bXAgPT0gMCkgewotCQkJZXJyb3IgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQkJYiA9IGludF9zcXJ0KGIgLyB0bXAgLSBhICogYSkgLSAoMSA8PCAxMCk7Ci0KLQkJaWYgKGkgPT0gMCAmJiAobWFzayAmIDB4MSkpIHsKLQkJCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgewotCQkJCW5ldy5hMCA9IGEgJiAweDNGRjsKLQkJCQluZXcuYjAgPSBiICYgMHgzRkY7Ci0JCQl9IGVsc2UgewotCQkJCW5ldy5hMCA9IGIgJiAweDNGRjsKLQkJCQluZXcuYjAgPSBhICYgMHgzRkY7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoaSA9PSAxICYmIChtYXNrICYgMHgyKSkgewotCQkJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7Ci0JCQkJbmV3LmExID0gYSAmIDB4M0ZGOwotCQkJCW5ldy5iMSA9IGIgJiAweDNGRjsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV3LmExID0gYiAmIDB4M0ZGOwotCQkJCW5ldy5iMSA9IGEgJiAweDNGRjsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChlcnJvcikKLQkJbmV3ID0gb2xkOwotCi0JYjQzX25waHlfcnhfaXFfY29lZmZzKGRldiwgdHJ1ZSwgJm5ldyk7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vVHhJcVdhciAqLwotc3RhdGljIHZvaWQgYjQzX25waHlfdHhfaXFfd29ya2Fyb3VuZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0JdTE2IGFycmF5WzRdOwotCWI0M19udGFiX3JlYWRfYnVsayhkZXYsIEI0M19OVEFCMTYoMHhGLCAweDUwKSwgNCwgYXJyYXkpOwotCi0JYjQzX3NobV93cml0ZTE2KGRldiwgQjQzX1NITV9TSEFSRUQsIEI0M19TSE1fU0hfTlBIWV9UWElRVzAsIGFycmF5WzBdKTsKLQliNDNfc2htX3dyaXRlMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwgQjQzX1NITV9TSF9OUEhZX1RYSVFXMSwgYXJyYXlbMV0pOwotCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELCBCNDNfU0hNX1NIX05QSFlfVFhJUVcyLCBhcnJheVsyXSk7Ci0JYjQzX3NobV93cml0ZTE2KGRldiwgQjQzX1NITV9TSEFSRUQsIEI0M19TSE1fU0hfTlBIWV9UWElRVzMsIGFycmF5WzNdKTsKLX0KLQotLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9jbGlwLWRldGVjdGlvbiAqLwotc3RhdGljIHZvaWQgYjQzX25waHlfd3JpdGVfY2xpcF9kZXRlY3Rpb24oc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkJCQkgIGNvbnN0IHUxNiAqY2xpcF9zdCkKLXsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzFfQ0xJUDFUSFJFUywgY2xpcF9zdFswXSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MyX0NMSVAxVEhSRVMsIGNsaXBfc3RbMV0pOwotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL2NsaXAtZGV0ZWN0aW9uICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9yZWFkX2NsaXBfZGV0ZWN0aW9uKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2ICpjbGlwX3N0KQotewotCWNsaXBfc3RbMF0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9DMV9DTElQMVRIUkVTKTsKLQljbGlwX3N0WzFdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfQzJfQ0xJUDFUSFJFUyk7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vU3VwZXJTd2l0Y2hJbml0ICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9zdXBlcnN3aXRjaF9pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCBpbml0KQotewotCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgewotCQlpZiAoIWluaXQpCi0JCQlyZXR1cm47Ci0JCWlmICgwIC8qIEZJWE1FICovKSB7Ci0JCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOSwgMiksIDB4MjExKTsKLQkJCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig5LCAzKSwgMHgyMjIpOwotCQkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDksIDgpLCAweDE0NCk7Ci0JCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOSwgMTIpLCAweDE4OCk7Ci0JCX0KLQl9IGVsc2UgewotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfR1BJT19MT09FTiwgMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9HUElPX0hJT0VOLCAwKTsKLQotCQlzd2l0Y2ggKGRldi0+ZGV2LT5idXNfdHlwZSkgewotI2lmZGVmIENPTkZJR19CNDNfQkNNQQotCQljYXNlIEI0M19CVVNfQkNNQToKLQkJCWJjbWFfY2hpcGNvX2dwaW9fY29udHJvbCgmZGV2LT5kZXYtPmJkZXYtPmJ1cy0+ZHJ2X2NjLAotCQkJCQkJIDB4RkMwMCwgMHhGQzAwKTsKLQkJCWJyZWFrOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX0I0M19TU0IKLQkJY2FzZSBCNDNfQlVTX1NTQjoKLQkJCXNzYl9jaGlwY29fZ3Bpb19jb250cm9sKCZkZXYtPmRldi0+c2Rldi0+YnVzLT5jaGlwY28sCi0JCQkJCQkweEZDMDAsIDB4RkMwMCk7Ci0JCQlicmVhazsKLSNlbmRpZgotCQl9Ci0KLQkJYjQzX3dyaXRlMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwsCi0JCQliNDNfcmVhZDMyKGRldiwgQjQzX01NSU9fTUFDQ1RMKSAmCi0JCQl+QjQzX01BQ0NUTF9HUE9VVFNNU0spOwotCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0dQSU9fTUFTSywKLQkJCWI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19HUElPX01BU0spIHwgMHhGQzAwKTsKLQkJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19HUElPX0NPTlRST0wsCi0JCQliNDNfcmVhZDE2KGRldiwgQjQzX01NSU9fR1BJT19DT05UUk9MKSAmIH4weEZDMDApOwotCi0JCWlmIChpbml0KSB7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfTE8xLCAweDJEOCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVAxLCAweDMwMSk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfTE8yLCAweDJEOCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVAyLCAweDMwMSk7Ci0JCX0KLQl9Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vY2xhc3NpZmllciAqLwotc3RhdGljIHUxNiBiNDNfbnBoeV9jbGFzc2lmaWVyKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IG1hc2ssIHUxNiB2YWwpCi17Ci0JdTE2IHRtcDsKLQotCWlmIChkZXYtPmRldi0+Y29yZV9yZXYgPT0gMTYpCi0JCWI0M19tYWNfc3VzcGVuZChkZXYpOwotCi0JdG1wID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfQ0xBU1NDVEwpOwotCXRtcCAmPSAoQjQzX05QSFlfQ0xBU1NDVExfQ0NLRU4gfCBCNDNfTlBIWV9DTEFTU0NUTF9PRkRNRU4gfAotCQlCNDNfTlBIWV9DTEFTU0NUTF9XQUlURURFTik7Ci0JdG1wICY9IH5tYXNrOwotCXRtcCB8PSAodmFsICYgbWFzayk7Ci0JYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQ0xBU1NDVEwsIDB4RkZGOCwgdG1wKTsKLQotCWlmIChkZXYtPmRldi0+Y29yZV9yZXYgPT0gMTYpCi0JCWI0M19tYWNfZW5hYmxlKGRldik7Ci0KLQlyZXR1cm4gdG1wOwotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL2NhcnJpZXJzZWFyY2ggKi8KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OwotCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBwaHktPm47Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXN0YXRpYyBjb25zdCB1MTYgY2xpcFtdID0geyAweEZGRkYsIDB4RkZGRiB9OwotCQlpZiAobnBoeS0+ZGVhZl9jb3VudCsrID09IDApIHsKLQkJCW5waHktPmNsYXNzaWZpZXJfc3RhdGUgPSBiNDNfbnBoeV9jbGFzc2lmaWVyKGRldiwgMCwgMCk7Ci0JCQliNDNfbnBoeV9jbGFzc2lmaWVyKGRldiwgMHg3LCAwKTsKLQkJCWI0M19ucGh5X3JlYWRfY2xpcF9kZXRlY3Rpb24oZGV2LCBucGh5LT5jbGlwX3N0YXRlKTsKLQkJCWI0M19ucGh5X3dyaXRlX2NsaXBfZGV0ZWN0aW9uKGRldiwgY2xpcCk7Ci0JCX0KLQkJYjQzX25waHlfcmVzZXRfY2NhKGRldik7Ci0JfSBlbHNlIHsKLQkJaWYgKC0tbnBoeS0+ZGVhZl9jb3VudCA9PSAwKSB7Ci0JCQliNDNfbnBoeV9jbGFzc2lmaWVyKGRldiwgMHg3LCBucGh5LT5jbGFzc2lmaWVyX3N0YXRlKTsKLQkJCWI0M19ucGh5X3dyaXRlX2NsaXBfZGV0ZWN0aW9uKGRldiwgbnBoeS0+Y2xpcF9zdGF0ZSk7Ci0JCX0KLQl9Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vc3RvcC1wbGF5YmFjayAqLwotc3RhdGljIHZvaWQgYjQzX25waHlfc3RvcF9wbGF5YmFjayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IGRldi0+cGh5Lm47Ci0JdTE2IHRtcDsKLQotCWlmIChucGh5LT5oYW5nX2F2b2lkKQotCQliNDNfbnBoeV9zdGF5X2luX2NhcnJpZXJfc2VhcmNoKGRldiwgMSk7Ci0KLQl0bXAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9TQU1QX1NUQVQpOwotCWlmICh0bXAgJiAweDEpCi0JCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfU0FNUF9DTUQsIEI0M19OUEhZX1NBTVBfQ01EX1NUT1ApOwotCWVsc2UgaWYgKHRtcCAmIDB4MikKLQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfSVFMT0NBTF9DTURHQ1RMLCAweDdGRkYpOwotCi0JYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfU0FNUF9DTUQsIH4weDAwMDQpOwotCi0JaWYgKG5waHktPmJiX211bHRfc2F2ZSAmIDB4ODAwMDAwMDApIHsKLQkJdG1wID0gbnBoeS0+YmJfbXVsdF9zYXZlICYgMHhGRkZGOwotCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoMTUsIDg3KSwgdG1wKTsKLQkJbnBoeS0+YmJfbXVsdF9zYXZlID0gMDsKLQl9Ci0KLQlpZiAobnBoeS0+aGFuZ19hdm9pZCkKLQkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIDApOwotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1NwdXJXYXIgKi8KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3NwdXJfd29ya2Fyb3VuZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IGRldi0+cGh5Lm47Ci0KLQl1OCBjaGFubmVsID0gZGV2LT5waHkuY2hhbm5lbDsKLQlpbnQgdG9uZVsyXSA9IHsgNTcsIDU4IH07Ci0JdTMyIG5vaXNlWzJdID0geyAweDNGRiwgMHgzRkYgfTsKLQotCUI0M19XQVJOX09OKGRldi0+cGh5LnJldiA8IDMpOwotCi0JaWYgKG5waHktPmhhbmdfYXZvaWQpCi0JCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCAxKTsKLQotCWlmIChucGh5LT5nYmFuZF9zcHVyd2FyX2VuKSB7Ci0JCS8qIFRPRE86IE4gUEhZIEFkanVzdCBBbmFsb2cgUGZidyAoNykgKi8KLQkJaWYgKGNoYW5uZWwgPT0gMTEgJiYgZGV2LT5waHkuaXNfNDBtaHopCi0JCQk7IC8qIFRPRE86IE4gUEhZIEFkanVzdCBNaW4gTm9pc2UgVmFyKDIsIHRvbmUsIG5vaXNlKSovCi0JCWVsc2UKLQkJCTsgLyogVE9ETzogTiBQSFkgQWRqdXN0IE1pbiBOb2lzZSBWYXIoMCwgTlVMTCwgTlVMTCkqLwotCQkvKiBUT0RPOiBOIFBIWSBBZGp1c3QgQ1JTIE1pbiBQb3dlciAoMHgxRSkgKi8KLQl9Ci0KLQlpZiAobnBoeS0+YWJhbmRfc3B1cndhcl9lbikgewotCQlpZiAoY2hhbm5lbCA9PSA1NCkgewotCQkJdG9uZVswXSA9IDB4MjA7Ci0JCQlub2lzZVswXSA9IDB4MjVGOwotCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMzggfHwgY2hhbm5lbCA9PSAxMDIgfHwgY2hhbm5lbCA9PSAxMTgpIHsKLQkJCWlmICgwIC8qIEZJWE1FICovKSB7Ci0JCQkJdG9uZVswXSA9IDB4MjA7Ci0JCQkJbm9pc2VbMF0gPSAweDIxRjsKLQkJCX0gZWxzZSB7Ci0JCQkJdG9uZVswXSA9IDA7Ci0JCQkJbm9pc2VbMF0gPSAwOwotCQkJfQotCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMTM0KSB7Ci0JCQl0b25lWzBdID0gMHgyMDsKLQkJCW5vaXNlWzBdID0gMHgyMUY7Ci0JCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSAxNTEpIHsKLQkJCXRvbmVbMF0gPSAweDEwOwotCQkJbm9pc2VbMF0gPSAweDIzRjsKLQkJfSBlbHNlIGlmIChjaGFubmVsID09IDE1MyB8fCBjaGFubmVsID09IDE2MSkgewotCQkJdG9uZVswXSA9IDB4MzA7Ci0JCQlub2lzZVswXSA9IDB4MjNGOwotCQl9IGVsc2UgewotCQkJdG9uZVswXSA9IDA7Ci0JCQlub2lzZVswXSA9IDA7Ci0JCX0KLQotCQlpZiAoIXRvbmVbMF0gJiYgIW5vaXNlWzBdKQotCQkJOyAvKiBUT0RPOiBOIFBIWSBBZGp1c3QgTWluIE5vaXNlIFZhcigxLCB0b25lLCBub2lzZSkqLwotCQllbHNlCi0JCQk7IC8qIFRPRE86IE4gUEhZIEFkanVzdCBNaW4gTm9pc2UgVmFyKDAsIE5VTEwsIE5VTEwpKi8KLQl9Ci0KLQlpZiAobnBoeS0+aGFuZ19hdm9pZCkKLQkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIDApOwotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL0FkanVzdExuYUdhaW5UYmwgKi8KLXN0YXRpYyB2b2lkIGI0M19ucGh5X2FkanVzdF9sbmFfZ2Fpbl90YWJsZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IGRldi0+cGh5Lm47Ci0KLQl1OCBpOwotCXMxNiB0bXA7Ci0JdTE2IGRhdGFbNF07Ci0JczE2IGdhaW5bMl07Ci0JdTE2IG1pbm1heFsyXTsKLQlzdGF0aWMgY29uc3QgdTE2IGxuYV9nYWluWzRdID0geyAtMiwgMTAsIDE5LCAyNSB9OwotCi0JaWYgKG5waHktPmhhbmdfYXZvaWQpCi0JCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCAxKTsKLQotCWlmIChucGh5LT5nYWluX2Jvb3N0KSB7Ci0JCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKLQkJCWdhaW5bMF0gPSA2OwotCQkJZ2FpblsxXSA9IDY7Ci0JCX0gZWxzZSB7Ci0JCQl0bXAgPSA0MDM3MCAtIDMxNSAqIGRldi0+cGh5LmNoYW5uZWw7Ci0JCQlnYWluWzBdID0gKCh0bXAgPj4gMTMpICsgKCh0bXAgPj4gMTIpICYgMSkpOwotCQkJdG1wID0gMjMyNDIgLSAyMjQgKiBkZXYtPnBoeS5jaGFubmVsOwotCQkJZ2FpblsxXSA9ICgodG1wID4+IDEzKSArICgodG1wID4+IDEyKSAmIDEpKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWdhaW5bMF0gPSAwOwotCQlnYWluWzFdID0gMDsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCWlmIChucGh5LT5lbG5hX2dhaW5fY29uZmlnKSB7Ci0JCQlkYXRhWzBdID0gMTkgKyBnYWluW2ldOwotCQkJZGF0YVsxXSA9IDI1ICsgZ2FpbltpXTsKLQkJCWRhdGFbMl0gPSAyNSArIGdhaW5baV07Ci0JCQlkYXRhWzNdID0gMjUgKyBnYWluW2ldOwotCQl9IGVsc2UgewotCQkJZGF0YVswXSA9IGxuYV9nYWluWzBdICsgZ2FpbltpXTsKLQkJCWRhdGFbMV0gPSBsbmFfZ2FpblsxXSArIGdhaW5baV07Ci0JCQlkYXRhWzJdID0gbG5hX2dhaW5bMl0gKyBnYWluW2ldOwotCQkJZGF0YVszXSA9IGxuYV9nYWluWzNdICsgZ2FpbltpXTsKLQkJfQotCQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUIxNihpLCA4KSwgNCwgZGF0YSk7Ci0KLQkJbWlubWF4W2ldID0gMjMgKyBnYWluW2ldOwotCX0KLQotCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MxX01JTk1BWF9HQUlOLCB+QjQzX05QSFlfQzFfTUlOR0FJTiwKLQkJCQltaW5tYXhbMF0gPDwgQjQzX05QSFlfQzFfTUlOR0FJTl9TSElGVCk7Ci0JYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzJfTUlOTUFYX0dBSU4sIH5CNDNfTlBIWV9DMl9NSU5HQUlOLAotCQkJCW1pbm1heFsxXSA8PCBCNDNfTlBIWV9DMl9NSU5HQUlOX1NISUZUKTsKLQotCWlmIChucGh5LT5oYW5nX2F2b2lkKQotCQliNDNfbnBoeV9zdGF5X2luX2NhcnJpZXJfc2VhcmNoKGRldiwgMCk7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vV29ya2Fyb3VuZHNHYWluQ3RybCAqLwotc3RhdGljIHZvaWQgYjQzX25waHlfZ2Fpbl9jdHJsX3dvcmthcm91bmRzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gZGV2LT5waHkubjsKLQlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207Ci0KLQkvKiBQSFkgcmV2IDAsIDEsIDIgKi8KLQl1OCBpLCBqOwotCXU4IGNvZGU7Ci0JdTE2IHRtcDsKLQl1OCByZnNlcV9ldmVudHNbM10gPSB7IDYsIDgsIDcgfTsKLQl1OCByZnNlcV9kZWxheXNbM10gPSB7IDEwLCAzMCwgMSB9OwotCi0JLyogUEhZIHJldiA+PSAzICovCi0JYm9vbCBnaHo1OwotCWJvb2wgZXh0X2xuYTsKLQl1MTYgcnNzaV9nYWluOwotCXN0cnVjdCBucGh5X2dhaW5fY3RsX3dvcmthcm91bmRfZW50cnkgKmU7Ci0JdTggbHBmX2dhaW5bNl0gPSB7IDB4MDAsIDB4MDYsIDB4MEMsIDB4MTIsIDB4MTIsIDB4MTIgfTsKLQl1OCBscGZfYml0c1s2XSA9IHsgMCwgMSwgMiwgMywgMywgMyB9OwotCi0JaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7Ci0JCS8qIFByZXBhcmUgdmFsdWVzICovCi0JCWdoejUgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9CQU5EQ1RMKQotCQkJJiBCNDNfTlBIWV9CQU5EQ1RMXzVHSFo7Ci0JCWV4dF9sbmEgPSBzcHJvbS0+Ym9hcmRmbGFnc19sbyAmIEI0M19CRkxfRVhUTE5BOwotCQllID0gYjQzX25waHlfZ2V0X2dhaW5fY3RsX3dvcmthcm91bmRfZW50KGRldiwgZ2h6NSwgZXh0X2xuYSk7Ci0JCWlmIChnaHo1ICYmIGRldi0+cGh5LnJldiA+PSA1KQotCQkJcnNzaV9nYWluID0gMHg5MDsKLQkJZWxzZQotCQkJcnNzaV9nYWluID0gMHg1MDsKLQotCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JYQ1RMLCAweDAwNDApOwotCi0JCS8qIFNldCBDbGlwIDIgZGV0ZWN0ICovCi0JCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQzFfQ0dBSU5JLAotCQkJCUI0M19OUEhZX0MxX0NHQUlOSV9DTDJERVRFQ1QpOwotCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX0MyX0NHQUlOSSwKLQkJCQlCNDNfTlBIWV9DMl9DR0FJTklfQ0wyREVURUNUKTsKLQotCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDAgfCBCMjA1Nl9SWF9CSUFTUE9MRV9MTkFHMV9JREFDLAotCQkJCTB4MTcpOwotCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9CSUFTUE9MRV9MTkFHMV9JREFDLAotCQkJCTB4MTcpOwotCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDAgfCBCMjA1Nl9SWF9MTkFHMl9JREFDLCAweEYwKTsKLQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgxIHwgQjIwNTZfUlhfTE5BRzJfSURBQywgMHhGMCk7Ci0JCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX1JTU0lfUE9MRSwgMHgwMCk7Ci0JCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMSB8IEIyMDU2X1JYX1JTU0lfUE9MRSwgMHgwMCk7Ci0JCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX1JTU0lfR0FJTiwKLQkJCQlyc3NpX2dhaW4pOwotCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9SU1NJX0dBSU4sCi0JCQkJcnNzaV9nYWluKTsKLQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgwIHwgQjIwNTZfUlhfQklBU1BPTEVfTE5BQTFfSURBQywKLQkJCQkweDE3KTsKLQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgxIHwgQjIwNTZfUlhfQklBU1BPTEVfTE5BQTFfSURBQywKLQkJCQkweDE3KTsKLQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgwIHwgQjIwNTZfUlhfTE5BQTJfSURBQywgMHhGRik7Ci0JCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMSB8IEIyMDU2X1JYX0xOQUEyX0lEQUMsIDB4RkYpOwotCi0JCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoMCwgOCksIDQsIGUtPmxuYTFfZ2Fpbik7Ci0JCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoMSwgOCksIDQsIGUtPmxuYTFfZ2Fpbik7Ci0JCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoMCwgMTYpLCA0LCBlLT5sbmEyX2dhaW4pOwotCQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUI4KDEsIDE2KSwgNCwgZS0+bG5hMl9nYWluKTsKLQkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCOCgwLCAzMiksIDEwLCBlLT5nYWluX2RiKTsKLQkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCOCgxLCAzMiksIDEwLCBlLT5nYWluX2RiKTsKLQkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCOCgyLCAzMiksIDEwLCBlLT5nYWluX2JpdHMpOwotCQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUI4KDMsIDMyKSwgMTAsIGUtPmdhaW5fYml0cyk7Ci0JCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoMCwgMHg0MCksIDYsIGxwZl9nYWluKTsKLQkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCOCgxLCAweDQwKSwgNiwgbHBmX2dhaW4pOwotCQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUI4KDIsIDB4NDApLCA2LCBscGZfYml0cyk7Ci0JCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoMywgMHg0MCksIDYsIGxwZl9iaXRzKTsKLQotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzFfSU5JVEdBSU4sIGUtPmluaXRfZ2Fpbik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDJBNywgZS0+aW5pdF9nYWluKTsKLQkJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMTYoNywgMHgxMDYpLCAyLAotCQkJCQllLT5yZnNlcV9pbml0KTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MxX0lOSVRHQUlOLCBlLT5pbml0X2dhaW4pOwotCi0JCS8qIFRPRE86IGNoZWNrIGRlZmluZXMuIERvIG5vdCBtYXRjaCB2YXJpYWJsZXMgbmFtZXMgKi8KLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MxX0NMSVAxX01FREdBSU4sIGUtPmNsaXBoaV9nYWluKTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIDB4MkE5LCBlLT5jbGlwaGlfZ2Fpbik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMV9DTElQMl9HQUlOLCBlLT5jbGlwbWRfZ2Fpbik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDJBQiwgZS0+Y2xpcG1kX2dhaW4pOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzJfQ0xJUDFfSElHQUlOLCBlLT5jbGlwbG9fZ2Fpbik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCAweDJBRCwgZS0+Y2xpcGxvX2dhaW4pOwotCi0JCWI0M19waHlfbWFza3NldChkZXYsIDB4MjdELCAweEZGMDAsIGUtPmNyc21pbik7Ci0JCWI0M19waHlfbWFza3NldChkZXYsIDB4MjgwLCAweEZGMDAsIGUtPmNyc21pbmwpOwotCQliNDNfcGh5X21hc2tzZXQoZGV2LCAweDI4MywgMHhGRjAwLCBlLT5jcnNtaW51KTsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MxX05CQ0xJUFRIUkVTLCBlLT5uYmNsaXApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzJfTkJDTElQVEhSRVMsIGUtPm5iY2xpcCk7Ci0JCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MxX0NMSVBXQlRIUkVTLAotCQkJCX5CNDNfTlBIWV9DMV9DTElQV0JUSFJFU19DTElQMiwgZS0+d2xjbGlwKTsKLQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzJfQ0xJUFdCVEhSRVMsCi0JCQkJfkI0M19OUEhZX0MyX0NMSVBXQlRIUkVTX0NMSVAyLCBlLT53bGNsaXApOwotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQ0NLX1NISUZUQl9SRUYsIDB4ODA5Qyk7Ci0JfSBlbHNlIHsKLQkJLyogU2V0IENsaXAgMiBkZXRlY3QgKi8KLQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9DMV9DR0FJTkksCi0JCQkJQjQzX05QSFlfQzFfQ0dBSU5JX0NMMkRFVEVDVCk7Ci0JCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQzJfQ0dBSU5JLAotCQkJCUI0M19OUEhZX0MyX0NHQUlOSV9DTDJERVRFQ1QpOwotCi0JCS8qIFNldCBuYXJyb3diYW5kIGNsaXAgdGhyZXNob2xkICovCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMV9OQkNMSVBUSFJFUywgMHg4NCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMl9OQkNMSVBUSFJFUywgMHg4NCk7Ci0KLQkJaWYgKCFkZXYtPnBoeS5pc180MG1oeikgewotCQkJLyogU2V0IGR3ZWxsIGxlbmd0aHMgKi8KLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DTElQMV9OQkRXRUxMX0xFTiwgMHgwMDJCKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DTElQMl9OQkRXRUxMX0xFTiwgMHgwMDJCKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9XMUNMSVAxX0RXRUxMX0xFTiwgMHgwMDA5KTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9XMUNMSVAyX0RXRUxMX0xFTiwgMHgwMDA5KTsKLQkJfQotCi0JCS8qIFNldCB3aWRlYmFuZCBjbGlwIDIgdGhyZXNob2xkICovCi0JCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MxX0NMSVBXQlRIUkVTLAotCQkJCX5CNDNfTlBIWV9DMV9DTElQV0JUSFJFU19DTElQMiwKLQkJCQkyMSk7Ci0JCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MyX0NMSVBXQlRIUkVTLAotCQkJCX5CNDNfTlBIWV9DMl9DTElQV0JUSFJFU19DTElQMiwKLQkJCQkyMSk7Ci0KLQkJaWYgKCFkZXYtPnBoeS5pc180MG1oeikgewotCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzFfQ0dBSU5JLAotCQkJCX5CNDNfTlBIWV9DMV9DR0FJTklfR0FJTkJLT0ZGLCAweDEpOwotCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzJfQ0dBSU5JLAotCQkJCX5CNDNfTlBIWV9DMl9DR0FJTklfR0FJTkJLT0ZGLCAweDEpOwotCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzFfQ0NLX0NHQUlOSSwKLQkJCQl+QjQzX05QSFlfQzFfQ0NLX0NHQUlOSV9HQUlOQktPRkYsIDB4MSk7Ci0JCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMl9DQ0tfQ0dBSU5JLAotCQkJCX5CNDNfTlBIWV9DMl9DQ0tfQ0dBSU5JX0dBSU5CS09GRiwgMHgxKTsKLQkJfQotCi0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DQ0tfU0hJRlRCX1JFRiwgMHg4MDlDKTsKLQotCQlpZiAobnBoeS0+Z2Fpbl9ib29zdCkgewotCQkJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfMkdIWiAmJgotCQkJICAgIGRldi0+cGh5LmlzXzQwbWh6KQotCQkJCWNvZGUgPSA0OwotCQkJZWxzZQotCQkJCWNvZGUgPSA1OwotCQl9IGVsc2UgewotCQkJY29kZSA9IGRldi0+cGh5LmlzXzQwbWh6ID8gNiA6IDc7Ci0JCX0KLQotCQkvKiBTZXQgSFBWR0EyIGluZGV4ICovCi0JCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MxX0lOSVRHQUlOLAotCQkJCX5CNDNfTlBIWV9DMV9JTklUR0FJTl9IUFZHQTIsCi0JCQkJY29kZSA8PCBCNDNfTlBIWV9DMV9JTklUR0FJTl9IUFZHQTJfU0hJRlQpOwotCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMl9JTklUR0FJTiwKLQkJCQl+QjQzX05QSFlfQzJfSU5JVEdBSU5fSFBWR0EyLAotCQkJCWNvZGUgPDwgQjQzX05QSFlfQzJfSU5JVEdBSU5fSFBWR0EyX1NISUZUKTsKLQotCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfQUREUiwgMHgxRDA2KTsKLQkJLyogc3BlY3Mgc2F5IGFib3V0IDIgbG9vcHMsIGJ1dCB3bCBkb2VzIDQgKi8KLQkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8sCi0JCQkJCQkJKGNvZGUgPDwgOCB8IDB4N0MpKTsKLQotCQliNDNfbnBoeV9hZGp1c3RfbG5hX2dhaW5fdGFibGUoZGV2KTsKLQotCQlpZiAobnBoeS0+ZWxuYV9nYWluX2NvbmZpZykgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0FERFIsIDB4MDgwOCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDApOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFMTywgMHgxKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8sIDB4MSk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDEpOwotCi0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfQUREUiwgMHgwQzA4KTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8sIDB4MCk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDEpOwotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFMTywgMHgxKTsKLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8sIDB4MSk7Ci0KLQkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLCAweDFEMDYpOwotCQkJLyogc3BlY3Mgc2F5IGFib3V0IDIgbG9vcHMsIGJ1dCB3bCBkb2VzIDQgKi8KLQkJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCi0JCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFMTywKLQkJCQkJCQkoY29kZSA8PCA4IHwgMHg3NCkpOwotCQl9Ci0KLQkJaWYgKGRldi0+cGh5LnJldiA9PSAyKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0FERFIsCi0JCQkJCQkoMHgwNDAwICogaSkgKyAweDAwMjApOwotCQkJCWZvciAoaiA9IDA7IGogPCAyMTsgaisrKSB7Ci0JCQkJCXRtcCA9IGogKiAoaSA8IDIgPyAzIDogMSk7Ci0JCQkJCWI0M19waHlfd3JpdGUoZGV2LAotCQkJCQkJQjQzX05QSFlfVEFCTEVfREFUQUxPLCB0bXApOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShkZXYsIDUsCi0JCQkJcmZzZXFfZXZlbnRzLCByZnNlcV9kZWxheXMsIDMpOwotCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9PVkVSX0RHQUlOMSwKLQkJCX5CNDNfTlBIWV9PVkVSX0RHQUlOX0NDS0RHRUNWICYgMHhGRkZGLAotCQkJMHg1QSA8PCBCNDNfTlBIWV9PVkVSX0RHQUlOX0NDS0RHRUNWX1NISUZUKTsKLQotCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKQotCQkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX1BIWV9OKDB4QzVEKSwKLQkJCQkJMHhGRjgwLCA0KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3dvcmthcm91bmRzX3JldjNwbHVzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gZGV2LT5waHkubjsKLQlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207Ci0KLQkvKiBUWCB0byBSWCAqLwotCXU4IHR4MnJ4X2V2ZW50c1s5XSA9IHsgMHg0LCAweDMsIDB4NiwgMHg1LCAweDIsIDB4MSwgMHg4LCAweDFGIH07Ci0JdTggdHgycnhfZGVsYXlzWzldID0geyA4LCA0LCAyLCAyLCA0LCA0LCA2LCAxIH07Ci0JLyogUlggdG8gVFggKi8KLQl1OCByeDJ0eF9ldmVudHNfaXBhWzldID0geyAweDAsIDB4MSwgMHgyLCAweDgsIDB4NSwgMHg2LCAweEYsIDB4MywKLQkJCQkJMHgxRiB9OwotCXU4IHJ4MnR4X2RlbGF5c19pcGFbOV0gPSB7IDgsIDYsIDYsIDQsIDQsIDE2LCA0MywgMSwgMSB9OwotCXU4IHJ4MnR4X2V2ZW50c1s5XSA9IHsgMHgwLCAweDEsIDB4MiwgMHg4LCAweDUsIDB4NiwgMHgzLCAweDQsIDB4MUYgfTsKLQl1OCByeDJ0eF9kZWxheXNbOV0gPSB7IDgsIDYsIDYsIDQsIDQsIDE4LCA0MiwgMSwgMSB9OwotCi0JdTE2IHRtcDE2OwotCXUzMiB0bXAzMjsKLQotCXRtcDMyID0gYjQzX250YWJfcmVhZChkZXYsIEI0M19OVEFCMzIoMzAsIDApKTsKLQl0bXAzMiAmPSAweGZmZmZmZjsKLQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMzIoMzAsIDApLCB0bXAzMik7Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9BMCwgMHgwMTI1KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9BMSwgMHgwMUIzKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9BMiwgMHgwMTA1KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9CMCwgMHgwMTZFKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9CMSwgMHgwMENEKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9CMiwgMHgwMDIwKTsKLQotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMl9DTElQMV9NRURHQUlOLCAweDAwMEMpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDJBRSwgMHgwMDBDKTsKLQotCS8qIFRYIHRvIFJYICovCi0JYjQzX25waHlfc2V0X3JmX3NlcXVlbmNlKGRldiwgMSwgdHgycnhfZXZlbnRzLCB0eDJyeF9kZWxheXMsIDkpOwotCi0JLyogUlggdG8gVFggKi8KLQlpZiAoYjQzX25waHlfaXBhKGRldikpCi0JCWI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShkZXYsIDEsIHJ4MnR4X2V2ZW50c19pcGEsCi0JCQkJCSByeDJ0eF9kZWxheXNfaXBhLCA5KTsKLQlpZiAobnBoeS0+aHdfcGh5cnhjaGFpbiAhPSAzICYmCi0JICAgIG5waHktPmh3X3BoeXJ4Y2hhaW4gIT0gbnBoeS0+aHdfcGh5dHhjaGFpbikgewotCQlpZiAoYjQzX25waHlfaXBhKGRldikpIHsKLQkJCXJ4MnR4X2RlbGF5c1s1XSA9IDU5OwotCQkJcngydHhfZGVsYXlzWzZdID0gMTsKLQkJCXJ4MnR4X2V2ZW50c1s3XSA9IDB4MUY7Ci0JCX0KLQkJYjQzX25waHlfc2V0X3JmX3NlcXVlbmNlKGRldiwgMSwgcngydHhfZXZlbnRzLCByeDJ0eF9kZWxheXMsIDkpOwotCX0KLQotCXRtcDE2ID0gKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgPwotCQkweDIgOiAweDlDNDA7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0VORFJPUF9UTEVOLCB0bXAxNik7Ci0KLQliNDNfcGh5X21hc2tzZXQoZGV2LCAweDI5NCwgMHhGMEZGLCAweDA3MDApOwotCi0JYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjMyKDE2LCAzKSwgMHgxOEQpOwotCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIzMigxNiwgMTI3KSwgMHgxOEQpOwotCi0JYjQzX25waHlfZ2Fpbl9jdHJsX3dvcmthcm91bmRzKGRldik7Ci0KLQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMzIoOCwgMCksIDIpOwotCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIzMig4LCAxNiksIDIpOwotCi0JLyogVE9ETyAqLwotCi0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgwIHwgQjIwNTZfUlhfTUlYQV9NQVNUX0JJQVMsIDB4MDApOwotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMSB8IEIyMDU2X1JYX01JWEFfTUFTVF9CSUFTLCAweDAwKTsKLQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDAgfCBCMjA1Nl9SWF9NSVhBX0JJQVNfTUFJTiwgMHgwNik7Ci0JYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgxIHwgQjIwNTZfUlhfTUlYQV9CSUFTX01BSU4sIDB4MDYpOwotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX01JWEFfQklBU19BVVgsIDB4MDcpOwotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMSB8IEIyMDU2X1JYX01JWEFfQklBU19BVVgsIDB4MDcpOwotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX01JWEFfTE9CX0JJQVMsIDB4ODgpOwotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMSB8IEIyMDU2X1JYX01JWEFfTE9CX0JJQVMsIDB4ODgpOwotCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX01JWEdfQ01GQl9JREFDLCAweDAwKTsKLQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9NSVhHX0NNRkJfSURBQywgMHgwMCk7Ci0KLQkvKiBOIFBIWSBXQVIgVFggQ2hhaW4gVXBkYXRlIHdpdGggaHdfcGh5dHhjaGFpbiBhcyBhcmd1bWVudCAqLwotCi0JaWYgKChzcHJvbS0+Ym9hcmRmbGFnczJfbG8gJiBCNDNfQkZMMl9BUExMX1dBUiAmJgotCSAgICAgYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKSB8fAotCSAgICAoc3Byb20tPmJvYXJkZmxhZ3MyX2xvICYgQjQzX0JGTDJfR1BMTF9XQVIgJiYKLQkgICAgIGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikpCi0JCXRtcDMyID0gMHgwMDA4ODg4ODsKLQllbHNlCi0JCXRtcDMyID0gMHg4ODg4ODg4ODsKLQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMzIoMzAsIDEpLCB0bXAzMik7Ci0JYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjMyKDMwLCAyKSwgdG1wMzIpOwotCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIzMigzMCwgMyksIHRtcDMyKTsKLQotCWlmIChkZXYtPnBoeS5yZXYgPT0gNCAmJgotCQliNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKLQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfVFgwIHwgQjIwNTZfVFhfR01CQl9JREFDLAotCQkJCTB4NzApOwotCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9UWDEgfCBCMjA1Nl9UWF9HTUJCX0lEQUMsCi0JCQkJMHg3MCk7Ci0JfQotCi0JYjQzX3BoeV93cml0ZShkZXYsIDB4MjI0LCAweDAzOUMpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDIyNSwgMHgwMzU3KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgyMjYsIDB4MDMxNyk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MjI3LCAweDAyRDcpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDIyOCwgMHgwMzlDKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgyMjksIDB4MDM1Nyk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MjJBLCAweDAzMTcpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDIyQiwgMHgwMkQ3KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgyMkMsIDB4MDM5Qyk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIDB4MjJELCAweDAzNTcpOwotCWI0M19waHlfd3JpdGUoZGV2LCAweDIyRSwgMHgwMzE3KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgMHgyMkYsIDB4MDJENyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3dvcmthcm91bmRzX3JldjFfMihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCi17Ci0Jc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOwotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0Jc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IHBoeS0+bjsKLQotCXU4IGV2ZW50czFbN10gPSB7IDB4MCwgMHgxLCAweDIsIDB4OCwgMHg0LCAweDUsIDB4MyB9OwotCXU4IGRlbGF5czFbN10gPSB7IDB4OCwgMHg2LCAweDYsIDB4MiwgMHg0LCAweDNDLCAweDEgfTsKLQotCXU4IGV2ZW50czJbN10gPSB7IDB4MCwgMHgzLCAweDUsIDB4NCwgMHgyLCAweDEsIDB4OCB9OwotCXU4IGRlbGF5czJbN10gPSB7IDB4OCwgMHg2LCAweDIsIDB4NCwgMHg0LCAweDYsIDB4MSB9OwotCi0JaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfNUdIWiAmJgotCSAgICBucGh5LT5iYW5kNWdfcHdyZ2FpbikgewotCQliNDNfcmFkaW9fbWFzayhkZXYsIEIyMDU1X0MxX1RYX1JGX1NQQVJFLCB+MHg4KTsKLQkJYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1NV9DMl9UWF9SRl9TUEFSRSwgfjB4OCk7Ci0JfSBlbHNlIHsKLQkJYjQzX3JhZGlvX3NldChkZXYsIEIyMDU1X0MxX1RYX1JGX1NQQVJFLCAweDgpOwotCQliNDNfcmFkaW9fc2V0KGRldiwgQjIwNTVfQzJfVFhfUkZfU1BBUkUsIDB4OCk7Ci0JfQotCi0JYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MDApLCAweDAwMEEpOwotCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDEwKSwgMHgwMDBBKTsKLQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgwMiksIDB4Q0RBQSk7Ci0JYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTIpLCAweENEQUEpOwotCi0JaWYgKGRldi0+cGh5LnJldiA8IDIpIHsKLQkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MDgpLCAweDAwMDApOwotCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgxOCksIDB4MDAwMCk7Ci0JCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDA3KSwgMHg3QUFCKTsKLQkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTcpLCAweDdBQUIpOwotCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgwNiksIDB4MDgwMCk7Ci0JCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDE2KSwgMHgwODAwKTsKLQl9Ci0KLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfTE8xLCAweDJEOCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX1VQMSwgMHgzMDEpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19MTzIsIDB4MkQ4KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVAyLCAweDMwMSk7Ci0KLQlpZiAoc3Byb20tPmJvYXJkZmxhZ3MyX2xvICYgQjQzX0JGTDJfU0tXUktGRU1fQlJEICYmCi0JICAgIGRldi0+ZGV2LT5ib2FyZF90eXBlID09IDB4OEIpIHsKLQkJZGVsYXlzMVswXSA9IDB4MTsKLQkJZGVsYXlzMVs1XSA9IDB4MTQ7Ci0JfQotCWI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShkZXYsIDAsIGV2ZW50czEsIGRlbGF5czEsIDcpOwotCWI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShkZXYsIDEsIGV2ZW50czIsIGRlbGF5czIsIDcpOwotCi0JYjQzX25waHlfZ2Fpbl9jdHJsX3dvcmthcm91bmRzKGRldik7Ci0KLQlpZiAoZGV2LT5waHkucmV2IDwgMikgewotCQlpZiAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUlhDVEwpICYgMHgyKQotCQkJYjQzX2hmX3dyaXRlKGRldiwgYjQzX2hmX3JlYWQoZGV2KSB8Ci0JCQkJCUI0M19IRl9NTEFEVlcpOwotCX0gZWxzZSBpZiAoZGV2LT5waHkucmV2ID09IDIpIHsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0NSU0NIRUNLMiwgMCk7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DUlNDSEVDSzMsIDApOwotCX0KLQotCWlmIChkZXYtPnBoeS5yZXYgPCAyKQotCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9TQ1JBTV9TSUdDVEwsCi0JCQkJfkI0M19OUEhZX1NDUkFNX1NJR0NUTF9TQ00pOwotCi0JLyogU2V0IHBoYXNlIHRyYWNrIGFscGhhIGFuZCBiZXRhICovCi0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BIQVNFVFJfQTAsIDB4MTI1KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9BMSwgMHgxQjMpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0EyLCAweDEwNSk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BIQVNFVFJfQjAsIDB4MTZFKTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9CMSwgMHhDRCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BIQVNFVFJfQjIsIDB4MjApOwotCi0JYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUElMX0RXMSwKLQkJCX5CNDNfTlBIWV9QSUxfRFdfNjRRQU0gJiAweEZGRkYpOwotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UWEZfMjBDT19TMkIxLCAweEI1KTsKLQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVFhGXzIwQ09fUzJCMiwgMHhBNCk7Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RYRl8yMENPX1MyQjMsIDB4MDApOwotCi0JaWYgKGRldi0+cGh5LnJldiA9PSAyKQotCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX0ZJTkVSWDJfQ0dDLAotCQkJCUI0M19OUEhZX0ZJTkVSWDJfQ0dDX0RFQ0dDKTsKLX0KLQotLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9Xb3JrYXJvdW5kcyAqLwotc3RhdGljIHZvaWQgYjQzX25waHlfd29ya2Fyb3VuZHMoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7Ci0Jc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IHBoeS0+bjsKLQotCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCWI0M19ucGh5X2NsYXNzaWZpZXIoZGV2LCAxLCAwKTsKLQllbHNlCi0JCWI0M19ucGh5X2NsYXNzaWZpZXIoZGV2LCAxLCAxKTsKLQotCWlmIChucGh5LT5oYW5nX2F2b2lkKQotCQliNDNfbnBoeV9zdGF5X2luX2NhcnJpZXJfc2VhcmNoKGRldiwgMSk7Ci0KLQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX0lRRkxJUCwKLQkJICAgIEI0M19OUEhZX0lRRkxJUF9BREMxIHwgQjQzX05QSFlfSVFGTElQX0FEQzIpOwotCi0JaWYgKGRldi0+cGh5LnJldiA+PSAzKQotCQliNDNfbnBoeV93b3JrYXJvdW5kc19yZXYzcGx1cyhkZXYpOwotCWVsc2UKLQkJYjQzX25waHlfd29ya2Fyb3VuZHNfcmV2MV8yKGRldik7Ci0KLQlpZiAobnBoeS0+aGFuZ19hdm9pZCkKLQkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIDApOwotfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTYW1wbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vTG9hZFNhbXBsZVRhYmxlICovCiBzdGF0aWMgaW50IGI0M19ucGh5X2xvYWRfc2FtcGxlcyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCkBAIC0xODI1LDcgKzk1Niw3IEBACiAJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfU0FNUF9DTUQsIDEpOwogCX0KIAlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKLQkJaWYgKGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1JGU0VRU1QpICYgMSkgeworCQlpZiAoIShiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9SRlNFUVNUKSAmIDEpKSB7CiAJCQlpID0gMDsKIAkJCWJyZWFrOwogCQl9CkBAIC0xODM3LDMzMyArOTY4LDkgQEAKIAliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZTRVFNT0RFLCBzZXFfbW9kZSk7CiB9CiAKLS8qCi0gKiBUcmFuc21pdHMgYSBrbm93biB2YWx1ZSBmb3IgTE8gY2FsaWJyYXRpb24KLSAqIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vVFhUb25lCi0gKi8KLXN0YXRpYyBpbnQgYjQzX25waHlfdHhfdG9uZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUzMiBmcmVxLCB1MTYgbWF4X3ZhbCwKLQkJCQlib29sIGlxbW9kZSwgYm9vbCBkYWNfdGVzdCkKLXsKLQl1MTYgc2FtcCA9IGI0M19ucGh5X2dlbl9sb2FkX3NhbXBsZXMoZGV2LCBmcmVxLCBtYXhfdmFsLCBkYWNfdGVzdCk7Ci0JaWYgKHNhbXAgPT0gMCkKLQkJcmV0dXJuIC0xOwotCWI0M19ucGh5X3J1bl9zYW1wbGVzKGRldiwgc2FtcCwgMHhGRkZGLCAwLCBpcW1vZGUsIGRhY190ZXN0KTsKLQlyZXR1cm4gMDsKLX0KLQotLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9UeFB3ckN0cmxDb2VmU2V0dXAgKi8KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3R4X3B3cl9jdHJsX2NvZWZfc2V0dXAoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBkZXYtPnBoeS5uOwotCWludCBpLCBqOwotCXUzMiB0bXA7Ci0JdTMyIGN1cl9yZWFsLCBjdXJfaW1hZywgcmVhbF9wYXJ0LCBpbWFnX3BhcnQ7Ci0KLQl1MTYgYnVmZmVyWzddOwotCi0JaWYgKG5waHktPmhhbmdfYXZvaWQpCi0JCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCB0cnVlKTsKLQotCWI0M19udGFiX3JlYWRfYnVsayhkZXYsIEI0M19OVEFCMTYoMTUsIDgwKSwgNywgYnVmZmVyKTsKLQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJdG1wID0gKChidWZmZXJbaSAqIDJdICYgMHgzRkYpIDw8IDEwKSB8Ci0JCQkoYnVmZmVyW2kgKiAyICsgMV0gJiAweDNGRik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLAotCQkJCSgoKGkgKyAyNikgPDwgMTApIHwgMzIwKSk7Ci0JCWZvciAoaiA9IDA7IGogPCAxMjg7IGorKykgewotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFISSwKLQkJCQkJKCh0bXAgPj4gMTYpICYgMHhGRkZGKSk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLAotCQkJCQkodG1wICYgMHhGRkZGKSk7Ci0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCXRtcCA9IGJ1ZmZlcls1ICsgaV07Ci0JCXJlYWxfcGFydCA9ICh0bXAgPj4gOCkgJiAweEZGOwotCQlpbWFnX3BhcnQgPSAodG1wICYgMHhGRik7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLAotCQkJCSgoKGkgKyAyNikgPDwgMTApIHwgNDQ4KSk7Ci0KLQkJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7Ci0JCQljdXJfcmVhbCA9IHJlYWxfcGFydDsKLQkJCWN1cl9pbWFnID0gaW1hZ19wYXJ0OwotCQkJdG1wID0gKChjdXJfcmVhbCAmIDB4RkYpIDw8IDgpIHwgKGN1cl9pbWFnICYgMHhGRik7Ci0JCX0KLQotCQlmb3IgKGogPSAwOyBqIDwgMTI4OyBqKyspIHsKLQkJCWlmIChkZXYtPnBoeS5yZXYgPCAzKSB7Ci0JCQkJY3VyX3JlYWwgPSAocmVhbF9wYXJ0ICogbG9zY2FsZVtqXSArIDEyOCkgPj4gODsKLQkJCQljdXJfaW1hZyA9IChpbWFnX3BhcnQgKiBsb3NjYWxlW2pdICsgMTI4KSA+PiA4OwotCQkJCXRtcCA9ICgoY3VyX3JlYWwgJiAweEZGKSA8PCA4KSB8Ci0JCQkJCShjdXJfaW1hZyAmIDB4RkYpOwotCQkJfQotCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFISSwKLQkJCQkJKCh0bXAgPj4gMTYpICYgMHhGRkZGKSk7Ci0JCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLAotCQkJCQkodG1wICYgMHhGRkZGKSk7Ci0JCX0KLQl9Ci0KLQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKLQkJYjQzX3NobV93cml0ZTE2KGRldiwgQjQzX1NITV9TSEFSRUQsCi0JCQkJQjQzX1NITV9TSF9OUEhZX1RYUFdSX0lORFgwLCAweEZGRkYpOwotCQliNDNfc2htX3dyaXRlMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwKLQkJCQlCNDNfU0hNX1NIX05QSFlfVFhQV1JfSU5EWDEsIDB4RkZGRik7Ci0JfQotCi0JaWYgKG5waHktPmhhbmdfYXZvaWQpCi0JCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCBmYWxzZSk7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vU2V0UmZTZXEgKi8KLXN0YXRpYyB2b2lkIGI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHU4IGNtZCwKLQkJCQkJdTggKmV2ZW50cywgdTggKmRlbGF5cywgdTggbGVuZ3RoKQotewotCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBkZXYtPnBoeS5uOwotCXU4IGk7Ci0JdTggZW5kID0gKGRldi0+cGh5LnJldiA+PSAzKSA/IDB4MUYgOiAweDBGOwotCXUxNiBvZmZzZXQxID0gY21kIDw8IDQ7Ci0JdTE2IG9mZnNldDIgPSBvZmZzZXQxICsgMHg4MDsKLQotCWlmIChucGh5LT5oYW5nX2F2b2lkKQotCQliNDNfbnBoeV9zdGF5X2luX2NhcnJpZXJfc2VhcmNoKGRldiwgdHJ1ZSk7Ci0KLQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUI4KDcsIG9mZnNldDEpLCBsZW5ndGgsIGV2ZW50cyk7Ci0JYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCOCg3LCBvZmZzZXQyKSwgbGVuZ3RoLCBkZWxheXMpOwotCi0JZm9yIChpID0gbGVuZ3RoOyBpIDwgMTY7IGkrKykgewotCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCOCg3LCBvZmZzZXQxICsgaSksIGVuZCk7Ci0JCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUI4KDcsIG9mZnNldDIgKyBpKSwgMSk7Ci0JfQotCi0JaWYgKG5waHktPmhhbmdfYXZvaWQpCi0JCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCBmYWxzZSk7Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vRm9yY2VSRlNlcSAqLwotc3RhdGljIHZvaWQgYjQzX25waHlfZm9yY2VfcmZfc2VxdWVuY2Uoc3RydWN0IGI0M193bGRldiAqZGV2LAotCQkJCSAgICAgICBlbnVtIGI0M19ucGh5X3JmX3NlcXVlbmNlIHNlcSkKLXsKLQlzdGF0aWMgY29uc3QgdTE2IHRyaWdnZXJbXSA9IHsKLQkJW0I0M19SRlNFUV9SWDJUWF0JCT0gQjQzX05QSFlfUkZTRVFUUl9SWDJUWCwKLQkJW0I0M19SRlNFUV9UWDJSWF0JCT0gQjQzX05QSFlfUkZTRVFUUl9UWDJSWCwKLQkJW0I0M19SRlNFUV9SRVNFVDJSWF0JCT0gQjQzX05QSFlfUkZTRVFUUl9SU1QyUlgsCi0JCVtCNDNfUkZTRVFfVVBEQVRFX0dBSU5IXQk9IEI0M19OUEhZX1JGU0VRVFJfVVBHSCwKLQkJW0I0M19SRlNFUV9VUERBVEVfR0FJTkxdCT0gQjQzX05QSFlfUkZTRVFUUl9VUEdMLAotCQlbQjQzX1JGU0VRX1VQREFURV9HQUlOVV0JPSBCNDNfTlBIWV9SRlNFUVRSX1VQR1UsCi0JfTsKLQlpbnQgaTsKLQl1MTYgc2VxX21vZGUgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9SRlNFUU1PREUpOwotCi0JQjQzX1dBUk5fT04oc2VxID49IEFSUkFZX1NJWkUodHJpZ2dlcikpOwotCi0JYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRlNFUU1PREUsCi0JCSAgICBCNDNfTlBIWV9SRlNFUU1PREVfQ0FPVkVSIHwgQjQzX05QSFlfUkZTRVFNT0RFX1RST1ZFUik7Ci0JYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRlNFUVRSLCB0cmlnZ2VyW3NlcV0pOwotCWZvciAoaSA9IDA7IGkgPCAyMDA7IGkrKykgewotCQlpZiAoIShiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9SRlNFUVNUKSAmIHRyaWdnZXJbc2VxXSkpCi0JCQlnb3RvIG9rOwotCQltc2xlZXAoMSk7Ci0JfQotCWI0M2VycihkZXYtPndsLCAiUkYgc2VxdWVuY2Ugc3RhdHVzIHRpbWVvdXRcbiIpOwotb2s6Ci0JYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGU0VRTU9ERSwgc2VxX21vZGUpOwotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1JGQ3RybE92ZXJyaWRlICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9yZl9jb250cm9sX292ZXJyaWRlKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IGZpZWxkLAotCQkJCQkJdTE2IHZhbHVlLCB1OCBjb3JlLCBib29sIG9mZikKLXsKLQlpbnQgaTsKLQl1OCBpbmRleCA9IGZscyhmaWVsZCk7Ci0JdTggYWRkciwgZW5fYWRkciwgdmFsX2FkZHI7Ci0JLyogd2UgZXhwZWN0IG9ubHkgb25lIGJpdCBzZXQgKi8KLQlCNDNfV0FSTl9PTihmaWVsZCAmICh+KDEgPDwgKGluZGV4IC0gMSkpKSk7Ci0KLQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKLQkJY29uc3Qgc3RydWN0IG5waHlfcmZfY29udHJvbF9vdmVycmlkZV9yZXYzICpyZl9jdHJsOwotCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlpZiAoaW5kZXggPT0gMCB8fCBpbmRleCA9PSAxNikgewotCQkJCWI0M2VycihkZXYtPndsLAotCQkJCQkiVW5zdXBwb3J0ZWQgUkYgQ3RybCBPdmVycmlkZSBjYWxsXG4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXJmX2N0cmwgPSAmdGJsX3JmX2NvbnRyb2xfb3ZlcnJpZGVfcmV2M1tpbmRleCAtIDFdOwotCQkJZW5fYWRkciA9IEI0M19QSFlfTigoaSA9PSAwKSA/Ci0JCQkJcmZfY3RybC0+ZW5fYWRkcjAgOiByZl9jdHJsLT5lbl9hZGRyMSk7Ci0JCQl2YWxfYWRkciA9IEI0M19QSFlfTigoaSA9PSAwKSA/Ci0JCQkJcmZfY3RybC0+dmFsX2FkZHIwIDogcmZfY3RybC0+dmFsX2FkZHIxKTsKLQotCQkJaWYgKG9mZikgewotCQkJCWI0M19waHlfbWFzayhkZXYsIGVuX2FkZHIsIH4oZmllbGQpKTsKLQkJCQliNDNfcGh5X21hc2soZGV2LCB2YWxfYWRkciwKLQkJCQkJCX4ocmZfY3RybC0+dmFsX21hc2spKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGNvcmUgPT0gMCB8fCAoKDEgPDwgY29yZSkgJiBpKSAhPSAwKSB7Ci0JCQkJCWI0M19waHlfc2V0KGRldiwgZW5fYWRkciwgZmllbGQpOwotCQkJCQliNDNfcGh5X21hc2tzZXQoZGV2LCB2YWxfYWRkciwKLQkJCQkJCX4ocmZfY3RybC0+dmFsX21hc2spLAotCQkJCQkJKHZhbHVlIDw8IHJmX2N0cmwtPnZhbF9zaGlmdCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0gZWxzZSB7Ci0JCWNvbnN0IHN0cnVjdCBucGh5X3JmX2NvbnRyb2xfb3ZlcnJpZGVfcmV2MiAqcmZfY3RybDsKLQkJaWYgKG9mZikgewotCQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUkZDVExfT1ZFUiwgfihmaWVsZCkpOwotCQkJdmFsdWUgPSAwOwotCQl9IGVsc2UgewotCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLCBmaWVsZCk7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCQlpZiAoaW5kZXggPD0gMSB8fCBpbmRleCA9PSAxNikgewotCQkJCWI0M2VycihkZXYtPndsLAotCQkJCQkiVW5zdXBwb3J0ZWQgUkYgQ3RybCBPdmVycmlkZSBjYWxsXG4iKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChpbmRleCA9PSAyIHx8IGluZGV4ID09IDEwIHx8Ci0JCQkgICAgKGluZGV4ID49IDEzICYmIGluZGV4IDw9IDE1KSkgewotCQkJCWNvcmUgPSAxOwotCQkJfQotCi0JCQlyZl9jdHJsID0gJnRibF9yZl9jb250cm9sX292ZXJyaWRlX3JldjJbaW5kZXggLSAyXTsKLQkJCWFkZHIgPSBCNDNfUEhZX04oKGkgPT0gMCkgPwotCQkJCXJmX2N0cmwtPmFkZHIwIDogcmZfY3RybC0+YWRkcjEpOwotCi0JCQlpZiAoKGNvcmUgJiAoMSA8PCBpKSkgIT0gMCkKLQkJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBhZGRyLCB+KHJmX2N0cmwtPmJtYXNrKSwKLQkJCQkJCSh2YWx1ZSA8PCByZl9jdHJsLT5zaGlmdCkpOwotCi0JCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsIDB4MSk7Ci0JCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKLQkJCQkJQjQzX05QSFlfUkZDVExfQ01EX1NUQVJUKTsKLQkJCXVkZWxheSgxKTsKLQkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsIDB4RkZGRSk7Ci0JCX0KLQl9Ci19Ci0KLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUkZDdHJsSW50Y092ZXJyaWRlICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9yZl9jb250cm9sX2ludGNfb3ZlcnJpZGUoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBmaWVsZCwKLQkJCQkJCXUxNiB2YWx1ZSwgdTggY29yZSkKLXsKLQl1OCBpLCBqOwotCXUxNiByZWcsIHRtcCwgdmFsOwotCi0JQjQzX1dBUk5fT04oZGV2LT5waHkucmV2IDwgMyk7Ci0JQjQzX1dBUk5fT04oZmllbGQgPiA0KTsKLQotCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKLQkJaWYgKChjb3JlID09IDEgJiYgaSA9PSAxKSB8fCAoY29yZSA9PSAyICYmICFpKSkKLQkJCWNvbnRpbnVlOwotCi0JCXJlZyA9IChpID09IDApID8KLQkJCUI0M19OUEhZX1JGQ1RMX0lOVEMxIDogQjQzX05QSFlfUkZDVExfSU5UQzI7Ci0JCWI0M19waHlfbWFzayhkZXYsIHJlZywgMHhGQkZGKTsKLQotCQlzd2l0Y2ggKGZpZWxkKSB7Ci0JCWNhc2UgMDoKLQkJCWI0M19waHlfd3JpdGUoZGV2LCByZWcsIDApOwotCQkJYjQzX25waHlfZm9yY2VfcmZfc2VxdWVuY2UoZGV2LCBCNDNfUkZTRVFfUkVTRVQyUlgpOwotCQkJYnJlYWs7Ci0JCWNhc2UgMToKLQkJCWlmICghaSkgewotCQkJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEMxLAotCQkJCQkJMHhGQzNGLCAodmFsdWUgPDwgNikpOwotCQkJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX1RYRl80MENPX0IxUzEsCi0JCQkJCQkweEZGRkUsIDEpOwotCQkJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfUkZDVExfQ01ELAotCQkJCQkJQjQzX05QSFlfUkZDVExfQ01EX1NUQVJUKTsKLQkJCQlmb3IgKGogPSAwOyBqIDwgMTAwOyBqKyspIHsKLQkJCQkJaWYgKGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCkgJiBCNDNfTlBIWV9SRkNUTF9DTURfU1RBUlQpIHsKLQkJCQkJCWogPSAwOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJdWRlbGF5KDEwKTsKLQkJCQl9Ci0JCQkJaWYgKGopCi0JCQkJCWI0M2VycihkZXYtPndsLAotCQkJCQkJImludGMgb3ZlcnJpZGUgdGltZW91dFxuIik7Ci0JCQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfVFhGXzQwQ09fQjFTMSwKLQkJCQkJCTB4RkZGRSk7Ci0JCQl9IGVsc2UgewotCQkJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEMyLAotCQkJCQkJMHhGQzNGLCAodmFsdWUgPDwgNikpOwotCQkJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsCi0JCQkJCQkweEZGRkUsIDEpOwotCQkJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfUkZDVExfQ01ELAotCQkJCQkJQjQzX05QSFlfUkZDVExfQ01EX1JYVFgpOwotCQkJCWZvciAoaiA9IDA7IGogPCAxMDA7IGorKykgewotCQkJCQlpZiAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZDVExfQ01EKSAmIEI0M19OUEhZX1JGQ1RMX0NNRF9SWFRYKSB7Ci0JCQkJCQlqID0gMDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCXVkZWxheSgxMCk7Ci0JCQkJfQotCQkJCWlmIChqKQotCQkJCQliNDNlcnIoZGV2LT53bCwKLQkJCQkJCSJpbnRjIG92ZXJyaWRlIHRpbWVvdXRcbiIpOwotCQkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsCi0JCQkJCQkweEZGRkUpOwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgMjoKLQkJCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKLQkJCQl0bXAgPSAweDAwMjA7Ci0JCQkJdmFsID0gdmFsdWUgPDwgNTsKLQkJCX0gZWxzZSB7Ci0JCQkJdG1wID0gMHgwMDEwOwotCQkJCXZhbCA9IHZhbHVlIDw8IDQ7Ci0JCQl9Ci0JCQliNDNfcGh5X21hc2tzZXQoZGV2LCByZWcsIH50bXAsIHZhbCk7Ci0JCQlicmVhazsKLQkJY2FzZSAzOgotCQkJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgewotCQkJCXRtcCA9IDB4MDAwMTsKLQkJCQl2YWwgPSB2YWx1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJdG1wID0gMHgwMDA0OwotCQkJCXZhbCA9IHZhbHVlIDw8IDI7Ci0JCQl9Ci0JCQliNDNfcGh5X21hc2tzZXQoZGV2LCByZWcsIH50bXAsIHZhbCk7Ci0JCQlicmVhazsKLQkJY2FzZSA0OgotCQkJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgewotCQkJCXRtcCA9IDB4MDAwMjsKLQkJCQl2YWwgPSB2YWx1ZSA8PCAxOwotCQkJfSBlbHNlIHsKLQkJCQl0bXAgPSAweDAwMDg7Ci0JCQkJdmFsID0gdmFsdWUgPDwgMzsKLQkJCX0KLQkJCWI0M19waHlfbWFza3NldChkZXYsIHJlZywgfnRtcCwgdmFsKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi0vKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL0JQSFlJbml0ICovCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9icGh5X2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQotewotCXVuc2lnbmVkIGludCBpOwotCXUxNiB2YWw7Ci0KLQl2YWwgPSAweDFFMUY7Ci0JZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKLQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTl9CTU9ERSgweDg4ICsgaSksIHZhbCk7Ci0JCXZhbCAtPSAweDIwMjsKLQl9Ci0JdmFsID0gMHgzRTNGOwotCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0JCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX05fQk1PREUoMHg5OCArIGkpLCB2YWwpOwotCQl2YWwgLT0gMHgyMDI7Ci0JfQotCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX05fQk1PREUoMHgzOCksIDB4NjY4KTsKLX0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUlNTSQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1NjYWxlT2Zmc2V0UnNzaSAqLwogc3RhdGljIHZvaWQgYjQzX25waHlfc2NhbGVfb2Zmc2V0X3Jzc2koc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgc2NhbGUsCkBAIC0yMjMzLDY3ICsxMDQwLDYgQEAKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JTU0lNQ18xUV9UU1NJLCB0bXApOwogfQogCi1zdGF0aWMgdm9pZCBiNDNfbnBoeV9yZXYyX3Jzc2lfc2VsZWN0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggY29kZSwgdTggdHlwZSkKLXsKLQl1MTYgdmFsOwotCi0JaWYgKHR5cGUgPCAzKQotCQl2YWwgPSAwOwotCWVsc2UgaWYgKHR5cGUgPT0gNikKLQkJdmFsID0gMTsKLQllbHNlIGlmICh0eXBlID09IDMpCi0JCXZhbCA9IDI7Ci0JZWxzZQotCQl2YWwgPSAzOwotCi0JdmFsID0gKHZhbCA8PCAxMikgfCAodmFsIDw8IDE0KTsKLQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfQzEsIDB4MEZGRiwgdmFsKTsKLQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfQzIsIDB4MEZGRiwgdmFsKTsKLQotCWlmICh0eXBlIDwgMykgewotCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9SU1NJTzEsIDB4RkZDRiwKLQkJCQkodHlwZSArIDEpIDw8IDQpOwotCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9SU1NJTzIsIDB4RkZDRiwKLQkJCQkodHlwZSArIDEpIDw8IDQpOwotCX0KLQotCWlmIChjb2RlID09IDApIHsKLQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIH4weDMwMDApOwotCQlpZiAodHlwZSA8IDMpIHsKLQkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKLQkJCQl+KEI0M19OUEhZX1JGQ1RMX0NNRF9SWEVOIHwKLQkJCQkgIEI0M19OUEhZX1JGQ1RMX0NNRF9DT1JFU0VMKSk7Ci0JCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLAotCQkJCX4oMHgxIDw8IDEyIHwKLQkJCQkgIDB4MSA8PCA1IHwKLQkJCQkgIDB4MSA8PCAxIHwKLQkJCQkgIDB4MSkpOwotCQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUkZDVExfQ01ELAotCQkJCX5CNDNfTlBIWV9SRkNUTF9DTURfU1RBUlQpOwotCQkJdWRlbGF5KDIwKTsKLQkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsIH4weDEpOwotCQl9Ci0JfSBlbHNlIHsKLQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwgMHgzMDAwKTsKLQkJaWYgKHR5cGUgPCAzKSB7Ci0JCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQsCi0JCQkJfihCNDNfTlBIWV9SRkNUTF9DTURfUlhFTiB8Ci0JCQkJICBCNDNfTlBIWV9SRkNUTF9DTURfQ09SRVNFTCksCi0JCQkJKEI0M19OUEhZX1JGQ1RMX0NNRF9SWEVOIHwKLQkJCQkgY29kZSA8PCBCNDNfTlBIWV9SRkNUTF9DTURfQ09SRVNFTF9TSElGVCkpOwotCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLAotCQkJCSgweDEgPDwgMTIgfAotCQkJCSAgMHgxIDw8IDUgfAotCQkJCSAgMHgxIDw8IDEgfAotCQkJCSAgMHgxKSk7Ci0JCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKLQkJCQlCNDNfTlBIWV9SRkNUTF9DTURfU1RBUlQpOwotCQkJdWRlbGF5KDIwKTsKLQkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsIH4weDEpOwotCQl9Ci0JfQotfQotCiBzdGF0aWMgdm9pZCBiNDNfbnBoeV9yZXYzX3Jzc2lfc2VsZWN0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggY29kZSwgdTggdHlwZSkKIHsKIAl1OCBpOwpAQCAtMjM3Nyw2ICsxMTIzLDY3IEBACiAJfQogfQogCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9yZXYyX3Jzc2lfc2VsZWN0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggY29kZSwgdTggdHlwZSkKK3sKKwl1MTYgdmFsOworCisJaWYgKHR5cGUgPCAzKQorCQl2YWwgPSAwOworCWVsc2UgaWYgKHR5cGUgPT0gNikKKwkJdmFsID0gMTsKKwllbHNlIGlmICh0eXBlID09IDMpCisJCXZhbCA9IDI7CisJZWxzZQorCQl2YWwgPSAzOworCisJdmFsID0gKHZhbCA8PCAxMikgfCAodmFsIDw8IDE0KTsKKwliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfQzEsIDB4MEZGRiwgdmFsKTsKKwliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfQzIsIDB4MEZGRiwgdmFsKTsKKworCWlmICh0eXBlIDwgMykgeworCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9SU1NJTzEsIDB4RkZDRiwKKwkJCQkodHlwZSArIDEpIDw8IDQpOworCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9SU1NJTzIsIDB4RkZDRiwKKwkJCQkodHlwZSArIDEpIDw8IDQpOworCX0KKworCWlmIChjb2RlID09IDApIHsKKwkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIH4weDMwMDApOworCQlpZiAodHlwZSA8IDMpIHsKKwkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKKwkJCQl+KEI0M19OUEhZX1JGQ1RMX0NNRF9SWEVOIHwKKwkJCQkgIEI0M19OUEhZX1JGQ1RMX0NNRF9DT1JFU0VMKSk7CisJCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLAorCQkJCX4oMHgxIDw8IDEyIHwKKwkJCQkgIDB4MSA8PCA1IHwKKwkJCQkgIDB4MSA8PCAxIHwKKwkJCQkgIDB4MSkpOworCQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUkZDVExfQ01ELAorCQkJCX5CNDNfTlBIWV9SRkNUTF9DTURfU1RBUlQpOworCQkJdWRlbGF5KDIwKTsKKwkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsIH4weDEpOworCQl9CisJfSBlbHNlIHsKKwkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwgMHgzMDAwKTsKKwkJaWYgKHR5cGUgPCAzKSB7CisJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9DTUQsCisJCQkJfihCNDNfTlBIWV9SRkNUTF9DTURfUlhFTiB8CisJCQkJICBCNDNfTlBIWV9SRkNUTF9DTURfQ09SRVNFTCksCisJCQkJKEI0M19OUEhZX1JGQ1RMX0NNRF9SWEVOIHwKKwkJCQkgY29kZSA8PCBCNDNfTlBIWV9SRkNUTF9DTURfQ09SRVNFTF9TSElGVCkpOworCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9SRkNUTF9PVkVSLAorCQkJCSgweDEgPDwgMTIgfAorCQkJCSAgMHgxIDw8IDUgfAorCQkJCSAgMHgxIDw8IDEgfAorCQkJCSAgMHgxKSk7CisJCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGQ1RMX0NNRCwKKwkJCQlCNDNfTlBIWV9SRkNUTF9DTURfU1RBUlQpOworCQkJdWRlbGF5KDIwKTsKKwkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsIH4weDEpOworCQl9CisJfQorfQorCiAvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1JTU0lTZWwgKi8KIHN0YXRpYyB2b2lkIGI0M19ucGh5X3Jzc2lfc2VsZWN0KHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTggY29kZSwgdTggdHlwZSkKIHsKQEAgLTI2ODYsNiArMTQ5MywxNDEzIEBACiAJfQogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFdvcmthcm91bmRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGI0M19ucGh5X2dhaW5fY3RsX3dvcmthcm91bmRzX3JldjNwbHVzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207CisKKwlib29sIGdoejU7CisJYm9vbCBleHRfbG5hOworCXUxNiByc3NpX2dhaW47CisJc3RydWN0IG5waHlfZ2Fpbl9jdGxfd29ya2Fyb3VuZF9lbnRyeSAqZTsKKwl1OCBscGZfZ2Fpbls2XSA9IHsgMHgwMCwgMHgwNiwgMHgwQywgMHgxMiwgMHgxMiwgMHgxMiB9OworCXU4IGxwZl9iaXRzWzZdID0geyAwLCAxLCAyLCAzLCAzLCAzIH07CisKKwkvKiBQcmVwYXJlIHZhbHVlcyAqLworCWdoejUgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9CQU5EQ1RMKQorCQkmIEI0M19OUEhZX0JBTkRDVExfNUdIWjsKKwlleHRfbG5hID0gZ2h6NSA/IHNwcm9tLT5ib2FyZGZsYWdzX2hpICYgQjQzX0JGSF9FWFRMTkFfNUdIWiA6CisJCXNwcm9tLT5ib2FyZGZsYWdzX2xvICYgQjQzX0JGTF9FWFRMTkE7CisJZSA9IGI0M19ucGh5X2dldF9nYWluX2N0bF93b3JrYXJvdW5kX2VudChkZXYsIGdoejUsIGV4dF9sbmEpOworCWlmIChnaHo1ICYmIGRldi0+cGh5LnJldiA+PSA1KQorCQlyc3NpX2dhaW4gPSAweDkwOworCWVsc2UKKwkJcnNzaV9nYWluID0gMHg1MDsKKworCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfUlhDVEwsIDB4MDA0MCk7CisKKwkvKiBTZXQgQ2xpcCAyIGRldGVjdCAqLworCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQzFfQ0dBSU5JLAorCQkJQjQzX05QSFlfQzFfQ0dBSU5JX0NMMkRFVEVDVCk7CisJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9DMl9DR0FJTkksCisJCQlCNDNfTlBIWV9DMl9DR0FJTklfQ0wyREVURUNUKTsKKworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX0JJQVNQT0xFX0xOQUcxX0lEQUMsCisJCQkweDE3KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9CSUFTUE9MRV9MTkFHMV9JREFDLAorCQkJMHgxNyk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgwIHwgQjIwNTZfUlhfTE5BRzJfSURBQywgMHhGMCk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgxIHwgQjIwNTZfUlhfTE5BRzJfSURBQywgMHhGMCk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgwIHwgQjIwNTZfUlhfUlNTSV9QT0xFLCAweDAwKTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9SU1NJX1BPTEUsIDB4MDApOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX1JTU0lfR0FJTiwKKwkJCXJzc2lfZ2Fpbik7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgxIHwgQjIwNTZfUlhfUlNTSV9HQUlOLAorCQkJcnNzaV9nYWluKTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDAgfCBCMjA1Nl9SWF9CSUFTUE9MRV9MTkFBMV9JREFDLAorCQkJMHgxNyk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgxIHwgQjIwNTZfUlhfQklBU1BPTEVfTE5BQTFfSURBQywKKwkJCTB4MTcpOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX0xOQUEyX0lEQUMsIDB4RkYpOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMSB8IEIyMDU2X1JYX0xOQUEyX0lEQUMsIDB4RkYpOworCisJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCOCgwLCA4KSwgNCwgZS0+bG5hMV9nYWluKTsKKwliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUI4KDEsIDgpLCA0LCBlLT5sbmExX2dhaW4pOworCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoMCwgMTYpLCA0LCBlLT5sbmEyX2dhaW4pOworCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoMSwgMTYpLCA0LCBlLT5sbmEyX2dhaW4pOworCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoMCwgMzIpLCAxMCwgZS0+Z2Fpbl9kYik7CisJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCOCgxLCAzMiksIDEwLCBlLT5nYWluX2RiKTsKKwliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUI4KDIsIDMyKSwgMTAsIGUtPmdhaW5fYml0cyk7CisJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCOCgzLCAzMiksIDEwLCBlLT5nYWluX2JpdHMpOworCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoMCwgMHg0MCksIDYsIGxwZl9nYWluKTsKKwliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUI4KDEsIDB4NDApLCA2LCBscGZfZ2Fpbik7CisJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCOCgyLCAweDQwKSwgNiwgbHBmX2JpdHMpOworCWI0M19udGFiX3dyaXRlX2J1bGsoZGV2LCBCNDNfTlRBQjgoMywgMHg0MCksIDYsIGxwZl9iaXRzKTsKKworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMV9JTklUR0FJTiwgZS0+aW5pdF9nYWluKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgyQTcsIGUtPmluaXRfZ2Fpbik7CisJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMTYoNywgMHgxMDYpLCAyLAorCQkJCWUtPnJmc2VxX2luaXQpOworCisJLyogVE9ETzogY2hlY2sgZGVmaW5lcy4gRG8gbm90IG1hdGNoIHZhcmlhYmxlcyBuYW1lcyAqLworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMV9DTElQMV9NRURHQUlOLCBlLT5jbGlwaGlfZ2Fpbik7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MkE5LCBlLT5jbGlwaGlfZ2Fpbik7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MxX0NMSVAyX0dBSU4sIGUtPmNsaXBtZF9nYWluKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgyQUIsIGUtPmNsaXBtZF9nYWluKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzJfQ0xJUDFfSElHQUlOLCBlLT5jbGlwbG9fZ2Fpbik7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MkFELCBlLT5jbGlwbG9fZ2Fpbik7CisKKwliNDNfcGh5X21hc2tzZXQoZGV2LCAweDI3RCwgMHhGRjAwLCBlLT5jcnNtaW4pOworCWI0M19waHlfbWFza3NldChkZXYsIDB4MjgwLCAweEZGMDAsIGUtPmNyc21pbmwpOworCWI0M19waHlfbWFza3NldChkZXYsIDB4MjgzLCAweEZGMDAsIGUtPmNyc21pbnUpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMV9OQkNMSVBUSFJFUywgZS0+bmJjbGlwKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzJfTkJDTElQVEhSRVMsIGUtPm5iY2xpcCk7CisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzFfQ0xJUFdCVEhSRVMsCisJCQl+QjQzX05QSFlfQzFfQ0xJUFdCVEhSRVNfQ0xJUDIsIGUtPndsY2xpcCk7CisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzJfQ0xJUFdCVEhSRVMsCisJCQl+QjQzX05QSFlfQzJfQ0xJUFdCVEhSRVNfQ0xJUDIsIGUtPndsY2xpcCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0NDS19TSElGVEJfUkVGLCAweDgwOUMpOworfQorCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9nYWluX2N0bF93b3JrYXJvdW5kc19yZXYxXzIoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBkZXYtPnBoeS5uOworCisJdTggaSwgajsKKwl1OCBjb2RlOworCXUxNiB0bXA7CisJdTggcmZzZXFfZXZlbnRzWzNdID0geyA2LCA4LCA3IH07CisJdTggcmZzZXFfZGVsYXlzWzNdID0geyAxMCwgMzAsIDEgfTsKKworCS8qIFNldCBDbGlwIDIgZGV0ZWN0ICovCisJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9DMV9DR0FJTkksIEI0M19OUEhZX0MxX0NHQUlOSV9DTDJERVRFQ1QpOworCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQzJfQ0dBSU5JLCBCNDNfTlBIWV9DMl9DR0FJTklfQ0wyREVURUNUKTsKKworCS8qIFNldCBuYXJyb3diYW5kIGNsaXAgdGhyZXNob2xkICovCisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MxX05CQ0xJUFRIUkVTLCAweDg0KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzJfTkJDTElQVEhSRVMsIDB4ODQpOworCisJaWYgKCFkZXYtPnBoeS5pc180MG1oeikgeworCQkvKiBTZXQgZHdlbGwgbGVuZ3RocyAqLworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQ0xJUDFfTkJEV0VMTF9MRU4sIDB4MDAyQik7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DTElQMl9OQkRXRUxMX0xFTiwgMHgwMDJCKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1cxQ0xJUDFfRFdFTExfTEVOLCAweDAwMDkpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVzFDTElQMl9EV0VMTF9MRU4sIDB4MDAwOSk7CisJfQorCisJLyogU2V0IHdpZGViYW5kIGNsaXAgMiB0aHJlc2hvbGQgKi8KKwliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMV9DTElQV0JUSFJFUywKKwkJCX5CNDNfTlBIWV9DMV9DTElQV0JUSFJFU19DTElQMiwgMjEpOworCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MyX0NMSVBXQlRIUkVTLAorCQkJfkI0M19OUEhZX0MyX0NMSVBXQlRIUkVTX0NMSVAyLCAyMSk7CisKKwlpZiAoIWRldi0+cGh5LmlzXzQwbWh6KSB7CisJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0MxX0NHQUlOSSwKKwkJCX5CNDNfTlBIWV9DMV9DR0FJTklfR0FJTkJLT0ZGLCAweDEpOworCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9DMl9DR0FJTkksCisJCQl+QjQzX05QSFlfQzJfQ0dBSU5JX0dBSU5CS09GRiwgMHgxKTsKKwkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzFfQ0NLX0NHQUlOSSwKKwkJCX5CNDNfTlBIWV9DMV9DQ0tfQ0dBSU5JX0dBSU5CS09GRiwgMHgxKTsKKwkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzJfQ0NLX0NHQUlOSSwKKwkJCX5CNDNfTlBIWV9DMl9DQ0tfQ0dBSU5JX0dBSU5CS09GRiwgMHgxKTsKKwl9CisKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQ0NLX1NISUZUQl9SRUYsIDB4ODA5Qyk7CisKKwlpZiAobnBoeS0+Z2Fpbl9ib29zdCkgeworCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haICYmCisJCQlkZXYtPnBoeS5pc180MG1oeikKKwkJCWNvZGUgPSA0OworCQllbHNlCisJCQljb2RlID0gNTsKKwl9IGVsc2UgeworCQljb2RlID0gZGV2LT5waHkuaXNfNDBtaHogPyA2IDogNzsKKwl9CisKKwkvKiBTZXQgSFBWR0EyIGluZGV4ICovCisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzFfSU5JVEdBSU4sIH5CNDNfTlBIWV9DMV9JTklUR0FJTl9IUFZHQTIsCisJCQljb2RlIDw8IEI0M19OUEhZX0MxX0lOSVRHQUlOX0hQVkdBMl9TSElGVCk7CisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfQzJfSU5JVEdBSU4sIH5CNDNfTlBIWV9DMl9JTklUR0FJTl9IUFZHQTIsCisJCQljb2RlIDw8IEI0M19OUEhZX0MyX0lOSVRHQUlOX0hQVkdBMl9TSElGVCk7CisKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfQUREUiwgMHgxRDA2KTsKKwkvKiBzcGVjcyBzYXkgYWJvdXQgMiBsb29wcywgYnV0IHdsIGRvZXMgNCAqLworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8sIChjb2RlIDw8IDggfCAweDdDKSk7CisKKwliNDNfbnBoeV9hZGp1c3RfbG5hX2dhaW5fdGFibGUoZGV2KTsKKworCWlmIChucGh5LT5lbG5hX2dhaW5fY29uZmlnKSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLCAweDA4MDgpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDEpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDEpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDEpOworCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLCAweDBDMDgpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDApOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDEpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDEpOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLCAweDEpOworCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLCAweDFEMDYpOworCQkvKiBzcGVjcyBzYXkgYWJvdXQgMiBsb29wcywgYnV0IHdsIGRvZXMgNCAqLworCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFMTywKKwkJCQkJCShjb2RlIDw8IDggfCAweDc0KSk7CisJfQorCisJaWYgKGRldi0+cGh5LnJldiA9PSAyKSB7CisJCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLAorCQkJCQkoMHgwNDAwICogaSkgKyAweDAwMjApOworCQkJZm9yIChqID0gMDsgaiA8IDIxOyBqKyspIHsKKwkJCQl0bXAgPSBqICogKGkgPCAyID8gMyA6IDEpOworCQkJCWI0M19waHlfd3JpdGUoZGV2LAorCQkJCQlCNDNfTlBIWV9UQUJMRV9EQVRBTE8sIHRtcCk7CisJCQl9CisJCX0KKwl9CisKKwliNDNfbnBoeV9zZXRfcmZfc2VxdWVuY2UoZGV2LCA1LCByZnNlcV9ldmVudHMsIHJmc2VxX2RlbGF5cywgMyk7CisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfT1ZFUl9ER0FJTjEsCisJCX5CNDNfTlBIWV9PVkVSX0RHQUlOX0NDS0RHRUNWICYgMHhGRkZGLAorCQkweDVBIDw8IEI0M19OUEhZX09WRVJfREdBSU5fQ0NLREdFQ1ZfU0hJRlQpOworCisJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKKwkJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX1BIWV9OKDB4QzVEKSwgMHhGRjgwLCA0KTsKK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9Xb3JrYXJvdW5kc0dhaW5DdHJsICovCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9nYWluX2N0bF93b3JrYXJvdW5kcyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJaWYgKGRldi0+cGh5LnJldiA+PSAzKQorCQliNDNfbnBoeV9nYWluX2N0bF93b3JrYXJvdW5kc19yZXYzcGx1cyhkZXYpOworCWVsc2UKKwkJYjQzX25waHlfZ2Fpbl9jdGxfd29ya2Fyb3VuZHNfcmV2MV8yKGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19ucGh5X3dvcmthcm91bmRzX3JldjNwbHVzKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gZGV2LT5waHkubjsKKwlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207CisKKwkvKiBUWCB0byBSWCAqLworCXU4IHR4MnJ4X2V2ZW50c1s4XSA9IHsgMHg0LCAweDMsIDB4NiwgMHg1LCAweDIsIDB4MSwgMHg4LCAweDFGIH07CisJdTggdHgycnhfZGVsYXlzWzhdID0geyA4LCA0LCAyLCAyLCA0LCA0LCA2LCAxIH07CisJLyogUlggdG8gVFggKi8KKwl1OCByeDJ0eF9ldmVudHNfaXBhWzldID0geyAweDAsIDB4MSwgMHgyLCAweDgsIDB4NSwgMHg2LCAweEYsIDB4MywKKwkJCQkJMHgxRiB9OworCXU4IHJ4MnR4X2RlbGF5c19pcGFbOV0gPSB7IDgsIDYsIDYsIDQsIDQsIDE2LCA0MywgMSwgMSB9OworCXU4IHJ4MnR4X2V2ZW50c1s5XSA9IHsgMHgwLCAweDEsIDB4MiwgMHg4LCAweDUsIDB4NiwgMHgzLCAweDQsIDB4MUYgfTsKKwl1OCByeDJ0eF9kZWxheXNbOV0gPSB7IDgsIDYsIDYsIDQsIDQsIDE4LCA0MiwgMSwgMSB9OworCisJdTE2IHRtcDE2OworCXUzMiB0bXAzMjsKKworCWI0M19waHlfd3JpdGUoZGV2LCAweDIzZiwgMHgxZjgpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDI0MCwgMHgxZjgpOworCisJdG1wMzIgPSBiNDNfbnRhYl9yZWFkKGRldiwgQjQzX05UQUIzMigzMCwgMCkpOworCXRtcDMyICY9IDB4ZmZmZmZmOworCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIzMigzMCwgMCksIHRtcDMyKTsKKworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0EwLCAweDAxMjUpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0ExLCAweDAxQjMpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0EyLCAweDAxMDUpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0IwLCAweDAxNkUpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0IxLCAweDAwQ0QpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0IyLCAweDAwMjApOworCisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MyX0NMSVAxX01FREdBSU4sIDB4MDAwQyk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MkFFLCAweDAwMEMpOworCisJLyogVFggdG8gUlggKi8KKwliNDNfbnBoeV9zZXRfcmZfc2VxdWVuY2UoZGV2LCAxLCB0eDJyeF9ldmVudHMsIHR4MnJ4X2RlbGF5cywKKwkJCQkgQVJSQVlfU0laRSh0eDJyeF9ldmVudHMpKTsKKworCS8qIFJYIHRvIFRYICovCisJaWYgKGI0M19ucGh5X2lwYShkZXYpKQorCQliNDNfbnBoeV9zZXRfcmZfc2VxdWVuY2UoZGV2LCAwLCByeDJ0eF9ldmVudHNfaXBhLAorCQkJCXJ4MnR4X2RlbGF5c19pcGEsIEFSUkFZX1NJWkUocngydHhfZXZlbnRzX2lwYSkpOworCWlmIChucGh5LT5od19waHlyeGNoYWluICE9IDMgJiYKKwkgICAgbnBoeS0+aHdfcGh5cnhjaGFpbiAhPSBucGh5LT5od19waHl0eGNoYWluKSB7CisJCWlmIChiNDNfbnBoeV9pcGEoZGV2KSkgeworCQkJcngydHhfZGVsYXlzWzVdID0gNTk7CisJCQlyeDJ0eF9kZWxheXNbNl0gPSAxOworCQkJcngydHhfZXZlbnRzWzddID0gMHgxRjsKKwkJfQorCQliNDNfbnBoeV9zZXRfcmZfc2VxdWVuY2UoZGV2LCAxLCByeDJ0eF9ldmVudHMsIHJ4MnR4X2RlbGF5cywKKwkJCQkJIEFSUkFZX1NJWkUocngydHhfZXZlbnRzKSk7CisJfQorCisJdG1wMTYgPSAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKSA/CisJCTB4MiA6IDB4OUM0MDsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfRU5EUk9QX1RMRU4sIHRtcDE2KTsKKworCWI0M19waHlfbWFza3NldChkZXYsIDB4Mjk0LCAweEYwRkYsIDB4MDcwMCk7CisKKwliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMzIoMTYsIDMpLCAweDE4RCk7CisJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjMyKDE2LCAxMjcpLCAweDE4RCk7CisKKwliNDNfbnBoeV9nYWluX2N0bF93b3JrYXJvdW5kcyhkZXYpOworCisJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDApLCAyKTsKKwliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMTYpLCAyKTsKKworCS8qIFRPRE8gKi8KKworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX01JWEFfTUFTVF9CSUFTLCAweDAwKTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9NSVhBX01BU1RfQklBUywgMHgwMCk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgwIHwgQjIwNTZfUlhfTUlYQV9CSUFTX01BSU4sIDB4MDYpOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMSB8IEIyMDU2X1JYX01JWEFfQklBU19NQUlOLCAweDA2KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDAgfCBCMjA1Nl9SWF9NSVhBX0JJQVNfQVVYLCAweDA3KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9NSVhBX0JJQVNfQVVYLCAweDA3KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDAgfCBCMjA1Nl9SWF9NSVhBX0xPQl9CSUFTLCAweDg4KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9NSVhBX0xPQl9CSUFTLCAweDg4KTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDAgfCBCMjA1Nl9SWF9NSVhBX0NNRkJfSURBQywgMHgwMCk7CisJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfUlgxIHwgQjIwNTZfUlhfTUlYQV9DTUZCX0lEQUMsIDB4MDApOworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1JYMCB8IEIyMDU2X1JYX01JWEdfQ01GQl9JREFDLCAweDAwKTsKKwliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9SWDEgfCBCMjA1Nl9SWF9NSVhHX0NNRkJfSURBQywgMHgwMCk7CisKKwkvKiBOIFBIWSBXQVIgVFggQ2hhaW4gVXBkYXRlIHdpdGggaHdfcGh5dHhjaGFpbiBhcyBhcmd1bWVudCAqLworCisJaWYgKChzcHJvbS0+Ym9hcmRmbGFnczJfbG8gJiBCNDNfQkZMMl9BUExMX1dBUiAmJgorCSAgICAgYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKSB8fAorCSAgICAoc3Byb20tPmJvYXJkZmxhZ3MyX2xvICYgQjQzX0JGTDJfR1BMTF9XQVIgJiYKKwkgICAgIGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikpCisJCXRtcDMyID0gMHgwMDA4ODg4ODsKKwllbHNlCisJCXRtcDMyID0gMHg4ODg4ODg4ODsKKwliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMzIoMzAsIDEpLCB0bXAzMik7CisJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjMyKDMwLCAyKSwgdG1wMzIpOworCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIzMigzMCwgMyksIHRtcDMyKTsKKworCWlmIChkZXYtPnBoeS5yZXYgPT0gNCAmJgorCQliNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfVFgwIHwgQjIwNTZfVFhfR01CQl9JREFDLAorCQkJCTB4NzApOworCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9UWDEgfCBCMjA1Nl9UWF9HTUJCX0lEQUMsCisJCQkJMHg3MCk7CisJfQorCisJYjQzX3BoeV93cml0ZShkZXYsIDB4MjI0LCAweDAzZWIpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDIyNSwgMHgwM2ViKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgyMjYsIDB4MDM0MSk7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MjI3LCAweDAzNDEpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDIyOCwgMHgwNDJiKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgyMjksIDB4MDQyYik7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MjJhLCAweDAzODEpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDIyYiwgMHgwMzgxKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgyMmMsIDB4MDQyYik7CisJYjQzX3BoeV93cml0ZShkZXYsIDB4MjJkLCAweDA0MmIpOworCWI0M19waHlfd3JpdGUoZGV2LCAweDIyZSwgMHgwMzgxKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgMHgyMmYsIDB4MDM4MSk7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19ucGh5X3dvcmthcm91bmRzX3JldjFfMihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisJc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IHBoeS0+bjsKKworCXU4IGV2ZW50czFbN10gPSB7IDB4MCwgMHgxLCAweDIsIDB4OCwgMHg0LCAweDUsIDB4MyB9OworCXU4IGRlbGF5czFbN10gPSB7IDB4OCwgMHg2LCAweDYsIDB4MiwgMHg0LCAweDNDLCAweDEgfTsKKworCXU4IGV2ZW50czJbN10gPSB7IDB4MCwgMHgzLCAweDUsIDB4NCwgMHgyLCAweDEsIDB4OCB9OworCXU4IGRlbGF5czJbN10gPSB7IDB4OCwgMHg2LCAweDIsIDB4NCwgMHg0LCAweDYsIDB4MSB9OworCisJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfNUdIWiAmJgorCSAgICBucGh5LT5iYW5kNWdfcHdyZ2FpbikgeworCQliNDNfcmFkaW9fbWFzayhkZXYsIEIyMDU1X0MxX1RYX1JGX1NQQVJFLCB+MHg4KTsKKwkJYjQzX3JhZGlvX21hc2soZGV2LCBCMjA1NV9DMl9UWF9SRl9TUEFSRSwgfjB4OCk7CisJfSBlbHNlIHsKKwkJYjQzX3JhZGlvX3NldChkZXYsIEIyMDU1X0MxX1RYX1JGX1NQQVJFLCAweDgpOworCQliNDNfcmFkaW9fc2V0KGRldiwgQjIwNTVfQzJfVFhfUkZfU1BBUkUsIDB4OCk7CisJfQorCisJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MDApLCAweDAwMEEpOworCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDEwKSwgMHgwMDBBKTsKKwliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgwMiksIDB4Q0RBQSk7CisJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTIpLCAweENEQUEpOworCisJaWYgKGRldi0+cGh5LnJldiA8IDIpIHsKKwkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MDgpLCAweDAwMDApOworCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgxOCksIDB4MDAwMCk7CisJCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDA3KSwgMHg3QUFCKTsKKwkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDgsIDB4MTcpLCAweDdBQUIpOworCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOCwgMHgwNiksIDB4MDgwMCk7CisJCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig4LCAweDE2KSwgMHgwODAwKTsKKwl9CisKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfTE8xLCAweDJEOCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0xVVF9UUlNXX1VQMSwgMHgzMDEpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19MTzIsIDB4MkQ4KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfTFVUX1RSU1dfVVAyLCAweDMwMSk7CisKKwlpZiAoc3Byb20tPmJvYXJkZmxhZ3MyX2xvICYgQjQzX0JGTDJfU0tXUktGRU1fQlJEICYmCisJICAgIGRldi0+ZGV2LT5ib2FyZF90eXBlID09IDB4OEIpIHsKKwkJZGVsYXlzMVswXSA9IDB4MTsKKwkJZGVsYXlzMVs1XSA9IDB4MTQ7CisJfQorCWI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShkZXYsIDAsIGV2ZW50czEsIGRlbGF5czEsIDcpOworCWI0M19ucGh5X3NldF9yZl9zZXF1ZW5jZShkZXYsIDEsIGV2ZW50czIsIGRlbGF5czIsIDcpOworCisJYjQzX25waHlfZ2Fpbl9jdGxfd29ya2Fyb3VuZHMoZGV2KTsKKworCWlmIChkZXYtPnBoeS5yZXYgPCAyKSB7CisJCWlmIChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9SWENUTCkgJiAweDIpCisJCQliNDNfaGZfd3JpdGUoZGV2LCBiNDNfaGZfcmVhZChkZXYpIHwKKwkJCQkJQjQzX0hGX01MQURWVyk7CisJfSBlbHNlIGlmIChkZXYtPnBoeS5yZXYgPT0gMikgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQ1JTQ0hFQ0syLCAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0NSU0NIRUNLMywgMCk7CisJfQorCisJaWYgKGRldi0+cGh5LnJldiA8IDIpCisJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1NDUkFNX1NJR0NUTCwKKwkJCQl+QjQzX05QSFlfU0NSQU1fU0lHQ1RMX1NDTSk7CisKKwkvKiBTZXQgcGhhc2UgdHJhY2sgYWxwaGEgYW5kIGJldGEgKi8KKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9BMCwgMHgxMjUpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0ExLCAweDFCMyk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BIQVNFVFJfQTIsIDB4MTA1KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9CMCwgMHgxNkUpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QSEFTRVRSX0IxLCAweENEKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUEhBU0VUUl9CMiwgMHgyMCk7CisKKwliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9QSUxfRFcxLAorCQkJfkI0M19OUEhZX1BJTF9EV182NFFBTSAmIDB4RkZGRik7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RYRl8yMENPX1MyQjEsIDB4QjUpOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UWEZfMjBDT19TMkIyLCAweEE0KTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVFhGXzIwQ09fUzJCMywgMHgwMCk7CisKKwlpZiAoZGV2LT5waHkucmV2ID09IDIpCisJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfRklORVJYMl9DR0MsCisJCQkJQjQzX05QSFlfRklORVJYMl9DR0NfREVDR0MpOworfQorCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1dvcmthcm91bmRzICovCitzdGF0aWMgdm9pZCBiNDNfbnBoeV93b3JrYXJvdW5kcyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gcGh5LT5uOworCisJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJYjQzX25waHlfY2xhc3NpZmllcihkZXYsIDEsIDApOworCWVsc2UKKwkJYjQzX25waHlfY2xhc3NpZmllcihkZXYsIDEsIDEpOworCisJaWYgKG5waHktPmhhbmdfYXZvaWQpCisJCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCAxKTsKKworCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfSVFGTElQLAorCQkgICAgQjQzX05QSFlfSVFGTElQX0FEQzEgfCBCNDNfTlBIWV9JUUZMSVBfQURDMik7CisKKwlpZiAoZGV2LT5waHkucmV2ID49IDMpCisJCWI0M19ucGh5X3dvcmthcm91bmRzX3JldjNwbHVzKGRldik7CisJZWxzZQorCQliNDNfbnBoeV93b3JrYXJvdW5kc19yZXYxXzIoZGV2KTsKKworCWlmIChucGh5LT5oYW5nX2F2b2lkKQorCQliNDNfbnBoeV9zdGF5X2luX2NhcnJpZXJfc2VhcmNoKGRldiwgMCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHgvUnggY29tbW9uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUcmFuc21pdHMgYSBrbm93biB2YWx1ZSBmb3IgTE8gY2FsaWJyYXRpb24KKyAqIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vVFhUb25lCisgKi8KK3N0YXRpYyBpbnQgYjQzX25waHlfdHhfdG9uZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUzMiBmcmVxLCB1MTYgbWF4X3ZhbCwKKwkJCQlib29sIGlxbW9kZSwgYm9vbCBkYWNfdGVzdCkKK3sKKwl1MTYgc2FtcCA9IGI0M19ucGh5X2dlbl9sb2FkX3NhbXBsZXMoZGV2LCBmcmVxLCBtYXhfdmFsLCBkYWNfdGVzdCk7CisJaWYgKHNhbXAgPT0gMCkKKwkJcmV0dXJuIC0xOworCWI0M19ucGh5X3J1bl9zYW1wbGVzKGRldiwgc2FtcCwgMHhGRkZGLCAwLCBpcW1vZGUsIGRhY190ZXN0KTsKKwlyZXR1cm4gMDsKK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9DaGFpbnMgKi8KK3N0YXRpYyB2b2lkIGI0M19ucGh5X3VwZGF0ZV90eHJ4X2NoYWluKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gZGV2LT5waHkubjsKKworCWJvb2wgb3ZlcnJpZGUgPSBmYWxzZTsKKwl1MTYgY2hhaW4gPSAweDMzOworCisJaWYgKG5waHktPnR4cnhfY2hhaW4gPT0gMCkgeworCQljaGFpbiA9IDB4MTE7CisJCW92ZXJyaWRlID0gdHJ1ZTsKKwl9IGVsc2UgaWYgKG5waHktPnR4cnhfY2hhaW4gPT0gMSkgeworCQljaGFpbiA9IDB4MjI7CisJCW92ZXJyaWRlID0gdHJ1ZTsKKwl9CisKKwliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRlNFUUNBLAorCQkJfihCNDNfTlBIWV9SRlNFUUNBX1RYRU4gfCBCNDNfTlBIWV9SRlNFUUNBX1JYRU4pLAorCQkJY2hhaW4pOworCisJaWYgKG92ZXJyaWRlKQorCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX1JGU0VRTU9ERSwKKwkJCQlCNDNfTlBIWV9SRlNFUU1PREVfQ0FPVkVSKTsKKwllbHNlCisJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1JGU0VRTU9ERSwKKwkJCQl+QjQzX05QSFlfUkZTRVFNT0RFX0NBT1ZFUik7Cit9CisKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vc3RvcC1wbGF5YmFjayAqLworc3RhdGljIHZvaWQgYjQzX25waHlfc3RvcF9wbGF5YmFjayhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IGRldi0+cGh5Lm47CisJdTE2IHRtcDsKKworCWlmIChucGh5LT5oYW5nX2F2b2lkKQorCQliNDNfbnBoeV9zdGF5X2luX2NhcnJpZXJfc2VhcmNoKGRldiwgMSk7CisKKwl0bXAgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9TQU1QX1NUQVQpOworCWlmICh0bXAgJiAweDEpCisJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfU0FNUF9DTUQsIEI0M19OUEhZX1NBTVBfQ01EX1NUT1ApOworCWVsc2UgaWYgKHRtcCAmIDB4MikKKwkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfSVFMT0NBTF9DTURHQ1RMLCAweDdGRkYpOworCisJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfU0FNUF9DTUQsIH4weDAwMDQpOworCisJaWYgKG5waHktPmJiX211bHRfc2F2ZSAmIDB4ODAwMDAwMDApIHsKKwkJdG1wID0gbnBoeS0+YmJfbXVsdF9zYXZlICYgMHhGRkZGOworCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoMTUsIDg3KSwgdG1wKTsKKwkJbnBoeS0+YmJfbXVsdF9zYXZlID0gMDsKKwl9CisKKwlpZiAobnBoeS0+aGFuZ19hdm9pZCkKKwkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIDApOworfQorCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL0lxQ2FsR2FpblBhcmFtcyAqLworc3RhdGljIHZvaWQgYjQzX25waHlfaXFfY2FsX2dhaW5fcGFyYW1zKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgdTE2IGNvcmUsCisJCQkJCXN0cnVjdCBucGh5X3R4Z2FpbnMgdGFyZ2V0LAorCQkJCQlzdHJ1Y3QgbnBoeV9pcWNhbF9wYXJhbXMgKnBhcmFtcykKK3sKKwlpbnQgaSwgaiwgaW5keDsKKwl1MTYgZ2FpbjsKKworCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgeworCQlwYXJhbXMtPnR4Z20gPSB0YXJnZXQudHhnbVtjb3JlXTsKKwkJcGFyYW1zLT5wZ2EgPSB0YXJnZXQucGdhW2NvcmVdOworCQlwYXJhbXMtPnBhZCA9IHRhcmdldC5wYWRbY29yZV07CisJCXBhcmFtcy0+aXBhID0gdGFyZ2V0LmlwYVtjb3JlXTsKKwkJcGFyYW1zLT5jYWxfZ2FpbiA9IChwYXJhbXMtPnR4Z20gPDwgMTIpIHwgKHBhcmFtcy0+cGdhIDw8IDgpIHwKKwkJCQkJKHBhcmFtcy0+cGFkIDw8IDQpIHwgKHBhcmFtcy0+aXBhKTsKKwkJZm9yIChqID0gMDsgaiA8IDU7IGorKykKKwkJCXBhcmFtcy0+bmNvcnJbal0gPSAweDc5OworCX0gZWxzZSB7CisJCWdhaW4gPSAodGFyZ2V0LnBhZFtjb3JlXSkgfCAodGFyZ2V0LnBnYVtjb3JlXSA8PCA0KSB8CisJCQkodGFyZ2V0LnR4Z21bY29yZV0gPDwgOCk7CisKKwkJaW5keCA9IChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzVHSFopID8KKwkJCTEgOiAwOworCQlmb3IgKGkgPSAwOyBpIDwgOTsgaSsrKQorCQkJaWYgKHRibF9pcWNhbF9nYWlucGFyYW1zW2luZHhdW2ldWzBdID09IGdhaW4pCisJCQkJYnJlYWs7CisJCWkgPSBtaW4oaSwgOCk7CisKKwkJcGFyYW1zLT50eGdtID0gdGJsX2lxY2FsX2dhaW5wYXJhbXNbaW5keF1baV1bMV07CisJCXBhcmFtcy0+cGdhID0gdGJsX2lxY2FsX2dhaW5wYXJhbXNbaW5keF1baV1bMl07CisJCXBhcmFtcy0+cGFkID0gdGJsX2lxY2FsX2dhaW5wYXJhbXNbaW5keF1baV1bM107CisJCXBhcmFtcy0+Y2FsX2dhaW4gPSAocGFyYW1zLT50eGdtIDw8IDcpIHwgKHBhcmFtcy0+cGdhIDw8IDQpIHwKKwkJCQkJKHBhcmFtcy0+cGFkIDw8IDIpOworCQlmb3IgKGogPSAwOyBqIDwgNDsgaisrKQorCQkJcGFyYW1zLT5uY29ycltqXSA9IHRibF9pcWNhbF9nYWlucGFyYW1zW2luZHhdW2ldWzQgKyBqXTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVHggYW5kIFJ4CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgYjQzX25waHlfc2V0X3J4YW50ZW5uYShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGludCBhbnRlbm5hKQorey8vVE9ETworfQorCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9vcF9hZGp1c3RfdHhwb3dlcihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7Ly9UT0RPCit9CisKK3N0YXRpYyBlbnVtIGI0M190eHB3cl9yZXN1bHQgYjQzX25waHlfb3BfcmVjYWxjX3R4cG93ZXIoc3RydWN0IGI0M193bGRldiAqZGV2LAorCQkJCQkJCWJvb2wgaWdub3JlX3Rzc2kpCit7Ly9UT0RPCisJcmV0dXJuIEI0M19UWFBXUl9SRVNfRE9ORTsKK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9UeFB3ckN0cmxFbmFibGUgKi8KK3N0YXRpYyB2b2lkIGI0M19ucGh5X3R4X3Bvd2VyX2N0cmwoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gZGV2LT5waHkubjsKKwl1OCBpOworCXUxNiBibWFzaywgdmFsLCB0bXA7CisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kID0gYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKTsKKworCWlmIChucGh5LT5oYW5nX2F2b2lkKQorCQliNDNfbnBoeV9zdGF5X2luX2NhcnJpZXJfc2VhcmNoKGRldiwgMSk7CisKKwlucGh5LT50eHB3cmN0cmwgPSBlbmFibGU7CisJaWYgKCFlbmFibGUpIHsKKwkJaWYgKGRldi0+cGh5LnJldiA+PSAzICYmCisJCSAgICAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfVFhQQ1RMX0NNRCkgJgorCQkgICAgIChCNDNfTlBIWV9UWFBDVExfQ01EX0NPRUZGIHwKKwkJICAgICAgQjQzX05QSFlfVFhQQ1RMX0NNRF9IV1BDVExFTiB8CisJCSAgICAgIEI0M19OUEhZX1RYUENUTF9DTURfUENUTEVOKSkpIHsKKwkJCS8qIFdlIGRpc2FibGUgZW5hYmxlZCBUWCBwd3IgY3RsLCBzYXZlIGl0J3Mgc3RhdGUgKi8KKwkJCW5waHktPnR4X3B3cl9pZHhbMF0gPSBiNDNfcGh5X3JlYWQoZGV2LAorCQkJCQkJQjQzX05QSFlfQzFfVFhQQ1RMX1NUQVQpICYgMHg3ZjsKKwkJCW5waHktPnR4X3B3cl9pZHhbMV0gPSBiNDNfcGh5X3JlYWQoZGV2LAorCQkJCQkJQjQzX05QSFlfQzJfVFhQQ1RMX1NUQVQpICYgMHg3ZjsKKwkJfQorCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLCAweDY4NDApOworCQlmb3IgKGkgPSAwOyBpIDwgODQ7IGkrKykKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8sIDApOworCisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLCAweDZDNDApOworCQlmb3IgKGkgPSAwOyBpIDwgODQ7IGkrKykKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8sIDApOworCisJCXRtcCA9IEI0M19OUEhZX1RYUENUTF9DTURfQ09FRkYgfCBCNDNfTlBIWV9UWFBDVExfQ01EX0hXUENUTEVOOworCQlpZiAoZGV2LT5waHkucmV2ID49IDMpCisJCQl0bXAgfD0gQjQzX05QSFlfVFhQQ1RMX0NNRF9QQ1RMRU47CisJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1RYUENUTF9DTUQsIH50bXApOworCisJCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgeworCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUjEsIDB4MDEwMCk7CisJCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSLCAweDAxMDApOworCQl9IGVsc2UgeworCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwgMHg0MDAwKTsKKwkJfQorCisJCWlmIChkZXYtPnBoeS5yZXYgPT0gMikKKwkJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0JQSFlfQ1RMMywKKwkJCQl+QjQzX05QSFlfQlBIWV9DVEwzX1NDQUxFLCAweDUzKTsKKwkJZWxzZSBpZiAoZGV2LT5waHkucmV2IDwgMikKKwkJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0JQSFlfQ1RMMywKKwkJCQl+QjQzX05QSFlfQlBIWV9DVEwzX1NDQUxFLCAweDVBKTsKKworCQlpZiAoZGV2LT5waHkucmV2IDwgMiAmJiBkZXYtPnBoeS5pc180MG1oeikKKwkJCWI0M19oZl93cml0ZShkZXYsIGI0M19oZl9yZWFkKGRldikgfCBCNDNfSEZfVFNTSVJQU01XKTsKKwl9IGVsc2UgeworCQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUIxNigyNiwgNjQpLCA4NCwKKwkJCQkgICAgbnBoeS0+YWRqX3B3cl90YmwpOworCQliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUIxNigyNywgNjQpLCA4NCwKKwkJCQkgICAgbnBoeS0+YWRqX3B3cl90YmwpOworCisJCWJtYXNrID0gQjQzX05QSFlfVFhQQ1RMX0NNRF9DT0VGRiB8CisJCQlCNDNfTlBIWV9UWFBDVExfQ01EX0hXUENUTEVOOworCQkvKiB3bCBkb2VzIHVzZWxlc3MgY2hlY2sgZm9yICJlbmFibGUiIHBhcmFtIGhlcmUgKi8KKwkJdmFsID0gQjQzX05QSFlfVFhQQ1RMX0NNRF9DT0VGRiB8IEI0M19OUEhZX1RYUENUTF9DTURfSFdQQ1RMRU47CisJCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgeworCQkJYm1hc2sgfD0gQjQzX05QSFlfVFhQQ1RMX0NNRF9QQ1RMRU47CisJCQlpZiAodmFsKQorCQkJCXZhbCB8PSBCNDNfTlBIWV9UWFBDVExfQ01EX1BDVExFTjsKKwkJfQorCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9UWFBDVExfQ01ELCB+KGJtYXNrKSwgdmFsKTsKKworCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9UWFBDVExfQ01ELAorCQkJCQl+QjQzX05QSFlfVFhQQ1RMX0NNRF9JTklULCAweDY0KTsKKwkJCWlmIChkZXYtPnBoeS5yZXYgPiAxKQorCQkJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX1RYUENUTF9JTklULAorCQkJCQkJfkI0M19OUEhZX1RYUENUTF9JTklUX1BJRFhJMSwKKwkJCQkJCTB4NjQpOworCQl9CisKKwkJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7CisJCQlpZiAobnBoeS0+dHhfcHdyX2lkeFswXSAhPSAxMjggJiYKKwkJCSAgICBucGh5LT50eF9wd3JfaWR4WzFdICE9IDEyOCkgeworCQkJCS8qIFJlY292ZXIgVFggcHdyIGN0bCBzdGF0ZSAqLworCQkJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX1RYUENUTF9DTUQsCisJCQkJCQl+QjQzX05QSFlfVFhQQ1RMX0NNRF9JTklULAorCQkJCQkJbnBoeS0+dHhfcHdyX2lkeFswXSk7CisJCQkJaWYgKGRldi0+cGh5LnJldiA+IDEpCisJCQkJCWI0M19waHlfbWFza3NldChkZXYsCisJCQkJCQlCNDNfTlBIWV9UWFBDVExfSU5JVCwKKwkJCQkJCX4weGZmLCBucGh5LT50eF9wd3JfaWR4WzFdKTsKKwkJCX0KKwkJfQorCisJCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgeworCQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIxLCB+MHgxMDApOworCQkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIH4weDEwMCk7CisJCX0gZWxzZSB7CisJCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwgfjB4NDAwMCk7CisJCX0KKworCQlpZiAoZGV2LT5waHkucmV2ID09IDIpCisJCQliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9CUEhZX0NUTDMsIH4weEZGLCAweDNiKTsKKwkJZWxzZSBpZiAoZGV2LT5waHkucmV2IDwgMikKKwkJCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX0JQSFlfQ1RMMywgfjB4RkYsIDB4NDApOworCisJCWlmIChkZXYtPnBoeS5yZXYgPCAyICYmIGRldi0+cGh5LmlzXzQwbWh6KQorCQkJYjQzX2hmX3dyaXRlKGRldiwgYjQzX2hmX3JlYWQoZGV2KSAmIH5CNDNfSEZfVFNTSVJQU01XKTsKKworCQlpZiAoYjQzX25waHlfaXBhKGRldikpIHsKKwkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1BBUERfRU4wLCB+MHg0KTsKKwkJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX1BBUERfRU4xLCB+MHg0KTsKKwkJfQorCX0KKworCWlmIChucGh5LT5oYW5nX2F2b2lkKQorCQliNDNfbnBoeV9zdGF5X2luX2NhcnJpZXJfc2VhcmNoKGRldiwgMCk7Cit9CisKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vVHhQd3JGaXggKi8KK3N0YXRpYyB2b2lkIGI0M19ucGh5X3R4X3Bvd2VyX2ZpeChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IGRldi0+cGh5Lm47CisJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOworCisJdTggdHhwaVsyXSwgYmJtdWx0LCBpOworCXUxNiB0bXAsIHJhZGlvX2dhaW4sIGRhY19nYWluOworCXUxNiBmcmVxID0gZGV2LT5waHkuY2hhbm5lbF9mcmVxOworCXUzMiB0eGdhaW47CisJLyogdTMyIGdhaW50Ymw7IHJldjMrICovCisKKwlpZiAobnBoeS0+aGFuZ19hdm9pZCkKKwkJYjQzX25waHlfc3RheV9pbl9jYXJyaWVyX3NlYXJjaChkZXYsIDEpOworCisJaWYgKGRldi0+cGh5LnJldiA+PSA3KSB7CisJCXR4cGlbMF0gPSB0eHBpWzFdID0gMzA7CisJfSBlbHNlIGlmIChkZXYtPnBoeS5yZXYgPj0gMykgeworCQl0eHBpWzBdID0gNDA7CisJCXR4cGlbMV0gPSA0MDsKKwl9IGVsc2UgaWYgKHNwcm9tLT5yZXZpc2lvbiA8IDQpIHsKKwkJdHhwaVswXSA9IDcyOworCQl0eHBpWzFdID0gNzI7CisJfSBlbHNlIHsKKwkJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgeworCQkJdHhwaVswXSA9IHNwcm9tLT50eHBpZDJnWzBdOworCQkJdHhwaVsxXSA9IHNwcm9tLT50eHBpZDJnWzFdOworCQl9IGVsc2UgaWYgKGZyZXEgPj0gNDkwMCAmJiBmcmVxIDwgNTEwMCkgeworCQkJdHhwaVswXSA9IHNwcm9tLT50eHBpZDVnbFswXTsKKwkJCXR4cGlbMV0gPSBzcHJvbS0+dHhwaWQ1Z2xbMV07CisJCX0gZWxzZSBpZiAoZnJlcSA+PSA1MTAwICYmIGZyZXEgPCA1NTAwKSB7CisJCQl0eHBpWzBdID0gc3Byb20tPnR4cGlkNWdbMF07CisJCQl0eHBpWzFdID0gc3Byb20tPnR4cGlkNWdbMV07CisJCX0gZWxzZSBpZiAoZnJlcSA+PSA1NTAwKSB7CisJCQl0eHBpWzBdID0gc3Byb20tPnR4cGlkNWdoWzBdOworCQkJdHhwaVsxXSA9IHNwcm9tLT50eHBpZDVnaFsxXTsKKwkJfSBlbHNlIHsKKwkJCXR4cGlbMF0gPSA5MTsKKwkJCXR4cGlbMV0gPSA5MTsKKwkJfQorCX0KKwlpZiAoZGV2LT5waHkucmV2IDwgNyAmJgorCSAgICAodHhwaVswXSA8IDQwIHx8IHR4cGlbMF0gPiAxMDAgfHwgdHhwaVsxXSA8IDQwIHx8IHR4cGlbMV0gPiAxMDApKQorCQl0eHBpWzBdID0gdHhwaVsxXSA9IDkxOworCisJLyoKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCW5waHktPnR4cHdyaW5kZXhbaV0uaW5kZXhfaW50ZXJuYWwgPSB0eHBpW2ldOworCQlucGh5LT50eHB3cmluZGV4W2ldLmluZGV4X2ludGVybmFsX3NhdmUgPSB0eHBpW2ldOworCX0KKwkqLworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKKwkJCWlmIChiNDNfbnBoeV9pcGEoZGV2KSkgeworCQkJCXR4Z2FpbiA9ICooYjQzX25waHlfZ2V0X2lwYV9nYWluX3RhYmxlKGRldikgKworCQkJCQkJdHhwaVtpXSk7CisJCQl9IGVsc2UgaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0KKwkJCQkgICBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCQkJLyogRklYTUU6IHVzZSA1R0h6IHRhYmxlcyAqLworCQkJCXR4Z2FpbiA9CisJCQkJCWI0M19udGFiX3R4X2dhaW5fcmV2M3BsdXNfMmdoelt0eHBpW2ldXTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRldi0+cGh5LnJldiA+PSA1ICYmCisJCQkJICAgIHNwcm9tLT5mZW0uZ2h6NS5leHRwYV9nYWluID09IDMpCisJCQkJCTsgLyogRklYTUU6IDVHSHpfdHhnYWluX0hpUHdyRVBBICovCisJCQkJdHhnYWluID0KKwkJCQkJYjQzX250YWJfdHhfZ2Fpbl9yZXYzcGx1c18yZ2h6W3R4cGlbaV1dOworCQkJfQorCQkJcmFkaW9fZ2FpbiA9ICh0eGdhaW4gPj4gMTYpICYgMHgxRkZGRjsKKwkJfSBlbHNlIHsKKwkJCXR4Z2FpbiA9IGI0M19udGFiX3R4X2dhaW5fcmV2MF8xXzJbdHhwaVtpXV07CisJCQlyYWRpb19nYWluID0gKHR4Z2FpbiA+PiAxNikgJiAweDFGRkY7CisJCX0KKworCQlpZiAoZGV2LT5waHkucmV2ID49IDcpCisJCQlkYWNfZ2FpbiA9ICh0eGdhaW4gPj4gOCkgJiAweDc7CisJCWVsc2UKKwkJCWRhY19nYWluID0gKHR4Z2FpbiA+PiA4KSAmIDB4M0Y7CisJCWJibXVsdCA9IHR4Z2FpbiAmIDB4RkY7CisKKwkJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7CisJCQlpZiAoaSA9PSAwKQorCQkJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIxLCAweDAxMDApOworCQkJZWxzZQorCQkJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIDB4MDEwMCk7CisJCX0gZWxzZSB7CisJCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSLCAweDQwMDApOworCQl9CisKKwkJaWYgKGkgPT0gMCkKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9BRkVDVExfREFDR0FJTjEsIGRhY19nYWluKTsKKwkJZWxzZQorCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9EQUNHQUlOMiwgZGFjX2dhaW4pOworCisJCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNigweDcsIDB4MTEwICsgaSksIHJhZGlvX2dhaW4pOworCisJCXRtcCA9IGI0M19udGFiX3JlYWQoZGV2LCBCNDNfTlRBQjE2KDB4RiwgMHg1NykpOworCQlpZiAoaSA9PSAwKQorCQkJdG1wID0gKHRtcCAmIDB4MDBGRikgfCAoYmJtdWx0IDw8IDgpOworCQllbHNlCisJCQl0bXAgPSAodG1wICYgMHhGRjAwKSB8IGJibXVsdDsKKwkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDB4RiwgMHg1NyksIHRtcCk7CisKKwkJaWYgKGI0M19ucGh5X2lwYShkZXYpKSB7CisJCQl1MzIgdG1wMzI7CisJCQl1MTYgcmVnID0gKGkgPT0gMCkgPworCQkJCUI0M19OUEhZX1BBUERfRU4wIDogQjQzX05QSFlfUEFQRF9FTjE7CisJCQl0bXAzMiA9IGI0M19udGFiX3JlYWQoZGV2LCBCNDNfTlRBQjMyKDI2ICsgaSwKKwkJCQkJCQkgICAgICA1NzYgKyB0eHBpW2ldKSk7CisJCQliNDNfcGh5X21hc2tzZXQoZGV2LCByZWcsIDB4RTAwRiwgKHUzMikgdG1wMzIgPDwgNCk7CisJCQliNDNfcGh5X3NldChkZXYsIHJlZywgMHg0KTsKKwkJfQorCX0KKworCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX0JQSFlfQ1RMMiwgfkI0M19OUEhZX0JQSFlfQ1RMMl9MVVQpOworCisJaWYgKG5waHktPmhhbmdfYXZvaWQpCisJCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCAwKTsKK30KKworc3RhdGljIHZvaWQgYjQzX25waHlfaXBhX2ludGVybmFsX3Rzc2lfc2V0dXAoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CisKKwl1OCBjb3JlOworCXUxNiByOyAvKiByb3V0aW5nICovCisKKwlpZiAocGh5LT5yZXYgPj0gNykgeworCQlmb3IgKGNvcmUgPSAwOyBjb3JlIDwgMjsgY29yZSsrKSB7CisJCQlyID0gY29yZSA/IDB4MTkwIDogMHgxNzA7CisJCQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKSB7CisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciArIDB4NSwgMHg1KTsKKwkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCByICsgMHg5LCAweEUpOworCQkJCWlmIChwaHktPnJldiAhPSA1KQorCQkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCByICsgMHhBLCAwKTsKKwkJCQlpZiAocGh5LT5yZXYgIT0gNykKKwkJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciArIDB4QiwgMSk7CisJCQkJZWxzZQorCQkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCByICsgMHhCLCAweDMxKTsKKwkJCX0gZWxzZSB7CisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciArIDB4NSwgMHg5KTsKKwkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCByICsgMHg5LCAweEMpOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgKyAweEIsIDB4MCk7CisJCQkJaWYgKHBoeS0+cmV2ICE9IDUpCisJCQkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgKyAweEEsIDEpOworCQkJCWVsc2UKKwkJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciArIDB4QSwgMHgzMSk7CisJCQl9CisJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCByICsgMHg2LCAwKTsKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgKyAweDcsIDApOworCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciArIDB4OCwgMyk7CisJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCByICsgMHhDLCAwKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopCisJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjMxLCAweDEyOCk7CisJCWVsc2UKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9SRVNFUlZFRF9BRERSMzEsIDB4ODApOworCQliNDNfcmFkaW9fd3JpdGUoZGV2LCBCMjA1Nl9TWU5fUkVTRVJWRURfQUREUjMwLCAwKTsKKwkJYjQzX3JhZGlvX3dyaXRlKGRldiwgQjIwNTZfU1lOX0dQSU9fTUFTVEVSMSwgMHgyOSk7CisKKwkJZm9yIChjb3JlID0gMDsgY29yZSA8IDI7IGNvcmUrKykgeworCQkJciA9IGNvcmUgPyBCMjA1Nl9UWDEgOiBCMjA1Nl9UWDA7CisKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgfCBCMjA1Nl9UWF9JUUNBTF9WQ01fSEcsIDApOworCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciB8IEIyMDU2X1RYX0lRQ0FMX0lEQUMsIDApOworCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciB8IEIyMDU2X1RYX1RTU0lfVkNNLCAzKTsKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgfCBCMjA1Nl9UWF9UWF9BTVBfREVULCAwKTsKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgfCBCMjA1Nl9UWF9UU1NJX01JU0MxLCA4KTsKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgfCBCMjA1Nl9UWF9UU1NJX01JU0MyLCAwKTsKKwkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgfCBCMjA1Nl9UWF9UU1NJX01JU0MzLCAwKTsKKwkJCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJCQliNDNfcmFkaW9fd3JpdGUoZGV2LCByIHwgQjIwNTZfVFhfVFhfU1NJX01BU1RFUiwKKwkJCQkJCTB4NSk7CisJCQkJaWYgKHBoeS0+cmV2ICE9IDUpCisJCQkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgfCBCMjA1Nl9UWF9UU1NJQSwKKwkJCQkJCQkweDAwKTsKKwkJCQlpZiAocGh5LT5yZXYgPj0gNSkKKwkJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciB8IEIyMDU2X1RYX1RTU0lHLAorCQkJCQkJCTB4MzEpOworCQkJCWVsc2UKKwkJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciB8IEIyMDU2X1RYX1RTU0lHLAorCQkJCQkJCTB4MTEpOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgfCBCMjA1Nl9UWF9UWF9TU0lfTVVYLAorCQkJCQkJMHhFKTsKKwkJCX0gZWxzZSB7CisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciB8IEIyMDU2X1RYX1RYX1NTSV9NQVNURVIsCisJCQkJCQkweDkpOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgfCBCMjA1Nl9UWF9UU1NJQSwgMHgzMSk7CisJCQkJYjQzX3JhZGlvX3dyaXRlKGRldiwgciB8IEIyMDU2X1RYX1RTU0lHLCAweDApOworCQkJCWI0M19yYWRpb193cml0ZShkZXYsIHIgfCBCMjA1Nl9UWF9UWF9TU0lfTVVYLAorCQkJCQkJMHhDKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIFN0b3AgcmFkaW8gYW5kIHRyYW5zbWl0IGtub3duIHNpZ25hbC4gVGhlbiBjaGVjayByZWNlaXZlZCBzaWduYWwgc3RyZW5ndGggdG8KKyAqIGdldCBUU1NJIChUcmFuc21pdCBTaWduYWwgU3RyZW5ndGggSW5kaWNhdG9yKS4KKyAqIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vVHhQd3JDdHJsSWRsZVRzc2kKKyAqLworc3RhdGljIHZvaWQgYjQzX25waHlfdHhfcG93ZXJfY3RsX2lkbGVfdHNzaShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKKwlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gZGV2LT5waHkubjsKKworCXUzMiB0bXA7CisJczMyIHJzc2lbNF0gPSB7IH07CisKKwkvKiBUT0RPOiBjaGVjayBpZiB3ZSBjYW4gdHJhbnNtaXQgKi8KKworCWlmIChiNDNfbnBoeV9pcGEoZGV2KSkKKwkJYjQzX25waHlfaXBhX2ludGVybmFsX3Rzc2lfc2V0dXAoZGV2KTsKKworCWlmIChwaHktPnJldiA+PSA3KQorCQk7IC8qIFRPRE86IE92ZXJyaWRlIFJldjcgd2l0aCAweDIwMDAsIDAsIDMsIDAsIDAgYXMgYXJndW1lbnRzICovCisJZWxzZSBpZiAocGh5LT5yZXYgPj0gMykKKwkJYjQzX25waHlfcmZfY29udHJvbF9vdmVycmlkZShkZXYsIDB4MjAwMCwgMCwgMywgZmFsc2UpOworCisJYjQzX25waHlfc3RvcF9wbGF5YmFjayhkZXYpOworCWI0M19ucGh5X3R4X3RvbmUoZGV2LCAweEZBMCwgMCwgZmFsc2UsIGZhbHNlKTsKKwl1ZGVsYXkoMjApOworCXRtcCA9IGI0M19ucGh5X3BvbGxfcnNzaShkZXYsIDQsIHJzc2ksIDEpOworCWI0M19ucGh5X3N0b3BfcGxheWJhY2soZGV2KTsKKwliNDNfbnBoeV9yc3NpX3NlbGVjdChkZXYsIDAsIDApOworCisJaWYgKHBoeS0+cmV2ID49IDcpCisJCTsgLyogVE9ETzogT3ZlcnJpZGUgUmV2NyB3aXRoIDB4MjAwMCwgMCwgMywgMSwgMCBhcyBhcmd1bWVudHMgKi8KKwllbHNlIGlmIChwaHktPnJldiA+PSAzKQorCQliNDNfbnBoeV9yZl9jb250cm9sX292ZXJyaWRlKGRldiwgMHgyMDAwLCAwLCAzLCB0cnVlKTsKKworCWlmIChwaHktPnJldiA+PSAzKSB7CisJCW5waHktPnB3cl9jdGxfaW5mb1swXS5pZGxlX3Rzc2lfNWcgPSAodG1wID4+IDI0KSAmIDB4RkY7CisJCW5waHktPnB3cl9jdGxfaW5mb1sxXS5pZGxlX3Rzc2lfNWcgPSAodG1wID4+IDgpICYgMHhGRjsKKwl9IGVsc2UgeworCQlucGh5LT5wd3JfY3RsX2luZm9bMF0uaWRsZV90c3NpXzVnID0gKHRtcCA+PiAxNikgJiAweEZGOworCQlucGh5LT5wd3JfY3RsX2luZm9bMV0uaWRsZV90c3NpXzVnID0gdG1wICYgMHhGRjsKKwl9CisJbnBoeS0+cHdyX2N0bF9pbmZvWzBdLmlkbGVfdHNzaV8yZyA9ICh0bXAgPj4gMjQpICYgMHhGRjsKKwlucGh5LT5wd3JfY3RsX2luZm9bMV0uaWRsZV90c3NpXzJnID0gKHRtcCA+PiA4KSAmIDB4RkY7Cit9CisKK3N0YXRpYyB2b2lkIGI0M19ucGh5X3R4X2dhaW5fdGFibGVfdXBsb2FkKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKK3sKKwlzdHJ1Y3QgYjQzX3BoeSAqcGh5ID0gJmRldi0+cGh5OworCisJY29uc3QgdTMyICp0YWJsZSA9IE5VTEw7CisjaWYgMAorCVRPRE86IGI0M19udGFiX3BhcGRfcGdhX2dhaW5fZGVsdGFfaXBhXzIqCisJdTMyIHJmcHdyX29mZnNldDsKKwl1OCBwZ2FfZ2FpbjsKKwlpbnQgaTsKKyNlbmRpZgorCisJaWYgKHBoeS0+cmV2ID49IDMpIHsKKwkJaWYgKGI0M19ucGh5X2lwYShkZXYpKSB7CisJCQl0YWJsZSA9IGI0M19ucGh5X2dldF9pcGFfZ2Fpbl90YWJsZShkZXYpOworCQl9IGVsc2UgeworCQkJaWYgKGI0M19jdXJyZW50X2JhbmQoZGV2LT53bCkgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgeworCQkJCWlmIChwaHktPnJldiA9PSAzKQorCQkJCQl0YWJsZSA9IGI0M19udGFiX3R4X2dhaW5fcmV2M181Z2h6OworCQkJCWlmIChwaHktPnJldiA9PSA0KQorCQkJCQl0YWJsZSA9IGI0M19udGFiX3R4X2dhaW5fcmV2NF81Z2h6OworCQkJCWVsc2UKKwkJCQkJdGFibGUgPSBiNDNfbnRhYl90eF9nYWluX3JldjVwbHVzXzVnaHo7CisJCQl9IGVsc2UgeworCQkJCXRhYmxlID0gYjQzX250YWJfdHhfZ2Fpbl9yZXYzcGx1c18yZ2h6OworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJdGFibGUgPSBiNDNfbnRhYl90eF9nYWluX3JldjBfMV8yOworCX0KKwliNDNfbnRhYl93cml0ZV9idWxrKGRldiwgQjQzX05UQUIzMigyNiwgMTkyKSwgMTI4LCB0YWJsZSk7CisJYjQzX250YWJfd3JpdGVfYnVsayhkZXYsIEI0M19OVEFCMzIoMjcsIDE5MiksIDEyOCwgdGFibGUpOworCisJaWYgKHBoeS0+cmV2ID49IDMpIHsKKyNpZiAwCisJCW5waHktPmdtdmFsID0gKHRhYmxlWzBdID4+IDE2KSAmIDB4NzAwMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspIHsKKwkJCXBnYV9nYWluID0gKHRhYmxlW2ldID4+IDI0KSAmIDB4RjsKKwkJCWlmIChiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpID09IElFRUU4MDIxMV9CQU5EXzJHSFopCisJCQkJcmZwd3Jfb2Zmc2V0ID0gYjQzX250YWJfcGFwZF9wZ2FfZ2Fpbl9kZWx0YV9pcGFfMmdbcGdhX2dhaW5dOworCQkJZWxzZQorCQkJCXJmcHdyX29mZnNldCA9IGI0M19udGFiX3BhcGRfcGdhX2dhaW5fZGVsdGFfaXBhXzVnW3BnYV9nYWluXTsKKwkJCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIzMigyNiwgNTc2ICsgaSksCisJCQkJICAgICAgIHJmcHdyX29mZnNldCk7CisJCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMzIoMjcsIDU3NiArIGkpLAorCQkJCSAgICAgICByZnB3cl9vZmZzZXQpOworCQl9CisjZW5kaWYKKwl9Cit9CisKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUEElMjBvdmVycmlkZSAqLworc3RhdGljIHZvaWQgYjQzX25waHlfcGFfb3ZlcnJpZGUoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGVuYWJsZSkKK3sKKwlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gZGV2LT5waHkubjsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CisJdTE2IHRtcDsKKworCWlmICghZW5hYmxlKSB7CisJCW5waHktPnJmY3RybF9pbnRjMV9zYXZlID0gYjQzX3BoeV9yZWFkKGRldiwKKwkJCQkJCSAgICAgICBCNDNfTlBIWV9SRkNUTF9JTlRDMSk7CisJCW5waHktPnJmY3RybF9pbnRjMl9zYXZlID0gYjQzX3BoeV9yZWFkKGRldiwKKwkJCQkJCSAgICAgICBCNDNfTlBIWV9SRkNUTF9JTlRDMik7CisJCWJhbmQgPSBiNDNfY3VycmVudF9iYW5kKGRldi0+d2wpOworCQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKKwkJCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQkJdG1wID0gMHg2MDA7CisJCQllbHNlCisJCQkJdG1wID0gMHg0ODA7CisJCX0gZWxzZSB7CisJCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJCXRtcCA9IDB4MTgwOworCQkJZWxzZQorCQkJCXRtcCA9IDB4MTIwOworCQl9CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMSwgdG1wKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEMyLCB0bXApOworCX0gZWxzZSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMSwKKwkJCQlucGh5LT5yZmN0cmxfaW50YzFfc2F2ZSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMiwKKwkJCQlucGh5LT5yZmN0cmxfaW50YzJfc2F2ZSk7CisJfQorfQorCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1R4THBGYncgKi8KK3N0YXRpYyB2b2lkIGI0M19ucGh5X3R4X2xwX2ZidyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJdTE2IHRtcDsKKworCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgeworCQlpZiAoYjQzX25waHlfaXBhKGRldikpIHsKKwkJCXRtcCA9IDQ7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVFhGXzQwQ09fQjMyUzIsCisJCQkgICAgICAoKCgoKHRtcCA8PCAzKSB8IHRtcCkgPDwgMykgfCB0bXApIDw8IDMpIHwgdG1wKTsKKwkJfQorCisJCXRtcCA9IDE7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UWEZfNDBDT19CMVMyLAorCQkJICAgICAgKCgoKCh0bXAgPDwgMykgfCB0bXApIDw8IDMpIHwgdG1wKSA8PCAzKSB8IHRtcCk7CisJfQorfQorCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1J4SXFFc3QgKi8KK3N0YXRpYyB2b2lkIGI0M19ucGh5X3J4X2lxX2VzdChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHN0cnVjdCBucGh5X2lxX2VzdCAqZXN0LAorCQkJCXUxNiBzYW1wcywgdTggdGltZSwgYm9vbCB3YWl0KQoreworCWludCBpOworCXUxNiB0bXA7CisKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfSVFFU1RfU0FNQ05ULCBzYW1wcyk7CisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfSVFFU1RfV1QsIH5CNDNfTlBIWV9JUUVTVF9XVF9WQUwsIHRpbWUpOworCWlmICh3YWl0KQorCQliNDNfcGh5X3NldChkZXYsIEI0M19OUEhZX0lRRVNUX0NNRCwgQjQzX05QSFlfSVFFU1RfQ01EX01PREUpOworCWVsc2UKKwkJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfSVFFU1RfQ01ELCB+QjQzX05QSFlfSVFFU1RfQ01EX01PREUpOworCisJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9JUUVTVF9DTUQsIEI0M19OUEhZX0lRRVNUX0NNRF9TVEFSVCk7CisKKwlmb3IgKGkgPSAxMDAwOyBpOyBpLS0pIHsKKwkJdG1wID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfQ01EKTsKKwkJaWYgKCEodG1wICYgQjQzX05QSFlfSVFFU1RfQ01EX1NUQVJUKSkgeworCQkJZXN0LT5pMF9wd3IgPSAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfSVBBQ0NfSEkwKSA8PCAxNikgfAorCQkJCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9JUUVTVF9JUEFDQ19MTzApOworCQkJZXN0LT5xMF9wd3IgPSAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfUVBBQ0NfSEkwKSA8PCAxNikgfAorCQkJCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9JUUVTVF9RUEFDQ19MTzApOworCQkJZXN0LT5pcTBfcHJvZCA9IChiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9JUUVTVF9JUUFDQ19ISTApIDw8IDE2KSB8CisJCQkJCWI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0lRRVNUX0lRQUNDX0xPMCk7CisKKwkJCWVzdC0+aTFfcHdyID0gKGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0lRRVNUX0lQQUNDX0hJMSkgPDwgMTYpIHwKKwkJCQkJYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfSVBBQ0NfTE8xKTsKKwkJCWVzdC0+cTFfcHdyID0gKGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0lRRVNUX1FQQUNDX0hJMSkgPDwgMTYpIHwKKwkJCQkJYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfUVBBQ0NfTE8xKTsKKwkJCWVzdC0+aXExX3Byb2QgPSAoYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfSVFFU1RfSVFBQ0NfSEkxKSA8PCAxNikgfAorCQkJCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9JUUVTVF9JUUFDQ19MTzEpOworCQkJcmV0dXJuOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCW1lbXNldChlc3QsIDAsIHNpemVvZigqZXN0KSk7Cit9CisKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUnhJcUNvZWZmcyAqLworc3RhdGljIHZvaWQgYjQzX25waHlfcnhfaXFfY29lZmZzKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCB3cml0ZSwKKwkJCQkJc3RydWN0IGI0M19waHlfbl9pcV9jb21wICpwY29tcCkKK3sKKwlpZiAod3JpdGUpIHsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MxX1JYSVFfQ09NUEEwLCBwY29tcC0+YTApOworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQzFfUlhJUV9DT01QQjAsIHBjb21wLT5iMCk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9DMl9SWElRX0NPTVBBMSwgcGNvbXAtPmExKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0MyX1JYSVFfQ09NUEIxLCBwY29tcC0+YjEpOworCX0gZWxzZSB7CisJCXBjb21wLT5hMCA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0MxX1JYSVFfQ09NUEEwKTsKKwkJcGNvbXAtPmIwID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfQzFfUlhJUV9DT01QQjApOworCQlwY29tcC0+YTEgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9DMl9SWElRX0NPTVBBMSk7CisJCXBjb21wLT5iMSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0MyX1JYSVFfQ09NUEIxKTsKKwl9Cit9CisKKyNpZiAwCisvKiBSZWFkeSBidXQgbm90IHVzZWQgYW55d2hlcmUgKi8KKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUnhDYWxQaHlDbGVhbnVwICovCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9yeF9jYWxfcGh5X2NsZWFudXAoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBjb3JlKQoreworCXUxNiAqcmVncyA9IGRldi0+cGh5Lm4tPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3M7CisKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZTRVFDQSwgcmVnc1swXSk7CisJaWYgKGNvcmUgPT0gMCkgeworCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfQUZFQ1RMX0MxLCByZWdzWzFdKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSMSwgcmVnc1syXSk7CisJfSBlbHNlIHsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0FGRUNUTF9DMiwgcmVnc1sxXSk7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUiwgcmVnc1syXSk7CisJfQorCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMSwgcmVnc1szXSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEMyLCByZWdzWzRdKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfUlNTSU8xLCByZWdzWzVdKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfUkZDVExfUlNTSU8yLCByZWdzWzZdKTsKKwliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVFhGXzQwQ09fQjFTMSwgcmVnc1s3XSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIsIHJlZ3NbOF0pOworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9QQVBEX0VOMCwgcmVnc1s5XSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1BBUERfRU4xLCByZWdzWzEwXSk7Cit9CisKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUnhDYWxQaHlTZXR1cCAqLworc3RhdGljIHZvaWQgYjQzX25waHlfcnhfY2FsX3BoeV9zZXR1cChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHU4IGNvcmUpCit7CisJdTggcnh2YWwsIHR4dmFsOworCXUxNiAqcmVncyA9IGRldi0+cGh5Lm4tPnR4X3J4X2NhbF9waHlfc2F2ZXJlZ3M7CisKKwlyZWdzWzBdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZTRVFDQSk7CisJaWYgKGNvcmUgPT0gMCkgeworCQlyZWdzWzFdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfQUZFQ1RMX0MxKTsKKwkJcmVnc1syXSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0FGRUNUTF9PVkVSMSk7CisJfSBlbHNlIHsKKwkJcmVnc1sxXSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX0FGRUNUTF9DMik7CisJCXJlZ3NbMl0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9BRkVDVExfT1ZFUik7CisJfQorCXJlZ3NbM10gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9SRkNUTF9JTlRDMSk7CisJcmVnc1s0XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1JGQ1RMX0lOVEMyKTsKKwlyZWdzWzVdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZDVExfUlNTSU8xKTsKKwlyZWdzWzZdID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfUkZDVExfUlNTSU8yKTsKKwlyZWdzWzddID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfVFhGXzQwQ09fQjFTMSk7CisJcmVnc1s4XSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1JGQ1RMX09WRVIpOworCXJlZ3NbOV0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9QQVBEX0VOMCk7CisJcmVnc1sxMF0gPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9QQVBEX0VOMSk7CisKKwliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9QQVBEX0VOMCwgfjB4MDAwMSk7CisJYjQzX3BoeV9tYXNrKGRldiwgQjQzX05QSFlfUEFQRF9FTjEsIH4weDAwMDEpOworCisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfUkZTRVFDQSwKKwkJCX5CNDNfTlBIWV9SRlNFUUNBX1JYRElTICYgMHhGRkZGLAorCQkJKCgxIC0gY29yZSkgPDwgQjQzX05QSFlfUkZTRVFDQV9SWERJU19TSElGVCkpOworCWI0M19waHlfbWFza3NldChkZXYsIEI0M19OUEhZX1JGU0VRQ0EsIH5CNDNfTlBIWV9SRlNFUUNBX1RYRU4sCisJCQkoKDEgLSBjb3JlKSA8PCBCNDNfTlBIWV9SRlNFUUNBX1RYRU5fU0hJRlQpKTsKKwliNDNfcGh5X21hc2tzZXQoZGV2LCBCNDNfTlBIWV9SRlNFUUNBLCB+QjQzX05QSFlfUkZTRVFDQV9SWEVOLAorCQkJKGNvcmUgPDwgQjQzX05QSFlfUkZTRVFDQV9SWEVOX1NISUZUKSk7CisJYjQzX3BoeV9tYXNrc2V0KGRldiwgQjQzX05QSFlfUkZTRVFDQSwgfkI0M19OUEhZX1JGU0VRQ0FfVFhESVMsCisJCQkoY29yZSA8PCBCNDNfTlBIWV9SRlNFUUNBX1RYRElTX1NISUZUKSk7CisKKwlpZiAoY29yZSA9PSAwKSB7CisJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX0FGRUNUTF9DMSwgfjB4MDAwNyk7CisJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIxLCAweDAwMDcpOworCX0gZWxzZSB7CisJCWI0M19waHlfbWFzayhkZXYsIEI0M19OUEhZX0FGRUNUTF9DMiwgfjB4MDAwNyk7CisJCWI0M19waHlfc2V0KGRldiwgQjQzX05QSFlfQUZFQ1RMX09WRVIsIDB4MDAwNyk7CisJfQorCisJYjQzX25waHlfcmZfY29udHJvbF9pbnRjX292ZXJyaWRlKGRldiwgMiwgMCwgMyk7CisJYjQzX25waHlfcmZfY29udHJvbF9vdmVycmlkZShkZXYsIDgsIDAsIDMsIGZhbHNlKTsKKwliNDNfbnBoeV9mb3JjZV9yZl9zZXF1ZW5jZShkZXYsIEI0M19SRlNFUV9SWDJUWCk7CisKKwlpZiAoY29yZSA9PSAwKSB7CisJCXJ4dmFsID0gMTsKKwkJdHh2YWwgPSA4OworCX0gZWxzZSB7CisJCXJ4dmFsID0gNDsKKwkJdHh2YWwgPSAyOworCX0KKwliNDNfbnBoeV9yZl9jb250cm9sX2ludGNfb3ZlcnJpZGUoZGV2LCAxLCByeHZhbCwgKGNvcmUgKyAxKSk7CisJYjQzX25waHlfcmZfY29udHJvbF9pbnRjX292ZXJyaWRlKGRldiwgMSwgdHh2YWwsICgyIC0gY29yZSkpOworfQorI2VuZGlmCisKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vQ2FsY1J4SXFDb21wICovCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9jYWxjX3J4X2lxX2NvbXAoc3RydWN0IGI0M193bGRldiAqZGV2LCB1OCBtYXNrKQoreworCWludCBpOworCXMzMiBpcTsKKwl1MzIgaWk7CisJdTMyIHFxOworCWludCBpcV9uYml0cywgcXFfbmJpdHM7CisJaW50IGFyc2gsIGJyc2g7CisJdTE2IHRtcCwgYSwgYjsKKworCXN0cnVjdCBucGh5X2lxX2VzdCBlc3Q7CisJc3RydWN0IGI0M19waHlfbl9pcV9jb21wIG9sZDsKKwlzdHJ1Y3QgYjQzX3BoeV9uX2lxX2NvbXAgbmV3ID0geyB9OworCWJvb2wgZXJyb3IgPSBmYWxzZTsKKworCWlmIChtYXNrID09IDApCisJCXJldHVybjsKKworCWI0M19ucGh5X3J4X2lxX2NvZWZmcyhkZXYsIGZhbHNlLCAmb2xkKTsKKwliNDNfbnBoeV9yeF9pcV9jb2VmZnMoZGV2LCB0cnVlLCAmbmV3KTsKKwliNDNfbnBoeV9yeF9pcV9lc3QoZGV2LCAmZXN0LCAweDQwMDAsIDMyLCBmYWxzZSk7CisJbmV3ID0gb2xkOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlpZiAoaSA9PSAwICYmIChtYXNrICYgMSkpIHsKKwkJCWlxID0gZXN0LmlxMF9wcm9kOworCQkJaWkgPSBlc3QuaTBfcHdyOworCQkJcXEgPSBlc3QucTBfcHdyOworCQl9IGVsc2UgaWYgKGkgPT0gMSAmJiAobWFzayAmIDIpKSB7CisJCQlpcSA9IGVzdC5pcTFfcHJvZDsKKwkJCWlpID0gZXN0LmkxX3B3cjsKKwkJCXFxID0gZXN0LnExX3B3cjsKKwkJfSBlbHNlIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGlpICsgcXEgPCAyKSB7CisJCQllcnJvciA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJCWlxX25iaXRzID0gZmxzKGFicyhpcSkpOworCQlxcV9uYml0cyA9IGZscyhxcSk7CisKKwkJYXJzaCA9IGlxX25iaXRzIC0gMjA7CisJCWlmIChhcnNoID49IDApIHsKKwkJCWEgPSAtKChpcSA8PCAoMzAgLSBpcV9uYml0cykpICsgKGlpID4+ICgxICsgYXJzaCkpKTsKKwkJCXRtcCA9IGlpID4+IGFyc2g7CisJCX0gZWxzZSB7CisJCQlhID0gLSgoaXEgPDwgKDMwIC0gaXFfbmJpdHMpKSArIChpaSA8PCAoLTEgLSBhcnNoKSkpOworCQkJdG1wID0gaWkgPDwgLWFyc2g7CisJCX0KKwkJaWYgKHRtcCA9PSAwKSB7CisJCQllcnJvciA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQlhIC89IHRtcDsKKworCQlicnNoID0gcXFfbmJpdHMgLSAxMTsKKwkJaWYgKGJyc2ggPj0gMCkgeworCQkJYiA9IChxcSA8PCAoMzEgLSBxcV9uYml0cykpOworCQkJdG1wID0gaWkgPj4gYnJzaDsKKwkJfSBlbHNlIHsKKwkJCWIgPSAocXEgPDwgKDMxIC0gcXFfbmJpdHMpKTsKKwkJCXRtcCA9IGlpIDw8IC1icnNoOworCQl9CisJCWlmICh0bXAgPT0gMCkgeworCQkJZXJyb3IgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwkJYiA9IGludF9zcXJ0KGIgLyB0bXAgLSBhICogYSkgLSAoMSA8PCAxMCk7CisKKwkJaWYgKGkgPT0gMCAmJiAobWFzayAmIDB4MSkpIHsKKwkJCWlmIChkZXYtPnBoeS5yZXYgPj0gMykgeworCQkJCW5ldy5hMCA9IGEgJiAweDNGRjsKKwkJCQluZXcuYjAgPSBiICYgMHgzRkY7CisJCQl9IGVsc2UgeworCQkJCW5ldy5hMCA9IGIgJiAweDNGRjsKKwkJCQluZXcuYjAgPSBhICYgMHgzRkY7CisJCQl9CisJCX0gZWxzZSBpZiAoaSA9PSAxICYmIChtYXNrICYgMHgyKSkgeworCQkJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7CisJCQkJbmV3LmExID0gYSAmIDB4M0ZGOworCQkJCW5ldy5iMSA9IGIgJiAweDNGRjsKKwkJCX0gZWxzZSB7CisJCQkJbmV3LmExID0gYiAmIDB4M0ZGOworCQkJCW5ldy5iMSA9IGEgJiAweDNGRjsKKwkJCX0KKwkJfQorCX0KKworCWlmIChlcnJvcikKKwkJbmV3ID0gb2xkOworCisJYjQzX25waHlfcnhfaXFfY29lZmZzKGRldiwgdHJ1ZSwgJm5ldyk7Cit9CisKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vVHhJcVdhciAqLworc3RhdGljIHZvaWQgYjQzX25waHlfdHhfaXFfd29ya2Fyb3VuZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCit7CisJdTE2IGFycmF5WzRdOworCWI0M19udGFiX3JlYWRfYnVsayhkZXYsIEI0M19OVEFCMTYoMHhGLCAweDUwKSwgNCwgYXJyYXkpOworCisJYjQzX3NobV93cml0ZTE2KGRldiwgQjQzX1NITV9TSEFSRUQsIEI0M19TSE1fU0hfTlBIWV9UWElRVzAsIGFycmF5WzBdKTsKKwliNDNfc2htX3dyaXRlMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwgQjQzX1NITV9TSF9OUEhZX1RYSVFXMSwgYXJyYXlbMV0pOworCWI0M19zaG1fd3JpdGUxNihkZXYsIEI0M19TSE1fU0hBUkVELCBCNDNfU0hNX1NIX05QSFlfVFhJUVcyLCBhcnJheVsyXSk7CisJYjQzX3NobV93cml0ZTE2KGRldiwgQjQzX1NITV9TSEFSRUQsIEI0M19TSE1fU0hfTlBIWV9UWElRVzMsIGFycmF5WzNdKTsKK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9TcHVyV2FyICovCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9zcHVyX3dvcmthcm91bmQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBkZXYtPnBoeS5uOworCisJdTggY2hhbm5lbCA9IGRldi0+cGh5LmNoYW5uZWw7CisJaW50IHRvbmVbMl0gPSB7IDU3LCA1OCB9OworCXUzMiBub2lzZVsyXSA9IHsgMHgzRkYsIDB4M0ZGIH07CisKKwlCNDNfV0FSTl9PTihkZXYtPnBoeS5yZXYgPCAzKTsKKworCWlmIChucGh5LT5oYW5nX2F2b2lkKQorCQliNDNfbnBoeV9zdGF5X2luX2NhcnJpZXJfc2VhcmNoKGRldiwgMSk7CisKKwlpZiAobnBoeS0+Z2JhbmRfc3B1cndhcl9lbikgeworCQkvKiBUT0RPOiBOIFBIWSBBZGp1c3QgQW5hbG9nIFBmYncgKDcpICovCisJCWlmIChjaGFubmVsID09IDExICYmIGRldi0+cGh5LmlzXzQwbWh6KQorCQkJOyAvKiBUT0RPOiBOIFBIWSBBZGp1c3QgTWluIE5vaXNlIFZhcigyLCB0b25lLCBub2lzZSkqLworCQllbHNlCisJCQk7IC8qIFRPRE86IE4gUEhZIEFkanVzdCBNaW4gTm9pc2UgVmFyKDAsIE5VTEwsIE5VTEwpKi8KKwkJLyogVE9ETzogTiBQSFkgQWRqdXN0IENSUyBNaW4gUG93ZXIgKDB4MUUpICovCisJfQorCisJaWYgKG5waHktPmFiYW5kX3NwdXJ3YXJfZW4pIHsKKwkJaWYgKGNoYW5uZWwgPT0gNTQpIHsKKwkJCXRvbmVbMF0gPSAweDIwOworCQkJbm9pc2VbMF0gPSAweDI1RjsKKwkJfSBlbHNlIGlmIChjaGFubmVsID09IDM4IHx8IGNoYW5uZWwgPT0gMTAyIHx8IGNoYW5uZWwgPT0gMTE4KSB7CisJCQlpZiAoMCAvKiBGSVhNRSAqLykgeworCQkJCXRvbmVbMF0gPSAweDIwOworCQkJCW5vaXNlWzBdID0gMHgyMUY7CisJCQl9IGVsc2UgeworCQkJCXRvbmVbMF0gPSAwOworCQkJCW5vaXNlWzBdID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChjaGFubmVsID09IDEzNCkgeworCQkJdG9uZVswXSA9IDB4MjA7CisJCQlub2lzZVswXSA9IDB4MjFGOworCQl9IGVsc2UgaWYgKGNoYW5uZWwgPT0gMTUxKSB7CisJCQl0b25lWzBdID0gMHgxMDsKKwkJCW5vaXNlWzBdID0gMHgyM0Y7CisJCX0gZWxzZSBpZiAoY2hhbm5lbCA9PSAxNTMgfHwgY2hhbm5lbCA9PSAxNjEpIHsKKwkJCXRvbmVbMF0gPSAweDMwOworCQkJbm9pc2VbMF0gPSAweDIzRjsKKwkJfSBlbHNlIHsKKwkJCXRvbmVbMF0gPSAwOworCQkJbm9pc2VbMF0gPSAwOworCQl9CisKKwkJaWYgKCF0b25lWzBdICYmICFub2lzZVswXSkKKwkJCTsgLyogVE9ETzogTiBQSFkgQWRqdXN0IE1pbiBOb2lzZSBWYXIoMSwgdG9uZSwgbm9pc2UpKi8KKwkJZWxzZQorCQkJOyAvKiBUT0RPOiBOIFBIWSBBZGp1c3QgTWluIE5vaXNlIFZhcigwLCBOVUxMLCBOVUxMKSovCisJfQorCisJaWYgKG5waHktPmhhbmdfYXZvaWQpCisJCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCAwKTsKK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9UeFB3ckN0cmxDb2VmU2V0dXAgKi8KK3N0YXRpYyB2b2lkIGI0M19ucGh5X3R4X3B3cl9jdHJsX2NvZWZfc2V0dXAoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXN0cnVjdCBiNDNfcGh5X24gKm5waHkgPSBkZXYtPnBoeS5uOworCWludCBpLCBqOworCXUzMiB0bXA7CisJdTMyIGN1cl9yZWFsLCBjdXJfaW1hZywgcmVhbF9wYXJ0LCBpbWFnX3BhcnQ7CisKKwl1MTYgYnVmZmVyWzddOworCisJaWYgKG5waHktPmhhbmdfYXZvaWQpCisJCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCB0cnVlKTsKKworCWI0M19udGFiX3JlYWRfYnVsayhkZXYsIEI0M19OVEFCMTYoMTUsIDgwKSwgNywgYnVmZmVyKTsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJdG1wID0gKChidWZmZXJbaSAqIDJdICYgMHgzRkYpIDw8IDEwKSB8CisJCQkoYnVmZmVyW2kgKiAyICsgMV0gJiAweDNGRik7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLAorCQkJCSgoKGkgKyAyNikgPDwgMTApIHwgMzIwKSk7CisJCWZvciAoaiA9IDA7IGogPCAxMjg7IGorKykgeworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFISSwKKwkJCQkJKCh0bXAgPj4gMTYpICYgMHhGRkZGKSk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLAorCQkJCQkodG1wICYgMHhGRkZGKSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXRtcCA9IGJ1ZmZlcls1ICsgaV07CisJCXJlYWxfcGFydCA9ICh0bXAgPj4gOCkgJiAweEZGOworCQlpbWFnX3BhcnQgPSAodG1wICYgMHhGRik7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLAorCQkJCSgoKGkgKyAyNikgPDwgMTApIHwgNDQ4KSk7CisKKwkJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7CisJCQljdXJfcmVhbCA9IHJlYWxfcGFydDsKKwkJCWN1cl9pbWFnID0gaW1hZ19wYXJ0OworCQkJdG1wID0gKChjdXJfcmVhbCAmIDB4RkYpIDw8IDgpIHwgKGN1cl9pbWFnICYgMHhGRik7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgMTI4OyBqKyspIHsKKwkJCWlmIChkZXYtPnBoeS5yZXYgPCAzKSB7CisJCQkJY3VyX3JlYWwgPSAocmVhbF9wYXJ0ICogbG9zY2FsZVtqXSArIDEyOCkgPj4gODsKKwkJCQljdXJfaW1hZyA9IChpbWFnX3BhcnQgKiBsb3NjYWxlW2pdICsgMTI4KSA+PiA4OworCQkJCXRtcCA9ICgoY3VyX3JlYWwgJiAweEZGKSA8PCA4KSB8CisJCQkJCShjdXJfaW1hZyAmIDB4RkYpOworCQkJfQorCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFISSwKKwkJCQkJKCh0bXAgPj4gMTYpICYgMHhGRkZGKSk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUxPLAorCQkJCQkodG1wICYgMHhGRkZGKSk7CisJCX0KKwl9CisKKwlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKKwkJYjQzX3NobV93cml0ZTE2KGRldiwgQjQzX1NITV9TSEFSRUQsCisJCQkJQjQzX1NITV9TSF9OUEhZX1RYUFdSX0lORFgwLCAweEZGRkYpOworCQliNDNfc2htX3dyaXRlMTYoZGV2LCBCNDNfU0hNX1NIQVJFRCwKKwkJCQlCNDNfU0hNX1NIX05QSFlfVFhQV1JfSU5EWDEsIDB4RkZGRik7CisJfQorCisJaWYgKG5waHktPmhhbmdfYXZvaWQpCisJCWI0M19ucGh5X3N0YXlfaW5fY2Fycmllcl9zZWFyY2goZGV2LCBmYWxzZSk7Cit9CisKIC8qCiAgKiBSZXN0b3JlIFJTU0kgQ2FsaWJyYXRpb24KICAqIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vUmVzdG9yZVJzc2lDYWwKQEAgLTI3MjksMjQgKzI5NDMsNiBAQAogCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SU1NJTUNfMVFfUlNTSV9ZLCByc3NpY2FsX3BoeV9yZWdzWzExXSk7CiB9CiAKLS8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL04vR2V0SXBhR2FpblRibCAqLwotc3RhdGljIGNvbnN0IHUzMiAqYjQzX25waHlfZ2V0X2lwYV9nYWluX3RhYmxlKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKLXsKLQlpZiAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF8yR0haKSB7Ci0JCWlmIChkZXYtPnBoeS5yZXYgPj0gNikgewotCQkJaWYgKGRldi0+ZGV2LT5jaGlwX2lkID09IDQ3MTYyKQotCQkJCXJldHVybiB0eHB3cmN0cmxfdHhfZ2Fpbl9pcGFfcmV2NTsKLQkJCXJldHVybiB0eHB3cmN0cmxfdHhfZ2Fpbl9pcGFfcmV2NjsKLQkJfSBlbHNlIGlmIChkZXYtPnBoeS5yZXYgPj0gNSkgewotCQkJcmV0dXJuIHR4cHdyY3RybF90eF9nYWluX2lwYV9yZXY1OwotCQl9IGVsc2UgewotCQkJcmV0dXJuIHR4cHdyY3RybF90eF9nYWluX2lwYTsKLQkJfQotCX0gZWxzZSB7Ci0JCXJldHVybiB0eHB3cmN0cmxfdHhfZ2Fpbl9pcGFfNWc7Ci0JfQotfQotCiAvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1R4Q2FsUmFkaW9TZXR1cCAqLwogc3RhdGljIHZvaWQgYjQzX25waHlfdHhfY2FsX3JhZGlvX3NldHVwKHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKQEAgLTI4NDEsNDQgKzMwMzcsNiBAQAogCX0KIH0KIAotLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9JcUNhbEdhaW5QYXJhbXMgKi8KLXN0YXRpYyB2b2lkIGI0M19ucGh5X2lxX2NhbF9nYWluX3BhcmFtcyhzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBjb3JlLAotCQkJCQlzdHJ1Y3QgbnBoeV90eGdhaW5zIHRhcmdldCwKLQkJCQkJc3RydWN0IG5waHlfaXFjYWxfcGFyYW1zICpwYXJhbXMpCi17Ci0JaW50IGksIGosIGluZHg7Ci0JdTE2IGdhaW47Ci0KLQlpZiAoZGV2LT5waHkucmV2ID49IDMpIHsKLQkJcGFyYW1zLT50eGdtID0gdGFyZ2V0LnR4Z21bY29yZV07Ci0JCXBhcmFtcy0+cGdhID0gdGFyZ2V0LnBnYVtjb3JlXTsKLQkJcGFyYW1zLT5wYWQgPSB0YXJnZXQucGFkW2NvcmVdOwotCQlwYXJhbXMtPmlwYSA9IHRhcmdldC5pcGFbY29yZV07Ci0JCXBhcmFtcy0+Y2FsX2dhaW4gPSAocGFyYW1zLT50eGdtIDw8IDEyKSB8IChwYXJhbXMtPnBnYSA8PCA4KSB8Ci0JCQkJCShwYXJhbXMtPnBhZCA8PCA0KSB8IChwYXJhbXMtPmlwYSk7Ci0JCWZvciAoaiA9IDA7IGogPCA1OyBqKyspCi0JCQlwYXJhbXMtPm5jb3JyW2pdID0gMHg3OTsKLQl9IGVsc2UgewotCQlnYWluID0gKHRhcmdldC5wYWRbY29yZV0pIHwgKHRhcmdldC5wZ2FbY29yZV0gPDwgNCkgfAotCQkJKHRhcmdldC50eGdtW2NvcmVdIDw8IDgpOwotCi0JCWluZHggPSAoYjQzX2N1cnJlbnRfYmFuZChkZXYtPndsKSA9PSBJRUVFODAyMTFfQkFORF81R0haKSA/Ci0JCQkxIDogMDsKLQkJZm9yIChpID0gMDsgaSA8IDk7IGkrKykKLQkJCWlmICh0YmxfaXFjYWxfZ2FpbnBhcmFtc1tpbmR4XVtpXVswXSA9PSBnYWluKQotCQkJCWJyZWFrOwotCQlpID0gbWluKGksIDgpOwotCi0JCXBhcmFtcy0+dHhnbSA9IHRibF9pcWNhbF9nYWlucGFyYW1zW2luZHhdW2ldWzFdOwotCQlwYXJhbXMtPnBnYSA9IHRibF9pcWNhbF9nYWlucGFyYW1zW2luZHhdW2ldWzJdOwotCQlwYXJhbXMtPnBhZCA9IHRibF9pcWNhbF9nYWlucGFyYW1zW2luZHhdW2ldWzNdOwotCQlwYXJhbXMtPmNhbF9nYWluID0gKHBhcmFtcy0+dHhnbSA8PCA3KSB8IChwYXJhbXMtPnBnYSA8PCA0KSB8Ci0JCQkJCShwYXJhbXMtPnBhZCA8PCAyKTsKLQkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKLQkJCXBhcmFtcy0+bmNvcnJbal0gPSB0YmxfaXFjYWxfZ2FpbnBhcmFtc1tpbmR4XVtpXVs0ICsgal07Ci0JfQotfQotCiAvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL1VwZGF0ZVR4Q2FsTGFkZGVyICovCiBzdGF0aWMgdm9pZCBiNDNfbnBoeV91cGRhdGVfdHhfY2FsX2xhZGRlcihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIHUxNiBjb3JlKQogewpAQCAtMzI1OCw3ICszNDE2LDcgQEAKIAogCWlmIChkZXYtPnBoeS5yZXYgPj0gNCkgewogCQlhdm9pZCA9IG5waHktPmhhbmdfYXZvaWQ7Ci0JCW5waHktPmhhbmdfYXZvaWQgPSAwOworCQlucGh5LT5oYW5nX2F2b2lkID0gZmFsc2U7CiAJfQogCiAJYjQzX250YWJfcmVhZF9idWxrKGRldiwgQjQzX05UQUIxNig3LCAweDExMCksIDIsIHNhdmUpOwpAQCAtMzM2OCw3ICszNTI2LDcgQEAKIAogCQkJaWYgKHBoeTZvcjV4ICYmIHVwZGF0ZWRbY29yZV0gPT0gMCkgewogCQkJCWI0M19ucGh5X3VwZGF0ZV90eF9jYWxfbGFkZGVyKGRldiwgY29yZSk7Ci0JCQkJdXBkYXRlZFtjb3JlXSA9IDE7CisJCQkJdXBkYXRlZFtjb3JlXSA9IHRydWU7CiAJCQl9CiAKIAkJCXRtcCA9IChwYXJhbXNbY29yZV0ubmNvcnJbdHlwZV0gPDwgOCkgfCAweDY2OwpAQCAtMzczMCwxMCArMzg4OCwxMDQgQEAKIAliNDNfbWFjX2VuYWJsZShkZXYpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE4tUEhZIGluaXQKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwogLyoKLSAqIEluaXQgTi1QSFkKLSAqIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUEhZL0luaXQvTgorICogVXBsb2FkIHRoZSBOLVBIWSB0YWJsZXMuCisgKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL0luaXRUYWJsZXMKICAqLworc3RhdGljIHZvaWQgYjQzX25waHlfdGFibGVzX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCWlmIChkZXYtPnBoeS5yZXYgPCAzKQorCQliNDNfbnBoeV9yZXYwXzFfMl90YWJsZXNfaW5pdChkZXYpOworCWVsc2UKKwkJYjQzX25waHlfcmV2M3BsdXNfdGFibGVzX2luaXQoZGV2KTsKK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9NSU1PQ29uZmlnICovCitzdGF0aWMgdm9pZCBiNDNfbnBoeV91cGRhdGVfbWltb19jb25maWcoc3RydWN0IGI0M193bGRldiAqZGV2LCBzMzIgcHJlYW1ibGUpCit7CisJdTE2IG1pbW9jZmcgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9NSU1PQ0ZHKTsKKworCW1pbW9jZmcgfD0gQjQzX05QSFlfTUlNT0NGR19BVVRPOworCWlmIChwcmVhbWJsZSA9PSAxKQorCQltaW1vY2ZnIHw9IEI0M19OUEhZX01JTU9DRkdfR0ZNSVg7CisJZWxzZQorCQltaW1vY2ZnICY9IH5CNDNfTlBIWV9NSU1PQ0ZHX0dGTUlYOworCisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX01JTU9DRkcsIG1pbW9jZmcpOworfQorCisvKiBodHRwOi8vYmNtLXY0LnNpcHNvbHV0aW9ucy5uZXQvODAyLjExL1BIWS9OL0JQSFlJbml0ICovCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9icGh5X2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2KQoreworCXVuc2lnbmVkIGludCBpOworCXUxNiB2YWw7CisKKwl2YWwgPSAweDFFMUY7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19QSFlfTl9CTU9ERSgweDg4ICsgaSksIHZhbCk7CisJCXZhbCAtPSAweDIwMjsKKwl9CisJdmFsID0gMHgzRTNGOworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX05fQk1PREUoMHg5OCArIGkpLCB2YWwpOworCQl2YWwgLT0gMHgyMDI7CisJfQorCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfUEhZX05fQk1PREUoMHgzOCksIDB4NjY4KTsKK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9TdXBlclN3aXRjaEluaXQgKi8KK3N0YXRpYyB2b2lkIGI0M19ucGh5X3N1cGVyc3dpdGNoX2luaXQoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGluaXQpCit7CisJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7CisJCWlmICghaW5pdCkKKwkJCXJldHVybjsKKwkJaWYgKDAgLyogRklYTUUgKi8pIHsKKwkJCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig5LCAyKSwgMHgyMTEpOworCQkJYjQzX250YWJfd3JpdGUoZGV2LCBCNDNfTlRBQjE2KDksIDMpLCAweDIyMik7CisJCQliNDNfbnRhYl93cml0ZShkZXYsIEI0M19OVEFCMTYoOSwgOCksIDB4MTQ0KTsKKwkJCWI0M19udGFiX3dyaXRlKGRldiwgQjQzX05UQUIxNig5LCAxMiksIDB4MTg4KTsKKwkJfQorCX0gZWxzZSB7CisJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9HUElPX0xPT0VOLCAwKTsKKwkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0dQSU9fSElPRU4sIDApOworCisJCXN3aXRjaCAoZGV2LT5kZXYtPmJ1c190eXBlKSB7CisjaWZkZWYgQ09ORklHX0I0M19CQ01BCisJCWNhc2UgQjQzX0JVU19CQ01BOgorCQkJYmNtYV9jaGlwY29fZ3Bpb19jb250cm9sKCZkZXYtPmRldi0+YmRldi0+YnVzLT5kcnZfY2MsCisJCQkJCQkgMHhGQzAwLCAweEZDMDApOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCQljYXNlIEI0M19CVVNfU1NCOgorCQkJc3NiX2NoaXBjb19ncGlvX2NvbnRyb2woJmRldi0+ZGV2LT5zZGV2LT5idXMtPmNoaXBjbywKKwkJCQkJCTB4RkMwMCwgMHhGQzAwKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCX0KKworCQliNDNfd3JpdGUzMihkZXYsIEI0M19NTUlPX01BQ0NUTCwKKwkJCWI0M19yZWFkMzIoZGV2LCBCNDNfTU1JT19NQUNDVEwpICYKKwkJCX5CNDNfTUFDQ1RMX0dQT1VUU01TSyk7CisJCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fR1BJT19NQVNLLAorCQkJYjQzX3JlYWQxNihkZXYsIEI0M19NTUlPX0dQSU9fTUFTSykgfCAweEZDMDApOworCQliNDNfd3JpdGUxNihkZXYsIEI0M19NTUlPX0dQSU9fQ09OVFJPTCwKKwkJCWI0M19yZWFkMTYoZGV2LCBCNDNfTU1JT19HUElPX0NPTlRST0wpICYgfjB4RkMwMCk7CisKKwkJaWYgKGluaXQpIHsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19MTzEsIDB4MkQ4KTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19VUDEsIDB4MzAxKTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19MTzIsIDB4MkQ4KTsKKwkJCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9SRkNUTF9MVVRfVFJTV19VUDIsIDB4MzAxKTsKKwkJfQorCX0KK30KKworLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvSW5pdC9OICovCiBpbnQgYjQzX3BoeV9pbml0bihzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCiB7CiAJc3RydWN0IHNzYl9zcHJvbSAqc3Byb20gPSBkZXYtPmRldi0+YnVzX3Nwcm9tOwpAQCAtMzg1Nyw3ICs0MTA5LDcgQEAKIAl0eF9wd3Jfc3RhdGUgPSBucGh5LT50eHB3cmN0cmw7CiAJYjQzX25waHlfdHhfcG93ZXJfY3RybChkZXYsIGZhbHNlKTsKIAliNDNfbnBoeV90eF9wb3dlcl9maXgoZGV2KTsKLQkvKiBUT0RPIE4gUEhZIFRYIFBvd2VyIENvbnRyb2wgSWRsZSBUU1NJICovCisJYjQzX25waHlfdHhfcG93ZXJfY3RsX2lkbGVfdHNzaShkZXYpOwogCS8qIFRPRE8gTiBQSFkgVFggUG93ZXIgQ29udHJvbCBTZXR1cCAqLwogCWI0M19ucGh5X3R4X2dhaW5fdGFibGVfdXBsb2FkKGRldik7CiAKQEAgLTM5MjgsNiArNDE4MCw5MSBAQAogCXJldHVybiAwOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENoYW5uZWwgc3dpdGNoaW5nIG9wcy4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgYjQzX2NoYW50YWJfcGh5X3VwbG9hZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsCisJCQkJICAgY29uc3Qgc3RydWN0IGI0M19waHlfbl9zZm9fY2ZnICplKQoreworCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9CVzFBLCBlLT5waHlfYncxYSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0JXMiwgZS0+cGh5X2J3Mik7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0JXMywgZS0+cGh5X2J3Myk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0JXNCwgZS0+cGh5X2J3NCk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0JXNSwgZS0+cGh5X2J3NSk7CisJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX0JXNiwgZS0+cGh5X2J3Nik7Cit9CisKKy8qIGh0dHA6Ly9iY20tdjQuc2lwc29sdXRpb25zLm5ldC84MDIuMTEvUG11U3B1ckF2b2lkICovCitzdGF0aWMgdm9pZCBiNDNfbnBoeV9wbXVfc3B1cl9hdm9pZChzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYsIGJvb2wgYXZvaWQpCit7CisJc3RydWN0IGJjbWFfZHJ2X2NjIF9fbWF5YmVfdW51c2VkICpjYzsKKwl1MzIgX19tYXliZV91bnVzZWQgcG11X2N0bDsKKworCXN3aXRjaCAoZGV2LT5kZXYtPmJ1c190eXBlKSB7CisjaWZkZWYgQ09ORklHX0I0M19CQ01BCisJY2FzZSBCNDNfQlVTX0JDTUE6CisJCWNjID0gJmRldi0+ZGV2LT5iZGV2LT5idXMtPmRydl9jYzsKKwkJaWYgKGRldi0+ZGV2LT5jaGlwX2lkID09IDQzMjI0IHx8IGRldi0+ZGV2LT5jaGlwX2lkID09IDQzMjI1KSB7CisJCQlpZiAoYXZvaWQpIHsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MCwgMHgxMTUwMDAxMCk7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDEsIDB4MDAwQzBDMDYpOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgyLCAweDBGNjAwYTA4KTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MywgMHgwMDAwMDAwMCk7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDQsIDB4MjAwMUU5MjApOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHg1LCAweDg4ODg4ODE1KTsKKwkJCX0gZWxzZSB7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDAsIDB4MTExMDAwMTApOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgxLCAweDAwMGMwYzA2KTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MiwgMHgwMzAwMGEwOCk7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDMsIDB4MDAwMDAwMDApOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHg0LCAweDIwMDAwNWMwKTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4NSwgMHg4ODg4ODgxNSk7CisJCQl9CisJCQlwbXVfY3RsID0gQkNNQV9DQ19QTVVfQ1RMX1BMTF9VUEQ7CisJCX0gZWxzZSBpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0NzE2KSB7CisJCQlpZiAoYXZvaWQpIHsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MCwgMHgxMTUwMDA2MCk7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDEsIDB4MDgwQzBDMDYpOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgyLCAweDBGNjAwMDAwKTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MywgMHgwMDAwMDAwMCk7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDQsIDB4MjAwMUU5MjQpOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHg1LCAweDg4ODg4ODE1KTsKKwkJCX0gZWxzZSB7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDAsIDB4MTExMDAwNjApOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgxLCAweDA4MGMwYzA2KTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MiwgMHgwMzAwMDAwMCk7CisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDMsIDB4MDAwMDAwMDApOworCQkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHg0LCAweDIwMDAwNWMwKTsKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4NSwgMHg4ODg4ODgxNSk7CisJCQl9CisJCQlwbXVfY3RsID0gQkNNQV9DQ19QTVVfQ1RMX1BMTF9VUEQgfAorCQkJCSAgQkNNQV9DQ19QTVVfQ1RMX05PSUxQT05XOworCQl9IGVsc2UgaWYgKGRldi0+ZGV2LT5jaGlwX2lkID09IDB4NDMyMiB8fAorCQkJICAgZGV2LT5kZXYtPmNoaXBfaWQgPT0gMHg0MzQwIHx8CisJCQkgICBkZXYtPmRldi0+Y2hpcF9pZCA9PSAweDQzNDEpIHsKKwkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgwLCAweDExMTAwMDcwKTsKKwkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHgxLCAweDEwMTQxNDBhKTsKKwkJCWJjbWFfY2hpcGNvX3BsbF93cml0ZShjYywgMHg1LCAweDg4ODg4ODU0KTsKKwkJCWlmIChhdm9pZCkKKwkJCQliY21hX2NoaXBjb19wbGxfd3JpdGUoY2MsIDB4MiwgMHgwNTIwMTgyOCk7CisJCQllbHNlCisJCQkJYmNtYV9jaGlwY29fcGxsX3dyaXRlKGNjLCAweDIsIDB4MDUwMDE4MjgpOworCQkJcG11X2N0bCA9IEJDTUFfQ0NfUE1VX0NUTF9QTExfVVBEOworCQl9IGVsc2UgeworCQkJcmV0dXJuOworCQl9CisJCWJjbWFfY2Nfc2V0MzIoY2MsIEJDTUFfQ0NfUE1VX0NUTCwgcG11X2N0bCk7CisJCWJyZWFrOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0I0M19TU0IKKwljYXNlIEI0M19CVVNfU1NCOgorCQkvKiBGSVhNRSAqLworCQlicmVhazsKKyNlbmRpZgorCX0KK30KKwogLyogaHR0cDovL2JjbS12NC5zaXBzb2x1dGlvbnMubmV0LzgwMi4xMS9QSFkvTi9DaGFuc3BlY1NldHVwICovCiBzdGF0aWMgdm9pZCBiNDNfbnBoeV9jaGFubmVsX3NldHVwKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwKIAkJCQljb25zdCBzdHJ1Y3QgYjQzX3BoeV9uX3Nmb19jZmcgKmUsCkBAIC0zOTM1LDYgKzQyNzIsNyBAQAogewogCXN0cnVjdCBiNDNfcGh5ICpwaHkgPSAmZGV2LT5waHk7CiAJc3RydWN0IGI0M19waHlfbiAqbnBoeSA9IGRldi0+cGh5Lm47CisJaW50IGNoID0gbmV3X2NoYW5uZWwtPmh3X3ZhbHVlOwogCiAJdTE2IG9sZF9iYW5kXzVnaHo7CiAJdTMyIHRtcDMyOwpAQCAtMzk3NCw4ICs0MzEyLDQxIEBACiAKIAliNDNfbnBoeV90eF9scF9mYncoZGV2KTsKIAotCWlmIChkZXYtPnBoeS5yZXYgPj0gMyAmJiAwKSB7Ci0JCS8qIFRPRE8gKi8KKwlpZiAoZGV2LT5waHkucmV2ID49IDMgJiYKKwkgICAgZGV2LT5waHkubi0+c3B1cl9hdm9pZCAhPSBCNDNfU1BVUl9BVk9JRF9ESVNBQkxFKSB7CisJCWJvb2wgYXZvaWQgPSBmYWxzZTsKKwkJaWYgKGRldi0+cGh5Lm4tPnNwdXJfYXZvaWQgPT0gQjQzX1NQVVJfQVZPSURfRk9SQ0UpIHsKKwkJCWF2b2lkID0gdHJ1ZTsKKwkJfSBlbHNlIGlmICghYjQzX2NoYW5uZWxfdHlwZV9pc180MG1oeihwaHktPmNoYW5uZWxfdHlwZSkpIHsKKwkJCWlmICgoY2ggPj0gNSAmJiBjaCA8PSA4KSB8fCBjaCA9PSAxMyB8fCBjaCA9PSAxNCkKKwkJCQlhdm9pZCA9IHRydWU7CisJCX0gZWxzZSB7IC8qIDQwTUh6ICovCisJCQlpZiAobnBoeS0+YWJhbmRfc3B1cndhcl9lbiAmJgorCQkJICAgIChjaCA9PSAzOCB8fCBjaCA9PSAxMDIgfHwgY2ggPT0gMTE4KSkKKwkJCQlhdm9pZCA9IGRldi0+ZGV2LT5jaGlwX2lkID09IDB4NDcxNjsKKwkJfQorCisJCWI0M19ucGh5X3BtdV9zcHVyX2F2b2lkKGRldiwgYXZvaWQpOworCisJCWlmIChkZXYtPmRldi0+Y2hpcF9pZCA9PSA0MzIyMiB8fCBkZXYtPmRldi0+Y2hpcF9pZCA9PSA0MzIyNCB8fAorCQkgICAgZGV2LT5kZXYtPmNoaXBfaWQgPT0gNDMyMjUpIHsKKwkJCWI0M193cml0ZTE2KGRldiwgQjQzX01NSU9fVFNGX0NMS19GUkFDX0xPVywKKwkJCQkgICAgYXZvaWQgPyAweDUzNDEgOiAweDg4ODkpOworCQkJYjQzX3dyaXRlMTYoZGV2LCBCNDNfTU1JT19UU0ZfQ0xLX0ZSQUNfSElHSCwgMHg4KTsKKwkJfQorCisJCWlmIChkZXYtPnBoeS5yZXYgPT0gMyB8fCBkZXYtPnBoeS5yZXYgPT0gNCkKKwkJCTsgLyogVE9ETzogcmVzZXQgUExMICovCisKKwkJaWYgKGF2b2lkKQorCQkJYjQzX3BoeV9zZXQoZGV2LCBCNDNfTlBIWV9CQkNGRywgQjQzX05QSFlfQkJDRkdfUlNUUlgpOworCQllbHNlCisJCQliNDNfcGh5X21hc2soZGV2LCBCNDNfTlBIWV9CQkNGRywKKwkJCQkgICAgIH5CNDNfTlBIWV9CQkNGR19SU1RSWCAmIDB4RkZGRik7CisKKwkJYjQzX25waHlfcmVzZXRfY2NhKGRldik7CisKKwkJLyogd2wgc2V0cyB1c2VsZXNzIHBoeV9pc3NwdXJhdm9pZCBoZXJlICovCiAJfQogCiAJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX05EQVRBVF9EVVA0MCwgMHgzODMwKTsKQEAgLTQwMzksNiArNDQxMCwxMCBAQAogCXJldHVybiAwOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEJhc2ljIFBIWSBvcHMuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKIHN0YXRpYyBpbnQgYjQzX25waHlfb3BfYWxsb2NhdGUoc3RydWN0IGI0M193bGRldiAqZGV2KQogewogCXN0cnVjdCBiNDNfcGh5X24gKm5waHk7CkBAIC00MDU1LDEwICs0NDMwLDEzIEBACiB7CiAJc3RydWN0IGI0M19waHkgKnBoeSA9ICZkZXYtPnBoeTsKIAlzdHJ1Y3QgYjQzX3BoeV9uICpucGh5ID0gcGh5LT5uOworCXN0cnVjdCBzc2Jfc3Byb20gKnNwcm9tID0gZGV2LT5kZXYtPmJ1c19zcHJvbTsKIAogCW1lbXNldChucGh5LCAwLCBzaXplb2YoKm5waHkpKTsKIAogCW5waHktPmhhbmdfYXZvaWQgPSAocGh5LT5yZXYgPT0gMyB8fCBwaHktPnJldiA9PSA0KTsKKwlucGh5LT5zcHVyX2F2b2lkID0gKHBoeS0+cmV2ID49IDMpID8KKwkJCQlCNDNfU1BVUl9BVk9JRF9BVVRPIDogQjQzX1NQVVJfQVZPSURfRElTQUJMRTsKIAlucGh5LT5nYWluX2Jvb3N0ID0gdHJ1ZTsgLyogdGhpcyB3YXkgd2UgZm9sbG93IHdsLCBhc3N1bWUgaXQgaXMgdHJ1ZSAqLwogCW5waHktPnR4cnhfY2hhaW4gPSAyOyAvKiBzdGggZGlmZmVyZW50IHRoYW4gMCBhbmQgMSBmb3Igbm93ICovCiAJbnBoeS0+cGh5cnhjaGFpbiA9IDM7IC8qIHRvIGF2b2lkIGI0M19ucGh5X3NldF9yeF9jb3JlX3N0YXRlIGxpa2Ugd2wgKi8KQEAgLTQwNjcsNiArNDQ0NSwzOCBAQAogCSAqIDB4N2YgPT0gMTI3IGFuZCB3ZSBjaGVjayBmb3IgMTI4IHdoZW4gcmVzdG9yaW5nIFRYIHB3ciBjdGwuICovCiAJbnBoeS0+dHhfcHdyX2lkeFswXSA9IDEyODsKIAlucGh5LT50eF9wd3JfaWR4WzFdID0gMTI4OworCisJLyogSGFyZHdhcmUgVFggcG93ZXIgY29udHJvbCBhbmQgNUdIeiBwb3dlciBnYWluICovCisJbnBoeS0+dHhwd3JjdHJsID0gZmFsc2U7CisJbnBoeS0+cHdnX2dhaW5fNWdoeiA9IGZhbHNlOworCWlmIChkZXYtPnBoeS5yZXYgPj0gMyB8fAorCSAgICAoZGV2LT5kZXYtPmJvYXJkX3ZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0FQUExFICYmCisJICAgICAoZGV2LT5kZXYtPmNvcmVfcmV2ID09IDExIHx8IGRldi0+ZGV2LT5jb3JlX3JldiA9PSAxMikpKSB7CisJCW5waHktPnR4cHdyY3RybCA9IHRydWU7CisJCW5waHktPnB3Z19nYWluXzVnaHogPSB0cnVlOworCX0gZWxzZSBpZiAoc3Byb20tPnJldmlzaW9uID49IDQpIHsKKwkJaWYgKGRldi0+cGh5LnJldiA+PSAyICYmCisJCSAgICAoc3Byb20tPmJvYXJkZmxhZ3MyX2xvICYgQjQzX0JGTDJfVFhQV1JDVFJMX0VOKSkgeworCQkJbnBoeS0+dHhwd3JjdHJsID0gdHJ1ZTsKKyNpZmRlZiBDT05GSUdfQjQzX1NTQgorCQkJaWYgKGRldi0+ZGV2LT5idXNfdHlwZSA9PSBCNDNfQlVTX1NTQiAmJgorCQkJICAgIGRldi0+ZGV2LT5zZGV2LT5idXMtPmJ1c3R5cGUgPT0gU1NCX0JVU1RZUEVfUENJKSB7CisJCQkJc3RydWN0IHBjaV9kZXYgKnBkZXYgPQorCQkJCQlkZXYtPmRldi0+c2Rldi0+YnVzLT5ob3N0X3BjaTsKKwkJCQlpZiAocGRldi0+ZGV2aWNlID09IDB4NDMyOCB8fAorCQkJCSAgICBwZGV2LT5kZXZpY2UgPT0gMHg0MzJhKQorCQkJCQlucGh5LT5wd2dfZ2Fpbl81Z2h6ID0gdHJ1ZTsKKwkJCX0KKyNlbmRpZgorCQl9IGVsc2UgaWYgKHNwcm9tLT5ib2FyZGZsYWdzMl9sbyAmIEI0M19CRkwyXzVHX1BXUkdBSU4pIHsKKwkJCW5waHktPnB3Z19nYWluXzVnaHogPSB0cnVlOworCQl9CisJfQorCisJaWYgKGRldi0+cGh5LnJldiA+PSAzKSB7CisJCW5waHktPmlwYTJnX29uID0gc3Byb20tPmZlbS5naHoyLmV4dHBhX2dhaW4gPT0gMjsKKwkJbnBoeS0+aXBhNWdfb24gPSBzcHJvbS0+ZmVtLmdoejUuZXh0cGFfZ2FpbiA9PSAyOworCX0KIH0KIAogc3RhdGljIHZvaWQgYjQzX25waHlfb3BfZnJlZShzdHJ1Y3QgYjQzX3dsZGV2ICpkZXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGh5X24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5oCmluZGV4IGZiZjUyMDIuLjVkZThmNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waHlfbi5oCkBAIC03MTYsNiArNzE2LDEyIEBACiAKIHN0cnVjdCBiNDNfd2xkZXY7CiAKK2VudW0gYjQzX25waHlfc3B1cl9hdm9pZCB7CisJQjQzX1NQVVJfQVZPSURfRElTQUJMRSwKKwlCNDNfU1BVUl9BVk9JRF9BVVRPLAorCUI0M19TUFVSX0FWT0lEX0ZPUkNFLAorfTsKKwogc3RydWN0IGI0M19jaGFuc3BlYyB7CiAJdTE2IGNlbnRlcl9mcmVxOwogCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlOwpAQCAtNzU5LDYgKzc2NSwxMSBAQAogCXUxNiBsb2NvbXA7CiB9OwogCitzdHJ1Y3QgYjQzX3BoeV9uX3B3cl9jdGxfaW5mbyB7CisJdTggaWRsZV90c3NpXzJnOworCXU4IGlkbGVfdHNzaV81ZzsKK307CisKIHN0cnVjdCBiNDNfcGh5X24gewogCXU4IGFudHNlbF90eXBlOwogCXU4IGNhbF9vcmlnX3B3cl9pZHhbMl07CkBAIC03ODUsMTIgKzc5NiwxNCBAQAogCXUxNiBtcGhhc2VfdHhjYWxfYmVzdGNvZWZmc1sxMV07CiAKIAlib29sIHR4cHdyY3RybDsKKwlib29sIHB3Z19nYWluXzVnaHo7CiAJdTggdHhfcHdyX2lkeFsyXTsKIAl1MTYgYWRqX3B3cl90YmxbODRdOwogCXUxNiB0eGNhbF9iYm11bHQ7CiAJdTE2IHR4aXFsb2NhbF9iZXN0Y1sxMV07CiAJYm9vbCB0eGlxbG9jYWxfY29lZmZzdmFsaWQ7CiAJc3RydWN0IGI0M19waHlfbl90eHB3cmluZGV4IHR4cHdyaW5kZXhbMl07CisJc3RydWN0IGI0M19waHlfbl9wd3JfY3RsX2luZm8gcHdyX2N0bF9pbmZvWzJdOwogCXN0cnVjdCBiNDNfY2hhbnNwZWMgdHhpcWxvY2FsX2NoYW5zcGVjOwogCiAJdTggdHhyeF9jaGFpbjsKQEAgLTgwMyw2ICs4MTYsNyBAQAogCXUxNiBjbGFzc2lmaWVyX3N0YXRlOwogCXUxNiBjbGlwX3N0YXRlWzJdOwogCisJZW51bSBiNDNfbnBoeV9zcHVyX2F2b2lkIHNwdXJfYXZvaWQ7CiAJYm9vbCBhYmFuZF9zcHVyd2FyX2VuOwogCWJvb2wgZ2JhbmRfc3B1cndhcl9lbjsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3Bpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3Bpby5jCmluZGV4IGZjZmY5MjMuLjM1MzNhYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9waW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcGlvLmMKQEAgLTUzOSw3ICs1MzksNyBAQAogCQkvKiBOb3QgZW5vdWdoIG1lbW9yeSBvbiB0aGUgcXVldWUuICovCiAJCWVyciA9IC1FQlVTWTsKIAkJaWVlZTgwMjExX3N0b3BfcXVldWUoZGV2LT53bC0+aHcsIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKLQkJcS0+c3RvcHBlZCA9IDE7CisJCXEtPnN0b3BwZWQgPSB0cnVlOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTU2Niw3ICs1NjYsNyBAQAogCSAgICAocS0+ZnJlZV9wYWNrZXRfc2xvdHMgPT0gMCkpIHsKIAkJLyogVGhlIHF1ZXVlIGlzIGZ1bGwuICovCiAJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKGRldi0+d2wtPmh3LCBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7Ci0JCXEtPnN0b3BwZWQgPSAxOworCQlxLT5zdG9wcGVkID0gdHJ1ZTsKIAl9CiAKIG91dDoKQEAgLTYwMSw3ICs2MDEsNyBAQAogCiAJaWYgKHEtPnN0b3BwZWQpIHsKIAkJaWVlZTgwMjExX3dha2VfcXVldWUoZGV2LT53bC0+aHcsIHEtPnF1ZXVlX3ByaW8pOwotCQlxLT5zdG9wcGVkID0gMDsKKwkJcS0+c3RvcHBlZCA9IGZhbHNlOwogCX0KIH0KIApAQCAtNjE3LDkgKzYxNywxOSBAQAogCWNvbnN0IGNoYXIgKmVycl9tc2cgPSBOVUxMOwogCXN0cnVjdCBiNDNfcnhoZHJfZnc0ICpyeGhkciA9CiAJCShzdHJ1Y3QgYjQzX3J4aGRyX2Z3NCAqKXdsLT5waW9fc2NyYXRjaHNwYWNlOworCXNpemVfdCByeGhkcl9zaXplID0gc2l6ZW9mKCpyeGhkcik7CiAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHdsLT5waW9fc2NyYXRjaHNwYWNlKSA8IHNpemVvZigqcnhoZHIpKTsKLQltZW1zZXQocnhoZHIsIDAsIHNpemVvZigqcnhoZHIpKTsKKwlzd2l0Y2ggKGRldi0+ZncuaGRyX2Zvcm1hdCkgeworCWNhc2UgQjQzX0ZXX0hEUl80MTA6CisJY2FzZSBCNDNfRldfSERSXzM1MToKKwkJcnhoZHJfc2l6ZSAtPSBzaXplb2YocnhoZHItPmZvcm1hdF81OTgpIC0KKwkJCXNpemVvZihyeGhkci0+Zm9ybWF0XzM1MSk7CisJCWJyZWFrOworCWNhc2UgQjQzX0ZXX0hEUl81OTg6CisJCWJyZWFrOworCX0KKwltZW1zZXQocnhoZHIsIDAsIHJ4aGRyX3NpemUpOwogCiAJLyogQ2hlY2sgaWYgd2UgaGF2ZSBkYXRhIGFuZCB3YWl0IGZvciBpdCB0byBnZXQgcmVhZHkuICovCiAJaWYgKHEtPnJldiA+PSA4KSB7CkBAIC02NTcsMTEgKzY2NywxMSBAQAogCiAJLyogR2V0IHRoZSBwcmVhbWJsZSAoUlggaGVhZGVyKSAqLwogCWlmIChxLT5yZXYgPj0gOCkgewotCQliNDNfYmxvY2tfcmVhZChkZXYsIHJ4aGRyLCBzaXplb2YoKnJ4aGRyKSwKKwkJYjQzX2Jsb2NrX3JlYWQoZGV2LCByeGhkciwgcnhoZHJfc2l6ZSwKIAkJCSAgICAgICBxLT5tbWlvX2Jhc2UgKyBCNDNfUElPOF9SWERBVEEsCiAJCQkgICAgICAgc2l6ZW9mKHUzMikpOwogCX0gZWxzZSB7Ci0JCWI0M19ibG9ja19yZWFkKGRldiwgcnhoZHIsIHNpemVvZigqcnhoZHIpLAorCQliNDNfYmxvY2tfcmVhZChkZXYsIHJ4aGRyLCByeGhkcl9zaXplLAogCQkJICAgICAgIHEtPm1taW9fYmFzZSArIEI0M19QSU9fUlhEQVRBLAogCQkJICAgICAgIHNpemVvZih1MTYpKTsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1Ni5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTYuYwppbmRleCBhMDFmNzc2Li5jZTAzN2ZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1Ni5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU2LmMKQEAgLTE1NzIsMTQgKzE1NzIsMTQgQEAKIAlbQjIwNTZfU1lOX1BMTF9YVEFMNV0JCT0geyAuZ2h6NSA9IDB4MDA3NywgLmdoejIgPSAweDAwNzcsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUExMX1hUQUw2XQkJPSB7IC5naHo1ID0gMHgwMDA3LCAuZ2h6MiA9IDB4MDAwNywgTk9VUExPQUQsIH0sCiAJW0IyMDU2X1NZTl9QTExfUkVGRElWXQkJPSB7IC5naHo1ID0gMHgwMDAxLCAuZ2h6MiA9IDB4MDAwMSwgTk9VUExPQUQsIH0sCi0JW0IyMDU2X1NZTl9QTExfUEZEXQkJPSB7IC5naHo1ID0gMHgwMDA0LCAuZ2h6MiA9IDB4MDAwNCwgTk9VUExPQUQsIH0sCisJW0IyMDU2X1NZTl9QTExfUEZEXQkJPSB7IC5naHo1ID0gMHgwMDA2LCAuZ2h6MiA9IDB4MDAwNiwgVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUExMX0NQMV0JCT0geyAuZ2h6NSA9IDB4MDAwZiwgLmdoejIgPSAweDAwMGYsIE5PVVBMT0FELCB9LAotCVtCMjA1Nl9TWU5fUExMX0NQMl0JCT0geyAuZ2h6NSA9IDB4MDAzMCwgLmdoejIgPSAweDAwMzAsIE5PVVBMT0FELCB9LAorCVtCMjA1Nl9TWU5fUExMX0NQMl0JCT0geyAuZ2h6NSA9IDB4MDAzZiwgLmdoejIgPSAweDAwM2YsIFVQTE9BRCwgfSwKIAlbQjIwNTZfU1lOX1BMTF9DUDNdCQk9IHsgLmdoejUgPSAweDAwMzIsIC5naHoyID0gMHgwMDMyLCBOT1VQTE9BRCwgfSwKLQlbQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSMV0JPSB7IC5naHo1ID0gMHgwMDBkLCAuZ2h6MiA9IDB4MDAwZCwgTk9VUExPQUQsIH0sCi0JW0IyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjJdCT0geyAuZ2h6NSA9IDB4MDAwZCwgLmdoejIgPSAweDAwMGQsIE5PVVBMT0FELCB9LAorCVtCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVIxXQk9IHsgLmdoejUgPSAweDAwMDYsIC5naHoyID0gMHgwMDA2LCBVUExPQUQsIH0sCisJW0IyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjJdCT0geyAuZ2h6NSA9IDB4MDAwNiwgLmdoejIgPSAweDAwMDYsIFVQTE9BRCwgfSwKIAlbQjIwNTZfU1lOX1BMTF9MT09QRklMVEVSM10JPSB7IC5naHo1ID0gMHgwMDA0LCAuZ2h6MiA9IDB4MDAwNCwgTk9VUExPQUQsIH0sCi0JW0IyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjRdCT0geyAuZ2h6NSA9IDB4MDAwNiwgLmdoejIgPSAweDAwMDYsIE5PVVBMT0FELCB9LAorCVtCMjA1Nl9TWU5fUExMX0xPT1BGSUxURVI0XQk9IHsgLmdoejUgPSAweDAwMmIsIC5naHoyID0gMHgwMDJiLCBVUExPQUQsIH0sCiAJW0IyMDU2X1NZTl9QTExfTE9PUEZJTFRFUjVdCT0geyAuZ2h6NSA9IDB4MDAwMSwgLmdoejIgPSAweDAwMDEsIE5PVVBMT0FELCB9LAogCVtCMjA1Nl9TWU5fUExMX01NRDFdCQk9IHsgLmdoejUgPSAweDAwMWMsIC5naHoyID0gMHgwMDFjLCBOT1VQTE9BRCwgfSwKIAlbQjIwNTZfU1lOX1BMTF9NTUQyXQkJPSB7IC5naHo1ID0gMHgwMDAyLCAuZ2h6MiA9IDB4MDAwMiwgTk9VUExPQUQsIH0sCkBAIC05MDU1LDYgKzkwNTUsMjEgQEAKIAkJCQlCMjA1Nl9SWDEsIHB0cy0+cngsIHB0cy0+cnhfbGVuZ3RoKTsKIH0KIAordm9pZCBiMjA1Nl91cGxvYWRfc3luX3BsbF9jcDIoc3RydWN0IGI0M193bGRldiAqZGV2LCBib29sIGdoejUpCit7CisJc3RydWN0IGIyMDU2X2luaXR0YWJzX3B0cyAqcHRzOworCWNvbnN0IHN0cnVjdCBiMjA1Nl9pbml0dGFiX2VudHJ5ICplOworCisJaWYgKGRldi0+cGh5LnJldiA+PSBBUlJBWV9TSVpFKGIyMDU2X2luaXR0YWJzKSkgeworCQlCNDNfV0FSTl9PTigxKTsKKwkJcmV0dXJuOworCX0KKwlwdHMgPSAmYjIwNTZfaW5pdHRhYnNbZGV2LT5waHkucmV2XTsKKwllID0gJnB0cy0+c3luW0IyMDU2X1NZTl9QTExfQ1AyXTsKKworCWI0M19yYWRpb193cml0ZShkZXYsIEIyMDU2X1NZTl9QTExfQ1AyLCBnaHo1ID8gZS0+Z2h6NSA6IGUtPmdoejIpOworfQorCiBjb25zdCBzdHJ1Y3QgYjQzX25waHlfY2hhbm5lbHRhYl9lbnRyeV9yZXYzICoKIGI0M19ucGh5X2dldF9jaGFudGFiZW50X3JldjMoc3RydWN0IGI0M193bGRldiAqZGV2LCB1MTYgZnJlcSkKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU2LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvcmFkaW9fMjA1Ni5oCmluZGV4IGE3MTU5ZDguLjViODY2NzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My9yYWRpb18yMDU2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3JhZGlvXzIwNTYuaApAQCAtMTA5MCw2ICsxMDkwLDcgQEAKIAogdm9pZCBiMjA1Nl91cGxvYWRfaW5pdHRhYnMoc3RydWN0IGI0M193bGRldiAqZGV2LAogCQkJICAgYm9vbCBnaHo1LCBib29sIGlnbm9yZV91cGxvYWRmbGFnKTsKK3ZvaWQgYjIwNTZfdXBsb2FkX3N5bl9wbGxfY3AyKHN0cnVjdCBiNDNfd2xkZXYgKmRldiwgYm9vbCBnaHo1KTsKIAogLyogR2V0IHRoZSBOUEhZIENoYW5uZWwgU3dpdGNoIFRhYmxlIGVudHJ5IGZvciBhIGNoYW5uZWwuCiAgKiBSZXR1cm5zIE5VTEwgb24gZmFpbHVyZSB0byBmaW5kIGFuIGVudHJ5LiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuYwppbmRleCA3YjMyNmYyLi5mN2RlZjEzNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmMKQEAgLTIxNzEsNiArMjE3MSw0OCBAQAogCTB4MDAwMCwgMHgwMDAwLAogfTsKIAorLyogdm9sYXRpbGUgIHRhYmxlcywgUEhZIHJldmlzaW9uID49IDMgKi8KKworLyogaW5kZXhlZCBieSBhbnRzd2N0bDJnICovCitzdGF0aWMgY29uc3QgdTE2IGI0M19udGFiX2FudHN3Y3RsMmdfcjNbNF1bMzJdID0geworCXsKKwkJMHgwMDgyLCAweDAwODIsIDB4MDIxMSwgMHgwMjIyLCAweDAzMjgsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDE0NCwgMHgwMDAwLAorCQkweDAwMDAsIDB4MDAwMCwgMHgwMTg4LCAweDAwMDAsIDB4MDAwMCwKKwkJMHgwMDAwLCAweDAwODIsIDB4MDA4MiwgMHgwMjExLCAweDAyMjIsCisJCTB4MDMyOCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMTQ0LAorCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAxODgsIDB4MDAwMCwKKwkJMHgwMDAwLCAweDAwMDAsCisJfSwKKwl7CisJCTB4MDAyMiwgMHgwMDIyLCAweDAwMTEsIDB4MDAyMiwgMHgwMDIyLAorCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMTEsIDB4MDAwMCwKKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAyMiwgMHgwMDAwLCAweDAwMDAsCisJCTB4MDAwMCwgMHgwMDIyLCAweDAwMjIsIDB4MDAxMSwgMHgwMDIyLAorCQkweDAwMjIsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAxMSwKKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDIyLCAweDAwMDAsCisJCTB4MDAwMCwgMHgwMDAwLAorCX0sCisJeworCQkweDAwODgsIDB4MDA4OCwgMHgwMDQ0LCAweDAwODgsIDB4MDA4OCwKKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDQ0LCAweDAwMDAsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwODgsIDB4MDAwMCwgMHgwMDAwLAorCQkweDAwMDAsIDB4MDA4OCwgMHgwMDg4LCAweDAwNDQsIDB4MDA4OCwKKwkJMHgwMDg4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwNDQsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDA4OCwgMHgwMDAwLAorCQkweDAwMDAsIDB4MDAwMCwKKwl9LAorCXsKKwkJMHgwMDIyLCAweDAwMjIsIDB4MDAxMSwgMHgwMDIyLCAweDAwMDAsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAxMSwgMHgwMDAwLAorCQkweDAwMDAsIDB4MDAwMCwgMHgwMDIyLCAweDAwMDAsIDB4MDAwMCwKKwkJMHgwM2NjLCAweDAwMjIsIDB4MDAyMiwgMHgwMDExLCAweDAwMjIsCisJCTB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDExLAorCQkweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMjIsIDB4MDAwMCwKKwkJMHgwMDAwLCAweDAzY2MsCisJfQorfTsKKwogLyogVFggZ2FpbiB0YWJsZXMgKi8KIGNvbnN0IHUzMiBiNDNfbnRhYl90eF9nYWluX3JldjBfMV8yW10gPSB7CiAJMHgwM2NjMmI0NCwgMHgwM2NjMmI0MiwgMHgwM2NjMmE0NCwgMHgwM2NjMmE0MiwKQEAgLTI2NTIsNyArMjY5NCw3IEBACiBjb25zdCBzMTYgdGJsX3R4X2ZpbHRlcl9jb2VmX3JldjRbN11bMTVdID0gewogCXsgIC0zNzcsICAgMTM3LCAgLTQwNywgICAyMDgsIC0xNTI3LAogCSAgICA5NTYsICAgIDkzLCAgIDE4NiwgICAgOTMsICAgMjMwLAotCSAgICAtNDQsICAgMjMwLCAgICAyMCwgIC0xOTEsICAgMjAxIH0sCisJICAgIC00NCwgICAyMzAsICAgMjAxLCAgLTE5MSwgICAyMDEgfSwKIAl7ICAgLTc3LCAgICAyMCwgICAtOTgsICAgIDQ5LCAgIC05MywKIAkgICAgIDYwLCAgICA1NiwgICAxMTEsICAgIDU2LCAgICAyNiwKIAkgICAgIC01LCAgICAyNiwgICAgMzQsICAgLTMyLCAgICAzNCB9LApAQCAtMjcxMCw3ICsyNzUyLDE4IEBACiAJeyAweDAwQzAsICA2LCAweEU3LCAweEY5LCAweEVDLCAweEZCIH0gIC8qIGZpZWxkID09IDB4NDAwMCAoZmxzIDE1KSAqLwogfTsKIAotc3RydWN0IG5waHlfZ2Fpbl9jdGxfd29ya2Fyb3VuZF9lbnRyeSBucGh5X2dhaW5fY3RsX3dvcmthcm91bmRbMl1bM10gPSB7CitzdHJ1Y3QgbnBoeV9nYWluX2N0bF93b3JrYXJvdW5kX2VudHJ5IG5waHlfZ2Fpbl9jdGxfd2FfcGh5Nl9yYWRpbzExX2doejIgPSB7CisJeyAxMCwgMTQsIDE5LCAyNyB9LAorCXsgLTUsIDYsIDEwLCAxNSB9LAorCXsgMHhBLCAweEEsIDB4QSwgMHhBLCAweEEsIDB4QSwgMHhBLCAweEEsIDB4QSwgMHhBIH0sCisJeyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCisJMHg0MjdFLAorCXsgMHg0MTNGLCAweDQxM0YsIDB4NDEzRiwgMHg0MTNGIH0sCisJMHgwMDdFLCAweDAwNjYsIDB4MTA3NCwKKwkweDE4LCAweDE4LCAweDE4LAorCTB4MDFEMCwgMHg1LAorfTsKK3N0cnVjdCBucGh5X2dhaW5fY3RsX3dvcmthcm91bmRfZW50cnkgbnBoeV9nYWluX2N0bF93b3JrYXJvdW5kWzJdWzRdID0gewogCXsgLyogMkdIeiAqLwogCQl7IC8qIFBIWSByZXYgMyAqLwogCQkJeyA3LCAxMSwgMTYsIDIzIH0sCkBAIC0yNzM0LDE1ICsyNzg3LDI2IEBACiAJCQkweDE4LCAweDE4LCAweDE4LAogCQkJMHgwMUExLCAweDUsCiAJCX0sCi0JCXsgLyogUEhZIHJldiA1KyAqLworCQl7IC8qIFBIWSByZXYgNSAqLwogCQkJeyA5LCAxMywgMTgsIDI2IH0sCiAJCQl7IC0zLCA3LCAxMSwgMTYgfSwKIAkJCXsgMHhBLCAweEEsIDB4QSwgMHhBLCAweEEsIDB4QSwgMHhBLCAweEEsIDB4QSwgMHhBIH0sCiAJCQl7IDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMgfSwKIAkJCTB4NDI3RSwgLyogaW52YWxpZCBmb3IgZXh0ZXJuYWwgTE5BISAqLwogCQkJeyAweDQxM0YsIDB4NDEzRiwgMHg0MTNGLCAweDQxM0YgfSwgLyogaW52YWxpZCBmb3IgZXh0ZXJuYWwgTE5BISAqLwotCQkJMHgxMDc2LCAweDAwNjYsIDB4MTA2QSwKLQkJCTB4QywgMHhDLCAweEMsCisJCQkweDEwNzYsIDB4MDA2NiwgMHgwMDAwLCAvKiBsb3cgaXMgaW52YWxpZCAodGhlIGxhc3Qgb25lKSAqLworCQkJMHgxOCwgMHgxOCwgMHgxOCwKKwkJCTB4MDFEMCwgMHg5LAorCQl9LAorCQl7IC8qIFBIWSByZXYgNisgKi8KKwkJCXsgOCwgMTMsIDE4LCAyNSB9LAorCQkJeyAtNSwgNiwgMTAsIDE0IH0sCisJCQl7IDB4QSwgMHhBLCAweEEsIDB4QSwgMHhBLCAweEEsIDB4QSwgMHhBLCAweEEsIDB4QSB9LAorCQkJeyAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLCAzIH0sCisJCQkweDUyN0UsIC8qIGludmFsaWQgZm9yIGV4dGVybmFsIExOQSEgKi8KKwkJCXsgMHg1MTNGLCAweDUxM0YsIDB4NTEzRiwgMHg1MTNGIH0sIC8qIGludmFsaWQgZm9yIGV4dGVybmFsIExOQSEgKi8KKwkJCTB4MTA3NiwgMHgwMDY2LCAweDAwMDAsIC8qIGxvdyBpcyBpbnZhbGlkICh0aGUgbGFzdCBvbmUpICovCisJCQkweDE4LCAweDE4LCAweDE4LAogCQkJMHgwMUQwLCAweDUsCiAJCX0sCiAJfSwKQEAgLTI3NjksNyArMjgzMyw3IEBACiAJCQkweDI0LCAweDI0LCAweDI0LAogCQkJMHgwMTA3LCAyNSwKIAkJfSwKLQkJeyAvKiBQSFkgcmV2IDUrICovCisJCXsgLyogUEhZIHJldiA1ICovCiAJCQl7IDYsIDEwLCAxNiwgMjEgfSwKIAkJCXsgLTcsIDAsIDQsIDggfSwKIAkJCXsgMHhELCAweEQsIDB4RCwgMHhELCAweEQsIDB4RCwgMHhELCAweEQsIDB4RCwgMHhEIH0sCkBAIC0yNzgwLDYgKzI4NDQsMTcgQEAKIAkJCTB4MjQsIDB4MjQsIDB4MjQsCiAJCQkweDAwQTksIDI1LAogCQl9LAorCQl7IC8qIFBIWSByZXYgNisgKi8KKwkJCXsgNiwgMTAsIDE2LCAyMSB9LAorCQkJeyAtNywgMCwgNCwgOCB9LAorCQkJeyAweEQsIDB4RCwgMHhELCAweEQsIDB4RCwgMHhELCAweEQsIDB4RCwgMHhELCAweEQgfSwKKwkJCXsgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCB9LAorCQkJMHg3MjlFLAorCQkJeyAweDcxNEYsIDB4NzE0RiwgMHg3MTRGLCAweDcxNEYgfSwKKwkJCTB4MDI5RSwgMHgyMDg0LCAweDIwODYsCisJCQkweDI0LCAweDI0LCAweDI0LCAvKiBsb3cgaXMgaW52YWxpZCBmb3IgcmFkaW8gcmV2IDExISAqLworCQkJMHgwMEYwLCAyNSwKKwkJfSwKIAl9LAogfTsKIApAQCAtMjgzOCw5ICsyOTEzLDggQEAKIAkJYnJlYWs7CiAJY2FzZSBCNDNfTlRBQl8zMkJJVDoKIAkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0FERFIsIG9mZnNldCk7Ci0JCXZhbHVlID0gYjQzX3BoeV9yZWFkKGRldiwgQjQzX05QSFlfVEFCTEVfREFUQUhJKTsKLQkJdmFsdWUgPDw9IDE2OwotCQl2YWx1ZSB8PSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8pOworCQl2YWx1ZSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFMTyk7CisJCXZhbHVlIHw9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFISSkgPDwgMTY7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUI0M19XQVJOX09OKDEpOwpAQCAtMjg2NCw2ICsyOTM4LDEyIEBACiAJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0FERFIsIG9mZnNldCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgbnJfZWxlbWVudHM7IGkrKykgeworCQkvKiBBdXRvIGluY3JlbWVudCBicm9rZW4gKyBjYWNoaW5nIGlzc3VlIG9uIEJDTTQzMjI0PyAqLworCQlpZiAoZGV2LT5kZXYtPmNoaXBfaWQgPT0gNDMyMjQgJiYgZGV2LT5kZXYtPmNoaXBfcmV2ID09IDEpIHsKKwkJCWI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFMTyk7CisJCQliNDNfcGh5X3dyaXRlKGRldiwgQjQzX05QSFlfVEFCTEVfQUREUiwgb2Zmc2V0ICsgaSk7CisJCX0KKwogCQlzd2l0Y2ggKHR5cGUpIHsKIAkJY2FzZSBCNDNfTlRBQl84QklUOgogCQkJKmRhdGEgPSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8pICYgMHhGRjsKQEAgLTI4NzQsOSArMjk1NCwxMCBAQAogCQkJZGF0YSArPSAyOwogCQkJYnJlYWs7CiAJCWNhc2UgQjQzX05UQUJfMzJCSVQ6Ci0JCQkqKCh1MzIgKilkYXRhKSA9IGI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFISSk7Ci0JCQkqKCh1MzIgKilkYXRhKSA8PD0gMTY7Ci0JCQkqKCh1MzIgKilkYXRhKSB8PSBiNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8pOworCQkJKigodTMyICopZGF0YSkgPQorCQkJCWI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFMTyk7CisJCQkqKCh1MzIgKilkYXRhKSB8PQorCQkJCWI0M19waHlfcmVhZChkZXYsIEI0M19OUEhZX1RBQkxFX0RBVEFISSkgPDwgMTY7CiAJCQlkYXRhICs9IDQ7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKQEAgLTI5MzIsNiArMzAxMywxMyBAQAogCWI0M19waHlfd3JpdGUoZGV2LCBCNDNfTlBIWV9UQUJMRV9BRERSLCBvZmZzZXQpOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2VsZW1lbnRzOyBpKyspIHsKKwkJLyogQXV0byBpbmNyZW1lbnQgYnJva2VuICsgY2FjaGluZyBpc3N1ZSBvbiBCQ000MzIyND8gKi8KKwkJaWYgKChvZmZzZXQgPj4gMTApID09IDkgJiYgZGV2LT5kZXYtPmNoaXBfaWQgPT0gNDMyMjQgJiYKKwkJICAgIGRldi0+ZGV2LT5jaGlwX3JldiA9PSAxKSB7CisJCQliNDNfcGh5X3JlYWQoZGV2LCBCNDNfTlBIWV9UQUJMRV9EQVRBTE8pOworCQkJYjQzX3BoeV93cml0ZShkZXYsIEI0M19OUEhZX1RBQkxFX0FERFIsIG9mZnNldCArIGkpOworCQl9CisKIAkJc3dpdGNoICh0eXBlKSB7CiAJCWNhc2UgQjQzX05UQUJfOEJJVDoKIAkJCXZhbHVlID0gKmRhdGE7CkBAIC0yOTk5LDYgKzMwODcsOCBAQAogCX0gd2hpbGUgKDApCiB2b2lkIGI0M19ucGh5X3JldjNwbHVzX3RhYmxlc19pbml0KHN0cnVjdCBiNDNfd2xkZXYgKmRldikKIHsKKwlzdHJ1Y3Qgc3NiX3Nwcm9tICpzcHJvbSA9IGRldi0+ZGV2LT5idXNfc3Byb207CisKIAkvKiBTdGF0aWMgdGFibGVzICovCiAJbnRhYl91cGxvYWRfcjMoZGV2LCBCNDNfTlRBQl9GUkFNRVNUUlVDVF9SMywgYjQzX250YWJfZnJhbWVzdHJ1Y3RfcjMpOwogCW50YWJfdXBsb2FkX3IzKGRldiwgQjQzX05UQUJfUElMT1RfUjMsIGI0M19udGFiX3BpbG90X3IzKTsKQEAgLTMwMjksNyArMzExOSwxMSBAQAogCW50YWJfdXBsb2FkX3IzKGRldiwgQjQzX05UQUJfQzFfTE9GRUVEVEhfUjMsIGI0M19udGFiX2xvZnRsdDFfcjMpOwogCiAJLyogVm9sYXRpbGUgdGFibGVzICovCi0JLyogVE9ETyAqLworCWlmIChzcHJvbS0+ZmVtLmdoejIuYW50c3dsdXQgPCBBUlJBWV9TSVpFKGI0M19udGFiX2FudHN3Y3RsMmdfcjMpKQorCQludGFiX3VwbG9hZF9yMyhkZXYsIEI0M19OVEFCX0FOVF9TV19DVExfUjMsCisJCQkgICAgICAgYjQzX250YWJfYW50c3djdGwyZ19yM1tzcHJvbS0+ZmVtLmdoejIuYW50c3dsdXRdKTsKKwllbHNlCisJCUI0M19XQVJOX09OKDEpOwogfQogCiBzdHJ1Y3QgbnBoeV9nYWluX2N0bF93b3JrYXJvdW5kX2VudHJ5ICpiNDNfbnBoeV9nZXRfZ2Fpbl9jdGxfd29ya2Fyb3VuZF9lbnQoCkBAIC0zMDM3LDI2ICszMTMxLDY3IEBACiB7CiAJc3RydWN0IG5waHlfZ2Fpbl9jdGxfd29ya2Fyb3VuZF9lbnRyeSAqZTsKIAl1OCBwaHlfaWR4OworCXU4IHRyX2lzbyA9IGdoejUgPyBkZXYtPmRldi0+YnVzX3Nwcm9tLT5mZW0uZ2h6NS50cl9pc28gOgorCQkJICAgZGV2LT5kZXYtPmJ1c19zcHJvbS0+ZmVtLmdoejIudHJfaXNvOworCisJaWYgKCFnaHo1ICYmIGRldi0+cGh5LnJldiA+PSA2ICYmIGRldi0+cGh5LnJhZGlvX3JldiA9PSAxMSkKKwkJcmV0dXJuICZucGh5X2dhaW5fY3RsX3dhX3BoeTZfcmFkaW8xMV9naHoyOwogCiAJQjQzX1dBUk5fT04oZGV2LT5waHkucmV2IDwgMyk7Ci0JaWYgKGRldi0+cGh5LnJldiA+PSA1KQorCWlmIChkZXYtPnBoeS5yZXYgPj0gNikKKwkJcGh5X2lkeCA9IDM7CisJZWxzZSBpZiAoZGV2LT5waHkucmV2ID09IDUpCiAJCXBoeV9pZHggPSAyOwogCWVsc2UgaWYgKGRldi0+cGh5LnJldiA9PSA0KQogCQlwaHlfaWR4ID0gMTsKIAllbHNlCiAJCXBoeV9pZHggPSAwOwotCiAJZSA9ICZucGh5X2dhaW5fY3RsX3dvcmthcm91bmRbZ2h6NV1bcGh5X2lkeF07CiAKLQkvKiBPbmx5IG9uZSBlbnRyeSBkaWZmZXJzIGZvciBleHRlcm5hbCBMTkEsIHNvIGluc3RlYWQgbWFraW5nIHdob2xlCi0JICogdGFibGUgMiB0aW1lcyBiaWdnZXIsIGhhY2sgaXMgaGVyZQotCSAqLwotCWlmICghZ2h6NSAmJiBkZXYtPnBoeS5yZXYgPj0gNSAmJiBleHRfbG5hKSB7Ci0JCWUtPnJmc2VxX2luaXRbMF0gJj0gMHgwRkZGOwotCQllLT5yZnNlcV9pbml0WzFdICY9IDB4MEZGRjsKLQkJZS0+cmZzZXFfaW5pdFsyXSAmPSAweDBGRkY7Ci0JCWUtPnJmc2VxX2luaXRbM10gJj0gMHgwRkZGOwotCQllLT5pbml0X2dhaW4gJj0gMHgwRkZGOworCS8qIFNvbWUgd29ya2Fyb3VuZHMgdG8gdGhlIHdvcmthcm91bmRzLi4uICovCisJaWYgKGdoejUgJiYgZGV2LT5waHkucmV2ID49IDYpIHsKKwkJaWYgKGRldi0+cGh5LnJhZGlvX3JldiA9PSAxMSAmJgorCQkgICAgIWI0M19jaGFubmVsX3R5cGVfaXNfNDBtaHooZGV2LT5waHkuY2hhbm5lbF90eXBlKSkKKwkJCWUtPmNsaXBsb19nYWluID0gMHgyZDsKKwl9IGVsc2UgaWYgKCFnaHo1ICYmIGRldi0+cGh5LnJldiA+PSA1KSB7CisJCWlmIChleHRfbG5hKSB7CisJCQllLT5yZnNlcV9pbml0WzBdICY9IH4weDQwMDA7CisJCQllLT5yZnNlcV9pbml0WzFdICY9IH4weDQwMDA7CisJCQllLT5yZnNlcV9pbml0WzJdICY9IH4weDQwMDA7CisJCQllLT5yZnNlcV9pbml0WzNdICY9IH4weDQwMDA7CisJCQllLT5pbml0X2dhaW4gJj0gfjB4NDAwMDsKKwkJfQorCQlzd2l0Y2ggKHRyX2lzbykgeworCQljYXNlIDA6CisJCQllLT5jbGlwbG9fZ2FpbiA9IDB4MDA2MjsKKwkJY2FzZSAxOgorCQkJZS0+Y2xpcGxvX2dhaW4gPSAweDAwNjQ7CisJCWNhc2UgMjoKKwkJCWUtPmNsaXBsb19nYWluID0gMHgwMDZhOworCQljYXNlIDM6CisJCQllLT5jbGlwbG9fZ2FpbiA9IDB4MTA2YTsKKwkJY2FzZSA0OgorCQkJZS0+Y2xpcGxvX2dhaW4gPSAweDEwNmM7CisJCWNhc2UgNToKKwkJCWUtPmNsaXBsb19nYWluID0gMHgxMDc0OworCQljYXNlIDY6CisJCQllLT5jbGlwbG9fZ2FpbiA9IDB4MTA3YzsKKwkJY2FzZSA3OgorCQkJZS0+Y2xpcGxvX2dhaW4gPSAweDIwN2M7CisJCWRlZmF1bHQ6CisJCQllLT5jbGlwbG9fZ2FpbiA9IDB4MTA2YTsKKwkJfQorCX0gZWxzZSBpZiAoZ2h6NSAmJiBkZXYtPnBoeS5yZXYgPT0gNCAmJiBleHRfbG5hKSB7CisJCWUtPnJmc2VxX2luaXRbMF0gJj0gfjB4NDAwMDsKKwkJZS0+cmZzZXFfaW5pdFsxXSAmPSB+MHg0MDAwOworCQllLT5yZnNlcV9pbml0WzJdICY9IH4weDQwMDA7CisJCWUtPnJmc2VxX2luaXRbM10gJj0gfjB4NDAwMDsKKwkJZS0+aW5pdF9nYWluICY9IH4weDQwMDA7CisJCWUtPnJmc2VxX2luaXRbMF0gfD0gMHgxMDAwOworCQllLT5yZnNlcV9pbml0WzFdIHw9IDB4MTAwMDsKKwkJZS0+cmZzZXFfaW5pdFsyXSB8PSAweDEwMDA7CisJCWUtPnJmc2VxX2luaXRbM10gfD0gMHgxMDAwOworCQllLT5pbml0X2dhaW4gfD0gMHgxMDAwOwogCX0KIAogCXJldHVybiBlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3RhYmxlc19ucGh5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuaAppbmRleCBhODE2OTZiLi45NzAzOGM0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMvdGFibGVzX25waHkuaApAQCAtMTI2LDI2ICsxMjYsMjkgQEAKICNkZWZpbmUgQjQzX05UQUJfQzFfTE9GRUVEVEgJCUI0M19OVEFCMTYoMHgxQiwgMHgxQzApIC8qIExvY2FsIE9zY2lsbGF0b3IgRmVlZCBUaHJvdWdoIExvb2t1cCBUYWJsZSBDb3JlIDEgKi8KICNkZWZpbmUgQjQzX05UQUJfQzFfTE9GRUVEVEhfU0laRQkxMjgKIAorLyogVm9sYXRpbGUgTi1QSFkgdGFibGVzLCBQSFkgcmV2aXNpb24gPj0gMyAqLworI2RlZmluZSBCNDNfTlRBQl9BTlRfU1dfQ1RMX1IzCQlCNDNfTlRBQjE2KCA5LCAgIDApIC8qIGFudGVubmEgc29mdHdhcmUgY29udHJvbCAqLworCiAvKiBTdGF0aWMgTi1QSFkgdGFibGVzLCBQSFkgcmV2aXNpb24gPj0gMyAqLwotI2RlZmluZSBCNDNfTlRBQl9GUkFNRVNUUlVDVF9SMwkJQjQzX05UQUIzMigxMCwgMDAwKSAvKiBmcmFtZSBzdHJ1Y3QgICovCi0jZGVmaW5lIEI0M19OVEFCX1BJTE9UX1IzCQlCNDNfTlRBQjE2KDExLCAwMDApIC8qIHBpbG90ICAqLwotI2RlZmluZSBCNDNfTlRBQl9UTUFQX1IzCQlCNDNfTlRBQjMyKDEyLCAwMDApIC8qIFRNIEFQICAqLwotI2RlZmluZSBCNDNfTlRBQl9JTlRMRVZFTF9SMwkJQjQzX05UQUIzMigxMywgMDAwKSAvKiBJTlQgTFYgICovCi0jZGVmaW5lIEI0M19OVEFCX1REVFJOX1IzCQlCNDNfTlRBQjMyKDE0LCAwMDApIC8qIFREIFRSTiAgKi8KLSNkZWZpbmUgQjQzX05UQUJfTk9JU0VWQVIwX1IzCQlCNDNfTlRBQjMyKDE2LCAwMDApIC8qIG5vaXNlIHZhcmlhbmNlIDAgICovCisjZGVmaW5lIEI0M19OVEFCX0ZSQU1FU1RSVUNUX1IzCQlCNDNfTlRBQjMyKDEwLCAgIDApIC8qIGZyYW1lIHN0cnVjdCAgKi8KKyNkZWZpbmUgQjQzX05UQUJfUElMT1RfUjMJCUI0M19OVEFCMTYoMTEsICAgMCkgLyogcGlsb3QgICovCisjZGVmaW5lIEI0M19OVEFCX1RNQVBfUjMJCUI0M19OVEFCMzIoMTIsICAgMCkgLyogVE0gQVAgICovCisjZGVmaW5lIEI0M19OVEFCX0lOVExFVkVMX1IzCQlCNDNfTlRBQjMyKDEzLCAgIDApIC8qIElOVCBMViAgKi8KKyNkZWZpbmUgQjQzX05UQUJfVERUUk5fUjMJCUI0M19OVEFCMzIoMTQsICAgMCkgLyogVEQgVFJOICAqLworI2RlZmluZSBCNDNfTlRBQl9OT0lTRVZBUjBfUjMJCUI0M19OVEFCMzIoMTYsICAgMCkgLyogbm9pc2UgdmFyaWFuY2UgMCAgKi8KICNkZWZpbmUgQjQzX05UQUJfTk9JU0VWQVIxX1IzCQlCNDNfTlRBQjMyKDE2LCAxMjgpIC8qIG5vaXNlIHZhcmlhbmNlIDEgICovCi0jZGVmaW5lIEI0M19OVEFCX01DU19SMwkJCUI0M19OVEFCMTYoMTgsIDAwMCkgLyogTUNTICAqLworI2RlZmluZSBCNDNfTlRBQl9NQ1NfUjMJCQlCNDNfTlRBQjE2KDE4LCAgIDApIC8qIE1DUyAgKi8KICNkZWZpbmUgQjQzX05UQUJfVERJMjBBMF9SMwkJQjQzX05UQUIzMigxOSwgMTI4KSAvKiBUREkgMjAvMCAgKi8KICNkZWZpbmUgQjQzX05UQUJfVERJMjBBMV9SMwkJQjQzX05UQUIzMigxOSwgMjU2KSAvKiBUREkgMjAvMSAgKi8KICNkZWZpbmUgQjQzX05UQUJfVERJNDBBMF9SMwkJQjQzX05UQUIzMigxOSwgNjQwKSAvKiBUREkgNDAvMCAgKi8KICNkZWZpbmUgQjQzX05UQUJfVERJNDBBMV9SMwkJQjQzX05UQUIzMigxOSwgNzY4KSAvKiBUREkgNDAvMSAgKi8KLSNkZWZpbmUgQjQzX05UQUJfUElMT1RMVF9SMwkJQjQzX05UQUIzMigyMCwgMDAwKSAvKiBQTFQgbG9va3VwICAqLwotI2RlZmluZSBCNDNfTlRBQl9DSEFORVNUX1IzCQlCNDNfTlRBQjMyKDIyLCAwMDApIC8qIGNoYW5uZWwgZXN0aW1hdGUgICovCi0jZGVmaW5lIEI0M19OVEFCX0ZSQU1FTFRfUjMJCUI0M19OVEFCOCAoMjQsIDAwMCkgLyogZnJhbWUgbG9va3VwICAqLwotI2RlZmluZSBCNDNfTlRBQl9DMF9FU1RQTFRfUjMJCUI0M19OVEFCOCAoMjYsIDAwMCkgLyogZXN0aW1hdGVkIHBvd2VyIGxvb2t1cCAwICAqLwotI2RlZmluZSBCNDNfTlRBQl9DMV9FU1RQTFRfUjMJCUI0M19OVEFCOCAoMjcsIDAwMCkgLyogZXN0aW1hdGVkIHBvd2VyIGxvb2t1cCAxICAqLwotI2RlZmluZSBCNDNfTlRBQl9DMF9BREpQTFRfUjMJCUI0M19OVEFCOCAoMjYsIDA2NCkgLyogYWRqdXN0ZWQgcG93ZXIgbG9va3VwIDAgICovCi0jZGVmaW5lIEI0M19OVEFCX0MxX0FESlBMVF9SMwkJQjQzX05UQUI4ICgyNywgMDY0KSAvKiBhZGp1c3RlZCBwb3dlciBsb29rdXAgMSAgKi8KKyNkZWZpbmUgQjQzX05UQUJfUElMT1RMVF9SMwkJQjQzX05UQUIzMigyMCwgICAwKSAvKiBQTFQgbG9va3VwICAqLworI2RlZmluZSBCNDNfTlRBQl9DSEFORVNUX1IzCQlCNDNfTlRBQjMyKDIyLCAgIDApIC8qIGNoYW5uZWwgZXN0aW1hdGUgICovCisjZGVmaW5lIEI0M19OVEFCX0ZSQU1FTFRfUjMJCSBCNDNfTlRBQjgoMjQsICAgMCkgLyogZnJhbWUgbG9va3VwICAqLworI2RlZmluZSBCNDNfTlRBQl9DMF9FU1RQTFRfUjMJCSBCNDNfTlRBQjgoMjYsICAgMCkgLyogZXN0aW1hdGVkIHBvd2VyIGxvb2t1cCAwICAqLworI2RlZmluZSBCNDNfTlRBQl9DMV9FU1RQTFRfUjMJCSBCNDNfTlRBQjgoMjcsICAgMCkgLyogZXN0aW1hdGVkIHBvd2VyIGxvb2t1cCAxICAqLworI2RlZmluZSBCNDNfTlRBQl9DMF9BREpQTFRfUjMJCSBCNDNfTlRBQjgoMjYsICA2NCkgLyogYWRqdXN0ZWQgcG93ZXIgbG9va3VwIDAgICovCisjZGVmaW5lIEI0M19OVEFCX0MxX0FESlBMVF9SMwkJIEI0M19OVEFCOCgyNywgIDY0KSAvKiBhZGp1c3RlZCBwb3dlciBsb29rdXAgMSAgKi8KICNkZWZpbmUgQjQzX05UQUJfQzBfR0FJTkNUTF9SMwkJQjQzX05UQUIzMigyNiwgMTkyKSAvKiBnYWluIGNvbnRyb2wgbG9va3VwIDAgICovCiAjZGVmaW5lIEI0M19OVEFCX0MxX0dBSU5DVExfUjMJCUI0M19OVEFCMzIoMjcsIDE5MikgLyogZ2FpbiBjb250cm9sIGxvb2t1cCAxICAqLwogI2RlZmluZSBCNDNfTlRBQl9DMF9JUUxUX1IzCQlCNDNfTlRBQjMyKDI2LCAzMjApIC8qIEkvUSBsb29rdXAgMCAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My94bWl0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDMveG1pdC5jCmluZGV4IDVmNzdjYmUuLjJjNTM2NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0My94bWl0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzL3htaXQuYwpAQCAtODc0LDcgKzg3NCw3IEBACiAJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnJlcG9ydCwKIAkJCSAgICAgIGNvbnN0IHN0cnVjdCBiNDNfdHhzdGF0dXMgKnN0YXR1cykKIHsKLQlib29sIGZyYW1lX3N1Y2Nlc3MgPSAxOworCWJvb2wgZnJhbWVfc3VjY2VzcyA9IHRydWU7CiAJaW50IHJldHJ5X2xpbWl0OwogCiAJLyogcHJlc2VydmUgdGhlIGNvbmZpdXJlZCByZXRyeSBsaW1pdCBiZWZvcmUgY2xlYXJpbmcgdGhlIHN0YXR1cwpAQCAtODkwLDcgKzg5MCw3IEBACiAJCS8qIFRoZSBmcmFtZSB3YXMgbm90IEFDS2VkLi4uICovCiAJCWlmICghKHJlcG9ydC0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpIHsKIAkJCS8qIC4uLmJ1dCB3ZSBleHBlY3RlZCBhbiBBQ0suICovCi0JCQlmcmFtZV9zdWNjZXNzID0gMDsKKwkJCWZyYW1lX3N1Y2Nlc3MgPSBmYWxzZTsKIAkJfQogCX0KIAlpZiAoc3RhdHVzLT5mcmFtZV9jb3VudCA9PSAwKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvYjQzbGVnYWN5LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvYjQzbGVnYWN5LmgKaW5kZXggMWQ0ZmM5ZC4uOThlM2Q0NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2I0M2xlZ2FjeS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9iNDNsZWdhY3kuaApAQCAtNTYwLDggKzU2MCwxNiBAQAogCXU4IGFsZ29yaXRobTsKIH07CiAKKyNkZWZpbmUgQjQzbGVnYWN5X1FPU19RVUVVRV9OVU0JNAorCiBzdHJ1Y3QgYjQzbGVnYWN5X3dsZGV2OwogCisvKiBRT1MgcGFyYW1ldGVycyBmb3IgYSBxdWV1ZS4gKi8KK3N0cnVjdCBiNDNsZWdhY3lfcW9zX3BhcmFtcyB7CisJLyogVGhlIFFPUyBwYXJhbWV0ZXJzICovCisJc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgcDsKK307CisKIC8qIERhdGEgc3RydWN0dXJlIGZvciB0aGUgV0xBTiBwYXJ0cyAoODAyLjExIGNvcmVzKSBvZiB0aGUgYjQzbGVnYWN5IGNoaXAuICovCiBzdHJ1Y3QgYjQzbGVnYWN5X3dsIHsKIAkvKiBQb2ludGVyIHRvIHRoZSBhY3RpdmUgd2lyZWxlc3MgZGV2aWNlIG9uIHRoaXMgY2hpcCAqLwpAQCAtNjExLDYgKzYxOSwxOCBAQAogCWJvb2wgYmVhY29uMV91cGxvYWRlZDsKIAlib29sIGJlYWNvbl90ZW1wbGF0ZXNfdmlyZ2luOyAvKiBOZXZlciB3cm90ZSB0aGUgdGVtcGxhdGVzPyAqLwogCXN0cnVjdCB3b3JrX3N0cnVjdCBiZWFjb25fdXBkYXRlX3RyaWdnZXI7CisJLyogVGhlIGN1cnJlbnQgUU9TIHBhcmFtZXRlcnMgZm9yIHRoZSA0IHF1ZXVlcy4gKi8KKwlzdHJ1Y3QgYjQzbGVnYWN5X3Fvc19wYXJhbXMgcW9zX3BhcmFtc1tCNDNsZWdhY3lfUU9TX1FVRVVFX05VTV07CisKKwkvKiBQYWNrZXQgdHJhbnNtaXQgd29yayAqLworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrOworCisJLyogUXVldWUgb2YgcGFja2V0cyB0byBiZSB0cmFuc21pdHRlZC4gKi8KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3F1ZXVlW0I0M2xlZ2FjeV9RT1NfUVVFVUVfTlVNXTsKKworCS8qIEZsYWcgdGhhdCBpbXBsZW1lbnQgdGhlIHF1ZXVlcyBzdG9wcGluZy4gKi8KKwlib29sIHR4X3F1ZXVlX3N0b3BwZWRbQjQzbGVnYWN5X1FPU19RVUVVRV9OVU1dOworCiB9OwogCiAvKiBQb2ludGVycyB0byB0aGUgZmlybXdhcmUgZGF0YSBhbmQgbWV0YSBpbmZvcm1hdGlvbiBhYm91dCBpdC4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9kbWEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9kbWEuYwppbmRleCBjNTUzNWFkLi5mMWY4YmQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvZG1hLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2RtYS5jCkBAIC03MTUsNyArNzE1LDcgQEAKIAlyaW5nLT5tbWlvX2Jhc2UgPSBiNDNsZWdhY3lfZG1hY29udHJvbGxlcl9iYXNlKHR5cGUsIGNvbnRyb2xsZXJfaW5kZXgpOwogCXJpbmctPmluZGV4ID0gY29udHJvbGxlcl9pbmRleDsKIAlpZiAoZm9yX3R4KSB7Ci0JCXJpbmctPnR4ID0gMTsKKwkJcmluZy0+dHggPSB0cnVlOwogCQlyaW5nLT5jdXJyZW50X3Nsb3QgPSAtMTsKIAl9IGVsc2UgewogCQlpZiAocmluZy0+aW5kZXggPT0gMCkgewpAQCAtNzI3LDcgKzcyNyw2IEBACiAJCX0gZWxzZQogCQkJQjQzbGVnYWN5X1dBUk5fT04oMSk7CiAJfQotCXNwaW5fbG9ja19pbml0KCZyaW5nLT5sb2NrKTsKICNpZmRlZiBDT05GSUdfQjQzTEVHQUNZX0RFQlVHCiAJcmluZy0+bGFzdF9pbmplY3RlZF9vdmVyZmxvdyA9IGppZmZpZXM7CiAjZW5kaWYKQEAgLTgwNiw3ICs4MDUsNyBAQAogc3RhdGljIGludCBiNDNsZWdhY3lfZG1hX3NldF9tYXNrKHN0cnVjdCBiNDNsZWdhY3lfd2xkZXYgKmRldiwgdTY0IG1hc2spCiB7CiAJdTY0IG9yaWdfbWFzayA9IG1hc2s7Ci0JYm9vbCBmYWxsYmFjayA9IDA7CisJYm9vbCBmYWxsYmFjayA9IGZhbHNlOwogCWludCBlcnI7CiAKIAkvKiBUcnkgdG8gc2V0IHRoZSBETUEgbWFzay4gSWYgaXQgZmFpbHMsIHRyeSBmYWxsaW5nIGJhY2sgdG8gYQpAQCAtODIwLDEyICs4MTksMTIgQEAKIAkJfQogCQlpZiAobWFzayA9PSBETUFfQklUX01BU0soNjQpKSB7CiAJCQltYXNrID0gRE1BX0JJVF9NQVNLKDMyKTsKLQkJCWZhbGxiYWNrID0gMTsKKwkJCWZhbGxiYWNrID0gdHJ1ZTsKIAkJCWNvbnRpbnVlOwogCQl9CiAJCWlmIChtYXNrID09IERNQV9CSVRfTUFTSygzMikpIHsKIAkJCW1hc2sgPSBETUFfQklUX01BU0soMzApOwotCQkJZmFsbGJhY2sgPSAxOworCQkJZmFsbGJhY2sgPSB0cnVlOwogCQkJY29udGludWU7CiAJCX0KIAkJYjQzbGVnYWN5ZXJyKGRldi0+d2wsICJUaGUgbWFjaGluZS9rZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCAiCkBAIC04NTgsNyArODU3LDcgQEAKICNpZmRlZiBDT05GSUdfQjQzTEVHQUNZX1BJTwogCQliNDNsZWdhY3l3YXJuKGRldi0+d2wsICJETUEgZm9yIHRoaXMgZGV2aWNlIG5vdCBzdXBwb3J0ZWQuICIKIAkJCSJGYWxsaW5nIGJhY2sgdG8gUElPXG4iKTsKLQkJZGV2LT5fX3VzaW5nX3BpbyA9IDE7CisJCWRldi0+X191c2luZ19waW8gPSB0cnVlOwogCQlyZXR1cm4gLUVBR0FJTjsKICNlbHNlCiAJCWI0M2xlZ2FjeWVycihkZXYtPndsLCAiRE1BIGZvciB0aGlzIGRldmljZSBub3Qgc3VwcG9ydGVkIGFuZCAiCkBAIC0xMDY4LDcgKzEwNjcsNyBAQAogCW1lbXNldChtZXRhLCAwLCBzaXplb2YoKm1ldGEpKTsKIAogCW1ldGEtPnNrYiA9IHNrYjsKLQltZXRhLT5pc19sYXN0X2ZyYWdtZW50ID0gMTsKKwltZXRhLT5pc19sYXN0X2ZyYWdtZW50ID0gdHJ1ZTsKIAogCW1ldGEtPmRtYWFkZHIgPSBtYXBfZGVzY2J1ZmZlcihyaW5nLCBza2ItPmRhdGEsIHNrYi0+bGVuLCAxKTsKIAkvKiBjcmVhdGUgYSBib3VuY2UgYnVmZmVyIGluIHpvbmVfZG1hIG9uIG1hcHBpbmcgZmFpbHVyZS4gKi8KQEAgLTExNDQsMTAgKzExNDMsOCBAQAogewogCXN0cnVjdCBiNDNsZWdhY3lfZG1hcmluZyAqcmluZzsKIAlpbnQgZXJyID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcmluZyA9IHByaW9yaXR5X3RvX3R4cmluZyhkZXYsIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmluZy0+bG9jaywgZmxhZ3MpOwogCUI0M2xlZ2FjeV9XQVJOX09OKCFyaW5nLT50eCk7CiAKIAlpZiAodW5saWtlbHkocmluZy0+c3RvcHBlZCkpIHsKQEAgLTExNTcsMTYgKzExNTQsMTQgQEAKIAkJICogRm9yIG5vdywganVzdCByZWZ1c2UgdGhlIHRyYW5zbWl0LiAqLwogCQlpZiAoYjQzbGVnYWN5X2RlYnVnKGRldiwgQjQzbGVnYWN5X0RCR19ETUFWRVJCT1NFKSkKIAkJCWI0M2xlZ2FjeWVycihkZXYtPndsLCAiUGFja2V0IGFmdGVyIHF1ZXVlIHN0b3BwZWRcbiIpOwotCQllcnIgPSAtRU5PU1BDOwotCQlnb3RvIG91dF91bmxvY2s7CisJCXJldHVybiAtRU5PU1BDOwogCX0KIAogCWlmICh1bmxpa2VseShXQVJOX09OKGZyZWVfc2xvdHMocmluZykgPCBTTE9UU19QRVJfUEFDS0VUKSkpIHsKIAkJLyogSWYgd2UgZ2V0IGhlcmUsIHdlIGhhdmUgYSByZWFsIGVycm9yIHdpdGggdGhlIHF1ZXVlCiAJCSAqIGZ1bGwsIGJ1dCBxdWV1ZXMgbm90IHN0b3BwZWQuICovCiAJCWI0M2xlZ2FjeWVycihkZXYtPndsLCAiRE1BIHF1ZXVlIG92ZXJmbG93XG4iKTsKLQkJZXJyID0gLUVOT1NQQzsKLQkJZ290byBvdXRfdW5sb2NrOworCQlyZXR1cm4gLUVOT1NQQzsKIAl9CiAKIAkvKiBkbWFfdHhfZnJhZ21lbnQgbWlnaHQgcmVhbGxvY2F0ZSB0aGUgc2tiLCBzbyBpbnZhbGlkYXRlIHBvaW50ZXJzIHBvaW50aW5nCkBAIC0xMTc2LDI1ICsxMTcxLDIzIEBACiAJCS8qIERyb3AgdGhpcyBwYWNrZXQsIGFzIHdlIGRvbid0IGhhdmUgdGhlIGVuY3J5cHRpb24ga2V5CiAJCSAqIGFueW1vcmUgYW5kIG11c3Qgbm90IHRyYW5zbWl0IGl0IHVuZW5jcnlwdGVkLiAqLwogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQllcnIgPSAwOwotCQlnb3RvIG91dF91bmxvY2s7CisJCXJldHVybiAwOwogCX0KIAlpZiAodW5saWtlbHkoZXJyKSkgewogCQliNDNsZWdhY3llcnIoZGV2LT53bCwgIkRNQSB0eCBtYXBwaW5nIGZhaWx1cmVcbiIpOwotCQlnb3RvIG91dF91bmxvY2s7CisJCXJldHVybiBlcnI7CiAJfQogCWlmICgoZnJlZV9zbG90cyhyaW5nKSA8IFNMT1RTX1BFUl9QQUNLRVQpIHx8CiAJICAgIHNob3VsZF9pbmplY3Rfb3ZlcmZsb3cocmluZykpIHsKIAkJLyogVGhpcyBUWCByaW5nIGlzIGZ1bGwuICovCi0JCWllZWU4MDIxMV9zdG9wX3F1ZXVlKGRldi0+d2wtPmh3LCB0eHJpbmdfdG9fcHJpb3JpdHkocmluZykpOwotCQlyaW5nLT5zdG9wcGVkID0gMTsKKwkJdW5zaWduZWQgaW50IHNrYl9tYXBwaW5nID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7CisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKGRldi0+d2wtPmh3LCBza2JfbWFwcGluZyk7CisJCWRldi0+d2wtPnR4X3F1ZXVlX3N0b3BwZWRbc2tiX21hcHBpbmddID0gMTsKKwkJcmluZy0+c3RvcHBlZCA9IHRydWU7CiAJCWlmIChiNDNsZWdhY3lfZGVidWcoZGV2LCBCNDNsZWdhY3lfREJHX0RNQVZFUkJPU0UpKQogCQkJYjQzbGVnYWN5ZGJnKGRldi0+d2wsICJTdG9wcGVkIFRYIHJpbmcgJWRcbiIsCiAJCQkgICAgICAgcmluZy0+aW5kZXgpOwogCX0KLW91dF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmluZy0+bG9jaywgZmxhZ3MpOwotCiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMTIwNSwxNCArMTE5OCwyOSBAQAogCXN0cnVjdCBiNDNsZWdhY3lfZG1hZGVzY19tZXRhICptZXRhOwogCWludCByZXRyeV9saW1pdDsKIAlpbnQgc2xvdDsKKwlpbnQgZmlyc3R1c2VkOwogCiAJcmluZyA9IHBhcnNlX2Nvb2tpZShkZXYsIHN0YXR1cy0+Y29va2llLCAmc2xvdCk7CiAJaWYgKHVubGlrZWx5KCFyaW5nKSkKIAkJcmV0dXJuOwotCUI0M2xlZ2FjeV9XQVJOX09OKCFpcnFzX2Rpc2FibGVkKCkpOwotCXNwaW5fbG9jaygmcmluZy0+bG9jayk7Ci0KIAlCNDNsZWdhY3lfV0FSTl9PTighcmluZy0+dHgpOworCisJLyogU2FuaXR5IGNoZWNrOiBUWCBwYWNrZXRzIGFyZSBwcm9jZXNzZWQgaW4tb3JkZXIgb24gb25lIHJpbmcuCisJICogQ2hlY2sgaWYgdGhlIHNsb3QgZGVkdWNlZCBmcm9tIHRoZSBjb29raWUgcmVhbGx5IGlzIHRoZSBmaXJzdAorCSAqIHVzZWQgc2xvdC4gKi8KKwlmaXJzdHVzZWQgPSByaW5nLT5jdXJyZW50X3Nsb3QgLSByaW5nLT51c2VkX3Nsb3RzICsgMTsKKwlpZiAoZmlyc3R1c2VkIDwgMCkKKwkJZmlyc3R1c2VkID0gcmluZy0+bnJfc2xvdHMgKyBmaXJzdHVzZWQ7CisJaWYgKHVubGlrZWx5KHNsb3QgIT0gZmlyc3R1c2VkKSkgeworCQkvKiBUaGlzIHBvc3NpYmx5IGlzIGEgZmlybXdhcmUgYnVnIGFuZCB3aWxsIHJlc3VsdCBpbgorCQkgKiBtYWxmdW5jdGlvbiwgbWVtb3J5IGxlYWtzIGFuZC9vciBzdGFsbCBvZiBETUEgZnVuY3Rpb25hbGl0eS4KKwkJICovCisJCWI0M2xlZ2FjeWRiZyhkZXYtPndsLCAiT3V0IG9mIG9yZGVyIFRYIHN0YXR1cyByZXBvcnQgb24gRE1BICIKKwkJCSAgICAgInJpbmcgJWQuIEV4cGVjdGVkICVkLCBidXQgZ290ICVkXG4iLAorCQkJICAgICByaW5nLT5pbmRleCwgZmlyc3R1c2VkLCBzbG90KTsKKwkJcmV0dXJuOworCX0KKwogCXdoaWxlICgxKSB7CiAJCUI0M2xlZ2FjeV9XQVJOX09OKCEoc2xvdCA+PSAwICYmIHNsb3QgPCByaW5nLT5ucl9zbG90cykpOwogCQlvcDMyX2lkeDJkZXNjKHJpbmcsIHNsb3QsICZtZXRhKTsKQEAgLTEyODUsMTQgKzEyOTMsMjEgQEAKIAlkZXYtPnN0YXRzLmxhc3RfdHggPSBqaWZmaWVzOwogCWlmIChyaW5nLT5zdG9wcGVkKSB7CiAJCUI0M2xlZ2FjeV9XQVJOX09OKGZyZWVfc2xvdHMocmluZykgPCBTTE9UU19QRVJfUEFDS0VUKTsKLQkJaWVlZTgwMjExX3dha2VfcXVldWUoZGV2LT53bC0+aHcsIHR4cmluZ190b19wcmlvcml0eShyaW5nKSk7Ci0JCXJpbmctPnN0b3BwZWQgPSAwOwotCQlpZiAoYjQzbGVnYWN5X2RlYnVnKGRldiwgQjQzbGVnYWN5X0RCR19ETUFWRVJCT1NFKSkKLQkJCWI0M2xlZ2FjeWRiZyhkZXYtPndsLCAiV29rZSB1cCBUWCByaW5nICVkXG4iLAotCQkJICAgICAgIHJpbmctPmluZGV4KTsKKwkJcmluZy0+c3RvcHBlZCA9IGZhbHNlOwogCX0KIAotCXNwaW5fdW5sb2NrKCZyaW5nLT5sb2NrKTsKKwlpZiAoZGV2LT53bC0+dHhfcXVldWVfc3RvcHBlZFtyaW5nLT5xdWV1ZV9wcmlvXSkgeworCQlkZXYtPndsLT50eF9xdWV1ZV9zdG9wcGVkW3JpbmctPnF1ZXVlX3ByaW9dID0gMDsKKwl9IGVsc2UgeworCQkvKiBJZiB0aGUgZHJpdmVyIHF1ZXVlIGlzIHJ1bm5pbmcgd2FrZSB0aGUgY29ycmVzcG9uZGluZworCQkgKiBtYWM4MDIxMSBxdWV1ZS4gKi8KKwkJaWVlZTgwMjExX3dha2VfcXVldWUoZGV2LT53bC0+aHcsIHJpbmctPnF1ZXVlX3ByaW8pOworCQlpZiAoYjQzbGVnYWN5X2RlYnVnKGRldiwgQjQzbGVnYWN5X0RCR19ETUFWRVJCT1NFKSkKKwkJCWI0M2xlZ2FjeWRiZyhkZXYtPndsLCAiV29rZSB1cCBUWCByaW5nICVkXG4iLAorCQkJCSAgICAgcmluZy0+aW5kZXgpOworCX0KKwkvKiBBZGQgd29yayB0byB0aGUgcXVldWUuICovCisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoZGV2LT53bC0+aHcsICZkZXYtPndsLT50eF93b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgZG1hX3J4KHN0cnVjdCBiNDNsZWdhY3lfZG1hcmluZyAqcmluZywKQEAgLTE0MTUsMjIgKzE0MzAsMTQgQEAKIAogc3RhdGljIHZvaWQgYjQzbGVnYWN5X2RtYV90eF9zdXNwZW5kX3Jpbmcoc3RydWN0IGI0M2xlZ2FjeV9kbWFyaW5nICpyaW5nKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcmluZy0+bG9jaywgZmxhZ3MpOwogCUI0M2xlZ2FjeV9XQVJOX09OKCFyaW5nLT50eCk7CiAJb3AzMl90eF9zdXNwZW5kKHJpbmcpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJpbmctPmxvY2ssIGZsYWdzKTsKIH0KIAogc3RhdGljIHZvaWQgYjQzbGVnYWN5X2RtYV90eF9yZXN1bWVfcmluZyhzdHJ1Y3QgYjQzbGVnYWN5X2RtYXJpbmcgKnJpbmcpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyaW5nLT5sb2NrLCBmbGFncyk7CiAJQjQzbGVnYWN5X1dBUk5fT04oIXJpbmctPnR4KTsKIAlvcDMyX3R4X3Jlc3VtZShyaW5nKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyaW5nLT5sb2NrLCBmbGFncyk7CiB9CiAKIHZvaWQgYjQzbGVnYWN5X2RtYV90eF9zdXNwZW5kKHN0cnVjdCBiNDNsZWdhY3lfd2xkZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9kbWEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9kbWEuaAppbmRleCA1MDRhNTg3Li5jMzI4MmY5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvZG1hLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2RtYS5oCkBAIC0xNTAsOCArMTUwLDkgQEAKIAllbnVtIGI0M2xlZ2FjeV9kbWF0eXBlIHR5cGU7CiAJLyogQm9vbGVhbi4gSXMgdGhpcyByaW5nIHN0b3BwZWQgYXQgaWVlZTgwMjExIGxldmVsPyAqLwogCWJvb2wgc3RvcHBlZDsKLQkvKiBMb2NrLCBvbmx5IHVzZWQgZm9yIFRYLiAqLwotCXNwaW5sb2NrX3QgbG9jazsKKwkvKiBUaGUgUU9TIHByaW9yaXR5IGFzc2lnbmVkIHRvIHRoaXMgcmluZy4gT25seSB1c2VkIGZvciBUWCByaW5ncy4KKwkgKiBUaGlzIGlzIHRoZSBtYWM4MDIxMSAicXVldWUiIHZhbHVlLiAqLworCXU4IHF1ZXVlX3ByaW87CiAJc3RydWN0IGI0M2xlZ2FjeV93bGRldiAqZGV2OwogI2lmZGVmIENPTkZJR19CNDNMRUdBQ1lfREVCVUcKIAkvKiBNYXhpbXVtIG51bWJlciBvZiB1c2VkIHNsb3RzLiAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2xlZHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9sZWRzLmMKaW5kZXggMmYxYmZkYy4uZmQ0NTY1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L2xlZHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbGVkcy5jCkBAIC0yMDMsMTEgKzIwMywxMSBAQAogCQlpZiAoc3Byb21baV0gPT0gMHhGRikgewogCQkJLyogVGhlcmUgaXMgbm8gTEVEIGluZm9ybWF0aW9uIGluIHRoZSBTUFJPTQogCQkJICogZm9yIHRoaXMgTEVELiBIYXJkY29kZSBpdCBoZXJlLiAqLwotCQkJYWN0aXZlbG93ID0gMDsKKwkJCWFjdGl2ZWxvdyA9IGZhbHNlOwogCQkJc3dpdGNoIChpKSB7CiAJCQljYXNlIDA6CiAJCQkJYmVoYXZpb3VyID0gQjQzbGVnYWN5X0xFRF9BQ1RJVklUWTsKLQkJCQlhY3RpdmVsb3cgPSAxOworCQkJCWFjdGl2ZWxvdyA9IHRydWU7CiAJCQkJaWYgKGJ1cy0+Ym9hcmRpbmZvLnZlbmRvciA9PSBQQ0lfVkVORE9SX0lEX0NPTVBBUSkKIAkJCQkJYmVoYXZpb3VyID0gQjQzbGVnYWN5X0xFRF9SQURJT19BTEw7CiAJCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L21haW4uYwppbmRleCAyMGYwMjQzLi43NWU3MGJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2I0M2xlZ2FjeS9tYWluLmMKQEAgLTcyMiw5ICs3MjIsOSBAQAogCW1hY2N0bCAmPSB+QjQzbGVnYWN5X01BQ0NUTF9HTU9ERTsKIAlpZiAoZmxhZ3MgJiBCNDNsZWdhY3lfVE1TTE9XX0dNT0RFKSB7CiAJCW1hY2N0bCB8PSBCNDNsZWdhY3lfTUFDQ1RMX0dNT0RFOwotCQlkZXYtPnBoeS5nbW9kZSA9IDE7CisJCWRldi0+cGh5Lmdtb2RlID0gdHJ1ZTsKIAl9IGVsc2UKLQkJZGV2LT5waHkuZ21vZGUgPSAwOworCQlkZXYtPnBoeS5nbW9kZSA9IGZhbHNlOwogCW1hY2N0bCB8PSBCNDNsZWdhY3lfTUFDQ1RMX0lIUl9FTkFCTEVEOwogCWI0M2xlZ2FjeV93cml0ZTMyKGRldiwgQjQzbGVnYWN5X01NSU9fTUFDQ1RMLCBtYWNjdGwpOwogfQpAQCAtODExLDcgKzgxMSw3IEBACiAJaWYgKGRldi0+bm9pc2VjYWxjLmNhbGN1bGF0aW9uX3J1bm5pbmcpCiAJCXJldHVybjsKIAlkZXYtPm5vaXNlY2FsYy5jaGFubmVsX2F0X3N0YXJ0ID0gZGV2LT5waHkuY2hhbm5lbDsKLQlkZXYtPm5vaXNlY2FsYy5jYWxjdWxhdGlvbl9ydW5uaW5nID0gMTsKKwlkZXYtPm5vaXNlY2FsYy5jYWxjdWxhdGlvbl9ydW5uaW5nID0gdHJ1ZTsKIAlkZXYtPm5vaXNlY2FsYy5ucl9zYW1wbGVzID0gMDsKIAogCWI0M2xlZ2FjeV9nZW5lcmF0ZV9ub2lzZV9zYW1wbGUoZGV2KTsKQEAgLTg3Myw3ICs4NzMsNyBAQAogCiAJCWRldi0+c3RhdHMubGlua19ub2lzZSA9IGF2ZXJhZ2U7CiBkcm9wX2NhbGN1bGF0aW9uOgotCQlkZXYtPm5vaXNlY2FsYy5jYWxjdWxhdGlvbl9ydW5uaW5nID0gMDsKKwkJZGV2LT5ub2lzZWNhbGMuY2FsY3VsYXRpb25fcnVubmluZyA9IGZhbHNlOwogCQlyZXR1cm47CiAJfQogZ2VuZXJhdGVfbmV3OgpAQCAtODg5LDcgKzg4OSw3IEBACiAJCQliNDNsZWdhY3lfcG93ZXJfc2F2aW5nX2N0bF9iaXRzKGRldiwgLTEsIC0xKTsKIAl9CiAJaWYgKGI0M2xlZ2FjeV9pc19tb2RlKGRldi0+d2wsIE5MODAyMTFfSUZUWVBFX0FESE9DKSkKLQkJZGV2LT5kZnFfdmFsaWQgPSAxOworCQlkZXYtPmRmcV92YWxpZCA9IHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9pcnFfYXRpbV9lbmQoc3RydWN0IGI0M2xlZ2FjeV93bGRldiAqZGV2KQpAQCAtODk4LDcgKzg5OCw3IEBACiAJCWI0M2xlZ2FjeV93cml0ZTMyKGRldiwgQjQzbGVnYWN5X01NSU9fTUFDQ01ELAogCQkJCSAgYjQzbGVnYWN5X3JlYWQzMihkZXYsIEI0M2xlZ2FjeV9NTUlPX01BQ0NNRCkKIAkJCQkgIHwgQjQzbGVnYWN5X01BQ0NNRF9ERlFfVkFMSUQpOwotCQlkZXYtPmRmcV92YWxpZCA9IDA7CisJCWRldi0+ZGZxX3ZhbGlkID0gZmFsc2U7CiAJfQogfQogCkBAIC05NzEsNyArOTcxLDcgQEAKIAl1bnNpZ25lZCBpbnQgaSwgbGVuLCB2YXJpYWJsZV9sZW47CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9tZ210ICpiY247CiAJY29uc3QgdTggKmllOwotCWJvb2wgdGltX2ZvdW5kID0gMDsKKwlib29sIHRpbV9mb3VuZCA9IGZhbHNlOwogCXVuc2lnbmVkIGludCByYXRlOwogCXUxNiBjdGw7CiAJaW50IGFudGVubmE7CkBAIC0xMDE5LDcgKzEwMTksNyBAQAogCQkJLyogQSB2YWxpZCBUSU0gaXMgYXQgbGVhc3QgNCBieXRlcyBsb25nLiAqLwogCQkJaWYgKGllX2xlbiA8IDQpCiAJCQkJYnJlYWs7Ci0JCQl0aW1fZm91bmQgPSAxOworCQkJdGltX2ZvdW5kID0gdHJ1ZTsKIAogCQkJdGltX3Bvc2l0aW9uID0gc2l6ZW9mKHN0cnVjdCBiNDNsZWdhY3lfcGxjcF9oZHI2KTsKIAkJCXRpbV9wb3NpdGlvbiArPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsCkBAIC0xMTcyLDcgKzExNzIsNyBAQAogCSAqICAgICAgICBidXQgd2UgZG9uJ3QgdXNlIHRoYXQgZmVhdHVyZSBhbnl3YXkuICovCiAJYjQzbGVnYWN5X3dyaXRlX3Byb2JlX3Jlc3BfdGVtcGxhdGUoZGV2LCAweDI2OCwgMHg0QSwKIAkJCQkgICAgICAmX19iNDNsZWdhY3lfcmF0ZXRhYmxlWzNdKTsKLQl3bC0+YmVhY29uMF91cGxvYWRlZCA9IDE7CisJd2wtPmJlYWNvbjBfdXBsb2FkZWQgPSB0cnVlOwogfQogCiBzdGF0aWMgdm9pZCBiNDNsZWdhY3lfdXBsb2FkX2JlYWNvbjEoc3RydWN0IGI0M2xlZ2FjeV93bGRldiAqZGV2KQpAQCAtMTE4Miw3ICsxMTgyLDcgQEAKIAlpZiAod2wtPmJlYWNvbjFfdXBsb2FkZWQpCiAJCXJldHVybjsKIAliNDNsZWdhY3lfd3JpdGVfYmVhY29uX3RlbXBsYXRlKGRldiwgMHg0NjgsIDB4MUEpOwotCXdsLT5iZWFjb24xX3VwbG9hZGVkID0gMTsKKwl3bC0+YmVhY29uMV91cGxvYWRlZCA9IHRydWU7CiB9CiAKIHN0YXRpYyB2b2lkIGhhbmRsZV9pcnFfYmVhY29uKHN0cnVjdCBiNDNsZWdhY3lfd2xkZXYgKmRldikKQEAgLTEyMTIsNyArMTIxMiw3IEBACiAJaWYgKHVubGlrZWx5KHdsLT5iZWFjb25fdGVtcGxhdGVzX3ZpcmdpbikpIHsKIAkJLyogV2UgbmV2ZXIgdXBsb2FkZWQgYSBiZWFjb24gYmVmb3JlLgogCQkgKiBVcGxvYWQgYm90aCB0ZW1wbGF0ZXMgbm93LCBidXQgb25seSBtYXJrIG9uZSB2YWxpZC4gKi8KLQkJd2wtPmJlYWNvbl90ZW1wbGF0ZXNfdmlyZ2luID0gMDsKKwkJd2wtPmJlYWNvbl90ZW1wbGF0ZXNfdmlyZ2luID0gZmFsc2U7CiAJCWI0M2xlZ2FjeV91cGxvYWRfYmVhY29uMChkZXYpOwogCQliNDNsZWdhY3lfdXBsb2FkX2JlYWNvbjEoZGV2KTsKIAkJY21kID0gYjQzbGVnYWN5X3JlYWQzMihkZXYsIEI0M2xlZ2FjeV9NTUlPX01BQ0NNRCk7CkBAIC0xMjc1LDggKzEyNzUsOCBAQAogCWlmICh3bC0+Y3VycmVudF9iZWFjb24pCiAJCWRldl9rZnJlZV9za2JfYW55KHdsLT5jdXJyZW50X2JlYWNvbik7CiAJd2wtPmN1cnJlbnRfYmVhY29uID0gYmVhY29uOwotCXdsLT5iZWFjb24wX3VwbG9hZGVkID0gMDsKLQl3bC0+YmVhY29uMV91cGxvYWRlZCA9IDA7CisJd2wtPmJlYWNvbjBfdXBsb2FkZWQgPSBmYWxzZTsKKwl3bC0+YmVhY29uMV91cGxvYWRlZCA9IGZhbHNlOwogCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywgJndsLT5iZWFjb25fdXBkYXRlX3RyaWdnZXIpOwogfQogCkBAIC0yNDQwLDMwICsyNDQwLDY0IEBACiAJcmV0dXJuIGVycjsKIH0KIAorc3RhdGljIHZvaWQgYjQzbGVnYWN5X3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBiNDNsZWdhY3lfd2wgKndsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBiNDNsZWdhY3lfd2wsCisJCQkJICB0eF93b3JrKTsKKwlzdHJ1Y3QgYjQzbGVnYWN5X3dsZGV2ICpkZXY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcXVldWVfbnVtOworCWludCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKKwlkZXYgPSB3bC0+Y3VycmVudF9kZXY7CisJaWYgKHVubGlrZWx5KCFkZXYgfHwgYjQzbGVnYWN5X3N0YXR1cyhkZXYpIDwgQjQzbGVnYWN5X1NUQVRfU1RBUlRFRCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJZm9yIChxdWV1ZV9udW0gPSAwOyBxdWV1ZV9udW0gPCBCNDNsZWdhY3lfUU9TX1FVRVVFX05VTTsgcXVldWVfbnVtKyspIHsKKwkJd2hpbGUgKHNrYl9xdWV1ZV9sZW4oJndsLT50eF9xdWV1ZVtxdWV1ZV9udW1dKSkgeworCQkJc2tiID0gc2tiX2RlcXVldWUoJndsLT50eF9xdWV1ZVtxdWV1ZV9udW1dKTsKKwkJCWlmIChiNDNsZWdhY3lfdXNpbmdfcGlvKGRldikpCisJCQkJZXJyID0gYjQzbGVnYWN5X3Bpb190eChkZXYsIHNrYik7CisJCQllbHNlCisJCQkJZXJyID0gYjQzbGVnYWN5X2RtYV90eChkZXYsIHNrYik7CisJCQlpZiAoZXJyID09IC1FTk9TUEMpIHsKKwkJCQl3bC0+dHhfcXVldWVfc3RvcHBlZFtxdWV1ZV9udW1dID0gMTsKKwkJCQlpZWVlODAyMTFfc3RvcF9xdWV1ZSh3bC0+aHcsIHF1ZXVlX251bSk7CisJCQkJc2tiX3F1ZXVlX2hlYWQoJndsLT50eF9xdWV1ZVtxdWV1ZV9udW1dLCBza2IpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHVubGlrZWx5KGVycikpCisJCQkJZGV2X2tmcmVlX3NrYihza2IpOyAvKiBEcm9wIGl0ICovCisJCQllcnIgPSAwOworCQl9CisKKwkJaWYgKCFlcnIpCisJCQl3bC0+dHhfcXVldWVfc3RvcHBlZFtxdWV1ZV9udW1dID0gMDsKKwl9CisKKwltdXRleF91bmxvY2soJndsLT5tdXRleCk7Cit9CisKIHN0YXRpYyB2b2lkIGI0M2xlZ2FjeV9vcF90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBiNDNsZWdhY3lfd2wgKndsID0gaHdfdG9fYjQzbGVnYWN5X3dsKGh3KTsKLQlzdHJ1Y3QgYjQzbGVnYWN5X3dsZGV2ICpkZXYgPSB3bC0+Y3VycmVudF9kZXY7Ci0JaW50IGVyciA9IC1FTk9ERVY7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh1bmxpa2VseSghZGV2KSkKLQkJZ290byBvdXQ7Ci0JaWYgKHVubGlrZWx5KGI0M2xlZ2FjeV9zdGF0dXMoZGV2KSA8IEI0M2xlZ2FjeV9TVEFUX1NUQVJURUQpKQotCQlnb3RvIG91dDsKLQkvKiBETUEtVFggaXMgZG9uZSB3aXRob3V0IGEgZ2xvYmFsIGxvY2suICovCi0JaWYgKGI0M2xlZ2FjeV91c2luZ19waW8oZGV2KSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPmlycV9sb2NrLCBmbGFncyk7Ci0JCWVyciA9IGI0M2xlZ2FjeV9waW9fdHgoZGV2LCBza2IpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3bC0+aXJxX2xvY2ssIGZsYWdzKTsKLQl9IGVsc2UKLQkJZXJyID0gYjQzbGVnYWN5X2RtYV90eChkZXYsIHNrYik7Ci1vdXQ6Ci0JaWYgKHVubGlrZWx5KGVycikpIHsKLQkJLyogRHJvcCB0aGUgcGFja2V0LiAqLworCWlmICh1bmxpa2VseShza2ItPmxlbiA8IDIgKyAyICsgNikpIHsKKwkJLyogVG9vIHNob3J0LCB0aGlzIGNhbid0IGJlIGEgdmFsaWQgZnJhbWUuICovCiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJCXJldHVybjsKIAl9CisJQjQzbGVnYWN5X1dBUk5fT04oc2tiX3NoaW5mbyhza2IpLT5ucl9mcmFncyk7CisKKwlza2JfcXVldWVfdGFpbCgmd2wtPnR4X3F1ZXVlW3NrYi0+cXVldWVfbWFwcGluZ10sIHNrYik7CisJaWYgKCF3bC0+dHhfcXVldWVfc3RvcHBlZFtza2ItPnF1ZXVlX21hcHBpbmddKQorCQlpZWVlODAyMTFfcXVldWVfd29yayh3bC0+aHcsICZ3bC0+dHhfd29yayk7CisJZWxzZQorCQlpZWVlODAyMTFfc3RvcF9xdWV1ZSh3bC0+aHcsIHNrYi0+cXVldWVfbWFwcGluZyk7CiB9CiAKIHN0YXRpYyBpbnQgYjQzbGVnYWN5X29wX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCkBAIC0yNTEwLDcgKzI1NDQsNyBAQAogCQlpZiAoZC0+cGh5LnBvc3NpYmxlX3BoeW1vZGVzICYgcGh5bW9kZSkgewogCQkJLyogT2ssIHRoaXMgZGV2aWNlIHN1cHBvcnRzIHRoZSBQSFktbW9kZS4KIAkJCSAqIFNldCB0aGUgZ21vZGUgYml0LiAqLwotCQkJKmdtb2RlID0gMTsKKwkJCSpnbW9kZSA9IHRydWU7CiAJCQkqZGV2ID0gZDsKIAogCQkJcmV0dXJuIDA7CkBAIC0yNTQ2LDcgKzI1ODAsNyBAQAogCXN0cnVjdCBiNDNsZWdhY3lfd2xkZXYgKnVuaW5pdGlhbGl6ZWRfdmFyKHVwX2Rldik7CiAJc3RydWN0IGI0M2xlZ2FjeV93bGRldiAqZG93bl9kZXY7CiAJaW50IGVycjsKLQlib29sIGdtb2RlID0gMDsKKwlib29sIGdtb2RlID0gZmFsc2U7CiAJaW50IHByZXZfc3RhdHVzOwogCiAJZXJyID0gZmluZF93bGRldl9mb3JfcGh5bW9kZSh3bCwgbmV3X21vZGUsICZ1cF9kZXYsICZnbW9kZSk7CkBAIC0yODc5LDYgKzI5MTMsNyBAQAogewogCXN0cnVjdCBiNDNsZWdhY3lfd2wgKndsID0gZGV2LT53bDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBxdWV1ZV9udW07CiAKIAlpZiAoYjQzbGVnYWN5X3N0YXR1cyhkZXYpIDwgQjQzbGVnYWN5X1NUQVRfU1RBUlRFRCkKIAkJcmV0dXJuOwpAQCAtMjg5OCwxMSArMjkzMywxNiBAQAogCS8qIE11c3QgdW5sb2NrIGFzIGl0IHdvdWxkIG90aGVyd2lzZSBkZWFkbG9jay4gTm8gcmFjZXMgaGVyZS4KIAkgKiBDYW5jZWwgdGhlIHBvc3NpYmx5IHJ1bm5pbmcgc2VsZi1yZWFybWluZyBwZXJpb2RpYyB3b3JrLiAqLwogCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmZGV2LT5wZXJpb2RpY193b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZ3bC0+dHhfd29yayk7CiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAotCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyh3bC0+aHcpOyAvKiBGSVhNRSB0aGlzIGNvdWxkIGNhdXNlIGEgZGVhZGxvY2sgKi8KKwkvKiBEcmFpbiBhbGwgVFggcXVldWVzLiAqLworCWZvciAocXVldWVfbnVtID0gMDsgcXVldWVfbnVtIDwgQjQzbGVnYWN5X1FPU19RVUVVRV9OVU07IHF1ZXVlX251bSsrKSB7CisJCXdoaWxlIChza2JfcXVldWVfbGVuKCZ3bC0+dHhfcXVldWVbcXVldWVfbnVtXSkpCisJCQlkZXZfa2ZyZWVfc2tiKHNrYl9kZXF1ZXVlKCZ3bC0+dHhfcXVldWVbcXVldWVfbnVtXSkpOworCX0KIAotCWI0M2xlZ2FjeV9tYWNfc3VzcGVuZChkZXYpOworYjQzbGVnYWN5X21hY19zdXNwZW5kKGRldik7CiAJZnJlZV9pcnEoZGV2LT5kZXYtPmlycSwgZGV2KTsKIAliNDNsZWdhY3lkYmcod2wsICJXaXJlbGVzcyBpbnRlcmZhY2Ugc3RvcHBlZFxuIik7CiB9CkBAIC0zMDQ0LDEyICszMDg0LDEyIEBACiAKIAkvKiBBc3N1bWUgdGhlIHJhZGlvIGlzIGVuYWJsZWQuIElmIGl0J3Mgbm90IGVuYWJsZWQsIHRoZSBzdGF0ZSB3aWxsCiAJICogaW1tZWRpYXRlbHkgZ2V0IGZpeGVkIG9uIHRoZSBmaXJzdCBwZXJpb2RpYyB3b3JrIHJ1bi4gKi8KLQlkZXYtPnJhZGlvX2h3X2VuYWJsZSA9IDE7CisJZGV2LT5yYWRpb19od19lbmFibGUgPSB0cnVlOwogCiAJcGh5LT5zYXZlZHBjdGxyZWcgPSAweEZGRkY7Ci0JcGh5LT5hY2lfZW5hYmxlID0gMDsKLQlwaHktPmFjaV93bGFuX2F1dG9tYXRpYyA9IDA7Ci0JcGh5LT5hY2lfaHdfcnNzaSA9IDA7CisJcGh5LT5hY2lfZW5hYmxlID0gZmFsc2U7CisJcGh5LT5hY2lfd2xhbl9hdXRvbWF0aWMgPSBmYWxzZTsKKwlwaHktPmFjaV9od19yc3NpID0gZmFsc2U7CiAKIAlsbyA9IHBoeS0+X2xvX3BhaXJzOwogCWlmIChsbykKQEAgLTMwODEsNyArMzEyMSw3IEBACiBzdGF0aWMgdm9pZCBzZXR1cF9zdHJ1Y3Rfd2xkZXZfZm9yX2luaXQoc3RydWN0IGI0M2xlZ2FjeV93bGRldiAqZGV2KQogewogCS8qIEZsYWdzICovCi0JZGV2LT5kZnFfdmFsaWQgPSAwOworCWRldi0+ZGZxX3ZhbGlkID0gZmFsc2U7CiAKIAkvKiBTdGF0cyAqLwogCW1lbXNldCgmZGV2LT5zdGF0cywgMCwgc2l6ZW9mKGRldi0+c3RhdHMpKTsKQEAgLTMxODcsOSArMzIyNyw5IEBACiAJcGh5LT5sb2ZjYWwgPSAweEZGRkY7CiAJcGh5LT5pbml0dmFsID0gMHhGRkZGOwogCi0JcGh5LT5hY2lfZW5hYmxlID0gMDsKLQlwaHktPmFjaV93bGFuX2F1dG9tYXRpYyA9IDA7Ci0JcGh5LT5hY2lfaHdfcnNzaSA9IDA7CisJcGh5LT5hY2lfZW5hYmxlID0gZmFsc2U7CisJcGh5LT5hY2lfd2xhbl9hdXRvbWF0aWMgPSBmYWxzZTsKKwlwaHktPmFjaV9od19yc3NpID0gZmFsc2U7CiAKIAlwaHktPmFudGVubmFfZGl2ZXJzaXR5ID0gMHhGRkZGOwogCW1lbXNldChwaHktPm1pbmxvd3NpZywgMHhGRiwgc2l6ZW9mKHBoeS0+bWlubG93c2lnKSk7CkBAIC0zMzU1LDcgKzMzOTUsNyBAQAogCWI0M2xlZ2FjeWRiZyh3bCwgIkFkZGluZyBJbnRlcmZhY2UgdHlwZSAlZFxuIiwgdmlmLT50eXBlKTsKIAogCWRldiA9IHdsLT5jdXJyZW50X2RldjsKLQl3bC0+b3BlcmF0aW5nID0gMTsKKwl3bC0+b3BlcmF0aW5nID0gdHJ1ZTsKIAl3bC0+dmlmID0gdmlmOwogCXdsLT5pZl90eXBlID0gdmlmLT50eXBlOwogCW1lbWNweSh3bC0+bWFjX2FkZHIsIHZpZi0+YWRkciwgRVRIX0FMRU4pOwpAQCAtMzM4OSw3ICszNDI5LDcgQEAKIAlCNDNsZWdhY3lfV0FSTl9PTih3bC0+dmlmICE9IHZpZik7CiAJd2wtPnZpZiA9IE5VTEw7CiAKLQl3bC0+b3BlcmF0aW5nID0gMDsKKwl3bC0+b3BlcmF0aW5nID0gZmFsc2U7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPmlycV9sb2NrLCBmbGFncyk7CiAJYjQzbGVnYWN5X2FkanVzdF9vcG1vZGUoZGV2KTsKQEAgLTM0MTMsMTAgKzM0NTMsMTAgQEAKIAltZW1zZXQod2wtPmJzc2lkLCAwLCBFVEhfQUxFTik7CiAJbWVtc2V0KHdsLT5tYWNfYWRkciwgMCwgRVRIX0FMRU4pOwogCXdsLT5maWx0ZXJfZmxhZ3MgPSAwOwotCXdsLT5iZWFjb24wX3VwbG9hZGVkID0gMDsKLQl3bC0+YmVhY29uMV91cGxvYWRlZCA9IDA7Ci0Jd2wtPmJlYWNvbl90ZW1wbGF0ZXNfdmlyZ2luID0gMTsKLQl3bC0+cmFkaW9fZW5hYmxlZCA9IDE7CisJd2wtPmJlYWNvbjBfdXBsb2FkZWQgPSBmYWxzZTsKKwl3bC0+YmVhY29uMV91cGxvYWRlZCA9IGZhbHNlOworCXdsLT5iZWFjb25fdGVtcGxhdGVzX3ZpcmdpbiA9IHRydWU7CisJd2wtPnJhZGlvX2VuYWJsZWQgPSB0cnVlOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIApAQCAtMzQ1NSw3ICszNDk1LDcgQEAKIAlpZiAoYjQzbGVnYWN5X3N0YXR1cyhkZXYpID49IEI0M2xlZ2FjeV9TVEFUX1NUQVJURUQpCiAJCWI0M2xlZ2FjeV93aXJlbGVzc19jb3JlX3N0b3AoZGV2KTsKIAliNDNsZWdhY3lfd2lyZWxlc3NfY29yZV9leGl0KGRldik7Ci0Jd2wtPnJhZGlvX2VuYWJsZWQgPSAwOworCXdsLT5yYWRpb19lbmFibGVkID0gZmFsc2U7CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogfQogCkBAIC0zNjE0LDcgKzM2NTQsNyBAQAogCQloYXZlX2JwaHkgPSAxOwogCiAJZGV2LT5waHkuZ21vZGUgPSAoaGF2ZV9ncGh5IHx8IGhhdmVfYnBoeSk7Ci0JZGV2LT5waHkucmFkaW9fb24gPSAxOworCWRldi0+cGh5LnJhZGlvX29uID0gdHJ1ZTsKIAl0bXAgPSBkZXYtPnBoeS5nbW9kZSA/IEI0M2xlZ2FjeV9UTVNMT1dfR01PREUgOiAwOwogCWI0M2xlZ2FjeV93aXJlbGVzc19jb3JlX3Jlc2V0KGRldiwgdG1wKTsKIApAQCAtMzcwNSw3ICszNzQ1LDcgQEAKIAkJICAgICAodm9pZCAoKikodW5zaWduZWQgbG9uZykpYjQzbGVnYWN5X2ludGVycnVwdF90YXNrbGV0LAogCQkgICAgICh1bnNpZ25lZCBsb25nKXdsZGV2KTsKIAlpZiAobW9kcGFyYW1fcGlvKQotCQl3bGRldi0+X191c2luZ19waW8gPSAxOworCQl3bGRldi0+X191c2luZ19waW8gPSB0cnVlOwogCUlOSVRfTElTVF9IRUFEKCZ3bGRldi0+bGlzdCk7CiAKIAllcnIgPSBiNDNsZWdhY3lfd2lyZWxlc3NfY29yZV9hdHRhY2god2xkZXYpOwpAQCAtMzc0OCw2ICszNzg4LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlzdHJ1Y3QgYjQzbGVnYWN5X3dsICp3bDsKIAlpbnQgZXJyID0gLUVOT01FTTsKKwlpbnQgcXVldWVfbnVtOwogCiAJYjQzbGVnYWN5X3Nwcm9tX2ZpeHVwKGRldi0+YnVzKTsKIApAQCAtMzc4Miw2ICszODIzLDEzIEBACiAJbXV0ZXhfaW5pdCgmd2wtPm11dGV4KTsKIAlJTklUX0xJU1RfSEVBRCgmd2wtPmRldmxpc3QpOwogCUlOSVRfV09SSygmd2wtPmJlYWNvbl91cGRhdGVfdHJpZ2dlciwgYjQzbGVnYWN5X2JlYWNvbl91cGRhdGVfdHJpZ2dlcl93b3JrKTsKKwlJTklUX1dPUksoJndsLT50eF93b3JrLCBiNDNsZWdhY3lfdHhfd29yayk7CisKKwkvKiBJbml0aWFsaXplIHF1ZXVlcyBhbmQgZmxhZ3MuICovCisJZm9yIChxdWV1ZV9udW0gPSAwOyBxdWV1ZV9udW0gPCBCNDNsZWdhY3lfUU9TX1FVRVVFX05VTTsgcXVldWVfbnVtKyspIHsKKwkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmd2wtPnR4X3F1ZXVlW3F1ZXVlX251bV0pOworCQl3bC0+dHhfcXVldWVfc3RvcHBlZFtxdWV1ZV9udW1dID0gMDsKKwl9CiAKIAlzc2Jfc2V0X2RldnR5cGVkYXRhKGRldiwgd2wpOwogCWI0M2xlZ2FjeWluZm8od2wsICJCcm9hZGNvbSAlMDRYIFdMQU4gZm91bmQgKGNvcmUgcmV2aXNpb24gJXUpXG4iLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYjQzbGVnYWN5L3JhZGlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmFkaW8uYwppbmRleCA0NzVlYjE0Li5mY2JhZmNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmFkaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9iNDNsZWdhY3kvcmFkaW8uYwpAQCAtMTA2Nyw3ICsxMDY3LDcgQEAKIAkJaWYgKGI0M2xlZ2FjeV9waHlfcmVhZChkZXYsIDB4MDAzMykgJiAweDA4MDApCiAJCQlicmVhazsKIAotCQlwaHktPmFjaV9lbmFibGUgPSAxOworCQlwaHktPmFjaV9lbmFibGUgPSB0cnVlOwogCiAJCXBoeV9zdGFja3NhdmUoQjQzbGVnYWN5X1BIWV9SQURJT19CSVRGSUVMRCk7CiAJCXBoeV9zdGFja3NhdmUoQjQzbGVnYWN5X1BIWV9HX0NSUyk7CkBAIC0xMjc5LDcgKzEyNzksNyBAQAogCQlpZiAoIShiNDNsZWdhY3lfcGh5X3JlYWQoZGV2LCAweDAwMzMpICYgMHgwODAwKSkKIAkJCWJyZWFrOwogCi0JCXBoeS0+YWNpX2VuYWJsZSA9IDA7CisJCXBoeS0+YWNpX2VuYWJsZSA9IGZhbHNlOwogCiAJCXBoeV9zdGFja3Jlc3RvcmUoQjQzbGVnYWN5X1BIWV9SQURJT19CSVRGSUVMRCk7CiAJCXBoeV9zdGFja3Jlc3RvcmUoQjQzbGVnYWN5X1BIWV9HX0NSUyk7CkBAIC0xMzQ2LDEwICsxMzQ2LDEwIEBACiAJICAgIChwaHktPnJldiA9PSAwKSB8fCAoIXBoeS0+Z21vZGUpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXBoeS0+YWNpX3dsYW5fYXV0b21hdGljID0gMDsKKwlwaHktPmFjaV93bGFuX2F1dG9tYXRpYyA9IGZhbHNlOwogCXN3aXRjaCAobW9kZSkgewogCWNhc2UgQjQzbGVnYWN5X1JBRElPX0lOVEVSRk1PREVfQVVUT1dMQU46Ci0JCXBoeS0+YWNpX3dsYW5fYXV0b21hdGljID0gMTsKKwkJcGh5LT5hY2lfd2xhbl9hdXRvbWF0aWMgPSB0cnVlOwogCQlpZiAocGh5LT5hY2lfZW5hYmxlKQogCQkJbW9kZSA9IEI0M2xlZ2FjeV9SQURJT19JTlRFUkZNT0RFX01BTlVBTFdMQU47CiAJCWVsc2UKQEAgLTEzNzEsOCArMTM3MSw4IEBACiAJCQkJCQkJCWN1cnJlbnRtb2RlKTsKIAogCWlmIChtb2RlID09IEI0M2xlZ2FjeV9SQURJT19JTlRFUkZNT0RFX05PTkUpIHsKLQkJcGh5LT5hY2lfZW5hYmxlID0gMDsKLQkJcGh5LT5hY2lfaHdfcnNzaSA9IDA7CisJCXBoeS0+YWNpX2VuYWJsZSA9IGZhbHNlOworCQlwaHktPmFjaV9od19yc3NpID0gZmFsc2U7CiAJfSBlbHNlCiAJCWI0M2xlZ2FjeV9yYWRpb19pbnRlcmZlcmVuY2VfbWl0aWdhdGlvbl9lbmFibGUoZGV2LCBtb2RlKTsKIAlwaHktPmludGVyZm1vZGUgPSBtb2RlOwpAQCAtMjEwMiw3ICsyMTAyLDcgQEAKIAkJCQkJICAgIHBoeS0+cmFkaW9fb2ZmX2NvbnRleHQucmZvdmVyKTsKIAkJCWI0M2xlZ2FjeV9waHlfd3JpdGUoZGV2LCBCNDNsZWdhY3lfUEhZX1JGT1ZFUlZBTCwKIAkJCQkJICAgIHBoeS0+cmFkaW9fb2ZmX2NvbnRleHQucmZvdmVydmFsKTsKLQkJCXBoeS0+cmFkaW9fb2ZmX2NvbnRleHQudmFsaWQgPSAwOworCQkJcGh5LT5yYWRpb19vZmZfY29udGV4dC52YWxpZCA9IGZhbHNlOwogCQl9CiAJCWNoYW5uZWwgPSBwaHktPmNoYW5uZWw7CiAJCWVyciA9IGI0M2xlZ2FjeV9yYWRpb19zZWxlY3RjaGFubmVsKGRldiwKQEAgLTIxMTMsNyArMjExMyw3IEBACiAJZGVmYXVsdDoKIAkJQjQzbGVnYWN5X0JVR19PTigxKTsKIAl9Ci0JcGh5LT5yYWRpb19vbiA9IDE7CisJcGh5LT5yYWRpb19vbiA9IHRydWU7CiB9CiAKIHZvaWQgYjQzbGVnYWN5X3JhZGlvX3R1cm5fb2ZmKHN0cnVjdCBiNDNsZWdhY3lfd2xkZXYgKmRldiwgYm9vbCBmb3JjZSkKQEAgLTIxMzEsMTQgKzIxMzEsMTQgQEAKIAkJaWYgKCFmb3JjZSkgewogCQkJcGh5LT5yYWRpb19vZmZfY29udGV4dC5yZm92ZXIgPSByZm92ZXI7CiAJCQlwaHktPnJhZGlvX29mZl9jb250ZXh0LnJmb3ZlcnZhbCA9IHJmb3ZlcnZhbDsKLQkJCXBoeS0+cmFkaW9fb2ZmX2NvbnRleHQudmFsaWQgPSAxOworCQkJcGh5LT5yYWRpb19vZmZfY29udGV4dC52YWxpZCA9IHRydWU7CiAJCX0KIAkJYjQzbGVnYWN5X3BoeV93cml0ZShkZXYsIEI0M2xlZ2FjeV9QSFlfUkZPVkVSLCByZm92ZXIgfCAweDAwOEMpOwogCQliNDNsZWdhY3lfcGh5X3dyaXRlKGRldiwgQjQzbGVnYWN5X1BIWV9SRk9WRVJWQUwsCiAJCQkJICAgIHJmb3ZlcnZhbCAmIDB4RkY3Myk7CiAJfSBlbHNlCiAJCWI0M2xlZ2FjeV9waHlfd3JpdGUoZGV2LCAweDAwMTUsIDB4QUEwMCk7Ci0JcGh5LT5yYWRpb19vbiA9IDA7CisJcGh5LT5yYWRpb19vbiA9IGZhbHNlOwogCWI0M2xlZ2FjeWRiZyhkZXYtPndsLCAiUmFkaW8gaW5pdGlhbGl6ZWRcbiIpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9LY29uZmlnCmluZGV4IDIwNjlmYzguLmNkNjM3NWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9LY29uZmlnCkBAIC0zLDkgKzMsOCBAQAogCiBjb25maWcgQlJDTVNNQUMKIAl0cmlzdGF0ZSAiQnJvYWRjb20gSUVFRTgwMi4xMW4gUENJZSBTb2Z0TUFDIFdMQU4gZHJpdmVyIgotCWRlcGVuZHMgb24gUENJCiAJZGVwZW5kcyBvbiBNQUM4MDIxMQotCWRlcGVuZHMgb24gQkNNQT1uCisJZGVwZW5kcyBvbiBCQ01BCiAJc2VsZWN0IEJSQ01VVElMCiAJc2VsZWN0IEZXX0xPQURFUgogCXNlbGVjdCBDUkNfQ0NJVFQKQEAgLTE4LDE2ICsxNywyNiBAQAogCiBjb25maWcgQlJDTUZNQUMKIAl0cmlzdGF0ZSAiQnJvYWRjb20gSUVFRTgwMi4xMW4gZW1iZWRkZWQgRnVsbE1BQyBXTEFOIGRyaXZlciIKLQlkZXBlbmRzIG9uIE1NQwogCWRlcGVuZHMgb24gQ0ZHODAyMTEKIAlzZWxlY3QgQlJDTVVUSUwKLQlzZWxlY3QgRldfTE9BREVSCiAJLS0taGVscC0tLQogCSAgVGhpcyBtb2R1bGUgYWRkcyBzdXBwb3J0IGZvciBlbWJlZGRlZCB3aXJlbGVzcyBhZGFwdGVycyBiYXNlZCBvbgotCSAgQnJvYWRjb20gSUVFRTgwMi4xMW4gRnVsbE1BQyBjaGlwc2V0cy4gIFRoaXMgZHJpdmVyIHVzZXMgdGhlIGtlcm5lbCdzCi0JICB3aXJlbGVzcyBleHRlbnNpb25zIHN1YnN5c3RlbS4gIElmIHlvdSBjaG9vc2UgdG8gYnVpbGQgYSBtb2R1bGUsCisJICBCcm9hZGNvbSBJRUVFODAyLjExbiBGdWxsTUFDIGNoaXBzZXRzLiBJdCBoYXMgdG8gd29yayB3aXRoIGF0IGxlYXN0CisJICBvbmUgb2YgdGhlIGJ1cyBpbnRlcmZhY2Ugc3VwcG9ydC4gSWYgeW91IGNob29zZSB0byBidWlsZCBhIG1vZHVsZSwKIAkgIGl0J2xsIGJlIGNhbGxlZCBicmNtZm1hYy5rby4KIAorY29uZmlnIEJSQ01GTUFDX1NESU8KKwlib29sICJTRElPIGJ1cyBpbnRlcmZhY2Ugc3VwcG9ydCBmb3IgRnVsbE1BQyIKKwlkZXBlbmRzIG9uIE1NQworCWRlcGVuZHMgb24gQlJDTUZNQUMKKwlzZWxlY3QgRldfTE9BREVSCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgU0RJTyBidXMgaW50ZXJmYWNlIHN1cHBvcnQgZm9yIEJyb2FkY29tCisJICBGdWxsTUFDIFdMQU4gZHJpdmVyLgorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gdXNlIGJyY21mbWFjIGZvciBhIGNvbXBhdGlibGUgU0RJTyBpbnRlcmZhY2UKKwkgIHdpcmVsZXNzIGNhcmQuCisKIGNvbmZpZyBCUkNNREJHCiAJYm9vbCAiQnJvYWRjb20gZHJpdmVyIGRlYnVnIGZ1bmN0aW9ucyIKIAlkZXBlbmRzIG9uIEJSQ01TTUFDIHx8IEJSQ01GTUFDCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvTWFrZWZpbGUKaW5kZXggYjQ0ZTMwOS4uOWNhOWVhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9NYWtlZmlsZQpAQCAtMTksMTUgKzE5LDE2IEBACiAJLUlkcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMJXAogCS1JZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUKIAotREhET0ZJTEVTID0gXAotCXdsX2NmZzgwMjExLm8gXAotCWRoZF9jZGMubyBcCi0JZGhkX2NvbW1vbi5vIFwKLQlkaGRfc2Rpby5vCVwKLQlkaGRfbGludXgubyBcCi0JYmNtc2RoLm8gXAotCWJjbXNkaF9zZG1tYy5vCi0KIG9iai0kKENPTkZJR19CUkNNRk1BQykgKz0gYnJjbWZtYWMubwotYnJjbWZtYWMtb2JqcyArPSAkKERIRE9GSUxFUykKK2JyY21mbWFjLW9ianMgKz0gXAorCQl3bF9jZmc4MDIxMS5vIFwKKwkJZGhkX2NkYy5vIFwKKwkJZGhkX2NvbW1vbi5vIFwKKwkJZGhkX2xpbnV4Lm8KK2JyY21mbWFjLSQoQ09ORklHX0JSQ01GTUFDX1NESU8pICs9IFwKKwkJZGhkX3NkaW8ubyBcCisJCWJjbXNkaC5vIFwKKwkJYmNtc2RoX3NkbW1jLm8gXAorCQlzZGlvX2NoaXAubworCiBjY2ZsYWdzLXkgKz0gLURfX0NIRUNLX0VORElBTl9fCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtY2hpcC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbWNoaXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdkM2FmZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtY2hpcC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgotICoKLSAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQotICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KLSAqCi0gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKLSAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKLSAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQotICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCi0gKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCi0gKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCi0gKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgotICovCi0KLSNpZm5kZWYgX2JjbWNoaXBfaF8KLSNkZWZpbmUgX2JjbWNoaXBfaF8KLQotLyogYmNtNDMyOSAqLwotLyogU0RJTyBkZXZpY2UgY29yZSwgSUQgMHg4MjkgKi8KLSNkZWZpbmUgQkNNNDMyOV9DT1JFX0JVU19CQVNFCQkweDE4MDExMDAwCi0vKiBpbnRlcm5hbCBtZW1vcnkgY29yZSwgSUQgMHg4MGUgKi8KLSNkZWZpbmUgQkNNNDMyOV9DT1JFX1NPQ1JBTV9CQVNFCTB4MTgwMDMwMDAKLS8qIEFSTSBDb3J0ZXggTTMgY29yZSwgSUQgMHg4MmEgKi8KLSNkZWZpbmUgQkNNNDMyOV9DT1JFX0FSTV9CQVNFCQkweDE4MDAyMDAwCi0jZGVmaW5lIEJDTTQzMjlfUkFNU0laRQkJCTB4NDgwMDAKLS8qIGZpcm13YXJlIG5hbWUgKi8KLSNkZWZpbmUgQkNNNDMyOV9GV19OQU1FCQkJImJyY20vYmNtNDMyOS1mdWxsbWFjLTQuYmluIgotI2RlZmluZSBCQ000MzI5X05WX05BTUUJCQkiYnJjbS9iY200MzI5LWZ1bGxtYWMtNC50eHQiCi0KLSNlbmRpZgkJCQkvKiBfYmNtY2hpcF9oXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaC5jCmluZGV4IDg5ZmY5NGQuLjRiYzhkMjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoLmMKQEAgLTMxLDcgKzMxLDYgQEAKICNpbmNsdWRlIDxicmNtdV91dGlscy5oPgogI2luY2x1ZGUgPGJyY211X3dpZmkuaD4KICNpbmNsdWRlIDxzb2MuaD4KLSNpbmNsdWRlICJkaGQuaCIKICNpbmNsdWRlICJkaGRfYnVzLmgiCiAjaW5jbHVkZSAiZGhkX2RiZy5oIgogI2luY2x1ZGUgInNkaW9faG9zdC5oIgpAQCAtNTEsMTIgKzUwLDE4IEBACiAJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOwogfQogCisvKiBkdW1teSBoYW5kbGVyIGZvciBTRElPIGZ1bmN0aW9uIDIgaW50ZXJydXB0ICovCitzdGF0aWMgdm9pZCBicmNtZl9zZGlvaF9kdW1teV9pcnFfaGFuZGxlcihzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQoreworfQorCiBpbnQgYnJjbWZfc2RjYXJkX2ludHJfcmVnKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldikKIHsKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlcmluZ1xuIik7CiAKIAlzZGlvX2NsYWltX2hvc3Qoc2Rpb2Rldi0+ZnVuY1sxXSk7CiAJc2Rpb19jbGFpbV9pcnEoc2Rpb2Rldi0+ZnVuY1sxXSwgYnJjbWZfc2Rpb2hfaXJxaGFuZGxlcik7CisJc2Rpb19jbGFpbV9pcnEoc2Rpb2Rldi0+ZnVuY1syXSwgYnJjbWZfc2Rpb2hfZHVtbXlfaXJxX2hhbmRsZXIpOwogCXNkaW9fcmVsZWFzZV9ob3N0KHNkaW9kZXYtPmZ1bmNbMV0pOwogCiAJcmV0dXJuIDA7CkBAIC02Nyw2ICs3Miw3IEBACiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJpbmdcbiIpOwogCiAJc2Rpb19jbGFpbV9ob3N0KHNkaW9kZXYtPmZ1bmNbMV0pOworCXNkaW9fcmVsZWFzZV9pcnEoc2Rpb2Rldi0+ZnVuY1syXSk7CiAJc2Rpb19yZWxlYXNlX2lycShzZGlvZGV2LT5mdW5jWzFdKTsKIAlzZGlvX3JlbGVhc2VfaG9zdChzZGlvZGV2LT5mdW5jWzFdKTsKIApAQCAtMjIyLDE5ICsyMjgsMTIgQEAKIAlyZXR1cm4gc2Rpb2Rldi0+cmVnZmFpbDsKIH0KIAotaW50Ci1icmNtZl9zZGNhcmRfcmVjdl9idWYoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKLQkJICAgICAgdWludCBmbGFncywKLQkJICAgICAgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHN0cnVjdCBza19idWZmICpwa3QpCitzdGF0aWMgaW50IGJyY21mX3NkY2FyZF9yZWN2X3ByZXBhcmUoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1aW50IGZuLAorCQkJCSAgICAgdWludCBmbGFncywgdWludCB3aWR0aCwgdTMyICphZGRyKQogewotCWludCBzdGF0dXM7Ci0JdWludCBpbmNyX2ZpeDsKLQl1aW50IHdpZHRoOwotCXVpbnQgYmFyMCA9IGFkZHIgJiB+U0JTRElPX1NCX09GVF9BRERSX01BU0s7CisJdWludCBiYXIwID0gKmFkZHIgJiB+U0JTRElPX1NCX09GVF9BRERSX01BU0s7CiAJaW50IGVyciA9IDA7CiAKLQlicmNtZl9kYmcoSU5GTywgImZ1biA9ICVkLCBhZGRyID0gMHgleCwgc2l6ZSA9ICVkXG4iLCBmbiwgYWRkciwgbmJ5dGVzKTsKLQogCS8qIEFzeW5jIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KIAlpZiAoZmxhZ3MgJiBTRElPX1JFUV9BU1lOQykKIAkJcmV0dXJuIC1FTk9UU1VQUDsKQEAgLTI0NywyOSArMjQ2LDExNCBAQAogCQlzZGlvZGV2LT5zYndhZCA9IGJhcjA7CiAJfQogCi0JYWRkciAmPSBTQlNESU9fU0JfT0ZUX0FERFJfTUFTSzsKKwkqYWRkciAmPSBTQlNESU9fU0JfT0ZUX0FERFJfTUFTSzsKKworCWlmICh3aWR0aCA9PSA0KQorCQkqYWRkciB8PSBTQlNESU9fU0JfQUNDRVNTXzJfNEJfRkxBRzsKKworCXJldHVybiAwOworfQorCitpbnQKK2JyY21mX3NkY2FyZF9yZWN2X2J1ZihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAorCQkgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXlwa3Q7CisJaW50IGVycjsKKworCW15cGt0ID0gYnJjbXVfcGt0X2J1Zl9nZXRfc2tiKG5ieXRlcyk7CisJaWYgKCFteXBrdCkgeworCQlicmNtZl9kYmcoRVJST1IsICJicmNtdV9wa3RfYnVmX2dldF9za2IgZmFpbGVkOiBsZW4gJWRcbiIsCisJCQkgIG5ieXRlcyk7CisJCXJldHVybiAtRUlPOworCX0KKworCWVyciA9IGJyY21mX3NkY2FyZF9yZWN2X3BrdChzZGlvZGV2LCBhZGRyLCBmbiwgZmxhZ3MsIG15cGt0KTsKKwlpZiAoIWVycikKKwkJbWVtY3B5KGJ1ZiwgbXlwa3QtPmRhdGEsIG5ieXRlcyk7CisKKwlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKG15cGt0KTsKKwlyZXR1cm4gZXJyOworfQorCitpbnQKK2JyY21mX3NkY2FyZF9yZWN2X3BrdChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAorCQkgICAgICB1aW50IGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQoreworCXVpbnQgaW5jcl9maXg7CisJdWludCB3aWR0aDsKKwlpbnQgZXJyID0gMDsKKworCWJyY21mX2RiZyhJTkZPLCAiZnVuID0gJWQsIGFkZHIgPSAweCV4LCBzaXplID0gJWRcbiIsCisJCSAgZm4sIGFkZHIsIHBrdC0+bGVuKTsKKworCXdpZHRoID0gKGZsYWdzICYgU0RJT19SRVFfNEJZVEUpID8gNCA6IDI7CisJZXJyID0gYnJjbWZfc2RjYXJkX3JlY3ZfcHJlcGFyZShzZGlvZGV2LCBmbiwgZmxhZ3MsIHdpZHRoLCAmYWRkcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAogCWluY3JfZml4ID0gKGZsYWdzICYgU0RJT19SRVFfRklYRUQpID8gU0RJT0hfREFUQV9GSVggOiBTRElPSF9EQVRBX0lOQzsKKwllcnIgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X2J1ZmZlcihzZGlvZGV2LCBpbmNyX2ZpeCwgU0RJT0hfUkVBRCwKKwkJCQkJIGZuLCBhZGRyLCBwa3QpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IGJyY21mX3NkY2FyZF9yZWN2X2NoYWluKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIHVpbnQgZm4sCisJCQkgICAgdWludCBmbGFncywgc3RydWN0IHNrX2J1ZmZfaGVhZCAqcGt0cSkKK3sKKwl1aW50IGluY3JfZml4OworCXVpbnQgd2lkdGg7CisJaW50IGVyciA9IDA7CisKKwlicmNtZl9kYmcoSU5GTywgImZ1biA9ICVkLCBhZGRyID0gMHgleCwgc2l6ZSA9ICVkXG4iLAorCQkgIGZuLCBhZGRyLCBwa3RxLT5xbGVuKTsKKwogCXdpZHRoID0gKGZsYWdzICYgU0RJT19SRVFfNEJZVEUpID8gNCA6IDI7Ci0JaWYgKHdpZHRoID09IDQpCi0JCWFkZHIgfD0gU0JTRElPX1NCX0FDQ0VTU18yXzRCX0ZMQUc7CisJZXJyID0gYnJjbWZfc2RjYXJkX3JlY3ZfcHJlcGFyZShzZGlvZGV2LCBmbiwgZmxhZ3MsIHdpZHRoLCAmYWRkcik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCXN0YXR1cyA9IGJyY21mX3NkaW9oX3JlcXVlc3RfYnVmZmVyKHNkaW9kZXYsIGluY3JfZml4LCBTRElPSF9SRUFELAotCQkJCQkgICAgZm4sIGFkZHIsIHdpZHRoLCBuYnl0ZXMsIGJ1ZiwgcGt0KTsKKwlpbmNyX2ZpeCA9IChmbGFncyAmIFNESU9fUkVRX0ZJWEVEKSA/IFNESU9IX0RBVEFfRklYIDogU0RJT0hfREFUQV9JTkM7CisJZXJyID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9jaGFpbihzZGlvZGV2LCBpbmNyX2ZpeCwgU0RJT0hfUkVBRCwgZm4sIGFkZHIsCisJCQkJCXBrdHEpOwogCi0JcmV0dXJuIHN0YXR1czsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQKIGJyY21mX3NkY2FyZF9zZW5kX2J1ZihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAotCQkgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCkKKwkJICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMpCit7CisJc3RydWN0IHNrX2J1ZmYgKm15cGt0OworCWludCBlcnI7CisKKwlteXBrdCA9IGJyY211X3BrdF9idWZfZ2V0X3NrYihuYnl0ZXMpOworCWlmICghbXlwa3QpIHsKKwkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbXVfcGt0X2J1Zl9nZXRfc2tiIGZhaWxlZDogbGVuICVkXG4iLAorCQkJICBuYnl0ZXMpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1jcHkobXlwa3QtPmRhdGEsIGJ1ZiwgbmJ5dGVzKTsKKwllcnIgPSBicmNtZl9zZGNhcmRfc2VuZF9wa3Qoc2Rpb2RldiwgYWRkciwgZm4sIGZsYWdzLCBteXBrdCk7CisKKwlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKG15cGt0KTsKKwlyZXR1cm4gZXJyOworCit9CisKK2ludAorYnJjbWZfc2RjYXJkX3NlbmRfcGt0KHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIHVpbnQgZm4sCisJCSAgICAgIHVpbnQgZmxhZ3MsIHN0cnVjdCBza19idWZmICpwa3QpCiB7CiAJdWludCBpbmNyX2ZpeDsKIAl1aW50IHdpZHRoOwogCXVpbnQgYmFyMCA9IGFkZHIgJiB+U0JTRElPX1NCX09GVF9BRERSX01BU0s7CiAJaW50IGVyciA9IDA7CiAKLQlicmNtZl9kYmcoSU5GTywgImZ1biA9ICVkLCBhZGRyID0gMHgleCwgc2l6ZSA9ICVkXG4iLCBmbiwgYWRkciwgbmJ5dGVzKTsKKwlicmNtZl9kYmcoSU5GTywgImZ1biA9ICVkLCBhZGRyID0gMHgleCwgc2l6ZSA9ICVkXG4iLAorCQkgIGZuLCBhZGRyLCBwa3QtPmxlbik7CiAKIAkvKiBBc3luYyBub3QgaW1wbGVtZW50ZWQgeWV0ICovCiAJaWYgKGZsYWdzICYgU0RJT19SRVFfQVNZTkMpCkBAIC0yOTEsMTggKzM3NSwzOSBAQAogCQlhZGRyIHw9IFNCU0RJT19TQl9BQ0NFU1NfMl80Ql9GTEFHOwogCiAJcmV0dXJuIGJyY21mX3NkaW9oX3JlcXVlc3RfYnVmZmVyKHNkaW9kZXYsIGluY3JfZml4LCBTRElPSF9XUklURSwgZm4sCi0JCQkJCSAgYWRkciwgd2lkdGgsIG5ieXRlcywgYnVmLCBwa3QpOworCQkJCQkgIGFkZHIsIHBrdCk7CiB9CiAKIGludCBicmNtZl9zZGNhcmRfcndkYXRhKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdWludCBydywgdTMyIGFkZHIsCiAJCQl1OCAqYnVmLCB1aW50IG5ieXRlcykKIHsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXlwa3Q7CisJYm9vbCB3cml0ZSA9IHJ3ID8gU0RJT0hfV1JJVEUgOiBTRElPSF9SRUFEOworCWludCBlcnI7CisKIAlhZGRyICY9IFNCU0RJT19TQl9PRlRfQUREUl9NQVNLOwogCWFkZHIgfD0gU0JTRElPX1NCX0FDQ0VTU18yXzRCX0ZMQUc7CiAKLQlyZXR1cm4gYnJjbWZfc2Rpb2hfcmVxdWVzdF9idWZmZXIoc2Rpb2RldiwgU0RJT0hfREFUQV9JTkMsCi0JCShydyA/IFNESU9IX1dSSVRFIDogU0RJT0hfUkVBRCksIFNESU9fRlVOQ18xLAotCQlhZGRyLCA0LCBuYnl0ZXMsIGJ1ZiwgTlVMTCk7CisJbXlwa3QgPSBicmNtdV9wa3RfYnVmX2dldF9za2IobmJ5dGVzKTsKKwlpZiAoIW15cGt0KSB7CisJCWJyY21mX2RiZyhFUlJPUiwgImJyY211X3BrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IGxlbiAlZFxuIiwKKwkJCSAgbmJ5dGVzKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogRm9yIGEgd3JpdGUsIGNvcHkgdGhlIGJ1ZmZlciBkYXRhIGludG8gdGhlIHBhY2tldC4gKi8KKwlpZiAod3JpdGUpCisJCW1lbWNweShteXBrdC0+ZGF0YSwgYnVmLCBuYnl0ZXMpOworCisJZXJyID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9idWZmZXIoc2Rpb2RldiwgU0RJT0hfREFUQV9JTkMsIHdyaXRlLAorCQkJCQkgU0RJT19GVU5DXzEsIGFkZHIsIG15cGt0KTsKKworCS8qIEZvciBhIHJlYWQsIGNvcHkgdGhlIHBhY2tldCBkYXRhIGJhY2sgdG8gdGhlIGJ1ZmZlci4gKi8KKwlpZiAoIWVyciAmJiAhd3JpdGUpCisJCW1lbWNweShidWYsIG15cGt0LT5kYXRhLCBuYnl0ZXMpOworCisJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihteXBrdCk7CisJcmV0dXJuIGVycjsKIH0KIAogaW50IGJyY21mX3NkY2FyZF9hYm9ydChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHVpbnQgZm4pCkBAIC0zMzMsNyArNDM4LDcgQEAKIAlzZGlvZGV2LT5zYndhZCA9IFNJX0VOVU1fQkFTRTsKIAogCS8qIHRyeSB0byBhdHRhY2ggdG8gdGhlIHRhcmdldCBkZXZpY2UgKi8KLQlzZGlvZGV2LT5idXMgPSBicmNtZl9zZGJyY21fcHJvYmUoMCwgMCwgMCwgMCwgcmVncywgc2Rpb2Rldik7CisJc2Rpb2Rldi0+YnVzID0gYnJjbWZfc2RicmNtX3Byb2JlKHJlZ3MsIHNkaW9kZXYpOwogCWlmICghc2Rpb2Rldi0+YnVzKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImRldmljZSBhdHRhY2ggZmFpbGVkXG4iKTsKIAkJcmV0ID0gLUVOT0RFVjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9iY21zZGhfc2RtbWMuYwppbmRleCBiYmFlYjJkLi45YjhjMGVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvYmNtc2RoX3NkbW1jLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2JjbXNkaF9zZG1tYy5jCkBAIC0zMSwxNSArMzEsMTUgQEAKICNpbmNsdWRlIDxicmNtdV91dGlscy5oPgogI2luY2x1ZGUgPGJyY211X3dpZmkuaD4KICNpbmNsdWRlICJzZGlvX2hvc3QuaCIKLSNpbmNsdWRlICJkaGQuaCIKICNpbmNsdWRlICJkaGRfZGJnLmgiCi0jaW5jbHVkZSAid2xfY2ZnODAyMTEuaCIKKyNpbmNsdWRlICJkaGRfYnVzLmgiCiAKICNkZWZpbmUgU0RJT19WRU5ET1JfSURfQlJPQURDT00JCTB4MDJkMAogCiAjZGVmaW5lIERNQV9BTElHTl9NQVNLCTB4MDMKIAogI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzI5CTB4NDMyOQorI2RlZmluZSBTRElPX0RFVklDRV9JRF9CUk9BRENPTV80MzMwCTB4NDMzMAogCiAjZGVmaW5lIFNESU9fRlVOQzFfQkxPQ0tTSVpFCQk2NAogI2RlZmluZSBTRElPX0ZVTkMyX0JMT0NLU0laRQkJNTEyCkBAIC00Nyw2ICs0Nyw3IEBACiAvKiBkZXZpY2VzIHdlIHN1cHBvcnQsIG51bGwgdGVybWluYXRlZCAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCBicmNtZl9zZG1tY19pZHNbXSA9IHsKIAl7U0RJT19ERVZJQ0UoU0RJT19WRU5ET1JfSURfQlJPQURDT00sIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMjkpfSwKKwl7U0RJT19ERVZJQ0UoU0RJT19WRU5ET1JfSURfQlJPQURDT00sIFNESU9fREVWSUNFX0lEX0JST0FEQ09NXzQzMzApfSwKIAl7IC8qIGVuZDogYWxsIHplcm9lcyAqLyB9LAogfTsKIE1PRFVMRV9ERVZJQ0VfVEFCTEUoc2RpbywgYnJjbWZfc2RtbWNfaWRzKTsKQEAgLTIwNCw2MiArMjA1LDc1IEBACiAJcmV0dXJuIGVycl9yZXQ7CiB9CiAKKy8qIHByZWNvbmRpdGlvbjogaG9zdCBjb250cm9sbGVyIGlzIGNsYWltZWQgKi8KIHN0YXRpYyBpbnQKLWJyY21mX3NkaW9oX3JlcXVlc3RfcGFja2V0KHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdWludCBmaXhfaW5jLAotCQkJICAgdWludCB3cml0ZSwgdWludCBmdW5jLCB1aW50IGFkZHIsCi0JCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQorYnJjbWZfc2Rpb2hfcmVxdWVzdF9kYXRhKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdWludCB3cml0ZSwgYm9vbCBmaWZvLAorCQkJIHVpbnQgZnVuYywgdWludCBhZGRyLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCB1aW50IHBrdGxlbikKK3sKKwlpbnQgZXJyX3JldCA9IDA7CisKKwlpZiAoKHdyaXRlKSAmJiAoIWZpZm8pKSB7CisJCWVycl9yZXQgPSBzZGlvX21lbWNweV90b2lvKHNkaW9kZXYtPmZ1bmNbZnVuY10sIGFkZHIsCisJCQkJCSAgICgodTggKikgKHBrdC0+ZGF0YSkpLCBwa3RsZW4pOworCX0gZWxzZSBpZiAod3JpdGUpIHsKKwkJZXJyX3JldCA9IHNkaW9fbWVtY3B5X3RvaW8oc2Rpb2Rldi0+ZnVuY1tmdW5jXSwgYWRkciwKKwkJCQkJICAgKCh1OCAqKSAocGt0LT5kYXRhKSksIHBrdGxlbik7CisJfSBlbHNlIGlmIChmaWZvKSB7CisJCWVycl9yZXQgPSBzZGlvX3JlYWRzYihzZGlvZGV2LT5mdW5jW2Z1bmNdLAorCQkJCSAgICAgICgodTggKikgKHBrdC0+ZGF0YSkpLCBhZGRyLCBwa3RsZW4pOworCX0gZWxzZSB7CisJCWVycl9yZXQgPSBzZGlvX21lbWNweV9mcm9taW8oc2Rpb2Rldi0+ZnVuY1tmdW5jXSwKKwkJCQkJICAgICAoKHU4ICopIChwa3QtPmRhdGEpKSwKKwkJCQkJICAgICBhZGRyLCBwa3RsZW4pOworCX0KKworCXJldHVybiBlcnJfcmV0OworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHF1ZXVlIG9mIHBhY2tldHMuIFRoZSBwYWNrZXRzIG9uIHRoZSBxdWV1ZQorICogYXJlIGFzc3VtZWQgdG8gYmUgcHJvcGVybHkgYWxpZ25lZCBieSB0aGUgY2FsbGVyLgorICovCitpbnQKK2JyY21mX3NkaW9oX3JlcXVlc3RfY2hhaW4oc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1aW50IGZpeF9pbmMsCisJCQkgIHVpbnQgd3JpdGUsIHVpbnQgZnVuYywgdWludCBhZGRyLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpwa3RxKQogewogCWJvb2wgZmlmbyA9IChmaXhfaW5jID09IFNESU9IX0RBVEFfRklYKTsKIAl1MzIgU0dDb3VudCA9IDA7CiAJaW50IGVycl9yZXQgPSAwOwogCi0Jc3RydWN0IHNrX2J1ZmYgKnBuZXh0OworCXN0cnVjdCBza19idWZmICpwa3Q7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKLQlicmNtZl9wbV9yZXN1bWVfd2FpdChzZGlvZGV2LCAmc2Rpb2Rldi0+cmVxdWVzdF9wYWNrZXRfd2FpdCk7CisJYnJjbWZfcG1fcmVzdW1lX3dhaXQoc2Rpb2RldiwgJnNkaW9kZXYtPnJlcXVlc3RfY2hhaW5fd2FpdCk7CiAJaWYgKGJyY21mX3BtX3Jlc3VtZV9lcnJvcihzZGlvZGV2KSkKIAkJcmV0dXJuIC1FSU87CiAKIAkvKiBDbGFpbSBob3N0IGNvbnRyb2xsZXIgKi8KIAlzZGlvX2NsYWltX2hvc3Qoc2Rpb2Rldi0+ZnVuY1tmdW5jXSk7Ci0JZm9yIChwbmV4dCA9IHBrdDsgcG5leHQ7IHBuZXh0ID0gcG5leHQtPm5leHQpIHsKLQkJdWludCBwa3RfbGVuID0gcG5leHQtPmxlbjsKKworCXNrYl9xdWV1ZV93YWxrKHBrdHEsIHBrdCkgeworCQl1aW50IHBrdF9sZW4gPSBwa3QtPmxlbjsKIAkJcGt0X2xlbiArPSAzOwogCQlwa3RfbGVuICY9IDB4RkZGRkZGRkM7CiAKLQkJaWYgKCh3cml0ZSkgJiYgKCFmaWZvKSkgewotCQkJZXJyX3JldCA9IHNkaW9fbWVtY3B5X3RvaW8oc2Rpb2Rldi0+ZnVuY1tmdW5jXSwgYWRkciwKLQkJCQkJCSAgICgodTggKikgKHBuZXh0LT5kYXRhKSksCi0JCQkJCQkgICBwa3RfbGVuKTsKLQkJfSBlbHNlIGlmICh3cml0ZSkgewotCQkJZXJyX3JldCA9IHNkaW9fbWVtY3B5X3RvaW8oc2Rpb2Rldi0+ZnVuY1tmdW5jXSwgYWRkciwKLQkJCQkJCSAgICgodTggKikgKHBuZXh0LT5kYXRhKSksCi0JCQkJCQkgICBwa3RfbGVuKTsKLQkJfSBlbHNlIGlmIChmaWZvKSB7Ci0JCQllcnJfcmV0ID0gc2Rpb19yZWFkc2Ioc2Rpb2Rldi0+ZnVuY1tmdW5jXSwKLQkJCQkJICAgICAgKCh1OCAqKSAocG5leHQtPmRhdGEpKSwKLQkJCQkJICAgICAgYWRkciwgcGt0X2xlbik7Ci0JCX0gZWxzZSB7Ci0JCQllcnJfcmV0ID0gc2Rpb19tZW1jcHlfZnJvbWlvKHNkaW9kZXYtPmZ1bmNbZnVuY10sCi0JCQkJCQkgICAgICgodTggKikgKHBuZXh0LT5kYXRhKSksCi0JCQkJCQkgICAgIGFkZHIsIHBrdF9sZW4pOwotCQl9Ci0KKwkJZXJyX3JldCA9IGJyY21mX3NkaW9oX3JlcXVlc3RfZGF0YShzZGlvZGV2LCB3cml0ZSwgZmlmbywgZnVuYywKKwkJCQkJCSAgIGFkZHIsIHBrdCwgcGt0X2xlbik7CiAJCWlmIChlcnJfcmV0KSB7CiAJCQlicmNtZl9kYmcoRVJST1IsICIlcyBGQUlMRUQgJXBbJWRdLCBhZGRyPTB4JTA1eCwgcGt0X2xlbj0lZCwgRVJSPTB4JTA4eFxuIiwKLQkJCQkgIHdyaXRlID8gIlRYIiA6ICJSWCIsIHBuZXh0LCBTR0NvdW50LCBhZGRyLAorCQkJCSAgd3JpdGUgPyAiVFgiIDogIlJYIiwgcGt0LCBTR0NvdW50LCBhZGRyLAogCQkJCSAgcGt0X2xlbiwgZXJyX3JldCk7CiAJCX0gZWxzZSB7CiAJCQlicmNtZl9kYmcoVFJBQ0UsICIlcyB4ZnInZCAlcFslZF0sIGFkZHI9MHglMDV4LCBsZW49JWRcbiIsCi0JCQkJICB3cml0ZSA/ICJUWCIgOiAiUlgiLCBwbmV4dCwgU0dDb3VudCwgYWRkciwKKwkJCQkgIHdyaXRlID8gIlRYIiA6ICJSWCIsIHBrdCwgU0dDb3VudCwgYWRkciwKIAkJCQkgIHBrdF9sZW4pOwogCQl9Ci0KIAkJaWYgKCFmaWZvKQogCQkJYWRkciArPSBwa3RfbGVuOwotCQlTR0NvdW50Kys7CiAKKwkJU0dDb3VudCsrOwogCX0KIAogCS8qIFJlbGVhc2UgaG9zdCBjb250cm9sbGVyICovCkBAIC0yNzAsOTEgKzI4NCw0NSBAQAogfQogCiAvKgotICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGJ1ZmZlciBvciBwYWNrZXQsIGFuZCBmaXhlcyBldmVyeXRoaW5nIHVwCi0gKiBzbyB0aGF0IGluIHRoZSBlbmQsIGEgRE1BLWFibGUgcGFja2V0IGlzIGNyZWF0ZWQuCi0gKgotICogQSBidWZmZXIgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIHBhY2tldCBwb2ludGVyLAotICogYW5kIG1heSBvciBtYXkgbm90IGJlIGFsaWduZWQuCi0gKiBBIHBhY2tldCBtYXkgY29uc2lzdCBvZiBhIHNpbmdsZSBwYWNrZXQsIG9yIGEgcGFja2V0IGNoYWluLgotICogSWYgaXQgaXMgYSBwYWNrZXQgY2hhaW4sIHRoZW4gYWxsIHRoZSBwYWNrZXRzIGluIHRoZSBjaGFpbgotICogbXVzdCBiZSBwcm9wZXJseSBhbGlnbmVkLgotICoKLSAqIElmIHRoZSBwYWNrZXQgZGF0YSBpcyBub3QgYWxpZ25lZCwgdGhlbiB0aGVyZSBtYXkgb25seSBiZQotICogb25lIHBhY2tldCwgYW5kIGluIHRoaXMgY2FzZSwgIGl0IGlzIGNvcGllZCB0byBhIG5ldwotICogYWxpZ25lZCBwYWNrZXQuCi0gKgorICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHNpbmdsZSBETUEtYWJsZSBwYWNrZXQuCiAgKi8KIGludCBicmNtZl9zZGlvaF9yZXF1ZXN0X2J1ZmZlcihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCiAJCQkgICAgICAgdWludCBmaXhfaW5jLCB1aW50IHdyaXRlLCB1aW50IGZ1bmMsIHVpbnQgYWRkciwKLQkJCSAgICAgICB1aW50IHJlZ193aWR0aCwgdWludCBidWZsZW5fdSwgdTggKmJ1ZmZlciwKIAkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQogewotCWludCBTdGF0dXM7Ci0Jc3RydWN0IHNrX2J1ZmYgKm15cGt0ID0gTlVMTDsKKwlpbnQgc3RhdHVzOworCXVpbnQgcGt0X2xlbiA9IHBrdC0+bGVuOworCWJvb2wgZmlmbyA9IChmaXhfaW5jID09IFNESU9IX0RBVEFfRklYKTsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAorCWlmIChwa3QgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlicmNtZl9wbV9yZXN1bWVfd2FpdChzZGlvZGV2LCAmc2Rpb2Rldi0+cmVxdWVzdF9idWZmZXJfd2FpdCk7CiAJaWYgKGJyY21mX3BtX3Jlc3VtZV9lcnJvcihzZGlvZGV2KSkKIAkJcmV0dXJuIC1FSU87Ci0JLyogQ2FzZSAxOiB3ZSBkb24ndCBoYXZlIGEgcGFja2V0LiAqLwotCWlmIChwa3QgPT0gTlVMTCkgewotCQlicmNtZl9kYmcoREFUQSwgIkNyZWF0aW5nIG5ldyAlcyBQYWNrZXQsIGxlbj0lZFxuIiwKLQkJCSAgd3JpdGUgPyAiVFgiIDogIlJYIiwgYnVmbGVuX3UpOwotCQlteXBrdCA9IGJyY211X3BrdF9idWZfZ2V0X3NrYihidWZsZW5fdSk7Ci0JCWlmICghbXlwa3QpIHsKLQkJCWJyY21mX2RiZyhFUlJPUiwgImJyY211X3BrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IGxlbiAlZFxuIiwKLQkJCQkgIGJ1Zmxlbl91KTsKLQkJCXJldHVybiAtRUlPOwotCQl9CiAKLQkJLyogRm9yIGEgd3JpdGUsIGNvcHkgdGhlIGJ1ZmZlciBkYXRhIGludG8gdGhlIHBhY2tldC4gKi8KLQkJaWYgKHdyaXRlKQotCQkJbWVtY3B5KG15cGt0LT5kYXRhLCBidWZmZXIsIGJ1Zmxlbl91KTsKKwkvKiBDbGFpbSBob3N0IGNvbnRyb2xsZXIgKi8KKwlzZGlvX2NsYWltX2hvc3Qoc2Rpb2Rldi0+ZnVuY1tmdW5jXSk7CiAKLQkJU3RhdHVzID0gYnJjbWZfc2Rpb2hfcmVxdWVzdF9wYWNrZXQoc2Rpb2RldiwgZml4X2luYywgd3JpdGUsCi0JCQkJCQkgICAgZnVuYywgYWRkciwgbXlwa3QpOworCXBrdF9sZW4gKz0gMzsKKwlwa3RfbGVuICY9ICh1aW50KX4zOwogCi0JCS8qIEZvciBhIHJlYWQsIGNvcHkgdGhlIHBhY2tldCBkYXRhIGJhY2sgdG8gdGhlIGJ1ZmZlci4gKi8KLQkJaWYgKCF3cml0ZSkKLQkJCW1lbWNweShidWZmZXIsIG15cGt0LT5kYXRhLCBidWZsZW5fdSk7Ci0KLQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihteXBrdCk7Ci0JfSBlbHNlIGlmICgoKHVsb25nKSAocGt0LT5kYXRhKSAmIERNQV9BTElHTl9NQVNLKSAhPSAwKSB7Ci0JCS8qCi0JCSAqIENhc2UgMjogV2UgaGF2ZSBhIHBhY2tldCwgYnV0IGl0IGlzIHVuYWxpZ25lZC4KLQkJICogSW4gdGhpcyBjYXNlLCB3ZSBjYW5ub3QgaGF2ZSBhIGNoYWluIChwa3QtPm5leHQgPT0gTlVMTCkKLQkJICovCi0JCWJyY21mX2RiZyhEQVRBLCAiQ3JlYXRpbmcgYWxpZ25lZCAlcyBQYWNrZXQsIGxlbj0lZFxuIiwKLQkJCSAgd3JpdGUgPyAiVFgiIDogIlJYIiwgcGt0LT5sZW4pOwotCQlteXBrdCA9IGJyY211X3BrdF9idWZfZ2V0X3NrYihwa3QtPmxlbik7Ci0JCWlmICghbXlwa3QpIHsKLQkJCWJyY21mX2RiZyhFUlJPUiwgImJyY211X3BrdF9idWZfZ2V0X3NrYiBmYWlsZWQ6IGxlbiAlZFxuIiwKLQkJCQkgIHBrdC0+bGVuKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0KLQkJLyogRm9yIGEgd3JpdGUsIGNvcHkgdGhlIGJ1ZmZlciBkYXRhIGludG8gdGhlIHBhY2tldC4gKi8KLQkJaWYgKHdyaXRlKQotCQkJbWVtY3B5KG15cGt0LT5kYXRhLCBwa3QtPmRhdGEsIHBrdC0+bGVuKTsKLQotCQlTdGF0dXMgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X3BhY2tldChzZGlvZGV2LCBmaXhfaW5jLCB3cml0ZSwKLQkJCQkJCSAgICBmdW5jLCBhZGRyLCBteXBrdCk7Ci0KLQkJLyogRm9yIGEgcmVhZCwgY29weSB0aGUgcGFja2V0IGRhdGEgYmFjayB0byB0aGUgYnVmZmVyLiAqLwotCQlpZiAoIXdyaXRlKQotCQkJbWVtY3B5KHBrdC0+ZGF0YSwgbXlwa3QtPmRhdGEsIG15cGt0LT5sZW4pOwotCi0JCWJyY211X3BrdF9idWZfZnJlZV9za2IobXlwa3QpOwotCX0gZWxzZSB7CQkvKiBjYXNlIDM6IFdlIGhhdmUgYSBwYWNrZXQgYW5kCi0JCQkJIGl0IGlzIGFsaWduZWQuICovCi0JCWJyY21mX2RiZyhEQVRBLCAiQWxpZ25lZCAlcyBQYWNrZXQsIGRpcmVjdCBETUFcbiIsCi0JCQkgIHdyaXRlID8gIlR4IiA6ICJSeCIpOwotCQlTdGF0dXMgPSBicmNtZl9zZGlvaF9yZXF1ZXN0X3BhY2tldChzZGlvZGV2LCBmaXhfaW5jLCB3cml0ZSwKLQkJCQkJCSAgICBmdW5jLCBhZGRyLCBwa3QpOworCXN0YXR1cyA9IGJyY21mX3NkaW9oX3JlcXVlc3RfZGF0YShzZGlvZGV2LCB3cml0ZSwgZmlmbywgZnVuYywKKwkJCQkJICAgYWRkciwgcGt0LCBwa3RfbGVuKTsKKwlpZiAoc3RhdHVzKSB7CisJCWJyY21mX2RiZyhFUlJPUiwgIiVzIEZBSUxFRCAlcCwgYWRkcj0weCUwNXgsIHBrdF9sZW49JWQsIEVSUj0weCUwOHhcbiIsCisJCQkgIHdyaXRlID8gIlRYIiA6ICJSWCIsIHBrdCwgYWRkciwgcGt0X2xlbiwgc3RhdHVzKTsKKwl9IGVsc2UgeworCQlicmNtZl9kYmcoVFJBQ0UsICIlcyB4ZnInZCAlcCwgYWRkcj0weCUwNXgsIGxlbj0lZFxuIiwKKwkJCSAgd3JpdGUgPyAiVFgiIDogIlJYIiwgcGt0LCBhZGRyLCBwa3RfbGVuKTsKIAl9CiAKLQlyZXR1cm4gU3RhdHVzOworCS8qIFJlbGVhc2UgaG9zdCBjb250cm9sbGVyICovCisJc2Rpb19yZWxlYXNlX2hvc3Qoc2Rpb2Rldi0+ZnVuY1tmdW5jXSk7CisKKwlyZXR1cm4gc3RhdHVzOwogfQogCiAvKiBSZWFkIGNsaWVudCBjYXJkIHJlZyAqLwpAQCAtNDk0LDYgKzQ2Miw3IEBACiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2OworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZjsKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAJYnJjbWZfZGJnKFRSQUNFLCAiZnVuYy0+Y2xhc3M9JXhcbiIsIGZ1bmMtPmNsYXNzKTsKIAlicmNtZl9kYmcoVFJBQ0UsICJzZGlvX3ZlbmRvcjogMHglMDR4XG4iLCBmdW5jLT52ZW5kb3IpOwpAQCAtNTA1LDE3ICs0NzQsMjYgQEAKIAkJCWJyY21mX2RiZyhFUlJPUiwgImNhcmQgcHJpdmF0ZSBkcnZkYXRhIG9jY3VwaWVkXG4iKTsKIAkJCXJldHVybiAtRU5YSU87CiAJCX0KLQkJc2Rpb2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9zZGlvX2RldiksIEdGUF9LRVJORUwpOwotCQlpZiAoIXNkaW9kZXYpCisJCWJ1c19pZiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9idXMpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFidXNfaWYpCiAJCQlyZXR1cm4gLUVOT01FTTsKKwkJc2Rpb2RldiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9zZGlvX2RldiksIEdGUF9LRVJORUwpOworCQlpZiAoIXNkaW9kZXYpIHsKKwkJCWtmcmVlKGJ1c19pZik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCQlzZGlvZGV2LT5mdW5jWzBdID0gZnVuYy0+Y2FyZC0+c2Rpb19mdW5jWzBdOwogCQlzZGlvZGV2LT5mdW5jWzFdID0gZnVuYzsKKwkJc2Rpb2Rldi0+YnVzX2lmID0gYnVzX2lmOworCQlidXNfaWYtPmJ1c19wcml2ID0gc2Rpb2RldjsKKwkJYnVzX2lmLT50eXBlID0gU0RJT19CVVM7CisJCWJ1c19pZi0+YWxpZ24gPSBCUkNNRl9TREFMSUdOOwogCQlkZXZfc2V0X2RydmRhdGEoJmZ1bmMtPmNhcmQtPmRldiwgc2Rpb2Rldik7CiAKIAkJYXRvbWljX3NldCgmc2Rpb2Rldi0+c3VzcGVuZCwgZmFsc2UpOwogCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZGlvZGV2LT5yZXF1ZXN0X2J5dGVfd2FpdCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkaW9kZXYtPnJlcXVlc3Rfd29yZF93YWl0KTsKLQkJaW5pdF93YWl0cXVldWVfaGVhZCgmc2Rpb2Rldi0+cmVxdWVzdF9wYWNrZXRfd2FpdCk7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkaW9kZXYtPnJlcXVlc3RfY2hhaW5fd2FpdCk7CiAJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNkaW9kZXYtPnJlcXVlc3RfYnVmZmVyX3dhaXQpOwogCX0KIApAQCAtNTI1LDYgKzUwMywxMCBAQAogCQkJcmV0dXJuIC1FTk9ERVY7CiAJCXNkaW9kZXYtPmZ1bmNbMl0gPSBmdW5jOwogCisJCWJ1c19pZiA9IHNkaW9kZXYtPmJ1c19pZjsKKwkJc2Rpb2Rldi0+ZGV2ID0gJmZ1bmMtPmRldjsKKwkJZGV2X3NldF9kcnZkYXRhKCZmdW5jLT5kZXYsIGJ1c19pZik7CisKIAkJYnJjbWZfZGJnKFRSQUNFLCAiRjIgZm91bmQsIGNhbGxpbmcgYnJjbWZfc2Rpb19wcm9iZS4uLlxuIik7CiAJCXJldCA9IGJyY21mX3NkaW9fcHJvYmUoc2Rpb2Rldik7CiAJfQpAQCAtNTM0LDYgKzUxNiw3IEBACiAKIHN0YXRpYyB2b2lkIGJyY21mX29wc19zZGlvX3JlbW92ZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQogeworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZjsKIAlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXY7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCWJyY21mX2RiZyhJTkZPLCAiZnVuYy0+Y2xhc3M9JXhcbiIsIGZ1bmMtPmNsYXNzKTsKQEAgLTU0MiwxMCArNTI1LDEzIEBACiAJYnJjbWZfZGJnKElORk8sICJGdW5jdGlvbiM6IDB4JTA0eFxuIiwgZnVuYy0+bnVtKTsKIAogCWlmIChmdW5jLT5udW0gPT0gMikgewotCQlzZGlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYpOworCQlidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoJmZ1bmMtPmRldik7CisJCXNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2OwogCQlicmNtZl9kYmcoVFJBQ0UsICJGMiBmb3VuZCwgY2FsbGluZyBicmNtZl9zZGlvX3JlbW92ZS4uLlxuIik7CiAJCWJyY21mX3NkaW9fcmVtb3ZlKHNkaW9kZXYpOwogCQlkZXZfc2V0X2RydmRhdGEoJmZ1bmMtPmNhcmQtPmRldiwgTlVMTCk7CisJCWRldl9zZXRfZHJ2ZGF0YSgmZnVuYy0+ZGV2LCBOVUxMKTsKKwkJa2ZyZWUoYnVzX2lmKTsKIAkJa2ZyZWUoc2Rpb2Rldik7CiAJfQogfQpAQCAtNTU0LDE0ICs1NDAsMTIgQEAKIHN0YXRpYyBpbnQgYnJjbWZfc2Rpb19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAltbWNfcG1fZmxhZ190IHNkaW9fZmxhZ3M7Ci0Jc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2OwogCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBkZXZfdG9fc2Rpb19mdW5jKGRldik7CisJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2ID0gZGV2X2dldF9kcnZkYXRhKCZmdW5jLT5jYXJkLT5kZXYpOwogCWludCByZXQgPSAwOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiXG4iKTsKIAotCXNkaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmZ1bmMtPmNhcmQtPmRldik7Ci0KIAlhdG9taWNfc2V0KCZzZGlvZGV2LT5zdXNwZW5kLCB0cnVlKTsKIAogCXNkaW9fZmxhZ3MgPSBzZGlvX2dldF9ob3N0X3BtX2NhcHMoc2Rpb2Rldi0+ZnVuY1sxXSk7CkBAIC01ODMsMTAgKzU2Nyw5IEBACiAKIHN0YXRpYyBpbnQgYnJjbWZfc2Rpb19yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldjsKIAlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gZGV2X3RvX3NkaW9fZnVuYyhkZXYpOworCXN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiA9IGRldl9nZXRfZHJ2ZGF0YSgmZnVuYy0+Y2FyZC0+ZGV2KTsKIAotCXNkaW9kZXYgPSBkZXZfZ2V0X2RydmRhdGEoJmZ1bmMtPmNhcmQtPmRldik7CiAJYnJjbWZfc2Rpb193ZHRtcl9lbmFibGUoc2Rpb2RldiwgdHJ1ZSk7CiAJYXRvbWljX3NldCgmc2Rpb2Rldi0+c3VzcGVuZCwgZmFsc2UpOwogCXJldHVybiAwOwpAQCAtNjEwLDE3ICs1OTMsMjYgQEAKICNlbmRpZgkvKiBDT05GSUdfUE1fU0xFRVAgKi8KIH07CiAKLS8qIGJ1cyByZWdpc3RlciBpbnRlcmZhY2UgKi8KLWludCBicmNtZl9idXNfcmVnaXN0ZXIodm9pZCkKLXsKLQlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7Ci0KLQlyZXR1cm4gc2Rpb19yZWdpc3Rlcl9kcml2ZXIoJmJyY21mX3NkbW1jX2RyaXZlcik7Ci19Ci0KLXZvaWQgYnJjbWZfYnVzX3VucmVnaXN0ZXIodm9pZCkKK3N0YXRpYyB2b2lkIF9fZXhpdCBicmNtZl9zZGlvX2V4aXQodm9pZCkKIHsKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKIAlzZGlvX3VucmVnaXN0ZXJfZHJpdmVyKCZicmNtZl9zZG1tY19kcml2ZXIpOwogfQorCitzdGF0aWMgaW50IF9faW5pdCBicmNtZl9zZGlvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOworCisJcmV0ID0gc2Rpb19yZWdpc3Rlcl9kcml2ZXIoJmJyY21mX3NkbW1jX2RyaXZlcik7CisKKwlpZiAocmV0KQorCQlicmNtZl9kYmcoRVJST1IsICJzZGlvX3JlZ2lzdGVyX2RyaXZlciBmYWlsZWQ6ICVkXG4iLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworbW9kdWxlX2luaXQoYnJjbWZfc2Rpb19pbml0KTsKK21vZHVsZV9leGl0KGJyY21mX3NkaW9fZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkLmgKaW5kZXggNDY0NTc2Ni4uZTU4ZWE0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGQuaApAQCAtODcsNyArODcsNyBAQAogI2RlZmluZSBUT0VfVFhfQ1NVTV9PTAkJMHgwMDAwMDAwMQogI2RlZmluZSBUT0VfUlhfQ1NVTV9PTAkJMHgwMDAwMDAwMgogCi0jZGVmaW5lCUJSQ01GX0JTU19JTkZPX1ZFUlNJT04JMTA4IC8qIGN1cnJlbnQgdmVyIG9mIGJyY21mX2Jzc19pbmZvIHN0cnVjdCAqLworI2RlZmluZQlCUkNNRl9CU1NfSU5GT19WRVJTSU9OCTEwOSAvKiBjdXJyIHZlciBvZiBicmNtZl9ic3NfaW5mb19sZSBzdHJ1Y3QgKi8KIAogLyogc2l6ZSBvZiBicmNtZl9zY2FuX3BhcmFtcyBub3QgaW5jbHVkaW5nIHZhcmlhYmxlIGxlbmd0aCBhcnJheSAqLwogI2RlZmluZSBCUkNNRl9TQ0FOX1BBUkFNU19GSVhFRF9TSVpFIDY0CkBAIC0xMjIsOCArMTIyLDYgQEAKIAogLyogRm9yIHN1cHBvcnRpbmcgbXVsdGlwbGUgaW50ZXJmYWNlcyAqLwogI2RlZmluZSBCUkNNRl9NQVhfSUZTCTE2Ci0jZGVmaW5lIEJSQ01GX0RFTF9JRgktMHhlCi0jZGVmaW5lIEJSQ01GX0JBRF9JRgktMHhmCiAKICNkZWZpbmUgRE9UMTFfQlNTVFlQRV9BTlkJCQkyCiAjZGVmaW5lIERPVDExX01BWF9ERUZBVUxUX0tFWVMJNApAQCAtMTU4LDE4ICsxNTYsNiBAQAogCXN0cnVjdCBicmNtZl9ldmVudF9tc2cgbXNnOwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGRuZ2xfc3RhdHMgewotCXVuc2lnbmVkIGxvbmcgcnhfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAqLwotCXVuc2lnbmVkIGxvbmcgdHhfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZCAqLwotCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkICovCi0JdW5zaWduZWQgbG9uZyB0eF9ieXRlczsJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQgKi8KLQl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zICovCi0JdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkOwkvKiBwYWNrZXRzIGRyb3BwZWQgYnkgZG9uZ2xlICovCi0JdW5zaWduZWQgbG9uZyB0eF9kcm9wcGVkOwkvKiBwYWNrZXRzIGRyb3BwZWQgYnkgZG9uZ2xlICovCi0JdW5zaWduZWQgbG9uZyBtdWx0aWNhc3Q7CS8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkICovCi19OwotCiAvKiBldmVudCBjb2RlcyBzZW50IGJ5IHRoZSBkb25nbGUgdG8gdGhpcyBkcml2ZXIgKi8KICNkZWZpbmUgQlJDTUZfRV9TRVRfU1NJRAkJCTAKICNkZWZpbmUgQlJDTUZfRV9KT0lOCQkJCTEKQEAgLTMxOSwxMyArMzA1LDYgQEAKICNkZWZpbmUgQlJDTUZfRV9MSU5LX0FTU09DX1JFQwkJCTMKICNkZWZpbmUgQlJDTUZfRV9MSU5LX0JTU0NGR19ESVMJCQk0CiAKLS8qIFRoZSBsZXZlbCBvZiBidXMgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBkb25nbGUgKi8KLWVudW0gYnJjbWZfYnVzX3N0YXRlIHsKLQlCUkNNRl9CVVNfRE9XTiwJCS8qIE5vdCByZWFkeSBmb3IgZnJhbWUgdHJhbnNmZXJzICovCi0JQlJDTUZfQlVTX0xPQUQsCQkvKiBEb3dubG9hZCBhY2Nlc3Mgb25seSAoQ1BVIHJlc2V0KSAqLwotCUJSQ01GX0JVU19EQVRBCQkvKiBSZWFkeSBmb3IgZnJhbWUgdHJhbnNmZXJzICovCi19OwotCiAvKiBQYXR0ZXJuIG1hdGNoaW5nIGZpbHRlci4gU3BlY2lmaWVzIGFuIG9mZnNldCB3aXRoaW4gcmVjZWl2ZWQgcGFja2V0cyB0bwogICogc3RhcnQgbWF0Y2hpbmcsIHRoZSBwYXR0ZXJuIHRvIG1hdGNoLCB0aGUgc2l6ZSBvZiB0aGUgcGF0dGVybiwgYW5kIGEgYml0bWFzawogICogdGhhdCBpbmRpY2F0ZXMgd2hpY2ggYml0cyB3aXRoaW4gdGhlIHBhdHRlcm4gc2hvdWxkIGJlIG1hdGNoZWQuCkBAIC0zNjUsNyArMzQ0LDcgQEAKICAqIEFwcGxpY2F0aW9ucyBNVVNUIENIRUNLIGllX29mZnNldCBmaWVsZCBhbmQgbGVuZ3RoIGZpZWxkIHRvIGFjY2VzcyBJRXMgYW5kCiAgKiBuZXh0IGJzc19pbmZvIHN0cnVjdHVyZSBpbiBhIHZlY3RvciAoaW4gc3RydWN0IGJyY21mX3NjYW5fcmVzdWx0cykKICAqLwotc3RydWN0IGJyY21mX2Jzc19pbmZvIHsKK3N0cnVjdCBicmNtZl9ic3NfaW5mb19sZSB7CiAJX19sZTMyIHZlcnNpb247CQkvKiB2ZXJzaW9uIGZpZWxkICovCiAJX19sZTMyIGxlbmd0aDsJCS8qIGJ5dGUgbGVuZ3RoIG9mIGRhdGEgaW4gdGhpcyByZWNvcmQsCiAJCQkJICogc3RhcnRpbmcgYXQgdmVyc2lvbiBhbmQgaW5jbHVkaW5nIElFcwpAQCAtNDY2LDE0ICs0NDUsMTMgQEAKIAl1MzIgYnVmbGVuOwogCXUzMiB2ZXJzaW9uOwogCXUzMiBjb3VudDsKLQlzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gYnNzX2luZm9bMV07CisJc3RydWN0IGJyY21mX2Jzc19pbmZvX2xlIGJzc19pbmZvX2xlW107CiB9OwogCiBzdHJ1Y3QgYnJjbWZfc2Nhbl9yZXN1bHRzX2xlIHsKIAlfX2xlMzIgYnVmbGVuOwogCV9fbGUzMiB2ZXJzaW9uOwogCV9fbGUzMiBjb3VudDsKLQlzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gYnNzX2luZm9bMV07CiB9OwogCiAvKiB1c2VkIGZvciBhc3NvY2lhdGlvbiB3aXRoIGEgc3BlY2lmaWMgQlNTSUQgYW5kIGNoYW5zcGVjIGxpc3QgKi8KQEAgLTQ5MywxMCArNDcxLDYgQEAKIAlzdHJ1Y3QgYnJjbWZfYXNzb2NfcGFyYW1zX2xlIHBhcmFtc19sZTsKIH07CiAKLS8qIHNpemUgb2YgYnJjbWZfc2Nhbl9yZXN1bHRzIG5vdCBpbmNsdWRpbmcgdmFyaWFibGUgbGVuZ3RoIGFycmF5ICovCi0jZGVmaW5lIEJSQ01GX1NDQU5fUkVTVUxUU19GSVhFRF9TSVpFIFwKLQkoc2l6ZW9mKHN0cnVjdCBicmNtZl9zY2FuX3Jlc3VsdHMpIC0gc2l6ZW9mKHN0cnVjdCBicmNtZl9ic3NfaW5mbykpCi0KIC8qIGluY3JlbWVudGFsIHNjYW4gcmVzdWx0cyBzdHJ1Y3QgKi8KIHN0cnVjdCBicmNtZl9pc2Nhbl9yZXN1bHRzIHsKIAl1bmlvbiB7CkBAIC01MTEsNyArNDg1LDcgQEAKIAogLyogc2l6ZSBvZiBicmNtZl9pc2Nhbl9yZXN1bHRzIG5vdCBpbmNsdWRpbmcgdmFyaWFibGUgbGVuZ3RoIGFycmF5ICovCiAjZGVmaW5lIEJSQ01GX0lTQ0FOX1JFU1VMVFNfRklYRURfU0laRSBcCi0JKEJSQ01GX1NDQU5fUkVTVUxUU19GSVhFRF9TSVpFICsgXAorCShzaXplb2Yoc3RydWN0IGJyY21mX3NjYW5fcmVzdWx0cykgKyBcCiAJIG9mZnNldG9mKHN0cnVjdCBicmNtZl9pc2Nhbl9yZXN1bHRzLCByZXN1bHRzKSkKIAogc3RydWN0IGJyY21mX3dzZWNfa2V5IHsKQEAgLTU3OSwyNSArNTUzLDE5IEBACiB9OwogCiAvKiBGb3J3YXJkIGRlY2xzIGZvciBzdHJ1Y3QgYnJjbWZfcHViIChzZWUgYmVsb3cpICovCi1zdHJ1Y3QgYnJjbWZfYnVzOwkJLyogZGV2aWNlIGJ1cyBpbmZvICovCiBzdHJ1Y3QgYnJjbWZfcHJvdG87CS8qIGRldmljZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIGluZm8gKi8KLXN0cnVjdCBicmNtZl9pbmZvOwkvKiBkZXZpY2UgZHJpdmVyIGluZm8gKi8KIHN0cnVjdCBicmNtZl9jZmc4MDIxMV9kZXY7IC8qIGNmZzgwMjExIGRldmljZSBpbmZvICovCiAKIC8qIENvbW1vbiBzdHJ1Y3R1cmUgZm9yIG1vZHVsZSBhbmQgaW5zdGFuY2UgbGlua2FnZSAqLwogc3RydWN0IGJyY21mX3B1YiB7CiAJLyogTGlua2FnZSBwb250ZXJzICovCi0Jc3RydWN0IGJyY21mX2J1cyAqYnVzOworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZjsKIAlzdHJ1Y3QgYnJjbWZfcHJvdG8gKnByb3Q7Ci0Jc3RydWN0IGJyY21mX2luZm8gKmluZm87CiAJc3RydWN0IGJyY21mX2NmZzgwMjExX2RldiAqY29uZmlnOworCXN0cnVjdCBkZXZpY2UgKmRldjsJCS8qIGZ1bGxtYWMgZG9uZ2xlIGRldmljZSBwb2ludGVyICovCiAKIAkvKiBJbnRlcm5hbCBicmNtZiBpdGVtcyAqLwotCWJvb2wgdXA7CQkvKiBEcml2ZXIgdXAvZG93biAodG8gT1MpICovCi0JYm9vbCB0eG9mZjsJCS8qIFRyYW5zbWl0IGZsb3ctY29udHJvbGxlZCAqLwotCWVudW0gYnJjbWZfYnVzX3N0YXRlIGJ1c3N0YXRlOwogCXVpbnQgaGRybGVuOwkJLyogVG90YWwgQlJDTUYgaGVhZGVyIGxlbmd0aCAocHJvdG8gKyBidXMpICovCi0JdWludCBtYXhjdGw7CQkvKiBNYXggc2l6ZSByeGN0bCByZXF1ZXN0IGZyb20gcHJvdG8gdG8gYnVzICovCiAJdWludCByeHN6OwkJLyogUnggYnVmZmVyIHNpemUgYnVzIG1vZHVsZSBzaG91bGQgdXNlICovCiAJdTggd21lX2RwOwkJLyogd21lIGRpc2NhcmQgcHJpb3JpdHkgKi8KIApAQCAtNjA1LDQ4ICs1NzMsMjEgQEAKIAlib29sIGlzd2w7CQkvKiBEb25nbGUtcmVzaWRlbnQgZHJpdmVyIGlzIHdsICovCiAJdW5zaWduZWQgbG9uZyBkcnZfdmVyc2lvbjsJLyogVmVyc2lvbiBvZiBkb25nbGUtcmVzaWRlbnQgZHJpdmVyICovCiAJdTggbWFjW0VUSF9BTEVOXTsJCS8qIE1BQyBhZGRyZXNzIG9idGFpbmVkIGZyb20gZG9uZ2xlICovCi0Jc3RydWN0IGRuZ2xfc3RhdHMgZHN0YXRzOwkvKiBTdGF0cyBmb3IgZG9uZ2xlLWJhc2VkIGRhdGEgKi8KIAogCS8qIEFkZGl0aW9uYWwgc3RhdHMgZm9yIHRoZSBidXMgbGV2ZWwgKi8KIAotCS8qIERhdGEgcGFja2V0cyBzZW50IHRvIGRvbmdsZSAqLwotCXVuc2lnbmVkIGxvbmcgdHhfcGFja2V0czsKIAkvKiBNdWx0aWNhc3QgZGF0YSBwYWNrZXRzIHNlbnQgdG8gZG9uZ2xlICovCiAJdW5zaWduZWQgbG9uZyB0eF9tdWx0aWNhc3Q7Ci0JLyogRXJyb3JzIGluIHNlbmRpbmcgZGF0YSB0byBkb25nbGUgKi8KLQl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsKLQkvKiBDb250cm9sIHBhY2tldHMgc2VudCB0byBkb25nbGUgKi8KLQl1bnNpZ25lZCBsb25nIHR4X2N0bHBrdHM7Ci0JLyogRXJyb3JzIHNlbmRpbmcgY29udHJvbCBmcmFtZXMgdG8gZG9uZ2xlICovCi0JdW5zaWduZWQgbG9uZyB0eF9jdGxlcnJzOwotCS8qIFBhY2tldHMgc2VudCB1cCB0aGUgbmV0d29yayBpbnRlcmZhY2UgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X3BhY2tldHM7Ci0JLyogTXVsdGljYXN0IHBhY2tldHMgc2VudCB1cCB0aGUgbmV0d29yayBpbnRlcmZhY2UgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X211bHRpY2FzdDsKLQkvKiBFcnJvcnMgcHJvY2Vzc2luZyByeCBkYXRhIHBhY2tldHMgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsKLQkvKiBDb250cm9sIGZyYW1lcyBwcm9jZXNzZWQgZnJvbSBkb25nbGUgKi8KLQl1bnNpZ25lZCBsb25nIHJ4X2N0bHBrdHM7Ci0KLQkvKiBFcnJvcnMgaW4gcHJvY2Vzc2luZyByeCBjb250cm9sIGZyYW1lcyAqLwotCXVuc2lnbmVkIGxvbmcgcnhfY3RsZXJyczsKLQkvKiBQYWNrZXRzIGRyb3BwZWQgbG9jYWxseSAobm8gbWVtb3J5KSAqLwotCXVuc2lnbmVkIGxvbmcgcnhfZHJvcHBlZDsKIAkvKiBQYWNrZXRzIGZsdXNoZWQgZHVlIHRvIHVuc2NoZWR1bGVkIHNlbmR1cCB0aHJlYWQgKi8KIAl1bnNpZ25lZCBsb25nIHJ4X2ZsdXNoZWQ7CiAJLyogTnVtYmVyIG9mIHRpbWVzIGRwYyBzY2hlZHVsZWQgYnkgd2F0Y2hkb2cgdGltZXIgKi8KIAl1bnNpZ25lZCBsb25nIHdkX2RwY19zY2hlZDsKIAotCS8qIE51bWJlciBvZiBwYWNrZXRzIHdoZXJlIGhlYWRlciByZWFkLWFoZWFkIHdhcyB1c2VkLiAqLwotCXVuc2lnbmVkIGxvbmcgcnhfcmVhZGFoZWFkX2NudDsKLQkvKiBOdW1iZXIgb2YgdHggcGFja2V0cyB3ZSBoYWQgdG8gcmVhbGxvYyBmb3IgaGVhZHJvb20gKi8KLQl1bnNpZ25lZCBsb25nIHR4X3JlYWxsb2M7CiAJLyogTnVtYmVyIG9mIGZsb3cgY29udHJvbCBwa3RzIHJlY3ZkICovCiAJdW5zaWduZWQgbG9uZyBmY19wYWNrZXRzOwogCiAJLyogTGFzdCBlcnJvciByZXR1cm4gKi8KIAlpbnQgYmNtZXJyb3I7Ci0JdWludCB0aWNrY250OwogCiAJLyogTGFzdCBlcnJvciBmcm9tIGRvbmdsZSAqLwogCWludCBkb25nbGVfZXJyb3I7CkBAIC02NjQsNiArNjA1LDE0IEBACiAJdTggY291bnRyeV9jb2RlW0JSQ01fQ05UUllfQlVGX1NaXTsKIAljaGFyIGV2ZW50bWFza1tCUkNNRl9FVkVOVElOR19NQVNLX0xFTl07CiAKKwlzdHJ1Y3QgYnJjbWZfaWYgKmlmbGlzdFtCUkNNRl9NQVhfSUZTXTsKKworCXN0cnVjdCBtdXRleCBwcm90b19ibG9jazsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCBzZXRtYWNhZGRyX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0IG11bHRpY2FzdF93b3JrOworCXU4IG1hY3ZhbHVlW0VUSF9BTEVOXTsKKwlhdG9taWNfdCBwZW5kXzgwMjF4X2NudDsKIH07CiAKIHN0cnVjdCBicmNtZl9pZl9ldmVudCB7CkBAIC02ODMsNjcgKzYzMiwzMyBAQAogZXh0ZXJuIHVpbnQgYnJjbWZfY19ta2lvdmFyKGNoYXIgKm5hbWUsIGNoYXIgKmRhdGEsIHVpbnQgZGF0YWxlbiwKIAkJCSAgY2hhciAqYnVmLCB1aW50IGxlbik7CiAKLS8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHJlZ2FyZGluZyBwcmVzZW5jZS9pbnNlcnRpb24gb2YgZG9uZ2xlLgotICogUmV0dXJuIHN0cnVjdCBicmNtZl9wdWIgcG9pbnRlciwgdXNlZCBhcyBoYW5kbGUgdG8gT1MgbW9kdWxlIGluIGxhdGVyIGNhbGxzLgotICogUmV0dXJuZWQgc3RydWN0dXJlIHNob3VsZCBoYXZlIGJ1cyBhbmQgcHJvdCBwb2ludGVycyBmaWxsZWQgaW4uCi0gKiBidXNfaGRybGVuIHNwZWNpZmllcyByZXF1aXJlZCBoZWFkcm9vbSBmb3IgYnVzIG1vZHVsZSBoZWFkZXIuCi0gKi8KLWV4dGVybiBzdHJ1Y3QgYnJjbWZfcHViICpicmNtZl9hdHRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzLAotCQkJCSAgICAgIHVpbnQgYnVzX2hkcmxlbik7CiBleHRlcm4gaW50IGJyY21mX25ldF9hdHRhY2goc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlkeCk7CiBleHRlcm4gaW50IGJyY21mX25ldGRldl93YWl0X3BlbmQ4MDIxeChzdHJ1Y3QgbmV0X2RldmljZSAqbmRldik7CiAKIGV4dGVybiBzMzIgYnJjbWZfZXhlY19kY21kKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBjbWQsIHZvaWQgKmFyZywgdTMyIGxlbik7CiAKLS8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHJlZ2FyZGluZyByZW1vdmFsL2Fic2VuY2Ugb2YgZG9uZ2xlICovCi1leHRlcm4gdm9pZCBicmNtZl9kZXRhY2goc3RydWN0IGJyY21mX3B1YiAqZHJ2cik7Ci0KLS8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHRvIGNoYW5nZSBmbG93LWNvbnRyb2wgc3RhdGUgKi8KLWV4dGVybiB2b2lkIGJyY21mX3R4Zmxvd2NvbnRyb2woc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LCBib29sIG9uKTsKLQotZXh0ZXJuIGJvb2wgYnJjbWZfY19wcmVjX2VucShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBzdHJ1Y3QgcGt0cSAqcSwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LCBpbnQgcHJlYyk7Ci0KLS8qIFJlY2VpdmUgZnJhbWUgZm9yIGRlbGl2ZXJ5IHRvIE9TLiAgQ2FsbGVlIGRpc3Bvc2VzIG9mIHJ4cC4gKi8KLWV4dGVybiB2b2lkIGJyY21mX3J4X2ZyYW1lKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcnhwLCBpbnQgbnVtcGt0KTsKLQogLyogUmV0dXJuIHBvaW50ZXIgdG8gaW50ZXJmYWNlIG5hbWUgKi8KIGV4dGVybiBjaGFyICpicmNtZl9pZm5hbWUoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlkeCk7CiAKLS8qIE5vdGlmeSB0eCBjb21wbGV0aW9uICovCi1leHRlcm4gdm9pZCBicmNtZl90eGNvbXBsZXRlKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHN0cnVjdCBza19idWZmICp0eHAsCi0JCQkgICAgIGJvb2wgc3VjY2Vzcyk7Ci0KIC8qIFF1ZXJ5IGRvbmdsZSAqLwogZXh0ZXJuIGludCBicmNtZl9wcm90b19jZGNfcXVlcnlfZGNtZChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgaWZpZHgsCiAJCQkJICAgICAgIHVpbnQgY21kLCB2b2lkICpidWYsIHVpbnQgbGVuKTsKIAotLyogT1MgaW5kZXBlbmRlbnQgbGF5ZXIgZnVuY3Rpb25zICovCi1leHRlcm4gaW50IGJyY21mX29zX3Byb3RvX2Jsb2NrKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpOwotZXh0ZXJuIGludCBicmNtZl9vc19wcm90b191bmJsb2NrKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpOwogI2lmZGVmIEJDTURCRwogZXh0ZXJuIGludCBicmNtZl93cml0ZV90b19maWxlKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGNvbnN0IHU4ICpidWYsIGludCBzaXplKTsKICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAotZXh0ZXJuIGludCBicmNtZl9pZm5hbWUyaWR4KHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGNoYXIgKm5hbWUpOwotZXh0ZXJuIGludCBicmNtZl9jX2hvc3RfZXZlbnQoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50ICppZHgsCitleHRlcm4gaW50IGJyY21mX2lmbmFtZTJpZHgoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgY2hhciAqbmFtZSk7CitleHRlcm4gaW50IGJyY21mX2NfaG9zdF9ldmVudChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgKmlkeCwKIAkJCSAgICAgIHZvaWQgKnBrdGRhdGEsIHN0cnVjdCBicmNtZl9ldmVudF9tc2cgKiwKIAkJCSAgICAgIHZvaWQgKipkYXRhX3B0cik7CiAKLWV4dGVybiB2b2lkIGJyY21mX2NfaW5pdCh2b2lkKTsKLQotZXh0ZXJuIGludCBicmNtZl9hZGRfaWYoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50IGlmaWR4LAotCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIGNoYXIgKm5hbWUsIHU4ICptYWNfYWRkciwKLQkJCXUzMiBmbGFncywgdTggYnNzaWR4KTsKLWV4dGVybiB2b2lkIGJyY21mX2RlbF9pZihzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBpbnQgaWZpZHgpOworZXh0ZXJuIHZvaWQgYnJjbWZfZGVsX2lmKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCk7CiAKIC8qIFNlbmQgcGFja2V0IHRvIGRvbmdsZSB2aWEgZGF0YSBjaGFubmVsICovCiBleHRlcm4gaW50IGJyY21mX3NlbmRwa3Qoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LFwKIAkJCSBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKIAotZXh0ZXJuIGludCBicmNtZl9idXNfc3RhcnQoc3RydWN0IGJyY21mX3B1YiAqZHJ2cik7Ci0KIGV4dGVybiB2b2lkIGJyY21mX2NfcGt0ZmlsdGVyX29mZmxvYWRfc2V0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGNoYXIgKmFyZyk7CiBleHRlcm4gdm9pZCBicmNtZl9jX3BrdGZpbHRlcl9vZmZsb2FkX2VuYWJsZShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBjaGFyICphcmcsCiAJCQkJCSAgICAgaW50IGVuYWJsZSwgaW50IG1hc3Rlcl9tb2RlKTsKQEAgLTc1MiwyNSArNjY3LDQgQEAKICNkZWZpbmUgQlJDTUZfRENNRF9NRURMRU4JMTUzNgkvKiAibWVkIiBjbWQgYnVmZmVyIHJlcXVpcmVkICovCiAjZGVmaW5lCUJSQ01GX0RDTURfTUFYTEVOCTgxOTIJLyogbWF4IGxlbmd0aCBjbWQgYnVmZmVyIHJlcXVpcmVkICovCiAKLS8qIG1lc3NhZ2UgbGV2ZWxzICovCi0jZGVmaW5lIEJSQ01GX0VSUk9SX1ZBTAkweDAwMDEKLSNkZWZpbmUgQlJDTUZfVFJBQ0VfVkFMCTB4MDAwMgotI2RlZmluZSBCUkNNRl9JTkZPX1ZBTAkweDAwMDQKLSNkZWZpbmUgQlJDTUZfREFUQV9WQUwJMHgwMDA4Ci0jZGVmaW5lIEJSQ01GX0NUTF9WQUwJMHgwMDEwCi0jZGVmaW5lIEJSQ01GX1RJTUVSX1ZBTAkweDAwMjAKLSNkZWZpbmUgQlJDTUZfSERSU19WQUwJMHgwMDQwCi0jZGVmaW5lIEJSQ01GX0JZVEVTX1ZBTAkweDAwODAKLSNkZWZpbmUgQlJDTUZfSU5UUl9WQUwJMHgwMTAwCi0jZGVmaW5lIEJSQ01GX0dMT01fVkFMCTB4MDQwMAotI2RlZmluZSBCUkNNRl9FVkVOVF9WQUwJMHgwODAwCi0jZGVmaW5lIEJSQ01GX0JUQV9WQUwJMHgxMDAwCi0jZGVmaW5lIEJSQ01GX0lTQ0FOX1ZBTCAweDIwMDAKLQotLyogRW50ZXIgaWRsZSBpbW1lZGlhdGVseSAobm8gdGltZW91dCkgKi8KLSNkZWZpbmUgQlJDTUZfSURMRV9JTU1FRElBVEUJKC0xKQotI2RlZmluZSBCUkNNRl9JRExFX0FDVElWRQkwCS8qIERvIG5vdCByZXF1ZXN0IGFueSBTRCBjbG9jayBjaGFuZ2UKLQkJCQkgd2hlbiBpZGxlICovCi0jZGVmaW5lIEJSQ01GX0lETEVfSU5URVJWQUwJMQotCiAjZW5kaWYJCQkJLyogX0JSQ01GX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9idXMuaAppbmRleCBhMjQ5NDA3Li5hZDliZTI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2J1cy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfYnVzLmgKQEAgLTE3LDQxICsxNyw4OSBAQAogI2lmbmRlZiBfQlJDTUZfQlVTX0hfCiAjZGVmaW5lIF9CUkNNRl9CVVNfSF8KIAotLyogUGFja2V0IGFsaWdubWVudCBmb3IgbW9zdCBlZmZpY2llbnQgU0RJTyAoY2FuIGNoYW5nZSBiYXNlZCBvbiBwbGF0Zm9ybSkgKi8KLSNkZWZpbmUgQlJDTUZfU0RBTElHTgkoMSA8PCA2KQorLyogVGhlIGxldmVsIG9mIGJ1cyBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGRvbmdsZSAqLworZW51bSBicmNtZl9idXNfc3RhdGUgeworCUJSQ01GX0JVU19ET1dOLAkJLyogTm90IHJlYWR5IGZvciBmcmFtZSB0cmFuc2ZlcnMgKi8KKwlCUkNNRl9CVVNfTE9BRCwJCS8qIERvd25sb2FkIGFjY2VzcyBvbmx5IChDUFUgcmVzZXQpICovCisJQlJDTUZfQlVTX0RBVEEJCS8qIFJlYWR5IGZvciBmcmFtZSB0cmFuc2ZlcnMgKi8KK307CiAKLS8qIHdhdGNoZG9nIHBvbGxpbmcgaW50ZXJ2YWwgaW4gbXMgKi8KLSNkZWZpbmUgQlJDTUZfV0RfUE9MTF9NUwkxMAorc3RydWN0IGRuZ2xfc3RhdHMgeworCXVuc2lnbmVkIGxvbmcgcnhfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyByZWNlaXZlZCAqLworCXVuc2lnbmVkIGxvbmcgdHhfcGFja2V0czsJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZCAqLworCXVuc2lnbmVkIGxvbmcgcnhfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkICovCisJdW5zaWduZWQgbG9uZyB0eF9ieXRlczsJLyogdG90YWwgYnl0ZXMgdHJhbnNtaXR0ZWQgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2Vycm9yczsJLyogcGFja2V0IHRyYW5zbWl0IHByb2JsZW1zICovCisJdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkOwkvKiBwYWNrZXRzIGRyb3BwZWQgYnkgZG9uZ2xlICovCisJdW5zaWduZWQgbG9uZyB0eF9kcm9wcGVkOwkvKiBwYWNrZXRzIGRyb3BwZWQgYnkgZG9uZ2xlICovCisJdW5zaWduZWQgbG9uZyBtdWx0aWNhc3Q7CS8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkICovCit9OworCisvKiBpbnRlcmZhY2Ugc3RydWN0dXJlIGJldHdlZW4gY29tbW9uIGFuZCBidXMgbGF5ZXIgKi8KK3N0cnVjdCBicmNtZl9idXMgeworCXU4IHR5cGU7CQkvKiBidXMgdHlwZSAqLworCXZvaWQgKmJ1c19wcml2OwkJLyogcG9pbnRlciB0byBidXMgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KKwl2b2lkICpkcnZyOwkJLyogcG9pbnRlciB0byBkcml2ZXIgcHViIHN0cnVjdHVyZSBicmNtZl9wdWIgKi8KKwllbnVtIGJyY21mX2J1c19zdGF0ZSBzdGF0ZTsKKwl1aW50IG1heGN0bDsJCS8qIE1heCBzaXplIHJ4Y3RsIHJlcXVlc3QgZnJvbSBwcm90byB0byBidXMgKi8KKwlib29sIGRydnJfdXA7CQkvKiBTdGF0dXMgZmxhZyBvZiBkcml2ZXIgdXAvZG93biAqLworCXVuc2lnbmVkIGxvbmcgdHhfcmVhbGxvYzsJLyogVHggcGFja2V0cyByZWFsbG9jZWQgZm9yIGhlYWRyb29tICovCisJc3RydWN0IGRuZ2xfc3RhdHMgZHN0YXRzOwkvKiBTdGF0cyBmb3IgZG9uZ2xlLWJhc2VkIGRhdGEgKi8KKwl1OCBhbGlnbjsJCS8qIGJ1cyBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgKi8KKworCS8qIGludGVyZmFjZSBmdW5jdGlvbnMgcG9pbnRlcnMgKi8KKwkvKiBTdG9wIGJ1cyBtb2R1bGU6IGNsZWFyIHBlbmRpbmcgZnJhbWVzLCBkaXNhYmxlIGRhdGEgZmxvdyAqLworCXZvaWQgKCpicmNtZl9idXNfc3RvcCkoc3RydWN0IGRldmljZSAqKTsKKwkvKiBJbml0aWFsaXplIGJ1cyBtb2R1bGU6IHByZXBhcmUgZm9yIGNvbW11bmljYXRpb24gdy9kb25nbGUgKi8KKwlpbnQgKCpicmNtZl9idXNfaW5pdCkoc3RydWN0IGRldmljZSAqKTsKKwkvKiBTZW5kIGEgZGF0YSBmcmFtZSB0byB0aGUgZG9uZ2xlLiAgQ2FsbGVlIGRpc3Bvc2VzIG9mIHR4cC4gKi8KKwlpbnQgKCpicmNtZl9idXNfdHhkYXRhKShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBza19idWZmICopOworCS8qIFNlbmQvcmVjZWl2ZSBhIGNvbnRyb2wgbWVzc2FnZSB0by9mcm9tIHRoZSBkb25nbGUuCisJICogRXhwZWN0cyBjYWxsZXIgdG8gZW5mb3JjZSBhIHNpbmdsZSBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbi4KKwkgKi8KKwlpbnQgKCpicmNtZl9idXNfdHhjdGwpKHN0cnVjdCBkZXZpY2UgKiwgdW5zaWduZWQgY2hhciAqLCB1aW50KTsKKwlpbnQgKCpicmNtZl9idXNfcnhjdGwpKHN0cnVjdCBkZXZpY2UgKiwgdW5zaWduZWQgY2hhciAqLCB1aW50KTsKK307CiAKIC8qCi0gKiBFeHBvcnRlZCBmcm9tIGJyY21mIGJ1cyBtb2R1bGUgKGJyY21mX3VzYiwgYnJjbWZfc2RpbykKKyAqIGludGVyZmFjZSBmdW5jdGlvbnMgZnJvbSBjb21tb24gbGF5ZXIKICAqLwogCi0vKiBJbmRpY2F0ZSAoZGlzKWludGVyZXN0IGluIGZpbmRpbmcgZG9uZ2xlcy4gKi8KLWV4dGVybiBpbnQgYnJjbWZfYnVzX3JlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIHZvaWQgYnJjbWZfYnVzX3VucmVnaXN0ZXIodm9pZCk7CisvKiBSZW1vdmUgYW55IHByb3RvY29sLXNwZWNpZmljIGRhdGEgaGVhZGVyLiAqLworZXh0ZXJuIGludCBicmNtZl9wcm90b19oZHJwdWxsKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50ICppZmlkeCwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcnhwKTsKIAotLyogb2J0YWluIGxpbnV4IGRldmljZSBvYmplY3QgcHJvdmlkaW5nIGJ1cyBmdW5jdGlvbiAqLwotZXh0ZXJuIHN0cnVjdCBkZXZpY2UgKmJyY21mX2J1c19nZXRfZGV2aWNlKHN0cnVjdCBicmNtZl9idXMgKmJ1cyk7CitleHRlcm4gYm9vbCBicmNtZl9jX3ByZWNfZW5xKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBrdHEgKnEsCisJCQkgc3RydWN0IHNrX2J1ZmYgKnBrdCwgaW50IHByZWMpOwogCi0vKiBTdG9wIGJ1cyBtb2R1bGU6IGNsZWFyIHBlbmRpbmcgZnJhbWVzLCBkaXNhYmxlIGRhdGEgZmxvdyAqLwotZXh0ZXJuIHZvaWQgYnJjbWZfc2RicmNtX2J1c19zdG9wKHN0cnVjdCBicmNtZl9idXMgKmJ1cyk7CisvKiBSZWNlaXZlIGZyYW1lIGZvciBkZWxpdmVyeSB0byBPUy4gIENhbGxlZSBkaXNwb3NlcyBvZiByeHAuICovCitleHRlcm4gdm9pZCBicmNtZl9yeF9mcmFtZShzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpZmlkeCwKKwkJCSAgIHN0cnVjdCBza19idWZmX2hlYWQgKnJ4bGlzdCk7CitzdGF0aWMgaW5saW5lIHZvaWQgYnJjbWZfcnhfcGFja2V0KHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlmaWR4LAorCQkJCSAgIHN0cnVjdCBza19idWZmICpwa3QpCit7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBxOwogCi0vKiBJbml0aWFsaXplIGJ1cyBtb2R1bGU6IHByZXBhcmUgZm9yIGNvbW11bmljYXRpb24gdy9kb25nbGUgKi8KLWV4dGVybiBpbnQgYnJjbWZfc2RicmNtX2J1c19pbml0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIpOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnEpOworCXNrYl9xdWV1ZV90YWlsKCZxLCBwa3QpOworCWJyY21mX3J4X2ZyYW1lKGRldiwgaWZpZHgsICZxKTsKK30KIAotLyogU2VuZCBhIGRhdGEgZnJhbWUgdG8gdGhlIGRvbmdsZS4gIENhbGxlZSBkaXNwb3NlcyBvZiB0eHAuICovCi1leHRlcm4gaW50IGJyY21mX3NkYnJjbV9idXNfdHhkYXRhKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnR4cCk7CisvKiBJbmRpY2F0aW9uIGZyb20gYnVzIG1vZHVsZSByZWdhcmRpbmcgcHJlc2VuY2UvaW5zZXJ0aW9uIG9mIGRvbmdsZS4gKi8KK2V4dGVybiBpbnQgYnJjbWZfYXR0YWNoKHVpbnQgYnVzX2hkcmxlbiwgc3RydWN0IGRldmljZSAqZGV2KTsKKy8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHJlZ2FyZGluZyByZW1vdmFsL2Fic2VuY2Ugb2YgZG9uZ2xlICovCitleHRlcm4gdm9pZCBicmNtZl9kZXRhY2goc3RydWN0IGRldmljZSAqZGV2KTsKIAotLyogU2VuZC9yZWNlaXZlIGEgY29udHJvbCBtZXNzYWdlIHRvL2Zyb20gdGhlIGRvbmdsZS4KLSAqIEV4cGVjdHMgY2FsbGVyIHRvIGVuZm9yY2UgYSBzaW5nbGUgb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb24uCi0gKi8KLWV4dGVybiBpbnQKLWJyY21mX3NkYnJjbV9idXNfdHhjdGwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKTsKKy8qIEluZGljYXRpb24gZnJvbSBidXMgbW9kdWxlIHRvIGNoYW5nZSBmbG93LWNvbnRyb2wgc3RhdGUgKi8KK2V4dGVybiB2b2lkIGJyY21mX3R4Zmxvd2NvbnRyb2woc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaWZpZHgsIGJvb2wgb24pOwogCi1leHRlcm4gaW50Ci1icmNtZl9zZGJyY21fYnVzX3J4Y3RsKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdW5zaWduZWQgY2hhciAqbXNnLCB1aW50IG1zZ2xlbik7CisvKiBOb3RpZnkgdHggY29tcGxldGlvbiAqLworZXh0ZXJuIHZvaWQgYnJjbWZfdHhjb21wbGV0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICp0eHAsCisJCQkgICAgIGJvb2wgc3VjY2Vzcyk7CiAKLWV4dGVybiB2b2lkIGJyY21mX3NkYnJjbV93ZF90aW1lcihzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgd2R0aWNrKTsKK2V4dGVybiBpbnQgYnJjbWZfYnVzX3N0YXJ0KHN0cnVjdCBkZXZpY2UgKmRldik7CiAKK2V4dGVybiBpbnQgYnJjbWZfYWRkX2lmKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlmaWR4LAorCQkJY2hhciAqbmFtZSwgdTggKm1hY19hZGRyKTsKICNlbmRpZgkJCQkvKiBfQlJDTUZfQlVTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NkYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jZGMuYwppbmRleCBlMzRjNWMzLi5hYzhkMWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NkYy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY2RjLmMKQEAgLTU4LDcgKzU4LDcgQEAKICAqIFVzZWQgb24gZGF0YSBwYWNrZXRzIHRvIGNvbnZleSBwcmlvcml0eSBhY3Jvc3MgVVNCLgogICovCiAjZGVmaW5lCUJEQ19IRUFERVJfTEVOCQk0Ci0jZGVmaW5lIEJEQ19QUk9UT19WRVIJCTEJLyogUHJvdG9jb2wgdmVyc2lvbiAqLworI2RlZmluZSBCRENfUFJPVE9fVkVSCQkyCS8qIFByb3RvY29sIHZlcnNpb24gKi8KICNkZWZpbmUgQkRDX0ZMQUdfVkVSX01BU0sJMHhmMAkvKiBQcm90b2NvbCB2ZXJzaW9uIG1hc2sgKi8KICNkZWZpbmUgQkRDX0ZMQUdfVkVSX1NISUZUCTQJLyogUHJvdG9jb2wgdmVyc2lvbiBzaGlmdCAqLwogI2RlZmluZSBCRENfRkxBR19TVU1fR09PRAkweDA0CS8qIEdvb2QgUlggY2hlY2tzdW1zICovCkBAIC03NywxOCArNzcsMTkgQEAKIAl1OCBmbGFnczsKIAl1OCBwcmlvcml0eTsJLyogODAyLjFkIFByaW9yaXR5LCA0OjcgZmxvdyBjb250cm9sIGluZm8gZm9yIHVzYiAqLwogCXU4IGZsYWdzMjsKLQl1OCByc3NpOworCXU4IGRhdGFfb2Zmc2V0OwogfTsKIAogCiAjZGVmaW5lIFJFVFJJRVMgMiAvKiAjIG9mIHJldHJpZXMgdG8gcmV0cmlldmUgbWF0Y2hpbmcgZGNtZCByZXNwb25zZSAqLwotI2RlZmluZSBCVVNfSEVBREVSX0xFTgkoMTYrQlJDTUZfU0RBTElHTikgLyogTXVzdCBiZSBhdGxlYXN0IFNEUENNX1JFU0VSVkUKKyNkZWZpbmUgQlVTX0hFQURFUl9MRU4JKDE2KzY0KQkJLyogTXVzdCBiZSBhdGxlYXN0IFNEUENNX1JFU0VSVkUKIAkJCQkJICogKGFtb3VudCBvZiBoZWFkZXIgdGhhIG1pZ2h0IGJlIGFkZGVkKQogCQkJCQkgKiBwbHVzIGFueSBzcGFjZSB0aGF0IG1pZ2h0IGJlIG5lZWRlZAotCQkJCQkgKiBmb3IgYWxpZ25tZW50IHBhZGRpbmcuCisJCQkJCSAqIGZvciBidXMgYWxpZ25tZW50IHBhZGRpbmcuCiAJCQkJCSAqLwotI2RlZmluZSBST1VORF9VUF9NQVJHSU4JMjA0OAkvKiBCaWdnZXN0IFNESU8gYmxvY2sgc2l6ZSBwb3NzaWJsZSBmb3IKKyNkZWZpbmUgUk9VTkRfVVBfTUFSR0lOCTIwNDgJLyogQmlnZ2VzdCBidXMgYmxvY2sgc2l6ZSBwb3NzaWJsZSBmb3IKIAkJCQkgKiByb3VuZCBvZmYgYXQgdGhlIGVuZCBvZiBidWZmZXIKKwkJCQkgKiBDdXJyZW50bHkgaXMgU0RJTwogCQkJCSAqLwogCiBzdHJ1Y3QgYnJjbWZfcHJvdG8gewpAQCAtMTE2LDggKzExNyw5IEBACiAJCWxlbiA9IENEQ19NQVhfTVNHX1NJWkU7CiAKIAkvKiBTZW5kIHJlcXVlc3QgKi8KLQlyZXR1cm4gYnJjbWZfc2RicmNtX2J1c190eGN0bChkcnZyLT5idXMsICh1bnNpZ25lZCBjaGFyICopJnByb3QtPm1zZywKLQkJCQkgICAgICBsZW4pOworCXJldHVybiBkcnZyLT5idXNfaWYtPmJyY21mX2J1c190eGN0bChkcnZyLT5kZXYsCisJCQkJCSAgICAgKHVuc2lnbmVkIGNoYXIgKikmcHJvdC0+bXNnLAorCQkJCQkgICAgIGxlbik7CiB9CiAKIHN0YXRpYyBpbnQgYnJjbWZfcHJvdG9fY2RjX2NtcGx0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHUzMiBpZCwgdTMyIGxlbikKQEAgLTEyOCw3ICsxMzAsNyBAQAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAogCWRvIHsKLQkJcmV0ID0gYnJjbWZfc2RicmNtX2J1c19yeGN0bChkcnZyLT5idXMsCisJCXJldCA9IGRydnItPmJ1c19pZi0+YnJjbWZfYnVzX3J4Y3RsKGRydnItPmRldiwKIAkJCQkodW5zaWduZWQgY2hhciAqKSZwcm90LT5tc2csCiAJCQkJbGVuICsgc2l6ZW9mKHN0cnVjdCBicmNtZl9wcm90b19jZGNfZGNtZCkpOwogCQlpZiAocmV0IDwgMCkKQEAgLTI4MCwxMSArMjgyLDExIEBACiAJc3RydWN0IGJyY21mX3Byb3RvICpwcm90ID0gZHJ2ci0+cHJvdDsKIAlpbnQgcmV0ID0gLTE7CiAKLQlpZiAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHsKKwlpZiAoZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikgewogCQlicmNtZl9kYmcoRVJST1IsICJidXMgaXMgZG93bi4gd2UgaGF2ZSBub3RoaW5nIHRvIGRvLlxuIik7CiAJCXJldHVybiByZXQ7CiAJfQotCWJyY21mX29zX3Byb3RvX2Jsb2NrKGRydnIpOworCW11dGV4X2xvY2soJmRydnItPnByb3RvX2Jsb2NrKTsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtMzM4LDcgKzM0MCw3IEBACiAJcHJvdC0+cGVuZGluZyA9IGZhbHNlOwogCiBkb25lOgotCWJyY21mX29zX3Byb3RvX3VuYmxvY2soZHJ2cik7CisJbXV0ZXhfdW5sb2NrKCZkcnZyLT5wcm90b19ibG9jayk7CiAKIAlyZXR1cm4gcmV0OwogfQpAQCAtMzcyLDE0ICszNzQsMTYgQEAKIAogCWgtPnByaW9yaXR5ID0gKHBrdGJ1Zi0+cHJpb3JpdHkgJiBCRENfUFJJT1JJVFlfTUFTSyk7CiAJaC0+ZmxhZ3MyID0gMDsKLQloLT5yc3NpID0gMDsKKwloLT5kYXRhX29mZnNldCA9IDA7CiAJQkRDX1NFVF9JRl9JRFgoaCwgaWZpZHgpOwogfQogCi1pbnQgYnJjbWZfcHJvdG9faGRycHVsbChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgKmlmaWR4LAoraW50IGJyY21mX3Byb3RvX2hkcnB1bGwoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgKmlmaWR4LAogCQkJc3RydWN0IHNrX2J1ZmYgKnBrdGJ1ZikKIHsKIAlzdHJ1Y3QgYnJjbWZfcHJvdG9fYmRjX2hlYWRlciAqaDsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gYnVzX2lmLT5kcnZyOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC00MzUsNyArNDM5LDcgQEAKIAogCWRydnItPnByb3QgPSBjZGM7CiAJZHJ2ci0+aGRybGVuICs9IEJEQ19IRUFERVJfTEVOOwotCWRydnItPm1heGN0bCA9IEJSQ01GX0RDTURfTUFYTEVOICsKKwlkcnZyLT5idXNfaWYtPm1heGN0bCA9IEJSQ01GX0RDTURfTUFYTEVOICsKIAkJCXNpemVvZihzdHJ1Y3QgYnJjbWZfcHJvdG9fY2RjX2RjbWQpICsgUk9VTkRfVVBfTUFSR0lOOwogCXJldHVybiAwOwogCkBAIC00NTEsMTggKzQ1NSw2IEBACiAJZHJ2ci0+cHJvdCA9IE5VTEw7CiB9CiAKLXZvaWQgYnJjbWZfcHJvdG9fZHN0YXRzKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCi17Ci0JLyogTm8gc3RhdHMgZnJvbSBkb25nbGUgYWRkZWQgeWV0LCBjb3B5IGJ1cyBzdGF0cyAqLwotCWRydnItPmRzdGF0cy50eF9wYWNrZXRzID0gZHJ2ci0+dHhfcGFja2V0czsKLQlkcnZyLT5kc3RhdHMudHhfZXJyb3JzID0gZHJ2ci0+dHhfZXJyb3JzOwotCWRydnItPmRzdGF0cy5yeF9wYWNrZXRzID0gZHJ2ci0+cnhfcGFja2V0czsKLQlkcnZyLT5kc3RhdHMucnhfZXJyb3JzID0gZHJ2ci0+cnhfZXJyb3JzOwotCWRydnItPmRzdGF0cy5yeF9kcm9wcGVkID0gZHJ2ci0+cnhfZHJvcHBlZDsKLQlkcnZyLT5kc3RhdHMubXVsdGljYXN0ID0gZHJ2ci0+cnhfbXVsdGljYXN0OwotCXJldHVybjsKLX0KLQogaW50IGJyY21mX3Byb3RvX2luaXQoc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKIHsKIAlpbnQgcmV0ID0gMDsKQEAgLTQ3MCwxOSArNDYyLDE5IEBACiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKLQlicmNtZl9vc19wcm90b19ibG9jayhkcnZyKTsKKwltdXRleF9sb2NrKCZkcnZyLT5wcm90b19ibG9jayk7CiAKIAkvKiBHZXQgdGhlIGRldmljZSBNQUMgYWRkcmVzcyAqLwogCXN0cmNweShidWYsICJjdXJfZXRoZXJhZGRyIik7CiAJcmV0ID0gYnJjbWZfcHJvdG9fY2RjX3F1ZXJ5X2RjbWQoZHJ2ciwgMCwgQlJDTUZfQ19HRVRfVkFSLAogCQkJCQkgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCWlmIChyZXQgPCAwKSB7Ci0JCWJyY21mX29zX3Byb3RvX3VuYmxvY2soZHJ2cik7CisJCW11dGV4X3VubG9jaygmZHJ2ci0+cHJvdG9fYmxvY2spOwogCQlyZXR1cm4gcmV0OwogCX0KIAltZW1jcHkoZHJ2ci0+bWFjLCBidWYsIEVUSF9BTEVOKTsKIAotCWJyY21mX29zX3Byb3RvX3VuYmxvY2soZHJ2cik7CisJbXV0ZXhfdW5sb2NrKCZkcnZyLT5wcm90b19ibG9jayk7CiAKIAlyZXQgPSBicmNtZl9jX3ByZWluaXRfZGNtZHMoZHJ2cik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2NvbW1vbi5jCmluZGV4IDg5MTgyNjEuLmE1MWQ4ZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9jb21tb24uYwpAQCAtMzIsOCArMzIsNiBAQAogI2RlZmluZSBQS1RGSUxURVJfQlVGX1NJWkUJCTIwNDgKICNkZWZpbmUgQlJDTUZfQVJQT0xfTU9ERQkJMHhiCS8qIGFnZW50fHNub29wfHBlZXJfYXV0b3JlcGx5ICovCiAKLWludCBicmNtZl9tc2dfbGV2ZWw7Ci0KICNkZWZpbmUgTVNHVFJBQ0VfVkVSU0lPTgkxCiAKICNkZWZpbmUgQlJDTUZfUEtUX0ZJTFRFUl9GSVhFRF9MRU4Jb2Zmc2V0b2Yoc3RydWN0IGJyY21mX3BrdF9maWx0ZXJfbGUsIHUpCkBAIC04NSwyNSArODMsMTQgQEAKIAlyZXR1cm4gbGVuOwogfQogCi12b2lkIGJyY21mX2NfaW5pdCh2b2lkKQotewotCS8qIEluaXQgZ2xvYmFsIHZhcmlhYmxlcyBhdCBydW4tdGltZSwgbm90IGFzIHBhcnQgb2YgdGhlIGRlY2xhcmF0aW9uLgotCSAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gc3VwcG9ydCBpbml0L2RlLWluaXQgb2YgdGhlIGRyaXZlci4KLQkgKiBJbml0aWFsaXphdGlvbgotCSAqIG9mIGdsb2JhbHMgYXMgcGFydCBvZiB0aGUgZGVjbGFyYXRpb24gcmVzdWx0cyBpbiBub24tZGV0ZXJtaW5pc3RpYwotCSAqIGJlaGF2aW91ciBzaW5jZSB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbHMgbWF5IGJlIGRpZmZlcmVudCBvbiB0aGUKLQkgKiBmaXJzdCB0aW1lIHRoYXQgdGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCB2cyBzdWJzZXF1ZW50Ci0JICogaW5pdGlhbGl6YXRpb25zLgotCSAqLwotCWJyY21mX21zZ19sZXZlbCA9IEJSQ01GX0VSUk9SX1ZBTDsKLX0KLQotYm9vbCBicmNtZl9jX3ByZWNfZW5xKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIHN0cnVjdCBwa3RxICpxLAorYm9vbCBicmNtZl9jX3ByZWNfZW5xKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBrdHEgKnEsCiAJCSAgICAgIHN0cnVjdCBza19idWZmICpwa3QsIGludCBwcmVjKQogewogCXN0cnVjdCBza19idWZmICpwOwogCWludCBlcHJlYyA9IC0xOwkJLyogcHJlY2VkZW5jZSB0byBldmljdCBmcm9tICovCiAJYm9vbCBkaXNjYXJkX29sZGVzdDsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gYnVzX2lmLT5kcnZyOwogCiAJLyogRmFzdCBjYXNlLCBwcmVjZWRlbmNlIHF1ZXVlIGlzIG5vdCBmdWxsIGFuZCB3ZSBhcmUgYWxzbyBub3QKIAkgKiBleGNlZWRpbmcgdG90YWwgcXVldWUgbGVuZ3RoCkBAIC00NDYsNyArNDMzLDcgQEAKICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAogaW50Ci1icmNtZl9jX2hvc3RfZXZlbnQoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50ICppZmlkeCwgdm9pZCAqcGt0ZGF0YSwKK2JyY21mX2NfaG9zdF9ldmVudChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgKmlmaWR4LCB2b2lkICpwa3RkYXRhLAogCQkgICBzdHJ1Y3QgYnJjbWZfZXZlbnRfbXNnICpldmVudCwgdm9pZCAqKmRhdGFfcHRyKQogewogCS8qIGNoZWNrIHdoZXRoZXIgcGFja2V0IGlzIGEgQlJDTSBldmVudCBwa3QgKi8KQEAgLTQ4OCwxOSArNDc1LDE4IEBACiAKIAkJaWYgKGlmZXZlbnQtPmlmaWR4ID4gMCAmJiBpZmV2ZW50LT5pZmlkeCA8IEJSQ01GX01BWF9JRlMpIHsKIAkJCWlmIChpZmV2ZW50LT5hY3Rpb24gPT0gQlJDTUZfRV9JRl9BREQpCi0JCQkJYnJjbWZfYWRkX2lmKGRydnJfcHJpdiwgaWZldmVudC0+aWZpZHgsIE5VTEwsCisJCQkJYnJjbWZfYWRkX2lmKGRydnItPmRldiwgaWZldmVudC0+aWZpZHgsCiAJCQkJCSAgICAgZXZlbnQtPmlmbmFtZSwKLQkJCQkJICAgICBwdnRfZGF0YS0+ZXRoLmhfZGVzdCwKLQkJCQkJICAgICBpZmV2ZW50LT5mbGFncywgaWZldmVudC0+YnNzaWR4KTsKKwkJCQkJICAgICBwdnRfZGF0YS0+ZXRoLmhfZGVzdCk7CiAJCQllbHNlCi0JCQkJYnJjbWZfZGVsX2lmKGRydnJfcHJpdiwgaWZldmVudC0+aWZpZHgpOworCQkJCWJyY21mX2RlbF9pZihkcnZyLCBpZmV2ZW50LT5pZmlkeCk7CiAJCX0gZWxzZSB7CiAJCQlicmNtZl9kYmcoRVJST1IsICJJbnZhbGlkIGlmaWR4ICVkIGZvciAlc1xuIiwKIAkJCQkgIGlmZXZlbnQtPmlmaWR4LCBldmVudC0+aWZuYW1lKTsKIAkJfQogCiAJCS8qIHNlbmQgdXAgdGhlIGlmIGV2ZW50OiBidGFtcCB1c2VyIG5lZWRzIGl0ICovCi0JCSppZmlkeCA9IGJyY21mX2lmbmFtZTJpZHgoZHJ2cl9wcml2LCBldmVudC0+aWZuYW1lKTsKKwkJKmlmaWR4ID0gYnJjbWZfaWZuYW1lMmlkeChkcnZyLCBldmVudC0+aWZuYW1lKTsKIAkJYnJlYWs7CiAKIAkJLyogVGhlc2UgYXJlIHdoYXQgZXh0ZXJuYWwgc3VwcGxpY2FudC9hdXRoZW50aWNhdG9yIHdhbnRzICovCkBAIC01MTIsNyArNDk4LDcgQEAKIAlkZWZhdWx0OgogCQkvKiBGYWxsIHRocm91Z2g6IHRoaXMgc2hvdWxkIGdldCBfZXZlcnl0aGluZ18gICovCiAKLQkJKmlmaWR4ID0gYnJjbWZfaWZuYW1lMmlkeChkcnZyX3ByaXYsIGV2ZW50LT5pZm5hbWUpOworCQkqaWZpZHggPSBicmNtZl9pZm5hbWUyaWR4KGRydnIsIGV2ZW50LT5pZm5hbWUpOwogCQlicmNtZl9kYmcoVFJBQ0UsICJNQUMgZXZlbnQgJWQsIGZsYWdzICV4LCBzdGF0dXMgJXhcbiIsCiAJCQkgIHR5cGUsIGZsYWdzLCBzdGF0dXMpOwogCkBAIC04MTIsNyArNzk4LDcgQEAKIAkJCQkgImV2ZW50X21zZ3MiICsgJ1wwJyArIGJpdHZlYyAgKi8KIAl1aW50IHVwID0gMDsKIAljaGFyIGJ1ZlsxMjhdLCAqcHRyOwotCXUzMiBkb25nbGVfYWxpZ24gPSBCUkNNRl9TREFMSUdOOworCXUzMiBkb25nbGVfYWxpZ24gPSBkcnZyLT5idXNfaWYtPmFsaWduOwogCXUzMiBnbG9tID0gMDsKIAl1MzIgcm9hbWluZyA9IDE7CiAJdWludCBiY25fdGltZW91dCA9IDM7CkBAIC04MjAsNyArODA2LDcgQEAKIAlpbnQgc2Nhbl91bmFzc29jX3RpbWUgPSA0MDsKIAlpbnQgaTsKIAotCWJyY21mX29zX3Byb3RvX2Jsb2NrKGRydnIpOworCW11dGV4X2xvY2soJmRydnItPnByb3RvX2Jsb2NrKTsKIAogCS8qIFNldCBDb3VudHJ5IGNvZGUgKi8KIAlpZiAoZHJ2ci0+Y291bnRyeV9jb2RlWzBdICE9IDApIHsKQEAgLTg4OSw3ICs4NzUsNyBAQAogCQkJCQkJIDAsIHRydWUpOwogCX0KIAotCWJyY21mX29zX3Byb3RvX3VuYmxvY2soZHJ2cik7CisJbXV0ZXhfdW5sb2NrKCZkcnZyLT5wcm90b19ibG9jayk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfZGJnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2RiZy5oCmluZGV4IDc0Njc5MjIuLmJiMjZlZTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfZGJnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9kYmcuaApAQCAtMTcsNiArMTcsMjEgQEAKICNpZm5kZWYgX0JSQ01GX0RCR19IXwogI2RlZmluZSBfQlJDTUZfREJHX0hfCiAKKy8qIG1lc3NhZ2UgbGV2ZWxzICovCisjZGVmaW5lIEJSQ01GX0VSUk9SX1ZBTAkweDAwMDEKKyNkZWZpbmUgQlJDTUZfVFJBQ0VfVkFMCTB4MDAwMgorI2RlZmluZSBCUkNNRl9JTkZPX1ZBTAkweDAwMDQKKyNkZWZpbmUgQlJDTUZfREFUQV9WQUwJMHgwMDA4CisjZGVmaW5lIEJSQ01GX0NUTF9WQUwJMHgwMDEwCisjZGVmaW5lIEJSQ01GX1RJTUVSX1ZBTAkweDAwMjAKKyNkZWZpbmUgQlJDTUZfSERSU19WQUwJMHgwMDQwCisjZGVmaW5lIEJSQ01GX0JZVEVTX1ZBTAkweDAwODAKKyNkZWZpbmUgQlJDTUZfSU5UUl9WQUwJMHgwMTAwCisjZGVmaW5lIEJSQ01GX0dMT01fVkFMCTB4MDQwMAorI2RlZmluZSBCUkNNRl9FVkVOVF9WQUwJMHgwODAwCisjZGVmaW5lIEJSQ01GX0JUQV9WQUwJMHgxMDAwCisjZGVmaW5lIEJSQ01GX0lTQ0FOX1ZBTCAweDIwMDAKKwogI2lmIGRlZmluZWQoQkNNREJHKQogCiAjZGVmaW5lIGJyY21mX2RiZyhsZXZlbCwgZm10LCAuLi4pCQkJCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX2xpbnV4LmMKaW5kZXggNGFjYmFjNS4uZWI5ZWI3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9saW51eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfbGludXguYwpAQCAtNDMsNyArNDMsNiBAQAogI2luY2x1ZGUgImRoZF9wcm90by5oIgogI2luY2x1ZGUgImRoZF9kYmcuaCIKICNpbmNsdWRlICJ3bF9jZmc4MDIxMS5oIgotI2luY2x1ZGUgImJjbWNoaXAuaCIKIAogTU9EVUxFX0FVVEhPUigiQnJvYWRjb20gQ29ycG9yYXRpb24iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiQnJvYWRjb20gODAyLjExbiB3aXJlbGVzcyBMQU4gZnVsbG1hYyBkcml2ZXIuIik7CkBAIC01Myw0OCArNTIsMTkgQEAKIAogLyogSW50ZXJmYWNlIGNvbnRyb2wgaW5mb3JtYXRpb24gKi8KIHN0cnVjdCBicmNtZl9pZiB7Ci0Jc3RydWN0IGJyY21mX2luZm8gKmluZm87CS8qIGJhY2sgcG9pbnRlciB0byBicmNtZl9pbmZvICovCisJc3RydWN0IGJyY21mX3B1YiAqZHJ2cjsJLyogYmFjayBwb2ludGVyIHRvIGJyY21mX3B1YiAqLwogCS8qIE9TL3N0YWNrIHNwZWNpZmljcyAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzIHN0YXRzOwogCWludCBpZHg7CQkvKiBpZmFjZSBpZHggaW4gZG9uZ2xlICovCi0JaW50IHN0YXRlOwkJLyogaW50ZXJmYWNlIHN0YXRlICovCiAJdTggbWFjX2FkZHJbRVRIX0FMRU5dOwkvKiBhc3NpZ25lZCBNQUMgYWRkcmVzcyAqLwogfTsKIAotLyogTG9jYWwgcHJpdmF0ZSBzdHJ1Y3R1cmUgKGV4dGVuc2lvbiBvZiBwdWIpICovCi1zdHJ1Y3QgYnJjbWZfaW5mbyB7Ci0Jc3RydWN0IGJyY21mX3B1YiBwdWI7Ci0KLQkvKiBPUy9zdGFjayBzcGVjaWZpY3MgKi8KLQlzdHJ1Y3QgYnJjbWZfaWYgKmlmbGlzdFtCUkNNRl9NQVhfSUZTXTsKLQotCXN0cnVjdCBtdXRleCBwcm90b19ibG9jazsKLQotCXN0cnVjdCB3b3JrX3N0cnVjdCBzZXRtYWNhZGRyX3dvcms7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IG11bHRpY2FzdF93b3JrOwotCXU4IG1hY3ZhbHVlW0VUSF9BTEVOXTsKLQlhdG9taWNfdCBwZW5kXzgwMjF4X2NudDsKLX07Ci0KIC8qIEVycm9yIGJpdHMgKi8KK2ludCBicmNtZl9tc2dfbGV2ZWwgPSBCUkNNRl9FUlJPUl9WQUw7CiBtb2R1bGVfcGFyYW0oYnJjbWZfbXNnX2xldmVsLCBpbnQsIDApOwogCi0KLXN0YXRpYyBpbnQgYnJjbWZfbmV0MmlkeChzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKLXsKLQlpbnQgaSA9IDA7Ci0KLQl3aGlsZSAoaSA8IEJSQ01GX01BWF9JRlMpIHsKLQkJaWYgKGRydnJfcHJpdi0+aWZsaXN0W2ldICYmIGRydnJfcHJpdi0+aWZsaXN0W2ldLT5uZGV2ID09IG5kZXYpCi0JCQlyZXR1cm4gaTsKLQkJaSsrOwotCX0KLQotCXJldHVybiBCUkNNRl9CQURfSUY7Ci19Ci0KLWludCBicmNtZl9pZm5hbWUyaWR4KHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGNoYXIgKm5hbWUpCitpbnQgYnJjbWZfaWZuYW1lMmlkeChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBjaGFyICpuYW1lKQogewogCWludCBpID0gQlJDTUZfTUFYX0lGUzsKIAlzdHJ1Y3QgYnJjbWZfaWYgKmlmcDsKQEAgLTEwMyw3ICs3Myw3IEBACiAJCXJldHVybiAwOwogCiAJd2hpbGUgKC0taSA+IDApIHsKLQkJaWZwID0gZHJ2cl9wcml2LT5pZmxpc3RbaV07CisJCWlmcCA9IGRydnItPmlmbGlzdFtpXTsKIAkJaWYgKGlmcCAmJiAhc3RybmNtcChpZnAtPm5kZXYtPm5hbWUsIG5hbWUsIElGTkFNU0laKSkKIAkJCWJyZWFrOwogCX0KQEAgLTExNSwyMCArODUsMTggQEAKIAogY2hhciAqYnJjbWZfaWZuYW1lKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCkKIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKLQogCWlmIChpZmlkeCA8IDAgfHwgaWZpZHggPj0gQlJDTUZfTUFYX0lGUykgewogCQlicmNtZl9kYmcoRVJST1IsICJpZmlkeCAlZCBvdXQgb2YgcmFuZ2VcbiIsIGlmaWR4KTsKIAkJcmV0dXJuICI8aWZfYmFkPiI7CiAJfQogCi0JaWYgKGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XSA9PSBOVUxMKSB7CisJaWYgKGRydnItPmlmbGlzdFtpZmlkeF0gPT0gTlVMTCkgewogCQlicmNtZl9kYmcoRVJST1IsICJudWxsIGkvZiAlZFxuIiwgaWZpZHgpOwogCQlyZXR1cm4gIjxpZl9udWxsPiI7CiAJfQogCi0JaWYgKGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XS0+bmRldikKLQkJcmV0dXJuIGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XS0+bmRldi0+bmFtZTsKKwlpZiAoZHJ2ci0+aWZsaXN0W2lmaWR4XS0+bmRldikKKwkJcmV0dXJuIGRydnItPmlmbGlzdFtpZmlkeF0tPm5kZXYtPm5hbWU7CiAKIAlyZXR1cm4gIjxpZl9ub25lPiI7CiB9CkBAIC0xNDYsMTAgKzExNCwxMCBAQAogCXVpbnQgYnVmbGVuOwogCWludCByZXQ7CiAKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBicmNtZl9pbmZvLAorCXN0cnVjdCBicmNtZl9wdWIgKmRydnIgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGJyY21mX3B1YiwKIAkJCQkJCSAgICBtdWx0aWNhc3Rfd29yayk7CiAKLQluZGV2ID0gZHJ2cl9wcml2LT5pZmxpc3RbMF0tPm5kZXY7CisJbmRldiA9IGRydnItPmlmbGlzdFswXS0+bmRldjsKIAljbnQgPSBuZXRkZXZfbWNfY291bnQobmRldik7CiAKIAkvKiBEZXRlcm1pbmUgaW5pdGlhbCB2YWx1ZSBvZiBhbGxtdWx0aSBmbGFnICovCkBAIC0xODMsMTAgKzE1MSwxMCBAQAogCWRjbWQubGVuID0gYnVmbGVuOwogCWRjbWQuc2V0ID0gdHJ1ZTsKIAotCXJldCA9IGJyY21mX3Byb3RvX2RjbWQoJmRydnJfcHJpdi0+cHViLCAwLCAmZGNtZCwgZGNtZC5sZW4pOworCXJldCA9IGJyY21mX3Byb3RvX2RjbWQoZHJ2ciwgMCwgJmRjbWQsIGRjbWQubGVuKTsKIAlpZiAocmV0IDwgMCkgewogCQlicmNtZl9kYmcoRVJST1IsICIlczogc2V0IG1jYXN0X2xpc3QgZmFpbGVkLCBjbnQgJWRcbiIsCi0JCQkgIGJyY21mX2lmbmFtZSgmZHJ2cl9wcml2LT5wdWIsIDApLCBjbnQpOworCQkJICBicmNtZl9pZm5hbWUoZHJ2ciwgMCksIGNudCk7CiAJCWRjbWRfdmFsdWUgPSBjbnQgPyB0cnVlIDogZGNtZF92YWx1ZTsKIAl9CiAKQEAgLTIwOCw3ICsxNzYsNyBAQAogCSAgICAoImFsbG11bHRpIiwgKHZvaWQgKikmZGNtZF9sZV92YWx1ZSwKIAkgICAgc2l6ZW9mKGRjbWRfbGVfdmFsdWUpLCBidWYsIGJ1ZmxlbikpIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiJXM6IG1raW92YXIgZmFpbGVkIGZvciBhbGxtdWx0aSwgZGF0YWxlbiAlZCBidWZsZW4gJXVcbiIsCi0JCQkgIGJyY21mX2lmbmFtZSgmZHJ2cl9wcml2LT5wdWIsIDApLAorCQkJICBicmNtZl9pZm5hbWUoZHJ2ciwgMCksCiAJCQkgIChpbnQpc2l6ZW9mKGRjbWRfdmFsdWUpLCBidWZsZW4pOwogCQlrZnJlZShidWYpOwogCQlyZXR1cm47CkBAIC0yMjAsMTAgKzE4OCwxMCBAQAogCWRjbWQubGVuID0gYnVmbGVuOwogCWRjbWQuc2V0ID0gdHJ1ZTsKIAotCXJldCA9IGJyY21mX3Byb3RvX2RjbWQoJmRydnJfcHJpdi0+cHViLCAwLCAmZGNtZCwgZGNtZC5sZW4pOworCXJldCA9IGJyY21mX3Byb3RvX2RjbWQoZHJ2ciwgMCwgJmRjbWQsIGRjbWQubGVuKTsKIAlpZiAocmV0IDwgMCkgewogCQlicmNtZl9kYmcoRVJST1IsICIlczogc2V0IGFsbG11bHRpICVkIGZhaWxlZFxuIiwKLQkJCSAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgMCksCisJCQkgIGJyY21mX2lmbmFtZShkcnZyLCAwKSwKIAkJCSAgbGUzMl90b19jcHUoZGNtZF9sZV92YWx1ZSkpOwogCX0KIApAQCAtMjQxLDEwICsyMDksMTAgQEAKIAlkY21kLmxlbiA9IHNpemVvZihkY21kX2xlX3ZhbHVlKTsKIAlkY21kLnNldCA9IHRydWU7CiAKLQlyZXQgPSBicmNtZl9wcm90b19kY21kKCZkcnZyX3ByaXYtPnB1YiwgMCwgJmRjbWQsIGRjbWQubGVuKTsKKwlyZXQgPSBicmNtZl9wcm90b19kY21kKGRydnIsIDAsICZkY21kLCBkY21kLmxlbik7CiAJaWYgKHJldCA8IDApIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiJXM6IHNldCBwcm9taXNjICVkIGZhaWxlZFxuIiwKLQkJCSAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgMCksCisJCQkgIGJyY21mX2lmbmFtZShkcnZyLCAwKSwKIAkJCSAgbGUzMl90b19jcHUoZGNtZF9sZV92YWx1ZSkpOwogCX0KIH0KQEAgLTI1NiwxNCArMjI0LDE0IEBACiAJc3RydWN0IGJyY21mX2RjbWQgZGNtZDsKIAlpbnQgcmV0OwogCi0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgYnJjbWZfaW5mbywKKwlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBicmNtZl9wdWIsCiAJCQkJCQkgICAgc2V0bWFjYWRkcl93b3JrKTsKIAogCWJyY21mX2RiZyhUUkFDRSwgImVudGVyXG4iKTsKLQlpZiAoIWJyY21mX2NfbWtpb3ZhcigiY3VyX2V0aGVyYWRkciIsIChjaGFyICopZHJ2cl9wcml2LT5tYWN2YWx1ZSwKKwlpZiAoIWJyY21mX2NfbWtpb3ZhcigiY3VyX2V0aGVyYWRkciIsIChjaGFyICopZHJ2ci0+bWFjdmFsdWUsCiAJCQkgICBFVEhfQUxFTiwgYnVmLCAzMikpIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiJXM6IG1raW92YXIgZmFpbGVkIGZvciBjdXJfZXRoZXJhZGRyXG4iLAotCQkJICBicmNtZl9pZm5hbWUoJmRydnJfcHJpdi0+cHViLCAwKSk7CisJCQkgIGJyY21mX2lmbmFtZShkcnZyLCAwKSk7CiAJCXJldHVybjsKIAl9CiAJbWVtc2V0KCZkY21kLCAwLCBzaXplb2YoZGNtZCkpOwpAQCAtMjcyLDUyICsyNDAsNDAgQEAKIAlkY21kLmxlbiA9IDMyOwogCWRjbWQuc2V0ID0gdHJ1ZTsKIAotCXJldCA9IGJyY21mX3Byb3RvX2RjbWQoJmRydnJfcHJpdi0+cHViLCAwLCAmZGNtZCwgZGNtZC5sZW4pOworCXJldCA9IGJyY21mX3Byb3RvX2RjbWQoZHJ2ciwgMCwgJmRjbWQsIGRjbWQubGVuKTsKIAlpZiAocmV0IDwgMCkKIAkJYnJjbWZfZGJnKEVSUk9SLCAiJXM6IHNldCBjdXJfZXRoZXJhZGRyIGZhaWxlZFxuIiwKLQkJCSAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgMCkpOworCQkJICBicmNtZl9pZm5hbWUoZHJ2ciwgMCkpOwogCWVsc2UKLQkJbWVtY3B5KGRydnJfcHJpdi0+aWZsaXN0WzBdLT5uZGV2LT5kZXZfYWRkciwKLQkJICAgICAgIGRydnJfcHJpdi0+bWFjdmFsdWUsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGRydnItPmlmbGlzdFswXS0+bmRldi0+ZGV2X2FkZHIsCisJCSAgICAgICBkcnZyLT5tYWN2YWx1ZSwgRVRIX0FMRU4pOwogCiAJcmV0dXJuOwogfQogCiBzdGF0aWMgaW50IGJyY21mX25ldGRldl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHZvaWQgKmFkZHIpCiB7Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9ICooc3RydWN0IGJyY21mX2luZm8gKiopCi0JCQkJCW5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBicmNtZl9pZiAqaWZwID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGJyY21mX3B1YiAqZHJ2ciA9IGlmcC0+ZHJ2cjsKIAlzdHJ1Y3Qgc29ja2FkZHIgKnNhID0gKHN0cnVjdCBzb2NrYWRkciAqKWFkZHI7Ci0JaW50IGlmaWR4OwogCi0JaWZpZHggPSBicmNtZl9uZXQyaWR4KGRydnJfcHJpdiwgbmRldik7Ci0JaWYgKGlmaWR4ID09IEJSQ01GX0JBRF9JRikKLQkJcmV0dXJuIC0xOwotCi0JbWVtY3B5KCZkcnZyX3ByaXYtPm1hY3ZhbHVlLCBzYS0+c2FfZGF0YSwgRVRIX0FMRU4pOwotCXNjaGVkdWxlX3dvcmsoJmRydnJfcHJpdi0+c2V0bWFjYWRkcl93b3JrKTsKKwltZW1jcHkoJmRydnItPm1hY3ZhbHVlLCBzYS0+c2FfZGF0YSwgRVRIX0FMRU4pOworCXNjaGVkdWxlX3dvcmsoJmRydnItPnNldG1hY2FkZHJfd29yayk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkIGJyY21mX25ldGRldl9zZXRfbXVsdGljYXN0X2xpc3Qoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9ICooc3RydWN0IGJyY21mX2luZm8gKiopCi0JCQkJCW5ldGRldl9wcml2KG5kZXYpOwotCWludCBpZmlkeDsKKwlzdHJ1Y3QgYnJjbWZfaWYgKmlmcCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBicmNtZl9wdWIgKmRydnIgPSBpZnAtPmRydnI7CiAKLQlpZmlkeCA9IGJyY21mX25ldDJpZHgoZHJ2cl9wcml2LCBuZGV2KTsKLQlpZiAoaWZpZHggPT0gQlJDTUZfQkFEX0lGKQotCQlyZXR1cm47Ci0KLQlzY2hlZHVsZV93b3JrKCZkcnZyX3ByaXYtPm11bHRpY2FzdF93b3JrKTsKKwlzY2hlZHVsZV93b3JrKCZkcnZyLT5tdWx0aWNhc3Rfd29yayk7CiB9CiAKIGludCBicmNtZl9zZW5kcGt0KHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwgc3RydWN0IHNrX2J1ZmYgKnBrdGJ1ZikKIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKLQogCS8qIFJlamVjdCBpZiBkb3duICovCi0JaWYgKCFkcnZyLT51cCB8fCAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pKQorCWlmICghZHJ2ci0+YnVzX2lmLT5kcnZyX3VwIHx8IChkcnZyLT5idXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19ET1dOKSkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKIAkvKiBVcGRhdGUgbXVsdGljYXN0IHN0YXRpc3RpYyAqLwpAQCAtMzI4LDEyMiArMjg0LDExOCBAQAogCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZWgtPmhfZGVzdCkpCiAJCQlkcnZyLT50eF9tdWx0aWNhc3QrKzsKIAkJaWYgKG50b2hzKGVoLT5oX3Byb3RvKSA9PSBFVEhfUF9QQUUpCi0JCQlhdG9taWNfaW5jKCZkcnZyX3ByaXYtPnBlbmRfODAyMXhfY250KTsKKwkJCWF0b21pY19pbmMoJmRydnItPnBlbmRfODAyMXhfY250KTsKIAl9CiAKIAkvKiBJZiB0aGUgcHJvdG9jb2wgdXNlcyBhIGRhdGEgaGVhZGVyLCBhcHBseSBpdCAqLwogCWJyY21mX3Byb3RvX2hkcnB1c2goZHJ2ciwgaWZpZHgsIHBrdGJ1Zik7CiAKIAkvKiBVc2UgYnVzIG1vZHVsZSB0byBzZW5kIGRhdGEgZnJhbWUgKi8KLQlyZXR1cm4gYnJjbWZfc2RicmNtX2J1c190eGRhdGEoZHJ2ci0+YnVzLCBwa3RidWYpOworCXJldHVybiBkcnZyLT5idXNfaWYtPmJyY21mX2J1c190eGRhdGEoZHJ2ci0+ZGV2LCBwa3RidWYpOwogfQogCiBzdGF0aWMgaW50IGJyY21mX25ldGRldl9zdGFydF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2KQogewogCWludCByZXQ7Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9ICooc3RydWN0IGJyY21mX2luZm8gKiopCi0JCQkJCW5ldGRldl9wcml2KG5kZXYpOwotCWludCBpZmlkeDsKKwlzdHJ1Y3QgYnJjbWZfaWYgKmlmcCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBicmNtZl9wdWIgKmRydnIgPSBpZnAtPmRydnI7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKIAkvKiBSZWplY3QgaWYgZG93biAqLwotCWlmICghZHJ2cl9wcml2LT5wdWIudXAgfHwgKGRydnJfcHJpdi0+cHViLmJ1c3N0YXRlID09IEJSQ01GX0JVU19ET1dOKSkgewotCQlicmNtZl9kYmcoRVJST1IsICJ4bWl0IHJlamVjdGVkIHB1Yi51cD0lZCBidXNzdGF0ZT0lZFxuIiwKLQkJCSAgZHJ2cl9wcml2LT5wdWIudXAsIGRydnJfcHJpdi0+cHViLmJ1c3N0YXRlKTsKKwlpZiAoIWRydnItPmJ1c19pZi0+ZHJ2cl91cCB8fAorCSAgICAoZHJ2ci0+YnVzX2lmLT5zdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikpIHsKKwkJYnJjbWZfZGJnKEVSUk9SLCAieG1pdCByZWplY3RlZCBkcnZ1cD0lZCBzdGF0ZT0lZFxuIiwKKwkJCSAgZHJ2ci0+YnVzX2lmLT5kcnZyX3VwLAorCQkJICBkcnZyLT5idXNfaWYtPnN0YXRlKTsKIAkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JaWZpZHggPSBicmNtZl9uZXQyaWR4KGRydnJfcHJpdiwgbmRldik7Ci0JaWYgKGlmaWR4ID09IEJSQ01GX0JBRF9JRikgewotCQlicmNtZl9kYmcoRVJST1IsICJiYWQgaWZpZHggJWRcbiIsIGlmaWR4KTsKKwlpZiAoIWRydnItPmlmbGlzdFtpZnAtPmlkeF0pIHsKKwkJYnJjbWZfZGJnKEVSUk9SLCAiYmFkIGlmaWR4ICVkXG4iLCBpZnAtPmlkeCk7CiAJCW5ldGlmX3N0b3BfcXVldWUobmRldik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAogCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIGVub3VnaCByb29tIGZvciBhbnkgaGVhZGVyICovCi0JaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgZHJ2cl9wcml2LT5wdWIuaGRybGVuKSB7CisJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgZHJ2ci0+aGRybGVuKSB7CiAJCXN0cnVjdCBza19idWZmICpza2IyOwogCiAJCWJyY21mX2RiZyhJTkZPLCAiJXM6IGluc3VmZmljaWVudCBoZWFkcm9vbVxuIiwKLQkJCSAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgpKTsKLQkJZHJ2cl9wcml2LT5wdWIudHhfcmVhbGxvYysrOwotCQlza2IyID0gc2tiX3JlYWxsb2NfaGVhZHJvb20oc2tiLCBkcnZyX3ByaXYtPnB1Yi5oZHJsZW4pOworCQkJICBicmNtZl9pZm5hbWUoZHJ2ciwgaWZwLT5pZHgpKTsKKwkJZHJ2ci0+YnVzX2lmLT50eF9yZWFsbG9jKys7CisJCXNrYjIgPSBza2JfcmVhbGxvY19oZWFkcm9vbShza2IsIGRydnItPmhkcmxlbik7CiAJCWRldl9rZnJlZV9za2Ioc2tiKTsKIAkJc2tiID0gc2tiMjsKIAkJaWYgKHNrYiA9PSBOVUxMKSB7CiAJCQlicmNtZl9kYmcoRVJST1IsICIlczogc2tiX3JlYWxsb2NfaGVhZHJvb20gZmFpbGVkXG4iLAotCQkJCSAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgpKTsKKwkJCQkgIGJyY21mX2lmbmFtZShkcnZyLCBpZnAtPmlkeCkpOwogCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gZG9uZTsKIAkJfQogCX0KIAotCXJldCA9IGJyY21mX3NlbmRwa3QoJmRydnJfcHJpdi0+cHViLCBpZmlkeCwgc2tiKTsKKwlyZXQgPSBicmNtZl9zZW5kcGt0KGRydnIsIGlmcC0+aWR4LCBza2IpOwogCiBkb25lOgogCWlmIChyZXQpCi0JCWRydnJfcHJpdi0+cHViLmRzdGF0cy50eF9kcm9wcGVkKys7CisJCWRydnItPmJ1c19pZi0+ZHN0YXRzLnR4X2Ryb3BwZWQrKzsKIAllbHNlCi0JCWRydnJfcHJpdi0+cHViLnR4X3BhY2tldHMrKzsKKwkJZHJ2ci0+YnVzX2lmLT5kc3RhdHMudHhfcGFja2V0cysrOwogCiAJLyogUmV0dXJuIG9rOiB3ZSBhbHdheXMgZWF0IHRoZSBwYWNrZXQgKi8KIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBicmNtZl90eGZsb3djb250cm9sKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwgYm9vbCBzdGF0ZSkKK3ZvaWQgYnJjbWZfdHhmbG93Y29udHJvbChzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpZmlkeCwgYm9vbCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gYnVzX2lmLT5kcnZyOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCi0JZHJ2ci0+dHhvZmYgPSBzdGF0ZTsKLQluZGV2ID0gZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdLT5uZGV2OworCW5kZXYgPSBkcnZyLT5pZmxpc3RbaWZpZHhdLT5uZGV2OwogCWlmIChzdGF0ZSA9PSBPTikKIAkJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKIAllbHNlCiAJCW5ldGlmX3dha2VfcXVldWUobmRldik7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfaG9zdF9ldmVudChzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBpbnQgKmlmaWR4LAorc3RhdGljIGludCBicmNtZl9ob3N0X2V2ZW50KHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCAqaWZpZHgsCiAJCQkgICAgdm9pZCAqcGt0ZGF0YSwgc3RydWN0IGJyY21mX2V2ZW50X21zZyAqZXZlbnQsCiAJCQkgICAgdm9pZCAqKmRhdGEpCiB7CiAJaW50IGJjbWVycm9yID0gMDsKIAotCWJjbWVycm9yID0gYnJjbWZfY19ob3N0X2V2ZW50KGRydnJfcHJpdiwgaWZpZHgsIHBrdGRhdGEsIGV2ZW50LCBkYXRhKTsKKwliY21lcnJvciA9IGJyY21mX2NfaG9zdF9ldmVudChkcnZyLCBpZmlkeCwgcGt0ZGF0YSwgZXZlbnQsIGRhdGEpOwogCWlmIChiY21lcnJvciAhPSAwKQogCQlyZXR1cm4gYmNtZXJyb3I7CiAKLQlpZiAoZHJ2cl9wcml2LT5pZmxpc3RbKmlmaWR4XS0+bmRldikKLQkJYnJjbWZfY2ZnODAyMTFfZXZlbnQoZHJ2cl9wcml2LT5pZmxpc3RbKmlmaWR4XS0+bmRldiwKKwlpZiAoZHJ2ci0+aWZsaXN0WyppZmlkeF0tPm5kZXYpCisJCWJyY21mX2NmZzgwMjExX2V2ZW50KGRydnItPmlmbGlzdFsqaWZpZHhdLT5uZGV2LAogCQkJCSAgICAgZXZlbnQsICpkYXRhKTsKIAogCXJldHVybiBiY21lcnJvcjsKIH0KIAotdm9pZCBicmNtZl9yeF9mcmFtZShzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgaWZpZHgsIHN0cnVjdCBza19idWZmICpza2IsCi0JCSAgaW50IG51bXBrdCkKK3ZvaWQgYnJjbWZfcnhfZnJhbWUoc3RydWN0IGRldmljZSAqZGV2LCBpbnQgaWZpZHgsCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpza2JfbGlzdCkKIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKIAl1bnNpZ25lZCBjaGFyICpldGg7CiAJdWludCBsZW47CiAJdm9pZCAqZGF0YTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcG5leHQsICpzYXZlX3BrdGJ1ZjsKLQlpbnQgaTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqcG5leHQ7CiAJc3RydWN0IGJyY21mX2lmICppZnA7CiAJc3RydWN0IGJyY21mX2V2ZW50X21zZyBldmVudDsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gYnVzX2lmLT5kcnZyOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCi0Jc2F2ZV9wa3RidWYgPSBza2I7Ci0KLQlmb3IgKGkgPSAwOyBza2IgJiYgaSA8IG51bXBrdDsgaSsrLCBza2IgPSBwbmV4dCkgewotCi0JCXBuZXh0ID0gc2tiLT5uZXh0OwotCQlza2ItPm5leHQgPSBOVUxMOworCXNrYl9xdWV1ZV93YWxrX3NhZmUoc2tiX2xpc3QsIHNrYiwgcG5leHQpIHsKKwkJc2tiX3VubGluayhza2IsIHNrYl9saXN0KTsKIAogCQkvKiBHZXQgdGhlIHByb3RvY29sLCBtYWludGFpbiBza2IgYXJvdW5kIGV0aF90eXBlX3RyYW5zKCkKIAkJICogVGhlIG1haW4gcmVhc29uIGZvciB0aGlzIGhhY2sgaXMgZm9yIHRoZSBsaW1pdGF0aW9uIG9mCkBAIC00NjAsMTUgKzQxMiwyMSBAQAogCQlldGggPSBza2ItPmRhdGE7CiAJCWxlbiA9IHNrYi0+bGVuOwogCi0JCWlmcCA9IGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XTsKKwkJaWZwID0gZHJ2ci0+aWZsaXN0W2lmaWR4XTsKIAkJaWYgKGlmcCA9PSBOVUxMKQotCQkJaWZwID0gZHJ2cl9wcml2LT5pZmxpc3RbMF07CisJCQlpZnAgPSBkcnZyLT5pZmxpc3RbMF07CisKKwkJaWYgKCFpZnAgfHwgIWlmcC0+bmRldiB8fAorCQkgICAgaWZwLT5uZGV2LT5yZWdfc3RhdGUgIT0gTkVUUkVHX1JFR0lTVEVSRUQpIHsKKwkJCWJyY211X3BrdF9idWZfZnJlZV9za2Ioc2tiKTsKKwkJCWNvbnRpbnVlOworCQl9CiAKIAkJc2tiLT5kZXYgPSBpZnAtPm5kZXY7CiAJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIHNrYi0+ZGV2KTsKIAogCQlpZiAoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTVVMVElDQVNUKQotCQkJZHJ2cl9wcml2LT5wdWIucnhfbXVsdGljYXN0Kys7CisJCQlidXNfaWYtPmRzdGF0cy5tdWx0aWNhc3QrKzsKIAogCQlza2ItPmRhdGEgPSBldGg7CiAJCXNrYi0+bGVuID0gbGVuOwpAQCAtNDc4LDE5ICs0MzYsMTcgQEAKIAogCQkvKiBQcm9jZXNzIHNwZWNpYWwgZXZlbnQgcGFja2V0cyBhbmQgdGhlbiBkaXNjYXJkIHRoZW0gKi8KIAkJaWYgKG50b2hzKHNrYi0+cHJvdG9jb2wpID09IEVUSF9QX0xJTktfQ1RMKQotCQkJYnJjbWZfaG9zdF9ldmVudChkcnZyX3ByaXYsICZpZmlkeCwKKwkJCWJyY21mX2hvc3RfZXZlbnQoZHJ2ciwgJmlmaWR4LAogCQkJCQkgIHNrYl9tYWNfaGVhZGVyKHNrYiksCiAJCQkJCSAgJmV2ZW50LCAmZGF0YSk7CiAKLQkJaWYgKGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XSAmJgotCQkgICAgIWRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XS0+c3RhdGUpCi0JCQlpZnAgPSBkcnZyX3ByaXYtPmlmbGlzdFtpZmlkeF07Ci0KLQkJaWYgKGlmcC0+bmRldikKKwkJaWYgKGRydnItPmlmbGlzdFtpZmlkeF0pIHsKKwkJCWlmcCA9IGRydnItPmlmbGlzdFtpZmlkeF07CiAJCQlpZnAtPm5kZXYtPmxhc3RfcnggPSBqaWZmaWVzOworCQl9CiAKLQkJZHJ2ci0+ZHN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOwotCQlkcnZyLT5yeF9wYWNrZXRzKys7CS8qIExvY2FsIGNvdW50ICovCisJCWJ1c19pZi0+ZHN0YXRzLnJ4X2J5dGVzICs9IHNrYi0+bGVuOworCQlidXNfaWYtPmRzdGF0cy5yeF9wYWNrZXRzKys7CS8qIExvY2FsIGNvdW50ICovCiAKIAkJaWYgKGluX2ludGVycnVwdCgpKQogCQkJbmV0aWZfcngoc2tiKTsKQEAgLTUwNSw1OSArNDYxLDQ4IEBACiAJfQogfQogCi12b2lkIGJyY21mX3R4Y29tcGxldGUoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgc3RydWN0IHNrX2J1ZmYgKnR4cCwgYm9vbCBzdWNjZXNzKQordm9pZCBicmNtZl90eGNvbXBsZXRlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNrX2J1ZmYgKnR4cCwgYm9vbCBzdWNjZXNzKQogewogCXVpbnQgaWZpZHg7Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGRydnItPmluZm87CiAJc3RydWN0IGV0aGhkciAqZWg7CiAJdTE2IHR5cGU7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJyY21mX3B1YiAqZHJ2ciA9IGJ1c19pZi0+ZHJ2cjsKIAotCWJyY21mX3Byb3RvX2hkcnB1bGwoZHJ2ciwgJmlmaWR4LCB0eHApOworCWJyY21mX3Byb3RvX2hkcnB1bGwoZGV2LCAmaWZpZHgsIHR4cCk7CiAKIAllaCA9IChzdHJ1Y3QgZXRoaGRyICopKHR4cC0+ZGF0YSk7CiAJdHlwZSA9IG50b2hzKGVoLT5oX3Byb3RvKTsKIAogCWlmICh0eXBlID09IEVUSF9QX1BBRSkKLQkJYXRvbWljX2RlYygmZHJ2cl9wcml2LT5wZW5kXzgwMjF4X2NudCk7CisJCWF0b21pY19kZWMoJmRydnItPnBlbmRfODAyMXhfY250KTsKIAogfQogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmJyY21mX25ldGRldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9ICooc3RydWN0IGJyY21mX2luZm8gKiopCi0JCQkJCW5ldGRldl9wcml2KG5kZXYpOwotCXN0cnVjdCBicmNtZl9pZiAqaWZwOwotCWludCBpZmlkeDsKKwlzdHJ1Y3QgYnJjbWZfaWYgKmlmcCA9IG5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGlmcC0+ZHJ2ci0+YnVzX2lmOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCi0JaWZpZHggPSBicmNtZl9uZXQyaWR4KGRydnJfcHJpdiwgbmRldik7Ci0JaWYgKGlmaWR4ID09IEJSQ01GX0JBRF9JRikKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZnAgPSBkcnZyX3ByaXYtPmlmbGlzdFtpZmlkeF07Ci0KLQlpZiAoZHJ2cl9wcml2LT5wdWIudXApCi0JCS8qIFVzZSB0aGUgcHJvdG9jb2wgdG8gZ2V0IGRvbmdsZSBzdGF0cyAqLwotCQlicmNtZl9wcm90b19kc3RhdHMoJmRydnJfcHJpdi0+cHViKTsKLQogCS8qIENvcHkgZG9uZ2xlIHN0YXRzIHRvIG5ldCBkZXZpY2Ugc3RhdHMgKi8KLQlpZnAtPnN0YXRzLnJ4X3BhY2tldHMgPSBkcnZyX3ByaXYtPnB1Yi5kc3RhdHMucnhfcGFja2V0czsKLQlpZnAtPnN0YXRzLnR4X3BhY2tldHMgPSBkcnZyX3ByaXYtPnB1Yi5kc3RhdHMudHhfcGFja2V0czsKLQlpZnAtPnN0YXRzLnJ4X2J5dGVzID0gZHJ2cl9wcml2LT5wdWIuZHN0YXRzLnJ4X2J5dGVzOwotCWlmcC0+c3RhdHMudHhfYnl0ZXMgPSBkcnZyX3ByaXYtPnB1Yi5kc3RhdHMudHhfYnl0ZXM7Ci0JaWZwLT5zdGF0cy5yeF9lcnJvcnMgPSBkcnZyX3ByaXYtPnB1Yi5kc3RhdHMucnhfZXJyb3JzOwotCWlmcC0+c3RhdHMudHhfZXJyb3JzID0gZHJ2cl9wcml2LT5wdWIuZHN0YXRzLnR4X2Vycm9yczsKLQlpZnAtPnN0YXRzLnJ4X2Ryb3BwZWQgPSBkcnZyX3ByaXYtPnB1Yi5kc3RhdHMucnhfZHJvcHBlZDsKLQlpZnAtPnN0YXRzLnR4X2Ryb3BwZWQgPSBkcnZyX3ByaXYtPnB1Yi5kc3RhdHMudHhfZHJvcHBlZDsKLQlpZnAtPnN0YXRzLm11bHRpY2FzdCA9IGRydnJfcHJpdi0+cHViLmRzdGF0cy5tdWx0aWNhc3Q7CisJaWZwLT5zdGF0cy5yeF9wYWNrZXRzID0gYnVzX2lmLT5kc3RhdHMucnhfcGFja2V0czsKKwlpZnAtPnN0YXRzLnR4X3BhY2tldHMgPSBidXNfaWYtPmRzdGF0cy50eF9wYWNrZXRzOworCWlmcC0+c3RhdHMucnhfYnl0ZXMgPSBidXNfaWYtPmRzdGF0cy5yeF9ieXRlczsKKwlpZnAtPnN0YXRzLnR4X2J5dGVzID0gYnVzX2lmLT5kc3RhdHMudHhfYnl0ZXM7CisJaWZwLT5zdGF0cy5yeF9lcnJvcnMgPSBidXNfaWYtPmRzdGF0cy5yeF9lcnJvcnM7CisJaWZwLT5zdGF0cy50eF9lcnJvcnMgPSBidXNfaWYtPmRzdGF0cy50eF9lcnJvcnM7CisJaWZwLT5zdGF0cy5yeF9kcm9wcGVkID0gYnVzX2lmLT5kc3RhdHMucnhfZHJvcHBlZDsKKwlpZnAtPnN0YXRzLnR4X2Ryb3BwZWQgPSBidXNfaWYtPmRzdGF0cy50eF9kcm9wcGVkOworCWlmcC0+c3RhdHMubXVsdGljYXN0ID0gYnVzX2lmLT5kc3RhdHMubXVsdGljYXN0OwogCiAJcmV0dXJuICZpZnAtPnN0YXRzOwogfQogCiAvKiBSZXRyaWV2ZSBjdXJyZW50IHRvZSBjb21wb25lbnQgZW5hYmxlcywgd2hpY2ggYXJlIGtlcHQKIAkgYXMgYSBiaXRtYXAgaW4gdG9lX29sIGlvdmFyICovCi1zdGF0aWMgaW50IGJyY21mX3RvZV9nZXQoc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiwgaW50IGlmaWR4LCB1MzIgKnRvZV9vbCkKK3N0YXRpYyBpbnQgYnJjbWZfdG9lX2dldChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgaWZpZHgsIHUzMiAqdG9lX29sKQogewogCXN0cnVjdCBicmNtZl9kY21kIGRjbWQ7CiAJX19sZTMyIHRvZV9sZTsKQEAgLTU3MiwxNyArNTE3LDE3IEBACiAJZGNtZC5zZXQgPSBmYWxzZTsKIAogCXN0cmNweShidWYsICJ0b2Vfb2wiKTsKLQlyZXQgPSBicmNtZl9wcm90b19kY21kKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgsICZkY21kLCBkY21kLmxlbik7CisJcmV0ID0gYnJjbWZfcHJvdG9fZGNtZChkcnZyLCBpZmlkeCwgJmRjbWQsIGRjbWQubGVuKTsKIAlpZiAocmV0IDwgMCkgewogCQkvKiBDaGVjayBmb3Igb2xkZXIgZG9uZ2xlIGltYWdlIHRoYXQgZG9lc24ndCBzdXBwb3J0IHRvZV9vbCAqLwogCQlpZiAocmV0ID09IC1FSU8pIHsKIAkJCWJyY21mX2RiZyhFUlJPUiwgIiVzOiB0b2Ugbm90IHN1cHBvcnRlZCBieSBkZXZpY2VcbiIsCi0JCQkJICBicmNtZl9pZm5hbWUoJmRydnJfcHJpdi0+cHViLCBpZmlkeCkpOworCQkJCSAgYnJjbWZfaWZuYW1lKGRydnIsIGlmaWR4KSk7CiAJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJCX0KIAogCQlicmNtZl9kYmcoSU5GTywgIiVzOiBjb3VsZCBub3QgZ2V0IHRvZV9vbDogcmV0PSVkXG4iLAotCQkJICBicmNtZl9pZm5hbWUoJmRydnJfcHJpdi0+cHViLCBpZmlkeCksIHJldCk7CisJCQkgIGJyY21mX2lmbmFtZShkcnZyLCBpZmlkeCksIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCkBAIC01OTMsNyArNTM4LDcgQEAKIAogLyogU2V0IGN1cnJlbnQgdG9lIGNvbXBvbmVudCBlbmFibGVzIGluIHRvZV9vbCBpb3ZhciwKIAkgYW5kIHNldCB0b2UgZ2xvYmFsIGVuYWJsZSBpb3ZhciAqLwotc3RhdGljIGludCBicmNtZl90b2Vfc2V0KHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGludCBpZmlkeCwgdTMyIHRvZV9vbCkKK3N0YXRpYyBpbnQgYnJjbWZfdG9lX3NldChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgaWZpZHgsIHUzMiB0b2Vfb2wpCiB7CiAJc3RydWN0IGJyY21mX2RjbWQgZGNtZDsKIAljaGFyIGJ1ZlszMl07CkBAIC02MTEsMTAgKzU1NiwxMCBAQAogCXN0cmNweShidWYsICJ0b2Vfb2wiKTsKIAltZW1jcHkoJmJ1ZltzaXplb2YoInRvZV9vbCIpXSwgJnRvZV9sZSwgc2l6ZW9mKHUzMikpOwogCi0JcmV0ID0gYnJjbWZfcHJvdG9fZGNtZCgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4LCAmZGNtZCwgZGNtZC5sZW4pOworCXJldCA9IGJyY21mX3Byb3RvX2RjbWQoZHJ2ciwgaWZpZHgsICZkY21kLCBkY21kLmxlbik7CiAJaWYgKHJldCA8IDApIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiJXM6IGNvdWxkIG5vdCBzZXQgdG9lX29sOiByZXQ9JWRcbiIsCi0JCQkgIGJyY21mX2lmbmFtZSgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4KSwgcmV0KTsKKwkJCSAgYnJjbWZfaWZuYW1lKGRydnIsIGlmaWR4KSwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CiAKQEAgLTYyNCwxMCArNTY5LDEwIEBACiAJc3RyY3B5KGJ1ZiwgInRvZSIpOwogCW1lbWNweSgmYnVmW3NpemVvZigidG9lIildLCAmdG9lX2xlLCBzaXplb2YodTMyKSk7CiAKLQlyZXQgPSBicmNtZl9wcm90b19kY21kKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgsICZkY21kLCBkY21kLmxlbik7CisJcmV0ID0gYnJjbWZfcHJvdG9fZGNtZChkcnZyLCBpZmlkeCwgJmRjbWQsIGRjbWQubGVuKTsKIAlpZiAocmV0IDwgMCkgewogCQlicmNtZl9kYmcoRVJST1IsICIlczogY291bGQgbm90IHNldCB0b2U6IHJldD0lZFxuIiwKLQkJCSAgYnJjbWZfaWZuYW1lKCZkcnZyX3ByaXYtPnB1YiwgaWZpZHgpLCByZXQpOworCQkJICBicmNtZl9pZm5hbWUoZHJ2ciwgaWZpZHgpLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtNjM3LDIxICs1ODIsMTkgQEAKIHN0YXRpYyB2b2lkIGJyY21mX2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQkJICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9ICooc3RydWN0IGJyY21mX2luZm8gKiopCi0JCQkJCW5ldGRldl9wcml2KG5kZXYpOworCXN0cnVjdCBicmNtZl9pZiAqaWZwID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGJyY21mX3B1YiAqZHJ2ciA9IGlmcC0+ZHJ2cjsKIAogCXNwcmludGYoaW5mby0+ZHJpdmVyLCBLQlVJTERfTU9ETkFNRSk7Ci0Jc3ByaW50ZihpbmZvLT52ZXJzaW9uLCAiJWx1IiwgZHJ2cl9wcml2LT5wdWIuZHJ2X3ZlcnNpb24pOwotCXNwcmludGYoaW5mby0+ZndfdmVyc2lvbiwgIiVzIiwgQkNNNDMyOV9GV19OQU1FKTsKLQlzcHJpbnRmKGluZm8tPmJ1c19pbmZvLCAiJXMiLAotCQlkZXZfbmFtZShicmNtZl9idXNfZ2V0X2RldmljZShkcnZyX3ByaXYtPnB1Yi5idXMpKSk7CisJc3ByaW50ZihpbmZvLT52ZXJzaW9uLCAiJWx1IiwgZHJ2ci0+ZHJ2X3ZlcnNpb24pOworCXNwcmludGYoaW5mby0+YnVzX2luZm8sICIlcyIsIGRldl9uYW1lKGRydnItPmRldikpOwogfQogCiBzdGF0aWMgc3RydWN0IGV0aHRvb2xfb3BzIGJyY21mX2V0aHRvb2xfb3BzID0gewogCS5nZXRfZHJ2aW5mbyA9IGJyY21mX2V0aHRvb2xfZ2V0X2RydmluZm8KIH07CiAKLXN0YXRpYyBpbnQgYnJjbWZfZXRodG9vbChzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCB2b2lkIF9fdXNlciAqdWFkZHIpCitzdGF0aWMgaW50IGJyY21mX2V0aHRvb2woc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgdm9pZCBfX3VzZXIgKnVhZGRyKQogewogCXN0cnVjdCBldGh0b29sX2RydmluZm8gaW5mbzsKIAljaGFyIGRydm5hbWVbc2l6ZW9mKGluZm8uZHJpdmVyKV07CkBAIC02ODUsMTggKzYyOCwxOCBAQAogCQl9CiAKIAkJLyogb3RoZXJ3aXNlLCByZXF1aXJlIGRvbmdsZSB0byBiZSB1cCAqLwotCQllbHNlIGlmICghZHJ2cl9wcml2LT5wdWIudXApIHsKKwkJZWxzZSBpZiAoIWRydnItPmJ1c19pZi0+ZHJ2cl91cCkgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAiZG9uZ2xlIGlzIG5vdCB1cFxuIik7CiAJCQlyZXR1cm4gLUVOT0RFVjsKIAkJfQogCiAJCS8qIGZpbmFsbHksIHJlcG9ydCBkb25nbGUgZHJpdmVyIHR5cGUgKi8KLQkJZWxzZSBpZiAoZHJ2cl9wcml2LT5wdWIuaXN3bCkKKwkJZWxzZSBpZiAoZHJ2ci0+aXN3bCkKIAkJCXNwcmludGYoaW5mby5kcml2ZXIsICJ3bCIpOwogCQllbHNlCiAJCQlzcHJpbnRmKGluZm8uZHJpdmVyLCAieHgiKTsKIAotCQlzcHJpbnRmKGluZm8udmVyc2lvbiwgIiVsdSIsIGRydnJfcHJpdi0+cHViLmRydl92ZXJzaW9uKTsKKwkJc3ByaW50ZihpbmZvLnZlcnNpb24sICIlbHUiLCBkcnZyLT5kcnZfdmVyc2lvbik7CiAJCWlmIChjb3B5X3RvX3VzZXIodWFkZHIsICZpbmZvLCBzaXplb2YoaW5mbykpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAJCWJyY21mX2RiZyhDVEwsICJnaXZlbiAlKnMsIHJldHVybmluZyAlc1xuIiwKQEAgLTcwNiw3ICs2NDksNyBAQAogCQkvKiBHZXQgdG9lIG9mZmxvYWQgY29tcG9uZW50cyBmcm9tIGRvbmdsZSAqLwogCWNhc2UgRVRIVE9PTF9HUlhDU1VNOgogCWNhc2UgRVRIVE9PTF9HVFhDU1VNOgotCQlyZXQgPSBicmNtZl90b2VfZ2V0KGRydnJfcHJpdiwgMCwgJnRvZV9jbXBudCk7CisJCXJldCA9IGJyY21mX3RvZV9nZXQoZHJ2ciwgMCwgJnRvZV9jbXBudCk7CiAJCWlmIChyZXQgPCAwKQogCQkJcmV0dXJuIHJldDsKIApAQCAtNzI3LDcgKzY3MCw3IEBACiAJCQlyZXR1cm4gLUVGQVVMVDsKIAogCQkvKiBSZWFkIHRoZSBjdXJyZW50IHNldHRpbmdzLCB1cGRhdGUgYW5kIHdyaXRlIGJhY2sgKi8KLQkJcmV0ID0gYnJjbWZfdG9lX2dldChkcnZyX3ByaXYsIDAsICZ0b2VfY21wbnQpOworCQlyZXQgPSBicmNtZl90b2VfZ2V0KGRydnIsIDAsICZ0b2VfY21wbnQpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKQEAgLTczOSwxNyArNjgyLDE3IEBACiAJCWVsc2UKIAkJCXRvZV9jbXBudCAmPSB+Y3N1bV9kaXI7CiAKLQkJcmV0ID0gYnJjbWZfdG9lX3NldChkcnZyX3ByaXYsIDAsIHRvZV9jbXBudCk7CisJCXJldCA9IGJyY21mX3RvZV9zZXQoZHJ2ciwgMCwgdG9lX2NtcG50KTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCiAJCS8qIElmIHNldHRpbmcgVFggY2hlY2tzdW0gbW9kZSwgdGVsbCBMaW51eCB0aGUgbmV3IG1vZGUgKi8KIAkJaWYgKGNtZCA9PSBFVEhUT09MX1NUWENTVU0pIHsKIAkJCWlmIChlZGF0YS5kYXRhKQotCQkJCWRydnJfcHJpdi0+aWZsaXN0WzBdLT5uZGV2LT5mZWF0dXJlcyB8PQorCQkJCWRydnItPmlmbGlzdFswXS0+bmRldi0+ZmVhdHVyZXMgfD0KIAkJCQkgICAgTkVUSUZfRl9JUF9DU1VNOwogCQkJZWxzZQotCQkJCWRydnJfcHJpdi0+aWZsaXN0WzBdLT5uZGV2LT5mZWF0dXJlcyAmPQorCQkJCWRydnItPmlmbGlzdFswXS0+bmRldi0+ZmVhdHVyZXMgJj0KIAkJCQkgICAgfk5FVElGX0ZfSVBfQ1NVTTsKIAkJfQogCkBAIC03NjUsMTggKzcwOCwxNiBAQAogc3RhdGljIGludCBicmNtZl9uZXRkZXZfaW9jdGxfZW50cnkoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpZnJlcSAqaWZyLAogCQkJCSAgICBpbnQgY21kKQogewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSAqKHN0cnVjdCBicmNtZl9pbmZvICoqKQotCQkJCQluZXRkZXZfcHJpdihuZGV2KTsKLQlpbnQgaWZpZHg7CisJc3RydWN0IGJyY21mX2lmICppZnAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gaWZwLT5kcnZyOwogCi0JaWZpZHggPSBicmNtZl9uZXQyaWR4KGRydnJfcHJpdiwgbmRldik7Ci0JYnJjbWZfZGJnKFRSQUNFLCAiaWZpZHggJWQsIGNtZCAweCUwNHhcbiIsIGlmaWR4LCBjbWQpOworCWJyY21mX2RiZyhUUkFDRSwgImlmaWR4ICVkLCBjbWQgMHglMDR4XG4iLCBpZnAtPmlkeCwgY21kKTsKIAotCWlmIChpZmlkeCA9PSBCUkNNRl9CQURfSUYpCisJaWYgKCFkcnZyLT5pZmxpc3RbaWZwLT5pZHhdKQogCQlyZXR1cm4gLTE7CiAKIAlpZiAoY21kID09IFNJT0NFVEhUT09MKQotCQlyZXR1cm4gYnJjbWZfZXRodG9vbChkcnZyX3ByaXYsIGlmci0+aWZyX2RhdGEpOworCQlyZXR1cm4gYnJjbWZfZXRodG9vbChkcnZyLCBpZnItPmlmcl9kYXRhKTsKIAogCXJldHVybiAtRU9QTk9UU1VQUDsKIH0KQEAgLTc4OCwyOCArNzI5LDI1IEBACiAJczMyIGVyciA9IDA7CiAJaW50IGJ1ZmxlbiA9IDA7CiAJYm9vbCBpc19zZXRfa2V5X2NtZDsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gKihzdHJ1Y3QgYnJjbWZfaW5mbyAqKikKLQkJCQkJbmV0ZGV2X3ByaXYobmRldik7Ci0JaW50IGlmaWR4OworCXN0cnVjdCBicmNtZl9pZiAqaWZwID0gbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGJyY21mX3B1YiAqZHJ2ciA9IGlmcC0+ZHJ2cjsKIAogCW1lbXNldCgmZGNtZCwgMCwgc2l6ZW9mKGRjbWQpKTsKIAlkY21kLmNtZCA9IGNtZDsKIAlkY21kLmJ1ZiA9IGFyZzsKIAlkY21kLmxlbiA9IGxlbjsKIAotCWlmaWR4ID0gYnJjbWZfbmV0MmlkeChkcnZyX3ByaXYsIG5kZXYpOwotCiAJaWYgKGRjbWQuYnVmICE9IE5VTEwpCiAJCWJ1ZmxlbiA9IG1pbl90KHVpbnQsIGRjbWQubGVuLCBCUkNNRl9EQ01EX01BWExFTik7CiAKIAkvKiBzZW5kIHRvIGRvbmdsZSAobXVzdCBiZSB1cCwgYW5kIHdsKSAqLwotCWlmICgoZHJ2cl9wcml2LT5wdWIuYnVzc3RhdGUgIT0gQlJDTUZfQlVTX0RBVEEpKSB7CisJaWYgKChkcnZyLT5idXNfaWYtPnN0YXRlICE9IEJSQ01GX0JVU19EQVRBKSkgewogCQlicmNtZl9kYmcoRVJST1IsICJET05HTEVfRE9XTlxuIik7CiAJCWVyciA9IC1FSU87CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAoIWRydnJfcHJpdi0+cHViLmlzd2wpIHsKKwlpZiAoIWRydnItPmlzd2wpIHsKIAkJZXJyID0gLUVJTzsKIAkJZ290byBkb25lOwogCX0KQEAgLTgyNiw3ICs3NjQsNyBAQAogCWlmIChpc19zZXRfa2V5X2NtZCkKIAkJYnJjbWZfbmV0ZGV2X3dhaXRfcGVuZDgwMjF4KG5kZXYpOwogCi0JZXJyID0gYnJjbWZfcHJvdG9fZGNtZCgmZHJ2cl9wcml2LT5wdWIsIGlmaWR4LCAmZGNtZCwgYnVmbGVuKTsKKwllcnIgPSBicmNtZl9wcm90b19kY21kKGRydnIsIGlmcC0+aWR4LCAmZGNtZCwgYnVmbGVuKTsKIAogZG9uZToKIAlpZiAoZXJyID4gMCkKQEAgLTgzNywxNSArNzc1LDE2IEBACiAKIHN0YXRpYyBpbnQgYnJjbWZfbmV0ZGV2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IGJyY21mX3B1YiAqZHJ2ciA9ICooc3RydWN0IGJyY21mX3B1YiAqKikgbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGJyY21mX2lmICppZnAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gaWZwLT5kcnZyOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCWJyY21mX2NmZzgwMjExX2Rvd24oZHJ2ci0+Y29uZmlnKTsKLQlpZiAoZHJ2ci0+dXAgPT0gMCkKKwlpZiAoZHJ2ci0+YnVzX2lmLT5kcnZyX3VwID09IDApCiAJCXJldHVybiAwOwogCiAJLyogU2V0IHN0YXRlIGFuZCBzdG9wIE9TIHRyYW5zbWlzc2lvbnMgKi8KLQlkcnZyLT51cCA9IDA7CisJZHJ2ci0+YnVzX2lmLT5kcnZyX3VwID0gZmFsc2U7CiAJbmV0aWZfc3RvcF9xdWV1ZShuZGV2KTsKIAogCXJldHVybiAwOwpAQCAtODUzLDM5ICs3OTIsMzcgQEAKIAogc3RhdGljIGludCBicmNtZl9uZXRkZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqbmRldikKIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gKihzdHJ1Y3QgYnJjbWZfaW5mbyAqKikKLQkJCQkJbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGJyY21mX2lmICppZnAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gaWZwLT5kcnZyOwogCXUzMiB0b2Vfb2w7Ci0JaW50IGlmaWR4ID0gYnJjbWZfbmV0MmlkeChkcnZyX3ByaXYsIG5kZXYpOwogCXMzMiByZXQgPSAwOwogCi0JYnJjbWZfZGJnKFRSQUNFLCAiaWZpZHggJWRcbiIsIGlmaWR4KTsKKwlicmNtZl9kYmcoVFJBQ0UsICJpZmlkeCAlZFxuIiwgaWZwLT5pZHgpOwogCi0JaWYgKGlmaWR4ID09IDApIHsJLyogZG8gaXQgb25seSBmb3IgcHJpbWFyeSBldGgwICovCi0KKwlpZiAoaWZwLT5pZHggPT0gMCkgewkvKiBkbyBpdCBvbmx5IGZvciBwcmltYXJ5IGV0aDAgKi8KIAkJLyogdHJ5IHRvIGJyaW5nIHVwIGJ1cyAqLwotCQlyZXQgPSBicmNtZl9idXNfc3RhcnQoJmRydnJfcHJpdi0+cHViKTsKKwkJcmV0ID0gYnJjbWZfYnVzX3N0YXJ0KGRydnItPmRldik7CiAJCWlmIChyZXQgIT0gMCkgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAiZmFpbGVkIHdpdGggY29kZSAlZFxuIiwgcmV0KTsKIAkJCXJldHVybiAtMTsKIAkJfQotCQlhdG9taWNfc2V0KCZkcnZyX3ByaXYtPnBlbmRfODAyMXhfY250LCAwKTsKKwkJYXRvbWljX3NldCgmZHJ2ci0+cGVuZF84MDIxeF9jbnQsIDApOwogCi0JCW1lbWNweShuZGV2LT5kZXZfYWRkciwgZHJ2cl9wcml2LT5wdWIubWFjLCBFVEhfQUxFTik7CisJCW1lbWNweShuZGV2LT5kZXZfYWRkciwgZHJ2ci0+bWFjLCBFVEhfQUxFTik7CiAKIAkJLyogR2V0IGN1cnJlbnQgVE9FIG1vZGUgZnJvbSBkb25nbGUgKi8KLQkJaWYgKGJyY21mX3RvZV9nZXQoZHJ2cl9wcml2LCBpZmlkeCwgJnRvZV9vbCkgPj0gMAorCQlpZiAoYnJjbWZfdG9lX2dldChkcnZyLCBpZnAtPmlkeCwgJnRvZV9vbCkgPj0gMAogCQkgICAgJiYgKHRvZV9vbCAmIFRPRV9UWF9DU1VNX09MKSAhPSAwKQotCQkJZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdLT5uZGV2LT5mZWF0dXJlcyB8PQorCQkJZHJ2ci0+aWZsaXN0W2lmcC0+aWR4XS0+bmRldi0+ZmVhdHVyZXMgfD0KIAkJCQlORVRJRl9GX0lQX0NTVU07CiAJCWVsc2UKLQkJCWRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XS0+bmRldi0+ZmVhdHVyZXMgJj0KKwkJCWRydnItPmlmbGlzdFtpZnAtPmlkeF0tPm5kZXYtPmZlYXR1cmVzICY9CiAJCQkJfk5FVElGX0ZfSVBfQ1NVTTsKIAl9CiAJLyogQWxsb3cgdHJhbnNtaXQgY2FsbHMgKi8KIAluZXRpZl9zdGFydF9xdWV1ZShuZGV2KTsKLQlkcnZyX3ByaXYtPnB1Yi51cCA9IDE7Ci0JaWYgKGJyY21mX2NmZzgwMjExX3VwKGRydnJfcHJpdi0+cHViLmNvbmZpZykpIHsKKwlkcnZyLT5idXNfaWYtPmRydnJfdXAgPSB0cnVlOworCWlmIChicmNtZl9jZmc4MDIxMV91cChkcnZyLT5jb25maWcpKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImZhaWxlZCB0byBicmluZyB1cCBjZmc4MDIxMVxuIik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC04OTMsMTkzICs4MzAsMTU1IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBicmNtZl9uZXRkZXZfb3BzX3ByaSA9IHsKKwkubmRvX29wZW4gPSBicmNtZl9uZXRkZXZfb3BlbiwKKwkubmRvX3N0b3AgPSBicmNtZl9uZXRkZXZfc3RvcCwKKwkubmRvX2dldF9zdGF0cyA9IGJyY21mX25ldGRldl9nZXRfc3RhdHMsCisJLm5kb19kb19pb2N0bCA9IGJyY21mX25ldGRldl9pb2N0bF9lbnRyeSwKKwkubmRvX3N0YXJ0X3htaXQgPSBicmNtZl9uZXRkZXZfc3RhcnRfeG1pdCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGJyY21mX25ldGRldl9zZXRfbWFjX2FkZHJlc3MsCisJLm5kb19zZXRfcnhfbW9kZSA9IGJyY21mX25ldGRldl9zZXRfbXVsdGljYXN0X2xpc3QKK307CisKIGludAotYnJjbWZfYWRkX2lmKHN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYsIGludCBpZmlkeCwgc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCi0JICAgICBjaGFyICpuYW1lLCB1OCAqbWFjX2FkZHIsIHUzMiBmbGFncywgdTggYnNzaWR4KQorYnJjbWZfYWRkX2lmKHN0cnVjdCBkZXZpY2UgKmRldiwgaW50IGlmaWR4LCBjaGFyICpuYW1lLCB1OCAqbWFjX2FkZHIpCiB7CiAJc3RydWN0IGJyY21mX2lmICppZnA7Ci0JaW50IHJldCA9IDAsIGVyciA9IDA7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5kZXY7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJyY21mX3B1YiAqZHJ2ciA9IGJ1c19pZi0+ZHJ2cjsKIAotCWJyY21mX2RiZyhUUkFDRSwgImlkeCAlZCwgaGFuZGxlLT4lcFxuIiwgaWZpZHgsIG5kZXYpOworCWJyY21mX2RiZyhUUkFDRSwgImlkeCAlZFxuIiwgaWZpZHgpOwogCi0JaWZwID0gZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdOwotCWlmICghaWZwKSB7Ci0JCWlmcCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9pZiksIEdGUF9BVE9NSUMpOwotCQlpZiAoIWlmcCkKLQkJCXJldHVybiAtRU5PTUVNOworCWlmcCA9IGRydnItPmlmbGlzdFtpZmlkeF07CisJLyoKKwkgKiBEZWxldGUgdGhlIGV4aXN0aW5nIGludGVyZmFjZSBiZWZvcmUgb3ZlcndyaXRpbmcgaXQKKwkgKiBpbiBjYXNlIHdlIG1pc3NlZCB0aGUgQlJDTUZfRV9JRl9ERUwgZXZlbnQuCisJICovCisJaWYgKGlmcCkgeworCQlicmNtZl9kYmcoRVJST1IsICJFUlJPUjogbmV0ZGV2OiVzIGFscmVhZHkgZXhpc3RzLCB0cnkgZnJlZSAmIHVucmVnaXN0ZXJcbiIsCisJCQkgIGlmcC0+bmRldi0+bmFtZSk7CisJCW5ldGlmX3N0b3BfcXVldWUoaWZwLT5uZGV2KTsKKwkJdW5yZWdpc3Rlcl9uZXRkZXYoaWZwLT5uZGV2KTsKKwkJZnJlZV9uZXRkZXYoaWZwLT5uZGV2KTsKKwkJZHJ2ci0+aWZsaXN0W2lmaWR4XSA9IE5VTEw7CiAJfQogCi0JbWVtc2V0KGlmcCwgMCwgc2l6ZW9mKHN0cnVjdCBicmNtZl9pZikpOwotCWlmcC0+aW5mbyA9IGRydnJfcHJpdjsKLQlkcnZyX3ByaXYtPmlmbGlzdFtpZmlkeF0gPSBpZnA7CisJLyogQWxsb2NhdGUgbmV0ZGV2LCBpbmNsdWRpbmcgc3BhY2UgZm9yIHByaXZhdGUgc3RydWN0dXJlICovCisJbmRldiA9IGFsbG9jX25ldGRldihzaXplb2Yoc3RydWN0IGJyY21mX2lmKSwgbmFtZSwgZXRoZXJfc2V0dXApOworCWlmICghbmRldikgeworCQlicmNtZl9kYmcoRVJST1IsICJPT00gLSBhbGxvY19uZXRkZXZcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZnAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlpZnAtPm5kZXYgPSBuZGV2OworCWlmcC0+ZHJ2ciA9IGRydnI7CisJZHJ2ci0+aWZsaXN0W2lmaWR4XSA9IGlmcDsKKwlpZnAtPmlkeCA9IGlmaWR4OwogCWlmIChtYWNfYWRkciAhPSBOVUxMKQogCQltZW1jcHkoJmlmcC0+bWFjX2FkZHIsIG1hY19hZGRyLCBFVEhfQUxFTik7CiAKLQlpZiAobmRldiA9PSBOVUxMKSB7Ci0JCWlmcC0+c3RhdGUgPSBCUkNNRl9FX0lGX0FERDsKLQkJaWZwLT5pZHggPSBpZmlkeDsKLQkJLyoKLQkJICogRGVsZXRlIHRoZSBleGlzdGluZyBpbnRlcmZhY2UgYmVmb3JlIG92ZXJ3cml0aW5nIGl0Ci0JCSAqIGluIGNhc2Ugd2UgbWlzc2VkIHRoZSBCUkNNRl9FX0lGX0RFTCBldmVudC4KLQkJICovCi0JCWlmIChpZnAtPm5kZXYgIT0gTlVMTCkgewotCQkJYnJjbWZfZGJnKEVSUk9SLCAiRVJST1I6IG5ldGRldjolcyBhbHJlYWR5IGV4aXN0cywgdHJ5IGZyZWUgJiB1bnJlZ2lzdGVyXG4iLAotCQkJCSAgaWZwLT5uZGV2LT5uYW1lKTsKLQkJCW5ldGlmX3N0b3BfcXVldWUoaWZwLT5uZGV2KTsKLQkJCXVucmVnaXN0ZXJfbmV0ZGV2KGlmcC0+bmRldik7Ci0JCQlmcmVlX25ldGRldihpZnAtPm5kZXYpOwotCQl9CisJaWYgKGJyY21mX25ldF9hdHRhY2goZHJ2ciwgaWZwLT5pZHgpKSB7CisJCWJyY21mX2RiZyhFUlJPUiwgImJyY21mX25ldF9hdHRhY2ggZmFpbGVkIik7CisJCWZyZWVfbmV0ZGV2KGlmcC0+bmRldik7CisJCWRydnItPmlmbGlzdFtpZmlkeF0gPSBOVUxMOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQogCi0JCS8qIEFsbG9jYXRlIG5ldGRldiwgaW5jbHVkaW5nIHNwYWNlIGZvciBwcml2YXRlIHN0cnVjdHVyZSAqLwotCQlpZnAtPm5kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKGRydnJfcHJpdiksICJ3bGFuJWQiLAotCQkJCQkgZXRoZXJfc2V0dXApOwotCQlpZiAoIWlmcC0+bmRldikgewotCQkJYnJjbWZfZGJnKEVSUk9SLCAiT09NIC0gYWxsb2NfbmV0ZGV2XG4iKTsKLQkJCXJldCA9IC1FTk9NRU07Ci0JCX0KLQotCQlpZiAocmV0ID09IDApIHsKLQkJCW1lbWNweShuZXRkZXZfcHJpdihpZnAtPm5kZXYpLCAmZHJ2cl9wcml2LAotCQkJICAgICAgIHNpemVvZihkcnZyX3ByaXYpKTsKLQkJCWVyciA9IGJyY21mX25ldF9hdHRhY2goJmRydnJfcHJpdi0+cHViLCBpZnAtPmlkeCk7Ci0JCQlpZiAoZXJyICE9IDApIHsKLQkJCQlicmNtZl9kYmcoRVJST1IsICJicmNtZl9uZXRfYXR0YWNoIGZhaWxlZCwgZXJyICVkXG4iLAotCQkJCQkgIGVycik7Ci0JCQkJcmV0ID0gLUVPUE5PVFNVUFA7Ci0JCQl9IGVsc2UgewotCQkJCWJyY21mX2RiZyhUUkFDRSwgIiA9PT09IHBpZDoleCwgbmV0X2RldmljZSBmb3IgaWY6JXMgY3JlYXRlZCA9PT1cbiIsCi0JCQkJCSAgY3VycmVudC0+cGlkLCBpZnAtPm5kZXYtPm5hbWUpOwotCQkJCWlmcC0+c3RhdGUgPSAwOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJldCA8IDApIHsKLQkJCWlmIChpZnAtPm5kZXYpCi0JCQkJZnJlZV9uZXRkZXYoaWZwLT5uZGV2KTsKLQotCQkJZHJ2cl9wcml2LT5pZmxpc3RbaWZwLT5pZHhdID0gTlVMTDsKLQkJCWtmcmVlKGlmcCk7Ci0JCX0KLQl9IGVsc2UKLQkJaWZwLT5uZGV2ID0gbmRldjsKKwlicmNtZl9kYmcoVFJBQ0UsICIgPT09PSBwaWQ6JXgsIG5ldF9kZXZpY2UgZm9yIGlmOiVzIGNyZWF0ZWQgPT09XG4iLAorCQkgIGN1cnJlbnQtPnBpZCwgaWZwLT5uZGV2LT5uYW1lKTsKIAogCXJldHVybiAwOwogfQogCi12b2lkIGJyY21mX2RlbF9pZihzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2LCBpbnQgaWZpZHgpCit2b2lkIGJyY21mX2RlbF9pZihzdHJ1Y3QgYnJjbWZfcHViICpkcnZyLCBpbnQgaWZpZHgpCiB7CiAJc3RydWN0IGJyY21mX2lmICppZnA7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJpZHggJWRcbiIsIGlmaWR4KTsKIAotCWlmcCA9IGRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XTsKKwlpZnAgPSBkcnZyLT5pZmxpc3RbaWZpZHhdOwogCWlmICghaWZwKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgIk51bGwgaW50ZXJmYWNlXG4iKTsKIAkJcmV0dXJuOwogCX0KKwlpZiAoaWZwLT5uZGV2KSB7CisJCWlmIChpZmlkeCA9PSAwKSB7CisJCQlpZiAoaWZwLT5uZGV2LT5uZXRkZXZfb3BzID09ICZicmNtZl9uZXRkZXZfb3BzX3ByaSkgeworCQkJCXJ0bmxfbG9jaygpOworCQkJCWJyY21mX25ldGRldl9zdG9wKGlmcC0+bmRldik7CisJCQkJcnRubF91bmxvY2soKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW5ldGlmX3N0b3BfcXVldWUoaWZwLT5uZGV2KTsKKwkJfQogCi0JaWZwLT5zdGF0ZSA9IEJSQ01GX0VfSUZfREVMOwotCWlmcC0+aWR4ID0gaWZpZHg7Ci0JaWYgKGlmcC0+bmRldiAhPSBOVUxMKSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUoaWZwLT5uZGV2KTsKIAkJdW5yZWdpc3Rlcl9uZXRkZXYoaWZwLT5uZGV2KTsKKwkJZHJ2ci0+aWZsaXN0W2lmaWR4XSA9IE5VTEw7CisJCWlmIChpZmlkeCA9PSAwKQorCQkJYnJjbWZfY2ZnODAyMTFfZGV0YWNoKGRydnItPmNvbmZpZyk7CiAJCWZyZWVfbmV0ZGV2KGlmcC0+bmRldik7Ci0JCWRydnJfcHJpdi0+aWZsaXN0W2lmaWR4XSA9IE5VTEw7Ci0JCWtmcmVlKGlmcCk7CiAJfQogfQogCi1zdHJ1Y3QgYnJjbWZfcHViICpicmNtZl9hdHRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1aW50IGJ1c19oZHJsZW4pCitpbnQgYnJjbWZfYXR0YWNoKHVpbnQgYnVzX2hkcmxlbiwgc3RydWN0IGRldmljZSAqZGV2KQogewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSBOVUxMOwotCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2OworCXN0cnVjdCBicmNtZl9wdWIgKmRydnIgPSBOVUxMOworCWludCByZXQgPSAwOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCi0JLyogQWxsb2NhdGUgbmV0ZGV2LCBpbmNsdWRpbmcgc3BhY2UgZm9yIHByaXZhdGUgc3RydWN0dXJlICovCi0JbmRldiA9IGFsbG9jX25ldGRldihzaXplb2YoZHJ2cl9wcml2KSwgIndsYW4lZCIsIGV0aGVyX3NldHVwKTsKLQlpZiAoIW5kZXYpIHsKLQkJYnJjbWZfZGJnKEVSUk9SLCAiT09NIC0gYWxsb2NfbmV0ZGV2XG4iKTsKLQkJZ290byBmYWlsOwotCX0KLQogCS8qIEFsbG9jYXRlIHByaW1hcnkgYnJjbWZfaW5mbyAqLwotCWRydnJfcHJpdiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9pbmZvKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFkcnZyX3ByaXYpCi0JCWdvdG8gZmFpbDsKKwlkcnZyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21mX3B1YiksIEdGUF9BVE9NSUMpOworCWlmICghZHJ2cikKKwkJcmV0dXJuIC1FTk9NRU07CiAKLQkvKgotCSAqIFNhdmUgdGhlIGJyY21mX2luZm8gaW50byB0aGUgcHJpdgotCSAqLwotCW1lbWNweShuZXRkZXZfcHJpdihuZGV2KSwgJmRydnJfcHJpdiwgc2l6ZW9mKGRydnJfcHJpdikpOwotCi0JaWYgKGJyY21mX2FkZF9pZihkcnZyX3ByaXYsIDAsIG5kZXYsIG5kZXYtPm5hbWUsIE5VTEwsIDAsIDApID09Ci0JICAgIEJSQ01GX0JBRF9JRikKLQkJZ290byBmYWlsOwotCi0JbmRldi0+bmV0ZGV2X29wcyA9IE5VTEw7Ci0JbXV0ZXhfaW5pdCgmZHJ2cl9wcml2LT5wcm90b19ibG9jayk7Ci0KLQkvKiBMaW5rIHRvIGluZm8gbW9kdWxlICovCi0JZHJ2cl9wcml2LT5wdWIuaW5mbyA9IGRydnJfcHJpdjsKKwltdXRleF9pbml0KCZkcnZyLT5wcm90b19ibG9jayk7CiAKIAkvKiBMaW5rIHRvIGJ1cyBtb2R1bGUgKi8KLQlkcnZyX3ByaXYtPnB1Yi5idXMgPSBidXM7Ci0JZHJ2cl9wcml2LT5wdWIuaGRybGVuID0gYnVzX2hkcmxlbjsKKwlkcnZyLT5oZHJsZW4gPSBidXNfaGRybGVuOworCWRydnItPmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCWRydnItPmJ1c19pZi0+ZHJ2ciA9IGRydnI7CisJZHJ2ci0+ZGV2ID0gZGV2OwogCiAJLyogQXR0YWNoIGFuZCBsaW5rIGluIHRoZSBwcm90b2NvbCAqLwotCWlmIChicmNtZl9wcm90b19hdHRhY2goJmRydnJfcHJpdi0+cHViKSAhPSAwKSB7CisJcmV0ID0gYnJjbWZfcHJvdG9fYXR0YWNoKGRydnIpOworCWlmIChyZXQgIT0gMCkgewogCQlicmNtZl9kYmcoRVJST1IsICJicmNtZl9wcm90X2F0dGFjaCBmYWlsZWRcbiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCi0JLyogQXR0YWNoIGFuZCBsaW5rIGluIHRoZSBjZmc4MDIxMSAqLwotCWRydnJfcHJpdi0+cHViLmNvbmZpZyA9Ci0JCQlicmNtZl9jZmc4MDIxMV9hdHRhY2gobmRldiwKLQkJCQkJICAgICAgYnJjbWZfYnVzX2dldF9kZXZpY2UoYnVzKSwKLQkJCQkJICAgICAgJmRydnJfcHJpdi0+cHViKTsKLQlpZiAoZHJ2cl9wcml2LT5wdWIuY29uZmlnID09IE5VTEwpIHsKLQkJYnJjbWZfZGJnKEVSUk9SLCAid2xfY2ZnODAyMTFfYXR0YWNoIGZhaWxlZFxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9CisJSU5JVF9XT1JLKCZkcnZyLT5zZXRtYWNhZGRyX3dvcmssIF9icmNtZl9zZXRfbWFjX2FkZHJlc3MpOworCUlOSVRfV09SSygmZHJ2ci0+bXVsdGljYXN0X3dvcmssIF9icmNtZl9zZXRfbXVsdGljYXN0X2xpc3QpOwogCi0JSU5JVF9XT1JLKCZkcnZyX3ByaXYtPnNldG1hY2FkZHJfd29yaywgX2JyY21mX3NldF9tYWNfYWRkcmVzcyk7Ci0JSU5JVF9XT1JLKCZkcnZyX3ByaXYtPm11bHRpY2FzdF93b3JrLCBfYnJjbWZfc2V0X211bHRpY2FzdF9saXN0KTsKLQotCS8qCi0JICogU2F2ZSB0aGUgYnJjbWZfaW5mbyBpbnRvIHRoZSBwcml2Ci0JICovCi0JbWVtY3B5KG5ldGRldl9wcml2KG5kZXYpLCAmZHJ2cl9wcml2LCBzaXplb2YoZHJ2cl9wcml2KSk7Ci0KLQlyZXR1cm4gJmRydnJfcHJpdi0+cHViOworCXJldHVybiByZXQ7CiAKIGZhaWw6Ci0JaWYgKG5kZXYpCi0JCWZyZWVfbmV0ZGV2KG5kZXYpOwotCWlmIChkcnZyX3ByaXYpCi0JCWJyY21mX2RldGFjaCgmZHJ2cl9wcml2LT5wdWIpOworCWJyY21mX2RldGFjaChkZXYpOwogCi0JcmV0dXJuIE5VTEw7CisJcmV0dXJuIHJldDsKIH0KIAotaW50IGJyY21mX2J1c19zdGFydChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQoraW50IGJyY21mX2J1c19zdGFydChzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAJaW50IHJldCA9IC0xOwotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXYgPSBkcnZyLT5pbmZvOwogCS8qIFJvb20gZm9yICJldmVudF9tc2dzIiArICdcMCcgKyBiaXR2ZWMgKi8KIAljaGFyIGlvdmJ1ZltCUkNNRl9FVkVOVElOR19NQVNLX0xFTiArIDEyXTsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gYnVzX2lmLT5kcnZyOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiXG4iKTsKIAogCS8qIEJyaW5nIHVwIHRoZSBidXMgKi8KLQlyZXQgPSBicmNtZl9zZGJyY21fYnVzX2luaXQoJmRydnJfcHJpdi0+cHViKTsKKwlyZXQgPSBidXNfaWYtPmJyY21mX2J1c19pbml0KGRldik7CiAJaWYgKHJldCAhPSAwKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImJyY21mX3NkYnJjbV9idXNfaW5pdCBmYWlsZWQgJWRcbiIsIHJldCk7CiAJCXJldHVybiByZXQ7CiAJfQogCiAJLyogSWYgYnVzIGlzIG5vdCByZWFkeSwgY2FuJ3QgY29tZSB1cCAqLwotCWlmIChkcnZyX3ByaXYtPnB1Yi5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfREFUQSkgeworCWlmIChidXNfaWYtPnN0YXRlICE9IEJSQ01GX0JVU19EQVRBKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImZhaWxlZCBidXMgaXMgbm90IHJlYWR5XG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQpAQCAtMTExNiwzMyArMTAxNSwyMiBAQAogCWRydnItPnBrdGZpbHRlclswXSA9ICIxMDAgMCAwIDAgMHgwMSAweDAwIjsKIAogCS8qIEJ1cyBpcyByZWFkeSwgZG8gYW55IHByb3RvY29sIGluaXRpYWxpemF0aW9uICovCi0JcmV0ID0gYnJjbWZfcHJvdG9faW5pdCgmZHJ2cl9wcml2LT5wdWIpOworCXJldCA9IGJyY21mX3Byb3RvX2luaXQoZHJ2cik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyBicmNtZl9uZXRkZXZfb3BzX3ByaSA9IHsKLQkubmRvX29wZW4gPSBicmNtZl9uZXRkZXZfb3BlbiwKLQkubmRvX3N0b3AgPSBicmNtZl9uZXRkZXZfc3RvcCwKLQkubmRvX2dldF9zdGF0cyA9IGJyY21mX25ldGRldl9nZXRfc3RhdHMsCi0JLm5kb19kb19pb2N0bCA9IGJyY21mX25ldGRldl9pb2N0bF9lbnRyeSwKLQkubmRvX3N0YXJ0X3htaXQgPSBicmNtZl9uZXRkZXZfc3RhcnRfeG1pdCwKLQkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGJyY21mX25ldGRldl9zZXRfbWFjX2FkZHJlc3MsCi0JLm5kb19zZXRfcnhfbW9kZSA9IGJyY21mX25ldGRldl9zZXRfbXVsdGljYXN0X2xpc3QKLX07Ci0KIGludCBicmNtZl9uZXRfYXR0YWNoKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCkKIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2ID0gZHJ2ci0+aW5mbzsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAl1OCB0ZW1wX2FkZHJbRVRIX0FMRU5dID0gewogCQkweDAwLCAweDkwLCAweDRjLCAweDExLCAweDIyLCAweDMzfTsKIAogCWJyY21mX2RiZyhUUkFDRSwgImlmaWR4ICVkXG4iLCBpZmlkeCk7CiAKLQluZGV2ID0gZHJ2cl9wcml2LT5pZmxpc3RbaWZpZHhdLT5uZGV2OworCW5kZXYgPSBkcnZyLT5pZmxpc3RbaWZpZHhdLT5uZGV2OwogCW5kZXYtPm5ldGRldl9vcHMgPSAmYnJjbWZfbmV0ZGV2X29wc19wcmk7CiAKIAkvKgpAQCAtMTE1MCw3ICsxMDM4LDcgQEAKIAkgKi8KIAlpZiAoaWZpZHggIT0gMCkgewogCQkvKiBmb3IgdmlydHVhbCBpbnRlcmZhY2VzIHVzZSB0aGUgcHJpbWFyeSBNQUMgICovCi0JCW1lbWNweSh0ZW1wX2FkZHIsIGRydnJfcHJpdi0+cHViLm1hYywgRVRIX0FMRU4pOworCQltZW1jcHkodGVtcF9hZGRyLCBkcnZyLT5tYWMsIEVUSF9BTEVOKTsKIAogCX0KIApAQCAtMTE2MSwxNCArMTA0OSwyMyBAQAogCQkJIC0gTG9jYWxseSBBZG1pbmlzdGVyZWQgYWRkcmVzcyAgKi8KIAogCX0KLQluZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBFVEhfSExFTiArIGRydnJfcHJpdi0+cHViLmhkcmxlbjsKKwluZGV2LT5oYXJkX2hlYWRlcl9sZW4gPSBFVEhfSExFTiArIGRydnItPmhkcmxlbjsKIAluZGV2LT5ldGh0b29sX29wcyA9ICZicmNtZl9ldGh0b29sX29wczsKIAotCWRydnJfcHJpdi0+cHViLnJ4c3ogPSBuZGV2LT5tdHUgKyBuZGV2LT5oYXJkX2hlYWRlcl9sZW4gKwotCQkJICAgICAgZHJ2cl9wcml2LT5wdWIuaGRybGVuOworCWRydnItPnJ4c3ogPSBuZGV2LT5tdHUgKyBuZGV2LT5oYXJkX2hlYWRlcl9sZW4gKworCQkJICAgICAgZHJ2ci0+aGRybGVuOwogCiAJbWVtY3B5KG5kZXYtPmRldl9hZGRyLCB0ZW1wX2FkZHIsIEVUSF9BTEVOKTsKIAorCS8qIGF0dGFjaCB0byBjZmc4MDIxMSBmb3IgcHJpbWFyeSBpbnRlcmZhY2UgKi8KKwlpZiAoIWlmaWR4KSB7CisJCWRydnItPmNvbmZpZyA9IGJyY21mX2NmZzgwMjExX2F0dGFjaChuZGV2LCBkcnZyLT5kZXYsIGRydnIpOworCQlpZiAoZHJ2ci0+Y29uZmlnID09IE5VTEwpIHsKKwkJCWJyY21mX2RiZyhFUlJPUiwgIndsX2NmZzgwMjExX2F0dGFjaCBmYWlsZWRcbiIpOworCQkJZ290byBmYWlsOworCQl9CisJfQorCiAJaWYgKHJlZ2lzdGVyX25ldGRldihuZGV2KSAhPSAwKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImNvdWxkbid0IHJlZ2lzdGVyIHRoZSBuZXQgZGV2aWNlXG4iKTsKIAkJZ290byBmYWlsOwpAQCAtMTE4NSwxMjcgKzEwODIsNTcgQEAKIAogc3RhdGljIHZvaWQgYnJjbWZfYnVzX2RldGFjaChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQogewotCXN0cnVjdCBicmNtZl9pbmZvICpkcnZyX3ByaXY7Ci0KIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKIAlpZiAoZHJ2cikgewotCQlkcnZyX3ByaXYgPSBkcnZyLT5pbmZvOwotCQlpZiAoZHJ2cl9wcml2KSB7Ci0JCQkvKiBTdG9wIHRoZSBwcm90b2NvbCBtb2R1bGUgKi8KLQkJCWJyY21mX3Byb3RvX3N0b3AoJmRydnJfcHJpdi0+cHViKTsKKwkJLyogU3RvcCB0aGUgcHJvdG9jb2wgbW9kdWxlICovCisJCWJyY21mX3Byb3RvX3N0b3AoZHJ2cik7CiAKLQkJCS8qIFN0b3AgdGhlIGJ1cyBtb2R1bGUgKi8KLQkJCWJyY21mX3NkYnJjbV9idXNfc3RvcChkcnZyX3ByaXYtPnB1Yi5idXMpOwotCQl9CisJCS8qIFN0b3AgdGhlIGJ1cyBtb2R1bGUgKi8KKwkJZHJ2ci0+YnVzX2lmLT5icmNtZl9idXNfc3RvcChkcnZyLT5kZXYpOwogCX0KIH0KIAotdm9pZCBicmNtZl9kZXRhY2goc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKK3ZvaWQgYnJjbWZfZGV0YWNoKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2OworCWludCBpOworCXN0cnVjdCBicmNtZl9idXMgKmJ1c19pZiA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXN0cnVjdCBicmNtZl9wdWIgKmRydnIgPSBidXNfaWYtPmRydnI7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKLQlpZiAoZHJ2cikgewotCQlkcnZyX3ByaXYgPSBkcnZyLT5pbmZvOwotCQlpZiAoZHJ2cl9wcml2KSB7Ci0JCQlzdHJ1Y3QgYnJjbWZfaWYgKmlmcDsKLQkJCWludCBpOwogCi0JCQlmb3IgKGkgPSAxOyBpIDwgQlJDTUZfTUFYX0lGUzsgaSsrKQotCQkJCWlmIChkcnZyX3ByaXYtPmlmbGlzdFtpXSkKLQkJCQkJYnJjbWZfZGVsX2lmKGRydnJfcHJpdiwgaSk7CisJLyogbWFrZSBzdXJlIHByaW1hcnkgaW50ZXJmYWNlIHJlbW92ZWQgbGFzdCAqLworCWZvciAoaSA9IEJSQ01GX01BWF9JRlMtMTsgaSA+IC0xOyBpLS0pCisJCWlmIChkcnZyLT5pZmxpc3RbaV0pCisJCQlicmNtZl9kZWxfaWYoZHJ2ciwgaSk7CiAKLQkJCWlmcCA9IGRydnJfcHJpdi0+aWZsaXN0WzBdOwotCQkJaWYgKGlmcC0+bmRldi0+bmV0ZGV2X29wcyA9PSAmYnJjbWZfbmV0ZGV2X29wc19wcmkpIHsKLQkJCQlydG5sX2xvY2soKTsKLQkJCQlicmNtZl9uZXRkZXZfc3RvcChpZnAtPm5kZXYpOwotCQkJCXJ0bmxfdW5sb2NrKCk7Ci0JCQkJdW5yZWdpc3Rlcl9uZXRkZXYoaWZwLT5uZGV2KTsKLQkJCX0KKwljYW5jZWxfd29ya19zeW5jKCZkcnZyLT5zZXRtYWNhZGRyX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJmRydnItPm11bHRpY2FzdF93b3JrKTsKIAotCQkJY2FuY2VsX3dvcmtfc3luYygmZHJ2cl9wcml2LT5zZXRtYWNhZGRyX3dvcmspOwotCQkJY2FuY2VsX3dvcmtfc3luYygmZHJ2cl9wcml2LT5tdWx0aWNhc3Rfd29yayk7CisJYnJjbWZfYnVzX2RldGFjaChkcnZyKTsKIAotCQkJYnJjbWZfYnVzX2RldGFjaChkcnZyKTsKKwlpZiAoZHJ2ci0+cHJvdCkKKwkJYnJjbWZfcHJvdG9fZGV0YWNoKGRydnIpOwogCi0JCQlpZiAoZHJ2ci0+cHJvdCkKLQkJCQlicmNtZl9wcm90b19kZXRhY2goZHJ2cik7Ci0KLQkJCWJyY21mX2NmZzgwMjExX2RldGFjaChkcnZyLT5jb25maWcpOwotCi0JCQlmcmVlX25ldGRldihpZnAtPm5kZXYpOwotCQkJa2ZyZWUoaWZwKTsKLQkJCWtmcmVlKGRydnJfcHJpdik7Ci0JCX0KLQl9CisJYnVzX2lmLT5kcnZyID0gTlVMTDsKKwlrZnJlZShkcnZyKTsKIH0KIAotc3RhdGljIHZvaWQgX19leGl0IGJyY21mX21vZHVsZV9jbGVhbnVwKHZvaWQpCitzdGF0aWMgaW50IGJyY21mX2dldF9wZW5kXzgwMjF4X2NudChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQogewotCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKLQotCWJyY21mX2J1c191bnJlZ2lzdGVyKCk7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGJyY21mX21vZHVsZV9pbml0KHZvaWQpCi17Ci0JaW50IGVycm9yOwotCi0JYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwotCi0JZXJyb3IgPSBicmNtZl9idXNfcmVnaXN0ZXIoKTsKLQotCWlmIChlcnJvcikgewotCQlicmNtZl9kYmcoRVJST1IsICJicmNtZl9idXNfcmVnaXN0ZXIgZmFpbGVkXG4iKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCXJldHVybiAwOwotCi1mYWlsZWQ6Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLW1vZHVsZV9pbml0KGJyY21mX21vZHVsZV9pbml0KTsKLW1vZHVsZV9leGl0KGJyY21mX21vZHVsZV9jbGVhbnVwKTsKLQotaW50IGJyY21mX29zX3Byb3RvX2Jsb2NrKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCi17Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGRydnItPmluZm87Ci0KLQlpZiAoZHJ2cl9wcml2KSB7Ci0JCW11dGV4X2xvY2soJmRydnJfcHJpdi0+cHJvdG9fYmxvY2spOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBicmNtZl9vc19wcm90b191bmJsb2NrKHN0cnVjdCBicmNtZl9wdWIgKmRydnIpCi17Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9IGRydnItPmluZm87Ci0KLQlpZiAoZHJ2cl9wcml2KSB7Ci0JCW11dGV4X3VubG9jaygmZHJ2cl9wcml2LT5wcm90b19ibG9jayk7Ci0JCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJyY21mX2dldF9wZW5kXzgwMjF4X2NudChzdHJ1Y3QgYnJjbWZfaW5mbyAqZHJ2cl9wcml2KQotewotCXJldHVybiBhdG9taWNfcmVhZCgmZHJ2cl9wcml2LT5wZW5kXzgwMjF4X2NudCk7CisJcmV0dXJuIGF0b21pY19yZWFkKCZkcnZyLT5wZW5kXzgwMjF4X2NudCk7CiB9CiAKICNkZWZpbmUgTUFYX1dBSVRfRk9SXzgwMjFYX1RYCTEwCiAKIGludCBicmNtZl9uZXRkZXZfd2FpdF9wZW5kODAyMXgoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYpCiB7Ci0Jc3RydWN0IGJyY21mX2luZm8gKmRydnJfcHJpdiA9ICooc3RydWN0IGJyY21mX2luZm8gKiopbmV0ZGV2X3ByaXYobmRldik7CisJc3RydWN0IGJyY21mX2lmICppZnAgPSBuZXRkZXZfcHJpdihuZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyID0gaWZwLT5kcnZyOwogCWludCB0aW1lb3V0ID0gMTAgKiBIWiAvIDEwMDA7CiAJaW50IG50aW1lcyA9IE1BWF9XQUlUX0ZPUl84MDIxWF9UWDsKLQlpbnQgcGVuZCA9IGJyY21mX2dldF9wZW5kXzgwMjF4X2NudChkcnZyX3ByaXYpOworCWludCBwZW5kID0gYnJjbWZfZ2V0X3BlbmRfODAyMXhfY250KGRydnIpOwogCiAJd2hpbGUgKG50aW1lcyAmJiBwZW5kKSB7CiAJCWlmIChwZW5kKSB7CkBAIC0xMzE0LDcgKzExNDEsNyBAQAogCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAkJCW50aW1lcy0tOwogCQl9Ci0JCXBlbmQgPSBicmNtZl9nZXRfcGVuZF84MDIxeF9jbnQoZHJ2cl9wcml2KTsKKwkJcGVuZCA9IGJyY21mX2dldF9wZW5kXzgwMjF4X2NudChkcnZyKTsKIAl9CiAJcmV0dXJuIHBlbmQ7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3Byb3RvLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvZGhkX3Byb3RvLmgKaW5kZXggNGVlMWVhOC4uNmJjNDQyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9wcm90by5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfcHJvdG8uaApAQCAtNDEsMTcgKzQxLDEwIEBACiBleHRlcm4gdm9pZCBicmNtZl9wcm90b19oZHJwdXNoKHN0cnVjdCBicmNtZl9wdWIgKiwgaW50IGlmaWR4LAogCQkJCXN0cnVjdCBza19idWZmICp0eHApOwogCi0vKiBSZW1vdmUgYW55IHByb3RvY29sLXNwZWNpZmljIGRhdGEgaGVhZGVyLiAqLwotZXh0ZXJuIGludCBicmNtZl9wcm90b19oZHJwdWxsKHN0cnVjdCBicmNtZl9wdWIgKiwgaW50ICppZmlkeCwKLQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcnhwKTsKLQogLyogVXNlIHByb3RvY29sIHRvIGlzc3VlIGNvbW1hbmQgdG8gZG9uZ2xlICovCiBleHRlcm4gaW50IGJyY21mX3Byb3RvX2RjbWQoc3RydWN0IGJyY21mX3B1YiAqZHJ2ciwgaW50IGlmaWR4LAogCQkJCXN0cnVjdCBicmNtZl9kY21kICpkY21kLCBpbnQgbGVuKTsKIAotLyogVXBkYXRlIGxvY2FsIGNvcHkgb2YgZG9uZ2xlIHN0YXRpc3RpY3MgKi8KLWV4dGVybiB2b2lkIGJyY21mX3Byb3RvX2RzdGF0cyhzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKTsKLQogZXh0ZXJuIGludCBicmNtZl9jX3ByZWluaXRfZGNtZHMoc3RydWN0IGJyY21mX3B1YiAqZHJ2cik7CiAKIGV4dGVybiBpbnQgYnJjbWZfcHJvdG9fY2RjX3NldF9kY21kKHN0cnVjdCBicmNtZl9wdWIgKmRydnIsIGludCBpZmlkeCwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9kaGRfc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMKaW5kZXggMzEzYjhiZi4uNWEwMDJhMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL2RoZF9zZGlvLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZW1hcGhvcmUuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2JjbWEvYmNtYS5oPgogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxkZWZzLmg+CiAjaW5jbHVkZSA8YnJjbXVfd2lmaS5oPgpAQCAtMzUsNiArMzYsNyBAQAogI2luY2x1ZGUgPGJyY21faHdfaWRzLmg+CiAjaW5jbHVkZSA8c29jLmg+CiAjaW5jbHVkZSAic2Rpb19ob3N0LmgiCisjaW5jbHVkZSAic2Rpb19jaGlwLmgiCiAKICNkZWZpbmUgRENNRF9SRVNQX1RJTUVPVVQgIDIwMDAJLyogSW4gbWlsbGkgc2Vjb25kICovCiAKQEAgLTg1LDExICs4Nyw4IEBACiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAjaW5jbHVkZSA8Y2hpcGNvbW1vbi5oPgogCi0jaW5jbHVkZSAiZGhkLmgiCiAjaW5jbHVkZSAiZGhkX2J1cy5oIgotI2luY2x1ZGUgImRoZF9wcm90by5oIgogI2luY2x1ZGUgImRoZF9kYmcuaCIKLSNpbmNsdWRlIDxiY21jaGlwLmg+CiAKICNkZWZpbmUgVFhRTEVOCQkyMDQ4CS8qIGJ1bGsgdHggcXVldWUgbGVuZ3RoICovCiAjZGVmaW5lIFRYSEkJCShUWFFMRU4gLSAyNTYpCS8qIHR1cm4gb24gZmxvdyBjb250cm9sIGFib3ZlIFRYSEkgKi8KQEAgLTEzNCwzMyArMTMzLDYgQEAKIC8qICAgRm9yY2Ugbm8gYmFja3BsYW5lIHJlc2V0ICovCiAjZGVmaW5lIFNCU0RJT19ERVZDVExfUlNUX05PQlBSRVNFVAkweDIwCiAKLS8qIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSICovCi0KLS8qIEZvcmNlIEFMUCByZXF1ZXN0IHRvIGJhY2twbGFuZSAqLwotI2RlZmluZSBTQlNESU9fRk9SQ0VfQUxQCQkweDAxCi0vKiBGb3JjZSBIVCByZXF1ZXN0IHRvIGJhY2twbGFuZSAqLwotI2RlZmluZSBTQlNESU9fRk9SQ0VfSFQJCQkweDAyCi0vKiBGb3JjZSBJTFAgcmVxdWVzdCB0byBiYWNrcGxhbmUgKi8KLSNkZWZpbmUgU0JTRElPX0ZPUkNFX0lMUAkJMHgwNAotLyogTWFrZSBBTFAgcmVhZHkgKHBvd2VyIHVwIHh0YWwpICovCi0jZGVmaW5lIFNCU0RJT19BTFBfQVZBSUxfUkVRCQkweDA4Ci0vKiBNYWtlIEhUIHJlYWR5IChwb3dlciB1cCBQTEwpICovCi0jZGVmaW5lIFNCU0RJT19IVF9BVkFJTF9SRVEJCTB4MTAKLS8qIFNxdWVsY2ggY2xvY2sgcmVxdWVzdHMgZnJvbSBIVyAqLwotI2RlZmluZSBTQlNESU9fRk9SQ0VfSFdfQ0xLUkVRX09GRgkweDIwCi0vKiBTdGF0dXM6IEFMUCBpcyByZWFkeSAqLwotI2RlZmluZSBTQlNESU9fQUxQX0FWQUlMCQkweDQwCi0vKiBTdGF0dXM6IEhUIGlzIHJlYWR5ICovCi0jZGVmaW5lIFNCU0RJT19IVF9BVkFJTAkJCTB4ODAKLQotI2RlZmluZSBTQlNESU9fQVZCSVRTCQkoU0JTRElPX0hUX0FWQUlMIHwgU0JTRElPX0FMUF9BVkFJTCkKLSNkZWZpbmUgU0JTRElPX0FMUEFWKHJlZ3ZhbCkJKChyZWd2YWwpICYgU0JTRElPX0FWQklUUykKLSNkZWZpbmUgU0JTRElPX0hUQVYocmVndmFsKQkoKChyZWd2YWwpICYgU0JTRElPX0FWQklUUykgPT0gU0JTRElPX0FWQklUUykKLSNkZWZpbmUgU0JTRElPX0FMUE9OTFkocmVndmFsKQkoU0JTRElPX0FMUEFWKHJlZ3ZhbCkgJiYgIVNCU0RJT19IVEFWKHJlZ3ZhbCkpCi0KLSNkZWZpbmUgU0JTRElPX0NMS0FWKHJlZ3ZhbCwgYWxwb25seSkgXAotCShTQlNESU9fQUxQQVYocmVndmFsKSAmJiAoYWxwb25seSA/IDEgOiBTQlNESU9fSFRBVihyZWd2YWwpKSkKLQogLyogZGlyZWN0KG1hcHBlZCkgY2lzIHNwYWNlICovCiAKIC8qIE1BUFBFRCBjb21tb24gQ0lTIGFkZHJlc3MgKi8KQEAgLTMzNSw0OSArMzA3LDE2IEBACiAvKiBGbGFncyBmb3IgU0RIIGNhbGxzICovCiAjZGVmaW5lIEYyU1lOQwkoU0RJT19SRVFfNEJZVEUgfCBTRElPX1JFUV9GSVhFRCkKIAotLyogc2JpbXN0YXRlICovCi0jZGVmaW5lCVNCSU1fSUJFCQkweDIwMDAwCS8qIGluYmFuZGVycm9yICovCi0jZGVmaW5lCVNCSU1fVE8JCQkweDQwMDAwCS8qIHRpbWVvdXQgKi8KLSNkZWZpbmUJU0JJTV9CWQkJCTB4MDE4MDAwMDAJLyogYnVzeSAoc29uaWNzID49IDIuMykgKi8KLSNkZWZpbmUJU0JJTV9SSgkJCTB4MDIwMDAwMDAJLyogcmVqZWN0IChzb25pY3MgPj0gMi4zKSAqLworI2RlZmluZSBCUkNNRk1BQ19GV19OQU1FCSJicmNtL2JyY21mbWFjLmJpbiIKKyNkZWZpbmUgQlJDTUZNQUNfTlZfTkFNRQkiYnJjbS9icmNtZm1hYy50eHQiCitNT0RVTEVfRklSTVdBUkUoQlJDTUZNQUNfRldfTkFNRSk7CitNT0RVTEVfRklSTVdBUkUoQlJDTUZNQUNfTlZfTkFNRSk7CiAKLS8qIHNidG1zdGF0ZWxvdyAqLwotCi0vKiByZXNldCAqLwotI2RlZmluZQlTQlRNTF9SRVNFVAkJMHgwMDAxCi0vKiByZWplY3QgZmllbGQgKi8KLSNkZWZpbmUJU0JUTUxfUkVKX01BU0sJCTB4MDAwNgotLyogcmVqZWN0ICovCi0jZGVmaW5lCVNCVE1MX1JFSgkJMHgwMDAyCi0vKiB0ZW1wb3JhcnkgcmVqZWN0LCBmb3IgZXJyb3IgcmVjb3ZlcnkgKi8KLSNkZWZpbmUJU0JUTUxfVE1QUkVKCQkweDAwMDQKLQotLyogU2hpZnQgdG8gbG9jYXRlIHRoZSBTSSBjb250cm9sIGZsYWdzIGluIHNidG1sICovCi0jZGVmaW5lCVNCVE1MX1NJQ0ZfU0hJRlQJMTYKLQotLyogc2J0bXN0YXRlaGlnaCAqLwotI2RlZmluZQlTQlRNSF9TRVJSCQkweDAwMDEJLyogc2Vycm9yICovCi0jZGVmaW5lCVNCVE1IX0lOVAkJMHgwMDAyCS8qIGludGVycnVwdCAqLwotI2RlZmluZQlTQlRNSF9CVVNZCQkweDAwMDQJLyogYnVzeSAqLwotI2RlZmluZQlTQlRNSF9UTwkJMHgwMDIwCS8qIHRpbWVvdXQgKHNvbmljcyA+PSAyLjMpICovCi0KLS8qIFNoaWZ0IHRvIGxvY2F0ZSB0aGUgU0kgc3RhdHVzIGZsYWdzIGluIHNidG1oICovCi0jZGVmaW5lCVNCVE1IX1NJU0ZfU0hJRlQJMTYKLQotLyogc2JpZGxvdyAqLwotI2RlZmluZQlTQklETF9JTklUCQkweDgwCS8qIGluaXRpYXRvciAqLwotCi0vKiBzYmlkaGlnaCAqLwotI2RlZmluZQlTQklESF9SQ19NQVNLCQkweDAwMGYJLyogcmV2aXNpb24gY29kZSAqLwotI2RlZmluZQlTQklESF9SQ0VfTUFTSwkJMHg3MDAwCS8qIHJldmlzaW9uIGNvZGUgZXh0ZW5zaW9uIGZpZWxkICovCi0jZGVmaW5lCVNCSURIX1JDRV9TSElGVAkJOAotI2RlZmluZQlTQkNPUkVSRVYoc2JpZGgpIFwKLQkoKCgoc2JpZGgpICYgU0JJREhfUkNFX01BU0spID4+IFNCSURIX1JDRV9TSElGVCkgfCBcCi0JICAoKHNiaWRoKSAmIFNCSURIX1JDX01BU0spKQotI2RlZmluZQlTQklESF9DQ19NQVNLCQkweDhmZjAJLyogY29yZSBjb2RlICovCi0jZGVmaW5lCVNCSURIX0NDX1NISUZUCQk0Ci0jZGVmaW5lCVNCSURIX1ZDX01BU0sJCTB4ZmZmZjAwMDAJLyogdmVuZG9yIGNvZGUgKi8KLSNkZWZpbmUJU0JJREhfVkNfU0hJRlQJCTE2CisjZGVmaW5lIEJSQ01GX0lETEVfSU1NRURJQVRFCSgtMSkJLyogRW50ZXIgaWRsZSBpbW1lZGlhdGVseSAqLworI2RlZmluZSBCUkNNRl9JRExFX0FDVElWRQkwCS8qIERvIG5vdCByZXF1ZXN0IGFueSBTRCBjbG9jayBjaGFuZ2UKKwkJCQkJICogd2hlbiBpZGxlCisJCQkJCSAqLworI2RlZmluZSBCUkNNRl9JRExFX0lOVEVSVkFMCTEKIAogLyoKICAqIENvbnZlcnNpb24gb2YgODAyLjFEIHByaW9yaXR5IHRvIHByZWNlZGVuY2UgbGV2ZWwKQEAgLTM4OCwxNyArMzI3LDYgQEAKIAkgICAgICAgKHByaW9eMikgOiBwcmlvOwogfQogCi0vKgotICogQ29yZSByZWcgYWRkcmVzcyB0cmFuc2xhdGlvbi4KLSAqIEJvdGggbWFjcm8ncyByZXR1cm5zIGEgMzIgYml0cyBieXRlIGFkZHJlc3Mgb24gdGhlIGJhY2twbGFuZSBidXMuCi0gKi8KLSNkZWZpbmUgQ09SRV9DQ19SRUcoYmFzZSwgZmllbGQpIFwKLQkJKGJhc2UgKyBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBmaWVsZCkpCi0jZGVmaW5lIENPUkVfQlVTX1JFRyhiYXNlLCBmaWVsZCkgXAotCQkoYmFzZSArIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgZmllbGQpKQotI2RlZmluZSBDT1JFX1NCKGJhc2UsIGZpZWxkKSBcCi0JCShiYXNlICsgU0JDT05GSUdPRkYgKyBvZmZzZXRvZihzdHJ1Y3Qgc2Jjb25maWcsIGZpZWxkKSkKLQogLyogY29yZSByZWdpc3RlcnMgKi8KIHN0cnVjdCBzZHBjbWRfcmVncyB7CiAJdTMyIGNvcmVjb250cm9sOwkJLyogMHgwMCwgcmV2OCAqLwpAQCAtNTI0LDI1ICs0NTIsOCBAQAogCiAKIC8qIG1pc2MgY2hpcCBpbmZvIG5lZWRlZCBieSBzb21lIG9mIHRoZSByb3V0aW5lcyAqLwotc3RydWN0IGNoaXBfaW5mbyB7Ci0JdTMyIGNoaXA7Ci0JdTMyIGNoaXByZXY7Ci0JdTMyIGNjY29yZWJhc2U7Ci0JdTMyIGNjcmV2OwotCXUzMiBjY2NhcHM7Ci0JdTMyIGJ1c2NvcmViYXNlOyAvKiAzMiBiaXRzIGJhY2twbGFuZSBidXMgYWRkcmVzcyAqLwotCXUzMiBidXNjb3JlcmV2OwotCXUzMiBidXNjb3JldHlwZTsKLQl1MzIgcmFtY29yZWJhc2U7Ci0JdTMyIGFybWNvcmViYXNlOwotCXUzMiBwbXVyZXY7Ci0JdTMyIHJhbXNpemU7Ci19OwotCiAvKiBQcml2YXRlIGRhdGEgZm9yIFNESU8gYnVzIGludGVyYWN0aW9uICovCi1zdHJ1Y3QgYnJjbWZfYnVzIHsKLQlzdHJ1Y3QgYnJjbWZfcHViICpkcnZyOwotCitzdHJ1Y3QgYnJjbWZfc2RpbyB7CiAJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2OwkvKiBzZGlvIGRldmljZSBoYW5kbGVyICovCiAJc3RydWN0IGNoaXBfaW5mbyAqY2k7CS8qIENoaXAgaW5mbyBzdHJ1Y3QgKi8KIAljaGFyICp2YXJzOwkJLyogVmFyaWFibGVzIChmcm9tIENJUyBhbmQvb3Igb3RoZXIpICovCkBAIC01NzQsNyArNDg1LDcgQEAKIAl1aW50IHR4bWlubWF4OwogCiAJc3RydWN0IHNrX2J1ZmYgKmdsb21kOwkvKiBQYWNrZXQgY29udGFpbmluZyBnbG9tbWluZyBkZXNjcmlwdG9yICovCi0Jc3RydWN0IHNrX2J1ZmYgKmdsb207CS8qIFBhY2tldCBjaGFpbiBmb3IgZ2xvbW1lZCBzdXBlcmZyYW1lICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZCBnbG9tOyAvKiBQYWNrZXQgbGlzdCBmb3IgZ2xvbW1lZCBzdXBlcmZyYW1lICovCiAJdWludCBnbG9tZXJyOwkJLyogR2xvbSBwYWNrZXQgcmVhZCBlcnJvcnMgKi8KIAogCXU4ICpyeGJ1ZjsJCS8qIEJ1ZmZlciBmb3IgcmVjZWl2aW5nIGNvbnRyb2wgcGFja2V0cyAqLwpAQCAtNjM3LDYgKzU0OCwxMyBAQAogCXVpbnQgZjJyeGRhdGE7CQkvKiBOdW1iZXIgb2YgZnJhbWUgZGF0YSByZWFkcyAqLwogCXVpbnQgZjJ0eGRhdGE7CQkvKiBOdW1iZXIgb2YgZjIgZnJhbWUgd3JpdGVzICovCiAJdWludCBmMXJlZ2RhdGE7CQkvKiBOdW1iZXIgb2YgZjEgcmVnaXN0ZXIgYWNjZXNzZXMgKi8KKwl1aW50IHRpY2tjbnQ7CQkvKiBOdW1iZXIgb2Ygd2F0Y2hkb2cgYmVlbiBzY2hlZHVsZSAqLworCXVuc2lnbmVkIGxvbmcgdHhfY3RsZXJyczsJLyogRXJyIG9mIHNlbmRpbmcgY3RybCBmcmFtZXMgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2N0bHBrdHM7CS8qIEN0cmwgZnJhbWVzIHNlbnQgdG8gZG9uZ2xlICovCisJdW5zaWduZWQgbG9uZyByeF9jdGxlcnJzOwkvKiBFcnIgb2YgcHJvY2Vzc2luZyByeCBjdHJsIGZyYW1lcyAqLworCXVuc2lnbmVkIGxvbmcgcnhfY3RscGt0czsJLyogQ3RybCBmcmFtZXMgcHJvY2Vzc2VkIGZyb20gZG9uZ2xlICovCisJdW5zaWduZWQgbG9uZyByeF9yZWFkYWhlYWRfY250OwkvKiBOdW1iZXIgb2YgcGFja2V0cyB3aGVyZSBoZWFkZXIKKwkJCQkJICogcmVhZC1haGVhZCB3YXMgdXNlZC4gKi8KIAogCXU4ICpjdHJsX2ZyYW1lX2J1ZjsKIAl1MzIgY3RybF9mcmFtZV9sZW47CkBAIC02NTcsNTAgKzU3NSwxMCBAQAogCiAJc3RydWN0IHNlbWFwaG9yZSBzZHNlbTsKIAotCWNvbnN0IGNoYXIgKmZ3X25hbWU7CiAJY29uc3Qgc3RydWN0IGZpcm13YXJlICpmaXJtd2FyZTsKLQljb25zdCBjaGFyICpudl9uYW1lOwogCXUzMiBmd19wdHI7Ci19OwogCi1zdHJ1Y3Qgc2Jjb25maWcgewotCXUzMiBQQURbMl07Ci0JdTMyIHNiaXBzZmxhZzsJLyogaW5pdGlhdG9yIHBvcnQgb2NwIHNsYXZlIGZsYWcgKi8KLQl1MzIgUEFEWzNdOwotCXUzMiBzYnRwc2ZsYWc7CS8qIHRhcmdldCBwb3J0IG9jcCBzbGF2ZSBmbGFnICovCi0JdTMyIFBBRFsxMV07Ci0JdTMyIHNidG1lcnJsb2dhOwkvKiAoc29uaWNzID49IDIuMykgKi8KLQl1MzIgUEFEOwotCXUzMiBzYnRtZXJybG9nOwkvKiAoc29uaWNzID49IDIuMykgKi8KLQl1MzIgUEFEWzNdOwotCXUzMiBzYmFkbWF0Y2gzOwkvKiBhZGRyZXNzIG1hdGNoMyAqLwotCXUzMiBQQUQ7Ci0JdTMyIHNiYWRtYXRjaDI7CS8qIGFkZHJlc3MgbWF0Y2gyICovCi0JdTMyIFBBRDsKLQl1MzIgc2JhZG1hdGNoMTsJLyogYWRkcmVzcyBtYXRjaDEgKi8KLQl1MzIgUEFEWzddOwotCXUzMiBzYmltc3RhdGU7CS8qIGluaXRpYXRvciBhZ2VudCBzdGF0ZSAqLwotCXUzMiBzYmludHZlYzsJLyogaW50ZXJydXB0IG1hc2sgKi8KLQl1MzIgc2J0bXN0YXRlbG93OwkvKiB0YXJnZXQgc3RhdGUgKi8KLQl1MzIgc2J0bXN0YXRlaGlnaDsJLyogdGFyZ2V0IHN0YXRlICovCi0JdTMyIHNiYndhMDsJCS8qIGJhbmR3aWR0aCBhbGxvY2F0aW9uIHRhYmxlMCAqLwotCXUzMiBQQUQ7Ci0JdTMyIHNiaW1jb25maWdsb3c7CS8qIGluaXRpYXRvciBjb25maWd1cmF0aW9uICovCi0JdTMyIHNiaW1jb25maWdoaWdoOwkvKiBpbml0aWF0b3IgY29uZmlndXJhdGlvbiAqLwotCXUzMiBzYmFkbWF0Y2gwOwkvKiBhZGRyZXNzIG1hdGNoMCAqLwotCXUzMiBQQUQ7Ci0JdTMyIHNidG1jb25maWdsb3c7CS8qIHRhcmdldCBjb25maWd1cmF0aW9uICovCi0JdTMyIHNidG1jb25maWdoaWdoOwkvKiB0YXJnZXQgY29uZmlndXJhdGlvbiAqLwotCXUzMiBzYmJjb25maWc7CS8qIGJyb2FkY2FzdCBjb25maWd1cmF0aW9uICovCi0JdTMyIFBBRDsKLQl1MzIgc2Jic3RhdGU7CS8qIGJyb2FkY2FzdCBzdGF0ZSAqLwotCXUzMiBQQURbM107Ci0JdTMyIHNiYWN0Y25mZzsJLyogYWN0aXZhdGUgY29uZmlndXJhdGlvbiAqLwotCXUzMiBQQURbM107Ci0JdTMyIHNiZmxhZ3N0OwkvKiBjdXJyZW50IHNiZmxhZ3MgKi8KLQl1MzIgUEFEWzNdOwotCXUzMiBzYmlkbG93OwkJLyogaWRlbnRpZmljYXRpb24gKi8KLQl1MzIgc2JpZGhpZ2g7CS8qIGlkZW50aWZpY2F0aW9uICovCisJYm9vbCB0eG9mZjsJCS8qIFRyYW5zbWl0IGZsb3ctY29udHJvbGxlZCAqLwogfTsKIAogLyogY2xrc3RhdGUgKi8KQEAgLTczNyw3ICs2MTUsNyBAQAogfQogCiAvKiBUbyBjaGVjayBpZiB0aGVyZSdzIHdpbmRvdyBvZmZlcmVkICovCi1zdGF0aWMgYm9vbCBkYXRhX29rKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3N0YXRpYyBib29sIGRhdGFfb2soc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlyZXR1cm4gKHU4KShidXMtPnR4X21heCAtIGJ1cy0+dHhfc2VxKSAhPSAwICYmCiAJICAgICAgICgodTgpKGJ1cy0+dHhfbWF4IC0gYnVzLT50eF9zZXEpICYgMHg4MCkgPT0gMDsKQEAgLTc0OCwxMiArNjI2LDE0IEBACiAgKiBhZHJlc3NlcyBvbiB0aGUgMzIgYml0IGJhY2twbGFuZSBidXMuCiAgKi8KIHN0YXRpYyB2b2lkCi1yX3NkcmVnMzIoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1MzIgKnJlZ3ZhciwgdTMyIHJlZ19vZmZzZXQsIHUzMiAqcmV0cnl2YXIpCityX3NkcmVnMzIoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdTMyICpyZWd2YXIsIHUzMiByZWdfb2Zmc2V0LCB1MzIgKnJldHJ5dmFyKQogeworCXU4IGlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoYnVzLT5jaSwgQkNNQV9DT1JFX1NESU9fREVWKTsKIAkqcmV0cnl2YXIgPSAwOwogCWRvIHsKIAkJKnJlZ3ZhciA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChidXMtPnNkaW9kZXYsCi0JCQkJYnVzLT5jaS0+YnVzY29yZWJhc2UgKyByZWdfb2Zmc2V0LCBzaXplb2YodTMyKSk7CisJCQkJYnVzLT5jaS0+Y19pbmZbaWR4XS5iYXNlICsgcmVnX29mZnNldCwKKwkJCQlzaXplb2YodTMyKSk7CiAJfSB3aGlsZSAoYnJjbWZfc2RjYXJkX3JlZ2ZhaWwoYnVzLT5zZGlvZGV2KSAmJgogCQkgKCsrKCpyZXRyeXZhcikgPD0gcmV0cnlfbGltaXQpKTsKIAlpZiAoKnJldHJ5dmFyKSB7CkBAIC03NjYsMTIgKzY0NiwxMyBAQAogfQogCiBzdGF0aWMgdm9pZAotd19zZHJlZzMyKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTMyIHJlZ3ZhbCwgdTMyIHJlZ19vZmZzZXQsIHUzMiAqcmV0cnl2YXIpCit3X3NkcmVnMzIoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdTMyIHJlZ3ZhbCwgdTMyIHJlZ19vZmZzZXQsIHUzMiAqcmV0cnl2YXIpCiB7CisJdTggaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChidXMtPmNpLCBCQ01BX0NPUkVfU0RJT19ERVYpOwogCSpyZXRyeXZhciA9IDA7CiAJZG8gewogCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKGJ1cy0+c2Rpb2RldiwKLQkJCQkgICAgICAgYnVzLT5jaS0+YnVzY29yZWJhc2UgKyByZWdfb2Zmc2V0LAorCQkJCSAgICAgICBidXMtPmNpLT5jX2luZltpZHhdLmJhc2UgKyByZWdfb2Zmc2V0LAogCQkJCSAgICAgICBzaXplb2YodTMyKSwgcmVndmFsKTsKIAl9IHdoaWxlIChicmNtZl9zZGNhcmRfcmVnZmFpbChidXMtPnNkaW9kZXYpICYmCiAJCSAoKysoKnJldHJ5dmFyKSA8PSByZXRyeV9saW1pdCkpOwpAQCAtNzkwLDE0ICs2NzEsMTQgQEAKIC8qIFBhY2tldCBmcmVlIGFwcGxpY2FibGUgdW5jb25kaXRpb25hbGx5IGZvciBzZGlvIGFuZCBzZHNwaS4KICAqIENvbmRpdGlvbmFsIGlmIGJ1ZnBvb2wgd2FzIHByZXNlbnQgZm9yIGdzcGkgYnVzLgogICovCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcGt0ZnJlZTIoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQorc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3BrdGZyZWUyKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHN0cnVjdCBza19idWZmICpwa3QpCiB7CiAJaWYgKGJ1cy0+dXNlYnVmcG9vbCkKIAkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwa3QpOwogfQogCiAvKiBUdXJuIGJhY2twbGFuZSBjbG9jayBvbiBvciBvZmYgKi8KLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2h0Y2xrKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCBvbiwgYm9vbCBwZW5kb2spCitzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9odGNsayhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCBib29sIG9uLCBib29sIHBlbmRvaykKIHsKIAlpbnQgZXJyOwogCXU4IGNsa2N0bCwgY2xrcmVxLCBkZXZjdGw7CkBAIC04MTIsMTAgKzY5Myw2IEBACiAJCWNsa3JlcSA9CiAJCSAgICBidXMtPmFscF9vbmx5ID8gU0JTRElPX0FMUF9BVkFJTF9SRVEgOiBTQlNESU9fSFRfQVZBSUxfUkVROwogCi0JCWlmICgoYnVzLT5jaS0+Y2hpcCA9PSBCQ000MzI5X0NISVBfSUQpCi0JCSAgICAmJiAoYnVzLT5jaS0+Y2hpcHJldiA9PSAwKSkKLQkJCWNsa3JlcSB8PSBTQlNESU9fRk9SQ0VfQUxQOwotCiAJCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKIAkJCQkgICAgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsIGNsa3JlcSwgJmVycik7CiAJCWlmIChlcnIpIHsKQEAgLTgyMywxNCArNzAwLDYgQEAKIAkJCXJldHVybiAtRUJBREU7CiAJCX0KIAotCQlpZiAocGVuZG9rICYmICgoYnVzLT5jaS0+YnVzY29yZXR5cGUgPT0gUENNQ0lBX0NPUkVfSUQpCi0JCQkgICAgICAgJiYgKGJ1cy0+Y2ktPmJ1c2NvcmVyZXYgPT0gOSkpKSB7Ci0JCQl1MzIgZHVtbXksIHJldHJpZXM7Ci0JCQlyX3NkcmVnMzIoYnVzLCAmZHVtbXksCi0JCQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGNsb2NrY3Rsc3RhdHVzKSwKLQkJCQkgICZyZXRyaWVzKTsKLQkJfQotCiAJCS8qIENoZWNrIGN1cnJlbnQgc3RhdHVzICovCiAJCWNsa2N0bCA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAogCQkJCQkgICAgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsICZlcnIpOwpAQCAtOTMwLDcgKzc5OSw3IEBACiB9CiAKIC8qIENoYW5nZSBpZGxlL2FjdGl2ZSBTRCBzdGF0ZSAqLwotc3RhdGljIGludCBicmNtZl9zZGJyY21fc2RjbGsoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBib29sIG9uKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fc2RjbGsoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgYm9vbCBvbikKIHsKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTk0Myw3ICs4MTIsNyBAQAogfQogCiAvKiBUcmFuc2l0aW9uIFNEIGFuZCBiYWNrcGxhbmUgY2xvY2sgcmVhZGluZXNzICovCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9jbGtjdGwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1aW50IHRhcmdldCwgYm9vbCBwZW5kb2spCitzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9jbGtjdGwoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdWludCB0YXJnZXQsIGJvb2wgcGVuZG9rKQogewogI2lmZGVmIEJDTURCRwogCXVpbnQgb2xkc3RhdGUgPSBidXMtPmNsa3N0YXRlOwpAQCAtOTk5LDcgKzg2OCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2J1c3NsZWVwKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCBzbGVlcCkKK3N0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2J1c3NsZWVwKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIGJvb2wgc2xlZXApCiB7CiAJdWludCByZXRyaWVzID0gMDsKIApAQCAtMTAzNCwxMSArOTAzLDkgQEAKIAkJCVNCU0RJT19GT1JDRV9IV19DTEtSRVFfT0ZGLCBOVUxMKTsKIAogCQkvKiBJc29sYXRlIHRoZSBidXMgKi8KLQkJaWYgKGJ1cy0+Y2ktPmNoaXAgIT0gQkNNNDMyOV9DSElQX0lEKSB7Ci0JCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCi0JCQkJU0JTRElPX0RFVklDRV9DVEwsCi0JCQkJU0JTRElPX0RFVkNUTF9QQURTX0lTTywgTlVMTCk7Ci0JCX0KKwkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAorCQkJU0JTRElPX0RFVklDRV9DVEwsCisJCQlTQlNESU9fREVWQ1RMX1BBRFNfSVNPLCBOVUxMKTsKIAogCQkvKiBDaGFuZ2Ugc3RhdGUgKi8KIAkJYnVzLT5zbGVlcGluZyA9IHRydWU7CkBAIC0xMDQ5LDEzICs5MTYsNiBAQAogCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCiAJCQlTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwgMCwgTlVMTCk7CiAKLQkJLyogRm9yY2UgcGFkIGlzb2xhdGlvbiBvZmYgaWYgcG9zc2libGUKLQkJCSAoaW4gY2FzZSBwb3dlciBuZXZlciB0b2dnbGVkKSAqLwotCQlpZiAoKGJ1cy0+Y2ktPmJ1c2NvcmV0eXBlID09IFBDTUNJQV9DT1JFX0lEKQotCQkgICAgJiYgKGJ1cy0+Y2ktPmJ1c2NvcmVyZXYgPj0gMTApKQotCQkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAotCQkJCVNCU0RJT19ERVZJQ0VfQ1RMLCAwLCBOVUxMKTsKLQogCQkvKiBNYWtlIHN1cmUgdGhlIGNvbnRyb2xsZXIgaGFzIHRoZSBidXMgdXAgKi8KIAkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOwogCkBAIC0xMDgwLDEzICs5NDAsMTMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgYnVzX3dha2Uoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIHZvaWQgYnVzX3dha2Uoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlpZiAoYnVzLT5zbGVlcGluZykKIAkJYnJjbWZfc2RicmNtX2J1c3NsZWVwKGJ1cywgZmFsc2UpOwogfQogCi1zdGF0aWMgdTMyIGJyY21mX3NkYnJjbV9ob3N0bWFpbChzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgdTMyIGJyY21mX3NkYnJjbV9ob3N0bWFpbChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCXUzMiBpbnRzdGF0dXMgPSAwOwogCXUzMiBobWJfZGF0YTsKQEAgLTExNjIsNyArMTAyMiw3IEBACiAJcmV0dXJuIGludHN0YXR1czsKIH0KIAotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3J4ZmFpbChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIGJvb2wgYWJvcnQsIGJvb2wgcnR4KQorc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3J4ZmFpbChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCBib29sIGFib3J0LCBib29sIHJ0eCkKIHsKIAl1aW50IHJldHJpZXMgPSAwOwogCXUxNiBsYXN0cmJjOwpAQCAtMTIxOSwxNiArMTA3OSw2MSBAQAogCiAJLyogSWYgd2UgY2FuJ3QgcmVhY2ggdGhlIGRldmljZSwgc2lnbmFsIGZhaWx1cmUgKi8KIAlpZiAoZXJyIHx8IGJyY21mX3NkY2FyZF9yZWdmYWlsKGJ1cy0+c2Rpb2RldikpCi0JCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKKwkJYnVzLT5zZGlvZGV2LT5idXNfaWYtPnN0YXRlID0gQlJDTUZfQlVTX0RPV047CiB9CiAKLXN0YXRpYyB1OCBicmNtZl9zZGJyY21fcnhnbG9tKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTggcnhzZXEpCisvKiBjb3B5IGEgYnVmZmVyIGludG8gYSBwa3QgYnVmZmVyIGNoYWluICovCitzdGF0aWMgdWludCBicmNtZl9zZGJyY21fZ2xvbV9mcm9tX2J1ZihzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1aW50IGxlbikKK3sKKwl1aW50IG4sIHJldCA9IDA7CisJc3RydWN0IHNrX2J1ZmYgKnA7CisJdTggKmJ1ZjsKKworCWJ1ZiA9IGJ1cy0+ZGF0YXB0cjsKKworCS8qIGNvcHkgdGhlIGRhdGEgKi8KKwlza2JfcXVldWVfd2FsaygmYnVzLT5nbG9tLCBwKSB7CisJCW4gPSBtaW5fdCh1aW50LCBwLT5sZW4sIGxlbik7CisJCW1lbWNweShwLT5kYXRhLCBidWYsIG4pOworCQlidWYgKz0gbjsKKwkJbGVuIC09IG47CisJCXJldCArPSBuOworCQlpZiAoIWxlbikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIHJldHVybiB0b3RhbCBsZW5ndGggb2YgYnVmZmVyIGNoYWluICovCitzdGF0aWMgdWludCBicmNtZl9zZGJyY21fZ2xvbV9sZW4oc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqcDsKKwl1aW50IHRvdGFsOworCisJdG90YWwgPSAwOworCXNrYl9xdWV1ZV93YWxrKCZidXMtPmdsb20sIHApCisJCXRvdGFsICs9IHAtPmxlbjsKKwlyZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9mcmVlX2dsb20oc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqY3VyLCAqbmV4dDsKKworCXNrYl9xdWV1ZV93YWxrX3NhZmUoJmJ1cy0+Z2xvbSwgY3VyLCBuZXh0KSB7CisJCXNrYl91bmxpbmsoY3VyLCAmYnVzLT5nbG9tKTsKKwkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihjdXIpOworCX0KK30KKworc3RhdGljIHU4IGJyY21mX3NkYnJjbV9yeGdsb20oc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdTggcnhzZXEpCiB7CiAJdTE2IGRsZW4sIHRvdGxlbjsKIAl1OCAqZHB0ciwgbnVtID0gMDsKIAogCXUxNiBzdWJsZW4sIGNoZWNrOwotCXN0cnVjdCBza19idWZmICpwZmlyc3QsICpwbGFzdCwgKnBuZXh0LCAqc2F2ZV9wZmlyc3Q7CisJc3RydWN0IHNrX2J1ZmYgKnBmaXJzdCwgKnBuZXh0OwogCiAJaW50IGVycmNvZGU7CiAJdTggY2hhbiwgc2VxLCBkb2ZmLCBzZmRvZmY7CkBAIC0xMjQwLDExICsxMTQ1LDEyIEBACiAJLyogSWYgcGFja2V0cywgaXNzdWUgcmVhZChzKSBhbmQgc2VuZCB1cCBwYWNrZXQgY2hhaW4gKi8KIAkvKiBSZXR1cm4gc2VxdWVuY2UgbnVtYmVycyBjb25zdW1lZD8gKi8KIAotCWJyY21mX2RiZyhUUkFDRSwgInN0YXJ0OiBnbG9tZCAlcCBnbG9tICVwXG4iLCBidXMtPmdsb21kLCBidXMtPmdsb20pOworCWJyY21mX2RiZyhUUkFDRSwgInN0YXJ0OiBnbG9tZCAlcCBnbG9tICVwXG4iLAorCQkgIGJ1cy0+Z2xvbWQsIHNrYl9wZWVrKCZidXMtPmdsb20pKTsKIAogCS8qIElmIHRoZXJlJ3MgYSBkZXNjcmlwdG9yLCBnZW5lcmF0ZSB0aGUgcGFja2V0IGNoYWluICovCiAJaWYgKGJ1cy0+Z2xvbWQpIHsKLQkJcGZpcnN0ID0gcGxhc3QgPSBwbmV4dCA9IE5VTEw7CisJCXBmaXJzdCA9IHBuZXh0ID0gTlVMTDsKIAkJZGxlbiA9ICh1MTYpIChidXMtPmdsb21kLT5sZW4pOwogCQlkcHRyID0gYnVzLT5nbG9tZC0+ZGF0YTsKIAkJaWYgKCFkbGVuIHx8IChkbGVuICYgMSkpIHsKQEAgLTEyODcsMTIgKzExOTMsNyBAQAogCQkJCQkgIG51bSwgc3VibGVuKTsKIAkJCQlicmVhazsKIAkJCX0KLQkJCWlmICghcGZpcnN0KSB7Ci0JCQkJcGZpcnN0ID0gcGxhc3QgPSBwbmV4dDsKLQkJCX0gZWxzZSB7Ci0JCQkJcGxhc3QtPm5leHQgPSBwbmV4dDsKLQkJCQlwbGFzdCA9IHBuZXh0OwotCQkJfQorCQkJc2tiX3F1ZXVlX3RhaWwoJmJ1cy0+Z2xvbSwgcG5leHQpOwogCiAJCQkvKiBBZGhlcmUgdG8gc3RhcnQgYWxpZ25tZW50IHJlcXVpcmVtZW50cyAqLwogCQkJcGt0X2FsaWduKHBuZXh0LCBzdWJsZW4sIEJSQ01GX1NEQUxJR04pOwpAQCAtMTMwOCwxMiArMTIwOSw5IEBACiAJCQkJYnJjbWZfZGJnKEdMT00sICJnbG9tZGVzYyBtaXNtYXRjaDogbmV4dGxlbiAlZCBnbG9tZGVzYyAlZCByeHNlcSAlZFxuIiwKIAkJCQkJICBidXMtPm5leHRsZW4sIHRvdGxlbiwgcnhzZXEpOwogCQkJfQotCQkJYnVzLT5nbG9tID0gcGZpcnN0OwogCQkJcGZpcnN0ID0gcG5leHQgPSBOVUxMOwogCQl9IGVsc2UgewotCQkJaWYgKHBmaXJzdCkKLQkJCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBmaXJzdCk7Ci0JCQlidXMtPmdsb20gPSBOVUxMOworCQkJYnJjbWZfc2RicmNtX2ZyZWVfZ2xvbShidXMpOwogCQkJbnVtID0gMDsKIAkJfQogCkBAIC0xMzI1LDM3ICsxMjIzLDMzIEBACiAKIAkvKiBPayAtLSBlaXRoZXIgd2UganVzdCBnZW5lcmF0ZWQgYSBwYWNrZXQgY2hhaW4sCiAJCSBvciBoYWQgb25lIGZyb20gYmVmb3JlICovCi0JaWYgKGJ1cy0+Z2xvbSkgeworCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZidXMtPmdsb20pKSB7CiAJCWlmIChCUkNNRl9HTE9NX09OKCkpIHsKIAkJCWJyY21mX2RiZyhHTE9NLCAidHJ5IHN1cGVyZnJhbWUgcmVhZCwgcGFja2V0IGNoYWluOlxuIik7Ci0JCQlmb3IgKHBuZXh0ID0gYnVzLT5nbG9tOyBwbmV4dDsgcG5leHQgPSBwbmV4dC0+bmV4dCkgeworCQkJc2tiX3F1ZXVlX3dhbGsoJmJ1cy0+Z2xvbSwgcG5leHQpIHsKIAkJCQlicmNtZl9kYmcoR0xPTSwgIiAgICAlcDogJXAgbGVuIDB4JTA0eCAoJWQpXG4iLAogCQkJCQkgIHBuZXh0LCAodTggKikgKHBuZXh0LT5kYXRhKSwKIAkJCQkJICBwbmV4dC0+bGVuLCBwbmV4dC0+bGVuKTsKIAkJCX0KIAkJfQogCi0JCXBmaXJzdCA9IGJ1cy0+Z2xvbTsKLQkJZGxlbiA9ICh1MTYpIGJyY211X3BrdHRvdGxlbihwZmlyc3QpOworCQlwZmlyc3QgPSBza2JfcGVlaygmYnVzLT5nbG9tKTsKKwkJZGxlbiA9ICh1MTYpIGJyY21mX3NkYnJjbV9nbG9tX2xlbihidXMpOwogCiAJCS8qIERvIGFuIFNESU8gcmVhZCBmb3IgdGhlIHN1cGVyZnJhbWUuICBDb25maWd1cmFibGUgaW92YXIgdG8KIAkJICogcmVhZCBkaXJlY3RseSBpbnRvIHRoZSBjaGFpbmVkIHBhY2tldCwgb3IgYWxsb2NhdGUgYSBsYXJnZQogCQkgKiBwYWNrZXQgYW5kIGFuZCBjb3B5IGludG8gdGhlIGNoYWluLgogCQkgKi8KIAkJaWYgKHVzZWNoYWluKSB7Ci0JCQllcnJjb2RlID0gYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKGJ1cy0+c2Rpb2RldiwKKwkJCWVycmNvZGUgPSBicmNtZl9zZGNhcmRfcmVjdl9jaGFpbihidXMtPnNkaW9kZXYsCiAJCQkJCWJ1cy0+c2Rpb2Rldi0+c2J3YWQsCi0JCQkJCVNESU9fRlVOQ18yLAotCQkJCQlGMlNZTkMsICh1OCAqKSBwZmlyc3QtPmRhdGEsIGRsZW4sCi0JCQkJCXBmaXJzdCk7CisJCQkJCVNESU9fRlVOQ18yLCBGMlNZTkMsICZidXMtPmdsb20pOwogCQl9IGVsc2UgaWYgKGJ1cy0+ZGF0YXB0cikgewogCQkJZXJyY29kZSA9IGJyY21mX3NkY2FyZF9yZWN2X2J1ZihidXMtPnNkaW9kZXYsCiAJCQkJCWJ1cy0+c2Rpb2Rldi0+c2J3YWQsCi0JCQkJCVNESU9fRlVOQ18yLAotCQkJCQlGMlNZTkMsIGJ1cy0+ZGF0YXB0ciwgZGxlbiwKLQkJCQkJTlVMTCk7Ci0JCQlzdWJsZW4gPSAodTE2KSBicmNtdV9wa3Rmcm9tYnVmKHBmaXJzdCwgMCwgZGxlbiwKLQkJCQkJCWJ1cy0+ZGF0YXB0cik7CisJCQkJCVNESU9fRlVOQ18yLCBGMlNZTkMsCisJCQkJCWJ1cy0+ZGF0YXB0ciwgZGxlbik7CisJCQlzdWJsZW4gPSAodTE2KSBicmNtZl9zZGJyY21fZ2xvbV9mcm9tX2J1ZihidXMsIGRsZW4pOwogCQkJaWYgKHN1YmxlbiAhPSBkbGVuKSB7CiAJCQkJYnJjbWZfZGJnKEVSUk9SLCAiRkFJTEVEIFRPIENPUFksIGRsZW4gJWQgc3VibGVuICVkXG4iLAogCQkJCQkgIGRsZW4sIHN1Ymxlbik7CkBAIC0xMzczLDE2ICsxMjY3LDE1IEBACiAJCWlmIChlcnJjb2RlIDwgMCkgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAiZ2xvbSByZWFkIG9mICVkIGJ5dGVzIGZhaWxlZDogJWRcbiIsCiAJCQkJICBkbGVuLCBlcnJjb2RlKTsKLQkJCWJ1cy0+ZHJ2ci0+cnhfZXJyb3JzKys7CisJCQlidXMtPnNkaW9kZXYtPmJ1c19pZi0+ZHN0YXRzLnJ4X2Vycm9ycysrOwogCiAJCQlpZiAoYnVzLT5nbG9tZXJyKysgPCAzKSB7CiAJCQkJYnJjbWZfc2RicmNtX3J4ZmFpbChidXMsIHRydWUsIHRydWUpOwogCQkJfSBlbHNlIHsKIAkJCQlidXMtPmdsb21lcnIgPSAwOwogCQkJCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCB0cnVlLCBmYWxzZSk7Ci0JCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihidXMtPmdsb20pOwogCQkJCWJ1cy0+cnhnbG9tZmFpbCsrOwotCQkJCWJ1cy0+Z2xvbSA9IE5VTEw7CisJCQkJYnJjbWZfc2RicmNtX2ZyZWVfZ2xvbShidXMpOwogCQkJfQogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTE0NTUsMTAgKzEzNDgsMTQgQEAKIAkJLyogUmVtb3ZlIHN1cGVyZnJhbWUgaGVhZGVyLCByZW1lbWJlciBvZmZzZXQgKi8KIAkJc2tiX3B1bGwocGZpcnN0LCBkb2ZmKTsKIAkJc2Zkb2ZmID0gZG9mZjsKKwkJbnVtID0gMDsKIAogCQkvKiBWYWxpZGF0ZSBhbGwgdGhlIHN1YmZyYW1lIGhlYWRlcnMgKi8KLQkJZm9yIChudW0gPSAwLCBwbmV4dCA9IHBmaXJzdDsgcG5leHQgJiYgIWVycmNvZGU7Ci0JCSAgICAgbnVtKyssIHBuZXh0ID0gcG5leHQtPm5leHQpIHsKKwkJc2tiX3F1ZXVlX3dhbGsoJmJ1cy0+Z2xvbSwgcG5leHQpIHsKKwkJCS8qIGxlYXZlIHdoZW4gaW52YWxpZCBzdWJmcmFtZSBpcyBmb3VuZCAqLworCQkJaWYgKGVycmNvZGUpCisJCQkJYnJlYWs7CisKIAkJCWRwdHIgPSAodTggKikgKHBuZXh0LT5kYXRhKTsKIAkJCWRsZW4gPSAodTE2KSAocG5leHQtPmxlbik7CiAJCQlzdWJsZW4gPSBnZXRfdW5hbGlnbmVkX2xlMTYoZHB0cik7CkBAIC0xNDkxLDYgKzEzODgsOCBAQAogCQkJCQkgIG51bSwgZG9mZiwgc3VibGVuLCBTRFBDTV9IRFJMRU4pOwogCQkJCWVycmNvZGUgPSAtMTsKIAkJCX0KKwkJCS8qIGluY3JlYXNlIHRoZSBzdWJmcmFtZSBjb3VudCAqLworCQkJbnVtKys7CiAJCX0KIAogCQlpZiAoZXJyY29kZSkgewpAQCAtMTUwMywyMyArMTQwMiwxNiBAQAogCQkJfSBlbHNlIHsKIAkJCQlidXMtPmdsb21lcnIgPSAwOwogCQkJCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCB0cnVlLCBmYWxzZSk7Ci0JCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihidXMtPmdsb20pOwogCQkJCWJ1cy0+cnhnbG9tZmFpbCsrOwotCQkJCWJ1cy0+Z2xvbSA9IE5VTEw7CisJCQkJYnJjbWZfc2RicmNtX2ZyZWVfZ2xvbShidXMpOwogCQkJfQogCQkJYnVzLT5uZXh0bGVuID0gMDsKIAkJCXJldHVybiAwOwogCQl9CiAKIAkJLyogQmFzaWMgU0QgZnJhbWluZyBsb29rcyBvayAtIHByb2Nlc3MgZWFjaCBwYWNrZXQgKGhlYWRlcikgKi8KLQkJc2F2ZV9wZmlyc3QgPSBwZmlyc3Q7Ci0JCWJ1cy0+Z2xvbSA9IE5VTEw7Ci0JCXBsYXN0ID0gTlVMTDsKIAotCQlmb3IgKG51bSA9IDA7IHBmaXJzdDsgcnhzZXErKywgcGZpcnN0ID0gcG5leHQpIHsKLQkJCXBuZXh0ID0gcGZpcnN0LT5uZXh0OwotCQkJcGZpcnN0LT5uZXh0ID0gTlVMTDsKLQorCQlza2JfcXVldWVfd2Fsa19zYWZlKCZidXMtPmdsb20sIHBmaXJzdCwgcG5leHQpIHsKIAkJCWRwdHIgPSAodTggKikgKHBmaXJzdC0+ZGF0YSk7CiAJCQlzdWJsZW4gPSBnZXRfdW5hbGlnbmVkX2xlMTYoZHB0cik7CiAJCQljaGFuID0gU0RQQ01fUEFDS0VUX0NIQU5ORUwoJmRwdHJbU0RQQ01fRlJBTUVUQUdfTEVOXSk7CkBAIC0xNTM5LDYgKzE0MzEsOCBAQAogCQkJCWJ1cy0+cnhfYmFkc2VxKys7CiAJCQkJcnhzZXEgPSBzZXE7CiAJCQl9CisJCQlyeHNlcSsrOworCiAjaWZkZWYgQkNNREJHCiAJCQlpZiAoQlJDTUZfQllURVNfT04oKSAmJiBCUkNNRl9EQVRBX09OKCkpIHsKIAkJCQlwcmludGsoS0VSTl9ERUJVRyAiUnggU3ViZnJhbWUgRGF0YTpcbiIpOwpAQCAtMTU1MSwzNiArMTQ0NSwyMiBAQAogCQkJc2tiX3B1bGwocGZpcnN0LCBkb2ZmKTsKIAogCQkJaWYgKHBmaXJzdC0+bGVuID09IDApIHsKKwkJCQlza2JfdW5saW5rKHBmaXJzdCwgJmJ1cy0+Z2xvbSk7CiAJCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwZmlyc3QpOwotCQkJCWlmIChwbGFzdCkKLQkJCQkJcGxhc3QtPm5leHQgPSBwbmV4dDsKLQkJCQllbHNlCi0JCQkJCXNhdmVfcGZpcnN0ID0gcG5leHQ7Ci0KIAkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAoYnJjbWZfcHJvdG9faGRycHVsbChidXMtPmRydnIsICZpZmlkeCwKLQkJCQkJCSAgICAgICBwZmlyc3QpICE9IDApIHsKKwkJCX0gZWxzZSBpZiAoYnJjbWZfcHJvdG9faGRycHVsbChidXMtPnNkaW9kZXYtPmRldiwKKwkJCQkJCSAgICAgICAmaWZpZHgsIHBmaXJzdCkgIT0gMCkgewogCQkJCWJyY21mX2RiZyhFUlJPUiwgInJ4IHByb3RvY29sIGVycm9yXG4iKTsKLQkJCQlidXMtPmRydnItPnJ4X2Vycm9ycysrOworCQkJCWJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5kc3RhdHMucnhfZXJyb3JzKys7CisJCQkJc2tiX3VubGluayhwZmlyc3QsICZidXMtPmdsb20pOwogCQkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGZpcnN0KTsKLQkJCQlpZiAocGxhc3QpCi0JCQkJCXBsYXN0LT5uZXh0ID0gcG5leHQ7Ci0JCQkJZWxzZQotCQkJCQlzYXZlX3BmaXJzdCA9IHBuZXh0OwotCiAJCQkJY29udGludWU7CiAJCQl9CiAKLQkJCS8qIHRoaXMgcGFja2V0IHdpbGwgZ28gdXAsIGxpbmsgYmFjayBpbnRvCi0JCQkJIGNoYWluIGFuZCBjb3VudCBpdCAqLwotCQkJcGZpcnN0LT5uZXh0ID0gcG5leHQ7Ci0JCQlwbGFzdCA9IHBmaXJzdDsKLQkJCW51bSsrOwotCiAjaWZkZWYgQkNNREJHCiAJCQlpZiAoQlJDTUZfR0xPTV9PTigpKSB7CiAJCQkJYnJjbWZfZGJnKEdMT00sICJzdWJmcmFtZSAlZCB0byBzdGFjaywgJXAgKCVwLyVkKSBueHQvbG5rICVwLyVwXG4iLAotCQkJCQkgIG51bSwgcGZpcnN0LCBwZmlyc3QtPmRhdGEsCisJCQkJCSAgYnVzLT5nbG9tLnFsZW4sIHBmaXJzdCwgcGZpcnN0LT5kYXRhLAogCQkJCQkgIHBmaXJzdC0+bGVuLCBwZmlyc3QtPm5leHQsCiAJCQkJCSAgcGZpcnN0LT5wcmV2KTsKIAkJCQlwcmludF9oZXhfZHVtcF9ieXRlcygiIiwgRFVNUF9QUkVGSVhfT0ZGU0VULApAQCAtMTU4OSwxOSArMTQ2OSwyMCBAQAogCQkJfQogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCQl9Ci0JCWlmIChudW0pIHsKKwkJLyogc2VudCBhbnkgcmVtYWluaW5nIHBhY2tldHMgdXAgKi8KKwkJaWYgKGJ1cy0+Z2xvbS5xbGVuKSB7CiAJCQl1cCgmYnVzLT5zZHNlbSk7Ci0JCQlicmNtZl9yeF9mcmFtZShidXMtPmRydnIsIGlmaWR4LCBzYXZlX3BmaXJzdCwgbnVtKTsKKwkJCWJyY21mX3J4X2ZyYW1lKGJ1cy0+c2Rpb2Rldi0+ZGV2LCBpZmlkeCwgJmJ1cy0+Z2xvbSk7CiAJCQlkb3duKCZidXMtPnNkc2VtKTsKIAkJfQogCiAJCWJ1cy0+cnhnbG9tZnJhbWVzKys7Ci0JCWJ1cy0+cnhnbG9tcGt0cyArPSBudW07CisJCWJ1cy0+cnhnbG9tcGt0cyArPSBidXMtPmdsb20ucWxlbjsKIAl9CiAJcmV0dXJuIG51bTsKIH0KIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fZGNtZF9yZXNwX3dhaXQoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1aW50ICpjb25kaXRpb24sCitzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kY21kX3Jlc3Bfd2FpdChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1aW50ICpjb25kaXRpb24sCiAJCQkJCWJvb2wgKnBlbmRpbmcpCiB7CiAJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CkBAIC0xNjIzLDcgKzE1MDQsNyBAQAogCXJldHVybiB0aW1lb3V0OwogfQogCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kY21kX3Jlc3Bfd2FrZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kY21kX3Jlc3Bfd2FrZShzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWlmICh3YWl0cXVldWVfYWN0aXZlKCZidXMtPmRjbWRfcmVzcF93YWl0KSkKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZidXMtPmRjbWRfcmVzcF93YWl0KTsKQEAgLTE2MzEsNyArMTUxMiw3IEBACiAJcmV0dXJuIDA7CiB9CiBzdGF0aWMgdm9pZAotYnJjbWZfc2RicmNtX3JlYWRfY29udHJvbChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHU4ICpoZHIsIHVpbnQgbGVuLCB1aW50IGRvZmYpCiticmNtZl9zZGJyY21fcmVhZF9jb250cm9sKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHU4ICpoZHIsIHVpbnQgbGVuLCB1aW50IGRvZmYpCiB7CiAJdWludCByZGxlbiwgcGFkOwogCkBAIC0xNjU3LDcgKzE1MzgsNyBAQAogCWlmIChidXMtPnJvdW5kdXAgJiYgYnVzLT5ibG9ja3NpemUgJiYgKHJkbGVuID4gYnVzLT5ibG9ja3NpemUpKSB7CiAJCXBhZCA9IGJ1cy0+YmxvY2tzaXplIC0gKHJkbGVuICUgYnVzLT5ibG9ja3NpemUpOwogCQlpZiAoKHBhZCA8PSBidXMtPnJvdW5kdXApICYmIChwYWQgPCBidXMtPmJsb2Nrc2l6ZSkgJiYKLQkJICAgICgobGVuICsgcGFkKSA8IGJ1cy0+ZHJ2ci0+bWF4Y3RsKSkKKwkJICAgICgobGVuICsgcGFkKSA8IGJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5tYXhjdGwpKQogCQkJcmRsZW4gKz0gcGFkOwogCX0gZWxzZSBpZiAocmRsZW4gJSBCUkNNRl9TREFMSUdOKSB7CiAJCXJkbGVuICs9IEJSQ01GX1NEQUxJR04gLSAocmRsZW4gJSBCUkNNRl9TREFMSUdOKTsKQEAgLTE2NjgsMTggKzE1NDksMTggQEAKIAkJcmRsZW4gPSByb3VuZHVwKHJkbGVuLCBBTElHTk1FTlQpOwogCiAJLyogRHJvcCBpZiB0aGUgcmVhZCBpcyB0b28gYmlnIG9yIGl0IGV4Y2VlZHMgb3VyIG1heGltdW0gKi8KLQlpZiAoKHJkbGVuICsgQlJDTUZfRklSU1RSRUFEKSA+IGJ1cy0+ZHJ2ci0+bWF4Y3RsKSB7CisJaWYgKChyZGxlbiArIEJSQ01GX0ZJUlNUUkVBRCkgPiBidXMtPnNkaW9kZXYtPmJ1c19pZi0+bWF4Y3RsKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgIiVkLWJ5dGUgY29udHJvbCByZWFkIGV4Y2VlZHMgJWQtYnl0ZSBidWZmZXJcbiIsCi0JCQkgIHJkbGVuLCBidXMtPmRydnItPm1heGN0bCk7Ci0JCWJ1cy0+ZHJ2ci0+cnhfZXJyb3JzKys7CisJCQkgIHJkbGVuLCBidXMtPnNkaW9kZXYtPmJ1c19pZi0+bWF4Y3RsKTsKKwkJYnVzLT5zZGlvZGV2LT5idXNfaWYtPmRzdGF0cy5yeF9lcnJvcnMrKzsKIAkJYnJjbWZfc2RicmNtX3J4ZmFpbChidXMsIGZhbHNlLCBmYWxzZSk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKLQlpZiAoKGxlbiAtIGRvZmYpID4gYnVzLT5kcnZyLT5tYXhjdGwpIHsKKwlpZiAoKGxlbiAtIGRvZmYpID4gYnVzLT5zZGlvZGV2LT5idXNfaWYtPm1heGN0bCkgewogCQlicmNtZl9kYmcoRVJST1IsICIlZC1ieXRlIGN0bCBmcmFtZSAoJWQtYnl0ZSBjdGwgZGF0YSkgZXhjZWVkcyAlZC1ieXRlIGxpbWl0XG4iLAotCQkJICBsZW4sIGxlbiAtIGRvZmYsIGJ1cy0+ZHJ2ci0+bWF4Y3RsKTsKLQkJYnVzLT5kcnZyLT5yeF9lcnJvcnMrKzsKKwkJCSAgbGVuLCBsZW4gLSBkb2ZmLCBidXMtPnNkaW9kZXYtPmJ1c19pZi0+bWF4Y3RsKTsKKwkJYnVzLT5zZGlvZGV2LT5idXNfaWYtPmRzdGF0cy5yeF9lcnJvcnMrKzsKIAkJYnVzLT5yeF90b29sb25nKys7CiAJCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCBmYWxzZSwgZmFsc2UpOwogCQlnb3RvIGRvbmU7CkBAIC0xNjg5LDggKzE1NzAsNyBAQAogCXNkcmV0ID0gYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKGJ1cy0+c2Rpb2RldiwKIAkJCQlidXMtPnNkaW9kZXYtPnNid2FkLAogCQkJCVNESU9fRlVOQ18yLAotCQkJCUYyU1lOQywgKGJ1cy0+cnhjdGwgKyBCUkNNRl9GSVJTVFJFQUQpLCByZGxlbiwKLQkJCQlOVUxMKTsKKwkJCQlGMlNZTkMsIChidXMtPnJ4Y3RsICsgQlJDTUZfRklSU1RSRUFEKSwgcmRsZW4pOwogCWJ1cy0+ZjJyeGRhdGErKzsKIAogCS8qIENvbnRyb2wgZnJhbWUgZmFpbHVyZXMgbmVlZCByZXRyYW5zbWlzc2lvbiAqLwpAQCAtMTcyMSw3ICsxNjAxLDcgQEAKIH0KIAogLyogUGFkIHJlYWQgdG8gYmxvY2tzaXplIGZvciBlZmZpY2llbmN5ICovCi1zdGF0aWMgdm9pZCBicmNtZl9wYWQoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1MTYgKnBhZCwgdTE2ICpyZGxlbikKK3N0YXRpYyB2b2lkIGJyY21mX3BhZChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1MTYgKnBhZCwgdTE2ICpyZGxlbikKIHsKIAlpZiAoYnVzLT5yb3VuZHVwICYmIGJ1cy0+YmxvY2tzaXplICYmICpyZGxlbiA+IGJ1cy0+YmxvY2tzaXplKSB7CiAJCSpwYWQgPSBidXMtPmJsb2Nrc2l6ZSAtICgqcmRsZW4gJSBidXMtPmJsb2Nrc2l6ZSk7CkBAIC0xNzM0LDcgKzE2MTQsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotYnJjbWZfYWxsb2NfcGt0X2FuZF9yZWFkKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgdTE2IHJkbGVuLAorYnJjbWZfYWxsb2NfcGt0X2FuZF9yZWFkKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHUxNiByZGxlbiwKIAkJCSBzdHJ1Y3Qgc2tfYnVmZiAqKnBrdCwgdTggKipyeGJ1ZikKIHsKIAlpbnQgc2RyZXQ7CQkvKiBSZXR1cm4gY29kZSBmcm9tIGNhbGxzICovCkBAIC0xNzQ2LDE2ICsxNjI2LDE1IEBACiAJcGt0X2FsaWduKCpwa3QsIHJkbGVuLCBCUkNNRl9TREFMSUdOKTsKIAkqcnhidWYgPSAodTggKikgKCgqcGt0KS0+ZGF0YSk7CiAJLyogUmVhZCB0aGUgZW50aXJlIGZyYW1lICovCi0Jc2RyZXQgPSBicmNtZl9zZGNhcmRfcmVjdl9idWYoYnVzLT5zZGlvZGV2LCBidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCSAgICAgIFNESU9fRlVOQ18yLCBGMlNZTkMsCi0JCQkJICAgICAgKnJ4YnVmLCByZGxlbiwgKnBrdCk7CisJc2RyZXQgPSBicmNtZl9zZGNhcmRfcmVjdl9wa3QoYnVzLT5zZGlvZGV2LCBidXMtPnNkaW9kZXYtPnNid2FkLAorCQkJCSAgICAgIFNESU9fRlVOQ18yLCBGMlNZTkMsICpwa3QpOwogCWJ1cy0+ZjJyeGRhdGErKzsKIAogCWlmIChzZHJldCA8IDApIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiKG5leHRsZW4pOiByZWFkICVkIGJ5dGVzIGZhaWxlZDogJWRcbiIsCiAJCQkgIHJkbGVuLCBzZHJldCk7CiAJCWJyY211X3BrdF9idWZfZnJlZV9za2IoKnBrdCk7Ci0JCWJ1cy0+ZHJ2ci0+cnhfZXJyb3JzKys7CisJCWJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5kc3RhdHMucnhfZXJyb3JzKys7CiAJCS8qIEZvcmNlIHJldHJ5IHcvbm9ybWFsIGhlYWRlciByZWFkLgogCQkgKiBEb24ndCBhdHRlbXB0IE5BSyBmb3IKIAkJICogZ1NQSQpAQCAtMTc2Nyw3ICsxNjQ2LDcgQEAKIAogLyogQ2hlY2tzIHRoZSBoZWFkZXIgKi8KIHN0YXRpYyBpbnQKLWJyY21mX2NoZWNrX3J4YnVmKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwgdTggKnJ4YnVmLAorYnJjbWZfY2hlY2tfcnhidWYoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgc3RydWN0IHNrX2J1ZmYgKnBrdCwgdTggKnJ4YnVmLAogCQkgIHU4IHJ4c2VxLCB1MTYgbmV4dGxlbiwgdTE2ICpsZW4pCiB7CiAJdTE2IGNoZWNrOwpAQCAtMTgyMyw3ICsxNzAyLDcgQEAKIAogLyogUmV0dXJuIHRydWUgaWYgdGhlcmUgbWF5IGJlIG1vcmUgZnJhbWVzIHRvIHJlYWQgKi8KIHN0YXRpYyB1aW50Ci1icmNtZl9zZGJyY21fcmVhZGZyYW1lcyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgbWF4ZnJhbWVzLCBib29sICpmaW5pc2hlZCkKK2JyY21mX3NkYnJjbV9yZWFkZnJhbWVzKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHVpbnQgbWF4ZnJhbWVzLCBib29sICpmaW5pc2hlZCkKIHsKIAl1MTYgbGVuLCBjaGVjazsJLyogRXh0cmFjdGVkIGhhcmR3YXJlIGhlYWRlciBmaWVsZHMgKi8KIAl1OCBjaGFuLCBzZXEsIGRvZmY7CS8qIEV4dHJhY3RlZCBzb2Z0d2FyZSBoZWFkZXIgZmllbGRzICovCkBAIC0xODQ2LDE0ICsxNzI1LDE1IEBACiAJKmZpbmlzaGVkID0gZmFsc2U7CiAKIAlmb3IgKHJ4c2VxID0gYnVzLT5yeF9zZXEsIHJ4bGVmdCA9IG1heGZyYW1lczsKLQkgICAgICFidXMtPnJ4c2tpcCAmJiByeGxlZnQgJiYgYnVzLT5kcnZyLT5idXNzdGF0ZSAhPSBCUkNNRl9CVVNfRE9XTjsKKwkgICAgICFidXMtPnJ4c2tpcCAmJiByeGxlZnQgJiYKKwkgICAgIGJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5zdGF0ZSAhPSBCUkNNRl9CVVNfRE9XTjsKIAkgICAgIHJ4c2VxKyssIHJ4bGVmdC0tKSB7CiAKIAkJLyogSGFuZGxlIGdsb21taW5nIHNlcGFyYXRlbHkgKi8KLQkJaWYgKGJ1cy0+Z2xvbSB8fCBidXMtPmdsb21kKSB7CisJCWlmIChidXMtPmdsb21kIHx8ICFza2JfcXVldWVfZW1wdHkoJmJ1cy0+Z2xvbSkpIHsKIAkJCXU4IGNudDsKIAkJCWJyY21mX2RiZyhHTE9NLCAiY2FsbGluZyByeGdsb206IGdsb21kICVwLCBnbG9tICVwXG4iLAotCQkJCSAgYnVzLT5nbG9tZCwgYnVzLT5nbG9tKTsKKwkJCQkgIGJ1cy0+Z2xvbWQsIHNrYl9wZWVrKCZidXMtPmdsb20pKTsKIAkJCWNudCA9IGJyY21mX3NkYnJjbV9yeGdsb20oYnVzLCByeHNlcSk7CiAJCQlicmNtZl9kYmcoR0xPTSwgInJ4Z2xvbSByZXR1cm5lZCAlZFxuIiwgY250KTsKIAkJCXJ4c2VxICs9IGNudCAtIDE7CkBAIC0xOTA1LDcgKzE3ODUsNyBAQAogCQkJCWJ1cy0+bmV4dGxlbiA9IDA7CiAJCQl9CiAKLQkJCWJ1cy0+ZHJ2ci0+cnhfcmVhZGFoZWFkX2NudCsrOworCQkJYnVzLT5yeF9yZWFkYWhlYWRfY250Kys7CiAKIAkJCS8qIEhhbmRsZSBGbG93IENvbnRyb2wgKi8KIAkJCWZjYml0cyA9IFNEUENNX0ZDTUFTS19WQUxVRSgKQEAgLTE5NzYsNyArMTg1Niw3IEBACiAJCS8qIFJlYWQgZnJhbWUgaGVhZGVyIChoYXJkd2FyZSBhbmQgc29mdHdhcmUpICovCiAJCXNkcmV0ID0gYnJjbWZfc2RjYXJkX3JlY3ZfYnVmKGJ1cy0+c2Rpb2RldiwgYnVzLT5zZGlvZGV2LT5zYndhZCwKIAkJCQkJICAgICAgU0RJT19GVU5DXzIsIEYyU1lOQywgYnVzLT5yeGhkciwKLQkJCQkJICAgICAgQlJDTUZfRklSU1RSRUFELCBOVUxMKTsKKwkJCQkJICAgICAgQlJDTUZfRklSU1RSRUFEKTsKIAkJYnVzLT5mMnJ4aGRycysrOwogCiAJCWlmIChzZHJldCA8IDApIHsKQEAgLTIxMDMsNyArMTk4Myw3IEBACiAJCQkvKiBUb28gbG9uZyAtLSBza2lwIHRoaXMgZnJhbWUgKi8KIAkJCWJyY21mX2RiZyhFUlJPUiwgInRvbyBsb25nOiBsZW4gJWQgcmRsZW4gJWRcbiIsCiAJCQkJICBsZW4sIHJkbGVuKTsKLQkJCWJ1cy0+ZHJ2ci0+cnhfZXJyb3JzKys7CisJCQlidXMtPnNkaW9kZXYtPmJ1c19pZi0+ZHN0YXRzLnJ4X2Vycm9ycysrOwogCQkJYnVzLT5yeF90b29sb25nKys7CiAJCQlicmNtZl9zZGJyY21fcnhmYWlsKGJ1cywgZmFsc2UsIGZhbHNlKTsKIAkJCWNvbnRpbnVlOwpAQCAtMjExNSw3ICsxOTk1LDcgQEAKIAkJCS8qIEdpdmUgdXAgb24gZGF0YSwgcmVxdWVzdCBydHggb2YgZXZlbnRzICovCiAJCQlicmNtZl9kYmcoRVJST1IsICJicmNtdV9wa3RfYnVmX2dldF9za2IgZmFpbGVkOiByZGxlbiAlZCBjaGFuICVkXG4iLAogCQkJCSAgcmRsZW4sIGNoYW4pOwotCQkJYnVzLT5kcnZyLT5yeF9kcm9wcGVkKys7CisJCQlidXMtPnNkaW9kZXYtPmJ1c19pZi0+ZHN0YXRzLnJ4X2Ryb3BwZWQrKzsKIAkJCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCBmYWxzZSwgUkVUUllDSEFOKGNoYW4pKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0yMTI1LDkgKzIwMDUsOCBAQAogCQlwa3RfYWxpZ24ocGt0LCByZGxlbiwgQlJDTUZfU0RBTElHTik7CiAKIAkJLyogUmVhZCB0aGUgcmVtYWluaW5nIGZyYW1lIGRhdGEgKi8KLQkJc2RyZXQgPSBicmNtZl9zZGNhcmRfcmVjdl9idWYoYnVzLT5zZGlvZGV2LCBidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCVNESU9fRlVOQ18yLCBGMlNZTkMsICgodTggKikgKHBrdC0+ZGF0YSkpLAotCQkJCXJkbGVuLCBwa3QpOworCQlzZHJldCA9IGJyY21mX3NkY2FyZF9yZWN2X3BrdChidXMtPnNkaW9kZXYsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCisJCQkJCSAgICAgIFNESU9fRlVOQ18yLCBGMlNZTkMsIHBrdCk7CiAJCWJ1cy0+ZjJyeGRhdGErKzsKIAogCQlpZiAoc2RyZXQgPCAwKSB7CkBAIC0yMTM2LDcgKzIwMTUsNyBAQAogCQkJCSAgIDogKChjaGFuID09IFNEUENNX0RBVEFfQ0hBTk5FTCkgPyAiZGF0YSIKIAkJCQkgICAgICA6ICJ0ZXN0IikpLCBzZHJldCk7CiAJCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBrdCk7Ci0JCQlidXMtPmRydnItPnJ4X2Vycm9ycysrOworCQkJYnVzLT5zZGlvZGV2LT5idXNfaWYtPmRzdGF0cy5yeF9lcnJvcnMrKzsKIAkJCWJyY21mX3NkYnJjbV9yeGZhaWwoYnVzLCB0cnVlLCBSRVRSWUNIQU4oY2hhbikpOwogCQkJY29udGludWU7CiAJCX0KQEAgLTIxODUsMTYgKzIwNjQsMTcgQEAKIAkJaWYgKHBrdC0+bGVuID09IDApIHsKIAkJCWJyY211X3BrdF9idWZfZnJlZV9za2IocGt0KTsKIAkJCWNvbnRpbnVlOwotCQl9IGVsc2UgaWYgKGJyY21mX3Byb3RvX2hkcnB1bGwoYnVzLT5kcnZyLCAmaWZpZHgsIHBrdCkgIT0gMCkgeworCQl9IGVsc2UgaWYgKGJyY21mX3Byb3RvX2hkcnB1bGwoYnVzLT5zZGlvZGV2LT5kZXYsICZpZmlkeCwKKwkJCSAgIHBrdCkgIT0gMCkgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAicnggcHJvdG9jb2wgZXJyb3JcbiIpOwogCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwa3QpOwotCQkJYnVzLT5kcnZyLT5yeF9lcnJvcnMrKzsKKwkJCWJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5kc3RhdHMucnhfZXJyb3JzKys7CiAJCQljb250aW51ZTsKIAkJfQogCiAJCS8qIFVubG9jayBkdXJpbmcgcnggY2FsbCAqLwogCQl1cCgmYnVzLT5zZHNlbSk7Ci0JCWJyY21mX3J4X2ZyYW1lKGJ1cy0+ZHJ2ciwgaWZpZHgsIHBrdCwgMSk7CisJCWJyY21mX3J4X3BhY2tldChidXMtPnNkaW9kZXYtPmRldiwgaWZpZHgsIHBrdCk7CiAJCWRvd24oJmJ1cy0+c2RzZW0pOwogCX0KIAlyeGNvdW50ID0gbWF4ZnJhbWVzIC0gcnhsZWZ0OwpAQCAtMjIxNCwxNiArMjA5NCw4IEBACiAJcmV0dXJuIHJ4Y291bnQ7CiB9CiAKLXN0YXRpYyBpbnQKLWJyY21mX3NkYnJjbV9zZW5kX2J1ZihzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHUzMiBhZGRyLCB1aW50IGZuLCB1aW50IGZsYWdzLAotCQkgICAgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHN0cnVjdCBza19idWZmICpwa3QpCi17Ci0JcmV0dXJuIGJyY21mX3NkY2FyZF9zZW5kX2J1ZgotCQkoYnVzLT5zZGlvZGV2LCBhZGRyLCBmbiwgZmxhZ3MsIGJ1ZiwgbmJ5dGVzLCBwa3QpOwotfQotCiBzdGF0aWMgdm9pZAotYnJjbWZfc2RicmNtX3dhaXRfZm9yX2V2ZW50KHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCAqbG9ja3ZhcikKK2JyY21mX3NkYnJjbV93YWl0X2Zvcl9ldmVudChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCBib29sICpsb2NrdmFyKQogewogCXVwKCZidXMtPnNkc2VtKTsKIAl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dChidXMtPmN0cmxfd2FpdCwKQEAgLTIyMzMsNyArMjEwNSw3IEBACiB9CiAKIHN0YXRpYyB2b2lkCi1icmNtZl9zZGJyY21fd2FpdF9ldmVudF93YWtldXAoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorYnJjbWZfc2RicmNtX3dhaXRfZXZlbnRfd2FrZXVwKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmJ1cy0+Y3RybF93YWl0KSkKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZidXMtPmN0cmxfd2FpdCk7CkBAIC0yMjQyLDcgKzIxMTQsNyBAQAogCiAvKiBXcml0ZXMgYSBIVy9TVyBoZWFkZXIgaW50byB0aGUgcGFja2V0IGFuZCBzZW5kcyBpdC4gKi8KIC8qIEFzc3VtZXM6IChhKSBoZWFkZXIgc3BhY2UgYWxyZWFkeSB0aGVyZSwgKGIpIGNhbGxlciBob2xkcyBsb2NrICovCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV90eHBrdChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHN0cnVjdCBza19idWZmICpwa3QsCitzdGF0aWMgaW50IGJyY21mX3NkYnJjbV90eHBrdChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0LAogCQkJICAgICAgdWludCBjaGFuLCBib29sIGZyZWVfcGt0KQogewogCWludCByZXQ7CkBAIC0yMjYyLDcgKzIxMzQsNyBAQAogCQlpZiAoc2tiX2hlYWRyb29tKHBrdCkgPCBwYWQpIHsKIAkJCWJyY21mX2RiZyhJTkZPLCAiaW5zdWZmaWNpZW50IGhlYWRyb29tICVkIGZvciAlZCBwYWRcbiIsCiAJCQkJICBza2JfaGVhZHJvb20ocGt0KSwgcGFkKTsKLQkJCWJ1cy0+ZHJ2ci0+dHhfcmVhbGxvYysrOworCQkJYnVzLT5zZGlvZGV2LT5idXNfaWYtPnR4X3JlYWxsb2MrKzsKIAkJCW5ldyA9IGJyY211X3BrdF9idWZfZ2V0X3NrYihwa3QtPmxlbiArIEJSQ01GX1NEQUxJR04pOwogCQkJaWYgKCFuZXcpIHsKIAkJCQlicmNtZl9kYmcoRVJST1IsICJjb3VsZG4ndCBhbGxvY2F0ZSBuZXcgJWQtYnl0ZSBwYWNrZXRcbiIsCkBAIC0yMzMxLDkgKzIyMDMsOCBAQAogCWlmIChsZW4gJiAoQUxJR05NRU5UIC0gMSkpCiAJCQlsZW4gPSByb3VuZHVwKGxlbiwgQUxJR05NRU5UKTsKIAotCXJldCA9IGJyY21mX3NkYnJjbV9zZW5kX2J1ZihidXMsIGJ1cy0+c2Rpb2Rldi0+c2J3YWQsCi0JCQkJICAgIFNESU9fRlVOQ18yLCBGMlNZTkMsIGZyYW1lLAotCQkJCSAgICBsZW4sIHBrdCk7CisJcmV0ID0gYnJjbWZfc2RjYXJkX3NlbmRfcGt0KGJ1cy0+c2Rpb2RldiwgYnVzLT5zZGlvZGV2LT5zYndhZCwKKwkJCQkgICAgU0RJT19GVU5DXzIsIEYyU1lOQywgcGt0KTsKIAlidXMtPmYydHhkYXRhKys7CiAKIAlpZiAocmV0IDwgMCkgewpAQCAtMjM3MSw3ICsyMjQyLDcgQEAKIAkvKiByZXN0b3JlIHBrdCBidWZmZXIgcG9pbnRlciBiZWZvcmUgY2FsbGluZyB0eCBjb21wbGV0ZSByb3V0aW5lICovCiAJc2tiX3B1bGwocGt0LCBTRFBDTV9IRFJMRU4gKyBwYWQpOwogCXVwKCZidXMtPnNkc2VtKTsKLQlicmNtZl90eGNvbXBsZXRlKGJ1cy0+ZHJ2ciwgcGt0LCByZXQgIT0gMCk7CisJYnJjbWZfdHhjb21wbGV0ZShidXMtPnNkaW9kZXYtPmRldiwgcGt0LCByZXQgIT0gMCk7CiAJZG93bigmYnVzLT5zZHNlbSk7CiAKIAlpZiAoZnJlZV9wa3QpCkBAIC0yMzgwLDcgKzIyNTEsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB1aW50IGJyY21mX3NkYnJjbV9zZW5kZnJvbXEoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1aW50IG1heGZyYW1lcykKK3N0YXRpYyB1aW50IGJyY21mX3NkYnJjbV9zZW5kZnJvbXEoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdWludCBtYXhmcmFtZXMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnBrdDsKIAl1MzIgaW50c3RhdHVzID0gMDsKQEAgLTIzOTAsOCArMjI2MSw2IEBACiAJdWludCBkYXRhbGVuOwogCXU4IHR4X3ByZWNfbWFwOwogCi0Jc3RydWN0IGJyY21mX3B1YiAqZHJ2ciA9IGJ1cy0+ZHJ2cjsKLQogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIAogCXR4X3ByZWNfbWFwID0gfmJ1cy0+Zmxvd2NvbnRyb2w7CkBAIC0yNDA5LDkgKzIyNzgsOSBAQAogCiAJCXJldCA9IGJyY21mX3NkYnJjbV90eHBrdChidXMsIHBrdCwgU0RQQ01fREFUQV9DSEFOTkVMLCB0cnVlKTsKIAkJaWYgKHJldCkKLQkJCWJ1cy0+ZHJ2ci0+dHhfZXJyb3JzKys7CisJCQlidXMtPnNkaW9kZXYtPmJ1c19pZi0+ZHN0YXRzLnR4X2Vycm9ycysrOwogCQllbHNlCi0JCQlidXMtPmRydnItPmRzdGF0cy50eF9ieXRlcyArPSBkYXRhbGVuOworCQkJYnVzLT5zZGlvZGV2LT5idXNfaWYtPmRzdGF0cy50eF9ieXRlcyArPSBkYXRhbGVuOwogCiAJCS8qIEluIHBvbGwgbW9kZSwgbmVlZCB0byBjaGVjayBmb3Igb3RoZXIgZXZlbnRzICovCiAJCWlmICghYnVzLT5pbnRyICYmIGNudCkgewpAQCAtMjQyOCwxNCArMjI5Nyw5OCBAQAogCX0KIAogCS8qIERlZmxvdy1jb250cm9sIHN0YWNrIGlmIG5lZWRlZCAqLwotCWlmIChkcnZyLT51cCAmJiAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RBVEEpICYmCi0JICAgIGRydnItPnR4b2ZmICYmIChwa3RxX2xlbigmYnVzLT50eHEpIDwgVFhMT1cpKQotCQlicmNtZl90eGZsb3djb250cm9sKGRydnIsIDAsIE9GRik7CisJaWYgKGJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5kcnZyX3VwICYmCisJICAgIChidXMtPnNkaW9kZXYtPmJ1c19pZi0+c3RhdGUgPT0gQlJDTUZfQlVTX0RBVEEpICYmCisJICAgIGJ1cy0+dHhvZmYgJiYgKHBrdHFfbGVuKCZidXMtPnR4cSkgPCBUWExPVykpIHsKKwkJYnVzLT50eG9mZiA9IE9GRjsKKwkJYnJjbWZfdHhmbG93Y29udHJvbChidXMtPnNkaW9kZXYtPmRldiwgMCwgT0ZGKTsKKwl9CiAKIAlyZXR1cm4gY250OwogfQogCi1zdGF0aWMgYm9vbCBicmNtZl9zZGJyY21fZHBjKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3N0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9idXNfc3RvcChzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJdTMyIGxvY2FsX2hvc3RpbnRtYXNrOworCXU4IHNhdmVjbGs7CisJdWludCByZXRyaWVzOworCWludCBlcnI7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2ID0gYnVzX2lmLT5idXNfcHJpdjsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gc2Rpb2Rldi0+YnVzOworCisJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOworCisJaWYgKGJ1cy0+d2F0Y2hkb2dfdHNrKSB7CisJCXNlbmRfc2lnKFNJR1RFUk0sIGJ1cy0+d2F0Y2hkb2dfdHNrLCAxKTsKKwkJa3RocmVhZF9zdG9wKGJ1cy0+d2F0Y2hkb2dfdHNrKTsKKwkJYnVzLT53YXRjaGRvZ190c2sgPSBOVUxMOworCX0KKworCWlmIChidXMtPmRwY190c2sgJiYgYnVzLT5kcGNfdHNrICE9IGN1cnJlbnQpIHsKKwkJc2VuZF9zaWcoU0lHVEVSTSwgYnVzLT5kcGNfdHNrLCAxKTsKKwkJa3RocmVhZF9zdG9wKGJ1cy0+ZHBjX3Rzayk7CisJCWJ1cy0+ZHBjX3RzayA9IE5VTEw7CisJfQorCisJZG93bigmYnVzLT5zZHNlbSk7CisKKwlidXNfd2FrZShidXMpOworCisJLyogRW5hYmxlIGNsb2NrIGZvciBkZXZpY2UgaW50ZXJydXB0cyAqLworCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfQVZBSUwsIGZhbHNlKTsKKworCS8qIERpc2FibGUgYW5kIGNsZWFyIGludGVycnVwdHMgYXQgdGhlIGNoaXAgbGV2ZWwgYWxzbyAqLworCXdfc2RyZWczMihidXMsIDAsIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgaG9zdGludG1hc2spLCAmcmV0cmllcyk7CisJbG9jYWxfaG9zdGludG1hc2sgPSBidXMtPmhvc3RpbnRtYXNrOworCWJ1cy0+aG9zdGludG1hc2sgPSAwOworCisJLyogQ2hhbmdlIG91ciBpZGVhIG9mIGJ1cyBzdGF0ZSAqLworCWJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOworCisJLyogRm9yY2UgY2xvY2tzIG9uIGJhY2twbGFuZSB0byBiZSBzdXJlIEYyIGludGVycnVwdCBwcm9wYWdhdGVzICovCisJc2F2ZWNsayA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAorCQkJCQlTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwgJmVycik7CisJaWYgKCFlcnIpIHsKKwkJYnJjbWZfc2RjYXJkX2NmZ193cml0ZShidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAorCQkJCSAgICAgICBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwKKwkJCQkgICAgICAgKHNhdmVjbGsgfCBTQlNESU9fRk9SQ0VfSFQpLCAmZXJyKTsKKwl9CisJaWYgKGVycikKKwkJYnJjbWZfZGJnKEVSUk9SLCAiRmFpbGVkIHRvIGZvcmNlIGNsb2NrIGZvciBGMjogZXJyICVkXG4iLCBlcnIpOworCisJLyogVHVybiBvZmYgdGhlIGJ1cyAoRjIpLCBmcmVlIGFueSBwZW5kaW5nIHBhY2tldHMgKi8KKwlicmNtZl9kYmcoSU5UUiwgImRpc2FibGUgU0RJTyBpbnRlcnJ1cHRzXG4iKTsKKwlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzAsIFNESU9fQ0NDUl9JT0V4LAorCQkJIFNESU9fRlVOQ19FTkFCTEVfMSwgTlVMTCk7CisKKwkvKiBDbGVhciBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzIG5vdyB0aGF0IEYyIGlzIGRpc2FibGVkICovCisJd19zZHJlZzMyKGJ1cywgbG9jYWxfaG9zdGludG1hc2ssCisJCSAgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCBpbnRzdGF0dXMpLCAmcmV0cmllcyk7CisKKwkvKiBUdXJuIG9mZiB0aGUgYmFja3BsYW5lIGNsb2NrIChvbmx5KSAqLworCWJyY21mX3NkYnJjbV9jbGtjdGwoYnVzLCBDTEtfU0RPTkxZLCBmYWxzZSk7CisKKwkvKiBDbGVhciB0aGUgZGF0YSBwYWNrZXQgcXVldWVzICovCisJYnJjbXVfcGt0cV9mbHVzaCgmYnVzLT50eHEsIHRydWUsIE5VTEwsIE5VTEwpOworCisJLyogQ2xlYXIgYW55IGhlbGQgZ2xvbW1pbmcgc3R1ZmYgKi8KKwlpZiAoYnVzLT5nbG9tZCkKKwkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihidXMtPmdsb21kKTsKKwlicmNtZl9zZGJyY21fZnJlZV9nbG9tKGJ1cyk7CisKKwkvKiBDbGVhciByeCBjb250cm9sIGFuZCB3YWtlIGFueSB3YWl0ZXJzICovCisJYnVzLT5yeGxlbiA9IDA7CisJYnJjbWZfc2RicmNtX2RjbWRfcmVzcF93YWtlKGJ1cyk7CisKKwkvKiBSZXNldCBzb21lIEYyIHN0YXRlIHN0dWZmICovCisJYnVzLT5yeHNraXAgPSBmYWxzZTsKKwlidXMtPnR4X3NlcSA9IGJ1cy0+cnhfc2VxID0gMDsKKworCXVwKCZidXMtPnNkc2VtKTsKK30KKworc3RhdGljIGJvb2wgYnJjbWZfc2RicmNtX2RwYyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCXUzMiBpbnRzdGF0dXMsIG5ld3N0YXR1cyA9IDA7CiAJdWludCByZXRyaWVzID0gMDsKQEAgLTI0NjMsNyArMjQxNiw3IEBACiAJCQkJCSAgICAgICBTQlNESU9fREVWSUNFX0NUTCwgJmVycik7CiAJCWlmIChlcnIpIHsKIAkJCWJyY21mX2RiZyhFUlJPUiwgImVycm9yIHJlYWRpbmcgREVWQ1RMOiAlZFxuIiwgZXJyKTsKLQkJCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKKwkJCWJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogCQl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKQEAgLTI0NzMsNyArMjQyNiw3IEBACiAJCWlmIChlcnIpIHsKIAkJCWJyY21mX2RiZyhFUlJPUiwgImVycm9yIHJlYWRpbmcgQ1NSOiAlZFxuIiwKIAkJCQkgIGVycik7Ci0JCQlidXMtPmRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RPV047CisJCQlidXMtPnNkaW9kZXYtPmJ1c19pZi0+c3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKIAkJfQogCiAJCWJyY21mX2RiZyhJTkZPLCAiRFBDOiBQRU5ESU5HLCBkZXZjdGwgMHglMDJ4IGNsa2N0bCAweCUwMnhcbiIsCkBAIC0yNDg2LDcgKzI0MzksNyBAQAogCQkJaWYgKGVycikgewogCQkJCWJyY21mX2RiZyhFUlJPUiwgImVycm9yIHJlYWRpbmcgREVWQ1RMOiAlZFxuIiwKIAkJCQkJICBlcnIpOwotCQkJCWJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKKwkJCQlidXMtPnNkaW9kZXYtPmJ1c19pZi0+c3RhdGUgPSBCUkNNRl9CVVNfRE9XTjsKIAkJCX0KIAkJCWRldmN0bCAmPSB+U0JTRElPX0RFVkNUTF9DQV9JTlRfT05MWTsKIAkJCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKQEAgLTI0OTQsNyArMjQ0Nyw3IEBACiAJCQlpZiAoZXJyKSB7CiAJCQkJYnJjbWZfZGJnKEVSUk9SLCAiZXJyb3Igd3JpdGluZyBERVZDVEw6ICVkXG4iLAogCQkJCQkgIGVycik7Ci0JCQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19ET1dOOworCQkJCWJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogCQkJfQogCQkJYnVzLT5jbGtzdGF0ZSA9IENMS19BVkFJTDsKIAkJfSBlbHNlIHsKQEAgLTI1OTYsOSArMjU0OSw5IEBACiAJCShidXMtPmNsa3N0YXRlID09IENMS19BVkFJTCkpIHsKIAkJaW50IHJldCwgaTsKIAotCQlyZXQgPSBicmNtZl9zZGJyY21fc2VuZF9idWYoYnVzLCBidXMtPnNkaW9kZXYtPnNid2FkLAorCQlyZXQgPSBicmNtZl9zZGNhcmRfc2VuZF9idWYoYnVzLT5zZGlvZGV2LCBidXMtPnNkaW9kZXYtPnNid2FkLAogCQkJU0RJT19GVU5DXzIsIEYyU1lOQywgKHU4ICopIGJ1cy0+Y3RybF9mcmFtZV9idWYsCi0JCQkodTMyKSBidXMtPmN0cmxfZnJhbWVfbGVuLCBOVUxMKTsKKwkJCSh1MzIpIGJ1cy0+Y3RybF9mcmFtZV9sZW4pOwogCiAJCWlmIChyZXQgPCAwKSB7CiAJCQkvKiBPbiBmYWlsdXJlLCBhYm9ydCB0aGUgY29tbWFuZCBhbmQKQEAgLTI2NTAsMTEgKzI2MDMsMTEgQEAKIAkJIGVsc2UgYXdhaXQgbmV4dCBpbnRlcnJ1cHQgKi8KIAkvKiBPbiBmYWlsZWQgcmVnaXN0ZXIgYWNjZXNzLCBhbGwgYmV0cyBhcmUgb2ZmOgogCQkgbm8gcmVzY2hlZCBvciBpbnRlcnJ1cHRzICovCi0JaWYgKChidXMtPmRydnItPmJ1c3N0YXRlID09IEJSQ01GX0JVU19ET1dOKSB8fAorCWlmICgoYnVzLT5zZGlvZGV2LT5idXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19ET1dOKSB8fAogCSAgICBicmNtZl9zZGNhcmRfcmVnZmFpbChidXMtPnNkaW9kZXYpKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImZhaWxlZCBiYWNrcGxhbmUgYWNjZXNzIG92ZXIgU0RJTywgaGFsdGluZyBvcGVyYXRpb24gJWRcbiIsCiAJCQkgIGJyY21mX3NkY2FyZF9yZWdmYWlsKGJ1cy0+c2Rpb2RldikpOwotCQlidXMtPmRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RPV047CisJCWJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19ET1dOOwogCQlidXMtPmludHN0YXR1cyA9IDA7CiAJfSBlbHNlIGlmIChidXMtPmNsa3N0YXRlID09IENMS19QRU5ESU5HKSB7CiAJCWJyY21mX2RiZyhJTkZPLCAicmVzY2hlZHVsZWQgZHVlIHRvIENMS19QRU5ESU5HIGF3YWl0aW5nIElfQ0hJUEFDVElWRSBpbnRlcnJ1cHRcbiIpOwpAQCAtMjY4MSw3ICsyNjM0LDcgQEAKIAogc3RhdGljIGludCBicmNtZl9zZGJyY21fZHBjX3RocmVhZCh2b2lkICpkYXRhKQogewotCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IChzdHJ1Y3QgYnJjbWZfYnVzICopIGRhdGE7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IChzdHJ1Y3QgYnJjbWZfc2RpbyAqKSBkYXRhOwogCiAJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwogCS8qIFJ1biB1bnRpbCBzaWduYWwgcmVjZWl2ZWQgKi8KQEAgLTI2OTEsMTIgKzI2NDQsMTIgQEAKIAkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmJ1cy0+ZHBjX3dhaXQpKSB7CiAJCQkvKiBDYWxsIGJ1cyBkcGMgdW5sZXNzIGl0IGluZGljYXRlZCBkb3duCiAJCQkodGhlbiBjbGVhbiBzdG9wKSAqLwotCQkJaWYgKGJ1cy0+ZHJ2ci0+YnVzc3RhdGUgIT0gQlJDTUZfQlVTX0RPV04pIHsKKwkJCWlmIChidXMtPnNkaW9kZXYtPmJ1c19pZi0+c3RhdGUgIT0gQlJDTUZfQlVTX0RPV04pIHsKIAkJCQlpZiAoYnJjbWZfc2RicmNtX2RwYyhidXMpKQogCQkJCQljb21wbGV0ZSgmYnVzLT5kcGNfd2FpdCk7CiAJCQl9IGVsc2UgewogCQkJCS8qIGFmdGVyIHN0b3BwaW5nIHRoZSBidXMsIGV4aXQgdGhyZWFkICovCi0JCQkJYnJjbWZfc2RicmNtX2J1c19zdG9wKGJ1cyk7CisJCQkJYnJjbWZfc2RicmNtX2J1c19zdG9wKGJ1cy0+c2Rpb2Rldi0+ZGV2KTsKIAkJCQlidXMtPmRwY190c2sgPSBOVUxMOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjcwNiwxMCArMjY1OSwxMyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgYnJjbWZfc2RicmNtX2J1c190eGRhdGEoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KQorc3RhdGljIGludCBicmNtZl9zZGJyY21fYnVzX3R4ZGF0YShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpwa3QpCiB7CiAJaW50IHJldCA9IC1FQkFERTsKIAl1aW50IGRhdGFsZW4sIHByZWM7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2ID0gYnVzX2lmLT5idXNfcHJpdjsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gc2Rpb2Rldi0+YnVzOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC0yNzI4LDkgKzI2ODQsMTAgQEAKIAogCS8qIFByaW9yaXR5IGJhc2VkIGVucSAqLwogCXNwaW5fbG9ja19iaCgmYnVzLT50eHFsb2NrKTsKLQlpZiAoYnJjbWZfY19wcmVjX2VucShidXMtPmRydnIsICZidXMtPnR4cSwgcGt0LCBwcmVjKSA9PSBmYWxzZSkgeworCWlmIChicmNtZl9jX3ByZWNfZW5xKGJ1cy0+c2Rpb2Rldi0+ZGV2LCAmYnVzLT50eHEsIHBrdCwgcHJlYykgPT0KKwkgICAgZmFsc2UpIHsKIAkJc2tiX3B1bGwocGt0LCBTRFBDTV9IRFJMRU4pOwotCQlicmNtZl90eGNvbXBsZXRlKGJ1cy0+ZHJ2ciwgcGt0LCBmYWxzZSk7CisJCWJyY21mX3R4Y29tcGxldGUoYnVzLT5zZGlvZGV2LT5kZXYsIHBrdCwgZmFsc2UpOwogCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHBrdCk7CiAJCWJyY21mX2RiZyhFUlJPUiwgIm91dCBvZiBidXMtPnR4cSAhISFcbiIpOwogCQlyZXQgPSAtRU5PU1I7CkBAIC0yNzM5LDggKzI2OTYsMTAgQEAKIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmJ1cy0+dHhxbG9jayk7CiAKLQlpZiAocGt0cV9sZW4oJmJ1cy0+dHhxKSA+PSBUWEhJKQotCQlicmNtZl90eGZsb3djb250cm9sKGJ1cy0+ZHJ2ciwgMCwgT04pOworCWlmIChwa3RxX2xlbigmYnVzLT50eHEpID49IFRYSEkpIHsKKwkJYnVzLT50eG9mZiA9IE9OOworCQlicmNtZl90eGZsb3djb250cm9sKGJ1cy0+c2Rpb2Rldi0+ZGV2LCAwLCBPTik7CisJfQogCiAjaWZkZWYgQkNNREJHCiAJaWYgKHBrdHFfcGxlbigmYnVzLT50eHEsIHByZWMpID4gcWNvdW50W3ByZWNdKQpAQCAtMjc1Nyw3ICsyNzE2LDcgQEAKIH0KIAogc3RhdGljIGludAotYnJjbWZfc2RicmNtX21lbWJ5dGVzKHN0cnVjdCBicmNtZl9idXMgKmJ1cywgYm9vbCB3cml0ZSwgdTMyIGFkZHJlc3MsIHU4ICpkYXRhLAorYnJjbWZfc2RicmNtX21lbWJ5dGVzKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIGJvb2wgd3JpdGUsIHUzMiBhZGRyZXNzLCB1OCAqZGF0YSwKIAkJIHVpbnQgc2l6ZSkKIHsKIAlpbnQgYmNtZXJyb3IgPSAwOwpAQCAtMjgxOCw3ICsyNzc3LDcgQEAKICNpZmRlZiBCQ01EQkcKICNkZWZpbmUgQ09OU09MRV9MSU5FX01BWAkxOTIKIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fcmVhZGNvbnNvbGUoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fcmVhZGNvbnNvbGUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlzdHJ1Y3QgYnJjbWZfY29uc29sZSAqYyA9ICZidXMtPmNvbnNvbGU7CiAJdTggbGluZVtDT05TT0xFX0xJTkVfTUFYXSwgY2g7CkBAIC0yODk1LDE0ICsyODU0LDE0IEBACiB9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKLXN0YXRpYyBpbnQgYnJjbWZfdHhfZnJhbWUoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1OCAqZnJhbWUsIHUxNiBsZW4pCitzdGF0aWMgaW50IGJyY21mX3R4X2ZyYW1lKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHU4ICpmcmFtZSwgdTE2IGxlbikKIHsKIAlpbnQgaTsKIAlpbnQgcmV0OwogCiAJYnVzLT5jdHJsX2ZyYW1lX3N0YXQgPSBmYWxzZTsKLQlyZXQgPSBicmNtZl9zZGJyY21fc2VuZF9idWYoYnVzLCBidXMtPnNkaW9kZXYtPnNid2FkLAotCQkJCSAgICBTRElPX0ZVTkNfMiwgRjJTWU5DLCBmcmFtZSwgbGVuLCBOVUxMKTsKKwlyZXQgPSBicmNtZl9zZGNhcmRfc2VuZF9idWYoYnVzLT5zZGlvZGV2LCBidXMtPnNkaW9kZXYtPnNid2FkLAorCQkJCSAgICBTRElPX0ZVTkNfMiwgRjJTWU5DLCBmcmFtZSwgbGVuKTsKIAogCWlmIChyZXQgPCAwKSB7CiAJCS8qIE9uIGZhaWx1cmUsIGFib3J0IHRoZSBjb21tYW5kIGFuZCB0ZXJtaW5hdGUgdGhlIGZyYW1lICovCkBAIC0yOTM3LDggKzI4OTYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludAotYnJjbWZfc2RicmNtX2J1c190eGN0bChzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pCitzdGF0aWMgaW50CiticmNtZl9zZGJyY21fYnVzX3R4Y3RsKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqbXNnLCB1aW50IG1zZ2xlbikKIHsKIAl1OCAqZnJhbWU7CiAJdTE2IGxlbjsKQEAgLTI5NDYsNiArMjkwNSw5IEBACiAJdWludCByZXRyaWVzID0gMDsKIAl1OCBkb2ZmID0gMDsKIAlpbnQgcmV0ID0gLTE7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2ID0gYnVzX2lmLT5idXNfcHJpdjsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gc2Rpb2Rldi0+YnVzOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC0zMDQ1LDE5ICszMDA3LDIyIEBACiAJdXAoJmJ1cy0+c2RzZW0pOwogCiAJaWYgKHJldCkKLQkJYnVzLT5kcnZyLT50eF9jdGxlcnJzKys7CisJCWJ1cy0+dHhfY3RsZXJycysrOwogCWVsc2UKLQkJYnVzLT5kcnZyLT50eF9jdGxwa3RzKys7CisJCWJ1cy0+dHhfY3RscGt0cysrOwogCiAJcmV0dXJuIHJldCA/IC1FSU8gOiAwOwogfQogCi1pbnQKLWJyY21mX3NkYnJjbV9idXNfcnhjdGwoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1bnNpZ25lZCBjaGFyICptc2csIHVpbnQgbXNnbGVuKQorc3RhdGljIGludAorYnJjbWZfc2RicmNtX2J1c19yeGN0bChzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGNoYXIgKm1zZywgdWludCBtc2dsZW4pCiB7CiAJaW50IHRpbWVsZWZ0OwogCXVpbnQgcnhsZW4gPSAwOwogCWJvb2wgcGVuZGluZzsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2OworCXN0cnVjdCBicmNtZl9zZGlvICpidXMgPSBzZGlvZGV2LT5idXM7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTMwODMsMjEgKzMwNDgsMjEgQEAKIAl9CiAKIAlpZiAocnhsZW4pCi0JCWJ1cy0+ZHJ2ci0+cnhfY3RscGt0cysrOworCQlidXMtPnJ4X2N0bHBrdHMrKzsKIAllbHNlCi0JCWJ1cy0+ZHJ2ci0+cnhfY3RsZXJycysrOworCQlidXMtPnJ4X2N0bGVycnMrKzsKIAogCXJldHVybiByeGxlbiA/IChpbnQpcnhsZW4gOiAtRVRJTUVET1VUOwogfQogCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kb3dubG9hZHZhcnMoc3RydWN0IGJyY21mX2J1cyAqYnVzLCB2b2lkICphcmcsIGludCBsZW4pCitzdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kb3dubG9hZHZhcnMoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdm9pZCAqYXJnLCBpbnQgbGVuKQogewogCWludCBiY21lcnJvciA9IDA7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKIAkvKiBCYXNpYyBzYW5pdHkgY2hlY2tzICovCi0JaWYgKGJ1cy0+ZHJ2ci0+dXApIHsKKwlpZiAoYnVzLT5zZGlvZGV2LT5idXNfaWYtPmRydnJfdXApIHsKIAkJYmNtZXJyb3IgPSAtRUlTQ09OTjsKIAkJZ290byBlcnI7CiAJfQpAQCAtMzEyMyw3ICszMDg4LDcgQEAKIAlyZXR1cm4gYmNtZXJyb3I7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbWZfc2RicmNtX3dyaXRlX3ZhcnMoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fd3JpdGVfdmFycyhzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWludCBiY21lcnJvciA9IDA7CiAJdTMyIHZhcnNpemU7CkBAIC0zMjEwLDEzNSArMzE3NSwxMSBAQAogCXJldHVybiBiY21lcnJvcjsKIH0KIAotc3RhdGljIHZvaWQKLWJyY21mX3NkYnJjbV9jaGlwX2Rpc2FibGVjb3JlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGNvcmViYXNlKQotewotCXUzMiByZWdkYXRhOwotCi0JcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAotCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKLQlpZiAocmVnZGF0YSAmIFNCVE1MX1JFU0VUKQotCQlyZXR1cm47Ci0KLQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCWlmICgocmVnZGF0YSAmIChTSUNGX0NMT0NLX0VOIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpKSAhPSAwKSB7Ci0JCS8qCi0JCSAqIHNldCB0YXJnZXQgcmVqZWN0IGFuZCBzcGluIHVudGlsIGJ1c3kgaXMgY2xlYXIKLQkJICogKHByZXNlcnZlIGNvcmUtc3BlY2lmaWMgYml0cykKLQkJICovCi0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsIENPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksCi0JCQkJICAgICAgIDQsIHJlZ2RhdGEgfCBTQlRNTF9SRUopOwotCi0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCQl1ZGVsYXkoMSk7Ci0JCVNQSU5XQUlUKChicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWhpZ2gpLCA0KSAmCi0JCQlTQlRNSF9CVVNZKSwgMTAwMDAwKTsKLQotCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQlDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVoaWdoKSwgNCk7Ci0JCWlmIChyZWdkYXRhICYgU0JUTUhfQlVTWSkKLQkJCWJyY21mX2RiZyhFUlJPUiwgIkFSTSBjb3JlIHN0aWxsIGJ1c3lcbiIpOwotCi0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNiaWRsb3cpLCA0KTsKLQkJaWYgKHJlZ2RhdGEgJiBTQklETF9JTklUKSB7Ci0JCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCkgfAotCQkJCVNCSU1fUko7Ci0JCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCi0JCQkJQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCwKLQkJCQlyZWdkYXRhKTsKLQkJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0KTsKLQkJCXVkZWxheSgxKTsKLQkJCVNQSU5XQUlUKChicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0KSAmCi0JCQkJU0JJTV9CWSksIDEwMDAwMCk7Ci0JCX0KLQotCQkvKiBzZXQgcmVzZXQgYW5kIHJlamVjdCB3aGlsZSBlbmFibGluZyB0aGUgY2xvY2tzICovCi0JCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCi0JCQkoKChTSUNGX0ZHQyB8IFNJQ0ZfQ0xPQ0tfRU4pIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpIHwKLQkJCVNCVE1MX1JFSiB8IFNCVE1MX1JFU0VUKSk7Ci0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCUNPUkVfU0IoY29yZWJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOwotCQl1ZGVsYXkoMTApOwotCi0JCS8qIGNsZWFyIHRoZSBpbml0aWF0b3IgcmVqZWN0IGJpdCAqLwotCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQlDT1JFX1NCKGNvcmViYXNlLCBzYmlkbG93KSwgNCk7Ci0JCWlmIChyZWdkYXRhICYgU0JJRExfSU5JVCkgewotCQkJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAotCQkJCUNPUkVfU0IoY29yZWJhc2UsIHNiaW1zdGF0ZSksIDQpICYKLQkJCQl+U0JJTV9SSjsKLQkJCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKLQkJCQlDT1JFX1NCKGNvcmViYXNlLCBzYmltc3RhdGUpLCA0LAotCQkJCXJlZ2RhdGEpOwotCQl9Ci0JfQotCi0JLyogbGVhdmUgcmVzZXQgYW5kIHJlamVjdCBhc3NlcnRlZCAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKLQkJKFNCVE1MX1JFSiB8IFNCVE1MX1JFU0VUKSk7Ci0JdWRlbGF5KDEpOwotfQotCi1zdGF0aWMgdm9pZAotYnJjbWZfc2RicmNtX2NoaXBfcmVzZXRjb3JlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGNvcmViYXNlKQotewotCXUzMiByZWdkYXRhOwotCi0JLyoKLQkgKiBNdXN0IGRvIHRoZSBkaXNhYmxlIHNlcXVlbmNlIGZpcnN0IHRvIHdvcmsgZm9yCi0JICogYXJiaXRyYXJ5IGN1cnJlbnQgY29yZSBzdGF0ZS4KLQkgKi8KLQlicmNtZl9zZGJyY21fY2hpcF9kaXNhYmxlY29yZShzZGlvZGV2LCBjb3JlYmFzZSk7Ci0KLQkvKgotCSAqIE5vdyBkbyB0aGUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UuCi0JICogc2V0IHJlc2V0IHdoaWxlIGVuYWJsaW5nIHRoZSBjbG9jayBhbmQKLQkgKiBmb3JjaW5nIHRoZW0gb24gdGhyb3VnaG91dCB0aGUgY29yZQotCSAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKLQkJKChTSUNGX0ZHQyB8IFNJQ0ZfQ0xPQ0tfRU4pIDw8IFNCVE1MX1NJQ0ZfU0hJRlQpIHwKLQkJU0JUTUxfUkVTRVQpOwotCXVkZWxheSgxKTsKLQotCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJCQkJQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlaGlnaCksIDQpOwotCWlmIChyZWdkYXRhICYgU0JUTUhfU0VSUikKLQkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAotCQkJCSAgICAgICBDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVoaWdoKSwgNCwgMCk7Ci0KLQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQkJCUNPUkVfU0IoY29yZWJhc2UsIHNiaW1zdGF0ZSksIDQpOwotCWlmIChyZWdkYXRhICYgKFNCSU1fSUJFIHwgU0JJTV9UTykpCi0JCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2JpbXN0YXRlKSwgNCwKLQkJCXJlZ2RhdGEgJiB+KFNCSU1fSUJFIHwgU0JJTV9UTykpOwotCi0JLyogY2xlYXIgcmVzZXQgYW5kIGFsbG93IGl0IHRvIHByb3BhZ2F0ZSB0aHJvdWdob3V0IHRoZSBjb3JlICovCi0JYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LCBDT1JFX1NCKGNvcmViYXNlLCBzYnRtc3RhdGVsb3cpLCA0LAotCQkoU0lDRl9GR0MgPDwgU0JUTUxfU0lDRl9TSElGVCkgfAotCQkoU0lDRl9DTE9DS19FTiA8PCBTQlRNTF9TSUNGX1NISUZUKSk7Ci0JdWRlbGF5KDEpOwotCi0JLyogbGVhdmUgY2xvY2sgZW5hYmxlZCAqLwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgQ09SRV9TQihjb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKLQkJKFNJQ0ZfQ0xPQ0tfRU4gPDwgU0JUTUxfU0lDRl9TSElGVCkpOwotCXVkZWxheSgxKTsKLX0KLQotc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfc3RhdGUoc3RydWN0IGJyY21mX2J1cyAqYnVzLCBib29sIGVudGVyKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfc3RhdGUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgYm9vbCBlbnRlcikKIHsKIAl1aW50IHJldHJpZXM7Ci0JdTMyIHJlZ2RhdGE7CiAJaW50IGJjbWVycm9yID0gMDsKKwlzdHJ1Y3QgY2hpcF9pbmZvICpjaSA9IGJ1cy0+Y2k7CiAKIAkvKiBUbyBlbnRlciBkb3dubG9hZCBzdGF0ZSwgZGlzYWJsZSBBUk0gYW5kIHJlc2V0IFNPQ1JBTS4KIAkgKiBUbyBleGl0IGRvd25sb2FkIHN0YXRlLCBzaW1wbHkgcmVzZXQgQVJNIChkZWZhdWx0IGlzIFJBTSBib290KS4KQEAgLTMzNDYsMTAgKzMxODcsOSBAQAogCWlmIChlbnRlcikgewogCQlidXMtPmFscF9vbmx5ID0gdHJ1ZTsKIAotCQlicmNtZl9zZGJyY21fY2hpcF9kaXNhYmxlY29yZShidXMtPnNkaW9kZXYsCi0JCQkJCSAgICAgIGJ1cy0+Y2ktPmFybWNvcmViYXNlKTsKKwkJY2ktPmNvcmVkaXNhYmxlKGJ1cy0+c2Rpb2RldiwgY2ksIEJDTUFfQ09SRV9BUk1fQ00zKTsKIAotCQlicmNtZl9zZGJyY21fY2hpcF9yZXNldGNvcmUoYnVzLT5zZGlvZGV2LCBidXMtPmNpLT5yYW1jb3JlYmFzZSk7CisJCWNpLT5yZXNldGNvcmUoYnVzLT5zZGlvZGV2LCBjaSwgQkNNQV9DT1JFX0lOVEVSTkFMX01FTSk7CiAKIAkJLyogQ2xlYXIgdGhlIHRvcCBiaXQgb2YgbWVtb3J5ICovCiAJCWlmIChidXMtPnJhbXNpemUpIHsKQEAgLTMzNTgsMTEgKzMxOTgsNyBAQAogCQkJCQkgKHU4ICopJnplcm9zLCA0KTsKIAkJfQogCX0gZWxzZSB7Ci0JCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoYnVzLT5zZGlvZGV2LAotCQkJQ09SRV9TQihidXMtPmNpLT5yYW1jb3JlYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7Ci0JCXJlZ2RhdGEgJj0gKFNCVE1MX1JFU0VUIHwgU0JUTUxfUkVKX01BU0sgfAotCQkJKFNJQ0ZfQ0xPQ0tfRU4gPDwgU0JUTUxfU0lDRl9TSElGVCkpOwotCQlpZiAoKFNJQ0ZfQ0xPQ0tfRU4gPDwgU0JUTUxfU0lDRl9TSElGVCkgIT0gcmVnZGF0YSkgeworCQlpZiAoIWNpLT5pc2NvcmV1cChidXMtPnNkaW9kZXYsIGNpLCBCQ01BX0NPUkVfSU5URVJOQUxfTUVNKSkgewogCQkJYnJjbWZfZGJnKEVSUk9SLCAiU09DUkFNIGNvcmUgaXMgZG93biBhZnRlciByZXNldD9cbiIpOwogCQkJYmNtZXJyb3IgPSAtRUJBREU7CiAJCQlnb3RvIGZhaWw7CkBAIC0zMzc3LDE4ICszMjEzLDE4IEBACiAJCXdfc2RyZWczMihidXMsIDB4RkZGRkZGRkYsCiAJCQkgIG9mZnNldG9mKHN0cnVjdCBzZHBjbWRfcmVncywgaW50c3RhdHVzKSwgJnJldHJpZXMpOwogCi0JCWJyY21mX3NkYnJjbV9jaGlwX3Jlc2V0Y29yZShidXMtPnNkaW9kZXYsIGJ1cy0+Y2ktPmFybWNvcmViYXNlKTsKKwkJY2ktPnJlc2V0Y29yZShidXMtPnNkaW9kZXYsIGNpLCBCQ01BX0NPUkVfQVJNX0NNMyk7CiAKIAkJLyogQWxsb3cgSFQgQ2xvY2sgbm93IHRoYXQgdGhlIEFSTSBpcyBydW5uaW5nLiAqLwogCQlidXMtPmFscF9vbmx5ID0gZmFsc2U7CiAKLQkJYnVzLT5kcnZyLT5idXNzdGF0ZSA9IEJSQ01GX0JVU19MT0FEOworCQlidXMtPnNkaW9kZXYtPmJ1c19pZi0+c3RhdGUgPSBCUkNNRl9CVVNfTE9BRDsKIAl9CiBmYWlsOgogCXJldHVybiBiY21lcnJvcjsKIH0KIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fZ2V0X2ltYWdlKGNoYXIgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZ2V0X2ltYWdlKGNoYXIgKmJ1ZiwgaW50IGxlbiwgc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlpZiAoYnVzLT5maXJtd2FyZS0+c2l6ZSA8IGJ1cy0+ZndfcHRyICsgbGVuKQogCQlsZW4gPSBidXMtPmZpcm13YXJlLT5zaXplIC0gYnVzLT5md19wdHI7CkBAIC0zMzk4LDEwICszMjM0LDcgQEAKIAlyZXR1cm4gbGVuOwogfQogCi1NT0RVTEVfRklSTVdBUkUoQkNNNDMyOV9GV19OQU1FKTsKLU1PRFVMRV9GSVJNV0FSRShCQ000MzI5X05WX05BTUUpOwotCi1zdGF0aWMgaW50IGJyY21mX3NkYnJjbV9kb3dubG9hZF9jb2RlX2ZpbGUoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfY29kZV9maWxlKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJaW50IG9mZnNldCA9IDA7CiAJdWludCBsZW47CkBAIC0zNDEwLDggKzMyNDMsNyBAQAogCiAJYnJjbWZfZGJnKElORk8sICJFbnRlclxuIik7CiAKLQlidXMtPmZ3X25hbWUgPSBCQ000MzI5X0ZXX05BTUU7Ci0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmYnVzLT5maXJtd2FyZSwgYnVzLT5md19uYW1lLAorCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmJ1cy0+ZmlybXdhcmUsIEJSQ01GTUFDX0ZXX05BTUUsCiAJCQkgICAgICAgJmJ1cy0+c2Rpb2Rldi0+ZnVuY1syXS0+ZGV2KTsKIAlpZiAocmV0KSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgIkZhaWwgdG8gcmVxdWVzdCBmaXJtd2FyZSAlZFxuIiwgcmV0KTsKQEAgLTM1MDEsMTUgKzMzMzMsMTQgQEAKIAlyZXR1cm4gYnVmX2xlbjsKIH0KIAotc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfbnZyYW0oc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIGludCBicmNtZl9zZGJyY21fZG93bmxvYWRfbnZyYW0oc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAl1aW50IGxlbjsKIAljaGFyICptZW1ibG9jayA9IE5VTEw7CiAJY2hhciAqYnVmcDsKIAlpbnQgcmV0OwogCi0JYnVzLT5udl9uYW1lID0gQkNNNDMyOV9OVl9OQU1FOwotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmJ1cy0+ZmlybXdhcmUsIGJ1cy0+bnZfbmFtZSwKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZidXMtPmZpcm13YXJlLCBCUkNNRk1BQ19OVl9OQU1FLAogCQkJICAgICAgICZidXMtPnNkaW9kZXYtPmZ1bmNbMl0tPmRldik7CiAJaWYgKHJldCkgewogCQlicmNtZl9kYmcoRVJST1IsICJGYWlsIHRvIHJlcXVlc3QgbnZyYW0gJWRcbiIsIHJldCk7CkBAIC0zNTQ5LDcgKzMzODAsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgX2JyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgaW50IF9icmNtZl9zZGJyY21fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlpbnQgYmNtZXJyb3IgPSAtMTsKIApAQCAtMzU4Miw3ICszNDEzLDcgQEAKIH0KIAogc3RhdGljIGJvb2wKLWJyY21mX3NkYnJjbV9kb3dubG9hZF9maXJtd2FyZShzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCiticmNtZl9zZGJyY21fZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlib29sIHJldDsKIApAQCAtMzU5Niw5MSArMzQyNywxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXZvaWQgYnJjbWZfc2RicmNtX2J1c19zdG9wKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3N0YXRpYyBpbnQgYnJjbWZfc2RicmNtX2J1c19pbml0KHN0cnVjdCBkZXZpY2UgKmRldikKIHsKLQl1MzIgbG9jYWxfaG9zdGludG1hc2s7Ci0JdTggc2F2ZWNsazsKLQl1aW50IHJldHJpZXM7Ci0JaW50IGVycjsKLQotCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKLQotCWlmIChidXMtPndhdGNoZG9nX3RzaykgewotCQlzZW5kX3NpZyhTSUdURVJNLCBidXMtPndhdGNoZG9nX3RzaywgMSk7Ci0JCWt0aHJlYWRfc3RvcChidXMtPndhdGNoZG9nX3Rzayk7Ci0JCWJ1cy0+d2F0Y2hkb2dfdHNrID0gTlVMTDsKLQl9Ci0KLQlpZiAoYnVzLT5kcGNfdHNrICYmIGJ1cy0+ZHBjX3RzayAhPSBjdXJyZW50KSB7Ci0JCXNlbmRfc2lnKFNJR1RFUk0sIGJ1cy0+ZHBjX3RzaywgMSk7Ci0JCWt0aHJlYWRfc3RvcChidXMtPmRwY190c2spOwotCQlidXMtPmRwY190c2sgPSBOVUxMOwotCX0KLQotCWRvd24oJmJ1cy0+c2RzZW0pOwotCi0JYnVzX3dha2UoYnVzKTsKLQotCS8qIEVuYWJsZSBjbG9jayBmb3IgZGV2aWNlIGludGVycnVwdHMgKi8KLQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX0FWQUlMLCBmYWxzZSk7Ci0KLQkvKiBEaXNhYmxlIGFuZCBjbGVhciBpbnRlcnJ1cHRzIGF0IHRoZSBjaGlwIGxldmVsIGFsc28gKi8KLQl3X3NkcmVnMzIoYnVzLCAwLCBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGhvc3RpbnRtYXNrKSwgJnJldHJpZXMpOwotCWxvY2FsX2hvc3RpbnRtYXNrID0gYnVzLT5ob3N0aW50bWFzazsKLQlidXMtPmhvc3RpbnRtYXNrID0gMDsKLQotCS8qIENoYW5nZSBvdXIgaWRlYSBvZiBidXMgc3RhdGUgKi8KLQlidXMtPmRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RPV047Ci0KLQkvKiBGb3JjZSBjbG9ja3Mgb24gYmFja3BsYW5lIHRvIGJlIHN1cmUgRjIgaW50ZXJydXB0IHByb3BhZ2F0ZXMgKi8KLQlzYXZlY2xrID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCi0JCQkJCVNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCAmZXJyKTsKLQlpZiAoIWVycikgewotCQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCi0JCQkJICAgICAgIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLAotCQkJCSAgICAgICAoc2F2ZWNsayB8IFNCU0RJT19GT1JDRV9IVCksICZlcnIpOwotCX0KLQlpZiAoZXJyKQotCQlicmNtZl9kYmcoRVJST1IsICJGYWlsZWQgdG8gZm9yY2UgY2xvY2sgZm9yIEYyOiBlcnIgJWRcbiIsIGVycik7Ci0KLQkvKiBUdXJuIG9mZiB0aGUgYnVzIChGMiksIGZyZWUgYW55IHBlbmRpbmcgcGFja2V0cyAqLwotCWJyY21mX2RiZyhJTlRSLCAiZGlzYWJsZSBTRElPIGludGVycnVwdHNcbiIpOwotCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMCwgU0RJT19DQ0NSX0lPRXgsCi0JCQkgU0RJT19GVU5DX0VOQUJMRV8xLCBOVUxMKTsKLQotCS8qIENsZWFyIGFueSBwZW5kaW5nIGludGVycnVwdHMgbm93IHRoYXQgRjIgaXMgZGlzYWJsZWQgKi8KLQl3X3NkcmVnMzIoYnVzLCBsb2NhbF9ob3N0aW50bWFzaywKLQkJICBvZmZzZXRvZihzdHJ1Y3Qgc2RwY21kX3JlZ3MsIGludHN0YXR1cyksICZyZXRyaWVzKTsKLQotCS8qIFR1cm4gb2ZmIHRoZSBiYWNrcGxhbmUgY2xvY2sgKG9ubHkpICovCi0JYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19TRE9OTFksIGZhbHNlKTsKLQotCS8qIENsZWFyIHRoZSBkYXRhIHBhY2tldCBxdWV1ZXMgKi8KLQlicmNtdV9wa3RxX2ZsdXNoKCZidXMtPnR4cSwgdHJ1ZSwgTlVMTCwgTlVMTCk7Ci0KLQkvKiBDbGVhciBhbnkgaGVsZCBnbG9tbWluZyBzdHVmZiAqLwotCWlmIChidXMtPmdsb21kKQotCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKGJ1cy0+Z2xvbWQpOwotCi0JaWYgKGJ1cy0+Z2xvbSkKLQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihidXMtPmdsb20pOwotCi0JYnVzLT5nbG9tID0gYnVzLT5nbG9tZCA9IE5VTEw7Ci0KLQkvKiBDbGVhciByeCBjb250cm9sIGFuZCB3YWtlIGFueSB3YWl0ZXJzICovCi0JYnVzLT5yeGxlbiA9IDA7Ci0JYnJjbWZfc2RicmNtX2RjbWRfcmVzcF93YWtlKGJ1cyk7Ci0KLQkvKiBSZXNldCBzb21lIEYyIHN0YXRlIHN0dWZmICovCi0JYnVzLT5yeHNraXAgPSBmYWxzZTsKLQlidXMtPnR4X3NlcSA9IGJ1cy0+cnhfc2VxID0gMDsKLQotCXVwKCZidXMtPnNkc2VtKTsKLX0KLQotaW50IGJyY21mX3NkYnJjbV9idXNfaW5pdChzdHJ1Y3QgYnJjbWZfcHViICpkcnZyKQotewotCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IGRydnItPmJ1czsKKwlzdHJ1Y3QgYnJjbWZfYnVzICpidXNfaWYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKKwlzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYgPSBidXNfaWYtPmJ1c19wcml2OworCXN0cnVjdCBicmNtZl9zZGlvICpidXMgPSBzZGlvZGV2LT5idXM7CiAJdW5zaWduZWQgbG9uZyB0aW1lb3V0OwogCXVpbnQgcmV0cmllcyA9IDA7CiAJdTggcmVhZHksIGVuYWJsZTsKQEAgLTM2OTAsMTYgKzM0NDEsMTYgQEAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKIAkvKiB0cnkgdG8gZG93bmxvYWQgaW1hZ2UgYW5kIG52cmFtIHRvIHRoZSBkb25nbGUgKi8KLQlpZiAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHsKKwlpZiAoYnVzX2lmLT5zdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikgewogCQlpZiAoIShicmNtZl9zZGJyY21fZG93bmxvYWRfZmlybXdhcmUoYnVzKSkpCiAJCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKCFidXMtPmRydnIpCisJaWYgKCFidXMtPnNkaW9kZXYtPmJ1c19pZi0+ZHJ2cikKIAkJcmV0dXJuIDA7CiAKIAkvKiBTdGFydCB0aGUgd2F0Y2hkb2cgdGltZXIgKi8KLQlidXMtPmRydnItPnRpY2tjbnQgPSAwOworCWJ1cy0+dGlja2NudCA9IDA7CiAJYnJjbWZfc2RicmNtX3dkX3RpbWVyKGJ1cywgQlJDTUZfV0RfUE9MTF9NUyk7CiAKIAlkb3duKCZidXMtPnNkc2VtKTsKQEAgLTM3NTYsNyArMzUwNyw3IEBACiAJCQkJICAgICAgIFNCU0RJT19XQVRFUk1BUkssIDgsICZlcnIpOwogCiAJCS8qIFNldCBidXMgc3RhdGUgYWNjb3JkaW5nIHRvIGVuYWJsZSByZXN1bHQgKi8KLQkJZHJ2ci0+YnVzc3RhdGUgPSBCUkNNRl9CVVNfREFUQTsKKwkJYnVzX2lmLT5zdGF0ZSA9IEJSQ01GX0JVU19EQVRBOwogCX0KIAogCWVsc2UgewpAQCAtMzc3MSw3ICszNTIyLDcgQEAKIAkJCSAgICAgICBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwgc2F2ZWNsaywgJmVycik7CiAKIAkvKiBJZiB3ZSBkaWRuJ3QgY29tZSB1cCwgdHVybiBvZmYgYmFja3BsYW5lIGNsb2NrICovCi0JaWYgKGRydnItPmJ1c3N0YXRlICE9IEJSQ01GX0JVU19EQVRBKQorCWlmIChidXNfaWYtPnN0YXRlICE9IEJSQ01GX0JVU19EQVRBKQogCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX05PTkUsIGZhbHNlKTsKIAogZXhpdDoKQEAgLTM3ODIsNyArMzUzMyw3IEBACiAKIHZvaWQgYnJjbWZfc2RicmNtX2lzcih2b2lkICphcmcpCiB7Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzID0gKHN0cnVjdCBicmNtZl9idXMgKikgYXJnOworCXN0cnVjdCBicmNtZl9zZGlvICpidXMgPSAoc3RydWN0IGJyY21mX3NkaW8gKikgYXJnOwogCiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC0zNzkxLDcgKzM1NDIsNyBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGJ1cy0+ZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RPV04pIHsKKwlpZiAoYnVzLT5zZGlvZGV2LT5idXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19ET1dOKSB7CiAJCWJyY21mX2RiZyhFUlJPUiwgImJ1cyBpcyBkb3duLiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG9cbiIpOwogCQlyZXR1cm47CiAJfQpAQCAtMzgxNCwxNCArMzU2NSwxNCBAQAogCQljb21wbGV0ZSgmYnVzLT5kcGNfd2FpdCk7CiB9CiAKLXN0YXRpYyBib29sIGJyY21mX3NkYnJjbV9idXNfd2F0Y2hkb2coc3RydWN0IGJyY21mX3B1YiAqZHJ2cikKK3N0YXRpYyBib29sIGJyY21mX3NkYnJjbV9idXNfd2F0Y2hkb2coc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXM7CisjaWZkZWYgQkNNREJHCisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmID0gZGV2X2dldF9kcnZkYXRhKGJ1cy0+c2Rpb2Rldi0+ZGV2KTsKKyNlbmRpZgkvKiBCQ01EQkcgKi8KIAogCWJyY21mX2RiZyhUSU1FUiwgIkVudGVyXG4iKTsKIAotCWJ1cyA9IGRydnItPmJ1czsKLQogCS8qIElnbm9yZSB0aGUgdGltZXIgaWYgc2ltdWxhdGluZyBidXMgZG93biAqLwogCWlmIChidXMtPnNsZWVwaW5nKQogCQlyZXR1cm4gZmFsc2U7CkBAIC0zODY1LDcgKzM2MTYsOCBAQAogCX0KICNpZmRlZiBCQ01EQkcKIAkvKiBQb2xsIGZvciBjb25zb2xlIG91dHB1dCBwZXJpb2RpY2FsbHkgKi8KLQlpZiAoZHJ2ci0+YnVzc3RhdGUgPT0gQlJDTUZfQlVTX0RBVEEgJiYgYnVzLT5jb25zb2xlX2ludGVydmFsICE9IDApIHsKKwlpZiAoYnVzX2lmLT5zdGF0ZSA9PSBCUkNNRl9CVVNfREFUQSAmJgorCSAgICBidXMtPmNvbnNvbGVfaW50ZXJ2YWwgIT0gMCkgewogCQlidXMtPmNvbnNvbGUuY291bnQgKz0gQlJDTUZfV0RfUE9MTF9NUzsKIAkJaWYgKGJ1cy0+Y29uc29sZS5jb3VudCA+PSBidXMtPmNvbnNvbGVfaW50ZXJ2YWwpIHsKIAkJCWJ1cy0+Y29uc29sZS5jb3VudCAtPSBidXMtPmNvbnNvbGVfaW50ZXJ2YWw7CkBAIC0zOTAwLDEwICszNjUyLDEyIEBACiB7CiAJaWYgKGNoaXBpZCA9PSBCQ000MzI5X0NISVBfSUQpCiAJCXJldHVybiB0cnVlOworCWlmIChjaGlwaWQgPT0gQkNNNDMzMF9DSElQX0lEKQorCQlyZXR1cm4gdHJ1ZTsKIAlyZXR1cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yZWxlYXNlX21hbGxvYyhzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcmVsZWFzZV9tYWxsb2Moc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTM5MTUsMTMgKzM2NjksMTMgQEAKIAlidXMtPmRhdGFidWYgPSBOVUxMOwogfQogCi1zdGF0aWMgYm9vbCBicmNtZl9zZGJyY21fcHJvYmVfbWFsbG9jKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3N0YXRpYyBib29sIGJyY21mX3NkYnJjbV9wcm9iZV9tYWxsb2Moc3RydWN0IGJyY21mX3NkaW8gKmJ1cykKIHsKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKLQlpZiAoYnVzLT5kcnZyLT5tYXhjdGwpIHsKKwlpZiAoYnVzLT5zZGlvZGV2LT5idXNfaWYtPm1heGN0bCkgewogCQlidXMtPnJ4YmxlbiA9Ci0JCSAgICByb3VuZHVwKChidXMtPmRydnItPm1heGN0bCArIFNEUENNX0hEUkxFTiksCisJCSAgICByb3VuZHVwKChidXMtPnNkaW9kZXYtPmJ1c19pZi0+bWF4Y3RsICsgU0RQQ01fSERSTEVOKSwKIAkJCSAgICBBTElHTk1FTlQpICsgQlJDTUZfU0RBTElHTjsKIAkJYnVzLT5yeGJ1ZiA9IGttYWxsb2MoYnVzLT5yeGJsZW4sIEdGUF9BVE9NSUMpOwogCQlpZiAoIShidXMtPnJ4YnVmKSkKQEAgLTM5NTAsMjc2ICszNzA0LDE0IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi0vKiBTRElPIFBhZCBkcml2ZSBzdHJlbmd0aCB0byBzZWxlY3QgdmFsdWUgbWFwcGluZ3MgKi8KLXN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgewotCXU4IHN0cmVuZ3RoOwkvKiBQYWQgRHJpdmUgU3RyZW5ndGggaW4gbUEgKi8KLQl1OCBzZWw7CQkvKiBDaGlwLXNwZWNpZmljIHNlbGVjdCB2YWx1ZSAqLwotfTsKLQotLyogU0RJTyBEcml2ZSBTdHJlbmd0aCB0byBzZWwgdmFsdWUgdGFibGUgZm9yIFBNVSBSZXYgMSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgc2Rpb2RfZHJpdmVfc3RyZW5ndGhfdGFiMVtdID0gewotCXsKLQk0LCAweDJ9LCB7Ci0JMiwgMHgzfSwgewotCTEsIDB4MH0sIHsKLQkwLCAweDB9Ci0JfTsKLQotLyogU0RJTyBEcml2ZSBTdHJlbmd0aCB0byBzZWwgdmFsdWUgdGFibGUgZm9yIFBNVSBSZXYgMiwgMyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgc2Rpb2RfZHJpdmVfc3RyZW5ndGhfdGFiMltdID0gewotCXsKLQkxMiwgMHg3fSwgewotCTEwLCAweDZ9LCB7Ci0JOCwgMHg1fSwgewotCTYsIDB4NH0sIHsKLQk0LCAweDJ9LCB7Ci0JMiwgMHgxfSwgewotCTAsIDB4MH0KLQl9OwotCi0vKiBTRElPIERyaXZlIFN0cmVuZ3RoIHRvIHNlbCB2YWx1ZSB0YWJsZSBmb3IgUE1VIFJldiA4ICgxLjhWKSAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgc2Rpb2RfZHJpdmVfc3RyZW5ndGhfdGFiM1tdID0gewotCXsKLQkzMiwgMHg3fSwgewotCTI2LCAweDZ9LCB7Ci0JMjIsIDB4NX0sIHsKLQkxNiwgMHg0fSwgewotCTEyLCAweDN9LCB7Ci0JOCwgMHgyfSwgewotCTQsIDB4MX0sIHsKLQkwLCAweDB9Ci0JfTsKLQotI2RlZmluZSBTRElPRF9EUlZTVFJfS0VZKGNoaXAsIHBtdSkgICAgICgoKGNoaXApIDw8IDE2KSB8IChwbXUpKQotCi1zdGF0aWMgY2hhciAqYnJjbWZfY2hpcG5hbWUodWludCBjaGlwaWQsIGNoYXIgKmJ1ZiwgdWludCBsZW4pCi17Ci0JY29uc3QgY2hhciAqZm10OwotCi0JZm10ID0gKChjaGlwaWQgPiAweGEwMDApIHx8IChjaGlwaWQgPCAweDQwMDApKSA/ICIlZCIgOiAiJXgiOwotCXNucHJpbnRmKGJ1ZiwgbGVuLCBmbXQsIGNoaXBpZCk7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3NkaW9kX2RyaXZlX3N0cmVuZ3RoX2luaXQoc3RydWN0IGJyY21mX2J1cyAqYnVzLAotCQkJCQkJICAgdTMyIGRyaXZlc3RyZW5ndGgpIHsKLQlzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyICpzdHJfdGFiID0gTlVMTDsKLQl1MzIgc3RyX21hc2sgPSAwOwotCXUzMiBzdHJfc2hpZnQgPSAwOwotCWNoYXIgY2huWzhdOwotCi0JaWYgKCEoYnVzLT5jaS0+Y2NjYXBzICYgQ0NfQ0FQX1BNVSkpCi0JCXJldHVybjsKLQotCXN3aXRjaCAoU0RJT0RfRFJWU1RSX0tFWShidXMtPmNpLT5jaGlwLCBidXMtPmNpLT5wbXVyZXYpKSB7Ci0JY2FzZSBTRElPRF9EUlZTVFJfS0VZKEJDTTQzMjVfQ0hJUF9JRCwgMSk6Ci0JCXN0cl90YWIgPSAoc3RydWN0IHNkaW9kX2RyaXZlX3N0ciAqKSZzZGlvZF9kcml2ZV9zdHJlbmd0aF90YWIxOwotCQlzdHJfbWFzayA9IDB4MzAwMDAwMDA7Ci0JCXN0cl9zaGlmdCA9IDI4OwotCQlicmVhazsKLQljYXNlIFNESU9EX0RSVlNUUl9LRVkoQkNNNDMyNV9DSElQX0lELCAyKToKLQljYXNlIFNESU9EX0RSVlNUUl9LRVkoQkNNNDMyNV9DSElQX0lELCAzKToKLQkJc3RyX3RhYiA9IChzdHJ1Y3Qgc2Rpb2RfZHJpdmVfc3RyICopJnNkaW9kX2RyaXZlX3N0cmVuZ3RoX3RhYjI7Ci0JCXN0cl9tYXNrID0gMHgwMDAwMzgwMDsKLQkJc3RyX3NoaWZ0ID0gMTE7Ci0JCWJyZWFrOwotCWNhc2UgU0RJT0RfRFJWU1RSX0tFWShCQ000MzM2X0NISVBfSUQsIDgpOgotCQlzdHJfdGFiID0gKHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgKikmc2Rpb2RfZHJpdmVfc3RyZW5ndGhfdGFiMzsKLQkJc3RyX21hc2sgPSAweDAwMDAzODAwOwotCQlzdHJfc2hpZnQgPSAxMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJjbWZfZGJnKEVSUk9SLCAiTm8gU0RJTyBEcml2ZSBzdHJlbmd0aCBpbml0IGRvbmUgZm9yIGNoaXAgJXMgcmV2ICVkIHBtdXJldiAlZFxuIiwKLQkJCSAgYnJjbWZfY2hpcG5hbWUoYnVzLT5jaS0+Y2hpcCwgY2huLCA4KSwKLQkJCSAgYnVzLT5jaS0+Y2hpcHJldiwgYnVzLT5jaS0+cG11cmV2KTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKHN0cl90YWIgIT0gTlVMTCkgewotCQl1MzIgZHJpdmVzdHJlbmd0aF9zZWwgPSAwOwotCQl1MzIgY2NfZGF0YV90ZW1wOwotCQlpbnQgaTsKLQotCQlmb3IgKGkgPSAwOyBzdHJfdGFiW2ldLnN0cmVuZ3RoICE9IDA7IGkrKykgewotCQkJaWYgKGRyaXZlc3RyZW5ndGggPj0gc3RyX3RhYltpXS5zdHJlbmd0aCkgewotCQkJCWRyaXZlc3RyZW5ndGhfc2VsID0gc3RyX3RhYltpXS5zZWw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKGJ1cy0+c2Rpb2RldiwKLQkJCUNPUkVfQ0NfUkVHKGJ1cy0+Y2ktPmNjY29yZWJhc2UsIGNoaXBjb250cm9sX2FkZHIpLAotCQkJNCwgMSk7Ci0JCWNjX2RhdGFfdGVtcCA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChidXMtPnNkaW9kZXYsCi0JCQlDT1JFX0NDX1JFRyhidXMtPmNpLT5jY2NvcmViYXNlLCBjaGlwY29udHJvbF9hZGRyKSwgNCk7Ci0JCWNjX2RhdGFfdGVtcCAmPSB+c3RyX21hc2s7Ci0JCWRyaXZlc3RyZW5ndGhfc2VsIDw8PSBzdHJfc2hpZnQ7Ci0JCWNjX2RhdGFfdGVtcCB8PSBkcml2ZXN0cmVuZ3RoX3NlbDsKLQkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShidXMtPnNkaW9kZXYsCi0JCQlDT1JFX0NDX1JFRyhidXMtPmNpLT5jY2NvcmViYXNlLCBjaGlwY29udHJvbF9hZGRyKSwKLQkJCTQsIGNjX2RhdGFfdGVtcCk7Ci0KLQkJYnJjbWZfZGJnKElORk8sICJTRElPOiAlZG1BIGRyaXZlIHN0cmVuZ3RoIHNlbGVjdGVkLCBzZXQgdG8gMHglMDh4XG4iLAotCQkJICBkcml2ZXN0cmVuZ3RoLCBjY19kYXRhX3RlbXApOwotCX0KLX0KLQotc3RhdGljIGludAotYnJjbWZfc2RicmNtX2NoaXBfcmVjb2duaXRpb24oc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAotCQkJICAgICAgc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUzMiByZWdzKQotewotCXUzMiByZWdkYXRhOwotCi0JLyoKLQkgKiBHZXQgQ0MgY29yZSByZXYKLQkgKiBDaGlwaWQgaXMgYXNzdW1lIHRvIGJlIGF0IG9mZnNldCAwIGZyb20gcmVncyBhcmcKLQkgKiBGb3IgZGlmZmVyZW50IGNoaXB0eXBlcyBvciBvbGQgc2RpbyBob3N0cyB3L28gY2hpcGNvbW1vbiwKLQkgKiBvdGhlciB3YXlzIG9mIHJlY29nbml0aW9uIHNob3VsZCBiZSBhZGRlZCBoZXJlLgotCSAqLwotCWNpLT5jY2NvcmViYXNlID0gcmVnczsKLQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQkJQ09SRV9DQ19SRUcoY2ktPmNjY29yZWJhc2UsIGNoaXBpZCksIDQpOwotCWNpLT5jaGlwID0gcmVnZGF0YSAmIENJRF9JRF9NQVNLOwotCWNpLT5jaGlwcmV2ID0gKHJlZ2RhdGEgJiBDSURfUkVWX01BU0spID4+IENJRF9SRVZfU0hJRlQ7Ci0KLQlicmNtZl9kYmcoSU5GTywgImNoaXBpZD0weCV4IGNoaXByZXY9JWRcbiIsIGNpLT5jaGlwLCBjaS0+Y2hpcHJldik7Ci0KLQkvKiBBZGRyZXNzIG9mIGNvcmVzIGZvciBuZXcgY2hpcHMgc2hvdWxkIGJlIGFkZGVkIGhlcmUgKi8KLQlzd2l0Y2ggKGNpLT5jaGlwKSB7Ci0JY2FzZSBCQ000MzI5X0NISVBfSUQ6Ci0JCWNpLT5idXNjb3JlYmFzZSA9IEJDTTQzMjlfQ09SRV9CVVNfQkFTRTsKLQkJY2ktPnJhbWNvcmViYXNlID0gQkNNNDMyOV9DT1JFX1NPQ1JBTV9CQVNFOwotCQljaS0+YXJtY29yZWJhc2UJPSBCQ000MzI5X0NPUkVfQVJNX0JBU0U7Ci0JCWNpLT5yYW1zaXplID0gQkNNNDMyOV9SQU1TSVpFOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmNtZl9kYmcoRVJST1IsICJjaGlwaWQgMHgleCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBjaS0+Y2hpcCk7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKLQkJQ09SRV9TQihjaS0+Y2Njb3JlYmFzZSwgc2JpZGhpZ2gpLCA0KTsKLQljaS0+Y2NyZXYgPSBTQkNPUkVSRVYocmVnZGF0YSk7Ci0KLQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCUNPUkVfQ0NfUkVHKGNpLT5jY2NvcmViYXNlLCBwbXVjYXBhYmlsaXRpZXMpLCA0KTsKLQljaS0+cG11cmV2ID0gcmVnZGF0YSAmIFBDQVBfUkVWX01BU0s7Ci0KLQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCQkJCUNPUkVfU0IoY2ktPmJ1c2NvcmViYXNlLCBzYmlkaGlnaCksIDQpOwotCWNpLT5idXNjb3JlcmV2ID0gU0JDT1JFUkVWKHJlZ2RhdGEpOwotCWNpLT5idXNjb3JldHlwZSA9IChyZWdkYXRhICYgU0JJREhfQ0NfTUFTSykgPj4gU0JJREhfQ0NfU0hJRlQ7Ci0KLQlicmNtZl9kYmcoSU5GTywgImNjcmV2PSVkLCBwbXVyZXY9JWQsIGJ1c2NvcmUgcmV2L3R5cGU9JWQvMHgleFxuIiwKLQkJICBjaS0+Y2NyZXYsIGNpLT5wbXVyZXYsIGNpLT5idXNjb3JlcmV2LCBjaS0+YnVzY29yZXR5cGUpOwotCi0JLyogZ2V0IGNoaXBjb21tb24gY2FwYWJpbGl0ZXMgKi8KLQljaS0+Y2NjYXBzID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCi0JCUNPUkVfQ0NfUkVHKGNpLT5jY2NvcmViYXNlLCBjYXBhYmlsaXRpZXMpLCA0KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50Ci1icmNtZl9zZGJyY21fY2hpcF9hdHRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1MzIgcmVncykKLXsKLQlzdHJ1Y3QgY2hpcF9pbmZvICpjaTsKLQlpbnQgZXJyOwotCXU4IGNsa3ZhbCwgY2xrc2V0OwotCi0JYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwotCi0JLyogYWxsb2MgY2hpcF9pbmZvX3QgKi8KLQljaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBjaGlwX2luZm8pLCBHRlBfQVRPTUlDKTsKLQlpZiAoTlVMTCA9PSBjaSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQkvKiBidXMvY29yZS9jbGsgc2V0dXAgZm9yIHJlZ2lzdGVyIGFjY2VzcyAqLwotCS8qIFRyeSBmb3JjaW5nIFNESU8gY29yZSB0byBkbyBBTFBBdmFpbCByZXF1ZXN0IG9ubHkgKi8KLQljbGtzZXQgPSBTQlNESU9fRk9SQ0VfSFdfQ0xLUkVRX09GRiB8IFNCU0RJT19BTFBfQVZBSUxfUkVROwotCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKLQkJCSAgICAgICBTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwJY2xrc2V0LCAmZXJyKTsKLQlpZiAoZXJyKSB7Ci0JCWJyY21mX2RiZyhFUlJPUiwgImVycm9yIHdyaXRpbmcgZm9yIEhUIG9mZlxuIik7Ci0JCWdvdG8gZmFpbDsKLQl9Ci0KLQkvKiBJZiByZWdpc3RlciBzdXBwb3J0ZWQsIHdhaXQgZm9yIEFMUEF2YWlsIGFuZCB0aGVuIGZvcmNlIEFMUCAqLwotCS8qIFRoaXMgbWF5IHRha2UgdXAgdG8gMTUgbWlsbGlzZWNvbmRzICovCi0JY2xrdmFsID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCi0JCQlTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwgTlVMTCk7Ci0JaWYgKChjbGt2YWwgJiB+U0JTRElPX0FWQklUUykgPT0gY2xrc2V0KSB7Ci0JCVNQSU5XQUlUKCgoY2xrdmFsID0KLQkJCQlicmNtZl9zZGNhcmRfY2ZnX3JlYWQoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKLQkJCQkJCVNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLAotCQkJCQkJTlVMTCkpLAotCQkJCSFTQlNESU9fQUxQQVYoY2xrdmFsKSksCi0JCQkJUE1VX01BWF9UUkFOU0lUSU9OX0RMWSk7Ci0JCWlmICghU0JTRElPX0FMUEFWKGNsa3ZhbCkpIHsKLQkJCWJyY21mX2RiZyhFUlJPUiwgInRpbWVvdXQgb24gQUxQQVYgd2FpdCwgY2xrdmFsIDB4JTAyeFxuIiwKLQkJCQkgIGNsa3ZhbCk7Ci0JCQllcnIgPSAtRUJVU1k7Ci0JCQlnb3RvIGZhaWw7Ci0JCX0KLQkJY2xrc2V0ID0gU0JTRElPX0ZPUkNFX0hXX0NMS1JFUV9PRkYgfAotCQkJCVNCU0RJT19GT1JDRV9BTFA7Ci0JCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMSwKLQkJCQlTQlNESU9fRlVOQzFfQ0hJUENMS0NTUiwKLQkJCQljbGtzZXQsICZlcnIpOwotCQl1ZGVsYXkoNjUpOwotCX0gZWxzZSB7Ci0JCWJyY21mX2RiZyhFUlJPUiwgIkNoaXBDbGtDU1IgYWNjZXNzOiB3cm90ZSAweCUwMnggcmVhZCAweCUwMnhcbiIsCi0JCQkgIGNsa3NldCwgY2xrdmFsKTsKLQkJZXJyID0gLUVBQ0NFUzsKLQkJZ290byBmYWlsOwotCX0KLQotCS8qIEFsc28sIGRpc2FibGUgdGhlIGV4dHJhIFNESU8gcHVsbC11cHMgKi8KLQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCi0JCQkgICAgICAgU0JTRElPX0ZVTkMxX1NESU9QVUxMVVAsIDAsIE5VTEwpOwotCi0JZXJyID0gYnJjbWZfc2RicmNtX2NoaXBfcmVjb2duaXRpb24oYnVzLT5zZGlvZGV2LCBjaSwgcmVncyk7Ci0JaWYgKGVycikKLQkJZ290byBmYWlsOwotCi0JLyoKLQkgKiBNYWtlIHN1cmUgYW55IG9uLWNoaXAgQVJNIGlzIG9mZiAoaW4gY2FzZSBzdHJhcHBpbmcgaXMgd3JvbmcpLAotCSAqIG9yIGRvd25sb2FkZWQgY29kZSB3YXMgYWxyZWFkeSBydW5uaW5nLgotCSAqLwotCWJyY21mX3NkYnJjbV9jaGlwX2Rpc2FibGVjb3JlKGJ1cy0+c2Rpb2RldiwgY2ktPmFybWNvcmViYXNlKTsKLQotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoYnVzLT5zZGlvZGV2LAotCQlDT1JFX0NDX1JFRyhjaS0+Y2Njb3JlYmFzZSwgZ3Bpb3B1bGx1cCksIDQsIDApOwotCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoYnVzLT5zZGlvZGV2LAotCQlDT1JFX0NDX1JFRyhjaS0+Y2Njb3JlYmFzZSwgZ3Bpb3B1bGxkb3duKSwgNCwgMCk7Ci0KLQkvKiBEaXNhYmxlIEYyIHRvIGNsZWFyIGFueSBpbnRlcm1lZGlhdGUgZnJhbWUgc3RhdGUgb24gdGhlIGRvbmdsZSAqLwotCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoYnVzLT5zZGlvZGV2LCBTRElPX0ZVTkNfMCwgU0RJT19DQ0NSX0lPRXgsCi0JCVNESU9fRlVOQ19FTkFCTEVfMSwgTlVMTCk7Ci0KLQkvKiBXQVI6IGNtZDUyIGJhY2twbGFuZSByZWFkIHNvIGNvcmUgSFcgd2lsbCBkcm9wIEFMUFJlcSAqLwotCWNsa3ZhbCA9IGJyY21mX3NkY2FyZF9jZmdfcmVhZChidXMtPnNkaW9kZXYsIFNESU9fRlVOQ18xLAotCQkJMCwgTlVMTCk7Ci0KLQkvKiBEb25lIHdpdGggYmFja3BsYW5lLWRlcGVuZGVudCBhY2Nlc3NlcywgY2FuIGRyb3AgY2xvY2suLi4gKi8KLQlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzEsCi0JCQkgICAgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsIDAsIE5VTEwpOwotCi0JYnVzLT5jaSA9IGNpOwotCXJldHVybiAwOwotZmFpbDoKLQlidXMtPmNpID0gTlVMTDsKLQlrZnJlZShjaSk7Ci0JcmV0dXJuIGVycjsKLX0KLQogc3RhdGljIGJvb2wKLWJyY21mX3NkYnJjbV9wcm9iZV9hdHRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzLCB1MzIgcmVnc3ZhKQorYnJjbWZfc2RicmNtX3Byb2JlX2F0dGFjaChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzLCB1MzIgcmVnc3ZhKQogewogCXU4IGNsa2N0bCA9IDA7CiAJaW50IGVyciA9IDA7CiAJaW50IHJlZ19hZGRyOwogCXUzMiByZWdfdmFsOworCXU4IGlkeDsKIAogCWJ1cy0+YWxwX29ubHkgPSB0cnVlOwogCkBAIC00MjM0LDcgKzM3MjYsNyBAQAogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCiAJLyoKLQkgKiBGb3JjZSBQTEwgb2ZmIHVudGlsIGJyY21mX3NkYnJjbV9jaGlwX2F0dGFjaCgpCisJICogRm9yY2UgUExMIG9mZiB1bnRpbCBicmNtZl9zZGlvX2NoaXBfYXR0YWNoKCkKIAkgKiBwcm9ncmFtcyBQTEwgY29udHJvbCByZWdzCiAJICovCiAKQEAgLTQyNTIsOCArMzc0NCw4IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlpZiAoYnJjbWZfc2RicmNtX2NoaXBfYXR0YWNoKGJ1cywgcmVnc3ZhKSkgewotCQlicmNtZl9kYmcoRVJST1IsICJicmNtZl9zZGJyY21fY2hpcF9hdHRhY2ggZmFpbGVkIVxuIik7CisJaWYgKGJyY21mX3NkaW9fY2hpcF9hdHRhY2goYnVzLT5zZGlvZGV2LCAmYnVzLT5jaSwgcmVnc3ZhKSkgeworCQlicmNtZl9kYmcoRVJST1IsICJicmNtZl9zZGlvX2NoaXBfYXR0YWNoIGZhaWxlZCFcbiIpOwogCQlnb3RvIGZhaWw7CiAJfQogCkBAIC00MjYyLDExICszNzU0LDEwIEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlicmNtZl9zZGJyY21fc2Rpb2RfZHJpdmVfc3RyZW5ndGhfaW5pdChidXMsIFNESU9fRFJJVkVfU1RSRU5HVEgpOworCWJyY21mX3NkaW9fY2hpcF9kcml2ZXN0cmVuZ3RoaW5pdChidXMtPnNkaW9kZXYsIGJ1cy0+Y2ksCisJCQkJCSAgU0RJT19EUklWRV9TVFJFTkdUSCk7CiAKLQkvKiBHZXQgaW5mbyBvbiB0aGUgQVJNIGFuZCBTT0NSQU0gY29yZXMuLi4gKi8KLQlicmNtZl9zZGNhcmRfcmVnX3JlYWQoYnVzLT5zZGlvZGV2LAotCQkgIENPUkVfU0IoYnVzLT5jaS0+YXJtY29yZWJhc2UsIHNiaWRoaWdoKSwgNCk7CisJLyogR2V0IGluZm8gb24gdGhlIFNPQ1JBTSBjb3Jlcy4uLiAqLwogCWJ1cy0+cmFtc2l6ZSA9IGJ1cy0+Y2ktPnJhbXNpemU7CiAJaWYgKCEoYnVzLT5yYW1zaXplKSkgewogCQlicmNtZl9kYmcoRVJST1IsICJmYWlsZWQgdG8gZmluZCBTT0NSQU0gbWVtb3J5IVxuIik7CkBAIC00Mjc0LDcgKzM3NjUsOCBAQAogCX0KIAogCS8qIFNldCBjb3JlIGNvbnRyb2wgc28gYW4gU0RJTyByZXNldCBkb2VzIGEgYmFja3BsYW5lIHJlc2V0ICovCi0JcmVnX2FkZHIgPSBidXMtPmNpLT5idXNjb3JlYmFzZSArCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChidXMtPmNpLCBCQ01BX0NPUkVfU0RJT19ERVYpOworCXJlZ19hZGRyID0gYnVzLT5jaS0+Y19pbmZbaWR4XS5iYXNlICsKIAkJICAgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCBjb3JlY29udHJvbCk7CiAJcmVnX3ZhbCA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChidXMtPnNkaW9kZXYsIHJlZ19hZGRyLCBzaXplb2YodTMyKSk7CiAJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShidXMtPnNkaW9kZXYsIHJlZ19hZGRyLCBzaXplb2YodTMyKSwKQEAgLTQyOTgsNyArMzc5MCw3IEBACiAJcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBicmNtZl9zZGJyY21fcHJvYmVfaW5pdChzdHJ1Y3QgYnJjbWZfYnVzICpidXMpCitzdGF0aWMgYm9vbCBicmNtZl9zZGJyY21fcHJvYmVfaW5pdChzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzKQogewogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtNDMwNiw3ICszNzk4LDcgQEAKIAlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKGJ1cy0+c2Rpb2RldiwgU0RJT19GVU5DXzAsIFNESU9fQ0NDUl9JT0V4LAogCQkJICAgICAgIFNESU9fRlVOQ19FTkFCTEVfMSwgTlVMTCk7CiAKLQlidXMtPmRydnItPmJ1c3N0YXRlID0gQlJDTUZfQlVTX0RPV047CisJYnVzLT5zZGlvZGV2LT5idXNfaWYtPnN0YXRlID0gQlJDTUZfQlVTX0RPV047CiAJYnVzLT5zbGVlcGluZyA9IGZhbHNlOwogCWJ1cy0+cnhmbG93ID0gZmFsc2U7CiAKQEAgLTQzMzMsNyArMzgyNSw3IEBACiBzdGF0aWMgaW50CiBicmNtZl9zZGJyY21fd2F0Y2hkb2dfdGhyZWFkKHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzID0gKHN0cnVjdCBicmNtZl9idXMgKilkYXRhOworCXN0cnVjdCBicmNtZl9zZGlvICpidXMgPSAoc3RydWN0IGJyY21mX3NkaW8gKilkYXRhOwogCiAJYWxsb3dfc2lnbmFsKFNJR1RFUk0pOwogCS8qIFJ1biB1bnRpbCBzaWduYWwgcmVjZWl2ZWQgKi8KQEAgLTQzNDEsOSArMzgzMyw5IEBACiAJCWlmIChrdGhyZWFkX3Nob3VsZF9zdG9wKCkpCiAJCQlicmVhazsKIAkJaWYgKCF3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoJmJ1cy0+d2F0Y2hkb2dfd2FpdCkpIHsKLQkJCWJyY21mX3NkYnJjbV9idXNfd2F0Y2hkb2coYnVzLT5kcnZyKTsKKwkJCWJyY21mX3NkYnJjbV9idXNfd2F0Y2hkb2coYnVzKTsKIAkJCS8qIENvdW50IHRoZSB0aWNrIGZvciByZWZlcmVuY2UgKi8KLQkJCWJ1cy0+ZHJ2ci0+dGlja2NudCsrOworCQkJYnVzLT50aWNrY250Kys7CiAJCX0gZWxzZQogCQkJYnJlYWs7CiAJfQpAQCAtNDM1Myw3ICszODQ1LDcgQEAKIHN0YXRpYyB2b2lkCiBicmNtZl9zZGJyY21fd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCBicmNtZl9idXMgKmJ1cyA9IChzdHJ1Y3QgYnJjbWZfYnVzICopZGF0YTsKKwlzdHJ1Y3QgYnJjbWZfc2RpbyAqYnVzID0gKHN0cnVjdCBicmNtZl9zZGlvICopZGF0YTsKIAogCWlmIChidXMtPndhdGNoZG9nX3RzaykgewogCQljb21wbGV0ZSgmYnVzLT53YXRjaGRvZ193YWl0KTsKQEAgLTQzNjQsMjMgKzM4NTYsMTQgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkCi1icmNtZl9zZGJyY21fY2hpcF9kZXRhY2goc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKLQotCWtmcmVlKGJ1cy0+Y2kpOwotCWJ1cy0+Y2kgPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBicmNtZl9zZGJyY21fcmVsZWFzZV9kb25nbGUoc3RydWN0IGJyY21mX2J1cyAqYnVzKQorc3RhdGljIHZvaWQgYnJjbWZfc2RicmNtX3JlbGVhc2VfZG9uZ2xlKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCiAJaWYgKGJ1cy0+Y2kpIHsKIAkJYnJjbWZfc2RicmNtX2Nsa2N0bChidXMsIENMS19BVkFJTCwgZmFsc2UpOwogCQlicmNtZl9zZGJyY21fY2xrY3RsKGJ1cywgQ0xLX05PTkUsIGZhbHNlKTsKLQkJYnJjbWZfc2RicmNtX2NoaXBfZGV0YWNoKGJ1cyk7CisJCWJyY21mX3NkaW9fY2hpcF9kZXRhY2goJmJ1cy0+Y2kpOwogCQlpZiAoYnVzLT52YXJzICYmIGJ1cy0+dmFyc3opCiAJCQlrZnJlZShidXMtPnZhcnMpOwogCQlidXMtPnZhcnMgPSBOVUxMOwpAQCAtNDM5MCw3ICszODczLDcgQEAKIH0KIAogLyogRGV0YWNoIGFuZCBmcmVlIGV2ZXJ5dGhpbmcgKi8KLXN0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yZWxlYXNlKHN0cnVjdCBicmNtZl9idXMgKmJ1cykKK3N0YXRpYyB2b2lkIGJyY21mX3NkYnJjbV9yZWxlYXNlKHN0cnVjdCBicmNtZl9zZGlvICpidXMpCiB7CiAJYnJjbWZfZGJnKFRSQUNFLCAiRW50ZXJcbiIpOwogCkBAIC00Mzk4LDEwICszODgxLDkgQEAKIAkJLyogRGUtcmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAkJYnJjbWZfc2RjYXJkX2ludHJfZGVyZWcoYnVzLT5zZGlvZGV2KTsKIAotCQlpZiAoYnVzLT5kcnZyKSB7Ci0JCQlicmNtZl9kZXRhY2goYnVzLT5kcnZyKTsKKwkJaWYgKGJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5kcnZyKSB7CisJCQlicmNtZl9kZXRhY2goYnVzLT5zZGlvZGV2LT5kZXYpOwogCQkJYnJjbWZfc2RicmNtX3JlbGVhc2VfZG9uZ2xlKGJ1cyk7Ci0JCQlidXMtPmRydnIgPSBOVUxMOwogCQl9CiAKIAkJYnJjbWZfc2RicmNtX3JlbGVhc2VfbWFsbG9jKGJ1cyk7CkBAIC00NDEyLDIxICszODk0LDEwIEBACiAJYnJjbWZfZGJnKFRSQUNFLCAiRGlzY29ubmVjdGVkXG4iKTsKIH0KIAotdm9pZCAqYnJjbWZfc2RicmNtX3Byb2JlKHUxNiBidXNfbm8sIHUxNiBzbG90LCB1MTYgZnVuYywgdWludCBidXN0eXBlLAotCQkJIHUzMiByZWdzdmEsIHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldikKK3ZvaWQgKmJyY21mX3NkYnJjbV9wcm9iZSh1MzIgcmVnc3ZhLCBzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3QgYnJjbWZfYnVzICpidXM7Ci0KLQkvKiBJbml0IGdsb2JhbCB2YXJpYWJsZXMgYXQgcnVuLXRpbWUsIG5vdCBhcyBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbi4KLQkgKiBUaGlzIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgaW5pdC9kZS1pbml0IG9mIHRoZSBkcml2ZXIuCi0JICogSW5pdGlhbGl6YXRpb24KLQkgKiBvZiBnbG9iYWxzIGFzIHBhcnQgb2YgdGhlIGRlY2xhcmF0aW9uIHJlc3VsdHMgaW4gbm9uLWRldGVybWluaXN0aWMKLQkgKiBiZWhhdmlvciBzaW5jZSB0aGUgdmFsdWUgb2YgdGhlIGdsb2JhbHMgbWF5IGJlIGRpZmZlcmVudCBvbiB0aGUKLQkgKiBmaXJzdCB0aW1lIHRoYXQgdGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCB2cyBzdWJzZXF1ZW50Ci0JICogaW5pdGlhbGl6YXRpb25zLgotCSAqLwotCWJyY21mX2NfaW5pdCgpOworCXN0cnVjdCBicmNtZl9zZGlvICpidXM7CiAKIAlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CiAKQEAgLTQ0MzQsMTIgKzM5MDUsMTMgQEAKIAkgKiByZWdzdmEgPT0gU0lfRU5VTV9CQVNFKi8KIAogCS8qIEFsbG9jYXRlIHByaXZhdGUgYnVzIGludGVyZmFjZSBzdGF0ZSAqLwotCWJ1cyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtZl9idXMpLCBHRlBfQVRPTUlDKTsKKwlidXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbWZfc2RpbyksIEdGUF9BVE9NSUMpOwogCWlmICghYnVzKQogCQlnb3RvIGZhaWw7CiAKIAlidXMtPnNkaW9kZXYgPSBzZGlvZGV2OwogCXNkaW9kZXYtPmJ1cyA9IGJ1czsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZidXMtPmdsb20pOwogCWJ1cy0+dHhib3VuZCA9IEJSQ01GX1RYQk9VTkQ7CiAJYnVzLT5yeGJvdW5kID0gQlJDTUZfUlhCT1VORDsKIAlidXMtPnR4bWlubWF4ID0gQlJDTUZfVFhNSU5NQVg7CkBAIC00NDg0LDkgKzM5NTYsMTUgQEAKIAkJYnVzLT5kcGNfdHNrID0gTlVMTDsKIAl9CiAKKwkvKiBBc3NpZ24gYnVzIGludGVyZmFjZSBjYWxsIGJhY2sgKi8KKwlidXMtPnNkaW9kZXYtPmJ1c19pZi0+YnJjbWZfYnVzX3N0b3AgPSBicmNtZl9zZGJyY21fYnVzX3N0b3A7CisJYnVzLT5zZGlvZGV2LT5idXNfaWYtPmJyY21mX2J1c19pbml0ID0gYnJjbWZfc2RicmNtX2J1c19pbml0OworCWJ1cy0+c2Rpb2Rldi0+YnVzX2lmLT5icmNtZl9idXNfdHhkYXRhID0gYnJjbWZfc2RicmNtX2J1c190eGRhdGE7CisJYnVzLT5zZGlvZGV2LT5idXNfaWYtPmJyY21mX2J1c190eGN0bCA9IGJyY21mX3NkYnJjbV9idXNfdHhjdGw7CisJYnVzLT5zZGlvZGV2LT5idXNfaWYtPmJyY21mX2J1c19yeGN0bCA9IGJyY21mX3NkYnJjbV9idXNfcnhjdGw7CiAJLyogQXR0YWNoIHRvIHRoZSBicmNtZi9PUy9uZXR3b3JrIGludGVyZmFjZSAqLwotCWJ1cy0+ZHJ2ciA9IGJyY21mX2F0dGFjaChidXMsIFNEUENNX1JFU0VSVkUpOwotCWlmICghYnVzLT5kcnZyKSB7CisJcmV0ID0gYnJjbWZfYXR0YWNoKFNEUENNX1JFU0VSVkUsIGJ1cy0+c2Rpb2Rldi0+ZGV2KTsKKwlpZiAocmV0ICE9IDApIHsKIAkJYnJjbWZfZGJnKEVSUk9SLCAiYnJjbWZfYXR0YWNoIGZhaWxlZFxuIik7CiAJCWdvdG8gZmFpbDsKIAl9CkBAIC00NTE0LDE2ICszOTkyLDE3IEBACiAJYnJjbWZfZGJnKElORk8sICJjb21wbGV0ZWQhIVxuIik7CiAKIAkvKiBpZiBmaXJtd2FyZSBwYXRoIHByZXNlbnQgdHJ5IHRvIGRvd25sb2FkIGFuZCBicmluZyB1cCBidXMgKi8KLQlyZXQgPSBicmNtZl9idXNfc3RhcnQoYnVzLT5kcnZyKTsKKwlyZXQgPSBicmNtZl9idXNfc3RhcnQoYnVzLT5zZGlvZGV2LT5kZXYpOwogCWlmIChyZXQgIT0gMCkgewogCQlpZiAocmV0ID09IC1FTk9MSU5LKSB7CiAJCQlicmNtZl9kYmcoRVJST1IsICJkb25nbGUgaXMgbm90IHJlc3BvbmRpbmdcbiIpOwogCQkJZ290byBmYWlsOwogCQl9CiAJfQotCS8qIE9rLCBoYXZlIHRoZSBwZXItcG9ydCB0ZWxsIHRoZSBzdGFjayB3ZSdyZSBvcGVuIGZvciBidXNpbmVzcyAqLwotCWlmIChicmNtZl9uZXRfYXR0YWNoKGJ1cy0+ZHJ2ciwgMCkgIT0gMCkgewotCQlicmNtZl9kYmcoRVJST1IsICJOZXQgYXR0YWNoIGZhaWxlZCEhXG4iKTsKKworCS8qIGFkZCBpbnRlcmZhY2UgYW5kIG9wZW4gZm9yIGJ1c2luZXNzICovCisJaWYgKGJyY21mX2FkZF9pZihidXMtPnNkaW9kZXYtPmRldiwgMCwgIndsYW4lZCIsIE5VTEwpKSB7CisJCWJyY21mX2RiZyhFUlJPUiwgIkFkZCBwcmltYXJ5IG5ldCBkZXZpY2UgaW50ZXJmYWNlIGZhaWxlZCEhXG4iKTsKIAkJZ290byBmYWlsOwogCX0KIApAQCAtNDUzNiw3ICs0MDE1LDcgQEAKIAogdm9pZCBicmNtZl9zZGJyY21fZGlzY29ubmVjdCh2b2lkICpwdHIpCiB7Ci0Jc3RydWN0IGJyY21mX2J1cyAqYnVzID0gKHN0cnVjdCBicmNtZl9idXMgKilwdHI7CisJc3RydWN0IGJyY21mX3NkaW8gKmJ1cyA9IChzdHJ1Y3QgYnJjbWZfc2RpbyAqKXB0cjsKIAogCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKIApAQCAtNDU0NiwxOCArNDAyNSw5IEBACiAJYnJjbWZfZGJnKFRSQUNFLCAiRGlzY29ubmVjdGVkXG4iKTsKIH0KIAotc3RydWN0IGRldmljZSAqYnJjbWZfYnVzX2dldF9kZXZpY2Uoc3RydWN0IGJyY21mX2J1cyAqYnVzKQotewotCXJldHVybiAmYnVzLT5zZGlvZGV2LT5mdW5jWzJdLT5kZXY7Ci19Ci0KIHZvaWQKLWJyY21mX3NkYnJjbV93ZF90aW1lcihzdHJ1Y3QgYnJjbWZfYnVzICpidXMsIHVpbnQgd2R0aWNrKQorYnJjbWZfc2RicmNtX3dkX3RpbWVyKHN0cnVjdCBicmNtZl9zZGlvICpidXMsIHVpbnQgd2R0aWNrKQogewotCS8qIGRvbid0IHN0YXJ0IHRoZSB3ZCB1bnRpbCBmdyBpcyBsb2FkZWQgKi8KLQlpZiAoYnVzLT5kcnZyLT5idXNzdGF0ZSA9PSBCUkNNRl9CVVNfRE9XTikKLQkJcmV0dXJuOwotCiAJLyogVG90YWxseSBzdG9wIHRoZSB0aW1lciAqLwogCWlmICghd2R0aWNrICYmIGJ1cy0+d2RfdGltZXJfdmFsaWQgPT0gdHJ1ZSkgewogCQlkZWxfdGltZXJfc3luYygmYnVzLT50aW1lcik7CkBAIC00NTY2LDYgKzQwMzYsMTAgQEAKIAkJcmV0dXJuOwogCX0KIAorCS8qIGRvbid0IHN0YXJ0IHRoZSB3ZCB1bnRpbCBmdyBpcyBsb2FkZWQgKi8KKwlpZiAoYnVzLT5zZGlvZGV2LT5idXNfaWYtPnN0YXRlID09IEJSQ01GX0JVU19ET1dOKQorCQlyZXR1cm47CisKIAlpZiAod2R0aWNrKSB7CiAJCWlmIChidXMtPnNhdmVfbXMgIT0gQlJDTUZfV0RfUE9MTF9NUykgewogCQkJaWYgKGJ1cy0+d2RfdGltZXJfdmFsaWQgPT0gdHJ1ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvX2NoaXAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvX2NoaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWIyZDdjCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9fY2hpcC5jCkBAIC0wLDAgKzEsNjA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEJyb2FkY29tIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04KKyAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KKyAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KKy8qICoqKioqIFNESU8gaW50ZXJmYWNlIGNoaXAgYmFja3BsYW5lIGhhbmRsZSBmdW5jdGlvbnMgKioqKiogKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zc2Ivc3NiX3JlZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KKworI2luY2x1ZGUgPGNoaXBjb21tb24uaD4KKyNpbmNsdWRlIDxicmNtX2h3X2lkcy5oPgorI2luY2x1ZGUgPGJyY211X3dpZmkuaD4KKyNpbmNsdWRlIDxicmNtdV91dGlscy5oPgorI2luY2x1ZGUgPHNvYy5oPgorI2luY2x1ZGUgImRoZF9kYmcuaCIKKyNpbmNsdWRlICJzZGlvX2hvc3QuaCIKKyNpbmNsdWRlICJzZGlvX2NoaXAuaCIKKworLyogY2hpcCBjb3JlIGJhc2UgJiByYW1zaXplICovCisvKiBiY200MzI5ICovCisvKiBTRElPIGRldmljZSBjb3JlLCBJRCAweDgyOSAqLworI2RlZmluZSBCQ000MzI5X0NPUkVfQlVTX0JBU0UJCTB4MTgwMTEwMDAKKy8qIGludGVybmFsIG1lbW9yeSBjb3JlLCBJRCAweDgwZSAqLworI2RlZmluZSBCQ000MzI5X0NPUkVfU09DUkFNX0JBU0UJMHgxODAwMzAwMAorLyogQVJNIENvcnRleCBNMyBjb3JlLCBJRCAweDgyYSAqLworI2RlZmluZSBCQ000MzI5X0NPUkVfQVJNX0JBU0UJCTB4MTgwMDIwMDAKKyNkZWZpbmUgQkNNNDMyOV9SQU1TSVpFCQkJMHg0ODAwMAorCisjZGVmaW5lCVNCQ09SRVJFVihzYmlkaCkgXAorCSgoKChzYmlkaCkgJiBTU0JfSURISUdIX1JDSEkpID4+IFNTQl9JREhJR0hfUkNISV9TSElGVCkgfCBcCisJICAoKHNiaWRoKSAmIFNTQl9JREhJR0hfUkNMTykpCisKKy8qIFNPQyBJbnRlcmNvbm5lY3QgdHlwZXMgKGFrYSBjaGlwIHR5cGVzKSAqLworI2RlZmluZSBTT0NJX1NCCQkwCisjZGVmaW5lIFNPQ0lfQUkJCTEKKworLyogRVJPTSBDb21wSWRlbnRCICovCisjZGVmaW5lIENJQl9SRVZfTUFTSwkJMHhmZjAwMDAwMAorI2RlZmluZSBDSUJfUkVWX1NISUZUCQkyNAorCisjZGVmaW5lIFNESU9EX0RSVlNUUl9LRVkoY2hpcCwgcG11KSAgICAgKCgoY2hpcCkgPDwgMTYpIHwgKHBtdSkpCisvKiBTRElPIFBhZCBkcml2ZSBzdHJlbmd0aCB0byBzZWxlY3QgdmFsdWUgbWFwcGluZ3MgKi8KK3N0cnVjdCBzZGlvZF9kcml2ZV9zdHIgeworCXU4IHN0cmVuZ3RoOwkvKiBQYWQgRHJpdmUgU3RyZW5ndGggaW4gbUEgKi8KKwl1OCBzZWw7CQkvKiBDaGlwLXNwZWNpZmljIHNlbGVjdCB2YWx1ZSAqLworfTsKKy8qIFNESU8gRHJpdmUgU3RyZW5ndGggdG8gc2VsIHZhbHVlIHRhYmxlIGZvciBQTVUgUmV2IDExICgxLjhWKSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBzZGlvZF9kcml2ZV9zdHIgc2Rpb2RfZHJ2c3RyX3RhYjFfMXY4W10gPSB7CisJezMyLCAweDZ9LAorCXsyNiwgMHg3fSwKKwl7MjIsIDB4NH0sCisJezE2LCAweDV9LAorCXsxMiwgMHgyfSwKKwl7OCwgMHgzfSwKKwl7NCwgMHgwfSwKKwl7MCwgMHgxfQorfTsKKwordTgKK2JyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCit7CisJdTggaWR4OworCisJZm9yIChpZHggPSAwOyBpZHggPCBCUkNNRl9NQVhfQ09SRU5VTTsgaWR4KyspCisJCWlmIChjb3JlaWQgPT0gY2ktPmNfaW5mW2lkeF0uaWQpCisJCQlyZXR1cm4gaWR4OworCisJcmV0dXJuIEJSQ01GX01BWF9DT1JFTlVNOworfQorCitzdGF0aWMgdTMyCiticmNtZl9zZGlvX3NiX2NvcmVyZXYoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkgICAgICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTE2IGNvcmVpZCkKK3sKKwl1MzIgcmVnZGF0YTsKKwl1OCBpZHg7CisKKwlpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGNpLCBjb3JlaWQpOworCisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmlkaGlnaCksIDQpOworCXJldHVybiBTQkNPUkVSRVYocmVnZGF0YSk7Cit9CisKK3N0YXRpYyB1MzIKK2JyY21mX3NkaW9fYWlfY29yZXJldihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCSAgICAgIHN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKQoreworCXU4IGlkeDsKKworCWlkeCA9IGJyY21mX3NkaW9fY2hpcF9nZXRpbmZpZHgoY2ksIGNvcmVpZCk7CisKKwlyZXR1cm4gKGNpLT5jX2luZltpZHhdLmNpYiAmIENJQl9SRVZfTUFTSykgPj4gQ0lCX1JFVl9TSElGVDsKK30KKworc3RhdGljIGJvb2wKK2JyY21mX3NkaW9fc2JfaXNjb3JldXAoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkgICAgICAgc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCit7CisJdTMyIHJlZ2RhdGE7CisJdTggaWR4OworCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgY29yZWlkKTsKKworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CisJcmVnZGF0YSAmPSAoU1NCX1RNU0xPV19SRVNFVCB8IFNTQl9UTVNMT1dfUkVKRUNUIHwKKwkJICAgIFNTQl9JTVNUQVRFX1JFSkVDVCB8IFNTQl9UTVNMT1dfQ0xPQ0spOworCXJldHVybiAoU1NCX1RNU0xPV19DTE9DSyA9PSByZWdkYXRhKTsKK30KKworc3RhdGljIGJvb2wKK2JyY21mX3NkaW9fYWlfaXNjb3JldXAoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkgICAgICAgc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCit7CisJdTMyIHJlZ2RhdGE7CisJdTggaWR4OworCWJvb2wgcmV0OworCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgY29yZWlkKTsKKworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQkJY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9JT0NUTCwgNCk7CisJcmV0ID0gKHJlZ2RhdGEgJiAoQkNNQV9JT0NUTF9GR0MgfCBCQ01BX0lPQ1RMX0NMSykpID09IEJDTUFfSU9DVExfQ0xLOworCisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCQljaS0+Y19pbmZbaWR4XS53cmFwYmFzZStCQ01BX1JFU0VUX0NUTCwKKwkJCQkJNCk7CisJcmV0ID0gcmV0ICYmICgocmVnZGF0YSAmIEJDTUFfUkVTRVRfQ1RMX1JFU0VUKSA9PSAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCiticmNtZl9zZGlvX3NiX2NvcmVkaXNhYmxlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJCSAgc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCit7CisJdTMyIHJlZ2RhdGE7CisJdTggaWR4OworCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgY29yZWlkKTsKKworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKKwlpZiAocmVnZGF0YSAmIFNTQl9UTVNMT1dfUkVTRVQpCisJCXJldHVybjsKKworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0KTsKKwlpZiAoKHJlZ2RhdGEgJiBTU0JfVE1TTE9XX0NMT0NLKSAhPSAwKSB7CisJCS8qCisJCSAqIHNldCB0YXJnZXQgcmVqZWN0IGFuZCBzcGluIHVudGlsIGJ1c3kgaXMgY2xlYXIKKwkJICogKHByZXNlcnZlIGNvcmUtc3BlY2lmaWMgYml0cykKKwkJICovCisJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CisJCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksCisJCQkJNCwgcmVnZGF0YSB8IFNTQl9UTVNMT1dfUkVKRUNUKTsKKworCQlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQpOworCQl1ZGVsYXkoMSk7CisJCVNQSU5XQUlUKChicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlaGlnaCksIDQpICYKKwkJCVNTQl9UTVNISUdIX0JVU1kpLCAxMDAwMDApOworCisJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlaGlnaCksIDQpOworCQlpZiAocmVnZGF0YSAmIFNTQl9UTVNISUdIX0JVU1kpCisJCQlicmNtZl9kYmcoRVJST1IsICJjb3JlIHN0YXRlIHN0aWxsIGJ1c3lcbiIpOworCisJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpZGxvdyksIDQpOworCQlpZiAocmVnZGF0YSAmIFNTQl9JRExPV19JTklUSUFUT1IpIHsKKwkJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNiaW1zdGF0ZSksIDQpIHwKKwkJCQlTU0JfSU1TVEFURV9SRUpFQ1Q7CisJCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmltc3RhdGUpLCA0LAorCQkJCXJlZ2RhdGEpOworCQkJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpbXN0YXRlKSwgNCk7CisJCQl1ZGVsYXkoMSk7CisJCQlTUElOV0FJVCgoYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYmltc3RhdGUpLCA0KSAmCisJCQkJU1NCX0lNU1RBVEVfQlVTWSksIDEwMDAwMCk7CisJCX0KKworCQkvKiBzZXQgcmVzZXQgYW5kIHJlamVjdCB3aGlsZSBlbmFibGluZyB0aGUgY2xvY2tzICovCisJCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKKwkJCShTU0JfVE1TTE9XX0ZHQyB8IFNTQl9UTVNMT1dfQ0xPQ0sgfAorCQkJU1NCX1RNU0xPV19SRUpFQ1QgfCBTU0JfVE1TTE9XX1JFU0VUKSk7CisJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CisJCXVkZWxheSgxMCk7CisKKwkJLyogY2xlYXIgdGhlIGluaXRpYXRvciByZWplY3QgYml0ICovCisJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpZGxvdyksIDQpOworCQlpZiAocmVnZGF0YSAmIFNTQl9JRExPV19JTklUSUFUT1IpIHsKKwkJCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNiaW1zdGF0ZSksIDQpICYKKwkJCQl+U1NCX0lNU1RBVEVfUkVKRUNUOworCQkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpbXN0YXRlKSwgNCwKKwkJCQlyZWdkYXRhKTsKKwkJfQorCX0KKworCS8qIGxlYXZlIHJlc2V0IGFuZCByZWplY3QgYXNzZXJ0ZWQgKi8KKwlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCisJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCwKKwkJKFNTQl9UTVNMT1dfUkVKRUNUIHwgU1NCX1RNU0xPV19SRVNFVCkpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIHZvaWQKK2JyY21mX3NkaW9fYWlfY29yZWRpc2FibGUoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTE2IGNvcmVpZCkKK3sKKwl1OCBpZHg7CisJdTMyIHJlZ2RhdGE7CisKKwlpZHggPSBicmNtZl9zZGlvX2NoaXBfZ2V0aW5maWR4KGNpLCBjb3JlaWQpOworCisJLyogaWYgY29yZSBpcyBhbHJlYWR5IGluIHJlc2V0LCBqdXN0IHJldHVybiAqLworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQkJY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9SRVNFVF9DVEwsCisJCQkJCTQpOworCWlmICgocmVnZGF0YSAmIEJDTUFfUkVTRVRfQ1RMX1JFU0VUKSAhPSAwKQorCQlyZXR1cm47CisKKwlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsIGNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfSU9DVEwsCisJCQkgICAgICAgNCwgMCk7CisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCQljaS0+Y19pbmZbaWR4XS53cmFwYmFzZStCQ01BX0lPQ1RMLCA0KTsKKwl1ZGVsYXkoMTApOworCisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LCBjaS0+Y19pbmZbaWR4XS53cmFwYmFzZStCQ01BX1JFU0VUX0NUTCwKKwkJCSAgICAgICA0LCBCQ01BX1JFU0VUX0NUTF9SRVNFVCk7CisJdWRlbGF5KDEpOworfQorCitzdGF0aWMgdm9pZAorYnJjbWZfc2Rpb19zYl9yZXNldGNvcmUoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCit7CisJdTMyIHJlZ2RhdGE7CisJdTggaWR4OworCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgY29yZWlkKTsKKworCS8qCisJICogTXVzdCBkbyB0aGUgZGlzYWJsZSBzZXF1ZW5jZSBmaXJzdCB0byB3b3JrIGZvcgorCSAqIGFyYml0cmFyeSBjdXJyZW50IGNvcmUgc3RhdGUuCisJICovCisJYnJjbWZfc2Rpb19zYl9jb3JlZGlzYWJsZShzZGlvZGV2LCBjaSwgY29yZWlkKTsKKworCS8qCisJICogTm93IGRvIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4KKwkgKiBzZXQgcmVzZXQgd2hpbGUgZW5hYmxpbmcgdGhlIGNsb2NrIGFuZAorCSAqIGZvcmNpbmcgdGhlbSBvbiB0aHJvdWdob3V0IHRoZSBjb3JlCisJICovCisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQkJQ09SRV9TQihjaS0+Y19pbmZbaWR4XS5iYXNlLCBzYnRtc3RhdGVsb3cpLCA0LAorCQkJU1NCX1RNU0xPV19GR0MgfCBTU0JfVE1TTE9XX0NMT0NLIHwgU1NCX1RNU0xPV19SRVNFVCk7CisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CisJdWRlbGF5KDEpOworCisJLyogY2xlYXIgYW55IHNlcnJvciAqLworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWhpZ2gpLCA0KTsKKwlpZiAocmVnZGF0YSAmIFNTQl9UTVNISUdIX1NFUlIpCisJCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlaGlnaCksIDQsIDApOworCisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2JpbXN0YXRlKSwgNCk7CisJaWYgKHJlZ2RhdGEgJiAoU1NCX0lNU1RBVEVfSUJFIHwgU1NCX0lNU1RBVEVfVE8pKQorCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCisJCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNiaW1zdGF0ZSksIDQsCisJCQlyZWdkYXRhICYgfihTU0JfSU1TVEFURV9JQkUgfCBTU0JfSU1TVEFURV9UTykpOworCisJLyogY2xlYXIgcmVzZXQgYW5kIGFsbG93IGl0IHRvIHByb3BhZ2F0ZSB0aHJvdWdob3V0IHRoZSBjb3JlICovCisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQlDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksIDQsCisJCVNTQl9UTVNMT1dfRkdDIHwgU1NCX1RNU0xPV19DTE9DSyk7CisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CisJdWRlbGF5KDEpOworCisJLyogbGVhdmUgY2xvY2sgZW5hYmxlZCAqLworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJCSAgICAgICBDT1JFX1NCKGNpLT5jX2luZltpZHhdLmJhc2UsIHNidG1zdGF0ZWxvdyksCisJCQkgICAgICAgNCwgU1NCX1RNU0xPV19DTE9DSyk7CisJcmVnZGF0YSA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJCUNPUkVfU0IoY2ktPmNfaW5mW2lkeF0uYmFzZSwgc2J0bXN0YXRlbG93KSwgNCk7CisJdWRlbGF5KDEpOworfQorCitzdGF0aWMgdm9pZAorYnJjbWZfc2Rpb19haV9yZXNldGNvcmUoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJc3RydWN0IGNoaXBfaW5mbyAqY2ksIHUxNiBjb3JlaWQpCit7CisJdTggaWR4OworCXUzMiByZWdkYXRhOworCisJaWR4ID0gYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChjaSwgY29yZWlkKTsKKworCS8qIG11c3QgZGlzYWJsZSBmaXJzdCB0byB3b3JrIGZvciBhcmJpdHJhcnkgY3VycmVudCBjb3JlIHN0YXRlICovCisJYnJjbWZfc2Rpb19haV9jb3JlZGlzYWJsZShzZGlvZGV2LCBjaSwgY29yZWlkKTsKKworCS8qIG5vdyBkbyBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZSAqLworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9JT0NUTCwKKwkJCSAgICAgICA0LCBCQ01BX0lPQ1RMX0ZHQyB8IEJDTUFfSU9DVExfQ0xLKTsKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJCWNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfSU9DVEwsIDQpOworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwgY2ktPmNfaW5mW2lkeF0ud3JhcGJhc2UrQkNNQV9SRVNFVF9DVEwsCisJCQkgICAgICAgNCwgMCk7CisJdWRlbGF5KDEpOworCisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LCBjaS0+Y19pbmZbaWR4XS53cmFwYmFzZStCQ01BX0lPQ1RMLAorCQkJICAgICAgIDQsIEJDTUFfSU9DVExfQ0xLKTsKKwlyZWdkYXRhID0gYnJjbWZfc2RjYXJkX3JlZ19yZWFkKHNkaW9kZXYsCisJCQkJCWNpLT5jX2luZltpZHhdLndyYXBiYXNlK0JDTUFfSU9DVEwsIDQpOworCXVkZWxheSgxKTsKK30KKworc3RhdGljIGludCBicmNtZl9zZGlvX2NoaXBfcmVjb2duaXRpb24oc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJCSAgICAgICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTMyIHJlZ3MpCit7CisJdTMyIHJlZ2RhdGE7CisKKwkvKgorCSAqIEdldCBDQyBjb3JlIHJldgorCSAqIENoaXBpZCBpcyBhc3N1bWUgdG8gYmUgYXQgb2Zmc2V0IDAgZnJvbSByZWdzIGFyZworCSAqIEZvciBkaWZmZXJlbnQgY2hpcHR5cGVzIG9yIG9sZCBzZGlvIGhvc3RzIHcvbyBjaGlwY29tbW9uLAorCSAqIG90aGVyIHdheXMgb2YgcmVjb2duaXRpb24gc2hvdWxkIGJlIGFkZGVkIGhlcmUuCisJICovCisJY2ktPmNfaW5mWzBdLmlkID0gQkNNQV9DT1JFX0NISVBDT01NT047CisJY2ktPmNfaW5mWzBdLmJhc2UgPSByZWdzOworCXJlZ2RhdGEgPSBicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJCUNPUkVfQ0NfUkVHKGNpLT5jX2luZlswXS5iYXNlLCBjaGlwaWQpLCA0KTsKKwljaS0+Y2hpcCA9IHJlZ2RhdGEgJiBDSURfSURfTUFTSzsKKwljaS0+Y2hpcHJldiA9IChyZWdkYXRhICYgQ0lEX1JFVl9NQVNLKSA+PiBDSURfUkVWX1NISUZUOworCWNpLT5zb2NpdHlwZSA9IChyZWdkYXRhICYgQ0lEX1RZUEVfTUFTSykgPj4gQ0lEX1RZUEVfU0hJRlQ7CisKKwlicmNtZl9kYmcoSU5GTywgImNoaXBpZD0weCV4IGNoaXByZXY9JWRcbiIsIGNpLT5jaGlwLCBjaS0+Y2hpcHJldik7CisKKwkvKiBBZGRyZXNzIG9mIGNvcmVzIGZvciBuZXcgY2hpcHMgc2hvdWxkIGJlIGFkZGVkIGhlcmUgKi8KKwlzd2l0Y2ggKGNpLT5jaGlwKSB7CisJY2FzZSBCQ000MzI5X0NISVBfSUQ6CisJCWNpLT5jX2luZlsxXS5pZCA9IEJDTUFfQ09SRV9TRElPX0RFVjsKKwkJY2ktPmNfaW5mWzFdLmJhc2UgPSBCQ000MzI5X0NPUkVfQlVTX0JBU0U7CisJCWNpLT5jX2luZlsyXS5pZCA9IEJDTUFfQ09SRV9JTlRFUk5BTF9NRU07CisJCWNpLT5jX2luZlsyXS5iYXNlID0gQkNNNDMyOV9DT1JFX1NPQ1JBTV9CQVNFOworCQljaS0+Y19pbmZbM10uaWQgPSBCQ01BX0NPUkVfQVJNX0NNMzsKKwkJY2ktPmNfaW5mWzNdLmJhc2UgPSBCQ000MzI5X0NPUkVfQVJNX0JBU0U7CisJCWNpLT5yYW1zaXplID0gQkNNNDMyOV9SQU1TSVpFOworCQlicmVhazsKKwljYXNlIEJDTTQzMzBfQ0hJUF9JRDoKKwkJY2ktPmNfaW5mWzBdLndyYXBiYXNlID0gMHgxODEwMDAwMDsKKwkJY2ktPmNfaW5mWzBdLmNpYiA9IDB4MjcwMDQyMTE7CisJCWNpLT5jX2luZlsxXS5pZCA9IEJDTUFfQ09SRV9TRElPX0RFVjsKKwkJY2ktPmNfaW5mWzFdLmJhc2UgPSAweDE4MDAyMDAwOworCQljaS0+Y19pbmZbMV0ud3JhcGJhc2UgPSAweDE4MTAyMDAwOworCQljaS0+Y19pbmZbMV0uY2liID0gMHgwNzAwNDIxMTsKKwkJY2ktPmNfaW5mWzJdLmlkID0gQkNNQV9DT1JFX0lOVEVSTkFMX01FTTsKKwkJY2ktPmNfaW5mWzJdLmJhc2UgPSAweDE4MDA0MDAwOworCQljaS0+Y19pbmZbMl0ud3JhcGJhc2UgPSAweDE4MTA0MDAwOworCQljaS0+Y19pbmZbMl0uY2liID0gMHgwZDA4MDQwMTsKKwkJY2ktPmNfaW5mWzNdLmlkID0gQkNNQV9DT1JFX0FSTV9DTTM7CisJCWNpLT5jX2luZlszXS5iYXNlID0gMHgxODAwMzAwMDsKKwkJY2ktPmNfaW5mWzNdLndyYXBiYXNlID0gMHgxODEwMzAwMDsKKwkJY2ktPmNfaW5mWzNdLmNpYiA9IDB4MDMwMDQyMTE7CisJCWNpLT5yYW1zaXplID0gMHg0ODAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJjbWZfZGJnKEVSUk9SLCAiY2hpcGlkIDB4JXggaXMgbm90IHN1cHBvcnRlZFxuIiwgY2ktPmNoaXApOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlzd2l0Y2ggKGNpLT5zb2NpdHlwZSkgeworCWNhc2UgU09DSV9TQjoKKwkJY2ktPmlzY29yZXVwID0gYnJjbWZfc2Rpb19zYl9pc2NvcmV1cDsKKwkJY2ktPmNvcmVyZXYgPSBicmNtZl9zZGlvX3NiX2NvcmVyZXY7CisJCWNpLT5jb3JlZGlzYWJsZSA9IGJyY21mX3NkaW9fc2JfY29yZWRpc2FibGU7CisJCWNpLT5yZXNldGNvcmUgPSBicmNtZl9zZGlvX3NiX3Jlc2V0Y29yZTsKKwkJYnJlYWs7CisJY2FzZSBTT0NJX0FJOgorCQljaS0+aXNjb3JldXAgPSBicmNtZl9zZGlvX2FpX2lzY29yZXVwOworCQljaS0+Y29yZXJldiA9IGJyY21mX3NkaW9fYWlfY29yZXJldjsKKwkJY2ktPmNvcmVkaXNhYmxlID0gYnJjbWZfc2Rpb19haV9jb3JlZGlzYWJsZTsKKwkJY2ktPnJlc2V0Y29yZSA9IGJyY21mX3NkaW9fYWlfcmVzZXRjb3JlOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmNtZl9kYmcoRVJST1IsICJzb2NpdHlwZSAldSBub3Qgc3VwcG9ydGVkXG4iLCBjaS0+c29jaXR5cGUpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYnJjbWZfc2Rpb19jaGlwX2J1c2NvcmVwcmVwKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldikKK3sKKwlpbnQgZXJyID0gMDsKKwl1OCBjbGt2YWwsIGNsa3NldDsKKworCS8qIFRyeSBmb3JjaW5nIFNESU8gY29yZSB0byBkbyBBTFBBdmFpbCByZXF1ZXN0IG9ubHkgKi8KKwljbGtzZXQgPSBTQlNESU9fRk9SQ0VfSFdfQ0xLUkVRX09GRiB8IFNCU0RJT19BTFBfQVZBSUxfUkVROworCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoc2Rpb2RldiwgU0RJT19GVU5DXzEsCisJCQkgICAgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsCWNsa3NldCwgJmVycik7CisJaWYgKGVycikgeworCQlicmNtZl9kYmcoRVJST1IsICJlcnJvciB3cml0aW5nIGZvciBIVCBvZmZcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCS8qIElmIHJlZ2lzdGVyIHN1cHBvcnRlZCwgd2FpdCBmb3IgQUxQQXZhaWwgYW5kIHRoZW4gZm9yY2UgQUxQICovCisJLyogVGhpcyBtYXkgdGFrZSB1cCB0byAxNSBtaWxsaXNlY29uZHMgKi8KKwljbGt2YWwgPSBicmNtZl9zZGNhcmRfY2ZnX3JlYWQoc2Rpb2RldiwgU0RJT19GVU5DXzEsCisJCQkJICAgICAgIFNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCBOVUxMKTsKKworCWlmICgoY2xrdmFsICYgflNCU0RJT19BVkJJVFMpICE9IGNsa3NldCkgeworCQlicmNtZl9kYmcoRVJST1IsICJDaGlwQ2xrQ1NSIGFjY2Vzczogd3JvdGUgMHglMDJ4IHJlYWQgMHglMDJ4XG4iLAorCQkJICBjbGtzZXQsIGNsa3ZhbCk7CisJCXJldHVybiAtRUFDQ0VTOworCX0KKworCVNQSU5XQUlUKCgoY2xrdmFsID0gYnJjbWZfc2RjYXJkX2NmZ19yZWFkKHNkaW9kZXYsIFNESU9fRlVOQ18xLAorCQkJCVNCU0RJT19GVU5DMV9DSElQQ0xLQ1NSLCBOVUxMKSksCisJCQkhU0JTRElPX0FMUEFWKGNsa3ZhbCkpLAorCQkJUE1VX01BWF9UUkFOU0lUSU9OX0RMWSk7CisJaWYgKCFTQlNESU9fQUxQQVYoY2xrdmFsKSkgeworCQlicmNtZl9kYmcoRVJST1IsICJ0aW1lb3V0IG9uIEFMUEFWIHdhaXQsIGNsa3ZhbCAweCUwMnhcbiIsCisJCQkgIGNsa3ZhbCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJY2xrc2V0ID0gU0JTRElPX0ZPUkNFX0hXX0NMS1JFUV9PRkYgfCBTQlNESU9fRk9SQ0VfQUxQOworCWJyY21mX3NkY2FyZF9jZmdfd3JpdGUoc2Rpb2RldiwgU0RJT19GVU5DXzEsCisJCQkgICAgICAgU0JTRElPX0ZVTkMxX0NISVBDTEtDU1IsIGNsa3NldCwgJmVycik7CisJdWRlbGF5KDY1KTsKKworCS8qIEFsc28sIGRpc2FibGUgdGhlIGV4dHJhIFNESU8gcHVsbC11cHMgKi8KKwlicmNtZl9zZGNhcmRfY2ZnX3dyaXRlKHNkaW9kZXYsIFNESU9fRlVOQ18xLAorCQkJICAgICAgIFNCU0RJT19GVU5DMV9TRElPUFVMTFVQLCAwLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYnJjbWZfc2Rpb19jaGlwX2J1c2NvcmVzZXR1cChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQkgICAgIHN0cnVjdCBjaGlwX2luZm8gKmNpKQoreworCS8qIGdldCBjaGlwY29tbW9uIHJldiAqLworCWNpLT5jX2luZlswXS5yZXYgPSBjaS0+Y29yZXJldihzZGlvZGV2LCBjaSwgY2ktPmNfaW5mWzBdLmlkKTsKKworCS8qIGdldCBjaGlwY29tbW9uIGNhcGFiaWxpdGVzICovCisJY2ktPmNfaW5mWzBdLmNhcHMgPQorCQlicmNtZl9zZGNhcmRfcmVnX3JlYWQoc2Rpb2RldiwKKwkJQ09SRV9DQ19SRUcoY2ktPmNfaW5mWzBdLmJhc2UsIGNhcGFiaWxpdGllcyksIDQpOworCisJLyogZ2V0IHBtdSBjYXBzICYgcmV2ICovCisJaWYgKGNpLT5jX2luZlswXS5jYXBzICYgQ0NfQ0FQX1BNVSkgeworCQljaS0+cG11Y2FwcyA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJQ09SRV9DQ19SRUcoY2ktPmNfaW5mWzBdLmJhc2UsIHBtdWNhcGFiaWxpdGllcyksIDQpOworCQljaS0+cG11cmV2ID0gY2ktPnBtdWNhcHMgJiBQQ0FQX1JFVl9NQVNLOworCX0KKworCWNpLT5jX2luZlsxXS5yZXYgPSBjaS0+Y29yZXJldihzZGlvZGV2LCBjaSwgY2ktPmNfaW5mWzFdLmlkKTsKKworCWJyY21mX2RiZyhJTkZPLCAiY2NyZXY9JWQsIHBtdXJldj0lZCwgYnVzY29yZSByZXYvdHlwZT0lZC8weCV4XG4iLAorCQkgIGNpLT5jX2luZlswXS5yZXYsIGNpLT5wbXVyZXYsCisJCSAgY2ktPmNfaW5mWzFdLnJldiwgY2ktPmNfaW5mWzFdLmlkKTsKKworCS8qCisJICogTWFrZSBzdXJlIGFueSBvbi1jaGlwIEFSTSBpcyBvZmYgKGluIGNhc2Ugc3RyYXBwaW5nIGlzIHdyb25nKSwKKwkgKiBvciBkb3dubG9hZGVkIGNvZGUgd2FzIGFscmVhZHkgcnVubmluZy4KKwkgKi8KKwljaS0+Y29yZWRpc2FibGUoc2Rpb2RldiwgY2ksIEJDTUFfQ09SRV9BUk1fQ00zKTsKK30KKworaW50IGJyY21mX3NkaW9fY2hpcF9hdHRhY2goc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJICAgc3RydWN0IGNoaXBfaW5mbyAqKmNpX3B0ciwgdTMyIHJlZ3MpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgY2hpcF9pbmZvICpjaTsKKworCWJyY21mX2RiZyhUUkFDRSwgIkVudGVyXG4iKTsKKworCS8qIGFsbG9jIGNoaXBfaW5mb190ICovCisJY2kgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2hpcF9pbmZvKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFjaSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXQgPSBicmNtZl9zZGlvX2NoaXBfYnVzY29yZXByZXAoc2Rpb2Rldik7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGVycjsKKworCXJldCA9IGJyY21mX3NkaW9fY2hpcF9yZWNvZ25pdGlvbihzZGlvZGV2LCBjaSwgcmVncyk7CisJaWYgKHJldCAhPSAwKQorCQlnb3RvIGVycjsKKworCWJyY21mX3NkaW9fY2hpcF9idXNjb3Jlc2V0dXAoc2Rpb2RldiwgY2kpOworCisJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQlDT1JFX0NDX1JFRyhjaS0+Y19pbmZbMF0uYmFzZSwgZ3Bpb3B1bGx1cCksIDQsIDApOworCWJyY21mX3NkY2FyZF9yZWdfd3JpdGUoc2Rpb2RldiwKKwkJQ09SRV9DQ19SRUcoY2ktPmNfaW5mWzBdLmJhc2UsIGdwaW9wdWxsZG93biksIDQsIDApOworCisJKmNpX3B0ciA9IGNpOworCXJldHVybiAwOworCitlcnI6CisJa2ZyZWUoY2kpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2JyY21mX3NkaW9fY2hpcF9kZXRhY2goc3RydWN0IGNoaXBfaW5mbyAqKmNpX3B0cikKK3sKKwlicmNtZl9kYmcoVFJBQ0UsICJFbnRlclxuIik7CisKKwlrZnJlZSgqY2lfcHRyKTsKKwkqY2lfcHRyID0gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKmJyY21mX3NkaW9fY2hpcF9uYW1lKHVpbnQgY2hpcGlkLCBjaGFyICpidWYsIHVpbnQgbGVuKQoreworCWNvbnN0IGNoYXIgKmZtdDsKKworCWZtdCA9ICgoY2hpcGlkID4gMHhhMDAwKSB8fCAoY2hpcGlkIDwgMHg0MDAwKSkgPyAiJWQiIDogIiV4IjsKKwlzbnByaW50ZihidWYsIGxlbiwgZm10LCBjaGlwaWQpOworCXJldHVybiBidWY7Cit9CisKK3ZvaWQKK2JyY21mX3NkaW9fY2hpcF9kcml2ZXN0cmVuZ3RoaW5pdChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQkJICBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTMyIGRyaXZlc3RyZW5ndGgpCit7CisJc3RydWN0IHNkaW9kX2RyaXZlX3N0ciAqc3RyX3RhYiA9IE5VTEw7CisJdTMyIHN0cl9tYXNrID0gMDsKKwl1MzIgc3RyX3NoaWZ0ID0gMDsKKwljaGFyIGNobls4XTsKKworCWlmICghKGNpLT5jX2luZlswXS5jYXBzICYgQ0NfQ0FQX1BNVSkpCisJCXJldHVybjsKKworCXN3aXRjaCAoU0RJT0RfRFJWU1RSX0tFWShjaS0+Y2hpcCwgY2ktPnBtdXJldikpIHsKKwljYXNlIFNESU9EX0RSVlNUUl9LRVkoQkNNNDMzMF9DSElQX0lELCAxMik6CisJCXN0cl90YWIgPSAoc3RydWN0IHNkaW9kX2RyaXZlX3N0ciAqKSZzZGlvZF9kcnZzdHJfdGFiMV8xdjg7CisJCXN0cl9tYXNrID0gMHgwMDAwMzgwMDsKKwkJc3RyX3NoaWZ0ID0gMTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyY21mX2RiZyhFUlJPUiwgIk5vIFNESU8gRHJpdmUgc3RyZW5ndGggaW5pdCBkb25lIGZvciBjaGlwICVzIHJldiAlZCBwbXVyZXYgJWRcbiIsCisJCQkgIGJyY21mX3NkaW9fY2hpcF9uYW1lKGNpLT5jaGlwLCBjaG4sIDgpLAorCQkJICBjaS0+Y2hpcHJldiwgY2ktPnBtdXJldik7CisJCWJyZWFrOworCX0KKworCWlmIChzdHJfdGFiICE9IE5VTEwpIHsKKwkJdTMyIGRyaXZlc3RyZW5ndGhfc2VsID0gMDsKKwkJdTMyIGNjX2RhdGFfdGVtcDsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgc3RyX3RhYltpXS5zdHJlbmd0aCAhPSAwOyBpKyspIHsKKwkJCWlmIChkcml2ZXN0cmVuZ3RoID49IHN0cl90YWJbaV0uc3RyZW5ndGgpIHsKKwkJCQlkcml2ZXN0cmVuZ3RoX3NlbCA9IHN0cl90YWJbaV0uc2VsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJYnJjbWZfc2RjYXJkX3JlZ193cml0ZShzZGlvZGV2LAorCQkJQ09SRV9DQ19SRUcoY2ktPmNfaW5mWzBdLmJhc2UsIGNoaXBjb250cm9sX2FkZHIpLAorCQkJNCwgMSk7CisJCWNjX2RhdGFfdGVtcCA9IGJyY21mX3NkY2FyZF9yZWdfcmVhZChzZGlvZGV2LAorCQkJQ09SRV9DQ19SRUcoY2ktPmNfaW5mWzBdLmJhc2UsIGNoaXBjb250cm9sX2FkZHIpLCA0KTsKKwkJY2NfZGF0YV90ZW1wICY9IH5zdHJfbWFzazsKKwkJZHJpdmVzdHJlbmd0aF9zZWwgPDw9IHN0cl9zaGlmdDsKKwkJY2NfZGF0YV90ZW1wIHw9IGRyaXZlc3RyZW5ndGhfc2VsOworCQlicmNtZl9zZGNhcmRfcmVnX3dyaXRlKHNkaW9kZXYsCisJCQlDT1JFX0NDX1JFRyhjaS0+Y19pbmZbMF0uYmFzZSwgY2hpcGNvbnRyb2xfYWRkciksCisJCQk0LCBjY19kYXRhX3RlbXApOworCisJCWJyY21mX2RiZyhJTkZPLCAiU0RJTzogJWRtQSBkcml2ZSBzdHJlbmd0aCBzZWxlY3RlZCwgc2V0IHRvIDB4JTA4eFxuIiwKKwkJCSAgZHJpdmVzdHJlbmd0aCwgY2NfZGF0YV90ZW1wKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19jaGlwLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19jaGlwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U5NzRkNwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvX2NoaXAuaApAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBCcm9hZGNvbSBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorICogU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OCisgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0JSQ01GTUFDX1NESU9fQ0hJUF9IXworI2RlZmluZSBfQlJDTUZNQUNfU0RJT19DSElQX0hfCisKKy8qCisgKiBDb3JlIHJlZyBhZGRyZXNzIHRyYW5zbGF0aW9uLgorICogQm90aCBtYWNybydzIHJldHVybnMgYSAzMiBiaXRzIGJ5dGUgYWRkcmVzcyBvbiB0aGUgYmFja3BsYW5lIGJ1cy4KKyAqLworI2RlZmluZSBDT1JFX0NDX1JFRyhiYXNlLCBmaWVsZCkgXAorCQkoYmFzZSArIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGZpZWxkKSkKKyNkZWZpbmUgQ09SRV9CVVNfUkVHKGJhc2UsIGZpZWxkKSBcCisJCShiYXNlICsgb2Zmc2V0b2Yoc3RydWN0IHNkcGNtZF9yZWdzLCBmaWVsZCkpCisjZGVmaW5lIENPUkVfU0IoYmFzZSwgZmllbGQpIFwKKwkJKGJhc2UgKyBTQkNPTkZJR09GRiArIG9mZnNldG9mKHN0cnVjdCBzYmNvbmZpZywgZmllbGQpKQorCisvKiBTRElPIGZ1bmN0aW9uIDEgcmVnaXN0ZXIgQ0hJUENMS0NTUiAqLworLyogRm9yY2UgQUxQIHJlcXVlc3QgdG8gYmFja3BsYW5lICovCisjZGVmaW5lIFNCU0RJT19GT1JDRV9BTFAJCTB4MDEKKy8qIEZvcmNlIEhUIHJlcXVlc3QgdG8gYmFja3BsYW5lICovCisjZGVmaW5lIFNCU0RJT19GT1JDRV9IVAkJCTB4MDIKKy8qIEZvcmNlIElMUCByZXF1ZXN0IHRvIGJhY2twbGFuZSAqLworI2RlZmluZSBTQlNESU9fRk9SQ0VfSUxQCQkweDA0CisvKiBNYWtlIEFMUCByZWFkeSAocG93ZXIgdXAgeHRhbCkgKi8KKyNkZWZpbmUgU0JTRElPX0FMUF9BVkFJTF9SRVEJCTB4MDgKKy8qIE1ha2UgSFQgcmVhZHkgKHBvd2VyIHVwIFBMTCkgKi8KKyNkZWZpbmUgU0JTRElPX0hUX0FWQUlMX1JFUQkJMHgxMAorLyogU3F1ZWxjaCBjbG9jayByZXF1ZXN0cyBmcm9tIEhXICovCisjZGVmaW5lIFNCU0RJT19GT1JDRV9IV19DTEtSRVFfT0ZGCTB4MjAKKy8qIFN0YXR1czogQUxQIGlzIHJlYWR5ICovCisjZGVmaW5lIFNCU0RJT19BTFBfQVZBSUwJCTB4NDAKKy8qIFN0YXR1czogSFQgaXMgcmVhZHkgKi8KKyNkZWZpbmUgU0JTRElPX0hUX0FWQUlMCQkJMHg4MAorI2RlZmluZSBTQlNESU9fQVZCSVRTCQkoU0JTRElPX0hUX0FWQUlMIHwgU0JTRElPX0FMUF9BVkFJTCkKKyNkZWZpbmUgU0JTRElPX0FMUEFWKHJlZ3ZhbCkJKChyZWd2YWwpICYgU0JTRElPX0FWQklUUykKKyNkZWZpbmUgU0JTRElPX0hUQVYocmVndmFsKQkoKChyZWd2YWwpICYgU0JTRElPX0FWQklUUykgPT0gU0JTRElPX0FWQklUUykKKyNkZWZpbmUgU0JTRElPX0FMUE9OTFkocmVndmFsKQkoU0JTRElPX0FMUEFWKHJlZ3ZhbCkgJiYgIVNCU0RJT19IVEFWKHJlZ3ZhbCkpCisjZGVmaW5lIFNCU0RJT19DTEtBVihyZWd2YWwsIGFscG9ubHkpIFwKKwkoU0JTRElPX0FMUEFWKHJlZ3ZhbCkgJiYgKGFscG9ubHkgPyAxIDogU0JTRElPX0hUQVYocmVndmFsKSkpCisKKyNkZWZpbmUgQlJDTUZfTUFYX0NPUkVOVU0JNgorCitzdHJ1Y3QgY2hpcF9jb3JlX2luZm8geworCXUxNiBpZDsKKwl1MTYgcmV2OworCXUzMiBiYXNlOworCXUzMiB3cmFwYmFzZTsKKwl1MzIgY2FwczsKKwl1MzIgY2liOworfTsKKworc3RydWN0IGNoaXBfaW5mbyB7CisJdTMyIGNoaXA7CisJdTMyIGNoaXByZXY7CisJdTMyIHNvY2l0eXBlOworCS8qIGNvcmUgaW5mbyAqLworCS8qIGFsd2F5cyBwdXQgY2hpcGNvbW1vbiBjb3JlIGF0IDAsIGJ1cyBjb3JlIGF0IDEgKi8KKwlzdHJ1Y3QgY2hpcF9jb3JlX2luZm8gY19pbmZbQlJDTUZfTUFYX0NPUkVOVU1dOworCXUzMiBwbXVyZXY7CisJdTMyIHBtdWNhcHM7CisJdTMyIHJhbXNpemU7CisKKwlib29sICgqaXNjb3JldXApKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2Rldiwgc3RydWN0IGNoaXBfaW5mbyAqY2ksCisJCQkgdTE2IGNvcmVpZCk7CisJdTMyICgqY29yZXJldikoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCBzdHJ1Y3QgY2hpcF9pbmZvICpjaSwKKwkJCSB1MTYgY29yZWlkKTsKKwl2b2lkICgqY29yZWRpc2FibGUpKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKKwkJCXN0cnVjdCBjaGlwX2luZm8gKmNpLCB1MTYgY29yZWlkKTsKKwl2b2lkICgqcmVzZXRjb3JlKShzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQlzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTE2IGNvcmVpZCk7Cit9OworCitzdHJ1Y3Qgc2Jjb25maWcgeworCXUzMiBQQURbMl07CisJdTMyIHNiaXBzZmxhZzsJLyogaW5pdGlhdG9yIHBvcnQgb2NwIHNsYXZlIGZsYWcgKi8KKwl1MzIgUEFEWzNdOworCXUzMiBzYnRwc2ZsYWc7CS8qIHRhcmdldCBwb3J0IG9jcCBzbGF2ZSBmbGFnICovCisJdTMyIFBBRFsxMV07CisJdTMyIHNidG1lcnJsb2dhOwkvKiAoc29uaWNzID49IDIuMykgKi8KKwl1MzIgUEFEOworCXUzMiBzYnRtZXJybG9nOwkvKiAoc29uaWNzID49IDIuMykgKi8KKwl1MzIgUEFEWzNdOworCXUzMiBzYmFkbWF0Y2gzOwkvKiBhZGRyZXNzIG1hdGNoMyAqLworCXUzMiBQQUQ7CisJdTMyIHNiYWRtYXRjaDI7CS8qIGFkZHJlc3MgbWF0Y2gyICovCisJdTMyIFBBRDsKKwl1MzIgc2JhZG1hdGNoMTsJLyogYWRkcmVzcyBtYXRjaDEgKi8KKwl1MzIgUEFEWzddOworCXUzMiBzYmltc3RhdGU7CS8qIGluaXRpYXRvciBhZ2VudCBzdGF0ZSAqLworCXUzMiBzYmludHZlYzsJLyogaW50ZXJydXB0IG1hc2sgKi8KKwl1MzIgc2J0bXN0YXRlbG93OwkvKiB0YXJnZXQgc3RhdGUgKi8KKwl1MzIgc2J0bXN0YXRlaGlnaDsJLyogdGFyZ2V0IHN0YXRlICovCisJdTMyIHNiYndhMDsJCS8qIGJhbmR3aWR0aCBhbGxvY2F0aW9uIHRhYmxlMCAqLworCXUzMiBQQUQ7CisJdTMyIHNiaW1jb25maWdsb3c7CS8qIGluaXRpYXRvciBjb25maWd1cmF0aW9uICovCisJdTMyIHNiaW1jb25maWdoaWdoOwkvKiBpbml0aWF0b3IgY29uZmlndXJhdGlvbiAqLworCXUzMiBzYmFkbWF0Y2gwOwkvKiBhZGRyZXNzIG1hdGNoMCAqLworCXUzMiBQQUQ7CisJdTMyIHNidG1jb25maWdsb3c7CS8qIHRhcmdldCBjb25maWd1cmF0aW9uICovCisJdTMyIHNidG1jb25maWdoaWdoOwkvKiB0YXJnZXQgY29uZmlndXJhdGlvbiAqLworCXUzMiBzYmJjb25maWc7CS8qIGJyb2FkY2FzdCBjb25maWd1cmF0aW9uICovCisJdTMyIFBBRDsKKwl1MzIgc2Jic3RhdGU7CS8qIGJyb2FkY2FzdCBzdGF0ZSAqLworCXUzMiBQQURbM107CisJdTMyIHNiYWN0Y25mZzsJLyogYWN0aXZhdGUgY29uZmlndXJhdGlvbiAqLworCXUzMiBQQURbM107CisJdTMyIHNiZmxhZ3N0OwkvKiBjdXJyZW50IHNiZmxhZ3MgKi8KKwl1MzIgUEFEWzNdOworCXUzMiBzYmlkbG93OwkJLyogaWRlbnRpZmljYXRpb24gKi8KKwl1MzIgc2JpZGhpZ2g7CS8qIGlkZW50aWZpY2F0aW9uICovCit9OworCitleHRlcm4gaW50IGJyY21mX3NkaW9fY2hpcF9hdHRhY2goc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LAorCQkJCSAgc3RydWN0IGNoaXBfaW5mbyAqKmNpX3B0ciwgdTMyIHJlZ3MpOworZXh0ZXJuIHZvaWQgYnJjbWZfc2Rpb19jaGlwX2RldGFjaChzdHJ1Y3QgY2hpcF9pbmZvICoqY2lfcHRyKTsKK2V4dGVybiB2b2lkIGJyY21mX3NkaW9fY2hpcF9kcml2ZXN0cmVuZ3RoaW5pdChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCisJCQkJCSAgICAgIHN0cnVjdCBjaGlwX2luZm8gKmNpLAorCQkJCQkgICAgICB1MzIgZHJpdmVzdHJlbmd0aCk7CitleHRlcm4gdTggYnJjbWZfc2Rpb19jaGlwX2dldGluZmlkeChzdHJ1Y3QgY2hpcF9pbmZvICpjaSwgdTE2IGNvcmVpZCk7CisKKworI2VuZGlmCQkvKiBfQlJDTUZNQUNfU0RJT19DSElQX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19ob3N0LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvc2Rpb19ob3N0LmgKaW5kZXggNzI2ZmE4OS4uMDI4MWQyMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3NkaW9faG9zdC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtZm1hYy9zZGlvX2hvc3QuaApAQCAtMTE2LDEyICsxMTYsMjAgQEAKICNkZWZpbmUgU1VDQ0VTUwkwCiAjZGVmaW5lIEVSUk9SCTEKIAorLyogUGFja2V0IGFsaWdubWVudCBmb3IgbW9zdCBlZmZpY2llbnQgU0RJTyAoY2FuIGNoYW5nZSBiYXNlZCBvbiBwbGF0Zm9ybSkgKi8KKyNkZWZpbmUgQlJDTUZfU0RBTElHTgkoMSA8PCA2KQorCisvKiB3YXRjaGRvZyBwb2xsaW5nIGludGVydmFsIGluIG1zICovCisjZGVmaW5lIEJSQ01GX1dEX1BPTExfTVMJMTAKKwogc3RydWN0IGJyY21mX3NkcmVnIHsKIAlpbnQgZnVuYzsKIAlpbnQgb2Zmc2V0OwogCWludCB2YWx1ZTsKIH07CiAKK3N0cnVjdCBicmNtZl9zZGlvOworCiBzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgewogCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmNbU0RJT19NQVhfRlVOQ1NdOwogCXU4IG51bV9mdW5jczsJCQkvKiBTdXBwb3J0ZWQgZnVuY3Mgb24gY2xpZW50ICovCkBAIC0xMzIsOSArMTQwLDEwIEBACiAJYXRvbWljX3Qgc3VzcGVuZDsJCS8qIHN1c3BlbmQgZmxhZyAqLwogCXdhaXRfcXVldWVfaGVhZF90IHJlcXVlc3RfYnl0ZV93YWl0OwogCXdhaXRfcXVldWVfaGVhZF90IHJlcXVlc3Rfd29yZF93YWl0OwotCXdhaXRfcXVldWVfaGVhZF90IHJlcXVlc3RfcGFja2V0X3dhaXQ7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVxdWVzdF9jaGFpbl93YWl0OwogCXdhaXRfcXVldWVfaGVhZF90IHJlcXVlc3RfYnVmZmVyX3dhaXQ7Ci0KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3RydWN0IGJyY21mX2J1cyAqYnVzX2lmOwogfTsKIAogLyogUmVnaXN0ZXIvZGVyZWdpc3RlciBkZXZpY2UgaW50ZXJydXB0IGhhbmRsZXIuICovCkBAIC0xODIsMTEgKzE5MSwyMSBAQAogICogTk9URTogQXN5bmMgb3BlcmF0aW9uIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLgogICovCiBleHRlcm4gaW50CiticmNtZl9zZGNhcmRfc2VuZF9wa3Qoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKKwkJICAgICAgdWludCBmbGFncywgc3RydWN0IHNrX2J1ZmYgKnBrdCk7CitleHRlcm4gaW50CiBicmNtZl9zZGNhcmRfc2VuZF9idWYoc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1MzIgYWRkciwgdWludCBmbiwKLQkJICAgICAgdWludCBmbGFncywgdTggKmJ1ZiwgdWludCBuYnl0ZXMsIHN0cnVjdCBza19idWZmICpwa3QpOworCQkgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcyk7CisKK2V4dGVybiBpbnQKK2JyY21mX3NkY2FyZF9yZWN2X3BrdChzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAorCQkgICAgICB1aW50IGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKIGV4dGVybiBpbnQKIGJyY21mX3NkY2FyZF9yZWN2X2J1ZihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsIHUzMiBhZGRyLCB1aW50IGZuLAotCQkgICAgICB1aW50IGZsYWdzLCB1OCAqYnVmLCB1aW50IG5ieXRlcywgc3RydWN0IHNrX2J1ZmYgKnBrdCk7CisJCSAgICAgIHVpbnQgZmxhZ3MsIHU4ICpidWYsIHVpbnQgbmJ5dGVzKTsKK2V4dGVybiBpbnQKK2JyY21mX3NkY2FyZF9yZWN2X2NoYWluKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwgdTMyIGFkZHIsIHVpbnQgZm4sCisJCQl1aW50IGZsYWdzLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpwa3RxKTsKIAogLyogRmxhZ3MgYml0cyAqLwogCkBAIC0yMzcsMTYgKzI1NiwyMCBAQAogLyogcmVhZCBvciB3cml0ZSBhbnkgYnVmZmVyIHVzaW5nIGNtZDUzICovCiBleHRlcm4gaW50CiBicmNtZl9zZGlvaF9yZXF1ZXN0X2J1ZmZlcihzdHJ1Y3QgYnJjbWZfc2Rpb19kZXYgKnNkaW9kZXYsCi0JCQkgICB1aW50IGZpeF9pbmMsIHVpbnQgcncsIHVpbnQgZm5jX251bSwKLQkJCSAgIHUzMiBhZGRyLCB1aW50IHJlZ3dpZHRoLAotCQkJICAgdTMyIGJ1ZmxlbiwgdTggKmJ1ZmZlciwgc3RydWN0IHNrX2J1ZmYgKnBrdCk7CisJCQkgICB1aW50IGZpeF9pbmMsIHVpbnQgcncsIHVpbnQgZm5jX251bSwgdTMyIGFkZHIsCisJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqcGt0KTsKK2V4dGVybiBpbnQKK2JyY21mX3NkaW9oX3JlcXVlc3RfY2hhaW4oc3RydWN0IGJyY21mX3NkaW9fZGV2ICpzZGlvZGV2LCB1aW50IGZpeF9pbmMsCisJCQkgIHVpbnQgd3JpdGUsIHVpbnQgZnVuYywgdWludCBhZGRyLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpwa3RxKTsKIAogLyogV2F0Y2hkb2cgdGltZXIgaW50ZXJmYWNlIGZvciBwbSBvcHMgKi8KIGV4dGVybiB2b2lkIGJyY21mX3NkaW9fd2R0bXJfZW5hYmxlKHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2RldiwKIAkJCQkgICAgYm9vbCBlbmFibGUpOwogCi1leHRlcm4gdm9pZCAqYnJjbWZfc2RicmNtX3Byb2JlKHUxNiBidXNfbm8sIHUxNiBzbG90LCB1MTYgZnVuYywgdWludCBidXN0eXBlLAotCQkJCXUzMiByZWdzdmEsIHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2Rldik7CitleHRlcm4gdm9pZCAqYnJjbWZfc2RicmNtX3Byb2JlKHUzMiByZWdzdmEsIHN0cnVjdCBicmNtZl9zZGlvX2RldiAqc2Rpb2Rldik7CiBleHRlcm4gdm9pZCBicmNtZl9zZGJyY21fZGlzY29ubmVjdCh2b2lkICpwdHIpOwogZXh0ZXJuIHZvaWQgYnJjbWZfc2RicmNtX2lzcih2b2lkICphcmcpOworCitleHRlcm4gdm9pZCBicmNtZl9zZGJyY21fd2RfdGltZXIoc3RydWN0IGJyY21mX3NkaW8gKmJ1cywgdWludCB3ZHRpY2spOwogI2VuZGlmCQkJCS8qIF9CUkNNX1NESF9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYwppbmRleCA1ZWRkYWJlLi5mMjNiMGMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuYwpAQCAtMTQyOSw3ICsxNDI5LDcgQEAKIAogc3RhdGljIHMzMgogYnJjbWZfY2ZnODAyMTFfc2V0X3R4X3Bvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksCi0JCQkgZW51bSBubDgwMjExX3R4X3Bvd2VyX3NldHRpbmcgdHlwZSwgczMyIGRibSkKKwkJCSAgICBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLCBzMzIgbWJtKQogewogCiAJc3RydWN0IGJyY21mX2NmZzgwMjExX3ByaXYgKmNmZ19wcml2ID0gd2lwaHlfdG9fY2ZnKHdpcGh5KTsKQEAgLTE0MzcsNiArMTQzNyw3IEBACiAJdTE2IHR4cHdybXc7CiAJczMyIGVyciA9IDA7CiAJczMyIGRpc2FibGUgPSAwOworCXMzMiBkYm0gPSBNQk1fVE9fREJNKG1ibSk7CiAKIAlXTF9UUkFDRSgiRW50ZXJcbiIpOwogCWlmICghY2hlY2tfc3lzX3VwKHdpcGh5KSkKQEAgLTE0NDYsMTIgKzE0NDcsNiBAQAogCWNhc2UgTkw4MDIxMV9UWF9QT1dFUl9BVVRPTUFUSUM6CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9UWF9QT1dFUl9MSU1JVEVEOgotCQlpZiAoZGJtIDwgMCkgewotCQkJV0xfRVJSKCJUWF9QT1dFUl9MSU1JVEVEIC0gZGJtIGlzIG5lZ2F0aXZlXG4iKTsKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX1RYX1BPV0VSX0ZJWEVEOgogCQlpZiAoZGJtIDwgMCkgewogCQkJV0xfRVJSKCJUWF9QT1dFUl9GSVhFRCAtIGRibSBpcyBuZWdhdGl2ZVxuIik7CkBAIC0xOTk3LDcgKzE5OTIsNyBAQAogfQogCiBzdGF0aWMgczMyIGJyY21mX2luZm9ybV9zaW5nbGVfYnNzKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdiwKLQkJCQkgICBzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKmJpKQorCQkJCSAgIHN0cnVjdCBicmNtZl9ic3NfaW5mb19sZSAqYmkpCiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IGNmZ190b193aXBoeShjZmdfcHJpdik7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpub3RpZnlfY2hhbm5lbDsKQEAgLTIwNDksMTggKzIwNDQsMjcgQEAKIAkJbm90aWZ5X3RpbWVzdGFtcCwgbm90aWZ5X2NhcGFiaWxpdHksIG5vdGlmeV9pbnRlcnZhbCwgbm90aWZ5X2llLAogCQlub3RpZnlfaWVsZW4sIG5vdGlmeV9zaWduYWwsIEdGUF9LRVJORUwpOwogCi0JaWYgKCFic3MpIHsKLQkJV0xfRVJSKCJjZmc4MDIxMV9pbmZvcm1fYnNzX2ZyYW1lIGVycm9yXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQorCWlmICghYnNzKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKIAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKgorbmV4dF9ic3NfbGUoc3RydWN0IGJyY21mX3NjYW5fcmVzdWx0cyAqbGlzdCwgc3RydWN0IGJyY21mX2Jzc19pbmZvX2xlICpic3MpCit7CisJaWYgKGJzcyA9PSBOVUxMKQorCQlyZXR1cm4gbGlzdC0+YnNzX2luZm9fbGU7CisJcmV0dXJuIChzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKikoKHVuc2lnbmVkIGxvbmcpYnNzICsKKwkJCQkJICAgIGxlMzJfdG9fY3B1KGJzcy0+bGVuZ3RoKSk7Cit9CisKIHN0YXRpYyBzMzIgYnJjbWZfaW5mb3JtX2JzcyhzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfcHJpdiAqY2ZnX3ByaXYpCiB7CiAJc3RydWN0IGJyY21mX3NjYW5fcmVzdWx0cyAqYnNzX2xpc3Q7Ci0Jc3RydWN0IGJyY21mX2Jzc19pbmZvICpiaSA9IE5VTEw7CS8qIG11c3QgYmUgaW5pdGlhbGl6ZWQgKi8KKwlzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKmJpID0gTlVMTDsJLyogbXVzdCBiZSBpbml0aWFsaXplZCAqLwogCXMzMiBlcnIgPSAwOwogCWludCBpOwogCkBAIC0yMDcyLDcgKzIwNzYsNyBAQAogCX0KIAlXTF9TQ0FOKCJzY2FubmVkIEFQIGNvdW50ICglZClcbiIsIGJzc19saXN0LT5jb3VudCk7CiAJZm9yIChpID0gMDsgaSA8IGJzc19saXN0LT5jb3VudCAmJiBpIDwgV0xfQVBfTUFYOyBpKyspIHsKLQkJYmkgPSBuZXh0X2Jzcyhic3NfbGlzdCwgYmkpOworCQliaSA9IG5leHRfYnNzX2xlKGJzc19saXN0LCBiaSk7CiAJCWVyciA9IGJyY21mX2luZm9ybV9zaW5nbGVfYnNzKGNmZ19wcml2LCBiaSk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKQEAgLTIwODUsOCArMjA4OSw5IEBACiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IGNmZ190b193aXBoeShjZmdfcHJpdik7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpub3RpZnlfY2hhbm5lbDsKLQlzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKmJpID0gTlVMTDsKKwlzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKmJpID0gTlVMTDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpiYW5kOworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKIAl1OCAqYnVmID0gTlVMTDsKIAlzMzIgZXJyID0gMDsKIAl1MTYgY2hhbm5lbDsKQEAgLTIxMTQsNyArMjExOSw3IEBACiAJCWdvdG8gQ2xlYW5VcDsKIAl9CiAKLQliaSA9IChzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKikoYnVmICsgNCk7CisJYmkgPSAoc3RydWN0IGJyY21mX2Jzc19pbmZvX2xlICopKGJ1ZiArIDQpOwogCiAJY2hhbm5lbCA9IGJpLT5jdGxfY2ggPyBiaS0+Y3RsX2NoIDoKIAkJCQlDSFNQRUNfQ0hBTk5FTChsZTE2X3RvX2NwdShiaS0+Y2hhbnNwZWMpKTsKQEAgLTIxNDAsMTAgKzIxNDUsMTcgQEAKIAlXTF9DT05OKCJzaWduYWw6ICVkXG4iLCBub3RpZnlfc2lnbmFsKTsKIAlXTF9DT05OKCJub3RpZnlfdGltZXN0YW1wOiAlIzAxOGxseFxuIiwgbm90aWZ5X3RpbWVzdGFtcCk7CiAKLQljZmc4MDIxMV9pbmZvcm1fYnNzKHdpcGh5LCBub3RpZnlfY2hhbm5lbCwgYnNzaWQsCisJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwgbm90aWZ5X2NoYW5uZWwsIGJzc2lkLAogCQlub3RpZnlfdGltZXN0YW1wLCBub3RpZnlfY2FwYWJpbGl0eSwgbm90aWZ5X2ludGVydmFsLAogCQlub3RpZnlfaWUsIG5vdGlmeV9pZWxlbiwgbm90aWZ5X3NpZ25hbCwgR0ZQX0tFUk5FTCk7CiAKKwlpZiAoIWJzcykgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIENsZWFuVXA7CisJfQorCisJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOworCiBDbGVhblVwOgogCiAJa2ZyZWUoYnVmKTsKQEAgLTIxODgsNyArMjIwMCw3IEBACiAKIHN0YXRpYyBzMzIgYnJjbWZfdXBkYXRlX2Jzc19pbmZvKHN0cnVjdCBicmNtZl9jZmc4MDIxMV9wcml2ICpjZmdfcHJpdikKIHsKLQlzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKmJpOworCXN0cnVjdCBicmNtZl9ic3NfaW5mb19sZSAqYmk7CiAJc3RydWN0IGJyY21mX3NzaWQgKnNzaWQ7CiAJc3RydWN0IGJyY21mX3RsdiAqdGltOwogCXUxNiBiZWFjb25faW50ZXJ2YWw7CkBAIC0yMjExLDcgKzIyMjMsNyBAQAogCQlnb3RvIHVwZGF0ZV9ic3NfaW5mb19vdXQ7CiAJfQogCi0JYmkgPSAoc3RydWN0IGJyY21mX2Jzc19pbmZvICopKGNmZ19wcml2LT5leHRyYV9idWYgKyA0KTsKKwliaSA9IChzdHJ1Y3QgYnJjbWZfYnNzX2luZm9fbGUgKikoY2ZnX3ByaXYtPmV4dHJhX2J1ZiArIDQpOwogCWVyciA9IGJyY21mX2luZm9ybV9zaW5nbGVfYnNzKGNmZ19wcml2LCBiaSk7CiAJaWYgKGVycikKIAkJZ290byB1cGRhdGVfYnNzX2luZm9fb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21mbWFjL3dsX2NmZzgwMjExLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaAppbmRleCA2MmRjNDYxLi5hNjEzYjQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbWZtYWMvd2xfY2ZnODAyMTEuaApAQCAtMzUyLDE1ICszNTIsNiBAQAogCXJldHVybiAmY2ZnLT5jb25uX2luZm87CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGJyY21mX2Jzc19pbmZvICpuZXh0X2JzcyhzdHJ1Y3QgYnJjbWZfc2Nhbl9yZXN1bHRzICpsaXN0LAotCQkJCQkgICBzdHJ1Y3QgYnJjbWZfYnNzX2luZm8gKmJzcykKLXsKLQlyZXR1cm4gYnNzID0gYnNzID8KLQkJKHN0cnVjdCBicmNtZl9ic3NfaW5mbyAqKSgodW5zaWduZWQgbG9uZylic3MgKwotCQkJCSAgICAgICBsZTMyX3RvX2NwdShic3MtPmxlbmd0aCkpIDoKLQkJbGlzdC0+YnNzX2luZm87Ci19Ci0KIGV4dGVybiBzdHJ1Y3QgYnJjbWZfY2ZnODAyMTFfZGV2ICpicmNtZl9jZmc4MDIxMV9hdHRhY2goc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsCiAJCQkJCQkJc3RydWN0IGRldmljZSAqYnVzZGV2LAogCQkJCQkJCXZvaWQgKmRhdGEpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9haXV0aWxzLmMKaW5kZXggMDI1ZmEwZS4uYWI5YmIxMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYWl1dGlscy5jCkBAIC0xNiw2ICsxNiw4IEBACiAgKiBGaWxlIGNvbnRlbnRzOiBzdXBwb3J0IGZ1bmN0aW9ucyBmb3IgUENJL1BDSWUKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCkBAIC0zMTYsNTEgKzMxOCwyNCBAQAogCiAjZGVmaW5lCUJBRElEWAkJKFNJX01BWENPUkVTICsgMSkKIAotLyogTmV3ZXIgY2hpcHMgY2FuIGFjY2VzcyBQQ0kvUENJRSBhbmQgQ0MgY29yZSB3aXRob3V0IHJlcXVpcmluZyB0byBjaGFuZ2UKLSAqIFBDSSBCQVIwIFdJTgotICovCi0jZGVmaW5lIFNJX0ZBU1Qoc2kpICgoKHNpKS0+cHViLmJ1c2NvcmV0eXBlID09IFBDSUVfQ09SRV9JRCkgfHwJXAotCQkgICAgICgoKHNpKS0+cHViLmJ1c2NvcmV0eXBlID09IFBDSV9DT1JFX0lEKSAmJiBcCi0JCSAgICAgIChzaSktPnB1Yi5idXNjb3JlcmV2ID49IDEzKSkKLQotI2RlZmluZSBDQ1JFR1NfRkFTVChzaSkgKCgoY2hhciBfX2lvbWVtICopKChzaSktPmN1cm1hcCkgKyBcCi0JCQkgIFBDSV8xNktCMF9DQ1JFR1NfT0ZGU0VUKSkKLQogI2RlZmluZQlJU19TSU0oY2hpcHBrZykJXAogCSgoY2hpcHBrZyA9PSBIRExTSU1fUEtHX0lEKSB8fCAoY2hpcHBrZyA9PSBIV1NJTV9QS0dfSUQpKQogCi0vKgotICogTWFjcm9zIHRvIGRpc2FibGUvcmVzdG9yZSBmdW5jdGlvbiBjb3JlKEQxMSwgRU5FVCwgSUxJTkUyMCwgZXRjKSBpbnRlcnJ1cHRzCi0gKiBiZWZvcmUgYWZ0ZXIgY29yZSBzd2l0Y2hpbmcgdG8gYXZvaWQgaW52YWxpZCByZWdpc3RlciBhY2Nlc3NzIGluc2lkZSBJU1IuCi0gKi8KLSNkZWZpbmUgSU5UUl9PRkYoc2ksIGludHJfdmFsKSBcCi0JaWYgKChzaSktPmludHJzb2ZmX2ZuICYmIFwKLQkgICAgKHNpKS0+Y29yZWlkWyhzaSktPmN1cmlkeF0gPT0gKHNpKS0+ZGV2X2NvcmVpZCkgXAotCQlpbnRyX3ZhbCA9ICgqKHNpKS0+aW50cnNvZmZfZm4pKChzaSktPmludHJfYXJnKQorI2RlZmluZSBQQ0koc2loKQkoYWlfZ2V0X2J1c2NvcmV0eXBlKHNpaCkgPT0gUENJX0NPUkVfSUQpCisjZGVmaW5lIFBDSUUoc2loKQkoYWlfZ2V0X2J1c2NvcmV0eXBlKHNpaCkgPT0gUENJRV9DT1JFX0lEKQogCi0jZGVmaW5lIElOVFJfUkVTVE9SRShzaSwgaW50cl92YWwpIFwKLQlpZiAoKHNpKS0+aW50cnNyZXN0b3JlX2ZuICYmIFwKLQkgICAgKHNpKS0+Y29yZWlkWyhzaSktPmN1cmlkeF0gPT0gKHNpKS0+ZGV2X2NvcmVpZCkgXAotCQkoKihzaSktPmludHJzcmVzdG9yZV9mbikoKHNpKS0+aW50cl9hcmcsIGludHJfdmFsKQotCi0jZGVmaW5lIFBDSShzaSkJCSgoc2kpLT5wdWIuYnVzY29yZXR5cGUgPT0gUENJX0NPUkVfSUQpCi0jZGVmaW5lIFBDSUUoc2kpCSgoc2kpLT5wdWIuYnVzY29yZXR5cGUgPT0gUENJRV9DT1JFX0lEKQotCi0jZGVmaW5lIFBDSV9GT1JDRUhUKHNpKQkoUENJRShzaSkgJiYgKHNpLT5wdWIuY2hpcCA9PSBCQ000NzE2X0NISVBfSUQpKQorI2RlZmluZSBQQ0lfRk9SQ0VIVChzaWgpIChQQ0lFKHNpaCkgJiYgKGFpX2dldF9jaGlwX2lkKHNpaCkgPT0gQkNNNDcxNl9DSElQX0lEKSkKIAogI2lmZGVmIEJDTURCRwotI2RlZmluZQlTSV9NU0coYXJncykJcHJpbnRrIGFyZ3MKKyNkZWZpbmUJU0lfTVNHKGZtdCwgLi4uKQlwcl9kZWJ1ZyhmbXQsICMjX19WQV9BUkdTX18pCiAjZWxzZQotI2RlZmluZQlTSV9NU0coYXJncykKKyNkZWZpbmUJU0lfTVNHKGZtdCwgLi4uKQlub19wcmludGsoZm10LCAjI19fVkFfQVJHU19fKQogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCiAjZGVmaW5lCUdPT0RDT1JFQUREUih4LCBiKSBcCiAJKCgoeCkgPj0gKGIpKSAmJiAoKHgpIDwgKChiKSArIFNJX01BWENPUkVTICogU0lfQ09SRV9TSVpFKSkgJiYgXAogCQlJU19BTElHTkVEKCh4KSwgU0lfQ09SRV9TSVpFKSkKIAotI2RlZmluZSBQQ0lFUkVHUyhzaSkgKChfX2lvbWVtIGNoYXIgKikoKHNpKS0+Y3VybWFwKSArIFwKLQkJCVBDSV8xNktCMF9QQ0lSRUdTX09GRlNFVCkKLQogc3RydWN0IGFpZG1wIHsKIAl1MzIgb29ic2VsaW5hMzA7CS8qIDB4MDAwICovCiAJdTMyIG9vYnNlbGluYTc0OwkvKiAweDAwNCAqLwpAQCAtNDc5LDQwNiArNDU0LDEzIEBACiAJdTMyIGNvbXBvbmVudGlkMzsJLyogMHhmZmMgKi8KIH07CiAKLS8qIEVST00gcGFyc2luZyAqLwotCi1zdGF0aWMgdTMyCi1nZXRfZXJvbV9lbnQoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgX19pb21lbSAqKmVyb21wdHIsIHUzMiBtYXNrLCB1MzIgbWF0Y2gpCi17Ci0JdTMyIGVudDsKLQl1aW50IGludiA9IDAsIG5vbSA9IDA7Ci0KLQl3aGlsZSAodHJ1ZSkgewotCQllbnQgPSBSX1JFRygqZXJvbXB0cik7Ci0JCSgqZXJvbXB0cikrKzsKLQotCQlpZiAobWFzayA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJaWYgKChlbnQgJiBFUl9WQUxJRCkgPT0gMCkgewotCQkJaW52Kys7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlmIChlbnQgPT0gKEVSX0VORCB8IEVSX1ZBTElEKSkKLQkJCWJyZWFrOwotCi0JCWlmICgoZW50ICYgbWFzaykgPT0gbWF0Y2gpCi0JCQlicmVhazsKLQotCQlub20rKzsKLQl9Ci0KLQlyZXR1cm4gZW50OwotfQotCi1zdGF0aWMgdTMyCi1nZXRfYXNkKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIF9faW9tZW0gKiplcm9tcHRyLCB1aW50IHNwLCB1aW50IGFkLCB1aW50IHN0LAotCXUzMiAqYWRkcmwsIHUzMiAqYWRkcmgsIHUzMiAqc2l6ZWwsIHUzMiAqc2l6ZWgpCi17Ci0JdTMyIGFzZCwgc3osIHN6ZDsKLQotCWFzZCA9IGdldF9lcm9tX2VudChzaWgsIGVyb21wdHIsIEVSX1ZBTElELCBFUl9WQUxJRCk7Ci0JaWYgKCgoYXNkICYgRVJfVEFHMSkgIT0gRVJfQUREKSB8fAotCSAgICAoKChhc2QgJiBBRF9TUF9NQVNLKSA+PiBBRF9TUF9TSElGVCkgIT0gc3ApIHx8Ci0JICAgICgoYXNkICYgQURfU1RfTUFTSykgIT0gc3QpKSB7Ci0JCS8qIFRoaXMgaXMgbm90IHdoYXQgd2Ugd2FudCwgInB1c2giIGl0IGJhY2sgKi8KLQkJKCplcm9tcHRyKS0tOwotCQlyZXR1cm4gMDsKLQl9Ci0JKmFkZHJsID0gYXNkICYgQURfQUREUl9NQVNLOwotCWlmIChhc2QgJiBBRF9BRzMyKQotCQkqYWRkcmggPSBnZXRfZXJvbV9lbnQoc2loLCBlcm9tcHRyLCAwLCAwKTsKLQllbHNlCi0JCSphZGRyaCA9IDA7Ci0JKnNpemVoID0gMDsKLQlzeiA9IGFzZCAmIEFEX1NaX01BU0s7Ci0JaWYgKHN6ID09IEFEX1NaX1NaRCkgewotCQlzemQgPSBnZXRfZXJvbV9lbnQoc2loLCBlcm9tcHRyLCAwLCAwKTsKLQkJKnNpemVsID0gc3pkICYgU0RfU1pfTUFTSzsKLQkJaWYgKHN6ZCAmIFNEX1NHMzIpCi0JCQkqc2l6ZWggPSBnZXRfZXJvbV9lbnQoc2loLCBlcm9tcHRyLCAwLCAwKTsKLQl9IGVsc2UKLQkJKnNpemVsID0gQURfU1pfQkFTRSA8PCAoc3ogPj4gQURfU1pfU0hJRlQpOwotCi0JcmV0dXJuIGFzZDsKLX0KLQotc3RhdGljIHZvaWQgYWlfaHdmaXh1cChzdHJ1Y3Qgc2lfaW5mbyAqc2lpKQotewotfQotCi0vKiBwYXJzZSB0aGUgZW51bWVyYXRpb24gcm9tIHRvIGlkZW50aWZ5IGFsbCBjb3JlcyAqLwotc3RhdGljIHZvaWQgYWlfc2NhbihzdHJ1Y3Qgc2lfcHViICpzaWgsIHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2MpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQotCXUzMiBlcm9tYmFzZTsKLQl1MzIgX19pb21lbSAqZXJvbXB0ciwgKmVyb21saW07Ci0Jdm9pZCBfX2lvbWVtICpyZWdzID0gY2M7Ci0KLQllcm9tYmFzZSA9IFJfUkVHKCZjYy0+ZXJvbXB0cik7Ci0KLQkvKiBTZXQgd3JhcHBlcnMgYWRkcmVzcyAqLwotCXNpaS0+Y3Vyd3JhcCA9ICh2b2lkICopKCh1bnNpZ25lZCBsb25nKWNjICsgU0lfQ09SRV9TSVpFKTsKLQotCS8qIE5vdyBwb2ludCB0aGUgd2luZG93IGF0IHRoZSBlcm9tICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9CQVIwX1dJTiwgZXJvbWJhc2UpOwotCWVyb21wdHIgPSByZWdzOwotCWVyb21saW0gPSBlcm9tcHRyICsgKEVSX1JFTUFQQ09OVFJPTCAvIHNpemVvZih1MzIpKTsKLQotCXdoaWxlIChlcm9tcHRyIDwgZXJvbWxpbSkgewotCQl1MzIgY2lhLCBjaWIsIGNpZCwgbWZnLCBjcmV2LCBubXcsIG5zdywgbm1wLCBuc3A7Ci0JCXUzMiBtcGQsIGFzZCwgYWRkcmwsIGFkZHJoLCBzaXplbCwgc2l6ZWg7Ci0JCXUzMiBfX2lvbWVtICpiYXNlOwotCQl1aW50IGksIGosIGlkeDsKLQkJYm9vbCBicjsKLQotCQliciA9IGZhbHNlOwotCi0JCS8qIEdyb2sgYSBjb21wb25lbnQgKi8KLQkJY2lhID0gZ2V0X2Vyb21fZW50KHNpaCwgJmVyb21wdHIsIEVSX1RBRywgRVJfQ0kpOwotCQlpZiAoY2lhID09IChFUl9FTkQgfCBFUl9WQUxJRCkpIHsKLQkJCS8qICBGb3VuZCBFTkQgb2YgZXJvbSAqLwotCQkJYWlfaHdmaXh1cChzaWkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJhc2UgPSBlcm9tcHRyIC0gMTsKLQkJY2liID0gZ2V0X2Vyb21fZW50KHNpaCwgJmVyb21wdHIsIDAsIDApOwotCi0JCWlmICgoY2liICYgRVJfVEFHKSAhPSBFUl9DSSkgewotCQkJLyogQ0lBIG5vdCBmb2xsb3dlZCBieSBDSUIgKi8KLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQljaWQgPSAoY2lhICYgQ0lBX0NJRF9NQVNLKSA+PiBDSUFfQ0lEX1NISUZUOwotCQltZmcgPSAoY2lhICYgQ0lBX01GR19NQVNLKSA+PiBDSUFfTUZHX1NISUZUOwotCQljcmV2ID0gKGNpYiAmIENJQl9SRVZfTUFTSykgPj4gQ0lCX1JFVl9TSElGVDsKLQkJbm13ID0gKGNpYiAmIENJQl9OTVdfTUFTSykgPj4gQ0lCX05NV19TSElGVDsKLQkJbnN3ID0gKGNpYiAmIENJQl9OU1dfTUFTSykgPj4gQ0lCX05TV19TSElGVDsKLQkJbm1wID0gKGNpYiAmIENJQl9OTVBfTUFTSykgPj4gQ0lCX05NUF9TSElGVDsKLQkJbnNwID0gKGNpYiAmIENJQl9OU1BfTUFTSykgPj4gQ0lCX05TUF9TSElGVDsKLQotCQlpZiAoKChtZmcgPT0gTUZHSURfQVJNKSAmJiAoY2lkID09IERFRl9BSV9DT01QKSkgfHwgKG5zcCA9PSAwKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKG5tdyArIG5zdyA9PSAwKSkgewotCQkJLyogQSBjb21wb25lbnQgd2hpY2ggaXMgbm90IGEgY29yZSAqLwotCQkJaWYgKGNpZCA9PSBPT0JfUk9VVEVSX0NPUkVfSUQpIHsKLQkJCQlhc2QgPSBnZXRfYXNkKHNpaCwgJmVyb21wdHIsIDAsIDAsIEFEX1NUX1NMQVZFLAotCQkJCQkgICAgICAmYWRkcmwsICZhZGRyaCwgJnNpemVsLCAmc2l6ZWgpOwotCQkJCWlmIChhc2QgIT0gMCkKLQkJCQkJc2lpLT5vb2Jfcm91dGVyID0gYWRkcmw7Ci0JCQl9Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCWlkeCA9IHNpaS0+bnVtY29yZXM7Ci0vKgkJc2lpLT5lcm9tcHRyW2lkeF0gPSBiYXNlOyAqLwotCQlzaWktPmNpYVtpZHhdID0gY2lhOwotCQlzaWktPmNpYltpZHhdID0gY2liOwotCQlzaWktPmNvcmVpZFtpZHhdID0gY2lkOwotCi0JCWZvciAoaSA9IDA7IGkgPCBubXA7IGkrKykgewotCQkJbXBkID0gZ2V0X2Vyb21fZW50KHNpaCwgJmVyb21wdHIsIEVSX1ZBTElELCBFUl9WQUxJRCk7Ci0JCQlpZiAoKG1wZCAmIEVSX1RBRykgIT0gRVJfTVApIHsKLQkJCQkvKiBOb3QgZW5vdWdoIE1QIGVudHJpZXMgZm9yIGNvbXBvbmVudCAqLwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCX0KLQotCQkvKiBGaXJzdCBTbGF2ZSBBZGRyZXNzIERlc2NyaXB0b3Igc2hvdWxkIGJlIHBvcnQgMDoKLQkJICogdGhlIG1haW4gcmVnaXN0ZXIgc3BhY2UgZm9yIHRoZSBjb3JlCi0JCSAqLwotCQlhc2QgPQotCQkgICAgZ2V0X2FzZChzaWgsICZlcm9tcHRyLCAwLCAwLCBBRF9TVF9TTEFWRSwgJmFkZHJsLCAmYWRkcmgsCi0JCQkgICAgJnNpemVsLCAmc2l6ZWgpOwotCQlpZiAoYXNkID09IDApIHsKLQkJCS8qIFRyeSBhZ2FpbiB0byBzZWUgaWYgaXQgaXMgYSBicmlkZ2UgKi8KLQkJCWFzZCA9Ci0JCQkgICAgZ2V0X2FzZChzaWgsICZlcm9tcHRyLCAwLCAwLCBBRF9TVF9CUklER0UsICZhZGRybCwKLQkJCQkgICAgJmFkZHJoLCAmc2l6ZWwsICZzaXplaCk7Ci0JCQlpZiAoYXNkICE9IDApCi0JCQkJYnIgPSB0cnVlOwotCQkJZWxzZSBpZiAoKGFkZHJoICE9IDApIHx8IChzaXplaCAhPSAwKQotCQkJCSB8fCAoc2l6ZWwgIT0gU0lfQ09SRV9TSVpFKSkgewotCQkJCS8qIEZpcnN0IFNsYXZlIEFTRCBmb3IgY29yZSBtYWxmb3JtZWQgKi8KLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQl9Ci0JCXNpaS0+Y29yZXNiYVtpZHhdID0gYWRkcmw7Ci0JCXNpaS0+Y29yZXNiYV9zaXplW2lkeF0gPSBzaXplbDsKLQkJLyogR2V0IGFueSBtb3JlIEFTRHMgaW4gcG9ydCAwICovCi0JCWogPSAxOwotCQlkbyB7Ci0JCQlhc2QgPQotCQkJICAgIGdldF9hc2Qoc2loLCAmZXJvbXB0ciwgMCwgaiwgQURfU1RfU0xBVkUsICZhZGRybCwKLQkJCQkgICAgJmFkZHJoLCAmc2l6ZWwsICZzaXplaCk7Ci0JCQlpZiAoKGFzZCAhPSAwKSAmJiAoaiA9PSAxKSAmJiAoc2l6ZWwgPT0gU0lfQ09SRV9TSVpFKSkgewotCQkJCXNpaS0+Y29yZXNiYTJbaWR4XSA9IGFkZHJsOwotCQkJCXNpaS0+Y29yZXNiYTJfc2l6ZVtpZHhdID0gc2l6ZWw7Ci0JCQl9Ci0JCQlqKys7Ci0JCX0gd2hpbGUgKGFzZCAhPSAwKTsKLQotCQkvKiBHbyB0aHJvdWdoIHRoZSBBU0RzIGZvciBvdGhlciBzbGF2ZSBwb3J0cyAqLwotCQlmb3IgKGkgPSAxOyBpIDwgbnNwOyBpKyspIHsKLQkJCWogPSAwOwotCQkJZG8gewotCQkJCWFzZCA9Ci0JCQkJICAgIGdldF9hc2Qoc2loLCAmZXJvbXB0ciwgaSwgaisrLCBBRF9TVF9TTEFWRSwKLQkJCQkJICAgICZhZGRybCwgJmFkZHJoLCAmc2l6ZWwsICZzaXplaCk7Ci0JCQl9IHdoaWxlIChhc2QgIT0gMCk7Ci0JCQlpZiAoaiA9PSAwKSB7Ci0JCQkJLyogU1AgaGFzIG5vIGFkZHJlc3MgZGVzY3JpcHRvcnMgKi8KLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQl9Ci0KLQkJLyogTm93IGdldCBtYXN0ZXIgd3JhcHBlcnMgKi8KLQkJZm9yIChpID0gMDsgaSA8IG5tdzsgaSsrKSB7Ci0JCQlhc2QgPQotCQkJICAgIGdldF9hc2Qoc2loLCAmZXJvbXB0ciwgaSwgMCwgQURfU1RfTVdSQVAsICZhZGRybCwKLQkJCQkgICAgJmFkZHJoLCAmc2l6ZWwsICZzaXplaCk7Ci0JCQlpZiAoYXNkID09IDApIHsKLQkJCQkvKiBNaXNzaW5nIGRlc2NyaXB0b3IgZm9yIE1XICovCi0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmICgoc2l6ZWggIT0gMCkgfHwgKHNpemVsICE9IFNJX0NPUkVfU0laRSkpIHsKLQkJCQkvKiBNYXN0ZXIgd3JhcHBlciAlZCBpcyBub3QgNEtCICovCi0JCQkJZ290byBlcnJvcjsKLQkJCX0KLQkJCWlmIChpID09IDApCi0JCQkJc2lpLT53cmFwYmFbaWR4XSA9IGFkZHJsOwotCQl9Ci0KLQkJLyogQW5kIGZpbmFsbHkgc2xhdmUgd3JhcHBlcnMgKi8KLQkJZm9yIChpID0gMDsgaSA8IG5zdzsgaSsrKSB7Ci0JCQl1aW50IGZ3cCA9IChuc3AgPT0gMSkgPyAwIDogMTsKLQkJCWFzZCA9Ci0JCQkgICAgZ2V0X2FzZChzaWgsICZlcm9tcHRyLCBmd3AgKyBpLCAwLCBBRF9TVF9TV1JBUCwKLQkJCQkgICAgJmFkZHJsLCAmYWRkcmgsICZzaXplbCwgJnNpemVoKTsKLQkJCWlmIChhc2QgPT0gMCkgewotCQkJCS8qIE1pc3NpbmcgZGVzY3JpcHRvciBmb3IgU1cgKi8KLQkJCQlnb3RvIGVycm9yOwotCQkJfQotCQkJaWYgKChzaXplaCAhPSAwKSB8fCAoc2l6ZWwgIT0gU0lfQ09SRV9TSVpFKSkgewotCQkJCS8qIFNsYXZlIHdyYXBwZXIgaXMgbm90IDRLQiAqLwotCQkJCWdvdG8gZXJyb3I7Ci0JCQl9Ci0JCQlpZiAoKG5tdyA9PSAwKSAmJiAoaSA9PSAwKSkKLQkJCQlzaWktPndyYXBiYVtpZHhdID0gYWRkcmw7Ci0JCX0KLQotCQkvKiBEb24ndCByZWNvcmQgYnJpZGdlcyAqLwotCQlpZiAoYnIpCi0JCQljb250aW51ZTsKLQotCQkvKiBEb25lIHdpdGggY29yZSAqLwotCQlzaWktPm51bWNvcmVzKys7Ci0JfQotCi0gZXJyb3I6Ci0JLyogUmVhY2hlZCBlbmQgb2YgZXJvbSB3aXRob3V0IGZpbmRpbmcgRU5EICovCi0Jc2lpLT5udW1jb3JlcyA9IDA7Ci0JcmV0dXJuOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBsb2dpY2FsICJmb2N1cyIgdG8gdGhlIGluZGljYXRlZCBjb3JlLgotICogUmV0dXJuIHRoZSBjdXJyZW50IGNvcmUncyB2aXJ0dWFsIGFkZHJlc3MuIFNpbmNlIGVhY2ggY29yZSBzdGFydHMgd2l0aCB0aGUKLSAqIHNhbWUgc2V0IG9mIHJlZ2lzdGVycyAoQklTVCwgY2xvY2sgY29udHJvbCwgZXRjKSwgdGhlIHJldHVybmVkIGFkZHJlc3MKLSAqIGNvbnRhaW5zIHRoZSBmaXJzdCByZWdpc3RlciBvZiB0aGlzICdjb21tb24nIHJlZ2lzdGVyIGJsb2NrIChub3QgdG8gYmUKLSAqIGNvbmZ1c2VkIHdpdGggJ2NvbW1vbiBjb3JlJykuCi0gKi8KLXZvaWQgX19pb21lbSAqYWlfc2V0Y29yZWlkeChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkeCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCXUzMiBhZGRyID0gc2lpLT5jb3Jlc2JhW2NvcmVpZHhdOwotCXUzMiB3cmFwID0gc2lpLT53cmFwYmFbY29yZWlkeF07Ci0KLQlpZiAoY29yZWlkeCA+PSBzaWktPm51bWNvcmVzKQotCQlyZXR1cm4gTlVMTDsKLQotCS8qIHBvaW50IGJhcjAgd2luZG93ICovCi0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9CQVIwX1dJTiwgYWRkcik7Ci0JLyogcG9pbnQgYmFyMCAybmQgNEtCIHdpbmRvdyAqLwotCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfQkFSMF9XSU4yLCB3cmFwKTsKLQlzaWktPmN1cmlkeCA9IGNvcmVpZHg7Ci0KLQlyZXR1cm4gc2lpLT5jdXJtYXA7Ci19Ci0KLS8qIFJldHVybiB0aGUgbnVtYmVyIG9mIGFkZHJlc3Mgc3BhY2VzIGluIGN1cnJlbnQgY29yZSAqLwotaW50IGFpX251bWFkZHJzcGFjZXMoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXJldHVybiAyOwotfQotCi0vKiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIG50aCBhZGRyZXNzIHNwYWNlIGluIHRoZSBjdXJyZW50IGNvcmUgKi8KLXUzMiBhaV9hZGRyc3BhY2Uoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGFzaWR4KQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JdWludCBjaWR4OwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCWNpZHggPSBzaWktPmN1cmlkeDsKLQotCWlmIChhc2lkeCA9PSAwKQotCQlyZXR1cm4gc2lpLT5jb3Jlc2JhW2NpZHhdOwotCWVsc2UgaWYgKGFzaWR4ID09IDEpCi0JCXJldHVybiBzaWktPmNvcmVzYmEyW2NpZHhdOwotCWVsc2UgewotCQkvKiBOZWVkIHRvIHBhcnNlIHRoZSBlcm9tIGFnYWluIHRvIGZpbmQgYWRkciBzcGFjZSAqLwotCQlyZXR1cm4gMDsKLQl9Ci19Ci0KLS8qIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbnRoIGFkZHJlc3Mgc3BhY2UgaW4gdGhlIGN1cnJlbnQgY29yZSAqLwotdTMyIGFpX2FkZHJzcGFjZXNpemUoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGFzaWR4KQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JdWludCBjaWR4OwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCWNpZHggPSBzaWktPmN1cmlkeDsKLQotCWlmIChhc2lkeCA9PSAwKQotCQlyZXR1cm4gc2lpLT5jb3Jlc2JhX3NpemVbY2lkeF07Ci0JZWxzZSBpZiAoYXNpZHggPT0gMSkKLQkJcmV0dXJuIHNpaS0+Y29yZXNiYTJfc2l6ZVtjaWR4XTsKLQllbHNlIHsKLQkJLyogTmVlZCB0byBwYXJzZSB0aGUgZXJvbSBhZ2FpbiB0byBmaW5kIGFkZHIgKi8KLQkJcmV0dXJuIDA7Ci0JfQotfQotCi11aW50IGFpX2ZsYWcoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQlhaSA9IHNpaS0+Y3Vyd3JhcDsKLQotCXJldHVybiBSX1JFRygmYWktPm9vYnNlbG91dGEzMCkgJiAweDFmOwotfQotCi12b2lkIGFpX3NldGludChzdHJ1Y3Qgc2lfcHViICpzaWgsIGludCBzaWZsYWcpCi17Ci19Ci0KLXVpbnQgYWlfY29yZXZlbmRvcihzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQl1MzIgY2lhOwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCWNpYSA9IHNpaS0+Y2lhW3NpaS0+Y3VyaWR4XTsKLQlyZXR1cm4gKGNpYSAmIENJQV9NRkdfTUFTSykgPj4gQ0lBX01GR19TSElGVDsKLX0KLQotdWludCBhaV9jb3JlcmV2KHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXUzMiBjaWI7Ci0KLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0JY2liID0gc2lpLT5jaWJbc2lpLT5jdXJpZHhdOwotCXJldHVybiAoY2liICYgQ0lCX1JFVl9NQVNLKSA+PiBDSUJfUkVWX1NISUZUOwotfQotCi1ib29sIGFpX2lzY29yZXVwKHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXN0cnVjdCBhaWRtcCAqYWk7Ci0KLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0JYWkgPSBzaWktPmN1cndyYXA7Ci0KLQlyZXR1cm4gKCgoUl9SRUcoJmFpLT5pb2N0cmwpICYgKFNJQ0ZfRkdDIHwgU0lDRl9DTE9DS19FTikpID09Ci0JCSBTSUNGX0NMT0NLX0VOKQotCQkmJiAoKFJfUkVHKCZhaS0+cmVzZXRjdHJsKSAmIEFJUkNfUkVTRVQpID09IDApKTsKLX0KLQotdm9pZCBhaV9jb3JlX2NmbGFnc193byhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQl1MzIgdzsKLQotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQotCWFpID0gc2lpLT5jdXJ3cmFwOwotCi0JaWYgKG1hc2sgfHwgdmFsKSB7Ci0JCXcgPSAoKFJfUkVHKCZhaS0+aW9jdHJsKSAmIH5tYXNrKSB8IHZhbCk7Ci0JCVdfUkVHKCZhaS0+aW9jdHJsLCB3KTsKLQl9Ci19Ci0KLXUzMiBhaV9jb3JlX2NmbGFncyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGFpZG1wICphaTsKLQl1MzIgdzsKLQotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQlhaSA9IHNpaS0+Y3Vyd3JhcDsKLQotCWlmIChtYXNrIHx8IHZhbCkgewotCQl3ID0gKChSX1JFRygmYWktPmlvY3RybCkgJiB+bWFzaykgfCB2YWwpOwotCQlXX1JFRygmYWktPmlvY3RybCwgdyk7Ci0JfQotCi0JcmV0dXJuIFJfUkVHKCZhaS0+aW9jdHJsKTsKLX0KLQogLyogcmV0dXJuIHRydWUgaWYgUENJRSBjYXBhYmlsaXR5IGV4aXN0cyBpbiB0aGUgcGNpIGNvbmZpZyBzcGFjZSAqLwogc3RhdGljIGJvb2wgYWlfaXNwY2llKHN0cnVjdCBzaV9pbmZvICpzaWkpCiB7CiAJdTggY2FwX3B0cjsKIAogCWNhcF9wdHIgPQotCSAgICBwY2ljb3JlX2ZpbmRfcGNpX2NhcGFiaWxpdHkoc2lpLT5wYnVzLCBQQ0lfQ0FQX0lEX0VYUCwgTlVMTCwKKwkgICAgcGNpY29yZV9maW5kX3BjaV9jYXBhYmlsaXR5KHNpaS0+cGNpYnVzLCBQQ0lfQ0FQX0lEX0VYUCwgTlVMTCwKIAkJCQkJTlVMTCk7CiAJaWYgKCFjYXBfcHRyKQogCQlyZXR1cm4gZmFsc2U7CkBAIC04OTQsMTE3ICs0NzYsNjkgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotdTMyIGFpX2NvcmVfc2ZsYWdzKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIG1hc2ssIHUzMiB2YWwpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQlzdHJ1Y3QgYWlkbXAgKmFpOwotCXUzMiB3OwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCWFpID0gc2lpLT5jdXJ3cmFwOwotCi0JaWYgKG1hc2sgfHwgdmFsKSB7Ci0JCXcgPSAoKFJfUkVHKCZhaS0+aW9zdGF0dXMpICYgfm1hc2spIHwgdmFsKTsKLQkJV19SRUcoJmFpLT5pb3N0YXR1cywgdyk7Ci0JfQotCi0JcmV0dXJuIFJfUkVHKCZhaS0+aW9zdGF0dXMpOwotfQotCiBzdGF0aWMgYm9vbAotYWlfYnVzY29yZV9zZXR1cChzdHJ1Y3Qgc2lfaW5mbyAqc2lpLCB1MzIgc2F2ZXdpbiwgdWludCAqb3JpZ2lkeCkKK2FpX2J1c2NvcmVfc2V0dXAoc3RydWN0IHNpX2luZm8gKnNpaSwgc3RydWN0IGJjbWFfZGV2aWNlICpjYykKIHsKLQlib29sIHBjaSwgcGNpZTsKLQl1aW50IGk7Ci0JdWludCBwY2lpZHgsIHBjaWVpZHgsIHBjaXJldiwgcGNpZXJldjsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOworCXN0cnVjdCBiY21hX2RldmljZSAqcGNpID0gTlVMTDsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKnBjaWUgPSBOVUxMOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZTsKIAotCWNjID0gYWlfc2V0Y29yZWlkeCgmc2lpLT5wdWIsIFNJX0NDX0lEWCk7CisKKwkvKiBubyBjb3JlcyBmb3VuZCwgYmFpbCBvdXQgKi8KKwlpZiAoY2MtPmJ1cy0+bnJfY29yZXMgPT0gMCkKKwkJcmV0dXJuIGZhbHNlOwogCiAJLyogZ2V0IGNoaXBjb21tb24gcmV2ICovCi0Jc2lpLT5wdWIuY2NyZXYgPSAoaW50KWFpX2NvcmVyZXYoJnNpaS0+cHViKTsKKwlzaWktPnB1Yi5jY3JldiA9IGNjLT5pZC5yZXY7CiAKIAkvKiBnZXQgY2hpcGNvbW1vbiBjaGlwc3RhdHVzICovCi0JaWYgKHNpaS0+cHViLmNjcmV2ID49IDExKQotCQlzaWktPnB1Yi5jaGlwc3QgPSBSX1JFRygmY2MtPmNoaXBzdGF0dXMpOworCWlmIChhaV9nZXRfY2NyZXYoJnNpaS0+cHViKSA+PSAxMSkKKwkJc2lpLT5jaGlwc3QgPSBiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKGNoaXBzdGF0dXMpKTsKIAogCS8qIGdldCBjaGlwY29tbW9uIGNhcGFiaWxpdGVzICovCi0Jc2lpLT5wdWIuY2NjYXBzID0gUl9SRUcoJmNjLT5jYXBhYmlsaXRpZXMpOwotCS8qIGdldCBjaGlwY29tbW9uIGV4dGVuZGVkIGNhcGFiaWxpdGllcyAqLwotCi0JaWYgKHNpaS0+cHViLmNjcmV2ID49IDM1KQotCQlzaWktPnB1Yi5jY2NhcHNfZXh0ID0gUl9SRUcoJmNjLT5jYXBhYmlsaXRpZXNfZXh0KTsKKwlzaWktPnB1Yi5jY2NhcHMgPSBiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKGNhcGFiaWxpdGllcykpOwogCiAJLyogZ2V0IHBtdSByZXYgYW5kIGNhcHMgKi8KLQlpZiAoc2lpLT5wdWIuY2NjYXBzICYgQ0NfQ0FQX1BNVSkgewotCQlzaWktPnB1Yi5wbXVjYXBzID0gUl9SRUcoJmNjLT5wbXVjYXBhYmlsaXRpZXMpOworCWlmIChhaV9nZXRfY2NjYXBzKCZzaWktPnB1YikgJiBDQ19DQVBfUE1VKSB7CisJCXNpaS0+cHViLnBtdWNhcHMgPSBiY21hX3JlYWQzMihjYywKKwkJCQkJICAgICAgIENISVBDUkVHT0ZGUyhwbXVjYXBhYmlsaXRpZXMpKTsKIAkJc2lpLT5wdWIucG11cmV2ID0gc2lpLT5wdWIucG11Y2FwcyAmIFBDQVBfUkVWX01BU0s7CiAJfQogCi0JLyogZmlndXJlIG91dCBidXMvb3JpZ25hbCBjb3JlIGlkeCAqLwotCXNpaS0+cHViLmJ1c2NvcmV0eXBlID0gTk9ERVZfQ09SRV9JRDsKLQlzaWktPnB1Yi5idXNjb3JlcmV2ID0gTk9SRVY7Ci0Jc2lpLT5wdWIuYnVzY29yZWlkeCA9IEJBRElEWDsKLQotCXBjaSA9IHBjaWUgPSBmYWxzZTsKLQlwY2lyZXYgPSBwY2llcmV2ID0gTk9SRVY7Ci0JcGNpaWR4ID0gcGNpZWlkeCA9IEJBRElEWDsKLQotCWZvciAoaSA9IDA7IGkgPCBzaWktPm51bWNvcmVzOyBpKyspIHsKKwkvKiBmaWd1cmUgb3V0IGJ1c2NvcmUgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvcmUsICZjYy0+YnVzLT5jb3JlcywgbGlzdCkgewogCQl1aW50IGNpZCwgY3JldjsKIAotCQlhaV9zZXRjb3JlaWR4KCZzaWktPnB1YiwgaSk7Ci0JCWNpZCA9IGFpX2NvcmVpZCgmc2lpLT5wdWIpOwotCQljcmV2ID0gYWlfY29yZXJldigmc2lpLT5wdWIpOworCQljaWQgPSBjb3JlLT5pZC5pZDsKKwkJY3JldiA9IGNvcmUtPmlkLnJldjsKIAogCQlpZiAoY2lkID09IFBDSV9DT1JFX0lEKSB7Ci0JCQlwY2lpZHggPSBpOwotCQkJcGNpcmV2ID0gY3JldjsKLQkJCXBjaSA9IHRydWU7CisJCQlwY2kgPSBjb3JlOwogCQl9IGVsc2UgaWYgKGNpZCA9PSBQQ0lFX0NPUkVfSUQpIHsKLQkJCXBjaWVpZHggPSBpOwotCQkJcGNpZXJldiA9IGNyZXY7Ci0JCQlwY2llID0gdHJ1ZTsKKwkJCXBjaWUgPSBjb3JlOwogCQl9Ci0KLQkJLyogZmluZCB0aGUgY29yZSBpZHggYmVmb3JlIGVudGVyaW5nIHRoaXMgZnVuYy4gKi8KLQkJaWYgKChzYXZld2luICYmIChzYXZld2luID09IHNpaS0+Y29yZXNiYVtpXSkpIHx8Ci0JCSAgICAoY2MgPT0gc2lpLT5yZWdzW2ldKSkKLQkJCSpvcmlnaWR4ID0gaTsKIAl9CiAKIAlpZiAocGNpICYmIHBjaWUpIHsKIAkJaWYgKGFpX2lzcGNpZShzaWkpKQotCQkJcGNpID0gZmFsc2U7CisJCQlwY2kgPSBOVUxMOwogCQllbHNlCi0JCQlwY2llID0gZmFsc2U7CisJCQlwY2llID0gTlVMTDsKIAl9CiAJaWYgKHBjaSkgewotCQlzaWktPnB1Yi5idXNjb3JldHlwZSA9IFBDSV9DT1JFX0lEOwotCQlzaWktPnB1Yi5idXNjb3JlcmV2ID0gcGNpcmV2OwotCQlzaWktPnB1Yi5idXNjb3JlaWR4ID0gcGNpaWR4OworCQlzaWktPmJ1c2NvcmUgPSBwY2k7CiAJfSBlbHNlIGlmIChwY2llKSB7Ci0JCXNpaS0+cHViLmJ1c2NvcmV0eXBlID0gUENJRV9DT1JFX0lEOwotCQlzaWktPnB1Yi5idXNjb3JlcmV2ID0gcGNpZXJldjsKLQkJc2lpLT5wdWIuYnVzY29yZWlkeCA9IHBjaWVpZHg7CisJCXNpaS0+YnVzY29yZSA9IHBjaWU7CiAJfQogCiAJLyogZml4dXAgbmVjZXNzYXJ5IGNoaXAvY29yZSBjb25maWd1cmF0aW9ucyAqLwotCWlmIChTSV9GQVNUKHNpaSkpIHsKLQkJaWYgKCFzaWktPnBjaCkgewotCQkJc2lpLT5wY2ggPSBwY2ljb3JlX2luaXQoJnNpaS0+cHViLCBzaWktPnBidXMsCi0JCQkJCQkoX19pb21lbSB2b2lkICopUENJRVJFR1Moc2lpKSk7Ci0JCQlpZiAoc2lpLT5wY2ggPT0gTlVMTCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KKwlpZiAoIXNpaS0+cGNoKSB7CisJCXNpaS0+cGNoID0gcGNpY29yZV9pbml0KCZzaWktPnB1Yiwgc2lpLT5pY2J1cy0+ZHJ2X3BjaS5jb3JlKTsKKwkJaWYgKHNpaS0+cGNoID09IE5VTEwpCisJCQlyZXR1cm4gZmFsc2U7CiAJfQotCWlmIChhaV9wY2lfZml4Y2ZnKCZzaWktPnB1YikpIHsKLQkJLyogc2lfZG9hdHRhY2g6IHNpX3BjaV9maXhjZmcgZmFpbGVkICovCisJaWYgKGFpX3BjaV9maXhjZmcoJnNpaS0+cHViKSkKIAkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIHJldHVybiB0byB0aGUgb3JpZ2luYWwgY29yZSAqLwotCWFpX3NldGNvcmVpZHgoJnNpaS0+cHViLCAqb3JpZ2lkeCk7CiAKIAlyZXR1cm4gdHJ1ZTsKIH0KQEAgLTEwMTcsMzkgKzU1MSwyNyBAQAogCXVpbnQgdyA9IDA7CiAKIAkvKiBkbyBhIHBjaSBjb25maWcgcmVhZCB0byBnZXQgc3Vic3lzdGVtIGlkIGFuZCBzdWJ2ZW5kb3IgaWQgKi8KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJncpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPnBjaWJ1cywgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZ3KTsKIAogCXNpaS0+cHViLmJvYXJkdmVuZG9yID0gdyAmIDB4ZmZmZjsKIAlzaWktPnB1Yi5ib2FyZHR5cGUgPSAodyA+PiAxNikgJiAweGZmZmY7Ci0Jc2lpLT5wdWIuYm9hcmRmbGFncyA9IGdldGludHZhcigmc2lpLT5wdWIsIEJSQ01TX1NST01fQk9BUkRGTEFHUyk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgc2lfaW5mbyAqYWlfZG9hdHRhY2goc3RydWN0IHNpX2luZm8gKnNpaSwKLQkJCQkgICB2b2lkIF9faW9tZW0gKnJlZ3MsIHN0cnVjdCBwY2lfZGV2ICpwYnVzKQorCQkJCSAgIHN0cnVjdCBiY21hX2J1cyAqcGJ1cykKIHsKIAlzdHJ1Y3Qgc2lfcHViICpzaWggPSAmc2lpLT5wdWI7CiAJdTMyIHcsIHNhdmV3aW47Ci0Jc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYzsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjOwogCXVpbnQgc29jaXR5cGU7Ci0JdWludCBvcmlnaWR4OwotCi0JbWVtc2V0KCh1bnNpZ25lZCBjaGFyICopIHNpaSwgMCwgc2l6ZW9mKHN0cnVjdCBzaV9pbmZvKSk7CiAKIAlzYXZld2luID0gMDsKIAotCXNpaC0+YnVzY29yZWlkeCA9IEJBRElEWDsKKwlzaWktPmljYnVzID0gcGJ1czsKKwlzaWktPnBjaWJ1cyA9IHBidXMtPmhvc3RfcGNpOwogCi0Jc2lpLT5jdXJtYXAgPSByZWdzOwotCXNpaS0+cGJ1cyA9IHBidXM7Ci0KLQkvKiBmaW5kIENoaXBjb21tb24gYWRkcmVzcyAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9CQVIwX1dJTiwgJnNhdmV3aW4pOwotCWlmICghR09PRENPUkVBRERSKHNhdmV3aW4sIFNJX0VOVU1fQkFTRSkpCi0JCXNhdmV3aW4gPSBTSV9FTlVNX0JBU0U7Ci0KLQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0JBUjBfV0lOLAotCQkJICAgICAgIFNJX0VOVU1fQkFTRSk7Ci0JY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopIHJlZ3M7CisJLyogc3dpdGNoIHRvIENoaXBjb21tb24gY29yZSAqLworCWNjID0gcGJ1cy0+ZHJ2X2NjLmNvcmU7CiAKIAkvKiBidXMvY29yZS9jbGsgc2V0dXAgZm9yIHJlZ2lzdGVyIGFjY2VzcyAqLwogCWlmICghYWlfYnVzY29yZV9wcmVwKHNpaSkpCkBAIC0xMDYyLDk0ICs1ODQsNzQgQEAKIAkgKiAgIGhvc3RzIHcvbyBjaGlwY29tbW9uKSwgc29tZSB3YXkgb2YgcmVjb2duaXppbmcgdGhlbSBuZWVkcyB0bwogCSAqICAgYmUgYWRkZWQgaGVyZS4KIAkgKi8KLQl3ID0gUl9SRUcoJmNjLT5jaGlwaWQpOworCXcgPSBiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKGNoaXBpZCkpOwogCXNvY2l0eXBlID0gKHcgJiBDSURfVFlQRV9NQVNLKSA+PiBDSURfVFlQRV9TSElGVDsKIAkvKiBNaWdodCBhcyB3bGwgZmlsbCBpbiBjaGlwIGlkIHJldiAmIHBrZyAqLwogCXNpaC0+Y2hpcCA9IHcgJiBDSURfSURfTUFTSzsKIAlzaWgtPmNoaXByZXYgPSAodyAmIENJRF9SRVZfTUFTSykgPj4gQ0lEX1JFVl9TSElGVDsKIAlzaWgtPmNoaXBwa2cgPSAodyAmIENJRF9QS0dfTUFTSykgPj4gQ0lEX1BLR19TSElGVDsKIAotCXNpaC0+aXNzaW0gPSBmYWxzZTsKLQogCS8qIHNjYW4gZm9yIGNvcmVzICovCi0JaWYgKHNvY2l0eXBlID09IFNPQ0lfQUkpIHsKLQkJU0lfTVNHKCgiRm91bmQgY2hpcCB0eXBlIEFJICgweCUwOHgpXG4iLCB3KSk7Ci0JCS8qIHBhc3MgY2hpcGMgYWRkcmVzcyBpbnN0ZWFkIG9mIG9yaWdpbmFsIGNvcmUgYmFzZSAqLwotCQlhaV9zY2FuKCZzaWktPnB1YiwgY2MpOwotCX0gZWxzZSB7Ci0JCS8qIEZvdW5kIGNoaXAgb2YgdW5rbm93biB0eXBlICovCi0JCXJldHVybiBOVUxMOwotCX0KLQkvKiBubyBjb3JlcyBmb3VuZCwgYmFpbCBvdXQgKi8KLQlpZiAoc2lpLT5udW1jb3JlcyA9PSAwKQorCWlmIChzb2NpdHlwZSAhPSBTT0NJX0FJKQogCQlyZXR1cm4gTlVMTDsKIAotCS8qIGJ1cy9jb3JlL2NsayBzZXR1cCAqLwotCW9yaWdpZHggPSBTSV9DQ19JRFg7Ci0JaWYgKCFhaV9idXNjb3JlX3NldHVwKHNpaSwgc2F2ZXdpbiwgJm9yaWdpZHgpKQorCVNJX01TRygiRm91bmQgY2hpcCB0eXBlIEFJICgweCUwOHgpXG4iLCB3KTsKKwlpZiAoIWFpX2J1c2NvcmVfc2V0dXAoc2lpLCBjYykpCiAJCWdvdG8gZXhpdDsKIAogCS8qIEluaXQgbnZyYW0gZnJvbSBzcHJvbS9vdHAgaWYgdGhleSBleGlzdCAqLwotCWlmIChzcm9tX3Zhcl9pbml0KCZzaWktPnB1YiwgY2MpKQorCWlmIChzcm9tX3Zhcl9pbml0KCZzaWktPnB1YikpCiAJCWdvdG8gZXhpdDsKIAogCWFpX252cmFtX3Byb2Nlc3Moc2lpKTsKIAogCS8qID09PSBOVlJBTSwgY2xvY2sgaXMgcmVhZHkgPT09ICovCi0JY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopIGFpX3NldGNvcmUoc2loLCBDQ19DT1JFX0lELCAwKTsKLQlXX1JFRygmY2MtPmdwaW9wdWxsdXAsIDApOwotCVdfUkVHKCZjYy0+Z3Bpb3B1bGxkb3duLCAwKTsKLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CisJYmNtYV93cml0ZTMyKGNjLCBDSElQQ1JFR09GRlMoZ3Bpb3B1bGx1cCksIDApOworCWJjbWFfd3JpdGUzMihjYywgQ0hJUENSRUdPRkZTKGdwaW9wdWxsZG93biksIDApOwogCiAJLyogUE1VIHNwZWNpZmljIGluaXRpYWxpemF0aW9ucyAqLwotCWlmIChzaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpIHsKLQkJdTMyIHh0YWxmcmVxOworCWlmIChhaV9nZXRfY2NjYXBzKHNpaCkgJiBDQ19DQVBfUE1VKSB7CiAJCXNpX3BtdV9pbml0KHNpaCk7Ci0JCXNpX3BtdV9jaGlwX2luaXQoc2loKTsKLQotCQl4dGFsZnJlcSA9IHNpX3BtdV9tZWFzdXJlX2FscGNsayhzaWgpOwotCQlzaV9wbXVfcGxsX2luaXQoc2loLCB4dGFsZnJlcSk7CisJCSh2b2lkKXNpX3BtdV9tZWFzdXJlX2FscGNsayhzaWgpOwogCQlzaV9wbXVfcmVzX2luaXQoc2loKTsKLQkJc2lfcG11X3N3cmVnX2luaXQoc2loKTsKIAl9CiAKIAkvKiBzZXR1cCB0aGUgR1BJTyBiYXNlZCBMRUQgcG93ZXJzYXZlIHJlZ2lzdGVyICovCiAJdyA9IGdldGludHZhcihzaWgsIEJSQ01TX1NST01fTEVEREMpOwogCWlmICh3ID09IDApCiAJCXcgPSBERUZBVUxUX0dQSU9USU1FUlZBTDsKLQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvdGltZXJ2YWwpLAotCQkgICB+MCwgdyk7CisJYWlfY2NfcmVnKHNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZ3Bpb3RpbWVydmFsKSwKKwkJICB+MCwgdyk7CiAKLQlpZiAoUENJRShzaWkpKQorCWlmIChQQ0lFKHNpaCkpCiAJCXBjaWNvcmVfYXR0YWNoKHNpaS0+cGNoLCBTSV9ET0FUVEFDSCk7CiAKLQlpZiAoc2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHsKKwlpZiAoYWlfZ2V0X2NoaXBfaWQoc2loKSA9PSBCQ000MzIyNF9DSElQX0lEKSB7CiAJCS8qCiAJCSAqIGVuYWJsZSAxMiBtQSBkcml2ZSBzdHJlbnRoIGZvciA0MzIyNCBhbmQKIAkJICogc2V0IGNoaXBDb250cm9sIHJlZ2lzdGVyIGJpdCAxNQogCQkgKi8KLQkJaWYgKHNpaC0+Y2hpcHJldiA9PSAwKSB7Ci0JCQlTSV9NU0coKCJBcHBseWluZyA0MzIyNEEwIFdBUnNcbiIpKTsKLQkJCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2wpLAotCQkJCSAgIENDVFJMNDMyMjRfR1BJT19UT0dHTEUsCi0JCQkJICAgQ0NUUkw0MzIyNF9HUElPX1RPR0dMRSk7CisJCWlmIChhaV9nZXRfY2hpcHJldihzaWgpID09IDApIHsKKwkJCVNJX01TRygiQXBwbHlpbmcgNDMyMjRBMCBXQVJzXG4iKTsKKwkJCWFpX2NjX3JlZyhzaWgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sKSwKKwkJCQkgIENDVFJMNDMyMjRfR1BJT19UT0dHTEUsCisJCQkJICBDQ1RSTDQzMjI0X0dQSU9fVE9HR0xFKTsKIAkJCXNpX3BtdV9jaGlwY29udHJvbChzaWgsIDAsIENDVFJMXzQzMjI0QTBfMTJNQV9MRURfRFJJVkUsCiAJCQkJCSAgIENDVFJMXzQzMjI0QTBfMTJNQV9MRURfRFJJVkUpOwogCQl9Ci0JCWlmIChzaWgtPmNoaXByZXYgPj0gMSkgewotCQkJU0lfTVNHKCgiQXBwbHlpbmcgNDMyMjRCMCsgV0FSc1xuIikpOworCQlpZiAoYWlfZ2V0X2NoaXByZXYoc2loKSA+PSAxKSB7CisJCQlTSV9NU0coIkFwcGx5aW5nIDQzMjI0QjArIFdBUnNcbiIpOwogCQkJc2lfcG11X2NoaXBjb250cm9sKHNpaCwgMCwgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSwKIAkJCQkJICAgQ0NUUkxfNDMyMjRCMF8xMk1BX0xFRF9EUklWRSk7CiAJCX0KIAl9CiAKLQlpZiAoc2loLT5jaGlwID09IEJDTTQzMTNfQ0hJUF9JRCkgeworCWlmIChhaV9nZXRfY2hpcF9pZChzaWgpID09IEJDTTQzMTNfQ0hJUF9JRCkgewogCQkvKgogCQkgKiBlbmFibGUgMTIgbUEgZHJpdmUgc3RyZW50aCBmb3IgNDMxMyBhbmQKIAkJICogc2V0IGNoaXBDb250cm9sIHJlZ2lzdGVyIGJpdCAxCiAJCSAqLwotCQlTSV9NU0coKCJBcHBseWluZyA0MzEzIFdBUnNcbiIpKTsKKwkJU0lfTVNHKCJBcHBseWluZyA0MzEzIFdBUnNcbiIpOwogCQlzaV9wbXVfY2hpcGNvbnRyb2woc2loLCAwLCBDQ1RSTF80MzEzXzEyTUFfTEVEX0RSSVZFLAogCQkJCSAgIENDVFJMXzQzMTNfMTJNQV9MRURfRFJJVkUpOwogCX0KQEAgLTExNjUsMjIgKzY2NywxOSBAQAogfQogCiAvKgotICogQWxsb2NhdGUgYSBzaSBoYW5kbGUuCi0gKiBkZXZpZCAtIHBjaSBkZXZpY2UgaWQgKHVzZWQgdG8gZGV0ZXJtaW5lIGNoaXAjKQotICogb3NoIC0gb3BhcXVlIE9TIGhhbmRsZQotICogcmVncyAtIHZpcnR1YWwgYWRkcmVzcyBvZiBpbml0aWFsIGNvcmUgcmVnaXN0ZXJzCisgKiBBbGxvY2F0ZSBhIHNpIGhhbmRsZSBhbmQgZG8gdGhlIGF0dGFjaC4KICAqLwogc3RydWN0IHNpX3B1YiAqCi1haV9hdHRhY2godm9pZCBfX2lvbWVtICpyZWdzLCBzdHJ1Y3QgcGNpX2RldiAqc2RoKQorYWlfYXR0YWNoKHN0cnVjdCBiY21hX2J1cyAqcGJ1cykKIHsKIAlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwogCiAJLyogYWxsb2Mgc3RydWN0IHNpX2luZm8gKi8KLQlzaWkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2lfaW5mbyksIEdGUF9BVE9NSUMpOworCXNpaSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBzaV9pbmZvKSwgR0ZQX0FUT01JQyk7CiAJaWYgKHNpaSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWlmIChhaV9kb2F0dGFjaChzaWksIHJlZ3MsIHNkaCkgPT0gTlVMTCkgeworCWlmIChhaV9kb2F0dGFjaChzaWksIHBidXMpID09IE5VTEwpIHsKIAkJa2ZyZWUoc2lpKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQpAQCAtMTIwOSwyOTIgKzcwOCw2NiBAQAogCWtmcmVlKHNpaSk7CiB9CiAKLS8qIHJlZ2lzdGVyIGRyaXZlciBpbnRlcnJ1cHQgZGlzYWJsaW5nIGFuZCByZXN0b3JpbmcgY2FsbGJhY2sgZnVuY3Rpb25zICovCi12b2lkCi1haV9yZWdpc3Rlcl9pbnRyX2NhbGxiYWNrKHN0cnVjdCBzaV9wdWIgKnNpaCwgdm9pZCAqaW50cnNvZmZfZm4sCi0JCQkgIHZvaWQgKmludHJzcmVzdG9yZV9mbiwKLQkJCSAgdm9pZCAqaW50cnNlbmFibGVkX2ZuLCB2b2lkICppbnRyX2FyZykKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCXNpaS0+aW50cl9hcmcgPSBpbnRyX2FyZzsKLQlzaWktPmludHJzb2ZmX2ZuID0gKHUzMiAoKikodm9pZCAqKSkgaW50cnNvZmZfZm47Ci0Jc2lpLT5pbnRyc3Jlc3RvcmVfZm4gPSAodm9pZCAoKikgKHZvaWQgKiwgdTMyKSkgaW50cnNyZXN0b3JlX2ZuOwotCXNpaS0+aW50cnNlbmFibGVkX2ZuID0gKGJvb2wgKCopKHZvaWQgKikpIGludHJzZW5hYmxlZF9mbjsKLQkvKiBzYXZlIGN1cnJlbnQgY29yZSBpZC4gIHdoZW4gdGhpcyBmdW5jdGlvbiBjYWxsZWQsIHRoZSBjdXJyZW50IGNvcmUKLQkgKiBtdXN0IGJlIHRoZSBjb3JlIHdoaWNoIHByb3ZpZGVzIGRyaXZlciBmdW5jdGlvbnMoaWwsIGV0LCB3bCwgZXRjLikKLQkgKi8KLQlzaWktPmRldl9jb3JlaWQgPSBzaWktPmNvcmVpZFtzaWktPmN1cmlkeF07Ci19Ci0KLXZvaWQgYWlfZGVyZWdpc3Rlcl9pbnRyX2NhbGxiYWNrKHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCXNpaS0+aW50cnNvZmZfZm4gPSBOVUxMOwotfQotCi11aW50IGFpX2NvcmVpZChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQlyZXR1cm4gc2lpLT5jb3JlaWRbc2lpLT5jdXJpZHhdOwotfQotCi11aW50IGFpX2NvcmVpZHgoc3RydWN0IHNpX3B1YiAqc2loKQotewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0KLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0JcmV0dXJuIHNpaS0+Y3VyaWR4OwotfQotCi1ib29sIGFpX2JhY2twbGFuZTY0KHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQlyZXR1cm4gKHNpaC0+Y2NjYXBzICYgQ0NfQ0FQX0JLUExONjQpICE9IDA7Ci19Ci0KIC8qIHJldHVybiBpbmRleCBvZiBjb3JlaWQgb3IgQkFESURYIGlmIG5vdCBmb3VuZCAqLwotdWludCBhaV9maW5kY29yZWlkeChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkLCB1aW50IGNvcmV1bml0KQorc3RydWN0IGJjbWFfZGV2aWNlICphaV9maW5kY29yZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHUxNiBjb3JlaWQsIHUxNiBjb3JldW5pdCkKIHsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmU7CiAJc3RydWN0IHNpX2luZm8gKnNpaTsKIAl1aW50IGZvdW5kOwotCXVpbnQgaTsKIAogCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKIAogCWZvdW5kID0gMDsKIAotCWZvciAoaSA9IDA7IGkgPCBzaWktPm51bWNvcmVzOyBpKyspCi0JCWlmIChzaWktPmNvcmVpZFtpXSA9PSBjb3JlaWQpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvcmUsICZzaWktPmljYnVzLT5jb3JlcywgbGlzdCkKKwkJaWYgKGNvcmUtPmlkLmlkID09IGNvcmVpZCkgewogCQkJaWYgKGZvdW5kID09IGNvcmV1bml0KQotCQkJCXJldHVybiBpOworCQkJCXJldHVybiBjb3JlOwogCQkJZm91bmQrKzsKIAkJfQogCi0JcmV0dXJuIEJBRElEWDsKKwlyZXR1cm4gTlVMTDsKIH0KIAogLyoKLSAqIFRoaXMgZnVuY3Rpb24gY2hhbmdlcyBsb2dpY2FsICJmb2N1cyIgdG8gdGhlIGluZGljYXRlZCBjb3JlOwotICogbXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KLSAqIE1vcmVvdmVyLCBjYWxsZXJzIHNob3VsZCBrZWVwIGludGVycnVwdHMgb2ZmIGR1cmluZyBzd2l0Y2hpbmcKLSAqIG91dCBvZiBhbmQgYmFjayB0byBkMTEgY29yZS4KKyAqIHJlYWQvbW9kaWZ5IGNoaXBjb21tb24gY29yZSByZWdpc3Rlci4KICAqLwotdm9pZCBfX2lvbWVtICphaV9zZXRjb3JlKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBjb3JlaWQsIHVpbnQgY29yZXVuaXQpCit1aW50IGFpX2NjX3JlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgcmVnb2ZmLCB1MzIgbWFzaywgdTMyIHZhbCkKIHsKLQl1aW50IGlkeDsKLQotCWlkeCA9IGFpX2ZpbmRjb3JlaWR4KHNpaCwgY29yZWlkLCBjb3JldW5pdCk7Ci0JaWYgKGlkeCA+PSBTSV9NQVhDT1JFUykKLQkJcmV0dXJuIE5VTEw7Ci0KLQlyZXR1cm4gYWlfc2V0Y29yZWlkeChzaWgsIGlkeCk7Ci19Ci0KLS8qIFR1cm4gb2ZmIGludGVycnVwdCBhcyByZXF1aXJlZCBieSBhaV9zZXRjb3JlLCBiZWZvcmUgc3dpdGNoIGNvcmUgKi8KLXZvaWQgX19pb21lbSAqYWlfc3dpdGNoX2NvcmUoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZCwgdWludCAqb3JpZ2lkeCwKLQkJCSAgICAgdWludCAqaW50cl92YWwpCi17Ci0Jdm9pZCBfX2lvbWVtICpjYzsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjOworCXUzMiB3OwogCXN0cnVjdCBzaV9pbmZvICpzaWk7CiAKIAlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0KLQlpZiAoU0lfRkFTVChzaWkpKSB7Ci0JCS8qIE92ZXJsb2FkaW5nIHRoZSBvcmlnaWR4IHZhcmlhYmxlIHRvIHJlbWVtYmVyIHRoZSBjb3JlaWQsCi0JCSAqIHRoaXMgd29ya3MgYmVjYXVzZSB0aGUgY29yZSBpZHMgY2Fubm90IGJlIGNvbmZ1c2VkIHdpdGgKLQkJICogY29yZSBpbmRpY2VzLgotCQkgKi8KLQkJKm9yaWdpZHggPSBjb3JlaWQ7Ci0JCWlmIChjb3JlaWQgPT0gQ0NfQ09SRV9JRCkKLQkJCXJldHVybiBDQ1JFR1NfRkFTVChzaWkpOwotCQllbHNlIGlmIChjb3JlaWQgPT0gc2loLT5idXNjb3JldHlwZSkKLQkJCXJldHVybiBQQ0lFUkVHUyhzaWkpOwotCX0KLQlJTlRSX09GRihzaWksICppbnRyX3ZhbCk7Ci0JKm9yaWdpZHggPSBzaWktPmN1cmlkeDsKLQljYyA9IGFpX3NldGNvcmUoc2loLCBjb3JlaWQsIDApOwotCXJldHVybiBjYzsKLX0KLQotLyogcmVzdG9yZSBjb3JlaWR4IGFuZCByZXN0b3JlIGludGVycnVwdCAqLwotdm9pZCBhaV9yZXN0b3JlX2NvcmUoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZCwgdWludCBpbnRyX3ZhbCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCWlmIChTSV9GQVNUKHNpaSkKLQkgICAgJiYgKChjb3JlaWQgPT0gQ0NfQ09SRV9JRCkgfHwgKGNvcmVpZCA9PSBzaWgtPmJ1c2NvcmV0eXBlKSkpCi0JCXJldHVybjsKLQotCWFpX3NldGNvcmVpZHgoc2loLCBjb3JlaWQpOwotCUlOVFJfUkVTVE9SRShzaWksIGludHJfdmFsKTsKLX0KLQotdm9pZCBhaV93cml0ZV93cmFwcGVycmVnKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIG9mZnNldCwgdTMyIHZhbCkKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCXUzMiAqdyA9ICh1MzIgKikgc2lpLT5jdXJ3cmFwOwotCVdfUkVHKHcgKyAob2Zmc2V0IC8gNCksIHZhbCk7Ci0JcmV0dXJuOwotfQotCi0vKgotICogU3dpdGNoIHRvICdjb3JlaWR4JywgaXNzdWUgYSBzaW5nbGUgYXJiaXRyYXJ5IDMyYml0IHJlZ2lzdGVyIG1hc2smc2V0Ci0gKiBvcGVyYXRpb24sIHN3aXRjaCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb3JlLCBhbmQgcmV0dXJuIHRoZSBuZXcgdmFsdWUuCi0gKgotICogV2hlbiB1c2luZyB0aGUgc2lsaWNvbiBiYWNrcGxhbmUsIG5vIGZpZGRsaW5nIHdpdGggaW50ZXJydXB0cyBvciBjb3JlCi0gKiBzd2l0Y2hlcyBpcyBuZWVkZWQuCi0gKgotICogQWxzbywgd2hlbiB1c2luZyBwY2kvcGNpZSwgd2UgY2FuIG9wdGltaXplIGF3YXkgdGhlIGNvcmUgc3dpdGNoaW5nIGZvciBwY2kKLSAqIHJlZ2lzdGVycyBhbmQgKG9uIG5ld2VyIHBjaSBjb3JlcykgY2hpcGNvbW1vbiByZWdpc3RlcnMuCi0gKi8KLXVpbnQgYWlfY29yZXJlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkeCwgdWludCByZWdvZmYsIHVpbnQgbWFzaywKLQkJdWludCB2YWwpCi17Ci0JdWludCBvcmlnaWR4ID0gMDsKLQl1MzIgX19pb21lbSAqciA9IE5VTEw7Ci0JdWludCB3OwotCXVpbnQgaW50cl92YWwgPSAwOwotCWJvb2wgZmFzdCA9IGZhbHNlOwotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0KLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0KLQlpZiAoY29yZWlkeCA+PSBTSV9NQVhDT1JFUykKLQkJcmV0dXJuIDA7Ci0KLQkvKgotCSAqIElmIHBjaS9wY2llLCB3ZSBjYW4gZ2V0IGF0IHBjaS9wY2llIHJlZ3MKLQkgKiBhbmQgb24gbmV3ZXIgY29yZXMgdG8gY2hpcGMKLQkgKi8KLQlpZiAoKHNpaS0+Y29yZWlkW2NvcmVpZHhdID09IENDX0NPUkVfSUQpICYmIFNJX0ZBU1Qoc2lpKSkgewotCQkvKiBDaGlwYyByZWdpc3RlcnMgYXJlIG1hcHBlZCBhdCAxMktCICovCi0JCWZhc3QgPSB0cnVlOwotCQlyID0gKHUzMiBfX2lvbWVtICopKChfX2lvbWVtIGNoYXIgKilzaWktPmN1cm1hcCArCi0JCQkJICAgIFBDSV8xNktCMF9DQ1JFR1NfT0ZGU0VUICsgcmVnb2ZmKTsKLQl9IGVsc2UgaWYgKHNpaS0+cHViLmJ1c2NvcmVpZHggPT0gY29yZWlkeCkgewotCQkvKgotCQkgKiBwY2kgcmVnaXN0ZXJzIGFyZSBhdCBlaXRoZXIgaW4gdGhlIGxhc3QgMktCIG9mCi0JCSAqIGFuIDhLQiB3aW5kb3cgb3IsIGluIHBjaWUgYW5kIHBjaSByZXYgMTMgYXQgOEtCCi0JCSAqLwotCQlmYXN0ID0gdHJ1ZTsKLQkJaWYgKFNJX0ZBU1Qoc2lpKSkKLQkJCXIgPSAodTMyIF9faW9tZW0gKikoKF9faW9tZW0gY2hhciAqKXNpaS0+Y3VybWFwICsKLQkJCQkgICAgUENJXzE2S0IwX1BDSVJFR1NfT0ZGU0VUICsgcmVnb2ZmKTsKLQkJZWxzZQotCQkJciA9ICh1MzIgX19pb21lbSAqKSgoX19pb21lbSBjaGFyICopc2lpLT5jdXJtYXAgKwotCQkJCSAgICAoKHJlZ29mZiA+PSBTQkNPTkZJR09GRikgPwotCQkJCSAgICAgIFBDSV9CQVIwX1BDSVNCUl9PRkZTRVQgOgotCQkJCSAgICAgIFBDSV9CQVIwX1BDSVJFR1NfT0ZGU0VUKSArIHJlZ29mZik7Ci0JfQotCi0JaWYgKCFmYXN0KSB7Ci0JCUlOVFJfT0ZGKHNpaSwgaW50cl92YWwpOwotCi0JCS8qIHNhdmUgY3VycmVudCBjb3JlIGluZGV4ICovCi0JCW9yaWdpZHggPSBhaV9jb3JlaWR4KCZzaWktPnB1Yik7Ci0KLQkJLyogc3dpdGNoIGNvcmUgKi8KLQkJciA9ICh1MzIgX19pb21lbSAqKSAoKHVuc2lnbmVkIGNoYXIgX19pb21lbSAqKQotCQkJYWlfc2V0Y29yZWlkeCgmc2lpLT5wdWIsIGNvcmVpZHgpICsgcmVnb2ZmKTsKLQl9CisJY2MgPSBzaWktPmljYnVzLT5kcnZfY2MuY29yZTsKIAogCS8qIG1hc2sgYW5kIHNldCAqLwogCWlmIChtYXNrIHx8IHZhbCkgewotCQl3ID0gKFJfUkVHKHIpICYgfm1hc2spIHwgdmFsOwotCQlXX1JFRyhyLCB3KTsKKwkJYmNtYV9tYXNrc2V0MzIoY2MsIHJlZ29mZiwgfm1hc2ssIHZhbCk7CiAJfQogCiAJLyogcmVhZGJhY2sgKi8KLQl3ID0gUl9SRUcocik7Ci0KLQlpZiAoIWZhc3QpIHsKLQkJLyogcmVzdG9yZSBjb3JlIGluZGV4ICovCi0JCWlmIChvcmlnaWR4ICE9IGNvcmVpZHgpCi0JCQlhaV9zZXRjb3JlaWR4KCZzaWktPnB1Yiwgb3JpZ2lkeCk7Ci0KLQkJSU5UUl9SRVNUT1JFKHNpaSwgaW50cl92YWwpOwotCX0KKwl3ID0gYmNtYV9yZWFkMzIoY2MsIHJlZ29mZik7CiAKIAlyZXR1cm4gdzsKIH0KIAotdm9pZCBhaV9jb3JlX2Rpc2FibGUoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgYml0cykKLXsKLQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCXUzMiBkdW1teTsKLQlzdHJ1Y3QgYWlkbXAgKmFpOwotCi0Jc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwotCi0JYWkgPSBzaWktPmN1cndyYXA7Ci0KLQkvKiBpZiBjb3JlIGlzIGFscmVhZHkgaW4gcmVzZXQsIGp1c3QgcmV0dXJuICovCi0JaWYgKFJfUkVHKCZhaS0+cmVzZXRjdHJsKSAmIEFJUkNfUkVTRVQpCi0JCXJldHVybjsKLQotCVdfUkVHKCZhaS0+aW9jdHJsLCBiaXRzKTsKLQlkdW1teSA9IFJfUkVHKCZhaS0+aW9jdHJsKTsKLQl1ZGVsYXkoMTApOwotCi0JV19SRUcoJmFpLT5yZXNldGN0cmwsIEFJUkNfUkVTRVQpOwotCXVkZWxheSgxKTsKLX0KLQotLyogcmVzZXQgYW5kIHJlLWVuYWJsZSBhIGNvcmUKLSAqIGlucHV0czoKLSAqIGJpdHMgLSBjb3JlIHNwZWNpZmljIGJpdHMgdGhhdCBhcmUgc2V0IGR1cmluZyBhbmQgYWZ0ZXIgcmVzZXQgc2VxdWVuY2UKLSAqIHJlc2V0Yml0cyAtIGNvcmUgc3BlY2lmaWMgYml0cyB0aGF0IGFyZSBzZXQgb25seSBkdXJpbmcgcmVzZXQgc2VxdWVuY2UKLSAqLwotdm9pZCBhaV9jb3JlX3Jlc2V0KHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIGJpdHMsIHUzMiByZXNldGJpdHMpCi17Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQlzdHJ1Y3QgYWlkbXAgKmFpOwotCXUzMiBkdW1teTsKLQotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQlhaSA9IHNpaS0+Y3Vyd3JhcDsKLQotCS8qCi0JICogTXVzdCBkbyB0aGUgZGlzYWJsZSBzZXF1ZW5jZSBmaXJzdCB0byB3b3JrCi0JICogZm9yIGFyYml0cmFyeSBjdXJyZW50IGNvcmUgc3RhdGUuCi0JICovCi0JYWlfY29yZV9kaXNhYmxlKHNpaCwgKGJpdHMgfCByZXNldGJpdHMpKTsKLQotCS8qCi0JICogTm93IGRvIHRoZSBpbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4KLQkgKi8KLQlXX1JFRygmYWktPmlvY3RybCwgKGJpdHMgfCBTSUNGX0ZHQyB8IFNJQ0ZfQ0xPQ0tfRU4pKTsKLQlkdW1teSA9IFJfUkVHKCZhaS0+aW9jdHJsKTsKLQlXX1JFRygmYWktPnJlc2V0Y3RybCwgMCk7Ci0JdWRlbGF5KDEpOwotCi0JV19SRUcoJmFpLT5pb2N0cmwsIChiaXRzIHwgU0lDRl9DTE9DS19FTikpOwotCWR1bW15ID0gUl9SRUcoJmFpLT5pb2N0cmwpOwotCXVkZWxheSgxKTsKLX0KLQogLyogcmV0dXJuIHRoZSBzbG93IGNsb2NrIHNvdXJjZSAtIExQTywgWFRBTCwgb3IgUENJICovCi1zdGF0aWMgdWludCBhaV9zbG93Y2xrX3NyYyhzdHJ1Y3Qgc2lfaW5mbyAqc2lpKQorc3RhdGljIHVpbnQgYWlfc2xvd2Nsa19zcmMoc3RydWN0IHNpX3B1YiAqc2loLCBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjKQogewotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7CisJc3RydWN0IHNpX2luZm8gKnNpaTsKIAl1MzIgdmFsOwogCi0JaWYgKHNpaS0+cHViLmNjcmV2IDwgNikgewotCQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfR1BJT19PVVQsCisJc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOworCWlmIChhaV9nZXRfY2NyZXYoJnNpaS0+cHViKSA8IDYpIHsKKwkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGNpYnVzLCBQQ0lfR1BJT19PVVQsCiAJCQkJICAgICAgJnZhbCk7CiAJCWlmICh2YWwgJiBQQ0lfQ0ZHX0dQSU9fU0NTKQogCQkJcmV0dXJuIFNDQ19TU19QQ0k7CiAJCXJldHVybiBTQ0NfU1NfWFRBTDsKLQl9IGVsc2UgaWYgKHNpaS0+cHViLmNjcmV2IDwgMTApIHsKLQkJY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopCi0JCQlhaV9zZXRjb3JlaWR4KCZzaWktPnB1Yiwgc2lpLT5jdXJpZHgpOwotCQlyZXR1cm4gUl9SRUcoJmNjLT5zbG93X2Nsa19jdGwpICYgU0NDX1NTX01BU0s7CisJfSBlbHNlIGlmIChhaV9nZXRfY2NyZXYoJnNpaS0+cHViKSA8IDEwKSB7CisJCXJldHVybiBiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKHNsb3dfY2xrX2N0bCkpICYKKwkJICAgICAgIFNDQ19TU19NQVNLOwogCX0gZWxzZQkJCS8qIEluc3RhLWNsb2NrICovCiAJCXJldHVybiBTQ0NfU1NfWFRBTDsKIH0KQEAgLTE1MDMsMjQgKzc3NiwyNCBAQAogKiByZXR1cm4gdGhlIElMUCAoc2xvd2Nsb2NrKSBtaW4gb3IgbWF4IGZyZXF1ZW5jeQogKiBwcmVjb25kaXRpb246IHdlJ3ZlIGVzdGFibGlzaGVkIHRoZSBjaGlwIGhhcyBkeW5hbWljIGNsayBjb250cm9sCiAqLwotc3RhdGljIHVpbnQgYWlfc2xvd2Nsa19mcmVxKHN0cnVjdCBzaV9pbmZvICpzaWksIGJvb2wgbWF4X2ZyZXEsCi0JCQkgICAgc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYykKK3N0YXRpYyB1aW50IGFpX3Nsb3djbGtfZnJlcShzdHJ1Y3Qgc2lfcHViICpzaWgsIGJvb2wgbWF4X2ZyZXEsCisJCQkgICAgc3RydWN0IGJjbWFfZGV2aWNlICpjYykKIHsKIAl1MzIgc2xvd2NsazsKIAl1aW50IGRpdjsKIAotCXNsb3djbGsgPSBhaV9zbG93Y2xrX3NyYyhzaWkpOwotCWlmIChzaWktPnB1Yi5jY3JldiA8IDYpIHsKKwlzbG93Y2xrID0gYWlfc2xvd2Nsa19zcmMoc2loLCBjYyk7CisJaWYgKGFpX2dldF9jY3JldihzaWgpIDwgNikgewogCQlpZiAoc2xvd2NsayA9PSBTQ0NfU1NfUENJKQogCQkJcmV0dXJuIG1heF9mcmVxID8gKFBDSU1BWEZSRVEgLyA2NCkKIAkJCQk6IChQQ0lNSU5GUkVRIC8gNjQpOwogCQllbHNlCiAJCQlyZXR1cm4gbWF4X2ZyZXEgPyAoWFRBTE1BWEZSRVEgLyAzMikKIAkJCQk6IChYVEFMTUlORlJFUSAvIDMyKTsKLQl9IGVsc2UgaWYgKHNpaS0+cHViLmNjcmV2IDwgMTApIHsKKwl9IGVsc2UgaWYgKGFpX2dldF9jY3JldihzaWgpIDwgMTApIHsKIAkJZGl2ID0gNCAqCi0JCSAgICAoKChSX1JFRygmY2MtPnNsb3dfY2xrX2N0bCkgJiBTQ0NfQ0RfTUFTSykgPj4KLQkJICAgICAgU0NDX0NEX1NISUZUKSArIDEpOworCQkgICAgKCgoYmNtYV9yZWFkMzIoY2MsIENISVBDUkVHT0ZGUyhzbG93X2Nsa19jdGwpKSAmCisJCSAgICAgIFNDQ19DRF9NQVNLKSA+PiBTQ0NfQ0RfU0hJRlQpICsgMSk7CiAJCWlmIChzbG93Y2xrID09IFNDQ19TU19MUE8pCiAJCQlyZXR1cm4gbWF4X2ZyZXEgPyBMUE9NQVhGUkVRIDogTFBPTUlORlJFUTsKIAkJZWxzZSBpZiAoc2xvd2NsayA9PSBTQ0NfU1NfWFRBTCkKQEAgLTE1MzEsMTUgKzgwNCwxNSBAQAogCQkJCTogKFBDSU1JTkZSRVEgLyBkaXYpOwogCX0gZWxzZSB7CiAJCS8qIENoaXBjIHJldiAxMCBpcyBJbnN0YUNsb2NrICovCi0JCWRpdiA9IFJfUkVHKCZjYy0+c3lzdGVtX2Nsa19jdGwpID4+IFNZQ0NfQ0RfU0hJRlQ7Ci0JCWRpdiA9IDQgKiAoZGl2ICsgMSk7CisJCWRpdiA9IGJjbWFfcmVhZDMyKGNjLCBDSElQQ1JFR09GRlMoc3lzdGVtX2Nsa19jdGwpKTsKKwkJZGl2ID0gNCAqICgoZGl2ID4+IFNZQ0NfQ0RfU0hJRlQpICsgMSk7CiAJCXJldHVybiBtYXhfZnJlcSA/IFhUQUxNQVhGUkVRIDogKFhUQUxNSU5GUkVRIC8gZGl2KTsKIAl9CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCi1haV9jbGtjdGxfc2V0ZGVsYXkoc3RydWN0IHNpX2luZm8gKnNpaSwgc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYykKK2FpX2Nsa2N0bF9zZXRkZWxheShzdHJ1Y3Qgc2lfcHViICpzaWgsIHN0cnVjdCBiY21hX2RldmljZSAqY2MpCiB7CiAJdWludCBzbG93bWF4ZnJlcSwgcGxsX2RlbGF5LCBzbG93Y2xrOwogCXVpbnQgcGxsX29uX2RlbGF5LCBmcmVmX3NlbF9kZWxheTsKQEAgLTE1NTIsNTUgKzgyNSw0MCBAQAogCSAqIHBvd2VyZWQgZG93biBieSBkeW5hbWljIGNsayBjb250cm9sIGxvZ2ljLgogCSAqLwogCi0Jc2xvd2NsayA9IGFpX3Nsb3djbGtfc3JjKHNpaSk7CisJc2xvd2NsayA9IGFpX3Nsb3djbGtfc3JjKHNpaCwgY2MpOwogCWlmIChzbG93Y2xrICE9IFNDQ19TU19YVEFMKQogCQlwbGxfZGVsYXkgKz0gWFRBTF9PTl9ERUxBWTsKIAogCS8qIFN0YXJ0aW5nIHdpdGggNDMxOCBpdCBpcyBJTFAgdGhhdCBpcyB1c2VkIGZvciB0aGUgZGVsYXlzICovCiAJc2xvd21heGZyZXEgPQotCSAgICBhaV9zbG93Y2xrX2ZyZXEoc2lpLCAoc2lpLT5wdWIuY2NyZXYgPj0gMTApID8gZmFsc2UgOiB0cnVlLCBjYyk7CisJICAgIGFpX3Nsb3djbGtfZnJlcShzaWgsCisJCQkgICAgKGFpX2dldF9jY3JldihzaWgpID49IDEwKSA/IGZhbHNlIDogdHJ1ZSwgY2MpOwogCiAJcGxsX29uX2RlbGF5ID0gKChzbG93bWF4ZnJlcSAqIHBsbF9kZWxheSkgKyA5OTk5OTkpIC8gMTAwMDAwMDsKIAlmcmVmX3NlbF9kZWxheSA9ICgoc2xvd21heGZyZXEgKiBGUkVGX0RFTEFZKSArIDk5OTk5OSkgLyAxMDAwMDAwOwogCi0JV19SRUcoJmNjLT5wbGxfb25fZGVsYXksIHBsbF9vbl9kZWxheSk7Ci0JV19SRUcoJmNjLT5mcmVmX3NlbF9kZWxheSwgZnJlZl9zZWxfZGVsYXkpOworCWJjbWFfd3JpdGUzMihjYywgQ0hJUENSRUdPRkZTKHBsbF9vbl9kZWxheSksIHBsbF9vbl9kZWxheSk7CisJYmNtYV93cml0ZTMyKGNjLCBDSElQQ1JFR09GRlMoZnJlZl9zZWxfZGVsYXkpLCBmcmVmX3NlbF9kZWxheSk7CiB9CiAKIC8qIGluaXRpYWxpemUgcG93ZXIgY29udHJvbCBkZWxheSByZWdpc3RlcnMgKi8KIHZvaWQgYWlfY2xrY3RsX2luaXQoc3RydWN0IHNpX3B1YiAqc2loKQogewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JdWludCBvcmlnaWR4ID0gMDsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOwotCWJvb2wgZmFzdDsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjOwogCi0JaWYgKCEoc2loLT5jY2NhcHMgJiBDQ19DQVBfUFdSX0NUTCkpCisJaWYgKCEoYWlfZ2V0X2NjY2FwcyhzaWgpICYgQ0NfQ0FQX1BXUl9DVEwpKQogCQlyZXR1cm47CiAKLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0JZmFzdCA9IFNJX0ZBU1Qoc2lpKTsKLQlpZiAoIWZhc3QpIHsKLQkJb3JpZ2lkeCA9IHNpaS0+Y3VyaWR4OwotCQljYyA9IChzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKikKLQkJCWFpX3NldGNvcmUoc2loLCBDQ19DT1JFX0lELCAwKTsKLQkJaWYgKGNjID09IE5VTEwpCi0JCQlyZXR1cm47Ci0JfSBlbHNlIHsKLQkJY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopIENDUkVHU19GQVNUKHNpaSk7Ci0JCWlmIChjYyA9PSBOVUxMKQotCQkJcmV0dXJuOwotCX0KKwljYyA9IGFpX2ZpbmRjb3JlKHNpaCwgQkNNQV9DT1JFX0NISVBDT01NT04sIDApOworCWlmIChjYyA9PSBOVUxMKQorCQlyZXR1cm47CiAKIAkvKiBzZXQgYWxsIEluc3RhY2xrIGNoaXAgSUxQIHRvIDEgTUh6ICovCi0JaWYgKHNpaC0+Y2NyZXYgPj0gMTApCi0JCVNFVF9SRUcoJmNjLT5zeXN0ZW1fY2xrX2N0bCwgU1lDQ19DRF9NQVNLLAotCQkJKElMUF9ESVZfMU1IWiA8PCBTWUNDX0NEX1NISUZUKSk7CisJaWYgKGFpX2dldF9jY3JldihzaWgpID49IDEwKQorCQliY21hX21hc2tzZXQzMihjYywgQ0hJUENSRUdPRkZTKHN5c3RlbV9jbGtfY3RsKSwgU1lDQ19DRF9NQVNLLAorCQkJICAgICAgIChJTFBfRElWXzFNSFogPDwgU1lDQ19DRF9TSElGVCkpOwogCi0JYWlfY2xrY3RsX3NldGRlbGF5KHNpaSwgY2MpOwotCi0JaWYgKCFmYXN0KQotCQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CisJYWlfY2xrY3RsX3NldGRlbGF5KHNpaCwgY2MpOwogfQogCiAvKgpAQCAtMTYxMCw0NyArODY4LDI1IEBACiB1MTYgYWlfY2xrY3RsX2Zhc3RfcHdydXBfZGVsYXkoc3RydWN0IHNpX3B1YiAqc2loKQogewogCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0JdWludCBvcmlnaWR4ID0gMDsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOworCXN0cnVjdCBiY21hX2RldmljZSAqY2M7CiAJdWludCBzbG93bWluZnJlcTsKIAl1MTYgZnBkZWxheTsKLQl1aW50IGludHJfdmFsID0gMDsKLQlib29sIGZhc3Q7CiAKIAlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0JaWYgKHNpaC0+Y2NjYXBzICYgQ0NfQ0FQX1BNVSkgewotCQlJTlRSX09GRihzaWksIGludHJfdmFsKTsKKwlpZiAoYWlfZ2V0X2NjY2FwcyhzaWgpICYgQ0NfQ0FQX1BNVSkgewogCQlmcGRlbGF5ID0gc2lfcG11X2Zhc3RfcHdydXBfZGVsYXkoc2loKTsKLQkJSU5UUl9SRVNUT1JFKHNpaSwgaW50cl92YWwpOwogCQlyZXR1cm4gZnBkZWxheTsKIAl9CiAKLQlpZiAoIShzaWgtPmNjY2FwcyAmIENDX0NBUF9QV1JfQ1RMKSkKKwlpZiAoIShhaV9nZXRfY2NjYXBzKHNpaCkgJiBDQ19DQVBfUFdSX0NUTCkpCiAJCXJldHVybiAwOwogCi0JZmFzdCA9IFNJX0ZBU1Qoc2lpKTsKIAlmcGRlbGF5ID0gMDsKLQlpZiAoIWZhc3QpIHsKLQkJb3JpZ2lkeCA9IHNpaS0+Y3VyaWR4OwotCQlJTlRSX09GRihzaWksIGludHJfdmFsKTsKLQkJY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopCi0JCQlhaV9zZXRjb3JlKHNpaCwgQ0NfQ09SRV9JRCwgMCk7Ci0JCWlmIChjYyA9PSBOVUxMKQotCQkJZ290byBkb25lOwotCX0gZWxzZSB7Ci0JCWNjID0gKHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqKSBDQ1JFR1NfRkFTVChzaWkpOwotCQlpZiAoY2MgPT0gTlVMTCkKLQkJCWdvdG8gZG9uZTsKLQl9Ci0KLQlzbG93bWluZnJlcSA9IGFpX3Nsb3djbGtfZnJlcShzaWksIGZhbHNlLCBjYyk7Ci0JZnBkZWxheSA9ICgoKFJfUkVHKCZjYy0+cGxsX29uX2RlbGF5KSArIDIpICogMTAwMDAwMCkgKwotCQkgICAoc2xvd21pbmZyZXEgLSAxKSkgLyBzbG93bWluZnJlcTsKLQotIGRvbmU6Ci0JaWYgKCFmYXN0KSB7Ci0JCWFpX3NldGNvcmVpZHgoc2loLCBvcmlnaWR4KTsKLQkJSU5UUl9SRVNUT1JFKHNpaSwgaW50cl92YWwpOworCWNjID0gYWlfZmluZGNvcmUoc2loLCBDQ19DT1JFX0lELCAwKTsKKwlpZiAoY2MpIHsKKwkJc2xvd21pbmZyZXEgPSBhaV9zbG93Y2xrX2ZyZXEoc2loLCBmYWxzZSwgY2MpOworCQlmcGRlbGF5ID0gKCgoYmNtYV9yZWFkMzIoY2MsIENISVBDUkVHT0ZGUyhwbGxfb25fZGVsYXkpKSArIDIpCisJCQkgICAgKiAxMDAwMDAwKSArIChzbG93bWluZnJlcSAtIDEpKSAvIHNsb3dtaW5mcmVxOwogCX0KIAlyZXR1cm4gZnBkZWxheTsKIH0KQEAgLTE2NjQsMTIgKzkwMCwxMiBAQAogCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKIAogCS8qIHBjaWUgY29yZSBkb2Vzbid0IGhhdmUgYW55IG1hcHBpbmcgdG8gY29udHJvbCB0aGUgeHRhbCBwdSAqLwotCWlmIChQQ0lFKHNpaSkpCisJaWYgKFBDSUUoc2loKSkKIAkJcmV0dXJuIC0xOwogCi0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0dQSU9fSU4sICZpbik7Ci0JcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0dQSU9fT1VULCAmb3V0KTsKLQlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wYnVzLCBQQ0lfR1BJT19PVVRFTiwgJm91dGVuKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wY2lidXMsIFBDSV9HUElPX0lOLCAmaW4pOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPnBjaWJ1cywgUENJX0dQSU9fT1VULCAmb3V0KTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wY2lidXMsIFBDSV9HUElPX09VVEVOLCAmb3V0ZW4pOwogCiAJLyoKIAkgKiBBdm9pZCBnbGl0Y2hpbmcgdGhlIGNsb2NrIGlmIEdQUlMgaXMgYWxyZWFkeSB1c2luZyBpdC4KQEAgLTE2OTAsOSArOTI2LDkgQEAKIAkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fWFRBTDsKIAkJCWlmICh3aGF0ICYgUExMKQogCQkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fUExMOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGNpYnVzLAogCQkJCQkgICAgICAgUENJX0dQSU9fT1VULCBvdXQpOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGNpYnVzLAogCQkJCQkgICAgICAgUENJX0dQSU9fT1VURU4sIG91dGVuKTsKIAkJCXVkZWxheShYVEFMX09OX0RFTEFZKTsKIAkJfQpAQCAtMTcwMCw3ICs5MzYsNyBAQAogCQkvKiB0dXJuIHBsbCBvbiAqLwogCQlpZiAod2hhdCAmIFBMTCkgewogCQkJb3V0ICY9IH5QQ0lfQ0ZHX0dQSU9fUExMOwotCQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsCisJCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGNpYnVzLAogCQkJCQkgICAgICAgUENJX0dQSU9fT1VULCBvdXQpOwogCQkJbWRlbGF5KDIpOwogCQl9CkBAIC0xNzA5LDkgKzk0NSw5IEBACiAJCQlvdXQgJj0gflBDSV9DRkdfR1BJT19YVEFMOwogCQlpZiAod2hhdCAmIFBMTCkKIAkJCW91dCB8PSBQQ0lfQ0ZHX0dQSU9fUExMOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBjaWJ1cywKIAkJCQkgICAgICAgUENJX0dQSU9fT1VULCBvdXQpOwotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywKKwkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBjaWJ1cywKIAkJCQkgICAgICAgUENJX0dQSU9fT1VURU4sIG91dGVuKTsKIAl9CiAKQEAgLTE3MjEsNjMgKzk1Nyw1MiBAQAogLyogY2xrIGNvbnRyb2wgbWVjaGFuaXNtIHRocm91Z2ggY2hpcGNvbW1vbiwgbm8gcG9saWN5IGNoZWNraW5nICovCiBzdGF0aWMgYm9vbCBfYWlfY2xrY3RsX2NjKHN0cnVjdCBzaV9pbmZvICpzaWksIHVpbnQgbW9kZSkKIHsKLQl1aW50IG9yaWdpZHggPSAwOwotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjYzsKIAl1MzIgc2NjOwotCXVpbnQgaW50cl92YWwgPSAwOwotCWJvb2wgZmFzdCA9IFNJX0ZBU1Qoc2lpKTsKIAogCS8qIGNoaXBjb21tb24gY29yZXMgcHJpb3IgdG8gcmV2NiBkb24ndCBzdXBwb3J0IGR5bmFtaWMgY2xvY2sgY29udHJvbCAqLwotCWlmIChzaWktPnB1Yi5jY3JldiA8IDYpCisJaWYgKGFpX2dldF9jY3Jldigmc2lpLT5wdWIpIDwgNikKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKCFmYXN0KSB7Ci0JCUlOVFJfT0ZGKHNpaSwgaW50cl92YWwpOwotCQlvcmlnaWR4ID0gc2lpLT5jdXJpZHg7Ci0JCWNjID0gKHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqKQotCQkJCQlhaV9zZXRjb3JlKCZzaWktPnB1YiwgQ0NfQ09SRV9JRCwgMCk7Ci0JfSBlbHNlIHsKLQkJY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopIENDUkVHU19GQVNUKHNpaSk7Ci0JCWlmIChjYyA9PSBOVUxMKQotCQkJZ290byBkb25lOwotCX0KKwljYyA9IGFpX2ZpbmRjb3JlKCZzaWktPnB1YiwgQkNNQV9DT1JFX0NISVBDT01NT04sIDApOwogCi0JaWYgKCEoc2lpLT5wdWIuY2NjYXBzICYgQ0NfQ0FQX1BXUl9DVEwpICYmIChzaWktPnB1Yi5jY3JldiA8IDIwKSkKLQkJZ290byBkb25lOworCWlmICghKGFpX2dldF9jY2NhcHMoJnNpaS0+cHViKSAmIENDX0NBUF9QV1JfQ1RMKSAmJgorCSAgICAoYWlfZ2V0X2NjcmV2KCZzaWktPnB1YikgPCAyMCkpCisJCXJldHVybiBtb2RlID09IENMS19GQVNUOwogCiAJc3dpdGNoIChtb2RlKSB7CiAJY2FzZSBDTEtfRkFTVDoJCS8qIEZPUkNFSFQsIGZhc3QgKHBsbCkgY2xvY2sgKi8KLQkJaWYgKHNpaS0+cHViLmNjcmV2IDwgMTApIHsKKwkJaWYgKGFpX2dldF9jY3Jldigmc2lpLT5wdWIpIDwgMTApIHsKIAkJCS8qCiAJCQkgKiBkb24ndCBmb3JnZXQgdG8gZm9yY2UgeHRhbCBiYWNrCiAJCQkgKiBvbiBiZWZvcmUgd2UgY2xlYXIgU0NDX0RZTl9YVEFMLi4KIAkJCSAqLwogCQkJYWlfY2xrY3RsX3h0YWwoJnNpaS0+cHViLCBYVEFMLCBPTik7Ci0JCQlTRVRfUkVHKCZjYy0+c2xvd19jbGtfY3RsLAotCQkJCShTQ0NfWEMgfCBTQ0NfRlMgfCBTQ0NfSVApLCBTQ0NfSVApOwotCQl9IGVsc2UgaWYgKHNpaS0+cHViLmNjcmV2IDwgMjApIHsKLQkJCU9SX1JFRygmY2MtPnN5c3RlbV9jbGtfY3RsLCBTWUNDX0hSKTsKKwkJCWJjbWFfbWFza3NldDMyKGNjLCBDSElQQ1JFR09GRlMoc2xvd19jbGtfY3RsKSwKKwkJCQkgICAgICAgKFNDQ19YQyB8IFNDQ19GUyB8IFNDQ19JUCksIFNDQ19JUCk7CisJCX0gZWxzZSBpZiAoYWlfZ2V0X2NjcmV2KCZzaWktPnB1YikgPCAyMCkgeworCQkJYmNtYV9zZXQzMihjYywgQ0hJUENSRUdPRkZTKHN5c3RlbV9jbGtfY3RsKSwgU1lDQ19IUik7CiAJCX0gZWxzZSB7Ci0JCQlPUl9SRUcoJmNjLT5jbGtfY3RsX3N0LCBDQ1NfRk9SQ0VIVCk7CisJCQliY21hX3NldDMyKGNjLCBDSElQQ1JFR09GRlMoY2xrX2N0bF9zdCksIENDU19GT1JDRUhUKTsKIAkJfQogCiAJCS8qIHdhaXQgZm9yIHRoZSBQTEwgKi8KLQkJaWYgKHNpaS0+cHViLmNjY2FwcyAmIENDX0NBUF9QTVUpIHsKKwkJaWYgKGFpX2dldF9jY2NhcHMoJnNpaS0+cHViKSAmIENDX0NBUF9QTVUpIHsKIAkJCXUzMiBodGF2YWlsID0gQ0NTX0hUQVZBSUw7Ci0JCQlTUElOV0FJVCgoKFJfUkVHKCZjYy0+Y2xrX2N0bF9zdCkgJiBodGF2YWlsKQotCQkJCSAgPT0gMCksIFBNVV9NQVhfVFJBTlNJVElPTl9ETFkpOworCQkJU1BJTldBSVQoKChiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKGNsa19jdGxfc3QpKSAmCisJCQkJICAgaHRhdmFpbCkgPT0gMCksIFBNVV9NQVhfVFJBTlNJVElPTl9ETFkpOwogCQl9IGVsc2UgewogCQkJdWRlbGF5KFBMTF9ERUxBWSk7CiAJCX0KIAkJYnJlYWs7CiAKIAljYXNlIENMS19EWU5BTUlDOgkvKiBlbmFibGUgZHluYW1pYyBjbG9jayBjb250cm9sICovCi0JCWlmIChzaWktPnB1Yi5jY3JldiA8IDEwKSB7Ci0JCQlzY2MgPSBSX1JFRygmY2MtPnNsb3dfY2xrX2N0bCk7CisJCWlmIChhaV9nZXRfY2NyZXYoJnNpaS0+cHViKSA8IDEwKSB7CisJCQlzY2MgPSBiY21hX3JlYWQzMihjYywgQ0hJUENSRUdPRkZTKHNsb3dfY2xrX2N0bCkpOwogCQkJc2NjICY9IH4oU0NDX0ZTIHwgU0NDX0lQIHwgU0NDX1hDKTsKIAkJCWlmICgoc2NjICYgU0NDX1NTX01BU0spICE9IFNDQ19TU19YVEFMKQogCQkJCXNjYyB8PSBTQ0NfWEM7Ci0JCQlXX1JFRygmY2MtPnNsb3dfY2xrX2N0bCwgc2NjKTsKKwkJCWJjbWFfd3JpdGUzMihjYywgQ0hJUENSRUdPRkZTKHNsb3dfY2xrX2N0bCksIHNjYyk7CiAKIAkJCS8qCiAJCQkgKiBmb3IgZHluYW1pYyBjb250cm9sLCB3ZSBoYXZlIHRvCkBAIC0xNzg1LDExICsxMDEwLDExIEBACiAJCQkgKi8KIAkJCWlmIChzY2MgJiBTQ0NfWEMpCiAJCQkJYWlfY2xrY3RsX3h0YWwoJnNpaS0+cHViLCBYVEFMLCBPRkYpOwotCQl9IGVsc2UgaWYgKHNpaS0+cHViLmNjcmV2IDwgMjApIHsKKwkJfSBlbHNlIGlmIChhaV9nZXRfY2NyZXYoJnNpaS0+cHViKSA8IDIwKSB7CiAJCQkvKiBJbnN0YWNsb2NrICovCi0JCQlBTkRfUkVHKCZjYy0+c3lzdGVtX2Nsa19jdGwsIH5TWUNDX0hSKTsKKwkJCWJjbWFfbWFzazMyKGNjLCBDSElQQ1JFR09GRlMoc3lzdGVtX2Nsa19jdGwpLCB+U1lDQ19IUik7CiAJCX0gZWxzZSB7Ci0JCQlBTkRfUkVHKCZjYy0+Y2xrX2N0bF9zdCwgfkNDU19GT1JDRUhUKTsKKwkJCWJjbWFfbWFzazMyKGNjLCBDSElQQ1JFR09GRlMoY2xrX2N0bF9zdCksIH5DQ1NfRk9SQ0VIVCk7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTE3OTcsMTEgKzEwMjIsNiBAQAogCQlicmVhazsKIAl9CiAKLSBkb25lOgotCWlmICghZmFzdCkgewotCQlhaV9zZXRjb3JlaWR4KCZzaWktPnB1Yiwgb3JpZ2lkeCk7Ci0JCUlOVFJfUkVTVE9SRShzaWksIGludHJfdmFsKTsKLQl9CiAJcmV0dXJuIG1vZGUgPT0gQ0xLX0ZBU1Q7CiB9CiAKQEAgLTE4MjAsNDYgKzEwNDAsMjUgQEAKIAlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7CiAKIAkvKiBjaGlwY29tbW9uIGNvcmVzIHByaW9yIHRvIHJldjYgZG9uJ3Qgc3VwcG9ydCBkeW5hbWljIGNsb2NrIGNvbnRyb2wgKi8KLQlpZiAoc2loLT5jY3JldiA8IDYpCisJaWYgKGFpX2dldF9jY3JldihzaWgpIDwgNikKIAkJcmV0dXJuIGZhbHNlOwogCi0JaWYgKFBDSV9GT1JDRUhUKHNpaSkpCisJaWYgKFBDSV9GT1JDRUhUKHNpaCkpCiAJCXJldHVybiBtb2RlID09IENMS19GQVNUOwogCiAJcmV0dXJuIF9haV9jbGtjdGxfY2Moc2lpLCBtb2RlKTsKIH0KIAotLyogQnVpbGQgZGV2aWNlIHBhdGggKi8KLWludCBhaV9kZXZwYXRoKHN0cnVjdCBzaV9wdWIgKnNpaCwgY2hhciAqcGF0aCwgaW50IHNpemUpCi17Ci0JaW50IHNsZW47Ci0KLQlpZiAoIXBhdGggfHwgc2l6ZSA8PSAwKQotCQlyZXR1cm4gLTE7Ci0KLQlzbGVuID0gc25wcmludGYocGF0aCwgKHNpemVfdCkgc2l6ZSwgInBjaS8ldS8ldS8iLAotCQkoKHN0cnVjdCBzaV9pbmZvICopc2loKS0+cGJ1cy0+YnVzLT5udW1iZXIsCi0JCVBDSV9TTE9UKCgoc3RydWN0IHBjaV9kZXYgKikKLQkJCQkoKChzdHJ1Y3Qgc2lfaW5mbyAqKShzaWgpKS0+cGJ1cykpLT5kZXZmbikpOwotCi0JaWYgKHNsZW4gPCAwIHx8IHNsZW4gPj0gc2l6ZSkgewotCQlwYXRoWzBdID0gJ1wwJzsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCiB2b2lkIGFpX3BjaV91cChzdHJ1Y3Qgc2lfcHViICpzaWgpCiB7CiAJc3RydWN0IHNpX2luZm8gKnNpaTsKIAogCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKIAotCWlmIChQQ0lfRk9SQ0VIVChzaWkpKQorCWlmIChQQ0lfRk9SQ0VIVChzaWgpKQogCQlfYWlfY2xrY3RsX2NjKHNpaSwgQ0xLX0ZBU1QpOwogCi0JaWYgKFBDSUUoc2lpKSkKKwlpZiAoUENJRShzaWgpKQogCQlwY2ljb3JlX3VwKHNpaS0+cGNoLCBTSV9QQ0lVUCk7CiAKIH0KQEAgLTE4ODIsNyArMTA4MSw3IEBACiAJc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwogCiAJLyogcmVsZWFzZSBGT1JDRUhUIHNpbmNlIGNoaXAgaXMgZ29pbmcgdG8gImRvd24iIHN0YXRlICovCi0JaWYgKFBDSV9GT1JDRUhUKHNpaSkpCisJaWYgKFBDSV9GT1JDRUhUKHNpaCkpCiAJCV9haV9jbGtjdGxfY2Moc2lpLCBDTEtfRFlOQU1JQyk7CiAKIAlwY2ljb3JlX2Rvd24oc2lpLT5wY2gsIFNJX1BDSURPV04pOwpAQCAtMTg5NSw0MiArMTA5NCwyMyBAQAogdm9pZCBhaV9wY2lfc2V0dXAoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVtYXNrKQogewogCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IHNicGNpcmVncyBfX2lvbWVtICpyZWdzID0gTlVMTDsKLQl1MzIgc2lmbGFnID0gMCwgdzsKLQl1aW50IGlkeCA9IDA7CisJdTMyIHc7CiAKIAlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7CiAKLQlpZiAoUENJKHNpaSkpIHsKLQkJLyogZ2V0IGN1cnJlbnQgY29yZSBpbmRleCAqLwotCQlpZHggPSBzaWktPmN1cmlkeDsKLQotCQkvKiB3ZSBpbnRlcnJ1cHQgb24gdGhpcyBiYWNrcGxhbmUgZmxhZyBudW1iZXIgKi8KLQkJc2lmbGFnID0gYWlfZmxhZyhzaWgpOwotCi0JCS8qIHN3aXRjaCBvdmVyIHRvIHBjaSBjb3JlICovCi0JCXJlZ3MgPSBhaV9zZXRjb3JlaWR4KHNpaCwgc2lpLT5wdWIuYnVzY29yZWlkeCk7Ci0JfQotCiAJLyoKIAkgKiBFbmFibGUgc2ItPnBjaSBpbnRlcnJ1cHRzLiAgQXNzdW1lCiAJICogUENJIHJldiAyLjMgc3VwcG9ydCB3YXMgYWRkZWQgaW4gcGNpIGNvcmUgcmV2IDYgYW5kIHRoaW5ncyBjaGFuZ2VkLi4KIAkgKi8KLQlpZiAoUENJRShzaWkpIHx8IChQQ0koc2lpKSAmJiAoKHNpaS0+cHViLmJ1c2NvcmVyZXYpID49IDYpKSkgeworCWlmIChQQ0lFKHNpaCkgfHwgKFBDSShzaWgpICYmIChhaV9nZXRfYnVzY29yZXJldihzaWgpID49IDYpKSkgewogCQkvKiBwY2kgY29uZmlnIHdyaXRlIHRvIHNldCB0aGlzIGNvcmUgYml0IGluIFBDSUludE1hc2sgKi8KLQkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHNpaS0+cGJ1cywgUENJX0lOVF9NQVNLLCAmdyk7CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPnBjaWJ1cywgUENJX0lOVF9NQVNLLCAmdyk7CiAJCXcgfD0gKGNvcmVtYXNrIDw8IFBDSV9TQklNX1NISUZUKTsKLQkJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9JTlRfTUFTSywgdyk7Ci0JfSBlbHNlIHsKLQkJLyogc2V0IHNiaW50dmVjIGJpdCBmb3Igb3VyIGZsYWcgbnVtYmVyICovCi0JCWFpX3NldGludChzaWgsIHNpZmxhZyk7CisJCXBjaV93cml0ZV9jb25maWdfZHdvcmQoc2lpLT5wY2lidXMsIFBDSV9JTlRfTUFTSywgdyk7CiAJfQogCi0JaWYgKFBDSShzaWkpKSB7Ci0JCXBjaWNvcmVfcGNpX3NldHVwKHNpaS0+cGNoLCByZWdzKTsKLQotCQkvKiBzd2l0Y2ggYmFjayB0byBwcmV2aW91cyBjb3JlICovCi0JCWFpX3NldGNvcmVpZHgoc2loLCBpZHgpOworCWlmIChQQ0koc2loKSkgeworCQlwY2ljb3JlX3BjaV9zZXR1cChzaWktPnBjaCk7CiAJfQogfQogCkBAIC0xOTQwLDI1ICsxMTIwLDExIEBACiAgKi8KIGludCBhaV9wY2lfZml4Y2ZnKHN0cnVjdCBzaV9wdWIgKnNpaCkKIHsKLQl1aW50IG9yaWdpZHg7Ci0Jdm9pZCBfX2lvbWVtICpyZWdzID0gTlVMTDsKIAlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOwogCiAJLyogRml4dXAgUEkgaW4gU1JPTSBzaGFkb3cgYXJlYSB0byBlbmFibGUgdGhlIGNvcnJlY3QgUENJIGNvcmUgYWNjZXNzICovCi0JLyogc2F2ZSB0aGUgY3VycmVudCBpbmRleCAqLwotCW9yaWdpZHggPSBhaV9jb3JlaWR4KCZzaWktPnB1Yik7Ci0KIAkvKiBjaGVjayAncGknIGlzIGNvcnJlY3QgYW5kIGZpeCBpdCBpZiBub3QgKi8KLQlyZWdzID0gYWlfc2V0Y29yZSgmc2lpLT5wdWIsIHNpaS0+cHViLmJ1c2NvcmV0eXBlLCAwKTsKLQlpZiAoc2lpLT5wdWIuYnVzY29yZXR5cGUgPT0gUENJRV9DT1JFX0lEKQotCQlwY2ljb3JlX2ZpeGNmZ19wY2llKHNpaS0+cGNoLAotCQkJCSAgICAoc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqKXJlZ3MpOwotCWVsc2UgaWYgKHNpaS0+cHViLmJ1c2NvcmV0eXBlID09IFBDSV9DT1JFX0lEKQotCQlwY2ljb3JlX2ZpeGNmZ19wY2koc2lpLT5wY2gsIChzdHJ1Y3Qgc2JwY2lyZWdzIF9faW9tZW0gKilyZWdzKTsKLQotCS8qIHJlc3RvcmUgdGhlIG9yaWdpbmFsIGluZGV4ICovCi0JYWlfc2V0Y29yZWlkeCgmc2lpLT5wdWIsIG9yaWdpZHgpOwotCisJcGNpY29yZV9maXhjZmcoc2lpLT5wY2gpOwogCXBjaWNvcmVfaHd1cChzaWktPnBjaCk7CiAJcmV0dXJuIDA7CiB9CkBAIC0xOTY5LDU4ICsxMTM1LDQyIEBACiAJdWludCByZWdvZmY7CiAKIAlyZWdvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvY29udHJvbCk7Ci0JcmV0dXJuIGFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsIHJlZ29mZiwgbWFzaywgdmFsKTsKKwlyZXR1cm4gYWlfY2NfcmVnKHNpaCwgcmVnb2ZmLCBtYXNrLCB2YWwpOwogfQogCiB2b2lkIGFpX2NoaXBjb250cmxfZXBhNDMzMShzdHJ1Y3Qgc2lfcHViICpzaWgsIGJvb2wgb24pCiB7Ci0Jc3RydWN0IHNpX2luZm8gKnNpaTsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOwotCXVpbnQgb3JpZ2lkeDsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjOwogCXUzMiB2YWw7CiAKLQlzaWkgPSAoc3RydWN0IHNpX2luZm8gKilzaWg7Ci0Jb3JpZ2lkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQotCWNjID0gKHN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqKSBhaV9zZXRjb3JlKHNpaCwgQ0NfQ09SRV9JRCwgMCk7Ci0KLQl2YWwgPSBSX1JFRygmY2MtPmNoaXBjb250cm9sKTsKKwljYyA9IGFpX2ZpbmRjb3JlKHNpaCwgQ0NfQ09SRV9JRCwgMCk7CiAKIAlpZiAob24pIHsKLQkJaWYgKHNpaC0+Y2hpcHBrZyA9PSA5IHx8IHNpaC0+Y2hpcHBrZyA9PSAweGIpCisJCWlmIChhaV9nZXRfY2hpcHBrZyhzaWgpID09IDkgfHwgYWlfZ2V0X2NoaXBwa2coc2loKSA9PSAweGIpCiAJCQkvKiBFeHQgUEEgQ29udHJvbHMgZm9yIDQzMzEgMTJ4OSBQYWNrYWdlICovCi0JCQlXX1JFRygmY2MtPmNoaXBjb250cm9sLCB2YWwgfAotCQkJICAgICAgQ0NUUkw0MzMxX0VYVFBBX0VOIHwKLQkJCSAgICAgIENDVFJMNDMzMV9FWFRQQV9PTl9HUElPMl81KTsKKwkJCWJjbWFfc2V0MzIoY2MsIENISVBDUkVHT0ZGUyhjaGlwY29udHJvbCksCisJCQkJICAgQ0NUUkw0MzMxX0VYVFBBX0VOIHwKKwkJCQkgICBDQ1RSTDQzMzFfRVhUUEFfT05fR1BJTzJfNSk7CiAJCWVsc2UKIAkJCS8qIEV4dCBQQSBDb250cm9scyBmb3IgNDMzMSAxMngxMiBQYWNrYWdlICovCi0JCQlXX1JFRygmY2MtPmNoaXBjb250cm9sLAotCQkJICAgICAgdmFsIHwgQ0NUUkw0MzMxX0VYVFBBX0VOKTsKKwkJCWJjbWFfc2V0MzIoY2MsIENISVBDUkVHT0ZGUyhjaGlwY29udHJvbCksCisJCQkJICAgQ0NUUkw0MzMxX0VYVFBBX0VOKTsKIAl9IGVsc2UgewogCQl2YWwgJj0gfihDQ1RSTDQzMzFfRVhUUEFfRU4gfCBDQ1RSTDQzMzFfRVhUUEFfT05fR1BJTzJfNSk7Ci0JCVdfUkVHKCZjYy0+Y2hpcGNvbnRyb2wsIHZhbCk7CisJCWJjbWFfbWFzazMyKGNjLCBDSElQQ1JFR09GRlMoY2hpcGNvbnRyb2wpLAorCQkJICAgIH4oQ0NUUkw0MzMxX0VYVFBBX0VOIHwgQ0NUUkw0MzMxX0VYVFBBX09OX0dQSU8yXzUpKTsKIAl9Ci0KLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CiB9CiAKIC8qIEVuYWJsZSBCVC1DT0VYICYgRXgtUEEgZm9yIDQzMTMgKi8KIHZvaWQgYWlfZXBhXzQzMTN3YXIoc3RydWN0IHNpX3B1YiAqc2loKQogewotCXN0cnVjdCBzaV9pbmZvICpzaWk7Ci0Jc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYzsKLQl1aW50IG9yaWdpZHg7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjYzsKIAotCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQlvcmlnaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCi0JY2MgPSBhaV9zZXRjb3JlKHNpaCwgQ0NfQ09SRV9JRCwgMCk7CisJY2MgPSBhaV9maW5kY29yZShzaWgsIENDX0NPUkVfSUQsIDApOwogCiAJLyogRVBBIEZpeCAqLwotCVdfUkVHKCZjYy0+Z3Bpb2NvbnRyb2wsCi0JICAgICAgUl9SRUcoJmNjLT5ncGlvY29udHJvbCkgfCBHUElPX0NUUkxfRVBBX0VOX01BU0spOwotCi0JYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOworCWJjbWFfc2V0MzIoY2MsIENISVBDUkVHT0ZGUyhncGlvY29udHJvbCksIEdQSU9fQ1RSTF9FUEFfRU5fTUFTSyk7CiB9CiAKIC8qIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgcmVtb3ZlZCAqLwpAQCAtMjAzMSw3ICsxMTgxLDcgQEAKIAogCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKIAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChzaWktPnBidXMsIFBDSV9WRU5ET1JfSUQsICZ3KTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoc2lpLT5wY2lidXMsIFBDSV9WRU5ET1JfSUQsICZ3KTsKIAlpZiAoKHcgJiAweEZGRkYpICE9IFBDSV9WRU5ET1JfSURfQlJPQURDT00pCiAJCXJldHVybiB0cnVlOwogCkBAIC0yMDQwLDI2ICsxMTkwLDIzIEBACiAKIGJvb2wgYWlfaXNfc3Byb21fYXZhaWxhYmxlKHN0cnVjdCBzaV9wdWIgKnNpaCkKIHsKLQlpZiAoc2loLT5jY3JldiA+PSAzMSkgewotCQlzdHJ1Y3Qgc2lfaW5mbyAqc2lpOwotCQl1aW50IG9yaWdpZHg7Ci0JCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7CisJc3RydWN0IHNpX2luZm8gKnNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKKworCWlmIChhaV9nZXRfY2NyZXYoc2loKSA+PSAzMSkgeworCQlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjOwogCQl1MzIgc3JvbWN0cmw7CiAKLQkJaWYgKChzaWgtPmNjY2FwcyAmIENDX0NBUF9TUk9NKSA9PSAwKQorCQlpZiAoKGFpX2dldF9jY2NhcHMoc2loKSAmIENDX0NBUF9TUk9NKSA9PSAwKQogCQkJcmV0dXJuIGZhbHNlOwogCi0JCXNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKLQkJb3JpZ2lkeCA9IHNpaS0+Y3VyaWR4OwotCQljYyA9IGFpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwotCQlzcm9tY3RybCA9IFJfUkVHKCZjYy0+c3JvbWNvbnRyb2wpOwotCQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CisJCWNjID0gYWlfZmluZGNvcmUoc2loLCBCQ01BX0NPUkVfQ0hJUENPTU1PTiwgMCk7CisJCXNyb21jdHJsID0gYmNtYV9yZWFkMzIoY2MsIENISVBDUkVHT0ZGUyhzcm9tY29udHJvbCkpOwogCQlyZXR1cm4gc3JvbWN0cmwgJiBTUkNfUFJFU0VOVDsKIAl9CiAKLQlzd2l0Y2ggKHNpaC0+Y2hpcCkgeworCXN3aXRjaCAoYWlfZ2V0X2NoaXBfaWQoc2loKSkgewogCWNhc2UgQkNNNDMxM19DSElQX0lEOgotCQlyZXR1cm4gKHNpaC0+Y2hpcHN0ICYgQ1NUNDMxM19TUFJPTV9QUkVTRU5UKSAhPSAwOworCQlyZXR1cm4gKHNpaS0+Y2hpcHN0ICYgQ1NUNDMxM19TUFJPTV9QUkVTRU5UKSAhPSAwOwogCWRlZmF1bHQ6CiAJCXJldHVybiB0cnVlOwogCX0KQEAgLTIwNjcsOSArMTIxNCwxMSBAQAogCiBib29sIGFpX2lzX290cF9kaXNhYmxlZChzdHJ1Y3Qgc2lfcHViICpzaWgpCiB7Ci0Jc3dpdGNoIChzaWgtPmNoaXApIHsKKwlzdHJ1Y3Qgc2lfaW5mbyAqc2lpID0gKHN0cnVjdCBzaV9pbmZvICopc2loOworCisJc3dpdGNoIChhaV9nZXRfY2hpcF9pZChzaWgpKSB7CiAJY2FzZSBCQ000MzEzX0NISVBfSUQ6Ci0JCXJldHVybiAoc2loLT5jaGlwc3QgJiBDU1Q0MzEzX09UUF9QUkVTRU5UKSA9PSAwOworCQlyZXR1cm4gKHNpaS0+Y2hpcHN0ICYgQ1NUNDMxM19PVFBfUFJFU0VOVCkgPT0gMDsKIAkJLyogVGhlc2UgY2hpcHMgYWx3YXlzIGhhdmUgdGhlaXIgT1RQIG9uICovCiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKQEAgLTIwNzcsMyArMTIyNiwxNSBAQAogCQlyZXR1cm4gZmFsc2U7CiAJfQogfQorCit1aW50IGFpX2dldF9idXNjb3JldHlwZShzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJc3RydWN0IHNpX2luZm8gKnNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKKwlyZXR1cm4gc2lpLT5idXNjb3JlLT5pZC5pZDsKK30KKwordWludCBhaV9nZXRfYnVzY29yZXJldihzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJc3RydWN0IHNpX2luZm8gKnNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaDsKKwlyZXR1cm4gc2lpLT5idXNjb3JlLT5pZC5yZXY7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYWl1dGlscy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2FpdXRpbHMuaAppbmRleCAxMDZhNzQyLi5mODRjNmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYWl1dGlscy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9haXV0aWxzLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYJX0JSQ01fQUlVVElMU19IXwogI2RlZmluZQlfQlJDTV9BSVVUSUxTX0hfCiAKKyNpbmNsdWRlIDxsaW51eC9iY21hL2JjbWEuaD4KKwogI2luY2x1ZGUgInR5cGVzLmgiCiAKIC8qCkBAIC0zOCw4OCArNDAsMTIgQEAKIC8qIFBDSUUgQ2xpZW50IE1vZGUgc2IycGNpdHJhbnNsYXRpb24yICgyIFpldHRhQnl0ZXMpLCBoaWdoIDMyIGJpdHMgKi8KICNkZWZpbmUgU0lfUENJRV9ETUFfSDMyCQkweDgwMDAwMDAwCiAKLS8qIGNvcmUgY29kZXMgKi8KLSNkZWZpbmUJTk9ERVZfQ09SRV9JRAkJMHg3MDAJLyogSW52YWxpZCBjb3JlaWQgKi8KLSNkZWZpbmUJQ0NfQ09SRV9JRAkJMHg4MDAJLyogY2hpcGNvbW1vbiBjb3JlICovCi0jZGVmaW5lCUlMSU5FMjBfQ09SRV9JRAkJMHg4MDEJLyogaWxpbmUyMCBjb3JlICovCi0jZGVmaW5lCVNSQU1fQ09SRV9JRAkJMHg4MDIJLyogc3JhbSBjb3JlICovCi0jZGVmaW5lCVNEUkFNX0NPUkVfSUQJCTB4ODAzCS8qIHNkcmFtIGNvcmUgKi8KLSNkZWZpbmUJUENJX0NPUkVfSUQJCTB4ODA0CS8qIHBjaSBjb3JlICovCi0jZGVmaW5lCU1JUFNfQ09SRV9JRAkJMHg4MDUJLyogbWlwcyBjb3JlICovCi0jZGVmaW5lCUVORVRfQ09SRV9JRAkJMHg4MDYJLyogZW5ldCBtYWMgY29yZSAqLwotI2RlZmluZQlDT0RFQ19DT1JFX0lECQkweDgwNwkvKiB2OTAgY29kZWMgY29yZSAqLwotI2RlZmluZQlVU0JfQ09SRV9JRAkJMHg4MDgJLyogdXNiIDEuMSBob3N0L2RldmljZSBjb3JlICovCi0jZGVmaW5lCUFEU0xfQ09SRV9JRAkJMHg4MDkJLyogQURTTCBjb3JlICovCi0jZGVmaW5lCUlMSU5FMTAwX0NPUkVfSUQJMHg4MGEJLyogaWxpbmUxMDAgY29yZSAqLwotI2RlZmluZQlJUFNFQ19DT1JFX0lECQkweDgwYgkvKiBpcHNlYyBjb3JlICovCi0jZGVmaW5lCVVUT1BJQV9DT1JFX0lECQkweDgwYwkvKiB1dG9waWEgY29yZSAqLwotI2RlZmluZQlQQ01DSUFfQ09SRV9JRAkJMHg4MGQJLyogcGNtY2lhIGNvcmUgKi8KLSNkZWZpbmUJU09DUkFNX0NPUkVfSUQJCTB4ODBlCS8qIGludGVybmFsIG1lbW9yeSBjb3JlICovCi0jZGVmaW5lCU1FTUNfQ09SRV9JRAkJMHg4MGYJLyogbWVtYyBzZHJhbSBjb3JlICovCi0jZGVmaW5lCU9GRE1fQ09SRV9JRAkJMHg4MTAJLyogT0ZETSBwaHkgY29yZSAqLwotI2RlZmluZQlFWFRJRl9DT1JFX0lECQkweDgxMQkvKiBleHRlcm5hbCBpbnRlcmZhY2UgY29yZSAqLwotI2RlZmluZQlEMTFfQ09SRV9JRAkJMHg4MTIJLyogODAyLjExIE1BQyBjb3JlICovCi0jZGVmaW5lCUFQSFlfQ09SRV9JRAkJMHg4MTMJLyogODAyLjExYSBwaHkgY29yZSAqLwotI2RlZmluZQlCUEhZX0NPUkVfSUQJCTB4ODE0CS8qIDgwMi4xMWIgcGh5IGNvcmUgKi8KLSNkZWZpbmUJR1BIWV9DT1JFX0lECQkweDgxNQkvKiA4MDIuMTFnIHBoeSBjb3JlICovCi0jZGVmaW5lCU1JUFMzM19DT1JFX0lECQkweDgxNgkvKiBtaXBzMzMwMiBjb3JlICovCi0jZGVmaW5lCVVTQjExSF9DT1JFX0lECQkweDgxNwkvKiB1c2IgMS4xIGhvc3QgY29yZSAqLwotI2RlZmluZQlVU0IxMURfQ09SRV9JRAkJMHg4MTgJLyogdXNiIDEuMSBkZXZpY2UgY29yZSAqLwotI2RlZmluZQlVU0IyMEhfQ09SRV9JRAkJMHg4MTkJLyogdXNiIDIuMCBob3N0IGNvcmUgKi8KLSNkZWZpbmUJVVNCMjBEX0NPUkVfSUQJCTB4ODFhCS8qIHVzYiAyLjAgZGV2aWNlIGNvcmUgKi8KLSNkZWZpbmUJU0RJT0hfQ09SRV9JRAkJMHg4MWIJLyogc2RpbyBob3N0IGNvcmUgKi8KLSNkZWZpbmUJUk9CT19DT1JFX0lECQkweDgxYwkvKiByb2Jvc3dpdGNoIGNvcmUgKi8KLSNkZWZpbmUJQVRBMTAwX0NPUkVfSUQJCTB4ODFkCS8qIHBhcmFsbGVsIEFUQSBjb3JlICovCi0jZGVmaW5lCVNBVEFYT1JfQ09SRV9JRAkJMHg4MWUJLyogc2VyaWFsIEFUQSAmIFhPUiBETUEgY29yZSAqLwotI2RlZmluZQlHSUdFVEhfQ09SRV9JRAkJMHg4MWYJLyogZ2lnYWJpdCBldGhlcm5ldCBjb3JlICovCi0jZGVmaW5lCVBDSUVfQ09SRV9JRAkJMHg4MjAJLyogcGNpIGV4cHJlc3MgY29yZSAqLwotI2RlZmluZQlOUEhZX0NPUkVfSUQJCTB4ODIxCS8qIDgwMi4xMW4gMngyIHBoeSBjb3JlICovCi0jZGVmaW5lCVNSQU1DX0NPUkVfSUQJCTB4ODIyCS8qIFNSQU0gY29udHJvbGxlciBjb3JlICovCi0jZGVmaW5lCU1JTklNQUNfQ09SRV9JRAkJMHg4MjMJLyogTUlOSSBNQUMvcGh5IGNvcmUgKi8KLSNkZWZpbmUJQVJNMTFfQ09SRV9JRAkJMHg4MjQJLyogQVJNIDExNzYgY29yZSAqLwotI2RlZmluZQlBUk03U19DT1JFX0lECQkweDgyNQkvKiBBUk03dGRtaS1zIGNvcmUgKi8KLSNkZWZpbmUJTFBQSFlfQ09SRV9JRAkJMHg4MjYJLyogODAyLjExYS9iL2cgcGh5IGNvcmUgKi8KLSNkZWZpbmUJUE1VX0NPUkVfSUQJCTB4ODI3CS8qIFBNVSBjb3JlICovCi0jZGVmaW5lCVNTTlBIWV9DT1JFX0lECQkweDgyOAkvKiA4MDIuMTFuIHNpbmdsZS1zdHJlYW0gcGh5IGNvcmUgKi8KLSNkZWZpbmUJU0RJT0RfQ09SRV9JRAkJMHg4MjkJLyogU0RJTyBkZXZpY2UgY29yZSAqLwotI2RlZmluZQlBUk1DTTNfQ09SRV9JRAkJMHg4MmEJLyogQVJNIENvcnRleCBNMyBjb3JlICovCi0jZGVmaW5lCUhUUEhZX0NPUkVfSUQJCTB4ODJiCS8qIDgwMi4xMW4gNHg0IHBoeSBjb3JlICovCi0jZGVmaW5lCU1JUFM3NEtfQ09SRV9JRAkJMHg4MmMJLyogbWlwcyA3NGsgY29yZSAqLwotI2RlZmluZQlHTUFDX0NPUkVfSUQJCTB4ODJkCS8qIEdpZ2FiaXQgTUFDIGNvcmUgKi8KLSNkZWZpbmUJRE1FTUNfQ09SRV9JRAkJMHg4MmUJLyogRERSMS8yIG1lbW9yeSBjb250cm9sbGVyIGNvcmUgKi8KLSNkZWZpbmUJUENJRVJDX0NPUkVfSUQJCTB4ODJmCS8qIFBDSUUgUm9vdCBDb21wbGV4IGNvcmUgKi8KLSNkZWZpbmUJT0NQX0NPUkVfSUQJCTB4ODMwCS8qIE9DUDJPQ1AgYnJpZGdlIGNvcmUgKi8KLSNkZWZpbmUJU0NfQ09SRV9JRAkJMHg4MzEJLyogc2hhcmVkIGNvbW1vbiBjb3JlICovCi0jZGVmaW5lCUFIQl9DT1JFX0lECQkweDgzMgkvKiBPQ1AyQUhCIGJyaWRnZSBjb3JlICovCi0jZGVmaW5lCVNQSUhfQ09SRV9JRAkJMHg4MzMJLyogU1BJIGhvc3QgY29yZSAqLwotI2RlZmluZQlJMlNfQ09SRV9JRAkJMHg4MzQJLyogSTJTIGNvcmUgKi8KLSNkZWZpbmUJRE1FTVNfQ09SRV9JRAkJMHg4MzUJLyogU0RSL0REUjEgbWVtb3J5IGNvbnRyb2xsZXIgY29yZSAqLwotI2RlZmluZQlERUZfU0hJTV9DT01QCQkweDgzNwkvKiBTSElNIGNvbXBvbmVudCBpbiB1YnVzLzYzNjIgKi8KLSNkZWZpbmUgT09CX1JPVVRFUl9DT1JFX0lECTB4MzY3CS8qIE9PQiByb3V0ZXIgY29yZSBJRCAqLwotI2RlZmluZQlERUZfQUlfQ09NUAkJMHhmZmYJLyogRGVmYXVsdCBjb21wb25lbnQsIGluIGFpIGNoaXBzIGl0Ci0JCQkJCSAqIG1hcHMgYWxsIHVudXNlZCBhZGRyZXNzIHJhbmdlcwotCQkJCQkgKi8KLQogLyogY2hpcGNvbW1vbiBiZWluZyB0aGUgZmlyc3QgY29yZTogKi8KICNkZWZpbmUJU0lfQ0NfSURYCQkwCiAKIC8qIFNPQyBJbnRlcmNvbm5lY3QgdHlwZXMgKGFrYSBjaGlwIHR5cGVzKSAqLwogI2RlZmluZQlTT0NJX0FJCQkJMQogCi0vKiBDb21tb24gY29yZSBjb250cm9sIGZsYWdzICovCi0jZGVmaW5lCVNJQ0ZfQklTVF9FTgkJMHg4MDAwCi0jZGVmaW5lCVNJQ0ZfUE1FX0VOCQkweDQwMDAKLSNkZWZpbmUJU0lDRl9DT1JFX0JJVFMJCTB4M2ZmYwotI2RlZmluZQlTSUNGX0ZHQwkJMHgwMDAyCi0jZGVmaW5lCVNJQ0ZfQ0xPQ0tfRU4JCTB4MDAwMQotCi0vKiBDb21tb24gY29yZSBzdGF0dXMgZmxhZ3MgKi8KLSNkZWZpbmUJU0lTRl9CSVNUX0RPTkUJCTB4ODAwMAotI2RlZmluZQlTSVNGX0JJU1RfRVJST1IJCTB4NDAwMAotI2RlZmluZQlTSVNGX0dBVEVEX0NMSwkJMHgyMDAwCi0jZGVmaW5lCVNJU0ZfRE1BNjQJCTB4MTAwMAotI2RlZmluZQlTSVNGX0NPUkVfQklUUwkJMHgwZmZmCi0KIC8qIEEgcmVnaXN0ZXIgdGhhdCBpcyBjb21tb24gdG8gYWxsIGNvcmVzIHRvCiAgKiBjb21tdW5pY2F0ZSB3L1BNVSByZWdhcmRpbmcgY2xvY2sgY29udHJvbC4KICAqLwpAQCAtMjIwLDI2ICsxNDYsMTUgQEAKICAqICAgcHVibGljIChyZWFkLW9ubHkpIHBvcnRpb24gb2YgYWl1dGlscyBoYW5kbGUgcmV0dXJuZWQgYnkgc2lfYXR0YWNoKCkKICAqLwogc3RydWN0IHNpX3B1YiB7Ci0JdWludCBidXNjb3JldHlwZTsJLyogUENJX0NPUkVfSUQsIFBDSUVfQ09SRV9JRCwgUENNQ0lBX0NPUkVfSUQgKi8KLQl1aW50IGJ1c2NvcmVyZXY7CS8qIGJ1c2NvcmUgcmV2ICovCi0JdWludCBidXNjb3JlaWR4OwkvKiBidXNjb3JlIGluZGV4ICovCiAJaW50IGNjcmV2OwkJLyogY2hpcCBjb21tb24gY29yZSByZXYgKi8KIAl1MzIgY2NjYXBzOwkJLyogY2hpcCBjb21tb24gY2FwYWJpbGl0aWVzICovCi0JdTMyIGNjY2Fwc19leHQ7CS8qIGNoaXAgY29tbW9uIGNhcGFiaWxpdGllcyBleHRlbnNpb24gKi8KIAlpbnQgcG11cmV2OwkJLyogcG11IGNvcmUgcmV2ICovCiAJdTMyIHBtdWNhcHM7CQkvKiBwbXUgY2FwYWJpbGl0aWVzICovCiAJdWludCBib2FyZHR5cGU7CQkvKiBib2FyZCB0eXBlICovCiAJdWludCBib2FyZHZlbmRvcjsJLyogYm9hcmQgdmVuZG9yICovCi0JdWludCBib2FyZGZsYWdzOwkvKiBib2FyZCBmbGFncyAqLwotCXVpbnQgYm9hcmRmbGFnczI7CS8qIGJvYXJkIGZsYWdzMiAqLwogCXVpbnQgY2hpcDsJCS8qIGNoaXAgbnVtYmVyICovCiAJdWludCBjaGlwcmV2OwkJLyogY2hpcCByZXZpc2lvbiAqLwogCXVpbnQgY2hpcHBrZzsJCS8qIGNoaXAgcGFja2FnZSBvcHRpb24gKi8KLQl1MzIgY2hpcHN0OwkJLyogY2hpcCBzdGF0dXMgKi8KLQlib29sIGlzc2ltOwkJLyogY2hpcCBpcyBpbiBzaW11bGF0aW9uIG9yIGVtdWxhdGlvbiAqLwotCXVpbnQgc29jaXJldjsJCS8qIFNPQyBpbnRlcmNvbm5lY3QgcmV2ICovCi0JYm9vbCBwY2lfcHIzMjQxNDsKLQogfTsKIAogc3RydWN0IHBjaV9kZXY7CkBAIC0yNTUsMzggKzE3MCwxMyBAQAogLyogbWlzYyBzaSBpbmZvIG5lZWRlZCBieSBzb21lIG9mIHRoZSByb3V0aW5lcyAqLwogc3RydWN0IHNpX2luZm8gewogCXN0cnVjdCBzaV9wdWIgcHViOwkvKiBiYWNrIHBsYW5lIHB1YmxpYyBzdGF0ZSAobXVzdCBiZSBmaXJzdCkgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqcGJ1czsJLyogaGFuZGxlIHRvIHBjaSBidXMgKi8KLQl1aW50IGRldl9jb3JlaWQ7CS8qIHRoZSBjb3JlIHByb3ZpZGVzIGRyaXZlciBmdW5jdGlvbnMgKi8KLQl2b2lkICppbnRyX2FyZzsJCS8qIGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbiBhcmcgKi8KLQl1MzIgKCppbnRyc29mZl9mbikgKHZvaWQgKmludHJfYXJnKTsgLyogdHVybnMgY2hpcCBpbnRlcnJ1cHRzIG9mZiAqLwotCS8qIHJlc3RvcmUgY2hpcCBpbnRlcnJ1cHRzICovCi0Jdm9pZCAoKmludHJzcmVzdG9yZV9mbikgKHZvaWQgKmludHJfYXJnLCB1MzIgYXJnKTsKLQkvKiBjaGVjayBpZiBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkICovCi0JYm9vbCAoKmludHJzZW5hYmxlZF9mbikgKHZvaWQgKmludHJfYXJnKTsKLQorCXN0cnVjdCBiY21hX2J1cyAqaWNidXM7CS8qIGhhbmRsZSB0byBzb2MgaW50ZXJjb25uZWN0IGJ1cyAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lidXM7CS8qIGhhbmRsZSB0byBwY2kgYnVzICovCiAJc3RydWN0IHBjaWNvcmVfaW5mbyAqcGNoOyAvKiBQQ0kvRSBjb3JlIGhhbmRsZSAqLwotCisJc3RydWN0IGJjbWFfZGV2aWNlICpidXNjb3JlOwogCXN0cnVjdCBsaXN0X2hlYWQgdmFyX2xpc3Q7IC8qIGxpc3Qgb2Ygc3JvbSB2YXJpYWJsZXMgKi8KIAotCXZvaWQgX19pb21lbSAqY3VybWFwOwkJCS8qIGN1cnJlbnQgcmVncyB2YSAqLwotCXZvaWQgX19pb21lbSAqcmVnc1tTSV9NQVhDT1JFU107CS8qIG90aGVyIHJlZ3MgdmEgKi8KLQotCXVpbnQgY3VyaWR4OwkJLyogY3VycmVudCBjb3JlIGluZGV4ICovCi0JdWludCBudW1jb3JlczsJCS8qICMgZGlzY292ZXJlZCBjb3JlcyAqLwotCXVpbnQgY29yZWlkW1NJX01BWENPUkVTXTsgLyogaWQgb2YgZWFjaCBjb3JlICovCi0JdTMyIGNvcmVzYmFbU0lfTUFYQ09SRVNdOyAvKiBiYWNrcGxhbmUgYWRkcmVzcyBvZiBlYWNoIGNvcmUgKi8KLQl2b2lkICpyZWdzMltTSV9NQVhDT1JFU107IC8qIDJuZCB2aXJ0dWFsIGFkZHJlc3MgcGVyIGNvcmUgKHVzYmgyMCkgKi8KLQl1MzIgY29yZXNiYTJbU0lfTUFYQ09SRVNdOyAvKiAybmQgcGh5cyBhZGRyZXNzIHBlciBjb3JlICh1c2JoMjApICovCi0JdTMyIGNvcmVzYmFfc2l6ZVtTSV9NQVhDT1JFU107IC8qIGJhY2twbGFuZSBhZGRyZXNzIHNwYWNlIHNpemUgKi8KLQl1MzIgY29yZXNiYTJfc2l6ZVtTSV9NQVhDT1JFU107CS8qIHNlY29uZCBhZGRyZXNzIHNwYWNlIHNpemUgKi8KLQotCXZvaWQgKmN1cndyYXA7CQkvKiBjdXJyZW50IHdyYXBwZXIgdmEgKi8KLQl2b2lkICp3cmFwcGVyc1tTSV9NQVhDT1JFU107CS8qIG90aGVyIGNvcmVzIHdyYXBwZXIgdmEgKi8KLQl1MzIgd3JhcGJhW1NJX01BWENPUkVTXTsJLyogYWRkcmVzcyBvZiBjb250cm9sbGluZyB3cmFwcGVyICovCi0KLQl1MzIgY2lhW1NJX01BWENPUkVTXTsJLyogZXJvbSBjaWEgZW50cnkgZm9yIGVhY2ggY29yZSAqLwotCXUzMiBjaWJbU0lfTUFYQ09SRVNdOwkvKiBlcm9tIGNpYSBlbnRyeSBmb3IgZWFjaCBjb3JlICovCi0JdTMyIG9vYl9yb3V0ZXI7CS8qIG9vYiByb3V0ZXIgcmVnaXN0ZXJzIGZvciBheGkgKi8KKwl1MzIgY2hpcHN0OwkJLyogY2hpcCBzdGF0dXMgKi8KIH07CiAKIC8qCkBAIC0yOTksNTIgKzE4OSwxNSBAQAogCiAKIC8qIEFNQkEgSW50ZXJjb25uZWN0IGV4cG9ydGVkIGV4dGVybnMgKi8KLWV4dGVybiB1aW50IGFpX2ZsYWcoc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB2b2lkIGFpX3NldGludChzdHJ1Y3Qgc2lfcHViICpzaWgsIGludCBzaWZsYWcpOwotZXh0ZXJuIHVpbnQgYWlfY29yZWlkeChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHVpbnQgYWlfY29yZXZlbmRvcihzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHVpbnQgYWlfY29yZXJldihzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIGJvb2wgYWlfaXNjb3JldXAoc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB1MzIgYWlfY29yZV9jZmxhZ3Moc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgbWFzaywgdTMyIHZhbCk7Ci1leHRlcm4gdm9pZCBhaV9jb3JlX2NmbGFnc193byhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiB1MzIgYWlfY29yZV9zZmxhZ3Moc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgbWFzaywgdTMyIHZhbCk7Ci1leHRlcm4gdWludCBhaV9jb3JlcmVnKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBjb3JlaWR4LCB1aW50IHJlZ29mZiwgdWludCBtYXNrLAotCQkgICAgICAgdWludCB2YWwpOwotZXh0ZXJuIHZvaWQgYWlfY29yZV9yZXNldChzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBiaXRzLCB1MzIgcmVzZXRiaXRzKTsKLWV4dGVybiB2b2lkIGFpX2NvcmVfZGlzYWJsZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBiaXRzKTsKLWV4dGVybiBpbnQgYWlfbnVtYWRkcnNwYWNlcyhzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHUzMiBhaV9hZGRyc3BhY2Uoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGFzaWR4KTsKLWV4dGVybiB1MzIgYWlfYWRkcnNwYWNlc2l6ZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgYXNpZHgpOwotZXh0ZXJuIHZvaWQgYWlfd3JpdGVfd3JhcF9yZWcoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgb2Zmc2V0LCB1MzIgdmFsKTsKK2V4dGVybiBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmFpX2ZpbmRjb3JlKHN0cnVjdCBzaV9wdWIgKnNpaCwKKwkJCQkgICAgICAgdTE2IGNvcmVpZCwgdTE2IGNvcmV1bml0KTsKK2V4dGVybiB1MzIgYWlfY29yZV9jZmxhZ3Moc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MzIgbWFzaywgdTMyIHZhbCk7CiAKIC8qID09PSBleHBvcnRlZCBmdW5jdGlvbnMgPT09ICovCi1leHRlcm4gc3RydWN0IHNpX3B1YiAqYWlfYXR0YWNoKHZvaWQgX19pb21lbSAqcmVncywgc3RydWN0IHBjaV9kZXYgKnNkaCk7CitleHRlcm4gc3RydWN0IHNpX3B1YiAqYWlfYXR0YWNoKHN0cnVjdCBiY21hX2J1cyAqcGJ1cyk7CiBleHRlcm4gdm9pZCBhaV9kZXRhY2goc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB1aW50IGFpX2NvcmVpZChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHVpbnQgYWlfY29yZXJldihzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHVpbnQgYWlfY29yZXJlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkeCwgdWludCByZWdvZmYsIHVpbnQgbWFzaywKLQkJdWludCB2YWwpOwotZXh0ZXJuIHZvaWQgYWlfd3JpdGVfd3JhcHBlcnJlZyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBvZmZzZXQsIHUzMiB2YWwpOwotZXh0ZXJuIHUzMiBhaV9jb3JlX2NmbGFncyhzdHJ1Y3Qgc2lfcHViICpzaWgsIHUzMiBtYXNrLCB1MzIgdmFsKTsKLWV4dGVybiB1MzIgYWlfY29yZV9zZmxhZ3Moc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgbWFzaywgdTMyIHZhbCk7Ci1leHRlcm4gYm9vbCBhaV9pc2NvcmV1cChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHVpbnQgYWlfZmluZGNvcmVpZHgoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZCwgdWludCBjb3JldW5pdCk7Ci1leHRlcm4gdm9pZCBfX2lvbWVtICphaV9zZXRjb3JlaWR4KHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBjb3JlaWR4KTsKLWV4dGVybiB2b2lkIF9faW9tZW0gKmFpX3NldGNvcmUoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZCwgdWludCBjb3JldW5pdCk7Ci1leHRlcm4gdm9pZCBfX2lvbWVtICphaV9zd2l0Y2hfY29yZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgY29yZWlkLAotCQkJCSAgICB1aW50ICpvcmlnaWR4LCB1aW50ICppbnRyX3ZhbCk7Ci1leHRlcm4gdm9pZCBhaV9yZXN0b3JlX2NvcmUoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGNvcmVpZCwgdWludCBpbnRyX3ZhbCk7Ci1leHRlcm4gdm9pZCBhaV9jb3JlX3Jlc2V0KHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIGJpdHMsIHUzMiByZXNldGJpdHMpOwotZXh0ZXJuIHZvaWQgYWlfY29yZV9kaXNhYmxlKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTMyIGJpdHMpOwotZXh0ZXJuIHUzMiBhaV9hbHBfY2xvY2soc3RydWN0IHNpX3B1YiAqc2loKTsKLWV4dGVybiB1MzIgYWlfaWxwX2Nsb2NrKHN0cnVjdCBzaV9wdWIgKnNpaCk7CitleHRlcm4gdWludCBhaV9jY19yZWcoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IHJlZ29mZiwgdTMyIG1hc2ssIHUzMiB2YWwpOwogZXh0ZXJuIHZvaWQgYWlfcGNpX3NldHVwKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBjb3JlbWFzayk7Ci1leHRlcm4gdm9pZCBhaV9zZXRpbnQoc3RydWN0IHNpX3B1YiAqc2loLCBpbnQgc2lmbGFnKTsKLWV4dGVybiBib29sIGFpX2JhY2twbGFuZTY0KHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdm9pZCBhaV9yZWdpc3Rlcl9pbnRyX2NhbGxiYWNrKHN0cnVjdCBzaV9wdWIgKnNpaCwgdm9pZCAqaW50cnNvZmZfZm4sCi0JCQkJICAgICAgdm9pZCAqaW50cnNyZXN0b3JlX2ZuLAotCQkJCSAgICAgIHZvaWQgKmludHJzZW5hYmxlZF9mbiwgdm9pZCAqaW50cl9hcmcpOwotZXh0ZXJuIHZvaWQgYWlfZGVyZWdpc3Rlcl9pbnRyX2NhbGxiYWNrKHN0cnVjdCBzaV9wdWIgKnNpaCk7CiBleHRlcm4gdm9pZCBhaV9jbGtjdGxfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwogZXh0ZXJuIHUxNiBhaV9jbGtjdGxfZmFzdF9wd3J1cF9kZWxheShzdHJ1Y3Qgc2lfcHViICpzaWgpOwogZXh0ZXJuIGJvb2wgYWlfY2xrY3RsX2NjKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCBtb2RlKTsKQEAgLTM1OSwxMyArMjEyLDYgQEAKIC8qIFNQUk9NIGF2YWlsYWJpbGl0eSAqLwogZXh0ZXJuIGJvb2wgYWlfaXNfc3Byb21fYXZhaWxhYmxlKHN0cnVjdCBzaV9wdWIgKnNpaCk7CiAKLS8qCi0gKiBCdWlsZCBkZXZpY2UgcGF0aC4gUGF0aCBzaXplIG11c3QgYmUgPj0gU0lfREVWUEFUSF9CVUZTWi4KLSAqIFRoZSByZXR1cm5lZCBwYXRoIGlzIE5VTEwgdGVybWluYXRlZCBhbmQgaGFzIHRyYWlsaW5nICcvJy4KLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb3RoZXJ3aXNlLgotICovCi1leHRlcm4gaW50IGFpX2RldnBhdGgoc3RydWN0IHNpX3B1YiAqc2loLCBjaGFyICpwYXRoLCBpbnQgc2l6ZSk7Ci0KIGV4dGVybiB2b2lkIGFpX3BjaV9zbGVlcChzdHJ1Y3Qgc2lfcHViICpzaWgpOwogZXh0ZXJuIHZvaWQgYWlfcGNpX2Rvd24oc3RydWN0IHNpX3B1YiAqc2loKTsKIGV4dGVybiB2b2lkIGFpX3BjaV91cChzdHJ1Y3Qgc2lfcHViICpzaWgpOwpAQCAtMzc1LDQgKzIyMSw1MiBAQAogLyogRW5hYmxlIEV4LVBBIGZvciA0MzEzICovCiBleHRlcm4gdm9pZCBhaV9lcGFfNDMxM3dhcihzdHJ1Y3Qgc2lfcHViICpzaWgpOwogCitleHRlcm4gdWludCBhaV9nZXRfYnVzY29yZXR5cGUoc3RydWN0IHNpX3B1YiAqc2loKTsKK2V4dGVybiB1aW50IGFpX2dldF9idXNjb3JlcmV2KHN0cnVjdCBzaV9wdWIgKnNpaCk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGFpX2dldF9jY3JldihzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJcmV0dXJuIHNpaC0+Y2NyZXY7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGFpX2dldF9jY2NhcHMoc3RydWN0IHNpX3B1YiAqc2loKQoreworCXJldHVybiBzaWgtPmNjY2FwczsKK30KKworc3RhdGljIGlubGluZSBpbnQgYWlfZ2V0X3BtdXJldihzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJcmV0dXJuIHNpaC0+cG11cmV2OworfQorCitzdGF0aWMgaW5saW5lIHUzMiBhaV9nZXRfcG11Y2FwcyhzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJcmV0dXJuIHNpaC0+cG11Y2FwczsKK30KKworc3RhdGljIGlubGluZSB1aW50IGFpX2dldF9ib2FyZHR5cGUoc3RydWN0IHNpX3B1YiAqc2loKQoreworCXJldHVybiBzaWgtPmJvYXJkdHlwZTsKK30KKworc3RhdGljIGlubGluZSB1aW50IGFpX2dldF9ib2FyZHZlbmRvcihzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJcmV0dXJuIHNpaC0+Ym9hcmR2ZW5kb3I7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludCBhaV9nZXRfY2hpcF9pZChzdHJ1Y3Qgc2lfcHViICpzaWgpCit7CisJcmV0dXJuIHNpaC0+Y2hpcDsKK30KKworc3RhdGljIGlubGluZSB1aW50IGFpX2dldF9jaGlwcmV2KHN0cnVjdCBzaV9wdWIgKnNpaCkKK3sKKwlyZXR1cm4gc2loLT5jaGlwcmV2OworfQorCitzdGF0aWMgaW5saW5lIHVpbnQgYWlfZ2V0X2NoaXBwa2coc3RydWN0IHNpX3B1YiAqc2loKQoreworCXJldHVybiBzaWgtPmNoaXBwa2c7Cit9CisKICNlbmRpZgkJCQkvKiBfQlJDTV9BSVVUSUxTX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvYW1wZHUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9hbXBkdS5jCmluZGV4IDdmMjdkYmQuLjkwOTExZWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9hbXBkdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9hbXBkdS5jCkBAIC02NDksNyArNjQ5LDcgQEAKIAkJbGVuID0gcm91bmR1cChsZW4sIDQpOwogCQlhbXBkdV9sZW4gKz0gKGxlbiArIChuZGVsaW0gKyAxKSAqIEFNUERVX0RFTElNSVRFUl9MRU4pOwogCi0JCWRtYV9sZW4gKz0gKHUxNikgYnJjbXVfcGt0dG90bGVuKHApOworCQlkbWFfbGVuICs9ICh1MTYpIHAtPmxlbjsKIAogCQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IGFtcGR1X2xlbiAlZCIKIAkJCSIgc2VnX2NudCAlZCBudWxsIGRlbGltICVkXG4iLApAQCAtNzQxLDkgKzc0MSw3IEBACiAJCWlmIChwKSB7CiAJCQlpZiAoKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgJiYKIAkJCSAgICAoKHU4KSAocC0+cHJpb3JpdHkpID09IHRpZCkpIHsKLQotCQkJCXBsZW4gPSBicmNtdV9wa3R0b3RsZW4ocCkgKwotCQkJCSAgICAgICBBTVBEVV9NQVhfTVBEVV9PVkVSSEVBRDsKKwkJCQlwbGVuID0gcC0+bGVuICsgQU1QRFVfTUFYX01QRFVfT1ZFUkhFQUQ7CiAJCQkJcGxlbiA9IG1heChzY2JfYW1wZHUtPm1pbl9sZW4sIHBsZW4pOwogCiAJCQkJaWYgKChwbGVuICsgYW1wZHVfbGVuKSA+IG1heF9hbXBkdV9ieXRlcykgewpAQCAtMTEyMCwxNCArMTExOCwxNyBAQAogCQl1OCBzdGF0dXNfZGVsYXkgPSAwOwogCiAJCS8qIHdhaXQgdGlsbCB0aGUgbmV4dCA4IGJ5dGVzIG9mIHR4c3RhdHVzIGlzIGF2YWlsYWJsZSAqLwotCQl3aGlsZSAoKChzMSA9IFJfUkVHKCZ3bGMtPnJlZ3MtPmZybXR4c3RhdHVzKSkgJiBUWFNfVikgPT0gMCkgeworCQlzMSA9IGJjbWFfcmVhZDMyKHdsYy0+aHctPmQxMWNvcmUsIEQxMVJFR09GRlMoZnJtdHhzdGF0dXMpKTsKKwkJd2hpbGUgKChzMSAmIFRYU19WKSA9PSAwKSB7CiAJCQl1ZGVsYXkoMSk7CiAJCQlzdGF0dXNfZGVsYXkrKzsKIAkJCWlmIChzdGF0dXNfZGVsYXkgPiAxMCkKIAkJCQlyZXR1cm47IC8qIGVycm9yIGNvbmRpdGlvbiAqLworCQkJczEgPSBiY21hX3JlYWQzMih3bGMtPmh3LT5kMTFjb3JlLAorCQkJCQkgRDExUkVHT0ZGUyhmcm10eHN0YXR1cykpOwogCQl9CiAKLQkJczIgPSBSX1JFRygmd2xjLT5yZWdzLT5mcm10eHN0YXR1czIpOworCQlzMiA9IGJjbWFfcmVhZDMyKHdsYy0+aHctPmQxMWNvcmUsIEQxMVJFR09GRlMoZnJtdHhzdGF0dXMyKSk7CiAJfQogCiAJaWYgKHNjYikgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2NoYW5uZWwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9jaGFubmVsLmMKaW5kZXggODlhZDFiNy4uNTVlOWY0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2NoYW5uZWwuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvY2hhbm5lbC5jCkBAIC0xMTUzLDEyMSArMTE1Myw2IEBACiAJCQkgICAgICAmdHhwd3IpOwogfQogCi0jaWZkZWYgUE9XRVJfREJHCi1zdGF0aWMgdm9pZCB3bGNfcGh5X3R4cG93ZXJfbGltaXRzX2R1bXAoc3RydWN0IHR4cHdyX2xpbWl0cyAqdHhwd3IpCi17Ci0JaW50IGk7Ci0JY2hhciBidWZbODBdOwotCWNoYXIgZnJhY3Rpb25bNF1bNF0gPSB7ICIgICAiLCAiLjI1IiwgIi41ICIsICIuNzUiIH07Ci0KLQlzcHJpbnRmKGJ1ZiwgIkNDSyAgICAgICAgICAgICAgICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX0NDSzsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPmNja1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5jY2tbaV0gJSBCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjIwIE1IeiBPRkRNIFNJU08gICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5vZmRtW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm9mZG1baV0gJSBCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjIwIE1IeiBPRkRNIENERCAgICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX09GRE07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5vZmRtX2NkZFtpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5vZmRtX2NkZFtpXSAlIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiNDAgTUh6IE9GRE0gU0lTTyAgICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfT0ZETTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm9mZG1fNDBfc2lzb1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5vZmRtXzQwX3Npc29baV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiNDAgTUh6IE9GRE0gQ0REICAgICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfT0ZETTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm9mZG1fNDBfY2RkW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm9mZG1fNDBfY2RkW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjIwIE1IeiBNQ1MwLTcgU0lTTyAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm1jc18yMF9zaXNvW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm1jc18yMF9zaXNvW2ldICUKLQkJCQkJCQlCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlzcHJpbnRmKGJ1ZiwgIjIwIE1IeiBNQ1MwLTcgQ0REICAiKTsKLQlmb3IgKGkgPSAwOyBpIDwgQlJDTVNfTlVNX1JBVEVTX01DU18xX1NUUkVBTTsgaSsrKQotCQlzcHJpbnRmKGJ1ZltzdHJsZW4oYnVmKV0sICIgJTJkJXMiLAotCQkJdHhwd3ItPm1jc18yMF9jZGRbaV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzIwX2NkZFtpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICIyMCBNSHogTUNTMC03IFNUQkMgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfMjBfc3RiY1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfMjBfc3RiY1tpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICIyMCBNSHogTUNTOC0xNSBTRE0gIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMl9TVFJFQU07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfMjBfbWltb1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfMjBfbWltb1tpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICI0MCBNSHogTUNTMC03IFNJU08gIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfNDBfc2lzb1tpXSAvIEJSQ01TX1RYUFdSX0RCX0ZBQ1RPUiwKLQkJCWZyYWN0aW9uW3R4cHdyLT5tY3NfNDBfc2lzb1tpXSAlCi0JCQkJCQkJQlJDTVNfVFhQV1JfREJfRkFDVE9SXSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIiVzXG4iLCBidWYpOwotCi0Jc3ByaW50ZihidWYsICI0MCBNSHogTUNTMC03IENERCAgIik7Ci0JZm9yIChpID0gMDsgaSA8IEJSQ01TX05VTV9SQVRFU19NQ1NfMV9TVFJFQU07IGkrKykKLQkJc3ByaW50ZihidWZbc3RybGVuKGJ1ZildLCAiICUyZCVzIiwKLQkJCXR4cHdyLT5tY3NfNDBfY2RkW2ldIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCQkJZnJhY3Rpb25bdHhwd3ItPm1jc180MF9jZGRbaV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiNDAgTUh6IE1DUzAtNyBTVEJDICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzFfU1RSRUFNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+bWNzXzQwX3N0YmNbaV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzQwX3N0YmNbaV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCXByaW50ayhLRVJOX0RFQlVHICIlc1xuIiwgYnVmKTsKLQotCXNwcmludGYoYnVmLCAiNDAgTUh6IE1DUzgtMTUgU0RNICIpOwotCWZvciAoaSA9IDA7IGkgPCBCUkNNU19OVU1fUkFURVNfTUNTXzJfU1RSRUFNOyBpKyspCi0JCXNwcmludGYoYnVmW3N0cmxlbihidWYpXSwgIiAlMmQlcyIsCi0JCQl0eHB3ci0+bWNzXzQwX21pbW9baV0gLyBCUkNNU19UWFBXUl9EQl9GQUNUT1IsCi0JCQlmcmFjdGlvblt0eHB3ci0+bWNzXzQwX21pbW9baV0gJQotCQkJCQkJCUJSQ01TX1RYUFdSX0RCX0ZBQ1RPUl0pOwotCX0KLQlwcmludGsoS0VSTl9ERUJVRyAiJXNcbiIsIGJ1Zik7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAiTUNTMzIgICAgICAgICAgICAgICAlMmQlc1xuIiwKLQkgICAgICAgdHhwd3ItPm1jczMyIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SLAotCSAgICAgICBmcmFjdGlvblt0eHB3ci0+bWNzMzIgJSBCUkNNU19UWFBXUl9EQl9GQUNUT1JdKTsKLX0KLSNlbmRpZgkJCQkvKiBQT1dFUl9EQkcgKi8KLQogdm9pZAogYnJjbXNfY19jaGFubmVsX3JlZ19saW1pdHMoc3RydWN0IGJyY21zX2NtX2luZm8gKndsY19jbSwgdTE2IGNoYW5zcGVjLAogCQkgICAgICAgc3RydWN0IHR4cHdyX2xpbWl0cyAqdHhwd3IpCkBAIC0xNDc4LDkgKzEzNjMsNiBAQAogCQkJdHhwd3ItPm1jc180MF9zdGJjW2ldID0gdHhwd3ItPm1jc180MF9jZGRbaV07CiAJfQogCi0jaWZkZWYgUE9XRVJfREJHCi0Jd2xjX3BoeV90eHBvd2VyX2xpbWl0c19kdW1wKHR4cHdyKTsKLSNlbmRpZgogCXJldHVybjsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2QxMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2QxMS5oCmluZGV4IGVkNTE2MTYuLjE5NDhjYjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kMTEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZDExLmgKQEAgLTQzMCw2ICs0MzAsOSBAQAogCXUxNiBQQURbMHgzODBdOwkvKiAweDgwMCAtIDB4RUZFICovCiB9OwogCisvKiBkMTEgcmVnaXN0ZXIgZmllbGQgb2Zmc2V0ICovCisjZGVmaW5lIEQxMVJFR09GRlMoZmllbGQpCW9mZnNldG9mKHN0cnVjdCBkMTFyZWdzLCBmaWVsZCkKKwogI2RlZmluZQlQSUhSX0JBU0UJMHgwNDAwCS8qIGJ5dGUgYWRkcmVzcyBvZiBwYWNrZWQgSUhSIHJlZ2lvbiAqLwogCiAvKiBiaXN0c3RhdHVzICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmMKaW5kZXggNmViZWM4Zi4uMmU5MGE5YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2RtYS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kbWEuYwpAQCAtMTMsOCArMTMsMTAgQEAKICAqIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4KICAqIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKQEAgLTIyLDYgKzI0LDE0IEBACiAjaW5jbHVkZSA8YWl1dGlscy5oPgogI2luY2x1ZGUgInR5cGVzLmgiCiAjaW5jbHVkZSAiZG1hLmgiCisjaW5jbHVkZSAic29jLmgiCisKKy8qCisgKiBkbWEgcmVnaXN0ZXIgZmllbGQgb2Zmc2V0IGNhbGN1bGF0aW9uCisgKi8KKyNkZWZpbmUgRE1BNjRSRUdPRkZTKGZpZWxkKQkJb2Zmc2V0b2Yoc3RydWN0IGRtYTY0cmVncywgZmllbGQpCisjZGVmaW5lIERNQTY0VFhSRUdPRkZTKGRpLCBmaWVsZCkJKGRpLT5kNjR0eHJlZ2Jhc2UgKyBETUE2NFJFR09GRlMoZmllbGQpKQorI2RlZmluZSBETUE2NFJYUkVHT0ZGUyhkaSwgZmllbGQpCShkaS0+ZDY0cnhyZWdiYXNlICsgRE1BNjRSRUdPRkZTKGZpZWxkKSkKIAogLyoKICAqIERNQSBoYXJkd2FyZSByZXF1aXJlcyBlYWNoIGRlc2NyaXB0b3IgcmluZyB0byBiZSA4a0IgYWxpZ25lZCwgYW5kIGZpdCB3aXRoaW4KQEAgLTE2OCwyNiArMTc4LDI1IEBACiAKIC8qIGRlYnVnL3RyYWNlICovCiAjaWZkZWYgQkNNREJHCi0jZGVmaW5lCURNQV9FUlJPUihhcmdzKSBcCi0JZG8geyBcCi0JCWlmICghKCpkaS0+bXNnX2xldmVsICYgMSkpIFwKLQkJCTsgXAotCQllbHNlIFwKLQkJCXByaW50ayBhcmdzOyBcCi0JfSB3aGlsZSAoMCkKLSNkZWZpbmUJRE1BX1RSQUNFKGFyZ3MpIFwKLQlkbyB7IFwKLQkJaWYgKCEoKmRpLT5tc2dfbGV2ZWwgJiAyKSkgXAotCQkJOyBcCi0JCWVsc2UgXAotCQkJcHJpbnRrIGFyZ3M7IFwKLQl9IHdoaWxlICgwKQorI2RlZmluZQlETUFfRVJST1IoZm10LCAuLi4pCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKCpkaS0+bXNnX2xldmVsICYgMSkJCQkJCVwKKwkJcHJfZGVidWcoIiVzOiAiIGZtdCwgX19mdW5jX18sICMjX19WQV9BUkdTX18pOwlcCit9IHdoaWxlICgwKQorI2RlZmluZQlETUFfVFJBQ0UoZm10LCAuLi4pCQkJCQlcCitkbyB7CQkJCQkJCQlcCisJaWYgKCpkaS0+bXNnX2xldmVsICYgMikJCQkJCVwKKwkJcHJfZGVidWcoIiVzOiAiIGZtdCwgX19mdW5jX18sICMjX19WQV9BUkdTX18pOwlcCit9IHdoaWxlICgwKQogI2Vsc2UKLSNkZWZpbmUJRE1BX0VSUk9SKGFyZ3MpCi0jZGVmaW5lCURNQV9UUkFDRShhcmdzKQorI2RlZmluZQlETUFfRVJST1IoZm10LCAuLi4pCQkJXAorCW5vX3ByaW50ayhmbXQsICMjX19WQV9BUkdTX18pCisjZGVmaW5lCURNQV9UUkFDRShmbXQsIC4uLikJCQlcCisJbm9fcHJpbnRrKGZtdCwgIyNfX1ZBX0FSR1NfXykKICNlbmRpZgkJCQkvKiBCQ01EQkcgKi8KIAotI2RlZmluZQlETUFfTk9ORShhcmdzKQorI2RlZmluZQlETUFfTk9ORShmbXQsIC4uLikJCQlcCisJbm9fcHJpbnRrKGZtdCwgIyNfX1ZBX0FSR1NfXykKIAogI2RlZmluZQlNQVhOQU1FTAk4CS8qIDggY2hhciBuYW1lcyAqLwogCkBAIC0yMTgsMTUgKzIyNywxNiBAQAogCXVpbnQgKm1zZ19sZXZlbDsJLyogbWVzc2FnZSBsZXZlbCBwb2ludGVyICovCiAJY2hhciBuYW1lW01BWE5BTUVMXTsJLyogY2FsbGVycyBuYW1lIGZvciBkaWFnIG1zZ3MgKi8KIAotCXN0cnVjdCBwY2lfZGV2ICpwYnVzOwkJLyogYnVzIGhhbmRsZSAqLworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZTsKKwlzdHJ1Y3QgZGV2aWNlICpkbWFkZXY7CiAKIAlib29sIGRtYTY0OwkvKiB0aGlzIGRtYSBlbmdpbmUgaXMgb3BlcmF0aW5nIGluIDY0LWJpdCBtb2RlICovCiAJYm9vbCBhZGRyZXh0OwkvKiB0aGlzIGRtYSBlbmdpbmUgc3VwcG9ydHMgRG1hRXh0ZW5kZWRBZGRyQ2hhbmdlcyAqLwogCiAJLyogNjQtYml0IGRtYSB0eCBlbmdpbmUgcmVnaXN0ZXJzICovCi0Jc3RydWN0IGRtYTY0cmVncyBfX2lvbWVtICpkNjR0eHJlZ3M7CisJdWludCBkNjR0eHJlZ2Jhc2U7CiAJLyogNjQtYml0IGRtYSByeCBlbmdpbmUgcmVnaXN0ZXJzICovCi0Jc3RydWN0IGRtYTY0cmVncyBfX2lvbWVtICpkNjRyeHJlZ3M7CisJdWludCBkNjRyeHJlZ2Jhc2U7CiAJLyogcG9pbnRlciB0byBkbWE2NCB0eCBkZXNjcmlwdG9yIHJpbmcgKi8KIAlzdHJ1Y3QgZG1hNjRkZXNjICp0eGQ2NDsKIAkvKiBwb2ludGVyIHRvIGRtYTY0IHJ4IGRlc2NyaXB0b3IgcmluZyAqLwpAQCAtMzYxLDcgKzM3MSw3IEBACiAJdWludCBkbWFjdHJsZmxhZ3M7CiAKIAlpZiAoZGkgPT0gTlVMTCkgewotCQlETUFfRVJST1IoKCJfZG1hX2N0cmxmbGFnczogTlVMTCBkbWEgaGFuZGxlXG4iKSk7CisJCURNQV9FUlJPUigiTlVMTCBkbWEgaGFuZGxlXG4iKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0zNzMsMTUgKzM4MywxNiBAQAogCWlmIChkbWFjdHJsZmxhZ3MgJiBETUFfQ1RSTF9QRU4pIHsKIAkJdTMyIGNvbnRyb2w7CiAKLQkJY29udHJvbCA9IFJfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sKTsKLQkJV19SRUcoJmRpLT5kNjR0eHJlZ3MtPmNvbnRyb2wsCisJCWNvbnRyb2wgPSBiY21hX3JlYWQzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIGNvbnRyb2wpKTsKKwkJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgY29udHJvbCksCiAJCSAgICAgIGNvbnRyb2wgfCBENjRfWENfUEQpOwotCQlpZiAoUl9SRUcoJmRpLT5kNjR0eHJlZ3MtPmNvbnRyb2wpICYgRDY0X1hDX1BEKQorCQlpZiAoYmNtYV9yZWFkMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBjb250cm9sKSkgJgorCQkgICAgRDY0X1hDX1BEKQogCQkJLyogV2UgKmNhbiogZGlzYWJsZSBpdCBzbyBpdCBpcyBzdXBwb3J0ZWQsCiAJCQkgKiByZXN0b3JlIGNvbnRyb2wgcmVnaXN0ZXIKIAkJCSAqLwotCQkJV19SRUcoJmRpLT5kNjR0eHJlZ3MtPmNvbnRyb2wsCi0JCQljb250cm9sKTsKKwkJCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIGNvbnRyb2wpLAorCQkJCSAgICAgY29udHJvbCk7CiAJCWVsc2UKIAkJCS8qIE5vdCBzdXBwb3J0ZWQsIGRvbid0IGFsbG93IGl0IHRvIGJlIGVuYWJsZWQgKi8KIAkJCWRtYWN0cmxmbGFncyAmPSB+RE1BX0NUUkxfUEVOOwpAQCAtMzkyLDEyICs0MDMsMTIgQEAKIAlyZXR1cm4gZG1hY3RybGZsYWdzOwogfQogCi1zdGF0aWMgYm9vbCBfZG1hNjRfYWRkcmV4dChzdHJ1Y3QgZG1hNjRyZWdzIF9faW9tZW0gKmRtYTY0cmVncykKK3N0YXRpYyBib29sIF9kbWE2NF9hZGRyZXh0KHN0cnVjdCBkbWFfaW5mbyAqZGksIHVpbnQgY3RybF9vZmZzZXQpCiB7CiAJdTMyIHc7Ci0JT1JfUkVHKCZkbWE2NHJlZ3MtPmNvbnRyb2wsIEQ2NF9YQ19BRSk7Ci0JdyA9IFJfUkVHKCZkbWE2NHJlZ3MtPmNvbnRyb2wpOwotCUFORF9SRUcoJmRtYTY0cmVncy0+Y29udHJvbCwgfkQ2NF9YQ19BRSk7CisJYmNtYV9zZXQzMihkaS0+Y29yZSwgY3RybF9vZmZzZXQsIEQ2NF9YQ19BRSk7CisJdyA9IGJjbWFfcmVhZDMyKGRpLT5jb3JlLCBjdHJsX29mZnNldCk7CisJYmNtYV9tYXNrMzIoZGktPmNvcmUsIGN0cmxfb2Zmc2V0LCB+RDY0X1hDX0FFKTsKIAlyZXR1cm4gKHcgJiBENjRfWENfQUUpID09IEQ2NF9YQ19BRTsKIH0KIApAQCAtNDEwLDE1ICs0MjEsMTUgQEAKIAkvKiBETUE2NCBzdXBwb3J0cyBmdWxsIDMyLSBvciA2NC1iaXQgb3BlcmF0aW9uLiBBRSBpcyBhbHdheXMgdmFsaWQgKi8KIAogCS8qIG5vdCBhbGwgdHggb3IgcnggY2hhbm5lbCBhcmUgYXZhaWxhYmxlICovCi0JaWYgKGRpLT5kNjR0eHJlZ3MgIT0gTlVMTCkgewotCQlpZiAoIV9kbWE2NF9hZGRyZXh0KGRpLT5kNjR0eHJlZ3MpKQotCQkJRE1BX0VSUk9SKCgiJXM6IF9kbWFfaXNhZGRyZXh0OiBETUE2NCB0eCBkb2Vzbid0IGhhdmUgIgotCQkJCSAgICJBRSBzZXRcbiIsIGRpLT5uYW1lKSk7CisJaWYgKGRpLT5kNjR0eHJlZ2Jhc2UgIT0gMCkgeworCQlpZiAoIV9kbWE2NF9hZGRyZXh0KGRpLCBETUE2NFRYUkVHT0ZGUyhkaSwgY29udHJvbCkpKQorCQkJRE1BX0VSUk9SKCIlczogRE1BNjQgdHggZG9lc24ndCBoYXZlIEFFIHNldFxuIiwKKwkJCQkgIGRpLT5uYW1lKTsKIAkJcmV0dXJuIHRydWU7Ci0JfSBlbHNlIGlmIChkaS0+ZDY0cnhyZWdzICE9IE5VTEwpIHsKLQkJaWYgKCFfZG1hNjRfYWRkcmV4dChkaS0+ZDY0cnhyZWdzKSkKLQkJCURNQV9FUlJPUigoIiVzOiBfZG1hX2lzYWRkcmV4dDogRE1BNjQgcnggZG9lc24ndCBoYXZlICIKLQkJCQkgICAiQUUgc2V0XG4iLCBkaS0+bmFtZSkpOworCX0gZWxzZSBpZiAoZGktPmQ2NHJ4cmVnYmFzZSAhPSAwKSB7CisJCWlmICghX2RtYTY0X2FkZHJleHQoZGksIERNQTY0UlhSRUdPRkZTKGRpLCBjb250cm9sKSkpCisJCQlETUFfRVJST1IoIiVzOiBETUE2NCByeCBkb2Vzbid0IGhhdmUgQUUgc2V0XG4iLAorCQkJCSAgZGktPm5hbWUpOwogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKQEAgLTQzMCwxNCArNDQxLDE0IEBACiAJdTMyIGFkZHJsOwogCiAJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBkZXNjcmlwdG9ycyBuZWVkIHRvIGJlIGFsaWduZWQgb24gNEsvOEsgb3Igbm90ICovCi0JaWYgKGRpLT5kNjR0eHJlZ3MgIT0gTlVMTCkgewotCQlXX1JFRygmZGktPmQ2NHR4cmVncy0+YWRkcmxvdywgMHhmZjApOwotCQlhZGRybCA9IFJfUkVHKCZkaS0+ZDY0dHhyZWdzLT5hZGRybG93KTsKKwlpZiAoZGktPmQ2NHR4cmVnYmFzZSAhPSAwKSB7CisJCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIGFkZHJsb3cpLCAweGZmMCk7CisJCWFkZHJsID0gYmNtYV9yZWFkMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBhZGRybG93KSk7CiAJCWlmIChhZGRybCAhPSAwKQogCQkJcmV0dXJuIGZhbHNlOwotCX0gZWxzZSBpZiAoZGktPmQ2NHJ4cmVncyAhPSBOVUxMKSB7Ci0JCVdfUkVHKCZkaS0+ZDY0cnhyZWdzLT5hZGRybG93LCAweGZmMCk7Ci0JCWFkZHJsID0gUl9SRUcoJmRpLT5kNjRyeHJlZ3MtPmFkZHJsb3cpOworCX0gZWxzZSBpZiAoZGktPmQ2NHJ4cmVnYmFzZSAhPSAwKSB7CisJCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRSWFJFR09GRlMoZGksIGFkZHJsb3cpLCAweGZmMCk7CisJCWFkZHJsID0gYmNtYV9yZWFkMzIoZGktPmNvcmUsIERNQTY0UlhSRUdPRkZTKGRpLCBhZGRybG93KSk7CiAJCWlmIChhZGRybCAhPSAwKQogCQkJcmV0dXJuIGZhbHNlOwogCX0KQEAgLTQ0OCw3ICs0NTksNyBAQAogICogRGVzY3JpcHRvciB0YWJsZSBtdXN0IHN0YXJ0IGF0IHRoZSBETUEgaGFyZHdhcmUgZGljdGF0ZWQgYWxpZ25tZW50LCBzbwogICogYWxsb2NhdGVkIG1lbW9yeSBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBzdXBwb3J0IHRoaXMgcmVxdWlyZW1lbnQuCiAgKi8KLXN0YXRpYyB2b2lkICpkbWFfYWxsb2NfY29uc2lzdGVudChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdWludCBzaXplLAorc3RhdGljIHZvaWQgKmRtYV9hbGxvY19jb25zaXN0ZW50KHN0cnVjdCBkbWFfaW5mbyAqZGksIHVpbnQgc2l6ZSwKIAkJCQkgIHUxNiBhbGlnbl9iaXRzLCB1aW50ICphbGxvY2VkLAogCQkJCSAgZG1hX2FkZHJfdCAqcGFwKQogewpAQCAtNDU4LDcgKzQ2OSw3IEBACiAJCQlzaXplICs9IGFsaWduOwogCQkqYWxsb2NlZCA9IHNpemU7CiAJfQotCXJldHVybiBwY2lfYWxsb2NfY29uc2lzdGVudChwZGV2LCBzaXplLCBwYXApOworCXJldHVybiBkbWFfYWxsb2NfY29oZXJlbnQoZGktPmRtYWRldiwgc2l6ZSwgcGFwLCBHRlBfQVRPTUlDKTsKIH0KIAogc3RhdGljCkBAIC00ODQsNyArNDk1LDcgQEAKIAl1MzIgZGVzY19zdHJ0YWRkcjsKIAl1MzIgYWxpZ25ieXRlcyA9IDEgPDwgKmFsaWduYml0czsKIAotCXZhID0gZG1hX2FsbG9jX2NvbnNpc3RlbnQoZGktPnBidXMsIHNpemUsICphbGlnbmJpdHMsIGFsbG9jZWQsIGRlc2NwYSk7CisJdmEgPSBkbWFfYWxsb2NfY29uc2lzdGVudChkaSwgc2l6ZSwgKmFsaWduYml0cywgYWxsb2NlZCwgZGVzY3BhKTsKIAogCWlmIChOVUxMID09IHZhKQogCQlyZXR1cm4gTlVMTDsKQEAgLTQ5Myw4ICs1MDQsOCBAQAogCWlmICgoKGRlc2Nfc3RydGFkZHIgKyBzaXplIC0gMSkgJiBib3VuZGFyeSkgIT0gKGRlc2Nfc3RydGFkZHIKIAkJCQkJCQkmIGJvdW5kYXJ5KSkgewogCQkqYWxpZ25iaXRzID0gZG1hX2FsaWduX3NpemV0b2JpdHMoc2l6ZSk7Ci0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGktPnBidXMsIHNpemUsIHZhLCAqZGVzY3BhKTsKLQkJdmEgPSBkbWFfYWxsb2NfY29uc2lzdGVudChkaS0+cGJ1cywgc2l6ZSwgKmFsaWduYml0cywKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGktPmRtYWRldiwgc2l6ZSwgdmEsICpkZXNjcGEpOworCQl2YSA9IGRtYV9hbGxvY19jb25zaXN0ZW50KGRpLCBzaXplLCAqYWxpZ25iaXRzLAogCQkJYWxsb2NlZCwgZGVzY3BhKTsKIAl9CiAJcmV0dXJuIHZhOwpAQCAtNTE5LDggKzUzMCw4IEBACiAJCXZhID0gZG1hX3JpbmdhbGxvYyhkaSwgRDY0UklOR0FMSUdOLCBzaXplLCAmYWxpZ25fYml0cywKIAkJCSZhbGxvY2VkLCAmZGktPnR4ZHBhb3JpZyk7CiAJCWlmICh2YSA9PSBOVUxMKSB7Ci0JCQlETUFfRVJST1IoKCIlczogZG1hNjRfYWxsb2M6IERNQV9BTExPQ19DT05TSVNURU5UKG50eGQpIgotCQkJCSAgICIgZmFpbGVkXG4iLCBkaS0+bmFtZSkpOworCQkJRE1BX0VSUk9SKCIlczogRE1BX0FMTE9DX0NPTlNJU1RFTlQobnR4ZCkgZmFpbGVkXG4iLAorCQkJCSAgZGktPm5hbWUpOwogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAJCWFsaWduID0gKDEgPDwgYWxpZ25fYml0cyk7CkBAIC01MzMsOCArNTQ0LDggQEAKIAkJdmEgPSBkbWFfcmluZ2FsbG9jKGRpLCBENjRSSU5HQUxJR04sIHNpemUsICZhbGlnbl9iaXRzLAogCQkJJmFsbG9jZWQsICZkaS0+cnhkcGFvcmlnKTsKIAkJaWYgKHZhID09IE5VTEwpIHsKLQkJCURNQV9FUlJPUigoIiVzOiBkbWE2NF9hbGxvYzogRE1BX0FMTE9DX0NPTlNJU1RFTlQobnJ4ZCkiCi0JCQkJICAgIiBmYWlsZWRcbiIsIGRpLT5uYW1lKSk7CisJCQlETUFfRVJST1IoIiVzOiBETUFfQUxMT0NfQ09OU0lTVEVOVChucnhkKSBmYWlsZWRcbiIsCisJCQkJICBkaS0+bmFtZSk7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KIAkJYWxpZ24gPSAoMSA8PCBhbGlnbl9iaXRzKTsKQEAgLTU1NCwxMiArNTY1LDEzIEBACiB9CiAKIHN0cnVjdCBkbWFfcHViICpkbWFfYXR0YWNoKGNoYXIgKm5hbWUsIHN0cnVjdCBzaV9wdWIgKnNpaCwKLQkJICAgICB2b2lkIF9faW9tZW0gKmRtYXJlZ3N0eCwgdm9pZCBfX2lvbWVtICpkbWFyZWdzcngsCi0JCSAgICAgdWludCBudHhkLCB1aW50IG5yeGQsCi0JCSAgICAgdWludCByeGJ1ZnNpemUsIGludCByeGV4dGhlYWRyb29tLAotCQkgICAgIHVpbnQgbnJ4cG9zdCwgdWludCByeG9mZnNldCwgdWludCAqbXNnX2xldmVsKQorCQkJICAgc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLAorCQkJICAgdWludCB0eHJlZ2Jhc2UsIHVpbnQgcnhyZWdiYXNlLCB1aW50IG50eGQsIHVpbnQgbnJ4ZCwKKwkJCSAgIHVpbnQgcnhidWZzaXplLCBpbnQgcnhleHRoZWFkcm9vbSwKKwkJCSAgIHVpbnQgbnJ4cG9zdCwgdWludCByeG9mZnNldCwgdWludCAqbXNnX2xldmVsKQogewogCXN0cnVjdCBkbWFfaW5mbyAqZGk7CisJdTggcmV2ID0gY29yZS0+aWQucmV2OwogCXVpbnQgc2l6ZTsKIAogCS8qIGFsbG9jYXRlIHByaXZhdGUgaW5mbyBzdHJ1Y3R1cmUgKi8KQEAgLTU3MCwxMSArNTgyLDEzIEBACiAJZGktPm1zZ19sZXZlbCA9IG1zZ19sZXZlbCA/IG1zZ19sZXZlbCA6ICZkbWFfbXNnX2xldmVsOwogCiAKLQlkaS0+ZG1hNjQgPSAoKGFpX2NvcmVfc2ZsYWdzKHNpaCwgMCwgMCkgJiBTSVNGX0RNQTY0KSA9PSBTSVNGX0RNQTY0KTsKKwlkaS0+ZG1hNjQgPQorCQkoKGJjbWFfYXJlYWQzMihjb3JlLCBCQ01BX0lPU1QpICYgU0lTRl9ETUE2NCkgPT0gU0lTRl9ETUE2NCk7CiAKLQkvKiBpbml0IGRtYSByZWcgcG9pbnRlciAqLwotCWRpLT5kNjR0eHJlZ3MgPSAoc3RydWN0IGRtYTY0cmVncyBfX2lvbWVtICopIGRtYXJlZ3N0eDsKLQlkaS0+ZDY0cnhyZWdzID0gKHN0cnVjdCBkbWE2NHJlZ3MgX19pb21lbSAqKSBkbWFyZWdzcng7CisJLyogaW5pdCBkbWEgcmVnIGluZm8gKi8KKwlkaS0+Y29yZSA9IGNvcmU7CisJZGktPmQ2NHR4cmVnYmFzZSA9IHR4cmVnYmFzZTsKKwlkaS0+ZDY0cnhyZWdiYXNlID0gcnhyZWdiYXNlOwogCiAJLyoKIAkgKiBEZWZhdWx0IGZsYWdzICh3aGljaCBjYW4gYmUgY2hhbmdlZCBieSB0aGUgZHJpdmVyIGNhbGxpbmcKQEAgLTU4MywxNyArNTk3LDE3IEBACiAJICovCiAJX2RtYV9jdHJsZmxhZ3MoZGksIERNQV9DVFJMX1JPQyB8IERNQV9DVFJMX1BFTiwgMCk7CiAKLQlETUFfVFJBQ0UoKCIlczogZG1hX2F0dGFjaDogJXMgZmxhZ3MgMHgleCBudHhkICVkIG5yeGQgJWQgIgotCQkgICAicnhidWZzaXplICVkIHJ4ZXh0aGVhZHJvb20gJWQgbnJ4cG9zdCAlZCByeG9mZnNldCAlZCAiCi0JCSAgICJkbWFyZWdzdHggJXAgZG1hcmVnc3J4ICVwXG4iLCBuYW1lLCAiRE1BNjQiLAotCQkgICBkaS0+ZG1hLmRtYWN0cmxmbGFncywgbnR4ZCwgbnJ4ZCwgcnhidWZzaXplLAotCQkgICByeGV4dGhlYWRyb29tLCBucnhwb3N0LCByeG9mZnNldCwgZG1hcmVnc3R4LCBkbWFyZWdzcngpKTsKKwlETUFfVFJBQ0UoIiVzOiAlcyBmbGFncyAweCV4IG50eGQgJWQgbnJ4ZCAlZCAiCisJCSAgInJ4YnVmc2l6ZSAlZCByeGV4dGhlYWRyb29tICVkIG5yeHBvc3QgJWQgcnhvZmZzZXQgJWQgIgorCQkgICJ0eHJlZ2Jhc2UgJXUgcnhyZWdiYXNlICV1XG4iLCBuYW1lLCAiRE1BNjQiLAorCQkgIGRpLT5kbWEuZG1hY3RybGZsYWdzLCBudHhkLCBucnhkLCByeGJ1ZnNpemUsCisJCSAgcnhleHRoZWFkcm9vbSwgbnJ4cG9zdCwgcnhvZmZzZXQsIHR4cmVnYmFzZSwgcnhyZWdiYXNlKTsKIAogCS8qIG1ha2UgYSBwcml2YXRlIGNvcHkgb2Ygb3VyIGNhbGxlcnMgbmFtZSAqLwogCXN0cm5jcHkoZGktPm5hbWUsIG5hbWUsIE1BWE5BTUVMKTsKIAlkaS0+bmFtZVtNQVhOQU1FTCAtIDFdID0gJ1wwJzsKIAotCWRpLT5wYnVzID0gKChzdHJ1Y3Qgc2lfaW5mbyAqKXNpaCktPnBidXM7CisJZGktPmRtYWRldiA9IGNvcmUtPmRtYV9kZXY7CiAKIAkvKiBzYXZlIHR1bmFibGVzICovCiAJZGktPm50eGQgPSAodTE2KSBudHhkOwpAQCAtNjI1LDEyICs2MzksMTIgQEAKIAlkaS0+ZGF0YW9mZnNldGxvdyA9IGRpLT5kZG9mZnNldGxvdzsKIAlkaS0+ZGF0YW9mZnNldGhpZ2ggPSBkaS0+ZGRvZmZzZXRoaWdoOwogCS8qIFdBUjY0NDUwIDogRE1BQ3RsLkFkZHIgZXh0IGZpZWxkcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBTRElPRCBjb3JlLiAqLwotCWlmICgoYWlfY29yZWlkKHNpaCkgPT0gU0RJT0RfQ09SRV9JRCkKLQkgICAgJiYgKChhaV9jb3JlcmV2KHNpaCkgPiAwKSAmJiAoYWlfY29yZXJldihzaWgpIDw9IDIpKSkKLQkJZGktPmFkZHJleHQgPSAwOwotCWVsc2UgaWYgKChhaV9jb3JlaWQoc2loKSA9PSBJMlNfQ09SRV9JRCkgJiYKLQkJICgoYWlfY29yZXJldihzaWgpID09IDApIHx8IChhaV9jb3JlcmV2KHNpaCkgPT0gMSkpKQotCQlkaS0+YWRkcmV4dCA9IDA7CisJaWYgKChjb3JlLT5pZC5pZCA9PSBTRElPRF9DT1JFX0lEKQorCSAgICAmJiAoKHJldiA+IDApICYmIChyZXYgPD0gMikpKQorCQlkaS0+YWRkcmV4dCA9IGZhbHNlOworCWVsc2UgaWYgKChjb3JlLT5pZC5pZCA9PSBJMlNfQ09SRV9JRCkgJiYKKwkJICgocmV2ID09IDApIHx8IChyZXYgPT0gMSkpKQorCQlkaS0+YWRkcmV4dCA9IGZhbHNlOwogCWVsc2UKIAkJZGktPmFkZHJleHQgPSBfZG1hX2lzYWRkcmV4dChkaSk7CiAKQEAgLTY0NSw4ICs2NTksOCBAQAogCQlkaS0+ZG1hZGVzY19hbGlnbiA9IDQ7CS8qIDE2IGJ5dGUgYWxpZ25tZW50ICovCiAJfQogCi0JRE1BX05PTkUoKCJETUEgZGVzY3JpcHRvciBhbGlnbl9uZWVkZWQgJWQsIGFsaWduICVkXG4iLAotCQkgIGRpLT5hbGlnbmRlc2NfNGssIGRpLT5kbWFkZXNjX2FsaWduKSk7CisJRE1BX05PTkUoIkRNQSBkZXNjcmlwdG9yIGFsaWduX25lZWRlZCAlZCwgYWxpZ24gJWRcbiIsCisJCSBkaS0+YWxpZ25kZXNjXzRrLCBkaS0+ZG1hZGVzY19hbGlnbik7CiAKIAkvKiBhbGxvY2F0ZSB0eCBwYWNrZXQgcG9pbnRlciB2ZWN0b3IgKi8KIAlpZiAobnR4ZCkgewpAQCAtNjg0LDIxICs2OTgsMjEgQEAKIAogCWlmICgoZGktPmRkb2Zmc2V0bG93ICE9IDApICYmICFkaS0+YWRkcmV4dCkgewogCQlpZiAoZGktPnR4ZHBhID4gU0lfUENJX0RNQV9TWikgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYV9hdHRhY2g6IHR4ZHBhIDB4JXg6IGFkZHJleHQgbm90ICIKLQkJCQkgICAic3VwcG9ydGVkXG4iLCBkaS0+bmFtZSwgKHUzMilkaS0+dHhkcGEpKTsKKwkJCURNQV9FUlJPUigiJXM6IHR4ZHBhIDB4JXg6IGFkZHJleHQgbm90IHN1cHBvcnRlZFxuIiwKKwkJCQkgIGRpLT5uYW1lLCAodTMyKWRpLT50eGRwYSk7CiAJCQlnb3RvIGZhaWw7CiAJCX0KIAkJaWYgKGRpLT5yeGRwYSA+IFNJX1BDSV9ETUFfU1opIHsKLQkJCURNQV9FUlJPUigoIiVzOiBkbWFfYXR0YWNoOiByeGRwYSAweCV4OiBhZGRyZXh0IG5vdCAiCi0JCQkJICAgInN1cHBvcnRlZFxuIiwgZGktPm5hbWUsICh1MzIpZGktPnJ4ZHBhKSk7CisJCQlETUFfRVJST1IoIiVzOiByeGRwYSAweCV4OiBhZGRyZXh0IG5vdCBzdXBwb3J0ZWRcbiIsCisJCQkJICBkaS0+bmFtZSwgKHUzMilkaS0+cnhkcGEpOwogCQkJZ290byBmYWlsOwogCQl9CiAJfQogCi0JRE1BX1RSQUNFKCgiZGRvZmZzZXRsb3cgMHgleCBkZG9mZnNldGhpZ2ggMHgleCBkYXRhb2Zmc2V0bG93IDB4JXggIgotCQkgICAiZGF0YW9mZnNldGhpZ2ggIiAiMHgleCBhZGRyZXh0ICVkXG4iLCBkaS0+ZGRvZmZzZXRsb3csCi0JCSAgIGRpLT5kZG9mZnNldGhpZ2gsIGRpLT5kYXRhb2Zmc2V0bG93LCBkaS0+ZGF0YW9mZnNldGhpZ2gsCi0JCSAgIGRpLT5hZGRyZXh0KSk7CisJRE1BX1RSQUNFKCJkZG9mZnNldGxvdyAweCV4IGRkb2Zmc2V0aGlnaCAweCV4IGRhdGFvZmZzZXRsb3cgMHgleCBkYXRhb2Zmc2V0aGlnaCAweCV4IGFkZHJleHQgJWRcbiIsCisJCSAgZGktPmRkb2Zmc2V0bG93LCBkaS0+ZGRvZmZzZXRoaWdoLAorCQkgIGRpLT5kYXRhb2Zmc2V0bG93LCBkaS0+ZGF0YW9mZnNldGhpZ2gsCisJCSAgZGktPmFkZHJleHQpOwogCiAJcmV0dXJuIChzdHJ1Y3QgZG1hX3B1YiAqKSBkaTsKIApAQCAtNzQ0LDE3ICs3NTgsMTcgQEAKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfZGV0YWNoXG4iLCBkaS0+bmFtZSkpOworCURNQV9UUkFDRSgiJXM6XG4iLCBkaS0+bmFtZSk7CiAKIAkvKiBmcmVlIGRtYSBkZXNjcmlwdG9yIHJpbmdzICovCiAJaWYgKGRpLT50eGQ2NCkKLQkJcGNpX2ZyZWVfY29uc2lzdGVudChkaS0+cGJ1cywgZGktPnR4ZGFsbG9jLAotCQkJCSAgICAoKHM4ICopZGktPnR4ZDY0IC0gZGktPnR4ZGFsaWduKSwKLQkJCQkgICAgKGRpLT50eGRwYW9yaWcpKTsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoZGktPmRtYWRldiwgZGktPnR4ZGFsbG9jLAorCQkJCSAgKChzOCAqKWRpLT50eGQ2NCAtIGRpLT50eGRhbGlnbiksCisJCQkJICAoZGktPnR4ZHBhb3JpZykpOwogCWlmIChkaS0+cnhkNjQpCi0JCXBjaV9mcmVlX2NvbnNpc3RlbnQoZGktPnBidXMsIGRpLT5yeGRhbGxvYywKLQkJCQkgICAgKChzOCAqKWRpLT5yeGQ2NCAtIGRpLT5yeGRhbGlnbiksCi0JCQkJICAgIChkaS0+cnhkcGFvcmlnKSk7CisJCWRtYV9mcmVlX2NvaGVyZW50KGRpLT5kbWFkZXYsIGRpLT5yeGRhbGxvYywKKwkJCQkgICgoczggKilkaS0+cnhkNjQgLSBkaS0+cnhkYWxpZ24pLAorCQkJCSAgKGRpLT5yeGRwYW9yaWcpKTsKIAogCS8qIGZyZWUgcGFja2V0IHBvaW50ZXIgdmVjdG9ycyAqLwogCWtmcmVlKGRpLT50eHApOwpAQCAtNzc5LDExICs3OTMsMTUgQEAKIAlpZiAoKGRpLT5kZG9mZnNldGxvdyA9PSAwKQogCSAgICB8fCAhKHBhICYgUENJMzJBRERSX0hJR0gpKSB7CiAJCWlmIChkaXJlY3Rpb24gPT0gRE1BX1RYKSB7Ci0JCQlXX1JFRygmZGktPmQ2NHR4cmVncy0+YWRkcmxvdywgcGEgKyBkaS0+ZGRvZmZzZXRsb3cpOwotCQkJV19SRUcoJmRpLT5kNjR0eHJlZ3MtPmFkZHJoaWdoLCBkaS0+ZGRvZmZzZXRoaWdoKTsKKwkJCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIGFkZHJsb3cpLAorCQkJCSAgICAgcGEgKyBkaS0+ZGRvZmZzZXRsb3cpOworCQkJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgYWRkcmhpZ2gpLAorCQkJCSAgICAgZGktPmRkb2Zmc2V0aGlnaCk7CiAJCX0gZWxzZSB7Ci0JCQlXX1JFRygmZGktPmQ2NHJ4cmVncy0+YWRkcmxvdywgcGEgKyBkaS0+ZGRvZmZzZXRsb3cpOwotCQkJV19SRUcoJmRpLT5kNjRyeHJlZ3MtPmFkZHJoaWdoLCBkaS0+ZGRvZmZzZXRoaWdoKTsKKwkJCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRSWFJFR09GRlMoZGksIGFkZHJsb3cpLAorCQkJCSAgICAgcGEgKyBkaS0+ZGRvZmZzZXRsb3cpOworCQkJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFJYUkVHT0ZGUyhkaSwgYWRkcmhpZ2gpLAorCQkJCSAgICAgZGktPmRkb2Zmc2V0aGlnaCk7CiAJCX0KIAl9IGVsc2UgewogCQkvKiBETUE2NCAzMmJpdHMgYWRkcmVzcyBleHRlbnNpb24gKi8KQEAgLTc5NCwxNSArODEyLDE5IEBACiAJCXBhICY9IH5QQ0kzMkFERFJfSElHSDsKIAogCQlpZiAoZGlyZWN0aW9uID09IERNQV9UWCkgewotCQkJV19SRUcoJmRpLT5kNjR0eHJlZ3MtPmFkZHJsb3csIHBhICsgZGktPmRkb2Zmc2V0bG93KTsKLQkJCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5hZGRyaGlnaCwgZGktPmRkb2Zmc2V0aGlnaCk7Ci0JCQlTRVRfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLAotCQkJCUQ2NF9YQ19BRSwgKGFlIDw8IEQ2NF9YQ19BRV9TSElGVCkpOworCQkJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgYWRkcmxvdyksCisJCQkJICAgICBwYSArIGRpLT5kZG9mZnNldGxvdyk7CisJCQliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBhZGRyaGlnaCksCisJCQkJICAgICBkaS0+ZGRvZmZzZXRoaWdoKTsKKwkJCWJjbWFfbWFza3NldDMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgY29udHJvbCksCisJCQkJICAgICAgIEQ2NF9YQ19BRSwgKGFlIDw8IEQ2NF9YQ19BRV9TSElGVCkpOwogCQl9IGVsc2UgewotCQkJV19SRUcoJmRpLT5kNjRyeHJlZ3MtPmFkZHJsb3csIHBhICsgZGktPmRkb2Zmc2V0bG93KTsKLQkJCVdfUkVHKCZkaS0+ZDY0cnhyZWdzLT5hZGRyaGlnaCwgZGktPmRkb2Zmc2V0aGlnaCk7Ci0JCQlTRVRfUkVHKCZkaS0+ZDY0cnhyZWdzLT5jb250cm9sLAotCQkJCUQ2NF9SQ19BRSwgKGFlIDw8IEQ2NF9SQ19BRV9TSElGVCkpOworCQkJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFJYUkVHT0ZGUyhkaSwgYWRkcmxvdyksCisJCQkJICAgICBwYSArIGRpLT5kZG9mZnNldGxvdyk7CisJCQliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0UlhSRUdPRkZTKGRpLCBhZGRyaGlnaCksCisJCQkJICAgICBkaS0+ZGRvZmZzZXRoaWdoKTsKKwkJCWJjbWFfbWFza3NldDMyKGRpLT5jb3JlLCBETUE2NFJYUkVHT0ZGUyhkaSwgY29udHJvbCksCisJCQkJICAgICAgIEQ2NF9SQ19BRSwgKGFlIDw8IEQ2NF9SQ19BRV9TSElGVCkpOwogCQl9CiAJfQogfQpAQCAtODEyLDExICs4MzQsMTEgQEAKIAl1aW50IGRtYWN0cmxmbGFncyA9IGRpLT5kbWEuZG1hY3RybGZsYWdzOwogCXUzMiBjb250cm9sOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeGVuYWJsZVxuIiwgZGktPm5hbWUpKTsKKwlETUFfVFJBQ0UoIiVzOlxuIiwgZGktPm5hbWUpOwogCi0JY29udHJvbCA9Ci0JICAgIChSX1JFRygmZGktPmQ2NHJ4cmVncy0+Y29udHJvbCkgJiBENjRfUkNfQUUpIHwKLQkgICAgRDY0X1JDX1JFOworCWNvbnRyb2wgPSBENjRfUkNfUkUgfCAoYmNtYV9yZWFkMzIoZGktPmNvcmUsCisJCQkJCSAgIERNQTY0UlhSRUdPRkZTKGRpLCBjb250cm9sKSkgJgorCQkJICAgICAgIEQ2NF9SQ19BRSk7CiAKIAlpZiAoKGRtYWN0cmxmbGFncyAmIERNQV9DVFJMX1BFTikgPT0gMCkKIAkJY29udHJvbCB8PSBENjRfUkNfUEQ7CkBAIC04MjQsNyArODQ2LDcgQEAKIAlpZiAoZG1hY3RybGZsYWdzICYgRE1BX0NUUkxfUk9DKQogCQljb250cm9sIHw9IEQ2NF9SQ19PQzsKIAotCVdfUkVHKCZkaS0+ZDY0cnhyZWdzLT5jb250cm9sLAorCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRSWFJFR09GRlMoZGksIGNvbnRyb2wpLAogCQkoKGRpLT5yeG9mZnNldCA8PCBENjRfUkNfUk9fU0hJRlQpIHwgY29udHJvbCkpOwogfQogCkBAIC04MzIsNyArODU0LDcgQEAKIHsKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfcnhpbml0XG4iLCBkaS0+bmFtZSkpOworCURNQV9UUkFDRSgiJXM6XG4iLCBkaS0+bmFtZSk7CiAKIAlpZiAoZGktPm5yeGQgPT0gMCkKIAkJcmV0dXJuOwpAQCAtODY3LDcgKzg4OSw4IEBACiAJCXJldHVybiBOVUxMOwogCiAJY3VyciA9Ci0JICAgIEIySSgoKFJfUkVHKCZkaS0+ZDY0cnhyZWdzLT5zdGF0dXMwKSAmIEQ2NF9SUzBfQ0RfTUFTSykgLQorCSAgICBCMkkoKChiY21hX3JlYWQzMihkaS0+Y29yZSwKKwkJCSAgICAgIERNQTY0UlhSRUdPRkZTKGRpLCBzdGF0dXMwKSkgJiBENjRfUlMwX0NEX01BU0spIC0KIAkJIGRpLT5yY3ZwdHJiYXNlKSAmIEQ2NF9SUzBfQ0RfTUFTSywgc3RydWN0IGRtYTY0ZGVzYyk7CiAKIAkvKiBpZ25vcmUgY3VyciBpZiBmb3JjZWFsbCAqLwpAQCAtODgxLDcgKzkwNCw3IEBACiAJcGEgPSBsZTMyX3RvX2NwdShkaS0+cnhkNjRbaV0uYWRkcmxvdykgLSBkaS0+ZGF0YW9mZnNldGxvdzsKIAogCS8qIGNsZWFyIHRoaXMgcGFja2V0IGZyb20gdGhlIGRlc2NyaXB0b3IgcmluZyAqLwotCXBjaV91bm1hcF9zaW5nbGUoZGktPnBidXMsIHBhLCBkaS0+cnhidWZzaXplLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCWRtYV91bm1hcF9zaW5nbGUoZGktPmRtYWRldiwgcGEsIGRpLT5yeGJ1ZnNpemUsIERNQV9GUk9NX0RFVklDRSk7CiAKIAlkaS0+cnhkNjRbaV0uYWRkcmxvdyA9IGNwdV90b19sZTMyKDB4ZGVhZGJlZWYpOwogCWRpLT5yeGQ2NFtpXS5hZGRyaGlnaCA9IGNwdV90b19sZTMyKDB4ZGVhZGJlZWYpOwpAQCAtOTAxLDcgKzkyNCw3IEBACiAKIC8qCiAgKiAhISByeCBlbnRyeSByb3V0aW5lCi0gKiByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgbmV4dCBmcmFtZSByZWNlaXZlZCwgb3IgTlVMTCBpZiB0aGVyZSBhcmUgbm8gbW9yZQorICogcmV0dXJucyB0aGUgbnVtYmVyIHBhY2thZ2VzIGluIHRoZSBuZXh0IGZyYW1lLCBvciAwIGlmIHRoZXJlIGFyZSBubyBtb3JlCiAgKiAgIGlmIERNQV9DVFJMX1JYTVVMVEkgaXMgZGVmaW5lZCwgRE1BIHNjYXR0ZXJpbmcobXVsdGlwbGUgYnVmZmVycykgaXMKICAqICAgc3VwcG9ydGVkIHdpdGggcGt0cyBjaGFpbgogICogICBvdGhlcndpc2UsIGl0J3MgdHJlYXRlZCBhcyBnaWFudCBwa3QgYW5kIHdpbGwgYmUgdG9zc2VkLgpAQCAtOTA5LDc0ICs5MzIsODMgQEAKICAqICAgYnVmZmVyIGRhdGEuIEFmdGVyIGl0IHJlYWNoZXMgdGhlIG1heCBzaXplIG9mIGJ1ZmZlciwgdGhlIGRhdGEgY29udGludWVzCiAgKiAgIGluIG5leHQgRE1BIGRlc2NyaXB0b3IgYnVmZmVyIFdJVEhPVVQgRE1BIGhlYWRlcgogICovCi1zdHJ1Y3Qgc2tfYnVmZiAqZG1hX3J4KHN0cnVjdCBkbWFfcHViICpwdWIpCitpbnQgZG1hX3J4KHN0cnVjdCBkbWFfcHViICpwdWIsIHN0cnVjdCBza19idWZmX2hlYWQgKnNrYl9saXN0KQogewogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwotCXN0cnVjdCBza19idWZmICpwLCAqaGVhZCwgKnRhaWw7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBkbWFfZnJhbWVzOworCXN0cnVjdCBza19idWZmICpwLCAqbmV4dDsKIAl1aW50IGxlbjsKIAl1aW50IHBrdF9sZW47CiAJaW50IHJlc2lkID0gMDsKKwlpbnQgcGt0Y250ID0gMTsKIAorCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmRtYV9mcmFtZXMpOwogIG5leHRfZnJhbWU6Ci0JaGVhZCA9IF9kbWFfZ2V0bmV4dHJ4cChkaSwgZmFsc2UpOwotCWlmIChoZWFkID09IE5VTEwpCi0JCXJldHVybiBOVUxMOworCXAgPSBfZG1hX2dldG5leHRyeHAoZGksIGZhbHNlKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKIAotCWxlbiA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopIChoZWFkLT5kYXRhKSk7Ci0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeCBsZW4gJWRcbiIsIGRpLT5uYW1lLCBsZW4pKTsKLQlkbWFfc3Bpbl9mb3JfbGVuKGxlbiwgaGVhZCk7CisJbGVuID0gbGUxNl90b19jcHUoKihfX2xlMTYgKikgKHAtPmRhdGEpKTsKKwlETUFfVFJBQ0UoIiVzOiBkbWFfcnggbGVuICVkXG4iLCBkaS0+bmFtZSwgbGVuKTsKKwlkbWFfc3Bpbl9mb3JfbGVuKGxlbiwgcCk7CiAKIAkvKiBzZXQgYWN0dWFsIGxlbmd0aCAqLwogCXBrdF9sZW4gPSBtaW4oKGRpLT5yeG9mZnNldCArIGxlbiksIGRpLT5yeGJ1ZnNpemUpOwotCV9fc2tiX3RyaW0oaGVhZCwgcGt0X2xlbik7CisJX19za2JfdHJpbShwLCBwa3RfbGVuKTsKKwlza2JfcXVldWVfdGFpbCgmZG1hX2ZyYW1lcywgcCk7CiAJcmVzaWQgPSBsZW4gLSAoZGktPnJ4YnVmc2l6ZSAtIGRpLT5yeG9mZnNldCk7CiAKIAkvKiBjaGVjayBmb3Igc2luZ2xlIG9yIG11bHRpLWJ1ZmZlciByeCAqLwogCWlmIChyZXNpZCA+IDApIHsKLQkJdGFpbCA9IGhlYWQ7CiAJCXdoaWxlICgocmVzaWQgPiAwKSAmJiAocCA9IF9kbWFfZ2V0bmV4dHJ4cChkaSwgZmFsc2UpKSkgewotCQkJdGFpbC0+bmV4dCA9IHA7CiAJCQlwa3RfbGVuID0gbWluX3QodWludCwgcmVzaWQsIGRpLT5yeGJ1ZnNpemUpOwogCQkJX19za2JfdHJpbShwLCBwa3RfbGVuKTsKLQotCQkJdGFpbCA9IHA7CisJCQlza2JfcXVldWVfdGFpbCgmZG1hX2ZyYW1lcywgcCk7CiAJCQlyZXNpZCAtPSBkaS0+cnhidWZzaXplOworCQkJcGt0Y250Kys7CiAJCX0KIAogI2lmZGVmIEJDTURCRwogCQlpZiAocmVzaWQgPiAwKSB7CiAJCQl1aW50IGN1cjsKIAkJCWN1ciA9Ci0JCQkgICAgQjJJKCgoUl9SRUcoJmRpLT5kNjRyeHJlZ3MtPnN0YXR1czApICYKLQkJCQkgIEQ2NF9SUzBfQ0RfTUFTSykgLQotCQkJCSBkaS0+cmN2cHRyYmFzZSkgJiBENjRfUlMwX0NEX01BU0ssCi0JCQkJc3RydWN0IGRtYTY0ZGVzYyk7Ci0JCQlETUFfRVJST1IoKCJkbWFfcngsIHJ4aW4gJWQgcnhvdXQgJWQsIGh3X2N1cnIgJWRcbiIsCi0JCQkJICAgZGktPnJ4aW4sIGRpLT5yeG91dCwgY3VyKSk7CisJCQkgICAgQjJJKCgoYmNtYV9yZWFkMzIoZGktPmNvcmUsCisJCQkJCSAgICAgIERNQTY0UlhSRUdPRkZTKGRpLCBzdGF0dXMwKSkgJgorCQkJCSAgRDY0X1JTMF9DRF9NQVNLKSAtIGRpLT5yY3ZwdHJiYXNlKSAmCisJCQkJRDY0X1JTMF9DRF9NQVNLLCBzdHJ1Y3QgZG1hNjRkZXNjKTsKKwkJCURNQV9FUlJPUigicnhpbiAlZCByeG91dCAlZCwgaHdfY3VyciAlZFxuIiwKKwkJCQkgICBkaS0+cnhpbiwgZGktPnJ4b3V0LCBjdXIpOwogCQl9CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKIAkJaWYgKChkaS0+ZG1hLmRtYWN0cmxmbGFncyAmIERNQV9DVFJMX1JYTVVMVEkpID09IDApIHsKLQkJCURNQV9FUlJPUigoIiVzOiBkbWFfcng6IGJhZCBmcmFtZSBsZW5ndGggKCVkKVxuIiwKLQkJCQkgICBkaS0+bmFtZSwgbGVuKSk7Ci0JCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKGhlYWQpOworCQkJRE1BX0VSUk9SKCIlczogYmFkIGZyYW1lIGxlbmd0aCAoJWQpXG4iLAorCQkJCSAgZGktPm5hbWUsIGxlbik7CisJCQlza2JfcXVldWVfd2Fsa19zYWZlKCZkbWFfZnJhbWVzLCBwLCBuZXh0KSB7CisJCQkJc2tiX3VubGluayhwLCAmZG1hX2ZyYW1lcyk7CisJCQkJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwKTsKKwkJCX0KIAkJCWRpLT5kbWEucnhnaWFudHMrKzsKKwkJCXBrdGNudCA9IDE7CiAJCQlnb3RvIG5leHRfZnJhbWU7CiAJCX0KIAl9CiAKLQlyZXR1cm4gaGVhZDsKKwlza2JfcXVldWVfc3BsaWNlX3RhaWwoJmRtYV9mcmFtZXMsIHNrYl9saXN0KTsKKwlyZXR1cm4gcGt0Y250OwogfQogCiBzdGF0aWMgYm9vbCBkbWE2NF9yeGlkbGUoc3RydWN0IGRtYV9pbmZvICpkaSkKIHsKLQlETUFfVFJBQ0UoKCIlczogZG1hX3J4aWRsZVxuIiwgZGktPm5hbWUpKTsKKwlETUFfVFJBQ0UoIiVzOlxuIiwgZGktPm5hbWUpOwogCiAJaWYgKGRpLT5ucnhkID09IDApCiAJCXJldHVybiB0cnVlOwogCi0JcmV0dXJuICgoUl9SRUcoJmRpLT5kNjRyeHJlZ3MtPnN0YXR1czApICYgRDY0X1JTMF9DRF9NQVNLKSA9PQotCQkoUl9SRUcoJmRpLT5kNjRyeHJlZ3MtPnB0cikgJiBENjRfUlMwX0NEX01BU0spKTsKKwlyZXR1cm4gKChiY21hX3JlYWQzMihkaS0+Y29yZSwKKwkJCSAgICAgRE1BNjRSWFJFR09GRlMoZGksIHN0YXR1czApKSAmIEQ2NF9SUzBfQ0RfTUFTSykgPT0KKwkJKGJjbWFfcmVhZDMyKGRpLT5jb3JlLCBETUE2NFJYUkVHT0ZGUyhkaSwgcHRyKSkgJgorCQkgRDY0X1JTMF9DRF9NQVNLKSk7CiB9CiAKIC8qCkBAIC0xMDEwLDcgKzEwNDIsNyBAQAogCiAJbiA9IGRpLT5ucnhwb3N0IC0gbnJ4ZGFjdGl2ZShkaSwgcnhpbiwgcnhvdXQpOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV9yeGZpbGw6IHBvc3QgJWRcbiIsIGRpLT5uYW1lLCBuKSk7CisJRE1BX1RSQUNFKCIlczogcG9zdCAlZFxuIiwgZGktPm5hbWUsIG4pOwogCiAJaWYgKGRpLT5yeGJ1ZnNpemUgPiBCQ01FWFRSQUhEUk9PTSkKIAkJZXh0cmFfb2Zmc2V0ID0gZGktPnJ4ZXh0cmFoZHJyb29tOwpAQCAtMTAyMywxMSArMTA1NSw5IEBACiAJCXAgPSBicmNtdV9wa3RfYnVmX2dldF9za2IoZGktPnJ4YnVmc2l6ZSArIGV4dHJhX29mZnNldCk7CiAKIAkJaWYgKHAgPT0gTlVMTCkgewotCQkJRE1BX0VSUk9SKCgiJXM6IGRtYV9yeGZpbGw6IG91dCBvZiByeGJ1ZnNcbiIsCi0JCQkJICAgZGktPm5hbWUpKTsKKwkJCURNQV9FUlJPUigiJXM6IG91dCBvZiByeGJ1ZnNcbiIsIGRpLT5uYW1lKTsKIAkJCWlmIChpID09IDAgJiYgZG1hNjRfcnhpZGxlKGRpKSkgewotCQkJCURNQV9FUlJPUigoIiVzOiByeGZpbGw2NDogcmluZyBpcyBlbXB0eSAhXG4iLAotCQkJCQkgICBkaS0+bmFtZSkpOworCQkJCURNQV9FUlJPUigiJXM6IHJpbmcgaXMgZW1wdHkgIVxuIiwgZGktPm5hbWUpOwogCQkJCXJpbmdfZW1wdHkgPSB0cnVlOwogCQkJfQogCQkJZGktPmRtYS5yeG5vYnVmKys7CkBAIC0xMDQyLDggKzEwNzIsOCBAQAogCQkgKi8KIAkJKih1MzIgKikgKHAtPmRhdGEpID0gMDsKIAotCQlwYSA9IHBjaV9tYXBfc2luZ2xlKGRpLT5wYnVzLCBwLT5kYXRhLAotCQkJZGktPnJ4YnVmc2l6ZSwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcGEgPSBkbWFfbWFwX3NpbmdsZShkaS0+ZG1hZGV2LCBwLT5kYXRhLCBkaS0+cnhidWZzaXplLAorCQkJCSAgICBETUFfRlJPTV9ERVZJQ0UpOwogCiAJCS8qIHNhdmUgdGhlIGZyZWUgcGFja2V0IHBvaW50ZXIgKi8KIAkJZGktPnJ4cFtyeG91dF0gPSBwOwpAQCAtMTA2MSw3ICsxMDkxLDcgQEAKIAlkaS0+cnhvdXQgPSByeG91dDsKIAogCS8qIHVwZGF0ZSB0aGUgY2hpcCBsYXN0ZHNjciBwb2ludGVyICovCi0JV19SRUcoJmRpLT5kNjRyeHJlZ3MtPnB0ciwKKwliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0UlhSRUdPRkZTKGRpLCBwdHIpLAogCSAgICAgIGRpLT5yY3ZwdHJiYXNlICsgSTJCKHJ4b3V0LCBzdHJ1Y3QgZG1hNjRkZXNjKSk7CiAKIAlyZXR1cm4gcmluZ19lbXB0eTsKQEAgLTEwNzIsNyArMTEwMiw3IEBACiAJc3RydWN0IGRtYV9pbmZvICpkaSA9IChzdHJ1Y3QgZG1hX2luZm8gKilwdWI7CiAJc3RydWN0IHNrX2J1ZmYgKnA7CiAKLQlETUFfVFJBQ0UoKCIlczogZG1hX3J4cmVjbGFpbVxuIiwgZGktPm5hbWUpKTsKKwlETUFfVFJBQ0UoIiVzOlxuIiwgZGktPm5hbWUpOwogCiAJd2hpbGUgKChwID0gX2RtYV9nZXRuZXh0cnhwKGRpLCB0cnVlKSkpCiAJCWJyY211X3BrdF9idWZfZnJlZV9za2IocCk7CkBAIC0xMTAzLDcgKzExMzMsNyBAQAogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwogCXUzMiBjb250cm9sID0gRDY0X1hDX1hFOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV90eGluaXRcbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCWlmIChkaS0+bnR4ZCA9PSAwKQogCQlyZXR1cm47CkBAIC0xMTIyLDcgKzExNTIsNyBAQAogCiAJaWYgKChkaS0+ZG1hLmRtYWN0cmxmbGFncyAmIERNQV9DVFJMX1BFTikgPT0gMCkKIAkJY29udHJvbCB8PSBENjRfWENfUEQ7Ci0JT1JfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLCBjb250cm9sKTsKKwliY21hX3NldDMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgY29udHJvbCksIGNvbnRyb2wpOwogCiAJLyogRE1BIGVuZ2luZSB3aXRoIGFsaWdubWVudCByZXF1aXJlbWVudCByZXF1aXJlcyB0YWJsZSB0byBiZSBpbml0ZWQKIAkgKiBiZWZvcmUgZW5hYmxpbmcgdGhlIGVuZ2luZQpAQCAtMTEzNSwyNCArMTE2NSwyNCBAQAogewogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV90eHN1c3BlbmRcbiIsIGRpLT5uYW1lKSk7CisJRE1BX1RSQUNFKCIlczpcbiIsIGRpLT5uYW1lKTsKIAogCWlmIChkaS0+bnR4ZCA9PSAwKQogCQlyZXR1cm47CiAKLQlPUl9SRUcoJmRpLT5kNjR0eHJlZ3MtPmNvbnRyb2wsIEQ2NF9YQ19TRSk7CisJYmNtYV9zZXQzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIGNvbnRyb2wpLCBENjRfWENfU0UpOwogfQogCiB2b2lkIGRtYV90eHJlc3VtZShzdHJ1Y3QgZG1hX3B1YiAqcHViKQogewogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwogCi0JRE1BX1RSQUNFKCgiJXM6IGRtYV90eHJlc3VtZVxuIiwgZGktPm5hbWUpKTsKKwlETUFfVFJBQ0UoIiVzOlxuIiwgZGktPm5hbWUpOwogCiAJaWYgKGRpLT5udHhkID09IDApCiAJCXJldHVybjsKIAotCUFORF9SRUcoJmRpLT5kNjR0eHJlZ3MtPmNvbnRyb2wsIH5ENjRfWENfU0UpOworCWJjbWFfbWFzazMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgY29udHJvbCksIH5ENjRfWENfU0UpOwogfQogCiBib29sIGRtYV90eHN1c3BlbmRlZChzdHJ1Y3QgZG1hX3B1YiAqcHViKQpAQCAtMTE2MCw4ICsxMTkwLDkgQEAKIAlzdHJ1Y3QgZG1hX2luZm8gKmRpID0gKHN0cnVjdCBkbWFfaW5mbyAqKXB1YjsKIAogCXJldHVybiAoZGktPm50eGQgPT0gMCkgfHwKLQkgICAgKChSX1JFRygmZGktPmQ2NHR4cmVncy0+Y29udHJvbCkgJiBENjRfWENfU0UpID09Ci0JICAgICBENjRfWENfU0UpOworCSAgICAgICAoKGJjbWFfcmVhZDMyKGRpLT5jb3JlLAorCQkJICAgICBETUE2NFRYUkVHT0ZGUyhkaSwgY29udHJvbCkpICYgRDY0X1hDX1NFKSA9PQorCQlENjRfWENfU0UpOwogfQogCiB2b2lkIGRtYV90eHJlY2xhaW0oc3RydWN0IGRtYV9wdWIgKnB1YiwgZW51bSB0eGRfcmFuZ2UgcmFuZ2UpCkBAIC0xMTY5LDExICsxMjAwLDExIEBACiAJc3RydWN0IGRtYV9pbmZvICpkaSA9IChzdHJ1Y3QgZG1hX2luZm8gKilwdWI7CiAJc3RydWN0IHNrX2J1ZmYgKnA7CiAKLQlETUFfVFJBQ0UoKCIlczogZG1hX3R4cmVjbGFpbSAlc1xuIiwgZGktPm5hbWUsCi0JCSAgIChyYW5nZSA9PSBETUFfUkFOR0VfQUxMKSA/ICJhbGwiIDoKLQkJICAgKChyYW5nZSA9PQotCQkgICAgIERNQV9SQU5HRV9UUkFOU01JVFRFRCkgPyAidHJhbnNtaXR0ZWQiIDoKLQkJICAgICJ0cmFuc2ZlcnJlZCIpKSk7CisJRE1BX1RSQUNFKCIlczogJXNcbiIsCisJCSAgZGktPm5hbWUsCisJCSAgcmFuZ2UgPT0gRE1BX1JBTkdFX0FMTCA/ICJhbGwiIDoKKwkJICByYW5nZSA9PSBETUFfUkFOR0VfVFJBTlNNSVRURUQgPyAidHJhbnNtaXR0ZWQiIDoKKwkJICAidHJhbnNmZXJyZWQiKTsKIAogCWlmIChkaS0+dHhpbiA9PSBkaS0+dHhvdXQpCiAJCXJldHVybjsKQEAgLTExOTQsMTYgKzEyMjUsMTcgQEAKIAkJcmV0dXJuIHRydWU7CiAKIAkvKiBzdXNwZW5kIHR4IERNQSBmaXJzdCAqLwotCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLCBENjRfWENfU0UpOworCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRUWFJFR09GRlMoZGksIGNvbnRyb2wpLCBENjRfWENfU0UpOwogCVNQSU5XQUlUKCgoc3RhdHVzID0KLQkJICAgKFJfUkVHKCZkaS0+ZDY0dHhyZWdzLT5zdGF0dXMwKSAmIEQ2NF9YUzBfWFNfTUFTSykpCi0JCSAgIT0gRDY0X1hTMF9YU19ESVNBQkxFRCkgJiYgKHN0YXR1cyAhPSBENjRfWFMwX1hTX0lETEUpCi0JCSAmJiAoc3RhdHVzICE9IEQ2NF9YUzBfWFNfU1RPUFBFRCksIDEwMDAwKTsKKwkJICAgKGJjbWFfcmVhZDMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgc3RhdHVzMCkpICYKKwkJICAgIEQ2NF9YUzBfWFNfTUFTSykpICE9IEQ2NF9YUzBfWFNfRElTQUJMRUQpICYmCisJCSAgKHN0YXR1cyAhPSBENjRfWFMwX1hTX0lETEUpICYmIChzdGF0dXMgIT0gRDY0X1hTMF9YU19TVE9QUEVEKSwKKwkJIDEwMDAwKTsKIAotCVdfUkVHKCZkaS0+ZDY0dHhyZWdzLT5jb250cm9sLCAwKTsKKwliY21hX3dyaXRlMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBjb250cm9sKSwgMCk7CiAJU1BJTldBSVQoKChzdGF0dXMgPQotCQkgICAoUl9SRUcoJmRpLT5kNjR0eHJlZ3MtPnN0YXR1czApICYgRDY0X1hTMF9YU19NQVNLKSkKLQkJICAhPSBENjRfWFMwX1hTX0RJU0FCTEVEKSwgMTAwMDApOworCQkgICAoYmNtYV9yZWFkMzIoZGktPmNvcmUsIERNQTY0VFhSRUdPRkZTKGRpLCBzdGF0dXMwKSkgJgorCQkgICAgRDY0X1hTMF9YU19NQVNLKSkgIT0gRDY0X1hTMF9YU19ESVNBQkxFRCksIDEwMDAwKTsKIAogCS8qIHdhaXQgZm9yIHRoZSBsYXN0IHRyYW5zYWN0aW9uIHRvIGNvbXBsZXRlICovCiAJdWRlbGF5KDMwMCk7CkBAIC0xMjE5LDEwICsxMjUxLDEwIEBACiAJaWYgKGRpLT5ucnhkID09IDApCiAJCXJldHVybiB0cnVlOwogCi0JV19SRUcoJmRpLT5kNjRyeHJlZ3MtPmNvbnRyb2wsIDApOworCWJjbWFfd3JpdGUzMihkaS0+Y29yZSwgRE1BNjRSWFJFR09GRlMoZGksIGNvbnRyb2wpLCAwKTsKIAlTUElOV0FJVCgoKHN0YXR1cyA9Ci0JCSAgIChSX1JFRygmZGktPmQ2NHJ4cmVncy0+c3RhdHVzMCkgJiBENjRfUlMwX1JTX01BU0spKQotCQkgICE9IEQ2NF9SUzBfUlNfRElTQUJMRUQpLCAxMDAwMCk7CisJCSAgIChiY21hX3JlYWQzMihkaS0+Y29yZSwgRE1BNjRSWFJFR09GRlMoZGksIHN0YXR1czApKSAmCisJCSAgICBENjRfUlMwX1JTX01BU0spKSAhPSBENjRfUlMwX1JTX0RJU0FCTEVEKSwgMTAwMDApOwogCiAJcmV0dXJuIHN0YXR1cyA9PSBENjRfUlMwX1JTX0RJU0FCTEVEOwogfQpAQCAtMTIzMyw3MiArMTI2NSw1OCBAQAogICogICB0aGUgZXJyb3IodG9zcyBmcmFtZXMpIGNvdWxkIGJlIGZhdGFsIGFuZCBjYXVzZSBtYW55IHN1YnNlcXVlbnQgaGFyZAogICogICB0byBkZWJ1ZyBwcm9ibGVtcwogICovCi1pbnQgZG1hX3R4ZmFzdChzdHJ1Y3QgZG1hX3B1YiAqcHViLCBzdHJ1Y3Qgc2tfYnVmZiAqcDAsIGJvb2wgY29tbWl0KQoraW50IGRtYV90eGZhc3Qoc3RydWN0IGRtYV9wdWIgKnB1Yiwgc3RydWN0IHNrX2J1ZmYgKnAsIGJvb2wgY29tbWl0KQogewogCXN0cnVjdCBkbWFfaW5mbyAqZGkgPSAoc3RydWN0IGRtYV9pbmZvICopcHViOwotCXN0cnVjdCBza19idWZmICpwLCAqbmV4dDsKIAl1bnNpZ25lZCBjaGFyICpkYXRhOwogCXVpbnQgbGVuOwogCXUxNiB0eG91dDsKIAl1MzIgZmxhZ3MgPSAwOwogCWRtYV9hZGRyX3QgcGE7CiAKLQlETUFfVFJBQ0UoKCIlczogZG1hX3R4ZmFzdFxuIiwgZGktPm5hbWUpKTsKKwlETUFfVFJBQ0UoIiVzOlxuIiwgZGktPm5hbWUpOwogCiAJdHhvdXQgPSBkaS0+dHhvdXQ7CiAKIAkvKgotCSAqIFdhbGsgdGhlIGNoYWluIG9mIHBhY2tldCBidWZmZXJzCi0JICogYWxsb2NhdGluZyBhbmQgaW5pdGlhbGl6aW5nIHRyYW5zbWl0IGRlc2NyaXB0b3IgZW50cmllcy4KKwkgKiBvYnRhaW4gYW5kIGluaXRpYWxpemUgdHJhbnNtaXQgZGVzY3JpcHRvciBlbnRyeS4KIAkgKi8KLQlmb3IgKHAgPSBwMDsgcDsgcCA9IG5leHQpIHsKLQkJZGF0YSA9IHAtPmRhdGE7Ci0JCWxlbiA9IHAtPmxlbjsKLQkJbmV4dCA9IHAtPm5leHQ7CisJZGF0YSA9IHAtPmRhdGE7CisJbGVuID0gcC0+bGVuOwogCi0JCS8qIHJldHVybiBub256ZXJvIGlmIG91dCBvZiB0eCBkZXNjcmlwdG9ycyAqLwotCQlpZiAobmV4dHR4ZChkaSwgdHhvdXQpID09IGRpLT50eGluKQotCQkJZ290byBvdXRvZnR4ZDsKKwkvKiBubyB1c2UgdG8gdHJhbnNtaXQgYSB6ZXJvIGxlbmd0aCBwYWNrZXQgKi8KKwlpZiAobGVuID09IDApCisJCXJldHVybiAwOwogCi0JCWlmIChsZW4gPT0gMCkKLQkJCWNvbnRpbnVlOworCS8qIHJldHVybiBub256ZXJvIGlmIG91dCBvZiB0eCBkZXNjcmlwdG9ycyAqLworCWlmIChuZXh0dHhkKGRpLCB0eG91dCkgPT0gZGktPnR4aW4pCisJCWdvdG8gb3V0b2Z0eGQ7CiAKLQkJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyIHN0YXJ0ICovCi0JCXBhID0gcGNpX21hcF9zaW5nbGUoZGktPnBidXMsIGRhdGEsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJLyogZ2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgYnVmZmVyIHN0YXJ0ICovCisJcGEgPSBkbWFfbWFwX3NpbmdsZShkaS0+ZG1hZGV2LCBkYXRhLCBsZW4sIERNQV9UT19ERVZJQ0UpOwogCi0JCWZsYWdzID0gMDsKLQkJaWYgKHAgPT0gcDApCi0JCQlmbGFncyB8PSBENjRfQ1RSTDFfU09GOworCS8qIFdpdGggYSBETUEgc2VnbWVudCBsaXN0LCBEZXNjcmlwdG9yIHRhYmxlIGlzIGZpbGxlZAorCSAqIHVzaW5nIHRoZSBzZWdtZW50IGxpc3QgaW5zdGVhZCBvZiBsb29waW5nIG92ZXIKKwkgKiBidWZmZXJzIGluIG11bHRpLWNoYWluIERNQS4gVGhlcmVmb3JlLCBFT0YgZm9yIFNHTElTVAorCSAqIGlzIHdoZW4gZW5kIG9mIHNlZ21lbnQgbGlzdCBpcyByZWFjaGVkLgorCSAqLworCWZsYWdzID0gRDY0X0NUUkwxX1NPRiB8IEQ2NF9DVFJMMV9JT0MgfCBENjRfQ1RSTDFfRU9GOworCWlmICh0eG91dCA9PSAoZGktPm50eGQgLSAxKSkKKwkJZmxhZ3MgfD0gRDY0X0NUUkwxX0VPVDsKIAotCQkvKiBXaXRoIGEgRE1BIHNlZ21lbnQgbGlzdCwgRGVzY3JpcHRvciB0YWJsZSBpcyBmaWxsZWQKLQkJICogdXNpbmcgdGhlIHNlZ21lbnQgbGlzdCBpbnN0ZWFkIG9mIGxvb3Bpbmcgb3ZlcgotCQkgKiBidWZmZXJzIGluIG11bHRpLWNoYWluIERNQS4gVGhlcmVmb3JlLCBFT0YgZm9yIFNHTElTVAotCQkgKiBpcyB3aGVuIGVuZCBvZiBzZWdtZW50IGxpc3QgaXMgcmVhY2hlZC4KLQkJICovCi0JCWlmIChuZXh0ID09IE5VTEwpCi0JCQlmbGFncyB8PSAoRDY0X0NUUkwxX0lPQyB8IEQ2NF9DVFJMMV9FT0YpOwotCQlpZiAodHhvdXQgPT0gKGRpLT5udHhkIC0gMSkpCi0JCQlmbGFncyB8PSBENjRfQ1RSTDFfRU9UOworCWRtYTY0X2RkX3VwZChkaSwgZGktPnR4ZDY0LCBwYSwgdHhvdXQsICZmbGFncywgbGVuKTsKIAotCQlkbWE2NF9kZF91cGQoZGksIGRpLT50eGQ2NCwgcGEsIHR4b3V0LCAmZmxhZ3MsIGxlbik7Ci0KLQkJdHhvdXQgPSBuZXh0dHhkKGRpLCB0eG91dCk7Ci0JfQotCi0JLyogaWYgbGFzdCB0eGQgZW9mIG5vdCBzZXQsIGZpeCBpdCAqLwotCWlmICghKGZsYWdzICYgRDY0X0NUUkwxX0VPRikpCi0JCWRpLT50eGQ2NFtwcmV2dHhkKGRpLCB0eG91dCldLmN0cmwxID0KLQkJICAgICBjcHVfdG9fbGUzMihmbGFncyB8IEQ2NF9DVFJMMV9JT0MgfCBENjRfQ1RSTDFfRU9GKTsKKwl0eG91dCA9IG5leHR0eGQoZGksIHR4b3V0KTsKIAogCS8qIHNhdmUgdGhlIHBhY2tldCAqLwotCWRpLT50eHBbcHJldnR4ZChkaSwgdHhvdXQpXSA9IHAwOworCWRpLT50eHBbcHJldnR4ZChkaSwgdHhvdXQpXSA9IHA7CiAKIAkvKiBidW1wIHRoZSB0eCBkZXNjcmlwdG9yIGluZGV4ICovCiAJZGktPnR4b3V0ID0gdHhvdXQ7CiAKIAkvKiBraWNrIHRoZSBjaGlwICovCiAJaWYgKGNvbW1pdCkKLQkJV19SRUcoJmRpLT5kNjR0eHJlZ3MtPnB0ciwKKwkJYmNtYV93cml0ZTMyKGRpLT5jb3JlLCBETUE2NFRYUkVHT0ZGUyhkaSwgcHRyKSwKIAkJICAgICAgZGktPnhtdHB0cmJhc2UgKyBJMkIodHhvdXQsIHN0cnVjdCBkbWE2NGRlc2MpKTsKIAogCS8qIHR4IGZsb3cgY29udHJvbCAqLwpAQCAtMTMwNyw4ICsxMzI1LDggQEAKIAlyZXR1cm4gMDsKIAogIG91dG9mdHhkOgotCURNQV9FUlJPUigoIiVzOiBkbWFfdHhmYXN0OiBvdXQgb2YgdHhkcyAhISFcbiIsIGRpLT5uYW1lKSk7Ci0JYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwMCk7CisJRE1BX0VSUk9SKCIlczogb3V0IG9mIHR4ZHMgISEhXG4iLCBkaS0+bmFtZSk7CisJYnJjbXVfcGt0X2J1Zl9mcmVlX3NrYihwKTsKIAlkaS0+ZG1hLnR4YXZhaWwgPSAwOwogCWRpLT5kbWEudHhub2J1ZisrOwogCXJldHVybiAtMTsKQEAgLTEzMzEsMTEgKzEzNDksMTEgQEAKIAl1MTYgYWN0aXZlX2Rlc2M7CiAJc3RydWN0IHNrX2J1ZmYgKnR4cDsKIAotCURNQV9UUkFDRSgoIiVzOiBkbWFfZ2V0bmV4dHR4cCAlc1xuIiwgZGktPm5hbWUsCi0JCSAgIChyYW5nZSA9PSBETUFfUkFOR0VfQUxMKSA/ICJhbGwiIDoKLQkJICAgKChyYW5nZSA9PQotCQkgICAgIERNQV9SQU5HRV9UUkFOU01JVFRFRCkgPyAidHJhbnNtaXR0ZWQiIDoKLQkJICAgICJ0cmFuc2ZlcnJlZCIpKSk7CisJRE1BX1RSQUNFKCIlczogJXNcbiIsCisJCSAgZGktPm5hbWUsCisJCSAgcmFuZ2UgPT0gRE1BX1JBTkdFX0FMTCA/ICJhbGwiIDoKKwkJICByYW5nZSA9PSBETUFfUkFOR0VfVFJBTlNNSVRURUQgPyAidHJhbnNtaXR0ZWQiIDoKKwkJICAidHJhbnNmZXJyZWQiKTsKIAogCWlmIChkaS0+bnR4ZCA9PSAwKQogCQlyZXR1cm4gTlVMTDsKQEAgLTEzNDYsMTYgKzEzNjQsMTUgQEAKIAlpZiAocmFuZ2UgPT0gRE1BX1JBTkdFX0FMTCkKIAkJZW5kID0gZGktPnR4b3V0OwogCWVsc2UgewotCQlzdHJ1Y3QgZG1hNjRyZWdzIF9faW9tZW0gKmRyZWdzID0gZGktPmQ2NHR4cmVnczsKLQotCQllbmQgPSAodTE2KSAoQjJJKCgoUl9SRUcoJmRyZWdzLT5zdGF0dXMwKSAmCi0JCQkJIEQ2NF9YUzBfQ0RfTUFTSykgLQotCQkJCSBkaS0+eG10cHRyYmFzZSkgJiBENjRfWFMwX0NEX01BU0ssCi0JCQkJIHN0cnVjdCBkbWE2NGRlc2MpKTsKKwkJZW5kID0gKHUxNikgKEIySSgoKGJjbWFfcmVhZDMyKGRpLT5jb3JlLAorCQkJCQkgICAgICAgRE1BNjRUWFJFR09GRlMoZGksIHN0YXR1czApKSAmCisJCQkJICAgRDY0X1hTMF9DRF9NQVNLKSAtIGRpLT54bXRwdHJiYXNlKSAmCisJCQkJIEQ2NF9YUzBfQ0RfTUFTSywgc3RydWN0IGRtYTY0ZGVzYykpOwogCiAJCWlmIChyYW5nZSA9PSBETUFfUkFOR0VfVFJBTlNGRVJFRCkgewogCQkJYWN0aXZlX2Rlc2MgPQotCQkJICAgICh1MTYpIChSX1JFRygmZHJlZ3MtPnN0YXR1czEpICYKKwkJCQkodTE2KShiY21hX3JlYWQzMihkaS0+Y29yZSwKKwkJCQkJCSAgRE1BNjRUWFJFR09GRlMoZGksIHN0YXR1czEpKSAmCiAJCQkJICAgICAgRDY0X1hTMV9BRF9NQVNLKTsKIAkJCWFjdGl2ZV9kZXNjID0KIAkJCSAgICAoYWN0aXZlX2Rlc2MgLSBkaS0+eG10cHRyYmFzZSkgJiBENjRfWFMwX0NEX01BU0s7CkBAIC0xMzg0LDcgKzE0MDEsNyBAQAogCQl0eHAgPSBkaS0+dHhwW2ldOwogCQlkaS0+dHhwW2ldID0gTlVMTDsKIAotCQlwY2lfdW5tYXBfc2luZ2xlKGRpLT5wYnVzLCBwYSwgc2l6ZSwgUENJX0RNQV9UT0RFVklDRSk7CisJCWRtYV91bm1hcF9zaW5nbGUoZGktPmRtYWRldiwgcGEsIHNpemUsIERNQV9UT19ERVZJQ0UpOwogCX0KIAogCWRpLT50eGluID0gaTsKQEAgLTEzOTUsOCArMTQxMiw4IEBACiAJcmV0dXJuIHR4cDsKIAogIGJvZ3VzOgotCURNQV9OT05FKCgiZG1hX2dldG5leHR0eHA6IGJvZ3VzIGN1cnI6IHN0YXJ0ICVkIGVuZCAlZCB0eG91dCAlZCAiCi0JCSAgImZvcmNlICVkXG4iLCBzdGFydCwgZW5kLCBkaS0+dHhvdXQsIGZvcmNlYWxsKSk7CisJRE1BX05PTkUoImJvZ3VzIGN1cnI6IHN0YXJ0ICVkIGVuZCAlZCB0eG91dCAlZFxuIiwKKwkJIHN0YXJ0LCBlbmQsIGRpLT50eG91dCk7CiAJcmV0dXJuIE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kbWEuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9kbWEuaAppbmRleCBlYmM1YmM1Li5jYzI2OWVlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvZG1hLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL2RtYS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lCV9CUkNNX0RNQV9IXwogCiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KICNpbmNsdWRlICJ0eXBlcy5oIgkJLyogZm9yd2FyZCBzdHJ1Y3R1cmUgZGVjbGFyYXRpb25zICovCiAKIC8qIG1hcC91bm1hcCBkaXJlY3Rpb24gKi8KQEAgLTc0LDEzICs3NSwxNCBAQAogfTsKIAogZXh0ZXJuIHN0cnVjdCBkbWFfcHViICpkbWFfYXR0YWNoKGNoYXIgKm5hbWUsIHN0cnVjdCBzaV9wdWIgKnNpaCwKLQkJCSAgICB2b2lkIF9faW9tZW0gKmRtYXJlZ3N0eCwgdm9pZCBfX2lvbWVtICpkbWFyZWdzcngsCi0JCQkgICAgdWludCBudHhkLCB1aW50IG5yeGQsCi0JCQkgICAgdWludCByeGJ1ZnNpemUsIGludCByeGV4dGhlYWRyb29tLAotCQkJICAgIHVpbnQgbnJ4cG9zdCwgdWludCByeG9mZnNldCwgdWludCAqbXNnX2xldmVsKTsKKwkJCQkgIHN0cnVjdCBiY21hX2RldmljZSAqZDExY29yZSwKKwkJCQkgIHVpbnQgdHhyZWdiYXNlLCB1aW50IHJ4cmVnYmFzZSwKKwkJCQkgIHVpbnQgbnR4ZCwgdWludCBucnhkLAorCQkJCSAgdWludCByeGJ1ZnNpemUsIGludCByeGV4dGhlYWRyb29tLAorCQkJCSAgdWludCBucnhwb3N0LCB1aW50IHJ4b2Zmc2V0LCB1aW50ICptc2dfbGV2ZWwpOwogCiB2b2lkIGRtYV9yeGluaXQoc3RydWN0IGRtYV9wdWIgKnB1Yik7Ci1zdHJ1Y3Qgc2tfYnVmZiAqZG1hX3J4KHN0cnVjdCBkbWFfcHViICpwdWIpOworaW50IGRtYV9yeChzdHJ1Y3QgZG1hX3B1YiAqcHViLCBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpza2JfbGlzdCk7CiBib29sIGRtYV9yeGZpbGwoc3RydWN0IGRtYV9wdWIgKnB1Yik7CiBib29sIGRtYV9yeHJlc2V0KHN0cnVjdCBkbWFfcHViICpwdWIpOwogYm9vbCBkbWFfdHhyZXNldChzdHJ1Y3QgZG1hX3B1YiAqcHViKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmMKaW5kZXggMGQ4YTljZC4uZDEwNjU3NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmMKQEAgLTE3LDExICsxNywxMSBAQAogI2RlZmluZSBfX1VOREVGX05PX1ZFUlNJT05fXwogCiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSA8ZGVmcy5oPgogI2luY2x1ZGUgIm5pY3BjaS5oIgpAQCAtNDAsMTAgKzQwLDEwIEBACiAjZGVmaW5lIE1BQ19GSUxURVJTIChGSUZfUFJPTUlTQ19JTl9CU1MgfCBcCiAJRklGX0FMTE1VTFRJIHwgXAogCUZJRl9GQ1NGQUlMIHwgXAotCUZJRl9QTENQRkFJTCB8IFwKIAlGSUZfQ09OVFJPTCB8IFwKIAlGSUZfT1RIRVJfQlNTIHwgXAotCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKQorCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDIHwgXAorCUZJRl9QU1BPTEwpCiAKICNkZWZpbmUgQ0hBTjJHSFooY2hhbm5lbCwgZnJlcWVuY3ksIGNoZmxhZ3MpICB7IFwKIAkuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFosIFwKQEAgLTg3LDE2ICs4NywxNCBAQAogTU9EVUxFX1NVUFBPUlRFRF9ERVZJQ0UoIkJyb2FkY29tIDgwMi4xMW4gV0xBTiBjYXJkcyIpOwogTU9EVUxFX0xJQ0VOU0UoIkR1YWwgQlNEL0dQTCIpOwogCi0vKiByZWNvZ25pemVkIFBDSSBJRHMgKi8KLXN0YXRpYyBERUZJTkVfUENJX0RFVklDRV9UQUJMRShicmNtc19wY2lfaWRfdGFibGUpID0gewotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQzNTcpIH0sIC8qIDQzMjI1IDJHICovCi0JeyBQQ0lfREVWSUNFKFBDSV9WRU5ET1JfSURfQlJPQURDT00sIDB4NDM1MykgfSwgLyogNDMyMjQgRFVBTCAqLwotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDQ3MjcpIH0sIC8qIDQzMTMgRFVBTCAqLwotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0JST0FEQ09NLCAweDA1NzYpIH0sIC8qIDQzMjI0IFZlbiAqLwotCXswfQotfTsKIAotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGJyY21zX3BjaV9pZF90YWJsZSk7CisvKiByZWNvZ25pemVkIEJDTUEgQ29yZSBJRHMgKi8KK3N0YXRpYyBzdHJ1Y3QgYmNtYV9kZXZpY2VfaWQgYnJjbXNfY29yZWlkX3RhYmxlW10gPSB7CisJQkNNQV9DT1JFKEJDTUFfTUFOVUZfQkNNLCBCQ01BX0NPUkVfODAyMTEsIDIzLCBCQ01BX0FOWV9DTEFTUyksCisJQkNNQV9DT1JFKEJDTUFfTUFOVUZfQkNNLCBCQ01BX0NPUkVfODAyMTEsIDI0LCBCQ01BX0FOWV9DTEFTUyksCisJQkNNQV9DT1JFVEFCTEVfRU5ECit9OworTU9EVUxFX0RFVklDRV9UQUJMRShiY21hLCBicmNtc19jb3JlaWRfdGFibGUpOwogCiAjaWZkZWYgQkNNREJHCiBzdGF0aWMgaW50IG1zZ2xldmVsID0gMHhkZWFkYmVlZjsKQEAgLTIxNiw4ICsyMTQsNyBAQAogCS5odF9jYXAgPSB7CiAJCSAgIC8qIGZyb20gaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaCAqLwogCQkgICAuY2FwID0gSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxEIHwKLQkJICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfAotCQkgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8IElFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVCwKKwkJCSAgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfCBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCwKIAkJICAgLmh0X3N1cHBvcnRlZCA9IHRydWUsCiAJCSAgIC5hbXBkdV9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SywKIAkJICAgLmFtcGR1X2RlbnNpdHkgPSBBTVBEVV9ERUZfTVBEVV9ERU5TSVRZLApAQCAtMjM4LDggKzIzNSw3IEBACiAJCQlCUkNNU19MRUdBQ1lfNUdfUkFURV9PRkZTRVQsCiAJLmh0X2NhcCA9IHsKIAkJICAgLmNhcCA9IElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCB8IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwIHwKLQkJCSAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAgfAotCQkJICBJRUVFODAyMTFfSFRfQ0FQXzQwTUhaX0lOVE9MRVJBTlQsIC8qIE5vIDQwIG1oeiB5ZXQgKi8KKwkJCSAgSUVFRTgwMjExX0hUX0NBUF9TR0lfNDAsCiAJCSAgIC5odF9zdXBwb3J0ZWQgPSB0cnVlLAogCQkgICAuYW1wZHVfZmFjdG9yID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEssCiAJCSAgIC5hbXBkdV9kZW5zaXR5ID0gQU1QRFVfREVGX01QRFVfREVOU0lUWSwKQEAgLTI4Nyw2ICsyODMsNyBAQAogewogCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IGh3LT5wcml2OwogCWJvb2wgYmxvY2tlZDsKKwlpbnQgZXJyOwogCiAJaWVlZTgwMjExX3dha2VfcXVldWVzKGh3KTsKIAlzcGluX2xvY2tfYmgoJndsLT5sb2NrKTsKQEAgLTI5NSwzMyArMjkyLDEwIEBACiAJaWYgKCFibG9ja2VkKQogCQl3aXBoeV9yZmtpbGxfc3RvcF9wb2xsaW5nKHdsLT5wdWItPmllZWVfaHctPndpcGh5KTsKIAotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19vcHNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOwotfQotCi1zdGF0aWMgaW50Ci1icmNtc19vcHNfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2w7Ci0JaW50IGVycjsKLQotCS8qIEp1c3QgU1RBIGZvciBub3cgKi8KLQlpZiAodmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCi0JICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UICYmCi0JICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCi0JICAgIHZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9XRFMgJiYKLQkgICAgdmlmLT50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7Ci0JCXdpcGh5X2Vycihody0+d2lwaHksICIlczogQXR0ZW1wdCB0byBhZGQgdHlwZSAlZCwgb25seSIKLQkJCSAgIiBTVEEgZm9yIG5vd1xuIiwgX19mdW5jX18sIHZpZi0+dHlwZSk7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQl3bCA9IGh3LT5wcml2OwogCXNwaW5fbG9ja19iaCgmd2wtPmxvY2spOworCS8qIGF2b2lkIGFja25vd2xlZGdpbmcgZnJhbWVzIGJlZm9yZSBhIG5vbi1tb25pdG9yIGRldmljZSBpcyBhZGRlZCAqLworCXdsLT5tdXRlX3R4ID0gdHJ1ZTsKKwogCWlmICghd2wtPnB1Yi0+dXApCiAJCWVyciA9IGJyY21zX3VwKHdsKTsKIAllbHNlCkBAIC0zMzEsMTYgKzMwNSwyOCBAQAogCWlmIChlcnIgIT0gMCkKIAkJd2lwaHlfZXJyKGh3LT53aXBoeSwgIiVzOiBicmNtc191cCgpIHJldHVybmVkICVkXG4iLCBfX2Z1bmNfXywKIAkJCSAgZXJyKTsKLQogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyB2b2lkCi1icmNtc19vcHNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3N0YXRpYyB2b2lkIGJyY21zX29wc19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewotCXN0cnVjdCBicmNtc19pbmZvICp3bDsKKwlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBody0+cHJpdjsKKwlpbnQgc3RhdHVzOwogCi0Jd2wgPSBody0+cHJpdjsKKwlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOworCisJaWYgKHdsLT53bGMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2JoKCZ3bC0+bG9jayk7CisJc3RhdHVzID0gYnJjbXNfY19jaGlwbWF0Y2god2wtPndsYy0+aHctPnZlbmRvcmlkLAorCQkJCSAgIHdsLT53bGMtPmh3LT5kZXZpY2VpZCk7CisJc3Bpbl91bmxvY2tfYmgoJndsLT5sb2NrKTsKKwlpZiAoIXN0YXR1cykgeworCQl3aXBoeV9lcnIod2wtPndpcGh5LAorCQkJICAid2w6IGJyY21zX29wc19zdG9wOiBjaGlwbWF0Y2ggZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KIAogCS8qIHB1dCBkcml2ZXIgaW4gZG93biBzdGF0ZSAqLwogCXNwaW5fbG9ja19iaCgmd2wtPmxvY2spOwpAQCAtMzQ4LDYgKzMzNCwyOSBAQAogCXNwaW5fdW5sb2NrX2JoKCZ3bC0+bG9jayk7CiB9CiAKK3N0YXRpYyBpbnQKK2JyY21zX29wc19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IGh3LT5wcml2OworCisJLyogSnVzdCBTVEEgZm9yIG5vdyAqLworCWlmICh2aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgeworCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiJXM6IEF0dGVtcHQgdG8gYWRkIHR5cGUgJWQsIG9ubHkiCisJCQkgICIgU1RBIGZvciBub3dcbiIsIF9fZnVuY19fLCB2aWYtPnR5cGUpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJd2wtPm11dGVfdHggPSBmYWxzZTsKKwlicmNtc19jX211dGUod2wtPndsYywgZmFsc2UpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCiticmNtc19vcHNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKK30KKwogc3RhdGljIGludCBicmNtc19vcHNfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7CkBAIC0zNjIsNyArMzcxLDcgQEAKIAkJCQkJCSAgIGNvbmYtPmxpc3Rlbl9pbnRlcnZhbCk7CiAJfQogCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX01PTklUT1IpCi0JCXdpcGh5X2Vycih3aXBoeSwgIiVzOiBjaGFuZ2UgbW9uaXRvciBtb2RlOiAlcyAoaW1wbGVtZW50KVxuIiwKKwkJd2lwaHlfZGJnKHdpcGh5LCAiJXM6IGNoYW5nZSBtb25pdG9yIG1vZGU6ICVzXG4iLAogCQkJICBfX2Z1bmNfXywgY29uZi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9NT05JVE9SID8KIAkJCSAgInRydWUiIDogImZhbHNlIik7CiAJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUFMpCkBAIC01MzksMjkgKzU0OCwyNSBAQAogCiAJY2hhbmdlZF9mbGFncyAmPSBNQUNfRklMVEVSUzsKIAkqdG90YWxfZmxhZ3MgJj0gTUFDX0ZJTFRFUlM7CisKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9QUk9NSVNDX0lOX0JTUykKLQkJd2lwaHlfZXJyKHdpcGh5LCAiRklGX1BST01JU0NfSU5fQlNTXG4iKTsKKwkJd2lwaHlfZGJnKHdpcGh5LCAiRklGX1BST01JU0NfSU5fQlNTXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9BTExNVUxUSSkKLQkJd2lwaHlfZXJyKHdpcGh5LCAiRklGX0FMTE1VTFRJXG4iKTsKKwkJd2lwaHlfZGJnKHdpcGh5LCAiRklGX0FMTE1VTFRJXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9GQ1NGQUlMKQotCQl3aXBoeV9lcnIod2lwaHksICJGSUZfRkNTRkFJTFxuIik7Ci0JaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfUExDUEZBSUwpCi0JCXdpcGh5X2Vycih3aXBoeSwgIkZJRl9QTENQRkFJTFxuIik7CisJCXdpcGh5X2RiZyh3aXBoeSwgIkZJRl9GQ1NGQUlMXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9DT05UUk9MKQotCQl3aXBoeV9lcnIod2lwaHksICJGSUZfQ09OVFJPTFxuIik7CisJCXdpcGh5X2RiZyh3aXBoeSwgIkZJRl9DT05UUk9MXG4iKTsKIAlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9PVEhFUl9CU1MpCi0JCXdpcGh5X2Vycih3aXBoeSwgIkZJRl9PVEhFUl9CU1NcbiIpOwotCWlmIChjaGFuZ2VkX2ZsYWdzICYgRklGX0JDTl9QUkJSRVNQX1BST01JU0MpIHsKLQkJc3Bpbl9sb2NrX2JoKCZ3bC0+bG9jayk7Ci0JCWlmICgqdG90YWxfZmxhZ3MgJiBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQykgewotCQkJd2wtPnB1Yi0+bWFjODAyMTFfc3RhdGUgfD0gTUFDODAyMTFfUFJPTUlTQ19CQ05TOwotCQkJYnJjbXNfY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHdsLT53bGMsIDEpOwotCQl9IGVsc2UgewotCQkJYnJjbXNfY19tYWNfYmNuX3Byb21pc2NfY2hhbmdlKHdsLT53bGMsIDApOwotCQkJd2wtPnB1Yi0+bWFjODAyMTFfc3RhdGUgJj0gfk1BQzgwMjExX1BST01JU0NfQkNOUzsKLQkJfQotCQlzcGluX3VubG9ja19iaCgmd2wtPmxvY2spOwotCX0KKwkJd2lwaHlfZGJnKHdpcGh5LCAiRklGX09USEVSX0JTU1xuIik7CisJaWYgKGNoYW5nZWRfZmxhZ3MgJiBGSUZfUFNQT0xMKQorCQl3aXBoeV9kYmcod2lwaHksICJGSUZfUFNQT0xMXG4iKTsKKwlpZiAoY2hhbmdlZF9mbGFncyAmIEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDKQorCQl3aXBoeV9kYmcod2lwaHksICJGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQ1xuIik7CisKKwlzcGluX2xvY2tfYmgoJndsLT5sb2NrKTsKKwlicmNtc19jX21hY19wcm9taXNjKHdsLT53bGMsICp0b3RhbF9mbGFncyk7CisJc3Bpbl91bmxvY2tfYmgoJndsLT5sb2NrKTsKIAlyZXR1cm47CiB9CiAKQEAgLTYwOSwxMyArNjE0LDYgQEAKIAl3bC0+cHViLT5nbG9iYWxfYW1wZHUtPnNjYiA9IHNjYjsKIAl3bC0+cHViLT5nbG9iYWxfYW1wZHUtPm1heF9wZHUgPSAxNjsKIAotCXN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCA9IHRydWU7Ci0Jc3RhLT5odF9jYXAuYW1wZHVfZmFjdG9yID0gSUVFRTgwMjExX0hUX01BWF9BTVBEVV82NEs7Ci0Jc3RhLT5odF9jYXAuYW1wZHVfZGVuc2l0eSA9IEFNUERVX0RFRl9NUERVX0RFTlNJVFk7Ci0Jc3RhLT5odF9jYXAuY2FwID0gSUVFRTgwMjExX0hUX0NBUF9HUk5fRkxEIHwKLQkgICAgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjAgfAotCSAgICBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCB8IElFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVDsKLQogCS8qCiAJICogbWluc3RyZWxfaHQgaW5pdGlhdGVzIGFkZEJBIG9uIG91ciBiZWhhbGYgYnkgY2FsbGluZwogCSAqIGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKCkKQEAgLTcyNCw3ICs3MjIsNyBAQAogfTsKIAogLyoKLSAqIGlzIGNhbGxlZCBpbiBicmNtc19wY2lfcHJvYmUoKSBjb250ZXh0LCB0aGVyZWZvcmUgbm8gbG9ja2luZyByZXF1aXJlZC4KKyAqIGlzIGNhbGxlZCBpbiBicmNtc19iY21hX3Byb2JlKCkgY29udGV4dCwgdGhlcmVmb3JlIG5vIGxvY2tpbmcgcmVxdWlyZWQuCiAgKi8KIHN0YXRpYyBpbnQgYnJjbXNfc2V0X2hpbnQoc3RydWN0IGJyY21zX2luZm8gKndsLCBjaGFyICphYmJyZXYpCiB7CkBAIC04NjQsNTYgKzg2MiwyNiBAQAogI2VuZGlmCiAJCWtmcmVlKHQpOwogCX0KLQotCS8qCi0JICogdW5yZWdpc3Rlcl9uZXRkZXYoKSBjYWxscyBnZXRfc3RhdHMoKSB3aGljaCBtYXkgcmVhZCBjaGlwCi0JICogcmVnaXN0ZXJzIHNvIHdlIGNhbm5vdCB1bm1hcCB0aGUgY2hpcCByZWdpc3RlcnMgdW50aWwKLQkgKiBhZnRlciBjYWxsaW5nIHVucmVnaXN0ZXJfbmV0ZGV2KCkgLgotCSAqLwotCWlmICh3bC0+cmVnc3ZhKQotCQlpb3VubWFwKHdsLT5yZWdzdmEpOwotCi0Jd2wtPnJlZ3N2YSA9IE5VTEw7CiB9CiAKIC8qCi0qIGNhbGxlZCBmcm9tIGJvdGgga2VybmVsIGFzIGZyb20gdGhpcyBrZXJuZWwgbW9kdWxlLgorKiBjYWxsZWQgZnJvbSBib3RoIGtlcm5lbCBhcyBmcm9tIHRoaXMga2VybmVsIG1vZHVsZSAoZXJyb3IgZmxvdyBvbiBhdHRhY2gpCiAqIHByZWNvbmRpdGlvbjogcGVyaW1ldGVyIGxvY2sgaXMgbm90IGFjcXVpcmVkLgogKi8KLXN0YXRpYyB2b2lkIGJyY21zX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3N0YXRpYyB2b2lkIGJyY21zX3JlbW92ZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKnBkZXYpCiB7Ci0Jc3RydWN0IGJyY21zX2luZm8gKndsOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCWludCBzdGF0dXM7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBiY21hX2dldF9kcnZkYXRhKHBkZXYpOworCXN0cnVjdCBicmNtc19pbmZvICp3bCA9IGh3LT5wcml2OwogCi0JaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jd2wgPSBody0+cHJpdjsKLQlpZiAoIXdsKSB7Ci0JCXByX2Vycigid2w6IGJyY21zX3JlbW92ZTogcGNpX2dldF9kcnZkYXRhIGZhaWxlZFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfYmgoJndsLT5sb2NrKTsKLQlzdGF0dXMgPSBicmNtc19jX2NoaXBtYXRjaChwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSk7Ci0Jc3Bpbl91bmxvY2tfYmgoJndsLT5sb2NrKTsKLQlpZiAoIXN0YXR1cykgewotCQl3aXBoeV9lcnIod2wtPndpcGh5LCAid2w6IGJyY21zX3JlbW92ZTogY2hpcG1hdGNoICIKLQkJCQkgICAgICJmYWlsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQogCWlmICh3bC0+d2xjKSB7CiAJCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUod2wtPnB1Yi0+aWVlZV9ody0+d2lwaHksIGZhbHNlKTsKIAkJd2lwaHlfcmZraWxsX3N0b3BfcG9sbGluZyh3bC0+cHViLT5pZWVlX2h3LT53aXBoeSk7CiAJCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGh3KTsKLQkJc3Bpbl9sb2NrX2JoKCZ3bC0+bG9jayk7Ci0JCWJyY21zX2Rvd24od2wpOwotCQlzcGluX3VubG9ja19iaCgmd2wtPmxvY2spOwogCX0KLQlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7CiAKIAlicmNtc19mcmVlKHdsKTsKIAotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwliY21hX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwogCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsKIH0KIApAQCAtMTAyMSwxMSArOTg5LDkgQEAKICAqIGl0IGFzIHN0YXRpYy4KICAqCiAgKgotICogaXMgY2FsbGVkIGluIGJyY21zX3BjaV9wcm9iZSgpIGNvbnRleHQsIHRoZXJlZm9yZSBubyBsb2NraW5nIHJlcXVpcmVkLgorICogaXMgY2FsbGVkIGluIGJyY21zX2JjbWFfcHJvYmUoKSBjb250ZXh0LCB0aGVyZWZvcmUgbm8gbG9ja2luZyByZXF1aXJlZC4KICAqLwotc3RhdGljIHN0cnVjdCBicmNtc19pbmZvICpicmNtc19hdHRhY2godTE2IHZlbmRvciwgdTE2IGRldmljZSwKLQkJCQkgICAgICAgcmVzb3VyY2Vfc2l6ZV90IHJlZ3MsCi0JCQkJICAgICAgIHN0cnVjdCBwY2lfZGV2ICpidHBhcmFtLCB1aW50IGlycSkKK3N0YXRpYyBzdHJ1Y3QgYnJjbXNfaW5mbyAqYnJjbXNfYXR0YWNoKHN0cnVjdCBiY21hX2RldmljZSAqcGRldikKIHsKIAlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wgPSBOVUxMOwogCWludCB1bml0LCBlcnI7CkBAIC0xMDM5LDcgKzEwMDUsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAogCS8qIGFsbG9jYXRlIHByaXZhdGUgaW5mbyAqLwotCWh3ID0gcGNpX2dldF9kcnZkYXRhKGJ0cGFyYW0pOwkvKiBidHBhcmFtID09IHBkZXYgKi8KKwlodyA9IGJjbWFfZ2V0X2RydmRhdGEocGRldik7CiAJaWYgKGh3ICE9IE5VTEwpCiAJCXdsID0gaHctPnByaXY7CiAJaWYgKFdBUk5fT04oaHcgPT0gTlVMTCkgfHwgV0FSTl9PTih3bCA9PSBOVUxMKSkKQEAgLTEwNTEsMjYgKzEwMTcsMjAgQEAKIAkvKiBzZXR1cCB0aGUgYm90dG9tIGhhbGYgaGFuZGxlciAqLwogCXRhc2tsZXRfaW5pdCgmd2wtPnRhc2tsZXQsIGJyY21zX2RwYywgKHVuc2lnbmVkIGxvbmcpIHdsKTsKIAotCXdsLT5yZWdzdmEgPSBpb3JlbWFwX25vY2FjaGUocmVncywgUENJX0JBUjBfV0lOU1opOwotCWlmICh3bC0+cmVnc3ZhID09IE5VTEwpIHsKLQkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIndsJWQ6IGlvcmVtYXAoKSBmYWlsZWRcbiIsIHVuaXQpOwotCQlnb3RvIGZhaWw7Ci0JfQogCXNwaW5fbG9ja19pbml0KCZ3bC0+bG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJndsLT5pc3JfbG9jayk7CiAKIAkvKiBwcmVwYXJlIHVjb2RlICovCi0JaWYgKGJyY21zX3JlcXVlc3RfZncod2wsIGJ0cGFyYW0pIDwgMCkgeworCWlmIChicmNtc19yZXF1ZXN0X2Z3KHdsLCBwZGV2LT5idXMtPmhvc3RfcGNpKSA8IDApIHsKIAkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIiVzOiBGYWlsZWQgdG8gZmluZCBmaXJtd2FyZSB1c3VhbGx5IGluICIKIAkJCSAgIiVzXG4iLCBLQlVJTERfTU9ETkFNRSwgIi9saWIvZmlybXdhcmUvYnJjbSIpOwogCQlicmNtc19yZWxlYXNlX2Z3KHdsKTsKLQkJYnJjbXNfcmVtb3ZlKGJ0cGFyYW0pOworCQlicmNtc19yZW1vdmUocGRldik7CiAJCXJldHVybiBOVUxMOwogCX0KIAogCS8qIGNvbW1vbiBsb2FkLXRpbWUgaW5pdGlhbGl6YXRpb24gKi8KLQl3bC0+d2xjID0gYnJjbXNfY19hdHRhY2god2wsIHZlbmRvciwgZGV2aWNlLCB1bml0LCBmYWxzZSwKLQkJCQkgd2wtPnJlZ3N2YSwgYnRwYXJhbSwgJmVycik7CisJd2wtPndsYyA9IGJyY21zX2NfYXR0YWNoKCh2b2lkICopd2wsIHBkZXYsIHVuaXQsIGZhbHNlLCAmZXJyKTsKIAlicmNtc19yZWxlYXNlX2Z3KHdsKTsKIAlpZiAoIXdsLT53bGMpIHsKIAkJd2lwaHlfZXJyKHdsLT53aXBoeSwgIiVzOiBhdHRhY2goKSBmYWlsZWQgd2l0aCBjb2RlICVkXG4iLApAQCAtMTA4MSwxNSArMTA0MSwxMyBAQAogCiAJd2wtPnB1Yi0+aWVlZV9odyA9IGh3OwogCi0JLyogZGlzYWJsZSBtcGMgKi8KLQlicmNtc19jX3NldF9yYWRpb19tcGMod2wtPndsYywgZmFsc2UpOwotCiAJLyogcmVnaXN0ZXIgb3VyIGludGVycnVwdCBoYW5kbGVyICovCi0JaWYgKHJlcXVlc3RfaXJxKGlycSwgYnJjbXNfaXNyLCBJUlFGX1NIQVJFRCwgS0JVSUxEX01PRE5BTUUsIHdsKSkgeworCWlmIChyZXF1ZXN0X2lycShwZGV2LT5idXMtPmhvc3RfcGNpLT5pcnEsIGJyY21zX2lzciwKKwkJCUlSUUZfU0hBUkVELCBLQlVJTERfTU9ETkFNRSwgd2wpKSB7CiAJCXdpcGh5X2Vycih3bC0+d2lwaHksICJ3bCVkOiByZXF1ZXN0X2lycSgpIGZhaWxlZFxuIiwgdW5pdCk7CiAJCWdvdG8gZmFpbDsKIAl9Ci0Jd2wtPmlycSA9IGlycTsKKwl3bC0+aXJxID0gcGRldi0+YnVzLT5ob3N0X3BjaS0+aXJxOwogCiAJLyogcmVnaXN0ZXIgbW9kdWxlICovCiAJYnJjbXNfY19tb2R1bGVfcmVnaXN0ZXIod2wtPnB1YiwgImxpbnV4Iiwgd2wsIE5VTEwpOwpAQCAtMTEzNiwzOCArMTA5NCwxOSBAQAogICoKICAqIFBlcmltZXRlciBsb2NrIGlzIGluaXRpYWxpemVkIGluIHRoZSBjb3Vyc2Ugb2YgdGhpcyBmdW5jdGlvbi4KICAqLwotc3RhdGljIGludCBfX2RldmluaXQKLWJyY21zX3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3N0YXRpYyBpbnQgX19kZXZpbml0IGJyY21zX2JjbWFfcHJvYmUoc3RydWN0IGJjbWFfZGV2aWNlICpwZGV2KQogewotCWludCByYzsKIAlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2w7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7Ci0JdTMyIHZhbDsKIAotCWRldl9pbmZvKCZwZGV2LT5kZXYsICJidXMgJWQgc2xvdCAlZCBmdW5jICVkIGlycSAlZFxuIiwKLQkgICAgICAgcGRldi0+YnVzLT5udW1iZXIsIFBDSV9TTE9UKHBkZXYtPmRldmZuKSwKLQkgICAgICAgUENJX0ZVTkMocGRldi0+ZGV2Zm4pLCBwZGV2LT5pcnEpOworCWRldl9pbmZvKCZwZGV2LT5kZXYsICJtZmcgJXggY29yZSAleCByZXYgJWQgY2xhc3MgJWQgaXJxICVkXG4iLAorCQkgcGRldi0+aWQubWFudWYsIHBkZXYtPmlkLmlkLCBwZGV2LT5pZC5yZXYsIHBkZXYtPmlkLmNsYXNzLAorCQkgcGRldi0+YnVzLT5ob3N0X3BjaS0+aXJxKTsKIAotCWlmICgocGRldi0+dmVuZG9yICE9IFBDSV9WRU5ET1JfSURfQlJPQURDT00pIHx8Ci0JICAgICgocGRldi0+ZGV2aWNlICE9IDB4MDU3NikgJiYKLQkgICAgICgocGRldi0+ZGV2aWNlICYgMHhmZjAwKSAhPSAweDQzMDApICYmCi0JICAgICAoKHBkZXYtPmRldmljZSAmIDB4ZmYwMCkgIT0gMHg0NzAwKSAmJgotCSAgICAgKChwZGV2LT5kZXZpY2UgPCA0MzAwMCkgfHwgKHBkZXYtPmRldmljZSA+IDQzOTk5KSkpKQorCWlmICgocGRldi0+aWQubWFudWYgIT0gQkNNQV9NQU5VRl9CQ00pIHx8CisJICAgIChwZGV2LT5pZC5pZCAhPSBCQ01BX0NPUkVfODAyMTEpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UocGRldik7Ci0JaWYgKHJjKSB7Ci0JCXByX2VycigiJXM6IENhbm5vdCBlbmFibGUgZGV2aWNlICVkLSVkXyVkXG4iLAotCQkgICAgICAgX19mdW5jX18sIHBkZXYtPmJ1cy0+bnVtYmVyLCBQQ0lfU0xPVChwZGV2LT5kZXZmbiksCi0JCSAgICAgICBQQ0lfRlVOQyhwZGV2LT5kZXZmbikpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgMHg0MCwgJnZhbCk7Ci0JaWYgKCh2YWwgJiAweDAwMDBmZjAwKSAhPSAwKQotCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCAmIDB4ZmZmZjAwZmYpOwotCiAJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBicmNtc19pbmZvKSwgJmJyY21zX29wcyk7CiAJaWYgKCFodykgewogCQlwcl9lcnIoIiVzOiBpZWVlODAyMTFfYWxsb2NfaHcgZmFpbGVkXG4iLCBfX2Z1bmNfXyk7CkBAIC0xMTc2LDE0ICsxMTE1LDExIEBACiAKIAlTRVRfSUVFRTgwMjExX0RFVihodywgJnBkZXYtPmRldik7CiAKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgaHcpOworCWJjbWFfc2V0X2RydmRhdGEocGRldiwgaHcpOwogCiAJbWVtc2V0KGh3LT5wcml2LCAwLCBzaXplb2YoKndsKSk7CiAKLQl3bCA9IGJyY21zX2F0dGFjaChwZGV2LT52ZW5kb3IsIHBkZXYtPmRldmljZSwKLQkJCSAgcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApLCBwZGV2LAotCQkJICBwZGV2LT5pcnEpOwotCisJd2wgPSBicmNtc19hdHRhY2gocGRldik7CiAJaWYgKCF3bCkgewogCQlwcl9lcnIoIiVzOiAlczogYnJjbXNfYXR0YWNoIGZhaWxlZCFcbiIsIEtCVUlMRF9NT0ROQU1FLAogCQkgICAgICAgX19mdW5jX18pOwpAQCAtMTE5MiwxNiArMTEyOCwyMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGJyY21zX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3N0YXRpYyBpbnQgYnJjbXNfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJcGNpX3NhdmVfc3RhdGUocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7Cit9CisKK3N0YXRpYyBpbnQgYnJjbXNfc3VzcGVuZChzdHJ1Y3QgYmNtYV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2w7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAKLQlodyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwlodyA9IGJjbWFfZ2V0X2RydmRhdGEocGRldik7CiAJd2wgPSBody0+cHJpdjsKIAlpZiAoIXdsKSB7CiAJCXdpcGh5X2Vycih3bC0+d2lwaHksCi0JCQkgICJicmNtc19zdXNwZW5kOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKKwkJCSAgImJyY21zX3N1c3BlbmQ6IGJjbWFfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCkBAIC0xMjEwLDI1ICsxMTUzLDE0IEBACiAJd2wtPnB1Yi0+aHdfdXAgPSBmYWxzZTsKIAlzcGluX3VubG9ja19iaCgmd2wtPmxvY2spOwogCi0JcGNpX3NhdmVfc3RhdGUocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXJldHVybiBwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EM2hvdCk7CisJLyogdGVtcG9yYXJpbHkgZG8gc3VzcGVuZCBvdXJzZWx2ZXMgKi8KKwlyZXR1cm4gYnJjbXNfcGNpX3N1c3BlbmQocGRldi0+YnVzLT5ob3N0X3BjaSk7CiB9CiAKLXN0YXRpYyBpbnQgYnJjbXNfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQorc3RhdGljIGludCBicmNtc19wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQogewotCXN0cnVjdCBicmNtc19pbmZvICp3bDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlpbnQgZXJyID0gMDsKLQl1MzIgdmFsOwotCi0JaHcgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7Ci0Jd2wgPSBody0+cHJpdjsKLQlpZiAoIXdsKSB7Ci0JCXdpcGh5X2Vycih3bC0+d2lwaHksCi0JCQkgICJ3bDogYnJjbXNfcmVzdW1lOiBwY2lfZ2V0X2RydmRhdGEgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQorCXVpbnQgdmFsOwogCiAJZXJyID0gcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwogCWlmIChlcnIpCkBAIC0xMjQ2LDI0ICsxMTc4LDI4IEBACiAJaWYgKCh2YWwgJiAweDAwMDBmZjAwKSAhPSAwKQogCQlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIDB4NDAsIHZhbCAmIDB4ZmZmZjAwZmYpOwogCi0JLyoKLQkqICBkb25lLiBkcml2ZXIgd2lsbCBiZSBwdXQgaW4gdXAgc3RhdGUKLQkqICBpbiBicmNtc19vcHNfYWRkX2ludGVyZmFjZSgpIGNhbGwuCi0JKi8KLQlyZXR1cm4gZXJyOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYnJjbXNfcGNpX2RyaXZlciA9IHsKK3N0YXRpYyBpbnQgYnJjbXNfcmVzdW1lKHN0cnVjdCBiY21hX2RldmljZSAqcGRldikKK3sKKwkvKgorCSogIGp1c3QgZG8gcGNpIHJlc3VtZSBmb3Igbm93IHVudGlsIGJjbWEgc3VwcG9ydHMgaXQuCisJKi8KKwlyZXR1cm4gYnJjbXNfcGNpX3Jlc3VtZShwZGV2LT5idXMtPmhvc3RfcGNpKTsKK30KKworc3RhdGljIHN0cnVjdCBiY21hX2RyaXZlciBicmNtc19iY21hX2RyaXZlciA9IHsKIAkubmFtZSAgICAgPSBLQlVJTERfTU9ETkFNRSwKLQkucHJvYmUgICAgPSBicmNtc19wY2lfcHJvYmUsCisJLnByb2JlICAgID0gYnJjbXNfYmNtYV9wcm9iZSwKIAkuc3VzcGVuZCAgPSBicmNtc19zdXNwZW5kLAogCS5yZXN1bWUgICA9IGJyY21zX3Jlc3VtZSwKIAkucmVtb3ZlICAgPSBfX2RldmV4aXRfcChicmNtc19yZW1vdmUpLAotCS5pZF90YWJsZSA9IGJyY21zX3BjaV9pZF90YWJsZSwKKwkuaWRfdGFibGUgPSBicmNtc19jb3JlaWRfdGFibGUsCiB9OwogCiAvKioKLSAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBXTCBkcml2ZXIuCisgKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgYnJjbXNtYWMgZHJpdmVyLgogICoKICAqIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiBhIGRldmljZSBwb2ludGVkIHRvIGJ5IHBkZXYgaXMgYSBXTCBkZXZpY2UsCiAgKiBhbmQgaWYgc28sIHBlcmZvcm1zIGEgYnJjbXNfYXR0YWNoKCkgb24gaXQuCkBAIC0xMjc4LDI2ICsxMjE0LDI0IEBACiAJCWJyY21fbXNnX2xldmVsID0gbXNnbGV2ZWw7CiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKLQllcnJvciA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmJyY21zX3BjaV9kcml2ZXIpOworCWVycm9yID0gYmNtYV9kcml2ZXJfcmVnaXN0ZXIoJmJyY21zX2JjbWFfZHJpdmVyKTsKKwlwcmludGsoS0VSTl9FUlIgIiVzOiByZWdpc3RlciByZXR1cm5lZCAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKIAlpZiAoIWVycm9yKQogCQlyZXR1cm4gMDsKIAotCi0KIAlyZXR1cm4gZXJyb3I7CiB9CiAKIC8qKgotICogVGhpcyBmdW5jdGlvbiB1bmxvYWRzIHRoZSBXTCBkcml2ZXIgZnJvbSB0aGUgc3lzdGVtLgorICogVGhpcyBmdW5jdGlvbiB1bmxvYWRzIHRoZSBicmNtc21hYyBkcml2ZXIgZnJvbSB0aGUgc3lzdGVtLgogICoKLSAqIFRoaXMgZnVuY3Rpb24gdW5jb25kaXRpb25hbGx5IHVubG9hZHMgdGhlIFdMIGRyaXZlciBtb2R1bGUgZnJvbSB0aGUKKyAqIFRoaXMgZnVuY3Rpb24gdW5jb25kaXRpb25hbGx5IHVubG9hZHMgdGhlIGJyY21zbWFjIGRyaXZlciBtb2R1bGUgZnJvbSB0aGUKICAqIHN5c3RlbS4KICAqCiAgKi8KIHN0YXRpYyB2b2lkIF9fZXhpdCBicmNtc19tb2R1bGVfZXhpdCh2b2lkKQogewotCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYnJjbXNfcGNpX2RyaXZlcik7Ci0KKwliY21hX2RyaXZlcl91bnJlZ2lzdGVyKCZicmNtc19iY21hX2RyaXZlcik7CiB9CiAKIG1vZHVsZV9pbml0KGJyY21zX21vZHVsZV9pbml0KTsKQEAgLTEzMTksOCArMTI1Myw3IEBACiB7CiAJQkNNTVNHKHdsLT5wdWItPmllZWVfaHctPndpcGh5LCAid2wlZFxuIiwgd2wtPnB1Yi0+dW5pdCk7CiAJYnJjbXNfcmVzZXQod2wpOwotCi0JYnJjbXNfY19pbml0KHdsLT53bGMpOworCWJyY21zX2NfaW5pdCh3bC0+d2xjLCB3bC0+bXV0ZV90eCk7CiB9CiAKIC8qCkBAIC0xMzMyLDExICsxMjY1LDE5IEBACiAJYnJjbXNfY19yZXNldCh3bC0+d2xjKTsKIAogCS8qIGRwYyB3aWxsIG5vdCBiZSByZXNjaGVkdWxlZCAqLwotCXdsLT5yZXNjaGVkID0gMDsKKwl3bC0+cmVzY2hlZCA9IGZhbHNlOwogCiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgYnJjbXNfZmF0YWxfZXJyb3Ioc3RydWN0IGJyY21zX2luZm8gKndsKQoreworCXdpcGh5X2Vycih3bC0+d2xjLT53aXBoeSwgIndsJWQ6IGZhdGFsIGVycm9yLCByZWluaXRpYWxpemluZ1xuIiwKKwkJICB3bC0+d2xjLT5wdWItPnVuaXQpOworCWJyY21zX3Jlc2V0KHdsKTsKKwlpZWVlODAyMTFfcmVzdGFydF9odyh3bC0+cHViLT5pZWVlX2h3KTsKK30KKwogLyoKICAqIFRoZXNlIGFyZSBpbnRlcnJ1cHQgb24vb2ZmIGVudHJ5IHBvaW50cy4gRGlzYWJsZSBpbnRlcnJ1cHRzCiAgKiBkdXJpbmcgaW50ZXJydXB0IHN0YXRlIHRyYW5zaXRpb24uCkBAIC0xNTYxLDExICsxNTAyLDEwIEBACiAJCQlpZiAobGUzMl90b19jcHUoaGRyLT5pZHgpID09IGlkeCkgewogCQkJCXBkYXRhID0gd2wtPmZ3LmZ3X2JpbltpXS0+ZGF0YSArCiAJCQkJCWxlMzJfdG9fY3B1KGhkci0+b2Zmc2V0KTsKLQkJCQkqcGJ1ZiA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwkJCQkqcGJ1ZiA9IGttZW1kdXAocGRhdGEsIGxlbiwgR0ZQX0FUT01JQyk7CiAJCQkJaWYgKCpwYnVmID09IE5VTEwpCiAJCQkJCWdvdG8gZmFpbDsKIAotCQkJCW1lbWNweSgqcGJ1ZiwgcGRhdGEsIGxlbik7CiAJCQkJcmV0dXJuIDA7CiAJCQl9CiAJCX0KQEAgLTE1NzgsNyArMTUxOCw3IEBACiB9CiAKIC8qCi0gKiBQcmVjb25kaXRpb246IFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGJyY21zX3BjaV9wcm9iZSgpIGNvbnRleHQsCisgKiBQcmVjb25kaXRpb246IFNpbmNlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGJyY21zX2JjbWFfcHJvYmUoKSBjb250ZXh0LAogICogbm8gbG9ja2luZyBpcyByZXF1aXJlZC4KICAqLwogaW50IGJyY21zX3Vjb2RlX2luaXRfdWludChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHNpemVfdCAqbl9ieXRlcywgdTMyIGlkeCkKQEAgLTE2MTgsNyArMTU1OCw3IEBACiAvKgogICogY2hlY2tzIHZhbGlkaXR5IG9mIGFsbCBmaXJtd2FyZSBpbWFnZXMgbG9hZGVkIGZyb20gdXNlciBzcGFjZQogICoKLSAqIFByZWNvbmRpdGlvbjogU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYnJjbXNfcGNpX3Byb2JlKCkgY29udGV4dCwKKyAqIFByZWNvbmRpdGlvbjogU2luY2UgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW4gYnJjbXNfYmNtYV9wcm9iZSgpIGNvbnRleHQsCiAgKiBubyBsb2NraW5nIGlzIHJlcXVpcmVkLgogICovCiBpbnQgYnJjbXNfY2hlY2tfZmlybXdhcmVzKHN0cnVjdCBicmNtc19pbmZvICp3bCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWM4MDIxMV9pZi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmgKaW5kZXggMTc3ZjBlNC4uOGY2MDQxOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21hYzgwMjExX2lmLmgKQEAgLTY4LDggKzY4LDYgQEAKIAlzcGlubG9ja190IGxvY2s7CS8qIHBlci1kZXZpY2UgcGVyaW1ldGVyIGxvY2sgKi8KIAlzcGlubG9ja190IGlzcl9sb2NrOwkvKiBwZXItZGV2aWNlIElTUiBzeW5jaHJvbml6YXRpb24gbG9jayAqLwogCi0JLyogcmVnc3ZhIGZvciB1bm1hcCBpbiBicmNtc19mcmVlKCkgKi8KLQl2b2lkIF9faW9tZW0gKnJlZ3N2YTsJLyogb3BhcXVlIGNoaXAgcmVnaXN0ZXJzIHZpcnR1YWwgYWRkcmVzcyAqLwogCiAJLyogdGltZXIgcmVsYXRlZCBmaWVsZHMgKi8KIAlhdG9taWNfdCBjYWxsYmFja3M7CS8qICMgb3V0c3RhbmRpbmcgY2FsbGJhY2sgZnVuY3Rpb25zICovCkBAIC04MCw2ICs3OCw3IEBACiAJc3RydWN0IGJyY21zX2Zpcm13YXJlIGZ3OwogCXN0cnVjdCB3aXBoeSAqd2lwaHk7CiAJc3RydWN0IGJyY21zX3Vjb2RlIHVjb2RlOworCWJvb2wgbXV0ZV90eDsKIH07CiAKIC8qIG1pc2MgY2FsbGJhY2tzICovCkBAIC0xMDQsNSArMTAzLDYgQEAKIGV4dGVybiB2b2lkIGJyY21zX21zbGVlcChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHVpbnQgbXMpOwogZXh0ZXJuIHZvaWQgYnJjbXNfZHBjKHVuc2lnbmVkIGxvbmcgZGF0YSk7CiBleHRlcm4gdm9pZCBicmNtc190aW1lcihzdHJ1Y3QgYnJjbXNfdGltZXIgKnQpOworZXh0ZXJuIHZvaWQgYnJjbXNfZmF0YWxfZXJyb3Ioc3RydWN0IGJyY21zX2luZm8gKndsKTsKIAogI2VuZGlmCQkJCS8qIF9CUkNNX01BQzgwMjExX0lGX0hfICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21haW4uYwppbmRleCA1MTBlOWJiLi5mN2VkMzQwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmMKQEAgLTMwLDQ0ICszMCwyMSBAQAogI2luY2x1ZGUgIm1hYzgwMjExX2lmLmgiCiAjaW5jbHVkZSAidWNvZGVfbG9hZGVyLmgiCiAjaW5jbHVkZSAibWFpbi5oIgorI2luY2x1ZGUgInNvYy5oIgogCiAvKgogICogSW5kaWNhdGlvbiBmb3IgdHhmbG93Y29udHJvbCB0aGF0IGFsbCBwcmlvcml0eSBiaXRzIGluCiAgKiBUWFFfU1RPUF9GT1JfUFJJT0ZDX01BU0sgYXJlIHRvIGJlIGNvbnNpZGVyZWQuCiAgKi8KLSNkZWZpbmUgQUxMUFJJTwkJLTEKLQotLyoKLSAqIDMyIFNTSUQgY2hhcnMsIG1heCBvZiA0IGNoYXJzIGZvciBlYWNoIFNTSUQgY2hhciAiXHhGRiIsIHBsdXMgTlVMTC4KLSAqLwotI2RlZmluZSBTU0lEX0ZNVF9CVUZfTEVOCSgoNCAqIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4pICsgMSkKKyNkZWZpbmUgQUxMUFJJTwkJCQktMQogCiAvKiB3YXRjaGRvZyB0aW1lciwgaW4gdW5pdCBvZiBtcyAqLwotI2RlZmluZQlUSU1FUl9JTlRFUlZBTF9XQVRDSERPRwkxMDAwCisjZGVmaW5lIFRJTUVSX0lOVEVSVkFMX1dBVENIRE9HCQkxMDAwCiAvKiByYWRpbyBtb25pdG9yIHRpbWVyLCBpbiB1bml0IG9mIG1zICovCi0jZGVmaW5lCVRJTUVSX0lOVEVSVkFMX1JBRElPQ0hLCTgwMAotCi0vKiBNYXggTVBDIHRpbWVvdXQsIGluIHVuaXQgb2Ygd2F0Y2hkb2cgKi8KLSNpZm5kZWYgQlJDTVNfTVBDX01BWF9ERUxBWUNOVAotI2RlZmluZQlCUkNNU19NUENfTUFYX0RFTEFZQ05UCTEwCi0jZW5kaWYKLQotLyogTWluIE1QQyB0aW1lb3V0LCBpbiB1bml0IG9mIHdhdGNoZG9nICovCi0jZGVmaW5lCUJSQ01TX01QQ19NSU5fREVMQVlDTlQJMQotI2RlZmluZQlCUkNNU19NUENfVEhSRVNIT0xECTMJLyogTVBDIGNvdW50IHRocmVzaG9sZCBsZXZlbCAqLworI2RlZmluZSBUSU1FUl9JTlRFUlZBTF9SQURJT0NISwkJODAwCiAKIC8qIGJlYWNvbiBpbnRlcnZhbCwgaW4gdW5pdCBvZiAxMDI0VFUgKi8KLSNkZWZpbmUJQkVBQ09OX0lOVEVSVkFMX0RFRkFVTFQJMTAwCi0vKiBEVElNIGludGVydmFsLCBpbiB1bml0IG9mIGJlYWNvbiBpbnRlcnZhbCAqLwotI2RlZmluZQlEVElNX0lOVEVSVkFMX0RFRkFVTFQJMwotCi0vKiBTY2FsZSBkb3duIGRlbGF5cyB0byBhY2NvbW1vZGF0ZSBRVCBzbG93IHNwZWVkICovCi0vKiBiZWFjb24gaW50ZXJ2YWwsIGluIHVuaXQgb2YgMTAyNFRVICovCi0jZGVmaW5lCUJFQUNPTl9JTlRFUlZBTF9ERUZfUVQJMjAKLS8qIERUSU0gaW50ZXJ2YWwsIGluIHVuaXQgb2YgYmVhY29uIGludGVydmFsICovCi0jZGVmaW5lCURUSU1fSU5URVJWQUxfREVGX1FUCTEKLQotI2RlZmluZQlUQlRUX0FMSUdOX0xFRVdBWV9VUwkxMDAJLyogbWluIGxlZXdheSBiZWZvcmUgZmlyc3QgVEJUVCBpbiB1cyAqLworI2RlZmluZSBCRUFDT05fSU5URVJWQUxfREVGQVVMVAkJMTAwCiAKIC8qIG4tbW9kZSBzdXBwb3J0IGNhcGFiaWxpdHkgKi8KIC8qIDJ4MiBpbmNsdWRlcyBib3RoIDF4MSAmIDJ4MiBkZXZpY2VzCkBAIC03OCwxMTMgKzU1LDcxIEBACiAjZGVmaW5lIFdMXzExTl8zeDMJCQkzCiAjZGVmaW5lIFdMXzExTl80eDQJCQk0CiAKLS8qIGRlZmluZSAxMW4gZmVhdHVyZSBkaXNhYmxlIGZsYWdzICovCi0jZGVmaW5lIFdMRkVBVFVSRV9ESVNBQkxFXzExTgkJMHgwMDAwMDAwMQotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU5fU1RCQ19UWAkweDAwMDAwMDAyCi0jZGVmaW5lIFdMRkVBVFVSRV9ESVNBQkxFXzExTl9TVEJDX1JYCTB4MDAwMDAwMDQKLSNkZWZpbmUgV0xGRUFUVVJFX0RJU0FCTEVfMTFOX1NHSV9UWAkweDAwMDAwMDA4Ci0jZGVmaW5lIFdMRkVBVFVSRV9ESVNBQkxFXzExTl9TR0lfUlgJMHgwMDAwMDAxMAotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU5fQU1QRFVfVFgJMHgwMDAwMDAyMAotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU5fQU1QRFVfUlgJMHgwMDAwMDA0MAotI2RlZmluZSBXTEZFQVRVUkVfRElTQUJMRV8xMU5fR0YJMHgwMDAwMDA4MAorI2RlZmluZSBFRENGX0FDSV9NQVNLCQkJMHg2MAorI2RlZmluZSBFRENGX0FDSV9TSElGVAkJCTUKKyNkZWZpbmUgRURDRl9FQ1dNSU5fTUFTSwkJMHgwZgorI2RlZmluZSBFRENGX0VDV01BWF9TSElGVAkJNAorI2RlZmluZSBFRENGX0FJRlNOX01BU0sJCQkweDBmCisjZGVmaW5lIEVEQ0ZfQUlGU05fTUFYCQkJMTUKKyNkZWZpbmUgRURDRl9FQ1dNQVhfTUFTSwkJMHhmMAogCi0jZGVmaW5lIEVEQ0ZfQUNJX01BU0sgICAgICAgICAgICAgICAgMHg2MAotI2RlZmluZSBFRENGX0FDSV9TSElGVCAgICAgICAgICAgICAgIDUKLSNkZWZpbmUgRURDRl9FQ1dNSU5fTUFTSyAgICAgICAgICAgICAweDBmCi0jZGVmaW5lIEVEQ0ZfRUNXTUFYX1NISUZUICAgICAgICAgICAgNAotI2RlZmluZSBFRENGX0FJRlNOX01BU0sgICAgICAgICAgICAgIDB4MGYKLSNkZWZpbmUgRURDRl9BSUZTTl9NQVggICAgICAgICAgICAgICAxNQotI2RlZmluZSBFRENGX0VDV01BWF9NQVNLICAgICAgICAgICAgIDB4ZjAKKyNkZWZpbmUgRURDRl9BQ19CRV9UWE9QX1NUQQkJMHgwMDAwCisjZGVmaW5lIEVEQ0ZfQUNfQktfVFhPUF9TVEEJCTB4MDAwMAorI2RlZmluZSBFRENGX0FDX1ZPX0FDSV9TVEEJCTB4NjIKKyNkZWZpbmUgRURDRl9BQ19WT19FQ1dfU1RBCQkweDMyCisjZGVmaW5lIEVEQ0ZfQUNfVklfQUNJX1NUQQkJMHg0MgorI2RlZmluZSBFRENGX0FDX1ZJX0VDV19TVEEJCTB4NDMKKyNkZWZpbmUgRURDRl9BQ19CS19FQ1dfU1RBCQkweEE0CisjZGVmaW5lIEVEQ0ZfQUNfVklfVFhPUF9TVEEJCTB4MDA1ZQorI2RlZmluZSBFRENGX0FDX1ZPX1RYT1BfU1RBCQkweDAwMmYKKyNkZWZpbmUgRURDRl9BQ19CRV9BQ0lfU1RBCQkweDAzCisjZGVmaW5lIEVEQ0ZfQUNfQkVfRUNXX1NUQQkJMHhBNAorI2RlZmluZSBFRENGX0FDX0JLX0FDSV9TVEEJCTB4MjcKKyNkZWZpbmUgRURDRl9BQ19WT19UWE9QX0FQCQkweDAwMmYKIAotI2RlZmluZSBFRENGX0FDX0JFX1RYT1BfU1RBICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBFRENGX0FDX0JLX1RYT1BfU1RBICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBFRENGX0FDX1ZPX0FDSV9TVEEgICAgICAgICAgIDB4NjIKLSNkZWZpbmUgRURDRl9BQ19WT19FQ1dfU1RBICAgICAgICAgICAweDMyCi0jZGVmaW5lIEVEQ0ZfQUNfVklfQUNJX1NUQSAgICAgICAgICAgMHg0MgotI2RlZmluZSBFRENGX0FDX1ZJX0VDV19TVEEgICAgICAgICAgIDB4NDMKLSNkZWZpbmUgRURDRl9BQ19CS19FQ1dfU1RBICAgICAgICAgICAweEE0Ci0jZGVmaW5lIEVEQ0ZfQUNfVklfVFhPUF9TVEEgICAgICAgICAgMHgwMDVlCi0jZGVmaW5lIEVEQ0ZfQUNfVk9fVFhPUF9TVEEgICAgICAgICAgMHgwMDJmCi0jZGVmaW5lIEVEQ0ZfQUNfQkVfQUNJX1NUQSAgICAgICAgICAgMHgwMwotI2RlZmluZSBFRENGX0FDX0JFX0VDV19TVEEgICAgICAgICAgIDB4QTQKLSNkZWZpbmUgRURDRl9BQ19CS19BQ0lfU1RBICAgICAgICAgICAweDI3Ci0jZGVmaW5lIEVEQ0ZfQUNfVk9fVFhPUF9BUCAgICAgICAgICAgMHgwMDJmCisjZGVmaW5lIEVEQ0ZfVFhPUDJVU0VDKHR4b3ApCQkoKHR4b3ApIDw8IDUpCisjZGVmaW5lIEVEQ0ZfRUNXMkNXKGV4cCkJCSgoMSA8PCAoZXhwKSkgLSAxKQogCi0jZGVmaW5lIEVEQ0ZfVFhPUDJVU0VDKHR4b3ApICAgICAgICAgKCh0eG9wKSA8PCA1KQotI2RlZmluZSBFRENGX0VDVzJDVyhleHApICAgICAgICAgICAgICgoMSA8PCAoZXhwKSkgLSAxKQorI2RlZmluZSBBUEhZX1NZTUJPTF9USU1FCQk0CisjZGVmaW5lIEFQSFlfUFJFQU1CTEVfVElNRQkJMTYKKyNkZWZpbmUgQVBIWV9TSUdOQUxfVElNRQkJNAorI2RlZmluZSBBUEhZX1NJRlNfVElNRQkJCTE2CisjZGVmaW5lIEFQSFlfU0VSVklDRV9OQklUUwkJMTYKKyNkZWZpbmUgQVBIWV9UQUlMX05CSVRTCQkJNgorI2RlZmluZSBCUEhZX1NJRlNfVElNRQkJCTEwCisjZGVmaW5lIEJQSFlfUExDUF9TSE9SVF9USU1FCQk5NgogCi0jZGVmaW5lIEFQSFlfU1lNQk9MX1RJTUUJNAotI2RlZmluZSBBUEhZX1BSRUFNQkxFX1RJTUUJMTYKLSNkZWZpbmUgQVBIWV9TSUdOQUxfVElNRQk0Ci0jZGVmaW5lIEFQSFlfU0lGU19USU1FCQkxNgotI2RlZmluZSBBUEhZX1NFUlZJQ0VfTkJJVFMJMTYKLSNkZWZpbmUgQVBIWV9UQUlMX05CSVRTCQk2Ci0jZGVmaW5lIEJQSFlfU0lGU19USU1FCQkxMAotI2RlZmluZSBCUEhZX1BMQ1BfU0hPUlRfVElNRQk5NgotCi0jZGVmaW5lIFBSRU5fUFJFQU1CTEUJCTI0Ci0jZGVmaW5lIFBSRU5fTU1fRVhUCQkxMgotI2RlZmluZSBQUkVOX1BSRUFNQkxFX0VYVAk0CisjZGVmaW5lIFBSRU5fUFJFQU1CTEUJCQkyNAorI2RlZmluZSBQUkVOX01NX0VYVAkJCTEyCisjZGVmaW5lIFBSRU5fUFJFQU1CTEVfRVhUCQk0CiAKICNkZWZpbmUgRE9UMTFfTUFDX0hEUl9MRU4JCTI0Ci0jZGVmaW5lCURPVDExX0FDS19MRU4JCTEwCi0jZGVmaW5lIERPVDExX0JBX0xFTgkJNAorI2RlZmluZSBET1QxMV9BQ0tfTEVOCQkJMTAKKyNkZWZpbmUgRE9UMTFfQkFfTEVOCQkJNAogI2RlZmluZSBET1QxMV9PRkRNX1NJR05BTF9FWFRFTlNJT04JNgogI2RlZmluZSBET1QxMV9NSU5fRlJBR19MRU4JCTI1NgotI2RlZmluZQlET1QxMV9SVFNfTEVOCQkxNgotI2RlZmluZQlET1QxMV9DVFNfTEVOCQkxMAorI2RlZmluZSBET1QxMV9SVFNfTEVOCQkJMTYKKyNkZWZpbmUgRE9UMTFfQ1RTX0xFTgkJCTEwCiAjZGVmaW5lIERPVDExX0JBX0JJVE1BUF9MRU4JCTEyOAogI2RlZmluZSBET1QxMV9NSU5fQkVBQ09OX1BFUklPRAkJMQogI2RlZmluZSBET1QxMV9NQVhfQkVBQ09OX1BFUklPRAkJMHhGRkZGCi0jZGVmaW5lCURPVDExX01BWE5VTUZSQUdTCTE2CisjZGVmaW5lIERPVDExX01BWE5VTUZSQUdTCQkxNgogI2RlZmluZSBET1QxMV9NQVhfRlJBR19MRU4JCTIzNDYKIAotI2RlZmluZSBCUEhZX1BMQ1BfVElNRQkJMTkyCi0jZGVmaW5lIFJJRlNfMTFOX1RJTUUJCTIKKyNkZWZpbmUgQlBIWV9QTENQX1RJTUUJCQkxOTIKKyNkZWZpbmUgUklGU18xMU5fVElNRQkJCTIKIAotI2RlZmluZSBXTUVfVkVSCQkJMQotI2RlZmluZSBXTUVfU1VCVFlQRV9QQVJBTV9JRQkxCi0jZGVmaW5lIFdNRV9UWVBFCQkyCi0jZGVmaW5lIFdNRV9PVUkJCQkiXHgwMFx4NTBceGYyIgotCi0jZGVmaW5lIEFDX0JFCQkJMAotI2RlZmluZSBBQ19CSwkJCTEKLSNkZWZpbmUgQUNfVkkJCQkyCi0jZGVmaW5lIEFDX1ZPCQkJMwotCi0jZGVmaW5lCUJDTl9UTVBMX0xFTgkJNTEyCS8qIGxlbmd0aCBvZiB0aGUgQkNOIHRlbXBsYXRlIGFyZWEgKi8KKy8qIGxlbmd0aCBvZiB0aGUgQkNOIHRlbXBsYXRlIGFyZWEgKi8KKyNkZWZpbmUgQkNOX1RNUExfTEVOCQkJNTEyCiAKIC8qIGJyY21zX2Jzc19pbmZvIGZsYWcgYml0IHZhbHVlcyAqLwotI2RlZmluZSBCUkNNU19CU1NfSFQJCTB4MDAyMAkvKiBCU1MgaXMgSFQgKE1JTU8pIGNhcGFibGUgKi8KKyNkZWZpbmUgQlJDTVNfQlNTX0hUCQkJMHgwMDIwCS8qIEJTUyBpcyBIVCAoTUlNTykgY2FwYWJsZSAqLwogCi0vKiBGbGFncyB1c2VkIGluIGJyY21zX2NfdHhxX2luZm8uc3RvcHBlZCAqLwotLyogcGVyIHByaW8gZmxvdyBjb250cm9sIGJpdHMgKi8KLSNkZWZpbmUgVFhRX1NUT1BfRk9SX1BSSU9GQ19NQVNLCTB4MDAwMDAwRkYKLS8qIHN0b3AgdHhxIGVucXVldWUgZm9yIHBhY2tldCBkcmFpbiAqLwotI2RlZmluZSBUWFFfU1RPUF9GT1JfUEtUX0RSQUlOCQkweDAwMDAwMTAwCi0vKiBzdG9wIHR4cSBlbnF1ZXVlIGZvciBhbXBkdSBmbG93IGNvbnRyb2wgKi8KLSNkZWZpbmUgVFhRX1NUT1BfRk9SX0FNUERVX0ZMT1dfQ05UUkwJMHgwMDAwMDIwMAotCi0jZGVmaW5lCUJSQ01TX0hXUlhPRkYJCTM4CS8qIGNoaXAgcnggYnVmZmVyIG9mZnNldCAqLwotCi0vKiBGaW5kIGJhc2ljIHJhdGUgZm9yIGEgZ2l2ZW4gcmF0ZSAqLwotc3RhdGljIHU4IGJyY21zX2Jhc2ljX3JhdGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1MzIgcnNwZWMpCi17Ci0JaWYgKGlzX21jc19yYXRlKHJzcGVjKSkKLQkJcmV0dXJuIHdsYy0+YmFuZC0+YmFzaWNfcmF0ZVttY3NfdGFibGVbcnNwZWMgJiBSU1BFQ19SQVRFX01BU0tdCi0JCSAgICAgICAubGVnX29mZG1dOwotCXJldHVybiB3bGMtPmJhbmQtPmJhc2ljX3JhdGVbcnNwZWMgJiBSU1BFQ19SQVRFX01BU0tdOwotfQotCi1zdGF0aWMgdTE2IGZyYW1ldHlwZSh1MzIgcnNwZWMsIHU4IG1pbW9mcmFtZSkKLXsKLQlpZiAoaXNfbWNzX3JhdGUocnNwZWMpKQotCQlyZXR1cm4gbWltb2ZyYW1lOwotCXJldHVybiBpc19jY2tfcmF0ZShyc3BlYykgPyBGVF9DQ0sgOiBGVF9PRkRNOwotfQorLyogY2hpcCByeCBidWZmZXIgb2Zmc2V0ICovCisjZGVmaW5lIEJSQ01TX0hXUlhPRkYJCQkzOAogCiAvKiByZmRpc2FibGUgZGVsYXkgdGltZXIgNTAwIG1zLCBydW5zIG9mIEFMUCBjbG9jayAqLwotI2RlZmluZSBSRkRJU0FCTEVfREVGQVVMVAkxMDAwMDAwMAorI2RlZmluZSBSRkRJU0FCTEVfREVGQVVMVAkJMTAwMDAwMDAKIAogI2RlZmluZSBCUkNNU19URU1QU0VOU0VfUEVSSU9ECQkxMAkvKiAxMCBzZWNvbmQgdGltZW91dCAqLwogCkBAIC0xOTQsODcgKzEyOSw4MyBAQAogICogVGhlc2UgY29uc3RhbnRzIGFyZSB1c2VkIE9OTFkgYnkgd2xjX3ByaW8ycHJlY19tYXAuICBEbyBub3QgdXNlIHRoZW0KICAqIGVsc2V3aGVyZS4KICAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19OT05FCQkwCS8qIE5vbmUgPSAtICovCi0jZGVmaW5lCV9CUkNNU19QUkVDX0JLCQkyCS8qIEJLIC0gQmFja2dyb3VuZCAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19CRQkJNAkvKiBCRSAtIEJlc3QtZWZmb3J0ICovCi0jZGVmaW5lCV9CUkNNU19QUkVDX0VFCQk2CS8qIEVFIC0gRXhjZWxsZW50LWVmZm9ydCAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19DTAkJOAkvKiBDTCAtIENvbnRyb2xsZWQgTG9hZCAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19WSQkJMTAJLyogVmkgLSBWaWRlbyAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19WTwkJMTIJLyogVm8gLSBWb2ljZSAqLwotI2RlZmluZQlfQlJDTVNfUFJFQ19OQwkJMTQJLyogTkMgLSBOZXR3b3JrIENvbnRyb2wgKi8KKyNkZWZpbmUgX0JSQ01TX1BSRUNfTk9ORQkJMAkvKiBOb25lID0gLSAqLworI2RlZmluZSBfQlJDTVNfUFJFQ19CSwkJCTIJLyogQksgLSBCYWNrZ3JvdW5kICovCisjZGVmaW5lIF9CUkNNU19QUkVDX0JFCQkJNAkvKiBCRSAtIEJlc3QtZWZmb3J0ICovCisjZGVmaW5lIF9CUkNNU19QUkVDX0VFCQkJNgkvKiBFRSAtIEV4Y2VsbGVudC1lZmZvcnQgKi8KKyNkZWZpbmUgX0JSQ01TX1BSRUNfQ0wJCQk4CS8qIENMIC0gQ29udHJvbGxlZCBMb2FkICovCisjZGVmaW5lIF9CUkNNU19QUkVDX1ZJCQkJMTAJLyogVmkgLSBWaWRlbyAqLworI2RlZmluZSBfQlJDTVNfUFJFQ19WTwkJCTEyCS8qIFZvIC0gVm9pY2UgKi8KKyNkZWZpbmUgX0JSQ01TX1BSRUNfTkMJCQkxNAkvKiBOQyAtIE5ldHdvcmsgQ29udHJvbCAqLwogCi0vKiBUaGUgQlNTIGlzIGdlbmVyYXRpbmcgYmVhY29ucyBpbiBIVyAqLwotI2RlZmluZSBCUkNNU19CU1NDRkdfSFdfQkNOCTB4MjAKKy8qIHN5bnRocHVfZGx5IHRpbWVzIGluIHVzICovCisjZGVmaW5lIFNZTlRIUFVfRExZX0FQSFlfVVMJCTM3MDAKKyNkZWZpbmUgU1lOVEhQVV9ETFlfQlBIWV9VUwkJMTA1MAorI2RlZmluZSBTWU5USFBVX0RMWV9OUEhZX1VTCQkyMDQ4CisjZGVmaW5lIFNZTlRIUFVfRExZX0xQUEhZX1VTCQkzMDAKIAotI2RlZmluZQlTWU5USFBVX0RMWV9BUEhZX1VTCTM3MDAJLyogYSBwaHkgc3ludGhwdV9kbHkgdGltZSBpbiB1cyAqLwotI2RlZmluZQlTWU5USFBVX0RMWV9CUEhZX1VTCTEwNTAJLyogYi9nIHBoeSBzeW50aHB1X2RseSB0aW1lIGluIHVzICovCi0jZGVmaW5lCVNZTlRIUFVfRExZX05QSFlfVVMJMjA0OAkvKiBuIHBoeSBSRVYzIHN5bnRocHVfZGx5IHRpbWUgaW4gdXMgKi8KLSNkZWZpbmUJU1lOVEhQVV9ETFlfTFBQSFlfVVMJMzAwCS8qIGxwcGh5IHN5bnRocHVfZGx5IHRpbWUgaW4gdXMgKi8KLQotI2RlZmluZQlTWU5USFBVX0RMWV9QSFlfVVNfUVQJMTAwCS8qIFFUIHN5bnRocHVfZGx5IHRpbWUgaW4gdXMgKi8KLQotI2RlZmluZQlBTlRDTlQJCQkxMAkvKiB2YW5pbGxhIE1fTUFYX0FOVENOVCB2YWx1ZSAqLworI2RlZmluZSBBTlRDTlQJCQkJMTAJLyogdmFuaWxsYSBNX01BWF9BTlRDTlQgdmFsICovCiAKIC8qIFBlci1BQyByZXRyeSBsaW1pdCByZWdpc3RlciBkZWZpbml0aW9uczsgdXNlcyBkZWZzLmggYml0ZmllbGQgbWFjcm9zICovCi0jZGVmaW5lIEVEQ0ZfU0hPUlRfUyAgICAgICAgICAgIDAKLSNkZWZpbmUgRURDRl9TRkJfUyAgICAgICAgICAgICAgNAotI2RlZmluZSBFRENGX0xPTkdfUyAgICAgICAgICAgICA4Ci0jZGVmaW5lIEVEQ0ZfTEZCX1MgICAgICAgICAgICAgIDEyCi0jZGVmaW5lIEVEQ0ZfU0hPUlRfTSAgICAgICAgICAgIEJJVEZJRUxEX01BU0soNCkKLSNkZWZpbmUgRURDRl9TRkJfTSAgICAgICAgICAgICAgQklURklFTERfTUFTSyg0KQotI2RlZmluZSBFRENGX0xPTkdfTSAgICAgICAgICAgICBCSVRGSUVMRF9NQVNLKDQpCi0jZGVmaW5lIEVEQ0ZfTEZCX00gICAgICAgICAgICAgIEJJVEZJRUxEX01BU0soNCkKKyNkZWZpbmUgRURDRl9TSE9SVF9TCQkJMAorI2RlZmluZSBFRENGX1NGQl9TCQkJNAorI2RlZmluZSBFRENGX0xPTkdfUwkJCTgKKyNkZWZpbmUgRURDRl9MRkJfUwkJCTEyCisjZGVmaW5lIEVEQ0ZfU0hPUlRfTQkJCUJJVEZJRUxEX01BU0soNCkKKyNkZWZpbmUgRURDRl9TRkJfTQkJCUJJVEZJRUxEX01BU0soNCkKKyNkZWZpbmUgRURDRl9MT05HX00JCQlCSVRGSUVMRF9NQVNLKDQpCisjZGVmaW5lIEVEQ0ZfTEZCX00JCQlCSVRGSUVMRF9NQVNLKDQpCiAKLSNkZWZpbmUJUkVUUllfU0hPUlRfREVGCQkJNwkvKiBEZWZhdWx0IFNob3J0IHJldHJ5IExpbWl0ICovCi0jZGVmaW5lCVJFVFJZX1NIT1JUX01BWAkJCTI1NQkvKiBNYXhpbXVtIFNob3J0IHJldHJ5IExpbWl0ICovCi0jZGVmaW5lCVJFVFJZX0xPTkdfREVGCQkJNAkvKiBEZWZhdWx0IExvbmcgcmV0cnkgY291bnQgKi8KLSNkZWZpbmUJUkVUUllfU0hPUlRfRkIJCQkzIC8qIFNob3J0IGNvdW50IGZvciBmYWxsYmFjayByYXRlICovCi0jZGVmaW5lCVJFVFJZX0xPTkdfRkIJCQkyIC8qIExvbmcgY291bnQgZm9yIGZhbGxiYWNrIHJhdGUgKi8KKyNkZWZpbmUgUkVUUllfU0hPUlRfREVGCQkJNwkvKiBEZWZhdWx0IFNob3J0IHJldHJ5IExpbWl0ICovCisjZGVmaW5lIFJFVFJZX1NIT1JUX01BWAkJCTI1NQkvKiBNYXhpbXVtIFNob3J0IHJldHJ5IExpbWl0ICovCisjZGVmaW5lIFJFVFJZX0xPTkdfREVGCQkJNAkvKiBEZWZhdWx0IExvbmcgcmV0cnkgY291bnQgKi8KKyNkZWZpbmUgUkVUUllfU0hPUlRfRkIJCQkzCS8qIFNob3J0IGNvdW50IGZvciBmYiByYXRlICovCisjZGVmaW5lIFJFVFJZX0xPTkdfRkIJCQkyCS8qIExvbmcgY291bnQgZm9yIGZiIHJhdGUgKi8KIAotI2RlZmluZQlBUEhZX0NXTUlOCQkxNQotI2RlZmluZSBQSFlfQ1dNQVgJCTEwMjMKKyNkZWZpbmUgQVBIWV9DV01JTgkJCTE1CisjZGVmaW5lIFBIWV9DV01BWAkJCTEwMjMKIAotI2RlZmluZSBFRENGX0FJRlNOX01JTiAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRURDRl9BSUZTTl9NSU4JCQkxCiAKLSNkZWZpbmUgRlJBR05VTV9NQVNLCQkweEYKKyNkZWZpbmUgRlJBR05VTV9NQVNLCQkJMHhGCiAKLSNkZWZpbmUgQVBIWV9TTE9UX1RJTUUJCTkKLSNkZWZpbmUgQlBIWV9TTE9UX1RJTUUJCTIwCisjZGVmaW5lIEFQSFlfU0xPVF9USU1FCQkJOQorI2RlZmluZSBCUEhZX1NMT1RfVElNRQkJCTIwCiAKLSNkZWZpbmUJV0xfU1BVUkFWT0lEX09GRgkwCi0jZGVmaW5lCVdMX1NQVVJBVk9JRF9PTjEJMQotI2RlZmluZQlXTF9TUFVSQVZPSURfT04yCTIKKyNkZWZpbmUgV0xfU1BVUkFWT0lEX09GRgkJMAorI2RlZmluZSBXTF9TUFVSQVZPSURfT04xCQkxCisjZGVmaW5lIFdMX1NQVVJBVk9JRF9PTjIJCTIKIAogLyogaW52YWxpZCBjb3JlIGZsYWdzLCB1c2UgdGhlIHNhdmVkIGNvcmVmbGFncyAqLwotI2RlZmluZSBCUkNNU19VU0VfQ09SRUZMQUdTCTB4ZmZmZmZmZmYKKyNkZWZpbmUgQlJDTVNfVVNFX0NPUkVGTEFHUwkJMHhmZmZmZmZmZgogCiAvKiB2YWx1ZXMgZm9yIFBMQ1BIZHJfb3ZlcnJpZGUgKi8KLSNkZWZpbmUgQlJDTVNfUExDUF9BVVRPCS0xCi0jZGVmaW5lIEJSQ01TX1BMQ1BfU0hPUlQJMAotI2RlZmluZSBCUkNNU19QTENQX0xPTkcJMQorI2RlZmluZSBCUkNNU19QTENQX0FVVE8JCQktMQorI2RlZmluZSBCUkNNU19QTENQX1NIT1JUCQkwCisjZGVmaW5lIEJSQ01TX1BMQ1BfTE9ORwkJCTEKIAogLyogdmFsdWVzIGZvciBnX3Byb3RlY3Rpb25fb3ZlcnJpZGUgYW5kIG5fcHJvdGVjdGlvbl9vdmVycmlkZSAqLwogI2RlZmluZSBCUkNNU19QUk9URUNUSU9OX0FVVE8JCS0xCiAjZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fT0ZGCQkwCiAjZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fT04JCTEKICNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9NTUhEUl9PTkxZCTIKLSNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9DVFNfT05MWQkJMworI2RlZmluZSBCUkNNU19QUk9URUNUSU9OX0NUU19PTkxZCTMKIAogLyogdmFsdWVzIGZvciBnX3Byb3RlY3Rpb25fY29udHJvbCBhbmQgbl9wcm90ZWN0aW9uX2NvbnRyb2wgKi8KLSNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9DVExfT0ZGCQkwCisjZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fQ1RMX09GRgkwCiAjZGVmaW5lIEJSQ01TX1BST1RFQ1RJT05fQ1RMX0xPQ0FMCTEKICNkZWZpbmUgQlJDTVNfUFJPVEVDVElPTl9DVExfT1ZFUkxBUAkyCiAKIC8qIHZhbHVlcyBmb3Igbl9wcm90ZWN0aW9uICovCiAjZGVmaW5lIEJSQ01TX05fUFJPVEVDVElPTl9PRkYJCTAKICNkZWZpbmUgQlJDTVNfTl9QUk9URUNUSU9OX09QVElPTkFMCTEKLSNkZWZpbmUgQlJDTVNfTl9QUk9URUNUSU9OXzIwSU40MAkJMgorI2RlZmluZSBCUkNNU19OX1BST1RFQ1RJT05fMjBJTjQwCTIKICNkZWZpbmUgQlJDTVNfTl9QUk9URUNUSU9OX01JWEVETU9ERQkzCiAKIC8qIHZhbHVlcyBmb3IgYmFuZCBzcGVjaWZpYyA0ME1IeiBjYXBhYmlsaXRpZXMgKi8KLSNkZWZpbmUgQlJDTVNfTl9CV18yMEFMTAkJCTAKLSNkZWZpbmUgQlJDTVNfTl9CV180MEFMTAkJCTEKLSNkZWZpbmUgQlJDTVNfTl9CV18yMElOMkdfNDBJTjVHCQkyCisjZGVmaW5lIEJSQ01TX05fQldfMjBBTEwJCTAKKyNkZWZpbmUgQlJDTVNfTl9CV180MEFMTAkJMQorI2RlZmluZSBCUkNNU19OX0JXXzIwSU4yR180MElONUcJMgogCiAvKiBiaXRmbGFncyBmb3IgU0dJIHN1cHBvcnQgKHNnaV9yeCBpb3ZhcikgKi8KICNkZWZpbmUgQlJDTVNfTl9TR0lfMjAJCQkweDAxCkBAIC0yODIsNDggKzIxMyw0MiBAQAogCiAvKiBkZWZpbmVzIHVzZWQgYnkgdGhlIG5yYXRlIGlvdmFyICovCiAvKiBNU0MgaW4gdXNlLGluZGljYXRlcyBiMC02IGhvbGRzIGFuIG1jcyAqLwotI2RlZmluZSBOUkFURV9NQ1NfSU5VU0UJMHgwMDAwMDA4MAorI2RlZmluZSBOUkFURV9NQ1NfSU5VU0UJCQkweDAwMDAwMDgwCiAvKiByYXRlL21jcyB2YWx1ZSAqLwotI2RlZmluZSBOUkFURV9SQVRFX01BU0sgMHgwMDAwMDA3ZgorI2RlZmluZSBOUkFURV9SQVRFX01BU0sJCQkweDAwMDAwMDdmCiAvKiBzdGYgbW9kZSBtYXNrOiBzaXNvLCBjZGQsIHN0YmMsIHNkbSAqLwotI2RlZmluZSBOUkFURV9TVEZfTUFTSwkweDAwMDBmZjAwCisjZGVmaW5lIE5SQVRFX1NURl9NQVNLCQkJMHgwMDAwZmYwMAogLyogc3RmIG1vZGUgc2hpZnQgKi8KLSNkZWZpbmUgTlJBVEVfU1RGX1NISUZUCTgKLS8qIGJpdCBpbmRpY2F0ZXMgb3ZlcnJpZGUgYm90aCByYXRlICYgbW9kZSAqLwotI2RlZmluZSBOUkFURV9PVkVSUklERQkweDgwMDAwMDAwCisjZGVmaW5lIE5SQVRFX1NURl9TSElGVAkJCTgKIC8qIGJpdCBpbmRpY2F0ZSB0byBvdmVycmlkZSBtY3Mgb25seSAqLwotI2RlZmluZSBOUkFURV9PVkVSUklERV9NQ1NfT05MWSAweDQwMDAwMDAwCi0jZGVmaW5lIE5SQVRFX1NHSV9NQVNLICAweDAwODAwMDAwCS8qIHNnaSBtb2RlICovCi0jZGVmaW5lIE5SQVRFX1NHSV9TSElGVCAyMwkvKiBzZ2kgbW9kZSAqLwotI2RlZmluZSBOUkFURV9MRFBDX0NPRElORyAweDAwNDAwMDAwCS8qIGJpdCBpbmRpY2F0ZXMgYWR2IGNvZGluZyBpbiB1c2UgKi8KLSNkZWZpbmUgTlJBVEVfTERQQ19TSElGVCAyMgkvKiBsZHBjIHNoaWZ0ICovCisjZGVmaW5lIE5SQVRFX09WRVJSSURFX01DU19PTkxZCQkweDQwMDAwMDAwCisjZGVmaW5lIE5SQVRFX1NHSV9NQVNLCQkJMHgwMDgwMDAwMAkvKiBzZ2kgbW9kZSAqLworI2RlZmluZSBOUkFURV9TR0lfU0hJRlQJCQkyMwkJLyogc2dpIG1vZGUgKi8KKyNkZWZpbmUgTlJBVEVfTERQQ19DT0RJTkcJCTB4MDA0MDAwMDAJLyogYWR2IGNvZGluZyBpbiB1c2UgKi8KKyNkZWZpbmUgTlJBVEVfTERQQ19TSElGVAkJMjIJCS8qIGxkcGMgc2hpZnQgKi8KIAotI2RlZmluZSBOUkFURV9TVEZfU0lTTwkwCS8qIHN0ZiBtb2RlIFNJU08gKi8KLSNkZWZpbmUgTlJBVEVfU1RGX0NERAkxCS8qIHN0ZiBtb2RlIENERCAqLwotI2RlZmluZSBOUkFURV9TVEZfU1RCQwkyCS8qIHN0ZiBtb2RlIFNUQkMgKi8KLSNkZWZpbmUgTlJBVEVfU1RGX1NETQkzCS8qIHN0ZiBtb2RlIFNETSAqLworI2RlZmluZSBOUkFURV9TVEZfU0lTTwkJCTAJCS8qIHN0ZiBtb2RlIFNJU08gKi8KKyNkZWZpbmUgTlJBVEVfU1RGX0NERAkJCTEJCS8qIHN0ZiBtb2RlIENERCAqLworI2RlZmluZSBOUkFURV9TVEZfU1RCQwkJCTIJCS8qIHN0ZiBtb2RlIFNUQkMgKi8KKyNkZWZpbmUgTlJBVEVfU1RGX1NETQkJCTMJCS8qIHN0ZiBtb2RlIFNETSAqLwogCi0jZGVmaW5lIE1BWF9ETUFfU0VHUyA0CisjZGVmaW5lIE1BWF9ETUFfU0VHUwkJCTQKIAogLyogTWF4ICMgb2YgZW50cmllcyBpbiBUeCBGSUZPIGJhc2VkIG9uIDRrYiBwYWdlIHNpemUgKi8KLSNkZWZpbmUgTlRYRAkJMjU2CisjZGVmaW5lIE5UWEQJCQkJMjU2CiAvKiBNYXggIyBvZiBlbnRyaWVzIGluIFJ4IEZJRk8gYmFzZWQgb24gNGtiIHBhZ2Ugc2l6ZSAqLwotI2RlZmluZSBOUlhECQkyNTYKKyNkZWZpbmUgTlJYRAkJCQkyNTYKIAogLyogdHJ5IHRvIGtlZXAgdGhpcyAjIHJidWZzIHBvc3RlZCB0byB0aGUgY2hpcCAqLwotI2RlZmluZQlOUlhCVUZQT1NUCTMyCisjZGVmaW5lIE5SWEJVRlBPU1QJCQkzMgogCiAvKiBkYXRhIG1zZyB0eHEgaGl3YXQgbWFyayAqLwotI2RlZmluZSBCUkNNU19EQVRBSElXQVQJCTUwCisjZGVmaW5lIEJSQ01TX0RBVEFISVdBVAkJCTUwCiAKLS8qIGJvdW5kZWQgcnggbG9vcHMgKi8KLSNkZWZpbmUgUlhCTkQJCTggLyogbWF4ICMgZnJhbWVzIHRvIHByb2Nlc3MgaW4gYnJjbXNfY19yZWN2KCkgKi8KLSNkZWZpbmUgVFhTQk5ECQk4IC8qIG1heCAjIHR4IHN0YXR1cyB0byBwcm9jZXNzIGluIHdsY190eHN0YXR1cygpICovCi0KLS8qCi0gKiAzMiBTU0lEIGNoYXJzLCBtYXggb2YgNCBjaGFycyBmb3IgZWFjaCBTU0lEIGNoYXIgIlx4RkYiLCBwbHVzIE5VTEwuCi0gKi8KLSNkZWZpbmUgU1NJRF9GTVRfQlVGX0xFTgkoKDQgKiBJRUVFODAyMTFfTUFYX1NTSURfTEVOKSArIDEpCisvKiBtYXggIyBmcmFtZXMgdG8gcHJvY2VzcyBpbiBicmNtc19jX3JlY3YoKSAqLworI2RlZmluZSBSWEJORAkJCQk4CisvKiBtYXggIyB0eCBzdGF0dXMgdG8gcHJvY2VzcyBpbiB3bGNfdHhzdGF0dXMoKSAqLworI2RlZmluZSBUWFNCTkQJCQkJOAogCiAvKiBicmNtdV9mb3JtYXRfZmxhZ3MoKSBiaXQgZGVzY3JpcHRpb24gc3RydWN0dXJlICovCiBzdHJ1Y3QgYnJjbXNfY19iaXRfZGVzYyB7CkBAIC0zNzUsMTAgKzMwMCwyMiBAQAogI2VuZGlmCQkJCS8qIEJDTURCRyAqLwogCiAvKiBUWCBGSUZPIG51bWJlciB0byBXTUUvODAyLjFFIEFjY2VzcyBDYXRlZ29yeSAqLwotc3RhdGljIGNvbnN0IHU4IHdtZV9maWZvMmFjW10gPSB7IEFDX0JLLCBBQ19CRSwgQUNfVkksIEFDX1ZPLCBBQ19CRSwgQUNfQkUgfTsKK3N0YXRpYyBjb25zdCB1OCB3bWVfZmlmbzJhY1tdID0geworCUlFRUU4MDIxMV9BQ19CSywKKwlJRUVFODAyMTFfQUNfQkUsCisJSUVFRTgwMjExX0FDX1ZJLAorCUlFRUU4MDIxMV9BQ19WTywKKwlJRUVFODAyMTFfQUNfQkUsCisJSUVFRTgwMjExX0FDX0JFCit9OwogCi0vKiBXTUUvODAyLjFFIEFjY2VzcyBDYXRlZ29yeSB0byBUWCBGSUZPIG51bWJlciAqLwotc3RhdGljIGNvbnN0IHU4IHdtZV9hYzJmaWZvW10gPSB7IDEsIDAsIDIsIDMgfTsKKy8qIGllZWU4MDIxMSBBY2Nlc3MgQ2F0ZWdvcnkgdG8gVFggRklGTyBudW1iZXIgKi8KK3N0YXRpYyBjb25zdCB1OCB3bWVfYWMyZmlmb1tdID0geworCVRYX0FDX1ZPX0ZJRk8sCisJVFhfQUNfVklfRklGTywKKwlUWF9BQ19CRV9GSUZPLAorCVRYX0FDX0JLX0ZJRk8KK307CiAKIC8qIDgwMi4xRCBQcmlvcml0eSB0byBwcmVjZWRlbmNlIHF1ZXVlIG1hcHBpbmcgKi8KIGNvbnN0IHU4IHdsY19wcmlvMnByZWNfbWFwW10gPSB7CkBAIC00MDUsMTMgKzM0Miw2IEBACiAJezksIDU4LCAyMiwgMTQsIDE0LCA1fSwKIH07CiAKLXN0YXRpYyBjb25zdCB1OCBhY2JpdG1hcDJtYXhwcmlvW10gPSB7Ci0JUFJJT184MDIxRF9CRSwgUFJJT184MDIxRF9CRSwgUFJJT184MDIxRF9CSywgUFJJT184MDIxRF9CSywKLQlQUklPXzgwMjFEX1ZJLCBQUklPXzgwMjFEX1ZJLCBQUklPXzgwMjFEX1ZJLCBQUklPXzgwMjFEX1ZJLAotCVBSSU9fODAyMURfVk8sIFBSSU9fODAyMURfVk8sIFBSSU9fODAyMURfVk8sIFBSSU9fODAyMURfVk8sCi0JUFJJT184MDIxRF9WTywgUFJJT184MDIxRF9WTywgUFJJT184MDIxRF9WTywgUFJJT184MDIxRF9WTwotfTsKLQogI2lmZGVmIEJDTURCRwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBmaWZvX25hbWVzW10gPSB7CiAJIkFDX0JLIiwgIkFDX0JFIiwgIkFDX1ZJIiwgIkFDX1ZPIiwgIkJDTUMiLCAiQVRJTSIgfTsKQEAgLTQyNCw2ICszNTQsMjIgQEAKIHN0YXRpYyBzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGNfaW5mb19kYmcgPSAoc3RydWN0IGJyY21zX2NfaW5mbyAqKSAoTlVMTCk7CiAjZW5kaWYKIAorLyogRmluZCBiYXNpYyByYXRlIGZvciBhIGdpdmVuIHJhdGUgKi8KK3N0YXRpYyB1OCBicmNtc19iYXNpY19yYXRlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTMyIHJzcGVjKQoreworCWlmIChpc19tY3NfcmF0ZShyc3BlYykpCisJCXJldHVybiB3bGMtPmJhbmQtPmJhc2ljX3JhdGVbbWNzX3RhYmxlW3JzcGVjICYgUlNQRUNfUkFURV9NQVNLXQorCQkgICAgICAgLmxlZ19vZmRtXTsKKwlyZXR1cm4gd2xjLT5iYW5kLT5iYXNpY19yYXRlW3JzcGVjICYgUlNQRUNfUkFURV9NQVNLXTsKK30KKworc3RhdGljIHUxNiBmcmFtZXR5cGUodTMyIHJzcGVjLCB1OCBtaW1vZnJhbWUpCit7CisJaWYgKGlzX21jc19yYXRlKHJzcGVjKSkKKwkJcmV0dXJuIG1pbW9mcmFtZTsKKwlyZXR1cm4gaXNfY2NrX3JhdGUocnNwZWMpID8gRlRfQ0NLIDogRlRfT0ZETTsKK30KKwogLyogY3VycmVudGx5IHRoZSBiZXN0IG1lY2hhbmlzbSBmb3IgZGV0ZXJtaW5pbmcgU0lGUyBpcyB0aGUgYmFuZCBpbiB1c2UgKi8KIHN0YXRpYyB1MTYgZ2V0X3NpZnMoc3RydWN0IGJyY21zX2JhbmQgKmJhbmQpCiB7CkBAIC00NDIsMTAgKzM4OCwxMyBAQAogICovCiBzdGF0aWMgYm9vbCBicmNtc19kZXZpY2VyZW1vdmVkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKIHsKKwl1MzIgbWFjY3RybDsKKwogCWlmICghd2xjLT5ody0+Y2xrKQogCQlyZXR1cm4gYWlfZGV2aWNlcmVtb3ZlZCh3bGMtPmh3LT5zaWgpOwotCXJldHVybiAoUl9SRUcoJndsYy0+aHctPnJlZ3MtPm1hY2NvbnRyb2wpICYKLQkJKE1DVExfUFNNX0pNUF8wIHwgTUNUTF9JSFJfRU4pKSAhPSBNQ1RMX0lIUl9FTjsKKwltYWNjdHJsID0gYmNtYV9yZWFkMzIod2xjLT5ody0+ZDExY29yZSwKKwkJCSAgICAgIEQxMVJFR09GRlMobWFjY29udHJvbCkpOworCXJldHVybiAobWFjY3RybCAmIChNQ1RMX1BTTV9KTVBfMCB8IE1DVExfSUhSX0VOKSkgIT0gTUNUTF9JSFJfRU47CiB9CiAKIC8qIHN1bSB0aGUgaW5kaXZpZHVhbCBmaWZvIHR4IHBlbmRpbmcgcGFja2V0IGNvdW50cyAqLwpAQCAtNDcwLDIwICs0MTksNiBAQAogCXJldHVybiBCUkNNU18xMF9NSFo7CiB9CiAKLS8qCi0gKiByZXR1cm4gdHJ1ZSBpZiBNaW5pbXVtIFBvd2VyIENvbnN1bXB0aW9uIHNob3VsZAotICogYmUgZW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0gKi8KLXN0YXRpYyBib29sIGJyY21zX2NfaXNfbm9uX2RlbGF5X21wYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBicmNtc19jX2lzbXBjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlyZXR1cm4gKHdsYy0+bXBjX2RlbGF5X29mZiA9PSAwKSAmJiAoYnJjbXNfY19pc19ub25fZGVsYXlfbXBjKHdsYykpOwotfQotCiBzdGF0aWMgdm9pZCBicmNtc19jX2Jzc2NmZ19tZnJlZShzdHJ1Y3QgYnJjbXNfYnNzX2NmZyAqY2ZnKQogewogCWlmIChjZmcgPT0gTlVMTCkKQEAgLTY1MCwxNyArNTg1LDE1IEBACiBzdGF0aWMgdm9pZCBicmNtc19iX3VwZGF0ZV9zbG90X3RpbWluZyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKIAkJCQkJYm9vbCBzaG9ydHNsb3QpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKLQotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCiAJaWYgKHNob3J0c2xvdCkgewogCQkvKiAxMWcgc2hvcnQgc2xvdDogMTFhIHRpbWluZyAqLwotCQlXX1JFRygmcmVncy0+aWZzX3Nsb3QsIDB4MDIwNyk7CS8qIEFQSFlfU0xPVF9USU1FICovCisJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKGlmc19zbG90KSwgMHgwMjA3KTsKIAkJYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBNX0RPVDExX1NMT1QsIEFQSFlfU0xPVF9USU1FKTsKIAl9IGVsc2UgewogCQkvKiAxMWcgbG9uZyBzbG90OiAxMWIgdGltaW5nICovCi0JCVdfUkVHKCZyZWdzLT5pZnNfc2xvdCwgMHgwMjEyKTsJLyogQlBIWV9TTE9UX1RJTUUgKi8KKwkJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMoaWZzX3Nsb3QpLCAweDAyMTIpOwogCQlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fRE9UMTFfU0xPVCwgQlBIWV9TTE9UX1RJTUUpOwogCX0KIH0KQEAgLTY2OSw5ICs2MDIsOCBAQAogICogY2FsY3VsYXRlIGZyYW1lIGR1cmF0aW9uIG9mIGEgZ2l2ZW4gcmF0ZSBhbmQgbGVuZ3RoLCByZXR1cm4KICAqIHRpbWUgaW4gdXNlYyB1bml0CiAgKi8KLXVpbnQKLWJyY21zX2NfY2FsY19mcmFtZV90aW1lKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTMyIHJhdGVzcGVjLAotCQkJdTggcHJlYW1ibGVfdHlwZSwgdWludCBtYWNfbGVuKQorc3RhdGljIHVpbnQgYnJjbXNfY19jYWxjX2ZyYW1lX3RpbWUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCB1MzIgcmF0ZXNwZWMsCisJCQkJICAgIHU4IHByZWFtYmxlX3R5cGUsIHVpbnQgbWFjX2xlbikKIHsKIAl1aW50IG5zeW1zLCBkdXIgPSAwLCBOZHBzLCBrTmRwczsKIAl1aW50IHJhdGUgPSByc3BlYzJyYXRlKHJhdGVzcGVjKTsKQEAgLTc0MSwyNCArNjczLDIyIEBACiBzdGF0aWMgdm9pZCBicmNtc19jX3dyaXRlX2luaXRzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LAogCQkJCWNvbnN0IHN0cnVjdCBkMTFpbml0ICppbml0cykKIHsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CiAJaW50IGk7Ci0JdTggX19pb21lbSAqYmFzZTsKLQl1OCBfX2lvbWVtICphZGRyOworCXVpbnQgb2Zmc2V0OwogCXUxNiBzaXplOwogCXUzMiB2YWx1ZTsKIAogCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwogCi0JYmFzZSA9ICh1OCBfX2lvbWVtICopd2xjX2h3LT5yZWdzOwotCiAJZm9yIChpID0gMDsgaW5pdHNbaV0uYWRkciAhPSBjcHVfdG9fbGUxNigweGZmZmYpOyBpKyspIHsKIAkJc2l6ZSA9IGxlMTZfdG9fY3B1KGluaXRzW2ldLnNpemUpOwotCQlhZGRyID0gYmFzZSArIGxlMTZfdG9fY3B1KGluaXRzW2ldLmFkZHIpOworCQlvZmZzZXQgPSBsZTE2X3RvX2NwdShpbml0c1tpXS5hZGRyKTsKIAkJdmFsdWUgPSBsZTMyX3RvX2NwdShpbml0c1tpXS52YWx1ZSk7CiAJCWlmIChzaXplID09IDIpCi0JCQlXX1JFRygodTE2IF9faW9tZW0gKilhZGRyLCB2YWx1ZSk7CisJCQliY21hX3dyaXRlMTYoY29yZSwgb2Zmc2V0LCB2YWx1ZSk7CiAJCWVsc2UgaWYgKHNpemUgPT0gNCkKLQkJCVdfUkVHKCh1MzIgX19pb21lbSAqKWFkZHIsIHZhbHVlKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBvZmZzZXQsIHZhbHVlKTsKIAkJZWxzZQogCQkJYnJlYWs7CiAJfQpAQCAtODA4LDYgKzczOCwxNCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgYnJjbXNfYl9jb3JlX2lvY3RsKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1MzIgbSwgdTMyIHYpCit7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOworCXUzMiBpb2N0bCA9IGJjbWFfYXJlYWQzMihjb3JlLCBCQ01BX0lPQ1RMKSAmIH5tOworCisJYmNtYV9hd3JpdGUzMihjb3JlLCBCQ01BX0lPQ1RMLCBpb2N0bCB8IHYpOworfQorCiBzdGF0aWMgdm9pZCBicmNtc19iX2NvcmVfcGh5X2NsayhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBjbGspCiB7CiAJQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIndsJWQ6IGNsayAlZFxuIiwgd2xjX2h3LT51bml0LCBjbGspOwpAQCAtODE2LDE3ICs3NTQsMTcgQEAKIAogCWlmIChPRkYgPT0gY2xrKSB7CS8qIGNsZWFyIGdtb2RlIGJpdCwgcHV0IHBoeSBpbnRvIHJlc2V0ICovCiAKLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIChTSUNGX1BSU1QgfCBTSUNGX0ZHQyB8IFNJQ0ZfR01PREUpLAotCQkJICAgICAgIChTSUNGX1BSU1QgfCBTSUNGX0ZHQykpOworCQlicmNtc19iX2NvcmVfaW9jdGwod2xjX2h3LCAoU0lDRl9QUlNUIHwgU0lDRl9GR0MgfCBTSUNGX0dNT0RFKSwKKwkJCQkgICAoU0lDRl9QUlNUIHwgU0lDRl9GR0MpKTsKIAkJdWRlbGF5KDEpOwotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgKFNJQ0ZfUFJTVCB8IFNJQ0ZfRkdDKSwgU0lDRl9QUlNUKTsKKwkJYnJjbXNfYl9jb3JlX2lvY3RsKHdsY19odywgKFNJQ0ZfUFJTVCB8IFNJQ0ZfRkdDKSwgU0lDRl9QUlNUKTsKIAkJdWRlbGF5KDEpOwogCiAJfSBlbHNlIHsJCS8qIHRha2UgcGh5IG91dCBvZiByZXNldCAqLwogCi0JCWFpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCAoU0lDRl9QUlNUIHwgU0lDRl9GR0MpLCBTSUNGX0ZHQyk7CisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIChTSUNGX1BSU1QgfCBTSUNGX0ZHQyksIFNJQ0ZfRkdDKTsKIAkJdWRlbGF5KDEpOwotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgKFNJQ0ZfRkdDKSwgMCk7CisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIFNJQ0ZfRkdDLCAwKTsKIAkJdWRlbGF5KDEpOwogCiAJfQpAQCAtODQ3LDkgKzc4NSwxNCBAQAogCXdsY19ody0+d2xjLT5iYW5kID0gd2xjX2h3LT53bGMtPmJhbmRzdGF0ZVtiYW5kdW5pdF07CiAKIAkvKiBzZXQgZ21vZGUgY29yZSBmbGFnICovCi0JaWYgKHdsY19ody0+c2JjbGsgJiYgIXdsY19ody0+bm9yZXNldCkKLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfR01PREUsCi0JCQkgICAgICAgKChiYW5kdW5pdCA9PSAwKSA/IFNJQ0ZfR01PREUgOiAwKSk7CisJaWYgKHdsY19ody0+c2JjbGsgJiYgIXdsY19ody0+bm9yZXNldCkgeworCQl1MzIgZ21vZGUgPSAwOworCisJCWlmIChiYW5kdW5pdCA9PSAwKQorCQkJZ21vZGUgPSBTSUNGX0dNT0RFOworCisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIFNJQ0ZfR01PREUsIGdtb2RlKTsKKwl9CiB9CiAKIC8qIHN3aXRjaCB0byBuZXcgYmFuZCBidXQgbGVhdmUgaXQgaW5hY3RpdmUgKi8KQEAgLTg1NywxMCArODAwLDEyIEBACiB7CiAJc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwogCXUzMiBtYWNpbnRtYXNrOworCXUzMiBtYWNjdHJsOwogCiAJQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwotCi0JV0FSTl9PTigoUl9SRUcoJndsY19ody0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykgIT0gMCk7CisJbWFjY3RybCA9IGJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwKKwkJCSAgICAgIEQxMVJFR09GRlMobWFjY29udHJvbCkpOworCVdBUk5fT04oKG1hY2N0cmwgJiBNQ1RMX0VOX01BQykgIT0gMCk7CiAKIAkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KIAltYWNpbnRtYXNrID0gYnJjbXNfaW50cnNvZmYod2xjLT53bCk7CkBAIC05NjksNyArOTE0LDcgQEAKIAkJICAgIGxmYmwsCS8qIExvbmcgRnJhbWUgUmF0ZSBGYWxsYmFjayBMaW1pdCAqLwogCQkgICAgZmJsOwogCi0JCWlmIChxdWV1ZSA8IEFDX0NPVU5UKSB7CisJCWlmIChxdWV1ZSA8IElFRUU4MDIxMV9OVU1fQUNTKSB7CiAJCQlzZmJsID0gR0ZJRUxEKHdsYy0+d21lX3JldHJpZXNbd21lX2ZpZm8yYWNbcXVldWVdXSwKIAkJCQkgICAgICBFRENGX1NGQik7CiAJCQlsZmJsID0gR0ZJRUxEKHdsYy0+d21lX3JldHJpZXNbd21lX2ZpZm8yYWNbcXVldWVdXSwKQEAgLTEwMTgsMTQgKzk2MywxMiBAQAogCQkJdHhfaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOwogCX0KIAotCXRvdGxlbiA9IGJyY211X3BrdHRvdGxlbihwKTsKKwl0b3RsZW4gPSBwLT5sZW47CiAJZnJlZV9wZHUgPSB0cnVlOwogCiAJYnJjbXNfY190eGZpZm9fY29tcGxldGUod2xjLCBxdWV1ZSwgMSk7CiAKIAlpZiAobGFzdGZyYW1lKSB7Ci0JCXAtPm5leHQgPSBOVUxMOwotCQlwLT5wcmV2ID0gTlVMTDsKIAkJLyogcmVtb3ZlIFBMQ1AgJiBCcm9hZGNvbSB0eCBkZXNjcmlwdG9yIGhlYWRlciAqLwogCQlza2JfcHVsbChwLCBEMTFfUEhZX0hEUl9MRU4pOwogCQlza2JfcHVsbChwLCBEMTFfVFhIX0xFTik7CkBAIC0xMDUzLDcgKzk5Niw3IEBACiB7CiAJYm9vbCBtb3JlcGVuZGluZyA9IGZhbHNlOwogCXN0cnVjdCBicmNtc19jX2luZm8gKndsYyA9IHdsY19ody0+d2xjOwotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlOwogCXN0cnVjdCB0eF9zdGF0dXMgdHhzdGF0dXMsICp0eHM7CiAJdTMyIHMxLCBzMjsKIAl1aW50IG4gPSAwOwpAQCAtMTA2NiwxOCArMTAwOSwxOCBAQAogCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKIAogCXR4cyA9ICZ0eHN0YXR1czsKLQlyZWdzID0gd2xjX2h3LT5yZWdzOworCWNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CiAJKmZhdGFsID0gZmFsc2U7CisJczEgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKGZybXR4c3RhdHVzKSk7CiAJd2hpbGUgKCEoKmZhdGFsKQotCSAgICAgICAmJiAoczEgPSBSX1JFRygmcmVncy0+ZnJtdHhzdGF0dXMpKSAmIFRYU19WKSB7CisJICAgICAgICYmIChzMSAmIFRYU19WKSkgewogCiAJCWlmIChzMSA9PSAweGZmZmZmZmZmKSB7CiAJCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsCiAJCQkJd2xjX2h3LT51bml0LCBfX2Z1bmNfXyk7CiAJCQlyZXR1cm4gbW9yZXBlbmRpbmc7CiAJCX0KLQotCQlzMiA9IFJfUkVHKCZyZWdzLT5mcm10eHN0YXR1czIpOworCQlzMiA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMoZnJtdHhzdGF0dXMyKSk7CiAKIAkJdHhzLT5zdGF0dXMgPSBzMSAmIFRYU19TVEFUVVNfTUFTSzsKIAkJdHhzLT5mcmFtZWlkID0gKHMxICYgVFhTX0ZJRF9NQVNLKSA+PiBUWFNfRklEX1NISUZUOwpAQCAtMTA5MCw2ICsxMDMzLDcgQEAKIAkJLyogIWdpdmUgb3RoZXJzIHNvbWUgdGltZSB0byBydW4hICovCiAJCWlmICgrK24gPj0gbWF4X3R4X251bSkKIAkJCWJyZWFrOworCQlzMSA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMoZnJtdHhzdGF0dXMpKTsKIAl9CiAKIAlpZiAoKmZhdGFsKQpAQCAtMTEzNCwxMiArMTA3OCwxMiBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBkbWE2NHJlZ3MgX19pb21lbSAqCi1kbWFyZWcoc3RydWN0IGJyY21zX2hhcmR3YXJlICpodywgdWludCBkaXJlY3Rpb24sIHVpbnQgZmlmb251bSkKK3N0YXRpYyB1aW50CitkbWFyZWcodWludCBkaXJlY3Rpb24sIHVpbnQgZmlmb251bSkKIHsKIAlpZiAoZGlyZWN0aW9uID09IERNQV9UWCkKLQkJcmV0dXJuICYoaHctPnJlZ3MtPmZpZm82NHJlZ3NbZmlmb251bV0uZG1heG10KTsKLQlyZXR1cm4gJihody0+cmVncy0+ZmlmbzY0cmVnc1tmaWZvbnVtXS5kbWFyY3YpOworCQlyZXR1cm4gb2Zmc2V0b2Yoc3RydWN0IGQxMXJlZ3MsIGZpZm82NHJlZ3NbZmlmb251bV0uZG1heG10KTsKKwlyZXR1cm4gb2Zmc2V0b2Yoc3RydWN0IGQxMXJlZ3MsIGZpZm82NHJlZ3NbZmlmb251bV0uZG1hcmN2KTsKIH0KIAogc3RhdGljIGJvb2wgYnJjbXNfYl9hdHRhY2hfZG1hcGlvKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdWludCBqLCBib29sIHdtZSkKQEAgLTExNjUsOSArMTEwOSw5IEBACiAJCSAqIFRYOiBUWF9BQ19CS19GSUZPIChUWCBBQyBCYWNrZ3JvdW5kIGRhdGEgcGFja2V0cykKIAkJICogUlg6IFJYX0ZJRk8gKFJYIGRhdGEgcGFja2V0cykKIAkJICovCi0JCXdsY19ody0+ZGlbMF0gPSBkbWFfYXR0YWNoKG5hbWUsIHdsY19ody0+c2loLAotCQkJCQkgICAod21lID8gZG1hcmVnKHdsY19odywgRE1BX1RYLCAwKSA6Ci0JCQkJCSAgICBOVUxMKSwgZG1hcmVnKHdsY19odywgRE1BX1JYLCAwKSwKKwkJd2xjX2h3LT5kaVswXSA9IGRtYV9hdHRhY2gobmFtZSwgd2xjX2h3LT5zaWgsIHdsY19ody0+ZDExY29yZSwKKwkJCQkJICAgKHdtZSA/IGRtYXJlZyhETUFfVFgsIDApIDogMCksCisJCQkJCSAgIGRtYXJlZyhETUFfUlgsIDApLAogCQkJCQkgICAod21lID8gTlRYRCA6IDApLCBOUlhELAogCQkJCQkgICBSWEJVRlNaLCAtMSwgTlJYQlVGUE9TVCwKIAkJCQkJICAgQlJDTVNfSFdSWE9GRiwgJmJyY21fbXNnX2xldmVsKTsKQEAgLTExNzksOCArMTEyMyw4IEBACiAJCSAqICAgKGxlZ2FjeSkgVFhfREFUQV9GSUZPIChUWCBkYXRhIHBhY2tldHMpCiAJCSAqIFJYOiBVTlVTRUQKIAkJICovCi0JCXdsY19ody0+ZGlbMV0gPSBkbWFfYXR0YWNoKG5hbWUsIHdsY19ody0+c2loLAotCQkJCQkgICBkbWFyZWcod2xjX2h3LCBETUFfVFgsIDEpLCBOVUxMLAorCQl3bGNfaHctPmRpWzFdID0gZG1hX2F0dGFjaChuYW1lLCB3bGNfaHctPnNpaCwgd2xjX2h3LT5kMTFjb3JlLAorCQkJCQkgICBkbWFyZWcoRE1BX1RYLCAxKSwgMCwKIAkJCQkJICAgTlRYRCwgMCwgMCwgLTEsIDAsIDAsCiAJCQkJCSAgICZicmNtX21zZ19sZXZlbCk7CiAJCWRtYV9hdHRhY2hfZXJyIHw9IChOVUxMID09IHdsY19ody0+ZGlbMV0pOwpAQCAtMTE5MCw4ICsxMTM0LDggQEAKIAkJICogVFg6IFRYX0FDX1ZJX0ZJRk8gKFRYIEFDIFZpZGVvIGRhdGEgcGFja2V0cykKIAkJICogUlg6IFVOVVNFRAogCQkgKi8KLQkJd2xjX2h3LT5kaVsyXSA9IGRtYV9hdHRhY2gobmFtZSwgd2xjX2h3LT5zaWgsCi0JCQkJCSAgIGRtYXJlZyh3bGNfaHcsIERNQV9UWCwgMiksIE5VTEwsCisJCXdsY19ody0+ZGlbMl0gPSBkbWFfYXR0YWNoKG5hbWUsIHdsY19ody0+c2loLCB3bGNfaHctPmQxMWNvcmUsCisJCQkJCSAgIGRtYXJlZyhETUFfVFgsIDIpLCAwLAogCQkJCQkgICBOVFhELCAwLCAwLCAtMSwgMCwgMCwKIAkJCQkJICAgJmJyY21fbXNnX2xldmVsKTsKIAkJZG1hX2F0dGFjaF9lcnIgfD0gKE5VTEwgPT0gd2xjX2h3LT5kaVsyXSk7CkBAIC0xMjAwLDkgKzExNDQsOSBAQAogCQkgKiBUWDogVFhfQUNfVk9fRklGTyAoVFggQUMgVm9pY2UgZGF0YSBwYWNrZXRzKQogCQkgKiAgIChsZWdhY3kpIFRYX0NUTF9GSUZPIChUWCBjb250cm9sICYgbWdtdCBwYWNrZXRzKQogCQkgKi8KLQkJd2xjX2h3LT5kaVszXSA9IGRtYV9hdHRhY2gobmFtZSwgd2xjX2h3LT5zaWgsCi0JCQkJCSAgIGRtYXJlZyh3bGNfaHcsIERNQV9UWCwgMyksCi0JCQkJCSAgIE5VTEwsIE5UWEQsIDAsIDAsIC0xLAorCQl3bGNfaHctPmRpWzNdID0gZG1hX2F0dGFjaChuYW1lLCB3bGNfaHctPnNpaCwgd2xjX2h3LT5kMTFjb3JlLAorCQkJCQkgICBkbWFyZWcoRE1BX1RYLCAzKSwKKwkJCQkJICAgMCwgTlRYRCwgMCwgMCwgLTEsCiAJCQkJCSAgIDAsIDAsICZicmNtX21zZ19sZXZlbCk7CiAJCWRtYV9hdHRhY2hfZXJyIHw9IChOVUxMID09IHdsY19ody0+ZGlbM10pOwogLyogQ2xlYW5lciB0byBsZWF2ZSB0aGlzIGFzIGlmIHdpdGggQVAgZGVmaW5lZCAqLwpAQCAtMTI3Niw3ICsxMjIwLDcgQEAKIC8qIGNvbnRyb2wgY2hpcCBjbG9jayB0byBzYXZlIHBvd2VyLCBlbmFibGUgZHluYW1pYyBjbG9jayBvciBmb3JjZSBmYXN0IGNsb2NrICovCiBzdGF0aWMgdm9pZCBicmNtc19iX2Nsa2N0bF9jbGsoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgbW9kZSkKIHsKLQlpZiAod2xjX2h3LT5zaWgtPmNjY2FwcyAmIENDX0NBUF9QTVUpIHsKKwlpZiAoYWlfZ2V0X2NjY2Fwcyh3bGNfaHctPnNpaCkgJiBDQ19DQVBfUE1VKSB7CiAJCS8qIG5ldyBjaGlwcyB3aXRoIFBNVSwgQ0NTX0ZPUkNFSFQgd2lsbCBkaXN0cmlidXRlIHRoZSBIVCBjbG9jawogCQkgKiBvbiBiYWNrcGxhbmUsIGJ1dCBtYWMgY29yZSB3aWxsIHN0aWxsIHJ1biBvbiBBTFAobm90IEhUKSB3aGVuCiAJCSAqIGl0IGVudGVycyBwb3dlcnNhdmUgbW9kZSwgd2hpY2ggbWVhbnMgdGhlIEZDQSBiaXQgbWF5IG5vdCBiZQpAQCAtMTI4NSwyOSArMTIyOSwzMyBAQAogCiAJCWlmICh3bGNfaHctPmNsaykgewogCQkJaWYgKG1vZGUgPT0gQ0xLX0ZBU1QpIHsKLQkJCQlPUl9SRUcoJndsY19ody0+cmVncy0+Y2xrX2N0bF9zdCwKLQkJCQkgICAgICAgQ0NTX0ZPUkNFSFQpOworCQkJCWJjbWFfc2V0MzIod2xjX2h3LT5kMTFjb3JlLAorCQkJCQkgICBEMTFSRUdPRkZTKGNsa19jdGxfc3QpLAorCQkJCQkgICBDQ1NfRk9SQ0VIVCk7CiAKIAkJCQl1ZGVsYXkoNjQpOwogCi0JCQkJU1BJTldBSVQoKChSX1JFRwotCQkJCQkgICAoJndsY19ody0+cmVncy0+Ci0JCQkJCSAgICBjbGtfY3RsX3N0KSAmIENDU19IVEFWQUlMKSA9PSAwKSwKLQkJCQkJIFBNVV9NQVhfVFJBTlNJVElPTl9ETFkpOwotCQkJCVdBUk5fT04oIShSX1JFRwotCQkJCQkgICgmd2xjX2h3LT5yZWdzLT4KLQkJCQkJICAgY2xrX2N0bF9zdCkgJiBDQ1NfSFRBVkFJTCkpOworCQkJCVNQSU5XQUlUKAorCQkJCSAgICAoKGJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwKKwkJCQkgICAgICBEMTFSRUdPRkZTKGNsa19jdGxfc3QpKSAmCisJCQkJICAgICAgQ0NTX0hUQVZBSUwpID09IDApLAorCQkJCSAgICAgIFBNVV9NQVhfVFJBTlNJVElPTl9ETFkpOworCQkJCVdBUk5fT04oIShiY21hX3JlYWQzMih3bGNfaHctPmQxMWNvcmUsCisJCQkJCUQxMVJFR09GRlMoY2xrX2N0bF9zdCkpICYKKwkJCQkJQ0NTX0hUQVZBSUwpKTsKIAkJCX0gZWxzZSB7Ci0JCQkJaWYgKCh3bGNfaHctPnNpaC0+cG11cmV2ID09IDApICYmCi0JCQkJICAgIChSX1JFRwotCQkJCSAgICAgKCZ3bGNfaHctPnJlZ3MtPgotCQkJCSAgICAgIGNsa19jdGxfc3QpICYgKENDU19GT1JDRUhUIHwgQ0NTX0hUQVJFUSkpKQotCQkJCQlTUElOV0FJVCgoKFJfUkVHCi0JCQkJCQkgICAoJndsY19ody0+cmVncy0+Ci0JCQkJCQkgICAgY2xrX2N0bF9zdCkgJiBDQ1NfSFRBVkFJTCkKLQkJCQkJCSAgPT0gMCksCi0JCQkJCQkgUE1VX01BWF9UUkFOU0lUSU9OX0RMWSk7Ci0JCQkJQU5EX1JFRygmd2xjX2h3LT5yZWdzLT5jbGtfY3RsX3N0LAorCQkJCWlmICgoYWlfZ2V0X3BtdXJldih3bGNfaHctPnNpaCkgPT0gMCkgJiYKKwkJCQkgICAgKGJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwKKwkJCQkJRDExUkVHT0ZGUyhjbGtfY3RsX3N0KSkgJgorCQkJCQkoQ0NTX0ZPUkNFSFQgfCBDQ1NfSFRBUkVRKSkpCisJCQkJCVNQSU5XQUlUKAorCQkJCQkgICAgKChiY21hX3JlYWQzMih3bGNfaHctPmQxMWNvcmUsCisJCQkJCSAgICAgIG9mZnNldG9mKHN0cnVjdCBkMTFyZWdzLAorCQkJCQkJICAgICAgIGNsa19jdGxfc3QpKSAmCisJCQkJCSAgICAgIENDU19IVEFWQUlMKSA9PSAwKSwKKwkJCQkJICAgICAgUE1VX01BWF9UUkFOU0lUSU9OX0RMWSk7CisJCQkJYmNtYV9tYXNrMzIod2xjX2h3LT5kMTFjb3JlLAorCQkJCQlEMTFSRUdPRkZTKGNsa19jdGxfc3QpLAogCQkJCQl+Q0NTX0ZPUkNFSFQpOwogCQkJfQogCQl9CkBAIC0xMzIyLDcgKzEyNzAsNyBAQAogCiAJCS8qIGNoZWNrIGZhc3QgY2xvY2sgaXMgYXZhaWxhYmxlIChpZiBjb3JlIGlzIG5vdCBpbiByZXNldCkgKi8KIAkJaWYgKHdsY19ody0+Zm9yY2VmYXN0Y2xrICYmIHdsY19ody0+Y2xrKQotCQkJV0FSTl9PTighKGFpX2NvcmVfc2ZsYWdzKHdsY19ody0+c2loLCAwLCAwKSAmCisJCQlXQVJOX09OKCEoYmNtYV9hcmVhZDMyKHdsY19ody0+ZDExY29yZSwgQkNNQV9JT1NUKSAmCiAJCQkJICBTSVNGX0ZDTEtBKSk7CiAKIAkJLyoKQEAgLTE0MzksNyArMTM4Nyw4IEBACiAJCW1hY2NvbnRyb2wgfD0gTUNUTF9JTkZSQTsKIAl9CiAKLQlXX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNjb250cm9sLCBtYWNjb250cm9sKTsKKwliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpLAorCQkgICAgIG1hY2NvbnRyb2wpOwogfQogCiAvKiBzZXQgb3IgY2xlYXIgbWFjY29udHJvbCBiaXRzICovCkBAIC0xNTMzLDcgKzE0ODIsNyBAQAogYnJjbXNfYl9zZXRfYWRkcm1hdGNoKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBpbnQgbWF0Y2hfcmVnX29mZnNldCwKIAkJICAgICAgIGNvbnN0IHU4ICphZGRyKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCXUxNiBtYWNfbDsKIAl1MTYgbWFjX207CiAJdTE2IG1hY19oOwpAQCAtMTU0MSwzOCArMTQ5MCwzNiBAQAogCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkOiBicmNtc19iX3NldF9hZGRybWF0Y2hcbiIsCiAJCSB3bGNfaHctPnVuaXQpOwogCi0JcmVncyA9IHdsY19ody0+cmVnczsKIAltYWNfbCA9IGFkZHJbMF0gfCAoYWRkclsxXSA8PCA4KTsKIAltYWNfbSA9IGFkZHJbMl0gfCAoYWRkclszXSA8PCA4KTsKIAltYWNfaCA9IGFkZHJbNF0gfCAoYWRkcls1XSA8PCA4KTsKIAogCS8qIGVudGVyIHRoZSBNQUMgYWRkciBpbnRvIHRoZSBSWEUgbWF0Y2ggcmVnaXN0ZXJzICovCi0JV19SRUcoJnJlZ3MtPnJjbV9jdGwsIFJDTV9JTkNfREFUQSB8IG1hdGNoX3JlZ19vZmZzZXQpOwotCVdfUkVHKCZyZWdzLT5yY21fbWF0X2RhdGEsIG1hY19sKTsKLQlXX1JFRygmcmVncy0+cmNtX21hdF9kYXRhLCBtYWNfbSk7Ci0JV19SRUcoJnJlZ3MtPnJjbV9tYXRfZGF0YSwgbWFjX2gpOwotCisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMocmNtX2N0bCksCisJCSAgICAgUkNNX0lOQ19EQVRBIHwgbWF0Y2hfcmVnX29mZnNldCk7CisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMocmNtX21hdF9kYXRhKSwgbWFjX2wpOworCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHJjbV9tYXRfZGF0YSksIG1hY19tKTsKKwliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyhyY21fbWF0X2RhdGEpLCBtYWNfaCk7CiB9CiAKIHZvaWQKIGJyY21zX2Jfd3JpdGVfdGVtcGxhdGVfcmFtKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBpbnQgb2Zmc2V0LCBpbnQgbGVuLAogCQkJICAgIHZvaWQgKmJ1ZikKIHsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAl1MzIgd29yZDsKIAlfX2xlMzIgd29yZF9sZTsKIAlfX2JlMzIgd29yZF9iZTsKIAlib29sIGJlX2JpdDsKIAlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKIAotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0JV19SRUcoJnJlZ3MtPnRwbGF0ZXdycHRyLCBvZmZzZXQpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKHRwbGF0ZXdycHRyKSwgb2Zmc2V0KTsKIAogCS8qIGlmIE1DVExfQklHRU5EIGJpdCBzZXQgaW4gbWFjIGNvbnRyb2wgcmVnaXN0ZXIsCiAJICogdGhlIGNoaXAgc3dhcHMgZGF0YSBpbiBmaWZvLCBhcyB3ZWxsIGFzIGRhdGEgaW4KIAkgKiB0ZW1wbGF0ZSByYW0KIAkgKi8KLQliZV9iaXQgPSAoUl9SRUcoJnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9CSUdFTkQpICE9IDA7CisJYmVfYml0ID0gKGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYgTUNUTF9CSUdFTkQpICE9IDA7CiAKIAl3aGlsZSAobGVuID4gMCkgewogCQltZW1jcHkoJndvcmQsIGJ1Ziwgc2l6ZW9mKHUzMikpOwpAQCAtMTU4NSw3ICsxNTMyLDcgQEAKIAkJCXdvcmQgPSAqKHUzMiAqKSZ3b3JkX2xlOwogCQl9CiAKLQkJV19SRUcoJnJlZ3MtPnRwbGF0ZXdyZGF0YSwgd29yZCk7CisJCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKHRwbGF0ZXdyZGF0YSksIHdvcmQpOwogCiAJCWJ1ZiA9ICh1OCAqKSBidWYgKyBzaXplb2YodTMyKTsKIAkJbGVuIC09IHNpemVvZih1MzIpOwpAQCAtMTU5NiwxOCArMTU0MywyMCBAQAogewogCXdsY19ody0+YmFuZC0+Q1dtaW4gPSBuZXdtaW47CiAKLQlXX1JFRygmd2xjX2h3LT5yZWdzLT5vYmphZGRyLCBPQkpBRERSX1NDUl9TRUwgfCBTX0RPVDExX0NXTUlOKTsKLQkodm9pZClSX1JFRygmd2xjX2h3LT5yZWdzLT5vYmphZGRyKTsKLQlXX1JFRygmd2xjX2h3LT5yZWdzLT5vYmpkYXRhLCBuZXdtaW4pOworCWJjbWFfd3JpdGUzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksCisJCSAgICAgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9DV01JTik7CisJKHZvaWQpYmNtYV9yZWFkMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpKTsKKwliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG9iamRhdGEpLCBuZXdtaW4pOwogfQogCiBzdGF0aWMgdm9pZCBicmNtc19iX3NldF9jd21heChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IG5ld21heCkKIHsKIAl3bGNfaHctPmJhbmQtPkNXbWF4ID0gbmV3bWF4OwogCi0JV19SRUcoJndsY19ody0+cmVncy0+b2JqYWRkciwgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9DV01BWCk7Ci0JKHZvaWQpUl9SRUcoJndsY19ody0+cmVncy0+b2JqYWRkcik7Ci0JV19SRUcoJndsY19ody0+cmVncy0+b2JqZGF0YSwgbmV3bWF4KTsKKwliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpLAorCQkgICAgIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfQ1dNQVgpOworCSh2b2lkKWJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CisJYmNtYV93cml0ZTMyKHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSwgbmV3bWF4KTsKIH0KIAogdm9pZCBicmNtc19iX2J3X3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IGJ3KQpAQCAtMTc3MywxNyArMTcyMiwxNyBAQAogewogCUJDTU1TRyh3bGNfaHctPndsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwogCi0JYWlfY29yZXJlZyh3bGNfaHctPnNpaCwgU0lfQ0NfSURYLAotCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9hZGRyKSwgfjAsIDApOworCWFpX2NjX3JlZyh3bGNfaHctPnNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfYWRkciksCisJCSAgfjAsIDApOwogCXVkZWxheSgxKTsKLQlhaV9jb3JlcmVnKHdsY19ody0+c2loLCBTSV9DQ19JRFgsCi0JCSAgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2RhdGEpLCAweDQsIDApOworCWFpX2NjX3JlZyh3bGNfaHctPnNpaCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfZGF0YSksCisJCSAgMHg0LCAwKTsKIAl1ZGVsYXkoMSk7Ci0JYWlfY29yZXJlZyh3bGNfaHctPnNpaCwgU0lfQ0NfSURYLAotCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9kYXRhKSwgMHg0LCA0KTsKKwlhaV9jY19yZWcod2xjX2h3LT5zaWgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2RhdGEpLAorCQkgIDB4NCwgNCk7CiAJdWRlbGF5KDEpOwotCWFpX2NvcmVyZWcod2xjX2h3LT5zaWgsIFNJX0NDX0lEWCwKLQkJICAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfZGF0YSksIDB4NCwgMCk7CisJYWlfY2NfcmVnKHdsY19ody0+c2loLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9kYXRhKSwKKwkJICAweDQsIDApOwogCXVkZWxheSgxKTsKIH0KIApAQCAtMTc5NywxOCArMTc0NiwxOCBAQAogCQlyZXR1cm47CiAKIAlpZiAoT04gPT0gY2xrKQotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgU0lDRl9GR0MsIFNJQ0ZfRkdDKTsKKwkJYnJjbXNfYl9jb3JlX2lvY3RsKHdsY19odywgU0lDRl9GR0MsIFNJQ0ZfRkdDKTsKIAllbHNlCi0JCWFpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCBTSUNGX0ZHQywgMCk7CisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIFNJQ0ZfRkdDLCAwKTsKIAogfQogCiB2b2lkIGJyY21zX2JfbWFjcGh5Y2xrX3NldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBjbGspCiB7CiAJaWYgKE9OID09IGNsaykKLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfTVBDTEtFLCBTSUNGX01QQ0xLRSk7CisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIFNJQ0ZfTVBDTEtFLCBTSUNGX01QQ0xLRSk7CiAJZWxzZQotCQlhaV9jb3JlX2NmbGFncyh3bGNfaHctPnNpaCwgU0lDRl9NUENMS0UsIDApOworCQlicmNtc19iX2NvcmVfaW9jdGwod2xjX2h3LCBTSUNGX01QQ0xLRSwgMCk7CiB9CiAKIHZvaWQgYnJjbXNfYl9waHlfcmVzZXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCkBAIC0xODI4LDcgKzE3NzcsNyBAQAogCWlmIChCUkNNU19JU05QSFkod2xjX2h3LT5iYW5kKSAmJiBOUkVWX0dFKHdsY19ody0+YmFuZC0+cGh5cmV2LCAzKSAmJgogCSAgICBOUkVWX0xFKHdsY19ody0+YmFuZC0+cGh5cmV2LCA0KSkgewogCQkvKiBTZXQgdGhlIFBIWSBiYW5kd2lkdGggKi8KLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsIFNJQ0ZfQldNQVNLLCBwaHlfYndfY2xrYml0cyk7CisJCWJyY21zX2JfY29yZV9pb2N0bCh3bGNfaHcsIFNJQ0ZfQldNQVNLLCBwaHlfYndfY2xrYml0cyk7CiAKIAkJdWRlbGF5KDEpOwogCkBAIC0xODM2LDEzICsxNzg1LDEzIEBACiAJCWJyY21zX2JfY29yZV9waHlwbGxfcmVzZXQod2xjX2h3KTsKIAogCQkvKiByZXNldCB0aGUgUEhZICovCi0JCWFpX2NvcmVfY2ZsYWdzKHdsY19ody0+c2loLCAoU0lDRl9QUlNUIHwgU0lDRl9QQ0xLRSksCi0JCQkgICAgICAgKFNJQ0ZfUFJTVCB8IFNJQ0ZfUENMS0UpKTsKKwkJYnJjbXNfYl9jb3JlX2lvY3RsKHdsY19odywgKFNJQ0ZfUFJTVCB8IFNJQ0ZfUENMS0UpLAorCQkJCSAgIChTSUNGX1BSU1QgfCBTSUNGX1BDTEtFKSk7CiAJCXBoeV9pbl9yZXNldCA9IHRydWU7CiAJfSBlbHNlIHsKLQkJYWlfY29yZV9jZmxhZ3Mod2xjX2h3LT5zaWgsCi0JCQkgICAgICAgKFNJQ0ZfUFJTVCB8IFNJQ0ZfUENMS0UgfCBTSUNGX0JXTUFTSyksCi0JCQkgICAgICAgKFNJQ0ZfUFJTVCB8IFNJQ0ZfUENMS0UgfCBwaHlfYndfY2xrYml0cykpOworCQlicmNtc19iX2NvcmVfaW9jdGwod2xjX2h3LAorCQkJCSAgIChTSUNGX1BSU1QgfCBTSUNGX1BDTEtFIHwgU0lDRl9CV01BU0spLAorCQkJCSAgIChTSUNGX1BSU1QgfCBTSUNGX1BDTEtFIHwgcGh5X2J3X2Nsa2JpdHMpKTsKIAl9CiAKIAl1ZGVsYXkoMik7CkBAIC0xODU5LDggKzE4MDgsOCBAQAogCXUzMiBtYWNpbnRtYXNrOwogCiAJLyogRW5hYmxlIHRoZSBkMTEgY29yZSBiZWZvcmUgYWNjZXNzaW5nIGl0ICovCi0JaWYgKCFhaV9pc2NvcmV1cCh3bGNfaHctPnNpaCkpIHsKLQkJYWlfY29yZV9yZXNldCh3bGNfaHctPnNpaCwgMCwgMCk7CisJaWYgKCFiY21hX2NvcmVfaXNfZW5hYmxlZCh3bGNfaHctPmQxMWNvcmUpKSB7CisJCWJjbWFfY29yZV9lbmFibGUod2xjX2h3LT5kMTFjb3JlLCAwKTsKIAkJYnJjbXNfY19tY3RybF9yZXNldCh3bGNfaHcpOwogCX0KIApAQCAtMTg4Niw3ICsxODM1LDggQEAKIAlicmNtc19pbnRyc3Jlc3RvcmUod2xjLT53bCwgbWFjaW50bWFzayk7CiAKIAkvKiB1Y29kZSBzaG91bGQgc3RpbGwgYmUgc3VzcGVuZGVkLi4gKi8KLQlXQVJOX09OKChSX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSAhPSAwKTsKKwlXQVJOX09OKChiY21hX3JlYWQzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYKKwkJIE1DVExfRU5fTUFDKSAhPSAwKTsKIH0KIAogc3RhdGljIGJvb2wgYnJjbXNfY19pc2dvb2RjaGlwKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQpAQCAtMTkxNCw3ICsxODY0LDcgQEAKIAl1aW50IGIyID0gYm9hcmRyZXYgJiAweGY7CiAKIAkvKiB2b2FyZHMgZnJvbSBvdGhlciB2ZW5kb3JzIGFyZSBhbHdheXMgY29uc2lkZXJlZCB2YWxpZCAqLwotCWlmICh3bGNfaHctPnNpaC0+Ym9hcmR2ZW5kb3IgIT0gUENJX1ZFTkRPUl9JRF9CUk9BRENPTSkKKwlpZiAoYWlfZ2V0X2JvYXJkdmVuZG9yKHdsY19ody0+c2loKSAhPSBQQ0lfVkVORE9SX0lEX0JST0FEQ09NKQogCQlyZXR1cm4gdHJ1ZTsKIAogCS8qIGRvIHNvbWUgYm9hcmRyZXYgc2FuaXR5IGNoZWNrcyB3aGVuIGJvYXJkdmVuZG9yIGlzIEJyb2FkY29tICovCkBAIC0xOTg2LDcgKzE5MzYsNyBAQAogc3RhdGljIGJvb2wgYnJjbXNfYl9yYWRpb19yZWFkX2h3ZGlzYWJsZWQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcpCiB7CiAJYm9vbCB2LCBjbGssIHh0YWw7Ci0JdTMyIHJlc2V0Yml0cyA9IDAsIGZsYWdzID0gMDsKKwl1MzIgZmxhZ3MgPSAwOwogCiAJeHRhbCA9IHdsY19ody0+c2JjbGs7CiAJaWYgKCF4dGFsKQpAQCAtMjAwMywyMiArMTk1MywyMiBAQAogCQlmbGFncyB8PSBTSUNGX1BDTEtFOwogCiAJCS8qCisJCSAqIFRPRE86IHRlc3Qgc3VzcGVuZC9yZXN1bWUKKwkJICoKIAkJICogQUkgY2hpcCBkb2Vzbid0IHJlc3RvcmUgYmFyMHdpbjIgb24KIAkJICogaGliZXJuYXRpb24vcmVzdW1lLCBuZWVkIHN3IGZpeHVwCiAJCSAqLwotCQlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JCSAgICAod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpCi0JCQl3bGNfaHctPnJlZ3MgPSAoc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqKQotCQkJCQlhaV9zZXRjb3JlKHdsY19ody0+c2loLCBEMTFfQ09SRV9JRCwgMCk7Ci0JCWFpX2NvcmVfcmVzZXQod2xjX2h3LT5zaWgsIGZsYWdzLCByZXNldGJpdHMpOworCisJCWJjbWFfY29yZV9lbmFibGUod2xjX2h3LT5kMTFjb3JlLCBmbGFncyk7CiAJCWJyY21zX2NfbWN0cmxfcmVzZXQod2xjX2h3KTsKIAl9CiAKLQl2ID0gKChSX1JFRygmd2xjX2h3LT5yZWdzLT5waHlkZWJ1ZykgJiBQREJHX1JGRCkgIT0gMCk7CisJdiA9ICgoYmNtYV9yZWFkMzIod2xjX2h3LT5kMTFjb3JlLAorCQkJICBEMTFSRUdPRkZTKHBoeWRlYnVnKSkgJiBQREJHX1JGRCkgIT0gMCk7CiAKIAkvKiBwdXQgY29yZSBiYWNrIGludG8gcmVzZXQgKi8KIAlpZiAoIWNsaykKLQkJYWlfY29yZV9kaXNhYmxlKHdsY19ody0+c2loLCAwKTsKKwkJYmNtYV9jb3JlX2Rpc2FibGUod2xjX2h3LT5kMTFjb3JlLCAwKTsKIAogCWlmICgheHRhbCkKIAkJYnJjbXNfYl94dGFsKHdsY19odywgT0ZGKTsKQEAgLTIwNDIsMjUgKzE5OTIsMjEgQEAKICAqLwogdm9pZCBicmNtc19iX2NvcmVyZXNldChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTMyIGZsYWdzKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7CiAJdWludCBpOwogCWJvb2wgZmFzdGNsazsKLQl1MzIgcmVzZXRiaXRzID0gMDsKIAogCWlmIChmbGFncyA9PSBCUkNNU19VU0VfQ09SRUZMQUdTKQogCQlmbGFncyA9ICh3bGNfaHctPmJhbmQtPnBpID8gd2xjX2h3LT5iYW5kLT5jb3JlX2ZsYWdzIDogMCk7CiAKIAlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKIAotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0KIAkvKiByZXF1ZXN0IEZBU1QgY2xvY2sgaWYgbm90IG9uICAqLwogCWZhc3RjbGsgPSB3bGNfaHctPmZvcmNlZmFzdGNsazsKIAlpZiAoIWZhc3RjbGspCiAJCWJyY21zX2JfY2xrY3RsX2Nsayh3bGNfaHcsIENMS19GQVNUKTsKIAogCS8qIHJlc2V0IHRoZSBkbWEgZW5naW5lcyBleGNlcHQgZmlyc3QgdGltZSB0aHJ1ICovCi0JaWYgKGFpX2lzY29yZXVwKHdsY19ody0+c2loKSkgeworCWlmIChiY21hX2NvcmVfaXNfZW5hYmxlZCh3bGNfaHctPmQxMWNvcmUpKSB7CiAJCWZvciAoaSA9IDA7IGkgPCBORklGTzsgaSsrKQogCQkJaWYgKCh3bGNfaHctPmRpW2ldKSAmJiAoIWRtYV90eHJlc2V0KHdsY19ody0+ZGlbaV0pKSkKIAkJCQl3aXBoeV9lcnIod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZDogJXM6ICIKQEAgLTIwOTgsMTQgKzIwNDQsMTQgQEAKIAkgKiB0aGV5IG1heSB0b3VjaCBjaGlwY29tbW9uIGFzIHdlbGwuCiAJICovCiAJd2xjX2h3LT5jbGsgPSBmYWxzZTsKLQlhaV9jb3JlX3Jlc2V0KHdsY19ody0+c2loLCBmbGFncywgcmVzZXRiaXRzKTsKKwliY21hX2NvcmVfZW5hYmxlKHdsY19ody0+ZDExY29yZSwgZmxhZ3MpOwogCXdsY19ody0+Y2xrID0gdHJ1ZTsKIAlpZiAod2xjX2h3LT5iYW5kICYmIHdsY19ody0+YmFuZC0+cGkpCiAJCXdsY19waHlfaHdfY2xrX3N0YXRlX3VwZCh3bGNfaHctPmJhbmQtPnBpLCB0cnVlKTsKIAogCWJyY21zX2NfbWN0cmxfcmVzZXQod2xjX2h3KTsKIAotCWlmICh3bGNfaHctPnNpaC0+Y2NjYXBzICYgQ0NfQ0FQX1BNVSkKKwlpZiAoYWlfZ2V0X2NjY2Fwcyh3bGNfaHctPnNpaCkgJiBDQ19DQVBfUE1VKQogCQlicmNtc19iX2Nsa2N0bF9jbGsod2xjX2h3LCBDTEtfRkFTVCk7CiAKIAlicmNtc19iX3BoeV9yZXNldCh3bGNfaHcpOwpAQCAtMjEyNiw3ICsyMDcyLDcgQEAKICAqLwogc3RhdGljIHZvaWQgYnJjbXNfYl9jb3JlcmV2X2ZpZm9maXh1cChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKIHsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gd2xjX2h3LT5yZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAl1MTYgZmlmb19udTsKIAl1MTYgdHhmaWZvX3N0YXJ0YmxrID0gVFhGSUZPX1NUQVJUX0JMSywgdHhmaWZvX2VuZGJsazsKIAl1MTYgdHhmaWZvX2RlZiwgdHhmaWZvX2RlZjE7CkBAIC0yMTQ3LDExICsyMDkzLDExIEBACiAJCXR4Zmlmb19jbWQgPQogCQkgICAgVFhGSUZPQ01EX1JFU0VUX01BU0sgfCAoZmlmb19udSA8PCBUWEZJRk9DTURfRklGT1NFTF9TSElGVCk7CiAKLQkJV19SRUcoJnJlZ3MtPnhtdGZpZm9jbWQsIHR4Zmlmb19jbWQpOwotCQlXX1JFRygmcmVncy0+eG10Zmlmb2RlZiwgdHhmaWZvX2RlZik7Ci0JCVdfUkVHKCZyZWdzLT54bXRmaWZvZGVmMSwgdHhmaWZvX2RlZjEpOworCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh4bXRmaWZvY21kKSwgdHhmaWZvX2NtZCk7CisJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHhtdGZpZm9kZWYpLCB0eGZpZm9fZGVmKTsKKwkJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMoeG10Zmlmb2RlZjEpLCB0eGZpZm9fZGVmMSk7CiAKLQkJV19SRUcoJnJlZ3MtPnhtdGZpZm9jbWQsIHR4Zmlmb19jbWQpOworCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh4bXRmaWZvY21kKSwgdHhmaWZvX2NtZCk7CiAKIAkJdHhmaWZvX3N0YXJ0YmxrICs9IHdsY19ody0+eG10Zmlmb19zeltmaWZvX251XTsKIAl9CkBAIC0yMTg2LDI3ICsyMTMyLDI3IEBACiAKIHZvaWQgYnJjbXNfYl9zd2l0Y2hfbWFjZnJlcShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTggc3B1cm1vZGUpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVncyA9IHdsY19ody0+cmVnczsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CiAKLQlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkgeworCWlmICgoYWlfZ2V0X2NoaXBfaWQod2xjX2h3LT5zaWgpID09IEJDTTQzMjI0X0NISVBfSUQpIHx8CisJICAgIChhaV9nZXRfY2hpcF9pZCh3bGNfaHctPnNpaCkgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKIAkJaWYgKHNwdXJtb2RlID09IFdMX1NQVVJBVk9JRF9PTjIpIHsJLyogMTI2TWh6ICovCi0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2wsIDB4MjA4Mik7Ci0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2gsIDB4OCk7CisJCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0c2ZfY2xrX2ZyYWNfbCksIDB4MjA4Mik7CisJCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0c2ZfY2xrX2ZyYWNfaCksIDB4OCk7CiAJCX0gZWxzZSBpZiAoc3B1cm1vZGUgPT0gV0xfU1BVUkFWT0lEX09OMSkgewkvKiAxMjNNaHogKi8KLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfbCwgMHg1MzQxKTsKLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfaCwgMHg4KTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19sKSwgMHg1MzQxKTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19oKSwgMHg4KTsKIAkJfSBlbHNlIHsJLyogMTIwTWh6ICovCi0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2wsIDB4ODg4OSk7Ci0JCQlXX1JFRygmcmVncy0+dHNmX2Nsa19mcmFjX2gsIDB4OCk7CisJCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0c2ZfY2xrX2ZyYWNfbCksIDB4ODg4OSk7CisJCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0c2ZfY2xrX2ZyYWNfaCksIDB4OCk7CiAJCX0KIAl9IGVsc2UgaWYgKEJSQ01TX0lTTENOUEhZKHdsY19ody0+YmFuZCkpIHsKIAkJaWYgKHNwdXJtb2RlID09IFdMX1NQVVJBVk9JRF9PTjEpIHsJLyogODJNaHogKi8KLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfbCwgMHg3Q0UwKTsKLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfaCwgMHhDKTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19sKSwgMHg3Q0UwKTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19oKSwgMHhDKTsKIAkJfSBlbHNlIHsJLyogODBNaHogKi8KLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfbCwgMHhDQ0NEKTsKLQkJCVdfUkVHKCZyZWdzLT50c2ZfY2xrX2ZyYWNfaCwgMHhDKTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19sKSwgMHhDQ0NEKTsKKwkJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHRzZl9jbGtfZnJhY19oKSwgMHhDKTsKIAkJfQogCX0KIH0KQEAgLTIyMTUsMTEgKzIxNjEsOCBAQAogc3RhdGljIHZvaWQgYnJjbXNfY19ncGlvX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQogewogCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOwogCXUzMiBnYywgZ207CiAKLQlyZWdzID0gd2xjX2h3LT5yZWdzOwotCiAJLyogdXNlIEdQSU8gc2VsZWN0IDAgdG8gZ2V0IGFsbCBncGlvIHNpZ25hbHMgZnJvbSB0aGUgZ3BpbyBvdXQgcmVnICovCiAJYnJjbXNfYl9tY3RybCh3bGNfaHcsIE1DVExfR1BPVVRfU0VMX01BU0ssIDApOwogCkBAIC0yMjUwLDEwICsyMTkzLDEwIEBACiAJCSAqIFRoZSBib2FyZCBpdHNlbGYgaXMgcG93ZXJlZCBieSB0aGVzZSBHUElPcwogCQkgKiAod2hlbiBub3Qgc2VuZGluZyBwYXR0ZXJuKSBzbyBzZXQgdGhlbSBoaWdoCiAJCSAqLwotCQlPUl9SRUcoJnJlZ3MtPnBzbV9ncGlvX29lLAotCQkgICAgICAgKEJPQVJEX0dQSU9fMTIgfCBCT0FSRF9HUElPXzEzKSk7Ci0JCU9SX1JFRygmcmVncy0+cHNtX2dwaW9fb3V0LAotCQkgICAgICAgKEJPQVJEX0dQSU9fMTIgfCBCT0FSRF9HUElPXzEzKSk7CisJCWJjbWFfc2V0MTYod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9ncGlvX29lKSwKKwkJCSAgIChCT0FSRF9HUElPXzEyIHwgQk9BUkRfR1BJT18xMykpOworCQliY21hX3NldDE2KHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhwc21fZ3Bpb19vdXQpLAorCQkJICAgKEJPQVJEX0dQSU9fMTIgfCBCT0FSRF9HUElPXzEzKSk7CiAKIAkJLyogRW5hYmxlIGFudGVubmEgZGl2ZXJzaXR5LCB1c2UgMng0IG1vZGUgKi8KIAkJYnJjbXNfYl9taGYod2xjX2h3LCBNSEYzLCBNSEYzX0FOVFNFTF9FTiwKQEAgLTIyODAsNyArMjIyMyw3IEBACiBzdGF0aWMgdm9pZCBicmNtc191Y29kZV93cml0ZShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywKIAkJCSAgICAgIGNvbnN0IF9fbGUzMiB1Y29kZVtdLCBjb25zdCBzaXplX3QgbmJ5dGVzKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCXVpbnQgaTsKIAl1aW50IGNvdW50OwogCkBAIC0yMjg4LDEwICsyMjMxLDExIEBACiAKIAljb3VudCA9IChuYnl0ZXMgLyBzaXplb2YodTMyKSk7CiAKLQlXX1JFRygmcmVncy0+b2JqYWRkciwgKE9CSkFERFJfQVVUT19JTkMgfCBPQkpBRERSX1VDTV9TRUwpKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksCisJCSAgICAgT0JKQUREUl9BVVRPX0lOQyB8IE9CSkFERFJfVUNNX1NFTCk7CisJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCVdfUkVHKCZyZWdzLT5vYmpkYXRhLCBsZTMyX3RvX2NwdSh1Y29kZVtpXSkpOworCQliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSwgbGUzMl90b19jcHUodWNvZGVbaV0pKTsKIAogfQogCkBAIC0yMzUyLDE5ICsyMjk2LDEyIEBACiAJd2xjX3BoeV9hbnRzZWxfdHlwZV9zZXQod2xjX2h3LT5iYW5kLT5waSwgYW50c2VsX3R5cGUpOwogfQogCi1zdGF0aWMgdm9pZCBicmNtc19jX2ZhdGFsX2Vycm9yKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIndsJWQ6IGZhdGFsIGVycm9yLCByZWluaXRpYWxpemluZ1xuIiwKLQkJICB3bGMtPnB1Yi0+dW5pdCk7Ci0JYnJjbXNfaW5pdCh3bGMtPndsKTsKLX0KLQogc3RhdGljIHZvaWQgYnJjbXNfYl9maWZvZXJyb3JzKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3KQogewogCWJvb2wgZmF0YWwgPSBmYWxzZTsKIAl1aW50IHVuaXQ7CiAJdWludCBpbnRzdGF0dXMsIGlkeDsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gd2xjX2h3LT5yZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjX2h3LT53bGMtPndpcGh5OwogCiAJdW5pdCA9IHdsY19ody0+dW5pdDsKQEAgLTIzNzIsNyArMjMwOSw5IEBACiAJZm9yIChpZHggPSAwOyBpZHggPCBORklGTzsgaWR4KyspIHsKIAkJLyogcmVhZCBpbnRzdGF0dXMgcmVnaXN0ZXIgYW5kIGlnbm9yZSBhbnkgbm9uLWVycm9yIGJpdHMgKi8KIAkJaW50c3RhdHVzID0KLQkJICAgIFJfUkVHKCZyZWdzLT5pbnRjdHJscmVnc1tpZHhdLmludHN0YXR1cykgJiBJX0VSUk9SUzsKKwkJCWJjbWFfcmVhZDMyKGNvcmUsCisJCQkJICAgIEQxMVJFR09GRlMoaW50Y3RybHJlZ3NbaWR4XS5pbnRzdGF0dXMpKSAmCisJCQlJX0VSUk9SUzsKIAkJaWYgKCFpbnRzdGF0dXMpCiAJCQljb250aW51ZTsKIApAQCAtMjQxNCwxMSArMjM1MywxMiBAQAogCQl9CiAKIAkJaWYgKGZhdGFsKSB7Ci0JCQlicmNtc19jX2ZhdGFsX2Vycm9yKHdsY19ody0+d2xjKTsJLyogYmlnIGhhbW1lciAqLworCQkJYnJjbXNfZmF0YWxfZXJyb3Iod2xjX2h3LT53bGMtPndsKTsgLyogYmlnIGhhbW1lciAqLwogCQkJYnJlYWs7CiAJCX0gZWxzZQotCQkJV19SRUcoJnJlZ3MtPmludGN0cmxyZWdzW2lkeF0uaW50c3RhdHVzLAotCQkJICAgICAgaW50c3RhdHVzKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLAorCQkJCSAgICAgRDExUkVHT0ZGUyhpbnRjdHJscmVnc1tpZHhdLmludHN0YXR1cyksCisJCQkJICAgICBpbnRzdGF0dXMpOwogCX0KIH0KIApAQCAtMjQyNiwyOCArMjM2Niw3IEBACiB7CiAJc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwogCXdsYy0+bWFjaW50bWFzayA9IHdsYy0+ZGVmbWFjaW50bWFzazsKLQlXX1JFRygmd2xjX2h3LT5yZWdzLT5tYWNpbnRtYXNrLCB3bGMtPm1hY2ludG1hc2spOwotfQotCi0vKgotICogY2FsbGJhY2sgZm9yIHNpdXRpbHMuYywgd2hpY2ggaGFzIG9ubHkgd2xjIGhhbmRsZXIsIG5vIHdsIHRoZXkgYm90aCBjaGVjawotICogdXAsIG5vdCBvbmx5IGJlY2F1c2UgdGhlcmUgaXMgbm8gbmVlZCB0byBvZmYvcmVzdG9yZSBkMTEgaW50ZXJydXB0IGJ1dCBhbHNvCi0gKiBiZWNhdXNlIHBlci1wb3J0IGNvZGUgbWF5IHJlcXVpcmUgc3luYyB3aXRoIHZhbGlkIGludGVycnVwdC4KLSAqLwotc3RhdGljIHUzMiBicmNtc19jX3dsaW50cnNvZmYoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWlmICghd2xjLT5ody0+dXApCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIGJyY21zX2ludHJzb2ZmKHdsYy0+d2wpOwotfQotCi1zdGF0aWMgdm9pZCBicmNtc19jX3dsaW50cnNyZXN0b3JlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTMyIG1hY2ludG1hc2spCi17Ci0JaWYgKCF3bGMtPmh3LT51cCkKLQkJcmV0dXJuOwotCi0JYnJjbXNfaW50cnNyZXN0b3JlKHdsYy0+d2wsIG1hY2ludG1hc2spOworCWJjbWFfd3JpdGUzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjaW50bWFzayksIHdsYy0+bWFjaW50bWFzayk7CiB9CiAKIHUzMiBicmNtc19jX2ludHJzb2ZmKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKQEAgLTI0NjAsOCArMjM3OSw4IEBACiAKIAltYWNpbnRtYXNrID0gd2xjLT5tYWNpbnRtYXNrOwkvKiBpc3IgY2FuIHN0aWxsIGhhcHBlbiAqLwogCi0JV19SRUcoJndsY19ody0+cmVncy0+bWFjaW50bWFzaywgMCk7Ci0JKHZvaWQpUl9SRUcoJndsY19ody0+cmVncy0+bWFjaW50bWFzayk7CS8qIHN5bmMgcmVhZGJhY2sgKi8KKwliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2ludG1hc2spLCAwKTsKKwkodm9pZCliY21hX3JlYWQzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjaW50bWFzaykpOwogCXVkZWxheSgxKTsJCS8qIGVuc3VyZSBpbnQgbGluZSBpcyBubyBsb25nZXIgZHJpdmVuICovCiAJd2xjLT5tYWNpbnRtYXNrID0gMDsKIApAQCAtMjQ3Niw5ICsyMzk1LDEwIEBACiAJCXJldHVybjsKIAogCXdsYy0+bWFjaW50bWFzayA9IG1hY2ludG1hc2s7Ci0JV19SRUcoJndsY19ody0+cmVncy0+bWFjaW50bWFzaywgd2xjLT5tYWNpbnRtYXNrKTsKKwliY21hX3dyaXRlMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2ludG1hc2spLCB3bGMtPm1hY2ludG1hc2spOwogfQogCisvKiBhc3N1bWVzIHRoYXQgdGhlIGQxMSBNQUMgaXMgZW5hYmxlZCAqLwogc3RhdGljIHZvaWQgYnJjbXNfYl90eF9maWZvX3N1c3BlbmQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsCiAJCQkJICAgIHVpbnQgdHhfZmlmbykKIHsKQEAgLTI1MzUsMTEgKzI0NTUsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJyY21zX2JfbXV0ZShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgYm9vbCBvbiwgdTMyIGZsYWdzKQorLyogcHJlY29uZGl0aW9uOiByZXF1aXJlcyB0aGUgbWFjIGNvcmUgdG8gYmUgZW5hYmxlZCAqLworc3RhdGljIHZvaWQgYnJjbXNfYl9tdXRlKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBib29sIG11dGVfdHgpCiB7CiAJc3RhdGljIGNvbnN0IHU4IG51bGxfZXRoZXJfYWRkcltFVEhfQUxFTl0gPSB7MCwgMCwgMCwgMCwgMCwgMH07CiAKLQlpZiAob24pIHsKKwlpZiAobXV0ZV90eCkgewogCQkvKiBzdXNwZW5kIHR4IGZpZm9zICovCiAJCWJyY21zX2JfdHhfZmlmb19zdXNwZW5kKHdsY19odywgVFhfREFUQV9GSUZPKTsKIAkJYnJjbXNfYl90eF9maWZvX3N1c3BlbmQod2xjX2h3LCBUWF9DVExfRklGTyk7CkBAIC0yNTYxLDE0ICsyNDgyLDIwIEBACiAJCQkJICAgICAgIHdsY19ody0+ZXRoZXJhZGRyKTsKIAl9CiAKLQl3bGNfcGh5X211dGVfdXBkKHdsY19ody0+YmFuZC0+cGksIG9uLCBmbGFncyk7CisJd2xjX3BoeV9tdXRlX3VwZCh3bGNfaHctPmJhbmQtPnBpLCBtdXRlX3R4LCAwKTsKIAotCWlmIChvbikKKwlpZiAobXV0ZV90eCkKIAkJYnJjbXNfY191Y29kZV9tdXRlX292ZXJyaWRlX3NldCh3bGNfaHcpOwogCWVsc2UKIAkJYnJjbXNfY191Y29kZV9tdXRlX292ZXJyaWRlX2NsZWFyKHdsY19odyk7CiB9CiAKK3ZvaWQKK2JyY21zX2NfbXV0ZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgbXV0ZV90eCkKK3sKKwlicmNtc19iX211dGUod2xjLT5odywgbXV0ZV90eCk7Cit9CisKIC8qCiAgKiBSZWFkIGFuZCBjbGVhciBtYWNpbnRtYXNrIGFuZCBtYWNpbnRzdGF0dXMgYW5kIGludHN0YXR1cyByZWdpc3RlcnMuCiAgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmCkBAIC0yNTgwLDExICsyNTA3LDExIEBACiBzdGF0aWMgaW5saW5lIHUzMiB3bGNfaW50c3RhdHVzKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCBpbl9pc3IpCiB7CiAJc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcgPSB3bGMtPmh3OwotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCXUzMiBtYWNpbnRzdGF0dXM7CiAKIAkvKiBtYWNpbnRzdGF0dXMgaW5jbHVkZXMgYSBETUEgaW50ZXJydXB0IHN1bW1hcnkgYml0ICovCi0JbWFjaW50c3RhdHVzID0gUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cyk7CisJbWFjaW50c3RhdHVzID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRzdGF0dXMpKTsKIAogCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogbWFjaW50c3RhdHVzOiAweCV4XG4iLCB3bGNfaHctPnVuaXQsCiAJCSBtYWNpbnRzdGF0dXMpOwpAQCAtMjYxMSwxMiArMjUzOCwxMiBAQAogCSAqIGNvbnNlcXVlbmNlcwogCSAqLwogCS8qIHR1cm4gb2ZmIHRoZSBpbnRlcnJ1cHRzICovCi0JV19SRUcoJnJlZ3MtPm1hY2ludG1hc2ssIDApOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5tYWNpbnRtYXNrKTsJLyogc3luYyByZWFkYmFjayAqLworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2ludG1hc2spLCAwKTsKKwkodm9pZCliY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2ludG1hc2spKTsKIAl3bGMtPm1hY2ludG1hc2sgPSAwOwogCiAJLyogY2xlYXIgZGV2aWNlIGludGVycnVwdHMgKi8KLQlXX1JFRygmcmVncy0+bWFjaW50c3RhdHVzLCBtYWNpbnRzdGF0dXMpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2ludHN0YXR1cyksIG1hY2ludHN0YXR1cyk7CiAKIAkvKiBNSV9ETUFJTlQgaXMgaW5kaWNhdGlvbiBvZiBub24temVybyBpbnRzdGF0dXMgKi8KIAlpZiAobWFjaW50c3RhdHVzICYgTUlfRE1BSU5UKQpAQCAtMjYyNSw4ICsyNTUyLDggQEAKIAkJICogUlhfRklGTy4gSWYgTUlfRE1BSU5UIGlzIHNldCwgYXNzdW1lIGl0CiAJCSAqIGlzIHNldCBhbmQgY2xlYXIgdGhlIGludGVycnVwdC4KIAkJICovCi0JCVdfUkVHKCZyZWdzLT5pbnRjdHJscmVnc1tSWF9GSUZPXS5pbnRzdGF0dXMsCi0JCSAgICAgIERFRl9SWElOVE1BU0spOworCQliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhpbnRjdHJscmVnc1tSWF9GSUZPXS5pbnRzdGF0dXMpLAorCQkJICAgICBERUZfUlhJTlRNQVNLKTsKIAogCXJldHVybiBtYWNpbnRzdGF0dXM7CiB9CkBAIC0yNjg5LDcgKzI2MTYsNyBAQAogdm9pZCBicmNtc19jX3N1c3BlbmRfbWFjX2FuZF93YWl0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKIHsKIAlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odyA9IHdsYy0+aHc7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVncyA9IHdsY19ody0+cmVnczsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CiAJdTMyIG1jLCBtaTsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjLT53aXBoeTsKIApAQCAtMjcwNiw3ICsyNjMzLDcgQEAKIAkvKiBmb3JjZSB0aGUgY29yZSBhd2FrZSAqLwogCWJyY21zX2NfdWNvZGVfd2FrZV9vdmVycmlkZV9zZXQod2xjX2h3LCBCUkNNU19XQUtFX09WRVJSSURFX01BQ1NVU1BFTkQpOwogCi0JbWMgPSBSX1JFRygmcmVncy0+bWFjY29udHJvbCk7CisJbWMgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKIAogCWlmIChtYyA9PSAweGZmZmZmZmZmKSB7CiAJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsY19ody0+dW5pdCwKQEAgLTI3MTgsNyArMjY0NSw3IEBACiAJV0FSTl9PTighKG1jICYgTUNUTF9QU01fUlVOKSk7CiAJV0FSTl9PTighKG1jICYgTUNUTF9FTl9NQUMpKTsKIAotCW1pID0gUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cyk7CisJbWkgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2ludHN0YXR1cykpOwogCWlmIChtaSA9PSAweGZmZmZmZmZmKSB7CiAJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6ICVzOiBkZWFkIGNoaXBcbiIsIHdsY19ody0+dW5pdCwKIAkJCSAgX19mdW5jX18pOwpAQCAtMjcyOSwyMSArMjY1NiwyMSBAQAogCiAJYnJjbXNfYl9tY3RybCh3bGNfaHcsIE1DVExfRU5fTUFDLCAwKTsKIAotCVNQSU5XQUlUKCEoUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpLAorCVNQSU5XQUlUKCEoYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRzdGF0dXMpKSAmIE1JX01BQ1NTUE5ERCksCiAJCSBCUkNNU19NQVhfTUFDX1NVU1BFTkQpOwogCi0JaWYgKCEoUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cykgJiBNSV9NQUNTU1BOREQpKSB7CisJaWYgKCEoYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRzdGF0dXMpKSAmIE1JX01BQ1NTUE5ERCkpIHsKIAkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogd2xjX3N1c3BlbmRfbWFjX2FuZF93YWl0OiB3YWl0ZWQgJWQgdVMiCiAJCQkgICIgYW5kIE1JX01BQ1NTUE5ERCBpcyBzdGlsbCBub3Qgb24uXG4iLAogCQkJICB3bGNfaHctPnVuaXQsIEJSQ01TX01BWF9NQUNfU1VTUEVORCk7CiAJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IHBzbWRlYnVnIDB4JTA4eCwgcGh5ZGVidWcgMHglMDh4LCAiCiAJCQkgICJwc21fYnJjIDB4JTA0eFxuIiwgd2xjX2h3LT51bml0LAotCQkJICBSX1JFRygmcmVncy0+cHNtZGVidWcpLAotCQkJICBSX1JFRygmcmVncy0+cGh5ZGVidWcpLAotCQkJICBSX1JFRygmcmVncy0+cHNtX2JyYykpOworCQkJICBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKHBzbWRlYnVnKSksCisJCQkgIGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMocGh5ZGVidWcpKSwKKwkJCSAgYmNtYV9yZWFkMTYoY29yZSwgRDExUkVHT0ZGUyhwc21fYnJjKSkpOwogCX0KIAotCW1jID0gUl9SRUcoJnJlZ3MtPm1hY2NvbnRyb2wpOworCW1jID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSk7CiAJaWYgKG1jID09IDB4ZmZmZmZmZmYpIHsKIAkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogJXM6IGRlYWQgY2hpcFxuIiwgd2xjX2h3LT51bml0LAogCQkJICBfX2Z1bmNfXyk7CkBAIC0yNzU4LDcgKzI2ODUsNyBAQAogdm9pZCBicmNtc19jX2VuYWJsZV9tYWMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQogewogCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gd2xjX2h3LT5yZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAl1MzIgbWMsIG1pOwogCiAJQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkOiBiYW5kdW5pdCAlZFxuIiwgd2xjX2h3LT51bml0LApAQCAtMjc3MSwyMCArMjY5OCwyMCBAQAogCWlmICh3bGNfaHctPm1hY19zdXNwZW5kX2RlcHRoID4gMCkKIAkJcmV0dXJuOwogCi0JbWMgPSBSX1JFRygmcmVncy0+bWFjY29udHJvbCk7CisJbWMgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKIAlXQVJOX09OKG1jICYgTUNUTF9QU01fSk1QXzApOwogCVdBUk5fT04obWMgJiBNQ1RMX0VOX01BQyk7CiAJV0FSTl9PTighKG1jICYgTUNUTF9QU01fUlVOKSk7CiAKIAlicmNtc19iX21jdHJsKHdsY19odywgTUNUTF9FTl9NQUMsIE1DVExfRU5fTUFDKTsKLQlXX1JFRygmcmVncy0+bWFjaW50c3RhdHVzLCBNSV9NQUNTU1BOREQpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2ludHN0YXR1cyksIE1JX01BQ1NTUE5ERCk7CiAKLQltYyA9IFJfUkVHKCZyZWdzLT5tYWNjb250cm9sKTsKKwltYyA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCVdBUk5fT04obWMgJiBNQ1RMX1BTTV9KTVBfMCk7CiAJV0FSTl9PTighKG1jICYgTUNUTF9FTl9NQUMpKTsKIAlXQVJOX09OKCEobWMgJiBNQ1RMX1BTTV9SVU4pKTsKIAotCW1pID0gUl9SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cyk7CisJbWkgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2ludHN0YXR1cykpOwogCVdBUk5fT04obWkgJiBNSV9NQUNTU1BOREQpOwogCiAJYnJjbXNfY191Y29kZV93YWtlX292ZXJyaWRlX2NsZWFyKHdsY19odywKQEAgLTI4MDEsNTUgKzI3MjgsNTMgQEAKIAogc3RhdGljIGJvb2wgYnJjbXNfYl92YWxpZGF0ZV9jaGlwX2FjY2VzcyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odykKIHsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAl1MzIgdywgdmFsOwogCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSB3bGNfaHctPndsYy0+d2lwaHk7CiAKIAlCQ01NU0cod2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwogCi0JcmVncyA9IHdsY19ody0+cmVnczsKLQogCS8qIFZhbGlkYXRlIGRjaGlwIHJlZ2lzdGVyIGFjY2VzcyAqLwogCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0hNX1NFTCB8IDApOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKLQl3ID0gUl9SRUcoJnJlZ3MtPm9iamRhdGEpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpLCBPQkpBRERSX1NITV9TRUwgfCAwKTsKKwkodm9pZCliY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpKTsKKwl3ID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSk7CiAKIAkvKiBDYW4gd2Ugd3JpdGUgYW5kIHJlYWQgYmFjayBhIDMyYml0IHJlZ2lzdGVyPyAqLwotCVdfUkVHKCZyZWdzLT5vYmphZGRyLCBPQkpBRERSX1NITV9TRUwgfCAwKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7Ci0JV19SRUcoJnJlZ3MtPm9iamRhdGEsICh1MzIpIDB4YWE1NTU1YWEpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpLCBPQkpBRERSX1NITV9TRUwgfCAwKTsKKwkodm9pZCliY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSwgKHUzMikgMHhhYTU1NTVhYSk7CiAKLQlXX1JFRygmcmVncy0+b2JqYWRkciwgT0JKQUREUl9TSE1fU0VMIHwgMCk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm9iamFkZHIpOwotCXZhbCA9IFJfUkVHKCZyZWdzLT5vYmpkYXRhKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSwgT0JKQUREUl9TSE1fU0VMIHwgMCk7CisJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CisJdmFsID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSk7CiAJaWYgKHZhbCAhPSAodTMyKSAweGFhNTU1NWFhKSB7CiAJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBTSE0gPSAweCV4LCAiCiAJCQkgICJleHBlY3RlZCAweGFhNTU1NWFhXG4iLCB3bGNfaHctPnVuaXQsIHZhbCk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlXX1JFRygmcmVncy0+b2JqYWRkciwgT0JKQUREUl9TSE1fU0VMIHwgMCk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm9iamFkZHIpOwotCVdfUkVHKCZyZWdzLT5vYmpkYXRhLCAodTMyKSAweDU1YWFhYTU1KTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSwgT0JKQUREUl9TSE1fU0VMIHwgMCk7CisJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqZGF0YSksICh1MzIpIDB4NTVhYWFhNTUpOwogCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0hNX1NFTCB8IDApOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKLQl2YWwgPSBSX1JFRygmcmVncy0+b2JqZGF0YSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksIE9CSkFERFJfU0hNX1NFTCB8IDApOworCSh2b2lkKWJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkcikpOworCXZhbCA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMob2JqZGF0YSkpOwogCWlmICh2YWwgIT0gKHUzMikgMHg1NWFhYWE1NSkgewogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiB2YWxpZGF0ZV9jaGlwX2FjY2VzczogU0hNID0gMHgleCwgIgogCQkJICAiZXhwZWN0ZWQgMHg1NWFhYWE1NVxuIiwgd2xjX2h3LT51bml0LCB2YWwpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIE9CSkFERFJfU0hNX1NFTCB8IDApOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKLQlXX1JFRygmcmVncy0+b2JqZGF0YSwgdyk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksIE9CSkFERFJfU0hNX1NFTCB8IDApOworCSh2b2lkKWJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkcikpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG9iamRhdGEpLCB3KTsKIAogCS8qIGNsZWFyIENGUFN0YXJ0ICovCi0JV19SRUcoJnJlZ3MtPnRzZl9jZnBzdGFydCwgMCk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlModHNmX2NmcHN0YXJ0KSwgMCk7CiAKLQl3ID0gUl9SRUcoJnJlZ3MtPm1hY2NvbnRyb2wpOworCXcgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKIAlpZiAoKHcgIT0gKE1DVExfSUhSX0VOIHwgTUNUTF9XQUtFKSkgJiYKIAkgICAgKHcgIT0gKE1DVExfSUhSX0VOIHwgTUNUTF9HTU9ERSB8IE1DVExfV0FLRSkpKSB7CiAJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IHZhbGlkYXRlX2NoaXBfYWNjZXNzOiBtYWNjb250cm9sID0gIgpAQCAtMjg2NiwzOCArMjc5MSwzOCBAQAogCiB2b2lkIGJyY21zX2JfY29yZV9waHlwbGxfY3RsKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCBib29sIG9uKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCXUzMiB0bXA7CiAKIAlCQ01NU0cod2xjX2h3LT53bGMtPndpcGh5LCAid2wlZFxuIiwgd2xjX2h3LT51bml0KTsKIAogCXRtcCA9IDA7Ci0JcmVncyA9IHdsY19ody0+cmVnczsKIAogCWlmIChvbikgewotCQlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMTNfQ0hJUF9JRCkpIHsKLQkJCU9SX1JFRygmcmVncy0+Y2xrX2N0bF9zdCwKLQkJCSAgICAgICAoQ0NTX0VSU1JDX1JFUV9IVCB8IENDU19FUlNSQ19SRVFfRDExUExMIHwKLQkJCQlDQ1NfRVJTUkNfUkVRX1BIWVBMTCkpOwotCQkJU1BJTldBSVQoKFJfUkVHKCZyZWdzLT5jbGtfY3RsX3N0KSAmCi0JCQkJICAoQ0NTX0VSU1JDX0FWQUlMX0hUKSkgIT0gKENDU19FUlNSQ19BVkFJTF9IVCksCisJCWlmICgoYWlfZ2V0X2NoaXBfaWQod2xjX2h3LT5zaWgpID09IEJDTTQzMTNfQ0hJUF9JRCkpIHsKKwkJCWJjbWFfc2V0MzIoY29yZSwgRDExUkVHT0ZGUyhjbGtfY3RsX3N0KSwKKwkJCQkgICBDQ1NfRVJTUkNfUkVRX0hUIHwKKwkJCQkgICBDQ1NfRVJTUkNfUkVRX0QxMVBMTCB8CisJCQkJICAgQ0NTX0VSU1JDX1JFUV9QSFlQTEwpOworCQkJU1BJTldBSVQoKGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMoY2xrX2N0bF9zdCkpICYKKwkJCQkgIENDU19FUlNSQ19BVkFJTF9IVCkgIT0gQ0NTX0VSU1JDX0FWQUlMX0hULAogCQkJCSBQSFlQTExfV0FJVF9VUyk7CiAKLQkJCXRtcCA9IFJfUkVHKCZyZWdzLT5jbGtfY3RsX3N0KTsKLQkJCWlmICgodG1wICYgKENDU19FUlNSQ19BVkFJTF9IVCkpICE9Ci0JCQkgICAgKENDU19FUlNSQ19BVkFJTF9IVCkpCisJCQl0bXAgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKGNsa19jdGxfc3QpKTsKKwkJCWlmICgodG1wICYgQ0NTX0VSU1JDX0FWQUlMX0hUKSAhPSBDQ1NfRVJTUkNfQVZBSUxfSFQpCiAJCQkJd2lwaHlfZXJyKHdsY19ody0+d2xjLT53aXBoeSwgIiVzOiB0dXJuIG9uIFBIWSIKIAkJCQkJICAiIFBMTCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAkJfSBlbHNlIHsKLQkJCU9SX1JFRygmcmVncy0+Y2xrX2N0bF9zdCwKLQkJCSAgICAgICAoQ0NTX0VSU1JDX1JFUV9EMTFQTEwgfCBDQ1NfRVJTUkNfUkVRX1BIWVBMTCkpOwotCQkJU1BJTldBSVQoKFJfUkVHKCZyZWdzLT5jbGtfY3RsX3N0KSAmCisJCQliY21hX3NldDMyKGNvcmUsIEQxMVJFR09GRlMoY2xrX2N0bF9zdCksCisJCQkJICAgdG1wIHwgQ0NTX0VSU1JDX1JFUV9EMTFQTEwgfAorCQkJCSAgIENDU19FUlNSQ19SRVFfUEhZUExMKTsKKwkJCVNQSU5XQUlUKChiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKGNsa19jdGxfc3QpKSAmCiAJCQkJICAoQ0NTX0VSU1JDX0FWQUlMX0QxMVBMTCB8CiAJCQkJICAgQ0NTX0VSU1JDX0FWQUlMX1BIWVBMTCkpICE9CiAJCQkJIChDQ1NfRVJTUkNfQVZBSUxfRDExUExMIHwKIAkJCQkgIENDU19FUlNSQ19BVkFJTF9QSFlQTEwpLCBQSFlQTExfV0FJVF9VUyk7CiAKLQkJCXRtcCA9IFJfUkVHKCZyZWdzLT5jbGtfY3RsX3N0KTsKKwkJCXRtcCA9IGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMoY2xrX2N0bF9zdCkpOwogCQkJaWYgKCh0bXAgJgogCQkJICAgICAoQ0NTX0VSU1JDX0FWQUlMX0QxMVBMTCB8IENDU19FUlNSQ19BVkFJTF9QSFlQTEwpKQogCQkJICAgICE9CkBAIC0yOTExLDggKzI4MzYsOSBAQAogCQkgKiBiZSByZXF1ZXN0aW5nIGl0OyBzbyB3ZSdsbCBkZWFzc2VydCB0aGUgcmVxdWVzdCBidXQKIAkJICogbm90IHdhaXQgZm9yIHN0YXR1cyB0byBjb21wbHkuCiAJCSAqLwotCQlBTkRfUkVHKCZyZWdzLT5jbGtfY3RsX3N0LCB+Q0NTX0VSU1JDX1JFUV9QSFlQTEwpOwotCQl0bXAgPSBSX1JFRygmcmVncy0+Y2xrX2N0bF9zdCk7CisJCWJjbWFfbWFzazMyKGNvcmUsIEQxMVJFR09GRlMoY2xrX2N0bF9zdCksCisJCQkgICAgfkNDU19FUlNSQ19SRVFfUEhZUExMKTsKKwkJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhjbGtfY3RsX3N0KSk7CiAJfQogfQogCkBAIC0yOTQwLDcgKzI4NjYsNyBAQAogCWJyY21zX2JfY29yZV9waHlwbGxfY3RsKHdsY19odywgZmFsc2UpOwogCiAJd2xjX2h3LT5jbGsgPSBmYWxzZTsKLQlhaV9jb3JlX2Rpc2FibGUod2xjX2h3LT5zaWgsIDApOworCWJjbWFfY29yZV9kaXNhYmxlKHdsY19ody0+ZDExY29yZSwgMCk7CiAJd2xjX3BoeV9od19jbGtfc3RhdGVfdXBkKHdsY19ody0+YmFuZC0+cGksIGZhbHNlKTsKIH0KIApAQCAtMjk2NCwzNSArMjg5MCwzMSBAQAogc3RhdGljIHUxNgogYnJjbXNfYl9yZWFkX29iam1lbShzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdWludCBvZmZzZXQsIHUzMiBzZWwpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVncyA9IHdsY19ody0+cmVnczsKLQl1MTYgX19pb21lbSAqb2JqZGF0YV9sbyA9ICh1MTYgX19pb21lbSAqKSZyZWdzLT5vYmpkYXRhOwotCXUxNiBfX2lvbWVtICpvYmpkYXRhX2hpID0gb2JqZGF0YV9sbyArIDE7Ci0JdTE2IHY7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOworCXUxNiBvYmpvZmYgPSBEMTFSRUdPRkZTKG9iamRhdGEpOwogCi0JV19SRUcoJnJlZ3MtPm9iamFkZHIsIHNlbCB8IChvZmZzZXQgPj4gMikpOwotCSh2b2lkKVJfUkVHKCZyZWdzLT5vYmphZGRyKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSwgc2VsIHwgKG9mZnNldCA+PiAyKSk7CisJKHZvaWQpYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CiAJaWYgKG9mZnNldCAmIDIpCi0JCXYgPSBSX1JFRyhvYmpkYXRhX2hpKTsKLQllbHNlCi0JCXYgPSBSX1JFRyhvYmpkYXRhX2xvKTsKKwkJb2Jqb2ZmICs9IDI7CiAKLQlyZXR1cm4gdjsKKwlyZXR1cm4gYmNtYV9yZWFkMTYoY29yZSwgb2Jqb2ZmKTsKKzsKIH0KIAogc3RhdGljIHZvaWQKIGJyY21zX2Jfd3JpdGVfb2JqbWVtKHN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3LCB1aW50IG9mZnNldCwgdTE2IHYsCiAJCSAgICAgdTMyIHNlbCkKIHsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gd2xjX2h3LT5yZWdzOwotCXUxNiBfX2lvbWVtICpvYmpkYXRhX2xvID0gKHUxNiBfX2lvbWVtICopJnJlZ3MtPm9iamRhdGE7Ci0JdTE2IF9faW9tZW0gKm9iamRhdGFfaGkgPSBvYmpkYXRhX2xvICsgMTsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSB3bGNfaHctPmQxMWNvcmU7CisJdTE2IG9iam9mZiA9IEQxMVJFR09GRlMob2JqZGF0YSk7CiAKLQlXX1JFRygmcmVncy0+b2JqYWRkciwgc2VsIHwgKG9mZnNldCA+PiAyKSk7Ci0JKHZvaWQpUl9SRUcoJnJlZ3MtPm9iamFkZHIpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpLCBzZWwgfCAob2Zmc2V0ID4+IDIpKTsKKwkodm9pZCliY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpKTsKIAlpZiAob2Zmc2V0ICYgMikKLQkJV19SRUcob2JqZGF0YV9oaSwgdik7Ci0JZWxzZQotCQlXX1JFRyhvYmpkYXRhX2xvLCB2KTsKKwkJb2Jqb2ZmICs9IDI7CisKKwliY21hX3dyaXRlMTYoY29yZSwgb2Jqb2ZmLCB2KTsKIH0KIAogLyoKQEAgLTMwNzgsMTQgKzMwMDAsMTQgQEAKIAogCS8qIHdyaXRlIHJldHJ5IGxpbWl0IHRvIFNDUiwgc2hvdWxkbid0IG5lZWQgdG8gc3VzcGVuZCAqLwogCWlmICh3bGNfaHctPnVwKSB7Ci0JCVdfUkVHKCZ3bGNfaHctPnJlZ3MtPm9iamFkZHIsCi0JCSAgICAgIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfU1JDX0xNVCk7Ci0JCSh2b2lkKVJfUkVHKCZ3bGNfaHctPnJlZ3MtPm9iamFkZHIpOwotCQlXX1JFRygmd2xjX2h3LT5yZWdzLT5vYmpkYXRhLCB3bGNfaHctPlNSTCk7Ci0JCVdfUkVHKCZ3bGNfaHctPnJlZ3MtPm9iamFkZHIsCi0JCSAgICAgIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfTFJDX0xNVCk7Ci0JCSh2b2lkKVJfUkVHKCZ3bGNfaHctPnJlZ3MtPm9iamFkZHIpOwotCQlXX1JFRygmd2xjX2h3LT5yZWdzLT5vYmpkYXRhLCB3bGNfaHctPkxSTCk7CisJCWJjbWFfd3JpdGUzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksCisJCQkgICAgIE9CSkFERFJfU0NSX1NFTCB8IFNfRE9UMTFfU1JDX0xNVCk7CisJCSh2b2lkKWJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSk7CisJCWJjbWFfd3JpdGUzMih3bGNfaHctPmQxMWNvcmUsIEQxMVJFR09GRlMob2JqZGF0YSksIHdsY19ody0+U1JMKTsKKwkJYmNtYV93cml0ZTMyKHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSwKKwkJCSAgICAgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9MUkNfTE1UKTsKKwkJKHZvaWQpYmNtYV9yZWFkMzIod2xjX2h3LT5kMTFjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpKTsKKwkJYmNtYV93cml0ZTMyKHdsY19ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSwgd2xjX2h3LT5MUkwpOwogCX0KIH0KIApAQCAtMzEzMiw3ICszMDU0LDcgQEAKIAkJcmV0dXJuIGZhbHNlOwogCiAJLyogZGlzYWxsb3cgUFMgd2hlbiBvbmUgb2YgdGhlc2UgbWVldHMgd2hlbiBub3Qgc2Nhbm5pbmcgKi8KLQlpZiAod2xjLT5tb25pdG9yKQorCWlmICh3bGMtPmZpbHRlcl9mbGFncyAmIEZJRl9QUk9NSVNDX0lOX0JTUykKIAkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKGNmZy0+YXNzb2NpYXRlZCkgewpAQCAtMzI2Nyw5ICszMTg5LDkgQEAKIHN0YXRpYyB2b2lkIGJyY21zX2JfY29yZWluaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQogewogCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAl1MzIgc2ZsYWdzOwotCXVpbnQgYmNuaW50X3VzOworCXUzMiBiY25pbnRfdXM7CiAJdWludCBpID0gMDsKIAlib29sIGZpZm9zel9maXh1cCA9IGZhbHNlOwogCWludCBlcnIgPSAwOwpAQCAtMzI3Nyw4ICszMTk5LDYgQEAKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjLT53aXBoeTsKIAlzdHJ1Y3QgYnJjbXNfdWNvZGUgKnVjb2RlID0gJndsY19ody0+d2xjLT53bC0+dWNvZGU7CiAKLQlyZWdzID0gd2xjX2h3LT5yZWdzOwotCiAJQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGNfaHctPnVuaXQpOwogCiAJLyogcmVzZXQgUFNNICovCkBAIC0zMjkxLDIwICszMjExLDIwIEBACiAJZmlmb3N6X2ZpeHVwID0gdHJ1ZTsKIAogCS8qIGxldCB0aGUgUFNNIHJ1biB0byB0aGUgc3VzcGVuZGVkIHN0YXRlLCBzZXQgbW9kZSB0byBCU1MgU1RBICovCi0JV19SRUcoJnJlZ3MtPm1hY2ludHN0YXR1cywgLTEpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2ludHN0YXR1cyksIC0xKTsKIAlicmNtc19iX21jdHJsKHdsY19odywgfjAsCiAJCSAgICAgICAoTUNUTF9JSFJfRU4gfCBNQ1RMX0lORlJBIHwgTUNUTF9QU01fUlVOIHwgTUNUTF9XQUtFKSk7CiAKIAkvKiB3YWl0IGZvciB1Y29kZSB0byBzZWxmLXN1c3BlbmQgYWZ0ZXIgYXV0by1pbml0ICovCi0JU1BJTldBSVQoKChSX1JFRygmcmVncy0+bWFjaW50c3RhdHVzKSAmIE1JX01BQ1NTUE5ERCkgPT0gMCksCi0JCSAxMDAwICogMTAwMCk7Ci0JaWYgKChSX1JFRygmcmVncy0+bWFjaW50c3RhdHVzKSAmIE1JX01BQ1NTUE5ERCkgPT0gMCkKKwlTUElOV0FJVCgoKGJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMobWFjaW50c3RhdHVzKSkgJgorCQkgICBNSV9NQUNTU1BOREQpID09IDApLCAxMDAwICogMTAwMCk7CisJaWYgKChiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2ludHN0YXR1cykpICYgTUlfTUFDU1NQTkREKSA9PSAwKQogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiB3bGNfY29yZWluaXQ6IHVjb2RlIGRpZCBub3Qgc2VsZi0iCiAJCQkgICJzdXNwZW5kIVxuIiwgd2xjX2h3LT51bml0KTsKIAogCWJyY21zX2NfZ3Bpb19pbml0KHdsYyk7CiAKLQlzZmxhZ3MgPSBhaV9jb3JlX3NmbGFncyh3bGNfaHctPnNpaCwgMCwgMCk7CisJc2ZsYWdzID0gYmNtYV9hcmVhZDMyKGNvcmUsIEJDTUFfSU9TVCk7CiAKIAlpZiAoRDExUkVWX0lTKHdsY19ody0+Y29yZXJldiwgMjMpKSB7CiAJCWlmIChCUkNNU19JU05QSFkod2xjX2h3LT5iYW5kKSkKQEAgLTMzNjgsNyArMzI4OCw3IEBACiAJCQkgIHdsY19ody0+eG10Zmlmb19zeltpXSwgaSk7CiAKIAkvKiBtYWtlIHN1cmUgd2UgY2FuIHN0aWxsIHRhbGsgdG8gdGhlIG1hYyAqLwotCVdBUk5fT04oUl9SRUcoJnJlZ3MtPm1hY2NvbnRyb2wpID09IDB4ZmZmZmZmZmYpOworCVdBUk5fT04oYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgPT0gMHhmZmZmZmZmZik7CiAKIAkvKiBiYW5kLXNwZWNpZmljIGluaXRzIGRvbmUgYnkgd2xjX2JzaW5pdCgpICovCiAKQEAgLTMzNzcsNyArMzI5Nyw3IEBACiAJYnJjbXNfYl93cml0ZV9zaG0od2xjX2h3LCBNX01BWF9BTlRDTlQsIEFOVENOVCk7CiAKIAkvKiBlbmFibGUgb25lIHJ4IGludGVycnVwdCBwZXIgcmVjZWl2ZWQgZnJhbWUgKi8KLQlXX1JFRygmcmVncy0+aW50cmN2bGF6eVswXSwgKDEgPDwgSVJMX0ZDX1NISUZUKSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMoaW50cmN2bGF6eVswXSksICgxIDw8IElSTF9GQ19TSElGVCkpOwogCiAJLyogc2V0IHRoZSBzdGF0aW9uIG1vZGUgKEJTUyBTVEEpICovCiAJYnJjbXNfYl9tY3RybCh3bGNfaHcsCkBAIC0zMzg2LDE5ICszMzA2LDIxIEBACiAKIAkvKiBzZXQgdXAgQmVhY29uIGludGVydmFsICovCiAJYmNuaW50X3VzID0gMHg4MDAwIDw8IDEwOwotCVdfUkVHKCZyZWdzLT50c2ZfY2ZwcmVwLCAoYmNuaW50X3VzIDw8IENGUFJFUF9DQklfU0hJRlQpKTsKLQlXX1JFRygmcmVncy0+dHNmX2NmcHN0YXJ0LCBiY25pbnRfdXMpOwotCVdfUkVHKCZyZWdzLT5tYWNpbnRzdGF0dXMsIE1JX0dQMSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlModHNmX2NmcHJlcCksCisJCSAgICAgKGJjbmludF91cyA8PCBDRlBSRVBfQ0JJX1NISUZUKSk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlModHNmX2NmcHN0YXJ0KSwgYmNuaW50X3VzKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNpbnRzdGF0dXMpLCBNSV9HUDEpOwogCiAJLyogd3JpdGUgaW50ZXJydXB0IG1hc2sgKi8KLQlXX1JFRygmcmVncy0+aW50Y3RybHJlZ3NbUlhfRklGT10uaW50bWFzaywgREVGX1JYSU5UTUFTSyk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMoaW50Y3RybHJlZ3NbUlhfRklGT10uaW50bWFzayksCisJCSAgICAgREVGX1JYSU5UTUFTSyk7CiAKIAkvKiBhbGxvdyB0aGUgTUFDIHRvIGNvbnRyb2wgdGhlIFBIWSBjbG9jayAoZHluYW1pYyBvbi9vZmYpICovCiAJYnJjbXNfYl9tYWNwaHljbGtfc2V0KHdsY19odywgT04pOwogCiAJLyogcHJvZ3JhbSBkeW5hbWljIGNsb2NrIGNvbnRyb2wgZmFzdCBwb3dlcnVwIGRlbGF5IHJlZ2lzdGVyICovCiAJd2xjLT5mYXN0cHdydXBfZGx5ID0gYWlfY2xrY3RsX2Zhc3RfcHdydXBfZGVsYXkod2xjX2h3LT5zaWgpOwotCVdfUkVHKCZyZWdzLT5zY2NfZmFzdHB3cnVwX2RseSwgd2xjLT5mYXN0cHdydXBfZGx5KTsKKwliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyhzY2NfZmFzdHB3cnVwX2RseSksIHdsYy0+ZmFzdHB3cnVwX2RseSk7CiAKIAkvKiB0ZWxsIHRoZSB1Y29kZSB0aGUgY29yZXJldiAqLwogCWJyY21zX2Jfd3JpdGVfc2htKHdsY19odywgTV9NQUNIV19WRVIsICh1MTYpIHdsY19ody0+Y29yZXJldik7CkBAIC0zNDExLDE5ICszMzMzLDIxIEBACiAJCQkJICAgICAgbWFjaHdjYXAgPj4gMTYpICYgMHhmZmZmKSk7CiAKIAkvKiB3cml0ZSByZXRyeSBsaW1pdHMgdG8gU0NSLCB0aGlzIGRvbmUgYWZ0ZXIgUFNNIGluaXQgKi8KLQlXX1JFRygmcmVncy0+b2JqYWRkciwgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9TUkNfTE1UKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7Ci0JV19SRUcoJnJlZ3MtPm9iamRhdGEsIHdsY19ody0+U1JMKTsKLQlXX1JFRygmcmVncy0+b2JqYWRkciwgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9MUkNfTE1UKTsKLQkodm9pZClSX1JFRygmcmVncy0+b2JqYWRkcik7Ci0JV19SRUcoJnJlZ3MtPm9iamRhdGEsIHdsY19ody0+TFJMKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmphZGRyKSwKKwkJICAgICBPQkpBRERSX1NDUl9TRUwgfCBTX0RPVDExX1NSQ19MTVQpOworCSh2b2lkKWJjbWFfcmVhZDMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkcikpOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKG9iamRhdGEpLCB3bGNfaHctPlNSTCk7CisJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMob2JqYWRkciksCisJCSAgICAgT0JKQUREUl9TQ1JfU0VMIHwgU19ET1QxMV9MUkNfTE1UKTsKKwkodm9pZCliY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKG9iamFkZHIpKTsKKwliY21hX3dyaXRlMzIoY29yZSwgRDExUkVHT0ZGUyhvYmpkYXRhKSwgd2xjX2h3LT5MUkwpOwogCiAJLyogd3JpdGUgcmF0ZSBmYWxsYmFjayByZXRyeSBsaW1pdHMgKi8KIAlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fU0ZSTVRYQ05URkJSVEhTRCwgd2xjX2h3LT5TRkJMKTsKIAlicmNtc19iX3dyaXRlX3NobSh3bGNfaHcsIE1fTEZSTVRYQ05URkJSVEhTRCwgd2xjX2h3LT5MRkJMKTsKIAotCUFORF9SRUcoJnJlZ3MtPmlmc19jdGwsIDB4MEZGRik7Ci0JV19SRUcoJnJlZ3MtPmlmc19haWZzbiwgRURDRl9BSUZTTl9NSU4pOworCWJjbWFfbWFzazE2KGNvcmUsIEQxMVJFR09GRlMoaWZzX2N0bCksIDB4MEZGRik7CisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMoaWZzX2FpZnNuKSwgRURDRl9BSUZTTl9NSU4pOwogCiAJLyogaW5pdCB0aGUgdHggZG1hIGVuZ2luZXMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTkZJRk87IGkrKykgewpAQCAtMzQzNyw4ICszMzYxLDcgQEAKIH0KIAogdm9pZAotc3RhdGljIGJyY21zX2JfaW5pdChzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IGNoYW5zcGVjLAotCQkJICBib29sIG11dGUpIHsKK3N0YXRpYyBicmNtc19iX2luaXQoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUxNiBjaGFuc3BlYykgewogCXUzMiBtYWNpbnRtYXNrOwogCWJvb2wgZmFzdGNsazsKIAlzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMgPSB3bGNfaHctPndsYzsKQEAgLTM0NjMsMTAgKzMzODYsNiBAQAogCS8qIGNvcmUtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KIAlicmNtc19iX2NvcmVpbml0KHdsYyk7CiAKLQkvKiBzdXNwZW5kIHRoZSB0eCBmaWZvcyBhbmQgbXV0ZSB0aGUgcGh5IGZvciBwcmVpc20gY2FjIHRpbWUgKi8KLQlpZiAobXV0ZSkKLQkJYnJjbXNfYl9tdXRlKHdsY19odywgT04sIFBIWV9NVVRFX0ZPUl9QUkVJU00pOwotCiAJLyogYmFuZC1zcGVjaWZpYyBpbml0cyAqLwogCWJyY21zX2JfYnNpbml0KHdsYywgY2hhbnNwZWMpOwogCkBAIC0zNjU2LDQyICszNTc1LDMyIEBACiAJYnJjbXNfY19zZXRfcGh5X2NoYW5zcGVjKHdsYywgY2hhbnNwZWMpOwogfQogCi1zdGF0aWMgdm9pZCBicmNtc19jX21hY19iY25fcHJvbWlzYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCi17Ci0JaWYgKHdsYy0+YmNubWlzY19tb25pdG9yKQotCQlicmNtc19iX21jdHJsKHdsYy0+aHcsIE1DVExfQkNOU19QUk9NSVNDLCBNQ1RMX0JDTlNfUFJPTUlTQyk7Ci0JZWxzZQotCQlicmNtc19iX21jdHJsKHdsYy0+aHcsIE1DVExfQkNOU19QUk9NSVNDLCAwKTsKLX0KLQotdm9pZCBicmNtc19jX21hY19iY25fcHJvbWlzY19jaGFuZ2Uoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHByb21pc2MpCi17Ci0Jd2xjLT5iY25taXNjX21vbml0b3IgPSBwcm9taXNjOwotCWJyY21zX2NfbWFjX2Jjbl9wcm9taXNjKHdsYyk7Ci19Ci0KLS8qIHNldCBvciBjbGVhciBtYWNjb250cm9sIGJpdHMgTUNUTF9QUk9NSVNDIGFuZCBNQ1RMX0tFRVBDT05UUk9MICovCi1zdGF0aWMgdm9pZCBicmNtc19jX21hY19wcm9taXNjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKKy8qCisgKiBTZXQgb3IgY2xlYXIgZmlsdGVyaW5nIHJlbGF0ZWQgbWFjY29udHJvbCBiaXRzIGJhc2VkIG9uCisgKiBzcGVjaWZpZWQgZmlsdGVyIGZsYWdzCisgKi8KK3ZvaWQgYnJjbXNfY19tYWNfcHJvbWlzYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHVpbnQgZmlsdGVyX2ZsYWdzKQogewogCXUzMiBwcm9taXNjX2JpdHMgPSAwOwogCi0JLyoKLQkgKiBwcm9taXNjdW91cyBtb2RlIGp1c3Qgc2V0cyBNQ1RMX1BST01JU0MKLQkgKiBOb3RlOiBBUHMgZ2V0IGFsbCBCU1MgdHJhZmZpYyB3aXRob3V0IHRoZSBuZWVkIHRvIHNldAotCSAqIHRoZSBNQ1RMX1BST01JU0MgYml0IHNpbmNlIGFsbCBCU1MgZGF0YSB0cmFmZmljIGlzCi0JICogZGlyZWN0ZWQgYXQgdGhlIEFQCi0JICovCi0JaWYgKHdsYy0+cHViLT5wcm9taXNjKQorCXdsYy0+ZmlsdGVyX2ZsYWdzID0gZmlsdGVyX2ZsYWdzOworCisJaWYgKGZpbHRlcl9mbGFncyAmIChGSUZfUFJPTUlTQ19JTl9CU1MgfCBGSUZfT1RIRVJfQlNTKSkKIAkJcHJvbWlzY19iaXRzIHw9IE1DVExfUFJPTUlTQzsKIAotCS8qIG1vbml0b3IgbW9kZSBuZWVkcyBib3RoIE1DVExfUFJPTUlTQyBhbmQgTUNUTF9LRUVQQ09OVFJPTAotCSAqIE5vdGU6IG1vbml0b3IgbW9kZSBhbHNvIG5lZWRzIE1DVExfQkNOU19QUk9NSVNDLCBidXQgdGhhdCBpcwotCSAqIGhhbmRsZWQgaW4gYnJjbXNfY19tYWNfYmNuX3Byb21pc2MoKQotCSAqLwotCWlmICh3bGMtPm1vbml0b3IpCi0JCXByb21pc2NfYml0cyB8PSBNQ1RMX1BST01JU0MgfCBNQ1RMX0tFRVBDT05UUk9MOworCWlmIChmaWx0ZXJfZmxhZ3MgJiBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQykKKwkJcHJvbWlzY19iaXRzIHw9IE1DVExfQkNOU19QUk9NSVNDOwogCi0JYnJjbXNfYl9tY3RybCh3bGMtPmh3LCBNQ1RMX1BST01JU0MgfCBNQ1RMX0tFRVBDT05UUk9MLCBwcm9taXNjX2JpdHMpOworCWlmIChmaWx0ZXJfZmxhZ3MgJiBGSUZfRkNTRkFJTCkKKwkJcHJvbWlzY19iaXRzIHw9IE1DVExfS0VFUEJBREZDUzsKKworCWlmIChmaWx0ZXJfZmxhZ3MgJiAoRklGX0NPTlRST0wgfCBGSUZfUFNQT0xMKSkKKwkJcHJvbWlzY19iaXRzIHw9IE1DVExfS0VFUENPTlRST0w7CisKKwlicmNtc19iX21jdHJsKHdsYy0+aHcsCisJCU1DVExfUFJPTUlTQyB8IE1DVExfQkNOU19QUk9NSVNDIHwKKwkJTUNUTF9LRUVQQ09OVFJPTCB8IE1DVExfS0VFUEJBREZDUywKKwkJcHJvbWlzY19iaXRzKTsKIH0KIAogLyoKQEAgLTM3MjEsMTAgKzM2MzAsNiBAQAogCX0gZWxzZSB7CiAJCS8qIGRpc2FibGUgYW4gYWN0aXZlIElCU1MgaWYgd2UgYXJlIG5vdCBvbiB0aGUgaG9tZSBjaGFubmVsICovCiAJfQotCi0JLyogdXBkYXRlIHRoZSB2YXJpb3VzIHByb21pc2MgYml0cyAqLwotCWJyY21zX2NfbWFjX2Jjbl9wcm9taXNjKHdsYyk7Ci0JYnJjbXNfY19tYWNfcHJvbWlzYyh3bGMpOwogfQogCiBzdGF0aWMgdm9pZCBicmNtc19jX3dyaXRlX3JhdGVfc2htKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgdTggcmF0ZSwKQEAgLTM4OTksNyArMzgwNCw3IEBACiAKIAlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IGhwcyAlZFxuIiwgd2xjLT5wdWItPnVuaXQsIGhwcyk7CiAKLQl2MSA9IFJfUkVHKCZ3bGMtPnJlZ3MtPm1hY2NvbnRyb2wpOworCXYxID0gYmNtYV9yZWFkMzIod2xjLT5ody0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSk7CiAJdjIgPSBNQ1RMX1dBS0U7CiAJaWYgKGhwcykKIAkJdjIgfD0gTUNUTF9IUFM7CkBAIC0zOTc5LDcgKzM4ODQsNyBAQAogCiB2b2lkCiBicmNtc19iX3NldF9jaGFuc3BlYyhzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odywgdTE2IGNoYW5zcGVjLAotCQkgICAgICBib29sIG11dGUsIHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQorCQkgICAgICBib29sIG11dGVfdHgsIHN0cnVjdCB0eHB3cl9saW1pdHMgKnR4cHdyKQogewogCXVpbnQgYmFuZHVuaXQ7CiAKQEAgLTQwMDUsNyArMzkxMCw3IEBACiAJCX0KIAl9CiAKLQl3bGNfcGh5X2luaXRjYWxfZW5hYmxlKHdsY19ody0+YmFuZC0+cGksICFtdXRlKTsKKwl3bGNfcGh5X2luaXRjYWxfZW5hYmxlKHdsY19ody0+YmFuZC0+cGksICFtdXRlX3R4KTsKIAogCWlmICghd2xjX2h3LT51cCkgewogCQlpZiAod2xjX2h3LT5jbGspCkBAIC00MDE3LDcgKzM5MjIsNyBAQAogCQl3bGNfcGh5X3R4cG93ZXJfbGltaXRfc2V0KHdsY19ody0+YmFuZC0+cGksIHR4cHdyLCBjaGFuc3BlYyk7CiAKIAkJLyogVXBkYXRlIG11dGluZyBvZiB0aGUgY2hhbm5lbCAqLwotCQlicmNtc19iX211dGUod2xjX2h3LCBtdXRlLCAwKTsKKwkJYnJjbXNfYl9tdXRlKHdsY19odywgbXV0ZV90eCk7CiAJfQogfQogCkBAIC00MjA1LDcgKzQxMTAsNyBAQAogCSAgICBFRENGX1RYT1AyVVNFQyhhY3Bfc2htLnR4b3ApOwogCWFjcF9zaG0uYWlmcyA9IChwYXJhbXMtPmFpZnMgJiBFRENGX0FJRlNOX01BU0spOwogCi0JaWYgKGFjaSA9PSBBQ19WSSAmJiBhY3Bfc2htLnR4b3AgPT0gMAorCWlmIChhY2kgPT0gSUVFRTgwMjExX0FDX1ZJICYmIGFjcF9zaG0udHhvcCA9PSAwCiAJICAgICYmIGFjcF9zaG0uYWlmcyA8IEVEQ0ZfQUlGU05fTUFYKQogCQlhY3Bfc2htLmFpZnMrKzsKIApAQCAtNDIxOCw3ICs0MTIzLDggQEAKIAkJYWNwX3NobS5jd21heCA9IHBhcmFtcy0+Y3dfbWF4OwogCQlhY3Bfc2htLmN3Y3VyID0gYWNwX3NobS5jd21pbjsKIAkJYWNwX3NobS5ic2xvdHMgPQotCQkgICAgUl9SRUcoJndsYy0+cmVncy0+dHNmX3JhbmRvbSkgJiBhY3Bfc2htLmN3Y3VyOworCQkJYmNtYV9yZWFkMTYod2xjLT5ody0+ZDExY29yZSwgRDExUkVHT0ZGUyh0c2ZfcmFuZG9tKSkgJgorCQkJYWNwX3NobS5jd2N1cjsKIAkJYWNwX3NobS5yZWdnYXAgPSBhY3Bfc2htLmJzbG90cyArIGFjcF9zaG0uYWlmczsKIAkJLyogSW5kaWNhdGUgdGhlIG5ldyBwYXJhbXMgdG8gdGhlIHVjb2RlICovCiAJCWFjcF9zaG0uc3RhdHVzID0gYnJjbXNfYl9yZWFkX3NobSh3bGMtPmh3LCAoTV9FRENGX1FJTkZPICsKQEAgLTQyNDIsNyArNDE0OCw3IEBACiAJfQogfQogCi12b2lkIGJyY21zX2NfZWRjZl9zZXRwYXJhbXMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIHN1c3BlbmQpCitzdGF0aWMgdm9pZCBicmNtc19jX2VkY2Zfc2V0cGFyYW1zKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCBzdXNwZW5kKQogewogCXUxNiBhY2k7CiAJaW50IGlfYWM7CkBAIC00MjU1LDcgKzQxNjEsNyBAQAogCX07IC8qIHVjb2RlIG5lZWRzIHRoZXNlIHBhcmFtZXRlcnMgZHVyaW5nIGl0cyBpbml0aWFsaXphdGlvbiAqLwogCWNvbnN0IHN0cnVjdCBlZGNmX2FjcGFyYW0gKmVkY2ZfYWNwID0gJmRlZmF1bHRfZWRjZl9hY3BhcmFtc1swXTsKIAotCWZvciAoaV9hYyA9IDA7IGlfYWMgPCBBQ19DT1VOVDsgaV9hYysrLCBlZGNmX2FjcCsrKSB7CisJZm9yIChpX2FjID0gMDsgaV9hYyA8IElFRUU4MDIxMV9OVU1fQUNTOyBpX2FjKyssIGVkY2ZfYWNwKyspIHsKIAkJLyogZmluZCBvdXQgd2hpY2ggYWMgdGhpcyBzZXQgb2YgcGFyYW1zIGFwcGxpZXMgdG8gKi8KIAkJYWNpID0gKGVkY2ZfYWNwLT5BQ0kgJiBFRENGX0FDSV9NQVNLKSA+PiBFRENGX0FDSV9TSElGVDsKIApAQCAtNDI3NywxNyArNDE4Myw2IEBACiAJfQogfQogCi0vKiBtYWludGFpbiBMRUQgYmVoYXZpb3IgaW4gZG93biBzdGF0ZSAqLwotc3RhdGljIHZvaWQgYnJjbXNfY19kb3duX2xlZF91cGQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCS8qCi0JICogbWFpbnRhaW4gTEVEcyB3aGlsZSBpbiBkb3duIHN0YXRlLCB0dXJuIG9uIHNiY2xrIGlmCi0JICogbm90IGF2YWlsYWJsZSB5ZXQuIFR1cm4gb24gc2JjbGsgaWYgbmVjZXNzYXJ5Ci0JICovCi0JYnJjbXNfYl9wbGxyZXEod2xjLT5odywgdHJ1ZSwgQlJDTVNfUExMUkVRX0ZMSVApOwotCWJyY21zX2JfcGxscmVxKHdsYy0+aHcsIGZhbHNlLCBCUkNNU19QTExSRVFfRkxJUCk7Ci19Ci0KIHN0YXRpYyB2b2lkIGJyY21zX2NfcmFkaW9fbW9uaXRvcl9zdGFydChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCiB7CiAJLyogRG9uJ3Qgc3RhcnQgdGhlIHRpbWVyIGlmIEhXUkFESU8gZmVhdHVyZSBpcyBkaXNhYmxlZCAqLwpAQCAtNDI5OSwyOCArNDE5NCw2IEBACiAJYnJjbXNfYWRkX3RpbWVyKHdsYy0+cmFkaW9fdGltZXIsIFRJTUVSX0lOVEVSVkFMX1JBRElPQ0hLLCB0cnVlKTsKIH0KIAotc3RhdGljIHZvaWQgYnJjbXNfY19yYWRpb19kaXNhYmxlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlpZiAoIXdsYy0+cHViLT51cCkgewotCQlicmNtc19jX2Rvd25fbGVkX3VwZCh3bGMpOwotCQlyZXR1cm47Ci0JfQotCi0JYnJjbXNfY19yYWRpb19tb25pdG9yX3N0YXJ0KHdsYyk7Ci0JYnJjbXNfZG93bih3bGMtPndsKTsKLX0KLQotc3RhdGljIHZvaWQgYnJjbXNfY19yYWRpb19lbmFibGUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQotewotCWlmICh3bGMtPnB1Yi0+dXApCi0JCXJldHVybjsKLQotCWlmIChicmNtc19kZXZpY2VyZW1vdmVkKHdsYykpCi0JCXJldHVybjsKLQotCWJyY21zX3VwKHdsYy0+d2wpOwotfQotCiBzdGF0aWMgYm9vbCBicmNtc19jX3JhZGlvX21vbml0b3Jfc3RvcChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCiB7CiAJaWYgKCF3bGMtPnJhZGlvX21vbml0b3IpCkBAIC00MzQzLDE4ICs0MjE2LDYgQEAKIAkJbWJvb2xjbHIod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkLCBXTF9SQURJT19IV19ESVNBQkxFKTsKIH0KIAotLyoKLSAqIGNlbnRyYWxpemVkIHJhZGlvIGRpc2FibGUvZW5hYmxlIGZ1bmN0aW9uLAotICogaW52b2tlIHJhZGlvIGVuYWJsZS9kaXNhYmxlIGFmdGVyIHVwZGF0aW5nIGh3cmFkaW8gc3RhdHVzCi0gKi8KLXN0YXRpYyB2b2lkIGJyY21zX2NfcmFkaW9fdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlpZiAod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQotCQlicmNtc19jX3JhZGlvX2Rpc2FibGUod2xjKTsKLQllbHNlCi0JCWJyY21zX2NfcmFkaW9fZW5hYmxlKHdsYyk7Ci19Ci0KIC8qIHVwZGF0ZSBod3JhZGlvIHN0YXR1cyBhbmQgcmV0dXJuIGl0ICovCiBib29sIGJyY21zX2NfY2hlY2tfcmFkaW9fZGlzYWJsZWQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKQogewpAQCAtNDM3NiwxMiArNDIzNyw3IEBACiAJCXJldHVybjsKIAl9CiAKLQkvKiBjYXAgbXBjIG9mZiBjb3VudCAqLwotCWlmICh3bGMtPm1wY19vZmZjbnQgPCBCUkNNU19NUENfTUFYX0RFTEFZQ05UKQotCQl3bGMtPm1wY19vZmZjbnQrKzsKLQogCWJyY21zX2NfcmFkaW9faHdkaXNhYmxlX3VwZCh3bGMpOwotCWJyY21zX2NfcmFkaW9fdXBkKHdsYyk7CiB9CiAKIC8qIGNvbW1vbiBsb3ctbGV2ZWwgd2F0Y2hkb2cgY29kZSAqLwpAQCAtNDQwNyw2MCArNDI2Myw2IEBACiAJd2xjX3BoeV93YXRjaGRvZyh3bGNfaHctPmJhbmQtPnBpKTsKIH0KIAotc3RhdGljIHZvaWQgYnJjbXNfY19yYWRpb19tcGNfdXBkKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKLXsKLQlib29sIG1wY19yYWRpbywgcmFkaW9fc3RhdGU7Ci0KLQkvKgotCSAqIENsZWFyIHRoZSBXTF9SQURJT19NUENfRElTQUJMRSBiaXQgd2hlbiBtcGMgZmVhdHVyZSBpcyBkaXNhYmxlZAotCSAqIGluIGNhc2UgdGhlIFdMX1JBRElPX01QQ19ESVNBQkxFIGJpdCB3YXMgc2V0LiBTdG9wIHRoZSByYWRpbwotCSAqIG1vbml0b3IgYWxzbyB3aGVuIFdMX1JBRElPX01QQ19ESVNBQkxFIGlzIHRoZSBvbmx5IHJlYXNvbiB0aGF0Ci0JICogdGhlIHJhZGlvIGlzIGdvaW5nIGRvd24uCi0JICovCi0JaWYgKCF3bGMtPm1wYykgewotCQlpZiAoIXdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCkKLQkJCXJldHVybjsKLQkJbWJvb2xjbHIod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkLCBXTF9SQURJT19NUENfRElTQUJMRSk7Ci0JCWJyY21zX2NfcmFkaW9fdXBkKHdsYyk7Ci0JCWlmICghd2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQotCQkJYnJjbXNfY19yYWRpb19tb25pdG9yX3N0b3Aod2xjKTsKLQkJcmV0dXJuOwotCX0KLQotCS8qCi0JICogc3luYyBpc21wYyBsb2dpYyB3aXRoIFdMX1JBRElPX01QQ19ESVNBQkxFIGJpdCBpbgotCSAqIHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCB0byBnbyBPTiwgYWx3YXlzIGNhbGwgcmFkaW9fdXBkCi0JICogc3luY2hyb25vdXNseSB0byBnbyBPRkYsIHBvc3Rwb25lIHJhZGlvX3VwZCB0byBsYXRlciB3aGVuCi0JICogY29udGV4dCBpcyBzYWZlKGUuZy4gd2F0Y2hkb2cpCi0JICovCi0JcmFkaW9fc3RhdGUgPQotCSAgICAobWJvb2xpc3NldCh3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQsIFdMX1JBRElPX01QQ19ESVNBQkxFKSA/IE9GRiA6Ci0JICAgICBPTik7Ci0JbXBjX3JhZGlvID0gKGJyY21zX2NfaXNtcGMod2xjKSA9PSB0cnVlKSA/IE9GRiA6IE9OOwotCi0JaWYgKHJhZGlvX3N0YXRlID09IE9OICYmIG1wY19yYWRpbyA9PSBPRkYpCi0JCXdsYy0+bXBjX2RlbGF5X29mZiA9IHdsYy0+bXBjX2RseWNudDsKLQllbHNlIGlmIChyYWRpb19zdGF0ZSA9PSBPRkYgJiYgbXBjX3JhZGlvID09IE9OKSB7Ci0JCW1ib29sY2xyKHdsYy0+cHViLT5yYWRpb19kaXNhYmxlZCwgV0xfUkFESU9fTVBDX0RJU0FCTEUpOwotCQlicmNtc19jX3JhZGlvX3VwZCh3bGMpOwotCQlpZiAod2xjLT5tcGNfb2ZmY250IDwgQlJDTVNfTVBDX1RIUkVTSE9MRCkKLQkJCXdsYy0+bXBjX2RseWNudCA9IEJSQ01TX01QQ19NQVhfREVMQVlDTlQ7Ci0JCWVsc2UKLQkJCXdsYy0+bXBjX2RseWNudCA9IEJSQ01TX01QQ19NSU5fREVMQVlDTlQ7Ci0JfQotCS8qCi0JICogQmVsb3cgbG9naWMgaXMgbWVhbnQgdG8gY2FwdHVyZSB0aGUgdHJhbnNpdGlvbiBmcm9tIG1wYyBvZmYKLQkgKiB0byBtcGMgb24gZm9yIHJlYXNvbnMgb3RoZXIgdGhhbiB3bGMtPm1wY19kZWxheV9vZmYga2VlcGluZwotCSAqIHRoZSBtcGMgb2ZmLiBJbiB0aGF0IGNhc2UgcmVzZXQgd2xjLT5tcGNfZGVsYXlfb2ZmIHRvCi0JICogd2xjLT5tcGNfZGx5Y250LCBzbyB0aGF0IHdlIHJlc3RhcnQgdGhlIGNvdW50ZG93biBvZiBtcGNfZGVsYXlfb2ZmCi0JICovCi0JaWYgKCh3bGMtPnByZXZfbm9uX2RlbGF5X21wYyA9PSBmYWxzZSkgJiYKLQkgICAgKGJyY21zX2NfaXNfbm9uX2RlbGF5X21wYyh3bGMpID09IHRydWUpICYmIHdsYy0+bXBjX2RlbGF5X29mZikKLQkJd2xjLT5tcGNfZGVsYXlfb2ZmID0gd2xjLT5tcGNfZGx5Y250OwotCi0Jd2xjLT5wcmV2X25vbl9kZWxheV9tcGMgPSBicmNtc19jX2lzX25vbl9kZWxheV9tcGMod2xjKTsKLX0KLQogLyogY29tbW9uIHdhdGNoZG9nIGNvZGUgKi8KIHN0YXRpYyB2b2lkIGJyY21zX2Nfd2F0Y2hkb2codm9pZCAqYXJnKQogewpAQCAtNDQ4MSwyMSArNDI4Myw3IEBACiAJLyogaW5jcmVtZW50IHNlY29uZCBjb3VudCAqLwogCXdsYy0+cHViLT5ub3crKzsKIAotCS8qIGRlbGF5IHJhZGlvIGRpc2FibGUgKi8KLQlpZiAod2xjLT5tcGNfZGVsYXlfb2ZmKSB7Ci0JCWlmICgtLXdsYy0+bXBjX2RlbGF5X29mZiA9PSAwKSB7Ci0JCQltYm9vbHNldCh3bGMtPnB1Yi0+cmFkaW9fZGlzYWJsZWQsCi0JCQkJIFdMX1JBRElPX01QQ19ESVNBQkxFKTsKLQkJCWlmICh3bGMtPm1wYyAmJiBicmNtc19jX2lzbXBjKHdsYykpCi0JCQkJd2xjLT5tcGNfb2ZmY250ID0gMDsKLQkJfQotCX0KLQotCS8qIG1wYyBzeW5jICovCi0JYnJjbXNfY19yYWRpb19tcGNfdXBkKHdsYyk7Ci0JLyogcmFkaW8gc3luYzogc3cvaHcvbXBjIC0tPiByYWRpb19kaXNhYmxlL3JhZGlvX2VuYWJsZSAqLwogCWJyY21zX2NfcmFkaW9faHdkaXNhYmxlX3VwZCh3bGMpOwotCWJyY21zX2NfcmFkaW9fdXBkKHdsYyk7CiAJLyogaWYgcmFkaW8gaXMgZGlzYWJsZSwgZHJpdmVyIG1heSBiZSBkb3duLCBxdWl0IGhlcmUgKi8KIAlpZiAod2xjLT5wdWItPnJhZGlvX2Rpc2FibGVkKQogCQlyZXR1cm47CkBAIC00NTk5LDkgKzQzODcsNiBAQAogCS8qIFdNRSBRb1MgbW9kZSBpcyBBdXRvIGJ5IGRlZmF1bHQgKi8KIAl3bGMtPnB1Yi0+X2FtcGR1ID0gQU1QRFVfQUdHX0hPU1Q7CiAJd2xjLT5wdWItPmJjbWVycm9yID0gMDsKLQotCS8qIGluaXRpYWxpemUgbXBjIGRlbGF5ICovCi0Jd2xjLT5tcGNfZGVsYXlfb2ZmID0gd2xjLT5tcGNfZGx5Y250ID0gQlJDTVNfTVBDX01JTl9ERUxBWUNOVDsKIH0KIAogc3RhdGljIHVpbnQgYnJjbXNfY19hdHRhY2hfbW9kdWxlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYykKQEAgLTQ2NDcsMjEgKzQ0MzIsMjEgQEAKICAqICAgIGluaXRpYWxpemUgc29mdHdhcmUgc3RhdGUgZm9yIGVhY2ggY29yZSBhbmQgYmFuZAogICogICAgcHV0IHRoZSB3aG9sZSBjaGlwIGluIHJlc2V0KGRyaXZlciBkb3duIHN0YXRlKSwgbm8gY2xvY2sKICAqLwotc3RhdGljIGludCBicmNtc19iX2F0dGFjaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsCi0JCQkgIHVpbnQgdW5pdCwgYm9vbCBwaW9tb2RlLCB2b2lkIF9faW9tZW0gKnJlZ3N2YSwKLQkJCSAgc3RydWN0IHBjaV9kZXYgKmJ0cGFyYW0pCitzdGF0aWMgaW50IGJyY21zX2JfYXR0YWNoKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLAorCQkJICB1aW50IHVuaXQsIGJvb2wgcGlvbW9kZSkKIHsKIAlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKndsY19odzsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOwogCWNoYXIgKm1hY2FkZHIgPSBOVUxMOwogCXVpbnQgZXJyID0gMDsKIAl1aW50IGo7CiAJYm9vbCB3bWUgPSBmYWxzZTsKIAlzdHJ1Y3Qgc2hhcmVkX3BoeV9wYXJhbXMgc2hhX3BhcmFtczsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjLT53aXBoeTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2ID0gY29yZS0+YnVzLT5ob3N0X3BjaTsKIAotCUJDTU1TRyh3bGMtPndpcGh5LCAid2wlZDogdmVuZG9yIDB4JXggZGV2aWNlIDB4JXhcbiIsIHVuaXQsIHZlbmRvciwKLQkJZGV2aWNlKTsKKwlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IHZlbmRvciAweCV4IGRldmljZSAweCV4XG4iLCB1bml0LAorCSAgICAgICBwY2lkZXYtPnZlbmRvciwKKwkgICAgICAgcGNpZGV2LT5kZXZpY2UpOwogCiAJd21lID0gdHJ1ZTsKIApAQCAtNDY3OCw3ICs0NDYzLDcgQEAKIAkgKiBEbyB0aGUgaGFyZHdhcmUgcG9ydGlvbiBvZiB0aGUgYXR0YWNoLiBBbHNvIGluaXRpYWxpemUgc29mdHdhcmUKIAkgKiBzdGF0ZSB0aGF0IGRlcGVuZHMgb24gdGhlIHBhcnRpY3VsYXIgaGFyZHdhcmUgd2UgYXJlIHJ1bm5pbmcuCiAJICovCi0Jd2xjX2h3LT5zaWggPSBhaV9hdHRhY2gocmVnc3ZhLCBidHBhcmFtKTsKKwl3bGNfaHctPnNpaCA9IGFpX2F0dGFjaChjb3JlLT5idXMpOwogCWlmICh3bGNfaHctPnNpaCA9PSBOVUxMKSB7CiAJCXdpcGh5X2Vycih3aXBoeSwgIndsJWQ6IGJyY21zX2JfYXR0YWNoOiBzaV9hdHRhY2ggZmFpbGVkXG4iLAogCQkJICB1bml0KTsKQEAgLTQ2ODcsMjUgKzQ0NzIsMTkgQEAKIAl9CiAKIAkvKiB2ZXJpZnkgYWdhaW4gdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKi8KLQlpZiAoIWJyY21zX2NfY2hpcG1hdGNoKHZlbmRvciwgZGV2aWNlKSkgeworCWlmICghYnJjbXNfY19jaGlwbWF0Y2gocGNpZGV2LT52ZW5kb3IsIHBjaWRldi0+ZGV2aWNlKSkgewogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiBicmNtc19iX2F0dGFjaDogVW5zdXBwb3J0ZWQgIgogCQkJInZlbmRvci9kZXZpY2UgKDB4JXgvMHgleClcbiIsCi0JCQkgdW5pdCwgdmVuZG9yLCBkZXZpY2UpOworCQkJIHVuaXQsIHBjaWRldi0+dmVuZG9yLCBwY2lkZXYtPmRldmljZSk7CiAJCWVyciA9IDEyOwogCQlnb3RvIGZhaWw7CiAJfQogCi0Jd2xjX2h3LT52ZW5kb3JpZCA9IHZlbmRvcjsKLQl3bGNfaHctPmRldmljZWlkID0gZGV2aWNlOworCXdsY19ody0+dmVuZG9yaWQgPSBwY2lkZXYtPnZlbmRvcjsKKwl3bGNfaHctPmRldmljZWlkID0gcGNpZGV2LT5kZXZpY2U7CiAKLQkvKiBzZXQgYmFyMCB3aW5kb3cgdG8gcG9pbnQgYXQgRDExIGNvcmUgKi8KLQl3bGNfaHctPnJlZ3MgPSAoc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqKQotCQkJCWFpX3NldGNvcmUod2xjX2h3LT5zaWgsIEQxMV9DT1JFX0lELCAwKTsKLQl3bGNfaHctPmNvcmVyZXYgPSBhaV9jb3JlcmV2KHdsY19ody0+c2loKTsKLQotCXJlZ3MgPSB3bGNfaHctPnJlZ3M7Ci0KLQl3bGMtPnJlZ3MgPSB3bGNfaHctPnJlZ3M7CisJd2xjX2h3LT5kMTFjb3JlID0gY29yZTsKKwl3bGNfaHctPmNvcmVyZXYgPSBjb3JlLT5pZC5yZXY7CiAKIAkvKiB2YWxpZGF0ZSBjaGlwLCBjaGlwcmV2IGFuZCBjb3JlcmV2ICovCiAJaWYgKCFicmNtc19jX2lzZ29vZGNoaXAod2xjX2h3KSkgewpAQCAtNDc0MCw4ICs0NTE5LDkgQEAKIAl3bGNfaHctPmJvYXJkcmV2ID0gKHUxNikgajsKIAlpZiAoIWJyY21zX2NfdmFsaWRib2FyZHR5cGUod2xjX2h3KSkgewogCQl3aXBoeV9lcnIod2lwaHksICJ3bCVkOiBicmNtc19iX2F0dGFjaDogVW5zdXBwb3J0ZWQgQnJvYWRjb20gIgotCQkJImJvYXJkIHR5cGUgKDB4JXgpIiAiIG9yIHJldmlzaW9uIGxldmVsICgweCV4KVxuIiwKLQkJCSB1bml0LCB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlLCB3bGNfaHctPmJvYXJkcmV2KTsKKwkJCSAgImJvYXJkIHR5cGUgKDB4JXgpIiAiIG9yIHJldmlzaW9uIGxldmVsICgweCV4KVxuIiwKKwkJCSAgdW5pdCwgYWlfZ2V0X2JvYXJkdHlwZSh3bGNfaHctPnNpaCksCisJCQkgIHdsY19ody0+Ym9hcmRyZXYpOwogCQllcnIgPSAxNTsKIAkJZ290byBmYWlsOwogCX0KQEAgLTQ3NjIsNyArNDU0Miw3IEBACiAJZWxzZQogCQl3bGNfaHctPl9uYmFuZHMgPSAxOwogCi0JaWYgKCh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkKKwlpZiAoKGFpX2dldF9jaGlwX2lkKHdsY19ody0+c2loKSA9PSBCQ000MzIyNV9DSElQX0lEKSkKIAkJd2xjX2h3LT5fbmJhbmRzID0gMTsKIAogCS8qIEJNQUNfTk9URTogcmVtb3ZlIGluaXQgb2YgcHViIHZhbHVlcyB3aGVuIGJyY21zX2NfYXR0YWNoKCkKQEAgLTQ3OTQsMTYgKzQ1NzQsMTQgQEAKIAlzaGFfcGFyYW1zLmNvcmVyZXYgPSB3bGNfaHctPmNvcmVyZXY7CiAJc2hhX3BhcmFtcy52aWQgPSB3bGNfaHctPnZlbmRvcmlkOwogCXNoYV9wYXJhbXMuZGlkID0gd2xjX2h3LT5kZXZpY2VpZDsKLQlzaGFfcGFyYW1zLmNoaXAgPSB3bGNfaHctPnNpaC0+Y2hpcDsKLQlzaGFfcGFyYW1zLmNoaXByZXYgPSB3bGNfaHctPnNpaC0+Y2hpcHJldjsKLQlzaGFfcGFyYW1zLmNoaXBwa2cgPSB3bGNfaHctPnNpaC0+Y2hpcHBrZzsKKwlzaGFfcGFyYW1zLmNoaXAgPSBhaV9nZXRfY2hpcF9pZCh3bGNfaHctPnNpaCk7CisJc2hhX3BhcmFtcy5jaGlwcmV2ID0gYWlfZ2V0X2NoaXByZXYod2xjX2h3LT5zaWgpOworCXNoYV9wYXJhbXMuY2hpcHBrZyA9IGFpX2dldF9jaGlwcGtnKHdsY19ody0+c2loKTsKIAlzaGFfcGFyYW1zLnNyb21yZXYgPSB3bGNfaHctPnNyb21yZXY7Ci0Jc2hhX3BhcmFtcy5ib2FyZHR5cGUgPSB3bGNfaHctPnNpaC0+Ym9hcmR0eXBlOworCXNoYV9wYXJhbXMuYm9hcmR0eXBlID0gYWlfZ2V0X2JvYXJkdHlwZSh3bGNfaHctPnNpaCk7CiAJc2hhX3BhcmFtcy5ib2FyZHJldiA9IHdsY19ody0+Ym9hcmRyZXY7Ci0Jc2hhX3BhcmFtcy5ib2FyZHZlbmRvciA9IHdsY19ody0+c2loLT5ib2FyZHZlbmRvcjsKIAlzaGFfcGFyYW1zLmJvYXJkZmxhZ3MgPSB3bGNfaHctPmJvYXJkZmxhZ3M7CiAJc2hhX3BhcmFtcy5ib2FyZGZsYWdzMiA9IHdsY19ody0+Ym9hcmRmbGFnczI7Ci0Jc2hhX3BhcmFtcy5idXNjb3JlcmV2ID0gd2xjX2h3LT5zaWgtPmJ1c2NvcmVyZXY7CiAKIAkvKiBhbGxvYyBhbmQgc2F2ZSBwb2ludGVyIHRvIHNoYXJlZCBwaHkgc3RhdGUgYXJlYSAqLwogCXdsY19ody0+cGh5X3NoID0gd2xjX3BoeV9zaGFyZWRfYXR0YWNoKCZzaGFfcGFyYW1zKTsKQEAgLTQ4MjUsOSArNDYwMyw5IEBACiAJCXdsY19ody0+YmFuZC0+YmFuZHR5cGUgPSBqID8gQlJDTV9CQU5EXzVHIDogQlJDTV9CQU5EXzJHOwogCQl3bGMtPmJhbmQtPmJhbmR1bml0ID0gajsKIAkJd2xjLT5iYW5kLT5iYW5kdHlwZSA9IGogPyBCUkNNX0JBTkRfNUcgOiBCUkNNX0JBTkRfMkc7Ci0JCXdsYy0+Y29yZS0+Y29yZWlkeCA9IGFpX2NvcmVpZHgod2xjX2h3LT5zaWgpOworCQl3bGMtPmNvcmUtPmNvcmVpZHggPSBjb3JlLT5jb3JlX2luZGV4OwogCi0JCXdsY19ody0+bWFjaHdjYXAgPSBSX1JFRygmcmVncy0+bWFjaHdjYXApOworCQl3bGNfaHctPm1hY2h3Y2FwID0gYmNtYV9yZWFkMzIoY29yZSwgRDExUkVHT0ZGUyhtYWNod2NhcCkpOwogCQl3bGNfaHctPm1hY2h3Y2FwX2JhY2t1cCA9IHdsY19ody0+bWFjaHdjYXA7CiAKIAkJLyogaW5pdCB0eCBmaWZvIHNpemUgKi8KQEAgLTQ4MzYsNyArNDYxNCw3IEBACiAKIAkJLyogR2V0IGEgcGh5IGZvciB0aGlzIGJhbmQgKi8KIAkJd2xjX2h3LT5iYW5kLT5waSA9Ci0JCQl3bGNfcGh5X2F0dGFjaCh3bGNfaHctPnBoeV9zaCwgcmVncywKKwkJCXdsY19waHlfYXR0YWNoKHdsY19ody0+cGh5X3NoLCBjb3JlLAogCQkJCSAgICAgICB3bGNfaHctPmJhbmQtPmJhbmR0eXBlLAogCQkJCSAgICAgICB3bGMtPndpcGh5KTsKIAkJaWYgKHdsY19ody0+YmFuZC0+cGkgPT0gTlVMTCkgewpAQCAtNDkxMCwxMCArNDY4OCw2IEBACiAJLyogTWF0Y2ggZHJpdmVyICJkb3duIiBzdGF0ZSAqLwogCWFpX3BjaV9kb3duKHdsY19ody0+c2loKTsKIAotCS8qIHJlZ2lzdGVyIHNiIGludGVycnVwdCBjYWxsYmFjayBmdW5jdGlvbnMgKi8KLQlhaV9yZWdpc3Rlcl9pbnRyX2NhbGxiYWNrKHdsY19ody0+c2loLCAodm9pZCAqKWJyY21zX2Nfd2xpbnRyc29mZiwKLQkJCQkgICh2b2lkICopYnJjbXNfY193bGludHJzcmVzdG9yZSwgTlVMTCwgd2xjKTsKLQogCS8qIHR1cm4gb2ZmIHBsbCBhbmQgeHRhbCB0byBtYXRjaCBkcml2ZXIgImRvd24iIHN0YXRlICovCiAJYnJjbXNfYl94dGFsKHdsY19odywgT0ZGKTsKIApAQCAtNDk0NCwxMCArNDcxOCw5IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKLQlCQ01NU0cod2xjLT53aXBoeSwKLQkJICJkZXZpY2VpZCAweCV4IG5iYW5kcyAlZCBib2FyZCAweCV4IG1hY2FkZHI6ICVzXG4iLAotCQkgd2xjX2h3LT5kZXZpY2VpZCwgd2xjX2h3LT5fbmJhbmRzLAotCQkgd2xjX2h3LT5zaWgtPmJvYXJkdHlwZSwgbWFjYWRkcik7CisJQkNNTVNHKHdsYy0+d2lwaHksICJkZXZpY2VpZCAweCV4IG5iYW5kcyAlZCBib2FyZCAweCV4IG1hY2FkZHI6ICVzXG4iLAorCSAgICAgICB3bGNfaHctPmRldmljZWlkLCB3bGNfaHctPl9uYmFuZHMsIGFpX2dldF9ib2FyZHR5cGUod2xjX2h3LT5zaWgpLAorCSAgICAgICBtYWNhZGRyKTsKIAogCXJldHVybiBlcnI7CiAKQEAgLTUxODUsNyArNDk1OCw2IEBACiAJCSAqIGFuZCBwZXItcG9ydCBpbnRlcnJ1cHQgb2JqZWN0IG1heSBoYXMgYmVlbiBmcmVlZC4gdGhpcyBtdXN0CiAJCSAqIGJlIGRvbmUgYmVmb3JlIHNiIGNvcmUgc3dpdGNoCiAJCSAqLwotCQlhaV9kZXJlZ2lzdGVyX2ludHJfY2FsbGJhY2sod2xjX2h3LT5zaWgpOwogCQlhaV9wY2lfc2xlZXAod2xjX2h3LT5zaWgpOwogCX0KIApAQCAtNTI1OSw5ICs1MDMxLDYgQEAKIHsKIAkvKiBTVEEtQlNTOyBzaG9ydCBjYXBhYmxlICovCiAJd2xjLT5QTENQSGRyX292ZXJyaWRlID0gQlJDTVNfUExDUF9TSE9SVDsKLQotCS8qIGZpeHVwIG1wYyAqLwotCXdsYy0+bXBjID0gdHJ1ZTsKIH0KIAogLyogSW5pdGlhbGl6ZSBqdXN0IHRoZSBoYXJkd2FyZSB3aGVuIGNvbWluZyBvdXQgb2YgUE9SIG9yIFMzL1M1IHN5c3RlbSBzdGF0ZXMgKi8KQEAgLTUyODMsMTMgKzUwNTIsMTEgQEAKIAlhaV9wY2lfZml4Y2ZnKHdsY19ody0+c2loKTsKIAogCS8qCisJICogVE9ETzogdGVzdCBzdXNwZW5kL3Jlc3VtZQorCSAqCiAJICogQUkgY2hpcCBkb2Vzbid0IHJlc3RvcmUgYmFyMHdpbjIgb24KIAkgKiBoaWJlcm5hdGlvbi9yZXN1bWUsIG5lZWQgc3cgZml4dXAKIAkgKi8KLQlpZiAoKHdsY19ody0+c2loLT5jaGlwID09IEJDTTQzMjI0X0NISVBfSUQpIHx8Ci0JICAgICh3bGNfaHctPnNpaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkKLQkJd2xjX2h3LT5yZWdzID0gKHN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKikKLQkJCQlhaV9zZXRjb3JlKHdsY19ody0+c2loLCBEMTFfQ09SRV9JRCwgMCk7CiAKIAkvKgogCSAqIEluZm9ybSBwaHkgdGhhdCBhIFBPUiByZXNldCBoYXMgb2NjdXJyZWQgc28KQEAgLTUzMDEsNyArNTA2OCw3IEBACiAJd2xjX2h3LT53bGMtPnB1Yi0+aHdfdXAgPSB0cnVlOwogCiAJaWYgKCh3bGNfaHctPmJvYXJkZmxhZ3MgJiBCRkxfRkVNKQotCSAgICAmJiAod2xjX2h3LT5zaWgtPmNoaXAgPT0gQkNNNDMxM19DSElQX0lEKSkgeworCSAgICAmJiAoYWlfZ2V0X2NoaXBfaWQod2xjX2h3LT5zaWgpID09IEJDTTQzMTNfQ0hJUF9JRCkpIHsKIAkJaWYgKCEKIAkJICAgICh3bGNfaHctPmJvYXJkcmV2ID49IDB4MTI1MAogCQkgICAgICYmICh3bGNfaHctPmJvYXJkZmxhZ3MgJiBCRkxfRkVNX0JUKSkpCkBAIC01Mzc2LDcgKzUxNDMsNyBAQAogCWlmICghd2xjLT5jbGspCiAJCXJldHVybjsKIAotCWZvciAoYWMgPSAwOyBhYyA8IEFDX0NPVU5UOyBhYysrKQorCWZvciAoYWMgPSAwOyBhYyA8IElFRUU4MDIxMV9OVU1fQUNTOyBhYysrKQogCQlicmNtc19iX3dyaXRlX3NobSh3bGMtPmh3LCBNX0FDX1RYTE1UX0FERFIoYWMpLAogCQkJCSAgd2xjLT53bWVfcmV0cmllc1thY10pOwogfQpAQCAtNTM5Niw3ICs1MTYzLDcgQEAKIAl9CiAKIAlpZiAoKHdsYy0+cHViLT5ib2FyZGZsYWdzICYgQkZMX0ZFTSkKLQkgICAgJiYgKHdsYy0+cHViLT5zaWgtPmNoaXAgPT0gQkNNNDMxM19DSElQX0lEKSkgeworCSAgICAmJiAoYWlfZ2V0X2NoaXBfaWQod2xjLT5ody0+c2loKSA9PSBCQ000MzEzX0NISVBfSUQpKSB7CiAJCWlmICh3bGMtPnB1Yi0+Ym9hcmRyZXYgPj0gMHgxMjUwCiAJCSAgICAmJiAod2xjLT5wdWItPmJvYXJkZmxhZ3MgJiBCRkxfRkVNX0JUKSkKIAkJCWJyY21zX2JfbWhmKHdsYy0+aHcsIE1IRjUsIE1IRjVfNDMxM19HUElPQ1RSTCwKQEAgLTU1MzMsOSArNTMwMCw5IEBACiAJfSBlbHNlIHsKIAogCQkvKiBSZXNldCBhbmQgZGlzYWJsZSB0aGUgY29yZSAqLwotCQlpZiAoYWlfaXNjb3JldXAod2xjX2h3LT5zaWgpKSB7Ci0JCQlpZiAoUl9SRUcoJndsY19ody0+cmVncy0+bWFjY29udHJvbCkgJgotCQkJICAgIE1DVExfRU5fTUFDKQorCQlpZiAoYmNtYV9jb3JlX2lzX2VuYWJsZWQod2xjX2h3LT5kMTFjb3JlKSkgeworCQkJaWYgKGJjbWFfcmVhZDMyKHdsY19ody0+ZDExY29yZSwKKwkJCQkJRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJiBNQ1RMX0VOX01BQykKIAkJCQlicmNtc19jX3N1c3BlbmRfbWFjX2FuZF93YWl0KHdsY19ody0+d2xjKTsKIAkJCWNhbGxiYWNrcyArPSBicmNtc19yZXNldCh3bGNfaHctPndsYy0+d2wpOwogCQkJYnJjbXNfY19jb3JlZGlzYWJsZSh3bGNfaHcpOwpAQCAtNTU3NSw3ICs1MzQyLDYgQEAKIAlpZiAoIXdsYy0+cHViLT51cCkKIAkJcmV0dXJuIGNhbGxiYWNrczsKIAotCS8qIGluIGJldHdlZW4sIG1wYyBjb3VsZCB0cnkgdG8gYnJpbmcgZG93biBhZ2Fpbi4uICovCiAJd2xjLT5nb2luZ19kb3duID0gdHJ1ZTsKIAogCWNhbGxiYWNrcyArPSBicmNtc19iX2JtYWNfZG93bl9wcmVwKHdsYy0+aHcpOwpAQCAtNTg1Miw3ICs1NjE4LDcgQEAKIAogCWJyY21zX2JfcmV0cnlsaW1pdF91cGQod2xjLT5odywgd2xjLT5TUkwsIHdsYy0+TFJMKTsKIAotCWZvciAoYWMgPSAwOyBhYyA8IEFDX0NPVU5UOyBhYysrKSB7CisJZm9yIChhYyA9IDA7IGFjIDwgSUVFRTgwMjExX05VTV9BQ1M7IGFjKyspIHsKIAkJd2xjLT53bWVfcmV0cmllc1thY10gPQlTRklFTEQod2xjLT53bWVfcmV0cmllc1thY10sCiAJCQkJCSAgICAgICBFRENGX1NIT1JULCAgd2xjLT5TUkwpOwogCQl3bGMtPndtZV9yZXRyaWVzW2FjXSA9CVNGSUVMRCh3bGMtPndtZV9yZXRyaWVzW2FjXSwKQEAgLTYxMDMsNyArNTg2OSw2IEBACiAKIAl1OCAqcnRzcGggPSB0eGgtPlJUU1BoeUhlYWRlcjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J0cyBydHMgPSB0eGgtPnJ0c19mcmFtZTsKLQljaGFyIGhleGJ1ZlsyNTZdOwogCiAJLyogYWRkIHBsY3AgaGVhZGVyIGFsb25nIHdpdGggdHhoIGRlc2NyaXB0b3IgKi8KIAlwcmludGsoS0VSTl9ERUJVRyAiUmF3IFR4RGVzYyArIHBsY3AgaGVhZGVyOlxuIik7CkBAIC02MTI0LDE3ICs1ODg5LDE2IEBACiAJcHJpbnRrKEtFUk5fREVCVUcgIlh0cmFGcmFtZVR5cGVzOiAlMDR4ICIsIHh0cmFmdCk7CiAJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CiAKLQlicmNtdV9mb3JtYXRfaGV4KGhleGJ1ZiwgaXYsIHNpemVvZih0eGgtPklWKSk7Ci0JcHJpbnRrKEtFUk5fREVCVUcgIlNlY0lWOiAgICAgICAlc1xuIiwgaGV4YnVmKTsKLQlicmNtdV9mb3JtYXRfaGV4KGhleGJ1ZiwgcmEsIHNpemVvZih0eGgtPlR4RnJhbWVSQSkpOwotCXByaW50ayhLRVJOX0RFQlVHICJSQTogICAgICAgICAgJXNcbiIsIGhleGJ1Zik7CisJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIlNlY0lWOiIsIERVTVBfUFJFRklYX09GRlNFVCwgaXYsIHNpemVvZih0eGgtPklWKSk7CisJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIlJBOiIsIERVTVBfUFJFRklYX09GRlNFVCwKKwkJCSAgICAgcmEsIHNpemVvZih0eGgtPlR4RnJhbWVSQSkpOwogCiAJcHJpbnRrKEtFUk5fREVCVUcgIkZiIEZFUyBUaW1lOiAlMDR4ICIsIHRmZXN0ZmIpOwotCWJyY211X2Zvcm1hdF9oZXgoaGV4YnVmLCBydHNwZmIsIHNpemVvZih0eGgtPlJUU1BMQ1BGYWxsYmFjaykpOwotCXByaW50ayhLRVJOX0RFQlVHICJSVFMgUExDUDogJXMgIiwgaGV4YnVmKTsKKwlwcmludF9oZXhfZHVtcF9ieXRlcygiRmIgUlRTIFBMQ1A6IiwgRFVNUF9QUkVGSVhfT0ZGU0VULAorCQkJICAgICBydHNwZmIsIHNpemVvZih0eGgtPlJUU1BMQ1BGYWxsYmFjaykpOwogCXByaW50ayhLRVJOX0RFQlVHICJSVFMgRFVSOiAlMDR4ICIsIHJ0c2RmYik7Ci0JYnJjbXVfZm9ybWF0X2hleChoZXhidWYsIGZyYWdwZmIsIHNpemVvZih0eGgtPkZyYWdQTENQRmFsbGJhY2spKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiUExDUDogJXMgIiwgaGV4YnVmKTsKKwlwcmludF9oZXhfZHVtcF9ieXRlcygiUExDUDoiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCisJCQkgICAgIGZyYWdwZmIsIHNpemVvZih0eGgtPkZyYWdQTENQRmFsbGJhY2spKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiRFVSOiAlMDR4IiwgZnJhZ2RmYik7CiAJcHJpbnRrKEtFUk5fREVCVUcgIlxuIik7CiAKQEAgLTYxNDksMTggKzU5MTMsMTggQEAKIAlwcmludGsoS0VSTl9ERUJVRyAiTWF4QWdnYnl0ZV9mYjogICUwNHhcbiIsIG1hYnl0ZV9mKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiTWluQnl0ZTogICAgICUwNHhcbiIsIG1tYnl0ZSk7CiAKLQlicmNtdV9mb3JtYXRfaGV4KGhleGJ1ZiwgcnRzcGgsIHNpemVvZih0eGgtPlJUU1BoeUhlYWRlcikpOwotCXByaW50ayhLRVJOX0RFQlVHICJSVFMgUExDUDogJXMgIiwgaGV4YnVmKTsKLQlicmNtdV9mb3JtYXRfaGV4KGhleGJ1ZiwgKHU4ICopICZydHMsIHNpemVvZih0eGgtPnJ0c19mcmFtZSkpOwotCXByaW50ayhLRVJOX0RFQlVHICJSVFMgRnJhbWU6ICVzIiwgaGV4YnVmKTsKKwlwcmludF9oZXhfZHVtcF9ieXRlcygiUlRTIFBMQ1A6IiwgRFVNUF9QUkVGSVhfT0ZGU0VULAorCQkJICAgICBydHNwaCwgc2l6ZW9mKHR4aC0+UlRTUGh5SGVhZGVyKSk7CisJcHJpbnRfaGV4X2R1bXBfYnl0ZXMoIlJUUyBGcmFtZToiLCBEVU1QX1BSRUZJWF9PRkZTRVQsCisJCQkgICAgICh1OCAqKSZydHMsIHNpemVvZih0eGgtPnJ0c19mcmFtZSkpOwogCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOwogfQogI2VuZGlmCQkJCS8qIGRlZmluZWQoQkNNREJHKSAqLwogCiAjaWYgZGVmaW5lZChCQ01EQkcpCi1pbnQKK3N0YXRpYyBpbnQKIGJyY21zX2NfZm9ybWF0X2ZsYWdzKGNvbnN0IHN0cnVjdCBicmNtc19jX2JpdF9kZXNjICpiZCwgdTMyIGZsYWdzLCBjaGFyICpidWYsCi0JCSAgIGludCBsZW4pCisJCSAgICAgaW50IGxlbikKIHsKIAlpbnQgaTsKIAljaGFyICpwID0gYnVmOwpAQCAtNjkxNiw3ICs2NjgwLDcgQEAKIAlxb3MgPSBpZWVlODAyMTFfaXNfZGF0YV9xb3MoaC0+ZnJhbWVfY29udHJvbCk7CiAKIAkvKiBjb21wdXRlIGxlbmd0aCBvZiBmcmFtZSBpbiBieXRlcyBmb3IgdXNlIGluIFBMQ1AgY29tcHV0YXRpb25zICovCi0JbGVuID0gYnJjbXVfcGt0dG90bGVuKHApOworCWxlbiA9IHAtPmxlbjsKIAlwaHlsZW4gPSBsZW4gKyBGQ1NfTEVOOwogCiAJLyogR2V0IHR4X2luZm8gKi8KQEAgLTc2OTUsMTEgKzc0NTksMTEgQEAKIGJyY21zX2JfcmVhZF90c2Yoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHUzMiAqdHNmX2xfcHRyLAogCQkgIHUzMiAqdHNmX2hfcHRyKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3MgPSB3bGNfaHctPnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gd2xjX2h3LT5kMTFjb3JlOwogCiAJLyogcmVhZCB0aGUgdHNmIHRpbWVyIGxvdywgdGhlbiBoaWdoIHRvIGdldCBhbiBhdG9taWMgcmVhZCAqLwotCSp0c2ZfbF9wdHIgPSBSX1JFRygmcmVncy0+dHNmX3RpbWVybG93KTsKLQkqdHNmX2hfcHRyID0gUl9SRUcoJnJlZ3MtPnRzZl90aW1lcmhpZ2gpOworCSp0c2ZfbF9wdHIgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKHRzZl90aW1lcmxvdykpOworCSp0c2ZfaF9wdHIgPSBiY21hX3JlYWQzMihjb3JlLCBEMTFSRUdPRkZTKHRzZl90aW1lcmhpZ2gpKTsKIH0KIAogLyoKQEAgLTgyNTMsMTIgKzgwMTcsNiBAQAogCXJldHVybiAoaW50KShxZGJtIC8gQlJDTVNfVFhQV1JfREJfRkFDVE9SKTsKIH0KIAotdm9pZCBicmNtc19jX3NldF9yYWRpb19tcGMoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBib29sIG1wYykKLXsKLQl3bGMtPm1wYyA9IG1wYzsKLQlicmNtc19jX3JhZGlvX21wY191cGQod2xjKTsKLX0KLQogLyogUHJvY2VzcyByZWNlaXZlZCBmcmFtZXMgKi8KIC8qCiAgKiBSZXR1cm4gdHJ1ZSBpZiBtb3JlIGZyYW1lcyBuZWVkIHRvIGJlIHByb2Nlc3NlZC4gZmFsc2Ugb3RoZXJ3aXNlLgpAQCAtODI5MywxNCArODA1MSw4IEBACiAJbGVuID0gcC0+bGVuOwogCiAJaWYgKHJ4aC0+UnhTdGF0dXMxICYgUlhTX0ZDU0VSUikgewotCQlpZiAod2xjLT5wdWItPm1hYzgwMjExX3N0YXRlICYgTUFDODAyMTFfUFJPTUlTQ19CQ05TKSB7Ci0JCQl3aXBoeV9lcnIod2xjLT53aXBoeSwgIkZDU0VSUiB3aGlsZSBzY2FubmluZyoqKioqKiogLSIKLQkJCQkgICIgdG9zc2luZ1xuIik7CisJCWlmICghKHdsYy0+ZmlsdGVyX2ZsYWdzICYgRklGX0ZDU0ZBSUwpKQogCQkJZ290byB0b3NzOwotCQl9IGVsc2UgewotCQkJd2lwaHlfZXJyKHdsYy0+d2lwaHksICJSQ1NFUlIhISFcbiIpOwotCQkJZ290byB0b3NzOwotCQl9CiAJfQogCiAJLyogY2hlY2sgcmVjZWl2ZWQgcGt0IGhhcyBhdCBsZWFzdCBmcmFtZSBjb250cm9sIGZpZWxkICovCkBAIC04MzI4LDIxICs4MDgwLDE3IEBACiBicmNtc19iX3JlY3Yoc3RydWN0IGJyY21zX2hhcmR3YXJlICp3bGNfaHcsIHVpbnQgZmlmbywgYm9vbCBib3VuZCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqaGVhZCA9IE5VTEw7Ci0Jc3RydWN0IHNrX2J1ZmYgKnRhaWwgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpuZXh0ID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHJlY3ZfZnJhbWVzOworCiAJdWludCBuID0gMDsKIAl1aW50IGJvdW5kX2xpbWl0ID0gYm91bmQgPyBSWEJORCA6IC0xOwogCiAJQkNNTVNHKHdsY19ody0+d2xjLT53aXBoeSwgIndsJWRcbiIsIHdsY19ody0+dW5pdCk7Ci0JLyogZ2F0aGVyIHJlY2VpdmVkIGZyYW1lcyAqLwotCXdoaWxlICgocCA9IGRtYV9yeCh3bGNfaHctPmRpW2ZpZm9dKSkpIHsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZyZWN2X2ZyYW1lcyk7CiAKLQkJaWYgKCF0YWlsKQotCQkJaGVhZCA9IHRhaWwgPSBwOwotCQllbHNlIHsKLQkJCXRhaWwtPnByZXYgPSBwOwotCQkJdGFpbCA9IHA7Ci0JCX0KKwkvKiBnYXRoZXIgcmVjZWl2ZWQgZnJhbWVzICovCisJd2hpbGUgKGRtYV9yeCh3bGNfaHctPmRpW2ZpZm9dLCAmcmVjdl9mcmFtZXMpKSB7CiAKIAkJLyogIWdpdmUgb3RoZXJzIHNvbWUgdGltZSB0byBydW4hICovCiAJCWlmICgrK24gPj0gYm91bmRfbGltaXQpCkBAIC04MzUzLDEyICs4MTAxLDExIEBACiAJZG1hX3J4ZmlsbCh3bGNfaHctPmRpW2ZpZm9dKTsKIAogCS8qIHByb2Nlc3MgZWFjaCBmcmFtZSAqLwotCXdoaWxlICgocCA9IGhlYWQpICE9IE5VTEwpIHsKKwlza2JfcXVldWVfd2Fsa19zYWZlKCZyZWN2X2ZyYW1lcywgcCwgbmV4dCkgewogCQlzdHJ1Y3QgZDExcnhoZHJfbGUgKnJ4aF9sZTsKIAkJc3RydWN0IGQxMXJ4aGRyICpyeGg7Ci0JCWhlYWQgPSBoZWFkLT5wcmV2OwotCQlwLT5wcmV2ID0gTlVMTDsKIAorCQlza2JfdW5saW5rKHAsICZyZWN2X2ZyYW1lcyk7CiAJCXJ4aF9sZSA9IChzdHJ1Y3QgZDExcnhoZHJfbGUgKilwLT5kYXRhOwogCQlyeGggPSAoc3RydWN0IGQxMXJ4aGRyICopcC0+ZGF0YTsKIApAQCAtODM4OSw3ICs4MTM2LDcgQEAKIHsKIAl1MzIgbWFjaW50c3RhdHVzOwogCXN0cnVjdCBicmNtc19oYXJkd2FyZSAqd2xjX2h3ID0gd2xjLT5odzsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gd2xjX2h3LT5yZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsY19ody0+ZDExY29yZTsKIAlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gd2xjLT53aXBoeTsKIAogCWlmIChicmNtc19kZXZpY2VyZW1vdmVkKHdsYykpIHsKQEAgLTg0MjUsNyArODE3Miw3IEBACiAJLyogQVRJTSB3aW5kb3cgZW5kICovCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX0FUSU1XSU5FTkQpIHsKIAkJQkNNTVNHKHdsYy0+d2lwaHksICJlbmQgb2YgQVRJTSB3aW5kb3dcbiIpOwotCQlPUl9SRUcoJnJlZ3MtPm1hY2NvbW1hbmQsIHdsYy0+cXZhbGlkKTsKKwkJYmNtYV9zZXQzMihjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbW1hbmQpLCB3bGMtPnF2YWxpZCk7CiAJCXdsYy0+cXZhbGlkID0gMDsKIAl9CiAKQEAgLTg0NDMsMTggKzgxOTAsMTcgQEAKIAogCWlmIChtYWNpbnRzdGF0dXMgJiBNSV9HUDApIHsKIAkJd2lwaHlfZXJyKHdpcGh5LCAid2wlZDogUFNNIG1pY3JvY29kZSB3YXRjaGRvZyBmaXJlZCBhdCAlZCAiCi0JCQkiKHNlY29uZHMpLiBSZXNldHRpbmcuXG4iLCB3bGNfaHctPnVuaXQsIHdsY19ody0+bm93KTsKKwkJCSAgIihzZWNvbmRzKS4gUmVzZXR0aW5nLlxuIiwgd2xjX2h3LT51bml0LCB3bGNfaHctPm5vdyk7CiAKIAkJcHJpbnRrX29uY2UoIiVzIDogUFNNIFdhdGNoZG9nLCBjaGlwaWQgMHgleCwgY2hpcHJldiAweCV4XG4iLAotCQkJCQlfX2Z1bmNfXywgd2xjX2h3LT5zaWgtPmNoaXAsCi0JCQkJCXdsY19ody0+c2loLT5jaGlwcmV2KTsKLQkJLyogYmlnIGhhbW1lciAqLwotCQlicmNtc19pbml0KHdsYy0+d2wpOworCQkJICAgIF9fZnVuY19fLCBhaV9nZXRfY2hpcF9pZCh3bGNfaHctPnNpaCksCisJCQkgICAgYWlfZ2V0X2NoaXByZXYod2xjX2h3LT5zaWgpKTsKKwkJYnJjbXNfZmF0YWxfZXJyb3Iod2xjX2h3LT53bGMtPndsKTsKIAl9CiAKIAkvKiBncHRpbWVyIHRpbWVvdXQgKi8KIAlpZiAobWFjaW50c3RhdHVzICYgTUlfVE8pCi0JCVdfUkVHKCZyZWdzLT5ncHRpbWVyLCAwKTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlMoZ3B0aW1lciksIDApOwogCiAJaWYgKG1hY2ludHN0YXR1cyAmIE1JX1JGRElTQUJMRSkgewogCQlCQ01NU0cod2xjLT53aXBoeSwgIndsJWQ6IEJNQUMgRGV0ZWN0ZWQgYSBjaGFuZ2Ugb24gdGhlIgpAQCAtODQ3MCwyMCArODIxNiwxNyBAQAogCXJldHVybiB3bGMtPm1hY2ludHN0YXR1cyAhPSAwOwogCiAgZmF0YWw6Ci0JYnJjbXNfaW5pdCh3bGMtPndsKTsKKwlicmNtc19mYXRhbF9lcnJvcih3bGNfaHctPndsYy0+d2wpOwogCXJldHVybiB3bGMtPm1hY2ludHN0YXR1cyAhPSAwOwogfQogCi12b2lkIGJyY21zX2NfaW5pdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpCit2b2lkIGJyY21zX2NfaW5pdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgbXV0ZV90eCkKIHsKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzOworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZSA9IHdsYy0+aHctPmQxMWNvcmU7CiAJdTE2IGNoYW5zcGVjOwotCWJvb2wgbXV0ZSA9IGZhbHNlOwogCiAJQkNNTVNHKHdsYy0+d2lwaHksICJ3bCVkXG4iLCB3bGMtPnB1Yi0+dW5pdCk7CiAKLQlyZWdzID0gd2xjLT5yZWdzOwotCiAJLyoKIAkgKiBUaGlzIHdpbGwgaGFwcGVuIGlmIGEgYmlnLWhhbW1lciB3YXMgZXhlY3V0ZWQuIEluCiAJICogdGhhdCBjYXNlLCB3ZSB3YW50IHRvIGdvIGJhY2sgdG8gdGhlIGNoYW5uZWwgdGhhdApAQCAtODQ5NCw3ICs4MjM3LDcgQEAKIAllbHNlCiAJCWNoYW5zcGVjID0gYnJjbXNfY19pbml0X2NoYW5zcGVjKHdsYyk7CiAKLQlicmNtc19iX2luaXQod2xjLT5odywgY2hhbnNwZWMsIG11dGUpOworCWJyY21zX2JfaW5pdCh3bGMtPmh3LCBjaGFuc3BlYyk7CiAKIAkvKiB1cGRhdGUgYmVhY29uIGxpc3RlbiBpbnRlcnZhbCAqLwogCWJyY21zX2NfYmNuX2xpX3VwZCh3bGMpOwpAQCAtODUxMyw4ICs4MjU2LDggQEAKIAkJICogdXBkYXRlIHNpbmNlIGluaXQgcGF0aCB3b3VsZCByZXNldAogCQkgKiB0byBkZWZhdWx0IHZhbHVlCiAJCSAqLwotCQlXX1JFRygmcmVncy0+dHNmX2NmcHJlcCwKLQkJICAgICAgKGJpIDw8IENGUFJFUF9DQklfU0hJRlQpKTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIEQxMVJFR09GRlModHNmX2NmcHJlcCksCisJCQkgICAgIGJpIDw8IENGUFJFUF9DQklfU0hJRlQpOwogCiAJCS8qIFVwZGF0ZSBtYWNjb250cm9sIFBNIHJlbGF0ZWQgYml0cyAqLwogCQlicmNtc19jX3NldF9wc19jdHJsKHdsYyk7CkBAIC04NTQ0LDcgKzgyODcsNyBAQAogCWJyY21zX2NfYnNpbml0KHdsYyk7CiAKIAkvKiBFbmFibGUgRURDRiBtb2RlICh3aGlsZSB0aGUgTUFDIGlzIHN1c3BlbmRlZCkgKi8KLQlPUl9SRUcoJnJlZ3MtPmlmc19jdGwsIElGU19VU0VFRENGKTsKKwliY21hX3NldDE2KGNvcmUsIEQxMVJFR09GRlMoaWZzX2N0bCksIElGU19VU0VFRENGKTsKIAlicmNtc19jX2VkY2Zfc2V0cGFyYW1zKHdsYywgZmFsc2UpOwogCiAJLyogSW5pdCBwcmVjZWRlbmNlIG1hcHMgZm9yIGVtcHR5IEZJRk9zICovCkBAIC04NTYwLDE0ICs4MzAzLDE1IEBACiAJLyogLi5ub3cgcmVhbGx5IHVubGVhc2ggaGVsbCAoYWxsb3cgdGhlIE1BQyBvdXQgb2Ygc3VzcGVuZCkgKi8KIAlicmNtc19jX2VuYWJsZV9tYWMod2xjKTsKIAorCS8qIHN1c3BlbmQgdGhlIHR4IGZpZm9zIGFuZCBtdXRlIHRoZSBwaHkgZm9yIHByZWlzbSBjYWMgdGltZSAqLworCWlmIChtdXRlX3R4KQorCQlicmNtc19iX211dGUod2xjLT5odywgdHJ1ZSk7CisKIAkvKiBjbGVhciB0eCBmbG93IGNvbnRyb2wgKi8KIAlicmNtc19jX3R4Zmxvd2NvbnRyb2xfcmVzZXQod2xjKTsKIAogCS8qIGVuYWJsZSB0aGUgUkYgRGlzYWJsZSBEZWxheSB0aW1lciAqLwotCVdfUkVHKCZ3bGMtPnJlZ3MtPnJmZGlzYWJsZWRseSwgUkZESVNBQkxFX0RFRkFVTFQpOwotCi0JLyogaW5pdGlhbGl6ZSBtcGMgZGVsYXkgKi8KLQl3bGMtPm1wY19kZWxheV9vZmYgPSB3bGMtPm1wY19kbHljbnQgPSBCUkNNU19NUENfTUlOX0RFTEFZQ05UOworCWJjbWFfd3JpdGUzMihjb3JlLCBEMTFSRUdPRkZTKHJmZGlzYWJsZWRseSksIFJGRElTQUJMRV9ERUZBVUxUKTsKIAogCS8qCiAJICogSW5pdGlhbGl6ZSBXTUUgcGFyYW1ldGVyczsgaWYgdGhleSBoYXZlbid0IGJlZW4gc2V0IGJ5IHNvbWUgb3RoZXIKQEAgLTg1NzcsNyArODMyMSw3IEBACiAJCS8qIFVuaW5pdGlhbGl6ZWQ7IHJlYWQgZnJvbSBIVyAqLwogCQlpbnQgYWM7CiAKLQkJZm9yIChhYyA9IDA7IGFjIDwgQUNfQ09VTlQ7IGFjKyspCisJCWZvciAoYWMgPSAwOyBhYyA8IElFRUU4MDIxMV9OVU1fQUNTOyBhYysrKQogCQkJd2xjLT53bWVfcmV0cmllc1thY10gPQogCQkJICAgIGJyY21zX2JfcmVhZF9zaG0od2xjLT5odywgTV9BQ19UWExNVF9BRERSKGFjKSk7CiAJfQpAQCAtODU4Nyw5ICs4MzMxLDggQEAKICAqIFRoZSBjb21tb24gZHJpdmVyIGVudHJ5IHJvdXRpbmUuIEVycm9yIGNvZGVzIHNob3VsZCBiZSB1bmlxdWUKICAqLwogc3RydWN0IGJyY21zX2NfaW5mbyAqCi1icmNtc19jX2F0dGFjaChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHUxNiB2ZW5kb3IsIHUxNiBkZXZpY2UsIHVpbnQgdW5pdCwKLQkgICAgICAgYm9vbCBwaW9tb2RlLCB2b2lkIF9faW9tZW0gKnJlZ3N2YSwgc3RydWN0IHBjaV9kZXYgKmJ0cGFyYW0sCi0JICAgICAgIHVpbnQgKnBlcnIpCiticmNtc19jX2F0dGFjaChzdHJ1Y3QgYnJjbXNfaW5mbyAqd2wsIHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdWludCB1bml0LAorCSAgICAgICBib29sIHBpb21vZGUsIHVpbnQgKnBlcnIpCiB7CiAJc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjOwogCXVpbnQgZXJyID0gMDsKQEAgLTg1OTcsNyArODM0MCw3IEBACiAJc3RydWN0IGJyY21zX3B1YiAqcHViOwogCiAJLyogYWxsb2NhdGUgc3RydWN0IGJyY21zX2NfaW5mbyBzdGF0ZSBhbmQgaXRzIHN1YnN0cnVjdHVyZXMgKi8KLQl3bGMgPSAoc3RydWN0IGJyY21zX2NfaW5mbyAqKSBicmNtc19jX2F0dGFjaF9tYWxsb2ModW5pdCwgJmVyciwgZGV2aWNlKTsKKwl3bGMgPSAoc3RydWN0IGJyY21zX2NfaW5mbyAqKSBicmNtc19jX2F0dGFjaF9tYWxsb2ModW5pdCwgJmVyciwgMCk7CiAJaWYgKHdsYyA9PSBOVUxMKQogCQlnb3RvIGZhaWw7CiAJd2xjLT53aXBoeSA9IHdsLT53aXBoeTsKQEAgLTg2MjQsOCArODM2Nyw3IEBACiAJICogbG93IGxldmVsIGF0dGFjaCBzdGVwcyhhbGwgaHcgYWNjZXNzZXMgZ28KIAkgKiBpbnNpZGUsIG5vIG1vcmUgaW4gcmVzdCBvZiB0aGUgYXR0YWNoKQogCSAqLwotCWVyciA9IGJyY21zX2JfYXR0YWNoKHdsYywgdmVuZG9yLCBkZXZpY2UsIHVuaXQsIHBpb21vZGUsIHJlZ3N2YSwKLQkJCSAgICAgYnRwYXJhbSk7CisJZXJyID0gYnJjbXNfYl9hdHRhY2god2xjLCBjb3JlLCB1bml0LCBwaW9tb2RlKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZhaWw7CiAKQEAgLTg3NTQsOCArODQ5Niw2IEBACiAJCWJyY21zX2NfaHRfdXBkYXRlX3NnaV9yeCh3bGMsIDApOwogCX0KIAotCS8qIGluaXRpYWxpemUgcmFkaW9fbXBjX2Rpc2FibGUgYWNjb3JkaW5nIHRvIHdsYy0+bXBjICovCi0JYnJjbXNfY19yYWRpb19tcGNfdXBkKHdsYyk7CiAJYnJjbXNfYl9hbnRzZWxfc2V0KHdsYy0+aHcsIHdsYy0+YXNpLT5hbnRzZWxfYXZhaWwpOwogCiAJaWYgKHBlcnIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL21haW4uaAppbmRleCBjMGUwZmNmLi5hZGIxMzZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbWFpbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9tYWluLmgKQEAgLTQ0LDggKzQ0LDYgQEAKIC8qIHRyYW5zbWl0IGJ1ZmZlciBtYXggaGVhZHJvb20gZm9yIHByb3RvY29sIGhlYWRlcnMgKi8KICNkZWZpbmUgVFhPRkYgKEQxMV9UWEhfTEVOICsgRDExX1BIWV9IRFJfTEVOKQogCi0jZGVmaW5lIEFDX0NPVU5UCQk0Ci0KIC8qIE1hY3JvcyBmb3IgZG9pbmcgZGVmaW5pdGlvbiBhbmQgZ2V0L3NldCBvZiBiaXRmaWVsZHMKICAqIFVzYWdlIGV4YW1wbGUsIGUuZy4gYSB0aHJlZS1iaXQgZmllbGQgKGJpdHMgNC02KToKICAqICAgICNkZWZpbmUgPE5BTUU+X00JQklURklFTERfTUFTSygzKQpAQCAtMzM2LDcgKzMzNCw3IEBACiAJdTMyIG1hY2h3Y2FwX2JhY2t1cDsJLyogYmFja3VwIG9mIG1hY2h3Y2FwICovCiAKIAlzdHJ1Y3Qgc2lfcHViICpzaWg7CS8qIFNJIGhhbmRsZSAoY29va2llIGZvciBzaXV0aWxzIGNhbGxzKSAqLwotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7CS8qIHBvaW50ZXIgdG8gZGV2aWNlIHJlZ2lzdGVycyAqLworCXN0cnVjdCBiY21hX2RldmljZSAqZDExY29yZTsJLyogcG9pbnRlciB0byA4MDIuMTEgY29yZSAqLwogCXN0cnVjdCBwaHlfc2hpbV9pbmZvICpwaHlzaGltOyAvKiBwaHkgc2hpbSBsYXllciBoYW5kbGVyICovCiAJc3RydWN0IHNoYXJlZF9waHkgKnBoeV9zaDsJLyogcG9pbnRlciB0byBzaGFyZWQgcGh5IHN0YXRlICovCiAJc3RydWN0IGJyY21zX2h3X2JhbmQgKmJhbmQ7LyogcG9pbnRlciB0byBhY3RpdmUgcGVyLWJhbmQgc3RhdGUgKi8KQEAgLTQwMiw3ICs0MDAsNiBAQAogICoKICAqIHB1YjogcG9pbnRlciB0byBkcml2ZXIgcHVibGljIHN0YXRlLgogICogd2w6IHBvaW50ZXIgdG8gc3BlY2lmaWMgcHJpdmF0ZSBzdGF0ZS4KLSAqIHJlZ3M6IHBvaW50ZXIgdG8gZGV2aWNlIHJlZ2lzdGVycy4KICAqIGh3OiBIVyByZWxhdGVkIHN0YXRlLgogICogY2xrcmVxX292ZXJyaWRlOiBzZXR0aW5nIGZvciBjbGtyZXEgZm9yIFBDSUUgOiBBdXRvLCAwLCAxLgogICogZmFzdHB3cnVwX2RseTogdGltZSBpbiB1cyBuZWVkZWQgdG8gYnJpbmcgdXAgZDExIGZhc3QgY2xvY2suCkBAIC00MjcsMTEgKzQyNCw2IEBACiAgKiBiYW5kaW5pdF9wZW5kaW5nOiB0cmFjayBiYW5kIGluaXQgaW4gYXV0byBiYW5kLgogICogcmFkaW9fbW9uaXRvcjogcmFkaW8gdGltZXIgaXMgcnVubmluZy4KICAqIGdvaW5nX2Rvd246IGRvd24gcGF0aCBpbnRlcm1lZGlhdGUgdmFyaWFibGUuCi0gKiBtcGM6IGVuYWJsZSBtaW5pbXVtIHBvd2VyIGNvbnN1bXB0aW9uLgotICogbXBjX2RseWNudDogIyBvZiB3YXRjaGRvZyBjbnQgYmVmb3JlIHR1cm4gZGlzYWJsZSByYWRpby4KLSAqIG1wY19vZmZjbnQ6ICMgb2Ygd2F0Y2hkb2cgY250IHRoYXQgcmFkaW8gaXMgZGlzYWJsZWQuCi0gKiBtcGNfZGVsYXlfb2ZmOiBkZWxheSByYWRpbyBkaXNhYmxlIGJ5ICMgb2Ygd2F0Y2hkb2cgY250LgotICogcHJldl9ub25fZGVsYXlfbXBjOiBwcmV2IHN0YXRlIGJyY21zX2NfaXNfbm9uX2RlbGF5X21wYy4KICAqIHdkdGltZXI6IHRpbWVyIGZvciB3YXRjaGRvZyByb3V0aW5lLgogICogcmFkaW9fdGltZXI6IHRpbWVyIGZvciBodyByYWRpbyBidXR0b24gbW9uaXRvciByb3V0aW5lLgogICogbW9uaXRvcjogbW9uaXRvciAoTVBEVSBzbmlmZmluZykgbW9kZS4KQEAgLTQ0MSw3ICs0MzMsNyBAQAogICogYmNuX2xpX2R0aW06IGJlYWNvbiBsaXN0ZW4gaW50ZXJ2YWwgaW4gIyBkdGltcy4KICAqIFdEYXJtZWQ6IHdhdGNoZG9nIHRpbWVyIGlzIGFybWVkLgogICogV0RsYXN0OiBsYXN0IHRpbWUgd2xjX3dhdGNoZG9nKCkgd2FzIGNhbGxlZC4KLSAqIGVkY2ZfdHhvcFtBQ19DT1VOVF06IGN1cnJlbnQgdHhvcCBmb3IgZWFjaCBhYy4KKyAqIGVkY2ZfdHhvcFtJRUVFODAyMTFfTlVNX0FDU106IGN1cnJlbnQgdHhvcCBmb3IgZWFjaCBhYy4KICAqIHdtZV9yZXRyaWVzOiBwZXItQUMgcmV0cnkgbGltaXRzLgogICogdHhfcHJlY19tYXA6IFByZWNlZGVuY2UgbWFwIGJhc2VkIG9uIEhXIEZJRk8gc3BhY2UuCiAgKiBmaWZvMnByZWNfbWFwW05GSUZPXTogcG9pbnRlciB0byBmaWZvMl9wcmVjIG1hcCBiYXNlZCBvbiBXTUUuCkBAIC00ODQsNyArNDc2LDYgQEAKIHN0cnVjdCBicmNtc19jX2luZm8gewogCXN0cnVjdCBicmNtc19wdWIgKnB1YjsKIAlzdHJ1Y3QgYnJjbXNfaW5mbyAqd2w7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKIAlzdHJ1Y3QgYnJjbXNfaGFyZHdhcmUgKmh3OwogCiAJLyogY2xvY2sgKi8KQEAgLTUyMiwxOCArNTEzLDExIEBACiAJYm9vbCByYWRpb19tb25pdG9yOwogCWJvb2wgZ29pbmdfZG93bjsKIAotCWJvb2wgbXBjOwotCXU4IG1wY19kbHljbnQ7Ci0JdTggbXBjX29mZmNudDsKLQl1OCBtcGNfZGVsYXlfb2ZmOwotCXU4IHByZXZfbm9uX2RlbGF5X21wYzsKLQogCXN0cnVjdCBicmNtc190aW1lciAqd2R0aW1lcjsKIAlzdHJ1Y3QgYnJjbXNfdGltZXIgKnJhZGlvX3RpbWVyOwogCiAJLyogcHJvbWlzY3VvdXMgKi8KLQlib29sIG1vbml0b3I7Ci0JYm9vbCBiY25taXNjX21vbml0b3I7CisJdWludCBmaWx0ZXJfZmxhZ3M7CiAKIAkvKiBkcml2ZXIgZmVhdHVyZSAqLwogCWJvb2wgX3JpZnM7CkBAIC01NDYsOSArNTMwLDkgQEAKIAl1MzIgV0RsYXN0OwogCiAJLyogV01FICovCi0JdTE2IGVkY2ZfdHhvcFtBQ19DT1VOVF07CisJdTE2IGVkY2ZfdHhvcFtJRUVFODAyMTFfTlVNX0FDU107CiAKLQl1MTYgd21lX3JldHJpZXNbQUNfQ09VTlRdOworCXUxNiB3bWVfcmV0cmllc1tJRUVFODAyMTFfTlVNX0FDU107CiAJdTE2IHR4X3ByZWNfbWFwOwogCXUxNiBmaWZvMnByZWNfbWFwW05GSUZPXTsKIApAQCAtNjcxLDggKzY1NSw3IEBACiAjZW5kaWYKIAogZXh0ZXJuIGludCBicmNtc19jX3NldF9nbW9kZShzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHU4IGdtb2RlLCBib29sIGNvbmZpZyk7Ci1leHRlcm4gdm9pZCBicmNtc19jX21hY19iY25fcHJvbWlzY19jaGFuZ2Uoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLAotCQkJCQkgICBib29sIHByb21pc2MpOworZXh0ZXJuIHZvaWQgYnJjbXNfY19tYWNfcHJvbWlzYyhzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIHVpbnQgZmlsdGVyX2ZsYWdzKTsKIGV4dGVybiB2b2lkIGJyY21zX2Nfc2VuZF9xKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7CiBleHRlcm4gaW50IGJyY21zX2NfcHJlcF9wZHUoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBzdHJ1Y3Qgc2tfYnVmZiAqcGR1LAogCQkJICAgIHVpbnQgKmZpZm8pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL25pY3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL25pY3BjaS5jCmluZGV4IDBiY2IyNjcuLjdmYWQ2ZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9uaWNwY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbmljcGNpLmMKQEAgLTEzOSw2ICsxMzksOSBAQAogI2RlZmluZSBTUlNIX1BJX01BU0sJMHhmMDAwCS8qIGJpdCAxNToxMiAqLwogI2RlZmluZSBTUlNIX1BJX1NISUZUCTEyCS8qIGJpdCAxNToxMiAqLwogCisjZGVmaW5lIFBDSVJFR09GRlMoZmllbGQpCW9mZnNldG9mKHN0cnVjdCBzYnBjaXJlZ3MsIGZpZWxkKQorI2RlZmluZSBQQ0lFUkVHT0ZGUyhmaWVsZCkJb2Zmc2V0b2Yoc3RydWN0IHNicGNpZXJlZ3MsIGZpZWxkKQorCiAvKiBTb25pY3Mgc2lkZTogUENJIGNvcmUgYW5kIGhvc3QgY29udHJvbCByZWdpc3RlcnMgKi8KIHN0cnVjdCBzYnBjaXJlZ3MgewogCXUzMiBjb250cm9sOwkJLyogUENJIGNvbnRyb2wgKi8KQEAgLTIwNSwxMSArMjA4LDcgQEAKIH07CiAKIHN0cnVjdCBwY2ljb3JlX2luZm8gewotCXVuaW9uIHsKLQkJc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqcGNpZXJlZ3M7Ci0JCXN0cnVjdCBzYnBjaXJlZ3MgX19pb21lbSAqcGNpcmVnczsKLQl9IHJlZ3M7CQkJLyogTWVtb3J5IG1hcHBlZCByZWdpc3RlciB0byB0aGUgY29yZSAqLwotCisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlOwogCXN0cnVjdCBzaV9wdWIgKnNpaDsJLyogU3lzdGVtIGludGVyY29ubmVjdCBoYW5kbGUgKi8KIAlzdHJ1Y3QgcGNpX2RldiAqZGV2OwogCXU4IHBjaWVjYXBfbGNyZWdfb2Zmc2V0Oy8qIFBDSUUgY2FwYWJpbGl0eSBMQ3JlZyBvZmZzZXQKQEAgLTIyNCw5ICsyMjMsOSBAQAogfTsKIAogI2RlZmluZSBQQ0lFX0FTUE0oc2loKQkJCQkJCQlcCi0JKCgoc2loKS0+YnVzY29yZXR5cGUgPT0gUENJRV9DT1JFX0lEKSAmJgkJCVwKLQkgKCgoc2loKS0+YnVzY29yZXJldiA+PSAzKSAmJgkJCQkJXAotCSAgKChzaWgpLT5idXNjb3JlcmV2IDw9IDUpKSkKKwkoKGFpX2dldF9idXNjb3JldHlwZShzaWgpID09IFBDSUVfQ09SRV9JRCkgJiYJCQlcCisJICgoYWlfZ2V0X2J1c2NvcmVyZXYoc2loKSA+PSAzKSAmJgkJCQlcCisJICAoYWlfZ2V0X2J1c2NvcmVyZXYoc2loKSA8PSA1KSkpCiAKIAogLyogZGVsYXkgbmVlZGVkIGJldHdlZW4gdGhlIG1kaW8gY29udHJvbC8gbWRpb2RhdGEgcmVnaXN0ZXIgZGF0YSBhY2Nlc3MgKi8KQEAgLTIzOCw4ICsyMzcsNyBAQAogLyogSW5pdGlhbGl6ZSB0aGUgUENJIGNvcmUuCiAgKiBJdCdzIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoaXMgaXMgZG9uZSBvbmx5IG9uY2UKICAqLwotc3RydWN0IHBjaWNvcmVfaW5mbyAqcGNpY29yZV9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCwgc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJICB2b2lkIF9faW9tZW0gKnJlZ3MpCitzdHJ1Y3QgcGNpY29yZV9pbmZvICpwY2ljb3JlX2luaXQoc3RydWN0IHNpX3B1YiAqc2loLCBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUpCiB7CiAJc3RydWN0IHBjaWNvcmVfaW5mbyAqcGk7CiAKQEAgLTI0OSwxNyArMjQ3LDE1IEBACiAJCXJldHVybiBOVUxMOwogCiAJcGktPnNpaCA9IHNpaDsKLQlwaS0+ZGV2ID0gcGRldjsKKwlwaS0+ZGV2ID0gY29yZS0+YnVzLT5ob3N0X3BjaTsKKwlwaS0+Y29yZSA9IGNvcmU7CiAKLQlpZiAoc2loLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpIHsKKwlpZiAoY29yZS0+aWQuaWQgPT0gUENJRV9DT1JFX0lEKSB7CiAJCXU4IGNhcF9wdHI7Ci0JCXBpLT5yZWdzLnBjaWVyZWdzID0gcmVnczsKIAkJY2FwX3B0ciA9IHBjaWNvcmVfZmluZF9wY2lfY2FwYWJpbGl0eShwaS0+ZGV2LCBQQ0lfQ0FQX0lEX0VYUCwKIAkJCQkJCSAgICAgIE5VTEwsIE5VTEwpOwogCQlwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQgPSBjYXBfcHRyICsgUENJRV9DQVBfTElOS0NUUkxfT0ZGU0VUOwotCX0gZWxzZQotCQlwaS0+cmVncy5wY2lyZWdzID0gcmVnczsKLQorCX0KIAlyZXR1cm4gcGk7CiB9CiAKQEAgLTMzNCwzNyArMzMwLDM3IEBACiAKIC8qICoqKioqIFJlZ2lzdGVyIEFjY2VzcyBBUEkgKi8KIHN0YXRpYyB1aW50Ci1wY2llX3JlYWRyZWcoc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqcGNpZXJlZ3MsIHVpbnQgYWRkcnR5cGUsIHVpbnQgb2Zmc2V0KQorcGNpZV9yZWFkcmVnKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdWludCBhZGRydHlwZSwgdWludCBvZmZzZXQpCiB7CiAJdWludCByZXR2YWwgPSAweEZGRkZGRkZGOwogCiAJc3dpdGNoIChhZGRydHlwZSkgewogCWNhc2UgUENJRV9DT05GSUdSRUdTOgotCQlXX1JFRygmcGNpZXJlZ3MtPmNvbmZpZ2FkZHIsIG9mZnNldCk7Ci0JCSh2b2lkKVJfUkVHKCgmcGNpZXJlZ3MtPmNvbmZpZ2FkZHIpKTsKLQkJcmV0dmFsID0gUl9SRUcoJnBjaWVyZWdzLT5jb25maWdkYXRhKTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIFBDSUVSRUdPRkZTKGNvbmZpZ2FkZHIpLCBvZmZzZXQpOworCQkodm9pZCliY21hX3JlYWQzMihjb3JlLCBQQ0lFUkVHT0ZGUyhjb25maWdhZGRyKSk7CisJCXJldHZhbCA9IGJjbWFfcmVhZDMyKGNvcmUsIFBDSUVSRUdPRkZTKGNvbmZpZ2RhdGEpKTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lFX1BDSUVSRUdTOgotCQlXX1JFRygmcGNpZXJlZ3MtPnBjaWVpbmRhZGRyLCBvZmZzZXQpOwotCQkodm9pZClSX1JFRygmcGNpZXJlZ3MtPnBjaWVpbmRhZGRyKTsKLQkJcmV0dmFsID0gUl9SRUcoJnBjaWVyZWdzLT5wY2llaW5kZGF0YSk7CisJCWJjbWFfd3JpdGUzMihjb3JlLCBQQ0lFUkVHT0ZGUyhwY2llaW5kYWRkciksIG9mZnNldCk7CisJCSh2b2lkKWJjbWFfcmVhZDMyKGNvcmUsIFBDSUVSRUdPRkZTKHBjaWVpbmRhZGRyKSk7CisJCXJldHZhbCA9IGJjbWFfcmVhZDMyKGNvcmUsIFBDSUVSRUdPRkZTKHBjaWVpbmRkYXRhKSk7CiAJCWJyZWFrOwogCX0KIAogCXJldHVybiByZXR2YWw7CiB9CiAKLXN0YXRpYyB1aW50IHBjaWVfd3JpdGVyZWcoc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqcGNpZXJlZ3MsIHVpbnQgYWRkcnR5cGUsCitzdGF0aWMgdWludCBwY2llX3dyaXRlcmVnKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdWludCBhZGRydHlwZSwKIAkJCSAgdWludCBvZmZzZXQsIHVpbnQgdmFsKQogewogCXN3aXRjaCAoYWRkcnR5cGUpIHsKIAljYXNlIFBDSUVfQ09ORklHUkVHUzoKLQkJV19SRUcoKCZwY2llcmVncy0+Y29uZmlnYWRkciksIG9mZnNldCk7Ci0JCVdfUkVHKCgmcGNpZXJlZ3MtPmNvbmZpZ2RhdGEpLCB2YWwpOworCQliY21hX3dyaXRlMzIoY29yZSwgUENJRVJFR09GRlMoY29uZmlnYWRkciksIG9mZnNldCk7CisJCWJjbWFfd3JpdGUzMihjb3JlLCBQQ0lFUkVHT0ZGUyhjb25maWdkYXRhKSwgdmFsKTsKIAkJYnJlYWs7CiAJY2FzZSBQQ0lFX1BDSUVSRUdTOgotCQlXX1JFRygoJnBjaWVyZWdzLT5wY2llaW5kYWRkciksIG9mZnNldCk7Ci0JCVdfUkVHKCgmcGNpZXJlZ3MtPnBjaWVpbmRkYXRhKSwgdmFsKTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIFBDSUVSRUdPRkZTKHBjaWVpbmRhZGRyKSwgb2Zmc2V0KTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIFBDSUVSRUdPRkZTKHBjaWVpbmRkYXRhKSwgdmFsKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJYnJlYWs7CkBAIC0zNzQsNyArMzcwLDYgQEAKIAogc3RhdGljIGJvb2wgcGNpZV9tZGlvc2V0YmxvY2soc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHVpbnQgYmxrKQogewotCXN0cnVjdCBzYnBjaWVyZWdzIF9faW9tZW0gKnBjaWVyZWdzID0gcGktPnJlZ3MucGNpZXJlZ3M7CiAJdWludCBtZGlvZGF0YSwgaSA9IDA7CiAJdWludCBwY2llX3NlcmRlc19zcGlud2FpdCA9IDIwMDsKIApAQCAtMzgyLDEyICszNzcsMTMgQEAKIAkJICAgIChNRElPREFUQV9ERVZfQUREUiA8PCBNRElPREFUQV9ERVZBRERSX1NIRikgfAogCQkgICAgKE1ESU9EQVRBX0JMS19BRERSIDw8IE1ESU9EQVRBX1JFR0FERFJfU0hGKSB8CiAJCSAgICAoYmxrIDw8IDQpKTsKLQlXX1JFRygmcGNpZXJlZ3MtPm1kaW9kYXRhLCBtZGlvZGF0YSk7CisJYmNtYV93cml0ZTMyKHBpLT5jb3JlLCBQQ0lFUkVHT0ZGUyhtZGlvZGF0YSksIG1kaW9kYXRhKTsKIAogCXByMjg4MjlfZGVsYXkoKTsKIAkvKiByZXRyeSB0aWxsIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZSAqLwogCXdoaWxlIChpIDwgcGNpZV9zZXJkZXNfc3BpbndhaXQpIHsKLQkJaWYgKFJfUkVHKCZwY2llcmVncy0+bWRpb2NvbnRyb2wpICYgTURJT0NUTF9BQ0NFU1NfRE9ORSkKKwkJaWYgKGJjbWFfcmVhZDMyKHBpLT5jb3JlLCBQQ0lFUkVHT0ZGUyhtZGlvY29udHJvbCkpICYKKwkJICAgIE1ESU9DVExfQUNDRVNTX0RPTkUpCiAJCQlicmVhazsKIAogCQl1ZGVsYXkoMTAwMCk7CkBAIC00MDQsMTUgKzQwMCwxNSBAQAogcGNpZV9tZGlvb3Aoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHVpbnQgcGh5c21lZGlhLCB1aW50IHJlZ2FkZHIsIGJvb2wgd3JpdGUsCiAJICAgIHVpbnQgKnZhbCkKIHsKLQlzdHJ1Y3Qgc2JwY2llcmVncyBfX2lvbWVtICpwY2llcmVncyA9IHBpLT5yZWdzLnBjaWVyZWdzOwogCXVpbnQgbWRpb2RhdGE7CiAJdWludCBpID0gMDsKIAl1aW50IHBjaWVfc2VyZGVzX3NwaW53YWl0ID0gMTA7CiAKIAkvKiBlbmFibGUgbWRpbyBhY2Nlc3MgdG8gU0VSREVTICovCi0JV19SRUcoJnBjaWVyZWdzLT5tZGlvY29udHJvbCwgTURJT0NUTF9QUkVBTV9FTiB8IE1ESU9DVExfRElWSVNPUl9WQUwpOworCWJjbWFfd3JpdGUzMihwaS0+Y29yZSwgUENJRVJFR09GRlMobWRpb2NvbnRyb2wpLAorCQkgICAgIE1ESU9DVExfUFJFQU1fRU4gfCBNRElPQ1RMX0RJVklTT1JfVkFMKTsKIAotCWlmIChwaS0+c2loLT5idXNjb3JlcmV2ID49IDEwKSB7CisJaWYgKGFpX2dldF9idXNjb3JlcmV2KHBpLT5zaWgpID49IDEwKSB7CiAJCS8qIG5ldyBzZXJkZXMgaXMgc2xvd2VyIGluIHJ3LAogCQkgKiB1c2luZyB0d28gbGF5ZXJzIG9mIHJlZyBhZGRyZXNzIG1hcHBpbmcKIAkJICovCkBAIC00MzIsMjAgKzQyOCwyMiBAQAogCQltZGlvZGF0YSB8PSAoTURJT0RBVEFfU1RBUlQgfCBNRElPREFUQV9XUklURSB8IE1ESU9EQVRBX1RBIHwKIAkJCSAgICAgKnZhbCk7CiAKLQlXX1JFRygmcGNpZXJlZ3MtPm1kaW9kYXRhLCBtZGlvZGF0YSk7CisJYmNtYV93cml0ZTMyKHBpLT5jb3JlLCBQQ0lFUkVHT0ZGUyhtZGlvZGF0YSksIG1kaW9kYXRhKTsKIAogCXByMjg4MjlfZGVsYXkoKTsKIAogCS8qIHJldHJ5IHRpbGwgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlICovCiAJd2hpbGUgKGkgPCBwY2llX3NlcmRlc19zcGlud2FpdCkgewotCQlpZiAoUl9SRUcoJnBjaWVyZWdzLT5tZGlvY29udHJvbCkgJiBNRElPQ1RMX0FDQ0VTU19ET05FKSB7CisJCWlmIChiY21hX3JlYWQzMihwaS0+Y29yZSwgUENJRVJFR09GRlMobWRpb2NvbnRyb2wpKSAmCisJCSAgICBNRElPQ1RMX0FDQ0VTU19ET05FKSB7CiAJCQlpZiAoIXdyaXRlKSB7CiAJCQkJcHIyODgyOV9kZWxheSgpOwotCQkJCSp2YWwgPSAoUl9SRUcoJnBjaWVyZWdzLT5tZGlvZGF0YSkgJgorCQkJCSp2YWwgPSAoYmNtYV9yZWFkMzIocGktPmNvcmUsCisJCQkJCQkgICAgUENJRVJFR09GRlMobWRpb2RhdGEpKSAmCiAJCQkJCU1ESU9EQVRBX01BU0spOwogCQkJfQogCQkJLyogRGlzYWJsZSBtZGlvIGFjY2VzcyB0byBTRVJERVMgKi8KLQkJCVdfUkVHKCZwY2llcmVncy0+bWRpb2NvbnRyb2wsIDApOworCQkJYmNtYV93cml0ZTMyKHBpLT5jb3JlLCBQQ0lFUkVHT0ZGUyhtZGlvY29udHJvbCksIDApOwogCQkJcmV0dXJuIDA7CiAJCX0KIAkJdWRlbGF5KDEwMDApOwpAQCAtNDUzLDcgKzQ1MSw3IEBACiAJfQogCiAJLyogVGltZWQgb3V0LiBEaXNhYmxlIG1kaW8gYWNjZXNzIHRvIFNFUkRFUy4gKi8KLQlXX1JFRygmcGNpZXJlZ3MtPm1kaW9jb250cm9sLCAwKTsKKwliY21hX3dyaXRlMzIocGktPmNvcmUsIFBDSUVSRUdPRkZTKG1kaW9jb250cm9sKSwgMCk7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTUwMiwxOCArNTAwLDE4IEBACiB7CiAJdTMyIHc7CiAJc3RydWN0IHNpX3B1YiAqc2loID0gcGktPnNpaDsKLQlzdHJ1Y3Qgc2JwY2llcmVncyBfX2lvbWVtICpwY2llcmVncyA9IHBpLT5yZWdzLnBjaWVyZWdzOwogCi0JaWYgKHNpaC0+YnVzY29yZXR5cGUgIT0gUENJRV9DT1JFX0lEIHx8IHNpaC0+YnVzY29yZXJldiA8IDcpCisJaWYgKGFpX2dldF9idXNjb3JldHlwZShzaWgpICE9IFBDSUVfQ09SRV9JRCB8fAorCSAgICBhaV9nZXRfYnVzY29yZXJldihzaWgpIDwgNykKIAkJcmV0dXJuOwogCi0JdyA9IHBjaWVfcmVhZHJlZyhwY2llcmVncywgUENJRV9QQ0lFUkVHUywgUENJRV9ETExQX1BNVEhSRVNIUkVHKTsKKwl3ID0gcGNpZV9yZWFkcmVnKHBpLT5jb3JlLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX0RMTFBfUE1USFJFU0hSRUcpOwogCWlmIChleHRlbmQpCiAJCXcgfD0gUENJRV9BU1BNVElNRVJfRVhURU5EOwogCWVsc2UKIAkJdyAmPSB+UENJRV9BU1BNVElNRVJfRVhURU5EOwotCXBjaWVfd3JpdGVyZWcocGNpZXJlZ3MsIFBDSUVfUENJRVJFR1MsIFBDSUVfRExMUF9QTVRIUkVTSFJFRywgdyk7Ci0JdyA9IHBjaWVfcmVhZHJlZyhwY2llcmVncywgUENJRV9QQ0lFUkVHUywgUENJRV9ETExQX1BNVEhSRVNIUkVHKTsKKwlwY2llX3dyaXRlcmVnKHBpLT5jb3JlLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX0RMTFBfUE1USFJFU0hSRUcsIHcpOworCXcgPSBwY2llX3JlYWRyZWcocGktPmNvcmUsIFBDSUVfUENJRVJFR1MsIFBDSUVfRExMUF9QTVRIUkVTSFJFRyk7CiB9CiAKIC8qIGNlbnRyYWxpemVkIGNsa3JlcSBjb250cm9sIHBvbGljeSAqLwpAQCAtNTI3LDI1ICs1MjUsMjcgQEAKIAkJCXBjaWVfY2xrcmVxKHBpLCAxLCAwKTsKIAkJYnJlYWs7CiAJY2FzZSBTSV9QQ0lET1dOOgotCQlpZiAoc2loLT5idXNjb3JlcmV2ID09IDYpIHsJLyogdHVybiBvbiBzZXJkZXMgUExMIGRvd24gKi8KLQkJCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfYWRkciksCi0JCQkJICAgfjAsIDApOwotCQkJYWlfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9kYXRhKSwKLQkJCQkgICB+MHg0MCwgMCk7CisJCS8qIHR1cm4gb24gc2VyZGVzIFBMTCBkb3duICovCisJCWlmIChhaV9nZXRfYnVzY29yZXJldihzaWgpID09IDYpIHsKKwkJCWFpX2NjX3JlZyhzaWgsCisJCQkJICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9hZGRyKSwKKwkJCQkgIH4wLCAwKTsKKwkJCWFpX2NjX3JlZyhzaWgsCisJCQkJICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9kYXRhKSwKKwkJCQkgIH4weDQwLCAwKTsKIAkJfSBlbHNlIGlmIChwaS0+cGNpZV9wcjQyNzY3KSB7CiAJCQlwY2llX2Nsa3JlcShwaSwgMSwgMSk7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBTSV9QQ0lVUDoKLQkJaWYgKHNpaC0+YnVzY29yZXJldiA9PSA2KSB7CS8qIHR1cm4gb2ZmIHNlcmRlcyBQTEwgZG93biAqLwotCQkJYWlfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9hZGRyKSwKLQkJCQkgICB+MCwgMCk7Ci0JCQlhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAotCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2RhdGEpLAotCQkJCSAgIH4weDQwLCAweDQwKTsKKwkJLyogdHVybiBvZmYgc2VyZGVzIFBMTCBkb3duICovCisJCWlmIChhaV9nZXRfYnVzY29yZXJldihzaWgpID09IDYpIHsKKwkJCWFpX2NjX3JlZyhzaWgsCisJCQkJICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9hZGRyKSwKKwkJCQkgIH4wLCAwKTsKKwkJCWFpX2NjX3JlZyhzaWgsCisJCQkJICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9kYXRhKSwKKwkJCQkgIH4weDQwLCAweDQwKTsKIAkJfSBlbHNlIGlmIChQQ0lFX0FTUE0oc2loKSkgewkvKiBkaXNhYmxlIGNsa3JlcSAqLwogCQkJcGNpZV9jbGtyZXEocGksIDEsIDApOwogCQl9CkBAIC01NjIsNyArNTYyLDcgQEAKIAlpZiAocGktPnBjaWVfcG9sYXJpdHkgIT0gMCkKIAkJcmV0dXJuOwogCi0JdyA9IHBjaWVfcmVhZHJlZyhwaS0+cmVncy5wY2llcmVncywgUENJRV9QQ0lFUkVHUywgUENJRV9QTFBfU1RBVFVTUkVHKTsKKwl3ID0gcGNpZV9yZWFkcmVnKHBpLT5jb3JlLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX1BMUF9TVEFUVVNSRUcpOwogCiAJLyogRGV0ZWN0IHRoZSBjdXJyZW50IHBvbGFyaXR5IGF0IGF0dGFjaCBhbmQgZm9yY2UgdGhhdCBwb2xhcml0eSBhbmQKIAkgKiBkaXNhYmxlIGNoYW5naW5nIHRoZSBwb2xhcml0eQpAQCAtNTgxLDE4ICs1ODEsMTUgQEAKICAqLwogc3RhdGljIHZvaWQgcGNpZV93YXJfYXNwbV9jbGtyZXEoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKIAlzdHJ1Y3Qgc2lfcHViICpzaWggPSBwaS0+c2loOwogCXUxNiB2YWwxNjsKLQl1MTYgX19pb21lbSAqcmVnMTY7CiAJdTMyIHc7CiAKIAlpZiAoIVBDSUVfQVNQTShzaWgpKQogCQlyZXR1cm47CiAKIAkvKiBieXBhc3MgdGhpcyBvbiBRVCBvciBWU0lNICovCi0JcmVnMTYgPSAmcGNpZXJlZ3MtPnNwcm9tW1NSU0hfQVNQTV9PRkZTRVRdOwotCXZhbDE2ID0gUl9SRUcocmVnMTYpOworCXZhbDE2ID0gYmNtYV9yZWFkMTYocGktPmNvcmUsIFBDSUVSRUdPRkZTKHNwcm9tW1NSU0hfQVNQTV9PRkZTRVRdKSk7CiAKIAl2YWwxNiAmPSB+U1JTSF9BU1BNX0VOQjsKIAlpZiAocGktPnBjaWVfd2FyX2FzcG1fb3ZyID09IFBDSUVfQVNQTV9FTkFCKQpAQCAtNjAyLDE1ICs1OTksMTUgQEAKIAllbHNlIGlmIChwaS0+cGNpZV93YXJfYXNwbV9vdnIgPT0gUENJRV9BU1BNX0wwc19FTkFCKQogCQl2YWwxNiB8PSBTUlNIX0FTUE1fTDBzX0VOQjsKIAotCVdfUkVHKHJlZzE2LCB2YWwxNik7CisJYmNtYV93cml0ZTE2KHBpLT5jb3JlLCBQQ0lFUkVHT0ZGUyhzcHJvbVtTUlNIX0FTUE1fT0ZGU0VUXSksIHZhbDE2KTsKIAogCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwaS0+ZGV2LCBwaS0+cGNpZWNhcF9sY3JlZ19vZmZzZXQsICZ3KTsKIAl3ICY9IH5QQ0lFX0FTUE1fRU5BQjsKIAl3IHw9IHBpLT5wY2llX3dhcl9hc3BtX292cjsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBpLT5kZXYsIHBpLT5wY2llY2FwX2xjcmVnX29mZnNldCwgdyk7CiAKLQlyZWcxNiA9ICZwY2llcmVncy0+c3Byb21bU1JTSF9DTEtSRVFfT0ZGU0VUX1JFVjVdOwotCXZhbDE2ID0gUl9SRUcocmVnMTYpOworCXZhbDE2ID0gYmNtYV9yZWFkMTYocGktPmNvcmUsCisJCQkgICAgUENJRVJFR09GRlMoc3Byb21bU1JTSF9DTEtSRVFfT0ZGU0VUX1JFVjVdKSk7CiAKIAlpZiAocGktPnBjaWVfd2FyX2FzcG1fb3ZyICE9IFBDSUVfQVNQTV9ESVNBQikgewogCQl2YWwxNiB8PSBTUlNIX0NMS1JFUV9FTkI7CkBAIC02MTgsNyArNjE1LDggQEAKIAl9IGVsc2UKIAkJdmFsMTYgJj0gflNSU0hfQ0xLUkVRX0VOQjsKIAotCVdfUkVHKHJlZzE2LCB2YWwxNik7CisJYmNtYV93cml0ZTE2KHBpLT5jb3JlLCBQQ0lFUkVHT0ZGUyhzcHJvbVtTUlNIX0NMS1JFUV9PRkZTRVRfUkVWNV0pLAorCQkgICAgIHZhbDE2KTsKIH0KIAogLyogQXBwbHkgdGhlIHBvbGFyaXR5IGRldGVybWluZWQgYXQgdGhlIHN0YXJ0ICovCkBAIC02NDIsMTYgKzY0MCwxNSBAQAogLyogTmVlZHMgdG8gaGFwcGVuIHdoZW4gY29taW5nIG91dCBvZiAnc3RhbmRieScvJ2hpYmVybmF0ZScgKi8KIHN0YXRpYyB2b2lkIHBjaWVfbWlzY19jb25maWdfZml4dXAoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqcGNpZXJlZ3MgPSBwaS0+cmVncy5wY2llcmVnczsKIAl1MTYgdmFsMTY7Ci0JdTE2IF9faW9tZW0gKnJlZzE2OwogCi0JcmVnMTYgPSAmcGNpZXJlZ3MtPnNwcm9tW1NSU0hfUENJRV9NSVNDX0NPTkZJR107Ci0JdmFsMTYgPSBSX1JFRyhyZWcxNik7CisJdmFsMTYgPSBiY21hX3JlYWQxNihwaS0+Y29yZSwKKwkJCSAgICBQQ0lFUkVHT0ZGUyhzcHJvbVtTUlNIX1BDSUVfTUlTQ19DT05GSUddKSk7CiAKIAlpZiAoKHZhbDE2ICYgU1JTSF9MMjNSRUFEWV9FWElUX05PUEVSU1QpID09IDApIHsKIAkJdmFsMTYgfD0gU1JTSF9MMjNSRUFEWV9FWElUX05PUEVSU1Q7Ci0JCVdfUkVHKHJlZzE2LCB2YWwxNik7CisJCWJjbWFfd3JpdGUxNihwaS0+Y29yZSwKKwkJCSAgICAgUENJRVJFR09GRlMoc3Byb21bU1JTSF9QQ0lFX01JU0NfQ09ORklHXSksIHZhbDE2KTsKIAl9CiB9CiAKQEAgLTY1OSw2MiArNjU2LDU3IEBACiAvKiBOZWVkcyB0byBoYXBwZW4gd2hlbiBjb21pbmcgb3V0IG9mICdzdGFuZGJ5Jy8naGliZXJuYXRlJyAqLwogc3RhdGljIHZvaWQgcGNpZV93YXJfbm9wbGxkb3duKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpKQogewotCXN0cnVjdCBzYnBjaWVyZWdzIF9faW9tZW0gKnBjaWVyZWdzID0gcGktPnJlZ3MucGNpZXJlZ3M7Ci0JdTE2IF9faW9tZW0gKnJlZzE2OwotCiAJLyogdHVybiBvZmYgc2VyZGVzIFBMTCBkb3duICovCi0JYWlfY29yZXJlZyhwaS0+c2loLCBTSV9DQ19JRFgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sKSwKLQkJICAgQ0hJUENUUkxfNDMyMV9QTExfRE9XTiwgQ0hJUENUUkxfNDMyMV9QTExfRE9XTik7CisJYWlfY2NfcmVnKHBpLT5zaWgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sKSwKKwkJICBDSElQQ1RSTF80MzIxX1BMTF9ET1dOLCBDSElQQ1RSTF80MzIxX1BMTF9ET1dOKTsKIAogCS8qIGNsZWFyIHNyb20gc2hhZG93IGJhY2tkb29yICovCi0JcmVnMTYgPSAmcGNpZXJlZ3MtPnNwcm9tW1NSU0hfQkRfT0ZGU0VUXTsKLQlXX1JFRyhyZWcxNiwgMCk7CisJYmNtYV93cml0ZTE2KHBpLT5jb3JlLCBQQ0lFUkVHT0ZGUyhzcHJvbVtTUlNIX0JEX09GRlNFVF0pLCAwKTsKIH0KIAogLyogTmVlZHMgdG8gaGFwcGVuIHdoZW4gY29taW5nIG91dCBvZiAnc3RhbmRieScvJ2hpYmVybmF0ZScgKi8KIHN0YXRpYyB2b2lkIHBjaWVfd2FyX3BjaV9zZXR1cChzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSkKIHsKIAlzdHJ1Y3Qgc2lfcHViICpzaWggPSBwaS0+c2loOwotCXN0cnVjdCBzYnBjaWVyZWdzIF9faW9tZW0gKnBjaWVyZWdzID0gcGktPnJlZ3MucGNpZXJlZ3M7CiAJdTMyIHc7CiAKLQlpZiAoc2loLT5idXNjb3JlcmV2ID09IDAgfHwgc2loLT5idXNjb3JlcmV2ID09IDEpIHsKLQkJdyA9IHBjaWVfcmVhZHJlZyhwY2llcmVncywgUENJRV9QQ0lFUkVHUywKKwlpZiAoYWlfZ2V0X2J1c2NvcmVyZXYoc2loKSA9PSAwIHx8IGFpX2dldF9idXNjb3JlcmV2KHNpaCkgPT0gMSkgeworCQl3ID0gcGNpZV9yZWFkcmVnKHBpLT5jb3JlLCBQQ0lFX1BDSUVSRUdTLAogCQkJCSBQQ0lFX1RMUF9XT1JLQVJPVU5EU1JFRyk7CiAJCXcgfD0gMHg4OwotCQlwY2llX3dyaXRlcmVnKHBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLAorCQlwY2llX3dyaXRlcmVnKHBpLT5jb3JlLCBQQ0lFX1BDSUVSRUdTLAogCQkJICAgICAgUENJRV9UTFBfV09SS0FST1VORFNSRUcsIHcpOwogCX0KIAotCWlmIChzaWgtPmJ1c2NvcmVyZXYgPT0gMSkgewotCQl3ID0gcGNpZV9yZWFkcmVnKHBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX0RMTFBfTENSRUcpOworCWlmIChhaV9nZXRfYnVzY29yZXJldihzaWgpID09IDEpIHsKKwkJdyA9IHBjaWVfcmVhZHJlZyhwaS0+Y29yZSwgUENJRV9QQ0lFUkVHUywgUENJRV9ETExQX0xDUkVHKTsKIAkJdyB8PSAweDQwOwotCQlwY2llX3dyaXRlcmVnKHBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX0RMTFBfTENSRUcsIHcpOworCQlwY2llX3dyaXRlcmVnKHBpLT5jb3JlLCBQQ0lFX1BDSUVSRUdTLCBQQ0lFX0RMTFBfTENSRUcsIHcpOwogCX0KIAotCWlmIChzaWgtPmJ1c2NvcmVyZXYgPT0gMCkgeworCWlmIChhaV9nZXRfYnVzY29yZXJldihzaWgpID09IDApIHsKIAkJcGNpZV9tZGlvd3JpdGUocGksIE1ESU9EQVRBX0RFVl9SWCwgU0VSREVTX1JYX1RJTUVSMSwgMHg4MTI4KTsKIAkJcGNpZV9tZGlvd3JpdGUocGksIE1ESU9EQVRBX0RFVl9SWCwgU0VSREVTX1JYX0NEUiwgMHgwMTAwKTsKIAkJcGNpZV9tZGlvd3JpdGUocGksIE1ESU9EQVRBX0RFVl9SWCwgU0VSREVTX1JYX0NEUkJXLCAweDE0NjYpOwogCX0gZWxzZSBpZiAoUENJRV9BU1BNKHNpaCkpIHsKIAkJLyogQ2hhbmdlIHRoZSBMMSB0aHJlc2hvbGQgZm9yIGJldHRlciBwZXJmb3JtYW5jZSAqLwotCQl3ID0gcGNpZV9yZWFkcmVnKHBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLAorCQl3ID0gcGNpZV9yZWFkcmVnKHBpLT5jb3JlLCBQQ0lFX1BDSUVSRUdTLAogCQkJCSBQQ0lFX0RMTFBfUE1USFJFU0hSRUcpOwogCQl3ICY9IH5QQ0lFX0wxVEhSRVNIT0xEVElNRV9NQVNLOwogCQl3IHw9IFBDSUVfTDFUSFJFU0hPTERfV0FSVkFMIDw8IFBDSUVfTDFUSFJFU0hPTERUSU1FX1NISUZUOwotCQlwY2llX3dyaXRlcmVnKHBjaWVyZWdzLCBQQ0lFX1BDSUVSRUdTLAorCQlwY2llX3dyaXRlcmVnKHBpLT5jb3JlLCBQQ0lFX1BDSUVSRUdTLAogCQkJICAgICAgUENJRV9ETExQX1BNVEhSRVNIUkVHLCB3KTsKIAogCQlwY2llX3dhcl9zZXJkZXMocGkpOwogCiAJCXBjaWVfd2FyX2FzcG1fY2xrcmVxKHBpKTsKLQl9IGVsc2UgaWYgKHBpLT5zaWgtPmJ1c2NvcmVyZXYgPT0gNykKKwl9IGVsc2UgaWYgKGFpX2dldF9idXNjb3JlcmV2KHBpLT5zaWgpID09IDcpCiAJCXBjaWVfd2FyX25vcGxsZG93bihwaSk7CiAKIAkvKiBOb3RlIHRoYXQgdGhlIGZpeCBpcyBhY3R1YWxseSBpbiB0aGUgU1JPTSwKIAkgKiB0aGF0J3Mgd2h5IHRoaXMgaXMgb3Blbi1lbmRlZAogCSAqLwotCWlmIChwaS0+c2loLT5idXNjb3JlcmV2ID49IDYpCisJaWYgKGFpX2dldF9idXNjb3JlcmV2KHBpLT5zaWgpID49IDYpCiAJCXBjaWVfbWlzY19jb25maWdfZml4dXAocGkpOwogfQogCkBAIC03NDUsNyArNzM3LDcgQEAKIAogdm9pZCBwY2ljb3JlX2h3dXAoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGkpCiB7Ci0JaWYgKCFwaSB8fCBwaS0+c2loLT5idXNjb3JldHlwZSAhPSBQQ0lFX0NPUkVfSUQpCisJaWYgKCFwaSB8fCBhaV9nZXRfYnVzY29yZXR5cGUocGktPnNpaCkgIT0gUENJRV9DT1JFX0lEKQogCQlyZXR1cm47CiAKIAlwY2llX3dhcl9wY2lfc2V0dXAocGkpOwpAQCAtNzUzLDcgKzc0NSw3IEBACiAKIHZvaWQgcGNpY29yZV91cChzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSwgaW50IHN0YXRlKQogewotCWlmICghcGkgfHwgcGktPnNpaC0+YnVzY29yZXR5cGUgIT0gUENJRV9DT1JFX0lEKQorCWlmICghcGkgfHwgYWlfZ2V0X2J1c2NvcmV0eXBlKHBpLT5zaWgpICE9IFBDSUVfQ09SRV9JRCkKIAkJcmV0dXJuOwogCiAJLyogUmVzdG9yZSBMMSB0aW1lciBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlICovCkBAIC03ODEsNyArNzczLDcgQEAKIAogdm9pZCBwY2ljb3JlX2Rvd24oc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIGludCBzdGF0ZSkKIHsKLQlpZiAoIXBpIHx8IHBpLT5zaWgtPmJ1c2NvcmV0eXBlICE9IFBDSUVfQ09SRV9JRCkKKwlpZiAoIXBpIHx8IGFpX2dldF9idXNjb3JldHlwZShwaS0+c2loKSAhPSBQQ0lFX0NPUkVfSUQpCiAJCXJldHVybjsKIAogCXBjaWVfY2xrcmVxX3VwZChwaSwgc3RhdGUpOwpAQCAtNzkwLDQ2ICs3ODIsNDUgQEAKIAlwY2llX2V4dGVuZEwxdGltZXIocGksIGZhbHNlKTsKIH0KIAotLyogcHJlY29uZGl0aW9uOiBjdXJyZW50IGNvcmUgaXMgc2lpLT5idXNjb3JldHlwZSAqLwotc3RhdGljIHZvaWQgcGNpY29yZV9maXhjZmcoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHUxNiBfX2lvbWVtICpyZWcxNikKK3ZvaWQgcGNpY29yZV9maXhjZmcoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGkpCiB7Ci0Jc3RydWN0IHNpX2luZm8gKnNpaSA9IChzdHJ1Y3Qgc2lfaW5mbyAqKShwaS0+c2loKTsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUgPSBwaS0+Y29yZTsKIAl1MTYgdmFsMTY7Ci0JdWludCBwY2lpZHg7CisJdWludCByZWdvZmY7CiAKLQlwY2lpZHggPSBhaV9jb3JlaWR4KCZzaWktPnB1Yik7Ci0JdmFsMTYgPSBSX1JFRyhyZWcxNik7Ci0JaWYgKCgodmFsMTYgJiBTUlNIX1BJX01BU0spID4+IFNSU0hfUElfU0hJRlQpICE9ICh1MTYpcGNpaWR4KSB7Ci0JCXZhbDE2ID0gKHUxNikocGNpaWR4IDw8IFNSU0hfUElfU0hJRlQpIHwKLQkJCSh2YWwxNiAmIH5TUlNIX1BJX01BU0spOwotCQlXX1JFRyhyZWcxNiwgdmFsMTYpOworCXN3aXRjaCAocGktPmNvcmUtPmlkLmlkKSB7CisJY2FzZSBCQ01BX0NPUkVfUENJOgorCQlyZWdvZmYgPSBQQ0lSRUdPRkZTKHNwcm9tW1NSU0hfUElfT0ZGU0VUXSk7CisJCWJyZWFrOworCisJY2FzZSBCQ01BX0NPUkVfUENJRToKKwkJcmVnb2ZmID0gUENJRVJFR09GRlMoc3Byb21bU1JTSF9QSV9PRkZTRVRdKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm47CiAJfQotfQogCi12b2lkCi1wY2ljb3JlX2ZpeGNmZ19wY2koc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHN0cnVjdCBzYnBjaXJlZ3MgX19pb21lbSAqcGNpcmVncykKLXsKLQlwY2ljb3JlX2ZpeGNmZyhwaSwgJnBjaXJlZ3MtPnNwcm9tW1NSU0hfUElfT0ZGU0VUXSk7Ci19Ci0KLXZvaWQgcGNpY29yZV9maXhjZmdfcGNpZShzdHJ1Y3QgcGNpY29yZV9pbmZvICpwaSwKLQkJCSBzdHJ1Y3Qgc2JwY2llcmVncyBfX2lvbWVtICpwY2llcmVncykKLXsKLQlwY2ljb3JlX2ZpeGNmZyhwaSwgJnBjaWVyZWdzLT5zcHJvbVtTUlNIX1BJX09GRlNFVF0pOworCXZhbDE2ID0gYmNtYV9yZWFkMTYocGktPmNvcmUsIHJlZ29mZik7CisJaWYgKCgodmFsMTYgJiBTUlNIX1BJX01BU0spID4+IFNSU0hfUElfU0hJRlQpICE9CisJICAgICh1MTYpY29yZS0+Y29yZV9pbmRleCkgeworCQl2YWwxNiA9ICgodTE2KWNvcmUtPmNvcmVfaW5kZXggPDwgU1JTSF9QSV9TSElGVCkgfAorCQkJKHZhbDE2ICYgflNSU0hfUElfTUFTSyk7CisJCWJjbWFfd3JpdGUxNihwaS0+Y29yZSwgcmVnb2ZmLCB2YWwxNik7CisJfQogfQogCiAvKiBwcmVjb25kaXRpb246IGN1cnJlbnQgY29yZSBpcyBwY2kgY29yZSAqLwogdm9pZAotcGNpY29yZV9wY2lfc2V0dXAoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGksIHN0cnVjdCBzYnBjaXJlZ3MgX19pb21lbSAqcGNpcmVncykKK3BjaWNvcmVfcGNpX3NldHVwKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBpKQogewotCXUzMiB3OworCWJjbWFfc2V0MzIocGktPmNvcmUsIFBDSVJFR09GRlMoc2J0b3BjaTIpLAorCQkgICBTQlRPUENJX1BSRUYgfCBTQlRPUENJX0JVUlNUKTsKIAotCU9SX1JFRygmcGNpcmVncy0+c2J0b3BjaTIsIFNCVE9QQ0lfUFJFRiB8IFNCVE9QQ0lfQlVSU1QpOwotCi0JaWYgKCgoc3RydWN0IHNpX2luZm8gKikocGktPnNpaCkpLT5wdWIuYnVzY29yZXJldiA+PSAxMSkgewotCQlPUl9SRUcoJnBjaXJlZ3MtPnNidG9wY2kyLCBTQlRPUENJX1JDX1JFQURNVUxUSSk7Ci0JCXcgPSBSX1JFRygmcGNpcmVncy0+Y2xrcnVuKTsKLQkJV19SRUcoJnBjaXJlZ3MtPmNsa3J1biwgdyB8IFBDSV9DTEtSVU5fRFNCTCk7Ci0JCXcgPSBSX1JFRygmcGNpcmVncy0+Y2xrcnVuKTsKKwlpZiAocGktPmNvcmUtPmlkLnJldiA+PSAxMSkgeworCQliY21hX3NldDMyKHBpLT5jb3JlLCBQQ0lSRUdPRkZTKHNidG9wY2kyKSwKKwkJCSAgIFNCVE9QQ0lfUkNfUkVBRE1VTFRJKTsKKwkJYmNtYV9zZXQzMihwaS0+Y29yZSwgUENJUkVHT0ZGUyhjbGtydW4pLCBQQ0lfQ0xLUlVOX0RTQkwpOworCQkodm9pZCliY21hX3JlYWQzMihwaS0+Y29yZSwgUENJUkVHT0ZGUyhjbGtydW4pKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbmljcGNpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvbmljcGNpLmgKaW5kZXggNThhYTgwZC4uOWZjM2VhZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL25pY3BjaS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9uaWNwY2kuaApAQCAtNjIsOCArNjIsNyBAQAogc3RydWN0IHNicGNpZXJlZ3M7CiAKIGV4dGVybiBzdHJ1Y3QgcGNpY29yZV9pbmZvICpwY2ljb3JlX2luaXQoc3RydWN0IHNpX3B1YiAqc2loLAotCQkJCQkgc3RydWN0IHBjaV9kZXYgKnBkZXYsCi0JCQkJCSB2b2lkIF9faW9tZW0gKnJlZ3MpOworCQkJCQkgc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlKTsKIGV4dGVybiB2b2lkIHBjaWNvcmVfZGVpbml0KHN0cnVjdCBwY2ljb3JlX2luZm8gKnBjaCk7CiBleHRlcm4gdm9pZCBwY2ljb3JlX2F0dGFjaChzdHJ1Y3QgcGNpY29yZV9pbmZvICpwY2gsIGludCBzdGF0ZSk7CiBleHRlcm4gdm9pZCBwY2ljb3JlX2h3dXAoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGNoKTsKQEAgLTcyLDExICs3MSw3IEBACiBleHRlcm4gdm9pZCBwY2ljb3JlX2Rvd24oc3RydWN0IHBjaWNvcmVfaW5mbyAqcGNoLCBpbnQgc3RhdGUpOwogZXh0ZXJuIHU4IHBjaWNvcmVfZmluZF9wY2lfY2FwYWJpbGl0eShzdHJ1Y3QgcGNpX2RldiAqZGV2LCB1OCByZXFfY2FwX2lkLAogCQkJCSAgICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgdTMyICpidWZsZW4pOwotZXh0ZXJuIHZvaWQgcGNpY29yZV9maXhjZmdfcGNpKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBjaCwKLQkJCSAgICAgICBzdHJ1Y3Qgc2JwY2lyZWdzIF9faW9tZW0gKnBjaXJlZ3MpOwotZXh0ZXJuIHZvaWQgcGNpY29yZV9maXhjZmdfcGNpZShzdHJ1Y3QgcGNpY29yZV9pbmZvICpwY2gsCi0JCQkJc3RydWN0IHNicGNpZXJlZ3MgX19pb21lbSAqcGNpcmVncyk7Ci1leHRlcm4gdm9pZCBwY2ljb3JlX3BjaV9zZXR1cChzdHJ1Y3QgcGNpY29yZV9pbmZvICpwY2gsCi0JCQkgICAgICBzdHJ1Y3Qgc2JwY2lyZWdzIF9faW9tZW0gKnBjaXJlZ3MpOworZXh0ZXJuIHZvaWQgcGNpY29yZV9maXhjZmcoc3RydWN0IHBjaWNvcmVfaW5mbyAqcGNoKTsKK2V4dGVybiB2b2lkIHBjaWNvcmVfcGNpX3NldHVwKHN0cnVjdCBwY2ljb3JlX2luZm8gKnBjaCk7CiAKICNlbmRpZiAvKiBfQlJDTV9OSUNQQ0lfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9vdHAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9vdHAuYwppbmRleCBlZGY1NTE1Li5mMWNhMTI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvb3RwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL290cC5jCkBAIC03Nyw3ICs3Nyw3IEBACiB9OwogCiBzdHJ1Y3Qgb3RwaW5mbyB7Ci0JdWludCBjY3JldjsJCS8qIGNoaXBjIHJldmlzaW9uICovCisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlOyAvKiBjaGlwYyBjb3JlICovCiAJY29uc3Qgc3RydWN0IG90cF9mbl9zICpmbjsJLyogT1RQIGZ1bmN0aW9ucyAqLwogCXN0cnVjdCBzaV9wdWIgKnNpaDsJCS8qIFNhdmVkIHNiIGhhbmRsZSAqLwogCkBAIC0xMzMsOSArMTMzLDEwIEBACiAjZGVmaW5lIE9UUF9TWl9GVV8xNDQJCSgxNDQvOCkJLyogMTQ0IGJpdHMgKi8KIAogc3RhdGljIHUxNgotaXB4b3RwX290cHIoc3RydWN0IG90cGluZm8gKm9pLCBzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjLCB1aW50IHduKQoraXB4b3RwX290cHIoc3RydWN0IG90cGluZm8gKm9pLCB1aW50IHduKQogewotCXJldHVybiBSX1JFRygmY2MtPnNyb21vdHBbd25dKTsKKwlyZXR1cm4gYmNtYV9yZWFkMTYob2ktPmNvcmUsCisJCQkgICBDSElQQ1JFR09GRlMoc3JvbW90cFt3bl0pKTsKIH0KIAogLyoKQEAgLTE0Niw3ICsxNDcsNyBAQAogewogCWludCByZXQgPSAwOwogCi0Jc3dpdGNoIChzaWgtPmNoaXApIHsKKwlzd2l0Y2ggKGFpX2dldF9jaGlwX2lkKHNpaCkpIHsKIAljYXNlIEJDTTQzMjI0X0NISVBfSUQ6CiAJY2FzZSBCQ000MzIyNV9DSElQX0lEOgogCQlyZXQgPSBvc2l6ZXcgKiAyIC0gT1RQX1NaX0ZVXzcyIC0gT1RQX1NaX0NIRUNLU1VNOwpAQCAtMTYxLDE5ICsxNjIsMjEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBfaXB4b3RwX2luaXQoc3RydWN0IG90cGluZm8gKm9pLCBzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjKQorc3RhdGljIHZvaWQgX2lweG90cF9pbml0KHN0cnVjdCBvdHBpbmZvICpvaSkKIHsKIAl1aW50IGs7CiAJdTMyIG90cHAsIHN0OworCWludCBjY3JldiA9IGFpX2dldF9jY3JldihvaS0+c2loKTsKKwogCiAJLyoKIAkgKiByZWNvcmQgd29yZCBvZmZzZXQgb2YgR2VuZXJhbCBVc2UgUmVnaW9uCiAJICogZm9yIHZhcmlvdXMgY2hpcGNvbW1vbiByZXZzCiAJICovCi0JaWYgKG9pLT5zaWgtPmNjcmV2ID09IDIxIHx8IG9pLT5zaWgtPmNjcmV2ID09IDI0Ci0JICAgIHx8IG9pLT5zaWgtPmNjcmV2ID09IDI3KSB7CisJaWYgKGNjcmV2ID09IDIxIHx8IGNjcmV2ID09IDI0CisJICAgIHx8IGNjcmV2ID09IDI3KSB7CiAJCW9pLT5vdHBndV9iYXNlID0gUkVWQTRfT1RQR1VfQkFTRTsKLQl9IGVsc2UgaWYgKG9pLT5zaWgtPmNjcmV2ID09IDM2KSB7CisJfSBlbHNlIGlmIChjY3JldiA9PSAzNikgewogCQkvKgogCQkgKiBPVFAgc2l6ZSBncmVhdGVyIHRoYW4gZXF1YWwgdG8gMktCICgxMjggd29yZHMpLAogCQkgKiBvdHBndV9iYXNlIGlzIHNpbWlsYXIgdG8gcmV2MjMKQEAgLTE4Miw3ICsxODUsNyBAQAogCQkJb2ktPm90cGd1X2Jhc2UgPSBSRVZCOF9PVFBHVV9CQVNFOwogCQllbHNlCiAJCQlvaS0+b3RwZ3VfYmFzZSA9IFJFVjM2X09UUEdVX0JBU0U7Ci0JfSBlbHNlIGlmIChvaS0+c2loLT5jY3JldiA9PSAyMyB8fCBvaS0+c2loLT5jY3JldiA+PSAyNSkgeworCX0gZWxzZSBpZiAoY2NyZXYgPT0gMjMgfHwgY2NyZXYgPj0gMjUpIHsKIAkJb2ktPm90cGd1X2Jhc2UgPSBSRVZCOF9PVFBHVV9CQVNFOwogCX0KIApAQCAtMTkwLDI0ICsxOTMsMjEgQEAKIAlvdHBwID0KIAkgICAgT1RQUF9TVEFSVF9CVVNZIHwgKChPVFBQT0NfSU5JVCA8PCBPVFBQX09DX1NISUZUKSAmIE9UUFBfT0NfTUFTSyk7CiAKLQlXX1JFRygmY2MtPm90cHByb2csIG90cHApOwotCWZvciAoayA9IDA7Ci0JICAgICAoKHN0ID0gUl9SRUcoJmNjLT5vdHBwcm9nKSkgJiBPVFBQX1NUQVJUX0JVU1kpCi0JICAgICAmJiAoayA8IE9UUFBfVFJJRVMpOyBrKyspCi0JCTsKKwliY21hX3dyaXRlMzIob2ktPmNvcmUsIENISVBDUkVHT0ZGUyhvdHBwcm9nKSwgb3RwcCk7CisJc3QgPSBiY21hX3JlYWQzMihvaS0+Y29yZSwgQ0hJUENSRUdPRkZTKG90cHByb2cpKTsKKwlmb3IgKGsgPSAwOyAoc3QgJiBPVFBQX1NUQVJUX0JVU1kpICYmIChrIDwgT1RQUF9UUklFUyk7IGsrKykKKwkJc3QgPSBiY21hX3JlYWQzMihvaS0+Y29yZSwgQ0hJUENSRUdPRkZTKG90cHByb2cpKTsKIAlpZiAoayA+PSBPVFBQX1RSSUVTKQogCQlyZXR1cm47CiAKIAkvKiBSZWFkIE9UUCBsb2NrIGJpdHMgYW5kIHN1YnJlZ2lvbiBwcm9ncmFtbWVkIGluZGljYXRpb24gYml0cyAqLwotCW9pLT5zdGF0dXMgPSBSX1JFRygmY2MtPm90cHN0YXR1cyk7CisJb2ktPnN0YXR1cyA9IGJjbWFfcmVhZDMyKG9pLT5jb3JlLCBDSElQQ1JFR09GRlMob3Rwc3RhdHVzKSk7CiAKLQlpZiAoKG9pLT5zaWgtPmNoaXAgPT0gQkNNNDMyMjRfQ0hJUF9JRCkKLQkgICAgfHwgKG9pLT5zaWgtPmNoaXAgPT0gQkNNNDMyMjVfQ0hJUF9JRCkpIHsKKwlpZiAoKGFpX2dldF9jaGlwX2lkKG9pLT5zaWgpID09IEJDTTQzMjI0X0NISVBfSUQpCisJICAgIHx8IChhaV9nZXRfY2hpcF9pZChvaS0+c2loKSA9PSBCQ000MzIyNV9DSElQX0lEKSkgewogCQl1MzIgcF9iaXRzOwotCQlwX2JpdHMgPQotCQkgICAgKGlweG90cF9vdHByKG9pLCBjYywgb2ktPm90cGd1X2Jhc2UgKyBPVFBHVV9QX09GRikgJgotCQkgICAgIE9UUEdVX1BfTVNLKQotCQkgICAgPj4gT1RQR1VfUF9TSElGVDsKKwkJcF9iaXRzID0gKGlweG90cF9vdHByKG9pLCBvaS0+b3RwZ3VfYmFzZSArIE9UUEdVX1BfT0ZGKSAmCisJCQkgIE9UUEdVX1BfTVNLKSA+PiBPVFBHVV9QX1NISUZUOwogCQlvaS0+c3RhdHVzIHw9IChwX2JpdHMgPDwgT1RQU19HVVBfU0hJRlQpOwogCX0KIApAQCAtMjIwLDcgKzIyMCw3IEBACiAJb2ktPmh3bGltID0gb2ktPndzaXplOwogCWlmIChvaS0+c3RhdHVzICYgT1RQU19HVVBfSFcpIHsKIAkJb2ktPmh3bGltID0KLQkJICAgIGlweG90cF9vdHByKG9pLCBjYywgb2ktPm90cGd1X2Jhc2UgKyBPVFBHVV9IU0JfT0ZGKSAvIDE2OworCQkgICAgaXB4b3RwX290cHIob2ksIG9pLT5vdHBndV9iYXNlICsgT1RQR1VfSFNCX09GRikgLyAxNjsKIAkJb2ktPnN3YmFzZSA9IG9pLT5od2xpbTsKIAl9IGVsc2UKIAkJb2ktPnN3YmFzZSA9IG9pLT5od2Jhc2U7CkBAIC0yMzAsNyArMjMwLDcgQEAKIAogCWlmIChvaS0+c3RhdHVzICYgT1RQU19HVVBfU1cpIHsKIAkJb2ktPnN3bGltID0KLQkJICAgIGlweG90cF9vdHByKG9pLCBjYywgb2ktPm90cGd1X2Jhc2UgKyBPVFBHVV9TRkJfT0ZGKSAvIDE2OworCQkgICAgaXB4b3RwX290cHIob2ksIG9pLT5vdHBndV9iYXNlICsgT1RQR1VfU0ZCX09GRikgLyAxNjsKIAkJb2ktPmZiYXNlID0gb2ktPnN3bGltOwogCX0gZWxzZQogCQlvaS0+ZmJhc2UgPSBvaS0+c3diYXNlOwpAQCAtMjQwLDExICsyNDAsOCBAQAogCiBzdGF0aWMgaW50IGlweG90cF9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCwgc3RydWN0IG90cGluZm8gKm9pKQogewotCXVpbnQgaWR4OwotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7Ci0KIAkvKiBNYWtlIHN1cmUgd2UncmUgcnVubmluZyBJUFggT1RQICovCi0JaWYgKCFPVFBUWVBFX0lQWChzaWgtPmNjcmV2KSkKKwlpZiAoIU9UUFRZUEVfSVBYKGFpX2dldF9jY3JldihzaWgpKSkKIAkJcmV0dXJuIC1FQkFERTsKIAogCS8qIE1ha2Ugc3VyZSBPVFAgaXMgbm90IGRpc2FibGVkICovCkBAIC0yNTIsNyArMjQ5LDcgQEAKIAkJcmV0dXJuIC1FQkFERTsKIAogCS8qIENoZWNrIGZvciBvdHAgc2l6ZSAqLwotCXN3aXRjaCAoKHNpaC0+Y2NjYXBzICYgQ0NfQ0FQX09UUFNJWkUpID4+IENDX0NBUF9PVFBTSVpFX1NISUZUKSB7CisJc3dpdGNoICgoYWlfZ2V0X2NjY2FwcyhzaWgpICYgQ0NfQ0FQX09UUFNJWkUpID4+IENDX0NBUF9PVFBTSVpFX1NISUZUKSB7CiAJY2FzZSAwOgogCQkvKiBOb3RoaW5nIHRoZXJlICovCiAJCXJldHVybiAtRUJBREU7CkBAIC0yODIsMjEgKzI3OSwxMyBAQAogCX0KIAogCS8qIFJldHJpZXZlIE9UUCByZWdpb24gaW5mbyAqLwotCWlkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQljYyA9IGFpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwotCi0JX2lweG90cF9pbml0KG9pLCBjYyk7Ci0KLQlhaV9zZXRjb3JlaWR4KHNpaCwgaWR4KTsKLQorCV9pcHhvdHBfaW5pdChvaSk7CiAJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKIGlweG90cF9yZWFkX3JlZ2lvbihzdHJ1Y3Qgb3RwaW5mbyAqb2ksIGludCByZWdpb24sIHUxNiAqZGF0YSwgdWludCAqd2xlbikKIHsKLQl1aW50IGlkeDsKLQlzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjOwogCXVpbnQgYmFzZSwgaSwgc3o7CiAKIAkvKiBWYWxpZGF0ZSByZWdpb24gc2VsZWN0aW9uICovCkBAIC0zNjUsMTQgKzM1NCwxMCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlpZHggPSBhaV9jb3JlaWR4KG9pLT5zaWgpOwotCWNjID0gYWlfc2V0Y29yZWlkeChvaS0+c2loLCBTSV9DQ19JRFgpOwotCiAJLyogUmVhZCB0aGUgZGF0YSAqLwogCWZvciAoaSA9IDA7IGkgPCBzejsgaSsrKQotCQlkYXRhW2ldID0gaXB4b3RwX290cHIob2ksIGNjLCBiYXNlICsgaSk7CisJCWRhdGFbaV0gPSBpcHhvdHBfb3RwcihvaSwgYmFzZSArIGkpOwogCi0JYWlfc2V0Y29yZWlkeChvaS0+c2loLCBpZHgpOwogCSp3bGVuID0gc3o7CiAJcmV0dXJuIDA7CiB9CkBAIC0zODQsMTQgKzM2OSwxMyBAQAogCiBzdGF0aWMgaW50IG90cF9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCwgc3RydWN0IG90cGluZm8gKm9pKQogewotCiAJaW50IHJldDsKIAogCW1lbXNldChvaSwgMCwgc2l6ZW9mKHN0cnVjdCBvdHBpbmZvKSk7CiAKLQlvaS0+Y2NyZXYgPSBzaWgtPmNjcmV2OworCW9pLT5jb3JlID0gYWlfZmluZGNvcmUoc2loLCBCQ01BX0NPUkVfQ0hJUENPTU1PTiwgMCk7CiAKLQlpZiAoT1RQVFlQRV9JUFgob2ktPmNjcmV2KSkKKwlpZiAoT1RQVFlQRV9JUFgoYWlfZ2V0X2NjcmV2KHNpaCkpKQogCQlvaS0+Zm4gPSAmaXB4b3RwX2ZuOwogCiAJaWYgKG9pLT5mbiA9PSBOVUxMKQpAQCAtMzk5LDcgKzM4Myw3IEBACiAKIAlvaS0+c2loID0gc2loOwogCi0JcmV0ID0gKG9pLT5mbi0+aW5pdCkgKHNpaCwgb2kpOworCXJldCA9IChvaS0+Zm4tPmluaXQpKHNpaCwgb2kpOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2Ntbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfY21uLmMKaW5kZXggYTMxNDkyNS4uMjY0ZjhjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfY21uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfY21uLmMKQEAgLTEwOSwxMCArMTA5LDEwIEBACiAJezIwNCwgNTAyMH0sCiAJezIwOCwgNTA0MH0sCiAJezIxMiwgNTA2MH0sCi0JezIxNiwgNTA4MDB9CisJezIxNiwgNTA4MH0KIH07CiAKLWNvbnN0IHU4IG9mZG1fcmF0ZV9sb29rdXBbXSA9IHsKK3N0YXRpYyBjb25zdCB1OCBvZmRtX3JhdGVfbG9va3VwW10gPSB7CiAKIAlCUkNNX1JBVEVfNDhNLAogCUJSQ01fUkFURV8yNE0sCkBAIC0xNDksOSArMTQ5LDggQEAKIHZvaWQgd2xjX3JhZGlvcmVnX2V4aXQoc3RydWN0IGJyY21zX3BoeV9wdWIgKnBpaCkKIHsKIAlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKLQl1MTYgZHVtbXk7CiAKLQlkdW1teSA9IFJfUkVHKCZwaS0+cmVncy0+cGh5dmVyc2lvbik7CisJKHZvaWQpYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5dmVyc2lvbikpOwogCXBpLT5waHlfd3JlZyA9IDA7CiAJd2xhcGlfYm1hY19tY3RybChwaS0+c2gtPnBoeXNoaW0sIE1DVExfTE9DS19SQURJTywgMCk7CiB9CkBAIC0xODYsMTkgKzE4NSwxMSBAQAogCWlmICgoRDExUkVWX0dFKHBpLT5zaC0+Y29yZXJldiwgMjQpKSB8fAogCSAgICAoRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMjIpCiAJICAgICAmJiAocGktPnB1YnBpLnBoeV90eXBlICE9IFBIWV9UWVBFX1NTTikpKSB7Ci0JCVdfUkVHX0ZMVVNIKCZwaS0+cmVncy0+cmFkaW9yZWdhZGRyLCBhZGRyKTsKLQkJZGF0YSA9IFJfUkVHKCZwaS0+cmVncy0+cmFkaW9yZWdkYXRhKTsKKwkJYmNtYV93Zmx1c2gxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhyYWRpb3JlZ2FkZHIpLCBhZGRyKTsKKwkJZGF0YSA9IGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnZGF0YSkpOwogCX0gZWxzZSB7Ci0JCVdfUkVHX0ZMVVNIKCZwaS0+cmVncy0+cGh5NHdhZGRyLCBhZGRyKTsKLQotI2lmZGVmIF9fQVJNX0FSQ0hfNFRfXwotCQlfX2FzbV9fKCIgLmFsaWduIDQgIik7Ci0JCV9fYXNtX18oIiBub3AgIik7Ci0JCWRhdGEgPSBSX1JFRygmcGktPnJlZ3MtPnBoeTR3ZGF0YWxvKTsKLSNlbHNlCi0JCWRhdGEgPSBSX1JFRygmcGktPnJlZ3MtPnBoeTR3ZGF0YWxvKTsKLSNlbmRpZgotCisJCWJjbWFfd2ZsdXNoMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5NHdhZGRyKSwgYWRkcik7CisJCWRhdGEgPSBiY21hX3JlYWQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHk0d2RhdGFsbykpOwogCX0KIAlwaS0+cGh5X3dyZWcgPSAwOwogCkBAIC0yMTEsMTUgKzIwMiwxNSBAQAogCSAgICAoRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMjIpCiAJICAgICAmJiAocGktPnB1YnBpLnBoeV90eXBlICE9IFBIWV9UWVBFX1NTTikpKSB7CiAKLQkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5yYWRpb3JlZ2FkZHIsIGFkZHIpOwotCQlXX1JFRygmcGktPnJlZ3MtPnJhZGlvcmVnZGF0YSwgdmFsKTsKKwkJYmNtYV93Zmx1c2gxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhyYWRpb3JlZ2FkZHIpLCBhZGRyKTsKKwkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnZGF0YSksIHZhbCk7CiAJfSBlbHNlIHsKLQkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5waHk0d2FkZHIsIGFkZHIpOwotCQlXX1JFRygmcGktPnJlZ3MtPnBoeTR3ZGF0YWxvLCB2YWwpOworCQliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeTR3YWRkciksIGFkZHIpOworCQliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5NHdkYXRhbG8pLCB2YWwpOwogCX0KIAogCWlmICgrK3BpLT5waHlfd3JlZyA+PSBwaS0+cGh5X3dyZWdfbGltaXQpIHsKLQkJKHZvaWQpUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKKwkJKHZvaWQpYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCQlwaS0+cGh5X3dyZWcgPSAwOwogCX0KIH0KQEAgLTIzMSwxOSArMjIyLDIwIEBACiAJaWYgKEQxMVJFVl9HRShwaS0+c2gtPmNvcmVyZXYsIDI0KSkgewogCQl1MzIgYjAsIGIxLCBiMjsKIAotCQlXX1JFR19GTFVTSCgmcGktPnJlZ3MtPnJhZGlvcmVnYWRkciwgMCk7Ci0JCWIwID0gKHUzMikgUl9SRUcoJnBpLT5yZWdzLT5yYWRpb3JlZ2RhdGEpOwotCQlXX1JFR19GTFVTSCgmcGktPnJlZ3MtPnJhZGlvcmVnYWRkciwgMSk7Ci0JCWIxID0gKHUzMikgUl9SRUcoJnBpLT5yZWdzLT5yYWRpb3JlZ2RhdGEpOwotCQlXX1JFR19GTFVTSCgmcGktPnJlZ3MtPnJhZGlvcmVnYWRkciwgMik7Ci0JCWIyID0gKHUzMikgUl9SRUcoJnBpLT5yZWdzLT5yYWRpb3JlZ2RhdGEpOworCQliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnYWRkciksIDApOworCQliMCA9ICh1MzIpIGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnZGF0YSkpOworCQliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnYWRkciksIDEpOworCQliMSA9ICh1MzIpIGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnZGF0YSkpOworCQliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnYWRkciksIDIpOworCQliMiA9ICh1MzIpIGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHJhZGlvcmVnZGF0YSkpOwogCiAJCWlkID0gKChiMCAmIDB4ZikgPDwgMjgpIHwgKCgoYjIgPDwgOCkgfCBiMSkgPDwgMTIpIHwgKChiMCA+PiA0KQogCQkJCQkJCQkgICAgICAmIDB4Zik7CiAJfSBlbHNlIHsKLQkJV19SRUdfRkxVU0goJnBpLT5yZWdzLT5waHk0d2FkZHIsIFJBRElPX0lEQ09ERSk7Ci0JCWlkID0gKHUzMikgUl9SRUcoJnBpLT5yZWdzLT5waHk0d2RhdGFsbyk7Ci0JCWlkIHw9ICh1MzIpIFJfUkVHKCZwaS0+cmVncy0+cGh5NHdkYXRhaGkpIDw8IDE2OworCQliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeTR3YWRkciksIFJBRElPX0lEQ09ERSk7CisJCWlkID0gKHUzMikgYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5NHdkYXRhbG8pKTsKKwkJaWQgfD0gKHUzMikgYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsCisJCQkJCUQxMVJFR09GRlMocGh5NHdkYXRhaGkpKSA8PCAxNjsKIAl9CiAJcGktPnBoeV93cmVnID0gMDsKIAlyZXR1cm4gaWQ7CkBAIC0yODMsNzUgKzI3NSw1MiBAQAogCiB2b2lkIHdyaXRlX3BoeV9jaGFubmVsX3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdWludCB2YWwpCiB7Ci0JV19SRUcoJnBpLT5yZWdzLT5waHljaGFubmVsLCB2YWwpOworCWJjbWFfd3JpdGUxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHljaGFubmVsKSwgdmFsKTsKIH0KIAogdTE2IHJlYWRfcGh5X3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKLQotCXJlZ3MgPSBwaS0+cmVnczsKLQotCVdfUkVHX0ZMVVNIKCZyZWdzLT5waHlyZWdhZGRyLCBhZGRyKTsKKwliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeXJlZ2FkZHIpLCBhZGRyKTsKIAogCXBpLT5waHlfd3JlZyA9IDA7Ci0JcmV0dXJuIFJfUkVHKCZyZWdzLT5waHlyZWdkYXRhKTsKKwlyZXR1cm4gYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnZGF0YSkpOwogfQogCiB2b2lkIHdyaXRlX3BoeV9yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7Ci0KLQlyZWdzID0gcGktPnJlZ3M7Ci0KICNpZmRlZiBDT05GSUdfQkNNNDdYWAotCVdfUkVHX0ZMVVNIKCZyZWdzLT5waHlyZWdhZGRyLCBhZGRyKTsKLQlXX1JFRygmcmVncy0+cGh5cmVnZGF0YSwgdmFsKTsKKwliY21hX3dmbHVzaDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeXJlZ2FkZHIpLCBhZGRyKTsKKwliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnZGF0YSksIHZhbCk7CiAJaWYgKGFkZHIgPT0gMHg3MikKLQkJKHZvaWQpUl9SRUcoJnJlZ3MtPnBoeXJlZ2RhdGEpOworCQkodm9pZCliY21hX3JlYWQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHl2ZXJzaW9uKSk7CiAjZWxzZQotCVdfUkVHKCh1MzIgX19pb21lbSAqKSgmcmVncy0+cGh5cmVnYWRkciksIGFkZHIgfCAodmFsIDw8IDE2KSk7CisJYmNtYV93cml0ZTMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeXJlZ2FkZHIpLCBhZGRyIHwgKHZhbCA8PCAxNikpOwogCWlmICgrK3BpLT5waHlfd3JlZyA+PSBwaS0+cGh5X3dyZWdfbGltaXQpIHsKIAkJcGktPnBoeV93cmVnID0gMDsKLQkJKHZvaWQpUl9SRUcoJnJlZ3MtPnBoeXZlcnNpb24pOworCQkodm9pZCliY21hX3JlYWQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHl2ZXJzaW9uKSk7CiAJfQogI2VuZGlmCiB9CiAKIHZvaWQgYW5kX3BoeV9yZWcoc3RydWN0IGJyY21zX3BoeSAqcGksIHUxNiBhZGRyLCB1MTYgdmFsKQogewotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7Ci0KLQlyZWdzID0gcGktPnJlZ3M7Ci0KLQlXX1JFR19GTFVTSCgmcmVncy0+cGh5cmVnYWRkciwgYWRkcik7Ci0KLQlXX1JFRygmcmVncy0+cGh5cmVnZGF0YSwgKFJfUkVHKCZyZWdzLT5waHlyZWdkYXRhKSAmIHZhbCkpOworCWJjbWFfd2ZsdXNoMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnYWRkciksIGFkZHIpOworCWJjbWFfbWFzazE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeXJlZ2RhdGEpLCB2YWwpOwogCXBpLT5waHlfd3JlZyA9IDA7CiB9CiAKIHZvaWQgb3JfcGh5X3JlZyhzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgdTE2IGFkZHIsIHUxNiB2YWwpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKLQotCXJlZ3MgPSBwaS0+cmVnczsKLQotCVdfUkVHX0ZMVVNIKCZyZWdzLT5waHlyZWdhZGRyLCBhZGRyKTsKLQotCVdfUkVHKCZyZWdzLT5waHlyZWdkYXRhLCAoUl9SRUcoJnJlZ3MtPnBoeXJlZ2RhdGEpIHwgdmFsKSk7CisJYmNtYV93Zmx1c2gxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHlyZWdhZGRyKSwgYWRkcik7CisJYmNtYV9zZXQxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHlyZWdkYXRhKSwgdmFsKTsKIAlwaS0+cGh5X3dyZWcgPSAwOwogfQogCiB2b2lkIG1vZF9waHlfcmVnKHN0cnVjdCBicmNtc19waHkgKnBpLCB1MTYgYWRkciwgdTE2IG1hc2ssIHUxNiB2YWwpCiB7Ci0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKLQotCXJlZ3MgPSBwaS0+cmVnczsKLQotCVdfUkVHX0ZMVVNIKCZyZWdzLT5waHlyZWdhZGRyLCBhZGRyKTsKLQotCVdfUkVHKCZyZWdzLT5waHlyZWdkYXRhLAotCSAgICAgICgoUl9SRUcoJnJlZ3MtPnBoeXJlZ2RhdGEpICYgfm1hc2spIHwgKHZhbCAmIG1hc2spKSk7CisJdmFsICY9IG1hc2s7CisJYmNtYV93Zmx1c2gxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwaHlyZWdhZGRyKSwgYWRkcik7CisJYmNtYV9tYXNrc2V0MTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnZGF0YSksIH5tYXNrLCB2YWwpOwogCXBpLT5waHlfd3JlZyA9IDA7CiB9CiAKQEAgLTQxMiwxMCArMzgxLDggQEAKIAlzaC0+c3JvbXJldiA9IHNocC0+c3JvbXJldjsKIAlzaC0+Ym9hcmR0eXBlID0gc2hwLT5ib2FyZHR5cGU7CiAJc2gtPmJvYXJkcmV2ID0gc2hwLT5ib2FyZHJldjsKLQlzaC0+Ym9hcmR2ZW5kb3IgPSBzaHAtPmJvYXJkdmVuZG9yOwogCXNoLT5ib2FyZGZsYWdzID0gc2hwLT5ib2FyZGZsYWdzOwogCXNoLT5ib2FyZGZsYWdzMiA9IHNocC0+Ym9hcmRmbGFnczI7Ci0Jc2gtPmJ1c2NvcmVyZXYgPSBzaHAtPmJ1c2NvcmVyZXY7CiAKIAlzaC0+ZmFzdF90aW1lciA9IFBIWV9TV19USU1FUl9GQVNUOwogCXNoLT5zbG93X3RpbWVyID0gUEhZX1NXX1RJTUVSX1NMT1c7CkBAIC00NTgsNyArNDI1LDcgQEAKIH0KIAogc3RydWN0IGJyY21zX3BoeV9wdWIgKgotd2xjX3BoeV9hdHRhY2goc3RydWN0IHNoYXJlZF9waHkgKnNoLCBzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzLAord2xjX3BoeV9hdHRhY2goc3RydWN0IHNoYXJlZF9waHkgKnNoLCBzdHJ1Y3QgYmNtYV9kZXZpY2UgKmQxMWNvcmUsCiAJICAgICAgIGludCBiYW5kdHlwZSwgc3RydWN0IHdpcGh5ICp3aXBoeSkKIHsKIAlzdHJ1Y3QgYnJjbXNfcGh5ICpwaTsKQEAgLTQ3MCw3ICs0MzcsNyBAQAogCWlmIChEMTFSRVZfSVMoc2gtPmNvcmVyZXYsIDQpKQogCQlzZmxhZ3MgPSBTSVNGXzJHX1BIWSB8IFNJU0ZfNUdfUEhZOwogCWVsc2UKLQkJc2ZsYWdzID0gYWlfY29yZV9zZmxhZ3Moc2gtPnNpaCwgMCwgMCk7CisJCXNmbGFncyA9IGJjbWFfYXJlYWQzMihkMTFjb3JlLCBCQ01BX0lPU1QpOwogCiAJaWYgKGJhbmR0eXBlID09IEJSQ01fQkFORF81RykgewogCQlpZiAoKHNmbGFncyAmIChTSVNGXzVHX1BIWSB8IFNJU0ZfREJfUEhZKSkgPT0gMCkKQEAgLTQ4OCw3ICs0NTUsNyBAQAogCWlmIChwaSA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAlwaS0+d2lwaHkgPSB3aXBoeTsKLQlwaS0+cmVncyA9IHJlZ3M7CisJcGktPmQxMWNvcmUgPSBkMTFjb3JlOwogCXBpLT5zaCA9IHNoOwogCXBpLT5waHlfaW5pdF9wb3IgPSB0cnVlOwogCXBpLT5waHlfd3JlZ19saW1pdCA9IFBIWV9XUkVHX0xJTUlUOwpAQCAtNTAzLDcgKzQ3MCw3IEBACiAJCXBpLT5wdWJwaS5jb3JlZmxhZ3MgPSBTSUNGX0dNT0RFOwogCiAJd2xhcGlfYm1hY19jb3JlcmVzZXQocGktPnNoLT5waHlzaGltLCBwaS0+cHVicGkuY29yZWZsYWdzKTsKLQlwaHl2ZXJzaW9uID0gUl9SRUcoJnBpLT5yZWdzLT5waHl2ZXJzaW9uKTsKKwlwaHl2ZXJzaW9uID0gYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5dmVyc2lvbikpOwogCiAJcGktPnB1YnBpLnBoeV90eXBlID0gUEhZX1RZUEUocGh5dmVyc2lvbik7CiAJcGktPnB1YnBpLnBoeV9yZXYgPSBwaHl2ZXJzaW9uICYgUFZfUFZfTUFTSzsKQEAgLTUxNSw4ICs0ODIsOCBAQAogCXBpLT5wdWJwaS5waHlfY29yZW51bSA9IFBIWV9DT1JFX05VTV8yOwogCXBpLT5wdWJwaS5hbmFfcmV2ID0gKHBoeXZlcnNpb24gJiBQVl9BVl9NQVNLKSA+PiBQVl9BVl9TSElGVDsKIAotCWlmICghcGktPnB1YnBpLnBoeV90eXBlID09IFBIWV9UWVBFX04gJiYKLQkgICAgIXBpLT5wdWJwaS5waHlfdHlwZSA9PSBQSFlfVFlQRV9MQ04pCisJaWYgKHBpLT5wdWJwaS5waHlfdHlwZSAhPSBQSFlfVFlQRV9OICYmCisJICAgIHBpLT5wdWJwaS5waHlfdHlwZSAhPSBQSFlfVFlQRV9MQ04pCiAJCWdvdG8gZXJyOwogCiAJaWYgKGJhbmR0eXBlID09IEJSQ01fQkFORF81RykgewpAQCAtNzg3LDE0ICs3NTQsMTQgQEAKIAogCXBpLT5yYWRpb19jaGFuc3BlYyA9IGNoYW5zcGVjOwogCi0JbWMgPSBSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpOworCW1jID0gYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCWlmIChXQVJOKG1jICYgTUNUTF9FTl9NQUMsICJIVyBlcnJvciBNQUMgcnVubmluZyBvbiBpbml0IikpCiAJCXJldHVybjsKIAogCWlmICghKHBpLT5tZWFzdXJlX2hvbGQgJiBQSFlfSE9MRF9GT1JfU0NBTikpCiAJCXBpLT5tZWFzdXJlX2hvbGQgfD0gUEhZX0hPTERfRk9SX05PVF9BU1NPQzsKIAotCWlmIChXQVJOKCEoYWlfY29yZV9zZmxhZ3MocGktPnNoLT5zaWgsIDAsIDApICYgU0lTRl9GQ0xLQSksCisJaWYgKFdBUk4oIShiY21hX2FyZWFkMzIocGktPmQxMWNvcmUsIEJDTUFfSU9TVCkgJiBTSVNGX0ZDTEtBKSwKIAkJICJIVyBlcnJvciBTSVNGX0ZDTEtBXG4iKSkKIAkJcmV0dXJuOwogCkBAIC04MzMsOCArODAwLDggQEAKIAlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpaDsKIAl2b2lkICgqY2FsX2luaXQpKHN0cnVjdCBicmNtc19waHkgKikgPSBOVUxMOwogCi0JaWYgKFdBUk4oKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykgIT0gMCwKLQkJICJIVyBlcnJvcjogTUFDIGVuYWJsZWQgZHVyaW5nIHBoeSBjYWxcbiIpKQorCWlmIChXQVJOKChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkgIE1DVExfRU5fTUFDKSAhPSAwLCAiSFcgZXJyb3I6IE1BQyBlbmFibGVkIGR1cmluZyBwaHkgY2FsXG4iKSkKIAkJcmV0dXJuOwogCiAJaWYgKCFwaS0+aW5pdGlhbGl6ZWQpIHsKQEAgLTEwMjUsNyArOTkyLDcgQEAKIHZvaWQgd2xjX3BoeV9kb19kdW1teV90eChzdHJ1Y3QgYnJjbXNfcGh5ICpwaSwgYm9vbCBvZmRtLCBib29sIHBhX29uKQogewogI2RlZmluZSBEVU1NWV9QS1RfTEVOICAgMjAKLQlzdHJ1Y3QgZDExcmVncyBfX2lvbWVtICpyZWdzID0gcGktPnJlZ3M7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlID0gcGktPmQxMWNvcmU7CiAJaW50IGksIGNvdW50OwogCXU4IG9mZG1wa3RbRFVNTVlfUEtUX0xFTl0gPSB7CiAJCTB4Y2MsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZDQsIDB4MDAsIDB4MDAsIDB4MDAsCkBAIC0xMDQxLDI2ICsxMDA4LDI4IEBACiAJd2xhcGlfYm1hY193cml0ZV90ZW1wbGF0ZV9yYW0ocGktPnNoLT5waHlzaGltLCAwLCBEVU1NWV9QS1RfTEVOLAogCQkJCSAgICAgIGR1bW15cGt0KTsKIAotCVdfUkVHKCZyZWdzLT54bXRzZWwsIDApOworCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHhtdHNlbCksIDApOwogCiAJaWYgKEQxMVJFVl9HRShwaS0+c2gtPmNvcmVyZXYsIDExKSkKLQkJV19SRUcoJnJlZ3MtPndlcGN0bCwgMHgxMDApOworCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh3ZXBjdGwpLCAweDEwMCk7CiAJZWxzZQotCQlXX1JFRygmcmVncy0+d2VwY3RsLCAwKTsKKwkJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMod2VwY3RsKSwgMCk7CiAKLQlXX1JFRygmcmVncy0+dHhlX3BoeWN0bCwgKG9mZG0gPyAxIDogMCkgfCBQSFlfVFhDX0FOVF8wKTsKKwliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0eGVfcGh5Y3RsKSwKKwkJICAgICAob2ZkbSA/IDEgOiAwKSB8IFBIWV9UWENfQU5UXzApOwogCWlmIChJU05QSFkocGkpIHx8IElTTENOUEhZKHBpKSkKLQkJV19SRUcoJnJlZ3MtPnR4ZV9waHljdGwxLCAweDFBMDIpOworCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0eGVfcGh5Y3RsMSksIDB4MUEwMik7CiAKLQlXX1JFRygmcmVncy0+dHhlX3dtXzAsIDApOwotCVdfUkVHKCZyZWdzLT50eGVfd21fMSwgMCk7CisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlModHhlX3dtXzApLCAwKTsKKwliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0eGVfd21fMSksIDApOwogCi0JV19SRUcoJnJlZ3MtPnhtdHRwbGF0ZXR4cHRyLCAwKTsKLQlXX1JFRygmcmVncy0+eG10dHhjbnQsIERVTU1ZX1BLVF9MRU4pOworCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHhtdHRwbGF0ZXR4cHRyKSwgMCk7CisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMoeG10dHhjbnQpLCBEVU1NWV9QS1RfTEVOKTsKIAotCVdfUkVHKCZyZWdzLT54bXRzZWwsICgoOCA8PCA4KSB8ICgxIDw8IDUpIHwgKDEgPDwgMikgfCAyKSk7CisJYmNtYV93cml0ZTE2KGNvcmUsIEQxMVJFR09GRlMoeG10c2VsKSwKKwkJICAgICAoKDggPDwgOCkgfCAoMSA8PCA1KSB8ICgxIDw8IDIpIHwgMikpOwogCi0JV19SRUcoJnJlZ3MtPnR4ZV9jdGwsIDApOworCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHR4ZV9jdGwpLCAwKTsKIAogCWlmICghcGFfb24pIHsKIAkJaWYgKElTTlBIWShwaSkpCkBAIC0xMDY4LDI3ICsxMDM3LDI4IEBACiAJfQogCiAJaWYgKElTTlBIWShwaSkgfHwgSVNMQ05QSFkocGkpKQotCQlXX1JFRygmcmVncy0+dHhlX2F1eCwgMHhEMCk7CisJCWJjbWFfd3JpdGUxNihjb3JlLCBEMTFSRUdPRkZTKHR4ZV9hdXgpLCAweEQwKTsKIAllbHNlCi0JCVdfUkVHKCZyZWdzLT50eGVfYXV4LCAoKDEgPDwgNSkgfCAoMSA8PCA0KSkpOworCQliY21hX3dyaXRlMTYoY29yZSwgRDExUkVHT0ZGUyh0eGVfYXV4KSwgKCgxIDw8IDUpIHwgKDEgPDwgNCkpKTsKIAotCSh2b2lkKVJfUkVHKCZyZWdzLT50eGVfYXV4KTsKKwkodm9pZCliY21hX3JlYWQxNihjb3JlLCBEMTFSRUdPRkZTKHR4ZV9hdXgpKTsKIAogCWkgPSAwOwogCWNvdW50ID0gb2ZkbSA/IDMwIDogMjUwOwogCXdoaWxlICgoaSsrIDwgY291bnQpCi0JICAgICAgICYmIChSX1JFRygmcmVncy0+dHhlX3N0YXR1cykgJiAoMSA8PCA3KSkpCisJICAgICAgICYmIChiY21hX3JlYWQxNihjb3JlLCBEMTFSRUdPRkZTKHR4ZV9zdGF0dXMpKSAmICgxIDw8IDcpKSkKIAkJdWRlbGF5KDEwKTsKIAogCWkgPSAwOwogCi0Jd2hpbGUgKChpKysgPCAxMCkKLQkgICAgICAgJiYgKChSX1JFRygmcmVncy0+dHhlX3N0YXR1cykgJiAoMSA8PCAxMCkpID09IDApKQorCXdoaWxlICgoaSsrIDwgMTApICYmCisJICAgICAgICgoYmNtYV9yZWFkMTYoY29yZSwgRDExUkVHT0ZGUyh0eGVfc3RhdHVzKSkgJiAoMSA8PCAxMCkpID09IDApKQogCQl1ZGVsYXkoMTApOwogCiAJaSA9IDA7CiAKLQl3aGlsZSAoKGkrKyA8IDEwKSAmJiAoKFJfUkVHKCZyZWdzLT5pZnNzdGF0KSAmICgxIDw8IDgpKSkpCisJd2hpbGUgKChpKysgPCAxMCkgJiYKKwkgICAgICAgKChiY21hX3JlYWQxNihjb3JlLCBEMTFSRUdPRkZTKGlmc3N0YXQpKSAmICgxIDw8IDgpKSkpCiAJCXVkZWxheSgxMCk7CiAKIAlpZiAoIXBhX29uKSB7CkBAIC0xMTQ1LDcgKzExMTUsNyBAQAogdm9pZCB3bGNfcGh5X3N3aXRjaF9yYWRpbyhzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcGloLCBib29sIG9uKQogewogCXN0cnVjdCBicmNtc19waHkgKnBpID0gKHN0cnVjdCBicmNtc19waHkgKikgcGloOwotCSh2b2lkKVJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCk7CisJKHZvaWQpYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCiAJaWYgKElTTlBIWShwaSkpIHsKIAkJd2xjX3BoeV9zd2l0Y2hfcmFkaW9fbnBoeShwaSwgb24pOwpAQCAtMTM4NSw3ICsxMzU1LDcgQEAKIAltZW1jcHkoJnBpLT50eF91c2VyX3RhcmdldFtUWFBfRklSU1RfTUNTXzQwX1NETV0sCiAJICAgICAgICZ0eHB3ci0+bWNzXzQwX21pbW9bMF0sIEJSQ01TX05VTV9SQVRFU19NQ1NfMl9TVFJFQU0pOwogCi0JaWYgKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykKKwlpZiAoYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYgTUNUTF9FTl9NQUMpCiAJCW1hY19lbmFibGVkID0gdHJ1ZTsKIAogCWlmIChtYWNfZW5hYmxlZCkKQEAgLTE0MTUsNyArMTM4NSw4IEBACiAJCWlmICghU0NBTl9JTlBST0dfUEhZKHBpKSkgewogCQkJYm9vbCBzdXNwZW5kOwogCi0JCQlzdXNwZW5kID0gKDAgPT0gKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJgorCQkJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwKKwkJCQkJCSAgICAgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgogCQkJCQkgTUNUTF9FTl9NQUMpKTsKIAogCQkJaWYgKCFzdXNwZW5kKQpAQCAtMTg2OCwxOCArMTgzOSwxNyBAQAogCiAJCWlmIChOUkVWX0lTKHBpLT5wdWJwaS5waHlfcmV2LCAzKQogCQkgICAgfHwgTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgNCkpIHsKLQkJCVdfUkVHKCZwaS0+cmVncy0+cGh5cmVnYWRkciwgMHhhMCk7Ci0JCQkodm9pZClSX1JFRygmcGktPnJlZ3MtPnBoeXJlZ2FkZHIpOwotCQkJcnhjID0gUl9SRUcoJnBpLT5yZWdzLT5waHlyZWdkYXRhKTsKLQkJCVdfUkVHKCZwaS0+cmVncy0+cGh5cmVnZGF0YSwKLQkJCSAgICAgICgweDEgPDwgMTUpIHwgcnhjKTsKKwkJCWJjbWFfd2ZsdXNoMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnYWRkciksCisJCQkJICAgICAgMHhhMCk7CisJCQliY21hX3NldDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBoeXJlZ2RhdGEpLAorCQkJCSAgIDB4MSA8PCAxNSk7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoTlJFVl9JUyhwaS0+cHVicGkucGh5X3JldiwgMykKIAkJICAgIHx8IE5SRVZfSVMocGktPnB1YnBpLnBoeV9yZXYsIDQpKSB7Ci0JCQlXX1JFRygmcGktPnJlZ3MtPnBoeXJlZ2FkZHIsIDB4YTApOwotCQkJKHZvaWQpUl9SRUcoJnBpLT5yZWdzLT5waHlyZWdhZGRyKTsKLQkJCVdfUkVHKCZwaS0+cmVncy0+cGh5cmVnZGF0YSwgcnhjKTsKKwkJCWJjbWFfd2ZsdXNoMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnYWRkciksCisJCQkJICAgICAgMHhhMCk7CisJCQliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocGh5cmVnZGF0YSksIHJ4Yyk7CiAJCX0KIAogCQl3bGNfcGh5X3Bvcl9pbmZvcm0ocHBpKTsKQEAgLTE5OTksNyArMTk2OSw5IEBACiAJcGktPnR4cHdyY3RybCA9IGh3cHdyY3RybDsKIAogCWlmIChJU05QSFkocGkpKSB7Ci0JCXN1c3BlbmQgPSAoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7CisJCXN1c3BlbmQgPSAoMCA9PSAoYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsCisJCQkJCSAgICAgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJCSBNQ1RMX0VOX01BQykpOwogCQlpZiAoIXN1c3BlbmQpCiAJCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCkBAIC0yMjAxLDcgKzIxNzMsOCBAQAogCWlmICghcGktPnNoLT5jbGspCiAJCXJldHVybjsKIAotCXN1c3BlbmQgPSAoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7CisJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJIE1DVExfRU5fTUFDKSk7CiAJaWYgKCFzdXNwZW5kKQogCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCkBAIC0yNDE5LDggKzIzOTIsOCBAQAogCQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX1BXUklORF9NQVAyLCAwKTsKIAkJCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQMywgMCk7CiAKLQkJCU9SX1JFRygmcGktPnJlZ3MtPm1hY2NvbW1hbmQsCi0JCQkgICAgICAgTUNNRF9CR19OT0lTRSk7CisJCQliY21hX3NldDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbW1hbmQpLAorCQkJCSAgIE1DTURfQkdfTk9JU0UpOwogCQl9IGVsc2UgewogCQkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKIAkJCXdsY19sY25waHlfZGVhZl9tb2RlKHBpLCAoYm9vbCkgMCk7CkBAIC0yNDM4LDggKzI0MTEsOCBAQAogCQkJd2xhcGlfYm1hY193cml0ZV9zaG0ocGktPnNoLT5waHlzaGltLCBNX1BXUklORF9NQVAyLCAwKTsKIAkJCXdsYXBpX2JtYWNfd3JpdGVfc2htKHBpLT5zaC0+cGh5c2hpbSwgTV9QV1JJTkRfTUFQMywgMCk7CiAKLQkJCU9SX1JFRygmcGktPnJlZ3MtPm1hY2NvbW1hbmQsCi0JCQkgICAgICAgTUNNRF9CR19OT0lTRSk7CisJCQliY21hX3NldDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbW1hbmQpLAorCQkJCSAgIE1DTURfQkdfTk9JU0UpOwogCQl9IGVsc2UgewogCQkJc3RydWN0IHBoeV9pcV9lc3QgZXN0W1BIWV9DT1JFX01BWF07CiAJCQl1MzIgY21wbHhfcHdyW1BIWV9DT1JFX01BWF07CkBAIC0yOTMyLDI5ICsyOTA1LDI5IEBACiAJCQkJbW9kX3BoeV9yZWcocGksIDB4NDRjLCAoMHgxIDw8IDIpLCAoMSkgPDwgMik7CiAKIAkJCX0KLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvY29udHJvbCksCi0JCQkJICAgfjB4MCwgMHgwKTsKLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvb3V0KSwgMHg0MCwKLQkJCQkgICAweDQwKTsKLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvb3V0ZW4pLCAweDQwLAotCQkJCSAgIDB4NDApOworCQkJYWlfY2NfcmVnKHBpLT5zaC0+c2loLAorCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZ3Bpb2NvbnRyb2wpLAorCQkJCSAgfjB4MCwgMHgwKTsKKwkJCWFpX2NjX3JlZyhwaS0+c2gtPnNpaCwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGdwaW9vdXQpLAorCQkJCSAgMHg0MCwgMHg0MCk7CisJCQlhaV9jY19yZWcocGktPnNoLT5zaWgsCisJCQkJICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvb3V0ZW4pLAorCQkJCSAgMHg0MCwgMHg0MCk7CiAJCX0gZWxzZSB7CiAJCQltb2RfcGh5X3JlZyhwaSwgMHg0NGMsICgweDEgPDwgMiksICgwKSA8PCAyKTsKIAogCQkJbW9kX3BoeV9yZWcocGksIDB4NDRkLCAoMHgxIDw8IDIpLCAoMCkgPDwgMik7CiAKLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvb3V0KSwgMHg0MCwKLQkJCQkgICAweDAwKTsKLQkJCWFpX2NvcmVyZWcocGktPnNoLT5zaWgsIFNJX0NDX0lEWCwKLQkJCQkgICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBncGlvb3V0ZW4pLCAweDQwLAotCQkJCSAgIDB4MCk7Ci0JCQlhaV9jb3JlcmVnKHBpLT5zaC0+c2loLCBTSV9DQ19JRFgsCi0JCQkJICAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZ3Bpb2NvbnRyb2wpLAotCQkJCSAgIH4weDAsIDB4NDApOworCQkJYWlfY2NfcmVnKHBpLT5zaC0+c2loLAorCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZ3Bpb291dCksCisJCQkJICAweDQwLCAweDAwKTsKKwkJCWFpX2NjX3JlZyhwaS0+c2gtPnNpaCwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGdwaW9vdXRlbiksCisJCQkJICAweDQwLCAweDApOworCQkJYWlfY2NfcmVnKHBpLT5zaC0+c2loLAorCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgZ3Bpb2NvbnRyb2wpLAorCQkJCSAgfjB4MCwgMHg0MCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9oYWwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2hhbC5oCmluZGV4IDk2ZTE1MTYuLmUzNGE3MWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2hhbC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X2hhbC5oCkBAIC0xNjYsNyArMTY2LDYgQEAKIAlzdHJ1Y3QgcGh5X3NoaW1faW5mbyAqcGh5c2hpbTsKIAl1aW50IHVuaXQ7CiAJdWludCBjb3JlcmV2OwotCXVpbnQgYnVzY29yZXJldjsKIAl1MTYgdmlkOwogCXUxNiBkaWQ7CiAJdWludCBjaGlwOwpAQCAtMTc1LDcgKzE3NCw2IEBACiAJdWludCBzcm9tcmV2OwogCXVpbnQgYm9hcmR0eXBlOwogCXVpbnQgYm9hcmRyZXY7Ci0JdWludCBib2FyZHZlbmRvcjsKIAl1MzIgYm9hcmRmbGFnczsKIAl1MzIgYm9hcmRmbGFnczI7CiB9OwpAQCAtMTgzLDcgKzE4MSw3IEBACiAKIGV4dGVybiBzdHJ1Y3Qgc2hhcmVkX3BoeSAqd2xjX3BoeV9zaGFyZWRfYXR0YWNoKHN0cnVjdCBzaGFyZWRfcGh5X3BhcmFtcyAqc2hwKTsKIGV4dGVybiBzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqd2xjX3BoeV9hdHRhY2goc3RydWN0IHNoYXJlZF9waHkgKnNoLAotCQkJCQkgICAgc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVncywKKwkJCQkJICAgIHN0cnVjdCBiY21hX2RldmljZSAqZDExY29yZSwKIAkJCQkJICAgIGludCBiYW5kdHlwZSwgc3RydWN0IHdpcGh5ICp3aXBoeSk7CiBleHRlcm4gdm9pZCB3bGNfcGh5X2RldGFjaChzdHJ1Y3QgYnJjbXNfcGh5X3B1YiAqcHBpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfaW50LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9pbnQuaAppbmRleCBiZWE4NTI0Li5hZjAwZTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9pbnQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9pbnQuaApAQCAtNTAzLDEwICs1MDMsOCBAQAogCXVpbnQgc3JvbXJldjsKIAl1aW50IGJvYXJkdHlwZTsKIAl1aW50IGJvYXJkcmV2OwotCXVpbnQgYm9hcmR2ZW5kb3I7CiAJdTMyIGJvYXJkZmxhZ3M7CiAJdTMyIGJvYXJkZmxhZ3MyOwotCXVpbnQgYnVzY29yZXJldjsKIAl1aW50IGZhc3RfdGltZXI7CiAJdWludCBzbG93X3RpbWVyOwogCXVpbnQgZ2xhY2lhbF90aW1lcjsKQEAgLTU1OSw3ICs1NTcsNyBAQAogCX0gdTsKIAlib29sIHVzZXJfdHhwd3JfYXRfcmZwb3J0OwogCi0Jc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqcmVnczsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmQxMWNvcmU7CiAJc3RydWN0IGJyY21zX3BoeSAqbmV4dDsKIAlzdHJ1Y3QgYnJjbXNfcGh5X3B1YiBwdWJwaTsKIApAQCAtNzc0LDExICs3NzIsNiBAQAogCXMxNiBucGh5X25vaXNlX3dpbltQSFlfQ09SRV9NQVhdW1BIWV9OT0lTRV9XSU5ET1dfU1pdOwogCXU4IG5waHlfbm9pc2VfaW5kZXg7CiAKLQl1OCBucGh5X3R4cGlkMmdbUEhZX0NPUkVfTlVNXzJdOwotCXU4IG5waHlfdHhwaWQ1Z1tQSFlfQ09SRV9OVU1fMl07Ci0JdTggbnBoeV90eHBpZDVnbFtQSFlfQ09SRV9OVU1fMl07Ci0JdTggbnBoeV90eHBpZDVnaFtQSFlfQ09SRV9OVU1fMl07Ci0KIAlib29sIG5waHlfZ2Fpbl9ib29zdDsKIAlib29sIG5waHlfZWxuYV9nYWluX2NvbmZpZzsKIAl1MTYgb2xkX2JwaHlfdGVzdDsKQEAgLTEwOTUsNyArMTA4OCw3IEBACiAKICNkZWZpbmUgQlJDTVNfUEhZX1dBUl9QUjUxNTcxKHBpKSBcCiAJaWYgKE5SRVZfTFQoKHBpKS0+cHVicGkucGh5X3JldiwgMykpIFwKLQkJKHZvaWQpUl9SRUcoJihwaSktPnJlZ3MtPm1hY2NvbnRyb2wpCisJCSh2b2lkKWJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKQogCiBleHRlcm4gdm9pZCB3bGNfcGh5X2NhbF9wZXJpY2FsX25waHlfcnVuKHN0cnVjdCBicmNtc19waHkgKnBpLCB1OCBjYWx0eXBlKTsKIGV4dGVybiB2b2lkIHdsY19waHlfYWNpX3Jlc2V0X25waHkoc3RydWN0IGJyY21zX3BoeSAqcGkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbGNuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9sY24uYwppbmRleCBhNjNhYTk5Li5jZTg1NjJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9sY24uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9sY24uYwpAQCAtMTYwMyw3ICsxNjAzLDcgQEAKIAkJc2lfcG11X3BsbHVwZChwaS0+c2gtPnNpaCk7CiAJCXdyaXRlX3BoeV9yZWcocGksIDB4OTQyLCAwKTsKIAkJd2xjX2xjbnBoeV90eHJ4X3NwdXJfYXZvaWRhbmNlX21vZGUocGksIGZhbHNlKTsKLQkJcGlfbGNuLT5sY25waHlfc3B1cm1vZCA9IDA7CisJCXBpX2xjbi0+bGNucGh5X3NwdXJtb2QgPSBmYWxzZTsKIAkJbW9kX3BoeV9yZWcocGksIDB4NDI0LCAoMHhmZiA8PCA4KSwgKDB4MWIpIDw8IDgpOwogCiAJCXdyaXRlX3BoeV9yZWcocGksIDB4NDI1LCAweDU5MDcpOwpAQCAtMTYxNiw3ICsxNjE2LDcgQEAKIAkJd3JpdGVfcGh5X3JlZyhwaSwgMHg5NDIsIDApOwogCQl3bGNfbGNucGh5X3R4cnhfc3B1cl9hdm9pZGFuY2VfbW9kZShwaSwgdHJ1ZSk7CiAKLQkJcGlfbGNuLT5sY25waHlfc3B1cm1vZCA9IDA7CisJCXBpX2xjbi0+bGNucGh5X3NwdXJtb2QgPSBmYWxzZTsKIAkJbW9kX3BoeV9yZWcocGksIDB4NDI0LCAoMHhmZiA8PCA4KSwgKDB4MWYpIDw8IDgpOwogCiAJCXdyaXRlX3BoeV9yZWcocGksIDB4NDI1LCAweDU5MGEpOwpAQCAtMjMyNSw3ICsyMzI1LDcgQEAKIHsKIAlzOCBpbmRleCwgZGVsdGFfYnJkLCBkZWx0YV90ZW1wLCBuZXdfaW5kZXgsIHRlbXBjb3JyeDsKIAlzMTYgbWFucCwgbWVhc190ZW1wLCB0ZW1wX2RpZmY7Ci0JYm9vbCBuZWcgPSAwOworCWJvb2wgbmVnID0gZmFsc2U7CiAJdTE2IHRlbXA7CiAJc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKIApAQCAtMjM0OCw3ICsyMzQ4LDcgQEAKIAltYW5wID0gTENOUEhZX1RFTVBTRU5TRShwaV9sY24tPmxjbnBoeV9yYXd0ZW1wc2Vuc2UpOwogCXRlbXBfZGlmZiA9IG1hbnAgLSBtZWFzX3RlbXA7CiAJaWYgKHRlbXBfZGlmZiA8IDApIHsKLQkJbmVnID0gMTsKKwkJbmVnID0gdHJ1ZTsKIAkJdGVtcF9kaWZmID0gLXRlbXBfZGlmZjsKIAl9CiAKQEAgLTI4MTMsMTAgKzI4MTMsOCBAQAogCXUxNiBTQVZFX2p0YWdfYXV4cGdhID0gcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMEZGKSAmIDB4MTA7CiAJdTE2IFNBVkVfaXFhZGNfYXV4X2VuID0gcmVhZF9yYWRpb19yZWcocGksIFJBRElPXzIwNjRfUkVHMTFGKSAmIDQ7CiAJaWRsZVRzc2kgPSByZWFkX3BoeV9yZWcocGksIDB4NGFiKTsKLQlzdXNwZW5kID0KLQkJKDAgPT0KLQkJIChSX1JFRygmKChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBpKS0+cmVncy0+bWFjY29udHJvbCkgJgotCQkgIE1DVExfRU5fTUFDKSk7CisJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJIE1DVExfRU5fTUFDKSk7CiAJaWYgKCFzdXNwZW5kKQogCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCXdsY19sY25waHlfc2V0X3R4X3B3cl9jdHJsKHBpLCBMQ05QSFlfVFhfUFdSX0NUUkxfT0ZGKTsKQEAgLTI4OTAsNyArMjg4OCw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgMTQ7IGkrKykKIAkJdmFsdWVzX3RvX3NhdmVbaV0gPSByZWFkX3BoeV9yZWcocGksIHRlbXBzZW5zZV9waHlfcmVnc1tpXSk7Ci0Jc3VzcGVuZCA9ICgwID09IChSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpKTsKKwlzdXNwZW5kID0gKDAgPT0gKGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKSAmCisJCQkgTUNUTF9FTl9NQUMpKTsKIAlpZiAoIXN1c3BlbmQpCiAJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7CiAJc2F2ZV90eHB3ckN0cmxFbiA9IHJlYWRfcmFkaW9fcmVnKHBpLCAweDRhNCk7CkBAIC0zMDE2LDggKzMwMTUsOCBAQAogCWJvb2wgc3VzcGVuZDsKIAlzdHJ1Y3QgYnJjbXNfcGh5ICpwaSA9IChzdHJ1Y3QgYnJjbXNfcGh5ICopIHBwaTsKIAotCXN1c3BlbmQgPQotCQkoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7CisJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJIE1DVExfRU5fTUFDKSk7CiAJaWYgKCFzdXNwZW5kKQogCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCkBAIC0zNTM1LDE1ICszNTM0LDE3IEBACiAJdGltZXIgPSAwOwogCW9sZF9zc2xwbkNhbGliQ2xrRW5DdHJsID0gcmVhZF9waHlfcmVnKHBpLCAweDZkYSk7CiAKLQljdXJ2YWwxID0gUl9SRUcoJnBpLT5yZWdzLT5wc21fY29yZWN0bHN0cyk7CisJY3VydmFsMSA9IGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9jb3JlY3Rsc3RzKSk7CiAJcHRyWzEzMF0gPSAwOwotCVdfUkVHKCZwaS0+cmVncy0+cHNtX2NvcmVjdGxzdHMsICgoMSA8PCA2KSB8IGN1cnZhbDEpKTsKKwliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX2NvcmVjdGxzdHMpLAorCQkgICAgICgoMSA8PCA2KSB8IGN1cnZhbDEpKTsKIAotCVdfUkVHKCZwaS0+cmVncy0+c21wbF9jbGN0X3N0cnB0ciwgMHg3RTAwKTsKLQlXX1JFRygmcGktPnJlZ3MtPnNtcGxfY2xjdF9zdHBwdHIsIDB4ODAwMCk7CisJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHNtcGxfY2xjdF9zdHJwdHIpLCAweDdFMDApOworCWJjbWFfd3JpdGUxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhzbXBsX2NsY3Rfc3RwcHRyKSwgMHg4MDAwKTsKIAl1ZGVsYXkoMjApOwotCWN1cnZhbDIgPSBSX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtKTsKLQlXX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtLCBjdXJ2YWwyIHwgMHgzMCk7CisJY3VydmFsMiA9IGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9waHlfaGRyX3BhcmFtKSk7CisJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9waHlfaGRyX3BhcmFtKSwKKwkJICAgICBjdXJ2YWwyIHwgMHgzMCk7CiAKIAl3cml0ZV9waHlfcmVnKHBpLCAweDU1NSwgMHgwKTsKIAl3cml0ZV9waHlfcmVnKHBpLCAweDVhNiwgMHg1KTsKQEAgLTM1NjAsMTkgKzM1NjEsMTkgQEAKIAogCXNzbHBuQ2FsaWJDbGtFbkN0cmwgPSByZWFkX3BoeV9yZWcocGksIDB4NmRhKTsKIAl3cml0ZV9waHlfcmVnKHBpLCAweDZkYSwgKHUzMikgKHNzbHBuQ2FsaWJDbGtFbkN0cmwgfCAweDIwMDgpKTsKLQlzdHBwdHIgPSBSX1JFRygmcGktPnJlZ3MtPnNtcGxfY2xjdF9zdHBwdHIpOwotCWN1cnB0ciA9IFJfUkVHKCZwaS0+cmVncy0+c21wbF9jbGN0X2N1cnB0cik7CisJc3RwcHRyID0gYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMoc21wbF9jbGN0X3N0cHB0cikpOworCWN1cnB0ciA9IGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHNtcGxfY2xjdF9jdXJwdHIpKTsKIAlkbyB7CiAJCXVkZWxheSgxMCk7Ci0JCWN1cnB0ciA9IFJfUkVHKCZwaS0+cmVncy0+c21wbF9jbGN0X2N1cnB0cik7CisJCWN1cnB0ciA9IGJjbWFfcmVhZDE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHNtcGxfY2xjdF9jdXJwdHIpKTsKIAkJdGltZXIrKzsKIAl9IHdoaWxlICgoY3VycHRyICE9IHN0cHB0cikgJiYgKHRpbWVyIDwgNTAwKSk7CiAKLQlXX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtLCAweDIpOworCWJjbWFfd3JpdGUxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwc21fcGh5X2hkcl9wYXJhbSksIDB4Mik7CiAJc3RycHRyID0gMHg3RTAwOwotCVdfUkVHKCZwaS0+cmVncy0+dHBsYXRld3JwdHIsIHN0cnB0cik7CisJYmNtYV93cml0ZTMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHRwbGF0ZXdycHRyKSwgc3RycHRyKTsKIAl3aGlsZSAoc3RycHRyIDwgMHg4MDAwKSB7Ci0JCXZhbCA9IFJfUkVHKCZwaS0+cmVncy0+dHBsYXRld3JkYXRhKTsKKwkJdmFsID0gYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlModHBsYXRld3JkYXRhKSk7CiAJCWltYWcgPSAoKHZhbCA+PiAxNikgJiAweDNmZik7CiAJCXJlYWwgPSAoKHZhbCkgJiAweDNmZik7CiAJCWlmIChpbWFnID4gNTExKQpAQCAtMzU5Nyw4ICszNTk4LDggQEAKIAl9CiAKIAl3cml0ZV9waHlfcmVnKHBpLCAweDZkYSwgb2xkX3NzbHBuQ2FsaWJDbGtFbkN0cmwpOwotCVdfUkVHKCZwaS0+cmVncy0+cHNtX3BoeV9oZHJfcGFyYW0sIGN1cnZhbDIpOwotCVdfUkVHKCZwaS0+cmVncy0+cHNtX2NvcmVjdGxzdHMsIGN1cnZhbDEpOworCWJjbWFfd3JpdGUxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwc21fcGh5X2hkcl9wYXJhbSksIGN1cnZhbDIpOworCWJjbWFfd3JpdGUxNihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhwc21fY29yZWN0bHN0cyksIGN1cnZhbDEpOwogfQogCiBzdGF0aWMgdm9pZApAQCAtMzY4MSw4ICszNjgyLDggQEAKIAl3bGNfbGNucGh5X3NldF9jYyhwaSwgY2FsX3R5cGUsIHBoeV9jMTUsIHBoeV9jMTYpOwogCXVkZWxheSgyMCk7CiAJZm9yIChwaHlfYzggPSAwOyBwaHlfYzcgIT0gMCAmJiBwaHlfYzggPCBudW1fbGV2ZWxzOyBwaHlfYzgrKykgewotCQlwaHlfYzIzID0gMTsKLQkJcGh5X2MyMiA9IDA7CisJCXBoeV9jMjMgPSB0cnVlOworCQlwaHlfYzIyID0gZmFsc2U7CiAJCXN3aXRjaCAoY2FsX3R5cGUpIHsKIAkJY2FzZSAwOgogCQkJcGh5X2MxMCA9IDUxMTsKQEAgLTM3MDAsMTggKzM3MDEsMTggQEAKIAogCQlwaHlfYzkgPSByZWFkX3BoeV9yZWcocGksIDB4OTNkKTsKIAkJcGh5X2M5ID0gMiAqIHBoeV9jOTsKLQkJcGh5X2MyNCA9IDA7CisJCXBoeV9jMjQgPSBmYWxzZTsKIAkJcGh5X2M1ID0gNzsKLQkJcGh5X2MyNSA9IDE7CisJCXBoeV9jMjUgPSB0cnVlOwogCQl3aGlsZSAoMSkgewogCQkJd3JpdGVfcmFkaW9fcmVnKHBpLCBSQURJT18yMDY0X1JFRzAyNiwKIAkJCQkJKHBoeV9jNSAmIDB4NykgfCAoKHBoeV9jNSAmIDB4NykgPDwgNCkpOwogCQkJdWRlbGF5KDUwKTsKLQkJCXBoeV9jMjIgPSAwOworCQkJcGh5X2MyMiA9IGZhbHNlOwogCQkJcHRyWzEzMF0gPSAwOwogCQkJd2xjX2xjbnBoeV9zYW1wX2NhcChwaSwgMSwgcGh5X2M5LCAmcHRyWzBdLCAyKTsKIAkJCWlmIChwdHJbMTMwXSA9PSAxKQotCQkJCXBoeV9jMjIgPSAxOworCQkJCXBoeV9jMjIgPSB0cnVlOwogCQkJaWYgKHBoeV9jMjIpCiAJCQkJcGh5X2M1IC09IDE7CiAJCQlpZiAoKHBoeV9jMjIgIT0gcGh5X2MyNCkgJiYgKCFwaHlfYzI1KSkKQEAgLTM3MjEsNyArMzcyMiw3IEBACiAJCQlpZiAocGh5X2M1IDw9IDAgfHwgcGh5X2M1ID49IDcpCiAJCQkJYnJlYWs7CiAJCQlwaHlfYzI0ID0gcGh5X2MyMjsKLQkJCXBoeV9jMjUgPSAwOworCQkJcGh5X2MyNSA9IGZhbHNlOwogCQl9CiAKIAkJaWYgKHBoeV9jNSA8IDApCkBAIC0zNzcyLDEwICszNzczLDEwIEBACiAJCQkJCXBoeV9jMTMgPSBwaHlfYzExOwogCQkJCQlwaHlfYzE0ID0gcGh5X2MxMjsKIAkJCQl9Ci0JCQkJcGh5X2MyMyA9IDA7CisJCQkJcGh5X2MyMyA9IGZhbHNlOwogCQkJfQogCQl9Ci0JCXBoeV9jMjMgPSAxOworCQlwaHlfYzIzID0gdHJ1ZTsKIAkJcGh5X2MxNSA9IHBoeV9jMTM7CiAJCXBoeV9jMTYgPSBwaHlfYzE0OwogCQlwaHlfYzcgPSBwaHlfYzcgPj4gMTsKQEAgLTM5NjUsMTIgKzM5NjYsMTIgQEAKIHsKIAl1MTYgdGVtcHNlbnNldmFsMSwgdGVtcHNlbnNldmFsMjsKIAlzMTYgYXZnID0gMDsKLQlib29sIHN1c3BlbmQgPSAwOworCWJvb2wgc3VzcGVuZCA9IGZhbHNlOwogCiAJaWYgKG1vZGUgPT0gMSkgewotCQlzdXNwZW5kID0KLQkJCSgwID09Ci0JCQkgKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykpOworCQlzdXNwZW5kID0gKDAgPT0gKGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYKKwkJCQkgTUNUTF9FTl9NQUMpKTsKIAkJaWYgKCFzdXNwZW5kKQogCQkJd2xhcGlfc3VzcGVuZF9tYWNfYW5kX3dhaXQocGktPnNoLT5waHlzaGltKTsKIAkJd2xjX2xjbnBoeV92YmF0X3RlbXBfc2Vuc2Vfc2V0dXAocGksIFRFTVBTRU5TRSk7CkBAIC00MDA3LDE0ICs0MDA4LDE0IEBACiB7CiAJdTE2IHRlbXBzZW5zZXZhbDEsIHRlbXBzZW5zZXZhbDI7CiAJczMyIGF2ZyA9IDA7Ci0JYm9vbCBzdXNwZW5kID0gMDsKKwlib29sIHN1c3BlbmQgPSBmYWxzZTsKIAl1MTYgU0FWRV90eHB3cmN0cmwgPSB3bGNfbGNucGh5X2dldF90eF9wd3JfY3RybChwaSk7CiAJc3RydWN0IGJyY21zX3BoeV9sY25waHkgKnBpX2xjbiA9IHBpLT51LnBpX2xjbnBoeTsKIAogCWlmIChtb2RlID09IDEpIHsKLQkJc3VzcGVuZCA9Ci0JCQkoMCA9PQotCQkJIChSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpKTsKKwkJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwKKwkJCQkJICAgICBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKSAmCisJCQkJIE1DVExfRU5fTUFDKSk7CiAJCWlmICghc3VzcGVuZCkKIAkJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7CiAJCXdsY19sY25waHlfdmJhdF90ZW1wX3NlbnNlX3NldHVwKHBpLCBURU1QU0VOU0UpOwpAQCAtNDA3NSwxMiArNDA3NiwxMiBAQAogewogCXUxNiB2YmF0c2Vuc2V2YWw7CiAJczMyIGF2ZyA9IDA7Ci0JYm9vbCBzdXNwZW5kID0gMDsKKwlib29sIHN1c3BlbmQgPSBmYWxzZTsKIAogCWlmIChtb2RlID09IDEpIHsKLQkJc3VzcGVuZCA9Ci0JCQkoMCA9PQotCQkJIChSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpKTsKKwkJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwKKwkJCQkJICAgICBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKSAmCisJCQkJIE1DVExfRU5fTUFDKSk7CiAJCWlmICghc3VzcGVuZCkKIAkJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7CiAJCXdsY19sY25waHlfdmJhdF90ZW1wX3NlbnNlX3NldHVwKHBpLCBWQkFUU0VOU0UpOwpAQCAtNDEyNyw4ICs0MTI4LDggQEAKIAlzOCBpbmRleDsKIAl1MTYgU0FWRV9wd3JjdHJsID0gd2xjX2xjbnBoeV9nZXRfdHhfcHdyX2N0cmwocGkpOwogCXN0cnVjdCBicmNtc19waHlfbGNucGh5ICpwaV9sY24gPSBwaS0+dS5waV9sY25waHk7Ci0Jc3VzcGVuZCA9Ci0JCSgwID09IChSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpKTsKKwlzdXNwZW5kID0gKDAgPT0gKGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKSAmCisJCQkgTUNUTF9FTl9NQUMpKTsKIAlpZiAoIXN1c3BlbmQpCiAJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7CiAJd2xjX2xjbnBoeV9kZWFmX21vZGUocGksIHRydWUpOwpAQCAtNDE2Niw4ICs0MTY3LDggQEAKIAlwaV9sY24tPmxjbnBoeV9mdWxsX2NhbF9jaGFubmVsID0gQ0hTUEVDX0NIQU5ORUwocGktPnJhZGlvX2NoYW5zcGVjKTsKIAlpbmRleCA9IHBpX2xjbi0+bGNucGh5X2N1cnJlbnRfaW5kZXg7CiAKLQlzdXNwZW5kID0KLQkJKDAgPT0gKFJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCkgJiBNQ1RMX0VOX01BQykpOworCXN1c3BlbmQgPSAoMCA9PSAoYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYKKwkJCSBNQ1RMX0VOX01BQykpOwogCWlmICghc3VzcGVuZCkgewogCQl3bGFwaV9ibWFjX3dyaXRlX3NobShwaS0+c2gtPnBoeXNoaW0sIE1fQ1RTX0RVUkFUSU9OLCAxMDAwMCk7CiAJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcGh5L3BoeV9uLmMKaW5kZXggY2QxOWMyZi4uYTE2ZjFhYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BoeS9waHlfbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9waHkvcGh5X24uYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgInBoeV9yYWRpby5oIgogI2luY2x1ZGUgInBoeXJlZ19uLmgiCiAjaW5jbHVkZSAicGh5dGJsX24uaCIKKyNpbmNsdWRlICJzb2MuaCIKIAogI2RlZmluZSBSRUFEX1JBRElPX1JFRzIocGksIHJhZGlvX3R5cGUsIGpzcGFjZSwgY29yZSwgcmVnX25hbWUpCVwKIAlyZWFkX3JhZGlvX3JlZyhwaSwgcmFkaW9fdHlwZSMjXyMjanNwYWNlIyNfIyNyZWdfbmFtZSB8CVwKQEAgLTE0NDE3LDEyICsxNDQxOCw2IEBACiAJCXN3aXRjaCAoYmFuZF9udW0pIHsKIAkJY2FzZSAwOgogCi0JCQlwaS0+bnBoeV90eHBpZDJnW1BIWV9DT1JFXzBdID0KLQkJCQkodTgpIHdsYXBpX2dldGludHZhcihzaGltLAotCQkJCQkJICAgICBCUkNNU19TUk9NX1RYUElEMkdBMCk7Ci0JCQlwaS0+bnBoeV90eHBpZDJnW1BIWV9DT1JFXzFdID0KLQkJCQkodTgpIHdsYXBpX2dldGludHZhcihzaGltLAotCQkJCQkJICAgICBCUkNNU19TUk9NX1RYUElEMkdBMSk7CiAJCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bUEhZX0NPUkVfMF0ubWF4X3B3cl8yZyA9CiAJCQkJKHM4KSB3bGFwaV9nZXRpbnR2YXIoc2hpbSwKIAkJCQkJCSAgICAgQlJDTVNfU1JPTV9NQVhQMkdBMCk7CkBAIC0xNDQ4NiwxMiArMTQ0ODEsNiBAQAogCQkJYnJlYWs7CiAJCWNhc2UgMToKIAotCQkJcGktPm5waHlfdHhwaWQ1Z1tQSFlfQ09SRV8wXSA9Ci0JCQkJKHU4KSB3bGFwaV9nZXRpbnR2YXIoc2hpbSwKLQkJCQkJCSAgICAgQlJDTVNfU1JPTV9UWFBJRDVHQTApOwotCQkJcGktPm5waHlfdHhwaWQ1Z1tQSFlfQ09SRV8xXSA9Ci0JCQkJKHU4KSB3bGFwaV9nZXRpbnR2YXIoc2hpbSwKLQkJCQkJCSAgICAgQlJDTVNfU1JPTV9UWFBJRDVHQTEpOwogCQkJcGktPm5waHlfcHdyY3RybF9pbmZvW1BIWV9DT1JFXzBdLm1heF9wd3JfNWdtID0KIAkJCQkoczgpIHdsYXBpX2dldGludHZhcihzaGltLCBCUkNNU19TUk9NX01BWFA1R0EwKTsKIAkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1tQSFlfQ09SRV8xXS5tYXhfcHdyXzVnbSA9CkBAIC0xNDU1MSwxMiArMTQ1NDAsNiBAQAogCQkJYnJlYWs7CiAJCWNhc2UgMjoKIAotCQkJcGktPm5waHlfdHhwaWQ1Z2xbMF0gPQotCQkJCSh1OCkgd2xhcGlfZ2V0aW50dmFyKHNoaW0sCi0JCQkJCQkgICAgIEJSQ01TX1NST01fVFhQSUQ1R0xBMCk7Ci0JCQlwaS0+bnBoeV90eHBpZDVnbFsxXSA9Ci0JCQkJKHU4KSB3bGFwaV9nZXRpbnR2YXIoc2hpbSwKLQkJCQkJCSAgICAgQlJDTVNfU1JPTV9UWFBJRDVHTEExKTsKIAkJCXBpLT5ucGh5X3B3cmN0cmxfaW5mb1swXS5tYXhfcHdyXzVnbCA9CiAJCQkJKHM4KSB3bGFwaV9nZXRpbnR2YXIoc2hpbSwKIAkJCQkJCSAgICAgQlJDTVNfU1JPTV9NQVhQNUdMQTApOwpAQCAtMTQ2MTUsMTIgKzE0NTk4LDYgQEAKIAkJCWJyZWFrOwogCQljYXNlIDM6CiAKLQkJCXBpLT5ucGh5X3R4cGlkNWdoWzBdID0KLQkJCQkodTgpIHdsYXBpX2dldGludHZhcihzaGltLAotCQkJCQkJICAgICBCUkNNU19TUk9NX1RYUElENUdIQTApOwotCQkJcGktPm5waHlfdHhwaWQ1Z2hbMV0gPQotCQkJCSh1OCkgd2xhcGlfZ2V0aW50dmFyKHNoaW0sCi0JCQkJCQkgICAgIEJSQ01TX1NST01fVFhQSUQ1R0hBMSk7CiAJCQlwaS0+bnBoeV9wd3JjdHJsX2luZm9bMF0ubWF4X3B3cl81Z2ggPQogCQkJCShzOCkgd2xhcGlfZ2V0aW50dmFyKHNoaW0sCiAJCQkJCQkgICAgIEJSQ01TX1NST01fTUFYUDVHSEEwKTsKQEAgLTE3ODI1LDcgKzE3ODAyLDcgQEAKIAogCWlmIChEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxMSkgfHwgRDExUkVWX0lTKHBpLT5zaC0+Y29yZXJldiwgMTIpKSB7CiAJCXdsYXBpX2JtYWNfbWN0cmwocGktPnNoLT5waHlzaGltLCBNQ1RMX1BIWUxPQ0ssIE1DVExfUEhZTE9DSyk7Ci0JCSh2b2lkKVJfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCk7CisJCSh2b2lkKWJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKIAkJdWRlbGF5KDEpOwogCX0KIApAQCAtMTc5NzYsNyArMTc5NTMsNyBAQAogCiAJaWYgKEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDExKSB8fCBEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxMikpIHsKIAkJd2xhcGlfYm1hY19tY3RybChwaS0+c2gtPnBoeXNoaW0sIE1DVExfUEhZTE9DSywgTUNUTF9QSFlMT0NLKTsKLQkJKHZvaWQpUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKKwkJKHZvaWQpYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCQl1ZGVsYXkoMSk7CiAJfQogCkBAIC0xOTQ3MCw4ICsxOTQ0Nyw2IEBACiAJdTggdHhfcHdyX2N0cmxfc3RhdGU7CiAJYm9vbCBkb19ucGh5X2NhbCA9IGZhbHNlOwogCXVpbnQgY29yZTsKLQl1aW50IG9yaWdpZHgsIGludHJfdmFsOwotCXN0cnVjdCBkMTFyZWdzIF9faW9tZW0gKnJlZ3M7CiAJdTMyIGQxMV9jbGtfY3RsX3N0OwogCWJvb2wgZG9fcnNzaV9jYWwgPSBmYWxzZTsKIApAQCAtMTk0ODUsMjUgKzE5NDYwLDIxIEBACiAJICAgICAocGktPnNoLT5jaGlwcGtnID09IEJDTTQ3MThfUEtHX0lEKSkpIHsKIAkJaWYgKChwaS0+c2gtPmJvYXJkZmxhZ3MgJiBCRkxfRVhUTE5BKSAmJgogCQkgICAgKENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykpKQotCQkJYWlfY29yZXJlZyhwaS0+c2gtPnNpaCwgU0lfQ0NfSURYLAotCQkJCSAgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sKSwKLQkJCQkgICAweDQwLCAweDQwKTsKKwkJCWFpX2NjX3JlZyhwaS0+c2gtPnNpaCwKKwkJCQkgIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sKSwKKwkJCQkgIDB4NDAsIDB4NDApOwogCX0KIAogCWlmICgocGktPm5waHlfZ2JhbmRfc3B1cndhcjJfZW4pICYmIENIU1BFQ19JUzJHKHBpLT5yYWRpb19jaGFuc3BlYykgJiYKIAkgICAgQ0hTUEVDX0lTNDAocGktPnJhZGlvX2NoYW5zcGVjKSkgewogCi0JCXJlZ3MgPSAoc3RydWN0IGQxMXJlZ3MgX19pb21lbSAqKQotCQkJCWFpX3N3aXRjaF9jb3JlKHBpLT5zaC0+c2loLAotCQkJCQkgICAgICAgRDExX0NPUkVfSUQsICZvcmlnaWR4LAotCQkJCQkgICAgICAgJmludHJfdmFsKTsKLQkJZDExX2Nsa19jdGxfc3QgPSBSX1JFRygmcmVncy0+Y2xrX2N0bF9zdCk7Ci0JCUFORF9SRUcoJnJlZ3MtPmNsa19jdGxfc3QsCi0JCQl+KENDU19GT1JDRUhUIHwgQ0NTX0hUQVJFUSkpOworCQlkMTFfY2xrX2N0bF9zdCA9IGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlMoY2xrX2N0bF9zdCkpOworCQliY21hX21hc2szMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhjbGtfY3RsX3N0KSwKKwkJCSAgICB+KENDU19GT1JDRUhUIHwgQ0NTX0hUQVJFUSkpOwogCi0JCVdfUkVHKCZyZWdzLT5jbGtfY3RsX3N0LCBkMTFfY2xrX2N0bF9zdCk7Ci0KLQkJYWlfcmVzdG9yZV9jb3JlKHBpLT5zaC0+c2loLCBvcmlnaWR4LCBpbnRyX3ZhbCk7CisJCWJjbWFfd3JpdGUzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhjbGtfY3RsX3N0KSwKKwkJCSAgICAgZDExX2Nsa19jdGxfc3QpOwogCX0KIAogCXBpLT51c2VfaW50X3R4X2lxbG9fY2FsX25waHkgPQpAQCAtMTk5MDgsNyArMTk4NzksOCBAQAogCWlmICghcGktPnNoLT5jbGspCiAJCXJldHVybjsKIAotCXN1c3BlbmQgPSAoMCA9PSAoUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKSAmIE1DVExfRU5fTUFDKSk7CisJc3VzcGVuZCA9ICgwID09IChiY21hX3JlYWQzMihwaS0+ZDExY29yZSwgRDExUkVHT0ZGUyhtYWNjb250cm9sKSkgJgorCQkJIE1DVExfRU5fTUFDKSk7CiAJaWYgKCFzdXNwZW5kKQogCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCkBAIC0yMTI4NiwyOCArMjEyNTgsMjggQEAKIAl2YWwgPSByZWFkX3BoeV9yZWcocGksIDB4MDkpICYgTlBIWV9CYW5kQ29udHJvbF9jdXJyZW50QmFuZDsKIAlpZiAoQ0hTUEVDX0lTNUcoY2hhbnNwZWMpICYmICF2YWwpIHsKIAotCQl2YWwgPSBSX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtKTsKLQkJV19SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSwKKwkJdmFsID0gYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX3BoeV9oZHJfcGFyYW0pKTsKKwkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9waHlfaGRyX3BhcmFtKSwKIAkJICAgICAgKHZhbCB8IE1BQ19QSFlfRk9SQ0VfQ0xLKSk7CiAKIAkJb3JfcGh5X3JlZyhwaSwgKE5QSFlfVE9fQlBIWV9PRkYgKyBCUEhZX0JCX0NPTkZJRyksCiAJCQkgICAoQkJDRkdfUkVTRVRDQ0EgfCBCQkNGR19SRVNFVFJYKSk7CiAKLQkJV19SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSwgdmFsKTsKKwkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9waHlfaGRyX3BhcmFtKSwgdmFsKTsKIAogCQlvcl9waHlfcmVnKHBpLCAweDA5LCBOUEhZX0JhbmRDb250cm9sX2N1cnJlbnRCYW5kKTsKIAl9IGVsc2UgaWYgKCFDSFNQRUNfSVM1RyhjaGFuc3BlYykgJiYgdmFsKSB7CiAKIAkJYW5kX3BoeV9yZWcocGksIDB4MDksIH5OUEhZX0JhbmRDb250cm9sX2N1cnJlbnRCYW5kKTsKIAotCQl2YWwgPSBSX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtKTsKLQkJV19SRUcoJnBpLT5yZWdzLT5wc21fcGh5X2hkcl9wYXJhbSwKKwkJdmFsID0gYmNtYV9yZWFkMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX3BoeV9oZHJfcGFyYW0pKTsKKwkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9waHlfaGRyX3BhcmFtKSwKIAkJICAgICAgKHZhbCB8IE1BQ19QSFlfRk9SQ0VfQ0xLKSk7CiAKIAkJYW5kX3BoeV9yZWcocGksIChOUEhZX1RPX0JQSFlfT0ZGICsgQlBIWV9CQl9DT05GSUcpLAogCQkJICAgICh1MTYpICh+KEJCQ0ZHX1JFU0VUQ0NBIHwgQkJDRkdfUkVTRVRSWCkpKTsKIAotCQlXX1JFRygmcGktPnJlZ3MtPnBzbV9waHlfaGRyX3BhcmFtLCB2YWwpOworCQliY21hX3dyaXRlMTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX3BoeV9oZHJfcGFyYW0pLCB2YWwpOwogCX0KIAogCXdyaXRlX3BoeV9yZWcocGksIDB4MWNlLCBjaS0+UEhZX0JXMWEpOwpAQCAtMjEzNjUsMjQgKzIxMzM3LDIzIEBACiAJCQlzcHVyYXZvaWQgPSAxOwogCiAJCXdsYXBpX2JtYWNfY29yZV9waHlwbGxfY3RsKHBpLT5zaC0+cGh5c2hpbSwgZmFsc2UpOwotCQlzaV9wbXVfc3B1cmF2b2lkKHBpLT5zaC0+c2loLCBzcHVyYXZvaWQpOworCQlzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShwaS0+c2gtPnNpaCwgc3B1cmF2b2lkKTsKIAkJd2xhcGlfYm1hY19jb3JlX3BoeXBsbF9jdGwocGktPnNoLT5waHlzaGltLCB0cnVlKTsKIAogCQlpZiAoKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNF9DSElQX0lEKSB8fAogCQkgICAgKHBpLT5zaC0+Y2hpcCA9PSBCQ000MzIyNV9DSElQX0lEKSkgewotCiAJCQlpZiAoc3B1cmF2b2lkID09IDEpIHsKLQotCQkJCVdfUkVHKCZwaS0+cmVncy0+dHNmX2Nsa19mcmFjX2wsCi0JCQkJICAgICAgMHg1MzQxKTsKLQkJCQlXX1JFRygmcGktPnJlZ3MtPnRzZl9jbGtfZnJhY19oLAotCQkJCSAgICAgIDB4OCk7CisJCQkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlModHNmX2Nsa19mcmFjX2wpLAorCQkJCQkgICAgIDB4NTM0MSk7CisJCQkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlModHNmX2Nsa19mcmFjX2gpLCAweDgpOwogCQkJfSBlbHNlIHsKLQotCQkJCVdfUkVHKCZwaS0+cmVncy0+dHNmX2Nsa19mcmFjX2wsCi0JCQkJICAgICAgMHg4ODg5KTsKLQkJCQlXX1JFRygmcGktPnJlZ3MtPnRzZl9jbGtfZnJhY19oLAotCQkJCSAgICAgIDB4OCk7CisJCQkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlModHNmX2Nsa19mcmFjX2wpLAorCQkJCQkgICAgIDB4ODg4OSk7CisJCQkJYmNtYV93cml0ZTE2KHBpLT5kMTFjb3JlLAorCQkJCQkgICAgIEQxMVJFR09GRlModHNmX2Nsa19mcmFjX2gpLCAweDgpOwogCQkJfQogCQl9CiAKQEAgLTIxNTIyLDEzICsyMTQ5MywxMyBAQAogCiAJCWFpX2dwaW9jb250cm9sKHBpLT5zaC0+c2loLCBtYXNrLCBtYXNrLCBHUElPX0RSVl9QUklPUklUWSk7CiAKLQkJbWMgPSBSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpOworCQltYyA9IGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKTsKIAkJbWMgJj0gfk1DVExfR1BPVVRfU0VMX01BU0s7Ci0JCVdfUkVHKCZwaS0+cmVncy0+bWFjY29udHJvbCwgbWMpOworCQliY21hX3dyaXRlMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCksIG1jKTsKIAotCQlPUl9SRUcoJnBpLT5yZWdzLT5wc21fZ3Bpb19vZSwgbWFzayk7CisJCWJjbWFfc2V0MTYocGktPmQxMWNvcmUsIEQxMVJFR09GRlMocHNtX2dwaW9fb2UpLCBtYXNrKTsKIAotCQlBTkRfUkVHKCZwaS0+cmVncy0+cHNtX2dwaW9fb3V0LCB+bWFzayk7CisJCWJjbWFfbWFzazE2KHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKHBzbV9ncGlvX291dCksIH5tYXNrKTsKIAogCQlpZiAobHV0X2luaXQpIHsKIAkJCXdyaXRlX3BoeV9yZWcocGksIDB4ZjgsIDB4MDJkOCk7CkBAIC0yMTU0NSw5ICsyMTUxNiw4IEBACiAJYm9vbCBzdXNwZW5kZWQgPSBmYWxzZTsKIAogCWlmIChEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxNikpIHsKLQkJc3VzcGVuZGVkID0KLQkJCShSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpID8KLQkJCWZhbHNlIDogdHJ1ZTsKKwkJc3VzcGVuZGVkID0gKGJjbWFfcmVhZDMyKHBpLT5kMTFjb3JlLCBEMTFSRUdPRkZTKG1hY2NvbnRyb2wpKSAmCisJCQkgICAgIE1DVExfRU5fTUFDKSA/IGZhbHNlIDogdHJ1ZTsKIAkJaWYgKCFzdXNwZW5kZWQpCiAJCQl3bGFwaV9zdXNwZW5kX21hY19hbmRfd2FpdChwaS0+c2gtPnBoeXNoaW0pOwogCX0KQEAgLTI1NDA2LDcgKzI1Mzc2LDggQEAKIAlpZiAocGktPm5waHlfcGFwZF9za2lwID09IDEpCiAJCXJldHVybjsKIAotCXBoeV9iMyA9ICgwID09IChSX1JFRygmcGktPnJlZ3MtPm1hY2NvbnRyb2wpICYgTUNUTF9FTl9NQUMpKTsKKwlwaHlfYjMgPSAoMCA9PSAoYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpICYKKwkJCU1DVExfRU5fTUFDKSk7CiAJaWYgKCFwaHlfYjMpCiAJCXdsYXBpX3N1c3BlbmRfbWFjX2FuZF93YWl0KHBpLT5zaC0+cGh5c2hpbSk7CiAKQEAgLTI3OTk0LDIwICsyNzk2NSwxMSBAQAogCQljaGFuX2ZyZXFfcmFuZ2UgPSB3bGNfcGh5X2dldF9jaGFuX2ZyZXFfcmFuZ2VfbnBoeShwaSwgMCk7CiAJCXN3aXRjaCAoY2hhbl9mcmVxX3JhbmdlKSB7CiAJCWNhc2UgV0xfQ0hBTl9GUkVRX1JBTkdFXzJHOgotCQkJdHhwaVswXSA9IHBpLT5ucGh5X3R4cGlkMmdbMF07Ci0JCQl0eHBpWzFdID0gcGktPm5waHlfdHhwaWQyZ1sxXTsKLQkJCWJyZWFrOwogCQljYXNlIFdMX0NIQU5fRlJFUV9SQU5HRV81R0w6Ci0JCQl0eHBpWzBdID0gcGktPm5waHlfdHhwaWQ1Z2xbMF07Ci0JCQl0eHBpWzFdID0gcGktPm5waHlfdHhwaWQ1Z2xbMV07Ci0JCQlicmVhazsKIAkJY2FzZSBXTF9DSEFOX0ZSRVFfUkFOR0VfNUdNOgotCQkJdHhwaVswXSA9IHBpLT5ucGh5X3R4cGlkNWdbMF07Ci0JCQl0eHBpWzFdID0gcGktPm5waHlfdHhwaWQ1Z1sxXTsKLQkJCWJyZWFrOwogCQljYXNlIFdMX0NIQU5fRlJFUV9SQU5HRV81R0g6Ci0JCQl0eHBpWzBdID0gcGktPm5waHlfdHhwaWQ1Z2hbMF07Ci0JCQl0eHBpWzFdID0gcGktPm5waHlfdHhwaWQ1Z2hbMV07CisJCQl0eHBpWzBdID0gMDsKKwkJCXR4cGlbMV0gPSAwOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CiAJCQl0eHBpWzBdID0gdHhwaVsxXSA9IDkxOwpAQCAtMjgzODksNyArMjgzNTEsNyBAQAogCiAJaWYgKEQxMVJFVl9JUyhwaS0+c2gtPmNvcmVyZXYsIDExKSB8fCBEMTFSRVZfSVMocGktPnNoLT5jb3JlcmV2LCAxMikpIHsKIAkJd2xhcGlfYm1hY19tY3RybChwaS0+c2gtPnBoeXNoaW0sIE1DVExfUEhZTE9DSywgTUNUTF9QSFlMT0NLKTsKLQkJKHZvaWQpUl9SRUcoJnBpLT5yZWdzLT5tYWNjb250cm9sKTsKKwkJKHZvaWQpYmNtYV9yZWFkMzIocGktPmQxMWNvcmUsIEQxMVJFR09GRlMobWFjY29udHJvbCkpOwogCQl1ZGVsYXkoMSk7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcG11LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcG11LmMKaW5kZXggM2IzNmUzYS4uNDkzMWQyOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BtdS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9wbXUuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgInB1Yi5oIgogI2luY2x1ZGUgImFpdXRpbHMuaCIKICNpbmNsdWRlICJwbXUuaCIKKyNpbmNsdWRlICJzb2MuaCIKIAogLyoKICAqIGV4dGVybmFsIExQTyBjcnlzdGFsIGZyZXF1ZW5jeQpAQCAtMTE0LDEwICsxMTUsMTAgQEAKIAl1aW50IHJzcmNzOwogCiAJLyogIyByZXNvdXJjZXMgKi8KLQlyc3JjcyA9IChzaWgtPnBtdWNhcHMgJiBQQ0FQX1JDX01BU0spID4+IFBDQVBfUkNfU0hJRlQ7CisJcnNyY3MgPSAoYWlfZ2V0X3BtdWNhcHMoc2loKSAmIFBDQVBfUkNfTUFTSykgPj4gUENBUF9SQ19TSElGVDsKIAogCS8qIGRldGVybWluZSBtaW4vbWF4IHJzcmMgbWFza3MgKi8KLQlzd2l0Y2ggKHNpaC0+Y2hpcCkgeworCXN3aXRjaCAoYWlfZ2V0X2NoaXBfaWQoc2loKSkgewogCWNhc2UgQkNNNDMyMjRfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMjI1X0NISVBfSUQ6CiAJCS8qID8/PyAqLwpAQCAtMTM4LDc1ICsxMzksODQgQEAKIAkqcG1heCA9IG1heF9tYXNrOwogfQogCi1zdGF0aWMgdm9pZAotc2lfcG11X3NwdXJhdm9pZF9wbGx1cGRhdGUoc3RydWN0IHNpX3B1YiAqc2loLCBzdHJ1Y3QgY2hpcGNyZWdzIF9faW9tZW0gKmNjLAotCQkJICAgdTggc3B1cmF2b2lkKQordm9pZCBzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHU4IHNwdXJhdm9pZCkKIHsKIAl1MzIgdG1wID0gMDsKKwlzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmU7CiAKLQlzd2l0Y2ggKHNpaC0+Y2hpcCkgeworCS8qIHN3aXRjaCB0byBjaGlwYyAqLworCWNvcmUgPSBhaV9maW5kY29yZShzaWgsIEJDTUFfQ09SRV9DSElQQ09NTU9OLCAwKTsKKworCXN3aXRjaCAoYWlfZ2V0X2NoaXBfaWQoc2loKSkgewogCWNhc2UgQkNNNDMyMjRfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMjI1X0NISVBfSUQ6CiAJCWlmIChzcHVyYXZvaWQgPT0gMSkgewotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwwKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDExNTAwMDEwKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMSk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgwMDBDMEMwNik7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDIpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MEY2MDBhMDgpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwzKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDAwMDAwMDAwKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMNCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgyMDAxRTkyMCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDUpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4ODg4ODg4MTUpOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2FkZHIpLAorCQkJCSAgICAgUE1VMV9QTEwwX1BMTENUTDApOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2RhdGEpLAorCQkJCSAgICAgMHgxMTUwMDAxMCk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfYWRkciksCisJCQkJICAgICBQTVUxX1BMTDBfUExMQ1RMMSk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfZGF0YSksCisJCQkJICAgICAweDAwMEMwQzA2KTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9hZGRyKSwKKwkJCQkgICAgIFBNVTFfUExMMF9QTExDVEwyKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9kYXRhKSwKKwkJCQkgICAgIDB4MEY2MDBhMDgpOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2FkZHIpLAorCQkJCSAgICAgUE1VMV9QTEwwX1BMTENUTDMpOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2RhdGEpLAorCQkJCSAgICAgMHgwMDAwMDAwMCk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfYWRkciksCisJCQkJICAgICBQTVUxX1BMTDBfUExMQ1RMNCk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfZGF0YSksCisJCQkJICAgICAweDIwMDFFOTIwKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9hZGRyKSwKKwkJCQkgICAgIFBNVTFfUExMMF9QTExDVEw1KTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9kYXRhKSwKKwkJCQkgICAgIDB4ODg4ODg4MTUpOwogCQl9IGVsc2UgewotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwwKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDExMTAwMDEwKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMSk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgwMDBjMGMwNik7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDIpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MDMwMDBhMDgpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwzKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDAwMDAwMDAwKTsKLQkJCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMNCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgyMDAwMDVjMCk7Ci0JCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDUpOwotCQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4ODg4ODg4MTUpOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2FkZHIpLAorCQkJCSAgICAgUE1VMV9QTEwwX1BMTENUTDApOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2RhdGEpLAorCQkJCSAgICAgMHgxMTEwMDAxMCk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfYWRkciksCisJCQkJICAgICBQTVUxX1BMTDBfUExMQ1RMMSk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfZGF0YSksCisJCQkJICAgICAweDAwMGMwYzA2KTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9hZGRyKSwKKwkJCQkgICAgIFBNVTFfUExMMF9QTExDVEwyKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9kYXRhKSwKKwkJCQkgICAgIDB4MDMwMDBhMDgpOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2FkZHIpLAorCQkJCSAgICAgUE1VMV9QTEwwX1BMTENUTDMpOworCQkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbGxjb250cm9sX2RhdGEpLAorCQkJCSAgICAgMHgwMDAwMDAwMCk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfYWRkciksCisJCQkJICAgICBQTVUxX1BMTDBfUExMQ1RMNCk7CisJCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBsbGNvbnRyb2xfZGF0YSksCisJCQkJICAgICAweDIwMDAwNWMwKTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9hZGRyKSwKKwkJCQkgICAgIFBNVTFfUExMMF9QTExDVEw1KTsKKwkJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMocGxsY29udHJvbF9kYXRhKSwKKwkJCQkgICAgIDB4ODg4ODg4MTUpOwogCQl9CiAJCXRtcCA9IDEgPDwgMTA7CiAJCWJyZWFrOwogCi0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMCk7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDExMTAwMDA4KTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEwxKTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MGMwMDBjMDYpOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDIpOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHgwMzAwMGEwOCk7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9hZGRyLCBQTVUxX1BMTDBfUExMQ1RMMyk7Ci0JCVdfUkVHKCZjYy0+cGxsY29udHJvbF9kYXRhLCAweDAwMDAwMDAwKTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2FkZHIsIFBNVTFfUExMMF9QTExDVEw0KTsKLQkJV19SRUcoJmNjLT5wbGxjb250cm9sX2RhdGEsIDB4MjAwMDA1YzApOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfYWRkciwgUE1VMV9QTEwwX1BMTENUTDUpOwotCQlXX1JFRygmY2MtPnBsbGNvbnRyb2xfZGF0YSwgMHg4ODg4ODg1NSk7Ci0KLQkJdG1wID0gMSA8PCAxMDsKLQkJYnJlYWs7Ci0KIAlkZWZhdWx0OgogCQkvKiBiYWlsIG91dCAqLwogCQlyZXR1cm47CiAJfQogCi0JdG1wIHw9IFJfUkVHKCZjYy0+cG11Y29udHJvbCk7Ci0JV19SRUcoJmNjLT5wbXVjb250cm9sLCB0bXApOworCWJjbWFfc2V0MzIoY29yZSwgQ0hJUENSRUdPRkZTKHBtdWNvbnRyb2wpLCB0bXApOwogfQogCiB1MTYgc2lfcG11X2Zhc3RfcHdydXBfZGVsYXkoc3RydWN0IHNpX3B1YiAqc2loKQogewogCXVpbnQgZGVsYXkgPSBQTVVfTUFYX1RSQU5TSVRJT05fRExZOwogCi0Jc3dpdGNoIChzaWgtPmNoaXApIHsKKwlzd2l0Y2ggKGFpX2dldF9jaGlwX2lkKHNpaCkpIHsKIAljYXNlIEJDTTQzMjI0X0NISVBfSUQ6CiAJY2FzZSBCQ000MzIyNV9DSElQX0lEOgogCWNhc2UgQkNNNDMxM19DSElQX0lEOgpAQCAtMjE5LDU0ICsyMjksMzUgQEAKIAlyZXR1cm4gKHUxNikgZGVsYXk7CiB9CiAKLXZvaWQgc2lfcG11X3Nwcm9tX2VuYWJsZShzdHJ1Y3Qgc2lfcHViICpzaWgsIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7Ci0JdWludCBvcmlnaWR4OwotCi0JLyogUmVtZW1iZXIgb3JpZ2luYWwgY29yZSBiZWZvcmUgc3dpdGNoIHRvIGNoaXBjICovCi0Jb3JpZ2lkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQljYyA9IGFpX3NldGNvcmVpZHgoc2loLCBTSV9DQ19JRFgpOwotCi0JLyogUmV0dXJuIHRvIG9yaWdpbmFsIGNvcmUgKi8KLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7Ci19Ci0KIC8qIFJlYWQvd3JpdGUgYSBjaGlwY29udHJvbCByZWcgKi8KIHUzMiBzaV9wbXVfY2hpcGNvbnRyb2woc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IHJlZywgdTMyIG1hc2ssIHUzMiB2YWwpCiB7Ci0JYWlfY29yZXJlZyhzaWgsIFNJX0NDX0lEWCwgb2Zmc2V0b2Yoc3RydWN0IGNoaXBjcmVncywgY2hpcGNvbnRyb2xfYWRkciksCi0JCSAgIH4wLCByZWcpOwotCXJldHVybiBhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAotCQkJICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9kYXRhKSwgbWFzaywKLQkJCSAgdmFsKTsKKwlhaV9jY19yZWcoc2loLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBjaGlwY29udHJvbF9hZGRyKSwgfjAsIHJlZyk7CisJcmV0dXJuIGFpX2NjX3JlZyhzaWgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIGNoaXBjb250cm9sX2RhdGEpLAorCQkJIG1hc2ssIHZhbCk7CiB9CiAKIC8qIFJlYWQvd3JpdGUgYSByZWdjb250cm9sIHJlZyAqLwogdTMyIHNpX3BtdV9yZWdjb250cm9sKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKQogewotCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIHJlZ2NvbnRyb2xfYWRkciksCi0JCSAgIH4wLCByZWcpOwotCXJldHVybiBhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAotCQkJICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCByZWdjb250cm9sX2RhdGEpLCBtYXNrLAotCQkJICB2YWwpOworCWFpX2NjX3JlZyhzaWgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIHJlZ2NvbnRyb2xfYWRkciksIH4wLCByZWcpOworCXJldHVybiBhaV9jY19yZWcoc2loLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCByZWdjb250cm9sX2RhdGEpLAorCQkJIG1hc2ssIHZhbCk7CiB9CiAKIC8qIFJlYWQvd3JpdGUgYSBwbGxjb250cm9sIHJlZyAqLwogdTMyIHNpX3BtdV9wbGxjb250cm9sKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKQogewotCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIHBsbGNvbnRyb2xfYWRkciksCi0JCSAgIH4wLCByZWcpOwotCXJldHVybiBhaV9jb3JlcmVnKHNpaCwgU0lfQ0NfSURYLAotCQkJICBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBwbGxjb250cm9sX2RhdGEpLCBtYXNrLAotCQkJICB2YWwpOworCWFpX2NjX3JlZyhzaWgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIHBsbGNvbnRyb2xfYWRkciksIH4wLCByZWcpOworCXJldHVybiBhaV9jY19yZWcoc2loLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBwbGxjb250cm9sX2RhdGEpLAorCQkJIG1hc2ssIHZhbCk7CiB9CiAKIC8qIFBNVSBQTEwgdXBkYXRlICovCiB2b2lkIHNpX3BtdV9wbGx1cGQoc3RydWN0IHNpX3B1YiAqc2loKQogewotCWFpX2NvcmVyZWcoc2loLCBTSV9DQ19JRFgsIG9mZnNldG9mKHN0cnVjdCBjaGlwY3JlZ3MsIHBtdWNvbnRyb2wpLAotCQkgICBQQ1RMX1BMTF9QTExDVExfVVBELCBQQ1RMX1BMTF9QTExDVExfVVBEKTsKKwlhaV9jY19yZWcoc2loLCBvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBwbXVjb250cm9sKSwKKwkJICBQQ1RMX1BMTF9QTExDVExfVVBELCBQQ1RMX1BMTF9QTExDVExfVVBEKTsKIH0KIAogLyogcXVlcnkgYWxwL3h0YWwgY2xvY2sgZnJlcXVlbmN5ICovCkBAIC0yNzUsMTAgKzI2NiwxMCBAQAogCXUzMiBjbG9jayA9IEFMUF9DTE9DSzsKIAogCS8qIGJhaWwgb3V0IHdpdGggZGVmYXVsdCAqLwotCWlmICghKHNpaC0+Y2NjYXBzICYgQ0NfQ0FQX1BNVSkpCisJaWYgKCEoYWlfZ2V0X2NjY2FwcyhzaWgpICYgQ0NfQ0FQX1BNVSkpCiAJCXJldHVybiBjbG9jazsKIAotCXN3aXRjaCAoc2loLT5jaGlwKSB7CisJc3dpdGNoIChhaV9nZXRfY2hpcF9pZChzaWgpKSB7CiAJY2FzZSBCQ000MzIyNF9DSElQX0lEOgogCWNhc2UgQkNNNDMyMjVfQ0hJUF9JRDoKIAljYXNlIEJDTTQzMTNfQ0hJUF9JRDoKQEAgLTI5Miw5NSArMjgzLDI5IEBACiAJcmV0dXJuIGNsb2NrOwogfQogCi12b2lkIHNpX3BtdV9zcHVyYXZvaWQoc3RydWN0IHNpX3B1YiAqc2loLCB1OCBzcHVyYXZvaWQpCi17Ci0Jc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYzsKLQl1aW50IG9yaWdpZHgsIGludHJfdmFsOwotCi0JLyogUmVtZW1iZXIgb3JpZ2luYWwgY29yZSBiZWZvcmUgc3dpdGNoIHRvIGNoaXBjICovCi0JY2MgPSAoc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICopCi0JCQlhaV9zd2l0Y2hfY29yZShzaWgsIENDX0NPUkVfSUQsICZvcmlnaWR4LCAmaW50cl92YWwpOwotCi0JLyogdXBkYXRlIHRoZSBwbGwgY2hhbmdlcyAqLwotCXNpX3BtdV9zcHVyYXZvaWRfcGxsdXBkYXRlKHNpaCwgY2MsIHNwdXJhdm9pZCk7Ci0KLQkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgY29yZSAqLwotCWFpX3Jlc3RvcmVfY29yZShzaWgsIG9yaWdpZHgsIGludHJfdmFsKTsKLX0KLQogLyogaW5pdGlhbGl6ZSBQTVUgKi8KIHZvaWQgc2lfcG11X2luaXQoc3RydWN0IHNpX3B1YiAqc2loKQogewotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7Ci0JdWludCBvcmlnaWR4OworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZTsKIAotCS8qIFJlbWVtYmVyIG9yaWdpbmFsIGNvcmUgYmVmb3JlIHN3aXRjaCB0byBjaGlwYyAqLwotCW9yaWdpZHggPSBhaV9jb3JlaWR4KHNpaCk7Ci0JY2MgPSBhaV9zZXRjb3JlaWR4KHNpaCwgU0lfQ0NfSURYKTsKKwkvKiBzZWxlY3QgY2hpcGMgKi8KKwljb3JlID0gYWlfZmluZGNvcmUoc2loLCBCQ01BX0NPUkVfQ0hJUENPTU1PTiwgMCk7CiAKLQlpZiAoc2loLT5wbXVyZXYgPT0gMSkKLQkJQU5EX1JFRygmY2MtPnBtdWNvbnRyb2wsIH5QQ1RMX05PSUxQX09OX1dBSVQpOwotCWVsc2UgaWYgKHNpaC0+cG11cmV2ID49IDIpCi0JCU9SX1JFRygmY2MtPnBtdWNvbnRyb2wsIFBDVExfTk9JTFBfT05fV0FJVCk7Ci0KLQkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgY29yZSAqLwotCWFpX3NldGNvcmVpZHgoc2loLCBvcmlnaWR4KTsKLX0KLQotLyogaW5pdGlhbGl6ZSBQTVUgY2hpcCBjb250cm9scyBhbmQgb3RoZXIgY2hpcCBsZXZlbCBzdHVmZiAqLwotdm9pZCBzaV9wbXVfY2hpcF9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCkKLXsKLQl1aW50IG9yaWdpZHg7Ci0KLQkvKiBHYXRlIG9mZiBTUFJPTSBjbG9jayBhbmQgY2hpcCBzZWxlY3Qgc2lnbmFscyAqLwotCXNpX3BtdV9zcHJvbV9lbmFibGUoc2loLCBmYWxzZSk7Ci0KLQkvKiBSZW1lbWJlciBvcmlnaW5hbCBjb3JlICovCi0Jb3JpZ2lkeCA9IGFpX2NvcmVpZHgoc2loKTsKLQotCS8qIFJldHVybiB0byBvcmlnaW5hbCBjb3JlICovCi0JYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwotfQotCi0vKiBpbml0aWFsaXplIFBNVSBzd2l0Y2gvcmVndWxhdG9ycyAqLwotdm9pZCBzaV9wbXVfc3dyZWdfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpCi17Ci19Ci0KLS8qIGluaXRpYWxpemUgUExMICovCi12b2lkIHNpX3BtdV9wbGxfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgsIHVpbnQgeHRhbGZyZXEpCi17Ci0Jc3RydWN0IGNoaXBjcmVncyBfX2lvbWVtICpjYzsKLQl1aW50IG9yaWdpZHg7Ci0KLQkvKiBSZW1lbWJlciBvcmlnaW5hbCBjb3JlIGJlZm9yZSBzd2l0Y2ggdG8gY2hpcGMgKi8KLQlvcmlnaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCWNjID0gYWlfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7Ci0KLQlzd2l0Y2ggKHNpaC0+Y2hpcCkgewotCWNhc2UgQkNNNDMxM19DSElQX0lEOgotCWNhc2UgQkNNNDMyMjRfQ0hJUF9JRDoKLQljYXNlIEJDTTQzMjI1X0NISVBfSUQ6Ci0JCS8qID8/PyAqLwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQkvKiBSZXR1cm4gdG8gb3JpZ2luYWwgY29yZSAqLwotCWFpX3NldGNvcmVpZHgoc2loLCBvcmlnaWR4KTsKKwlpZiAoYWlfZ2V0X3BtdXJldihzaWgpID09IDEpCisJCWJjbWFfbWFzazMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbXVjb250cm9sKSwKKwkJCSAgICB+UENUTF9OT0lMUF9PTl9XQUlUKTsKKwllbHNlIGlmIChhaV9nZXRfcG11cmV2KHNpaCkgPj0gMikKKwkJYmNtYV9zZXQzMihjb3JlLCBDSElQQ1JFR09GRlMocG11Y29udHJvbCksIFBDVExfTk9JTFBfT05fV0FJVCk7CiB9CiAKIC8qIGluaXRpYWxpemUgUE1VIHJlc291cmNlcyAqLwogdm9pZCBzaV9wbXVfcmVzX2luaXQoc3RydWN0IHNpX3B1YiAqc2loKQogewotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7Ci0JdWludCBvcmlnaWR4OworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZTsKIAl1MzIgbWluX21hc2sgPSAwLCBtYXhfbWFzayA9IDA7CiAKLQkvKiBSZW1lbWJlciBvcmlnaW5hbCBjb3JlIGJlZm9yZSBzd2l0Y2ggdG8gY2hpcGMgKi8KLQlvcmlnaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCWNjID0gYWlfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CisJLyogc2VsZWN0IHRvIGNoaXBjICovCisJY29yZSA9IGFpX2ZpbmRjb3JlKHNpaCwgQkNNQV9DT1JFX0NISVBDT01NT04sIDApOwogCiAJLyogRGV0ZXJtaW5lIG1pbi9tYXggcnNyYyBtYXNrcyAqLwogCXNpX3BtdV9yZXNfbWFza3Moc2loLCAmbWluX21hc2ssICZtYXhfbWFzayk7CkBAIC0zOTAsNTUgKzMxNSw1MCBAQAogCS8qIFByb2dyYW0gbWF4IHJlc291cmNlIG1hc2sgKi8KIAogCWlmIChtYXhfbWFzaykKLQkJV19SRUcoJmNjLT5tYXhfcmVzX21hc2ssIG1heF9tYXNrKTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhtYXhfcmVzX21hc2spLCBtYXhfbWFzayk7CiAKIAkvKiBQcm9ncmFtIG1pbiByZXNvdXJjZSBtYXNrICovCiAKIAlpZiAobWluX21hc2spCi0JCVdfUkVHKCZjYy0+bWluX3Jlc19tYXNrLCBtaW5fbWFzayk7CisJCWJjbWFfd3JpdGUzMihjb3JlLCBDSElQQ1JFR09GRlMobWluX3Jlc19tYXNrKSwgbWluX21hc2spOwogCiAJLyogQWRkIHNvbWUgZGVsYXk7IGFsbG93IHJlc291cmNlcyB0byBjb21lIHVwIGFuZCBzZXR0bGUuICovCiAJbWRlbGF5KDIpOwotCi0JLyogUmV0dXJuIHRvIG9yaWdpbmFsIGNvcmUgKi8KLQlhaV9zZXRjb3JlaWR4KHNpaCwgb3JpZ2lkeCk7CiB9CiAKIHUzMiBzaV9wbXVfbWVhc3VyZV9hbHBjbGsoc3RydWN0IHNpX3B1YiAqc2loKQogewotCXN0cnVjdCBjaGlwY3JlZ3MgX19pb21lbSAqY2M7Ci0JdWludCBvcmlnaWR4OworCXN0cnVjdCBiY21hX2RldmljZSAqY29yZTsKIAl1MzIgYWxwX2toejsKIAotCWlmIChzaWgtPnBtdXJldiA8IDEwKQorCWlmIChhaV9nZXRfcG11cmV2KHNpaCkgPCAxMCkKIAkJcmV0dXJuIDA7CiAKIAkvKiBSZW1lbWJlciBvcmlnaW5hbCBjb3JlIGJlZm9yZSBzd2l0Y2ggdG8gY2hpcGMgKi8KLQlvcmlnaWR4ID0gYWlfY29yZWlkeChzaWgpOwotCWNjID0gYWlfc2V0Y29yZWlkeChzaWgsIFNJX0NDX0lEWCk7CisJY29yZSA9IGFpX2ZpbmRjb3JlKHNpaCwgQkNNQV9DT1JFX0NISVBDT01NT04sIDApOwogCi0JaWYgKFJfUkVHKCZjYy0+cG11c3RhdHVzKSAmIFBTVF9FWFRMUE9BVkFJTCkgeworCWlmIChiY21hX3JlYWQzMihjb3JlLCBDSElQQ1JFR09GRlMocG11c3RhdHVzKSkgJiBQU1RfRVhUTFBPQVZBSUwpIHsKIAkJdTMyIGlscF9jdHIsIGFscF9oejsKIAogCQkvKgogCQkgKiBFbmFibGUgdGhlIHJlZyB0byBtZWFzdXJlIHRoZSBmcmVxLAogCQkgKiBpbiBjYXNlIGl0IHdhcyBkaXNhYmxlZCBiZWZvcmUKIAkJICovCi0JCVdfUkVHKCZjYy0+cG11X3h0YWxmcmVxLAotCQkgICAgICAxVSA8PCBQTVVfWFRBTEZSRVFfUkVHX01FQVNVUkVfU0hJRlQpOworCQliY21hX3dyaXRlMzIoY29yZSwgQ0hJUENSRUdPRkZTKHBtdV94dGFsZnJlcSksCisJCQkgICAgMVUgPDwgUE1VX1hUQUxGUkVRX1JFR19NRUFTVVJFX1NISUZUKTsKIAogCQkvKiBEZWxheSBmb3Igd2VsbCBvdmVyIDQgSUxQIGNsb2NrcyAqLwogCQl1ZGVsYXkoMTAwMCk7CiAKIAkJLyogUmVhZCB0aGUgbGF0Y2hlZCBudW1iZXIgb2YgQUxQIHRpY2tzIHBlciA0IElMUCB0aWNrcyAqLwotCQlpbHBfY3RyID0KLQkJICAgIFJfUkVHKCZjYy0+cG11X3h0YWxmcmVxKSAmIFBNVV9YVEFMRlJFUV9SRUdfSUxQQ1RSX01BU0s7CisJCWlscF9jdHIgPSBiY21hX3JlYWQzMihjb3JlLCBDSElQQ1JFR09GRlMocG11X3h0YWxmcmVxKSkgJgorCQkJICBQTVVfWFRBTEZSRVFfUkVHX0lMUENUUl9NQVNLOwogCiAJCS8qCiAJCSAqIFR1cm4gb2ZmIHRoZSBQTVVfWFRBTEZSRVFfUkVHX01FQVNVUkVfU0hJRlQKIAkJICogYml0IHRvIHNhdmUgcG93ZXIKIAkJICovCi0JCVdfUkVHKCZjYy0+cG11X3h0YWxmcmVxLCAwKTsKKwkJYmNtYV93cml0ZTMyKGNvcmUsIENISVBDUkVHT0ZGUyhwbXVfeHRhbGZyZXEpLCAwKTsKIAogCQkvKiBDYWxjdWxhdGUgQUxQIGZyZXF1ZW5jeSAqLwogCQlhbHBfaHogPSAoaWxwX2N0ciAqIEVYVF9JTFBfSFopIC8gNDsKQEAgLTQ1MSw4ICszNzEsNSBAQAogCX0gZWxzZQogCQlhbHBfa2h6ID0gMDsKIAotCS8qIFJldHVybiB0byBvcmlnaW5hbCBjb3JlICovCi0JYWlfc2V0Y29yZWlkeChzaWgsIG9yaWdpZHgpOwotCiAJcmV0dXJuIGFscF9raHo7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcG11LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcG11LmgKaW5kZXggM2EwOGM2Mi4uM2UzOWM1ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3BtdS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9wbXUuaApAQCAtMjYsMTMgKzI2LDEwIEBACiBleHRlcm4gdTMyIHNpX3BtdV9yZWdjb250cm9sKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKTsKIGV4dGVybiB1MzIgc2lfcG11X2FscF9jbG9jayhzdHJ1Y3Qgc2lfcHViICpzaWgpOwogZXh0ZXJuIHZvaWQgc2lfcG11X3BsbHVwZChzdHJ1Y3Qgc2lfcHViICpzaWgpOwotZXh0ZXJuIHZvaWQgc2lfcG11X3NwdXJhdm9pZChzdHJ1Y3Qgc2lfcHViICpzaWgsIHU4IHNwdXJhdm9pZCk7CitleHRlcm4gdm9pZCBzaV9wbXVfc3B1cmF2b2lkX3BsbHVwZGF0ZShzdHJ1Y3Qgc2lfcHViICpzaWgsIHU4IHNwdXJhdm9pZCk7CiBleHRlcm4gdTMyIHNpX3BtdV9wbGxjb250cm9sKHN0cnVjdCBzaV9wdWIgKnNpaCwgdWludCByZWcsIHUzMiBtYXNrLCB1MzIgdmFsKTsKIGV4dGVybiB2b2lkIHNpX3BtdV9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfY2hpcF9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfcGxsX2luaXQoc3RydWN0IHNpX3B1YiAqc2loLCB1MzIgeHRhbGZyZXEpOwogZXh0ZXJuIHZvaWQgc2lfcG11X3Jlc19pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCk7Ci1leHRlcm4gdm9pZCBzaV9wbXVfc3dyZWdfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwogZXh0ZXJuIHUzMiBzaV9wbXVfbWVhc3VyZV9hbHBjbGsoc3RydWN0IHNpX3B1YiAqc2loKTsKIAogI2VuZGlmIC8qIF9CUkNNX1BNVV9IXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3B1Yi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3B1Yi5oCmluZGV4IDM3YmIyZGMuLmYwMDM4YWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9wdWIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcHViLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgX0JSQ01fUFVCX0hfCiAjZGVmaW5lIF9CUkNNX1BVQl9IXwogCisjaW5jbHVkZSA8bGludXgvYmNtYS9iY21hLmg+CiAjaW5jbHVkZSA8YnJjbXVfd2lmaS5oPgogI2luY2x1ZGUgInR5cGVzLmgiCiAjaW5jbHVkZSAiZGVmcy5oIgpAQCAtMTcwLDIyICsxNzEsNiBAQAogCUJSQ01TX1NST01fVFNTSVBPUzJHLAogCUJSQ01TX1NST01fVFNTSVBPUzVHLAogCUJSQ01TX1NST01fVFhDSEFJTiwKLQlCUkNNU19TUk9NX1RYUElEMkdBMCwKLQlCUkNNU19TUk9NX1RYUElEMkdBMSwKLQlCUkNNU19TUk9NX1RYUElEMkdBMiwKLQlCUkNNU19TUk9NX1RYUElEMkdBMywKLQlCUkNNU19TUk9NX1RYUElENUdBMCwKLQlCUkNNU19TUk9NX1RYUElENUdBMSwKLQlCUkNNU19TUk9NX1RYUElENUdBMiwKLQlCUkNNU19TUk9NX1RYUElENUdBMywKLQlCUkNNU19TUk9NX1RYUElENUdIQTAsCi0JQlJDTVNfU1JPTV9UWFBJRDVHSEExLAotCUJSQ01TX1NST01fVFhQSUQ1R0hBMiwKLQlCUkNNU19TUk9NX1RYUElENUdIQTMsCi0JQlJDTVNfU1JPTV9UWFBJRDVHTEEwLAotCUJSQ01TX1NST01fVFhQSUQ1R0xBMSwKLQlCUkNNU19TUk9NX1RYUElENUdMQTIsCi0JQlJDTVNfU1JPTV9UWFBJRDVHTEEzLAogCS8qCiAJICogcGVyLXBhdGggaWRlbnRpZmllcnMgKHNlZSBzcm9tLmMpCiAJICovCkBAIC0yMjUsMTAgKzIxMCw2IEBACiAJQlJDTVNfU1JPTV9QQTJHVzJBMSwKIAlCUkNNU19TUk9NX1BBMkdXMkEyLAogCUJSQ01TX1NST01fUEEyR1cyQTMsCi0JQlJDTVNfU1JPTV9QQTJHVzNBMCwKLQlCUkNNU19TUk9NX1BBMkdXM0ExLAotCUJSQ01TX1NST01fUEEyR1czQTIsCi0JQlJDTVNfU1JPTV9QQTJHVzNBMywKIAlCUkNNU19TUk9NX1BBNUdIVzBBMCwKIAlCUkNNU19TUk9NX1BBNUdIVzBBMSwKIAlCUkNNU19TUk9NX1BBNUdIVzBBMiwKQEAgLTI0MSwxMCArMjIyLDYgQEAKIAlCUkNNU19TUk9NX1BBNUdIVzJBMSwKIAlCUkNNU19TUk9NX1BBNUdIVzJBMiwKIAlCUkNNU19TUk9NX1BBNUdIVzJBMywKLQlCUkNNU19TUk9NX1BBNUdIVzNBMCwKLQlCUkNNU19TUk9NX1BBNUdIVzNBMSwKLQlCUkNNU19TUk9NX1BBNUdIVzNBMiwKLQlCUkNNU19TUk9NX1BBNUdIVzNBMywKIAlCUkNNU19TUk9NX1BBNUdMVzBBMCwKIAlCUkNNU19TUk9NX1BBNUdMVzBBMSwKIAlCUkNNU19TUk9NX1BBNUdMVzBBMiwKQEAgLTI1NywxMCArMjM0LDYgQEAKIAlCUkNNU19TUk9NX1BBNUdMVzJBMSwKIAlCUkNNU19TUk9NX1BBNUdMVzJBMiwKIAlCUkNNU19TUk9NX1BBNUdMVzJBMywKLQlCUkNNU19TUk9NX1BBNUdMVzNBMCwKLQlCUkNNU19TUk9NX1BBNUdMVzNBMSwKLQlCUkNNU19TUk9NX1BBNUdMVzNBMiwKLQlCUkNNU19TUk9NX1BBNUdMVzNBMywKIAlCUkNNU19TUk9NX1BBNUdXMEEwLAogCUJSQ01TX1NST01fUEE1R1cwQTEsCiAJQlJDTVNfU1JPTV9QQTVHVzBBMiwKQEAgLTI3MywxNCArMjQ2LDkgQEAKIAlCUkNNU19TUk9NX1BBNUdXMkExLAogCUJSQ01TX1NST01fUEE1R1cyQTIsCiAJQlJDTVNfU1JPTV9QQTVHVzJBMywKLQlCUkNNU19TUk9NX1BBNUdXM0EwLAotCUJSQ01TX1NST01fUEE1R1czQTEsCi0JQlJDTVNfU1JPTV9QQTVHVzNBMiwKLQlCUkNNU19TUk9NX1BBNUdXM0EzLAogfTsKIAogI2RlZmluZQlCUkNNU19OVU1SQVRFUwkxNgkvKiBtYXggIyBvZiByYXRlcyBpbiBhIHJhdGVzZXQgKi8KLSNkZWZpbmUJRDExX1BIWV9IRFJfTEVOCTYJLyogUGh5IGhlYWRlciBsZW5ndGggLSA2IGJ5dGVzICovCiAKIC8qIHBoeSB0eXBlcyAqLwogI2RlZmluZQlQSFlfVFlQRV9BCTAJLyogUGh5IHR5cGUgQSAqLwpAQCAtNDE0LDcgKzM4Miw2IEBACiAJdWludCBfbmJhbmRzOwkJLyogIyBiYW5kcyBzdXBwb3J0ZWQgKi8KIAl1aW50IG5vdzsJCS8qICMgZWxhcHNlZCBzZWNvbmRzICovCiAKLQlib29sIHByb21pc2M7CQkvKiBwcm9taXNjdW91cyBkZXN0aW5hdGlvbiBhZGRyZXNzICovCiAJYm9vbCBkZWxheWVkX2Rvd247CS8qIGRvd24gZGVsYXllZCAqLwogCWJvb2wgYXNzb2NpYXRlZDsJLyogdHJ1ZTpwYXJ0IG9mIFtJXUJTUywgZmFsc2U6IG5vdCAqLwogCS8qICh1bmlvbiBvZiBzdGFzX2Fzc29jaWF0ZWQsIGFwc19hc3NvY2lhdGVkKSAqLwpAQCAtNTY0LDE1ICs1MzEsMTQgQEAKIAogLyogY29tbW9uIGZ1bmN0aW9ucyBmb3IgZXZlcnkgcG9ydCAqLwogZXh0ZXJuIHN0cnVjdCBicmNtc19jX2luZm8gKgotYnJjbXNfY19hdHRhY2goc3RydWN0IGJyY21zX2luZm8gKndsLCB1MTYgdmVuZG9yLCB1MTYgZGV2aWNlLCB1aW50IHVuaXQsCi0JICAgICAgIGJvb2wgcGlvbW9kZSwgdm9pZCBfX2lvbWVtICpyZWdzdmEsIHN0cnVjdCBwY2lfZGV2ICpidHBhcmFtLAotCSAgICAgICB1aW50ICpwZXJyKTsKK2JyY21zX2NfYXR0YWNoKHN0cnVjdCBicmNtc19pbmZvICp3bCwgc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1aW50IHVuaXQsCisJICAgICAgIGJvb2wgcGlvbW9kZSwgdWludCAqcGVycik7CiBleHRlcm4gdWludCBicmNtc19jX2RldGFjaChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwogZXh0ZXJuIGludCBicmNtc19jX3VwKHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7CiBleHRlcm4gdWludCBicmNtc19jX2Rvd24oc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKIAogZXh0ZXJuIGJvb2wgYnJjbXNfY19jaGlwbWF0Y2godTE2IHZlbmRvciwgdTE2IGRldmljZSk7Ci1leHRlcm4gdm9pZCBicmNtc19jX2luaXQoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjKTsKK2V4dGVybiB2b2lkIGJyY21zX2NfaW5pdChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMsIGJvb2wgbXV0ZV90eCk7CiBleHRlcm4gdm9pZCBicmNtc19jX3Jlc2V0KHN0cnVjdCBicmNtc19jX2luZm8gKndsYyk7CiAKIGV4dGVybiB2b2lkIGJyY21zX2NfaW50cnNvbihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwpAQCAtNjI4LDcgKzU5NCw3IEBACiAJCQkJCXU4IGludGVydmFsKTsKIGV4dGVybiBpbnQgYnJjbXNfY19zZXRfdHhfcG93ZXIoc3RydWN0IGJyY21zX2NfaW5mbyAqd2xjLCBpbnQgdHhwd3IpOwogZXh0ZXJuIGludCBicmNtc19jX2dldF90eF9wb3dlcihzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOwotZXh0ZXJuIHZvaWQgYnJjbXNfY19zZXRfcmFkaW9fbXBjKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCBtcGMpOwogZXh0ZXJuIGJvb2wgYnJjbXNfY19jaGVja19yYWRpb19kaXNhYmxlZChzdHJ1Y3QgYnJjbXNfY19pbmZvICp3bGMpOworZXh0ZXJuIHZvaWQgYnJjbXNfY19tdXRlKHN0cnVjdCBicmNtc19jX2luZm8gKndsYywgYm9vbCBvbik7CiAKICNlbmRpZgkJCQkvKiBfQlJDTV9QVUJfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9yYXRlLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvcmF0ZS5oCmluZGV4IGU3YjlkYzIuLjk4MGQ1NzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9yYXRlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3JhdGUuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSAidHlwZXMuaCIKICNpbmNsdWRlICJkMTEuaCIKKyNpbmNsdWRlICJwaHlfaGFsLmgiCiAKIGV4dGVybiBjb25zdCB1OCByYXRlX2luZm9bXTsKIGV4dGVybiBjb25zdCBzdHJ1Y3QgYnJjbXNfY19yYXRlc2V0IGNja19vZmRtX21pbW9fcmF0ZXM7CkBAIC0xOTgsMTEgKzE5OSw5IEBACiAKIC8qIENvbnZlcnQgZW5jb2RlZCByYXRlIHZhbHVlIGluIHBsY3AgaGVhZGVyIHRvIG51bWVyaWNhbCByYXRlcyBpbiA1MDAgS0h6CiAgKiBpbmNyZW1lbnRzICovCi1leHRlcm4gY29uc3QgdTggb2ZkbV9yYXRlX2xvb2t1cFtdOwotCiBzdGF0aWMgaW5saW5lIHU4IG9mZG1fcGh5Mm1hY19yYXRlKHU4IHJscHQpCiB7Ci0JcmV0dXJuIG9mZG1fcmF0ZV9sb29rdXBbcmxwdCAmIDB4N107CisJcmV0dXJuIHdsY19waHlfZ2V0X29mZG1fcmF0ZV9sb29rdXAoKVtybHB0ICYgMHg3XTsKIH0KIAogc3RhdGljIGlubGluZSB1OCBjY2tfcGh5Mm1hY19yYXRlKHU4IHNpZ25hbCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5jCmluZGV4IDk5Zjc5MTAuLjYxMDkyMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3Nyb20uYwpAQCAtMjgsNiArMjgsNyBAQAogI2luY2x1ZGUgImFpdXRpbHMuaCIKICNpbmNsdWRlICJvdHAuaCIKICNpbmNsdWRlICJzcm9tLmgiCisjaW5jbHVkZSAic29jLmgiCiAKIC8qCiAgKiBTUk9NIENSQzggcG9seW5vbWlhbCB2YWx1ZToKQEAgLTYyLDkgKzYzLDYgQEAKICNkZWZpbmUJU1JPTV9NQUNISV9FVDEJCTQyCiAjZGVmaW5lCVNST01fTUFDTUlEX0VUMQkJNDMKICNkZWZpbmUJU1JPTV9NQUNMT19FVDEJCTQ0Ci0jZGVmaW5lCVNST00zX01BQ0hJCQkzNwotI2RlZmluZQlTUk9NM19NQUNNSUQJCTM4Ci0jZGVmaW5lCVNST00zX01BQ0xPCQkzOQogCiAjZGVmaW5lCVNST01fQlhBUlNTSTJHCQk0MAogI2RlZmluZQlTUk9NX0JYQVJTU0k1RwkJNDEKQEAgLTEwMSw3ICs5OSw2IEBACiAKICNkZWZpbmUJU1JPTV9CRkwJCTU3CiAjZGVmaW5lCVNST01fQkZMMgkJMjgKLSNkZWZpbmUJU1JPTTNfQkZMMgkJNjEKIAogI2RlZmluZQlTUk9NX0FHMTAJCTU4CiAKQEAgLTEwOSw5OSArMTA2LDE2IEBACiAKICNkZWZpbmUJU1JPTV9PUE8JCTYwCiAKLSNkZWZpbmUJU1JPTTNfTEVEREMJCTYyCi0KICNkZWZpbmUJU1JPTV9DUkNSRVYJCTYzCiAKLS8qIFNST00gUmV2IDQ6IFJlYWxsb2NhdGUgdGhlIHNvZnR3YXJlIHBhcnQgb2YgdGhlIHNyb20gdG8gYWNjb21tb2RhdGUKLSAqIE1JTU8gZmVhdHVyZXMuIEl0IGFzc3VtZXMgdXAgdG8gdHdvIFBDSUUgZnVuY3Rpb25zIGFuZCA0NDAgYnl0ZXMKLSAqIG9mIHVzYWJsZSBzcm9tIGkuZS4gdGhlIHVzYWJsZSBzdG9yYWdlIGluIGNoaXBzIHdpdGggT1RQIHRoYXQKLSAqIGltcGxlbWVudHMgaGFyZHdhcmUgcmVkdW5kYW5jeS4KLSAqLwotCiAjZGVmaW5lCVNST000X1dPUkRTCQkyMjAKIAotI2RlZmluZQlTUk9NNF9TSUdOCQkzMgotI2RlZmluZQlTUk9NNF9TSUdOQVRVUkUJCTB4NTM3MgotCi0jZGVmaW5lCVNST000X0JSRVYJCTMzCi0KLSNkZWZpbmUJU1JPTTRfQkZMMAkJMzQKLSNkZWZpbmUJU1JPTTRfQkZMMQkJMzUKLSNkZWZpbmUJU1JPTTRfQkZMMgkJMzYKLSNkZWZpbmUJU1JPTTRfQkZMMwkJMzcKLSNkZWZpbmUJU1JPTTVfQkZMMAkJMzcKLSNkZWZpbmUJU1JPTTVfQkZMMQkJMzgKLSNkZWZpbmUJU1JPTTVfQkZMMgkJMzkKLSNkZWZpbmUJU1JPTTVfQkZMMwkJNDAKLQotI2RlZmluZQlTUk9NNF9NQUNISQkJMzgKLSNkZWZpbmUJU1JPTTRfTUFDTUlECQkzOQotI2RlZmluZQlTUk9NNF9NQUNMTwkJNDAKLSNkZWZpbmUJU1JPTTVfTUFDSEkJCTQxCi0jZGVmaW5lCVNST001X01BQ01JRAkJNDIKLSNkZWZpbmUJU1JPTTVfTUFDTE8JCTQzCi0KLSNkZWZpbmUJU1JPTTRfQ0NPREUJCTQxCi0jZGVmaW5lCVNST000X1JFR1JFVgkJNDIKLSNkZWZpbmUJU1JPTTVfQ0NPREUJCTM0Ci0jZGVmaW5lCVNST001X1JFR1JFVgkJMzUKLQotI2RlZmluZQlTUk9NNF9MRURCSDEwCQk0MwotI2RlZmluZQlTUk9NNF9MRURCSDMyCQk0NAotI2RlZmluZQlTUk9NNV9MRURCSDEwCQk1OQotI2RlZmluZQlTUk9NNV9MRURCSDMyCQk2MAotCi0jZGVmaW5lCVNST000X0xFRERDCQk0NQotI2RlZmluZQlTUk9NNV9MRUREQwkJNDUKLQotI2RlZmluZQlTUk9NNF9BQQkJNDYKLQotI2RlZmluZQlTUk9NNF9BRzEwCQk0NwotI2RlZmluZQlTUk9NNF9BRzMyCQk0OAotCi0jZGVmaW5lCVNST000X1RYUElEMkcJCTQ5Ci0jZGVmaW5lCVNST000X1RYUElENUcJCTUxCi0jZGVmaW5lCVNST000X1RYUElENUdMCQk1MwotI2RlZmluZQlTUk9NNF9UWFBJRDVHSAkJNTUKLQotI2RlZmluZSBTUk9NNF9UWFJYQwkJNjEKICNkZWZpbmUgU1JPTTRfVFhDSEFJTl9NQVNLCTB4MDAwZgotI2RlZmluZSBTUk9NNF9UWENIQUlOX1NISUZUCTAKICNkZWZpbmUgU1JPTTRfUlhDSEFJTl9NQVNLCTB4MDBmMAotI2RlZmluZSBTUk9NNF9SWENIQUlOX1NISUZUCTQKICNkZWZpbmUgU1JPTTRfU1dJVENIX01BU0sJMHhmZjAwCi0jZGVmaW5lIFNST000X1NXSVRDSF9TSElGVAk4CiAKIC8qIFBlci1wYXRoIGZpZWxkcyAqLwogI2RlZmluZQlNQVhfUEFUSF9TUk9NCQk0Ci0jZGVmaW5lCVNST000X1BBVEgwCQk2NAotI2RlZmluZQlTUk9NNF9QQVRIMQkJODcKLSNkZWZpbmUJU1JPTTRfUEFUSDIJCTExMAotI2RlZmluZQlTUk9NNF9QQVRIMwkJMTMzCi0KLSNkZWZpbmUJU1JPTTRfMkdfSVRUX01BWFAJMAotI2RlZmluZQlTUk9NNF8yR19QQQkJMQotI2RlZmluZQlTUk9NNF81R19JVFRfTUFYUAk1Ci0jZGVmaW5lCVNST000XzVHTEhfTUFYUAkJNgotI2RlZmluZQlTUk9NNF81R19QQQkJNwotI2RlZmluZQlTUk9NNF81R0xfUEEJCTExCi0jZGVmaW5lCVNST000XzVHSF9QQQkJMTUKLQotLyogQWxsIHRoZSBtaXJpYWQgcG93ZXIgb2Zmc2V0cyAqLwotI2RlZmluZQlTUk9NNF8yR19DQ0tQTwkJMTU2Ci0jZGVmaW5lCVNST000XzJHX09GRE1QTwkJMTU3Ci0jZGVmaW5lCVNST000XzVHX09GRE1QTwkJMTU5Ci0jZGVmaW5lCVNST000XzVHTF9PRkRNUE8JMTYxCi0jZGVmaW5lCVNST000XzVHSF9PRkRNUE8JMTYzCi0jZGVmaW5lCVNST000XzJHX01DU1BPCQkxNjUKLSNkZWZpbmUJU1JPTTRfNUdfTUNTUE8JCTE3MwotI2RlZmluZQlTUk9NNF81R0xfTUNTUE8JCTE4MQotI2RlZmluZQlTUk9NNF81R0hfTUNTUE8JCTE4OQotI2RlZmluZQlTUk9NNF9DRERQTwkJMTk3Ci0jZGVmaW5lCVNST000X1NUQkNQTwkJMTk4Ci0jZGVmaW5lCVNST000X0JXNDBQTwkJMTk5Ci0jZGVmaW5lCVNST000X0JXRFVQUE8JCTIwMAogCiAjZGVmaW5lCVNST000X0NSQ1JFVgkJMjE5CiAKQEAgLTQyNCwxMDMgKzMzOCwzMiBAQAogc3RhdGljIGNvbnN0IHN0cnVjdCBicmNtc19zcm9tdmFyIHBjaV9zcm9tdmFyc1tdID0gewogCXtCUkNNU19TUk9NX0RFVklELCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYIHwgU1JGTF9OT1ZBUiwgUENJX0YwREVWSUQsCiAJIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQk9BUkRSRVYsIDB4MDAwMDAwMGUsIFNSRkxfUFJIRVgsIFNST01fQUFCUkVWLAotCSBTUk9NX0JSX01BU0t9LAotCXtCUkNNU19TUk9NX0JPQVJEUkVWLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF9CUkVWLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX0JPQVJEUkVWLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9CUkVWLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JPQVJERkxBR1MsIDB4MDAwMDAwMDIsIFNSRkxfUFJIRVgsIFNST01fQkZMLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JPQVJERkxBR1MsIDB4MDAwMDAwMDQsIFNSRkxfUFJIRVggfCBTUkZMX01PUkUsIFNST01fQkZMLAotCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0NPTlQsIDAsIDAsIFNST01fQkZMMiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CT0FSREZMQUdTLCAweDAwMDAwMDA4LCBTUkZMX1BSSEVYIHwgU1JGTF9NT1JFLCBTUk9NX0JGTCwKLQkgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NM19CRkwyLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JPQVJERkxBR1MsIDB4MDAwMDAwMTAsIFNSRkxfUFJIRVggfCBTUkZMX01PUkUsIFNST000X0JGTDAsCi0JIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQ09OVCwgMCwgMCwgU1JPTTRfQkZMMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CT0FSREZMQUdTLCAweDAwMDAwMGUwLCBTUkZMX1BSSEVYIHwgU1JGTF9NT1JFLCBTUk9NNV9CRkwwLAotCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0NPTlQsIDAsIDAsIFNST001X0JGTDEsIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fQk9BUkRGTEFHUywgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCB8IFNSRkxfTU9SRSwgU1JPTThfQkZMMCwKIAkgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NOF9CRkwxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JPQVJERkxBR1MyLCAweDAwMDAwMDEwLCBTUkZMX1BSSEVYIHwgU1JGTF9NT1JFLCBTUk9NNF9CRkwyLAotCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0NPTlQsIDAsIDAsIFNST000X0JGTDMsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQk9BUkRGTEFHUzIsIDB4MDAwMDAwZTAsIFNSRkxfUFJIRVggfCBTUkZMX01PUkUsIFNST001X0JGTDIsCi0JIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQ09OVCwgMCwgMCwgU1JPTTVfQkZMMywgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9CT0FSREZMQUdTMiwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCB8IFNSRkxfTU9SRSwgU1JPTThfQkZMMiwKIAkgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NOF9CRkwzLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX0JPQVJEVFlQRSwgMHhmZmZmZmZmYywgU1JGTF9QUkhFWCwgU1JPTV9TU0lELCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JPQVJETlVNLCAweDAwMDAwMDA2LCAwLCBTUk9NX01BQ0xPX0lMMCwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9CT0FSRE5VTSwgMHgwMDAwMDAwOCwgMCwgU1JPTTNfTUFDTE8sIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQk9BUkROVU0sIDB4MDAwMDAwMTAsIDAsIFNST000X01BQ0xPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JPQVJETlVNLCAweDAwMDAwMGUwLCAwLCBTUk9NNV9NQUNMTywgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9CT0FSRE5VTSwgMHhmZmZmZmYwMCwgMCwgU1JPTThfTUFDTE8sIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQ0MsIDB4MDAwMDAwMDIsIDAsIFNST01fQUFCUkVWLCBTUk9NX0NDX01BU0t9LAotCXtCUkNNU19TUk9NX1JFR1JFViwgMHgwMDAwMDAwOCwgMCwgU1JPTV9PUE8sIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fUkVHUkVWLCAweDAwMDAwMDEwLCAwLCBTUk9NNF9SRUdSRVYsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fUkVHUkVWLCAweDAwMDAwMGUwLCAwLCBTUk9NNV9SRUdSRVYsIDB4MDBmZn0sCiAJe0JSQ01TX1NST01fUkVHUkVWLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9SRUdSRVYsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fTEVEQkgwLCAweDAwMDAwMDBlLCBTUkZMX05PRkZTLCBTUk9NX0xFREJIMTAsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fTEVEQkgxLCAweDAwMDAwMDBlLCBTUkZMX05PRkZTLCBTUk9NX0xFREJIMTAsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fTEVEQkgyLCAweDAwMDAwMDBlLCBTUkZMX05PRkZTLCBTUk9NX0xFREJIMzIsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fTEVEQkgzLCAweDAwMDAwMDBlLCBTUkZMX05PRkZTLCBTUk9NX0xFREJIMzIsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fTEVEQkgwLCAweDAwMDAwMDEwLCBTUkZMX05PRkZTLCBTUk9NNF9MRURCSDEwLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0xFREJIMSwgMHgwMDAwMDAxMCwgU1JGTF9OT0ZGUywgU1JPTTRfTEVEQkgxMCwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9MRURCSDIsIDB4MDAwMDAwMTAsIFNSRkxfTk9GRlMsIFNST000X0xFREJIMzIsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fTEVEQkgzLCAweDAwMDAwMDEwLCBTUkZMX05PRkZTLCBTUk9NNF9MRURCSDMyLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX0xFREJIMCwgMHgwMDAwMDBlMCwgU1JGTF9OT0ZGUywgU1JPTTVfTEVEQkgxMCwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9MRURCSDEsIDB4MDAwMDAwZTAsIFNSRkxfTk9GRlMsIFNST001X0xFREJIMTAsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fTEVEQkgyLCAweDAwMDAwMGUwLCBTUkZMX05PRkZTLCBTUk9NNV9MRURCSDMyLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0xFREJIMywgMHgwMDAwMDBlMCwgU1JGTF9OT0ZGUywgU1JPTTVfTEVEQkgzMiwgMHhmZjAwfSwKIAl7QlJDTVNfU1JPTV9MRURCSDAsIDB4ZmZmZmZmMDAsIFNSRkxfTk9GRlMsIFNST004X0xFREJIMTAsIDB4MDBmZn0sCiAJe0JSQ01TX1NST01fTEVEQkgxLCAweGZmZmZmZjAwLCBTUkZMX05PRkZTLCBTUk9NOF9MRURCSDEwLCAweGZmMDB9LAogCXtCUkNNU19TUk9NX0xFREJIMiwgMHhmZmZmZmYwMCwgU1JGTF9OT0ZGUywgU1JPTThfTEVEQkgzMiwgMHgwMGZmfSwKIAl7QlJDTVNfU1JPTV9MRURCSDMsIDB4ZmZmZmZmMDAsIFNSRkxfTk9GRlMsIFNST004X0xFREJIMzIsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fUEEwQjAsIDB4MDAwMDAwMGUsIFNSRkxfUFJIRVgsIFNST01fV0wwUEFCMCwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTBCMSwgMHgwMDAwMDAwZSwgU1JGTF9QUkhFWCwgU1JPTV9XTDBQQUIxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBMEIyLCAweDAwMDAwMDBlLCBTUkZMX1BSSEVYLCBTUk9NX1dMMFBBQjIsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEEwSVRTU0lULCAweDAwMDAwMDBlLCAwLCBTUk9NX0lUVCwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9QQTBNQVhQV1IsIDB4MDAwMDAwMGUsIDAsIFNST01fV0wxME1BWFAsIDB4MDBmZn0sCiAJe0JSQ01TX1NST01fUEEwQjAsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X1cwX1BBQjAsIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fUEEwQjEsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X1cwX1BBQjEsIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fUEEwQjIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X1cwX1BBQjIsIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fUEEwSVRTU0lULCAweGZmZmZmZjAwLCAwLCBTUk9NOF9XMF9JVFRNQVhQLCAweGZmMDB9LAogCXtCUkNNU19TUk9NX1BBME1BWFBXUiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfVzBfSVRUTUFYUCwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9PUE8sIDB4MDAwMDAwMGMsIDAsIFNST01fT1BPLCAweDAwZmZ9LAogCXtCUkNNU19TUk9NX09QTywgMHhmZmZmZmYwMCwgMCwgU1JPTThfMkdfT0ZETVBPLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0FBMkcsIDB4MDAwMDAwMGUsIDAsIFNST01fQUFCUkVWLCBTUk9NX0FBMF9NQVNLfSwKLQl7QlJDTVNfU1JPTV9BQTJHLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9BQSwgMHgwMGZmfSwKIAl7QlJDTVNfU1JPTV9BQTJHLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9BQSwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9BQTVHLCAweDAwMDAwMDBlLCAwLCBTUk9NX0FBQlJFViwgU1JPTV9BQTFfTUFTS30sCi0Je0JSQ01TX1NST01fQUE1RywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfQUEsIDB4ZmYwMH0sCiAJe0JSQ01TX1NST01fQUE1RywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQUEsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fQUcwLCAweDAwMDAwMDBlLCAwLCBTUk9NX0FHMTAsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fQUcxLCAweDAwMDAwMDBlLCAwLCBTUk9NX0FHMTAsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fQUcwLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9BRzEwLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0FHMSwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfQUcxMCwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9BRzIsIDB4MDAwMDAwZjAsIDAsIFNST000X0FHMzIsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fQUczLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9BRzMyLCAweGZmMDB9LAogCXtCUkNNU19TUk9NX0FHMCwgMHhmZmZmZmYwMCwgMCwgU1JPTThfQUcxMCwgMHgwMGZmfSwKIAl7QlJDTVNfU1JPTV9BRzEsIDB4ZmZmZmZmMDAsIDAsIFNST004X0FHMTAsIDB4ZmYwMH0sCiAJe0JSQ01TX1NST01fQUcyLCAweGZmZmZmZjAwLCAwLCBTUk9NOF9BRzMyLCAweDAwZmZ9LAogCXtCUkNNU19TUk9NX0FHMywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQUczMiwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9QQTFCMCwgMHgwMDAwMDAwZSwgU1JGTF9QUkhFWCwgU1JPTV9XTDFQQUIwLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBMUIxLCAweDAwMDAwMDBlLCBTUkZMX1BSSEVYLCBTUk9NX1dMMVBBQjEsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEExQjIsIDB4MDAwMDAwMGUsIFNSRkxfUFJIRVgsIFNST01fV0wxUEFCMiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTFMT0IwLCAweDAwMDAwMDBjLCBTUkZMX1BSSEVYLCBTUk9NX1dMMUxQQUIwLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBMUxPQjEsIDB4MDAwMDAwMGMsIFNSRkxfUFJIRVgsIFNST01fV0wxTFBBQjEsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEExTE9CMiwgMHgwMDAwMDAwYywgU1JGTF9QUkhFWCwgU1JPTV9XTDFMUEFCMiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTFISUIwLCAweDAwMDAwMDBjLCBTUkZMX1BSSEVYLCBTUk9NX1dMMUhQQUIwLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBMUhJQjEsIDB4MDAwMDAwMGMsIFNSRkxfUFJIRVgsIFNST01fV0wxSFBBQjEsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEExSElCMiwgMHgwMDAwMDAwYywgU1JGTF9QUkhFWCwgU1JPTV9XTDFIUEFCMiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTFJVFNTSVQsIDB4MDAwMDAwMGUsIDAsIFNST01fSVRULCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1BBMU1BWFBXUiwgMHgwMDAwMDAwZSwgMCwgU1JPTV9XTDEwTUFYUCwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9QQTFMT01BWFBXUiwgMHgwMDAwMDAwYywgMCwgU1JPTV9XTDFMSE1BWFAsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fUEExSElNQVhQV1IsIDB4MDAwMDAwMGMsIDAsIFNST01fV0wxTEhNQVhQLCAweDAwZmZ9LAogCXtCUkNNU19TUk9NX1BBMUIwLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9XMV9QQUIwLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX1BBMUIxLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9XMV9QQUIxLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX1BBMUIyLCAweGZmZmZmZjAwLCBTUkZMX1BSSEVYLCBTUk9NOF9XMV9QQUIyLCAweGZmZmZ9LApAQCAtNTM0LDQwICszNzcsMjAgQEAKIAl7QlJDTVNfU1JPTV9QQTFNQVhQV1IsIDB4ZmZmZmZmMDAsIDAsIFNST004X1cxX0lUVE1BWFAsIDB4MDBmZn0sCiAJe0JSQ01TX1NST01fUEExTE9NQVhQV1IsIDB4ZmZmZmZmMDAsIDAsIFNST004X1cxX01BWFBfTENIQywgMHhmZjAwfSwKIAl7QlJDTVNfU1JPTV9QQTFISU1BWFBXUiwgMHhmZmZmZmYwMCwgMCwgU1JPTThfVzFfTUFYUF9MQ0hDLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0JYQTJHLCAweDAwMDAwMDA4LCAwLCBTUk9NX0JYQVJTU0kyRywgMHgxODAwfSwKLQl7QlJDTVNfU1JPTV9SU1NJU0FWMkcsIDB4MDAwMDAwMDgsIDAsIFNST01fQlhBUlNTSTJHLCAweDA3MDB9LAotCXtCUkNNU19TUk9NX1JTU0lTTUMyRywgMHgwMDAwMDAwOCwgMCwgU1JPTV9CWEFSU1NJMkcsIDB4MDBmMH0sCi0Je0JSQ01TX1NST01fUlNTSVNNRjJHLCAweDAwMDAwMDA4LCAwLCBTUk9NX0JYQVJTU0kyRywgMHgwMDBmfSwKIAl7QlJDTVNfU1JPTV9CWEEyRywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQlhBUlNTSTJHLCAweDE4MDB9LAogCXtCUkNNU19TUk9NX1JTU0lTQVYyRywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQlhBUlNTSTJHLCAweDA3MDB9LAogCXtCUkNNU19TUk9NX1JTU0lTTUMyRywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQlhBUlNTSTJHLCAweDAwZjB9LAogCXtCUkNNU19TUk9NX1JTU0lTTUYyRywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQlhBUlNTSTJHLCAweDAwMGZ9LAotCXtCUkNNU19TUk9NX0JYQTVHLCAweDAwMDAwMDA4LCAwLCBTUk9NX0JYQVJTU0k1RywgMHgxODAwfSwKLQl7QlJDTVNfU1JPTV9SU1NJU0FWNUcsIDB4MDAwMDAwMDgsIDAsIFNST01fQlhBUlNTSTVHLCAweDA3MDB9LAotCXtCUkNNU19TUk9NX1JTU0lTTUM1RywgMHgwMDAwMDAwOCwgMCwgU1JPTV9CWEFSU1NJNUcsIDB4MDBmMH0sCi0Je0JSQ01TX1NST01fUlNTSVNNRjVHLCAweDAwMDAwMDA4LCAwLCBTUk9NX0JYQVJTU0k1RywgMHgwMDBmfSwKIAl7QlJDTVNfU1JPTV9CWEE1RywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQlhBUlNTSTVHLCAweDE4MDB9LAogCXtCUkNNU19TUk9NX1JTU0lTQVY1RywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQlhBUlNTSTVHLCAweDA3MDB9LAogCXtCUkNNU19TUk9NX1JTU0lTTUM1RywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQlhBUlNTSTVHLCAweDAwZjB9LAogCXtCUkNNU19TUk9NX1JTU0lTTUY1RywgMHhmZmZmZmYwMCwgMCwgU1JPTThfQlhBUlNTSTVHLCAweDAwMGZ9LAotCXtCUkNNU19TUk9NX1RSSTJHLCAweDAwMDAwMDA4LCAwLCBTUk9NX1RSSTUyRywgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9UUkk1RywgMHgwMDAwMDAwOCwgMCwgU1JPTV9UUkk1MkcsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fVFJJNUdMLCAweDAwMDAwMDA4LCAwLCBTUk9NX1RSSTVHSEwsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fVFJJNUdILCAweDAwMDAwMDA4LCAwLCBTUk9NX1RSSTVHSEwsIDB4ZmYwMH0sCiAJe0JSQ01TX1NST01fVFJJMkcsIDB4ZmZmZmZmMDAsIDAsIFNST004X1RSSTUyRywgMHgwMGZmfSwKIAl7QlJDTVNfU1JPTV9UUkk1RywgMHhmZmZmZmYwMCwgMCwgU1JPTThfVFJJNTJHLCAweGZmMDB9LAogCXtCUkNNU19TUk9NX1RSSTVHTCwgMHhmZmZmZmYwMCwgMCwgU1JPTThfVFJJNUdITCwgMHgwMGZmfSwKIAl7QlJDTVNfU1JPTV9UUkk1R0gsIDB4ZmZmZmZmMDAsIDAsIFNST004X1RSSTVHSEwsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fUlhQTzJHLCAweDAwMDAwMDA4LCBTUkZMX1BSU0lHTiwgU1JPTV9SWFBPNTJHLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX1JYUE81RywgMHgwMDAwMDAwOCwgU1JGTF9QUlNJR04sIFNST01fUlhQTzUyRywgMHhmZjAwfSwKIAl7QlJDTVNfU1JPTV9SWFBPMkcsIDB4ZmZmZmZmMDAsIFNSRkxfUFJTSUdOLCBTUk9NOF9SWFBPNTJHLCAweDAwZmZ9LAogCXtCUkNNU19TUk9NX1JYUE81RywgMHhmZmZmZmYwMCwgU1JGTF9QUlNJR04sIFNST004X1JYUE81MkcsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fVFhDSEFJTiwgMHgwMDAwMDBmMCwgU1JGTF9OT0ZGUywgU1JPTTRfVFhSWEMsCi0JIFNST000X1RYQ0hBSU5fTUFTS30sCi0Je0JSQ01TX1NST01fUlhDSEFJTiwgMHgwMDAwMDBmMCwgU1JGTF9OT0ZGUywgU1JPTTRfVFhSWEMsCi0JIFNST000X1JYQ0hBSU5fTUFTS30sCi0Je0JSQ01TX1NST01fQU5UU1dJVENILCAweDAwMDAwMGYwLCBTUkZMX05PRkZTLCBTUk9NNF9UWFJYQywKLQkgU1JPTTRfU1dJVENIX01BU0t9LAogCXtCUkNNU19TUk9NX1RYQ0hBSU4sIDB4ZmZmZmZmMDAsIFNSRkxfTk9GRlMsIFNST004X1RYUlhDLAogCSBTUk9NNF9UWENIQUlOX01BU0t9LAogCXtCUkNNU19TUk9NX1JYQ0hBSU4sIDB4ZmZmZmZmMDAsIFNSRkxfTk9GRlMsIFNST004X1RYUlhDLApAQCAtNTk0LDQzICs0MTcsMTEgQEAKIAkgU1JPTThfRkVNX0FOVFNXTFVUX01BU0t9LAogCXtCUkNNU19TUk9NX1RFTVBUSFJFU0gsIDB4ZmZmZmZmMDAsIDAsIFNST004X1RIRVJNQUwsIDB4ZmYwMH0sCiAJe0JSQ01TX1NST01fVEVNUE9GRlNFVCwgMHhmZmZmZmYwMCwgMCwgU1JPTThfVEhFUk1BTCwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDJHQTAsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElEMkcsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fVFhQSUQyR0ExLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDJHLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1RYUElEMkdBMiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQyRyArIDEsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fVFhQSUQyR0EzLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDJHICsgMSwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDVHQTAsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElENUcsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fVFhQSUQ1R0ExLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1RYUElENUdBMiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQ1RyArIDEsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fVFhQSUQ1R0EzLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHICsgMSwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDVHTEEwLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHTCwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDVHTEExLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHTCwgMHhmZjAwfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDVHTEEyLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHTCArIDEsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fVFhQSUQ1R0xBMywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfVFhQSUQ1R0wgKyAxLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1RYUElENUdIQTAsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElENUdILCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX1RYUElENUdIQTEsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElENUdILCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1RYUElENUdIQTIsIDB4MDAwMDAwZjAsIDAsIFNST000X1RYUElENUdIICsgMSwgMHgwMGZmfSwKLQl7QlJDTVNfU1JPTV9UWFBJRDVHSEEzLCAweDAwMDAwMGYwLCAwLCBTUk9NNF9UWFBJRDVHSCArIDEsIDB4ZmYwMH0sCiAKLQl7QlJDTVNfU1JPTV9DQ09ERSwgMHgwMDAwMDAwZiwgU1JGTF9DQ09ERSwgU1JPTV9DQ09ERSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9DQ09ERSwgMHgwMDAwMDAxMCwgU1JGTF9DQ09ERSwgU1JPTTRfQ0NPREUsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQ0NPREUsIDB4MDAwMDAwZTAsIFNSRkxfQ0NPREUsIFNST001X0NDT0RFLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX0NDT0RFLCAweGZmZmZmZjAwLCBTUkZMX0NDT0RFLCBTUk9NOF9DQ09ERSwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9NQUNBRERSLCAweGZmZmZmZjAwLCBTUkZMX0VUSEFERFIsIFNST004X01BQ0hJLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01BQ0FERFIsIDB4MDAwMDAwZTAsIFNSRkxfRVRIQUREUiwgU1JPTTVfTUFDSEksIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUFDQUREUiwgMHgwMDAwMDAxMCwgU1JGTF9FVEhBRERSLCBTUk9NNF9NQUNISSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQUNBRERSLCAweDAwMDAwMDA4LCBTUkZMX0VUSEFERFIsIFNST00zX01BQ0hJLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0lMME1BQ0FERFIsIDB4MDAwMDAwMDcsIFNSRkxfRVRIQUREUiwgU1JPTV9NQUNISV9JTDAsCi0JIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fRVQxTUFDQUREUiwgMHgwMDAwMDAwNywgU1JGTF9FVEhBRERSLCBTUk9NX01BQ0hJX0VUMSwKLQkgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9MRUREQywgMHhmZmZmZmYwMCwgU1JGTF9OT0ZGUyB8IFNSRkxfTEVEREMsIFNST004X0xFRERDLAogCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0xFRERDLCAweDAwMDAwMGUwLCBTUkZMX05PRkZTIHwgU1JGTF9MRUREQywgU1JPTTVfTEVEREMsCi0JIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTEVEREMsIDB4MDAwMDAwMTAsIFNSRkxfTk9GRlMgfCBTUkZMX0xFRERDLCBTUk9NNF9MRUREQywKLQkgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9MRUREQywgMHgwMDAwMDAwOCwgU1JGTF9OT0ZGUyB8IFNSRkxfTEVEREMsIFNST00zX0xFRERDLAotCSAweGZmZmZ9LAogCXtCUkNNU19TUk9NX1JBV1RFTVBTRU5TRSwgMHhmZmZmZmYwMCwgU1JGTF9QUkhFWCwgU1JPTThfTVBXUl9SQVdUUywKIAkgMHgwMWZmfSwKIAl7QlJDTVNfU1JPTV9NRUFTUE9XRVIsIDB4ZmZmZmZmMDAsIFNSRkxfUFJIRVgsIFNST004X01QV1JfUkFXVFMsCkBAIC02NTAsMTYgKzQ0MSw3IEBACiAJe0JSQ01TX1NST01fUEhZQ0FMX1RFTVBERUxUQSwgMHhmZmZmZmYwMCwgMCwgU1JPTThfUEhZQ0FMX1RFTVBERUxUQSwKIAkgMHgwMGZmfSwKIAotCXtCUkNNU19TUk9NX0NDSzJHUE8sIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX0NDS1BPLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX0NDSzJHUE8sIDB4MDAwMDAxMDAsIDAsIFNST004XzJHX0NDS1BPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX09GRE0yR1BPLCAweDAwMDAwMGYwLCBTUkZMX01PUkUsIFNST000XzJHX09GRE1QTywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NNF8yR19PRkRNUE8gKyAxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX09GRE01R1BPLCAweDAwMDAwMGYwLCBTUkZMX01PUkUsIFNST000XzVHX09GRE1QTywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NNF81R19PRkRNUE8gKyAxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX09GRE01R0xQTywgMHgwMDAwMDBmMCwgU1JGTF9NT1JFLCBTUk9NNF81R0xfT0ZETVBPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0NPTlQsIDAsIDAsIFNST000XzVHTF9PRkRNUE8gKyAxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX09GRE01R0hQTywgMHgwMDAwMDBmMCwgU1JGTF9NT1JFLCBTUk9NNF81R0hfT0ZETVBPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0NPTlQsIDAsIDAsIFNST000XzVHSF9PRkRNUE8gKyAxLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX09GRE0yR1BPLCAweDAwMDAwMTAwLCBTUkZMX01PUkUsIFNST004XzJHX09GRE1QTywgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NOF8yR19PRkRNUE8gKyAxLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX09GRE01R1BPLCAweDAwMDAwMTAwLCBTUkZMX01PUkUsIFNST004XzVHX09GRE1QTywgMHhmZmZmfSwKQEAgLTY2OCwzOCArNDUwLDYgQEAKIAl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NOF81R0xfT0ZETVBPICsgMSwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9PRkRNNUdIUE8sIDB4MDAwMDAxMDAsIFNSRkxfTU9SRSwgU1JPTThfNUdIX09GRE1QTywgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9DT05ULCAwLCAwLCBTUk9NOF81R0hfT0ZETVBPICsgMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1MyR1BPMCwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfMkdfTUNTUE8sIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTMkdQTzEsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX01DU1BPICsgMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1MyR1BPMiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfMkdfTUNTUE8gKyAyLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzJHUE8zLCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19NQ1NQTyArIDMsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTMkdQTzQsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX01DU1BPICsgNCwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1MyR1BPNSwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfMkdfTUNTUE8gKyA1LCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzJHUE82LCAweDAwMDAwMGYwLCAwLCBTUk9NNF8yR19NQ1NQTyArIDYsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTMkdQTzcsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX01DU1BPICsgNywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R1BPMCwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdfTUNTUE8sIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdQTzEsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX01DU1BPICsgMSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R1BPMiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdfTUNTUE8gKyAyLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHUE8zLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19NQ1NQTyArIDMsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdQTzQsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX01DU1BPICsgNCwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R1BPNSwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdfTUNTUE8gKyA1LCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHUE82LCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R19NQ1NQTyArIDYsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdQTzcsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX01DU1BPICsgNywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R0xQTzAsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHTF9NQ1NQTywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R0xQTzEsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHTF9NQ1NQTyArIDEsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdMUE8yLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xfTUNTUE8gKyAyLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHTFBPMywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdMX01DU1BPICsgMywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R0xQTzQsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHTF9NQ1NQTyArIDQsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdMUE81LCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xfTUNTUE8gKyA1LCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHTFBPNiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdMX01DU1BPICsgNiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R0xQTzcsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHTF9NQ1NQTyArIDcsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdIUE8wLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0hfTUNTUE8sIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdIUE8xLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0hfTUNTUE8gKyAxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHSFBPMiwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdIX01DU1BPICsgMiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R0hQTzMsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHSF9NQ1NQTyArIDMsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdIUE80LCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0hfTUNTUE8gKyA0LCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX01DUzVHSFBPNSwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdIX01DU1BPICsgNSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQ1M1R0hQTzYsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHSF9NQ1NQTyArIDYsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fTUNTNUdIUE83LCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0hfTUNTUE8gKyA3LCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX01DUzJHUE8wLCAweDAwMDAwMTAwLCAwLCBTUk9NOF8yR19NQ1NQTywgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9NQ1MyR1BPMSwgMHgwMDAwMDEwMCwgMCwgU1JPTThfMkdfTUNTUE8gKyAxLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX01DUzJHUE8yLCAweDAwMDAwMTAwLCAwLCBTUk9NOF8yR19NQ1NQTyArIDIsIDB4ZmZmZn0sCkBAIC03MzIsMTAgKzQ4Miw2IEBACiAJe0JSQ01TX1NST01fTUNTNUdIUE81LCAweDAwMDAwMTAwLCAwLCBTUk9NOF81R0hfTUNTUE8gKyA1LCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX01DUzVHSFBPNiwgMHgwMDAwMDEwMCwgMCwgU1JPTThfNUdIX01DU1BPICsgNiwgMHhmZmZmfSwKIAl7QlJDTVNfU1JPTV9NQ1M1R0hQTzcsIDB4MDAwMDAxMDAsIDAsIFNST004XzVHSF9NQ1NQTyArIDcsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fQ0REUE8sIDB4MDAwMDAwZjAsIDAsIFNST000X0NERFBPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1NUQkNQTywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfU1RCQ1BPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JXNDBQTywgMHgwMDAwMDBmMCwgMCwgU1JPTTRfQlc0MFBPLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX0JXRFVQUE8sIDB4MDAwMDAwZjAsIDAsIFNST000X0JXRFVQUE8sIDB4ZmZmZn0sCiAJe0JSQ01TX1NST01fQ0REUE8sIDB4MDAwMDAxMDAsIDAsIFNST004X0NERFBPLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX1NUQkNQTywgMHgwMDAwMDEwMCwgMCwgU1JPTThfU1RCQ1BPLCAweGZmZmZ9LAogCXtCUkNNU19TUk9NX0JXNDBQTywgMHgwMDAwMDEwMCwgMCwgU1JPTThfQlc0MFBPLCAweGZmZmZ9LApAQCAtODExLDM0ICs1NTcsNiBAQAogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBicmNtc19zcm9tdmFyIHBlcnBhdGhfcGNpX3Nyb212YXJzW10gPSB7Ci0Je0JSQ01TX1NST01fTUFYUDJHQTAsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX0lUVF9NQVhQLCAweDAwZmZ9LAotCXtCUkNNU19TUk9NX0lUVDJHQTAsIDB4MDAwMDAwZjAsIDAsIFNST000XzJHX0lUVF9NQVhQLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX0lUVDVHQTAsIDB4MDAwMDAwZjAsIDAsIFNST000XzVHX0lUVF9NQVhQLCAweGZmMDB9LAotCXtCUkNNU19TUk9NX1BBMkdXMEEwLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF8yR19QQSwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTJHVzFBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfMkdfUEEgKyAxLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBMkdXMkEwLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF8yR19QQSArIDIsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEEyR1czQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzJHX1BBICsgMywgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9NQVhQNUdBMCwgMHgwMDAwMDBmMCwgMCwgU1JPTTRfNUdfSVRUX01BWFAsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fTUFYUDVHSEEwLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xIX01BWFAsIDB4MDBmZn0sCi0Je0JSQ01TX1NST01fTUFYUDVHTEEwLCAweDAwMDAwMGYwLCAwLCBTUk9NNF81R0xIX01BWFAsIDB4ZmYwMH0sCi0Je0JSQ01TX1NST01fUEE1R1cwQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHX1BBLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBNUdXMUEwLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R19QQSArIDEsIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEE1R1cyQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHX1BBICsgMiwgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTVHVzNBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdfUEEgKyAzLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBNUdMVzBBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdMX1BBLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBNUdMVzFBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdMX1BBICsgMSwKLQkgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTVHTFcyQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHTF9QQSArIDIsCi0JIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEE1R0xXM0EwLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R0xfUEEgKyAzLAotCSAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBNUdIVzBBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdIX1BBLCAweGZmZmZ9LAotCXtCUkNNU19TUk9NX1BBNUdIVzFBMCwgMHgwMDAwMDBmMCwgU1JGTF9QUkhFWCwgU1JPTTRfNUdIX1BBICsgMSwKLQkgMHhmZmZmfSwKLQl7QlJDTVNfU1JPTV9QQTVHSFcyQTAsIDB4MDAwMDAwZjAsIFNSRkxfUFJIRVgsIFNST000XzVHSF9QQSArIDIsCi0JIDB4ZmZmZn0sCi0Je0JSQ01TX1NST01fUEE1R0hXM0EwLCAweDAwMDAwMGYwLCBTUkZMX1BSSEVYLCBTUk9NNF81R0hfUEEgKyAzLAotCSAweGZmZmZ9LAogCXtCUkNNU19TUk9NX01BWFAyR0EwLCAweGZmZmZmZjAwLCAwLCBTUk9NOF8yR19JVFRfTUFYUCwgMHgwMGZmfSwKIAl7QlJDTVNfU1JPTV9JVFQyR0EwLCAweGZmZmZmZjAwLCAwLCBTUk9NOF8yR19JVFRfTUFYUCwgMHhmZjAwfSwKIAl7QlJDTVNfU1JPTV9JVFQ1R0EwLCAweGZmZmZmZjAwLCAwLCBTUk9NOF81R19JVFRfTUFYUCwgMHhmZjAwfSwKQEAgLTg2OCwyNCArNTg2LDYgQEAKICAqIHNoYXJlZCBiZXR3ZWVuIGRldmljZXMuICovCiBzdGF0aWMgdTggYnJjbXNfc3JvbV9jcmM4X3RhYmxlW0NSQzhfVEFCTEVfU0laRV07CiAKLXN0YXRpYyB1MTYgX19pb21lbSAqCi1zcm9tX3dpbmRvd19hZGRyZXNzKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTggX19pb21lbSAqY3VybWFwKQotewotCWlmIChzaWgtPmNjcmV2IDwgMzIpCi0JCXJldHVybiAodTE2IF9faW9tZW0gKikoY3VybWFwICsgUENJX0JBUjBfU1BST01fT0ZGU0VUKTsKLQlpZiAoc2loLT5jY2NhcHMgJiBDQ19DQVBfU1JPTSkKLQkJcmV0dXJuICh1MTYgX19pb21lbSAqKQotCQkgICAgICAgKGN1cm1hcCArIFBDSV8xNktCMF9DQ1JFR1NfT0ZGU0VUICsgQ0NfU1JPTV9PVFApOwotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qIFBhcnNlIFNST00gYW5kIGNyZWF0ZSBuYW1lPXZhbHVlIHBhaXJzLiAnc3JvbScgcG9pbnRzIHRvCi0gKiB0aGUgU1JPTSB3b3JkIGFycmF5LiAnb2ZmJyBzcGVjaWZpZXMgdGhlIG9mZnNldCBvZiB0aGUKLSAqIGZpcnN0IHdvcmQgJ3Nyb20nIHBvaW50cyB0bywgd2hpY2ggc2hvdWxkIGJlIGVpdGhlciAwIG9yCi0gKiBTUk9NM19TV1JHX09GRiAoZnVsbCBTUk9NIG9yIHNvZnR3YXJlIHJlZ2lvbikuCi0gKi8KLQogc3RhdGljIHVpbnQgbWFza19zaGlmdCh1MTYgbWFzaykKIHsKIAl1aW50IGk7CkBAIC05MDYsMTggKzYwNiwxNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbHRvaDE2X2J1Zih1MTYgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCitzdGF0aWMgaW5saW5lIHZvaWQgbGUxNl90b19jcHVfYnVmKHUxNiAqYnVmLCB1aW50IG53b3JkcykKIHsKLQlzaXplIC89IDI7Ci0Jd2hpbGUgKHNpemUtLSkKLQkJKihidWYgKyBzaXplKSA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopKGJ1ZiArIHNpemUpKTsKKwl3aGlsZSAobndvcmRzLS0pCisJCSooYnVmICsgbndvcmRzKSA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopKGJ1ZiArIG53b3JkcykpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaHRvbDE2X2J1Zih1MTYgKmJ1ZiwgdW5zaWduZWQgaW50IHNpemUpCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3RvX2xlMTZfYnVmKHUxNiAqYnVmLCB1aW50IG53b3JkcykKIHsKLQlzaXplIC89IDI7Ci0Jd2hpbGUgKHNpemUtLSkKLQkJKihfX2xlMTYgKikoYnVmICsgc2l6ZSkgPSBjcHVfdG9fbGUxNigqKGJ1ZiArIHNpemUpKTsKKwl3aGlsZSAobndvcmRzLS0pCisJCSooX19sZTE2ICopKGJ1ZiArIG53b3JkcykgPSBjcHVfdG9fbGUxNigqKGJ1ZiArIG53b3JkcykpOwogfQogCiAvKgpAQCAtOTI5LDExICs2MjcsMTQgQEAKIAlzdHJ1Y3QgYnJjbXNfc3JvbV9saXN0X2hlYWQgKmVudHJ5OwogCWVudW0gYnJjbXNfc3JvbV9pZCBpZDsKIAl1MTYgdzsKLQl1MzIgdmFsOworCXUzMiB2YWwgPSAwOwogCWNvbnN0IHN0cnVjdCBicmNtc19zcm9tdmFyICpzcnY7CiAJdWludCB3aWR0aDsKIAl1aW50IGZsYWdzOwogCXUzMiBzciA9ICgxIDw8IHNyb21yZXYpOworCXVpbnQgcDsKKwl1aW50IHBiID0gIFNST004X1BBVEgwOworCWNvbnN0IHVpbnQgcHN6ID0gU1JPTThfUEFUSDEgLSBTUk9NOF9QQVRIMDsKIAogCS8qIGZpcnN0IHN0b3JlIHRoZSBzcm9tIHJldmlzaW9uICovCiAJZW50cnkgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYnJjbXNfc3JvbV9saXN0X2hlYWQpLCBHRlBfS0VSTkVMKTsKQEAgLTEwMzEsNDcgKzczMiwzNCBAQAogCQlsaXN0X2FkZCgmZW50cnktPnZhcl9saXN0LCB2YXJfbGlzdCk7CiAJfQogCi0JaWYgKHNyb21yZXYgPj0gNCkgewotCQkvKiBEbyBwZXItcGF0aCB2YXJpYWJsZXMgKi8KLQkJdWludCBwLCBwYiwgcHN6OworCWZvciAocCA9IDA7IHAgPCBNQVhfUEFUSF9TUk9NOyBwKyspIHsKKwkJZm9yIChzcnYgPSBwZXJwYXRoX3BjaV9zcm9tdmFyczsKKwkJICAgICBzcnYtPnZhcmlkICE9IEJSQ01TX1NST01fTlVMTDsgc3J2KyspIHsKKwkJCWlmICgoc3J2LT5yZXZtYXNrICYgc3IpID09IDApCisJCQkJY29udGludWU7CiAKLQkJaWYgKHNyb21yZXYgPj0gOCkgewotCQkJcGIgPSBTUk9NOF9QQVRIMDsKLQkJCXBzeiA9IFNST004X1BBVEgxIC0gU1JPTThfUEFUSDA7Ci0JCX0gZWxzZSB7Ci0JCQlwYiA9IFNST000X1BBVEgwOwotCQkJcHN6ID0gU1JPTTRfUEFUSDEgLSBTUk9NNF9QQVRIMDsKKwkJCWlmIChzcnYtPmZsYWdzICYgU1JGTF9OT1ZBUikKKwkJCQljb250aW51ZTsKKworCQkJdyA9IHNyb21bcGIgKyBzcnYtPm9mZl07CisJCQl2YWwgPSAodyAmIHNydi0+bWFzaykgPj4gbWFza19zaGlmdChzcnYtPm1hc2spOworCQkJd2lkdGggPSBtYXNrX3dpZHRoKHNydi0+bWFzayk7CisKKwkJCS8qIENoZWF0aW5nOiBubyBwZXItcGF0aCB2YXIgaXMgbW9yZSB0aGFuCisJCQkgKiAxIHdvcmQgKi8KKwkJCWlmICgoc3J2LT5mbGFncyAmIFNSRkxfTk9GRlMpCisJCQkgICAgJiYgKChpbnQpdmFsID09ICgxIDw8IHdpZHRoKSAtIDEpKQorCQkJCWNvbnRpbnVlOworCisJCQllbnRyeSA9CisJCQkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IGJyY21zX3Nyb21fbGlzdF9oZWFkKSwKKwkJCQkgICAgR0ZQX0tFUk5FTCk7CisJCQllbnRyeS0+dmFyaWQgPSBzcnYtPnZhcmlkK3A7CisJCQllbnRyeS0+dmFyX3R5cGUgPSBCUkNNU19TUk9NX1VOVU1CRVI7CisJCQllbnRyeS0+dXZhbCA9IHZhbDsKKwkJCWxpc3RfYWRkKCZlbnRyeS0+dmFyX2xpc3QsIHZhcl9saXN0KTsKIAkJfQotCi0JCWZvciAocCA9IDA7IHAgPCBNQVhfUEFUSF9TUk9NOyBwKyspIHsKLQkJCWZvciAoc3J2ID0gcGVycGF0aF9wY2lfc3JvbXZhcnM7Ci0JCQkgICAgIHNydi0+dmFyaWQgIT0gQlJDTVNfU1JPTV9OVUxMOyBzcnYrKykgewotCQkJCWlmICgoc3J2LT5yZXZtYXNrICYgc3IpID09IDApCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKHNydi0+ZmxhZ3MgJiBTUkZMX05PVkFSKQotCQkJCQljb250aW51ZTsKLQotCQkJCXcgPSBzcm9tW3BiICsgc3J2LT5vZmZdOwotCQkJCXZhbCA9ICh3ICYgc3J2LT5tYXNrKSA+PiBtYXNrX3NoaWZ0KHNydi0+bWFzayk7Ci0JCQkJd2lkdGggPSBtYXNrX3dpZHRoKHNydi0+bWFzayk7Ci0KLQkJCQkvKiBDaGVhdGluZzogbm8gcGVyLXBhdGggdmFyIGlzIG1vcmUgdGhhbgotCQkJCSAqIDEgd29yZCAqLwotCQkJCWlmICgoc3J2LT5mbGFncyAmIFNSRkxfTk9GRlMpCi0JCQkJICAgICYmICgoaW50KXZhbCA9PSAoMSA8PCB3aWR0aCkgLSAxKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQllbnRyeSA9Ci0JCQkJICAgIGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmNtc19zcm9tX2xpc3RfaGVhZCksCi0JCQkJCSAgICBHRlBfS0VSTkVMKTsKLQkJCQllbnRyeS0+dmFyaWQgPSBzcnYtPnZhcmlkK3A7Ci0JCQkJZW50cnktPnZhcl90eXBlID0gQlJDTVNfU1JPTV9VTlVNQkVSOwotCQkJCWVudHJ5LT51dmFsID0gdmFsOwotCQkJCWxpc3RfYWRkKCZlbnRyeS0+dmFyX2xpc3QsIHZhcl9saXN0KTsKLQkJCX0KLQkJCXBiICs9IHBzejsKLQkJfQorCQlwYiArPSBwc3o7CiAJfQogfQogCkBAIC0xMDgwLDQxICs3NjgsNDggQEAKICAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCiAgKi8KIHN0YXRpYyBpbnQKLXNwcm9tX3JlYWRfcGNpKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTE2IF9faW9tZW0gKnNwcm9tLCB1aW50IHdvcmRvZmYsCi0JICAgICAgIHUxNiAqYnVmLCB1aW50IG53b3JkcywgYm9vbCBjaGVja19jcmMpCitzcHJvbV9yZWFkX3BjaShzdHJ1Y3Qgc2lfcHViICpzaWgsIHUxNiAqYnVmLCB1aW50IG53b3JkcywgYm9vbCBjaGVja19jcmMpCiB7CiAJaW50IGVyciA9IDA7CiAJdWludCBpOworCXU4ICpiYnVmID0gKHU4ICopYnVmOyAvKiBieXRlIGJ1ZmZlciAqLworCXVpbnQgbmJ5dGVzID0gbndvcmRzIDw8IDE7CisJc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlOworCXVpbnQgc3Byb21fb2Zmc2V0OwogCi0JLyogcmVhZCB0aGUgc3Byb20gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbndvcmRzOyBpKyspCi0JCWJ1ZltpXSA9IFJfUkVHKCZzcHJvbVt3b3Jkb2ZmICsgaV0pOwotCi0JaWYgKGNoZWNrX2NyYykgewotCi0JCWlmIChidWZbMF0gPT0gMHhmZmZmKQotCQkJLyoKLQkJCSAqIFRoZSBoYXJkd2FyZSB0aGlua3MgdGhhdCBhbiBzcm9tIHRoYXQgc3RhcnRzIHdpdGgKLQkJCSAqIDB4ZmZmZiBpcyBibGFuaywgcmVnYXJkbGVzcyBvZiB0aGUgcmVzdCBvZiB0aGUKLQkJCSAqIGNvbnRlbnQsIHNvIGRlY2xhcmUgaXQgYmFkLgotCQkJICovCi0JCQlyZXR1cm4gLUVOT0RBVEE7Ci0KLQkJLyogZml4dXAgdGhlIGVuZGlhbm5lc3Mgc28gY3JjOCB3aWxsIHBhc3MgKi8KLQkJaHRvbDE2X2J1ZihidWYsIG53b3JkcyAqIDIpOwotCQlpZiAoY3JjOChicmNtc19zcm9tX2NyYzhfdGFibGUsICh1OCAqKSBidWYsIG53b3JkcyAqIDIsCi0JCQkgQ1JDOF9JTklUX1ZBTFVFKSAhPQotCQkJIENSQzhfR09PRF9WQUxVRShicmNtc19zcm9tX2NyYzhfdGFibGUpKQotCQkJLyogREJHIG9ubHkgcGNpIGFsd2F5cyByZWFkIHNyb200IGZpcnN0LCB0aGVuIHNyb204LzkgKi8KLQkJCWVyciA9IC1FSU87Ci0KLQkJLyogbm93IGNvcnJlY3QgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGJ5dGUgYXJyYXkgKi8KLQkJbHRvaDE2X2J1ZihidWYsIG53b3JkcyAqIDIpOworCS8qIGRldGVybWluZSBjb3JlIHRvIHJlYWQgKi8KKwlpZiAoYWlfZ2V0X2NjcmV2KHNpaCkgPCAzMikgeworCQljb3JlID0gYWlfZmluZGNvcmUoc2loLCBCQ01BX0NPUkVfODAyMTEsIDApOworCQlzcHJvbV9vZmZzZXQgPSBQQ0lfQkFSMF9TUFJPTV9PRkZTRVQ7CisJfSBlbHNlIHsKKwkJY29yZSA9IGFpX2ZpbmRjb3JlKHNpaCwgQkNNQV9DT1JFX0NISVBDT01NT04sIDApOworCQlzcHJvbV9vZmZzZXQgPSBDSElQQ1JFR09GRlMoc3JvbW90cCk7CiAJfQorCisJLyogcmVhZCB0aGUgc3Byb20gaW4gYnl0ZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspCisJCWJidWZbaV0gPSBiY21hX3JlYWQ4KGNvcmUsIHNwcm9tX29mZnNldCtpKTsKKworCWlmIChidWZbMF0gPT0gMHhmZmZmKQorCQkvKgorCQkgKiBUaGUgaGFyZHdhcmUgdGhpbmtzIHRoYXQgYW4gc3JvbSB0aGF0IHN0YXJ0cyB3aXRoCisJCSAqIDB4ZmZmZiBpcyBibGFuaywgcmVnYXJkbGVzcyBvZiB0aGUgcmVzdCBvZiB0aGUKKwkJICogY29udGVudCwgc28gZGVjbGFyZSBpdCBiYWQuCisJCSAqLworCQlyZXR1cm4gLUVOT0RBVEE7CisKKwlpZiAoY2hlY2tfY3JjICYmCisJICAgIGNyYzgoYnJjbXNfc3JvbV9jcmM4X3RhYmxlLCBiYnVmLCBuYnl0ZXMsIENSQzhfSU5JVF9WQUxVRSkgIT0KKwkJIENSQzhfR09PRF9WQUxVRShicmNtc19zcm9tX2NyYzhfdGFibGUpKQorCQllcnIgPSAtRUlPOworCWVsc2UKKwkJLyogbm93IGNvcnJlY3QgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGJ5dGUgYXJyYXkgKi8KKwkJbGUxNl90b19jcHVfYnVmKGJ1ZiwgbndvcmRzKTsKKwogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgb3RwX3JlYWRfcGNpKHN0cnVjdCBzaV9wdWIgKnNpaCwgdTE2ICpidWYsIHVpbnQgYnVmc3opCitzdGF0aWMgaW50IG90cF9yZWFkX3BjaShzdHJ1Y3Qgc2lfcHViICpzaWgsIHUxNiAqYnVmLCB1aW50IG53b3JkcykKIHsKIAl1OCAqb3RwOwogCXVpbnQgc3ogPSBPVFBfU1pfTUFYIC8gMjsJLyogc2l6ZSBpbiB3b3JkcyAqLwpAQCAtMTEyNiw3ICs4MjEsOCBAQAogCiAJZXJyID0gb3RwX3JlYWRfcmVnaW9uKHNpaCwgT1RQX0hXX1JHTiwgKHUxNiAqKSBvdHAsICZzeik7CiAKLQltZW1jcHkoYnVmLCBvdHAsIGJ1ZnN6KTsKKwlzeiA9IG1pbl90KHVpbnQsIHN6LCBud29yZHMpOworCW1lbWNweShidWYsIG90cCwgc3ogKiAyKTsKIAogCWtmcmVlKG90cCk7CiAKQEAgLTExMzksMTMgKzgzNSwxMyBAQAogCQlyZXR1cm4gLUVOT0RBVEE7CiAKIAkvKiBmaXh1cCB0aGUgZW5kaWFubmVzcyBzbyBjcmM4IHdpbGwgcGFzcyAqLwotCWh0b2wxNl9idWYoYnVmLCBidWZzeik7Ci0JaWYgKGNyYzgoYnJjbXNfc3JvbV9jcmM4X3RhYmxlLCAodTggKikgYnVmLCBTUk9NNF9XT1JEUyAqIDIsCisJY3B1X3RvX2xlMTZfYnVmKGJ1Ziwgc3opOworCWlmIChjcmM4KGJyY21zX3Nyb21fY3JjOF90YWJsZSwgKHU4ICopIGJ1Ziwgc3ogKiAyLAogCQkgQ1JDOF9JTklUX1ZBTFVFKSAhPSBDUkM4X0dPT0RfVkFMVUUoYnJjbXNfc3JvbV9jcmM4X3RhYmxlKSkKIAkJZXJyID0gLUVJTzsKLQotCS8qIG5vdyBjb3JyZWN0IHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBieXRlIGFycmF5ICovCi0JbHRvaDE2X2J1ZihidWYsIGJ1ZnN6KTsKKwllbHNlCisJCS8qIG5vdyBjb3JyZWN0IHRoZSBlbmRpYW5uZXNzIG9mIHRoZSBieXRlIGFycmF5ICovCisJCWxlMTZfdG9fY3B1X2J1ZihidWYsIHN6KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0xMTU0LDEwICs4NTAsOSBAQAogICogSW5pdGlhbGl6ZSBub252b2xhdGlsZSB2YXJpYWJsZSB0YWJsZSBmcm9tIHNwcm9tLgogICogUmV0dXJuIDAgb24gc3VjY2Vzcywgbm9uemVybyBvbiBlcnJvci4KICAqLwotc3RhdGljIGludCBpbml0dmFyc19zcm9tX3BjaShzdHJ1Y3Qgc2lfcHViICpzaWgsIHZvaWQgX19pb21lbSAqY3VybWFwKQoraW50IHNyb21fdmFyX2luaXQoc3RydWN0IHNpX3B1YiAqc2loKQogewogCXUxNiAqc3JvbTsKLQl1MTYgX19pb21lbSAqc3JvbXdpbmRvdzsKIAl1OCBzcm9tcmV2ID0gMDsKIAl1MzIgc3I7CiAJaW50IGVyciA9IDA7CkBAIC0xMTY5LDMzICs4NjQsMTcgQEAKIAlpZiAoIXNyb20pCiAJCXJldHVybiAtRU5PTUVNOwogCi0Jc3JvbXdpbmRvdyA9IHNyb21fd2luZG93X2FkZHJlc3Moc2loLCBjdXJtYXApOwotCiAJY3JjOF9wb3B1bGF0ZV9sc2IoYnJjbXNfc3JvbV9jcmM4X3RhYmxlLCBTUk9NX0NSQzhfUE9MWSk7CiAJaWYgKGFpX2lzX3Nwcm9tX2F2YWlsYWJsZShzaWgpKSB7Ci0JCWVyciA9IHNwcm9tX3JlYWRfcGNpKHNpaCwgc3JvbXdpbmRvdywgMCwgc3JvbSwgU1JPTV9XT1JEUywKLQkJCQkgICAgIHRydWUpOworCQllcnIgPSBzcHJvbV9yZWFkX3BjaShzaWgsIHNyb20sIFNST000X1dPUkRTLCB0cnVlKTsKIAotCQlpZiAoKHNyb21bU1JPTTRfU0lHTl0gPT0gU1JPTTRfU0lHTkFUVVJFKSB8fAotCQkgICAgKCgoc2loLT5idXNjb3JldHlwZSA9PSBQQ0lFX0NPUkVfSUQpCi0JCSAgICAgICYmIChzaWgtPmJ1c2NvcmVyZXYgPj0gNikpCi0JCSAgICAgfHwgKChzaWgtPmJ1c2NvcmV0eXBlID09IFBDSV9DT1JFX0lEKQotCQkJICYmIChzaWgtPmJ1c2NvcmVyZXYgPj0gMHhlKSkpKSB7Ci0JCQkvKiBzcm9tcmV2ID49IDQsIHJlYWQgbW9yZSAqLwotCQkJZXJyID0gc3Byb21fcmVhZF9wY2koc2loLCBzcm9td2luZG93LCAwLCBzcm9tLAotCQkJCQkgICAgIFNST000X1dPUkRTLCB0cnVlKTsKLQkJCXNyb21yZXYgPSBzcm9tW1NST000X0NSQ1JFVl0gJiAweGZmOwotCQl9IGVsc2UgaWYgKGVyciA9PSAwKSB7Ci0JCQkvKiBzcm9tIGlzIGdvb2QgYW5kIGlzIHJldiA8IDQgKi8KKwkJaWYgKGVyciA9PSAwKQorCQkJLyogc3JvbSByZWFkIGFuZCBwYXNzZWQgY3JjICovCiAJCQkvKiB0b3Agd29yZCBvZiBzcHJvbSBjb250YWlucyB2ZXJzaW9uIGFuZCBjcmM4ICovCi0JCQlzcm9tcmV2ID0gc3JvbVtTUk9NX0NSQ1JFVl0gJiAweGZmOwotCQkJLyogYmNtNDQwMSBzcm9tcyBtaXNwcm9ncmFtbWVkICovCi0JCQlpZiAoc3JvbXJldiA9PSAweDEwKQotCQkJCXNyb21yZXYgPSAxOwotCQl9CisJCQlzcm9tcmV2ID0gc3JvbVtTUk9NNF9DUkNSRVZdICYgMHhmZjsKIAl9IGVsc2UgewogCQkvKiBVc2UgT1RQIGlmIFNQUk9NIG5vdCBhdmFpbGFibGUgKi8KLQkJZXJyID0gb3RwX3JlYWRfcGNpKHNpaCwgc3JvbSwgU1JPTV9NQVgpOworCQllcnIgPSBvdHBfcmVhZF9wY2koc2loLCBzcm9tLCBTUk9NNF9XT1JEUyk7CiAJCWlmIChlcnIgPT0gMCkKIAkJCS8qIE9UUCBvbmx5IGNvbnRhaW4gU1JPTSByZXY4L3JldjkgZm9yIG5vdyAqLwogCQkJc3JvbXJldiA9IHNyb21bU1JPTTRfQ1JDUkVWXSAmIDB4ZmY7CkBAIC0xMjA4LDEwICs4ODcsOSBAQAogCQlzciA9IDEgPDwgc3JvbXJldjsKIAogCQkvKgotCQkgKiBzcm9tIHZlcnNpb24gY2hlY2s6IEN1cnJlbnQgdmFsaWQgdmVyc2lvbnM6IDEsIDIsIDMsIDQsIDUsIDgsCi0JCSAqIDkKKwkJICogc3JvbSB2ZXJzaW9uIGNoZWNrOiBDdXJyZW50IHZhbGlkIHZlcnNpb25zOiA4LCA5CiAJCSAqLwotCQlpZiAoKHNyICYgMHgzM2UpID09IDApIHsKKwkJaWYgKChzciAmIDB4MzAwKSA9PSAwKSB7CiAJCQllcnIgPSAtRUlOVkFMOwogCQkJZ290byBlcnJvdXQ7CiAJCX0KQEAgLTEyMzgsMjEgKzkxNiw2IEBACiAJCWtmcmVlKGVudHJ5KTsKIAl9CiB9Ci0vKgotICogSW5pdGlhbGl6ZSBsb2NhbCB2YXJzIGZyb20gdGhlIHJpZ2h0IHNvdXJjZSBmb3IgdGhpcyBwbGF0Zm9ybS4KLSAqIFJldHVybiAwIG9uIHN1Y2Nlc3MsIG5vbnplcm8gb24gZXJyb3IuCi0gKi8KLWludCBzcm9tX3Zhcl9pbml0KHN0cnVjdCBzaV9wdWIgKnNpaCwgdm9pZCBfX2lvbWVtICpjdXJtYXApCi17Ci0JdWludCBsZW47Ci0KLQlsZW4gPSAwOwotCi0JaWYgKGN1cm1hcCAhPSBOVUxMKQotCQlyZXR1cm4gaW5pdHZhcnNfc3JvbV9wY2koc2loLCBjdXJtYXApOwotCi0JcmV0dXJuIC1FSU5WQUw7Ci19CiAKIC8qCiAgKiBTZWFyY2ggdGhlIG5hbWU9dmFsdWUgdmFycyBmb3IgYSBzcGVjaWZpYyBvbmUgYW5kIHJldHVybiBpdHMgdmFsdWUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3Nyb20uaAppbmRleCA3MDhjNDNmLi5mMmE1OGYyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXNtYWMvc3JvbS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy9zcm9tLmgKQEAgLTIwLDE1ICsyMCwxMCBAQAogI2luY2x1ZGUgInR5cGVzLmgiCiAKIC8qIFByb3RvdHlwZXMgKi8KLWV4dGVybiBpbnQgc3JvbV92YXJfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgsIHZvaWQgX19pb21lbSAqY3VybWFwKTsKK2V4dGVybiBpbnQgc3JvbV92YXJfaW5pdChzdHJ1Y3Qgc2lfcHViICpzaWgpOwogZXh0ZXJuIHZvaWQgc3JvbV9mcmVlX3ZhcnMoc3RydWN0IHNpX3B1YiAqc2loKTsKIAogZXh0ZXJuIGludCBzcm9tX3JlYWQoc3RydWN0IHNpX3B1YiAqc2loLCB1aW50IGJ1cywgdm9pZCAqY3VybWFwLAogCQkgICAgIHVpbnQgYnl0ZW9mZiwgdWludCBuYnl0ZXMsIHUxNiAqYnVmLCBib29sIGNoZWNrX2NyYyk7CiAKLS8qIHBhcnNlIHN0YW5kYXJkIFBDTUNJQSBjaXMsIG5vcm1hbGx5IHVzZWQgYnkgU0IvUENNQ0lBL1NESU8vU1BJL09UUAotICogICBhbmQgZXh0cmFjdCBmcm9tIGl0IGludG8gbmFtZT12YWx1ZSBwYWlycwotICovCi1leHRlcm4gaW50IHNyb21fcGFyc2VjaXModTggKipwY2lzLCB1aW50IGNpc2NudCwKLQkJCSBjaGFyICoqdmFycywgdWludCAqY291bnQpOwogI2VuZGlmCQkJCS8qIF9CUkNNX1NST01fSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9icmNtc21hYy90eXBlcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3R5cGVzLmgKaW5kZXggMjdhODE0Yi4uZTExYWU4MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3R5cGVzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY21zbWFjL3R5cGVzLmgKQEAgLTI1MCw2NiArMjUwLDE4IEBACiAJCXdpcGh5X2VycihkZXYsICIlczogIiBmbXQsIF9fZnVuY19fLCAjI2FyZ3MpOwlcCiB9IHdoaWxlICgwKQogCi0vKgotICogUmVnaXN0ZXIgYWNjZXNzIG1hY3Jvcy4KLSAqCi0gKiBUaGVzZSBtYWNybydzIHRha2UgYSBwb2ludGVyIHRvIHRoZSBhZGRyZXNzIHRvIHJlYWQgYXMgb25lIG9mIHRoZWlyCi0gKiBhcmd1bWVudHMuIFRoZSBtYWNybyBpdHNlbGYgZGVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgSU8gdHJhbnNhY3Rpb24gKHU4LCB1MTYKLSAqIG9yIHUzMikuIEFkdmFudGFnZSBvZiB0aGlzIGFwcHJvYWNoIGluIGNvbWJpbmF0aW9uIHdpdGggdXNpbmcgYSBzdHJ1Y3QgdG8KLSAqIGRlZmluZSB0aGUgcmVnaXN0ZXJzIGluIGEgcmVnaXN0ZXIgYmxvY2ssIGlzIHRoYXQgYWNjZXNzIHNpemUgYW5kIGFjY2VzcwotICogbG9jYXRpb24gYXJlIGRlZmluZWQgaW4gb25seSBvbmUgc3BvdC4gVGhpcyByZWR1Y2VzIHRoZSByaXNrIG9mIHRoZQotICogcHJvZ3JhbW1lciB0cnlpbmcgdG8gdXNlIGFuIHVuc3VwcG9ydGVkIHRyYW5zYWN0aW9uIHNpemUgb24gYSByZWdpc3Rlci4KLSAqCi0gKi8KLQotI2RlZmluZSBSX1JFRyhyKSBcCi0JKHsgXAotCQlfX3R5cGVvZigqKHIpKSBfX29zbF92OyBcCi0JCXN3aXRjaCAoc2l6ZW9mKCoocikpKSB7IFwKLQkJY2FzZSBzaXplb2YodTgpOiBcCi0JCQlfX29zbF92ID0gcmVhZGIoKHU4IF9faW9tZW0gKikocikpOyBcCi0JCQlicmVhazsgXAotCQljYXNlIHNpemVvZih1MTYpOiBcCi0JCQlfX29zbF92ID0gcmVhZHcoKHUxNiBfX2lvbWVtICopKHIpKTsgXAotCQkJYnJlYWs7IFwKLQkJY2FzZSBzaXplb2YodTMyKTogXAotCQkJX19vc2xfdiA9IHJlYWRsKCh1MzIgX19pb21lbSAqKShyKSk7IFwKLQkJCWJyZWFrOyBcCi0JCX0gXAotCQlfX29zbF92OyBcCi0JfSkKLQotI2RlZmluZSBXX1JFRyhyLCB2KSBkbyB7IFwKLQkJc3dpdGNoIChzaXplb2YoKihyKSkpIHsgXAotCQljYXNlIHNpemVvZih1OCk6CVwKLQkJCXdyaXRlYigodTgpKCh2KSAmIDB4RkYpLCAodTggX19pb21lbSAqKShyKSk7IFwKLQkJCWJyZWFrOyBcCi0JCWNhc2Ugc2l6ZW9mKHUxNik6CVwKLQkJCXdyaXRldygodTE2KSgodikgJiAweEZGRkYpLCAodTE2IF9faW9tZW0gKikocikpOyBcCi0JCQlicmVhazsgXAotCQljYXNlIHNpemVvZih1MzIpOglcCi0JCQl3cml0ZWwoKHUzMikodiksICh1MzIgX19pb21lbSAqKShyKSk7IFwKLQkJCWJyZWFrOyBcCi0JCX0gXAotCX0gd2hpbGUgKDApCi0KICNpZmRlZiBDT05GSUdfQkNNNDdYWAogLyoKICAqIGJjbTQ3MTYgKHdoaWNoIGluY2x1ZGVzIDQ3MTcgJiA0NzE4KSwgcGx1cyA0NzA2IG9uIFBDSWUgY2FuIHJlb3JkZXIKICAqIHRyYW5zYWN0aW9ucy4gQXMgYSBmaXgsIGEgcmVhZCBhZnRlciB3cml0ZSBpcyBwZXJmb3JtZWQgb24gY2VydGFpbiBwbGFjZXMKICAqIGluIHRoZSBjb2RlLiBPbGRlciBjaGlwcyBhbmQgdGhlIG5ld2VyIDUzNTcgZmFtaWx5IGRvbid0IHJlcXVpcmUgdGhpcyBmaXguCiAgKi8KLSNkZWZpbmUgV19SRUdfRkxVU0gociwgdikJKHsgV19SRUcoKHIpLCAodikpOyAodm9pZClSX1JFRyhyKTsgfSkKKyNkZWZpbmUgYmNtYV93Zmx1c2gxNihjLCBvLCB2KSBcCisJKHsgYmNtYV93cml0ZTE2KGMsIG8sIHYpOyAodm9pZCliY21hX3JlYWQxNihjLCBvKTsgfSkKICNlbHNlCi0jZGVmaW5lIFdfUkVHX0ZMVVNIKHIsIHYpCVdfUkVHKChyKSwgKHYpKQorI2RlZmluZSBiY21hX3dmbHVzaDE2KGMsIG8sIHYpCWJjbWFfd3JpdGUxNihjLCBvLCB2KQogI2VuZGlmCQkJCS8qIENPTkZJR19CQ000N1hYICovCiAKLSNkZWZpbmUgQU5EX1JFRyhyLCB2KQlXX1JFRygociksIFJfUkVHKHIpICYgKHYpKQotI2RlZmluZSBPUl9SRUcociwgdikJV19SRUcoKHIpLCBSX1JFRyhyKSB8ICh2KSkKLQotI2RlZmluZSBTRVRfUkVHKHIsIG1hc2ssIHZhbCkgXAotCQlXX1JFRygociksICgoUl9SRUcocikgJiB+KG1hc2spKSB8ICh2YWwpKSkKLQogLyogbXVsdGktYm9vbCBkYXRhIHR5cGU6IHNldCBvZiBib29scywgbWJvb2wgaXMgdHJ1ZSBpZiBhbnkgaXMgc2V0ICovCiAKIC8qIHNldCBvbmUgYm9vbCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2JyY211dGlsL3V0aWxzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXV0aWwvdXRpbHMuYwppbmRleCBmMjdjNDg5Li5iNzUzN2Y3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXV0aWwvdXRpbHMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvYnJjbXV0aWwvdXRpbHMuYwpAQCAtMTYsNiArMTYsNyBAQAogCiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKICNpbmNsdWRlIDxicmNtdV91dGlscy5oPgogCiBNT0RVTEVfQVVUSE9SKCJCcm9hZGNvbSBDb3Jwb3JhdGlvbiIpOwpAQCAtNDAsNzQgKzQxLDIwIEBACiAvKiBGcmVlIHRoZSBkcml2ZXIgcGFja2V0LiBGcmVlIHRoZSB0YWcgaWYgcHJlc2VudCAqLwogdm9pZCBicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKm5za2I7Ci0JaW50IG5lc3QgPSAwOwotCi0JLyogcGVydmVyc2lvbjogd2UgdXNlIHNrYi0+bmV4dCB0byBjaGFpbiBtdWx0aS1za2IgcGFja2V0cyAqLwotCXdoaWxlIChza2IpIHsKLQkJbnNrYiA9IHNrYi0+bmV4dDsKLQkJc2tiLT5uZXh0ID0gTlVMTDsKLQotCQlpZiAoc2tiLT5kZXN0cnVjdG9yKQotCQkJLyogY2Fubm90IGtmcmVlX3NrYigpIG9uIGhhcmQgSVJRIChuZXQvY29yZS9za2J1ZmYuYykgaWYKLQkJCSAqIGRlc3RydWN0b3IgZXhpc3RzCi0JCQkgKi8KLQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JCWVsc2UKLQkJCS8qIGNhbiBmcmVlIGltbWVkaWF0ZWx5IChldmVuIGluX2lycSgpKSBpZiBkZXN0cnVjdG9yCi0JCQkgKiBkb2VzIG5vdCBleGlzdAotCQkJICovCi0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7Ci0KLQkJbmVzdCsrOwotCQlza2IgPSBuc2tiOwotCX0KKwlXQVJOX09OKHNrYi0+bmV4dCk7CisJaWYgKHNrYi0+ZGVzdHJ1Y3RvcikKKwkJLyogY2Fubm90IGtmcmVlX3NrYigpIG9uIGhhcmQgSVJRIChuZXQvY29yZS9za2J1ZmYuYykgaWYKKwkJICogZGVzdHJ1Y3RvciBleGlzdHMKKwkJICovCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisJZWxzZQorCQkvKiBjYW4gZnJlZSBpbW1lZGlhdGVseSAoZXZlbiBpbl9pcnEoKSkgaWYgZGVzdHJ1Y3RvcgorCQkgKiBkb2VzIG5vdCBleGlzdAorCQkgKi8KKwkJZGV2X2tmcmVlX3NrYihza2IpOwogfQogRVhQT1JUX1NZTUJPTChicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKTsKIAotCi0vKiBjb3B5IGEgYnVmZmVyIGludG8gYSBwa3QgYnVmZmVyIGNoYWluICovCi11aW50IGJyY211X3BrdGZyb21idWYoc3RydWN0IHNrX2J1ZmYgKnAsIHVpbnQgb2Zmc2V0LCBpbnQgbGVuLAotCQl1bnNpZ25lZCBjaGFyICpidWYpCi17Ci0JdWludCBuLCByZXQgPSAwOwotCi0JLyogc2tpcCAnb2Zmc2V0JyBieXRlcyAqLwotCWZvciAoOyBwICYmIG9mZnNldDsgcCA9IHAtPm5leHQpIHsKLQkJaWYgKG9mZnNldCA8ICh1aW50KSAocC0+bGVuKSkKLQkJCWJyZWFrOwotCQlvZmZzZXQgLT0gcC0+bGVuOwotCX0KLQotCWlmICghcCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBjb3B5IHRoZSBkYXRhICovCi0JZm9yICg7IHAgJiYgbGVuOyBwID0gcC0+bmV4dCkgewotCQluID0gbWluKCh1aW50KSAocC0+bGVuKSAtIG9mZnNldCwgKHVpbnQpIGxlbik7Ci0JCW1lbWNweShwLT5kYXRhICsgb2Zmc2V0LCBidWYsIG4pOwotCQlidWYgKz0gbjsKLQkJbGVuIC09IG47Ci0JCXJldCArPSBuOwotCQlvZmZzZXQgPSAwOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X3BrdGZyb21idWYpOwotCi0vKiByZXR1cm4gdG90YWwgbGVuZ3RoIG9mIGJ1ZmZlciBjaGFpbiAqLwotdWludCBicmNtdV9wa3R0b3RsZW4oc3RydWN0IHNrX2J1ZmYgKnApCi17Ci0JdWludCB0b3RhbDsKLQotCXRvdGFsID0gMDsKLQlmb3IgKDsgcDsgcCA9IHAtPm5leHQpCi0JCXRvdGFsICs9IHAtPmxlbjsKLQlyZXR1cm4gdG90YWw7Ci19Ci1FWFBPUlRfU1lNQk9MKGJyY211X3BrdHRvdGxlbik7Ci0KIC8qCiAgKiBvc2wgbXVsdGlwbGUtcHJlY2VkZW5jZSBwYWNrZXQgcXVldWUKICAqIGhpX3ByZWMgaXMgYWx3YXlzID49IHRoZSBudW1iZXIgb2YgdGhlIGhpZ2hlc3Qgbm9uLWVtcHR5IHByZWNlZGVuY2UKQEAgLTExNSwyMSArNjIsMTMgQEAKIHN0cnVjdCBza19idWZmICpicmNtdV9wa3RxX3BlbnEoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywKIAkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqcCkKIHsKLQlzdHJ1Y3QgcGt0cV9wcmVjICpxOworCXN0cnVjdCBza19idWZmX2hlYWQgKnE7CiAKIAlpZiAocGt0cV9mdWxsKHBxKSB8fCBwa3RxX3BmdWxsKHBxLCBwcmVjKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlxID0gJnBxLT5xW3ByZWNdOwotCi0JaWYgKHEtPmhlYWQpCi0JCXEtPnRhaWwtPnByZXYgPSBwOwotCWVsc2UKLQkJcS0+aGVhZCA9IHA7Ci0KLQlxLT50YWlsID0gcDsKLQlxLT5sZW4rKzsKLQorCXEgPSAmcHEtPnFbcHJlY10uc2tibGlzdDsKKwlza2JfcXVldWVfdGFpbChxLCBwKTsKIAlwcS0+bGVuKys7CiAKIAlpZiAocHEtPmhpX3ByZWMgPCBwcmVjKQpAQCAtMTQyLDIwICs4MSwxMyBAQAogc3RydWN0IHNrX2J1ZmYgKmJyY211X3BrdHFfcGVucV9oZWFkKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMsCiAJCQkJCSAgIHN0cnVjdCBza19idWZmICpwKQogewotCXN0cnVjdCBwa3RxX3ByZWMgKnE7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcTsKIAogCWlmIChwa3RxX2Z1bGwocHEpIHx8IHBrdHFfcGZ1bGwocHEsIHByZWMpKQogCQlyZXR1cm4gTlVMTDsKIAotCXEgPSAmcHEtPnFbcHJlY107Ci0KLQlpZiAocS0+aGVhZCA9PSBOVUxMKQotCQlxLT50YWlsID0gcDsKLQotCXAtPnByZXYgPSBxLT5oZWFkOwotCXEtPmhlYWQgPSBwOwotCXEtPmxlbisrOwotCisJcSA9ICZwcS0+cVtwcmVjXS5za2JsaXN0OworCXNrYl9xdWV1ZV9oZWFkKHEsIHApOwogCXBxLT5sZW4rKzsKIAogCWlmIChwcS0+aGlfcHJlYyA8IHByZWMpCkBAIC0xNjcsNTMgKzk5LDMwIEBACiAKIHN0cnVjdCBza19idWZmICpicmNtdV9wa3RxX3BkZXEoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKIHsKLQlzdHJ1Y3QgcGt0cV9wcmVjICpxOworCXN0cnVjdCBza19idWZmX2hlYWQgKnE7CiAJc3RydWN0IHNrX2J1ZmYgKnA7CiAKLQlxID0gJnBxLT5xW3ByZWNdOwotCi0JcCA9IHEtPmhlYWQ7CisJcSA9ICZwcS0+cVtwcmVjXS5za2JsaXN0OworCXAgPSBza2JfZGVxdWV1ZShxKTsKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCXEtPmhlYWQgPSBwLT5wcmV2OwotCWlmIChxLT5oZWFkID09IE5VTEwpCi0JCXEtPnRhaWwgPSBOVUxMOwotCi0JcS0+bGVuLS07Ci0KIAlwcS0+bGVuLS07Ci0KLQlwLT5wcmV2ID0gTlVMTDsKLQogCXJldHVybiBwOwogfQogRVhQT1JUX1NZTUJPTChicmNtdV9wa3RxX3BkZXEpOwogCiBzdHJ1Y3Qgc2tfYnVmZiAqYnJjbXVfcGt0cV9wZGVxX3RhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKIHsKLQlzdHJ1Y3QgcGt0cV9wcmVjICpxOwotCXN0cnVjdCBza19idWZmICpwLCAqcHJldjsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpxOworCXN0cnVjdCBza19idWZmICpwOwogCi0JcSA9ICZwcS0+cVtwcmVjXTsKLQotCXAgPSBxLT5oZWFkOworCXEgPSAmcHEtPnFbcHJlY10uc2tibGlzdDsKKwlwID0gc2tiX2RlcXVldWVfdGFpbChxKTsKIAlpZiAocCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKIAotCWZvciAocHJldiA9IE5VTEw7IHAgIT0gcS0+dGFpbDsgcCA9IHAtPnByZXYpCi0JCXByZXYgPSBwOwotCi0JaWYgKHByZXYpCi0JCXByZXYtPnByZXYgPSBOVUxMOwotCWVsc2UKLQkJcS0+aGVhZCA9IE5VTEw7Ci0KLQlxLT50YWlsID0gcHJldjsKLQlxLT5sZW4tLTsKLQogCXBxLT5sZW4tLTsKLQogCXJldHVybiBwOwogfQogRVhQT1JUX1NZTUJPTChicmNtdV9wa3RxX3BkZXFfdGFpbCk7CkBAIC0yMjIsMzEgKzEzMSwxNyBAQAogYnJjbXVfcGt0cV9wZmx1c2goc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywgYm9vbCBkaXIsCiAJCSAgYm9vbCAoKmZuKShzdHJ1Y3Qgc2tfYnVmZiAqLCB2b2lkICopLCB2b2lkICphcmcpCiB7Ci0Jc3RydWN0IHBrdHFfcHJlYyAqcTsKLQlzdHJ1Y3Qgc2tfYnVmZiAqcCwgKnByZXYgPSBOVUxMOworCXN0cnVjdCBza19idWZmX2hlYWQgKnE7CisJc3RydWN0IHNrX2J1ZmYgKnAsICpuZXh0OwogCi0JcSA9ICZwcS0+cVtwcmVjXTsKLQlwID0gcS0+aGVhZDsKLQl3aGlsZSAocCkgeworCXEgPSAmcHEtPnFbcHJlY10uc2tibGlzdDsKKwlza2JfcXVldWVfd2Fsa19zYWZlKHEsIHAsIG5leHQpIHsKIAkJaWYgKGZuID09IE5VTEwgfHwgKCpmbikgKHAsIGFyZykpIHsKLQkJCWJvb2wgaGVhZCA9IChwID09IHEtPmhlYWQpOwotCQkJaWYgKGhlYWQpCi0JCQkJcS0+aGVhZCA9IHAtPnByZXY7Ci0JCQllbHNlCi0JCQkJcHJldi0+cHJldiA9IHAtPnByZXY7Ci0JCQlwLT5wcmV2ID0gTlVMTDsKKwkJCXNrYl91bmxpbmsocCwgcSk7CiAJCQlicmNtdV9wa3RfYnVmX2ZyZWVfc2tiKHApOwotCQkJcS0+bGVuLS07CiAJCQlwcS0+bGVuLS07Ci0JCQlwID0gKGhlYWQgPyBxLT5oZWFkIDogcHJldi0+cHJldik7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2ID0gcDsKLQkJCXAgPSBwLT5wcmV2OwogCQl9CiAJfQotCi0JaWYgKHEtPmhlYWQgPT0gTlVMTCkKLQkJcS0+dGFpbCA9IE5VTEw7CiB9CiBFWFBPUlRfU1lNQk9MKGJyY211X3BrdHFfcGZsdXNoKTsKIApAQCAtMjcxLDggKzE2NiwxMCBAQAogCiAJcHEtPm1heCA9ICh1MTYpIG1heF9sZW47CiAKLQlmb3IgKHByZWMgPSAwOyBwcmVjIDwgbnVtX3ByZWM7IHByZWMrKykKKwlmb3IgKHByZWMgPSAwOyBwcmVjIDwgbnVtX3ByZWM7IHByZWMrKykgewogCQlwcS0+cVtwcmVjXS5tYXggPSBwcS0+bWF4OworCQlza2JfcXVldWVfaGVhZF9pbml0KCZwcS0+cVtwcmVjXS5za2JsaXN0KTsKKwl9CiB9CiBFWFBPUlRfU1lNQk9MKGJyY211X3BrdHFfaW5pdCk7CiAKQEAgLTI4NCwxMyArMTgxLDEzIEBACiAJCXJldHVybiBOVUxMOwogCiAJZm9yIChwcmVjID0gMDsgcHJlYyA8IHBxLT5oaV9wcmVjOyBwcmVjKyspCi0JCWlmIChwcS0+cVtwcmVjXS5oZWFkKQorCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eSgmcHEtPnFbcHJlY10uc2tibGlzdCkpCiAJCQlicmVhazsKIAogCWlmIChwcmVjX291dCkKIAkJKnByZWNfb3V0ID0gcHJlYzsKIAotCXJldHVybiBwcS0+cVtwcmVjXS50YWlsOworCXJldHVybiBza2JfcGVla190YWlsKCZwcS0+cVtwcmVjXS5za2JsaXN0KTsKIH0KIEVYUE9SVF9TWU1CT0woYnJjbXVfcGt0cV9wZWVrX3RhaWwpOwogCkBAIC0zMDMsNyArMjAwLDcgQEAKIAogCWZvciAocHJlYyA9IDA7IHByZWMgPD0gcHEtPmhpX3ByZWM7IHByZWMrKykKIAkJaWYgKHByZWNfYm1wICYgKDEgPDwgcHJlYykpCi0JCQlsZW4gKz0gcHEtPnFbcHJlY10ubGVuOworCQkJbGVuICs9IHBxLT5xW3ByZWNdLnNrYmxpc3QucWxlbjsKIAogCXJldHVybiBsZW47CiB9CkBAIC0zMTMsMzkgKzIxMCwzMiBAQAogc3RydWN0IHNrX2J1ZmYgKmJyY211X3BrdHFfbWRlcShzdHJ1Y3QgcGt0cSAqcHEsIHVpbnQgcHJlY19ibXAsCiAJCQkJICAgICAgaW50ICpwcmVjX291dCkKIHsKLQlzdHJ1Y3QgcGt0cV9wcmVjICpxOworCXN0cnVjdCBza19idWZmX2hlYWQgKnE7CiAJc3RydWN0IHNrX2J1ZmYgKnA7CiAJaW50IHByZWM7CiAKIAlpZiAocHEtPmxlbiA9PSAwKQogCQlyZXR1cm4gTlVMTDsKIAotCXdoaWxlICgocHJlYyA9IHBxLT5oaV9wcmVjKSA+IDAgJiYgcHEtPnFbcHJlY10uaGVhZCA9PSBOVUxMKQorCXdoaWxlICgocHJlYyA9IHBxLT5oaV9wcmVjKSA+IDAgJiYKKwkgICAgICAgc2tiX3F1ZXVlX2VtcHR5KCZwcS0+cVtwcmVjXS5za2JsaXN0KSkKIAkJcHEtPmhpX3ByZWMtLTsKIAotCXdoaWxlICgocHJlY19ibXAgJiAoMSA8PCBwcmVjKSkgPT0gMCB8fCBwcS0+cVtwcmVjXS5oZWFkID09IE5VTEwpCisJd2hpbGUgKChwcmVjX2JtcCAmICgxIDw8IHByZWMpKSA9PSAwIHx8CisJICAgICAgIHNrYl9xdWV1ZV9lbXB0eSgmcHEtPnFbcHJlY10uc2tibGlzdCkpCiAJCWlmIChwcmVjLS0gPT0gMCkKIAkJCXJldHVybiBOVUxMOwogCi0JcSA9ICZwcS0+cVtwcmVjXTsKLQotCXAgPSBxLT5oZWFkOworCXEgPSAmcHEtPnFbcHJlY10uc2tibGlzdDsKKwlwID0gc2tiX2RlcXVldWUocSk7CiAJaWYgKHAgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlxLT5oZWFkID0gcC0+cHJldjsKLQlpZiAocS0+aGVhZCA9PSBOVUxMKQotCQlxLT50YWlsID0gTlVMTDsKLQotCXEtPmxlbi0tOworCXBxLT5sZW4tLTsKIAogCWlmIChwcmVjX291dCkKIAkJKnByZWNfb3V0ID0gcHJlYzsKIAotCXBxLT5sZW4tLTsKLQotCXAtPnByZXYgPSBOVUxMOwotCiAJcmV0dXJuIHA7CiB9CiBFWFBPUlRfU1lNQk9MKGJyY211X3BrdHFfbWRlcSk7CkBAIC0zNjQsMjMgKzI1NCwzIEBACiB9CiBFWFBPUlRfU1lNQk9MKGJyY211X3BycGt0KTsKICNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCRykgKi8KLQotI2lmIGRlZmluZWQoQkNNREJHKQotLyoKLSAqIHByaW50IGJ5dGVzIGZvcm1hdHRlZCBhcyBoZXggdG8gYSBzdHJpbmcuIHJldHVybiB0aGUgcmVzdWx0aW5nCi0gKiBzdHJpbmcgbGVuZ3RoCi0gKi8KLWludCBicmNtdV9mb3JtYXRfaGV4KGNoYXIgKnN0ciwgY29uc3Qgdm9pZCAqYnl0ZXMsIGludCBsZW4pCi17Ci0JaW50IGk7Ci0JY2hhciAqcCA9IHN0cjsKLQljb25zdCB1OCAqc3JjID0gKGNvbnN0IHU4ICopYnl0ZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJcCArPSBzbnByaW50ZihwLCAzLCAiJTAyWCIsICpzcmMpOwotCQlzcmMrKzsKLQl9Ci0JcmV0dXJuIChpbnQpKHAgLSBzdHIpOwotfQotRVhQT1JUX1NZTUJPTChicmNtdV9mb3JtYXRfaGV4KTsKLSNlbmRpZgkJCQkvKiBkZWZpbmVkKEJDTURCRykgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2JyY211X3V0aWxzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9icmNtdV91dGlscy5oCmluZGV4IDdkMGY0NmUuLmFkMjQ5YTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2JyY211X3V0aWxzLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvYnJjbXVfdXRpbHMuaApAQCAtNjUsOSArNjUsNyBAQAogI2RlZmluZSBFVEhFUl9BRERSX1NUUl9MRU4JMTgKIAogc3RydWN0IHBrdHFfcHJlYyB7Ci0Jc3RydWN0IHNrX2J1ZmYgKmhlYWQ7CS8qIGZpcnN0IHBhY2tldCB0byBkZXF1ZXVlICovCi0Jc3RydWN0IHNrX2J1ZmYgKnRhaWw7CS8qIGxhc3QgcGFja2V0IHRvIGRlcXVldWUgKi8KLQl1MTYgbGVuOwkJLyogbnVtYmVyIG9mIHF1ZXVlZCBwYWNrZXRzICovCisJc3RydWN0IHNrX2J1ZmZfaGVhZCBza2JsaXN0OwogCXUxNiBtYXg7CQkvKiBtYXhpbXVtIG51bWJlciBvZiBxdWV1ZWQgcGFja2V0cyAqLwogfTsKIApAQCAtODgsMzIgKzg2LDMyIEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHBrdHFfcGxlbihzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKQogewotCXJldHVybiBwcS0+cVtwcmVjXS5sZW47CisJcmV0dXJuIHBxLT5xW3ByZWNdLnNrYmxpc3QucWxlbjsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcGt0cV9wYXZhaWwoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYykKIHsKLQlyZXR1cm4gcHEtPnFbcHJlY10ubWF4IC0gcHEtPnFbcHJlY10ubGVuOworCXJldHVybiBwcS0+cVtwcmVjXS5tYXggLSBwcS0+cVtwcmVjXS5za2JsaXN0LnFsZW47CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBwa3RxX3BmdWxsKHN0cnVjdCBwa3RxICpwcSwgaW50IHByZWMpCiB7Ci0JcmV0dXJuIHBxLT5xW3ByZWNdLmxlbiA+PSBwcS0+cVtwcmVjXS5tYXg7CisJcmV0dXJuIHBxLT5xW3ByZWNdLnNrYmxpc3QucWxlbiA+PSBwcS0+cVtwcmVjXS5tYXg7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBwa3RxX3BlbXB0eShzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKQogewotCXJldHVybiBwcS0+cVtwcmVjXS5sZW4gPT0gMDsKKwlyZXR1cm4gc2tiX3F1ZXVlX2VtcHR5KCZwcS0+cVtwcmVjXS5za2JsaXN0KTsKIH0KIAogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqcGt0cV9wcGVlayhzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKQogewotCXJldHVybiBwcS0+cVtwcmVjXS5oZWFkOworCXJldHVybiBza2JfcGVlaygmcHEtPnFbcHJlY10uc2tibGlzdCk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKnBrdHFfcHBlZWtfdGFpbChzdHJ1Y3QgcGt0cSAqcHEsIGludCBwcmVjKQogewotCXJldHVybiBwcS0+cVtwcmVjXS50YWlsOworCXJldHVybiBza2JfcGVla190YWlsKCZwcS0+cVtwcmVjXS5za2JsaXN0KTsKIH0KIAogZXh0ZXJuIHN0cnVjdCBza19idWZmICpicmNtdV9wa3RxX3BlbnEoc3RydWN0IHBrdHEgKnBxLCBpbnQgcHJlYywKQEAgLTE3MiwyNCArMTcwLDE2IEBACiAJCWJvb2wgKCpmbikoc3RydWN0IHNrX2J1ZmYgKiwgdm9pZCAqKSwgdm9pZCAqYXJnKTsKIAogLyogZXh0ZXJucyAqLwotLyogcGFja2V0ICovCi1leHRlcm4gdWludCBicmNtdV9wa3Rmcm9tYnVmKHN0cnVjdCBza19idWZmICpwLAotCXVpbnQgb2Zmc2V0LCBpbnQgbGVuLCB1bnNpZ25lZCBjaGFyICpidWYpOwotZXh0ZXJuIHVpbnQgYnJjbXVfcGt0dG90bGVuKHN0cnVjdCBza19idWZmICpwKTsKLQogLyogaXAgYWRkcmVzcyAqLwogc3RydWN0IGlwdjRfYWRkcjsKIAorCisvKiBleHRlcm5zICovCisvKiBmb3JtYXQvcHJpbnQgKi8KICNpZmRlZiBCQ01EQkcKIGV4dGVybiB2b2lkIGJyY211X3BycGt0KGNvbnN0IGNoYXIgKm1zZywgc3RydWN0IHNrX2J1ZmYgKnAwKTsKICNlbHNlCiAjZGVmaW5lIGJyY211X3BycGt0KGEsIGIpCiAjZW5kaWYJCQkJLyogQkNNREJHICovCiAKLS8qIGV4dGVybnMgKi8KLS8qIGZvcm1hdC9wcmludCAqLwotI2lmIGRlZmluZWQoQkNNREJHKQotZXh0ZXJuIGludCBicmNtdV9mb3JtYXRfaGV4KGNoYXIgKnN0ciwgY29uc3Qgdm9pZCAqYnl0ZXMsIGludCBsZW4pOwotI2VuZGlmCi0KICNlbmRpZgkJCQkvKiBfQlJDTVVfVVRJTFNfSF8gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2NoaXBjb21tb24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2NoaXBjb21tb24uaAppbmRleCBmZWZhYmMzLi5mOTY4MzRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9jaGlwY29tbW9uLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvY2hpcGNvbW1vbi5oCkBAIC0xOSw2ICsxOSw4IEBACiAKICNpbmNsdWRlICJkZWZzLmgiCQkvKiBmb3IgUEFEIG1hY3JvICovCiAKKyNkZWZpbmUgQ0hJUENSRUdPRkZTKGZpZWxkKQlvZmZzZXRvZihzdHJ1Y3QgY2hpcGNyZWdzLCBmaWVsZCkKKwogc3RydWN0IGNoaXBjcmVncyB7CiAJdTMyIGNoaXBpZDsJCS8qIDB4MCAqLwogCXUzMiBjYXBhYmlsaXRpZXM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9kZWZzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9icmNtODAyMTEvaW5jbHVkZS9kZWZzLmgKaW5kZXggMWU1ZjMxMC4uZjBkOGMwNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvZGVmcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL2RlZnMuaApAQCAtNjIsNyArNjIsNiBAQAogCiAjZGVmaW5lIFdMX1JBRElPX1NXX0RJU0FCTEUJCSgxPDwwKQogI2RlZmluZSBXTF9SQURJT19IV19ESVNBQkxFCQkoMTw8MSkKLSNkZWZpbmUgV0xfUkFESU9fTVBDX0RJU0FCTEUJCSgxPDwyKQogLyogc29tZSBjb3VudHJpZXMgZG9uJ3Qgc3VwcG9ydCBhbnkgY2hhbm5lbCAqLwogI2RlZmluZSBXTF9SQURJT19DT1VOVFJZX0RJU0FCTEUJKDE8PDMpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2JyY204MDIxMS9pbmNsdWRlL3NvYy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvc29jLmgKaW5kZXggNGZjYjk1Ni4uNGU5YjdlNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvc29jLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvYnJjbTgwMjExL2luY2x1ZGUvc29jLmgKQEAgLTc3LDggKzc3LDkgQEAKICNkZWZpbmUJRE1FTVNfQ09SRV9JRAkJMHg4MzUJLyogU0RSL0REUjEgbWVtb3J5IGNvbnRyb2xsZXIgY29yZSAqLwogI2RlZmluZQlERUZfU0hJTV9DT01QCQkweDgzNwkvKiBTSElNIGNvbXBvbmVudCBpbiB1YnVzLzYzNjIgKi8KICNkZWZpbmUgT09CX1JPVVRFUl9DT1JFX0lECTB4MzY3CS8qIE9PQiByb3V0ZXIgY29yZSBJRCAqLwotLyogRGVmYXVsdCBjb21wb25lbnQsIGluIGFpIGNoaXBzIGl0IG1hcHMgYWxsIHVudXNlZCBhZGRyZXNzIHJhbmdlcyAqLwotI2RlZmluZQlERUZfQUlfQ09NUAkJMHhmZmYKKyNkZWZpbmUJREVGX0FJX0NPTVAJCTB4ZmZmCS8qIERlZmF1bHQgY29tcG9uZW50LCBpbiBhaSBjaGlwcyBpdAorCQkJCQkgKiBtYXBzIGFsbCB1bnVzZWQgYWRkcmVzcyByYW5nZXMKKwkJCQkJICovCiAKIC8qIENvbW1vbiBjb3JlIGNvbnRyb2wgZmxhZ3MgKi8KICNkZWZpbmUJU0lDRl9CSVNUX0VOCQkweDgwMDAKQEAgLTg3LDQgKzg4LDExIEBACiAjZGVmaW5lCVNJQ0ZfRkdDCQkweDAwMDIKICNkZWZpbmUJU0lDRl9DTE9DS19FTgkJMHgwMDAxCiAKKy8qIENvbW1vbiBjb3JlIHN0YXR1cyBmbGFncyAqLworI2RlZmluZQlTSVNGX0JJU1RfRE9ORQkJMHg4MDAwCisjZGVmaW5lCVNJU0ZfQklTVF9FUlJPUgkJMHg0MDAwCisjZGVmaW5lCVNJU0ZfR0FURURfQ0xLCQkweDIwMDAKKyNkZWZpbmUJU0lTRl9ETUE2NAkJMHgxMDAwCisjZGVmaW5lCVNJU0ZfQ09SRV9CSVRTCQkweDBmZmYKKwogI2VuZGlmCQkJCS8qIF9CUkNNX1NPQ19IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2NzLmMKaW5kZXggNTQ0MWFkMS4uODllOWQzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9jcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfY3MuYwpAQCAtNjU2LDYgKzY1Niw5IEBACiAJCSJBZGR0cm9uIiwgIkFXUC0xMDAgV2lyZWxlc3MgUENNQ0lBIiwgIlZlcnNpb24gMDEuMDIiLAogCQkweGU2ZWM1MmNlLCAweDA4NjQ5YWYyLCAweDRiNzRiYWEwKSwKIAlQQ01DSUFfREVWSUNFX1BST0RfSUQxMjMoCisJCSJDYW5vbiIsICJXaXJlbGVzcyBMQU4gQ0YgQ2FyZCBLMzAyMjUiLCAiVmVyc2lvbiAwMS4wMCIsCisJCTB4OTZlZjZmZTIsIDB4MjYzZmNiYWIsIDB4YTU3YWRiOGMpLAorCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKIAkJIkQiLCAiTGluayBEV0wtNjUwIDExTWJwcyBXTEFOIENhcmQiLCAiVmVyc2lvbiAwMS4wMiIsCiAJCTB4NzFiMTg1ODksIDB4YjZmMWIwYWIsIDB4NGI3NGJhYTApLAogCVBDTUNJQV9ERVZJQ0VfUFJPRF9JRDEyMygKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW9jdGwuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2hvc3RhcC9ob3N0YXBfaW9jdGwuYwppbmRleCAwNDVhOTM2Li4xODA1NGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ob3N0YXAvaG9zdGFwX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaG9zdGFwL2hvc3RhcF9pb2N0bC5jCkBAIC0zODcyLDggKzM4NzIsOCBAQAogCWlmYWNlID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAlsb2NhbCA9IGlmYWNlLT5sb2NhbDsKIAotCXN0cm5jcHkoaW5mby0+ZHJpdmVyLCAiaG9zdGFwIiwgc2l6ZW9mKGluZm8tPmRyaXZlcikgLSAxKTsKLQlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbikgLSAxLAorCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCAiaG9zdGFwIiwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIHNpemVvZihpbmZvLT5md192ZXJzaW9uKSwKIAkJICIlZC4lZC4lZCIsIChsb2NhbC0+c3RhX2Z3X3ZlciA+PiAxNikgJiAweGZmLAogCQkgKGxvY2FsLT5zdGFfZndfdmVyID4+IDgpICYgMHhmZiwKIAkJIGxvY2FsLT5zdGFfZndfdmVyICYgMHhmZik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIxMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jCmluZGV4IDEyN2U5YzYuLmEwZTVjMjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvaXB3MjEwMC5jCkBAIC01OTgxLDggKzU5ODEsOCBAQAogCXN0cnVjdCBpcHcyMTAwX3ByaXYgKnByaXYgPSBsaWJpcHdfcHJpdihkZXYpOwogCWNoYXIgZndfdmVyWzY0XSwgdWNvZGVfdmVyWzY0XTsKIAotCXN0cmNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04pOworCXN0cmxjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgRFJWX1ZFUlNJT04sIHNpemVvZihpbmZvLT52ZXJzaW9uKSk7CiAKIAlpcHcyMTAwX2dldF9md3ZlcnNpb24ocHJpdiwgZndfdmVyLCBzaXplb2YoZndfdmVyKSk7CiAJaXB3MjEwMF9nZXRfdWNvZGV2ZXJzaW9uKHByaXYsIHVjb2RlX3Zlciwgc2l6ZW9mKHVjb2RlX3ZlcikpOwpAQCAtNTk5MCw3ICs1OTkwLDggQEAKIAlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksICIlczolZDolcyIsCiAJCSBmd192ZXIsIHByaXYtPmVlcHJvbV92ZXJzaW9uLCB1Y29kZV92ZXIpOwogCi0Jc3RyY3B5KGluZm8tPmJ1c19pbmZvLCBwY2lfbmFtZShwcml2LT5wY2lfZGV2KSk7CisJc3RybGNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocHJpdi0+cGNpX2RldiksCisJCXNpemVvZihpbmZvLT5idXNfaW5mbykpOwogfQogCiBzdGF0aWMgdTMyIGlwdzIxMDBfZXRodG9vbF9nZXRfbGluayhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9pcHcyMjAwLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuYwppbmRleCA5OWE3MTBkLi4wMThhOGRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2lwdzIyMDAuYwpAQCAtMTMxLDYgKzEzMSwxNCBAQAogI2RlZmluZSBpcHcyMjAwX2JnX3JhdGVzCShpcHcyMjAwX3JhdGVzICsgMCkKICNkZWZpbmUgaXB3MjIwMF9udW1fYmdfcmF0ZXMJMTIKIAorLyogVWdseSBtYWNybyB0byBjb252ZXJ0IGxpdGVyYWwgY2hhbm5lbCBudW1iZXJzIGludG8gdGhlaXIgbWh6IGVxdWl2YWxlbnRzCisgKiBUaGVyZSBhcmUgY2VydGlhbmx5IHNvbWUgY29uZGl0aW9ucyB0aGF0IHdpbGwgYnJlYWsgdGhpcyAobGlrZSBmZWVkaW5nIGl0ICczMCcpCisgKiBidXQgdGhleSBzaG91bGRuJ3QgYXJpc2Ugc2luY2Ugbm90aGluZyB0YWxrcyBvbiBjaGFubmVsIDMwLiAqLworI2RlZmluZSBpZWVlODAyMTFjaGFuMm1oeih4KSBcCisJKCgoeCkgPD0gMTQpID8gXAorCSgoKHgpID09IDE0KSA/IDI0ODQgOiAoKHgpICogNSkgKyAyNDA3KSA6IFwKKwkoKHgpICsgMTAwMCkgKiA1KQorCiAjaWZkZWYgQ09ORklHX0lQVzIyMDBfUU9TCiBzdGF0aWMgaW50IHFvc19lbmFibGUgPSAwOwogc3RhdGljIGludCBxb3NfYnVyc3RfZW5hYmxlID0gMDsKQEAgLTEwNTQwLDggKzEwNTQ4LDggQEAKIAljaGFyIGRhdGVbMzJdOwogCXUzMiBsZW47CiAKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCBEUlZfTkFNRSk7Ci0Jc3RyY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUsIHNpemVvZihpbmZvLT5kcml2ZXIpKTsKKwlzdHJsY3B5KGluZm8tPnZlcnNpb24sIERSVl9WRVJTSU9OLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwogCiAJbGVuID0gc2l6ZW9mKHZlcnMpOwogCWlwd19nZXRfb3JkaW5hbChwLCBJUFdfT1JEX1NUQVRfRldfVkVSU0lPTiwgdmVycywgJmxlbik7CkBAIC0xMDU1MCw3ICsxMDU1OCw4IEBACiAKIAlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksICIlcyAoJXMpIiwKIAkJIHZlcnMsIGRhdGUpOwotCXN0cmNweShpbmZvLT5idXNfaW5mbywgcGNpX25hbWUocC0+cGNpX2RldikpOworCXN0cmxjcHkoaW5mby0+YnVzX2luZm8sIHBjaV9uYW1lKHAtPnBjaV9kZXYpLAorCQlzaXplb2YoaW5mby0+YnVzX2luZm8pKTsKIAlpbmZvLT5lZWR1bXBfbGVuID0gSVBXX0VFUFJPTV9JTUFHRV9TSVpFOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwdy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHcuaAppbmRleCA3MGY1NTg2Li44ODc0NTg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwdy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3LmgKQEAgLTY2LDE2ICs2Niw4IEBACiBkbyB7IGlmIChsaWJpcHdfZGVidWdfbGV2ZWwgJiAobGV2ZWwpKSBcCiAgIHByaW50ayhLRVJOX0RFQlVHICJsaWJpcHc6ICVjICVzICIgZm10LCBcCiAgICAgICAgICBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18gLCAjIyBhcmdzKTsgfSB3aGlsZSAoMCkKLXN0YXRpYyBpbmxpbmUgYm9vbCBsaWJpcHdfcmF0ZWxpbWl0X2RlYnVnKHUzMiBsZXZlbCkKLXsKLQlyZXR1cm4gKGxpYmlwd19kZWJ1Z19sZXZlbCAmIGxldmVsKSAmJiBuZXRfcmF0ZWxpbWl0KCk7Ci19CiAjZWxzZQogI2RlZmluZSBMSUJJUFdfREVCVUcobGV2ZWwsIGZtdCwgYXJncy4uLikgZG8ge30gd2hpbGUgKDApCi1zdGF0aWMgaW5saW5lIGJvb2wgbGliaXB3X3JhdGVsaW1pdF9kZWJ1Zyh1MzIgbGV2ZWwpCi17Ci0JcmV0dXJuIGZhbHNlOwotfQogI2VuZGlmCQkJCS8qIENPTkZJR19MSUJJUFdfREVCVUcgKi8KIAogLyoKQEAgLTgxMyw5ICs4MDUsNiBAQAogCS8qIFdFUCBhbmQgb3RoZXIgZW5jcnlwdGlvbiByZWxhdGVkIHNldHRpbmdzIGF0IHRoZSBkZXZpY2UgbGV2ZWwgKi8KIAlpbnQgb3Blbl93ZXA7CQkvKiBTZXQgdG8gMSB0byBhbGxvdyB1bmVuY3J5cHRlZCBmcmFtZXMgKi8KIAotCWludCByZXNldF9vbl9rZXljaGFuZ2U7CS8qIFNldCB0byAxIGlmIHRoZSBIVyBuZWVkcyB0byBiZSByZXNldCBvbgotCQkJCSAqIFdFUCBrZXkgY2hhbmdlcyAqLwotCiAJLyogSWYgdGhlIGhvc3QgcGVyZm9ybXMge2VuLGRlfWNyeXB0aW9uLCB0aGVuIHNldCB0byAxICovCiAJaW50IGhvc3RfZW5jcnlwdDsKIAlpbnQgaG9zdF9lbmNyeXB0X21zZHU7CkBAIC04NjgsNyArODU3LDYgQEAKIAkJCSAgICAgIHN0cnVjdCBsaWJpcHdfc2VjdXJpdHkgKiBzZWMpOwogCW5ldGRldl90eF90ICgqaGFyZF9zdGFydF94bWl0KSAoc3RydWN0IGxpYmlwd190eGIgKiB0eGIsCiAJCQkJCXN0cnVjdCBuZXRfZGV2aWNlICogZGV2LCBpbnQgcHJpKTsKLQlpbnQgKCpyZXNldF9wb3J0KSAoc3RydWN0IG5ldF9kZXZpY2UgKiBkZXYpOwogCWludCAoKmlzX3F1ZXVlX2Z1bGwpIChzdHJ1Y3QgbmV0X2RldmljZSAqIGRldiwgaW50IHByaSk7CiAKIAlpbnQgKCpoYW5kbGVfbWFuYWdlbWVudCkgKHN0cnVjdCBuZXRfZGV2aWNlICogZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHdfd3guYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2lwdzJ4MDAvbGliaXB3X3d4LmMKaW5kZXggNjYyM2U1MC4uMTU3MTUwNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXB3MngwMC9saWJpcHdfd3guYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pcHcyeDAwL2xpYmlwd193eC5jCkBAIC00NzQsMTcgKzQ3NCw2IEBACiAJaWYgKGllZWUtPnNldF9zZWN1cml0eSkKIAkJaWVlZS0+c2V0X3NlY3VyaXR5KGRldiwgJnNlYyk7CiAKLQkvKiBEbyBub3QgcmVzZXQgcG9ydCBpZiBjYXJkIGlzIGluIE1hbmFnZWQgbW9kZSBzaW5jZSByZXNldHRpbmcgd2lsbAotCSAqIGdlbmVyYXRlIG5ldyBJRUVFIDgwMi4xMSBhdXRoZW50aWNhdGlvbiB3aGljaCBtYXkgZW5kIHVwIGluIGxvb3BpbmcKLQkgKiB3aXRoIElFRUUgODAyLjFYLiAgSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAotCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgotCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4gKi8KLQlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCi0JICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgotCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgewotCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IHJlc2V0X3BvcnQgZmFpbGVkXG4iLCBkZXYtPm5hbWUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTY4OCwyMCArNjc3LDYgQEAKIAlpZiAoaWVlZS0+c2V0X3NlY3VyaXR5KQogCQlpZWVlLT5zZXRfc2VjdXJpdHkoaWVlZS0+ZGV2LCAmc2VjKTsKIAotCS8qCi0JICogRG8gbm90IHJlc2V0IHBvcnQgaWYgY2FyZCBpcyBpbiBNYW5hZ2VkIG1vZGUgc2luY2UgcmVzZXR0aW5nIHdpbGwKLQkgKiBnZW5lcmF0ZSBuZXcgSUVFRSA4MDIuMTEgYXV0aGVudGljYXRpb24gd2hpY2ggbWF5IGVuZCB1cCBpbiBsb29waW5nCi0JICogd2l0aCBJRUVFIDgwMi4xWC4gSWYgeW91ciBoYXJkd2FyZSByZXF1aXJlcyBhIHJlc2V0IGFmdGVyIFdFUAotCSAqIGNvbmZpZ3VyYXRpb24gKGZvciBleGFtcGxlLi4uIFByaXNtMiksIGltcGxlbWVudCB0aGUgcmVzZXRfcG9ydCBpbgotCSAqIHRoZSBjYWxsYmFja3Mgc3RydWN0dXJlcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIDgwMi4xMSBzdGFjay4KLQkgKi8KLQlpZiAoaWVlZS0+cmVzZXRfb25fa2V5Y2hhbmdlICYmCi0JICAgIGllZWUtPml3X21vZGUgIT0gSVdfTU9ERV9JTkZSQSAmJgotCSAgICBpZWVlLT5yZXNldF9wb3J0ICYmIGllZWUtPnJlc2V0X3BvcnQoZGV2KSkgewotCQlMSUJJUFdfREVCVUdfV1goIiVzOiByZXNldF9wb3J0IGZhaWxlZFxuIiwgZGV2LT5uYW1lKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJcmV0dXJuIHJldDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS1kZWJ1Zy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS1kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMWExOWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LWRlYnVnLmMKQEAgLTAsMCArMSw1MDUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICIzOTQ1LmgiCisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zdGF0c19mbGFnKHN0cnVjdCBpbF9wcml2ICppbCwgY2hhciAqYnVmLCBpbnQgYnVmc3opCit7CisJaW50IHAgPSAwOworCisJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiU3RhdGlzdGljcyBGbGFnKDB4JVgpOlxuIiwKKwkJICAgICAgIGxlMzJfdG9fY3B1KGlsLT5fMzk0NS5zdGF0cy5mbGFnKSk7CisJaWYgKGxlMzJfdG9fY3B1KGlsLT5fMzk0NS5zdGF0cy5mbGFnKSAmIFVDT0RFX1NUQVRTX0NMRUFSX01TSykKKwkJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLAorCQkJICAgICAgICJcdFN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOworCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0T3BlcmF0aW9uYWwgRnJlcXVlbmN5OiAlc1xuIiwKKwkJICAgICAgIChsZTMyX3RvX2NwdShpbC0+XzM5NDUuc3RhdHMuZmxhZykgJgorCQkJVUNPREVfU1RBVFNfRlJFUVVFTkNZX01TSykgPyAiMi40IEdIeiIgOiAiNS4yIEdIeiIpOworCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0VEdqIE5hcnJvdyBCYW5kOiAlc1xuIiwKKwkJICAgICAgIChsZTMyX3RvX2NwdShpbC0+XzM5NDUuc3RhdHMuZmxhZykgJgorCQkJVUNPREVfU1RBVFNfTkFSUk9XX0JBTkRfTVNLKSA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCXJldHVybiBwOworfQorCitzc2l6ZV90CitpbDM5NDVfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmc3ogPQorCSAgICBzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRzX3J4X3BoeSkgKiA0MCArCisJICAgIHNpemVvZihzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfbm9uX3BoeSkgKiA0MCArIDQwMDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfcGh5ICpvZmRtLCAqYWNjdW1fb2ZkbSwgKmRlbHRhX29mZG0sICptYXhfb2ZkbTsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfcGh5ICpjY2ssICphY2N1bV9jY2ssICpkZWx0YV9jY2ssICptYXhfY2NrOworCXN0cnVjdCBpd2wzOV9zdGF0c19yeF9ub25fcGh5ICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfbm9uX3BoeSAqZGVsdGFfZ2VuZXJhbCwgKm1heF9nZW5lcmFsOworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qCisJICogVGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KKwkgKiB0aGUgbGFzdCBzdGF0cyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQorCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5CisJICovCisJb2ZkbSA9ICZpbC0+XzM5NDUuc3RhdHMucngub2ZkbTsKKwljY2sgPSAmaWwtPl8zOTQ1LnN0YXRzLnJ4LmNjazsKKwlnZW5lcmFsID0gJmlsLT5fMzk0NS5zdGF0cy5yeC5nZW5lcmFsOworCWFjY3VtX29mZG0gPSAmaWwtPl8zOTQ1LmFjY3VtX3N0YXRzLnJ4Lm9mZG07CisJYWNjdW1fY2NrID0gJmlsLT5fMzk0NS5hY2N1bV9zdGF0cy5yeC5jY2s7CisJYWNjdW1fZ2VuZXJhbCA9ICZpbC0+XzM5NDUuYWNjdW1fc3RhdHMucnguZ2VuZXJhbDsKKwlkZWx0YV9vZmRtID0gJmlsLT5fMzk0NS5kZWx0YV9zdGF0cy5yeC5vZmRtOworCWRlbHRhX2NjayA9ICZpbC0+XzM5NDUuZGVsdGFfc3RhdHMucnguY2NrOworCWRlbHRhX2dlbmVyYWwgPSAmaWwtPl8zOTQ1LmRlbHRhX3N0YXRzLnJ4LmdlbmVyYWw7CisJbWF4X29mZG0gPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS5yeC5vZmRtOworCW1heF9jY2sgPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS5yeC5jY2s7CisJbWF4X2dlbmVyYWwgPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS5yeC5nZW5lcmFsOworCisJcG9zICs9IGlsMzk0NV9zdGF0c19mbGFnKGlsLCBidWYsIGJ1ZnN6KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIlLTMycyAgICAgY3VycmVudCIKKwkJICAgICAgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAorCQkgICAgICAiU3RhdGlzdGljc19SeCAtIE9GRE06Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiaW5hX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5pbmFfY250KSwgYWNjdW1fb2ZkbS0+aW5hX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+aW5hX2NudCwgbWF4X29mZG0tPmluYV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZpbmFfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfY250KSwgYWNjdW1fb2ZkbS0+ZmluYV9jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPmZpbmFfY250LCBtYXhfb2ZkbS0+ZmluYV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInBsY3BfZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnBsY3BfZXJyKSwgYWNjdW1fb2ZkbS0+cGxjcF9lcnIsCisJCSAgICAgIGRlbHRhX29mZG0tPnBsY3BfZXJyLCBtYXhfb2ZkbS0+cGxjcF9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImNyYzMyX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9lcnIpLCBhY2N1bV9vZmRtLT5jcmMzMl9lcnIsCisJCSAgICAgIGRlbHRhX29mZG0tPmNyYzMyX2VyciwgbWF4X29mZG0tPmNyYzMyX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAib3ZlcnJ1bl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9vZmRtLT5vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfb2ZkbS0+b3ZlcnJ1bl9lcnIsIG1heF9vZmRtLT5vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZWFybHlfb3ZlcnJ1bl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAorCQkgICAgICBhY2N1bV9vZmRtLT5lYXJseV9vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfb2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIsCisJCSAgICAgIG1heF9vZmRtLT5lYXJseV9vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiY3JjMzJfZ29vZDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9nb29kKSwgYWNjdW1fb2ZkbS0+Y3JjMzJfZ29vZCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+Y3JjMzJfZ29vZCwgbWF4X29mZG0tPmNyYzMyX2dvb2QpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZhbHNlX2FsYXJtX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5mYWxzZV9hbGFybV9jbnQpLAorCQkgICAgICBhY2N1bV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsIGRlbHRhX29mZG0tPmZhbHNlX2FsYXJtX2NudCwKKwkJICAgICAgbWF4X29mZG0tPmZhbHNlX2FsYXJtX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmluYV9zeW5jX2Vycl9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQpLAorCQkgICAgICBhY2N1bV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQsCisJCSAgICAgIG1heF9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2ZkX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+c2ZkX3RpbWVvdXQpLCBhY2N1bV9vZmRtLT5zZmRfdGltZW91dCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+c2ZkX3RpbWVvdXQsIG1heF9vZmRtLT5zZmRfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmluYV90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfdGltZW91dCksIGFjY3VtX29mZG0tPmZpbmFfdGltZW91dCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+ZmluYV90aW1lb3V0LCBtYXhfb2ZkbS0+ZmluYV90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJ1bnJlc3BvbmRlZF9ydHM6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+dW5yZXNwb25kZWRfcnRzKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+dW5yZXNwb25kZWRfcnRzLCBkZWx0YV9vZmRtLT51bnJlc3BvbmRlZF9ydHMsCisJCSAgICAgIG1heF9vZmRtLT51bnJlc3BvbmRlZF9ydHMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKKwkJICAgICAgInJ4ZV9mcmFtZV9sbXRfb3ZydW46IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAorCQkgICAgICBhY2N1bV9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKKwkJICAgICAgZGVsdGFfb2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIG1heF9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2VudF9hY2tfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYWNrX2NudCksIGFjY3VtX29mZG0tPnNlbnRfYWNrX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+c2VudF9hY2tfY250LCBtYXhfb2ZkbS0+c2VudF9hY2tfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJzZW50X2N0c19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+c2VudF9jdHNfY250KSwgYWNjdW1fb2ZkbS0+c2VudF9jdHNfY250LAorCQkgICAgICBkZWx0YV9vZmRtLT5zZW50X2N0c19jbnQsIG1heF9vZmRtLT5zZW50X2N0c19jbnQpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiJS0zMnMgICAgIGN1cnJlbnQiCisJCSAgICAgICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKKwkJICAgICAgIlN0YXRpc3RpY3NfUnggLSBDQ0s6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiaW5hX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmluYV9jbnQpLCBhY2N1bV9jY2stPmluYV9jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+aW5hX2NudCwgbWF4X2Njay0+aW5hX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmluYV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5maW5hX2NudCksIGFjY3VtX2Njay0+ZmluYV9jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+ZmluYV9jbnQsIG1heF9jY2stPmZpbmFfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJwbGNwX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnBsY3BfZXJyKSwgYWNjdW1fY2NrLT5wbGNwX2VyciwKKwkJICAgICAgZGVsdGFfY2NrLT5wbGNwX2VyciwgbWF4X2Njay0+cGxjcF9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImNyYzMyX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmNyYzMyX2VyciksIGFjY3VtX2Njay0+Y3JjMzJfZXJyLAorCQkgICAgICBkZWx0YV9jY2stPmNyYzMyX2VyciwgbWF4X2Njay0+Y3JjMzJfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJvdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPm92ZXJydW5fZXJyKSwgYWNjdW1fY2NrLT5vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfY2NrLT5vdmVycnVuX2VyciwgbWF4X2Njay0+b3ZlcnJ1bl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImVhcmx5X292ZXJydW5fZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAorCQkgICAgICBhY2N1bV9jY2stPmVhcmx5X292ZXJydW5fZXJyLAorCQkgICAgICBkZWx0YV9jY2stPmVhcmx5X292ZXJydW5fZXJyLCBtYXhfY2NrLT5lYXJseV9vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiY3JjMzJfZ29vZDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmNyYzMyX2dvb2QpLCBhY2N1bV9jY2stPmNyYzMyX2dvb2QsCisJCSAgICAgIGRlbHRhX2Njay0+Y3JjMzJfZ29vZCwgbWF4X2Njay0+Y3JjMzJfZ29vZCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmFsc2VfYWxhcm1fY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZmFsc2VfYWxhcm1fY250KSwKKwkJICAgICAgYWNjdW1fY2NrLT5mYWxzZV9hbGFybV9jbnQsIGRlbHRhX2Njay0+ZmFsc2VfYWxhcm1fY250LAorCQkgICAgICBtYXhfY2NrLT5mYWxzZV9hbGFybV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImZpbmFfc3luY19lcnJfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+ZmluYV9zeW5jX2Vycl9jbnQpLAorCQkgICAgICBhY2N1bV9jY2stPmZpbmFfc3luY19lcnJfY250LAorCQkgICAgICBkZWx0YV9jY2stPmZpbmFfc3luY19lcnJfY250LCBtYXhfY2NrLT5maW5hX3N5bmNfZXJyX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2ZkX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5zZmRfdGltZW91dCksIGFjY3VtX2Njay0+c2ZkX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX2Njay0+c2ZkX3RpbWVvdXQsIG1heF9jY2stPnNmZF90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJmaW5hX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5maW5hX3RpbWVvdXQpLCBhY2N1bV9jY2stPmZpbmFfdGltZW91dCwKKwkJICAgICAgZGVsdGFfY2NrLT5maW5hX3RpbWVvdXQsIG1heF9jY2stPmZpbmFfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAidW5yZXNwb25kZWRfcnRzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+dW5yZXNwb25kZWRfcnRzKSwKKwkJICAgICAgYWNjdW1fY2NrLT51bnJlc3BvbmRlZF9ydHMsIGRlbHRhX2Njay0+dW5yZXNwb25kZWRfcnRzLAorCQkgICAgICBtYXhfY2NrLT51bnJlc3BvbmRlZF9ydHMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKKwkJICAgICAgInJ4ZV9mcmFtZV9sbXRfb3ZydW46IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biksCisJCSAgICAgIGFjY3VtX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIGRlbHRhX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIG1heF9jY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJzZW50X2Fja19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5zZW50X2Fja19jbnQpLCBhY2N1bV9jY2stPnNlbnRfYWNrX2NudCwKKwkJICAgICAgZGVsdGFfY2NrLT5zZW50X2Fja19jbnQsIG1heF9jY2stPnNlbnRfYWNrX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAic2VudF9jdHNfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+c2VudF9jdHNfY250KSwgYWNjdW1fY2NrLT5zZW50X2N0c19jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+c2VudF9jdHNfY250LCBtYXhfY2NrLT5zZW50X2N0c19jbnQpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiJS0zMnMgICAgIGN1cnJlbnQiCisJCSAgICAgICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKKwkJICAgICAgIlN0YXRpc3RpY3NfUnggLSBHRU5FUkFMOiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImJvZ3VzX2N0czoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5ib2d1c19jdHMpLCBhY2N1bV9nZW5lcmFsLT5ib2d1c19jdHMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmJvZ3VzX2N0cywgbWF4X2dlbmVyYWwtPmJvZ3VzX2N0cyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiYm9ndXNfYWNrOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJvZ3VzX2FjayksIGFjY3VtX2dlbmVyYWwtPmJvZ3VzX2FjaywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfYWNrLCBtYXhfZ2VuZXJhbC0+Ym9ndXNfYWNrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJub25fYnNzaWRfZnJhbWVzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmlsdGVyZWRfZnJhbWVzOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcyksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCisJCSAgICAgICJub25fY2hhbm5lbF9iZWFjb25zOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucyk7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QKK2lsMzk0NV91Y29kZV90eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHBvcyA9IDA7CisJY2hhciAqYnVmOworCWludCBidWZzeiA9IChzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRzX3R4KSAqIDQ4KSArIDI1MDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfdHggKnR4LCAqYWNjdW1fdHgsICpkZWx0YV90eCwgKm1heF90eDsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCUlMX0VSUigiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIFRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCisJICogdGhlIGxhc3Qgc3RhdHMgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKKwkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQorCSAqLworCXR4ID0gJmlsLT5fMzk0NS5zdGF0cy50eDsKKwlhY2N1bV90eCA9ICZpbC0+XzM5NDUuYWNjdW1fc3RhdHMudHg7CisJZGVsdGFfdHggPSAmaWwtPl8zOTQ1LmRlbHRhX3N0YXRzLnR4OworCW1heF90eCA9ICZpbC0+XzM5NDUubWF4X2RlbHRhLnR4OworCXBvcyArPSBpbDM5NDVfc3RhdHNfZmxhZyhpbCwgYnVmLCBidWZzeik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiJS0zMnMgICAgIGN1cnJlbnQiCisJCSAgICAgICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKKwkJICAgICAgIlN0YXRpc3RpY3NfVHg6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAicHJlYW1ibGU6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPnByZWFtYmxlX2NudCksIGFjY3VtX3R4LT5wcmVhbWJsZV9jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5wcmVhbWJsZV9jbnQsIG1heF90eC0+cHJlYW1ibGVfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJyeF9kZXRlY3RlZF9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPnJ4X2RldGVjdGVkX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5yeF9kZXRlY3RlZF9jbnQsIGRlbHRhX3R4LT5yeF9kZXRlY3RlZF9jbnQsCisJCSAgICAgIG1heF90eC0+cnhfZGV0ZWN0ZWRfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJidF9wcmlvX2RlZmVyX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnRfcHJpb19kZWZlcl9jbnQpLAorCQkgICAgICBhY2N1bV90eC0+YnRfcHJpb19kZWZlcl9jbnQsIGRlbHRhX3R4LT5idF9wcmlvX2RlZmVyX2NudCwKKwkJICAgICAgbWF4X3R4LT5idF9wcmlvX2RlZmVyX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiYnRfcHJpb19raWxsX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnRfcHJpb19raWxsX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5idF9wcmlvX2tpbGxfY250LCBkZWx0YV90eC0+YnRfcHJpb19raWxsX2NudCwKKwkJICAgICAgbWF4X3R4LT5idF9wcmlvX2tpbGxfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJmZXdfYnl0ZXNfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5mZXdfYnl0ZXNfY250KSwgYWNjdW1fdHgtPmZld19ieXRlc19jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5mZXdfYnl0ZXNfY250LCBtYXhfdHgtPmZld19ieXRlc19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgImN0c190aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5jdHNfdGltZW91dCksIGFjY3VtX3R4LT5jdHNfdGltZW91dCwKKwkJICAgICAgZGVsdGFfdHgtPmN0c190aW1lb3V0LCBtYXhfdHgtPmN0c190aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJhY2tfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWNrX3RpbWVvdXQpLCBhY2N1bV90eC0+YWNrX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX3R4LT5hY2tfdGltZW91dCwgbWF4X3R4LT5hY2tfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZXhwZWN0ZWRfYWNrX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+ZXhwZWN0ZWRfYWNrX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5leHBlY3RlZF9hY2tfY250LCBkZWx0YV90eC0+ZXhwZWN0ZWRfYWNrX2NudCwKKwkJICAgICAgbWF4X3R4LT5leHBlY3RlZF9hY2tfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJhY3R1YWxfYWNrX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWN0dWFsX2Fja19jbnQpLCBhY2N1bV90eC0+YWN0dWFsX2Fja19jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5hY3R1YWxfYWNrX2NudCwgbWF4X3R4LT5hY3R1YWxfYWNrX2NudCk7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3NzaXplX3QKK2lsMzk0NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHBvcyA9IDA7CisJY2hhciAqYnVmOworCWludCBidWZzeiA9IHNpemVvZihzdHJ1Y3QgaXdsMzlfc3RhdHNfZ2VuZXJhbCkgKiAxMCArIDMwMDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfZ2VuZXJhbCAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7CisJc3RydWN0IGl3bDM5X3N0YXRzX2dlbmVyYWwgKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdHNfZGJnICpkYmcsICphY2N1bV9kYmcsICpkZWx0YV9kYmcsICptYXhfZGJnOworCXN0cnVjdCBpd2wzOV9zdGF0c19kaXYgKmRpdiwgKmFjY3VtX2RpdiwgKmRlbHRhX2RpdiwgKm1heF9kaXY7CisKKwlpZiAoIWlsX2lzX2FsaXZlKGlsKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJTF9FUlIoIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyoKKwkgKiBUaGUgc3RhdGlzdGljIGluZm9ybWF0aW9uIGRpc3BsYXkgaGVyZSBpcyBiYXNlZCBvbgorCSAqIHRoZSBsYXN0IHN0YXRzIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlCisJICogbWlnaHQgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgdUNvZGUgYWN0aXZpdHkKKwkgKi8KKwlnZW5lcmFsID0gJmlsLT5fMzk0NS5zdGF0cy5nZW5lcmFsOworCWRiZyA9ICZpbC0+XzM5NDUuc3RhdHMuZ2VuZXJhbC5kYmc7CisJZGl2ID0gJmlsLT5fMzk0NS5zdGF0cy5nZW5lcmFsLmRpdjsKKwlhY2N1bV9nZW5lcmFsID0gJmlsLT5fMzk0NS5hY2N1bV9zdGF0cy5nZW5lcmFsOworCWRlbHRhX2dlbmVyYWwgPSAmaWwtPl8zOTQ1LmRlbHRhX3N0YXRzLmdlbmVyYWw7CisJbWF4X2dlbmVyYWwgPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS5nZW5lcmFsOworCWFjY3VtX2RiZyA9ICZpbC0+XzM5NDUuYWNjdW1fc3RhdHMuZ2VuZXJhbC5kYmc7CisJZGVsdGFfZGJnID0gJmlsLT5fMzk0NS5kZWx0YV9zdGF0cy5nZW5lcmFsLmRiZzsKKwltYXhfZGJnID0gJmlsLT5fMzk0NS5tYXhfZGVsdGEuZ2VuZXJhbC5kYmc7CisJYWNjdW1fZGl2ID0gJmlsLT5fMzk0NS5hY2N1bV9zdGF0cy5nZW5lcmFsLmRpdjsKKwlkZWx0YV9kaXYgPSAmaWwtPl8zOTQ1LmRlbHRhX3N0YXRzLmdlbmVyYWwuZGl2OworCW1heF9kaXYgPSAmaWwtPl8zOTQ1Lm1heF9kZWx0YS5nZW5lcmFsLmRpdjsKKwlwb3MgKz0gaWwzOTQ1X3N0YXRzX2ZsYWcoaWwsIGJ1ZiwgYnVmc3opOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiUtMzJzICAgICBjdXJyZW50IgorCQkgICAgICAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCisJCSAgICAgICJTdGF0aXN0aWNzX0dlbmVyYWw6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiYnVyc3RfY2hlY2s6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGJnLT5idXJzdF9jaGVjayksIGFjY3VtX2RiZy0+YnVyc3RfY2hlY2ssCisJCSAgICAgIGRlbHRhX2RiZy0+YnVyc3RfY2hlY2ssIG1heF9kYmctPmJ1cnN0X2NoZWNrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJidXJzdF9jb3VudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShkYmctPmJ1cnN0X2NvdW50KSwgYWNjdW1fZGJnLT5idXJzdF9jb3VudCwKKwkJICAgICAgZGVsdGFfZGJnLT5idXJzdF9jb3VudCwgbWF4X2RiZy0+YnVyc3RfY291bnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInNsZWVwX3RpbWU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xlZXBfdGltZSksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPnNsZWVwX3RpbWUsIGRlbHRhX2dlbmVyYWwtPnNsZWVwX3RpbWUsCisJCSAgICAgIG1heF9nZW5lcmFsLT5zbGVlcF90aW1lKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsICJzbG90c19vdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfb3V0KSwgYWNjdW1fZ2VuZXJhbC0+c2xvdHNfb3V0LAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5zbG90c19vdXQsIG1heF9nZW5lcmFsLT5zbG90c19vdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInNsb3RzX2lkbGU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfaWRsZSksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPnNsb3RzX2lkbGUsIGRlbHRhX2dlbmVyYWwtPnNsb3RzX2lkbGUsCisJCSAgICAgIG1heF9nZW5lcmFsLT5zbG90c19pZGxlKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJ0dGxfdGltZXN0YW1wOlx0XHRcdCV1XG4iLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT50dGxfdGltZXN0YW1wKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAidHhfb25fYToiLAorCQkgICAgICBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2EpLCBhY2N1bV9kaXYtPnR4X29uX2EsCisJCSAgICAgIGRlbHRhX2Rpdi0+dHhfb25fYSwgbWF4X2Rpdi0+dHhfb25fYSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAidHhfb25fYjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2IpLCBhY2N1bV9kaXYtPnR4X29uX2IsCisJCSAgICAgIGRlbHRhX2Rpdi0+dHhfb25fYiwgbWF4X2Rpdi0+dHhfb25fYik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZXhlY190aW1lOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGRpdi0+ZXhlY190aW1lKSwgYWNjdW1fZGl2LT5leGVjX3RpbWUsCisJCSAgICAgIGRlbHRhX2Rpdi0+ZXhlY190aW1lLCBtYXhfZGl2LT5leGVjX3RpbWUpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInByb2JlX3RpbWU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGl2LT5wcm9iZV90aW1lKSwgYWNjdW1fZGl2LT5wcm9iZV90aW1lLAorCQkgICAgICBkZWx0YV9kaXYtPnByb2JlX3RpbWUsIG1heF9kaXYtPnByb2JlX3RpbWUpOworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUtbWFjLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LW1hYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YjJkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LW1hYy5jCkBAIC0wLDAgKzEsMzk3NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCisgKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLWFzcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2FycC5oPgorCisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNkZWZpbmUgRFJWX05BTUUJIml3bDM5NDUiCisKKyNpbmNsdWRlICJjb21tYW5kcy5oIgorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIjM5NDUuaCIKKyNpbmNsdWRlICJpd2wtc3BlY3RydW0uaCIKKworLyoKKyAqIG1vZHVsZSBuYW1lLCBjb3B5cmlnaHQsIHZlcnNpb24sIGV0Yy4KKyAqLworCisjZGVmaW5lIERSVl9ERVNDUklQVElPTglcCisiSW50ZWwoUikgUFJPL1dpcmVsZXNzIDM5NDVBQkcvQkcgTmV0d29yayBDb25uZWN0aW9uIGRyaXZlciBmb3IgTGludXgiCisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKyNkZWZpbmUgVkQgImQiCisjZWxzZQorI2RlZmluZSBWRAorI2VuZGlmCisKKy8qCisgKiBhZGQgInMiIHRvIGluZGljYXRlIHNwZWN0cnVtIG1lYXN1cmVtZW50IGluY2x1ZGVkLgorICogd2UgYWRkIGl0IGhlcmUgdG8gYmUgY29uc2lzdGVudCB3aXRoIHByZXZpb3VzIHJlbGVhc2VzIGluIHdoaWNoCisgKiB0aGlzIHdhcyBjb25maWd1cmFibGUuCisgKi8KKyNkZWZpbmUgRFJWX1ZFUlNJT04gIElXTFdJRklfVkVSU0lPTiBWRCAicyIKKyNkZWZpbmUgRFJWX0NPUFlSSUdIVAkiQ29weXJpZ2h0KGMpIDIwMDMtMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbiIKKyNkZWZpbmUgRFJWX0FVVEhPUiAgICAgIjxpbHdAbGludXguaW50ZWwuY29tPiIKKworTU9EVUxFX0RFU0NSSVBUSU9OKERSVl9ERVNDUklQVElPTik7CitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQgIiAiIERSVl9BVVRIT1IpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisgLyogbW9kdWxlIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBpbF9tb2RfcGFyYW1zIGlsMzk0NV9tb2RfcGFyYW1zID0geworCS5zd19jcnlwdG8gPSAxLAorCS5yZXN0YXJ0X2Z3ID0gMSwKKwkuZGlzYWJsZV9od19zY2FuID0gMSwKKwkvKiB0aGUgcmVzdCBhcmUgMCBieSBkZWZhdWx0ICovCit9OworCisvKioKKyAqIGlsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyAtIEdldCBhbnRlbm5hIGZsYWdzIGZvciBSWE9OIGNvbW1hbmQKKyAqIEBpbDogZWVwcm9tIGFuZCBhbnRlbm5hIGZpZWxkcyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgYW50ZW5uYSBmbGFncworICoKKyAqIGlsLT5lZXByb20zOSAgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW50ZW5uYSBBVVgvTUFJTiBhcmUgcmV2ZXJzZWQKKyAqIGlsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEgc3BlY2lmaWVzIHRoZSBhbnRlbm5hIGRpdmVyc2l0eSBtb2RlOgorICoKKyAqIElMX0FOVEVOTkFfRElWRVJTSVRZIC0gTklDIHNlbGVjdHMgYmVzdCBhbnRlbm5hIGJ5IGl0c2VsZgorICogSUxfQU5URU5OQV9NQUlOICAgICAgLSBGb3JjZSBNQUlOIGFudGVubmEKKyAqIElMX0FOVEVOTkFfQVVYICAgICAgIC0gRm9yY2UgQVVYIGFudGVubmEKKyAqLworX19sZTMyCitpbDM5NDVfZ2V0X2FudGVubmFfZmxhZ3MoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCisJc3dpdGNoIChpbDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hKSB7CisJY2FzZSBJTF9BTlRFTk5BX0RJVkVSU0lUWToKKwkJcmV0dXJuIDA7CisKKwljYXNlIElMX0FOVEVOTkFfTUFJTjoKKwkJaWYgKGVlcHJvbS0+YW50ZW5uYV9zd2l0Y2hfdHlwZSkKKwkJCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9CX01TSzsKKwkJcmV0dXJuIFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX0FfTVNLOworCisJY2FzZSBJTF9BTlRFTk5BX0FVWDoKKwkJaWYgKGVlcHJvbS0+YW50ZW5uYV9zd2l0Y2hfdHlwZSkKKwkJCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9BX01TSzsKKwkJcmV0dXJuIFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX0JfTVNLOworCX0KKworCS8qIGJhZCBhbnRlbm5hIHNlbGVjdG9yIHZhbHVlICovCisJSUxfRVJSKCJCYWQgYW50ZW5uYSBzZWxlY3RvciB2YWx1ZSAoMHgleClcbiIsCisJICAgICAgIGlsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEpOworCisJcmV0dXJuIDA7CQkvKiAiZGl2ZXJzaXR5IiBpcyBkZWZhdWx0IGlmIGVycm9yICovCit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX19sZTE2IGtleV9mbGFncyA9IDA7CisJaW50IHJldDsKKworCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfQ0NNUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKKwlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7CisKKwlpZiAoc3RhX2lkID09IGlsLT5jdHguYmNhc3Rfc3RhX2lkKQorCQlrZXlfZmxhZ3MgfD0gU1RBX0tFWV9NVUxUSUNBU1RfTVNLOworCisJa2V5Y29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOworCWtleWNvbmYtPmh3X2tleV9pZHggPSBrZXljb25mLT5rZXlpZHg7CisJa2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0ga2V5Y29uZi0+a2V5bGVuOworCW1lbWNweShpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCisJbWVtY3B5KGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7CisKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkuCisJICAgICBrZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykgPT0gU1RBX0tFWV9GTEdfTk9fRU5DKQorCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQorCQkgICAgaWxfZ2V0X2ZyZWVfdWNvZGVfa2V5X2lkeChpbCk7CisJLyogZWxzZSwgd2UgYXJlIG92ZXJyaWRpbmcgYW4gZXhpc3Rpbmcga2V5ID0+IG5vIG5lZWQgdG8gYWxsb2NhdGVkIHJvb20KKwkgKiBpbiB1Q29kZS4gKi8KKworCVdBUk4oaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKKwkgICAgICJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IGtleV9mbGFnczsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisKKwlEX0lORk8oImh3Y3J5cHRvOiBtb2RpZnkgdWNvZGUgc3RhdGlvbiBrZXkgaW5mb1xuIik7CisKKwlyZXQgPSBpbF9zZW5kX2FkZF9zdGEoaWwsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zZXRfdGtpcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3NldF93ZXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCXJldHVybiAtRU9QTk9UU1VQUDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X2NsZWFyX3N0YV9rZXlfaW5mbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IHN0YV9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF9hZGRzdGFfY21kIHN0YV9jbWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJbWVtc2V0KCZpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGlsX2h3X2tleSkpOworCW1lbXNldCgmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleSwgMCwgc2l6ZW9mKHN0cnVjdCBpbDQ5NjVfa2V5aW5mbykpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0gU1RBX0tFWV9GTEdfTk9fRU5DOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJRF9JTkZPKCJod2NyeXB0bzogY2xlYXIgdWNvZGUgc3RhdGlvbiBrZXkgaW5mb1xuIik7CisJcmV0dXJuIGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3NldF9keW5hbWljX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCSAgICAgICB1OCBzdGFfaWQpCit7CisJaW50IHJldCA9IDA7CisKKwlrZXljb25mLT5od19rZXlfaWR4ID0gSFdfS0VZX0RZTkFNSUM7CisKKwlzd2l0Y2ggKGtleWNvbmYtPmNpcGhlcikgeworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJcmV0ID0gaWwzOTQ1X3NldF9jY21wX2R5bmFtaWNfa2V5X2luZm8oaWwsIGtleWNvbmYsIHN0YV9pZCk7CisJCWJyZWFrOworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKKwkJcmV0ID0gaWwzOTQ1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oaWwsIGtleWNvbmYsIHN0YV9pZCk7CisJCWJyZWFrOworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CisJCXJldCA9IGlsMzk0NV9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8oaWwsIGtleWNvbmYsIHN0YV9pZCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX0VSUigiVW5rbm93biBhbGc6ICVzIGFsZz0leFxuIiwgX19mdW5jX18sIGtleWNvbmYtPmNpcGhlcik7CisJCXJldCA9IC1FSU5WQUw7CisJfQorCisJRF9XRVAoIlNldCBkeW5hbWljIGtleTogYWxnPSV4IGxlbj0lZCBpZHg9JWQgc3RhPSVkIHJldD0lZFxuIiwKKwkgICAgICBrZXljb25mLT5jaXBoZXIsIGtleWNvbmYtPmtleWxlbiwga2V5Y29uZi0+a2V5aWR4LCBzdGFfaWQsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDM5NDVfcmVtb3ZlX3N0YXRpY19rZXkoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQgPSAtRU9QTk9UU1VQUDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zZXRfc3RhdGljX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKK3sKKwlpZiAoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKKwkgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlJTF9FUlIoIlN0YXRpYyBrZXkgaW52YWxpZDogY2lwaGVyICV4XG4iLCBrZXktPmNpcGhlcik7CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfY2xlYXJfZnJlZV9mcmFtZXMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisKKwlEX0lORk8oIiVkIGZyYW1lcyBvbiBwcmUtYWxsb2NhdGVkIGhlYXAgb24gY2xlYXIuXG4iLCBpbC0+ZnJhbWVzX2NvdW50KTsKKworCXdoaWxlICghbGlzdF9lbXB0eSgmaWwtPmZyZWVfZnJhbWVzKSkgeworCQllbGVtZW50ID0gaWwtPmZyZWVfZnJhbWVzLm5leHQ7CisJCWxpc3RfZGVsKGVsZW1lbnQpOworCQlrZnJlZShsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpbDM5NDVfZnJhbWUsIGxpc3QpKTsKKwkJaWwtPmZyYW1lc19jb3VudC0tOworCX0KKworCWlmIChpbC0+ZnJhbWVzX2NvdW50KSB7CisJCUlMX1dBUk4oIiVkIGZyYW1lcyBzdGlsbCBpbiB1c2UuICBEaWQgd2UgbG9zZSBvbmU/XG4iLAorCQkJaWwtPmZyYW1lc19jb3VudCk7CisJCWlsLT5mcmFtZXNfY291bnQgPSAwOworCX0KK30KKworc3RhdGljIHN0cnVjdCBpbDM5NDVfZnJhbWUgKgoraWwzOTQ1X2dldF9mcmVlX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X2ZyYW1lICpmcmFtZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OworCWlmIChsaXN0X2VtcHR5KCZpbC0+ZnJlZV9mcmFtZXMpKSB7CisJCWZyYW1lID0ga3phbGxvYyhzaXplb2YoKmZyYW1lKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghZnJhbWUpIHsKKwkJCUlMX0VSUigiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lIVxuIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlsLT5mcmFtZXNfY291bnQrKzsKKwkJcmV0dXJuIGZyYW1lOworCX0KKworCWVsZW1lbnQgPSBpbC0+ZnJlZV9mcmFtZXMubmV4dDsKKwlsaXN0X2RlbChlbGVtZW50KTsKKwlyZXR1cm4gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWwzOTQ1X2ZyYW1lLCBsaXN0KTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9mcmVlX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsMzk0NV9mcmFtZSAqZnJhbWUpCit7CisJbWVtc2V0KGZyYW1lLCAwLCBzaXplb2YoKmZyYW1lKSk7CisJbGlzdF9hZGQoJmZyYW1lLT5saXN0LCAmaWwtPmZyZWVfZnJhbWVzKTsKK30KKwordW5zaWduZWQgaW50CitpbDM5NDVfZmlsbF9iZWFjb25fZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJIGludCBsZWZ0KQoreworCisJaWYgKCFpbF9pc19hc3NvY2lhdGVkKGlsKSB8fCAhaWwtPmJlYWNvbl9za2IpCisJCXJldHVybiAwOworCisJaWYgKGlsLT5iZWFjb25fc2tiLT5sZW4gPiBsZWZ0KQorCQlyZXR1cm4gMDsKKworCW1lbWNweShoZHIsIGlsLT5iZWFjb25fc2tiLT5kYXRhLCBpbC0+YmVhY29uX3NrYi0+bGVuKTsKKworCXJldHVybiBpbC0+YmVhY29uX3NrYi0+bGVuOworfQorCitzdGF0aWMgaW50CitpbDM5NDVfc2VuZF9iZWFjb25fY21kKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X2ZyYW1lICpmcmFtZTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKKwlpbnQgcmM7CisJdTggcmF0ZTsKKworCWZyYW1lID0gaWwzOTQ1X2dldF9mcmVlX2ZyYW1lKGlsKTsKKworCWlmICghZnJhbWUpIHsKKwkJSUxfRVJSKCJDb3VsZCBub3Qgb2J0YWluIGZyZWUgZnJhbWUgYnVmZmVyIGZvciBiZWFjb24gIgorCQkgICAgICAgImNvbW1hbmQuXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmF0ZSA9IGlsX2dldF9sb3dlc3RfcGxjcChpbCwgJmlsLT5jdHgpOworCisJZnJhbWVfc2l6ZSA9IGlsMzk0NV9od19nZXRfYmVhY29uX2NtZChpbCwgZnJhbWUsIHJhdGUpOworCisJcmMgPSBpbF9zZW5kX2NtZF9wZHUoaWwsIENfVFhfQkVBQ09OLCBmcmFtZV9zaXplLCAmZnJhbWUtPnUuY21kWzBdKTsKKworCWlsMzk0NV9mcmVlX2ZyYW1lKGlsLCBmcmFtZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfdW5zZXRfaHdfcGFyYW1zKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpZiAoaWwtPl8zOTQ1LnNoYXJlZF92aXJ0KQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwKKwkJCQkgIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3NoYXJlZCksCisJCQkJICBpbC0+XzM5NDUuc2hhcmVkX3ZpcnQsIGlsLT5fMzk0NS5zaGFyZWRfcGh5cyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfYnVpbGRfdHhfY21kX2h3Y3J5cHRvKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJICAgICBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiX2ZyYWcsIGludCBzdGFfaWQpCit7CisJc3RydWN0IGlsMzk0NV90eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCAqKWNtZC0+Y21kLnBheWxvYWQ7CisJc3RydWN0IGlsX2h3X2tleSAqa2V5aW5mbyA9ICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvOworCisJdHhfY21kLT5zZWNfY3RsID0gMDsKKworCXN3aXRjaCAoa2V5aW5mby0+Y2lwaGVyKSB7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorCQl0eF9jbWQtPnNlY19jdGwgPSBUWF9DTURfU0VDX0NDTTsKKwkJbWVtY3B5KHR4X2NtZC0+a2V5LCBrZXlpbmZvLT5rZXksIGtleWluZm8tPmtleWxlbik7CisJCURfVFgoInR4X2NtZCB3aXRoIEFFUyBod2NyeXB0b1xuIik7CisJCWJyZWFrOworCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgorCQlicmVhazsKKworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgorCQl0eF9jbWQtPnNlY19jdGwgfD0gVFhfQ01EX1NFQ19LRVkxMjg7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CisJCXR4X2NtZC0+c2VjX2N0bCB8PQorCQkgICAgVFhfQ01EX1NFQ19XRVAgfCAoaW5mby0+Y29udHJvbC5od19rZXktPgorCQkJCSAgICAgIGh3X2tleV9pZHggJiBUWF9DTURfU0VDX01TSykgPDwKKwkJICAgIFRYX0NNRF9TRUNfU0hJRlQ7CisKKwkJbWVtY3B5KCZ0eF9jbWQtPmtleVszXSwga2V5aW5mby0+a2V5LCBrZXlpbmZvLT5rZXlsZW4pOworCisJCURfVFgoIkNvbmZpZ3VyaW5nIHBhY2tldCBmb3IgV0VQIGVuY3J5cHRpb24gIiAid2l0aCBrZXkgJWRcbiIsCisJCSAgICAgaW5mby0+Y29udHJvbC5od19rZXktPmh3X2tleV9pZHgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlMX0VSUigiVW5rbm93biBlbmNvZGUgY2lwaGVyICV4XG4iLCBrZXlpbmZvLT5jaXBoZXIpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBoYW5kbGUgYnVpbGQgQ19UWCBjb21tYW5kIG5vdGlmaWNhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9idWlsZF90eF9jbWRfYmFzaWMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsIHU4IHN0ZF9pZCkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCAqdHhfY21kID0gKHN0cnVjdCBpbDM5NDVfdHhfY21kICopY21kLT5jbWQucGF5bG9hZDsKKwlfX2xlMzIgdHhfZmxhZ3MgPSB0eF9jbWQtPnR4X2ZsYWdzOworCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKKworCXR4X2NtZC0+c3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7CisJaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpIHsKKwkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLOworCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKQorCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwkJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSAmJgorCQkgICAgIShsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIDB4ZikpCisJCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1RTRl9NU0s7CisJfSBlbHNlIHsKKwkJdHhfZmxhZ3MgJj0gKH5UWF9DTURfRkxHX0FDS19NU0spOworCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOworCX0KKworCXR4X2NtZC0+c3RhX2lkID0gc3RkX2lkOworCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCisJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTU9SRV9GUkFHX01TSzsKKworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CisJCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCQl0eF9jbWQtPnRpZF90c3BlYyA9IHFjWzBdICYgMHhmOworCQl0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKKwl9IGVsc2UgeworCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOworCX0KKworCWlsX3R4X2NtZF9wcm90ZWN0aW9uKGlsLCBpbmZvLCBmYywgJnR4X2ZsYWdzKTsKKworCXR4X2ZsYWdzICY9IH4oVFhfQ01EX0ZMR19BTlRfU0VMX01TSyk7CisJaWYgKGllZWU4MDIxMV9pc19tZ210KGZjKSkgeworCQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShmYykgfHwgaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKKwkJCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gY3B1X3RvX2xlMTYoMyk7CisJCWVsc2UKKwkJCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gY3B1X3RvX2xlMTYoMik7CisJfSBlbHNlIHsKKwkJdHhfY21kLT50aW1lb3V0LnBtX2ZyYW1lX3RpbWVvdXQgPSAwOworCX0KKworCXR4X2NtZC0+ZHJpdmVyX3R4b3AgPSAwOworCXR4X2NtZC0+dHhfZmxhZ3MgPSB0eF9mbGFnczsKKwl0eF9jbWQtPm5leHRfZnJhbWVfbGVuID0gMDsKK30KKworLyoKKyAqIHN0YXJ0IENfVFggY29tbWFuZCBwcm9jZXNzCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV90eF9za2Ioc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpbDM5NDVfdHhfY21kICp0eF9jbWQ7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSBOVUxMOworCXN0cnVjdCBpbF9xdWV1ZSAqcSA9IE5VTEw7CisJc3RydWN0IGlsX2RldmljZV9jbWQgKm91dF9jbWQ7CisJc3RydWN0IGlsX2NtZF9tZXRhICpvdXRfbWV0YTsKKwlkbWFfYWRkcl90IHBoeXNfYWRkcjsKKwlkbWFfYWRkcl90IHR4Y21kX3BoeXM7CisJaW50IHR4cV9pZCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOworCXUxNiBsZW4sIGlkeCwgaGRyX2xlbjsKKwl1OCBpZDsKKwl1OCB1bmljYXN0OworCXU4IHN0YV9pZDsKKwl1OCB0aWQgPSAwOworCV9fbGUxNiBmYzsKKwl1OCB3YWl0X3dyaXRlX3B0ciA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlmIChpbF9pc19yZmtpbGwoaWwpKSB7CisJCURfRFJPUCgiRHJvcHBpbmcgLSBSRiBLSUxMXG4iKTsKKwkJZ290byBkcm9wX3VubG9jazsKKwl9CisKKwlpZiAoKGllZWU4MDIxMV9nZXRfdHhfcmF0ZShpbC0+aHcsIGluZm8pLT5od192YWx1ZSAmIDB4RkYpID09CisJICAgIElMX0lOVkFMSURfUkFURSkgeworCQlJTF9FUlIoIkVSUk9SOiBObyBUWCByYXRlIGF2YWlsYWJsZS5cbiIpOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCXVuaWNhc3QgPSAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSk7CisJaWQgPSAwOworCisJZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWVlZTgwMjExX2lzX2F1dGgoZmMpKQorCQlEX1RYKCJTZW5kaW5nIEFVVEggZnJhbWVcbiIpOworCWVsc2UgaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpKQorCQlEX1RYKCJTZW5kaW5nIEFTU09DIGZyYW1lXG4iKTsKKwllbHNlIGlmIChpZWVlODAyMTFfaXNfcmVhc3NvY19yZXEoZmMpKQorCQlEX1RYKCJTZW5kaW5nIFJFQVNTT0MgZnJhbWVcbiIpOworI2VuZGlmCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmMpOworCisJLyogRmluZCBpZHggaW50byBzdGF0aW9uIHRhYmxlIGZvciBkZXN0aW5hdGlvbiBzdGF0aW9uICovCisJc3RhX2lkID0gaWxfc3RhX2lkX29yX2Jyb2FkY2FzdChpbCwgJmlsLT5jdHgsIGluZm8tPmNvbnRyb2wuc3RhKTsKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikgeworCQlEX0RST1AoIkRyb3BwaW5nIC0gSU5WQUxJRCBTVEFUSU9OOiAlcE1cbiIsIGhkci0+YWRkcjEpOworCQlnb3RvIGRyb3A7CisJfQorCisJRF9SQVRFKCJzdGF0aW9uIElkICVkXG4iLCBzdGFfaWQpOworCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKKwkJdTggKnFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7CisJCXRpZCA9IHFjWzBdICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7CisJCWlmICh1bmxpa2VseSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpCisJCQlnb3RvIGRyb3A7CisJfQorCisJLyogRGVzY3JpcHRvciBmb3IgY2hvc2VuIFR4IHF1ZXVlICovCisJdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlxID0gJnR4cS0+cTsKKworCWlmICgoaWxfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspKQorCQlnb3RvIGRyb3A7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlkeCA9IGlsX2dldF9jbWRfaWR4KHEsIHEtPndyaXRlX3B0ciwgMCk7CisKKwkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCisJbWVtc2V0KCYodHhxLT50eGJbcS0+d3JpdGVfcHRyXSksIDAsIHNpemVvZihzdHJ1Y3QgaWxfdHhfaW5mbykpOworCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uc2tiID0gc2tiOworCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uY3R4ID0gJmlsLT5jdHg7CisKKwkvKiBJbml0IGZpcnN0IGVtcHR5IGVudHJ5IGluIHF1ZXVlJ3MgYXJyYXkgb2YgVHgvY21kIGJ1ZmZlcnMgKi8KKwlvdXRfY21kID0gdHhxLT5jbWRbaWR4XTsKKwlvdXRfbWV0YSA9ICZ0eHEtPm1ldGFbaWR4XTsKKwl0eF9jbWQgPSAoc3RydWN0IGlsMzk0NV90eF9jbWQgKilvdXRfY21kLT5jbWQucGF5bG9hZDsKKwltZW1zZXQoJm91dF9jbWQtPmhkciwgMCwgc2l6ZW9mKG91dF9jbWQtPmhkcikpOworCW1lbXNldCh0eF9jbWQsIDAsIHNpemVvZigqdHhfY21kKSk7CisKKwkvKgorCSAqIFNldCB1cCB0aGUgVHgtY29tbWFuZCAobm90IE1BQyEpIGhlYWRlci4KKwkgKiBTdG9yZSB0aGUgY2hvc2VuIFR4IHF1ZXVlIGFuZCBURkQgaWR4IHdpdGhpbiB0aGUgc2VxdWVuY2UgZmllbGQ7CisJICogYWZ0ZXIgVHgsIHVDb2RlJ3MgVHggcmVzcG9uc2Ugd2lsbCByZXR1cm4gdGhpcyB2YWx1ZSBzbyBkcml2ZXIgY2FuCisJICogbG9jYXRlIHRoZSBmcmFtZSB3aXRoaW4gdGhlIHR4IHF1ZXVlIGFuZCBkbyBwb3N0LXR4IHByb2Nlc3NpbmcuCisJICovCisJb3V0X2NtZC0+aGRyLmNtZCA9IENfVFg7CisJb3V0X2NtZC0+aGRyLnNlcXVlbmNlID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikKKwkJCShRVUVVRV9UT19TRVEodHhxX2lkKSB8IElEWF9UT19TRVEocS0+d3JpdGVfcHRyKSkpOworCisJLyogQ29weSBNQUMgaGVhZGVyIGZyb20gc2tiIGludG8gY29tbWFuZCBidWZmZXIgKi8KKwltZW1jcHkodHhfY21kLT5oZHIsIGhkciwgaGRyX2xlbik7CisKKwlpZiAoaW5mby0+Y29udHJvbC5od19rZXkpCisJCWlsMzk0NV9idWlsZF90eF9jbWRfaHdjcnlwdG8oaWwsIGluZm8sIG91dF9jbWQsIHNrYiwgc3RhX2lkKTsKKworCS8qIFRPRE8gbmVlZCB0aGlzIGZvciBidXJzdCBtb2RlIGxhdGVyIG9uICovCisJaWwzOTQ1X2J1aWxkX3R4X2NtZF9iYXNpYyhpbCwgb3V0X2NtZCwgaW5mbywgaGRyLCBzdGFfaWQpOworCisJaWwzOTQ1X2h3X2J1aWxkX3R4X2NtZF9yYXRlKGlsLCBvdXRfY21kLCBpbmZvLCBoZHIsIHN0YV9pZCk7CisKKwkvKiBUb3RhbCAjIGJ5dGVzIHRvIGJlIHRyYW5zbWl0dGVkICovCisJbGVuID0gKHUxNikgc2tiLT5sZW47CisJdHhfY21kLT5sZW4gPSBjcHVfdG9fbGUxNihsZW4pOworCisJaWxfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKGlsLCBsZW4sIGhkcik7CisJaWxfdXBkYXRlX3N0YXRzKGlsLCB0cnVlLCBmYywgbGVuKTsKKwl0eF9jbWQtPnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX0FOVF9BX01TSzsKKwl0eF9jbWQtPnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX0FOVF9CX01TSzsKKworCWlmICghaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKKwl9IGVsc2UgeworCQl3YWl0X3dyaXRlX3B0ciA9IDE7CisJCXR4cS0+bmVlZF91cGRhdGUgPSAwOworCX0KKworCURfVFgoInNlcXVlbmNlIG5yID0gMFgleFxuIiwgbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSk7CisJRF9UWCgidHhfZmxhZ3MgPSAwWCV4XG4iLCBsZTMyX3RvX2NwdSh0eF9jbWQtPnR4X2ZsYWdzKSk7CisJaWxfcHJpbnRfaGV4X2R1bXAoaWwsIElMX0RMX1RYLCB0eF9jbWQsIHNpemVvZigqdHhfY21kKSk7CisJaWxfcHJpbnRfaGV4X2R1bXAoaWwsIElMX0RMX1RYLCAodTggKikgdHhfY21kLT5oZHIsCisJCQkgIGllZWU4MDIxMV9oZHJsZW4oZmMpKTsKKworCS8qCisJICogVXNlIHRoZSBmaXJzdCBlbXB0eSBlbnRyeSBpbiB0aGlzIHF1ZXVlJ3MgY29tbWFuZCBidWZmZXIgYXJyYXkKKwkgKiB0byBjb250YWluIHRoZSBUeCBjb21tYW5kIGFuZCBNQUMgaGVhZGVyIGNvbmNhdGVuYXRlZCB0b2dldGhlcgorCSAqIChwYXlsb2FkIGRhdGEgd2lsbCBiZSBpbiBhbm90aGVyIGJ1ZmZlcikuCisJICogU2l6ZSBvZiB0aGlzIHZhcmllcywgZHVlIHRvIHZhcnlpbmcgTUFDIGhlYWRlciBsZW5ndGguCisJICogSWYgZW5kIGlzIG5vdCBkd29yZCBhbGlnbmVkLCB3ZSdsbCBoYXZlIDIgZXh0cmEgYnl0ZXMgYXQgdGhlIGVuZAorCSAqIG9mIHRoZSBNQUMgaGVhZGVyIChkZXZpY2UgcmVhZHMgb24gZHdvcmQgYm91bmRhcmllcykuCisJICogV2UnbGwgdGVsbCBkZXZpY2UgYWJvdXQgdGhpcyBwYWRkaW5nIGxhdGVyLgorCSAqLworCWxlbiA9CisJICAgIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCkgKyBzaXplb2Yoc3RydWN0IGlsX2NtZF9oZWFkZXIpICsKKwkgICAgaGRyX2xlbjsKKwlsZW4gPSAobGVuICsgMykgJiB+MzsKKworCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBUeCBjb21tYW5kJ3MgaGVhZGVyIChub3QgTUFDIGhlYWRlciEpLAorCSAqIHdpdGhpbiBjb21tYW5kIGJ1ZmZlciBhcnJheS4gKi8KKwl0eGNtZF9waHlzID0KKwkgICAgcGNpX21hcF9zaW5nbGUoaWwtPnBjaV9kZXYsICZvdXRfY21kLT5oZHIsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7CisJLyogd2UgZG8gbm90IG1hcCBtZXRhIGRhdGEgLi4uIHNvIHdlIGNhbiBzYWZlbHkgYWNjZXNzIGFkZHJlc3MgdG8KKwkgKiBwcm92aWRlIHRvIHVubWFwIGNvbW1hbmQqLworCWRtYV91bm1hcF9hZGRyX3NldChvdXRfbWV0YSwgbWFwcGluZywgdHhjbWRfcGh5cyk7CisJZG1hX3VubWFwX2xlbl9zZXQob3V0X21ldGEsIGxlbiwgbGVuKTsKKworCS8qIEFkZCBidWZmZXIgY29udGFpbmluZyBUeCBjb21tYW5kIGFuZCBNQUMoISkgaGVhZGVyIHRvIFRGRCdzCisJICogZmlyc3QgZW50cnkgKi8KKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2F0dGFjaF9idWZfdG9fdGZkKGlsLCB0eHEsIHR4Y21kX3BoeXMsIGxlbiwgMSwKKwkJCQkJCSAwKTsKKworCS8qIFNldCB1cCBURkQncyAybmQgZW50cnkgdG8gcG9pbnQgZGlyZWN0bHkgdG8gcmVtYWluZGVyIG9mIHNrYiwKKwkgKiBpZiBhbnkgKDgwMi4xMSBudWxsIGZyYW1lcyBoYXZlIG5vIHBheWxvYWQpLiAqLworCWxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlpZiAobGVuKSB7CisJCXBoeXNfYWRkciA9CisJCSAgICBwY2lfbWFwX3NpbmdsZShpbC0+cGNpX2Rldiwgc2tiLT5kYXRhICsgaGRyX2xlbiwgbGVuLAorCQkJCSAgIFBDSV9ETUFfVE9ERVZJQ0UpOworCQlpbC0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2F0dGFjaF9idWZfdG9fdGZkKGlsLCB0eHEsIHBoeXNfYWRkciwKKwkJCQkJCQkgbGVuLCAwLCBVMzJfUEFEKGxlbikpOworCX0KKworCS8qIFRlbGwgZGV2aWNlIHRoZSB3cml0ZSBpZHggKmp1c3QgcGFzdCogdGhpcyBsYXRlc3QgZmlsbGVkIFRGRCAqLworCXEtPndyaXRlX3B0ciA9IGlsX3F1ZXVlX2luY193cmFwKHEtPndyaXRlX3B0ciwgcS0+bl9iZCk7CisJaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoaWwsIHR4cSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpbF9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyayAmJiBpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCkgeworCQlpZiAod2FpdF93cml0ZV9wdHIpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7CisJCQlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgdHhxKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJCX0KKworCQlpbF9zdG9wX3F1ZXVlKGlsLCB0eHEpOworCX0KKworCXJldHVybiAwOworCitkcm9wX3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworZHJvcDoKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9nZXRfbWVhc3VyZW1lbnQoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9tZWFzdXJlbWVudF9wYXJhbXMgKnBhcmFtcywgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgaWxfc3BlY3RydW1fY21kIHNwZWN0cnVtOworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdDsKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX1NQRUNUUlVNX01FQVNVUkVNRU5ULAorCQkuZGF0YSA9ICh2b2lkICopJnNwZWN0cnVtLAorCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IsCisJfTsKKwl1MzIgYWRkX3RpbWUgPSBsZTY0X3RvX2NwdShwYXJhbXMtPnN0YXJ0X3RpbWUpOworCWludCByYzsKKwlpbnQgc3BlY3RydW1fcmVzcF9zdGF0dXM7CisJaW50IGR1cmF0aW9uID0gbGUxNl90b19jcHUocGFyYW1zLT5kdXJhdGlvbik7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlpZiAoaWxfaXNfYXNzb2NpYXRlZChpbCkpCisJCWFkZF90aW1lID0KKwkJICAgIGlsX3VzZWNzX3RvX2JlYWNvbnMoaWwsCisJCQkJCWxlNjRfdG9fY3B1KHBhcmFtcy0+c3RhcnRfdGltZSkgLQorCQkJCQlpbC0+XzM5NDUubGFzdF90c2YsCisJCQkJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLgorCQkJCQkJICAgIGJlYWNvbl9pbnRlcnZhbCkpOworCisJbWVtc2V0KCZzcGVjdHJ1bSwgMCwgc2l6ZW9mKHNwZWN0cnVtKSk7CisKKwlzcGVjdHJ1bS5jaGFubmVsX2NvdW50ID0gY3B1X3RvX2xlMTYoMSk7CisJc3BlY3RydW0uZmxhZ3MgPQorCSAgICBSWE9OX0ZMR19UU0YySE9TVF9NU0sgfCBSWE9OX0ZMR19BTlRfQV9NU0sgfCBSWE9OX0ZMR19ESVNfRElWX01TSzsKKwlzcGVjdHJ1bS5maWx0ZXJfZmxhZ3MgPSBNRUFTVVJFTUVOVF9GSUxURVJfRkxBRzsKKwljbWQubGVuID0gc2l6ZW9mKHNwZWN0cnVtKTsKKwlzcGVjdHJ1bS5sZW4gPSBjcHVfdG9fbGUxNihjbWQubGVuIC0gc2l6ZW9mKHNwZWN0cnVtLmxlbikpOworCisJaWYgKGlsX2lzX2Fzc29jaWF0ZWQoaWwpKQorCQlzcGVjdHJ1bS5zdGFydF90aW1lID0KKwkJICAgIGlsX2FkZF9iZWFjb25fdGltZShpbCwgaWwtPl8zOTQ1Lmxhc3RfYmVhY29uX3RpbWUsIGFkZF90aW1lLAorCQkJCSAgICAgICBsZTE2X3RvX2NwdShjdHgtPnRpbWluZy4KKwkJCQkJCSAgIGJlYWNvbl9pbnRlcnZhbCkpOworCWVsc2UKKwkJc3BlY3RydW0uc3RhcnRfdGltZSA9IDA7CisKKwlzcGVjdHJ1bS5jaGFubmVsc1swXS5kdXJhdGlvbiA9IGNwdV90b19sZTMyKGR1cmF0aW9uICogVElNRV9VTklUKTsKKwlzcGVjdHJ1bS5jaGFubmVsc1swXS5jaGFubmVsID0gcGFyYW1zLT5jaGFubmVsOworCXNwZWN0cnVtLmNoYW5uZWxzWzBdLnR5cGUgPSB0eXBlOworCWlmIChjdHgtPmFjdGl2ZS5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykKKwkJc3BlY3RydW0uZmxhZ3MgfD0KKwkJICAgIFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSyB8CisJCSAgICBSWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0s7CisKKwlyYyA9IGlsX3NlbmRfY21kX3N5bmMoaWwsICZjbWQpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJcGt0ID0gKHN0cnVjdCBpbF9yeF9wa3QgKiljbWQucmVwbHlfcGFnZTsKKwlpZiAocGt0LT5oZHIuZmxhZ3MgJiBJTF9DTURfRkFJTEVEX01TSykgeworCQlJTF9FUlIoIkJhZCByZXR1cm4gZnJvbSBOX1JYX09OX0FTU09DIGNvbW1hbmRcbiIpOworCQlyYyA9IC1FSU87CisJfQorCisJc3BlY3RydW1fcmVzcF9zdGF0dXMgPSBsZTE2X3RvX2NwdShwa3QtPnUuc3BlY3RydW0uc3RhdHVzKTsKKwlzd2l0Y2ggKHNwZWN0cnVtX3Jlc3Bfc3RhdHVzKSB7CisJY2FzZSAwOgkJLyogQ29tbWFuZCB3aWxsIGJlIGhhbmRsZWQgKi8KKwkJaWYgKHBrdC0+dS5zcGVjdHJ1bS5pZCAhPSAweGZmKSB7CisJCQlEX0lORk8oIlJlcGxhY2VkIGV4aXN0aW5nIG1lYXN1cmVtZW50OiAlZFxuIiwKKwkJCSAgICAgICBwa3QtPnUuc3BlY3RydW0uaWQpOworCQkJaWwtPm1lYXN1cmVtZW50X3N0YXR1cyAmPSB+TUVBU1VSRU1FTlRfUkVBRFk7CisJCX0KKwkJaWwtPm1lYXN1cmVtZW50X3N0YXR1cyB8PSBNRUFTVVJFTUVOVF9BQ1RJVkU7CisJCXJjID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIDE6CQkvKiBDb21tYW5kIHdpbGwgbm90IGJlIGhhbmRsZWQgKi8KKwkJcmMgPSAtRUFHQUlOOworCQlicmVhazsKKwl9CisKKwlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQucmVwbHlfcGFnZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfaGRsX2FsaXZlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX2FsaXZlX3Jlc3AgKnBhbGl2ZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpwd29yazsKKworCXBhbGl2ZSA9ICZwa3QtPnUuYWxpdmVfZnJhbWU7CisKKwlEX0lORk8oIkFsaXZlIHVjb2RlIHN0YXR1cyAweCUwOFggcmV2aXNpb24gIiAiMHglMDFYIDB4JTAxWFxuIiwKKwkgICAgICAgcGFsaXZlLT5pc192YWxpZCwgcGFsaXZlLT52ZXJfdHlwZSwgcGFsaXZlLT52ZXJfc3VidHlwZSk7CisKKwlpZiAocGFsaXZlLT52ZXJfc3VidHlwZSA9PSBJTklUSUFMSVpFX1NVQlRZUEUpIHsKKwkJRF9JTkZPKCJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOworCQltZW1jcHkoJmlsLT5jYXJkX2FsaXZlX2luaXQsICZwa3QtPnUuYWxpdmVfZnJhbWUsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FsaXZlX3Jlc3ApKTsKKwkJcHdvcmsgPSAmaWwtPmluaXRfYWxpdmVfc3RhcnQ7CisJfSBlbHNlIHsKKwkJRF9JTkZPKCJSdW50aW1lIEFsaXZlIHJlY2VpdmVkLlxuIik7CisJCW1lbWNweSgmaWwtPmNhcmRfYWxpdmUsICZwa3QtPnUuYWxpdmVfZnJhbWUsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FsaXZlX3Jlc3ApKTsKKwkJcHdvcmsgPSAmaWwtPmFsaXZlX3N0YXJ0OworCQlpbDM5NDVfZGlzYWJsZV9ldmVudHMoaWwpOworCX0KKworCS8qIFdlIGRlbGF5IHRoZSBBTElWRSByZXNwb25zZSBieSA1bXMgdG8KKwkgKiBnaXZlIHRoZSBIVyBSRiBLaWxsIHRpbWUgdG8gYWN0aXZhdGUuLi4gKi8KKwlpZiAocGFsaXZlLT5pc192YWxpZCA9PSBVQ09ERV9WQUxJRF9PSykKKwkJcXVldWVfZGVsYXllZF93b3JrKGlsLT53b3JrcXVldWUsIHB3b3JrLCBtc2Vjc190b19qaWZmaWVzKDUpKTsKKwllbHNlCisJCUlMX1dBUk4oInVDb2RlIGRpZCBub3QgcmVzcG9uZCBPSy5cbiIpOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2hkbF9hZGRfc3RhKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisjZW5kaWYKKworCURfUlgoIlJlY2VpdmVkIENfQUREX1NUQTogMHglMDJYXG4iLCBwa3QtPnUuc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9oZGxfYmVhY29uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsMzk0NV9iZWFjb25fbm90aWYgKmJlYWNvbiA9ICYocGt0LT51LmJlYWNvbl9zdGF0dXMpOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXU4IHJhdGUgPSBiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLnJhdGU7CisKKwlEX1JYKCJiZWFjb24gc3RhdHVzICV4IHJldHJpZXMgJWQgaXNzICVkICIgInRzZiAlZCAlZCByYXRlICVkXG4iLAorCSAgICAgbGUzMl90b19jcHUoYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5zdGF0dXMpICYgVFhfU1RBVFVTX01TSywKKwkgICAgIGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIuZmFpbHVyZV9mcmFtZSwKKwkgICAgIGxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKSwKKwkgICAgIGxlMzJfdG9fY3B1KGJlYWNvbi0+aGlnaF90c2YpLCBsZTMyX3RvX2NwdShiZWFjb24tPmxvd190c2YpLCByYXRlKTsKKyNlbmRpZgorCisJaWwtPmlic3NfbWFuYWdlciA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKTsKKworfQorCisvKiBIYW5kbGUgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUgdGhhdCBjYXJkJ3MgcG93ZXIgc3RhdGUgaXMgY2hhbmdpbmcKKyAqIGR1ZSB0byBzb2Z0d2FyZSwgaGFyZHdhcmUsIG9yIGNyaXRpY2FsIHRlbXBlcmF0dXJlIFJGS0lMTCAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9oZGxfY2FyZF9zdGF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXUzMiBmbGFncyA9IGxlMzJfdG9fY3B1KHBrdC0+dS5jYXJkX3N0YXRlX25vdGlmLmZsYWdzKTsKKwl1bnNpZ25lZCBsb25nIHN0YXR1cyA9IGlsLT5zdGF0dXM7CisKKwlJTF9XQVJOKCJDYXJkIHN0YXRlIHJlY2VpdmVkOiBIVzolcyBTVzolc1xuIiwKKwkJKGZsYWdzICYgSFdfQ0FSRF9ESVNBQkxFRCkgPyAiS2lsbCIgOiAiT24iLAorCQkoZmxhZ3MgJiBTV19DQVJEX0RJU0FCTEVEKSA/ICJLaWxsIiA6ICJPbiIpOworCisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9TRVQsIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7CisKKwlpZiAoZmxhZ3MgJiBIV19DQVJEX0RJU0FCTEVEKQorCQlzZXRfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCWVsc2UKKwkJY2xlYXJfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCisJaWxfc2Nhbl9jYW5jZWwoaWwpOworCisJaWYgKCh0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZzdGF0dXMpICE9CisJICAgICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKSkpCisJCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUoaWwtPmh3LT53aXBoeSwKKwkJCQkJICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKSk7CisJZWxzZQorCQl3YWtlX3VwKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKK30KKworLyoqCisgKiBpbDM5NDVfc2V0dXBfaGFuZGxlcnMgLSBJbml0aWFsaXplIFJ4IGhhbmRsZXIgY2FsbGJhY2tzCisgKgorICogU2V0dXAgdGhlIFJYIGhhbmRsZXJzIGZvciBlYWNoIG9mIHRoZSByZXBseSB0eXBlcyBzZW50IGZyb20gdGhlIHVDb2RlCisgKiB0byB0aGUgaG9zdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoYWlucyBpbnRvIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBmaWxlcyBmb3IgdGhlbSB0byBzZXR1cAorICogYW55IGhhcmR3YXJlIHNwZWNpZmljIGhhbmRsZXJzIGFzIHdlbGwuCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfc2V0dXBfaGFuZGxlcnMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT5oYW5kbGVyc1tOX0FMSVZFXSA9IGlsMzk0NV9oZGxfYWxpdmU7CisJaWwtPmhhbmRsZXJzW0NfQUREX1NUQV0gPSBpbDM5NDVfaGRsX2FkZF9zdGE7CisJaWwtPmhhbmRsZXJzW05fRVJST1JdID0gaWxfaGRsX2Vycm9yOworCWlsLT5oYW5kbGVyc1tOX0NIQU5ORUxfU1dJVENIXSA9IGlsX2hkbF9jc2E7CisJaWwtPmhhbmRsZXJzW05fU1BFQ1RSVU1fTUVBU1VSRU1FTlRdID0gaWxfaGRsX3NwZWN0cnVtX21lYXN1cmVtZW50OworCWlsLT5oYW5kbGVyc1tOX1BNX1NMRUVQXSA9IGlsX2hkbF9wbV9zbGVlcDsKKwlpbC0+aGFuZGxlcnNbTl9QTV9ERUJVR19TVEFUU10gPSBpbF9oZGxfcG1fZGVidWdfc3RhdHM7CisJaWwtPmhhbmRsZXJzW05fQkVBQ09OXSA9IGlsMzk0NV9oZGxfYmVhY29uOworCisJLyoKKwkgKiBUaGUgc2FtZSBoYW5kbGVyIGlzIHVzZWQgZm9yIGJvdGggdGhlIFJFUExZIHRvIGEgZGlzY3JldGUKKwkgKiBzdGF0cyByZXF1ZXN0IGZyb20gdGhlIGhvc3QgYXMgd2VsbCBhcyBmb3IgdGhlIHBlcmlvZGljCisJICogc3RhdHMgbm90aWZpY2F0aW9ucyAoYWZ0ZXIgcmVjZWl2ZWQgYmVhY29ucykgZnJvbSB0aGUgdUNvZGUuCisJICovCisJaWwtPmhhbmRsZXJzW0NfU1RBVFNdID0gaWwzOTQ1X2hkbF9jX3N0YXRzOworCWlsLT5oYW5kbGVyc1tOX1NUQVRTXSA9IGlsMzk0NV9oZGxfc3RhdHM7CisKKwlpbF9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKGlsKTsKKwlpbC0+aGFuZGxlcnNbTl9DQVJEX1NUQVRFXSA9IGlsMzk0NV9oZGxfY2FyZF9zdGF0ZTsKKworCS8qIFNldCB1cCBoYXJkd2FyZSBzcGVjaWZpYyBSeCBoYW5kbGVycyAqLworCWlsMzk0NV9od19oYW5kbGVyX3NldHVwKGlsKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFJYLUZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoKKyAqIFJ4IHRoZW9yeSBvZiBvcGVyYXRpb24KKyAqCisgKiBUaGUgaG9zdCBhbGxvY2F0ZXMgMzIgRE1BIHRhcmdldCBhZGRyZXNzZXMgYW5kIHBhc3NlcyB0aGUgaG9zdCBhZGRyZXNzCisgKiB0byB0aGUgZmlybXdhcmUgYXQgcmVnaXN0ZXIgSUxfUkZEU19UQkxfTE9XRVIgKyBOICogUkZEX1NJWkUgd2hlcmUgTiBpcworICogMCB0byAzMQorICoKKyAqIFJ4IFF1ZXVlIEluZGV4ZXMKKyAqIFRoZSBob3N0L2Zpcm13YXJlIHNoYXJlIHR3byBpZHggcmVnaXN0ZXJzIGZvciBtYW5hZ2luZyB0aGUgUnggYnVmZmVycy4KKyAqCisgKiBUaGUgUkVBRCBpZHggbWFwcyB0byB0aGUgZmlyc3QgcG9zaXRpb24gdGhhdCB0aGUgZmlybXdhcmUgbWF5IGJlIHdyaXRpbmcKKyAqIHRvIC0tIHRoZSBkcml2ZXIgY2FuIHJlYWQgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGlzIHBvc2l0aW9uIGFuZCBnZXQKKyAqIGdvb2QgZGF0YS4KKyAqIFRoZSBSRUFEIGlkeCBpcyBtYW5hZ2VkIGJ5IHRoZSBmaXJtd2FyZSBvbmNlIHRoZSBjYXJkIGlzIGVuYWJsZWQuCisgKgorICogVGhlIFdSSVRFIGlkeCBtYXBzIHRvIHRoZSBsYXN0IHBvc2l0aW9uIHRoZSBkcml2ZXIgaGFzIHJlYWQgZnJvbSAtLSB0aGUKKyAqIHBvc2l0aW9uIHByZWNlZGluZyBXUklURSBpcyB0aGUgbGFzdCBzbG90IHRoZSBmaXJtd2FyZSBjYW4gcGxhY2UgYSBwYWNrZXQuCisgKgorICogVGhlIHF1ZXVlIGlzIGVtcHR5IChubyBnb29kIGRhdGEpIGlmIFdSSVRFID0gUkVBRCAtIDEsIGFuZCBpcyBmdWxsIGlmCisgKiBXUklURSA9IFJFQUQuCisgKgorICogRHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgaG9zdCBzZXRzIHVwIHRoZSBSRUFEIHF1ZXVlIHBvc2l0aW9uIHRvIHRoZSBmaXJzdAorICogSURYIHBvc2l0aW9uLCBhbmQgV1JJVEUgdG8gdGhlIGxhc3QgKFJFQUQgLSAxIHdyYXBwZWQpCisgKgorICogV2hlbiB0aGUgZmlybXdhcmUgcGxhY2VzIGEgcGFja2V0IGluIGEgYnVmZmVyLCBpdCB3aWxsIGFkdmFuY2UgdGhlIFJFQUQgaWR4CisgKiBhbmQgZmlyZSB0aGUgUlggaW50ZXJydXB0LiAgVGhlIGRyaXZlciBjYW4gdGhlbiBxdWVyeSB0aGUgUkVBRCBpZHggYW5kCisgKiBwcm9jZXNzIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZSwgbW92aW5nIHRoZSBXUklURSBpZHggZm9yd2FyZCBhcyBpdAorICogcmVzZXRzIHRoZSBSeCBxdWV1ZSBidWZmZXJzIHdpdGggbmV3IG1lbW9yeS4KKyAqCisgKiBUaGUgbWFuYWdlbWVudCBpbiB0aGUgZHJpdmVyIGlzIGFzIGZvbGxvd3M6CisgKiArIEEgbGlzdCBvZiBwcmUtYWxsb2NhdGVkIFNLQnMgaXMgc3RvcmVkIGluIGl3bC0+cnhxLT5yeF9mcmVlLiAgV2hlbgorICogICBpd2wtPnJ4cS0+ZnJlZV9jb3VudCBkcm9wcyB0byBvciBiZWxvdyBSWF9MT1dfV0FURVJNQVJLLCB3b3JrIGlzIHNjaGVkdWxlZAorICogICB0byByZXBsZW5pc2ggdGhlIGl3bC0+cnhxLT5yeF9mcmVlLgorICogKyBJbiBpbDM5NDVfcnhfcmVwbGVuaXNoIChzY2hlZHVsZWQpIGlmICdwcm9jZXNzZWQnICE9ICdyZWFkJyB0aGVuIHRoZQorICogICBpd2wtPnJ4cSBpcyByZXBsZW5pc2hlZCBhbmQgdGhlIFJFQUQgSURYIGlzIHVwZGF0ZWQgKHVwZGF0aW5nIHRoZQorICogICAncHJvY2Vzc2VkJyBhbmQgJ3JlYWQnIGRyaXZlciBpZHhlcyBhcyB3ZWxsKQorICogKyBBIHJlY2VpdmVkIHBhY2tldCBpcyBwcm9jZXNzZWQgYW5kIGhhbmRlZCB0byB0aGUga2VybmVsIG5ldHdvcmsgc3RhY2ssCisgKiAgIGRldGFjaGVkIGZyb20gdGhlIGl3bC0+cnhxLiAgVGhlIGRyaXZlciAncHJvY2Vzc2VkJyBpZHggaXMgdXBkYXRlZC4KKyAqICsgVGhlIEhvc3QvRmlybXdhcmUgaXdsLT5yeHEgaXMgcmVwbGVuaXNoZWQgYXQgdGFza2xldCB0aW1lIGZyb20gdGhlIHJ4X2ZyZWUKKyAqICAgbGlzdC4gSWYgdGhlcmUgYXJlIG5vIGFsbG9jYXRlZCBidWZmZXJzIGluIGl3bC0+cnhxLT5yeF9mcmVlLCB0aGUgUkVBRAorICogICBJRFggaXMgbm90IGluY3JlbWVudGVkIGFuZCBpd2wtPnN0YXR1cyhSWF9TVEFMTEVEKSBpcyBzZXQuICBJZiB0aGVyZQorICogICB3ZXJlIGVub3VnaCBmcmVlIGJ1ZmZlcnMgYW5kIFJYX1NUQUxMRUQgaXMgc2V0IGl0IGlzIGNsZWFyZWQuCisgKgorICoKKyAqIERyaXZlciBzZXF1ZW5jZToKKyAqCisgKiBpbDM5NDVfcnhfcmVwbGVuaXNoKCkgICAgIFJlcGxlbmlzaGVzIHJ4X2ZyZWUgbGlzdCBmcm9tIHJ4X3VzZWQsIGFuZCBjYWxscworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWwzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2sKKyAqIGlsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrKCkgTW92ZXMgYXZhaWxhYmxlIGJ1ZmZlcnMgZnJvbSByeF9mcmVlIGludG8gUngKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLCB1cGRhdGVzIGZpcm13YXJlIHBvaW50ZXJzLCBhbmQgdXBkYXRlcworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFdSSVRFIGlkeC4gIElmIGluc3VmZmljaWVudCByeF9mcmVlIGJ1ZmZlcnMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUsIHNjaGVkdWxlcyBpbDM5NDVfcnhfcmVwbGVuaXNoCisgKgorICogLS0gZW5hYmxlIGludGVycnVwdHMgLS0KKyAqIElTUiAtIGlsMzk0NV9yeCgpICAgICAgICAgRGV0YWNoIGlsX3J4X2J1ZnMgZnJvbSBwb29sIHVwIHRvIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVBRCBJRFgsIGRldGFjaGluZyB0aGUgU0tCIGZyb20gdGhlIHBvb2wuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZlcyB0aGUgcGFja2V0IGJ1ZmZlciBmcm9tIHF1ZXVlIHRvIHJ4X3VzZWQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxscyBpbDM5NDVfcnhfcXVldWVfcmVzdG9jayB0byByZWZpbGwgYW55IGVtcHR5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90cy4KKyAqIC4uLgorICoKKyAqLworCisvKioKKyAqIGlsMzk0NV9kbWFfYWRkcjJyYmRfcHRyIC0gY29udmVydCBhIERNQSBhZGRyZXNzIHRvIGEgdUNvZGUgcmVhZCBidWZmZXIgcHRyCisgKi8KK3N0YXRpYyBpbmxpbmUgX19sZTMyCitpbDM5NDVfZG1hX2FkZHIycmJkX3B0cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIGRtYV9hZGRyX3QgZG1hX2FkZHIpCit7CisJcmV0dXJuIGNwdV90b19sZTMyKCh1MzIpIGRtYV9hZGRyKTsKK30KKworLyoqCisgKiBpbDM5NDVfcnhfcXVldWVfcmVzdG9jayAtIHJlZmlsbCBSWCBxdWV1ZSBmcm9tIHByZS1hbGxvY2F0ZWQgcG9vbAorICoKKyAqIElmIHRoZXJlIGFyZSBzbG90cyBpbiB0aGUgUlggcXVldWUgdGhhdCBuZWVkIHRvIGJlIHJlc3RvY2tlZCwKKyAqIGFuZCB3ZSBoYXZlIGZyZWUgcHJlLWFsbG9jYXRlZCBidWZmZXJzLCBmaWxsIHRoZSByYW5rcyBhcyBtdWNoCisgKiBhcyB3ZSBjYW4sIHB1bGxpbmcgZnJvbSByeF9mcmVlLgorICoKKyAqIFRoaXMgbW92ZXMgdGhlICd3cml0ZScgaWR4IGZvcndhcmQgdG8gY2F0Y2ggdXAgd2l0aCAncHJvY2Vzc2VkJywgYW5kCisgKiBhbHNvIHVwZGF0ZXMgdGhlIG1lbW9yeSBhZGRyZXNzIGluIHRoZSBmaXJtd2FyZSB0byByZWZlcmVuY2UgdGhlIG5ldworICogdGFyZ2V0IGJ1ZmZlci4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSA9ICZpbC0+cnhxOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJc3RydWN0IGlsX3J4X2J1ZiAqcnhiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdyaXRlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCXdyaXRlID0gcnhxLT53cml0ZSAmIH4weDc7CisJd2hpbGUgKGlsX3J4X3F1ZXVlX3NwYWNlKHJ4cSkgPiAwICYmIHJ4cS0+ZnJlZV9jb3VudCkgeworCQkvKiBHZXQgbmV4dCBmcmVlIFJ4IGJ1ZmZlciwgcmVtb3ZlIGZyb20gZnJlZSBsaXN0ICovCisJCWVsZW1lbnQgPSByeHEtPnJ4X2ZyZWUubmV4dDsKKwkJcnhiID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWxfcnhfYnVmLCBsaXN0KTsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisKKwkJLyogUG9pbnQgdG8gUnggYnVmZmVyIHZpYSBuZXh0IFJCRCBpbiBjaXJjdWxhciBidWZmZXIgKi8KKwkJcnhxLT5iZFtyeHEtPndyaXRlXSA9CisJCSAgICBpbDM5NDVfZG1hX2FkZHIycmJkX3B0cihpbCwgcnhiLT5wYWdlX2RtYSk7CisJCXJ4cS0+cXVldWVbcnhxLT53cml0ZV0gPSByeGI7CisJCXJ4cS0+d3JpdGUgPSAocnhxLT53cml0ZSArIDEpICYgUlhfUVVFVUVfTUFTSzsKKwkJcnhxLT5mcmVlX2NvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCS8qIElmIHRoZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciBwb29sIGlzIGRyb3BwaW5nIGxvdywgc2NoZWR1bGUgdG8KKwkgKiByZWZpbGwgaXQgKi8KKwlpZiAocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUkspCisJCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5yeF9yZXBsZW5pc2gpOworCisJLyogSWYgd2UndmUgYWRkZWQgbW9yZSBzcGFjZSBmb3IgdGhlIGZpcm13YXJlIHRvIHBsYWNlIGRhdGEsIHRlbGwgaXQuCisJICogSW5jcmVtZW50IGRldmljZSdzIHdyaXRlIHBvaW50ZXIgaW4gbXVsdGlwbGVzIG9mIDguICovCisJaWYgKHJ4cS0+d3JpdGVfYWN0dWFsICE9IChyeHEtPndyaXRlICYgfjB4NykgfHwKKwkgICAgYWJzKHJ4cS0+d3JpdGUgLSByeHEtPnJlYWQpID4gNykgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCXJ4cS0+bmVlZF91cGRhdGUgPSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJaWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihpbCwgcnhxKTsKKwl9Cit9CisKKy8qKgorICogaWwzOTQ1X3J4X3JlcGxlbmlzaCAtIE1vdmUgYWxsIHVzZWQgcGFja2V0IGZyb20gcnhfdXNlZCB0byByeF9mcmVlCisgKgorICogV2hlbiBtb3ZpbmcgdG8gcnhfZnJlZSBhbiBTS0IgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2xvdC4KKyAqCisgKiBBbHNvIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHZpYSBpbDM5NDVfcnhfcXVldWVfcmVzdG9jay4KKyAqIFRoaXMgaXMgY2FsbGVkIGFzIGEgc2NoZWR1bGVkIHdvcmsgaXRlbSAoZXhjZXB0IGZvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24pCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfcnhfYWxsb2NhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCBnZnBfdCBwcmlvcml0eSkKK3sKKwlzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSA9ICZpbC0+cnhxOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJc3RydWN0IGlsX3J4X2J1ZiAqcnhiOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZ2ZwX3QgZ2ZwX21hc2sgPSBwcmlvcml0eTsKKworCXdoaWxlICgxKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAobGlzdF9lbXB0eSgmcnhxLT5yeF91c2VkKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm47CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKHJ4cS0+ZnJlZV9jb3VudCA+IFJYX0xPV19XQVRFUk1BUkspCisJCQlnZnBfbWFzayB8PSBfX0dGUF9OT1dBUk47CisKKwkJaWYgKGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA+IDApCisJCQlnZnBfbWFzayB8PSBfX0dGUF9DT01QOworCisJCS8qIEFsbG9jIGEgbmV3IHJlY2VpdmUgYnVmZmVyICovCisJCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnBfbWFzaywgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKKwkJaWYgKCFwYWdlKSB7CisJCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJCURfSU5GTygiRmFpbGVkIHRvIGFsbG9jYXRlIFNLQiBidWZmZXIuXG4iKTsKKwkJCWlmIChyeHEtPmZyZWVfY291bnQgPD0gUlhfTE9XX1dBVEVSTUFSSyAmJgorCQkJICAgIG5ldF9yYXRlbGltaXQoKSkKKwkJCQlJTF9FUlIoIkZhaWxlZCB0byBhbGxvY2F0ZSBTS0IgYnVmZmVyIHdpdGggJTB4LiIKKwkJCQkgICAgICAgIk9ubHkgJXUgZnJlZSBidWZmZXJzIHJlbWFpbmluZy5cbiIsCisJCQkJICAgICAgIHByaW9yaXR5LCByeHEtPmZyZWVfY291bnQpOworCQkJLyogV2UgZG9uJ3QgcmVzY2hlZHVsZSByZXBsZW5pc2ggd29yayBoZXJlIC0tIHdlIHdpbGwKKwkJCSAqIGNhbGwgdGhlIHJlc3RvY2sgbWV0aG9kIGFuZCBpZiBpdCBzdGlsbCBuZWVkcworCQkJICogbW9yZSBidWZmZXJzIGl0IHdpbGwgc2NoZWR1bGUgcmVwbGVuaXNoICovCisJCQlicmVhazsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQkJX19mcmVlX3BhZ2VzKHBhZ2UsIGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7CisJCQlyZXR1cm47CisJCX0KKwkJZWxlbWVudCA9IHJ4cS0+cnhfdXNlZC5uZXh0OworCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpbF9yeF9idWYsIGxpc3QpOworCQlsaXN0X2RlbChlbGVtZW50KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJcnhiLT5wYWdlID0gcGFnZTsKKwkJLyogR2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2YgUkIvU0tCICovCisJCXJ4Yi0+cGFnZV9kbWEgPQorCQkgICAgcGNpX21hcF9wYWdlKGlsLT5wY2lfZGV2LCBwYWdlLCAwLAorCQkJCSBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAorCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X2ZyZWUpOworCQlyeHEtPmZyZWVfY291bnQrKzsKKwkJaWwtPmFsbG9jX3J4Yl9wYWdlKys7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJfQorfQorCit2b2lkCitpbDM5NDVfcnhfcXVldWVfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF9mcmVlKTsKKwlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF91c2VkKTsKKwkvKiBGaWxsIHRoZSByeF91c2VkIHF1ZXVlIHdpdGggX2FsbF8gb2YgdGhlIFJ4IGJ1ZmZlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUlhfRlJFRV9CVUZGRVJTICsgUlhfUVVFVUVfU0laRTsgaSsrKSB7CisJCS8qIEluIHRoZSByZXNldCBmdW5jdGlvbiwgdGhlc2UgYnVmZmVycyBtYXkgaGF2ZSBiZWVuIGFsbG9jYXRlZAorCQkgKiB0byBhbiBTS0IsIHNvIHdlIG5lZWQgdG8gdW5tYXAgYW5kIGZyZWUgcG90ZW50aWFsIHN0b3JhZ2UgKi8KKwkJaWYgKHJ4cS0+cG9vbFtpXS5wYWdlICE9IE5VTEwpIHsKKwkJCXBjaV91bm1hcF9wYWdlKGlsLT5wY2lfZGV2LCByeHEtPnBvb2xbaV0ucGFnZV9kbWEsCisJCQkJICAgICAgIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCisJCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7CisJCQlfX2lsX2ZyZWVfcGFnZXMoaWwsIHJ4cS0+cG9vbFtpXS5wYWdlKTsKKwkJCXJ4cS0+cG9vbFtpXS5wYWdlID0gTlVMTDsKKwkJfQorCQlsaXN0X2FkZF90YWlsKCZyeHEtPnBvb2xbaV0ubGlzdCwgJnJ4cS0+cnhfdXNlZCk7CisJfQorCisJLyogU2V0IHVzIHNvIHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgYW5kIHVzZWQgYWxsIGJ1ZmZlcnMsIGJ1dCBoYXZlCisJICogbm90IHJlc3RvY2tlZCB0aGUgUnggcXVldWUgd2l0aCBmcmVzaCBidWZmZXJzICovCisJcnhxLT5yZWFkID0gcnhxLT53cml0ZSA9IDA7CisJcnhxLT53cml0ZV9hY3R1YWwgPSAwOworCXJ4cS0+ZnJlZV9jb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQKK2lsMzk0NV9yeF9yZXBsZW5pc2godm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpbDM5NDVfcnhfYWxsb2NhdGUoaWwsIEdGUF9LRVJORUwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWwzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2soaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfcnhfcmVwbGVuaXNoX25vdyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwzOTQ1X3J4X2FsbG9jYXRlKGlsLCBHRlBfQVRPTUlDKTsKKworCWlsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrKGlsKTsKK30KKworLyogQXNzdW1lcyB0aGF0IHRoZSBza2IgZmllbGQgb2YgdGhlIGJ1ZmZlcnMgaW4gJ3Bvb2wnIGlzIGtlcHQgYWNjdXJhdGUuCisgKiBJZiBhbiBTS0IgaGFzIGJlZW4gZGV0YWNoZWQsIHRoZSBQT09MIG5lZWRzIHRvIGhhdmUgaXRzIFNLQiBzZXQgdG8gTlVMTAorICogVGhpcyBmcmVlIHJvdXRpbmUgd2Fsa3MgdGhlIGxpc3Qgb2YgUE9PTCBlbnRyaWVzIGFuZCBpZiBTS0IgaXMgc2V0IHRvCisgKiBub24gTlVMTCBpdCBpcyB1bm1hcHBlZCBhbmQgZnJlZWQKKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9yeF9xdWV1ZV9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX1NJWkUgKyBSWF9GUkVFX0JVRkZFUlM7IGkrKykgeworCQlpZiAocnhxLT5wb29sW2ldLnBhZ2UgIT0gTlVMTCkgeworCQkJcGNpX3VubWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5wYWdlX2RtYSwKKwkJCQkgICAgICAgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCV9faWxfZnJlZV9wYWdlcyhpbCwgcnhxLT5wb29sW2ldLnBhZ2UpOworCQkJcnhxLT5wb29sW2ldLnBhZ2UgPSBOVUxMOworCQl9CisJfQorCisJZG1hX2ZyZWVfY29oZXJlbnQoJmlsLT5wY2lfZGV2LT5kZXYsIDQgKiBSWF9RVUVVRV9TSVpFLCByeHEtPmJkLAorCQkJICByeHEtPmJkX2RtYSk7CisJZG1hX2ZyZWVfY29oZXJlbnQoJmlsLT5wY2lfZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgaWxfcmJfc3RhdHVzKSwKKwkJCSAgcnhxLT5yYl9zdHRzLCByeHEtPnJiX3N0dHNfZG1hKTsKKwlyeHEtPmJkID0gTlVMTDsKKwlyeHEtPnJiX3N0dHMgPSBOVUxMOworfQorCisvKiBDb252ZXJ0IGxpbmVhciBzaWduYWwtdG8tbm9pc2UgcmF0aW8gaW50byBkQiAqLworc3RhdGljIHU4IHJhdGlvMmRCWzEwMF0gPSB7CisvKgkgMCAgIDEgICAyICAgMyAgIDQgICA1ICAgNiAgIDcgICA4ICAgOSAqLworCTAsIDAsIDYsIDEwLCAxMiwgMTQsIDE2LCAxNywgMTgsIDE5LAkvKiAwMCAtIDA5ICovCisJMjAsIDIxLCAyMiwgMjIsIDIzLCAyMywgMjQsIDI1LCAyNiwgMjYsCS8qIDEwIC0gMTkgKi8KKwkyNiwgMjYsIDI2LCAyNywgMjcsIDI4LCAyOCwgMjgsIDI5LCAyOSwJLyogMjAgLSAyOSAqLworCTI5LCAzMCwgMzAsIDMwLCAzMSwgMzEsIDMxLCAzMSwgMzIsIDMyLAkvKiAzMCAtIDM5ICovCisJMzIsIDMyLCAzMiwgMzMsIDMzLCAzMywgMzMsIDMzLCAzNCwgMzQsCS8qIDQwIC0gNDkgKi8KKwkzNCwgMzQsIDM0LCAzNCwgMzUsIDM1LCAzNSwgMzUsIDM1LCAzNSwJLyogNTAgLSA1OSAqLworCTM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM2LCAzNywgMzcsIDM3LAkvKiA2MCAtIDY5ICovCisJMzcsIDM3LCAzNywgMzcsIDM3LCAzOCwgMzgsIDM4LCAzOCwgMzgsCS8qIDcwIC0gNzkgKi8KKwkzOCwgMzgsIDM4LCAzOCwgMzgsIDM5LCAzOSwgMzksIDM5LCAzOSwJLyogODAgLSA4OSAqLworCTM5LCAzOSwgMzksIDM5LCAzOSwgNDAsIDQwLCA0MCwgNDAsIDQwCS8qIDkwIC0gOTkgKi8KK307CisKKy8qIENhbGN1bGF0ZXMgYSByZWxhdGl2ZSBkQiB2YWx1ZSBmcm9tIGEgcmF0aW8gb2YgbGluZWFyCisgKiAgIChpLmUuIG5vdCBkQikgc2lnbmFsIGxldmVscy4KKyAqIENvbnZlcnNpb24gYXNzdW1lcyB0aGF0IGxldmVscyBhcmUgdm9sdGFnZXMgKDIwKmxvZyksIG5vdCBwb3dlcnMgKDEwKmxvZykuICovCitpbnQKK2lsMzk0NV9jYWxjX2RiX2Zyb21fcmF0aW8oaW50IHNpZ19yYXRpbykKK3sKKwkvKiAxMDAwOjEgb3IgaGlnaGVyIGp1c3QgcmVwb3J0IGFzIDYwIGRCICovCisJaWYgKHNpZ19yYXRpbyA+PSAxMDAwKQorCQlyZXR1cm4gNjA7CisKKwkvKiAxMDA6MSBvciBoaWdoZXIsIGRpdmlkZSBieSAxMCBhbmQgdXNlIHRhYmxlLAorCSAqICAgYWRkIDIwIGRCIHRvIG1ha2UgdXAgZm9yIGRpdmlkZSBieSAxMCAqLworCWlmIChzaWdfcmF0aW8gPj0gMTAwKQorCQlyZXR1cm4gMjAgKyAoaW50KXJhdGlvMmRCW3NpZ19yYXRpbyAvIDEwXTsKKworCS8qIFdlIHNob3VsZG4ndCBzZWUgdGhpcyAqLworCWlmIChzaWdfcmF0aW8gPCAxKQorCQlyZXR1cm4gMDsKKworCS8qIFVzZSB0YWJsZSBmb3IgcmF0aW9zIDE6MSAtIDk5OjEgKi8KKwlyZXR1cm4gKGludClyYXRpbzJkQltzaWdfcmF0aW9dOworfQorCisvKioKKyAqIGlsMzk0NV9yeF9oYW5kbGUgLSBNYWluIGVudHJ5IGZ1bmN0aW9uIGZvciByZWNlaXZpbmcgcmVzcG9uc2VzIGZyb20gdUNvZGUKKyAqCisgKiBVc2VzIHRoZSBpbC0+aGFuZGxlcnMgY2FsbGJhY2sgZnVuY3Rpb24gYXJyYXkgdG8gaW52b2tlCisgKiB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlcnMsIGluY2x1ZGluZyBjb21tYW5kIHJlc3BvbnNlcywKKyAqIGZyYW1lLXJlY2VpdmVkIG5vdGlmaWNhdGlvbnMsIGFuZCBvdGhlciBub3RpZmljYXRpb25zLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3J4X2hhbmRsZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4X2J1ZiAqcnhiOworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdDsKKwlzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSA9ICZpbC0+cnhxOworCXUzMiByLCBpOworCWludCByZWNsYWltOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTggZmlsbF9yeCA9IDA7CisJdTMyIGNvdW50ID0gODsKKwlpbnQgdG90YWxfZW1wdHkgPSAwOworCisJLyogdUNvZGUncyByZWFkIGlkeCAoc3RvcmVkIGluIHNoYXJlZCBEUkFNKSBpbmRpY2F0ZXMgdGhlIGxhc3QgUngKKwkgKiBidWZmZXIgdGhhdCB0aGUgZHJpdmVyIG1heSBwcm9jZXNzIChsYXN0IGJ1ZmZlciBmaWxsZWQgYnkgdWNvZGUpLiAqLworCXIgPSBsZTE2X3RvX2NwdShyeHEtPnJiX3N0dHMtPmNsb3NlZF9yYl9udW0pICYgMHgwRkZGOworCWkgPSByeHEtPnJlYWQ7CisKKwkvKiBjYWxjdWxhdGUgdG90YWwgZnJhbWVzIG5lZWQgdG8gYmUgcmVzdG9jayBhZnRlciBoYW5kbGluZyBSWCAqLworCXRvdGFsX2VtcHR5ID0gciAtIHJ4cS0+d3JpdGVfYWN0dWFsOworCWlmICh0b3RhbF9lbXB0eSA8IDApCisJCXRvdGFsX2VtcHR5ICs9IFJYX1FVRVVFX1NJWkU7CisKKwlpZiAodG90YWxfZW1wdHkgPiAoUlhfUVVFVUVfU0laRSAvIDIpKQorCQlmaWxsX3J4ID0gMTsKKwkvKiBSeCBpbnRlcnJ1cHQsIGJ1dCBub3RoaW5nIHNlbnQgZnJvbSB1Q29kZSAqLworCWlmIChpID09IHIpCisJCURfUlgoInIgPSAlZCwgaSA9ICVkXG4iLCByLCBpKTsKKworCXdoaWxlIChpICE9IHIpIHsKKwkJaW50IGxlbjsKKworCQlyeGIgPSByeHEtPnF1ZXVlW2ldOworCisJCS8qIElmIGFuIFJYQiBkb2Vzbid0IGhhdmUgYSBSeCBxdWV1ZSBzbG90IGFzc29jaWF0ZWQgd2l0aCBpdCwKKwkJICogdGhlbiBhIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIHRoZSBxdWV1ZSByZWZpbGxpbmcKKwkJICogcm91dGluZXMgLS0gY2F0Y2ggaXQgaGVyZSAqLworCQlCVUdfT04ocnhiID09IE5VTEwpOworCisJCXJ4cS0+cXVldWVbaV0gPSBOVUxMOworCisJCXBjaV91bm1hcF9wYWdlKGlsLT5wY2lfZGV2LCByeGItPnBhZ2VfZG1hLAorCQkJICAgICAgIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCisJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJcGt0ID0gcnhiX2FkZHIocnhiKTsKKworCQlsZW4gPSBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIElMX1JYX0ZSQU1FX1NJWkVfTVNLOworCQlsZW4gKz0gc2l6ZW9mKHUzMik7CS8qIGFjY291bnQgZm9yIHN0YXR1cyB3b3JkICovCisKKwkJLyogUmVjbGFpbSBhIGNvbW1hbmQgYnVmZmVyIG9ubHkgaWYgdGhpcyBwYWNrZXQgaXMgYSByZXNwb25zZQorCQkgKiAgIHRvIGEgKGRyaXZlci1vcmlnaW5hdGVkKSBjb21tYW5kLgorCQkgKiBJZiB0aGUgcGFja2V0IChlLmcuIFJ4IGZyYW1lKSBvcmlnaW5hdGVkIGZyb20gdUNvZGUsCisJCSAqICAgdGhlcmUgaXMgbm8gY29tbWFuZCBidWZmZXIgdG8gcmVjbGFpbS4KKwkJICogVWNvZGUgc2hvdWxkIHNldCBTRVFfUlhfRlJBTUUgYml0IGlmIHVjb2RlLW9yaWdpbmF0ZWQsCisJCSAqICAgYnV0IGFwcGFyZW50bHkgYSBmZXcgZG9uJ3QgZ2V0IHNldDsgY2F0Y2ggdGhlbSBoZXJlLiAqLworCQlyZWNsYWltID0gIShwa3QtPmhkci5zZXF1ZW5jZSAmIFNFUV9SWF9GUkFNRSkgJiYKKwkJICAgIHBrdC0+aGRyLmNtZCAhPSBOX1NUQVRTICYmIHBrdC0+aGRyLmNtZCAhPSBDX1RYOworCisJCS8qIEJhc2VkIG9uIHR5cGUgb2YgY29tbWFuZCByZXNwb25zZSBvciBub3RpZmljYXRpb24sCisJCSAqICAgaGFuZGxlIHRob3NlIHRoYXQgbmVlZCBoYW5kbGluZyB2aWEgZnVuY3Rpb24gaW4KKwkJICogICBoYW5kbGVycyB0YWJsZS4gIFNlZSBpbDM5NDVfc2V0dXBfaGFuZGxlcnMoKSAqLworCQlpZiAoaWwtPmhhbmRsZXJzW3BrdC0+aGRyLmNtZF0pIHsKKwkJCURfUlgoInIgPSAlZCwgaSA9ICVkLCAlcywgMHglMDJ4XG4iLCByLCBpLAorCQkJICAgICBpbF9nZXRfY21kX3N0cmluZyhwa3QtPmhkci5jbWQpLCBwa3QtPmhkci5jbWQpOworCQkJaWwtPmlzcl9zdGF0cy5oYW5kbGVyc1twa3QtPmhkci5jbWRdKys7CisJCQlpbC0+aGFuZGxlcnNbcGt0LT5oZHIuY21kXSAoaWwsIHJ4Yik7CisJCX0gZWxzZSB7CisJCQkvKiBObyBoYW5kbGluZyBuZWVkZWQgKi8KKwkJCURfUlgoInIgJWQgaSAlZCBObyBoYW5kbGVyIG5lZWRlZCBmb3IgJXMsIDB4JTAyeFxuIiwgciwKKwkJCSAgICAgaSwgaWxfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwgcGt0LT5oZHIuY21kKTsKKwkJfQorCisJCS8qCisJCSAqIFhYWDogQWZ0ZXIgaGVyZSwgd2Ugc2hvdWxkIGFsd2F5cyBjaGVjayByeGItPnBhZ2UKKwkJICogYWdhaW5zdCBOVUxMIGJlZm9yZSB0b3VjaGluZyBpdCBvciBpdHMgdmlydHVhbAorCQkgKiBtZW1vcnkgKHBrdCkuIEJlY2F1c2Ugc29tZSBoYW5kbGVyIG1pZ2h0IGhhdmUKKwkJICogYWxyZWFkeSB0YWtlbiBvciBmcmVlZCB0aGUgcGFnZXMuCisJCSAqLworCisJCWlmIChyZWNsYWltKSB7CisJCQkvKiBJbnZva2UgYW55IGNhbGxiYWNrcywgdHJhbnNmZXIgdGhlIGJ1ZmZlciB0byBjYWxsZXIsCisJCQkgKiBhbmQgZmlyZSBvZmYgdGhlIChwb3NzaWJseSkgYmxvY2tpbmcgaWxfc2VuZF9jbWQoKQorCQkJICogYXMgd2UgcmVjbGFpbSB0aGUgZHJpdmVyIGNvbW1hbmQgcXVldWUgKi8KKwkJCWlmIChyeGItPnBhZ2UpCisJCQkJaWxfdHhfY21kX2NvbXBsZXRlKGlsLCByeGIpOworCQkJZWxzZQorCQkJCUlMX1dBUk4oIkNsYWltIG51bGwgcnhiP1xuIik7CisJCX0KKworCQkvKiBSZXVzZSB0aGUgcGFnZSBpZiBwb3NzaWJsZS4gRm9yIG5vdGlmaWNhdGlvbiBwYWNrZXRzIGFuZAorCQkgKiBTS0JzIHRoYXQgZmFpbCB0byBSeCBjb3JyZWN0bHksIGFkZCB0aGVtIGJhY2sgaW50byB0aGUKKwkJICogcnhfZnJlZSBsaXN0IGZvciByZXVzZSBsYXRlci4gKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQlpZiAocnhiLT5wYWdlICE9IE5VTEwpIHsKKwkJCXJ4Yi0+cGFnZV9kbWEgPQorCQkJICAgIHBjaV9tYXBfcGFnZShpbC0+cGNpX2RldiwgcnhiLT5wYWdlLCAwLAorCQkJCQkgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMuCisJCQkJCSByeF9wYWdlX29yZGVyLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJbGlzdF9hZGRfdGFpbCgmcnhiLT5saXN0LCAmcnhxLT5yeF9mcmVlKTsKKwkJCXJ4cS0+ZnJlZV9jb3VudCsrOworCQl9IGVsc2UKKwkJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfdXNlZCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJaSA9IChpICsgMSkgJiBSWF9RVUVVRV9NQVNLOworCQkvKiBJZiB0aGVyZSBhcmUgYSBsb3Qgb2YgdW51c2VkIGZyYW1lcywKKwkJICogcmVzdG9jayB0aGUgUnggcXVldWUgc28gdWNvZGUgd29uJ3QgYXNzZXJ0LiAqLworCQlpZiAoZmlsbF9yeCkgeworCQkJY291bnQrKzsKKwkJCWlmIChjb3VudCA+PSA4KSB7CisJCQkJcnhxLT5yZWFkID0gaTsKKwkJCQlpbDM5NDVfcnhfcmVwbGVuaXNoX25vdyhpbCk7CisJCQkJY291bnQgPSAwOworCQkJfQorCQl9CisJfQorCisJLyogQmFja3RyYWNrIG9uZSBlbnRyeSAqLworCXJ4cS0+cmVhZCA9IGk7CisJaWYgKGZpbGxfcngpCisJCWlsMzk0NV9yeF9yZXBsZW5pc2hfbm93KGlsKTsKKwllbHNlCisJCWlsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrKGlsKTsKK30KKworLyogY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGZsdXNoIGFueSBzY2hlZHVsZWQgdGFza2xldCAqLworc3RhdGljIGlubGluZSB2b2lkCitpbDM5NDVfc3luY2hyb25pemVfaXJxKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiB3YWl0IHRvIG1ha2Ugc3VyZSB3ZSBmbHVzaCBwZW5kaW5nIHRhc2tsZXQgKi8KKwlzeW5jaHJvbml6ZV9pcnEoaWwtPnBjaV9kZXYtPmlycSk7CisJdGFza2xldF9raWxsKCZpbC0+aXJxX3Rhc2tsZXQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitpbDM5NDVfZGVzY19sb29rdXAoaW50IGkpCit7CisJc3dpdGNoIChpKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gIkZBSUwiOworCWNhc2UgMjoKKwkJcmV0dXJuICJCQURfUEFSQU0iOworCWNhc2UgMzoKKwkJcmV0dXJuICJCQURfQ0hFQ0tTVU0iOworCWNhc2UgNDoKKwkJcmV0dXJuICJOTUlfSU5URVJSVVBUIjsKKwljYXNlIDU6CisJCXJldHVybiAiU1lTQVNTRVJUIjsKKwljYXNlIDY6CisJCXJldHVybiAiRkFUQUxfRVJST1IiOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7Cit9CisKKyNkZWZpbmUgRVJST1JfU1RBUlRfT0ZGU0VUICAoMSAqIHNpemVvZih1MzIpKQorI2RlZmluZSBFUlJPUl9FTEVNX1NJWkUgICAgICg3ICogc2l6ZW9mKHUzMikpCisKK3ZvaWQKK2lsMzk0NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXUzMiBpOworCXUzMiBkZXNjLCB0aW1lLCBjb3VudCwgYmFzZSwgZGF0YTE7CisJdTMyIGJsaW5rMSwgYmxpbmsyLCBpbGluazEsIGlsaW5rMjsKKworCWJhc2UgPSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZS5lcnJvcl9ldmVudF90YWJsZV9wdHIpOworCisJaWYgKCFpbDM5NDVfaHdfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgeworCQlJTF9FUlIoIk5vdCB2YWxpZCBlcnJvciBsb2cgcG9pbnRlciAweCUwOFhcbiIsIGJhc2UpOworCQlyZXR1cm47CisJfQorCisJY291bnQgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlKTsKKworCWlmIChFUlJPUl9TVEFSVF9PRkZTRVQgPD0gY291bnQgKiBFUlJPUl9FTEVNX1NJWkUpIHsKKwkJSUxfRVJSKCJTdGFydCBJV0wgRXJyb3IgTG9nIER1bXA6XG4iKTsKKwkJSUxfRVJSKCJTdGF0dXM6IDB4JTA4bFgsIGNvdW50OiAlZFxuIiwgaWwtPnN0YXR1cywgY291bnQpOworCX0KKworCUlMX0VSUigiRGVzYyAgICAgICBUaW1lICAgICAgIGFzcnRQQyAgYmxpbmsyICIKKwkgICAgICAgImlsaW5rMSAgbm1pUEMgICBMaW5lXG4iKTsKKwlmb3IgKGkgPSBFUlJPUl9TVEFSVF9PRkZTRVQ7CisJICAgICBpIDwgKGNvdW50ICogRVJST1JfRUxFTV9TSVpFKSArIEVSUk9SX1NUQVJUX09GRlNFVDsKKwkgICAgIGkgKz0gRVJST1JfRUxFTV9TSVpFKSB7CisJCWRlc2MgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgaSk7CisJCXRpbWUgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgaSArIDEgKiBzaXplb2YodTMyKSk7CisJCWJsaW5rMSA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyBpICsgMiAqIHNpemVvZih1MzIpKTsKKwkJYmxpbmsyID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIGkgKyAzICogc2l6ZW9mKHUzMikpOworCQlpbGluazEgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgaSArIDQgKiBzaXplb2YodTMyKSk7CisJCWlsaW5rMiA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyBpICsgNSAqIHNpemVvZih1MzIpKTsKKwkJZGF0YTEgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgaSArIDYgKiBzaXplb2YodTMyKSk7CisKKwkJSUxfRVJSKCIlLTEzcyAoMHglWCkgJTAxMHUgMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYICV1XG5cbiIsCisJCSAgICAgICBpbDM5NDVfZGVzY19sb29rdXAoZGVzYyksIGRlc2MsIHRpbWUsIGJsaW5rMSwgYmxpbmsyLAorCQkgICAgICAgaWxpbmsxLCBpbGluazIsIGRhdGExKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfaXJxX3Rhc2tsZXQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXUzMiBpbnRhLCBoYW5kbGVkID0gMDsKKwl1MzIgaW50YV9maDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXUzMiBpbnRhX21hc2s7CisjZW5kaWYKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogQWNrL2NsZWFyL3Jlc2V0IHBlbmRpbmcgdUNvZGUgaW50ZXJydXB0cy4KKwkgKiBOb3RlOiAgU29tZSBiaXRzIGluIENTUl9JTlQgYXJlICJPUiIgb2YgYml0cyBpbiBDU1JfRkhfSU5UX1NUQVRVUywKKwkgKiAgYW5kIHdpbGwgY2xlYXIgb25seSB3aGVuIENTUl9GSF9JTlRfU1RBVFVTIGdldHMgY2xlYXJlZC4gKi8KKwlpbnRhID0gX2lsX3JkKGlsLCBDU1JfSU5UKTsKKwlfaWxfd3IoaWwsIENTUl9JTlQsIGludGEpOworCisJLyogQWNrL2NsZWFyL3Jlc2V0IHBlbmRpbmcgZmxvdy1oYW5kbGVyIChETUEpIGludGVycnVwdHMuCisJICogQW55IG5ldyBpbnRlcnJ1cHRzIHRoYXQgaGFwcGVuIGFmdGVyIHRoaXMsIGVpdGhlciB3aGlsZSB3ZSdyZQorCSAqIGluIHRoaXMgdGFza2xldCwgb3IgbGF0ZXIsIHdpbGwgc2hvdyB1cCBpbiBuZXh0IElTUi90YXNrbGV0LiAqLworCWludGFfZmggPSBfaWxfcmQoaWwsIENTUl9GSF9JTlRfU1RBVFVTKTsKKwlfaWxfd3IoaWwsIENTUl9GSF9JTlRfU1RBVFVTLCBpbnRhX2ZoKTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgSUxfRExfSVNSKSB7CisJCS8qIGp1c3QgZm9yIGRlYnVnICovCisJCWludGFfbWFzayA9IF9pbF9yZChpbCwgQ1NSX0lOVF9NQVNLKTsKKwkJRF9JU1IoImludGEgMHglMDh4LCBlbmFibGVkIDB4JTA4eCwgZmggMHglMDh4XG4iLCBpbnRhLAorCQkgICAgICBpbnRhX21hc2ssIGludGFfZmgpOworCX0KKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIFNpbmNlIENTUl9JTlQgYW5kIENTUl9GSF9JTlRfU1RBVFVTIHJlYWRzIGFuZCBjbGVhcnMgYXJlIG5vdAorCSAqIGF0b21pYywgbWFrZSBzdXJlIHRoYXQgaW50YSBjb3ZlcnMgYWxsIHRoZSBpbnRlcnJ1cHRzIHRoYXQKKwkgKiB3ZSd2ZSBkaXNjb3ZlcmVkLCBldmVuIGlmIEZIIGludGVycnVwdCBjYW1lIGluIGp1c3QgYWZ0ZXIKKwkgKiByZWFkaW5nIENTUl9JTlQuICovCisJaWYgKGludGFfZmggJiBDU1IzOV9GSF9JTlRfUlhfTUFTSykKKwkJaW50YSB8PSBDU1JfSU5UX0JJVF9GSF9SWDsKKwlpZiAoaW50YV9maCAmIENTUjM5X0ZIX0lOVF9UWF9NQVNLKQorCQlpbnRhIHw9IENTUl9JTlRfQklUX0ZIX1RYOworCisJLyogTm93IHNlcnZpY2UgYWxsIGludGVycnVwdCBiaXRzIGRpc2NvdmVyZWQgYWJvdmUuICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9IV19FUlIpIHsKKwkJSUxfRVJSKCJIYXJkd2FyZSBlcnJvciBkZXRlY3RlZC4gIFJlc3RhcnRpbmcuXG4iKTsKKworCQkvKiBUZWxsIHRoZSBkZXZpY2UgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMgKi8KKwkJaWxfZGlzYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKworCQlpbC0+aXNyX3N0YXRzLmh3Kys7CisJCWlsX2lycV9oYW5kbGVfZXJyb3IoaWwpOworCisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfSFdfRVJSOworCisJCXJldHVybjsKKwl9CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJaWYgKGlsX2dldF9kZWJ1Z19sZXZlbChpbCkgJiAoSUxfRExfSVNSKSkgeworCQkvKiBOSUMgZmlyZXMgdGhpcywgYnV0IHdlIGRvbid0IHVzZSBpdCwgcmVkdW5kYW50IHdpdGggV0FLRVVQICovCisJCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfU0NEKSB7CisJCQlEX0lTUigiU2NoZWR1bGVyIGZpbmlzaGVkIHRvIHRyYW5zbWl0ICIKKwkJCSAgICAgICJ0aGUgZnJhbWUvZnJhbWVzLlxuIik7CisJCQlpbC0+aXNyX3N0YXRzLnNjaCsrOworCQl9CisKKwkJLyogQWxpdmUgbm90aWZpY2F0aW9uIHZpYSBSeCBpbnRlcnJ1cHQgd2lsbCBkbyB0aGUgcmVhbCB3b3JrICovCisJCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQUxJVkUpIHsKKwkJCURfSVNSKCJBbGl2ZSBpbnRlcnJ1cHRcbiIpOworCQkJaWwtPmlzcl9zdGF0cy5hbGl2ZSsrOworCQl9CisJfQorI2VuZGlmCisJLyogU2FmZWx5IGlnbm9yZSB0aGVzZSBiaXRzIGZvciBkZWJ1ZyBjaGVja3MgYmVsb3cgKi8KKwlpbnRhICY9IH4oQ1NSX0lOVF9CSVRfU0NEIHwgQ1NSX0lOVF9CSVRfQUxJVkUpOworCisJLyogRXJyb3IgZGV0ZWN0ZWQgYnkgdUNvZGUgKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX1NXX0VSUikgeworCQlJTF9FUlIoIk1pY3JvY29kZSBTVyBlcnJvciBkZXRlY3RlZC4gIiAiUmVzdGFydGluZyAweCVYLlxuIiwKKwkJICAgICAgIGludGEpOworCQlpbC0+aXNyX3N0YXRzLnN3Kys7CisJCWlsX2lycV9oYW5kbGVfZXJyb3IoaWwpOworCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX1NXX0VSUjsKKwl9CisKKwkvKiB1Q29kZSB3YWtlcyB1cCBhZnRlciBwb3dlci1kb3duIHNsZWVwICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9XQUtFVVApIHsKKwkJRF9JU1IoIldha2V1cCBpbnRlcnJ1cHRcbiIpOworCQlpbF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKGlsLCAmaWwtPnJ4cSk7CisJCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCAmaWwtPnR4cVswXSk7CisJCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCAmaWwtPnR4cVsxXSk7CisJCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCAmaWwtPnR4cVsyXSk7CisJCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCAmaWwtPnR4cVszXSk7CisJCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCAmaWwtPnR4cVs0XSk7CisJCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCAmaWwtPnR4cVs1XSk7CisKKwkJaWwtPmlzcl9zdGF0cy53YWtldXArKzsKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9XQUtFVVA7CisJfQorCisJLyogQWxsIHVDb2RlIGNvbW1hbmQgcmVzcG9uc2VzLCBpbmNsdWRpbmcgVHggY29tbWFuZCByZXNwb25zZXMsCisJICogUnggInJlc3BvbnNlcyIgKGZyYW1lLXJlY2VpdmVkIG5vdGlmaWNhdGlvbiksIGFuZCBvdGhlcgorCSAqIG5vdGlmaWNhdGlvbnMgZnJvbSB1Q29kZSBjb21lIHRocm91Z2ggaGVyZSovCisJaWYgKGludGEgJiAoQ1NSX0lOVF9CSVRfRkhfUlggfCBDU1JfSU5UX0JJVF9TV19SWCkpIHsKKwkJaWwzOTQ1X3J4X2hhbmRsZShpbCk7CisJCWlsLT5pc3Jfc3RhdHMucngrKzsKKwkJaGFuZGxlZCB8PSAoQ1NSX0lOVF9CSVRfRkhfUlggfCBDU1JfSU5UX0JJVF9TV19SWCk7CisJfQorCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9GSF9UWCkgeworCQlEX0lTUigiVHggaW50ZXJydXB0XG4iKTsKKwkJaWwtPmlzcl9zdGF0cy50eCsrOworCisJCV9pbF93cihpbCwgQ1NSX0ZIX0lOVF9TVEFUVVMsICgxIDw8IDYpKTsKKwkJaWxfd3IoaWwsIEZIMzlfVENTUl9DUkVESVQoRkgzOV9TUlZDX0NITkwpLCAweDApOworCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX0ZIX1RYOworCX0KKworCWlmIChpbnRhICYgfmhhbmRsZWQpIHsKKwkJSUxfRVJSKCJVbmhhbmRsZWQgSU5UQSBiaXRzIDB4JTA4eFxuIiwgaW50YSAmIH5oYW5kbGVkKTsKKwkJaWwtPmlzcl9zdGF0cy51bmhhbmRsZWQrKzsKKwl9CisKKwlpZiAoaW50YSAmIH5pbC0+aW50YV9tYXNrKSB7CisJCUlMX1dBUk4oIkRpc2FibGVkIElOVEEgYml0cyAweCUwOHggd2VyZSBwZW5kaW5nXG4iLAorCQkJaW50YSAmIH5pbC0+aW50YV9tYXNrKTsKKwkJSUxfV0FSTigiICAgd2l0aCBpbnRhX2ZoID0gMHglMDh4XG4iLCBpbnRhX2ZoKTsKKwl9CisKKwkvKiBSZS1lbmFibGUgYWxsIGludGVycnVwdHMgKi8KKwkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaXNhYmxlZCBieSBpcnEgKi8KKwlpZiAodGVzdF9iaXQoU19JTlRfRU5BQkxFRCwgJmlsLT5zdGF0dXMpKQorCQlpbF9lbmFibGVfaW50ZXJydXB0cyhpbCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIChJTF9ETF9JU1IpKSB7CisJCWludGEgPSBfaWxfcmQoaWwsIENTUl9JTlQpOworCQlpbnRhX21hc2sgPSBfaWxfcmQoaWwsIENTUl9JTlRfTUFTSyk7CisJCWludGFfZmggPSBfaWxfcmQoaWwsIENTUl9GSF9JTlRfU1RBVFVTKTsKKwkJRF9JU1IoIkVuZCBpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eCwgIgorCQkgICAgICAiZmxhZ3MgMHglMDhseFxuIiwgaW50YSwgaW50YV9tYXNrLCBpbnRhX2ZoLCBmbGFncyk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4oc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCQkgICAgIHU4IGlzX2FjdGl2ZSwgdTggbl9wcm9iZXMsCisJCQkgICAgIHN0cnVjdCBpbDM5NDVfc2Nhbl9jaGFubmVsICpzY2FuX2NoLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCXUxNiBwYXNzaXZlX2R3ZWxsID0gMDsKKwl1MTYgYWN0aXZlX2R3ZWxsID0gMDsKKwlpbnQgYWRkZWQsIGk7CisKKwlzYmFuZCA9IGlsX2dldF9od19tb2RlKGlsLCBiYW5kKTsKKwlpZiAoIXNiYW5kKQorCQlyZXR1cm4gMDsKKworCWFjdGl2ZV9kd2VsbCA9IGlsX2dldF9hY3RpdmVfZHdlbGxfdGltZShpbCwgYmFuZCwgbl9wcm9iZXMpOworCXBhc3NpdmVfZHdlbGwgPSBpbF9nZXRfcGFzc2l2ZV9kd2VsbF90aW1lKGlsLCBiYW5kLCB2aWYpOworCisJaWYgKHBhc3NpdmVfZHdlbGwgPD0gYWN0aXZlX2R3ZWxsKQorCQlwYXNzaXZlX2R3ZWxsID0gYWN0aXZlX2R3ZWxsICsgMTsKKworCWZvciAoaSA9IDAsIGFkZGVkID0gMDsgaSA8IGlsLT5zY2FuX3JlcXVlc3QtPm5fY2hhbm5lbHM7IGkrKykgeworCQljaGFuID0gaWwtPnNjYW5fcmVxdWVzdC0+Y2hhbm5lbHNbaV07CisKKwkJaWYgKGNoYW4tPmJhbmQgIT0gYmFuZCkKKwkJCWNvbnRpbnVlOworCisJCXNjYW5fY2gtPmNoYW5uZWwgPSBjaGFuLT5od192YWx1ZTsKKworCQljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgYmFuZCwgc2Nhbl9jaC0+Y2hhbm5lbCk7CisJCWlmICghaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkgeworCQkJRF9TQ0FOKCJDaGFubmVsICVkIGlzIElOVkFMSUQgZm9yIHRoaXMgYmFuZC5cbiIsCisJCQkgICAgICAgc2Nhbl9jaC0+Y2hhbm5lbCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCXNjYW5fY2gtPmFjdGl2ZV9kd2VsbCA9IGNwdV90b19sZTE2KGFjdGl2ZV9kd2VsbCk7CisJCXNjYW5fY2gtPnBhc3NpdmVfZHdlbGwgPSBjcHVfdG9fbGUxNihwYXNzaXZlX2R3ZWxsKTsKKwkJLyogSWYgcGFzc2l2ZSAsIHNldCB1cCBmb3IgYXV0by1zd2l0Y2gKKwkJICogIGFuZCB1c2UgbG9uZyBhY3RpdmVfZHdlbGwgdGltZS4KKwkJICovCisJCWlmICghaXNfYWN0aXZlIHx8IGlsX2lzX2NoYW5uZWxfcGFzc2l2ZShjaF9pbmZvKSB8fAorCQkgICAgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSkgeworCQkJc2Nhbl9jaC0+dHlwZSA9IDA7CS8qIHBhc3NpdmUgKi8KKwkJCWlmIChJTF9VQ09ERV9BUEkoaWwtPnVjb2RlX3ZlcikgPT0gMSkKKwkJCQlzY2FuX2NoLT5hY3RpdmVfZHdlbGwgPQorCQkJCSAgICBjcHVfdG9fbGUxNihwYXNzaXZlX2R3ZWxsIC0gMSk7CisJCX0gZWxzZSB7CisJCQlzY2FuX2NoLT50eXBlID0gMTsJLyogYWN0aXZlICovCisJCX0KKworCQkvKiBTZXQgZGlyZWN0IHByb2JlIGJpdHMuIFRoZXNlIG1heSBiZSB1c2VkIGJvdGggZm9yIGFjdGl2ZQorCQkgKiBzY2FuIGNoYW5uZWxzIChwcm9iZXMgZ2V0cyBzZW50IHJpZ2h0IGF3YXkpLAorCQkgKiBvciBmb3IgcGFzc2l2ZSBjaGFubmVscyAocHJvYmVzIGdldCBzZSBzZW50IG9ubHkgYWZ0ZXIKKwkJICogaGVhcmluZyBjbGVhciBSeCBwYWNrZXQpLiovCisJCWlmIChJTF9VQ09ERV9BUEkoaWwtPnVjb2RlX3ZlcikgPj0gMikgeworCQkJaWYgKG5fcHJvYmVzKQorCQkJCXNjYW5fY2gtPnR5cGUgfD0gSUwzOV9TQ0FOX1BST0JFX01BU0sobl9wcm9iZXMpOworCQl9IGVsc2UgeworCQkJLyogdUNvZGUgdjEgZG9lcyBub3QgYWxsb3cgc2V0dGluZyBkaXJlY3QgcHJvYmUgYml0cyBvbgorCQkJICogcGFzc2l2ZSBjaGFubmVsLiAqLworCQkJaWYgKChzY2FuX2NoLT50eXBlICYgMSkgJiYgbl9wcm9iZXMpCisJCQkJc2Nhbl9jaC0+dHlwZSB8PSBJTDM5X1NDQU5fUFJPQkVfTUFTSyhuX3Byb2Jlcyk7CisJCX0KKworCQkvKiBTZXQgdHhwb3dlciBsZXZlbHMgdG8gZGVmYXVsdHMgKi8KKwkJc2Nhbl9jaC0+dHBjLmRzcF9hdHRlbiA9IDExMDsKKwkJLyogc2Nhbl9wd3JfaW5mby0+dHBjLmRzcF9hdHRlbjsgKi8KKworCQkvKnNjYW5fcHdyX2luZm8tPnRwYy50eF9nYWluOyAqLworCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJc2Nhbl9jaC0+dHBjLnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMyA8PCAzKSkgfCAzOworCQllbHNlIHsKKwkJCXNjYW5fY2gtPnRwYy50eF9nYWluID0gKCgxIDw8IDUpIHwgKDUgPDwgMykpOworCQkJLyogTk9URTogaWYgd2Ugd2VyZSBkb2luZyA2TWIgT0ZETSBmb3Igc2NhbnMgd2UnZCB1c2UKKwkJCSAqIHBvd2VyIGxldmVsOgorCQkJICogc2Nhbl9jaC0+dHBjLnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMiA8PCAzKSkgfCAzOworCQkJICovCisJCX0KKworCQlEX1NDQU4oIlNjYW5uaW5nICVkIFslcyAlZF1cbiIsIHNjYW5fY2gtPmNoYW5uZWwsCisJCSAgICAgICAoc2Nhbl9jaC0+dHlwZSAmIDEpID8gIkFDVElWRSIgOiAiUEFTU0lWRSIsCisJCSAgICAgICAoc2Nhbl9jaC0+dHlwZSAmIDEpID8gYWN0aXZlX2R3ZWxsIDogcGFzc2l2ZV9kd2VsbCk7CisKKwkJc2Nhbl9jaCsrOworCQlhZGRlZCsrOworCX0KKworCURfU0NBTigidG90YWwgY2hhbm5lbHMgdG8gc2NhbiAlZFxuIiwgYWRkZWQpOworCXJldHVybiBhZGRlZDsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9pbml0X2h3X3JhdGVzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UX0xFR0FDWTsgaSsrKSB7CisJCXJhdGVzW2ldLmJpdHJhdGUgPSBpbDM5NDVfcmF0ZXNbaV0uaWVlZSAqIDU7CisJCXJhdGVzW2ldLmh3X3ZhbHVlID0gaTsJLyogUmF0ZSBzY2FsaW5nIHdpbGwgd29yayBvbiBpZHhlcyAqLworCQlyYXRlc1tpXS5od192YWx1ZV9zaG9ydCA9IGk7CisJCXJhdGVzW2ldLmZsYWdzID0gMDsKKwkJaWYgKGkgPiBJTDM5X0xBU1RfT0ZETV9SQVRFIHx8IGkgPCBJTF9GSVJTVF9PRkRNX1JBVEUpIHsKKwkJCS8qCisJCQkgKiBJZiBDQ0sgIT0gMU0gdGhlbiBzZXQgc2hvcnQgcHJlYW1ibGUgcmF0ZSBmbGFnLgorCQkJICovCisJCQlyYXRlc1tpXS5mbGFncyB8PQorCQkJICAgIChpbDM5NDVfcmF0ZXNbaV0ucGxjcCA9PQorCQkJICAgICAxMCkgPyAwIDogSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEU7CisJCX0KKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB1Q29kZSBkb3dubG9hZCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAoraWwzOTQ1X2RlYWxsb2NfdWNvZGVfcGNpKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfY29kZSk7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2RhdGEpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9kYXRhX2JhY2t1cCk7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2luaXQpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9pbml0X2RhdGEpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9ib290KTsKK30KKworLyoqCisgKiBpbDM5NDVfdmVyaWZ5X2luc3RfZnVsbCAtIHZlcmlmeSBydW50aW1lIHVDb2RlIGltYWdlIGluIGNhcmQgdnMuIGhvc3QsCisgKiAgICAgbG9va2luZyBhdCBhbGwgZGF0YS4KKyAqLworc3RhdGljIGludAoraWwzOTQ1X3ZlcmlmeV9pbnN0X2Z1bGwoc3RydWN0IGlsX3ByaXYgKmlsLCBfX2xlMzIgKiBpbWFnZSwgdTMyIGxlbikKK3sKKwl1MzIgdmFsOworCXUzMiBzYXZlX2xlbiA9IGxlbjsKKwlpbnQgcmMgPSAwOworCXUzMiBlcnJjbnQ7CisKKwlEX0lORk8oInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKworCWlsX3dyKGlsLCBIQlVTX1RBUkdfTUVNX1JBRERSLCBJTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKKworCWVycmNudCA9IDA7CisJZm9yICg7IGxlbiA+IDA7IGxlbiAtPSBzaXplb2YodTMyKSwgaW1hZ2UrKykgeworCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KKwkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCisJCSAqIGlmIElMX0RMX0lPIGlzIHNldCAqLworCQl2YWwgPSBfaWxfcmQoaWwsIEhCVVNfVEFSR19NRU1fUkRBVCk7CisJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgeworCQkJSUxfRVJSKCJ1Q29kZSBJTlNUIHNlY3Rpb24gaXMgaW52YWxpZCBhdCAiCisJCQkgICAgICAgIm9mZnNldCAweCV4LCBpcyAweCV4LCBzL2IgMHgleFxuIiwKKwkJCSAgICAgICBzYXZlX2xlbiAtIGxlbiwgdmFsLCBsZTMyX3RvX2NwdSgqaW1hZ2UpKTsKKwkJCXJjID0gLUVJTzsKKwkJCWVycmNudCsrOworCQkJaWYgKGVycmNudCA+PSAyMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZXJyY250KQorCQlEX0lORk8oInVjb2RlIGltYWdlIGluIElOU1RSVUNUSU9OIG1lbW9yeSBpcyBnb29kXG4iKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpbDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKKyAqICAgdXNpbmcgc2FtcGxlIGRhdGEgMTAwIGJ5dGVzIGFwYXJ0LiAgSWYgdGhlc2Ugc2FtcGxlIHBvaW50cyBhcmUgZ29vZCwKKyAqICAgaXQncyBhIHByZXR0eSBnb29kIGJldCB0aGF0IGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGVtIGlzIGdvb2QsIHRvby4KKyAqLworc3RhdGljIGludAoraWwzOTQ1X3ZlcmlmeV9pbnN0X3NwYXJzZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIF9fbGUzMiAqIGltYWdlLCB1MzIgbGVuKQoreworCXUzMiB2YWw7CisJaW50IHJjID0gMDsKKwl1MzIgZXJyY250ID0gMDsKKwl1MzIgaTsKKworCURfSU5GTygidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAxMDAsIGltYWdlICs9IDEwMCAvIHNpemVvZih1MzIpKSB7CisJCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLworCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKKwkJICogaWYgSUxfRExfSU8gaXMgc2V0ICovCisJCWlsX3dyKGlsLCBIQlVTX1RBUkdfTUVNX1JBRERSLCBpICsgSUwzOV9SVENfSU5TVF9MT1dFUl9CT1VORCk7CisJCXZhbCA9IF9pbF9yZChpbCwgSEJVU19UQVJHX01FTV9SREFUKTsKKwkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7CisjaWYgMAkJCQkvKiBFbmFibGUgdGhpcyBpZiB5b3Ugd2FudCB0byBzZWUgZGV0YWlscyAqLworCQkJSUxfRVJSKCJ1Q29kZSBJTlNUIHNlY3Rpb24gaXMgaW52YWxpZCBhdCAiCisJCQkgICAgICAgIm9mZnNldCAweCV4LCBpcyAweCV4LCBzL2IgMHgleFxuIiwgaSwgdmFsLAorCQkJICAgICAgICppbWFnZSk7CisjZW5kaWYKKwkJCXJjID0gLUVJTzsKKwkJCWVycmNudCsrOworCQkJaWYgKGVycmNudCA+PSAzKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKioKKyAqIGlsMzk0NV92ZXJpZnlfdWNvZGUgLSBkZXRlcm1pbmUgd2hpY2ggaW5zdHJ1Y3Rpb24gaW1hZ2UgaXMgaW4gU1JBTSwKKyAqICAgIGFuZCB2ZXJpZnkgaXRzIGNvbnRlbnRzCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV92ZXJpZnlfdWNvZGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCV9fbGUzMiAqaW1hZ2U7CisJdTMyIGxlbjsKKwlpbnQgcmMgPSAwOworCisJLyogVHJ5IGJvb3RzdHJhcCAqLworCWltYWdlID0gKF9fbGUzMiAqKSBpbC0+dWNvZGVfYm9vdC52X2FkZHI7CisJbGVuID0gaWwtPnVjb2RlX2Jvb3QubGVuOworCXJjID0gaWwzOTQ1X3ZlcmlmeV9pbnN0X3NwYXJzZShpbCwgaW1hZ2UsIGxlbik7CisJaWYgKHJjID09IDApIHsKKwkJRF9JTkZPKCJCb290c3RyYXAgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgaW5pdGlhbGl6ZSAqLworCWltYWdlID0gKF9fbGUzMiAqKSBpbC0+dWNvZGVfaW5pdC52X2FkZHI7CisJbGVuID0gaWwtPnVjb2RlX2luaXQubGVuOworCXJjID0gaWwzOTQ1X3ZlcmlmeV9pbnN0X3NwYXJzZShpbCwgaW1hZ2UsIGxlbik7CisJaWYgKHJjID09IDApIHsKKwkJRF9JTkZPKCJJbml0aWFsaXplIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVHJ5IHJ1bnRpbWUvcHJvdG9jb2wgKi8KKwlpbWFnZSA9IChfX2xlMzIgKikgaWwtPnVjb2RlX2NvZGUudl9hZGRyOworCWxlbiA9IGlsLT51Y29kZV9jb2RlLmxlbjsKKwlyYyA9IGlsMzk0NV92ZXJpZnlfaW5zdF9zcGFyc2UoaWwsIGltYWdlLCBsZW4pOworCWlmIChyYyA9PSAwKSB7CisJCURfSU5GTygiUnVudGltZSB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7CisJCXJldHVybiAwOworCX0KKworCUlMX0VSUigiTk8gVkFMSUQgVUNPREUgSU1BR0UgSU4gSU5TVFJVQ1RJT04gU1JBTSEhXG4iKTsKKworCS8qIFNpbmNlIG5vdGhpbmcgc2VlbXMgdG8gbWF0Y2gsIHNob3cgZmlyc3Qgc2V2ZXJhbCBkYXRhIGVudHJpZXMgaW4KKwkgKiBpbnN0cnVjdGlvbiBTUkFNLCBzbyBtYXliZSB2aXN1YWwgaW5zcGVjdGlvbiB3aWxsIGdpdmUgYSBjbHVlLgorCSAqIFNlbGVjdGlvbiBvZiBib290c3RyYXAgaW1hZ2UgKHZzLiBvdGhlciBpbWFnZXMpIGlzIGFyYml0cmFyeS4gKi8KKwlpbWFnZSA9IChfX2xlMzIgKikgaWwtPnVjb2RlX2Jvb3Qudl9hZGRyOworCWxlbiA9IGlsLT51Y29kZV9ib290LmxlbjsKKwlyYyA9IGlsMzk0NV92ZXJpZnlfaW5zdF9mdWxsKGlsLCBpbWFnZSwgbGVuKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9uaWNfc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIFJlbW92ZSBhbGwgcmVzZXRzIHRvIGFsbG93IE5JQyB0byBvcGVyYXRlICovCisJX2lsX3dyKGlsLCBDU1JfUkVTRVQsIDApOworfQorCisjZGVmaW5lIElMMzk0NV9VQ09ERV9HRVQoaXRlbSkJCQkJCQlcCitzdGF0aWMgdTMyIGlsMzk0NV91Y29kZV9nZXRfIyNpdGVtKGNvbnN0IHN0cnVjdCBpbF91Y29kZV9oZWFkZXIgKnVjb2RlKVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIGxlMzJfdG9fY3B1KHVjb2RlLT52MS5pdGVtKTsJCQkJXAorfQorCitzdGF0aWMgdTMyCitpbDM5NDVfdWNvZGVfZ2V0X2hlYWRlcl9zaXplKHUzMiBhcGlfdmVyKQoreworCXJldHVybiAyNDsKK30KKworc3RhdGljIHU4ICoKK2lsMzk0NV91Y29kZV9nZXRfZGF0YShjb25zdCBzdHJ1Y3QgaWxfdWNvZGVfaGVhZGVyICp1Y29kZSkKK3sKKwlyZXR1cm4gKHU4ICopIHVjb2RlLT52MS5kYXRhOworfQorCitJTDM5NDVfVUNPREVfR0VUKGluc3Rfc2l6ZSk7CitJTDM5NDVfVUNPREVfR0VUKGRhdGFfc2l6ZSk7CitJTDM5NDVfVUNPREVfR0VUKGluaXRfc2l6ZSk7CitJTDM5NDVfVUNPREVfR0VUKGluaXRfZGF0YV9zaXplKTsKK0lMMzk0NV9VQ09ERV9HRVQoYm9vdF9zaXplKTsKKworLyoqCisgKiBpbDM5NDVfcmVhZF91Y29kZSAtIFJlYWQgdUNvZGUgaW1hZ2VzIGZyb20gZGlzayBmaWxlLgorICoKKyAqIENvcHkgaW50byBidWZmZXJzIGZvciBjYXJkIHRvIGZldGNoIHZpYSBidXMtbWFzdGVyaW5nCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9yZWFkX3Vjb2RlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwljb25zdCBzdHJ1Y3QgaWxfdWNvZGVfaGVhZGVyICp1Y29kZTsKKwlpbnQgcmV0ID0gLUVJTlZBTCwgaWR4OworCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWNvZGVfcmF3OworCS8qIGZpcm13YXJlIGZpbGUgbmFtZSBjb250YWlucyB1Q29kZS9kcml2ZXIgY29tcGF0aWJpbGl0eSB2ZXJzaW9uICovCisJY29uc3QgY2hhciAqbmFtZV9wcmUgPSBpbC0+Y2ZnLT5md19uYW1lX3ByZTsKKwljb25zdCB1bnNpZ25lZCBpbnQgYXBpX21heCA9IGlsLT5jZmctPnVjb2RlX2FwaV9tYXg7CisJY29uc3QgdW5zaWduZWQgaW50IGFwaV9taW4gPSBpbC0+Y2ZnLT51Y29kZV9hcGlfbWluOworCWNoYXIgYnVmWzI1XTsKKwl1OCAqc3JjOworCXNpemVfdCBsZW47CisJdTMyIGFwaV92ZXIsIGluc3Rfc2l6ZSwgZGF0YV9zaXplLCBpbml0X3NpemUsIGluaXRfZGF0YV9zaXplLCBib290X3NpemU7CisKKwkvKiBBc2sga2VybmVsIGZpcm13YXJlX2NsYXNzIG1vZHVsZSB0byBnZXQgdGhlIGJvb3QgZmlybXdhcmUgb2ZmIGRpc2suCisJICogcmVxdWVzdF9maXJtd2FyZSgpIGlzIHN5bmNocm9ub3VzLCBmaWxlIGlzIGluIG1lbW9yeSBvbiByZXR1cm4uICovCisJZm9yIChpZHggPSBhcGlfbWF4OyBpZHggPj0gYXBpX21pbjsgaWR4LS0pIHsKKwkJc3ByaW50ZihidWYsICIlcyV1JXMiLCBuYW1lX3ByZSwgaWR4LCAiLnVjb2RlIik7CisJCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJnVjb2RlX3JhdywgYnVmLCAmaWwtPnBjaV9kZXYtPmRldik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlJTF9FUlIoIiVzIGZpcm13YXJlIGZpbGUgcmVxIGZhaWxlZDogJWRcbiIsIGJ1ZiwgcmV0KTsKKwkJCWlmIChyZXQgPT0gLUVOT0VOVCkKKwkJCQljb250aW51ZTsKKwkJCWVsc2UKKwkJCQlnb3RvIGVycm9yOworCQl9IGVsc2UgeworCQkJaWYgKGlkeCA8IGFwaV9tYXgpCisJCQkJSUxfRVJSKCJMb2FkZWQgZmlybXdhcmUgJXMsICIKKwkJCQkgICAgICAgIndoaWNoIGlzIGRlcHJlY2F0ZWQuICIKKwkJCQkgICAgICAgIiBQbGVhc2UgdXNlIEFQSSB2JXUgaW5zdGVhZC5cbiIsIGJ1ZiwKKwkJCQkgICAgICAgYXBpX21heCk7CisJCQlEX0lORk8oIkdvdCBmaXJtd2FyZSAnJXMnIGZpbGUgIgorCQkJICAgICAgICIoJXpkIGJ5dGVzKSBmcm9tIGRpc2tcbiIsIGJ1ZiwgdWNvZGVfcmF3LT5zaXplKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyb3I7CisKKwkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBnb3QgYXQgbGVhc3Qgb3VyIGhlYWRlciEgKi8KKwlpZiAodWNvZGVfcmF3LT5zaXplIDwgaWwzOTQ1X3Vjb2RlX2dldF9oZWFkZXJfc2l6ZSgxKSkgeworCQlJTF9FUlIoIkZpbGUgc2l6ZSB3YXkgdG9vIHNtYWxsIVxuIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCisJLyogRGF0YSBmcm9tIHVjb2RlIGZpbGU6ICBoZWFkZXIgZm9sbG93ZWQgYnkgdUNvZGUgaW1hZ2VzICovCisJdWNvZGUgPSAoc3RydWN0IGlsX3Vjb2RlX2hlYWRlciAqKXVjb2RlX3Jhdy0+ZGF0YTsKKworCWlsLT51Y29kZV92ZXIgPSBsZTMyX3RvX2NwdSh1Y29kZS0+dmVyKTsKKwlhcGlfdmVyID0gSUxfVUNPREVfQVBJKGlsLT51Y29kZV92ZXIpOworCWluc3Rfc2l6ZSA9IGlsMzk0NV91Y29kZV9nZXRfaW5zdF9zaXplKHVjb2RlKTsKKwlkYXRhX3NpemUgPSBpbDM5NDVfdWNvZGVfZ2V0X2RhdGFfc2l6ZSh1Y29kZSk7CisJaW5pdF9zaXplID0gaWwzOTQ1X3Vjb2RlX2dldF9pbml0X3NpemUodWNvZGUpOworCWluaXRfZGF0YV9zaXplID0gaWwzOTQ1X3Vjb2RlX2dldF9pbml0X2RhdGFfc2l6ZSh1Y29kZSk7CisJYm9vdF9zaXplID0gaWwzOTQ1X3Vjb2RlX2dldF9ib290X3NpemUodWNvZGUpOworCXNyYyA9IGlsMzk0NV91Y29kZV9nZXRfZGF0YSh1Y29kZSk7CisKKwkvKiBhcGlfdmVyIHNob3VsZCBtYXRjaCB0aGUgYXBpIHZlcnNpb24gZm9ybWluZyBwYXJ0IG9mIHRoZQorCSAqIGZpcm13YXJlIGZpbGVuYW1lIC4uLiBidXQgd2UgZG9uJ3QgY2hlY2sgZm9yIHRoYXQgYW5kIG9ubHkgcmVseQorCSAqIG9uIHRoZSBBUEkgdmVyc2lvbiByZWFkIGZyb20gZmlybXdhcmUgaGVhZGVyIGZyb20gaGVyZSBvbiBmb3J3YXJkICovCisKKwlpZiAoYXBpX3ZlciA8IGFwaV9taW4gfHwgYXBpX3ZlciA+IGFwaV9tYXgpIHsKKwkJSUxfRVJSKCJEcml2ZXIgdW5hYmxlIHRvIHN1cHBvcnQgeW91ciBmaXJtd2FyZSBBUEkuICIKKwkJICAgICAgICJEcml2ZXIgc3VwcG9ydHMgdiV1LCBmaXJtd2FyZSBpcyB2JXUuXG4iLCBhcGlfbWF4LAorCQkgICAgICAgYXBpX3Zlcik7CisJCWlsLT51Y29kZV92ZXIgPSAwOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZWxlYXNlOworCX0KKwlpZiAoYXBpX3ZlciAhPSBhcGlfbWF4KQorCQlJTF9FUlIoIkZpcm13YXJlIGhhcyBvbGQgQVBJIHZlcnNpb24uIEV4cGVjdGVkICV1LCAiCisJCSAgICAgICAiZ290ICV1LiBOZXcgZmlybXdhcmUgY2FuIGJlIG9idGFpbmVkICIKKwkJICAgICAgICJmcm9tIGh0dHA6Ly93d3cuaW50ZWxsaW51eHdpcmVsZXNzLm9yZy5cbiIsIGFwaV9tYXgsCisJCSAgICAgICBhcGlfdmVyKTsKKworCUlMX0lORk8oImxvYWRlZCBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1LiV1XG4iLAorCQlJTF9VQ09ERV9NQUpPUihpbC0+dWNvZGVfdmVyKSwgSUxfVUNPREVfTUlOT1IoaWwtPnVjb2RlX3ZlciksCisJCUlMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKSwgSUxfVUNPREVfU0VSSUFMKGlsLT51Y29kZV92ZXIpKTsKKworCXNucHJpbnRmKGlsLT5ody0+d2lwaHktPmZ3X3ZlcnNpb24sIHNpemVvZihpbC0+aHctPndpcGh5LT5md192ZXJzaW9uKSwKKwkJICIldS4ldS4ldS4ldSIsIElMX1VDT0RFX01BSk9SKGlsLT51Y29kZV92ZXIpLAorCQkgSUxfVUNPREVfTUlOT1IoaWwtPnVjb2RlX3ZlciksIElMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKSwKKwkJIElMX1VDT0RFX1NFUklBTChpbC0+dWNvZGVfdmVyKSk7CisKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciB1Y29kZSB2ZXJzaW9uIHJhdyA9IDB4JXhcbiIsIGlsLT51Y29kZV92ZXIpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIHJ1bnRpbWUgaW5zdCBzaXplID0gJXVcbiIsIGluc3Rfc2l6ZSk7CisJRF9JTkZPKCJmL3cgcGFja2FnZSBoZHIgcnVudGltZSBkYXRhIHNpemUgPSAldVxuIiwgZGF0YV9zaXplKTsKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciBpbml0IGluc3Qgc2l6ZSA9ICV1XG4iLCBpbml0X3NpemUpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIGluaXQgZGF0YSBzaXplID0gJXVcbiIsIGluaXRfZGF0YV9zaXplKTsKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciBib290IGluc3Qgc2l6ZSA9ICV1XG4iLCBib290X3NpemUpOworCisJLyogVmVyaWZ5IHNpemUgb2YgZmlsZSB2cy4gaW1hZ2Ugc2l6ZSBpbmZvIGluIGZpbGUncyBoZWFkZXIgKi8KKwlpZiAodWNvZGVfcmF3LT5zaXplICE9CisJICAgIGlsMzk0NV91Y29kZV9nZXRfaGVhZGVyX3NpemUoYXBpX3ZlcikgKyBpbnN0X3NpemUgKyBkYXRhX3NpemUgKworCSAgICBpbml0X3NpemUgKyBpbml0X2RhdGFfc2l6ZSArIGJvb3Rfc2l6ZSkgeworCisJCURfSU5GTygidUNvZGUgZmlsZSBzaXplICV6ZCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBzaXplXG4iLAorCQkgICAgICAgdWNvZGVfcmF3LT5zaXplKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisKKwkvKiBWZXJpZnkgdGhhdCB1Q29kZSBpbWFnZXMgd2lsbCBmaXQgaW4gY2FyZCdzIFNSQU0gKi8KKwlpZiAoaW5zdF9zaXplID4gSUwzOV9NQVhfSU5TVF9TSVpFKSB7CisJCURfSU5GTygidUNvZGUgaW5zdHIgbGVuICVkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsIGluc3Rfc2l6ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCisJaWYgKGRhdGFfc2l6ZSA+IElMMzlfTUFYX0RBVEFfU0laRSkgeworCQlEX0lORk8oInVDb2RlIGRhdGEgbGVuICVkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsIGRhdGFfc2l6ZSk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3JlbGVhc2U7CisJfQorCWlmIChpbml0X3NpemUgPiBJTDM5X01BWF9JTlNUX1NJWkUpIHsKKwkJRF9JTkZPKCJ1Q29kZSBpbml0IGluc3RyIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAorCQkgICAgICAgaW5pdF9zaXplKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisJaWYgKGluaXRfZGF0YV9zaXplID4gSUwzOV9NQVhfREFUQV9TSVpFKSB7CisJCURfSU5GTygidUNvZGUgaW5pdCBkYXRhIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAorCQkgICAgICAgaW5pdF9kYXRhX3NpemUpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycl9yZWxlYXNlOworCX0KKwlpZiAoYm9vdF9zaXplID4gSUwzOV9NQVhfQlNNX1NJWkUpIHsKKwkJRF9JTkZPKCJ1Q29kZSBib290IGluc3RyIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAorCQkgICAgICAgYm9vdF9zaXplKTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcmVsZWFzZTsKKwl9CisKKwkvKiBBbGxvY2F0ZSB1Y29kZSBidWZmZXJzIGZvciBjYXJkJ3MgYnVzLW1hc3RlciBsb2FkaW5nIC4uLiAqLworCisJLyogUnVudGltZSBpbnN0cnVjdGlvbnMgYW5kIDIgY29waWVzIG9mIGRhdGE6CisJICogMSkgdW5tb2RpZmllZCBmcm9tIGRpc2sKKwkgKiAyKSBiYWNrdXAgY2FjaGUgZm9yIHNhdmUvcmVzdG9yZSBkdXJpbmcgcG93ZXItZG93bnMgKi8KKwlpbC0+dWNvZGVfY29kZS5sZW4gPSBpbnN0X3NpemU7CisJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9jb2RlKTsKKworCWlsLT51Y29kZV9kYXRhLmxlbiA9IGRhdGFfc2l6ZTsKKwlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2RhdGEpOworCisJaWwtPnVjb2RlX2RhdGFfYmFja3VwLmxlbiA9IGRhdGFfc2l6ZTsKKwlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2RhdGFfYmFja3VwKTsKKworCWlmICghaWwtPnVjb2RlX2NvZGUudl9hZGRyIHx8ICFpbC0+dWNvZGVfZGF0YS52X2FkZHIgfHwKKwkgICAgIWlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIpCisJCWdvdG8gZXJyX3BjaV9hbGxvYzsKKworCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyBhbmQgZGF0YSAqLworCWlmIChpbml0X3NpemUgJiYgaW5pdF9kYXRhX3NpemUpIHsKKwkJaWwtPnVjb2RlX2luaXQubGVuID0gaW5pdF9zaXplOworCQlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2luaXQpOworCisJCWlsLT51Y29kZV9pbml0X2RhdGEubGVuID0gaW5pdF9kYXRhX3NpemU7CisJCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfaW5pdF9kYXRhKTsKKworCQlpZiAoIWlsLT51Y29kZV9pbml0LnZfYWRkciB8fCAhaWwtPnVjb2RlX2luaXRfZGF0YS52X2FkZHIpCisJCQlnb3RvIGVycl9wY2lfYWxsb2M7CisJfQorCisJLyogQm9vdHN0cmFwIChpbnN0cnVjdGlvbnMgb25seSwgbm8gZGF0YSkgKi8KKwlpZiAoYm9vdF9zaXplKSB7CisJCWlsLT51Y29kZV9ib290LmxlbiA9IGJvb3Rfc2l6ZTsKKwkJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9ib290KTsKKworCQlpZiAoIWlsLT51Y29kZV9ib290LnZfYWRkcikKKwkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKKwl9CisKKwkvKiBDb3B5IGltYWdlcyBpbnRvIGJ1ZmZlcnMgZm9yIGNhcmQncyBidXMtbWFzdGVyIHJlYWRzIC4uLiAqLworCisJLyogUnVudGltZSBpbnN0cnVjdGlvbnMgKGZpcnN0IGJsb2NrIG9mIGRhdGEgaW4gZmlsZSkgKi8KKwlsZW4gPSBpbnN0X3NpemU7CisJRF9JTkZPKCJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGluc3RyIGxlbiAlemRcbiIsIGxlbik7CisJbWVtY3B5KGlsLT51Y29kZV9jb2RlLnZfYWRkciwgc3JjLCBsZW4pOworCXNyYyArPSBsZW47CisKKwlEX0lORk8oInVDb2RlIGluc3RyIGJ1ZiB2YWRkciA9IDB4JXAsIHBhZGRyID0gMHglMDh4XG4iLAorCSAgICAgICBpbC0+dWNvZGVfY29kZS52X2FkZHIsICh1MzIpIGlsLT51Y29kZV9jb2RlLnBfYWRkcik7CisKKwkvKiBSdW50aW1lIGRhdGEgKDJuZCBibG9jaykKKwkgKiBOT1RFOiAgQ29weSBpbnRvIGJhY2t1cCBidWZmZXIgd2lsbCBiZSBkb25lIGluIGlsMzk0NV91cCgpICAqLworCWxlbiA9IGRhdGFfc2l6ZTsKKwlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgdUNvZGUgZGF0YSBsZW4gJXpkXG4iLCBsZW4pOworCW1lbWNweShpbC0+dWNvZGVfZGF0YS52X2FkZHIsIHNyYywgbGVuKTsKKwltZW1jcHkoaWwtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciwgc3JjLCBsZW4pOworCXNyYyArPSBsZW47CisKKwkvKiBJbml0aWFsaXphdGlvbiBpbnN0cnVjdGlvbnMgKDNyZCBibG9jaykgKi8KKwlpZiAoaW5pdF9zaXplKSB7CisJCWxlbiA9IGluaXRfc2l6ZTsKKwkJRF9JTkZPKCJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIGluaXQgaW5zdHIgbGVuICV6ZFxuIiwgbGVuKTsKKwkJbWVtY3B5KGlsLT51Y29kZV9pbml0LnZfYWRkciwgc3JjLCBsZW4pOworCQlzcmMgKz0gbGVuOworCX0KKworCS8qIEluaXRpYWxpemF0aW9uIGRhdGEgKDR0aCBibG9jaykgKi8KKwlpZiAoaW5pdF9kYXRhX3NpemUpIHsKKwkJbGVuID0gaW5pdF9kYXRhX3NpemU7CisJCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBpbml0IGRhdGEgbGVuICV6ZFxuIiwgbGVuKTsKKwkJbWVtY3B5KGlsLT51Y29kZV9pbml0X2RhdGEudl9hZGRyLCBzcmMsIGxlbik7CisJCXNyYyArPSBsZW47CisJfQorCisJLyogQm9vdHN0cmFwIGluc3RydWN0aW9ucyAoNXRoIGJsb2NrKSAqLworCWxlbiA9IGJvb3Rfc2l6ZTsKKwlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgYm9vdCBpbnN0ciBsZW4gJXpkXG4iLCBsZW4pOworCW1lbWNweShpbC0+dWNvZGVfYm9vdC52X2FkZHIsIHNyYywgbGVuKTsKKworCS8qIFdlIGhhdmUgb3VyIGNvcGllcyBub3csIGFsbG93IE9TIHJlbGVhc2UgaXRzIGNvcGllcyAqLworCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKKwlyZXR1cm4gMDsKKworZXJyX3BjaV9hbGxvYzoKKwlJTF9FUlIoImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKKwlyZXQgPSAtRU5PTUVNOworCWlsMzk0NV9kZWFsbG9jX3Vjb2RlX3BjaShpbCk7CisKK2Vycl9yZWxlYXNlOgorCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKKworZXJyb3I6CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpbDM5NDVfc2V0X3Vjb2RlX3B0cnMgLSBTZXQgdUNvZGUgYWRkcmVzcyBsb2NhdGlvbgorICoKKyAqIFRlbGwgaW5pdGlhbGl6YXRpb24gdUNvZGUgd2hlcmUgdG8gZmluZCBydW50aW1lIHVDb2RlLgorICoKKyAqIEJTTSByZWdpc3RlcnMgaW5pdGlhbGx5IGNvbnRhaW4gcG9pbnRlcnMgdG8gaW5pdGlhbGl6YXRpb24gdUNvZGUuCisgKiBXZSBuZWVkIHRvIHJlcGxhY2UgdGhlbSB0byBsb2FkIHJ1bnRpbWUgdUNvZGUgaW5zdCBhbmQgZGF0YSwKKyAqIGFuZCB0byBzYXZlIHJ1bnRpbWUgZGF0YSB3aGVuIHBvd2VyaW5nIGRvd24uCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9zZXRfdWNvZGVfcHRycyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJZG1hX2FkZHJfdCBwaW5zdDsKKwlkbWFfYWRkcl90IHBkYXRhOworCisJLyogYml0cyAzMTowIGZvciAzOTQ1ICovCisJcGluc3QgPSBpbC0+dWNvZGVfY29kZS5wX2FkZHI7CisJcGRhdGEgPSBpbC0+dWNvZGVfZGF0YV9iYWNrdXAucF9hZGRyOworCisJLyogVGVsbCBib290c3RyYXAgdUNvZGUgd2hlcmUgdG8gZmluZCBpbWFnZSB0byBsb2FkICovCisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7CisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fREFUQV9QVFJfUkVHLCBwZGF0YSk7CisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fREFUQV9CWVRFQ09VTlRfUkVHLCBpbC0+dWNvZGVfZGF0YS5sZW4pOworCisJLyogSW5zdCBieXRlIGNvdW50IG11c3QgYmUgbGFzdCB0byBzZXQgdXAsIGJpdCAzMSBzaWduYWxzIHVDb2RlCisJICogICB0aGF0IGFsbCBuZXcgcHRyL3NpemUgaW5mbyBpcyBpbiBwbGFjZSAqLworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0lOU1RfQllURUNPVU5UX1JFRywKKwkJICAgaWwtPnVjb2RlX2NvZGUubGVuIHwgQlNNX0RSQU1fSU5TVF9MT0FEKTsKKworCURfSU5GTygiUnVudGltZSB1Q29kZSBwb2ludGVycyBhcmUgc2V0LlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDM5NDVfaW5pdF9hbGl2ZV9zdGFydCAtIENhbGxlZCBhZnRlciBOX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZAorICoKKyAqIENhbGxlZCBhZnRlciBOX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tICJpbml0aWFsaXplIiB1Q29kZS4KKyAqCisgKiBUZWxsICJpbml0aWFsaXplIiB1Q29kZSB0byBnbyBhaGVhZCBhbmQgbG9hZCB0aGUgcnVudGltZSB1Q29kZS4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBDaGVjayBhbGl2ZSByZXNwb25zZSBmb3IgInZhbGlkIiBzaWduIGZyb20gdUNvZGUgKi8KKwlpZiAoaWwtPmNhcmRfYWxpdmVfaW5pdC5pc192YWxpZCAhPSBVQ09ERV9WQUxJRF9PSykgeworCQkvKiBXZSBoYWQgYW4gZXJyb3IgYnJpbmdpbmcgdXAgdGhlIGhhcmR3YXJlLCBzbyB0YWtlIGl0CisJCSAqIGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCisJCURfSU5GTygiSW5pdGlhbGl6ZSBBbGl2ZSBmYWlsZWQuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCS8qIEJvb3RzdHJhcCB1Q29kZSBoYXMgbG9hZGVkIGluaXRpYWxpemUgdUNvZGUgLi4uIHZlcmlmeSBpbnN0IGltYWdlLgorCSAqIFRoaXMgaXMgYSBwYXJhbm9pZCBjaGVjaywgYmVjYXVzZSB3ZSB3b3VsZCBub3QgaGF2ZSBnb3R0ZW4gdGhlCisJICogImluaXRpYWxpemUiIGFsaXZlIGlmIGNvZGUgd2VyZW4ndCBwcm9wZXJseSBsb2FkZWQuICAqLworCWlmIChpbDM5NDVfdmVyaWZ5X3Vjb2RlKGlsKSkgeworCQkvKiBSdW50aW1lIGluc3RydWN0aW9uIGxvYWQgd2FzIGJhZDsKKwkJICogdGFrZSBpdCBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLworCQlEX0lORk8oIkJhZCBcImluaXRpYWxpemVcIiB1Q29kZSBsb2FkLlxuIik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwkvKiBTZW5kIHBvaW50ZXJzIHRvIHByb3RvY29sL3J1bnRpbWUgdUNvZGUgaW1hZ2UgLi4uIGluaXQgY29kZSB3aWxsCisJICogbG9hZCBhbmQgbGF1bmNoIHJ1bnRpbWUgdUNvZGUsIHdoaWNoIHdpbGwgc2VuZCB1cyBhbm90aGVyICJBbGl2ZSIKKwkgKiBub3RpZmljYXRpb24uICovCisJRF9JTkZPKCJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOworCWlmIChpbDM5NDVfc2V0X3Vjb2RlX3B0cnMoaWwpKSB7CisJCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3b24ndCBoYXBwZW47CisJCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJDb3VsZG4ndCBzZXQgdXAgdUNvZGUgcG9pbnRlcnMuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKwlyZXR1cm47CisKK3Jlc3RhcnQ6CisJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJlc3RhcnQpOworfQorCisvKioKKyAqIGlsMzk0NV9hbGl2ZV9zdGFydCAtIGNhbGxlZCBhZnRlciBOX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZAorICogICAgICAgICAgICAgICAgICAgZnJvbSBwcm90b2NvbC9ydW50aW1lIHVDb2RlIChpbml0aWFsaXphdGlvbiB1Q29kZSdzCisgKiAgICAgICAgICAgICAgICAgICBBbGl2ZSBnZXRzIGhhbmRsZWQgYnkgaWwzOTQ1X2luaXRfYWxpdmVfc3RhcnQoKSkuCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfYWxpdmVfc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCB0aGVybWFsX3NwaW4gPSAwOworCXUzMiByZmtpbGw7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlEX0lORk8oIlJ1bnRpbWUgQWxpdmUgcmVjZWl2ZWQuXG4iKTsKKworCWlmIChpbC0+Y2FyZF9hbGl2ZS5pc192YWxpZCAhPSBVQ09ERV9WQUxJRF9PSykgeworCQkvKiBXZSBoYWQgYW4gZXJyb3IgYnJpbmdpbmcgdXAgdGhlIGhhcmR3YXJlLCBzbyB0YWtlIGl0CisJCSAqIGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCisJCURfSU5GTygiQWxpdmUgZmFpbGVkLlxuIik7CisJCWdvdG8gcmVzdGFydDsKKwl9CisKKwkvKiBJbml0aWFsaXplIHVDb2RlIGhhcyBsb2FkZWQgUnVudGltZSB1Q29kZSAuLi4gdmVyaWZ5IGluc3QgaW1hZ2UuCisJICogVGhpcyBpcyBhIHBhcmFub2lkIGNoZWNrLCBiZWNhdXNlIHdlIHdvdWxkIG5vdCBoYXZlIGdvdHRlbiB0aGUKKwkgKiAicnVudGltZSIgYWxpdmUgaWYgY29kZSB3ZXJlbid0IHByb3Blcmx5IGxvYWRlZC4gICovCisJaWYgKGlsMzk0NV92ZXJpZnlfdWNvZGUoaWwpKSB7CisJCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3YXMgYmFkOworCQkgKiB0YWtlIGl0IGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCisJCURfSU5GTygiQmFkIHJ1bnRpbWUgdUNvZGUgbG9hZC5cbiIpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJcmZraWxsID0gaWxfcmRfcHJwaChpbCwgQVBNR19SRktJTExfUkVHKTsKKwlEX0lORk8oIlJGS0lMTCBzdGF0dXM6IDB4JXhcbiIsIHJma2lsbCk7CisKKwlpZiAocmZraWxsICYgMHgxKSB7CisJCWNsZWFyX2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwkJLyogaWYgUkZLSUxMIGlzIG5vdCBvbiwgdGhlbiB3YWl0IGZvciB0aGVybWFsCisJCSAqIHNlbnNvciBpbiBhZGFwdGVyIHRvIGtpY2sgaW4gKi8KKwkJd2hpbGUgKGlsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUoaWwpID09IDApIHsKKwkJCXRoZXJtYWxfc3BpbisrOworCQkJdWRlbGF5KDEwKTsKKwkJfQorCisJCWlmICh0aGVybWFsX3NwaW4pCisJCQlEX0lORk8oIlRoZXJtYWwgY2FsaWJyYXRpb24gdG9vayAlZHVzXG4iLAorCQkJICAgICAgIHRoZXJtYWxfc3BpbiAqIDEwKTsKKwl9IGVsc2UKKwkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKworCS8qIEFmdGVyIHRoZSBBTElWRSByZXNwb25zZSwgd2UgY2FuIHNlbmQgY29tbWFuZHMgdG8gMzk0NSB1Q29kZSAqLworCXNldF9iaXQoU19BTElWRSwgJmlsLT5zdGF0dXMpOworCisJLyogRW5hYmxlIHdhdGNoZG9nIHRvIG1vbml0b3IgdGhlIGRyaXZlciB0eCBxdWV1ZXMgKi8KKwlpbF9zZXR1cF93YXRjaGRvZyhpbCk7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkKKwkJcmV0dXJuOworCisJaWVlZTgwMjExX3dha2VfcXVldWVzKGlsLT5odyk7CisKKwlpbC0+YWN0aXZlX3JhdGUgPSBSQVRFU19NQVNLXzM5NDU7CisKKwlpbF9wb3dlcl91cGRhdGVfbW9kZShpbCwgdHJ1ZSk7CisKKwlpZiAoaWxfaXNfYXNzb2NpYXRlZChpbCkpIHsKKwkJc3RydWN0IGlsMzk0NV9yeG9uX2NtZCAqYWN0aXZlX3J4b24gPQorCQkgICAgKHN0cnVjdCBpbDM5NDVfcnhvbl9jbWQgKikoJmN0eC0+YWN0aXZlKTsKKworCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKKwkJYWN0aXZlX3J4b24tPmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOworCX0gZWxzZSB7CisJCS8qIEluaXRpYWxpemUgb3VyIHJ4X2NvbmZpZyBkYXRhICovCisJCWlsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcoaWwsIGN0eCk7CisJfQorCisJLyogQ29uZmlndXJlIEJsdWV0b290aCBkZXZpY2UgY29leGlzdGVuY2Ugc3VwcG9ydCAqLworCWlsX3NlbmRfYnRfY29uZmlnKGlsKTsKKworCXNldF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpOworCisJLyogQ29uZmlndXJlIHRoZSBhZGFwdGVyIGZvciB1bmFzc29jaWF0ZWQgb3BlcmF0aW9uICovCisJaWwzOTQ1X2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCisJaWwzOTQ1X3JlZ190eHBvd2VyX3BlcmlvZGljKGlsKTsKKworCURfSU5GTygiQUxJVkUgcHJvY2Vzc2luZyBjb21wbGV0ZS5cbiIpOworCXdha2VfdXAoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCisJcmV0dXJuOworCityZXN0YXJ0OgorCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5yZXN0YXJ0KTsKK30KKworc3RhdGljIHZvaWQgaWwzOTQ1X2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCk7CisKK3N0YXRpYyB2b2lkCitfX2lsMzk0NV9kb3duKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBleGl0X3BlbmRpbmc7CisKKwlEX0lORk8oRFJWX05BTUUgIiBpcyBnb2luZyBkb3duXG4iKTsKKworCWlsX3NjYW5fY2FuY2VsX3RpbWVvdXQoaWwsIDIwMCk7CisKKwlleGl0X3BlbmRpbmcgPSB0ZXN0X2FuZF9zZXRfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cyk7CisKKwkvKiBTdG9wIFRYIHF1ZXVlcyB3YXRjaGRvZy4gV2UgbmVlZCB0byBoYXZlIFNfRVhJVF9QRU5ESU5HIGJpdCBzZXQKKwkgKiB0byBwcmV2ZW50IHJlYXJtIHRpbWVyICovCisJZGVsX3RpbWVyX3N5bmMoJmlsLT53YXRjaGRvZyk7CisKKwkvKiBTdGF0aW9uIGluZm9ybWF0aW9uIHdpbGwgbm93IGJlIGNsZWFyZWQgaW4gZGV2aWNlICovCisJaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMoaWwsIE5VTEwpOworCWlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMoaWwpOworCWlsX2NsZWFyX2RyaXZlcl9zdGF0aW9ucyhpbCk7CisKKwkvKiBVbmJsb2NrIGFueSB3YWl0aW5nIGNhbGxzICovCisJd2FrZV91cF9hbGwoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCisJLyogV2lwZSBvdXQgdGhlIEVYSVRfUEVORElORyBzdGF0dXMgYml0IGlmIHdlIGFyZSBub3QgYWN0dWFsbHkKKwkgKiBleGl0aW5nIHRoZSBtb2R1bGUgKi8KKwlpZiAoIWV4aXRfcGVuZGluZykKKwkJY2xlYXJfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cyk7CisKKwkvKiBzdG9wIGFuZCByZXNldCB0aGUgb24tYm9hcmQgcHJvY2Vzc29yICovCisJX2lsX3dyKGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKKworCS8qIHRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsX2Rpc2FibGVfaW50ZXJydXB0cyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbDM5NDVfc3luY2hyb25pemVfaXJxKGlsKTsKKworCWlmIChpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKKwkJaWVlZTgwMjExX3N0b3BfcXVldWVzKGlsLT5odyk7CisKKwkvKiBJZiB3ZSBoYXZlIG5vdCBwcmV2aW91c2x5IGNhbGxlZCBpbDM5NDVfaW5pdCgpIHRoZW4KKwkgKiBjbGVhciBhbGwgYml0cyBidXQgdGhlIFJGIEtpbGwgYml0cyBhbmQgcmV0dXJuICovCisJaWYgKCFpbF9pc19pbml0KGlsKSkgeworCQlpbC0+c3RhdHVzID0KKwkJICAgIHRlc3RfYml0KFNfUkZfS0lMTF9IVywKKwkJCSAgICAgJmlsLT4KKwkJCSAgICAgc3RhdHVzKSA8PCBTX1JGX0tJTExfSFcgfAorCQkgICAgdGVzdF9iaXQoU19HRU9fQ09ORklHVVJFRCwKKwkJCSAgICAgJmlsLT4KKwkJCSAgICAgc3RhdHVzKSA8PCBTX0dFT19DT05GSUdVUkVEIHwKKwkJICAgIHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykgPDwgU19FWElUX1BFTkRJTkc7CisJCWdvdG8gZXhpdDsKKwl9CisKKwkvKiAuLi5vdGhlcndpc2UgY2xlYXIgb3V0IGFsbCB0aGUgc3RhdHVzIGJpdHMgYnV0IHRoZSBSRiBLaWxsCisJICogYml0IGFuZCBjb250aW51ZSB0YWtpbmcgdGhlIE5JQyBkb3duLiAqLworCWlsLT5zdGF0dXMgJj0KKwkgICAgdGVzdF9iaXQoU19SRl9LSUxMX0hXLAorCQkgICAgICZpbC0+c3RhdHVzKSA8PCBTX1JGX0tJTExfSFcgfCB0ZXN0X2JpdChTX0dFT19DT05GSUdVUkVELAorCQkJCQkJCSAgICAgJmlsLT4KKwkJCQkJCQkgICAgIHN0YXR1cykgPDwKKwkgICAgU19HRU9fQ09ORklHVVJFRCB8IHRlc3RfYml0KFNfRldfRVJST1IsCisJCQkJCSZpbC0+CisJCQkJCXN0YXR1cykgPDwgU19GV19FUlJPUiB8CisJICAgIHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykgPDwgU19FWElUX1BFTkRJTkc7CisKKwlpbDM5NDVfaHdfdHhxX2N0eF9zdG9wKGlsKTsKKwlpbDM5NDVfaHdfcnhxX3N0b3AoaWwpOworCisJLyogUG93ZXItZG93biBkZXZpY2UncyBidXNtYXN0ZXIgRE1BIGNsb2NrcyAqLworCWlsX3dyX3BycGgoaWwsIEFQTUdfQ0xLX0RJU19SRUcsIEFQTUdfQ0xLX1ZBTF9ETUFfQ0xLX1JRVCk7CisJdWRlbGF5KDUpOworCisJLyogU3RvcCB0aGUgZGV2aWNlLCBhbmQgcHV0IGl0IGluIGxvdyBwb3dlciBzdGF0ZSAqLworCWlsX2FwbV9zdG9wKGlsKTsKKworZXhpdDoKKwltZW1zZXQoJmlsLT5jYXJkX2FsaXZlLCAwLCBzaXplb2Yoc3RydWN0IGlsX2FsaXZlX3Jlc3ApKTsKKworCWlmIChpbC0+YmVhY29uX3NrYikKKwkJZGV2X2tmcmVlX3NrYihpbC0+YmVhY29uX3NrYik7CisJaWwtPmJlYWNvbl9za2IgPSBOVUxMOworCisJLyogY2xlYXIgb3V0IGFueSBmcmVlIGZyYW1lcyAqLworCWlsMzk0NV9jbGVhcl9mcmVlX2ZyYW1lcyhpbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfZG93bihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlfX2lsMzk0NV9kb3duKGlsKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlpbDM5NDVfY2FuY2VsX2RlZmVycmVkX3dvcmsoaWwpOworfQorCisjZGVmaW5lIE1BWF9IV19SRVNUQVJUUyA1CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9hbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IHN0YV9pZDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlzdGFfaWQgPSBpbF9wcmVwX3N0YXRpb24oaWwsIGN0eCwgaWxfYmNhc3RfYWRkciwgZmFsc2UsIE5VTEwpOworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIHByZXBhcmUgYnJvYWRjYXN0IHN0YXRpb25cbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElMX1NUQV9EUklWRVJfQUNUSVZFOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSUxfU1RBX0JDQVNUOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19faWwzOTQ1X3VwKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmMsIGk7CisKKwlyYyA9IGlsMzk0NV9hbGxvY19iY2FzdF9zdGF0aW9uKGlsKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKSB7CisJCUlMX1dBUk4oIkV4aXQgcGVuZGluZzsgd2lsbCBub3QgYnJpbmcgdGhlIE5JQyB1cFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghaWwtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciB8fCAhaWwtPnVjb2RlX2RhdGEudl9hZGRyKSB7CisJCUlMX0VSUigidWNvZGUgbm90IGF2YWlsYWJsZSBmb3IgZGV2aWNlIGJyaW5nIHVwXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogSWYgcGxhdGZvcm0ncyBSRl9LSUxMIHN3aXRjaCBpcyBOT1Qgc2V0IHRvIEtJTEwgKi8KKwlpZiAoX2lsX3JkKGlsLCBDU1JfR1BfQ05UUkwpICYgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpCisJCWNsZWFyX2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwllbHNlIHsKKwkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwkJSUxfV0FSTigiUmFkaW8gZGlzYWJsZWQgYnkgSFcgUkYgS2lsbCBzd2l0Y2hcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlfaWxfd3IoaWwsIENTUl9JTlQsIDB4RkZGRkZGRkYpOworCisJcmMgPSBpbDM5NDVfaHdfbmljX2luaXQoaWwpOworCWlmIChyYykgeworCQlJTF9FUlIoIlVuYWJsZSB0byBpbnQgbmljXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKworCS8qIG1ha2Ugc3VyZSByZmtpbGwgaGFuZHNoYWtlIGJpdHMgYXJlIGNsZWFyZWQgKi8KKwlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfRFJWX0dQMV9CSVRfQ01EX0JMT0NLRUQpOworCisJLyogY2xlYXIgKGFnYWluKSwgdGhlbiBlbmFibGUgaG9zdCBpbnRlcnJ1cHRzICovCisJX2lsX3dyKGlsLCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKKwlpbF9lbmFibGVfaW50ZXJydXB0cyhpbCk7CisKKwkvKiByZWFsbHkgbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKKworCS8qIENvcHkgb3JpZ2luYWwgdWNvZGUgZGF0YSBpbWFnZSBmcm9tIGRpc2sgaW50byBiYWNrdXAgY2FjaGUuCisJICogVGhpcyB3aWxsIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgb24tYm9hcmQgcHJvY2Vzc29yJ3MKKwkgKiBkYXRhIFNSQU0gZm9yIGEgY2xlYW4gc3RhcnQgd2hlbiB0aGUgcnVudGltZSBwcm9ncmFtIGZpcnN0IGxvYWRzLiAqLworCW1lbWNweShpbC0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyLCBpbC0+dWNvZGVfZGF0YS52X2FkZHIsCisJICAgICAgIGlsLT51Y29kZV9kYXRhLmxlbik7CisKKwkvKiBXZSByZXR1cm4gc3VjY2VzcyB3aGVuIHdlIHJlc3VtZSBmcm9tIHN1c3BlbmQgYW5kIHJmX2tpbGwgaXMgb24uICovCisJaWYgKHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSFdfUkVTVEFSVFM7IGkrKykgeworCisJCS8qIGxvYWQgYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUsCisJCSAqIGxvYWQgYm9vdHN0cmFwIHByb2dyYW0gaW50byBwcm9jZXNzb3IncyBtZW1vcnksCisJCSAqIHByZXBhcmUgdG8gbG9hZCB0aGUgImluaXRpYWxpemUiIHVDb2RlICovCisJCXJjID0gaWwtPmNmZy0+b3BzLT5saWItPmxvYWRfdWNvZGUoaWwpOworCisJCWlmIChyYykgeworCQkJSUxfRVJSKCJVbmFibGUgdG8gc2V0IHVwIGJvb3RzdHJhcCB1Q29kZTogJWRcbiIsIHJjKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogc3RhcnQgY2FyZDsgImluaXRpYWxpemUiIHdpbGwgbG9hZCBydW50aW1lIHVjb2RlICovCisJCWlsMzk0NV9uaWNfc3RhcnQoaWwpOworCisJCURfSU5GTyhEUlZfTkFNRSAiIGlzIGNvbWluZyB1cFxuIik7CisKKwkJcmV0dXJuIDA7CisJfQorCisJc2V0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCV9faWwzOTQ1X2Rvd24oaWwpOworCWNsZWFyX2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCisJLyogdHJpZWQgdG8gcmVzdGFydCBhbmQgY29uZmlnIHRoZSBkZXZpY2UgZm9yIGFzIGxvbmcgYXMgb3VyCisJICogcGF0aWVuY2UgY291bGQgd2l0aHN0YW5kICovCisJSUxfRVJSKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgYWZ0ZXIgJWQgYXR0ZW1wdHMuXG4iLCBpKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogV29ya3F1ZXVlIGNhbGxiYWNrcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2lsMzk0NV9iZ19pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPQorCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIGluaXRfYWxpdmVfc3RhcnQud29yayk7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlnb3RvIG91dDsKKworCWlsMzk0NV9pbml0X2FsaXZlX3N0YXJ0KGlsKTsKK291dDoKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfYmdfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9CisJICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaWxfcHJpdiwgYWxpdmVfc3RhcnQud29yayk7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlnb3RvIG91dDsKKworCWlsMzk0NV9hbGl2ZV9zdGFydChpbCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCisvKgorICogMzk0NSBjYW5ub3QgaW50ZXJydXB0IGRyaXZlciB3aGVuIGhhcmR3YXJlIHJmIGtpbGwgc3dpdGNoIHRvZ2dsZXM7CisgKiBkcml2ZXIgbXVzdCBwb2xsIENTUl9HUF9DTlRSTF9SRUcgcmVnaXN0ZXIgZm9yIGNoYW5nZS4gIFRoaXMgcmVnaXN0ZXIKKyAqICppcyogcmVhZGFibGUgZXZlbiB3aGVuIGRldmljZSBoYXMgYmVlbiBTV19SRVNFVCBpbnRvIGxvdyBwb3dlciBtb2RlCisgKiAoZS5nLiBkdXJpbmcgUkYgS0lMTCkuCisgKi8KK3N0YXRpYyB2b2lkCitpbDM5NDVfcmZraWxsX3BvbGwoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9CisJICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaWxfcHJpdiwgXzM5NDUucmZraWxsX3BvbGwud29yayk7CisJYm9vbCBvbGRfcmZraWxsID0gdGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJYm9vbCBuZXdfcmZraWxsID0KKwkgICAgIShfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCkgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVyk7CisKKwlpZiAobmV3X3Jma2lsbCAhPSBvbGRfcmZraWxsKSB7CisJCWlmIChuZXdfcmZraWxsKQorCQkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCisJCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUoaWwtPmh3LT53aXBoeSwgbmV3X3Jma2lsbCk7CisKKwkJRF9SRl9LSUxMKCJSRl9LSUxMIGJpdCB0b2dnbGVkIHRvICVzLlxuIiwKKwkJCSAgbmV3X3Jma2lsbCA/ICJkaXNhYmxlIHJhZGlvIiA6ICJlbmFibGUgcmFkaW8iKTsKKwl9CisKKwkvKiBLZWVwIHRoaXMgcnVubmluZywgZXZlbiBpZiByYWRpbyBub3cgZW5hYmxlZC4gIFRoaXMgd2lsbCBiZQorCSAqIGNhbmNlbGxlZCBpbiBtYWNfc3RhcnQoKSBpZiBzeXN0ZW0gZGVjaWRlcyB0byBzdGFydCBhZ2FpbiAqLworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPl8zOTQ1LnJma2lsbF9wb2xsLAorCQkJICAgcm91bmRfamlmZmllc19yZWxhdGl2ZSgyICogSFopKTsKKworfQorCitpbnQKK2lsMzk0NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfU0NBTiwKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3NjYW5fY21kKSwKKwkJLmZsYWdzID0gQ01EX1NJWkVfSFVHRSwKKwl9OworCXN0cnVjdCBpbDM5NDVfc2Nhbl9jbWQgKnNjYW47CisJdTggbl9wcm9iZXMgPSAwOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKKwlib29sIGlzX2FjdGl2ZSA9IGZhbHNlOworCWludCByZXQ7CisJdTE2IGxlbjsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAoIWlsLT5zY2FuX2NtZCkgeworCQlpbC0+c2Nhbl9jbWQgPQorCQkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IGlsMzk0NV9zY2FuX2NtZCkgKyBJTF9NQVhfU0NBTl9TSVpFLAorCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWlsLT5zY2FuX2NtZCkgeworCQkJRF9TQ0FOKCJGYWlsIHRvIGFsbG9jYXRlIHNjYW4gbWVtb3J5XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXNjYW4gPSBpbC0+c2Nhbl9jbWQ7CisJbWVtc2V0KHNjYW4sIDAsIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3NjYW5fY21kKSArIElMX01BWF9TQ0FOX1NJWkUpOworCisJc2Nhbi0+cXVpZXRfcGxjcF90aCA9IElMX1BMQ1BfUVVJRVRfVEhSRVNIOworCXNjYW4tPnF1aWV0X3RpbWUgPSBJTF9BQ1RJVkVfUVVJRVRfVElNRTsKKworCWlmIChpbF9pc19hc3NvY2lhdGVkKGlsKSkgeworCQl1MTYgaW50ZXJ2YWw7CisJCXUzMiBleHRyYTsKKwkJdTMyIHN1c3BlbmRfdGltZSA9IDEwMDsKKwkJdTMyIHNjYW5fc3VzcGVuZF90aW1lID0gMTAwOworCisJCURfSU5GTygiU2Nhbm5pbmcgd2hpbGUgYXNzb2NpYXRlZC4uLlxuIik7CisKKwkJaW50ZXJ2YWwgPSB2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQ7CisKKwkJc2Nhbi0+c3VzcGVuZF90aW1lID0gMDsKKwkJc2Nhbi0+bWF4X291dF90aW1lID0gY3B1X3RvX2xlMzIoMjAwICogMTAyNCk7CisJCWlmICghaW50ZXJ2YWwpCisJCQlpbnRlcnZhbCA9IHN1c3BlbmRfdGltZTsKKwkJLyoKKwkJICogc3VzcGVuZCB0aW1lIGZvcm1hdDoKKwkJICogIDAtMTk6IGJlYWNvbiBpbnRlcnZhbCBpbiB1c2VjICh0aW1lIGJlZm9yZSBleGVjLikKKwkJICogMjAtMjM6IDAKKwkJICogMjQtMzE6IG51bWJlciBvZiBiZWFjb25zIChzdXNwZW5kIGJldHdlZW4gY2hhbm5lbHMpCisJCSAqLworCisJCWV4dHJhID0gKHN1c3BlbmRfdGltZSAvIGludGVydmFsKSA8PCAyNDsKKwkJc2Nhbl9zdXNwZW5kX3RpbWUgPQorCQkgICAgMHhGRjBGRkZGRiAmIChleHRyYSB8ICgoc3VzcGVuZF90aW1lICUgaW50ZXJ2YWwpICogMTAyNCkpOworCisJCXNjYW4tPnN1c3BlbmRfdGltZSA9IGNwdV90b19sZTMyKHNjYW5fc3VzcGVuZF90aW1lKTsKKwkJRF9TQ0FOKCJzdXNwZW5kX3RpbWUgMHglWCBiZWFjb24gaW50ZXJ2YWwgJWRcbiIsCisJCSAgICAgICBzY2FuX3N1c3BlbmRfdGltZSwgaW50ZXJ2YWwpOworCX0KKworCWlmIChpbC0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzKSB7CisJCWludCBpLCBwID0gMDsKKwkJRF9TQ0FOKCJLaWNraW5nIG9mZiBhY3RpdmUgc2NhblxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBpbC0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzOyBpKyspIHsKKwkJCS8qIGFsd2F5cyBkb2VzIHdpbGRjYXJkIGFueXdheSAqLworCQkJaWYgKCFpbC0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbikKKwkJCQljb250aW51ZTsKKwkJCXNjYW4tPmRpcmVjdF9zY2FuW3BdLmlkID0gV0xBTl9FSURfU1NJRDsKKwkJCXNjYW4tPmRpcmVjdF9zY2FuW3BdLmxlbiA9CisJCQkgICAgaWwtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW47CisJCQltZW1jcHkoc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uc3NpZCwKKwkJCSAgICAgICBpbC0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLAorCQkJICAgICAgIGlsLT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuKTsKKwkJCW5fcHJvYmVzKys7CisJCQlwKys7CisJCX0KKwkJaXNfYWN0aXZlID0gdHJ1ZTsKKwl9IGVsc2UKKwkJRF9TQ0FOKCJLaWNraW5nIG9mZiBwYXNzaXZlIHNjYW4uXG4iKTsKKworCS8qIFdlIGRvbid0IGJ1aWxkIGEgZGlyZWN0IHNjYW4gcHJvYmUgcmVxdWVzdDsgdGhlIHVDb2RlIHdpbGwgZG8KKwkgKiB0aGF0IGJhc2VkIG9uIHRoZSBkaXJlY3RfbWFzayBhZGRlZCB0byBlYWNoIGNoYW5uZWwgZW50cnkgKi8KKwlzY2FuLT50eF9jbWQudHhfZmxhZ3MgPSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOworCXNjYW4tPnR4X2NtZC5zdGFfaWQgPSBpbC0+Y3R4LmJjYXN0X3N0YV9pZDsKKwlzY2FuLT50eF9jbWQuc3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7CisKKwkvKiBmbGFncyArIHJhdGUgc2VsZWN0aW9uICovCisKKwlzd2l0Y2ggKGlsLT5zY2FuX2JhbmQpIHsKKwljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6CisJCXNjYW4tPmZsYWdzID0gUlhPTl9GTEdfQkFORF8yNEdfTVNLIHwgUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLOworCQlzY2FuLT50eF9jbWQucmF0ZSA9IFJBVEVfMU1fUExDUDsKKwkJYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJc2Nhbi0+dHhfY21kLnJhdGUgPSBSQVRFXzZNX1BMQ1A7CisJCWJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJTF9XQVJOKCJJbnZhbGlkIHNjYW4gYmFuZFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJICogSWYgYWN0aXZlIHNjYW5pbmcgaXMgcmVxdWVzdGVkIGJ1dCBhIGNlcnRhaW4gY2hhbm5lbCBpcyBtYXJrZWQKKwkgKiBwYXNzaXZlLCB3ZSBjYW4gZG8gYWN0aXZlIHNjYW5uaW5nIGlmIHdlIGRldGVjdCB0cmFuc21pc3Npb25zLiBGb3IKKwkgKiBwYXNzaXZlIG9ubHkgc2Nhbm5pbmcgZGlzYWJsZSBzd2l0Y2hpbmcgdG8gYWN0aXZlIG9uIGFueSBjaGFubmVsLgorCSAqLworCXNjYW4tPmdvb2RfQ1JDX3RoID0KKwkgICAgaXNfYWN0aXZlID8gSUxfR09PRF9DUkNfVEhfREVGQVVMVCA6IElMX0dPT0RfQ1JDX1RIX05FVkVSOworCisJbGVuID0KKwkgICAgaWxfZmlsbF9wcm9iZV9yZXEoaWwsIChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKilzY2FuLT5kYXRhLAorCQkJICAgICAgdmlmLT5hZGRyLCBpbC0+c2Nhbl9yZXF1ZXN0LT5pZSwKKwkJCSAgICAgIGlsLT5zY2FuX3JlcXVlc3QtPmllX2xlbiwKKwkJCSAgICAgIElMX01BWF9TQ0FOX1NJWkUgLSBzaXplb2YoKnNjYW4pKTsKKwlzY2FuLT50eF9jbWQubGVuID0gY3B1X3RvX2xlMTYobGVuKTsKKworCS8qIHNlbGVjdCBSeCBhbnRlbm5hcyAqLworCXNjYW4tPmZsYWdzIHw9IGlsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhpbCk7CisKKwlzY2FuLT5jaGFubmVsX2NvdW50ID0KKwkgICAgaWwzOTQ1X2dldF9jaGFubmVsc19mb3Jfc2NhbihpbCwgYmFuZCwgaXNfYWN0aXZlLCBuX3Byb2JlcywKKwkJCQkJICh2b2lkICopJnNjYW4tPmRhdGFbbGVuXSwgdmlmKTsKKwlpZiAoc2Nhbi0+Y2hhbm5lbF9jb3VudCA9PSAwKSB7CisJCURfU0NBTigiY2hhbm5lbCBjb3VudCAlZFxuIiwgc2Nhbi0+Y2hhbm5lbF9jb3VudCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNtZC5sZW4gKz0KKwkgICAgbGUxNl90b19jcHUoc2Nhbi0+dHhfY21kLmxlbikgKworCSAgICBzY2FuLT5jaGFubmVsX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBpbDM5NDVfc2Nhbl9jaGFubmVsKTsKKwljbWQuZGF0YSA9IHNjYW47CisJc2Nhbi0+bGVuID0gY3B1X3RvX2xlMTYoY21kLmxlbik7CisKKwlzZXRfYml0KFNfU0NBTl9IVywgJmlsLT5zdGF0dXMpOworCXJldCA9IGlsX3NlbmRfY21kX3N5bmMoaWwsICZjbWQpOworCWlmIChyZXQpCisJCWNsZWFyX2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKTsKKwlyZXR1cm4gcmV0OworfQorCit2b2lkCitpbDM5NDVfcG9zdF9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCS8qCisJICogU2luY2Ugc2V0dGluZyB0aGUgUlhPTiBtYXkgaGF2ZSBiZWVuIGRlZmVycmVkIHdoaWxlCisJICogcGVyZm9ybWluZyB0aGUgc2NhbiwgZmlyZSBvbmUgb2ZmIGlmIG5lZWRlZAorCSAqLworCWlmIChtZW1jbXAoJmN0eC0+c3RhZ2luZywgJmN0eC0+YWN0aXZlLCBzaXplb2YoY3R4LT5zdGFnaW5nKSkpCisJCWlsMzk0NV9jb21taXRfcnhvbihpbCwgY3R4KTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9iZ19yZXN0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIHJlc3RhcnQpOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU19GV19FUlJPUiwgJmlsLT5zdGF0dXMpKSB7CisJCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJCWlsLT5jdHgudmlmID0gTlVMTDsKKwkJaWwtPmlzX29wZW4gPSAwOworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCWlsMzk0NV9kb3duKGlsKTsKKwkJaWVlZTgwMjExX3Jlc3RhcnRfaHcoaWwtPmh3KTsKKwl9IGVsc2UgeworCQlpbDM5NDVfZG93bihpbCk7CisKKwkJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwkJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpIHsKKwkJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwkJCXJldHVybjsKKwkJfQorCisJCV9faWwzOTQ1X3VwKGlsKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCX0KK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9iZ19yeF9yZXBsZW5pc2goc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaWxfcHJpdiwgcnhfcmVwbGVuaXNoKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCWdvdG8gb3V0OworCisJaWwzOTQ1X3J4X3JlcGxlbmlzaChpbCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCit2b2lkCitpbDM5NDVfcG9zdF9hc3NvY2lhdGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYyA9IDA7CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gTlVMTDsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCWlmICghY3R4LT52aWYgfHwgIWlsLT5pc19vcGVuKQorCQlyZXR1cm47CisKKwlEX0FTU09DKCJBc3NvY2lhdGVkIGFzICVkIHRvOiAlcE1cbiIsIGN0eC0+dmlmLT5ic3NfY29uZi5haWQsCisJCWN0eC0+YWN0aXZlLmJzc2lkX2FkZHIpOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlsX3NjYW5fY2FuY2VsX3RpbWVvdXQoaWwsIDIwMCk7CisKKwljb25mID0gJmlsLT5ody0+Y29uZjsKKworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKwlpbDM5NDVfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwlyYyA9IGlsX3NlbmRfcnhvbl90aW1pbmcoaWwsIGN0eCk7CisJaWYgKHJjKQorCQlJTF9XQVJOKCJDX1JYT05fVElNSU5HIGZhaWxlZCAtICIgIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKKworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCisJY3R4LT5zdGFnaW5nLmFzc29jX2lkID0gY3B1X3RvX2xlMTYoY3R4LT52aWYtPmJzc19jb25mLmFpZCk7CisKKwlEX0FTU09DKCJhc3NvYyBpZCAlZCBiZWFjb24gaW50ZXJ2YWwgJWRcbiIsIGN0eC0+dmlmLT5ic3NfY29uZi5haWQsCisJCWN0eC0+dmlmLT5ic3NfY29uZi5iZWFjb25faW50KTsKKworCWlmIChjdHgtPnZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCWVsc2UKKwkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisKKwlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7CisJCWlmIChjdHgtPnZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCWVsc2UKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJfQorCisJaWwzOTQ1X2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCisJc3dpdGNoIChjdHgtPnZpZi0+dHlwZSkgeworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJaWwzOTQ1X3JhdGVfc2NhbGVfaW5pdChpbC0+aHcsIElMX0FQX0lEKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJaWwzOTQ1X3NlbmRfYmVhY29uX2NtZChpbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX0VSUigiJXMgU2hvdWxkIG5vdCBiZSBjYWxsZWQgaW4gJWQgbW9kZVxuIiwgX19mdW5jX18sCisJCSAgICAgICBjdHgtPnZpZi0+dHlwZSk7CisJCWJyZWFrOworCX0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbWFjODAyMTEgZW50cnkgcG9pbnQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFVDT0RFX1JFQURZX1RJTUVPVVQJKDIgKiBIWikKKworc3RhdGljIGludAoraWwzOTQ1X21hY19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlpbnQgcmV0OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJLyogd2Ugc2hvdWxkIGJlIHZlcmlmeWluZyB0aGUgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIG9wZW5lZCAqLworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwkvKiBmZXRjaCB1Y29kZSBmaWxlIGZyb20gZGlzaywgYWxsb2MgYW5kIGNvcHkgdG8gYnVzLW1hc3RlciBidWZmZXJzIC4uLgorCSAqIHVjb2RlIGZpbGVuYW1lIGFuZCBtYXggc2l6ZXMgYXJlIGNhcmQtc3BlY2lmaWMuICovCisKKwlpZiAoIWlsLT51Y29kZV9jb2RlLmxlbikgeworCQlyZXQgPSBpbDM5NDVfcmVhZF91Y29kZShpbCk7CisJCWlmIChyZXQpIHsKKwkJCUlMX0VSUigiQ291bGQgbm90IHJlYWQgbWljcm9jb2RlOiAlZFxuIiwgcmV0KTsKKwkJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwkJCWdvdG8gb3V0X3JlbGVhc2VfaXJxOworCQl9CisJfQorCisJcmV0ID0gX19pbDM5NDVfdXAoaWwpOworCisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJaWYgKHJldCkKKwkJZ290byBvdXRfcmVsZWFzZV9pcnE7CisKKwlEX0lORk8oIlN0YXJ0IFVQIHdvcmsuXG4iKTsKKworCS8qIFdhaXQgZm9yIFNUQVJUX0FMSVZFIGZyb20gdWNvZGUuIE90aGVyd2lzZSBjYWxsYmFja3MgZnJvbQorCSAqIG1hYzgwMjExIHdpbGwgbm90IGJlIHJ1biBzdWNjZXNzZnVsbHkuICovCisJcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KGlsLT53YWl0X2NvbW1hbmRfcXVldWUsCisJCQkJIHRlc3RfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKSwKKwkJCQkgVUNPREVfUkVBRFlfVElNRU9VVCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKCF0ZXN0X2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cykpIHsKKwkJCUlMX0VSUigiV2FpdCBmb3IgU1RBUlRfQUxJVkUgdGltZW91dCBhZnRlciAlZG1zLlxuIiwKKwkJCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKFVDT0RFX1JFQURZX1RJTUVPVVQpKTsKKwkJCXJldCA9IC1FVElNRURPVVQ7CisJCQlnb3RvIG91dF9yZWxlYXNlX2lycTsKKwkJfQorCX0KKworCS8qIHVjb2RlIGlzIHJ1bm5pbmcgYW5kIHdpbGwgc2VuZCByZmtpbGwgbm90aWZpY2F0aW9ucywKKwkgKiBubyBuZWVkIHRvIHBvbGwgdGhlIGtpbGxzd2l0Y2ggc3RhdGUgYW55bW9yZSAqLworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmlsLT5fMzk0NS5yZmtpbGxfcG9sbCk7CisKKwlpbC0+aXNfb3BlbiA9IDE7CisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCXJldHVybiAwOworCitvdXRfcmVsZWFzZV9pcnE6CisJaWwtPmlzX29wZW4gPSAwOworCURfTUFDODAyMTEoImxlYXZlIC0gZmFpbGVkXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X21hY19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJaWYgKCFpbC0+aXNfb3BlbikgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIHNraXBcbiIpOworCQlyZXR1cm47CisJfQorCisJaWwtPmlzX29wZW4gPSAwOworCisJaWwzOTQ1X2Rvd24oaWwpOworCisJZmx1c2hfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCisJLyogc3RhcnQgcG9sbGluZyB0aGUga2lsbHN3aXRjaCBzdGF0ZSBhZ2FpbiAqLworCXF1ZXVlX2RlbGF5ZWRfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPl8zOTQ1LnJma2lsbF9wb2xsLAorCQkJICAgcm91bmRfamlmZmllc19yZWxhdGl2ZSgyICogSFopKTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwlEX1RYKCJkZXYtPnhtaXQoJWQgYnl0ZXMpIGF0IHJhdGUgMHglMDJ4XG4iLCBza2ItPmxlbiwKKwkgICAgIGllZWU4MDIxMV9nZXRfdHhfcmF0ZShodywgSUVFRTgwMjExX1NLQl9DQihza2IpKS0+Yml0cmF0ZSk7CisKKwlpZiAoaWwzOTQ1X3R4X3NrYihpbCwgc2tiKSkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KKwordm9pZAoraWwzOTQ1X2NvbmZpZ19hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCWludCByYyA9IDA7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJLyogVGhlIGZvbGxvd2luZyBzaG91bGQgYmUgZG9uZSBvbmx5IGF0IEFQIGJyaW5nIHVwICovCisJaWYgKCEoaWxfaXNfYXNzb2NpYXRlZChpbCkpKSB7CisKKwkJLyogUlhPTiAtIHVuYXNzb2MgKHRvIHNldCB0aW1pbmcgY29tbWFuZCkgKi8KKwkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQlpbDM5NDVfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwkJLyogUlhPTiBUaW1pbmcgKi8KKwkJcmMgPSBpbF9zZW5kX3J4b25fdGltaW5nKGlsLCBjdHgpOworCQlpZiAocmMpCisJCQlJTF9XQVJOKCJDX1JYT05fVElNSU5HIGZhaWxlZCAtICIKKwkJCQkiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOworCisJCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IDA7CisKKwkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3ByZWFtYmxlKQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKwkJZWxzZQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisKKwkJaWYgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSykgeworCQkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCisJCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCQkJZWxzZQorCQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCX0KKwkJLyogcmVzdG9yZSBSWE9OIGFzc29jICovCisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQlpbDM5NDVfY29tbWl0X3J4b24oaWwsIGN0eCk7CisJfQorCWlsMzk0NV9zZW5kX2JlYWNvbl9jbWQoaWwpOworfQorCitzdGF0aWMgaW50CitpbDM5NDVfbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJaW50IHJldCA9IDA7CisJdTggc3RhX2lkID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCXU4IHN0YXRpY19rZXk7CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwlpZiAoaWwzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7CisJCURfTUFDODAyMTEoImxlYXZlIC0gaHdjcnlwdG8gZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJLyoKKwkgKiBUbyBzdXBwb3J0IElCU1MgUlNOLCBkb24ndCBwcm9ncmFtIGdyb3VwIGtleXMgaW4gSUJTUywgdGhlCisJICogaGFyZHdhcmUgd2lsbCB0aGVuIG5vdCBhdHRlbXB0IHRvIGRlY3J5cHQgdGhlIGZyYW1lcy4KKwkgKi8KKwlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCisJICAgICEoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXN0YXRpY19rZXkgPSAhaWxfaXNfYXNzb2NpYXRlZChpbCk7CisKKwlpZiAoIXN0YXRpY19rZXkpIHsKKwkJc3RhX2lkID0gaWxfc3RhX2lkX29yX2Jyb2FkY2FzdChpbCwgJmlsLT5jdHgsIHN0YSk7CisJCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAxMDApOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNFVF9LRVk6CisJCWlmIChzdGF0aWNfa2V5KQorCQkJcmV0ID0gaWwzOTQ1X3NldF9zdGF0aWNfa2V5KGlsLCBrZXkpOworCQllbHNlCisJCQlyZXQgPSBpbDM5NDVfc2V0X2R5bmFtaWNfa2V5KGlsLCBrZXksIHN0YV9pZCk7CisJCURfTUFDODAyMTEoImVuYWJsZSBod2NyeXB0byBrZXlcbiIpOworCQlicmVhazsKKwljYXNlIERJU0FCTEVfS0VZOgorCQlpZiAoc3RhdGljX2tleSkKKwkJCXJldCA9IGlsMzk0NV9yZW1vdmVfc3RhdGljX2tleShpbCk7CisJCWVsc2UKKwkJCXJldCA9IGlsMzk0NV9jbGVhcl9zdGFfa2V5X2luZm8oaWwsIHN0YV9pZCk7CisJCURfTUFDODAyMTEoImRpc2FibGUgaHdjcnlwdG8ga2V5XG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X21hY19zdGFfYWRkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXN0cnVjdCBpbDM5NDVfc3RhX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCWludCByZXQ7CisJYm9vbCBpc19hcCA9IHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOworCXU4IHN0YV9pZDsKKworCURfSU5GTygicmVjZWl2ZWQgcmVxdWVzdCB0byBhZGQgc3RhdGlvbiAlcE1cbiIsIHN0YS0+YWRkcik7CisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlEX0lORk8oInByb2NlZWRpbmcgdG8gYWRkIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCisJcmV0ID0KKwkgICAgaWxfYWRkX3N0YXRpb25fY29tbW9uKGlsLCAmaWwtPmN0eCwgc3RhLT5hZGRyLCBpc19hcCwgc3RhLCAmc3RhX2lkKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIGFkZCBzdGF0aW9uICVwTSAoJWQpXG4iLCBzdGEtPmFkZHIsIHJldCk7CisJCS8qIFNob3VsZCB3ZSByZXR1cm4gc3VjY2VzcyBpZiByZXR1cm4gY29kZSBpcyBFRVhJU1QgPyAqLworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCXJldHVybiByZXQ7CisJfQorCisJc3RhX3ByaXYtPmNvbW1vbi5zdGFfaWQgPSBzdGFfaWQ7CisKKwkvKiBJbml0aWFsaXplIHJhdGUgc2NhbGluZyAqLworCURfSU5GTygiSW5pdGlhbGl6aW5nIHJhdGUgc2NhbGluZyBmb3Igc3RhdGlvbiAlcE1cbiIsIHN0YS0+YWRkcik7CisJaWwzOTQ1X3JzX3JhdGVfaW5pdChpbCwgc3RhLCBzdGFfaWQpOworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywgdTY0IG11bHRpY2FzdCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlfX2xlMzIgZmlsdGVyX29yID0gMCwgZmlsdGVyX25hbmQgPSAwOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisjZGVmaW5lIENISyh0ZXN0LCBmbGFnKQlkbyB7IFwKKwlpZiAoKnRvdGFsX2ZsYWdzICYgKHRlc3QpKQkJXAorCQlmaWx0ZXJfb3IgfD0gKGZsYWcpOwkJXAorCWVsc2UJCQkJCVwKKwkJZmlsdGVyX25hbmQgfD0gKGZsYWcpOwkJXAorCX0gd2hpbGUgKDApCisKKwlEX01BQzgwMjExKCJFbnRlcjogY2hhbmdlZDogMHgleCwgdG90YWw6IDB4JXhcbiIsIGNoYW5nZWRfZmxhZ3MsCisJCSAgICp0b3RhbF9mbGFncyk7CisKKwlDSEsoRklGX09USEVSX0JTUyB8IEZJRl9QUk9NSVNDX0lOX0JTUywgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0spOworCUNISyhGSUZfQ09OVFJPTCwgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLKTsKKwlDSEsoRklGX0JDTl9QUkJSRVNQX1BST01JU0MsIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKTsKKworI3VuZGVmIENISworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gfmZpbHRlcl9uYW5kOworCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gZmlsdGVyX29yOworCisJLyoKKwkgKiBOb3QgY29tbWl0dGluZyBkaXJlY3RseSBiZWNhdXNlIGhhcmR3YXJlIGNhbiBwZXJmb3JtIGEgc2NhbiwKKwkgKiBidXQgZXZlbiBpZiBodyBpcyByZWFkeSwgY29tbWl0dGluZyBoZXJlIGJyZWFrcyBmb3Igc29tZSByZWFzb24sCisJICogd2UnbGwgZXZlbnR1YWxseSBjb21taXQgdGhlIGZpbHRlciBmbGFncyBjaGFuZ2UgYW55d2F5LgorCSAqLworCisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJLyoKKwkgKiBSZWNlaXZpbmcgYWxsIG11bHRpY2FzdCBmcmFtZXMgaXMgYWx3YXlzIGVuYWJsZWQgYnkgdGhlCisJICogZGVmYXVsdCBmbGFncyBzZXR1cCBpbiBpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKCkKKwkgKiBzaW5jZSB3ZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgcHJvZ3JhbW1pbmcgbXVsdGljYXN0CisJICogZmlsdGVycyBpbnRvIHRoZSBkZXZpY2UuCisJICovCisJKnRvdGFsX2ZsYWdzICY9CisJICAgIEZJRl9PVEhFUl9CU1MgfCBGSUZfQUxMTVVMVEkgfCBGSUZfUFJPTUlTQ19JTl9CU1MgfAorCSAgICBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQyB8IEZJRl9DT05UUk9MOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBzeXNmcyBhdHRyaWJ1dGVzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGFkZHMgYSBuZXcgYXR0cmlidXRlIHRvIHRoZSBzeXNmcyByZXByZXNlbnRhdGlvbgorICogb2YgdGhpcyBkZXZpY2UgZHJpdmVyIChpLmUuIGEgbmV3IGZpbGUgaW4gL3N5cy9idXMvcGNpL2RyaXZlcnMvaXdsLykKKyAqIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBkZWJ1ZyBsZXZlbC4KKyAqCisgKiBTZWUgdGhlIGxldmVsIGRlZmluaXRpb25zIGluIGl3bCBmb3IgZGV0YWlscy4KKyAqCisgKiBUaGUgZGVidWdfbGV2ZWwgYmVpbmcgbWFuYWdlZCB1c2luZyBzeXNmcyBiZWxvdyBpcyBhIHBlciBkZXZpY2UgZGVidWcKKyAqIGxldmVsIHRoYXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgZGVidWcgbGV2ZWwgaWYgaXQgKHRoZSBwZXIKKyAqIGRldmljZSBkZWJ1ZyBsZXZlbCkgaXMgc2V0LgorICovCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4WFxuIiwgaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RvcmVfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOworCWlmIChyZXQpCisJCUlMX0lORk8oIiVzIGlzIG5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKKwllbHNlIHsKKwkJaWwtPmRlYnVnX2xldmVsID0gdmFsOworCQlpZiAoaWxfYWxsb2NfdHJhZmZpY19tZW0oaWwpKQorCQkJSUxfRVJSKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBnZW5lcmF0ZSB0cmFmZmljIGxvZ1xuIik7CisJfQorCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIoZGVidWdfbGV2ZWwsIFNfSVdVU1IgfCBTX0lSVUdPLCBpbDM5NDVfc2hvd19kZWJ1Z19sZXZlbCwKKwkJICAgaWwzOTQ1X3N0b3JlX2RlYnVnX2xldmVsKTsKKworI2VuZGlmIC8qIENPTkZJR19JV0xFR0FDWV9ERUJVRyAqLworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfdGVtcGVyYXR1cmUoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQljaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGlsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUoaWwpKTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKHRlbXBlcmF0dXJlLCBTX0lSVUdPLCBpbDM5NDVfc2hvd190ZW1wZXJhdHVyZSwgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc2hvd190eF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaWwtPnR4X3Bvd2VyX3VzZXJfbG10KTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zdG9yZV90eF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWNoYXIgKnAgPSAoY2hhciAqKWJ1ZjsKKwl1MzIgdmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwocCwgJnAsIDEwKTsKKwlpZiAocCA9PSBidWYpCisJCUlMX0lORk8oIjogJXMgaXMgbm90IGluIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7CisJZWxzZQorCQlpbDM5NDVfaHdfcmVnX3NldF90eHBvd2VyKGlsLCB2YWwpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodHhfcG93ZXIsIFNfSVdVU1IgfCBTX0lSVUdPLCBpbDM5NDVfc2hvd190eF9wb3dlciwKKwkJICAgaWwzOTQ1X3N0b3JlX3R4X3Bvd2VyKTsKKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zaG93X2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDRYXG4iLCBjdHgtPmFjdGl2ZS5mbGFncyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RvcmVfZmxhZ3Moc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwl1MzIgZmxhZ3MgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpZiAobGUzMl90b19jcHUoY3R4LT5zdGFnaW5nLmZsYWdzKSAhPSBmbGFncykgeworCQkvKiBDYW5jZWwgYW55IGN1cnJlbnRseSBydW5uaW5nIHNjYW5zLi4uICovCisJCWlmIChpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAxMDApKQorCQkJSUxfV0FSTigiQ291bGQgbm90IGNhbmNlbCBzY2FuLlxuIik7CisJCWVsc2UgeworCQkJRF9JTkZPKCJDb21taXR0aW5nIHJ4b24uZmxhZ3MgPSAweCUwNFhcbiIsIGZsYWdzKTsKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyA9IGNwdV90b19sZTMyKGZsYWdzKTsKKwkJCWlsMzk0NV9jb21taXRfcnhvbihpbCwgY3R4KTsKKwkJfQorCX0KKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihmbGFncywgU19JV1VTUiB8IFNfSVJVR08sIGlsMzk0NV9zaG93X2ZsYWdzLAorCQkgICBpbDM5NDVfc3RvcmVfZmxhZ3MpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfZmlsdGVyX2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwNFhcbiIsIGxlMzJfdG9fY3B1KGN0eC0+YWN0aXZlLmZpbHRlcl9mbGFncykpOworfQorCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3N0b3JlX2ZpbHRlcl9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXUzMiBmaWx0ZXJfZmxhZ3MgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpZiAobGUzMl90b19jcHUoY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncykgIT0gZmlsdGVyX2ZsYWdzKSB7CisJCS8qIENhbmNlbCBhbnkgY3VycmVudGx5IHJ1bm5pbmcgc2NhbnMuLi4gKi8KKwkJaWYgKGlsX3NjYW5fY2FuY2VsX3RpbWVvdXQoaWwsIDEwMCkpCisJCQlJTF9XQVJOKCJDb3VsZCBub3QgY2FuY2VsIHNjYW4uXG4iKTsKKwkJZWxzZSB7CisJCQlEX0lORk8oIkNvbW1pdHRpbmcgcnhvbi5maWx0ZXJfZmxhZ3MgPSAiICIweCUwNFhcbiIsCisJCQkgICAgICAgZmlsdGVyX2ZsYWdzKTsKKwkJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgPSBjcHVfdG9fbGUzMihmaWx0ZXJfZmxhZ3MpOworCQkJaWwzOTQ1X2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCQl9CisJfQorCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGZpbHRlcl9mbGFncywgU19JV1VTUiB8IFNfSVJVR08sIGlsMzk0NV9zaG93X2ZpbHRlcl9mbGFncywKKwkJICAgaWwzOTQ1X3N0b3JlX2ZpbHRlcl9mbGFncyk7CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc2hvd19tZWFzdXJlbWVudChzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJc3RydWN0IGlsX3NwZWN0cnVtX25vdGlmaWNhdGlvbiBtZWFzdXJlX3JlcG9ydDsKKwl1MzIgc2l6ZSA9IHNpemVvZihtZWFzdXJlX3JlcG9ydCksIGxlbiA9IDAsIG9mcyA9IDA7CisJdTggKmRhdGEgPSAodTggKikgJm1lYXN1cmVfcmVwb3J0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShpbC0+bWVhc3VyZW1lbnRfc3RhdHVzICYgTUVBU1VSRU1FTlRfUkVBRFkpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkoJm1lYXN1cmVfcmVwb3J0LCAmaWwtPm1lYXN1cmVfcmVwb3J0LCBzaXplKTsKKwlpbC0+bWVhc3VyZW1lbnRfc3RhdHVzID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUgKHNpemUgJiYgUEFHRV9TSVpFIC0gbGVuKSB7CisJCWhleF9kdW1wX3RvX2J1ZmZlcihkYXRhICsgb2ZzLCBzaXplLCAxNiwgMSwgYnVmICsgbGVuLAorCQkJCSAgIFBBR0VfU0laRSAtIGxlbiwgMSk7CisJCWxlbiA9IHN0cmxlbihidWYpOworCQlpZiAoUEFHRV9TSVpFIC0gbGVuKQorCQkJYnVmW2xlbisrXSA9ICdcbic7CisKKwkJb2ZzICs9IDE2OworCQlzaXplIC09IG1pbihzaXplLCAxNlUpOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RvcmVfbWVhc3VyZW1lbnQoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXN0cnVjdCBpZWVlODAyMTFfbWVhc3VyZW1lbnRfcGFyYW1zIHBhcmFtcyA9IHsKKwkJLmNoYW5uZWwgPSBsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSwKKwkJLnN0YXJ0X3RpbWUgPSBjcHVfdG9fbGU2NChpbC0+XzM5NDUubGFzdF90c2YpLAorCQkuZHVyYXRpb24gPSBjcHVfdG9fbGUxNigxKSwKKwl9OworCXU4IHR5cGUgPSBJTF9NRUFTVVJFX0JBU0lDOworCXU4IGJ1ZmZlclszMl07CisJdTggY2hhbm5lbDsKKworCWlmIChjb3VudCkgeworCQljaGFyICpwID0gYnVmZmVyOworCQlzdHJuY3B5KGJ1ZmZlciwgYnVmLCBtaW4oc2l6ZW9mKGJ1ZmZlciksIGNvdW50KSk7CisJCWNoYW5uZWwgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKKwkJaWYgKGNoYW5uZWwpCisJCQlwYXJhbXMuY2hhbm5lbCA9IGNoYW5uZWw7CisKKwkJcCA9IGJ1ZmZlcjsKKwkJd2hpbGUgKCpwICYmICpwICE9ICcgJykKKwkJCXArKzsKKwkJaWYgKCpwKQorCQkJdHlwZSA9IHNpbXBsZV9zdHJ0b3VsKHAgKyAxLCBOVUxMLCAwKTsKKwl9CisKKwlEX0lORk8oIkludm9raW5nIG1lYXN1cmVtZW50IG9mIHR5cGUgJWQgb24gIiAiY2hhbm5lbCAlZCAoZm9yICclcycpXG4iLAorCSAgICAgICB0eXBlLCBwYXJhbXMuY2hhbm5lbCwgYnVmKTsKKwlpbDM5NDVfZ2V0X21lYXN1cmVtZW50KGlsLCAmcGFyYW1zLCB0eXBlKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIERFVklDRV9BVFRSKG1lYXN1cmVtZW50LCBTX0lSVVNSIHwgU19JV1VTUiwgaWwzOTQ1X3Nob3dfbWVhc3VyZW1lbnQsCisJCSAgIGlsMzk0NV9zdG9yZV9tZWFzdXJlbWVudCk7CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfc3RvcmVfcmV0cnlfcmF0ZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKworCWlsLT5yZXRyeV9yYXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKKwlpZiAoaWwtPnJldHJ5X3JhdGUgPD0gMCkKKwkJaWwtPnJldHJ5X3JhdGUgPSAxOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfcmV0cnlfcmF0ZShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCBpbC0+cmV0cnlfcmF0ZSk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihyZXRyeV9yYXRlLCBTX0lXVVNSIHwgU19JUlVTUiwgaWwzOTQ1X3Nob3dfcmV0cnlfcmF0ZSwKKwkJICAgaWwzOTQ1X3N0b3JlX3JldHJ5X3JhdGUpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfY2hhbm5lbHMoc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwkvKiBhbGwgdGhpcyBzaGl0IGRvZXNuJ3QgYmVsb25nIGludG8gc3lzZnMgYW55d2F5ICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihjaGFubmVscywgU19JUlVTUiwgaWwzOTQ1X3Nob3dfY2hhbm5lbHMsIE5VTEwpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfYW50ZW5uYShzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpbDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zdG9yZV9hbnRlbm5hKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCBfX21heWJlX3VudXNlZCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwlpbnQgYW50OworCisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCisJaWYgKHNzY2FuZihidWYsICIlMWkiLCAmYW50KSAhPSAxKSB7CisJCURfSU5GTygibm90IGluIGhleCBvciBkZWNpbWFsIGZvcm0uXG4iKTsKKwkJcmV0dXJuIGNvdW50OworCX0KKworCWlmIChhbnQgPj0gMCAmJiBhbnQgPD0gMikgeworCQlEX0lORk8oIlNldHRpbmcgYW50ZW5uYSBzZWxlY3QgdG8gJWQuXG4iLCBhbnQpOworCQlpbDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hID0gKGVudW0gaWwzOTQ1X2FudGVubmEpYW50OworCX0gZWxzZQorCQlEX0lORk8oIkJhZCBhbnRlbm5hIHNlbGVjdCB2YWx1ZSAlZC5cbiIsIGFudCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihhbnRlbm5hLCBTX0lXVVNSIHwgU19JUlVHTywgaWwzOTQ1X3Nob3dfYW50ZW5uYSwKKwkJICAgaWwzOTQ1X3N0b3JlX2FudGVubmEpOworCitzdGF0aWMgc3NpemVfdAoraWwzOTQ1X3Nob3dfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOHhcbiIsIChpbnQpaWwtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihzdGF0dXMsIFNfSVJVR08sIGlsMzk0NV9zaG93X3N0YXR1cywgTlVMTCk7CisKK3N0YXRpYyBzc2l6ZV90CitpbDM5NDVfZHVtcF9lcnJvcl9sb2coc3RydWN0IGRldmljZSAqZCwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKwljaGFyICpwID0gKGNoYXIgKilidWY7CisKKwlpZiAocFswXSA9PSAnMScpCisJCWlsMzk0NV9kdW1wX25pY19lcnJvcl9sb2coaWwpOworCisJcmV0dXJuIHN0cm5sZW4oYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUihkdW1wX2Vycm9ycywgU19JV1VTUiwgTlVMTCwgaWwzOTQ1X2R1bXBfZXJyb3JfbG9nKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyIGRvd24KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpbDM5NDVfc2V0dXBfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKERSVl9OQU1FKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCisJSU5JVF9XT1JLKCZpbC0+cmVzdGFydCwgaWwzOTQ1X2JnX3Jlc3RhcnQpOworCUlOSVRfV09SSygmaWwtPnJ4X3JlcGxlbmlzaCwgaWwzOTQ1X2JnX3J4X3JlcGxlbmlzaCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmlsLT5pbml0X2FsaXZlX3N0YXJ0LCBpbDM5NDVfYmdfaW5pdF9hbGl2ZV9zdGFydCk7CisJSU5JVF9ERUxBWUVEX1dPUksoJmlsLT5hbGl2ZV9zdGFydCwgaWwzOTQ1X2JnX2FsaXZlX3N0YXJ0KTsKKwlJTklUX0RFTEFZRURfV09SSygmaWwtPl8zOTQ1LnJma2lsbF9wb2xsLCBpbDM5NDVfcmZraWxsX3BvbGwpOworCisJaWxfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKGlsKTsKKworCWlsMzk0NV9od19zZXR1cF9kZWZlcnJlZF93b3JrKGlsKTsKKworCWluaXRfdGltZXIoJmlsLT53YXRjaGRvZyk7CisJaWwtPndhdGNoZG9nLmRhdGEgPSAodW5zaWduZWQgbG9uZylpbDsKKwlpbC0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBpbF9iZ193YXRjaGRvZzsKKworCXRhc2tsZXRfaW5pdCgmaWwtPmlycV90YXNrbGV0LAorCQkgICAgICh2b2lkICgqKSh1bnNpZ25lZCBsb25nKSlpbDM5NDVfaXJxX3Rhc2tsZXQsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpaWwpOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbDM5NDVfaHdfY2FuY2VsX2RlZmVycmVkX3dvcmsoaWwpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZpbC0+aW5pdF9hbGl2ZV9zdGFydCk7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWwtPmFsaXZlX3N0YXJ0KTsKKworCWlsX2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmsoaWwpOworfQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaWwzOTQ1X3N5c2ZzX2VudHJpZXNbXSA9IHsKKwkmZGV2X2F0dHJfYW50ZW5uYS5hdHRyLAorCSZkZXZfYXR0cl9jaGFubmVscy5hdHRyLAorCSZkZXZfYXR0cl9kdW1wX2Vycm9ycy5hdHRyLAorCSZkZXZfYXR0cl9mbGFncy5hdHRyLAorCSZkZXZfYXR0cl9maWx0ZXJfZmxhZ3MuYXR0ciwKKwkmZGV2X2F0dHJfbWVhc3VyZW1lbnQuYXR0ciwKKwkmZGV2X2F0dHJfcmV0cnlfcmF0ZS5hdHRyLAorCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKKwkmZGV2X2F0dHJfdGVtcGVyYXR1cmUuYXR0ciwKKwkmZGV2X2F0dHJfdHhfcG93ZXIuYXR0ciwKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwkmZGV2X2F0dHJfZGVidWdfbGV2ZWwuYXR0ciwKKyNlbmRpZgorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGlsMzk0NV9hdHRyaWJ1dGVfZ3JvdXAgPSB7CisJLm5hbWUgPSBOVUxMLAkJLyogcHV0IGluIGRldmljZSBkaXJlY3RvcnkgKi8KKwkuYXR0cnMgPSBpbDM5NDVfc3lzZnNfZW50cmllcywKK307CisKK3N0cnVjdCBpZWVlODAyMTFfb3BzIGlsMzk0NV9od19vcHMgPSB7CisJLnR4ID0gaWwzOTQ1X21hY190eCwKKwkuc3RhcnQgPSBpbDM5NDVfbWFjX3N0YXJ0LAorCS5zdG9wID0gaWwzOTQ1X21hY19zdG9wLAorCS5hZGRfaW50ZXJmYWNlID0gaWxfbWFjX2FkZF9pbnRlcmZhY2UsCisJLnJlbW92ZV9pbnRlcmZhY2UgPSBpbF9tYWNfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY2hhbmdlX2ludGVyZmFjZSA9IGlsX21hY19jaGFuZ2VfaW50ZXJmYWNlLAorCS5jb25maWcgPSBpbF9tYWNfY29uZmlnLAorCS5jb25maWd1cmVfZmlsdGVyID0gaWwzOTQ1X2NvbmZpZ3VyZV9maWx0ZXIsCisJLnNldF9rZXkgPSBpbDM5NDVfbWFjX3NldF9rZXksCisJLmNvbmZfdHggPSBpbF9tYWNfY29uZl90eCwKKwkucmVzZXRfdHNmID0gaWxfbWFjX3Jlc2V0X3RzZiwKKwkuYnNzX2luZm9fY2hhbmdlZCA9IGlsX21hY19ic3NfaW5mb19jaGFuZ2VkLAorCS5od19zY2FuID0gaWxfbWFjX2h3X3NjYW4sCisJLnN0YV9hZGQgPSBpbDM5NDVfbWFjX3N0YV9hZGQsCisJLnN0YV9yZW1vdmUgPSBpbF9tYWNfc3RhX3JlbW92ZSwKKwkudHhfbGFzdF9iZWFjb24gPSBpbF9tYWNfdHhfbGFzdF9iZWFjb24sCit9OworCitzdGF0aWMgaW50CitpbDM5NDVfaW5pdF9kcnYoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQ7CisJc3RydWN0IGlsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqKWlsLT5lZXByb207CisKKwlpbC0+cmV0cnlfcmF0ZSA9IDE7CisJaWwtPmJlYWNvbl9za2IgPSBOVUxMOworCisJc3Bpbl9sb2NrX2luaXQoJmlsLT5zdGFfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmlsLT5oY21kX2xvY2spOworCisJSU5JVF9MSVNUX0hFQUQoJmlsLT5mcmVlX2ZyYW1lcyk7CisKKwltdXRleF9pbml0KCZpbC0+bXV0ZXgpOworCisJaWwtPmllZWVfY2hhbm5lbHMgPSBOVUxMOworCWlsLT5pZWVlX3JhdGVzID0gTlVMTDsKKwlpbC0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7CisKKwlpbC0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisJaWwtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkID0gSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGOworCisJLyogaW5pdGlhbGl6ZSBmb3JjZSByZXNldCAqLworCWlsLT5mb3JjZV9yZXNldC5yZXNldF9kdXJhdGlvbiA9IElMX0RFTEFZX05FWFRfRk9SQ0VfRldfUkVMT0FEOworCisJaWYgKGVlcHJvbS0+dmVyc2lvbiA8IEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OKSB7CisJCUlMX1dBUk4oIlVuc3VwcG9ydGVkIEVFUFJPTSB2ZXJzaW9uOiAweCUwNFhcbiIsCisJCQllZXByb20tPnZlcnNpb24pOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gaWxfaW5pdF9jaGFubmVsX21hcChpbCk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoImluaXRpYWxpemluZyByZWd1bGF0b3J5IGZhaWxlZDogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyOworCX0KKworCS8qIFNldCB1cCB0eHBvd2VyIHNldHRpbmdzIGluIGRyaXZlciBmb3IgYWxsIGNoYW5uZWxzICovCisJaWYgKGlsMzk0NV90eHBvd2VyX3NldF9mcm9tX2VlcHJvbShpbCkpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfZnJlZV9jaGFubmVsX21hcDsKKwl9CisKKwlyZXQgPSBpbF9pbml0X2dlb3MoaWwpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJpbml0aWFsaXppbmcgZ2VvcyBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9mcmVlX2NoYW5uZWxfbWFwOworCX0KKwlpbDM5NDVfaW5pdF9od19yYXRlcyhpbCwgaWwtPmllZWVfcmF0ZXMpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2NoYW5uZWxfbWFwOgorCWlsX2ZyZWVfY2hhbm5lbF9tYXAoaWwpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgSUwzOTQ1X01BWF9QUk9CRV9SRVFVRVNUCTIwMAorCitzdGF0aWMgaW50CitpbDM5NDVfc2V0dXBfbWFjKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gaWwtPmh3OworCisJaHctPnJhdGVfY29udHJvbF9hbGdvcml0aG0gPSAiaXdsLTM5NDUtcnMiOworCWh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbDM5NDVfc3RhX3ByaXYpOworCWh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbF92aWZfcHJpdik7CisKKwkvKiBUZWxsIG1hYzgwMjExIG91ciBjaGFyYWN0ZXJpc3RpY3MgKi8KKwlody0+ZmxhZ3MgPSBJRUVFODAyMTFfSFdfU0lHTkFMX0RCTSB8IElFRUU4MDIxMV9IV19TUEVDVFJVTV9NR01UOworCisJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSBpbC0+Y3R4LmludGVyZmFjZV9tb2RlczsKKworCWh3LT53aXBoeS0+ZmxhZ3MgfD0KKwkgICAgV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSB8IFdJUEhZX0ZMQUdfRElTQUJMRV9CRUFDT05fSElOVFMgfAorCSAgICBXSVBIWV9GTEFHX0lCU1NfUlNOOworCisJaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVhfMzk0NTsKKwkvKiB3ZSBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgYW5kIGEgemVyby1sZW5ndGggU1NJRCBlbGVtZW50ICovCisJaHctPndpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSBJTDM5NDVfTUFYX1BST0JFX1JFUVVFU1QgLSAyNCAtIDI7CisKKwkvKiBEZWZhdWx0IHZhbHVlOyA0IEVEQ0EgUU9TIHByaW9yaXRpZXMgKi8KKwlody0+cXVldWVzID0gNDsKKworCWlmIChpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0ubl9jaGFubmVscykKKwkJaWwtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPQorCQkgICAgJmlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKKworCWlmIChpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscykKKwkJaWwtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQorCQkgICAgJmlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKKworCWlsX2xlZHNfaW5pdChpbCk7CisKKwlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoaWwtPmh3KTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiRmFpbGVkIHRvIHJlZ2lzdGVyIGh3IChlcnJvciAlZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCWlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitpbDM5NDVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBpbF9wcml2ICppbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKKwlzdHJ1Y3QgaWxfY2ZnICpjZmcgPSAoc3RydWN0IGlsX2NmZyAqKShlbnQtPmRyaXZlcl9kYXRhKTsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAxLiBBbGxvY2F0aW5nIEhXIGRhdGEKKwkgKiAqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIG1hYzgwMjExIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoaXMgZGV2aWNlIGluc3RhbmNlLCBpbmNsdWRpbmcKKwkgKiAgIHNwYWNlIGZvciB0aGlzIGRyaXZlcidzIGlsYXRlIHN0cnVjdHVyZSAqLworCWh3ID0gaWxfYWxsb2NfYWxsKGNmZyk7CisJaWYgKGh3ID09IE5VTEwpIHsKKwkJcHJfZXJyKCJDYW4gbm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWlsID0gaHctPnByaXY7CisJU0VUX0lFRUU4MDIxMV9ERVYoaHcsICZwZGV2LT5kZXYpOworCisJaWwtPmNtZF9xdWV1ZSA9IElMMzlfQ01EX1FVRVVFX05VTTsKKworCWlsLT5jdHguY3R4aWQgPSAwOworCisJaWwtPmN0eC5yeG9uX2NtZCA9IENfUlhPTjsKKwlpbC0+Y3R4LnJ4b25fdGltaW5nX2NtZCA9IENfUlhPTl9USU1JTkc7CisJaWwtPmN0eC5yeG9uX2Fzc29jX2NtZCA9IENfUlhPTl9BU1NPQzsKKwlpbC0+Y3R4LnFvc19jbWQgPSBDX1FPU19QQVJBTTsKKwlpbC0+Y3R4LmFwX3N0YV9pZCA9IElMX0FQX0lEOworCWlsLT5jdHgud2VwX2tleV9jbWQgPSBDX1dFUEtFWTsKKwlpbC0+Y3R4LmludGVyZmFjZV9tb2RlcyA9CisJICAgIEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB8IEJJVChOTDgwMjExX0lGVFlQRV9BREhPQyk7CisJaWwtPmN0eC5pYnNzX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0lCU1M7CisJaWwtPmN0eC5zdGF0aW9uX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKKwlpbC0+Y3R4LnVudXNlZF9kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9FU1M7CisKKwkvKgorCSAqIERpc2FibGluZyBoYXJkd2FyZSBzY2FuIG1lYW5zIHRoYXQgbWFjODAyMTEgd2lsbCBwZXJmb3JtIHNjYW5zCisJICogInRoZSBoYXJkIHdheSIsIHJhdGhlciB0aGFuIHVzaW5nIGRldmljZSdzIHNjYW4uCisJICovCisJaWYgKGlsMzk0NV9tb2RfcGFyYW1zLmRpc2FibGVfaHdfc2NhbikgeworCQlEX0lORk8oIkRpc2FibGluZyBod19zY2FuXG4iKTsKKwkJaWwzOTQ1X2h3X29wcy5od19zY2FuID0gTlVMTDsKKwl9CisKKwlEX0lORk8oIioqKiBMT0FEIERSSVZFUiAqKipcbiIpOworCWlsLT5jZmcgPSBjZmc7CisJaWwtPnBjaV9kZXYgPSBwZGV2OworCWlsLT5pbnRhX21hc2sgPSBDU1JfSU5JX1NFVF9NQVNLOworCisJaWYgKGlsX2FsbG9jX3RyYWZmaWNfbWVtKGlsKSkKKwkJSUxfRVJSKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBnZW5lcmF0ZSB0cmFmZmljIGxvZ1xuIik7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogMi4gSW5pdGlhbGl6aW5nIFBDSSBidXMKKwkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqLworCXBjaV9kaXNhYmxlX2xpbmtfc3RhdGUocGRldiwKKwkJCSAgICAgICBQQ0lFX0xJTktfU1RBVEVfTDBTIHwgUENJRV9MSU5LX1NUQVRFX0wxIHwKKwkJCSAgICAgICBQQ0lFX0xJTktfU1RBVEVfQ0xLUE0pOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gb3V0X2llZWU4MDIxMV9mcmVlX2h3OworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBkZXYpOworCisJZXJyID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKKwlpZiAoIWVycikKKwkJZXJyID0gcGNpX3NldF9jb25zaXN0ZW50X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOworCWlmIChlcnIpIHsKKwkJSUxfV0FSTigiTm8gc3VpdGFibGUgRE1BIGF2YWlsYWJsZS5cbiIpOworCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisJfQorCisJcGNpX3NldF9kcnZkYXRhKHBkZXYsIGlsKTsKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAzLiBSZWFkIFJFViBSZWdpc3RlcgorCSAqICoqKioqKioqKioqKioqKioqKioqLworCWlsLT5od19iYXNlID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOworCWlmICghaWwtPmh3X2Jhc2UpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczsKKwl9CisKKwlEX0lORk8oInBjaV9yZXNvdXJjZV9sZW4gPSAweCUwOGxseFxuIiwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKKwlEX0lORk8oInBjaV9yZXNvdXJjZV9iYXNlID0gJXBcbiIsIGlsLT5od19iYXNlKTsKKworCS8qIFdlIGRpc2FibGUgdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgKDB4NDEpIHRvIGtlZXAKKwkgKiBQQ0kgVHggcmV0cmllcyBmcm9tIGludGVyZmVyaW5nIHdpdGggQzMgQ1BVIHN0YXRlICovCisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDEsIDB4MDApOworCisJLyogdGhlc2Ugc3BpbiBsb2NrcyB3aWxsIGJlIHVzZWQgaW4gYXBtX29wcy5pbml0IGFuZCBFRVBST00gYWNjZXNzCisJICogd2Ugc2hvdWxkIGluaXQgbm93CisJICovCisJc3Bpbl9sb2NrX2luaXQoJmlsLT5yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmlsLT5sb2NrKTsKKworCS8qCisJICogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciBqdXN0IGluIGNhc2UgaXQgaXMgaW4gYQorCSAqIHN0cmFuZ2Ugc3RhdGUgLi4uIGxpa2UgYmVpbmcgbGVmdCBzdHJhbmRlZCBieSBhIHByaW1hcnkga2VybmVsCisJICogYW5kIHRoaXMgaXMgbm93IHRoZSBrZHVtcCBrZXJuZWwgdHJ5aW5nIHRvIHN0YXJ0IHVwCisJICovCisJX2lsX3dyKGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDQuIFJlYWQgRUVQUk9NCisJICogKioqKioqKioqKioqKioqKioqKiovCisKKwkvKiBSZWFkIHRoZSBFRVBST00gKi8KKwllcnIgPSBpbF9lZXByb21faW5pdChpbCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0IEVFUFJPTVxuIik7CisJCWdvdG8gb3V0X2lvdW5tYXA7CisJfQorCS8qIE1BQyBBZGRyZXNzIGxvY2F0aW9uIGluIEVFUFJPTSBzYW1lIGZvciAzOTQ1LzQ5NjUgKi8KKwllZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCURfSU5GTygiTUFDIGFkZHJlc3M6ICVwTVxuIiwgZWVwcm9tLT5tYWNfYWRkcmVzcyk7CisJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaWwtPmh3LCBlZXByb20tPm1hY19hZGRyZXNzKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDUuIFNldHVwIEhXIENvbnN0YW50cworCSAqICoqKioqKioqKioqKioqKioqKioqLworCS8qIERldmljZS1zcGVjaWZpYyBzZXR1cCAqLworCWlmIChpbDM5NDVfaHdfc2V0X2h3X3BhcmFtcyhpbCkpIHsKKwkJSUxfRVJSKCJmYWlsZWQgdG8gc2V0IGh3IHNldHRpbmdzXG4iKTsKKwkJZ290byBvdXRfZWVwcm9tX2ZyZWU7CisJfQorCisJLyoqKioqKioqKioqKioqKioqKioqKioqCisJICogNi4gU2V0dXAgaWwKKwkgKiAqKioqKioqKioqKioqKioqKioqKi8KKworCWVyciA9IGlsMzk0NV9pbml0X2RydihpbCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoImluaXRpYWxpemluZyBkcml2ZXIgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRfdW5zZXRfaHdfcGFyYW1zOworCX0KKworCUlMX0lORk8oIkRldGVjdGVkIEludGVsIFdpcmVsZXNzIFdpRmkgTGluayAlc1xuIiwgaWwtPmNmZy0+bmFtZSk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiA3LiBTZXR1cCBTZXJ2aWNlcworCSAqICoqKioqKioqKioqKioqKioqKioqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWxfZGlzYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJcGNpX2VuYWJsZV9tc2koaWwtPnBjaV9kZXYpOworCisJZXJyID0gcmVxdWVzdF9pcnEoaWwtPnBjaV9kZXYtPmlycSwgaWxfaXNyLCBJUlFGX1NIQVJFRCwgRFJWX05BTUUsIGlsKTsKKwlpZiAoZXJyKSB7CisJCUlMX0VSUigiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWRcbiIsIGlsLT5wY2lfZGV2LT5pcnEpOworCQlnb3RvIG91dF9kaXNhYmxlX21zaTsKKwl9CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJnBkZXYtPmRldi5rb2JqLCAmaWwzOTQ1X2F0dHJpYnV0ZV9ncm91cCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZXNcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX2lycTsKKwl9CisKKwlpbF9zZXRfcnhvbl9jaGFubmVsKGlsLCAmaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLmNoYW5uZWxzWzVdLAorCQkJICAgICZpbC0+Y3R4KTsKKwlpbDM5NDVfc2V0dXBfZGVmZXJyZWRfd29yayhpbCk7CisJaWwzOTQ1X3NldHVwX2hhbmRsZXJzKGlsKTsKKwlpbF9wb3dlcl9pbml0aWFsaXplKGlsKTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiA4LiBTZXR1cCBhbmQgUmVnaXN0ZXIgbWFjODAyMTEKKwkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisJaWxfZW5hYmxlX2ludGVycnVwdHMoaWwpOworCisJZXJyID0gaWwzOTQ1X3NldHVwX21hYyhpbCk7CisJaWYgKGVycikKKwkJZ290byBvdXRfcmVtb3ZlX3N5c2ZzOworCisJZXJyID0gaWxfZGJnZnNfcmVnaXN0ZXIoaWwsIERSVl9OQU1FKTsKKwlpZiAoZXJyKQorCQlJTF9FUlIoImZhaWxlZCB0byBjcmVhdGUgZGVidWdmcyBmaWxlcy4gSWdub3JpbmcgZXJyb3I6ICVkXG4iLAorCQkgICAgICAgZXJyKTsKKworCS8qIFN0YXJ0IG1vbml0b3JpbmcgdGhlIGtpbGxzd2l0Y2ggKi8KKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5fMzk0NS5yZmtpbGxfcG9sbCwgMiAqIEhaKTsKKworCXJldHVybiAwOworCitvdXRfcmVtb3ZlX3N5c2ZzOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCWlsLT53b3JrcXVldWUgPSBOVUxMOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpbDM5NDVfYXR0cmlidXRlX2dyb3VwKTsKK291dF9yZWxlYXNlX2lycToKKwlmcmVlX2lycShpbC0+cGNpX2Rldi0+aXJxLCBpbCk7CitvdXRfZGlzYWJsZV9tc2k6CisJcGNpX2Rpc2FibGVfbXNpKGlsLT5wY2lfZGV2KTsKKwlpbF9mcmVlX2dlb3MoaWwpOworCWlsX2ZyZWVfY2hhbm5lbF9tYXAoaWwpOworb3V0X3Vuc2V0X2h3X3BhcmFtczoKKwlpbDM5NDVfdW5zZXRfaHdfcGFyYW1zKGlsKTsKK291dF9lZXByb21fZnJlZToKKwlpbF9lZXByb21fZnJlZShpbCk7CitvdXRfaW91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBpbC0+aHdfYmFzZSk7CitvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworb3V0X3BjaV9kaXNhYmxlX2RldmljZToKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0X2llZWU4MDIxMV9mcmVlX2h3OgorCWlsX2ZyZWVfdHJhZmZpY19tZW0oaWwpOworCWllZWU4MDIxMV9mcmVlX2h3KGlsLT5odyk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0CitpbDM5NDVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaWwpCisJCXJldHVybjsKKworCURfSU5GTygiKioqIFVOTE9BRCBEUklWRVIgKioqXG4iKTsKKworCWlsX2RiZ2ZzX3VucmVnaXN0ZXIoaWwpOworCisJc2V0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCisJaWxfbGVkc19leGl0KGlsKTsKKworCWlmIChpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCkgeworCQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhpbC0+aHcpOworCQlpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDA7CisJfSBlbHNlIHsKKwkJaWwzOTQ1X2Rvd24oaWwpOworCX0KKworCS8qCisJICogTWFrZSBzdXJlIGRldmljZSBpcyByZXNldCB0byBsb3cgcG93ZXIgYmVmb3JlIHVubG9hZGluZyBkcml2ZXIuCisJICogVGhpcyBtYXkgYmUgcmVkdW5kYW50IHdpdGggaWxfZG93bigpLCBidXQgdGhlcmUgYXJlIHBhdGhzIHRvCisJICogcnVuIGlsX2Rvd24oKSB3aXRob3V0IGNhbGxpbmcgYXBtX29wcy5zdG9wKCksIGFuZCB0aGVyZSBhcmUKKwkgKiBwYXRocyB0byBhdm9pZCBydW5uaW5nIGlsX2Rvd24oKSBhdCBhbGwgYmVmb3JlIGxlYXZpbmcgZHJpdmVyLgorCSAqIFRoaXMgKGluZXhwZW5zaXZlKSBjYWxsICptYWtlcyBzdXJlKiBkZXZpY2UgaXMgcmVzZXQuCisJICovCisJaWxfYXBtX3N0b3AoaWwpOworCisJLyogbWFrZSBzdXJlIHdlIGZsdXNoIGFueSBwZW5kaW5nIGlycSBvcgorCSAqIHRhc2tsZXQgZm9yIHRoZSBkcml2ZXIKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbF9kaXNhYmxlX2ludGVycnVwdHMoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpbDM5NDVfc3luY2hyb25pemVfaXJxKGlsKTsKKworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpbDM5NDVfYXR0cmlidXRlX2dyb3VwKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaWwtPl8zOTQ1LnJma2lsbF9wb2xsKTsKKworCWlsMzk0NV9kZWFsbG9jX3Vjb2RlX3BjaShpbCk7CisKKwlpZiAoaWwtPnJ4cS5iZCkKKwkJaWwzOTQ1X3J4X3F1ZXVlX2ZyZWUoaWwsICZpbC0+cnhxKTsKKwlpbDM5NDVfaHdfdHhxX2N0eF9mcmVlKGlsKTsKKworCWlsMzk0NV91bnNldF9od19wYXJhbXMoaWwpOworCisJLypuZXRpZl9zdG9wX3F1ZXVlKGRldik7ICovCisJZmx1c2hfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCisJLyogaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcgY2FsbHMgaWwzOTQ1X21hY19zdG9wLCB3aGljaCBmbHVzaGVzCisJICogaWwtPndvcmtxdWV1ZS4uLiBzbyB3ZSBjYW4ndCB0YWtlIGRvd24gdGhlIHdvcmtxdWV1ZQorCSAqIHVudGlsIG5vdy4uLiAqLworCWRlc3Ryb3lfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCWlsLT53b3JrcXVldWUgPSBOVUxMOworCWlsX2ZyZWVfdHJhZmZpY19tZW0oaWwpOworCisJZnJlZV9pcnEocGRldi0+aXJxLCBpbCk7CisJcGNpX2Rpc2FibGVfbXNpKHBkZXYpOworCisJcGNpX2lvdW5tYXAocGRldiwgaWwtPmh3X2Jhc2UpOworCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKworCWlsX2ZyZWVfY2hhbm5lbF9tYXAoaWwpOworCWlsX2ZyZWVfZ2VvcyhpbCk7CisJa2ZyZWUoaWwtPnNjYW5fY21kKTsKKwlpZiAoaWwtPmJlYWNvbl9za2IpCisJCWRldl9rZnJlZV9za2IoaWwtPmJlYWNvbl9za2IpOworCisJaWVlZTgwMjExX2ZyZWVfaHcoaWwtPmh3KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZHJpdmVyIGFuZCBtb2R1bGUgZW50cnkgcG9pbnQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpbDM5NDVfZHJpdmVyID0geworCS5uYW1lID0gRFJWX05BTUUsCisJLmlkX3RhYmxlID0gaWwzOTQ1X2h3X2NhcmRfaWRzLAorCS5wcm9iZSA9IGlsMzk0NV9wY2lfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGlsMzk0NV9wY2lfcmVtb3ZlKSwKKwkuZHJpdmVyLnBtID0gSUxfTEVHQUNZX1BNX09QUywKK307CisKK3N0YXRpYyBpbnQgX19pbml0CitpbDM5NDVfaW5pdCh2b2lkKQoreworCisJaW50IHJldDsKKwlwcl9pbmZvKERSVl9ERVNDUklQVElPTiAiLCAiIERSVl9WRVJTSU9OICJcbiIpOworCXByX2luZm8oRFJWX0NPUFlSSUdIVCAiXG4iKTsKKworCXJldCA9IGlsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoKTsKKwlpZiAocmV0KSB7CisJCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIHJhdGUgY29udHJvbCBhbGdvcml0aG06ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmlsMzk0NV9kcml2ZXIpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBQQ0kgbW9kdWxlXG4iKTsKKwkJZ290byBlcnJvcl9yZWdpc3RlcjsKKwl9CisKKwlyZXR1cm4gcmV0OworCitlcnJvcl9yZWdpc3RlcjoKKwlpbDM5NDVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2lsMzk0NV9leGl0KHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpbDM5NDVfZHJpdmVyKTsKKwlpbDM5NDVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKK30KKworTU9EVUxFX0ZJUk1XQVJFKElMMzk0NV9NT0RVTEVfRklSTVdBUkUoSUwzOTQ1X1VDT0RFX0FQSV9NQVgpKTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGFudGVubmEsIGlsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEsIGludCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGFudGVubmEsICJzZWxlY3QgYW50ZW5uYSAoMT1NYWluLCAyPUF1eCwgZGVmYXVsdCAwIFtib3RoXSkiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChzd2NyeXB0bywgaWwzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhzd2NyeXB0bywgInVzaW5nIHNvZnR3YXJlIGNyeXB0byAoZGVmYXVsdCAxIFtzb2Z0d2FyZV0pIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGlzYWJsZV9od19zY2FuLCBpbDM5NDVfbW9kX3BhcmFtcy5kaXNhYmxlX2h3X3NjYW4sIGludCwKKwkJICAgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfaHdfc2NhbiwgImRpc2FibGUgaGFyZHdhcmUgc2Nhbm5pbmcgKGRlZmF1bHQgMSkiKTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaWxfZGVidWdfbGV2ZWwsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOworI2VuZGlmCittb2R1bGVfcGFyYW1fbmFtZWQoZndfcmVzdGFydCwgaWwzOTQ1X21vZF9wYXJhbXMucmVzdGFydF9mdywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MoZndfcmVzdGFydCwgInJlc3RhcnQgZmlybXdhcmUgaW4gY2FzZSBvZiBlcnJvciIpOworCittb2R1bGVfZXhpdChpbDM5NDVfZXhpdCk7Cittb2R1bGVfaW5pdChpbDM5NDVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdhODNmMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUtcnMuYwpAQCAtMCwwICsxLDk4NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKyNpbmNsdWRlICJjb21tYW5kcy5oIgorI2luY2x1ZGUgIjM5NDUuaCIKKworI2RlZmluZSBSU19OQU1FICJpd2wtMzk0NS1ycyIKKworc3RhdGljIHMzMiBpbDM5NDVfZXhwZWN0ZWRfdHB0X2dbUkFURV9DT1VOVF8zOTQ1XSA9IHsKKwk3LCAxMywgMzUsIDU4LCAwLCAwLCA3NiwgMTA0LCAxMzAsIDE2OCwgMTkxLCAyMDIKK307CisKK3N0YXRpYyBzMzIgaWwzOTQ1X2V4cGVjdGVkX3RwdF9nX3Byb3RbUkFURV9DT1VOVF8zOTQ1XSA9IHsKKwk3LCAxMywgMzUsIDU4LCAwLCAwLCAwLCA4MCwgOTMsIDExMywgMTIzLCAxMjUKK307CisKK3N0YXRpYyBzMzIgaWwzOTQ1X2V4cGVjdGVkX3RwdF9hW1JBVEVfQ09VTlRfMzk0NV0gPSB7CisJMCwgMCwgMCwgMCwgNDAsIDU3LCA3MiwgOTgsIDEyMSwgMTU0LCAxNzcsIDE4NgorfTsKKworc3RhdGljIHMzMiBpbDM5NDVfZXhwZWN0ZWRfdHB0X2JbUkFURV9DT1VOVF8zOTQ1XSA9IHsKKwk3LCAxMywgMzUsIDU4LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCit9OworCitzdHJ1Y3QgaWwzOTQ1X3RwdF9lbnRyeSB7CisJczggbWluX3Jzc2k7CisJdTggaWR4OworfTsKKworc3RhdGljIHN0cnVjdCBpbDM5NDVfdHB0X2VudHJ5IGlsMzk0NV90cHRfdGFibGVfYVtdID0geworCXstNjAsIFJBVEVfNTRNX0lEWH0sCisJey02NCwgUkFURV80OE1fSURYfSwKKwl7LTcyLCBSQVRFXzM2TV9JRFh9LAorCXstODAsIFJBVEVfMjRNX0lEWH0sCisJey04NCwgUkFURV8xOE1fSURYfSwKKwl7LTg1LCBSQVRFXzEyTV9JRFh9LAorCXstODcsIFJBVEVfOU1fSURYfSwKKwl7LTg5LCBSQVRFXzZNX0lEWH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgaWwzOTQ1X3RwdF9lbnRyeSBpbDM5NDVfdHB0X3RhYmxlX2dbXSA9IHsKKwl7LTYwLCBSQVRFXzU0TV9JRFh9LAorCXstNjQsIFJBVEVfNDhNX0lEWH0sCisJey02OCwgUkFURV8zNk1fSURYfSwKKwl7LTgwLCBSQVRFXzI0TV9JRFh9LAorCXstODQsIFJBVEVfMThNX0lEWH0sCisJey04NSwgUkFURV8xMk1fSURYfSwKKwl7LTg2LCBSQVRFXzExTV9JRFh9LAorCXstODgsIFJBVEVfNU1fSURYfSwKKwl7LTkwLCBSQVRFXzJNX0lEWH0sCisJey05MiwgUkFURV8xTV9JRFh9Cit9OworCisjZGVmaW5lIFJBVEVfTUFYX1dJTkRPVwkJNjIKKyNkZWZpbmUgUkFURV9GTFVTSAkJKDMqSFopCisjZGVmaW5lIFJBVEVfV0lOX0ZMVVNICQkoSFovMikKKyNkZWZpbmUgSUwzOV9SQVRFX0hJR0hfVEgJMTE1MjAKKyNkZWZpbmUgSUxfU1VDQ0VTU19VUF9USAk4OTYwCisjZGVmaW5lIElMX1NVQ0NFU1NfRE9XTl9USAkxMDg4MAorI2RlZmluZSBSQVRFX01JTl9GQUlMVVJFX1RICTYKKyNkZWZpbmUgUkFURV9NSU5fU1VDQ0VTU19USAk4CisjZGVmaW5lIFJBVEVfREVDUkVBU0VfVEgJMTkyMAorI2RlZmluZSBSQVRFX1JFVFJZX1RICQkxNQorCitzdGF0aWMgdTgKK2lsMzk0NV9nZXRfcmF0ZV9pZHhfYnlfcnNzaShzMzIgcnNzaSwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQoreworCXUzMiBpZHggPSAwOworCXUzMiB0YWJsZV9zaXplID0gMDsKKwlzdHJ1Y3QgaWwzOTQ1X3RwdF9lbnRyeSAqdHB0X3RhYmxlID0gTlVMTDsKKworCWlmIChyc3NpIDwgSUxfTUlOX1JTU0lfVkFMIHx8IHJzc2kgPiBJTF9NQVhfUlNTSV9WQUwpCisJCXJzc2kgPSBJTF9NSU5fUlNTSV9WQUw7CisKKwlzd2l0Y2ggKGJhbmQpIHsKKwljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6CisJCXRwdF90YWJsZSA9IGlsMzk0NV90cHRfdGFibGVfZzsKKwkJdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoaWwzOTQ1X3RwdF90YWJsZV9nKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgorCQl0cHRfdGFibGUgPSBpbDM5NDVfdHB0X3RhYmxlX2E7CisJCXRhYmxlX3NpemUgPSBBUlJBWV9TSVpFKGlsMzk0NV90cHRfdGFibGVfYSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwl3aGlsZSAoaWR4IDwgdGFibGVfc2l6ZSAmJiByc3NpIDwgdHB0X3RhYmxlW2lkeF0ubWluX3Jzc2kpCisJCWlkeCsrOworCisJaWR4ID0gbWluKGlkeCwgdGFibGVfc2l6ZSAtIDEpOworCisJcmV0dXJuIHRwdF90YWJsZVtpZHhdLmlkeDsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9jbGVhcl93aW4oc3RydWN0IGlsMzk0NV9yYXRlX3NjYWxlX2RhdGEgKndpbikKK3sKKwl3aW4tPmRhdGEgPSAwOworCXdpbi0+c3VjY2Vzc19jb3VudGVyID0gMDsKKwl3aW4tPnN1Y2Nlc3NfcmF0aW8gPSAtMTsKKwl3aW4tPmNvdW50ZXIgPSAwOworCXdpbi0+YXZlcmFnZV90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCXdpbi0+c3RhbXAgPSAwOworfQorCisvKioKKyAqIGlsMzk0NV9yYXRlX3NjYWxlX2ZsdXNoX3dpbnMgLSBmbHVzaCBvdXQgdGhlIHJhdGUgc2NhbGUgd2lucworICoKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiB3aW5zIHRoYXQgaGF2ZSBnYXRoZXJlZCBkYXRhIGJ1dCB3ZXJlCisgKiBub3QgZmx1c2hlZC4gIElmIHRoZXJlIHdlcmUgYW55IHRoYXQgd2VyZSBub3QgZmx1c2hlZCwgdGhlbgorICogcmVzY2hlZHVsZSB0aGUgcmF0ZSBmbHVzaGluZyByb3V0aW5lLgorICovCitzdGF0aWMgaW50CitpbDM5NDVfcmF0ZV9zY2FsZV9mbHVzaF93aW5zKHN0cnVjdCBpbDM5NDVfcnNfc3RhICpyc19zdGEpCit7CisJaW50IHVuZmx1c2hlZCA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgX19tYXliZV91bnVzZWQgPSByc19zdGEtPmlsOworCisJLyoKKwkgKiBGb3IgZWFjaCByYXRlLCBpZiB3ZSBoYXZlIGNvbGxlY3RlZCBkYXRhIG9uIHRoYXQgcmF0ZQorCSAqIGFuZCBpdCBoYXMgYmVlbiBtb3JlIHRoYW4gUkFURV9XSU5fRkxVU0gKKwkgKiBzaW5jZSB3ZSBmbHVzaGVkLCBjbGVhciBvdXQgdGhlIGdhdGhlcmVkIHN0YXRzCisJICovCisJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlRfMzk0NTsgaSsrKSB7CisJCWlmICghcnNfc3RhLT53aW5baV0uY291bnRlcikKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgcnNfc3RhLT53aW5baV0uc3RhbXAgKyBSQVRFX1dJTl9GTFVTSCkpIHsKKwkJCURfUkFURSgiZmx1c2hpbmcgJWQgc2FtcGxlcyBvZiByYXRlICIgImlkeCAlZFxuIiwKKwkJCSAgICAgICByc19zdGEtPndpbltpXS5jb3VudGVyLCBpKTsKKwkJCWlsMzk0NV9jbGVhcl93aW4oJnJzX3N0YS0+d2luW2ldKTsKKwkJfSBlbHNlCisJCQl1bmZsdXNoZWQrKzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIHVuZmx1c2hlZDsKK30KKworI2RlZmluZSBSQVRFX0ZMVVNIX01BWCAgICAgICAgICAgICAgNTAwMAkvKiBtc2VjICovCisjZGVmaW5lIFJBVEVfRkxVU0hfTUlOICAgICAgICAgICAgICA1MAkvKiBtc2VjICovCisjZGVmaW5lIElMX0FWRVJBR0VfUEFDS0VUUyAgICAgICAgICAgICAxNTAwCisKK3N0YXRpYyB2b2lkCitpbDM5NDVfYmdfcmF0ZV9zY2FsZV9mbHVzaCh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YSA9ICh2b2lkICopZGF0YTsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgX19tYXliZV91bnVzZWQgPSByc19zdGEtPmlsOworCWludCB1bmZsdXNoZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHBhY2tldF9jb3VudCwgZHVyYXRpb24sIHBwczsKKworCURfUkFURSgiZW50ZXJcbiIpOworCisJdW5mbHVzaGVkID0gaWwzOTQ1X3JhdGVfc2NhbGVfZmx1c2hfd2lucyhyc19zdGEpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJLyogTnVtYmVyIG9mIHBhY2tldHMgUngnZCBzaW5jZSBsYXN0IHRpbWUgdGhpcyB0aW1lciByYW4gKi8KKwlwYWNrZXRfY291bnQgPSAocnNfc3RhLT50eF9wYWNrZXRzIC0gcnNfc3RhLT5sYXN0X3R4X3BhY2tldHMpICsgMTsKKworCXJzX3N0YS0+bGFzdF90eF9wYWNrZXRzID0gcnNfc3RhLT50eF9wYWNrZXRzICsgMTsKKworCWlmICh1bmZsdXNoZWQpIHsKKwkJZHVyYXRpb24gPQorCQkgICAgamlmZmllc190b19tc2VjcyhqaWZmaWVzIC0gcnNfc3RhLT5sYXN0X3BhcnRpYWxfZmx1c2gpOworCisJCURfUkFURSgiVHgnZCAlZCBwYWNrZXRzIGluICVkbXNcbiIsIHBhY2tldF9jb3VudCwgZHVyYXRpb24pOworCisJCS8qIERldGVybWluZSBwYWNrZXRzIHBlciBzZWNvbmQgKi8KKwkJaWYgKGR1cmF0aW9uKQorCQkJcHBzID0gKHBhY2tldF9jb3VudCAqIDEwMDApIC8gZHVyYXRpb247CisJCWVsc2UKKwkJCXBwcyA9IDA7CisKKwkJaWYgKHBwcykgeworCQkJZHVyYXRpb24gPSAoSUxfQVZFUkFHRV9QQUNLRVRTICogMTAwMCkgLyBwcHM7CisJCQlpZiAoZHVyYXRpb24gPCBSQVRFX0ZMVVNIX01JTikKKwkJCQlkdXJhdGlvbiA9IFJBVEVfRkxVU0hfTUlOOworCQkJZWxzZSBpZiAoZHVyYXRpb24gPiBSQVRFX0ZMVVNIX01BWCkKKwkJCQlkdXJhdGlvbiA9IFJBVEVfRkxVU0hfTUFYOworCQl9IGVsc2UKKwkJCWR1cmF0aW9uID0gUkFURV9GTFVTSF9NQVg7CisKKwkJcnNfc3RhLT5mbHVzaF90aW1lID0gbXNlY3NfdG9famlmZmllcyhkdXJhdGlvbik7CisKKwkJRF9SQVRFKCJuZXcgZmx1c2ggcGVyaW9kOiAlZCBtc2VjIGF2ZSAlZFxuIiwgZHVyYXRpb24sCisJCSAgICAgICBwYWNrZXRfY291bnQpOworCisJCW1vZF90aW1lcigmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoLAorCQkJICBqaWZmaWVzICsgcnNfc3RhLT5mbHVzaF90aW1lKTsKKworCQlyc19zdGEtPmxhc3RfcGFydGlhbF9mbHVzaCA9IGppZmZpZXM7CisJfSBlbHNlIHsKKwkJcnNfc3RhLT5mbHVzaF90aW1lID0gUkFURV9GTFVTSDsKKwkJcnNfc3RhLT5mbHVzaF9wZW5kaW5nID0gMDsKKwl9CisJLyogSWYgdGhlcmUgd2VyZW4ndCBhbnkgdW5mbHVzaGVkIGVudHJpZXMsIHdlIGRvbid0IHNjaGVkdWxlIHRoZSB0aW1lcgorCSAqIHRvIHJ1biBhZ2FpbiAqLworCisJcnNfc3RhLT5sYXN0X2ZsdXNoID0gamlmZmllczsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJRF9SQVRFKCJsZWF2ZVxuIik7Cit9CisKKy8qKgorICogaWwzOTQ1X2NvbGxlY3RfdHhfZGF0YSAtIFVwZGF0ZSB0aGUgc3VjY2Vzcy9mYWlsdXJlIHNsaWRpbmcgd2luCisgKgorICogV2Uga2VlcCBhIHNsaWRpbmcgd2luIG9mIHRoZSBsYXN0IDY0IHBhY2tldHMgdHJhbnNtaXR0ZWQKKyAqIGF0IHRoaXMgcmF0ZS4gIHdpbi0+ZGF0YSBjb250YWlucyB0aGUgYml0bWFzayBvZiBzdWNjZXNzZnVsCisgKiBwYWNrZXRzLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X2NvbGxlY3RfdHhfZGF0YShzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqcnNfc3RhLAorCQkgICAgICAgc3RydWN0IGlsMzk0NV9yYXRlX3NjYWxlX2RhdGEgKndpbiwgaW50IHN1Y2Nlc3MsCisJCSAgICAgICBpbnQgcmV0cmllcywgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXMzMiBmYWlsX2NvdW50OworCXN0cnVjdCBpbF9wcml2ICppbCBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+aWw7CisKKwlpZiAoIXJldHJpZXMpIHsKKwkJRF9SQVRFKCJsZWF2ZTogcmV0cmllcyA9PSAwIC0tIHNob3VsZCBiZSBhdCBsZWFzdCAxXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogS2VlcCB0cmFjayBvZiBvbmx5IHRoZSBsYXRlc3QgNjIgdHggZnJhbWUgYXR0ZW1wdHMgaW4gdGhpcyByYXRlJ3MKKwkgKiBoaXN0b3J5IHdpbjsgYW55dGhpbmcgb2xkZXIgaXNuJ3QgcmVhbGx5IHJlbGV2YW50IGFueSBtb3JlLgorCSAqIElmIHdlIGhhdmUgZmlsbGVkIHVwIHRoZSBzbGlkaW5nIHdpbiwgZHJvcCB0aGUgb2xkZXN0IGF0dGVtcHQ7CisJICogaWYgdGhlIG9sZGVzdCBhdHRlbXB0IChoaWdoZXN0IGJpdCBpbiBiaXRtYXApIHNob3dzICJzdWNjZXNzIiwKKwkgKiBzdWJ0cmFjdCAiMSIgZnJvbSB0aGUgc3VjY2VzcyBjb3VudGVyICh0aGlzIGlzIHRoZSBtYWluIHJlYXNvbgorCSAqIHdlIGtlZXAgdGhlc2UgYml0bWFwcyEpLgorCSAqICovCisJd2hpbGUgKHJldHJpZXMgPiAwKSB7CisJCWlmICh3aW4tPmNvdW50ZXIgPj0gUkFURV9NQVhfV0lORE9XKSB7CisKKwkJCS8qIHJlbW92ZSBlYXJsaWVzdCAqLworCQkJd2luLT5jb3VudGVyID0gUkFURV9NQVhfV0lORE9XIC0gMTsKKworCQkJaWYgKHdpbi0+ZGF0YSAmICgxVUxMIDw8IChSQVRFX01BWF9XSU5ET1cgLSAxKSkpIHsKKwkJCQl3aW4tPmRhdGEgJj0gfigxVUxMIDw8IChSQVRFX01BWF9XSU5ET1cgLSAxKSk7CisJCQkJd2luLT5zdWNjZXNzX2NvdW50ZXItLTsKKwkJCX0KKwkJfQorCisJCS8qIEluY3JlbWVudCBmcmFtZXMtYXR0ZW1wdGVkIGNvdW50ZXIgKi8KKwkJd2luLT5jb3VudGVyKys7CisKKwkJLyogU2hpZnQgYml0bWFwIGJ5IG9uZSBmcmFtZSAodGhyb3cgYXdheSBvbGRlc3QgaGlzdG9yeSksCisJCSAqIE9SIGluICIxIiwgYW5kIGluY3JlbWVudCAic3VjY2VzcyIgaWYgdGhpcworCQkgKiBmcmFtZSB3YXMgc3VjY2Vzc2Z1bC4gKi8KKwkJd2luLT5kYXRhIDw8PSAxOworCQlpZiAoc3VjY2VzcyA+IDApIHsKKwkJCXdpbi0+c3VjY2Vzc19jb3VudGVyKys7CisJCQl3aW4tPmRhdGEgfD0gMHgxOworCQkJc3VjY2Vzcy0tOworCQl9CisKKwkJcmV0cmllcy0tOworCX0KKworCS8qIENhbGN1bGF0ZSBjdXJyZW50IHN1Y2Nlc3MgcmF0aW8sIGF2b2lkIGRpdmlkZS1ieS0wISAqLworCWlmICh3aW4tPmNvdW50ZXIgPiAwKQorCQl3aW4tPnN1Y2Nlc3NfcmF0aW8gPQorCQkgICAgMTI4ICogKDEwMCAqIHdpbi0+c3VjY2Vzc19jb3VudGVyKSAvIHdpbi0+Y291bnRlcjsKKwllbHNlCisJCXdpbi0+c3VjY2Vzc19yYXRpbyA9IElMX0lOVkFMSURfVkFMVUU7CisKKwlmYWlsX2NvdW50ID0gd2luLT5jb3VudGVyIC0gd2luLT5zdWNjZXNzX2NvdW50ZXI7CisKKwkvKiBDYWxjdWxhdGUgYXZlcmFnZSB0aHJvdWdocHV0LCBpZiB3ZSBoYXZlIGVub3VnaCBoaXN0b3J5LiAqLworCWlmIChmYWlsX2NvdW50ID49IFJBVEVfTUlOX0ZBSUxVUkVfVEggfHwKKwkgICAgd2luLT5zdWNjZXNzX2NvdW50ZXIgPj0gUkFURV9NSU5fU1VDQ0VTU19USCkKKwkJd2luLT5hdmVyYWdlX3RwdCA9CisJCSAgICAoKHdpbi0+c3VjY2Vzc19yYXRpbyAqIHJzX3N0YS0+ZXhwZWN0ZWRfdHB0W2lkeF0gKworCQkgICAgICA2NCkgLyAxMjgpOworCWVsc2UKKwkJd2luLT5hdmVyYWdlX3RwdCA9IElMX0lOVkFMSURfVkFMVUU7CisKKwkvKiBUYWcgdGhpcyB3aW4gYXMgaGF2aW5nIGJlZW4gdXBkYXRlZCAqLworCXdpbi0+c3RhbXAgPSBqaWZmaWVzOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgYWRkaW5nIGEgbmV3IHN0YXRpb24gdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcKKyAqLwordm9pZAoraWwzOTQ1X3JzX3JhdGVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHN0YV9pZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGlsLT5odzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaWwtPmh3LT5jb25mOworCXN0cnVjdCBpbDM5NDVfc3RhX3ByaXYgKnBzdGE7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwlpbnQgaTsKKworCURfSU5GTygiZW50ZXJcbiIpOworCWlmIChzdGFfaWQgPT0gaWwtPmN0eC5iY2FzdF9zdGFfaWQpCisJCWdvdG8gb3V0OworCisJcHN0YSA9IChzdHJ1Y3QgaWwzOTQ1X3N0YV9wcml2ICopc3RhLT5kcnZfcHJpdjsKKwlyc19zdGEgPSAmcHN0YS0+cnNfc3RhOworCXNiYW5kID0gaHctPndpcGh5LT5iYW5kc1tjb25mLT5jaGFubmVsLT5iYW5kXTsKKworCXJzX3N0YS0+aWwgPSBpbDsKKworCXJzX3N0YS0+c3RhcnRfcmF0ZSA9IFJBVEVfSU5WQUxJRDsKKworCS8qIGRlZmF1bHQgdG8ganVzdCA4MDIuMTFiICovCisJcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpbDM5NDVfZXhwZWN0ZWRfdHB0X2I7CisKKwlyc19zdGEtPmxhc3RfcGFydGlhbF9mbHVzaCA9IGppZmZpZXM7CisJcnNfc3RhLT5sYXN0X2ZsdXNoID0gamlmZmllczsKKwlyc19zdGEtPmZsdXNoX3RpbWUgPSBSQVRFX0ZMVVNIOworCXJzX3N0YS0+bGFzdF90eF9wYWNrZXRzID0gMDsKKworCXJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcnNfc3RhOworCXJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaC5mdW5jdGlvbiA9IGlsMzk0NV9iZ19yYXRlX3NjYWxlX2ZsdXNoOworCisJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlRfMzk0NTsgaSsrKQorCQlpbDM5NDVfY2xlYXJfd2luKCZyc19zdGEtPndpbltpXSk7CisKKwkvKiBUT0RPOiB3aGF0IGlzIGEgZ29vZCBzdGFydGluZyByYXRlIGZvciBTVEE/IEFib3V0IG1pZGRsZT8gTWF5YmUgbm90CisJICogdGhlIGxvd2VzdCBvciB0aGUgaGlnaGVzdCByYXRlLi4gQ291bGQgY29uc2lkZXIgdXNpbmcgUlNTSSBmcm9tCisJICogcHJldmlvdXMgcGFja2V0cz8gTmVlZCB0byBoYXZlIElFRUUgODAyLjFYIGF1dGggc3VjY2VlZCBpbW1lZGlhdGVseQorCSAqIGFmdGVyIGFzc29jLi4gKi8KKworCWZvciAoaSA9IHNiYW5kLT5uX2JpdHJhdGVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKKwkJaWYgKHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0gJiAoMSA8PCBpKSkgeworCQkJcnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpbC0+XzM5NDUuc3RhX3N1cHBfcmF0ZXMgPSBzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdOworCS8qIEZvciA1IEdIeiBiYW5kIGl0IHN0YXJ0IGF0IElMX0ZJUlNUX09GRE1fUkFURSAqLworCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ICs9IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJaWwtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzIDw8PSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJfQorCitvdXQ6CisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisKKwlEX0lORk8oImxlYXZlXG4iKTsKK30KKworc3RhdGljIHZvaWQgKgoraWwzOTQ1X3JzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQoreworCXJldHVybiBody0+cHJpdjsKK30KKworLyogcmF0ZSBzY2FsZSByZXF1aXJlcyBmcmVlIGZ1bmN0aW9uIHRvIGJlIGltcGxlbWVudGVkICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3JzX2ZyZWUodm9pZCAqaWwpCit7Cit9CisKK3N0YXRpYyB2b2lkICoKK2lsMzk0NV9yc19hbGxvY19zdGEodm9pZCAqaWxfcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBpbDM5NDVfcnNfc3RhICpyc19zdGE7CisJc3RydWN0IGlsMzk0NV9zdGFfcHJpdiAqcHN0YSA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgX19tYXliZV91bnVzZWQgPSBpbF9wcml2OworCisJRF9SQVRFKCJlbnRlclxuIik7CisKKwlyc19zdGEgPSAmcHN0YS0+cnNfc3RhOworCisJc3Bpbl9sb2NrX2luaXQoJnJzX3N0YS0+bG9jayk7CisJaW5pdF90aW1lcigmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoKTsKKworCURfUkFURSgibGVhdmVcbiIpOworCisJcmV0dXJuIHJzX3N0YTsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9yc19mcmVlX3N0YSh2b2lkICppbF9wcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICppbF9zdGEpCit7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YSA9IGlsX3N0YTsKKworCS8qCisJICogQmUgY2FyZWZ1bCBub3QgdG8gdXNlIGFueSBtZW1iZXJzIG9mIGlsMzk0NV9yc19zdGEgKGxpa2UgdHJ5aW5nCisJICogdG8gdXNlIGlsX3ByaXYgdG8gcHJpbnQgb3V0IGRlYnVnZ2luZykgc2luY2UgaXQgbWF5IG5vdCBiZSBmdWxseQorCSAqIGluaXRpYWxpemVkIGF0IHRoaXMgcG9pbnQuCisJICovCisJZGVsX3RpbWVyX3N5bmMoJnJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaCk7Cit9CisKKy8qKgorICogaWwzOTQ1X3JzX3R4X3N0YXR1cyAtIFVwZGF0ZSByYXRlIGNvbnRyb2wgdmFsdWVzIGJhc2VkIG9uIFR4IHJlc3VsdHMKKyAqCisgKiBOT1RFOiBVc2VzIGlsX3ByaXYtPnJldHJ5X3JhdGUgZm9yIHRoZSAjIG9mIHJldHJpZXMgYXR0ZW1wdGVkIGJ5CisgKiB0aGUgaGFyZHdhcmUgZm9yIGVhY2ggcmF0ZS4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9yc190eF9zdGF0dXModm9pZCAqaWxfcmF0ZSwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICppbF9zdGEsCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXM4IHJldHJpZXMgPSAwLCBjdXJyZW50X2NvdW50OworCWludCBzY2FsZV9yYXRlX2lkeCwgZmlyc3RfaWR4LCBsYXN0X2lkeDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF9wcml2ICppbCA9IChzdHJ1Y3QgaWxfcHJpdiAqKWlsX3JhdGU7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKnJzX3N0YSA9IGlsX3N0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisKKwlEX1JBVEUoImVudGVyXG4iKTsKKworCXJldHJpZXMgPSBpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQ7CisJLyogU2FuaXR5IENoZWNrIGZvciByZXRyaWVzICovCisJaWYgKHJldHJpZXMgPiBSQVRFX1JFVFJZX1RIKQorCQlyZXRyaWVzID0gUkFURV9SRVRSWV9USDsKKworCWZpcnN0X2lkeCA9IHNiYW5kLT5iaXRyYXRlc1tpbmZvLT5zdGF0dXMucmF0ZXNbMF0uaWR4XS5od192YWx1ZTsKKwlpZiAoZmlyc3RfaWR4IDwgMCB8fCBmaXJzdF9pZHggPj0gUkFURV9DT1VOVF8zOTQ1KSB7CisJCURfUkFURSgibGVhdmU6IFJhdGUgb3V0IG9mIGJvdW5kczogJWRcbiIsIGZpcnN0X2lkeCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWlsX3N0YSkgeworCQlEX1JBVEUoImxlYXZlOiBObyBTVEEgaWwgZGF0YSB0byB1cGRhdGUhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRyZWF0IHVuaW5pdGlhbGl6ZWQgcmF0ZSBzY2FsaW5nIGRhdGEgc2FtZSBhcyBub24tZXhpc3RpbmcuICovCisJaWYgKCFyc19zdGEtPmlsKSB7CisJCURfUkFURSgibGVhdmU6IFNUQSBpbCBkYXRhIHVuaW5pdGlhbGl6ZWQhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJzX3N0YS0+dHhfcGFja2V0cysrOworCisJc2NhbGVfcmF0ZV9pZHggPSBmaXJzdF9pZHg7CisJbGFzdF9pZHggPSBmaXJzdF9pZHg7CisKKwkvKgorCSAqIFVwZGF0ZSB0aGUgd2luIGZvciBlYWNoIHJhdGUuICBXZSBkZXRlcm1pbmUgd2hpY2ggcmF0ZXMKKwkgKiB3ZXJlIFR4J2QgYmFzZWQgb24gdGhlIHRvdGFsIG51bWJlciBvZiByZXRyaWVzIHZzLiB0aGUgbnVtYmVyCisJICogb2YgcmV0cmllcyBjb25maWd1cmVkIGZvciBlYWNoIHJhdGUgLS0gY3VycmVudGx5IHNldCB0byB0aGUKKwkgKiBpbCB2YWx1ZSAncmV0cnlfcmF0ZScgdnMuIHJhdGUgc3BlY2lmaWMKKwkgKgorCSAqIE9uIGV4aXQgZnJvbSB0aGlzIHdoaWxlIGxvb3AgbGFzdF9pZHggaW5kaWNhdGVzIHRoZSByYXRlCisJICogYXQgd2hpY2ggdGhlIGZyYW1lIHdhcyBmaW5hbGx5IHRyYW5zbWl0dGVkIChvciBmYWlsZWQgaWYgbm8KKwkgKiBBQ0spCisJICovCisJd2hpbGUgKHJldHJpZXMgPiAxKSB7CisJCWlmICgocmV0cmllcyAtIDEpIDwgaWwtPnJldHJ5X3JhdGUpIHsKKwkJCWN1cnJlbnRfY291bnQgPSAocmV0cmllcyAtIDEpOworCQkJbGFzdF9pZHggPSBzY2FsZV9yYXRlX2lkeDsKKwkJfSBlbHNlIHsKKwkJCWN1cnJlbnRfY291bnQgPSBpbC0+cmV0cnlfcmF0ZTsKKwkJCWxhc3RfaWR4ID0gaWwzOTQ1X3JzX25leHRfcmF0ZShpbCwgc2NhbGVfcmF0ZV9pZHgpOworCQl9CisKKwkJLyogVXBkYXRlIHRoaXMgcmF0ZSBhY2NvdW50aW5nIGZvciBhcyBtYW55IHJldHJpZXMKKwkJICogYXMgd2FzIHVzZWQgZm9yIGl0IChwZXIgY3VycmVudF9jb3VudCkgKi8KKwkJaWwzOTQ1X2NvbGxlY3RfdHhfZGF0YShyc19zdGEsICZyc19zdGEtPndpbltzY2FsZV9yYXRlX2lkeF0sIDAsCisJCQkJICAgICAgIGN1cnJlbnRfY291bnQsIHNjYWxlX3JhdGVfaWR4KTsKKwkJRF9SQVRFKCJVcGRhdGUgcmF0ZSAlZCBmb3IgJWQgcmV0cmllcy5cbiIsIHNjYWxlX3JhdGVfaWR4LAorCQkgICAgICAgY3VycmVudF9jb3VudCk7CisKKwkJcmV0cmllcyAtPSBjdXJyZW50X2NvdW50OworCisJCXNjYWxlX3JhdGVfaWR4ID0gbGFzdF9pZHg7CisJfQorCisJLyogVXBkYXRlIHRoZSBsYXN0IGlkeCB3aW4gd2l0aCBzdWNjZXNzL2ZhaWx1cmUgYmFzZWQgb24gQUNLICovCisJRF9SQVRFKCJVcGRhdGUgcmF0ZSAlZCB3aXRoICVzLlxuIiwgbGFzdF9pZHgsCisJICAgICAgIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSykgPyAic3VjY2VzcyIgOiAiZmFpbHVyZSIpOworCWlsMzk0NV9jb2xsZWN0X3R4X2RhdGEocnNfc3RhLCAmcnNfc3RhLT53aW5bbGFzdF9pZHhdLAorCQkJICAgICAgIGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLLCAxLAorCQkJICAgICAgIGxhc3RfaWR4KTsKKworCS8qIFdlIHVwZGF0ZWQgdGhlIHJhdGUgc2NhbGUgd2luIC0tIGlmIGl0cyBiZWVuIG1vcmUgdGhhbgorCSAqIGZsdXNoX3RpbWUgc2luY2UgdGhlIGxhc3QgcnVuLCBzY2hlZHVsZSB0aGUgZmx1c2gKKwkgKiBhZ2FpbiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworCWlmICghcnNfc3RhLT5mbHVzaF9wZW5kaW5nICYmCisJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywgcnNfc3RhLT5sYXN0X2ZsdXNoICsgcnNfc3RhLT5mbHVzaF90aW1lKSkgeworCisJCXJzX3N0YS0+bGFzdF9wYXJ0aWFsX2ZsdXNoID0gamlmZmllczsKKwkJcnNfc3RhLT5mbHVzaF9wZW5kaW5nID0gMTsKKwkJbW9kX3RpbWVyKCZyc19zdGEtPnJhdGVfc2NhbGVfZmx1c2gsCisJCQkgIGppZmZpZXMgKyByc19zdGEtPmZsdXNoX3RpbWUpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJRF9SQVRFKCJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyB1MTYKK2lsMzk0NV9nZXRfYWRqYWNlbnRfcmF0ZShzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqcnNfc3RhLCB1OCBpZHgsIHUxNiByYXRlX21hc2ssCisJCQkgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKQoreworCXU4IGhpZ2ggPSBSQVRFX0lOVkFMSUQ7CisJdTggbG93ID0gUkFURV9JTlZBTElEOworCXN0cnVjdCBpbF9wcml2ICppbCBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+aWw7CisKKwkvKiA4MDIuMTFBIHdhbGtzIHRvIHRoZSBuZXh0IGxpdGVyYWwgYWRqYWNlbnQgcmF0ZSBpbgorCSAqIHRoZSByYXRlIHRhYmxlICovCisJaWYgKHVubGlrZWx5KGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikpIHsKKwkJaW50IGk7CisJCXUzMiBtYXNrOworCisJCS8qIEZpbmQgdGhlIHByZXZpb3VzIHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCisJCWkgPSBpZHggLSAxOworCQlmb3IgKG1hc2sgPSAoMSA8PCBpKTsgaSA+PSAwOyBpLS0sIG1hc2sgPj49IDEpIHsKKwkJCWlmIChyYXRlX21hc2sgJiBtYXNrKSB7CisJCQkJbG93ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIEZpbmQgdGhlIG5leHQgcmF0ZSB0aGF0IGlzIGluIHRoZSByYXRlIG1hc2sgKi8KKwkJaSA9IGlkeCArIDE7CisJCWZvciAobWFzayA9ICgxIDw8IGkpOyBpIDwgUkFURV9DT1VOVF8zOTQ1OyBpKyssIG1hc2sgPDw9IDEpIHsKKwkJCWlmIChyYXRlX21hc2sgJiBtYXNrKSB7CisJCQkJaGlnaCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlyZXR1cm4gKGhpZ2ggPDwgOCkgfCBsb3c7CisJfQorCisJbG93ID0gaWR4OworCXdoaWxlIChsb3cgIT0gUkFURV9JTlZBTElEKSB7CisJCWlmIChyc19zdGEtPnRnZykKKwkJCWxvdyA9IGlsMzk0NV9yYXRlc1tsb3ddLnByZXZfcnNfdGdnOworCQllbHNlCisJCQlsb3cgPSBpbDM5NDVfcmF0ZXNbbG93XS5wcmV2X3JzOworCQlpZiAobG93ID09IFJBVEVfSU5WQUxJRCkKKwkJCWJyZWFrOworCQlpZiAocmF0ZV9tYXNrICYgKDEgPDwgbG93KSkKKwkJCWJyZWFrOworCQlEX1JBVEUoIlNraXBwaW5nIG1hc2tlZCBsb3dlciByYXRlOiAlZFxuIiwgbG93KTsKKwl9CisKKwloaWdoID0gaWR4OworCXdoaWxlIChoaWdoICE9IFJBVEVfSU5WQUxJRCkgeworCQlpZiAocnNfc3RhLT50Z2cpCisJCQloaWdoID0gaWwzOTQ1X3JhdGVzW2hpZ2hdLm5leHRfcnNfdGdnOworCQllbHNlCisJCQloaWdoID0gaWwzOTQ1X3JhdGVzW2hpZ2hdLm5leHRfcnM7CisJCWlmIChoaWdoID09IFJBVEVfSU5WQUxJRCkKKwkJCWJyZWFrOworCQlpZiAocmF0ZV9tYXNrICYgKDEgPDwgaGlnaCkpCisJCQlicmVhazsKKwkJRF9SQVRFKCJTa2lwcGluZyBtYXNrZWQgaGlnaGVyIHJhdGU6ICVkXG4iLCBoaWdoKTsKKwl9CisKKwlyZXR1cm4gKGhpZ2ggPDwgOCkgfCBsb3c7Cit9CisKKy8qKgorICogaWwzOTQ1X3JzX2dldF9yYXRlIC0gZmluZCB0aGUgcmF0ZSBmb3IgdGhlIHJlcXVlc3RlZCBwYWNrZXQKKyAqCisgKiBSZXR1cm5zIHRoZSBpZWVlODAyMTFfcmF0ZSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIuCisgKgorICogVGhlIHJhdGUgY29udHJvbCBhbGdvcml0aG0gaGFzIG5vIGludGVybmFsIG1hcHBpbmcgYmV0d2VlbiBod19tb2RlJ3MKKyAqIHJhdGUgb3JkZXJpbmcgYW5kIHRoZSByYXRlIG9yZGVyaW5nIHVzZWQgYnkgdGhlIHJhdGUgY29udHJvbCBhbGdvcml0aG0uCisgKgorICogVGhlIHJhdGUgY29udHJvbCBhbGdvcml0aG0gdXNlcyBhIHNpbmdsZSB0YWJsZSBvZiByYXRlcyB0aGF0IGdvZXMgYWNyb3NzCisgKiB0aGUgZW50aXJlIEEvQi9HIHNwZWN0cnVtIHZzLiBiZWluZyBsaW1pdGVkIHRvIGp1c3Qgb25lIHBhcnRpY3VsYXIKKyAqIGh3X21vZGUuCisgKgorICogQXMgc3VjaCwgd2UgY2FuJ3QgY29udmVydCB0aGUgaWR4IG9idGFpbmVkIGJlbG93IGludG8gdGhlIGh3X21vZGUncworICogcmF0ZSB0YWJsZSBhbmQgbXVzdCByZWZlcmVuY2UgdGhlIGRyaXZlciBhbGxvY2F0ZWQgcmF0ZSB0YWJsZQorICoKKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9yc19nZXRfcmF0ZSh2b2lkICppbF9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICppbF9zdGEsCisJCSAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZV9jb250cm9sICp0eHJjKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0gdHhyYy0+c2JhbmQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4cmMtPnNrYjsKKwl1OCBsb3cgPSBSQVRFX0lOVkFMSUQ7CisJdTggaGlnaCA9IFJBVEVfSU5WQUxJRDsKKwl1MTYgaGlnaF9sb3c7CisJaW50IGlkeDsKKwlzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqcnNfc3RhID0gaWxfc3RhOworCXN0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsZV9kYXRhICp3aW4gPSBOVUxMOworCWludCBjdXJyZW50X3RwdCA9IElMX0lOVkFMSURfVkFMVUU7CisJaW50IGxvd190cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCWludCBoaWdoX3RwdCA9IElMX0lOVkFMSURfVkFMVUU7CisJdTMyIGZhaWxfY291bnQ7CisJczggc2NhbGVfYWN0aW9uID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiByYXRlX21hc2s7CisJczggbWF4X3JhdGVfaWR4ID0gLTE7CisJc3RydWN0IGlsX3ByaXYgKmlsIF9fbWF5YmVfdW51c2VkID0gKHN0cnVjdCBpbF9wcml2ICopaWxfcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisKKwlEX1JBVEUoImVudGVyXG4iKTsKKworCS8qIFRyZWF0IHVuaW5pdGlhbGl6ZWQgcmF0ZSBzY2FsaW5nIGRhdGEgc2FtZSBhcyBub24tZXhpc3RpbmcuICovCisJaWYgKHJzX3N0YSAmJiAhcnNfc3RhLT5pbCkgeworCQlEX1JBVEUoIlJhdGUgc2NhbGluZyBpbmZvcm1hdGlvbiBub3QgaW5pdGlhbGl6ZWQgeWV0LlxuIik7CisJCWlsX3N0YSA9IE5VTEw7CisJfQorCisJaWYgKHJhdGVfY29udHJvbF9zZW5kX2xvdyhzdGEsIGlsX3N0YSwgdHhyYykpCisJCXJldHVybjsKKworCXJhdGVfbWFzayA9IHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF07CisKKwkvKiBnZXQgdXNlciBtYXggcmF0ZSBpZiBzZXQgKi8KKwltYXhfcmF0ZV9pZHggPSB0eHJjLT5tYXhfcmF0ZV9pZHg7CisJaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFogJiYgbWF4X3JhdGVfaWR4ICE9IC0xKQorCQltYXhfcmF0ZV9pZHggKz0gSUxfRklSU1RfT0ZETV9SQVRFOworCWlmIChtYXhfcmF0ZV9pZHggPCAwIHx8IG1heF9yYXRlX2lkeCA+PSBSQVRFX0NPVU5UKQorCQltYXhfcmF0ZV9pZHggPSAtMTsKKworCWlkeCA9IG1pbihyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCAmIDB4ZmZmZiwgUkFURV9DT1VOVF8zOTQ1IC0gMSk7CisKKwlpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJcmF0ZV9tYXNrID0gcmF0ZV9tYXNrIDw8IElMX0ZJUlNUX09GRE1fUkFURTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworCS8qIGZvciByZWNlbnQgYXNzb2MsIGNob29zZSBiZXN0IHJhdGUgcmVnYXJkaW5nCisJICogdG8gcnNzaSB2YWx1ZQorCSAqLworCWlmIChyc19zdGEtPnN0YXJ0X3JhdGUgIT0gUkFURV9JTlZBTElEKSB7CisJCWlmIChyc19zdGEtPnN0YXJ0X3JhdGUgPCBpZHggJiYKKwkJICAgIChyYXRlX21hc2sgJiAoMSA8PCByc19zdGEtPnN0YXJ0X3JhdGUpKSkKKwkJCWlkeCA9IHJzX3N0YS0+c3RhcnRfcmF0ZTsKKwkJcnNfc3RhLT5zdGFydF9yYXRlID0gUkFURV9JTlZBTElEOworCX0KKworCS8qIGZvcmNlIHVzZXIgbWF4IHJhdGUgaWYgc2V0IGJ5IHVzZXIgKi8KKwlpZiAobWF4X3JhdGVfaWR4ICE9IC0xICYmIG1heF9yYXRlX2lkeCA8IGlkeCkgeworCQlpZiAocmF0ZV9tYXNrICYgKDEgPDwgbWF4X3JhdGVfaWR4KSkKKwkJCWlkeCA9IG1heF9yYXRlX2lkeDsKKwl9CisKKwl3aW4gPSAmKHJzX3N0YS0+d2luW2lkeF0pOworCisJZmFpbF9jb3VudCA9IHdpbi0+Y291bnRlciAtIHdpbi0+c3VjY2Vzc19jb3VudGVyOworCisJaWYgKGZhaWxfY291bnQgPCBSQVRFX01JTl9GQUlMVVJFX1RIICYmCisJICAgIHdpbi0+c3VjY2Vzc19jb3VudGVyIDwgUkFURV9NSU5fU1VDQ0VTU19USCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworCQlEX1JBVEUoIkludmFsaWQgYXZlcmFnZV90cHQgb24gcmF0ZSAlZDogIgorCQkgICAgICAgImNvdW50ZXI6ICVkLCBzdWNjZXNzX2NvdW50ZXI6ICVkLCAiCisJCSAgICAgICAiZXhwZWN0ZWRfdHB0IGlzICVzTlVMTFxuIiwgaWR4LCB3aW4tPmNvdW50ZXIsCisJCSAgICAgICB3aW4tPnN1Y2Nlc3NfY291bnRlciwKKwkJICAgICAgIHJzX3N0YS0+ZXhwZWN0ZWRfdHB0ID8gIm5vdCAiIDogIiIpOworCisJCS8qIENhbid0IGNhbGN1bGF0ZSB0aGlzIHlldDsgbm90IGVub3VnaCBoaXN0b3J5ICovCisJCXdpbi0+YXZlcmFnZV90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCQlnb3RvIG91dDsKKworCX0KKworCWN1cnJlbnRfdHB0ID0gd2luLT5hdmVyYWdlX3RwdDsKKworCWhpZ2hfbG93ID0KKwkgICAgaWwzOTQ1X2dldF9hZGphY2VudF9yYXRlKHJzX3N0YSwgaWR4LCByYXRlX21hc2ssIHNiYW5kLT5iYW5kKTsKKwlsb3cgPSBoaWdoX2xvdyAmIDB4ZmY7CisJaGlnaCA9IChoaWdoX2xvdyA+PiA4KSAmIDB4ZmY7CisKKwkvKiBJZiB1c2VyIHNldCBtYXggcmF0ZSwgZG9udCBhbGxvdyBoaWdoZXIgdGhhbiB1c2VyIGNvbnN0cmFpbiAqLworCWlmIChtYXhfcmF0ZV9pZHggIT0gLTEgJiYgbWF4X3JhdGVfaWR4IDwgaGlnaCkKKwkJaGlnaCA9IFJBVEVfSU5WQUxJRDsKKworCS8qIENvbGxlY3QgTWVhc3VyZWQgdGhyb3VnaHB1dHMgb2YgYWRqYWNlbnQgcmF0ZXMgKi8KKwlpZiAobG93ICE9IFJBVEVfSU5WQUxJRCkKKwkJbG93X3RwdCA9IHJzX3N0YS0+d2luW2xvd10uYXZlcmFnZV90cHQ7CisKKwlpZiAoaGlnaCAhPSBSQVRFX0lOVkFMSUQpCisJCWhpZ2hfdHB0ID0gcnNfc3RhLT53aW5baGlnaF0uYXZlcmFnZV90cHQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKKworCXNjYWxlX2FjdGlvbiA9IDA7CisKKwkvKiBMb3cgc3VjY2VzcyByYXRpbyAsIG5lZWQgdG8gZHJvcCB0aGUgcmF0ZSAqLworCWlmICh3aW4tPnN1Y2Nlc3NfcmF0aW8gPCBSQVRFX0RFQ1JFQVNFX1RIIHx8ICFjdXJyZW50X3RwdCkgeworCQlEX1JBVEUoImRlY3JlYXNlIHJhdGUgYmVjYXVzZSBvZiBsb3cgc3VjY2Vzc19yYXRpb1xuIik7CisJCXNjYWxlX2FjdGlvbiA9IC0xOworCQkvKiBObyB0aHJvdWdocHV0IG1lYXN1cmVkIHlldCBmb3IgYWRqYWNlbnQgcmF0ZXMsCisJCSAqIHRyeSBpbmNyZWFzZSAqLworCX0gZWxzZSBpZiAobG93X3RwdCA9PSBJTF9JTlZBTElEX1ZBTFVFICYmIGhpZ2hfdHB0ID09IElMX0lOVkFMSURfVkFMVUUpIHsKKworCQlpZiAoaGlnaCAhPSBSQVRFX0lOVkFMSUQgJiYKKwkJICAgIHdpbi0+c3VjY2Vzc19yYXRpbyA+PSBSQVRFX0lOQ1JFQVNFX1RIKQorCQkJc2NhbGVfYWN0aW9uID0gMTsKKwkJZWxzZSBpZiAobG93ICE9IFJBVEVfSU5WQUxJRCkKKwkJCXNjYWxlX2FjdGlvbiA9IDA7CisKKwkJLyogQm90aCBhZGphY2VudCB0aHJvdWdocHV0cyBhcmUgbWVhc3VyZWQsIGJ1dCBuZWl0aGVyIG9uZSBoYXMKKwkJICogYmV0dGVyIHRocm91Z2hwdXQ7IHdlJ3JlIHVzaW5nIHRoZSBiZXN0IHJhdGUsIGRvbid0IGNoYW5nZQorCQkgKiBpdCEgKi8KKwl9IGVsc2UgaWYgKGxvd190cHQgIT0gSUxfSU5WQUxJRF9WQUxVRSAmJiBoaWdoX3RwdCAhPSBJTF9JTlZBTElEX1ZBTFVFCisJCSAgICYmIGxvd190cHQgPCBjdXJyZW50X3RwdCAmJiBoaWdoX3RwdCA8IGN1cnJlbnRfdHB0KSB7CisKKwkJRF9SQVRFKCJObyBhY3Rpb24gLS0gbG93IFslZF0gJiBoaWdoIFslZF0gPCAiCisJCSAgICAgICAiY3VycmVudF90cHQgWyVkXVxuIiwgbG93X3RwdCwgaGlnaF90cHQsIGN1cnJlbnRfdHB0KTsKKwkJc2NhbGVfYWN0aW9uID0gMDsKKworCQkvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIHJhdGVzIGhhcyBiZXR0ZXIgdGhyb3VnaHB1dCAqLworCX0gZWxzZSB7CisJCWlmIChoaWdoX3RwdCAhPSBJTF9JTlZBTElEX1ZBTFVFKSB7CisKKwkJCS8qIEhpZ2ggcmF0ZSBoYXMgYmV0dGVyIHRocm91Z2hwdXQsIEluY3JlYXNlCisJCQkgKiByYXRlICovCisJCQlpZiAoaGlnaF90cHQgPiBjdXJyZW50X3RwdCAmJgorCQkJICAgIHdpbi0+c3VjY2Vzc19yYXRpbyA+PSBSQVRFX0lOQ1JFQVNFX1RIKQorCQkJCXNjYWxlX2FjdGlvbiA9IDE7CisJCQllbHNlIHsKKwkJCQlEX1JBVEUoImRlY3JlYXNlIHJhdGUgYmVjYXVzZSBvZiBoaWdoIHRwdFxuIik7CisJCQkJc2NhbGVfYWN0aW9uID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChsb3dfdHB0ICE9IElMX0lOVkFMSURfVkFMVUUpIHsKKwkJCWlmIChsb3dfdHB0ID4gY3VycmVudF90cHQpIHsKKwkJCQlEX1JBVEUoImRlY3JlYXNlIHJhdGUgYmVjYXVzZSBvZiBsb3cgdHB0XG4iKTsKKwkJCQlzY2FsZV9hY3Rpb24gPSAtMTsKKwkJCX0gZWxzZSBpZiAod2luLT5zdWNjZXNzX3JhdGlvID49IFJBVEVfSU5DUkVBU0VfVEgpIHsKKwkJCQkvKiBMb3dlciByYXRlIGhhcyBiZXR0ZXIKKwkJCQkgKiB0aHJvdWdocHV0LGRlY3JlYXNlIHJhdGUgKi8KKwkJCQlzY2FsZV9hY3Rpb24gPSAxOworCQkJfQorCQl9CisJfQorCisJLyogU2FuaXR5IGNoZWNrOyBhc2tlZCBmb3IgZGVjcmVhc2UsIGJ1dCBzdWNjZXNzIHJhdGUgb3IgdGhyb3VnaHB1dAorCSAqIGhhcyBiZWVuIGdvb2QgYXQgb2xkIHJhdGUuICBEb24ndCBjaGFuZ2UgaXQuICovCisJaWYgKHNjYWxlX2FjdGlvbiA9PSAtMSAmJiBsb3cgIT0gUkFURV9JTlZBTElEICYmCisJICAgICh3aW4tPnN1Y2Nlc3NfcmF0aW8gPiBSQVRFX0hJR0hfVEggfHwKKwkgICAgIGN1cnJlbnRfdHB0ID4gMTAwICogcnNfc3RhLT5leHBlY3RlZF90cHRbbG93XSkpCisJCXNjYWxlX2FjdGlvbiA9IDA7CisKKwlzd2l0Y2ggKHNjYWxlX2FjdGlvbikgeworCWNhc2UgLTE6CisJCS8qIERlY3Jlc2UgcmF0ZSAqLworCQlpZiAobG93ICE9IFJBVEVfSU5WQUxJRCkKKwkJCWlkeCA9IGxvdzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBJbmNyZWFzZSByYXRlICovCisJCWlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCkKKwkJCWlkeCA9IGhpZ2g7CisKKwkJYnJlYWs7CisJY2FzZSAwOgorCWRlZmF1bHQ6CisJCS8qIE5vIGNoYW5nZSAqLworCQlicmVhazsKKwl9CisKKwlEX1JBVEUoIlNlbGVjdGVkICVkIChhY3Rpb24gJWQpIC0gbG93ICVkIGhpZ2ggJWRcbiIsIGlkeCwgc2NhbGVfYWN0aW9uLAorCSAgICAgICBsb3csIGhpZ2gpOworCitvdXQ6CisKKwlpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgeworCQlpZiAoV0FSTl9PTl9PTkNFKGlkeCA8IElMX0ZJUlNUX09GRE1fUkFURSkpCisJCQlpZHggPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ID0gaWR4OworCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeCA9IGlkeCAtIElMX0ZJUlNUX09GRE1fUkFURTsKKwl9IGVsc2UgeworCQlyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IGlkeDsKKwkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5pZHggPSByc19zdGEtPmxhc3RfdHhyYXRlX2lkeDsKKwl9CisKKwlEX1JBVEUoImxlYXZlOiAlZFxuIiwgaWR4KTsKK30KKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCitzdGF0aWMgaW50CitpbDM5NDVfb3Blbl9maWxlX2dlbmVyaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsMzk0NV9zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqYnVmZjsKKwlpbnQgZGVzYyA9IDA7CisJaW50IGo7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKmxxX3N0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWJ1ZmYgPSBrbWFsbG9jKDEwMjQsIEdGUF9LRVJORUwpOworCWlmICghYnVmZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkZXNjICs9CisJICAgIHNwcmludGYoYnVmZiArIGRlc2MsCisJCSAgICAidHggcGFja2V0cz0lZCBsYXN0IHJhdGUgaWR4PSVkXG4iCisJCSAgICAicmF0ZT0weCVYIGZsdXNoIHRpbWUgJWRcbiIsIGxxX3N0YS0+dHhfcGFja2V0cywKKwkJICAgIGxxX3N0YS0+bGFzdF90eHJhdGVfaWR4LCBscV9zdGEtPnN0YXJ0X3JhdGUsCisJCSAgICBqaWZmaWVzX3RvX21zZWNzKGxxX3N0YS0+Zmx1c2hfdGltZSkpOworCWZvciAoaiA9IDA7IGogPCBSQVRFX0NPVU5UXzM5NDU7IGorKykgeworCQlkZXNjICs9CisJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiY291bnRlcj0lZCBzdWNjZXNzPSVkICUlPSVkXG4iLAorCQkJICAgIGxxX3N0YS0+d2luW2pdLmNvdW50ZXIsCisJCQkgICAgbHFfc3RhLT53aW5bal0uc3VjY2Vzc19jb3VudGVyLAorCQkJICAgIGxxX3N0YS0+d2luW2pdLnN1Y2Nlc3NfcmF0aW8pOworCX0KKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZmYsIGRlc2MpOworCWtmcmVlKGJ1ZmYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9vcHMgPSB7CisJLnJlYWQgPSBpbDM5NDVfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX3JlYWQsCisJLm9wZW4gPSBpbDM5NDVfb3Blbl9maWxlX2dlbmVyaWMsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKworc3RhdGljIHZvaWQKK2lsMzk0NV9hZGRfZGVidWdmcyh2b2lkICppbCwgdm9pZCAqaWxfc3RhLCBzdHJ1Y3QgZGVudHJ5ICpkaXIpCit7CisJc3RydWN0IGlsMzk0NV9yc19zdGEgKmxxX3N0YSA9IGlsX3N0YTsKKworCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGUgPQorCSAgICBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYXRlX3N0YXRzX3RhYmxlIiwgMDYwMCwgZGlyLCBscV9zdGEsCisJCQkJJnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9vcHMpOworCit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfcmVtb3ZlX2RlYnVnZnModm9pZCAqaWwsIHZvaWQgKmlsX3N0YSkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X3JzX3N0YSAqbHFfc3RhID0gaWxfc3RhOworCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGUpOworfQorI2VuZGlmCisKKy8qCisgKiBJbml0aWFsaXphdGlvbiBvZiByYXRlIHNjYWxpbmcgaW5mb3JtYXRpb24gaXMgZG9uZSBieSBkcml2ZXIgYWZ0ZXIKKyAqIHRoZSBzdGF0aW9uIGlzIGFkZGVkLiBTaW5jZSBtYWM4MDIxMSBjYWxscyB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhCisgKiBzdGF0aW9uIGlzIGFkZGVkIHdlIGlnbm9yZSBpdC4KKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9yc19yYXRlX2luaXRfc3R1Yih2b2lkICppbF9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICppbF9zdGEpCit7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyByc19vcHMgPSB7CisJLm1vZHVsZSA9IE5VTEwsCisJLm5hbWUgPSBSU19OQU1FLAorCS50eF9zdGF0dXMgPSBpbDM5NDVfcnNfdHhfc3RhdHVzLAorCS5nZXRfcmF0ZSA9IGlsMzk0NV9yc19nZXRfcmF0ZSwKKwkucmF0ZV9pbml0ID0gaWwzOTQ1X3JzX3JhdGVfaW5pdF9zdHViLAorCS5hbGxvYyA9IGlsMzk0NV9yc19hbGxvYywKKwkuZnJlZSA9IGlsMzk0NV9yc19mcmVlLAorCS5hbGxvY19zdGEgPSBpbDM5NDVfcnNfYWxsb2Nfc3RhLAorCS5mcmVlX3N0YSA9IGlsMzk0NV9yc19mcmVlX3N0YSwKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUworCS5hZGRfc3RhX2RlYnVnZnMgPSBpbDM5NDVfYWRkX2RlYnVnZnMsCisJLnJlbW92ZV9zdGFfZGVidWdmcyA9IGlsMzk0NV9yZW1vdmVfZGVidWdmcywKKyNlbmRpZgorCit9OworCit2b2lkCitpbDM5NDVfcmF0ZV9zY2FsZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzMzIgc3RhX2lkKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXMzMiByc3NpID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbDM5NDVfcnNfc3RhICpyc19zdGE7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgaWwzOTQ1X3N0YV9wcml2ICpwc3RhOworCisJRF9SQVRFKCJlbnRlclxuIik7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlzdGEgPQorCSAgICBpZWVlODAyMTFfZmluZF9zdGEoaWwtPmN0eC52aWYsIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisJaWYgKCFzdGEpIHsKKwkJRF9SQVRFKCJVbmFibGUgdG8gZmluZCBzdGF0aW9uIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nLlxuIik7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm47CisJfQorCisJcHN0YSA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlyc19zdGEgPSAmcHN0YS0+cnNfc3RhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJcnNfc3RhLT50Z2cgPSAwOworCXN3aXRjaCAoaWwtPmJhbmQpIHsKKwljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6CisJCS8qIFRPRE86IHRoaXMgYWx3YXlzIGRvZXMgRywgbm90IGEgcmVncmVzc2lvbiAqLworCQlpZiAoaWwtPmN0eC5hY3RpdmUuZmxhZ3MgJiBSWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0spIHsKKwkJCXJzX3N0YS0+dGdnID0gMTsKKwkJCXJzX3N0YS0+ZXhwZWN0ZWRfdHB0ID0gaWwzOTQ1X2V4cGVjdGVkX3RwdF9nX3Byb3Q7CisJCX0gZWxzZQorCQkJcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpbDM5NDVfZXhwZWN0ZWRfdHB0X2c7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpbDM5NDVfZXhwZWN0ZWRfdHB0X2E7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX05VTV9CQU5EUzoKKwkJQlVHKCk7CisJCWJyZWFrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOworCisJcnNzaSA9IGlsLT5fMzk0NS5sYXN0X3J4X3Jzc2k7CisJaWYgKHJzc2kgPT0gMCkKKwkJcnNzaSA9IElMX01JTl9SU1NJX1ZBTDsKKworCURfUkFURSgiTmV0d29yayBSU1NJOiAlZFxuIiwgcnNzaSk7CisKKwlyc19zdGEtPnN0YXJ0X3JhdGUgPSBpbDM5NDVfZ2V0X3JhdGVfaWR4X2J5X3Jzc2kocnNzaSwgaWwtPmJhbmQpOworCisJRF9SQVRFKCJsZWF2ZTogcnNzaSAlZCBhc3NpZ24gcmF0ZSBpZHg6ICIgIiVkIChwbGNwIDB4JXgpXG4iLCByc3NpLAorCSAgICAgICByc19zdGEtPnN0YXJ0X3JhdGUsIGlsMzk0NV9yYXRlc1tyc19zdGEtPnN0YXJ0X3JhdGVdLnBsY3ApOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCitpbnQKK2lsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JhdGVfY29udHJvbF9yZWdpc3RlcigmcnNfb3BzKTsKK30KKwordm9pZAoraWwzOTQ1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKHZvaWQpCit7CisJaWVlZTgwMjExX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCZyc19vcHMpOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODliMTUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS8zOTQ1LmMKQEAgLTAsMCArMSwyNzQzIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIjM5NDUuaCIKKworLyogU2VuZCBsZWQgY29tbWFuZCAqLworc3RhdGljIGludAoraWwzOTQ1X3NlbmRfbGVkX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9sZWRfY21kICpsZWRfY21kKQoreworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfTEVEUywKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWxfbGVkX2NtZCksCisJCS5kYXRhID0gbGVkX2NtZCwKKwkJLmZsYWdzID0gQ01EX0FTWU5DLAorCQkuY2FsbGJhY2sgPSBOVUxMLAorCX07CisKKwlyZXR1cm4gaWxfc2VuZF9jbWQoaWwsICZjbWQpOworfQorCitjb25zdCBzdHJ1Y3QgaWxfbGVkX29wcyBpbDM5NDVfbGVkX29wcyA9IHsKKwkuY21kID0gaWwzOTQ1X3NlbmRfbGVkX2NtZCwKK307CisKKyNkZWZpbmUgSUxfREVDTEFSRV9SQVRFX0lORk8ociwgaXAsIGluLCBycCwgcm4sIHBwLCBucCkgICAgXAorCVtSQVRFXyMjciMjTV9JRFhdID0geyBSQVRFXyMjciMjTV9QTENQLCAgIFwKKwkJCQkgICAgUkFURV8jI3IjI01fSUVFRSwgICBcCisJCQkJICAgIFJBVEVfIyNpcCMjTV9JRFgsIFwKKwkJCQkgICAgUkFURV8jI2luIyNNX0lEWCwgXAorCQkJCSAgICBSQVRFXyMjcnAjI01fSURYLCBcCisJCQkJICAgIFJBVEVfIyNybiMjTV9JRFgsIFwKKwkJCQkgICAgUkFURV8jI3BwIyNNX0lEWCwgXAorCQkJCSAgICBSQVRFXyMjbnAjI01fSURYLCBcCisJCQkJICAgIFJBVEVfIyNyIyNNX0lEWF9UQkwsIFwKKwkJCQkgICAgUkFURV8jI2lwIyNNX0lEWF9UQkwgfQorCisvKgorICogUGFyYW1ldGVyIG9yZGVyOgorICogICByYXRlLCBwcmV2IHJhdGUsIG5leHQgcmF0ZSwgcHJldiB0Z2cgcmF0ZSwgbmV4dCB0Z2cgcmF0ZQorICoKKyAqIElmIHRoZXJlIGlzbid0IGEgdmFsaWQgbmV4dCBvciBwcmV2aW91cyByYXRlIHRoZW4gSU5WIGlzIHVzZWQgd2hpY2gKKyAqIG1hcHMgdG8gUkFURV9JTlZBTElECisgKgorICovCitjb25zdCBzdHJ1Y3QgaWwzOTQ1X3JhdGVfaW5mbyBpbDM5NDVfcmF0ZXNbUkFURV9DT1VOVF8zOTQ1XSA9IHsKKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygxLCBJTlYsIDIsIElOViwgMiwgSU5WLCAyKSwJLyogIDFtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oMiwgMSwgNSwgMSwgNSwgMSwgNSksCS8qICAybWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDUsIDIsIDYsIDIsIDExLCAyLCAxMSksCS8qNS41bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDExLCA5LCAxMiwgNSwgMTIsIDUsIDE4KSwJLyogMTFtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oNiwgNSwgOSwgNSwgMTEsIDUsIDExKSwJLyogIDZtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oOSwgNiwgMTEsIDUsIDExLCA1LCAxMSksCS8qICA5bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDEyLCAxMSwgMTgsIDExLCAxOCwgMTEsIDE4KSwJLyogMTJtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oMTgsIDEyLCAyNCwgMTIsIDI0LCAxMSwgMjQpLAkvKiAxOG1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTygyNCwgMTgsIDM2LCAxOCwgMzYsIDE4LCAzNiksCS8qIDI0bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDM2LCAyNCwgNDgsIDI0LCA0OCwgMjQsIDQ4KSwJLyogMzZtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oNDgsIDM2LCA1NCwgMzYsIDU0LCAzNiwgNTQpLAkvKiA0OG1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTyg1NCwgNDgsIElOViwgNDgsIElOViwgNDgsIElOViksCS8qIDU0bWJwcyAqLworfTsKKworc3RhdGljIGlubGluZSB1OAoraWwzOTQ1X2dldF9wcmV2X2llZWVfcmF0ZSh1OCByYXRlX2lkeCkKK3sKKwl1OCByYXRlID0gaWwzOTQ1X3JhdGVzW3JhdGVfaWR4XS5wcmV2X2llZWU7CisKKwlpZiAocmF0ZSA9PSBSQVRFX0lOVkFMSUQpCisJCXJhdGUgPSByYXRlX2lkeDsKKwlyZXR1cm4gcmF0ZTsKK30KKworLyogMSA9IGVuYWJsZSB0aGUgaWwzOTQ1X2Rpc2FibGVfZXZlbnRzKCkgZnVuY3Rpb24gKi8KKyNkZWZpbmUgSUxfRVZUX0RJU0FCTEUgKDApCisjZGVmaW5lIElMX0VWVF9ESVNBQkxFX1NJWkUgKDE1MzIvMzIpCisKKy8qKgorICogaWwzOTQ1X2Rpc2FibGVfZXZlbnRzIC0gRGlzYWJsZSBzZWxlY3RlZCBldmVudHMgaW4gdUNvZGUgZXZlbnQgbG9nCisgKgorICogRGlzYWJsZSBhbiBldmVudCBieSB3cml0aW5nICIxInMgaW50byAiZGlzYWJsZSIKKyAqICAgYml0bWFwIGluIFNSQU0uICBCaXQgcG9zaXRpb24gY29ycmVzcG9uZHMgdG8gRXZlbnQgIyAoaWQvdHlwZSkuCisgKiAgIERlZmF1bHQgdmFsdWVzIG9mIDAgZW5hYmxlIHVDb2RlIGV2ZW50cyB0byBiZSBsb2dnZWQuCisgKiBVc2UgZm9yIG9ubHkgc3BlY2lhbCBkZWJ1Z2dpbmcuICBUaGlzIGZ1bmN0aW9uIGlzIGp1c3QgYSBwbGFjZWhvbGRlciBhcy1pcywKKyAqICAgeW91J2xsIG5lZWQgdG8gcHJvdmlkZSB0aGUgc3BlY2lhbCBiaXRzISAuLi4KKyAqICAgLi4uIGFuZCBzZXQgSUxfRVZUX0RJU0FCTEUgdG8gMS4gKi8KK3ZvaWQKK2lsMzk0NV9kaXNhYmxlX2V2ZW50cyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGk7CisJdTMyIGJhc2U7CQkvKiBTUkFNIGFkZHJlc3Mgb2YgZXZlbnQgbG9nIGhlYWRlciAqLworCXUzMiBkaXNhYmxlX3B0cjsJLyogU1JBTSBhZGRyZXNzIG9mIGV2ZW50LWRpc2FibGUgYml0bWFwIGFycmF5ICovCisJdTMyIGFycmF5X3NpemU7CQkvKiAjIG9mIHUzMiBlbnRyaWVzIGluIGFycmF5ICovCisJc3RhdGljIGNvbnN0IHUzMiBldnRfZGlzYWJsZVtJTF9FVlRfRElTQUJMRV9TSVpFXSA9IHsKKwkJMHgwMDAwMDAwMCwJLyogICAzMSAtICAgIDAgIEV2ZW50IGlkIG51bWJlcnMgKi8KKwkJMHgwMDAwMDAwMCwJLyogICA2MyAtICAgMzIgKi8KKwkJMHgwMDAwMDAwMCwJLyogICA5NSAtICAgNjQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDEyNyAtICAgOTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDE1OSAtICAxMjggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDE5MSAtICAxNjAgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDIyMyAtICAxOTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDI1NSAtICAyMjQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDI4NyAtICAyNTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDMxOSAtICAyODggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDM1MSAtICAzMjAgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDM4MyAtICAzNTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDQxNSAtICAzODQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDQ0NyAtICA0MTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDQ3OSAtICA0NDggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDUxMSAtICA0ODAgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDU0MyAtICA1MTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDU3NSAtICA1NDQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDYwNyAtICA1NzYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDYzOSAtICA2MDggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDY3MSAtICA2NDAgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDcwMyAtICA2NzIgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDczNSAtICA3MDQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDc2NyAtICA3MzYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDc5OSAtICA3NjggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDgzMSAtICA4MDAgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDg2MyAtICA4MzIgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDg5NSAtICA4NjQgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDkyNyAtICA4OTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogIDk1OSAtICA5MjggKi8KKwkJMHgwMDAwMDAwMCwJLyogIDk5MSAtICA5NjAgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTAyMyAtICA5OTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTA1NSAtIDEwMjQgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTA4NyAtIDEwNTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTExOSAtIDEwODggKi8KKwkJMHgwMDAwMDAwMCwJLyogMTE1MSAtIDExMjAgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTE4MyAtIDExNTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTIxNSAtIDExODQgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTI0NyAtIDEyMTYgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTI3OSAtIDEyNDggKi8KKwkJMHgwMDAwMDAwMCwJLyogMTMxMSAtIDEyODAgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTM0MyAtIDEzMTIgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTM3NSAtIDEzNDQgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTQwNyAtIDEzNzYgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTQzOSAtIDE0MDggKi8KKwkJMHgwMDAwMDAwMCwJLyogMTQ3MSAtIDE0NDAgKi8KKwkJMHgwMDAwMDAwMCwJLyogMTUwMyAtIDE0NzIgKi8KKwl9OworCisJYmFzZSA9IGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlLmxvZ19ldmVudF90YWJsZV9wdHIpOworCWlmICghaWwzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIoYmFzZSkpIHsKKwkJSUxfRVJSKCJJbnZhbGlkIGV2ZW50IGxvZyBwb2ludGVyIDB4JTA4WFxuIiwgYmFzZSk7CisJCXJldHVybjsKKwl9CisKKwlkaXNhYmxlX3B0ciA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyAoNCAqIHNpemVvZih1MzIpKSk7CisJYXJyYXlfc2l6ZSA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyAoNSAqIHNpemVvZih1MzIpKSk7CisKKwlpZiAoSUxfRVZUX0RJU0FCTEUgJiYgYXJyYXlfc2l6ZSA9PSBJTF9FVlRfRElTQUJMRV9TSVpFKSB7CisJCURfSU5GTygiRGlzYWJsaW5nIHNlbGVjdGVkIHVDb2RlIGxvZyBldmVudHMgYXQgMHgleFxuIiwKKwkJICAgICAgIGRpc2FibGVfcHRyKTsKKwkJZm9yIChpID0gMDsgaSA8IElMX0VWVF9ESVNBQkxFX1NJWkU7IGkrKykKKwkJCWlsX3dyaXRlX3RhcmdfbWVtKGlsLCBkaXNhYmxlX3B0ciArIChpICogc2l6ZW9mKHUzMikpLAorCQkJCQkgIGV2dF9kaXNhYmxlW2ldKTsKKworCX0gZWxzZSB7CisJCURfSU5GTygiU2VsZWN0ZWQgdUNvZGUgbG9nIGV2ZW50cyBtYXkgYmUgZGlzYWJsZWRcbiIpOworCQlEX0lORk8oIiAgYnkgd3JpdGluZyBcIjFcInMgaW50byBkaXNhYmxlIGJpdG1hcFxuIik7CisJCURfSU5GTygiICBpbiBTUkFNIGF0IDB4JXgsIHNpemUgJWQgdTMyc1xuIiwgZGlzYWJsZV9wdHIsCisJCSAgICAgICBhcnJheV9zaXplKTsKKwl9CisKK30KKworc3RhdGljIGludAoraWwzOTQ1X2h3cmF0ZV90b19wbGNwX2lkeCh1OCBwbGNwKQoreworCWludCBpZHg7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IFJBVEVfQ09VTlRfMzk0NTsgaWR4KyspCisJCWlmIChpbDM5NDVfcmF0ZXNbaWR4XS5wbGNwID09IHBsY3ApCisJCQlyZXR1cm4gaWR4OworCXJldHVybiAtMTsKK30KKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworI2RlZmluZSBUWF9TVEFUVVNfRU5UUlkoeCkgY2FzZSBUWF8zOTQ1X1NUQVRVU19GQUlMXyAjIyB4OiByZXR1cm4gI3gKKworc3RhdGljIGNvbnN0IGNoYXIgKgoraWwzOTQ1X2dldF90eF9mYWlsX3JlYXNvbih1MzIgc3RhdHVzKQoreworCXN3aXRjaCAoc3RhdHVzICYgVFhfU1RBVFVTX01TSykgeworCWNhc2UgVFhfMzk0NV9TVEFUVVNfU1VDQ0VTUzoKKwkJcmV0dXJuICJTVUNDRVNTIjsKKwkJVFhfU1RBVFVTX0VOVFJZKFNIT1JUX0xJTUlUKTsKKwkJVFhfU1RBVFVTX0VOVFJZKExPTkdfTElNSVQpOworCQlUWF9TVEFUVVNfRU5UUlkoRklGT19VTkRFUlJVTik7CisJCVRYX1NUQVRVU19FTlRSWShNR01OVF9BQk9SVCk7CisJCVRYX1NUQVRVU19FTlRSWShORVhUX0ZSQUcpOworCQlUWF9TVEFUVVNfRU5UUlkoTElGRV9FWFBJUkUpOworCQlUWF9TVEFUVVNfRU5UUlkoREVTVF9QUyk7CisJCVRYX1NUQVRVU19FTlRSWShBQk9SVEVEKTsKKwkJVFhfU1RBVFVTX0VOVFJZKEJUX1JFVFJZKTsKKwkJVFhfU1RBVFVTX0VOVFJZKFNUQV9JTlZBTElEKTsKKwkJVFhfU1RBVFVTX0VOVFJZKEZSQUdfRFJPUFBFRCk7CisJCVRYX1NUQVRVU19FTlRSWShUSURfRElTQUJMRSk7CisJCVRYX1NUQVRVU19FTlRSWShGUkFNRV9GTFVTSEVEKTsKKwkJVFhfU1RBVFVTX0VOVFJZKElOU1VGRklDSUVOVF9DRl9QT0xMKTsKKwkJVFhfU1RBVFVTX0VOVFJZKFRYX0xPQ0tFRCk7CisJCVRYX1NUQVRVU19FTlRSWShOT19CRUFDT05fT05fUkFEQVIpOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKK2lsMzk0NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKK3sKKwlyZXR1cm4gIiI7Cit9CisjZW5kaWYKKworLyoKKyAqIGdldCBpZWVlIHByZXYgcmF0ZSBmcm9tIHJhdGUgc2NhbGUgdGFibGUuCisgKiBmb3IgQSBhbmQgQiBtb2RlIHdlIG5lZWQgdG8gb3ZlcnJpZ2h0IHByZXYKKyAqIHZhbHVlCisgKi8KK2ludAoraWwzOTQ1X3JzX25leHRfcmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCByYXRlKQoreworCWludCBuZXh0X3JhdGUgPSBpbDM5NDVfZ2V0X3ByZXZfaWVlZV9yYXRlKHJhdGUpOworCisJc3dpdGNoIChpbC0+YmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJaWYgKHJhdGUgPT0gUkFURV8xMk1fSURYKQorCQkJbmV4dF9yYXRlID0gUkFURV85TV9JRFg7CisJCWVsc2UgaWYgKHJhdGUgPT0gUkFURV82TV9JRFgpCisJCQluZXh0X3JhdGUgPSBSQVRFXzZNX0lEWDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQlpZiAoIShpbC0+XzM5NDUuc3RhX3N1cHBfcmF0ZXMgJiBJTF9PRkRNX1JBVEVTX01BU0spICYmCisJCSAgICBpbF9pc19hc3NvY2lhdGVkKGlsKSkgeworCQkJaWYgKHJhdGUgPT0gUkFURV8xMU1fSURYKQorCQkJCW5leHRfcmF0ZSA9IFJBVEVfNU1fSURYOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG5leHRfcmF0ZTsKK30KKworLyoqCisgKiBpbDM5NDVfdHhfcXVldWVfcmVjbGFpbSAtIFJlY2xhaW0gVHggcXVldWUgZW50cmllcyBhbHJlYWR5IFR4J2QKKyAqCisgKiBXaGVuIEZXIGFkdmFuY2VzICdSJyBpZHgsIGFsbCBlbnRyaWVzIGJldHdlZW4gb2xkIGFuZCBuZXcgJ1InIGlkeAorICogbmVlZCB0byBiZSByZWNsYWltZWQuIEFzIHJlc3VsdCwgc29tZSBmcmVlIHNwYWNlIGZvcm1zLiBJZiB0aGVyZSBpcworICogZW5vdWdoIGZyZWUgc3BhY2UgKD4gbG93IG1hcmspLCB3YWtlIHRoZSBzdGFjayB0aGF0IGZlZWRzIHVzLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4KQoreworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmdHhxLT5xOworCXN0cnVjdCBpbF90eF9pbmZvICp0eF9pbmZvOworCisJQlVHX09OKHR4cV9pZCA9PSBJTDM5X0NNRF9RVUVVRV9OVU0pOworCisJZm9yIChpZHggPSBpbF9xdWV1ZV9pbmNfd3JhcChpZHgsIHEtPm5fYmQpOyBxLT5yZWFkX3B0ciAhPSBpZHg7CisJICAgICBxLT5yZWFkX3B0ciA9IGlsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgeworCisJCXR4X2luZm8gPSAmdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXTsKKwkJaWVlZTgwMjExX3R4X3N0YXR1c19pcnFzYWZlKGlsLT5odywgdHhfaW5mby0+c2tiKTsKKwkJdHhfaW5mby0+c2tiID0gTlVMTDsKKwkJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9mcmVlX3RmZChpbCwgdHhxKTsKKwl9CisKKwlpZiAoaWxfcXVldWVfc3BhY2UocSkgPiBxLT5sb3dfbWFyayAmJiB0eHFfaWQgPj0gMCAmJgorCSAgICB0eHFfaWQgIT0gSUwzOV9DTURfUVVFVUVfTlVNICYmIGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkKQorCQlpbF93YWtlX3F1ZXVlKGlsLCB0eHEpOworfQorCisvKioKKyAqIGlsMzk0NV9oZGxfdHggLSBIYW5kbGUgVHggcmVzcG9uc2UKKyAqLworc3RhdGljIHZvaWQKK2lsMzk0NV9oZGxfdHgoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwl1MTYgc2VxdWVuY2UgPSBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSk7CisJaW50IHR4cV9pZCA9IFNFUV9UT19RVUVVRShzZXF1ZW5jZSk7CisJaW50IGlkeCA9IFNFUV9UT19JRFgoc2VxdWVuY2UpOworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IGlsMzk0NV90eF9yZXNwICp0eF9yZXNwID0gKHZvaWQgKikmcGt0LT51LnJhd1swXTsKKwl1MzIgc3RhdHVzID0gbGUzMl90b19jcHUodHhfcmVzcC0+c3RhdHVzKTsKKwlpbnQgcmF0ZV9pZHg7CisJaW50IGZhaWw7CisKKwlpZiAoaWR4ID49IHR4cS0+cS5uX2JkIHx8IGlsX3F1ZXVlX3VzZWQoJnR4cS0+cSwgaWR4KSA9PSAwKSB7CisJCUlMX0VSUigiUmVhZCBpZHggZm9yIERNQSBxdWV1ZSB0eHFfaWQgKCVkKSBpZHggJWQgIgorCQkgICAgICAgImlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWRcbiIsIHR4cV9pZCwgaWR4LAorCQkgICAgICAgdHhxLT5xLm5fYmQsIHR4cS0+cS53cml0ZV9wdHIsIHR4cS0+cS5yZWFkX3B0cik7CisJCXJldHVybjsKKwl9CisKKwl0eHEtPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiKTsKKwlpZWVlODAyMTFfdHhfaW5mb19jbGVhcl9zdGF0dXMoaW5mbyk7CisKKwkvKiBGaWxsIHRoZSBNUlIgY2hhaW4gd2l0aCBzb21lIGluZm8gYWJvdXQgb24tY2hpcCByZXRyYW5zbWlzc2lvbnMgKi8KKwlyYXRlX2lkeCA9IGlsMzk0NV9od3JhdGVfdG9fcGxjcF9pZHgodHhfcmVzcC0+cmF0ZSk7CisJaWYgKGluZm8tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJcmF0ZV9pZHggLT0gSUxfRklSU1RfT0ZETV9SQVRFOworCisJZmFpbCA9IHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWU7CisKKwlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uaWR4ID0gcmF0ZV9pZHg7CisJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmNvdW50ID0gZmFpbCArIDE7CS8qIGFkZCBmaW5hbCBhdHRlbXB0ICovCisKKwkvKiB0eF9zdGF0dXMtPnJ0c19yZXRyeV9jb3VudCA9IHR4X3Jlc3AtPmZhaWx1cmVfcnRzOyAqLworCWluZm8tPmZsYWdzIHw9CisJICAgICgoc3RhdHVzICYgVFhfU1RBVFVTX01TSykgPT0KKwkgICAgIFRYX1NUQVRVU19TVUNDRVNTKSA/IElFRUU4MDIxMV9UWF9TVEFUX0FDSyA6IDA7CisKKwlEX1RYKCJUeCBxdWV1ZSAlZCBTdGF0dXMgJXMgKDB4JTA4eCkgcGxjcCByYXRlICVkIHJldHJpZXMgJWRcbiIsIHR4cV9pZCwKKwkgICAgIGlsMzk0NV9nZXRfdHhfZmFpbF9yZWFzb24oc3RhdHVzKSwgc3RhdHVzLCB0eF9yZXNwLT5yYXRlLAorCSAgICAgdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSk7CisKKwlEX1RYX1JFUExZKCJUeCBxdWV1ZSByZWNsYWltICVkXG4iLCBpZHgpOworCWlsMzk0NV90eF9xdWV1ZV9yZWNsYWltKGlsLCB0eHFfaWQsIGlkeCk7CisKKwlpZiAoc3RhdHVzICYgVFhfQUJPUlRfUkVRVUlSRURfTVNLKQorCQlJTF9FUlIoIlRPRE86ICBJbXBsZW1lbnQgVHggQUJPUlQgUkVRVUlSRUQhISFcbiIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBJbnRlbCBQUk8vV2lyZWxlc3MgMzk0NUFCRy9CRyBOZXR3b3JrIENvbm5lY3Rpb24KKyAqCisgKiAgUlggaGFuZGxlciBpbXBsZW1lbnRhdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKK3N0YXRpYyB2b2lkCitpbDM5NDVfYWNjdW11bGF0aXZlX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgX19sZTMyICogc3RhdHMpCit7CisJaW50IGk7CisJX19sZTMyICpwcmV2X3N0YXRzOworCXUzMiAqYWNjdW1fc3RhdHM7CisJdTMyICpkZWx0YSwgKm1heF9kZWx0YTsKKworCXByZXZfc3RhdHMgPSAoX19sZTMyICopICZpbC0+XzM5NDUuc3RhdHM7CisJYWNjdW1fc3RhdHMgPSAodTMyICopICZpbC0+XzM5NDUuYWNjdW1fc3RhdHM7CisJZGVsdGEgPSAodTMyICopICZpbC0+XzM5NDUuZGVsdGFfc3RhdHM7CisJbWF4X2RlbHRhID0gKHUzMiAqKSAmaWwtPl8zOTQ1Lm1heF9kZWx0YTsKKworCWZvciAoaSA9IHNpemVvZihfX2xlMzIpOyBpIDwgc2l6ZW9mKHN0cnVjdCBpbDM5NDVfbm90aWZfc3RhdHMpOworCSAgICAgaSArPQorCSAgICAgc2l6ZW9mKF9fbGUzMiksIHN0YXRzKyssIHByZXZfc3RhdHMrKywgZGVsdGErKywgbWF4X2RlbHRhKyssCisJICAgICBhY2N1bV9zdGF0cysrKSB7CisJCWlmIChsZTMyX3RvX2NwdSgqc3RhdHMpID4gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKSB7CisJCQkqZGVsdGEgPQorCQkJICAgIChsZTMyX3RvX2NwdSgqc3RhdHMpIC0gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKTsKKwkJCSphY2N1bV9zdGF0cyArPSAqZGVsdGE7CisJCQlpZiAoKmRlbHRhID4gKm1heF9kZWx0YSkKKwkJCQkqbWF4X2RlbHRhID0gKmRlbHRhOworCQl9CisJfQorCisJLyogcmVzZXQgYWNjdW11bGF0aXZlIHN0YXRzIGZvciAibm8tY291bnRlciIgdHlwZSBzdGF0cyAqLworCWlsLT5fMzk0NS5hY2N1bV9zdGF0cy5nZW5lcmFsLnRlbXBlcmF0dXJlID0KKwkgICAgaWwtPl8zOTQ1LnN0YXRzLmdlbmVyYWwudGVtcGVyYXR1cmU7CisJaWwtPl8zOTQ1LmFjY3VtX3N0YXRzLmdlbmVyYWwudHRsX3RpbWVzdGFtcCA9CisJICAgIGlsLT5fMzk0NS5zdGF0cy5nZW5lcmFsLnR0bF90aW1lc3RhbXA7Cit9CisjZW5kaWYKKwordm9pZAoraWwzOTQ1X2hkbF9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCisJRF9SWCgiU3RhdGlzdGljcyBub3RpZmljYXRpb24gcmVjZWl2ZWQgKCVkIHZzICVkKS5cbiIsCisJICAgICAoaW50KXNpemVvZihzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzKSwKKwkgICAgIGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgSUxfUlhfRlJBTUVfU0laRV9NU0spOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJaWwzOTQ1X2FjY3VtdWxhdGl2ZV9zdGF0cyhpbCwgKF9fbGUzMiAqKSAmcGt0LT51LnJhdyk7CisjZW5kaWYKKworCW1lbWNweSgmaWwtPl8zOTQ1LnN0YXRzLCBwa3QtPnUucmF3LCBzaXplb2YoaWwtPl8zOTQ1LnN0YXRzKSk7Cit9CisKK3ZvaWQKK2lsMzk0NV9oZGxfY19zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCV9fbGUzMiAqZmxhZyA9IChfX2xlMzIgKikgJnBrdC0+dS5yYXc7CisKKwlpZiAobGUzMl90b19jcHUoKmZsYWcpICYgVUNPREVfU1RBVFNfQ0xFQVJfTVNLKSB7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwkJbWVtc2V0KCZpbC0+XzM5NDUuYWNjdW1fc3RhdHMsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsMzk0NV9ub3RpZl9zdGF0cykpOworCQltZW1zZXQoJmlsLT5fMzk0NS5kZWx0YV9zdGF0cywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzKSk7CisJCW1lbXNldCgmaWwtPl8zOTQ1Lm1heF9kZWx0YSwgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzKSk7CisjZW5kaWYKKwkJRF9SWCgiU3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7CisJfQorCWlsMzk0NV9oZGxfc3RhdHMoaWwsIHJ4Yik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBNaXNjLiBpbnRlcm5hbCBzdGF0ZSBhbmQgaGVscGVyIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgZm9yIGEgbnVtYmVyIG9mIHN0YXRzLCBzZWUgdGhlIGNhbGxlci4gKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9pc19uZXR3b3JrX3BhY2tldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCit7CisJLyogRmlsdGVyIGluY29taW5nIHBhY2tldHMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIHRhcmdldGVkIHRvd2FyZAorCSAqIHRoaXMgbmV0d29yaywgZGlzY2FyZGluZyBwYWNrZXRzIGNvbWluZyBmcm9tIG91cnNlbHZlcyAqLworCXN3aXRjaCAoaWwtPml3X21vZGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgkvKiBIZWFkZXI6IERlc3QuIHwgU291cmNlICAgIHwgQlNTSUQgKi8KKwkJLyogcGFja2V0cyB0byBvdXIgSUJTUyB1cGRhdGUgaW5mb3JtYXRpb24gKi8KKwkJcmV0dXJuICFjb21wYXJlX2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMywgaWwtPmJzc2lkKTsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CS8qIEhlYWRlcjogRGVzdC4gfCBBUHtCU1NJRH0gfCBTb3VyY2UgKi8KKwkJLyogcGFja2V0cyB0byBvdXIgSUJTUyB1cGRhdGUgaW5mb3JtYXRpb24gKi8KKwkJcmV0dXJuICFjb21wYXJlX2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMiwgaWwtPmJzc2lkKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfcGFzc19wYWNrZXRfdG9fbWFjODAyMTEoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKUlMX1JYX0RBVEEocGt0KTsKKwlzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lX2hkciAqcnhfaGRyID0gSUxfUlhfSERSKHBrdCk7CisJc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9lbmQgKnJ4X2VuZCA9IElMX1JYX0VORChwa3QpOworCXUxNiBsZW4gPSBsZTE2X3RvX2NwdShyeF9oZHItPmxlbik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CisKKwkvKiBXZSByZWNlaXZlZCBkYXRhIGZyb20gdGhlIEhXLCBzbyBzdG9wIHRoZSB3YXRjaGRvZyAqLworCWlmICh1bmxpa2VseQorCSAgICAobGVuICsgSUwzOV9SWF9GUkFNRV9TSVpFID4KKwkgICAgIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpKSB7CisJCURfRFJPUCgiQ29ycnVwdGlvbiBkZXRlY3RlZCFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogV2Ugb25seSBwcm9jZXNzIGRhdGEgcGFja2V0cyBpZiB0aGUgaW50ZXJmYWNlIGlzIG9wZW4gKi8KKwlpZiAodW5saWtlbHkoIWlsLT5pc19vcGVuKSkgeworCQlEX0RST1AoIkRyb3BwaW5nIHBhY2tldCB3aGlsZSBpbnRlcmZhY2UgaXMgbm90IG9wZW4uXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKKwlpZiAoIXNrYikgeworCQlJTF9FUlIoImRldl9hbGxvY19za2IgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghaWwzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvKQorCQlpbF9zZXRfZGVjcnlwdGVkX2ZsYWcoaWwsIChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXJ4Yl9hZGRyKHJ4YiksCisJCQkJICAgICAgbGUzMl90b19jcHUocnhfZW5kLT5zdGF0dXMpLCBzdGF0cyk7CisKKwlza2JfYWRkX3J4X2ZyYWcoc2tiLCAwLCByeGItPnBhZ2UsCisJCQkodm9pZCAqKXJ4X2hkci0+cGF5bG9hZCAtICh2b2lkICopcGt0LCBsZW4pOworCisJaWxfdXBkYXRlX3N0YXRzKGlsLCBmYWxzZSwgZmMsIGxlbik7CisJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpOworCisJaWVlZTgwMjExX3J4KGlsLT5odywgc2tiKTsKKwlpbC0+YWxsb2NfcnhiX3BhZ2UtLTsKKwlyeGItPnBhZ2UgPSBOVUxMOworfQorCisjZGVmaW5lIElMX0RFTEFZX05FWFRfU0NBTl9BRlRFUl9BU1NPQyAoSFoqNikKKworc3RhdGljIHZvaWQKK2lsMzk0NV9oZGxfcngoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXM7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lX3N0YXRzICpyeF9zdGF0cyA9IElMX1JYX1NUQVRTKHBrdCk7CisJc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9oZHIgKnJ4X2hkciA9IElMX1JYX0hEUihwa3QpOworCXN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfZW5kICpyeF9lbmQgPSBJTF9SWF9FTkQocGt0KTsKKwl1MTYgcnhfc3RhdHNfc2lnX2F2ZyBfX21heWJlX3VudXNlZCA9IGxlMTZfdG9fY3B1KHJ4X3N0YXRzLT5zaWdfYXZnKTsKKwl1MTYgcnhfc3RhdHNfbm9pc2VfZGlmZiBfX21heWJlX3VudXNlZCA9CisJICAgIGxlMTZfdG9fY3B1KHJ4X3N0YXRzLT5ub2lzZV9kaWZmKTsKKwl1OCBuZXR3b3JrX3BhY2tldDsKKworCXJ4X3N0YXR1cy5mbGFnID0gMDsKKwlyeF9zdGF0dXMubWFjdGltZSA9IGxlNjRfdG9fY3B1KHJ4X2VuZC0+dGltZXN0YW1wKTsKKwlyeF9zdGF0dXMuYmFuZCA9CisJICAgIChyeF9oZHItPgorCSAgICAgcGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19CQU5EXzI0X01TSykgPyBJRUVFODAyMTFfQkFORF8yR0haIDoKKwkgICAgSUVFRTgwMjExX0JBTkRfNUdIWjsKKwlyeF9zdGF0dXMuZnJlcSA9CisJICAgIGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShsZTE2X3RvX2NwdShyeF9oZHItPmNoYW5uZWwpLAorCQkJCQkgICByeF9zdGF0dXMuYmFuZCk7CisKKwlyeF9zdGF0dXMucmF0ZV9pZHggPSBpbDM5NDVfaHdyYXRlX3RvX3BsY3BfaWR4KHJ4X2hkci0+cmF0ZSk7CisJaWYgKHJ4X3N0YXR1cy5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCXJ4X3N0YXR1cy5yYXRlX2lkeCAtPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisKKwlyeF9zdGF0dXMuYW50ZW5uYSA9CisJICAgIChsZTE2X3RvX2NwdShyeF9oZHItPnBoeV9mbGFncykgJiBSWF9SRVNfUEhZX0ZMQUdTX0FOVEVOTkFfTVNLKSA+PgorCSAgICA0OworCisJLyogc2V0IHRoZSBwcmVhbWJsZSBmbGFnIGlmIGFwcHJvcHJpYXRlICovCisJaWYgKHJ4X2hkci0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19TSE9SVF9QUkVBTUJMRV9NU0spCisJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7CisKKwlpZiAoKHVubGlrZWx5KHJ4X3N0YXRzLT5waHlfY291bnQgPiAyMCkpKSB7CisJCURfRFJPUCgiZHNwIHNpemUgb3V0IG9mIHJhbmdlIFswLDIwXTogJWQvbiIsCisJCSAgICAgICByeF9zdGF0cy0+cGh5X2NvdW50KTsKKwkJcmV0dXJuOworCX0KKworCWlmICghKHJ4X2VuZC0+c3RhdHVzICYgUlhfUkVTX1NUQVRVU19OT19DUkMzMl9FUlJPUikgfHwKKwkgICAgIShyeF9lbmQtPnN0YXR1cyAmIFJYX1JFU19TVEFUVVNfTk9fUlhFX09WRVJGTE9XKSkgeworCQlEX1JYKCJCYWQgQ1JDIG9yIEZJRk86IDB4JTA4WC5cbiIsIHJ4X2VuZC0+c3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENvbnZlcnQgMzk0NSdzIHJzc2kgaW5kaWNhdG9yIHRvIGRCbSAqLworCXJ4X3N0YXR1cy5zaWduYWwgPSByeF9zdGF0cy0+cnNzaSAtIElMMzlfUlNTSV9PRkZTRVQ7CisKKwlEX1NUQVRTKCJSc3NpICVkIHNpZ19hdmcgJWQgbm9pc2VfZGlmZiAlZFxuIiwgcnhfc3RhdHVzLnNpZ25hbCwKKwkJcnhfc3RhdHNfc2lnX2F2Zywgcnhfc3RhdHNfbm9pc2VfZGlmZik7CisKKwloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilJTF9SWF9EQVRBKHBrdCk7CisKKwluZXR3b3JrX3BhY2tldCA9IGlsMzk0NV9pc19uZXR3b3JrX3BhY2tldChpbCwgaGVhZGVyKTsKKworCURfU1RBVFMoIlslY10gJWQgUlNTSTolZCBTaWduYWw6JXUsIFJhdGU6JXVcbiIsCisJCW5ldHdvcmtfcGFja2V0ID8gJyonIDogJyAnLCBsZTE2X3RvX2NwdShyeF9oZHItPmNoYW5uZWwpLAorCQlyeF9zdGF0dXMuc2lnbmFsLCByeF9zdGF0dXMuc2lnbmFsLCByeF9zdGF0dXMucmF0ZV9pZHgpOworCisJaWxfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKGlsLCBsZTE2X3RvX2NwdShyeF9oZHItPmxlbiksIGhlYWRlcik7CisKKwlpZiAobmV0d29ya19wYWNrZXQpIHsKKwkJaWwtPl8zOTQ1Lmxhc3RfYmVhY29uX3RpbWUgPQorCQkgICAgbGUzMl90b19jcHUocnhfZW5kLT5iZWFjb25fdGltZXN0YW1wKTsKKwkJaWwtPl8zOTQ1Lmxhc3RfdHNmID0gbGU2NF90b19jcHUocnhfZW5kLT50aW1lc3RhbXApOworCQlpbC0+XzM5NDUubGFzdF9yeF9yc3NpID0gcnhfc3RhdHVzLnNpZ25hbDsKKwl9CisKKwlpbDM5NDVfcGFzc19wYWNrZXRfdG9fbWFjODAyMTEoaWwsIHJ4YiwgJnJ4X3N0YXR1cyk7Cit9CisKK2ludAoraWwzOTQ1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJCWRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwgdTggcmVzZXQsIHU4IHBhZCkKK3sKKwlpbnQgY291bnQ7CisJc3RydWN0IGlsX3F1ZXVlICpxOworCXN0cnVjdCBpbDM5NDVfdGZkICp0ZmQsICp0ZmRfdG1wOworCisJcSA9ICZ0eHEtPnE7CisJdGZkX3RtcCA9IChzdHJ1Y3QgaWwzOTQ1X3RmZCAqKXR4cS0+dGZkczsKKwl0ZmQgPSAmdGZkX3RtcFtxLT53cml0ZV9wdHJdOworCisJaWYgKHJlc2V0KQorCQltZW1zZXQodGZkLCAwLCBzaXplb2YoKnRmZCkpOworCisJY291bnQgPSBURkRfQ1RMX0NPVU5UX0dFVChsZTMyX3RvX2NwdSh0ZmQtPmNvbnRyb2xfZmxhZ3MpKTsKKworCWlmIChjb3VudCA+PSBOVU1fVEZEX0NIVU5LUyB8fCBjb3VudCA8IDApIHsKKwkJSUxfRVJSKCJFcnJvciBjYW4gbm90IHNlbmQgbW9yZSB0aGFuICVkIGNodW5rc1xuIiwKKwkJICAgICAgIE5VTV9URkRfQ0hVTktTKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdGZkLT50YnNbY291bnRdLmFkZHIgPSBjcHVfdG9fbGUzMihhZGRyKTsKKwl0ZmQtPnRic1tjb3VudF0ubGVuID0gY3B1X3RvX2xlMzIobGVuKTsKKworCWNvdW50Kys7CisKKwl0ZmQtPmNvbnRyb2xfZmxhZ3MgPQorCSAgICBjcHVfdG9fbGUzMihURkRfQ1RMX0NPVU5UX1NFVChjb3VudCkgfCBURkRfQ1RMX1BBRF9TRVQocGFkKSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDM5NDVfaHdfdHhxX2ZyZWVfdGZkIC0gRnJlZSBvbmUgVEZELCB0aG9zZSBhdCBpZHggW3R4cS0+cS5yZWFkX3B0cl0KKyAqCisgKiBEb2VzIE5PVCBhZHZhbmNlIGFueSBpZHhlcworICovCit2b2lkCitpbDM5NDVfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpCit7CisJc3RydWN0IGlsMzk0NV90ZmQgKnRmZF90bXAgPSAoc3RydWN0IGlsMzk0NV90ZmQgKil0eHEtPnRmZHM7CisJaW50IGlkeCA9IHR4cS0+cS5yZWFkX3B0cjsKKwlzdHJ1Y3QgaWwzOTQ1X3RmZCAqdGZkID0gJnRmZF90bXBbaWR4XTsKKwlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gaWwtPnBjaV9kZXY7CisJaW50IGk7CisJaW50IGNvdW50ZXI7CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwljb3VudGVyID0gVEZEX0NUTF9DT1VOVF9HRVQobGUzMl90b19jcHUodGZkLT5jb250cm9sX2ZsYWdzKSk7CisJaWYgKGNvdW50ZXIgPiBOVU1fVEZEX0NIVU5LUykgeworCQlJTF9FUlIoIlRvbyBtYW55IGNodW5rczogJWlcbiIsIGNvdW50ZXIpOworCQkvKiBAdG9kbyBpc3N1ZSBmYXRhbCBlcnJvciwgaXQgaXMgcXVpdGUgc2VyaW91cyBzaXR1YXRpb24gKi8KKwkJcmV0dXJuOworCX0KKworCS8qIFVubWFwIHR4X2NtZCAqLworCWlmIChjb3VudGVyKQorCQlwY2lfdW5tYXBfc2luZ2xlKGRldiwgZG1hX3VubWFwX2FkZHIoJnR4cS0+bWV0YVtpZHhdLCBtYXBwaW5nKSwKKwkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2lkeF0sIGxlbiksCisJCQkJIFBDSV9ETUFfVE9ERVZJQ0UpOworCisJLyogdW5tYXAgY2h1bmtzIGlmIGFueSAqLworCisJZm9yIChpID0gMTsgaSA8IGNvdW50ZXI7IGkrKykKKwkJcGNpX3VubWFwX3NpbmdsZShkZXYsIGxlMzJfdG9fY3B1KHRmZC0+dGJzW2ldLmFkZHIpLAorCQkJCSBsZTMyX3RvX2NwdSh0ZmQtPnRic1tpXS5sZW4pLAorCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsKKworCS8qIGZyZWUgU0tCICovCisJaWYgKHR4cS0+dHhiKSB7CisJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJc2tiID0gdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2I7CisKKwkJLyogY2FuIGJlIGNhbGxlZCBmcm9tIGlycXMtZGlzYWJsZWQgY29udGV4dCAqLworCQlpZiAoc2tiKSB7CisJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCQkJdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IgPSBOVUxMOworCQl9CisJfQorfQorCisvKioKKyAqIGlsMzk0NV9od19idWlsZF90eF9jbWRfcmF0ZSAtIEFkZCByYXRlIHBvcnRpb24gdG8gVFhfQ01EOgorICoKKyovCit2b2lkCitpbDM5NDVfaHdfYnVpbGRfdHhfY21kX3JhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBpbnQgc3RhX2lkKQoreworCXUxNiBod192YWx1ZSA9IGllZWU4MDIxMV9nZXRfdHhfcmF0ZShpbC0+aHcsIGluZm8pLT5od192YWx1ZTsKKwl1MTYgcmF0ZV9pZHggPSBtaW4oaHdfdmFsdWUgJiAweGZmZmYsIFJBVEVfQ09VTlRfMzk0NSAtIDEpOworCXUxNiByYXRlX21hc2s7CisJaW50IHJhdGU7CisJY29uc3QgdTggcnRzX3JldHJ5X2xpbWl0ID0gNzsKKwl1OCBkYXRhX3JldHJ5X2xpbWl0OworCV9fbGUzMiB0eF9mbGFnczsKKwlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7CisJc3RydWN0IGlsMzk0NV90eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCAqKWNtZC0+Y21kLnBheWxvYWQ7CisKKwlyYXRlID0gaWwzOTQ1X3JhdGVzW3JhdGVfaWR4XS5wbGNwOworCXR4X2ZsYWdzID0gdHhfY21kLT50eF9mbGFnczsKKworCS8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZ2V0IHRoZSBzdGEtPnN1cHBfcmF0ZXMgd2hpbGUKKwkgKiBpbiB0aGlzIHJ1bm5pbmcgY29udGV4dCAqLworCXJhdGVfbWFzayA9IFJBVEVTX01BU0tfMzk0NTsKKworCS8qIFNldCByZXRyeSBsaW1pdCBvbiBEQVRBIHBhY2tldHMgYW5kIFByb2JlIFJlc3BvbnNlcyAqLworCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpCisJCWRhdGFfcmV0cnlfbGltaXQgPSAzOworCWVsc2UKKwkJZGF0YV9yZXRyeV9saW1pdCA9IElMX0RFRkFVTFRfVFhfUkVUUlk7CisJdHhfY21kLT5kYXRhX3JldHJ5X2xpbWl0ID0gZGF0YV9yZXRyeV9saW1pdDsKKwkvKiBTZXQgcmV0cnkgbGltaXQgb24gUlRTIHBhY2tldHMgKi8KKwl0eF9jbWQtPnJ0c19yZXRyeV9saW1pdCA9IG1pbihkYXRhX3JldHJ5X2xpbWl0LCBydHNfcmV0cnlfbGltaXQpOworCisJdHhfY21kLT5yYXRlID0gcmF0ZTsKKwl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7CisKKwkvKiBPRkRNICovCisJdHhfY21kLT5zdXBwX3JhdGVzWzBdID0KKwkgICAgKChyYXRlX21hc2sgJiBJTF9PRkRNX1JBVEVTX01BU0spID4+IElMX0ZJUlNUX09GRE1fUkFURSkgJiAweEZGOworCisJLyogQ0NLICovCisJdHhfY21kLT5zdXBwX3JhdGVzWzFdID0gKHJhdGVfbWFzayAmIDB4Rik7CisKKwlEX1JBVEUoIlR4IHN0YSBpZDogJWQsIHJhdGU6ICVkIChwbGNwKSwgZmxhZ3M6IDB4JTRYICIKKwkgICAgICAgImNjay9vZmRtIG1hc2s6IDB4JXgvMHgleFxuIiwgc3RhX2lkLCB0eF9jbWQtPnJhdGUsCisJICAgICAgIGxlMzJfdG9fY3B1KHR4X2NtZC0+dHhfZmxhZ3MpLCB0eF9jbWQtPnN1cHBfcmF0ZXNbMV0sCisJICAgICAgIHR4X2NtZC0+c3VwcF9yYXRlc1swXSk7Cit9CisKK3N0YXRpYyB1OAoraWwzOTQ1X3N5bmNfc3RhKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHN0YV9pZCwgdTE2IHR4X3JhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOworCXN0cnVjdCBpbF9zdGF0aW9uX2VudHJ5ICpzdGF0aW9uOworCisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pCisJCXJldHVybiBJTF9JTlZBTElEX1NUQVRJT047CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlzdGF0aW9uID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdOworCisJc3RhdGlvbi0+c3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfVFhfUkFURV9NU0s7CisJc3RhdGlvbi0+c3RhLnJhdGVfbl9mbGFncyA9IGNwdV90b19sZTE2KHR4X3JhdGUpOworCXN0YXRpb24tPnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwlpbF9zZW5kX2FkZF9zdGEoaWwsICZzdGF0aW9uLT5zdGEsIENNRF9BU1lOQyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKworCURfUkFURSgiU0NBTEUgc3luYyBzdGF0aW9uICVkIHRvIHJhdGUgJWRcbiIsIHN0YV9pZCwgdHhfcmF0ZSk7CisJcmV0dXJuIHN0YV9pZDsKK30KKworc3RhdGljIHZvaWQKK2lsMzk0NV9zZXRfcHdyX3ZtYWluKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKy8qCisgKiAoZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMpCisgKiB0byBzZXQgcG93ZXIgdG8gVl9BVVgsIGRvCisKKwkJaWYgKHBjaV9wbWVfY2FwYWJsZShpbC0+cGNpX2RldiwgUENJX0QzY29sZCkpIHsKKwkJCWlsX3NldF9iaXRzX21hc2tfcHJwaChpbCwgQVBNR19QU19DVFJMX1JFRywKKwkJCQkJQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZBVVgsCisJCQkJCX5BUE1HX1BTX0NUUkxfTVNLX1BXUl9TUkMpOworCisJCQlfaWxfcG9sbF9iaXQoaWwsIENTUl9HUElPX0lOLAorCQkJCSAgICAgQ1NSX0dQSU9fSU5fVkFMX1ZBVVhfUFdSX1NSQywKKwkJCQkgICAgIENTUl9HUElPX0lOX0JJVF9BVVhfUE9XRVIsIDUwMDApOworCQl9CisgKi8KKworCWlsX3NldF9iaXRzX21hc2tfcHJwaChpbCwgQVBNR19QU19DVFJMX1JFRywKKwkJCSAgICAgIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WTUFJTiwKKwkJCSAgICAgIH5BUE1HX1BTX0NUUkxfTVNLX1BXUl9TUkMpOworCisJX2lsX3BvbGxfYml0KGlsLCBDU1JfR1BJT19JTiwgQ1NSX0dQSU9fSU5fVkFMX1ZNQUlOX1BXUl9TUkMsCisJCSAgICAgQ1NSX0dQSU9fSU5fQklUX0FVWF9QT1dFUiwgNTAwMCk7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9yeF9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpCit7CisJaWxfd3IoaWwsIEZIMzlfUkNTUl9SQkRfQkFTRSgwKSwgcnhxLT5iZF9kbWEpOworCWlsX3dyKGlsLCBGSDM5X1JDU1JfUlBUUl9BRERSKDApLCByeHEtPnJiX3N0dHNfZG1hKTsKKwlpbF93cihpbCwgRkgzOV9SQ1NSX1dQVFIoMCksIDApOworCWlsX3dyKGlsLCBGSDM5X1JDU1JfQ09ORklHKDApLAorCSAgICAgIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTl9FTkFCTEUgfAorCSAgICAgIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SRFJCRF9FTl9FTkFCTEUgfAorCSAgICAgIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX0JJVF9XUl9TVFRTX0VOIHwKKwkgICAgICBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjggfCAoUlhfUVVFVUVfU0laRV9MT0cKKwkJCQkJCQkgICAgICAgPDwKKwkJCQkJCQkgICAgICAgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfUE9TX1JCRENfU0laRSkKKwkgICAgICB8IEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9JUlFfREVTVF9JTlRfSE9TVCB8ICgxIDw8CisJCQkJCQkJCSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfSVJRX1JCVEgpCisJICAgICAgfCBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfRkgpOworCisJLyogZmFrZSByZWFkIHRvIGZsdXNoIGFsbCBwcmV2IEkvTyAqLworCWlsX3JkKGlsLCBGSDM5X1JTU1JfQ1RSTCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X3R4X3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKworCS8qIGJ5cGFzcyBtb2RlICovCisJaWxfd3JfcHJwaChpbCwgQUxNX1NDRF9NT0RFX1JFRywgMHgyKTsKKworCS8qIFJBIDAgaXMgYWN0aXZlICovCisJaWxfd3JfcHJwaChpbCwgQUxNX1NDRF9BUkFTVEFUX1JFRywgMHgwMSk7CisKKwkvKiBhbGwgNiBmaWZvIGFyZSBhY3RpdmUgKi8KKwlpbF93cl9wcnBoKGlsLCBBTE1fU0NEX1RYRkFDVF9SRUcsIDB4M2YpOworCisJaWxfd3JfcHJwaChpbCwgQUxNX1NDRF9TQllQX01PREVfMV9SRUcsIDB4MDEwMDAwKTsKKwlpbF93cl9wcnBoKGlsLCBBTE1fU0NEX1NCWVBfTU9ERV8yX1JFRywgMHgwMzAwMDIpOworCWlsX3dyX3BycGgoaWwsIEFMTV9TQ0RfVFhGNE1GX1JFRywgMHgwMDAwMDQpOworCWlsX3dyX3BycGgoaWwsIEFMTV9TQ0RfVFhGNU1GX1JFRywgMHgwMDAwMDUpOworCisJaWxfd3IoaWwsIEZIMzlfVFNTUl9DQkJfQkFTRSwgaWwtPl8zOTQ1LnNoYXJlZF9waHlzKTsKKworCWlsX3dyKGlsLCBGSDM5X1RTU1JfTVNHX0NPTkZJRywKKwkgICAgICBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX1NOT09QX1JEX1RYUERfT04gfAorCSAgICAgIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfT1JERVJfUkRfVFhQRF9PTiB8CisJICAgICAgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9NQVhfRlJBR19TSVpFXzEyOEIgfAorCSAgICAgIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfU05PT1BfUkRfVEZEX09OIHwKKwkgICAgICBGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX09SREVSX1JEX0NCQl9PTiB8CisJICAgICAgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SU1BfV0FJVF9USCB8CisJICAgICAgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9SU1BfV0FJVF9USCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDM5NDVfdHhxX2N0eF9yZXNldCAtIFJlc2V0IFRYIHF1ZXVlIGNvbnRleHQKKyAqCisgKiBEZXN0cm95cyBhbGwgRE1BIHN0cnVjdHVyZXMgYW5kIGluaXRpYWxpemUgdGhlbSBhZ2FpbgorICovCitzdGF0aWMgaW50CitpbDM5NDVfdHhxX2N0eF9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJjOworCWludCB0eHFfaWQsIHNsb3RzX251bTsKKworCWlsMzk0NV9od190eHFfY3R4X2ZyZWUoaWwpOworCisJLyogYWxsb2NhdGUgdHggcXVldWUgc3RydWN0dXJlICovCisJcmMgPSBpbF9hbGxvY190eHFfbWVtKGlsKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCS8qIFR4IENNRCBxdWV1ZSAqLworCXJjID0gaWwzOTQ1X3R4X3Jlc2V0KGlsKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyb3I7CisKKwkvKiBUeCBxdWV1ZShzKSAqLworCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspIHsKKwkJc2xvdHNfbnVtID0KKwkJICAgICh0eHFfaWQgPT0KKwkJICAgICBJTDM5X0NNRF9RVUVVRV9OVU0pID8gVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7CisJCXJjID0gaWxfdHhfcXVldWVfaW5pdChpbCwgJmlsLT50eHFbdHhxX2lkXSwgc2xvdHNfbnVtLCB0eHFfaWQpOworCQlpZiAocmMpIHsKKwkJCUlMX0VSUigiVHggJWQgcXVldWUgaW5pdCBmYWlsZWRcbiIsIHR4cV9pZCk7CisJCQlnb3RvIGVycm9yOworCQl9CisJfQorCisJcmV0dXJuIHJjOworCitlcnJvcjoKKwlpbDM5NDVfaHdfdHhxX2N0eF9mcmVlKGlsKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBTdGFydCB1cCAzOTQ1J3MgYmFzaWMgZnVuY3Rpb25hbGl0eSBhZnRlciBpdCBoYXMgYmVlbiByZXNldAorICogKGUuZy4gYWZ0ZXIgcGxhdGZvcm0gYm9vdCwgb3Igc2h1dGRvd24gdmlhIGlsX2FwbV9zdG9wKCkpCisgKiBOT1RFOiAgVGhpcyBkb2VzIG5vdCBsb2FkIHVDb2RlIG5vciBzdGFydCB0aGUgZW1iZWRkZWQgcHJvY2Vzc29yCisgKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9hcG1faW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldCA9IGlsX2FwbV9pbml0KGlsKTsKKworCS8qIENsZWFyIEFQTUcgKE5JQydzIGludGVybmFsIHBvd2VyIG1hbmFnZW1lbnQpIGludGVycnVwdHMgKi8KKwlpbF93cl9wcnBoKGlsLCBBUE1HX1JUQ19JTlRfTVNLX1JFRywgMHgwKTsKKwlpbF93cl9wcnBoKGlsLCBBUE1HX1JUQ19JTlRfU1RUX1JFRywgMHhGRkZGRkZGRik7CisKKwkvKiBSZXNldCByYWRpbyBjaGlwICovCisJaWxfc2V0X2JpdHNfcHJwaChpbCwgQVBNR19QU19DVFJMX1JFRywgQVBNR19QU19DVFJMX1ZBTF9SRVNFVF9SRVEpOworCXVkZWxheSg1KTsKKwlpbF9jbGVhcl9iaXRzX3BycGgoaWwsIEFQTUdfUFNfQ1RSTF9SRUcsIEFQTUdfUFNfQ1RSTF9WQUxfUkVTRVRfUkVRKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfbmljX2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqKWlsLT5lZXByb207CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCByZXZfaWQgPSBpbC0+cGNpX2Rldi0+cmV2aXNpb247CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIERldGVybWluZSBIVyB0eXBlICovCisJRF9JTkZPKCJIVyBSZXZpc2lvbiBJRCA9IDB4JVhcbiIsIHJldl9pZCk7CisKKwlpZiAocmV2X2lkICYgUENJX0NGR19SRVZfSURfQklUX1JUUCkKKwkJRF9JTkZPKCJSVFAgdHlwZVxuIik7CisJZWxzZSBpZiAocmV2X2lkICYgUENJX0NGR19SRVZfSURfQklUX0JBU0lDX1NLVSkgeworCQlEX0lORk8oIjM5NDUgUkFESU8tTUIgdHlwZVxuIik7CisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfMzk0NV9NQik7CisJfSBlbHNlIHsKKwkJRF9JTkZPKCIzOTQ1IFJBRElPLU1NIHR5cGVcbiIpOworCQlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUXzM5NDVfTU0pOworCX0KKworCWlmIChFRVBST01fU0tVX0NBUF9PUF9NT0RFX01SQyA9PSBlZXByb20tPnNrdV9jYXApIHsKKwkJRF9JTkZPKCJTS1UgT1AgbW9kZSBpcyBtcmNcbiIpOworCQlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUX1NLVV9NUkMpOworCX0gZWxzZQorCQlEX0lORk8oIlNLVSBPUCBtb2RlIGlzIGJhc2ljXG4iKTsKKworCWlmICgoZWVwcm9tLT5ib2FyZF9yZXZpc2lvbiAmIDB4RjApID09IDB4RDApIHsKKwkJRF9JTkZPKCIzOTQ1QUJHIHJldmlzaW9uIGlzIDB4JVhcbiIsIGVlcHJvbS0+Ym9hcmRfcmV2aXNpb24pOworCQlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUX0JPQVJEX1RZUEUpOworCX0gZWxzZSB7CisJCURfSU5GTygiMzk0NUFCRyByZXZpc2lvbiBpcyAweCVYXG4iLCBlZXByb20tPmJvYXJkX3JldmlzaW9uKTsKKwkJaWxfY2xlYXJfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSAgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfQk9BUkRfVFlQRSk7CisJfQorCisJaWYgKGVlcHJvbS0+YWxtZ29yX21fdmVyc2lvbiA8PSAxKSB7CisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9BKTsKKwkJRF9JTkZPKCJDYXJkIE0gdHlwZSBBIHZlcnNpb24gaXMgMHglWFxuIiwKKwkJICAgICAgIGVlcHJvbS0+YWxtZ29yX21fdmVyc2lvbik7CisJfSBlbHNlIHsKKwkJRF9JTkZPKCJDYXJkIE0gdHlwZSBCIHZlcnNpb24gaXMgMHglWFxuIiwKKwkJICAgICAgIGVlcHJvbS0+YWxtZ29yX21fdmVyc2lvbik7CisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9CKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlmIChlZXByb20tPnNrdV9jYXAgJiBFRVBST01fU0tVX0NBUF9TV19SRl9LSUxMX0VOQUJMRSkKKwkJRF9SRl9LSUxMKCJTVyBSRiBLSUxMIHN1cHBvcnRlZCBpbiBFRVBST00uXG4iKTsKKworCWlmIChlZXByb20tPnNrdV9jYXAgJiBFRVBST01fU0tVX0NBUF9IV19SRl9LSUxMX0VOQUJMRSkKKwkJRF9SRl9LSUxMKCJIVyBSRiBLSUxMIHN1cHBvcnRlZCBpbiBFRVBST00uXG4iKTsKK30KKworaW50CitpbDM5NDVfaHdfbmljX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWwzOTQ1X3NldF9wd3Jfdm1haW4oaWwpOworCisJaWwtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuY29uZmlnKGlsKTsKKworCS8qIEFsbG9jYXRlIHRoZSBSWCBxdWV1ZSwgb3IgcmVzZXQgaWYgaXQgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwlpZiAoIXJ4cS0+YmQpIHsKKwkJcmMgPSBpbF9yeF9xdWV1ZV9hbGxvYyhpbCk7CisJCWlmIChyYykgeworCQkJSUxfRVJSKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBSeCBxdWV1ZVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0gZWxzZQorCQlpbDM5NDVfcnhfcXVldWVfcmVzZXQoaWwsIHJ4cSk7CisKKwlpbDM5NDVfcnhfcmVwbGVuaXNoKGlsKTsKKworCWlsMzk0NV9yeF9pbml0KGlsLCByeHEpOworCisJLyogTG9vayBhdCB1c2luZyB0aGlzIGluc3RlYWQ6CisJICAgcnhxLT5uZWVkX3VwZGF0ZSA9IDE7CisJICAgaWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihpbCwgcnhxKTsKKwkgKi8KKworCWlsX3dyKGlsLCBGSDM5X1JDU1JfV1BUUigwKSwgcnhxLT53cml0ZSAmIH43KTsKKworCXJjID0gaWwzOTQ1X3R4cV9jdHhfcmVzZXQoaWwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJc2V0X2JpdChTX0lOSVQsICZpbC0+c3RhdHVzKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsMzk0NV9od190eHFfY3R4X2ZyZWUgLSBGcmVlIFRYUSBDb250ZXh0CisgKgorICogRGVzdHJveSBhbGwgVFggRE1BIHF1ZXVlcyBhbmQgc3RydWN0dXJlcworICovCit2b2lkCitpbDM5NDVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgdHhxX2lkOworCisJLyogVHggcXVldWVzICovCisJaWYgKGlsLT50eHEpCisJCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspCisJCQlpZiAodHhxX2lkID09IElMMzlfQ01EX1FVRVVFX05VTSkKKwkJCQlpbF9jbWRfcXVldWVfZnJlZShpbCk7CisJCQllbHNlCisJCQkJaWxfdHhfcXVldWVfZnJlZShpbCwgdHhxX2lkKTsKKworCS8qIGZyZWUgdHggcXVldWUgc3RydWN0dXJlICovCisJaWxfdHhxX21lbShpbCk7Cit9CisKK3ZvaWQKK2lsMzk0NV9od190eHFfY3R4X3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCB0eHFfaWQ7CisKKwkvKiBzdG9wIFNDRCAqLworCWlsX3dyX3BycGgoaWwsIEFMTV9TQ0RfTU9ERV9SRUcsIDApOworCWlsX3dyX3BycGgoaWwsIEFMTV9TQ0RfVFhGQUNUX1JFRywgMCk7CisKKwkvKiByZXNldCBURkQgcXVldWVzICovCisJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykgeworCQlpbF93cihpbCwgRkgzOV9UQ1NSX0NPTkZJRyh0eHFfaWQpLCAweDApOworCQlpbF9wb2xsX2JpdChpbCwgRkgzOV9UU1NSX1RYX1NUQVRVUywKKwkJCSAgICBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKHR4cV9pZCksCisJCQkgICAgMTAwMCk7CisJfQorCisJaWwzOTQ1X2h3X3R4cV9jdHhfZnJlZShpbCk7Cit9CisKKy8qKgorICogaWwzOTQ1X2h3X3JlZ19hZGp1c3RfcG93ZXJfYnlfdGVtcAorICogcmV0dXJuIGlkeCBkZWx0YSBpbnRvIHBvd2VyIGdhaW4gc2V0dGluZ3MgdGFibGUKKyovCitzdGF0aWMgaW50CitpbDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wKGludCBuZXdfcmVhZGluZywgaW50IG9sZF9yZWFkaW5nKQoreworCXJldHVybiAobmV3X3JlYWRpbmcgLSBvbGRfcmVhZGluZykgKiAoLTExKSAvIDEwMDsKK30KKworLyoqCisgKiBpbDM5NDVfaHdfcmVnX3RlbXBfb3V0X29mX3JhbmdlIC0gS2VlcCB0ZW1wZXJhdHVyZSBpbiBzYW5lIHJhbmdlCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CitpbDM5NDVfaHdfcmVnX3RlbXBfb3V0X29mX3JhbmdlKGludCB0ZW1wZXJhdHVyZSkKK3sKKwlyZXR1cm4gKHRlbXBlcmF0dXJlIDwgLTI2MCB8fCB0ZW1wZXJhdHVyZSA+IDI1KSA/IDEgOiAwOworfQorCitpbnQKK2lsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiBfaWxfcmQoaWwsIENTUl9VQ09ERV9EUlZfR1AyKTsKK30KKworLyoqCisgKiBpbDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlCisgKiBnZXQgdGhlIGN1cnJlbnQgdGVtcGVyYXR1cmUgYnkgcmVhZGluZyBmcm9tIE5JQworKi8KK3N0YXRpYyBpbnQKK2lsMzk0NV9od19yZWdfdHhwb3dlcl9nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGlsMzk0NV9lZXByb20gKilpbC0+ZWVwcm9tOworCWludCB0ZW1wZXJhdHVyZTsKKworCXRlbXBlcmF0dXJlID0gaWwzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShpbCk7CisKKwkvKiBkcml2ZXIncyBva2F5IHJhbmdlIGlzIC0yNjAgdG8gKzI1LgorCSAqICAgaHVtYW4gcmVhZGFibGUgb2theSByYW5nZSBpcyAwIHRvICsyODUgKi8KKwlEX0lORk8oIlRlbXBlcmF0dXJlOiAlZFxuIiwgdGVtcGVyYXR1cmUgKyBJTF9URU1QX0NPTlZFUlQpOworCisJLyogaGFuZGxlIGluc2FuZSB0ZW1wIHJlYWRpbmcgKi8KKwlpZiAoaWwzOTQ1X2h3X3JlZ190ZW1wX291dF9vZl9yYW5nZSh0ZW1wZXJhdHVyZSkpIHsKKwkJSUxfRVJSKCJFcnJvciBiYWQgdGVtcGVyYXR1cmUgdmFsdWUgICVkXG4iLCB0ZW1wZXJhdHVyZSk7CisKKwkJLyogaWYgcmVhbGx5IHJlYWxseSBob3QoPyksCisJCSAqICAgc3Vic3RpdHV0ZSB0aGUgM3JkIGJhbmQvZ3JvdXAncyB0ZW1wIG1lYXN1cmVkIGF0IGZhY3RvcnkgKi8KKwkJaWYgKGlsLT5sYXN0X3RlbXBlcmF0dXJlID4gMTAwKQorCQkJdGVtcGVyYXR1cmUgPSBlZXByb20tPmdyb3Vwc1syXS50ZW1wZXJhdHVyZTsKKwkJZWxzZQkJLyogZWxzZSB1c2UgbW9zdCByZWNlbnQgInNhbmUiIHZhbHVlIGZyb20gZHJpdmVyICovCisJCQl0ZW1wZXJhdHVyZSA9IGlsLT5sYXN0X3RlbXBlcmF0dXJlOworCX0KKworCXJldHVybiB0ZW1wZXJhdHVyZTsJLyogcmF3LCBub3QgImh1bWFuIHJlYWRhYmxlIiAqLworfQorCisvKiBBZGp1c3QgVHhwb3dlciBvbmx5IGlmIHRlbXBlcmF0dXJlIHZhcmlhbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQuCisgKgorICogQm90aCBhcmUgbG93ZXIgdGhhbiBvbGRlciB2ZXJzaW9ucycgOSBkZWdyZWVzICovCisjZGVmaW5lIElMX1RFTVBFUkFUVVJFX0xJTUlUX1RJTUVSICAgNgorCisvKioKKyAqIGlsMzk0NV9pc190ZW1wX2NhbGliX25lZWRlZCAtIGRldGVybWluZXMgaWYgbmV3IGNhbGlicmF0aW9uIGlzIG5lZWRlZAorICoKKyAqIHJlY29yZHMgbmV3IHRlbXBlcmF0dXJlIGluIHR4X21nci0+dGVtcGVyYXR1cmUuCisgKiByZXBsYWNlcyB0eF9tZ3ItPmxhc3RfdGVtcGVyYXR1cmUgKm9ubHkqIGlmIGNhbGliIG5lZWRlZAorICogICAgKGFzc3VtZXMgY2FsbGVyIHdpbGwgYWN0dWFsbHkgZG8gdGhlIGNhbGlicmF0aW9uISkuICovCitzdGF0aWMgaW50CitpbDM5NDVfaXNfdGVtcF9jYWxpYl9uZWVkZWQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCB0ZW1wX2RpZmY7CisKKwlpbC0+dGVtcGVyYXR1cmUgPSBpbDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlKGlsKTsKKwl0ZW1wX2RpZmYgPSBpbC0+dGVtcGVyYXR1cmUgLSBpbC0+bGFzdF90ZW1wZXJhdHVyZTsKKworCS8qIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLworCWlmICh0ZW1wX2RpZmYgPCAwKSB7CisJCURfUE9XRVIoIkdldHRpbmcgY29vbGVyLCBkZWx0YSAlZCxcbiIsIHRlbXBfZGlmZik7CisJCXRlbXBfZGlmZiA9IC10ZW1wX2RpZmY7CisJfSBlbHNlIGlmICh0ZW1wX2RpZmYgPT0gMCkKKwkJRF9QT1dFUigiU2FtZSB0ZW1wLFxuIik7CisJZWxzZQorCQlEX1BPV0VSKCJHZXR0aW5nIHdhcm1lciwgZGVsdGEgJWQsXG4iLCB0ZW1wX2RpZmYpOworCisJLyogaWYgd2UgZG9uJ3QgbmVlZCBjYWxpYnJhdGlvbiwgKmRvbid0KiB1cGRhdGUgbGFzdF90ZW1wZXJhdHVyZSAqLworCWlmICh0ZW1wX2RpZmYgPCBJTF9URU1QRVJBVFVSRV9MSU1JVF9USU1FUikgeworCQlEX1BPV0VSKCJUaW1lZCB0aGVybWFsIGNhbGliIG5vdCBuZWVkZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEX1BPV0VSKCJUaW1lZCB0aGVybWFsIGNhbGliIG5lZWRlZFxuIik7CisKKwkvKiBhc3N1bWUgdGhhdCBjYWxsZXIgd2lsbCBhY3R1YWxseSBkbyBjYWxpYiAuLi4KKwkgKiAgIHVwZGF0ZSB0aGUgImxhc3QgdGVtcGVyYXR1cmUiIHZhbHVlICovCisJaWwtPmxhc3RfdGVtcGVyYXR1cmUgPSBpbC0+dGVtcGVyYXR1cmU7CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgSUxfTUFYX0dBSU5fRU5UUklFUyA3OAorI2RlZmluZSBJTF9DQ0tfRlJPTV9PRkRNX1BPV0VSX0RJRkYgIC01CisjZGVmaW5lIElMX0NDS19GUk9NX09GRE1fSURYX0RJRkYgKDEwKQorCisvKiByYWRpbyBhbmQgRFNQIHBvd2VyIHRhYmxlLCBlYWNoIHN0ZXAgaXMgMS8yIGRCLgorICogMXN0IG51bWJlciBpcyBmb3IgUkYgYW5hbG9nIGdhaW4sIDJuZCBudW1iZXIgaXMgZm9yIERTUCBwcmUtREFDIGdhaW4uICovCitzdGF0aWMgc3RydWN0IGlsMzk0NV90eF9wb3dlciBwb3dlcl9nYWluX3RhYmxlWzJdW0lMX01BWF9HQUlOX0VOVFJJRVNdID0geworCXsKKwkgezI1MSwgMTI3fSwJCS8qIDIuNCBHSHosIGhpZ2hlc3QgcG93ZXIgKi8KKwkgezI1MSwgMTI3fSwKKwkgezI1MSwgMTI3fSwKKwkgezI1MSwgMTI3fSwKKwkgezI1MSwgMTI1fSwKKwkgezI1MSwgMTEwfSwKKwkgezI1MSwgMTA1fSwKKwkgezI1MSwgOTh9LAorCSB7MTg3LCAxMjV9LAorCSB7MTg3LCAxMTV9LAorCSB7MTg3LCAxMDh9LAorCSB7MTg3LCA5OX0sCisJIHsyNDMsIDExOX0sCisJIHsyNDMsIDExMX0sCisJIHsyNDMsIDEwNX0sCisJIHsyNDMsIDk3fSwKKwkgezI0MywgOTJ9LAorCSB7MjExLCAxMDZ9LAorCSB7MjExLCAxMDB9LAorCSB7MTc5LCAxMjB9LAorCSB7MTc5LCAxMTN9LAorCSB7MTc5LCAxMDd9LAorCSB7MTQ3LCAxMjV9LAorCSB7MTQ3LCAxMTl9LAorCSB7MTQ3LCAxMTJ9LAorCSB7MTQ3LCAxMDZ9LAorCSB7MTQ3LCAxMDF9LAorCSB7MTQ3LCA5N30sCisJIHsxNDcsIDkxfSwKKwkgezExNSwgMTA3fSwKKwkgezIzNSwgMTIxfSwKKwkgezIzNSwgMTE1fSwKKwkgezIzNSwgMTA5fSwKKwkgezIwMywgMTI3fSwKKwkgezIwMywgMTIxfSwKKwkgezIwMywgMTE1fSwKKwkgezIwMywgMTA4fSwKKwkgezIwMywgMTAyfSwKKwkgezIwMywgOTZ9LAorCSB7MjAzLCA5Mn0sCisJIHsxNzEsIDExMH0sCisJIHsxNzEsIDEwNH0sCisJIHsxNzEsIDk4fSwKKwkgezEzOSwgMTE2fSwKKwkgezIyNywgMTI1fSwKKwkgezIyNywgMTE5fSwKKwkgezIyNywgMTEzfSwKKwkgezIyNywgMTA3fSwKKwkgezIyNywgMTAxfSwKKwkgezIyNywgOTZ9LAorCSB7MTk1LCAxMTN9LAorCSB7MTk1LCAxMDZ9LAorCSB7MTk1LCAxMDJ9LAorCSB7MTk1LCA5NX0sCisJIHsxNjMsIDExM30sCisJIHsxNjMsIDEwNn0sCisJIHsxNjMsIDEwMn0sCisJIHsxNjMsIDk1fSwKKwkgezEzMSwgMTEzfSwKKwkgezEzMSwgMTA2fSwKKwkgezEzMSwgMTAyfSwKKwkgezEzMSwgOTV9LAorCSB7OTksIDExM30sCisJIHs5OSwgMTA2fSwKKwkgezk5LCAxMDJ9LAorCSB7OTksIDk1fSwKKwkgezY3LCAxMTN9LAorCSB7NjcsIDEwNn0sCisJIHs2NywgMTAyfSwKKwkgezY3LCA5NX0sCisJIHszNSwgMTEzfSwKKwkgezM1LCAxMDZ9LAorCSB7MzUsIDEwMn0sCisJIHszNSwgOTV9LAorCSB7MywgMTEzfSwKKwkgezMsIDEwNn0sCisJIHszLCAxMDJ9LAorCSB7MywgOTV9CQkvKiAyLjQgR0h6LCBsb3dlc3QgcG93ZXIgKi8KKwl9LAorCXsKKwkgezI1MSwgMTI3fSwJCS8qIDUueCBHSHosIGhpZ2hlc3QgcG93ZXIgKi8KKwkgezI1MSwgMTIwfSwKKwkgezI1MSwgMTE0fSwKKwkgezIxOSwgMTE5fSwKKwkgezIxOSwgMTAxfSwKKwkgezE4NywgMTEzfSwKKwkgezE4NywgMTAyfSwKKwkgezE1NSwgMTE0fSwKKwkgezE1NSwgMTAzfSwKKwkgezEyMywgMTE3fSwKKwkgezEyMywgMTA3fSwKKwkgezEyMywgOTl9LAorCSB7MTIzLCA5Mn0sCisJIHs5MSwgMTA4fSwKKwkgezU5LCAxMjV9LAorCSB7NTksIDExOH0sCisJIHs1OSwgMTA5fSwKKwkgezU5LCAxMDJ9LAorCSB7NTksIDk2fSwKKwkgezU5LCA5MH0sCisJIHsyNywgMTA0fSwKKwkgezI3LCA5OH0sCisJIHsyNywgOTJ9LAorCSB7MTE1LCAxMTh9LAorCSB7MTE1LCAxMTF9LAorCSB7MTE1LCAxMDR9LAorCSB7ODMsIDEyNn0sCisJIHs4MywgMTIxfSwKKwkgezgzLCAxMTN9LAorCSB7ODMsIDEwNX0sCisJIHs4MywgOTl9LAorCSB7NTEsIDExOH0sCisJIHs1MSwgMTExfSwKKwkgezUxLCAxMDR9LAorCSB7NTEsIDk4fSwKKwkgezE5LCAxMTZ9LAorCSB7MTksIDEwOX0sCisJIHsxOSwgMTAyfSwKKwkgezE5LCA5OH0sCisJIHsxOSwgOTN9LAorCSB7MTcxLCAxMTN9LAorCSB7MTcxLCAxMDd9LAorCSB7MTcxLCA5OX0sCisJIHsxMzksIDEyMH0sCisJIHsxMzksIDExM30sCisJIHsxMzksIDEwN30sCisJIHsxMzksIDk5fSwKKwkgezEwNywgMTIwfSwKKwkgezEwNywgMTEzfSwKKwkgezEwNywgMTA3fSwKKwkgezEwNywgOTl9LAorCSB7NzUsIDEyMH0sCisJIHs3NSwgMTEzfSwKKwkgezc1LCAxMDd9LAorCSB7NzUsIDk5fSwKKwkgezQzLCAxMjB9LAorCSB7NDMsIDExM30sCisJIHs0MywgMTA3fSwKKwkgezQzLCA5OX0sCisJIHsxMSwgMTIwfSwKKwkgezExLCAxMTN9LAorCSB7MTEsIDEwN30sCisJIHsxMSwgOTl9LAorCSB7MTMxLCAxMDd9LAorCSB7MTMxLCA5OX0sCisJIHs5OSwgMTIwfSwKKwkgezk5LCAxMTN9LAorCSB7OTksIDEwN30sCisJIHs5OSwgOTl9LAorCSB7NjcsIDEyMH0sCisJIHs2NywgMTEzfSwKKwkgezY3LCAxMDd9LAorCSB7NjcsIDk5fSwKKwkgezM1LCAxMjB9LAorCSB7MzUsIDExM30sCisJIHszNSwgMTA3fSwKKwkgezM1LCA5OX0sCisJIHszLCAxMjB9CQkvKiA1LnggR0h6LCBsb3dlc3QgcG93ZXIgKi8KKwl9Cit9OworCitzdGF0aWMgaW5saW5lIHU4CitpbDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pZHgoaW50IGlkeCkKK3sKKwlpZiAoaWR4IDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKGlkeCA+PSBJTF9NQVhfR0FJTl9FTlRSSUVTKQorCQlyZXR1cm4gSUxfTUFYX0dBSU5fRU5UUklFUyAtIDE7CisJcmV0dXJuICh1OCkgaWR4OworfQorCisvKiBLaWNrIG9mZiB0aGVybWFsIHJlY2FsaWJyYXRpb24gY2hlY2sgZXZlcnkgNjAgc2Vjb25kcyAqLworI2RlZmluZSBSRUdfUkVDQUxJQl9QRVJJT0QgKDYwKQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfc2V0X3NjYW5fcG93ZXIgLSBTZXQgVHggcG93ZXIgZm9yIHNjYW4gcHJvYmUgcmVxdWVzdHMKKyAqCisgKiBTZXQgKGluIG91ciBjaGFubmVsIGluZm8gZGF0YWJhc2UpIHRoZSBkaXJlY3Qgc2NhbiBUeCBwb3dlciBmb3IgMSBNYml0IChDQ0spCisgKiBvciA2IE1iaXQgKE9GRE0pIHJhdGVzLgorICovCitzdGF0aWMgdm9pZAoraWwzOTQ1X2h3X3JlZ19zZXRfc2Nhbl9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBzY2FuX3RibF9pZHgsIHMzMiByYXRlX2lkeCwKKwkJCSAgICAgY29uc3QgczggKmNsaXBfcHdycywKKwkJCSAgICAgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbywgaW50IGJhbmRfaWR4KQoreworCXN0cnVjdCBpbDM5NDVfc2Nhbl9wb3dlcl9pbmZvICpzY2FuX3Bvd2VyX2luZm87CisJczggcG93ZXI7CisJdTggcG93ZXJfaWR4OworCisJc2Nhbl9wb3dlcl9pbmZvID0gJmNoX2luZm8tPnNjYW5fcHdyX2luZm9bc2Nhbl90YmxfaWR4XTsKKworCS8qIHVzZSB0aGlzIGNoYW5uZWwgZ3JvdXAncyA2TWJpdCBjbGlwcGluZy9zYXR1cmF0aW9uIHB3ciwKKwkgKiAgIGJ1dCBjYXAgYXQgcmVndWxhdG9yeSBzY2FuIHBvd2VyIHJlc3RyaWN0aW9uIChzZXQgZHVyaW5nIGluaXQKKwkgKiAgIGJhc2VkIG9uIGVlcHJvbSBjaGFubmVsIGRhdGEpIGZvciB0aGlzIGNoYW5uZWwuICAqLworCXBvd2VyID0gbWluKGNoX2luZm8tPnNjYW5fcG93ZXIsIGNsaXBfcHdyc1tSQVRFXzZNX0lEWF9UQkxdKTsKKworCXBvd2VyID0gbWluKHBvd2VyLCBpbC0+dHhfcG93ZXJfdXNlcl9sbXQpOworCXNjYW5fcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcG93ZXI7CisKKwkvKiBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBuZXcgc2NhbiAqcG93ZXIqIGFuZCBjdXJyZW50ICJub3JtYWwiCisJICogICBUeCAqcG93ZXIqIGZvciA2TWIuICBVc2UgdGhpcyBkaWZmZXJlbmNlICh4MikgdG8gYWRqdXN0IHRoZQorCSAqICAgY3VycmVudCAibm9ybWFsIiB0ZW1wZXJhdHVyZS1jb21wZW5zYXRlZCBUeCBwb3dlciAqaWR4KiBmb3IKKwkgKiAgIHRoaXMgcmF0ZSAoMU1iIG9yIDZNYikgdG8geWllbGQgbmV3IHRlbXAtY29tcGVuc2F0ZWQgc2NhbiBwb3dlcgorCSAqICAgKmlkeCouICovCisJcG93ZXJfaWR4ID0KKwkgICAgY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2lkeF0ucG93ZXJfdGFibGVfaWR4IC0gKHBvd2VyIC0KKwkJCQkJCQkgICAgIGNoX2luZm8tPgorCQkJCQkJCSAgICAgcG93ZXJfaW5mbworCQkJCQkJCSAgICAgW1JBVEVfNk1fSURYX1RCTF0uCisJCQkJCQkJICAgICByZXF1ZXN0ZWRfcG93ZXIpICoKKwkgICAgMjsKKworCS8qIHN0b3JlIHJlZmVyZW5jZSBpZHggdGhhdCB3ZSB1c2Ugd2hlbiBhZGp1c3RpbmcgKmFsbCogc2NhbgorCSAqICAgcG93ZXJzLiAgU28gd2UgY2FuIGFjY29tbW9kYXRlIHVzZXIgKGFsbCBjaGFubmVsKSBvciBzcGVjdHJ1bQorCSAqICAgbWFuYWdlbWVudCAoc2luZ2xlIGNoYW5uZWwpIHBvd2VyIGNoYW5nZXMgImJldHdlZW4iIHRlbXBlcmF0dXJlCisJICogICBmZWVkYmFjayBjb21wZW5zYXRpb24gcHJvY2VkdXJlcy4KKwkgKiBkb24ndCBmb3JjZSBmaXQgdGhpcyByZWZlcmVuY2UgaWR4IGludG8gZ2FpbiB0YWJsZTsgaXQgbWF5IGJlIGEKKwkgKiAgIG5lZ2F0aXZlIG51bWJlci4gIFRoaXMgd2lsbCBoZWxwIGF2b2lkIGVycm9ycyB3aGVuIHdlJ3JlIGF0CisJICogICB0aGUgbG93ZXIgYm91bmRzIChoaWdoZXN0IGdhaW5zLCBmb3Igd2FybWVzdCB0ZW1wZXJhdHVyZXMpCisJICogICBvZiB0aGUgdGFibGUuICovCisKKwkvKiBkb24ndCBleGNlZWQgdGFibGUgYm91bmRzIGZvciAicmVhbCIgc2V0dGluZyAqLworCXBvd2VyX2lkeCA9IGlsMzk0NV9od19yZWdfZml4X3Bvd2VyX2lkeChwb3dlcl9pZHgpOworCisJc2Nhbl9wb3dlcl9pbmZvLT5wb3dlcl90YWJsZV9pZHggPSBwb3dlcl9pZHg7CisJc2Nhbl9wb3dlcl9pbmZvLT50cGMudHhfZ2FpbiA9CisJICAgIHBvd2VyX2dhaW5fdGFibGVbYmFuZF9pZHhdW3Bvd2VyX2lkeF0udHhfZ2FpbjsKKwlzY2FuX3Bvd2VyX2luZm8tPnRwYy5kc3BfYXR0ZW4gPQorCSAgICBwb3dlcl9nYWluX3RhYmxlW2JhbmRfaWR4XVtwb3dlcl9pZHhdLmRzcF9hdHRlbjsKK30KKworLyoqCisgKiBpbDM5NDVfc2VuZF90eF9wb3dlciAtIGZpbGwgaW4gVHggUG93ZXIgY29tbWFuZCB3aXRoIGdhaW4gc2V0dGluZ3MKKyAqCisgKiBDb25maWd1cmVzIHBvd2VyIHNldHRpbmdzIGZvciBhbGwgcmF0ZXMgZm9yIHRoZSBjdXJyZW50IGNoYW5uZWwsCisgKiB1c2luZyB2YWx1ZXMgZnJvbSBjaGFubmVsIGluZm8gc3RydWN0LCBhbmQgc2VuZCB0byBOSUMKKyAqLworc3RhdGljIGludAoraWwzOTQ1X3NlbmRfdHhfcG93ZXIoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYXRlX2lkeCwgaTsKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvID0gTlVMTDsKKwlzdHJ1Y3QgaWwzOTQ1X3R4cG93ZXJ0YWJsZV9jbWQgdHhwb3dlciA9IHsKKwkJLmNoYW5uZWwgPSBpbC0+Y3R4LmFjdGl2ZS5jaGFubmVsLAorCX07CisJdTE2IGNoYW47CisKKwlpZiAoV0FSTl9PTkNFCisJICAgICh0ZXN0X2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKSwKKwkgICAgICJUWCBQb3dlciByZXF1ZXN0ZWQgd2hpbGUgc2Nhbm5pbmchXG4iKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwljaGFuID0gbGUxNl90b19jcHUoaWwtPmN0eC5hY3RpdmUuY2hhbm5lbCk7CisKKwl0eHBvd2VyLmJhbmQgPSAoaWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgPyAwIDogMTsKKwljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgaWwtPmJhbmQsIGNoYW4pOworCWlmICghY2hfaW5mbykgeworCQlJTF9FUlIoIkZhaWxlZCB0byBnZXQgY2hhbm5lbCBpbmZvIGZvciBjaGFubmVsICVkIFslZF1cbiIsIGNoYW4sCisJCSAgICAgICBpbC0+YmFuZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkgeworCQlEX1BPV0VSKCJOb3QgY2FsbGluZyBUWF9QV1JfVEJMX0NNRCBvbiAiICJub24tVHggY2hhbm5lbC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBmaWxsIGNtZCB3aXRoIHBvd2VyIHNldHRpbmdzIGZvciBhbGwgcmF0ZXMgZm9yIGN1cnJlbnQgY2hhbm5lbCAqLworCS8qIEZpbGwgT0ZETSByYXRlICovCisJZm9yIChyYXRlX2lkeCA9IElMX0ZJUlNUX09GRE1fUkFURSwgaSA9IDA7CisJICAgICByYXRlX2lkeCA8PSBJTDM5X0xBU1RfT0ZETV9SQVRFOyByYXRlX2lkeCsrLCBpKyspIHsKKworCQl0eHBvd2VyLnBvd2VyW2ldLnRwYyA9IGNoX2luZm8tPnBvd2VyX2luZm9baV0udHBjOworCQl0eHBvd2VyLnBvd2VyW2ldLnJhdGUgPSBpbDM5NDVfcmF0ZXNbcmF0ZV9pZHhdLnBsY3A7CisKKwkJRF9QT1dFUigiY2ggJWQ6JWQgcmYgJWQgZHNwICUzZCByYXRlIGNvZGUgMHglMDJ4XG4iLAorCQkJbGUxNl90b19jcHUodHhwb3dlci5jaGFubmVsKSwgdHhwb3dlci5iYW5kLAorCQkJdHhwb3dlci5wb3dlcltpXS50cGMudHhfZ2FpbiwKKwkJCXR4cG93ZXIucG93ZXJbaV0udHBjLmRzcF9hdHRlbiwgdHhwb3dlci5wb3dlcltpXS5yYXRlKTsKKwl9CisJLyogRmlsbCBDQ0sgcmF0ZXMgKi8KKwlmb3IgKHJhdGVfaWR4ID0gSUxfRklSU1RfQ0NLX1JBVEU7IHJhdGVfaWR4IDw9IElMX0xBU1RfQ0NLX1JBVEU7CisJICAgICByYXRlX2lkeCsrLCBpKyspIHsKKwkJdHhwb3dlci5wb3dlcltpXS50cGMgPSBjaF9pbmZvLT5wb3dlcl9pbmZvW2ldLnRwYzsKKwkJdHhwb3dlci5wb3dlcltpXS5yYXRlID0gaWwzOTQ1X3JhdGVzW3JhdGVfaWR4XS5wbGNwOworCisJCURfUE9XRVIoImNoICVkOiVkIHJmICVkIGRzcCAlM2QgcmF0ZSBjb2RlIDB4JTAyeFxuIiwKKwkJCWxlMTZfdG9fY3B1KHR4cG93ZXIuY2hhbm5lbCksIHR4cG93ZXIuYmFuZCwKKwkJCXR4cG93ZXIucG93ZXJbaV0udHBjLnR4X2dhaW4sCisJCQl0eHBvd2VyLnBvd2VyW2ldLnRwYy5kc3BfYXR0ZW4sIHR4cG93ZXIucG93ZXJbaV0ucmF0ZSk7CisJfQorCisJcmV0dXJuIGlsX3NlbmRfY21kX3BkdShpbCwgQ19UWF9QV1JfVEJMLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3R4cG93ZXJ0YWJsZV9jbWQpLAorCQkJICAgICAgICZ0eHBvd2VyKTsKKworfQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfc2V0X25ld19wb3dlciAtIENvbmZpZ3VyZXMgcG93ZXIgdGFibGVzIGF0IG5ldyBsZXZlbHMKKyAqIEBjaF9pbmZvOiBDaGFubmVsIHRvIHVwZGF0ZS4gIFVzZXMgcG93ZXJfaW5mby5yZXF1ZXN0ZWRfcG93ZXIuCisgKgorICogUmVwbGFjZSByZXF1ZXN0ZWRfcG93ZXIgYW5kIGJhc2VfcG93ZXJfaWR4IGNoX2luZm8gZmllbGRzIGZvcgorICogb25lIGNoYW5uZWwuCisgKgorICogQ2FsbGVkIGlmIHVzZXIgb3Igc3BlY3RydW0gbWFuYWdlbWVudCBjaGFuZ2VzIHBvd2VyIHByZWZlcmVuY2VzLgorICogVGFrZXMgaW50byBhY2NvdW50IGgvdyBhbmQgbW9kdWxhdGlvbiBsaW1pdGF0aW9ucyAoY2xpcCBwb3dlcikuCisgKgorICogVGhpcyBkb2VzICpub3QqIHNlbmQgYW55dGhpbmcgdG8gTklDLCBqdXN0IHNldHMgdXAgY2hfaW5mbyBmb3Igb25lIGNoYW5uZWwuCisgKgorICogTk9URTogcmVnX2NvbXBlbnNhdGVfZm9yX3RlbXBlcmF0dXJlX2RpZigpICptdXN0KiBiZSBydW4gYWZ0ZXIgdGhpcyB0bworICoJIHByb3Blcmx5IGZpbGwgb3V0IHRoZSBzY2FuIHBvd2VycywgYW5kIGFjdHVhbCBoL3cgZ2FpbiBzZXR0aW5ncywKKyAqCSBhbmQgc2VuZCBjaGFuZ2VzIHRvIE5JQworICovCitzdGF0aWMgaW50CitpbDM5NDVfaHdfcmVnX3NldF9uZXdfcG93ZXIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQoreworCXN0cnVjdCBpbDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvICpwb3dlcl9pbmZvOworCWludCBwb3dlcl9jaGFuZ2VkID0gMDsKKwlpbnQgaTsKKwljb25zdCBzOCAqY2xpcF9wd3JzOworCWludCBwb3dlcjsKKworCS8qIEdldCB0aGlzIGNobmxncnAncyByYXRlLXRvLW1heC9jbGlwLXBvd2VycyB0YWJsZSAqLworCWNsaXBfcHdycyA9IGlsLT5fMzk0NS5jbGlwX2dyb3Vwc1tjaF9pbmZvLT5ncm91cF9pZHhdLmNsaXBfcG93ZXJzOworCisJLyogR2V0IHRoaXMgY2hhbm5lbCdzIHJhdGUtdG8tY3VycmVudC1wb3dlciBzZXR0aW5ncyB0YWJsZSAqLworCXBvd2VyX2luZm8gPSBjaF9pbmZvLT5wb3dlcl9pbmZvOworCisJLyogdXBkYXRlIE9GRE0gVHhwb3dlciBzZXR0aW5ncyAqLworCWZvciAoaSA9IFJBVEVfNk1fSURYX1RCTDsgaSA8PSBSQVRFXzU0TV9JRFhfVEJMOyBpKyssICsrcG93ZXJfaW5mbykgeworCQlpbnQgZGVsdGFfaWR4OworCisJCS8qIGxpbWl0IG5ldyBwb3dlciB0byBiZSBubyBtb3JlIHRoYW4gaC93IGNhcGFiaWxpdHkgKi8KKwkJcG93ZXIgPSBtaW4oY2hfaW5mby0+Y3Vycl90eHBvdywgY2xpcF9wd3JzW2ldKTsKKwkJaWYgKHBvd2VyID09IHBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlcikKKwkJCWNvbnRpbnVlOworCisJCS8qIGZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIG9sZCBhbmQgbmV3IHJlcXVlc3RlZCBwb3dlcnMsCisJCSAqICAgIHVwZGF0ZSBiYXNlIChub24tdGVtcC1jb21wZW5zYXRlZCkgcG93ZXIgaWR4ICovCisJCWRlbHRhX2lkeCA9IChwb3dlciAtIHBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlcikgKiAyOworCQlwb3dlcl9pbmZvLT5iYXNlX3Bvd2VyX2lkeCAtPSBkZWx0YV9pZHg7CisKKwkJLyogc2F2ZSBuZXcgcmVxdWVzdGVkIHBvd2VyIHZhbHVlICovCisJCXBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlciA9IHBvd2VyOworCisJCXBvd2VyX2NoYW5nZWQgPSAxOworCX0KKworCS8qIHVwZGF0ZSBDQ0sgVHhwb3dlciBzZXR0aW5ncywgYmFzZWQgb24gT0ZETSAxMk0gc2V0dGluZyAuLi4KKwkgKiAgICAuLi4gYWxsIENDSyBwb3dlciBzZXR0aW5ncyBmb3IgYSBnaXZlbiBjaGFubmVsIGFyZSB0aGUgKnNhbWUqLiAqLworCWlmIChwb3dlcl9jaGFuZ2VkKSB7CisJCXBvd2VyID0KKwkJICAgIGNoX2luZm8tPnBvd2VyX2luZm9bUkFURV8xMk1fSURYX1RCTF0ucmVxdWVzdGVkX3Bvd2VyICsKKwkJICAgIElMX0NDS19GUk9NX09GRE1fUE9XRVJfRElGRjsKKworCQkvKiBkbyBhbGwgQ0NLIHJhdGVzJyBpbDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvIHN0cnVjdHVyZXMgKi8KKwkJZm9yIChpID0gUkFURV8xTV9JRFhfVEJMOyBpIDw9IFJBVEVfMTFNX0lEWF9UQkw7IGkrKykgeworCQkJcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcG93ZXI7CisJCQlwb3dlcl9pbmZvLT5iYXNlX3Bvd2VyX2lkeCA9CisJCQkgICAgY2hfaW5mby0+cG93ZXJfaW5mb1tSQVRFXzEyTV9JRFhfVEJMXS4KKwkJCSAgICBiYXNlX3Bvd2VyX2lkeCArIElMX0NDS19GUk9NX09GRE1fSURYX0RJRkY7CisJCQkrK3Bvd2VyX2luZm87CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDM5NDVfaHdfcmVnX2dldF9jaF90eHBvd2VyX2xpbWl0IC0gcmV0dXJucyBuZXcgcG93ZXIgbGltaXQgZm9yIGNoYW5uZWwKKyAqCisgKiBOT1RFOiBSZXR1cm5lZCBwb3dlciBsaW1pdCBtYXkgYmUgbGVzcyAoYnV0IG5vdCBtb3JlKSB0aGFuIHJlcXVlc3RlZCwKKyAqCSBiYXNlZCBzdHJpY3RseSBvbiByZWd1bGF0b3J5IChlZXByb20gYW5kIHNwZWN0cnVtIG1ndCkgbGltaXRhdGlvbnMKKyAqCSAobm8gY29uc2lkZXJhdGlvbiBmb3IgaC93IGNsaXBwaW5nIGxpbWl0YXRpb25zKS4KKyAqLworc3RhdGljIGludAoraWwzOTQ1X2h3X3JlZ19nZXRfY2hfdHhwb3dlcl9saW1pdChzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQoreworCXM4IG1heF9wb3dlcjsKKworI2lmIDAKKwkvKiBpZiB3ZSdyZSB1c2luZyBUR2QgbGltaXRzLCB1c2UgbG93ZXIgb2YgVEdkIG9yIEVFUFJPTSAqLworCWlmIChjaF9pbmZvLT50Z2RfZGF0YS5tYXhfcG93ZXIgIT0gMCkKKwkJbWF4X3Bvd2VyID0KKwkJICAgIG1pbihjaF9pbmZvLT50Z2RfZGF0YS5tYXhfcG93ZXIsCisJCQljaF9pbmZvLT5lZXByb20ubWF4X3Bvd2VyX2F2Zyk7CisKKwkvKiBlbHNlIGp1c3QgdXNlIEVFUFJPTSBsaW1pdHMgKi8KKwllbHNlCisjZW5kaWYKKwkJbWF4X3Bvd2VyID0gY2hfaW5mby0+ZWVwcm9tLm1heF9wb3dlcl9hdmc7CisKKwlyZXR1cm4gbWluKG1heF9wb3dlciwgY2hfaW5mby0+bWF4X3Bvd2VyX2F2Zyk7Cit9CisKKy8qKgorICogaWwzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcCAtIENvbXBlbnNhdGUgZm9yIHRlbXBlcmF0dXJlCisgKgorICogQ29tcGVuc2F0ZSB0eHBvd2VyIHNldHRpbmdzIG9mICphbGwqIGNoYW5uZWxzIGZvciB0ZW1wZXJhdHVyZS4KKyAqIFRoaXMgb25seSBhY2NvdW50cyBmb3IgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IHRlbXBlcmF0dXJlCisgKiAgIGFuZCB0aGUgZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZXMsIGFuZCBiYXNlcyB0aGUgbmV3IHNldHRpbmdzCisgKiAgIG9uIHRoZSBjaGFubmVsJ3MgYmFzZV9wb3dlcl9pZHguCisgKgorICogSWYgUnhPbiBpcyAiYXNzb2NpYXRlZCIsIHRoaXMgc2VuZHMgdGhlIG5ldyBUeHBvd2VyIHRvIE5JQyEKKyAqLworc3RhdGljIGludAoraWwzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbyA9IE5VTEw7CisJc3RydWN0IGlsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqKWlsLT5lZXByb207CisJaW50IGRlbHRhX2lkeDsKKwljb25zdCBzOCAqY2xpcF9wd3JzOwkvKiBhcnJheSBvZiBoL3cgbWF4IHBvd2VyIGxldmVscyBmb3IgZWFjaCByYXRlICovCisJdTggYV9iYW5kOworCXU4IHJhdGVfaWR4OworCXU4IHNjYW5fdGJsX2lkeDsKKwl1OCBpOworCWludCByZWZfdGVtcDsKKwlpbnQgdGVtcGVyYXR1cmUgPSBpbC0+dGVtcGVyYXR1cmU7CisKKwlpZiAoaWwtPmRpc2FibGVfdHhfcG93ZXJfY2FsIHx8IHRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgeworCQkvKiBkbyBub3QgcGVyZm9ybSB0eCBwb3dlciBjYWxpYnJhdGlvbiAqLworCQlyZXR1cm4gMDsKKwl9CisJLyogc2V0IHVwIG5ldyBUeCBwb3dlciBpbmZvIGZvciBlYWNoIGFuZCBldmVyeSBjaGFubmVsLCAyLjQgYW5kIDUueCAqLworCWZvciAoaSA9IDA7IGkgPCBpbC0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7CisJCWNoX2luZm8gPSAmaWwtPmNoYW5uZWxfaW5mb1tpXTsKKwkJYV9iYW5kID0gaWxfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbyk7CisKKwkJLyogR2V0IHRoaXMgY2hubGdycCdzIGZhY3RvcnkgY2FsaWJyYXRpb24gdGVtcGVyYXR1cmUgKi8KKwkJcmVmX3RlbXAgPSAoczE2KSBlZXByb20tPmdyb3Vwc1tjaF9pbmZvLT5ncm91cF9pZHhdLnRlbXBlcmF0dXJlOworCisJCS8qIGdldCBwb3dlciBpZHggYWRqdXN0bWVudCBiYXNlZCBvbiBjdXJyZW50IGFuZCBmYWN0b3J5CisJCSAqIHRlbXBzICovCisJCWRlbHRhX2lkeCA9CisJCSAgICBpbDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wKHRlbXBlcmF0dXJlLCByZWZfdGVtcCk7CisKKwkJLyogc2V0IHR4IHBvd2VyIHZhbHVlIGZvciBhbGwgcmF0ZXMsIE9GRE0gYW5kIENDSyAqLworCQlmb3IgKHJhdGVfaWR4ID0gMDsgcmF0ZV9pZHggPCBSQVRFX0NPVU5UXzM5NDU7IHJhdGVfaWR4KyspIHsKKwkJCWludCBwb3dlcl9pZHggPQorCQkJICAgIGNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pZHhdLmJhc2VfcG93ZXJfaWR4OworCisJCQkvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRlICovCisJCQlwb3dlcl9pZHggKz0gZGVsdGFfaWR4OworCisJCQkvKiBzdGF5IHdpdGhpbiB0YWJsZSByYW5nZSAqLworCQkJcG93ZXJfaWR4ID0gaWwzOTQ1X2h3X3JlZ19maXhfcG93ZXJfaWR4KHBvd2VyX2lkeCk7CisJCQljaF9pbmZvLT5wb3dlcl9pbmZvW3JhdGVfaWR4XS5wb3dlcl90YWJsZV9pZHggPQorCQkJICAgICh1OCkgcG93ZXJfaWR4OworCQkJY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2lkeF0udHBjID0KKwkJCSAgICBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcG93ZXJfaWR4XTsKKwkJfQorCisJCS8qIEdldCB0aGlzIGNobmxncnAncyByYXRlLXRvLW1heC9jbGlwLXBvd2VycyB0YWJsZSAqLworCQljbGlwX3B3cnMgPQorCQkgICAgaWwtPl8zOTQ1LmNsaXBfZ3JvdXBzW2NoX2luZm8tPmdyb3VwX2lkeF0uY2xpcF9wb3dlcnM7CisKKwkJLyogc2V0IHNjYW4gdHggcG93ZXIsIDFNYml0IGZvciBDQ0ssIDZNYml0IGZvciBPRkRNICovCisJCWZvciAoc2Nhbl90YmxfaWR4ID0gMDsgc2Nhbl90YmxfaWR4IDwgSUxfTlVNX1NDQU5fUkFURVM7CisJCSAgICAgc2Nhbl90YmxfaWR4KyspIHsKKwkJCXMzMiBhY3R1YWxfaWR4ID0KKwkJCSAgICAoc2Nhbl90YmxfaWR4ID09CisJCQkgICAgIDApID8gUkFURV8xTV9JRFhfVEJMIDogUkFURV82TV9JRFhfVEJMOworCQkJaWwzOTQ1X2h3X3JlZ19zZXRfc2Nhbl9wb3dlcihpbCwgc2Nhbl90YmxfaWR4LAorCQkJCQkJICAgICBhY3R1YWxfaWR4LCBjbGlwX3B3cnMsCisJCQkJCQkgICAgIGNoX2luZm8sIGFfYmFuZCk7CisJCX0KKwl9CisKKwkvKiBzZW5kIFR4cG93ZXIgY29tbWFuZCBmb3IgY3VycmVudCBjaGFubmVsIHRvIHVjb2RlICovCisJcmV0dXJuIGlsLT5jZmctPm9wcy0+bGliLT5zZW5kX3R4X3Bvd2VyKGlsKTsKK30KKworaW50CitpbDM5NDVfaHdfcmVnX3NldF90eHBvd2VyKHN0cnVjdCBpbF9wcml2ICppbCwgczggcG93ZXIpCit7CisJc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKwlzOCBtYXhfcG93ZXI7CisJdTggYV9iYW5kOworCXU4IGk7CisKKwlpZiAoaWwtPnR4X3Bvd2VyX3VzZXJfbG10ID09IHBvd2VyKSB7CisJCURfUE9XRVIoIlJlcXVlc3RlZCBUeCBwb3dlciBzYW1lIGFzIGN1cnJlbnQgIiAibGltaXQ6ICVkZEJtLlxuIiwKKwkJCXBvd2VyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJRF9QT1dFUigiU2V0dGluZyB1cHBlciBsaW1pdCBjbGFtcCB0byAlZGRCbS5cbiIsIHBvd2VyKTsKKwlpbC0+dHhfcG93ZXJfdXNlcl9sbXQgPSBwb3dlcjsKKworCS8qIHNldCB1cCBuZXcgVHggcG93ZXJzIGZvciBlYWNoIGFuZCBldmVyeSBjaGFubmVsLCAyLjQgYW5kIDUueCAqLworCisJZm9yIChpID0gMDsgaSA8IGlsLT5jaGFubmVsX2NvdW50OyBpKyspIHsKKwkJY2hfaW5mbyA9ICZpbC0+Y2hhbm5lbF9pbmZvW2ldOworCQlhX2JhbmQgPSBpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKTsKKworCQkvKiBmaW5kIG1pbmltdW0gcG93ZXIgb2YgYWxsIHVzZXIgYW5kIHJlZ3VsYXRvcnkgY29uc3RyYWludHMKKwkJICogICAgKGRvZXMgbm90IGNvbnNpZGVyIGgvdyBjbGlwcGluZyBsaW1pdGF0aW9ucykgKi8KKwkJbWF4X3Bvd2VyID0gaWwzOTQ1X2h3X3JlZ19nZXRfY2hfdHhwb3dlcl9saW1pdChjaF9pbmZvKTsKKwkJbWF4X3Bvd2VyID0gbWluKHBvd2VyLCBtYXhfcG93ZXIpOworCQlpZiAobWF4X3Bvd2VyICE9IGNoX2luZm8tPmN1cnJfdHhwb3cpIHsKKwkJCWNoX2luZm8tPmN1cnJfdHhwb3cgPSBtYXhfcG93ZXI7CisKKwkJCS8qIHRoaXMgY29uc2lkZXJzIHRoZSBoL3cgY2xpcHBpbmcgbGltaXRhdGlvbnMgKi8KKwkJCWlsMzk0NV9od19yZWdfc2V0X25ld19wb3dlcihpbCwgY2hfaW5mbyk7CisJCX0KKwl9CisKKwkvKiB1cGRhdGUgdHhwb3dlciBzZXR0aW5ncyBmb3IgYWxsIGNoYW5uZWxzLAorCSAqICAgc2VuZCB0byBOSUMgaWYgYXNzb2NpYXRlZC4gKi8KKwlpbDM5NDVfaXNfdGVtcF9jYWxpYl9uZWVkZWQoaWwpOworCWlsMzk0NV9od19yZWdfY29tcF90eHBvd2VyX3RlbXAoaWwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lsMzk0NV9zZW5kX3J4b25fYXNzb2Moc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJaW50IHJjID0gMDsKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3Q7CisJc3RydWN0IGlsMzk0NV9yeG9uX2Fzc29jX2NtZCByeG9uX2Fzc29jOworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfUlhPTl9BU1NPQywKKwkJLmxlbiA9IHNpemVvZihyeG9uX2Fzc29jKSwKKwkJLmZsYWdzID0gQ01EX1dBTlRfU0tCLAorCQkuZGF0YSA9ICZyeG9uX2Fzc29jLAorCX07CisJY29uc3Qgc3RydWN0IGlsX3J4b25fY21kICpyeG9uMSA9ICZjdHgtPnN0YWdpbmc7CisJY29uc3Qgc3RydWN0IGlsX3J4b25fY21kICpyeG9uMiA9ICZjdHgtPmFjdGl2ZTsKKworCWlmIChyeG9uMS0+ZmxhZ3MgPT0gcnhvbjItPmZsYWdzICYmCisJICAgIHJ4b24xLT5maWx0ZXJfZmxhZ3MgPT0gcnhvbjItPmZpbHRlcl9mbGFncyAmJgorCSAgICByeG9uMS0+Y2NrX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5jY2tfYmFzaWNfcmF0ZXMgJiYKKwkgICAgcnhvbjEtPm9mZG1fYmFzaWNfcmF0ZXMgPT0gcnhvbjItPm9mZG1fYmFzaWNfcmF0ZXMpIHsKKwkJRF9JTkZPKCJVc2luZyBjdXJyZW50IFJYT05fQVNTT0MuICBOb3QgcmVzZW5kaW5nLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXJ4b25fYXNzb2MuZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmxhZ3M7CisJcnhvbl9hc3NvYy5maWx0ZXJfZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzOworCXJ4b25fYXNzb2Mub2ZkbV9iYXNpY19yYXRlcyA9IGN0eC0+c3RhZ2luZy5vZmRtX2Jhc2ljX3JhdGVzOworCXJ4b25fYXNzb2MuY2NrX2Jhc2ljX3JhdGVzID0gY3R4LT5zdGFnaW5nLmNja19iYXNpY19yYXRlczsKKwlyeG9uX2Fzc29jLnJlc2VydmVkID0gMDsKKworCXJjID0gaWxfc2VuZF9jbWRfc3luYyhpbCwgJmNtZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwlwa3QgPSAoc3RydWN0IGlsX3J4X3BrdCAqKWNtZC5yZXBseV9wYWdlOworCWlmIChwa3QtPmhkci5mbGFncyAmIElMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlMX0VSUigiQmFkIHJldHVybiBmcm9tIENfUlhPTl9BU1NPQyBjb21tYW5kXG4iKTsKKwkJcmMgPSAtRUlPOworCX0KKworCWlsX2ZyZWVfcGFnZXMoaWwsIGNtZC5yZXBseV9wYWdlKTsKKworCXJldHVybiByYzsKK30KKworLyoqCisgKiBpbDM5NDVfY29tbWl0X3J4b24gLSBjb21taXQgc3RhZ2luZ19yeG9uIHRvIGhhcmR3YXJlCisgKgorICogVGhlIFJYT04gY29tbWFuZCBpbiBzdGFnaW5nX3J4b24gaXMgY29tbWl0dGVkIHRvIHRoZSBoYXJkd2FyZSBhbmQKKyAqIHRoZSBhY3RpdmVfcnhvbiBzdHJ1Y3R1cmUgaXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcgZGF0YS4gIFRoaXMKKyAqIGZ1bmN0aW9uIGNvcnJlY3RseSB0cmFuc2l0aW9ucyBvdXQgb2YgdGhlIFJYT05fQVNTT0NfTVNLIHN0YXRlIGlmCisgKiBhIEhXIHR1bmUgaXMgcmVxdWlyZWQgYmFzZWQgb24gdGhlIFJYT04gc3RydWN0dXJlIGNoYW5nZXMuCisgKi8KK2ludAoraWwzOTQ1X2NvbW1pdF9yeG9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCS8qIGNhc3QgYXdheSB0aGUgY29uc3QgZm9yIGFjdGl2ZV9yeG9uIGluIHRoaXMgZnVuY3Rpb24gKi8KKwlzdHJ1Y3QgaWwzOTQ1X3J4b25fY21kICphY3RpdmVfcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOworCXN0cnVjdCBpbDM5NDVfcnhvbl9jbWQgKnN0YWdpbmdfcnhvbiA9ICh2b2lkICopJmN0eC0+c3RhZ2luZzsKKwlpbnQgcmMgPSAwOworCWJvb2wgbmV3X2Fzc29jID0gISEoc3RhZ2luZ19yeG9uLT5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtMTsKKworCS8qIGFsd2F5cyBnZXQgdGltZXN0YW1wIHdpdGggUnggZnJhbWUgKi8KKwlzdGFnaW5nX3J4b24tPmZsYWdzIHw9IFJYT05fRkxHX1RTRjJIT1NUX01TSzsKKworCS8qIHNlbGVjdCBhbnRlbm5hICovCisJc3RhZ2luZ19yeG9uLT5mbGFncyAmPSB+KFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX1NFTF9NU0spOworCXN0YWdpbmdfcnhvbi0+ZmxhZ3MgfD0gaWwzOTQ1X2dldF9hbnRlbm5hX2ZsYWdzKGlsKTsKKworCXJjID0gaWxfY2hlY2tfcnhvbl9jbWQoaWwsIGN0eCk7CisJaWYgKHJjKSB7CisJCUlMX0VSUigiSW52YWxpZCBSWE9OIGNvbmZpZ3VyYXRpb24uICBOb3QgY29tbWl0dGluZy5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBJZiB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgYSBmdWxsIFJYT04sIHdlIGNhbiB1c2UKKwkgKiBpbDM5NDVfcnhvbl9hc3NvY19jbWQgd2hpY2ggaXMgdXNlZCB0byByZWNvbmZpZ3VyZSBmaWx0ZXIKKwkgKiBhbmQgb3RoZXIgZmxhZ3MgZm9yIHRoZSBjdXJyZW50IHJhZGlvIGNvbmZpZ3VyYXRpb24uICovCisJaWYgKCFpbF9mdWxsX3J4b25fcmVxdWlyZWQoaWwsICZpbC0+Y3R4KSkgeworCQlyYyA9IGlsX3NlbmRfcnhvbl9hc3NvYyhpbCwgJmlsLT5jdHgpOworCQlpZiAocmMpIHsKKwkJCUlMX0VSUigiRXJyb3Igc2V0dGluZyBSWE9OX0FTU09DICIKKwkJCSAgICAgICAiY29uZmlndXJhdGlvbiAoJWQpLlxuIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisKKwkJbWVtY3B5KGFjdGl2ZV9yeG9uLCBzdGFnaW5nX3J4b24sIHNpemVvZigqYWN0aXZlX3J4b24pKTsKKwkJLyoKKwkJICogV2UgZG8gbm90IGNvbW1pdCB0eCBwb3dlciBzZXR0aW5ncyB3aGlsZSBjaGFubmVsIGNoYW5naW5nLAorCQkgKiBkbyBpdCBub3cgaWYgdHggcG93ZXIgY2hhbmdlZC4KKwkJICovCisJCWlsX3NldF90eF9wb3dlcihpbCwgaWwtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGFuZCB0aGUgbmV3IGNvbmZpZyByZXF1aXJlcworCSAqIGFuIFJYT05fQVNTT0MgYW5kIHRoZSBuZXcgY29uZmlnIHdhbnRzIHRoZSBhc3NvY2lhdGVkIG1hc2sgZW5hYmxlZCwKKwkgKiB3ZSBtdXN0IGNsZWFyIHRoZSBhc3NvY2lhdGVkIGZyb20gdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCisJICogYmVmb3JlIHdlIGFwcGx5IHRoZSBuZXcgY29uZmlnICovCisJaWYgKGlsX2lzX2Fzc29jaWF0ZWQoaWwpICYmIG5ld19hc3NvYykgeworCQlEX0lORk8oIlRvZ2dsaW5nIGFzc29jaWF0ZWQgYml0IG9uIGN1cnJlbnQgUlhPTlxuIik7CisJCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKworCQkvKgorCQkgKiByZXNlcnZlZDQgYW5kIDUgY291bGQgaGF2ZSBiZWVuIGZpbGxlZCBieSB0aGUgaXdsY29yZSBjb2RlLgorCQkgKiBMZXQncyBjbGVhciB0aGVtIGJlZm9yZSBwdXNoaW5nIHRvIHRoZSAzOTQ1LgorCQkgKi8KKwkJYWN0aXZlX3J4b24tPnJlc2VydmVkNCA9IDA7CisJCWFjdGl2ZV9yeG9uLT5yZXNlcnZlZDUgPSAwOworCQlyYyA9IGlsX3NlbmRfY21kX3BkdShpbCwgQ19SWE9OLCBzaXplb2Yoc3RydWN0IGlsMzk0NV9yeG9uX2NtZCksCisJCQkJICAgICAmaWwtPmN0eC5hY3RpdmUpOworCisJCS8qIElmIHRoZSBtYXNrIGNsZWFyaW5nIGZhaWxlZCB0aGVuIHdlIHNldAorCQkgKiBhY3RpdmVfcnhvbiBiYWNrIHRvIHdoYXQgaXQgd2FzIHByZXZpb3VzbHkgKi8KKwkJaWYgKHJjKSB7CisJCQlhY3RpdmVfcnhvbi0+ZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKKwkJCUlMX0VSUigiRXJyb3IgY2xlYXJpbmcgQVNTT0NfTVNLIG9uIGN1cnJlbnQgIgorCQkJICAgICAgICJjb25maWd1cmF0aW9uICglZCkuXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMoaWwsICZpbC0+Y3R4KTsKKwkJaWxfcmVzdG9yZV9zdGF0aW9ucyhpbCwgJmlsLT5jdHgpOworCX0KKworCURfSU5GTygiU2VuZGluZyBSWE9OXG4iICIqIHdpdGglcyBSWE9OX0ZJTFRFUl9BU1NPQ19NU0tcbiIKKwkgICAgICAgIiogY2hhbm5lbCA9ICVkXG4iICIqIGJzc2lkID0gJXBNXG4iLCAobmV3X2Fzc29jID8gIiIgOiAib3V0IiksCisJICAgICAgIGxlMTZfdG9fY3B1KHN0YWdpbmdfcnhvbi0+Y2hhbm5lbCksIHN0YWdpbmdfcnhvbi0+YnNzaWRfYWRkcik7CisKKwkvKgorCSAqIHJlc2VydmVkNCBhbmQgNSBjb3VsZCBoYXZlIGJlZW4gZmlsbGVkIGJ5IHRoZSBpd2xjb3JlIGNvZGUuCisJICogTGV0J3MgY2xlYXIgdGhlbSBiZWZvcmUgcHVzaGluZyB0byB0aGUgMzk0NS4KKwkgKi8KKwlzdGFnaW5nX3J4b24tPnJlc2VydmVkNCA9IDA7CisJc3RhZ2luZ19yeG9uLT5yZXNlcnZlZDUgPSAwOworCisJaWxfc2V0X3J4b25faHdjcnlwdG8oaWwsIGN0eCwgIWlsMzk0NV9tb2RfcGFyYW1zLnN3X2NyeXB0byk7CisKKwkvKiBBcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKi8KKwlyYyA9IGlsX3NlbmRfY21kX3BkdShpbCwgQ19SWE9OLCBzaXplb2Yoc3RydWN0IGlsMzk0NV9yeG9uX2NtZCksCisJCQkgICAgIHN0YWdpbmdfcnhvbik7CisJaWYgKHJjKSB7CisJCUlMX0VSUigiRXJyb3Igc2V0dGluZyBuZXcgY29uZmlndXJhdGlvbiAoJWQpLlxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJbWVtY3B5KGFjdGl2ZV9yeG9uLCBzdGFnaW5nX3J4b24sIHNpemVvZigqYWN0aXZlX3J4b24pKTsKKworCWlmICghbmV3X2Fzc29jKSB7CisJCWlsX2NsZWFyX3Vjb2RlX3N0YXRpb25zKGlsLCAmaWwtPmN0eCk7CisJCWlsX3Jlc3RvcmVfc3RhdGlvbnMoaWwsICZpbC0+Y3R4KTsKKwl9CisKKwkvKiBJZiB3ZSBpc3N1ZSBhIG5ldyBSWE9OIGNvbW1hbmQgd2hpY2ggcmVxdWlyZWQgYSB0dW5lIHRoZW4gd2UgbXVzdAorCSAqIHNlbmQgYSBuZXcgVFhQT1dFUiBjb21tYW5kIG9yIHdlIHdvbid0IGJlIGFibGUgdG8gVHggYW55IGZyYW1lcyAqLworCXJjID0gaWxfc2V0X3R4X3Bvd2VyKGlsLCBpbC0+dHhfcG93ZXJfbmV4dCwgdHJ1ZSk7CisJaWYgKHJjKSB7CisJCUlMX0VSUigiRXJyb3Igc2V0dGluZyBUeCBwb3dlciAoJWQpLlxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJLyogSW5pdCB0aGUgaGFyZHdhcmUncyByYXRlIGZhbGxiYWNrIG9yZGVyIGJhc2VkIG9uIHRoZSBiYW5kICovCisJcmMgPSBpbDM5NDVfaW5pdF9od19yYXRlX3RhYmxlKGlsKTsKKwlpZiAocmMpIHsKKwkJSUxfRVJSKCJFcnJvciBzZXR0aW5nIEhXIHJhdGUgdGFibGU6ICUwMlhcbiIsIHJjKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWwzOTQ1X3JlZ190eHBvd2VyX3BlcmlvZGljIC0gIGNhbGxlZCB3aGVuIHRpbWUgdG8gY2hlY2sgb3VyIHRlbXBlcmF0dXJlLgorICoKKyAqIC0tIHJlc2V0IHBlcmlvZGljIHRpbWVyCisgKiAtLSBzZWUgaWYgdGVtcCBoYXMgY2hhbmdlZCBlbm91Z2ggdG8gd2FycmFudCByZS1jYWxpYnJhdGlvbiAuLi4gaWYgc286CisgKiAgICAgLS0gY29ycmVjdCBjb2VmZnMgZm9yIHRlbXAgKGNhbiByZXNldCB0ZW1wIHRpbWVyKQorICogICAgIC0tIHNhdmUgdGhpcyB0ZW1wIGFzICJsYXN0IiwKKyAqICAgICAtLSBzZW5kIG5ldyBzZXQgb2YgZ2FpbiBzZXR0aW5ncyB0byBOSUMKKyAqIE5PVEU6ICBUaGlzIHNob3VsZCBjb250aW51ZSB3b3JraW5nLCBldmVuIHdoZW4gd2UncmUgbm90IGFzc29jaWF0ZWQsCisgKiAgIHNvIHdlIGNhbiBrZWVwIG91ciBpbnRlcm5hbCB0YWJsZSBvZiBzY2FuIHBvd2VycyBjdXJyZW50LiAqLwordm9pZAoraWwzOTQ1X3JlZ190eHBvd2VyX3BlcmlvZGljKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBUaGlzIHdpbGwga2ljayBpbiB0aGUgImJydXRlIGZvcmNlIgorCSAqIGlsMzk0NV9od19yZWdfY29tcF90eHBvd2VyX3RlbXAoKSBiZWxvdyAqLworCWlmICghaWwzOTQ1X2lzX3RlbXBfY2FsaWJfbmVlZGVkKGlsKSkKKwkJZ290byByZXNjaGVkdWxlOworCisJLyogU2V0IHVwIGEgbmV3IHNldCBvZiB0ZW1wLWFkanVzdGVkIFR4UG93ZXJzLCBzZW5kIHRvIE5JQy4KKwkgKiBUaGlzIGlzIGJhc2VkICpvbmx5KiBvbiBjdXJyZW50IHRlbXBlcmF0dXJlLAorCSAqIGlnbm9yaW5nIGFueSBwcmV2aW91cyBwb3dlciBtZWFzdXJlbWVudHMgKi8KKwlpbDM5NDVfaHdfcmVnX2NvbXBfdHhwb3dlcl90ZW1wKGlsKTsKKworcmVzY2hlZHVsZToKKwlxdWV1ZV9kZWxheWVkX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5fMzk0NS50aGVybWFsX3BlcmlvZGljLAorCQkJICAgUkVHX1JFQ0FMSUJfUEVSSU9EICogSFopOworfQorCitzdGF0aWMgdm9pZAoraWwzOTQ1X2JnX3JlZ190eHBvd2VyX3BlcmlvZGljKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGlsX3ByaXYsCisJCQkJCSAgXzM5NDUudGhlcm1hbF9wZXJpb2RpYy53b3JrKTsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhpbCk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfZ2V0X2NoX2dycF9pZHggLSBmaW5kIHRoZSBjaGFubmVsLWdyb3VwIGlkeCAoMC00KSBmb3IgY2hhbm5lbC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiBpbml0aWFsaXppbmcgY2hhbm5lbC1pbmZvIHN0cnVjdHMuCisgKgorICogTk9URTogVGhlc2UgY2hhbm5lbCBncm91cHMgZG8gKk5PVCogbWF0Y2ggdGhlIGJhbmRzIGFib3ZlIQorICoJIFRoZXNlIGNoYW5uZWwgZ3JvdXBzIGFyZSBiYXNlZCBvbiBmYWN0b3J5LXRlc3RlZCBjaGFubmVsczsKKyAqCSBvbiBBLWJhbmQsIEVFUFJPTSdzICJncm91cCBmcmVxdWVuY3kiIGVudHJpZXMgcmVwcmVzZW50IHRoZSB0b3AKKyAqCSBjaGFubmVsIGluIGVhY2ggZ3JvdXAgMS00LiAgR3JvdXAgNSBBbGwgQi9HIGNoYW5uZWxzIGFyZSBpbiBncm91cCAwLgorICovCitzdGF0aWMgdTE2CitpbDM5NDVfaHdfcmVnX2dldF9jaF9ncnBfaWR4KHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbykKK3sKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwICpjaF9ncnAgPSAmZWVwcm9tLT5ncm91cHNbMF07CisJdTggZ3JvdXA7CisJdTE2IGdyb3VwX2lkeCA9IDA7CS8qIGJhc2VkIG9uIGZhY3RvcnkgY2FsaWIgZnJlcXVlbmNpZXMgKi8KKwl1OCBncnBfY2hhbm5lbDsKKworCS8qIEZpbmQgdGhlIGdyb3VwIGlkeCBmb3IgdGhlIGNoYW5uZWwgLi4uIGRvbid0IHVzZSBpZHggMSg/KSAqLworCWlmIChpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKSkgeworCQlmb3IgKGdyb3VwID0gMTsgZ3JvdXAgPCA1OyBncm91cCsrKSB7CisJCQlncnBfY2hhbm5lbCA9IGNoX2dycFtncm91cF0uZ3JvdXBfY2hhbm5lbDsKKwkJCWlmIChjaF9pbmZvLT5jaGFubmVsIDw9IGdycF9jaGFubmVsKSB7CisJCQkJZ3JvdXBfaWR4ID0gZ3JvdXA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogZ3JvdXAgNCBoYXMgYSBmZXcgY2hhbm5lbHMgKmFib3ZlKiBpdHMgZmFjdG9yeSBjYWwgZnJlcSAqLworCQlpZiAoZ3JvdXAgPT0gNSkKKwkJCWdyb3VwX2lkeCA9IDQ7CisJfSBlbHNlCisJCWdyb3VwX2lkeCA9IDA7CS8qIDIuNCBHSHosIGdyb3VwIDAgKi8KKworCURfUE9XRVIoIkNobmwgJWQgbWFwcGVkIHRvIGdycCAlZFxuIiwgY2hfaW5mby0+Y2hhbm5lbCwgZ3JvdXBfaWR4KTsKKwlyZXR1cm4gZ3JvdXBfaWR4OworfQorCisvKioKKyAqIGlsMzk0NV9od19yZWdfZ2V0X21hdGNoZWRfcG93ZXJfaWR4IC0gSW50ZXJwb2xhdGUgdG8gZ2V0IG5vbWluYWwgaWR4CisgKgorICogSW50ZXJwb2xhdGUgdG8gZ2V0IG5vbWluYWwgKGkuZS4gYXQgZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZSkgaWR4CisgKiAgIGludG8gcmFkaW8vRFNQIGdhaW4gc2V0dGluZ3MgdGFibGUgZm9yIHJlcXVlc3RlZCBwb3dlci4KKyAqLworc3RhdGljIGludAoraWwzOTQ1X2h3X3JlZ19nZXRfbWF0Y2hlZF9wb3dlcl9pZHgoc3RydWN0IGlsX3ByaXYgKmlsLCBzOCByZXF1ZXN0ZWRfcG93ZXIsCisJCQkJICAgIHMzMiBzZXR0aW5nX2lkeCwgczMyICpuZXdfaWR4KQoreworCWNvbnN0IHN0cnVjdCBpbDM5NDVfZWVwcm9tX3R4cG93ZXJfZ3JvdXAgKmNobmxfZ3JwID0gTlVMTDsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwlzMzIgaWR4MCwgaWR4MTsKKwlzMzIgcG93ZXIgPSAyICogcmVxdWVzdGVkX3Bvd2VyOworCXMzMiBpOworCWNvbnN0IHN0cnVjdCBpbDM5NDVfZWVwcm9tX3R4cG93ZXJfc2FtcGxlICpzYW1wbGVzOworCXMzMiBnYWluczAsIGdhaW5zMTsKKwlzMzIgcmVzOworCXMzMiBkZW5vbWluYXRvcjsKKworCWNobmxfZ3JwID0gJmVlcHJvbS0+Z3JvdXBzW3NldHRpbmdfaWR4XTsKKwlzYW1wbGVzID0gY2hubF9ncnAtPnNhbXBsZXM7CisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlpZiAocG93ZXIgPT0gc2FtcGxlc1tpXS5wb3dlcikgeworCQkJKm5ld19pZHggPSBzYW1wbGVzW2ldLmdhaW5faWR4OworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAocG93ZXIgPiBzYW1wbGVzWzFdLnBvd2VyKSB7CisJCWlkeDAgPSAwOworCQlpZHgxID0gMTsKKwl9IGVsc2UgaWYgKHBvd2VyID4gc2FtcGxlc1syXS5wb3dlcikgeworCQlpZHgwID0gMTsKKwkJaWR4MSA9IDI7CisJfSBlbHNlIGlmIChwb3dlciA+IHNhbXBsZXNbM10ucG93ZXIpIHsKKwkJaWR4MCA9IDI7CisJCWlkeDEgPSAzOworCX0gZWxzZSB7CisJCWlkeDAgPSAzOworCQlpZHgxID0gNDsKKwl9CisKKwlkZW5vbWluYXRvciA9IChzMzIpIHNhbXBsZXNbaWR4MV0ucG93ZXIgLSAoczMyKSBzYW1wbGVzW2lkeDBdLnBvd2VyOworCWlmIChkZW5vbWluYXRvciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlnYWluczAgPSAoczMyKSBzYW1wbGVzW2lkeDBdLmdhaW5faWR4ICogKDEgPDwgMTkpOworCWdhaW5zMSA9IChzMzIpIHNhbXBsZXNbaWR4MV0uZ2Fpbl9pZHggKiAoMSA8PCAxOSk7CisJcmVzID0KKwkgICAgZ2FpbnMwICsgKGdhaW5zMSAtIGdhaW5zMCkgKiAoKHMzMikgcG93ZXIgLQorCQkJCQkgIChzMzIpIHNhbXBsZXNbaWR4MF0ucG93ZXIpIC8KKwkgICAgZGVub21pbmF0b3IgKyAoMSA8PCAxOCk7CisJKm5ld19pZHggPSByZXMgPj4gMTk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfaHdfcmVnX2luaXRfY2hhbm5lbF9ncm91cHMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXUzMiBpOworCXMzMiByYXRlX2lkeDsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwljb25zdCBzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwICpncm91cDsKKworCURfUE9XRVIoIkluaXRpYWxpemluZyBmYWN0b3J5IGNhbGliIGluZm8gZnJvbSBFRVBST01cbiIpOworCisJZm9yIChpID0gMDsgaSA8IElMX05VTV9UWF9DQUxJQl9HUk9VUFM7IGkrKykgeworCQlzOCAqY2xpcF9wd3JzOwkvKiB0YWJsZSBvZiBwb3dlciBsZXZlbHMgZm9yIGVhY2ggcmF0ZSAqLworCQlzOCBzYXR1cl9wd3I7CS8qIHNhdHVyYXRpb24gcG93ZXIgZm9yIGVhY2ggY2hubCBncm91cCAqLworCQlncm91cCA9ICZlZXByb20tPmdyb3Vwc1tpXTsKKworCQkvKiBzYW5pdHkgY2hlY2sgb24gZmFjdG9yeSBzYXR1cmF0aW9uIHBvd2VyIHZhbHVlICovCisJCWlmIChncm91cC0+c2F0dXJhdGlvbl9wb3dlciA8IDQwKSB7CisJCQlJTF9XQVJOKCJFcnJvcjogc2F0dXJhdGlvbiBwb3dlciBpcyAlZCwgIgorCQkJCSJsZXNzIHRoYW4gbWluaW11bSBleHBlY3RlZCA0MFxuIiwKKwkJCQlncm91cC0+c2F0dXJhdGlvbl9wb3dlcik7CisJCQlyZXR1cm47CisJCX0KKworCQkvKgorCQkgKiBEZXJpdmUgcmVxdWVzdGVkIHBvd2VyIGxldmVscyBmb3IgZWFjaCByYXRlLCBiYXNlZCBvbgorCQkgKiAgIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAoc2F0dXJhdGlvbiBwb3dlciBmb3IgYmFuZCkuCisJCSAqIEJhc2ljIHZhbHVlIGlzIDNkQiBkb3duIGZyb20gc2F0dXJhdGlvbiwgd2l0aCBmdXJ0aGVyCisJCSAqICAgcG93ZXIgcmVkdWN0aW9ucyBmb3IgaGlnaGVzdCAzIGRhdGEgcmF0ZXMuICBUaGVzZQorCQkgKiAgIGJhY2tvZmZzIHByb3ZpZGUgaGVhZHJvb20gZm9yIGhpZ2ggcmF0ZSBtb2R1bGF0aW9uCisJCSAqICAgcG93ZXIgcGVha3MsIHdpdGhvdXQgdG9vIG11Y2ggZGlzdG9ydGlvbiAoY2xpcHBpbmcpLgorCQkgKi8KKwkJLyogd2UnbGwgZmlsbCBpbiB0aGlzIGFycmF5IHdpdGggaC93IG1heCBwb3dlciBsZXZlbHMgKi8KKwkJY2xpcF9wd3JzID0gKHM4ICopIGlsLT5fMzk0NS5jbGlwX2dyb3Vwc1tpXS5jbGlwX3Bvd2VyczsKKworCQkvKiBkaXZpZGUgZmFjdG9yeSBzYXR1cmF0aW9uIHBvd2VyIGJ5IDIgdG8gZmluZCAtM2RCIGxldmVsICovCisJCXNhdHVyX3B3ciA9IChzOCkgKGdyb3VwLT5zYXR1cmF0aW9uX3Bvd2VyID4+IDEpOworCisJCS8qIGZpbGwgaW4gY2hhbm5lbCBncm91cCdzIG5vbWluYWwgcG93ZXJzIGZvciBlYWNoIHJhdGUgKi8KKwkJZm9yIChyYXRlX2lkeCA9IDA7IHJhdGVfaWR4IDwgUkFURV9DT1VOVF8zOTQ1OworCQkgICAgIHJhdGVfaWR4KyssIGNsaXBfcHdycysrKSB7CisJCQlzd2l0Y2ggKHJhdGVfaWR4KSB7CisJCQljYXNlIFJBVEVfMzZNX0lEWF9UQkw6CisJCQkJaWYgKGkgPT0gMCkJLyogQi9HICovCisJCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3I7CisJCQkJZWxzZQkvKiBBICovCisJCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSA1OworCQkJCWJyZWFrOworCQkJY2FzZSBSQVRFXzQ4TV9JRFhfVEJMOgorCQkJCWlmIChpID09IDApCisJCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSA3OworCQkJCWVsc2UKKwkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDEwOworCQkJCWJyZWFrOworCQkJY2FzZSBSQVRFXzU0TV9JRFhfVEJMOgorCQkJCWlmIChpID09IDApCisJCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSA5OworCQkJCWVsc2UKKwkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDEyOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisvKioKKyAqIGlsMzk0NV90eHBvd2VyX3NldF9mcm9tX2VlcHJvbSAtIFNldCBjaGFubmVsIHBvd2VyIGluZm8gYmFzZWQgb24gRUVQUk9NCisgKgorICogU2Vjb25kIHBhc3MgKGR1cmluZyBpbml0KSB0byBzZXQgdXAgaWwtPmNoYW5uZWxfaW5mbworICoKKyAqIFNldCB1cCBUeC1wb3dlciBzZXR0aW5ncyBpbiBvdXIgY2hhbm5lbCBpbmZvIGRhdGFiYXNlIGZvciBlYWNoIFZBTElECisgKiAoZm9yIHRoaXMgZ2VvL1NLVSkgY2hhbm5lbCwgYXQgYWxsIFR4IGRhdGEgcmF0ZXMsIGJhc2VkIG9uIGVlcHJvbSB2YWx1ZXMKKyAqIGFuZCBjdXJyZW50IHRlbXBlcmF0dXJlLgorICoKKyAqIFNpbmNlIHRoaXMgaXMgYmFzZWQgb24gY3VycmVudCB0ZW1wZXJhdHVyZSAoYXQgaW5pdCB0aW1lKSwgdGhlc2UgdmFsdWVzIG1heQorICogbm90IGJlIHZhbGlkIGZvciB2ZXJ5IGxvbmcsIGJ1dCBpdCBnaXZlcyB1cyBhIHN0YXJ0aW5nL2RlZmF1bHQgcG9pbnQsCisgKiBhbmQgYWxsb3dzIHVzIHRvIGFjdGl2ZSAoaS5lLiB1c2luZyBUeCkgc2Nhbi4KKyAqCisgKiBUaGlzIGRvZXMgKm5vdCogd3JpdGUgdmFsdWVzIHRvIE5JQywganVzdCBzZXRzIHVwIG91ciBpbnRlcm5hbCB0YWJsZS4KKyAqLworaW50CitpbDM5NDVfdHhwb3dlcl9zZXRfZnJvbV9lZXByb20oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm8gPSBOVUxMOworCXN0cnVjdCBpbDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvICpwd3JfaW5mbzsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpbDM5NDVfZWVwcm9tICopaWwtPmVlcHJvbTsKKwlpbnQgZGVsdGFfaWR4OworCXU4IHJhdGVfaWR4OworCXU4IHNjYW5fdGJsX2lkeDsKKwljb25zdCBzOCAqY2xpcF9wd3JzOwkvKiBhcnJheSBvZiBwb3dlciBsZXZlbHMgZm9yIGVhY2ggcmF0ZSAqLworCXU4IGdhaW4sIGRzcF9hdHRlbjsKKwlzOCBwb3dlcjsKKwl1OCBwd3JfaWR4LCBiYXNlX3B3cl9pZHgsIGFfYmFuZDsKKwl1OCBpOworCWludCB0ZW1wZXJhdHVyZTsKKworCS8qIHNhdmUgdGVtcGVyYXR1cmUgcmVmZXJlbmNlLAorCSAqICAgc28gd2UgY2FuIGRldGVybWluZSBuZXh0IHRpbWUgdG8gY2FsaWJyYXRlICovCisJdGVtcGVyYXR1cmUgPSBpbDM5NDVfaHdfcmVnX3R4cG93ZXJfZ2V0X3RlbXBlcmF0dXJlKGlsKTsKKwlpbC0+bGFzdF90ZW1wZXJhdHVyZSA9IHRlbXBlcmF0dXJlOworCisJaWwzOTQ1X2h3X3JlZ19pbml0X2NoYW5uZWxfZ3JvdXBzKGlsKTsKKworCS8qIGluaXRpYWxpemUgVHggcG93ZXIgaW5mbyBmb3IgZWFjaCBhbmQgZXZlcnkgY2hhbm5lbCwgMi40IGFuZCA1LnggKi8KKwlmb3IgKGkgPSAwLCBjaF9pbmZvID0gaWwtPmNoYW5uZWxfaW5mbzsgaSA8IGlsLT5jaGFubmVsX2NvdW50OworCSAgICAgaSsrLCBjaF9pbmZvKyspIHsKKwkJYV9iYW5kID0gaWxfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbyk7CisJCWlmICghaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGZpbmQgdGhpcyBjaGFubmVsJ3MgY2hhbm5lbCBncm91cCAoKm5vdCogImJhbmQiKSBpZHggKi8KKwkJY2hfaW5mby0+Z3JvdXBfaWR4ID0gaWwzOTQ1X2h3X3JlZ19nZXRfY2hfZ3JwX2lkeChpbCwgY2hfaW5mbyk7CisKKwkJLyogR2V0IHRoaXMgY2hubGdycCdzIHJhdGUtPm1heC9jbGlwLXBvd2VycyB0YWJsZSAqLworCQljbGlwX3B3cnMgPQorCQkgICAgaWwtPl8zOTQ1LmNsaXBfZ3JvdXBzW2NoX2luZm8tPmdyb3VwX2lkeF0uY2xpcF9wb3dlcnM7CisKKwkJLyogY2FsY3VsYXRlIHBvd2VyIGlkeCAqYWRqdXN0bWVudCogdmFsdWUgYWNjb3JkaW5nIHRvCisJCSAqICBkaWZmIGJldHdlZW4gY3VycmVudCB0ZW1wZXJhdHVyZSBhbmQgZmFjdG9yeSB0ZW1wZXJhdHVyZSAqLworCQlkZWx0YV9pZHggPQorCQkgICAgaWwzOTQ1X2h3X3JlZ19hZGp1c3RfcG93ZXJfYnlfdGVtcCh0ZW1wZXJhdHVyZSwKKwkJCQkJCSAgICAgICBlZXByb20tPmdyb3Vwc1tjaF9pbmZvLT4KKwkJCQkJCQkJICAgICAgZ3JvdXBfaWR4XS4KKwkJCQkJCSAgICAgICB0ZW1wZXJhdHVyZSk7CisKKwkJRF9QT1dFUigiRGVsdGEgaWR4IGZvciBjaGFubmVsICVkOiAlZCBbJWRdXG4iLCBjaF9pbmZvLT5jaGFubmVsLAorCQkJZGVsdGFfaWR4LCB0ZW1wZXJhdHVyZSArIElMX1RFTVBfQ09OVkVSVCk7CisKKwkJLyogc2V0IHR4IHBvd2VyIHZhbHVlIGZvciBhbGwgT0ZETSByYXRlcyAqLworCQlmb3IgKHJhdGVfaWR4ID0gMDsgcmF0ZV9pZHggPCBJTF9PRkRNX1JBVEVTOyByYXRlX2lkeCsrKSB7CisJCQlzMzIgdW5pbml0aWFsaXplZF92YXIocG93ZXJfaWR4KTsKKwkJCWludCByYzsKKworCQkJLyogdXNlIGNoYW5uZWwgZ3JvdXAncyBjbGlwLXBvd2VyIHRhYmxlLAorCQkJICogICBidXQgZG9uJ3QgZXhjZWVkIGNoYW5uZWwncyBtYXggcG93ZXIgKi8KKwkJCXM4IHB3ciA9IG1pbihjaF9pbmZvLT5tYXhfcG93ZXJfYXZnLAorCQkJCSAgICAgY2xpcF9wd3JzW3JhdGVfaWR4XSk7CisKKwkJCXB3cl9pbmZvID0gJmNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pZHhdOworCisJCQkvKiBnZXQgYmFzZSAoaS5lLiBhdCBmYWN0b3J5LW1lYXN1cmVkIHRlbXBlcmF0dXJlKQorCQkJICogICAgcG93ZXIgdGFibGUgaWR4IGZvciB0aGlzIHJhdGUncyBwb3dlciAqLworCQkJcmMgPSBpbDM5NDVfaHdfcmVnX2dldF9tYXRjaGVkX3Bvd2VyX2lkeChpbCwgcHdyLAorCQkJCQkJCQkgY2hfaW5mby0+CisJCQkJCQkJCSBncm91cF9pZHgsCisJCQkJCQkJCSAmcG93ZXJfaWR4KTsKKwkJCWlmIChyYykgeworCQkJCUlMX0VSUigiSW52YWxpZCBwb3dlciBpZHhcbiIpOworCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCXB3cl9pbmZvLT5iYXNlX3Bvd2VyX2lkeCA9ICh1OCkgcG93ZXJfaWR4OworCisJCQkvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRlICovCisJCQlwb3dlcl9pZHggKz0gZGVsdGFfaWR4OworCisJCQkvKiBzdGF5IHdpdGhpbiByYW5nZSBvZiBnYWluIHRhYmxlICovCisJCQlwb3dlcl9pZHggPSBpbDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pZHgocG93ZXJfaWR4KTsKKworCQkJLyogZmlsbCAxIE9GRE0gcmF0ZSdzIGlsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8gc3RydWN0ICovCisJCQlwd3JfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcHdyOworCQkJcHdyX2luZm8tPnBvd2VyX3RhYmxlX2lkeCA9ICh1OCkgcG93ZXJfaWR4OworCQkJcHdyX2luZm8tPnRwYy50eF9nYWluID0KKwkJCSAgICBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcG93ZXJfaWR4XS50eF9nYWluOworCQkJcHdyX2luZm8tPnRwYy5kc3BfYXR0ZW4gPQorCQkJICAgIHBvd2VyX2dhaW5fdGFibGVbYV9iYW5kXVtwb3dlcl9pZHhdLmRzcF9hdHRlbjsKKwkJfQorCisJCS8qIHNldCB0eCBwb3dlciBmb3IgQ0NLIHJhdGVzLCBiYXNlZCBvbiBPRkRNIDEyIE1iaXQgc2V0dGluZ3MgKi8KKwkJcHdyX2luZm8gPSAmY2hfaW5mby0+cG93ZXJfaW5mb1tSQVRFXzEyTV9JRFhfVEJMXTsKKwkJcG93ZXIgPSBwd3JfaW5mby0+cmVxdWVzdGVkX3Bvd2VyICsgSUxfQ0NLX0ZST01fT0ZETV9QT1dFUl9ESUZGOworCQlwd3JfaWR4ID0gcHdyX2luZm8tPnBvd2VyX3RhYmxlX2lkeCArIElMX0NDS19GUk9NX09GRE1fSURYX0RJRkY7CisJCWJhc2VfcHdyX2lkeCA9CisJCSAgICBwd3JfaW5mby0+YmFzZV9wb3dlcl9pZHggKyBJTF9DQ0tfRlJPTV9PRkRNX0lEWF9ESUZGOworCisJCS8qIHN0YXkgd2l0aGluIHRhYmxlIHJhbmdlICovCisJCXB3cl9pZHggPSBpbDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pZHgocHdyX2lkeCk7CisJCWdhaW4gPSBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcHdyX2lkeF0udHhfZ2FpbjsKKwkJZHNwX2F0dGVuID0gcG93ZXJfZ2Fpbl90YWJsZVthX2JhbmRdW3B3cl9pZHhdLmRzcF9hdHRlbjsKKworCQkvKiBmaWxsIGVhY2ggQ0NLIHJhdGUncyBpbDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvIHN0cnVjdHVyZQorCQkgKiBOT1RFOiAgQWxsIENDSy1yYXRlIFR4cHdycyBhcmUgdGhlIHNhbWUgZm9yIGEgZ2l2ZW4gY2hubCEKKwkJICogTk9URTogIENDSyByYXRlcyBzdGFydCBhdCBlbmQgb2YgT0ZETSByYXRlcyEgKi8KKwkJZm9yIChyYXRlX2lkeCA9IDA7IHJhdGVfaWR4IDwgSUxfQ0NLX1JBVEVTOyByYXRlX2lkeCsrKSB7CisJCQlwd3JfaW5mbyA9CisJCQkgICAgJmNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pZHggKyBJTF9PRkRNX1JBVEVTXTsKKwkJCXB3cl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgPSBwb3dlcjsKKwkJCXB3cl9pbmZvLT5wb3dlcl90YWJsZV9pZHggPSBwd3JfaWR4OworCQkJcHdyX2luZm8tPmJhc2VfcG93ZXJfaWR4ID0gYmFzZV9wd3JfaWR4OworCQkJcHdyX2luZm8tPnRwYy50eF9nYWluID0gZ2FpbjsKKwkJCXB3cl9pbmZvLT50cGMuZHNwX2F0dGVuID0gZHNwX2F0dGVuOworCQl9CisKKwkJLyogc2V0IHNjYW4gdHggcG93ZXIsIDFNYml0IGZvciBDQ0ssIDZNYml0IGZvciBPRkRNICovCisJCWZvciAoc2Nhbl90YmxfaWR4ID0gMDsgc2Nhbl90YmxfaWR4IDwgSUxfTlVNX1NDQU5fUkFURVM7CisJCSAgICAgc2Nhbl90YmxfaWR4KyspIHsKKwkJCXMzMiBhY3R1YWxfaWR4ID0KKwkJCSAgICAoc2Nhbl90YmxfaWR4ID09CisJCQkgICAgIDApID8gUkFURV8xTV9JRFhfVEJMIDogUkFURV82TV9JRFhfVEJMOworCQkJaWwzOTQ1X2h3X3JlZ19zZXRfc2Nhbl9wb3dlcihpbCwgc2Nhbl90YmxfaWR4LAorCQkJCQkJICAgICBhY3R1YWxfaWR4LCBjbGlwX3B3cnMsCisJCQkJCQkgICAgIGNoX2luZm8sIGFfYmFuZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50CitpbDM5NDVfaHdfcnhxX3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYzsKKworCWlsX3dyKGlsLCBGSDM5X1JDU1JfQ09ORklHKDApLCAwKTsKKwlyYyA9IGlsX3BvbGxfYml0KGlsLCBGSDM5X1JTU1JfU1RBVFVTLAorCQkJIEZIMzlfUlNTUl9DSE5MMF9SWF9TVEFUVVNfQ0hOTF9JRExFLCAxMDAwKTsKKwlpZiAocmMgPCAwKQorCQlJTF9FUlIoIkNhbid0IHN0b3AgUnggRE1BLlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitpbDM5NDVfaHdfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKQoreworCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7CisKKwlzdHJ1Y3QgaWwzOTQ1X3NoYXJlZCAqc2hhcmVkX2RhdGEgPSBpbC0+XzM5NDUuc2hhcmVkX3ZpcnQ7CisKKwlzaGFyZWRfZGF0YS0+dHhfYmFzZV9wdHJbdHhxX2lkXSA9IGNwdV90b19sZTMyKCh1MzIpIHR4cS0+cS5kbWFfYWRkcik7CisKKwlpbF93cihpbCwgRkgzOV9DQkNDX0NUUkwodHhxX2lkKSwgMCk7CisJaWxfd3IoaWwsIEZIMzlfQ0JDQ19CQVNFKHR4cV9pZCksIDApOworCisJaWxfd3IoaWwsIEZIMzlfVENTUl9DT05GSUcodHhxX2lkKSwKKwkgICAgICBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9SVENfTk9JTlQgfAorCSAgICAgIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9UWEYgfAorCSAgICAgIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfSUZURkQgfAorCSAgICAgIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRV9WQUwgfAorCSAgICAgIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTkFCTEUpOworCisJLyogZmFrZSByZWFkIHRvIGZsdXNoIGFsbCBwcmV2LiB3cml0ZXMgKi8KKwlfaWxfcmQoaWwsIEZIMzlfVFNTUl9DQkJfQkFTRSk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEhDTUQgdXRpbHMKKyAqLworc3RhdGljIHUxNgoraWwzOTQ1X2dldF9oY21kX3NpemUodTggY21kX2lkLCB1MTYgbGVuKQoreworCXN3aXRjaCAoY21kX2lkKSB7CisJY2FzZSBDX1JYT046CisJCXJldHVybiBzaXplb2Yoc3RydWN0IGlsMzk0NV9yeG9uX2NtZCk7CisJY2FzZSBDX1BPV0VSX1RCTDoKKwkJcmV0dXJuIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3Bvd2VydGFibGVfY21kKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gbGVuOworCX0KK30KKworc3RhdGljIHUxNgoraWwzOTQ1X2J1aWxkX2FkZHN0YV9oY21kKGNvbnN0IHN0cnVjdCBpbF9hZGRzdGFfY21kICpjbWQsIHU4ICogZGF0YSkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X2FkZHN0YV9jbWQgKmFkZHN0YSA9IChzdHJ1Y3QgaWwzOTQ1X2FkZHN0YV9jbWQgKilkYXRhOworCWFkZHN0YS0+bW9kZSA9IGNtZC0+bW9kZTsKKwltZW1jcHkoJmFkZHN0YS0+c3RhLCAmY21kLT5zdGEsIHNpemVvZihzdHJ1Y3Qgc3RhX2lkX21vZGlmeSkpOworCW1lbWNweSgmYWRkc3RhLT5rZXksICZjbWQtPmtleSwgc2l6ZW9mKHN0cnVjdCBpbDQ5NjVfa2V5aW5mbykpOworCWFkZHN0YS0+c3RhdGlvbl9mbGFncyA9IGNtZC0+c3RhdGlvbl9mbGFnczsKKwlhZGRzdGEtPnN0YXRpb25fZmxhZ3NfbXNrID0gY21kLT5zdGF0aW9uX2ZsYWdzX21zazsKKwlhZGRzdGEtPnRpZF9kaXNhYmxlX3R4ID0gY3B1X3RvX2xlMTYoMCk7CisJYWRkc3RhLT5yYXRlX25fZmxhZ3MgPSBjbWQtPnJhdGVfbl9mbGFnczsKKwlhZGRzdGEtPmFkZF9pbW1lZGlhdGVfYmFfdGlkID0gY21kLT5hZGRfaW1tZWRpYXRlX2JhX3RpZDsKKwlhZGRzdGEtPnJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkID0gY21kLT5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZDsKKwlhZGRzdGEtPmFkZF9pbW1lZGlhdGVfYmFfc3NuID0gY21kLT5hZGRfaW1tZWRpYXRlX2JhX3NzbjsKKworCXJldHVybiAodTE2KSBzaXplb2Yoc3RydWN0IGlsMzk0NV9hZGRzdGFfY21kKTsKK30KKworc3RhdGljIGludAoraWwzOTQ1X2FkZF9ic3NpZF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggKiBhZGRyLCB1OCAqIHN0YV9pZF9yKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCWludCByZXQ7CisJdTggc3RhX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoc3RhX2lkX3IpCisJCSpzdGFfaWRfciA9IElMX0lOVkFMSURfU1RBVElPTjsKKworCXJldCA9IGlsX2FkZF9zdGF0aW9uX2NvbW1vbihpbCwgY3R4LCBhZGRyLCAwLCBOVUxMLCAmc3RhX2lkKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIGFkZCBzdGF0aW9uICVwTVxuIiwgYWRkcik7CisJCXJldHVybiByZXQ7CisJfQorCisJaWYgKHN0YV9pZF9yKQorCQkqc3RhX2lkX3IgPSBzdGFfaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfTE9DQUw7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAoraWwzOTQ1X21hbmFnZV9pYnNzX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJICAgYm9vbCBhZGQpCit7CisJc3RydWN0IGlsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlpbnQgcmV0OworCisJaWYgKGFkZCkgeworCQlyZXQgPQorCQkgICAgaWwzOTQ1X2FkZF9ic3NpZF9zdGF0aW9uKGlsLCB2aWYtPmJzc19jb25mLmJzc2lkLAorCQkJCQkgICAgICZ2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQlpbDM5NDVfc3luY19zdGEoaWwsIHZpZl9wcml2LT5pYnNzX2Jzc2lkX3N0YV9pZCwKKwkJCQkoaWwtPmJhbmQgPT0KKwkJCQkgSUVFRTgwMjExX0JBTkRfNUdIWikgPyBSQVRFXzZNX1BMQ1AgOgorCQkJCVJBVEVfMU1fUExDUCk7CisJCWlsMzk0NV9yYXRlX3NjYWxlX2luaXQoaWwtPmh3LCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOworCisJCXJldHVybiAwOworCX0KKworCXJldHVybiBpbF9yZW1vdmVfc3RhdGlvbihpbCwgdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkLAorCQkJCSB2aWYtPmJzc19jb25mLmJzc2lkKTsKK30KKworLyoqCisgKiBpbDM5NDVfaW5pdF9od19yYXRlX3RhYmxlIC0gSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUgcmF0ZSBmYWxsYmFjayB0YWJsZQorICovCitpbnQKK2lsMzk0NV9pbml0X2h3X3JhdGVfdGFibGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByYywgaSwgaWR4LCBwcmV2X2lkeDsKKwlzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGluZ19jbWQgcmF0ZV9jbWQgPSB7CisJCS5yZXNlcnZlZCA9IHswLCAwLCAwfSwKKwl9OworCXN0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsaW5nX2luZm8gKnRhYmxlID0gcmF0ZV9jbWQudGFibGU7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShpbDM5NDVfcmF0ZXMpOyBpKyspIHsKKwkJaWR4ID0gaWwzOTQ1X3JhdGVzW2ldLnRhYmxlX3JzX2lkeDsKKworCQl0YWJsZVtpZHhdLnJhdGVfbl9mbGFncyA9IGNwdV90b19sZTE2KGlsMzk0NV9yYXRlc1tpXS5wbGNwKTsKKwkJdGFibGVbaWR4XS50cnlfY250ID0gaWwtPnJldHJ5X3JhdGU7CisJCXByZXZfaWR4ID0gaWwzOTQ1X2dldF9wcmV2X2llZWVfcmF0ZShpKTsKKwkJdGFibGVbaWR4XS5uZXh0X3JhdGVfaWR4ID0gaWwzOTQ1X3JhdGVzW3ByZXZfaWR4XS50YWJsZV9yc19pZHg7CisJfQorCisJc3dpdGNoIChpbC0+YmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJRF9SQVRFKCJTZWxlY3QgQSBtb2RlIHJhdGUgc2NhbGVcbiIpOworCQkvKiBJZiBvbmUgb2YgdGhlIGZvbGxvd2luZyBDQ0sgcmF0ZXMgaXMgdXNlZCwKKwkJICogaGF2ZSBpdCBmYWxsIGJhY2sgdG8gdGhlIDZNIE9GRE0gcmF0ZSAqLworCQlmb3IgKGkgPSBSQVRFXzFNX0lEWF9UQkw7IGkgPD0gUkFURV8xMU1fSURYX1RCTDsgaSsrKQorCQkJdGFibGVbaV0ubmV4dF9yYXRlX2lkeCA9CisJCQkgICAgaWwzOTQ1X3JhdGVzW0lMX0ZJUlNUX09GRE1fUkFURV0udGFibGVfcnNfaWR4OworCisJCS8qIERvbid0IGZhbGwgYmFjayB0byBDQ0sgcmF0ZXMgKi8KKwkJdGFibGVbUkFURV8xMk1fSURYX1RCTF0ubmV4dF9yYXRlX2lkeCA9IFJBVEVfOU1fSURYX1RCTDsKKworCQkvKiBEb24ndCBkcm9wIG91dCBvZiBPRkRNIHJhdGVzICovCisJCXRhYmxlW1JBVEVfNk1fSURYX1RCTF0ubmV4dF9yYXRlX2lkeCA9CisJCSAgICBpbDM5NDVfcmF0ZXNbSUxfRklSU1RfT0ZETV9SQVRFXS50YWJsZV9yc19pZHg7CisJCWJyZWFrOworCisJY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgorCQlEX1JBVEUoIlNlbGVjdCBCL0cgbW9kZSByYXRlIHNjYWxlXG4iKTsKKwkJLyogSWYgYW4gT0ZETSByYXRlIGlzIHVzZWQsIGhhdmUgaXQgZmFsbCBiYWNrIHRvIHRoZQorCQkgKiAxTSBDQ0sgcmF0ZXMgKi8KKworCQlpZiAoIShpbC0+XzM5NDUuc3RhX3N1cHBfcmF0ZXMgJiBJTF9PRkRNX1JBVEVTX01BU0spICYmCisJCSAgICBpbF9pc19hc3NvY2lhdGVkKGlsKSkgeworCisJCQlpZHggPSBJTF9GSVJTVF9DQ0tfUkFURTsKKwkJCWZvciAoaSA9IFJBVEVfNk1fSURYX1RCTDsgaSA8PSBSQVRFXzU0TV9JRFhfVEJMOyBpKyspCisJCQkJdGFibGVbaV0ubmV4dF9yYXRlX2lkeCA9CisJCQkJICAgIGlsMzk0NV9yYXRlc1tpZHhdLnRhYmxlX3JzX2lkeDsKKworCQkJaWR4ID0gUkFURV8xMU1fSURYX1RCTDsKKwkJCS8qIENDSyBzaG91bGRuJ3QgZmFsbCBiYWNrIHRvIE9GRE0uLi4gKi8KKwkJCXRhYmxlW2lkeF0ubmV4dF9yYXRlX2lkeCA9IFJBVEVfNU1fSURYX1RCTDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCVdBUk5fT04oMSk7CisJCWJyZWFrOworCX0KKworCS8qIFVwZGF0ZSB0aGUgcmF0ZSBzY2FsaW5nIGZvciBjb250cm9sIGZyYW1lIFR4ICovCisJcmF0ZV9jbWQudGFibGVfaWQgPSAwOworCXJjID0gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1JBVEVfU0NBTEUsIHNpemVvZihyYXRlX2NtZCksICZyYXRlX2NtZCk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisKKwkvKiBVcGRhdGUgdGhlIHJhdGUgc2NhbGluZyBmb3IgZGF0YSBmcmFtZSBUeCAqLworCXJhdGVfY21kLnRhYmxlX2lkID0gMTsKKwlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1JBVEVfU0NBTEUsIHNpemVvZihyYXRlX2NtZCksICZyYXRlX2NtZCk7Cit9CisKKy8qIENhbGxlZCB3aGVuIGluaXRpYWxpemluZyBkcml2ZXIgKi8KK2ludAoraWwzOTQ1X2h3X3NldF9od19wYXJhbXMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCW1lbXNldCgodm9pZCAqKSZpbC0+aHdfcGFyYW1zLCAwLCBzaXplb2Yoc3RydWN0IGlsX2h3X3BhcmFtcykpOworCisJaWwtPl8zOTQ1LnNoYXJlZF92aXJ0ID0KKwkgICAgZG1hX2FsbG9jX2NvaGVyZW50KCZpbC0+cGNpX2Rldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGlsMzk0NV9zaGFyZWQpLAorCQkJICAgICAgICZpbC0+XzM5NDUuc2hhcmVkX3BoeXMsIEdGUF9LRVJORUwpOworCWlmICghaWwtPl8zOTQ1LnNoYXJlZF92aXJ0KSB7CisJCUlMX0VSUigiZmFpbGVkIHRvIGFsbG9jYXRlIHBjaSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiBBc3NpZ24gbnVtYmVyIG9mIFVzYWJsZSBUWCBxdWV1ZXMgKi8KKwlpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtID0gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CisKKwlpbC0+aHdfcGFyYW1zLnRmZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpbDM5NDVfdGZkKTsKKwlpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIgPSBnZXRfb3JkZXIoSUxfUlhfQlVGX1NJWkVfM0spOworCWlsLT5od19wYXJhbXMubWF4X3J4cV9zaXplID0gUlhfUVVFVUVfU0laRTsKKwlpbC0+aHdfcGFyYW1zLm1heF9yeHFfbG9nID0gUlhfUVVFVUVfU0laRV9MT0c7CisJaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnMgPSBJTDM5NDVfU1RBVElPTl9DT1VOVDsKKwlpbC0+Y3R4LmJjYXN0X3N0YV9pZCA9IElMMzk0NV9CUk9BRENBU1RfSUQ7CisKKwlpbC0+c3RhX2tleV9tYXhfbnVtID0gU1RBX0tFWV9NQVhfTlVNOworCisJaWwtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZyA9IEZIMzlfUlNDU1JfQ0hOTDBfV1BUUjsKKwlpbC0+aHdfcGFyYW1zLm1heF9iZWFjb25faXRydmwgPSBJTDM5X01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUw7CisJaWwtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyA9IElMMzk0NV9FWFRfQkVBQ09OX1RJTUVfUE9TOworCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludAoraWwzOTQ1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsMzk0NV9mcmFtZSAqZnJhbWUsCisJCQkgdTggcmF0ZSkKK3sKKwlzdHJ1Y3QgaWwzOTQ1X3R4X2JlYWNvbl9jbWQgKnR4X2JlYWNvbl9jbWQ7CisJdW5zaWduZWQgaW50IGZyYW1lX3NpemU7CisKKwl0eF9iZWFjb25fY21kID0gKHN0cnVjdCBpbDM5NDVfdHhfYmVhY29uX2NtZCAqKSZmcmFtZS0+dTsKKwltZW1zZXQodHhfYmVhY29uX2NtZCwgMCwgc2l6ZW9mKCp0eF9iZWFjb25fY21kKSk7CisKKwl0eF9iZWFjb25fY21kLT50eC5zdGFfaWQgPSBpbC0+Y3R4LmJjYXN0X3N0YV9pZDsKKwl0eF9iZWFjb25fY21kLT50eC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKKworCWZyYW1lX3NpemUgPQorCSAgICBpbDM5NDVfZmlsbF9iZWFjb25fZnJhbWUoaWwsIHR4X2JlYWNvbl9jbWQtPmZyYW1lLAorCQkJCSAgICAgc2l6ZW9mKGZyYW1lLT51KSAtIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOworCisJQlVHX09OKGZyYW1lX3NpemUgPiBNQVhfTVBEVV9TSVpFKTsKKwl0eF9iZWFjb25fY21kLT50eC5sZW4gPSBjcHVfdG9fbGUxNigodTE2KSBmcmFtZV9zaXplKTsKKworCXR4X2JlYWNvbl9jbWQtPnR4LnJhdGUgPSByYXRlOworCXR4X2JlYWNvbl9jbWQtPnR4LnR4X2ZsYWdzID0KKwkgICAgKFRYX0NNRF9GTEdfU0VRX0NUTF9NU0sgfCBUWF9DTURfRkxHX1RTRl9NU0spOworCisJLyogc3VwcF9yYXRlc1swXSA9PSBPRkRNIHN0YXJ0IGF0IElMX0ZJUlNUX09GRE1fUkFURSAqLworCXR4X2JlYWNvbl9jbWQtPnR4LnN1cHBfcmF0ZXNbMF0gPQorCSAgICAoSUxfT0ZETV9CQVNJQ19SQVRFU19NQVNLID4+IElMX0ZJUlNUX09GRE1fUkFURSkgJiAweEZGOworCisJdHhfYmVhY29uX2NtZC0+dHguc3VwcF9yYXRlc1sxXSA9IChJTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyAmIDB4Rik7CisKKwlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpbDM5NDVfdHhfYmVhY29uX2NtZCkgKyBmcmFtZV9zaXplOworfQorCit2b2lkCitpbDM5NDVfaHdfaGFuZGxlcl9zZXR1cChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwtPmhhbmRsZXJzW0NfVFhdID0gaWwzOTQ1X2hkbF90eDsKKwlpbC0+aGFuZGxlcnNbTl8zOTQ1X1JYXSA9IGlsMzk0NV9oZGxfcng7Cit9CisKK3ZvaWQKK2lsMzk0NV9od19zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlJTklUX0RFTEFZRURfV09SSygmaWwtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMsCisJCQkgIGlsMzk0NV9iZ19yZWdfdHhwb3dlcl9wZXJpb2RpYyk7Cit9CisKK3ZvaWQKK2lsMzk0NV9od19jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJY2FuY2VsX2RlbGF5ZWRfd29yaygmaWwtPl8zOTQ1LnRoZXJtYWxfcGVyaW9kaWMpOworfQorCisvKiBjaGVjayBjb250ZW50cyBvZiBzcGVjaWFsIGJvb3RzdHJhcCB1Q29kZSBTUkFNICovCitzdGF0aWMgaW50CitpbDM5NDVfdmVyaWZ5X2JzbShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJX19sZTMyICppbWFnZSA9IGlsLT51Y29kZV9ib290LnZfYWRkcjsKKwl1MzIgbGVuID0gaWwtPnVjb2RlX2Jvb3QubGVuOworCXUzMiByZWc7CisJdTMyIHZhbDsKKworCURfSU5GTygiQmVnaW4gdmVyaWZ5IGJzbVxuIik7CisKKwkvKiB2ZXJpZnkgQlNNIFNSQU0gY29udGVudHMgKi8KKwl2YWwgPSBpbF9yZF9wcnBoKGlsLCBCU01fV1JfRFdDT1VOVF9SRUcpOworCWZvciAocmVnID0gQlNNX1NSQU1fTE9XRVJfQk9VTkQ7IHJlZyA8IEJTTV9TUkFNX0xPV0VSX0JPVU5EICsgbGVuOworCSAgICAgcmVnICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7CisJCXZhbCA9IGlsX3JkX3BycGgoaWwsIHJlZyk7CisJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgeworCQkJSUxfRVJSKCJCU00gdUNvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZCBhdCAiCisJCQkgICAgICAgImFkZHIgMHglMDhYKyV1IChvZiAldSksIGlzIDB4JXgsIHMvYiAweCV4XG4iLAorCQkJICAgICAgIEJTTV9TUkFNX0xPV0VSX0JPVU5ELCByZWcgLSBCU01fU1JBTV9MT1dFUl9CT1VORCwKKwkJCSAgICAgICBsZW4sIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCURfSU5GTygiQlNNIGJvb3RzdHJhcCB1Q29kZSBpbWFnZSBPS1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEVFUFJPTSByZWxhdGVkIGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDbGVhciB0aGUgT1dORVJfTVNLLCB0byBlc3RhYmxpc2ggZHJpdmVyIChpbnN0ZWFkIG9mIHVDb2RlIHJ1bm5pbmcgb24KKyAqIGVtYmVkZGVkIGNvbnRyb2xsZXIpIGFzIEVFUFJPTSByZWFkZXI7IGVhY2ggcmVhZCBpcyBhIHNlcmllcyBvZiBwdWxzZXMKKyAqIHRvL2Zyb20gdGhlIEVFUFJPTSBjaGlwLCBub3QgYSBzaW5nbGUgZXZlbnQsIHNvIGV2ZW4gcmVhZHMgY291bGQgY29uZmxpY3QKKyAqIGlmIHRoZXkgd2VyZW4ndCBhcmJpdHJhdGVkIGJ5IHNvbWUgb3duZXJzaGlwIG1lY2hhbmlzbS4gIEhlcmUsIHRoZSBkcml2ZXIKKyAqIHNpbXBseSBjbGFpbXMgb3duZXJzaGlwLCB3aGljaCBzaG91bGQgYmUgc2FmZSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCisgKiAoaS5lLiBiZWZvcmUgbG9hZGluZyB1Q29kZSEpLgorICovCitzdGF0aWMgaW50CitpbDM5NDVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfaWxfY2xlYXJfYml0KGlsLCBDU1JfRUVQUk9NX0dQLCBDU1JfRUVQUk9NX0dQX0lGX09XTkVSX01TSyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbDM5NDVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm47Cit9CisKKyAvKioKKyAgKiBpbDM5NDVfbG9hZF9ic20gLSBMb2FkIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMKKyAgKgorICAqIEJTTSBvcGVyYXRpb246CisgICoKKyAgKiBUaGUgQm9vdHN0cmFwIFN0YXRlIE1hY2hpbmUgKEJTTSkgc3RvcmVzIGEgc2hvcnQgYm9vdHN0cmFwIHVDb2RlIHByb2dyYW0KKyAgKiBpbiBzcGVjaWFsIFNSQU0gdGhhdCBkb2VzIG5vdCBwb3dlciBkb3duIGR1cmluZyBSRktJTEwuICBXaGVuIHBvd2VyaW5nIGJhY2sKKyAgKiB1cCBhZnRlciBwb3dlci1zYXZpbmcgc2xlZXBzIChvciBkdXJpbmcgaW5pdGlhbCB1Q29kZSBsb2FkKSwgdGhlIEJTTSBsb2FkcworICAqIHRoZSBib290c3RyYXAgcHJvZ3JhbSBpbnRvIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IsIGFuZCBzdGFydHMgaXQuCisgICoKKyAgKiBUaGUgYm9vdHN0cmFwIHByb2dyYW0gbG9hZHMgKHZpYSBETUEpIGluc3RydWN0aW9ucyBhbmQgZGF0YSBmb3IgYSBuZXcKKyAgKiBwcm9ncmFtIGZyb20gaG9zdCBEUkFNIGxvY2F0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIGhvc3QgZHJpdmVyIGluIHRoZQorICAqIEJTTV9EUkFNXyogcmVnaXN0ZXJzLiAgT25jZSB0aGUgbmV3IHByb2dyYW0gaXMgbG9hZGVkLCBpdCBzdGFydHMKKyAgKiBhdXRvbWF0aWNhbGx5LgorICAqCisgICogV2hlbiBpbml0aWFsaXppbmcgdGhlIE5JQywgdGhlIGhvc3QgZHJpdmVyIHBvaW50cyB0aGUgQlNNIHRvIHRoZQorICAqICJpbml0aWFsaXplIiB1Q29kZSBpbWFnZS4gIFRoaXMgdUNvZGUgc2V0cyB1cCBzb21lIGludGVybmFsIGRhdGEsIHRoZW4KKyAgKiBub3RpZmllcyBob3N0IHZpYSAiaW5pdGlhbGl6ZSBhbGl2ZSIgdGhhdCBpdCBpcyBjb21wbGV0ZS4KKyAgKgorICAqIFRoZSBob3N0IHRoZW4gcmVwbGFjZXMgdGhlIEJTTV9EUkFNXyogcG9pbnRlciB2YWx1ZXMgdG8gcG9pbnQgdG8gdGhlCisgICogbm9ybWFsIHJ1bnRpbWUgdUNvZGUgaW5zdHJ1Y3Rpb25zIGFuZCBhIGJhY2t1cCB1Q29kZSBkYXRhIGNhY2hlIGJ1ZmZlcgorICAqIChmaWxsZWQgaW5pdGlhbGx5IHdpdGggc3RhcnRpbmcgZGF0YSB2YWx1ZXMgZm9yIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IpLAorICAqIHRoZW4gdHJpZ2dlcnMgdGhlICJpbml0aWFsaXplIiB1Q29kZSB0byBsb2FkIGFuZCBsYXVuY2ggdGhlIHJ1bnRpbWUgdUNvZGUsCisgICogd2hpY2ggYmVnaW5zIG5vcm1hbCBvcGVyYXRpb24uCisgICoKKyAgKiBXaGVuIGRvaW5nIGEgcG93ZXItc2F2ZSBzaHV0ZG93biwgcnVudGltZSB1Q29kZSBzYXZlcyBkYXRhIFNSQU0gaW50bworICAqIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbiBEUkFNIGJlZm9yZSBTUkFNIGlzIHBvd2VyZWQgZG93bi4KKyAgKgorICAqIFdoZW4gcG93ZXJpbmcgYmFjayB1cCwgdGhlIEJTTSBsb2FkcyB0aGUgYm9vdHN0cmFwIHByb2dyYW0uICBUaGlzIHJlbG9hZHMKKyAgKiB0aGUgcnVudGltZSB1Q29kZSBpbnN0cnVjdGlvbnMgYW5kIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbnRvIFNSQU0sCisgICogYW5kIHJlLWxhdW5jaGVzIHRoZSBydW50aW1lIHVDb2RlIGZyb20gd2hlcmUgaXQgbGVmdCBvZmYuCisgICovCitzdGF0aWMgaW50CitpbDM5NDVfbG9hZF9ic20oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCV9fbGUzMiAqaW1hZ2UgPSBpbC0+dWNvZGVfYm9vdC52X2FkZHI7CisJdTMyIGxlbiA9IGlsLT51Y29kZV9ib290LmxlbjsKKwlkbWFfYWRkcl90IHBpbnN0OworCWRtYV9hZGRyX3QgcGRhdGE7CisJdTMyIGluc3RfbGVuOworCXUzMiBkYXRhX2xlbjsKKwlpbnQgcmM7CisJaW50IGk7CisJdTMyIGRvbmU7CisJdTMyIHJlZ19vZmZzZXQ7CisKKwlEX0lORk8oIkJlZ2luIGxvYWQgYnNtXG4iKTsKKworCS8qIG1ha2Ugc3VyZSBib290c3RyYXAgcHJvZ3JhbSBpcyBubyBsYXJnZXIgdGhhbiBCU00ncyBTUkFNIHNpemUgKi8KKwlpZiAobGVuID4gSUwzOV9NQVhfQlNNX1NJWkUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogVGVsbCBib290c3RyYXAgdUNvZGUgd2hlcmUgdG8gZmluZCB0aGUgIkluaXRpYWxpemUiIHVDb2RlCisJICogICBpbiBob3N0IERSQU0gLi4uIGhvc3QgRFJBTSBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgMzE6MCBmb3IgMzk0NS4KKwkgKiBOT1RFOiAgaWwzOTQ1X2luaXRpYWxpemVfYWxpdmVfc3RhcnQoKSB3aWxsIHJlcGxhY2UgdGhlc2UgdmFsdWVzLAorCSAqICAgICAgICBhZnRlciB0aGUgImluaXRpYWxpemUiIHVDb2RlIGhhcyBydW4sIHRvIHBvaW50IHRvCisJICogICAgICAgIHJ1bnRpbWUvcHJvdG9jb2wgaW5zdHJ1Y3Rpb25zIGFuZCBiYWNrdXAgZGF0YSBjYWNoZS4gKi8KKwlwaW5zdCA9IGlsLT51Y29kZV9pbml0LnBfYWRkcjsKKwlwZGF0YSA9IGlsLT51Y29kZV9pbml0X2RhdGEucF9hZGRyOworCWluc3RfbGVuID0gaWwtPnVjb2RlX2luaXQubGVuOworCWRhdGFfbGVuID0gaWwtPnVjb2RlX2luaXRfZGF0YS5sZW47CisKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9JTlNUX1BUUl9SRUcsIHBpbnN0KTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX1BUUl9SRUcsIHBkYXRhKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcsIGluc3RfbGVuKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcsIGRhdGFfbGVuKTsKKworCS8qIEZpbGwgQlNNIG1lbW9yeSB3aXRoIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMgKi8KKwlmb3IgKHJlZ19vZmZzZXQgPSBCU01fU1JBTV9MT1dFUl9CT1VORDsKKwkgICAgIHJlZ19vZmZzZXQgPCBCU01fU1JBTV9MT1dFUl9CT1VORCArIGxlbjsKKwkgICAgIHJlZ19vZmZzZXQgKz0gc2l6ZW9mKHUzMiksIGltYWdlKyspCisJCV9pbF93cl9wcnBoKGlsLCByZWdfb2Zmc2V0LCBsZTMyX3RvX2NwdSgqaW1hZ2UpKTsKKworCXJjID0gaWwzOTQ1X3ZlcmlmeV9ic20oaWwpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJLyogVGVsbCBCU00gdG8gY29weSBmcm9tIEJTTSBTUkFNIGludG8gaW5zdHJ1Y3Rpb24gU1JBTSwgd2hlbiBhc2tlZCAqLworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9NRU1fU1JDX1JFRywgMHgwKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fV1JfTUVNX0RTVF9SRUcsIElMMzlfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9EV0NPVU5UX1JFRywgbGVuIC8gc2l6ZW9mKHUzMikpOworCisJLyogTG9hZCBib290c3RyYXAgY29kZSBpbnRvIGluc3RydWN0aW9uIFNSQU0gbm93LAorCSAqICAgdG8gcHJlcGFyZSB0byBsb2FkICJpbml0aWFsaXplIiB1Q29kZSAqLworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9DVFJMX1JFRywgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCk7CisKKwkvKiBXYWl0IGZvciBsb2FkIG9mIGJvb3RzdHJhcCB1Q29kZSB0byBmaW5pc2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKwkJZG9uZSA9IGlsX3JkX3BycGgoaWwsIEJTTV9XUl9DVFJMX1JFRyk7CisJCWlmICghKGRvbmUgJiBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUKSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KKwlpZiAoaSA8IDEwMCkKKwkJRF9JTkZPKCJCU00gd3JpdGUgY29tcGxldGUsIHBvbGwgJWQgaXRlcmF0aW9uc1xuIiwgaSk7CisJZWxzZSB7CisJCUlMX0VSUigiQlNNIHdyaXRlIGRpZCBub3QgY29tcGxldGUhXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyogRW5hYmxlIGZ1dHVyZSBib290IGxvYWRzIHdoZW5ldmVyIHBvd2VyIG1hbmFnZW1lbnQgdW5pdCB0cmlnZ2VycyBpdAorCSAqICAgKGUuZy4gd2hlbiBwb3dlcmluZyBiYWNrIHVwIGFmdGVyIHBvd2VyLXNhdmUgc2h1dGRvd24pICovCisJaWxfd3JfcHJwaChpbCwgQlNNX1dSX0NUUkxfUkVHLCBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUX0VOKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlsX2hjbWRfb3BzIGlsMzk0NV9oY21kID0geworCS5yeG9uX2Fzc29jID0gaWwzOTQ1X3NlbmRfcnhvbl9hc3NvYywKKwkuY29tbWl0X3J4b24gPSBpbDM5NDVfY29tbWl0X3J4b24sCit9OworCitzdGF0aWMgc3RydWN0IGlsX2xpYl9vcHMgaWwzOTQ1X2xpYiA9IHsKKwkudHhxX2F0dGFjaF9idWZfdG9fdGZkID0gaWwzOTQ1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZCwKKwkudHhxX2ZyZWVfdGZkID0gaWwzOTQ1X2h3X3R4cV9mcmVlX3RmZCwKKwkudHhxX2luaXQgPSBpbDM5NDVfaHdfdHhfcXVldWVfaW5pdCwKKwkubG9hZF91Y29kZSA9IGlsMzk0NV9sb2FkX2JzbSwKKwkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaWwzOTQ1X2R1bXBfbmljX2Vycm9yX2xvZywKKwkuYXBtX29wcyA9IHsKKwkJICAgIC5pbml0ID0gaWwzOTQ1X2FwbV9pbml0LAorCQkgICAgLmNvbmZpZyA9IGlsMzk0NV9uaWNfY29uZmlnLAorCQkgICAgfSwKKwkuZWVwcm9tX29wcyA9IHsKKwkJICAgICAgIC5yZWd1bGF0b3J5X2JhbmRzID0geworCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8xX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8zX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF80X0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF81X0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwLAorCQkJCQkgICAgfSwKKwkJICAgICAgIC5hY3F1aXJlX3NlbWFwaG9yZSA9IGlsMzk0NV9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUsCisJCSAgICAgICAucmVsZWFzZV9zZW1hcGhvcmUgPSBpbDM5NDVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlLAorCQkgICAgICAgfSwKKwkuc2VuZF90eF9wb3dlciA9IGlsMzk0NV9zZW5kX3R4X3Bvd2VyLAorCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaWwzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIsCisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworCS5kZWJ1Z2ZzX29wcyA9IHsKKwkJCS5yeF9zdGF0c19yZWFkID0gaWwzOTQ1X3Vjb2RlX3J4X3N0YXRzX3JlYWQsCisJCQkudHhfc3RhdHNfcmVhZCA9IGlsMzk0NV91Y29kZV90eF9zdGF0c19yZWFkLAorCQkJLmdlbmVyYWxfc3RhdHNfcmVhZCA9IGlsMzk0NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQsCisJCQl9LAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlsX2xlZ2FjeV9vcHMgaWwzOTQ1X2xlZ2FjeV9vcHMgPSB7CisJLnBvc3RfYXNzb2NpYXRlID0gaWwzOTQ1X3Bvc3RfYXNzb2NpYXRlLAorCS5jb25maWdfYXAgPSBpbDM5NDVfY29uZmlnX2FwLAorCS5tYW5hZ2VfaWJzc19zdGF0aW9uID0gaWwzOTQ1X21hbmFnZV9pYnNzX3N0YXRpb24sCit9OworCitzdGF0aWMgc3RydWN0IGlsX2hjbWRfdXRpbHNfb3BzIGlsMzk0NV9oY21kX3V0aWxzID0geworCS5nZXRfaGNtZF9zaXplID0gaWwzOTQ1X2dldF9oY21kX3NpemUsCisJLmJ1aWxkX2FkZHN0YV9oY21kID0gaWwzOTQ1X2J1aWxkX2FkZHN0YV9oY21kLAorCS5yZXF1ZXN0X3NjYW4gPSBpbDM5NDVfcmVxdWVzdF9zY2FuLAorCS5wb3N0X3NjYW4gPSBpbDM5NDVfcG9zdF9zY2FuLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9vcHMgaWwzOTQ1X29wcyA9IHsKKwkubGliID0gJmlsMzk0NV9saWIsCisJLmhjbWQgPSAmaWwzOTQ1X2hjbWQsCisJLnV0aWxzID0gJmlsMzk0NV9oY21kX3V0aWxzLAorCS5sZWQgPSAmaWwzOTQ1X2xlZF9vcHMsCisJLmxlZ2FjeSA9ICZpbDM5NDVfbGVnYWN5X29wcywKKwkuaWVlZTgwMjExX29wcyA9ICZpbDM5NDVfaHdfb3BzLAorfTsKKworc3RhdGljIHN0cnVjdCBpbF9iYXNlX3BhcmFtcyBpbDM5NDVfYmFzZV9wYXJhbXMgPSB7CisJLmVlcHJvbV9zaXplID0gSUwzOTQ1X0VFUFJPTV9JTUdfU0laRSwKKwkubnVtX29mX3F1ZXVlcyA9IElMMzlfTlVNX1FVRVVFUywKKwkucGxsX2NmZ192YWwgPSBDU1IzOV9BTkFfUExMX0NGR19WQUwsCisJLnNldF9sMHMgPSBmYWxzZSwKKwkudXNlX2JzbSA9IHRydWUsCisJLmxlZF9jb21wZW5zYXRpb24gPSA2NCwKKwkud2RfdGltZW91dCA9IElMX0RFRl9XRF9USU1FT1VULAorfTsKKworc3RhdGljIHN0cnVjdCBpbF9jZmcgaWwzOTQ1X2JnX2NmZyA9IHsKKwkubmFtZSA9ICIzOTQ1QkciLAorCS5md19uYW1lX3ByZSA9IElMMzk0NV9GV19QUkUsCisJLnVjb2RlX2FwaV9tYXggPSBJTDM5NDVfVUNPREVfQVBJX01BWCwKKwkudWNvZGVfYXBpX21pbiA9IElMMzk0NV9VQ09ERV9BUElfTUlOLAorCS5za3UgPSBJTF9TS1VfRywKKwkuZWVwcm9tX3ZlciA9IEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OLAorCS5vcHMgPSAmaWwzOTQ1X29wcywKKwkubW9kX3BhcmFtcyA9ICZpbDM5NDVfbW9kX3BhcmFtcywKKwkuYmFzZV9wYXJhbXMgPSAmaWwzOTQ1X2Jhc2VfcGFyYW1zLAorCS5sZWRfbW9kZSA9IElMX0xFRF9CTElOSywKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWxfY2ZnIGlsMzk0NV9hYmdfY2ZnID0geworCS5uYW1lID0gIjM5NDVBQkciLAorCS5md19uYW1lX3ByZSA9IElMMzk0NV9GV19QUkUsCisJLnVjb2RlX2FwaV9tYXggPSBJTDM5NDVfVUNPREVfQVBJX01BWCwKKwkudWNvZGVfYXBpX21pbiA9IElMMzk0NV9VQ09ERV9BUElfTUlOLAorCS5za3UgPSBJTF9TS1VfQSB8IElMX1NLVV9HLAorCS5lZXByb21fdmVyID0gRUVQUk9NXzM5NDVfRUVQUk9NX1ZFUlNJT04sCisJLm9wcyA9ICZpbDM5NDVfb3BzLAorCS5tb2RfcGFyYW1zID0gJmlsMzk0NV9tb2RfcGFyYW1zLAorCS5iYXNlX3BhcmFtcyA9ICZpbDM5NDVfYmFzZV9wYXJhbXMsCisJLmxlZF9tb2RlID0gSUxfTEVEX0JMSU5LLAorfTsKKworREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaWwzOTQ1X2h3X2NhcmRfaWRzKSA9IHsKKwl7SUxfUENJX0RFVklDRSgweDQyMjIsIDB4MTAwNSwgaWwzOTQ1X2JnX2NmZyl9LAorCXtJTF9QQ0lfREVWSUNFKDB4NDIyMiwgMHgxMDM0LCBpbDM5NDVfYmdfY2ZnKX0sCisJe0lMX1BDSV9ERVZJQ0UoMHg0MjIyLCAweDEwNDQsIGlsMzk0NV9iZ19jZmcpfSwKKwl7SUxfUENJX0RFVklDRSgweDQyMjcsIDB4MTAxNCwgaWwzOTQ1X2JnX2NmZyl9LAorCXtJTF9QQ0lfREVWSUNFKDB4NDIyMiwgUENJX0FOWV9JRCwgaWwzOTQ1X2FiZ19jZmcpfSwKKwl7SUxfUENJX0RFVklDRSgweDQyMjcsIFBDSV9BTllfSUQsIGlsMzk0NV9hYmdfY2ZnKX0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWwzOTQ1X2h3X2NhcmRfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzM5NDUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjQyZjc5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvMzk0NS5oCkBAIC0wLDAgKzEsNjA3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmbmRlZiBfX2lsXzM5NDVfaF9fCisjZGVmaW5lIF9faWxfMzk0NV9oX18KKworI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgkJLyogZm9yIHN0cnVjdCBwY2lfZGV2aWNlX2lkICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgorCisvKiBIYXJkd2FyZSBzcGVjaWZpYyBmaWxlIGRlZmluZXMgdGhlIFBDSSBJRHMgdGFibGUgZm9yIHRoYXQgaGFyZHdhcmUgbW9kdWxlICovCitleHRlcm4gY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWwzOTQ1X2h3X2NhcmRfaWRzW107CisKKyNpbmNsdWRlICJjb21tb24uaCIKKworLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgSUwzOTQ1X1VDT0RFX0FQSV9NQVggMgorCisvKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCisjZGVmaW5lIElMMzk0NV9VQ09ERV9BUElfTUlOIDEKKworI2RlZmluZSBJTDM5NDVfRldfUFJFCSJpd2x3aWZpLTM5NDUtIgorI2RlZmluZSBfSUwzOTQ1X01PRFVMRV9GSVJNV0FSRShhcGkpIElMMzk0NV9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJTDM5NDVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgX0lMMzk0NV9NT0RVTEVfRklSTVdBUkUoYXBpKQorCisvKiBEZWZhdWx0IG5vaXNlIGxldmVsIHRvIHJlcG9ydCB3aGVuIG5vaXNlIG1lYXN1cmVtZW50IGlzIG5vdCBhdmFpbGFibGUuCisgKiAgIFRoaXMgbWF5IGJlIGJlY2F1c2Ugd2UncmU6CisgKiAgIDEpICBOb3QgYXNzb2NpYXRlZCAoNDk2NSwgbm8gYmVhY29uIHN0YXRzIGJlaW5nIHNlbnQgdG8gZHJpdmVyKQorICogICAyKSAgU2Nhbm5pbmcgKG5vaXNlIG1lYXN1cmVtZW50IGRvZXMgbm90IGFwcGx5IHRvIGFzc29jaWF0ZWQgY2hhbm5lbCkKKyAqICAgMykgIFJlY2VpdmluZyBDQ0sgKDM5NDUgZGVsaXZlcnMgbm9pc2UgaW5mbyBvbmx5IGZvciBPRkRNIGZyYW1lcykKKyAqIFVzZSBkZWZhdWx0IG5vaXNlIHZhbHVlIG9mIC0xMjcgLi4uIHRoaXMgaXMgYmVsb3cgdGhlIHJhbmdlIG9mIG1lYXN1cmFibGUKKyAqICAgUnggZEJtIGZvciBlaXRoZXIgMzk0NSBvciA0OTY1LCBzbyBpdCBjYW4gaW5kaWNhdGUgInVubWVhc3VyYWJsZSIgdG8gdXNlci4KKyAqICAgQWxzbywgLTEyNyB3b3JrcyBiZXR0ZXIgdGhhbiAwIHdoZW4gYXZlcmFnaW5nIGZyYW1lcyB3aXRoL3dpdGhvdXQKKyAqICAgbm9pc2UgaW5mbyAoZS5nLiBhdmVyYWdpbmcgbWlnaHQgYmUgZG9uZSBpbiBhcHApOyBtZWFzdXJlZCBkQm0gdmFsdWVzIGFyZQorICogICBhbHdheXMgbmVnYXRpdmUgLi4uIHVzaW5nIGEgbmVnYXRpdmUgdmFsdWUgYXMgdGhlIGRlZmF1bHQga2VlcHMgYWxsCisgKiAgIGF2ZXJhZ2VzIHdpdGhpbiBhbiBzOCdzICh1c2VkIGluIHNvbWUgYXBwcykgcmFuZ2Ugb2YgbmVnYXRpdmUgdmFsdWVzLiAqLworI2RlZmluZSBJTF9OT0lTRV9NRUFTX05PVF9BVkFJTEFCTEUgKC0xMjcpCisKKy8qIE1vZHVsZSBwYXJhbWV0ZXJzIGFjY2Vzc2libGUgZnJvbSBpd2wtKi5jICovCitleHRlcm4gc3RydWN0IGlsX21vZF9wYXJhbXMgaWwzOTQ1X21vZF9wYXJhbXM7CisKK3N0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsZV9kYXRhIHsKKwl1NjQgZGF0YTsKKwlzMzIgc3VjY2Vzc19jb3VudGVyOworCXMzMiBzdWNjZXNzX3JhdGlvOworCXMzMiBjb3VudGVyOworCXMzMiBhdmVyYWdlX3RwdDsKKwl1bnNpZ25lZCBsb25nIHN0YW1wOworfTsKKworc3RydWN0IGlsMzk0NV9yc19zdGEgeworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWw7CisJczMyICpleHBlY3RlZF90cHQ7CisJdW5zaWduZWQgbG9uZyBsYXN0X3BhcnRpYWxfZmx1c2g7CisJdW5zaWduZWQgbG9uZyBsYXN0X2ZsdXNoOworCXUzMiBmbHVzaF90aW1lOworCXUzMiBsYXN0X3R4X3BhY2tldHM7CisJdTMyIHR4X3BhY2tldHM7CisJdTggdGdnOworCXU4IGZsdXNoX3BlbmRpbmc7CisJdTggc3RhcnRfcmF0ZTsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByYXRlX3NjYWxlX2ZsdXNoOworCXN0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsZV9kYXRhIHdpbltSQVRFX0NPVU5UXzM5NDVdOworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCisJc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGU7CisjZW5kaWYKKworCS8qIHVzZWQgdG8gYmUgaW4gc3RhX2luZm8gKi8KKwlpbnQgbGFzdF90eHJhdGVfaWR4OworfTsKKworLyoKKyAqIFRoZSBjb21tb24gc3RydWN0IE1VU1QgYmUgZmlyc3QgYmVjYXVzZSBpdCBpcyBzaGFyZWQgYmV0d2VlbgorICogMzk0NSBhbmQgNDk2NSEKKyAqLworc3RydWN0IGlsMzk0NV9zdGFfcHJpdiB7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdl9jb21tb24gY29tbW9uOworCXN0cnVjdCBpbDM5NDVfcnNfc3RhIHJzX3N0YTsKK307CisKK2VudW0gaWwzOTQ1X2FudGVubmEgeworCUlMX0FOVEVOTkFfRElWRVJTSVRZLAorCUlMX0FOVEVOTkFfTUFJTiwKKwlJTF9BTlRFTk5BX0FVWAorfTsKKworLyoKKyAqIFJUUyB0aHJlc2hvbGQgaGVyZSBpcyB0b3RhbCBzaXplIFsyMzQ3XSBtaW51cyA0IEZDUyBieXRlcworICogUGVyIHNwZWM6CisgKiAgIGEgdmFsdWUgb2YgMCBtZWFucyBSVFMgb24gYWxsIGRhdGEvbWFuYWdlbWVudCBwYWNrZXRzCisgKiAgIGEgdmFsdWUgPiBtYXggTVNEVSBzaXplIG1lYW5zIG5vIFJUUworICogZWxzZSBSVFMgZm9yIGRhdGEvbWFuYWdlbWVudCBmcmFtZXMgd2hlcmUgTVBEVSBpcyBsYXJnZXIKKyAqICAgdGhhbiBSVFMgdmFsdWUuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEICAgICAyMzQ3VQorI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAgICAgICAgIDBVCisjZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgMjM0N1UKKyNkZWZpbmUgTUFYX01TRFVfU0laRQkJICAyMzA0VQorI2RlZmluZSBNQVhfTVBEVV9TSVpFCQkgIDIzNDZVCisjZGVmaW5lIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMICAgMTAwVQorI2RlZmluZQlERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUIDdVCisjZGVmaW5lCURFRkFVTFRfTE9OR19SRVRSWV9MSU1JVCAgNFUKKworI2RlZmluZSBJTF9UWF9GSUZPX0FDMAkwCisjZGVmaW5lIElMX1RYX0ZJRk9fQUMxCTEKKyNkZWZpbmUgSUxfVFhfRklGT19BQzIJMgorI2RlZmluZSBJTF9UWF9GSUZPX0FDMwkzCisjZGVmaW5lIElMX1RYX0ZJRk9fSENDQV8xCTUKKyNkZWZpbmUgSUxfVFhfRklGT19IQ0NBXzIJNgorI2RlZmluZSBJTF9UWF9GSUZPX05PTkUJNworCisjZGVmaW5lIElFRUU4MDIxMV9EQVRBX0xFTiAgICAgICAgICAgICAgMjMwNAorI2RlZmluZSBJRUVFODAyMTFfNEFERFJfTEVOICAgICAgICAgICAgIDMwCisjZGVmaW5lIElFRUU4MDIxMV9ITEVOICAgICAgICAgICAgICAgICAgKElFRUU4MDIxMV80QUREUl9MRU4pCisjZGVmaW5lIElFRUU4MDIxMV9GUkFNRV9MRU4gICAgICAgICAgICAgKElFRUU4MDIxMV9EQVRBX0xFTiArIElFRUU4MDIxMV9ITEVOKQorCitzdHJ1Y3QgaWwzOTQ1X2ZyYW1lIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBpZWVlODAyMTFfaGRyIGZyYW1lOworCQlzdHJ1Y3QgaWwzOTQ1X3R4X2JlYWNvbl9jbWQgYmVhY29uOworCQl1OCByYXdbSUVFRTgwMjExX0ZSQU1FX0xFTl07CisJCXU4IGNtZFszNjBdOworCX0gdTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisjZGVmaW5lIFNFUV9UT19TTihzZXEpICgoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCisjZGVmaW5lIFNOX1RPX1NFUShzc24pICgoKHNzbikgPDwgNCkgJiBJRUVFODAyMTFfU0NUTF9TRVEpCisjZGVmaW5lIE1BWF9TTiAoKElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKworI2RlZmluZSBTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMUyAgOAorI2RlZmluZSBTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMUyAgNAorI2RlZmluZSBTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMUyAgMTIKKworI2RlZmluZSBJTF9TVVBQT1JURURfUkFURVNfSUVfTEVOICAgICAgICAgOAorCisjZGVmaW5lIFNDQU5fSU5URVJWQUwgMTAwCisKKyNkZWZpbmUgTUFYX1RJRF9DT1VOVCAgICAgICAgOQorCisjZGVmaW5lIElMX0lOVkFMSURfUkFURSAgICAgMHhGRgorI2RlZmluZSBJTF9JTlZBTElEX1ZBTFVFICAgIC0xCisKKyNkZWZpbmUgU1RBX1BTX1NUQVRVU19XQUtFICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1RBX1BTX1NUQVRVU19TTEVFUCAgICAgICAgICAgIDEKKworc3RydWN0IGlsMzk0NV9pYnNzX3NlcSB7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxX251bTsKKwl1MTYgZnJhZ19udW07CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCisjZGVmaW5lIElMX1JYX0hEUih4KSAoKHN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfaGRyICopKFwKKwkJICAgICAgIHgtPnUucnhfZnJhbWUuc3RhdHMucGF5bG9hZCArIFwKKwkJICAgICAgIHgtPnUucnhfZnJhbWUuc3RhdHMucGh5X2NvdW50KSkKKyNkZWZpbmUgSUxfUlhfRU5EKHgpICgoc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9lbmQgKikoXAorCQkgICAgICAgSUxfUlhfSERSKHgpLT5wYXlsb2FkICsgXAorCQkgICAgICAgbGUxNl90b19jcHUoSUxfUlhfSERSKHgpLT5sZW4pKSkKKyNkZWZpbmUgSUxfUlhfU1RBVFMoeCkgKCZ4LT51LnJ4X2ZyYW1lLnN0YXRzKQorI2RlZmluZSBJTF9SWF9EQVRBKHgpIChJTF9SWF9IRFIoeCktPnBheWxvYWQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBGdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gaXdsMzk0NS1iYXNlLmMgd2hpY2ggYXJlIGZvcndhcmQgZGVjbGFyZWQgaGVyZQorICogZm9yIHVzZSBieSBpd2wtKi5jCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIGludCBpbDM5NDVfY2FsY19kYl9mcm9tX3JhdGlvKGludCBzaWdfcmF0aW8pOworZXh0ZXJuIHZvaWQgaWwzOTQ1X3J4X3JlcGxlbmlzaCh2b2lkICpkYXRhKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9yeF9xdWV1ZV9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaWwzOTQ1X2ZpbGxfYmVhY29uX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJCQkgICAgIGludCBsZWZ0KTsKK2V4dGVybiBpbnQgaWwzOTQ1X2R1bXBfbmljX2V2ZW50X2xvZyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgZnVsbF9sb2csCisJCQkJICAgICBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2R1bXBfbmljX2Vycm9yX2xvZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGl3bC1bMzRdKi5jIHdoaWNoIGFyZSBmb3J3YXJkIGRlY2xhcmVkIGhlcmUKKyAqIGZvciB1c2UgYnkgaXdsMzk0NS1iYXNlLmMKKyAqCisgKiBOT1RFOiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgaGFyZHdhcmUgc3BlY2lmaWMKKyAqIHdoaWNoIGlzIHdoeSB0aGV5IGFyZSBpbiB0aGUgaGFyZHdhcmUgc3BlY2lmaWMgZmlsZXMgKHZzLiBpd2wtYmFzZS5jKQorICoKKyAqIE5hbWluZyBjb252ZW50aW9uIC0tCisgKiBpbDM5NDVfICAgICAgICAgPC0tIEl0cyBwYXJ0IG9mIGl3bHdpZmkgKHNob3VsZCBiZSBjaGFuZ2VkIHRvIGlsMzk0NV8pCisgKiBpbDM5NDVfaHdfICAgICAgPC0tIEhhcmR3YXJlIHNwZWNpZmljIChpbXBsZW1lbnRlZCBpbiBpd2wtWFhYWC5jIGJ5IGFsbCBIVykKKyAqIGl3bFhYWFhfICAgICA8LS0gSGFyZHdhcmUgc3BlY2lmaWMgKGltcGxlbWVudGVkIGluIGl3bC1YWFhYLmMgZm9yIFhYWFgpCisgKiBpbDM5NDVfYmdfICAgICAgPC0tIENhbGxlZCBmcm9tIHdvcmsgcXVldWUgY29udGV4dAorICogaWwzOTQ1X21hY18gICAgIDwtLSBtYWM4MDIxMSBjYWxsYmFjaworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworZXh0ZXJuIHZvaWQgaWwzOTQ1X2h3X2hhbmRsZXJfc2V0dXAoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9od19zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gdm9pZCBpbDM5NDVfaHdfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X3J4cV9zdG9wKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsMzk0NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsMzk0NV9od19uaWNfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfaHdfbmljX3N0b3BfbWFzdGVyKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gdm9pZCBpbDM5NDVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gdm9pZCBpbDM5NDVfaHdfdHhxX2N0eF9zdG9wKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsMzk0NV9od19uaWNfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJCSAgIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJCQkgICBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4sIHU4IHJlc2V0LAorCQkJCQkgICB1OCBwYWQpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2h3X3R4cV9mcmVlX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfaHdfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgaWwzOTQ1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJICAgICBzdHJ1Y3QgaWwzOTQ1X2ZyYW1lICpmcmFtZSwKKwkJCQkJICAgICB1OCByYXRlKTsKK3ZvaWQgaWwzOTQ1X2h3X2J1aWxkX3R4X2NtZF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBpbnQgc3RhX2lkKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X3JlZ19zZW5kX3R4cG93ZXIoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWwzOTQ1X2h3X3JlZ19zZXRfdHhwb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHM4IHBvd2VyKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9oZGxfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbDM5NDVfaGRsX2Nfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2Rpc2FibGVfZXZlbnRzKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gaW50IGlsNDk2NV9nZXRfdGVtcGVyYXR1cmUoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9wb3N0X2Fzc29jaWF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIHZvaWQgaWwzOTQ1X2NvbmZpZ19hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCitleHRlcm4gaW50IGlsMzk0NV9jb21taXRfcnhvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisKKy8qKgorICogaWwzOTQ1X2h3X2ZpbmRfc3RhdGlvbiAtIEZpbmQgc3RhdGlvbiBpZCBmb3IgYSBnaXZlbiBCU1NJRAorICogQGJzc2lkOiBNQUMgYWRkcmVzcyBvZiBzdGF0aW9uIElEIHRvIGZpbmQKKyAqCisgKiBOT1RFOiAgVGhpcyBzaG91bGQgbm90IGJlIGhhcmR3YXJlIHNwZWNpZmljIGJ1dCB0aGUgY29kZSBoYXMKKyAqIG5vdCB5ZXQgYmVlbiBtZXJnZWQgaW50byBhIHNpbmdsZSBjb21tb24gbGF5ZXIgZm9yIG1hbmFnaW5nIHRoZQorICogc3RhdGlvbiB0YWJsZXMuCisgKi8KK2V4dGVybiB1OCBpbDM5NDVfaHdfZmluZF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggKiBic3NpZCk7CisKK2V4dGVybiBzdHJ1Y3QgaWVlZTgwMjExX29wcyBpbDM5NDVfaHdfb3BzOworCitleHRlcm4gX19sZTMyIGlsMzk0NV9nZXRfYW50ZW5uYV9mbGFncyhjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbDM5NDVfaW5pdF9od19yYXRlX3RhYmxlKHN0cnVjdCBpbF9wcml2ICppbCk7CitleHRlcm4gdm9pZCBpbDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgaWwzOTQ1X3R4cG93ZXJfc2V0X2Zyb21fZWVwcm9tKHN0cnVjdCBpbF9wcml2ICppbCk7CisKK2V4dGVybiBpbnQgaWwzOTQ1X3JzX25leHRfcmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCByYXRlKTsKKworLyogc2Nhbm5pbmcgKi8KK2ludCBpbDM5NDVfcmVxdWVzdF9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cit2b2lkIGlsMzk0NV9wb3N0X3NjYW4oc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogcmF0ZXMgKi8KK2V4dGVybiBjb25zdCBzdHJ1Y3QgaWwzOTQ1X3JhdGVfaW5mbyBpbDM5NDVfcmF0ZXNbUkFURV9DT1VOVF8zOTQ1XTsKKworLyogUlNTSSB0byBkQm0gKi8KKyNkZWZpbmUgSUwzOV9SU1NJX09GRlNFVAk5NQorCisvKgorICogRUVQUk9NIHJlbGF0ZWQgY29uc3RhbnRzLCBlbnVtcywgYW5kIHN0cnVjdHVyZXMuCisgKi8KKyNkZWZpbmUgRUVQUk9NX1NLVV9DQVBfT1BfTU9ERV9NUkMgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgNykKKworLyoKKyAqIE1hcHBpbmcgb2YgYSBUeCBwb3dlciBsZXZlbCwgYXQgZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZSwKKyAqICAgdG8gYSByYWRpby9EU1AgZ2FpbiB0YWJsZSBpZHguCisgKiBPbmUgZm9yIGVhY2ggb2YgNSAic2FtcGxlIiBwb3dlciBsZXZlbHMgaW4gZWFjaCBiYW5kLgorICogdl9kZXQgaXMgbWVhc3VyZWQgYXQgdGhlIGZhY3RvcnksIHVzaW5nIHRoZSAzOTQ1J3MgYnVpbHQtaW4gcG93ZXIgYW1wbGlmaWVyCisgKiAgIChQQSkgb3V0cHV0IHZvbHRhZ2UgZGV0ZWN0b3IuICBUaGlzIHNhbWUgZGV0ZWN0b3IgaXMgdXNlZCBkdXJpbmcgVHggb2YKKyAqICAgbG9uZyBwYWNrZXRzIGluIG5vcm1hbCBvcGVyYXRpb24gdG8gcHJvdmlkZSBmZWVkYmFjayBhcyB0byBwcm9wZXIgb3V0cHV0CisgKiAgIGxldmVsLgorICogRGF0YSBjb3BpZWQgZnJvbSBFRVBST00uCisgKiBETyBOT1QgQUxURVIgVEhJUyBTVFJVQ1RVUkUhISEKKyAqLworc3RydWN0IGlsMzk0NV9lZXByb21fdHhwb3dlcl9zYW1wbGUgeworCXU4IGdhaW5faWR4OwkJLyogaWR4IGludG8gcG93ZXIgKGdhaW4pIHNldHVwIHRhYmxlIC4uLiAqLworCXM4IHBvd2VyOwkJLyogLi4uIGZvciB0aGlzIHB3ciBsZXZlbCBmb3IgdGhpcyBjaG5sIGdyb3VwICovCisJdTE2IHZfZGV0OwkJLyogUEEgb3V0cHV0IHZvbHRhZ2UgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBNYXBwaW5ncyBvZiBUeCBwb3dlciBsZXZlbHMgLT4gbm9taW5hbCByYWRpby9EU1AgZ2FpbiB0YWJsZSBpZHhlcy4KKyAqIE9uZSBmb3IgZWFjaCBjaGFubmVsIGdyb3VwIChhLmsuYS4gImJhbmQiKSAoMSBmb3IgQkcsIDQgZm9yIEEpLgorICogVHggcG93ZXIgc2V0dXAgY29kZSBpbnRlcnBvbGF0ZXMgYmV0d2VlbiB0aGUgNSAic2FtcGxlIiBwb3dlciBsZXZlbHMKKyAqICAgIHRvIGRldGVybWluZSB0aGUgbm9taW5hbCBzZXR1cCBmb3IgYSByZXF1ZXN0ZWQgcG93ZXIgbGV2ZWwuCisgKiBEYXRhIGNvcGllZCBmcm9tIEVFUFJPTS4KKyAqIERPIE5PVCBBTFRFUiBUSElTIFNUUlVDVFVSRSEhIQorICovCitzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwIHsKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX3NhbXBsZSBzYW1wbGVzWzVdOwkvKiA1IHBvd2VyIGxldmVscyAqLworCXMzMiBhLCBiLCBjLCBkLCBlOwkvKiBjb2VmZmljaWVudHMgZm9yIHZvbHRhZ2UtPnBvd2VyCisJCQkJICogZm9ybXVsYSAoc2lnbmVkKSAqLworCXMzMiBGYSwgRmIsIEZjLCBGZCwgRmU7CS8qIHRoZXNlIG1vZGlmeSBjb2VmZnMgYmFzZWQgb24KKwkJCQkgKiBmcmVxdWVuY3kgKHNpZ25lZCkgKi8KKwlzOCBzYXR1cmF0aW9uX3Bvd2VyOwkvKiBoaWdoZXN0IHBvd2VyIHBvc3NpYmxlIGJ5IGgvdyBpbiB0aGlzCisJCQkJICogYmFuZCAqLworCXU4IGdyb3VwX2NoYW5uZWw7CS8qICJyZXByZXNlbnRhdGl2ZSIgY2hhbm5lbCAjIGluIHRoaXMgYmFuZCAqLworCXMxNiB0ZW1wZXJhdHVyZTsJLyogaC93IHRlbXBlcmF0dXJlIGF0IGZhY3RvcnkgY2FsaWIgdGhpcyBiYW5kCisJCQkJICogKHNpZ25lZCkgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBUZW1wZXJhdHVyZS1iYXNlZCBUeC1wb3dlciBjb21wZW5zYXRpb24gZGF0YSwgbm90IGJhbmQtc3BlY2lmaWMuCisgKiBUaGVzZSBjb2VmZmljaWVudHMgYXJlIHVzZSB0byBtb2RpZnkgYS9iL2MvZC9lIGNvZWZmcyBiYXNlZCBvbgorICogICBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCB0ZW1wZXJhdHVyZSBhbmQgZmFjdG9yeSBjYWxpYiB0ZW1wZXJhdHVyZS4KKyAqIERhdGEgY29waWVkIGZyb20gRUVQUk9NLgorICovCitzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90ZW1wZXJhdHVyZV9jb3JyIHsKKwl1MzIgVGE7CisJdTMyIFRiOworCXUzMiBUYzsKKwl1MzIgVGQ7CisJdTMyIFRlOworfSBfX3BhY2tlZDsKKworLyoKKyAqIEVFUFJPTSBtYXAKKyAqLworc3RydWN0IGlsMzk0NV9lZXByb20geworCXU4IHJlc2VydmVkMFsxNl07CisJdTE2IGRldmljZV9pZDsJCS8qIGFicy5vZnM6IDE2ICovCisJdTggcmVzZXJ2ZWQxWzJdOworCXUxNiBwbWM7CQkvKiBhYnMub2ZzOiAyMCAqLworCXU4IHJlc2VydmVkMlsyMF07CisJdTggbWFjX2FkZHJlc3NbNl07CS8qIGFicy5vZnM6IDQyICovCisJdTggcmVzZXJ2ZWQzWzU4XTsKKwl1MTYgYm9hcmRfcmV2aXNpb247CS8qIGFicy5vZnM6IDEwNiAqLworCXU4IHJlc2VydmVkNFsxMV07CisJdTggYm9hcmRfcGJhX251bWJlcls5XTsJLyogYWJzLm9mczogMTE5ICovCisJdTggcmVzZXJ2ZWQ1WzhdOworCXUxNiB2ZXJzaW9uOwkJLyogYWJzLm9mczogMTM2ICovCisJdTggc2t1X2NhcDsJCS8qIGFicy5vZnM6IDEzOCAqLworCXU4IGxlZHNfbW9kZTsJCS8qIGFicy5vZnM6IDEzOSAqLworCXUxNiBvZW1fbW9kZTsKKwl1MTYgd293bGFuX21vZGU7CS8qIGFicy5vZnM6IDE0MiAqLworCXUxNiBsZWRzX3RpbWVfaW50ZXJ2YWw7CS8qIGFicy5vZnM6IDE0NCAqLworCXU4IGxlZHNfb2ZmX3RpbWU7CS8qIGFicy5vZnM6IDE0NiAqLworCXU4IGxlZHNfb25fdGltZTsJLyogYWJzLm9mczogMTQ3ICovCisJdTggYWxtZ29yX21fdmVyc2lvbjsJLyogYWJzLm9mczogMTQ4ICovCisJdTggYW50ZW5uYV9zd2l0Y2hfdHlwZTsJLyogYWJzLm9mczogMTQ5ICovCisJdTggcmVzZXJ2ZWQ2WzQyXTsKKwl1OCBza3VfaWRbNF07CQkvKiBhYnMub2ZzOiAxOTIgKi8KKworLyoKKyAqIFBlci1jaGFubmVsIHJlZ3VsYXRvcnkgZGF0YS4KKyAqCisgKiBFYWNoIGNoYW5uZWwgdGhhdCAqbWlnaHQqIGJlIHN1cHBvcnRlZCBieSAzOTQ1IGhhcyBhIGZpeGVkIGxvY2F0aW9uCisgKiBpbiBFRVBST00gY29udGFpbmluZyBFRVBST01fQ0hBTk5FTF8qIHVzYWdlIGZsYWdzIChMU0IpIGFuZCBtYXggcmVndWxhdG9yeQorICogdHhwb3dlciAoTVNCKS4KKyAqCisgKiBFbnRyaWVzIGltbWVkaWF0ZWx5IGJlbG93IGFyZSBmb3IgMjAgTUh6IGNoYW5uZWwgd2lkdGguCisgKgorICogMi40IEdIeiBjaGFubmVscyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKKyAqLworCXUxNiBiYW5kXzFfY291bnQ7CS8qIGFicy5vZnM6IDE5NiAqLworCXN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCBiYW5kXzFfY2hhbm5lbHNbMTRdOwkvKiBhYnMub2ZzOiAxOTggKi8KKworLyoKKyAqIDQuOSBHSHogY2hhbm5lbHMgMTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OSwgMTkyLCAxOTYsCisgKiA1LjAgR0h6IGNoYW5uZWxzIDcsIDgsIDExLCAxMiwgMTYKKyAqICg0OTE1LTUwODBNSHopIChub25lIG9mIHRoZXNlIGlzIGV2ZXIgc3VwcG9ydGVkKQorICovCisJdTE2IGJhbmRfMl9jb3VudDsJLyogYWJzLm9mczogMjI2ICovCisJc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsIGJhbmRfMl9jaGFubmVsc1sxM107CS8qIGFicy5vZnM6IDIyOCAqLworCisvKgorICogNS4yIEdIeiBjaGFubmVscyAzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUyLCA1NiwgNjAsIDY0CisgKiAoNTE3MC01MzIwTUh6KQorICovCisJdTE2IGJhbmRfM19jb3VudDsJLyogYWJzLm9mczogMjU0ICovCisJc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsIGJhbmRfM19jaGFubmVsc1sxMl07CS8qIGFicy5vZnM6IDI1NiAqLworCisvKgorICogNS41IEdIeiBjaGFubmVscyAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAorICogKDU1MDAtNTcwME1IeikKKyAqLworCXUxNiBiYW5kXzRfY291bnQ7CS8qIGFicy5vZnM6IDI4MCAqLworCXN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCBiYW5kXzRfY2hhbm5lbHNbMTFdOwkvKiBhYnMub2ZzOiAyODIgKi8KKworLyoKKyAqIDUuNyBHSHogY2hhbm5lbHMgMTQ1LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorICogKDU3MjUtNTgyNU1IeikKKyAqLworCXUxNiBiYW5kXzVfY291bnQ7CS8qIGFicy5vZnM6IDMwNCAqLworCXN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCBiYW5kXzVfY2hhbm5lbHNbNl07CS8qIGFicy5vZnM6IDMwNiAqLworCisJdTggcmVzZXJ2ZWQ5WzE5NF07CisKKy8qCisgKiAzOTQ1IFR4cG93ZXIgY2FsaWJyYXRpb24gZGF0YS4KKyAqLworI2RlZmluZSBJTF9OVU1fVFhfQ0FMSUJfR1JPVVBTIDUKKwlzdHJ1Y3QgaWwzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwIGdyb3Vwc1tJTF9OVU1fVFhfQ0FMSUJfR1JPVVBTXTsKKy8qIGFicy5vZnM6IDUxMiAqLworCXN0cnVjdCBpbDM5NDVfZWVwcm9tX3RlbXBlcmF0dXJlX2NvcnIgY29ycmVjdGlvbnM7CS8qIGFicy5vZnM6IDgzMiAqLworCXU4IHJlc2VydmVkMTZbMTcyXTsJLyogZmlsbCBvdXQgdG8gZnVsbCAxMDI0IGJ5dGUgYmxvY2sgKi8KK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSUwzOTQ1X0VFUFJPTV9JTUdfU0laRSAxMDI0CisKKy8qIEVuZCBvZiBFRVBST00gKi8KKworI2RlZmluZSBQQ0lfQ0ZHX1JFVl9JRF9CSVRfQkFTSUNfU0tVICAgICAgICAgICAgICAgICgweDQwKQkvKiBiaXQgNiAgICAqLworI2RlZmluZSBQQ0lfQ0ZHX1JFVl9JRF9CSVRfUlRQICAgICAgICAgICAgICAgICAgICAgICgweDgwKQkvKiBiaXQgNyAgICAqLworCisvKiA0IERBVEEgKyAxIENNRC4gVGhlcmUgYXJlIDIgSENDQSBxdWV1ZXMgdGhhdCBhcmUgbm90IHVzZWQuICovCisjZGVmaW5lIElMMzlfTlVNX1FVRVVFUyAgICAgICAgNQorI2RlZmluZSBJTDM5X0NNRF9RVUVVRV9OVU0JNAorCisjZGVmaW5lIElMX0RFRkFVTFRfVFhfUkVUUlkgIDE1CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgUkZEX1NJWkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIE5VTV9URkRfQ0hVTktTICAgICAgICAgICAgICAgICAgICAgICAgNAorCisjZGVmaW5lIFRGRF9DVExfQ09VTlRfU0VUKG4pICAgICAgIChuIDw8IDI0KQorI2RlZmluZSBURkRfQ1RMX0NPVU5UX0dFVChjdGwpICAgICAoKGN0bCA+PiAyNCkgJiA3KQorI2RlZmluZSBURkRfQ1RMX1BBRF9TRVQobikgICAgICAgICAobiA8PCAyOCkKKyNkZWZpbmUgVEZEX0NUTF9QQURfR0VUKGN0bCkgICAgICAgKGN0bCA+PiAyOCkKKworLyogU2l6ZXMgYW5kIGFkZHJlc3NlcyBmb3IgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgbWVtb3J5IChTUkFNKSBpbgorICogMzk0NSdzIGVtYmVkZGVkIHByb2Nlc3Nvci4gIERyaXZlciBhY2Nlc3MgaXMgdmlhIEhCVVNfVEFSR19NRU1fKiByZWdzLiAqLworI2RlZmluZSBJTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5ECQkoMHgwMDAwMDApCisjZGVmaW5lIElMMzlfUlRDX0lOU1RfVVBQRVJfQk9VTkQJCSgweDAxNDAwMCkKKworI2RlZmluZSBJTDM5X1JUQ19EQVRBX0xPV0VSX0JPVU5ECQkoMHg4MDAwMDApCisjZGVmaW5lIElMMzlfUlRDX0RBVEFfVVBQRVJfQk9VTkQJCSgweDgwODAwMCkKKworI2RlZmluZSBJTDM5X1JUQ19JTlNUX1NJWkUgKElMMzlfUlRDX0lOU1RfVVBQRVJfQk9VTkQgLSBcCisJCQkJSUwzOV9SVENfSU5TVF9MT1dFUl9CT1VORCkKKyNkZWZpbmUgSUwzOV9SVENfREFUQV9TSVpFIChJTDM5X1JUQ19EQVRBX1VQUEVSX0JPVU5EIC0gXAorCQkJCUlMMzlfUlRDX0RBVEFfTE9XRVJfQk9VTkQpCisKKyNkZWZpbmUgSUwzOV9NQVhfSU5TVF9TSVpFIElMMzlfUlRDX0lOU1RfU0laRQorI2RlZmluZSBJTDM5X01BWF9EQVRBX1NJWkUgSUwzOV9SVENfREFUQV9TSVpFCisKKy8qIFNpemUgb2YgdUNvZGUgaW5zdHJ1Y3Rpb24gbWVtb3J5IGluIGJvb3RzdHJhcCBzdGF0ZSBtYWNoaW5lICovCisjZGVmaW5lIElMMzlfTUFYX0JTTV9TSVpFIElMMzlfUlRDX0lOU1RfU0laRQorCitzdGF0aWMgaW5saW5lIGludAoraWwzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIodTMyIGFkZHIpCit7CisJcmV0dXJuIChhZGRyID49IElMMzlfUlRDX0RBVEFfTE9XRVJfQk9VTkQgJiYKKwkJYWRkciA8IElMMzlfUlRDX0RBVEFfVVBQRVJfQk9VTkQpOworfQorCisvKiBCYXNlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgaWwzOTQ1X3NoYXJlZCBpcyBwcm92aWRlZCB0byBGSDM5X1RTU1JfQ0JCX0JBU0UKKyAqIGFuZCAmaWwzOTQ1X3NoYXJlZC5yeF9yZWFkX3B0clswXSBpcyBwcm92aWRlZCB0byBGSDM5X1JDU1JfUlBUUl9BRERSKDApICovCitzdHJ1Y3QgaWwzOTQ1X3NoYXJlZCB7CisJX19sZTMyIHR4X2Jhc2VfcHRyWzhdOworfSBfX3BhY2tlZDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGl3bDM5NDUgRmxvdyBIYW5kbGVyIERlZmluaXRpb25zICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgSS9PIGFyZWEgaXMgZGlyZWN0bHkgcmVhZC93cml0YWJsZSBieSBkcml2ZXIgKGUuZy4gTGludXggdXNlcyB3cml0ZWwoKSkKKyAqIEFkZHJlc3NlcyBhcmUgb2Zmc2V0cyBmcm9tIGRldmljZSdzIFBDSSBoYXJkd2FyZSBiYXNlIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUgRkgzOV9NRU1fTE9XRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MDgwMCkKKyNkZWZpbmUgRkgzOV9NRU1fVVBQRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MTAwMCkKKworI2RlZmluZSBGSDM5X0NCQ0NfVEJMCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDE0MCkKKyNkZWZpbmUgRkgzOV9URkRCX1RCTAkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHgxODApCisjZGVmaW5lIEZIMzlfUkNTUl9UQkwJCShGSDM5X01FTV9MT1dFUl9CT1VORCArIDB4NDAwKQorI2RlZmluZSBGSDM5X1JTU1JfVEJMCQkoRkgzOV9NRU1fTE9XRVJfQk9VTkQgKyAweDRjMCkKKyNkZWZpbmUgRkgzOV9UQ1NSX1RCTAkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHg1MDApCisjZGVmaW5lIEZIMzlfVFNTUl9UQkwJCShGSDM5X01FTV9MT1dFUl9CT1VORCArIDB4NjgwKQorCisvKiBURkRCIChUcmFuc21pdCBGcmFtZSBCdWZmZXIgRGVzY3JpcHRvcikgKi8KKyNkZWZpbmUgRkgzOV9URkRCKF9jaCwgYnVmKQkJCShGSDM5X1RGREJfVEJMICsgXAorCQkJCQkJICgoX2NoKSAqIDIgKyAoYnVmKSkgKiAweDI4KQorI2RlZmluZSBGSDM5X1RGREJfQ0hOTF9CVUZfQ1RSTF9SRUcoX2NoKQkoRkgzOV9URkRCX1RCTCArIDB4NTAgKiAoX2NoKSkKKworLyogQ0JDQyBjaGFubmVsIGlzIFswLDJdICovCisjZGVmaW5lIEZIMzlfQ0JDQyhfY2gpCQkoRkgzOV9DQkNDX1RCTCArIChfY2gpICogMHg4KQorI2RlZmluZSBGSDM5X0NCQ0NfQ1RSTChfY2gpCShGSDM5X0NCQ0MoX2NoKSArIDB4MDApCisjZGVmaW5lIEZIMzlfQ0JDQ19CQVNFKF9jaCkJKEZIMzlfQ0JDQyhfY2gpICsgMHgwNCkKKworLyogUkNTUiBjaGFubmVsIGlzIFswLDJdICovCisjZGVmaW5lIEZIMzlfUkNTUihfY2gpCQkJKEZIMzlfUkNTUl9UQkwgKyAoX2NoKSAqIDB4NDApCisjZGVmaW5lIEZIMzlfUkNTUl9DT05GSUcoX2NoKQkJKEZIMzlfUkNTUihfY2gpICsgMHgwMCkKKyNkZWZpbmUgRkgzOV9SQ1NSX1JCRF9CQVNFKF9jaCkJCShGSDM5X1JDU1IoX2NoKSArIDB4MDQpCisjZGVmaW5lIEZIMzlfUkNTUl9XUFRSKF9jaCkJCShGSDM5X1JDU1IoX2NoKSArIDB4MjApCisjZGVmaW5lIEZIMzlfUkNTUl9SUFRSX0FERFIoX2NoKQkoRkgzOV9SQ1NSKF9jaCkgKyAweDI0KQorCisjZGVmaW5lIEZIMzlfUlNDU1JfQ0hOTDBfV1BUUgkJKEZIMzlfUkNTUl9XUFRSKDApKQorCisvKiBSU1NSICovCisjZGVmaW5lIEZIMzlfUlNTUl9DVFJMCQkJKEZIMzlfUlNTUl9UQkwgKyAweDAwMCkKKyNkZWZpbmUgRkgzOV9SU1NSX1NUQVRVUwkJKEZIMzlfUlNTUl9UQkwgKyAweDAwNCkKKworLyogVENTUiAqLworI2RlZmluZSBGSDM5X1RDU1IoX2NoKQkJCShGSDM5X1RDU1JfVEJMICsgKF9jaCkgKiAweDIwKQorI2RlZmluZSBGSDM5X1RDU1JfQ09ORklHKF9jaCkJCShGSDM5X1RDU1IoX2NoKSArIDB4MDApCisjZGVmaW5lIEZIMzlfVENTUl9DUkVESVQoX2NoKQkJKEZIMzlfVENTUihfY2gpICsgMHgwNCkKKyNkZWZpbmUgRkgzOV9UQ1NSX0JVRkZfU1RUUyhfY2gpCShGSDM5X1RDU1IoX2NoKSArIDB4MDgpCisKKy8qIFRTU1IgKi8KKyNkZWZpbmUgRkgzOV9UU1NSX0NCQl9CQVNFICAgICAgICAoRkgzOV9UU1NSX1RCTCArIDB4MDAwKQorI2RlZmluZSBGSDM5X1RTU1JfTVNHX0NPTkZJRyAgICAgIChGSDM5X1RTU1JfVEJMICsgMHgwMDgpCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9TVEFUVVMgICAgICAgKEZIMzlfVFNTUl9UQkwgKyAweDAxMCkKKworLyogREJNICovCisKKyNkZWZpbmUgRkgzOV9TUlZDX0NITkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCisKKyNkZWZpbmUgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfUE9TX1JCRENfU0laRSAgICAgKDIwKQorI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfSVJRX1JCVEggICAgICAoNCkKKworI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19CSVRfV1JfU1RUU19FTiAgICAoMHgwODAwMDAwMCkKKworI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5fRU5BQkxFICAgICAgICAoMHg4MDAwMDAwMCkKKworI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkRSQkRfRU5fRU5BQkxFICAgICAgICAgICAoMHgyMDAwMDAwMCkKKworI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjgJCSgweDAxMDAwMDAwKQorCisjZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9JUlFfREVTVF9JTlRfSE9TVAkJKDB4MDAwMDEwMDApCisKKyNkZWZpbmUgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0ZICQkJKDB4MDAwMDAwMDApCisKKyNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX1RYRgkJKDB4MDAwMDAwMDApCisjZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9EUklWRVIJCSgweDAwMDAwMDAxKQorCisjZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0RJU0FCTEVfVkFMCSgweDAwMDAwMDAwKQorI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9FTkFCTEVfVkFMCSgweDAwMDAwMDA4KQorCisjZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfSUZURkQJCSgweDAwMjAwMDAwKQorCisjZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19OT0lOVAkJKDB4MDAwMDAwMDApCisKKyNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX1BBVVNFCQkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOQUJMRQkJKDB4ODAwMDAwMDApCisKKyNkZWZpbmUgRkgzOV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfVkFMX1RGREJfVkFMSUQJCSgweDAwMDA0MDAwKQorCisjZGVmaW5lIEZIMzlfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX0JJVF9URkRCX1dQVFIJCSgweDAwMDAwMDAxKQorCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfU05PT1BfUkRfVFhQRF9PTgkoMHhGRjAwMDAwMCkKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SRF9UWFBEX09OCSgweDAwRkYwMDAwKQorCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjhCCSgweDAwMDAwNDAwKQorCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfU05PT1BfUkRfVEZEX09OCQkoMHgwMDAwMDEwMCkKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SRF9DQkJfT04JCSgweDAwMDAwMDgwKQorCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfT1JERVJfUlNQX1dBSVRfVEgJKDB4MDAwMDAwMjApCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfUlNQX1dBSVRfVEgJCSgweDAwMDAwMDA1KQorCisjZGVmaW5lIEZIMzlfVFNTUl9UWF9TVEFUVVNfUkVHX0JJVF9CVUZTX0VNUFRZKF9jaCkJKEJJVChfY2gpIDw8IDI0KQorI2RlZmluZSBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19CSVRfTk9fUEVORF9SRVEoX2NoKQkoQklUKF9jaCkgPDwgMTYpCisKKyNkZWZpbmUgRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRShfY2gpIFwKKwkoRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfQklUX0JVRlNfRU1QVFkoX2NoKSB8IFwKKwkgRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfQklUX05PX1BFTkRfUkVRKF9jaCkpCisKKyNkZWZpbmUgRkgzOV9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUJCQkoMHgwMTAwMDAwMCkKKworc3RydWN0IGlsMzk0NV90ZmRfdGIgeworCV9fbGUzMiBhZGRyOworCV9fbGUzMiBsZW47Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgaWwzOTQ1X3RmZCB7CisJX19sZTMyIGNvbnRyb2xfZmxhZ3M7CisJc3RydWN0IGlsMzk0NV90ZmRfdGIgdGJzWzRdOworCXU4IF9fcGFkWzI4XTsKK30gX19wYWNrZWQ7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworc3NpemVfdCBpbDM5NDVfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3NzaXplX3QgaWwzOTQ1X3Vjb2RlX3R4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Citzc2l6ZV90IGlsMzk0NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJCQlsb2ZmX3QgKnBwb3MpOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1jYWxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1jYWxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMjQ4ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LWNhbGliLmMKQEAgLTAsMCArMSw5NDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgorICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKKyAqIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKiBCU0QgTElDRU5TRQorICoKKyAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICI0OTY1LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVCBjYWxpYnJhdGlvbnMgZnJhbWV3b3JrCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBzdGF0c19nZW5lcmFsX2RhdGEgeworCXUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2E7CisJdTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYjsKKwl1MzIgYmVhY29uX3NpbGVuY2VfcnNzaV9jOworCXUzMiBiZWFjb25fZW5lcmd5X2E7CisJdTMyIGJlYWNvbl9lbmVyZ3lfYjsKKwl1MzIgYmVhY29uX2VuZXJneV9jOworfTsKKwordm9pZAoraWw0OTY1X2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgSUxfQ0FMSUJfTUFYOyBpKyspIHsKKwkJa2ZyZWUoaWwtPmNhbGliX3Jlc3VsdHNbaV0uYnVmKTsKKwkJaWwtPmNhbGliX3Jlc3VsdHNbaV0uYnVmID0gTlVMTDsKKwkJaWwtPmNhbGliX3Jlc3VsdHNbaV0uYnVmX2xlbiA9IDA7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJVTlRJTUUgY2FsaWJyYXRpb25zIGZyYW1ld29yaworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAiZmFsc2UgYWxhcm1zIiBhcmUgc2lnbmFscyB0aGF0IG91ciBEU1AgdHJpZXMgdG8gbG9jayBvbnRvLAorICogICBidXQgdGhlbiBkZXRlcm1pbmVzIHRoYXQgdGhleSBhcmUgZWl0aGVyIG5vaXNlLCBvciB0cmFuc21pc3Npb25zCisgKiAgIGZyb20gYSBkaXN0YW50IHdpcmVsZXNzIG5ldHdvcmsgKGFsc28gIm5vaXNlIiwgcmVhbGx5KSB0aGF0IGdldAorICogICAic3RlcHBlZCBvbiIgYnkgc3Ryb25nZXIgdHJhbnNtaXNzaW9ucyB3aXRoaW4gb3VyIG93biBuZXR3b3JrLgorICogVGhpcyBhbGdvcml0aG0gYXR0ZW1wdHMgdG8gc2V0IGEgc2Vuc2l0aXZpdHkgbGV2ZWwgdGhhdCBpcyBoaWdoCisgKiAgIGVub3VnaCB0byByZWNlaXZlIGFsbCBvZiBvdXIgb3duIG5ldHdvcmsgdHJhZmZpYywgYnV0IG5vdCBzbworICogICBoaWdoIHRoYXQgb3VyIERTUCBnZXRzIHRvbyBidXN5IHRyeWluZyB0byBsb2NrIG9udG8gbm9uLW5ldHdvcmsKKyAqICAgYWN0aXZpdHkvbm9pc2UuICovCitzdGF0aWMgaW50CitpbDQ5NjVfc2Vuc19lbmVyZ3lfY2NrKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIG5vcm1fZmEsIHUzMiByeF9lbmFibGVfdGltZSwKKwkJICAgICAgIHN0cnVjdCBzdGF0c19nZW5lcmFsX2RhdGEgKnJ4X2luZm8pCit7CisJdTMyIG1heF9ucmdfY2NrID0gMDsKKwlpbnQgaSA9IDA7CisJdTggbWF4X3NpbGVuY2VfcnNzaSA9IDA7CisJdTMyIHNpbGVuY2VfcmVmID0gMDsKKwl1OCBzaWxlbmNlX3Jzc2lfYSA9IDA7CisJdTggc2lsZW5jZV9yc3NpX2IgPSAwOworCXU4IHNpbGVuY2VfcnNzaV9jID0gMDsKKwl1MzIgdmFsOworCisJLyogImZhbHNlX2FsYXJtcyIgdmFsdWVzIGJlbG93IGFyZSBjcm9zcy1tdWx0aXBsaWNhdGlvbnMgdG8gYXNzZXNzIHRoZQorCSAqICAgbnVtYmVycyBvZiBmYWxzZSBhbGFybXMgd2l0aGluIHRoZSBtZWFzdXJlZCBwZXJpb2Qgb2YgYWN0dWFsIFJ4CisJICogICAoUnggaXMgb2ZmIHdoZW4gd2UncmUgdHhpbmcpLCB2cyB0aGUgbWluL21heCBleHBlY3RlZCBmYWxzZSBhbGFybXMKKwkgKiAgIChzb21lIHNob3VsZCBiZSBleHBlY3RlZCBpZiByeCBpcyBzZW5zaXRpdmUgZW5vdWdoKSBpbiBhCisJICogICBoeXBvdGhldGljYWwgbGlzdGVuaW5nIHBlcmlvZCBvZiAyMDAgdGltZSB1bml0cyAoVFUpLCAyMDQuOCBtc2VjOgorCSAqCisJICogTUlOX0ZBL2ZpeGVkLXRpbWUgPCBmYWxzZV9hbGFybXMvYWN0dWFsLXJ4LXRpbWUgPCBNQVhfRkEvYmVhY29uLXRpbWUKKwkgKgorCSAqICovCisJdTMyIGZhbHNlX2FsYXJtcyA9IG5vcm1fZmEgKiAyMDAgKiAxMDI0OworCXUzMiBtYXhfZmFsc2VfYWxhcm1zID0gTUFYX0ZBX0NDSyAqIHJ4X2VuYWJsZV90aW1lOworCXUzMiBtaW5fZmFsc2VfYWxhcm1zID0gTUlOX0ZBX0NDSyAqIHJ4X2VuYWJsZV90aW1lOworCXN0cnVjdCBpbF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzICpyYW5nZXMgPSBpbC0+aHdfcGFyYW1zLnNlbnM7CisKKwlkYXRhID0gJihpbC0+c2Vuc2l0aXZpdHlfZGF0YSk7CisKKwlkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA9IDA7CisKKwkvKiBGaW5kIG1heCBzaWxlbmNlIHJzc2kgYW1vbmcgYWxsIDMgcmVjZWl2ZXJzLgorCSAqIFRoaXMgaXMgYmFja2dyb3VuZCBub2lzZSwgd2hpY2ggbWF5IGluY2x1ZGUgdHJhbnNtaXNzaW9ucyBmcm9tIG90aGVyCisJICogICAgbmV0d29ya3MsIG1lYXN1cmVkIGR1cmluZyBzaWxlbmNlIGJlZm9yZSBvdXIgbmV0d29yaydzIGJlYWNvbiAqLworCXNpbGVuY2VfcnNzaV9hID0KKwkgICAgKHU4KSAoKHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSAmIEFMTF9CQU5EX0ZJTFRFUikgPj4gOCk7CisJc2lsZW5jZV9yc3NpX2IgPQorCSAgICAodTgpICgocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iICYgQUxMX0JBTkRfRklMVEVSKSA+PiA4KTsKKwlzaWxlbmNlX3Jzc2lfYyA9CisJICAgICh1OCkgKChyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MgJiBBTExfQkFORF9GSUxURVIpID4+IDgpOworCisJdmFsID0gbWF4KHNpbGVuY2VfcnNzaV9iLCBzaWxlbmNlX3Jzc2lfYyk7CisJbWF4X3NpbGVuY2VfcnNzaSA9IG1heChzaWxlbmNlX3Jzc2lfYSwgKHU4KSB2YWwpOworCisJLyogU3RvcmUgc2lsZW5jZSByc3NpIGluIDIwLWJlYWNvbiBoaXN0b3J5IHRhYmxlICovCisJZGF0YS0+bnJnX3NpbGVuY2VfcnNzaVtkYXRhLT5ucmdfc2lsZW5jZV9pZHhdID0gbWF4X3NpbGVuY2VfcnNzaTsKKwlkYXRhLT5ucmdfc2lsZW5jZV9pZHgrKzsKKwlpZiAoZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID49IE5SR19OVU1fUFJFVl9TVEFUX0wpCisJCWRhdGEtPm5yZ19zaWxlbmNlX2lkeCA9IDA7CisKKwkvKiBGaW5kIG1heCBzaWxlbmNlIHJzc2kgYWNyb3NzIDIwIGJlYWNvbiBoaXN0b3J5ICovCisJZm9yIChpID0gMDsgaSA8IE5SR19OVU1fUFJFVl9TVEFUX0w7IGkrKykgeworCQl2YWwgPSBkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2ldOworCQlzaWxlbmNlX3JlZiA9IG1heChzaWxlbmNlX3JlZiwgdmFsKTsKKwl9CisJRF9DQUxJQigic2lsZW5jZSBhICV1LCBiICV1LCBjICV1LCAyMC1iY24gbWF4ICV1XG4iLCBzaWxlbmNlX3Jzc2lfYSwKKwkJc2lsZW5jZV9yc3NpX2IsIHNpbGVuY2VfcnNzaV9jLCBzaWxlbmNlX3JlZik7CisKKwkvKiBGaW5kIG1heCByeCBlbmVyZ3kgKG1pbiB2YWx1ZSEpIGFtb25nIGFsbCAzIHJlY2VpdmVycywKKwkgKiAgIG1lYXN1cmVkIGR1cmluZyBiZWFjb24gZnJhbWUuCisJICogU2F2ZSBpdCBpbiAxMC1iZWFjb24gaGlzdG9yeSB0YWJsZS4gKi8KKwlpID0gZGF0YS0+bnJnX2VuZXJneV9pZHg7CisJdmFsID0gbWluKHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYiwgcnhfaW5mby0+YmVhY29uX2VuZXJneV9jKTsKKwlkYXRhLT5ucmdfdmFsdWVbaV0gPSBtaW4ocnhfaW5mby0+YmVhY29uX2VuZXJneV9hLCB2YWwpOworCisJZGF0YS0+bnJnX2VuZXJneV9pZHgrKzsKKwlpZiAoZGF0YS0+bnJnX2VuZXJneV9pZHggPj0gMTApCisJCWRhdGEtPm5yZ19lbmVyZ3lfaWR4ID0gMDsKKworCS8qIEZpbmQgbWluIHJ4IGVuZXJneSAobWF4IHZhbHVlKSBhY3Jvc3MgMTAgYmVhY29uIGhpc3RvcnkuCisJICogVGhpcyBpcyB0aGUgbWluaW11bSBzaWduYWwgbGV2ZWwgdGhhdCB3ZSB3YW50IHRvIHJlY2VpdmUgd2VsbC4KKwkgKiBBZGQgYmFja29mZiAobWFyZ2luIHNvIHdlIGRvbid0IG1pc3Mgc2xpZ2h0bHkgbG93ZXIgZW5lcmd5IGZyYW1lcykuCisJICogVGhpcyBlc3RhYmxpc2hlcyBhbiB1cHBlciBib3VuZCAobWluIHZhbHVlKSBmb3IgZW5lcmd5IHRocmVzaG9sZC4gKi8KKwltYXhfbnJnX2NjayA9IGRhdGEtPm5yZ192YWx1ZVswXTsKKwlmb3IgKGkgPSAxOyBpIDwgMTA7IGkrKykKKwkJbWF4X25yZ19jY2sgPSAodTMyKSBtYXgobWF4X25yZ19jY2ssIChkYXRhLT5ucmdfdmFsdWVbaV0pKTsKKwltYXhfbnJnX2NjayArPSA2OworCisJRF9DQUxJQigicnggZW5lcmd5IGEgJXUsIGIgJXUsIGMgJXUsIDEwLWJjbiBtYXgvbWluICV1XG4iLAorCQlyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2EsIHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYiwKKwkJcnhfaW5mby0+YmVhY29uX2VuZXJneV9jLCBtYXhfbnJnX2NjayAtIDYpOworCisJLyogQ291bnQgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJlYWNvbnMgd2l0aCBmZXdlci10aGFuLWRlc2lyZWQKKwkgKiAgIGZhbHNlIGFsYXJtcy4gKi8KKwlpZiAoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykKKwkJZGF0YS0+bnVtX2luX2Nja19ub19mYSsrOworCWVsc2UKKwkJZGF0YS0+bnVtX2luX2Nja19ub19mYSA9IDA7CisJRF9DQUxJQigiY29uc2VjdXRpdmUgYmNucyB3aXRoIGZldyBmYWxzZSBhbGFybXMgPSAldVxuIiwKKwkJZGF0YS0+bnVtX2luX2Nja19ub19mYSk7CisKKwkvKiBJZiB3ZSBnb3QgdG9vIG1hbnkgZmFsc2UgYWxhcm1zIHRoaXMgdGltZSwgcmVkdWNlIHNlbnNpdGl2aXR5ICovCisJaWYgKGZhbHNlX2FsYXJtcyA+IG1heF9mYWxzZV9hbGFybXMgJiYKKwkgICAgZGF0YS0+YXV0b19jb3JyX2NjayA+IEFVVE9fQ09SUl9NQVhfVEhfQ0NLKSB7CisJCURfQ0FMSUIoIm5vcm0gRkEgJXUgPiBtYXggRkEgJXVcbiIsIGZhbHNlX2FsYXJtcywKKwkJCW1heF9mYWxzZV9hbGFybXMpOworCQlEX0NBTElCKCIuLi4gcmVkdWNpbmcgc2Vuc2l0aXZpdHlcbiIpOworCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElMX0ZBX1RPT19NQU5ZOworCQkvKiBTdG9yZSBmb3IgImZld2VyIHRoYW4gZGVzaXJlZCIgb24gbGF0ZXIgYmVhY29uICovCisJCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IHNpbGVuY2VfcmVmOworCisJCS8qIGluY3JlYXNlIGVuZXJneSB0aHJlc2hvbGQgKHJlZHVjZSBucmcgdmFsdWUpCisJCSAqICAgdG8gZGVjcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KKwkJZGF0YS0+bnJnX3RoX2NjayA9IGRhdGEtPm5yZ190aF9jY2sgLSBOUkdfU1RFUF9DQ0s7CisJCS8qIEVsc2UgaWYgd2UgZ290IGZld2VyIHRoYW4gZGVzaXJlZCwgaW5jcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KKwl9IGVsc2UgaWYgKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpIHsKKwkJZGF0YS0+bnJnX2N1cnJfc3RhdGUgPSBJTF9GQV9UT09fRkVXOworCisJCS8qIENvbXBhcmUgc2lsZW5jZSBsZXZlbCB3aXRoIHNpbGVuY2UgbGV2ZWwgZm9yIG1vc3QgcmVjZW50CisJCSAqICAgaGVhbHRoeSBudW1iZXIgb3IgdG9vIG1hbnkgZmFsc2UgYWxhcm1zICovCisJCWRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmID0KKwkJICAgIChzMzIpIGRhdGEtPm5yZ19zaWxlbmNlX3JlZiAtIChzMzIpIHNpbGVuY2VfcmVmOworCisJCURfQ0FMSUIoIm5vcm0gRkEgJXUgPCBtaW4gRkEgJXUsIHNpbGVuY2UgZGlmZiAlZFxuIiwKKwkJCWZhbHNlX2FsYXJtcywgbWluX2ZhbHNlX2FsYXJtcywKKwkJCWRhdGEtPm5yZ19hdXRvX2NvcnJfc2lsZW5jZV9kaWZmKTsKKworCQkvKiBJbmNyZWFzZSB2YWx1ZSB0byBpbmNyZWFzZSBzZW5zaXRpdml0eSwgYnV0IG9ubHkgaWY6CisJCSAqIDFhKSBwcmV2aW91cyBiZWFjb24gZGlkICpub3QqIGhhdmUgKnRvbyBtYW55KiBmYWxzZSBhbGFybXMKKwkJICogMWIpIEFORCB0aGVyZSdzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBSeCBsZXZlbHMKKwkJICogICAgICBmcm9tIGEgcHJldmlvdXMgYmVhY29uIHdpdGggdG9vIG1hbnksIG9yIGhlYWx0aHkgIyBGQXMKKwkJICogT1IgMikgV2UndmUgc2VlbiBhIGxvdCBvZiBiZWFjb25zICgxMDApIHdpdGggdG9vIGZldworCQkgKiAgICAgICBmYWxzZSBhbGFybXMgKi8KKwkJaWYgKGRhdGEtPm5yZ19wcmV2X3N0YXRlICE9IElMX0ZBX1RPT19NQU5ZICYmCisJCSAgICAoZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYgPiBOUkdfRElGRiB8fAorCQkgICAgIGRhdGEtPm51bV9pbl9jY2tfbm9fZmEgPiBNQVhfTlVNQkVSX0NDS19OT19GQSkpIHsKKworCQkJRF9DQUxJQigiLi4uIGluY3JlYXNpbmcgc2Vuc2l0aXZpdHlcbiIpOworCQkJLyogSW5jcmVhc2UgbnJnIHZhbHVlIHRvIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCisJCQl2YWwgPSBkYXRhLT5ucmdfdGhfY2NrICsgTlJHX1NURVBfQ0NLOworCQkJZGF0YS0+bnJnX3RoX2NjayA9IG1pbigodTMyKSByYW5nZXMtPm1pbl9ucmdfY2NrLCB2YWwpOworCQl9IGVsc2UgeworCQkJRF9DQUxJQigiLi4uIGJ1dCBub3QgY2hhbmdpbmcgc2Vuc2l0aXZpdHlcbiIpOworCQl9CisKKwkJLyogRWxzZSB3ZSBnb3QgYSBoZWFsdGh5IG51bWJlciBvZiBmYWxzZSBhbGFybXMsIGtlZXAgc3RhdHVzIHF1byAqLworCX0gZWxzZSB7CisJCURfQ0FMSUIoIiBGQSBpbiBzYWZlIHpvbmVcbiIpOworCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElMX0ZBX0dPT0RfUkFOR0U7CisKKwkJLyogU3RvcmUgZm9yIHVzZSBpbiAiZmV3ZXIgdGhhbiBkZXNpcmVkIiB3aXRoIGxhdGVyIGJlYWNvbiAqLworCQlkYXRhLT5ucmdfc2lsZW5jZV9yZWYgPSBzaWxlbmNlX3JlZjsKKworCQkvKiBJZiBwcmV2aW91cyBiZWFjb24gaGFkIHRvbyBtYW55IGZhbHNlIGFsYXJtcywKKwkJICogICBnaXZlIGl0IHNvbWUgZXh0cmEgbWFyZ2luIGJ5IHJlZHVjaW5nIHNlbnNpdGl2aXR5IGFnYWluCisJCSAqICAgKGJ1dCBkb24ndCBnbyBiZWxvdyBtZWFzdXJlZCBlbmVyZ3kgb2YgZGVzaXJlZCBSeCkgKi8KKwkJaWYgKElMX0ZBX1RPT19NQU5ZID09IGRhdGEtPm5yZ19wcmV2X3N0YXRlKSB7CisJCQlEX0NBTElCKCIuLi4gaW5jcmVhc2luZyBtYXJnaW5cbiIpOworCQkJaWYgKGRhdGEtPm5yZ190aF9jY2sgPiAobWF4X25yZ19jY2sgKyBOUkdfTUFSR0lOKSkKKwkJCQlkYXRhLT5ucmdfdGhfY2NrIC09IE5SR19NQVJHSU47CisJCQllbHNlCisJCQkJZGF0YS0+bnJnX3RoX2NjayA9IG1heF9ucmdfY2NrOworCQl9CisJfQorCisJLyogTWFrZSBzdXJlIHRoZSBlbmVyZ3kgdGhyZXNob2xkIGRvZXMgbm90IGdvIGFib3ZlIHRoZSBtZWFzdXJlZAorCSAqIGVuZXJneSBvZiB0aGUgZGVzaXJlZCBSeCBzaWduYWxzIChyZWR1Y2VkIGJ5IGJhY2tvZmYgbWFyZ2luKSwKKwkgKiBvciBlbHNlIHdlIG1pZ2h0IHN0YXJ0IG1pc3NpbmcgUnggZnJhbWVzLgorCSAqIExvd2VyIHZhbHVlIGlzIGhpZ2hlciBlbmVyZ3ksIHNvIHdlIHVzZSBtYXgoKSEKKwkgKi8KKwlkYXRhLT5ucmdfdGhfY2NrID0gbWF4KG1heF9ucmdfY2NrLCBkYXRhLT5ucmdfdGhfY2NrKTsKKwlEX0NBTElCKCJuZXcgbnJnX3RoX2NjayAldVxuIiwgZGF0YS0+bnJnX3RoX2Njayk7CisKKwlkYXRhLT5ucmdfcHJldl9zdGF0ZSA9IGRhdGEtPm5yZ19jdXJyX3N0YXRlOworCisJLyogQXV0by1jb3JyZWxhdGlvbiBDQ0sgYWxnb3JpdGhtICovCisJaWYgKGZhbHNlX2FsYXJtcyA+IG1pbl9mYWxzZV9hbGFybXMpIHsKKworCQkvKiBpbmNyZWFzZSBhdXRvX2NvcnIgdmFsdWVzIHRvIGRlY3JlYXNlIHNlbnNpdGl2aXR5CisJCSAqIHNvIHRoZSBEU1Agd29uJ3QgYmUgZGlzdHVyYmVkIGJ5IHRoZSBub2lzZQorCQkgKi8KKwkJaWYgKGRhdGEtPmF1dG9fY29ycl9jY2sgPCBBVVRPX0NPUlJfTUFYX1RIX0NDSykKKwkJCWRhdGEtPmF1dG9fY29ycl9jY2sgPSBBVVRPX0NPUlJfTUFYX1RIX0NDSyArIDE7CisJCWVsc2UgeworCQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2NjayArIEFVVE9fQ09SUl9TVEVQX0NDSzsKKwkJCWRhdGEtPmF1dG9fY29ycl9jY2sgPQorCQkJICAgIG1pbigodTMyKSByYW5nZXMtPmF1dG9fY29ycl9tYXhfY2NrLCB2YWwpOworCQl9CisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjICsgQVVUT19DT1JSX1NURVBfQ0NLOworCQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyA9CisJCSAgICBtaW4oKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X2Nja19tcmMsIHZhbCk7CisJfSBlbHNlIGlmIChmYWxzZV9hbGFybXMgPCBtaW5fZmFsc2VfYWxhcm1zICYmCisJCSAgIChkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA+IE5SR19ESUZGIHx8CisJCSAgICBkYXRhLT5udW1faW5fY2NrX25vX2ZhID4gTUFYX05VTUJFUl9DQ0tfTk9fRkEpKSB7CisKKwkJLyogRGVjcmVhc2UgYXV0b19jb3JyIHZhbHVlcyB0byBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfY2NrIC0gQVVUT19DT1JSX1NURVBfQ0NLOworCQlkYXRhLT5hdXRvX2NvcnJfY2NrID0gbWF4KCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21pbl9jY2ssIHZhbCk7CisJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjIC0gQVVUT19DT1JSX1NURVBfQ0NLOworCQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyA9CisJCSAgICBtYXgoKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWluX2Nja19tcmMsIHZhbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9zZW5zX2F1dG9fY29ycl9vZmRtKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIG5vcm1fZmEsIHUzMiByeF9lbmFibGVfdGltZSkKK3sKKwl1MzIgdmFsOworCXUzMiBmYWxzZV9hbGFybXMgPSBub3JtX2ZhICogMjAwICogMTAyNDsKKwl1MzIgbWF4X2ZhbHNlX2FsYXJtcyA9IE1BWF9GQV9PRkRNICogcnhfZW5hYmxlX3RpbWU7CisJdTMyIG1pbl9mYWxzZV9hbGFybXMgPSBNSU5fRkFfT0ZETSAqIHJ4X2VuYWJsZV90aW1lOworCXN0cnVjdCBpbF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzICpyYW5nZXMgPSBpbC0+aHdfcGFyYW1zLnNlbnM7CisKKwlkYXRhID0gJihpbC0+c2Vuc2l0aXZpdHlfZGF0YSk7CisKKwkvKiBJZiB3ZSBnb3QgdG9vIG1hbnkgZmFsc2UgYWxhcm1zIHRoaXMgdGltZSwgcmVkdWNlIHNlbnNpdGl2aXR5ICovCisJaWYgKGZhbHNlX2FsYXJtcyA+IG1heF9mYWxzZV9hbGFybXMpIHsKKworCQlEX0NBTElCKCJub3JtIEZBICV1ID4gbWF4IEZBICV1KVxuIiwgZmFsc2VfYWxhcm1zLAorCQkJbWF4X2ZhbHNlX2FsYXJtcyk7CisKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG0gKyBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbSA9CisJCSAgICBtaW4oKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG0sIHZhbCk7CisKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjICsgQVVUT19DT1JSX1NURVBfT0ZETTsKKwkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjID0KKwkJICAgIG1pbigodTMyKSByYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbV9tcmMsIHZhbCk7CisKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1feDEgKyBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSA9CisJCSAgICBtaW4oKHUzMikgcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG1feDEsIHZhbCk7CisKKwkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxICsgQVVUT19DT1JSX1NURVBfT0ZETTsKKwkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxID0KKwkJICAgIG1pbigodTMyKSByYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbV9tcmNfeDEsIHZhbCk7CisJfQorCisJLyogRWxzZSBpZiB3ZSBnb3QgZmV3ZXIgdGhhbiBkZXNpcmVkLCBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLworCWVsc2UgaWYgKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpIHsKKworCQlEX0NBTElCKCJub3JtIEZBICV1IDwgbWluIEZBICV1XG4iLCBmYWxzZV9hbGFybXMsCisJCQltaW5fZmFsc2VfYWxhcm1zKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbSAtIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtID0KKwkJICAgIG1heCgodTMyKSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbSwgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgLSBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgPQorCQkgICAgbWF4KCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yYywgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSAtIEFVVE9fQ09SUl9TVEVQX09GRE07CisJCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxID0KKwkJICAgIG1heCgodTMyKSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV94MSwgdmFsKTsKKworCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgLSBBVVRPX0NPUlJfU1RFUF9PRkRNOworCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgPQorCQkgICAgbWF4KCh1MzIpIHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yY194MSwgdmFsKTsKKwl9IGVsc2UgeworCQlEX0NBTElCKCJtaW4gRkEgJXUgPCBub3JtIEZBICV1IDwgbWF4IEZBICV1IE9LXG4iLAorCQkJbWluX2ZhbHNlX2FsYXJtcywgZmFsc2VfYWxhcm1zLCBtYXhfZmFsc2VfYWxhcm1zKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcHJlcGFyZV9sZWdhY3lfc2Vuc2l0aXZpdHlfdGJsKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgICAgICBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSwKKwkJCQkgICAgICBfX2xlMTYgKnRibCkKK3sKKwl0YmxbSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikgZGF0YS0+YXV0b19jb3JyX29mZG0pOworCXRibFtIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX01SQ19JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjKTsKKwl0YmxbSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikgZGF0YS0+YXV0b19jb3JyX29mZG1feDEpOworCXRibFtIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoKHUxNikgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxKTsKKworCXRibFtIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lEWF0gPQorCSAgICBjcHVfdG9fbGUxNigodTE2KSBkYXRhLT5hdXRvX2NvcnJfY2NrKTsKKwl0YmxbSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSURYXSA9CisJICAgIGNwdV90b19sZTE2KCh1MTYpIGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjKTsKKworCXRibFtIRF9NSU5fRU5FUkdZX0NDS19ERVRfSURYXSA9IGNwdV90b19sZTE2KCh1MTYpIGRhdGEtPm5yZ190aF9jY2spOworCXRibFtIRF9NSU5fRU5FUkdZX09GRE1fREVUX0lEWF0gPSBjcHVfdG9fbGUxNigodTE2KSBkYXRhLT5ucmdfdGhfb2ZkbSk7CisKKwl0YmxbSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9JRFhdID0KKwkgICAgY3B1X3RvX2xlMTYoZGF0YS0+YmFya2VyX2NvcnJfdGhfbWluKTsKKwl0YmxbSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9NUkNfSURYXSA9CisJICAgIGNwdV90b19sZTE2KGRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmMpOworCXRibFtIRF9PRkRNX0VORVJHWV9USF9JTl9JRFhdID0gY3B1X3RvX2xlMTYoZGF0YS0+bnJnX3RoX2NjYSk7CisKKwlEX0NBTElCKCJvZmRtOiBhYyAldSBtcmMgJXUgeDEgJXUgbXJjX3gxICV1IHRocmVzaCAldVxuIiwKKwkJZGF0YS0+YXV0b19jb3JyX29mZG0sIGRhdGEtPmF1dG9fY29ycl9vZmRtX21yYywKKwkJZGF0YS0+YXV0b19jb3JyX29mZG1feDEsIGRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSwKKwkJZGF0YS0+bnJnX3RoX29mZG0pOworCisJRF9DQUxJQigiY2NrOiBhYyAldSBtcmMgJXUgdGhyZXNoICV1XG4iLCBkYXRhLT5hdXRvX2NvcnJfY2NrLAorCQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYywgZGF0YS0+bnJnX3RoX2Njayk7Cit9CisKKy8qIFByZXBhcmUgYSBDX1NFTlNJVElWSVRZLCBzZW5kIHRvIHVDb2RlIGlmIHZhbHVlcyBoYXZlIGNoYW5nZWQgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9zZW5zaXRpdml0eV93cml0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2NtZCBjbWQ7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWRfb3V0ID0geworCQkuaWQgPSBDX1NFTlNJVElWSVRZLAorCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpbF9zZW5zaXRpdml0eV9jbWQpLAorCQkuZmxhZ3MgPSBDTURfQVNZTkMsCisJCS5kYXRhID0gJmNtZCwKKwl9OworCisJZGF0YSA9ICYoaWwtPnNlbnNpdGl2aXR5X2RhdGEpOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKworCWlsNDk2NV9wcmVwYXJlX2xlZ2FjeV9zZW5zaXRpdml0eV90YmwoaWwsIGRhdGEsICZjbWQudGFibGVbMF0pOworCisJLyogVXBkYXRlIHVDb2RlJ3MgIndvcmsiIHRhYmxlLCBhbmQgY29weSBpdCB0byBEU1AgKi8KKwljbWQuY29udHJvbCA9IENfU0VOU0lUSVZJVFlfQ09OVFJPTF9XT1JLX1RCTDsKKworCS8qIERvbid0IHNlbmQgY29tbWFuZCB0byB1Q29kZSBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCisJaWYgKCFtZW1jbXAKKwkgICAgKCZjbWQudGFibGVbMF0sICYoaWwtPnNlbnNpdGl2aXR5X3RibFswXSksCisJICAgICBzaXplb2YodTE2KSAqIEhEX1RCTF9TSVpFKSkgeworCQlEX0NBTElCKCJObyBjaGFuZ2UgaW4gQ19TRU5TSVRJVklUWVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIENvcHkgdGFibGUgZm9yIGNvbXBhcmlzb24gbmV4dCB0aW1lICovCisJbWVtY3B5KCYoaWwtPnNlbnNpdGl2aXR5X3RibFswXSksICYoY21kLnRhYmxlWzBdKSwKKwkgICAgICAgc2l6ZW9mKHUxNikgKiBIRF9UQkxfU0laRSk7CisKKwlyZXR1cm4gaWxfc2VuZF9jbWQoaWwsICZjbWRfb3V0KTsKK30KKwordm9pZAoraWw0OTY1X2luaXRfc2Vuc2l0aXZpdHkoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQgPSAwOworCWludCBpOworCXN0cnVjdCBpbF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzICpyYW5nZXMgPSBpbC0+aHdfcGFyYW1zLnNlbnM7CisKKwlpZiAoaWwtPmRpc2FibGVfc2Vuc19jYWwpCisJCXJldHVybjsKKworCURfQ0FMSUIoIlN0YXJ0IGlsNDk2NV9pbml0X3NlbnNpdGl2aXR5XG4iKTsKKworCS8qIENsZWFyIGRyaXZlcidzIHNlbnNpdGl2aXR5IGFsZ28gZGF0YSAqLworCWRhdGEgPSAmKGlsLT5zZW5zaXRpdml0eV9kYXRhKTsKKworCWlmIChyYW5nZXMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJbWVtc2V0KGRhdGEsIDAsIHNpemVvZihzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfZGF0YSkpOworCisJZGF0YS0+bnVtX2luX2Nja19ub19mYSA9IDA7CisJZGF0YS0+bnJnX2N1cnJfc3RhdGUgPSBJTF9GQV9UT09fTUFOWTsKKwlkYXRhLT5ucmdfcHJldl9zdGF0ZSA9IElMX0ZBX1RPT19NQU5ZOworCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IDA7CisJZGF0YS0+bnJnX3NpbGVuY2VfaWR4ID0gMDsKKwlkYXRhLT5ucmdfZW5lcmd5X2lkeCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKwkJZGF0YS0+bnJnX3ZhbHVlW2ldID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBOUkdfTlVNX1BSRVZfU1RBVF9MOyBpKyspCisJCWRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbaV0gPSAwOworCisJZGF0YS0+YXV0b19jb3JyX29mZG0gPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbTsKKwlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV9tcmM7CisJZGF0YS0+YXV0b19jb3JyX29mZG1feDEgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV94MTsKKwlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV9tcmNfeDE7CisJZGF0YS0+YXV0b19jb3JyX2NjayA9IEFVVE9fQ09SUl9DQ0tfTUlOX1ZBTF9ERUY7CisJZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fY2NrX21yYzsKKwlkYXRhLT5ucmdfdGhfY2NrID0gcmFuZ2VzLT5ucmdfdGhfY2NrOworCWRhdGEtPm5yZ190aF9vZmRtID0gcmFuZ2VzLT5ucmdfdGhfb2ZkbTsKKwlkYXRhLT5iYXJrZXJfY29ycl90aF9taW4gPSByYW5nZXMtPmJhcmtlcl9jb3JyX3RoX21pbjsKKwlkYXRhLT5iYXJrZXJfY29ycl90aF9taW5fbXJjID0gcmFuZ2VzLT5iYXJrZXJfY29ycl90aF9taW5fbXJjOworCWRhdGEtPm5yZ190aF9jY2EgPSByYW5nZXMtPm5yZ190aF9jY2E7CisKKwlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtID0gMDsKKwlkYXRhLT5sYXN0X2ZhX2NudF9vZmRtID0gMDsKKwlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgPSAwOworCWRhdGEtPmxhc3RfZmFfY250X2NjayA9IDA7CisKKwlyZXQgfD0gaWw0OTY1X3NlbnNpdGl2aXR5X3dyaXRlKGlsKTsKKwlEX0NBTElCKCI8PHJldHVybiAweCVYXG4iLCByZXQpOworfQorCit2b2lkCitpbDQ5NjVfc2Vuc2l0aXZpdHlfY2FsaWJyYXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCB2b2lkICpyZXNwKQoreworCXUzMiByeF9lbmFibGVfdGltZTsKKwl1MzIgZmFfY2NrOworCXUzMiBmYV9vZmRtOworCXUzMiBiYWRfcGxjcF9jY2s7CisJdTMyIGJhZF9wbGNwX29mZG07CisJdTMyIG5vcm1fZmFfb2ZkbTsKKwl1MzIgbm9ybV9mYV9jY2s7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOworCXN0cnVjdCBzdGF0c19yeF9ub25fcGh5ICpyeF9pbmZvOworCXN0cnVjdCBzdGF0c19yeF9waHkgKm9mZG0sICpjY2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3RhdHNfZ2VuZXJhbF9kYXRhIHN0YXRpczsKKworCWlmIChpbC0+ZGlzYWJsZV9zZW5zX2NhbCkKKwkJcmV0dXJuOworCisJZGF0YSA9ICYoaWwtPnNlbnNpdGl2aXR5X2RhdGEpOworCisJaWYgKCFpbF9pc19hbnlfYXNzb2NpYXRlZChpbCkpIHsKKwkJRF9DQUxJQigiPDwgLSBub3QgYXNzb2NpYXRlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCXJ4X2luZm8gPSAmKCgoc3RydWN0IGlsX25vdGlmX3N0YXRzICopcmVzcCktPnJ4LmdlbmVyYWwpOworCW9mZG0gPSAmKCgoc3RydWN0IGlsX25vdGlmX3N0YXRzICopcmVzcCktPnJ4Lm9mZG0pOworCWNjayA9ICYoKChzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgKilyZXNwKS0+cnguY2NrKTsKKworCWlmIChyeF9pbmZvLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnICE9IElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSkgeworCQlEX0NBTElCKCI8PCBpbnZhbGlkIGRhdGEuXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEV4dHJhY3QgU3RhdGlzdGljczogKi8KKwlyeF9lbmFibGVfdGltZSA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmNoYW5uZWxfbG9hZCk7CisJZmFfY2NrID0gbGUzMl90b19jcHUoY2NrLT5mYWxzZV9hbGFybV9jbnQpOworCWZhX29mZG0gPSBsZTMyX3RvX2NwdShvZmRtLT5mYWxzZV9hbGFybV9jbnQpOworCWJhZF9wbGNwX2NjayA9IGxlMzJfdG9fY3B1KGNjay0+cGxjcF9lcnIpOworCWJhZF9wbGNwX29mZG0gPSBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2Vycik7CisKKwlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9hID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKTsKKwlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9iID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKTsKKwlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9jID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jKTsKKwlzdGF0aXMuYmVhY29uX2VuZXJneV9hID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX2VuZXJneV9hKTsKKwlzdGF0aXMuYmVhY29uX2VuZXJneV9iID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX2VuZXJneV9iKTsKKwlzdGF0aXMuYmVhY29uX2VuZXJneV9jID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX2VuZXJneV9jKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlEX0NBTElCKCJyeF9lbmFibGVfdGltZSA9ICV1IHVzZWNzXG4iLCByeF9lbmFibGVfdGltZSk7CisKKwlpZiAoIXJ4X2VuYWJsZV90aW1lKSB7CisJCURfQ0FMSUIoIjw8IFJYIEVuYWJsZSBUaW1lID09IDAhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoZXNlIHN0YXRzIGluY3JlYXNlIG1vbm90b25pY2FsbHksIGFuZCBkbyBub3QgcmVzZXQKKwkgKiAgIGF0IGVhY2ggYmVhY29uLiAgQ2FsY3VsYXRlIGRpZmZlcmVuY2UgZnJvbSBsYXN0IHZhbHVlLCBvciBqdXN0CisJICogICB1c2UgdGhlIG5ldyBzdGF0cyB2YWx1ZSBpZiBpdCBoYXMgcmVzZXQgb3Igd3JhcHBlZCBhcm91bmQuICovCisJaWYgKGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayA+IGJhZF9wbGNwX2NjaykKKwkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrID0gYmFkX3BsY3BfY2NrOworCWVsc2UgeworCQliYWRfcGxjcF9jY2sgLT0gZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrOworCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgKz0gYmFkX3BsY3BfY2NrOworCX0KKworCWlmIChkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtID4gYmFkX3BsY3Bfb2ZkbSkKKwkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbSA9IGJhZF9wbGNwX29mZG07CisJZWxzZSB7CisJCWJhZF9wbGNwX29mZG0gLT0gZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbTsKKwkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbSArPSBiYWRfcGxjcF9vZmRtOworCX0KKworCWlmIChkYXRhLT5sYXN0X2ZhX2NudF9vZmRtID4gZmFfb2ZkbSkKKwkJZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbSA9IGZhX29mZG07CisJZWxzZSB7CisJCWZhX29mZG0gLT0gZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbTsKKwkJZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbSArPSBmYV9vZmRtOworCX0KKworCWlmIChkYXRhLT5sYXN0X2ZhX2NudF9jY2sgPiBmYV9jY2spCisJCWRhdGEtPmxhc3RfZmFfY250X2NjayA9IGZhX2NjazsKKwllbHNlIHsKKwkJZmFfY2NrIC09IGRhdGEtPmxhc3RfZmFfY250X2NjazsKKwkJZGF0YS0+bGFzdF9mYV9jbnRfY2NrICs9IGZhX2NjazsKKwl9CisKKwkvKiBUb3RhbCBhYm9ydGVkIHNpZ25hbCBsb2NrcyAqLworCW5vcm1fZmFfb2ZkbSA9IGZhX29mZG0gKyBiYWRfcGxjcF9vZmRtOworCW5vcm1fZmFfY2NrID0gZmFfY2NrICsgYmFkX3BsY3BfY2NrOworCisJRF9DQUxJQigiY2NrOiBmYSAldSBiYWRwICV1ICBvZmRtOiBmYSAldSBiYWRwICV1XG4iLCBmYV9jY2ssCisJCWJhZF9wbGNwX2NjaywgZmFfb2ZkbSwgYmFkX3BsY3Bfb2ZkbSk7CisKKwlpbDQ5NjVfc2Vuc19hdXRvX2NvcnJfb2ZkbShpbCwgbm9ybV9mYV9vZmRtLCByeF9lbmFibGVfdGltZSk7CisJaWw0OTY1X3NlbnNfZW5lcmd5X2NjayhpbCwgbm9ybV9mYV9jY2ssIHJ4X2VuYWJsZV90aW1lLCAmc3RhdGlzKTsKKworCWlsNDk2NV9zZW5zaXRpdml0eV93cml0ZShpbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsNDk2NV9maW5kX2ZpcnN0X2NoYWluKHU4IG1hc2spCit7CisJaWYgKG1hc2sgJiBBTlRfQSkKKwkJcmV0dXJuIENIQUlOX0E7CisJaWYgKG1hc2sgJiBBTlRfQikKKwkJcmV0dXJuIENIQUlOX0I7CisJcmV0dXJuIENIQUlOX0M7Cit9CisKKy8qKgorICogUnVuIGRpc2Nvbm5lY3RlZCBhbnRlbm5hIGFsZ29yaXRobSB0byBmaW5kIG91dCB3aGljaCBhbnRlbm5hcyBhcmUKKyAqIGRpc2Nvbm5lY3RlZC4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9maW5kX2Rpc2Nvbm5fYW50ZW5uYShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiAqIGF2ZXJhZ2Vfc2lnLAorCQkJICAgIHN0cnVjdCBpbF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhKQoreworCXUzMiBhY3RpdmVfY2hhaW5zID0gMDsKKwl1MzIgbWF4X2F2ZXJhZ2Vfc2lnOworCXUxNiBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pOworCXU4IG51bV90eF9jaGFpbnM7CisJdTggZmlyc3RfY2hhaW47CisJdTE2IGkgPSAwOworCisJYXZlcmFnZV9zaWdbMF0gPQorCSAgICBkYXRhLT5jaGFpbl9zaWduYWxfYSAvCisJICAgIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKwlhdmVyYWdlX3NpZ1sxXSA9CisJICAgIGRhdGEtPmNoYWluX3NpZ25hbF9iIC8KKwkgICAgaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOworCWF2ZXJhZ2Vfc2lnWzJdID0KKwkgICAgZGF0YS0+Y2hhaW5fc2lnbmFsX2MgLworCSAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnM7CisKKwlpZiAoYXZlcmFnZV9zaWdbMF0gPj0gYXZlcmFnZV9zaWdbMV0pIHsKKwkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMF07CisJCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAwOworCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7CisJfSBlbHNlIHsKKwkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMV07CisJCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAxOworCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7CisJfQorCisJaWYgKGF2ZXJhZ2Vfc2lnWzJdID49IG1heF9hdmVyYWdlX3NpZykgeworCQltYXhfYXZlcmFnZV9zaWcgPSBhdmVyYWdlX3NpZ1syXTsKKwkJbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSA9IDI7CisJCWFjdGl2ZV9jaGFpbnMgPSAoMSA8PCBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKTsKKwl9CisKKwlEX0NBTElCKCJhdmVyYWdlX3NpZzogYSAlZCBiICVkIGMgJWRcbiIsIGF2ZXJhZ2Vfc2lnWzBdLCBhdmVyYWdlX3NpZ1sxXSwKKwkJYXZlcmFnZV9zaWdbMl0pOworCURfQ0FMSUIoIm1heF9hdmVyYWdlX3NpZyA9ICVkLCBhbnRlbm5hICVkXG4iLCBtYXhfYXZlcmFnZV9zaWcsCisJCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpOworCisJLyogQ29tcGFyZSBzaWduYWwgc3RyZW5ndGhzIGZvciBhbGwgMyByZWNlaXZlcnMuICovCisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgeworCQlpZiAoaSAhPSBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKSB7CisJCQlzMzIgcnNzaV9kZWx0YSA9IChtYXhfYXZlcmFnZV9zaWcgLSBhdmVyYWdlX3NpZ1tpXSk7CisKKwkJCS8qIElmIHNpZ25hbCBpcyB2ZXJ5IHdlYWssIGNvbXBhcmVkIHdpdGgKKwkJCSAqIHN0cm9uZ2VzdCwgbWFyayBpdCBhcyBkaXNjb25uZWN0ZWQuICovCisJCQlpZiAocnNzaV9kZWx0YSA+IE1BWElNVU1fQUxMT1dFRF9QQVRITE9TUykKKwkJCQlkYXRhLT5kaXNjb25uX2FycmF5W2ldID0gMTsKKwkJCWVsc2UKKwkJCQlhY3RpdmVfY2hhaW5zIHw9ICgxIDw8IGkpOworCQkJRF9DQUxJQigiaSA9ICVkICByc3NpRGVsdGEgPSAlZCAgIgorCQkJCSJkaXNjb25uX2FycmF5W2ldID0gJWRcbiIsIGksIHJzc2lfZGVsdGEsCisJCQkJZGF0YS0+ZGlzY29ubl9hcnJheVtpXSk7CisJCX0KKwl9CisKKwkvKgorCSAqIFRoZSBhYm92ZSBhbGdvcml0aG0gc29tZXRpbWVzIGZhaWxzIHdoZW4gdGhlIHVjb2RlCisJICogcmVwb3J0cyAwIGZvciBhbGwgY2hhaW5zLiBJdCdzIG5vdCBjbGVhciB3aHkgdGhhdAorCSAqIGhhcHBlbnMgdG8gc3RhcnQgd2l0aCwgYnV0IGl0IGlzIHRoZW4gY2F1c2luZyB0cm91YmxlCisJICogYmVjYXVzZSB0aGlzIGNhbiBtYWtlIHVzIGVuYWJsZSBtb3JlIGNoYWlucyB0aGFuIHRoZQorCSAqIGhhcmR3YXJlIHJlYWxseSBoYXMuCisJICoKKwkgKiBUbyBiZSBzYWZlLCBzaW1wbHkgbWFzayBvdXQgYW55IGNoYWlucyB0aGF0IHdlIGtub3cKKwkgKiBhcmUgbm90IG9uIHRoZSBkZXZpY2UuCisJICovCisJYWN0aXZlX2NoYWlucyAmPSBpbC0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudDsKKworCW51bV90eF9jaGFpbnMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfQ0hBSU5TOyBpKyspIHsKKwkJLyogbG9vcHMgb24gYWxsIHRoZSBiaXRzIG9mCisJCSAqIGlsLT5od19zZXR0aW5nLnZhbGlkX3R4X2FudCAqLworCQl1OCBhbnRfbXNrID0gKDEgPDwgaSk7CisJCWlmICghKGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgYW50X21zaykpCisJCQljb250aW51ZTsKKworCQludW1fdHhfY2hhaW5zKys7CisJCWlmIChkYXRhLT5kaXNjb25uX2FycmF5W2ldID09IDApCisJCQkvKiB0aGVyZSBpcyBhIFR4IGFudGVubmEgY29ubmVjdGVkICovCisJCQlicmVhazsKKwkJaWYgKG51bV90eF9jaGFpbnMgPT0gaWwtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtICYmCisJCSAgICBkYXRhLT5kaXNjb25uX2FycmF5W2ldKSB7CisJCQkvKgorCQkJICogSWYgYWxsIGNoYWlucyBhcmUgZGlzY29ubmVjdGVkCisJCQkgKiBjb25uZWN0IHRoZSBmaXJzdCB2YWxpZCB0eCBjaGFpbgorCQkJICovCisJCQlmaXJzdF9jaGFpbiA9CisJCQkgICAgaWw0OTY1X2ZpbmRfZmlyc3RfY2hhaW4oaWwtPmNmZy0+dmFsaWRfdHhfYW50KTsKKwkJCWRhdGEtPmRpc2Nvbm5fYXJyYXlbZmlyc3RfY2hhaW5dID0gMDsKKwkJCWFjdGl2ZV9jaGFpbnMgfD0gQklUKGZpcnN0X2NoYWluKTsKKwkJCURfQ0FMSUIoIkFsbCBUeCBjaGFpbnMgYXJlIGRpc2Nvbm5lY3RlZCIKKwkJCQkiLSBkZWNsYXJlICVkIGFzIGNvbm5lY3RlZFxuIiwgZmlyc3RfY2hhaW4pOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAoYWN0aXZlX2NoYWlucyAhPSBpbC0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudCAmJgorCSAgICBhY3RpdmVfY2hhaW5zICE9IGlsLT5jaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnMpCisJCURfQ0FMSUIoIkRldGVjdGVkIHRoYXQgbm90IGFsbCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkISAiCisJCQkiQ29ubmVjdGVkOiAlI3gsIHZhbGlkOiAlI3guXG4iLCBhY3RpdmVfY2hhaW5zLAorCQkJaWwtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQpOworCisJLyogU2F2ZSBmb3IgdXNlIHdpdGhpbiBSWE9OLCBUWCwgU0NBTiBjb21tYW5kcywgZXRjLiAqLworCWRhdGEtPmFjdGl2ZV9jaGFpbnMgPSBhY3RpdmVfY2hhaW5zOworCURfQ0FMSUIoImFjdGl2ZV9jaGFpbnMgKGJpdHdpc2UpID0gMHgleFxuIiwgYWN0aXZlX2NoYWlucyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfZ2Fpbl9jb21wdXRhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiAqIGF2ZXJhZ2Vfbm9pc2UsCisJCQl1MTYgbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pLCB1MzIgbWluX2F2ZXJhZ2Vfbm9pc2UsCisJCQl1OCBkZWZhdWx0X2NoYWluKQoreworCWludCBpLCByZXQ7CisJc3RydWN0IGlsX2NoYWluX25vaXNlX2RhdGEgKmRhdGEgPSAmaWwtPmNoYWluX25vaXNlX2RhdGE7CisKKwlkYXRhLT5kZWx0YV9nYWluX2NvZGVbbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pXSA9IDA7CisKKwlmb3IgKGkgPSBkZWZhdWx0X2NoYWluOyBpIDwgTlVNX1JYX0NIQUlOUzsgaSsrKSB7CisJCXMzMiBkZWx0YV9nID0gMDsKKworCQlpZiAoIWRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0gJiYKKwkJICAgIGRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9PQorCQkgICAgQ0hBSU5fTk9JU0VfREVMVEFfR0FJTl9JTklUX1ZBTCkgeworCQkJZGVsdGFfZyA9IGF2ZXJhZ2Vfbm9pc2VbaV0gLSBtaW5fYXZlcmFnZV9ub2lzZTsKKwkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9ICh1OCkgKChkZWx0YV9nICogMTApIC8gMTUpOworCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID0KKwkJCSAgICBtaW4oZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldLAorCQkJCSh1OCkgQ0hBSU5fTk9JU0VfTUFYX0RFTFRBX0dBSU5fQ09ERSk7CisKKwkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9CisJCQkgICAgKGRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSB8ICgxIDw8IDIpKTsKKwkJfSBlbHNlIHsKKwkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9IDA7CisJCX0KKwl9CisJRF9DQUxJQigiZGVsdGFfZ2Fpbl9jb2RlczogYSAlZCBiICVkIGMgJWRcbiIsIGRhdGEtPmRlbHRhX2dhaW5fY29kZVswXSwKKwkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzFdLCBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMl0pOworCisJLyogRGlmZmVyZW50aWFsIGdhaW4gZ2V0cyBzZW50IHRvIHVDb2RlIG9ubHkgb25jZSAqLworCWlmICghZGF0YS0+cmFkaW9fd3JpdGUpIHsKKwkJc3RydWN0IGlsX2NhbGliX2RpZmZfZ2Fpbl9jbWQgY21kOworCQlkYXRhLT5yYWRpb193cml0ZSA9IDE7CisKKwkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwkJY21kLmhkci5vcF9jb2RlID0gSUxfUEhZX0NBTElCUkFURV9ESUZGX0dBSU5fQ01EOworCQljbWQuZGlmZl9nYWluX2EgPSBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMF07CisJCWNtZC5kaWZmX2dhaW5fYiA9IGRhdGEtPmRlbHRhX2dhaW5fY29kZVsxXTsKKwkJY21kLmRpZmZfZ2Fpbl9jID0gZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzJdOworCQlyZXQgPSBpbF9zZW5kX2NtZF9wZHUoaWwsIENfUEhZX0NBTElCUkFUSU9OLCBzaXplb2YoY21kKSwgJmNtZCk7CisJCWlmIChyZXQpCisJCQlEX0NBTElCKCJmYWlsIHNlbmRpbmcgY21kICIgIkNfUEhZX0NBTElCUkFUSU9OXG4iKTsKKworCQkvKiBUT0RPIHdlIG1pZ2h0IHdhbnQgcmVjYWxjdWxhdGUKKwkJICogcnhfY2hhaW4gaW4gcnhvbiBjbWQgKi8KKworCQkvKiBNYXJrIHNvIHdlIHJ1biB0aGlzIGFsZ28gb25seSBvbmNlISAqLworCQlkYXRhLT5zdGF0ZSA9IElMX0NIQUlOX05PSVNFX0NBTElCUkFURUQ7CisJfQorfQorCisvKgorICogQWNjdW11bGF0ZSAxNiBiZWFjb25zIG9mIHNpZ25hbCBhbmQgbm9pc2Ugc3RhdHMgZm9yIGVhY2ggb2YKKyAqICAgMyByZWNlaXZlcnMvYW50ZW5uYXMvcngtY2hhaW5zLCB0aGVuIGZpZ3VyZSBvdXQ6CisgKiAxKSAgV2hpY2ggYW50ZW5uYXMgYXJlIGNvbm5lY3RlZC4KKyAqIDIpICBEaWZmZXJlbnRpYWwgcnggZ2FpbiBzZXR0aW5ncyB0byBiYWxhbmNlIHRoZSAzIHJlY2VpdmVycy4KKyAqLwordm9pZAoraWw0OTY1X2NoYWluX25vaXNlX2NhbGlicmF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgdm9pZCAqc3RhdF9yZXNwKQoreworCXN0cnVjdCBpbF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gTlVMTDsKKworCXUzMiBjaGFpbl9ub2lzZV9hOworCXUzMiBjaGFpbl9ub2lzZV9iOworCXUzMiBjaGFpbl9ub2lzZV9jOworCXUzMiBjaGFpbl9zaWdfYTsKKwl1MzIgY2hhaW5fc2lnX2I7CisJdTMyIGNoYWluX3NpZ19jOworCXUzMiBhdmVyYWdlX3NpZ1tOVU1fUlhfQ0hBSU5TXSA9IHsgSU5JVElBTElaQVRJT05fVkFMVUUgfTsKKwl1MzIgYXZlcmFnZV9ub2lzZVtOVU1fUlhfQ0hBSU5TXSA9IHsgSU5JVElBTElaQVRJT05fVkFMVUUgfTsKKwl1MzIgbWluX2F2ZXJhZ2Vfbm9pc2UgPSBNSU5fQVZFUkFHRV9OT0lTRV9NQVhfVkFMVUU7CisJdTE2IG1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSA9IElOSVRJQUxJWkFUSU9OX1ZBTFVFOworCXUxNiBpID0gMDsKKwl1MTYgcnhvbl9jaG51bSA9IElOSVRJQUxJWkFUSU9OX1ZBTFVFOworCXUxNiBzdGF0X2NobnVtID0gSU5JVElBTElaQVRJT05fVkFMVUU7CisJdTggcnhvbl9iYW5kMjQ7CisJdTggc3RhdF9iYW5kMjQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc3RhdHNfcnhfbm9uX3BoeSAqcnhfaW5mbzsKKworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJaWYgKGlsLT5kaXNhYmxlX2NoYWluX25vaXNlX2NhbCkKKwkJcmV0dXJuOworCisJZGF0YSA9ICYoaWwtPmNoYWluX25vaXNlX2RhdGEpOworCisJLyoKKwkgKiBBY2N1bXVsYXRlIGp1c3QgdGhlIGZpcnN0ICJjaGFpbl9ub2lzZV9udW1fYmVhY29ucyIgYWZ0ZXIKKwkgKiB0aGUgZmlyc3QgYXNzb2NpYXRpb24sIHRoZW4gd2UncmUgZG9uZSBmb3JldmVyLgorCSAqLworCWlmIChkYXRhLT5zdGF0ZSAhPSBJTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFKSB7CisJCWlmIChkYXRhLT5zdGF0ZSA9PSBJTF9DSEFJTl9OT0lTRV9BTElWRSkKKwkJCURfQ0FMSUIoIldhaXQgZm9yIG5vaXNlIGNhbGliIHJlc2V0XG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJcnhfaW5mbyA9ICYoKChzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgKilzdGF0X3Jlc3ApLT5yeC5nZW5lcmFsKTsKKworCWlmIChyeF9pbmZvLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnICE9IElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSkgeworCQlEX0NBTElCKCIgPDwgSW50ZXJmZXJlbmNlIGRhdGEgdW5hdmFpbGFibGVcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJcnhvbl9iYW5kMjQgPSAhIShjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spOworCXJ4b25fY2hudW0gPSBsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCk7CisKKwlzdGF0X2JhbmQyNCA9CisJICAgICEhKCgoc3RydWN0IGlsX25vdGlmX3N0YXRzICopc3RhdF9yZXNwKS0+CisJICAgICAgIGZsYWcgJiBTVEFUU19SRVBMWV9GTEdfQkFORF8yNEdfTVNLKTsKKwlzdGF0X2NobnVtID0KKwkgICAgbGUzMl90b19jcHUoKChzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgKilzdGF0X3Jlc3ApLT5mbGFnKSA+PiAxNjsKKworCS8qIE1ha2Ugc3VyZSB3ZSBhY2N1bXVsYXRlIGRhdGEgZm9yIGp1c3QgdGhlIGFzc29jaWF0ZWQgY2hhbm5lbAorCSAqICAgKGV2ZW4gaWYgc2Nhbm5pbmcpLiAqLworCWlmIChyeG9uX2NobnVtICE9IHN0YXRfY2hudW0gfHwgcnhvbl9iYW5kMjQgIT0gc3RhdF9iYW5kMjQpIHsKKwkJRF9DQUxJQigiU3RhdHMgbm90IGZyb20gY2hhbj0lZCwgYmFuZDI0PSVkXG4iLCByeG9uX2NobnVtLAorCQkJcnhvbl9iYW5kMjQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiAgQWNjdW11bGF0ZSBiZWFjb24gc3RhdHMgdmFsdWVzIGFjcm9zcworCSAqICJjaGFpbl9ub2lzZV9udW1fYmVhY29ucyIKKwkgKi8KKwljaGFpbl9ub2lzZV9hID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKSAmIElOX0JBTkRfRklMVEVSOworCWNoYWluX25vaXNlX2IgPQorCSAgICBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpICYgSU5fQkFORF9GSUxURVI7CisJY2hhaW5fbm9pc2VfYyA9CisJICAgIGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYykgJiBJTl9CQU5EX0ZJTFRFUjsKKworCWNoYWluX3NpZ19hID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3Jzc2lfYSkgJiBJTl9CQU5EX0ZJTFRFUjsKKwljaGFpbl9zaWdfYiA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9yc3NpX2IpICYgSU5fQkFORF9GSUxURVI7CisJY2hhaW5fc2lnX2MgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fcnNzaV9jKSAmIElOX0JBTkRfRklMVEVSOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWRhdGEtPmJlYWNvbl9jb3VudCsrOworCisJZGF0YS0+Y2hhaW5fbm9pc2VfYSA9IChjaGFpbl9ub2lzZV9hICsgZGF0YS0+Y2hhaW5fbm9pc2VfYSk7CisJZGF0YS0+Y2hhaW5fbm9pc2VfYiA9IChjaGFpbl9ub2lzZV9iICsgZGF0YS0+Y2hhaW5fbm9pc2VfYik7CisJZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IChjaGFpbl9ub2lzZV9jICsgZGF0YS0+Y2hhaW5fbm9pc2VfYyk7CisKKwlkYXRhLT5jaGFpbl9zaWduYWxfYSA9IChjaGFpbl9zaWdfYSArIGRhdGEtPmNoYWluX3NpZ25hbF9hKTsKKwlkYXRhLT5jaGFpbl9zaWduYWxfYiA9IChjaGFpbl9zaWdfYiArIGRhdGEtPmNoYWluX3NpZ25hbF9iKTsKKwlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IChjaGFpbl9zaWdfYyArIGRhdGEtPmNoYWluX3NpZ25hbF9jKTsKKworCURfQ0FMSUIoImNoYW49JWQsIGJhbmQyND0lZCwgYmVhY29uPSVkXG4iLCByeG9uX2NobnVtLCByeG9uX2JhbmQyNCwKKwkJZGF0YS0+YmVhY29uX2NvdW50KTsKKwlEX0NBTElCKCJjaGFpbl9zaWc6IGEgJWQgYiAlZCBjICVkXG4iLCBjaGFpbl9zaWdfYSwgY2hhaW5fc2lnX2IsCisJCWNoYWluX3NpZ19jKTsKKwlEX0NBTElCKCJjaGFpbl9ub2lzZTogYSAlZCBiICVkIGMgJWRcbiIsIGNoYWluX25vaXNlX2EsIGNoYWluX25vaXNlX2IsCisJCWNoYWluX25vaXNlX2MpOworCisJLyogSWYgdGhpcyBpcyB0aGUgImNoYWluX25vaXNlX251bV9iZWFjb25zIiwgZGV0ZXJtaW5lOgorCSAqIDEpICBEaXNjb25uZWN0ZWQgYW50ZW5uYXMgKHVzaW5nIHNpZ25hbCBzdHJlbmd0aHMpCisJICogMikgIERpZmZlcmVudGlhbCBnYWluICh1c2luZyBzaWxlbmNlIG5vaXNlKSB0byBiYWxhbmNlIHJlY2VpdmVycyAqLworCWlmIChkYXRhLT5iZWFjb25fY291bnQgIT0gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zKQorCQlyZXR1cm47CisKKwkvKiBBbmFseXplIHNpZ25hbCBmb3IgZGlzY29ubmVjdGVkIGFudGVubmEgKi8KKwlpbDQ5NjVfZmluZF9kaXNjb25uX2FudGVubmEoaWwsIGF2ZXJhZ2Vfc2lnLCBkYXRhKTsKKworCS8qIEFuYWx5emUgbm9pc2UgZm9yIHJ4IGJhbGFuY2UgKi8KKwlhdmVyYWdlX25vaXNlWzBdID0KKwkgICAgZGF0YS0+Y2hhaW5fbm9pc2VfYSAvIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKwlhdmVyYWdlX25vaXNlWzFdID0KKwkgICAgZGF0YS0+Y2hhaW5fbm9pc2VfYiAvIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKwlhdmVyYWdlX25vaXNlWzJdID0KKwkgICAgZGF0YS0+Y2hhaW5fbm9pc2VfYyAvIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfQ0hBSU5TOyBpKyspIHsKKwkJaWYgKCFkYXRhLT5kaXNjb25uX2FycmF5W2ldICYmCisJCSAgICBhdmVyYWdlX25vaXNlW2ldIDw9IG1pbl9hdmVyYWdlX25vaXNlKSB7CisJCQkvKiBUaGlzIG1lYW5zIHRoYXQgY2hhaW4gaSBpcyBhY3RpdmUgYW5kIGhhcworCQkJICogbG93ZXIgbm9pc2UgdmFsdWVzIHNvIGZhcjogKi8KKwkJCW1pbl9hdmVyYWdlX25vaXNlID0gYXZlcmFnZV9ub2lzZVtpXTsKKwkJCW1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSA9IGk7CisJCX0KKwl9CisKKwlEX0NBTElCKCJhdmVyYWdlX25vaXNlOiBhICVkIGIgJWQgYyAlZFxuIiwgYXZlcmFnZV9ub2lzZVswXSwKKwkJYXZlcmFnZV9ub2lzZVsxXSwgYXZlcmFnZV9ub2lzZVsyXSk7CisKKwlEX0NBTElCKCJtaW5fYXZlcmFnZV9ub2lzZSA9ICVkLCBhbnRlbm5hICVkXG4iLCBtaW5fYXZlcmFnZV9ub2lzZSwKKwkJbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pKTsKKworCWlsNDk2NV9nYWluX2NvbXB1dGF0aW9uKGlsLCBhdmVyYWdlX25vaXNlLCBtaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2ksCisJCQkJbWluX2F2ZXJhZ2Vfbm9pc2UsCisJCQkJaWw0OTY1X2ZpbmRfZmlyc3RfY2hhaW4oaWwtPmNmZy0+dmFsaWRfcnhfYW50KSk7CisKKwkvKiBTb21lIHBvd2VyIGNoYW5nZXMgbWF5IGhhdmUgYmVlbiBtYWRlIGR1cmluZyB0aGUgY2FsaWJyYXRpb24uCisJICogVXBkYXRlIGFuZCBjb21taXQgdGhlIFJYT04KKwkgKi8KKwlpZiAoaWwtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncykKKwkJaWwtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncyhpbCk7CisKKwlkYXRhLT5zdGF0ZSA9IElMX0NIQUlOX05PSVNFX0RPTkU7CisJaWxfcG93ZXJfdXBkYXRlX21vZGUoaWwsIGZhbHNlKTsKK30KKwordm9pZAoraWw0OTY1X3Jlc2V0X3J1bl90aW1lX2NhbGliKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgaTsKKwltZW1zZXQoJihpbC0+c2Vuc2l0aXZpdHlfZGF0YSksIDAsIHNpemVvZihzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfZGF0YSkpOworCW1lbXNldCgmKGlsLT5jaGFpbl9ub2lzZV9kYXRhKSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9jaGFpbl9ub2lzZV9kYXRhKSk7CisJZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykKKwkJaWwtPmNoYWluX25vaXNlX2RhdGEuZGVsdGFfZ2Fpbl9jb2RlW2ldID0KKwkJICAgIENIQUlOX05PSVNFX0RFTFRBX0dBSU5fSU5JVF9WQUw7CisKKwkvKiBBc2sgZm9yIHN0YXRzIG5vdywgdGhlIHVDb2RlIHdpbGwgc2VuZCBub3RpZmljYXRpb24KKwkgKiBwZXJpb2RpY2FsbHkgYWZ0ZXIgYXNzb2NpYXRpb24gKi8KKwlpbF9zZW5kX3N0YXRzX3JlcXVlc3QoaWwsIENNRF9BU1lOQywgdHJ1ZSk7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LWRlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LWRlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThlYzM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtZGVidWcuYwpAQCAtMCwwICsxLDc0NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiBHUEwgTElDRU5TRSBTVU1NQVJZCisqCisqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyoKKyogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisqCisqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisqIFVTQQorKgorKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisqCisqIENvbnRhY3QgSW5mb3JtYXRpb246CisqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiNDk2NS5oIgorCitzdGF0aWMgY29uc3QgY2hhciAqZm10X3ZhbHVlID0gIiAgJS0zMHMgJTEwdVxuIjsKK3N0YXRpYyBjb25zdCBjaGFyICpmbXRfdGFibGUgPSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iOworc3RhdGljIGNvbnN0IGNoYXIgKmZtdF9oZWFkZXIgPQorICAgICIlLTMycyAgICBjdXJyZW50ICBjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iOworCitzdGF0aWMgaW50CitpbDQ5NjVfc3RhdHNfZmxhZyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnN6KQoreworCWludCBwID0gMDsKKwl1MzIgZmxhZzsKKworCWZsYWcgPSBsZTMyX3RvX2NwdShpbC0+XzQ5NjUuc3RhdHMuZmxhZyk7CisKKwlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsICJTdGF0aXN0aWNzIEZsYWcoMHglWCk6XG4iLCBmbGFnKTsKKwlpZiAoZmxhZyAmIFVDT0RFX1NUQVRTX0NMRUFSX01TSykKKwkJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLAorCQkJICAgICAgICJcdFN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOworCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0T3BlcmF0aW9uYWwgRnJlcXVlbmN5OiAlc1xuIiwKKwkJICAgICAgIChmbGFnICYgVUNPREVfU1RBVFNfRlJFUVVFTkNZX01TSykgPyAiMi40IEdIeiIgOgorCQkgICAgICAgIjUuMiBHSHoiKTsKKwlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsICJcdFRHaiBOYXJyb3cgQmFuZDogJXNcbiIsCisJCSAgICAgICAoZmxhZyAmIFVDT0RFX1NUQVRTX05BUlJPV19CQU5EX01TSykgPyAiZW5hYmxlZCIgOgorCQkgICAgICAgImRpc2FibGVkIik7CisKKwlyZXR1cm4gcDsKK30KKworc3NpemVfdAoraWw0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0KKwkgICAgc2l6ZW9mKHN0cnVjdCBzdGF0c19yeF9waHkpICogNDAgKworCSAgICBzaXplb2Yoc3RydWN0IHN0YXRzX3J4X25vbl9waHkpICogNDAgKworCSAgICBzaXplb2Yoc3RydWN0IHN0YXRzX3J4X2h0X3BoeSkgKiA0MCArIDQwMDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3Qgc3RhdHNfcnhfcGh5ICpvZmRtLCAqYWNjdW1fb2ZkbSwgKmRlbHRhX29mZG0sICptYXhfb2ZkbTsKKwlzdHJ1Y3Qgc3RhdHNfcnhfcGh5ICpjY2ssICphY2N1bV9jY2ssICpkZWx0YV9jY2ssICptYXhfY2NrOworCXN0cnVjdCBzdGF0c19yeF9ub25fcGh5ICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdHNfcnhfbm9uX3BoeSAqZGVsdGFfZ2VuZXJhbCwgKm1heF9nZW5lcmFsOworCXN0cnVjdCBzdGF0c19yeF9odF9waHkgKmh0LCAqYWNjdW1faHQsICpkZWx0YV9odCwgKm1heF9odDsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCUlMX0VSUigiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKgorCSAqIHRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCisJICogdGhlIGxhc3Qgc3RhdHMgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKKwkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQorCSAqLworCW9mZG0gPSAmaWwtPl80OTY1LnN0YXRzLnJ4Lm9mZG07CisJY2NrID0gJmlsLT5fNDk2NS5zdGF0cy5yeC5jY2s7CisJZ2VuZXJhbCA9ICZpbC0+XzQ5NjUuc3RhdHMucnguZ2VuZXJhbDsKKwlodCA9ICZpbC0+XzQ5NjUuc3RhdHMucngub2ZkbV9odDsKKwlhY2N1bV9vZmRtID0gJmlsLT5fNDk2NS5hY2N1bV9zdGF0cy5yeC5vZmRtOworCWFjY3VtX2NjayA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMucnguY2NrOworCWFjY3VtX2dlbmVyYWwgPSAmaWwtPl80OTY1LmFjY3VtX3N0YXRzLnJ4LmdlbmVyYWw7CisJYWNjdW1faHQgPSAmaWwtPl80OTY1LmFjY3VtX3N0YXRzLnJ4Lm9mZG1faHQ7CisJZGVsdGFfb2ZkbSA9ICZpbC0+XzQ5NjUuZGVsdGFfc3RhdHMucngub2ZkbTsKKwlkZWx0YV9jY2sgPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLnJ4LmNjazsKKwlkZWx0YV9nZW5lcmFsID0gJmlsLT5fNDk2NS5kZWx0YV9zdGF0cy5yeC5nZW5lcmFsOworCWRlbHRhX2h0ID0gJmlsLT5fNDk2NS5kZWx0YV9zdGF0cy5yeC5vZmRtX2h0OworCW1heF9vZmRtID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEucngub2ZkbTsKKwltYXhfY2NrID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEucnguY2NrOworCW1heF9nZW5lcmFsID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEucnguZ2VuZXJhbDsKKwltYXhfaHQgPSAmaWwtPl80OTY1Lm1heF9kZWx0YS5yeC5vZmRtX2h0OworCisJcG9zICs9IGlsNDk2NV9zdGF0c19mbGFnKGlsLCBidWYsIGJ1ZnN6KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF9oZWFkZXIsCisJCSAgICAgICJTdGF0aXN0aWNzX1J4IC0gT0ZETToiKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImluYV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+aW5hX2NudCksIGFjY3VtX29mZG0tPmluYV9jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPmluYV9jbnQsIG1heF9vZmRtLT5pbmFfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZpbmFfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfY250KSwgYWNjdW1fb2ZkbS0+ZmluYV9jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPmZpbmFfY250LCBtYXhfb2ZkbS0+ZmluYV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicGxjcF9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+cGxjcF9lcnIpLCBhY2N1bV9vZmRtLT5wbGNwX2VyciwKKwkJICAgICAgZGVsdGFfb2ZkbS0+cGxjcF9lcnIsIG1heF9vZmRtLT5wbGNwX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjcmMzMl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+Y3JjMzJfZXJyKSwgYWNjdW1fb2ZkbS0+Y3JjMzJfZXJyLAorCQkgICAgICBkZWx0YV9vZmRtLT5jcmMzMl9lcnIsIG1heF9vZmRtLT5jcmMzMl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9vZmRtLT5vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfb2ZkbS0+b3ZlcnJ1bl9lcnIsIG1heF9vZmRtLT5vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJlYXJseV9vdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5lYXJseV9vdmVycnVuX2VyciksCisJCSAgICAgIGFjY3VtX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAorCQkgICAgICBkZWx0YV9vZmRtLT5lYXJseV9vdmVycnVuX2VyciwKKwkJICAgICAgbWF4X29mZG0tPmVhcmx5X292ZXJydW5fZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImNyYzMyX2dvb2Q6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+Y3JjMzJfZ29vZCksIGFjY3VtX29mZG0tPmNyYzMyX2dvb2QsCisJCSAgICAgIGRlbHRhX29mZG0tPmNyYzMyX2dvb2QsIG1heF9vZmRtLT5jcmMzMl9nb29kKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZhbHNlX2FsYXJtX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5mYWxzZV9hbGFybV9jbnQpLAorCQkgICAgICBhY2N1bV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsIGRlbHRhX29mZG0tPmZhbHNlX2FsYXJtX2NudCwKKwkJICAgICAgbWF4X29mZG0tPmZhbHNlX2FsYXJtX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJmaW5hX3N5bmNfZXJyX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5maW5hX3N5bmNfZXJyX2NudCksCisJCSAgICAgIGFjY3VtX29mZG0tPmZpbmFfc3luY19lcnJfY250LAorCQkgICAgICBkZWx0YV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKKwkJICAgICAgbWF4X29mZG0tPmZpbmFfc3luY19lcnJfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNmZF90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnNmZF90aW1lb3V0KSwgYWNjdW1fb2ZkbS0+c2ZkX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX29mZG0tPnNmZF90aW1lb3V0LCBtYXhfb2ZkbS0+c2ZkX3RpbWVvdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZmluYV90aW1lb3V0OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfdGltZW91dCksIGFjY3VtX29mZG0tPmZpbmFfdGltZW91dCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+ZmluYV90aW1lb3V0LCBtYXhfb2ZkbS0+ZmluYV90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInVucmVzcG9uZGVkX3J0czoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT51bnJlc3BvbmRlZF9ydHMpLAorCQkgICAgICBhY2N1bV9vZmRtLT51bnJlc3BvbmRlZF9ydHMsIGRlbHRhX29mZG0tPnVucmVzcG9uZGVkX3J0cywKKwkJICAgICAgbWF4X29mZG0tPnVucmVzcG9uZGVkX3J0cyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJyeGVfZnJhbWVfbG10X292cnVuOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIGRlbHRhX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAorCQkgICAgICBtYXhfb2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2VudF9hY2tfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYWNrX2NudCksIGFjY3VtX29mZG0tPnNlbnRfYWNrX2NudCwKKwkJICAgICAgZGVsdGFfb2ZkbS0+c2VudF9hY2tfY250LCBtYXhfb2ZkbS0+c2VudF9hY2tfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNlbnRfY3RzX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5zZW50X2N0c19jbnQpLCBhY2N1bV9vZmRtLT5zZW50X2N0c19jbnQsCisJCSAgICAgIGRlbHRhX29mZG0tPnNlbnRfY3RzX2NudCwgbWF4X29mZG0tPnNlbnRfY3RzX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJzZW50X2JhX3JzcF9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+c2VudF9iYV9yc3BfY250KSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+c2VudF9iYV9yc3BfY250LCBkZWx0YV9vZmRtLT5zZW50X2JhX3JzcF9jbnQsCisJCSAgICAgIG1heF9vZmRtLT5zZW50X2JhX3JzcF9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZHNwX3NlbGZfa2lsbDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5kc3Bfc2VsZl9raWxsKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+ZHNwX3NlbGZfa2lsbCwgZGVsdGFfb2ZkbS0+ZHNwX3NlbGZfa2lsbCwKKwkJICAgICAgbWF4X29mZG0tPmRzcF9zZWxmX2tpbGwpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAibWhfZm9ybWF0X2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShvZmRtLT5taF9mb3JtYXRfZXJyKSwKKwkJICAgICAgYWNjdW1fb2ZkbS0+bWhfZm9ybWF0X2VyciwgZGVsdGFfb2ZkbS0+bWhfZm9ybWF0X2VyciwKKwkJICAgICAgbWF4X29mZG0tPm1oX2Zvcm1hdF9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAicmVfYWNxX21haW5fcnNzaV9zdW06IiwKKwkJICAgICAgbGUzMl90b19jcHUob2ZkbS0+cmVfYWNxX21haW5fcnNzaV9zdW0pLAorCQkgICAgICBhY2N1bV9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKKwkJICAgICAgZGVsdGFfb2ZkbS0+cmVfYWNxX21haW5fcnNzaV9zdW0sCisJCSAgICAgIG1heF9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSk7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF9oZWFkZXIsCisJCSAgICAgICJTdGF0aXN0aWNzX1J4IC0gQ0NLOiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiaW5hX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmluYV9jbnQpLCBhY2N1bV9jY2stPmluYV9jbnQsCisJCSAgICAgIGRlbHRhX2Njay0+aW5hX2NudCwgbWF4X2Njay0+aW5hX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJmaW5hX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmZpbmFfY250KSwgYWNjdW1fY2NrLT5maW5hX2NudCwKKwkJICAgICAgZGVsdGFfY2NrLT5maW5hX2NudCwgbWF4X2Njay0+ZmluYV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicGxjcF9lcnI6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5wbGNwX2VyciksIGFjY3VtX2Njay0+cGxjcF9lcnIsCisJCSAgICAgIGRlbHRhX2Njay0+cGxjcF9lcnIsIG1heF9jY2stPnBsY3BfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImNyYzMyX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmNyYzMyX2VyciksIGFjY3VtX2Njay0+Y3JjMzJfZXJyLAorCQkgICAgICBkZWx0YV9jY2stPmNyYzMyX2VyciwgbWF4X2Njay0+Y3JjMzJfZXJyKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgIm92ZXJydW5fZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGNjay0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9jY2stPm92ZXJydW5fZXJyLAorCQkgICAgICBkZWx0YV9jY2stPm92ZXJydW5fZXJyLCBtYXhfY2NrLT5vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJlYXJseV9vdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmVhcmx5X292ZXJydW5fZXJyKSwKKwkJICAgICAgYWNjdW1fY2NrLT5lYXJseV9vdmVycnVuX2VyciwKKwkJICAgICAgZGVsdGFfY2NrLT5lYXJseV9vdmVycnVuX2VyciwgbWF4X2Njay0+ZWFybHlfb3ZlcnJ1bl9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiY3JjMzJfZ29vZDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmNyYzMyX2dvb2QpLCBhY2N1bV9jY2stPmNyYzMyX2dvb2QsCisJCSAgICAgIGRlbHRhX2Njay0+Y3JjMzJfZ29vZCwgbWF4X2Njay0+Y3JjMzJfZ29vZCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJmYWxzZV9hbGFybV9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5mYWxzZV9hbGFybV9jbnQpLAorCQkgICAgICBhY2N1bV9jY2stPmZhbHNlX2FsYXJtX2NudCwgZGVsdGFfY2NrLT5mYWxzZV9hbGFybV9jbnQsCisJCSAgICAgIG1heF9jY2stPmZhbHNlX2FsYXJtX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJmaW5hX3N5bmNfZXJyX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmZpbmFfc3luY19lcnJfY250KSwKKwkJICAgICAgYWNjdW1fY2NrLT5maW5hX3N5bmNfZXJyX2NudCwKKwkJICAgICAgZGVsdGFfY2NrLT5maW5hX3N5bmNfZXJyX2NudCwgbWF4X2Njay0+ZmluYV9zeW5jX2Vycl9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2ZkX3RpbWVvdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5zZmRfdGltZW91dCksIGFjY3VtX2Njay0+c2ZkX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX2Njay0+c2ZkX3RpbWVvdXQsIG1heF9jY2stPnNmZF90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZpbmFfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPmZpbmFfdGltZW91dCksIGFjY3VtX2Njay0+ZmluYV90aW1lb3V0LAorCQkgICAgICBkZWx0YV9jY2stPmZpbmFfdGltZW91dCwgbWF4X2Njay0+ZmluYV90aW1lb3V0KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInVucmVzcG9uZGVkX3J0czoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnVucmVzcG9uZGVkX3J0cyksCisJCSAgICAgIGFjY3VtX2Njay0+dW5yZXNwb25kZWRfcnRzLCBkZWx0YV9jY2stPnVucmVzcG9uZGVkX3J0cywKKwkJICAgICAgbWF4X2Njay0+dW5yZXNwb25kZWRfcnRzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInJ4ZV9mcmFtZV9sbXRfb3ZydW46IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biksCisJCSAgICAgIGFjY3VtX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIGRlbHRhX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCisJCSAgICAgIG1heF9jY2stPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNlbnRfYWNrX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnNlbnRfYWNrX2NudCksIGFjY3VtX2Njay0+c2VudF9hY2tfY250LAorCQkgICAgICBkZWx0YV9jY2stPnNlbnRfYWNrX2NudCwgbWF4X2Njay0+c2VudF9hY2tfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNlbnRfY3RzX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnNlbnRfY3RzX2NudCksIGFjY3VtX2Njay0+c2VudF9jdHNfY250LAorCQkgICAgICBkZWx0YV9jY2stPnNlbnRfY3RzX2NudCwgbWF4X2Njay0+c2VudF9jdHNfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInNlbnRfYmFfcnNwX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnNlbnRfYmFfcnNwX2NudCksCisJCSAgICAgIGFjY3VtX2Njay0+c2VudF9iYV9yc3BfY250LCBkZWx0YV9jY2stPnNlbnRfYmFfcnNwX2NudCwKKwkJICAgICAgbWF4X2Njay0+c2VudF9iYV9yc3BfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImRzcF9zZWxmX2tpbGw6IiwKKwkJICAgICAgbGUzMl90b19jcHUoY2NrLT5kc3Bfc2VsZl9raWxsKSwgYWNjdW1fY2NrLT5kc3Bfc2VsZl9raWxsLAorCQkgICAgICBkZWx0YV9jY2stPmRzcF9zZWxmX2tpbGwsIG1heF9jY2stPmRzcF9zZWxmX2tpbGwpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAibWhfZm9ybWF0X2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPm1oX2Zvcm1hdF9lcnIpLCBhY2N1bV9jY2stPm1oX2Zvcm1hdF9lcnIsCisJCSAgICAgIGRlbHRhX2Njay0+bWhfZm9ybWF0X2VyciwgbWF4X2Njay0+bWhfZm9ybWF0X2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJyZV9hY3FfbWFpbl9yc3NpX3N1bToiLAorCQkgICAgICBsZTMyX3RvX2NwdShjY2stPnJlX2FjcV9tYWluX3Jzc2lfc3VtKSwKKwkJICAgICAgYWNjdW1fY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKKwkJICAgICAgZGVsdGFfY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKKwkJICAgICAgbWF4X2Njay0+cmVfYWNxX21haW5fcnNzaV9zdW0pOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfaGVhZGVyLAorCQkgICAgICAiU3RhdGlzdGljc19SeCAtIEdFTkVSQUw6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJib2d1c19jdHM6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+Ym9ndXNfY3RzKSwgYWNjdW1fZ2VuZXJhbC0+Ym9ndXNfY3RzLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5ib2d1c19jdHMsIG1heF9nZW5lcmFsLT5ib2d1c19jdHMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYm9ndXNfYWNrOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJvZ3VzX2FjayksIGFjY3VtX2dlbmVyYWwtPmJvZ3VzX2FjaywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfYWNrLCBtYXhfZ2VuZXJhbC0+Ym9ndXNfYWNrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgIm5vbl9ic3NpZF9mcmFtZXM6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcyksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMsCisJCSAgICAgIG1heF9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZpbHRlcmVkX2ZyYW1lczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcywKKwkJICAgICAgbWF4X2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJub25fY2hhbm5lbF9iZWFjb25zOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjaGFubmVsX2JlYWNvbnM6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+Y2hhbm5lbF9iZWFjb25zKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+Y2hhbm5lbF9iZWFjb25zLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMsCisJCSAgICAgIG1heF9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAibnVtX21pc3NlZF9iY29uOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm51bV9taXNzZWRfYmNvbiksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPm51bV9taXNzZWRfYmNvbiwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+bnVtX21pc3NlZF9iY29uLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+bnVtX21pc3NlZF9iY29uKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImFkY19yeF9zYXR1cmF0aW9uX3RpbWU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+YWRjX3J4X3NhdHVyYXRpb25fdGltZSksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUsCisJCSAgICAgIG1heF9nZW5lcmFsLT5hZGNfcnhfc2F0dXJhdGlvbl90aW1lKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImluYV9kZXRlY3Rfc2VhcmNoX3RtOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmluYV9kZXRlY3Rpb25fc2VhcmNoX3RpbWUpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5pbmFfZGV0ZWN0aW9uX3NlYXJjaF90aW1lLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5pbmFfZGV0ZWN0aW9uX3NlYXJjaF90aW1lLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+aW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJiZWFjb25fc2lsZW5jZV9yc3NpX2E6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9hLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EsCisJCSAgICAgIG1heF9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAiYmVhY29uX3NpbGVuY2VfcnNzaV9iOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYiksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYiwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImJlYWNvbl9zaWxlbmNlX3Jzc2lfYzoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYywKKwkJICAgICAgbWF4X2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJpbnRlcmZlcmVuY2VfZGF0YV9mbGFnOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+aW50ZXJmZXJlbmNlX2RhdGFfZmxhZyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjaGFubmVsX2xvYWQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+Y2hhbm5lbF9sb2FkKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+Y2hhbm5lbF9sb2FkLCBkZWx0YV9nZW5lcmFsLT5jaGFubmVsX2xvYWQsCisJCSAgICAgIG1heF9nZW5lcmFsLT5jaGFubmVsX2xvYWQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZHNwX2ZhbHNlX2FsYXJtczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5kc3BfZmFsc2VfYWxhcm1zKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+ZHNwX2ZhbHNlX2FsYXJtcywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+ZHNwX2ZhbHNlX2FsYXJtcywKKwkJICAgICAgbWF4X2dlbmVyYWwtPmRzcF9mYWxzZV9hbGFybXMpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYmVhY29uX3Jzc2lfYToiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fcnNzaV9hKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSwgbWF4X2dlbmVyYWwtPmJlYWNvbl9yc3NpX2EpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYmVhY29uX3Jzc2lfYjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fcnNzaV9iKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYiwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYiwgbWF4X2dlbmVyYWwtPmJlYWNvbl9yc3NpX2IpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYmVhY29uX3Jzc2lfYzoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fcnNzaV9jKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYywKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYywgbWF4X2dlbmVyYWwtPmJlYWNvbl9yc3NpX2MpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYmVhY29uX2VuZXJneV9hOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYSksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYSwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9hLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9hKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImJlYWNvbl9lbmVyZ3lfYjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fZW5lcmd5X2IpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2IsCisJCSAgICAgIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYiwKKwkJICAgICAgbWF4X2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJiZWFjb25fZW5lcmd5X2M6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9jKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9jLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MsCisJCSAgICAgIG1heF9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfaGVhZGVyLAorCQkgICAgICAiU3RhdGlzdGljc19SeCAtIE9GRE1fSFQ6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJwbGNwX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShodC0+cGxjcF9lcnIpLCBhY2N1bV9odC0+cGxjcF9lcnIsCisJCSAgICAgIGRlbHRhX2h0LT5wbGNwX2VyciwgbWF4X2h0LT5wbGNwX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJvdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShodC0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9odC0+b3ZlcnJ1bl9lcnIsCisJCSAgICAgIGRlbHRhX2h0LT5vdmVycnVuX2VyciwgbWF4X2h0LT5vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJlYXJseV9vdmVycnVuX2VycjoiLAorCQkgICAgICBsZTMyX3RvX2NwdShodC0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAorCQkgICAgICBhY2N1bV9odC0+ZWFybHlfb3ZlcnJ1bl9lcnIsIGRlbHRhX2h0LT5lYXJseV9vdmVycnVuX2VyciwKKwkJICAgICAgbWF4X2h0LT5lYXJseV9vdmVycnVuX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjcmMzMl9nb29kOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5jcmMzMl9nb29kKSwgYWNjdW1faHQtPmNyYzMyX2dvb2QsCisJCSAgICAgIGRlbHRhX2h0LT5jcmMzMl9nb29kLCBtYXhfaHQtPmNyYzMyX2dvb2QpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiY3JjMzJfZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5jcmMzMl9lcnIpLCBhY2N1bV9odC0+Y3JjMzJfZXJyLAorCQkgICAgICBkZWx0YV9odC0+Y3JjMzJfZXJyLCBtYXhfaHQtPmNyYzMyX2Vycik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJtaF9mb3JtYXRfZXJyOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5taF9mb3JtYXRfZXJyKSwgYWNjdW1faHQtPm1oX2Zvcm1hdF9lcnIsCisJCSAgICAgIGRlbHRhX2h0LT5taF9mb3JtYXRfZXJyLCBtYXhfaHQtPm1oX2Zvcm1hdF9lcnIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWdnX2NyYzMyX2dvb2Q6IiwKKwkJICAgICAgbGUzMl90b19jcHUoaHQtPmFnZ19jcmMzMl9nb29kKSwgYWNjdW1faHQtPmFnZ19jcmMzMl9nb29kLAorCQkgICAgICBkZWx0YV9odC0+YWdnX2NyYzMyX2dvb2QsIG1heF9odC0+YWdnX2NyYzMyX2dvb2QpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWdnX21wZHVfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5hZ2dfbXBkdV9jbnQpLCBhY2N1bV9odC0+YWdnX21wZHVfY250LAorCQkgICAgICBkZWx0YV9odC0+YWdnX21wZHVfY250LCBtYXhfaHQtPmFnZ19tcGR1X2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhZ2dfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGh0LT5hZ2dfY250KSwgYWNjdW1faHQtPmFnZ19jbnQsCisJCSAgICAgIGRlbHRhX2h0LT5hZ2dfY250LCBtYXhfaHQtPmFnZ19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAidW5zdXBwb3J0X21jczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShodC0+dW5zdXBwb3J0X21jcyksIGFjY3VtX2h0LT51bnN1cHBvcnRfbWNzLAorCQkgICAgICBkZWx0YV9odC0+dW5zdXBwb3J0X21jcywgbWF4X2h0LT51bnN1cHBvcnRfbWNzKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdAoraWw0OTY1X3Vjb2RlX3R4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0gKHNpemVvZihzdHJ1Y3Qgc3RhdHNfdHgpICogNDgpICsgMjUwOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBzdGF0c190eCAqdHgsICphY2N1bV90eCwgKmRlbHRhX3R4LCAqbWF4X3R4OworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCisJICogdGhlIGxhc3Qgc3RhdHMgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKKwkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQorCSAqLworCXR4ID0gJmlsLT5fNDk2NS5zdGF0cy50eDsKKwlhY2N1bV90eCA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMudHg7CisJZGVsdGFfdHggPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLnR4OworCW1heF90eCA9ICZpbC0+XzQ5NjUubWF4X2RlbHRhLnR4OworCisJcG9zICs9IGlsNDk2NV9zdGF0c19mbGFnKGlsLCBidWYsIGJ1ZnN6KTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF9oZWFkZXIsICJTdGF0aXN0aWNzX1R4OiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicHJlYW1ibGU6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPnByZWFtYmxlX2NudCksIGFjY3VtX3R4LT5wcmVhbWJsZV9jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5wcmVhbWJsZV9jbnQsIG1heF90eC0+cHJlYW1ibGVfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInJ4X2RldGVjdGVkX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+cnhfZGV0ZWN0ZWRfY250KSwKKwkJICAgICAgYWNjdW1fdHgtPnJ4X2RldGVjdGVkX2NudCwgZGVsdGFfdHgtPnJ4X2RldGVjdGVkX2NudCwKKwkJICAgICAgbWF4X3R4LT5yeF9kZXRlY3RlZF9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYnRfcHJpb19kZWZlcl9jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmJ0X3ByaW9fZGVmZXJfY250KSwKKwkJICAgICAgYWNjdW1fdHgtPmJ0X3ByaW9fZGVmZXJfY250LCBkZWx0YV90eC0+YnRfcHJpb19kZWZlcl9jbnQsCisJCSAgICAgIG1heF90eC0+YnRfcHJpb19kZWZlcl9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYnRfcHJpb19raWxsX2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnRfcHJpb19raWxsX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5idF9wcmlvX2tpbGxfY250LCBkZWx0YV90eC0+YnRfcHJpb19raWxsX2NudCwKKwkJICAgICAgbWF4X3R4LT5idF9wcmlvX2tpbGxfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImZld19ieXRlc19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmZld19ieXRlc19jbnQpLCBhY2N1bV90eC0+ZmV3X2J5dGVzX2NudCwKKwkJICAgICAgZGVsdGFfdHgtPmZld19ieXRlc19jbnQsIG1heF90eC0+ZmV3X2J5dGVzX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJjdHNfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+Y3RzX3RpbWVvdXQpLCBhY2N1bV90eC0+Y3RzX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX3R4LT5jdHNfdGltZW91dCwgbWF4X3R4LT5jdHNfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhY2tfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWNrX3RpbWVvdXQpLCBhY2N1bV90eC0+YWNrX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX3R4LT5hY2tfdGltZW91dCwgbWF4X3R4LT5hY2tfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJleHBlY3RlZF9hY2tfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5leHBlY3RlZF9hY2tfY250KSwKKwkJICAgICAgYWNjdW1fdHgtPmV4cGVjdGVkX2Fja19jbnQsIGRlbHRhX3R4LT5leHBlY3RlZF9hY2tfY250LAorCQkgICAgICBtYXhfdHgtPmV4cGVjdGVkX2Fja19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWN0dWFsX2Fja19jbnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmFjdHVhbF9hY2tfY250KSwgYWNjdW1fdHgtPmFjdHVhbF9hY2tfY250LAorCQkgICAgICBkZWx0YV90eC0+YWN0dWFsX2Fja19jbnQsIG1heF90eC0+YWN0dWFsX2Fja19jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiZHVtcF9tc2R1X2NudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+ZHVtcF9tc2R1X2NudCksIGFjY3VtX3R4LT5kdW1wX21zZHVfY250LAorCQkgICAgICBkZWx0YV90eC0+ZHVtcF9tc2R1X2NudCwgbWF4X3R4LT5kdW1wX21zZHVfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImFib3J0X254dF9mcmFtZV9taXNtYXRjaDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQpLAorCQkgICAgICBhY2N1bV90eC0+YnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQsCisJCSAgICAgIGRlbHRhX3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCwKKwkJICAgICAgbWF4X3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJhYm9ydF9taXNzaW5nX254dF9mcmFtZToiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YnVyc3RfYWJvcnRfbWlzc2luZ19uZXh0X2ZyYW1lX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250LAorCQkgICAgICBkZWx0YV90eC0+YnVyc3RfYWJvcnRfbWlzc2luZ19uZXh0X2ZyYW1lX2NudCwKKwkJICAgICAgbWF4X3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImN0c190aW1lb3V0X2NvbGxpc2lvbjoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+Y3RzX3RpbWVvdXRfY29sbGlzaW9uKSwKKwkJICAgICAgYWNjdW1fdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbiwKKwkJICAgICAgZGVsdGFfdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbiwKKwkJICAgICAgbWF4X3R4LT5jdHNfdGltZW91dF9jb2xsaXNpb24pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLAorCQkgICAgICAiYWNrX2JhX3RpbWVvdXRfY29sbGlzaW9uOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb24pLAorCQkgICAgICBhY2N1bV90eC0+YWNrX29yX2JhX3RpbWVvdXRfY29sbGlzaW9uLAorCQkgICAgICBkZWx0YV90eC0+YWNrX29yX2JhX3RpbWVvdXRfY29sbGlzaW9uLAorCQkgICAgICBtYXhfdHgtPmFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhZ2cgYmFfdGltZW91dDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLmJhX3RpbWVvdXQpLCBhY2N1bV90eC0+YWdnLmJhX3RpbWVvdXQsCisJCSAgICAgIGRlbHRhX3R4LT5hZ2cuYmFfdGltZW91dCwgbWF4X3R4LT5hZ2cuYmFfdGltZW91dCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJhZ2cgYmFfcmVzY2hlZF9mcmFtZXM6IiwKKwkJICAgICAgbGUzMl90b19jcHUodHgtPmFnZy5iYV9yZXNjaGVkdWxlX2ZyYW1lcyksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMsCisJCSAgICAgIGRlbHRhX3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMsCisJCSAgICAgIG1heF90eC0+YWdnLmJhX3Jlc2NoZWR1bGVfZnJhbWVzKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgImFnZyBzY2RfcXVlcnlfYWdnX2ZyYW1lOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQpLAorCQkgICAgICBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9hZ2dfZnJhbWVfY250LAorCQkgICAgICBkZWx0YV90eC0+YWdnLnNjZF9xdWVyeV9hZ2dfZnJhbWVfY250LAorCQkgICAgICBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfYWdnX2ZyYW1lX2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJhZ2cgc2NkX3F1ZXJ5X25vX2FnZzoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLnNjZF9xdWVyeV9ub19hZ2cpLAorCQkgICAgICBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9ub19hZ2csCisJCSAgICAgIGRlbHRhX3R4LT5hZ2cuc2NkX3F1ZXJ5X25vX2FnZywKKwkJICAgICAgbWF4X3R4LT5hZ2cuc2NkX3F1ZXJ5X25vX2FnZyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJhZ2cgc2NkX3F1ZXJ5X2FnZzoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLnNjZF9xdWVyeV9hZ2cpLAorCQkgICAgICBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9hZ2csIGRlbHRhX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZywKKwkJICAgICAgbWF4X3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZyk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsCisJCSAgICAgICJhZ2cgc2NkX3F1ZXJ5X21pc21hdGNoOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X21pc21hdGNoKSwKKwkJICAgICAgYWNjdW1fdHgtPmFnZy5zY2RfcXVlcnlfbWlzbWF0Y2gsCisJCSAgICAgIGRlbHRhX3R4LT5hZ2cuc2NkX3F1ZXJ5X21pc21hdGNoLAorCQkgICAgICBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfbWlzbWF0Y2gpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWdnIGZyYW1lX25vdF9yZWFkeToiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLmZyYW1lX25vdF9yZWFkeSksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5LAorCQkgICAgICBkZWx0YV90eC0+YWdnLmZyYW1lX25vdF9yZWFkeSwKKwkJICAgICAgbWF4X3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImFnZyB1bmRlcnJ1bjoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLnVuZGVycnVuKSwgYWNjdW1fdHgtPmFnZy51bmRlcnJ1biwKKwkJICAgICAgZGVsdGFfdHgtPmFnZy51bmRlcnJ1biwgbWF4X3R4LT5hZ2cudW5kZXJydW4pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYWdnIGJ0X3ByaW9fa2lsbDoiLAorCQkgICAgICBsZTMyX3RvX2NwdSh0eC0+YWdnLmJ0X3ByaW9fa2lsbCksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cuYnRfcHJpb19raWxsLCBkZWx0YV90eC0+YWdnLmJ0X3ByaW9fa2lsbCwKKwkJICAgICAgbWF4X3R4LT5hZ2cuYnRfcHJpb19raWxsKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImFnZyByeF9iYV9yc3BfY250OiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KHR4LT5hZ2cucnhfYmFfcnNwX2NudCksCisJCSAgICAgIGFjY3VtX3R4LT5hZ2cucnhfYmFfcnNwX2NudCwgZGVsdGFfdHgtPmFnZy5yeF9iYV9yc3BfY250LAorCQkgICAgICBtYXhfdHgtPmFnZy5yeF9iYV9yc3BfY250KTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3NpemVfdAoraWw0OTY1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0gc2l6ZW9mKHN0cnVjdCBzdGF0c19nZW5lcmFsKSAqIDEwICsgMzAwOworCXNzaXplX3QgcmV0OworCXN0cnVjdCBzdGF0c19nZW5lcmFsX2NvbW1vbiAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7CisJc3RydWN0IHN0YXRzX2dlbmVyYWxfY29tbW9uICpkZWx0YV9nZW5lcmFsLCAqbWF4X2dlbmVyYWw7CisJc3RydWN0IHN0YXRzX2RiZyAqZGJnLCAqYWNjdW1fZGJnLCAqZGVsdGFfZGJnLCAqbWF4X2RiZzsKKwlzdHJ1Y3Qgc3RhdHNfZGl2ICpkaXYsICphY2N1bV9kaXYsICpkZWx0YV9kaXYsICptYXhfZGl2OworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpCisJCXJldHVybiAtRUFHQUlOOworCisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCisJICogdGhlIGxhc3Qgc3RhdHMgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUKKwkgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQorCSAqLworCWdlbmVyYWwgPSAmaWwtPl80OTY1LnN0YXRzLmdlbmVyYWwuY29tbW9uOworCWRiZyA9ICZpbC0+XzQ5NjUuc3RhdHMuZ2VuZXJhbC5jb21tb24uZGJnOworCWRpdiA9ICZpbC0+XzQ5NjUuc3RhdHMuZ2VuZXJhbC5jb21tb24uZGl2OworCWFjY3VtX2dlbmVyYWwgPSAmaWwtPl80OTY1LmFjY3VtX3N0YXRzLmdlbmVyYWwuY29tbW9uOworCWFjY3VtX2RiZyA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMuZ2VuZXJhbC5jb21tb24uZGJnOworCWFjY3VtX2RpdiA9ICZpbC0+XzQ5NjUuYWNjdW1fc3RhdHMuZ2VuZXJhbC5jb21tb24uZGl2OworCWRlbHRhX2dlbmVyYWwgPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLmdlbmVyYWwuY29tbW9uOworCW1heF9nZW5lcmFsID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEuZ2VuZXJhbC5jb21tb247CisJZGVsdGFfZGJnID0gJmlsLT5fNDk2NS5kZWx0YV9zdGF0cy5nZW5lcmFsLmNvbW1vbi5kYmc7CisJbWF4X2RiZyA9ICZpbC0+XzQ5NjUubWF4X2RlbHRhLmdlbmVyYWwuY29tbW9uLmRiZzsKKwlkZWx0YV9kaXYgPSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzLmdlbmVyYWwuY29tbW9uLmRpdjsKKwltYXhfZGl2ID0gJmlsLT5fNDk2NS5tYXhfZGVsdGEuZ2VuZXJhbC5jb21tb24uZGl2OworCisJcG9zICs9IGlsNDk2NV9zdGF0c19mbGFnKGlsLCBidWYsIGJ1ZnN6KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF9oZWFkZXIsCisJCSAgICAgICJTdGF0aXN0aWNzX0dlbmVyYWw6Iik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdmFsdWUsICJ0ZW1wZXJhdHVyZToiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT50ZW1wZXJhdHVyZSkpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3ZhbHVlLCAidHRsX3RpbWVzdGFtcDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT50dGxfdGltZXN0YW1wKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJidXJzdF9jaGVjazoiLAorCQkgICAgICBsZTMyX3RvX2NwdShkYmctPmJ1cnN0X2NoZWNrKSwgYWNjdW1fZGJnLT5idXJzdF9jaGVjaywKKwkJICAgICAgZGVsdGFfZGJnLT5idXJzdF9jaGVjaywgbWF4X2RiZy0+YnVyc3RfY2hlY2spOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAiYnVyc3RfY291bnQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGJnLT5idXJzdF9jb3VudCksIGFjY3VtX2RiZy0+YnVyc3RfY291bnQsCisJCSAgICAgIGRlbHRhX2RiZy0+YnVyc3RfY291bnQsIG1heF9kYmctPmJ1cnN0X2NvdW50KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwKKwkJICAgICAgIndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jb3VudDoiLAorCQkgICAgICBsZTMyX3RvX2NwdShkYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQpLAorCQkgICAgICBhY2N1bV9kYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQsCisJCSAgICAgIGRlbHRhX2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCwKKwkJICAgICAgbWF4X2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJzbGVlcF90aW1lOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsZWVwX3RpbWUpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5zbGVlcF90aW1lLCBkZWx0YV9nZW5lcmFsLT5zbGVlcF90aW1lLAorCQkgICAgICBtYXhfZ2VuZXJhbC0+c2xlZXBfdGltZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJzbG90c19vdXQ6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfb3V0KSwgYWNjdW1fZ2VuZXJhbC0+c2xvdHNfb3V0LAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5zbG90c19vdXQsIG1heF9nZW5lcmFsLT5zbG90c19vdXQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAic2xvdHNfaWRsZToiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5zbG90c19pZGxlKSwKKwkJICAgICAgYWNjdW1fZ2VuZXJhbC0+c2xvdHNfaWRsZSwgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfaWRsZSwKKwkJICAgICAgbWF4X2dlbmVyYWwtPnNsb3RzX2lkbGUpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAidHhfb25fYToiLAorCQkgICAgICBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2EpLCBhY2N1bV9kaXYtPnR4X29uX2EsCisJCSAgICAgIGRlbHRhX2Rpdi0+dHhfb25fYSwgbWF4X2Rpdi0+dHhfb25fYSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJ0eF9vbl9iOiIsCisJCSAgICAgIGxlMzJfdG9fY3B1KGRpdi0+dHhfb25fYiksIGFjY3VtX2Rpdi0+dHhfb25fYiwKKwkJICAgICAgZGVsdGFfZGl2LT50eF9vbl9iLCBtYXhfZGl2LT50eF9vbl9iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgImV4ZWNfdGltZToiLAorCQkgICAgICBsZTMyX3RvX2NwdShkaXYtPmV4ZWNfdGltZSksIGFjY3VtX2Rpdi0+ZXhlY190aW1lLAorCQkgICAgICBkZWx0YV9kaXYtPmV4ZWNfdGltZSwgbWF4X2Rpdi0+ZXhlY190aW1lKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsIGZtdF90YWJsZSwgInByb2JlX3RpbWU6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZGl2LT5wcm9iZV90aW1lKSwgYWNjdW1fZGl2LT5wcm9iZV90aW1lLAorCQkgICAgICBkZWx0YV9kaXYtPnByb2JlX3RpbWUsIG1heF9kaXYtPnByb2JlX3RpbWUpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgZm10X3RhYmxlLCAicnhfZW5hYmxlX2NvdW50ZXI6IiwKKwkJICAgICAgbGUzMl90b19jcHUoZ2VuZXJhbC0+cnhfZW5hYmxlX2NvdW50ZXIpLAorCQkgICAgICBhY2N1bV9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlciwKKwkJICAgICAgZGVsdGFfZ2VuZXJhbC0+cnhfZW5hYmxlX2NvdW50ZXIsCisJCSAgICAgIG1heF9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlcik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCBmbXRfdGFibGUsICJudW1fb2Zfc29zX3N0YXRlczoiLAorCQkgICAgICBsZTMyX3RvX2NwdShnZW5lcmFsLT5udW1fb2Zfc29zX3N0YXRlcyksCisJCSAgICAgIGFjY3VtX2dlbmVyYWwtPm51bV9vZl9zb3Nfc3RhdGVzLAorCQkgICAgICBkZWx0YV9nZW5lcmFsLT5udW1fb2Zfc29zX3N0YXRlcywKKwkJICAgICAgbWF4X2dlbmVyYWwtPm51bV9vZl9zb3Nfc3RhdGVzKTsKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LW1hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1tYWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjY3MjMyCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS1tYWMuYwpAQCAtMCwwICsxLDY1MTUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAorICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgorCisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisKKyNkZWZpbmUgRFJWX05BTUUgICAgICAgICJpd2w0OTY1IgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiNDk2NS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbW9kdWxlIGJvaWxlciBwbGF0ZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBtb2R1bGUgbmFtZSwgY29weXJpZ2h0LCB2ZXJzaW9uLCBldGMuCisgKi8KKyNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCSJJbnRlbChSKSBXaXJlbGVzcyBXaUZpIDQ5NjUgZHJpdmVyIGZvciBMaW51eCIKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworI2RlZmluZSBWRCAiZCIKKyNlbHNlCisjZGVmaW5lIFZECisjZW5kaWYKKworI2RlZmluZSBEUlZfVkVSU0lPTiAgICAgSVdMV0lGSV9WRVJTSU9OIFZECisKK01PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04pOworTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUihEUlZfQ09QWVJJR0hUICIgIiBEUlZfQVVUSE9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXdsNDk2NSIpOworCit2b2lkCitpbDQ5NjVfY2hlY2tfYWJvcnRfc3RhdHVzKHN0cnVjdCBpbF9wcml2ICppbCwgdTggZnJhbWVfY291bnQsIHUzMiBzdGF0dXMpCit7CisJaWYgKGZyYW1lX2NvdW50ID09IDEgJiYgc3RhdHVzID09IFRYX1NUQVRVU19GQUlMX1JGS0lMTF9GTFVTSCkgeworCQlJTF9FUlIoIlR4IGZsdXNoIGNvbW1hbmQgdG8gZmx1c2ggb3V0IGFsbCBmcmFtZXNcbiIpOworCQlpZiAoIXRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCQlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+dHhfZmx1c2gpOworCX0KK30KKworLyoKKyAqIEVFUFJPTQorICovCitzdHJ1Y3QgaWxfbW9kX3BhcmFtcyBpbDQ5NjVfbW9kX3BhcmFtcyA9IHsKKwkuYW1zZHVfc2l6ZV84SyA9IDEsCisJLnJlc3RhcnRfZncgPSAxLAorCS8qIHRoZSByZXN0IGFyZSAwIGJ5IGRlZmF1bHQgKi8KK307CisKK3ZvaWQKK2lsNDk2NV9yeF9xdWV1ZV9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X2ZyZWUpOworCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X3VzZWQpOworCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspIHsKKwkJLyogSW4gdGhlIHJlc2V0IGZ1bmN0aW9uLCB0aGVzZSBidWZmZXJzIG1heSBoYXZlIGJlZW4gYWxsb2NhdGVkCisJCSAqIHRvIGFuIFNLQiwgc28gd2UgbmVlZCB0byB1bm1hcCBhbmQgZnJlZSBwb3RlbnRpYWwgc3RvcmFnZSAqLworCQlpZiAocnhxLT5wb29sW2ldLnBhZ2UgIT0gTlVMTCkgeworCQkJcGNpX3VubWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHJ4cS0+cG9vbFtpXS5wYWdlX2RtYSwKKwkJCQkgICAgICAgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCV9faWxfZnJlZV9wYWdlcyhpbCwgcnhxLT5wb29sW2ldLnBhZ2UpOworCQkJcnhxLT5wb29sW2ldLnBhZ2UgPSBOVUxMOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRTsgaSsrKQorCQlyeHEtPnF1ZXVlW2ldID0gTlVMTDsKKworCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQorCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLworCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOworCXJ4cS0+d3JpdGVfYWN0dWFsID0gMDsKKwlyeHEtPmZyZWVfY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworfQorCitpbnQKK2lsNDk2NV9yeF9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpCit7CisJdTMyIHJiX3NpemU7CisJY29uc3QgdTMyIHJmZG5sb2cgPSBSWF9RVUVVRV9TSVpFX0xPRzsJLyogMjU2IFJCRHMgKi8KKwl1MzIgcmJfdGltZW91dCA9IDA7CisKKwlpZiAoaWwtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKKwkJcmJfc2l6ZSA9IEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzhLOworCWVsc2UKKwkJcmJfc2l6ZSA9IEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzRLOworCisJLyogU3RvcCBSeCBETUEgKi8KKwlpbF93cihpbCwgRkg0OV9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLCAwKTsKKworCS8qIFJlc2V0IGRyaXZlcidzIFJ4IHF1ZXVlIHdyaXRlIGlkeCAqLworCWlsX3dyKGlsLCBGSDQ5X1JTQ1NSX0NITkwwX1JCRENCX1dQVFJfUkVHLCAwKTsKKworCS8qIFRlbGwgZGV2aWNlIHdoZXJlIHRvIGZpbmQgUkJEIGNpcmN1bGFyIGJ1ZmZlciBpbiBEUkFNICovCisJaWxfd3IoaWwsIEZINDlfUlNDU1JfQ0hOTDBfUkJEQ0JfQkFTRV9SRUcsICh1MzIpIChyeHEtPmJkX2RtYSA+PiA4KSk7CisKKwkvKiBUZWxsIGRldmljZSB3aGVyZSBpbiBEUkFNIHRvIHVwZGF0ZSBpdHMgUnggc3RhdHVzICovCisJaWxfd3IoaWwsIEZINDlfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRywgcnhxLT5yYl9zdHRzX2RtYSA+PiA0KTsKKworCS8qIEVuYWJsZSBSeCBETUEKKwkgKiBEaXJlY3QgcnggaW50ZXJydXB0cyB0byBob3N0cworCSAqIFJ4IGJ1ZmZlciBzaXplIDQgb3IgOGsKKwkgKiBSQiB0aW1lb3V0IDB4MTAKKwkgKiAyNTYgUkJEcworCSAqLworCWlsX3dyKGlsLCBGSDQ5X01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcsCisJICAgICAgRkg0OV9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX0VOQUJMRV9WQUwgfAorCSAgICAgIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfSU5UX0hPU1RfVkFMIHwKKwkgICAgICBGSDQ5X1JDU1JfQ0hOTDBfUlhfQ09ORklHX1NJTkdMRV9GUkFNRV9NU0sgfAorCSAgICAgIHJiX3NpemUgfAorCSAgICAgIChyYl90aW1lb3V0IDw8IEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX0lSUV9SQlRIX1BPUykgfAorCSAgICAgIChyZmRubG9nIDw8IEZINDlfUkNTUl9SWF9DT05GSUdfUkJEQ0JfU0laRV9QT1MpKTsKKworCS8qIFNldCBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lciB0byBkZWZhdWx0ICgyMDQ4IHVzZWNzKSAqLworCWlsX3dyaXRlOChpbCwgQ1NSX0lOVF9DT0FMRVNDSU5HLCBJTF9IT1NUX0lOVF9USU1FT1VUX0RFRik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9zZXRfcHdyX3ZtYWluKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKy8qCisgKiAoZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMpCisgKiB0byBzZXQgcG93ZXIgdG8gVl9BVVgsIGRvOgorCisJCWlmIChwY2lfcG1lX2NhcGFibGUoaWwtPnBjaV9kZXYsIFBDSV9EM2NvbGQpKQorCQkJaWxfc2V0X2JpdHNfbWFza19wcnBoKGlsLCBBUE1HX1BTX0NUUkxfUkVHLAorCQkJCQkgICAgICAgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZBVVgsCisJCQkJCSAgICAgICB+QVBNR19QU19DVFJMX01TS19QV1JfU1JDKTsKKyAqLworCisJaWxfc2V0X2JpdHNfbWFza19wcnBoKGlsLCBBUE1HX1BTX0NUUkxfUkVHLAorCQkJICAgICAgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZNQUlOLAorCQkJICAgICAgfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7Cit9CisKK2ludAoraWw0OTY1X2h3X25pY19pbml0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJaW50IHJldDsKKworCS8qIG5pY19pbml0ICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWwtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuaW5pdChpbCk7CisKKwkvKiBTZXQgaW50ZXJydXB0IGNvYWxlc2NpbmcgY2FsaWJyYXRpb24gdGltZXIgdG8gZGVmYXVsdCAoNTEyIHVzZWNzKSAqLworCWlsX3dyaXRlOChpbCwgQ1NSX0lOVF9DT0FMRVNDSU5HLCBJTF9IT1NUX0lOVF9DQUxJQl9USU1FT1VUX0RFRik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWw0OTY1X3NldF9wd3Jfdm1haW4oaWwpOworCisJaWwtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuY29uZmlnKGlsKTsKKworCS8qIEFsbG9jYXRlIHRoZSBSWCBxdWV1ZSwgb3IgcmVzZXQgaWYgaXQgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwlpZiAoIXJ4cS0+YmQpIHsKKwkJcmV0ID0gaWxfcnhfcXVldWVfYWxsb2MoaWwpOworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0aWFsaXplIFJ4IHF1ZXVlXG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfSBlbHNlCisJCWlsNDk2NV9yeF9xdWV1ZV9yZXNldChpbCwgcnhxKTsKKworCWlsNDk2NV9yeF9yZXBsZW5pc2goaWwpOworCisJaWw0OTY1X3J4X2luaXQoaWwsIHJ4cSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCXJ4cS0+bmVlZF91cGRhdGUgPSAxOworCWlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoaWwsIHJ4cSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogQWxsb2NhdGUgb3IgcmVzZXQgYW5kIGluaXQgYWxsIFR4IGFuZCBDb21tYW5kIHF1ZXVlcyAqLworCWlmICghaWwtPnR4cSkgeworCQlyZXQgPSBpbDQ5NjVfdHhxX2N0eF9hbGxvYyhpbCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZQorCQlpbDQ5NjVfdHhxX2N0eF9yZXNldChpbCk7CisKKwlzZXRfYml0KFNfSU5JVCwgJmlsLT5zdGF0dXMpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWw0OTY1X2RtYV9hZGRyMnJiZF9wdHIgLSBjb252ZXJ0IGEgRE1BIGFkZHJlc3MgdG8gYSB1Q29kZSByZWFkIGJ1ZmZlciBwdHIKKyAqLworc3RhdGljIGlubGluZSBfX2xlMzIKK2lsNDk2NV9kbWFfYWRkcjJyYmRfcHRyKHN0cnVjdCBpbF9wcml2ICppbCwgZG1hX2FkZHJfdCBkbWFfYWRkcikKK3sKKwlyZXR1cm4gY3B1X3RvX2xlMzIoKHUzMikgKGRtYV9hZGRyID4+IDgpKTsKK30KKworLyoqCisgKiBpbDQ5NjVfcnhfcXVldWVfcmVzdG9jayAtIHJlZmlsbCBSWCBxdWV1ZSBmcm9tIHByZS1hbGxvY2F0ZWQgcG9vbAorICoKKyAqIElmIHRoZXJlIGFyZSBzbG90cyBpbiB0aGUgUlggcXVldWUgdGhhdCBuZWVkIHRvIGJlIHJlc3RvY2tlZCwKKyAqIGFuZCB3ZSBoYXZlIGZyZWUgcHJlLWFsbG9jYXRlZCBidWZmZXJzLCBmaWxsIHRoZSByYW5rcyBhcyBtdWNoCisgKiBhcyB3ZSBjYW4sIHB1bGxpbmcgZnJvbSByeF9mcmVlLgorICoKKyAqIFRoaXMgbW92ZXMgdGhlICd3cml0ZScgaWR4IGZvcndhcmQgdG8gY2F0Y2ggdXAgd2l0aCAncHJvY2Vzc2VkJywgYW5kCisgKiBhbHNvIHVwZGF0ZXMgdGhlIG1lbW9yeSBhZGRyZXNzIGluIHRoZSBmaXJtd2FyZSB0byByZWZlcmVuY2UgdGhlIG5ldworICogdGFyZ2V0IGJ1ZmZlci4KKyAqLwordm9pZAoraWw0OTY1X3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKwlzdHJ1Y3QgaWxfcnhfYnVmICpyeGI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwl3aGlsZSAoaWxfcnhfcXVldWVfc3BhY2UocnhxKSA+IDAgJiYgcnhxLT5mcmVlX2NvdW50KSB7CisJCS8qIFRoZSBvdmVyd3JpdHRlbiByeGIgbXVzdCBiZSBhIHVzZWQgb25lICovCisJCXJ4YiA9IHJ4cS0+cXVldWVbcnhxLT53cml0ZV07CisJCUJVR19PTihyeGIgJiYgcnhiLT5wYWdlKTsKKworCQkvKiBHZXQgbmV4dCBmcmVlIFJ4IGJ1ZmZlciwgcmVtb3ZlIGZyb20gZnJlZSBsaXN0ICovCisJCWVsZW1lbnQgPSByeHEtPnJ4X2ZyZWUubmV4dDsKKwkJcnhiID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWxfcnhfYnVmLCBsaXN0KTsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisKKwkJLyogUG9pbnQgdG8gUnggYnVmZmVyIHZpYSBuZXh0IFJCRCBpbiBjaXJjdWxhciBidWZmZXIgKi8KKwkJcnhxLT5iZFtyeHEtPndyaXRlXSA9CisJCSAgICBpbDQ5NjVfZG1hX2FkZHIycmJkX3B0cihpbCwgcnhiLT5wYWdlX2RtYSk7CisJCXJ4cS0+cXVldWVbcnhxLT53cml0ZV0gPSByeGI7CisJCXJ4cS0+d3JpdGUgPSAocnhxLT53cml0ZSArIDEpICYgUlhfUVVFVUVfTUFTSzsKKwkJcnhxLT5mcmVlX2NvdW50LS07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCS8qIElmIHRoZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciBwb29sIGlzIGRyb3BwaW5nIGxvdywgc2NoZWR1bGUgdG8KKwkgKiByZWZpbGwgaXQgKi8KKwlpZiAocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUkspCisJCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5yeF9yZXBsZW5pc2gpOworCisJLyogSWYgd2UndmUgYWRkZWQgbW9yZSBzcGFjZSBmb3IgdGhlIGZpcm13YXJlIHRvIHBsYWNlIGRhdGEsIHRlbGwgaXQuCisJICogSW5jcmVtZW50IGRldmljZSdzIHdyaXRlIHBvaW50ZXIgaW4gbXVsdGlwbGVzIG9mIDguICovCisJaWYgKHJ4cS0+d3JpdGVfYWN0dWFsICE9IChyeHEtPndyaXRlICYgfjB4NykpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQlyeHEtPm5lZWRfdXBkYXRlID0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJCWlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoaWwsIHJ4cSk7CisJfQorfQorCisvKioKKyAqIGlsNDk2NV9yeF9yZXBsZW5pc2ggLSBNb3ZlIGFsbCB1c2VkIHBhY2tldCBmcm9tIHJ4X3VzZWQgdG8gcnhfZnJlZQorICoKKyAqIFdoZW4gbW92aW5nIHRvIHJ4X2ZyZWUgYW4gU0tCIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNsb3QuCisgKgorICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaWxfcnhfcXVldWVfcmVzdG9jay4KKyAqIFRoaXMgaXMgY2FsbGVkIGFzIGEgc2NoZWR1bGVkIHdvcmsgaXRlbSAoZXhjZXB0IGZvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24pCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnhfYWxsb2NhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCBnZnBfdCBwcmlvcml0eSkKK3sKKwlzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSA9ICZpbC0+cnhxOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJc3RydWN0IGlsX3J4X2J1ZiAqcnhiOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJZ2ZwX3QgZ2ZwX21hc2sgPSBwcmlvcml0eTsKKworCXdoaWxlICgxKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWlmIChyeHEtPmZyZWVfY291bnQgPiBSWF9MT1dfV0FURVJNQVJLKQorCQkJZ2ZwX21hc2sgfD0gX19HRlBfTk9XQVJOOworCisJCWlmIChpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIgPiAwKQorCQkJZ2ZwX21hc2sgfD0gX19HRlBfQ09NUDsKKworCQkvKiBBbGxvYyBhIG5ldyByZWNlaXZlIGJ1ZmZlciAqLworCQlwYWdlID0gYWxsb2NfcGFnZXMoZ2ZwX21hc2ssIGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7CisJCWlmICghcGFnZSkgeworCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKKwkJCQlEX0lORk8oImFsbG9jX3BhZ2VzIGZhaWxlZCwgIiAib3JkZXI6ICVkXG4iLAorCQkJCSAgICAgICBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOworCisJCQlpZiAocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUksgJiYKKwkJCSAgICBuZXRfcmF0ZWxpbWl0KCkpCisJCQkJSUxfRVJSKCJGYWlsZWQgdG8gYWxsb2NfcGFnZXMgd2l0aCAlcy4gIgorCQkJCSAgICAgICAiT25seSAldSBmcmVlIGJ1ZmZlcnMgcmVtYWluaW5nLlxuIiwKKwkJCQkgICAgICAgcHJpb3JpdHkgPT0KKwkJCQkgICAgICAgR0ZQX0FUT01JQyA/ICJHRlBfQVRPTUlDIiA6ICJHRlBfS0VSTkVMIiwKKwkJCQkgICAgICAgcnhxLT5mcmVlX2NvdW50KTsKKwkJCS8qIFdlIGRvbid0IHJlc2NoZWR1bGUgcmVwbGVuaXNoIHdvcmsgaGVyZSAtLSB3ZSB3aWxsCisJCQkgKiBjYWxsIHRoZSByZXN0b2NrIG1ldGhvZCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMKKwkJCSAqIG1vcmUgYnVmZmVycyBpdCB3aWxsIHNjaGVkdWxlIHJlcGxlbmlzaCAqLworCQkJcmV0dXJuOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJCV9fZnJlZV9wYWdlcyhwYWdlLCBpbC0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOworCQkJcmV0dXJuOworCQl9CisJCWVsZW1lbnQgPSByeHEtPnJ4X3VzZWQubmV4dDsKKwkJcnhiID0gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaWxfcnhfYnVmLCBsaXN0KTsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisKKwkJQlVHX09OKHJ4Yi0+cGFnZSk7CisJCXJ4Yi0+cGFnZSA9IHBhZ2U7CisJCS8qIEdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBSQiAqLworCQlyeGItPnBhZ2VfZG1hID0KKwkJICAgIHBjaV9tYXBfcGFnZShpbC0+cGNpX2RldiwgcGFnZSwgMCwKKwkJCQkgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCQkgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJLyogZG1hIGFkZHJlc3MgbXVzdCBiZSBubyBtb3JlIHRoYW4gMzYgYml0cyAqLworCQlCVUdfT04ocnhiLT5wYWdlX2RtYSAmIH5ETUFfQklUX01BU0soMzYpKTsKKwkJLyogYW5kIGFsc28gMjU2IGJ5dGUgYWxpZ25lZCEgKi8KKwkJQlVHX09OKHJ4Yi0+cGFnZV9kbWEgJiBETUFfQklUX01BU0soOCkpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKworCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X2ZyZWUpOworCQlyeHEtPmZyZWVfY291bnQrKzsKKwkJaWwtPmFsbG9jX3J4Yl9wYWdlKys7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7CisJfQorfQorCit2b2lkCitpbDQ5NjVfcnhfcmVwbGVuaXNoKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWw0OTY1X3J4X2FsbG9jYXRlKGlsLCBHRlBfS0VSTkVMKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsNDk2NV9yeF9xdWV1ZV9yZXN0b2NrKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkCitpbDQ5NjVfcnhfcmVwbGVuaXNoX25vdyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWw0OTY1X3J4X2FsbG9jYXRlKGlsLCBHRlBfQVRPTUlDKTsKKworCWlsNDk2NV9yeF9xdWV1ZV9yZXN0b2NrKGlsKTsKK30KKworLyogQXNzdW1lcyB0aGF0IHRoZSBza2IgZmllbGQgb2YgdGhlIGJ1ZmZlcnMgaW4gJ3Bvb2wnIGlzIGtlcHQgYWNjdXJhdGUuCisgKiBJZiBhbiBTS0IgaGFzIGJlZW4gZGV0YWNoZWQsIHRoZSBQT09MIG5lZWRzIHRvIGhhdmUgaXRzIFNLQiBzZXQgdG8gTlVMTAorICogVGhpcyBmcmVlIHJvdXRpbmUgd2Fsa3MgdGhlIGxpc3Qgb2YgUE9PTCBlbnRyaWVzIGFuZCBpZiBTS0IgaXMgc2V0IHRvCisgKiBub24gTlVMTCBpdCBpcyB1bm1hcHBlZCBhbmQgZnJlZWQKKyAqLwordm9pZAoraWw0OTY1X3J4X3F1ZXVlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRSArIFJYX0ZSRUVfQlVGRkVSUzsgaSsrKSB7CisJCWlmIChyeHEtPnBvb2xbaV0ucGFnZSAhPSBOVUxMKSB7CisJCQlwY2lfdW5tYXBfcGFnZShpbC0+cGNpX2RldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAorCQkJCSAgICAgICBQQUdFX1NJWkUgPDwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAorCQkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQkJX19pbF9mcmVlX3BhZ2VzKGlsLCByeHEtPnBvb2xbaV0ucGFnZSk7CisJCQlyeHEtPnBvb2xbaV0ucGFnZSA9IE5VTEw7CisJCX0KKwl9CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwgNCAqIFJYX1FVRVVFX1NJWkUsIHJ4cS0+YmQsCisJCQkgIHJ4cS0+YmRfZG1hKTsKKwlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwgc2l6ZW9mKHN0cnVjdCBpbF9yYl9zdGF0dXMpLAorCQkJICByeHEtPnJiX3N0dHMsIHJ4cS0+cmJfc3R0c19kbWEpOworCXJ4cS0+YmQgPSBOVUxMOworCXJ4cS0+cmJfc3R0cyA9IE5VTEw7Cit9CisKK2ludAoraWw0OTY1X3J4cV9zdG9wKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKworCS8qIHN0b3AgUnggRE1BICovCisJaWxfd3IoaWwsIEZINDlfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywgMCk7CisJaWxfcG9sbF9iaXQoaWwsIEZINDlfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRywKKwkJICAgIEZINDlfUlNTUl9DSE5MMF9SWF9TVEFUVVNfQ0hOTF9JRExFLCAxMDAwKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2lsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHUzMiByYXRlX25fZmxhZ3MsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwlpbnQgaWR4ID0gMDsKKwlpbnQgYmFuZF9vZmZzZXQgPSAwOworCisJLyogSFQgcmF0ZSBmb3JtYXQ6IG1hYzgwMjExIHdhbnRzIGFuIE1DUyBudW1iZXIsIHdoaWNoIGlzIGp1c3QgTFNCICovCisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgeworCQlpZHggPSAocmF0ZV9uX2ZsYWdzICYgMHhmZik7CisJCXJldHVybiBpZHg7CisJCS8qIExlZ2FjeSByYXRlIGZvcm1hdCwgc2VhcmNoIGZvciBtYXRjaCBpbiB0YWJsZSAqLworCX0gZWxzZSB7CisJCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQliYW5kX29mZnNldCA9IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJZm9yIChpZHggPSBiYW5kX29mZnNldDsgaWR4IDwgUkFURV9DT1VOVF9MRUdBQ1k7IGlkeCsrKQorCQkJaWYgKGlsX3JhdGVzW2lkeF0ucGxjcCA9PSAocmF0ZV9uX2ZsYWdzICYgMHhGRikpCisJCQkJcmV0dXJuIGlkeCAtIGJhbmRfb2Zmc2V0OworCX0KKworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludAoraWw0OTY1X2NhbGNfcnNzaShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9waHlfcmVzICpyeF9yZXNwKQoreworCS8qIGRhdGEgZnJvbSBQSFkvRFNQIHJlZ2FyZGluZyBzaWduYWwgc3RyZW5ndGgsIGV0Yy4sCisJICogICBjb250ZW50cyBhcmUgYWx3YXlzIHRoZXJlLCBub3QgY29uZmlndXJhYmxlIGJ5IGhvc3QuICAqLworCXN0cnVjdCBpbDQ5NjVfcnhfbm9uX2NmZ19waHkgKm5jcGh5ID0KKwkgICAgKHN0cnVjdCBpbDQ5NjVfcnhfbm9uX2NmZ19waHkgKilyeF9yZXNwLT5ub25fY2ZnX3BoeV9idWY7CisJdTMyIGFnYyA9CisJICAgIChsZTE2X3RvX2NwdShuY3BoeS0+YWdjX2luZm8pICYgSUw0OV9BR0NfREJfTUFTSykgPj4KKwkgICAgSUw0OV9BR0NfREJfUE9TOworCisJdTMyIHZhbGlkX2FudGVubmFlID0KKwkgICAgKGxlMTZfdG9fY3B1KHJ4X3Jlc3AtPnBoeV9mbGFncykgJiBJTDQ5X1JYX1BIWV9GTEFHU19BTlRFTk5BRV9NQVNLKQorCSAgICA+PiBJTDQ5X1JYX1BIWV9GTEFHU19BTlRFTk5BRV9PRkZTRVQ7CisJdTggbWF4X3Jzc2kgPSAwOworCXUzMiBpOworCisJLyogRmluZCBtYXggcnNzaSBhbW9uZyAzIHBvc3NpYmxlIHJlY2VpdmVycy4KKwkgKiBUaGVzZSB2YWx1ZXMgYXJlIG1lYXN1cmVkIGJ5IHRoZSBkaWdpdGFsIHNpZ25hbCBwcm9jZXNzb3IgKERTUCkuCisJICogVGhleSBzaG91bGQgc3RheSBmYWlybHkgY29uc3RhbnQgZXZlbiBhcyB0aGUgc2lnbmFsIHN0cmVuZ3RoIHZhcmllcywKKwkgKiAgIGlmIHRoZSByYWRpbydzIGF1dG9tYXRpYyBnYWluIGNvbnRyb2wgKEFHQykgaXMgd29ya2luZyByaWdodC4KKwkgKiBBR0MgdmFsdWUgKHNlZSBiZWxvdykgd2lsbCBwcm92aWRlIHRoZSAiaW50ZXJlc3RpbmciIGluZm8uICovCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJaWYgKHZhbGlkX2FudGVubmFlICYgKDEgPDwgaSkpCisJCQltYXhfcnNzaSA9IG1heChuY3BoeS0+cnNzaV9pbmZvW2kgPDwgMV0sIG1heF9yc3NpKTsKKworCURfU1RBVFMoIlJzc2kgSW4gQSAlZCBCICVkIEMgJWQgTWF4ICVkIEFHQyBkQiAlZFxuIiwKKwkJbmNwaHktPnJzc2lfaW5mb1swXSwgbmNwaHktPnJzc2lfaW5mb1syXSwgbmNwaHktPnJzc2lfaW5mb1s0XSwKKwkJbWF4X3Jzc2ksIGFnYyk7CisKKwkvKiBkQm0gPSBtYXhfcnNzaSBkQiAtIGFnYyBkQiAtIGNvbnN0YW50LgorCSAqIEhpZ2hlciBBR0MgKGhpZ2hlciByYWRpbyBnYWluKSBtZWFucyBsb3dlciBzaWduYWwuICovCisJcmV0dXJuIG1heF9yc3NpIC0gYWdjIC0gSUw0OTY1X1JTU0lfT0ZGU0VUOworfQorCitzdGF0aWMgdTMyCitpbDQ5NjVfdHJhbnNsYXRlX3J4X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBkZWNyeXB0X2luKQoreworCXUzMiBkZWNyeXB0X291dCA9IDA7CisKKwlpZiAoKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NUQVRJT05fRk9VTkQpID09CisJICAgIFJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORCkKKwkJZGVjcnlwdF9vdXQgfD0KKwkJICAgIChSWF9SRVNfU1RBVFVTX1NUQVRJT05fRk9VTkQgfAorCQkgICAgIFJYX1JFU19TVEFUVVNfTk9fU1RBVElPTl9JTkZPX01JU01BVENIKTsKKworCWRlY3J5cHRfb3V0IHw9IChkZWNyeXB0X2luICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spOworCisJLyogcGFja2V0IHdhcyBub3QgZW5jcnlwdGVkICovCisJaWYgKChkZWNyeXB0X2luICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spID09CisJICAgIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTk9ORSkKKwkJcmV0dXJuIGRlY3J5cHRfb3V0OworCisJLyogcGFja2V0IHdhcyBlbmNyeXB0ZWQgd2l0aCB1bmtub3duIGFsZyAqLworCWlmICgoZGVjcnlwdF9pbiAmIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTVNLKSA9PQorCSAgICBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX0VSUikKKwkJcmV0dXJuIGRlY3J5cHRfb3V0OworCisJLyogZGVjcnlwdGlvbiB3YXMgbm90IGRvbmUgaW4gSFcgKi8KKwlpZiAoKGRlY3J5cHRfaW4gJiBSWF9NUERVX1JFU19TVEFUVVNfREVDX0RPTkVfTVNLKSAhPQorCSAgICBSWF9NUERVX1JFU19TVEFUVVNfREVDX0RPTkVfTVNLKQorCQlyZXR1cm4gZGVjcnlwdF9vdXQ7CisKKwlzd2l0Y2ggKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSykgeworCisJY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX0NDTVA6CisJCS8qIGFsZyBpcyBDQ006IGNoZWNrIE1JQyBvbmx5ICovCisJCWlmICghKGRlY3J5cHRfaW4gJiBSWF9NUERVX1JFU19TVEFUVVNfTUlDX09LKSkKKwkJCS8qIEJhZCBNSUMgKi8KKwkJCWRlY3J5cHRfb3V0IHw9IFJYX1JFU19TVEFUVVNfQkFEX0lDVl9NSUM7CisJCWVsc2UKKwkJCWRlY3J5cHRfb3V0IHw9IFJYX1JFU19TVEFUVVNfREVDUllQVF9PSzsKKworCQlicmVhazsKKworCWNhc2UgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9US0lQOgorCQlpZiAoIShkZWNyeXB0X2luICYgUlhfTVBEVV9SRVNfU1RBVFVTX1RUQUtfT0spKSB7CisJCQkvKiBCYWQgVFRBSyAqLworCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19CQURfS0VZX1RUQUs7CisJCQlicmVhazsKKwkJfQorCQkvKiBmYWxsIHRocm91Z2ggaWYgVFRBSyBPSyAqLworCWRlZmF1bHQ6CisJCWlmICghKGRlY3J5cHRfaW4gJiBSWF9NUERVX1JFU19TVEFUVVNfSUNWX09LKSkKKwkJCWRlY3J5cHRfb3V0IHw9IFJYX1JFU19TVEFUVVNfQkFEX0lDVl9NSUM7CisJCWVsc2UKKwkJCWRlY3J5cHRfb3V0IHw9IFJYX1JFU19TVEFUVVNfREVDUllQVF9PSzsKKwkJYnJlYWs7CisJfQorCisJRF9SWCgiZGVjcnlwdF9pbjoweCV4ICBkZWNyeXB0X291dCA9IDB4JXhcbiIsIGRlY3J5cHRfaW4sIGRlY3J5cHRfb3V0KTsKKworCXJldHVybiBkZWNyeXB0X291dDsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9wYXNzX3BhY2tldF90b19tYWM4MDIxMShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkgICAgICAgdTE2IGxlbiwgdTMyIGFtcGR1X3N0YXR1cywgc3RydWN0IGlsX3J4X2J1ZiAqcnhiLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0cykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKKworCS8qIFdlIG9ubHkgcHJvY2VzcyBkYXRhIHBhY2tldHMgaWYgdGhlIGludGVyZmFjZSBpcyBvcGVuICovCisJaWYgKHVubGlrZWx5KCFpbC0+aXNfb3BlbikpIHsKKwkJRF9EUk9QKCJEcm9wcGluZyBwYWNrZXQgd2hpbGUgaW50ZXJmYWNlIGlzIG5vdCBvcGVuLlxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBJbiBjYXNlIG9mIEhXIGFjY2VsZXJhdGVkIGNyeXB0byBhbmQgYmFkIGRlY3J5cHRpb24sIGRyb3AgKi8KKwlpZiAoIWlsLT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0byAmJgorCSAgICBpbF9zZXRfZGVjcnlwdGVkX2ZsYWcoaWwsIGhkciwgYW1wZHVfc3RhdHVzLCBzdGF0cykpCisJCXJldHVybjsKKworCXNrYiA9IGRldl9hbGxvY19za2IoMTI4KTsKKwlpZiAoIXNrYikgeworCQlJTF9FUlIoImRldl9hbGxvY19za2IgZmFpbGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNrYl9hZGRfcnhfZnJhZyhza2IsIDAsIHJ4Yi0+cGFnZSwgKHZvaWQgKiloZHIgLSByeGJfYWRkcihyeGIpLCBsZW4pOworCisJaWxfdXBkYXRlX3N0YXRzKGlsLCBmYWxzZSwgZmMsIGxlbik7CisJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpOworCisJaWVlZTgwMjExX3J4KGlsLT5odywgc2tiKTsKKwlpbC0+YWxsb2NfcnhiX3BhZ2UtLTsKKwlyeGItPnBhZ2UgPSBOVUxMOworfQorCisvKiBDYWxsZWQgZm9yIE5fUlggKGxlZ2FjeSBBQkcgZnJhbWVzKSwgb3IKKyAqIE5fUlhfTVBEVSAoSFQgaGlnaC10aHJvdWdocHV0IE4gZnJhbWVzKS4gKi8KK3ZvaWQKK2lsNDk2NV9oZGxfcngoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyByeF9zdGF0dXM7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfcnhfcGh5X3JlcyAqcGh5X3JlczsKKwlfX2xlMzIgcnhfcGt0X3N0YXR1czsKKwlzdHJ1Y3QgaWxfcnhfbXBkdV9yZXNfc3RhcnQgKmFtc2R1OworCXUzMiBsZW47CisJdTMyIGFtcGR1X3N0YXR1czsKKwl1MzIgcmF0ZV9uX2ZsYWdzOworCisJLyoqCisJICogTl9SWCBhbmQgTl9SWF9NUERVIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LgorCSAqCU5fUlg6IHBoeXNpY2FsIGxheWVyIGluZm8gaXMgaW4gdGhpcyBidWZmZXIKKwkgKglOX1JYX01QRFU6IHBoeXNpY2FsIGxheWVyIGluZm8gd2FzIHNlbnQgaW4gc2VwYXJhdGUKKwkgKgkJY29tbWFuZCBhbmQgY2FjaGVkIGluIGlsLT5sYXN0X3BoeV9yZXMKKwkgKgorCSAqIEhlcmUgd2Ugc2V0IHVwIGxvY2FsIHZhcmlhYmxlcyBkZXBlbmRpbmcgb24gd2hpY2ggY29tbWFuZCBpcworCSAqIHJlY2VpdmVkLgorCSAqLworCWlmIChwa3QtPmhkci5jbWQgPT0gTl9SWCkgeworCQlwaHlfcmVzID0gKHN0cnVjdCBpbF9yeF9waHlfcmVzICopcGt0LT51LnJhdzsKKwkJaGVhZGVyID0KKwkJICAgIChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCpwaHlfcmVzKSArCisJCQkJCSAgICAgcGh5X3Jlcy0+Y2ZnX3BoeV9jbnQpOworCisJCWxlbiA9IGxlMTZfdG9fY3B1KHBoeV9yZXMtPmJ5dGVfY291bnQpOworCQlyeF9wa3Rfc3RhdHVzID0KKwkJICAgICooX19sZTMyICopIChwa3QtPnUucmF3ICsgc2l6ZW9mKCpwaHlfcmVzKSArCisJCQkJIHBoeV9yZXMtPmNmZ19waHlfY250ICsgbGVuKTsKKwkJYW1wZHVfc3RhdHVzID0gbGUzMl90b19jcHUocnhfcGt0X3N0YXR1cyk7CisJfSBlbHNlIHsKKwkJaWYgKCFpbC0+XzQ5NjUubGFzdF9waHlfcmVzX3ZhbGlkKSB7CisJCQlJTF9FUlIoIk1QRFUgZnJhbWUgd2l0aG91dCBjYWNoZWQgUEhZIGRhdGFcbiIpOworCQkJcmV0dXJuOworCQl9CisJCXBoeV9yZXMgPSAmaWwtPl80OTY1Lmxhc3RfcGh5X3JlczsKKwkJYW1zZHUgPSAoc3RydWN0IGlsX3J4X21wZHVfcmVzX3N0YXJ0ICopcGt0LT51LnJhdzsKKwkJaGVhZGVyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopKHBrdC0+dS5yYXcgKyBzaXplb2YoKmFtc2R1KSk7CisJCWxlbiA9IGxlMTZfdG9fY3B1KGFtc2R1LT5ieXRlX2NvdW50KTsKKwkJcnhfcGt0X3N0YXR1cyA9ICooX19sZTMyICopIChwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkgKyBsZW4pOworCQlhbXBkdV9zdGF0dXMgPQorCQkgICAgaWw0OTY1X3RyYW5zbGF0ZV9yeF9zdGF0dXMoaWwsIGxlMzJfdG9fY3B1KHJ4X3BrdF9zdGF0dXMpKTsKKwl9CisKKwlpZiAoKHVubGlrZWx5KHBoeV9yZXMtPmNmZ19waHlfY250ID4gMjApKSkgeworCQlEX0RST1AoImRzcCBzaXplIG91dCBvZiByYW5nZSBbMCwyMF06ICVkL24iLAorCQkgICAgICAgcGh5X3Jlcy0+Y2ZnX3BoeV9jbnQpOworCQlyZXR1cm47CisJfQorCisJaWYgKCEocnhfcGt0X3N0YXR1cyAmIFJYX1JFU19TVEFUVVNfTk9fQ1JDMzJfRVJST1IpIHx8CisJICAgICEocnhfcGt0X3N0YXR1cyAmIFJYX1JFU19TVEFUVVNfTk9fUlhFX09WRVJGTE9XKSkgeworCQlEX1JYKCJCYWQgQ1JDIG9yIEZJRk86IDB4JTA4WC5cbiIsIGxlMzJfdG9fY3B1KHJ4X3BrdF9zdGF0dXMpKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFRoaXMgd2lsbCBiZSB1c2VkIGluIHNldmVyYWwgcGxhY2VzIGxhdGVyICovCisJcmF0ZV9uX2ZsYWdzID0gbGUzMl90b19jcHUocGh5X3Jlcy0+cmF0ZV9uX2ZsYWdzKTsKKworCS8qIHJ4X3N0YXR1cyBjYXJyaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYWNrZXQgdG8gbWFjODAyMTEgKi8KKwlyeF9zdGF0dXMubWFjdGltZSA9IGxlNjRfdG9fY3B1KHBoeV9yZXMtPnRpbWVzdGFtcCk7CisJcnhfc3RhdHVzLmJhbmQgPQorCSAgICAocGh5X3Jlcy0+CisJICAgICBwaHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX0JBTkRfMjRfTVNLKSA/IElFRUU4MDIxMV9CQU5EXzJHSFogOgorCSAgICBJRUVFODAyMTFfQkFORF81R0haOworCXJ4X3N0YXR1cy5mcmVxID0KKwkgICAgaWVlZTgwMjExX2NoYW5uZWxfdG9fZnJlcXVlbmN5KGxlMTZfdG9fY3B1KHBoeV9yZXMtPmNoYW5uZWwpLAorCQkJCQkgICByeF9zdGF0dXMuYmFuZCk7CisJcnhfc3RhdHVzLnJhdGVfaWR4ID0KKwkgICAgaWw0OTY1X2h3cmF0ZV90b19tYWM4MDIxMV9pZHgocmF0ZV9uX2ZsYWdzLCByeF9zdGF0dXMuYmFuZCk7CisJcnhfc3RhdHVzLmZsYWcgPSAwOworCisJLyogVFNGIGlzbid0IHJlbGlhYmxlLiBJbiBvcmRlciB0byBhbGxvdyBzbW9vdGggdXNlciBleHBlcmllbmNlLAorCSAqIHRoaXMgVy9BIGRvZXNuJ3QgcHJvcGFnYXRlIGl0IHRvIHRoZSBtYWM4MDIxMSAqLworCS8qcnhfc3RhdHVzLmZsYWcgfD0gUlhfRkxBR19NQUNUSU1FX01QRFU7ICovCisKKwlpbC0+dWNvZGVfYmVhY29uX3RpbWUgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5iZWFjb25fdGltZV9zdGFtcCk7CisKKwkvKiBGaW5kIG1heCBzaWduYWwgc3RyZW5ndGggKGRCbSkgYW1vbmcgMyBhbnRlbm5hL3JlY2VpdmVyIGNoYWlucyAqLworCXJ4X3N0YXR1cy5zaWduYWwgPSBpbDQ5NjVfY2FsY19yc3NpKGlsLCBwaHlfcmVzKTsKKworCWlsX2RiZ19sb2dfcnhfZGF0YV9mcmFtZShpbCwgbGVuLCBoZWFkZXIpOworCURfU1RBVFMoIlJzc2kgJWQsIFRTRiAlbGx1XG4iLCByeF9zdGF0dXMuc2lnbmFsLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXJ4X3N0YXR1cy5tYWN0aW1lKTsKKworCS8qCisJICogImFudGVubmEgbnVtYmVyIgorCSAqCisJICogSXQgc2VlbXMgdGhhdCB0aGUgYW50ZW5uYSBmaWVsZCBpbiB0aGUgcGh5IGZsYWdzIHZhbHVlCisJICogaXMgYWN0dWFsbHkgYSBiaXQgZmllbGQuIFRoaXMgaXMgdW5kZWZpbmVkIGJ5IHJhZGlvdGFwLAorCSAqIGl0IHdhbnRzIGFuIGFjdHVhbCBhbnRlbm5hIG51bWJlciBidXQgSSBhbHdheXMgZ2V0ICI3IgorCSAqIGZvciBtb3N0IGxlZ2FjeSBmcmFtZXMgSSByZWNlaXZlIGluZGljYXRpbmcgdGhhdCB0aGUKKwkgKiBzYW1lIGZyYW1lIHdhcyByZWNlaXZlZCBvbiBhbGwgdGhyZWUgUlggY2hhaW5zLgorCSAqCisJICogSSB0aGluayB0aGlzIGZpZWxkIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIGEKKwkgKiBuZXcgODAyLjExbiByYWRpb3RhcCBmaWVsZCAiUlggY2hhaW5zIiB0aGF0IGlzIGRlZmluZWQKKwkgKiBhcyBhIGJpdG1hc2suCisJICovCisJcnhfc3RhdHVzLmFudGVubmEgPQorCSAgICAobGUxNl90b19jcHUocGh5X3Jlcy0+cGh5X2ZsYWdzKSAmIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0spID4+CisJICAgIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9QT1M7CisKKwkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KKwlpZiAocGh5X3Jlcy0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19TSE9SVF9QUkVBTUJMRV9NU0spCisJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7CisKKwkvKiBTZXQgdXAgdGhlIEhUIHBoeSBmbGFncyAqLworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spCisJCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSFQ7CisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUNDBfTVNLKQorCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHXzQwTUhaOworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQorCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX1NIT1JUX0dJOworCisJaWw0OTY1X3Bhc3NfcGFja2V0X3RvX21hYzgwMjExKGlsLCBoZWFkZXIsIGxlbiwgYW1wZHVfc3RhdHVzLCByeGIsCisJCQkJICAgICAgICZyeF9zdGF0dXMpOworfQorCisvKiBDYWNoZSBwaHkgZGF0YSAoUnggc2lnbmFsIHN0cmVuZ3RoLCBldGMpIGZvciBIVCBmcmFtZSAoTl9SWF9QSFkpLgorICogVGhpcyB3aWxsIGJlIHVzZWQgbGF0ZXIgaW4gaWxfaGRsX3J4KCkgZm9yIE5fUlhfTVBEVS4gKi8KK3ZvaWQKK2lsNDk2NV9oZGxfcnhfcGh5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJaWwtPl80OTY1Lmxhc3RfcGh5X3Jlc192YWxpZCA9IHRydWU7CisJbWVtY3B5KCZpbC0+XzQ5NjUubGFzdF9waHlfcmVzLCBwa3QtPnUucmF3LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX3J4X3BoeV9yZXMpKTsKK30KKworc3RhdGljIGludAoraWw0OTY1X2dldF9jaGFubmVsc19mb3Jfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgdTggaXNfYWN0aXZlLAorCQkJICAgICB1OCBuX3Byb2Jlcywgc3RydWN0IGlsX3NjYW5fY2hhbm5lbCAqc2Nhbl9jaCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CisJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKwl1MTYgcGFzc2l2ZV9kd2VsbCA9IDA7CisJdTE2IGFjdGl2ZV9kd2VsbCA9IDA7CisJaW50IGFkZGVkLCBpOworCXUxNiBjaGFubmVsOworCisJc2JhbmQgPSBpbF9nZXRfaHdfbW9kZShpbCwgYmFuZCk7CisJaWYgKCFzYmFuZCkKKwkJcmV0dXJuIDA7CisKKwlhY3RpdmVfZHdlbGwgPSBpbF9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUoaWwsIGJhbmQsIG5fcHJvYmVzKTsKKwlwYXNzaXZlX2R3ZWxsID0gaWxfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZShpbCwgYmFuZCwgdmlmKTsKKworCWlmIChwYXNzaXZlX2R3ZWxsIDw9IGFjdGl2ZV9kd2VsbCkKKwkJcGFzc2l2ZV9kd2VsbCA9IGFjdGl2ZV9kd2VsbCArIDE7CisKKwlmb3IgKGkgPSAwLCBhZGRlZCA9IDA7IGkgPCBpbC0+c2Nhbl9yZXF1ZXN0LT5uX2NoYW5uZWxzOyBpKyspIHsKKwkJY2hhbiA9IGlsLT5zY2FuX3JlcXVlc3QtPmNoYW5uZWxzW2ldOworCisJCWlmIChjaGFuLT5iYW5kICE9IGJhbmQpCisJCQljb250aW51ZTsKKworCQljaGFubmVsID0gY2hhbi0+aHdfdmFsdWU7CisJCXNjYW5fY2gtPmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaGFubmVsKTsKKworCQljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgYmFuZCwgY2hhbm5lbCk7CisJCWlmICghaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkgeworCQkJRF9TQ0FOKCJDaGFubmVsICVkIGlzIElOVkFMSUQgZm9yIHRoaXMgYmFuZC5cbiIsCisJCQkgICAgICAgY2hhbm5lbCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghaXNfYWN0aXZlIHx8IGlsX2lzX2NoYW5uZWxfcGFzc2l2ZShjaF9pbmZvKSB8fAorCQkgICAgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSkKKwkJCXNjYW5fY2gtPnR5cGUgPSBTQ0FOX0NIQU5ORUxfVFlQRV9QQVNTSVZFOworCQllbHNlCisJCQlzY2FuX2NoLT50eXBlID0gU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFOworCisJCWlmIChuX3Byb2JlcykKKwkJCXNjYW5fY2gtPnR5cGUgfD0gSUxfU0NBTl9QUk9CRV9NQVNLKG5fcHJvYmVzKTsKKworCQlzY2FuX2NoLT5hY3RpdmVfZHdlbGwgPSBjcHVfdG9fbGUxNihhY3RpdmVfZHdlbGwpOworCQlzY2FuX2NoLT5wYXNzaXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYocGFzc2l2ZV9kd2VsbCk7CisKKwkJLyogU2V0IHR4cG93ZXIgbGV2ZWxzIHRvIGRlZmF1bHRzICovCisJCXNjYW5fY2gtPmRzcF9hdHRlbiA9IDExMDsKKworCQkvKiBOT1RFOiBpZiB3ZSB3ZXJlIGRvaW5nIDZNYiBPRkRNIGZvciBzY2FucyB3ZSdkIHVzZQorCQkgKiBwb3dlciBsZXZlbDoKKwkJICogc2Nhbl9jaC0+dHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICgyIDw8IDMpKSB8IDM7CisJCSAqLworCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJc2Nhbl9jaC0+dHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICgzIDw8IDMpKSB8IDM7CisJCWVsc2UKKwkJCXNjYW5fY2gtPnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoNSA8PCAzKSk7CisKKwkJRF9TQ0FOKCJTY2FubmluZyBjaD0lZCBwcm9iPTB4JVggWyVzICVkXVxuIiwgY2hhbm5lbCwKKwkJICAgICAgIGxlMzJfdG9fY3B1KHNjYW5fY2gtPnR5cGUpLAorCQkgICAgICAgKHNjYW5fY2gtPgorCQkJdHlwZSAmIFNDQU5fQ0hBTk5FTF9UWVBFX0FDVElWRSkgPyAiQUNUSVZFIiA6ICJQQVNTSVZFIiwKKwkJICAgICAgIChzY2FuX2NoLT4KKwkJCXR5cGUgJiBTQ0FOX0NIQU5ORUxfVFlQRV9BQ1RJVkUpID8gYWN0aXZlX2R3ZWxsIDoKKwkJICAgICAgIHBhc3NpdmVfZHdlbGwpOworCisJCXNjYW5fY2grKzsKKwkJYWRkZWQrKzsKKwl9CisKKwlEX1NDQU4oInRvdGFsIGNoYW5uZWxzIHRvIHNjYW4gJWRcbiIsIGFkZGVkKTsKKwlyZXR1cm4gYWRkZWQ7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfdG9nZ2xlX3R4X2FudChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4ICphbnQsIHU4IHZhbGlkKQoreworCWludCBpOworCXU4IGluZCA9ICphbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgUkFURV9BTlRfTlVNIC0gMTsgaSsrKSB7CisJCWluZCA9IChpbmQgKyAxKSA8IFJBVEVfQU5UX05VTSA/IGluZCArIDEgOiAwOworCQlpZiAodmFsaWQgJiBCSVQoaW5kKSkgeworCQkJKmFudCA9IGluZDsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworaW50CitpbDQ5NjVfcmVxdWVzdF9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX1NDQU4sCisJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGlsX3NjYW5fY21kKSwKKwkJLmZsYWdzID0gQ01EX1NJWkVfSFVHRSwKKwl9OworCXN0cnVjdCBpbF9zY2FuX2NtZCAqc2NhbjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwl1MzIgcmF0ZV9mbGFncyA9IDA7CisJdTE2IGNtZF9sZW47CisJdTE2IHJ4X2NoYWluID0gMDsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CisJdTggbl9wcm9iZXMgPSAwOworCXU4IHJ4X2FudCA9IGlsLT5od19wYXJhbXMudmFsaWRfcnhfYW50OworCXU4IHJhdGU7CisJYm9vbCBpc19hY3RpdmUgPSBmYWxzZTsKKwlpbnQgY2hhbl9tb2Q7CisJdTggYWN0aXZlX2NoYWluczsKKwl1OCBzY2FuX3R4X2FudGVubmFzID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwljdHggPSBpbF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOworCisJaWYgKCFpbC0+c2Nhbl9jbWQpIHsKKwkJaWwtPnNjYW5fY21kID0KKwkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpbF9zY2FuX2NtZCkgKyBJTF9NQVhfU0NBTl9TSVpFLAorCQkJICAgIEdGUF9LRVJORUwpOworCQlpZiAoIWlsLT5zY2FuX2NtZCkgeworCQkJRF9TQ0FOKCJmYWlsIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3Igc2NhblxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlzY2FuID0gaWwtPnNjYW5fY21kOworCW1lbXNldChzY2FuLCAwLCBzaXplb2Yoc3RydWN0IGlsX3NjYW5fY21kKSArIElMX01BWF9TQ0FOX1NJWkUpOworCisJc2Nhbi0+cXVpZXRfcGxjcF90aCA9IElMX1BMQ1BfUVVJRVRfVEhSRVNIOworCXNjYW4tPnF1aWV0X3RpbWUgPSBJTF9BQ1RJVkVfUVVJRVRfVElNRTsKKworCWlmIChpbF9pc19hbnlfYXNzb2NpYXRlZChpbCkpIHsKKwkJdTE2IGludGVydmFsOworCQl1MzIgZXh0cmE7CisJCXUzMiBzdXNwZW5kX3RpbWUgPSAxMDA7CisJCXUzMiBzY2FuX3N1c3BlbmRfdGltZSA9IDEwMDsKKworCQlEX0lORk8oIlNjYW5uaW5nIHdoaWxlIGFzc29jaWF0ZWQuLi5cbiIpOworCQlpbnRlcnZhbCA9IHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludDsKKworCQlzY2FuLT5zdXNwZW5kX3RpbWUgPSAwOworCQlzY2FuLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMigyMDAgKiAxMDI0KTsKKwkJaWYgKCFpbnRlcnZhbCkKKwkJCWludGVydmFsID0gc3VzcGVuZF90aW1lOworCisJCWV4dHJhID0gKHN1c3BlbmRfdGltZSAvIGludGVydmFsKSA8PCAyMjsKKwkJc2Nhbl9zdXNwZW5kX3RpbWUgPQorCQkgICAgKGV4dHJhIHwgKChzdXNwZW5kX3RpbWUgJSBpbnRlcnZhbCkgKiAxMDI0KSk7CisJCXNjYW4tPnN1c3BlbmRfdGltZSA9IGNwdV90b19sZTMyKHNjYW5fc3VzcGVuZF90aW1lKTsKKwkJRF9TQ0FOKCJzdXNwZW5kX3RpbWUgMHglWCBiZWFjb24gaW50ZXJ2YWwgJWRcbiIsCisJCSAgICAgICBzY2FuX3N1c3BlbmRfdGltZSwgaW50ZXJ2YWwpOworCX0KKworCWlmIChpbC0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzKSB7CisJCWludCBpLCBwID0gMDsKKwkJRF9TQ0FOKCJLaWNraW5nIG9mZiBhY3RpdmUgc2NhblxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBpbC0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzOyBpKyspIHsKKwkJCS8qIGFsd2F5cyBkb2VzIHdpbGRjYXJkIGFueXdheSAqLworCQkJaWYgKCFpbC0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbikKKwkJCQljb250aW51ZTsKKwkJCXNjYW4tPmRpcmVjdF9zY2FuW3BdLmlkID0gV0xBTl9FSURfU1NJRDsKKwkJCXNjYW4tPmRpcmVjdF9zY2FuW3BdLmxlbiA9CisJCQkgICAgaWwtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW47CisJCQltZW1jcHkoc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uc3NpZCwKKwkJCSAgICAgICBpbC0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLAorCQkJICAgICAgIGlsLT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuKTsKKwkJCW5fcHJvYmVzKys7CisJCQlwKys7CisJCX0KKwkJaXNfYWN0aXZlID0gdHJ1ZTsKKwl9IGVsc2UKKwkJRF9TQ0FOKCJTdGFydCBwYXNzaXZlIHNjYW4uXG4iKTsKKworCXNjYW4tPnR4X2NtZC50eF9mbGFncyA9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJc2Nhbi0+dHhfY21kLnN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOworCXNjYW4tPnR4X2NtZC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKKworCXN3aXRjaCAoaWwtPnNjYW5fYmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKKwkJc2Nhbi0+ZmxhZ3MgPSBSWE9OX0ZMR19CQU5EXzI0R19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0s7CisJCWNoYW5fbW9kID0KKwkJICAgIGxlMzJfdG9fY3B1KGlsLT5jdHguYWN0aXZlLgorCQkJCWZsYWdzICYgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01TSykgPj4KKwkJICAgIFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QT1M7CisJCWlmIChjaGFuX21vZCA9PSBDSEFOTkVMX01PREVfUFVSRV80MCkgeworCQkJcmF0ZSA9IFJBVEVfNk1fUExDUDsKKwkJfSBlbHNlIHsKKwkJCXJhdGUgPSBSQVRFXzFNX1BMQ1A7CisJCQlyYXRlX2ZsYWdzID0gUkFURV9NQ1NfQ0NLX01TSzsKKwkJfQorCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6CisJCXJhdGUgPSBSQVRFXzZNX1BMQ1A7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX1dBUk4oIkludmFsaWQgc2NhbiBiYW5kXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJLyoKKwkgKiBJZiBhY3RpdmUgc2Nhbm5pbmcgaXMgcmVxdWVzdGVkIGJ1dCBhIGNlcnRhaW4gY2hhbm5lbCBpcworCSAqIG1hcmtlZCBwYXNzaXZlLCB3ZSBjYW4gZG8gYWN0aXZlIHNjYW5uaW5nIGlmIHdlIGRldGVjdAorCSAqIHRyYW5zbWlzc2lvbnMuCisJICoKKwkgKiBUaGVyZSBpcyBhbiBpc3N1ZSB3aXRoIHNvbWUgZmlybXdhcmUgdmVyc2lvbnMgdGhhdCB0cmlnZ2VycworCSAqIGEgc3lzYXNzZXJ0IG9uIGEgImdvb2QgQ1JDIHRocmVzaG9sZCIgb2YgemVybyAoPT0gZGlzYWJsZWQpLAorCSAqIG9uIGEgcmFkYXIgY2hhbm5lbCBldmVuIHRob3VnaCB0aGlzIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIE5PVAorCSAqIHNlbmQgcHJvYmVzLgorCSAqCisJICogVGhlICJnb29kIENSQyB0aHJlc2hvbGQiIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgd2UKKwkgKiBuZWVkIHRvIHJlY2VpdmUgZHVyaW5nIG91ciBkd2VsbCB0aW1lIG9uIGEgY2hhbm5lbCBiZWZvcmUKKwkgKiBzZW5kaW5nIG91dCBwcm9iZXMgLS0gc2V0dGluZyB0aGlzIHRvIGEgaHVnZSB2YWx1ZSB3aWxsCisJICogbWVhbiB3ZSBuZXZlciByZWFjaCBpdCwgYnV0IGF0IHRoZSBzYW1lIHRpbWUgd29yayBhcm91bmQKKwkgKiB0aGUgYWZvcmVtZW50aW9uZWQgaXNzdWUuIFRodXMgdXNlIElMX0dPT0RfQ1JDX1RIX05FVkVSCisJICogaGVyZSBpbnN0ZWFkIG9mIElMX0dPT0RfQ1JDX1RIX0RJU0FCTEVELgorCSAqLworCXNjYW4tPmdvb2RfQ1JDX3RoID0KKwkgICAgaXNfYWN0aXZlID8gSUxfR09PRF9DUkNfVEhfREVGQVVMVCA6IElMX0dPT0RfQ1JDX1RIX05FVkVSOworCisJYmFuZCA9IGlsLT5zY2FuX2JhbmQ7CisKKwlpZiAoaWwtPmNmZy0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXSkKKwkJcnhfYW50ID0gaWwtPmNmZy0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXTsKKworCWlsNDk2NV90b2dnbGVfdHhfYW50KGlsLCAmaWwtPnNjYW5fdHhfYW50W2JhbmRdLCBzY2FuX3R4X2FudGVubmFzKTsKKwlyYXRlX2ZsYWdzIHw9IEJJVChpbC0+c2Nhbl90eF9hbnRbYmFuZF0pIDw8IFJBVEVfTUNTX0FOVF9QT1M7CisJc2Nhbi0+dHhfY21kLnJhdGVfbl9mbGFncyA9IGNwdV90b19sZTMyKHJhdGUgfCByYXRlX2ZsYWdzKTsKKworCS8qIEluIHBvd2VyIHNhdmUgbW9kZSB1c2Ugb25lIGNoYWluLCBvdGhlcndpc2UgdXNlIGFsbCBjaGFpbnMgKi8KKwlpZiAodGVzdF9iaXQoU19QT1dFUl9QTUksICZpbC0+c3RhdHVzKSkgeworCQkvKiByeF9hbnQgaGFzIGJlZW4gc2V0IHRvIGFsbCB2YWxpZCBjaGFpbnMgcHJldmlvdXNseSAqLworCQlhY3RpdmVfY2hhaW5zID0KKwkJICAgIHJ4X2FudCAmICgodTgpIChpbC0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zKSk7CisJCWlmICghYWN0aXZlX2NoYWlucykKKwkJCWFjdGl2ZV9jaGFpbnMgPSByeF9hbnQ7CisKKwkJRF9TQ0FOKCJjaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnM6ICV1XG4iLAorCQkgICAgICAgaWwtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucyk7CisKKwkJcnhfYW50ID0gaWw0OTY1X2ZpcnN0X2FudGVubmEoYWN0aXZlX2NoYWlucyk7CisJfQorCisJLyogTUlNTyBpcyBub3QgdXNlZCBoZXJlLCBidXQgdmFsdWUgaXMgcmVxdWlyZWQgKi8KKwlyeF9jaGFpbiB8PSBpbC0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudCA8PCBSWE9OX1JYX0NIQUlOX1ZBTElEX1BPUzsKKwlyeF9jaGFpbiB8PSByeF9hbnQgPDwgUlhPTl9SWF9DSEFJTl9GT1JDRV9NSU1PX1NFTF9QT1M7CisJcnhfY2hhaW4gfD0gcnhfYW50IDw8IFJYT05fUlhfQ0hBSU5fRk9SQ0VfU0VMX1BPUzsKKwlyeF9jaGFpbiB8PSAweDEgPDwgUlhPTl9SWF9DSEFJTl9EUklWRVJfRk9SQ0VfUE9TOworCXNjYW4tPnJ4X2NoYWluID0gY3B1X3RvX2xlMTYocnhfY2hhaW4pOworCisJY21kX2xlbiA9CisJICAgIGlsX2ZpbGxfcHJvYmVfcmVxKGlsLCAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2Nhbi0+ZGF0YSwKKwkJCSAgICAgIHZpZi0+YWRkciwgaWwtPnNjYW5fcmVxdWVzdC0+aWUsCisJCQkgICAgICBpbC0+c2Nhbl9yZXF1ZXN0LT5pZV9sZW4sCisJCQkgICAgICBJTF9NQVhfU0NBTl9TSVpFIC0gc2l6ZW9mKCpzY2FuKSk7CisJc2Nhbi0+dHhfY21kLmxlbiA9IGNwdV90b19sZTE2KGNtZF9sZW4pOworCisJc2Nhbi0+ZmlsdGVyX2ZsYWdzIHw9CisJICAgIChSWE9OX0ZJTFRFUl9BQ0NFUFRfR1JQX01TSyB8IFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKTsKKworCXNjYW4tPmNoYW5uZWxfY291bnQgPQorCSAgICBpbDQ5NjVfZ2V0X2NoYW5uZWxzX2Zvcl9zY2FuKGlsLCB2aWYsIGJhbmQsIGlzX2FjdGl2ZSwgbl9wcm9iZXMsCisJCQkJCSAodm9pZCAqKSZzY2FuLT5kYXRhW2NtZF9sZW5dKTsKKwlpZiAoc2Nhbi0+Y2hhbm5lbF9jb3VudCA9PSAwKSB7CisJCURfU0NBTigiY2hhbm5lbCBjb3VudCAlZFxuIiwgc2Nhbi0+Y2hhbm5lbF9jb3VudCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWNtZC5sZW4gKz0KKwkgICAgbGUxNl90b19jcHUoc2Nhbi0+dHhfY21kLmxlbikgKworCSAgICBzY2FuLT5jaGFubmVsX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBpbF9zY2FuX2NoYW5uZWwpOworCWNtZC5kYXRhID0gc2NhbjsKKwlzY2FuLT5sZW4gPSBjcHVfdG9fbGUxNihjbWQubGVuKTsKKworCXNldF9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7CisKKwlyZXQgPSBpbF9zZW5kX2NtZF9zeW5jKGlsLCAmY21kKTsKKwlpZiAocmV0KQorCQljbGVhcl9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK2lsNDk2NV9tYW5hZ2VfaWJzc19zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgIGJvb2wgYWRkKQoreworCXN0cnVjdCBpbF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisKKwlpZiAoYWRkKQorCQlyZXR1cm4gaWw0OTY1X2FkZF9ic3NpZF9zdGF0aW9uKGlsLCB2aWZfcHJpdi0+Y3R4LAorCQkJCQkJdmlmLT5ic3NfY29uZi5ic3NpZCwKKwkJCQkJCSZ2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQpOworCXJldHVybiBpbF9yZW1vdmVfc3RhdGlvbihpbCwgdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkLAorCQkJCSB2aWYtPmJzc19jb25mLmJzc2lkKTsKK30KKwordm9pZAoraWw0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIGludCB0aWQsIGludCBmcmVlZCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+c3RhX2xvY2spOworCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUgPj0gZnJlZWQpCisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUgLT0gZnJlZWQ7CisJZWxzZSB7CisJCURfVFgoImZyZWUgbW9yZSB0aGFuIHRmZHNfaW5fcXVldWUgKCV1OiVkKVxuIiwKKwkJICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS50ZmRzX2luX3F1ZXVlLCBmcmVlZCk7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUgPSAwOworCX0KK30KKworI2RlZmluZSBJTF9UWF9RVUVVRV9NU0sJMHhmZmZmZgorCitzdGF0aWMgYm9vbAoraWw0OTY1X2lzX3NpbmdsZV9yeF9zdHJlYW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiBpbC0+Y3VycmVudF9odF9jb25maWcuc21wcyA9PSBJRUVFODAyMTFfU01QU19TVEFUSUMgfHwKKwkgICAgaWwtPmN1cnJlbnRfaHRfY29uZmlnLnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50OworfQorCisjZGVmaW5lIElMX05VTV9SWF9DSEFJTlNfTVVMVElQTEUJMworI2RlZmluZSBJTF9OVU1fUlhfQ0hBSU5TX1NJTkdMRQkyCisjZGVmaW5lIElMX05VTV9JRExFX0NIQUlOU19EVUFMCTIKKyNkZWZpbmUgSUxfTlVNX0lETEVfQ0hBSU5TX1NJTkdMRQkxCisKKy8qCisgKiBEZXRlcm1pbmUgaG93IG1hbnkgcmVjZWl2ZXIvYW50ZW5uYSBjaGFpbnMgdG8gdXNlLgorICoKKyAqIE1vcmUgcHJvdmlkZXMgYmV0dGVyIHJlY2VwdGlvbiB2aWEgZGl2ZXJzaXR5LiAgRmV3ZXIgc2F2ZXMgcG93ZXIKKyAqIGF0IHRoZSBleHBlbnNlIG9mIHRocm91Z2hwdXQsIGJ1dCBvbmx5IHdoZW4gbm90IGluIHBvd2Vyc2F2ZSB0bworICogc3RhcnQgd2l0aC4KKyAqCisgKiBNSU1PIChkdWFsIHN0cmVhbSkgcmVxdWlyZXMgYXQgbGVhc3QgMiwgYnV0IHdvcmtzIGJldHRlciB3aXRoIDMuCisgKiBUaGlzIGRvZXMgbm90IGRldGVybWluZSAqd2hpY2gqIGNoYWlucyB0byB1c2UsIGp1c3QgaG93IG1hbnkuCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9nZXRfYWN0aXZlX3J4X2NoYWluX2NvdW50KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiAjIG9mIFJ4IGNoYWlucyB0byB1c2Ugd2hlbiBleHBlY3RpbmcgTUlNTy4gKi8KKwlpZiAoaWw0OTY1X2lzX3NpbmdsZV9yeF9zdHJlYW0oaWwpKQorCQlyZXR1cm4gSUxfTlVNX1JYX0NIQUlOU19TSU5HTEU7CisJZWxzZQorCQlyZXR1cm4gSUxfTlVNX1JYX0NIQUlOU19NVUxUSVBMRTsKK30KKworLyoKKyAqIFdoZW4gd2UgYXJlIGluIHBvd2VyIHNhdmluZyBtb2RlLCB1bmxlc3MgZGV2aWNlIHN1cHBvcnQgc3BhdGlhbAorICogbXVsdGlwbGV4aW5nIHBvd2VyIHNhdmUsIHVzZSB0aGUgYWN0aXZlIGNvdW50IGZvciByeCBjaGFpbiBjb3VudC4KKyAqLworc3RhdGljIGludAoraWw0OTY1X2dldF9pZGxlX3J4X2NoYWluX2NvdW50KHN0cnVjdCBpbF9wcml2ICppbCwgaW50IGFjdGl2ZV9jbnQpCit7CisJLyogIyBSeCBjaGFpbnMgd2hlbiBpZGxpbmcsIGRlcGVuZGluZyBvbiBTTVBTIG1vZGUgKi8KKwlzd2l0Y2ggKGlsLT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzKSB7CisJY2FzZSBJRUVFODAyMTFfU01QU19TVEFUSUM6CisJY2FzZSBJRUVFODAyMTFfU01QU19EWU5BTUlDOgorCQlyZXR1cm4gSUxfTlVNX0lETEVfQ0hBSU5TX1NJTkdMRTsKKwljYXNlIElFRUU4MDIxMV9TTVBTX09GRjoKKwkJcmV0dXJuIGFjdGl2ZV9jbnQ7CisJZGVmYXVsdDoKKwkJV0FSTigxLCAiaW52YWxpZCBTTVBTIG1vZGUgJWQiLCBpbC0+Y3VycmVudF9odF9jb25maWcuc21wcyk7CisJCXJldHVybiBhY3RpdmVfY250OworCX0KK30KKworLyogdXAgdG8gNCBjaGFpbnMgKi8KK3N0YXRpYyB1OAoraWw0OTY1X2NvdW50X2NoYWluX2JpdG1hcCh1MzIgY2hhaW5fYml0bWFwKQoreworCXU4IHJlczsKKwlyZXMgPSAoY2hhaW5fYml0bWFwICYgQklUKDApKSA+PiAwOworCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDEpKSA+PiAxOworCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDIpKSA+PiAyOworCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDMpKSA+PiAzOworCXJldHVybiByZXM7Cit9CisKKy8qKgorICogaWw0OTY1X3NldF9yeG9uX2NoYWluIC0gU2V0IHVwIFJ4IGNoYWluIHVzYWdlIGluICJzdGFnaW5nIiBSWE9OIGltYWdlCisgKgorICogU2VsZWN0cyBob3cgbWFueSBhbmQgd2hpY2ggUnggcmVjZWl2ZXJzL2FudGVubmFzL2NoYWlucyB0byB1c2UuCisgKiBUaGlzIHNob3VsZCBub3QgYmUgdXNlZCBmb3Igc2NhbiBjb21tYW5kIC4uLiBpdCBwdXRzIGRhdGEgaW4gd3JvbmcgcGxhY2UuCisgKi8KK3ZvaWQKK2lsNDk2NV9zZXRfcnhvbl9jaGFpbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlib29sIGlzX3NpbmdsZSA9IGlsNDk2NV9pc19zaW5nbGVfcnhfc3RyZWFtKGlsKTsKKwlib29sIGlzX2NhbSA9ICF0ZXN0X2JpdChTX1BPV0VSX1BNSSwgJmlsLT5zdGF0dXMpOworCXU4IGlkbGVfcnhfY250LCBhY3RpdmVfcnhfY250LCB2YWxpZF9yeF9jbnQ7CisJdTMyIGFjdGl2ZV9jaGFpbnM7CisJdTE2IHJ4X2NoYWluOworCisJLyogVGVsbCB1Q29kZSB3aGljaCBhbnRlbm5hcyBhcmUgYWN0dWFsbHkgY29ubmVjdGVkLgorCSAqIEJlZm9yZSBmaXJzdCBhc3NvY2lhdGlvbiwgd2UgYXNzdW1lIGFsbCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkLgorCSAqIEp1c3QgYWZ0ZXIgZmlyc3QgYXNzb2NpYXRpb24sIGlsNDk2NV9jaGFpbl9ub2lzZV9jYWxpYnJhdGlvbigpCisJICogICAgY2hlY2tzIHdoaWNoIGFudGVubmFzIGFjdHVhbGx5ICphcmUqIGNvbm5lY3RlZC4gKi8KKwlpZiAoaWwtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucykKKwkJYWN0aXZlX2NoYWlucyA9IGlsLT5jaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnM7CisJZWxzZQorCQlhY3RpdmVfY2hhaW5zID0gaWwtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQ7CisKKwlyeF9jaGFpbiA9IGFjdGl2ZV9jaGFpbnMgPDwgUlhPTl9SWF9DSEFJTl9WQUxJRF9QT1M7CisKKwkvKiBIb3cgbWFueSByZWNlaXZlcnMgc2hvdWxkIHdlIHVzZT8gKi8KKwlhY3RpdmVfcnhfY250ID0gaWw0OTY1X2dldF9hY3RpdmVfcnhfY2hhaW5fY291bnQoaWwpOworCWlkbGVfcnhfY250ID0gaWw0OTY1X2dldF9pZGxlX3J4X2NoYWluX2NvdW50KGlsLCBhY3RpdmVfcnhfY250KTsKKworCS8qIGNvcnJlY3QgcnggY2hhaW4gY291bnQgYWNjb3JkaW5nIGh3IHNldHRpbmdzCisJICogYW5kIGNoYWluIG5vaXNlIGNhbGlicmF0aW9uCisJICovCisJdmFsaWRfcnhfY250ID0gaWw0OTY1X2NvdW50X2NoYWluX2JpdG1hcChhY3RpdmVfY2hhaW5zKTsKKwlpZiAodmFsaWRfcnhfY250IDwgYWN0aXZlX3J4X2NudCkKKwkJYWN0aXZlX3J4X2NudCA9IHZhbGlkX3J4X2NudDsKKworCWlmICh2YWxpZF9yeF9jbnQgPCBpZGxlX3J4X2NudCkKKwkJaWRsZV9yeF9jbnQgPSB2YWxpZF9yeF9jbnQ7CisKKwlyeF9jaGFpbiB8PSBhY3RpdmVfcnhfY250IDw8IFJYT05fUlhfQ0hBSU5fTUlNT19DTlRfUE9TOworCXJ4X2NoYWluIHw9IGlkbGVfcnhfY250IDw8IFJYT05fUlhfQ0hBSU5fQ05UX1BPUzsKKworCWN0eC0+c3RhZ2luZy5yeF9jaGFpbiA9IGNwdV90b19sZTE2KHJ4X2NoYWluKTsKKworCWlmICghaXNfc2luZ2xlICYmIGFjdGl2ZV9yeF9jbnQgPj0gSUxfTlVNX1JYX0NIQUlOU19TSU5HTEUgJiYgaXNfY2FtKQorCQljdHgtPnN0YWdpbmcucnhfY2hhaW4gfD0gUlhPTl9SWF9DSEFJTl9NSU1PX0ZPUkNFX01TSzsKKwllbHNlCisJCWN0eC0+c3RhZ2luZy5yeF9jaGFpbiAmPSB+UlhPTl9SWF9DSEFJTl9NSU1PX0ZPUkNFX01TSzsKKworCURfQVNTT0MoInJ4X2NoYWluPTB4JVggYWN0aXZlPSVkIGlkbGU9JWRcbiIsIGN0eC0+c3RhZ2luZy5yeF9jaGFpbiwKKwkJYWN0aXZlX3J4X2NudCwgaWRsZV9yeF9jbnQpOworCisJV0FSTl9PTihhY3RpdmVfcnhfY250ID09IDAgfHwgaWRsZV9yeF9jbnQgPT0gMCB8fAorCQlhY3RpdmVfcnhfY250IDwgaWRsZV9yeF9jbnQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitpbDQ5NjVfZ2V0X2ZoX3N0cmluZyhpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJCUlMX0NNRChGSDQ5X1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcpOworCQlJTF9DTUQoRkg0OV9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRyk7CisJCUlMX0NNRChGSDQ5X1JTQ1NSX0NITkwwX1dQVFIpOworCQlJTF9DTUQoRkg0OV9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHKTsKKwkJSUxfQ01EKEZINDlfTUVNX1JTU1JfU0hBUkVEX0NUUkxfUkVHKTsKKwkJSUxfQ01EKEZINDlfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRyk7CisJCUlMX0NNRChGSDQ5X01FTV9SU1NSX1JYX0VOQUJMRV9FUlJfSVJRMkRSVik7CisJCUlMX0NNRChGSDQ5X1RTU1JfVFhfU1RBVFVTX1JFRyk7CisJCUlMX0NNRChGSDQ5X1RTU1JfVFhfRVJST1JfUkVHKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCX0KK30KKworaW50CitpbDQ5NjVfZHVtcF9maChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGNoYXIgKipidWYsIGJvb2wgZGlzcGxheSkKK3sKKwlpbnQgaTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpbnQgcG9zID0gMDsKKwlzaXplX3QgYnVmc3ogPSAwOworI2VuZGlmCisJc3RhdGljIGNvbnN0IHUzMiBmaF90YmxbXSA9IHsKKwkJRkg0OV9SU0NTUl9DSE5MMF9TVFRTX1dQVFJfUkVHLAorCQlGSDQ5X1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHLAorCQlGSDQ5X1JTQ1NSX0NITkwwX1dQVFIsCisJCUZINDlfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywKKwkJRkg0OV9NRU1fUlNTUl9TSEFSRURfQ1RSTF9SRUcsCisJCUZINDlfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRywKKwkJRkg0OV9NRU1fUlNTUl9SWF9FTkFCTEVfRVJSX0lSUTJEUlYsCisJCUZINDlfVFNTUl9UWF9TVEFUVVNfUkVHLAorCQlGSDQ5X1RTU1JfVFhfRVJST1JfUkVHCisJfTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoZGlzcGxheSkgeworCQlidWZzeiA9IEFSUkFZX1NJWkUoZmhfdGJsKSAqIDQ4ICsgNDA7CisJCSpidWYgPSBrbWFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwkJaWYgKCEqYnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKCpidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiRkggcmVnaXN0ZXIgdmFsdWVzOlxuIik7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZoX3RibCk7IGkrKykgeworCQkJcG9zICs9CisJCQkgICAgc2NucHJpbnRmKCpidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJCSAgICAgICIgICUzNHM6IDBYJTA4eFxuIiwKKwkJCQkgICAgICBpbDQ5NjVfZ2V0X2ZoX3N0cmluZyhmaF90YmxbaV0pLAorCQkJCSAgICAgIGlsX3JkKGlsLCBmaF90YmxbaV0pKTsKKwkJfQorCQlyZXR1cm4gcG9zOworCX0KKyNlbmRpZgorCUlMX0VSUigiRkggcmVnaXN0ZXIgdmFsdWVzOlxuIik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmhfdGJsKTsgaSsrKSB7CisJCUlMX0VSUigiICAlMzRzOiAwWCUwOHhcbiIsIGlsNDk2NV9nZXRfZmhfc3RyaW5nKGZoX3RibFtpXSksCisJCSAgICAgICBpbF9yZChpbCwgZmhfdGJsW2ldKSk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkCitpbDQ5NjVfaGRsX21pc3NlZF9iZWFjb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfbWlzc2VkX2JlYWNvbl9ub3RpZiAqbWlzc2VkX2JlYWNvbjsKKworCW1pc3NlZF9iZWFjb24gPSAmcGt0LT51Lm1pc3NlZF9iZWFjb247CisJaWYgKGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPmNvbnNlY3V0aXZlX21pc3NlZF9iZWFjb25zKSA+CisJICAgIGlsLT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCkgeworCQlEX0NBTElCKCJtaXNzZWQgYmNuIGNuc3EgJWQgdG90bCAlZCByY2QgJWQgZXhwY3RkICVkXG4iLAorCQkJbGUzMl90b19jcHUobWlzc2VkX2JlYWNvbi0+Y29uc2VjdXRpdmVfbWlzc2VkX2JlYWNvbnMpLAorCQkJbGUzMl90b19jcHUobWlzc2VkX2JlYWNvbi0+dG90YWxfbWlzc2VkX2JlY29ucyksCisJCQlsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5udW1fcmVjdmRfYmVhY29ucyksCisJCQlsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5udW1fZXhwZWN0ZWRfYmVhY29ucykpOworCQlpZiAoIXRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkKKwkJCWlsNDk2NV9pbml0X3NlbnNpdGl2aXR5KGlsKTsKKwl9Cit9CisKKy8qIENhbGN1bGF0ZSBub2lzZSBsZXZlbCwgYmFzZWQgb24gbWVhc3VyZW1lbnRzIGR1cmluZyBuZXR3b3JrIHNpbGVuY2UganVzdAorICogICBiZWZvcmUgYXJyaXZpbmcgYmVhY29uLiAgVGhpcyBtZWFzdXJlbWVudCBjYW4gYmUgZG9uZSBvbmx5IGlmIHdlIGtub3cKKyAqICAgZXhhY3RseSB3aGVuIHRvIGV4cGVjdCBiZWFjb25zLCB0aGVyZWZvcmUgb25seSB3aGVuIHdlJ3JlIGFzc29jaWF0ZWQuICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3J4X2NhbGNfbm9pc2Uoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBzdGF0c19yeF9ub25fcGh5ICpyeF9pbmZvOworCWludCBudW1fYWN0aXZlX3J4ID0gMDsKKwlpbnQgdG90YWxfc2lsZW5jZSA9IDA7CisJaW50IGJjbl9zaWxlbmNlX2EsIGJjbl9zaWxlbmNlX2IsIGJjbl9zaWxlbmNlX2M7CisJaW50IGxhc3Rfcnhfbm9pc2U7CisKKwlyeF9pbmZvID0gJihpbC0+XzQ5NjUuc3RhdHMucnguZ2VuZXJhbCk7CisJYmNuX3NpbGVuY2VfYSA9CisJICAgIGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSkgJiBJTl9CQU5EX0ZJTFRFUjsKKwliY25fc2lsZW5jZV9iID0KKwkgICAgbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKSAmIElOX0JBTkRfRklMVEVSOworCWJjbl9zaWxlbmNlX2MgPQorCSAgICBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpICYgSU5fQkFORF9GSUxURVI7CisKKwlpZiAoYmNuX3NpbGVuY2VfYSkgeworCQl0b3RhbF9zaWxlbmNlICs9IGJjbl9zaWxlbmNlX2E7CisJCW51bV9hY3RpdmVfcngrKzsKKwl9CisJaWYgKGJjbl9zaWxlbmNlX2IpIHsKKwkJdG90YWxfc2lsZW5jZSArPSBiY25fc2lsZW5jZV9iOworCQludW1fYWN0aXZlX3J4Kys7CisJfQorCWlmIChiY25fc2lsZW5jZV9jKSB7CisJCXRvdGFsX3NpbGVuY2UgKz0gYmNuX3NpbGVuY2VfYzsKKwkJbnVtX2FjdGl2ZV9yeCsrOworCX0KKworCS8qIEF2ZXJhZ2UgYW1vbmcgYWN0aXZlIGFudGVubmFzICovCisJaWYgKG51bV9hY3RpdmVfcngpCisJCWxhc3Rfcnhfbm9pc2UgPSAodG90YWxfc2lsZW5jZSAvIG51bV9hY3RpdmVfcngpIC0gMTA3OworCWVsc2UKKwkJbGFzdF9yeF9ub2lzZSA9IElMX05PSVNFX01FQVNfTk9UX0FWQUlMQUJMRTsKKworCURfQ0FMSUIoImluYmFuZCBzaWxlbmNlIGEgJXUsIGIgJXUsIGMgJXUsIGRCbSAlZFxuIiwgYmNuX3NpbGVuY2VfYSwKKwkJYmNuX3NpbGVuY2VfYiwgYmNuX3NpbGVuY2VfYywgbGFzdF9yeF9ub2lzZSk7Cit9CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworLyoKKyAqICBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbiBvZiBhbGwgc3RhdHMgY291bnRlciBhcmUgaW4gRFdPUkQKKyAqICBGSVhNRTogVGhpcyBmdW5jdGlvbiBpcyBmb3IgZGVidWdnaW5nLCBkbyBub3QgZGVhbCB3aXRoCisgKiAgdGhlIGNhc2Ugb2YgY291bnRlcnMgcm9sbC1vdmVyLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2FjY3VtdWxhdGl2ZV9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIF9fbGUzMiAqIHN0YXRzKQoreworCWludCBpLCBzaXplOworCV9fbGUzMiAqcHJldl9zdGF0czsKKwl1MzIgKmFjY3VtX3N0YXRzOworCXUzMiAqZGVsdGEsICptYXhfZGVsdGE7CisJc3RydWN0IHN0YXRzX2dlbmVyYWxfY29tbW9uICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdHNfdHggKnR4LCAqYWNjdW1fdHg7CisKKwlwcmV2X3N0YXRzID0gKF9fbGUzMiAqKSAmaWwtPl80OTY1LnN0YXRzOworCWFjY3VtX3N0YXRzID0gKHUzMiAqKSAmaWwtPl80OTY1LmFjY3VtX3N0YXRzOworCXNpemUgPSBzaXplb2Yoc3RydWN0IGlsX25vdGlmX3N0YXRzKTsKKwlnZW5lcmFsID0gJmlsLT5fNDk2NS5zdGF0cy5nZW5lcmFsLmNvbW1vbjsKKwlhY2N1bV9nZW5lcmFsID0gJmlsLT5fNDk2NS5hY2N1bV9zdGF0cy5nZW5lcmFsLmNvbW1vbjsKKwl0eCA9ICZpbC0+XzQ5NjUuc3RhdHMudHg7CisJYWNjdW1fdHggPSAmaWwtPl80OTY1LmFjY3VtX3N0YXRzLnR4OworCWRlbHRhID0gKHUzMiAqKSAmaWwtPl80OTY1LmRlbHRhX3N0YXRzOworCW1heF9kZWx0YSA9ICh1MzIgKikgJmlsLT5fNDk2NS5tYXhfZGVsdGE7CisKKwlmb3IgKGkgPSBzaXplb2YoX19sZTMyKTsgaSA8IHNpemU7CisJICAgICBpICs9CisJICAgICBzaXplb2YoX19sZTMyKSwgc3RhdHMrKywgcHJldl9zdGF0cysrLCBkZWx0YSsrLCBtYXhfZGVsdGErKywKKwkgICAgIGFjY3VtX3N0YXRzKyspIHsKKwkJaWYgKGxlMzJfdG9fY3B1KCpzdGF0cykgPiBsZTMyX3RvX2NwdSgqcHJldl9zdGF0cykpIHsKKwkJCSpkZWx0YSA9CisJCQkgICAgKGxlMzJfdG9fY3B1KCpzdGF0cykgLSBsZTMyX3RvX2NwdSgqcHJldl9zdGF0cykpOworCQkJKmFjY3VtX3N0YXRzICs9ICpkZWx0YTsKKwkJCWlmICgqZGVsdGEgPiAqbWF4X2RlbHRhKQorCQkJCSptYXhfZGVsdGEgPSAqZGVsdGE7CisJCX0KKwl9CisKKwkvKiByZXNldCBhY2N1bXVsYXRpdmUgc3RhdHMgZm9yICJuby1jb3VudGVyIiB0eXBlIHN0YXRzICovCisJYWNjdW1fZ2VuZXJhbC0+dGVtcGVyYXR1cmUgPSBnZW5lcmFsLT50ZW1wZXJhdHVyZTsKKwlhY2N1bV9nZW5lcmFsLT50dGxfdGltZXN0YW1wID0gZ2VuZXJhbC0+dHRsX3RpbWVzdGFtcDsKK30KKyNlbmRpZgorCisjZGVmaW5lIFJFR19SRUNBTElCX1BFUklPRCAoNjApCisKK3ZvaWQKK2lsNDk2NV9oZGxfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJaW50IGNoYW5nZTsKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCisJRF9SWCgiU3RhdGlzdGljcyBub3RpZmljYXRpb24gcmVjZWl2ZWQgKCVkIHZzICVkKS5cbiIsCisJICAgICAoaW50KXNpemVvZihzdHJ1Y3QgaWxfbm90aWZfc3RhdHMpLAorCSAgICAgbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBJTF9SWF9GUkFNRV9TSVpFX01TSyk7CisKKwljaGFuZ2UgPQorCSAgICAoKGlsLT5fNDk2NS5zdGF0cy5nZW5lcmFsLmNvbW1vbi50ZW1wZXJhdHVyZSAhPQorCSAgICAgIHBrdC0+dS5zdGF0cy5nZW5lcmFsLmNvbW1vbi50ZW1wZXJhdHVyZSkgfHwKKwkgICAgICgoaWwtPl80OTY1LnN0YXRzLmZsYWcgJiBTVEFUU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSykgIT0KKwkgICAgICAocGt0LT51LnN0YXRzLmZsYWcgJiBTVEFUU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSykpKTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworCWlsNDk2NV9hY2N1bXVsYXRpdmVfc3RhdHMoaWwsIChfX2xlMzIgKikgJnBrdC0+dS5zdGF0cyk7CisjZW5kaWYKKworCS8qIFRPRE86IHJlYWRpbmcgc29tZSBvZiBzdGF0cyBpcyB1bm5lZWRlZCAqLworCW1lbWNweSgmaWwtPl80OTY1LnN0YXRzLCAmcGt0LT51LnN0YXRzLCBzaXplb2YoaWwtPl80OTY1LnN0YXRzKSk7CisKKwlzZXRfYml0KFNfU1RBVFMsICZpbC0+c3RhdHVzKTsKKworCS8qIFJlc2NoZWR1bGUgdGhlIHN0YXRzIHRpbWVyIHRvIG9jY3VyIGluCisJICogUkVHX1JFQ0FMSUJfUEVSSU9EIHNlY29uZHMgdG8gZW5zdXJlIHdlIGdldCBhCisJICogdGhlcm1hbCB1cGRhdGUgZXZlbiBpZiB0aGUgdUNvZGUgZG9lc24ndCBnaXZlCisJICogdXMgb25lICovCisJbW9kX3RpbWVyKCZpbC0+c3RhdHNfcGVyaW9kaWMsCisJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoUkVHX1JFQ0FMSUJfUEVSSU9EICogMTAwMCkpOworCisJaWYgKHVubGlrZWx5KCF0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykpICYmCisJICAgIChwa3QtPmhkci5jbWQgPT0gTl9TVEFUUykpIHsKKwkJaWw0OTY1X3J4X2NhbGNfbm9pc2UoaWwpOworCQlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+cnVuX3RpbWVfY2FsaWJfd29yayk7CisJfQorCWlmIChpbC0+Y2ZnLT5vcHMtPmxpYi0+dGVtcF9vcHMudGVtcGVyYXR1cmUgJiYgY2hhbmdlKQorCQlpbC0+Y2ZnLT5vcHMtPmxpYi0+dGVtcF9vcHMudGVtcGVyYXR1cmUoaWwpOworfQorCit2b2lkCitpbDQ5NjVfaGRsX2Nfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKworCWlmIChsZTMyX3RvX2NwdShwa3QtPnUuc3RhdHMuZmxhZykgJiBVQ09ERV9TVEFUU19DTEVBUl9NU0spIHsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworCQltZW1zZXQoJmlsLT5fNDk2NS5hY2N1bV9zdGF0cywgMCwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfbm90aWZfc3RhdHMpKTsKKwkJbWVtc2V0KCZpbC0+XzQ5NjUuZGVsdGFfc3RhdHMsIDAsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX25vdGlmX3N0YXRzKSk7CisJCW1lbXNldCgmaWwtPl80OTY1Lm1heF9kZWx0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9ub3RpZl9zdGF0cykpOworI2VuZGlmCisJCURfUlgoIlN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOworCX0KKwlpbDQ5NjVfaGRsX3N0YXRzKGlsLCByeGIpOworfQorCisKKy8qCisgKiBtYWM4MDIxMSBxdWV1ZXMsIEFDcywgaGFyZHdhcmUgcXVldWVzLCBGSUZPcy4KKyAqCisgKiBDZi4gaHR0cDovL3dpcmVsZXNzLmtlcm5lbC5vcmcvZW4vZGV2ZWxvcGVycy9Eb2N1bWVudGF0aW9uL21hYzgwMjExL3F1ZXVlcworICoKKyAqIE1hYzgwMjExIHVzZXMgdGhlIGZvbGxvd2luZyBudW1iZXJzLCB3aGljaCB3ZSBnZXQgYXMgZnJvbSBpdAorICogYnkgd2F5IG9mIHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOgorICoKKyAqICAgICBWTyAgICAgIDAKKyAqICAgICBWSSAgICAgIDEKKyAqICAgICBCRSAgICAgIDIKKyAqICAgICBCSyAgICAgIDMKKyAqCisgKgorICogUmVndWxhciAobm90IEEtTVBEVSkgZnJhbWVzIGFyZSBwdXQgaW50byBoYXJkd2FyZSBxdWV1ZXMgY29ycmVzcG9uZGluZworICogdG8gdGhlIEZJRk9zLCBzZWUgY29tbWVudHMgaW4gaXdsLXBycGguaC4gQWdncmVnYXRlZCBmcmFtZXMgZ2V0IHRoZWlyCisgKiBvd24gcXVldWUgcGVyIGFnZ3JlZ2F0aW9uIHNlc3Npb24gKFJBL1RJRCBjb21iaW5hdGlvbiksIHN1Y2ggcXVldWVzIGFyZQorICogc2V0IHVwIHRvIG1hcCBpbnRvIEZJRk9zIHRvbywgZm9yIHdoaWNoIHdlIG5lZWQgYW4gQUMtPkZJRk8gbWFwcGluZy4gSW4KKyAqIG9yZGVyIHRvIG1hcCBmcmFtZXMgdG8gdGhlIHJpZ2h0IHF1ZXVlLCB3ZSBhbHNvIG5lZWQgYW4gQUMtPmh3IHF1ZXVlCisgKiBtYXBwaW5nLiBUaGlzIGlzIGltcGxlbWVudGVkIGhlcmUuCisgKgorICogRHVlIHRvIHRoZSB3YXkgaHcgcXVldWVzIGFyZSBzZXQgdXAgKGJ5IHRoZSBodyBzcGVjaWZpYyBtb2R1bGVzIGxpa2UKKyAqIDQ5NjUuYyksIHRoZSBBQy0+aHcgcXVldWUgbWFwcGluZyBpcyB0aGUgaWRlbnRpdHkKKyAqIG1hcHBpbmcuCisgKi8KKworc3RhdGljIGNvbnN0IHU4IHRpZF90b19hY1tdID0geworCUlFRUU4MDIxMV9BQ19CRSwKKwlJRUVFODAyMTFfQUNfQkssCisJSUVFRTgwMjExX0FDX0JLLAorCUlFRUU4MDIxMV9BQ19CRSwKKwlJRUVFODAyMTFfQUNfVkksCisJSUVFRTgwMjExX0FDX1ZJLAorCUlFRUU4MDIxMV9BQ19WTywKKwlJRUVFODAyMTFfQUNfVk8KK307CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbDQ5NjVfZ2V0X2FjX2Zyb21fdGlkKHUxNiB0aWQpCit7CisJaWYgKGxpa2VseSh0aWQgPCBBUlJBWV9TSVpFKHRpZF90b19hYykpKQorCQlyZXR1cm4gdGlkX3RvX2FjW3RpZF07CisKKwkvKiBubyBzdXBwb3J0IGZvciBUSURzIDgtMTUgeWV0ICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbDQ5NjVfZ2V0X2ZpZm9fZnJvbV90aWQoc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LCB1MTYgdGlkKQoreworCWlmIChsaWtlbHkodGlkIDwgQVJSQVlfU0laRSh0aWRfdG9fYWMpKSkKKwkJcmV0dXJuIGN0eC0+YWNfdG9fZmlmb1t0aWRfdG9fYWNbdGlkXV07CisKKwkvKiBubyBzdXBwb3J0IGZvciBUSURzIDgtMTUgeWV0ICovCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBoYW5kbGUgYnVpbGQgQ19UWCBjb21tYW5kIG5vdGlmaWNhdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV90eF9jbWRfYnVpbGRfYmFzaWMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICBzdHJ1Y3QgaWxfdHhfY21kICp0eF9jbWQsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwgdTggc3RkX2lkKQoreworCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKKwlfX2xlMzIgdHhfZmxhZ3MgPSB0eF9jbWQtPnR4X2ZsYWdzOworCisJdHhfY21kLT5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKKwlpZiAoIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkgeworCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX0FDS19NU0s7CisJCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpCisJCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOworCQlpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoZmMpICYmCisJCSAgICAhKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICYgMHhmKSkKKwkJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfVFNGX01TSzsKKwl9IGVsc2UgeworCQl0eF9mbGFncyAmPSAoflRYX0NNRF9GTEdfQUNLX01TSyk7CisJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJfQorCisJaWYgKGllZWU4MDIxMV9pc19iYWNrX3JlcShmYykpCisJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfQUNLX01TSyB8IFRYX0NNRF9GTEdfSU1NX0JBX1JTUF9NQVNLOworCisJdHhfY21kLT5zdGFfaWQgPSBzdGRfaWQ7CisJaWYgKGllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGZjKSkKKwkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19NT1JFX0ZSQUdfTVNLOworCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKKwkJdTggKnFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7CisJCXR4X2NtZC0+dGlkX3RzcGVjID0gcWNbMF0gJiAweGY7CisJCXR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX1NFUV9DVExfTVNLOworCX0gZWxzZSB7CisJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJfQorCisJaWxfdHhfY21kX3Byb3RlY3Rpb24oaWwsIGluZm8sIGZjLCAmdHhfZmxhZ3MpOworCisJdHhfZmxhZ3MgJj0gfihUWF9DTURfRkxHX0FOVF9TRUxfTVNLKTsKKwlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKSB7CisJCWlmIChpZWVlODAyMTFfaXNfYXNzb2NfcmVxKGZjKSB8fCBpZWVlODAyMTFfaXNfcmVhc3NvY19yZXEoZmMpKQorCQkJdHhfY21kLT50aW1lb3V0LnBtX2ZyYW1lX3RpbWVvdXQgPSBjcHVfdG9fbGUxNigzKTsKKwkJZWxzZQorCQkJdHhfY21kLT50aW1lb3V0LnBtX2ZyYW1lX3RpbWVvdXQgPSBjcHVfdG9fbGUxNigyKTsKKwl9IGVsc2UgeworCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IDA7CisJfQorCisJdHhfY21kLT5kcml2ZXJfdHhvcCA9IDA7CisJdHhfY21kLT50eF9mbGFncyA9IHR4X2ZsYWdzOworCXR4X2NtZC0+bmV4dF9mcmFtZV9sZW4gPSAwOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3R4X2NtZF9idWlsZF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X2NtZCAqdHhfY21kLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywgX19sZTE2IGZjKQoreworCWNvbnN0IHU4IHJ0c19yZXRyeV9saW1pdCA9IDYwOworCXUzMiByYXRlX2ZsYWdzOworCWludCByYXRlX2lkeDsKKwl1OCBkYXRhX3JldHJ5X2xpbWl0OworCXU4IHJhdGVfcGxjcDsKKworCS8qIFNldCByZXRyeSBsaW1pdCBvbiBEQVRBIHBhY2tldHMgYW5kIFByb2JlIFJlc3BvbnNlcyAqLworCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpCisJCWRhdGFfcmV0cnlfbGltaXQgPSAzOworCWVsc2UKKwkJZGF0YV9yZXRyeV9saW1pdCA9IElMNDk2NV9ERUZBVUxUX1RYX1JFVFJZOworCXR4X2NtZC0+ZGF0YV9yZXRyeV9saW1pdCA9IGRhdGFfcmV0cnlfbGltaXQ7CisJLyogU2V0IHJldHJ5IGxpbWl0IG9uIFJUUyBwYWNrZXRzICovCisJdHhfY21kLT5ydHNfcmV0cnlfbGltaXQgPSBtaW4oZGF0YV9yZXRyeV9saW1pdCwgcnRzX3JldHJ5X2xpbWl0KTsKKworCS8qIERBVEEgcGFja2V0cyB3aWxsIHVzZSB0aGUgdUNvZGUgc3RhdGlvbiB0YWJsZSBmb3IgcmF0ZS9hbnRlbm5hCisJICogc2VsZWN0aW9uICovCisJaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgeworCQl0eF9jbWQtPmluaXRpYWxfcmF0ZV9pZHggPSAwOworCQl0eF9jbWQtPnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLOworCQlyZXR1cm47CisJfQorCisJLyoqCisJICogSWYgdGhlIGN1cnJlbnQgVFggcmF0ZSBzdG9yZWQgaW4gbWFjODAyMTEgaGFzIHRoZSBNQ1MgYml0IHNldCwgaXQncworCSAqIG5vdCByZWFsbHkgYSBUWCByYXRlLiAgVGh1cywgd2UgdXNlIHRoZSBsb3dlc3Qgc3VwcG9ydGVkIHJhdGUgZm9yCisJICogdGhpcyBiYW5kLiAgQWxzbyB1c2UgdGhlIGxvd2VzdCBzdXBwb3J0ZWQgcmF0ZSBpZiB0aGUgc3RvcmVkIHJhdGUKKwkgKiBpZHggaXMgaW52YWxpZC4KKwkgKi8KKwlyYXRlX2lkeCA9IGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4OworCWlmICgoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHx8IHJhdGVfaWR4IDwgMAorCSAgICB8fCByYXRlX2lkeCA+IFJBVEVfQ09VTlRfTEVHQUNZKQorCQlyYXRlX2lkeCA9CisJCSAgICByYXRlX2xvd2VzdF9pbmRleCgmaWwtPmJhbmRzW2luZm8tPmJhbmRdLAorCQkJCSAgICAgIGluZm8tPmNvbnRyb2wuc3RhKTsKKwkvKiBGb3IgNSBHSFogYmFuZCwgcmVtYXAgbWFjODAyMTEgcmF0ZSBpbmRpY2VzIGludG8gZHJpdmVyIGluZGljZXMgKi8KKwlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlyYXRlX2lkeCArPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJLyogR2V0IFBMQ1AgcmF0ZSBmb3IgdHhfY21kLT5yYXRlX25fZmxhZ3MgKi8KKwlyYXRlX3BsY3AgPSBpbF9yYXRlc1tyYXRlX2lkeF0ucGxjcDsKKwkvKiBaZXJvIG91dCBmbGFncyBmb3IgdGhpcyBwYWNrZXQgKi8KKwlyYXRlX2ZsYWdzID0gMDsKKworCS8qIFNldCBDQ0sgZmxhZyBhcyBuZWVkZWQgKi8KKwlpZiAocmF0ZV9pZHggPj0gSUxfRklSU1RfQ0NLX1JBVEUgJiYgcmF0ZV9pZHggPD0gSUxfTEFTVF9DQ0tfUkFURSkKKwkJcmF0ZV9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOworCisJLyogU2V0IHVwIGFudGVubmFzICovCisJaWw0OTY1X3RvZ2dsZV90eF9hbnQoaWwsICZpbC0+bWdtdF90eF9hbnQsIGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50KTsKKwlyYXRlX2ZsYWdzIHw9IEJJVChpbC0+bWdtdF90eF9hbnQpIDw8IFJBVEVfTUNTX0FOVF9QT1M7CisKKwkvKiBTZXQgdGhlIHJhdGUgaW4gdGhlIFRYIGNtZCAqLworCXR4X2NtZC0+cmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMzIocmF0ZV9wbGNwIHwgcmF0ZV9mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfdHhfY21kX2J1aWxkX2h3Y3J5cHRvKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJICAgICBzdHJ1Y3QgaWxfdHhfY21kICp0eF9jbWQsIHN0cnVjdCBza19idWZmICpza2JfZnJhZywKKwkJCSAgICAgaW50IHN0YV9pZCkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mID0gaW5mby0+Y29udHJvbC5od19rZXk7CisKKwlzd2l0Y2ggKGtleWNvbmYtPmNpcGhlcikgeworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKKwkJdHhfY21kLT5zZWNfY3RsID0gVFhfQ01EX1NFQ19DQ007CisJCW1lbWNweSh0eF9jbWQtPmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKQorCQkJdHhfY21kLT50eF9mbGFncyB8PSBUWF9DTURfRkxHX0FHR19DQ01QX01TSzsKKwkJRF9UWCgidHhfY21kIHdpdGggQUVTIGh3Y3J5cHRvXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCXR4X2NtZC0+c2VjX2N0bCA9IFRYX0NNRF9TRUNfVEtJUDsKKwkJaWVlZTgwMjExX2dldF90a2lwX3AyayhrZXljb25mLCBza2JfZnJhZywgdHhfY21kLT5rZXkpOworCQlEX1RYKCJ0eF9jbWQgd2l0aCB0a2lwIGh3Y3J5cHRvXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKKwkJdHhfY21kLT5zZWNfY3RsIHw9IFRYX0NNRF9TRUNfS0VZMTI4OworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgorCQl0eF9jbWQtPnNlY19jdGwgfD0KKwkJICAgIChUWF9DTURfU0VDX1dFUCB8IChrZXljb25mLT5rZXlpZHggJiBUWF9DTURfU0VDX01TSykgPDwKKwkJICAgICBUWF9DTURfU0VDX1NISUZUKTsKKworCQltZW1jcHkoJnR4X2NtZC0+a2V5WzNdLCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7CisKKwkJRF9UWCgiQ29uZmlndXJpbmcgcGFja2V0IGZvciBXRVAgZW5jcnlwdGlvbiAiICJ3aXRoIGtleSAlZFxuIiwKKwkJICAgICBrZXljb25mLT5rZXlpZHgpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUlMX0VSUigiVW5rbm93biBlbmNvZGUgY2lwaGVyICV4XG4iLCBrZXljb25mLT5jaXBoZXIpOworCQlicmVhazsKKwl9Cit9CisKKy8qCisgKiBzdGFydCBDX1RYIGNvbW1hbmQgcHJvY2VzcworICovCitpbnQKK2lsNDk2NV90eF9za2Ioc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEgPSBpbmZvLT5jb250cm9sLnN0YTsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9IE5VTEw7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHE7CisJc3RydWN0IGlsX3F1ZXVlICpxOworCXN0cnVjdCBpbF9kZXZpY2VfY21kICpvdXRfY21kOworCXN0cnVjdCBpbF9jbWRfbWV0YSAqb3V0X21ldGE7CisJc3RydWN0IGlsX3R4X2NtZCAqdHhfY21kOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCWludCB0eHFfaWQ7CisJZG1hX2FkZHJfdCBwaHlzX2FkZHI7CisJZG1hX2FkZHJfdCB0eGNtZF9waHlzOworCWRtYV9hZGRyX3Qgc2NyYXRjaF9waHlzOworCXUxNiBsZW4sIGZpcnN0bGVuLCBzZWNvbmRsZW47CisJdTE2IHNlcV9udW1iZXIgPSAwOworCV9fbGUxNiBmYzsKKwl1OCBoZHJfbGVuOworCXU4IHN0YV9pZDsKKwl1OCB3YWl0X3dyaXRlX3B0ciA9IDA7CisJdTggdGlkID0gMDsKKwl1OCAqcWMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBpc19hZ2cgPSBmYWxzZTsKKworCWlmIChpbmZvLT5jb250cm9sLnZpZikKKwkJY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYoaW5mby0+Y29udHJvbC52aWYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWYgKGlsX2lzX3Jma2lsbChpbCkpIHsKKwkJRF9EUk9QKCJEcm9wcGluZyAtIFJGIEtJTExcbiIpOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCWZjID0gaGRyLT5mcmFtZV9jb250cm9sOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJaWYgKGllZWU4MDIxMV9pc19hdXRoKGZjKSkKKwkJRF9UWCgiU2VuZGluZyBBVVRIIGZyYW1lXG4iKTsKKwllbHNlIGlmIChpZWVlODAyMTFfaXNfYXNzb2NfcmVxKGZjKSkKKwkJRF9UWCgiU2VuZGluZyBBU1NPQyBmcmFtZVxuIik7CisJZWxzZSBpZiAoaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKKwkJRF9UWCgiU2VuZGluZyBSRUFTU09DIGZyYW1lXG4iKTsKKyNlbmRpZgorCisJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmMpOworCisJLyogRm9yIG1hbmFnZW1lbnQgZnJhbWVzIHVzZSBicm9hZGNhc3QgaWQgdG8gZG8gbm90IGJyZWFrIGFnZ3JlZ2F0aW9uICovCisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YShmYykpCisJCXN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOworCWVsc2UgeworCQkvKiBGaW5kIGlkeCBpbnRvIHN0YXRpb24gdGFibGUgZm9yIGRlc3RpbmF0aW9uIHN0YXRpb24gKi8KKwkJc3RhX2lkID0gaWxfc3RhX2lkX29yX2Jyb2FkY2FzdChpbCwgY3R4LCBpbmZvLT5jb250cm9sLnN0YSk7CisKKwkJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pIHsKKwkJCURfRFJPUCgiRHJvcHBpbmcgLSBJTlZBTElEIFNUQVRJT046ICVwTVxuIiwgaGRyLT5hZGRyMSk7CisJCQlnb3RvIGRyb3BfdW5sb2NrOworCQl9CisJfQorCisJRF9UWCgic3RhdGlvbiBJZCAlZFxuIiwgc3RhX2lkKTsKKworCWlmIChzdGEpCisJCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCisJaWYgKHN0YV9wcml2ICYmIHN0YV9wcml2LT5hc2xlZXAgJiYKKwkgICAgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9QT0xMX1JFU1BPTlNFKSkgeworCQkvKgorCQkgKiBUaGlzIHNlbmRzIGFuIGFzeW5jaHJvbm91cyBjb21tYW5kIHRvIHRoZSBkZXZpY2UsCisJCSAqIGJ1dCB3ZSBjYW4gcmVseSBvbiBpdCBiZWluZyBwcm9jZXNzZWQgYmVmb3JlIHRoZQorCQkgKiBuZXh0IGZyYW1lIGlzIHByb2Nlc3NlZCAtLSBhbmQgdGhlIG5leHQgZnJhbWUgdG8KKwkJICogdGhpcyBzdGF0aW9uIGlzIHRoZSBvbmUgdGhhdCB3aWxsIGNvbnN1bWUgdGhpcworCQkgKiBjb3VudGVyLgorCQkgKiBGb3Igbm93IHNldCB0aGUgY291bnRlciB0byBqdXN0IDEgc2luY2Ugd2UgZG8gbm90CisJCSAqIHN1cHBvcnQgdUFQU0QgeWV0LgorCQkgKi8KKwkJaWw0OTY1X3N0YV9tb2RpZnlfc2xlZXBfdHhfY291bnQoaWwsIHN0YV9pZCwgMSk7CisJfQorCisJLyoKKwkgKiBTZW5kIHRoaXMgZnJhbWUgYWZ0ZXIgRFRJTSAtLSB0aGVyZSdzIGEgc3BlY2lhbCBxdWV1ZQorCSAqIHJlc2VydmVkIGZvciB0aGlzIGZvciBjb250ZXh0cyB0aGF0IHN1cHBvcnQgQVAgbW9kZS4KKwkgKi8KKwlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX1NFTkRfQUZURVJfRFRJTSkgeworCQl0eHFfaWQgPSBjdHgtPm1jYXN0X3F1ZXVlOworCQkvKgorCQkgKiBUaGUgbWljcm9jb2RlIHdpbGwgY2xlYXIgdGhlIG1vcmUgZGF0YQorCQkgKiBiaXQgaW4gdGhlIGxhc3QgZnJhbWUgaXQgdHJhbnNtaXRzLgorCQkgKi8KKwkJaGRyLT5mcmFtZV9jb250cm9sIHw9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX01PUkVEQVRBKTsKKwl9IGVsc2UKKwkJdHhxX2lkID0gY3R4LT5hY190b19xdWV1ZVtza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKV07CisKKwkvKiBpcnFzIGFscmVhZHkgZGlzYWJsZWQvc2F2ZWQgYWJvdmUgd2hlbiBsb2NraW5nIGlsLT5sb2NrICovCisJc3Bpbl9sb2NrKCZpbC0+c3RhX2xvY2spOworCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKKwkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKKwkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKKwkJaWYgKFdBUk5fT05fT05DRSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpIHsKKwkJCXNwaW5fdW5sb2NrKCZpbC0+c3RhX2xvY2spOworCQkJZ290byBkcm9wX3VubG9jazsKKwkJfQorCQlzZXFfbnVtYmVyID0gaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uc2VxX251bWJlcjsKKwkJc2VxX251bWJlciAmPSBJRUVFODAyMTFfU0NUTF9TRVE7CisJCWhkci0+c2VxX2N0cmwgPQorCQkgICAgaGRyLT5zZXFfY3RybCAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9TQ1RMX0ZSQUcpOworCQloZHItPnNlcV9jdHJsIHw9IGNwdV90b19sZTE2KHNlcV9udW1iZXIpOworCQlzZXFfbnVtYmVyICs9IDB4MTA7CisJCS8qIGFnZ3JlZ2F0aW9uIGlzIG9uIGZvciB0aGlzIDxzdGEsdGlkPiAqLworCQlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVICYmCisJCSAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cuc3RhdGUgPT0gSUxfQUdHX09OKSB7CisJCQl0eHFfaWQgPSBpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2cudHhxX2lkOworCQkJaXNfYWdnID0gdHJ1ZTsKKwkJfQorCX0KKworCXR4cSA9ICZpbC0+dHhxW3R4cV9pZF07CisJcSA9ICZ0eHEtPnE7CisKKwlpZiAodW5saWtlbHkoaWxfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspKSB7CisJCXNwaW5fdW5sb2NrKCZpbC0+c3RhX2xvY2spOworCQlnb3RvIGRyb3BfdW5sb2NrOworCX0KKworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUrKzsKKwkJaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCisJCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5zZXFfbnVtYmVyID0gc2VxX251bWJlcjsKKwl9CisKKwlzcGluX3VubG9jaygmaWwtPnN0YV9sb2NrKTsKKworCS8qIFNldCB1cCBkcml2ZXIgZGF0YSBmb3IgdGhpcyBURkQgKi8KKwltZW1zZXQoJih0eHEtPnR4YltxLT53cml0ZV9wdHJdKSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF90eF9pbmZvKSk7CisJdHhxLT50eGJbcS0+d3JpdGVfcHRyXS5za2IgPSBza2I7CisJdHhxLT50eGJbcS0+d3JpdGVfcHRyXS5jdHggPSBjdHg7CisKKwkvKiBTZXQgdXAgZmlyc3QgZW1wdHkgZW50cnkgaW4gcXVldWUncyBhcnJheSBvZiBUeC9jbWQgYnVmZmVycyAqLworCW91dF9jbWQgPSB0eHEtPmNtZFtxLT53cml0ZV9wdHJdOworCW91dF9tZXRhID0gJnR4cS0+bWV0YVtxLT53cml0ZV9wdHJdOworCXR4X2NtZCA9ICZvdXRfY21kLT5jbWQudHg7CisJbWVtc2V0KCZvdXRfY21kLT5oZHIsIDAsIHNpemVvZihvdXRfY21kLT5oZHIpKTsKKwltZW1zZXQodHhfY21kLCAwLCBzaXplb2Yoc3RydWN0IGlsX3R4X2NtZCkpOworCisJLyoKKwkgKiBTZXQgdXAgdGhlIFR4LWNvbW1hbmQgKG5vdCBNQUMhKSBoZWFkZXIuCisJICogU3RvcmUgdGhlIGNob3NlbiBUeCBxdWV1ZSBhbmQgVEZEIGlkeCB3aXRoaW4gdGhlIHNlcXVlbmNlIGZpZWxkOworCSAqIGFmdGVyIFR4LCB1Q29kZSdzIFR4IHJlc3BvbnNlIHdpbGwgcmV0dXJuIHRoaXMgdmFsdWUgc28gZHJpdmVyIGNhbgorCSAqIGxvY2F0ZSB0aGUgZnJhbWUgd2l0aGluIHRoZSB0eCBxdWV1ZSBhbmQgZG8gcG9zdC10eCBwcm9jZXNzaW5nLgorCSAqLworCW91dF9jbWQtPmhkci5jbWQgPSBDX1RYOworCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9CisJICAgIGNwdV90b19sZTE2KCh1MTYpCisJCQkoUVVFVUVfVE9fU0VRKHR4cV9pZCkgfCBJRFhfVE9fU0VRKHEtPndyaXRlX3B0cikpKTsKKworCS8qIENvcHkgTUFDIGhlYWRlciBmcm9tIHNrYiBpbnRvIGNvbW1hbmQgYnVmZmVyICovCisJbWVtY3B5KHR4X2NtZC0+aGRyLCBoZHIsIGhkcl9sZW4pOworCisJLyogVG90YWwgIyBieXRlcyB0byBiZSB0cmFuc21pdHRlZCAqLworCWxlbiA9ICh1MTYpIHNrYi0+bGVuOworCXR4X2NtZC0+bGVuID0gY3B1X3RvX2xlMTYobGVuKTsKKworCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSkKKwkJaWw0OTY1X3R4X2NtZF9idWlsZF9od2NyeXB0byhpbCwgaW5mbywgdHhfY21kLCBza2IsIHN0YV9pZCk7CisKKwkvKiBUT0RPIG5lZWQgdGhpcyBmb3IgYnVyc3QgbW9kZSBsYXRlciBvbiAqLworCWlsNDk2NV90eF9jbWRfYnVpbGRfYmFzaWMoaWwsIHNrYiwgdHhfY21kLCBpbmZvLCBoZHIsIHN0YV9pZCk7CisJaWxfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKGlsLCBsZW4sIGhkcik7CisKKwlpbDQ5NjVfdHhfY21kX2J1aWxkX3JhdGUoaWwsIHR4X2NtZCwgaW5mbywgZmMpOworCisJaWxfdXBkYXRlX3N0YXRzKGlsLCB0cnVlLCBmYywgbGVuKTsKKwkvKgorCSAqIFVzZSB0aGUgZmlyc3QgZW1wdHkgZW50cnkgaW4gdGhpcyBxdWV1ZSdzIGNvbW1hbmQgYnVmZmVyIGFycmF5CisJICogdG8gY29udGFpbiB0aGUgVHggY29tbWFuZCBhbmQgTUFDIGhlYWRlciBjb25jYXRlbmF0ZWQgdG9nZXRoZXIKKwkgKiAocGF5bG9hZCBkYXRhIHdpbGwgYmUgaW4gYW5vdGhlciBidWZmZXIpLgorCSAqIFNpemUgb2YgdGhpcyB2YXJpZXMsIGR1ZSB0byB2YXJ5aW5nIE1BQyBoZWFkZXIgbGVuZ3RoLgorCSAqIElmIGVuZCBpcyBub3QgZHdvcmQgYWxpZ25lZCwgd2UnbGwgaGF2ZSAyIGV4dHJhIGJ5dGVzIGF0IHRoZSBlbmQKKwkgKiBvZiB0aGUgTUFDIGhlYWRlciAoZGV2aWNlIHJlYWRzIG9uIGR3b3JkIGJvdW5kYXJpZXMpLgorCSAqIFdlJ2xsIHRlbGwgZGV2aWNlIGFib3V0IHRoaXMgcGFkZGluZyBsYXRlci4KKwkgKi8KKwlsZW4gPSBzaXplb2Yoc3RydWN0IGlsX3R4X2NtZCkgKyBzaXplb2Yoc3RydWN0IGlsX2NtZF9oZWFkZXIpICsgaGRyX2xlbjsKKwlmaXJzdGxlbiA9IChsZW4gKyAzKSAmIH4zOworCisJLyogVGVsbCBOSUMgYWJvdXQgYW55IDItYnl0ZSBwYWRkaW5nIGFmdGVyIE1BQyBoZWFkZXIgKi8KKwlpZiAoZmlyc3RsZW4gIT0gbGVuKQorCQl0eF9jbWQtPnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTUhfUEFEX01TSzsKKworCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhpcyBUeCBjb21tYW5kJ3MgaGVhZGVyIChub3QgTUFDIGhlYWRlciEpLAorCSAqIHdpdGhpbiBjb21tYW5kIGJ1ZmZlciBhcnJheS4gKi8KKwl0eGNtZF9waHlzID0KKwkgICAgcGNpX21hcF9zaW5nbGUoaWwtPnBjaV9kZXYsICZvdXRfY21kLT5oZHIsIGZpcnN0bGVuLAorCQkJICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlkbWFfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHR4Y21kX3BoeXMpOworCWRtYV91bm1hcF9sZW5fc2V0KG91dF9tZXRhLCBsZW4sIGZpcnN0bGVuKTsKKwkvKiBBZGQgYnVmZmVyIGNvbnRhaW5pbmcgVHggY29tbWFuZCBhbmQgTUFDKCEpIGhlYWRlciB0byBURkQncworCSAqIGZpcnN0IGVudHJ5ICovCisJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChpbCwgdHhxLCB0eGNtZF9waHlzLCBmaXJzdGxlbiwKKwkJCQkJCSAxLCAwKTsKKworCWlmICghaWVlZTgwMjExX2hhc19tb3JlZnJhZ3MoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKKwl9IGVsc2UgeworCQl3YWl0X3dyaXRlX3B0ciA9IDE7CisJCXR4cS0+bmVlZF91cGRhdGUgPSAwOworCX0KKworCS8qIFNldCB1cCBURkQncyAybmQgZW50cnkgdG8gcG9pbnQgZGlyZWN0bHkgdG8gcmVtYWluZGVyIG9mIHNrYiwKKwkgKiBpZiBhbnkgKDgwMi4xMSBudWxsIGZyYW1lcyBoYXZlIG5vIHBheWxvYWQpLiAqLworCXNlY29uZGxlbiA9IHNrYi0+bGVuIC0gaGRyX2xlbjsKKwlpZiAoc2Vjb25kbGVuID4gMCkgeworCQlwaHlzX2FkZHIgPQorCQkgICAgcGNpX21hcF9zaW5nbGUoaWwtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIGhkcl9sZW4sIHNlY29uZGxlbiwKKwkJCQkgICBQQ0lfRE1BX1RPREVWSUNFKTsKKwkJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChpbCwgdHhxLCBwaHlzX2FkZHIsCisJCQkJCQkJIHNlY29uZGxlbiwgMCwgMCk7CisJfQorCisJc2NyYXRjaF9waHlzID0KKwkgICAgdHhjbWRfcGh5cyArIHNpemVvZihzdHJ1Y3QgaWxfY21kX2hlYWRlcikgKworCSAgICBvZmZzZXRvZihzdHJ1Y3QgaWxfdHhfY21kLCBzY3JhdGNoKTsKKworCS8qIHRha2UgYmFjayBvd25lcnNoaXAgb2YgRE1BIGJ1ZmZlciB0byBlbmFibGUgdXBkYXRlICovCisJcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfY3B1KGlsLT5wY2lfZGV2LCB0eGNtZF9waHlzLCBmaXJzdGxlbiwKKwkJCQkgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwl0eF9jbWQtPmRyYW1fbHNiX3B0ciA9IGNwdV90b19sZTMyKHNjcmF0Y2hfcGh5cyk7CisJdHhfY21kLT5kcmFtX21zYl9wdHIgPSBpbF9nZXRfZG1hX2hpX2FkZHIoc2NyYXRjaF9waHlzKTsKKworCURfVFgoInNlcXVlbmNlIG5yID0gMFgleFxuIiwgbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSk7CisJRF9UWCgidHhfZmxhZ3MgPSAwWCV4XG4iLCBsZTMyX3RvX2NwdSh0eF9jbWQtPnR4X2ZsYWdzKSk7CisJaWxfcHJpbnRfaGV4X2R1bXAoaWwsIElMX0RMX1RYLCAodTggKikgdHhfY21kLCBzaXplb2YoKnR4X2NtZCkpOworCWlsX3ByaW50X2hleF9kdW1wKGlsLCBJTF9ETF9UWCwgKHU4ICopIHR4X2NtZC0+aGRyLCBoZHJfbGVuKTsKKworCS8qIFNldCB1cCBlbnRyeSBmb3IgdGhpcyBURkQgaW4gVHggYnl0ZS1jb3VudCBhcnJheSAqLworCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpCisJCWlsLT5jZmctPm9wcy0+bGliLT50eHFfdXBkYXRlX2J5dGVfY250X3RibChpbCwgdHhxLAorCQkJCQkJCSAgIGxlMTZfdG9fY3B1KHR4X2NtZC0+CisJCQkJCQkJCSAgICAgICBsZW4pKTsKKworCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShpbC0+cGNpX2RldiwgdHhjbWRfcGh5cywgZmlyc3RsZW4sCisJCQkJICAgICAgIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwkvKiBUZWxsIGRldmljZSB0aGUgd3JpdGUgaWR4ICpqdXN0IHBhc3QqIHRoaXMgbGF0ZXN0IGZpbGxlZCBURkQgKi8KKwlxLT53cml0ZV9wdHIgPSBpbF9xdWV1ZV9pbmNfd3JhcChxLT53cml0ZV9wdHIsIHEtPm5fYmQpOworCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCB0eHEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIEF0IHRoaXMgcG9pbnQgdGhlIGZyYW1lIGlzICJ0cmFuc21pdHRlZCIgc3VjY2Vzc2Z1bGx5CisJICogYW5kIHdlIHdpbGwgZ2V0IGEgVFggc3RhdHVzIG5vdGlmaWNhdGlvbiBldmVudHVhbGx5LAorCSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHJldC4gInJldCIgb25seSBpbmRpY2F0ZXMKKwkgKiB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgdXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyLgorCSAqLworCisJLyoKKwkgKiBBdm9pZCBhdG9taWMgb3BzIGlmIGl0IGlzbid0IGFuIGFzc29jaWF0ZWQgY2xpZW50LgorCSAqIEFsc28sIGlmIHRoaXMgaXMgYSBwYWNrZXQgZm9yIGFnZ3JlZ2F0aW9uLCBkb24ndAorCSAqIGluY3JlYXNlIHRoZSBjb3VudGVyIGJlY2F1c2UgdGhlIHVjb2RlIHdpbGwgc3RvcAorCSAqIGFnZ3JlZ2F0aW9uIHF1ZXVlcyB3aGVuIHRoZWlyIHJlc3BlY3RpdmUgc3RhdGlvbgorCSAqIGdvZXMgdG8gc2xlZXAuCisJICovCisJaWYgKHN0YV9wcml2ICYmIHN0YV9wcml2LT5jbGllbnQgJiYgIWlzX2FnZykKKwkJYXRvbWljX2luYygmc3RhX3ByaXYtPnBlbmRpbmdfZnJhbWVzKTsKKworCWlmIChpbF9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyayAmJiBpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCkgeworCQlpZiAod2FpdF93cml0ZV9wdHIpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDE7CisJCQlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgdHhxKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJCX0gZWxzZSB7CisJCQlpbF9zdG9wX3F1ZXVlKGlsLCB0eHEpOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Ryb3BfdW5sb2NrOgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWw0OTY1X2FsbG9jX2RtYV9wdHIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZG1hX3B0ciAqcHRyLCBzaXplX3Qgc2l6ZSkKK3sKKwlwdHItPmFkZHIgPQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoJmlsLT5wY2lfZGV2LT5kZXYsIHNpemUsICZwdHItPmRtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwdHItPmFkZHIpCisJCXJldHVybiAtRU5PTUVNOworCXB0ci0+c2l6ZSA9IHNpemU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWw0OTY1X2ZyZWVfZG1hX3B0cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9kbWFfcHRyICpwdHIpCit7CisJaWYgKHVubGlrZWx5KCFwdHItPmFkZHIpKQorCQlyZXR1cm47CisKKwlkbWFfZnJlZV9jb2hlcmVudCgmaWwtPnBjaV9kZXYtPmRldiwgcHRyLT5zaXplLCBwdHItPmFkZHIsIHB0ci0+ZG1hKTsKKwltZW1zZXQocHRyLCAwLCBzaXplb2YoKnB0cikpOworfQorCisvKioKKyAqIGlsNDk2NV9od190eHFfY3R4X2ZyZWUgLSBGcmVlIFRYUSBDb250ZXh0CisgKgorICogRGVzdHJveSBhbGwgVFggRE1BIHF1ZXVlcyBhbmQgc3RydWN0dXJlcworICovCit2b2lkCitpbDQ5NjVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgdHhxX2lkOworCisJLyogVHggcXVldWVzICovCisJaWYgKGlsLT50eHEpIHsKKwkJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKKwkJCWlmICh0eHFfaWQgPT0gaWwtPmNtZF9xdWV1ZSkKKwkJCQlpbF9jbWRfcXVldWVfZnJlZShpbCk7CisJCQllbHNlCisJCQkJaWxfdHhfcXVldWVfZnJlZShpbCwgdHhxX2lkKTsKKwl9CisJaWw0OTY1X2ZyZWVfZG1hX3B0cihpbCwgJmlsLT5rdyk7CisKKwlpbDQ5NjVfZnJlZV9kbWFfcHRyKGlsLCAmaWwtPnNjZF9iY190YmxzKTsKKworCS8qIGZyZWUgdHggcXVldWUgc3RydWN0dXJlICovCisJaWxfdHhxX21lbShpbCk7Cit9CisKKy8qKgorICogaWw0OTY1X3R4cV9jdHhfYWxsb2MgLSBhbGxvY2F0ZSBUWCBxdWV1ZSBjb250ZXh0CisgKiBBbGxvY2F0ZSBhbGwgVHggRE1BIHN0cnVjdHVyZXMgYW5kIGluaXRpYWxpemUgdGhlbQorICoKKyAqIEBwYXJhbSBpbAorICogQHJldHVybiBlcnJvciBjb2RlCisgKi8KK2ludAoraWw0OTY1X3R4cV9jdHhfYWxsb2Moc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQ7CisJaW50IHR4cV9pZCwgc2xvdHNfbnVtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBGcmVlIGFsbCB0eC9jbWQgcXVldWVzIGFuZCBrZWVwLXdhcm0gYnVmZmVyICovCisJaWw0OTY1X2h3X3R4cV9jdHhfZnJlZShpbCk7CisKKwlyZXQgPQorCSAgICBpbDQ5NjVfYWxsb2NfZG1hX3B0cihpbCwgJmlsLT5zY2RfYmNfdGJscywKKwkJCQkgaWwtPmh3X3BhcmFtcy5zY2RfYmNfdGJsc19zaXplKTsKKwlpZiAocmV0KSB7CisJCUlMX0VSUigiU2NoZWR1bGVyIEJDIFRhYmxlIGFsbG9jYXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJvcl9iY190YmxzOworCX0KKwkvKiBBbGxvYyBrZWVwLXdhcm0gYnVmZmVyICovCisJcmV0ID0gaWw0OTY1X2FsbG9jX2RtYV9wdHIoaWwsICZpbC0+a3csIElMX0tXX1NJWkUpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJLZWVwIFdhcm0gYWxsb2NhdGlvbiBmYWlsZWRcbiIpOworCQlnb3RvIGVycm9yX2t3OworCX0KKworCS8qIGFsbG9jYXRlIHR4IHF1ZXVlIHN0cnVjdHVyZSAqLworCXJldCA9IGlsX2FsbG9jX3R4cV9tZW0oaWwpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIFR1cm4gb2ZmIGFsbCBUeCBETUEgZmlmb3MgKi8KKwlpbDQ5NjVfdHhxX3NldF9zY2hlZChpbCwgMCk7CisKKwkvKiBUZWxsIE5JQyB3aGVyZSB0byBmaW5kIHRoZSAia2VlcCB3YXJtIiBidWZmZXIgKi8KKwlpbF93cihpbCwgRkg0OV9LV19NRU1fQUREUl9SRUcsIGlsLT5rdy5kbWEgPj4gNCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogQWxsb2MgYW5kIGluaXQgYWxsIFR4IHF1ZXVlcywgaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlICgjNC8jOSkgKi8KKwlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKSB7CisJCXNsb3RzX251bSA9CisJCSAgICAodHhxX2lkID09CisJCSAgICAgaWwtPmNtZF9xdWV1ZSkgPyBURkRfQ01EX1NMT1RTIDogVEZEX1RYX0NNRF9TTE9UUzsKKwkJcmV0ID0gaWxfdHhfcXVldWVfaW5pdChpbCwgJmlsLT50eHFbdHhxX2lkXSwgc2xvdHNfbnVtLCB0eHFfaWQpOworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIlR4ICVkIHF1ZXVlIGluaXQgZmFpbGVkXG4iLCB0eHFfaWQpOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCXJldHVybiByZXQ7CisKK2Vycm9yOgorCWlsNDk2NV9od190eHFfY3R4X2ZyZWUoaWwpOworCWlsNDk2NV9mcmVlX2RtYV9wdHIoaWwsICZpbC0+a3cpOworZXJyb3Jfa3c6CisJaWw0OTY1X2ZyZWVfZG1hX3B0cihpbCwgJmlsLT5zY2RfYmNfdGJscyk7CitlcnJvcl9iY190YmxzOgorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2lsNDk2NV90eHFfY3R4X3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgdHhxX2lkLCBzbG90c19udW07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLworCWlsNDk2NV90eHFfc2V0X3NjaGVkKGlsLCAwKTsKKworCS8qIFRlbGwgTklDIHdoZXJlIHRvIGZpbmQgdGhlICJrZWVwIHdhcm0iIGJ1ZmZlciAqLworCWlsX3dyKGlsLCBGSDQ5X0tXX01FTV9BRERSX1JFRywgaWwtPmt3LmRtYSA+PiA0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBBbGxvYyBhbmQgaW5pdCBhbGwgVHggcXVldWVzLCBpbmNsdWRpbmcgdGhlIGNvbW1hbmQgcXVldWUgKCM0KSAqLworCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspIHsKKwkJc2xvdHNfbnVtID0KKwkJICAgIHR4cV9pZCA9PSBpbC0+Y21kX3F1ZXVlID8gVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7CisJCWlsX3R4X3F1ZXVlX3Jlc2V0KGlsLCAmaWwtPnR4cVt0eHFfaWRdLCBzbG90c19udW0sIHR4cV9pZCk7CisJfQorfQorCisvKioKKyAqIGlsNDk2NV90eHFfY3R4X3N0b3AgLSBTdG9wIGFsbCBUeCBETUEgY2hhbm5lbHMKKyAqLwordm9pZAoraWw0OTY1X3R4cV9jdHhfc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGNoLCB0eHFfaWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFR1cm4gb2ZmIGFsbCBUeCBETUEgZmlmb3MgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlsNDk2NV90eHFfc2V0X3NjaGVkKGlsLCAwKTsKKworCS8qIFN0b3AgZWFjaCBUeCBETUEgY2hhbm5lbCwgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGlkbGUgKi8KKwlmb3IgKGNoID0gMDsgY2ggPCBpbC0+aHdfcGFyYW1zLmRtYV9jaG5sX251bTsgY2grKykgeworCQlpbF93cihpbCwgRkg0OV9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhjaCksIDB4MCk7CisJCWlmIChpbF9wb2xsX2JpdAorCQkgICAgKGlsLCBGSDQ5X1RTU1JfVFhfU1RBVFVTX1JFRywKKwkJICAgICBGSDQ5X1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKGNoKSwgMTAwMCkpCisJCQlJTF9FUlIoIkZhaWxpbmcgb24gdGltZW91dCB3aGlsZSBzdG9wcGluZyIKKwkJCSAgICAgICAiIERNQSBjaGFubmVsICVkIFsweCUwOHhdIiwgY2gsCisJCQkgICAgICAgaWxfcmQoaWwsIEZINDlfVFNTUl9UWF9TVEFUVVNfUkVHKSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWlsLT50eHEpCisJCXJldHVybjsKKworCS8qIFVubWFwIERNQSBmcm9tIGhvc3Qgc3lzdGVtIGFuZCBmcmVlIHNrYidzICovCisJZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKKwkJaWYgKHR4cV9pZCA9PSBpbC0+Y21kX3F1ZXVlKQorCQkJaWxfY21kX3F1ZXVlX3VubWFwKGlsKTsKKwkJZWxzZQorCQkJaWxfdHhfcXVldWVfdW5tYXAoaWwsIHR4cV9pZCk7Cit9CisKKy8qCisgKiBGaW5kIGZpcnN0IGF2YWlsYWJsZSAobG93ZXN0IHVudXNlZCkgVHggUXVldWUsIG1hcmsgaXQgImFjdGl2ZSIuCisgKiBDYWxsZWQgb25seSB3aGVuIGZpbmRpbmcgcXVldWUgZm9yIGFnZ3JlZ2F0aW9uLgorICogU2hvdWxkIG5ldmVyIHJldHVybiBhbnl0aGluZyA8IDcsIGJlY2F1c2UgdGhleSBzaG91bGQgYWxyZWFkeQorICogYmUgaW4gdXNlIGFzIEVEQ0EgQUMgKDAtMyksIENvbW1hbmQgKDQpLCByZXNlcnZlZCAoNSwgNikKKyAqLworc3RhdGljIGludAoraWw0OTY1X3R4cV9jdHhfYWN0aXZhdGVfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHR4cV9pZDsKKworCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspCisJCWlmICghdGVzdF9hbmRfc2V0X2JpdCh0eHFfaWQsICZpbC0+dHhxX2N0eF9hY3RpdmVfbXNrKSkKKwkJCXJldHVybiB0eHFfaWQ7CisJcmV0dXJuIC0xOworfQorCisvKioKKyAqIGlsNDk2NV90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlciAtIFN0b3AgcXVldWUsIGJ1dCBrZWVwIGNvbmZpZ3VyYXRpb24KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUxNiB0eHFfaWQpCit7CisJLyogU2ltcGx5IHN0b3AgdGhlIHF1ZXVlLCBidXQgZG9uJ3QgY2hhbmdlIGFueSBjb25maWd1cmF0aW9uOworCSAqIHRoZSBTQ0RfQUNUX0VOIGJpdCBpcyB0aGUgd3JpdGUtZW5hYmxlIG1hc2sgZm9yIHRoZSBBQ1RJVkUgYml0LiAqLworCWlsX3dyX3BycGgoaWwsIElMNDlfU0NEX1FVRVVFX1NUQVRVU19CSVRTKHR4cV9pZCksCisJCSAgICgwIDw8IElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUpIHwKKwkJICAgKDEgPDwgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ1RfRU4pKTsKK30KKworLyoqCisgKiBpbDQ5NjVfdHhfcXVldWVfc2V0X3EycmF0aWQgLSBNYXAgdW5pcXVlIHJlY2VpdmVyL3RpZCBjb21iaW5hdGlvbiB0byBhIHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV90eF9xdWV1ZV9zZXRfcTJyYXRpZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUxNiByYV90aWQsIHUxNiB0eHFfaWQpCit7CisJdTMyIHRibF9kd19hZGRyOworCXUzMiB0YmxfZHc7CisJdTE2IHNjZF9xMnJhdGlkOworCisJc2NkX3EycmF0aWQgPSByYV90aWQgJiBJTF9TQ0RfUVVFVUVfUkFfVElEX01BUF9SQVRJRF9NU0s7CisKKwl0YmxfZHdfYWRkciA9CisJICAgIGlsLT5zY2RfYmFzZV9hZGRyICsgSUw0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUodHhxX2lkKTsKKworCXRibF9kdyA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIHRibF9kd19hZGRyKTsKKworCWlmICh0eHFfaWQgJiAweDEpCisJCXRibF9kdyA9IChzY2RfcTJyYXRpZCA8PCAxNikgfCAodGJsX2R3ICYgMHgwMDAwRkZGRik7CisJZWxzZQorCQl0YmxfZHcgPSBzY2RfcTJyYXRpZCB8ICh0YmxfZHcgJiAweEZGRkYwMDAwKTsKKworCWlsX3dyaXRlX3RhcmdfbWVtKGlsLCB0YmxfZHdfYWRkciwgdGJsX2R3KTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsNDk2NV90eF9xdWV1ZV9hZ2dfZW5hYmxlIC0gU2V0IHVwICYgZW5hYmxlIGFnZ3JlZ2F0aW9uIGZvciBzZWxlY3RlZCBxdWV1ZQorICoKKyAqIE5PVEU6ICB0eHFfaWQgbXVzdCBiZSBncmVhdGVyIHRoYW4gSUw0OV9GSVJTVF9BTVBEVV9RVUVVRSwKKyAqICAgICAgICBpLmUuIGl0IG11c3QgYmUgb25lIG9mIHRoZSBoaWdoZXIgcXVldWVzIHVzZWQgZm9yIGFnZ3JlZ2F0aW9uCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV90eHFfYWdnX2VuYWJsZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQsIGludCB0eF9maWZvLCBpbnQgc3RhX2lkLAorCQkgICAgICBpbnQgdGlkLCB1MTYgc3NuX2lkeCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiByYV90aWQ7CisJaW50IHJldDsKKworCWlmICgoSUw0OV9GSVJTVF9BTVBEVV9RVUVVRSA+IHR4cV9pZCkgfHwKKwkgICAgKElMNDlfRklSU1RfQU1QRFVfUVVFVUUgKworCSAgICAgaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9hbXBkdV9xdWV1ZXMgPD0gdHhxX2lkKSkgeworCQlJTF9XQVJOKCJxdWV1ZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlZCwgbXVzdCBiZSAlZCB0byAlZFxuIiwKKwkJCXR4cV9pZCwgSUw0OV9GSVJTVF9BTVBEVV9RVUVVRSwKKwkJCUlMNDlfRklSU1RfQU1QRFVfUVVFVUUgKworCQkJaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9hbXBkdV9xdWV1ZXMgLSAxKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmFfdGlkID0gQlVJTERfUkF4VElEKHN0YV9pZCwgdGlkKTsKKworCS8qIE1vZGlmeSBkZXZpY2UncyBzdGF0aW9uIHRhYmxlIHRvIFR4IHRoaXMgVElEICovCisJcmV0ID0gaWw0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChpbCwgc3RhX2lkLCB0aWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIFN0b3AgdGhpcyBUeCBxdWV1ZSBiZWZvcmUgY29uZmlndXJpbmcgaXQgKi8KKwlpbDQ5NjVfdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIoaWwsIHR4cV9pZCk7CisKKwkvKiBNYXAgcmVjZWl2ZXItYWRkcmVzcyAvIHRyYWZmaWMtSUQgdG8gdGhpcyBxdWV1ZSAqLworCWlsNDk2NV90eF9xdWV1ZV9zZXRfcTJyYXRpZChpbCwgcmFfdGlkLCB0eHFfaWQpOworCisJLyogU2V0IHRoaXMgcXVldWUgYXMgYSBjaGFpbi1idWlsZGluZyBxdWV1ZSAqLworCWlsX3NldF9iaXRzX3BycGgoaWwsIElMNDlfU0NEX1FVRVVFQ0hBSU5fU0VMLCAoMSA8PCB0eHFfaWQpKTsKKworCS8qIFBsYWNlIGZpcnN0IFRGRCBhdCBpZHggY29ycmVzcG9uZGluZyB0byBzdGFydCBzZXF1ZW5jZSBudW1iZXIuCisJICogQXNzdW1lcyB0aGF0IHNzbl9pZHggaXMgdmFsaWQgKCE9IDB4RkZGKSAqLworCWlsLT50eHFbdHhxX2lkXS5xLnJlYWRfcHRyID0gKHNzbl9pZHggJiAweGZmKTsKKwlpbC0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOworCWlsNDk2NV9zZXRfd3JfcHRycyhpbCwgdHhxX2lkLCBzc25faWR4KTsKKworCS8qIFNldCB1cCBUeCB3aW4gc2l6ZSBhbmQgZnJhbWUgbGltaXQgZm9yIHRoaXMgcXVldWUgKi8KKwlpbF93cml0ZV90YXJnX21lbShpbCwKKwkJCSAgaWwtPnNjZF9iYXNlX2FkZHIgKworCQkJICBJTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVCh0eHFfaWQpLAorCQkJICAoU0NEX1dJTl9TSVpFIDw8IElMNDlfU0NEX1FVRVVFX0NUWF9SRUcxX1dJTl9TSVpFX1BPUykKKwkJCSAgJiBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9NU0spOworCisJaWxfd3JpdGVfdGFyZ19tZW0oaWwsCisJCQkgIGlsLT5zY2RfYmFzZV9hZGRyICsKKwkJCSAgSUw0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQodHhxX2lkKSArIHNpemVvZih1MzIpLAorCQkJICAoU0NEX0ZSQU1FX0xJTUlUIDw8CisJCQkgICBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MpICYKKwkJCSAgSUw0OV9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfTVNLKTsKKworCWlsX3NldF9iaXRzX3BycGgoaWwsIElMNDlfU0NEX0lOVEVSUlVQVF9NQVNLLCAoMSA8PCB0eHFfaWQpKTsKKworCS8qIFNldCB1cCBTdGF0dXMgYXJlYSBpbiBTUkFNLCBtYXAgdG8gVHggRE1BL0ZJRk8sIGFjdGl2YXRlIHRoZSBxdWV1ZSAqLworCWlsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKGlsLCAmaWwtPnR4cVt0eHFfaWRdLCB0eF9maWZvLCAxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50CitpbDQ5NjVfdHhfYWdnX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqIHNzbikKK3sKKwlpbnQgc3RhX2lkOworCWludCB0eF9maWZvOworCWludCB0eHFfaWQ7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBpbF90aWRfZGF0YSAqdGlkX2RhdGE7CisKKwl0eF9maWZvID0gaWw0OTY1X2dldF9maWZvX2Zyb21fdGlkKGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZiksIHRpZCk7CisJaWYgKHVubGlrZWx5KHR4X2ZpZm8gPCAwKSkKKwkJcmV0dXJuIHR4X2ZpZm87CisKKwlEX0hUKCIlcyBvbiByYSA9ICVwTSB0aWQgPSAlZFxuIiwgX19mdW5jX18sIHN0YS0+YWRkciwgdGlkKTsKKworCXN0YV9pZCA9IGlsX3N0YV9pZChzdGEpOworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSB7CisJCUlMX0VSUigiU3RhcnQgQUdHIG9uIGludmFsaWQgc3RhdGlvblxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCWlmICh1bmxpa2VseSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSAhPSBJTF9BR0dfT0ZGKSB7CisJCUlMX0VSUigiU3RhcnQgQUdHIHdoZW4gc3RhdGUgaXMgbm90IElMX0FHR19PRkYgIVxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJdHhxX2lkID0gaWw0OTY1X3R4cV9jdHhfYWN0aXZhdGVfZnJlZShpbCk7CisJaWYgKHR4cV9pZCA9PSAtMSkgeworCQlJTF9FUlIoIk5vIGZyZWUgYWdncmVnYXRpb24gcXVldWUgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJdGlkX2RhdGEgPSAmaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07CisJKnNzbiA9IFNFUV9UT19TTih0aWRfZGF0YS0+c2VxX251bWJlcik7CisJdGlkX2RhdGEtPmFnZy50eHFfaWQgPSB0eHFfaWQ7CisJaWxfc2V0X3N3cV9pZCgmaWwtPnR4cVt0eHFfaWRdLCBpbDQ5NjVfZ2V0X2FjX2Zyb21fdGlkKHRpZCksIHR4cV9pZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXQgPSBpbDQ5NjVfdHhxX2FnZ19lbmFibGUoaWwsIHR4cV9pZCwgdHhfZmlmbywgc3RhX2lkLCB0aWQsICpzc24pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJdGlkX2RhdGEgPSAmaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07CisJaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKKwkJRF9IVCgiSFcgcXVldWUgaXMgZW1wdHlcbiIpOworCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSUxfQUdHX09OOworCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKKwl9IGVsc2UgeworCQlEX0hUKCJIVyBxdWV1ZSBpcyBOT1QgZW1wdHk6ICVkIHBhY2tldHMgaW4gSFcgcXVldWVcbiIsCisJCSAgICAgdGlkX2RhdGEtPnRmZHNfaW5fcXVldWUpOworCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSUxfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogdHhxX2lkIG11c3QgYmUgZ3JlYXRlciB0aGFuIElMNDlfRklSU1RfQU1QRFVfUVVFVUUKKyAqIGlsLT5sb2NrIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV90eHFfYWdnX2Rpc2FibGUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgdHhxX2lkLCB1MTYgc3NuX2lkeCwgdTggdHhfZmlmbykKK3sKKwlpZiAoKElMNDlfRklSU1RfQU1QRFVfUVVFVUUgPiB0eHFfaWQpIHx8CisJICAgIChJTDQ5X0ZJUlNUX0FNUERVX1FVRVVFICsKKwkgICAgIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIDw9IHR4cV9pZCkpIHsKKwkJSUxfV0FSTigicXVldWUgbnVtYmVyIG91dCBvZiByYW5nZTogJWQsIG11c3QgYmUgJWQgdG8gJWRcbiIsCisJCQl0eHFfaWQsIElMNDlfRklSU1RfQU1QRFVfUVVFVUUsCisJCQlJTDQ5X0ZJUlNUX0FNUERVX1FVRVVFICsKKwkJCWlsLT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIC0gMSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlsNDk2NV90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcihpbCwgdHhxX2lkKTsKKworCWlsX2NsZWFyX2JpdHNfcHJwaChpbCwgSUw0OV9TQ0RfUVVFVUVDSEFJTl9TRUwsICgxIDw8IHR4cV9pZCkpOworCisJaWwtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOworCWlsLT50eHFbdHhxX2lkXS5xLndyaXRlX3B0ciA9IChzc25faWR4ICYgMHhmZik7CisJLyogc3VwcG9zZXMgdGhhdCBzc25faWR4IGlzIHZhbGlkICghPSAweEZGRikgKi8KKwlpbDQ5NjVfc2V0X3dyX3B0cnMoaWwsIHR4cV9pZCwgc3NuX2lkeCk7CisKKwlpbF9jbGVhcl9iaXRzX3BycGgoaWwsIElMNDlfU0NEX0lOVEVSUlVQVF9NQVNLLCAoMSA8PCB0eHFfaWQpKTsKKwlpbF90eHFfY3R4X2RlYWN0aXZhdGUoaWwsIHR4cV9pZCk7CisJaWw0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMoaWwsICZpbC0+dHhxW3R4cV9pZF0sIHR4X2ZpZm8sIDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X3R4X2FnZ19zdG9wKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCkKK3sKKwlpbnQgdHhfZmlmb19pZCwgdHhxX2lkLCBzdGFfaWQsIHNzbjsKKwlzdHJ1Y3QgaWxfdGlkX2RhdGEgKnRpZF9kYXRhOworCWludCB3cml0ZV9wdHIsIHJlYWRfcHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0eF9maWZvX2lkID0gaWw0OTY1X2dldF9maWZvX2Zyb21fdGlkKGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZiksIHRpZCk7CisJaWYgKHVubGlrZWx5KHR4X2ZpZm9faWQgPCAwKSkKKwkJcmV0dXJuIHR4X2ZpZm9faWQ7CisKKwlzdGFfaWQgPSBpbF9zdGFfaWQoc3RhKTsKKworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSB7CisJCUlMX0VSUigiSW52YWxpZCBzdGF0aW9uIGZvciBBR0cgdGlkICVkXG4iLCB0aWQpOworCQlyZXR1cm4gLUVOWElPOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXRpZF9kYXRhID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdOworCXNzbiA9ICh0aWRfZGF0YS0+c2VxX251bWJlciAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNDsKKwl0eHFfaWQgPSB0aWRfZGF0YS0+YWdnLnR4cV9pZDsKKworCXN3aXRjaCAoaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlKSB7CisJY2FzZSBJTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQToKKwkJLyoKKwkJICogVGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBwZWVyIHN0b3BzIGFnZ3JlZ2F0aW9uCisJCSAqIGFnYWluIGJlZm9yZSB3ZSd2ZSBoYWQgYSBjaGFuY2UgdG8gZHJhaW4gdGhlCisJCSAqIHF1ZXVlIHdlIHNlbGVjdGVkIHByZXZpb3VzbHksIGkuZS4gYmVmb3JlIHRoZQorCQkgKiBzZXNzaW9uIHdhcyByZWFsbHkgc3RhcnRlZCBjb21wbGV0ZWx5LgorCQkgKi8KKwkJRF9IVCgiQUdHIHN0b3AgYmVmb3JlIHNldHVwIGRvbmVcbiIpOworCQlnb3RvIHR1cm5fb2ZmOworCWNhc2UgSUxfQUdHX09OOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJTF9XQVJOKCJTdG9wcGluZyBBR0cgd2hpbGUgc3RhdGUgbm90IE9OIG9yIHN0YXJ0aW5nXG4iKTsKKwl9CisKKwl3cml0ZV9wdHIgPSBpbC0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHI7CisJcmVhZF9wdHIgPSBpbC0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0cjsKKworCS8qIFRoZSBxdWV1ZSBpcyBub3QgZW1wdHkgKi8KKwlpZiAod3JpdGVfcHRyICE9IHJlYWRfcHRyKSB7CisJCURfSFQoIlN0b3BwaW5nIGEgbm9uIGVtcHR5IEFHRyBIVyBRVUVVRVxuIik7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSA9CisJCSAgICBJTF9FTVBUWUlOR19IV19RVUVVRV9ERUxCQTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCURfSFQoIkhXIHF1ZXVlIGlzIGVtcHR5XG4iKTsKK3R1cm5fb2ZmOgorCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSA9IElMX0FHR19PRkY7CisKKwkvKiBkbyBub3QgcmVzdG9yZS9zYXZlIGlycXMgKi8KKwlzcGluX3VubG9jaygmaWwtPnN0YV9sb2NrKTsKKwlzcGluX2xvY2soJmlsLT5sb2NrKTsKKworCS8qCisJICogdGhlIG9ubHkgcmVhc29uIHRoaXMgY2FsbCBjYW4gZmFpbCBpcyBxdWV1ZSBudW1iZXIgb3V0IG9mIHJhbmdlLAorCSAqIHdoaWNoIGNhbiBoYXBwZW4gaWYgdUNvZGUgaXMgcmVsb2FkZWQgYW5kIGFsbCB0aGUgc3RhdGlvbgorCSAqIGluZm9ybWF0aW9uIGFyZSBsb3N0LiBpZiBpdCBpcyBvdXRzaWRlIHRoZSByYW5nZSwgdGhlcmUgaXMgbm8gbmVlZAorCSAqIHRvIGRlYWN0aXZhdGUgdGhlIHVDb2RlIHF1ZXVlLCBqdXN0IHJldHVybiAic3VjY2VzcyIgdG8gYWxsb3cKKwkgKiAgbWFjODAyMTEgdG8gY2xlYW4gdXAgaXQgb3duIGRhdGEuCisJICovCisJaWw0OTY1X3R4cV9hZ2dfZGlzYWJsZShpbCwgdHhxX2lkLCBzc24sIHR4X2ZpZm9faWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X3R4cV9jaGVja19lbXB0eShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIHU4IHRpZCwgaW50IHR4cV9pZCkKK3sKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmaWwtPnR4cVt0eHFfaWRdLnE7CisJdTggKmFkZHIgPSBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHI7CisJc3RydWN0IGlsX3RpZF9kYXRhICp0aWRfZGF0YSA9ICZpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7CisKKwljdHggPSAmaWwtPmN0eDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5zdGFfbG9jayk7CisKKwlzd2l0Y2ggKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSkgeworCWNhc2UgSUxfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkE6CisJCS8qIFdlIGFyZSByZWNsYWltaW5nIHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgKi8KKwkJLyogYWdncmVnYXRlZCBIVyBxdWV1ZSAqLworCQlpZiAodHhxX2lkID09IHRpZF9kYXRhLT5hZ2cudHhxX2lkICYmCisJCSAgICBxLT5yZWFkX3B0ciA9PSBxLT53cml0ZV9wdHIpIHsKKwkJCXUxNiBzc24gPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOworCQkJaW50IHR4X2ZpZm8gPSBpbDQ5NjVfZ2V0X2ZpZm9fZnJvbV90aWQoY3R4LCB0aWQpOworCQkJRF9IVCgiSFcgcXVldWUgZW1wdHk6IGNvbnRpbnVlIERFTEJBIGZsb3dcbiIpOworCQkJaWw0OTY1X3R4cV9hZ2dfZGlzYWJsZShpbCwgdHhxX2lkLCBzc24sIHR4X2ZpZm8pOworCQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElMX0FHR19PRkY7CisJCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKGN0eC0+dmlmLCBhZGRyLCB0aWQpOworCQl9CisJCWJyZWFrOworCWNhc2UgSUxfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkE6CisJCS8qIFdlIGFyZSByZWNsYWltaW5nIHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgcXVldWUgKi8KKwkJaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKKwkJCURfSFQoIkhXIHF1ZXVlIGVtcHR5OiBjb250aW51ZSBBRERCQSBmbG93XG4iKTsKKwkJCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJTF9BR0dfT047CisJCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZShjdHgtPnZpZiwgYWRkciwgdGlkKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9ub25fYWdnX3R4X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSBjb25zdCB1OCAqYWRkcjEpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEoY3R4LT52aWYsIGFkZHIxKTsKKwlpZiAoc3RhKSB7CisJCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCQkvKiBhdm9pZCBhdG9taWMgb3BzIGlmIHRoaXMgaXNuJ3QgYSBjbGllbnQgKi8KKwkJaWYgKHN0YV9wcml2LT5jbGllbnQgJiYKKwkJICAgIGF0b21pY19kZWNfcmV0dXJuKCZzdGFfcHJpdi0+cGVuZGluZ19mcmFtZXMpID09IDApCisJCQlpZWVlODAyMTFfc3RhX2Jsb2NrX2F3YWtlKGlsLT5odywgc3RhLCBmYWxzZSk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3R4X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9pbmZvICp0eF9pbmZvLCBib29sIGlzX2FnZykKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopdHhfaW5mby0+c2tiLT5kYXRhOworCisJaWYgKCFpc19hZ2cpCisJCWlsNDk2NV9ub25fYWdnX3R4X3N0YXR1cyhpbCwgdHhfaW5mby0+Y3R4LCBoZHItPmFkZHIxKTsKKworCWllZWU4MDIxMV90eF9zdGF0dXNfaXJxc2FmZShpbC0+aHcsIHR4X2luZm8tPnNrYik7Cit9CisKK2ludAoraWw0OTY1X3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4KQoreworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmdHhxLT5xOworCXN0cnVjdCBpbF90eF9pbmZvICp0eF9pbmZvOworCWludCBuZnJlZWQgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisKKwlpZiAoaWR4ID49IHEtPm5fYmQgfHwgaWxfcXVldWVfdXNlZChxLCBpZHgpID09IDApIHsKKwkJSUxfRVJSKCJSZWFkIGlkeCBmb3IgRE1BIHF1ZXVlIHR4cSBpZCAoJWQpLCBpZHggJWQsICIKKwkJICAgICAgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwgdHhxX2lkLCBpZHgsIHEtPm5fYmQsCisJCSAgICAgICBxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpZHggPSBpbF9xdWV1ZV9pbmNfd3JhcChpZHgsIHEtPm5fYmQpOyBxLT5yZWFkX3B0ciAhPSBpZHg7CisJICAgICBxLT5yZWFkX3B0ciA9IGlsX3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgeworCisJCXR4X2luZm8gPSAmdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXTsKKworCQlpZiAoV0FSTl9PTl9PTkNFKHR4X2luZm8tPnNrYiA9PSBOVUxMKSkKKwkJCWNvbnRpbnVlOworCisJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXR4X2luZm8tPnNrYi0+ZGF0YTsKKwkJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKQorCQkJbmZyZWVkKys7CisKKwkJaWw0OTY1X3R4X3N0YXR1cyhpbCwgdHhfaW5mbywKKwkJCQkgdHhxX2lkID49IElMNDk2NV9GSVJTVF9BTVBEVV9RVUVVRSk7CisJCXR4X2luZm8tPnNrYiA9IE5VTEw7CisKKwkJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9mcmVlX3RmZChpbCwgdHhxKTsKKwl9CisJcmV0dXJuIG5mcmVlZDsKK30KKworLyoqCisgKiBpbDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEgLSBVcGRhdGUgdHggc3RhdHVzIGZyb20gYmxvY2stYWNrCisgKgorICogR28gdGhyb3VnaCBibG9jay1hY2sncyBiaXRtYXAgb2YgQUNLJ2QgZnJhbWVzLCB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mCisgKiBBQ0sgdnMuIG5vdC4gIFRoaXMgZ2V0cyBzZW50IHRvIG1hYzgwMjExLCB0aGVuIHRvIHJhdGUgc2NhbGluZyBhbGdvLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaHRfYWdnICphZ2csCisJCQkJICAgICBzdHJ1Y3QgaWxfY29tcHJlc3NlZF9iYV9yZXNwICpiYV9yZXNwKQoreworCWludCBpLCBzaCwgYWNrOworCXUxNiBzZXFfY3RsID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2VxX2N0bCk7CisJdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOworCWludCBzdWNjZXNzZXMgPSAwOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKKwl1NjQgYml0bWFwLCBzZW50X2JpdG1hcDsKKworCWlmICh1bmxpa2VseSghYWdnLT53YWl0X2Zvcl9iYSkpIHsKKwkJaWYgKHVubGlrZWx5KGJhX3Jlc3AtPmJpdG1hcCkpCisJCQlJTF9FUlIoIlJlY2VpdmVkIEJBIHdoZW4gbm90IGV4cGVjdGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTWFyayB0aGF0IHRoZSBleHBlY3RlZCBibG9jay1hY2sgcmVzcG9uc2UgYXJyaXZlZCAqLworCWFnZy0+d2FpdF9mb3JfYmEgPSAwOworCURfVFhfUkVQTFkoIkJBICVkICVkXG4iLCBhZ2ctPnN0YXJ0X2lkeCwgYmFfcmVzcC0+c2VxX2N0bCk7CisKKwkvKiBDYWxjdWxhdGUgc2hpZnQgdG8gYWxpZ24gYmxvY2stYWNrIGJpdHMgd2l0aCBvdXIgVHggd2luIGJpdHMgKi8KKwlzaCA9IGFnZy0+c3RhcnRfaWR4IC0gU0VRX1RPX0lEWChzZXFfY3RsID4+IDQpOworCWlmIChzaCA8IDApCQkvKiB0Yncgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggaW5kaWNlcyAqLworCQlzaCArPSAweDEwMDsKKworCWlmIChhZ2ctPmZyYW1lX2NvdW50ID4gKDY0IC0gc2gpKSB7CisJCURfVFhfUkVQTFkoIm1vcmUgZnJhbWVzIHRoYW4gYml0bWFwIHNpemUiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGRvbid0IHVzZSA2NC1iaXQgdmFsdWVzIGZvciBub3cgKi8KKwliaXRtYXAgPSBsZTY0X3RvX2NwdShiYV9yZXNwLT5iaXRtYXApID4+IHNoOworCisJLyogY2hlY2sgZm9yIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhY2NvcmRpbmcgdG8gdGhlCisJICogdHJhbnNtaXR0ZWQgYml0bWFwIGFuZCBibG9jay1hY2sgYml0bWFwICovCisJc2VudF9iaXRtYXAgPSBiaXRtYXAgJiBhZ2ctPmJpdG1hcDsKKworCS8qIEZvciBlYWNoIGZyYW1lIGF0dGVtcHRlZCBpbiBhZ2dyZWdhdGlvbiwKKwkgKiB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mIHR4IGZyYW1lJ3Mgc3RhdHVzLiAqLworCWkgPSAwOworCXdoaWxlIChzZW50X2JpdG1hcCkgeworCQlhY2sgPSBzZW50X2JpdG1hcCAmIDFVTEw7CisJCXN1Y2Nlc3NlcyArPSBhY2s7CisJCURfVFhfUkVQTFkoIiVzIE9OIGk9JWQgaWR4PSVkIHJhdz0lZFxuIiwgYWNrID8gIkFDSyIgOiAiTkFDSyIsCisJCQkgICBpLCAoYWdnLT5zdGFydF9pZHggKyBpKSAmIDB4ZmYsIGFnZy0+c3RhcnRfaWR4ICsgaSk7CisJCXNlbnRfYml0bWFwID4+PSAxOworCQkrK2k7CisJfQorCisJRF9UWF9SRVBMWSgiQml0bWFwICVsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYml0bWFwKTsKKworCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKGlsLT50eHFbc2NkX2Zsb3ddLnR4YlthZ2ctPnN0YXJ0X2lkeF0uc2tiKTsKKwltZW1zZXQoJmluZm8tPnN0YXR1cywgMCwgc2l6ZW9mKGluZm8tPnN0YXR1cykpOworCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKKwlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVTsKKwlpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbiA9IHN1Y2Nlc3NlczsKKwlpbmZvLT5zdGF0dXMuYW1wZHVfbGVuID0gYWdnLT5mcmFtZV9jb3VudDsKKwlpbDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2woaWwsIGFnZy0+cmF0ZV9uX2ZsYWdzLCBpbmZvKTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIHRyYW5zbGF0ZSB1Y29kZSByZXNwb25zZSB0byBtYWM4MDIxMSB0eCBzdGF0dXMgY29udHJvbCB2YWx1ZXMKKyAqLwordm9pZAoraWw0OTY1X2h3cmF0ZV90b190eF9jb250cm9sKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJhdGVfbl9mbGFncywKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8pCit7CisJc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICpyID0gJmluZm8tPmNvbnRyb2wucmF0ZXNbMF07CisKKwlpbmZvLT5hbnRlbm5hX3NlbF90eCA9CisJICAgICgocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0FCQ19NU0spID4+IFJBVEVfTUNTX0FOVF9QT1MpOworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spCisJCXItPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ19NQ1M7CisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0dGX01TSykKKwkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEOworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykKKwkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKKwlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfRFVQX01TSykKKwkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX0RVUF9EQVRBOworCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQorCQlyLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0k7CisJci0+aWR4ID0gaWw0OTY1X2h3cmF0ZV90b19tYWM4MDIxMV9pZHgocmF0ZV9uX2ZsYWdzLCBpbmZvLT5iYW5kKTsKK30KKworLyoqCisgKiBpbDQ5NjVfaGRsX2NvbXByZXNzZWRfYmEgLSBIYW5kbGVyIGZvciBOX0NPTVBSRVNTRURfQkEKKyAqCisgKiBIYW5kbGVzIGJsb2NrLWFja25vd2xlZGdlIG5vdGlmaWNhdGlvbiBmcm9tIGRldmljZSwgd2hpY2ggcmVwb3J0cyBzdWNjZXNzCisgKiBvZiBmcmFtZXMgc2VudCB2aWEgYWdncmVnYXRpb24uCisgKi8KK3ZvaWQKK2lsNDk2NV9oZGxfY29tcHJlc3NlZF9iYShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbF9jb21wcmVzc2VkX2JhX3Jlc3AgKmJhX3Jlc3AgPSAmcGt0LT51LmNvbXByZXNzZWRfYmE7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSBOVUxMOworCXN0cnVjdCBpbF9odF9hZ2cgKmFnZzsKKwlpbnQgaWR4OworCWludCBzdGFfaWQ7CisJaW50IHRpZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogImZsb3ciIGNvcnJlc3BvbmRzIHRvIFR4IHF1ZXVlICovCisJdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOworCisJLyogInNzbiIgaXMgc3RhcnQgb2YgYmxvY2stYWNrIFR4IHdpbiwgY29ycmVzcG9uZHMgdG8gaWR4CisJICogKGluIFR4IHF1ZXVlJ3MgY2lyY3VsYXIgYnVmZmVyKSBvZiBmaXJzdCBURkQvZnJhbWUgaW4gd2luICovCisJdTE2IGJhX3Jlc3Bfc2NkX3NzbiA9IGxlMTZfdG9fY3B1KGJhX3Jlc3AtPnNjZF9zc24pOworCisJaWYgKHNjZF9mbG93ID49IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW0pIHsKKwkJSUxfRVJSKCJCVUdfT04gc2NkX2Zsb3cgaXMgYmlnZ2VyIHRoYW4gbnVtYmVyIG9mIHF1ZXVlc1xuIik7CisJCXJldHVybjsKKwl9CisKKwl0eHEgPSAmaWwtPnR4cVtzY2RfZmxvd107CisJc3RhX2lkID0gYmFfcmVzcC0+c3RhX2lkOworCXRpZCA9IGJhX3Jlc3AtPnRpZDsKKwlhZ2cgPSAmaWwtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnOworCWlmICh1bmxpa2VseShhZ2ctPnR4cV9pZCAhPSBzY2RfZmxvdykpIHsKKwkJLyoKKwkJICogRklYTUU6IHRoaXMgaXMgYSB1Q29kZSBidWcgd2hpY2ggbmVlZCB0byBiZSBhZGRyZXNzZWQsCisJCSAqIGxvZyB0aGUgaW5mb3JtYXRpb24gYW5kIHJldHVybiBmb3Igbm93IQorCQkgKiBzaW5jZSBpdCBpcyBwb3NzaWJsZSBoYXBwZW4gdmVyeSBvZnRlbiBhbmQgaW4gb3JkZXIKKwkJICogbm90IHRvIGZpbGwgdGhlIHN5c2xvZywgZG9uJ3QgZW5hYmxlIHRoZSBsb2dnaW5nIGJ5IGRlZmF1bHQKKwkJICovCisJCURfVFhfUkVQTFkoIkJBIHNjZF9mbG93ICVkIGRvZXMgbm90IG1hdGNoIHR4cV9pZCAlZFxuIiwKKwkJCSAgIHNjZF9mbG93LCBhZ2ctPnR4cV9pZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBGaW5kIGlkeCBqdXN0IGJlZm9yZSBibG9jay1hY2sgd2luICovCisJaWR4ID0gaWxfcXVldWVfZGVjX3dyYXAoYmFfcmVzcF9zY2Rfc3NuICYgMHhmZiwgdHhxLT5xLm5fYmQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJRF9UWF9SRVBMWSgiTl9DT01QUkVTU0VEX0JBIFslZF0gUmVjZWl2ZWQgZnJvbSAlcE0sICIgInN0YV9pZCA9ICVkXG4iLAorCQkgICBhZ2ctPndhaXRfZm9yX2JhLCAodTggKikgJmJhX3Jlc3AtPnN0YV9hZGRyX2xvMzIsCisJCSAgIGJhX3Jlc3AtPnN0YV9pZCk7CisJRF9UWF9SRVBMWSgiVElEID0gJWQsIFNlcUN0bCA9ICVkLCBiaXRtYXAgPSAweCVsbHgsIiAic2NkX2Zsb3cgPSAiCisJCSAgICIlZCwgc2NkX3NzbiA9ICVkXG4iLCBiYV9yZXNwLT50aWQsIGJhX3Jlc3AtPnNlcV9jdGwsCisJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpbGU2NF90b19jcHUoYmFfcmVzcC0+Yml0bWFwKSwKKwkJICAgYmFfcmVzcC0+c2NkX2Zsb3csIGJhX3Jlc3AtPnNjZF9zc24pOworCURfVFhfUkVQTFkoIkRBVCBzdGFydF9pZHggPSAlZCwgYml0bWFwID0gMHglbGx4XG4iLCBhZ2ctPnN0YXJ0X2lkeCwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZ2ctPmJpdG1hcCk7CisKKwkvKiBVcGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mIEFDSyB2cy4gbm90IGZvciBlYWNoIGZyYW1lIGluIHdpbiAqLworCWlsNDk2NV90eF9zdGF0dXNfcmVwbHlfY29tcHJlc3NlZF9iYShpbCwgYWdnLCBiYV9yZXNwKTsKKworCS8qIFJlbGVhc2UgYWxsIFRGRHMgYmVmb3JlIHRoZSBTU04sIGkuZS4gYWxsIFRGRHMgaW4gZnJvbnQgb2YKKwkgKiBibG9jay1hY2sgd2luICh3ZSBhc3N1bWUgdGhhdCB0aGV5J3ZlIGJlZW4gc3VjY2Vzc2Z1bGx5CisJICogdHJhbnNtaXR0ZWQgLi4uIGlmIG5vdCwgaXQncyB0b28gbGF0ZSBhbnl3YXkpLiAqLworCWlmICh0eHEtPnEucmVhZF9wdHIgIT0gKGJhX3Jlc3Bfc2NkX3NzbiAmIDB4ZmYpKSB7CisJCS8qIGNhbGN1bGF0ZSBtYWM4MDIxMSBhbXBkdSBzdyBxdWV1ZSB0byB3YWtlICovCisJCWludCBmcmVlZCA9IGlsNDk2NV90eF9xdWV1ZV9yZWNsYWltKGlsLCBzY2RfZmxvdywgaWR4KTsKKwkJaWw0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShpbCwgc3RhX2lkLCB0aWQsIGZyZWVkKTsKKworCQlpZiAoaWxfcXVldWVfc3BhY2UoJnR4cS0+cSkgPiB0eHEtPnEubG93X21hcmsgJiYKKwkJICAgIGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkICYmCisJCSAgICBhZ2ctPnN0YXRlICE9IElMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKQorCQkJaWxfd2FrZV9xdWV1ZShpbCwgdHhxKTsKKworCQlpbDQ5NjVfdHhxX2NoZWNrX2VtcHR5KGlsLCBzdGFfaWQsIHRpZCwgc2NkX2Zsb3cpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworfQorCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCitjb25zdCBjaGFyICoKK2lsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKK3sKKyNkZWZpbmUgVFhfU1RBVFVTX0ZBSUwoeCkgY2FzZSBUWF9TVEFUVVNfRkFJTF8gIyMgeDogcmV0dXJuICN4CisjZGVmaW5lIFRYX1NUQVRVU19QT1NUUE9ORSh4KSBjYXNlIFRYX1NUQVRVU19QT1NUUE9ORV8gIyMgeDogcmV0dXJuICN4CisKKwlzd2l0Y2ggKHN0YXR1cyAmIFRYX1NUQVRVU19NU0spIHsKKwljYXNlIFRYX1NUQVRVU19TVUNDRVNTOgorCQlyZXR1cm4gIlNVQ0NFU1MiOworCQlUWF9TVEFUVVNfUE9TVFBPTkUoREVMQVkpOworCQlUWF9TVEFUVVNfUE9TVFBPTkUoRkVXX0JZVEVTKTsKKwkJVFhfU1RBVFVTX1BPU1RQT05FKFFVSUVUX1BFUklPRCk7CisJCVRYX1NUQVRVU19QT1NUUE9ORShDQUxDX1RUQUspOworCQlUWF9TVEFUVVNfRkFJTChJTlRFUk5BTF9DUk9TU0VEX1JFVFJZKTsKKwkJVFhfU1RBVFVTX0ZBSUwoU0hPUlRfTElNSVQpOworCQlUWF9TVEFUVVNfRkFJTChMT05HX0xJTUlUKTsKKwkJVFhfU1RBVFVTX0ZBSUwoRklGT19VTkRFUlJVTik7CisJCVRYX1NUQVRVU19GQUlMKERSQUlOX0ZMT1cpOworCQlUWF9TVEFUVVNfRkFJTChSRktJTExfRkxVU0gpOworCQlUWF9TVEFUVVNfRkFJTChMSUZFX0VYUElSRSk7CisJCVRYX1NUQVRVU19GQUlMKERFU1RfUFMpOworCQlUWF9TVEFUVVNfRkFJTChIT1NUX0FCT1JURUQpOworCQlUWF9TVEFUVVNfRkFJTChCVF9SRVRSWSk7CisJCVRYX1NUQVRVU19GQUlMKFNUQV9JTlZBTElEKTsKKwkJVFhfU1RBVFVTX0ZBSUwoRlJBR19EUk9QUEVEKTsKKwkJVFhfU1RBVFVTX0ZBSUwoVElEX0RJU0FCTEUpOworCQlUWF9TVEFUVVNfRkFJTChGSUZPX0ZMVVNIRUQpOworCQlUWF9TVEFUVVNfRkFJTChJTlNVRkZJQ0lFTlRfQ0ZfUE9MTCk7CisJCVRYX1NUQVRVU19GQUlMKFBBU1NJVkVfTk9fUlgpOworCQlUWF9TVEFUVVNfRkFJTChOT19CRUFDT05fT05fUkFEQVIpOworCX0KKworCXJldHVybiAiVU5LTk9XTiI7CisKKyN1bmRlZiBUWF9TVEFUVVNfRkFJTAorI3VuZGVmIFRYX1NUQVRVU19QT1NUUE9ORQorfQorI2VuZGlmIC8qIENPTkZJR19JV0xFR0FDWV9ERUJVRyAqLworCitzdGF0aWMgc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgKgoraWw0OTY1X3N0YV9hbGxvY19scShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IHN0YV9pZCkKK3sKKwlpbnQgaSwgcjsKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7CisJdTMyIHJhdGVfZmxhZ3MgPSAwOworCV9fbGUzMiByYXRlX25fZmxhZ3M7CisKKwlsaW5rX2NtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFsaW5rX2NtZCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIExRIGNtZC5cbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJLyogU2V0IHVwIHRoZSByYXRlIHNjYWxpbmcgdG8gc3RhcnQgYXQgc2VsZWN0ZWQgcmF0ZSwgZmFsbCBiYWNrCisJICogYWxsIHRoZSB3YXkgZG93biB0byAxTSBpbiBJRUVFIG9yZGVyLCBhbmQgdGhlbiBzcGluIG9uIDFNICovCisJaWYgKGlsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCXIgPSBSQVRFXzZNX0lEWDsKKwllbHNlCisJCXIgPSBSQVRFXzFNX0lEWDsKKworCWlmIChyID49IElMX0ZJUlNUX0NDS19SQVRFICYmIHIgPD0gSUxfTEFTVF9DQ0tfUkFURSkKKwkJcmF0ZV9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOworCisJcmF0ZV9mbGFncyB8PQorCSAgICBpbDQ5NjVfZmlyc3RfYW50ZW5uYShpbC0+aHdfcGFyYW1zLgorCQkJCSB2YWxpZF90eF9hbnQpIDw8IFJBVEVfTUNTX0FOVF9QT1M7CisJcmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMzIoaWxfcmF0ZXNbcl0ucGxjcCB8IHJhdGVfZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKQorCQlsaW5rX2NtZC0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzID0gcmF0ZV9uX2ZsYWdzOworCisJbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zayA9CisJICAgIGlsNDk2NV9maXJzdF9hbnRlbm5hKGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50KTsKKworCWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0KKwkgICAgaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiB+aWw0OTY1X2ZpcnN0X2FudGVubmEoaWwtPmh3X3BhcmFtcy4KKwkJCQkJCQkgICAgICAgdmFsaWRfdHhfYW50KTsKKwlpZiAoIWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrKSB7CisJCWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0gQU5UX0FCOworCX0gZWxzZSBpZiAoaWw0OTY1X251bV9vZl9hbnQoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpID09IDIpIHsKKwkJbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQorCQkgICAgaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJfQorCisJbGlua19jbWQtPmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCA9IExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9ERUY7CisJbGlua19jbWQtPmFnZ19wYXJhbXMuYWdnX3RpbWVfbGltaXQgPQorCSAgICBjcHVfdG9fbGUxNihMSU5LX1FVQUxfQUdHX1RJTUVfTElNSVRfREVGKTsKKworCWxpbmtfY21kLT5zdGFfaWQgPSBzdGFfaWQ7CisKKwlyZXR1cm4gbGlua19jbWQ7Cit9CisKKy8qCisgKiBpbDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24gLSBBZGQgdGhlIHNwZWNpYWwgSUJTUyBCU1NJRCBzdGF0aW9uCisgKgorICogRnVuY3Rpb24gc2xlZXBzLgorICovCitpbnQKK2lsNDk2NV9hZGRfYnNzaWRfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSBjb25zdCB1OCAqYWRkciwgdTggKnN0YV9pZF9yKQoreworCWludCByZXQ7CisJdTggc3RhX2lkOworCXN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpsaW5rX2NtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHN0YV9pZF9yKQorCQkqc3RhX2lkX3IgPSBJTF9JTlZBTElEX1NUQVRJT047CisKKwlyZXQgPSBpbF9hZGRfc3RhdGlvbl9jb21tb24oaWwsIGN0eCwgYWRkciwgMCwgTlVMTCwgJnN0YV9pZCk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE1cbiIsIGFkZHIpOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmIChzdGFfaWRfcikKKwkJKnN0YV9pZF9yID0gc3RhX2lkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSUxfU1RBX0xPQ0FMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJLyogU2V0IHVwIGRlZmF1bHQgcmF0ZSBzY2FsaW5nIHRhYmxlIGluIGRldmljZSdzIHN0YXRpb24gdGFibGUgKi8KKwlsaW5rX2NtZCA9IGlsNDk2NV9zdGFfYWxsb2NfbHEoaWwsIHN0YV9pZCk7CisJaWYgKCFsaW5rX2NtZCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0aWFsaXplIHJhdGUgc2NhbGluZyBmb3Igc3RhdGlvbiAlcE0uXG4iLAorCQkgICAgICAgYWRkcik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldCA9IGlsX3NlbmRfbHFfY21kKGlsLCBjdHgsIGxpbmtfY21kLCBDTURfU1lOQywgdHJ1ZSk7CisJaWYgKHJldCkKKwkJSUxfRVJSKCJMaW5rIHF1YWxpdHkgY29tbWFuZCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IGxpbmtfY21kOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSBib29sIHNlbmRfaWZfZW1wdHkpCit7CisJaW50IGksIG5vdF9lbXB0eSA9IDA7CisJdTggYnVmZltzaXplb2Yoc3RydWN0IGlsX3dlcF9jbWQpICsKKwkJc2l6ZW9mKHN0cnVjdCBpbF93ZXBfa2V5KSAqIFdFUF9LRVlTX01BWF07CisJc3RydWN0IGlsX3dlcF9jbWQgKndlcF9jbWQgPSAoc3RydWN0IGlsX3dlcF9jbWQgKilidWZmOworCXNpemVfdCBjbWRfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWxfd2VwX2NtZCk7CisJc3RydWN0IGlsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gY3R4LT53ZXBfa2V5X2NtZCwKKwkJLmRhdGEgPSB3ZXBfY21kLAorCQkuZmxhZ3MgPSBDTURfU1lOQywKKwl9OworCisJbWlnaHRfc2xlZXAoKTsKKworCW1lbXNldCh3ZXBfY21kLCAwLAorCSAgICAgICBjbWRfc2l6ZSArIChzaXplb2Yoc3RydWN0IGlsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVNfTUFYOyBpKyspIHsKKwkJd2VwX2NtZC0+a2V5W2ldLmtleV9pZHggPSBpOworCQlpZiAoY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZSkgeworCQkJd2VwX2NtZC0+a2V5W2ldLmtleV9vZmZzZXQgPSBpOworCQkJbm90X2VtcHR5ID0gMTsKKwkJfSBlbHNlIHsKKwkJCXdlcF9jbWQtPmtleVtpXS5rZXlfb2Zmc2V0ID0gV0VQX0lOVkFMSURfT0ZGU0VUOworCQl9CisKKwkJd2VwX2NtZC0+a2V5W2ldLmtleV9zaXplID0gY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZTsKKwkJbWVtY3B5KCZ3ZXBfY21kLT5rZXlbaV0ua2V5WzNdLCBjdHgtPndlcF9rZXlzW2ldLmtleSwKKwkJICAgICAgIGN0eC0+d2VwX2tleXNbaV0ua2V5X3NpemUpOworCX0KKworCXdlcF9jbWQtPmdsb2JhbF9rZXlfdHlwZSA9IFdFUF9LRVlfV0VQX1RZUEU7CisJd2VwX2NtZC0+bnVtX2tleXMgPSBXRVBfS0VZU19NQVg7CisKKwljbWRfc2l6ZSArPSBzaXplb2Yoc3RydWN0IGlsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYOworCisJY21kLmxlbiA9IGNtZF9zaXplOworCisJaWYgKG5vdF9lbXB0eSB8fCBzZW5kX2lmX2VtcHR5KQorCQlyZXR1cm4gaWxfc2VuZF9jbWQoaWwsICZjbWQpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJcmV0dXJuIGlsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChpbCwgY3R4LCBmYWxzZSk7Cit9CisKK2ludAoraWw0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mKQoreworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJRF9XRVAoIlJlbW92aW5nIGRlZmF1bHQgV0VQIGtleTogaWR4PSVkXG4iLCBrZXljb25mLT5rZXlpZHgpOworCisJbWVtc2V0KCZjdHgtPndlcF9rZXlzW2tleWNvbmYtPmtleWlkeF0sIDAsIHNpemVvZihjdHgtPndlcF9rZXlzWzBdKSk7CisJaWYgKGlsX2lzX3Jma2lsbChpbCkpIHsKKwkJRF9XRVAoIk5vdCBzZW5kaW5nIENfV0VQS0VZIGNvbW1hbmQgZHVlIHRvIFJGS0lMTC5cbiIpOworCQkvKiBidXQga2V5cyBpbiBkZXZpY2UgYXJlIGNsZWFyIGFueXdheSBzbyByZXR1cm4gc3VjY2VzcyAqLworCQlyZXR1cm4gMDsKKwl9CisJcmV0ID0gaWw0OTY1X3N0YXRpY193ZXBrZXlfY21kKGlsLCBjdHgsIDEpOworCURfV0VQKCJSZW1vdmUgZGVmYXVsdCBXRVAga2V5OiBpZHg9JWQgcmV0PSVkXG4iLCBrZXljb25mLT5rZXlpZHgsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK2lsNDk2NV9zZXRfZGVmYXVsdF93ZXBfa2V5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZikKK3sKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWlmIChrZXljb25mLT5rZXlsZW4gIT0gV0VQX0tFWV9MRU5fMTI4ICYmCisJICAgIGtleWNvbmYtPmtleWxlbiAhPSBXRVBfS0VZX0xFTl82NCkgeworCQlEX1dFUCgiQmFkIFdFUCBrZXkgbGVuZ3RoICVkXG4iLCBrZXljb25mLT5rZXlsZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlrZXljb25mLT5mbGFncyAmPSB+SUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOworCWtleWNvbmYtPmh3X2tleV9pZHggPSBIV19LRVlfREVGQVVMVDsKKwlpbC0+c3RhdGlvbnNbY3R4LT5hcF9zdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOworCisJY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleV9zaXplID0ga2V5Y29uZi0+a2V5bGVuOworCW1lbWNweSgmY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleSwgJmtleWNvbmYtPmtleSwKKwkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKKworCXJldCA9IGlsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChpbCwgY3R4LCBmYWxzZSk7CisJRF9XRVAoIlNldCBkZWZhdWx0IFdFUCBrZXk6IGxlbj0lZCBpZHg9JWQgcmV0PSVkXG4iLCBrZXljb25mLT5rZXlsZW4sCisJICAgICAga2V5Y29uZi0+a2V5aWR4LCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAoraWw0OTY1X3NldF93ZXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLCB1OCBzdGFfaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlfX2xlMTYga2V5X2ZsYWdzID0gMDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWtleWNvbmYtPmZsYWdzICY9IH5JRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7CisKKwlrZXlfZmxhZ3MgfD0gKFNUQV9LRVlfRkxHX1dFUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKKwlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7CisJa2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOworCisJaWYgKGtleWNvbmYtPmtleWxlbiA9PSBXRVBfS0VZX0xFTl8xMjgpCisJCWtleV9mbGFncyB8PSBTVEFfS0VZX0ZMR19LRVlfU0laRV9NU0s7CisKKwlpZiAoc3RhX2lkID09IGN0eC0+YmNhc3Rfc3RhX2lkKQorCQlrZXlfZmxhZ3MgfD0gU1RBX0tFWV9NVUxUSUNBU1RfTVNLOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5jaXBoZXIgPSBrZXljb25mLT5jaXBoZXI7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXlsZW4gPSBrZXljb25mLT5rZXlsZW47CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXlpZHggPSBrZXljb25mLT5rZXlpZHg7CisKKwltZW1jcHkoaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKworCW1lbWNweSgmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlbM10sIGtleWNvbmYtPmtleSwKKwkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKKworCWlmICgoaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS4KKwkgICAgIGtleV9mbGFncyAmIFNUQV9LRVlfRkxHX0VOQ1JZUFRfTVNLKSA9PSBTVEFfS0VZX0ZMR19OT19FTkMpCisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9CisJCSAgICBpbF9nZXRfZnJlZV91Y29kZV9rZXlfaWR4KGlsKTsKKwkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQorCSAqIGluIHVDb2RlLiAqLworCisJV0FSTihpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VULAorCSAgICAgIm5vIHNwYWNlIGZvciBhIG5ldyBrZXkiKTsKKworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0ga2V5X2ZsYWdzOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKworCW1lbWNweSgmc3RhX2NtZCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gaWxfc2VuZF9hZGRfc3RhKGlsLCAmc3RhX2NtZCwgQ01EX1NZTkMpOworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfc2V0X2NjbXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX19sZTE2IGtleV9mbGFncyA9IDA7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhX2NtZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlrZXlfZmxhZ3MgfD0gKFNUQV9LRVlfRkxHX0NDTVAgfCBTVEFfS0VZX0ZMR19NQVBfS0VZX01TSyk7CisJa2V5X2ZsYWdzIHw9IGNwdV90b19sZTE2KGtleWNvbmYtPmtleWlkeCA8PCBTVEFfS0VZX0ZMR19LRVlJRF9QT1MpOworCWtleV9mbGFncyAmPSB+U1RBX0tFWV9GTEdfSU5WQUxJRDsKKworCWlmIChzdGFfaWQgPT0gY3R4LT5iY2FzdF9zdGFfaWQpCisJCWtleV9mbGFncyB8PSBTVEFfS0VZX01VTFRJQ0FTVF9NU0s7CisKKwlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5jaXBoZXIgPSBrZXljb25mLT5jaXBoZXI7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXlsZW4gPSBrZXljb25mLT5rZXlsZW47CisKKwltZW1jcHkoaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKKworCW1lbWNweShpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleSwga2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOworCisJaWYgKChpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LgorCSAgICAga2V5X2ZsYWdzICYgU1RBX0tFWV9GTEdfRU5DUllQVF9NU0spID09IFNUQV9LRVlfRkxHX05PX0VOQykKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID0KKwkJICAgIGlsX2dldF9mcmVlX3Vjb2RlX2tleV9pZHgoaWwpOworCS8qIGVsc2UsIHdlIGFyZSBvdmVycmlkaW5nIGFuIGV4aXN0aW5nIGtleSA9PiBubyBuZWVkIHRvIGFsbG9jYXRlZCByb29tCisJICogaW4gdUNvZGUuICovCisKKwlXQVJOKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQsCisJICAgICAibm8gc3BhY2UgZm9yIGEgbmV3IGtleSIpOworCisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCisJbWVtY3B5KCZzdGFfY21kLCAmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbF9zZW5kX2FkZF9zdGEoaWwsICZzdGFfY21kLCBDTURfU1lOQyk7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9zZXRfdGtpcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLCB1OCBzdGFfaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKwlfX2xlMTYga2V5X2ZsYWdzID0gMDsKKworCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfVEtJUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKKwlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7CisJa2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOworCisJaWYgKHN0YV9pZCA9PSBjdHgtPmJjYXN0X3N0YV9pZCkKKwkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfTVVMVElDQVNUX01TSzsKKworCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKKwlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0gMTY7CisKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkuCisJICAgICBrZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykgPT0gU1RBX0tFWV9GTEdfTk9fRU5DKQorCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQorCQkgICAgaWxfZ2V0X2ZyZWVfdWNvZGVfa2V5X2lkeChpbCk7CisJLyogZWxzZSwgd2UgYXJlIG92ZXJyaWRpbmcgYW4gZXhpc3Rpbmcga2V5ID0+IG5vIG5lZWQgdG8gYWxsb2NhdGVkIHJvb20KKwkgKiBpbiB1Q29kZS4gKi8KKworCVdBUk4oaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKKwkgICAgICJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IGtleV9mbGFnczsKKworCS8qIFRoaXMgY29weSBpcyBhY3V0YWxseSBub3QgbmVlZGVkOiB3ZSBnZXQgdGhlIGtleSB3aXRoIGVhY2ggVFggKi8KKwltZW1jcHkoaWwtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwgMTYpOworCisJbWVtY3B5KGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksIDE2KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZAoraWw0OTY1X3VwZGF0ZV90a2lwX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwgdTE2ICogcGhhc2Uxa2V5KQoreworCXU4IHN0YV9pZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJaWYgKGlsX3NjYW5fY2FuY2VsKGlsKSkgeworCQkvKiBjYW5jZWwgc2NhbiBmYWlsZWQsIGp1c3QgbGl2ZSB3LyBiYWQga2V5IGFuZCByZWx5CisJCSAgIGJyaWVmbHkgb24gU1cgZGVjcnlwdGlvbiAqLworCQlyZXR1cm47CisJfQorCisJc3RhX2lkID0gaWxfc3RhX2lkX29yX2Jyb2FkY2FzdChpbCwgY3R4LCBzdGEpOworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHNjX2J5dGUyID0gKHU4KSBpdjMyOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS50a2lwX3J4X3R0YWtbaV0gPQorCQkgICAgY3B1X3RvX2xlMTYocGhhc2Uxa2V5W2ldKTsKKworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKworCWlsX3NlbmRfYWRkX3N0YShpbCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCit9CisKK2ludAoraWw0OTY1X3JlbW92ZV9keW5hbWljX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IGtleV9mbGFnczsKKwl1OCBrZXlpZHg7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhX2NtZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwljdHgtPmtleV9tYXBwaW5nX2tleXMtLTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlrZXlfZmxhZ3MgPSBsZTE2X3RvX2NwdShpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyk7CisJa2V5aWR4ID0gKGtleV9mbGFncyA+PiBTVEFfS0VZX0ZMR19LRVlJRF9QT1MpICYgMHgzOworCisJRF9XRVAoIlJlbW92ZSBkeW5hbWljIGtleTogaWR4PSVkIHN0YT0lZFxuIiwga2V5Y29uZi0+a2V5aWR4LCBzdGFfaWQpOworCisJaWYgKGtleWNvbmYtPmtleWlkeCAhPSBrZXlpZHgpIHsKKwkJLyogV2UgbmVlZCB0byByZW1vdmUgYSBrZXkgd2l0aCBpZHggZGlmZmVyZW50IHRoYXQgdGhlIG9uZQorCQkgKiBpbiB0aGUgdUNvZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUga2V5IHdlIG5lZWQgdG8gcmVtb3ZlIGhhcworCQkgKiBiZWVuIHJlcGxhY2VkIGJ5IGFub3RoZXIgb25lIHdpdGggZGlmZmVyZW50IGlkeC4KKwkJICogRG9uJ3QgZG8gYW55dGhpbmcgYW5kIHJldHVybiBvaworCQkgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VUKSB7CisJCUlMX1dBUk4oIlJlbW92aW5nIHdyb25nIGtleSAlZCAweCV4XG4iLCBrZXljb25mLT5rZXlpZHgsCisJCQlrZXlfZmxhZ3MpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQKKwkgICAgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCwgJmlsLT51Y29kZV9rZXlfdGFibGUpKQorCQlJTF9FUlIoImlkeCAlZCBub3QgdXNlZCBpbiB1Q29kZSBrZXkgdGFibGUuXG4iLAorCQkgICAgICAgaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0KTsKKwltZW1zZXQoJmlsLT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8sIDAsIHNpemVvZihzdHJ1Y3QgaWxfaHdfa2V5KSk7CisJbWVtc2V0KCZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LCAwLCBzaXplb2Yoc3RydWN0IGlsNDk2NV9rZXlpbmZvKSk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPQorCSAgICBTVEFfS0VZX0ZMR19OT19FTkMgfCBTVEFfS0VZX0ZMR19JTlZBTElEOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9IFdFUF9JTlZBTElEX09GRlNFVDsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkgeworCQlEX1dFUAorCQkgICAgKCJOb3Qgc2VuZGluZyBDX0FERF9TVEEgY29tbWFuZCBiZWNhdXNlIFJGS0lMTCBlbmFibGVkLlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJbWVtY3B5KCZzdGFfY21kLCAmaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAorCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbF9zZW5kX2FkZF9zdGEoaWwsICZzdGFfY21kLCBDTURfU1lOQyk7Cit9CisKK2ludAoraWw0OTY1X3NldF9keW5hbWljX2tleShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsIHU4IHN0YV9pZCkKK3sKKwlpbnQgcmV0OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWN0eC0+a2V5X21hcHBpbmdfa2V5cysrOworCWtleWNvbmYtPmh3X2tleV9pZHggPSBIV19LRVlfRFlOQU1JQzsKKworCXN3aXRjaCAoa2V5Y29uZi0+Y2lwaGVyKSB7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorCQlyZXQgPQorCQkgICAgaWw0OTY1X3NldF9jY21wX2R5bmFtaWNfa2V5X2luZm8oaWwsIGN0eCwga2V5Y29uZiwgc3RhX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgorCQlyZXQgPQorCQkgICAgaWw0OTY1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oaWwsIGN0eCwga2V5Y29uZiwgc3RhX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKKwkJcmV0ID0gaWw0OTY1X3NldF93ZXBfZHluYW1pY19rZXlfaW5mbyhpbCwgY3R4LCBrZXljb25mLCBzdGFfaWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlJTF9FUlIoIlVua25vd24gYWxnOiAlcyBjaXBoZXIgPSAleFxuIiwgX19mdW5jX18sCisJCSAgICAgICBrZXljb25mLT5jaXBoZXIpOworCQlyZXQgPSAtRUlOVkFMOworCX0KKworCURfV0VQKCJTZXQgZHluYW1pYyBrZXk6IGNpcGhlcj0leCBsZW49JWQgaWR4PSVkIHN0YT0lZCByZXQ9JWRcbiIsCisJICAgICAga2V5Y29uZi0+Y2lwaGVyLCBrZXljb25mLT5rZXlsZW4sIGtleWNvbmYtPmtleWlkeCwgc3RhX2lkLCByZXQpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBpbDQ5NjVfYWxsb2NfYmNhc3Rfc3RhdGlvbiAtIGFkZCBicm9hZGNhc3Qgc3RhdGlvbiBpbnRvIGRyaXZlcidzIHN0YXRpb24gdGFibGUuCisgKgorICogVGhpcyBhZGRzIHRoZSBicm9hZGNhc3Qgc3RhdGlvbiBpbnRvIHRoZSBkcml2ZXIncyBzdGF0aW9uIHRhYmxlCisgKiBhbmQgbWFya3MgaXQgZHJpdmVyIGFjdGl2ZSwgc28gdGhhdCBpdCB3aWxsIGJlIHJlc3RvcmVkIHRvIHRoZQorICogZGV2aWNlIGF0IHRoZSBuZXh0IGJlc3QgdGltZS4KKyAqLworaW50CitpbDQ5NjVfYWxsb2NfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCBzdGFfaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJc3RhX2lkID0gaWxfcHJlcF9zdGF0aW9uKGlsLCBjdHgsIGlsX2JjYXN0X2FkZHIsIGZhbHNlLCBOVUxMKTsKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikgeworCQlJTF9FUlIoIlVuYWJsZSB0byBwcmVwYXJlIGJyb2FkY2FzdCBzdGF0aW9uXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfRFJJVkVSX0FDVElWRTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElMX1NUQV9CQ0FTVDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCWxpbmtfY21kID0gaWw0OTY1X3N0YV9hbGxvY19scShpbCwgc3RhX2lkKTsKKwlpZiAoIWxpbmtfY21kKSB7CisJCUlMX0VSUgorCQkgICAgKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIGJjYXN0IHN0YXRpb24uXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxID0gbGlua19jbWQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb24gLSB1cGRhdGUgYnJvYWRjYXN0IHN0YXRpb24ncyBMUSBjb21tYW5kCisgKgorICogT25seSB1c2VkIGJ5IGl3bDQ5NjUuIFBsYWNlZCBoZXJlIHRvIGhhdmUgYWxsIGJjYXN0IHN0YXRpb24gbWFuYWdlbWVudAorICogY29kZSB0b2dldGhlci4KKyAqLworc3RhdGljIGludAoraWw0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kOworCXU4IHN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOworCisJbGlua19jbWQgPSBpbDQ5NjVfc3RhX2FsbG9jX2xxKGlsLCBzdGFfaWQpOworCWlmICghbGlua19jbWQpIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIGJjYXN0IHN0YS5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWYgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxKQorCQlrZnJlZShpbC0+c3RhdGlvbnNbc3RhX2lkXS5scSk7CisJZWxzZQorCQlEX0lORk8oIkJjYXN0IHN0YSByYXRlIHNjYWxpbmcgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLlxuIik7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBsaW5rX2NtZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitpbnQKK2lsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiBpbDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb24oaWwsICZpbC0+Y3R4KTsKK30KKworLyoqCisgKiBpbDQ5NjVfc3RhX3R4X21vZGlmeV9lbmFibGVfdGlkIC0gRW5hYmxlIFR4IGZvciB0aGlzIFRJRCBpbiBzdGF0aW9uIHRhYmxlCisgKi8KK2ludAoraWw0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIGludCB0aWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCS8qIFJlbW92ZSAiZGlzYWJsZSIgZmxhZywgdG8gZW5hYmxlIFR4IGZvciB0aGlzIFRJRCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9USURfRElTQUJMRV9UWDsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEudGlkX2Rpc2FibGVfdHggJj0gY3B1X3RvX2xlMTYofigxIDw8IHRpZCkpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKK30KKworaW50CitpbDQ5NjVfc3RhX3J4X2FnZ19zdGFydChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCB0aWQsCisJCQl1MTYgc3NuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN0YV9pZDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCXN0YV9pZCA9IGlsX3N0YV9pZChzdGEpOworCWlmIChzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKQorCQlyZXR1cm4gLUVOWElPOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGF0aW9uX2ZsYWdzX21zayA9IDA7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfQUREQkFfVElEX01TSzsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuYWRkX2ltbWVkaWF0ZV9iYV90aWQgPSAodTgpIHRpZDsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuYWRkX2ltbWVkaWF0ZV9iYV9zc24gPSBjcHVfdG9fbGUxNihzc24pOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKK30KKworaW50CitpbDQ5NjVfc3RhX3J4X2FnZ19zdG9wKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgaW50IHRpZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzdGFfaWQ7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhX2NtZDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlzdGFfaWQgPSBpbF9zdGFfaWQoc3RhKTsKKwlpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikgeworCQlJTF9FUlIoIkludmFsaWQgc3RhdGlvbiBmb3IgQUdHIHRpZCAlZFxuIiwgdGlkKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3NfbXNrID0gMDsKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9ERUxCQV9USURfTVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZCA9ICh1OCkgdGlkOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKK30KKwordm9pZAoraWw0OTY1X3N0YV9tb2RpZnlfc2xlZXBfdHhfY291bnQoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgc3RhX2lkLCBpbnQgY250KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3MgfD0gU1RBX0ZMR19QV1JfU0FWRV9NU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3NfbXNrID0gU1RBX0ZMR19QV1JfU0FWRV9NU0s7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9CisJICAgIFNUQV9NT0RJRllfU0xFRVBfVFhfQ09VTlRfTVNLOworCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zbGVlcF90eF9jb3VudCA9IGNwdV90b19sZTE2KGNudCk7CisJaWwtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOworCWlsX3NlbmRfYWRkX3N0YShpbCwgJmlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworfQorCit2b2lkCitpbDQ5NjVfdXBkYXRlX2NoYWluX2ZsYWdzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpZiAoaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikgeworCQlpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKGlsLCAmaWwtPmN0eCk7CisJCWlmIChpbC0+Y3R4LmFjdGl2ZS5yeF9jaGFpbiAhPSBpbC0+Y3R4LnN0YWdpbmcucnhfY2hhaW4pCisJCQlpbF9jb21taXRfcnhvbihpbCwgJmlsLT5jdHgpOworCX0KK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9jbGVhcl9mcmVlX2ZyYW1lcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKKworCURfSU5GTygiJWQgZnJhbWVzIG9uIHByZS1hbGxvY2F0ZWQgaGVhcCBvbiBjbGVhci5cbiIsIGlsLT5mcmFtZXNfY291bnQpOworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZpbC0+ZnJlZV9mcmFtZXMpKSB7CisJCWVsZW1lbnQgPSBpbC0+ZnJlZV9mcmFtZXMubmV4dDsKKwkJbGlzdF9kZWwoZWxlbWVudCk7CisJCWtmcmVlKGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGlsX2ZyYW1lLCBsaXN0KSk7CisJCWlsLT5mcmFtZXNfY291bnQtLTsKKwl9CisKKwlpZiAoaWwtPmZyYW1lc19jb3VudCkgeworCQlJTF9XQVJOKCIlZCBmcmFtZXMgc3RpbGwgaW4gdXNlLiAgRGlkIHdlIGxvc2Ugb25lP1xuIiwKKwkJCWlsLT5mcmFtZXNfY291bnQpOworCQlpbC0+ZnJhbWVzX2NvdW50ID0gMDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWxfZnJhbWUgKgoraWw0OTY1X2dldF9mcmVlX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfZnJhbWUgKmZyYW1lOworCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7CisJaWYgKGxpc3RfZW1wdHkoJmlsLT5mcmVlX2ZyYW1lcykpIHsKKwkJZnJhbWUgPSBremFsbG9jKHNpemVvZigqZnJhbWUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFmcmFtZSkgeworCQkJSUxfRVJSKCJDb3VsZCBub3QgYWxsb2NhdGUgZnJhbWUhXG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaWwtPmZyYW1lc19jb3VudCsrOworCQlyZXR1cm4gZnJhbWU7CisJfQorCisJZWxlbWVudCA9IGlsLT5mcmVlX2ZyYW1lcy5uZXh0OworCWxpc3RfZGVsKGVsZW1lbnQpOworCXJldHVybiBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpbF9mcmFtZSwgbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfZnJlZV9mcmFtZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9mcmFtZSAqZnJhbWUpCit7CisJbWVtc2V0KGZyYW1lLCAwLCBzaXplb2YoKmZyYW1lKSk7CisJbGlzdF9hZGQoJmZyYW1lLT5saXN0LCAmaWwtPmZyZWVfZnJhbWVzKTsKK30KKworc3RhdGljIHUzMgoraWw0OTY1X2ZpbGxfYmVhY29uX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSBpbnQgbGVmdCkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKCFpbC0+YmVhY29uX3NrYikKKwkJcmV0dXJuIDA7CisKKwlpZiAoaWwtPmJlYWNvbl9za2ItPmxlbiA+IGxlZnQpCisJCXJldHVybiAwOworCisJbWVtY3B5KGhkciwgaWwtPmJlYWNvbl9za2ItPmRhdGEsIGlsLT5iZWFjb25fc2tiLT5sZW4pOworCisJcmV0dXJuIGlsLT5iZWFjb25fc2tiLT5sZW47Cit9CisKKy8qIFBhcnNlIHRoZSBiZWFjb24gZnJhbWUgdG8gZmluZCB0aGUgVElNIGVsZW1lbnQgYW5kIHNldCB0aW1faWR4ICYgdGltX3NpemUgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfc2V0X2JlYWNvbl90aW0oc3RydWN0IGlsX3ByaXYgKmlsLAorCQkgICAgICBzdHJ1Y3QgaWxfdHhfYmVhY29uX2NtZCAqdHhfYmVhY29uX2NtZCwgdTggKiBiZWFjb24sCisJCSAgICAgIHUzMiBmcmFtZV9zaXplKQoreworCXUxNiB0aW1faWR4OworCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKiliZWFjb247CisKKwkvKgorCSAqIFRoZSBpZHggaXMgcmVsYXRpdmUgdG8gZnJhbWUgc3RhcnQgYnV0IHdlIHN0YXJ0IGxvb2tpbmcgYXQgdGhlCisJICogdmFyaWFibGUtbGVuZ3RoIHBhcnQgb2YgdGhlIGJlYWNvbi4KKwkgKi8KKwl0aW1faWR4ID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGUgLSBiZWFjb247CisKKwkvKiBQYXJzZSB2YXJpYWJsZS1sZW5ndGggZWxlbWVudHMgb2YgYmVhY29uIHRvIGZpbmQgV0xBTl9FSURfVElNICovCisJd2hpbGUgKCh0aW1faWR4IDwgKGZyYW1lX3NpemUgLSAyKSkgJiYKKwkgICAgICAgKGJlYWNvblt0aW1faWR4XSAhPSBXTEFOX0VJRF9USU0pKQorCQl0aW1faWR4ICs9IGJlYWNvblt0aW1faWR4ICsgMV0gKyAyOworCisJLyogSWYgVElNIGZpZWxkIHdhcyBmb3VuZCwgc2V0IHZhcmlhYmxlcyAqLworCWlmICgodGltX2lkeCA8IChmcmFtZV9zaXplIC0gMSkpICYmIChiZWFjb25bdGltX2lkeF0gPT0gV0xBTl9FSURfVElNKSkgeworCQl0eF9iZWFjb25fY21kLT50aW1faWR4ID0gY3B1X3RvX2xlMTYodGltX2lkeCk7CisJCXR4X2JlYWNvbl9jbWQtPnRpbV9zaXplID0gYmVhY29uW3RpbV9pZHggKyAxXTsKKwl9IGVsc2UKKwkJSUxfV0FSTigiVW5hYmxlIHRvIGZpbmQgVElNIEVsZW1lbnQgaW4gYmVhY29uXG4iKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAoraWw0OTY1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2ZyYW1lICpmcmFtZSkKK3sKKwlzdHJ1Y3QgaWxfdHhfYmVhY29uX2NtZCAqdHhfYmVhY29uX2NtZDsKKwl1MzIgZnJhbWVfc2l6ZTsKKwl1MzIgcmF0ZV9mbGFnczsKKwl1MzIgcmF0ZTsKKwkvKgorCSAqIFdlIGhhdmUgdG8gc2V0IHVwIHRoZSBUWCBjb21tYW5kLCB0aGUgVFggQmVhY29uIGNvbW1hbmQsIGFuZCB0aGUKKwkgKiBiZWFjb24gY29udGVudHMuCisJICovCisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKCFpbC0+YmVhY29uX2N0eCkgeworCQlJTF9FUlIoInRyeWluZyB0byBidWlsZCBiZWFjb24gdy9vIGJlYWNvbiBjb250ZXh0IVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIEluaXRpYWxpemUgbWVtb3J5ICovCisJdHhfYmVhY29uX2NtZCA9ICZmcmFtZS0+dS5iZWFjb247CisJbWVtc2V0KHR4X2JlYWNvbl9jbWQsIDAsIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOworCisJLyogU2V0IHVwIFRYIGJlYWNvbiBjb250ZW50cyAqLworCWZyYW1lX3NpemUgPQorCSAgICBpbDQ5NjVfZmlsbF9iZWFjb25fZnJhbWUoaWwsIHR4X2JlYWNvbl9jbWQtPmZyYW1lLAorCQkJCSAgICAgc2l6ZW9mKGZyYW1lLT51KSAtIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOworCWlmIChXQVJOX09OX09OQ0UoZnJhbWVfc2l6ZSA+IE1BWF9NUERVX1NJWkUpKQorCQlyZXR1cm4gMDsKKwlpZiAoIWZyYW1lX3NpemUpCisJCXJldHVybiAwOworCisJLyogU2V0IHVwIFRYIGNvbW1hbmQgZmllbGRzICovCisJdHhfYmVhY29uX2NtZC0+dHgubGVuID0gY3B1X3RvX2xlMTYoKHUxNikgZnJhbWVfc2l6ZSk7CisJdHhfYmVhY29uX2NtZC0+dHguc3RhX2lkID0gaWwtPmJlYWNvbl9jdHgtPmJjYXN0X3N0YV9pZDsKKwl0eF9iZWFjb25fY21kLT50eC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKKwl0eF9iZWFjb25fY21kLT50eC50eF9mbGFncyA9CisJICAgIFRYX0NNRF9GTEdfU0VRX0NUTF9NU0sgfCBUWF9DTURfRkxHX1RTRl9NU0sgfAorCSAgICBUWF9DTURfRkxHX1NUQV9SQVRFX01TSzsKKworCS8qIFNldCB1cCBUWCBiZWFjb24gY29tbWFuZCBmaWVsZHMgKi8KKwlpbDQ5NjVfc2V0X2JlYWNvbl90aW0oaWwsIHR4X2JlYWNvbl9jbWQsICh1OCAqKSB0eF9iZWFjb25fY21kLT5mcmFtZSwKKwkJCSAgICAgIGZyYW1lX3NpemUpOworCisJLyogU2V0IHVwIHBhY2tldCByYXRlIGFuZCBmbGFncyAqLworCXJhdGUgPSBpbF9nZXRfbG93ZXN0X3BsY3AoaWwsIGlsLT5iZWFjb25fY3R4KTsKKwlpbDQ5NjVfdG9nZ2xlX3R4X2FudChpbCwgJmlsLT5tZ210X3R4X2FudCwgaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOworCXJhdGVfZmxhZ3MgPSBCSVQoaWwtPm1nbXRfdHhfYW50KSA8PCBSQVRFX01DU19BTlRfUE9TOworCWlmICgocmF0ZSA+PSBJTF9GSVJTVF9DQ0tfUkFURSkgJiYgKHJhdGUgPD0gSUxfTEFTVF9DQ0tfUkFURSkpCisJCXJhdGVfZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKKwl0eF9iZWFjb25fY21kLT50eC5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUzMihyYXRlIHwgcmF0ZV9mbGFncyk7CisKKwlyZXR1cm4gc2l6ZW9mKCp0eF9iZWFjb25fY21kKSArIGZyYW1lX3NpemU7Cit9CisKK2ludAoraWw0OTY1X3NlbmRfYmVhY29uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX2ZyYW1lICpmcmFtZTsKKwl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKKwlpbnQgcmM7CisKKwlmcmFtZSA9IGlsNDk2NV9nZXRfZnJlZV9mcmFtZShpbCk7CisJaWYgKCFmcmFtZSkgeworCQlJTF9FUlIoIkNvdWxkIG5vdCBvYnRhaW4gZnJlZSBmcmFtZSBidWZmZXIgZm9yIGJlYWNvbiAiCisJCSAgICAgICAiY29tbWFuZC5cbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlmcmFtZV9zaXplID0gaWw0OTY1X2h3X2dldF9iZWFjb25fY21kKGlsLCBmcmFtZSk7CisJaWYgKCFmcmFtZV9zaXplKSB7CisJCUlMX0VSUigiRXJyb3IgY29uZmlndXJpbmcgdGhlIGJlYWNvbiBjb21tYW5kXG4iKTsKKwkJaWw0OTY1X2ZyZWVfZnJhbWUoaWwsIGZyYW1lKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmMgPSBpbF9zZW5kX2NtZF9wZHUoaWwsIENfVFhfQkVBQ09OLCBmcmFtZV9zaXplLCAmZnJhbWUtPnUuY21kWzBdKTsKKworCWlsNDk2NV9mcmVlX2ZyYW1lKGlsLCBmcmFtZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbmxpbmUgZG1hX2FkZHJfdAoraWw0OTY1X3RmZF90Yl9nZXRfYWRkcihzdHJ1Y3QgaWxfdGZkICp0ZmQsIHU4IGlkeCkKK3sKKwlzdHJ1Y3QgaWxfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOworCisJZG1hX2FkZHJfdCBhZGRyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZ0Yi0+bG8pOworCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiBzaXplb2YodTMyKSkKKwkJYWRkciB8PQorCQkgICAgKChkbWFfYWRkcl90KSAobGUxNl90b19jcHUodGItPmhpX25fbGVuKSAmIDB4RikgPDwgMTYpIDw8CisJCSAgICAxNjsKKworCXJldHVybiBhZGRyOworfQorCitzdGF0aWMgaW5saW5lIHUxNgoraWw0OTY1X3RmZF90Yl9nZXRfbGVuKHN0cnVjdCBpbF90ZmQgKnRmZCwgdTggaWR4KQoreworCXN0cnVjdCBpbF90ZmRfdGIgKnRiID0gJnRmZC0+dGJzW2lkeF07CisKKwlyZXR1cm4gbGUxNl90b19jcHUodGItPmhpX25fbGVuKSA+PiA0OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsNDk2NV90ZmRfc2V0X3RiKHN0cnVjdCBpbF90ZmQgKnRmZCwgdTggaWR4LCBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4pCit7CisJc3RydWN0IGlsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKKwl1MTYgaGlfbl9sZW4gPSBsZW4gPDwgNDsKKworCXB1dF91bmFsaWduZWRfbGUzMihhZGRyLCAmdGItPmxvKTsKKwlpZiAoc2l6ZW9mKGRtYV9hZGRyX3QpID4gc2l6ZW9mKHUzMikpCisJCWhpX25fbGVuIHw9ICgoYWRkciA+PiAxNikgPj4gMTYpICYgMHhGOworCisJdGItPmhpX25fbGVuID0gY3B1X3RvX2xlMTYoaGlfbl9sZW4pOworCisJdGZkLT5udW1fdGJzID0gaWR4ICsgMTsKK30KKworc3RhdGljIGlubGluZSB1OAoraWw0OTY1X3RmZF9nZXRfbnVtX3RicyhzdHJ1Y3QgaWxfdGZkICp0ZmQpCit7CisJcmV0dXJuIHRmZC0+bnVtX3RicyAmIDB4MWY7Cit9CisKKy8qKgorICogaWw0OTY1X2h3X3R4cV9mcmVlX3RmZCAtIEZyZWUgYWxsIGNodW5rcyByZWZlcmVuY2VkIGJ5IFRGRCBbdHhxLT5xLnJlYWRfcHRyXQorICogQGlsIC0gZHJpdmVyIGlsYXRlIGRhdGEKKyAqIEB0eHEgLSB0eCBxdWV1ZQorICoKKyAqIERvZXMgTk9UIGFkdmFuY2UgYW55IFRGRCBjaXJjdWxhciBidWZmZXIgcmVhZC93cml0ZSBpZHhlcworICogRG9lcyBOT1QgZnJlZSB0aGUgVEZEIGl0c2VsZiAod2hpY2ggaXMgd2l0aGluIGNpcmN1bGFyIGJ1ZmZlcikKKyAqLwordm9pZAoraWw0OTY1X2h3X3R4cV9mcmVlX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKQoreworCXN0cnVjdCBpbF90ZmQgKnRmZF90bXAgPSAoc3RydWN0IGlsX3RmZCAqKXR4cS0+dGZkczsKKwlzdHJ1Y3QgaWxfdGZkICp0ZmQ7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IGlsLT5wY2lfZGV2OworCWludCBpZHggPSB0eHEtPnEucmVhZF9wdHI7CisJaW50IGk7CisJaW50IG51bV90YnM7CisKKwl0ZmQgPSAmdGZkX3RtcFtpZHhdOworCisJLyogU2FuaXR5IGNoZWNrIG9uIG51bWJlciBvZiBjaHVua3MgKi8KKwludW1fdGJzID0gaWw0OTY1X3RmZF9nZXRfbnVtX3Ricyh0ZmQpOworCisJaWYgKG51bV90YnMgPj0gSUxfTlVNX09GX1RCUykgeworCQlJTF9FUlIoIlRvbyBtYW55IGNodW5rczogJWlcbiIsIG51bV90YnMpOworCQkvKiBAdG9kbyBpc3N1ZSBmYXRhbCBlcnJvciwgaXQgaXMgcXVpdGUgc2VyaW91cyBzaXR1YXRpb24gKi8KKwkJcmV0dXJuOworCX0KKworCS8qIFVubWFwIHR4X2NtZCAqLworCWlmIChudW1fdGJzKQorCQlwY2lfdW5tYXBfc2luZ2xlKGRldiwgZG1hX3VubWFwX2FkZHIoJnR4cS0+bWV0YVtpZHhdLCBtYXBwaW5nKSwKKwkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2lkeF0sIGxlbiksCisJCQkJIFBDSV9ETUFfQklESVJFQ1RJT05BTCk7CisKKwkvKiBVbm1hcCBjaHVua3MsIGlmIGFueS4gKi8KKwlmb3IgKGkgPSAxOyBpIDwgbnVtX3RiczsgaSsrKQorCQlwY2lfdW5tYXBfc2luZ2xlKGRldiwgaWw0OTY1X3RmZF90Yl9nZXRfYWRkcih0ZmQsIGkpLAorCQkJCSBpbDQ5NjVfdGZkX3RiX2dldF9sZW4odGZkLCBpKSwKKwkJCQkgUENJX0RNQV9UT0RFVklDRSk7CisKKwkvKiBmcmVlIFNLQiAqLworCWlmICh0eHEtPnR4YikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCXNrYiA9IHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiOworCisJCS8qIGNhbiBiZSBjYWxsZWQgZnJvbSBpcnFzLWRpc2FibGVkIGNvbnRleHQgKi8KKwkJaWYgKHNrYikgeworCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJCXR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiID0gTlVMTDsKKwkJfQorCX0KK30KKworaW50CitpbDQ5NjVfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEsCisJCQkJZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuLCB1OCByZXNldCwgdTggcGFkKQoreworCXN0cnVjdCBpbF9xdWV1ZSAqcTsKKwlzdHJ1Y3QgaWxfdGZkICp0ZmQsICp0ZmRfdG1wOworCXUzMiBudW1fdGJzOworCisJcSA9ICZ0eHEtPnE7CisJdGZkX3RtcCA9IChzdHJ1Y3QgaWxfdGZkICopdHhxLT50ZmRzOworCXRmZCA9ICZ0ZmRfdG1wW3EtPndyaXRlX3B0cl07CisKKwlpZiAocmVzZXQpCisJCW1lbXNldCh0ZmQsIDAsIHNpemVvZigqdGZkKSk7CisKKwludW1fdGJzID0gaWw0OTY1X3RmZF9nZXRfbnVtX3Ricyh0ZmQpOworCisJLyogRWFjaCBURkQgY2FuIHBvaW50IHRvIGEgbWF4aW11bSAyMCBUeCBidWZmZXJzICovCisJaWYgKG51bV90YnMgPj0gSUxfTlVNX09GX1RCUykgeworCQlJTF9FUlIoIkVycm9yIGNhbiBub3Qgc2VuZCBtb3JlIHRoYW4gJWQgY2h1bmtzXG4iLAorCQkgICAgICAgSUxfTlVNX09GX1RCUyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCUJVR19PTihhZGRyICYgfkRNQV9CSVRfTUFTSygzNikpOworCWlmICh1bmxpa2VseShhZGRyICYgfklMX1RYX0RNQV9NQVNLKSkKKwkJSUxfRVJSKCJVbmFsaWduZWQgYWRkcmVzcyA9ICVsbHhcbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpYWRkcik7CisKKwlpbDQ5NjVfdGZkX3NldF90Yih0ZmQsIG51bV90YnMsIGFkZHIsIGxlbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRlbGwgbmljIHdoZXJlIHRvIGZpbmQgY2lyY3VsYXIgYnVmZmVyIG9mIFR4IEZyYW1lIERlc2NyaXB0b3JzIGZvcgorICogZ2l2ZW4gVHggcXVldWUsIGFuZCBlbmFibGUgdGhlIERNQSBjaGFubmVsIHVzZWQgZm9yIHRoYXQgcXVldWUuCisgKgorICogNDk2NSBzdXBwb3J0cyB1cCB0byAxNiBUeCBxdWV1ZXMgaW4gRFJBTSwgbWFwcGVkIHRvIHVwIHRvIDggVHggRE1BCisgKiBjaGFubmVscyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuCisgKi8KK2ludAoraWw0OTY1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSkKK3sKKwlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOworCisJLyogQ2lyY3VsYXIgYnVmZmVyIChURkQgcXVldWUgaW4gRFJBTSkgcGh5c2ljYWwgYmFzZSBhZGRyZXNzICovCisJaWxfd3IoaWwsIEZINDlfTUVNX0NCQkNfUVVFVUUodHhxX2lkKSwgdHhxLT5xLmRtYV9hZGRyID4+IDgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHZW5lcmljIFJYIGhhbmRsZXIgaW1wbGVtZW50YXRpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfaGRsX2FsaXZlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX2FsaXZlX3Jlc3AgKnBhbGl2ZTsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICpwd29yazsKKworCXBhbGl2ZSA9ICZwa3QtPnUuYWxpdmVfZnJhbWU7CisKKwlEX0lORk8oIkFsaXZlIHVjb2RlIHN0YXR1cyAweCUwOFggcmV2aXNpb24gIiAiMHglMDFYIDB4JTAxWFxuIiwKKwkgICAgICAgcGFsaXZlLT5pc192YWxpZCwgcGFsaXZlLT52ZXJfdHlwZSwgcGFsaXZlLT52ZXJfc3VidHlwZSk7CisKKwlpZiAocGFsaXZlLT52ZXJfc3VidHlwZSA9PSBJTklUSUFMSVpFX1NVQlRZUEUpIHsKKwkJRF9JTkZPKCJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOworCQltZW1jcHkoJmlsLT5jYXJkX2FsaXZlX2luaXQsICZwa3QtPnUuYWxpdmVfZnJhbWUsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2luaXRfYWxpdmVfcmVzcCkpOworCQlwd29yayA9ICZpbC0+aW5pdF9hbGl2ZV9zdGFydDsKKwl9IGVsc2UgeworCQlEX0lORk8oIlJ1bnRpbWUgQWxpdmUgcmVjZWl2ZWQuXG4iKTsKKwkJbWVtY3B5KCZpbC0+Y2FyZF9hbGl2ZSwgJnBrdC0+dS5hbGl2ZV9mcmFtZSwKKwkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWxpdmVfcmVzcCkpOworCQlwd29yayA9ICZpbC0+YWxpdmVfc3RhcnQ7CisJfQorCisJLyogV2UgZGVsYXkgdGhlIEFMSVZFIHJlc3BvbnNlIGJ5IDVtcyB0bworCSAqIGdpdmUgdGhlIEhXIFJGIEtpbGwgdGltZSB0byBhY3RpdmF0ZS4uLiAqLworCWlmIChwYWxpdmUtPmlzX3ZhbGlkID09IFVDT0RFX1ZBTElEX09LKQorCQlxdWV1ZV9kZWxheWVkX3dvcmsoaWwtPndvcmtxdWV1ZSwgcHdvcmssIG1zZWNzX3RvX2ppZmZpZXMoNSkpOworCWVsc2UKKwkJSUxfV0FSTigidUNvZGUgZGlkIG5vdCByZXNwb25kIE9LLlxuIik7Cit9CisKKy8qKgorICogaWw0OTY1X2JnX3N0YXRzX3BlcmlvZGljIC0gVGltZXIgY2FsbGJhY2sgdG8gcXVldWUgc3RhdHMKKyAqCisgKiBUaGlzIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGluIG9yZGVyIHRvIHNlbmQgYSBzdGF0cyByZXF1ZXN0LgorICoKKyAqIFRoaXMgdGltZXIgZnVuY3Rpb24gaXMgY29udGludWFsbHkgcmVzZXQgdG8gZXhlY3V0ZSB3aXRoaW4KKyAqIFJFR19SRUNBTElCX1BFUklPRCBzZWNvbmRzIHNpbmNlIHRoZSBsYXN0IE5fU1RBVFMKKyAqIHdhcyByZWNlaXZlZC4gIFdlIG5lZWQgdG8gZW5zdXJlIHdlIHJlY2VpdmUgdGhlIHN0YXRzIGluIG9yZGVyCisgKiB0byB1cGRhdGUgdGhlIHRlbXBlcmF0dXJlIHVzZWQgZm9yIGNhbGlicmF0aW5nIHRoZSBUWFBPV0VSLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2JnX3N0YXRzX3BlcmlvZGljKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSAoc3RydWN0IGlsX3ByaXYgKilkYXRhOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCS8qIGRvbnQgc2VuZCBob3N0IGNvbW1hbmQgaWYgcmYta2lsbCBpcyBvbiAqLworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKQorCQlyZXR1cm47CisKKwlpbF9zZW5kX3N0YXRzX3JlcXVlc3QoaWwsIENNRF9BU1lOQywgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2hkbF9iZWFjb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWw0OTY1X2JlYWNvbl9ub3RpZiAqYmVhY29uID0KKwkgICAgKHN0cnVjdCBpbDQ5NjVfYmVhY29uX25vdGlmICopcGt0LT51LnJhdzsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwl1OCByYXRlID0gaWw0OTY1X2h3X2dldF9yYXRlKGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIucmF0ZV9uX2ZsYWdzKTsKKworCURfUlgoImJlYWNvbiBzdGF0dXMgJXggcmV0cmllcyAlZCBpc3MgJWQgdHNmOjB4JS44eCUuOHggcmF0ZSAlZFxuIiwKKwkgICAgIGxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIudS5zdGF0dXMpICYgVFhfU1RBVFVTX01TSywKKwkgICAgIGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIuZmFpbHVyZV9mcmFtZSwKKwkgICAgIGxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKSwKKwkgICAgIGxlMzJfdG9fY3B1KGJlYWNvbi0+aGlnaF90c2YpLCBsZTMyX3RvX2NwdShiZWFjb24tPmxvd190c2YpLCByYXRlKTsKKyNlbmRpZgorCWlsLT5pYnNzX21hbmFnZXIgPSBsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcGVyZm9ybV9jdF9raWxsX3Rhc2soc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEX1BPV0VSKCJTdG9wIGFsbCBxdWV1ZXNcbiIpOworCisJaWYgKGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkKQorCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaWwtPmh3KTsKKworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfU0VULAorCSAgICAgICBDU1JfVUNPREVfRFJWX0dQMV9SRUdfQklUX0NUX0tJTExfRVhJVCk7CisJX2lsX3JkKGlsLCBDU1JfVUNPREVfRFJWX0dQMSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnJlZ19sb2NrLCBmbGFncyk7CisJaWYgKCFfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKSkKKwkJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCBmbGFncyk7Cit9CisKKy8qIEhhbmRsZSBub3RpZmljYXRpb24gZnJvbSB1Q29kZSB0aGF0IGNhcmQncyBwb3dlciBzdGF0ZSBpcyBjaGFuZ2luZworICogZHVlIHRvIHNvZnR3YXJlLCBoYXJkd2FyZSwgb3IgY3JpdGljYWwgdGVtcGVyYXR1cmUgUkZLSUxMICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2hkbF9jYXJkX3N0YXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJdTMyIGZsYWdzID0gbGUzMl90b19jcHUocGt0LT51LmNhcmRfc3RhdGVfbm90aWYuZmxhZ3MpOworCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gaWwtPnN0YXR1czsKKworCURfUkZfS0lMTCgiQ2FyZCBzdGF0ZSByZWNlaXZlZDogSFc6JXMgU1c6JXMgQ1Q6JXNcbiIsCisJCSAgKGZsYWdzICYgSFdfQ0FSRF9ESVNBQkxFRCkgPyAiS2lsbCIgOiAiT24iLAorCQkgIChmbGFncyAmIFNXX0NBUkRfRElTQUJMRUQpID8gIktpbGwiIDogIk9uIiwKKwkJICAoZmxhZ3MgJiBDVF9DQVJEX0RJU0FCTEVEKSA/ICJSZWFjaGVkIiA6ICJOb3QgcmVhY2hlZCIpOworCisJaWYgKGZsYWdzICYgKFNXX0NBUkRfRElTQUJMRUQgfCBIV19DQVJEX0RJU0FCTEVEIHwgQ1RfQ0FSRF9ESVNBQkxFRCkpIHsKKworCQlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX1NFVCwKKwkJICAgICAgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7CisKKwkJaWxfd3IoaWwsIEhCVVNfVEFSR19NQlhfQywgSEJVU19UQVJHX01CWF9DX1JFR19CSVRfQ01EX0JMT0NLRUQpOworCisJCWlmICghKGZsYWdzICYgUlhPTl9DQVJEX0RJU0FCTEVEKSkgeworCQkJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsCisJCQkgICAgICAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKKwkJCWlsX3dyKGlsLCBIQlVTX1RBUkdfTUJYX0MsCisJCQkgICAgICBIQlVTX1RBUkdfTUJYX0NfUkVHX0JJVF9DTURfQkxPQ0tFRCk7CisJCX0KKwl9CisKKwlpZiAoZmxhZ3MgJiBDVF9DQVJEX0RJU0FCTEVEKQorCQlpbDQ5NjVfcGVyZm9ybV9jdF9raWxsX3Rhc2soaWwpOworCisJaWYgKGZsYWdzICYgSFdfQ0FSRF9ESVNBQkxFRCkKKwkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwllbHNlCisJCWNsZWFyX2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKworCWlmICghKGZsYWdzICYgUlhPTl9DQVJEX0RJU0FCTEVEKSkKKwkJaWxfc2Nhbl9jYW5jZWwoaWwpOworCisJaWYgKCh0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZzdGF0dXMpICE9CisJICAgICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKSkpCisJCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUoaWwtPmh3LT53aXBoeSwKKwkJCQkJICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKSk7CisJZWxzZQorCQl3YWtlX3VwKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKK30KKworLyoqCisgKiBpbDQ5NjVfc2V0dXBfaGFuZGxlcnMgLSBJbml0aWFsaXplIFJ4IGhhbmRsZXIgY2FsbGJhY2tzCisgKgorICogU2V0dXAgdGhlIFJYIGhhbmRsZXJzIGZvciBlYWNoIG9mIHRoZSByZXBseSB0eXBlcyBzZW50IGZyb20gdGhlIHVDb2RlCisgKiB0byB0aGUgaG9zdC4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoYWlucyBpbnRvIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBmaWxlcyBmb3IgdGhlbSB0byBzZXR1cAorICogYW55IGhhcmR3YXJlIHNwZWNpZmljIGhhbmRsZXJzIGFzIHdlbGwuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfc2V0dXBfaGFuZGxlcnMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT5oYW5kbGVyc1tOX0FMSVZFXSA9IGlsNDk2NV9oZGxfYWxpdmU7CisJaWwtPmhhbmRsZXJzW05fRVJST1JdID0gaWxfaGRsX2Vycm9yOworCWlsLT5oYW5kbGVyc1tOX0NIQU5ORUxfU1dJVENIXSA9IGlsX2hkbF9jc2E7CisJaWwtPmhhbmRsZXJzW05fU1BFQ1RSVU1fTUVBU1VSRU1FTlRdID0gaWxfaGRsX3NwZWN0cnVtX21lYXN1cmVtZW50OworCWlsLT5oYW5kbGVyc1tOX1BNX1NMRUVQXSA9IGlsX2hkbF9wbV9zbGVlcDsKKwlpbC0+aGFuZGxlcnNbTl9QTV9ERUJVR19TVEFUU10gPSBpbF9oZGxfcG1fZGVidWdfc3RhdHM7CisJaWwtPmhhbmRsZXJzW05fQkVBQ09OXSA9IGlsNDk2NV9oZGxfYmVhY29uOworCisJLyoKKwkgKiBUaGUgc2FtZSBoYW5kbGVyIGlzIHVzZWQgZm9yIGJvdGggdGhlIFJFUExZIHRvIGEgZGlzY3JldGUKKwkgKiBzdGF0cyByZXF1ZXN0IGZyb20gdGhlIGhvc3QgYXMgd2VsbCBhcyBmb3IgdGhlIHBlcmlvZGljCisJICogc3RhdHMgbm90aWZpY2F0aW9ucyAoYWZ0ZXIgcmVjZWl2ZWQgYmVhY29ucykgZnJvbSB0aGUgdUNvZGUuCisJICovCisJaWwtPmhhbmRsZXJzW0NfU1RBVFNdID0gaWw0OTY1X2hkbF9jX3N0YXRzOworCWlsLT5oYW5kbGVyc1tOX1NUQVRTXSA9IGlsNDk2NV9oZGxfc3RhdHM7CisKKwlpbF9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKGlsKTsKKworCS8qIHN0YXR1cyBjaGFuZ2UgaGFuZGxlciAqLworCWlsLT5oYW5kbGVyc1tOX0NBUkRfU1RBVEVdID0gaWw0OTY1X2hkbF9jYXJkX3N0YXRlOworCisJaWwtPmhhbmRsZXJzW05fTUlTU0VEX0JFQUNPTlNdID0gaWw0OTY1X2hkbF9taXNzZWRfYmVhY29uOworCS8qIFJ4IGhhbmRsZXJzICovCisJaWwtPmhhbmRsZXJzW05fUlhfUEhZXSA9IGlsNDk2NV9oZGxfcnhfcGh5OworCWlsLT5oYW5kbGVyc1tOX1JYX01QRFVdID0gaWw0OTY1X2hkbF9yeDsKKwkvKiBibG9jayBhY2sgKi8KKwlpbC0+aGFuZGxlcnNbTl9DT01QUkVTU0VEX0JBXSA9IGlsNDk2NV9oZGxfY29tcHJlc3NlZF9iYTsKKwkvKiBTZXQgdXAgaGFyZHdhcmUgc3BlY2lmaWMgUnggaGFuZGxlcnMgKi8KKwlpbC0+Y2ZnLT5vcHMtPmxpYi0+aGFuZGxlcl9zZXR1cChpbCk7Cit9CisKKy8qKgorICogaWw0OTY1X3J4X2hhbmRsZSAtIE1haW4gZW50cnkgZnVuY3Rpb24gZm9yIHJlY2VpdmluZyByZXNwb25zZXMgZnJvbSB1Q29kZQorICoKKyAqIFVzZXMgdGhlIGlsLT5oYW5kbGVycyBjYWxsYmFjayBmdW5jdGlvbiBhcnJheSB0byBpbnZva2UKKyAqIHRoZSBhcHByb3ByaWF0ZSBoYW5kbGVycywgaW5jbHVkaW5nIGNvbW1hbmQgcmVzcG9uc2VzLAorICogZnJhbWUtcmVjZWl2ZWQgbm90aWZpY2F0aW9ucywgYW5kIG90aGVyIG5vdGlmaWNhdGlvbnMuCisgKi8KK3ZvaWQKK2lsNDk2NV9yeF9oYW5kbGUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9yeF9idWYgKnJ4YjsKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3Q7CisJc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEgPSAmaWwtPnJ4cTsKKwl1MzIgciwgaTsKKwlpbnQgcmVjbGFpbTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGZpbGxfcnggPSAwOworCXUzMiBjb3VudCA9IDg7CisJaW50IHRvdGFsX2VtcHR5OworCisJLyogdUNvZGUncyByZWFkIGlkeCAoc3RvcmVkIGluIHNoYXJlZCBEUkFNKSBpbmRpY2F0ZXMgdGhlIGxhc3QgUngKKwkgKiBidWZmZXIgdGhhdCB0aGUgZHJpdmVyIG1heSBwcm9jZXNzIChsYXN0IGJ1ZmZlciBmaWxsZWQgYnkgdWNvZGUpLiAqLworCXIgPSBsZTE2X3RvX2NwdShyeHEtPnJiX3N0dHMtPmNsb3NlZF9yYl9udW0pICYgMHgwRkZGOworCWkgPSByeHEtPnJlYWQ7CisKKwkvKiBSeCBpbnRlcnJ1cHQsIGJ1dCBub3RoaW5nIHNlbnQgZnJvbSB1Q29kZSAqLworCWlmIChpID09IHIpCisJCURfUlgoInIgPSAlZCwgaSA9ICVkXG4iLCByLCBpKTsKKworCS8qIGNhbGN1bGF0ZSB0b3RhbCBmcmFtZXMgbmVlZCB0byBiZSByZXN0b2NrIGFmdGVyIGhhbmRsaW5nIFJYICovCisJdG90YWxfZW1wdHkgPSByIC0gcnhxLT53cml0ZV9hY3R1YWw7CisJaWYgKHRvdGFsX2VtcHR5IDwgMCkKKwkJdG90YWxfZW1wdHkgKz0gUlhfUVVFVUVfU0laRTsKKworCWlmICh0b3RhbF9lbXB0eSA+IChSWF9RVUVVRV9TSVpFIC8gMikpCisJCWZpbGxfcnggPSAxOworCisJd2hpbGUgKGkgIT0gcikgeworCQlpbnQgbGVuOworCisJCXJ4YiA9IHJ4cS0+cXVldWVbaV07CisKKwkJLyogSWYgYW4gUlhCIGRvZXNuJ3QgaGF2ZSBhIFJ4IHF1ZXVlIHNsb3QgYXNzb2NpYXRlZCB3aXRoIGl0LAorCQkgKiB0aGVuIGEgYnVnIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gdGhlIHF1ZXVlIHJlZmlsbGluZworCQkgKiByb3V0aW5lcyAtLSBjYXRjaCBpdCBoZXJlICovCisJCUJVR19PTihyeGIgPT0gTlVMTCk7CisKKwkJcnhxLT5xdWV1ZVtpXSA9IE5VTEw7CisKKwkJcGNpX3VubWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHJ4Yi0+cGFnZV9kbWEsCisJCQkgICAgICAgUEFHRV9TSVpFIDw8IGlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKKwkJCSAgICAgICBQQ0lfRE1BX0ZST01ERVZJQ0UpOworCQlwa3QgPSByeGJfYWRkcihyeGIpOworCisJCWxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgSUxfUlhfRlJBTUVfU0laRV9NU0s7CisJCWxlbiArPSBzaXplb2YodTMyKTsJLyogYWNjb3VudCBmb3Igc3RhdHVzIHdvcmQgKi8KKworCQkvKiBSZWNsYWltIGEgY29tbWFuZCBidWZmZXIgb25seSBpZiB0aGlzIHBhY2tldCBpcyBhIHJlc3BvbnNlCisJCSAqICAgdG8gYSAoZHJpdmVyLW9yaWdpbmF0ZWQpIGNvbW1hbmQuCisJCSAqIElmIHRoZSBwYWNrZXQgKGUuZy4gUnggZnJhbWUpIG9yaWdpbmF0ZWQgZnJvbSB1Q29kZSwKKwkJICogICB0aGVyZSBpcyBubyBjb21tYW5kIGJ1ZmZlciB0byByZWNsYWltLgorCQkgKiBVY29kZSBzaG91bGQgc2V0IFNFUV9SWF9GUkFNRSBiaXQgaWYgdWNvZGUtb3JpZ2luYXRlZCwKKwkJICogICBidXQgYXBwYXJlbnRseSBhIGZldyBkb24ndCBnZXQgc2V0OyBjYXRjaCB0aGVtIGhlcmUuICovCisJCXJlY2xhaW0gPSAhKHBrdC0+aGRyLnNlcXVlbmNlICYgU0VRX1JYX0ZSQU1FKSAmJgorCQkgICAgKHBrdC0+aGRyLmNtZCAhPSBOX1JYX1BIWSkgJiYgKHBrdC0+aGRyLmNtZCAhPSBOX1JYKSAmJgorCQkgICAgKHBrdC0+aGRyLmNtZCAhPSBOX1JYX01QRFUpICYmCisJCSAgICAocGt0LT5oZHIuY21kICE9IE5fQ09NUFJFU1NFRF9CQSkgJiYKKwkJICAgIChwa3QtPmhkci5jbWQgIT0gTl9TVEFUUykgJiYgKHBrdC0+aGRyLmNtZCAhPSBDX1RYKTsKKworCQkvKiBCYXNlZCBvbiB0eXBlIG9mIGNvbW1hbmQgcmVzcG9uc2Ugb3Igbm90aWZpY2F0aW9uLAorCQkgKiAgIGhhbmRsZSB0aG9zZSB0aGF0IG5lZWQgaGFuZGxpbmcgdmlhIGZ1bmN0aW9uIGluCisJCSAqICAgaGFuZGxlcnMgdGFibGUuICBTZWUgaWw0OTY1X3NldHVwX2hhbmRsZXJzKCkgKi8KKwkJaWYgKGlsLT5oYW5kbGVyc1twa3QtPmhkci5jbWRdKSB7CisJCQlEX1JYKCJyID0gJWQsIGkgPSAlZCwgJXMsIDB4JTAyeFxuIiwgciwgaSwKKwkJCSAgICAgaWxfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwgcGt0LT5oZHIuY21kKTsKKwkJCWlsLT5pc3Jfc3RhdHMuaGFuZGxlcnNbcGt0LT5oZHIuY21kXSsrOworCQkJaWwtPmhhbmRsZXJzW3BrdC0+aGRyLmNtZF0gKGlsLCByeGIpOworCQl9IGVsc2UgeworCQkJLyogTm8gaGFuZGxpbmcgbmVlZGVkICovCisJCQlEX1JYKCJyICVkIGkgJWQgTm8gaGFuZGxlciBuZWVkZWQgZm9yICVzLCAweCUwMnhcbiIsIHIsCisJCQkgICAgIGksIGlsX2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCksIHBrdC0+aGRyLmNtZCk7CisJCX0KKworCQkvKgorCQkgKiBYWFg6IEFmdGVyIGhlcmUsIHdlIHNob3VsZCBhbHdheXMgY2hlY2sgcnhiLT5wYWdlCisJCSAqIGFnYWluc3QgTlVMTCBiZWZvcmUgdG91Y2hpbmcgaXQgb3IgaXRzIHZpcnR1YWwKKwkJICogbWVtb3J5IChwa3QpLiBCZWNhdXNlIHNvbWUgaGFuZGxlciBtaWdodCBoYXZlCisJCSAqIGFscmVhZHkgdGFrZW4gb3IgZnJlZWQgdGhlIHBhZ2VzLgorCQkgKi8KKworCQlpZiAocmVjbGFpbSkgeworCQkJLyogSW52b2tlIGFueSBjYWxsYmFja3MsIHRyYW5zZmVyIHRoZSBidWZmZXIgdG8gY2FsbGVyLAorCQkJICogYW5kIGZpcmUgb2ZmIHRoZSAocG9zc2libHkpIGJsb2NraW5nIGlsX3NlbmRfY21kKCkKKwkJCSAqIGFzIHdlIHJlY2xhaW0gdGhlIGRyaXZlciBjb21tYW5kIHF1ZXVlICovCisJCQlpZiAocnhiLT5wYWdlKQorCQkJCWlsX3R4X2NtZF9jb21wbGV0ZShpbCwgcnhiKTsKKwkJCWVsc2UKKwkJCQlJTF9XQVJOKCJDbGFpbSBudWxsIHJ4Yj9cbiIpOworCQl9CisKKwkJLyogUmV1c2UgdGhlIHBhZ2UgaWYgcG9zc2libGUuIEZvciBub3RpZmljYXRpb24gcGFja2V0cyBhbmQKKwkJICogU0tCcyB0aGF0IGZhaWwgdG8gUnggY29ycmVjdGx5LCBhZGQgdGhlbSBiYWNrIGludG8gdGhlCisJCSAqIHJ4X2ZyZWUgbGlzdCBmb3IgcmV1c2UgbGF0ZXIuICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHJ4Yi0+cGFnZSAhPSBOVUxMKSB7CisJCQlyeGItPnBhZ2VfZG1hID0KKwkJCSAgICBwY2lfbWFwX3BhZ2UoaWwtPnBjaV9kZXYsIHJ4Yi0+cGFnZSwgMCwKKwkJCQkJIFBBR0VfU0laRSA8PCBpbC0+aHdfcGFyYW1zLgorCQkJCQkgcnhfcGFnZV9vcmRlciwgUENJX0RNQV9GUk9NREVWSUNFKTsKKwkJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7CisJCQlyeHEtPmZyZWVfY291bnQrKzsKKwkJfSBlbHNlCisJCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X3VzZWQpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOworCisJCWkgPSAoaSArIDEpICYgUlhfUVVFVUVfTUFTSzsKKwkJLyogSWYgdGhlcmUgYXJlIGEgbG90IG9mIHVudXNlZCBmcmFtZXMsCisJCSAqIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHNvIHVjb2RlIHdvbnQgYXNzZXJ0LiAqLworCQlpZiAoZmlsbF9yeCkgeworCQkJY291bnQrKzsKKwkJCWlmIChjb3VudCA+PSA4KSB7CisJCQkJcnhxLT5yZWFkID0gaTsKKwkJCQlpbDQ5NjVfcnhfcmVwbGVuaXNoX25vdyhpbCk7CisJCQkJY291bnQgPSAwOworCQkJfQorCQl9CisJfQorCisJLyogQmFja3RyYWNrIG9uZSBlbnRyeSAqLworCXJ4cS0+cmVhZCA9IGk7CisJaWYgKGZpbGxfcngpCisJCWlsNDk2NV9yeF9yZXBsZW5pc2hfbm93KGlsKTsKKwllbHNlCisJCWlsNDk2NV9yeF9xdWV1ZV9yZXN0b2NrKGlsKTsKK30KKworLyogY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGZsdXNoIGFueSBzY2hlZHVsZWQgdGFza2xldCAqLworc3RhdGljIGlubGluZSB2b2lkCitpbDQ5NjVfc3luY2hyb25pemVfaXJxKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiB3YWl0IHRvIG1ha2Ugc3VyZSB3ZSBmbHVzaCBwZW5kaW5nIHRhc2tsZXQgKi8KKwlzeW5jaHJvbml6ZV9pcnEoaWwtPnBjaV9kZXYtPmlycSk7CisJdGFza2xldF9raWxsKCZpbC0+aXJxX3Rhc2tsZXQpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2lycV90YXNrbGV0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MzIgaW50YSwgaGFuZGxlZCA9IDA7CisJdTMyIGludGFfZmg7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwl1MzIgaW50YV9tYXNrOworI2VuZGlmCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIEFjay9jbGVhci9yZXNldCBwZW5kaW5nIHVDb2RlIGludGVycnVwdHMuCisJICogTm90ZTogIFNvbWUgYml0cyBpbiBDU1JfSU5UIGFyZSAiT1IiIG9mIGJpdHMgaW4gQ1NSX0ZIX0lOVF9TVEFUVVMsCisJICogIGFuZCB3aWxsIGNsZWFyIG9ubHkgd2hlbiBDU1JfRkhfSU5UX1NUQVRVUyBnZXRzIGNsZWFyZWQuICovCisJaW50YSA9IF9pbF9yZChpbCwgQ1NSX0lOVCk7CisJX2lsX3dyKGlsLCBDU1JfSU5ULCBpbnRhKTsKKworCS8qIEFjay9jbGVhci9yZXNldCBwZW5kaW5nIGZsb3ctaGFuZGxlciAoRE1BKSBpbnRlcnJ1cHRzLgorCSAqIEFueSBuZXcgaW50ZXJydXB0cyB0aGF0IGhhcHBlbiBhZnRlciB0aGlzLCBlaXRoZXIgd2hpbGUgd2UncmUKKwkgKiBpbiB0aGlzIHRhc2tsZXQsIG9yIGxhdGVyLCB3aWxsIHNob3cgdXAgaW4gbmV4dCBJU1IvdGFza2xldC4gKi8KKwlpbnRhX2ZoID0gX2lsX3JkKGlsLCBDU1JfRkhfSU5UX1NUQVRVUyk7CisJX2lsX3dyKGlsLCBDU1JfRkhfSU5UX1NUQVRVUywgaW50YV9maCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIElMX0RMX0lTUikgeworCQkvKiBqdXN0IGZvciBkZWJ1ZyAqLworCQlpbnRhX21hc2sgPSBfaWxfcmQoaWwsIENTUl9JTlRfTUFTSyk7CisJCURfSVNSKCJpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eFxuIiwgaW50YSwKKwkJICAgICAgaW50YV9tYXNrLCBpbnRhX2ZoKTsKKwl9CisjZW5kaWYKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBTaW5jZSBDU1JfSU5UIGFuZCBDU1JfRkhfSU5UX1NUQVRVUyByZWFkcyBhbmQgY2xlYXJzIGFyZSBub3QKKwkgKiBhdG9taWMsIG1ha2Ugc3VyZSB0aGF0IGludGEgY292ZXJzIGFsbCB0aGUgaW50ZXJydXB0cyB0aGF0CisJICogd2UndmUgZGlzY292ZXJlZCwgZXZlbiBpZiBGSCBpbnRlcnJ1cHQgY2FtZSBpbiBqdXN0IGFmdGVyCisJICogcmVhZGluZyBDU1JfSU5ULiAqLworCWlmIChpbnRhX2ZoICYgQ1NSNDlfRkhfSU5UX1JYX01BU0spCisJCWludGEgfD0gQ1NSX0lOVF9CSVRfRkhfUlg7CisJaWYgKGludGFfZmggJiBDU1I0OV9GSF9JTlRfVFhfTUFTSykKKwkJaW50YSB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKKworCS8qIE5vdyBzZXJ2aWNlIGFsbCBpbnRlcnJ1cHQgYml0cyBkaXNjb3ZlcmVkIGFib3ZlLiAqLworCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfSFdfRVJSKSB7CisJCUlMX0VSUigiSGFyZHdhcmUgZXJyb3IgZGV0ZWN0ZWQuICBSZXN0YXJ0aW5nLlxuIik7CisKKwkJLyogVGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCisJCWlsX2Rpc2FibGVfaW50ZXJydXB0cyhpbCk7CisKKwkJaWwtPmlzcl9zdGF0cy5odysrOworCQlpbF9pcnFfaGFuZGxlX2Vycm9yKGlsKTsKKworCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX0hXX0VSUjsKKworCQlyZXR1cm47CisJfQorI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCWlmIChpbF9nZXRfZGVidWdfbGV2ZWwoaWwpICYgKElMX0RMX0lTUikpIHsKKwkJLyogTklDIGZpcmVzIHRoaXMsIGJ1dCB3ZSBkb24ndCB1c2UgaXQsIHJlZHVuZGFudCB3aXRoIFdBS0VVUCAqLworCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1NDRCkgeworCQkJRF9JU1IoIlNjaGVkdWxlciBmaW5pc2hlZCB0byB0cmFuc21pdCAiCisJCQkgICAgICAidGhlIGZyYW1lL2ZyYW1lcy5cbiIpOworCQkJaWwtPmlzcl9zdGF0cy5zY2grKzsKKwkJfQorCisJCS8qIEFsaXZlIG5vdGlmaWNhdGlvbiB2aWEgUnggaW50ZXJydXB0IHdpbGwgZG8gdGhlIHJlYWwgd29yayAqLworCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX0FMSVZFKSB7CisJCQlEX0lTUigiQWxpdmUgaW50ZXJydXB0XG4iKTsKKwkJCWlsLT5pc3Jfc3RhdHMuYWxpdmUrKzsKKwkJfQorCX0KKyNlbmRpZgorCS8qIFNhZmVseSBpZ25vcmUgdGhlc2UgYml0cyBmb3IgZGVidWcgY2hlY2tzIGJlbG93ICovCisJaW50YSAmPSB+KENTUl9JTlRfQklUX1NDRCB8IENTUl9JTlRfQklUX0FMSVZFKTsKKworCS8qIEhXIFJGIEtJTEwgc3dpdGNoIHRvZ2dsZWQgKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX1JGX0tJTEwpIHsKKwkJaW50IGh3X3JmX2tpbGwgPSAwOworCQlpZiAoIQorCQkgICAgKF9pbF9yZChpbCwgQ1NSX0dQX0NOVFJMKSAmCisJCSAgICAgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpKQorCQkJaHdfcmZfa2lsbCA9IDE7CisKKwkJSUxfV0FSTigiUkZfS0lMTCBiaXQgdG9nZ2xlZCB0byAlcy5cbiIsCisJCQlod19yZl9raWxsID8gImRpc2FibGUgcmFkaW8iIDogImVuYWJsZSByYWRpbyIpOworCisJCWlsLT5pc3Jfc3RhdHMucmZraWxsKys7CisKKwkJLyogZHJpdmVyIG9ubHkgbG9hZHMgdWNvZGUgb25jZSBzZXR0aW5nIHRoZSBpbnRlcmZhY2UgdXAuCisJCSAqIHRoZSBkcml2ZXIgYWxsb3dzIGxvYWRpbmcgdGhlIHVjb2RlIGV2ZW4gaWYgdGhlIHJhZGlvCisJCSAqIGlzIGtpbGxlZC4gSGVuY2UgdXBkYXRlIHRoZSBraWxsc3dpdGNoIHN0YXRlIGhlcmUuIFRoZQorCQkgKiByZmtpbGwgaGFuZGxlciB3aWxsIGNhcmUgYWJvdXQgcmVzdGFydGluZyBpZiBuZWVkZWQuCisJCSAqLworCQlpZiAoIXRlc3RfYml0KFNfQUxJVkUsICZpbC0+c3RhdHVzKSkgeworCQkJaWYgKGh3X3JmX2tpbGwpCisJCQkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwkJCWVsc2UKKwkJCQljbGVhcl9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKGlsLT5ody0+d2lwaHksIGh3X3JmX2tpbGwpOworCQl9CisKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9SRl9LSUxMOworCX0KKworCS8qIENoaXAgZ290IHRvbyBob3QgYW5kIHN0b3BwZWQgaXRzZWxmICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9DVF9LSUxMKSB7CisJCUlMX0VSUigiTWljcm9jb2RlIENUIGtpbGwgZXJyb3IgZGV0ZWN0ZWQuXG4iKTsKKwkJaWwtPmlzcl9zdGF0cy5jdGtpbGwrKzsKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9DVF9LSUxMOworCX0KKworCS8qIEVycm9yIGRldGVjdGVkIGJ5IHVDb2RlICovCisJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9TV19FUlIpIHsKKwkJSUxfRVJSKCJNaWNyb2NvZGUgU1cgZXJyb3IgZGV0ZWN0ZWQuICIgIiBSZXN0YXJ0aW5nIDB4JVguXG4iLAorCQkgICAgICAgaW50YSk7CisJCWlsLT5pc3Jfc3RhdHMuc3crKzsKKwkJaWxfaXJxX2hhbmRsZV9lcnJvcihpbCk7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfU1dfRVJSOworCX0KKworCS8qCisJICogdUNvZGUgd2FrZXMgdXAgYWZ0ZXIgcG93ZXItZG93biBzbGVlcC4KKwkgKiBUZWxsIGRldmljZSBhYm91dCBhbnkgbmV3IHR4IG9yIGhvc3QgY29tbWFuZHMgZW5xdWV1ZWQsCisJICogYW5kIGFib3V0IGFueSBSeCBidWZmZXJzIG1hZGUgYXZhaWxhYmxlIHdoaWxlIGFzbGVlcC4KKwkgKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX1dBS0VVUCkgeworCQlEX0lTUigiV2FrZXVwIGludGVycnVwdFxuIik7CisJCWlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoaWwsICZpbC0+cnhxKTsKKwkJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IGkrKykKKwkJCWlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKGlsLCAmaWwtPnR4cVtpXSk7CisJCWlsLT5pc3Jfc3RhdHMud2FrZXVwKys7CisJCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfV0FLRVVQOworCX0KKworCS8qIEFsbCB1Q29kZSBjb21tYW5kIHJlc3BvbnNlcywgaW5jbHVkaW5nIFR4IGNvbW1hbmQgcmVzcG9uc2VzLAorCSAqIFJ4ICJyZXNwb25zZXMiIChmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb24pLCBhbmQgb3RoZXIKKwkgKiBub3RpZmljYXRpb25zIGZyb20gdUNvZGUgY29tZSB0aHJvdWdoIGhlcmUqLworCWlmIChpbnRhICYgKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpKSB7CisJCWlsNDk2NV9yeF9oYW5kbGUoaWwpOworCQlpbC0+aXNyX3N0YXRzLnJ4Kys7CisJCWhhbmRsZWQgfD0gKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpOworCX0KKworCS8qIFRoaXMgIlR4IiBETUEgY2hhbm5lbCBpcyB1c2VkIG9ubHkgZm9yIGxvYWRpbmcgdUNvZGUgKi8KKwlpZiAoaW50YSAmIENTUl9JTlRfQklUX0ZIX1RYKSB7CisJCURfSVNSKCJ1Q29kZSBsb2FkIGludGVycnVwdFxuIik7CisJCWlsLT5pc3Jfc3RhdHMudHgrKzsKKwkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKKwkJLyogV2FrZSB1cCB1Q29kZSBsb2FkIHJvdXRpbmUsIG5vdyB0aGF0IGxvYWQgaXMgY29tcGxldGUgKi8KKwkJaWwtPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMTsKKwkJd2FrZV91cCgmaWwtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisJfQorCisJaWYgKGludGEgJiB+aGFuZGxlZCkgeworCQlJTF9FUlIoIlVuaGFuZGxlZCBJTlRBIGJpdHMgMHglMDh4XG4iLCBpbnRhICYgfmhhbmRsZWQpOworCQlpbC0+aXNyX3N0YXRzLnVuaGFuZGxlZCsrOworCX0KKworCWlmIChpbnRhICYgfihpbC0+aW50YV9tYXNrKSkgeworCQlJTF9XQVJOKCJEaXNhYmxlZCBJTlRBIGJpdHMgMHglMDh4IHdlcmUgcGVuZGluZ1xuIiwKKwkJCWludGEgJiB+aWwtPmludGFfbWFzayk7CisJCUlMX1dBUk4oIiAgIHdpdGggRkg0OV9JTlQgPSAweCUwOHhcbiIsIGludGFfZmgpOworCX0KKworCS8qIFJlLWVuYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCS8qIG9ubHkgUmUtZW5hYmxlIGlmIGRpc2FibGVkIGJ5IGlycSAqLworCWlmICh0ZXN0X2JpdChTX0lOVF9FTkFCTEVELCAmaWwtPnN0YXR1cykpCisJCWlsX2VuYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKwkvKiBSZS1lbmFibGUgUkZfS0lMTCBpZiBpdCBvY2N1cnJlZCAqLworCWVsc2UgaWYgKGhhbmRsZWQgJiBDU1JfSU5UX0JJVF9SRl9LSUxMKQorCQlpbF9lbmFibGVfcmZraWxsX2ludChpbCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIChJTF9ETF9JU1IpKSB7CisJCWludGEgPSBfaWxfcmQoaWwsIENTUl9JTlQpOworCQlpbnRhX21hc2sgPSBfaWxfcmQoaWwsIENTUl9JTlRfTUFTSyk7CisJCWludGFfZmggPSBfaWxfcmQoaWwsIENTUl9GSF9JTlRfU1RBVFVTKTsKKwkJRF9JU1IoIkVuZCBpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eCwgIgorCQkgICAgICAiZmxhZ3MgMHglMDhseFxuIiwgaW50YSwgaW50YV9tYXNrLCBpbnRhX2ZoLCBmbGFncyk7CisJfQorI2VuZGlmCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIHN5c2ZzIGF0dHJpYnV0ZXMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgYWRkcyBhIG5ldyBhdHRyaWJ1dGUgdG8gdGhlIHN5c2ZzIHJlcHJlc2VudGF0aW9uCisgKiBvZiB0aGlzIGRldmljZSBkcml2ZXIgKGkuZS4gYSBuZXcgZmlsZSBpbiAvc3lzL2NsYXNzL25ldC93bGFuMC9kZXZpY2UvKQorICogdXNlZCBmb3IgY29udHJvbGxpbmcgdGhlIGRlYnVnIGxldmVsLgorICoKKyAqIFNlZSB0aGUgbGV2ZWwgZGVmaW5pdGlvbnMgaW4gaXdsIGZvciBkZXRhaWxzLgorICoKKyAqIFRoZSBkZWJ1Z19sZXZlbCBiZWluZyBtYW5hZ2VkIHVzaW5nIHN5c2ZzIGJlbG93IGlzIGEgcGVyIGRldmljZSBkZWJ1ZworICogbGV2ZWwgdGhhdCBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIGdsb2JhbCBkZWJ1ZyBsZXZlbCBpZiBpdCAodGhlIHBlcgorICogZGV2aWNlIGRlYnVnIGxldmVsKSBpcyBzZXQuCisgKi8KK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfc2hvd19kZWJ1Z19sZXZlbChzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCWNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiMHglMDhYXG4iLCBpbF9nZXRfZGVidWdfbGV2ZWwoaWwpKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9zdG9yZV9kZWJ1Z19sZXZlbChzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBkZXZfZ2V0X2RydmRhdGEoZCk7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IHJldDsKKworCXJldCA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnZhbCk7CisJaWYgKHJldCkKKwkJSUxfRVJSKCIlcyBpcyBub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7CisJZWxzZSB7CisJCWlsLT5kZWJ1Z19sZXZlbCA9IHZhbDsKKwkJaWYgKGlsX2FsbG9jX3RyYWZmaWNfbWVtKGlsKSkKKwkJCUlMX0VSUigiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOworCX0KKwlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKK30KKworc3RhdGljIERFVklDRV9BVFRSKGRlYnVnX2xldmVsLCBTX0lXVVNSIHwgU19JUlVHTywgaWw0OTY1X3Nob3dfZGVidWdfbGV2ZWwsCisJCSAgIGlsNDk2NV9zdG9yZV9kZWJ1Z19sZXZlbCk7CisKKyNlbmRpZiAvKiBDT05GSUdfSVdMRUdBQ1lfREVCVUcgKi8KKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9zaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJY2hhciAqYnVmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpbC0+dGVtcGVyYXR1cmUpOworfQorCitzdGF0aWMgREVWSUNFX0FUVFIodGVtcGVyYXR1cmUsIFNfSVJVR08sIGlsNDk2NV9zaG93X3RlbXBlcmF0dXJlLCBOVUxMKTsKKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9zaG93X3R4X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmQsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCisJaWYgKCFpbF9pc19yZWFkeV9yZihpbCkpCisJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm9mZlxuIik7CisJZWxzZQorCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgaWwtPnR4X3Bvd2VyX3VzZXJfbG10KTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9zdG9yZV90eF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZGV2X2dldF9kcnZkYXRhKGQpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCWludCByZXQ7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0KQorCQlJTF9JTkZPKCIlcyBpcyBub3QgaW4gZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKKwllbHNlIHsKKwkJcmV0ID0gaWxfc2V0X3R4X3Bvd2VyKGlsLCB2YWwsIGZhbHNlKTsKKwkJaWYgKHJldCkKKwkJCUlMX0VSUigiZmFpbGVkIHNldHRpbmcgdHggcG93ZXIgKDB4JWQpLlxuIiwgcmV0KTsKKwkJZWxzZQorCQkJcmV0ID0gY291bnQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBERVZJQ0VfQVRUUih0eF9wb3dlciwgU19JV1VTUiB8IFNfSVJVR08sIGlsNDk2NV9zaG93X3R4X3Bvd2VyLAorCQkgICBpbDQ5NjVfc3RvcmVfdHhfcG93ZXIpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaWxfc3lzZnNfZW50cmllc1tdID0geworCSZkZXZfYXR0cl90ZW1wZXJhdHVyZS5hdHRyLAorCSZkZXZfYXR0cl90eF9wb3dlci5hdHRyLAorI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCSZkZXZfYXR0cl9kZWJ1Z19sZXZlbC5hdHRyLAorI2VuZGlmCisJTlVMTAorfTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgaWxfYXR0cmlidXRlX2dyb3VwID0geworCS5uYW1lID0gTlVMTCwJCS8qIHB1dCBpbiBkZXZpY2UgZGlyZWN0b3J5ICovCisJLmF0dHJzID0gaWxfc3lzZnNfZW50cmllcywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiB1Q29kZSBkb3dubG9hZCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZAoraWw0OTY1X2RlYWxsb2NfdWNvZGVfcGNpKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbF9mcmVlX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfY29kZSk7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2RhdGEpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9kYXRhX2JhY2t1cCk7CisJaWxfZnJlZV9md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2luaXQpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9pbml0X2RhdGEpOworCWlsX2ZyZWVfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9ib290KTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9uaWNfc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIFJlbW92ZSBhbGwgcmVzZXRzIHRvIGFsbG93IE5JQyB0byBvcGVyYXRlICovCisJX2lsX3dyKGlsLCBDU1JfUkVTRVQsIDApOworfQorCitzdGF0aWMgdm9pZCBpbDQ5NjVfdWNvZGVfY2FsbGJhY2soY29uc3Qgc3RydWN0IGZpcm13YXJlICp1Y29kZV9yYXcsCisJCQkJICB2b2lkICpjb250ZXh0KTsKK3N0YXRpYyBpbnQgaWw0OTY1X21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBtYXhfcHJvYmVfbGVuZ3RoKTsKKworc3RhdGljIGludCBfX211c3RfY2hlY2sKK2lsNDk2NV9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBpbF9wcml2ICppbCwgYm9vbCBmaXJzdCkKK3sKKwljb25zdCBjaGFyICpuYW1lX3ByZSA9IGlsLT5jZmctPmZ3X25hbWVfcHJlOworCWNoYXIgdGFnWzhdOworCisJaWYgKGZpcnN0KSB7CisJCWlsLT5md19pZHggPSBpbC0+Y2ZnLT51Y29kZV9hcGlfbWF4OworCQlzcHJpbnRmKHRhZywgIiVkIiwgaWwtPmZ3X2lkeCk7CisJfSBlbHNlIHsKKwkJaWwtPmZ3X2lkeC0tOworCQlzcHJpbnRmKHRhZywgIiVkIiwgaWwtPmZ3X2lkeCk7CisJfQorCisJaWYgKGlsLT5md19pZHggPCBpbC0+Y2ZnLT51Y29kZV9hcGlfbWluKSB7CisJCUlMX0VSUigibm8gc3VpdGFibGUgZmlybXdhcmUgZm91bmQhXG4iKTsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJc3ByaW50ZihpbC0+ZmlybXdhcmVfbmFtZSwgIiVzJXMlcyIsIG5hbWVfcHJlLCB0YWcsICIudWNvZGUiKTsKKworCURfSU5GTygiYXR0ZW1wdGluZyB0byBsb2FkIGZpcm13YXJlICclcydcbiIsIGlsLT5maXJtd2FyZV9uYW1lKTsKKworCXJldHVybiByZXF1ZXN0X2Zpcm13YXJlX25vd2FpdChUSElTX01PRFVMRSwgMSwgaWwtPmZpcm13YXJlX25hbWUsCisJCQkJICAgICAgICZpbC0+cGNpX2Rldi0+ZGV2LCBHRlBfS0VSTkVMLCBpbCwKKwkJCQkgICAgICAgaWw0OTY1X3Vjb2RlX2NhbGxiYWNrKTsKK30KKworc3RydWN0IGlsNDk2NV9maXJtd2FyZV9waWVjZXMgeworCWNvbnN0IHZvaWQgKmluc3QsICpkYXRhLCAqaW5pdCwgKmluaXRfZGF0YSwgKmJvb3Q7CisJc2l6ZV90IGluc3Rfc2l6ZSwgZGF0YV9zaXplLCBpbml0X3NpemUsIGluaXRfZGF0YV9zaXplLCBib290X3NpemU7Cit9OworCitzdGF0aWMgaW50CitpbDQ5NjVfbG9hZF9maXJtd2FyZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWNvZGVfcmF3LAorCQkgICAgIHN0cnVjdCBpbDQ5NjVfZmlybXdhcmVfcGllY2VzICpwaWVjZXMpCit7CisJc3RydWN0IGlsX3Vjb2RlX2hlYWRlciAqdWNvZGUgPSAodm9pZCAqKXVjb2RlX3Jhdy0+ZGF0YTsKKwl1MzIgYXBpX3ZlciwgaGRyX3NpemU7CisJY29uc3QgdTggKnNyYzsKKworCWlsLT51Y29kZV92ZXIgPSBsZTMyX3RvX2NwdSh1Y29kZS0+dmVyKTsKKwlhcGlfdmVyID0gSUxfVUNPREVfQVBJKGlsLT51Y29kZV92ZXIpOworCisJc3dpdGNoIChhcGlfdmVyKSB7CisJZGVmYXVsdDoKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMjoKKwkJaGRyX3NpemUgPSAyNDsKKwkJaWYgKHVjb2RlX3Jhdy0+c2l6ZSA8IGhkcl9zaXplKSB7CisJCQlJTF9FUlIoIkZpbGUgc2l6ZSB0b28gc21hbGwhXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXBpZWNlcy0+aW5zdF9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmluc3Rfc2l6ZSk7CisJCXBpZWNlcy0+ZGF0YV9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmRhdGFfc2l6ZSk7CisJCXBpZWNlcy0+aW5pdF9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmluaXRfc2l6ZSk7CisJCXBpZWNlcy0+aW5pdF9kYXRhX3NpemUgPSBsZTMyX3RvX2NwdSh1Y29kZS0+djEuaW5pdF9kYXRhX3NpemUpOworCQlwaWVjZXMtPmJvb3Rfc2l6ZSA9IGxlMzJfdG9fY3B1KHVjb2RlLT52MS5ib290X3NpemUpOworCQlzcmMgPSB1Y29kZS0+djEuZGF0YTsKKwkJYnJlYWs7CisJfQorCisJLyogVmVyaWZ5IHNpemUgb2YgZmlsZSB2cy4gaW1hZ2Ugc2l6ZSBpbmZvIGluIGZpbGUncyBoZWFkZXIgKi8KKwlpZiAodWNvZGVfcmF3LT5zaXplICE9CisJICAgIGhkcl9zaXplICsgcGllY2VzLT5pbnN0X3NpemUgKyBwaWVjZXMtPmRhdGFfc2l6ZSArCisJICAgIHBpZWNlcy0+aW5pdF9zaXplICsgcGllY2VzLT5pbml0X2RhdGFfc2l6ZSArIHBpZWNlcy0+Ym9vdF9zaXplKSB7CisKKwkJSUxfRVJSKCJ1Q29kZSBmaWxlIHNpemUgJWQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgc2l6ZVxuIiwKKwkJICAgICAgIChpbnQpdWNvZGVfcmF3LT5zaXplKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcGllY2VzLT5pbnN0ID0gc3JjOworCXNyYyArPSBwaWVjZXMtPmluc3Rfc2l6ZTsKKwlwaWVjZXMtPmRhdGEgPSBzcmM7CisJc3JjICs9IHBpZWNlcy0+ZGF0YV9zaXplOworCXBpZWNlcy0+aW5pdCA9IHNyYzsKKwlzcmMgKz0gcGllY2VzLT5pbml0X3NpemU7CisJcGllY2VzLT5pbml0X2RhdGEgPSBzcmM7CisJc3JjICs9IHBpZWNlcy0+aW5pdF9kYXRhX3NpemU7CisJcGllY2VzLT5ib290ID0gc3JjOworCXNyYyArPSBwaWVjZXMtPmJvb3Rfc2l6ZTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqIGlsNDk2NV91Y29kZV9jYWxsYmFjayAtIGNhbGxiYWNrIHdoZW4gZmlybXdhcmUgd2FzIGxvYWRlZAorICoKKyAqIElmIGxvYWRlZCBzdWNjZXNzZnVsbHksIGNvcGllcyB0aGUgZmlybXdhcmUgaW50byBidWZmZXJzCisgKiBmb3IgdGhlIGNhcmQgdG8gZmV0Y2ggKHZpYSBETUEpLgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3Vjb2RlX2NhbGxiYWNrKGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWNvZGVfcmF3LCB2b2lkICpjb250ZXh0KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRleHQ7CisJc3RydWN0IGlsX3Vjb2RlX2hlYWRlciAqdWNvZGU7CisJaW50IGVycjsKKwlzdHJ1Y3QgaWw0OTY1X2Zpcm13YXJlX3BpZWNlcyBwaWVjZXM7CisJY29uc3QgdW5zaWduZWQgaW50IGFwaV9tYXggPSBpbC0+Y2ZnLT51Y29kZV9hcGlfbWF4OworCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWluID0gaWwtPmNmZy0+dWNvZGVfYXBpX21pbjsKKwl1MzIgYXBpX3ZlcjsKKworCXUzMiBtYXhfcHJvYmVfbGVuZ3RoID0gMjAwOworCXUzMiBzdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZSA9CisJICAgIElMX0RFRkFVTFRfU1RBTkRBUkRfUEhZX0NBTElCUkFURV9UQkxfU0laRTsKKworCW1lbXNldCgmcGllY2VzLCAwLCBzaXplb2YocGllY2VzKSk7CisKKwlpZiAoIXVjb2RlX3JhdykgeworCQlpZiAoaWwtPmZ3X2lkeCA8PSBpbC0+Y2ZnLT51Y29kZV9hcGlfbWF4KQorCQkJSUxfRVJSKCJyZXF1ZXN0IGZvciBmaXJtd2FyZSBmaWxlICclcycgZmFpbGVkLlxuIiwKKwkJCSAgICAgICBpbC0+ZmlybXdhcmVfbmFtZSk7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCURfSU5GTygiTG9hZGVkIGZpcm13YXJlIGZpbGUgJyVzJyAoJXpkIGJ5dGVzKS5cbiIsIGlsLT5maXJtd2FyZV9uYW1lLAorCSAgICAgICB1Y29kZV9yYXctPnNpemUpOworCisJLyogTWFrZSBzdXJlIHRoYXQgd2UgZ290IGF0IGxlYXN0IHRoZSBBUEkgdmVyc2lvbiBudW1iZXIgKi8KKwlpZiAodWNvZGVfcmF3LT5zaXplIDwgNCkgeworCQlJTF9FUlIoIkZpbGUgc2l6ZSB3YXkgdG9vIHNtYWxsIVxuIik7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCS8qIERhdGEgZnJvbSB1Y29kZSBmaWxlOiAgaGVhZGVyIGZvbGxvd2VkIGJ5IHVDb2RlIGltYWdlcyAqLworCXVjb2RlID0gKHN0cnVjdCBpbF91Y29kZV9oZWFkZXIgKil1Y29kZV9yYXctPmRhdGE7CisKKwllcnIgPSBpbDQ5NjVfbG9hZF9maXJtd2FyZShpbCwgdWNvZGVfcmF3LCAmcGllY2VzKTsKKworCWlmIChlcnIpCisJCWdvdG8gdHJ5X2FnYWluOworCisJYXBpX3ZlciA9IElMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKTsKKworCS8qCisJICogYXBpX3ZlciBzaG91bGQgbWF0Y2ggdGhlIGFwaSB2ZXJzaW9uIGZvcm1pbmcgcGFydCBvZiB0aGUKKwkgKiBmaXJtd2FyZSBmaWxlbmFtZSAuLi4gYnV0IHdlIGRvbid0IGNoZWNrIGZvciB0aGF0IGFuZCBvbmx5IHJlbHkKKwkgKiBvbiB0aGUgQVBJIHZlcnNpb24gcmVhZCBmcm9tIGZpcm13YXJlIGhlYWRlciBmcm9tIGhlcmUgb24gZm9yd2FyZAorCSAqLworCWlmIChhcGlfdmVyIDwgYXBpX21pbiB8fCBhcGlfdmVyID4gYXBpX21heCkgeworCQlJTF9FUlIoIkRyaXZlciB1bmFibGUgdG8gc3VwcG9ydCB5b3VyIGZpcm13YXJlIEFQSS4gIgorCQkgICAgICAgIkRyaXZlciBzdXBwb3J0cyB2JXUsIGZpcm13YXJlIGlzIHYldS5cbiIsIGFwaV9tYXgsCisJCSAgICAgICBhcGlfdmVyKTsKKwkJZ290byB0cnlfYWdhaW47CisJfQorCisJaWYgKGFwaV92ZXIgIT0gYXBpX21heCkKKwkJSUxfRVJSKCJGaXJtd2FyZSBoYXMgb2xkIEFQSSB2ZXJzaW9uLiBFeHBlY3RlZCB2JXUsICIKKwkJICAgICAgICJnb3QgdiV1LiBOZXcgZmlybXdhcmUgY2FuIGJlIG9idGFpbmVkICIKKwkJICAgICAgICJmcm9tIGh0dHA6Ly93d3cuaW50ZWxsaW51eHdpcmVsZXNzLm9yZy5cbiIsIGFwaV9tYXgsCisJCSAgICAgICBhcGlfdmVyKTsKKworCUlMX0lORk8oImxvYWRlZCBmaXJtd2FyZSB2ZXJzaW9uICV1LiV1LiV1LiV1XG4iLAorCQlJTF9VQ09ERV9NQUpPUihpbC0+dWNvZGVfdmVyKSwgSUxfVUNPREVfTUlOT1IoaWwtPnVjb2RlX3ZlciksCisJCUlMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKSwgSUxfVUNPREVfU0VSSUFMKGlsLT51Y29kZV92ZXIpKTsKKworCXNucHJpbnRmKGlsLT5ody0+d2lwaHktPmZ3X3ZlcnNpb24sIHNpemVvZihpbC0+aHctPndpcGh5LT5md192ZXJzaW9uKSwKKwkJICIldS4ldS4ldS4ldSIsIElMX1VDT0RFX01BSk9SKGlsLT51Y29kZV92ZXIpLAorCQkgSUxfVUNPREVfTUlOT1IoaWwtPnVjb2RlX3ZlciksIElMX1VDT0RFX0FQSShpbC0+dWNvZGVfdmVyKSwKKwkJIElMX1VDT0RFX1NFUklBTChpbC0+dWNvZGVfdmVyKSk7CisKKwkvKgorCSAqIEZvciBhbnkgb2YgdGhlIGZhaWx1cmVzIGJlbG93IChiZWZvcmUgYWxsb2NhdGluZyBwY2kgbWVtb3J5KQorCSAqIHdlIHdpbGwgdHJ5IHRvIGxvYWQgYSB2ZXJzaW9uIHdpdGggYSBzbWFsbGVyIEFQSSAtLSBtYXliZSB0aGUKKwkgKiB1c2VyIGp1c3QgZ290IGEgY29ycnVwdGVkIHZlcnNpb24gb2YgdGhlIGxhdGVzdCBBUEkuCisJICovCisKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciB1Y29kZSB2ZXJzaW9uIHJhdyA9IDB4JXhcbiIsIGlsLT51Y29kZV92ZXIpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIHJ1bnRpbWUgaW5zdCBzaXplID0gJVpkXG4iLCBwaWVjZXMuaW5zdF9zaXplKTsKKwlEX0lORk8oImYvdyBwYWNrYWdlIGhkciBydW50aW1lIGRhdGEgc2l6ZSA9ICVaZFxuIiwgcGllY2VzLmRhdGFfc2l6ZSk7CisJRF9JTkZPKCJmL3cgcGFja2FnZSBoZHIgaW5pdCBpbnN0IHNpemUgPSAlWmRcbiIsIHBpZWNlcy5pbml0X3NpemUpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIGluaXQgZGF0YSBzaXplID0gJVpkXG4iLCBwaWVjZXMuaW5pdF9kYXRhX3NpemUpOworCURfSU5GTygiZi93IHBhY2thZ2UgaGRyIGJvb3QgaW5zdCBzaXplID0gJVpkXG4iLCBwaWVjZXMuYm9vdF9zaXplKTsKKworCS8qIFZlcmlmeSB0aGF0IHVDb2RlIGltYWdlcyB3aWxsIGZpdCBpbiBjYXJkJ3MgU1JBTSAqLworCWlmIChwaWVjZXMuaW5zdF9zaXplID4gaWwtPmh3X3BhcmFtcy5tYXhfaW5zdF9zaXplKSB7CisJCUlMX0VSUigidUNvZGUgaW5zdHIgbGVuICVaZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAorCQkgICAgICAgcGllY2VzLmluc3Rfc2l6ZSk7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCWlmIChwaWVjZXMuZGF0YV9zaXplID4gaWwtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplKSB7CisJCUlMX0VSUigidUNvZGUgZGF0YSBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCisJCSAgICAgICBwaWVjZXMuZGF0YV9zaXplKTsKKwkJZ290byB0cnlfYWdhaW47CisJfQorCisJaWYgKHBpZWNlcy5pbml0X3NpemUgPiBpbC0+aHdfcGFyYW1zLm1heF9pbnN0X3NpemUpIHsKKwkJSUxfRVJSKCJ1Q29kZSBpbml0IGluc3RyIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKKwkJICAgICAgIHBpZWNlcy5pbml0X3NpemUpOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwlpZiAocGllY2VzLmluaXRfZGF0YV9zaXplID4gaWwtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplKSB7CisJCUlMX0VSUigidUNvZGUgaW5pdCBkYXRhIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKKwkJICAgICAgIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSk7CisJCWdvdG8gdHJ5X2FnYWluOworCX0KKworCWlmIChwaWVjZXMuYm9vdF9zaXplID4gaWwtPmh3X3BhcmFtcy5tYXhfYnNtX3NpemUpIHsKKwkJSUxfRVJSKCJ1Q29kZSBib290IGluc3RyIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKKwkJICAgICAgIHBpZWNlcy5ib290X3NpemUpOworCQlnb3RvIHRyeV9hZ2FpbjsKKwl9CisKKwkvKiBBbGxvY2F0ZSB1Y29kZSBidWZmZXJzIGZvciBjYXJkJ3MgYnVzLW1hc3RlciBsb2FkaW5nIC4uLiAqLworCisJLyogUnVudGltZSBpbnN0cnVjdGlvbnMgYW5kIDIgY29waWVzIG9mIGRhdGE6CisJICogMSkgdW5tb2RpZmllZCBmcm9tIGRpc2sKKwkgKiAyKSBiYWNrdXAgY2FjaGUgZm9yIHNhdmUvcmVzdG9yZSBkdXJpbmcgcG93ZXItZG93bnMgKi8KKwlpbC0+dWNvZGVfY29kZS5sZW4gPSBwaWVjZXMuaW5zdF9zaXplOworCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfY29kZSk7CisKKwlpbC0+dWNvZGVfZGF0YS5sZW4gPSBwaWVjZXMuZGF0YV9zaXplOworCWlsX2FsbG9jX2Z3X2Rlc2MoaWwtPnBjaV9kZXYsICZpbC0+dWNvZGVfZGF0YSk7CisKKwlpbC0+dWNvZGVfZGF0YV9iYWNrdXAubGVuID0gcGllY2VzLmRhdGFfc2l6ZTsKKwlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2RhdGFfYmFja3VwKTsKKworCWlmICghaWwtPnVjb2RlX2NvZGUudl9hZGRyIHx8ICFpbC0+dWNvZGVfZGF0YS52X2FkZHIgfHwKKwkgICAgIWlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIpCisJCWdvdG8gZXJyX3BjaV9hbGxvYzsKKworCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyBhbmQgZGF0YSAqLworCWlmIChwaWVjZXMuaW5pdF9zaXplICYmIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSkgeworCQlpbC0+dWNvZGVfaW5pdC5sZW4gPSBwaWVjZXMuaW5pdF9zaXplOworCQlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2luaXQpOworCisJCWlsLT51Y29kZV9pbml0X2RhdGEubGVuID0gcGllY2VzLmluaXRfZGF0YV9zaXplOworCQlpbF9hbGxvY19md19kZXNjKGlsLT5wY2lfZGV2LCAmaWwtPnVjb2RlX2luaXRfZGF0YSk7CisKKwkJaWYgKCFpbC0+dWNvZGVfaW5pdC52X2FkZHIgfHwgIWlsLT51Y29kZV9pbml0X2RhdGEudl9hZGRyKQorCQkJZ290byBlcnJfcGNpX2FsbG9jOworCX0KKworCS8qIEJvb3RzdHJhcCAoaW5zdHJ1Y3Rpb25zIG9ubHksIG5vIGRhdGEpICovCisJaWYgKHBpZWNlcy5ib290X3NpemUpIHsKKwkJaWwtPnVjb2RlX2Jvb3QubGVuID0gcGllY2VzLmJvb3Rfc2l6ZTsKKwkJaWxfYWxsb2NfZndfZGVzYyhpbC0+cGNpX2RldiwgJmlsLT51Y29kZV9ib290KTsKKworCQlpZiAoIWlsLT51Y29kZV9ib290LnZfYWRkcikKKwkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKKwl9CisKKwkvKiBOb3cgdGhhdCB3ZSBjYW4gbm8gbG9uZ2VyIGZhaWwsIGNvcHkgaW5mb3JtYXRpb24gKi8KKworCWlsLT5zdGFfa2V5X21heF9udW0gPSBTVEFfS0VZX01BWF9OVU07CisKKwkvKiBDb3B5IGltYWdlcyBpbnRvIGJ1ZmZlcnMgZm9yIGNhcmQncyBidXMtbWFzdGVyIHJlYWRzIC4uLiAqLworCisJLyogUnVudGltZSBpbnN0cnVjdGlvbnMgKGZpcnN0IGJsb2NrIG9mIGRhdGEgaW4gZmlsZSkgKi8KKwlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgdUNvZGUgaW5zdHIgbGVuICVaZFxuIiwKKwkgICAgICAgcGllY2VzLmluc3Rfc2l6ZSk7CisJbWVtY3B5KGlsLT51Y29kZV9jb2RlLnZfYWRkciwgcGllY2VzLmluc3QsIHBpZWNlcy5pbnN0X3NpemUpOworCisJRF9JTkZPKCJ1Q29kZSBpbnN0ciBidWYgdmFkZHIgPSAweCVwLCBwYWRkciA9IDB4JTA4eFxuIiwKKwkgICAgICAgaWwtPnVjb2RlX2NvZGUudl9hZGRyLCAodTMyKSBpbC0+dWNvZGVfY29kZS5wX2FkZHIpOworCisJLyoKKwkgKiBSdW50aW1lIGRhdGEKKwkgKiBOT1RFOiAgQ29weSBpbnRvIGJhY2t1cCBidWZmZXIgd2lsbCBiZSBkb25lIGluIGlsX3VwKCkKKwkgKi8KKwlEX0lORk8oIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgdUNvZGUgZGF0YSBsZW4gJVpkXG4iLAorCSAgICAgICBwaWVjZXMuZGF0YV9zaXplKTsKKwltZW1jcHkoaWwtPnVjb2RlX2RhdGEudl9hZGRyLCBwaWVjZXMuZGF0YSwgcGllY2VzLmRhdGFfc2l6ZSk7CisJbWVtY3B5KGlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIHBpZWNlcy5kYXRhLCBwaWVjZXMuZGF0YV9zaXplKTsKKworCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyAqLworCWlmIChwaWVjZXMuaW5pdF9zaXplKSB7CisJCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBpbml0IGluc3RyIGxlbiAlWmRcbiIsCisJCSAgICAgICBwaWVjZXMuaW5pdF9zaXplKTsKKwkJbWVtY3B5KGlsLT51Y29kZV9pbml0LnZfYWRkciwgcGllY2VzLmluaXQsIHBpZWNlcy5pbml0X3NpemUpOworCX0KKworCS8qIEluaXRpYWxpemF0aW9uIGRhdGEgKi8KKwlpZiAocGllY2VzLmluaXRfZGF0YV9zaXplKSB7CisJCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBpbml0IGRhdGEgbGVuICVaZFxuIiwKKwkJICAgICAgIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSk7CisJCW1lbWNweShpbC0+dWNvZGVfaW5pdF9kYXRhLnZfYWRkciwgcGllY2VzLmluaXRfZGF0YSwKKwkJICAgICAgIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSk7CisJfQorCisJLyogQm9vdHN0cmFwIGluc3RydWN0aW9ucyAqLworCURfSU5GTygiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBib290IGluc3RyIGxlbiAlWmRcbiIsCisJICAgICAgIHBpZWNlcy5ib290X3NpemUpOworCW1lbWNweShpbC0+dWNvZGVfYm9vdC52X2FkZHIsIHBpZWNlcy5ib290LCBwaWVjZXMuYm9vdF9zaXplKTsKKworCS8qCisJICogZmlndXJlIG91dCB0aGUgb2Zmc2V0IG9mIGNoYWluIG5vaXNlIHJlc2V0IGFuZCBnYWluIGNvbW1hbmRzCisJICogYmFzZSBvbiB0aGUgc2l6ZSBvZiBzdGFuZGFyZCBwaHkgY2FsaWJyYXRpb24gY29tbWFuZHMgdGFibGUgc2l6ZQorCSAqLworCWlsLT5fNDk2NS5waHlfY2FsaWJfY2hhaW5fbm9pc2VfcmVzZXRfY21kID0KKwkgICAgc3RhbmRhcmRfcGh5X2NhbGlicmF0aW9uX3NpemU7CisJaWwtPl80OTY1LnBoeV9jYWxpYl9jaGFpbl9ub2lzZV9nYWluX2NtZCA9CisJICAgIHN0YW5kYXJkX3BoeV9jYWxpYnJhdGlvbl9zaXplICsgMTsKKworCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIFRoaXMgaXMgc3RpbGwgcGFydCBvZiBwcm9iZSgpIGluIGEgc2Vuc2UuLi4KKwkgKgorCSAqIDkuIFNldHVwIGFuZCByZWdpc3RlciB3aXRoIG1hYzgwMjExIGFuZCBkZWJ1Z2ZzCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCWVyciA9IGlsNDk2NV9tYWNfc2V0dXBfcmVnaXN0ZXIoaWwsIG1heF9wcm9iZV9sZW5ndGgpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VuYmluZDsKKworCWVyciA9IGlsX2RiZ2ZzX3JlZ2lzdGVyKGlsLCBEUlZfTkFNRSk7CisJaWYgKGVycikKKwkJSUxfRVJSKCJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZmlsZXMuIElnbm9yaW5nIGVycm9yOiAlZFxuIiwKKwkJICAgICAgIGVycik7CisKKwllcnIgPSBzeXNmc19jcmVhdGVfZ3JvdXAoJmlsLT5wY2lfZGV2LT5kZXYua29iaiwgJmlsX2F0dHJpYnV0ZV9ncm91cCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZXNcbiIpOworCQlnb3RvIG91dF91bmJpbmQ7CisJfQorCisJLyogV2UgaGF2ZSBvdXIgY29waWVzIG5vdywgYWxsb3cgT1MgcmVsZWFzZSBpdHMgY29waWVzICovCisJcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOworCWNvbXBsZXRlKCZpbC0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7CisJcmV0dXJuOworCit0cnlfYWdhaW46CisJLyogdHJ5IG5leHQsIGlmIGFueSAqLworCWlmIChpbDQ5NjVfcmVxdWVzdF9maXJtd2FyZShpbCwgZmFsc2UpKQorCQlnb3RvIG91dF91bmJpbmQ7CisJcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOworCXJldHVybjsKKworZXJyX3BjaV9hbGxvYzoKKwlJTF9FUlIoImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKKwlpbDQ5NjVfZGVhbGxvY191Y29kZV9wY2koaWwpOworb3V0X3VuYmluZDoKKwljb21wbGV0ZSgmaWwtPl80OTY1LmZpcm13YXJlX2xvYWRpbmdfY29tcGxldGUpOworCWRldmljZV9yZWxlYXNlX2RyaXZlcigmaWwtPnBjaV9kZXYtPmRldik7CisJcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZGVzY19sb29rdXBfdGV4dFtdID0geworCSJPSyIsCisJIkZBSUwiLAorCSJCQURfUEFSQU0iLAorCSJCQURfQ0hFQ0tTVU0iLAorCSJOTUlfSU5URVJSVVBUX1dERyIsCisJIlNZU0FTU0VSVCIsCisJIkZBVEFMX0VSUk9SIiwKKwkiQkFEX0NPTU1BTkQiLAorCSJIV19FUlJPUl9UVU5FX0xPQ0siLAorCSJIV19FUlJPUl9URU1QRVJBVFVSRSIsCisJIklMTEVHQUxfQ0hBTl9GUkVRIiwKKwkiVkNDX05PVF9TVEJMIiwKKwkiRkg0OV9FUlJPUiIsCisJIk5NSV9JTlRFUlJVUFRfSE9TVCIsCisJIk5NSV9JTlRFUlJVUFRfQUNUSU9OX1BUIiwKKwkiTk1JX0lOVEVSUlVQVF9VTktOT1dOIiwKKwkiVUNPREVfVkVSU0lPTl9NSVNNQVRDSCIsCisJIkhXX0VSUk9SX0FCU19MT0NLIiwKKwkiSFdfRVJST1JfQ0FMX0xPQ0tfRkFJTCIsCisJIk5NSV9JTlRFUlJVUFRfSU5TVF9BQ1RJT05fUFQiLAorCSJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwKKwkiTk1JX1RSTV9IV19FUiIsCisJIk5NSV9JTlRFUlJVUFRfVFJNIiwKKwkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIsCisJIkRFQlVHXzAiLAorCSJERUJVR18xIiwKKwkiREVCVUdfMiIsCisJIkRFQlVHXzMiLAorfTsKKworc3RhdGljIHN0cnVjdCB7CisJY2hhciAqbmFtZTsKKwl1OCBudW07Cit9IGFkdmFuY2VkX2xvb2t1cFtdID0geworCXsKKwkiTk1JX0lOVEVSUlVQVF9XREciLCAweDM0fSwgeworCSJTWVNBU1NFUlQiLCAweDM1fSwgeworCSJVQ09ERV9WRVJTSU9OX01JU01BVENIIiwgMHgzN30sIHsKKwkiQkFEX0NPTU1BTkQiLCAweDM4fSwgeworCSJOTUlfSU5URVJSVVBUX0RBVEFfQUNUSU9OX1BUIiwgMHgzQ30sIHsKKwkiRkFUQUxfRVJST1IiLCAweDNEfSwgeworCSJOTUlfVFJNX0hXX0VSUiIsIDB4NDZ9LCB7CisJIk5NSV9JTlRFUlJVUFRfVFJNIiwgMHg0Q30sIHsKKwkiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIsIDB4NTR9LCB7CisJIk5NSV9JTlRFUlJVUFRfV0RHX1JYRl9GVUxMIiwgMHg1Q30sIHsKKwkiTk1JX0lOVEVSUlVQVF9XREdfTk9fUkJEX1JYRl9GVUxMIiwgMHg2NH0sIHsKKwkiTk1JX0lOVEVSUlVQVF9IT1NUIiwgMHg2Nn0sIHsKKwkiTk1JX0lOVEVSUlVQVF9BQ1RJT05fUFQiLCAweDdDfSwgeworCSJOTUlfSU5URVJSVVBUX1VOS05PV04iLCAweDg0fSwgeworCSJOTUlfSU5URVJSVVBUX0lOU1RfQUNUSU9OX1BUIiwgMHg4Nn0sIHsKKyJBRFZBTkNFRF9TWVNBU1NFUlQiLCAwfSx9OworCitzdGF0aWMgY29uc3QgY2hhciAqCitpbDQ5NjVfZGVzY19sb29rdXAodTMyIG51bSkKK3sKKwlpbnQgaTsKKwlpbnQgbWF4ID0gQVJSQVlfU0laRShkZXNjX2xvb2t1cF90ZXh0KTsKKworCWlmIChudW0gPCBtYXgpCisJCXJldHVybiBkZXNjX2xvb2t1cF90ZXh0W251bV07CisKKwltYXggPSBBUlJBWV9TSVpFKGFkdmFuY2VkX2xvb2t1cCkgLSAxOworCWZvciAoaSA9IDA7IGkgPCBtYXg7IGkrKykgeworCQlpZiAoYWR2YW5jZWRfbG9va3VwW2ldLm51bSA9PSBudW0pCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGFkdmFuY2VkX2xvb2t1cFtpXS5uYW1lOworfQorCisjZGVmaW5lIEVSUk9SX1NUQVJUX09GRlNFVCAgKDEgKiBzaXplb2YodTMyKSkKKyNkZWZpbmUgRVJST1JfRUxFTV9TSVpFICAgICAoNyAqIHNpemVvZih1MzIpKQorCit2b2lkCitpbDQ5NjVfZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MzIgZGF0YTIsIGxpbmU7CisJdTMyIGRlc2MsIHRpbWUsIGNvdW50LCBiYXNlLCBkYXRhMTsKKwl1MzIgYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyOworCXUzMiBwYywgaGNtZDsKKworCWlmIChpbC0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKQorCQliYXNlID0gbGUzMl90b19jcHUoaWwtPmNhcmRfYWxpdmVfaW5pdC5lcnJvcl9ldmVudF90YWJsZV9wdHIpOworCWVsc2UKKwkJYmFzZSA9IGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlLmVycm9yX2V2ZW50X3RhYmxlX3B0cik7CisKKwlpZiAoIWlsLT5jZmctPm9wcy0+bGliLT5pc192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7CisJCUlMX0VSUigiTm90IHZhbGlkIGVycm9yIGxvZyBwb2ludGVyIDB4JTA4WCBmb3IgJXMgdUNvZGVcbiIsCisJCSAgICAgICBiYXNlLCAoaWwtPnVjb2RlX3R5cGUgPT0gVUNPREVfSU5JVCkgPyAiSW5pdCIgOiAiUlQiKTsKKwkJcmV0dXJuOworCX0KKworCWNvdW50ID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSk7CisKKwlpZiAoRVJST1JfU1RBUlRfT0ZGU0VUIDw9IGNvdW50ICogRVJST1JfRUxFTV9TSVpFKSB7CisJCUlMX0VSUigiU3RhcnQgSVdMIEVycm9yIExvZyBEdW1wOlxuIik7CisJCUlMX0VSUigiU3RhdHVzOiAweCUwOGxYLCBjb3VudDogJWRcbiIsIGlsLT5zdGF0dXMsIGNvdW50KTsKKwl9CisKKwlkZXNjID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIDEgKiBzaXplb2YodTMyKSk7CisJaWwtPmlzcl9zdGF0cy5lcnJfY29kZSA9IGRlc2M7CisJcGMgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgMiAqIHNpemVvZih1MzIpKTsKKwlibGluazEgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgMyAqIHNpemVvZih1MzIpKTsKKwlibGluazIgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgNCAqIHNpemVvZih1MzIpKTsKKwlpbGluazEgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgNSAqIHNpemVvZih1MzIpKTsKKwlpbGluazIgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgNiAqIHNpemVvZih1MzIpKTsKKwlkYXRhMSA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyA3ICogc2l6ZW9mKHUzMikpOworCWRhdGEyID0gaWxfcmVhZF90YXJnX21lbShpbCwgYmFzZSArIDggKiBzaXplb2YodTMyKSk7CisJbGluZSA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyA5ICogc2l6ZW9mKHUzMikpOworCXRpbWUgPSBpbF9yZWFkX3RhcmdfbWVtKGlsLCBiYXNlICsgMTEgKiBzaXplb2YodTMyKSk7CisJaGNtZCA9IGlsX3JlYWRfdGFyZ19tZW0oaWwsIGJhc2UgKyAyMiAqIHNpemVvZih1MzIpKTsKKworCUlMX0VSUigiRGVzYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lICAgICAgICIKKwkgICAgICAgImRhdGExICAgICAgZGF0YTIgICAgICBsaW5lXG4iKTsKKwlJTF9FUlIoIiUtMjhzICgweCUwNFgpICUwMTB1IDB4JTA4WCAweCUwOFggJXVcbiIsCisJICAgICAgIGlsNDk2NV9kZXNjX2xvb2t1cChkZXNjKSwgZGVzYywgdGltZSwgZGF0YTEsIGRhdGEyLCBsaW5lKTsKKwlJTF9FUlIoInBjICAgICAgYmxpbmsxICBibGluazIgIGlsaW5rMSAgaWxpbmsyICBoY21kXG4iKTsKKwlJTF9FUlIoIjB4JTA1WCAweCUwNVggMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYXG4iLCBwYywgYmxpbmsxLAorCSAgICAgICBibGluazIsIGlsaW5rMSwgaWxpbmsyLCBoY21kKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9yZl9raWxsX2N0X2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX2N0X2tpbGxfY29uZmlnIGNtZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsCisJICAgICAgIENTUl9VQ09ERV9EUlZfR1AxX1JFR19CSVRfQ1RfS0lMTF9FWElUKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJY21kLmNyaXRpY2FsX3RlbXBlcmF0dXJlX1IgPQorCSAgICBjcHVfdG9fbGUzMihpbC0+aHdfcGFyYW1zLmN0X2tpbGxfdGhyZXNob2xkKTsKKworCXJldCA9IGlsX3NlbmRfY21kX3BkdShpbCwgQ19DVF9LSUxMX0NPTkZJRywgc2l6ZW9mKGNtZCksICZjbWQpOworCWlmIChyZXQpCisJCUlMX0VSUigiQ19DVF9LSUxMX0NPTkZJRyBmYWlsZWRcbiIpOworCWVsc2UKKwkJRF9JTkZPKCJDX0NUX0tJTExfQ09ORklHICIgInN1Y2NlZWRlZCwgIgorCQkgICAgICAgImNyaXRpY2FsIHRlbXBlcmF0dXJlIGlzICVkXG4iLAorCQkgICAgICAgaWwtPmh3X3BhcmFtcy5jdF9raWxsX3RocmVzaG9sZCk7Cit9CisKK3N0YXRpYyBjb25zdCBzOCBkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm9bXSA9IHsKKwlJTF9UWF9GSUZPX1ZPLAorCUlMX1RYX0ZJRk9fVkksCisJSUxfVFhfRklGT19CRSwKKwlJTF9UWF9GSUZPX0JLLAorCUlMNDlfQ01EX0ZJRk9fTlVNLAorCUlMX1RYX0ZJRk9fVU5VU0VELAorCUlMX1RYX0ZJRk9fVU5VU0VELAorfTsKKworI2RlZmluZSBJTF9NQVNLKGxvLCBoaSkgKCgxIDw8IChoaSkpIHwgKCgxIDw8IChoaSkpIC0gKDEgPDwgKGxvKSkpKQorCitzdGF0aWMgaW50CitpbDQ5NjVfYWxpdmVfbm90aWZ5KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MzIgYTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBjaGFuOworCXUzMiByZWdfdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwkvKiBDbGVhciA0OTY1J3MgaW50ZXJuYWwgVHggU2NoZWR1bGVyIGRhdGEgYmFzZSAqLworCWlsLT5zY2RfYmFzZV9hZGRyID0gaWxfcmRfcHJwaChpbCwgSUw0OV9TQ0RfU1JBTV9CQVNFX0FERFIpOworCWEgPSBpbC0+c2NkX2Jhc2VfYWRkciArIElMNDlfU0NEX0NPTlRFWFRfREFUQV9PRkZTRVQ7CisJZm9yICg7IGEgPCBpbC0+c2NkX2Jhc2VfYWRkciArIElMNDlfU0NEX1RYX1NUVFNfQklUTUFQX09GRlNFVDsgYSArPSA0KQorCQlpbF93cml0ZV90YXJnX21lbShpbCwgYSwgMCk7CisJZm9yICg7IGEgPCBpbC0+c2NkX2Jhc2VfYWRkciArIElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUOyBhICs9IDQpCisJCWlsX3dyaXRlX3RhcmdfbWVtKGlsLCBhLCAwKTsKKwlmb3IgKDsKKwkgICAgIGEgPAorCSAgICAgaWwtPnNjZF9iYXNlX2FkZHIgKworCSAgICAgSUw0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUoaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bSk7CisJICAgICBhICs9IDQpCisJCWlsX3dyaXRlX3RhcmdfbWVtKGlsLCBhLCAwKTsKKworCS8qIFRlbCA0OTY1IHdoZXJlIHRvIGZpbmQgVHggYnl0ZSBjb3VudCB0YWJsZXMgKi8KKwlpbF93cl9wcnBoKGlsLCBJTDQ5X1NDRF9EUkFNX0JBU0VfQUREUiwgaWwtPnNjZF9iY190YmxzLmRtYSA+PiAxMCk7CisKKwkvKiBFbmFibGUgRE1BIGNoYW5uZWwgKi8KKwlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgRkg0OV9UQ1NSX0NITkxfTlVNOyBjaGFuKyspCisJCWlsX3dyKGlsLCBGSDQ5X1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNoYW4pLAorCQkgICAgICBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFIHwKKwkJICAgICAgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRU5BQkxFKTsKKworCS8qIFVwZGF0ZSBGSCBjaGlja2VuIGJpdHMgKi8KKwlyZWdfdmFsID0gaWxfcmQoaWwsIEZINDlfVFhfQ0hJQ0tFTl9CSVRTX1JFRyk7CisJaWxfd3IoaWwsIEZINDlfVFhfQ0hJQ0tFTl9CSVRTX1JFRywKKwkgICAgICByZWdfdmFsIHwgRkg0OV9UWF9DSElDS0VOX0JJVFNfU0NEX0FVVE9fUkVUUllfRU4pOworCisJLyogRGlzYWJsZSBjaGFpbiBtb2RlIGZvciBhbGwgcXVldWVzICovCisJaWxfd3JfcHJwaChpbCwgSUw0OV9TQ0RfUVVFVUVDSEFJTl9TRUwsIDApOworCisJLyogSW5pdGlhbGl6ZSBlYWNoIFR4IHF1ZXVlIChpbmNsdWRpbmcgdGhlIGNvbW1hbmQgcXVldWUpICovCisJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW07IGkrKykgeworCisJCS8qIFRGRCBjaXJjdWxhciBidWZmZXIgcmVhZC93cml0ZSBpZHhlcyAqLworCQlpbF93cl9wcnBoKGlsLCBJTDQ5X1NDRF9RVUVVRV9SRFBUUihpKSwgMCk7CisJCWlsX3dyKGlsLCBIQlVTX1RBUkdfV1JQVFIsIDAgfCAoaSA8PCA4KSk7CisKKwkJLyogTWF4IFR4IFdpbmRvdyBzaXplIGZvciBTY2hlZHVsZXItQUNLIG1vZGUgKi8KKwkJaWxfd3JpdGVfdGFyZ19tZW0oaWwsCisJCQkJICBpbC0+c2NkX2Jhc2VfYWRkciArCisJCQkJICBJTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVChpKSwKKwkJCQkgIChTQ0RfV0lOX1NJWkUgPDwKKwkJCQkgICBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9QT1MpICYKKwkJCQkgIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcxX1dJTl9TSVpFX01TSyk7CisKKwkJLyogRnJhbWUgbGltaXQgKi8KKwkJaWxfd3JpdGVfdGFyZ19tZW0oaWwsCisJCQkJICBpbC0+c2NkX2Jhc2VfYWRkciArCisJCQkJICBJTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVChpKSArCisJCQkJICBzaXplb2YodTMyKSwKKwkJCQkgIChTQ0RfRlJBTUVfTElNSVQgPDwKKwkJCQkgICBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MpICYKKwkJCQkgIElMNDlfU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX01TSyk7CisKKwl9CisJaWxfd3JfcHJwaChpbCwgSUw0OV9TQ0RfSU5URVJSVVBUX01BU0ssCisJCSAgICgxIDw8IGlsLT5od19wYXJhbXMubWF4X3R4cV9udW0pIC0gMSk7CisKKwkvKiBBY3RpdmF0ZSBhbGwgVHggRE1BL0ZJRk8gY2hhbm5lbHMgKi8KKwlpbDQ5NjVfdHhxX3NldF9zY2hlZChpbCwgSUxfTUFTSygwLCA2KSk7CisKKwlpbDQ5NjVfc2V0X3dyX3B0cnMoaWwsIElMX0RFRkFVTFRfQ01EX1FVRVVFX05VTSwgMCk7CisKKwkvKiBtYWtlIHN1cmUgYWxsIHF1ZXVlIGFyZSBub3Qgc3RvcHBlZCAqLworCW1lbXNldCgmaWwtPnF1ZXVlX3N0b3BwZWRbMF0sIDAsIHNpemVvZihpbC0+cXVldWVfc3RvcHBlZCkpOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWF0b21pY19zZXQoJmlsLT5xdWV1ZV9zdG9wX2NvdW50W2ldLCAwKTsKKworCS8qIHJlc2V0IHRvIDAgdG8gZW5hYmxlIGFsbCB0aGUgcXVldWUgZmlyc3QgKi8KKwlpbC0+dHhxX2N0eF9hY3RpdmVfbXNrID0gMDsKKwkvKiBNYXAgZWFjaCBUeC9jbWQgcXVldWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgZmlmbyAqLworCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGRlZmF1bHRfcXVldWVfdG9fdHhfZmlmbykgIT0gNyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm8pOyBpKyspIHsKKwkJaW50IGFjID0gZGVmYXVsdF9xdWV1ZV90b190eF9maWZvW2ldOworCisJCWlsX3R4cV9jdHhfYWN0aXZhdGUoaWwsIGkpOworCisJCWlmIChhYyA9PSBJTF9UWF9GSUZPX1VOVVNFRCkKKwkJCWNvbnRpbnVlOworCisJCWlsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKGlsLCAmaWwtPnR4cVtpXSwgYWMsIDApOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfYWxpdmVfc3RhcnQgLSBjYWxsZWQgYWZ0ZXIgTl9BTElWRSBub3RpZmljYXRpb24gcmVjZWl2ZWQKKyAqICAgICAgICAgICAgICAgICAgIGZyb20gcHJvdG9jb2wvcnVudGltZSB1Q29kZSAoaW5pdGlhbGl6YXRpb24gdUNvZGUncworICogICAgICAgICAgICAgICAgICAgQWxpdmUgZ2V0cyBoYW5kbGVkIGJ5IGlsX2luaXRfYWxpdmVfc3RhcnQoKSkuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfYWxpdmVfc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJRF9JTkZPKCJSdW50aW1lIEFsaXZlIHJlY2VpdmVkLlxuIik7CisKKwlpZiAoaWwtPmNhcmRfYWxpdmUuaXNfdmFsaWQgIT0gVUNPREVfVkFMSURfT0spIHsKKwkJLyogV2UgaGFkIGFuIGVycm9yIGJyaW5naW5nIHVwIHRoZSBoYXJkd2FyZSwgc28gdGFrZSBpdAorCQkgKiBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLworCQlEX0lORk8oIkFsaXZlIGZhaWxlZC5cbiIpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogSW5pdGlhbGl6ZSB1Q29kZSBoYXMgbG9hZGVkIFJ1bnRpbWUgdUNvZGUgLi4uIHZlcmlmeSBpbnN0IGltYWdlLgorCSAqIFRoaXMgaXMgYSBwYXJhbm9pZCBjaGVjaywgYmVjYXVzZSB3ZSB3b3VsZCBub3QgaGF2ZSBnb3R0ZW4gdGhlCisJICogInJ1bnRpbWUiIGFsaXZlIGlmIGNvZGUgd2VyZW4ndCBwcm9wZXJseSBsb2FkZWQuICAqLworCWlmIChpbDQ5NjVfdmVyaWZ5X3Vjb2RlKGlsKSkgeworCQkvKiBSdW50aW1lIGluc3RydWN0aW9uIGxvYWQgd2FzIGJhZDsKKwkJICogdGFrZSBpdCBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLworCQlEX0lORk8oIkJhZCBydW50aW1lIHVDb2RlIGxvYWQuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKworCXJldCA9IGlsNDk2NV9hbGl2ZV9ub3RpZnkoaWwpOworCWlmIChyZXQpIHsKKwkJSUxfV0FSTigiQ291bGQgbm90IGNvbXBsZXRlIEFMSVZFIHRyYW5zaXRpb24gW250Zl06ICVkXG4iLCByZXQpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogQWZ0ZXIgdGhlIEFMSVZFIHJlc3BvbnNlLCB3ZSBjYW4gc2VuZCBob3N0IGNvbW1hbmRzIHRvIHRoZSB1Q29kZSAqLworCXNldF9iaXQoU19BTElWRSwgJmlsLT5zdGF0dXMpOworCisJLyogRW5hYmxlIHdhdGNoZG9nIHRvIG1vbml0b3IgdGhlIGRyaXZlciB0eCBxdWV1ZXMgKi8KKwlpbF9zZXR1cF93YXRjaGRvZyhpbCk7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkKKwkJcmV0dXJuOworCisJaWVlZTgwMjExX3dha2VfcXVldWVzKGlsLT5odyk7CisKKwlpbC0+YWN0aXZlX3JhdGUgPSBSQVRFU19NQVNLOworCisJaWYgKGlsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKKwkJc3RydWN0IGlsX3J4b25fY21kICphY3RpdmVfcnhvbiA9CisJCSAgICAoc3RydWN0IGlsX3J4b25fY21kICopJmN0eC0+YWN0aXZlOworCQkvKiBhcHBseSBhbnkgY2hhbmdlcyBpbiBzdGFnaW5nICovCisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQlhY3RpdmVfcnhvbi0+ZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJfSBlbHNlIHsKKwkJLyogSW5pdGlhbGl6ZSBvdXIgcnhfY29uZmlnIGRhdGEgKi8KKwkJaWxfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhpbCwgJmlsLT5jdHgpOworCisJCWlmIChpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQorCQkJaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihpbCwgY3R4KTsKKwl9CisKKwkvKiBDb25maWd1cmUgYmx1ZXRvb3RoIGNvZXhpc3RlbmNlIGlmIGVuYWJsZWQgKi8KKwlpbF9zZW5kX2J0X2NvbmZpZyhpbCk7CisKKwlpbDQ5NjVfcmVzZXRfcnVuX3RpbWVfY2FsaWIoaWwpOworCisJc2V0X2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cyk7CisKKwkvKiBDb25maWd1cmUgdGhlIGFkYXB0ZXIgZm9yIHVuYXNzb2NpYXRlZCBvcGVyYXRpb24gKi8KKwlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBOSUMgaXMgaW5pdGlhbGl6ZWQgYW5kIG9wZXJhdGlvbmFsICovCisJaWw0OTY1X3JmX2tpbGxfY3RfY29uZmlnKGlsKTsKKworCURfSU5GTygiQUxJVkUgcHJvY2Vzc2luZyBjb21wbGV0ZS5cbiIpOworCXdha2VfdXAoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCisJaWxfcG93ZXJfdXBkYXRlX21vZGUoaWwsIHRydWUpOworCURfSU5GTygiVXBkYXRlZCBwb3dlciBtb2RlXG4iKTsKKworCXJldHVybjsKKworcmVzdGFydDoKKwlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+cmVzdGFydCk7Cit9CisKK3N0YXRpYyB2b2lkIGlsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCitzdGF0aWMgdm9pZAorX19pbDQ5NjVfZG93bihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXhpdF9wZW5kaW5nOworCisJRF9JTkZPKERSVl9OQU1FICIgaXMgZ29pbmcgZG93blxuIik7CisKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAyMDApOworCisJZXhpdF9wZW5kaW5nID0gdGVzdF9hbmRfc2V0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCisJLyogU3RvcCBUWCBxdWV1ZXMgd2F0Y2hkb2cuIFdlIG5lZWQgdG8gaGF2ZSBTX0VYSVRfUEVORElORyBiaXQgc2V0CisJICogdG8gcHJldmVudCByZWFybSB0aW1lciAqLworCWRlbF90aW1lcl9zeW5jKCZpbC0+d2F0Y2hkb2cpOworCisJaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMoaWwsIE5VTEwpOworCWlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMoaWwpOworCWlsX2NsZWFyX2RyaXZlcl9zdGF0aW9ucyhpbCk7CisKKwkvKiBVbmJsb2NrIGFueSB3YWl0aW5nIGNhbGxzICovCisJd2FrZV91cF9hbGwoJmlsLT53YWl0X2NvbW1hbmRfcXVldWUpOworCisJLyogV2lwZSBvdXQgdGhlIEVYSVRfUEVORElORyBzdGF0dXMgYml0IGlmIHdlIGFyZSBub3QgYWN0dWFsbHkKKwkgKiBleGl0aW5nIHRoZSBtb2R1bGUgKi8KKwlpZiAoIWV4aXRfcGVuZGluZykKKwkJY2xlYXJfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cyk7CisKKwkvKiBzdG9wIGFuZCByZXNldCB0aGUgb24tYm9hcmQgcHJvY2Vzc29yICovCisJX2lsX3dyKGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKKworCS8qIHRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsX2Rpc2FibGVfaW50ZXJydXB0cyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlpbDQ5NjVfc3luY2hyb25pemVfaXJxKGlsKTsKKworCWlmIChpbC0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKKwkJaWVlZTgwMjExX3N0b3BfcXVldWVzKGlsLT5odyk7CisKKwkvKiBJZiB3ZSBoYXZlIG5vdCBwcmV2aW91c2x5IGNhbGxlZCBpbF9pbml0KCkgdGhlbgorCSAqIGNsZWFyIGFsbCBiaXRzIGJ1dCB0aGUgUkYgS2lsbCBiaXQgYW5kIHJldHVybiAqLworCWlmICghaWxfaXNfaW5pdChpbCkpIHsKKwkJaWwtPnN0YXR1cyA9CisJCSAgICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsCisJCQkgICAgICZpbC0+CisJCQkgICAgIHN0YXR1cykgPDwgU19SRl9LSUxMX0hXIHwKKwkJICAgIHRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsCisJCQkgICAgICZpbC0+CisJCQkgICAgIHN0YXR1cykgPDwgU19HRU9fQ09ORklHVVJFRCB8CisJCSAgICB0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpIDw8IFNfRVhJVF9QRU5ESU5HOworCQlnb3RvIGV4aXQ7CisJfQorCisJLyogLi4ub3RoZXJ3aXNlIGNsZWFyIG91dCBhbGwgdGhlIHN0YXR1cyBiaXRzIGJ1dCB0aGUgUkYgS2lsbAorCSAqIGJpdCBhbmQgY29udGludWUgdGFraW5nIHRoZSBOSUMgZG93bi4gKi8KKwlpbC0+c3RhdHVzICY9CisJICAgIHRlc3RfYml0KFNfUkZfS0lMTF9IVywKKwkJICAgICAmaWwtPnN0YXR1cykgPDwgU19SRl9LSUxMX0hXIHwgdGVzdF9iaXQoU19HRU9fQ09ORklHVVJFRCwKKwkJCQkJCQkgICAgICZpbC0+CisJCQkJCQkJICAgICBzdGF0dXMpIDw8CisJICAgIFNfR0VPX0NPTkZJR1VSRUQgfCB0ZXN0X2JpdChTX0ZXX0VSUk9SLAorCQkJCQkmaWwtPgorCQkJCQlzdGF0dXMpIDw8IFNfRldfRVJST1IgfAorCSAgICB0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpIDw8IFNfRVhJVF9QRU5ESU5HOworCisJaWw0OTY1X3R4cV9jdHhfc3RvcChpbCk7CisJaWw0OTY1X3J4cV9zdG9wKGlsKTsKKworCS8qIFBvd2VyLWRvd24gZGV2aWNlJ3MgYnVzbWFzdGVyIERNQSBjbG9ja3MgKi8KKwlpbF93cl9wcnBoKGlsLCBBUE1HX0NMS19ESVNfUkVHLCBBUE1HX0NMS19WQUxfRE1BX0NMS19SUVQpOworCXVkZWxheSg1KTsKKworCS8qIE1ha2Ugc3VyZSAocmVkdW5kYW50KSB3ZSd2ZSByZWxlYXNlZCBvdXIgcmVxdWVzdCB0byBzdGF5IGF3YWtlICovCisJaWxfY2xlYXJfYml0KGlsLCBDU1JfR1BfQ05UUkwsIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7CisKKwkvKiBTdG9wIHRoZSBkZXZpY2UsIGFuZCBwdXQgaXQgaW4gbG93IHBvd2VyIHN0YXRlICovCisJaWxfYXBtX3N0b3AoaWwpOworCitleGl0OgorCW1lbXNldCgmaWwtPmNhcmRfYWxpdmUsIDAsIHNpemVvZihzdHJ1Y3QgaWxfYWxpdmVfcmVzcCkpOworCisJZGV2X2tmcmVlX3NrYihpbC0+YmVhY29uX3NrYik7CisJaWwtPmJlYWNvbl9za2IgPSBOVUxMOworCisJLyogY2xlYXIgb3V0IGFueSBmcmVlIGZyYW1lcyAqLworCWlsNDk2NV9jbGVhcl9mcmVlX2ZyYW1lcyhpbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfZG93bihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlfX2lsNDk2NV9kb3duKGlsKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlpbDQ5NjVfY2FuY2VsX2RlZmVycmVkX3dvcmsoaWwpOworfQorCisjZGVmaW5lIEhXX1JFQURZX1RJTUVPVVQgKDUwKQorCitzdGF0aWMgaW50CitpbDQ5NjVfc2V0X2h3X3JlYWR5KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZKTsKKworCS8qIFNlZSBpZiB3ZSBnb3QgaXQgKi8KKwlyZXQgPQorCSAgICBfaWxfcG9sbF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUkVBRFksCisJCQkgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19SRUFEWSwgSFdfUkVBRFlfVElNRU9VVCk7CisJaWYgKHJldCAhPSAtRVRJTUVET1VUKQorCQlpbC0+aHdfcmVhZHkgPSB0cnVlOworCWVsc2UKKwkJaWwtPmh3X3JlYWR5ID0gZmFsc2U7CisKKwlEX0lORk8oImhhcmR3YXJlICVzXG4iLCAoaWwtPmh3X3JlYWR5ID09IDEpID8gInJlYWR5IiA6ICJub3QgcmVhZHkiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfcHJlcGFyZV9jYXJkX2h3KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCURfSU5GTygiaWw0OTY1X3ByZXBhcmVfY2FyZF9odyBlbnRlclxuIik7CisKKwlyZXQgPSBpbDQ5NjVfc2V0X2h3X3JlYWR5KGlsKTsKKwlpZiAoaWwtPmh3X3JlYWR5KQorCQlyZXR1cm4gcmV0OworCisJLyogSWYgSFcgaXMgbm90IHJlYWR5LCBwcmVwYXJlIHRoZSBjb25kaXRpb25zIHRvIGNoZWNrIGFnYWluICovCisJaWxfc2V0X2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsIENTUl9IV19JRl9DT05GSUdfUkVHX1BSRVBBUkUpOworCisJcmV0ID0KKwkgICAgX2lsX3BvbGxfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJCSB+Q1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUsCisJCQkgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUsIDE1MDAwMCk7CisKKwkvKiBIVyBzaG91bGQgYmUgcmVhZHkgYnkgbm93LCBjaGVjayBhZ2Fpbi4gKi8KKwlpZiAocmV0ICE9IC1FVElNRURPVVQpCisJCWlsNDk2NV9zZXRfaHdfcmVhZHkoaWwpOworCisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBNQVhfSFdfUkVTVEFSVFMgNQorCitzdGF0aWMgaW50CitfX2lsNDk2NV91cChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGk7CisJaW50IHJldDsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKSB7CisJCUlMX1dBUk4oIkV4aXQgcGVuZGluZzsgd2lsbCBub3QgYnJpbmcgdGhlIE5JQyB1cFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghaWwtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciB8fCAhaWwtPnVjb2RlX2RhdGEudl9hZGRyKSB7CisJCUlMX0VSUigidWNvZGUgbm90IGF2YWlsYWJsZSBmb3IgZGV2aWNlIGJyaW5ndXBcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyZXQgPSBpbDQ5NjVfYWxsb2NfYmNhc3Rfc3RhdGlvbihpbCwgJmlsLT5jdHgpOworCWlmIChyZXQpIHsKKwkJaWxfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyhpbCk7CisJCXJldHVybiByZXQ7CisJfQorCisJaWw0OTY1X3ByZXBhcmVfY2FyZF9odyhpbCk7CisKKwlpZiAoIWlsLT5od19yZWFkeSkgeworCQlJTF9XQVJOKCJFeGl0IEhXIG5vdCByZWFkeVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIElmIHBsYXRmb3JtJ3MgUkZfS0lMTCBzd2l0Y2ggaXMgTk9UIHNldCB0byBLSUxMICovCisJaWYgKF9pbF9yZChpbCwgQ1NSX0dQX0NOVFJMKSAmIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKQorCQljbGVhcl9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7CisJZWxzZQorCQlzZXRfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCisJaWYgKGlsX2lzX3Jma2lsbChpbCkpIHsKKwkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShpbC0+aHctPndpcGh5LCB0cnVlKTsKKworCQlpbF9lbmFibGVfaW50ZXJydXB0cyhpbCk7CisJCUlMX1dBUk4oIlJhZGlvIGRpc2FibGVkIGJ5IEhXIFJGIEtpbGwgc3dpdGNoXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJX2lsX3dyKGlsLCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKKworCS8qIG11c3QgYmUgaW5pdGlhbGlzZWQgYmVmb3JlIGlsX2h3X25pY19pbml0ICovCisJaWwtPmNtZF9xdWV1ZSA9IElMX0RFRkFVTFRfQ01EX1FVRVVFX05VTTsKKworCXJldCA9IGlsNDk2NV9od19uaWNfaW5pdChpbCk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBpbml0IG5pY1xuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLworCV9pbF93cihpbCwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7CisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7CisKKwkvKiBjbGVhciAoYWdhaW4pLCB0aGVuIGVuYWJsZSBob3N0IGludGVycnVwdHMgKi8KKwlfaWxfd3IoaWwsIENTUl9JTlQsIDB4RkZGRkZGRkYpOworCWlsX2VuYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKworCS8qIHJlYWxseSBtYWtlIHN1cmUgcmZraWxsIGhhbmRzaGFrZSBiaXRzIGFyZSBjbGVhcmVkICovCisJX2lsX3dyKGlsLCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKKwlfaWxfd3IoaWwsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOworCisJLyogQ29weSBvcmlnaW5hbCB1Y29kZSBkYXRhIGltYWdlIGZyb20gZGlzayBpbnRvIGJhY2t1cCBjYWNoZS4KKwkgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IncworCSAqIGRhdGEgU1JBTSBmb3IgYSBjbGVhbiBzdGFydCB3aGVuIHRoZSBydW50aW1lIHByb2dyYW0gZmlyc3QgbG9hZHMuICovCisJbWVtY3B5KGlsLT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIGlsLT51Y29kZV9kYXRhLnZfYWRkciwKKwkgICAgICAgaWwtPnVjb2RlX2RhdGEubGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfSFdfUkVTVEFSVFM7IGkrKykgeworCisJCS8qIGxvYWQgYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUsCisJCSAqIGxvYWQgYm9vdHN0cmFwIHByb2dyYW0gaW50byBwcm9jZXNzb3IncyBtZW1vcnksCisJCSAqIHByZXBhcmUgdG8gbG9hZCB0aGUgImluaXRpYWxpemUiIHVDb2RlICovCisJCXJldCA9IGlsLT5jZmctPm9wcy0+bGliLT5sb2FkX3Vjb2RlKGlsKTsKKworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIlVuYWJsZSB0byBzZXQgdXAgYm9vdHN0cmFwIHVDb2RlOiAlZFxuIiwgcmV0KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogc3RhcnQgY2FyZDsgImluaXRpYWxpemUiIHdpbGwgbG9hZCBydW50aW1lIHVjb2RlICovCisJCWlsNDk2NV9uaWNfc3RhcnQoaWwpOworCisJCURfSU5GTyhEUlZfTkFNRSAiIGlzIGNvbWluZyB1cFxuIik7CisKKwkJcmV0dXJuIDA7CisJfQorCisJc2V0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCV9faWw0OTY1X2Rvd24oaWwpOworCWNsZWFyX2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpOworCisJLyogdHJpZWQgdG8gcmVzdGFydCBhbmQgY29uZmlnIHRoZSBkZXZpY2UgZm9yIGFzIGxvbmcgYXMgb3VyCisJICogcGF0aWVuY2UgY291bGQgd2l0aHN0YW5kICovCisJSUxfRVJSKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgYWZ0ZXIgJWQgYXR0ZW1wdHMuXG4iLCBpKTsKKwlyZXR1cm4gLUVJTzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogV29ya3F1ZXVlIGNhbGxiYWNrcworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2lsNDk2NV9iZ19pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPQorCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIGluaXRfYWxpdmVfc3RhcnQud29yayk7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlnb3RvIG91dDsKKworCWlsLT5jZmctPm9wcy0+bGliLT5pbml0X2FsaXZlX3N0YXJ0KGlsKTsKK291dDoKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfYmdfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9CisJICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaWxfcHJpdiwgYWxpdmVfc3RhcnQud29yayk7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlnb3RvIG91dDsKKworCWlsNDk2NV9hbGl2ZV9zdGFydChpbCk7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2JnX3J1bl90aW1lX2NhbGliX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWxfcHJpdiwKKwkJCQkJICBydW5fdGltZV9jYWxpYl93b3JrKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJaWYgKGlsLT5zdGFydF9jYWxpYikgeworCQlpbDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24oaWwsICh2b2lkICopJmlsLT5fNDk2NS5zdGF0cyk7CisJCWlsNDk2NV9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihpbCwgKHZvaWQgKikmaWwtPl80OTY1LnN0YXRzKTsKKwl9CisKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfYmdfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpbF9wcml2LCByZXN0YXJ0KTsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNfRldfRVJST1IsICZpbC0+c3RhdHVzKSkgeworCQltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCQlpbC0+Y3R4LnZpZiA9IE5VTEw7CisJCWlsLT5pc19vcGVuID0gMDsKKworCQlfX2lsNDk2NV9kb3duKGlsKTsKKworCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCWlsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhpbCk7CisJCWllZWU4MDIxMV9yZXN0YXJ0X2h3KGlsLT5odyk7CisJfSBlbHNlIHsKKwkJaWw0OTY1X2Rvd24oaWwpOworCisJCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKSB7CisJCQltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisJCQlyZXR1cm47CisJCX0KKworCQlfX2lsNDk2NV91cChpbCk7CisJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfYmdfcnhfcmVwbGVuaXNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGlsX3ByaXYsIHJ4X3JlcGxlbmlzaCk7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpbDQ5NjVfcnhfcmVwbGVuaXNoKGlsKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9ucworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBVQ09ERV9SRUFEWV9USU1FT1VUCSg0ICogSFopCisKKy8qCisgKiBOb3QgYSBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbiwgYnV0IGl0IGZpdHMgaW4gd2l0aCBhbGwgdGhlCisgKiBvdGhlciBtYWM4MDIxMSBmdW5jdGlvbnMgZ3JvdXBlZCBoZXJlLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfbWFjX3NldHVwX3JlZ2lzdGVyKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIG1heF9wcm9iZV9sZW5ndGgpCit7CisJaW50IHJldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGlsLT5odzsKKworCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gIml3bC00OTY1LXJzIjsKKworCS8qIFRlbGwgbWFjODAyMTEgb3VyIGNoYXJhY3RlcmlzdGljcyAqLworCWh3LT5mbGFncyA9CisJICAgIElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OIHwKKwkgICAgSUVFRTgwMjExX0hXX05FRURfRFRJTV9QRVJJT0QgfCBJRUVFODAyMTFfSFdfU1BFQ1RSVU1fTUdNVCB8CisJICAgIElFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVM7CisKKwlpZiAoaWwtPmNmZy0+c2t1ICYgSUxfU0tVX04pCisJCWh3LT5mbGFncyB8PQorCQkgICAgSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfU01QUyB8CisJCSAgICBJRUVFODAyMTFfSFdfU1VQUE9SVFNfU1RBVElDX1NNUFM7CisKKwlody0+c3RhX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2KTsKKwlody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaWxfdmlmX3ByaXYpOworCisJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gaWwtPmN0eC5pbnRlcmZhY2VfbW9kZXM7CisJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gaWwtPmN0eC5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOworCisJaHctPndpcGh5LT5mbGFncyB8PQorCSAgICBXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZIHwgV0lQSFlfRkxBR19ESVNBQkxFX0JFQUNPTl9ISU5UUzsKKworCS8qCisJICogRm9yIG5vdywgZGlzYWJsZSBQUyBieSBkZWZhdWx0IGJlY2F1c2UgaXQgYWZmZWN0cworCSAqIFJYIHBlcmZvcm1hbmNlIHNpZ25pZmljYW50bHkuCisJICovCisJaHctPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOworCisJaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVg7CisJLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBhIHplcm8tbGVuZ3RoIFNTSUQgZWxlbWVudCAqLworCWh3LT53aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gbWF4X3Byb2JlX2xlbmd0aCAtIDI0IC0gMjsKKworCS8qIERlZmF1bHQgdmFsdWU7IDQgRURDQSBRT1MgcHJpb3JpdGllcyAqLworCWh3LT5xdWV1ZXMgPSA0OworCisJaHctPm1heF9saXN0ZW5faW50ZXJ2YWwgPSBJTF9DT05OX01BWF9MSVNURU5fSU5URVJWQUw7CisKKwlpZiAoaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fY2hhbm5lbHMpCisJCWlsLT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0KKwkJICAgICZpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07CisJaWYgKGlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKQorCQlpbC0+aHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXSA9CisJCSAgICAmaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOworCisJaWxfbGVkc19pbml0KGlsKTsKKworCXJldCA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhpbC0+aHcpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJGYWlsZWQgdG8gcmVnaXN0ZXIgaHcgKGVycm9yICVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWw0OTY1X21hY19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlpbnQgcmV0OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJLyogd2Ugc2hvdWxkIGJlIHZlcmlmeWluZyB0aGUgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIG9wZW5lZCAqLworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJcmV0ID0gX19pbDQ5NjVfdXAoaWwpOworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkKKwkJZ290byBvdXQ7CisKKwlEX0lORk8oIlN0YXJ0IFVQIHdvcmsgZG9uZS5cbiIpOworCisJLyogV2FpdCBmb3IgU1RBUlRfQUxJVkUgZnJvbSBSdW4gVGltZSB1Y29kZS4gT3RoZXJ3aXNlIGNhbGxiYWNrcyBmcm9tCisJICogbWFjODAyMTEgd2lsbCBub3QgYmUgcnVuIHN1Y2Nlc3NmdWxseS4gKi8KKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQoaWwtPndhaXRfY29tbWFuZF9xdWV1ZSwKKwkJCQkgdGVzdF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpLAorCQkJCSBVQ09ERV9SRUFEWV9USU1FT1VUKTsKKwlpZiAoIXJldCkgeworCQlpZiAoIXRlc3RfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKSkgeworCQkJSUxfRVJSKCJTVEFSVF9BTElWRSB0aW1lb3V0IGFmdGVyICVkbXMuXG4iLAorCQkJCWppZmZpZXNfdG9fbXNlY3MoVUNPREVfUkVBRFlfVElNRU9VVCkpOworCQkJcmV0dXJuIC1FVElNRURPVVQ7CisJCX0KKwl9CisKKwlpbDQ5NjVfbGVkX2VuYWJsZShpbCk7CisKK291dDoKKwlpbC0+aXNfb3BlbiA9IDE7CisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCXJldHVybiAwOworfQorCit2b2lkCitpbDQ5NjVfbWFjX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwlpZiAoIWlsLT5pc19vcGVuKQorCQlyZXR1cm47CisKKwlpbC0+aXNfb3BlbiA9IDA7CisKKwlpbDQ5NjVfZG93bihpbCk7CisKKwlmbHVzaF93b3JrcXVldWUoaWwtPndvcmtxdWV1ZSk7CisKKwkvKiBVc2VyIHNwYWNlIHNvZnR3YXJlIG1heSBleHBlY3QgZ2V0dGluZyByZmtpbGwgY2hhbmdlcworCSAqIGV2ZW4gaWYgaW50ZXJmYWNlIGlzIGRvd24gKi8KKwlfaWxfd3IoaWwsIENTUl9JTlQsIDB4RkZGRkZGRkYpOworCWlsX2VuYWJsZV9yZmtpbGxfaW50KGlsKTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KKwordm9pZAoraWw0OTY1X21hY190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKworCURfTUFDRFVNUCgiZW50ZXJcbiIpOworCisJRF9UWCgiZGV2LT54bWl0KCVkIGJ5dGVzKSBhdCByYXRlIDB4JTAyeFxuIiwgc2tiLT5sZW4sCisJICAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIElFRUU4MDIxMV9TS0JfQ0Ioc2tiKSktPmJpdHJhdGUpOworCisJaWYgKGlsNDk2NV90eF9za2IoaWwsIHNrYikpCisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CisKKwlEX01BQ0RVTVAoImxlYXZlXG4iKTsKK30KKwordm9pZAoraWw0OTY1X21hY191cGRhdGVfdGtpcF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTMyIGl2MzIsIHUxNiAqIHBoYXNlMWtleSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWxfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJaWw0OTY1X3VwZGF0ZV90a2lwX2tleShpbCwgdmlmX3ByaXYtPmN0eCwga2V5Y29uZiwgc3RhLCBpdjMyLAorCQkJICAgICAgIHBoYXNlMWtleSk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7Cit9CisKK2ludAoraWw0OTY1X21hY19zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNldF9rZXlfY21kIGNtZCwKKwkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXN0cnVjdCBpbF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKKwlpbnQgcmV0OworCXU4IHN0YV9pZDsKKwlib29sIGlzX2RlZmF1bHRfd2VwX2tleSA9IGZhbHNlOworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJaWYgKGlsLT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0bykgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIGh3Y3J5cHRvIGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCX0KKworCXN0YV9pZCA9IGlsX3N0YV9pZF9vcl9icm9hZGNhc3QoaWwsIHZpZl9wcml2LT5jdHgsIHN0YSk7CisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pCisJCXJldHVybiAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAxMDApOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgZ2V0dGluZyBXRVAgZ3JvdXAga2V5IGFuZCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkga2V5IG1hcHBpbmcKKwkgKiBzbyBmYXIsIHdlIGFyZSBpbiBsZWdhY3kgd2VwIG1vZGUgKGdyb3VwIGtleSBvbmx5KSwgb3RoZXJ3aXNlIHdlIGFyZQorCSAqIGluIDFYIG1vZGUuCisJICogSW4gbGVnYWN5IHdlcCBtb2RlLCB3ZSB1c2UgYW5vdGhlciBob3N0IGNvbW1hbmQgdG8gdGhlIHVDb2RlLgorCSAqLworCWlmICgoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKKwkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgJiYgIXN0YSkgeworCQlpZiAoY21kID09IFNFVF9LRVkpCisJCQlpc19kZWZhdWx0X3dlcF9rZXkgPSAhY3R4LT5rZXlfbWFwcGluZ19rZXlzOworCQllbHNlCisJCQlpc19kZWZhdWx0X3dlcF9rZXkgPQorCQkJICAgIChrZXktPmh3X2tleV9pZHggPT0gSFdfS0VZX0RFRkFVTFQpOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTRVRfS0VZOgorCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KQorCQkJcmV0ID0KKwkJCSAgICBpbDQ5NjVfc2V0X2RlZmF1bHRfd2VwX2tleShpbCwgdmlmX3ByaXYtPmN0eCwga2V5KTsKKwkJZWxzZQorCQkJcmV0ID0KKwkJCSAgICBpbDQ5NjVfc2V0X2R5bmFtaWNfa2V5KGlsLCB2aWZfcHJpdi0+Y3R4LCBrZXksCisJCQkJCQkgICBzdGFfaWQpOworCisJCURfTUFDODAyMTEoImVuYWJsZSBod2NyeXB0byBrZXlcbiIpOworCQlicmVhazsKKwljYXNlIERJU0FCTEVfS0VZOgorCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KQorCQkJcmV0ID0gaWw0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoaWwsIGN0eCwga2V5KTsKKwkJZWxzZQorCQkJcmV0ID0gaWw0OTY1X3JlbW92ZV9keW5hbWljX2tleShpbCwgY3R4LCBrZXksIHN0YV9pZCk7CisKKwkJRF9NQUM4MDIxMSgiZGlzYWJsZSBod2NyeXB0byBrZXlcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK2lsNDk2NV9tYWNfYW1wZHVfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJZW51bSBpZWVlODAyMTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICogc3NuLAorCQkJdTggYnVmX3NpemUpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gaHctPnByaXY7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlEX0hUKCJBLU1QRFUgYWN0aW9uIG9uIGFkZHIgJXBNIHRpZCAlZFxuIiwgc3RhLT5hZGRyLCB0aWQpOworCisJaWYgKCEoaWwtPmNmZy0+c2t1ICYgSUxfU0tVX04pKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgorCQlEX0hUKCJzdGFydCBSeFxuIik7CisJCXJldCA9IGlsNDk2NV9zdGFfcnhfYWdnX3N0YXJ0KGlsLCBzdGEsIHRpZCwgKnNzbik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6CisJCURfSFQoInN0b3AgUnhcbiIpOworCQlyZXQgPSBpbDQ5NjVfc3RhX3J4X2FnZ19zdG9wKGlsLCBzdGEsIHRpZCk7CisJCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6CisJCURfSFQoInN0YXJ0IFR4XG4iKTsKKwkJcmV0ID0gaWw0OTY1X3R4X2FnZ19zdGFydChpbCwgdmlmLCBzdGEsIHRpZCwgc3NuKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUDoKKwkJRF9IVCgic3RvcCBUeFxuIik7CisJCXJldCA9IGlsNDk2NV90eF9hZ2dfc3RvcChpbCwgdmlmLCBzdGEsIHRpZCk7CisJCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUw6CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlyZXR1cm4gcmV0OworfQorCitpbnQKK2lsNDk2NV9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCWJvb2wgaXNfYXAgPSB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKKwlpbnQgcmV0OworCXU4IHN0YV9pZDsKKworCURfSU5GTygicmVjZWl2ZWQgcmVxdWVzdCB0byBhZGQgc3RhdGlvbiAlcE1cbiIsIHN0YS0+YWRkcik7CisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKwlEX0lORk8oInByb2NlZWRpbmcgdG8gYWRkIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCisJYXRvbWljX3NldCgmc3RhX3ByaXYtPnBlbmRpbmdfZnJhbWVzLCAwKTsKKworCXJldCA9CisJICAgIGlsX2FkZF9zdGF0aW9uX2NvbW1vbihpbCwgdmlmX3ByaXYtPmN0eCwgc3RhLT5hZGRyLCBpc19hcCwgc3RhLAorCQkJCSAgJnN0YV9pZCk7CisJaWYgKHJldCkgeworCQlJTF9FUlIoIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE0gKCVkKVxuIiwgc3RhLT5hZGRyLCByZXQpOworCQkvKiBTaG91bGQgd2UgcmV0dXJuIHN1Y2Nlc3MgaWYgcmV0dXJuIGNvZGUgaXMgRUVYSVNUID8gKi8KKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQlyZXR1cm4gcmV0OworCX0KKworCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gc3RhX2lkOworCisJLyogSW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgKi8KKwlEX0lORk8oIkluaXRpYWxpemluZyByYXRlIHNjYWxpbmcgZm9yIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCWlsNDk2NV9yc19yYXRlX2luaXQoaWwsIHN0YSwgc3RhX2lkKTsKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZAoraWw0OTY1X21hY19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm87CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNoX3N3aXRjaC0+Y2hhbm5lbDsKKwlzdHJ1Y3QgaWxfaHRfY29uZmlnICpodF9jb25mID0gJmlsLT5jdXJyZW50X2h0X2NvbmZpZzsKKworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXUxNiBjaDsKKworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkKKwkJZ290byBvdXQ7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCWdvdG8gb3V0OworCisJaWYgKCFpbF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKQorCQlnb3RvIG91dDsKKworCWlmICghaWwtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaCkKKwkJZ290byBvdXQ7CisKKwljaCA9IGNoYW5uZWwtPmh3X3ZhbHVlOworCWlmIChsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSA9PSBjaCkKKwkJZ290byBvdXQ7CisKKwljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgY2hhbm5lbC0+YmFuZCwgY2gpOworCWlmICghaWxfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkgeworCQlEX01BQzgwMjExKCJpbnZhbGlkIGNoYW5uZWxcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZpbC0+bG9jayk7CisKKwlpbC0+Y3VycmVudF9odF9jb25maWcuc21wcyA9IGNvbmYtPnNtcHNfbW9kZTsKKworCS8qIENvbmZpZ3VyZSBIVDQwIGNoYW5uZWxzICovCisJY3R4LT5odC5lbmFibGVkID0gY29uZl9pc19odChjb25mKTsKKwlpZiAoY3R4LT5odC5lbmFibGVkKSB7CisJCWlmIChjb25mX2lzX2h0NDBfbWludXMoY29uZikpIHsKKwkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCSAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzsKKwkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOworCQl9IGVsc2UgaWYgKGNvbmZfaXNfaHQ0MF9wbHVzKGNvbmYpKSB7CisJCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9CisJCQkgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU7CisJCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCSAgICBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOworCQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOworCQl9CisJfSBlbHNlCisJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKKworCWlmICgobGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpICE9IGNoKSkKKwkJY3R4LT5zdGFnaW5nLmZsYWdzID0gMDsKKworCWlsX3NldF9yeG9uX2NoYW5uZWwoaWwsIGNoYW5uZWwsIGN0eCk7CisJaWxfc2V0X3J4b25faHQoaWwsIGh0X2NvbmYpOworCWlsX3NldF9mbGFnc19mb3JfYmFuZChpbCwgY3R4LCBjaGFubmVsLT5iYW5kLCBjdHgtPnZpZik7CisKKwlzcGluX3VubG9ja19pcnEoJmlsLT5sb2NrKTsKKworCWlsX3NldF9yYXRlKGlsKTsKKwkvKgorCSAqIGF0IHRoaXMgcG9pbnQsIHN0YWdpbmdfcnhvbiBoYXMgdGhlCisJICogY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCBzd2l0Y2gKKwkgKi8KKwlzZXRfYml0KFNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJmlsLT5zdGF0dXMpOworCWlsLT5zd2l0Y2hfY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKKwlpZiAoaWwtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChpbCwgY2hfc3dpdGNoKSkgeworCQljbGVhcl9iaXQoU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmaWwtPnN0YXR1cyk7CisJCWlsLT5zd2l0Y2hfY2hhbm5lbCA9IDA7CisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKGN0eC0+dmlmLCBmYWxzZSk7CisJfQorCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKK30KKwordm9pZAoraWw0OTY1X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywgdTY0IG11bHRpY2FzdCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlfX2xlMzIgZmlsdGVyX29yID0gMCwgZmlsdGVyX25hbmQgPSAwOworCisjZGVmaW5lIENISyh0ZXN0LCBmbGFnKQlkbyB7IFwKKwlpZiAoKnRvdGFsX2ZsYWdzICYgKHRlc3QpKQkJXAorCQlmaWx0ZXJfb3IgfD0gKGZsYWcpOwkJXAorCWVsc2UJCQkJCVwKKwkJZmlsdGVyX25hbmQgfD0gKGZsYWcpOwkJXAorCX0gd2hpbGUgKDApCisKKwlEX01BQzgwMjExKCJFbnRlcjogY2hhbmdlZDogMHgleCwgdG90YWw6IDB4JXhcbiIsIGNoYW5nZWRfZmxhZ3MsCisJCSAgICp0b3RhbF9mbGFncyk7CisKKwlDSEsoRklGX09USEVSX0JTUyB8IEZJRl9QUk9NSVNDX0lOX0JTUywgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0spOworCS8qIFNldHRpbmcgX2p1c3RfIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSyBjYXVzZXMgRkggZXJyb3JzICovCisJQ0hLKEZJRl9DT05UUk9MLCBSWE9OX0ZJTFRFUl9DVEwySE9TVF9NU0sgfCBSWE9OX0ZJTFRFUl9QUk9NSVNDX01TSyk7CisJQ0hLKEZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDLCBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyk7CisKKyN1bmRlZiBDSEsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpbC0+Y3R4LnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5maWx0ZXJfbmFuZDsKKwlpbC0+Y3R4LnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IGZpbHRlcl9vcjsKKworCS8qCisJICogTm90IGNvbW1pdHRpbmcgZGlyZWN0bHkgYmVjYXVzZSBoYXJkd2FyZSBjYW4gcGVyZm9ybSBhIHNjYW4sCisJICogYnV0IHdlJ2xsIGV2ZW50dWFsbHkgY29tbWl0IHRoZSBmaWx0ZXIgZmxhZ3MgY2hhbmdlIGFueXdheS4KKwkgKi8KKworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCS8qCisJICogUmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgZnJhbWVzIGlzIGFsd2F5cyBlbmFibGVkIGJ5IHRoZQorCSAqIGRlZmF1bHQgZmxhZ3Mgc2V0dXAgaW4gaWxfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZygpCisJICogc2luY2Ugd2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHByb2dyYW1taW5nIG11bHRpY2FzdAorCSAqIGZpbHRlcnMgaW50byB0aGUgZGV2aWNlLgorCSAqLworCSp0b3RhbF9mbGFncyAmPQorCSAgICBGSUZfT1RIRVJfQlNTIHwgRklGX0FMTE1VTFRJIHwgRklGX1BST01JU0NfSU5fQlNTIHwKKwkgICAgRklGX0JDTl9QUkJSRVNQX1BST01JU0MgfCBGSUZfQ09OVFJPTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyZG93bgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2lsNDk2NV9iZ190eHBvd2VyX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWxfcHJpdiwKKwkJCQkJICB0eHBvd2VyX3dvcmspOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCS8qIElmIGEgc2NhbiBoYXBwZW5lZCB0byBzdGFydCBiZWZvcmUgd2UgZ290IGhlcmUKKwkgKiB0aGVuIGp1c3QgcmV0dXJuOyB0aGUgc3RhdHMgbm90aWZpY2F0aW9uIHdpbGwKKwkgKiBraWNrIG9mZiBhbm90aGVyIHNjaGVkdWxlZCB3b3JrIHRvIGNvbXBlbnNhdGUgZm9yCisJICogYW55IHRlbXBlcmF0dXJlIGRlbHRhIHdlIG1pc3NlZCBoZXJlLiAqLworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkKKwkJZ290byBvdXQ7CisKKwkvKiBSZWdhcmRsZXNzIG9mIGlmIHdlIGFyZSBhc3NvY2lhdGVkLCB3ZSBtdXN0IHJlY29uZmlndXJlIHRoZQorCSAqIFRYIHBvd2VyIHNpbmNlIGZyYW1lcyBjYW4gYmUgc2VudCBvbiBub24tcmFkYXIgY2hhbm5lbHMgd2hpbGUKKwkgKiBub3QgYXNzb2NpYXRlZCAqLworCWlsLT5jZmctPm9wcy0+bGliLT5zZW5kX3R4X3Bvd2VyKGlsKTsKKworCS8qIFVwZGF0ZSBsYXN0X3RlbXBlcmF0dXJlIHRvIGtlZXAgaXNfY2FsaWJfbmVlZGVkIGZyb20gcnVubmluZworCSAqIHdoZW4gaXQgaXNuJ3QgbmVlZGVkLi4uICovCisJaWwtPmxhc3RfdGVtcGVyYXR1cmUgPSBpbC0+dGVtcGVyYXR1cmU7CitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3NldHVwX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsLT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShEUlZfTkFNRSk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKworCUlOSVRfV09SSygmaWwtPnJlc3RhcnQsIGlsNDk2NV9iZ19yZXN0YXJ0KTsKKwlJTklUX1dPUksoJmlsLT5yeF9yZXBsZW5pc2gsIGlsNDk2NV9iZ19yeF9yZXBsZW5pc2gpOworCUlOSVRfV09SSygmaWwtPnJ1bl90aW1lX2NhbGliX3dvcmssIGlsNDk2NV9iZ19ydW5fdGltZV9jYWxpYl93b3JrKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWwtPmluaXRfYWxpdmVfc3RhcnQsIGlsNDk2NV9iZ19pbml0X2FsaXZlX3N0YXJ0KTsKKwlJTklUX0RFTEFZRURfV09SSygmaWwtPmFsaXZlX3N0YXJ0LCBpbDQ5NjVfYmdfYWxpdmVfc3RhcnQpOworCisJaWxfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKGlsKTsKKworCUlOSVRfV09SSygmaWwtPnR4cG93ZXJfd29yaywgaWw0OTY1X2JnX3R4cG93ZXJfd29yayk7CisKKwlpbml0X3RpbWVyKCZpbC0+c3RhdHNfcGVyaW9kaWMpOworCWlsLT5zdGF0c19wZXJpb2RpYy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpaWw7CisJaWwtPnN0YXRzX3BlcmlvZGljLmZ1bmN0aW9uID0gaWw0OTY1X2JnX3N0YXRzX3BlcmlvZGljOworCisJaW5pdF90aW1lcigmaWwtPndhdGNoZG9nKTsKKwlpbC0+d2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKWlsOworCWlsLT53YXRjaGRvZy5mdW5jdGlvbiA9IGlsX2JnX3dhdGNoZG9nOworCisJdGFza2xldF9pbml0KCZpbC0+aXJxX3Rhc2tsZXQsCisJCSAgICAgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKWlsNDk2NV9pcnFfdGFza2xldCwKKwkJICAgICAodW5zaWduZWQgbG9uZylpbCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWNhbmNlbF93b3JrX3N5bmMoJmlsLT50eHBvd2VyX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaWwtPmluaXRfYWxpdmVfc3RhcnQpOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmlsLT5hbGl2ZV9zdGFydCk7CisJY2FuY2VsX3dvcmtfc3luYygmaWwtPnJ1bl90aW1lX2NhbGliX3dvcmspOworCisJaWxfY2FuY2VsX3NjYW5fZGVmZXJyZWRfd29yayhpbCk7CisKKwlkZWxfdGltZXJfc3luYygmaWwtPnN0YXRzX3BlcmlvZGljKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9pbml0X2h3X3JhdGVzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlcykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UX0xFR0FDWTsgaSsrKSB7CisJCXJhdGVzW2ldLmJpdHJhdGUgPSBpbF9yYXRlc1tpXS5pZWVlICogNTsKKwkJcmF0ZXNbaV0uaHdfdmFsdWUgPSBpOwkvKiBSYXRlIHNjYWxpbmcgd2lsbCB3b3JrIG9uIGlkeGVzICovCisJCXJhdGVzW2ldLmh3X3ZhbHVlX3Nob3J0ID0gaTsKKwkJcmF0ZXNbaV0uZmxhZ3MgPSAwOworCQlpZiAoKGkgPj0gSUxfRklSU1RfQ0NLX1JBVEUpICYmIChpIDw9IElMX0xBU1RfQ0NLX1JBVEUpKSB7CisJCQkvKgorCQkJICogSWYgQ0NLICE9IDFNIHRoZW4gc2V0IHNob3J0IHByZWFtYmxlIHJhdGUgZmxhZy4KKwkJCSAqLworCQkJcmF0ZXNbaV0uZmxhZ3MgfD0KKwkJCSAgICAoaWxfcmF0ZXNbaV0ucGxjcCA9PQorCQkJICAgICBSQVRFXzFNX1BMQ1ApID8gMCA6IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFOworCQl9CisJfQorfQorCisvKgorICogQWNxdWlyZSBpbC0+bG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICEKKyAqLwordm9pZAoraWw0OTY1X3NldF93cl9wdHJzKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCwgdTMyIGlkeCkKK3sKKwlpbF93cihpbCwgSEJVU19UQVJHX1dSUFRSLCAoaWR4ICYgMHhmZikgfCAodHhxX2lkIDw8IDgpKTsKKwlpbF93cl9wcnBoKGlsLCBJTDQ5X1NDRF9RVUVVRV9SRFBUUih0eHFfaWQpLCBpZHgpOworfQorCit2b2lkCitpbDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJICAgaW50IHR4X2ZpZm9faWQsIGludCBzY2RfcmV0cnkpCit7CisJaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKKworCS8qIEZpbmQgb3V0IHdoZXRoZXIgdG8gYWN0aXZhdGUgVHggcXVldWUgKi8KKwlpbnQgYWN0aXZlID0gdGVzdF9iaXQodHhxX2lkLCAmaWwtPnR4cV9jdHhfYWN0aXZlX21zaykgPyAxIDogMDsKKworCS8qIFNldCB1cCBhbmQgYWN0aXZhdGUgKi8KKwlpbF93cl9wcnBoKGlsLCBJTDQ5X1NDRF9RVUVVRV9TVEFUVVNfQklUUyh0eHFfaWQpLAorCQkgICAoYWN0aXZlIDw8IElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUpIHwKKwkJICAgKHR4X2ZpZm9faWQgPDwgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1RYRikgfAorCQkgICAoc2NkX3JldHJ5IDw8IElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19XU0wpIHwKKwkJICAgKHNjZF9yZXRyeSA8PCBJTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfU0NEX0FDSykgfAorCQkgICBJTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19NU0spOworCisJdHhxLT5zY2hlZF9yZXRyeSA9IHNjZF9yZXRyeTsKKworCURfSU5GTygiJXMgJXMgUXVldWUgJWQgb24gQUMgJWRcbiIsIGFjdGl2ZSA/ICJBY3RpdmF0ZSIgOiAiRGVhY3RpdmF0ZSIsCisJICAgICAgIHNjZF9yZXRyeSA/ICJCQSIgOiAiQUMiLCB0eHFfaWQsIHR4X2ZpZm9faWQpOworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfaW5pdF9kcnYoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaW5pdCgmaWwtPnN0YV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmaWwtPmhjbWRfbG9jayk7CisKKwlJTklUX0xJU1RfSEVBRCgmaWwtPmZyZWVfZnJhbWVzKTsKKworCW11dGV4X2luaXQoJmlsLT5tdXRleCk7CisKKwlpbC0+aWVlZV9jaGFubmVscyA9IE5VTEw7CisJaWwtPmllZWVfcmF0ZXMgPSBOVUxMOworCWlsLT5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKKworCWlsLT5pd19tb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKKwlpbC0+Y3VycmVudF9odF9jb25maWcuc21wcyA9IElFRUU4MDIxMV9TTVBTX1NUQVRJQzsKKwlpbC0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBJTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUY7CisKKwkvKiBpbml0aWFsaXplIGZvcmNlIHJlc2V0ICovCisJaWwtPmZvcmNlX3Jlc2V0LnJlc2V0X2R1cmF0aW9uID0gSUxfREVMQVlfTkVYVF9GT1JDRV9GV19SRUxPQUQ7CisKKwkvKiBDaG9vc2Ugd2hpY2ggcmVjZWl2ZXJzL2FudGVubmFzIHRvIHVzZSAqLworCWlmIChpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQorCQlpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKGlsLCAmaWwtPmN0eCk7CisKKwlpbF9pbml0X3NjYW5fcGFyYW1zKGlsKTsKKworCXJldCA9IGlsX2luaXRfY2hhbm5lbF9tYXAoaWwpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJpbml0aWFsaXppbmcgcmVndWxhdG9yeSBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXQgPSBpbF9pbml0X2dlb3MoaWwpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJpbml0aWFsaXppbmcgZ2VvcyBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycl9mcmVlX2NoYW5uZWxfbWFwOworCX0KKwlpbDQ5NjVfaW5pdF9od19yYXRlcyhpbCwgaWwtPmllZWVfcmF0ZXMpOworCisJcmV0dXJuIDA7CisKK2Vycl9mcmVlX2NoYW5uZWxfbWFwOgorCWlsX2ZyZWVfY2hhbm5lbF9tYXAoaWwpOworZXJyOgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfdW5pbml0X2RydihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWw0OTY1X2NhbGliX2ZyZWVfcmVzdWx0cyhpbCk7CisJaWxfZnJlZV9nZW9zKGlsKTsKKwlpbF9mcmVlX2NoYW5uZWxfbWFwKGlsKTsKKwlrZnJlZShpbC0+c2Nhbl9jbWQpOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2h3X2RldGVjdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwtPmh3X3JldiA9IF9pbF9yZChpbCwgQ1NSX0hXX1JFVik7CisJaWwtPmh3X3dhX3JldiA9IF9pbF9yZChpbCwgQ1NSX0hXX1JFVl9XQV9SRUcpOworCWlsLT5yZXZfaWQgPSBpbC0+cGNpX2Rldi0+cmV2aXNpb247CisJRF9JTkZPKCJIVyBSZXZpc2lvbiBJRCA9IDB4JVhcbiIsIGlsLT5yZXZfaWQpOworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfc2V0X2h3X3BhcmFtcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWwtPmh3X3BhcmFtcy5tYXhfcnhxX3NpemUgPSBSWF9RVUVVRV9TSVpFOworCWlsLT5od19wYXJhbXMubWF4X3J4cV9sb2cgPSBSWF9RVUVVRV9TSVpFX0xPRzsKKwlpZiAoaWwtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKKwkJaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID0gZ2V0X29yZGVyKElMX1JYX0JVRl9TSVpFXzhLKTsKKwllbHNlCisJCWlsLT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA9IGdldF9vcmRlcihJTF9SWF9CVUZfU0laRV80Syk7CisKKwlpbC0+aHdfcGFyYW1zLm1heF9iZWFjb25faXRydmwgPSBJTF9NQVhfVUNPREVfQkVBQ09OX0lOVEVSVkFMOworCisJaWYgKGlsLT5jZmctPm1vZF9wYXJhbXMtPmRpc2FibGVfMTFuKQorCQlpbC0+Y2ZnLT5za3UgJj0gfklMX1NLVV9OOworCisJLyogRGV2aWNlLXNwZWNpZmljIHNldHVwICovCisJcmV0dXJuIGlsLT5jZmctPm9wcy0+bGliLT5zZXRfaHdfcGFyYW1zKGlsKTsKK30KKworc3RhdGljIGNvbnN0IHU4IGlsNDk2NV9ic3NfYWNfdG9fZmlmb1tdID0geworCUlMX1RYX0ZJRk9fVk8sCisJSUxfVFhfRklGT19WSSwKKwlJTF9UWF9GSUZPX0JFLAorCUlMX1RYX0ZJRk9fQkssCit9OworCitzdGF0aWMgY29uc3QgdTggaWw0OTY1X2Jzc19hY190b19xdWV1ZVtdID0geworCTAsIDEsIDIsIDMsCit9OworCitzdGF0aWMgaW50CitpbDQ5NjVfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQoreworCWludCBlcnIgPSAwOworCXN0cnVjdCBpbF9wcml2ICppbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKKwlzdHJ1Y3QgaWxfY2ZnICpjZmcgPSAoc3RydWN0IGlsX2NmZyAqKShlbnQtPmRyaXZlcl9kYXRhKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBwY2lfY21kOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqKgorCSAqIDEuIEFsbG9jYXRpbmcgSFcgZGF0YQorCSAqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwlodyA9IGlsX2FsbG9jX2FsbChjZmcpOworCWlmICghaHcpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCWlsID0gaHctPnByaXY7CisJLyogQXQgdGhpcyBwb2ludCBib3RoIGh3IGFuZCBpbCBhcmUgYWxsb2NhdGVkLiAqLworCisJaWwtPmN0eC5jdHhpZCA9IDA7CisKKwlpbC0+Y3R4LmFsd2F5c19hY3RpdmUgPSB0cnVlOworCWlsLT5jdHguaXNfYWN0aXZlID0gdHJ1ZTsKKwlpbC0+Y3R4LnJ4b25fY21kID0gQ19SWE9OOworCWlsLT5jdHgucnhvbl90aW1pbmdfY21kID0gQ19SWE9OX1RJTUlORzsKKwlpbC0+Y3R4LnJ4b25fYXNzb2NfY21kID0gQ19SWE9OX0FTU09DOworCWlsLT5jdHgucW9zX2NtZCA9IENfUU9TX1BBUkFNOworCWlsLT5jdHguYXBfc3RhX2lkID0gSUxfQVBfSUQ7CisJaWwtPmN0eC53ZXBfa2V5X2NtZCA9IENfV0VQS0VZOworCWlsLT5jdHguYWNfdG9fZmlmbyA9IGlsNDk2NV9ic3NfYWNfdG9fZmlmbzsKKwlpbC0+Y3R4LmFjX3RvX3F1ZXVlID0gaWw0OTY1X2Jzc19hY190b19xdWV1ZTsKKwlpbC0+Y3R4LmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpOworCWlsLT5jdHguaW50ZXJmYWNlX21vZGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pOworCWlsLT5jdHguYXBfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfQVA7CisJaWwtPmN0eC5pYnNzX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0lCU1M7CisJaWwtPmN0eC5zdGF0aW9uX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKKwlpbC0+Y3R4LnVudXNlZF9kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9FU1M7CisKKwlTRVRfSUVFRTgwMjExX0RFVihodywgJnBkZXYtPmRldik7CisKKwlEX0lORk8oIioqKiBMT0FEIERSSVZFUiAqKipcbiIpOworCWlsLT5jZmcgPSBjZmc7CisJaWwtPnBjaV9kZXYgPSBwZGV2OworCWlsLT5pbnRhX21hc2sgPSBDU1JfSU5JX1NFVF9NQVNLOworCisJaWYgKGlsX2FsbG9jX3RyYWZmaWNfbWVtKGlsKSkKKwkJSUxfRVJSKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBnZW5lcmF0ZSB0cmFmZmljIGxvZ1xuIik7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkgKiAyLiBJbml0aWFsaXppbmcgUENJIGJ1cworCSAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwlwY2lfZGlzYWJsZV9saW5rX3N0YXRlKHBkZXYsCisJCQkgICAgICAgUENJRV9MSU5LX1NUQVRFX0wwUyB8IFBDSUVfTElOS19TVEFURV9MMSB8CisJCQkgICAgICAgUENJRV9MSU5LX1NUQVRFX0NMS1BNKTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9pZWVlODAyMTFfZnJlZV9odzsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKworCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDM2KSk7CisJaWYgKCFlcnIpCisJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzYpKTsKKwlpZiAoZXJyKSB7CisJCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCWlmICghZXJyKQorCQkJZXJyID0KKwkJCSAgICBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7CisJCS8qIGJvdGggYXR0ZW1wdHMgZmFpbGVkOiAqLworCQlpZiAoZXJyKSB7CisJCQlJTF9XQVJOKCJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7CisJCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisJCX0KKwl9CisKKwllcnIgPSBwY2lfcmVxdWVzdF9yZWdpb25zKHBkZXYsIERSVl9OQU1FKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U7CisKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgaWwpOworCisJLyoqKioqKioqKioqKioqKioqKioqKioqCisJICogMy4gUmVhZCBSRVYgcmVnaXN0ZXIKKwkgKioqKioqKioqKioqKioqKioqKioqKiovCisJaWwtPmh3X2Jhc2UgPSBwY2lfaW9tYXAocGRldiwgMCwgMCk7CisJaWYgKCFpbC0+aHdfYmFzZSkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIG91dF9wY2lfcmVsZWFzZV9yZWdpb25zOworCX0KKworCURfSU5GTygicGNpX3Jlc291cmNlX2xlbiA9IDB4JTA4bGx4XG4iLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBjaV9yZXNvdXJjZV9sZW4ocGRldiwgMCkpOworCURfSU5GTygicGNpX3Jlc291cmNlX2Jhc2UgPSAlcFxuIiwgaWwtPmh3X2Jhc2UpOworCisJLyogdGhlc2Ugc3BpbiBsb2NrcyB3aWxsIGJlIHVzZWQgaW4gYXBtX29wcy5pbml0IGFuZCBFRVBST00gYWNjZXNzCisJICogd2Ugc2hvdWxkIGluaXQgbm93CisJICovCisJc3Bpbl9sb2NrX2luaXQoJmlsLT5yZWdfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmlsLT5sb2NrKTsKKworCS8qCisJICogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciBqdXN0IGluIGNhc2UgaXQgaXMgaW4gYQorCSAqIHN0cmFuZ2Ugc3RhdGUgLi4uIGxpa2UgYmVpbmcgbGVmdCBzdHJhbmRlZCBieSBhIHByaW1hcnkga2VybmVsCisJICogYW5kIHRoaXMgaXMgbm93IHRoZSBrZHVtcCBrZXJuZWwgdHJ5aW5nIHRvIHN0YXJ0IHVwCisJICovCisJX2lsX3dyKGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKKworCWlsNDk2NV9od19kZXRlY3QoaWwpOworCUlMX0lORk8oIkRldGVjdGVkICVzLCBSRVY9MHglWFxuIiwgaWwtPmNmZy0+bmFtZSwgaWwtPmh3X3Jldik7CisKKwkvKiBXZSBkaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwCisJICogUENJIFR4IHJldHJpZXMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIEMzIENQVSBzdGF0ZSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0ZHX1JFVFJZX1RJTUVPVVQsIDB4MDApOworCisJaWw0OTY1X3ByZXBhcmVfY2FyZF9odyhpbCk7CisJaWYgKCFpbC0+aHdfcmVhZHkpIHsKKwkJSUxfV0FSTigiRmFpbGVkLCBIVyBub3QgcmVhZHlcbiIpOworCQlnb3RvIG91dF9pb3VubWFwOworCX0KKworCS8qKioqKioqKioqKioqKioqKgorCSAqIDQuIFJlYWQgRUVQUk9NCisJICoqKioqKioqKioqKioqKioqLworCS8qIFJlYWQgdGhlIEVFUFJPTSAqLworCWVyciA9IGlsX2VlcHJvbV9pbml0KGlsKTsKKwlpZiAoZXJyKSB7CisJCUlMX0VSUigiVW5hYmxlIHRvIGluaXQgRUVQUk9NXG4iKTsKKwkJZ290byBvdXRfaW91bm1hcDsKKwl9CisJZXJyID0gaWw0OTY1X2VlcHJvbV9jaGVja192ZXJzaW9uKGlsKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2VlcHJvbTsKKworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfZWVwcm9tOworCisJLyogZXh0cmFjdCBNQUMgQWRkcmVzcyAqLworCWlsNDk2NV9lZXByb21fZ2V0X21hYyhpbCwgaWwtPmFkZHJlc3Nlc1swXS5hZGRyKTsKKwlEX0lORk8oIk1BQyBhZGRyZXNzOiAlcE1cbiIsIGlsLT5hZGRyZXNzZXNbMF0uYWRkcik7CisJaWwtPmh3LT53aXBoeS0+YWRkcmVzc2VzID0gaWwtPmFkZHJlc3NlczsKKwlpbC0+aHctPndpcGh5LT5uX2FkZHJlc3NlcyA9IDE7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqCisJICogNS4gU2V0dXAgSFcgY29uc3RhbnRzCisJICoqKioqKioqKioqKioqKioqKioqKioqKi8KKwlpZiAoaWw0OTY1X3NldF9od19wYXJhbXMoaWwpKSB7CisJCUlMX0VSUigiZmFpbGVkIHRvIHNldCBodyBwYXJhbWV0ZXJzXG4iKTsKKwkJZ290byBvdXRfZnJlZV9lZXByb207CisJfQorCisJLyoqKioqKioqKioqKioqKioqKioKKwkgKiA2LiBTZXR1cCBpbAorCSAqKioqKioqKioqKioqKioqKioqLworCisJZXJyID0gaWw0OTY1X2luaXRfZHJ2KGlsKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9mcmVlX2VlcHJvbTsKKwkvKiBBdCB0aGlzIHBvaW50IGJvdGggaHcgYW5kIGlsIGFyZSBpbml0aWFsaXplZC4gKi8KKworCS8qKioqKioqKioqKioqKioqKioqKgorCSAqIDcuIFNldHVwIHNlcnZpY2VzCisJICoqKioqKioqKioqKioqKioqKioqLworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCWlsX2Rpc2FibGVfaW50ZXJydXB0cyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCXBjaV9lbmFibGVfbXNpKGlsLT5wY2lfZGV2KTsKKworCWVyciA9IHJlcXVlc3RfaXJxKGlsLT5wY2lfZGV2LT5pcnEsIGlsX2lzciwgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBpbCk7CisJaWYgKGVycikgeworCQlJTF9FUlIoIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBpbC0+cGNpX2Rldi0+aXJxKTsKKwkJZ290byBvdXRfZGlzYWJsZV9tc2k7CisJfQorCisJaWw0OTY1X3NldHVwX2RlZmVycmVkX3dvcmsoaWwpOworCWlsNDk2NV9zZXR1cF9oYW5kbGVycyhpbCk7CisKKwkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJICogOC4gRW5hYmxlIGludGVycnVwdHMgYW5kIHJlYWQgUkZLSUxMIHN0YXRlCisJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCS8qIGVuYWJsZSByZmtpbGwgaW50ZXJydXB0OiBodyBidWcgdy9hICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQoaWwtPnBjaV9kZXYsIFBDSV9DT01NQU5ELCAmcGNpX2NtZCk7CisJaWYgKHBjaV9jbWQgJiBQQ0lfQ09NTUFORF9JTlRYX0RJU0FCTEUpIHsKKwkJcGNpX2NtZCAmPSB+UENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFOworCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQoaWwtPnBjaV9kZXYsIFBDSV9DT01NQU5ELCBwY2lfY21kKTsKKwl9CisKKwlpbF9lbmFibGVfcmZraWxsX2ludChpbCk7CisKKwkvKiBJZiBwbGF0Zm9ybSdzIFJGX0tJTEwgc3dpdGNoIGlzIE5PVCBzZXQgdG8gS0lMTCAqLworCWlmIChfaWxfcmQoaWwsIENTUl9HUF9DTlRSTCkgJiBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykKKwkJY2xlYXJfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpOworCWVsc2UKKwkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKworCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUoaWwtPmh3LT53aXBoeSwKKwkJCQkgIHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpKTsKKworCWlsX3Bvd2VyX2luaXRpYWxpemUoaWwpOworCisJaW5pdF9jb21wbGV0aW9uKCZpbC0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7CisKKwllcnIgPSBpbDQ5NjVfcmVxdWVzdF9maXJtd2FyZShpbCwgdHJ1ZSk7CisJaWYgKGVycikKKwkJZ290byBvdXRfZGVzdHJveV93b3JrcXVldWU7CisKKwlyZXR1cm4gMDsKKworb3V0X2Rlc3Ryb3lfd29ya3F1ZXVlOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGlsLT53b3JrcXVldWUpOworCWlsLT53b3JrcXVldWUgPSBOVUxMOworCWZyZWVfaXJxKGlsLT5wY2lfZGV2LT5pcnEsIGlsKTsKK291dF9kaXNhYmxlX21zaToKKwlwY2lfZGlzYWJsZV9tc2koaWwtPnBjaV9kZXYpOworCWlsNDk2NV91bmluaXRfZHJ2KGlsKTsKK291dF9mcmVlX2VlcHJvbToKKwlpbF9lZXByb21fZnJlZShpbCk7CitvdXRfaW91bm1hcDoKKwlwY2lfaW91bm1hcChwZGV2LCBpbC0+aHdfYmFzZSk7CitvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczoKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJcGNpX3JlbGVhc2VfcmVnaW9ucyhwZGV2KTsKK291dF9wY2lfZGlzYWJsZV9kZXZpY2U6CisJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOworb3V0X2llZWU4MDIxMV9mcmVlX2h3OgorCWlsX2ZyZWVfdHJhZmZpY19tZW0oaWwpOworCWllZWU4MDIxMV9mcmVlX2h3KGlsLT5odyk7CitvdXQ6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0CitpbDQ5NjVfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaWwpCisJCXJldHVybjsKKworCXdhaXRfZm9yX2NvbXBsZXRpb24oJmlsLT5fNDk2NS5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKKworCURfSU5GTygiKioqIFVOTE9BRCBEUklWRVIgKioqXG4iKTsKKworCWlsX2RiZ2ZzX3VucmVnaXN0ZXIoaWwpOworCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpbF9hdHRyaWJ1dGVfZ3JvdXApOworCisJLyogaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcgY2FsbCB3aWwgY2F1c2UgaWxfbWFjX3N0b3AgdG8KKwkgKiB0byBiZSBjYWxsZWQgYW5kIGlsNDk2NV9kb3duIHNpbmNlIHdlIGFyZSByZW1vdmluZyB0aGUgZGV2aWNlCisJICogd2UgbmVlZCB0byBzZXQgU19FWElUX1BFTkRJTkcgYml0LgorCSAqLworCXNldF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKKworCWlsX2xlZHNfZXhpdChpbCk7CisKKwlpZiAoaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQpIHsKKwkJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcoaWwtPmh3KTsKKwkJaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAwOworCX0gZWxzZSB7CisJCWlsNDk2NV9kb3duKGlsKTsKKwl9CisKKwkvKgorCSAqIE1ha2Ugc3VyZSBkZXZpY2UgaXMgcmVzZXQgdG8gbG93IHBvd2VyIGJlZm9yZSB1bmxvYWRpbmcgZHJpdmVyLgorCSAqIFRoaXMgbWF5IGJlIHJlZHVuZGFudCB3aXRoIGlsNDk2NV9kb3duKCksIGJ1dCB0aGVyZSBhcmUgcGF0aHMgdG8KKwkgKiBydW4gaWw0OTY1X2Rvd24oKSB3aXRob3V0IGNhbGxpbmcgYXBtX29wcy5zdG9wKCksIGFuZCB0aGVyZSBhcmUKKwkgKiBwYXRocyB0byBhdm9pZCBydW5uaW5nIGlsNDk2NV9kb3duKCkgYXQgYWxsIGJlZm9yZSBsZWF2aW5nIGRyaXZlci4KKwkgKiBUaGlzIChpbmV4cGVuc2l2ZSkgY2FsbCAqbWFrZXMgc3VyZSogZGV2aWNlIGlzIHJlc2V0LgorCSAqLworCWlsX2FwbV9zdG9wKGlsKTsKKworCS8qIG1ha2Ugc3VyZSB3ZSBmbHVzaCBhbnkgcGVuZGluZyBpcnEgb3IKKwkgKiB0YXNrbGV0IGZvciB0aGUgZHJpdmVyCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisJaWxfZGlzYWJsZV9pbnRlcnJ1cHRzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWw0OTY1X3N5bmNocm9uaXplX2lycShpbCk7CisKKwlpbDQ5NjVfZGVhbGxvY191Y29kZV9wY2koaWwpOworCisJaWYgKGlsLT5yeHEuYmQpCisJCWlsNDk2NV9yeF9xdWV1ZV9mcmVlKGlsLCAmaWwtPnJ4cSk7CisJaWw0OTY1X2h3X3R4cV9jdHhfZnJlZShpbCk7CisKKwlpbF9lZXByb21fZnJlZShpbCk7CisKKwkvKm5ldGlmX3N0b3BfcXVldWUoZGV2KTsgKi8KKwlmbHVzaF93b3JrcXVldWUoaWwtPndvcmtxdWV1ZSk7CisKKwkvKiBpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyBjYWxscyBpbF9tYWNfc3RvcCwgd2hpY2ggZmx1c2hlcworCSAqIGlsLT53b3JrcXVldWUuLi4gc28gd2UgY2FuJ3QgdGFrZSBkb3duIHRoZSB3b3JrcXVldWUKKwkgKiB1bnRpbCBub3cuLi4gKi8KKwlkZXN0cm95X3dvcmtxdWV1ZShpbC0+d29ya3F1ZXVlKTsKKwlpbC0+d29ya3F1ZXVlID0gTlVMTDsKKwlpbF9mcmVlX3RyYWZmaWNfbWVtKGlsKTsKKworCWZyZWVfaXJxKGlsLT5wY2lfZGV2LT5pcnEsIGlsKTsKKwlwY2lfZGlzYWJsZV9tc2koaWwtPnBjaV9kZXYpOworCXBjaV9pb3VubWFwKHBkZXYsIGlsLT5od19iYXNlKTsKKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOworCXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisKKwlpbDQ5NjVfdW5pbml0X2RydihpbCk7CisKKwlkZXZfa2ZyZWVfc2tiKGlsLT5iZWFjb25fc2tiKTsKKworCWllZWU4MDIxMV9mcmVlX2h3KGlsLT5odyk7Cit9CisKKy8qCisgKiBBY3RpdmF0ZS9EZWFjdGl2YXRlIFR4IERNQS9GSUZPIGNoYW5uZWxzIGFjY29yZGluZyB0eCBmaWZvcyBtYXNrCisgKiBtdXN0IGJlIGNhbGxlZCB1bmRlciBpbC0+bG9jayBhbmQgbWFjIGFjY2VzcworICovCit2b2lkCitpbDQ5NjVfdHhxX3NldF9zY2hlZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBtYXNrKQoreworCWlsX3dyX3BycGgoaWwsIElMNDlfU0NEX1RYRkFDVCwgbWFzayk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIGRyaXZlciBhbmQgbW9kdWxlIGVudHJ5IHBvaW50CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBIYXJkd2FyZSBzcGVjaWZpYyBmaWxlIGRlZmluZXMgdGhlIFBDSSBJRHMgdGFibGUgZm9yIHRoYXQgaGFyZHdhcmUgbW9kdWxlICovCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaWw0OTY1X2h3X2NhcmRfaWRzKSA9IHsKKwl7SUxfUENJX0RFVklDRSgweDQyMjksIFBDSV9BTllfSUQsIGlsNDk2NV9jZmcpfSwKKwl7SUxfUENJX0RFVklDRSgweDQyMzAsIFBDSV9BTllfSUQsIGlsNDk2NV9jZmcpfSwKKwl7MH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWw0OTY1X2h3X2NhcmRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGlsNDk2NV9kcml2ZXIgPSB7CisJLm5hbWUgPSBEUlZfTkFNRSwKKwkuaWRfdGFibGUgPSBpbDQ5NjVfaHdfY2FyZF9pZHMsCisJLnByb2JlID0gaWw0OTY1X3BjaV9wcm9iZSwKKwkucmVtb3ZlID0gX19kZXZleGl0X3AoaWw0OTY1X3BjaV9yZW1vdmUpLAorCS5kcml2ZXIucG0gPSBJTF9MRUdBQ1lfUE1fT1BTLAorfTsKKworc3RhdGljIGludCBfX2luaXQKK2lsNDk2NV9pbml0KHZvaWQpCit7CisKKwlpbnQgcmV0OworCXByX2luZm8oRFJWX0RFU0NSSVBUSU9OICIsICIgRFJWX1ZFUlNJT04gIlxuIik7CisJcHJfaW5mbyhEUlZfQ09QWVJJR0hUICJcbiIpOworCisJcmV0ID0gaWw0OTY1X3JhdGVfY29udHJvbF9yZWdpc3RlcigpOworCWlmIChyZXQpIHsKKwkJcHJfZXJyKCJVbmFibGUgdG8gcmVnaXN0ZXIgcmF0ZSBjb250cm9sIGFsZ29yaXRobTogJWRcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0ID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmaWw0OTY1X2RyaXZlcik7CisJaWYgKHJldCkgeworCQlwcl9lcnIoIlVuYWJsZSB0byBpbml0aWFsaXplIFBDSSBtb2R1bGVcbiIpOworCQlnb3RvIGVycm9yX3JlZ2lzdGVyOworCX0KKworCXJldHVybiByZXQ7CisKK2Vycm9yX3JlZ2lzdGVyOgorCWlsNDk2NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAoraWw0OTY1X2V4aXQodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmlsNDk2NV9kcml2ZXIpOworCWlsNDk2NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOworfQorCittb2R1bGVfZXhpdChpbDQ5NjVfZXhpdCk7Cittb2R1bGVfaW5pdChpbDQ5NjVfaW5pdCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK21vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaWxfZGVidWdfbGV2ZWwsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKK01PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOworI2VuZGlmCisKK21vZHVsZV9wYXJhbV9uYW1lZChzd2NyeXB0bywgaWw0OTY1X21vZF9wYXJhbXMuc3dfY3J5cHRvLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhzd2NyeXB0bywgInVzaW5nIGNyeXB0byBpbiBzb2Z0d2FyZSAoZGVmYXVsdCAwIFtoYXJkd2FyZV0pIik7Cittb2R1bGVfcGFyYW1fbmFtZWQocXVldWVzX251bSwgaWw0OTY1X21vZF9wYXJhbXMubnVtX29mX3F1ZXVlcywgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MocXVldWVzX251bSwgIm51bWJlciBvZiBodyBxdWV1ZXMuIik7Cittb2R1bGVfcGFyYW1fbmFtZWQoMTFuX2Rpc2FibGUsIGlsNDk2NV9tb2RfcGFyYW1zLmRpc2FibGVfMTFuLCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQygxMW5fZGlzYWJsZSwgImRpc2FibGUgMTFuIGZ1bmN0aW9uYWxpdHkiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChhbXNkdV9zaXplXzhLLCBpbDQ5NjVfbW9kX3BhcmFtcy5hbXNkdV9zaXplXzhLLCBpbnQsCisJCSAgIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhhbXNkdV9zaXplXzhLLCAiZW5hYmxlIDhLIGFtc2R1IHNpemUiKTsKK21vZHVsZV9wYXJhbV9uYW1lZChmd19yZXN0YXJ0LCBpbDQ5NjVfbW9kX3BhcmFtcy5yZXN0YXJ0X2Z3LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhmd19yZXN0YXJ0LCAicmVzdGFydCBmaXJtd2FyZSBpbiBjYXNlIG9mIGVycm9yIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LXJzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LXJzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY3ZDBjYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUtcnMuYwpAQCAtMCwwICsxLDI4NjAgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCisgKgorICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCisgKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgIjQ5NjUuaCIKKworI2RlZmluZSBJTDQ5NjVfUlNfTkFNRSAiaXdsLTQ5NjUtcnMiCisKKyNkZWZpbmUgTlVNX1RSWV9CRUZPUkVfQU5UX1RPR0dMRSAxCisjZGVmaW5lIElMX05VTUJFUl9UUlkgICAgICAxCisjZGVmaW5lIElMX0hUX05VTUJFUl9UUlkgICAzCisKKyNkZWZpbmUgUkFURV9NQVhfV0lORE9XCQk2MgkvKiAjIHR4IGluIGhpc3Rvcnkgd2luICovCisjZGVmaW5lIFJBVEVfTUlOX0ZBSUxVUkVfVEgJCTYJLyogbWluIGZhaWx1cmVzIHRvIGNhbGMgdHB0ICovCisjZGVmaW5lIFJBVEVfTUlOX1NVQ0NFU1NfVEgJCTgJLyogbWluIHN1Y2Nlc3NlcyB0byBjYWxjIHRwdCAqLworCisvKiBtYXggYWxsb3dlZCByYXRlIG1pc3MgYmVmb3JlIHN5bmMgTFEgY21kICovCisjZGVmaW5lIElMX01JU1NFRF9SQVRFX01BWAkJMTUKKy8qIG1heCB0aW1lIHRvIGFjY3VtIGhpc3RvcnkgMiBzZWNvbmRzICovCisjZGVmaW5lIFJBVEVfU0NBTEVfRkxVU0hfSU5UVkwgICAoMypIWikKKworc3RhdGljIHU4IHJzX2h0X3RvX2xlZ2FjeVtdID0geworCVJBVEVfNk1fSURYLCBSQVRFXzZNX0lEWCwKKwlSQVRFXzZNX0lEWCwgUkFURV82TV9JRFgsCisJUkFURV82TV9JRFgsCisJUkFURV82TV9JRFgsIFJBVEVfOU1fSURYLAorCVJBVEVfMTJNX0lEWCwgUkFURV8xOE1fSURYLAorCVJBVEVfMjRNX0lEWCwgUkFURV8zNk1fSURYLAorCVJBVEVfNDhNX0lEWCwgUkFURV81NE1fSURYCit9OworCitzdGF0aWMgY29uc3QgdTggYW50X3RvZ2dsZV9sb29rdXBbXSA9IHsKKwkvKkFOVF9OT05FIC0+ICovIEFOVF9OT05FLAorCS8qQU5UX0EgICAgLT4gKi8gQU5UX0IsCisJLypBTlRfQiAgICAtPiAqLyBBTlRfQywKKwkvKkFOVF9BQiAgIC0+ICovIEFOVF9CQywKKwkvKkFOVF9DICAgIC0+ICovIEFOVF9BLAorCS8qQU5UX0FDICAgLT4gKi8gQU5UX0FCLAorCS8qQU5UX0JDICAgLT4gKi8gQU5UX0FDLAorCS8qQU5UX0FCQyAgLT4gKi8gQU5UX0FCQywKK307CisKKyNkZWZpbmUgSUxfREVDTEFSRV9SQVRFX0lORk8ociwgcywgaXAsIGluLCBycCwgcm4sIHBwLCBucCkgICAgXAorCVtSQVRFXyMjciMjTV9JRFhdID0geyBSQVRFXyMjciMjTV9QTENQLCAgICAgIFwKKwkJCQkgICAgUkFURV9TSVNPXyMjcyMjTV9QTENQLCBcCisJCQkJICAgIFJBVEVfTUlNTzJfIyNzIyNNX1BMQ1AsXAorCQkJCSAgICBSQVRFXyMjciMjTV9JRUVFLCAgICAgIFwKKwkJCQkgICAgUkFURV8jI2lwIyNNX0lEWCwgICAgXAorCQkJCSAgICBSQVRFXyMjaW4jI01fSURYLCAgICBcCisJCQkJICAgIFJBVEVfIyNycCMjTV9JRFgsICAgIFwKKwkJCQkgICAgUkFURV8jI3JuIyNNX0lEWCwgICAgXAorCQkJCSAgICBSQVRFXyMjcHAjI01fSURYLCAgICBcCisJCQkJICAgIFJBVEVfIyNucCMjTV9JRFggfQorCisvKgorICogUGFyYW1ldGVyIG9yZGVyOgorICogICByYXRlLCBodCByYXRlLCBwcmV2IHJhdGUsIG5leHQgcmF0ZSwgcHJldiB0Z2cgcmF0ZSwgbmV4dCB0Z2cgcmF0ZQorICoKKyAqIElmIHRoZXJlIGlzbid0IGEgdmFsaWQgbmV4dCBvciBwcmV2aW91cyByYXRlIHRoZW4gSU5WIGlzIHVzZWQgd2hpY2gKKyAqIG1hcHMgdG8gUkFURV9JTlZBTElECisgKgorICovCitjb25zdCBzdHJ1Y3QgaWxfcmF0ZV9pbmZvIGlsX3JhdGVzW1JBVEVfQ09VTlRdID0geworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDEsIElOViwgSU5WLCAyLCBJTlYsIDIsIElOViwgMiksCS8qICAxbWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDIsIElOViwgMSwgNSwgMSwgNSwgMSwgNSksCQkvKiAgMm1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTyg1LCBJTlYsIDIsIDYsIDIsIDExLCAyLCAxMSksCS8qNS41bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDExLCBJTlYsIDksIDEyLCA5LCAxMiwgNSwgMTgpLAkvKiAxMW1icHMgKi8KKwlJTF9ERUNMQVJFX1JBVEVfSU5GTyg2LCA2LCA1LCA5LCA1LCAxMSwgNSwgMTEpLAkJLyogIDZtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oOSwgNiwgNiwgMTEsIDYsIDExLCA1LCAxMSksCS8qICA5bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDEyLCAxMiwgMTEsIDE4LCAxMSwgMTgsIDExLCAxOCksCS8qIDEybWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDE4LCAxOCwgMTIsIDI0LCAxMiwgMjQsIDExLCAyNCksCS8qIDE4bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDI0LCAyNCwgMTgsIDM2LCAxOCwgMzYsIDE4LCAzNiksCS8qIDI0bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDM2LCAzNiwgMjQsIDQ4LCAyNCwgNDgsIDI0LCA0OCksCS8qIDM2bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDQ4LCA0OCwgMzYsIDU0LCAzNiwgNTQsIDM2LCA1NCksCS8qIDQ4bWJwcyAqLworCUlMX0RFQ0xBUkVfUkFURV9JTkZPKDU0LCA1NCwgNDgsIElOViwgNDgsIElOViwgNDgsIElOViksLyogNTRtYnBzICovCisJSUxfREVDTEFSRV9SQVRFX0lORk8oNjAsIDYwLCA0OCwgSU5WLCA0OCwgSU5WLCA0OCwgSU5WKSwvKiA2MG1icHMgKi8KK307CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgodTMyIHJhdGVfbl9mbGFncykKK3sKKwlpbnQgaWR4ID0gMDsKKworCS8qIEhUIHJhdGUgZm9ybWF0ICovCisJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgeworCQlpZHggPSAocmF0ZV9uX2ZsYWdzICYgMHhmZik7CisKKwkJaWYgKGlkeCA+PSBSQVRFX01JTU8yXzZNX1BMQ1ApCisJCQlpZHggPSBpZHggLSBSQVRFX01JTU8yXzZNX1BMQ1A7CisKKwkJaWR4ICs9IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJLyogc2tpcCA5TSBub3Qgc3VwcG9ydGVkIGluIGh0ICovCisJCWlmIChpZHggPj0gUkFURV85TV9JRFgpCisJCQlpZHggKz0gMTsKKwkJaWYgKGlkeCA+PSBJTF9GSVJTVF9PRkRNX1JBVEUgJiYgaWR4IDw9IElMX0xBU1RfT0ZETV9SQVRFKQorCQkJcmV0dXJuIGlkeDsKKworCQkvKiBsZWdhY3kgcmF0ZSBmb3JtYXQsIHNlYXJjaCBmb3IgbWF0Y2ggaW4gdGFibGUgKi8KKwl9IGVsc2UgeworCQlmb3IgKGlkeCA9IDA7IGlkeCA8IEFSUkFZX1NJWkUoaWxfcmF0ZXMpOyBpZHgrKykKKwkJCWlmIChpbF9yYXRlc1tpZHhdLnBsY3AgPT0gKHJhdGVfbl9mbGFncyAmIDB4RkYpKQorCQkJCXJldHVybiBpZHg7CisJfQorCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBpbDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCQkgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhKTsKK3N0YXRpYyB2b2lkIGlsNDk2NV9yc19maWxsX2xpbmtfY21kKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgICAgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLCB1MzIgcmF0ZV9uX2ZsYWdzKTsKK3N0YXRpYyB2b2lkIGlsNDk2NV9yc19zdGF5X2luX3RhYmxlKHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCQkgICAgYm9vbCBmb3JjZV9zZWFyY2gpOworCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKK3N0YXRpYyB2b2lkIGlsNDk2NV9yc19kYmdmc19zZXRfbWNzKHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCQkgICAgdTMyICpyYXRlX25fZmxhZ3MsIGludCBpZHgpOworI2Vsc2UKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfZGJnZnNfc2V0X21jcyhzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsIHUzMiAqIHJhdGVfbl9mbGFncywgaW50IGlkeCkKK3sKK30KKyNlbmRpZgorCisvKioKKyAqIFRoZSBmb2xsb3dpbmcgdGFibGVzIGNvbnRhaW4gdGhlIGV4cGVjdGVkIHRocm91Z2hwdXQgbWV0cmljcyBmb3IgYWxsIHJhdGVzCisgKgorICoJMSwgMiwgNS41LCAxMSwgNiwgOSwgMTIsIDE4LCAyNCwgMzYsIDQ4LCA1NCwgNjAgTUJpdHMKKyAqCisgKiB3aGVyZSBpbnZhbGlkIGVudHJpZXMgYXJlIHplcm9zLgorICoKKyAqIENDSyByYXRlcyBhcmUgb25seSB2YWxpZCBpbiBsZWdhY3kgdGFibGUgYW5kIHdpbGwgb25seSBiZSB1c2VkIGluIEcKKyAqICgyLjQgR0h6KSBiYW5kLgorICovCisKK3N0YXRpYyBzMzIgZXhwZWN0ZWRfdHB0X2xlZ2FjeVtSQVRFX0NPVU5UXSA9IHsKKwk3LCAxMywgMzUsIDU4LCA0MCwgNTcsIDcyLCA5OCwgMTIxLCAxNTQsIDE3NywgMTg2LCAwCit9OworCitzdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9zaXNvMjBNSHpbNF1bUkFURV9DT1VOVF0gPSB7CisJezAsIDAsIDAsIDAsIDQyLCAwLCA3NiwgMTAyLCAxMjQsIDE1OCwgMTgzLCAxOTMsIDIwMn0sCS8qIE5vcm0gKi8KKwl7MCwgMCwgMCwgMCwgNDYsIDAsIDgyLCAxMTAsIDEzMiwgMTY3LCAxOTIsIDIwMiwgMjEwfSwJLyogU0dJICovCisJezAsIDAsIDAsIDAsIDQ4LCAwLCA5MywgMTM1LCAxNzYsIDI1MSwgMzE5LCAzNTEsIDM4MX0sCS8qIEFHRyAqLworCXswLCAwLCAwLCAwLCA1MywgMCwgMTAyLCAxNDksIDE5MywgMjc1LCAzNDgsIDM4MSwgNDEzfSwJLyogQUdHK1NHSSAqLworfTsKKworc3RhdGljIHMzMiBleHBlY3RlZF90cHRfc2lzbzQwTUh6WzRdW1JBVEVfQ09VTlRdID0geworCXswLCAwLCAwLCAwLCA3NywgMCwgMTI3LCAxNjAsIDE4NCwgMjIwLCAyNDIsIDI1MCwgMjU3fSwJLyogTm9ybSAqLworCXswLCAwLCAwLCAwLCA4MywgMCwgMTM1LCAxNjksIDE5MywgMjI5LCAyNTAsIDI1NywgMjY0fSwJLyogU0dJICovCisJezAsIDAsIDAsIDAsIDk2LCAwLCAxODIsIDI1OSwgMzI4LCA0NTEsIDU1MywgNTk4LCA2NDB9LAkvKiBBR0cgKi8KKwl7MCwgMCwgMCwgMCwgMTA2LCAwLCAxOTksIDI4MiwgMzU3LCA0ODcsIDU5MywgNjQwLCA2ODN9LAkvKiBBR0crU0dJICovCit9OworCitzdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9taW1vMl8yME1Iels0XVtSQVRFX0NPVU5UXSA9IHsKKwl7MCwgMCwgMCwgMCwgNzQsIDAsIDEyMywgMTU1LCAxNzksIDIxMywgMjM1LCAyNDMsIDI1MH0sCS8qIE5vcm0gKi8KKwl7MCwgMCwgMCwgMCwgODEsIDAsIDEzMSwgMTY0LCAxODcsIDIyMSwgMjQyLCAyNTAsIDI1Nn0sCS8qIFNHSSAqLworCXswLCAwLCAwLCAwLCA5MiwgMCwgMTc1LCAyNTAsIDMxNywgNDM2LCA1MzQsIDU3OCwgNjE5fSwJLyogQUdHICovCisJezAsIDAsIDAsIDAsIDEwMiwgMCwgMTkyLCAyNzMsIDM0NCwgNDcwLCA1NzMsIDYxOSwgNjYwfSwJLyogQUdHK1NHSSAqLworfTsKKworc3RhdGljIHMzMiBleHBlY3RlZF90cHRfbWltbzJfNDBNSHpbNF1bUkFURV9DT1VOVF0gPSB7CisJezAsIDAsIDAsIDAsIDEyMywgMCwgMTgyLCAyMTQsIDIzNSwgMjY0LCAyNzksIDI4NSwgMjg5fSwJLyogTm9ybSAqLworCXswLCAwLCAwLCAwLCAxMzEsIDAsIDE5MSwgMjIyLCAyNDIsIDI3MCwgMjg0LCAyODksIDI5M30sCS8qIFNHSSAqLworCXswLCAwLCAwLCAwLCAxODAsIDAsIDMyNywgNDQ2LCA1NDUsIDcwOCwgODI4LCA4NzgsIDkyMn0sCS8qIEFHRyAqLworCXswLCAwLCAwLCAwLCAxOTcsIDAsIDM1NSwgNDgxLCA1ODQsIDc1MiwgODcyLCA5MjIsIDk2Nn0sCS8qIEFHRytTR0kgKi8KK307CisKKy8qIG1icHMsIG1jcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9yYXRlX21jc19pbmZvIGlsX3JhdGVfbWNzW1JBVEVfQ09VTlRdID0geworCXsiMSIsICJCUFNLIERTU1MifSwKKwl7IjIiLCAiUVBTSyBEU1NTIn0sCisJeyI1LjUiLCAiQlBTSyBDQ0sifSwKKwl7IjExIiwgIlFQU0sgQ0NLIn0sCisJeyI2IiwgIkJQU0sgMS8yIn0sCisJeyI5IiwgIkJQU0sgMS8yIn0sCisJeyIxMiIsICJRUFNLIDEvMiJ9LAorCXsiMTgiLCAiUVBTSyAzLzQifSwKKwl7IjI0IiwgIjE2UUFNIDEvMiJ9LAorCXsiMzYiLCAiMTZRQU0gMy80In0sCisJeyI0OCIsICI2NFFBTSAyLzMifSwKKwl7IjU0IiwgIjY0UUFNIDMvNCJ9LAorCXsiNjAiLCAiNjRRQU0gNS82In0sCit9OworCisjZGVmaW5lIE1DU19JRFhfUEVSX1NUUkVBTQkoOCkKKworc3RhdGljIGlubGluZSB1OAoraWw0OTY1X3JzX2V4dHJhY3RfcmF0ZSh1MzIgcmF0ZV9uX2ZsYWdzKQoreworCXJldHVybiAodTgpIChyYXRlX25fZmxhZ3MgJiAweEZGKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbihzdHJ1Y3QgaWxfcmF0ZV9zY2FsZV9kYXRhICp3aW4pCit7CisJd2luLT5kYXRhID0gMDsKKwl3aW4tPnN1Y2Nlc3NfY291bnRlciA9IDA7CisJd2luLT5zdWNjZXNzX3JhdGlvID0gSUxfSU5WQUxJRF9WQUxVRTsKKwl3aW4tPmNvdW50ZXIgPSAwOworCXdpbi0+YXZlcmFnZV90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCXdpbi0+c3RhbXAgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHU4CitpbDQ5NjVfcnNfaXNfdmFsaWRfYW50KHU4IHZhbGlkX2FudGVubmEsIHU4IGFudF90eXBlKQoreworCXJldHVybiAoYW50X3R5cGUgJiB2YWxpZF9hbnRlbm5hKSA9PSBhbnRfdHlwZTsKK30KKworLyoKKyAqCXJlbW92ZXMgdGhlIG9sZCBkYXRhIGZyb20gdGhlIHN0YXRzLiBBbGwgZGF0YSB0aGF0IGlzIG9sZGVyIHRoYW4KKyAqCVRJRF9NQVhfVElNRV9ESUZGLCB3aWxsIGJlIGRlbGV0ZWQuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfdGxfcm1fb2xkX3N0YXRzKHN0cnVjdCBpbF90cmFmZmljX2xvYWQgKnRsLCB1MzIgY3Vycl90aW1lKQoreworCS8qIFRoZSBvbGRlc3QgYWdlIHdlIHdhbnQgdG8ga2VlcCAqLworCXUzMiBvbGRlc3RfdGltZSA9IGN1cnJfdGltZSAtIFRJRF9NQVhfVElNRV9ESUZGOworCisJd2hpbGUgKHRsLT5xdWV1ZV9jb3VudCAmJiB0bC0+dGltZV9zdGFtcCA8IG9sZGVzdF90aW1lKSB7CisJCXRsLT50b3RhbCAtPSB0bC0+cGFja2V0X2NvdW50W3RsLT5oZWFkXTsKKwkJdGwtPnBhY2tldF9jb3VudFt0bC0+aGVhZF0gPSAwOworCQl0bC0+dGltZV9zdGFtcCArPSBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HOworCQl0bC0+cXVldWVfY291bnQtLTsKKwkJdGwtPmhlYWQrKzsKKwkJaWYgKHRsLT5oZWFkID49IFRJRF9RVUVVRV9NQVhfU0laRSkKKwkJCXRsLT5oZWFkID0gMDsKKwl9Cit9CisKKy8qCisgKglpbmNyZW1lbnQgdHJhZmZpYyBsb2FkIHZhbHVlIGZvciB0aWQgYW5kIGFsc28gcmVtb3ZlCisgKglhbnkgb2xkIHZhbHVlcyBpZiBwYXNzZWQgdGhlIGNlcnRhaW4gdGltZSBwZXJpb2QKKyAqLworc3RhdGljIHU4CitpbDQ5NjVfcnNfdGxfYWRkX3BhY2tldChzdHJ1Y3QgaWxfbHFfc3RhICpscV9kYXRhLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQoreworCXUzMiBjdXJyX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOworCXUzMiB0aW1lX2RpZmY7CisJczMyIGlkeDsKKwlzdHJ1Y3QgaWxfdHJhZmZpY19sb2FkICp0bCA9IE5VTEw7CisJdTggdGlkOworCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCQl0aWQgPSBxY1swXSAmIDB4ZjsKKwl9IGVsc2UKKwkJcmV0dXJuIE1BWF9USURfQ09VTlQ7CisKKwlpZiAodW5saWtlbHkodGlkID49IFRJRF9NQVhfTE9BRF9DT1VOVCkpCisJCXJldHVybiBNQVhfVElEX0NPVU5UOworCisJdGwgPSAmbHFfZGF0YS0+bG9hZFt0aWRdOworCisJY3Vycl90aW1lIC09IGN1cnJfdGltZSAlIFRJRF9ST1VORF9WQUxVRTsKKworCS8qIEhhcHBlbnMgb25seSBmb3IgdGhlIGZpcnN0IHBhY2tldC4gSW5pdGlhbGl6ZSB0aGUgZGF0YSAqLworCWlmICghKHRsLT5xdWV1ZV9jb3VudCkpIHsKKwkJdGwtPnRvdGFsID0gMTsKKwkJdGwtPnRpbWVfc3RhbXAgPSBjdXJyX3RpbWU7CisJCXRsLT5xdWV1ZV9jb3VudCA9IDE7CisJCXRsLT5oZWFkID0gMDsKKwkJdGwtPnBhY2tldF9jb3VudFswXSA9IDE7CisJCXJldHVybiBNQVhfVElEX0NPVU5UOworCX0KKworCXRpbWVfZGlmZiA9IFRJTUVfV1JBUF9BUk9VTkQodGwtPnRpbWVfc3RhbXAsIGN1cnJfdGltZSk7CisJaWR4ID0gdGltZV9kaWZmIC8gVElEX1FVRVVFX0NFTExfU1BBQ0lORzsKKworCS8qIFRoZSBoaXN0b3J5IGlzIHRvbyBsb25nOiByZW1vdmUgZGF0YSB0aGF0IGlzIG9sZGVyIHRoYW4gKi8KKwkvKiBUSURfTUFYX1RJTUVfRElGRiAqLworCWlmIChpZHggPj0gVElEX1FVRVVFX01BWF9TSVpFKQorCQlpbDQ5NjVfcnNfdGxfcm1fb2xkX3N0YXRzKHRsLCBjdXJyX3RpbWUpOworCisJaWR4ID0gKHRsLT5oZWFkICsgaWR4KSAlIFRJRF9RVUVVRV9NQVhfU0laRTsKKwl0bC0+cGFja2V0X2NvdW50W2lkeF0gPSB0bC0+cGFja2V0X2NvdW50W2lkeF0gKyAxOworCXRsLT50b3RhbCA9IHRsLT50b3RhbCArIDE7CisKKwlpZiAoKGlkeCArIDEpID4gdGwtPnF1ZXVlX2NvdW50KQorCQl0bC0+cXVldWVfY291bnQgPSBpZHggKyAxOworCisJcmV0dXJuIHRpZDsKK30KKworLyoKKwlnZXQgdGhlIHRyYWZmaWMgbG9hZCB2YWx1ZSBmb3IgdGlkCisqLworc3RhdGljIHUzMgoraWw0OTY1X3JzX3RsX2dldF9sb2FkKHN0cnVjdCBpbF9scV9zdGEgKmxxX2RhdGEsIHU4IHRpZCkKK3sKKwl1MzIgY3Vycl90aW1lID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzKTsKKwl1MzIgdGltZV9kaWZmOworCXMzMiBpZHg7CisJc3RydWN0IGlsX3RyYWZmaWNfbG9hZCAqdGwgPSBOVUxMOworCisJaWYgKHRpZCA+PSBUSURfTUFYX0xPQURfQ09VTlQpCisJCXJldHVybiAwOworCisJdGwgPSAmKGxxX2RhdGEtPmxvYWRbdGlkXSk7CisKKwljdXJyX3RpbWUgLT0gY3Vycl90aW1lICUgVElEX1JPVU5EX1ZBTFVFOworCisJaWYgKCEodGwtPnF1ZXVlX2NvdW50KSkKKwkJcmV0dXJuIDA7CisKKwl0aW1lX2RpZmYgPSBUSU1FX1dSQVBfQVJPVU5EKHRsLT50aW1lX3N0YW1wLCBjdXJyX3RpbWUpOworCWlkeCA9IHRpbWVfZGlmZiAvIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkc7CisKKwkvKiBUaGUgaGlzdG9yeSBpcyB0b28gbG9uZzogcmVtb3ZlIGRhdGEgdGhhdCBpcyBvbGRlciB0aGFuICovCisJLyogVElEX01BWF9USU1FX0RJRkYgKi8KKwlpZiAoaWR4ID49IFRJRF9RVUVVRV9NQVhfU0laRSkKKwkJaWw0OTY1X3JzX3RsX3JtX29sZF9zdGF0cyh0bCwgY3Vycl90aW1lKTsKKworCXJldHVybiB0bC0+dG90YWw7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9yc190bF90dXJuX29uX2FnZ19mb3JfdGlkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xxX3N0YSAqbHFfZGF0YSwKKwkJCQkgdTggdGlkLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCWludCByZXQgPSAtRUFHQUlOOworCXUzMiBsb2FkOworCisJbG9hZCA9IGlsNDk2NV9yc190bF9nZXRfbG9hZChscV9kYXRhLCB0aWQpOworCisJaWYgKGxvYWQgPiBJTF9BR0dfTE9BRF9USFJFU0hPTEQpIHsKKwkJRF9IVCgiU3RhcnRpbmcgVHggYWdnOiBTVEE6ICVwTSB0aWQ6ICVkXG4iLCBzdGEtPmFkZHIsIHRpZCk7CisJCXJldCA9IGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkLCA1MDAwKTsKKwkJaWYgKHJldCA9PSAtRUFHQUlOKSB7CisJCQkvKgorCQkJICogZHJpdmVyIGFuZCBtYWM4MDIxMSBpcyBvdXQgb2Ygc3luYworCQkJICogdGhpcyBtaWdodCBiZSBjYXVzZSBieSByZWxvYWRpbmcgZmlybXdhcmUKKwkJCSAqIHN0b3AgdGhlIHR4IGJhIHNlc3Npb24gaGVyZQorCQkJICovCisJCQlJTF9FUlIoIkZhaWwgc3RhcnQgVHggYWdnIG9uIHRpZDogJWRcbiIsIHRpZCk7CisJCQlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkKTsKKwkJfQorCX0gZWxzZQorCQlEX0hUKCJBZ2dyZWdhdGlvbiBub3QgZW5hYmxlZCBmb3IgdGlkICVkIGJlY2F1c2UgbG9hZCA9ICV1XG4iLAorCQkgICAgIHRpZCwgbG9hZCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX3RsX3R1cm5fb25fYWdnKHN0cnVjdCBpbF9wcml2ICppbCwgdTggdGlkLCBzdHJ1Y3QgaWxfbHFfc3RhICpscV9kYXRhLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJaWYgKHRpZCA8IFRJRF9NQVhfTE9BRF9DT1VOVCkKKwkJaWw0OTY1X3JzX3RsX3R1cm5fb25fYWdnX2Zvcl90aWQoaWwsIGxxX2RhdGEsIHRpZCwgc3RhKTsKKwllbHNlCisJCUlMX0VSUigidGlkIGV4Y2VlZHMgbWF4IGxvYWQgY291bnQ6ICVkLyVkXG4iLCB0aWQsCisJCSAgICAgICBUSURfTUFYX0xPQURfQ09VTlQpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWw0OTY1X2dldF9pbDQ5NjVfbnVtX29mX2FudF9mcm9tX3JhdGUodTMyIHJhdGVfbl9mbGFncykKK3sKKwlyZXR1cm4gISEocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0FfTVNLKSArCisJICAgICEhKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9CX01TSykgKworCSAgICAhIShyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19BTlRfQ19NU0spOworfQorCisvKgorICogU3RhdGljIGZ1bmN0aW9uIHRvIGdldCB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCBmcm9tIGFuIGlsX3NjYWxlX3RibF9pbmZvCisgKiB0aGF0IHdyYXBzIGEgTlVMTCBwb2ludGVyIGNoZWNrCisgKi8KK3N0YXRpYyBzMzIKK2lsNDk2NV9nZXRfZXhwZWN0ZWRfdHB0KHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgcnNfaWR4KQoreworCWlmICh0YmwtPmV4cGVjdGVkX3RwdCkKKwkJcmV0dXJuIHRibC0+ZXhwZWN0ZWRfdHB0W3JzX2lkeF07CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWw0OTY1X3JzX2NvbGxlY3RfdHhfZGF0YSAtIFVwZGF0ZSB0aGUgc3VjY2Vzcy9mYWlsdXJlIHNsaWRpbmcgd2luCisgKgorICogV2Uga2VlcCBhIHNsaWRpbmcgd2luIG9mIHRoZSBsYXN0IDYyIHBhY2tldHMgdHJhbnNtaXR0ZWQKKyAqIGF0IHRoaXMgcmF0ZS4gIHdpbi0+ZGF0YSBjb250YWlucyB0aGUgYml0bWFzayBvZiBzdWNjZXNzZnVsCisgKiBwYWNrZXRzLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhKHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgc2NhbGVfaWR4LAorCQkJICBpbnQgYXR0ZW1wdHMsIGludCBzdWNjZXNzZXMpCit7CisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAqd2luID0gTlVMTDsKKwlzdGF0aWMgY29uc3QgdTY0IG1hc2sgPSAoKCh1NjQpIDEpIDw8IChSQVRFX01BWF9XSU5ET1cgLSAxKSk7CisJczMyIGZhaWxfY291bnQsIHRwdDsKKworCWlmIChzY2FsZV9pZHggPCAwIHx8IHNjYWxlX2lkeCA+PSBSQVRFX0NPVU5UKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIFNlbGVjdCB3aW4gZm9yIGN1cnJlbnQgdHggYml0IHJhdGUgKi8KKwl3aW4gPSAmKHRibC0+d2luW3NjYWxlX2lkeF0pOworCisJLyogR2V0IGV4cGVjdGVkIHRocm91Z2hwdXQgKi8KKwl0cHQgPSBpbDQ5NjVfZ2V0X2V4cGVjdGVkX3RwdCh0YmwsIHNjYWxlX2lkeCk7CisKKwkvKgorCSAqIEtlZXAgdHJhY2sgb2Ygb25seSB0aGUgbGF0ZXN0IDYyIHR4IGZyYW1lIGF0dGVtcHRzIGluIHRoaXMgcmF0ZSdzCisJICogaGlzdG9yeSB3aW47IGFueXRoaW5nIG9sZGVyIGlzbid0IHJlYWxseSByZWxldmFudCBhbnkgbW9yZS4KKwkgKiBJZiB3ZSBoYXZlIGZpbGxlZCB1cCB0aGUgc2xpZGluZyB3aW4sIGRyb3AgdGhlIG9sZGVzdCBhdHRlbXB0OworCSAqIGlmIHRoZSBvbGRlc3QgYXR0ZW1wdCAoaGlnaGVzdCBiaXQgaW4gYml0bWFwKSBzaG93cyAic3VjY2VzcyIsCisJICogc3VidHJhY3QgIjEiIGZyb20gdGhlIHN1Y2Nlc3MgY291bnRlciAodGhpcyBpcyB0aGUgbWFpbiByZWFzb24KKwkgKiB3ZSBrZWVwIHRoZXNlIGJpdG1hcHMhKS4KKwkgKi8KKwl3aGlsZSAoYXR0ZW1wdHMgPiAwKSB7CisJCWlmICh3aW4tPmNvdW50ZXIgPj0gUkFURV9NQVhfV0lORE9XKSB7CisKKwkJCS8qIHJlbW92ZSBlYXJsaWVzdCAqLworCQkJd2luLT5jb3VudGVyID0gUkFURV9NQVhfV0lORE9XIC0gMTsKKworCQkJaWYgKHdpbi0+ZGF0YSAmIG1hc2spIHsKKwkJCQl3aW4tPmRhdGEgJj0gfm1hc2s7CisJCQkJd2luLT5zdWNjZXNzX2NvdW50ZXItLTsKKwkJCX0KKwkJfQorCisJCS8qIEluY3JlbWVudCBmcmFtZXMtYXR0ZW1wdGVkIGNvdW50ZXIgKi8KKwkJd2luLT5jb3VudGVyKys7CisKKwkJLyogU2hpZnQgYml0bWFwIGJ5IG9uZSBmcmFtZSB0byB0aHJvdyBhd2F5IG9sZGVzdCBoaXN0b3J5ICovCisJCXdpbi0+ZGF0YSA8PD0gMTsKKworCQkvKiBNYXJrIHRoZSBtb3N0IHJlY2VudCAjc3VjY2Vzc2VzIGF0dGVtcHRzIGFzIHN1Y2Nlc3NmdWwgKi8KKwkJaWYgKHN1Y2Nlc3NlcyA+IDApIHsKKwkJCXdpbi0+c3VjY2Vzc19jb3VudGVyKys7CisJCQl3aW4tPmRhdGEgfD0gMHgxOworCQkJc3VjY2Vzc2VzLS07CisJCX0KKworCQlhdHRlbXB0cy0tOworCX0KKworCS8qIENhbGN1bGF0ZSBjdXJyZW50IHN1Y2Nlc3MgcmF0aW8sIGF2b2lkIGRpdmlkZS1ieS0wISAqLworCWlmICh3aW4tPmNvdW50ZXIgPiAwKQorCQl3aW4tPnN1Y2Nlc3NfcmF0aW8gPQorCQkgICAgMTI4ICogKDEwMCAqIHdpbi0+c3VjY2Vzc19jb3VudGVyKSAvIHdpbi0+Y291bnRlcjsKKwllbHNlCisJCXdpbi0+c3VjY2Vzc19yYXRpbyA9IElMX0lOVkFMSURfVkFMVUU7CisKKwlmYWlsX2NvdW50ID0gd2luLT5jb3VudGVyIC0gd2luLT5zdWNjZXNzX2NvdW50ZXI7CisKKwkvKiBDYWxjdWxhdGUgYXZlcmFnZSB0aHJvdWdocHV0LCBpZiB3ZSBoYXZlIGVub3VnaCBoaXN0b3J5LiAqLworCWlmIChmYWlsX2NvdW50ID49IFJBVEVfTUlOX0ZBSUxVUkVfVEggfHwKKwkgICAgd2luLT5zdWNjZXNzX2NvdW50ZXIgPj0gUkFURV9NSU5fU1VDQ0VTU19USCkKKwkJd2luLT5hdmVyYWdlX3RwdCA9ICh3aW4tPnN1Y2Nlc3NfcmF0aW8gKiB0cHQgKyA2NCkgLyAxMjg7CisJZWxzZQorCQl3aW4tPmF2ZXJhZ2VfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKworCS8qIFRhZyB0aGlzIHdpbiBhcyBoYXZpbmcgYmVlbiB1cGRhdGVkICovCisJd2luLT5zdGFtcCA9IGppZmZpZXM7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEZpbGwgdUNvZGUgQVBJIHJhdGVfbl9mbGFncyBmaWVsZCwgYmFzZWQgb24gInNlYXJjaCIgb3IgImFjdGl2ZSIgdGFibGUuCisgKi8KK3N0YXRpYyB1MzIKK2lsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90Ymwoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCwKKwkJCSAgICAgaW50IGlkeCwgdTggdXNlX2dyZWVuKQoreworCXUzMiByYXRlX25fZmxhZ3MgPSAwOworCisJaWYgKGlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpKSB7CisJCXJhdGVfbl9mbGFncyA9IGlsX3JhdGVzW2lkeF0ucGxjcDsKKwkJaWYgKGlkeCA+PSBJTF9GSVJTVF9DQ0tfUkFURSAmJiBpZHggPD0gSUxfTEFTVF9DQ0tfUkFURSkKKwkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19DQ0tfTVNLOworCisJfSBlbHNlIGlmIChpc19IdCh0YmwtPmxxX3R5cGUpKSB7CisJCWlmIChpZHggPiBJTF9MQVNUX09GRE1fUkFURSkgeworCQkJSUxfRVJSKCJJbnZhbGlkIEhUIHJhdGUgaWR4ICVkXG4iLCBpZHgpOworCQkJaWR4ID0gSUxfTEFTVF9PRkRNX1JBVEU7CisJCX0KKwkJcmF0ZV9uX2ZsYWdzID0gUkFURV9NQ1NfSFRfTVNLOworCisJCWlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkpCisJCQlyYXRlX25fZmxhZ3MgfD0gaWxfcmF0ZXNbaWR4XS5wbGNwX3Npc287CisJCWVsc2UKKwkJCXJhdGVfbl9mbGFncyB8PSBpbF9yYXRlc1tpZHhdLnBsY3BfbWltbzI7CisJfSBlbHNlIHsKKwkJSUxfRVJSKCJJbnZhbGlkIHRibC0+bHFfdHlwZSAlZFxuIiwgdGJsLT5scV90eXBlKTsKKwl9CisKKwlyYXRlX25fZmxhZ3MgfD0KKwkgICAgKCh0YmwtPmFudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1MpICYgUkFURV9NQ1NfQU5UX0FCQ19NU0spOworCisJaWYgKGlzX0h0KHRibC0+bHFfdHlwZSkpIHsKKwkJaWYgKHRibC0+aXNfaHQ0MCkgeworCQkJaWYgKHRibC0+aXNfZHVwKQorCQkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19EVVBfTVNLOworCQkJZWxzZQorCQkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19IVDQwX01TSzsKKwkJfQorCQlpZiAodGJsLT5pc19TR0kpCisJCQlyYXRlX25fZmxhZ3MgfD0gUkFURV9NQ1NfU0dJX01TSzsKKworCQlpZiAodXNlX2dyZWVuKSB7CisJCQlyYXRlX25fZmxhZ3MgfD0gUkFURV9NQ1NfR0ZfTVNLOworCQkJaWYgKGlzX3Npc28odGJsLT5scV90eXBlKSAmJiB0YmwtPmlzX1NHSSkgeworCQkJCXJhdGVfbl9mbGFncyAmPSB+UkFURV9NQ1NfU0dJX01TSzsKKwkJCQlJTF9FUlIoIkdGIHdhcyBzZXQgd2l0aCBTR0k6U0lTT1xuIik7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIHJhdGVfbl9mbGFnczsKK30KKworLyoKKyAqIEludGVycHJldCB1Q29kZSBBUEkncyByYXRlX25fZmxhZ3MgZm9ybWF0LAorICogZmlsbCAic2VhcmNoIiBvciAiYWN0aXZlIiB0eCBtb2RlIHRhYmxlLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKGNvbnN0IHUzMiByYXRlX25fZmxhZ3MsCisJCQkJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgKnJhdGVfaWR4KQoreworCXUzMiBhbnRfbXNrID0gKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9BQkNfTVNLKTsKKwl1OCBpbDQ5NjVfbnVtX29mX2FudCA9CisJICAgIGlsNDk2NV9nZXRfaWw0OTY1X251bV9vZl9hbnRfZnJvbV9yYXRlKHJhdGVfbl9mbGFncyk7CisJdTggbWNzOworCisJbWVtc2V0KHRibCwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbykpOworCSpyYXRlX2lkeCA9IGlsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgocmF0ZV9uX2ZsYWdzKTsKKworCWlmICgqcmF0ZV9pZHggPT0gUkFURV9JTlZBTElEKSB7CisJCSpyYXRlX2lkeCA9IC0xOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdGJsLT5pc19TR0kgPSAwOwkvKiBkZWZhdWx0IGxlZ2FjeSBzZXR1cCAqLworCXRibC0+aXNfaHQ0MCA9IDA7CisJdGJsLT5pc19kdXAgPSAwOworCXRibC0+YW50X3R5cGUgPSAoYW50X21zayA+PiBSQVRFX01DU19BTlRfUE9TKTsKKwl0YmwtPmxxX3R5cGUgPSBMUV9OT05FOworCXRibC0+bWF4X3NlYXJjaCA9IElMX01BWF9TRUFSQ0g7CisKKwkvKiBsZWdhY3kgcmF0ZSBmb3JtYXQgKi8KKwlpZiAoIShyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spKSB7CisJCWlmIChpbDQ5NjVfbnVtX29mX2FudCA9PSAxKSB7CisJCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJCXRibC0+bHFfdHlwZSA9IExRX0E7CisJCQllbHNlCisJCQkJdGJsLT5scV90eXBlID0gTFFfRzsKKwkJfQorCQkvKiBIVCByYXRlIGZvcm1hdCAqLworCX0gZWxzZSB7CisJCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQorCQkJdGJsLT5pc19TR0kgPSAxOworCisJCWlmICgocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFQ0MF9NU0spIHx8CisJCSAgICAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfRFVQX01TSykpCisJCQl0YmwtPmlzX2h0NDAgPSAxOworCisJCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19EVVBfTVNLKQorCQkJdGJsLT5pc19kdXAgPSAxOworCisJCW1jcyA9IGlsNDk2NV9yc19leHRyYWN0X3JhdGUocmF0ZV9uX2ZsYWdzKTsKKworCQkvKiBTSVNPICovCisJCWlmIChtY3MgPD0gUkFURV9TSVNPXzYwTV9QTENQKSB7CisJCQlpZiAoaWw0OTY1X251bV9vZl9hbnQgPT0gMSkKKwkJCQl0YmwtPmxxX3R5cGUgPSBMUV9TSVNPOwkvKmVsc2UgTk9ORSAqLworCQkJLyogTUlNTzIgKi8KKwkJfSBlbHNlIHsKKwkJCWlmIChpbDQ5NjVfbnVtX29mX2FudCA9PSAyKQorCQkJCXRibC0+bHFfdHlwZSA9IExRX01JTU8yOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBzd2l0Y2ggdG8gYW5vdGhlciBhbnRlbm5hL2FudGVubmFzIGFuZCByZXR1cm4gMSAqLworLyogaWYgbm8gb3RoZXIgdmFsaWQgYW50ZW5uYSBmb3VuZCwgcmV0dXJuIDAgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh1MzIgdmFsaWRfYW50LCB1MzIgKnJhdGVfbl9mbGFncywKKwkJCSBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCkKK3sKKwl1OCBuZXdfYW50X3R5cGU7CisKKwlpZiAoIXRibC0+YW50X3R5cGUgfHwgdGJsLT5hbnRfdHlwZSA+IEFOVF9BQkMpCisJCXJldHVybiAwOworCisJaWYgKCFpbDQ5NjVfcnNfaXNfdmFsaWRfYW50KHZhbGlkX2FudCwgdGJsLT5hbnRfdHlwZSkpCisJCXJldHVybiAwOworCisJbmV3X2FudF90eXBlID0gYW50X3RvZ2dsZV9sb29rdXBbdGJsLT5hbnRfdHlwZV07CisKKwl3aGlsZSAobmV3X2FudF90eXBlICE9IHRibC0+YW50X3R5cGUgJiYKKwkgICAgICAgIWlsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfYW50LCBuZXdfYW50X3R5cGUpKQorCQluZXdfYW50X3R5cGUgPSBhbnRfdG9nZ2xlX2xvb2t1cFtuZXdfYW50X3R5cGVdOworCisJaWYgKG5ld19hbnRfdHlwZSA9PSB0YmwtPmFudF90eXBlKQorCQlyZXR1cm4gMDsKKworCXRibC0+YW50X3R5cGUgPSBuZXdfYW50X3R5cGU7CisJKnJhdGVfbl9mbGFncyAmPSB+UkFURV9NQ1NfQU5UX0FCQ19NU0s7CisJKnJhdGVfbl9mbGFncyB8PSBuZXdfYW50X3R5cGUgPDwgUkFURV9NQ1NfQU5UX1BPUzsKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKiBHcmVlbi1maWVsZCBtb2RlIGlzIHZhbGlkIGlmIHRoZSBzdGF0aW9uIHN1cHBvcnRzIGl0IGFuZAorICogdGhlcmUgYXJlIG5vIG5vbi1HRiBzdGF0aW9ucyBwcmVzZW50IGluIHRoZSBCU1MuCisgKi8KK3N0YXRpYyBib29sCitpbDQ5NjVfcnNfdXNlX2dyZWVuKHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7CisKKwlyZXR1cm4gKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCkgJiYKKwkgICAgIShjdHgtPmh0Lm5vbl9nZl9zdGFfcHJlc2VudCk7Cit9CisKKy8qKgorICogaWw0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMgLSBnZXQgdGhlIGF2YWlsYWJsZSByYXRlcworICoKKyAqIGlmIG1hbmFnZW1lbnQgZnJhbWUgb3IgYnJvYWRjYXN0IGZyYW1lIG9ubHkgcmV0dXJuCisgKiBiYXNpYyBhdmFpbGFibGUgcmF0ZXMuCisgKgorICovCitzdGF0aWMgdTE2CitpbDQ5NjVfcnNfZ2V0X3N1cHBvcnRlZF9yYXRlcyhzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkJICAgICAgZW51bSBpbF90YWJsZV90eXBlIHJhdGVfdHlwZSkKK3sKKwlpZiAoaXNfbGVnYWN5KHJhdGVfdHlwZSkpIHsKKwkJcmV0dXJuIGxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlOworCX0gZWxzZSB7CisJCWlmIChpc19zaXNvKHJhdGVfdHlwZSkpCisJCQlyZXR1cm4gbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlOworCQllbHNlCisJCQlyZXR1cm4gbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZTsKKwl9Cit9CisKK3N0YXRpYyB1MTYKK2lsNDk2NV9yc19nZXRfYWRqYWNlbnRfcmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGlkeCwgdTE2IHJhdGVfbWFzaywKKwkJCSAgICBpbnQgcmF0ZV90eXBlKQoreworCXU4IGhpZ2ggPSBSQVRFX0lOVkFMSUQ7CisJdTggbG93ID0gUkFURV9JTlZBTElEOworCisJLyogODAyLjExQSBvciBodCB3YWxrcyB0byB0aGUgbmV4dCBsaXRlcmFsIGFkamFjZW50IHJhdGUgaW4KKwkgKiB0aGUgcmF0ZSB0YWJsZSAqLworCWlmIChpc19hX2JhbmQocmF0ZV90eXBlKSB8fCAhaXNfbGVnYWN5KHJhdGVfdHlwZSkpIHsKKwkJaW50IGk7CisJCXUzMiBtYXNrOworCisJCS8qIEZpbmQgdGhlIHByZXZpb3VzIHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCisJCWkgPSBpZHggLSAxOworCQlmb3IgKG1hc2sgPSAoMSA8PCBpKTsgaSA+PSAwOyBpLS0sIG1hc2sgPj49IDEpIHsKKwkJCWlmIChyYXRlX21hc2sgJiBtYXNrKSB7CisJCQkJbG93ID0gaTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCS8qIEZpbmQgdGhlIG5leHQgcmF0ZSB0aGF0IGlzIGluIHRoZSByYXRlIG1hc2sgKi8KKwkJaSA9IGlkeCArIDE7CisJCWZvciAobWFzayA9ICgxIDw8IGkpOyBpIDwgUkFURV9DT1VOVDsgaSsrLCBtYXNrIDw8PSAxKSB7CisJCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgeworCQkJCWhpZ2ggPSBpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJcmV0dXJuIChoaWdoIDw8IDgpIHwgbG93OworCX0KKworCWxvdyA9IGlkeDsKKwl3aGlsZSAobG93ICE9IFJBVEVfSU5WQUxJRCkgeworCQlsb3cgPSBpbF9yYXRlc1tsb3ddLnByZXZfcnM7CisJCWlmIChsb3cgPT0gUkFURV9JTlZBTElEKQorCQkJYnJlYWs7CisJCWlmIChyYXRlX21hc2sgJiAoMSA8PCBsb3cpKQorCQkJYnJlYWs7CisJCURfUkFURSgiU2tpcHBpbmcgbWFza2VkIGxvd2VyIHJhdGU6ICVkXG4iLCBsb3cpOworCX0KKworCWhpZ2ggPSBpZHg7CisJd2hpbGUgKGhpZ2ggIT0gUkFURV9JTlZBTElEKSB7CisJCWhpZ2ggPSBpbF9yYXRlc1toaWdoXS5uZXh0X3JzOworCQlpZiAoaGlnaCA9PSBSQVRFX0lOVkFMSUQpCisJCQlicmVhazsKKwkJaWYgKHJhdGVfbWFzayAmICgxIDw8IGhpZ2gpKQorCQkJYnJlYWs7CisJCURfUkFURSgiU2tpcHBpbmcgbWFza2VkIGhpZ2hlciByYXRlOiAlZFxuIiwgaGlnaCk7CisJfQorCisJcmV0dXJuIChoaWdoIDw8IDgpIHwgbG93OworfQorCitzdGF0aWMgdTMyCitpbDQ5NjVfcnNfZ2V0X2xvd2VyX3JhdGUoc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJIHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCB1OCBzY2FsZV9pZHgsCisJCQkgdTggaHRfcG9zc2libGUpCit7CisJczMyIGxvdzsKKwl1MTYgcmF0ZV9tYXNrOworCXUxNiBoaWdoX2xvdzsKKwl1OCBzd2l0Y2hfdG9fbGVnYWN5ID0gMDsKKwl1OCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47CisJc3RydWN0IGlsX3ByaXYgKmlsID0gbHFfc3RhLT5kcnY7CisKKwkvKiBjaGVjayBpZiB3ZSBuZWVkIHRvIHN3aXRjaCBmcm9tIEhUIHRvIGxlZ2FjeSByYXRlcy4KKwkgKiBhc3N1bXB0aW9uIGlzIHRoYXQgbWFuZGF0b3J5IHJhdGVzICgxTWJwcyBvciA2TWJwcykKKwkgKiBhcmUgYWx3YXlzIHN1cHBvcnRlZCAoc3BlYyBkZW1hbmQpICovCisJaWYgKCFpc19sZWdhY3kodGJsLT5scV90eXBlKSAmJiAoIWh0X3Bvc3NpYmxlIHx8ICFzY2FsZV9pZHgpKSB7CisJCXN3aXRjaF90b19sZWdhY3kgPSAxOworCQlzY2FsZV9pZHggPSByc19odF90b19sZWdhY3lbc2NhbGVfaWR4XTsKKwkJaWYgKGxxX3N0YS0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJdGJsLT5scV90eXBlID0gTFFfQTsKKwkJZWxzZQorCQkJdGJsLT5scV90eXBlID0gTFFfRzsKKworCQlpZiAoaWw0OTY1X251bV9vZl9hbnQodGJsLT5hbnRfdHlwZSkgPiAxKQorCQkJdGJsLT5hbnRfdHlwZSA9CisJCQkgICAgaWw0OTY1X2ZpcnN0X2FudGVubmEoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOworCisJCXRibC0+aXNfaHQ0MCA9IDA7CisJCXRibC0+aXNfU0dJID0gMDsKKwkJdGJsLT5tYXhfc2VhcmNoID0gSUxfTUFYX1NFQVJDSDsKKwl9CisKKwlyYXRlX21hc2sgPSBpbDQ5NjVfcnNfZ2V0X3N1cHBvcnRlZF9yYXRlcyhscV9zdGEsIE5VTEwsIHRibC0+bHFfdHlwZSk7CisKKwkvKiBNYXNrIHdpdGggc3RhdGlvbiByYXRlIHJlc3RyaWN0aW9uICovCisJaWYgKGlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpKSB7CisJCS8qIHN1cHBfcmF0ZXMgaGFzIG5vIENDSyBiaXRzIGluIEEgbW9kZSAqLworCQlpZiAobHFfc3RhLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQlyYXRlX21hc2sgPQorCQkJICAgICh1MTYpIChyYXRlX21hc2sgJgorCQkJCSAgIChscV9zdGEtPnN1cHBfcmF0ZXMgPDwgSUxfRklSU1RfT0ZETV9SQVRFKSk7CisJCWVsc2UKKwkJCXJhdGVfbWFzayA9ICh1MTYpIChyYXRlX21hc2sgJiBscV9zdGEtPnN1cHBfcmF0ZXMpOworCX0KKworCS8qIElmIHdlIHN3aXRjaGVkIGZyb20gSFQgdG8gbGVnYWN5LCBjaGVjayBjdXJyZW50IHJhdGUgKi8KKwlpZiAoc3dpdGNoX3RvX2xlZ2FjeSAmJiAocmF0ZV9tYXNrICYgKDEgPDwgc2NhbGVfaWR4KSkpIHsKKwkJbG93ID0gc2NhbGVfaWR4OworCQlnb3RvIG91dDsKKwl9CisKKwloaWdoX2xvdyA9CisJICAgIGlsNDk2NV9yc19nZXRfYWRqYWNlbnRfcmF0ZShscV9zdGEtPmRydiwgc2NhbGVfaWR4LCByYXRlX21hc2ssCisJCQkJCXRibC0+bHFfdHlwZSk7CisJbG93ID0gaGlnaF9sb3cgJiAweGZmOworCisJaWYgKGxvdyA9PSBSQVRFX0lOVkFMSUQpCisJCWxvdyA9IHNjYWxlX2lkeDsKKworb3V0OgorCXJldHVybiBpbDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGxxX3N0YS0+ZHJ2LCB0YmwsIGxvdywgaXNfZ3JlZW4pOworfQorCisvKgorICogU2ltcGxlIGZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIHJhdGUgc2NhbGUgdGFibGUgdHlwZXMKKyAqLworc3RhdGljIGJvb2wKK2lsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICphLAorCQkJICBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKmIpCit7CisJcmV0dXJuIChhLT5scV90eXBlID09IGItPmxxX3R5cGUgJiYgYS0+YW50X3R5cGUgPT0gYi0+YW50X3R5cGUgJiYKKwkJYS0+aXNfU0dJID09IGItPmlzX1NHSSk7Cit9CisKKy8qCisgKiBtYWM4MDIxMSBzZW5kcyB1cyBUeCBzdGF0dXMKKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yc190eF9zdGF0dXModm9pZCAqaWxfciwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICppbF9zdGEsCisJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBsZWdhY3lfc3VjY2VzczsKKwlpbnQgcmV0cmllczsKKwlpbnQgcnNfaWR4LCBtYWNfaWR4LCBpOworCXN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSA9IGlsX3N0YTsKKwlzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqdGFibGU7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSAoc3RydWN0IGlsX3ByaXYgKilpbF9yOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwllbnVtIG1hYzgwMjExX3JhdGVfY29udHJvbF9mbGFncyBtYWNfZmxhZ3M7CisJdTMyIHR4X3JhdGU7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvIHRibF90eXBlOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqY3Vycl90YmwsICpvdGhlcl90YmwsICp0bXBfdGJsOworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OworCisJRF9SQVRFKCJnZXQgZnJhbWUgYWNrIHJlc3BvbnNlLCB1cGRhdGUgcmF0ZSBzY2FsZSB3aW5cbiIpOworCisJLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KKwlpZiAoIWxxX3N0YSkgeworCQlEX1JBVEUoIlN0YXRpb24gcmF0ZSBzY2FsaW5nIG5vdCBjcmVhdGVkIHlldC5cbiIpOworCQlyZXR1cm47CisJfSBlbHNlIGlmICghbHFfc3RhLT5kcnYpIHsKKwkJRF9SQVRFKCJSYXRlIHNjYWxpbmcgbm90IGluaXRpYWxpemVkIHlldC5cbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpIHx8CisJICAgIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkKKwkJcmV0dXJuOworCisJLyogVGhpcyBwYWNrZXQgd2FzIGFnZ3JlZ2F0ZWQgYnV0IGRvZXNuJ3QgY2Fycnkgc3RhdHVzIGluZm8gKi8KKwlpZiAoKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgJiYKKwkgICAgIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBJZ25vcmUgdGhpcyBUeCBmcmFtZSByZXNwb25zZSBpZiBpdHMgaW5pdGlhbCByYXRlIGRvZXNuJ3QgbWF0Y2gKKwkgKiB0aGF0IG9mIGxhdGVzdCBMaW5rIFF1YWxpdHkgY29tbWFuZC4gIFRoZXJlIG1heSBiZSBzdHJhZ2dsZXJzCisJICogZnJvbSBhIHByZXZpb3VzIExpbmsgUXVhbGl0eSBjb21tYW5kLCBidXQgd2UncmUgbm8gbG9uZ2VyIGludGVyZXN0ZWQKKwkgKiBpbiB0aG9zZTsgdGhleSdyZSBlaXRoZXIgZnJvbSB0aGUgImFjdGl2ZSIgbW9kZSB3aGlsZSB3ZSdyZSB0cnlpbmcKKwkgKiB0byBjaGVjayAic2VhcmNoIiBtb2RlLCBvciBhIHByaW9yICJzZWFyY2giIG1vZGUgYWZ0ZXIgd2UndmUgbW92ZWQKKwkgKiB0byBhIG5ldyAic2VhcmNoIiBtb2RlICh3aGljaCBtaWdodCBiZWNvbWUgdGhlIG5ldyAiYWN0aXZlIiBtb2RlKS4KKwkgKi8KKwl0YWJsZSA9ICZscV9zdGEtPmxxOworCXR4X3JhdGUgPSBsZTMyX3RvX2NwdSh0YWJsZS0+cnNfdGFibGVbMF0ucmF0ZV9uX2ZsYWdzKTsKKwlpbDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKHR4X3JhdGUsIGlsLT5iYW5kLCAmdGJsX3R5cGUsICZyc19pZHgpOworCWlmIChpbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlyc19pZHggLT0gSUxfRklSU1RfT0ZETV9SQVRFOworCW1hY19mbGFncyA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5mbGFnczsKKwltYWNfaWR4ID0gaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeDsKKwkvKiBGb3IgSFQgcGFja2V0cywgbWFwIE1DUyB0byBQTENQICovCisJaWYgKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHsKKwkJbWFjX2lkeCAmPSBSQVRFX01DU19DT0RFX01TSzsJLyogUmVtb3ZlICMgb2Ygc3RyZWFtcyAqLworCQlpZiAobWFjX2lkeCA+PSAoUkFURV85TV9JRFggLSBJTF9GSVJTVF9PRkRNX1JBVEUpKQorCQkJbWFjX2lkeCsrOworCQkvKgorCQkgKiBtYWM4MDIxMSBIVCBpZHggaXMgYWx3YXlzIHplcm8taWR4ZWQ7IHdlIG5lZWQgdG8gbW92ZQorCQkgKiBIVCBPRkRNIHJhdGVzIGFmdGVyIENDSyByYXRlcyBpbiAyLjQgR0h6IGJhbmQKKwkJICovCisJCWlmIChpbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQorCQkJbWFjX2lkeCArPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJfQorCS8qIEhlcmUgd2UgYWN0dWFsbHkgY29tcGFyZSB0aGlzIHJhdGUgdG8gdGhlIGxhdGVzdCBMUSBjb21tYW5kICovCisJaWYgKG1hY19pZHggPCAwIHx8CisJICAgIHRibF90eXBlLmlzX1NHSSAhPSAhIShtYWNfZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kpIHx8CisJICAgIHRibF90eXBlLmlzX2h0NDAgIT0gISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSCkgfHwKKwkgICAgdGJsX3R5cGUuaXNfZHVwICE9ICEhKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19EVVBfREFUQSkgfHwKKwkgICAgdGJsX3R5cGUuYW50X3R5cGUgIT0gaW5mby0+YW50ZW5uYV9zZWxfdHggfHwKKwkgICAgISEodHhfcmF0ZSAmIFJBVEVfTUNTX0hUX01TSykgIT0gISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykKKwkgICAgfHwgISEodHhfcmF0ZSAmIFJBVEVfTUNTX0dGX01TSykgIT0KKwkgICAgISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEKSB8fCByc19pZHggIT0gbWFjX2lkeCkgeworCQlEX1JBVEUoImluaXRpYWwgcmF0ZSAlZCBkb2VzIG5vdCBtYXRjaCAlZCAoMHgleClcbiIsIG1hY19pZHgsCisJCSAgICAgICByc19pZHgsIHR4X3JhdGUpOworCQkvKgorCQkgKiBTaW5jZSByYXRlcyBtaXMtbWF0Y2gsIHRoZSBsYXN0IExRIGNvbW1hbmQgbWF5IGhhdmUgZmFpbGVkLgorCQkgKiBBZnRlciBJTF9NSVNTRURfUkFURV9NQVggbWlzLW1hdGNoZXMsIHJlc3luYyB0aGUgdUNvZGUgd2l0aAorCQkgKiAuLi4gZHJpdmVyLgorCQkgKi8KKwkJbHFfc3RhLT5taXNzZWRfcmF0ZV9jb3VudGVyKys7CisJCWlmIChscV9zdGEtPm1pc3NlZF9yYXRlX2NvdW50ZXIgPiBJTF9NSVNTRURfUkFURV9NQVgpIHsKKwkJCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IDA7CisJCQlpbF9zZW5kX2xxX2NtZChpbCwgY3R4LCAmbHFfc3RhLT5scSwgQ01EX0FTWU5DLCBmYWxzZSk7CisJCX0KKwkJLyogUmVnYXJkbGVzcywgaWdub3JlIHRoaXMgc3RhdHVzIGluZm8gZm9yIG91dGRhdGVkIHJhdGUgKi8KKwkJcmV0dXJuOworCX0gZWxzZQorCQkvKiBSYXRlIGRpZCBtYXRjaCwgc28gcmVzZXQgdGhlIG1pc3NlZF9yYXRlX2NvdW50ZXIgKi8KKwkJbHFfc3RhLT5taXNzZWRfcmF0ZV9jb3VudGVyID0gMDsKKworCS8qIEZpZ3VyZSBvdXQgaWYgcmF0ZSBzY2FsZSBhbGdvcml0aG0gaXMgaW4gYWN0aXZlIG9yIHNlYXJjaCB0YWJsZSAqLworCWlmIChpbDQ5NjVfdGFibGVfdHlwZV9tYXRjaGVzCisJICAgICgmdGJsX3R5cGUsICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pKSkgeworCQljdXJyX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOworCQlvdGhlcl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJfSBlbHNlCisJICAgIGlmIChpbDQ5NjVfdGFibGVfdHlwZV9tYXRjaGVzCisJCSgmdGJsX3R5cGUsICZscV9zdGEtPmxxX2luZm9bMSAtIGxxX3N0YS0+YWN0aXZlX3RibF0pKSB7CisJCWN1cnJfdGJsID0gJihscV9zdGEtPmxxX2luZm9bMSAtIGxxX3N0YS0+YWN0aXZlX3RibF0pOworCQlvdGhlcl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKKwl9IGVsc2UgeworCQlEX1JBVEUoIk5laXRoZXIgYWN0aXZlIG5vciBzZWFyY2ggbWF0Y2hlcyB0eCByYXRlXG4iKTsKKwkJdG1wX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOworCQlEX1JBVEUoImFjdGl2ZS0gbHE6JXgsIGFudDoleCwgU0dJOiVkXG4iLCB0bXBfdGJsLT5scV90eXBlLAorCQkgICAgICAgdG1wX3RibC0+YW50X3R5cGUsIHRtcF90YmwtPmlzX1NHSSk7CisJCXRtcF90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJCURfUkFURSgic2VhcmNoLSBscToleCwgYW50OiV4LCBTR0k6JWRcbiIsIHRtcF90YmwtPmxxX3R5cGUsCisJCSAgICAgICB0bXBfdGJsLT5hbnRfdHlwZSwgdG1wX3RibC0+aXNfU0dJKTsKKwkJRF9SQVRFKCJhY3R1YWwtIGxxOiV4LCBhbnQ6JXgsIFNHSTolZFxuIiwgdGJsX3R5cGUubHFfdHlwZSwKKwkJICAgICAgIHRibF90eXBlLmFudF90eXBlLCB0YmxfdHlwZS5pc19TR0kpOworCQkvKgorCQkgKiBubyBtYXRjaGluZyB0YWJsZSBmb3VuZCwgbGV0J3MgYnktcGFzcyB0aGUgZGF0YSBjb2xsZWN0aW9uCisJCSAqIGFuZCBjb250aW51ZSB0byBwZXJmb3JtIHJhdGUgc2NhbGUgdG8gZmluZCB0aGUgcmF0ZSB0YWJsZQorCQkgKi8KKwkJaWw0OTY1X3JzX3N0YXlfaW5fdGFibGUobHFfc3RhLCB0cnVlKTsKKwkJZ290byBkb25lOworCX0KKworCS8qCisJICogVXBkYXRpbmcgdGhlIGZyYW1lIGhpc3RvcnkgZGVwZW5kcyBvbiB3aGV0aGVyIHBhY2tldHMgd2VyZQorCSAqIGFnZ3JlZ2F0ZWQuCisJICoKKwkgKiBGb3IgYWdncmVnYXRpb24sIGFsbCBwYWNrZXRzIHdlcmUgdHJhbnNtaXR0ZWQgYXQgdGhlIHNhbWUgcmF0ZSwgdGhlCisJICogZmlyc3QgaWR4IGludG8gcmF0ZSBzY2FsZSB0YWJsZS4KKwkgKi8KKwlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVSkgeworCQl0eF9yYXRlID0gbGUzMl90b19jcHUodGFibGUtPnJzX3RhYmxlWzBdLnJhdGVfbl9mbGFncyk7CisJCWlsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3ModHhfcmF0ZSwgaWwtPmJhbmQsICZ0YmxfdHlwZSwKKwkJCQkJCSZyc19pZHgpOworCQlpbDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhKGN1cnJfdGJsLCByc19pZHgsCisJCQkJCSAgaW5mby0+c3RhdHVzLmFtcGR1X2xlbiwKKwkJCQkJICBpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbik7CisKKwkJLyogVXBkYXRlIHN1Y2Nlc3MvZmFpbCBjb3VudHMgaWYgbm90IHNlYXJjaGluZyBmb3IgbmV3IG1vZGUgKi8KKwkJaWYgKGxxX3N0YS0+c3RheV9pbl90YmwpIHsKKwkJCWxxX3N0YS0+dG90YWxfc3VjY2VzcyArPSBpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbjsKKwkJCWxxX3N0YS0+dG90YWxfZmFpbGVkICs9CisJCQkgICAgKGluZm8tPnN0YXR1cy5hbXBkdV9sZW4gLQorCQkJICAgICBpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbik7CisJCX0KKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3IgbGVnYWN5LCB1cGRhdGUgZnJhbWUgaGlzdG9yeSB3aXRoIGZvciBlYWNoIFR4IHJldHJ5LgorCQkgKi8KKwkJcmV0cmllcyA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCAtIDE7CisJCS8qIEhXIGRvZXNuJ3Qgc2VuZCBtb3JlIHRoYW4gMTUgcmV0cmllcyAqLworCQlyZXRyaWVzID0gbWluKHJldHJpZXMsIDE1KTsKKworCQkvKiBUaGUgbGFzdCB0cmFuc21pc3Npb24gbWF5IGhhdmUgYmVlbiBzdWNjZXNzZnVsICovCisJCWxlZ2FjeV9zdWNjZXNzID0gISEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spOworCQkvKiBDb2xsZWN0IGRhdGEgZm9yIGVhY2ggcmF0ZSB1c2VkIGR1cmluZyBmYWlsZWQgVFggYXR0ZW1wdHMgKi8KKwkJZm9yIChpID0gMDsgaSA8PSByZXRyaWVzOyArK2kpIHsKKwkJCXR4X3JhdGUgPSBsZTMyX3RvX2NwdSh0YWJsZS0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzKTsKKwkJCWlsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3ModHhfcmF0ZSwgaWwtPmJhbmQsCisJCQkJCQkJJnRibF90eXBlLCAmcnNfaWR4KTsKKwkJCS8qCisJCQkgKiBPbmx5IGNvbGxlY3Qgc3RhdHMgaWYgcmV0cmllZCByYXRlIGlzIGluIHRoZSBzYW1lIFJTCisJCQkgKiB0YWJsZSBhcyBhY3RpdmUvc2VhcmNoLgorCQkJICovCisJCQlpZiAoaWw0OTY1X3RhYmxlX3R5cGVfbWF0Y2hlcygmdGJsX3R5cGUsIGN1cnJfdGJsKSkKKwkJCQl0bXBfdGJsID0gY3Vycl90Ymw7CisJCQllbHNlIGlmIChpbDQ5NjVfdGFibGVfdHlwZV9tYXRjaGVzCisJCQkJICgmdGJsX3R5cGUsIG90aGVyX3RibCkpCisJCQkJdG1wX3RibCA9IG90aGVyX3RibDsKKwkJCWVsc2UKKwkJCQljb250aW51ZTsKKwkJCWlsNDk2NV9yc19jb2xsZWN0X3R4X2RhdGEodG1wX3RibCwgcnNfaWR4LCAxLAorCQkJCQkJICBpIDwKKwkJCQkJCSAgcmV0cmllcyA/IDAgOiBsZWdhY3lfc3VjY2Vzcyk7CisJCX0KKworCQkvKiBVcGRhdGUgc3VjY2Vzcy9mYWlsIGNvdW50cyBpZiBub3Qgc2VhcmNoaW5nIGZvciBuZXcgbW9kZSAqLworCQlpZiAobHFfc3RhLT5zdGF5X2luX3RibCkgeworCQkJbHFfc3RhLT50b3RhbF9zdWNjZXNzICs9IGxlZ2FjeV9zdWNjZXNzOworCQkJbHFfc3RhLT50b3RhbF9mYWlsZWQgKz0gcmV0cmllcyArICgxIC0gbGVnYWN5X3N1Y2Nlc3MpOworCQl9CisJfQorCS8qIFRoZSBsYXN0IFRYIHJhdGUgaXMgY2FjaGVkIGluIGxxX3N0YTsgaXQncyBzZXQgaW4gaWYvZWxzZSBhYm92ZSAqLworCWxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgPSB0eF9yYXRlOworZG9uZToKKwkvKiBTZWUgaWYgdGhlcmUncyBhIGJldHRlciByYXRlIG9yIG1vZHVsYXRpb24gbW9kZSB0byB0cnkuICovCisJaWYgKHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0pCisJCWlsNDk2NV9yc19yYXRlX3NjYWxlX3BlcmZvcm0oaWwsIHNrYiwgc3RhLCBscV9zdGEpOworfQorCisvKgorICogQmVnaW4gYSBwZXJpb2Qgb2Ygc3RheWluZyB3aXRoIGEgc2VsZWN0ZWQgbW9kdWxhdGlvbiBtb2RlLgorICogU2V0ICJzdGF5X2luX3RibCIgZmxhZyB0byBwcmV2ZW50IGFueSBtb2RlIHN3aXRjaGVzLgorICogU2V0IGZyYW1lIHR4IHN1Y2Nlc3MgbGltaXRzIGFjY29yZGluZyB0byBsZWdhY3kgdnMuIGhpZ2gtdGhyb3VnaHB1dCwKKyAqIGFuZCByZXNldCBvdmVyYWxsIChzcGFubmluZyBhbGwgcmF0ZXMpIHR4IHN1Y2Nlc3MgaGlzdG9yeSBzdGF0cy4KKyAqIFRoZXNlIGNvbnRyb2wgaG93IGxvbmcgd2Ugc3RheSB1c2luZyBzYW1lIG1vZHVsYXRpb24gbW9kZSBiZWZvcmUKKyAqIHNlYXJjaGluZyBmb3IgYSBuZXcgbW9kZS4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19zZXRfc3RheV9pbl90YWJsZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGlzX2xlZ2FjeSwKKwkJCSAgICBzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEpCit7CisJRF9SQVRFKCJ3ZSBhcmUgc3RheWluZyBpbiB0aGUgc2FtZSB0YWJsZVxuIik7CisJbHFfc3RhLT5zdGF5X2luX3RibCA9IDE7CS8qIG9ubHkgcGxhY2UgdGhpcyBnZXRzIHNldCAqLworCWlmIChpc19sZWdhY3kpIHsKKwkJbHFfc3RhLT50YWJsZV9jb3VudF9saW1pdCA9IElMX0xFR0FDWV9UQkxfQ09VTlQ7CisJCWxxX3N0YS0+bWF4X2ZhaWx1cmVfbGltaXQgPSBJTF9MRUdBQ1lfRkFJTFVSRV9MSU1JVDsKKwkJbHFfc3RhLT5tYXhfc3VjY2Vzc19saW1pdCA9IElMX0xFR0FDWV9TVUNDRVNTX0xJTUlUOworCX0gZWxzZSB7CisJCWxxX3N0YS0+dGFibGVfY291bnRfbGltaXQgPSBJTF9OT05FX0xFR0FDWV9UQkxfQ09VTlQ7CisJCWxxX3N0YS0+bWF4X2ZhaWx1cmVfbGltaXQgPSBJTF9OT05FX0xFR0FDWV9GQUlMVVJFX0xJTUlUOworCQlscV9zdGEtPm1heF9zdWNjZXNzX2xpbWl0ID0gSUxfTk9ORV9MRUdBQ1lfU1VDQ0VTU19MSU1JVDsKKwl9CisJbHFfc3RhLT50YWJsZV9jb3VudCA9IDA7CisJbHFfc3RhLT50b3RhbF9mYWlsZWQgPSAwOworCWxxX3N0YS0+dG90YWxfc3VjY2VzcyA9IDA7CisJbHFfc3RhLT5mbHVzaF90aW1lciA9IGppZmZpZXM7CisJbHFfc3RhLT5hY3Rpb25fY291bnRlciA9IDA7Cit9CisKKy8qCisgKiBGaW5kIGNvcnJlY3QgdGhyb3VnaHB1dCB0YWJsZSBmb3IgZ2l2ZW4gbW9kZSBvZiBtb2R1bGF0aW9uCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkJIHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsKQoreworCS8qIFVzZWQgdG8gY2hvb3NlIGFtb25nIEhUIHRhYmxlcyAqLworCXMzMigqaHRfdGJsX3BvaW50ZXIpW1JBVEVfQ09VTlRdOworCisJLyogQ2hlY2sgZm9yIGludmFsaWQgTFEgdHlwZSAqLworCWlmIChXQVJOX09OX09OQ0UoIWlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpICYmICFpc19IdCh0YmwtPmxxX3R5cGUpKSkgeworCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGV4cGVjdGVkX3RwdF9sZWdhY3k7CisJCXJldHVybjsKKwl9CisKKwkvKiBMZWdhY3kgcmF0ZXMgaGF2ZSBvbmx5IG9uZSB0YWJsZSAqLworCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgeworCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGV4cGVjdGVkX3RwdF9sZWdhY3k7CisJCXJldHVybjsKKwl9CisKKwkvKiBDaG9vc2UgYW1vbmcgbWFueSBIVCB0YWJsZXMgZGVwZW5kaW5nIG9uIG51bWJlciBvZiBzdHJlYW1zCisJICogKFNJU08vTUlNTzIpLCBjaGFubmVsIHdpZHRoICgyMC80MCksIFNHSSwgYW5kIGFnZ3JlZ2F0aW9uCisJICogc3RhdHVzICovCisJaWYgKGlzX3Npc28odGJsLT5scV90eXBlKSAmJiAoIXRibC0+aXNfaHQ0MCB8fCBscV9zdGEtPmlzX2R1cCkpCisJCWh0X3RibF9wb2ludGVyID0gZXhwZWN0ZWRfdHB0X3Npc28yME1IejsKKwllbHNlIGlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkpCisJCWh0X3RibF9wb2ludGVyID0gZXhwZWN0ZWRfdHB0X3Npc280ME1IejsKKwllbHNlIGlmIChpc19taW1vMih0YmwtPmxxX3R5cGUpICYmICghdGJsLT5pc19odDQwIHx8IGxxX3N0YS0+aXNfZHVwKSkKKwkJaHRfdGJsX3BvaW50ZXIgPSBleHBlY3RlZF90cHRfbWltbzJfMjBNSHo7CisJZWxzZQkJCS8qIGlmIChpc19taW1vMih0YmwtPmxxX3R5cGUpKSA8LS0gbXVzdCBiZSB0cnVlICovCisJCWh0X3RibF9wb2ludGVyID0gZXhwZWN0ZWRfdHB0X21pbW8yXzQwTUh6OworCisJaWYgKCF0YmwtPmlzX1NHSSAmJiAhbHFfc3RhLT5pc19hZ2cpCS8qIE5vcm1hbCAqLworCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzBdOworCWVsc2UgaWYgKHRibC0+aXNfU0dJICYmICFscV9zdGEtPmlzX2FnZykJLyogU0dJICovCisJCXRibC0+ZXhwZWN0ZWRfdHB0ID0gaHRfdGJsX3BvaW50ZXJbMV07CisJZWxzZSBpZiAoIXRibC0+aXNfU0dJICYmIGxxX3N0YS0+aXNfYWdnKQkvKiBBR0cgKi8KKwkJdGJsLT5leHBlY3RlZF90cHQgPSBodF90YmxfcG9pbnRlclsyXTsKKwllbHNlCQkJLyogQUdHK1NHSSAqLworCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzNdOworfQorCisvKgorICogRmluZCBzdGFydGluZyByYXRlIGZvciBuZXcgInNlYXJjaCIgaGlnaC10aHJvdWdocHV0IG1vZGUgb2YgbW9kdWxhdGlvbi4KKyAqIEdvYWwgaXMgdG8gZmluZCBsb3dlc3QgZXhwZWN0ZWQgcmF0ZSAodW5kZXIgcGVyZmVjdCBjb25kaXRpb25zKSB0aGF0IGlzCisgKiBhYm92ZSB0aGUgY3VycmVudCBtZWFzdXJlZCB0aHJvdWdocHV0IG9mICJhY3RpdmUiIG1vZGUsIHRvIGdpdmUgbmV3IG1vZGUKKyAqIGEgZmFpciBjaGFuY2UgdG8gcHJvdmUgaXRzZWxmIHdpdGhvdXQgdG9vIG1hbnkgY2hhbGxlbmdlcy4KKyAqCisgKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gdHJhbnNpdGlvbmluZyB0byBtb3JlIGFnZ3Jlc3NpdmUgbW9kdWxhdGlvbgorICogKGkuZS4gbGVnYWN5IHRvIFNJU08gb3IgTUlNTywgb3IgU0lTTyB0byBNSU1PKSwgYXMgd2VsbCBhcyBsZXNzIGFnZ3Jlc3NpdmUKKyAqIChpLmUuIE1JTU8gdG8gU0lTTykuICBXaGVuIG1vdmluZyB0byBNSU1PLCBiaXQgcmF0ZSB3aWxsIHR5cGljYWxseSBuZWVkCisgKiB0byBkZWNyZWFzZSB0byBtYXRjaCAiYWN0aXZlIiB0aHJvdWdocHV0LiAgV2hlbiBtb3ZpbmcgZnJvbSBNSU1PIHRvIFNJU08sCisgKiBiaXQgcmF0ZSB3aWxsIHR5cGljYWxseSBuZWVkIHRvIGluY3JlYXNlLCBidXQgbm90IGlmIHBlcmZvcm1hbmNlIHdhcyBiYWQuCisgKi8KK3N0YXRpYyBzMzIKK2lsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwsCS8qICJzZWFyY2giICovCisJCQl1MTYgcmF0ZV9tYXNrLCBzOCBpZHgpCit7CisJLyogImFjdGl2ZSIgdmFsdWVzICovCisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICphY3RpdmVfdGJsID0KKwkgICAgJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJczMyIGFjdGl2ZV9zciA9IGFjdGl2ZV90YmwtPndpbltpZHhdLnN1Y2Nlc3NfcmF0aW87CisJczMyIGFjdGl2ZV90cHQgPSBhY3RpdmVfdGJsLT5leHBlY3RlZF90cHRbaWR4XTsKKworCS8qIGV4cGVjdGVkICJzZWFyY2giIHRocm91Z2hwdXQgKi8KKwlzMzIgKnRwdF90YmwgPSB0YmwtPmV4cGVjdGVkX3RwdDsKKworCXMzMiBuZXdfcmF0ZSwgaGlnaCwgbG93LCBzdGFydF9oaTsKKwl1MTYgaGlnaF9sb3c7CisJczggcmF0ZSA9IGlkeDsKKworCW5ld19yYXRlID0gaGlnaCA9IGxvdyA9IHN0YXJ0X2hpID0gUkFURV9JTlZBTElEOworCisJZm9yICg7OykgeworCQloaWdoX2xvdyA9CisJCSAgICBpbDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUoaWwsIHJhdGUsIHJhdGVfbWFzaywKKwkJCQkJCXRibC0+bHFfdHlwZSk7CisKKwkJbG93ID0gaGlnaF9sb3cgJiAweGZmOworCQloaWdoID0gKGhpZ2hfbG93ID4+IDgpICYgMHhmZjsKKworCQkvKgorCQkgKiBMb3dlciB0aGUgInNlYXJjaCIgYml0IHJhdGUsIHRvIGdpdmUgbmV3ICJzZWFyY2giIG1vZGUKKwkJICogYXBwcm94aW1hdGVseSB0aGUgc2FtZSB0aHJvdWdocHV0IGFzICJhY3RpdmUiIGlmOgorCQkgKgorCQkgKiAxKSAiQWN0aXZlIiBtb2RlIGhhcyBiZWVuIHdvcmtpbmcgbW9kZXN0bHkgd2VsbCAoYnV0IG5vdAorCQkgKiAgICBncmVhdCksIGFuZCBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0CisJCSAqICAgIGNvbmRpdGlvbnMpIGF0IGNhbmRpZGF0ZSByYXRlIGlzIGFib3ZlIHRoZSBhY3R1YWwKKwkJICogICAgbWVhc3VyZWQgImFjdGl2ZSIgdGhyb3VnaHB1dCAoYnV0IGxlc3MgdGhhbiBleHBlY3RlZAorCQkgKiAgICAiYWN0aXZlIiB0aHJvdWdocHV0IHVuZGVyIHBlcmZlY3QgY29uZGl0aW9ucykuCisJCSAqIE9SCisJCSAqIDIpICJBY3RpdmUiIG1vZGUgaGFzIGJlZW4gd29ya2luZyBwZXJmZWN0bHkgb3IgdmVyeSB3ZWxsCisJCSAqICAgIGFuZCBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0CisJCSAqICAgIGNvbmRpdGlvbnMpIGF0IGNhbmRpZGF0ZSByYXRlIGlzIGFib3ZlIGV4cGVjdGVkCisJCSAqICAgICJhY3RpdmUiIHRocm91Z2hwdXQgKHVuZGVyIHBlcmZlY3QgY29uZGl0aW9ucykuCisJCSAqLworCQlpZiAoKDEwMCAqIHRwdF90YmxbcmF0ZV0gPiBscV9zdGEtPmxhc3RfdHB0ICYmCisJCSAgICAgKGFjdGl2ZV9zciA+IFJBVEVfREVDUkVBU0VfVEggJiYgYWN0aXZlX3NyIDw9IFJBVEVfSElHSF9USAorCQkgICAgICAmJiB0cHRfdGJsW3JhdGVdIDw9IGFjdGl2ZV90cHQpKSB8fAorCQkgICAgKGFjdGl2ZV9zciA+PSBSQVRFX1NDQUxFX1NXSVRDSCAmJgorCQkgICAgIHRwdF90YmxbcmF0ZV0gPiBhY3RpdmVfdHB0KSkgeworCisJCQkvKiAoMm5kIG9yIGxhdGVyIHBhc3MpCisJCQkgKiBJZiB3ZSd2ZSBhbHJlYWR5IHRyaWVkIHRvIHJhaXNlIHRoZSByYXRlLCBhbmQgYXJlCisJCQkgKiBub3cgdHJ5aW5nIHRvIGxvd2VyIGl0LCB1c2UgdGhlIGhpZ2hlciByYXRlLiAqLworCQkJaWYgKHN0YXJ0X2hpICE9IFJBVEVfSU5WQUxJRCkgeworCQkJCW5ld19yYXRlID0gc3RhcnRfaGk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW5ld19yYXRlID0gcmF0ZTsKKworCQkJLyogTG9vcCBhZ2FpbiB3aXRoIGxvd2VyIHJhdGUgKi8KKwkJCWlmIChsb3cgIT0gUkFURV9JTlZBTElEKQorCQkJCXJhdGUgPSBsb3c7CisKKwkJCS8qIExvd2VyIHJhdGUgbm90IGF2YWlsYWJsZSwgdXNlIHRoZSBvcmlnaW5hbCAqLworCQkJZWxzZQorCQkJCWJyZWFrOworCisJCQkvKiBFbHNlIHRyeSB0byByYWlzZSB0aGUgInNlYXJjaCIgcmF0ZSB0byBtYXRjaCAiYWN0aXZlIiAqLworCQl9IGVsc2UgeworCQkJLyogKDJuZCBvciBsYXRlciBwYXNzKQorCQkJICogSWYgd2UndmUgYWxyZWFkeSB0cmllZCB0byBsb3dlciB0aGUgcmF0ZSwgYW5kIGFyZQorCQkJICogbm93IHRyeWluZyB0byByYWlzZSBpdCwgdXNlIHRoZSBsb3dlciByYXRlLiAqLworCQkJaWYgKG5ld19yYXRlICE9IFJBVEVfSU5WQUxJRCkKKwkJCQlicmVhazsKKworCQkJLyogTG9vcCBhZ2FpbiB3aXRoIGhpZ2hlciByYXRlICovCisJCQllbHNlIGlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCkgeworCQkJCXN0YXJ0X2hpID0gaGlnaDsKKwkJCQlyYXRlID0gaGlnaDsKKworCQkJCS8qIEhpZ2hlciByYXRlIG5vdCBhdmFpbGFibGUsIHVzZSB0aGUgb3JpZ2luYWwgKi8KKwkJCX0gZWxzZSB7CisJCQkJbmV3X3JhdGUgPSByYXRlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIG5ld19yYXRlOworfQorCisvKgorICogU2V0IHVwIHNlYXJjaCB0YWJsZSBmb3IgTUlNTzIKKyAqLworc3RhdGljIGludAoraWw0OTY1X3JzX3N3aXRjaF90b19taW1vMihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICBzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCwgaW50IGlkeCkKK3sKKwl1MTYgcmF0ZV9tYXNrOworCXMzMiByYXRlOworCXM4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKKworCWlmICghY29uZl9pc19odChjb25mKSB8fCAhc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoKChzdGEtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKSA+PiAyKSA9PQorCSAgICBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpCisJCXJldHVybiAtMTsKKworCS8qIE5lZWQgYm90aCBUeCBjaGFpbnMvYW50ZW5uYXMgdG8gc3VwcG9ydCBNSU1PICovCisJaWYgKGlsLT5od19wYXJhbXMudHhfY2hhaW5zX251bSA8IDIpCisJCXJldHVybiAtMTsKKworCURfUkFURSgiTFE6IHRyeSB0byBzd2l0Y2ggdG8gTUlNTzJcbiIpOworCisJdGJsLT5scV90eXBlID0gTFFfTUlNTzI7CisJdGJsLT5pc19kdXAgPSBscV9zdGEtPmlzX2R1cDsKKwl0YmwtPmFjdGlvbiA9IDA7CisJdGJsLT5tYXhfc2VhcmNoID0gSUxfTUFYX1NFQVJDSDsKKwlyYXRlX21hc2sgPSBscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlOworCisJaWYgKGlsX2lzX2h0NDBfdHhfYWxsb3dlZChpbCwgY3R4LCAmc3RhLT5odF9jYXApKQorCQl0YmwtPmlzX2h0NDAgPSAxOworCWVsc2UKKwkJdGJsLT5pc19odDQwID0gMDsKKworCWlsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgdGJsKTsKKworCXJhdGUgPSBpbDQ5NjVfcnNfZ2V0X2Jlc3RfcmF0ZShpbCwgbHFfc3RhLCB0YmwsIHJhdGVfbWFzaywgaWR4KTsKKworCURfUkFURSgiTFE6IE1JTU8yIGJlc3QgcmF0ZSAlZCBtYXNrICVYXG4iLCByYXRlLCByYXRlX21hc2spOworCWlmIChyYXRlID09IFJBVEVfSU5WQUxJRCB8fCAhKCgxIDw8IHJhdGUpICYgcmF0ZV9tYXNrKSkgeworCQlEX1JBVEUoIkNhbid0IHN3aXRjaCB3aXRoIGlkeCAlZCByYXRlIG1hc2sgJXhcbiIsIHJhdGUsCisJCSAgICAgICByYXRlX21hc2spOworCQlyZXR1cm4gLTE7CisJfQorCXRibC0+Y3VycmVudF9yYXRlID0KKwkgICAgaWw0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChpbCwgdGJsLCByYXRlLCBpc19ncmVlbik7CisKKwlEX1JBVEUoIkxROiBTd2l0Y2ggdG8gbmV3IG1jcyAlWCBpZHggaXMgZ3JlZW4gJVhcbiIsIHRibC0+Y3VycmVudF9yYXRlLAorCSAgICAgICBpc19ncmVlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgdXAgc2VhcmNoIHRhYmxlIGZvciBTSVNPCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9yc19zd2l0Y2hfdG9fc2lzbyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkgc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwsIGludCBpZHgpCit7CisJdTE2IHJhdGVfbWFzazsKKwl1OCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47CisJczMyIHJhdGU7CisJc3RydWN0IGlsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7CisKKwlpZiAoIWNvbmZfaXNfaHQoY29uZikgfHwgIXN0YS0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKKwkJcmV0dXJuIC0xOworCisJRF9SQVRFKCJMUTogdHJ5IHRvIHN3aXRjaCB0byBTSVNPXG4iKTsKKworCXRibC0+aXNfZHVwID0gbHFfc3RhLT5pc19kdXA7CisJdGJsLT5scV90eXBlID0gTFFfU0lTTzsKKwl0YmwtPmFjdGlvbiA9IDA7CisJdGJsLT5tYXhfc2VhcmNoID0gSUxfTUFYX1NFQVJDSDsKKwlyYXRlX21hc2sgPSBscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGU7CisKKwlpZiAoaWxfaXNfaHQ0MF90eF9hbGxvd2VkKGlsLCBjdHgsICZzdGEtPmh0X2NhcCkpCisJCXRibC0+aXNfaHQ0MCA9IDE7CisJZWxzZQorCQl0YmwtPmlzX2h0NDAgPSAwOworCisJaWYgKGlzX2dyZWVuKQorCQl0YmwtPmlzX1NHSSA9IDA7CS8qMTFuIHNwZWM6IG5vIFNHSSBpbiBTSVNPK0dyZWVuZmllbGQgKi8KKworCWlsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgdGJsKTsKKwlyYXRlID0gaWw0OTY1X3JzX2dldF9iZXN0X3JhdGUoaWwsIGxxX3N0YSwgdGJsLCByYXRlX21hc2ssIGlkeCk7CisKKwlEX1JBVEUoIkxROiBnZXQgYmVzdCByYXRlICVkIG1hc2sgJVhcbiIsIHJhdGUsIHJhdGVfbWFzayk7CisJaWYgKHJhdGUgPT0gUkFURV9JTlZBTElEIHx8ICEoKDEgPDwgcmF0ZSkgJiByYXRlX21hc2spKSB7CisJCURfUkFURSgiY2FuIG5vdCBzd2l0Y2ggd2l0aCBpZHggJWQgcmF0ZSBtYXNrICV4XG4iLCByYXRlLAorCQkgICAgICAgcmF0ZV9tYXNrKTsKKwkJcmV0dXJuIC0xOworCX0KKwl0YmwtPmN1cnJlbnRfcmF0ZSA9CisJICAgIGlsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwoaWwsIHRibCwgcmF0ZSwgaXNfZ3JlZW4pOworCURfUkFURSgiTFE6IFN3aXRjaCB0byBuZXcgbWNzICVYIGlkeCBpcyBncmVlbiAlWFxuIiwgdGJsLT5jdXJyZW50X3JhdGUsCisJICAgICAgIGlzX2dyZWVuKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRyeSB0byBzd2l0Y2ggdG8gbmV3IG1vZHVsYXRpb24gbW9kZSBmcm9tIGxlZ2FjeQorICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfbW92ZV9sZWdhY3lfb3RoZXIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCBpZHgpCit7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnNlYXJjaF90YmwgPQorCSAgICAmKGxxX3N0YS0+bHFfaW5mb1soMSAtIGxxX3N0YS0+YWN0aXZlX3RibCldKTsKKwlzdHJ1Y3QgaWxfcmF0ZV9zY2FsZV9kYXRhICp3aW4gPSAmKHRibC0+d2luW2lkeF0pOworCXUzMiBzeiA9CisJICAgIChzaXplb2Yoc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvKSAtCisJICAgICAoc2l6ZW9mKHN0cnVjdCBpbF9yYXRlX3NjYWxlX2RhdGEpICogUkFURV9DT1VOVCkpOworCXU4IHN0YXJ0X2FjdGlvbjsKKwl1OCB2YWxpZF90eF9hbnQgPSBpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKKwl1OCB0eF9jaGFpbnNfbnVtID0gaWwtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtOworCWludCByZXQgPSAwOworCXU4IHVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAwOworCisJdGJsLT5hY3Rpb24gPSBJTF9MRUdBQ1lfU1dJVENIX1NJU087CisKKwlzdGFydF9hY3Rpb24gPSB0YmwtPmFjdGlvbjsKKwlmb3IgKDs7KSB7CisJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKKwkJc3dpdGNoICh0YmwtPmFjdGlvbikgeworCQljYXNlIElMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTE6CisJCWNhc2UgSUxfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMjoKKwkJCURfUkFURSgiTFE6IExlZ2FjeSB0b2dnbGUgQW50ZW5uYVxuIik7CisKKwkJCWlmICgodGJsLT5hY3Rpb24gPT0gSUxfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMSAmJgorCQkJICAgICB0eF9jaGFpbnNfbnVtIDw9IDEpIHx8CisJCQkgICAgKHRibC0+YWN0aW9uID09IElMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTIgJiYKKwkJCSAgICAgdHhfY2hhaW5zX251bSA8PSAyKSkKKwkJCQlicmVhazsKKworCQkJLyogRG9uJ3QgY2hhbmdlIGFudGVubmEgaWYgc3VjY2VzcyBoYXMgYmVlbiBncmVhdCAqLworCQkJaWYgKHdpbi0+c3VjY2Vzc19yYXRpbyA+PSBJTF9SU19HT09EX1JBVElPKQorCQkJCWJyZWFrOworCisJCQkvKiBTZXQgdXAgc2VhcmNoIHRhYmxlIHRvIHRyeSBvdGhlciBhbnRlbm5hICovCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisKKwkJCWlmIChpbDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEKKwkJCSAgICAodmFsaWRfdHhfYW50LCAmc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlLAorCQkJICAgICBzZWFyY2hfdGJsKSkgeworCQkJCXVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAxOworCQkJCWlsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwKKwkJCQkJCQkJIHNlYXJjaF90YmwpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgSUxfTEVHQUNZX1NXSVRDSF9TSVNPOgorCQkJRF9SQVRFKCJMUTogTGVnYWN5IHN3aXRjaCB0byBTSVNPXG4iKTsKKworCQkJLyogU2V0IHVwIHNlYXJjaCB0YWJsZSB0byB0cnkgU0lTTyAqLworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCQkJc2VhcmNoX3RibC0+aXNfU0dJID0gMDsKKwkJCXJldCA9CisJCQkgICAgaWw0OTY1X3JzX3N3aXRjaF90b19zaXNvKGlsLCBscV9zdGEsIGNvbmYsIHN0YSwKKwkJCQkJCSAgICAgc2VhcmNoX3RibCwgaWR4KTsKKwkJCWlmICghcmV0KSB7CisJCQkJbHFfc3RhLT5hY3Rpb25fY291bnRlciA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWJyZWFrOworCQljYXNlIElMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQUI6CisJCWNhc2UgSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQzoKKwkJY2FzZSBJTF9MRUdBQ1lfU1dJVENIX01JTU8yX0JDOgorCQkJRF9SQVRFKCJMUTogTGVnYWN5IHN3aXRjaCB0byBNSU1PMlxuIik7CisKKwkJCS8qIFNldCB1cCBzZWFyY2ggdGFibGUgdG8gdHJ5IE1JTU8gKi8KKwkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKKwkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7CisKKwkJCWlmICh0YmwtPmFjdGlvbiA9PSBJTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FCKQorCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0FCOworCQkJZWxzZSBpZiAodGJsLT5hY3Rpb24gPT0gSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQykKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BQzsKKwkJCWVsc2UKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9CQzsKKworCQkJaWYgKCFpbDQ5NjVfcnNfaXNfdmFsaWRfYW50CisJCQkgICAgKHZhbGlkX3R4X2FudCwgc2VhcmNoX3RibC0+YW50X3R5cGUpKQorCQkJCWJyZWFrOworCisJCQlyZXQgPQorCQkJICAgIGlsNDk2NV9yc19zd2l0Y2hfdG9fbWltbzIoaWwsIGxxX3N0YSwgY29uZiwgc3RhLAorCQkJCQkJICAgICAgc2VhcmNoX3RibCwgaWR4KTsKKwkJCWlmICghcmV0KSB7CisJCQkJbHFfc3RhLT5hY3Rpb25fY291bnRlciA9IDA7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQl0YmwtPmFjdGlvbisrOworCQlpZiAodGJsLT5hY3Rpb24gPiBJTF9MRUdBQ1lfU1dJVENIX01JTU8yX0JDKQorCQkJdGJsLT5hY3Rpb24gPSBJTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOworCisJCWlmICh0YmwtPmFjdGlvbiA9PSBzdGFydF9hY3Rpb24pCisJCQlicmVhazsKKworCX0KKwlzZWFyY2hfdGJsLT5scV90eXBlID0gTFFfTk9ORTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAxOworCXRibC0+YWN0aW9uKys7CisJaWYgKHRibC0+YWN0aW9uID4gSUxfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQykKKwkJdGJsLT5hY3Rpb24gPSBJTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOworCWlmICh1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyKQorCQlzZWFyY2hfdGJsLT5hY3Rpb24gPSB0YmwtPmFjdGlvbjsKKwlyZXR1cm4gMDsKKworfQorCisvKgorICogVHJ5IHRvIHN3aXRjaCB0byBuZXcgbW9kdWxhdGlvbiBtb2RlIGZyb20gU0lTTworICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfbW92ZV9zaXNvX3RvX290aGVyKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCBpZHgpCit7CisJdTggaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICpzZWFyY2hfdGJsID0KKwkgICAgJihscV9zdGEtPmxxX2luZm9bKDEgLSBscV9zdGEtPmFjdGl2ZV90YmwpXSk7CisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAqd2luID0gJih0YmwtPndpbltpZHhdKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKKwl1MzIgc3ogPQorCSAgICAoc2l6ZW9mKHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbykgLQorCSAgICAgKHNpemVvZihzdHJ1Y3QgaWxfcmF0ZV9zY2FsZV9kYXRhKSAqIFJBVEVfQ09VTlQpKTsKKwl1OCBzdGFydF9hY3Rpb247CisJdTggdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJdTggdHhfY2hhaW5zX251bSA9IGlsLT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKKwl1OCB1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMDsKKwlpbnQgcmV0OworCisJc3RhcnRfYWN0aW9uID0gdGJsLT5hY3Rpb247CisKKwlmb3IgKDs7KSB7CisJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKKwkJc3dpdGNoICh0YmwtPmFjdGlvbikgeworCQljYXNlIElMX1NJU09fU1dJVENIX0FOVEVOTkExOgorCQljYXNlIElMX1NJU09fU1dJVENIX0FOVEVOTkEyOgorCQkJRF9SQVRFKCJMUTogU0lTTyB0b2dnbGUgQW50ZW5uYVxuIik7CisJCQlpZiAoKHRibC0+YWN0aW9uID09IElMX1NJU09fU1dJVENIX0FOVEVOTkExICYmCisJCQkgICAgIHR4X2NoYWluc19udW0gPD0gMSkgfHwKKwkJCSAgICAodGJsLT5hY3Rpb24gPT0gSUxfU0lTT19TV0lUQ0hfQU5URU5OQTIgJiYKKwkJCSAgICAgdHhfY2hhaW5zX251bSA8PSAyKSkKKwkJCQlicmVhazsKKworCQkJaWYgKHdpbi0+c3VjY2Vzc19yYXRpbyA+PSBJTF9SU19HT09EX1JBVElPKQorCQkJCWJyZWFrOworCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisJCQlpZiAoaWw0OTY1X3JzX3RvZ2dsZV9hbnRlbm5hCisJCQkgICAgKHZhbGlkX3R4X2FudCwgJnNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSwKKwkJCSAgICAgc2VhcmNoX3RibCkpIHsKKwkJCQl1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElMX1NJU09fU1dJVENIX01JTU8yX0FCOgorCQljYXNlIElMX1NJU09fU1dJVENIX01JTU8yX0FDOgorCQljYXNlIElMX1NJU09fU1dJVENIX01JTU8yX0JDOgorCQkJRF9SQVRFKCJMUTogU0lTTyBzd2l0Y2ggdG8gTUlNTzJcbiIpOworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCQkJc2VhcmNoX3RibC0+aXNfU0dJID0gMDsKKworCQkJaWYgKHRibC0+YWN0aW9uID09IElMX1NJU09fU1dJVENIX01JTU8yX0FCKQorCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0FCOworCQkJZWxzZSBpZiAodGJsLT5hY3Rpb24gPT0gSUxfU0lTT19TV0lUQ0hfTUlNTzJfQUMpCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUM7CisJCQllbHNlCisJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQkM7CisKKwkJCWlmICghaWw0OTY1X3JzX2lzX3ZhbGlkX2FudAorCQkJICAgICh2YWxpZF90eF9hbnQsIHNlYXJjaF90YmwtPmFudF90eXBlKSkKKwkJCQlicmVhazsKKworCQkJcmV0ID0KKwkJCSAgICBpbDQ5NjVfcnNfc3dpdGNoX3RvX21pbW8yKGlsLCBscV9zdGEsIGNvbmYsIHN0YSwKKwkJCQkJCSAgICAgIHNlYXJjaF90YmwsIGlkeCk7CisJCQlpZiAoIXJldCkKKwkJCQlnb3RvIG91dDsKKwkJCWJyZWFrOworCQljYXNlIElMX1NJU09fU1dJVENIX0dJOgorCQkJaWYgKCF0YmwtPmlzX2h0NDAgJiYKKwkJCSAgICAhKGh0X2NhcC0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjApKQorCQkJCWJyZWFrOworCQkJaWYgKHRibC0+aXNfaHQ0MCAmJgorCQkJICAgICEoaHRfY2FwLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpCisJCQkJYnJlYWs7CisKKwkJCURfUkFURSgiTFE6IFNJU08gdG9nZ2xlIFNHSS9OR0lcbiIpOworCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisJCQlpZiAoaXNfZ3JlZW4pIHsKKwkJCQlpZiAoIXRibC0+aXNfU0dJKQorCQkJCQlicmVhazsKKwkJCQllbHNlCisJCQkJCUlMX0VSUigiU0dJIHdhcyBzZXQgaW4gR0YrU0lTT1xuIik7CisJCQl9CisJCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAhdGJsLT5pc19TR0k7CisJCQlpbDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHNlYXJjaF90YmwpOworCQkJaWYgKHRibC0+aXNfU0dJKSB7CisJCQkJczMyIHRwdCA9IGxxX3N0YS0+bGFzdF90cHQgLyAxMDA7CisJCQkJaWYgKHRwdCA+PSBzZWFyY2hfdGJsLT5leHBlY3RlZF90cHRbaWR4XSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUgPQorCQkJICAgIGlsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwoaWwsIHNlYXJjaF90YmwsIGlkeCwKKwkJCQkJCQkgaXNfZ3JlZW4pOworCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCQl0YmwtPmFjdGlvbisrOworCQlpZiAodGJsLT5hY3Rpb24gPiBJTF9TSVNPX1NXSVRDSF9HSSkKKwkJCXRibC0+YWN0aW9uID0gSUxfU0lTT19TV0lUQ0hfQU5URU5OQTE7CisKKwkJaWYgKHRibC0+YWN0aW9uID09IHN0YXJ0X2FjdGlvbikKKwkJCWJyZWFrOworCX0KKwlzZWFyY2hfdGJsLT5scV90eXBlID0gTFFfTk9ORTsKKwlyZXR1cm4gMDsKKworb3V0OgorCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAxOworCXRibC0+YWN0aW9uKys7CisJaWYgKHRibC0+YWN0aW9uID4gSUxfU0lTT19TV0lUQ0hfR0kpCisJCXRibC0+YWN0aW9uID0gSUxfU0lTT19TV0lUQ0hfQU5URU5OQTE7CisJaWYgKHVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIpCisJCXNlYXJjaF90YmwtPmFjdGlvbiA9IHRibC0+YWN0aW9uOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUcnkgdG8gc3dpdGNoIHRvIG5ldyBtb2R1bGF0aW9uIG1vZGUgZnJvbSBNSU1PMgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfcnNfbW92ZV9taW1vMl90b19vdGhlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCBpZHgpCit7CisJczggaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICpzZWFyY2hfdGJsID0KKwkgICAgJihscV9zdGEtPmxxX2luZm9bKDEgLSBscV9zdGEtPmFjdGl2ZV90YmwpXSk7CisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAqd2luID0gJih0YmwtPndpbltpZHhdKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKKwl1MzIgc3ogPQorCSAgICAoc2l6ZW9mKHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbykgLQorCSAgICAgKHNpemVvZihzdHJ1Y3QgaWxfcmF0ZV9zY2FsZV9kYXRhKSAqIFJBVEVfQ09VTlQpKTsKKwl1OCBzdGFydF9hY3Rpb247CisJdTggdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJdTggdHhfY2hhaW5zX251bSA9IGlsLT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKKwl1OCB1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMDsKKwlpbnQgcmV0OworCisJc3RhcnRfYWN0aW9uID0gdGJsLT5hY3Rpb247CisJZm9yICg7OykgeworCQlscV9zdGEtPmFjdGlvbl9jb3VudGVyKys7CisJCXN3aXRjaCAodGJsLT5hY3Rpb24pIHsKKwkJY2FzZSBJTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE6CisJCWNhc2UgSUxfTUlNTzJfU1dJVENIX0FOVEVOTkEyOgorCQkJRF9SQVRFKCJMUTogTUlNTzIgdG9nZ2xlIEFudGVubmFzXG4iKTsKKworCQkJaWYgKHR4X2NoYWluc19udW0gPD0gMikKKwkJCQlicmVhazsKKworCQkJaWYgKHdpbi0+c3VjY2Vzc19yYXRpbyA+PSBJTF9SU19HT09EX1JBVElPKQorCQkJCWJyZWFrOworCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisJCQlpZiAoaWw0OTY1X3JzX3RvZ2dsZV9hbnRlbm5hCisJCQkgICAgKHZhbGlkX3R4X2FudCwgJnNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSwKKwkJCSAgICAgc2VhcmNoX3RibCkpIHsKKwkJCQl1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIElMX01JTU8yX1NXSVRDSF9TSVNPX0E6CisJCWNhc2UgSUxfTUlNTzJfU1dJVENIX1NJU09fQjoKKwkJY2FzZSBJTF9NSU1PMl9TV0lUQ0hfU0lTT19DOgorCQkJRF9SQVRFKCJMUTogTUlNTzIgc3dpdGNoIHRvIFNJU09cbiIpOworCisJCQkvKiBTZXQgdXAgbmV3IHNlYXJjaCB0YWJsZSBmb3IgU0lTTyAqLworCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOworCisJCQlpZiAodGJsLT5hY3Rpb24gPT0gSUxfTUlNTzJfU1dJVENIX1NJU09fQSkKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BOworCQkJZWxzZSBpZiAodGJsLT5hY3Rpb24gPT0gSUxfTUlNTzJfU1dJVENIX1NJU09fQikKKwkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9COworCQkJZWxzZQorCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0M7CisKKwkJCWlmICghaWw0OTY1X3JzX2lzX3ZhbGlkX2FudAorCQkJICAgICh2YWxpZF90eF9hbnQsIHNlYXJjaF90YmwtPmFudF90eXBlKSkKKwkJCQlicmVhazsKKworCQkJcmV0ID0KKwkJCSAgICBpbDQ5NjVfcnNfc3dpdGNoX3RvX3Npc28oaWwsIGxxX3N0YSwgY29uZiwgc3RhLAorCQkJCQkJICAgICBzZWFyY2hfdGJsLCBpZHgpOworCQkJaWYgKCFyZXQpCisJCQkJZ290byBvdXQ7CisKKwkJCWJyZWFrOworCisJCWNhc2UgSUxfTUlNTzJfU1dJVENIX0dJOgorCQkJaWYgKCF0YmwtPmlzX2h0NDAgJiYKKwkJCSAgICAhKGh0X2NhcC0+Y2FwICYgSUVFRTgwMjExX0hUX0NBUF9TR0lfMjApKQorCQkJCWJyZWFrOworCQkJaWYgKHRibC0+aXNfaHQ0MCAmJgorCQkJICAgICEoaHRfY2FwLT5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NHSV80MCkpCisJCQkJYnJlYWs7CisKKwkJCURfUkFURSgiTFE6IE1JTU8yIHRvZ2dsZSBTR0kvTkdJXG4iKTsKKworCQkJLyogU2V0IHVwIG5ldyBzZWFyY2ggdGFibGUgZm9yIE1JTU8yICovCisJCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7CisJCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAhdGJsLT5pc19TR0k7CisJCQlpbDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHNlYXJjaF90YmwpOworCQkJLyoKKwkJCSAqIElmIGFjdGl2ZSB0YWJsZSBhbHJlYWR5IHVzZXMgdGhlIGZhc3Rlc3QgcG9zc2libGUKKwkJCSAqIG1vZHVsYXRpb24gKGR1YWwgc3RyZWFtIHdpdGggc2hvcnQgZ3VhcmQgaW50ZXJ2YWwpLAorCQkJICogYW5kIGl0J3Mgd29ya2luZyB3ZWxsLCB0aGVyZSdzIG5vIG5lZWQgdG8gbG9vaworCQkJICogZm9yIGEgYmV0dGVyIHR5cGUgb2YgbW9kdWxhdGlvbiEKKwkJCSAqLworCQkJaWYgKHRibC0+aXNfU0dJKSB7CisJCQkJczMyIHRwdCA9IGxxX3N0YS0+bGFzdF90cHQgLyAxMDA7CisJCQkJaWYgKHRwdCA+PSBzZWFyY2hfdGJsLT5leHBlY3RlZF90cHRbaWR4XSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUgPQorCQkJICAgIGlsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwoaWwsIHNlYXJjaF90YmwsIGlkeCwKKwkJCQkJCQkgaXNfZ3JlZW4pOworCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7CisJCQlnb3RvIG91dDsKKworCQl9CisJCXRibC0+YWN0aW9uKys7CisJCWlmICh0YmwtPmFjdGlvbiA+IElMX01JTU8yX1NXSVRDSF9HSSkKKwkJCXRibC0+YWN0aW9uID0gSUxfTUlNTzJfU1dJVENIX0FOVEVOTkExOworCisJCWlmICh0YmwtPmFjdGlvbiA9PSBzdGFydF9hY3Rpb24pCisJCQlicmVhazsKKwl9CisJc2VhcmNoX3RibC0+bHFfdHlwZSA9IExRX05PTkU7CisJcmV0dXJuIDA7CitvdXQ6CisJbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7CisJdGJsLT5hY3Rpb24rKzsKKwlpZiAodGJsLT5hY3Rpb24gPiBJTF9NSU1PMl9TV0lUQ0hfR0kpCisJCXRibC0+YWN0aW9uID0gSUxfTUlNTzJfU1dJVENIX0FOVEVOTkExOworCWlmICh1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyKQorCQlzZWFyY2hfdGJsLT5hY3Rpb24gPSB0YmwtPmFjdGlvbjsKKworCXJldHVybiAwOworCit9CisKKy8qCisgKiBDaGVjayB3aGV0aGVyIHdlIHNob3VsZCBjb250aW51ZSB1c2luZyBzYW1lIG1vZHVsYXRpb24gbW9kZSwgb3IKKyAqIGJlZ2luIHNlYXJjaCBmb3IgYSBuZXcgbW9kZSwgYmFzZWQgb246CisgKiAxKSAjIHR4IHN1Y2Nlc3NlcyBvciBmYWlsdXJlcyB3aGlsZSB1c2luZyB0aGlzIG1vZGUKKyAqIDIpICMgdGltZXMgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgKiAzKSBlbGFwc2VkIHRpbWUgaW4gdGhpcyBtb2RlIChub3QgdXNlZCwgZm9yIG5vdykKKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19zdGF5X2luX3RhYmxlKHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwgYm9vbCBmb3JjZV9zZWFyY2gpCit7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0Ymw7CisJaW50IGk7CisJaW50IGFjdGl2ZV90Ymw7CisJaW50IGZsdXNoX2ludGVydmFsX3Bhc3NlZCA9IDA7CisJc3RydWN0IGlsX3ByaXYgKmlsOworCisJaWwgPSBscV9zdGEtPmRydjsKKwlhY3RpdmVfdGJsID0gbHFfc3RhLT5hY3RpdmVfdGJsOworCisJdGJsID0gJihscV9zdGEtPmxxX2luZm9bYWN0aXZlX3RibF0pOworCisJLyogSWYgd2UndmUgYmVlbiBkaXNhbGxvd2luZyBzZWFyY2gsIHNlZSBpZiB3ZSBzaG91bGQgbm93IGFsbG93IGl0ICovCisJaWYgKGxxX3N0YS0+c3RheV9pbl90YmwpIHsKKworCQkvKiBFbGFwc2VkIHRpbWUgdXNpbmcgY3VycmVudCBtb2R1bGF0aW9uIG1vZGUgKi8KKwkJaWYgKGxxX3N0YS0+Zmx1c2hfdGltZXIpCisJCQlmbHVzaF9pbnRlcnZhbF9wYXNzZWQgPQorCQkJICAgIHRpbWVfYWZ0ZXIoamlmZmllcywKKwkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpKGxxX3N0YS0+Zmx1c2hfdGltZXIgKworCQkJCQkJICAgICAgIFJBVEVfU0NBTEVfRkxVU0hfSU5UVkwpKTsKKworCQkvKgorCQkgKiBDaGVjayBpZiB3ZSBzaG91bGQgYWxsb3cgc2VhcmNoIGZvciBuZXcgbW9kdWxhdGlvbiBtb2RlLgorCQkgKiBJZiBtYW55IGZyYW1lcyBoYXZlIGZhaWxlZCBvciBzdWNjZWVkZWQsIG9yIHdlJ3ZlIHVzZWQKKwkJICogdGhpcyBzYW1lIG1vZHVsYXRpb24gZm9yIGEgbG9uZyB0aW1lLCBhbGxvdyBzZWFyY2gsIGFuZAorCQkgKiByZXNldCBoaXN0b3J5IHN0YXRzIHRoYXQga2VlcCB0cmFjayBvZiB3aGV0aGVyIHdlIHNob3VsZAorCQkgKiBhbGxvdyBhIG5ldyBzZWFyY2guICBBbHNvIChiZWxvdykgcmVzZXQgYWxsIGJpdG1hcHMgYW5kCisJCSAqIHN0YXRzIGluIGFjdGl2ZSBoaXN0b3J5LgorCQkgKi8KKwkJaWYgKGZvcmNlX3NlYXJjaCB8fAorCQkgICAgbHFfc3RhLT50b3RhbF9mYWlsZWQgPiBscV9zdGEtPm1heF9mYWlsdXJlX2xpbWl0IHx8CisJCSAgICBscV9zdGEtPnRvdGFsX3N1Y2Nlc3MgPiBscV9zdGEtPm1heF9zdWNjZXNzX2xpbWl0IHx8CisJCSAgICAoIWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgJiYgbHFfc3RhLT5mbHVzaF90aW1lciAmJgorCQkgICAgIGZsdXNoX2ludGVydmFsX3Bhc3NlZCkpIHsKKwkJCURfUkFURSgiTFE6IHN0YXkgaXMgZXhwaXJlZCAlZCAlZCAlZFxuOiIsCisJCQkgICAgICAgbHFfc3RhLT50b3RhbF9mYWlsZWQsIGxxX3N0YS0+dG90YWxfc3VjY2VzcywKKwkJCSAgICAgICBmbHVzaF9pbnRlcnZhbF9wYXNzZWQpOworCisJCQkvKiBBbGxvdyBzZWFyY2ggZm9yIG5ldyBtb2RlICovCisJCQlscV9zdGEtPnN0YXlfaW5fdGJsID0gMDsJLyogb25seSBwbGFjZSByZXNldCAqLworCQkJbHFfc3RhLT50b3RhbF9mYWlsZWQgPSAwOworCQkJbHFfc3RhLT50b3RhbF9zdWNjZXNzID0gMDsKKwkJCWxxX3N0YS0+Zmx1c2hfdGltZXIgPSAwOworCisJCQkvKgorCQkJICogRWxzZSBpZiB3ZSd2ZSB1c2VkIHRoaXMgbW9kdWxhdGlvbiBtb2RlIGVub3VnaCByZXBldGl0aW9ucworCQkJICogKHJlZ2FyZGxlc3Mgb2YgZWxhcHNlZCB0aW1lIG9yIHN1Y2Nlc3MvZmFpbHVyZSksIHJlc2V0CisJCQkgKiBoaXN0b3J5IGJpdG1hcHMgYW5kIHJhdGUtc3BlY2lmaWMgc3RhdHMgZm9yIGFsbCByYXRlcyBpbgorCQkJICogYWN0aXZlIHRhYmxlLgorCQkJICovCisJCX0gZWxzZSB7CisJCQlscV9zdGEtPnRhYmxlX2NvdW50Kys7CisJCQlpZiAobHFfc3RhLT50YWJsZV9jb3VudCA+PSBscV9zdGEtPnRhYmxlX2NvdW50X2xpbWl0KSB7CisJCQkJbHFfc3RhLT50YWJsZV9jb3VudCA9IDA7CisKKwkJCQlEX1JBVEUoIkxROiBzdGF5IGluIHRhYmxlIGNsZWFyIHdpblxuIik7CisJCQkJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlQ7IGkrKykKKwkJCQkJaWw0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luKCYKKwkJCQkJCQkJICAgICAgICh0YmwtPgorCQkJCQkJCQkJd2luCisJCQkJCQkJCQlbaV0pKTsKKwkJCX0KKwkJfQorCisJCS8qIElmIHRyYW5zaXRpb25pbmcgdG8gYWxsb3cgInNlYXJjaCIsIHJlc2V0IGFsbCBoaXN0b3J5CisJCSAqIGJpdG1hcHMgYW5kIHN0YXRzIGluIGFjdGl2ZSB0YWJsZSAodGhpcyB3aWxsIGJlY29tZSB0aGUgbmV3CisJCSAqICJzZWFyY2giIHRhYmxlKS4gKi8KKwkJaWYgKCFscV9zdGEtPnN0YXlfaW5fdGJsKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgUkFURV9DT1VOVDsgaSsrKQorCQkJCWlsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbigmKHRibC0+d2luW2ldKSk7CisJCX0KKwl9Cit9CisKKy8qCisgKiBzZXR1cCByYXRlIHRhYmxlIGluIHVDb2RlCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfdXBkYXRlX3JhdGVfdGJsKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICBzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEsCisJCQkgIHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgaWR4LCB1OCBpc19ncmVlbikKK3sKKwl1MzIgcmF0ZTsKKworCS8qIFVwZGF0ZSB1Q29kZSdzIHJhdGUgdGFibGUuICovCisJcmF0ZSA9IGlsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwoaWwsIHRibCwgaWR4LCBpc19ncmVlbik7CisJaWw0OTY1X3JzX2ZpbGxfbGlua19jbWQoaWwsIGxxX3N0YSwgcmF0ZSk7CisJaWxfc2VuZF9scV9jbWQoaWwsIGN0eCwgJmxxX3N0YS0+bHEsIENNRF9BU1lOQywgZmFsc2UpOworfQorCisvKgorICogRG8gcmF0ZSBzY2FsaW5nIGFuZCBzZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICAgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhKQoreworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gaWwtPmh3OworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKKwlpbnQgbG93ID0gUkFURV9JTlZBTElEOworCWludCBoaWdoID0gUkFURV9JTlZBTElEOworCWludCBpZHg7CisJaW50IGk7CisJc3RydWN0IGlsX3JhdGVfc2NhbGVfZGF0YSAqd2luID0gTlVMTDsKKwlpbnQgY3VycmVudF90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCWludCBsb3dfdHB0ID0gSUxfSU5WQUxJRF9WQUxVRTsKKwlpbnQgaGlnaF90cHQgPSBJTF9JTlZBTElEX1ZBTFVFOworCXUzMiBmYWlsX2NvdW50OworCXM4IHNjYWxlX2FjdGlvbiA9IDA7CisJdTE2IHJhdGVfbWFzazsKKwl1OCB1cGRhdGVfbHEgPSAwOworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsLCAqdGJsMTsKKwl1MTYgcmF0ZV9zY2FsZV9pZHhfbXNrID0gMDsKKwl1OCBpc19ncmVlbiA9IDA7CisJdTggYWN0aXZlX3RibCA9IDA7CisJdTggZG9uZV9zZWFyY2ggPSAwOworCXUxNiBoaWdoX2xvdzsKKwlzMzIgc3I7CisJdTggdGlkID0gTUFYX1RJRF9DT1VOVDsKKwlzdHJ1Y3QgaWxfdGlkX2RhdGEgKnRpZF9kYXRhOworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OworCisJRF9SQVRFKCJyYXRlIHNjYWxlIGNhbGN1bGF0ZSBuZXcgcmF0ZSBmb3Igc2tiXG4iKTsKKworCS8qIFNlbmQgbWFuYWdlbWVudCBmcmFtZXMgYW5kIE5PX0FDSyBkYXRhIHVzaW5nIGxvd2VzdCByYXRlLiAqLworCS8qIFRPRE86IHRoaXMgY291bGQgcHJvYmFibHkgYmUgaW1wcm92ZWQuLiAqLworCWlmICghaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSB8fAorCSAgICAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpCisJCXJldHVybjsKKworCWxxX3N0YS0+c3VwcF9yYXRlcyA9IHN0YS0+c3VwcF9yYXRlc1tscV9zdGEtPmJhbmRdOworCisJdGlkID0gaWw0OTY1X3JzX3RsX2FkZF9wYWNrZXQobHFfc3RhLCBoZHIpOworCWlmICh0aWQgIT0gTUFYX1RJRF9DT1VOVCAmJiAobHFfc3RhLT50eF9hZ2dfdGlkX2VuICYgKDEgPDwgdGlkKSkpIHsKKwkJdGlkX2RhdGEgPSAmaWwtPnN0YXRpb25zW2xxX3N0YS0+bHEuc3RhX2lkXS50aWRbdGlkXTsKKwkJaWYgKHRpZF9kYXRhLT5hZ2cuc3RhdGUgPT0gSUxfQUdHX09GRikKKwkJCWxxX3N0YS0+aXNfYWdnID0gMDsKKwkJZWxzZQorCQkJbHFfc3RhLT5pc19hZ2cgPSAxOworCX0gZWxzZQorCQlscV9zdGEtPmlzX2FnZyA9IDA7CisKKwkvKgorCSAqIFNlbGVjdCByYXRlLXNjYWxlIC8gbW9kdWxhdGlvbi1tb2RlIHRhYmxlIHRvIHdvcmsgd2l0aCBpbgorCSAqIHRoZSByZXN0IG9mIHRoaXMgZnVuY3Rpb246ICAic2VhcmNoIiBpZiBzZWFyY2hpbmcgZm9yIGJldHRlcgorCSAqIG1vZHVsYXRpb24gbW9kZSwgb3IgImFjdGl2ZSIgaWYgZG9pbmcgcmF0ZSBzY2FsaW5nIHdpdGhpbiBhIG1vZGUuCisJICovCisJaWYgKCFscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKQorCQlhY3RpdmVfdGJsID0gbHFfc3RhLT5hY3RpdmVfdGJsOworCWVsc2UKKwkJYWN0aXZlX3RibCA9IDEgLSBscV9zdGEtPmFjdGl2ZV90Ymw7CisKKwl0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1thY3RpdmVfdGJsXSk7CisJaWYgKGlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpKQorCQlscV9zdGEtPmlzX2dyZWVuID0gMDsKKwllbHNlCisJCWxxX3N0YS0+aXNfZ3JlZW4gPSBpbDQ5NjVfcnNfdXNlX2dyZWVuKHN0YSk7CisJaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOworCisJLyogY3VycmVudCB0eCByYXRlICovCisJaWR4ID0gbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHg7CisKKwlEX1JBVEUoIlJhdGUgc2NhbGUgaWR4ICVkIGZvciB0eXBlICVkXG4iLCBpZHgsIHRibC0+bHFfdHlwZSk7CisKKwkvKiByYXRlcyBhdmFpbGFibGUgZm9yIHRoaXMgYXNzb2NpYXRpb24sIGFuZCBmb3IgbW9kdWxhdGlvbiBtb2RlICovCisJcmF0ZV9tYXNrID0gaWw0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMobHFfc3RhLCBoZHIsIHRibC0+bHFfdHlwZSk7CisKKwlEX1JBVEUoIm1hc2sgMHglMDRYXG4iLCByYXRlX21hc2spOworCisJLyogbWFzayB3aXRoIHN0YXRpb24gcmF0ZSByZXN0cmljdGlvbiAqLworCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgeworCQlpZiAobHFfc3RhLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCisJCQkvKiBzdXBwX3JhdGVzIGhhcyBubyBDQ0sgYml0cyBpbiBBIG1vZGUgKi8KKwkJCXJhdGVfc2NhbGVfaWR4X21zayA9CisJCQkgICAgKHUxNikgKHJhdGVfbWFzayAmCisJCQkJICAgKGxxX3N0YS0+c3VwcF9yYXRlcyA8PCBJTF9GSVJTVF9PRkRNX1JBVEUpKTsKKwkJZWxzZQorCQkJcmF0ZV9zY2FsZV9pZHhfbXNrID0KKwkJCSAgICAodTE2KSAocmF0ZV9tYXNrICYgbHFfc3RhLT5zdXBwX3JhdGVzKTsKKworCX0gZWxzZQorCQlyYXRlX3NjYWxlX2lkeF9tc2sgPSByYXRlX21hc2s7CisKKwlpZiAoIXJhdGVfc2NhbGVfaWR4X21zaykKKwkJcmF0ZV9zY2FsZV9pZHhfbXNrID0gcmF0ZV9tYXNrOworCisJaWYgKCEoKDEgPDwgaWR4KSAmIHJhdGVfc2NhbGVfaWR4X21zaykpIHsKKwkJSUxfRVJSKCJDdXJyZW50IFJhdGUgaXMgbm90IHZhbGlkXG4iKTsKKwkJaWYgKGxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpIHsKKwkJCS8qIHJldmVydCB0byBhY3RpdmUgdGFibGUgaWYgc2VhcmNoIHRhYmxlIGlzIG5vdCB2YWxpZCAqLworCQkJdGJsLT5scV90eXBlID0gTFFfTk9ORTsKKwkJCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAwOworCQkJdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7CisJCQkvKiBnZXQgImFjdGl2ZSIgcmF0ZSBpbmZvICovCisJCQlpZHggPSBpbDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHRibC0+Y3VycmVudF9yYXRlKTsKKwkJCWlsNDk2NV9yc191cGRhdGVfcmF0ZV90YmwoaWwsIGN0eCwgbHFfc3RhLCB0YmwsIGlkeCwKKwkJCQkJCSAgICAgIGlzX2dyZWVuKTsKKwkJfQorCQlyZXR1cm47CisJfQorCisJLyogR2V0IGV4cGVjdGVkIHRocm91Z2hwdXQgdGFibGUgYW5kIGhpc3Rvcnkgd2luIGZvciBjdXJyZW50IHJhdGUgKi8KKwlpZiAoIXRibC0+ZXhwZWN0ZWRfdHB0KSB7CisJCUlMX0VSUigidGJsLT5leHBlY3RlZF90cHQgaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBmb3JjZSB1c2VyIG1heCByYXRlIGlmIHNldCBieSB1c2VyICovCisJaWYgKGxxX3N0YS0+bWF4X3JhdGVfaWR4ICE9IC0xICYmIGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgaWR4KSB7CisJCWlkeCA9IGxxX3N0YS0+bWF4X3JhdGVfaWR4OworCQl1cGRhdGVfbHEgPSAxOworCQl3aW4gPSAmKHRibC0+d2luW2lkeF0pOworCQlnb3RvIGxxX3VwZGF0ZTsKKwl9CisKKwl3aW4gPSAmKHRibC0+d2luW2lkeF0pOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGhpc3RvcnkgdG8gY2FsY3VsYXRlIGFjdHVhbCBhdmVyYWdlCisJICogdGhyb3VnaHB1dCwga2VlcCBhbmFseXppbmcgcmVzdWx0cyBvZiBtb3JlIHR4IGZyYW1lcywgd2l0aG91dAorCSAqIGNoYW5naW5nIHJhdGUgb3IgbW9kZSAoYnlwYXNzIG1vc3Qgb2YgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbikuCisJICogU2V0IHVwIG5ldyByYXRlIHRhYmxlIGluIHVDb2RlIG9ubHkgaWYgb2xkIHJhdGUgaXMgbm90IHN1cHBvcnRlZAorCSAqIGluIGN1cnJlbnQgYXNzb2NpYXRpb24gKHVzZSBuZXcgcmF0ZSBmb3VuZCBhYm92ZSkuCisJICovCisJZmFpbF9jb3VudCA9IHdpbi0+Y291bnRlciAtIHdpbi0+c3VjY2Vzc19jb3VudGVyOworCWlmIChmYWlsX2NvdW50IDwgUkFURV9NSU5fRkFJTFVSRV9USCAmJgorCSAgICB3aW4tPnN1Y2Nlc3NfY291bnRlciA8IFJBVEVfTUlOX1NVQ0NFU1NfVEgpIHsKKwkJRF9SQVRFKCJMUTogc3RpbGwgYmVsb3cgVEguIHN1Y2M9JWQgdG90YWw9JWQgIiAiZm9yIGlkeCAlZFxuIiwKKwkJICAgICAgIHdpbi0+c3VjY2Vzc19jb3VudGVyLCB3aW4tPmNvdW50ZXIsIGlkeCk7CisKKwkJLyogQ2FuJ3QgY2FsY3VsYXRlIHRoaXMgeWV0OyBub3QgZW5vdWdoIGhpc3RvcnkgKi8KKwkJd2luLT5hdmVyYWdlX3RwdCA9IElMX0lOVkFMSURfVkFMVUU7CisKKwkJLyogU2hvdWxkIHdlIHN0YXkgd2l0aCB0aGlzIG1vZHVsYXRpb24gbW9kZSwKKwkJICogb3Igc2VhcmNoIGZvciBhIG5ldyBvbmU/ICovCisJCWlsNDk2NV9yc19zdGF5X2luX3RhYmxlKGxxX3N0YSwgZmFsc2UpOworCisJCWdvdG8gb3V0OworCX0KKwkvKiBFbHNlIHdlIGhhdmUgZW5vdWdoIHNhbXBsZXM7IGNhbGN1bGF0ZSBlc3RpbWF0ZSBvZgorCSAqIGFjdHVhbCBhdmVyYWdlIHRocm91Z2hwdXQgKi8KKwlpZiAod2luLT5hdmVyYWdlX3RwdCAhPQorCSAgICAoKHdpbi0+c3VjY2Vzc19yYXRpbyAqIHRibC0+ZXhwZWN0ZWRfdHB0W2lkeF0gKyA2NCkgLyAxMjgpKSB7CisJCUlMX0VSUigiZXhwZWN0ZWRfdHB0IHNob3VsZCBoYXZlIGJlZW4gY2FsY3VsYXRlZCBieSBub3dcbiIpOworCQl3aW4tPmF2ZXJhZ2VfdHB0ID0KKwkJICAgICgod2luLT5zdWNjZXNzX3JhdGlvICogdGJsLT5leHBlY3RlZF90cHRbaWR4XSArIDY0KSAvIDEyOCk7CisJfQorCisJLyogSWYgd2UgYXJlIHNlYXJjaGluZyBmb3IgYmV0dGVyIG1vZHVsYXRpb24gbW9kZSwgY2hlY2sgc3VjY2Vzcy4gKi8KKwlpZiAobHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCkgeworCQkvKiBJZiBnb29kIHN1Y2Nlc3MsIGNvbnRpbnVlIHVzaW5nIHRoZSAic2VhcmNoIiBtb2RlOworCQkgKiBubyBuZWVkIHRvIHNlbmQgbmV3IGxpbmsgcXVhbGl0eSBjb21tYW5kLCBzaW5jZSB3ZSdyZQorCQkgKiBjb250aW51aW5nIHRvIHVzZSB0aGUgc2V0dXAgdGhhdCB3ZSd2ZSBiZWVuIHRyeWluZy4gKi8KKwkJaWYgKHdpbi0+YXZlcmFnZV90cHQgPiBscV9zdGEtPmxhc3RfdHB0KSB7CisKKwkJCURfUkFURSgiTFE6IFNXSVRDSElORyBUTyBORVcgVEJMICIKKwkJCSAgICAgICAic3VjPSVkIGN1ci10cHQ9JWQgb2xkLXRwdD0lZFxuIiwKKwkJCSAgICAgICB3aW4tPnN1Y2Nlc3NfcmF0aW8sIHdpbi0+YXZlcmFnZV90cHQsCisJCQkgICAgICAgbHFfc3RhLT5sYXN0X3RwdCk7CisKKwkJCWlmICghaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpCisJCQkJbHFfc3RhLT5lbmFibGVfY291bnRlciA9IDE7CisKKwkJCS8qIFN3YXAgdGFibGVzOyAic2VhcmNoIiBiZWNvbWVzICJhY3RpdmUiICovCisJCQlscV9zdGEtPmFjdGl2ZV90YmwgPSBhY3RpdmVfdGJsOworCQkJY3VycmVudF90cHQgPSB3aW4tPmF2ZXJhZ2VfdHB0OworCisJCQkvKiBFbHNlIHBvb3Igc3VjY2VzczsgZ28gYmFjayB0byBtb2RlIGluICJhY3RpdmUiIHRhYmxlICovCisJCX0gZWxzZSB7CisKKwkJCURfUkFURSgiTFE6IEdPSU5HIEJBQ0sgVE8gVEhFIE9MRCBUQkwgIgorCQkJICAgICAgICJzdWM9JWQgY3VyLXRwdD0lZCBvbGQtdHB0PSVkXG4iLAorCQkJICAgICAgIHdpbi0+c3VjY2Vzc19yYXRpbywgd2luLT5hdmVyYWdlX3RwdCwKKwkJCSAgICAgICBscV9zdGEtPmxhc3RfdHB0KTsKKworCQkJLyogTnVsbGlmeSAic2VhcmNoIiB0YWJsZSAqLworCQkJdGJsLT5scV90eXBlID0gTFFfTk9ORTsKKworCQkJLyogUmV2ZXJ0IHRvICJhY3RpdmUiIHRhYmxlICovCisJCQlhY3RpdmVfdGJsID0gbHFfc3RhLT5hY3RpdmVfdGJsOworCQkJdGJsID0gJihscV9zdGEtPmxxX2luZm9bYWN0aXZlX3RibF0pOworCisJCQkvKiBSZXZlcnQgdG8gImFjdGl2ZSIgcmF0ZSBhbmQgdGhyb3VnaHB1dCBpbmZvICovCisJCQlpZHggPSBpbDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHRibC0+Y3VycmVudF9yYXRlKTsKKwkJCWN1cnJlbnRfdHB0ID0gbHFfc3RhLT5sYXN0X3RwdDsKKworCQkJLyogTmVlZCB0byBzZXQgdXAgYSBuZXcgcmF0ZSB0YWJsZSBpbiB1Q29kZSAqLworCQkJdXBkYXRlX2xxID0gMTsKKwkJfQorCisJCS8qIEVpdGhlciB3YXksIHdlJ3ZlIG1hZGUgYSBkZWNpc2lvbjsgbW9kdWxhdGlvbiBtb2RlCisJCSAqIHNlYXJjaCBpcyBkb25lLCBhbGxvdyByYXRlIGFkanVzdG1lbnQgbmV4dCB0aW1lLiAqLworCQlscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsID0gMDsKKwkJZG9uZV9zZWFyY2ggPSAxOwkvKiBEb24ndCBzd2l0Y2ggbW9kZXMgYmVsb3chICovCisJCWdvdG8gbHFfdXBkYXRlOworCX0KKworCS8qIChFbHNlKSBub3QgaW4gc2VhcmNoIG9mIGJldHRlciBtb2R1bGF0aW9uIG1vZGUsIHRyeSBmb3IgYmV0dGVyCisJICogc3RhcnRpbmcgcmF0ZSwgd2hpbGUgc3RheWluZyBpbiB0aGlzIG1vZGUuICovCisJaGlnaF9sb3cgPQorCSAgICBpbDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUoaWwsIGlkeCwgcmF0ZV9zY2FsZV9pZHhfbXNrLAorCQkJCQl0YmwtPmxxX3R5cGUpOworCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKKwloaWdoID0gKGhpZ2hfbG93ID4+IDgpICYgMHhmZjsKKworCS8qIElmIHVzZXIgc2V0IG1heCByYXRlLCBkb250IGFsbG93IGhpZ2hlciB0aGFuIHVzZXIgY29uc3RyYWluICovCisJaWYgKGxxX3N0YS0+bWF4X3JhdGVfaWR4ICE9IC0xICYmIGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgaGlnaCkKKwkJaGlnaCA9IFJBVEVfSU5WQUxJRDsKKworCXNyID0gd2luLT5zdWNjZXNzX3JhdGlvOworCisJLyogQ29sbGVjdCBtZWFzdXJlZCB0aHJvdWdocHV0cyBmb3IgY3VycmVudCBhbmQgYWRqYWNlbnQgcmF0ZXMgKi8KKwljdXJyZW50X3RwdCA9IHdpbi0+YXZlcmFnZV90cHQ7CisJaWYgKGxvdyAhPSBSQVRFX0lOVkFMSUQpCisJCWxvd190cHQgPSB0YmwtPndpbltsb3ddLmF2ZXJhZ2VfdHB0OworCWlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCkKKwkJaGlnaF90cHQgPSB0YmwtPndpbltoaWdoXS5hdmVyYWdlX3RwdDsKKworCXNjYWxlX2FjdGlvbiA9IDA7CisKKwkvKiBUb28gbWFueSBmYWlsdXJlcywgZGVjcmVhc2UgcmF0ZSAqLworCWlmIChzciA8PSBSQVRFX0RFQ1JFQVNFX1RIIHx8IGN1cnJlbnRfdHB0ID09IDApIHsKKwkJRF9SQVRFKCJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHN1Y2Nlc3NfcmF0aW9cbiIpOworCQlzY2FsZV9hY3Rpb24gPSAtMTsKKworCQkvKiBObyB0aHJvdWdocHV0IG1lYXN1cmVkIHlldCBmb3IgYWRqYWNlbnQgcmF0ZXM7IHRyeSBpbmNyZWFzZS4gKi8KKwl9IGVsc2UgaWYgKGxvd190cHQgPT0gSUxfSU5WQUxJRF9WQUxVRSAmJiBoaWdoX3RwdCA9PSBJTF9JTlZBTElEX1ZBTFVFKSB7CisKKwkJaWYgKGhpZ2ggIT0gUkFURV9JTlZBTElEICYmIHNyID49IFJBVEVfSU5DUkVBU0VfVEgpCisJCQlzY2FsZV9hY3Rpb24gPSAxOworCQllbHNlIGlmIChsb3cgIT0gUkFURV9JTlZBTElEKQorCQkJc2NhbGVfYWN0aW9uID0gMDsKKwl9CisKKwkvKiBCb3RoIGFkamFjZW50IHRocm91Z2hwdXRzIGFyZSBtZWFzdXJlZCwgYnV0IG5laXRoZXIgb25lIGhhcyBiZXR0ZXIKKwkgKiB0aHJvdWdocHV0OyB3ZSdyZSB1c2luZyB0aGUgYmVzdCByYXRlLCBkb24ndCBjaGFuZ2UgaXQhICovCisJZWxzZSBpZiAobG93X3RwdCAhPSBJTF9JTlZBTElEX1ZBTFVFICYmIGhpZ2hfdHB0ICE9IElMX0lOVkFMSURfVkFMVUUgJiYKKwkJIGxvd190cHQgPCBjdXJyZW50X3RwdCAmJiBoaWdoX3RwdCA8IGN1cnJlbnRfdHB0KQorCQlzY2FsZV9hY3Rpb24gPSAwOworCisJLyogQXQgbGVhc3Qgb25lIGFkamFjZW50IHJhdGUncyB0aHJvdWdocHV0IGlzIG1lYXN1cmVkLAorCSAqIGFuZCBtYXkgaGF2ZSBiZXR0ZXIgcGVyZm9ybWFuY2UuICovCisJZWxzZSB7CisJCS8qIEhpZ2hlciBhZGphY2VudCByYXRlJ3MgdGhyb3VnaHB1dCBpcyBtZWFzdXJlZCAqLworCQlpZiAoaGlnaF90cHQgIT0gSUxfSU5WQUxJRF9WQUxVRSkgeworCQkJLyogSGlnaGVyIHJhdGUgaGFzIGJldHRlciB0aHJvdWdocHV0ICovCisJCQlpZiAoaGlnaF90cHQgPiBjdXJyZW50X3RwdCAmJiBzciA+PSBSQVRFX0lOQ1JFQVNFX1RIKQorCQkJCXNjYWxlX2FjdGlvbiA9IDE7CisJCQllbHNlCisJCQkJc2NhbGVfYWN0aW9uID0gMDsKKworCQkJLyogTG93ZXIgYWRqYWNlbnQgcmF0ZSdzIHRocm91Z2hwdXQgaXMgbWVhc3VyZWQgKi8KKwkJfSBlbHNlIGlmIChsb3dfdHB0ICE9IElMX0lOVkFMSURfVkFMVUUpIHsKKwkJCS8qIExvd2VyIHJhdGUgaGFzIGJldHRlciB0aHJvdWdocHV0ICovCisJCQlpZiAobG93X3RwdCA+IGN1cnJlbnRfdHB0KSB7CisJCQkJRF9SQVRFKCJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHRwdFxuIik7CisJCQkJc2NhbGVfYWN0aW9uID0gLTE7CisJCQl9IGVsc2UgaWYgKHNyID49IFJBVEVfSU5DUkVBU0VfVEgpIHsKKwkJCQlzY2FsZV9hY3Rpb24gPSAxOworCQkJfQorCQl9CisJfQorCisJLyogU2FuaXR5IGNoZWNrOyBhc2tlZCBmb3IgZGVjcmVhc2UsIGJ1dCBzdWNjZXNzIHJhdGUgb3IgdGhyb3VnaHB1dAorCSAqIGhhcyBiZWVuIGdvb2QgYXQgb2xkIHJhdGUuICBEb24ndCBjaGFuZ2UgaXQuICovCisJaWYgKHNjYWxlX2FjdGlvbiA9PSAtMSAmJiBsb3cgIT0gUkFURV9JTlZBTElEICYmCisJICAgIChzciA+IFJBVEVfSElHSF9USCB8fCBjdXJyZW50X3RwdCA+IDEwMCAqIHRibC0+ZXhwZWN0ZWRfdHB0W2xvd10pKQorCQlzY2FsZV9hY3Rpb24gPSAwOworCisJc3dpdGNoIChzY2FsZV9hY3Rpb24pIHsKKwljYXNlIC0xOgorCQkvKiBEZWNyZWFzZSBzdGFydGluZyByYXRlLCB1cGRhdGUgdUNvZGUncyByYXRlIHRhYmxlICovCisJCWlmIChsb3cgIT0gUkFURV9JTlZBTElEKSB7CisJCQl1cGRhdGVfbHEgPSAxOworCQkJaWR4ID0gbG93OworCQl9CisKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBJbmNyZWFzZSBzdGFydGluZyByYXRlLCB1cGRhdGUgdUNvZGUncyByYXRlIHRhYmxlICovCisJCWlmIChoaWdoICE9IFJBVEVfSU5WQUxJRCkgeworCQkJdXBkYXRlX2xxID0gMTsKKwkJCWlkeCA9IGhpZ2g7CisJCX0KKworCQlicmVhazsKKwljYXNlIDA6CisJCS8qIE5vIGNoYW5nZSAqLworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCURfUkFURSgiY2hvb3NlIHJhdGUgc2NhbGUgaWR4ICVkIGFjdGlvbiAlZCBsb3cgJWQgIiAiaGlnaCAlZCB0eXBlICVkXG4iLAorCSAgICAgICBpZHgsIHNjYWxlX2FjdGlvbiwgbG93LCBoaWdoLCB0YmwtPmxxX3R5cGUpOworCitscV91cGRhdGU6CisJLyogUmVwbGFjZSB1Q29kZSdzIHJhdGUgdGFibGUgZm9yIHRoZSBkZXN0aW5hdGlvbiBzdGF0aW9uLiAqLworCWlmICh1cGRhdGVfbHEpCisJCWlsNDk2NV9yc191cGRhdGVfcmF0ZV90YmwoaWwsIGN0eCwgbHFfc3RhLCB0YmwsIGlkeCwKKwkJCQkJICAgICAgaXNfZ3JlZW4pOworCisJLyogU2hvdWxkIHdlIHN0YXkgd2l0aCB0aGlzIG1vZHVsYXRpb24gbW9kZSwKKwkgKiBvciBzZWFyY2ggZm9yIGEgbmV3IG9uZT8gKi8KKwlpbDQ5NjVfcnNfc3RheV9pbl90YWJsZShscV9zdGEsIGZhbHNlKTsKKworCS8qCisJICogU2VhcmNoIGZvciBuZXcgbW9kdWxhdGlvbiBtb2RlIGlmIHdlJ3JlOgorCSAqIDEpICBOb3QgY2hhbmdpbmcgcmF0ZXMgcmlnaHQgbm93CisJICogMikgIE5vdCBqdXN0IGZpbmlzaGluZyB1cCBhIHNlYXJjaAorCSAqIDMpICBBbGxvd2luZyBhIG5ldyBzZWFyY2gKKwkgKi8KKwlpZiAoIXVwZGF0ZV9scSAmJiAhZG9uZV9zZWFyY2ggJiYgIWxxX3N0YS0+c3RheV9pbl90YmwgJiYgd2luLT5jb3VudGVyKSB7CisJCS8qIFNhdmUgY3VycmVudCB0aHJvdWdocHV0IHRvIGNvbXBhcmUgd2l0aCAic2VhcmNoIiB0aHJvdWdocHV0ICovCisJCWxxX3N0YS0+bGFzdF90cHQgPSBjdXJyZW50X3RwdDsKKworCQkvKiBTZWxlY3QgYSBuZXcgInNlYXJjaCIgbW9kdWxhdGlvbiBtb2RlIHRvIHRyeS4KKwkJICogSWYgb25lIGlzIGZvdW5kLCBzZXQgdXAgdGhlIG5ldyAic2VhcmNoIiB0YWJsZS4gKi8KKwkJaWYgKGlzX2xlZ2FjeSh0YmwtPmxxX3R5cGUpKQorCQkJaWw0OTY1X3JzX21vdmVfbGVnYWN5X290aGVyKGlsLCBscV9zdGEsIGNvbmYsIHN0YSwgaWR4KTsKKwkJZWxzZSBpZiAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpKQorCQkJaWw0OTY1X3JzX21vdmVfc2lzb190b19vdGhlcihpbCwgbHFfc3RhLCBjb25mLCBzdGEsCisJCQkJCQkgICAgIGlkeCk7CisJCWVsc2UJCS8qIChpc19taW1vMih0YmwtPmxxX3R5cGUpKSAqLworCQkJaWw0OTY1X3JzX21vdmVfbWltbzJfdG9fb3RoZXIoaWwsIGxxX3N0YSwgY29uZiwgc3RhLAorCQkJCQkJICAgICAgaWR4KTsKKworCQkvKiBJZiBuZXcgInNlYXJjaCIgbW9kZSB3YXMgc2VsZWN0ZWQsIHNldCB1cCBpbiB1Q29kZSB0YWJsZSAqLworCQlpZiAobHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCkgeworCQkJLyogQWNjZXNzIHRoZSAic2VhcmNoIiB0YWJsZSwgY2xlYXIgaXRzIGhpc3RvcnkuICovCisJCQl0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1soMSAtIGxxX3N0YS0+YWN0aXZlX3RibCldKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UOyBpKyspCisJCQkJaWw0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luKCYodGJsLT53aW5baV0pKTsKKworCQkJLyogVXNlIG5ldyAic2VhcmNoIiBzdGFydCByYXRlICovCisJCQlpZHggPSBpbDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHRibC0+Y3VycmVudF9yYXRlKTsKKworCQkJRF9SQVRFKCJTd2l0Y2ggY3VycmVudCAgbWNzOiAlWCBpZHg6ICVkXG4iLAorCQkJICAgICAgIHRibC0+Y3VycmVudF9yYXRlLCBpZHgpOworCQkJaWw0OTY1X3JzX2ZpbGxfbGlua19jbWQoaWwsIGxxX3N0YSwgdGJsLT5jdXJyZW50X3JhdGUpOworCQkJaWxfc2VuZF9scV9jbWQoaWwsIGN0eCwgJmxxX3N0YS0+bHEsIENNRF9BU1lOQywgZmFsc2UpOworCQl9IGVsc2UKKwkJCWRvbmVfc2VhcmNoID0gMTsKKwl9CisKKwlpZiAoZG9uZV9zZWFyY2ggJiYgIWxxX3N0YS0+c3RheV9pbl90YmwpIHsKKwkJLyogSWYgdGhlICJhY3RpdmUiIChub24tc2VhcmNoKSBtb2RlIHdhcyBsZWdhY3ksCisJCSAqIGFuZCB3ZSd2ZSB0cmllZCBzd2l0Y2hpbmcgYW50ZW5uYXMsCisJCSAqIGJ1dCB3ZSBoYXZlbid0IGJlZW4gYWJsZSB0byB0cnkgSFQgbW9kZXMgKG5vdCBhdmFpbGFibGUpLAorCQkgKiBzdGF5IHdpdGggYmVzdCBhbnRlbm5hIGxlZ2FjeSBtb2R1bGF0aW9uIGZvciBhIHdoaWxlCisJCSAqIGJlZm9yZSBuZXh0IHJvdW5kIG9mIG1vZGUgY29tcGFyaXNvbnMuICovCisJCXRibDEgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKKwkJaWYgKGlzX2xlZ2FjeSh0YmwxLT5scV90eXBlKSAmJiAhY29uZl9pc19odChjb25mKSAmJgorCQkgICAgbHFfc3RhLT5hY3Rpb25fY291bnRlciA+IHRibDEtPm1heF9zZWFyY2gpIHsKKwkJCURfUkFURSgiTFE6IFNUQVkgaW4gbGVnYWN5IHRhYmxlXG4iKTsKKwkJCWlsNDk2NV9yc19zZXRfc3RheV9pbl90YWJsZShpbCwgMSwgbHFfc3RhKTsKKwkJfQorCisJCS8qIElmIHdlJ3JlIGluIGFuIEhUIG1vZGUsIGFuZCBhbGwgMyBtb2RlIHN3aXRjaCBhY3Rpb25zCisJCSAqIGhhdmUgYmVlbiB0cmllZCBhbmQgY29tcGFyZWQsIHN0YXkgaW4gdGhpcyBiZXN0IG1vZHVsYXRpb24KKwkJICogbW9kZSBmb3IgYSB3aGlsZSBiZWZvcmUgbmV4dCByb3VuZCBvZiBtb2RlIGNvbXBhcmlzb25zLiAqLworCQlpZiAobHFfc3RhLT5lbmFibGVfY291bnRlciAmJgorCQkgICAgbHFfc3RhLT5hY3Rpb25fY291bnRlciA+PSB0YmwxLT5tYXhfc2VhcmNoKSB7CisJCQlpZiAobHFfc3RhLT5sYXN0X3RwdCA+IElMX0FHR19UUFRfVEhSRUhPTEQgJiYKKwkJCSAgICAobHFfc3RhLT50eF9hZ2dfdGlkX2VuICYgKDEgPDwgdGlkKSkgJiYKKwkJCSAgICB0aWQgIT0gTUFYX1RJRF9DT1VOVCkgeworCQkJCXRpZF9kYXRhID0KKwkJCQkgICAgJmlsLT5zdGF0aW9uc1tscV9zdGEtPmxxLnN0YV9pZF0udGlkW3RpZF07CisJCQkJaWYgKHRpZF9kYXRhLT5hZ2cuc3RhdGUgPT0gSUxfQUdHX09GRikgeworCQkJCQlEX1JBVEUoInRyeSB0byBhZ2dyZWdhdGUgdGlkICVkXG4iLAorCQkJCQkgICAgICAgdGlkKTsKKwkJCQkJaWw0OTY1X3JzX3RsX3R1cm5fb25fYWdnKGlsLCB0aWQsCisJCQkJCQkJCSBscV9zdGEsIHN0YSk7CisJCQkJfQorCQkJfQorCQkJaWw0OTY1X3JzX3NldF9zdGF5X2luX3RhYmxlKGlsLCAwLCBscV9zdGEpOworCQl9CisJfQorCitvdXQ6CisJdGJsLT5jdXJyZW50X3JhdGUgPQorCSAgICBpbDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGlsLCB0YmwsIGlkeCwgaXNfZ3JlZW4pOworCWkgPSBpZHg7CisJbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpOworfQorCisvKioKKyAqIGlsNDk2NV9yc19pbml0aWFsaXplX2xxIC0gSW5pdGlhbGl6ZSBhIHN0YXRpb24ncyBoYXJkd2FyZSByYXRlIHRhYmxlCisgKgorICogVGhlIHVDb2RlJ3Mgc3RhdGlvbiB0YWJsZSBjb250YWlucyBhIHRhYmxlIG9mIGZhbGxiYWNrIHJhdGVzCisgKiBmb3IgYXV0b21hdGljIGZhbGxiYWNrIGR1cmluZyB0cmFuc21pc3Npb24uCisgKgorICogTk9URTogVGhpcyBzZXRzIHVwIGEgZGVmYXVsdCBzZXQgb2YgdmFsdWVzLiAgVGhlc2Ugd2lsbCBiZSByZXBsYWNlZCBsYXRlcgorICogICAgICAgaWYgdGhlIGRyaXZlcidzIGl3bC00OTY1LXJzIHJhdGUgc2NhbGluZyBhbGdvcml0aG0gaXMgdXNlZCwgaW5zdGVhZCBvZgorICogICAgICAgcmM4MDIxMV9zaW1wbGUuCisgKgorICogTk9URTogUnVuIENfQUREX1NUQSBjb21tYW5kIHRvIHNldCB1cCBzdGF0aW9uIHRhYmxlIGVudHJ5LCBiZWZvcmUKKyAqICAgICAgIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAod2hpY2ggcnVucyBDX1RYX0xJTktfUVVBTElUWV9DTUQsCisgKiAgICAgICB3aGljaCByZXF1aXJlcyBzdGF0aW9uIHRhYmxlIGVudHJ5IHRvIGV4aXN0KS4KKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19pbml0aWFsaXplX2xxKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhKQoreworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAqdGJsOworCWludCByYXRlX2lkeDsKKwlpbnQgaTsKKwl1MzIgcmF0ZTsKKwl1OCB1c2VfZ3JlZW4gPSBpbDQ5NjVfcnNfdXNlX2dyZWVuKHN0YSk7CisJdTggYWN0aXZlX3RibCA9IDA7CisJdTggdmFsaWRfdHhfYW50OworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eDsKKworCWlmICghc3RhIHx8ICFscV9zdGEpCisJCXJldHVybjsKKworCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCWN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OworCisJaSA9IGxxX3N0YS0+bGFzdF90eHJhdGVfaWR4OworCisJdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisKKwlpZiAoIWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpCisJCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7CisJZWxzZQorCQlhY3RpdmVfdGJsID0gMSAtIGxxX3N0YS0+YWN0aXZlX3RibDsKKworCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKKworCWlmIChpIDwgMCB8fCBpID49IFJBVEVfQ09VTlQpCisJCWkgPSAwOworCisJcmF0ZSA9IGlsX3JhdGVzW2ldLnBsY3A7CisJdGJsLT5hbnRfdHlwZSA9IGlsNDk2NV9maXJzdF9hbnRlbm5hKHZhbGlkX3R4X2FudCk7CisJcmF0ZSB8PSB0YmwtPmFudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1M7CisKKwlpZiAoaSA+PSBJTF9GSVJTVF9DQ0tfUkFURSAmJiBpIDw9IElMX0xBU1RfQ0NLX1JBVEUpCisJCXJhdGUgfD0gUkFURV9NQ1NfQ0NLX01TSzsKKworCWlsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3MocmF0ZSwgaWwtPmJhbmQsIHRibCwgJnJhdGVfaWR4KTsKKwlpZiAoIWlsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LCB0YmwtPmFudF90eXBlKSkKKwkJaWw0OTY1X3JzX3RvZ2dsZV9hbnRlbm5hKHZhbGlkX3R4X2FudCwgJnJhdGUsIHRibCk7CisKKwlyYXRlID0gaWw0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChpbCwgdGJsLCByYXRlX2lkeCwgdXNlX2dyZWVuKTsKKwl0YmwtPmN1cnJlbnRfcmF0ZSA9IHJhdGU7CisJaWw0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUobHFfc3RhLCB0YmwpOworCWlsNDk2NV9yc19maWxsX2xpbmtfY21kKE5VTEwsIGxxX3N0YSwgcmF0ZSk7CisJaWwtPnN0YXRpb25zW2xxX3N0YS0+bHEuc3RhX2lkXS5scSA9ICZscV9zdGEtPmxxOworCWlsX3NlbmRfbHFfY21kKGlsLCBjdHgsICZscV9zdGEtPmxxLCBDTURfU1lOQywgdHJ1ZSk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfZ2V0X3JhdGUodm9pZCAqaWxfciwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqaWxfc3RhLAorCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGVfY29udHJvbCAqdHhyYykKK3sKKworCXN0cnVjdCBza19idWZmICpza2IgPSB0eHJjLT5za2I7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPSB0eHJjLT5zYmFuZDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgX19tYXliZV91bnVzZWQgPSAoc3RydWN0IGlsX3ByaXYgKilpbF9yOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEgPSBpbF9zdGE7CisJaW50IHJhdGVfaWR4OworCisJRF9SQVRFKCJyYXRlIHNjYWxlIGNhbGN1bGF0ZSBuZXcgcmF0ZSBmb3Igc2tiXG4iKTsKKworCS8qIEdldCBtYXggcmF0ZSBpZiB1c2VyIHNldCBtYXggcmF0ZSAqLworCWlmIChscV9zdGEpIHsKKwkJbHFfc3RhLT5tYXhfcmF0ZV9pZHggPSB0eHJjLT5tYXhfcmF0ZV9pZHg7CisJCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haICYmCisJCSAgICBscV9zdGEtPm1heF9yYXRlX2lkeCAhPSAtMSkKKwkJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ICs9IElMX0ZJUlNUX09GRE1fUkFURTsKKwkJaWYgKGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgMCB8fAorCQkgICAgbHFfc3RhLT5tYXhfcmF0ZV9pZHggPj0gUkFURV9DT1VOVCkKKwkJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ID0gLTE7CisJfQorCisJLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KKwlpZiAobHFfc3RhICYmICFscV9zdGEtPmRydikgeworCQlEX1JBVEUoIlJhdGUgc2NhbGluZyBub3QgaW5pdGlhbGl6ZWQgeWV0LlxuIik7CisJCWlsX3N0YSA9IE5VTEw7CisJfQorCisJLyogU2VuZCBtYW5hZ2VtZW50IGZyYW1lcyBhbmQgTk9fQUNLIGRhdGEgdXNpbmcgbG93ZXN0IHJhdGUuICovCisJaWYgKHJhdGVfY29udHJvbF9zZW5kX2xvdyhzdGEsIGlsX3N0YSwgdHhyYykpCisJCXJldHVybjsKKworCWlmICghbHFfc3RhKQorCQlyZXR1cm47CisKKwlyYXRlX2lkeCA9IGxxX3N0YS0+bGFzdF90eHJhdGVfaWR4OworCisJaWYgKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spIHsKKwkJcmF0ZV9pZHggLT0gSUxfRklSU1RfT0ZETV9SQVRFOworCQkvKiA2TSBhbmQgOU0gc2hhcmVkIHNhbWUgTUNTIGlkeCAqLworCQlyYXRlX2lkeCA9IChyYXRlX2lkeCA+IDApID8gKHJhdGVfaWR4IC0gMSkgOiAwOworCQlpZiAoaWw0OTY1X3JzX2V4dHJhY3RfcmF0ZShscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzKSA+PQorCQkgICAgUkFURV9NSU1PMl82TV9QTENQKQorCQkJcmF0ZV9pZHggPSByYXRlX2lkeCArIE1DU19JRFhfUEVSX1NUUkVBTTsKKwkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyA9IElFRUU4MDIxMV9UWF9SQ19NQ1M7CisJCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfU0dJX01TSykKKwkJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgfD0KKwkJCSAgICBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0k7CisJCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfRFVQX01TSykKKwkJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgfD0KKwkJCSAgICBJRUVFODAyMTFfVFhfUkNfRFVQX0RBVEE7CisJCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFQ0MF9NU0spCisJCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9CisJCQkgICAgSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKKwkJaWYgKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgJiBSQVRFX01DU19HRl9NU0spCisJCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9CisJCQkgICAgSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEOworCX0gZWxzZSB7CisJCS8qIENoZWNrIGZvciBpbnZhbGlkIHJhdGVzICovCisJCWlmIChyYXRlX2lkeCA8IDAgfHwgcmF0ZV9pZHggPj0gUkFURV9DT1VOVF9MRUdBQ1kgfHwKKwkJICAgIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haICYmCisJCSAgICAgcmF0ZV9pZHggPCBJTF9GSVJTVF9PRkRNX1JBVEUpKQorCQkJcmF0ZV9pZHggPSByYXRlX2xvd2VzdF9pbmRleChzYmFuZCwgc3RhKTsKKwkJLyogT24gdmFsaWQgNSBHSHogcmF0ZSwgYWRqdXN0IGlkeCAqLworCQllbHNlIGlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJcmF0ZV9pZHggLT0gSUxfRklSU1RfT0ZETV9SQVRFOworCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzID0gMDsKKwl9CisJaW5mby0+Y29udHJvbC5yYXRlc1swXS5pZHggPSByYXRlX2lkeDsKKworfQorCitzdGF0aWMgdm9pZCAqCitpbDQ5NjVfcnNfYWxsb2Nfc3RhKHZvaWQgKmlsX3JhdGUsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9CisJICAgIChzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWw7CisKKwlpbCA9IChzdHJ1Y3QgaWxfcHJpdiAqKWlsX3JhdGU7CisJRF9SQVRFKCJjcmVhdGUgc3RhdGlvbiByYXRlIHNjYWxlIHdpblxuIik7CisKKwlyZXR1cm4gJnN0YV9wcml2LT5scV9zdGE7Cit9CisKKy8qCisgKiBDYWxsZWQgYWZ0ZXIgYWRkaW5nIGEgbmV3IHN0YXRpb24gdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcKKyAqLwordm9pZAoraWw0OTY1X3JzX3JhdGVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHN0YV9pZCkKK3sKKwlpbnQgaSwgajsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IGlsLT5odzsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaWwtPmh3LT5jb25mOworCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwID0gJnN0YS0+aHRfY2FwOworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OworCXN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKworCXN0YV9wcml2ID0gKHN0cnVjdCBpbF9zdGF0aW9uX3ByaXYgKilzdGEtPmRydl9wcml2OworCWxxX3N0YSA9ICZzdGFfcHJpdi0+bHFfc3RhOworCXNiYW5kID0gaHctPndpcGh5LT5iYW5kc1tjb25mLT5jaGFubmVsLT5iYW5kXTsKKworCWxxX3N0YS0+bHEuc3RhX2lkID0gc3RhX2lkOworCisJZm9yIChqID0gMDsgaiA8IExRX1NJWkU7IGorKykKKwkJZm9yIChpID0gMDsgaSA8IFJBVEVfQ09VTlQ7IGkrKykKKwkJCWlsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbigmbHFfc3RhLT5scV9pbmZvW2pdLgorCQkJCQkJICAgICAgIHdpbltpXSk7CisKKwlscV9zdGEtPmZsdXNoX3RpbWVyID0gMDsKKwlscV9zdGEtPnN1cHBfcmF0ZXMgPSBzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdOworCWZvciAoaiA9IDA7IGogPCBMUV9TSVpFOyBqKyspCisJCWZvciAoaSA9IDA7IGkgPCBSQVRFX0NPVU5UOyBpKyspCisJCQlpbDQ5NjVfcnNfcmF0ZV9zY2FsZV9jbGVhcl93aW4oJmxxX3N0YS0+bHFfaW5mb1tqXS4KKwkJCQkJCSAgICAgICB3aW5baV0pOworCisJRF9SQVRFKCJMUToiICIqKiogcmF0ZSBzY2FsZSBzdGF0aW9uIGdsb2JhbCBpbml0IGZvciBzdGF0aW9uICVkICoqKlxuIiwKKwkgICAgICAgc3RhX2lkKTsKKwkvKiBUT0RPOiB3aGF0IGlzIGEgZ29vZCBzdGFydGluZyByYXRlIGZvciBTVEE/IEFib3V0IG1pZGRsZT8gTWF5YmUgbm90CisJICogdGhlIGxvd2VzdCBvciB0aGUgaGlnaGVzdCByYXRlLi4gQ291bGQgY29uc2lkZXIgdXNpbmcgUlNTSSBmcm9tCisJICogcHJldmlvdXMgcGFja2V0cz8gTmVlZCB0byBoYXZlIElFRUUgODAyLjFYIGF1dGggc3VjY2VlZCBpbW1lZGlhdGVseQorCSAqIGFmdGVyIGFzc29jLi4gKi8KKworCWxxX3N0YS0+aXNfZHVwID0gMDsKKwlscV9zdGEtPm1heF9yYXRlX2lkeCA9IC0xOworCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IElMX01JU1NFRF9SQVRFX01BWDsKKwlscV9zdGEtPmlzX2dyZWVuID0gaWw0OTY1X3JzX3VzZV9ncmVlbihzdGEpOworCWxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlID0gaWwtPmFjdGl2ZV9yYXRlICYgfigweDEwMDApOworCWxxX3N0YS0+YmFuZCA9IGlsLT5iYW5kOworCS8qCisJICogYWN0aXZlX3Npc29fcmF0ZSBtYXNrIGluY2x1ZGVzIDkgTUJpdHMgKGJpdCA1KSwgYW5kIENDSyAoYml0cyAwLTMpLAorCSAqIHN1cHBfcmF0ZXNbXSBkb2VzIG5vdDsgc2hpZnQgdG8gY29udmVydCBmb3JtYXQsIGZvcmNlIDkgTUJpdHMgb2ZmLgorCSAqLworCWxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZSA9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gPDwgMTsKKwlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgfD0gaHRfY2FwLT5tY3MucnhfbWFza1swXSAmIDB4MTsKKwlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgJj0gfigodTE2KSAweDIpOworCWxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZSA8PD0gSUxfRklSU1RfT0ZETV9SQVRFOworCisJLyogU2FtZSBoZXJlICovCisJbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSA9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPDwgMTsKKwlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlIHw9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gJiAweDE7CisJbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSAmPSB+KCh1MTYpIDB4Mik7CisJbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSA8PD0gSUxfRklSU1RfT0ZETV9SQVRFOworCisJLyogVGhlc2UgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBsYXRlciAqLworCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrID0KKwkgICAgaWw0OTY1X2ZpcnN0X2FudGVubmEoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOworCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9CisJICAgIGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgfmlsNDk2NV9maXJzdF9hbnRlbm5hKGlsLT5od19wYXJhbXMuCisJCQkJCQkJICAgICAgIHZhbGlkX3R4X2FudCk7CisJaWYgKCFscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2spIHsKKwkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0gQU5UX0FCOworCX0gZWxzZSBpZiAoaWw0OTY1X251bV9vZl9hbnQoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpID09IDIpIHsKKwkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0KKwkJICAgIGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50OworCX0KKworCS8qIGFzIGRlZmF1bHQgYWxsb3cgYWdncmVnYXRpb24gZm9yIGFsbCB0aWRzICovCisJbHFfc3RhLT50eF9hZ2dfdGlkX2VuID0gSUxfQUdHX0FMTF9USUQ7CisJbHFfc3RhLT5kcnYgPSBpbDsKKworCS8qIFNldCBsYXN0X3R4cmF0ZV9pZHggdG8gbG93ZXN0IHJhdGUgKi8KKwlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KHNiYW5kLCBzdGEpOworCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCArPSBJTF9GSVJTVF9PRkRNX1JBVEU7CisJbHFfc3RhLT5pc19hZ2cgPSAwOworCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKKwlscV9zdGEtPmRiZ19maXhlZF9yYXRlID0gMDsKKyNlbmRpZgorCisJaWw0OTY1X3JzX2luaXRpYWxpemVfbHEoaWwsIGNvbmYsIHN0YSwgbHFfc3RhKTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19maWxsX2xpbmtfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhLAorCQkJdTMyIG5ld19yYXRlKQoreworCXN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyB0YmxfdHlwZTsKKwlpbnQgaWR4ID0gMDsKKwlpbnQgcmF0ZV9pZHg7CisJaW50IHJlcGVhdF9yYXRlID0gMDsKKwl1OCBhbnRfdG9nZ2xlX2NudCA9IDA7CisJdTggdXNlX2h0X3Bvc3NpYmxlID0gMTsKKwl1OCB2YWxpZF90eF9hbnQgPSAwOworCXN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscV9jbWQgPSAmbHFfc3RhLT5scTsKKworCS8qIE92ZXJyaWRlIHN0YXJ0aW5nIHJhdGUgKGlkeCAwKSBpZiBuZWVkZWQgZm9yIGRlYnVnIHB1cnBvc2VzICovCisJaWw0OTY1X3JzX2RiZ2ZzX3NldF9tY3MobHFfc3RhLCAmbmV3X3JhdGUsIGlkeCk7CisKKwkvKiBJbnRlcnByZXQgbmV3X3JhdGUgKHJhdGVfbl9mbGFncykgKi8KKwlpbDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKG5ld19yYXRlLCBscV9zdGEtPmJhbmQsICZ0YmxfdHlwZSwKKwkJCQkJJnJhdGVfaWR4KTsKKworCS8qIEhvdyBtYW55IHRpbWVzIHNob3VsZCB3ZSByZXBlYXQgdGhlIGluaXRpYWwgcmF0ZT8gKi8KKwlpZiAoaXNfbGVnYWN5KHRibF90eXBlLmxxX3R5cGUpKSB7CisJCWFudF90b2dnbGVfY250ID0gMTsKKwkJcmVwZWF0X3JhdGUgPSBJTF9OVU1CRVJfVFJZOworCX0gZWxzZSB7CisJCXJlcGVhdF9yYXRlID0gSUxfSFRfTlVNQkVSX1RSWTsKKwl9CisKKwlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLm1pbW9fZGVsaW1pdGVyID0KKwkgICAgaXNfbWltbyh0YmxfdHlwZS5scV90eXBlKSA/IDEgOiAwOworCisJLyogRmlsbCAxc3QgdGFibGUgZW50cnkgKGlkeCAwKSAqLworCWxxX2NtZC0+cnNfdGFibGVbaWR4XS5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUzMihuZXdfcmF0ZSk7CisKKwlpZiAoaWw0OTY1X251bV9vZl9hbnQodGJsX3R5cGUuYW50X3R5cGUpID09IDEpIHsKKwkJbHFfY21kLT5nZW5lcmFsX3BhcmFtcy5zaW5nbGVfc3RyZWFtX2FudF9tc2sgPQorCQkgICAgdGJsX3R5cGUuYW50X3R5cGU7CisJfSBlbHNlIGlmIChpbDQ5NjVfbnVtX29mX2FudCh0YmxfdHlwZS5hbnRfdHlwZSkgPT0gMikgeworCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPSB0YmxfdHlwZS5hbnRfdHlwZTsKKwl9CisJLyogb3RoZXJ3aXNlIHdlIGRvbid0IG1vZGlmeSB0aGUgZXhpc3RpbmcgdmFsdWUgKi8KKwlpZHgrKzsKKwlyZXBlYXRfcmF0ZS0tOworCWlmIChpbCkKKwkJdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisKKwkvKiBGaWxsIHJlc3Qgb2YgcmF0ZSB0YWJsZSAqLworCXdoaWxlIChpZHggPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTSkgeworCQkvKiBSZXBlYXQgaW5pdGlhbC9uZXh0IHJhdGUuCisJCSAqIEZvciBsZWdhY3kgSUxfTlVNQkVSX1RSWSA9PSAxLCB0aGlzIGxvb3Agd2lsbCBub3QgZXhlY3V0ZS4KKwkJICogRm9yIEhUIElMX0hUX05VTUJFUl9UUlkgPT0gMywgdGhpcyBleGVjdXRlcyB0d2ljZS4gKi8KKwkJd2hpbGUgKHJlcGVhdF9yYXRlID4gMCAmJiBpZHggPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTSkgeworCQkJaWYgKGlzX2xlZ2FjeSh0YmxfdHlwZS5scV90eXBlKSkgeworCQkJCWlmIChhbnRfdG9nZ2xlX2NudCA8IE5VTV9UUllfQkVGT1JFX0FOVF9UT0dHTEUpCisJCQkJCWFudF90b2dnbGVfY250Kys7CisJCQkJZWxzZSBpZiAoaWwgJiYKKwkJCQkJIGlsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsCisJCQkJCQkJCSAgJm5ld19yYXRlLAorCQkJCQkJCQkgICZ0YmxfdHlwZSkpCisJCQkJCWFudF90b2dnbGVfY250ID0gMTsKKwkJCX0KKworCQkJLyogT3ZlcnJpZGUgbmV4dCByYXRlIGlmIG5lZWRlZCBmb3IgZGVidWcgcHVycG9zZXMgKi8KKwkJCWlsNDk2NV9yc19kYmdmc19zZXRfbWNzKGxxX3N0YSwgJm5ld19yYXRlLCBpZHgpOworCisJCQkvKiBGaWxsIG5leHQgdGFibGUgZW50cnkgKi8KKwkJCWxxX2NtZC0+cnNfdGFibGVbaWR4XS5yYXRlX25fZmxhZ3MgPQorCQkJICAgIGNwdV90b19sZTMyKG5ld19yYXRlKTsKKwkJCXJlcGVhdF9yYXRlLS07CisJCQlpZHgrKzsKKwkJfQorCisJCWlsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3MobmV3X3JhdGUsIGxxX3N0YS0+YmFuZCwKKwkJCQkJCSZ0YmxfdHlwZSwgJnJhdGVfaWR4KTsKKworCQkvKiBJbmRpY2F0ZSB0byB1Q29kZSB3aGljaCBlbnRyaWVzIG1pZ2h0IGJlIE1JTU8uCisJCSAqIElmIGluaXRpYWwgcmF0ZSB3YXMgTUlNTywgdGhpcyB3aWxsIGZpbmFsbHkgZW5kIHVwCisJCSAqIGFzIChJTF9IVF9OVU1CRVJfVFJZICogMiksIGFmdGVyIDJuZCBwYXNzLCBvdGhlcndpc2UgMC4gKi8KKwkJaWYgKGlzX21pbW8odGJsX3R5cGUubHFfdHlwZSkpCisJCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLm1pbW9fZGVsaW1pdGVyID0gaWR4OworCisJCS8qIEdldCBuZXh0IHJhdGUgKi8KKwkJbmV3X3JhdGUgPQorCQkgICAgaWw0OTY1X3JzX2dldF9sb3dlcl9yYXRlKGxxX3N0YSwgJnRibF90eXBlLCByYXRlX2lkeCwKKwkJCQkJICAgICB1c2VfaHRfcG9zc2libGUpOworCisJCS8qIEhvdyBtYW55IHRpbWVzIHNob3VsZCB3ZSByZXBlYXQgdGhlIG5leHQgcmF0ZT8gKi8KKwkJaWYgKGlzX2xlZ2FjeSh0YmxfdHlwZS5scV90eXBlKSkgeworCQkJaWYgKGFudF90b2dnbGVfY250IDwgTlVNX1RSWV9CRUZPUkVfQU5UX1RPR0dMRSkKKwkJCQlhbnRfdG9nZ2xlX2NudCsrOworCQkJZWxzZSBpZiAoaWwgJiYKKwkJCQkgaWw0OTY1X3JzX3RvZ2dsZV9hbnRlbm5hKHZhbGlkX3R4X2FudCwKKwkJCQkJCQkgICZuZXdfcmF0ZSwgJnRibF90eXBlKSkKKwkJCQlhbnRfdG9nZ2xlX2NudCA9IDE7CisKKwkJCXJlcGVhdF9yYXRlID0gSUxfTlVNQkVSX1RSWTsKKwkJfSBlbHNlIHsKKwkJCXJlcGVhdF9yYXRlID0gSUxfSFRfTlVNQkVSX1RSWTsKKwkJfQorCisJCS8qIERvbid0IGFsbG93IEhUIHJhdGVzIGFmdGVyIG5leHQgcGFzcy4KKwkJICogaWw0OTY1X3JzX2dldF9sb3dlcl9yYXRlKCkgd2lsbCBjaGFuZ2UgdHlwZSB0byBMUV9BIG9yIExRX0cuICovCisJCXVzZV9odF9wb3NzaWJsZSA9IDA7CisKKwkJLyogT3ZlcnJpZGUgbmV4dCByYXRlIGlmIG5lZWRlZCBmb3IgZGVidWcgcHVycG9zZXMgKi8KKwkJaWw0OTY1X3JzX2RiZ2ZzX3NldF9tY3MobHFfc3RhLCAmbmV3X3JhdGUsIGlkeCk7CisKKwkJLyogRmlsbCBuZXh0IHRhYmxlIGVudHJ5ICovCisJCWxxX2NtZC0+cnNfdGFibGVbaWR4XS5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUzMihuZXdfcmF0ZSk7CisKKwkJaWR4Kys7CisJCXJlcGVhdF9yYXRlLS07CisJfQorCisJbHFfY21kLT5hZ2dfcGFyYW1zLmFnZ19mcmFtZV9jbnRfbGltaXQgPSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRjsKKwlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCA9IExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9ERUY7CisKKwlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX3RpbWVfbGltaXQgPQorCSAgICBjcHVfdG9fbGUxNihMSU5LX1FVQUxfQUdHX1RJTUVfTElNSVRfREVGKTsKK30KKworc3RhdGljIHZvaWQgKgoraWw0OTY1X3JzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQoreworCXJldHVybiBody0+cHJpdjsKK30KKworLyogcmF0ZSBzY2FsZSByZXF1aXJlcyBmcmVlIGZ1bmN0aW9uIHRvIGJlIGltcGxlbWVudGVkICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX2ZyZWUodm9pZCAqaWxfcmF0ZSkKK3sKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfZnJlZV9zdGEodm9pZCAqaWxfciwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqaWxfc3RhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCBfX21heWJlX3VudXNlZCA9IGlsX3I7CisKKwlEX1JBVEUoImVudGVyXG4iKTsKKwlEX1JBVEUoImxlYXZlXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCitzdGF0aWMgaW50CitpbDQ5NjVfb3Blbl9maWxlX2dlbmVyaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19kYmdmc19zZXRfbWNzKHN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSwgdTMyICogcmF0ZV9uX2ZsYWdzLCBpbnQgaWR4KQoreworCXN0cnVjdCBpbF9wcml2ICppbDsKKwl1OCB2YWxpZF90eF9hbnQ7CisJdTggYW50X3NlbF90eDsKKworCWlsID0gbHFfc3RhLT5kcnY7CisJdmFsaWRfdHhfYW50ID0gaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7CisJaWYgKGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUpIHsKKwkJYW50X3NlbF90eCA9CisJCSAgICAoKGxxX3N0YS0+CisJCSAgICAgIGRiZ19maXhlZF9yYXRlICYgUkFURV9NQ1NfQU5UX0FCQ19NU0spID4+CisJCSAgICAgUkFURV9NQ1NfQU5UX1BPUyk7CisJCWlmICgodmFsaWRfdHhfYW50ICYgYW50X3NlbF90eCkgPT0gYW50X3NlbF90eCkgeworCQkJKnJhdGVfbl9mbGFncyA9IGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGU7CisJCQlEX1JBVEUoIkZpeGVkIHJhdGUgT05cbiIpOworCQl9IGVsc2UgeworCQkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IDA7CisJCQlJTF9FUlIKKwkJCSAgICAoIkludmFsaWQgYW50ZW5uYSBzZWxlY3Rpb24gMHglWCwgVmFsaWQgaXMgMHglWFxuIiwKKwkJCSAgICAgYW50X3NlbF90eCwgdmFsaWRfdHhfYW50KTsKKwkJCURfUkFURSgiRml4ZWQgcmF0ZSBPRkZcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJRF9SQVRFKCJGaXhlZCByYXRlIE9GRlxuIik7CisJfQorfQorCitzdGF0aWMgc3NpemVfdAoraWw0OTY1X3JzX3N0YV9kYmdmc19zY2FsZV90YWJsZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbF9wcml2ICppbDsKKwljaGFyIGJ1Zls2NF07CisJc2l6ZV90IGJ1Zl9zaXplOworCXUzMiBwYXJzZWRfcmF0ZTsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9CisJICAgIGNvbnRhaW5lcl9vZihscV9zdGEsIHN0cnVjdCBpbF9zdGF0aW9uX3ByaXYsIGxxX3N0YSk7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7CisKKwlpbCA9IGxxX3N0YS0+ZHJ2OworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChzc2NhbmYoYnVmLCAiJXgiLCAmcGFyc2VkX3JhdGUpID09IDEpCisJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSBwYXJzZWRfcmF0ZTsKKwllbHNlCisJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSAwOworCisJbHFfc3RhLT5hY3RpdmVfbGVnYWN5X3JhdGUgPSAweDBGRkY7CS8qIDEgLSA1NCBNQml0cywgaW5jbHVkZXMgQ0NLICovCisJbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlID0gMHgxRkQwOwkvKiA2IC0gNjAgTUJpdHMsIG5vIDksIG5vIENDSyAqLworCWxxX3N0YS0+YWN0aXZlX21pbW8yX3JhdGUgPSAweDFGRDA7CS8qIDYgLSA2MCBNQml0cywgbm8gOSwgbm8gQ0NLICovCisKKwlEX1JBVEUoInN0YV9pZCAlZCByYXRlIDB4JVhcbiIsIGxxX3N0YS0+bHEuc3RhX2lkLAorCSAgICAgICBscV9zdGEtPmRiZ19maXhlZF9yYXRlKTsKKworCWlmIChscV9zdGEtPmRiZ19maXhlZF9yYXRlKSB7CisJCWlsNDk2NV9yc19maWxsX2xpbmtfY21kKE5VTEwsIGxxX3N0YSwgbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSk7CisJCWlsX3NlbmRfbHFfY21kKGxxX3N0YS0+ZHJ2LCBjdHgsICZscV9zdGEtPmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgKmJ1ZmY7CisJaW50IGRlc2MgPSAwOworCWludCBpID0gMDsKKwlpbnQgaWR4ID0gMDsKKwlzc2l6ZV90IHJldDsKKworCXN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWw7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKKworCWlsID0gbHFfc3RhLT5kcnY7CisJYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWZmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRlc2MgKz0gc3ByaW50ZihidWZmICsgZGVzYywgInN0YV9pZCAlZFxuIiwgbHFfc3RhLT5scS5zdGFfaWQpOworCWRlc2MgKz0KKwkgICAgc3ByaW50ZihidWZmICsgZGVzYywgImZhaWxlZD0lZCBzdWNjZXNzPSVkIHJhdGU9MCVYXG4iLAorCQkgICAgbHFfc3RhLT50b3RhbF9mYWlsZWQsIGxxX3N0YS0+dG90YWxfc3VjY2VzcywKKwkJICAgIGxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlKTsKKwlkZXNjICs9CisJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICJmaXhlZCByYXRlIDB4JVhcbiIsIGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUpOworCWRlc2MgKz0KKwkgICAgc3ByaW50ZihidWZmICsgZGVzYywgInZhbGlkX3R4X2FudCAlcyVzJXNcbiIsCisJCSAgICAoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiBBTlRfQSkgPyAiQU5UX0EsIiA6ICIiLAorCQkgICAgKGlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgQU5UX0IpID8gIkFOVF9CLCIgOiAiIiwKKwkJICAgIChpbC0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCAmIEFOVF9DKSA/ICJBTlRfQyIgOiAiIik7CisJZGVzYyArPQorCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAibHEgdHlwZSAlc1xuIiwKKwkJICAgIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgPyAibGVnYWN5IiA6ICJIVCIpOworCWlmIChpc19IdCh0YmwtPmxxX3R5cGUpKSB7CisJCWRlc2MgKz0KKwkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICIgJXMiLAorCQkJICAgIChpc19zaXNvKHRibC0+bHFfdHlwZSkpID8gIlNJU08iIDogIk1JTU8yIik7CisJCWRlc2MgKz0KKwkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICIgJXMiLAorCQkJICAgICh0YmwtPmlzX2h0NDApID8gIjQwTUh6IiA6ICIyME1IeiIpOworCQlkZXNjICs9CisJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiICVzICVzICVzXG4iLAorCQkJICAgICh0YmwtPmlzX1NHSSkgPyAiU0dJIiA6ICIiLAorCQkJICAgIChscV9zdGEtPmlzX2dyZWVuKSA/ICJHRiBlbmFibGVkIiA6ICIiLAorCQkJICAgIChscV9zdGEtPmlzX2FnZykgPyAiQUdHIG9uIiA6ICIiKTsKKwl9CisJZGVzYyArPQorCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAibGFzdCB0eCByYXRlPTB4JVhcbiIsCisJCSAgICBscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzKTsKKwlkZXNjICs9CisJICAgIHNwcmludGYoYnVmZiArIGRlc2MsCisJCSAgICAiZ2VuZXJhbDoiICJmbGFncz0weCVYIG1pbW8tZD0lZCBzLWFudDB4JXggZC1hbnQ9MHgleFxuIiwKKwkJICAgIGxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZmxhZ3MsCisJCSAgICBscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLm1pbW9fZGVsaW1pdGVyLAorCQkgICAgbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zaW5nbGVfc3RyZWFtX2FudF9tc2ssCisJCSAgICBscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2spOworCisJZGVzYyArPQorCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLAorCQkgICAgImFnZzoiCisJCSAgICAidGltZV9saW1pdD0lZCBkaXN0X3N0YXJ0X3RoPSVkIGZyYW1lX2NudF9saW1pdD0lZFxuIiwKKwkJICAgIGxlMTZfdG9fY3B1KGxxX3N0YS0+bHEuYWdnX3BhcmFtcy5hZ2dfdGltZV9saW1pdCksCisJCSAgICBscV9zdGEtPmxxLmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCwKKwkJICAgIGxxX3N0YS0+bHEuYWdnX3BhcmFtcy5hZ2dfZnJhbWVfY250X2xpbWl0KTsKKworCWRlc2MgKz0KKwkgICAgc3ByaW50ZihidWZmICsgZGVzYywKKwkJICAgICJTdGFydCBpZHggWzBdPTB4JXggWzFdPTB4JXggWzJdPTB4JXggWzNdPTB4JXhcbiIsCisJCSAgICBscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLnN0YXJ0X3JhdGVfaWR4WzBdLAorCQkgICAgbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2lkeFsxXSwKKwkJICAgIGxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc3RhcnRfcmF0ZV9pZHhbMl0sCisJCSAgICBscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLnN0YXJ0X3JhdGVfaWR4WzNdKTsKKworCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKSB7CisJCWlkeCA9CisJCSAgICBpbDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KGxlMzJfdG9fY3B1CisJCQkJCSAgICAgIChscV9zdGEtPmxxLnJzX3RhYmxlW2ldLgorCQkJCQkgICAgICAgcmF0ZV9uX2ZsYWdzKSk7CisJCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgeworCQkJZGVzYyArPQorCQkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICIgcmF0ZVslZF0gMHglWCAlc21icHNcbiIsIGksCisJCQkJICAgIGxlMzJfdG9fY3B1KGxxX3N0YS0+bHEucnNfdGFibGVbaV0uCisJCQkJCQlyYXRlX25fZmxhZ3MpLAorCQkJCSAgICBpbF9yYXRlX21jc1tpZHhdLm1icHMpOworCQl9IGVsc2UgeworCQkJZGVzYyArPQorCQkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICIgcmF0ZVslZF0gMHglWCAlc21icHMgKCVzKVxuIiwKKwkJCQkgICAgaSwKKwkJCQkgICAgbGUzMl90b19jcHUobHFfc3RhLT5scS5yc190YWJsZVtpXS4KKwkJCQkJCXJhdGVfbl9mbGFncyksCisJCQkJICAgIGlsX3JhdGVfbWNzW2lkeF0ubWJwcywKKwkJCQkgICAgaWxfcmF0ZV9tY3NbaWR4XS5tY3MpOworCQl9CisJfQorCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKKwlrZnJlZShidWZmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfb3BzID0geworCS53cml0ZSA9IGlsNDk2NV9yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfd3JpdGUsCisJLnJlYWQgPSBpbDQ5NjVfcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX3JlYWQsCisJLm9wZW4gPSBpbDQ5NjVfb3Blbl9maWxlX2dlbmVyaWMsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKworc3RhdGljIHNzaXplX3QKK2lsNDk2NV9yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciAqYnVmZjsKKwlpbnQgZGVzYyA9IDA7CisJaW50IGksIGo7CisJc3NpemVfdCByZXQ7CisKKwlzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlidWZmID0ga21hbGxvYygxMDI0LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IExRX1NJWkU7IGkrKykgeworCQlkZXNjICs9CisJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLAorCQkJICAgICIlcyB0eXBlPSVkIFNHST0lZCBIVDQwPSVkIERVUD0lZCBHRj0lZFxuIgorCQkJICAgICJyYXRlPTB4JVhcbiIsIGxxX3N0YS0+YWN0aXZlX3RibCA9PSBpID8gIioiIDogIngiLAorCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS5scV90eXBlLAorCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS5pc19TR0ksCisJCQkgICAgbHFfc3RhLT5scV9pbmZvW2ldLmlzX2h0NDAsCisJCQkgICAgbHFfc3RhLT5scV9pbmZvW2ldLmlzX2R1cCwgbHFfc3RhLT5pc19ncmVlbiwKKwkJCSAgICBscV9zdGEtPmxxX2luZm9baV0uY3VycmVudF9yYXRlKTsKKwkJZm9yIChqID0gMDsgaiA8IFJBVEVfQ09VTlQ7IGorKykgeworCQkJZGVzYyArPQorCQkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsCisJCQkJICAgICJjb3VudGVyPSVkIHN1Y2Nlc3M9JWQgJSU9JWRcbiIsCisJCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS53aW5bal0uY291bnRlciwKKwkJCQkgICAgbHFfc3RhLT5scV9pbmZvW2ldLndpbltqXS5zdWNjZXNzX2NvdW50ZXIsCisJCQkJICAgIGxxX3N0YS0+bHFfaW5mb1tpXS53aW5bal0uc3VjY2Vzc19yYXRpbyk7CisJCX0KKwl9CisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKKwlrZnJlZShidWZmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzID0geworCS5yZWFkID0gaWw0OTY1X3JzX3N0YV9kYmdmc19zdGF0c190YWJsZV9yZWFkLAorCS5vcGVuID0gaWw0OTY1X29wZW5fZmlsZV9nZW5lcmljLAorCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKK307CisKK3N0YXRpYyBzc2l6ZV90CitpbDQ5NjVfcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJCSBsb2ZmX3QgKnBwb3MpCit7CisJY2hhciBidWZmWzEyMF07CisJaW50IGRlc2MgPSAwOworCXN0cnVjdCBpbF9scV9zdGEgKmxxX3N0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWxfc2NhbGVfdGJsX2luZm8gKnRibCA9ICZscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXTsKKworCWlmIChpc19IdCh0YmwtPmxxX3R5cGUpKQorCQlkZXNjICs9CisJCSAgICBzcHJpbnRmKGJ1ZmYgKyBkZXNjLCAiQml0IFJhdGU9ICVkIE1iL3NcbiIsCisJCQkgICAgdGJsLT5leHBlY3RlZF90cHRbbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHhdKTsKKwllbHNlCisJCWRlc2MgKz0KKwkJICAgIHNwcmludGYoYnVmZiArIGRlc2MsICJCaXQgUmF0ZT0gJWQgTWIvc1xuIiwKKwkJCSAgICBpbF9yYXRlc1tscV9zdGEtPmxhc3RfdHhyYXRlX2lkeF0uaWVlZSA+PiAxKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZmYsIGRlc2MpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX29wcyA9IHsKKwkucmVhZCA9IGlsNDk2NV9yc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX3JlYWQsCisJLm9wZW4gPSBpbDQ5NjVfb3Blbl9maWxlX2dlbmVyaWMsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKworc3RhdGljIHZvaWQKK2lsNDk2NV9yc19hZGRfZGVidWdmcyh2b2lkICppbCwgdm9pZCAqaWxfc3RhLCBzdHJ1Y3QgZGVudHJ5ICpkaXIpCit7CisJc3RydWN0IGlsX2xxX3N0YSAqbHFfc3RhID0gaWxfc3RhOworCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGUgPQorCSAgICBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYXRlX3NjYWxlX3RhYmxlIiwgU19JUlVTUiB8IFNfSVdVU1IsIGRpciwKKwkJCQlscV9zdGEsICZyc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfb3BzKTsKKwlscV9zdGEtPnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlID0KKwkgICAgZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zdGF0c190YWJsZSIsIFNfSVJVU1IsIGRpciwgbHFfc3RhLAorCQkJCSZyc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfb3BzKTsKKwlscV9zdGEtPnJzX3N0YV9kYmdmc19yYXRlX3NjYWxlX2RhdGFfZmlsZSA9CisJICAgIGRlYnVnZnNfY3JlYXRlX2ZpbGUoInJhdGVfc2NhbGVfZGF0YSIsIFNfSVJVU1IsIGRpciwgbHFfc3RhLAorCQkJCSZyc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX29wcyk7CisJbHFfc3RhLT5yc19zdGFfZGJnZnNfdHhfYWdnX3RpZF9lbl9maWxlID0KKwkgICAgZGVidWdmc19jcmVhdGVfdTgoInR4X2FnZ190aWRfZW5hYmxlIiwgU19JUlVTUiB8IFNfSVdVU1IsIGRpciwKKwkJCSAgICAgICZscV9zdGEtPnR4X2FnZ190aWRfZW4pOworCit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfcnNfcmVtb3ZlX2RlYnVnZnModm9pZCAqaWwsIHZvaWQgKmlsX3N0YSkKK3sKKwlzdHJ1Y3QgaWxfbHFfc3RhICpscV9zdGEgPSBpbF9zdGE7CisJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfZmlsZSk7CisJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZSk7CisJZGVidWdmc19yZW1vdmUobHFfc3RhLT5yc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX2ZpbGUpOworCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3R4X2FnZ190aWRfZW5fZmlsZSk7Cit9CisjZW5kaWYKKworLyoKKyAqIEluaXRpYWxpemF0aW9uIG9mIHJhdGUgc2NhbGluZyBpbmZvcm1hdGlvbiBpcyBkb25lIGJ5IGRyaXZlciBhZnRlcgorICogdGhlIHN0YXRpb24gaXMgYWRkZWQuIFNpbmNlIG1hYzgwMjExIGNhbGxzIHRoaXMgZnVuY3Rpb24gYmVmb3JlIGEKKyAqIHN0YXRpb24gaXMgYWRkZWQgd2UgaWdub3JlIGl0LgorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X3JzX3JhdGVfaW5pdF9zdHViKHZvaWQgKmlsX3IsIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHZvaWQgKmlsX3N0YSkKK3sKK30KKworc3RhdGljIHN0cnVjdCByYXRlX2NvbnRyb2xfb3BzIHJzXzQ5NjVfb3BzID0geworCS5tb2R1bGUgPSBOVUxMLAorCS5uYW1lID0gSUw0OTY1X1JTX05BTUUsCisJLnR4X3N0YXR1cyA9IGlsNDk2NV9yc190eF9zdGF0dXMsCisJLmdldF9yYXRlID0gaWw0OTY1X3JzX2dldF9yYXRlLAorCS5yYXRlX2luaXQgPSBpbDQ5NjVfcnNfcmF0ZV9pbml0X3N0dWIsCisJLmFsbG9jID0gaWw0OTY1X3JzX2FsbG9jLAorCS5mcmVlID0gaWw0OTY1X3JzX2ZyZWUsCisJLmFsbG9jX3N0YSA9IGlsNDk2NV9yc19hbGxvY19zdGEsCisJLmZyZWVfc3RhID0gaWw0OTY1X3JzX2ZyZWVfc3RhLAorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCisJLmFkZF9zdGFfZGVidWdmcyA9IGlsNDk2NV9yc19hZGRfZGVidWdmcywKKwkucmVtb3ZlX3N0YV9kZWJ1Z2ZzID0gaWw0OTY1X3JzX3JlbW92ZV9kZWJ1Z2ZzLAorI2VuZGlmCit9OworCitpbnQKK2lsNDk2NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCkKK3sKKwlyZXR1cm4gaWVlZTgwMjExX3JhdGVfY29udHJvbF9yZWdpc3RlcigmcnNfNDk2NV9vcHMpOworfQorCit2b2lkCitpbDQ5NjVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIodm9pZCkKK3sKKwlpZWVlODAyMTFfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoJnJzXzQ5NjVfb3BzKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWNiYzAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvNDk2NS5jCkBAIC0wLDAgKzEsMjQwMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICI0OTY1LmgiCisKKy8qKgorICogaWxfdmVyaWZ5X2luc3Rfc3BhcnNlIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKKyAqICAgdXNpbmcgc2FtcGxlIGRhdGEgMTAwIGJ5dGVzIGFwYXJ0LiAgSWYgdGhlc2Ugc2FtcGxlIHBvaW50cyBhcmUgZ29vZCwKKyAqICAgaXQncyBhIHByZXR0eSBnb29kIGJldCB0aGF0IGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGVtIGlzIGdvb2QsIHRvby4KKyAqLworc3RhdGljIGludAoraWw0OTY1X3ZlcmlmeV9pbnN0X3NwYXJzZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIF9fbGUzMiAqIGltYWdlLCB1MzIgbGVuKQoreworCXUzMiB2YWw7CisJaW50IHJldCA9IDA7CisJdTMyIGVycmNudCA9IDA7CisJdTMyIGk7CisKKwlEX0lORk8oInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTAwLCBpbWFnZSArPSAxMDAgLyBzaXplb2YodTMyKSkgeworCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KKwkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCisJCSAqIGlmIElMX0RMX0lPIGlzIHNldCAqLworCQlpbF93cihpbCwgSEJVU19UQVJHX01FTV9SQUREUiwgaSArIElMNDk2NV9SVENfSU5TVF9MT1dFUl9CT1VORCk7CisJCXZhbCA9IF9pbF9yZChpbCwgSEJVU19UQVJHX01FTV9SREFUKTsKKwkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZXJyY250Kys7CisJCQlpZiAoZXJyY250ID49IDMpCisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlsNDk2NV92ZXJpZnlfaW5zdF9mdWxsIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKKyAqICAgICBsb29raW5nIGF0IGFsbCBkYXRhLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfdmVyaWZ5X2luc3RfZnVsbChzdHJ1Y3QgaWxfcHJpdiAqaWwsIF9fbGUzMiAqIGltYWdlLCB1MzIgbGVuKQoreworCXUzMiB2YWw7CisJdTMyIHNhdmVfbGVuID0gbGVuOworCWludCByZXQgPSAwOworCXUzMiBlcnJjbnQ7CisKKwlEX0lORk8oInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKworCWlsX3dyKGlsLCBIQlVTX1RBUkdfTUVNX1JBRERSLCBJTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOworCisJZXJyY250ID0gMDsKKwlmb3IgKDsgbGVuID4gMDsgbGVuIC09IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7CisJCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLworCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKKwkJICogaWYgSUxfRExfSU8gaXMgc2V0ICovCisJCXZhbCA9IF9pbF9yZChpbCwgSEJVU19UQVJHX01FTV9SREFUKTsKKwkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7CisJCQlJTF9FUlIoInVDb2RlIElOU1Qgc2VjdGlvbiBpcyBpbnZhbGlkIGF0ICIKKwkJCSAgICAgICAib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLAorCQkJICAgICAgIHNhdmVfbGVuIC0gbGVuLCB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOworCQkJcmV0ID0gLUVJTzsKKwkJCWVycmNudCsrOworCQkJaWYgKGVycmNudCA+PSAyMCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghZXJyY250KQorCQlEX0lORk8oInVjb2RlIGltYWdlIGluIElOU1RSVUNUSU9OIG1lbW9yeSBpcyBnb29kXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogaWw0OTY1X3ZlcmlmeV91Y29kZSAtIGRldGVybWluZSB3aGljaCBpbnN0cnVjdGlvbiBpbWFnZSBpcyBpbiBTUkFNLAorICogICAgYW5kIHZlcmlmeSBpdHMgY29udGVudHMKKyAqLworaW50CitpbDQ5NjVfdmVyaWZ5X3Vjb2RlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfX2xlMzIgKmltYWdlOworCXUzMiBsZW47CisJaW50IHJldDsKKworCS8qIFRyeSBib290c3RyYXAgKi8KKwlpbWFnZSA9IChfX2xlMzIgKikgaWwtPnVjb2RlX2Jvb3Qudl9hZGRyOworCWxlbiA9IGlsLT51Y29kZV9ib290LmxlbjsKKwlyZXQgPSBpbDQ5NjVfdmVyaWZ5X2luc3Rfc3BhcnNlKGlsLCBpbWFnZSwgbGVuKTsKKwlpZiAoIXJldCkgeworCQlEX0lORk8oIkJvb3RzdHJhcCB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFRyeSBpbml0aWFsaXplICovCisJaW1hZ2UgPSAoX19sZTMyICopIGlsLT51Y29kZV9pbml0LnZfYWRkcjsKKwlsZW4gPSBpbC0+dWNvZGVfaW5pdC5sZW47CisJcmV0ID0gaWw0OTY1X3ZlcmlmeV9pbnN0X3NwYXJzZShpbCwgaW1hZ2UsIGxlbik7CisJaWYgKCFyZXQpIHsKKwkJRF9JTkZPKCJJbml0aWFsaXplIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogVHJ5IHJ1bnRpbWUvcHJvdG9jb2wgKi8KKwlpbWFnZSA9IChfX2xlMzIgKikgaWwtPnVjb2RlX2NvZGUudl9hZGRyOworCWxlbiA9IGlsLT51Y29kZV9jb2RlLmxlbjsKKwlyZXQgPSBpbDQ5NjVfdmVyaWZ5X2luc3Rfc3BhcnNlKGlsLCBpbWFnZSwgbGVuKTsKKwlpZiAoIXJldCkgeworCQlEX0lORk8oIlJ1bnRpbWUgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlJTF9FUlIoIk5PIFZBTElEIFVDT0RFIElNQUdFIElOIElOU1RSVUNUSU9OIFNSQU0hIVxuIik7CisKKwkvKiBTaW5jZSBub3RoaW5nIHNlZW1zIHRvIG1hdGNoLCBzaG93IGZpcnN0IHNldmVyYWwgZGF0YSBlbnRyaWVzIGluCisJICogaW5zdHJ1Y3Rpb24gU1JBTSwgc28gbWF5YmUgdmlzdWFsIGluc3BlY3Rpb24gd2lsbCBnaXZlIGEgY2x1ZS4KKwkgKiBTZWxlY3Rpb24gb2YgYm9vdHN0cmFwIGltYWdlICh2cy4gb3RoZXIgaW1hZ2VzKSBpcyBhcmJpdHJhcnkuICovCisJaW1hZ2UgPSAoX19sZTMyICopIGlsLT51Y29kZV9ib290LnZfYWRkcjsKKwlsZW4gPSBpbC0+dWNvZGVfYm9vdC5sZW47CisJcmV0ID0gaWw0OTY1X3ZlcmlmeV9pbnN0X2Z1bGwoaWwsIGltYWdlLCBsZW4pOworCisJcmV0dXJuIHJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEVFUFJPTSByZWxhdGVkIGZ1bmN0aW9ucworICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRoZSBkZXZpY2UncyBFRVBST00gc2VtYXBob3JlIHByZXZlbnRzIGNvbmZsaWN0cyBiZXR3ZWVuIGRyaXZlciBhbmQgdUNvZGUKKyAqIHdoZW4gYWNjZXNzaW5nIHRoZSBFRVBST007IGVhY2ggYWNjZXNzIGlzIGEgc2VyaWVzIG9mIHB1bHNlcyB0by9mcm9tIHRoZQorICogRUVQUk9NIGNoaXAsIG5vdCBhIHNpbmdsZSBldmVudCwgc28gZXZlbiByZWFkcyBjb3VsZCBjb25mbGljdCBpZiB0aGV5CisgKiB3ZXJlbid0IGFyYml0cmF0ZWQgYnkgdGhlIHNlbWFwaG9yZS4KKyAqLworaW50CitpbDQ5NjVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MTYgY291bnQ7CisJaW50IHJldDsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEVFUFJPTV9TRU1fUkVUUllfTElNSVQ7IGNvdW50KyspIHsKKwkJLyogUmVxdWVzdCBzZW1hcGhvcmUgKi8KKwkJaWxfc2V0X2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCQkgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfRUVQUk9NX09XTl9TRU0pOworCisJCS8qIFNlZSBpZiB3ZSBnb3QgaXQgKi8KKwkJcmV0ID0KKwkJICAgIF9pbF9wb2xsX2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCQkJIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSwKKwkJCQkgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNLAorCQkJCSBFRVBST01fU0VNX1RJTUVPVVQpOworCQlpZiAocmV0ID49IDApCisJCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQKK2lsNDk2NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlsX2NsZWFyX2JpdChpbCwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCSAgICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNKTsKKworfQorCitpbnQKK2lsNDk2NV9lZXByb21fY2hlY2tfdmVyc2lvbihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTE2IGVlcHJvbV92ZXI7CisJdTE2IGNhbGliX3ZlcjsKKworCWVlcHJvbV92ZXIgPSBpbF9lZXByb21fcXVlcnkxNihpbCwgRUVQUk9NX1ZFUlNJT04pOworCWNhbGliX3ZlciA9IGlsX2VlcHJvbV9xdWVyeTE2KGlsLCBFRVBST01fNDk2NV9DQUxJQl9WRVJTSU9OX09GRlNFVCk7CisKKwlpZiAoZWVwcm9tX3ZlciA8IGlsLT5jZmctPmVlcHJvbV92ZXIgfHwKKwkgICAgY2FsaWJfdmVyIDwgaWwtPmNmZy0+ZWVwcm9tX2NhbGliX3ZlcikKKwkJZ290byBlcnI7CisKKwlJTF9JTkZPKCJkZXZpY2UgRUVQUk9NIFZFUj0weCV4LCBDQUxJQj0weCV4XG4iLCBlZXByb21fdmVyLCBjYWxpYl92ZXIpOworCisJcmV0dXJuIDA7CitlcnI6CisJSUxfRVJSKCJVbnN1cHBvcnRlZCAodG9vIG9sZCkgRUVQUk9NIFZFUj0weCV4IDwgMHgleCAiCisJICAgICAgICJDQUxJQj0weCV4IDwgMHgleFxuIiwgZWVwcm9tX3ZlciwgaWwtPmNmZy0+ZWVwcm9tX3ZlciwKKwkgICAgICAgY2FsaWJfdmVyLCBpbC0+Y2ZnLT5lZXByb21fY2FsaWJfdmVyKTsKKwlyZXR1cm4gLUVJTlZBTDsKKworfQorCit2b2lkCitpbDQ5NjVfZWVwcm9tX2dldF9tYWMoY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsLCB1OCAqIG1hYykKK3sKKwljb25zdCB1OCAqYWRkciA9IGlsX2VlcHJvbV9xdWVyeV9hZGRyKGlsLAorCQkJCQkgICAgICBFRVBST01fTUFDX0FERFJFU1MpOworCW1lbWNweShtYWMsIGFkZHIsIEVUSF9BTEVOKTsKK30KKworLyogU2VuZCBsZWQgY29tbWFuZCAqLworc3RhdGljIGludAoraWw0OTY1X3NlbmRfbGVkX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9sZWRfY21kICpsZWRfY21kKQoreworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfTEVEUywKKwkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaWxfbGVkX2NtZCksCisJCS5kYXRhID0gbGVkX2NtZCwKKwkJLmZsYWdzID0gQ01EX0FTWU5DLAorCQkuY2FsbGJhY2sgPSBOVUxMLAorCX07CisJdTMyIHJlZzsKKworCXJlZyA9IF9pbF9yZChpbCwgQ1NSX0xFRF9SRUcpOworCWlmIChyZWcgIT0gKHJlZyAmIENTUl9MRURfQlNNX0NUUkxfTVNLKSkKKwkJX2lsX3dyKGlsLCBDU1JfTEVEX1JFRywgcmVnICYgQ1NSX0xFRF9CU01fQ1RSTF9NU0spOworCisJcmV0dXJuIGlsX3NlbmRfY21kKGlsLCAmY21kKTsKK30KKworLyogU2V0IGxlZCByZWdpc3RlciBvZmYgKi8KK3ZvaWQKK2lsNDk2NV9sZWRfZW5hYmxlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfaWxfd3IoaWwsIENTUl9MRURfUkVHLCBDU1JfTEVEX1JFR19UUlVOX09OKTsKK30KKworY29uc3Qgc3RydWN0IGlsX2xlZF9vcHMgaWw0OTY1X2xlZF9vcHMgPSB7CisJLmNtZCA9IGlsNDk2NV9zZW5kX2xlZF9jbWQsCit9OworCitzdGF0aWMgaW50IGlsNDk2NV9zZW5kX3R4X3Bvd2VyKHN0cnVjdCBpbF9wcml2ICppbCk7CitzdGF0aWMgaW50IGlsNDk2NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgSUw0OTY1X1VDT0RFX0FQSV9NQVggMgorCisvKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCisjZGVmaW5lIElMNDk2NV9VQ09ERV9BUElfTUlOIDIKKworI2RlZmluZSBJTDQ5NjVfRldfUFJFICJpd2x3aWZpLTQ5NjUtIgorI2RlZmluZSBfSUw0OTY1X01PRFVMRV9GSVJNV0FSRShhcGkpIElMNDk2NV9GV19QUkUgI2FwaSAiLnVjb2RlIgorI2RlZmluZSBJTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgX0lMNDk2NV9NT0RVTEVfRklSTVdBUkUoYXBpKQorCisvKiBjaGVjayBjb250ZW50cyBvZiBzcGVjaWFsIGJvb3RzdHJhcCB1Q29kZSBTUkFNICovCitzdGF0aWMgaW50CitpbDQ5NjVfdmVyaWZ5X2JzbShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJX19sZTMyICppbWFnZSA9IGlsLT51Y29kZV9ib290LnZfYWRkcjsKKwl1MzIgbGVuID0gaWwtPnVjb2RlX2Jvb3QubGVuOworCXUzMiByZWc7CisJdTMyIHZhbDsKKworCURfSU5GTygiQmVnaW4gdmVyaWZ5IGJzbVxuIik7CisKKwkvKiB2ZXJpZnkgQlNNIFNSQU0gY29udGVudHMgKi8KKwl2YWwgPSBpbF9yZF9wcnBoKGlsLCBCU01fV1JfRFdDT1VOVF9SRUcpOworCWZvciAocmVnID0gQlNNX1NSQU1fTE9XRVJfQk9VTkQ7IHJlZyA8IEJTTV9TUkFNX0xPV0VSX0JPVU5EICsgbGVuOworCSAgICAgcmVnICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7CisJCXZhbCA9IGlsX3JkX3BycGgoaWwsIHJlZyk7CisJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgeworCQkJSUxfRVJSKCJCU00gdUNvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZCBhdCAiCisJCQkgICAgICAgImFkZHIgMHglMDhYKyV1IChvZiAldSksIGlzIDB4JXgsIHMvYiAweCV4XG4iLAorCQkJICAgICAgIEJTTV9TUkFNX0xPV0VSX0JPVU5ELCByZWcgLSBCU01fU1JBTV9MT1dFUl9CT1VORCwKKwkJCSAgICAgICBsZW4sIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCX0KKworCURfSU5GTygiQlNNIGJvb3RzdHJhcCB1Q29kZSBpbWFnZSBPS1xuIik7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfbG9hZF9ic20gLSBMb2FkIGJvb3RzdHJhcCBpbnN0cnVjdGlvbnMKKyAqCisgKiBCU00gb3BlcmF0aW9uOgorICoKKyAqIFRoZSBCb290c3RyYXAgU3RhdGUgTWFjaGluZSAoQlNNKSBzdG9yZXMgYSBzaG9ydCBib290c3RyYXAgdUNvZGUgcHJvZ3JhbQorICogaW4gc3BlY2lhbCBTUkFNIHRoYXQgZG9lcyBub3QgcG93ZXIgZG93biBkdXJpbmcgUkZLSUxMLiAgV2hlbiBwb3dlcmluZyBiYWNrCisgKiB1cCBhZnRlciBwb3dlci1zYXZpbmcgc2xlZXBzIChvciBkdXJpbmcgaW5pdGlhbCB1Q29kZSBsb2FkKSwgdGhlIEJTTSBsb2FkcworICogdGhlIGJvb3RzdHJhcCBwcm9ncmFtIGludG8gdGhlIG9uLWJvYXJkIHByb2Nlc3NvciwgYW5kIHN0YXJ0cyBpdC4KKyAqCisgKiBUaGUgYm9vdHN0cmFwIHByb2dyYW0gbG9hZHMgKHZpYSBETUEpIGluc3RydWN0aW9ucyBhbmQgZGF0YSBmb3IgYSBuZXcKKyAqIHByb2dyYW0gZnJvbSBob3N0IERSQU0gbG9jYXRpb25zIGluZGljYXRlZCBieSB0aGUgaG9zdCBkcml2ZXIgaW4gdGhlCisgKiBCU01fRFJBTV8qIHJlZ2lzdGVycy4gIE9uY2UgdGhlIG5ldyBwcm9ncmFtIGlzIGxvYWRlZCwgaXQgc3RhcnRzCisgKiBhdXRvbWF0aWNhbGx5LgorICoKKyAqIFdoZW4gaW5pdGlhbGl6aW5nIHRoZSBOSUMsIHRoZSBob3N0IGRyaXZlciBwb2ludHMgdGhlIEJTTSB0byB0aGUKKyAqICJpbml0aWFsaXplIiB1Q29kZSBpbWFnZS4gIFRoaXMgdUNvZGUgc2V0cyB1cCBzb21lIGludGVybmFsIGRhdGEsIHRoZW4KKyAqIG5vdGlmaWVzIGhvc3QgdmlhICJpbml0aWFsaXplIGFsaXZlIiB0aGF0IGl0IGlzIGNvbXBsZXRlLgorICoKKyAqIFRoZSBob3N0IHRoZW4gcmVwbGFjZXMgdGhlIEJTTV9EUkFNXyogcG9pbnRlciB2YWx1ZXMgdG8gcG9pbnQgdG8gdGhlCisgKiBub3JtYWwgcnVudGltZSB1Q29kZSBpbnN0cnVjdGlvbnMgYW5kIGEgYmFja3VwIHVDb2RlIGRhdGEgY2FjaGUgYnVmZmVyCisgKiAoZmlsbGVkIGluaXRpYWxseSB3aXRoIHN0YXJ0aW5nIGRhdGEgdmFsdWVzIGZvciB0aGUgb24tYm9hcmQgcHJvY2Vzc29yKSwKKyAqIHRoZW4gdHJpZ2dlcnMgdGhlICJpbml0aWFsaXplIiB1Q29kZSB0byBsb2FkIGFuZCBsYXVuY2ggdGhlIHJ1bnRpbWUgdUNvZGUsCisgKiB3aGljaCBiZWdpbnMgbm9ybWFsIG9wZXJhdGlvbi4KKyAqCisgKiBXaGVuIGRvaW5nIGEgcG93ZXItc2F2ZSBzaHV0ZG93biwgcnVudGltZSB1Q29kZSBzYXZlcyBkYXRhIFNSQU0gaW50bworICogdGhlIGJhY2t1cCBkYXRhIGNhY2hlIGluIERSQU0gYmVmb3JlIFNSQU0gaXMgcG93ZXJlZCBkb3duLgorICoKKyAqIFdoZW4gcG93ZXJpbmcgYmFjayB1cCwgdGhlIEJTTSBsb2FkcyB0aGUgYm9vdHN0cmFwIHByb2dyYW0uICBUaGlzIHJlbG9hZHMKKyAqIHRoZSBydW50aW1lIHVDb2RlIGluc3RydWN0aW9ucyBhbmQgdGhlIGJhY2t1cCBkYXRhIGNhY2hlIGludG8gU1JBTSwKKyAqIGFuZCByZS1sYXVuY2hlcyB0aGUgcnVudGltZSB1Q29kZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfbG9hZF9ic20oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCV9fbGUzMiAqaW1hZ2UgPSBpbC0+dWNvZGVfYm9vdC52X2FkZHI7CisJdTMyIGxlbiA9IGlsLT51Y29kZV9ib290LmxlbjsKKwlkbWFfYWRkcl90IHBpbnN0OworCWRtYV9hZGRyX3QgcGRhdGE7CisJdTMyIGluc3RfbGVuOworCXUzMiBkYXRhX2xlbjsKKwlpbnQgaTsKKwl1MzIgZG9uZTsKKwl1MzIgcmVnX29mZnNldDsKKwlpbnQgcmV0OworCisJRF9JTkZPKCJCZWdpbiBsb2FkIGJzbVxuIik7CisKKwlpbC0+dWNvZGVfdHlwZSA9IFVDT0RFX1JUOworCisJLyogbWFrZSBzdXJlIGJvb3RzdHJhcCBwcm9ncmFtIGlzIG5vIGxhcmdlciB0aGFuIEJTTSdzIFNSQU0gc2l6ZSAqLworCWlmIChsZW4gPiBJTDQ5X01BWF9CU01fU0laRSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUZWxsIGJvb3RzdHJhcCB1Q29kZSB3aGVyZSB0byBmaW5kIHRoZSAiSW5pdGlhbGl6ZSIgdUNvZGUKKwkgKiAgIGluIGhvc3QgRFJBTSAuLi4gaG9zdCBEUkFNIHBoeXNpY2FsIGFkZHJlc3MgYml0cyAzNTo0IGZvciA0OTY1LgorCSAqIE5PVEU6ICBpbF9pbml0X2FsaXZlX3N0YXJ0KCkgd2lsbCByZXBsYWNlIHRoZXNlIHZhbHVlcywKKwkgKiAgICAgICAgYWZ0ZXIgdGhlICJpbml0aWFsaXplIiB1Q29kZSBoYXMgcnVuLCB0byBwb2ludCB0bworCSAqICAgICAgICBydW50aW1lL3Byb3RvY29sIGluc3RydWN0aW9ucyBhbmQgYmFja3VwIGRhdGEgY2FjaGUuCisJICovCisJcGluc3QgPSBpbC0+dWNvZGVfaW5pdC5wX2FkZHIgPj4gNDsKKwlwZGF0YSA9IGlsLT51Y29kZV9pbml0X2RhdGEucF9hZGRyID4+IDQ7CisJaW5zdF9sZW4gPSBpbC0+dWNvZGVfaW5pdC5sZW47CisJZGF0YV9sZW4gPSBpbC0+dWNvZGVfaW5pdF9kYXRhLmxlbjsKKworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0lOU1RfUFRSX1JFRywgcGluc3QpOworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0lOU1RfQllURUNPVU5UX1JFRywgaW5zdF9sZW4pOworCWlsX3dyX3BycGgoaWwsIEJTTV9EUkFNX0RBVEFfQllURUNPVU5UX1JFRywgZGF0YV9sZW4pOworCisJLyogRmlsbCBCU00gbWVtb3J5IHdpdGggYm9vdHN0cmFwIGluc3RydWN0aW9ucyAqLworCWZvciAocmVnX29mZnNldCA9IEJTTV9TUkFNX0xPV0VSX0JPVU5EOworCSAgICAgcmVnX29mZnNldCA8IEJTTV9TUkFNX0xPV0VSX0JPVU5EICsgbGVuOworCSAgICAgcmVnX29mZnNldCArPSBzaXplb2YodTMyKSwgaW1hZ2UrKykKKwkJX2lsX3dyX3BycGgoaWwsIHJlZ19vZmZzZXQsIGxlMzJfdG9fY3B1KCppbWFnZSkpOworCisJcmV0ID0gaWw0OTY1X3ZlcmlmeV9ic20oaWwpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBUZWxsIEJTTSB0byBjb3B5IGZyb20gQlNNIFNSQU0gaW50byBpbnN0cnVjdGlvbiBTUkFNLCB3aGVuIGFza2VkICovCisJaWxfd3JfcHJwaChpbCwgQlNNX1dSX01FTV9TUkNfUkVHLCAweDApOworCWlsX3dyX3BycGgoaWwsIEJTTV9XUl9NRU1fRFNUX1JFRywgSUw0OV9SVENfSU5TVF9MT1dFUl9CT1VORCk7CisJaWxfd3JfcHJwaChpbCwgQlNNX1dSX0RXQ09VTlRfUkVHLCBsZW4gLyBzaXplb2YodTMyKSk7CisKKwkvKiBMb2FkIGJvb3RzdHJhcCBjb2RlIGludG8gaW5zdHJ1Y3Rpb24gU1JBTSBub3csCisJICogICB0byBwcmVwYXJlIHRvIGxvYWQgImluaXRpYWxpemUiIHVDb2RlICovCisJaWxfd3JfcHJwaChpbCwgQlNNX1dSX0NUUkxfUkVHLCBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUKTsKKworCS8qIFdhaXQgZm9yIGxvYWQgb2YgYm9vdHN0cmFwIHVDb2RlIHRvIGZpbmlzaCAqLworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlkb25lID0gaWxfcmRfcHJwaChpbCwgQlNNX1dSX0NUUkxfUkVHKTsKKwkJaWYgKCEoZG9uZSAmIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQpKQorCQkJYnJlYWs7CisJCXVkZWxheSgxMCk7CisJfQorCWlmIChpIDwgMTAwKQorCQlEX0lORk8oIkJTTSB3cml0ZSBjb21wbGV0ZSwgcG9sbCAlZCBpdGVyYXRpb25zXG4iLCBpKTsKKwllbHNlIHsKKwkJSUxfRVJSKCJCU00gd3JpdGUgZGlkIG5vdCBjb21wbGV0ZSFcbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBFbmFibGUgZnV0dXJlIGJvb3QgbG9hZHMgd2hlbmV2ZXIgcG93ZXIgbWFuYWdlbWVudCB1bml0IHRyaWdnZXJzIGl0CisJICogICAoZS5nLiB3aGVuIHBvd2VyaW5nIGJhY2sgdXAgYWZ0ZXIgcG93ZXItc2F2ZSBzaHV0ZG93bikgKi8KKwlpbF93cl9wcnBoKGlsLCBCU01fV1JfQ1RSTF9SRUcsIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlRfRU4pOworCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogaWw0OTY1X3NldF91Y29kZV9wdHJzIC0gU2V0IHVDb2RlIGFkZHJlc3MgbG9jYXRpb24KKyAqCisgKiBUZWxsIGluaXRpYWxpemF0aW9uIHVDb2RlIHdoZXJlIHRvIGZpbmQgcnVudGltZSB1Q29kZS4KKyAqCisgKiBCU00gcmVnaXN0ZXJzIGluaXRpYWxseSBjb250YWluIHBvaW50ZXJzIHRvIGluaXRpYWxpemF0aW9uIHVDb2RlLgorICogV2UgbmVlZCB0byByZXBsYWNlIHRoZW0gdG8gbG9hZCBydW50aW1lIHVDb2RlIGluc3QgYW5kIGRhdGEsCisgKiBhbmQgdG8gc2F2ZSBydW50aW1lIGRhdGEgd2hlbiBwb3dlcmluZyBkb3duLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfc2V0X3Vjb2RlX3B0cnMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWRtYV9hZGRyX3QgcGluc3Q7CisJZG1hX2FkZHJfdCBwZGF0YTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIGJpdHMgMzU6NCBmb3IgNDk2NSAqLworCXBpbnN0ID0gaWwtPnVjb2RlX2NvZGUucF9hZGRyID4+IDQ7CisJcGRhdGEgPSBpbC0+dWNvZGVfZGF0YV9iYWNrdXAucF9hZGRyID4+IDQ7CisKKwkvKiBUZWxsIGJvb3RzdHJhcCB1Q29kZSB3aGVyZSB0byBmaW5kIGltYWdlIHRvIGxvYWQgKi8KKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9JTlNUX1BUUl9SRUcsIHBpbnN0KTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX1BUUl9SRUcsIHBkYXRhKTsKKwlpbF93cl9wcnBoKGlsLCBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcsIGlsLT51Y29kZV9kYXRhLmxlbik7CisKKwkvKiBJbnN0IGJ5dGUgY291bnQgbXVzdCBiZSBsYXN0IHRvIHNldCB1cCwgYml0IDMxIHNpZ25hbHMgdUNvZGUKKwkgKiAgIHRoYXQgYWxsIG5ldyBwdHIvc2l6ZSBpbmZvIGlzIGluIHBsYWNlICovCisJaWxfd3JfcHJwaChpbCwgQlNNX0RSQU1fSU5TVF9CWVRFQ09VTlRfUkVHLAorCQkgICBpbC0+dWNvZGVfY29kZS5sZW4gfCBCU01fRFJBTV9JTlNUX0xPQUQpOworCURfSU5GTygiUnVudGltZSB1Q29kZSBwb2ludGVycyBhcmUgc2V0LlxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlsNDk2NV9pbml0X2FsaXZlX3N0YXJ0IC0gQ2FsbGVkIGFmdGVyIE5fQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCisgKgorICogQ2FsbGVkIGFmdGVyIE5fQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkIGZyb20gImluaXRpYWxpemUiIHVDb2RlLgorICoKKyAqIFRoZSA0OTY1ICJpbml0aWFsaXplIiBBTElWRSByZXBseSBjb250YWlucyBjYWxpYnJhdGlvbiBkYXRhIGZvcjoKKyAqICAgVm9sdGFnZSwgdGVtcGVyYXR1cmUsIGFuZCBNSU1PIHR4IGdhaW4gY29ycmVjdGlvbiwgbm93IHN0b3JlZCBpbiBpbAorICogICAoMzk0NSBkb2VzIG5vdCBjb250YWluIHRoaXMgZGF0YSkuCisgKgorICogVGVsbCAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gZ28gYWhlYWQgYW5kIGxvYWQgdGhlIHJ1bnRpbWUgdUNvZGUuCisqLworc3RhdGljIHZvaWQKK2lsNDk2NV9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBCb290c3RyYXAgdUNvZGUgaGFzIGxvYWRlZCBpbml0aWFsaXplIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KKwkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQorCSAqICJpbml0aWFsaXplIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KKwlpZiAoaWw0OTY1X3ZlcmlmeV91Y29kZShpbCkpIHsKKwkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7CisJCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJCYWQgXCJpbml0aWFsaXplXCIgdUNvZGUgbG9hZC5cbiIpOworCQlnb3RvIHJlc3RhcnQ7CisJfQorCisJLyogQ2FsY3VsYXRlIHRlbXBlcmF0dXJlICovCisJaWwtPnRlbXBlcmF0dXJlID0gaWw0OTY1X2h3X2dldF90ZW1wZXJhdHVyZShpbCk7CisKKwkvKiBTZW5kIHBvaW50ZXJzIHRvIHByb3RvY29sL3J1bnRpbWUgdUNvZGUgaW1hZ2UgLi4uIGluaXQgY29kZSB3aWxsCisJICogbG9hZCBhbmQgbGF1bmNoIHJ1bnRpbWUgdUNvZGUsIHdoaWNoIHdpbGwgc2VuZCB1cyBhbm90aGVyICJBbGl2ZSIKKwkgKiBub3RpZmljYXRpb24uICovCisJRF9JTkZPKCJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOworCWlmIChpbDQ5NjVfc2V0X3Vjb2RlX3B0cnMoaWwpKSB7CisJCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3b24ndCBoYXBwZW47CisJCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KKwkJRF9JTkZPKCJDb3VsZG4ndCBzZXQgdXAgdUNvZGUgcG9pbnRlcnMuXG4iKTsKKwkJZ290byByZXN0YXJ0OworCX0KKwlyZXR1cm47CisKK3Jlc3RhcnQ6CisJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJlc3RhcnQpOworfQorCitzdGF0aWMgYm9vbAoraXc0OTY1X2lzX2h0NDBfY2hhbm5lbChfX2xlMzIgcnhvbl9mbGFncykKK3sKKwlpbnQgY2hhbl9tb2QgPQorCSAgICBsZTMyX3RvX2NwdShyeG9uX2ZsYWdzICYgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01TSykgPj4KKwkgICAgUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BPUzsKKwlyZXR1cm4gKGNoYW5fbW9kID09IENIQU5ORUxfTU9ERV9QVVJFXzQwIHx8CisJCWNoYW5fbW9kID09IENIQU5ORUxfTU9ERV9NSVhFRCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbDQ5NjVfbmljX2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MTYgcmFkaW9fY2ZnOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlyYWRpb19jZmcgPSBpbF9lZXByb21fcXVlcnkxNihpbCwgRUVQUk9NX1JBRElPX0NPTkZJRyk7CisKKwkvKiB3cml0ZSByYWRpbyBjb25maWcgdmFsdWVzIHRvIHJlZ2lzdGVyICovCisJaWYgKEVFUFJPTV9SRl9DRkdfVFlQRV9NU0socmFkaW9fY2ZnKSA9PSBFRVBST01fNDk2NV9SRl9DRkdfVFlQRV9NQVgpCisJCWlsX3NldF9iaXQoaWwsIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQkJICAgRUVQUk9NX1JGX0NGR19UWVBFX01TSyhyYWRpb19jZmcpIHwKKwkJCSAgIEVFUFJPTV9SRl9DRkdfU1RFUF9NU0socmFkaW9fY2ZnKSB8CisJCQkgICBFRVBST01fUkZfQ0ZHX0RBU0hfTVNLKHJhZGlvX2NmZykpOworCisJLyogc2V0IENTUl9IV19DT05GSUdfUkVHIGZvciB1Q29kZSB1c2UgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX1JBRElPX1NJIHwKKwkJICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX01BQ19TSSk7CisKKwlpbC0+Y2FsaWJfaW5mbyA9CisJICAgIChzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2luZm8gKikKKwkgICAgaWxfZWVwcm9tX3F1ZXJ5X2FkZHIoaWwsIEVFUFJPTV80OTY1X0NBTElCX1RYUE9XRVJfT0ZGU0VUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIFJlc2V0IGRpZmZlcmVudGlhbCBSeCBnYWlucyBpbiBOSUMgdG8gcHJlcGFyZSBmb3IgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24uCisgKiBDYWxsZWQgYWZ0ZXIgZXZlcnkgYXNzb2NpYXRpb24sIGJ1dCB0aGlzIHJ1bnMgb25seSBvbmNlIQorICogIC4uLiBvbmNlIGNoYWluIG5vaXNlIGlzIGNhbGlicmF0ZWQgdGhlIGZpcnN0IHRpbWUsIGl0J3MgZ29vZCBmb3JldmVyLiAgKi8KK3N0YXRpYyB2b2lkCitpbDQ5NjVfY2hhaW5fbm9pc2VfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gJihpbC0+Y2hhaW5fbm9pc2VfZGF0YSk7CisKKwlpZiAoZGF0YS0+c3RhdGUgPT0gSUxfQ0hBSU5fTk9JU0VfQUxJVkUgJiYgaWxfaXNfYW55X2Fzc29jaWF0ZWQoaWwpKSB7CisJCXN0cnVjdCBpbF9jYWxpYl9kaWZmX2dhaW5fY21kIGNtZDsKKworCQkvKiBjbGVhciBkYXRhIGZvciBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbiBhbGdvcml0aG0gKi8KKwkJZGF0YS0+Y2hhaW5fbm9pc2VfYSA9IDA7CisJCWRhdGEtPmNoYWluX25vaXNlX2IgPSAwOworCQlkYXRhLT5jaGFpbl9ub2lzZV9jID0gMDsKKwkJZGF0YS0+Y2hhaW5fc2lnbmFsX2EgPSAwOworCQlkYXRhLT5jaGFpbl9zaWduYWxfYiA9IDA7CisJCWRhdGEtPmNoYWluX3NpZ25hbF9jID0gMDsKKwkJZGF0YS0+YmVhY29uX2NvdW50ID0gMDsKKworCQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCQljbWQuaGRyLm9wX2NvZGUgPSBJTF9QSFlfQ0FMSUJSQVRFX0RJRkZfR0FJTl9DTUQ7CisJCWNtZC5kaWZmX2dhaW5fYSA9IDA7CisJCWNtZC5kaWZmX2dhaW5fYiA9IDA7CisJCWNtZC5kaWZmX2dhaW5fYyA9IDA7CisJCWlmIChpbF9zZW5kX2NtZF9wZHUoaWwsIENfUEhZX0NBTElCUkFUSU9OLCBzaXplb2YoY21kKSwgJmNtZCkpCisJCQlJTF9FUlIoIkNvdWxkIG5vdCBzZW5kIENfUEhZX0NBTElCUkFUSU9OXG4iKTsKKwkJZGF0YS0+c3RhdGUgPSBJTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFOworCQlEX0NBTElCKCJSdW4gY2hhaW5fbm9pc2VfY2FsaWJyYXRlXG4iKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzIGlsNDk2NV9zZW5zaXRpdml0eSA9IHsKKwkubWluX25yZ19jY2sgPSA5NywKKwkubWF4X25yZ19jY2sgPSAwLAkvKiBub3QgdXNlZCwgc2V0IHRvIDAgKi8KKworCS5hdXRvX2NvcnJfbWluX29mZG0gPSA4NSwKKwkuYXV0b19jb3JyX21pbl9vZmRtX21yYyA9IDE3MCwKKwkuYXV0b19jb3JyX21pbl9vZmRtX3gxID0gMTA1LAorCS5hdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxID0gMjIwLAorCisJLmF1dG9fY29ycl9tYXhfb2ZkbSA9IDEyMCwKKwkuYXV0b19jb3JyX21heF9vZmRtX21yYyA9IDIxMCwKKwkuYXV0b19jb3JyX21heF9vZmRtX3gxID0gMTQwLAorCS5hdXRvX2NvcnJfbWF4X29mZG1fbXJjX3gxID0gMjcwLAorCisJLmF1dG9fY29ycl9taW5fY2NrID0gMTI1LAorCS5hdXRvX2NvcnJfbWF4X2NjayA9IDIwMCwKKwkuYXV0b19jb3JyX21pbl9jY2tfbXJjID0gMjAwLAorCS5hdXRvX2NvcnJfbWF4X2Nja19tcmMgPSA0MDAsCisKKwkubnJnX3RoX2NjayA9IDEwMCwKKwkubnJnX3RoX29mZG0gPSAxMDAsCisKKwkuYmFya2VyX2NvcnJfdGhfbWluID0gMTkwLAorCS5iYXJrZXJfY29ycl90aF9taW5fbXJjID0gMzkwLAorCS5ucmdfdGhfY2NhID0gNjIsCit9OworCitzdGF0aWMgdm9pZAoraWw0OTY1X3NldF9jdF90aHJlc2hvbGQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIHdhbnQgS2VsdmluICovCisJaWwtPmh3X3BhcmFtcy5jdF9raWxsX3RocmVzaG9sZCA9CisJICAgIENFTFNJVVNfVE9fS0VMVklOKENUX0tJTExfVEhSRVNIT0xEX0xFR0FDWSk7Cit9CisKKy8qKgorICogaWw0OTY1X2h3X3NldF9od19wYXJhbXMKKyAqCisgKiBDYWxsZWQgd2hlbiBpbml0aWFsaXppbmcgZHJpdmVyCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpZiAoaWwtPmNmZy0+bW9kX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA+PSBJTF9NSU5fTlVNX1FVRVVFUyAmJgorCSAgICBpbC0+Y2ZnLT5tb2RfcGFyYW1zLT5udW1fb2ZfcXVldWVzIDw9IElMNDlfTlVNX1FVRVVFUykKKwkJaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPQorCQkgICAgaWwtPmNmZy0+bW9kX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKworCWlsLT5od19wYXJhbXMubWF4X3R4cV9udW0gPSBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKwlpbC0+aHdfcGFyYW1zLmRtYV9jaG5sX251bSA9IEZINDlfVENTUl9DSE5MX05VTTsKKwlpbC0+aHdfcGFyYW1zLnNjZF9iY190YmxzX3NpemUgPQorCSAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqCisJICAgIHNpemVvZihzdHJ1Y3QgaWw0OTY1X3NjZF9iY190YmwpOworCWlsLT5od19wYXJhbXMudGZkX3NpemUgPSBzaXplb2Yoc3RydWN0IGlsX3RmZCk7CisJaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnMgPSBJTDQ5NjVfU1RBVElPTl9DT1VOVDsKKwlpbC0+Y3R4LmJjYXN0X3N0YV9pZCA9IElMNDk2NV9CUk9BRENBU1RfSUQ7CisJaWwtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplID0gSUw0OV9SVENfREFUQV9TSVpFOworCWlsLT5od19wYXJhbXMubWF4X2luc3Rfc2l6ZSA9IElMNDlfUlRDX0lOU1RfU0laRTsKKwlpbC0+aHdfcGFyYW1zLm1heF9ic21fc2l6ZSA9IEJTTV9TUkFNX1NJWkU7CisJaWwtPmh3X3BhcmFtcy5odDQwX2NoYW5uZWwgPSBCSVQoSUVFRTgwMjExX0JBTkRfNUdIWik7CisKKwlpbC0+aHdfcGFyYW1zLnJ4X3dydF9wdHJfcmVnID0gRkg0OV9SU0NTUl9DSE5MMF9XUFRSOworCisJaWwtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtID0gaWw0OTY1X251bV9vZl9hbnQoaWwtPmNmZy0+dmFsaWRfdHhfYW50KTsKKwlpbC0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW0gPSBpbDQ5NjVfbnVtX29mX2FudChpbC0+Y2ZnLT52YWxpZF9yeF9hbnQpOworCWlsLT5od19wYXJhbXMudmFsaWRfdHhfYW50ID0gaWwtPmNmZy0+dmFsaWRfdHhfYW50OworCWlsLT5od19wYXJhbXMudmFsaWRfcnhfYW50ID0gaWwtPmNmZy0+dmFsaWRfcnhfYW50OworCisJaWw0OTY1X3NldF9jdF90aHJlc2hvbGQoaWwpOworCisJaWwtPmh3X3BhcmFtcy5zZW5zID0gJmlsNDk2NV9zZW5zaXRpdml0eTsKKwlpbC0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzID0gSUw0OTY1X0VYVF9CRUFDT05fVElNRV9QT1M7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHMzMgoraWw0OTY1X21hdGhfZGl2X3JvdW5kKHMzMiBudW0sIHMzMiBkZW5vbSwgczMyICogcmVzKQoreworCXMzMiBzaWduID0gMTsKKworCWlmIChudW0gPCAwKSB7CisJCXNpZ24gPSAtc2lnbjsKKwkJbnVtID0gLW51bTsKKwl9CisJaWYgKGRlbm9tIDwgMCkgeworCQlzaWduID0gLXNpZ247CisJCWRlbm9tID0gLWRlbm9tOworCX0KKwkqcmVzID0gMTsKKwkqcmVzID0gKChudW0gKiAyICsgZGVub20pIC8gKGRlbm9tICogMikpICogc2lnbjsKKworCXJldHVybiAxOworfQorCisvKioKKyAqIGlsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24gLSBQb3dlciBzdXBwbHkgdm9sdGFnZSBjb21wIGZvciB0eHBvd2VyCisgKgorICogRGV0ZXJtaW5lcyBwb3dlciBzdXBwbHkgdm9sdGFnZSBjb21wZW5zYXRpb24gZm9yIHR4cG93ZXIgY2FsY3VsYXRpb25zLgorICogUmV0dXJucyBudW1iZXIgb2YgMS8yLWRCIHN0ZXBzIHRvIHN1YnRyYWN0IGZyb20gZ2FpbiB0YWJsZSBpZHgsCisgKiB0byBjb21wZW5zYXRlIGZvciBkaWZmZXJlbmNlIGJldHdlZW4gcG93ZXIgc3VwcGx5IHZvbHRhZ2UgZHVyaW5nCisgKiBmYWN0b3J5IG1lYXN1cmVtZW50cywgdnMuIGN1cnJlbnQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UuCisgKgorICogVm9sdGFnZSBpbmRpY2F0aW9uIGlzIGhpZ2hlciBmb3IgbG93ZXIgdm9sdGFnZS4KKyAqIExvd2VyIHZvbHRhZ2UgcmVxdWlyZXMgbW9yZSBnYWluIChsb3dlciBnYWluIHRhYmxlIGlkeCkuCisgKi8KK3N0YXRpYyBzMzIKK2lsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24oczMyIGVlcHJvbV92b2x0YWdlLCBzMzIgY3VycmVudF92b2x0YWdlKQoreworCXMzMiBjb21wID0gMDsKKworCWlmIChUWF9QT1dFUl9JTF9JTExFR0FMX1ZPTFRBR0UgPT0gZWVwcm9tX3ZvbHRhZ2UgfHwKKwkgICAgVFhfUE9XRVJfSUxfSUxMRUdBTF9WT0xUQUdFID09IGN1cnJlbnRfdm9sdGFnZSkKKwkJcmV0dXJuIDA7CisKKwlpbDQ5NjVfbWF0aF9kaXZfcm91bmQoY3VycmVudF92b2x0YWdlIC0gZWVwcm9tX3ZvbHRhZ2UsCisJCQkgICAgICBUWF9QT1dFUl9JTF9WT0xUQUdFX0NPREVTX1BFUl8wM1YsICZjb21wKTsKKworCWlmIChjdXJyZW50X3ZvbHRhZ2UgPiBlZXByb21fdm9sdGFnZSkKKwkJY29tcCAqPSAyOworCWlmICgoY29tcCA8IC0yKSB8fCAoY29tcCA+IDIpKQorCQljb21wID0gMDsKKworCXJldHVybiBjb21wOworfQorCitzdGF0aWMgczMyCitpbDQ5NjVfZ2V0X3R4X2F0dGVuX2dycCh1MTYgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JTF9UWF9BVFRFTl9HUjVfRkNIICYmCisJICAgIGNoYW5uZWwgPD0gQ0FMSUJfSUxfVFhfQVRURU5fR1I1X0xDSCkKKwkJcmV0dXJuIENBTElCX0NIX0dST1VQXzU7CisKKwlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JTF9UWF9BVFRFTl9HUjFfRkNIICYmCisJICAgIGNoYW5uZWwgPD0gQ0FMSUJfSUxfVFhfQVRURU5fR1IxX0xDSCkKKwkJcmV0dXJuIENBTElCX0NIX0dST1VQXzE7CisKKwlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JTF9UWF9BVFRFTl9HUjJfRkNIICYmCisJICAgIGNoYW5uZWwgPD0gQ0FMSUJfSUxfVFhfQVRURU5fR1IyX0xDSCkKKwkJcmV0dXJuIENBTElCX0NIX0dST1VQXzI7CisKKwlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JTF9UWF9BVFRFTl9HUjNfRkNIICYmCisJICAgIGNoYW5uZWwgPD0gQ0FMSUJfSUxfVFhfQVRURU5fR1IzX0xDSCkKKwkJcmV0dXJuIENBTElCX0NIX0dST1VQXzM7CisKKwlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JTF9UWF9BVFRFTl9HUjRfRkNIICYmCisJICAgIGNoYW5uZWwgPD0gQ0FMSUJfSUxfVFhfQVRURU5fR1I0X0xDSCkKKwkJcmV0dXJuIENBTElCX0NIX0dST1VQXzQ7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHUzMgoraWw0OTY1X2dldF9zdWJfYmFuZChjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBjaGFubmVsKQoreworCXMzMiBiID0gLTE7CisKKwlmb3IgKGIgPSAwOyBiIDwgRUVQUk9NX1RYX1BPV0VSX0JBTkRTOyBiKyspIHsKKwkJaWYgKGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bYl0uY2hfZnJvbSA9PSAwKQorCQkJY29udGludWU7CisKKwkJaWYgKGNoYW5uZWwgPj0gaWwtPmNhbGliX2luZm8tPmJhbmRfaW5mb1tiXS5jaF9mcm9tICYmCisJCSAgICBjaGFubmVsIDw9IGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bYl0uY2hfdG8pCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gYjsKK30KKworc3RhdGljIHMzMgoraWw0OTY1X2ludGVycG9sYXRlX3ZhbHVlKHMzMiB4LCBzMzIgeDEsIHMzMiB5MSwgczMyIHgyLCBzMzIgeTIpCit7CisJczMyIHZhbDsKKworCWlmICh4MiA9PSB4MSkKKwkJcmV0dXJuIHkxOworCWVsc2UgeworCQlpbDQ5NjVfbWF0aF9kaXZfcm91bmQoKHgyIC0geCkgKiAoeTEgLSB5MiksICh4MiAtIHgxKSwgJnZhbCk7CisJCXJldHVybiB2YWwgKyB5MjsKKwl9Cit9CisKKy8qKgorICogaWw0OTY1X2ludGVycG9sYXRlX2NoYW4gLSBJbnRlcnBvbGF0ZSBmYWN0b3J5IG1lYXN1cmVtZW50cyBmb3Igb25lIGNoYW5uZWwKKyAqCisgKiBJbnRlcnBvbGF0ZXMgZmFjdG9yeSBtZWFzdXJlbWVudHMgZnJvbSB0aGUgdHdvIHNhbXBsZSBjaGFubmVscyB3aXRoaW4gYQorICogc3ViLWJhbmQsIHRvIGFwcGx5IHRvIGNoYW5uZWwgb2YgaW50ZXJlc3QuICBJbnRlcnBvbGF0aW9uIGlzIHByb3BvcnRpb25hbCB0bworICogZGlmZmVyZW5jZXMgaW4gY2hhbm5lbCBmcmVxdWVuY2llcywgd2hpY2ggaXMgcHJvcG9ydGlvbmFsIHRvIGRpZmZlcmVuY2VzCisgKiBpbiBjaGFubmVsIG51bWJlci4KKyAqLworc3RhdGljIGludAoraWw0OTY1X2ludGVycG9sYXRlX2NoYW4oc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgY2hhbm5lbCwKKwkJCXN0cnVjdCBpbF9lZXByb21fY2FsaWJfY2hfaW5mbyAqY2hhbl9pbmZvKQoreworCXMzMiBzID0gLTE7CisJdTMyIGM7CisJdTMyIG07CisJY29uc3Qgc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptMTsKKwljb25zdCBzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX21lYXN1cmUgKm0yOworCXN0cnVjdCBpbF9lZXByb21fY2FsaWJfbWVhc3VyZSAqb21lYXM7CisJdTMyIGNoX2kxOworCXUzMiBjaF9pMjsKKworCXMgPSBpbDQ5NjVfZ2V0X3N1Yl9iYW5kKGlsLCBjaGFubmVsKTsKKwlpZiAocyA+PSBFRVBST01fVFhfUE9XRVJfQkFORFMpIHsKKwkJSUxfRVJSKCJUeCBQb3dlciBjYW4gbm90IGZpbmQgY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisJCXJldHVybiAtMTsKKwl9CisKKwljaF9pMSA9IGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bc10uY2gxLmNoX251bTsKKwljaF9pMiA9IGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bc10uY2gyLmNoX251bTsKKwljaGFuX2luZm8tPmNoX251bSA9ICh1OCkgY2hhbm5lbDsKKworCURfVFhQT1dFUigiY2hhbm5lbCAlZCBzdWJiYW5kICVkIGZhY3RvcnkgY2FsIGNoICVkICYgJWRcbiIsIGNoYW5uZWwsIHMsCisJCSAgY2hfaTEsIGNoX2kyKTsKKworCWZvciAoYyA9IDA7IGMgPCBFRVBST01fVFhfUE9XRVJfVFhfQ0hBSU5TOyBjKyspIHsKKwkJZm9yIChtID0gMDsgbSA8IEVFUFJPTV9UWF9QT1dFUl9NRUFTVVJFTUVOVFM7IG0rKykgeworCQkJbTEgPSAmKGlsLT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bc10uY2gxLgorCQkJICAgICAgIG1lYXN1cmVtZW50c1tjXVttXSk7CisJCQltMiA9ICYoaWwtPmNhbGliX2luZm8tPmJhbmRfaW5mb1tzXS5jaDIuCisJCQkgICAgICAgbWVhc3VyZW1lbnRzW2NdW21dKTsKKwkJCW9tZWFzID0gJihjaGFuX2luZm8tPm1lYXN1cmVtZW50c1tjXVttXSk7CisKKwkJCW9tZWFzLT5hY3R1YWxfcG93ID0KKwkJCSAgICAodTgpIGlsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKKwkJCQkJCQkgIG0xLT5hY3R1YWxfcG93LCBjaF9pMiwKKwkJCQkJCQkgIG0yLT5hY3R1YWxfcG93KTsKKwkJCW9tZWFzLT5nYWluX2lkeCA9CisJCQkgICAgKHU4KSBpbDQ5NjVfaW50ZXJwb2xhdGVfdmFsdWUoY2hhbm5lbCwgY2hfaTEsCisJCQkJCQkJICBtMS0+Z2Fpbl9pZHgsIGNoX2kyLAorCQkJCQkJCSAgbTItPmdhaW5faWR4KTsKKwkJCW9tZWFzLT50ZW1wZXJhdHVyZSA9CisJCQkgICAgKHU4KSBpbDQ5NjVfaW50ZXJwb2xhdGVfdmFsdWUoY2hhbm5lbCwgY2hfaTEsCisJCQkJCQkJICBtMS0+dGVtcGVyYXR1cmUsCisJCQkJCQkJICBjaF9pMiwKKwkJCQkJCQkgIG0yLT50ZW1wZXJhdHVyZSk7CisJCQlvbWVhcy0+cGFfZGV0ID0KKwkJCSAgICAoczgpIGlsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKKwkJCQkJCQkgIG0xLT5wYV9kZXQsIGNoX2kyLAorCQkJCQkJCSAgbTItPnBhX2RldCk7CisKKwkJCURfVFhQT1dFUigiY2hhaW4gJWQgbWVhcyAlZCBBUDE9JWQgQVAyPSVkIEFQPSVkXG4iLCBjLAorCQkJCSAgbSwgbTEtPmFjdHVhbF9wb3csIG0yLT5hY3R1YWxfcG93LAorCQkJCSAgb21lYXMtPmFjdHVhbF9wb3cpOworCQkJRF9UWFBPV0VSKCJjaGFpbiAlZCBtZWFzICVkIE5JMT0lZCBOSTI9JWQgTkk9JWRcbiIsIGMsCisJCQkJICBtLCBtMS0+Z2Fpbl9pZHgsIG0yLT5nYWluX2lkeCwKKwkJCQkgIG9tZWFzLT5nYWluX2lkeCk7CisJCQlEX1RYUE9XRVIoImNoYWluICVkIG1lYXMgJWQgUEExPSVkIFBBMj0lZCBQQT0lZFxuIiwgYywKKwkJCQkgIG0sIG0xLT5wYV9kZXQsIG0yLT5wYV9kZXQsIG9tZWFzLT5wYV9kZXQpOworCQkJRF9UWFBPV0VSKCJjaGFpbiAlZCBtZWFzICVkICBUMT0lZCAgVDI9JWQgIFQ9JWRcbiIsIGMsCisJCQkJICBtLCBtMS0+dGVtcGVyYXR1cmUsIG0yLT50ZW1wZXJhdHVyZSwKKwkJCQkgIG9tZWFzLT50ZW1wZXJhdHVyZSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogYml0LXJhdGUtZGVwZW5kZW50IHRhYmxlIHRvIHByZXZlbnQgVHggZGlzdG9ydGlvbiwgaW4gaGFsZi1kQiB1bml0cywKKyAqIGZvciBPRkRNIDYsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDYwIE1CaXQsIGFuZCBDQ0sgYWxsIHJhdGVzLiAqLworc3RhdGljIHMzMiBiYWNrX29mZl90YWJsZVtdID0geworCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBTSVNPIDIwIE1IeiAqLworCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBNSU1PIDIwIE1IeiAqLworCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBTSVNPIDQwIE1IeiAqLworCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBNSU1PIDQwIE1IeiAqLworCTEwCQkJLyogQ0NLICovCit9OworCisvKiBUaGVybWFsIGNvbXBlbnNhdGlvbiB2YWx1ZXMgZm9yIHR4cG93ZXIgZm9yIHZhcmlvdXMgZnJlcXVlbmN5IHJhbmdlcyAuLi4KKyAqICAgcmF0aW9zIGZyb20gMzoxIHRvIDQuNToxIG9mIGRlZ3JlZXMgKENlbHNpdXMpIHBlciBoYWxmLWRCIGdhaW4gYWRqdXN0ICovCitzdGF0aWMgc3RydWN0IGlsNDk2NV90eHBvd2VyX2NvbXBfZW50cnkgeworCXMzMiBkZWdyZWVzX3Blcl8wNWRiX2E7CisJczMyIGRlZ3JlZXNfcGVyXzA1ZGJfYV9kZW5vbTsKK30gdHhfcG93ZXJfY21wX3RibGVbQ0FMSUJfQ0hfR1JPVVBfTUFYXSA9IHsKKwl7CisJOSwgMn0sCQkJLyogZ3JvdXAgMCA1LjIsIGNoICAzNC00MyAqLworCXsKKwk0LCAxfSwJCQkvKiBncm91cCAxIDUuMiwgY2ggIDQ0LTcwICovCisJeworCTQsIDF9LAkJCS8qIGdyb3VwIDIgNS4yLCBjaCAgNzEtMTI0ICovCisJeworCTQsIDF9LAkJCS8qIGdyb3VwIDMgNS4yLCBjaCAxMjUtMjAwICovCisJeworCTMsIDF9CQkJLyogZ3JvdXAgNCAyLjQsIGNoICAgYWxsICovCit9OworCitzdGF0aWMgczMyCitnZXRfbWluX3Bvd2VyX2lkeChzMzIgcmF0ZV9wb3dlcl9pZHgsIHUzMiBiYW5kKQoreworCWlmICghYmFuZCkgeworCQlpZiAoKHJhdGVfcG93ZXJfaWR4ICYgNykgPD0gNCkKKwkJCXJldHVybiBNSU5fVFhfR0FJTl9JRFhfNTJHSFpfRVhUOworCX0KKwlyZXR1cm4gTUlOX1RYX0dBSU5fSURYOworfQorCitzdHJ1Y3QgZ2Fpbl9lbnRyeSB7CisJdTggZHNwOworCXU4IHJhZGlvOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnYWluX2VudHJ5IGdhaW5fdGFibGVbMl1bMTA4XSA9IHsKKwkvKiA1LjJHSHogcG93ZXIgZ2FpbiBpZHggdGFibGUgKi8KKwl7CisJIHsxMjMsIDB4M0Z9LAkJLyogaGlnaGVzdCB0eHBvd2VyICovCisJIHsxMTcsIDB4M0Z9LAorCSB7MTEwLCAweDNGfSwKKwkgezEwNCwgMHgzRn0sCisJIHs5OCwgMHgzRn0sCisJIHsxMTAsIDB4M0V9LAorCSB7MTA0LCAweDNFfSwKKwkgezk4LCAweDNFfSwKKwkgezExMCwgMHgzRH0sCisJIHsxMDQsIDB4M0R9LAorCSB7OTgsIDB4M0R9LAorCSB7MTEwLCAweDNDfSwKKwkgezEwNCwgMHgzQ30sCisJIHs5OCwgMHgzQ30sCisJIHsxMTAsIDB4M0J9LAorCSB7MTA0LCAweDNCfSwKKwkgezk4LCAweDNCfSwKKwkgezExMCwgMHgzQX0sCisJIHsxMDQsIDB4M0F9LAorCSB7OTgsIDB4M0F9LAorCSB7MTEwLCAweDM5fSwKKwkgezEwNCwgMHgzOX0sCisJIHs5OCwgMHgzOX0sCisJIHsxMTAsIDB4Mzh9LAorCSB7MTA0LCAweDM4fSwKKwkgezk4LCAweDM4fSwKKwkgezExMCwgMHgzN30sCisJIHsxMDQsIDB4Mzd9LAorCSB7OTgsIDB4Mzd9LAorCSB7MTEwLCAweDM2fSwKKwkgezEwNCwgMHgzNn0sCisJIHs5OCwgMHgzNn0sCisJIHsxMTAsIDB4MzV9LAorCSB7MTA0LCAweDM1fSwKKwkgezk4LCAweDM1fSwKKwkgezExMCwgMHgzNH0sCisJIHsxMDQsIDB4MzR9LAorCSB7OTgsIDB4MzR9LAorCSB7MTEwLCAweDMzfSwKKwkgezEwNCwgMHgzM30sCisJIHs5OCwgMHgzM30sCisJIHsxMTAsIDB4MzJ9LAorCSB7MTA0LCAweDMyfSwKKwkgezk4LCAweDMyfSwKKwkgezExMCwgMHgzMX0sCisJIHsxMDQsIDB4MzF9LAorCSB7OTgsIDB4MzF9LAorCSB7MTEwLCAweDMwfSwKKwkgezEwNCwgMHgzMH0sCisJIHs5OCwgMHgzMH0sCisJIHsxMTAsIDB4MjV9LAorCSB7MTA0LCAweDI1fSwKKwkgezk4LCAweDI1fSwKKwkgezExMCwgMHgyNH0sCisJIHsxMDQsIDB4MjR9LAorCSB7OTgsIDB4MjR9LAorCSB7MTEwLCAweDIzfSwKKwkgezEwNCwgMHgyM30sCisJIHs5OCwgMHgyM30sCisJIHsxMTAsIDB4MjJ9LAorCSB7MTA0LCAweDE4fSwKKwkgezk4LCAweDE4fSwKKwkgezExMCwgMHgxN30sCisJIHsxMDQsIDB4MTd9LAorCSB7OTgsIDB4MTd9LAorCSB7MTEwLCAweDE2fSwKKwkgezEwNCwgMHgxNn0sCisJIHs5OCwgMHgxNn0sCisJIHsxMTAsIDB4MTV9LAorCSB7MTA0LCAweDE1fSwKKwkgezk4LCAweDE1fSwKKwkgezExMCwgMHgxNH0sCisJIHsxMDQsIDB4MTR9LAorCSB7OTgsIDB4MTR9LAorCSB7MTEwLCAweDEzfSwKKwkgezEwNCwgMHgxM30sCisJIHs5OCwgMHgxM30sCisJIHsxMTAsIDB4MTJ9LAorCSB7MTA0LCAweDA4fSwKKwkgezk4LCAweDA4fSwKKwkgezExMCwgMHgwN30sCisJIHsxMDQsIDB4MDd9LAorCSB7OTgsIDB4MDd9LAorCSB7MTEwLCAweDA2fSwKKwkgezEwNCwgMHgwNn0sCisJIHs5OCwgMHgwNn0sCisJIHsxMTAsIDB4MDV9LAorCSB7MTA0LCAweDA1fSwKKwkgezk4LCAweDA1fSwKKwkgezExMCwgMHgwNH0sCisJIHsxMDQsIDB4MDR9LAorCSB7OTgsIDB4MDR9LAorCSB7MTEwLCAweDAzfSwKKwkgezEwNCwgMHgwM30sCisJIHs5OCwgMHgwM30sCisJIHsxMTAsIDB4MDJ9LAorCSB7MTA0LCAweDAyfSwKKwkgezk4LCAweDAyfSwKKwkgezExMCwgMHgwMX0sCisJIHsxMDQsIDB4MDF9LAorCSB7OTgsIDB4MDF9LAorCSB7MTEwLCAweDAwfSwKKwkgezEwNCwgMHgwMH0sCisJIHs5OCwgMHgwMH0sCisJIHs5MywgMHgwMH0sCisJIHs4OCwgMHgwMH0sCisJIHs4MywgMHgwMH0sCisJIHs3OCwgMHgwMH0sCisJIH0sCisJLyogMi40R0h6IHBvd2VyIGdhaW4gaWR4IHRhYmxlICovCisJeworCSB7MTEwLCAweDNmfSwJCS8qIGhpZ2hlc3QgdHhwb3dlciAqLworCSB7MTA0LCAweDNmfSwKKwkgezk4LCAweDNmfSwKKwkgezExMCwgMHgzZX0sCisJIHsxMDQsIDB4M2V9LAorCSB7OTgsIDB4M2V9LAorCSB7MTEwLCAweDNkfSwKKwkgezEwNCwgMHgzZH0sCisJIHs5OCwgMHgzZH0sCisJIHsxMTAsIDB4M2N9LAorCSB7MTA0LCAweDNjfSwKKwkgezk4LCAweDNjfSwKKwkgezExMCwgMHgzYn0sCisJIHsxMDQsIDB4M2J9LAorCSB7OTgsIDB4M2J9LAorCSB7MTEwLCAweDNhfSwKKwkgezEwNCwgMHgzYX0sCisJIHs5OCwgMHgzYX0sCisJIHsxMTAsIDB4Mzl9LAorCSB7MTA0LCAweDM5fSwKKwkgezk4LCAweDM5fSwKKwkgezExMCwgMHgzOH0sCisJIHsxMDQsIDB4Mzh9LAorCSB7OTgsIDB4Mzh9LAorCSB7MTEwLCAweDM3fSwKKwkgezEwNCwgMHgzN30sCisJIHs5OCwgMHgzN30sCisJIHsxMTAsIDB4MzZ9LAorCSB7MTA0LCAweDM2fSwKKwkgezk4LCAweDM2fSwKKwkgezExMCwgMHgzNX0sCisJIHsxMDQsIDB4MzV9LAorCSB7OTgsIDB4MzV9LAorCSB7MTEwLCAweDM0fSwKKwkgezEwNCwgMHgzNH0sCisJIHs5OCwgMHgzNH0sCisJIHsxMTAsIDB4MzN9LAorCSB7MTA0LCAweDMzfSwKKwkgezk4LCAweDMzfSwKKwkgezExMCwgMHgzMn0sCisJIHsxMDQsIDB4MzJ9LAorCSB7OTgsIDB4MzJ9LAorCSB7MTEwLCAweDMxfSwKKwkgezEwNCwgMHgzMX0sCisJIHs5OCwgMHgzMX0sCisJIHsxMTAsIDB4MzB9LAorCSB7MTA0LCAweDMwfSwKKwkgezk4LCAweDMwfSwKKwkgezExMCwgMHg2fSwKKwkgezEwNCwgMHg2fSwKKwkgezk4LCAweDZ9LAorCSB7MTEwLCAweDV9LAorCSB7MTA0LCAweDV9LAorCSB7OTgsIDB4NX0sCisJIHsxMTAsIDB4NH0sCisJIHsxMDQsIDB4NH0sCisJIHs5OCwgMHg0fSwKKwkgezExMCwgMHgzfSwKKwkgezEwNCwgMHgzfSwKKwkgezk4LCAweDN9LAorCSB7MTEwLCAweDJ9LAorCSB7MTA0LCAweDJ9LAorCSB7OTgsIDB4Mn0sCisJIHsxMTAsIDB4MX0sCisJIHsxMDQsIDB4MX0sCisJIHs5OCwgMHgxfSwKKwkgezExMCwgMHgwfSwKKwkgezEwNCwgMHgwfSwKKwkgezk4LCAweDB9LAorCSB7OTcsIDB9LAorCSB7OTYsIDB9LAorCSB7OTUsIDB9LAorCSB7OTQsIDB9LAorCSB7OTMsIDB9LAorCSB7OTIsIDB9LAorCSB7OTEsIDB9LAorCSB7OTAsIDB9LAorCSB7ODksIDB9LAorCSB7ODgsIDB9LAorCSB7ODcsIDB9LAorCSB7ODYsIDB9LAorCSB7ODUsIDB9LAorCSB7ODQsIDB9LAorCSB7ODMsIDB9LAorCSB7ODIsIDB9LAorCSB7ODEsIDB9LAorCSB7ODAsIDB9LAorCSB7NzksIDB9LAorCSB7NzgsIDB9LAorCSB7NzcsIDB9LAorCSB7NzYsIDB9LAorCSB7NzUsIDB9LAorCSB7NzQsIDB9LAorCSB7NzMsIDB9LAorCSB7NzIsIDB9LAorCSB7NzEsIDB9LAorCSB7NzAsIDB9LAorCSB7NjksIDB9LAorCSB7NjgsIDB9LAorCSB7NjcsIDB9LAorCSB7NjYsIDB9LAorCSB7NjUsIDB9LAorCSB7NjQsIDB9LAorCSB7NjMsIDB9LAorCSB7NjIsIDB9LAorCSB7NjEsIDB9LAorCSB7NjAsIDB9LAorCSB7NTksIDB9LAorCSB9Cit9OworCitzdGF0aWMgaW50CitpbDQ5NjVfZmlsbF90eHBvd2VyX3RibChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGJhbmQsIHUxNiBjaGFubmVsLCB1OCBpc19odDQwLAorCQkJdTggY3RybF9jaGFuX2hpZ2gsCisJCQlzdHJ1Y3QgaWw0OTY1X3R4X3Bvd2VyX2RiICp0eF9wb3dlcl90YmwpCit7CisJdTggc2F0dXJhdGlvbl9wb3dlcjsKKwlzMzIgdGFyZ2V0X3Bvd2VyOworCXMzMiB1c2VyX3RhcmdldF9wb3dlcjsKKwlzMzIgcG93ZXJfbGltaXQ7CisJczMyIGN1cnJlbnRfdGVtcDsKKwlzMzIgcmVnX2xpbWl0OworCXMzMiBjdXJyZW50X3JlZ3VsYXRvcnk7CisJczMyIHR4YXR0ZW5fZ3JwID0gQ0FMSUJfQ0hfR1JPVVBfTUFYOworCWludCBpOworCWludCBjOworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm8gPSBOVUxMOworCXN0cnVjdCBpbF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaF9lZXByb21faW5mbzsKKwljb25zdCBzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX21lYXN1cmUgKm1lYXN1cmVtZW50OworCXMxNiB2b2x0YWdlOworCXMzMiBpbml0X3ZvbHRhZ2U7CisJczMyIHZvbHRhZ2VfY29tcGVuc2F0aW9uOworCXMzMiBkZWdyZWVzX3Blcl8wNWRiX251bTsKKwlzMzIgZGVncmVlc19wZXJfMDVkYl9kZW5vbTsKKwlzMzIgZmFjdG9yeV90ZW1wOworCXMzMiB0ZW1wZXJhdHVyZV9jb21wWzJdOworCXMzMiBmYWN0b3J5X2dhaW5faWR4WzJdOworCXMzMiBmYWN0b3J5X2FjdHVhbF9wd3JbMl07CisJczMyIHBvd2VyX2lkeDsKKworCS8qIHR4X3Bvd2VyX3VzZXJfbG10IGlzIGluIGRCbSwgY29udmVydCB0byBoYWxmLWRCbSAoaGFsZi1kQiB1bml0cworCSAqICAgYXJlIHVzZWQgZm9yIGlkeGluZyBpbnRvIHR4cG93ZXIgdGFibGUpICovCisJdXNlcl90YXJnZXRfcG93ZXIgPSAyICogaWwtPnR4X3Bvd2VyX3VzZXJfbG10OworCisJLyogR2V0IGN1cnJlbnQgKFJYT04pIGNoYW5uZWwsIGJhbmQsIHdpZHRoICovCisJRF9UWFBPV0VSKCJjaGFuICVkIGJhbmQgJWQgaXNfaHQ0MCAlZFxuIiwgY2hhbm5lbCwgYmFuZCwgaXNfaHQ0MCk7CisKKwljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgaWwtPmJhbmQsIGNoYW5uZWwpOworCisJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIGdldCB0eGF0dGVuIGdyb3VwLCB1c2VkIHRvIHNlbGVjdCAxKSB0aGVybWFsIHR4cG93ZXIgYWRqdXN0bWVudAorCSAqICAgYW5kIDIpIG1pbW8gdHhwb3dlciBiYWxhbmNlIGJldHdlZW4gVHggY2hhaW5zLiAqLworCXR4YXR0ZW5fZ3JwID0gaWw0OTY1X2dldF90eF9hdHRlbl9ncnAoY2hhbm5lbCk7CisJaWYgKHR4YXR0ZW5fZ3JwIDwgMCkgeworCQlJTF9FUlIoIkNhbid0IGZpbmQgdHhhdHRlbiBncm91cCBmb3IgY2hhbm5lbCAlZC5cbiIsIGNoYW5uZWwpOworCQlyZXR1cm4gdHhhdHRlbl9ncnA7CisJfQorCisJRF9UWFBPV0VSKCJjaGFubmVsICVkIGJlbG9uZ3MgdG8gdHhhdHRlbiBncm91cCAlZFxuIiwgY2hhbm5lbCwKKwkJICB0eGF0dGVuX2dycCk7CisKKwlpZiAoaXNfaHQ0MCkgeworCQlpZiAoY3RybF9jaGFuX2hpZ2gpCisJCQljaGFubmVsIC09IDI7CisJCWVsc2UKKwkJCWNoYW5uZWwgKz0gMjsKKwl9CisKKwkvKiBoYXJkd2FyZSB0eHBvd2VyIGxpbWl0cyAuLi4KKwkgKiBzYXR1cmF0aW9uIChjbGlwcGluZyBkaXN0b3J0aW9uKSB0eHBvd2VycyBhcmUgaW4gaGFsZi1kQm0gKi8KKwlpZiAoYmFuZCkKKwkJc2F0dXJhdGlvbl9wb3dlciA9IGlsLT5jYWxpYl9pbmZvLT5zYXR1cmF0aW9uX3Bvd2VyMjQ7CisJZWxzZQorCQlzYXR1cmF0aW9uX3Bvd2VyID0gaWwtPmNhbGliX2luZm8tPnNhdHVyYXRpb25fcG93ZXI1MjsKKworCWlmIChzYXR1cmF0aW9uX3Bvd2VyIDwgSUxfVFhfUE9XRVJfU0FUVVJBVElPTl9NSU4gfHwKKwkgICAgc2F0dXJhdGlvbl9wb3dlciA+IElMX1RYX1BPV0VSX1NBVFVSQVRJT05fTUFYKSB7CisJCWlmIChiYW5kKQorCQkJc2F0dXJhdGlvbl9wb3dlciA9IElMX1RYX1BPV0VSX0RFRkFVTFRfU0FUVVJBVElPTl8yNDsKKwkJZWxzZQorCQkJc2F0dXJhdGlvbl9wb3dlciA9IElMX1RYX1BPV0VSX0RFRkFVTFRfU0FUVVJBVElPTl81MjsKKwl9CisKKwkvKiByZWd1bGF0b3J5IHR4cG93ZXIgbGltaXRzIC4uLiByZWdfbGltaXQgdmFsdWVzIGFyZSBpbiBoYWxmLWRCbSwKKwkgKiAgIG1heF9wb3dlcl9hdmcgdmFsdWVzIGFyZSBpbiBkQm0sIGNvbnZlcnQgKiAyICovCisJaWYgKGlzX2h0NDApCisJCXJlZ19saW1pdCA9IGNoX2luZm8tPmh0NDBfbWF4X3Bvd2VyX2F2ZyAqIDI7CisJZWxzZQorCQlyZWdfbGltaXQgPSBjaF9pbmZvLT5tYXhfcG93ZXJfYXZnICogMjsKKworCWlmICgocmVnX2xpbWl0IDwgSUxfVFhfUE9XRVJfUkVHVUxBVE9SWV9NSU4pIHx8CisJICAgIChyZWdfbGltaXQgPiBJTF9UWF9QT1dFUl9SRUdVTEFUT1JZX01BWCkpIHsKKwkJaWYgKGJhbmQpCisJCQlyZWdfbGltaXQgPSBJTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfMjQ7CisJCWVsc2UKKwkJCXJlZ19saW1pdCA9IElMX1RYX1BPV0VSX0RFRkFVTFRfUkVHVUxBVE9SWV81MjsKKwl9CisKKwkvKiBJbnRlcnBvbGF0ZSB0eHBvd2VyIGNhbGlicmF0aW9uIHZhbHVlcyBmb3IgdGhpcyBjaGFubmVsLAorCSAqICAgYmFzZWQgb24gZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZXN0cyBvbiBzcGFjZWQgY2hhbm5lbHMuICovCisJaWw0OTY1X2ludGVycG9sYXRlX2NoYW4oaWwsIGNoYW5uZWwsICZjaF9lZXByb21faW5mbyk7CisKKwkvKiBjYWxjdWxhdGUgdHggZ2FpbiBhZGp1c3RtZW50IGJhc2VkIG9uIHBvd2VyIHN1cHBseSB2b2x0YWdlICovCisJdm9sdGFnZSA9IGxlMTZfdG9fY3B1KGlsLT5jYWxpYl9pbmZvLT52b2x0YWdlKTsKKwlpbml0X3ZvbHRhZ2UgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnZvbHRhZ2UpOworCXZvbHRhZ2VfY29tcGVuc2F0aW9uID0KKwkgICAgaWw0OTY1X2dldF92b2x0YWdlX2NvbXBlbnNhdGlvbih2b2x0YWdlLCBpbml0X3ZvbHRhZ2UpOworCisJRF9UWFBPV0VSKCJjdXJyIHZvbHQgJWQgZWVwcm9tIHZvbHQgJWQgdm9sdCBjb21wICVkXG4iLCBpbml0X3ZvbHRhZ2UsCisJCSAgdm9sdGFnZSwgdm9sdGFnZV9jb21wZW5zYXRpb24pOworCisJLyogZ2V0IGN1cnJlbnQgdGVtcGVyYXR1cmUgKENlbHNpdXMpICovCisJY3VycmVudF90ZW1wID0gbWF4KGlsLT50ZW1wZXJhdHVyZSwgSUxfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUlOKTsKKwljdXJyZW50X3RlbXAgPSBtaW4oaWwtPnRlbXBlcmF0dXJlLCBJTF9UWF9QT1dFUl9URU1QRVJBVFVSRV9NQVgpOworCWN1cnJlbnRfdGVtcCA9IEtFTFZJTl9UT19DRUxTSVVTKGN1cnJlbnRfdGVtcCk7CisKKwkvKiBzZWxlY3QgdGhlcm1hbCB0eHBvd2VyIGFkanVzdG1lbnQgcGFyYW1zLCBiYXNlZCBvbiBjaGFubmVsIGdyb3VwCisJICogICAoc2FtZSBmcmVxdWVuY3kgZ3JvdXAgdXNlZCBmb3IgbWltbyB0eGF0dGVuIGFkanVzdG1lbnQpICovCisJZGVncmVlc19wZXJfMDVkYl9udW0gPQorCSAgICB0eF9wb3dlcl9jbXBfdGJsZVt0eGF0dGVuX2dycF0uZGVncmVlc19wZXJfMDVkYl9hOworCWRlZ3JlZXNfcGVyXzA1ZGJfZGVub20gPQorCSAgICB0eF9wb3dlcl9jbXBfdGJsZVt0eGF0dGVuX2dycF0uZGVncmVlc19wZXJfMDVkYl9hX2Rlbm9tOworCisJLyogZ2V0IHBlci1jaGFpbiB0eHBvd2VyIHZhbHVlcyBmcm9tIGZhY3RvcnkgbWVhc3VyZW1lbnRzICovCisJZm9yIChjID0gMDsgYyA8IDI7IGMrKykgeworCQltZWFzdXJlbWVudCA9ICZjaF9lZXByb21faW5mby5tZWFzdXJlbWVudHNbY11bMV07CisKKwkJLyogdHhnYWluIGFkanVzdG1lbnQgKGluIGhhbGYtZEIgc3RlcHMpIGJhc2VkIG9uIGRpZmZlcmVuY2UKKwkJICogICBiZXR3ZWVuIGZhY3RvcnkgYW5kIGN1cnJlbnQgdGVtcGVyYXR1cmUgKi8KKwkJZmFjdG9yeV90ZW1wID0gbWVhc3VyZW1lbnQtPnRlbXBlcmF0dXJlOworCQlpbDQ5NjVfbWF0aF9kaXZfcm91bmQoKGN1cnJlbnRfdGVtcCAtCisJCQkJICAgICAgIGZhY3RvcnlfdGVtcCkgKiBkZWdyZWVzX3Blcl8wNWRiX2Rlbm9tLAorCQkJCSAgICAgIGRlZ3JlZXNfcGVyXzA1ZGJfbnVtLAorCQkJCSAgICAgICZ0ZW1wZXJhdHVyZV9jb21wW2NdKTsKKworCQlmYWN0b3J5X2dhaW5faWR4W2NdID0gbWVhc3VyZW1lbnQtPmdhaW5faWR4OworCQlmYWN0b3J5X2FjdHVhbF9wd3JbY10gPSBtZWFzdXJlbWVudC0+YWN0dWFsX3BvdzsKKworCQlEX1RYUE9XRVIoImNoYWluID0gJWRcbiIsIGMpOworCQlEX1RYUE9XRVIoImZjdHJ5IHRtcCAlZCwgIiAiY3VyciB0bXAgJWQsIGNvbXAgJWQgc3RlcHNcbiIsCisJCQkgIGZhY3RvcnlfdGVtcCwgY3VycmVudF90ZW1wLCB0ZW1wZXJhdHVyZV9jb21wW2NdKTsKKworCQlEX1RYUE9XRVIoImZjdHJ5IGlkeCAlZCwgZmN0cnkgcHdyICVkXG4iLCBmYWN0b3J5X2dhaW5faWR4W2NdLAorCQkJICBmYWN0b3J5X2FjdHVhbF9wd3JbY10pOworCX0KKworCS8qIGZvciBlYWNoIG9mIDMzIGJpdC1yYXRlcyAoaW5jbHVkaW5nIDEgZm9yIENDSykgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUE9XRVJfVEJMX05VTV9FTlRSSUVTOyBpKyspIHsKKwkJdTggaXNfbWltb19yYXRlOworCQl1bmlvbiBpbDQ5NjVfdHhfcG93ZXJfZHVhbF9zdHJlYW0gdHhfcG93ZXI7CisKKwkJLyogZm9yIG1pbW8sIHJlZHVjZSBlYWNoIGNoYWluJ3MgdHhwb3dlciBieSBoYWxmCisJCSAqICgzZEIsIDYgc3RlcHMpLCBzbyB0b3RhbCBvdXRwdXQgcG93ZXIgaXMgcmVndWxhdG9yeQorCQkgKiBjb21wbGlhbnQuICovCisJCWlmIChpICYgMHg4KSB7CisJCQljdXJyZW50X3JlZ3VsYXRvcnkgPQorCQkJICAgIHJlZ19saW1pdCAtCisJCQkgICAgSUxfVFhfUE9XRVJfTUlNT19SRUdVTEFUT1JZX0NPTVBFTlNBVElPTjsKKwkJCWlzX21pbW9fcmF0ZSA9IDE7CisJCX0gZWxzZSB7CisJCQljdXJyZW50X3JlZ3VsYXRvcnkgPSByZWdfbGltaXQ7CisJCQlpc19taW1vX3JhdGUgPSAwOworCQl9CisKKwkJLyogZmluZCB0eHBvd2VyIGxpbWl0LCBlaXRoZXIgaGFyZHdhcmUgb3IgcmVndWxhdG9yeSAqLworCQlwb3dlcl9saW1pdCA9IHNhdHVyYXRpb25fcG93ZXIgLSBiYWNrX29mZl90YWJsZVtpXTsKKwkJaWYgKHBvd2VyX2xpbWl0ID4gY3VycmVudF9yZWd1bGF0b3J5KQorCQkJcG93ZXJfbGltaXQgPSBjdXJyZW50X3JlZ3VsYXRvcnk7CisKKwkJLyogcmVkdWNlIHVzZXIncyB0eHBvd2VyIHJlcXVlc3QgaWYgbmVjZXNzYXJ5CisJCSAqIGZvciB0aGlzIHJhdGUgb24gdGhpcyBjaGFubmVsICovCisJCXRhcmdldF9wb3dlciA9IHVzZXJfdGFyZ2V0X3Bvd2VyOworCQlpZiAodGFyZ2V0X3Bvd2VyID4gcG93ZXJfbGltaXQpCisJCQl0YXJnZXRfcG93ZXIgPSBwb3dlcl9saW1pdDsKKworCQlEX1RYUE9XRVIoInJhdGUgJWQgc2F0ICVkIHJlZyAlZCB1c3IgJWQgdGd0ICVkXG4iLCBpLAorCQkJICBzYXR1cmF0aW9uX3Bvd2VyIC0gYmFja19vZmZfdGFibGVbaV0sCisJCQkgIGN1cnJlbnRfcmVndWxhdG9yeSwgdXNlcl90YXJnZXRfcG93ZXIsIHRhcmdldF9wb3dlcik7CisKKwkJLyogZm9yIGVhY2ggb2YgMiBUeCBjaGFpbnMgKHJhZGlvIHRyYW5zbWl0dGVycykgKi8KKwkJZm9yIChjID0gMDsgYyA8IDI7IGMrKykgeworCQkJczMyIGF0dGVuX3ZhbHVlOworCisJCQlpZiAoaXNfbWltb19yYXRlKQorCQkJCWF0dGVuX3ZhbHVlID0KKwkJCQkgICAgKHMzMikgbGUzMl90b19jcHUoaWwtPmNhcmRfYWxpdmVfaW5pdC4KKwkJCQkJCSAgICAgIHR4X2F0dGVuW3R4YXR0ZW5fZ3JwXVtjXSk7CisJCQllbHNlCisJCQkJYXR0ZW5fdmFsdWUgPSAwOworCisJCQkvKiBjYWxjdWxhdGUgaWR4OyBoaWdoZXIgaWR4IG1lYW5zIGxvd2VyIHR4cG93ZXIgKi8KKwkJCXBvd2VyX2lkeCA9CisJCQkgICAgKHU4KSAoZmFjdG9yeV9nYWluX2lkeFtjXSAtCisJCQkJICAodGFyZ2V0X3Bvd2VyIC0gZmFjdG9yeV9hY3R1YWxfcHdyW2NdKSAtCisJCQkJICB0ZW1wZXJhdHVyZV9jb21wW2NdIC0gdm9sdGFnZV9jb21wZW5zYXRpb24gKworCQkJCSAgYXR0ZW5fdmFsdWUpOworCisvKgkJCURfVFhQT1dFUigiY2FsY3VsYXRlZCB0eHBvd2VyIGlkeCAlZFxuIiwKKwkJCQkJCXBvd2VyX2lkeCk7ICovCisKKwkJCWlmIChwb3dlcl9pZHggPCBnZXRfbWluX3Bvd2VyX2lkeChpLCBiYW5kKSkKKwkJCQlwb3dlcl9pZHggPSBnZXRfbWluX3Bvd2VyX2lkeChpLCBiYW5kKTsKKworCQkJLyogYWRqdXN0IDUgR0h6IGlkeCB0byBzdXBwb3J0IG5lZ2F0aXZlIGlkeGVzICovCisJCQlpZiAoIWJhbmQpCisJCQkJcG93ZXJfaWR4ICs9IDk7CisKKwkJCS8qIENDSywgcmF0ZSAzMiwgcmVkdWNlIHR4cG93ZXIgZm9yIENDSyAqLworCQkJaWYgKGkgPT0gUE9XRVJfVEJMX0NDS19FTlRSWSkKKwkJCQlwb3dlcl9pZHggKz0KKwkJCQkgICAgSUxfVFhfUE9XRVJfQ0NLX0NPTVBFTlNBVElPTl9DX1NURVA7CisKKwkJCS8qIHN0YXkgd2l0aGluIHRoZSB0YWJsZSEgKi8KKwkJCWlmIChwb3dlcl9pZHggPiAxMDcpIHsKKwkJCQlJTF9XQVJOKCJ0eHBvd2VyIGlkeCAlZCA+IDEwN1xuIiwgcG93ZXJfaWR4KTsKKwkJCQlwb3dlcl9pZHggPSAxMDc7CisJCQl9CisJCQlpZiAocG93ZXJfaWR4IDwgMCkgeworCQkJCUlMX1dBUk4oInR4cG93ZXIgaWR4ICVkIDwgMFxuIiwgcG93ZXJfaWR4KTsKKwkJCQlwb3dlcl9pZHggPSAwOworCQkJfQorCisJCQkvKiBmaWxsIHR4cG93ZXIgY29tbWFuZCBmb3IgdGhpcyByYXRlL2NoYWluICovCisJCQl0eF9wb3dlci5zLnJhZGlvX3R4X2dhaW5bY10gPQorCQkJICAgIGdhaW5fdGFibGVbYmFuZF1bcG93ZXJfaWR4XS5yYWRpbzsKKwkJCXR4X3Bvd2VyLnMuZHNwX3ByZWRpc19hdHRlbltjXSA9CisJCQkgICAgZ2Fpbl90YWJsZVtiYW5kXVtwb3dlcl9pZHhdLmRzcDsKKworCQkJRF9UWFBPV0VSKCJjaGFpbiAlZCBtaW1vICVkIGlkeCAlZCAiCisJCQkJICAiZ2FpbiAweCUwMnggZHNwICVkXG4iLCBjLCBhdHRlbl92YWx1ZSwKKwkJCQkgIHBvd2VyX2lkeCwgdHhfcG93ZXIucy5yYWRpb190eF9nYWluW2NdLAorCQkJCSAgdHhfcG93ZXIucy5kc3BfcHJlZGlzX2F0dGVuW2NdKTsKKwkJfQkJLyogZm9yIGVhY2ggY2hhaW4gKi8KKworCQl0eF9wb3dlcl90YmwtPnBvd2VyX3RibFtpXS5kdyA9IGNwdV90b19sZTMyKHR4X3Bvd2VyLmR3KTsKKworCX0JCQkvKiBmb3IgZWFjaCByYXRlICovCisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbDQ5NjVfc2VuZF90eF9wb3dlciAtIENvbmZpZ3VyZSB0aGUgVFhQT1dFUiBsZXZlbCB1c2VyIGxpbWl0CisgKgorICogVXNlcyB0aGUgYWN0aXZlIFJYT04gZm9yIGNoYW5uZWwsIGJhbmQsIGFuZCBjaGFyYWN0ZXJpc3RpY3MgKGh0NDAsIGhpZ2gpCisgKiBUaGUgcG93ZXIgbGltaXQgaXMgdGFrZW4gZnJvbSBpbC0+dHhfcG93ZXJfdXNlcl9sbXQuCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV9zZW5kX3R4X3Bvd2VyKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWw0OTY1X3R4cG93ZXJ0YWJsZV9jbWQgY21kID0geyAwIH07CisJaW50IHJldDsKKwl1OCBiYW5kID0gMDsKKwlib29sIGlzX2h0NDAgPSBmYWxzZTsKKwl1OCBjdHJsX2NoYW5faGlnaCA9IDA7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlpZiAoV0FSTl9PTkNFCisJICAgICh0ZXN0X2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKSwKKwkgICAgICJUWCBQb3dlciByZXF1ZXN0ZWQgd2hpbGUgc2Nhbm5pbmchXG4iKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwliYW5kID0gaWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWjsKKworCWlzX2h0NDAgPSBpdzQ5NjVfaXNfaHQ0MF9jaGFubmVsKGN0eC0+YWN0aXZlLmZsYWdzKTsKKworCWlmIChpc19odDQwICYmIChjdHgtPmFjdGl2ZS5mbGFncyAmIFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLKSkKKwkJY3RybF9jaGFuX2hpZ2ggPSAxOworCisJY21kLmJhbmQgPSBiYW5kOworCWNtZC5jaGFubmVsID0gY3R4LT5hY3RpdmUuY2hhbm5lbDsKKworCXJldCA9CisJICAgIGlsNDk2NV9maWxsX3R4cG93ZXJfdGJsKGlsLCBiYW5kLCBsZTE2X3RvX2NwdShjdHgtPmFjdGl2ZS5jaGFubmVsKSwKKwkJCQkgICAgaXNfaHQ0MCwgY3RybF9jaGFuX2hpZ2gsICZjbWQudHhfcG93ZXIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJcmV0ID0gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1RYX1BXUl9UQkwsIHNpemVvZihjbWQpLCAmY21kKTsKKworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9zZW5kX3J4b25fYXNzb2Moc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGlsNDk2NV9yeG9uX2Fzc29jX2NtZCByeG9uX2Fzc29jOworCWNvbnN0IHN0cnVjdCBpbF9yeG9uX2NtZCAqcnhvbjEgPSAmY3R4LT5zdGFnaW5nOworCWNvbnN0IHN0cnVjdCBpbF9yeG9uX2NtZCAqcnhvbjIgPSAmY3R4LT5hY3RpdmU7CisKKwlpZiAocnhvbjEtPmZsYWdzID09IHJ4b24yLT5mbGFncyAmJgorCSAgICByeG9uMS0+ZmlsdGVyX2ZsYWdzID09IHJ4b24yLT5maWx0ZXJfZmxhZ3MgJiYKKwkgICAgcnhvbjEtPmNja19iYXNpY19yYXRlcyA9PSByeG9uMi0+Y2NrX2Jhc2ljX3JhdGVzICYmCisJICAgIHJ4b24xLT5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgPT0KKwkgICAgcnhvbjItPm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcyAmJgorCSAgICByeG9uMS0+b2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyA9PQorCSAgICByeG9uMi0+b2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyAmJgorCSAgICByeG9uMS0+cnhfY2hhaW4gPT0gcnhvbjItPnJ4X2NoYWluICYmCisJICAgIHJ4b24xLT5vZmRtX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5vZmRtX2Jhc2ljX3JhdGVzKSB7CisJCURfSU5GTygiVXNpbmcgY3VycmVudCBSWE9OX0FTU09DLiAgTm90IHJlc2VuZGluZy5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyeG9uX2Fzc29jLmZsYWdzID0gY3R4LT5zdGFnaW5nLmZsYWdzOworCXJ4b25fYXNzb2MuZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKKwlyeG9uX2Fzc29jLm9mZG1fYmFzaWNfcmF0ZXMgPSBjdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlczsKKwlyeG9uX2Fzc29jLmNja19iYXNpY19yYXRlcyA9IGN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXM7CisJcnhvbl9hc3NvYy5yZXNlcnZlZCA9IDA7CisJcnhvbl9hc3NvYy5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgPQorCSAgICBjdHgtPnN0YWdpbmcub2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOworCXJ4b25fYXNzb2Mub2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyA9CisJICAgIGN0eC0+c3RhZ2luZy5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzOworCXJ4b25fYXNzb2MucnhfY2hhaW5fc2VsZWN0X2ZsYWdzID0gY3R4LT5zdGFnaW5nLnJ4X2NoYWluOworCisJcmV0ID0KKwkgICAgaWxfc2VuZF9jbWRfcGR1X2FzeW5jKGlsLCBDX1JYT05fQVNTT0MsIHNpemVvZihyeG9uX2Fzc29jKSwKKwkJCQkgICZyeG9uX2Fzc29jLCBOVUxMKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9jb21taXRfcnhvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwkvKiBjYXN0IGF3YXkgdGhlIGNvbnN0IGZvciBhY3RpdmVfcnhvbiBpbiB0aGlzIGZ1bmN0aW9uICovCisJc3RydWN0IGlsX3J4b25fY21kICphY3RpdmVfcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOworCWludCByZXQ7CisJYm9vbCBuZXdfYXNzb2MgPSAhIShjdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfQVNTT0NfTVNLKTsKKworCWlmICghaWxfaXNfYWxpdmUoaWwpKQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCFjdHgtPmlzX2FjdGl2ZSkKKwkJcmV0dXJuIDA7CisKKwkvKiBhbHdheXMgZ2V0IHRpbWVzdGFtcCB3aXRoIFJ4IGZyYW1lICovCisJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1RTRjJIT1NUX01TSzsKKworCXJldCA9IGlsX2NoZWNrX3J4b25fY21kKGlsLCBjdHgpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJJbnZhbGlkIFJYT04gY29uZmlndXJhdGlvbi4gIE5vdCBjb21taXR0aW5nLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogcmVjZWl2ZSBjb21taXRfcnhvbiByZXF1ZXN0CisJICogYWJvcnQgYW55IHByZXZpb3VzIGNoYW5uZWwgc3dpdGNoIGlmIHN0aWxsIGluIHByb2Nlc3MKKwkgKi8KKwlpZiAodGVzdF9iaXQoU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmaWwtPnN0YXR1cykgJiYKKwkgICAgaWwtPnN3aXRjaF9jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSB7CisJCURfMTFIKCJhYm9ydCBjaGFubmVsIHN3aXRjaCBvbiAlZFxuIiwKKwkJICAgICAgbGUxNl90b19jcHUoaWwtPnN3aXRjaF9jaGFubmVsKSk7CisJCWlsX2Noc3dpdGNoX2RvbmUoaWwsIGZhbHNlKTsKKwl9CisKKwkvKiBJZiB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgYSBmdWxsIFJYT04sIHdlIGNhbiB1c2UKKwkgKiBpbF9yeG9uX2Fzc29jX2NtZCB3aGljaCBpcyB1c2VkIHRvIHJlY29uZmlndXJlIGZpbHRlcgorCSAqIGFuZCBvdGhlciBmbGFncyBmb3IgdGhlIGN1cnJlbnQgcmFkaW8gY29uZmlndXJhdGlvbi4gKi8KKwlpZiAoIWlsX2Z1bGxfcnhvbl9yZXF1aXJlZChpbCwgY3R4KSkgeworCQlyZXQgPSBpbF9zZW5kX3J4b25fYXNzb2MoaWwsIGN0eCk7CisJCWlmIChyZXQpIHsKKwkJCUlMX0VSUigiRXJyb3Igc2V0dGluZyBSWE9OX0FTU09DICglZClcbiIsIHJldCk7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJbWVtY3B5KGFjdGl2ZV9yeG9uLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoKmFjdGl2ZV9yeG9uKSk7CisJCWlsX3ByaW50X3J4X2NvbmZpZ19jbWQoaWwsIGN0eCk7CisJCS8qCisJCSAqIFdlIGRvIG5vdCBjb21taXQgdHggcG93ZXIgc2V0dGluZ3Mgd2hpbGUgY2hhbm5lbCBjaGFuZ2luZywKKwkJICogZG8gaXQgbm93IGlmIHR4IHBvd2VyIGNoYW5nZWQuCisJCSAqLworCQlpbF9zZXRfdHhfcG93ZXIoaWwsIGlsLT50eF9wb3dlcl9uZXh0LCBmYWxzZSk7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIHdlIGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBhbmQgdGhlIG5ldyBjb25maWcgcmVxdWlyZXMKKwkgKiBhbiBSWE9OX0FTU09DIGFuZCB0aGUgbmV3IGNvbmZpZyB3YW50cyB0aGUgYXNzb2NpYXRlZCBtYXNrIGVuYWJsZWQsCisJICogd2UgbXVzdCBjbGVhciB0aGUgYXNzb2NpYXRlZCBmcm9tIHRoZSBhY3RpdmUgY29uZmlndXJhdGlvbgorCSAqIGJlZm9yZSB3ZSBhcHBseSB0aGUgbmV3IGNvbmZpZyAqLworCWlmIChpbF9pc19hc3NvY2lhdGVkX2N0eChjdHgpICYmIG5ld19hc3NvYykgeworCQlEX0lORk8oIlRvZ2dsaW5nIGFzc29jaWF0ZWQgYml0IG9uIGN1cnJlbnQgUlhPTlxuIik7CisJCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKKworCQlyZXQgPQorCQkgICAgaWxfc2VuZF9jbWRfcGR1KGlsLCBjdHgtPnJ4b25fY21kLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGlsX3J4b25fY21kKSwgYWN0aXZlX3J4b24pOworCisJCS8qIElmIHRoZSBtYXNrIGNsZWFyaW5nIGZhaWxlZCB0aGVuIHdlIHNldAorCQkgKiBhY3RpdmVfcnhvbiBiYWNrIHRvIHdoYXQgaXQgd2FzIHByZXZpb3VzbHkgKi8KKwkJaWYgKHJldCkgeworCQkJYWN0aXZlX3J4b24tPmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJCQlJTF9FUlIoIkVycm9yIGNsZWFyaW5nIEFTU09DX01TSyAoJWQpXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyhpbCwgY3R4KTsKKwkJaWxfcmVzdG9yZV9zdGF0aW9ucyhpbCwgY3R4KTsKKwkJcmV0ID0gaWw0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhpbCwgY3R4KTsKKwkJaWYgKHJldCkgeworCQkJSUxfRVJSKCJGYWlsZWQgdG8gcmVzdG9yZSBXRVAga2V5cyAoJWQpXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCURfSU5GTygiU2VuZGluZyBSWE9OXG4iICIqIHdpdGglcyBSWE9OX0ZJTFRFUl9BU1NPQ19NU0tcbiIKKwkgICAgICAgIiogY2hhbm5lbCA9ICVkXG4iICIqIGJzc2lkID0gJXBNXG4iLCAobmV3X2Fzc29jID8gIiIgOiAib3V0IiksCisJICAgICAgIGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSwgY3R4LT5zdGFnaW5nLmJzc2lkX2FkZHIpOworCisJaWxfc2V0X3J4b25faHdjcnlwdG8oaWwsIGN0eCwgIWlsLT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0byk7CisKKwkvKiBBcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KKwkgKiBSWE9OIHVuYXNzb2MgY2xlYXJzIHRoZSBzdGF0aW9uIHRhYmxlIGluIHVDb2RlIHNvIHJlc3RvcmF0aW9uIG9mCisJICogc3RhdGlvbnMgaXMgbmVlZGVkIGFmdGVyIGl0ICh0aGUgUlhPTiBjb21tYW5kKSBjb21wbGV0ZXMKKwkgKi8KKwlpZiAoIW5ld19hc3NvYykgeworCQlyZXQgPQorCQkgICAgaWxfc2VuZF9jbWRfcGR1KGlsLCBjdHgtPnJ4b25fY21kLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGlsX3J4b25fY21kKSwgJmN0eC0+c3RhZ2luZyk7CisJCWlmIChyZXQpIHsKKwkJCUlMX0VSUigiRXJyb3Igc2V0dGluZyBuZXcgUlhPTiAoJWQpXG4iLCByZXQpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCQlEX0lORk8oIlJldHVybiBmcm9tICFuZXdfYXNzb2MgUlhPTi5cbiIpOworCQltZW1jcHkoYWN0aXZlX3J4b24sICZjdHgtPnN0YWdpbmcsIHNpemVvZigqYWN0aXZlX3J4b24pKTsKKwkJaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMoaWwsIGN0eCk7CisJCWlsX3Jlc3RvcmVfc3RhdGlvbnMoaWwsIGN0eCk7CisJCXJldCA9IGlsNDk2NV9yZXN0b3JlX2RlZmF1bHRfd2VwX2tleXMoaWwsIGN0eCk7CisJCWlmIChyZXQpIHsKKwkJCUlMX0VSUigiRmFpbGVkIHRvIHJlc3RvcmUgV0VQIGtleXMgKCVkKVxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJaWYgKG5ld19hc3NvYykgeworCQlpbC0+c3RhcnRfY2FsaWIgPSAwOworCQkvKiBBcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KKwkJICogUlhPTiBhc3NvYyBkb2Vzbid0IGNsZWFyIHRoZSBzdGF0aW9uIHRhYmxlIGluIHVDb2RlLAorCQkgKi8KKwkJcmV0ID0KKwkJICAgIGlsX3NlbmRfY21kX3BkdShpbCwgY3R4LT5yeG9uX2NtZCwKKwkJCQkgICAgc2l6ZW9mKHN0cnVjdCBpbF9yeG9uX2NtZCksICZjdHgtPnN0YWdpbmcpOworCQlpZiAocmV0KSB7CisJCQlJTF9FUlIoIkVycm9yIHNldHRpbmcgbmV3IFJYT04gKCVkKVxuIiwgcmV0KTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwkJbWVtY3B5KGFjdGl2ZV9yeG9uLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoKmFjdGl2ZV9yeG9uKSk7CisJfQorCWlsX3ByaW50X3J4X2NvbmZpZ19jbWQoaWwsIGN0eCk7CisKKwlpbDQ5NjVfaW5pdF9zZW5zaXRpdml0eShpbCk7CisKKwkvKiBJZiB3ZSBpc3N1ZSBhIG5ldyBSWE9OIGNvbW1hbmQgd2hpY2ggcmVxdWlyZWQgYSB0dW5lIHRoZW4gd2UgbXVzdAorCSAqIHNlbmQgYSBuZXcgVFhQT1dFUiBjb21tYW5kIG9yIHdlIHdvbid0IGJlIGFibGUgdG8gVHggYW55IGZyYW1lcyAqLworCXJldCA9IGlsX3NldF90eF9wb3dlcihpbCwgaWwtPnR4X3Bvd2VyX25leHQsIHRydWUpOworCWlmIChyZXQpIHsKKwkJSUxfRVJSKCJFcnJvciBzZW5kaW5nIFRYIHBvd2VyICglZClcbiIsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2lsNDk2NV9od19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCWludCByYzsKKwl1OCBiYW5kID0gMDsKKwlib29sIGlzX2h0NDAgPSBmYWxzZTsKKwl1OCBjdHJsX2NoYW5faGlnaCA9IDA7CisJc3RydWN0IGlsNDk2NV9jaGFubmVsX3N3aXRjaF9jbWQgY21kOworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm87CisJdTMyIHN3aXRjaF90aW1lX2luX3VzZWMsIHVjb2RlX3N3aXRjaF90aW1lOworCXUxNiBjaDsKKwl1MzIgdHNmX2xvdzsKKwl1OCBzd2l0Y2hfY291bnQ7CisJdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCk7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCWJhbmQgPSBpbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haOworCisJaXNfaHQ0MCA9IGl3NDk2NV9pc19odDQwX2NoYW5uZWwoY3R4LT5zdGFnaW5nLmZsYWdzKTsKKworCWlmIChpc19odDQwICYmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSykpCisJCWN0cmxfY2hhbl9oaWdoID0gMTsKKworCWNtZC5iYW5kID0gYmFuZDsKKwljbWQuZXhwZWN0X2JlYWNvbiA9IDA7CisJY2ggPSBjaF9zd2l0Y2gtPmNoYW5uZWwtPmh3X3ZhbHVlOworCWNtZC5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2gpOworCWNtZC5yeG9uX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZsYWdzOworCWNtZC5yeG9uX2ZpbHRlcl9mbGFncyA9IGN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3M7CisJc3dpdGNoX2NvdW50ID0gY2hfc3dpdGNoLT5jb3VudDsKKwl0c2ZfbG93ID0gY2hfc3dpdGNoLT50aW1lc3RhbXAgJiAweDBmZmZmZmZmZjsKKwkvKgorCSAqIGNhbGN1bGF0ZSB0aGUgdWNvZGUgY2hhbm5lbCBzd2l0Y2ggdGltZQorCSAqIGFkZGluZyBUU0YgYXMgb25lIG9mIHRoZSBmYWN0b3IgZm9yIHdoZW4gdG8gc3dpdGNoCisJICovCisJaWYgKGlsLT51Y29kZV9iZWFjb25fdGltZSA+IHRzZl9sb3cgJiYgYmVhY29uX2ludGVydmFsKSB7CisJCWlmIChzd2l0Y2hfY291bnQgPgorCQkgICAgKChpbC0+dWNvZGVfYmVhY29uX3RpbWUgLSB0c2ZfbG93KSAvIGJlYWNvbl9pbnRlcnZhbCkpIHsKKwkJCXN3aXRjaF9jb3VudCAtPQorCQkJICAgIChpbC0+dWNvZGVfYmVhY29uX3RpbWUgLSB0c2ZfbG93KSAvIGJlYWNvbl9pbnRlcnZhbDsKKwkJfSBlbHNlCisJCQlzd2l0Y2hfY291bnQgPSAwOworCX0KKwlpZiAoc3dpdGNoX2NvdW50IDw9IDEpCisJCWNtZC5zd2l0Y2hfdGltZSA9IGNwdV90b19sZTMyKGlsLT51Y29kZV9iZWFjb25fdGltZSk7CisJZWxzZSB7CisJCXN3aXRjaF90aW1lX2luX3VzZWMgPQorCQkgICAgdmlmLT5ic3NfY29uZi5iZWFjb25faW50ICogc3dpdGNoX2NvdW50ICogVElNRV9VTklUOworCQl1Y29kZV9zd2l0Y2hfdGltZSA9CisJCSAgICBpbF91c2Vjc190b19iZWFjb25zKGlsLCBzd2l0Y2hfdGltZV9pbl91c2VjLAorCQkJCQliZWFjb25faW50ZXJ2YWwpOworCQljbWQuc3dpdGNoX3RpbWUgPQorCQkgICAgaWxfYWRkX2JlYWNvbl90aW1lKGlsLCBpbC0+dWNvZGVfYmVhY29uX3RpbWUsCisJCQkJICAgICAgIHVjb2RlX3N3aXRjaF90aW1lLCBiZWFjb25faW50ZXJ2YWwpOworCX0KKwlEXzExSCgidUNvZGUgdGltZSBmb3IgdGhlIHN3aXRjaCBpcyAweCV4XG4iLCBjbWQuc3dpdGNoX3RpbWUpOworCWNoX2luZm8gPSBpbF9nZXRfY2hhbm5lbF9pbmZvKGlsLCBpbC0+YmFuZCwgY2gpOworCWlmIChjaF9pbmZvKQorCQljbWQuZXhwZWN0X2JlYWNvbiA9IGlsX2lzX2NoYW5uZWxfcmFkYXIoY2hfaW5mbyk7CisJZWxzZSB7CisJCUlMX0VSUigiaW52YWxpZCBjaGFubmVsIHN3aXRjaCBmcm9tICV1IHRvICV1XG4iLAorCQkgICAgICAgY3R4LT5hY3RpdmUuY2hhbm5lbCwgY2gpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyYyA9IGlsNDk2NV9maWxsX3R4cG93ZXJfdGJsKGlsLCBiYW5kLCBjaCwgaXNfaHQ0MCwgY3RybF9jaGFuX2hpZ2gsCisJCQkJICAgICAmY21kLnR4X3Bvd2VyKTsKKwlpZiAocmMpIHsKKwkJRF8xMUgoImVycm9yOiVkICBmaWxsIHR4cG93ZXJfdGJsXG4iLCByYyk7CisJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX0NIQU5ORUxfU1dJVENILCBzaXplb2YoY21kKSwgJmNtZCk7Cit9CisKKy8qKgorICogaWw0OTY1X3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsIC0gU2V0IHVwIGVudHJ5IGluIFR4IGJ5dGUtY291bnQgYXJyYXkKKyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV90eHFfdXBkYXRlX2J5dGVfY250X3RibChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkJICAgICAgIHUxNiBieXRlX2NudCkKK3sKKwlzdHJ1Y3QgaWw0OTY1X3NjZF9iY190YmwgKnNjZF9iY190YmwgPSBpbC0+c2NkX2JjX3RibHMuYWRkcjsKKwlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOworCWludCB3cml0ZV9wdHIgPSB0eHEtPnEud3JpdGVfcHRyOworCWludCBsZW4gPSBieXRlX2NudCArIElMX1RYX0NSQ19TSVpFICsgSUxfVFhfREVMSU1JVEVSX1NJWkU7CisJX19sZTE2IGJjX2VudDsKKworCVdBUk5fT04obGVuID4gMHhGRkYgfHwgd3JpdGVfcHRyID49IFRGRF9RVUVVRV9TSVpFX01BWCk7CisKKwliY19lbnQgPSBjcHVfdG9fbGUxNihsZW4gJiAweEZGRik7CisJLyogU2V0IHVwIGJ5dGUgY291bnQgd2l0aGluIGZpcnN0IDI1NiBlbnRyaWVzICovCisJc2NkX2JjX3RibFt0eHFfaWRdLnRmZF9vZmZzZXRbd3JpdGVfcHRyXSA9IGJjX2VudDsKKworCS8qIElmIHdpdGhpbiBmaXJzdCA2NCBlbnRyaWVzLCBkdXBsaWNhdGUgYXQgZW5kICovCisJaWYgKHdyaXRlX3B0ciA8IFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKKwkJc2NkX2JjX3RibFt0eHFfaWRdLnRmZF9vZmZzZXRbVEZEX1FVRVVFX1NJWkVfTUFYICsgd3JpdGVfcHRyXSA9CisJCSAgICBiY19lbnQ7Cit9CisKKy8qKgorICogaWw0OTY1X2h3X2dldF90ZW1wZXJhdHVyZSAtIHJldHVybiB0aGUgY2FsaWJyYXRlZCB0ZW1wZXJhdHVyZSAoaW4gS2VsdmluKQorICogQHN0YXRzOiBQcm92aWRlcyB0aGUgdGVtcGVyYXR1cmUgcmVhZGluZyBmcm9tIHRoZSB1Q29kZQorICoKKyAqIEEgcmV0dXJuIG9mIDwwIGluZGljYXRlcyBib2d1cyBkYXRhIGluIHRoZSBzdGF0cworICovCitzdGF0aWMgaW50CitpbDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzMzIgdGVtcGVyYXR1cmU7CisJczMyIHZ0OworCXMzMiBSMSwgUjIsIFIzOworCXUzMiBSNDsKKworCWlmICh0ZXN0X2JpdChTX1RFTVBFUkFUVVJFLCAmaWwtPnN0YXR1cykgJiYKKwkgICAgKGlsLT5fNDk2NS5zdGF0cy5mbGFnICYgU1RBVFNfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spKSB7CisJCURfVEVNUCgiUnVubmluZyBIVDQwIHRlbXBlcmF0dXJlIGNhbGlicmF0aW9uXG4iKTsKKwkJUjEgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IxWzFdKTsKKwkJUjIgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IyWzFdKTsKKwkJUjMgPSAoczMyKSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IzWzFdKTsKKwkJUjQgPSBsZTMyX3RvX2NwdShpbC0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3I0WzFdKTsKKwl9IGVsc2UgeworCQlEX1RFTVAoIlJ1bm5pbmcgdGVtcGVyYXR1cmUgY2FsaWJyYXRpb25cbiIpOworCQlSMSA9IChzMzIpIGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjFbMF0pOworCQlSMiA9IChzMzIpIGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjJbMF0pOworCQlSMyA9IChzMzIpIGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjNbMF0pOworCQlSNCA9IGxlMzJfdG9fY3B1KGlsLT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjRbMF0pOworCX0KKworCS8qCisJICogVGVtcGVyYXR1cmUgaXMgb25seSAyMyBiaXRzLCBzbyBzaWduIGV4dGVuZCBvdXQgdG8gMzIuCisJICoKKwkgKiBOT1RFIElmIHdlIGhhdmVuJ3QgcmVjZWl2ZWQgYSBzdGF0cyBub3RpZmljYXRpb24geWV0CisJICogd2l0aCBhbiB1cGRhdGVkIHRlbXBlcmF0dXJlLCB1c2UgUjQgcHJvdmlkZWQgdG8gdXMgaW4gdGhlCisJICogImluaXRpYWxpemUiIEFMSVZFIHJlc3BvbnNlLgorCSAqLworCWlmICghdGVzdF9iaXQoU19URU1QRVJBVFVSRSwgJmlsLT5zdGF0dXMpKQorCQl2dCA9IHNpZ25fZXh0ZW5kMzIoUjQsIDIzKTsKKwllbHNlCisJCXZ0ID0gc2lnbl9leHRlbmQzMihsZTMyX3RvX2NwdQorCQkJCSAgIChpbC0+XzQ5NjUuc3RhdHMuZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUpLAorCQkJCSAgIDIzKTsKKworCURfVEVNUCgiQ2FsaWIgdmFsdWVzIFJbMS0zXTogJWQgJWQgJWQgUjQ6ICVkXG4iLCBSMSwgUjIsIFIzLCB2dCk7CisKKwlpZiAoUjMgPT0gUjEpIHsKKwkJSUxfRVJSKCJDYWxpYnJhdGlvbiBjb25mbGljdCBSMSA9PSBSM1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBDYWxjdWxhdGUgdGVtcGVyYXR1cmUgaW4gZGVncmVlcyBLZWx2aW4sIGFkanVzdCBieSA5NyUuCisJICogQWRkIG9mZnNldCB0byBjZW50ZXIgdGhlIGFkanVzdG1lbnQgYXJvdW5kIDAgZGVncmVlcyBDZW50aWdyYWRlLiAqLworCXRlbXBlcmF0dXJlID0gVEVNUEVSQVRVUkVfQ0FMSUJfQV9WQUwgKiAodnQgLSBSMik7CisJdGVtcGVyYXR1cmUgLz0gKFIzIC0gUjEpOworCXRlbXBlcmF0dXJlID0KKwkgICAgKHRlbXBlcmF0dXJlICogOTcpIC8gMTAwICsgVEVNUEVSQVRVUkVfQ0FMSUJfS0VMVklOX09GRlNFVDsKKworCURfVEVNUCgiQ2FsaWJyYXRlZCB0ZW1wZXJhdHVyZTogJWRLLCAlZENcbiIsIHRlbXBlcmF0dXJlLAorCSAgICAgICBLRUxWSU5fVE9fQ0VMU0lVUyh0ZW1wZXJhdHVyZSkpOworCisJcmV0dXJuIHRlbXBlcmF0dXJlOworfQorCisvKiBBZGp1c3QgVHhwb3dlciBvbmx5IGlmIHRlbXBlcmF0dXJlIHZhcmlhbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQuICovCisjZGVmaW5lIElMX1RFTVBFUkFUVVJFX1RIUkVTSE9MRCAgIDMKKworLyoqCisgKiBpbDQ5NjVfaXNfdGVtcF9jYWxpYl9uZWVkZWQgLSBkZXRlcm1pbmVzIGlmIG5ldyBjYWxpYnJhdGlvbiBpcyBuZWVkZWQKKyAqCisgKiBJZiB0aGUgdGVtcGVyYXR1cmUgY2hhbmdlZCBoYXMgY2hhbmdlZCBzdWZmaWNpZW50bHksIHRoZW4gYSByZWNhbGlicmF0aW9uCisgKiBpcyBuZWVkZWQuCisgKgorICogQXNzdW1lcyBjYWxsZXIgd2lsbCByZXBsYWNlIGlsLT5sYXN0X3RlbXBlcmF0dXJlIG9uY2UgY2FsaWJyYXRpb24KKyAqIGV4ZWN1dGVkLgorICovCitzdGF0aWMgaW50CitpbDQ5NjVfaXNfdGVtcF9jYWxpYl9uZWVkZWQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCB0ZW1wX2RpZmY7CisKKwlpZiAoIXRlc3RfYml0KFNfU1RBVFMsICZpbC0+c3RhdHVzKSkgeworCQlEX1RFTVAoIlRlbXBlcmF0dXJlIG5vdCB1cGRhdGVkIC0tIG5vIHN0YXRzLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXRlbXBfZGlmZiA9IGlsLT50ZW1wZXJhdHVyZSAtIGlsLT5sYXN0X3RlbXBlcmF0dXJlOworCisJLyogZ2V0IGFic29sdXRlIHZhbHVlICovCisJaWYgKHRlbXBfZGlmZiA8IDApIHsKKwkJRF9QT1dFUigiR2V0dGluZyBjb29sZXIsIGRlbHRhICVkXG4iLCB0ZW1wX2RpZmYpOworCQl0ZW1wX2RpZmYgPSAtdGVtcF9kaWZmOworCX0gZWxzZSBpZiAodGVtcF9kaWZmID09IDApCisJCURfUE9XRVIoIlRlbXBlcmF0dXJlIHVuY2hhbmdlZFxuIik7CisJZWxzZQorCQlEX1BPV0VSKCJHZXR0aW5nIHdhcm1lciwgZGVsdGEgJWRcbiIsIHRlbXBfZGlmZik7CisKKwlpZiAodGVtcF9kaWZmIDwgSUxfVEVNUEVSQVRVUkVfVEhSRVNIT0xEKSB7CisJCURfUE9XRVIoIiA9PiB0aGVybWFsIHR4cG93ZXIgY2FsaWIgbm90IG5lZWRlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCURfUE9XRVIoIiA9PiB0aGVybWFsIHR4cG93ZXIgY2FsaWIgbmVlZGVkXG4iKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X3RlbXBlcmF0dXJlX2NhbGliKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzMzIgdGVtcDsKKworCXRlbXAgPSBpbDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKGlsKTsKKwlpZiAoSUxfVFhfUE9XRVJfVEVNUEVSQVRVUkVfT1VUX09GX1JBTkdFKHRlbXApKQorCQlyZXR1cm47CisKKwlpZiAoaWwtPnRlbXBlcmF0dXJlICE9IHRlbXApIHsKKwkJaWYgKGlsLT50ZW1wZXJhdHVyZSkKKwkJCURfVEVNUCgiVGVtcGVyYXR1cmUgY2hhbmdlZCAiICJmcm9tICVkQyB0byAlZENcbiIsCisJCQkgICAgICAgS0VMVklOX1RPX0NFTFNJVVMoaWwtPnRlbXBlcmF0dXJlKSwKKwkJCSAgICAgICBLRUxWSU5fVE9fQ0VMU0lVUyh0ZW1wKSk7CisJCWVsc2UKKwkJCURfVEVNUCgiVGVtcGVyYXR1cmUgIiAiaW5pdGlhbGl6ZWQgdG8gJWRDXG4iLAorCQkJICAgICAgIEtFTFZJTl9UT19DRUxTSVVTKHRlbXApKTsKKwl9CisKKwlpbC0+dGVtcGVyYXR1cmUgPSB0ZW1wOworCXNldF9iaXQoU19URU1QRVJBVFVSRSwgJmlsLT5zdGF0dXMpOworCisJaWYgKCFpbC0+ZGlzYWJsZV90eF9wb3dlcl9jYWwgJiYKKwkgICAgdW5saWtlbHkoIXRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgJiYKKwkgICAgaWw0OTY1X2lzX3RlbXBfY2FsaWJfbmVlZGVkKGlsKSkKKwkJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnR4cG93ZXJfd29yayk7Cit9CisKK3N0YXRpYyB1MTYKK2lsNDk2NV9nZXRfaGNtZF9zaXplKHU4IGNtZF9pZCwgdTE2IGxlbikKK3sKKwlzd2l0Y2ggKGNtZF9pZCkgeworCWNhc2UgQ19SWE9OOgorCQlyZXR1cm4gKHUxNikgc2l6ZW9mKHN0cnVjdCBpbDQ5NjVfcnhvbl9jbWQpOworCWRlZmF1bHQ6CisJCXJldHVybiBsZW47CisJfQorfQorCitzdGF0aWMgdTE2CitpbDQ5NjVfYnVpbGRfYWRkc3RhX2hjbWQoY29uc3Qgc3RydWN0IGlsX2FkZHN0YV9jbWQgKmNtZCwgdTggKiBkYXRhKQoreworCXN0cnVjdCBpbDQ5NjVfYWRkc3RhX2NtZCAqYWRkc3RhID0gKHN0cnVjdCBpbDQ5NjVfYWRkc3RhX2NtZCAqKWRhdGE7CisJYWRkc3RhLT5tb2RlID0gY21kLT5tb2RlOworCW1lbWNweSgmYWRkc3RhLT5zdGEsICZjbWQtPnN0YSwgc2l6ZW9mKHN0cnVjdCBzdGFfaWRfbW9kaWZ5KSk7CisJbWVtY3B5KCZhZGRzdGEtPmtleSwgJmNtZC0+a2V5LCBzaXplb2Yoc3RydWN0IGlsNDk2NV9rZXlpbmZvKSk7CisJYWRkc3RhLT5zdGF0aW9uX2ZsYWdzID0gY21kLT5zdGF0aW9uX2ZsYWdzOworCWFkZHN0YS0+c3RhdGlvbl9mbGFnc19tc2sgPSBjbWQtPnN0YXRpb25fZmxhZ3NfbXNrOworCWFkZHN0YS0+dGlkX2Rpc2FibGVfdHggPSBjbWQtPnRpZF9kaXNhYmxlX3R4OworCWFkZHN0YS0+YWRkX2ltbWVkaWF0ZV9iYV90aWQgPSBjbWQtPmFkZF9pbW1lZGlhdGVfYmFfdGlkOworCWFkZHN0YS0+cmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQgPSBjbWQtPnJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkOworCWFkZHN0YS0+YWRkX2ltbWVkaWF0ZV9iYV9zc24gPSBjbWQtPmFkZF9pbW1lZGlhdGVfYmFfc3NuOworCWFkZHN0YS0+c2xlZXBfdHhfY291bnQgPSBjbWQtPnNsZWVwX3R4X2NvdW50OworCWFkZHN0YS0+cmVzZXJ2ZWQxID0gY3B1X3RvX2xlMTYoMCk7CisJYWRkc3RhLT5yZXNlcnZlZDIgPSBjcHVfdG9fbGUxNigwKTsKKworCXJldHVybiAodTE2KSBzaXplb2Yoc3RydWN0IGlsNDk2NV9hZGRzdGFfY21kKTsKK30KKworc3RhdGljIGlubGluZSB1MzIKK2lsNDk2NV9nZXRfc2NkX3NzbihzdHJ1Y3QgaWw0OTY1X3R4X3Jlc3AgKnR4X3Jlc3ApCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1cCgmdHhfcmVzcC0+dS5zdGF0dXMgKyB0eF9yZXNwLT5mcmFtZV9jb3VudCkgJiBNQVhfU047Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitpbDQ5NjVfdHhfc3RhdHVzX3RvX21hYzgwMjExKHUzMiBzdGF0dXMpCit7CisJc3RhdHVzICY9IFRYX1NUQVRVU19NU0s7CisKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgVFhfU1RBVFVTX1NVQ0NFU1M6CisJY2FzZSBUWF9TVEFUVVNfRElSRUNUX0RPTkU6CisJCXJldHVybiBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7CisJY2FzZSBUWF9TVEFUVVNfRkFJTF9ERVNUX1BTOgorCQlyZXR1cm4gSUVFRTgwMjExX1RYX1NUQVRfVFhfRklMVEVSRUQ7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK2lsNDk2NV9pc190eF9zdWNjZXNzKHUzMiBzdGF0dXMpCit7CisJc3RhdHVzICY9IFRYX1NUQVRVU19NU0s7CisJcmV0dXJuIChzdGF0dXMgPT0gVFhfU1RBVFVTX1NVQ0NFU1MgfHwgc3RhdHVzID09IFRYX1NUQVRVU19ESVJFQ1RfRE9ORSk7Cit9CisKKy8qKgorICogaWw0OTY1X3R4X3N0YXR1c19yZXBseV90eCAtIEhhbmRsZSBUeCByZXNwb25zZSBmb3IgZnJhbWVzIGluIGFnZ3JlZ2F0aW9uIHF1ZXVlCisgKi8KK3N0YXRpYyBpbnQKK2lsNDk2NV90eF9zdGF0dXNfcmVwbHlfdHgoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaHRfYWdnICphZ2csCisJCQkgIHN0cnVjdCBpbDQ5NjVfdHhfcmVzcCAqdHhfcmVzcCwgaW50IHR4cV9pZCwKKwkJCSAgdTE2IHN0YXJ0X2lkeCkKK3sKKwl1MTYgc3RhdHVzOworCXN0cnVjdCBhZ2dfdHhfc3RhdHVzICpmcmFtZV9zdGF0dXMgPSB0eF9yZXNwLT51LmFnZ19zdGF0dXM7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gTlVMTDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gTlVMTDsKKwl1MzIgcmF0ZV9uX2ZsYWdzID0gbGUzMl90b19jcHUodHhfcmVzcC0+cmF0ZV9uX2ZsYWdzKTsKKwlpbnQgaSwgc2gsIGlkeDsKKwl1MTYgc2VxOworCWlmIChhZ2ctPndhaXRfZm9yX2JhKQorCQlEX1RYX1JFUExZKCJnb3QgdHggcmVzcG9uc2Ugdy9vIGJsb2NrLWFja1xuIik7CisKKwlhZ2ctPmZyYW1lX2NvdW50ID0gdHhfcmVzcC0+ZnJhbWVfY291bnQ7CisJYWdnLT5zdGFydF9pZHggPSBzdGFydF9pZHg7CisJYWdnLT5yYXRlX25fZmxhZ3MgPSByYXRlX25fZmxhZ3M7CisJYWdnLT5iaXRtYXAgPSAwOworCisJLyogbnVtIGZyYW1lcyBhdHRlbXB0ZWQgYnkgVHggY29tbWFuZCAqLworCWlmIChhZ2ctPmZyYW1lX2NvdW50ID09IDEpIHsKKwkJLyogT25seSBvbmUgZnJhbWUgd2FzIGF0dGVtcHRlZDsgbm8gYmxvY2stYWNrIHdpbGwgYXJyaXZlICovCisJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGZyYW1lX3N0YXR1c1swXS5zdGF0dXMpOworCQlpZHggPSBzdGFydF9pZHg7CisKKwkJRF9UWF9SRVBMWSgiRnJhbWVDbnQgPSAlZCwgU3RhcnRJZHg9JWQgaWR4PSVkXG4iLAorCQkJICAgYWdnLT5mcmFtZV9jb3VudCwgYWdnLT5zdGFydF9pZHgsIGlkeCk7CisKKwkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IoaWwtPnR4cVt0eHFfaWRdLnR4YltpZHhdLnNrYik7CisJCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUgKyAxOworCQlpbmZvLT5mbGFncyAmPSB+SUVFRTgwMjExX1RYX0NUTF9BTVBEVTsKKwkJaW5mby0+ZmxhZ3MgfD0gaWw0OTY1X3R4X3N0YXR1c190b19tYWM4MDIxMShzdGF0dXMpOworCQlpbDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2woaWwsIHJhdGVfbl9mbGFncywgaW5mbyk7CisKKwkJRF9UWF9SRVBMWSgiMSBGcmFtZSAweCV4IGZhaWx1cmUgOiVkXG4iLCBzdGF0dXMgJiAweGZmLAorCQkJICAgdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSk7CisJCURfVFhfUkVQTFkoIlJhdGUgSW5mbyByYXRlX25fZmxhZ3M9JXhcbiIsIHJhdGVfbl9mbGFncyk7CisKKwkJYWdnLT53YWl0X2Zvcl9iYSA9IDA7CisJfSBlbHNlIHsKKwkJLyogVHdvIG9yIG1vcmUgZnJhbWVzIHdlcmUgYXR0ZW1wdGVkOyBleHBlY3QgYmxvY2stYWNrICovCisJCXU2NCBiaXRtYXAgPSAwOworCQlpbnQgc3RhcnQgPSBhZ2ctPnN0YXJ0X2lkeDsKKworCQkvKiBDb25zdHJ1Y3QgYml0LW1hcCBvZiBwZW5kaW5nIGZyYW1lcyB3aXRoaW4gVHggd2luICovCisJCWZvciAoaSA9IDA7IGkgPCBhZ2ctPmZyYW1lX2NvdW50OyBpKyspIHsKKwkJCXUxNiBzYzsKKwkJCXN0YXR1cyA9IGxlMTZfdG9fY3B1KGZyYW1lX3N0YXR1c1tpXS5zdGF0dXMpOworCQkJc2VxID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzW2ldLnNlcXVlbmNlKTsKKwkJCWlkeCA9IFNFUV9UT19JRFgoc2VxKTsKKwkJCXR4cV9pZCA9IFNFUV9UT19RVUVVRShzZXEpOworCisJCQlpZiAoc3RhdHVzICYKKwkJCSAgICAoQUdHX1RYX1NUQVRFX0ZFV19CWVRFU19NU0sgfAorCQkJICAgICBBR0dfVFhfU1RBVEVfQUJPUlRfTVNLKSkKKwkJCQljb250aW51ZTsKKworCQkJRF9UWF9SRVBMWSgiRnJhbWVDbnQgPSAlZCwgdHhxX2lkPSVkIGlkeD0lZFxuIiwKKwkJCQkgICBhZ2ctPmZyYW1lX2NvdW50LCB0eHFfaWQsIGlkeCk7CisKKwkJCWhkciA9IGlsX3R4X3F1ZXVlX2dldF9oZHIoaWwsIHR4cV9pZCwgaWR4KTsKKwkJCWlmICghaGRyKSB7CisJCQkJSUxfRVJSKCJCVUdfT04gaWR4IGRvZXNuJ3QgcG9pbnQgdG8gdmFsaWQgc2tiIgorCQkJCSAgICAgICAiIGlkeD0lZCwgdHhxX2lkPSVkXG4iLCBpZHgsIHR4cV9pZCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlzYyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpOworCQkJaWYgKGlkeCAhPSAoU0VRX1RPX1NOKHNjKSAmIDB4ZmYpKSB7CisJCQkJSUxfRVJSKCJCVUdfT04gaWR4IGRvZXNuJ3QgbWF0Y2ggc2VxIGNvbnRyb2wiCisJCQkJICAgICAgICIgaWR4PSVkLCBzZXFfaWR4PSVkLCBzZXE9JWRcbiIsIGlkeCwKKwkJCQkgICAgICAgU0VRX1RPX1NOKHNjKSwgaGRyLT5zZXFfY3RybCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCisJCQlEX1RYX1JFUExZKCJBR0cgRnJhbWUgaT0lZCBpZHggJWQgc2VxPSVkXG4iLCBpLCBpZHgsCisJCQkJICAgU0VRX1RPX1NOKHNjKSk7CisKKwkJCXNoID0gaWR4IC0gc3RhcnQ7CisJCQlpZiAoc2ggPiA2NCkgeworCQkJCXNoID0gKHN0YXJ0IC0gaWR4KSArIDB4ZmY7CisJCQkJYml0bWFwID0gYml0bWFwIDw8IHNoOworCQkJCXNoID0gMDsKKwkJCQlzdGFydCA9IGlkeDsKKwkJCX0gZWxzZSBpZiAoc2ggPCAtNjQpCisJCQkJc2ggPSAweGZmIC0gKHN0YXJ0IC0gaWR4KTsKKwkJCWVsc2UgaWYgKHNoIDwgMCkgeworCQkJCXNoID0gc3RhcnQgLSBpZHg7CisJCQkJc3RhcnQgPSBpZHg7CisJCQkJYml0bWFwID0gYml0bWFwIDw8IHNoOworCQkJCXNoID0gMDsKKwkJCX0KKwkJCWJpdG1hcCB8PSAxVUxMIDw8IHNoOworCQkJRF9UWF9SRVBMWSgic3RhcnQ9JWQgYml0bWFwPTB4JWxseFxuIiwgc3RhcnQsCisJCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRtYXApOworCQl9CisKKwkJYWdnLT5iaXRtYXAgPSBiaXRtYXA7CisJCWFnZy0+c3RhcnRfaWR4ID0gc3RhcnQ7CisJCURfVFhfUkVQTFkoIkZyYW1lcyAlZCBzdGFydF9pZHg9JWQgYml0bWFwPTB4JWxseFxuIiwKKwkJCSAgIGFnZy0+ZnJhbWVfY291bnQsIGFnZy0+c3RhcnRfaWR4LAorCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylhZ2ctPmJpdG1hcCk7CisKKwkJaWYgKGJpdG1hcCkKKwkJCWFnZy0+d2FpdF9mb3JfYmEgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHU4CitpbDQ5NjVfZmluZF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggKiBhZGRyKQoreworCWludCBpOworCWludCBzdGFydCA9IDA7CisJaW50IHJldCA9IElMX0lOVkFMSURfU1RBVElPTjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKChpbC0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykpCisJCXN0YXJ0ID0gSUxfU1RBX0lEOworCisJaWYgKGlzX2Jyb2FkY2FzdF9ldGhlcl9hZGRyKGFkZHIpKQorCQlyZXR1cm4gaWwtPmN0eC5iY2FzdF9zdGFfaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJZm9yIChpID0gc3RhcnQ7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKQorCQlpZiAoaWwtPnN0YXRpb25zW2ldLnVzZWQgJiYKKwkJICAgICghY29tcGFyZV9ldGhlcl9hZGRyKGlsLT5zdGF0aW9uc1tpXS5zdGEuc3RhLmFkZHIsIGFkZHIpKSkgeworCQkJcmV0ID0gaTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwlEX0FTU09DKCJjYW4gbm90IGZpbmQgU1RBICVwTSB0b3RhbCAlZFxuIiwgYWRkciwgaWwtPm51bV9zdGF0aW9ucyk7CisKK291dDoKKwkvKgorCSAqIEl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IG1vcmUgY29tbWFuZHMgaW50ZXJhY3Rpbmcgd2l0aCBzdGF0aW9ucworCSAqIGFycml2ZSBiZWZvcmUgd2UgY29tcGxldGVkIHByb2Nlc3NpbmcgdGhlIGFkZGluZyBvZgorCSAqIHN0YXRpb24KKwkgKi8KKwlpZiAocmV0ICE9IElMX0lOVkFMSURfU1RBVElPTiAmJgorCSAgICAoIShpbC0+c3RhdGlvbnNbcmV0XS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkgfHwKKwkgICAgICgoaWwtPnN0YXRpb25zW3JldF0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpICYmCisJICAgICAgKGlsLT5zdGF0aW9uc1tyZXRdLnVzZWQgJiBJTF9TVEFfVUNPREVfSU5QUk9HUkVTUykpKSkgeworCQlJTF9FUlIoIlJlcXVlc3RlZCBzdGF0aW9uIGluZm8gZm9yIHN0YSAlZCBiZWZvcmUgcmVhZHkuXG4iLAorCQkgICAgICAgcmV0KTsKKwkJcmV0ID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitpbDQ5NjVfZ2V0X3JhX3N0YV9pZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJaWYgKGlsLT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKKwkJcmV0dXJuIElMX0FQX0lEOworCX0gZWxzZSB7CisJCXU4ICpkYSA9IGllZWU4MDIxMV9nZXRfREEoaGRyKTsKKwkJcmV0dXJuIGlsNDk2NV9maW5kX3N0YXRpb24oaWwsIGRhKTsKKwl9Cit9CisKKy8qKgorICogaWw0OTY1X2hkbF90eCAtIEhhbmRsZSBzdGFuZGFyZCAobm9uLWFnZ3JlZ2F0aW9uKSBUeCByZXNwb25zZQorICovCitzdGF0aWMgdm9pZAoraWw0OTY1X2hkbF90eChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXUxNiBzZXF1ZW5jZSA9IGxlMTZfdG9fY3B1KHBrdC0+aGRyLnNlcXVlbmNlKTsKKwlpbnQgdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcXVlbmNlKTsKKwlpbnQgaWR4ID0gU0VRX1RPX0lEWChzZXF1ZW5jZSk7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVt0eHFfaWRdOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCXN0cnVjdCBpbDQ5NjVfdHhfcmVzcCAqdHhfcmVzcCA9ICh2b2lkICopJnBrdC0+dS5yYXdbMF07CisJdTMyIHN0YXR1cyA9IGxlMzJfdG9fY3B1KHR4X3Jlc3AtPnUuc3RhdHVzKTsKKwlpbnQgdW5pbml0aWFsaXplZF92YXIodGlkKTsKKwlpbnQgc3RhX2lkOworCWludCBmcmVlZDsKKwl1OCAqcWMgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoaWR4ID49IHR4cS0+cS5uX2JkIHx8IGlsX3F1ZXVlX3VzZWQoJnR4cS0+cSwgaWR4KSA9PSAwKSB7CisJCUlMX0VSUigiUmVhZCBpZHggZm9yIERNQSBxdWV1ZSB0eHFfaWQgKCVkKSBpZHggJWQgIgorCQkgICAgICAgImlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWRcbiIsIHR4cV9pZCwgaWR4LAorCQkgICAgICAgdHhxLT5xLm5fYmQsIHR4cS0+cS53cml0ZV9wdHIsIHR4cS0+cS5yZWFkX3B0cik7CisJCXJldHVybjsKKwl9CisKKwl0eHEtPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiKTsKKwltZW1zZXQoJmluZm8tPnN0YXR1cywgMCwgc2l6ZW9mKGluZm8tPnN0YXR1cykpOworCisJaGRyID0gaWxfdHhfcXVldWVfZ2V0X2hkcihpbCwgdHhxX2lkLCBpZHgpOworCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQlxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCQl0aWQgPSBxY1swXSAmIDB4ZjsKKwl9CisKKwlzdGFfaWQgPSBpbDQ5NjVfZ2V0X3JhX3N0YV9pZChpbCwgaGRyKTsKKwlpZiAodHhxLT5zY2hlZF9yZXRyeSAmJiB1bmxpa2VseShzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkgeworCQlJTF9FUlIoIlN0YXRpb24gbm90IGtub3duXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlpZiAodHhxLT5zY2hlZF9yZXRyeSkgeworCQljb25zdCB1MzIgc2NkX3NzbiA9IGlsNDk2NV9nZXRfc2NkX3Nzbih0eF9yZXNwKTsKKwkJc3RydWN0IGlsX2h0X2FnZyAqYWdnID0gTlVMTDsKKwkJV0FSTl9PTighcWMpOworCisJCWFnZyA9ICZpbC0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXS5hZ2c7CisKKwkJaWw0OTY1X3R4X3N0YXR1c19yZXBseV90eChpbCwgYWdnLCB0eF9yZXNwLCB0eHFfaWQsIGlkeCk7CisKKwkJLyogY2hlY2sgaWYgQkFSIGlzIG5lZWRlZCAqLworCQlpZiAoKHR4X3Jlc3AtPmZyYW1lX2NvdW50ID09IDEpICYmCisJCSAgICAhaWw0OTY1X2lzX3R4X3N1Y2Nlc3Moc3RhdHVzKSkKKwkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FNUERVX05PX0JBQ0s7CisKKwkJaWYgKHR4cS0+cS5yZWFkX3B0ciAhPSAoc2NkX3NzbiAmIDB4ZmYpKSB7CisJCQlpZHggPSBpbF9xdWV1ZV9kZWNfd3JhcChzY2Rfc3NuICYgMHhmZiwgdHhxLT5xLm5fYmQpOworCQkJRF9UWF9SRVBMWSgiUmV0cnkgc2NoZWR1bGVyIHJlY2xhaW0gc2NkX3NzbiAiCisJCQkJICAgIiVkIGlkeCAlZFxuIiwgc2NkX3NzbiwgaWR4KTsKKwkJCWZyZWVkID0gaWw0OTY1X3R4X3F1ZXVlX3JlY2xhaW0oaWwsIHR4cV9pZCwgaWR4KTsKKwkJCWlmIChxYykKKwkJCQlpbDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKGlsLCBzdGFfaWQsIHRpZCwKKwkJCQkJCQkgIGZyZWVkKTsKKworCQkJaWYgKGlsLT5tYWM4MDIxMV9yZWdpc3RlcmVkICYmCisJCQkgICAgaWxfcXVldWVfc3BhY2UoJnR4cS0+cSkgPiB0eHEtPnEubG93X21hcmsgJiYKKwkJCSAgICBhZ2ctPnN0YXRlICE9IElMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKQorCQkJCWlsX3dha2VfcXVldWUoaWwsIHR4cSk7CisJCX0KKwl9IGVsc2UgeworCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lICsgMTsKKwkJaW5mby0+ZmxhZ3MgfD0gaWw0OTY1X3R4X3N0YXR1c190b19tYWM4MDIxMShzdGF0dXMpOworCQlpbDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2woaWwsCisJCQkJCSAgICBsZTMyX3RvX2NwdSh0eF9yZXNwLT5yYXRlX25fZmxhZ3MpLAorCQkJCQkgICAgaW5mbyk7CisKKwkJRF9UWF9SRVBMWSgiVFhRICVkIHN0YXR1cyAlcyAoMHglMDh4KSAiCisJCQkgICAicmF0ZV9uX2ZsYWdzIDB4JXggcmV0cmllcyAlZFxuIiwgdHhxX2lkLAorCQkJICAgaWw0OTY1X2dldF90eF9mYWlsX3JlYXNvbihzdGF0dXMpLCBzdGF0dXMsCisJCQkgICBsZTMyX3RvX2NwdSh0eF9yZXNwLT5yYXRlX25fZmxhZ3MpLAorCQkJICAgdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSk7CisKKwkJZnJlZWQgPSBpbDQ5NjVfdHhfcXVldWVfcmVjbGFpbShpbCwgdHhxX2lkLCBpZHgpOworCQlpZiAocWMgJiYgbGlrZWx5KHN0YV9pZCAhPSBJTF9JTlZBTElEX1NUQVRJT04pKQorCQkJaWw0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShpbCwgc3RhX2lkLCB0aWQsIGZyZWVkKTsKKwkJZWxzZSBpZiAoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikKKwkJCURfVFhfUkVQTFkoIlN0YXRpb24gbm90IGtub3duXG4iKTsKKworCQlpZiAoaWwtPm1hYzgwMjExX3JlZ2lzdGVyZWQgJiYKKwkJICAgIGlsX3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrKQorCQkJaWxfd2FrZV9xdWV1ZShpbCwgdHhxKTsKKwl9CisJaWYgKHFjICYmIGxpa2VseShzdGFfaWQgIT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkKKwkJaWw0OTY1X3R4cV9jaGVja19lbXB0eShpbCwgc3RhX2lkLCB0aWQsIHR4cV9pZCk7CisKKwlpbDQ5NjVfY2hlY2tfYWJvcnRfc3RhdHVzKGlsLCB0eF9yZXNwLT5mcmFtZV9jb3VudCwgc3RhdHVzKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworfQorCisvKiBTZXQgdXAgNDk2NS1zcGVjaWZpYyBSeCBmcmFtZSByZXBseSBoYW5kbGVycyAqLworc3RhdGljIHZvaWQKK2lsNDk2NV9oYW5kbGVyX3NldHVwKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBMZWdhY3kgUnggZnJhbWVzICovCisJaWwtPmhhbmRsZXJzW05fUlhdID0gaWw0OTY1X2hkbF9yeDsKKwkvKiBUeCByZXNwb25zZSAqLworCWlsLT5oYW5kbGVyc1tDX1RYXSA9IGlsNDk2NV9oZGxfdHg7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWxfaGNtZF9vcHMgaWw0OTY1X2hjbWQgPSB7CisJLnJ4b25fYXNzb2MgPSBpbDQ5NjVfc2VuZF9yeG9uX2Fzc29jLAorCS5jb21taXRfcnhvbiA9IGlsNDk2NV9jb21taXRfcnhvbiwKKwkuc2V0X3J4b25fY2hhaW4gPSBpbDQ5NjVfc2V0X3J4b25fY2hhaW4sCit9OworCitzdGF0aWMgdm9pZAoraWw0OTY1X3Bvc3Rfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwkvKgorCSAqIFNpbmNlIHNldHRpbmcgdGhlIFJYT04gbWF5IGhhdmUgYmVlbiBkZWZlcnJlZCB3aGlsZQorCSAqIHBlcmZvcm1pbmcgdGhlIHNjYW4sIGZpcmUgb25lIG9mZiBpZiBuZWVkZWQKKwkgKi8KKwlpZiAobWVtY21wKCZjdHgtPnN0YWdpbmcsICZjdHgtPmFjdGl2ZSwgc2l6ZW9mKGN0eC0+c3RhZ2luZykpKQorCQlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKK30KKworc3RhdGljIHZvaWQKK2lsNDk2NV9wb3N0X2Fzc29jaWF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9IE5VTEw7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIXZpZiB8fCAhaWwtPmlzX29wZW4pCisJCXJldHVybjsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAyMDApOworCisJY29uZiA9ICZpbC0+aHctPmNvbmY7CisKKwljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwlyZXQgPSBpbF9zZW5kX3J4b25fdGltaW5nKGlsLCBjdHgpOworCWlmIChyZXQpCisJCUlMX1dBUk4oIlJYT04gdGltaW5nIC0gIiAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOworCisJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisKKwlpbF9zZXRfcnhvbl9odChpbCwgJmlsLT5jdXJyZW50X2h0X2NvbmZpZyk7CisKKwlpZiAoaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKKwkJaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihpbCwgY3R4KTsKKworCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IGNwdV90b19sZTE2KHZpZi0+YnNzX2NvbmYuYWlkKTsKKworCURfQVNTT0MoImFzc29jIGlkICVkIGJlYWNvbiBpbnRlcnZhbCAlZFxuIiwgdmlmLT5ic3NfY29uZi5haWQsCisJCXZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCk7CisKKwlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpCisJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisJZWxzZQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKworCWlmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spIHsKKwkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCWVsc2UKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJfQorCisJaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwlEX0FTU09DKCJBc3NvY2lhdGVkIGFzICVkIHRvOiAlcE1cbiIsIHZpZi0+YnNzX2NvbmYuYWlkLAorCQljdHgtPmFjdGl2ZS5ic3NpZF9hZGRyKTsKKworCXN3aXRjaCAodmlmLT50eXBlKSB7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgorCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgorCQlpbDQ5NjVfc2VuZF9iZWFjb25fY21kKGlsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJSUxfRVJSKCIlcyBTaG91bGQgbm90IGJlIGNhbGxlZCBpbiAlZCBtb2RlXG4iLCBfX2Z1bmNfXywKKwkJICAgICAgIHZpZi0+dHlwZSk7CisJCWJyZWFrOworCX0KKworCS8qIHRoZSBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbiB3aWxsIGVuYWJsZWQgUE0gdXBvbiBjb21wbGV0aW9uCisJICogSWYgY2hhaW4gbm9pc2UgaGFzIGFscmVhZHkgYmVlbiBydW4sIHRoZW4gd2UgbmVlZCB0byBlbmFibGUKKwkgKiBwb3dlciBtYW5hZ2VtZW50IGhlcmUgKi8KKwlpZiAoaWwtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUgPT0gSUxfQ0hBSU5fTk9JU0VfRE9ORSkKKwkJaWxfcG93ZXJfdXBkYXRlX21vZGUoaWwsIGZhbHNlKTsKKworCS8qIEVuYWJsZSBSeCBkaWZmZXJlbnRpYWwgZ2FpbiBhbmQgc2Vuc2l0aXZpdHkgY2FsaWJyYXRpb25zICovCisJaWw0OTY1X2NoYWluX25vaXNlX3Jlc2V0KGlsKTsKKwlpbC0+c3RhcnRfY2FsaWIgPSAxOworfQorCitzdGF0aWMgdm9pZAoraWw0OTY1X2NvbmZpZ19hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCWludCByZXQgPSAwOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwkvKiBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSBkb25lIG9ubHkgYXQgQVAgYnJpbmcgdXAgKi8KKwlpZiAoIWlsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKKworCQkvKiBSWE9OIC0gdW5hc3NvYyAodG8gc2V0IHRpbWluZyBjb21tYW5kKSAqLworCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJCWlsX2NvbW1pdF9yeG9uKGlsLCBjdHgpOworCisJCS8qIFJYT04gVGltaW5nICovCisJCXJldCA9IGlsX3NlbmRfcnhvbl90aW1pbmcoaWwsIGN0eCk7CisJCWlmIChyZXQpCisJCQlJTF9XQVJOKCJSWE9OIHRpbWluZyBmYWlsZWQgLSAiCisJCQkJIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKKworCQkvKiBBUCBoYXMgYWxsIGFudGVubmFzICovCisJCWlsLT5jaGFpbl9ub2lzZV9kYXRhLmFjdGl2ZV9jaGFpbnMgPSBpbC0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudDsKKwkJaWxfc2V0X3J4b25faHQoaWwsICZpbC0+Y3VycmVudF9odF9jb25maWcpOworCQlpZiAoaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKKwkJCWlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4oaWwsIGN0eCk7CisKKwkJY3R4LT5zdGFnaW5nLmFzc29jX2lkID0gMDsKKworCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCQllbHNlCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKworCQlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7CisJCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKKwkJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7CisJCQllbHNlCisJCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKKwkJfQorCQkvKiBuZWVkIHRvIHNlbmQgYmVhY29uIGNtZCBiZWZvcmUgY29tbWl0dGluZyBhc3NvYyBSWE9OISAqLworCQlpbDQ5NjVfc2VuZF9iZWFjb25fY21kKGlsKTsKKwkJLyogcmVzdG9yZSBSWE9OIGFzc29jICovCisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOworCQlpbF9jb21taXRfcnhvbihpbCwgY3R4KTsKKwl9CisJaWw0OTY1X3NlbmRfYmVhY29uX2NtZChpbCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaWxfaGNtZF91dGlsc19vcHMgaWw0OTY1X2hjbWRfdXRpbHMgPSB7CisJLmdldF9oY21kX3NpemUgPSBpbDQ5NjVfZ2V0X2hjbWRfc2l6ZSwKKwkuYnVpbGRfYWRkc3RhX2hjbWQgPSBpbDQ5NjVfYnVpbGRfYWRkc3RhX2hjbWQsCisJLnJlcXVlc3Rfc2NhbiA9IGlsNDk2NV9yZXF1ZXN0X3NjYW4sCisJLnBvc3Rfc2NhbiA9IGlsNDk2NV9wb3N0X3NjYW4sCit9OworCitzdGF0aWMgc3RydWN0IGlsX2xpYl9vcHMgaWw0OTY1X2xpYiA9IHsKKwkuc2V0X2h3X3BhcmFtcyA9IGlsNDk2NV9od19zZXRfaHdfcGFyYW1zLAorCS50eHFfdXBkYXRlX2J5dGVfY250X3RibCA9IGlsNDk2NV90eHFfdXBkYXRlX2J5dGVfY250X3RibCwKKwkudHhxX2F0dGFjaF9idWZfdG9fdGZkID0gaWw0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZCwKKwkudHhxX2ZyZWVfdGZkID0gaWw0OTY1X2h3X3R4cV9mcmVlX3RmZCwKKwkudHhxX2luaXQgPSBpbDQ5NjVfaHdfdHhfcXVldWVfaW5pdCwKKwkuaGFuZGxlcl9zZXR1cCA9IGlsNDk2NV9oYW5kbGVyX3NldHVwLAorCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaWw0OTY1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIsCisJLmluaXRfYWxpdmVfc3RhcnQgPSBpbDQ5NjVfaW5pdF9hbGl2ZV9zdGFydCwKKwkubG9hZF91Y29kZSA9IGlsNDk2NV9sb2FkX2JzbSwKKwkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaWw0OTY1X2R1bXBfbmljX2Vycm9yX2xvZywKKwkuZHVtcF9maCA9IGlsNDk2NV9kdW1wX2ZoLAorCS5zZXRfY2hhbm5lbF9zd2l0Y2ggPSBpbDQ5NjVfaHdfY2hhbm5lbF9zd2l0Y2gsCisJLmFwbV9vcHMgPSB7CisJCSAgICAuaW5pdCA9IGlsX2FwbV9pbml0LAorCQkgICAgLmNvbmZpZyA9IGlsNDk2NV9uaWNfY29uZmlnLAorCQkgICAgfSwKKwkuZWVwcm9tX29wcyA9IHsKKwkJICAgICAgIC5yZWd1bGF0b3J5X2JhbmRzID0geworCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8xX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8zX0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF80X0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF81X0NIQU5ORUxTLAorCQkJCQkgICAgRUVQUk9NXzQ5NjVfUkVHVUxBVE9SWV9CQU5EXzI0X0hUNDBfQ0hBTk5FTFMsCisJCQkJCSAgICBFRVBST01fNDk2NV9SRUdVTEFUT1JZX0JBTkRfNTJfSFQ0MF9DSEFOTkVMU30sCisJCSAgICAgICAuYWNxdWlyZV9zZW1hcGhvcmUgPSBpbDQ5NjVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlLAorCQkgICAgICAgLnJlbGVhc2Vfc2VtYXBob3JlID0gaWw0OTY1X2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZSwKKwkJICAgICAgIH0sCisJLnNlbmRfdHhfcG93ZXIgPSBpbDQ5NjVfc2VuZF90eF9wb3dlciwKKwkudXBkYXRlX2NoYWluX2ZsYWdzID0gaWw0OTY1X3VwZGF0ZV9jaGFpbl9mbGFncywKKwkudGVtcF9vcHMgPSB7CisJCSAgICAgLnRlbXBlcmF0dXJlID0gaWw0OTY1X3RlbXBlcmF0dXJlX2NhbGliLAorCQkgICAgIH0sCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwkuZGVidWdmc19vcHMgPSB7CisJCQkucnhfc3RhdHNfcmVhZCA9IGlsNDk2NV91Y29kZV9yeF9zdGF0c19yZWFkLAorCQkJLnR4X3N0YXRzX3JlYWQgPSBpbDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZCwKKwkJCS5nZW5lcmFsX3N0YXRzX3JlYWQgPSBpbDQ5NjVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkLAorCQkJfSwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbF9sZWdhY3lfb3BzIGlsNDk2NV9sZWdhY3lfb3BzID0geworCS5wb3N0X2Fzc29jaWF0ZSA9IGlsNDk2NV9wb3N0X2Fzc29jaWF0ZSwKKwkuY29uZmlnX2FwID0gaWw0OTY1X2NvbmZpZ19hcCwKKwkubWFuYWdlX2lic3Nfc3RhdGlvbiA9IGlsNDk2NV9tYW5hZ2VfaWJzc19zdGF0aW9uLAorCS51cGRhdGVfYmNhc3Rfc3RhdGlvbnMgPSBpbDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb25zLAorfTsKKworc3RydWN0IGllZWU4MDIxMV9vcHMgaWw0OTY1X2h3X29wcyA9IHsKKwkudHggPSBpbDQ5NjVfbWFjX3R4LAorCS5zdGFydCA9IGlsNDk2NV9tYWNfc3RhcnQsCisJLnN0b3AgPSBpbDQ5NjVfbWFjX3N0b3AsCisJLmFkZF9pbnRlcmZhY2UgPSBpbF9tYWNfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZSA9IGlsX21hY19yZW1vdmVfaW50ZXJmYWNlLAorCS5jaGFuZ2VfaW50ZXJmYWNlID0gaWxfbWFjX2NoYW5nZV9pbnRlcmZhY2UsCisJLmNvbmZpZyA9IGlsX21hY19jb25maWcsCisJLmNvbmZpZ3VyZV9maWx0ZXIgPSBpbDQ5NjVfY29uZmlndXJlX2ZpbHRlciwKKwkuc2V0X2tleSA9IGlsNDk2NV9tYWNfc2V0X2tleSwKKwkudXBkYXRlX3RraXBfa2V5ID0gaWw0OTY1X21hY191cGRhdGVfdGtpcF9rZXksCisJLmNvbmZfdHggPSBpbF9tYWNfY29uZl90eCwKKwkucmVzZXRfdHNmID0gaWxfbWFjX3Jlc2V0X3RzZiwKKwkuYnNzX2luZm9fY2hhbmdlZCA9IGlsX21hY19ic3NfaW5mb19jaGFuZ2VkLAorCS5hbXBkdV9hY3Rpb24gPSBpbDQ5NjVfbWFjX2FtcGR1X2FjdGlvbiwKKwkuaHdfc2NhbiA9IGlsX21hY19od19zY2FuLAorCS5zdGFfYWRkID0gaWw0OTY1X21hY19zdGFfYWRkLAorCS5zdGFfcmVtb3ZlID0gaWxfbWFjX3N0YV9yZW1vdmUsCisJLmNoYW5uZWxfc3dpdGNoID0gaWw0OTY1X21hY19jaGFubmVsX3N3aXRjaCwKKwkudHhfbGFzdF9iZWFjb24gPSBpbF9tYWNfdHhfbGFzdF9iZWFjb24sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGlsX29wcyBpbDQ5NjVfb3BzID0geworCS5saWIgPSAmaWw0OTY1X2xpYiwKKwkuaGNtZCA9ICZpbDQ5NjVfaGNtZCwKKwkudXRpbHMgPSAmaWw0OTY1X2hjbWRfdXRpbHMsCisJLmxlZCA9ICZpbDQ5NjVfbGVkX29wcywKKwkubGVnYWN5ID0gJmlsNDk2NV9sZWdhY3lfb3BzLAorCS5pZWVlODAyMTFfb3BzID0gJmlsNDk2NV9od19vcHMsCit9OworCitzdGF0aWMgc3RydWN0IGlsX2Jhc2VfcGFyYW1zIGlsNDk2NV9iYXNlX3BhcmFtcyA9IHsKKwkuZWVwcm9tX3NpemUgPSBJTDQ5NjVfRUVQUk9NX0lNR19TSVpFLAorCS5udW1fb2ZfcXVldWVzID0gSUw0OV9OVU1fUVVFVUVTLAorCS5udW1fb2ZfYW1wZHVfcXVldWVzID0gSUw0OV9OVU1fQU1QRFVfUVVFVUVTLAorCS5wbGxfY2ZnX3ZhbCA9IDAsCisJLnNldF9sMHMgPSB0cnVlLAorCS51c2VfYnNtID0gdHJ1ZSwKKwkubGVkX2NvbXBlbnNhdGlvbiA9IDYxLAorCS5jaGFpbl9ub2lzZV9udW1fYmVhY29ucyA9IElMNDk2NV9DQUxfTlVNX0JFQUNPTlMsCisJLndkX3RpbWVvdXQgPSBJTF9ERUZfV0RfVElNRU9VVCwKKwkudGVtcGVyYXR1cmVfa2VsdmluID0gdHJ1ZSwKKwkudWNvZGVfdHJhY2luZyA9IHRydWUsCisJLnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlciA9IHRydWUsCisJLmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlciA9IHRydWUsCit9OworCitzdHJ1Y3QgaWxfY2ZnIGlsNDk2NV9jZmcgPSB7CisJLm5hbWUgPSAiSW50ZWwoUikgV2lyZWxlc3MgV2lGaSBMaW5rIDQ5NjVBR04iLAorCS5md19uYW1lX3ByZSA9IElMNDk2NV9GV19QUkUsCisJLnVjb2RlX2FwaV9tYXggPSBJTDQ5NjVfVUNPREVfQVBJX01BWCwKKwkudWNvZGVfYXBpX21pbiA9IElMNDk2NV9VQ09ERV9BUElfTUlOLAorCS5za3UgPSBJTF9TS1VfQSB8IElMX1NLVV9HIHwgSUxfU0tVX04sCisJLnZhbGlkX3R4X2FudCA9IEFOVF9BQiwKKwkudmFsaWRfcnhfYW50ID0gQU5UX0FCQywKKwkuZWVwcm9tX3ZlciA9IEVFUFJPTV80OTY1X0VFUFJPTV9WRVJTSU9OLAorCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzQ5NjVfVFhfUE9XRVJfVkVSU0lPTiwKKwkub3BzID0gJmlsNDk2NV9vcHMsCisJLm1vZF9wYXJhbXMgPSAmaWw0OTY1X21vZF9wYXJhbXMsCisJLmJhc2VfcGFyYW1zID0gJmlsNDk2NV9iYXNlX3BhcmFtcywKKwkubGVkX21vZGUgPSBJTF9MRURfQkxJTkssCisJLyoKKwkgKiBGb3JjZSB1c2Ugb2YgY2hhaW5zIEIgYW5kIEMgZm9yIHNjYW4gUlggb24gNSBHSHogYmFuZAorCSAqIGJlY2F1c2UgdGhlIGRldmljZSBoYXMgb2ZmLWNoYW5uZWwgcmVjZXB0aW9uIG9uIGNoYWluIEEuCisJICovCisJLnNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBBTlRfQkMsCit9OworCisvKiBNb2R1bGUgZmlybXdhcmUgKi8KK01PRFVMRV9GSVJNV0FSRShJTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKElMNDk2NV9VQ09ERV9BUElfTUFYKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS80OTY1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4MGUwMQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5LzQ5NjUuaApAQCAtMCwwICsxLDEzMDEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBHUEwgTElDRU5TRSBTVU1NQVJZCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCisgKiBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgorICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgorICoKKyAqIENvbnRhY3QgSW5mb3JtYXRpb246CisgKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+CisgKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3CisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIF9faWxfNDk2NV9oX18KKyNkZWZpbmUgX19pbF80OTY1X2hfXworCitzdHJ1Y3QgaWxfcnhfcXVldWU7CitzdHJ1Y3QgaWxfcnhfYnVmOworc3RydWN0IGlsX3J4X3BrdDsKK3N0cnVjdCBpbF90eF9xdWV1ZTsKK3N0cnVjdCBpbF9yeG9uX2NvbnRleHQ7CisKKy8qIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBfNDk2NSBkZXZpY2VzICovCitleHRlcm4gc3RydWN0IGlsX2NmZyBpbDQ5NjVfY2ZnOworCitleHRlcm4gc3RydWN0IGlsX21vZF9wYXJhbXMgaWw0OTY1X21vZF9wYXJhbXM7CisKK2V4dGVybiBzdHJ1Y3QgaWVlZTgwMjExX29wcyBpbDQ5NjVfaHdfb3BzOworCisvKiB0eCBxdWV1ZSAqLwordm9pZCBpbDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHN0YV9pZCwgaW50IHRpZCwKKwkJCSAgICAgICBpbnQgZnJlZWQpOworCisvKiBSWE9OICovCit2b2lkIGlsNDk2NV9zZXRfcnhvbl9jaGFpbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisKKy8qIHVDb2RlICovCitpbnQgaWw0OTY1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKiBsaWIgKi8KK3ZvaWQgaWw0OTY1X2NoZWNrX2Fib3J0X3N0YXR1cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGZyYW1lX2NvdW50LCB1MzIgc3RhdHVzKTsKKwordm9pZCBpbDQ5NjVfcnhfcXVldWVfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSk7CitpbnQgaWw0OTY1X3J4X2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSk7CitpbnQgaWw0OTY1X2h3X25pY19pbml0KHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWw0OTY1X2R1bXBfZmgoc3RydWN0IGlsX3ByaXYgKmlsLCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOworCisvKiByeCAqLwordm9pZCBpbDQ5NjVfcnhfcXVldWVfcmVzdG9jayhzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbDQ5NjVfcnhfcmVwbGVuaXNoKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV9yeF9xdWV1ZV9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X3F1ZXVlICpyeHEpOworaW50IGlsNDk2NV9yeHFfc3RvcChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHUzMiByYXRlX25fZmxhZ3MsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCk7Cit2b2lkIGlsNDk2NV9oZGxfcngoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbDQ5NjVfaGRsX3J4X3BoeShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7Cit2b2lkIGlsNDk2NV9yeF9oYW5kbGUoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogdHggKi8KK3ZvaWQgaWw0OTY1X2h3X3R4cV9mcmVlX3RmZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKTsKK2ludCBpbDQ5NjVfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEsCisJCQkJICAgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwgdTggcmVzZXQsIHU4IHBhZCk7CitpbnQgaWw0OTY1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7Cit2b2lkIGlsNDk2NV9od3JhdGVfdG9fdHhfY29udHJvbChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiByYXRlX25fZmxhZ3MsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyk7CitpbnQgaWw0OTY1X3R4X3NrYihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBza19idWZmICpza2IpOworaW50IGlsNDk2NV90eF9hZ2dfc3RhcnQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICogc3NuKTsKK2ludCBpbDQ5NjVfdHhfYWdnX3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCk7CitpbnQgaWw0OTY1X3R4cV9jaGVja19lbXB0eShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIHU4IHRpZCwgaW50IHR4cV9pZCk7Cit2b2lkIGlsNDk2NV9oZGxfY29tcHJlc3NlZF9iYShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7CitpbnQgaWw0OTY1X3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4KTsKK3ZvaWQgaWw0OTY1X2h3X3R4cV9jdHhfZnJlZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsNDk2NV90eHFfY3R4X2FsbG9jKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV90eHFfY3R4X3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsNDk2NV90eHFfY3R4X3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWw0OTY1X3R4cV9zZXRfc2NoZWQoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgbWFzayk7CisKKy8qCisgKiBBY3F1aXJlIGlsLT5sb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gIQorICovCit2b2lkIGlsNDk2NV9zZXRfd3JfcHRycyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQsIHUzMiBpZHgpOworLyoqCisgKiBpbDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyAtIChvcHRpb25hbGx5KSBzdGFydCBUeC9DbWQgcXVldWUKKyAqIEB0eF9maWZvX2lkOiBUeCBETUEvRklGTyBjaGFubmVsIChyYW5nZSAwLTcpIHRoYXQgdGhlIHF1ZXVlIHdpbGwgZmVlZAorICogQHNjZF9yZXRyeTogKDEpIEluZGljYXRlcyBxdWV1ZSB3aWxsIGJlIHVzZWQgaW4gYWdncmVnYXRpb24gbW9kZQorICoKKyAqIE5PVEU6ICBBY3F1aXJlIGlsLT5sb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gIQorICovCit2b2lkIGlsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEsCisJCQkJaW50IHR4X2ZpZm9faWQsIGludCBzY2RfcmV0cnkpOworCisvKiByeCAqLwordm9pZCBpbDQ5NjVfaGRsX21pc3NlZF9iZWFjb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOworYm9vbCBpbDQ5NjVfZ29vZF9wbGNwX2hlYWx0aChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCk7Cit2b2lkIGlsNDk2NV9oZGxfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbDQ5NjVfaGRsX2Nfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOworCisvKiBzY2FuICovCitpbnQgaWw0OTY1X3JlcXVlc3Rfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOworCisvKiBzdGF0aW9uIG1nbXQgKi8KK2ludCBpbDQ5NjVfbWFuYWdlX2lic3Nfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICAgYm9vbCBhZGQpOworCisvKiBoY21kICovCitpbnQgaWw0OTY1X3NlbmRfYmVhY29uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCitjb25zdCBjaGFyICppbDQ5NjVfZ2V0X3R4X2ZhaWxfcmVhc29uKHUzMiBzdGF0dXMpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqCitpbDQ5NjVfZ2V0X3R4X2ZhaWxfcmVhc29uKHUzMiBzdGF0dXMpCit7CisJcmV0dXJuICIiOworfQorI2VuZGlmCisKKy8qIHN0YXRpb24gbWFuYWdlbWVudCAqLworaW50IGlsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KTsKK2ludCBpbDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICAgIGNvbnN0IHU4ICphZGRyLCB1OCAqc3RhX2lkX3IpOworaW50IGlsNDk2NV9yZW1vdmVfZGVmYXVsdF93ZXBfa2V5KHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7CitpbnQgaWw0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKK2ludCBpbDQ5NjVfcmVzdG9yZV9kZWZhdWx0X3dlcF9rZXlzKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgICAgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KTsKK2ludCBpbDQ5NjVfc2V0X2R5bmFtaWNfa2V5KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5LCB1OCBzdGFfaWQpOworaW50IGlsNDk2NV9yZW1vdmVfZHluYW1pY19rZXkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksIHU4IHN0YV9pZCk7Cit2b2lkIGlsNDk2NV91cGRhdGVfdGtpcF9rZXkoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKKwkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwKKwkJCSAgICB1MTYgKnBoYXNlMWtleSk7CitpbnQgaWw0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIGludCB0aWQpOworaW50IGlsNDk2NV9zdGFfcnhfYWdnX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICBpbnQgdGlkLCB1MTYgc3NuKTsKK2ludCBpbDQ5NjVfc3RhX3J4X2FnZ19zdG9wKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgIGludCB0aWQpOwordm9pZCBpbDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBzdGFfaWQsIGludCBjbnQpOworaW50IGlsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyogcmF0ZSAqLworc3RhdGljIGlubGluZSB1OAoraWw0OTY1X2h3X2dldF9yYXRlKF9fbGUzMiByYXRlX25fZmxhZ3MpCit7CisJcmV0dXJuIGxlMzJfdG9fY3B1KHJhdGVfbl9mbGFncykgJiAweEZGOworfQorCisvKiBlZXByb20gKi8KK3ZvaWQgaWw0OTY1X2VlcHJvbV9nZXRfbWFjKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwgdTggKiBtYWMpOworaW50IGlsNDk2NV9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWw0OTY1X2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZShzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsNDk2NV9lZXByb21fY2hlY2tfdmVyc2lvbihzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKiBtYWM4MDIxMSBoYW5kbGVycyAoZm9yIDQ5NjUpICovCit2b2lkIGlsNDk2NV9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOworaW50IGlsNDk2NV9tYWNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBpbDQ5NjVfbWFjX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOwordm9pZCBpbDQ5NjVfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCisJCQkgICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsIHU2NCBtdWx0aWNhc3QpOworaW50IGlsNDk2NV9tYWNfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKK3ZvaWQgaWw0OTY1X21hY191cGRhdGVfdGtpcF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUzMiBpdjMyLAorCQkJCXUxNiAqcGhhc2Uxa2V5KTsKK2ludCBpbDQ5NjVfbWFjX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICBlbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiBhY3Rpb24sCisJCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICogc3NuLAorCQkJICAgIHU4IGJ1Zl9zaXplKTsKK2ludCBpbDQ5NjVfbWFjX3N0YV9hZGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKK3ZvaWQgaWw0OTY1X21hY19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpOworCit2b2lkIGlsNDk2NV9sZWRfZW5hYmxlKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qIEVFUFJPTSAqLworI2RlZmluZSBJTDQ5NjVfRUVQUk9NX0lNR19TSVpFCQkJMTAyNAorCisvKgorICogdUNvZGUgcXVldWUgbWFuYWdlbWVudCBkZWZpbml0aW9ucyAuLi4KKyAqIFRoZSBmaXJzdCBxdWV1ZSB1c2VkIGZvciBibG9jay1hY2sgYWdncmVnYXRpb24gaXMgIzcgKDQ5NjUgb25seSkuCisgKiBBbGwgYmxvY2stYWNrIGFnZ3JlZ2F0aW9uIHF1ZXVlcyBzaG91bGQgbWFwIHRvIFR4IERNQS9GSUZPIGNoYW5uZWwgNy4KKyAqLworI2RlZmluZSBJTDQ5X0ZJUlNUX0FNUERVX1FVRVVFCTcKKworLyogU2l6ZXMgYW5kIGFkZHJlc3NlcyBmb3IgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgbWVtb3J5IChTUkFNKSBpbgorICogNDk2NSdzIGVtYmVkZGVkIHByb2Nlc3Nvci4gIERyaXZlciBhY2Nlc3MgaXMgdmlhIEhCVVNfVEFSR19NRU1fKiByZWdzLiAqLworI2RlZmluZSBJTDQ5X1JUQ19JTlNUX0xPV0VSX0JPVU5ECQkoMHgwMDAwMDApCisjZGVmaW5lIElMNDlfUlRDX0lOU1RfVVBQRVJfQk9VTkQJCSgweDAxODAwMCkKKworI2RlZmluZSBJTDQ5X1JUQ19EQVRBX0xPV0VSX0JPVU5ECQkoMHg4MDAwMDApCisjZGVmaW5lIElMNDlfUlRDX0RBVEFfVVBQRVJfQk9VTkQJCSgweDgwQTAwMCkKKworI2RlZmluZSBJTDQ5X1JUQ19JTlNUX1NJWkUgIChJTDQ5X1JUQ19JTlNUX1VQUEVSX0JPVU5EIC0gXAorCQkJCUlMNDlfUlRDX0lOU1RfTE9XRVJfQk9VTkQpCisjZGVmaW5lIElMNDlfUlRDX0RBVEFfU0laRSAgKElMNDlfUlRDX0RBVEFfVVBQRVJfQk9VTkQgLSBcCisJCQkJSUw0OV9SVENfREFUQV9MT1dFUl9CT1VORCkKKworI2RlZmluZSBJTDQ5X01BWF9JTlNUX1NJWkUgSUw0OV9SVENfSU5TVF9TSVpFCisjZGVmaW5lIElMNDlfTUFYX0RBVEFfU0laRSBJTDQ5X1JUQ19EQVRBX1NJWkUKKworLyogU2l6ZSBvZiB1Q29kZSBpbnN0cnVjdGlvbiBtZW1vcnkgaW4gYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUgKi8KKyNkZWZpbmUgSUw0OV9NQVhfQlNNX1NJWkUgQlNNX1NSQU1fU0laRQorCitzdGF0aWMgaW5saW5lIGludAoraWw0OTY1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIodTMyIGFkZHIpCit7CisJcmV0dXJuIChhZGRyID49IElMNDlfUlRDX0RBVEFfTE9XRVJfQk9VTkQgJiYKKwkJYWRkciA8IElMNDlfUlRDX0RBVEFfVVBQRVJfQk9VTkQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqIFNUQVJUIFRFTVBFUkFUVVJFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogNDk2NSB0ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbi4KKyAqCisgKiBUaGUgZHJpdmVyIG11c3QgY2FsY3VsYXRlIHRoZSBkZXZpY2UgdGVtcGVyYXR1cmUgYmVmb3JlIGNhbGN1bGF0aW5nCisgKiBhIHR4cG93ZXIgc2V0dGluZyAoYW1wbGlmaWVyIGdhaW4gaXMgdGVtcGVyYXR1cmUgZGVwZW5kZW50KS4gIFRoZQorICogY2FsY3VsYXRpb24gdXNlcyA0IG1lYXN1cmVtZW50cywgMyBvZiB3aGljaCAoUjEsIFIyLCBSMykgYXJlIGNhbGlicmF0aW9uCisgKiB2YWx1ZXMgdXNlZCBmb3IgdGhlIGxpZmUgb2YgdGhlIGRyaXZlciwgYW5kIG9uZSBvZiB3aGljaCAoUjQpIGlzIHRoZQorICogcmVhbC10aW1lIHRlbXBlcmF0dXJlIGluZGljYXRvci4KKyAqCisgKiB1Q29kZSBwcm92aWRlcyBhbGwgNCB2YWx1ZXMgdG8gdGhlIGRyaXZlciB2aWEgdGhlICJpbml0aWFsaXplIGFsaXZlIgorICogbm90aWZpY2F0aW9uIChzZWUgc3RydWN0IGlsNDk2NV9pbml0X2FsaXZlX3Jlc3ApLiAgQWZ0ZXIgdGhlIHJ1bnRpbWUgdUNvZGUKKyAqIGltYWdlIGxvYWRzLCB1Q29kZSB1cGRhdGVzIHRoZSBSNCB2YWx1ZSB2aWEgc3RhdHMgbm90aWZpY2F0aW9ucworICogKHNlZSBOX1NUQVRTKSwgd2hpY2ggb2NjdXIgYWZ0ZXIgZWFjaCByZWNlaXZlZCBiZWFjb24KKyAqIHdoZW4gYXNzb2NpYXRlZCwgb3IgY2FuIGJlIHJlcXVlc3RlZCB2aWEgQ19TVEFUUy4KKyAqCisgKiBOT1RFOiAgdUNvZGUgcHJvdmlkZXMgdGhlIFI0IHZhbHVlIGFzIGEgMjMtYml0IHNpZ25lZCB2YWx1ZS4gIERyaXZlcgorICogICAgICAgIG11c3Qgc2lnbi1leHRlbmQgdG8gMzIgYml0cyBiZWZvcmUgYXBwbHlpbmcgZm9ybXVsYSBiZWxvdy4KKyAqCisgKiBGb3JtdWxhOgorICoKKyAqIGRlZ3JlZXMgS2VsdmluID0gKCg5NyAqIDI1OSAqIChSNCAtIFIyKSAvIChSMyAtIFIxKSkgLyAxMDApICsgOAorICoKKyAqIE5PVEU6ICBUaGUgYmFzaWMgZm9ybXVsYSBpcyAyNTkgKiAoUjQtUjIpIC8gKFIzLVIxKS4gIFRoZSA5Ny8xMDAgaXMKKyAqIGFuIGFkZGl0aW9uYWwgY29ycmVjdGlvbiwgd2hpY2ggc2hvdWxkIGJlIGNlbnRlcmVkIGFyb3VuZCAwIGRlZ3JlZXMKKyAqIENlbHNpdXMgKDI3MyBkZWdyZWVzIEtlbHZpbikuICBUaGUgOCAoMyBwZXJjZW50IG9mIDI3MykgY29tcGVuc2F0ZXMgZm9yCisgKiBjZW50ZXJpbmcgdGhlIDk3LzEwMCBjb3JyZWN0aW9uIGFyb3VuZCAwIGRlZ3JlZXMgSy4KKyAqCisgKiBBZGQgMjczIHRvIEtlbHZpbiB2YWx1ZSB0byBmaW5kIGRlZ3JlZXMgQ2Vsc2l1cywgZm9yIGNvbXBhcmluZyBjdXJyZW50CisgKiB0ZW1wZXJhdHVyZSB3aXRoIGZhY3RvcnktbWVhc3VyZWQgdGVtcGVyYXR1cmVzIHdoZW4gY2FsY3VsYXRpbmcgdHhwb3dlcgorICogc2V0dGluZ3MuCisgKi8KKyNkZWZpbmUgVEVNUEVSQVRVUkVfQ0FMSUJfS0VMVklOX09GRlNFVCA4CisjZGVmaW5lIFRFTVBFUkFUVVJFX0NBTElCX0FfVkFMIDI1OQorCisvKiBMaW1pdCByYW5nZSBvZiBjYWxjdWxhdGVkIHRlbXBlcmF0dXJlIHRvIGJlIGJldHdlZW4gdGhlc2UgS2VsdmluIHZhbHVlcyAqLworI2RlZmluZSBJTF9UWF9QT1dFUl9URU1QRVJBVFVSRV9NSU4gICgyNjMpCisjZGVmaW5lIElMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01BWCAgKDQxMCkKKworI2RlZmluZSBJTF9UWF9QT1dFUl9URU1QRVJBVFVSRV9PVVRfT0ZfUkFOR0UodCkgXAorCSgodCkgPCBJTF9UWF9QT1dFUl9URU1QRVJBVFVSRV9NSU4gfHwgXAorCSAodCkgPiBJTF9UWF9QT1dFUl9URU1QRVJBVFVSRV9NQVgpCisKKy8qKioqKioqKioqKioqKioqKioqKiogRU5EIFRFTVBFUkFUVVJFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBUWFBPV0VSICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIDQ5NjUgdHhwb3dlciBjYWxjdWxhdGlvbnMgcmVseSBvbiBpbmZvcm1hdGlvbiBmcm9tIHRocmVlIHNvdXJjZXM6CisgKgorICogICAgIDEpIEVFUFJPTQorICogICAgIDIpICJpbml0aWFsaXplIiBhbGl2ZSBub3RpZmljYXRpb24KKyAqICAgICAzKSBzdGF0cyBub3RpZmljYXRpb25zCisgKgorICogRUVQUk9NIGRhdGEgY29uc2lzdHMgb2Y6CisgKgorICogMSkgIFJlZ3VsYXRvcnkgaW5mb3JtYXRpb24gKG1heCB0eHBvd2VyIGFuZCBjaGFubmVsIHVzYWdlIGZsYWdzKSBpcyBwcm92aWRlZAorICogICAgIHNlcGFyYXRlbHkgZm9yIGVhY2ggY2hhbm5lbCB0aGF0IGNhbiBwb3NzaWJseSBzdXBwb3J0ZWQgYnkgNDk2NS4KKyAqICAgICA0MCBNSHogd2lkZSAoLjExbiBIVDQwKSBjaGFubmVscyBhcmUgbGlzdGVkIHNlcGFyYXRlbHkgZnJvbSAyMCBNSHoKKyAqICAgICAobGVnYWN5KSBjaGFubmVscy4KKyAqCisgKiAgICAgU2VlIHN0cnVjdCBpbDQ5NjVfZWVwcm9tX2NoYW5uZWwgZm9yIGZvcm1hdCwgYW5kIHN0cnVjdCBpbDQ5NjVfZWVwcm9tCisgKiAgICAgZm9yIGxvY2F0aW9ucyBpbiBFRVBST00uCisgKgorICogMikgIEZhY3RvcnkgdHhwb3dlciBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBzZXBhcmF0ZWx5IGZvcgorICogICAgIHN1Yi1iYW5kcyBvZiBjb250aWd1b3VzIGNoYW5uZWxzLiAgMi40R0h6IGhhcyBqdXN0IG9uZSBzdWItYmFuZCwKKyAqICAgICBidXQgNSBHSHogaGFzIHNldmVyYWwgc3ViLWJhbmRzLgorICoKKyAqICAgICBJbiBhZGRpdGlvbiwgcGVyLWJhbmQgKDIuNCBhbmQgNSBHaHopIHNhdHVyYXRpb24gdHhwb3dlcnMgYXJlIHByb3ZpZGVkLgorICoKKyAqICAgICBTZWUgc3RydWN0IGlsNDk2NV9lZXByb21fY2FsaWJfaW5mbyAoYW5kIHRoZSB0cmVlIG9mIHN0cnVjdHVyZXMKKyAqICAgICBjb250YWluZWQgd2l0aGluIGl0KSBmb3IgZm9ybWF0LCBhbmQgc3RydWN0IGlsNDk2NV9lZXByb20gZm9yCisgKiAgICAgbG9jYXRpb25zIGluIEVFUFJPTS4KKyAqCisgKiAiSW5pdGlhbGl6YXRpb24gYWxpdmUiIG5vdGlmaWNhdGlvbiAoc2VlIHN0cnVjdCBpbDQ5NjVfaW5pdF9hbGl2ZV9yZXNwKQorICogY29uc2lzdHMgb2Y6CisgKgorICogMSkgIFRlbXBlcmF0dXJlIGNhbGN1bGF0aW9uIHBhcmFtZXRlcnMuCisgKgorICogMikgIFBvd2VyIHN1cHBseSB2b2x0YWdlIG1lYXN1cmVtZW50LgorICoKKyAqIDMpICBUeCBnYWluIGNvbXBlbnNhdGlvbiB0byBiYWxhbmNlIDIgdHJhbnNtaXR0ZXJzIGZvciBNSU1PIHVzZS4KKyAqCisgKiBTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbnMgZGVsaXZlcjoKKyAqCisgKiAxKSAgQ3VycmVudCB2YWx1ZXMgZm9yIHRlbXBlcmF0dXJlIHBhcmFtIFI0LgorICovCisKKy8qKgorICogVG8gY2FsY3VsYXRlIGEgdHhwb3dlciBzZXR0aW5nIGZvciBhIGdpdmVuIGRlc2lyZWQgdGFyZ2V0IHR4cG93ZXIsIGNoYW5uZWwsCisgKiBtb2R1bGF0aW9uIGJpdCByYXRlLCBhbmQgdHJhbnNtaXR0ZXIgY2hhaW4gKDQ5NjUgaGFzIDIgdHJhbnNtaXR0ZXJzIHRvCisgKiBzdXBwb3J0IE1JTU8gYW5kIHRyYW5zbWl0IGRpdmVyc2l0eSksIGRyaXZlciBtdXN0IGRvIHRoZSBmb2xsb3dpbmc6CisgKgorICogMSkgIENvbXBhcmUgZGVzaXJlZCB0eHBvd2VyIHZzLiAoRUVQUk9NKSByZWd1bGF0b3J5IGxpbWl0IGZvciB0aGlzIGNoYW5uZWwuCisgKiAgICAgRG8gbm90IGV4Y2VlZCByZWd1bGF0b3J5IGxpbWl0OyByZWR1Y2UgdGFyZ2V0IHR4cG93ZXIgaWYgbmVjZXNzYXJ5LgorICoKKyAqICAgICBJZiBzZXR0aW5nIHVwIHR4cG93ZXJzIGZvciBNSU1PIHJhdGVzIChyYXRlIGlkeGVzIDgtMTUsIDI0LTMxKSwKKyAqICAgICAyIHRyYW5zbWl0dGVycyB3aWxsIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHk7IGRyaXZlciBtdXN0IHJlZHVjZSB0aGUKKyAqICAgICByZWd1bGF0b3J5IGxpbWl0IGJ5IDMgZEIgKGhhbGYtcG93ZXIpIGZvciBlYWNoIHRyYW5zbWl0dGVyLCBzbyB0aGUKKyAqICAgICBjb21iaW5lZCB0b3RhbCBvdXRwdXQgb2YgdGhlIDIgdHJhbnNtaXR0ZXJzIGlzIHdpdGhpbiByZWd1bGF0b3J5IGxpbWl0cy4KKyAqCisgKgorICogMikgIENvbXBhcmUgdGFyZ2V0IHR4cG93ZXIgdnMuIChFRVBST00pIHNhdHVyYXRpb24gdHhwb3dlciAqcmVkdWNlZCBieQorICogICAgIGJhY2tvZmYgZm9yIHRoaXMgYml0IHJhdGUqLiAgRG8gbm90IGV4Y2VlZCAoc2F0dXJhdGlvbiAtIGJhY2tvZmZbcmF0ZV0pOworICogICAgIHJlZHVjZSB0YXJnZXQgdHhwb3dlciBpZiBuZWNlc3NhcnkuCisgKgorICogICAgIEJhY2tvZmYgdmFsdWVzIGJlbG93IGFyZSBpbiAxLzIgZEIgdW5pdHMgKGVxdWl2YWxlbnQgdG8gc3RlcHMgaW4KKyAqICAgICB0eHBvd2VyIGdhaW4gdGFibGVzKToKKyAqCisgKiAgICAgT0ZETSA2IC0gMzYgTUJpdDogIDEwIHN0ZXBzICg1IGRCKQorICogICAgIE9GRE0gNDggTUJpdDogICAgICAxNSBzdGVwcyAoNy41IGRCKQorICogICAgIE9GRE0gNTQgTUJpdDogICAgICAxNyBzdGVwcyAoOC41IGRCKQorICogICAgIE9GRE0gNjAgTUJpdDogICAgICAyMCBzdGVwcyAoMTAgZEIpCisgKiAgICAgQ0NLIGFsbCByYXRlczogICAgIDEwIHN0ZXBzICg1IGRCKQorICoKKyAqICAgICBCYWNrb2ZmIHZhbHVlcyBhcHBseSB0byBzYXR1cmF0aW9uIHR4cG93ZXIgb24gYSBwZXItdHJhbnNtaXR0ZXIgYmFzaXM7CisgKiAgICAgd2hlbiB1c2luZyBNSU1PICgyIHRyYW5zbWl0dGVycyksIGVhY2ggdHJhbnNtaXR0ZXIgdXNlcyB0aGUgc2FtZQorICogICAgIHNhdHVyYXRpb24gbGV2ZWwgcHJvdmlkZWQgaW4gRUVQUk9NLCBhbmQgdGhlIHNhbWUgYmFja29mZiB2YWx1ZXM7CisgKiAgICAgbm8gcmVkdWN0aW9uIChzdWNoIGFzIHdpdGggcmVndWxhdG9yeSB0eHBvd2VyIGxpbWl0cykgaXMgcmVxdWlyZWQuCisgKgorICogICAgIFNhdHVyYXRpb24gYW5kIEJhY2tvZmYgdmFsdWVzIGFwcGx5IGVxdWFsbHkgdG8gMjAgTWh6IChsZWdhY3kpIGNoYW5uZWwKKyAqICAgICB3aWR0aHMgYW5kIDQwIE1oeiAoLjExbiBIVDQwKSBjaGFubmVsIHdpZHRoczsgdGhlcmUgaXMgbm8gc2VwYXJhdGUKKyAqICAgICBmYWN0b3J5IG1lYXN1cmVtZW50IGZvciBodDQwIGNoYW5uZWxzLgorICoKKyAqICAgICBUaGUgcmVzdWx0IG9mIHRoaXMgc3RlcCBpcyB0aGUgZmluYWwgdGFyZ2V0IHR4cG93ZXIuICBUaGUgcmVzdCBvZgorICogICAgIHRoZSBzdGVwcyBmaWd1cmUgb3V0IHRoZSBwcm9wZXIgc2V0dGluZ3MgZm9yIHRoZSBkZXZpY2UgdG8gYWNoaWV2ZQorICogICAgIHRoYXQgdGFyZ2V0IHR4cG93ZXIuCisgKgorICoKKyAqIDMpICBEZXRlcm1pbmUgKEVFUFJPTSkgY2FsaWJyYXRpb24gc3ViIGJhbmQgZm9yIHRoZSB0YXJnZXQgY2hhbm5lbCwgYnkKKyAqICAgICBjb21wYXJpbmcgYWdhaW5zdCBmaXJzdCBhbmQgbGFzdCBjaGFubmVscyBpbiBlYWNoIHN1YiBiYW5kCisgKiAgICAgKHNlZSBzdHJ1Y3QgaWw0OTY1X2VlcHJvbV9jYWxpYl9zdWJiYW5kX2luZm8pLgorICoKKyAqCisgKiA0KSAgTGluZWFybHkgaW50ZXJwb2xhdGUgKEVFUFJPTSkgZmFjdG9yeSBjYWxpYnJhdGlvbiBtZWFzdXJlbWVudCBzZXRzLAorICogICAgIHJlZmVyZW5jaW5nIHRoZSAyIGZhY3RvcnktbWVhc3VyZWQgKHNhbXBsZSkgY2hhbm5lbHMgd2l0aGluIHRoZSBzdWIgYmFuZC4KKyAqCisgKiAgICAgSW50ZXJwb2xhdGlvbiBpcyBiYXNlZCBvbiBkaWZmZXJlbmNlIGJldHdlZW4gdGFyZ2V0IGNoYW5uZWwncyBmcmVxdWVuY3kKKyAqICAgICBhbmQgdGhlIHNhbXBsZSBjaGFubmVscycgZnJlcXVlbmNpZXMuICBTaW5jZSBjaGFubmVsIG51bWJlcnMgYXJlIGJhc2VkCisgKiAgICAgb24gZnJlcXVlbmN5ICg1IE1IeiBiZXR3ZWVuIGVhY2ggY2hhbm5lbCBudW1iZXIpLCB0aGlzIGlzIGVxdWl2YWxlbnQKKyAqICAgICB0byBpbnRlcnBvbGF0aW5nIGJhc2VkIG9uIGNoYW5uZWwgbnVtYmVyIGRpZmZlcmVuY2VzLgorICoKKyAqICAgICBOb3RlIHRoYXQgdGhlIHNhbXBsZSBjaGFubmVscyBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgY2hhbm5lbHMgYXQgdGhlCisgKiAgICAgZWRnZXMgb2YgdGhlIHN1YiBiYW5kLiAgVGhlIHRhcmdldCBjaGFubmVsIG1heSBiZSAib3V0c2lkZSIgb2YgdGhlCisgKiAgICAgc3BhbiBvZiB0aGUgc2FtcGxlZCBjaGFubmVscy4KKyAqCisgKiAgICAgRHJpdmVyIG1heSBjaG9vc2UgdGhlIHBhaXIgKGZvciAyIFR4IGNoYWlucykgb2YgbWVhc3VyZW1lbnRzIChzZWUKKyAqICAgICBzdHJ1Y3QgaWw0OTY1X2VlcHJvbV9jYWxpYl9jaF9pbmZvKSBmb3Igd2hpY2ggdGhlIGFjdHVhbCBtZWFzdXJlZAorICogICAgIHR4cG93ZXIgY29tZXMgY2xvc2VzdCB0byB0aGUgZGVzaXJlZCB0eHBvd2VyLiAgVXN1YWxseSwgdGhvdWdoLAorICogICAgIHRoZSBtaWRkbGUgc2V0IG9mIG1lYXN1cmVtZW50cyBpcyBjbG9zZXN0IHRvIHRoZSByZWd1bGF0b3J5IGxpbWl0cywKKyAqICAgICBhbmQgaXMgdGhlcmVmb3JlIGEgZ29vZCBjaG9pY2UgZm9yIGFsbCB0eHBvd2VyIGNhbGN1bGF0aW9ucyAodGhpcworICogICAgIGFzc3VtZXMgdGhhdCBoaWdoIGFjY3VyYWN5IGlzIG5lZWRlZCBmb3IgbWF4aW1pemluZyBsZWdhbCB0eHBvd2VyLAorICogICAgIHdoaWxlIGxvd2VyIHR4cG93ZXIgY29uZmlndXJhdGlvbnMgZG8gbm90IG5lZWQgYXMgbXVjaCBhY2N1cmFjeSkuCisgKgorICogICAgIERyaXZlciBzaG91bGQgaW50ZXJwb2xhdGUgYm90aCBtZW1iZXJzIG9mIHRoZSBjaG9zZW4gbWVhc3VyZW1lbnQgcGFpciwKKyAqICAgICBpLmUuIGZvciBib3RoIFR4IGNoYWlucyAocmFkaW8gdHJhbnNtaXR0ZXJzKSwgdW5sZXNzIHRoZSBkcml2ZXIga25vd3MKKyAqICAgICB0aGF0IG9ubHkgb25lIG9mIHRoZSBjaGFpbnMgd2lsbCBiZSB1c2VkIChlLmcuIG9ubHkgb25lIHR4IGFudGVubmEKKyAqICAgICBjb25uZWN0ZWQsIGJ1dCB0aGlzIHNob3VsZCBiZSB1bnVzdWFsKS4gIFRoZSByYXRlIHNjYWxpbmcgYWxnb3JpdGhtCisgKiAgICAgc3dpdGNoZXMgYW50ZW5uYXMgdG8gZmluZCBiZXN0IHBlcmZvcm1hbmNlLCBzbyBib3RoIFR4IGNoYWlucyB3aWxsCisgKiAgICAgYmUgdXNlZCAoYWx0aG91Z2ggb25seSBvbmUgYXQgYSB0aW1lKSBldmVuIGZvciBub24tTUlNTyB0cmFuc21pc3Npb25zLgorICoKKyAqICAgICBEcml2ZXIgc2hvdWxkIGludGVycG9sYXRlIGZhY3RvcnkgdmFsdWVzIGZvciB0ZW1wZXJhdHVyZSwgZ2FpbiB0YWJsZQorICogICAgIGlkeCwgYW5kIGFjdHVhbCBwb3dlci4gIFRoZSBwb3dlciBhbXBsaWZpZXIgZGV0ZWN0b3IgdmFsdWVzIGFyZQorICogICAgIG5vdCB1c2VkIGJ5IHRoZSBkcml2ZXIuCisgKgorICogICAgIFNhbml0eSBjaGVjazogIElmIHRoZSB0YXJnZXQgY2hhbm5lbCBoYXBwZW5zIHRvIGJlIG9uZSBvZiB0aGUgc2FtcGxlCisgKiAgICAgY2hhbm5lbHMsIHRoZSByZXN1bHRzIHNob3VsZCBhZ3JlZSB3aXRoIHRoZSBzYW1wbGUgY2hhbm5lbCdzCisgKiAgICAgbWVhc3VyZW1lbnRzIQorICoKKyAqCisgKiA1KSAgRmluZCBkaWZmZXJlbmNlIGJldHdlZW4gZGVzaXJlZCB0eHBvd2VyIGFuZCAoaW50ZXJwb2xhdGVkKQorICogICAgIGZhY3RvcnktbWVhc3VyZWQgdHhwb3dlci4gIFVzaW5nIChpbnRlcnBvbGF0ZWQpIGZhY3RvcnkgZ2FpbiB0YWJsZSBpZHgKKyAqICAgICAoc2hvd24gZWxzZXdoZXJlKSBhcyBhIHN0YXJ0aW5nIHBvaW50LCBhZGp1c3QgdGhpcyBpZHggbG93ZXIgdG8KKyAqICAgICBpbmNyZWFzZSB0eHBvd2VyLCBvciBoaWdoZXIgdG8gZGVjcmVhc2UgdHhwb3dlciwgdW50aWwgdGhlIHRhcmdldAorICogICAgIHR4cG93ZXIgaXMgcmVhY2hlZC4gIEVhY2ggc3RlcCBpbiB0aGUgZ2FpbiB0YWJsZSBpcyAxLzIgZEIuCisgKgorICogICAgIEZvciBleGFtcGxlLCBpZiBmYWN0b3J5IG1lYXN1cmVkIHR4cG93ZXIgaXMgMTYgZEJtLCBhbmQgdGFyZ2V0IHR4cG93ZXIKKyAqICAgICBpcyAxMyBkQm0sIGFkZCA2IHN0ZXBzIHRvIHRoZSBmYWN0b3J5IGdhaW4gaWR4IHRvIHJlZHVjZSB0eHBvd2VyCisgKiAgICAgYnkgMyBkQi4KKyAqCisgKgorICogNikgIEZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgZGV2aWNlIHRlbXBlcmF0dXJlIGFuZCAoaW50ZXJwb2xhdGVkKQorICogICAgIGZhY3RvcnktbWVhc3VyZWQgdGVtcGVyYXR1cmUgZm9yIHN1Yi1iYW5kLiAgRmFjdG9yeSB2YWx1ZXMgYXJlIGluCisgKiAgICAgZGVncmVlcyBDZWxzaXVzLiAgVG8gY2FsY3VsYXRlIGN1cnJlbnQgdGVtcGVyYXR1cmUsIHNlZSBjb21tZW50cyBmb3IKKyAqICAgICAiNDk2NSB0ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiIuCisgKgorICogICAgIElmIGN1cnJlbnQgdGVtcGVyYXR1cmUgaXMgaGlnaGVyIHRoYW4gZmFjdG9yeSB0ZW1wZXJhdHVyZSwgZHJpdmVyIG11c3QKKyAqICAgICBpbmNyZWFzZSBnYWluIChsb3dlciBnYWluIHRhYmxlIGlkeCksIGFuZCB2aWNlIHZlcnNlLgorICoKKyAqICAgICBUZW1wZXJhdHVyZSBhZmZlY3RzIGdhaW4gZGlmZmVyZW50bHkgZm9yIGRpZmZlcmVudCBjaGFubmVsczoKKyAqCisgKiAgICAgMi40IEdIeiBhbGwgY2hhbm5lbHM6ICAzLjUgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCisgKiAgICAgNSBHSHogY2hhbm5lbHMgMzQtNDM6ICA0LjUgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCisgKiAgICAgNSBHSHogY2hhbm5lbHMgPj0gNDQ6ICA0LjAgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCisgKgorICogICAgIE5PVEU6ICBUZW1wZXJhdHVyZSBjYW4gaW5jcmVhc2UgcmFwaWRseSB3aGVuIHRyYW5zbWl0dGluZywgZXNwZWNpYWxseQorICogICAgICAgICAgICB3aXRoIGhlYXZ5IHRyYWZmaWMgYXQgaGlnaCB0eHBvd2Vycy4gIERyaXZlciBzaG91bGQgdXBkYXRlCisgKiAgICAgICAgICAgIHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9ucyBvZnRlbiB1bmRlciB0aGVzZSBjb25kaXRpb25zIHRvCisgKiAgICAgICAgICAgIG1haW50YWluIHN0cm9uZyB0eHBvd2VyIGluIHRoZSBmYWNlIG9mIHJpc2luZyB0ZW1wZXJhdHVyZS4KKyAqCisgKgorICogNykgIEZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgaW5kaWNhdG9yCisgKiAgICAgKGZyb20gImluaXRpYWxpemUgYWxpdmUiKSBhbmQgZmFjdG9yeS1tZWFzdXJlZCBwb3dlciBzdXBwbHkgdm9sdGFnZQorICogICAgIGluZGljYXRvciAoRUVQUk9NKS4KKyAqCisgKiAgICAgSWYgdGhlIGN1cnJlbnQgdm9sdGFnZSBpcyBoaWdoZXIgKGluZGljYXRvciBpcyBsb3dlcikgdGhhbiBmYWN0b3J5CisgKiAgICAgdm9sdGFnZSwgZ2FpbiBzaG91bGQgYmUgcmVkdWNlZCAoZ2FpbiB0YWJsZSBpZHggaW5jcmVhc2VkKSBieToKKyAqCisgKiAgICAgKGVlcHJvbSAtIGN1cnJlbnQpIC8gNworICoKKyAqICAgICBJZiB0aGUgY3VycmVudCB2b2x0YWdlIGlzIGxvd2VyIChpbmRpY2F0b3IgaXMgaGlnaGVyKSB0aGFuIGZhY3RvcnkKKyAqICAgICB2b2x0YWdlLCBnYWluIHNob3VsZCBiZSBpbmNyZWFzZWQgKGdhaW4gdGFibGUgaWR4IGRlY3JlYXNlZCkgYnk6CisgKgorICogICAgIDIgKiAoY3VycmVudCAtIGVlcHJvbSkgLyA3CisgKgorICogICAgIElmIG51bWJlciBvZiBpZHggc3RlcHMgaW4gZWl0aGVyIGRpcmVjdGlvbiB0dXJucyBvdXQgdG8gYmUgPiAyLAorICogICAgIHNvbWV0aGluZyBpcyB3cm9uZyAuLi4ganVzdCB1c2UgMC4KKyAqCisgKiAgICAgTk9URTogIFZvbHRhZ2UgY29tcGVuc2F0aW9uIGlzIGluZGVwZW5kZW50IG9mIGJhbmQvY2hhbm5lbC4KKyAqCisgKiAgICAgTk9URTogICJJbml0aWFsaXplIiB1Q29kZSBtZWFzdXJlcyBjdXJyZW50IHZvbHRhZ2UsIHdoaWNoIGlzIGFzc3VtZWQKKyAqICAgICAgICAgICAgdG8gYmUgY29uc3RhbnQgYWZ0ZXIgdGhpcyBpbml0aWFsIG1lYXN1cmVtZW50LiAgVm9sdGFnZQorICogICAgICAgICAgICBjb21wZW5zYXRpb24gZm9yIHR4cG93ZXIgKG51bWJlciBvZiBzdGVwcyBpbiBnYWluIHRhYmxlKQorICogICAgICAgICAgICBtYXkgYmUgY2FsY3VsYXRlZCBvbmNlIGFuZCB1c2VkIHVudGlsIHRoZSBuZXh0IHVDb2RlIGJvb3Rsb2FkLgorICoKKyAqCisgKiA4KSAgSWYgc2V0dGluZyB1cCB0eHBvd2VycyBmb3IgTUlNTyByYXRlcyAocmF0ZSBpZHhlcyA4LTE1LCAyNC0zMSksCisgKiAgICAgYWRqdXN0IHR4cG93ZXIgZm9yIGVhY2ggdHJhbnNtaXR0ZXIgY2hhaW4sIHNvIHR4cG93ZXIgaXMgYmFsYW5jZWQKKyAqICAgICBiZXR3ZWVuIHRoZSB0d28gY2hhaW5zLiAgVGhlcmUgYXJlIDUgcGFpcnMgb2YgdHhfYXR0ZW5bZ3JvdXBdW2NoYWluXQorICogICAgIHZhbHVlcyBpbiAiaW5pdGlhbGl6ZSBhbGl2ZSIsIG9uZSBwYWlyIGZvciBlYWNoIG9mIDUgY2hhbm5lbCByYW5nZXM6CisgKgorICogICAgIEdyb3VwIDA6ICA1IEdIeiBjaGFubmVsIDM0LTQzCisgKiAgICAgR3JvdXAgMTogIDUgR0h6IGNoYW5uZWwgNDQtNzAKKyAqICAgICBHcm91cCAyOiAgNSBHSHogY2hhbm5lbCA3MS0xMjQKKyAqICAgICBHcm91cCAzOiAgNSBHSHogY2hhbm5lbCAxMjUtMjAwCisgKiAgICAgR3JvdXAgNDogIDIuNCBHSHogYWxsIGNoYW5uZWxzCisgKgorICogICAgIEFkZCB0aGUgdHhfYXR0ZW5bZ3JvdXBdW2NoYWluXSB2YWx1ZSB0byB0aGUgaWR4IGZvciB0aGUgdGFyZ2V0IGNoYWluLgorICogICAgIFRoZSB2YWx1ZXMgYXJlIHNpZ25lZCwgYnV0IGFyZSBpbiBwYWlycyBvZiAwIGFuZCBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsCisgKiAgICAgc28gYXMgdG8gcmVkdWNlIGdhaW4gKGlmIG5lY2Vzc2FyeSkgb2YgdGhlICJob3R0ZXIiIGNoYW5uZWwuICBUaGlzCisgKiAgICAgYXZvaWRzIGFueSBuZWVkIHRvIGRvdWJsZS1jaGVjayBmb3IgcmVndWxhdG9yeSBjb21wbGlhbmNlIGFmdGVyCisgKiAgICAgdGhpcyBzdGVwLgorICoKKyAqCisgKiA5KSAgSWYgc2V0dGluZyB1cCBmb3IgYSBDQ0sgcmF0ZSwgbG93ZXIgdGhlIGdhaW4gYnkgYWRkaW5nIGEgQ0NLIGNvbXBlbnNhdGlvbgorICogICAgIHZhbHVlIHRvIHRoZSBpZHg6CisgKgorICogICAgIEhhcmR3YXJlIHJldiBCOiAgOSBzdGVwcyAoNC41IGRCKQorICogICAgIEhhcmR3YXJlIHJldiBDOiAgNSBzdGVwcyAoMi41IGRCKQorICoKKyAqICAgICBIYXJkd2FyZSByZXYgZm9yIDQ5NjUgY2FuIGJlIGRldGVybWluZWQgYnkgcmVhZGluZyBDU1JfSFdfUkVWX1dBX1JFRywKKyAqICAgICBiaXRzIFszOjJdLCAxID0gQiwgMiA9IEMuCisgKgorICogICAgIE5PVEU6ICBUaGlzIGNvbXBlbnNhdGlvbiBpcyBpbiBhZGRpdGlvbiB0byBhbnkgc2F0dXJhdGlvbiBiYWNrb2ZmIHRoYXQKKyAqICAgICAgICAgICAgbWlnaHQgaGF2ZSBiZWVuIGFwcGxpZWQgaW4gYW4gZWFybGllciBzdGVwLgorICoKKyAqCisgKiAxMCkgU2VsZWN0IHRoZSBnYWluIHRhYmxlLCBiYXNlZCBvbiBiYW5kICgyLjQgdnMgNSBHSHopLgorICoKKyAqICAgICBMaW1pdCB0aGUgYWRqdXN0ZWQgaWR4IHRvIHN0YXkgd2l0aGluIHRoZSB0YWJsZSEKKyAqCisgKgorICogMTEpIFJlYWQgZ2FpbiB0YWJsZSBlbnRyaWVzIGZvciBEU1AgYW5kIHJhZGlvIGdhaW4sIHBsYWNlIGludG8gYXBwcm9wcmlhdGUKKyAqICAgICBsb2NhdGlvbihzKSBpbiBjb21tYW5kIChzdHJ1Y3QgaWw0OTY1X3R4cG93ZXJ0YWJsZV9jbWQpLgorICovCisKKy8qKgorICogV2hlbiBNSU1PIGlzIHVzZWQgKDIgdHJhbnNtaXR0ZXJzIG9wZXJhdGluZyBzaW11bHRhbmVvdXNseSksIGRyaXZlciBzaG91bGQKKyAqIGxpbWl0IGVhY2ggdHJhbnNtaXR0ZXIgdG8gZGVsaXZlciBhIG1heCBvZiAzIGRCIGJlbG93IHRoZSByZWd1bGF0b3J5IGxpbWl0CisgKiBmb3IgdGhlIGRldmljZS4gIFRoYXQgaXMsIHVzZSBoYWxmIHBvd2VyIGZvciBlYWNoIHRyYW5zbWl0dGVyLCBzbyB0b3RhbAorICogdHhwb3dlciBpcyB3aXRoaW4gcmVndWxhdG9yeSBsaW1pdHMuCisgKgorICogVGhlIHZhbHVlICI2IiByZXByZXNlbnRzIG51bWJlciBvZiBzdGVwcyBpbiBnYWluIHRhYmxlIHRvIHJlZHVjZSBwb3dlciAzIGRCLgorICogRWFjaCBzdGVwIGlzIDEvMiBkQi4KKyAqLworI2RlZmluZSBJTF9UWF9QT1dFUl9NSU1PX1JFR1VMQVRPUllfQ09NUEVOU0FUSU9OICg2KQorCisvKioKKyAqIENDSyBnYWluIGNvbXBlbnNhdGlvbi4KKyAqCisgKiBXaGVuIGNhbGN1bGF0aW5nIHR4cG93ZXJzIGZvciBDQ0ssIGFmdGVyIG1ha2luZyBzdXJlIHRoYXQgdGhlIHRhcmdldCBwb3dlcgorICogaXMgd2l0aGluIHJlZ3VsYXRvcnkgYW5kIHNhdHVyYXRpb24gbGltaXRzLCBkcml2ZXIgbXVzdCBhZGRpdGlvbmFsbHkKKyAqIGJhY2sgb2ZmIGdhaW4gYnkgYWRkaW5nIHRoZXNlIHZhbHVlcyB0byB0aGUgZ2FpbiB0YWJsZSBpZHguCisgKgorICogSGFyZHdhcmUgcmV2IGZvciA0OTY1IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgQ1NSX0hXX1JFVl9XQV9SRUcsCisgKiBiaXRzIFszOjJdLCAxID0gQiwgMiA9IEMuCisgKi8KKyNkZWZpbmUgSUxfVFhfUE9XRVJfQ0NLX0NPTVBFTlNBVElPTl9CX1NURVAgKDkpCisjZGVmaW5lIElMX1RYX1BPV0VSX0NDS19DT01QRU5TQVRJT05fQ19TVEVQICg1KQorCisvKgorICogNDk2NSBwb3dlciBzdXBwbHkgdm9sdGFnZSBjb21wZW5zYXRpb24gZm9yIHR4cG93ZXIKKyAqLworI2RlZmluZSBUWF9QT1dFUl9JTF9WT0xUQUdFX0NPREVTX1BFUl8wM1YgICAoNykKKworLyoqCisgKiBHYWluIHRhYmxlcy4KKyAqCisgKiBUaGUgZm9sbG93aW5nIHRhYmxlcyBjb250YWluIHBhaXIgb2YgdmFsdWVzIGZvciBzZXR0aW5nIHR4cG93ZXIsIGkuZS4KKyAqIGdhaW4gc2V0dGluZ3MgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIGRldmljZSdzIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciAoRFNQKSwKKyAqIGFuZCBmb3IgdGhlIGFuYWxvZyBnYWluIHN0cnVjdHVyZSBvZiB0aGUgdHJhbnNtaXR0ZXIuCisgKgorICogRWFjaCBlbnRyeSBpbiB0aGUgZ2FpbiB0YWJsZXMgcmVwcmVzZW50cyBhIHN0ZXAgb2YgMS8yIGRCLiAgTm90ZSB0aGF0IHRoZXNlCisgKiBhcmUgKnJlbGF0aXZlKiBzdGVwcywgbm90IGluZGljYXRpb25zIG9mIGFic29sdXRlIG91dHB1dCBwb3dlci4gIE91dHB1dAorICogcG93ZXIgdmFyaWVzIHdpdGggdGVtcGVyYXR1cmUsIHZvbHRhZ2UsIGFuZCBjaGFubmVsIGZyZXF1ZW5jeSwgYW5kIGFsc28KKyAqIHJlcXVpcmVzIGNvbnNpZGVyYXRpb24gb2YgYXZlcmFnZSBwb3dlciAodG8gc2F0aXNmeSByZWd1bGF0b3J5IGNvbnN0cmFpbnRzKSwKKyAqIGFuZCBwZWFrIHBvd2VyICh0byBhdm9pZCBkaXN0b3J0aW9uIG9mIHRoZSBvdXRwdXQgc2lnbmFsKS4KKyAqCisgKiBFYWNoIGVudHJ5IGNvbnRhaW5zIHR3byB2YWx1ZXM6CisgKiAxKSAgRFNQIGdhaW4gKG9yIHNvbWV0aW1lcyBjYWxsZWQgRFNQIGF0dGVudWF0aW9uKS4gIFRoaXMgaXMgYSBmaW5lLWdyYWluZWQKKyAqICAgICBsaW5lYXIgdmFsdWUgdGhhdCBtdWx0aXBsaWVzIHRoZSBvdXRwdXQgb2YgdGhlIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciwKKyAqICAgICBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgYW5hbG9nIHJhZGlvLgorICogMikgIFJhZGlvIGdhaW4uICBUaGlzIHNldHMgdGhlIGFuYWxvZyBnYWluIG9mIHRoZSByYWRpbyBUeCBwYXRoLgorICogICAgIEl0IGlzIGEgY29hcnNlciBzZXR0aW5nLCBhbmQgYmVoYXZlcyBpbiBhIGxvZ2FyaXRobWljIChkQikgZmFzaGlvbi4KKyAqCisgKiBFRVBST00gY29udGFpbnMgZmFjdG9yeSBjYWxpYnJhdGlvbiBkYXRhIGZvciB0eHBvd2VyLiAgVGhpcyBtYXBzIGFjdHVhbAorICogbWVhc3VyZWQgdHhwb3dlciBsZXZlbHMgdG8gZ2FpbiBzZXR0aW5ncyBpbiB0aGUgIndlbGwga25vd24iIHRhYmxlcworICogYmVsb3cgKCJ3ZWxsLWtub3duIiBtZWFucyBoZXJlIHRoYXQgYm90aCBmYWN0b3J5IGNhbGlicmF0aW9uICphbmQqIHRoZQorICogZHJpdmVyIHdvcmsgd2l0aCB0aGUgc2FtZSB0YWJsZSkuCisgKgorICogVGhlcmUgYXJlIHNlcGFyYXRlIHRhYmxlcyBmb3IgMi40IEdIeiBhbmQgNSBHSHogYmFuZHMuICBUaGUgNSBHSHogdGFibGUKKyAqIGhhcyBhbiBleHRlbnNpb24gKGludG8gbmVnYXRpdmUgaWR4ZXMpLCBpbiBjYXNlIHRoZSBkcml2ZXIgbmVlZHMgdG8KKyAqIGJvb3N0IHBvd2VyIHNldHRpbmcgZm9yIGhpZ2ggZGV2aWNlIHRlbXBlcmF0dXJlcyAoaGlnaGVyIHRoYW4gd291bGQgYmUKKyAqIHByZXNlbnQgZHVyaW5nIGZhY3RvcnkgY2FsaWJyYXRpb24pLiAgQSA1IEdoeiBFRVBST00gaWR4IG9mICI0MCIKKyAqIGNvcnJlc3BvbmRzIHRvIHRoZSA0OXRoIGVudHJ5IGluIHRoZSB0YWJsZSB1c2VkIGJ5IHRoZSBkcml2ZXIuCisgKi8KKyNkZWZpbmUgTUlOX1RYX0dBSU5fSURYCQkoMCkJLyogaGlnaGVzdCBnYWluLCBsb3dlc3QgaWR4LCAyLjQgKi8KKyNkZWZpbmUgTUlOX1RYX0dBSU5fSURYXzUyR0haX0VYVAkoLTkpCS8qIGhpZ2hlc3QgZ2FpbiwgbG93ZXN0IGlkeCwgNSAqLworCisvKioKKyAqIDIuNCBHSHogZ2FpbiB0YWJsZQorICoKKyAqIEluZGV4ICAgIERzcCBnYWluICAgUmFkaW8gZ2FpbgorICogICAwICAgICAgICAxMTAgICAgICAgICAweDNmICAgICAgKGhpZ2hlc3QgZ2FpbikKKyAqICAgMSAgICAgICAgMTA0ICAgICAgICAgMHgzZgorICogICAyICAgICAgICAgOTggICAgICAgICAweDNmCisgKiAgIDMgICAgICAgIDExMCAgICAgICAgIDB4M2UKKyAqICAgNCAgICAgICAgMTA0ICAgICAgICAgMHgzZQorICogICA1ICAgICAgICAgOTggICAgICAgICAweDNlCisgKiAgIDYgICAgICAgIDExMCAgICAgICAgIDB4M2QKKyAqICAgNyAgICAgICAgMTA0ICAgICAgICAgMHgzZAorICogICA4ICAgICAgICAgOTggICAgICAgICAweDNkCisgKiAgIDkgICAgICAgIDExMCAgICAgICAgIDB4M2MKKyAqICAxMCAgICAgICAgMTA0ICAgICAgICAgMHgzYworICogIDExICAgICAgICAgOTggICAgICAgICAweDNjCisgKiAgMTIgICAgICAgIDExMCAgICAgICAgIDB4M2IKKyAqICAxMyAgICAgICAgMTA0ICAgICAgICAgMHgzYgorICogIDE0ICAgICAgICAgOTggICAgICAgICAweDNiCisgKiAgMTUgICAgICAgIDExMCAgICAgICAgIDB4M2EKKyAqICAxNiAgICAgICAgMTA0ICAgICAgICAgMHgzYQorICogIDE3ICAgICAgICAgOTggICAgICAgICAweDNhCisgKiAgMTggICAgICAgIDExMCAgICAgICAgIDB4MzkKKyAqICAxOSAgICAgICAgMTA0ICAgICAgICAgMHgzOQorICogIDIwICAgICAgICAgOTggICAgICAgICAweDM5CisgKiAgMjEgICAgICAgIDExMCAgICAgICAgIDB4MzgKKyAqICAyMiAgICAgICAgMTA0ICAgICAgICAgMHgzOAorICogIDIzICAgICAgICAgOTggICAgICAgICAweDM4CisgKiAgMjQgICAgICAgIDExMCAgICAgICAgIDB4MzcKKyAqICAyNSAgICAgICAgMTA0ICAgICAgICAgMHgzNworICogIDI2ICAgICAgICAgOTggICAgICAgICAweDM3CisgKiAgMjcgICAgICAgIDExMCAgICAgICAgIDB4MzYKKyAqICAyOCAgICAgICAgMTA0ICAgICAgICAgMHgzNgorICogIDI5ICAgICAgICAgOTggICAgICAgICAweDM2CisgKiAgMzAgICAgICAgIDExMCAgICAgICAgIDB4MzUKKyAqICAzMSAgICAgICAgMTA0ICAgICAgICAgMHgzNQorICogIDMyICAgICAgICAgOTggICAgICAgICAweDM1CisgKiAgMzMgICAgICAgIDExMCAgICAgICAgIDB4MzQKKyAqICAzNCAgICAgICAgMTA0ICAgICAgICAgMHgzNAorICogIDM1ICAgICAgICAgOTggICAgICAgICAweDM0CisgKiAgMzYgICAgICAgIDExMCAgICAgICAgIDB4MzMKKyAqICAzNyAgICAgICAgMTA0ICAgICAgICAgMHgzMworICogIDM4ICAgICAgICAgOTggICAgICAgICAweDMzCisgKiAgMzkgICAgICAgIDExMCAgICAgICAgIDB4MzIKKyAqICA0MCAgICAgICAgMTA0ICAgICAgICAgMHgzMgorICogIDQxICAgICAgICAgOTggICAgICAgICAweDMyCisgKiAgNDIgICAgICAgIDExMCAgICAgICAgIDB4MzEKKyAqICA0MyAgICAgICAgMTA0ICAgICAgICAgMHgzMQorICogIDQ0ICAgICAgICAgOTggICAgICAgICAweDMxCisgKiAgNDUgICAgICAgIDExMCAgICAgICAgIDB4MzAKKyAqICA0NiAgICAgICAgMTA0ICAgICAgICAgMHgzMAorICogIDQ3ICAgICAgICAgOTggICAgICAgICAweDMwCisgKiAgNDggICAgICAgIDExMCAgICAgICAgICAweDYKKyAqICA0OSAgICAgICAgMTA0ICAgICAgICAgIDB4NgorICogIDUwICAgICAgICAgOTggICAgICAgICAgMHg2CisgKiAgNTEgICAgICAgIDExMCAgICAgICAgICAweDUKKyAqICA1MiAgICAgICAgMTA0ICAgICAgICAgIDB4NQorICogIDUzICAgICAgICAgOTggICAgICAgICAgMHg1CisgKiAgNTQgICAgICAgIDExMCAgICAgICAgICAweDQKKyAqICA1NSAgICAgICAgMTA0ICAgICAgICAgIDB4NAorICogIDU2ICAgICAgICAgOTggICAgICAgICAgMHg0CisgKiAgNTcgICAgICAgIDExMCAgICAgICAgICAweDMKKyAqICA1OCAgICAgICAgMTA0ICAgICAgICAgIDB4MworICogIDU5ICAgICAgICAgOTggICAgICAgICAgMHgzCisgKiAgNjAgICAgICAgIDExMCAgICAgICAgICAweDIKKyAqICA2MSAgICAgICAgMTA0ICAgICAgICAgIDB4MgorICogIDYyICAgICAgICAgOTggICAgICAgICAgMHgyCisgKiAgNjMgICAgICAgIDExMCAgICAgICAgICAweDEKKyAqICA2NCAgICAgICAgMTA0ICAgICAgICAgIDB4MQorICogIDY1ICAgICAgICAgOTggICAgICAgICAgMHgxCisgKiAgNjYgICAgICAgIDExMCAgICAgICAgICAweDAKKyAqICA2NyAgICAgICAgMTA0ICAgICAgICAgIDB4MAorICogIDY4ICAgICAgICAgOTggICAgICAgICAgMHgwCisgKiAgNjkgICAgICAgICA5NyAgICAgICAgICAgIDAKKyAqICA3MCAgICAgICAgIDk2ICAgICAgICAgICAgMAorICogIDcxICAgICAgICAgOTUgICAgICAgICAgICAwCisgKiAgNzIgICAgICAgICA5NCAgICAgICAgICAgIDAKKyAqICA3MyAgICAgICAgIDkzICAgICAgICAgICAgMAorICogIDc0ICAgICAgICAgOTIgICAgICAgICAgICAwCisgKiAgNzUgICAgICAgICA5MSAgICAgICAgICAgIDAKKyAqICA3NiAgICAgICAgIDkwICAgICAgICAgICAgMAorICogIDc3ICAgICAgICAgODkgICAgICAgICAgICAwCisgKiAgNzggICAgICAgICA4OCAgICAgICAgICAgIDAKKyAqICA3OSAgICAgICAgIDg3ICAgICAgICAgICAgMAorICogIDgwICAgICAgICAgODYgICAgICAgICAgICAwCisgKiAgODEgICAgICAgICA4NSAgICAgICAgICAgIDAKKyAqICA4MiAgICAgICAgIDg0ICAgICAgICAgICAgMAorICogIDgzICAgICAgICAgODMgICAgICAgICAgICAwCisgKiAgODQgICAgICAgICA4MiAgICAgICAgICAgIDAKKyAqICA4NSAgICAgICAgIDgxICAgICAgICAgICAgMAorICogIDg2ICAgICAgICAgODAgICAgICAgICAgICAwCisgKiAgODcgICAgICAgICA3OSAgICAgICAgICAgIDAKKyAqICA4OCAgICAgICAgIDc4ICAgICAgICAgICAgMAorICogIDg5ICAgICAgICAgNzcgICAgICAgICAgICAwCisgKiAgOTAgICAgICAgICA3NiAgICAgICAgICAgIDAKKyAqICA5MSAgICAgICAgIDc1ICAgICAgICAgICAgMAorICogIDkyICAgICAgICAgNzQgICAgICAgICAgICAwCisgKiAgOTMgICAgICAgICA3MyAgICAgICAgICAgIDAKKyAqICA5NCAgICAgICAgIDcyICAgICAgICAgICAgMAorICogIDk1ICAgICAgICAgNzEgICAgICAgICAgICAwCisgKiAgOTYgICAgICAgICA3MCAgICAgICAgICAgIDAKKyAqICA5NyAgICAgICAgIDY5ICAgICAgICAgICAgMAorICogIDk4ICAgICAgICAgNjggICAgICAgICAgICAwCisgKi8KKworLyoqCisgKiA1IEdIeiBnYWluIHRhYmxlCisgKgorICogSW5kZXggICAgRHNwIGdhaW4gICBSYWRpbyBnYWluCisgKiAgLTkgCSAgICAgIDEyMyAgICAgICAgIDB4M0YgICAgICAoaGlnaGVzdCBnYWluKQorICogIC04IAkgICAgICAxMTcgICAgICAgICAweDNGCisgKiAgLTcgICAgICAgIDExMCAgICAgICAgIDB4M0YKKyAqICAtNiAgICAgICAgMTA0ICAgICAgICAgMHgzRgorICogIC01ICAgICAgICAgOTggICAgICAgICAweDNGCisgKiAgLTQgICAgICAgIDExMCAgICAgICAgIDB4M0UKKyAqICAtMyAgICAgICAgMTA0ICAgICAgICAgMHgzRQorICogIC0yICAgICAgICAgOTggICAgICAgICAweDNFCisgKiAgLTEgICAgICAgIDExMCAgICAgICAgIDB4M0QKKyAqICAgMCAgICAgICAgMTA0ICAgICAgICAgMHgzRAorICogICAxICAgICAgICAgOTggICAgICAgICAweDNECisgKiAgIDIgICAgICAgIDExMCAgICAgICAgIDB4M0MKKyAqICAgMyAgICAgICAgMTA0ICAgICAgICAgMHgzQworICogICA0ICAgICAgICAgOTggICAgICAgICAweDNDCisgKiAgIDUgICAgICAgIDExMCAgICAgICAgIDB4M0IKKyAqICAgNiAgICAgICAgMTA0ICAgICAgICAgMHgzQgorICogICA3ICAgICAgICAgOTggICAgICAgICAweDNCCisgKiAgIDggICAgICAgIDExMCAgICAgICAgIDB4M0EKKyAqICAgOSAgICAgICAgMTA0ICAgICAgICAgMHgzQQorICogIDEwICAgICAgICAgOTggICAgICAgICAweDNBCisgKiAgMTEgICAgICAgIDExMCAgICAgICAgIDB4MzkKKyAqICAxMiAgICAgICAgMTA0ICAgICAgICAgMHgzOQorICogIDEzICAgICAgICAgOTggICAgICAgICAweDM5CisgKiAgMTQgICAgICAgIDExMCAgICAgICAgIDB4MzgKKyAqICAxNSAgICAgICAgMTA0ICAgICAgICAgMHgzOAorICogIDE2ICAgICAgICAgOTggICAgICAgICAweDM4CisgKiAgMTcgICAgICAgIDExMCAgICAgICAgIDB4MzcKKyAqICAxOCAgICAgICAgMTA0ICAgICAgICAgMHgzNworICogIDE5ICAgICAgICAgOTggICAgICAgICAweDM3CisgKiAgMjAgICAgICAgIDExMCAgICAgICAgIDB4MzYKKyAqICAyMSAgICAgICAgMTA0ICAgICAgICAgMHgzNgorICogIDIyICAgICAgICAgOTggICAgICAgICAweDM2CisgKiAgMjMgICAgICAgIDExMCAgICAgICAgIDB4MzUKKyAqICAyNCAgICAgICAgMTA0ICAgICAgICAgMHgzNQorICogIDI1ICAgICAgICAgOTggICAgICAgICAweDM1CisgKiAgMjYgICAgICAgIDExMCAgICAgICAgIDB4MzQKKyAqICAyNyAgICAgICAgMTA0ICAgICAgICAgMHgzNAorICogIDI4ICAgICAgICAgOTggICAgICAgICAweDM0CisgKiAgMjkgICAgICAgIDExMCAgICAgICAgIDB4MzMKKyAqICAzMCAgICAgICAgMTA0ICAgICAgICAgMHgzMworICogIDMxICAgICAgICAgOTggICAgICAgICAweDMzCisgKiAgMzIgICAgICAgIDExMCAgICAgICAgIDB4MzIKKyAqICAzMyAgICAgICAgMTA0ICAgICAgICAgMHgzMgorICogIDM0ICAgICAgICAgOTggICAgICAgICAweDMyCisgKiAgMzUgICAgICAgIDExMCAgICAgICAgIDB4MzEKKyAqICAzNiAgICAgICAgMTA0ICAgICAgICAgMHgzMQorICogIDM3ICAgICAgICAgOTggICAgICAgICAweDMxCisgKiAgMzggICAgICAgIDExMCAgICAgICAgIDB4MzAKKyAqICAzOSAgICAgICAgMTA0ICAgICAgICAgMHgzMAorICogIDQwICAgICAgICAgOTggICAgICAgICAweDMwCisgKiAgNDEgICAgICAgIDExMCAgICAgICAgIDB4MjUKKyAqICA0MiAgICAgICAgMTA0ICAgICAgICAgMHgyNQorICogIDQzICAgICAgICAgOTggICAgICAgICAweDI1CisgKiAgNDQgICAgICAgIDExMCAgICAgICAgIDB4MjQKKyAqICA0NSAgICAgICAgMTA0ICAgICAgICAgMHgyNAorICogIDQ2ICAgICAgICAgOTggICAgICAgICAweDI0CisgKiAgNDcgICAgICAgIDExMCAgICAgICAgIDB4MjMKKyAqICA0OCAgICAgICAgMTA0ICAgICAgICAgMHgyMworICogIDQ5ICAgICAgICAgOTggICAgICAgICAweDIzCisgKiAgNTAgICAgICAgIDExMCAgICAgICAgIDB4MjIKKyAqICA1MSAgICAgICAgMTA0ICAgICAgICAgMHgxOAorICogIDUyICAgICAgICAgOTggICAgICAgICAweDE4CisgKiAgNTMgICAgICAgIDExMCAgICAgICAgIDB4MTcKKyAqICA1NCAgICAgICAgMTA0ICAgICAgICAgMHgxNworICogIDU1ICAgICAgICAgOTggICAgICAgICAweDE3CisgKiAgNTYgICAgICAgIDExMCAgICAgICAgIDB4MTYKKyAqICA1NyAgICAgICAgMTA0ICAgICAgICAgMHgxNgorICogIDU4ICAgICAgICAgOTggICAgICAgICAweDE2CisgKiAgNTkgICAgICAgIDExMCAgICAgICAgIDB4MTUKKyAqICA2MCAgICAgICAgMTA0ICAgICAgICAgMHgxNQorICogIDYxICAgICAgICAgOTggICAgICAgICAweDE1CisgKiAgNjIgICAgICAgIDExMCAgICAgICAgIDB4MTQKKyAqICA2MyAgICAgICAgMTA0ICAgICAgICAgMHgxNAorICogIDY0ICAgICAgICAgOTggICAgICAgICAweDE0CisgKiAgNjUgICAgICAgIDExMCAgICAgICAgIDB4MTMKKyAqICA2NiAgICAgICAgMTA0ICAgICAgICAgMHgxMworICogIDY3ICAgICAgICAgOTggICAgICAgICAweDEzCisgKiAgNjggICAgICAgIDExMCAgICAgICAgIDB4MTIKKyAqICA2OSAgICAgICAgMTA0ICAgICAgICAgMHgwOAorICogIDcwICAgICAgICAgOTggICAgICAgICAweDA4CisgKiAgNzEgICAgICAgIDExMCAgICAgICAgIDB4MDcKKyAqICA3MiAgICAgICAgMTA0ICAgICAgICAgMHgwNworICogIDczICAgICAgICAgOTggICAgICAgICAweDA3CisgKiAgNzQgICAgICAgIDExMCAgICAgICAgIDB4MDYKKyAqICA3NSAgICAgICAgMTA0ICAgICAgICAgMHgwNgorICogIDc2ICAgICAgICAgOTggICAgICAgICAweDA2CisgKiAgNzcgICAgICAgIDExMCAgICAgICAgIDB4MDUKKyAqICA3OCAgICAgICAgMTA0ICAgICAgICAgMHgwNQorICogIDc5ICAgICAgICAgOTggICAgICAgICAweDA1CisgKiAgODAgICAgICAgIDExMCAgICAgICAgIDB4MDQKKyAqICA4MSAgICAgICAgMTA0ICAgICAgICAgMHgwNAorICogIDgyICAgICAgICAgOTggICAgICAgICAweDA0CisgKiAgODMgICAgICAgIDExMCAgICAgICAgIDB4MDMKKyAqICA4NCAgICAgICAgMTA0ICAgICAgICAgMHgwMworICogIDg1ICAgICAgICAgOTggICAgICAgICAweDAzCisgKiAgODYgICAgICAgIDExMCAgICAgICAgIDB4MDIKKyAqICA4NyAgICAgICAgMTA0ICAgICAgICAgMHgwMgorICogIDg4ICAgICAgICAgOTggICAgICAgICAweDAyCisgKiAgODkgICAgICAgIDExMCAgICAgICAgIDB4MDEKKyAqICA5MCAgICAgICAgMTA0ICAgICAgICAgMHgwMQorICogIDkxICAgICAgICAgOTggICAgICAgICAweDAxCisgKiAgOTIgICAgICAgIDExMCAgICAgICAgIDB4MDAKKyAqICA5MyAgICAgICAgMTA0ICAgICAgICAgMHgwMAorICogIDk0ICAgICAgICAgOTggICAgICAgICAweDAwCisgKiAgOTUgICAgICAgICA5MyAgICAgICAgIDB4MDAKKyAqICA5NiAgICAgICAgIDg4ICAgICAgICAgMHgwMAorICogIDk3ICAgICAgICAgODMgICAgICAgICAweDAwCisgKiAgOTggICAgICAgICA3OCAgICAgICAgIDB4MDAKKyAqLworCisvKioKKyAqIFNhbml0eSBjaGVja3MgYW5kIGRlZmF1bHQgdmFsdWVzIGZvciBFRVBST00gcmVndWxhdG9yeSBsZXZlbHMuCisgKiBJZiBFRVBST00gdmFsdWVzIGZhbGwgb3V0c2lkZSBNSU4vTUFYIHJhbmdlLCB1c2UgZGVmYXVsdCB2YWx1ZXMuCisgKgorICogUmVndWxhdG9yeSBsaW1pdHMgcmVmZXIgdG8gdGhlIG1heGltdW0gYXZlcmFnZSB0eHBvd2VyIGFsbG93ZWQgYnkKKyAqIHJlZ3VsYXRvcnkgYWdlbmNpZXMgaW4gdGhlIGdlb2dyYXBoaWVzIGluIHdoaWNoIHRoZSBkZXZpY2UgaXMgbWVhbnQKKyAqIHRvIGJlIG9wZXJhdGVkLiAgVGhlc2UgbGltaXRzIGFyZSBTS1Utc3BlY2lmaWMgKGkuZS4gZ2VvZ3JhcGh5LXNwZWNpZmljKSwKKyAqIGFuZCBjaGFubmVsLXNwZWNpZmljOyBlYWNoIGNoYW5uZWwgaGFzIGFuIGluZGl2aWR1YWwgcmVndWxhdG9yeSBsaW1pdAorICogbGlzdGVkIGluIHRoZSBFRVBST00uCisgKgorICogVW5pdHMgYXJlIGluIGhhbGYtZEJtIChpLmUuICIzNCIgbWVhbnMgMTcgZEJtKS4KKyAqLworI2RlZmluZSBJTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfMjQgICAoMzQpCisjZGVmaW5lIElMX1RYX1BPV0VSX0RFRkFVTFRfUkVHVUxBVE9SWV81MiAgICgzNCkKKyNkZWZpbmUgSUxfVFhfUE9XRVJfUkVHVUxBVE9SWV9NSU4gICAgICAgICAgKDApCisjZGVmaW5lIElMX1RYX1BPV0VSX1JFR1VMQVRPUllfTUFYICAgICAgICAgICgzNCkKKworLyoqCisgKiBTYW5pdHkgY2hlY2tzIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgRUVQUk9NIHNhdHVyYXRpb24gbGV2ZWxzLgorICogSWYgRUVQUk9NIHZhbHVlcyBmYWxsIG91dHNpZGUgTUlOL01BWCByYW5nZSwgdXNlIGRlZmF1bHQgdmFsdWVzLgorICoKKyAqIFNhdHVyYXRpb24gaXMgdGhlIGhpZ2hlc3QgbGV2ZWwgdGhhdCB0aGUgb3V0cHV0IHBvd2VyIGFtcGxpZmllciBjYW4gcHJvZHVjZQorICogd2l0aG91dCBzaWduaWZpY2FudCBjbGlwcGluZyBkaXN0b3J0aW9uLiAgVGhpcyBpcyBhICJwZWFrIiBwb3dlciBsZXZlbC4KKyAqIERpZmZlcmVudCB0eXBlcyBvZiBtb2R1bGF0aW9uIChpLmUuIHZhcmlvdXMgInJhdGVzIiwgYW5kIE9GRE0gdnMuIENDSykKKyAqIHJlcXVpcmUgZGlmZmVyaW5nIGFtb3VudHMgb2YgYmFja29mZiwgcmVsYXRpdmUgdG8gdGhlaXIgYXZlcmFnZSBwb3dlciBvdXRwdXQsCisgKiBpbiBvcmRlciB0byBhdm9pZCBjbGlwcGluZyBkaXN0b3J0aW9uLgorICoKKyAqIERyaXZlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHZpb2xhdGluZyBuZWl0aGVyIHRoZSBzYXR1cmF0aW9uIGxpbWl0LAorICogbm9yIHRoZSByZWd1bGF0b3J5IGxpbWl0LCB3aGVuIGNhbGN1bGF0aW5nIFR4IHBvd2VyIHNldHRpbmdzIGZvciB2YXJpb3VzCisgKiByYXRlcy4KKyAqCisgKiBVbml0cyBhcmUgaW4gaGFsZi1kQm0gKGkuZS4gIjM4IiBtZWFucyAxOSBkQm0pLgorICovCisjZGVmaW5lIElMX1RYX1BPV0VSX0RFRkFVTFRfU0FUVVJBVElPTl8yNCAgICgzOCkKKyNkZWZpbmUgSUxfVFhfUE9XRVJfREVGQVVMVF9TQVRVUkFUSU9OXzUyICAgKDM4KQorI2RlZmluZSBJTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01JTiAgICAgICAgICAoMjApCisjZGVmaW5lIElMX1RYX1BPV0VSX1NBVFVSQVRJT05fTUFYICAgICAgICAgICg1MCkKKworLyoqCisgKiBDaGFubmVsIGdyb3VwcyB1c2VkIGZvciBUeCBBdHRlbnVhdGlvbiBjYWxpYnJhdGlvbiAoTUlNTyB0eCBjaGFubmVsIGJhbGFuY2UpCisgKiBhbmQgdGhlcm1hbCBUeHBvd2VyIGNhbGlicmF0aW9uLgorICoKKyAqIFdoZW4gY2FsY3VsYXRpbmcgdHhwb3dlciwgZHJpdmVyIG11c3QgY29tcGVuc2F0ZSBmb3IgY3VycmVudCBkZXZpY2UKKyAqIHRlbXBlcmF0dXJlOyBoaWdoZXIgdGVtcGVyYXR1cmUgcmVxdWlyZXMgaGlnaGVyIGdhaW4uICBEcml2ZXIgbXVzdCBjYWxjdWxhdGUKKyAqIGN1cnJlbnQgdGVtcGVyYXR1cmUgKHNlZSAiNDk2NSB0ZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiIpLCB0aGVuIGNvbXBhcmUgdnMuCisgKiBmYWN0b3J5IGNhbGlicmF0aW9uIHRlbXBlcmF0dXJlIGluIEVFUFJPTTsgaWYgY3VycmVudCB0ZW1wZXJhdHVyZSBpcyBoaWdoZXIKKyAqIHRoYW4gZmFjdG9yeSB0ZW1wZXJhdHVyZSwgZHJpdmVyIG11c3QgKmluY3JlYXNlKiBnYWluIGJ5IHByb3BvcnRpb25zIHNob3duCisgKiBpbiB0YWJsZSBiZWxvdy4gIElmIGN1cnJlbnQgdGVtcGVyYXR1cmUgaXMgbG93ZXIgdGhhbiBmYWN0b3J5LCBkcml2ZXIgbXVzdAorICogKmRlY3JlYXNlKiBnYWluLgorICoKKyAqIERpZmZlcmVudCBmcmVxdWVuY3kgcmFuZ2VzIHJlcXVpcmUgZGlmZmVyZW50IGNvbXBlbnNhdGlvbiwgYXMgc2hvd24gYmVsb3cuCisgKi8KKy8qIEdyb3VwIDAsIDUuMiBHSHogY2ggMzQtNDM6ICA0LjUgZGVncmVlcyBwZXIgMS8yIGRCLiAqLworI2RlZmluZSBDQUxJQl9JTF9UWF9BVFRFTl9HUjFfRkNIIDM0CisjZGVmaW5lIENBTElCX0lMX1RYX0FUVEVOX0dSMV9MQ0ggNDMKKworLyogR3JvdXAgMSwgNS4zIEdIeiBjaCA0NC03MDogIDQuMCBkZWdyZWVzIHBlciAxLzIgZEIuICovCisjZGVmaW5lIENBTElCX0lMX1RYX0FUVEVOX0dSMl9GQ0ggNDQKKyNkZWZpbmUgQ0FMSUJfSUxfVFhfQVRURU5fR1IyX0xDSCA3MAorCisvKiBHcm91cCAyLCA1LjUgR0h6IGNoIDcxLTEyNDogIDQuMCBkZWdyZWVzIHBlciAxLzIgZEIuICovCisjZGVmaW5lIENBTElCX0lMX1RYX0FUVEVOX0dSM19GQ0ggNzEKKyNkZWZpbmUgQ0FMSUJfSUxfVFhfQVRURU5fR1IzX0xDSCAxMjQKKworLyogR3JvdXAgMywgNS43IEdIeiBjaCAxMjUtMjAwOiAgNC4wIGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KKyNkZWZpbmUgQ0FMSUJfSUxfVFhfQVRURU5fR1I0X0ZDSCAxMjUKKyNkZWZpbmUgQ0FMSUJfSUxfVFhfQVRURU5fR1I0X0xDSCAyMDAKKworLyogR3JvdXAgNCwgMi40IEdIeiBhbGwgY2hhbm5lbHM6ICAzLjUgZGVncmVlcyBwZXIgMS8yIGRCLiAqLworI2RlZmluZSBDQUxJQl9JTF9UWF9BVFRFTl9HUjVfRkNIIDEKKyNkZWZpbmUgQ0FMSUJfSUxfVFhfQVRURU5fR1I1X0xDSCAyMAorCitlbnVtIHsKKwlDQUxJQl9DSF9HUk9VUF8xID0gMCwKKwlDQUxJQl9DSF9HUk9VUF8yID0gMSwKKwlDQUxJQl9DSF9HUk9VUF8zID0gMiwKKwlDQUxJQl9DSF9HUk9VUF80ID0gMywKKwlDQUxJQl9DSF9HUk9VUF81ID0gNCwKKwlDQUxJQl9DSF9HUk9VUF9NQVgKK307CisKKy8qKioqKioqKioqKioqKioqKioqKiogRU5EIFRYUE9XRVIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKgorICogVHgvUnggUXVldWVzCisgKgorICogTW9zdCBjb21tdW5pY2F0aW9uIGJldHdlZW4gZHJpdmVyIGFuZCA0OTY1IGlzIHZpYSBxdWV1ZXMgb2YgZGF0YSBidWZmZXJzLgorICogRm9yIGV4YW1wbGUsIGFsbCBjb21tYW5kcyB0aGF0IHRoZSBkcml2ZXIgaXNzdWVzIHRvIGRldmljZSdzIGVtYmVkZGVkCisgKiBjb250cm9sbGVyICh1Q29kZSkgYXJlIHZpYSB0aGUgY29tbWFuZCBxdWV1ZSAob25lIG9mIHRoZSBUeCBxdWV1ZXMpLiAgQWxsCisgKiB1Q29kZSBjb21tYW5kIHJlc3BvbnNlcy9yZXBsaWVzL25vdGlmaWNhdGlvbnMsIGluY2x1ZGluZyBSeCBmcmFtZXMsIGFyZQorICogY29udmV5ZWQgZnJvbSB1Q29kZSB0byBkcml2ZXIgdmlhIHRoZSBSeCBxdWV1ZS4KKyAqCisgKiBNb3N0IHN1cHBvcnQgZm9yIHRoZXNlIHF1ZXVlcywgaW5jbHVkaW5nIGhhbmRzaGFrZSBzdXBwb3J0LCByZXNpZGVzIGluCisgKiBzdHJ1Y3R1cmVzIGluIGhvc3QgRFJBTSwgc2hhcmVkIGJldHdlZW4gdGhlIGRyaXZlciBhbmQgdGhlIGRldmljZS4gIFdoZW4KKyAqIGFsbG9jYXRpbmcgdGhpcyBtZW1vcnksIHRoZSBkcml2ZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCBkYXRhIHdyaXR0ZW4gYnkKKyAqIHRoZSBob3N0IENQVSB1cGRhdGVzIERSQU0gaW1tZWRpYXRlbHkgKGFuZCBkb2VzIG5vdCBnZXQgInN0dWNrIiBpbiBDUFUncworICogY2FjaGUgbWVtb3J5KSwgc28gRFJBTSBhbmQgY2FjaGUgYXJlIGNvbnNpc3RlbnQsIGFuZCB0aGUgZGV2aWNlIGNhbgorICogaW1tZWRpYXRlbHkgc2VlIGNoYW5nZXMgbWFkZSBieSB0aGUgZHJpdmVyLgorICoKKyAqIDQ5NjUgc3VwcG9ydHMgdXAgdG8gMTYgRFJBTS1iYXNlZCBUeCBxdWV1ZXMsIGFuZCBzZXJ2aWNlcyB0aGVzZSBxdWV1ZXMgdmlhCisgKiB1cCB0byA3IERNQSBjaGFubmVscyAoRklGT3MpLiAgRWFjaCBUeCBxdWV1ZSBpcyBzdXBwb3J0ZWQgYnkgYSBjaXJjdWxhciBhcnJheQorICogaW4gRFJBTSBjb250YWluaW5nIDI1NiBUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9ycyAoVEZEcykuCisgKi8KKyNkZWZpbmUgSUw0OV9OVU1fRklGT1MJNworI2RlZmluZSBJTDQ5X0NNRF9GSUZPX05VTQk0CisjZGVmaW5lIElMNDlfTlVNX1FVRVVFUwkxNgorI2RlZmluZSBJTDQ5X05VTV9BTVBEVV9RVUVVRVMJOAorCisvKioKKyAqIHN0cnVjdCBpbDQ5NjVfc2NoZWRxX2JjX3RibAorICoKKyAqIEJ5dGUgQ291bnQgdGFibGUKKyAqCisgKiBFYWNoIFR4IHF1ZXVlIHVzZXMgYSBieXRlLWNvdW50IHRhYmxlIGNvbnRhaW5pbmcgMzIwIGVudHJpZXM6CisgKiBvbmUgMTYtYml0IGVudHJ5IGZvciBlYWNoIG9mIDI1NiBURkRzLCBwbHVzIGFuIGFkZGl0aW9uYWwgNjQgZW50cmllcyB0aGF0CisgKiBkdXBsaWNhdGUgdGhlIGZpcnN0IDY0IGVudHJpZXMgKHRvIGF2b2lkIHdyYXAtYXJvdW5kIHdpdGhpbiBhIFR4IHdpbjsKKyAqIG1heCBUeCB3aW4gaXMgNjQgVEZEcykuCisgKgorICogV2hlbiBkcml2ZXIgc2V0cyB1cCBhIG5ldyBURkQsIGl0IG11c3QgYWxzbyBlbnRlciB0aGUgdG90YWwgYnl0ZSBjb3VudAorICogb2YgdGhlIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIGJ5dGUKKyAqIGNvdW50IHRhYmxlIGZvciB0aGUgY2hvc2VuIFR4IHF1ZXVlLiAgSWYgdGhlIFRGRCBpZHggaXMgMC02MywgdGhlIGRyaXZlcgorICogbXVzdCBkdXBsaWNhdGUgdGhlIGJ5dGUgY291bnQgZW50cnkgaW4gY29ycmVzcG9uZGluZyBpZHggMjU2LTMxOS4KKyAqCisgKiBwYWRkaW5nIHB1dHMgZWFjaCBieXRlIGNvdW50IHRhYmxlIG9uIGEgMTAyNC1ieXRlIGJvdW5kYXJ5OworICogNDk2NSBhc3N1bWVzIHRhYmxlcyBhcmUgc2VwYXJhdGVkIGJ5IDEwMjQgYnl0ZXMuCisgKi8KK3N0cnVjdCBpbDQ5NjVfc2NkX2JjX3RibCB7CisJX19sZTE2IHRmZF9vZmZzZXRbVEZEX1FVRVVFX0JDX1NJWkVdOworCXU4IHBhZFsxMDI0IC0gKFRGRF9RVUVVRV9CQ19TSVpFKSAqIHNpemVvZihfX2xlMTYpXTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSUw0OTY1X1JUQ19JTlNUX0xPV0VSX0JPVU5ECQkoMHgwMDAwMDApCisKKy8qIFJTU0kgdG8gZEJtICovCisjZGVmaW5lIElMNDk2NV9SU1NJX09GRlNFVAk0NAorCisvKiBQQ0kgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDSV9DRkdfUkVUUllfVElNRU9VVAkweDA0MQorCisvKiBQQ0kgcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMFNfRU4JMHgwMQorI2RlZmluZSBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4JMHgwMgorCisjZGVmaW5lIElMNDk2NV9ERUZBVUxUX1RYX1JFVFJZICAxNQorCisvKiBFRVBST00gKi8KKyNkZWZpbmUgSUw0OTY1X0ZJUlNUX0FNUERVX1FVRVVFCTEwCisKKy8qIENhbGlicmF0aW9uICovCit2b2lkIGlsNDk2NV9jaGFpbl9ub2lzZV9jYWxpYnJhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHZvaWQgKnN0YXRfcmVzcCk7Cit2b2lkIGlsNDk2NV9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHZvaWQgKnJlc3ApOwordm9pZCBpbDQ5NjVfaW5pdF9zZW5zaXRpdml0eShzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbDQ5NjVfcmVzZXRfcnVuX3RpbWVfY2FsaWIoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWw0OTY1X2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKiBEZWJ1ZyAqLworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCitzc2l6ZV90IGlsNDk2NV91Y29kZV9yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworc3NpemVfdCBpbDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3NzaXplX3QgaWw0OTY1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQkJCWxvZmZfdCAqcHBvcyk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGbG93IEhhbmRsZXIgRGVmaW5pdGlvbnMgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIFRoaXMgSS9PIGFyZWEgaXMgZGlyZWN0bHkgcmVhZC93cml0YWJsZSBieSBkcml2ZXIgKGUuZy4gTGludXggdXNlcyB3cml0ZWwoKSkKKyAqIEFkZHJlc3NlcyBhcmUgb2Zmc2V0cyBmcm9tIGRldmljZSdzIFBDSSBoYXJkd2FyZSBiYXNlIGFkZHJlc3MuCisgKi8KKyNkZWZpbmUgRkg0OV9NRU1fTE9XRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MTAwMCkKKyNkZWZpbmUgRkg0OV9NRU1fVVBQRVJfQk9VTkQgICAgICAgICAgICAgICAgICAgKDB4MjAwMCkKKworLyoqCisgKiBLZWVwLVdhcm0gKEtXKSBidWZmZXIgYmFzZSBhZGRyZXNzLgorICoKKyAqIERyaXZlciBtdXN0IGFsbG9jYXRlIGEgNEtCeXRlIGJ1ZmZlciB0aGF0IGlzIHVzZWQgYnkgNDk2NSBmb3Iga2VlcGluZyB0aGUKKyAqIGhvc3QgRFJBTSBwb3dlcmVkIG9uICh2aWEgZHVtbXkgYWNjZXNzZXMgdG8gRFJBTSkgdG8gbWFpbnRhaW4gbG93LWxhdGVuY3kKKyAqIERSQU0gYWNjZXNzIHdoZW4gNDk2NSBpcyBUeGluZyBvciBSeGluZy4gIFRoZSBkdW1teSBhY2Nlc3NlcyBwcmV2ZW50IGhvc3QKKyAqIGZyb20gZ29pbmcgaW50byBhIHBvd2VyLXNhdmluZ3MgbW9kZSB0aGF0IHdvdWxkIGNhdXNlIGhpZ2hlciBEUkFNIGxhdGVuY3ksCisgKiBhbmQgcG9zc2libGUgZGF0YSBvdmVyL3VuZGVyLXJ1bnMsIGJlZm9yZSBhbGwgVHgvUnggaXMgY29tcGxldGUuCisgKgorICogRHJpdmVyIGxvYWRzIEZINDlfS1dfTUVNX0FERFJfUkVHIHdpdGggdGhlIHBoeXNpY2FsIGFkZHJlc3MgKGJpdHMgMzU6NCkKKyAqIG9mIHRoZSBidWZmZXIsIHdoaWNoIG11c3QgYmUgNEsgYWxpZ25lZC4gIE9uY2UgdGhpcyBpcyBzZXQgdXAsIHRoZSA0OTY1CisgKiBhdXRvbWF0aWNhbGx5IGludm9rZXMga2VlcC13YXJtIGFjY2Vzc2VzIHdoZW4gbm9ybWFsIGFjY2Vzc2VzIG1pZ2h0IG5vdAorICogYmUgc3VmZmljaWVudCB0byBtYWludGFpbiBmYXN0IERSQU0gcmVzcG9uc2UuCisgKgorICogQml0IGZpZWxkczoKKyAqICAzMS0wOiAgS2VlcC13YXJtIGJ1ZmZlciBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgWzM1OjRdLCBtdXN0IGJlIDRLIGFsaWduZWQKKyAqLworI2RlZmluZSBGSDQ5X0tXX01FTV9BRERSX1JFRwkJICAgICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweDk3QykKKworLyoqCisgKiBURkQgQ2lyY3VsYXIgQnVmZmVycyBCYXNlIChDQkJDKSBhZGRyZXNzZXMKKyAqCisgKiA0OTY1IGhhcyAxNiBiYXNlIHBvaW50ZXIgcmVnaXN0ZXJzLCBvbmUgZm9yIGVhY2ggb2YgMTYgaG9zdC1EUkFNLXJlc2lkZW50CisgKiBjaXJjdWxhciBidWZmZXJzIChDQnMvcXVldWVzKSBjb250YWluaW5nIFRyYW5zbWl0IEZyYW1lIERlc2NyaXB0b3JzIChURkRzKQorICogKHNlZSBzdHJ1Y3QgaWxfdGZkX2ZyYW1lKS4gIFRoZXNlIDE2IHBvaW50ZXIgcmVnaXN0ZXJzIGFyZSBvZmZzZXQgYnkgMHgwNAorICogYnl0ZXMgZnJvbSBvbmUgYW5vdGhlci4gIEVhY2ggVEZEIGNpcmN1bGFyIGJ1ZmZlciBpbiBEUkFNIG11c3QgYmUgMjU2LWJ5dGUKKyAqIGFsaWduZWQgKGFkZHJlc3MgYml0cyAwLTcgbXVzdCBiZSAwKS4KKyAqCisgKiBCaXQgZmllbGRzIGluIGVhY2ggcG9pbnRlciByZWdpc3RlcjoKKyAqICAyNy0wOiBURkQgQ0IgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIFszNTo4XSwgbXVzdCBiZSAyNTYtYnl0ZSBhbGlnbmVkCisgKi8KKyNkZWZpbmUgRkg0OV9NRU1fQ0JCQ19MT1dFUl9CT1VORCAgICAgICAgICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweDlEMCkKKyNkZWZpbmUgRkg0OV9NRU1fQ0JCQ19VUFBFUl9CT1VORCAgICAgICAgICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEExMCkKKworLyogRmluZCBURkQgQ0IgYmFzZSBwb2ludGVyIGZvciBnaXZlbiBxdWV1ZSAocmFuZ2UgMC0xNSkuICovCisjZGVmaW5lIEZINDlfTUVNX0NCQkNfUVVFVUUoeCkgIChGSDQ5X01FTV9DQkJDX0xPV0VSX0JPVU5EICsgKHgpICogMHg0KQorCisvKioKKyAqIFJ4IFNSQU0gQ29udHJvbCBhbmQgU3RhdHVzIFJlZ2lzdGVycyAoUlNDU1IpCisgKgorICogVGhlc2UgcmVnaXN0ZXJzIHByb3ZpZGUgaGFuZHNoYWtlIGJldHdlZW4gZHJpdmVyIGFuZCA0OTY1IGZvciB0aGUgUnggcXVldWUKKyAqICh0aGlzIHF1ZXVlIGhhbmRsZXMgKmFsbCogY29tbWFuZCByZXNwb25zZXMsIG5vdGlmaWNhdGlvbnMsIFJ4IGRhdGEsIGV0Yy4KKyAqIHNlbnQgZnJvbSA0OTY1IHVDb2RlIHRvIGhvc3QgZHJpdmVyKS4gIFVubGlrZSBUeCwgdGhlcmUgaXMgb25seSBvbmUgUngKKyAqIHF1ZXVlLCBhbmQgb25seSBvbmUgUnggRE1BL0ZJRk8gY2hhbm5lbC4gIEFsc28gdW5saWtlIFR4LCB3aGljaCBjYW4KKyAqIGNvbmNhdGVuYXRlIHVwIHRvIDIwIERSQU0gYnVmZmVycyB0byBmb3JtIGEgVHggZnJhbWUsIGVhY2ggUmVjZWl2ZSBCdWZmZXIKKyAqIERlc2NyaXB0b3IgKFJCRCkgcG9pbnRzIHRvIG9ubHkgb25lIFJ4IEJ1ZmZlciAoUkIpOyB0aGVyZSBpcyBhIDE6MQorICogbWFwcGluZyBiZXR3ZWVuIFJCRHMgYW5kIFJCcy4KKyAqCisgKiBEcml2ZXIgbXVzdCBhbGxvY2F0ZSBob3N0IERSQU0gbWVtb3J5IGZvciB0aGUgZm9sbG93aW5nLCBhbmQgc2V0IHRoZQorICogcGh5c2ljYWwgYWRkcmVzcyBvZiBlYWNoIGludG8gNDk2NSByZWdpc3RlcnM6CisgKgorICogMSkgIFJlY2VpdmUgQnVmZmVyIERlc2NyaXB0b3IgKFJCRCkgY2lyY3VsYXIgYnVmZmVyIChDQiksIHR5cGljYWxseSB3aXRoIDI1NgorICogICAgIGVudHJpZXMgKGFsdGhvdWdoIGFueSBwb3dlciBvZiAyLCB1cCB0byA0MDk2LCBpcyBzZWxlY3RhYmxlIGJ5IGRyaXZlcikuCisgKiAgICAgRWFjaCBlbnRyeSAoMSBkd29yZCkgcG9pbnRzIHRvIGEgcmVjZWl2ZSBidWZmZXIgKFJCKSBvZiBjb25zaXN0ZW50IHNpemUKKyAqICAgICAodHlwaWNhbGx5IDRLLCBhbHRob3VnaCA4SyBvciAxNksgYXJlIGFsc28gc2VsZWN0YWJsZSBieSBkcml2ZXIpLgorICogICAgIERyaXZlciBzZXRzIHVwIFJCIHNpemUgYW5kIG51bWJlciBvZiBSQkRzIGluIHRoZSBDQiB2aWEgUnggY29uZmlnCisgKiAgICAgcmVnaXN0ZXIgRkg0OV9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLgorICoKKyAqICAgICBCaXQgZmllbGRzIHdpdGhpbiBvbmUgUkJEOgorICogICAgIDI3LTA6ICBSZWNlaXZlIEJ1ZmZlciBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgWzM1OjhdLCAyNTYtYnl0ZSBhbGlnbmVkCisgKgorICogICAgIERyaXZlciBzZXRzIHBoeXNpY2FsIGFkZHJlc3MgWzM1OjhdIG9mIGJhc2Ugb2YgUkJEIGNpcmN1bGFyIGJ1ZmZlcgorICogICAgIGludG8gRkg0OV9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRyBbMjc6MF0uCisgKgorICogMikgIFJ4IHN0YXR1cyBidWZmZXIsIDggYnl0ZXMsIGluIHdoaWNoIDQ5NjUgaW5kaWNhdGVzIHdoaWNoIFJ4IEJ1ZmZlcnMKKyAqICAgICAoUkJzKSBoYXZlIGJlZW4gZmlsbGVkLCB2aWEgYSAid3JpdGUgcG9pbnRlciIsIGFjdHVhbGx5IHRoZSBpZHggb2YKKyAqICAgICB0aGUgUkIncyBjb3JyZXNwb25kaW5nIFJCRCB3aXRoaW4gdGhlIGNpcmN1bGFyIGJ1ZmZlci4gIERyaXZlciBzZXRzCisgKiAgICAgcGh5c2ljYWwgYWRkcmVzcyBbMzU6NF0gaW50byBGSDQ5X1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcgWzMxOjBdLgorICoKKyAqICAgICBCaXQgZmllbGRzIGluIGxvd2VyIGR3b3JkIG9mIFJ4IHN0YXR1cyBidWZmZXIgKHVwcGVyIGR3b3JkIG5vdCB1c2VkCisgKiAgICAgYnkgZHJpdmVyOyBzZWUgc3RydWN0IGlsNDk2NV9zaGFyZWQsIHZhbDApOgorICogICAgIDMxLTEyOiAgTm90IHVzZWQgYnkgZHJpdmVyCisgKiAgICAgMTEtIDA6ICBJbmRleCBvZiBsYXN0IGZpbGxlZCBSeCBidWZmZXIgZGVzY3JpcHRvcgorICogICAgICAgICAgICAgKDQ5NjUgd3JpdGVzLCBkcml2ZXIgcmVhZHMgdGhpcyB2YWx1ZSkKKyAqCisgKiBBcyB0aGUgZHJpdmVyIHByZXBhcmVzIFJlY2VpdmUgQnVmZmVycyAoUkJzKSBmb3IgNDk2NSB0byBmaWxsLCBkcml2ZXIgbXVzdAorICogZW50ZXIgcG9pbnRlcnMgdG8gdGhlc2UgUkJzIGludG8gY29udGlndW91cyBSQkQgY2lyY3VsYXIgYnVmZmVyIGVudHJpZXMsCisgKiBhbmQgdXBkYXRlIHRoZSA0OTY1J3MgIndyaXRlIiBpZHggcmVnaXN0ZXIsCisgKiBGSDQ5X1JTQ1NSX0NITkwwX1JCRENCX1dQVFJfUkVHLgorICoKKyAqIFRoaXMgIndyaXRlIiBpZHggY29ycmVzcG9uZHMgdG8gdGhlICpuZXh0KiBSQkQgdGhhdCB0aGUgZHJpdmVyIHdpbGwgbWFrZQorICogYXZhaWxhYmxlLCBpLmUuIG9uZSBSQkQgcGFzdCB0aGUgdGFpbCBvZiB0aGUgcmVhZHktdG8tZmlsbCBSQkRzIHdpdGhpbgorICogdGhlIGNpcmN1bGFyIGJ1ZmZlci4gIFRoaXMgdmFsdWUgc2hvdWxkIGluaXRpYWxseSBiZSAwIChiZWZvcmUgcHJlcGFyaW5nIGFueQorICogUkJzKSwgc2hvdWxkIGJlIDggYWZ0ZXIgcHJlcGFyaW5nIHRoZSBmaXJzdCA4IFJCcyAoZm9yIGV4YW1wbGUpLCBhbmQgbXVzdAorICogd3JhcCBiYWNrIHRvIDAgYXQgdGhlIGVuZCBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIChidXQgZG9uJ3Qgd3JhcCBiZWZvcmUKKyAqICJyZWFkIiBpZHggaGFzIGFkdmFuY2VkIHBhc3QgMSEgIFNlZSBiZWxvdykuCisgKiBOT1RFOiAgNDk2NSBFWFBFQ1RTIFRIRSBXUklURSBJRFggVE8gQkUgSU5DUkVNRU5URUQgSU4gTVVMVElQTEVTIE9GIDguCisgKgorICogQXMgdGhlIDQ5NjUgZmlsbHMgUkJzIChyZWZlcmVuY2VkIGZyb20gY29udGlndW91cyBSQkRzIHdpdGhpbiB0aGUgY2lyY3VsYXIKKyAqIGJ1ZmZlciksIGl0IHVwZGF0ZXMgdGhlIFJ4IHN0YXR1cyBidWZmZXIgaW4gaG9zdCBEUkFNLCAyKSBkZXNjcmliZWQgYWJvdmUsCisgKiB0byB0ZWxsIHRoZSBkcml2ZXIgdGhlIGlkeCBvZiB0aGUgbGF0ZXN0IGZpbGxlZCBSQkQuICBUaGUgZHJpdmVyIG11c3QKKyAqIHJlYWQgdGhpcyAicmVhZCIgaWR4IGZyb20gRFJBTSBhZnRlciByZWNlaXZpbmcgYW4gUnggaW50ZXJydXB0IGZyb20gNDk2NS4KKyAqCisgKiBUaGUgZHJpdmVyIG11c3QgYWxzbyBpbnRlcm5hbGx5IGtlZXAgdHJhY2sgb2YgYSB0aGlyZCBpZHgsIHdoaWNoIGlzIHRoZQorICogbmV4dCBSQkQgdG8gcHJvY2Vzcy4gIFdoZW4gcmVjZWl2aW5nIGFuIFJ4IGludGVycnVwdCwgZHJpdmVyIHNob3VsZCBwcm9jZXNzCisgKiBhbGwgZmlsbGVkIGJ1dCB1bnByb2Nlc3NlZCBSQnMgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCB0aGUgUkIKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlICJyZWFkIiBpZHguICBGb3IgZXhhbXBsZSwgaWYgInJlYWQiIGlkeCBiZWNvbWVzICIxIiwKKyAqIGRyaXZlciBtYXkgcHJvY2VzcyB0aGUgUkIgcG9pbnRlZCB0byBieSBSQkQgMC4gIERlcGVuZGluZyBvbiB2b2x1bWUgb2YKKyAqIHRyYWZmaWMsIHRoZXJlIG1heSBiZSBtYW55IFJCcyB0byBwcm9jZXNzLgorICoKKyAqIElmIHJlYWQgaWR4ID09IHdyaXRlIGlkeCwgNDk2NSB0aGlua3MgdGhlcmUgaXMgbm8gcm9vbSB0byBwdXQgbmV3IGRhdGEuCisgKiBEdWUgdG8gdGhpcywgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGxlZCBSQnMgaXMgMjU1LCBpbnN0ZWFkIG9mIDI1Ni4gIFRvCisgKiBiZSBzYWZlLCBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBhIGdhcCBvZiBhdCBsZWFzdCAyIFJCRHMgYmV0d2VlbiAid3JpdGUiCisgKiBhbmQgInJlYWQiIGlkeGVzOyB0aGF0IGlzLCBtYWtlIHN1cmUgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDI1NAorICogYnVmZmVycyB3YWl0aW5nIHRvIGJlIGZpbGxlZC4KKyAqLworI2RlZmluZSBGSDQ5X01FTV9SU0NTUl9MT1dFUl9CT1VORAkoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEJDMCkKKyNkZWZpbmUgRkg0OV9NRU1fUlNDU1JfVVBQRVJfQk9VTkQJKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhDMDApCisjZGVmaW5lIEZINDlfTUVNX1JTQ1NSX0NITkwwCQkoRkg0OV9NRU1fUlNDU1JfTE9XRVJfQk9VTkQpCisKKy8qKgorICogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIDgtYnl0ZSBSeCBTdGF0dXMgYnVmZmVyLgorICogQml0IGZpZWxkczoKKyAqICAzMS0wOiBSeCBzdGF0dXMgYnVmZmVyIHBoeXNpY2FsIGJhc2UgYWRkcmVzcyBbMzU6NF0sIG11c3QgMTYtYnl0ZSBhbGlnbmVkLgorICovCisjZGVmaW5lIEZINDlfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRwkoRkg0OV9NRU1fUlNDU1JfQ0hOTDApCisKKy8qKgorICogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIFJ4IEJ1ZmZlciBEZXNjcmlwdG9yIENpcmN1bGFyIEJ1ZmZlci4KKyAqIEJpdCBmaWVsZHM6CisgKiAgMjctMDogIFJCRCBDRCBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgWzM1OjhdLCBtdXN0IGJlIDI1Ni1ieXRlIGFsaWduZWQuCisgKi8KKyNkZWZpbmUgRkg0OV9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRwkoRkg0OV9NRU1fUlNDU1JfQ0hOTDAgKyAweDAwNCkKKworLyoqCisgKiBSeCB3cml0ZSBwb2ludGVyIChpZHgsIHJlYWxseSEpLgorICogQml0IGZpZWxkczoKKyAqICAxMS0wOiAgSW5kZXggb2YgZHJpdmVyJ3MgbW9zdCByZWNlbnQgcHJlcGFyZWQtdG8tYmUtZmlsbGVkIFJCRCwgKyAxLgorICogICAgICAgICBOT1RFOiAgRm9yIDI1Ni1lbnRyeSBjaXJjdWxhciBidWZmZXIsIHVzZSBvbmx5IGJpdHMgWzc6MF0uCisgKi8KKyNkZWZpbmUgRkg0OV9SU0NTUl9DSE5MMF9SQkRDQl9XUFRSX1JFRwkoRkg0OV9NRU1fUlNDU1JfQ0hOTDAgKyAweDAwOCkKKyNkZWZpbmUgRkg0OV9SU0NTUl9DSE5MMF9XUFRSICAgICAgICAoRkg0OV9SU0NTUl9DSE5MMF9SQkRDQl9XUFRSX1JFRykKKworLyoqCisgKiBSeCBDb25maWcvU3RhdHVzIFJlZ2lzdGVycyAoUkNTUikKKyAqIFJ4IENvbmZpZyBSZWcgZm9yIGNoYW5uZWwgMCAob25seSBjaGFubmVsIHVzZWQpCisgKgorICogRHJpdmVyIG11c3QgaW5pdGlhbGl6ZSBGSDQ5X01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcgYXMgZm9sbG93cyBmb3IKKyAqIG5vcm1hbCBvcGVyYXRpb24gKHNlZSBiaXQgZmllbGRzKS4KKyAqCisgKiBDbGVhcmluZyBGSDQ5X01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcgdG8gMCB0dXJucyBvZmYgUnggRE1BLgorICogRHJpdmVyIHNob3VsZCBwb2xsIEZINDlfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRwlmb3IKKyAqIEZINDlfUlNTUl9DSE5MMF9SWF9TVEFUVVNfQ0hOTF9JRExFIChiaXQgMjQpIGJlZm9yZSBjb250aW51aW5nLgorICoKKyAqIEJpdCBmaWVsZHM6CisgKiAzMS0zMDogUnggRE1BIGNoYW5uZWwgZW5hYmxlOiAnMDAnIG9mZi9wYXVzZSwgJzAxJyBwYXVzZSBhdCBlbmQgb2YgZnJhbWUsCisgKiAgICAgICAgJzEwJyBvcGVyYXRlIG5vcm1hbGx5CisgKiAyOS0yNDogcmVzZXJ2ZWQKKyAqIDIzLTIwOiAjIFJCRHMgaW4gY2lyY3VsYXIgYnVmZmVyID0gMl52YWx1ZTsgdXNlICI4IiBmb3IgMjU2IFJCRHMgKG5vcm1hbCksCisgKiAgICAgICAgbWluICI1IiBmb3IgMzIgUkJEcywgbWF4ICIxMiIgZm9yIDQwOTYgUkJEcy4KKyAqIDE5LTE4OiByZXNlcnZlZAorICogMTctMTY6IHNpemUgb2YgZWFjaCByZWNlaXZlIGJ1ZmZlcjsgJzAwJyA0SyAobm9ybWFsKSwgJzAxJyA4SywKKyAqICAgICAgICAnMTAnIDEySywgJzExJyAxNksuCisgKiAxNS0xNDogcmVzZXJ2ZWQKKyAqIDEzLTEyOiBJUlEgZGVzdGluYXRpb247ICcwMCcgbm9uZSwgJzAxJyBob3N0IGRyaXZlciAobm9ybWFsIG9wZXJhdGlvbikKKyAqIDExLSA0OiB0aW1lb3V0IGZvciBjbG9zaW5nIFJ4IGJ1ZmZlciBhbmQgaW50ZXJydXB0aW5nIGhvc3QgKHVuaXRzIDMyIHVzZWMpCisgKiAgICAgICAgdHlwaWNhbCB2YWx1ZSAweDEwIChhYm91dCAxLzIgbXNlYykKKyAqICAzLSAwOiByZXNlcnZlZAorICovCisjZGVmaW5lIEZINDlfTUVNX1JDU1JfTE9XRVJfQk9VTkQgICAgICAoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEMwMCkKKyNkZWZpbmUgRkg0OV9NRU1fUkNTUl9VUFBFUl9CT1VORCAgICAgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4Q0MwKQorI2RlZmluZSBGSDQ5X01FTV9SQ1NSX0NITkwwICAgICAgICAgICAgKEZINDlfTUVNX1JDU1JfTE9XRVJfQk9VTkQpCisKKyNkZWZpbmUgRkg0OV9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHCShGSDQ5X01FTV9SQ1NSX0NITkwwKQorCisjZGVmaW5lIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfUkJfVElNRU9VVF9NU0sgKDB4MDAwMDBGRjApCS8qIGJpdHMgNC0xMSAqLworI2RlZmluZSBGSDQ5X1JDU1JfQ0hOTDBfUlhfQ09ORklHX0lSUV9ERVNUX01TSyAgICgweDAwMDAxMDAwKQkvKiBiaXRzIDEyICovCisjZGVmaW5lIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfU0lOR0xFX0ZSQU1FX01TSyAoMHgwMDAwODAwMCkJLyogYml0IDE1ICovCisjZGVmaW5lIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfUkJfU0laRV9NU0sgICAoMHgwMDAzMDAwMCkJLyogYml0cyAxNi0xNyAqLworI2RlZmluZSBGSDQ5X1JDU1JfQ0hOTDBfUlhfQ09ORklHX1JCREJDX1NJWkVfTVNLICgweDAwRjAwMDAwKQkvKiBiaXRzIDIwLTIzICovCisjZGVmaW5lIEZINDlfUkNTUl9DSE5MMF9SWF9DT05GSUdfRE1BX0NITkxfRU5fTVNLICgweEMwMDAwMDAwKQkvKiBiaXRzIDMwLTMxICovCisKKyNkZWZpbmUgRkg0OV9SQ1NSX1JYX0NPTkZJR19SQkRDQl9TSVpFX1BPUwkoMjApCisjZGVmaW5lIEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX0lSUV9SQlRIX1BPUwkoNCkKKyNkZWZpbmUgUlhfUkJfVElNRU9VVAkoMHgxMCkKKworI2RlZmluZSBGSDQ5X1JDU1JfUlhfQ09ORklHX0NITkxfRU5fUEFVU0VfVkFMICAgICAgICAgKDB4MDAwMDAwMDApCisjZGVmaW5lIEZINDlfUkNTUl9SWF9DT05GSUdfQ0hOTF9FTl9QQVVTRV9FT0ZfVkFMICAgICAoMHg0MDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX0VOQUJMRV9WQUwgICAgICAgICgweDgwMDAwMDAwKQorCisjZGVmaW5lIEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzRLICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV84SyAgICAoMHgwMDAxMDAwMCkKKyNkZWZpbmUgRkg0OV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfMTJLICAgKDB4MDAwMjAwMDApCisjZGVmaW5lIEZINDlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzE2SyAgICgweDAwMDMwMDAwKQorCisjZGVmaW5lIEZINDlfUkNTUl9DSE5MMF9SWF9JR05PUkVfUlhGX0VNUFRZICAgICAgICAgICAgICAoMHgwMDAwMDAwNCkKKyNkZWZpbmUgRkg0OV9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9OT19JTlRfVkFMICAgICgweDAwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1JDU1JfQ0hOTDBfUlhfQ09ORklHX0lSUV9ERVNUX0lOVF9IT1NUX1ZBTCAgKDB4MDAwMDEwMDApCisKKy8qKgorICogUnggU2hhcmVkIFN0YXR1cyBSZWdpc3RlcnMgKFJTU1IpCisgKgorICogQWZ0ZXIgc3RvcHBpbmcgUnggRE1BIGNoYW5uZWwgKHdyaXRpbmcgMCB0bworICogRkg0OV9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHKSwgZHJpdmVyIG11c3QgcG9sbAorICogRkg0OV9NRU1fUlNTUl9SWF9TVEFUVVNfUkVHIHVudGlsIFJ4IGNoYW5uZWwgaXMgaWRsZS4KKyAqCisgKiBCaXQgZmllbGRzOgorICogIDI0OiAgMSA9IENoYW5uZWwgMCBpcyBpZGxlCisgKgorICogRkg0OV9NRU1fUlNTUl9TSEFSRURfQ1RSTF9SRUcgYW5kIEZINDlfTUVNX1JTU1JfUlhfRU5BQkxFX0VSUl9JUlEyRFJWCisgKiBjb250YWluIGRlZmF1bHQgdmFsdWVzIHRoYXQgc2hvdWxkIG5vdCBiZSBhbHRlcmVkIGJ5IHRoZSBkcml2ZXIuCisgKi8KKyNkZWZpbmUgRkg0OV9NRU1fUlNTUl9MT1dFUl9CT1VORCAgICAgICAgICAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhDNDApCisjZGVmaW5lIEZINDlfTUVNX1JTU1JfVVBQRVJfQk9VTkQgICAgICAgICAgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4RDAwKQorCisjZGVmaW5lIEZINDlfTUVNX1JTU1JfU0hBUkVEX0NUUkxfUkVHICAgICAgIChGSDQ5X01FTV9SU1NSX0xPV0VSX0JPVU5EKQorI2RlZmluZSBGSDQ5X01FTV9SU1NSX1JYX1NUQVRVU19SRUcJKEZINDlfTUVNX1JTU1JfTE9XRVJfQk9VTkQgKyAweDAwNCkKKyNkZWZpbmUgRkg0OV9NRU1fUlNTUl9SWF9FTkFCTEVfRVJSX0lSUTJEUlZcCisJCQkJCShGSDQ5X01FTV9SU1NSX0xPV0VSX0JPVU5EICsgMHgwMDgpCisKKyNkZWZpbmUgRkg0OV9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUJKDB4MDEwMDAwMDApCisKKyNkZWZpbmUgRkg0OV9NRU1fVEZESUJfUkVHMV9BRERSX0JJVFNISUZUCTI4CisKKy8qIFRGREIgIEFyZWEgLSBURkRzIGJ1ZmZlciB0YWJsZSAqLworI2RlZmluZSBGSDQ5X01FTV9URkRJQl9EUkFNX0FERFJfTFNCX01TSyAgICAgICgweEZGRkZGRkZGKQorI2RlZmluZSBGSDQ5X1RGRElCX0xPV0VSX0JPVU5EICAgICAgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4OTAwKQorI2RlZmluZSBGSDQ5X1RGRElCX1VQUEVSX0JPVU5EICAgICAgIChGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4OTU4KQorI2RlZmluZSBGSDQ5X1RGRElCX0NUUkwwX1JFRyhfY2hubCkgIChGSDQ5X1RGRElCX0xPV0VSX0JPVU5EICsgMHg4ICogKF9jaG5sKSkKKyNkZWZpbmUgRkg0OV9URkRJQl9DVFJMMV9SRUcoX2NobmwpICAoRkg0OV9URkRJQl9MT1dFUl9CT1VORCArIDB4OCAqIChfY2hubCkgKyAweDQpCisKKy8qKgorICogVHJhbnNtaXQgRE1BIENoYW5uZWwgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXJzIChUQ1NSKQorICoKKyAqIDQ5NjUgaGFzIG9uZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGZvciBlYWNoIG9mIDggVHggRE1BL0ZJRk8gY2hhbm5lbHMKKyAqIHN1cHBvcnRlZCBpbiBoYXJkd2FyZSAoZG9uJ3QgY29uZnVzZSB0aGVzZSB3aXRoIHRoZSAxNiBUeCBxdWV1ZXMgaW4gRFJBTSwKKyAqIHdoaWNoIGZlZWQgdGhlIERNQS9GSUZPIGNoYW5uZWxzKTsgY29uZmlnIHJlZ3MgYXJlIHNlcGFyYXRlZCBieSAweDIwIGJ5dGVzLgorICoKKyAqIFRvIHVzZSBhIFR4IERNQSBjaGFubmVsLCBkcml2ZXIgbXVzdCBpbml0aWFsaXplIGl0cworICogRkg0OV9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhjaG5sKSB3aXRoOgorICoKKyAqIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTkFCTEUgfAorICogRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRU5BQkxFX1ZBTAorICoKKyAqIEFsbCBvdGhlciBiaXRzIHNob3VsZCBiZSAwLgorICoKKyAqIEJpdCBmaWVsZHM6CisgKiAzMS0zMDogVHggRE1BIGNoYW5uZWwgZW5hYmxlOiAnMDAnIG9mZi9wYXVzZSwgJzAxJyBwYXVzZSBhdCBlbmQgb2YgZnJhbWUsCisgKiAgICAgICAgJzEwJyBvcGVyYXRlIG5vcm1hbGx5CisgKiAyOS0gNDogUmVzZXJ2ZWQsIHNldCB0byAiMCIKKyAqICAgICAzOiBFbmFibGUgaW50ZXJuYWwgRE1BIHJlcXVlc3RzICgxLCBub3JtYWwgb3BlcmF0aW9uKSwgZGlzYWJsZSAoMCkKKyAqICAyLSAwOiBSZXNlcnZlZCwgc2V0IHRvICIwIgorICovCisjZGVmaW5lIEZINDlfVENTUl9MT1dFUl9CT1VORCAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhEMDApCisjZGVmaW5lIEZINDlfVENTUl9VUFBFUl9CT1VORCAgKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhFNjApCisKKy8qIEZpbmQgQ29udHJvbC9TdGF0dXMgcmVnIGZvciBnaXZlbiBUeCBETUEvRklGTyBjaGFubmVsICovCisjZGVmaW5lIEZINDlfVENTUl9DSE5MX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoNykKKyNkZWZpbmUgRkg1MF9UQ1NSX0NITkxfTlVNICAgICAgICAgICAgICAgICAgICAgICAgICAgICg4KQorCisvKiBUQ1NSOiB0eF9jb25maWcgcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lIEZINDlfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoX2NobmwpCVwKKwkJKEZINDlfVENTUl9MT1dFUl9CT1VORCArIDB4MjAgKiAoX2NobmwpKQorI2RlZmluZSBGSDQ5X1RDU1JfQ0hOTF9UWF9DUkVESVRfUkVHKF9jaG5sKQlcCisJCShGSDQ5X1RDU1JfTE9XRVJfQk9VTkQgKyAweDIwICogKF9jaG5sKSArIDB4NCkKKyNkZWZpbmUgRkg0OV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUcoX2NobmwpCVwKKwkJKEZINDlfVENTUl9MT1dFUl9CT1VORCArIDB4MjAgKiAoX2NobmwpICsgMHg4KQorCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9UWEYJCSgweDAwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfRFJWCQkoMHgwMDAwMDAwMSkKKworI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9ESVNBQkxFCSgweDAwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9FTkFCTEUJKDB4MDAwMDAwMDgpCisKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9OT0lOVAkoMHgwMDAwMDAwMCkKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9FTkRURkQJKDB4MDAxMDAwMDApCisjZGVmaW5lIEZINDlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfSUZURkQJKDB4MDAyMDAwMDApCisKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfUlRDX05PSU5UCSgweDAwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9SVENfRU5EVEZECSgweDAwNDAwMDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9SVENfSUZURkQJKDB4MDA4MDAwMDApCisKKyNkZWZpbmUgRkg0OV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX1BBVVNFCSgweDAwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfUEFVU0VfRU9GCSgweDQwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFCSgweDgwMDAwMDAwKQorCisjZGVmaW5lIEZINDlfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1ZBTF9URkRCX0VNUFRZCSgweDAwMDAwMDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9XQUlUCSgweDAwMDAyMDAwKQorI2RlZmluZSBGSDQ5X1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19WQUxfVEZEQl9WQUxJRAkoMHgwMDAwMDAwMykKKworI2RlZmluZSBGSDQ5X1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19QT1NfVEJfTlVNCQkoMjApCisjZGVmaW5lIEZINDlfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1BPU19UQl9JRFgJCSgxMikKKworLyoqCisgKiBUeCBTaGFyZWQgU3RhdHVzIFJlZ2lzdGVycyAoVFNTUikKKyAqCisgKiBBZnRlciBzdG9wcGluZyBUeCBETUEgY2hhbm5lbCAod3JpdGluZyAwIHRvCisgKiBGSDQ5X1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKGNobmwpKSwgZHJpdmVyIG11c3QgcG9sbAorICogRkg0OV9UU1NSX1RYX1NUQVRVU19SRUcgdW50aWwgc2VsZWN0ZWQgVHggY2hhbm5lbCBpcyBpZGxlCisgKiAoY2hhbm5lbCdzIGJ1ZmZlcnMgZW1wdHkgfCBubyBwZW5kaW5nIHJlcXVlc3RzKS4KKyAqCisgKiBCaXQgZmllbGRzOgorICogMzEtMjQ6ICAxID0gQ2hhbm5lbCBidWZmZXJzIGVtcHR5IChjaGFubmVsIDc6MCkKKyAqIDIzLTE2OiAgMSA9IE5vIHBlbmRpbmcgcmVxdWVzdHMgKGNoYW5uZWwgNzowKQorICovCisjZGVmaW5lIEZINDlfVFNTUl9MT1dFUl9CT1VORAkJKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhFQTApCisjZGVmaW5lIEZINDlfVFNTUl9VUFBFUl9CT1VORAkJKEZINDlfTUVNX0xPV0VSX0JPVU5EICsgMHhFQzApCisKKyNkZWZpbmUgRkg0OV9UU1NSX1RYX1NUQVRVU19SRUcJCShGSDQ5X1RTU1JfTE9XRVJfQk9VTkQgKyAweDAxMCkKKworLyoqCisgKiBCaXQgZmllbGRzIGZvciBUU1NSKFR4IFNoYXJlZCBTdGF0dXMgJiBDb250cm9sKSBlcnJvciBzdGF0dXMgcmVnaXN0ZXI6CisgKiAzMTogIEluZGljYXRlcyBhbiBhZGRyZXNzIGVycm9yIHdoZW4gYWNjZXNzZWQgdG8gaW50ZXJuYWwgbWVtb3J5CisgKgl1Q29kZS9kcml2ZXIgbXVzdCB3cml0ZSAiMSIgaW4gb3JkZXIgdG8gY2xlYXIgdGhpcyBmbGFnCisgKiAzMDogIEluZGljYXRlcyB0aGF0IEhvc3QgZGlkIG5vdCBzZW5kIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZHdvcmRzIHRvIEZICisgKgl1Q29kZS9kcml2ZXIgbXVzdCB3cml0ZSAiMSIgaW4gb3JkZXIgdG8gY2xlYXIgdGhpcyBmbGFnCisgKiAxNi05OkVhY2ggc3RhdHVzIGJpdCBpcyBmb3Igb25lIGNoYW5uZWwuIEluZGljYXRlcyB0aGF0IGFuIChFcnJvcikgQWN0RE1BCisgKgljb21tYW5kIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBzY2hlZHVsZXIgd2hpbGUgdGhlIFRSQiB3YXMgYWxyZWFkeSBmdWxsCisgKgl3aXRoIHByZXZpb3VzIGNvbW1hbmQKKyAqCXVDb2RlL2RyaXZlciBtdXN0IHdyaXRlICIxIiBpbiBvcmRlciB0byBjbGVhciB0aGlzIGZsYWcKKyAqIDctMDogRWFjaCBzdGF0dXMgYml0IGluZGljYXRlcyBhIGNoYW5uZWwncyBUeENyZWRpdCBlcnJvci4gV2hlbiBhbiBlcnJvcgorICoJYml0IGlzIHNldCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIEZIIGhhcyByZWNlaXZlZCBhIGZ1bGwgaW5kaWNhdGlvbgorICoJZnJvbSB0aGUgUlRDIFR4RklGTyBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIFR4Q3JlZGl0IGNvdW50ZXIgd2FzCisgKglub3QgZXF1YWwgdG8gemVyby4gVGhpcyBtZWFuIHRoYXQgdGhlIGNyZWRpdCBtZWNoYW5pc20gd2FzIG5vdAorICoJc3luY2hyb25pemVkIHRvIHRoZSBUeEZJRk8gc3RhdHVzCisgKgl1Q29kZS9kcml2ZXIgbXVzdCB3cml0ZSAiMSIgaW4gb3JkZXIgdG8gY2xlYXIgdGhpcyBmbGFnCisgKi8KKyNkZWZpbmUgRkg0OV9UU1NSX1RYX0VSUk9SX1JFRwkJKEZINDlfVFNTUl9MT1dFUl9CT1VORCArIDB4MDE4KQorCisjZGVmaW5lIEZINDlfVFNTUl9UWF9TVEFUVVNfUkVHX01TS19DSE5MX0lETEUoX2NobmwpICgoMSA8PCAoX2NobmwpKSA8PCAxNikKKworLyogVHggc2VydmljZSBjaGFubmVscyAqLworI2RlZmluZSBGSDQ5X1NSVkNfQ0hOTAkJKDkpCisjZGVmaW5lIEZINDlfU1JWQ19MT1dFUl9CT1VORAkoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweDlDOCkKKyNkZWZpbmUgRkg0OV9TUlZDX1VQUEVSX0JPVU5ECShGSDQ5X01FTV9MT1dFUl9CT1VORCArIDB4OUQwKQorI2RlZmluZSBGSDQ5X1NSVkNfQ0hOTF9TUkFNX0FERFJfUkVHKF9jaG5sKSBcCisJCShGSDQ5X1NSVkNfTE9XRVJfQk9VTkQgKyAoKF9jaG5sKSAtIDkpICogMHg0KQorCisjZGVmaW5lIEZINDlfVFhfQ0hJQ0tFTl9CSVRTX1JFRwkoRkg0OV9NRU1fTE9XRVJfQk9VTkQgKyAweEU5OCkKKy8qIEluc3RydWN0IEZIIHRvIGluY3JlbWVudCB0aGUgcmV0cnkgY291bnQgb2YgYSBwYWNrZXQgd2hlbgorICogaXQgaXMgYnJvdWdodCBmcm9tIHRoZSBtZW1vcnkgdG8gVFgtRklGTworICovCisjZGVmaW5lIEZINDlfVFhfQ0hJQ0tFTl9CSVRTX1NDRF9BVVRPX1JFVFJZX0VOCSgweDAwMDAwMDAyKQorCisvKiBLZWVwIFdhcm0gU2l6ZSAqLworI2RlZmluZSBJTF9LV19TSVpFIDB4MTAwMAkvKiA0ayAqLworCisjZW5kaWYgLyogX19pbF80OTY1X2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L0tjb25maWcKaW5kZXggYWVmNjVjZC4uMDViZDM3NSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9LY29uZmlnCkBAIC0xLDQgKzEsNCBAQAotY29uZmlnIElXTFdJRklfTEVHQUNZCitjb25maWcgSVdMRUdBQ1kKIAl0cmlzdGF0ZQogCXNlbGVjdCBGV19MT0FERVIKIAlzZWxlY3QgTkVXX0xFRFMKQEAgLTcsMTMgKzcsMTMgQEAKIAlzZWxlY3QgTUFDODAyMTFfTEVEUwogCiBtZW51ICJEZWJ1Z2dpbmcgT3B0aW9ucyIKLQlkZXBlbmRzIG9uIElXTFdJRklfTEVHQUNZCisJZGVwZW5kcyBvbiBJV0xFR0FDWQogCi1jb25maWcgSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlib29sICJFbmFibGUgZnVsbCBkZWJ1Z2dpbmcgb3V0cHV0IGluIDQ5NjUgYW5kIDM5NDUgZHJpdmVycyIKLQlkZXBlbmRzIG9uIElXTFdJRklfTEVHQUNZCitjb25maWcgSVdMRUdBQ1lfREVCVUcKKwlib29sICJFbmFibGUgZnVsbCBkZWJ1Z2dpbmcgb3V0cHV0IGluIGl3bGVnYWN5IChpd2wgMzk0NS80OTY1KSBkcml2ZXJzIgorCWRlcGVuZHMgb24gSVdMRUdBQ1kKIAktLS1oZWxwLS0tCi0JICBUaGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBkZWJ1ZyB0cmFjaW5nIG91dHB1dCBmb3IgdGhlIGl3bHdpZmlsZWdhY3kKKwkgIFRoaXMgb3B0aW9uIHdpbGwgZW5hYmxlIGRlYnVnIHRyYWNpbmcgb3V0cHV0IGZvciB0aGUgaXdsZWdhY3kKIAkgIGRyaXZlcnMuCiAKIAkgIFRoaXMgd2lsbCByZXN1bHQgaW4gdGhlIGtlcm5lbCBtb2R1bGUgYmVpbmcgfjEwMGsgbGFyZ2VyLiAgWW91IGNhbgpAQCAtMjksNDMgKzI5LDI2IEBACiAJCSAgJSBlY2hvIDB4NDNmZmYgPiAvc3lzL2NsYXNzL25ldC93bGFuMC9kZXZpY2UvZGVidWdfbGV2ZWwKIAogCSAgWW91IGNhbiBmaW5kIHRoZSBsaXN0IG9mIGRlYnVnIG1hc2sgdmFsdWVzIGluOgotCQkgIGRyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmlsZWdhY3kvaXdsLWRlYnVnLmgKKwkJICBkcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uaAogCiAJICBJZiB0aGlzIGlzIHlvdXIgZmlyc3QgdGltZSB1c2luZyB0aGlzIGRyaXZlciwgeW91IHNob3VsZCBzYXkgWSBoZXJlCiAJICBhcyB0aGUgZGVidWcgaW5mb3JtYXRpb24gY2FuIGFzc2lzdCBvdGhlcnMgaW4gaGVscGluZyB5b3UgcmVzb2x2ZQogCSAgYW55IHByb2JsZW1zIHlvdSBtYXkgZW5jb3VudGVyLgogCi1jb25maWcgSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotICAgICAgICBib29sICI0OTY1IGFuZCAzOTQ1IGRlYnVnZnMgc3VwcG9ydCIKLSAgICAgICAgZGVwZW5kcyBvbiBJV0xXSUZJX0xFR0FDWSAmJiBNQUM4MDIxMV9ERUJVR0ZTCitjb25maWcgSVdMRUdBQ1lfREVCVUdGUworICAgICAgICBib29sICJpd2xlZ2FjeSAoaXdsIDM5NDUvNDk2NSkgZGVidWdmcyBzdXBwb3J0IgorICAgICAgICBkZXBlbmRzIG9uIElXTEVHQUNZICYmIE1BQzgwMjExX0RFQlVHRlMKICAgICAgICAgLS0taGVscC0tLQotCSAgRW5hYmxlIGNyZWF0aW9uIG9mIGRlYnVnZnMgZmlsZXMgZm9yIHRoZSBpd2x3aWZpbGVnYWN5IGRyaXZlcnMuIFRoaXMKKwkgIEVuYWJsZSBjcmVhdGlvbiBvZiBkZWJ1Z2ZzIGZpbGVzIGZvciB0aGUgaXdsZWdhY3kgZHJpdmVycy4gVGhpcwogCSAgaXMgYSBsb3ctaW1wYWN0IG9wdGlvbiB0aGF0IGFsbG93cyBnZXR0aW5nIGluc2lnaHQgaW50byB0aGUKIAkgIGRyaXZlcidzIHN0YXRlIGF0IHJ1bnRpbWUuCiAKLWNvbmZpZyBJV0xXSUZJX0xFR0FDWV9ERVZJQ0VfVFJBQ0lORwotCWJvb2wgIml3bHdpZmlsZWdhY3kgbGVnYWN5IGRldmljZSBhY2Nlc3MgdHJhY2luZyIKLQlkZXBlbmRzIG9uIElXTFdJRklfTEVHQUNZCi0JZGVwZW5kcyBvbiBFVkVOVF9UUkFDSU5HCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byB0cmFjZSBhbGwgY29tbWFuZHMsIGluY2x1ZGluZyBUWCBmcmFtZXMgYW5kIElPCi0JICBhY2Nlc3Nlcywgc2VudCB0byB0aGUgZGV2aWNlLiBJZiB5b3Ugc2F5IHllcywgaXdsd2lmaWxlZ2FjeSB3aWxsCi0JICByZWdpc3RlciB3aXRoIHRoZSBmdHJhY2UgZnJhbWV3b3JrIGZvciBldmVudCB0cmFjaW5nIGFuZCBkdW1wCi0JICBhbGwgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgcmluZ2J1ZmZlciwgeW91IG1heSBuZWVkIHRvCi0JICBpbmNyZWFzZSB0aGUgcmluZ2J1ZmZlciBzaXplLiBTZWUgdGhlIGZ0cmFjZSBkb2N1bWVudGF0aW9uCi0JICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLQotCSAgV2hlbiB0cmFjaW5nIGlzIG5vdCBlbmFibGVkLCB0aGlzIG9wdGlvbiBzdGlsbCBoYXMgc29tZQotCSAgKHRob3VnaCByYXRoZXIgc21hbGwpIG92ZXJoZWFkLgotCi0JICBJZiB1bnN1cmUsIHNheSBZIHNvIHdlIGNhbiBoZWxwIHlvdSBiZXR0ZXIgd2hlbiBwcm9ibGVtcwotCSAgb2NjdXIuCiBlbmRtZW51CiAKIGNvbmZpZyBJV0w0OTY1CiAJdHJpc3RhdGUgIkludGVsIFdpcmVsZXNzIFdpRmkgNDk2NUFHTiAoaXdsNDk2NSkiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgTUFDODAyMTEKLQlzZWxlY3QgSVdMV0lGSV9MRUdBQ1kKKwlzZWxlY3QgSVdMRUdBQ1kKIAktLS1oZWxwLS0tCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIHN1cHBvcnQgZm9yCiAKQEAgLTkzLDcgKzc2LDcgQEAKIGNvbmZpZyBJV0wzOTQ1CiAJdHJpc3RhdGUgIkludGVsIFBSTy9XaXJlbGVzcyAzOTQ1QUJHL0JHIE5ldHdvcmsgQ29ubmVjdGlvbiAoaXdsMzk0NSkiCiAJZGVwZW5kcyBvbiBQQ0kgJiYgTUFDODAyMTEKLQlzZWxlY3QgSVdMV0lGSV9MRUdBQ1kKKwlzZWxlY3QgSVdMRUdBQ1kKIAktLS1oZWxwLS0tCiAJICBTZWxlY3QgdG8gYnVpbGQgdGhlIGRyaXZlciBzdXBwb3J0aW5nIHRoZToKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9NYWtlZmlsZQppbmRleCBkNTZhZWIzLi5jOTg1YTAxIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9NYWtlZmlsZQpAQCAtMSwyNSArMSwxNyBAQAotb2JqLSQoQ09ORklHX0lXTFdJRklfTEVHQUNZKQkrPSBpd2wtbGVnYWN5Lm8KLWl3bC1sZWdhY3ktb2JqcyAJCTo9IGl3bC1jb3JlLm8gaXdsLWVlcHJvbS5vIGl3bC1oY21kLm8gaXdsLXBvd2VyLm8KLWl3bC1sZWdhY3ktb2JqcyAJCSs9IGl3bC1yeC5vIGl3bC10eC5vIGl3bC1zdGEubwotaXdsLWxlZ2FjeS1vYmpzIAkJKz0gaXdsLXNjYW4ubyBpd2wtbGVkLm8KLWl3bC1sZWdhY3ktJChDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUykgKz0gaXdsLWRlYnVnZnMubwotaXdsLWxlZ2FjeS0kKENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERVZJQ0VfVFJBQ0lORykgKz0gaXdsLWRldnRyYWNlLm8KK29iai0kKENPTkZJR19JV0xFR0FDWSkJKz0gaXdsZWdhY3kubworaXdsZWdhY3ktb2JqcyAJCTo9IGNvbW1vbi5vCitpd2xlZ2FjeS0kKENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTKSArPSBkZWJ1Zy5vCiAKLWl3bC1sZWdhY3ktb2JqcyArPSAkKGl3bC1sZWdhY3ktbSkKLQotQ0ZMQUdTX2l3bC1kZXZ0cmFjZS5vIDo9IC1JJChzcmMpCitpd2xlZ2FjeS1vYmpzICs9ICQoaXdsZWdhY3ktbSkKIAogIyA0OTY1CiBvYmotJChDT05GSUdfSVdMNDk2NSkJKz0gaXdsNDk2NS5vCi1pd2w0OTY1LW9ianMJCTo9IGl3bC00OTY1Lm8gaXdsNDk2NS1iYXNlLm8gaXdsLTQ5NjUtcnMubyBpd2wtNDk2NS1sZWQubwotaXdsNDk2NS1vYmpzCQkrPSBpd2wtNDk2NS11Y29kZS5vIGl3bC00OTY1LXR4Lm8KLWl3bDQ5NjUtb2JqcwkJKz0gaXdsLTQ5NjUtbGliLm8gaXdsLTQ5NjUtcngubyBpd2wtNDk2NS1jYWxpYi5vCi1pd2w0OTY1LW9ianMJCSs9IGl3bC00OTY1LXN0YS5vIGl3bC00OTY1LWVlcHJvbS5vCi1pd2w0OTY1LSQoQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMpICs9IGl3bC00OTY1LWRlYnVnZnMubworaXdsNDk2NS1vYmpzCQk6PSA0OTY1Lm8gNDk2NS1tYWMubyA0OTY1LXJzLm8gNDk2NS1jYWxpYi5vCitpd2w0OTY1LSQoQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMpICs9IDQ5NjUtZGVidWcubwogCiAjIDM5NDUKIG9iai0kKENPTkZJR19JV0wzOTQ1KQkrPSBpd2wzOTQ1Lm8KLWl3bDM5NDUtb2JqcwkJOj0gaXdsMzk0NS1iYXNlLm8gaXdsLTM5NDUubyBpd2wtMzk0NS1ycy5vIGl3bC0zOTQ1LWxlZC5vCi1pd2wzOTQ1LSQoQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMpICs9IGl3bC0zOTQ1LWRlYnVnZnMubworaXdsMzk0NS1vYmpzCQk6PSAzOTQ1LW1hYy5vIDM5NDUubyAzOTQ1LXJzLm8KK2l3bDM5NDUtJChDT05GSUdfSVdMRUdBQ1lfREVCVUdGUykgKz0gMzk0NS1kZWJ1Zy5vCiAKIGNjZmxhZ3MteSArPSAtRF9fQ0hFQ0tfRU5ESUFOX18KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jb21tYW5kcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbWFuZHMuaApzaW1pbGFyaXR5IGluZGV4IDc5JQpyZW5hbWUgZnJvbSBkcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29tbWFuZHMuaApyZW5hbWUgdG8gZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbWFuZHMuaAppbmRleCA4OTkwNDA1Li4yNWRkN2QyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29tbWFuZHMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tYW5kcy5oCkBAIC02MCwxMDAgKzYwLDk2IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQbGVhc2UgdXNlIHRoaXMgZmlsZSAoaXdsLWNvbW1hbmRzLmgpIG9ubHkgZm9yIHVDb2RlIEFQSSBkZWZpbml0aW9ucy4KLSAqIFBsZWFzZSB1c2UgaXdsLXh4eHgtaHcuaCBmb3IgaGFyZHdhcmUtcmVsYXRlZCBkZWZpbml0aW9ucy4KLSAqIFBsZWFzZSB1c2UgaXdsLWRldi5oIGZvciBkcml2ZXIgaW1wbGVtZW50YXRpb24gZGVmaW5pdGlvbnMuCi0gKi8KIAotI2lmbmRlZiBfX2l3bF9sZWdhY3lfY29tbWFuZHNfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9jb21tYW5kc19oX18KKyNpZm5kZWYgX19pbF9jb21tYW5kc19oX18KKyNkZWZpbmUgX19pbF9jb21tYW5kc19oX18KIAotc3RydWN0IGl3bF9wcml2OworI2luY2x1ZGUgPGxpbnV4L2llZWU4MDIxMS5oPgorCitzdHJ1Y3QgaWxfcHJpdjsKIAogLyogdUNvZGUgdmVyc2lvbiBjb250YWlucyA0IHZhbHVlczogTWFqb3IvTWlub3IvQVBJL1NlcmlhbCAqLwotI2RlZmluZSBJV0xfVUNPREVfTUFKT1IodmVyKQkoKCh2ZXIpICYgMHhGRjAwMDAwMCkgPj4gMjQpCi0jZGVmaW5lIElXTF9VQ09ERV9NSU5PUih2ZXIpCSgoKHZlcikgJiAweDAwRkYwMDAwKSA+PiAxNikKLSNkZWZpbmUgSVdMX1VDT0RFX0FQSSh2ZXIpCSgoKHZlcikgJiAweDAwMDBGRjAwKSA+PiA4KQotI2RlZmluZSBJV0xfVUNPREVfU0VSSUFMKHZlcikJKCh2ZXIpICYgMHgwMDAwMDBGRikKLQorI2RlZmluZSBJTF9VQ09ERV9NQUpPUih2ZXIpCSgoKHZlcikgJiAweEZGMDAwMDAwKSA+PiAyNCkKKyNkZWZpbmUgSUxfVUNPREVfTUlOT1IodmVyKQkoKCh2ZXIpICYgMHgwMEZGMDAwMCkgPj4gMTYpCisjZGVmaW5lIElMX1VDT0RFX0FQSSh2ZXIpCSgoKHZlcikgJiAweDAwMDBGRjAwKSA+PiA4KQorI2RlZmluZSBJTF9VQ09ERV9TRVJJQUwodmVyKQkoKHZlcikgJiAweDAwMDAwMEZGKQogCiAvKiBUeCByYXRlcyAqLwotI2RlZmluZSBJV0xfQ0NLX1JBVEVTCTQKLSNkZWZpbmUgSVdMX09GRE1fUkFURVMJOAotI2RlZmluZSBJV0xfTUFYX1JBVEVTCShJV0xfQ0NLX1JBVEVTICsgSVdMX09GRE1fUkFURVMpCisjZGVmaW5lIElMX0NDS19SQVRFUwk0CisjZGVmaW5lIElMX09GRE1fUkFURVMJOAorI2RlZmluZSBJTF9NQVhfUkFURVMJKElMX0NDS19SQVRFUyArIElMX09GRE1fUkFURVMpCiAKIGVudW0gewotCVJFUExZX0FMSVZFID0gMHgxLAotCVJFUExZX0VSUk9SID0gMHgyLAorCU5fQUxJVkUgPSAweDEsCisJTl9FUlJPUiA9IDB4MiwKIAogCS8qIFJYT04gYW5kIFFPUyBjb21tYW5kcyAqLwotCVJFUExZX1JYT04gPSAweDEwLAotCVJFUExZX1JYT05fQVNTT0MgPSAweDExLAotCVJFUExZX1FPU19QQVJBTSA9IDB4MTMsCi0JUkVQTFlfUlhPTl9USU1JTkcgPSAweDE0LAorCUNfUlhPTiA9IDB4MTAsCisJQ19SWE9OX0FTU09DID0gMHgxMSwKKwlDX1FPU19QQVJBTSA9IDB4MTMsCisJQ19SWE9OX1RJTUlORyA9IDB4MTQsCiAKIAkvKiBNdWx0aS1TdGF0aW9uIHN1cHBvcnQgKi8KLQlSRVBMWV9BRERfU1RBID0gMHgxOCwKLQlSRVBMWV9SRU1PVkVfU1RBID0gMHgxOSwKKwlDX0FERF9TVEEgPSAweDE4LAorCUNfUkVNX1NUQSA9IDB4MTksCiAKIAkvKiBTZWN1cml0eSAqLwotCVJFUExZX1dFUEtFWSA9IDB4MjAsCisJQ19XRVBLRVkgPSAweDIwLAogCiAJLyogUlgsIFRYLCBMRURzICovCi0JUkVQTFlfMzk0NV9SWCA9IDB4MWIsICAgICAgICAgICAvKiAzOTQ1IG9ubHkgKi8KLQlSRVBMWV9UWCA9IDB4MWMsCi0JUkVQTFlfUkFURV9TQ0FMRSA9IDB4NDcsCS8qIDM5NDUgb25seSAqLwotCVJFUExZX0xFRFNfQ01EID0gMHg0OCwKLQlSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EID0gMHg0ZSwgLyogZm9yIDQ5NjUgYW5kIHVwICovCisJTl8zOTQ1X1JYID0gMHgxYiwJLyogMzk0NSBvbmx5ICovCisJQ19UWCA9IDB4MWMsCisJQ19SQVRFX1NDQUxFID0gMHg0NywJLyogMzk0NSBvbmx5ICovCisJQ19MRURTID0gMHg0OCwKKwlDX1RYX0xJTktfUVVBTElUWV9DTUQgPSAweDRlLAkvKiBmb3IgNDk2NSAqLwogCiAJLyogODAyLjExaCByZWxhdGVkICovCi0JUkVQTFlfQ0hBTk5FTF9TV0lUQ0ggPSAweDcyLAotCUNIQU5ORUxfU1dJVENIX05PVElGSUNBVElPTiA9IDB4NzMsCi0JUkVQTFlfU1BFQ1RSVU1fTUVBU1VSRU1FTlRfQ01EID0gMHg3NCwKLQlTUEVDVFJVTV9NRUFTVVJFX05PVElGSUNBVElPTiA9IDB4NzUsCisJQ19DSEFOTkVMX1NXSVRDSCA9IDB4NzIsCisJTl9DSEFOTkVMX1NXSVRDSCA9IDB4NzMsCisJQ19TUEVDVFJVTV9NRUFTVVJFTUVOVCA9IDB4NzQsCisJTl9TUEVDVFJVTV9NRUFTVVJFTUVOVCA9IDB4NzUsCiAKIAkvKiBQb3dlciBNYW5hZ2VtZW50ICovCi0JUE9XRVJfVEFCTEVfQ01EID0gMHg3NywKLQlQTV9TTEVFUF9OT1RJRklDQVRJT04gPSAweDdBLAotCVBNX0RFQlVHX1NUQVRJU1RJQ19OT1RJRklDID0gMHg3QiwKKwlDX1BPV0VSX1RCTCA9IDB4NzcsCisJTl9QTV9TTEVFUCA9IDB4N0EsCisJTl9QTV9ERUJVR19TVEFUUyA9IDB4N0IsCiAKIAkvKiBTY2FuIGNvbW1hbmRzIGFuZCBub3RpZmljYXRpb25zICovCi0JUkVQTFlfU0NBTl9DTUQgPSAweDgwLAotCVJFUExZX1NDQU5fQUJPUlRfQ01EID0gMHg4MSwKLQlTQ0FOX1NUQVJUX05PVElGSUNBVElPTiA9IDB4ODIsCi0JU0NBTl9SRVNVTFRTX05PVElGSUNBVElPTiA9IDB4ODMsCi0JU0NBTl9DT01QTEVURV9OT1RJRklDQVRJT04gPSAweDg0LAorCUNfU0NBTiA9IDB4ODAsCisJQ19TQ0FOX0FCT1JUID0gMHg4MSwKKwlOX1NDQU5fU1RBUlQgPSAweDgyLAorCU5fU0NBTl9SRVNVTFRTID0gMHg4MywKKwlOX1NDQU5fQ09NUExFVEUgPSAweDg0LAogCiAJLyogSUJTUy9BUCBjb21tYW5kcyAqLwotCUJFQUNPTl9OT1RJRklDQVRJT04gPSAweDkwLAotCVJFUExZX1RYX0JFQUNPTiA9IDB4OTEsCisJTl9CRUFDT04gPSAweDkwLAorCUNfVFhfQkVBQ09OID0gMHg5MSwKIAogCS8qIE1pc2NlbGxhbmVvdXMgY29tbWFuZHMgKi8KLQlSRVBMWV9UWF9QV1JfVEFCTEVfQ01EID0gMHg5NywKKwlDX1RYX1BXUl9UQkwgPSAweDk3LAogCiAJLyogQmx1ZXRvb3RoIGRldmljZSBjb2V4aXN0ZW5jZSBjb25maWcgY29tbWFuZCAqLwotCVJFUExZX0JUX0NPTkZJRyA9IDB4OWIsCisJQ19CVF9DT05GSUcgPSAweDliLAogCiAJLyogU3RhdGlzdGljcyAqLwotCVJFUExZX1NUQVRJU1RJQ1NfQ01EID0gMHg5YywKLQlTVEFUSVNUSUNTX05PVElGSUNBVElPTiA9IDB4OWQsCisJQ19TVEFUUyA9IDB4OWMsCisJTl9TVEFUUyA9IDB4OWQsCiAKIAkvKiBSRi1LSUxMIGNvbW1hbmRzIGFuZCBub3RpZmljYXRpb25zICovCi0JQ0FSRF9TVEFURV9OT1RJRklDQVRJT04gPSAweGExLAorCU5fQ0FSRF9TVEFURSA9IDB4YTEsCiAKIAkvKiBNaXNzZWQgYmVhY29ucyBub3RpZmljYXRpb24gKi8KLQlNSVNTRURfQkVBQ09OU19OT1RJRklDQVRJT04gPSAweGEyLAorCU5fTUlTU0VEX0JFQUNPTlMgPSAweGEyLAogCi0JUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01EID0gMHhhNCwKLQlTRU5TSVRJVklUWV9DTUQgPSAweGE4LAotCVJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQgPSAweGIwLAotCVJFUExZX1JYX1BIWV9DTUQgPSAweGMwLAotCVJFUExZX1JYX01QRFVfQ01EID0gMHhjMSwKLQlSRVBMWV9SWCA9IDB4YzMsCi0JUkVQTFlfQ09NUFJFU1NFRF9CQSA9IDB4YzUsCisJQ19DVF9LSUxMX0NPTkZJRyA9IDB4YTQsCisJQ19TRU5TSVRJVklUWSA9IDB4YTgsCisJQ19QSFlfQ0FMSUJSQVRJT04gPSAweGIwLAorCU5fUlhfUEhZID0gMHhjMCwKKwlOX1JYX01QRFUgPSAweGMxLAorCU5fUlggPSAweGMzLAorCU5fQ09NUFJFU1NFRF9CQSA9IDB4YzUsCiAKLQlSRVBMWV9NQVggPSAweGZmCisJSUxfQ05fTUFYID0gMHhmZgogfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTYzLDI1ICsxNTksMjUgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIGl3bF9jbWRfaGVhZGVyIGZsYWdzIHZhbHVlICovCi0jZGVmaW5lIElXTF9DTURfRkFJTEVEX01TSyAweDQwCisvKiBpbF9jbWRfaGVhZGVyIGZsYWdzIHZhbHVlICovCisjZGVmaW5lIElMX0NNRF9GQUlMRURfTVNLIDB4NDAKIAogI2RlZmluZSBTRVFfVE9fUVVFVUUocykJKCgocykgPj4gOCkgJiAweDFmKQogI2RlZmluZSBRVUVVRV9UT19TRVEocSkJKCgocSkgJiAweDFmKSA8PCA4KQotI2RlZmluZSBTRVFfVE9fSU5ERVgocykJKChzKSAmIDB4ZmYpCi0jZGVmaW5lIElOREVYX1RPX1NFUShpKQkoKGkpICYgMHhmZikKKyNkZWZpbmUgU0VRX1RPX0lEWChzKQkoKHMpICYgMHhmZikKKyNkZWZpbmUgSURYX1RPX1NFUShpKQkoKGkpICYgMHhmZikKICNkZWZpbmUgU0VRX0hVR0VfRlJBTUUJY3B1X3RvX2xlMTYoMHg0MDAwKQogI2RlZmluZSBTRVFfUlhfRlJBTUUJY3B1X3RvX2xlMTYoMHg4MDAwKQogCiAvKioKLSAqIHN0cnVjdCBpd2xfY21kX2hlYWRlcgorICogc3RydWN0IGlsX2NtZF9oZWFkZXIKICAqCiAgKiBUaGlzIGhlYWRlciBmb3JtYXQgYXBwZWFycyBpbiB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggY29tbWFuZCBzZW50IGZyb20gdGhlCiAgKiBkcml2ZXIsIGFuZCBlYWNoIHJlc3BvbnNlL25vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tIHVDb2RlLgogICovCi1zdHJ1Y3QgaXdsX2NtZF9oZWFkZXIgewotCXU4IGNtZDsJCS8qIENvbW1hbmQgSUQ6ICBSRVBMWV9SWE9OLCBldGMuICovCi0JdTggZmxhZ3M7CS8qIDA6NSByZXNlcnZlZCwgNiBhYm9ydCwgNyBpbnRlcm5hbCAqLworc3RydWN0IGlsX2NtZF9oZWFkZXIgeworCXU4IGNtZDsJCQkvKiBDb21tYW5kIElEOiAgQ19SWE9OLCBldGMuICovCisJdTggZmxhZ3M7CQkvKiAwOjUgcmVzZXJ2ZWQsIDYgYWJvcnQsIDcgaW50ZXJuYWwgKi8KIAkvKgogCSAqIFRoZSBkcml2ZXIgc2V0cyB1cCB0aGUgc2VxdWVuY2UgbnVtYmVyIHRvIHZhbHVlcyBvZiBpdHMgY2hvb3NpbmcuCiAJICogdUNvZGUgZG9lcyBub3QgdXNlIHRoaXMgdmFsdWUsIGJ1dCBwYXNzZXMgaXQgYmFjayB0byB0aGUgZHJpdmVyCkBAIC0xOTIsMjkgKzE4OCwyOCBAQAogCSAqIFRoZXJlIGlzIG9uZSBleGNlcHRpb246ICB1Q29kZSBzZXRzIGJpdCAxNSB3aGVuIGl0IG9yaWdpbmF0ZXMKIAkgKiB0aGUgcmVzcG9uc2Uvbm90aWZpY2F0aW9uLCBpLmUuIHdoZW4gdGhlIHJlc3BvbnNlL25vdGlmaWNhdGlvbgogCSAqIGlzIG5vdCBhIGRpcmVjdCByZXNwb25zZSB0byBhIGNvbW1hbmQgc2VudCBieSB0aGUgZHJpdmVyLiAgRm9yCi0JICogZXhhbXBsZSwgdUNvZGUgaXNzdWVzIFJFUExZXzM5NDVfUlggd2hlbiBpdCBzZW5kcyBhIHJlY2VpdmVkIGZyYW1lCisJICogZXhhbXBsZSwgdUNvZGUgaXNzdWVzIE5fMzk0NV9SWCB3aGVuIGl0IHNlbmRzIGEgcmVjZWl2ZWQgZnJhbWUKIAkgKiB0byB0aGUgZHJpdmVyOyBpdCBpcyBub3QgYSBkaXJlY3QgcmVzcG9uc2UgdG8gYW55IGRyaXZlciBjb21tYW5kLgogCSAqCiAJICogVGhlIExpbnV4IGRyaXZlciB1c2VzIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgogCSAqCi0JICogIDA6NwkJdGZkIGluZGV4IC0gcG9zaXRpb24gd2l0aGluIFRYIHF1ZXVlCi0JICogIDg6MTIJVFggcXVldWUgaWQKLQkgKiAgMTMJCXJlc2VydmVkCi0JICogIDE0CQlodWdlIC0gZHJpdmVyIHNldHMgdGhpcyB0byBpbmRpY2F0ZSBjb21tYW5kIGlzIGluIHRoZQotCSAqICAJCSdodWdlJyBzdG9yYWdlIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgYnVmZmVycwotCSAqICAxNQkJdW5zb2xpY2l0ZWQgUlggb3IgdUNvZGUtb3JpZ2luYXRlZCBub3RpZmljYXRpb24KLQkqLworCSAqICAwOjcgICAgICAgICB0ZmQgaWR4IC0gcG9zaXRpb24gd2l0aGluIFRYIHF1ZXVlCisJICogIDg6MTIgICAgICAgIFRYIHF1ZXVlIGlkCisJICogIDEzICAgICAgICAgIHJlc2VydmVkCisJICogIDE0ICAgICAgICAgIGh1Z2UgLSBkcml2ZXIgc2V0cyB0aGlzIHRvIGluZGljYXRlIGNvbW1hbmQgaXMgaW4gdGhlCisJICogICAgICAgICAgICAgICdodWdlJyBzdG9yYWdlIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1hbmQgYnVmZmVycworCSAqICAxNSAgICAgICAgICB1bnNvbGljaXRlZCBSWCBvciB1Q29kZS1vcmlnaW5hdGVkIG5vdGlmaWNhdGlvbgorCSAqLwogCV9fbGUxNiBzZXF1ZW5jZTsKIAogCS8qIGNvbW1hbmQgb3IgcmVzcG9uc2Uvbm90aWZpY2F0aW9uIGRhdGEgZm9sbG93cyBpbW1lZGlhdGVseSAqLwogCXU4IGRhdGFbMF07CiB9IF9fcGFja2VkOwogCi0KIC8qKgotICogc3RydWN0IGl3bDM5NDVfdHhfcG93ZXIKKyAqIHN0cnVjdCBpbDM5NDVfdHhfcG93ZXIKICAqCi0gKiBVc2VkIGluIFJFUExZX1RYX1BXUl9UQUJMRV9DTUQsIFJFUExZX1NDQU5fQ01ELCBSRVBMWV9DSEFOTkVMX1NXSVRDSAorICogVXNlZCBpbiBDX1RYX1BXUl9UQkwsIENfU0NBTiwgQ19DSEFOTkVMX1NXSVRDSAogICoKICAqIEVhY2ggZW50cnkgY29udGFpbnMgdHdvIHZhbHVlczoKICAqIDEpICBEU1AgZ2FpbiAob3Igc29tZXRpbWVzIGNhbGxlZCBEU1AgYXR0ZW51YXRpb24pLiAgVGhpcyBpcyBhIGZpbmUtZ3JhaW5lZApAQCAtMjIzLDIxICsyMTgsMjEgQEAKICAqIDIpICBSYWRpbyBnYWluLiAgVGhpcyBzZXRzIHRoZSBhbmFsb2cgZ2FpbiBvZiB0aGUgcmFkaW8gVHggcGF0aC4KICAqICAgICBJdCBpcyBhIGNvYXJzZXIgc2V0dGluZywgYW5kIGJlaGF2ZXMgaW4gYSBsb2dhcml0aG1pYyAoZEIpIGZhc2hpb24uCiAgKgotICogRHJpdmVyIG9idGFpbnMgdmFsdWVzIGZyb20gc3RydWN0IGl3bDM5NDVfdHhfcG93ZXIgcG93ZXJfZ2Fpbl90YWJsZVtdW10uCisgKiBEcml2ZXIgb2J0YWlucyB2YWx1ZXMgZnJvbSBzdHJ1Y3QgaWwzOTQ1X3R4X3Bvd2VyIHBvd2VyX2dhaW5fdGFibGVbXVtdLgogICovCi1zdHJ1Y3QgaXdsMzk0NV90eF9wb3dlciB7CitzdHJ1Y3QgaWwzOTQ1X3R4X3Bvd2VyIHsKIAl1OCB0eF9nYWluOwkJLyogZ2FpbiBmb3IgYW5hbG9nIHJhZGlvICovCiAJdTggZHNwX2F0dGVuOwkJLyogZ2FpbiBmb3IgRFNQICovCiB9IF9fcGFja2VkOwogCiAvKioKLSAqIHN0cnVjdCBpd2wzOTQ1X3Bvd2VyX3Blcl9yYXRlCisgKiBzdHJ1Y3QgaWwzOTQ1X3Bvd2VyX3Blcl9yYXRlCiAgKgotICogVXNlZCBpbiBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELCBSRVBMWV9DSEFOTkVMX1NXSVRDSAorICogVXNlZCBpbiBDX1RYX1BXUl9UQkwsIENfQ0hBTk5FTF9TV0lUQ0gKICAqLwotc3RydWN0IGl3bDM5NDVfcG93ZXJfcGVyX3JhdGUgeworc3RydWN0IGlsMzk0NV9wb3dlcl9wZXJfcmF0ZSB7CiAJdTggcmF0ZTsJCS8qIHBsY3AgKi8KLQlzdHJ1Y3QgaXdsMzk0NV90eF9wb3dlciB0cGM7CisJc3RydWN0IGlsMzk0NV90eF9wb3dlciB0cGM7CiAJdTggcmVzZXJ2ZWQ7CiB9IF9fcGFja2VkOwogCkBAIC0yNDUsMTAgKzI0MCwxMCBAQAogICogaXdsNDk2NSByYXRlX25fZmxhZ3MgYml0IGZpZWxkcwogICoKICAqIHJhdGVfbl9mbGFncyBmb3JtYXQgaXMgdXNlZCBpbiBmb2xsb3dpbmcgaXdsNDk2NSBjb21tYW5kczoKLSAqICBSRVBMWV9SWCAocmVzcG9uc2Ugb25seSkKLSAqICBSRVBMWV9SWF9NUERVIChyZXNwb25zZSBvbmx5KQotICogIFJFUExZX1RYIChib3RoIGNvbW1hbmQgYW5kIHJlc3BvbnNlKQotICogIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQKKyAqICBOX1JYIChyZXNwb25zZSBvbmx5KQorICogIE5fUlhfTVBEVSAocmVzcG9uc2Ugb25seSkKKyAqICBDX1RYIChib3RoIGNvbW1hbmQgYW5kIHJlc3BvbnNlKQorICogIENfVFhfTElOS19RVUFMSVRZX0NNRAogICoKICAqIEhpZ2gtdGhyb3VnaHB1dCAoSFQpIHJhdGUgZm9ybWF0IGZvciBiaXRzIDc6MCAoYml0IDggbXVzdCBiZSAiMSIpOgogICogIDItMDogIDApICAgNiBNYnBzCkBAIC0zMjYsMTcgKzMyMSwxNyBAQAogI2RlZmluZSBSQVRFX01DU19BTlRfQUJDX01TSwkoUkFURV9NQ1NfQU5UX0FCX01TSyB8IFJBVEVfTUNTX0FOVF9DX01TSykKICNkZWZpbmUgUkFURV9BTlRfTlVNIDMKIAotI2RlZmluZSBQT1dFUl9UQUJMRV9OVU1fRU5UUklFUwkJCTMzCi0jZGVmaW5lIFBPV0VSX1RBQkxFX05VTV9IVF9PRkRNX0VOVFJJRVMJCTMyCi0jZGVmaW5lIFBPV0VSX1RBQkxFX0NDS19FTlRSWQkJCTMyCisjZGVmaW5lIFBPV0VSX1RCTF9OVU1fRU5UUklFUwkJCTMzCisjZGVmaW5lIFBPV0VSX1RCTF9OVU1fSFRfT0ZETV9FTlRSSUVTCQkzMgorI2RlZmluZSBQT1dFUl9UQkxfQ0NLX0VOVFJZCQkJMzIKIAotI2RlZmluZSBJV0xfUFdSX05VTV9IVF9PRkRNX0VOVFJJRVMJCTI0Ci0jZGVmaW5lIElXTF9QV1JfQ0NLX0VOVFJJRVMJCQkyCisjZGVmaW5lIElMX1BXUl9OVU1fSFRfT0ZETV9FTlRSSUVTCQkyNAorI2RlZmluZSBJTF9QV1JfQ0NLX0VOVFJJRVMJCQkyCiAKIC8qKgotICogdW5pb24gaXdsNDk2NV90eF9wb3dlcl9kdWFsX3N0cmVhbQorICogdW5pb24gaWw0OTY1X3R4X3Bvd2VyX2R1YWxfc3RyZWFtCiAgKgotICogSG9zdCBmb3JtYXQgdXNlZCBmb3IgUkVQTFlfVFhfUFdSX1RBQkxFX0NNRCwgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gKKyAqIEhvc3QgZm9ybWF0IHVzZWQgZm9yIENfVFhfUFdSX1RCTCwgQ19DSEFOTkVMX1NXSVRDSAogICogVXNlIF9fbGUzMiB2ZXJzaW9uIChzdHJ1Y3QgdHhfcG93ZXJfZHVhbF9zdHJlYW0pIHdoZW4gYnVpbGRpbmcgY29tbWFuZC4KICAqCiAgKiBEcml2ZXIgcHJvdmlkZXMgcmFkaW8gZ2FpbiBhbmQgRFNQIGF0dGVudWF0aW9uIHNldHRpbmdzIHRvIGRldmljZSBpbiBwYWlycywKQEAgLTM0Nyw5ICszNDIsOSBAQAogICogRm9yIE1JTU8gcmF0ZXMsIG9uZSB2YWx1ZSBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIG90aGVyLAogICogaW4gb3JkZXIgdG8gYmFsYW5jZSB0aGUgVHggb3V0cHV0IGJldHdlZW4gdGhlIHR3byB0cmFuc21pdHRlcnMuCiAgKgotICogU2VlIG1vcmUgZGV0YWlscyBpbiBkb2MgZm9yIFRYUE9XRVIgaW4gaXdsLTQ5NjUtaHcuaC4KKyAqIFNlZSBtb3JlIGRldGFpbHMgaW4gZG9jIGZvciBUWFBPV0VSIGluIDQ5NjUuaC4KICAqLwotdW5pb24gaXdsNDk2NV90eF9wb3dlcl9kdWFsX3N0cmVhbSB7Cit1bmlvbiBpbDQ5NjVfdHhfcG93ZXJfZHVhbF9zdHJlYW0gewogCXN0cnVjdCB7CiAJCXU4IHJhZGlvX3R4X2dhaW5bMl07CiAJCXU4IGRzcF9wcmVkaXNfYXR0ZW5bMl07CkBAIC0zNjAsMjEgKzM1NSwyMSBAQAogLyoqCiAgKiBzdHJ1Y3QgdHhfcG93ZXJfZHVhbF9zdHJlYW0KICAqCi0gKiBUYWJsZSBlbnRyaWVzIGluIFJFUExZX1RYX1BXUl9UQUJMRV9DTUQsIFJFUExZX0NIQU5ORUxfU1dJVENICisgKiBUYWJsZSBlbnRyaWVzIGluIENfVFhfUFdSX1RCTCwgQ19DSEFOTkVMX1NXSVRDSAogICoKLSAqIFNhbWUgZm9ybWF0IGFzIGl3bF90eF9wb3dlcl9kdWFsX3N0cmVhbSwgYnV0IF9fbGUzMgorICogU2FtZSBmb3JtYXQgYXMgaWxfdHhfcG93ZXJfZHVhbF9zdHJlYW0sIGJ1dCBfX2xlMzIKICAqLwogc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtIHsKIAlfX2xlMzIgZHc7CiB9IF9fcGFja2VkOwogCiAvKioKLSAqIHN0cnVjdCBpd2w0OTY1X3R4X3Bvd2VyX2RiCisgKiBzdHJ1Y3QgaWw0OTY1X3R4X3Bvd2VyX2RiCiAgKgotICogRW50aXJlIHRhYmxlIHdpdGhpbiBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELCBSRVBMWV9DSEFOTkVMX1NXSVRDSAorICogRW50aXJlIHRhYmxlIHdpdGhpbiBDX1RYX1BXUl9UQkwsIENfQ0hBTk5FTF9TV0lUQ0gKICAqLwotc3RydWN0IGl3bDQ5NjVfdHhfcG93ZXJfZGIgewotCXN0cnVjdCB0eF9wb3dlcl9kdWFsX3N0cmVhbSBwb3dlcl90YmxbUE9XRVJfVEFCTEVfTlVNX0VOVFJJRVNdOworc3RydWN0IGlsNDk2NV90eF9wb3dlcl9kYiB7CisJc3RydWN0IHR4X3Bvd2VyX2R1YWxfc3RyZWFtIHBvd2VyX3RibFtQT1dFUl9UQkxfTlVNX0VOVFJJRVNdOwogfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzg3LDcgKzM4Miw3IEBACiAjZGVmaW5lIElOSVRJQUxJWkVfU1VCVFlQRSAgICAoOSkKIAogLyoKLSAqICgiSW5pdGlhbGl6ZSIpIFJFUExZX0FMSVZFID0gMHgxIChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQorICogKCJJbml0aWFsaXplIikgTl9BTElWRSA9IDB4MSAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKICAqCiAgKiB1Q29kZSBpc3N1ZXMgdGhpcyAiaW5pdGlhbGl6ZSBhbGl2ZSIgbm90aWZpY2F0aW9uIG9uY2UgdGhlIGluaXRpYWxpemF0aW9uCiAgKiB1Q29kZSBpbWFnZSBoYXMgY29tcGxldGVkIGl0cyB3b3JrLCBhbmQgaXMgcmVhZHkgdG8gbG9hZCB0aGUgcnVudGltZSBpbWFnZS4KQEAgLTQxMCw3ICs0MDUsNyBAQAogICogMykgIFR4IGdhaW4gY29tcGVuc2F0aW9uIHRvIGJhbGFuY2UgNDk2NSdzIDIgVHggY2hhaW5zIGZvciBNSU1PIG9wZXJhdGlvbiwKICAqICAgICBmb3IgZWFjaCBvZiA1IGZyZXF1ZW5jeSByYW5nZXMuCiAgKi8KLXN0cnVjdCBpd2xfaW5pdF9hbGl2ZV9yZXNwIHsKK3N0cnVjdCBpbF9pbml0X2FsaXZlX3Jlc3AgewogCXU4IHVjb2RlX21pbm9yOwogCXU4IHVjb2RlX21ham9yOwogCV9fbGUxNiByZXNlcnZlZDE7CkBAIC00MzMsOSArNDI4LDggQEAKIAkJCQkgKiAyIFR4IGNoYWlucyAqLwogfSBfX3BhY2tlZDsKIAotCiAvKioKLSAqIFJFUExZX0FMSVZFID0gMHgxIChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQorICogTl9BTElWRSA9IDB4MSAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKICAqCiAgKiB1Q29kZSBpc3N1ZXMgdGhpcyAiYWxpdmUiIG5vdGlmaWNhdGlvbiBvbmNlIHRoZSBydW50aW1lIGltYWdlIGlzIHJlYWR5CiAgKiB0byByZWNlaXZlIGNvbW1hbmRzIGZyb20gdGhlIGRyaXZlci4gIFRoaXMgaXMgdGhlICpzZWNvbmQqICJhbGl2ZSIKQEAgLTQ1NCw3ICs0NDgsNyBAQAogICoJX19sZTMyIGxvZ19zaXplOyAgICAgbG9nIGNhcGFjaXR5IChpbiBudW1iZXIgb2YgZW50cmllcykKICAqCV9fbGUzMiB0eXBlOyAgICAgICAgICgxKSB0aW1lc3RhbXAgd2l0aCBlYWNoIGVudHJ5LCAoMCkgbm8gdGltZXN0YW1wCiAgKglfX2xlMzIgd3JhcHM7ICAgICAgICAjIHRpbWVzIHVDb2RlIGhhcyB3cmFwcGVkIHRvIHRvcCBvZiBjaXJjdWxhciBidWZmZXIKLSAqICAgICAgX19sZTMyIHdyaXRlX2luZGV4OyAgbmV4dCBjaXJjdWxhciBidWZmZXIgZW50cnkgdGhhdCB1Q29kZSB3b3VsZCBmaWxsCisgKiAgICAgIF9fbGUzMiB3cml0ZV9pZHg7ICBuZXh0IGNpcmN1bGFyIGJ1ZmZlciBlbnRyeSB0aGF0IHVDb2RlIHdvdWxkIGZpbGwKICAqCiAgKiAgICAgVGhlIGhlYWRlciBpcyBmb2xsb3dlZCBieSB0aGUgY2lyY3VsYXIgYnVmZmVyIG9mIGxvZyBlbnRyaWVzLiAgRW50cmllcwogICogICAgIHdpdGggdGltZXN0YW1wcyBoYXZlIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgpAQCAtNTExLDEzICs1MDUsMTMgQEAKICAqIFRoZSBMaW51eCBkcml2ZXIgY2FuIHByaW50IGJvdGggbG9ncyB0byB0aGUgc3lzdGVtIGxvZyB3aGVuIGEgdUNvZGUgZXJyb3IKICAqIG9jY3Vycy4KICAqLwotc3RydWN0IGl3bF9hbGl2ZV9yZXNwIHsKK3N0cnVjdCBpbF9hbGl2ZV9yZXNwIHsKIAl1OCB1Y29kZV9taW5vcjsKIAl1OCB1Y29kZV9tYWpvcjsKIAlfX2xlMTYgcmVzZXJ2ZWQxOwogCXU4IHN3X3Jldls4XTsKIAl1OCB2ZXJfdHlwZTsKLQl1OCB2ZXJfc3VidHlwZTsJCQkvKiBub3QgIjkiIGZvciBydW50aW1lIGFsaXZlICovCisJdTggdmVyX3N1YnR5cGU7CQkvKiBub3QgIjkiIGZvciBydW50aW1lIGFsaXZlICovCiAJX19sZTE2IHJlc2VydmVkMjsKIAlfX2xlMzIgbG9nX2V2ZW50X3RhYmxlX3B0cjsJLyogU1JBTSBhZGRyZXNzIGZvciBldmVudCBsb2cgKi8KIAlfX2xlMzIgZXJyb3JfZXZlbnRfdGFibGVfcHRyOwkvKiBTUkFNIGFkZHJlc3MgZm9yIGVycm9yIGxvZyAqLwpAQCAtNTI2LDkgKzUyMCw5IEBACiB9IF9fcGFja2VkOwogCiAvKgotICogUkVQTFlfRVJST1IgPSAweDIgKHJlc3BvbnNlIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKiBOX0VSUk9SID0gMHgyIChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQogICovCi1zdHJ1Y3QgaXdsX2Vycm9yX3Jlc3Ageworc3RydWN0IGlsX2Vycm9yX3Jlc3AgewogCV9fbGUzMiBlcnJvcl90eXBlOwogCXU4IGNtZF9pZDsKIAl1OCByZXNlcnZlZDE7CkBAIC01NTQsNyArNTQ4LDYgQEAKIAlSWE9OX0RFVl9UWVBFX1NOSUZGRVIgPSA2LAogfTsKIAotCiAjZGVmaW5lIFJYT05fUlhfQ0hBSU5fRFJJVkVSX0ZPUkNFX01TSwkJY3B1X3RvX2xlMTYoMHgxIDw8IDApCiAjZGVmaW5lIFJYT05fUlhfQ0hBSU5fRFJJVkVSX0ZPUkNFX1BPUwkJKDApCiAjZGVmaW5lIFJYT05fUlhfQ0hBSU5fVkFMSURfTVNLCQkJY3B1X3RvX2xlMTYoMHg3IDw8IDEpCkBAIC01OTMsNyArNTg2LDYgQEAKICogKGFjY29yZGluZyB0byBPTl9BSVIgZGVhc3NlcnRpb24pICovCiAjZGVmaW5lIFJYT05fRkxHX1RTRjJIT1NUX01TSyAgICAgICAgICAgY3B1X3RvX2xlMzIoMSA8PCAxNSkKIAotCiAvKiBIVCBmbGFncyAqLwogI2RlZmluZSBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX1BPUwkJKDIyKQogI2RlZmluZSBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSwljcHVfdG9fbGUzMigweDEgPDwgMjIpCkBAIC02NDAsNyArNjMyLDcgQEAKICNkZWZpbmUgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0sgICAgICBjcHVfdG9fbGUzMigxIDw8IDYpCiAKIC8qKgotICogUkVQTFlfUlhPTiA9IDB4MTAgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqIENfUlhPTiA9IDB4MTAgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKICAqCiAgKiBSWE9OIHR1bmVzIHRoZSByYWRpbyB0dW5lciB0byBhIHNlcnZpY2UgY2hhbm5lbCwgYW5kIHNldHMgdXAgYSBudW1iZXIKICAqIG9mIHBhcmFtZXRlcnMgdGhhdCBhcmUgdXNlZCBwcmltYXJpbHkgZm9yIFJ4LCBidXQgYWxzbyBmb3IgVHggb3BlcmF0aW9ucy4KQEAgLTY1MywxMSArNjQ1LDExIEBACiAgKiAgICAgICAgY2hhbm5lbC4KICAqCiAgKiBOT1RFOiAgQWxsIFJYT05zIHdpcGUgY2xlYW4gdGhlIGludGVybmFsIHR4cG93ZXIgdGFibGUuICBEcml2ZXIgbXVzdAotICogICAgICAgIGlzc3VlIGEgbmV3IFJFUExZX1RYX1BXUl9UQUJMRV9DTUQgYWZ0ZXIgZWFjaCBSRVBMWV9SWE9OICgweDEwKSwKKyAqICAgICAgICBpc3N1ZSBhIG5ldyBDX1RYX1BXUl9UQkwgYWZ0ZXIgZWFjaCBDX1JYT04gKDB4MTApLAogICogICAgICAgIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBSWE9OX0ZJTFRFUl9BU1NPQ19NU0sgaXMgc2V0LgogICovCiAKLXN0cnVjdCBpd2wzOTQ1X3J4b25fY21kIHsKK3N0cnVjdCBpbDM5NDVfcnhvbl9jbWQgewogCXU4IG5vZGVfYWRkcls2XTsKIAlfX2xlMTYgcmVzZXJ2ZWQxOwogCXU4IGJzc2lkX2FkZHJbNl07CkBAIC02NzYsNyArNjY4LDcgQEAKIAlfX2xlMTYgcmVzZXJ2ZWQ1OwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGl3bDQ5NjVfcnhvbl9jbWQgeworc3RydWN0IGlsNDk2NV9yeG9uX2NtZCB7CiAJdTggbm9kZV9hZGRyWzZdOwogCV9fbGUxNiByZXNlcnZlZDE7CiAJdTggYnNzaWRfYWRkcls2XTsKQEAgLTY5OSw3ICs2OTEsNyBAQAogLyogQ3JlYXRlIGEgY29tbW9uIHJ4b24gY21kIHdoaWNoIHdpbGwgYmUgdHlwZWNhc3QgaW50byB0aGUgMzk0NSBvciA0OTY1CiAgKiBzcGVjaWZpYyByeG9uIGNtZCwgZGVwZW5kaW5nIG9uIHdoZXJlIGl0IGlzIGNhbGxlZCBmcm9tLgogICovCi1zdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCB7CitzdHJ1Y3QgaWxfcnhvbl9jbWQgewogCXU4IG5vZGVfYWRkcls2XTsKIAlfX2xlMTYgcmVzZXJ2ZWQxOwogCXU4IGJzc2lkX2FkZHJbNl07CkBAIC03MjEsMTEgKzcxMywxMCBAQAogCXU4IHJlc2VydmVkNTsKIH0gX19wYWNrZWQ7CiAKLQogLyoKLSAqIFJFUExZX1JYT05fQVNTT0MgPSAweDExIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKiBDX1JYT05fQVNTT0MgPSAweDExIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCiAgKi8KLXN0cnVjdCBpd2wzOTQ1X3J4b25fYXNzb2NfY21kIHsKK3N0cnVjdCBpbDM5NDVfcnhvbl9hc3NvY19jbWQgewogCV9fbGUzMiBmbGFnczsKIAlfX2xlMzIgZmlsdGVyX2ZsYWdzOwogCXU4IG9mZG1fYmFzaWNfcmF0ZXM7CkBAIC03MzMsNyArNzI0LDcgQEAKIAlfX2xlMTYgcmVzZXJ2ZWQ7CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgaXdsNDk2NV9yeG9uX2Fzc29jX2NtZCB7CitzdHJ1Y3QgaWw0OTY1X3J4b25fYXNzb2NfY21kIHsKIAlfX2xlMzIgZmxhZ3M7CiAJX19sZTMyIGZpbHRlcl9mbGFnczsKIAl1OCBvZmRtX2Jhc2ljX3JhdGVzOwpAQCAtNzQ0LDE3ICs3MzUsMTcgQEAKIAlfX2xlMTYgcmVzZXJ2ZWQ7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIElXTF9DT05OX01BWF9MSVNURU5fSU5URVJWQUwJMTAKLSNkZWZpbmUgSVdMX01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUwJNCAvKiA0MDk2ICovCi0jZGVmaW5lIElXTDM5X01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUwJMSAvKiAxMDI0ICovCisjZGVmaW5lIElMX0NPTk5fTUFYX0xJU1RFTl9JTlRFUlZBTAkxMAorI2RlZmluZSBJTF9NQVhfVUNPREVfQkVBQ09OX0lOVEVSVkFMCTQJLyogNDA5NiAqLworI2RlZmluZSBJTDM5X01BWF9VQ09ERV9CRUFDT05fSU5URVJWQUwJMQkvKiAxMDI0ICovCiAKIC8qCi0gKiBSRVBMWV9SWE9OX1RJTUlORyA9IDB4MTQgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqIENfUlhPTl9USU1JTkcgPSAweDE0IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCiAgKi8KLXN0cnVjdCBpd2xfcnhvbl90aW1lX2NtZCB7CitzdHJ1Y3QgaWxfcnhvbl90aW1lX2NtZCB7CiAJX19sZTY0IHRpbWVzdGFtcDsKIAlfX2xlMTYgYmVhY29uX2ludGVydmFsOwotCV9fbGUxNiBhdGltX3dpbmRvdzsKKwlfX2xlMTYgYXRpbV93aW47CiAJX19sZTMyIGJlYWNvbl9pbml0X3ZhbDsKIAlfX2xlMTYgbGlzdGVuX2ludGVydmFsOwogCXU4IGR0aW1fcGVyaW9kOwpAQCAtNzYyLDMyICs3NTMsMzIgQEAKIH0gX19wYWNrZWQ7CiAKIC8qCi0gKiBSRVBMWV9DSEFOTkVMX1NXSVRDSCA9IDB4NzIgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqIENfQ0hBTk5FTF9TV0lUQ0ggPSAweDcyIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCiAgKi8KLXN0cnVjdCBpd2wzOTQ1X2NoYW5uZWxfc3dpdGNoX2NtZCB7CitzdHJ1Y3QgaWwzOTQ1X2NoYW5uZWxfc3dpdGNoX2NtZCB7CiAJdTggYmFuZDsKIAl1OCBleHBlY3RfYmVhY29uOwogCV9fbGUxNiBjaGFubmVsOwogCV9fbGUzMiByeG9uX2ZsYWdzOwogCV9fbGUzMiByeG9uX2ZpbHRlcl9mbGFnczsKIAlfX2xlMzIgc3dpdGNoX3RpbWU7Ci0Jc3RydWN0IGl3bDM5NDVfcG93ZXJfcGVyX3JhdGUgcG93ZXJbSVdMX01BWF9SQVRFU107CisJc3RydWN0IGlsMzk0NV9wb3dlcl9wZXJfcmF0ZSBwb3dlcltJTF9NQVhfUkFURVNdOwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGl3bDQ5NjVfY2hhbm5lbF9zd2l0Y2hfY21kIHsKK3N0cnVjdCBpbDQ5NjVfY2hhbm5lbF9zd2l0Y2hfY21kIHsKIAl1OCBiYW5kOwogCXU4IGV4cGVjdF9iZWFjb247CiAJX19sZTE2IGNoYW5uZWw7CiAJX19sZTMyIHJ4b25fZmxhZ3M7CiAJX19sZTMyIHJ4b25fZmlsdGVyX2ZsYWdzOwogCV9fbGUzMiBzd2l0Y2hfdGltZTsKLQlzdHJ1Y3QgaXdsNDk2NV90eF9wb3dlcl9kYiB0eF9wb3dlcjsKKwlzdHJ1Y3QgaWw0OTY1X3R4X3Bvd2VyX2RiIHR4X3Bvd2VyOwogfSBfX3BhY2tlZDsKIAogLyoKLSAqIENIQU5ORUxfU1dJVENIX05PVElGSUNBVElPTiA9IDB4NzMgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQorICogTl9DSEFOTkVMX1NXSVRDSCA9IDB4NzMgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQogICovCi1zdHJ1Y3QgaXdsX2NzYV9ub3RpZmljYXRpb24geworc3RydWN0IGlsX2NzYV9ub3RpZmljYXRpb24gewogCV9fbGUxNiBiYW5kOwogCV9fbGUxNiBjaGFubmVsOwogCV9fbGUzMiBzdGF0dXM7CQkvKiAwIC0gT0ssIDEgLSBmYWlsICovCkBAIC04MDAsMjIgKzc5MSwyMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKLSAqIHN0cnVjdCBpd2xfYWNfcW9zIC0tIFFPUyB0aW1pbmcgcGFyYW1zIGZvciBSRVBMWV9RT1NfUEFSQU0KLSAqIE9uZSBmb3IgZWFjaCBvZiA0IEVEQ0EgYWNjZXNzIGNhdGVnb3JpZXMgaW4gc3RydWN0IGl3bF9xb3NwYXJhbV9jbWQKKyAqIHN0cnVjdCBpbF9hY19xb3MgLS0gUU9TIHRpbWluZyBwYXJhbXMgZm9yIENfUU9TX1BBUkFNCisgKiBPbmUgZm9yIGVhY2ggb2YgNCBFRENBIGFjY2VzcyBjYXRlZ29yaWVzIGluIHN0cnVjdCBpbF9xb3NwYXJhbV9jbWQKICAqCi0gKiBAY3dfbWluOiBDb250ZW50aW9uIHdpbmRvdywgc3RhcnQgdmFsdWUgaW4gbnVtYmVycyBvZiBzbG90cy4KKyAqIEBjd19taW46IENvbnRlbnRpb24gd2luLCBzdGFydCB2YWx1ZSBpbiBudW1iZXJzIG9mIHNsb3RzLgogICogICAgICAgICAgU2hvdWxkIGJlIGEgcG93ZXItb2YtMiwgbWludXMgMS4gIERldmljZSdzIGRlZmF1bHQgaXMgMHgwZi4KLSAqIEBjd19tYXg6IENvbnRlbnRpb24gd2luZG93LCBtYXggdmFsdWUgaW4gbnVtYmVycyBvZiBzbG90cy4KKyAqIEBjd19tYXg6IENvbnRlbnRpb24gd2luLCBtYXggdmFsdWUgaW4gbnVtYmVycyBvZiBzbG90cy4KICAqICAgICAgICAgIFNob3VsZCBiZSBhIHBvd2VyLW9mLTIsIG1pbnVzIDEuICBEZXZpY2UncyBkZWZhdWx0IGlzIDB4M2YuCiAgKiBAYWlmc246ICBOdW1iZXIgb2Ygc2xvdHMgaW4gQXJiaXRyYXRpb24gSW50ZXJmcmFtZSBTcGFjZSAoYmVmb3JlCiAgKiAgICAgICAgICBwZXJmb3JtaW5nIHJhbmRvbSBiYWNrb2ZmIHRpbWluZyBwcmlvciB0byBUeCkuICBEZXZpY2UgZGVmYXVsdCAxLgogICogQGVkY2FfdHhvcDogIExlbmd0aCBvZiBUeCBvcHBvcnR1bml0eSwgaW4gdVNlY3MuICBEZXZpY2UgZGVmYXVsdCBpcyAwLgogICoKLSAqIERldmljZSB3aWxsIGF1dG9tYXRpY2FsbHkgaW5jcmVhc2UgY29udGVudGlvbiB3aW5kb3cgYnkgKDIqQ1cpICsgMSBmb3IgZWFjaAorICogRGV2aWNlIHdpbGwgYXV0b21hdGljYWxseSBpbmNyZWFzZSBjb250ZW50aW9uIHdpbiBieSAoMipDVykgKyAxIGZvciBlYWNoCiAgKiB0cmFuc21pc3Npb24gcmV0cnkuICBEZXZpY2UgdXNlcyBjd19tYXggYXMgYSBiaXQgbWFzaywgQU5EZWQgd2l0aCBuZXcgQ1cKICAqIHZhbHVlLCB0byBjYXAgdGhlIENXIHZhbHVlLgogICovCi1zdHJ1Y3QgaXdsX2FjX3FvcyB7CitzdHJ1Y3QgaWxfYWNfcW9zIHsKIAlfX2xlMTYgY3dfbWluOwogCV9fbGUxNiBjd19tYXg7CiAJdTggYWlmc247CkBAIC04MzIsMTQgKzgyMywxNCBAQAogI2RlZmluZSBBQ19OVU0gICAgICAgICAgICAgICAgNAogCiAvKgotICogUkVQTFlfUU9TX1BBUkFNID0gMHgxMyAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQorICogQ19RT1NfUEFSQU0gPSAweDEzIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCiAgKgogICogVGhpcyBjb21tYW5kIHNldHMgdXAgdGltaW5ncyBmb3IgZWFjaCBvZiB0aGUgNCBwcmlvcml0aXplZCBFRENBIFR4IEZJRk9zCiAgKiAwOiBCYWNrZ3JvdW5kLCAxOiBCZXN0IEVmZm9ydCwgMjogVmlkZW8sIDM6IFZvaWNlLgogICovCi1zdHJ1Y3QgaXdsX3Fvc3BhcmFtX2NtZCB7CitzdHJ1Y3QgaWxfcW9zcGFyYW1fY21kIHsKIAlfX2xlMzIgcW9zX2ZsYWdzOwotCXN0cnVjdCBpd2xfYWNfcW9zIGFjW0FDX05VTV07CisJc3RydWN0IGlsX2FjX3FvcyBhY1tBQ19OVU1dOwogfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtODUyLDE1ICs4NDMsMTUgQEAKICAqLwogCiAvKiBTcGVjaWFsLCBkZWRpY2F0ZWQgbG9jYXRpb25zIHdpdGhpbiBkZXZpY2UncyBzdGF0aW9uIHRhYmxlICovCi0jZGVmaW5lCUlXTF9BUF9JRAkJMAotI2RlZmluZQlJV0xfU1RBX0lECQkyCi0jZGVmaW5lCUlXTDM5NDVfQlJPQURDQVNUX0lECTI0Ci0jZGVmaW5lIElXTDM5NDVfU1RBVElPTl9DT1VOVAkyNQotI2RlZmluZSBJV0w0OTY1X0JST0FEQ0FTVF9JRAkzMQotI2RlZmluZQlJV0w0OTY1X1NUQVRJT05fQ09VTlQJMzIKKyNkZWZpbmUJSUxfQVBfSUQJCTAKKyNkZWZpbmUJSUxfU1RBX0lECQkyCisjZGVmaW5lCUlMMzk0NV9CUk9BRENBU1RfSUQJMjQKKyNkZWZpbmUgSUwzOTQ1X1NUQVRJT05fQ09VTlQJMjUKKyNkZWZpbmUgSUw0OTY1X0JST0FEQ0FTVF9JRAkzMQorI2RlZmluZQlJTDQ5NjVfU1RBVElPTl9DT1VOVAkzMgogCi0jZGVmaW5lCUlXTF9TVEFUSU9OX0NPVU5UCTMyIAkvKiBNQVgoMzk0NSw0OTY1KSovCi0jZGVmaW5lCUlXTF9JTlZBTElEX1NUQVRJT04JMjU1CisjZGVmaW5lCUlMX1NUQVRJT05fQ09VTlQJMzIJLyogTUFYKDM5NDUsNDk2NSkgKi8KKyNkZWZpbmUJSUxfSU5WQUxJRF9TVEFUSU9OCTI1NQogCiAjZGVmaW5lIFNUQV9GTEdfVFhfUkFURV9NU0sJCWNwdV90b19sZTMyKDEgPDwgMikKICNkZWZpbmUgU1RBX0ZMR19QV1JfU0FWRV9NU0sJCWNwdV90b19sZTMyKDEgPDwgOCkKQEAgLTkwMSwxMSArODkyLDExIEBACiAjZGVmaW5lIFNUQV9NT0RJRllfREVMQkFfVElEX01TSwkweDEwCiAjZGVmaW5lIFNUQV9NT0RJRllfU0xFRVBfVFhfQ09VTlRfTVNLCTB4MjAKIAotLyogUmVjZWl2ZXIgYWRkcmVzcyAoYWN0dWFsbHksIFJ4IHN0YXRpb24ncyBpbmRleCBpbnRvIHN0YXRpb24gdGFibGUpLAorLyogUmVjZWl2ZXIgYWRkcmVzcyAoYWN0dWFsbHksIFJ4IHN0YXRpb24ncyBpZHggaW50byBzdGF0aW9uIHRhYmxlKSwKICAqIGNvbWJpbmVkIHdpdGggVHJhZmZpYyBJRCAoUU9TIHByaW9yaXR5KSwgaW4gZm9ybWF0IHVzZWQgYnkgVHggU2NoZWR1bGVyICovCiAjZGVmaW5lIEJVSUxEX1JBeFRJRChzdGFfaWQsIHRpZCkJKCgoc3RhX2lkKSA8PCA0KSArICh0aWQpKQogCi1zdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvIHsKK3N0cnVjdCBpbDQ5NjVfa2V5aW5mbyB7CiAJX19sZTE2IGtleV9mbGFnczsKIAl1OCB0a2lwX3J4X3RzY19ieXRlMjsJLyogVFNDWzJdIGZvciBrZXkgbWl4IHBoMSBkZXRlY3Rpb24gKi8KIAl1OCByZXNlcnZlZDE7CkBAIC05MTgsMTIgKzkwOSwxMiBAQAogLyoqCiAgKiBzdHJ1Y3Qgc3RhX2lkX21vZGlmeQogICogQGFkZHJbRVRIX0FMRU5dOiBzdGF0aW9uJ3MgTUFDIGFkZHJlc3MKLSAqIEBzdGFfaWQ6IGluZGV4IG9mIHN0YXRpb24gaW4gdUNvZGUncyBzdGF0aW9uIHRhYmxlCisgKiBAc3RhX2lkOiBpZHggb2Ygc3RhdGlvbiBpbiB1Q29kZSdzIHN0YXRpb24gdGFibGUKICAqIEBtb2RpZnlfbWFzazogU1RBX01PRElGWV8qLCAxOiBtb2RpZnksIDA6IGRvbid0IGNoYW5nZQogICoKLSAqIERyaXZlciBzZWxlY3RzIHVudXNlZCB0YWJsZSBpbmRleCB3aGVuIGFkZGluZyBuZXcgc3RhdGlvbiwKLSAqIG9yIHRoZSBpbmRleCB0byBhIHByZS1leGlzdGluZyBzdGF0aW9uIGVudHJ5IHdoZW4gbW9kaWZ5aW5nIHRoYXQgc3RhdGlvbi4KLSAqIFNvbWUgaW5kZXhlcyBoYXZlIHNwZWNpYWwgcHVycG9zZXMgKElXTF9BUF9JRCwgaW5kZXggMCwgaXMgZm9yIEFQKS4KKyAqIERyaXZlciBzZWxlY3RzIHVudXNlZCB0YWJsZSBpZHggd2hlbiBhZGRpbmcgbmV3IHN0YXRpb24sCisgKiBvciB0aGUgaWR4IHRvIGEgcHJlLWV4aXN0aW5nIHN0YXRpb24gZW50cnkgd2hlbiBtb2RpZnlpbmcgdGhhdCBzdGF0aW9uLgorICogU29tZSBpZHhlcyBoYXZlIHNwZWNpYWwgcHVycG9zZXMgKElMX0FQX0lELCBpZHggMCwgaXMgZm9yIEFQKS4KICAqCiAgKiBtb2RpZnlfbWFzayBmbGFncyBzZWxlY3Qgd2hpY2ggcGFyYW1ldGVycyB0byBtb2RpZnkgdnMuIGxlYXZlIGFsb25lLgogICovCkBAIC05MzYsMTUgKzkyNywxNSBAQAogfSBfX3BhY2tlZDsKIAogLyoKLSAqIFJFUExZX0FERF9TVEEgPSAweDE4IChjb21tYW5kKQorICogQ19BRERfU1RBID0gMHgxOCAoY29tbWFuZCkKICAqCiAgKiBUaGUgZGV2aWNlIGNvbnRhaW5zIGFuIGludGVybmFsIHRhYmxlIG9mIHBlci1zdGF0aW9uIGluZm9ybWF0aW9uLAogICogd2l0aCBpbmZvIG9uIHNlY3VyaXR5IGtleXMsIGFnZ3JlZ2F0aW9uIHBhcmFtZXRlcnMsIGFuZCBUeCByYXRlcyBmb3IKICAqIGluaXRpYWwgVHggYXR0ZW1wdCBhbmQgYW55IHJldHJpZXMgKDQ5NjUgZGV2aWNlcyB1c2VzCi0gKiBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01ELAotICogMzk0NSB1c2VzIFJFUExZX1JBVEVfU0NBTEUgdG8gc2V0IHVwIHJhdGUgdGFibGVzKS4KKyAqIENfVFhfTElOS19RVUFMSVRZX0NNRCwKKyAqIDM5NDUgdXNlcyBDX1JBVEVfU0NBTEUgdG8gc2V0IHVwIHJhdGUgdGFibGVzKS4KICAqCi0gKiBSRVBMWV9BRERfU1RBIHNldHMgdXAgdGhlIHRhYmxlIGVudHJ5IGZvciBvbmUgc3RhdGlvbiwgZWl0aGVyIGNyZWF0aW5nCisgKiBDX0FERF9TVEEgc2V0cyB1cCB0aGUgdGFibGUgZW50cnkgZm9yIG9uZSBzdGF0aW9uLCBlaXRoZXIgY3JlYXRpbmcKICAqIGEgbmV3IGVudHJ5LCBvciBtb2RpZnlpbmcgYSBwcmUtZXhpc3Rpbmcgb25lLgogICoKICAqIE5PVEU6ICBSWE9OIGNvbW1hbmQgKHdpdGhvdXQgImFzc29jaWF0ZWQiIGJpdCBzZXQpIHdpcGVzIHRoZSBzdGF0aW9uIHRhYmxlCkBAIC05NTQsMjAgKzk0NSwyMCBAQAogICogICAgICAgIHRoZWlyIG93biB0eHBvd2VyL3JhdGUgc2V0dXAgZGF0YSkuCiAgKgogICogICAgICAgIFdoZW4gZ2V0dGluZyBzdGFydGVkIG9uIGEgbmV3IGNoYW5uZWwsIGRyaXZlciBtdXN0IHNldCB1cCB0aGUKLSAqICAgICAgICBJV0xfQlJPQURDQVNUX0lEIGVudHJ5IChsYXN0IGVudHJ5IGluIHRoZSB0YWJsZSkuICBGb3IgYSBjbGllbnQKKyAqICAgICAgICBJTF9CUk9BRENBU1RfSUQgZW50cnkgKGxhc3QgZW50cnkgaW4gdGhlIHRhYmxlKS4gIEZvciBhIGNsaWVudAogICogICAgICAgIHN0YXRpb24gaW4gYSBCU1MsIG9uY2UgYW4gQVAgaXMgc2VsZWN0ZWQsIGRyaXZlciBzZXRzIHVwIHRoZSBBUCBTVEEKLSAqICAgICAgICBpbiB0aGUgSVdMX0FQX0lEIGVudHJ5ICgxc3QgZW50cnkgaW4gdGhlIHRhYmxlKS4gIEJST0FEQ0FTVCBhbmQgQVAKKyAqICAgICAgICBpbiB0aGUgSUxfQVBfSUQgZW50cnkgKDFzdCBlbnRyeSBpbiB0aGUgdGFibGUpLiAgQlJPQURDQVNUIGFuZCBBUAogICogICAgICAgIGFyZSBhbGwgdGhhdCBhcmUgbmVlZGVkIGZvciBhIEJTUyBjbGllbnQgc3RhdGlvbi4gIElmIHRoZSBkZXZpY2UgaXMKICAqICAgICAgICB1c2VkIGFzIEFQLCBvciBpbiBhbiBJQlNTIG5ldHdvcmssIGRyaXZlciBtdXN0IHNldCB1cCBzdGF0aW9uIHRhYmxlCi0gKiAgICAgICAgZW50cmllcyBmb3IgYWxsIFNUQXMgaW4gbmV0d29yaywgc3RhcnRpbmcgd2l0aCBpbmRleCBJV0xfU1RBX0lELgorICogICAgICAgIGVudHJpZXMgZm9yIGFsbCBTVEFzIGluIG5ldHdvcmssIHN0YXJ0aW5nIHdpdGggaWR4IElMX1NUQV9JRC4KICAqLwogCi1zdHJ1Y3QgaXdsMzk0NV9hZGRzdGFfY21kIHsKK3N0cnVjdCBpbDM5NDVfYWRkc3RhX2NtZCB7CiAJdTggbW9kZTsJCS8qIDE6IG1vZGlmeSBleGlzdGluZywgMDogYWRkIG5ldyBzdGF0aW9uICovCiAJdTggcmVzZXJ2ZWRbM107CiAJc3RydWN0IHN0YV9pZF9tb2RpZnkgc3RhOwotCXN0cnVjdCBpd2w0OTY1X2tleWluZm8ga2V5OwotCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOwkJLyogU1RBX0ZMR18qICovCisJc3RydWN0IGlsNDk2NV9rZXlpbmZvIGtleTsKKwlfX2xlMzIgc3RhdGlvbl9mbGFnczsJLyogU1RBX0ZMR18qICovCiAJX19sZTMyIHN0YXRpb25fZmxhZ3NfbXNrOwkvKiBTVEFfRkxHXyogKi8KIAogCS8qIGJpdCBmaWVsZCB0byBkaXNhYmxlICgxKSBvciBlbmFibGUgKDApIFR4IGZvciBUcmFmZmljIElEIChUSUQpCkBAIC05OTAsMTIgKzk4MSwxMiBAQAogCV9fbGUxNiBhZGRfaW1tZWRpYXRlX2JhX3NzbjsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBpd2w0OTY1X2FkZHN0YV9jbWQgeworc3RydWN0IGlsNDk2NV9hZGRzdGFfY21kIHsKIAl1OCBtb2RlOwkJLyogMTogbW9kaWZ5IGV4aXN0aW5nLCAwOiBhZGQgbmV3IHN0YXRpb24gKi8KIAl1OCByZXNlcnZlZFszXTsKIAlzdHJ1Y3Qgc3RhX2lkX21vZGlmeSBzdGE7Ci0Jc3RydWN0IGl3bDQ5NjVfa2V5aW5mbyBrZXk7Ci0JX19sZTMyIHN0YXRpb25fZmxhZ3M7CQkvKiBTVEFfRkxHXyogKi8KKwlzdHJ1Y3QgaWw0OTY1X2tleWluZm8ga2V5OworCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOwkvKiBTVEFfRkxHXyogKi8KIAlfX2xlMzIgc3RhdGlvbl9mbGFnc19tc2s7CS8qIFNUQV9GTEdfKiAqLwogCiAJLyogYml0IGZpZWxkIHRvIGRpc2FibGUgKDEpIG9yIGVuYWJsZSAoMCkgVHggZm9yIFRyYWZmaWMgSUQgKFRJRCkKQEAgLTEwMDMsNyArOTk0LDcgQEAKIAkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFggdG8gdXNlIHRoaXMgZmllbGQuICovCiAJX19sZTE2IHRpZF9kaXNhYmxlX3R4OwogCi0JX19sZTE2CXJlc2VydmVkMTsKKwlfX2xlMTYgcmVzZXJ2ZWQxOwogCiAJLyogVElEIGZvciB3aGljaCB0byBhZGQgYmxvY2stYWNrIHN1cHBvcnQuCiAJICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0FEREJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCkBAIC0xMDI4LDEyICsxMDE5LDEyIEBACiB9IF9fcGFja2VkOwogCiAvKiBXcmFwcGVyIHN0cnVjdCBmb3IgMzk0NSBhbmQgNDk2NSBhZGRzdGFfY21kIHN0cnVjdHVyZXMgKi8KLXN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgeworc3RydWN0IGlsX2FkZHN0YV9jbWQgewogCXU4IG1vZGU7CQkvKiAxOiBtb2RpZnkgZXhpc3RpbmcsIDA6IGFkZCBuZXcgc3RhdGlvbiAqLwogCXU4IHJlc2VydmVkWzNdOwogCXN0cnVjdCBzdGFfaWRfbW9kaWZ5IHN0YTsKLQlzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvIGtleTsKLQlfX2xlMzIgc3RhdGlvbl9mbGFnczsJCS8qIFNUQV9GTEdfKiAqLworCXN0cnVjdCBpbDQ5NjVfa2V5aW5mbyBrZXk7CisJX19sZTMyIHN0YXRpb25fZmxhZ3M7CS8qIFNUQV9GTEdfKiAqLwogCV9fbGUzMiBzdGF0aW9uX2ZsYWdzX21zazsJLyogU1RBX0ZMR18qICovCiAKIAkvKiBiaXQgZmllbGQgdG8gZGlzYWJsZSAoMSkgb3IgZW5hYmxlICgwKSBUeCBmb3IgVHJhZmZpYyBJRCAoVElEKQpAQCAtMTA0MSw3ICsxMDMyLDcgQEAKIAkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFggdG8gdXNlIHRoaXMgZmllbGQuICovCiAJX19sZTE2IHRpZF9kaXNhYmxlX3R4OwogCi0JX19sZTE2CXJhdGVfbl9mbGFnczsJCS8qIDM5NDUgb25seSAqLworCV9fbGUxNiByYXRlX25fZmxhZ3M7CS8qIDM5NDUgb25seSAqLwogCiAJLyogVElEIGZvciB3aGljaCB0byBhZGQgYmxvY2stYWNrIHN1cHBvcnQuCiAJICogU2V0IG1vZGlmeV9tYXNrIGJpdCBTVEFfTU9ESUZZX0FEREJBX1RJRF9NU0sgdG8gdXNlIHRoaXMgZmllbGQuICovCkBAIC0xMDY1LDUxICsxMDU2LDUwIEBACiAJX19sZTE2IHJlc2VydmVkMjsKIH0gX19wYWNrZWQ7CiAKLQogI2RlZmluZSBBRERfU1RBX1NVQ0NFU1NfTVNLCQkweDEKLSNkZWZpbmUgQUREX1NUQV9OT19ST09NX0lOX1RBQkxFCTB4MgorI2RlZmluZSBBRERfU1RBX05PX1JPT01fSU5fVEJMCTB4MgogI2RlZmluZSBBRERfU1RBX05PX0JMT0NLX0FDS19SRVNPVVJDRQkweDQKICNkZWZpbmUgQUREX1NUQV9NT0RJRllfTk9OX0VYSVNUX1NUQQkweDgKIC8qCi0gKiBSRVBMWV9BRERfU1RBID0gMHgxOCAocmVzcG9uc2UpCisgKiBDX0FERF9TVEEgPSAweDE4IChyZXNwb25zZSkKICAqLwotc3RydWN0IGl3bF9hZGRfc3RhX3Jlc3AgewotCXU4IHN0YXR1czsJLyogQUREX1NUQV8qICovCitzdHJ1Y3QgaWxfYWRkX3N0YV9yZXNwIHsKKwl1OCBzdGF0dXM7CQkvKiBBRERfU1RBXyogKi8KIH0gX19wYWNrZWQ7CiAKICNkZWZpbmUgUkVNX1NUQV9TVUNDRVNTX01TSyAgICAgICAgICAgICAgMHgxCiAvKgotICogIFJFUExZX1JFTV9TVEEgPSAweDE5IChyZXNwb25zZSkKKyAqICBDX1JFTV9TVEEgPSAweDE5IChyZXNwb25zZSkKICAqLwotc3RydWN0IGl3bF9yZW1fc3RhX3Jlc3Ageworc3RydWN0IGlsX3JlbV9zdGFfcmVzcCB7CiAJdTggc3RhdHVzOwogfSBfX3BhY2tlZDsKIAogLyoKLSAqICBSRVBMWV9SRU1fU1RBID0gMHgxOSAoY29tbWFuZCkKKyAqICBDX1JFTV9TVEEgPSAweDE5IChjb21tYW5kKQogICovCi1zdHJ1Y3QgaXdsX3JlbV9zdGFfY21kIHsKLQl1OCBudW1fc3RhOyAgICAgLyogbnVtYmVyIG9mIHJlbW92ZWQgc3RhdGlvbnMgKi8KK3N0cnVjdCBpbF9yZW1fc3RhX2NtZCB7CisJdTggbnVtX3N0YTsJCS8qIG51bWJlciBvZiByZW1vdmVkIHN0YXRpb25zICovCiAJdTggcmVzZXJ2ZWRbM107Ci0JdTggYWRkcltFVEhfQUxFTl07IC8qIE1BQyBhZGRyIG9mIHRoZSBmaXJzdCBzdGF0aW9uICovCisJdTggYWRkcltFVEhfQUxFTl07CS8qIE1BQyBhZGRyIG9mIHRoZSBmaXJzdCBzdGF0aW9uICovCiAJdTggcmVzZXJ2ZWQyWzJdOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBJV0xfVFhfRklGT19CS19NU0sJCWNwdV90b19sZTMyKEJJVCgwKSkKLSNkZWZpbmUgSVdMX1RYX0ZJRk9fQkVfTVNLCQljcHVfdG9fbGUzMihCSVQoMSkpCi0jZGVmaW5lIElXTF9UWF9GSUZPX1ZJX01TSwkJY3B1X3RvX2xlMzIoQklUKDIpKQotI2RlZmluZSBJV0xfVFhfRklGT19WT19NU0sJCWNwdV90b19sZTMyKEJJVCgzKSkKLSNkZWZpbmUgSVdMX0FHR19UWF9RVUVVRV9NU0sJCWNwdV90b19sZTMyKDB4ZmZjMDApCisjZGVmaW5lIElMX1RYX0ZJRk9fQktfTVNLCQljcHVfdG9fbGUzMihCSVQoMCkpCisjZGVmaW5lIElMX1RYX0ZJRk9fQkVfTVNLCQljcHVfdG9fbGUzMihCSVQoMSkpCisjZGVmaW5lIElMX1RYX0ZJRk9fVklfTVNLCQljcHVfdG9fbGUzMihCSVQoMikpCisjZGVmaW5lIElMX1RYX0ZJRk9fVk9fTVNLCQljcHVfdG9fbGUzMihCSVQoMykpCisjZGVmaW5lIElMX0FHR19UWF9RVUVVRV9NU0sJCWNwdV90b19sZTMyKDB4ZmZjMDApCiAKLSNkZWZpbmUgSVdMX0RST1BfU0lOR0xFCQkwCi0jZGVmaW5lIElXTF9EUk9QX1NFTEVDVEVECTEKLSNkZWZpbmUgSVdMX0RST1BfQUxMCQkyCisjZGVmaW5lIElMX0RST1BfU0lOR0xFCQkwCisjZGVmaW5lIElMX0RST1BfU0VMRUNURUQJMQorI2RlZmluZSBJTF9EUk9QX0FMTAkJMgogCiAvKgogICogUkVQTFlfV0VQX0tFWSA9IDB4MjAKICAqLwotc3RydWN0IGl3bF93ZXBfa2V5IHsKLQl1OCBrZXlfaW5kZXg7CitzdHJ1Y3QgaWxfd2VwX2tleSB7CisJdTgga2V5X2lkeDsKIAl1OCBrZXlfb2Zmc2V0OwogCXU4IHJlc2VydmVkMVsyXTsKIAl1OCBrZXlfc2l6ZTsKQEAgLTExMTcsMTIgKzExMDcsMTIgQEAKIAl1OCBrZXlbMTZdOwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGl3bF93ZXBfY21kIHsKK3N0cnVjdCBpbF93ZXBfY21kIHsKIAl1OCBudW1fa2V5czsKIAl1OCBnbG9iYWxfa2V5X3R5cGU7CiAJdTggZmxhZ3M7CiAJdTggcmVzZXJ2ZWQ7Ci0Jc3RydWN0IGl3bF93ZXBfa2V5IGtleVswXTsKKwlzdHJ1Y3QgaWxfd2VwX2tleSBrZXlbMF07CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIFdFUF9LRVlfV0VQX1RZUEUgMQpAQCAtMTE2OCw4ICsxMTU4LDcgQEAKICNkZWZpbmUgUlhfTVBEVV9SRVNfU1RBVFVTX1RUQUtfT0sJKDEgPDwgNykKICNkZWZpbmUgUlhfTVBEVV9SRVNfU1RBVFVTX0RFQ19ET05FX01TSwkoMHg4MDApCiAKLQotc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfc3RhdHMgeworc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9zdGF0cyB7CiAJdTggcGh5X2NvdW50OwogCXU4IGlkOwogCXU4IHJzc2k7CkBAIC0xMTc5LDcgKzExNjgsNyBAQAogCXU4IHBheWxvYWRbMF07CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9oZHIgeworc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9oZHIgewogCV9fbGUxNiBjaGFubmVsOwogCV9fbGUxNiBwaHlfZmxhZ3M7CiAJdTggcmVzZXJ2ZWQxOwpAQCAtMTE4OCw3MyArMTE3Nyw3MSBAQAogCXU4IHBheWxvYWRbMF07CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9lbmQgeworc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9lbmQgewogCV9fbGUzMiBzdGF0dXM7CiAJX19sZTY0IHRpbWVzdGFtcDsKIAlfX2xlMzIgYmVhY29uX3RpbWVzdGFtcDsKIH0gX19wYWNrZWQ7CiAKIC8qCi0gKiBSRVBMWV8zOTQ1X1JYID0gMHgxYiAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKKyAqIE5fMzk0NV9SWCA9IDB4MWIgKHJlc3BvbnNlIG9ubHksIG5vdCBhIGNvbW1hbmQpCiAgKgogICogTk9URTogIERPIE5PVCBkZXJlZmVyZW5jZSBmcm9tIGNhc3RzIHRvIHRoaXMgc3RydWN0dXJlCiAgKiBJdCBpcyBwcm92aWRlZCBvbmx5IGZvciBjYWxjdWxhdGluZyBtaW5pbXVtIGRhdGEgc2V0IHNpemUuCiAgKiBUaGUgYWN0dWFsIG9mZnNldHMgb2YgdGhlIGhkciBhbmQgZW5kIGFyZSBkeW5hbWljIGJhc2VkIG9uCiAgKiBzdGF0cy5waHlfY291bnQKICAqLwotc3RydWN0IGl3bDM5NDVfcnhfZnJhbWUgewotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX3N0YXRzIHN0YXRzOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2hkciBoZHI7Ci0Jc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfZW5kIGVuZDsKK3N0cnVjdCBpbDM5NDVfcnhfZnJhbWUgeworCXN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfc3RhdHMgc3RhdHM7CisJc3RydWN0IGlsMzk0NV9yeF9mcmFtZV9oZHIgaGRyOworCXN0cnVjdCBpbDM5NDVfcnhfZnJhbWVfZW5kIGVuZDsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgSVdMMzlfUlhfRlJBTUVfU0laRQkoNCArIHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZSkpCisjZGVmaW5lIElMMzlfUlhfRlJBTUVfU0laRQkoNCArIHNpemVvZihzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lKSkKIAogLyogRml4ZWQgKG5vbi1jb25maWd1cmFibGUpIHJ4IGRhdGEgZnJvbSBwaHkgKi8KIAotI2RlZmluZSBJV0w0OV9SWF9SRVNfUEhZX0NOVCAxNAotI2RlZmluZSBJV0w0OV9SWF9QSFlfRkxBR1NfQU5URU5OQUVfT0ZGU0VUCSg0KQotI2RlZmluZSBJV0w0OV9SWF9QSFlfRkxBR1NfQU5URU5OQUVfTUFTSwkoMHg3MCkKLSNkZWZpbmUgSVdMNDlfQUdDX0RCX01BU0sJCQkoMHgzZjgwKQkvKiBNQVNLKDcsMTMpICovCi0jZGVmaW5lIElXTDQ5X0FHQ19EQl9QT1MJCQkoNykKLXN0cnVjdCBpd2w0OTY1X3J4X25vbl9jZmdfcGh5IHsKKyNkZWZpbmUgSUw0OV9SWF9SRVNfUEhZX0NOVCAxNAorI2RlZmluZSBJTDQ5X1JYX1BIWV9GTEFHU19BTlRFTk5BRV9PRkZTRVQJKDQpCisjZGVmaW5lIElMNDlfUlhfUEhZX0ZMQUdTX0FOVEVOTkFFX01BU0sJKDB4NzApCisjZGVmaW5lIElMNDlfQUdDX0RCX01BU0sJCQkoMHgzZjgwKQkvKiBNQVNLKDcsMTMpICovCisjZGVmaW5lIElMNDlfQUdDX0RCX1BPUwkJCSg3KQorc3RydWN0IGlsNDk2NV9yeF9ub25fY2ZnX3BoeSB7CiAJX19sZTE2IGFudF9zZWxlY3Rpb247CS8qIGFudCBBIGJpdCA0LCBhbnQgQiBiaXQgNSwgYW50IEMgYml0IDYgKi8KIAlfX2xlMTYgYWdjX2luZm87CS8qIGFnYyBjb2RlIDA6NiwgYWdjIGRCIDc6MTMsIHJlc2VydmVkIDE0OjE1ICovCiAJdTggcnNzaV9pbmZvWzZdOwkvKiB3ZSB1c2UgZXZlbiBlbnRyaWVzLCAwLzIvNCBmb3IgQS9CL0MgcnNzaSAqLwogCXU4IHBhZFswXTsKIH0gX19wYWNrZWQ7CiAKLQogLyoKLSAqIFJFUExZX1JYID0gMHhjMyAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKKyAqIE5fUlggPSAweGMzIChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQogICogVXNlZCBvbmx5IGZvciBsZWdhY3kgKG5vbiAxMW4pIGZyYW1lcy4KICAqLwotc3RydWN0IGl3bF9yeF9waHlfcmVzIHsKLQl1OCBub25fY2ZnX3BoeV9jbnQ7ICAgICAvKiBub24gY29uZmlndXJhYmxlIERTUCBwaHkgZGF0YSBieXRlIGNvdW50ICovCitzdHJ1Y3QgaWxfcnhfcGh5X3JlcyB7CisJdTggbm9uX2NmZ19waHlfY250OwkvKiBub24gY29uZmlndXJhYmxlIERTUCBwaHkgZGF0YSBieXRlIGNvdW50ICovCiAJdTggY2ZnX3BoeV9jbnQ7CQkvKiBjb25maWd1cmFibGUgRFNQIHBoeSBkYXRhIGJ5dGUgY291bnQgKi8KIAl1OCBzdGF0X2lkOwkJLyogY29uZmlndXJhYmxlIERTUCBwaHkgZGF0YSBzZXQgSUQgKi8KIAl1OCByZXNlcnZlZDE7CiAJX19sZTY0IHRpbWVzdGFtcDsJLyogVFNGIGF0IG9uIGFpciByaXNlICovCi0JX19sZTMyIGJlYWNvbl90aW1lX3N0YW1wOyAvKiBiZWFjb24gYXQgb24tYWlyIHJpc2UgKi8KKwlfX2xlMzIgYmVhY29uX3RpbWVfc3RhbXA7CS8qIGJlYWNvbiBhdCBvbi1haXIgcmlzZSAqLwogCV9fbGUxNiBwaHlfZmxhZ3M7CS8qIGdlbmVyYWwgcGh5IGZsYWdzOiBiYW5kLCBtb2R1bGF0aW9uLCAuLi4gKi8KIAlfX2xlMTYgY2hhbm5lbDsJCS8qIGNoYW5uZWwgbnVtYmVyICovCi0JdTggbm9uX2NmZ19waHlfYnVmWzMyXTsgLyogZm9yIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zIG9mIG5vbl9jZmdfcGh5ICovCisJdTggbm9uX2NmZ19waHlfYnVmWzMyXTsJLyogZm9yIHZhcmlvdXMgaW1wbGVtZW50YXRpb25zIG9mIG5vbl9jZmdfcGh5ICovCiAJX19sZTMyIHJhdGVfbl9mbGFnczsJLyogUkFURV9NQ1NfKiAqLwogCV9fbGUxNiBieXRlX2NvdW50OwkvKiBmcmFtZSdzIGJ5dGUtY291bnQgKi8KIAlfX2xlMTYgZnJhbWVfdGltZTsJLyogZnJhbWUncyB0aW1lIG9uIHRoZSBhaXIgKi8KIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBpd2xfcnhfbXBkdV9yZXNfc3RhcnQgeworc3RydWN0IGlsX3J4X21wZHVfcmVzX3N0YXJ0IHsKIAlfX2xlMTYgYnl0ZV9jb3VudDsKIAlfX2xlMTYgcmVzZXJ2ZWQ7CiB9IF9fcGFja2VkOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICg1KQogICogVHggQ29tbWFuZHMgJiBSZXNwb25zZXM6CiAgKgotICogRHJpdmVyIG11c3QgcGxhY2UgZWFjaCBSRVBMWV9UWCBjb21tYW5kIGludG8gb25lIG9mIHRoZSBwcmlvcml0aXplZCBUeAorICogRHJpdmVyIG11c3QgcGxhY2UgZWFjaCBDX1RYIGNvbW1hbmQgaW50byBvbmUgb2YgdGhlIHByaW9yaXRpemVkIFR4CiAgKiBxdWV1ZXMgaW4gaG9zdCBEUkFNLCBzaGFyZWQgYmV0d2VlbiBkcml2ZXIgYW5kIGRldmljZSAoc2VlIGNvbW1lbnRzIGZvcgogICogU0NEIHJlZ2lzdGVycyBhbmQgVHgvUnggUXVldWVzKS4gIFdoZW4gdGhlIGRldmljZSdzIFR4IHNjaGVkdWxlciBhbmQgdUNvZGUKICAqIGFyZSBwcmVwYXJpbmcgdG8gdHJhbnNtaXQsIHRoZSBkZXZpY2UgcHVsbHMgdGhlIFR4IGNvbW1hbmQgb3ZlciB0aGUgUENJCkBAIC0xMjY0LDE4ICsxMjUxLDE4IEBACiAgKiB1Q29kZSBoYW5kbGVzIGFsbCB0aW1pbmcgYW5kIHByb3RvY29sIHJlbGF0ZWQgdG8gY29udHJvbCBmcmFtZXMKICAqIChSVFMvQ1RTL0FDSyksIGJhc2VkIG9uIGZsYWdzIGluIHRoZSBUeCBjb21tYW5kLiAgdUNvZGUgYW5kIFR4IHNjaGVkdWxlcgogICogaGFuZGxlIHJlY2VwdGlvbiBvZiBibG9jay1hY2tzOyB1Q29kZSB1cGRhdGVzIHRoZSBob3N0IGRyaXZlciB2aWEKLSAqIFJFUExZX0NPTVBSRVNTRURfQkEuCisgKiBOX0NPTVBSRVNTRURfQkEuCiAgKgogICogdUNvZGUgaGFuZGxlcyByZXRyeWluZyBUeCB3aGVuIGFuIEFDSyBpcyBleHBlY3RlZCBidXQgbm90IHJlY2VpdmVkLgogICogVGhpcyBpbmNsdWRlcyB0cnlpbmcgbG93ZXIgZGF0YSByYXRlcyB0aGFuIHRoZSBvbmUgcmVxdWVzdGVkIGluIHRoZSBUeAotICogY29tbWFuZCwgYXMgc2V0IHVwIGJ5IHRoZSBSRVBMWV9SQVRFX1NDQUxFIChmb3IgMzk0NSkgb3IKLSAqIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQgKDQ5NjUpLgorICogY29tbWFuZCwgYXMgc2V0IHVwIGJ5IHRoZSBDX1JBVEVfU0NBTEUgKGZvciAzOTQ1KSBvcgorICogQ19UWF9MSU5LX1FVQUxJVFlfQ01EICg0OTY1KS4KICAqCi0gKiBEcml2ZXIgc2V0cyB1cCB0cmFuc21pdCBwb3dlciBmb3IgdmFyaW91cyByYXRlcyB2aWEgUkVQTFlfVFhfUFdSX1RBQkxFX0NNRC4KKyAqIERyaXZlciBzZXRzIHVwIHRyYW5zbWl0IHBvd2VyIGZvciB2YXJpb3VzIHJhdGVzIHZpYSBDX1RYX1BXUl9UQkwuCiAgKiBUaGlzIGNvbW1hbmQgbXVzdCBiZSBleGVjdXRlZCBhZnRlciBldmVyeSBSWE9OIGNvbW1hbmQsIGJlZm9yZSBUeCBjYW4gb2NjdXIuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIFJFUExZX1RYIFR4IGZsYWdzIGZpZWxkICovCisvKiBDX1RYIFR4IGZsYWdzIGZpZWxkICovCiAKIC8qCiAgKiAxOiBVc2UgUmVxdWVzdC1Uby1TZW5kIHByb3RvY29sIGJlZm9yZSB0aGlzIGZyYW1lLgpAQCAtMTI5Niw4ICsxMjgzLDggQEAKICNkZWZpbmUgVFhfQ01EX0ZMR19BQ0tfTVNLIGNwdV90b19sZTMyKDEgPDwgMykKIAogLyogRm9yIDQ5NjUgZGV2aWNlczoKLSAqIDE6IFVzZSByYXRlIHNjYWxlIHRhYmxlIChzZWUgUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRCkuCi0gKiAgICBUeCBjb21tYW5kJ3MgaW5pdGlhbF9yYXRlX2luZGV4IGluZGljYXRlcyBmaXJzdCByYXRlIHRvIHRyeTsKKyAqIDE6IFVzZSByYXRlIHNjYWxlIHRhYmxlIChzZWUgQ19UWF9MSU5LX1FVQUxJVFlfQ01EKS4KKyAqICAgIFR4IGNvbW1hbmQncyBpbml0aWFsX3JhdGVfaWR4IGluZGljYXRlcyBmaXJzdCByYXRlIHRvIHRyeTsKICAqICAgIHVDb2RlIHdhbGtzIHRocm91Z2ggdGFibGUgZm9yIGFkZGl0aW9uYWwgVHggYXR0ZW1wdHMuCiAgKiAwOiBVc2UgVHggcmF0ZS9NQ1MgZnJvbSBUeCBjb21tYW5kJ3MgcmF0ZV9uX2ZsYWdzIGZpZWxkLgogICogICAgVGhpcyByYXRlIHdpbGwgYmUgdXNlZCBmb3IgYWxsIFR4IGF0dGVtcHRzOyBpdCB3aWxsIG5vdCBiZSBzY2FsZWQuICovCkBAIC0xMzIyLDcgKzEzMDksNyBAQAogLyogMTogdUNvZGUgb3ZlcnJpZGVzIHNlcXVlbmNlIGNvbnRyb2wgZmllbGQgaW4gTUFDIGhlYWRlci4KICAqIDA6IERyaXZlciBwcm92aWRlcyBzZXF1ZW5jZSBjb250cm9sIGZpZWxkIGluIE1BQyBoZWFkZXIuCiAgKiBTZXQgdGhpcyBmb3IgbWFuYWdlbWVudCBmcmFtZXMsIG5vbi1RT1MgZGF0YSBmcmFtZXMsIG5vbi11bmljYXN0IGZyYW1lcywKLSAqIGFuZCBhbHNvIGluIFR4IGNvbW1hbmQgZW1iZWRkZWQgaW4gUkVQTFlfU0NBTl9DTUQgZm9yIGFjdGl2ZSBzY2Fucy4gKi8KKyAqIGFuZCBhbHNvIGluIFR4IGNvbW1hbmQgZW1iZWRkZWQgaW4gQ19TQ0FOIGZvciBhY3RpdmUgc2NhbnMuICovCiAjZGVmaW5lIFRYX0NNRF9GTEdfU0VRX0NUTF9NU0sgY3B1X3RvX2xlMzIoMSA8PCAxMykKIAogLyogMTogVGhpcyBmcmFtZSBpcyBub24tbGFzdCBNUERVOyBtb3JlIGZyYWdtZW50cyBhcmUgY29taW5nLgpAQCAtMTM0OSw3ICsxMzM2LDYgQEAKIC8qIEhDQ0EtQVAgLSBkaXNhYmxlIGR1cmF0aW9uIG92ZXJ3cml0aW5nLiAqLwogI2RlZmluZSBUWF9DTURfRkxHX0RVUl9NU0sgY3B1X3RvX2xlMzIoMSA8PCAyNSkKIAotCiAvKgogICogVFggY29tbWFuZCBzZWN1cml0eSBjb250cm9sCiAgKi8KQEAgLTEzNjksMTAgKzEzNTUsMTAgQEAKICNkZWZpbmUgVEtJUF9JQ1ZfTEVOIDQKIAogLyoKLSAqIFJFUExZX1RYID0gMHgxYyAoY29tbWFuZCkKKyAqIENfVFggPSAweDFjIChjb21tYW5kKQogICovCiAKLXN0cnVjdCBpd2wzOTQ1X3R4X2NtZCB7CitzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCB7CiAJLyoKIAkgKiBNUERVIGJ5dGUgY291bnQ6CiAJICogTUFDIGhlYWRlciAoMjQvMjYvMzAvMzIgYnl0ZXMpICsgMiBieXRlcyBwYWQgaWYgMjYvMzAgaGVhZGVyIHNpemUsCkBAIC0xNDM0LDkgKzE0MjAsOSBAQAogfSBfX3BhY2tlZDsKIAogLyoKLSAqIFJFUExZX1RYID0gMHgxYyAocmVzcG9uc2UpCisgKiBDX1RYID0gMHgxYyAocmVzcG9uc2UpCiAgKi8KLXN0cnVjdCBpd2wzOTQ1X3R4X3Jlc3Ageworc3RydWN0IGlsMzk0NV90eF9yZXNwIHsKIAl1OCBmYWlsdXJlX3J0czsKIAl1OCBmYWlsdXJlX2ZyYW1lOwogCXU4IGJ0X2tpbGxfY291bnQ7CkBAIC0xNDQ1LDE5ICsxNDMxLDE4IEBACiAJX19sZTMyIHN0YXR1czsJCS8qIFRYIHN0YXR1cyAqLwogfSBfX3BhY2tlZDsKIAotCiAvKgogICogNDk2NSB1Q29kZSB1cGRhdGVzIHRoZXNlIFR4IGF0dGVtcHQgY291bnQgdmFsdWVzIGluIGhvc3QgRFJBTS4KICAqIFVzZWQgZm9yIG1hbmFnaW5nIFR4IHJldHJpZXMgd2hlbiBleHBlY3RpbmcgYmxvY2stYWNrcy4KICAqIERyaXZlciBzaG91bGQgc2V0IHRoZXNlIGZpZWxkcyB0byAwLgogICovCi1zdHJ1Y3QgaXdsX2RyYW1fc2NyYXRjaCB7CitzdHJ1Y3QgaWxfZHJhbV9zY3JhdGNoIHsKIAl1OCB0cnlfY250OwkJLyogVHggYXR0ZW1wdHMgKi8KIAl1OCBidF9raWxsX2NudDsJCS8qIFR4IGF0dGVtcHRzIGJsb2NrZWQgYnkgQmx1ZXRvb3RoIGRldmljZSAqLwogCV9fbGUxNiByZXNlcnZlZDsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBpd2xfdHhfY21kIHsKK3N0cnVjdCBpbF90eF9jbWQgewogCS8qCiAJICogTVBEVSBieXRlIGNvdW50OgogCSAqIE1BQyBoZWFkZXIgKDI0LzI2LzMwLzMyIGJ5dGVzKSArIDIgYnl0ZXMgcGFkIGlmIDI2LzMwIGhlYWRlciBzaXplLApAQCAtMTQ4MSw3ICsxNDY2LDcgQEAKIAogCS8qIHVDb2RlIG1heSBtb2RpZnkgdGhpcyBmaWVsZCBvZiB0aGUgVHggY29tbWFuZCAoaW4gaG9zdCBEUkFNISkuCiAJICogRHJpdmVyIG11c3QgYWxzbyBzZXQgZHJhbV9sc2JfcHRyIGFuZCBkcmFtX21zYl9wdHIgaW4gdGhpcyBjbWQuICovCi0Jc3RydWN0IGl3bF9kcmFtX3NjcmF0Y2ggc2NyYXRjaDsKKwlzdHJ1Y3QgaWxfZHJhbV9zY3JhdGNoIHNjcmF0Y2g7CiAKIAkvKiBSYXRlIGZvciAqYWxsKiBUeCBhdHRlbXB0cywgaWYgVFhfQ01EX0ZMR19TVEFfUkFURV9NU0sgaXMgY2xlYXJlZC4gKi8KIAlfX2xlMzIgcmF0ZV9uX2ZsYWdzOwkvKiBSQVRFX01DU18qICovCkBAIC0xNDkzLDEzICsxNDc4LDEzIEBACiAJdTggc2VjX2N0bDsJCS8qIFRYX0NNRF9TRUNfKiAqLwogCiAJLyoKLQkgKiBJbmRleCBpbnRvIHJhdGUgdGFibGUgKHNlZSBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EKSBmb3IgaW5pdGlhbAorCSAqIEluZGV4IGludG8gcmF0ZSB0YWJsZSAoc2VlIENfVFhfTElOS19RVUFMSVRZX0NNRCkgZm9yIGluaXRpYWwKIAkgKiBUeCBhdHRlbXB0LCBpZiBUWF9DTURfRkxHX1NUQV9SQVRFX01TSyBpcyBzZXQuICBOb3JtYWxseSAiMCIgZm9yCiAJICogZGF0YSBmcmFtZXMsIHRoaXMgZmllbGQgbWF5IGJlIHVzZWQgdG8gc2VsZWN0aXZlbHkgcmVkdWNlIGluaXRpYWwKIAkgKiByYXRlICh2aWEgbm9uLTAgdmFsdWUpIGZvciBzcGVjaWFsIGZyYW1lcyAoZS5nLiBtYW5hZ2VtZW50KSwgd2hpbGUKIAkgKiBzdGlsbCBzdXBwb3J0aW5nIHJhdGUgc2NhbGluZyBmb3IgYWxsIGZyYW1lcy4KIAkgKi8KLQl1OCBpbml0aWFsX3JhdGVfaW5kZXg7CisJdTggaW5pdGlhbF9yYXRlX2lkeDsKIAl1OCByZXNlcnZlZDsKIAl1OCBrZXlbMTZdOwogCV9fbGUxNiBuZXh0X2ZyYW1lX2ZsYWdzOwpAQCAtMTYyOCwxMiArMTYxMywxMiBAQAogfTsKIAogZW51bSB7Ci0JVFhfU1RBVFVTX01TSyA9IDB4MDAwMDAwZmYsCQkvKiBiaXRzIDA6NyAqLworCVRYX1NUQVRVU19NU0sgPSAweDAwMDAwMGZmLAkvKiBiaXRzIDA6NyAqLwogCVRYX1NUQVRVU19ERUxBWV9NU0sgPSAweDAwMDAwMDQwLAogCVRYX1NUQVRVU19BQk9SVF9NU0sgPSAweDAwMDAwMDgwLAogCVRYX1BBQ0tFVF9NT0RFX01TSyA9IDB4MDAwMGZmMDAsCS8qIGJpdHMgODoxNSAqLwogCVRYX0ZJRk9fTlVNQkVSX01TSyA9IDB4MDAwNzAwMDAsCS8qIGJpdHMgMTY6MTggKi8KLQlUWF9SRVNFUlZFRCA9IDB4MDA3ODAwMDAsCQkvKiBiaXRzIDE5OjIyICovCisJVFhfUkVTRVJWRUQgPSAweDAwNzgwMDAwLAkvKiBiaXRzIDE5OjIyICovCiAJVFhfUE9XRVJfUEFfREVURUNUX01TSyA9IDB4N2Y4MDAwMDAsCS8qIGJpdHMgMjM6MzAgKi8KIAlUWF9BQk9SVF9SRVFVSVJFRF9NU0sgPSAweDgwMDAwMDAwLAkvKiBiaXRzIDMxOjMxICovCiB9OwpAQCAtMTY3MSw3ICsxNjU2LDcgQEAKICNkZWZpbmUgQUdHX1RYX1NUQVRFX1NFUV9OVU1fTVNLIDB4ZmZmZjAwMDAKIAogLyoKLSAqIFJFUExZX1RYID0gMHgxYyAocmVzcG9uc2UpCisgKiBDX1RYID0gMHgxYyAocmVzcG9uc2UpCiAgKgogICogVGhpcyByZXNwb25zZSBtYXkgYmUgaW4gb25lIG9mIHR3byBzbGlnaHRseSBkaWZmZXJlbnQgZm9ybWF0cywgaW5kaWNhdGVkCiAgKiBieSB0aGUgZnJhbWVfY291bnQgZmllbGQ6CkBAIC0xNjk3LDcgKzE2ODIsNyBAQAogCV9fbGUxNiBzZXF1ZW5jZTsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBpd2w0OTY1X3R4X3Jlc3Ageworc3RydWN0IGlsNDk2NV90eF9yZXNwIHsKIAl1OCBmcmFtZV9jb3VudDsJCS8qIDEgbm8gYWdncmVnYXRpb24sID4xIGFnZ3JlZ2F0aW9uICovCiAJdTggYnRfa2lsbF9jb3VudDsJLyogIyBibG9ja2VkIGJ5IGJsdWV0b290aCAodW51c2VkIGZvciBhZ2cpICovCiAJdTggZmFpbHVyZV9ydHM7CQkvKiAjIGZhaWx1cmVzIGR1ZSB0byB1bnN1Y2Nlc3NmdWwgUlRTICovCkBAIC0xNzMwLDE2ICsxNzE1LDE2IEBACiAJICovCiAJdW5pb24gewogCQlfX2xlMzIgc3RhdHVzOwotCQlzdHJ1Y3QgYWdnX3R4X3N0YXR1cyBhZ2dfc3RhdHVzWzBdOyAvKiBmb3IgZWFjaCBhZ2cgZnJhbWUgKi8KKwkJc3RydWN0IGFnZ190eF9zdGF0dXMgYWdnX3N0YXR1c1swXTsJLyogZm9yIGVhY2ggYWdnIGZyYW1lICovCiAJfSB1OwogfSBfX3BhY2tlZDsKIAogLyoKLSAqIFJFUExZX0NPTVBSRVNTRURfQkEgPSAweGM1IChyZXNwb25zZSBvbmx5LCBub3QgYSBjb21tYW5kKQorICogTl9DT01QUkVTU0VEX0JBID0gMHhjNSAocmVzcG9uc2Ugb25seSwgbm90IGEgY29tbWFuZCkKICAqCiAgKiBSZXBvcnRzIEJsb2NrLUFja25vd2xlZGdlIGZyb20gcmVjaXBpZW50IHN0YXRpb24KICAqLwotc3RydWN0IGl3bF9jb21wcmVzc2VkX2JhX3Jlc3Ageworc3RydWN0IGlsX2NvbXByZXNzZWRfYmFfcmVzcCB7CiAJX19sZTMyIHN0YV9hZGRyX2xvMzI7CiAJX19sZTE2IHN0YV9hZGRyX2hpMTY7CiAJX19sZTE2IHJlc2VydmVkOwpAQCAtMTc1NCwzMCArMTczOSwyOSBAQAogfSBfX3BhY2tlZDsKIAogLyoKLSAqIFJFUExZX1RYX1BXUl9UQUJMRV9DTUQgPSAweDk3IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKiBDX1RYX1BXUl9UQkwgPSAweDk3IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCiAgKgotICogU2VlIGRldGFpbHMgdW5kZXIgIlRYUE9XRVIiIGluIGl3bC00OTY1LWh3LmguCisgKiBTZWUgZGV0YWlscyB1bmRlciAiVFhQT1dFUiIgaW4gNDk2NS5oLgogICovCiAKLXN0cnVjdCBpd2wzOTQ1X3R4cG93ZXJ0YWJsZV9jbWQgeworc3RydWN0IGlsMzk0NV90eHBvd2VydGFibGVfY21kIHsKIAl1OCBiYW5kOwkJLyogMDogNSBHSHosIDE6IDIuNCBHSHogKi8KIAl1OCByZXNlcnZlZDsKIAlfX2xlMTYgY2hhbm5lbDsKLQlzdHJ1Y3QgaXdsMzk0NV9wb3dlcl9wZXJfcmF0ZSBwb3dlcltJV0xfTUFYX1JBVEVTXTsKKwlzdHJ1Y3QgaWwzOTQ1X3Bvd2VyX3Blcl9yYXRlIHBvd2VyW0lMX01BWF9SQVRFU107CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgaXdsNDk2NV90eHBvd2VydGFibGVfY21kIHsKK3N0cnVjdCBpbDQ5NjVfdHhwb3dlcnRhYmxlX2NtZCB7CiAJdTggYmFuZDsJCS8qIDA6IDUgR0h6LCAxOiAyLjQgR0h6ICovCiAJdTggcmVzZXJ2ZWQ7CiAJX19sZTE2IGNoYW5uZWw7Ci0Jc3RydWN0IGl3bDQ5NjVfdHhfcG93ZXJfZGIgdHhfcG93ZXI7CisJc3RydWN0IGlsNDk2NV90eF9wb3dlcl9kYiB0eF9wb3dlcjsKIH0gX19wYWNrZWQ7CiAKLQogLyoqCi0gKiBzdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxpbmdfY21kIC0gUmF0ZSBTY2FsaW5nIENvbW1hbmQgJiBSZXNwb25zZQorICogc3RydWN0IGlsMzk0NV9yYXRlX3NjYWxpbmdfY21kIC0gUmF0ZSBTY2FsaW5nIENvbW1hbmQgJiBSZXNwb25zZQogICoKLSAqIFJFUExZX1JBVEVfU0NBTEUgPSAweDQ3IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKiBDX1JBVEVfU0NBTEUgPSAweDQ3IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCiAgKgogICogTk9URTogVGhlIHRhYmxlIG9mIHJhdGVzIHBhc3NlZCB0byB0aGUgdUNvZGUgdmlhIHRoZQogICogUkFURV9TQ0FMRSBjb21tYW5kIHNldHMgdXAgdGhlIGNvcnJlc3BvbmRpbmcgb3JkZXIgb2YKQEAgLTE3ODYsMjIgKzE3NzAsMjEgQEAKICAqCiAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IHNldCA5TUIgKFBMQ1AgMHgwZikgYXMgdGhlIGZpcnN0CiAgKiByYXRlIGluIHRoZSByYXRlIHRhYmxlLCB0aGUgYml0IG1hc2sgZm9yIHRoYXQgcmF0ZQotICogd2hlbiBwYXNzZWQgdGhyb3VnaCBvZmRtX2Jhc2ljX3JhdGVzIG9uIHRoZSBSRVBMWV9SWE9OCisgKiB3aGVuIHBhc3NlZCB0aHJvdWdoIG9mZG1fYmFzaWNfcmF0ZXMgb24gdGhlIENfUlhPTgogICogY29tbWFuZCB3b3VsZCBiZSBiaXQgMCAoMSA8PCAwKQogICovCi1zdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxpbmdfaW5mbyB7CitzdHJ1Y3QgaWwzOTQ1X3JhdGVfc2NhbGluZ19pbmZvIHsKIAlfX2xlMTYgcmF0ZV9uX2ZsYWdzOwogCXU4IHRyeV9jbnQ7Ci0JdTggbmV4dF9yYXRlX2luZGV4OworCXU4IG5leHRfcmF0ZV9pZHg7CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxpbmdfY21kIHsKK3N0cnVjdCBpbDM5NDVfcmF0ZV9zY2FsaW5nX2NtZCB7CiAJdTggdGFibGVfaWQ7CiAJdTggcmVzZXJ2ZWRbM107Ci0Jc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsaW5nX2luZm8gdGFibGVbSVdMX01BWF9SQVRFU107CisJc3RydWN0IGlsMzk0NV9yYXRlX3NjYWxpbmdfaW5mbyB0YWJsZVtJTF9NQVhfUkFURVNdOwogfSBfX3BhY2tlZDsKIAotCiAvKlJTX05FV19BUEk6IG9ubHkgVExDX1JUUyByZW1haW5zIGFuZCBtb3ZlZCB0byBiaXQgMCAqLwogI2RlZmluZSAgTElOS19RVUFMX0ZMQUdTX1NFVF9TVEFfVExDX1JUU19NU0sJKDEgPDwgMCkKIApAQCAtMTgxNiwyOCArMTc5OSwyNyBAQAogI2RlZmluZSAgTElOS19RVUFMX0FOVF9CX01TSyAoMSA8PCAxKQogI2RlZmluZSAgTElOS19RVUFMX0FOVF9NU0sgICAoTElOS19RVUFMX0FOVF9BX01TS3xMSU5LX1FVQUxfQU5UX0JfTVNLKQogCi0KIC8qKgotICogc3RydWN0IGl3bF9saW5rX3F1YWxfZ2VuZXJhbF9wYXJhbXMKKyAqIHN0cnVjdCBpbF9saW5rX3F1YWxfZ2VuZXJhbF9wYXJhbXMKICAqCi0gKiBVc2VkIGluIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQKKyAqIFVzZWQgaW4gQ19UWF9MSU5LX1FVQUxJVFlfQ01ECiAgKi8KLXN0cnVjdCBpd2xfbGlua19xdWFsX2dlbmVyYWxfcGFyYW1zIHsKK3N0cnVjdCBpbF9saW5rX3F1YWxfZ2VuZXJhbF9wYXJhbXMgewogCXU4IGZsYWdzOwogCi0JLyogTm8gZW50cmllcyBhdCBvciBhYm92ZSB0aGlzIChkcml2ZXIgY2hvc2VuKSBpbmRleCBjb250YWluIE1JTU8gKi8KKwkvKiBObyBlbnRyaWVzIGF0IG9yIGFib3ZlIHRoaXMgKGRyaXZlciBjaG9zZW4pIGlkeCBjb250YWluIE1JTU8gKi8KIAl1OCBtaW1vX2RlbGltaXRlcjsKIAogCS8qIEJlc3Qgc2luZ2xlIGFudGVubmEgdG8gdXNlIGZvciBzaW5nbGUgc3RyZWFtIChsZWdhY3ksIFNJU08pLiAqLwogCXU4IHNpbmdsZV9zdHJlYW1fYW50X21zazsJLyogTElOS19RVUFMX0FOVF8qICovCiAKIAkvKiBCZXN0IGFudGVubmFzIHRvIHVzZSBmb3IgTUlNTyAodW51c2VkIGZvciA0OTY1LCBhc3N1bWVzIGJvdGgpLiAqLwotCXU4IGR1YWxfc3RyZWFtX2FudF9tc2s7CQkvKiBMSU5LX1FVQUxfQU5UXyogKi8KKwl1OCBkdWFsX3N0cmVhbV9hbnRfbXNrOwkvKiBMSU5LX1FVQUxfQU5UXyogKi8KIAogCS8qCiAJICogSWYgZHJpdmVyIG5lZWRzIHRvIHVzZSBkaWZmZXJlbnQgaW5pdGlhbCByYXRlcyBmb3IgZGlmZmVyZW50CiAJICogRURDQSBRT1MgYWNjZXNzIGNhdGVnb3JpZXMgKGFzIGltcGxlbWVudGVkIGJ5IHR4IGZpZm9zIDAtMyksCi0JICogdGhpcyB0YWJsZSB3aWxsIHNldCB0aGF0IHVwLCBieSBpbmRpY2F0aW5nIHRoZSBpbmRleGVzIGluIHRoZQorCSAqIHRoaXMgdGFibGUgd2lsbCBzZXQgdGhhdCB1cCwgYnkgaW5kaWNhdGluZyB0aGUgaWR4ZXMgaW4gdGhlCiAJICogcnNfdGFibGVbTElOS19RVUFMX01BWF9SRVRSWV9OVU1dIHJhdGUgdGFibGUgYXQgd2hpY2ggdG8gc3RhcnQuCiAJICogT3RoZXJ3aXNlLCBkcml2ZXIgc2hvdWxkIHNldCBhbGwgZW50cmllcyB0byAwLgogCSAqCkBAIC0xODQ1LDEwICsxODI3LDEwIEBACiAJICogMCA9IEJhY2tncm91bmQsIDEgPSBCZXN0IEVmZm9ydCAobm9ybWFsKSwgMiA9IFZpZGVvLCAzID0gVm9pY2UKIAkgKiBUWCBGSUZPcyBhYm92ZSAzIHVzZSBzYW1lIHZhbHVlICh0eXBpY2FsbHkgMCkgYXMgVFggRklGTyAzLgogCSAqLwotCXU4IHN0YXJ0X3JhdGVfaW5kZXhbTElOS19RVUFMX0FDX05VTV07CisJdTggc3RhcnRfcmF0ZV9pZHhbTElOS19RVUFMX0FDX05VTV07CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9ERUYJKDQwMDApIC8qIDQgbWlsbGlzZWNvbmRzICovCisjZGVmaW5lIExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9ERUYJKDQwMDApCS8qIDQgbWlsbGlzZWNvbmRzICovCiAjZGVmaW5lIExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9NQVgJKDgwMDApCiAjZGVmaW5lIExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9NSU4JKDEwMCkKIApAQCAtMTg2MSwxMSArMTg0MywxMSBAQAogI2RlZmluZSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX01JTgkoMCkKIAogLyoqCi0gKiBzdHJ1Y3QgaXdsX2xpbmtfcXVhbF9hZ2dfcGFyYW1zCisgKiBzdHJ1Y3QgaWxfbGlua19xdWFsX2FnZ19wYXJhbXMKICAqCi0gKiBVc2VkIGluIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQKKyAqIFVzZWQgaW4gQ19UWF9MSU5LX1FVQUxJVFlfQ01ECiAgKi8KLXN0cnVjdCBpd2xfbGlua19xdWFsX2FnZ19wYXJhbXMgeworc3RydWN0IGlsX2xpbmtfcXVhbF9hZ2dfcGFyYW1zIHsKIAogCS8qCiAJICpNYXhpbXVtIG51bWJlciBvZiB1U2VjIGluIGFnZ3JlZ2F0aW9uLgpAQCAtMTg5Miw5ICsxODc0LDkgQEAKIH0gX19wYWNrZWQ7CiAKIC8qCi0gKiBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EID0gMHg0ZSAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQorICogQ19UWF9MSU5LX1FVQUxJVFlfQ01EID0gMHg0ZSAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQogICoKLSAqIEZvciA0OTY1IGRldmljZXMgb25seTsgMzk0NSB1c2VzIFJFUExZX1JBVEVfU0NBTEUuCisgKiBGb3IgNDk2NSBkZXZpY2VzIG9ubHk7IDM5NDUgdXNlcyBDX1JBVEVfU0NBTEUuCiAgKgogICogRWFjaCBzdGF0aW9uIGluIHRoZSA0OTY1IGRldmljZSdzIGludGVybmFsIHN0YXRpb24gdGFibGUgaGFzIGl0cyBvd24gdGFibGUKICAqIG9mIDE2CkBAIC0xOTAzLDEzICsxODg1LDEzIEBACiAgKiBvbmUgc3RhdGlvbi4KICAqCiAgKiBOT1RFOiAgU3RhdGlvbiBtdXN0IGFscmVhZHkgYmUgaW4gNDk2NSBkZXZpY2UncyBzdGF0aW9uIHRhYmxlLgotICoJICBVc2UgUkVQTFlfQUREX1NUQS4KKyAqCSAgVXNlIENfQUREX1NUQS4KICAqCiAgKiBUaGUgcmF0ZSBzY2FsaW5nIHByb2NlZHVyZXMgZGVzY3JpYmVkIGJlbG93IHdvcmsgd2VsbC4gIE9mIGNvdXJzZSwgb3RoZXIKICAqIHByb2NlZHVyZXMgYXJlIHBvc3NpYmxlLCBhbmQgbWF5IHdvcmsgYmV0dGVyIGZvciBwYXJ0aWN1bGFyIGVudmlyb25tZW50cy4KICAqCiAgKgotICogRklMTElORyBUSEUgUkFURSBUQUJMRQorICogRklMTElORyBUSEUgUkFURSBUQkwKICAqCiAgKiBHaXZlbiBhIHBhcnRpY3VsYXIgaW5pdGlhbCByYXRlIGFuZCBtb2RlLCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSByYXRlCiAgKiBzY2FsaW5nIGFsZ29yaXRobSBkZXNjcmliZWQgYmVsb3csIHRoZSBMaW51eCBkcml2ZXIgdXNlcyB0aGUgZm9sbG93aW5nCkBAIC0xOTQ4LDEzICsxOTMwLDEzIEBACiAgKiBzcGVjdWxhdGl2ZSBtb2RlIGFzIHRoZSBuZXcgY3VycmVudCBhY3RpdmUgbW9kZS4KICAqCiAgKiBFYWNoIGhpc3Rvcnkgc2V0IGNvbnRhaW5zLCBzZXBhcmF0ZWx5IGZvciBlYWNoIHBvc3NpYmxlIHJhdGUsIGRhdGEgZm9yIGEKLSAqIHNsaWRpbmcgd2luZG93IG9mIHRoZSA2MiBtb3N0IHJlY2VudCB0eCBhdHRlbXB0cyBhdCB0aGF0IHJhdGUuICBUaGUgZGF0YQorICogc2xpZGluZyB3aW4gb2YgdGhlIDYyIG1vc3QgcmVjZW50IHR4IGF0dGVtcHRzIGF0IHRoYXQgcmF0ZS4gIFRoZSBkYXRhCiAgKiBpbmNsdWRlcyBhIHNoaWZ0aW5nIGJpdG1hcCBvZiBzdWNjZXNzKDEpL2ZhaWx1cmUoMCksIGFuZCBzdW1zIG9mIHN1Y2Nlc3NmdWwKICAqIGFuZCBhdHRlbXB0ZWQgZnJhbWVzLCBmcm9tIHdoaWNoIHRoZSBkcml2ZXIgY2FuIGFkZGl0aW9uYWxseSBjYWxjdWxhdGUgYQogICogc3VjY2VzcyByYXRpbyAoc3VjY2VzcyAvIGF0dGVtcHRlZCkgYW5kIG51bWJlciBvZiBmYWlsdXJlcwotICogKGF0dGVtcHRlZCAtIHN1Y2Nlc3MpLCBhbmQgY29udHJvbCB0aGUgc2l6ZSBvZiB0aGUgd2luZG93IChhdHRlbXB0ZWQpLgorICogKGF0dGVtcHRlZCAtIHN1Y2Nlc3MpLCBhbmQgY29udHJvbCB0aGUgc2l6ZSBvZiB0aGUgd2luIChhdHRlbXB0ZWQpLgogICogVGhlIGRyaXZlciB1c2VzIHRoZSBiaXQgbWFwIHRvIHJlbW92ZSBzdWNjZXNzZXMgZnJvbSB0aGUgc3VjY2VzcyBzdW0sIGFzCi0gKiB0aGUgb2xkZXN0IHR4IGF0dGVtcHRzIGZhbGwgb3V0IG9mIHRoZSB3aW5kb3cuCisgKiB0aGUgb2xkZXN0IHR4IGF0dGVtcHRzIGZhbGwgb3V0IG9mIHRoZSB3aW4uCiAgKgogICogV2hlbiB0aGUgNDk2NSBkZXZpY2UgbWFrZXMgbXVsdGlwbGUgdHggYXR0ZW1wdHMgZm9yIGEgZ2l2ZW4gZnJhbWUsIGVhY2gKICAqIGF0dGVtcHQgbWlnaHQgYmUgYXQgYSBkaWZmZXJlbnQgcmF0ZSwgYW5kIGhhdmUgZGlmZmVyZW50IG1vZHVsYXRpb24KQEAgLTE5NjYsNyArMTk0OCw3IEBACiAgKgogICogV2hlbiB1c2luZyBibG9jay1hY2sgKGFnZ3JlZ2F0aW9uKSwgYWxsIGZyYW1lcyBhcmUgdHJhbnNtaXR0ZWQgYXQgdGhlIHNhbWUKICAqIHJhdGUsIHNpbmNlIHRoZXJlIGlzIG5vIHBlci1hdHRlbXB0IGFja25vd2xlZGdtZW50IGZyb20gdGhlIGRlc3RpbmF0aW9uCi0gKiBzdGF0aW9uLiAgVGhlIFR4IHJlc3BvbnNlIHN0cnVjdCBpd2xfdHhfcmVzcCBpbmRpY2F0ZXMgdGhlIFR4IHJhdGUgaW4KKyAqIHN0YXRpb24uICBUaGUgVHggcmVzcG9uc2Ugc3RydWN0IGlsX3R4X3Jlc3AgaW5kaWNhdGVzIHRoZSBUeCByYXRlIGluCiAgKiByYXRlX25fZmxhZ3MgZmllbGQuICBBZnRlciByZWNlaXZpbmcgYSBibG9jay1hY2ssIHRoZSBkcml2ZXIgY2FuIHVwZGF0ZQogICogaGlzdG9yeSBmb3IgdGhlIGVudGlyZSBibG9jayBhbGwgYXQgb25jZS4KICAqCkBAIC0yMDE2LDggKzE5OTgsOCBAQAogICogICAgICAgICBnb29kIHBlcmZvcm1hbmNlOyBoaWdoZXIgcmF0ZSBpcyBzdXJlIHRvIGhhdmUgcG9vcmVyIHN1Y2Nlc3MuCiAgKgogICogNikgIFJlLWV2YWx1YXRlIHRoZSByYXRlIGFmdGVyIGVhY2ggdHggZnJhbWUuICBJZiB3b3JraW5nIHdpdGggYmxvY2stCi0gKiAgICAgYWNrbm93bGVkZ2UsIGhpc3RvcnkgYW5kIHN0YXRpc3RpY3MgbWF5IGJlIGNhbGN1bGF0ZWQgZm9yIHRoZSBlbnRpcmUKLSAqICAgICBibG9jayAoaW5jbHVkaW5nIHByaW9yIGhpc3RvcnkgdGhhdCBmaXRzIHdpdGhpbiB0aGUgaGlzdG9yeSB3aW5kb3dzKSwKKyAqICAgICBhY2tub3dsZWRnZSwgaGlzdG9yeSBhbmQgc3RhdHMgbWF5IGJlIGNhbGN1bGF0ZWQgZm9yIHRoZSBlbnRpcmUKKyAqICAgICBibG9jayAoaW5jbHVkaW5nIHByaW9yIGhpc3RvcnkgdGhhdCBmaXRzIHdpdGhpbiB0aGUgaGlzdG9yeSB3aW5zKSwKICAqICAgICBiZWZvcmUgcmUtZXZhbHVhdGlvbi4KICAqCiAgKiBGSU5ESU5HIEJFU1QgU1RBUlRJTkcgTU9EVUxBVElPTiBNT0RFOgpAQCAtMjA3OSwyMiArMjA2MSwyMiBAQAogICogbGVnYWN5KSwgYW5kIHRoZW4gcmVwZWF0IHRoZSBzZWFyY2ggcHJvY2Vzcy4KICAqCiAgKi8KLXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCB7CitzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCB7CiAKIAkvKiBJbmRleCBvZiBkZXN0aW5hdGlvbi9yZWNpcGllbnQgc3RhdGlvbiBpbiB1Q29kZSdzIHN0YXRpb24gdGFibGUgKi8KIAl1OCBzdGFfaWQ7CiAJdTggcmVzZXJ2ZWQxOwogCV9fbGUxNiBjb250cm9sOwkJLyogbm90IHVzZWQgKi8KLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbF9nZW5lcmFsX3BhcmFtcyBnZW5lcmFsX3BhcmFtczsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbF9hZ2dfcGFyYW1zIGFnZ19wYXJhbXM7CisJc3RydWN0IGlsX2xpbmtfcXVhbF9nZW5lcmFsX3BhcmFtcyBnZW5lcmFsX3BhcmFtczsKKwlzdHJ1Y3QgaWxfbGlua19xdWFsX2FnZ19wYXJhbXMgYWdnX3BhcmFtczsKIAogCS8qCi0JICogUmF0ZSBpbmZvOyB3aGVuIHVzaW5nIHJhdGUtc2NhbGluZywgVHggY29tbWFuZCdzIGluaXRpYWxfcmF0ZV9pbmRleAotCSAqIHNwZWNpZmllcyAxc3QgVHggcmF0ZSBhdHRlbXB0ZWQsIHZpYSBpbmRleCBpbnRvIHRoaXMgdGFibGUuCisJICogUmF0ZSBpbmZvOyB3aGVuIHVzaW5nIHJhdGUtc2NhbGluZywgVHggY29tbWFuZCdzIGluaXRpYWxfcmF0ZV9pZHgKKwkgKiBzcGVjaWZpZXMgMXN0IFR4IHJhdGUgYXR0ZW1wdGVkLCB2aWEgaWR4IGludG8gdGhpcyB0YWJsZS4KIAkgKiA0OTY1IGRldmljZXMgd29ya3MgaXRzIHdheSB0aHJvdWdoIHRhYmxlIHdoZW4gcmV0cnlpbmcgVHguCiAJICovCiAJc3RydWN0IHsKLQkJX19sZTMyIHJhdGVfbl9mbGFnczsJLyogUkFURV9NQ1NfKiwgSVdMX1JBVEVfKiAqLworCQlfX2xlMzIgcmF0ZV9uX2ZsYWdzOwkvKiBSQVRFX01DU18qLCBSQVRFXyogKi8KIAl9IHJzX3RhYmxlW0xJTktfUVVBTF9NQVhfUkVUUllfTlVNXTsKIAlfX2xlMzIgcmVzZXJ2ZWQyOwogfSBfX3BhY2tlZDsKQEAgLTIxMTcsMTMgKzIwOTksMTMgQEAKICNkZWZpbmUgQlRfTUFYX0tJTExfREVGICgweDUpCiAKIC8qCi0gKiBSRVBMWV9CVF9DT05GSUcgPSAweDliIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKiBDX0JUX0NPTkZJRyA9IDB4OWIgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKICAqCiAgKiAzOTQ1IGFuZCA0OTY1IGRldmljZXMgc3VwcG9ydCBoYXJkd2FyZSBoYW5kc2hha2Ugd2l0aCBCbHVldG9vdGggZGV2aWNlIG9uCiAgKiBzYW1lIHBsYXRmb3JtLiAgQmx1ZXRvb3RoIGRldmljZSBhbGVydHMgd2lyZWxlc3MgZGV2aWNlIHdoZW4gaXQgd2lsbCBUeDsKICAqIHdpcmVsZXNzIGRldmljZSBjYW4gZGVsYXkgb3Iga2lsbCBpdHMgb3duIFR4IHRvIGFjY29tbW9kYXRlLgogICovCi1zdHJ1Y3QgaXdsX2J0X2NtZCB7CitzdHJ1Y3QgaWxfYnRfY21kIHsKIAl1OCBmbGFnczsKIAl1OCBsZWFkX3RpbWU7CiAJdTggbWF4X2tpbGw7CkBAIC0yMTMyLDcgKzIxMTQsNiBAQAogCV9fbGUzMiBraWxsX2N0c19tYXNrOwogfSBfX3BhY2tlZDsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAoNikKICAqIFNwZWN0cnVtIE1hbmFnZW1lbnQgKDgwMi4xMWgpIENvbW1hbmRzLCBSZXNwb25zZXMsIE5vdGlmaWNhdGlvbnM6CkBAIC0yMTUwLDE4ICsyMTMxLDE4IEBACiAJCQkJIFJYT05fRklMVEVSX0FTU09DX01TSyAgICAgICAgICAgfCBcCiAJCQkJIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKQogCi1zdHJ1Y3QgaXdsX21lYXN1cmVfY2hhbm5lbCB7CitzdHJ1Y3QgaWxfbWVhc3VyZV9jaGFubmVsIHsKIAlfX2xlMzIgZHVyYXRpb247CS8qIG1lYXN1cmVtZW50IGR1cmF0aW9uIGluIGV4dGVuZGVkIGJlYWNvbgogCQkJCSAqIGZvcm1hdCAqLwogCXU4IGNoYW5uZWw7CQkvKiBjaGFubmVsIHRvIG1lYXN1cmUgKi8KLQl1OCB0eXBlOwkJLyogc2VlIGVudW0gaXdsX21lYXN1cmVfdHlwZSAqLworCXU4IHR5cGU7CQkvKiBzZWUgZW51bSBpbF9tZWFzdXJlX3R5cGUgKi8KIAlfX2xlMTYgcmVzZXJ2ZWQ7CiB9IF9fcGFja2VkOwogCiAvKgotICogUkVQTFlfU1BFQ1RSVU1fTUVBU1VSRU1FTlRfQ01EID0gMHg3NCAoY29tbWFuZCkKKyAqIENfU1BFQ1RSVU1fTUVBU1VSRU1FTlQgPSAweDc0IChjb21tYW5kKQogICovCi1zdHJ1Y3QgaXdsX3NwZWN0cnVtX2NtZCB7CitzdHJ1Y3QgaWxfc3BlY3RydW1fY21kIHsKIAlfX2xlMTYgbGVuOwkJLyogbnVtYmVyIG9mIGJ5dGVzIHN0YXJ0aW5nIGZyb20gdG9rZW4gKi8KIAl1OCB0b2tlbjsJCS8qIHRva2VuIGlkICovCiAJdTggaWQ7CQkJLyogbWVhc3VyZW1lbnQgaWQgLS0gMCBvciAxICovCkBAIC0yMTc0LDEzICsyMTU1LDEzIEBACiAJX19sZTMyIGZpbHRlcl9mbGFnczsJLyogcnhvbiBmaWx0ZXIgZmxhZ3MgKi8KIAlfX2xlMTYgY2hhbm5lbF9jb3VudDsJLyogbWluaW11bSAxLCBtYXhpbXVtIDEwICovCiAJX19sZTE2IHJlc2VydmVkMzsKLQlzdHJ1Y3QgaXdsX21lYXN1cmVfY2hhbm5lbCBjaGFubmVsc1sxMF07CisJc3RydWN0IGlsX21lYXN1cmVfY2hhbm5lbCBjaGFubmVsc1sxMF07CiB9IF9fcGFja2VkOwogCiAvKgotICogUkVQTFlfU1BFQ1RSVU1fTUVBU1VSRU1FTlRfQ01EID0gMHg3NCAocmVzcG9uc2UpCisgKiBDX1NQRUNUUlVNX01FQVNVUkVNRU5UID0gMHg3NCAocmVzcG9uc2UpCiAgKi8KLXN0cnVjdCBpd2xfc3BlY3RydW1fcmVzcCB7CitzdHJ1Y3QgaWxfc3BlY3RydW1fcmVzcCB7CiAJdTggdG9rZW47CiAJdTggaWQ7CQkJLyogaWQgb2YgdGhlIHByaW9yIGNvbW1hbmQgcmVwbGFjZWQsIG9yIDB4ZmYgKi8KIAlfX2xlMTYgc3RhdHVzOwkJLyogMCAtIGNvbW1hbmQgd2lsbCBiZSBoYW5kbGVkCkBAIC0yMTg4LDU3ICsyMTY5LDU3IEBACiAJCQkJICogICAgIG1lYXN1cmVtZW50KSAqLwogfSBfX3BhY2tlZDsKIAotZW51bSBpd2xfbWVhc3VyZW1lbnRfc3RhdGUgewotCUlXTF9NRUFTVVJFTUVOVF9TVEFSVCA9IDAsCi0JSVdMX01FQVNVUkVNRU5UX1NUT1AgPSAxLAorZW51bSBpbF9tZWFzdXJlbWVudF9zdGF0ZSB7CisJSUxfTUVBU1VSRU1FTlRfU1RBUlQgPSAwLAorCUlMX01FQVNVUkVNRU5UX1NUT1AgPSAxLAogfTsKIAotZW51bSBpd2xfbWVhc3VyZW1lbnRfc3RhdHVzIHsKLQlJV0xfTUVBU1VSRU1FTlRfT0sgPSAwLAotCUlXTF9NRUFTVVJFTUVOVF9DT05DVVJSRU5UID0gMSwKLQlJV0xfTUVBU1VSRU1FTlRfQ1NBX0NPTkZMSUNUID0gMiwKLQlJV0xfTUVBU1VSRU1FTlRfVEdIX0NPTkZMSUNUID0gMywKK2VudW0gaWxfbWVhc3VyZW1lbnRfc3RhdHVzIHsKKwlJTF9NRUFTVVJFTUVOVF9PSyA9IDAsCisJSUxfTUVBU1VSRU1FTlRfQ09OQ1VSUkVOVCA9IDEsCisJSUxfTUVBU1VSRU1FTlRfQ1NBX0NPTkZMSUNUID0gMiwKKwlJTF9NRUFTVVJFTUVOVF9UR0hfQ09ORkxJQ1QgPSAzLAogCS8qIDQtNSByZXNlcnZlZCAqLwotCUlXTF9NRUFTVVJFTUVOVF9TVE9QUEVEID0gNiwKLQlJV0xfTUVBU1VSRU1FTlRfVElNRU9VVCA9IDcsCi0JSVdMX01FQVNVUkVNRU5UX1BFUklPRElDX0ZBSUxFRCA9IDgsCisJSUxfTUVBU1VSRU1FTlRfU1RPUFBFRCA9IDYsCisJSUxfTUVBU1VSRU1FTlRfVElNRU9VVCA9IDcsCisJSUxfTUVBU1VSRU1FTlRfUEVSSU9ESUNfRkFJTEVEID0gOCwKIH07CiAKICNkZWZpbmUgTlVNX0VMRU1FTlRTX0lOX0hJU1RPR1JBTSA4CiAKLXN0cnVjdCBpd2xfbWVhc3VyZW1lbnRfaGlzdG9ncmFtIHsKK3N0cnVjdCBpbF9tZWFzdXJlbWVudF9oaXN0b2dyYW0gewogCV9fbGUzMiBvZmRtW05VTV9FTEVNRU5UU19JTl9ISVNUT0dSQU1dOwkvKiBpbiAwLjh1c2VjIGNvdW50cyAqLwogCV9fbGUzMiBjY2tbTlVNX0VMRU1FTlRTX0lOX0hJU1RPR1JBTV07CS8qIGluIDF1c2VjIGNvdW50cyAqLwogfSBfX3BhY2tlZDsKIAogLyogY2xlYXIgY2hhbm5lbCBhdmFpbGFiaWxpdHkgY291bnRlcnMgKi8KLXN0cnVjdCBpd2xfbWVhc3VyZW1lbnRfY2NhX2NvdW50ZXJzIHsKK3N0cnVjdCBpbF9tZWFzdXJlbWVudF9jY2FfY291bnRlcnMgewogCV9fbGUzMiBvZmRtOwogCV9fbGUzMiBjY2s7CiB9IF9fcGFja2VkOwogCi1lbnVtIGl3bF9tZWFzdXJlX3R5cGUgewotCUlXTF9NRUFTVVJFX0JBU0lDID0gKDEgPDwgMCksCi0JSVdMX01FQVNVUkVfQ0hBTk5FTF9MT0FEID0gKDEgPDwgMSksCi0JSVdMX01FQVNVUkVfSElTVE9HUkFNX1JQSSA9ICgxIDw8IDIpLAotCUlXTF9NRUFTVVJFX0hJU1RPR1JBTV9OT0lTRSA9ICgxIDw8IDMpLAotCUlXTF9NRUFTVVJFX0ZSQU1FID0gKDEgPDwgNCksCitlbnVtIGlsX21lYXN1cmVfdHlwZSB7CisJSUxfTUVBU1VSRV9CQVNJQyA9ICgxIDw8IDApLAorCUlMX01FQVNVUkVfQ0hBTk5FTF9MT0FEID0gKDEgPDwgMSksCisJSUxfTUVBU1VSRV9ISVNUT0dSQU1fUlBJID0gKDEgPDwgMiksCisJSUxfTUVBU1VSRV9ISVNUT0dSQU1fTk9JU0UgPSAoMSA8PCAzKSwKKwlJTF9NRUFTVVJFX0ZSQU1FID0gKDEgPDwgNCksCiAJLyogYml0cyA1OjYgYXJlIHJlc2VydmVkICovCi0JSVdMX01FQVNVUkVfSURMRSA9ICgxIDw8IDcpLAorCUlMX01FQVNVUkVfSURMRSA9ICgxIDw8IDcpLAogfTsKIAogLyoKLSAqIFNQRUNUUlVNX01FQVNVUkVfTk9USUZJQ0FUSU9OID0gMHg3NSAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKiBOX1NQRUNUUlVNX01FQVNVUkVNRU5UID0gMHg3NSAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCiAgKi8KLXN0cnVjdCBpd2xfc3BlY3RydW1fbm90aWZpY2F0aW9uIHsKK3N0cnVjdCBpbF9zcGVjdHJ1bV9ub3RpZmljYXRpb24gewogCXU4IGlkOwkJCS8qIG1lYXN1cmVtZW50IGlkIC0tIDAgb3IgMSAqLwogCXU4IHRva2VuOwotCXU4IGNoYW5uZWxfaW5kZXg7CS8qIGluZGV4IGluIG1lYXN1cmVtZW50IGNoYW5uZWwgbGlzdCAqLworCXU4IGNoYW5uZWxfaWR4OwkJLyogaWR4IGluIG1lYXN1cmVtZW50IGNoYW5uZWwgbGlzdCAqLwogCXU4IHN0YXRlOwkJLyogMCAtIHN0YXJ0LCAxIC0gc3RvcCAqLwogCV9fbGUzMiBzdGFydF90aW1lOwkvKiBsb3dlciAzMi1iaXRzIG9mIFRTRiAqLwogCXU4IGJhbmQ7CQkvKiAwIC0gNS4yR0h6LCAxIC0gMi40R0h6ICovCiAJdTggY2hhbm5lbDsKLQl1OCB0eXBlOwkJLyogc2VlIGVudW0gaXdsX21lYXN1cmVtZW50X3R5cGUgKi8KKwl1OCB0eXBlOwkJLyogc2VlIGVudW0gaWxfbWVhc3VyZW1lbnRfdHlwZSAqLwogCXU4IHJlc2VydmVkMTsKIAkvKiBOT1RFOiAgY2NhX29mZG0sIGNjYV9jY2ssIGJhc2ljX3R5cGUsIGFuZCBoaXN0b2dyYW0gYXJlIG9ubHkgb25seQogCSAqIHZhbGlkIGlmIGFwcGxpY2FibGUgZm9yIG1lYXN1cmVtZW50IHR5cGUgcmVxdWVzdGVkLiAqLwpAQCAtMjI0OCw5ICsyMjI5LDkgQEAKIAl1OCBiYXNpY190eXBlOwkJLyogMCAtIGJzcywgMSAtIG9mZG0gcHJlYW1ibGUsIDIgLQogCQkJCSAqIHVuaWRlbnRpZmllZCAqLwogCXU4IHJlc2VydmVkMlszXTsKLQlzdHJ1Y3QgaXdsX21lYXN1cmVtZW50X2hpc3RvZ3JhbSBoaXN0b2dyYW07CisJc3RydWN0IGlsX21lYXN1cmVtZW50X2hpc3RvZ3JhbSBoaXN0b2dyYW07CiAJX19sZTMyIHN0b3BfdGltZTsJLyogbG93ZXIgMzItYml0cyBvZiBUU0YgKi8KLQlfX2xlMzIgc3RhdHVzOwkJLyogc2VlIGl3bF9tZWFzdXJlbWVudF9zdGF0dXMgKi8KKwlfX2xlMzIgc3RhdHVzOwkJLyogc2VlIGlsX21lYXN1cmVtZW50X3N0YXR1cyAqLwogfSBfX3BhY2tlZDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMjI2MCwxMCArMjI0MSwxMCBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioKLSAqIHN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgLSBQb3dlciBUYWJsZSBDb21tYW5kCisgKiBzdHJ1Y3QgaWxfcG93ZXJ0YWJsZV9jbWQgLSBQb3dlciBUYWJsZSBDb21tYW5kCiAgKiBAZmxhZ3M6IFNlZSBiZWxvdzoKICAqCi0gKiBQT1dFUl9UQUJMRV9DTUQgPSAweDc3IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKiBDX1BPV0VSX1RCTCA9IDB4NzcgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKICAqCiAgKiBQTSBhbGxvdzoKICAqICAgYml0IDAgLSAnMCcgRHJpdmVyIG5vdCBhbGxvdyBwb3dlciBtYW5hZ2VtZW50CkBAIC0yMjkwLDM4ICsyMjcxLDM4IEBACiAgKiAgICAgICAgICAgICAgJzEwJyBmb3JjZSB4dGFsIHNsZWVwCiAgKiAgICAgICAgICAgICAgJzExJyBJbGxlZ2FsIHNldAogICoKLSAqIE5PVEU6IGlmIHNsZWVwX2ludGVydmFsW1NMRUVQX0lOVFJWTF9UQUJMRV9TSVpFLTFdID4gRFRJTSBwZXJpb2QgdGhlbgorICogTk9URTogaWYgc2xlZXBfaW50ZXJ2YWxbU0xFRVBfSU5UUlZMX1RCTF9TSVpFLTFdID4gRFRJTSBwZXJpb2QgdGhlbgogICogdWNvZGUgYXNzdW1lIHNsZWVwIG92ZXIgRFRJTSBpcyBhbGxvd2VkIGFuZCB3ZSBkb24ndCBuZWVkIHRvIHdha2UgdXAKICAqIGZvciBldmVyeSBEVElNLgogICovCi0jZGVmaW5lIElXTF9QT1dFUl9WRUNfU0laRSA1CisjZGVmaW5lIElMX1BPV0VSX1ZFQ19TSVpFIDUKIAotI2RlZmluZSBJV0xfUE9XRVJfRFJJVkVSX0FMTE9XX1NMRUVQX01TSwljcHVfdG9fbGUxNihCSVQoMCkpCi0jZGVmaW5lIElXTF9QT1dFUl9QQ0lfUE1fTVNLCQkJY3B1X3RvX2xlMTYoQklUKDMpKQorI2RlZmluZSBJTF9QT1dFUl9EUklWRVJfQUxMT1dfU0xFRVBfTVNLCWNwdV90b19sZTE2KEJJVCgwKSkKKyNkZWZpbmUgSUxfUE9XRVJfUENJX1BNX01TSwkJCWNwdV90b19sZTE2KEJJVCgzKSkKIAotc3RydWN0IGl3bDM5NDVfcG93ZXJ0YWJsZV9jbWQgeworc3RydWN0IGlsMzk0NV9wb3dlcnRhYmxlX2NtZCB7CiAJX19sZTE2IGZsYWdzOwogCXU4IHJlc2VydmVkWzJdOwogCV9fbGUzMiByeF9kYXRhX3RpbWVvdXQ7CiAJX19sZTMyIHR4X2RhdGFfdGltZW91dDsKLQlfX2xlMzIgc2xlZXBfaW50ZXJ2YWxbSVdMX1BPV0VSX1ZFQ19TSVpFXTsKKwlfX2xlMzIgc2xlZXBfaW50ZXJ2YWxbSUxfUE9XRVJfVkVDX1NJWkVdOwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCB7CitzdHJ1Y3QgaWxfcG93ZXJ0YWJsZV9jbWQgewogCV9fbGUxNiBmbGFnczsKLQl1OCBrZWVwX2FsaXZlX3NlY29uZHM7CQkvKiAzOTQ1IHJlc2VydmVkICovCi0JdTggZGVidWdfZmxhZ3M7CQkJLyogMzk0NSByZXNlcnZlZCAqLworCXU4IGtlZXBfYWxpdmVfc2Vjb25kczsJLyogMzk0NSByZXNlcnZlZCAqLworCXU4IGRlYnVnX2ZsYWdzOwkJLyogMzk0NSByZXNlcnZlZCAqLwogCV9fbGUzMiByeF9kYXRhX3RpbWVvdXQ7CiAJX19sZTMyIHR4X2RhdGFfdGltZW91dDsKLQlfX2xlMzIgc2xlZXBfaW50ZXJ2YWxbSVdMX1BPV0VSX1ZFQ19TSVpFXTsKKwlfX2xlMzIgc2xlZXBfaW50ZXJ2YWxbSUxfUE9XRVJfVkVDX1NJWkVdOwogCV9fbGUzMiBrZWVwX2FsaXZlX2JlYWNvbnM7CiB9IF9fcGFja2VkOwogCiAvKgotICogUE1fU0xFRVBfTk9USUZJQ0FUSU9OID0gMHg3QSAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKiBOX1BNX1NMRUVQID0gMHg3QSAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCiAgKiBhbGwgZGV2aWNlcyBpZGVudGljYWwuCiAgKi8KLXN0cnVjdCBpd2xfc2xlZXBfbm90aWZpY2F0aW9uIHsKK3N0cnVjdCBpbF9zbGVlcF9ub3RpZmljYXRpb24gewogCXU4IHBtX3NsZWVwX21vZGU7CiAJdTggcG1fd2FrZXVwX3NyYzsKIAlfX2xlMTYgcmVzZXJ2ZWQ7CkBAIC0yMzMyLDIzICsyMzEzLDIzIEBACiAKIC8qIFNsZWVwIHN0YXRlcy4gIGFsbCBkZXZpY2VzIGlkZW50aWNhbC4gKi8KIGVudW0gewotCUlXTF9QTV9OT19TTEVFUCA9IDAsCi0JSVdMX1BNX1NMUF9NQUMgPSAxLAotCUlXTF9QTV9TTFBfRlVMTF9NQUNfVU5BU1NPQ0lBVEUgPSAyLAotCUlXTF9QTV9TTFBfRlVMTF9NQUNfQ0FSRF9TVEFURSA9IDMsCi0JSVdMX1BNX1NMUF9QSFkgPSA0LAotCUlXTF9QTV9TTFBfUkVQRU5UID0gNSwKLQlJV0xfUE1fV0FLRVVQX0JZX1RJTUVSID0gNiwKLQlJV0xfUE1fV0FLRVVQX0JZX0RSSVZFUiA9IDcsCi0JSVdMX1BNX1dBS0VVUF9CWV9SRktJTEwgPSA4LAorCUlMX1BNX05PX1NMRUVQID0gMCwKKwlJTF9QTV9TTFBfTUFDID0gMSwKKwlJTF9QTV9TTFBfRlVMTF9NQUNfVU5BU1NPQ0lBVEUgPSAyLAorCUlMX1BNX1NMUF9GVUxMX01BQ19DQVJEX1NUQVRFID0gMywKKwlJTF9QTV9TTFBfUEhZID0gNCwKKwlJTF9QTV9TTFBfUkVQRU5UID0gNSwKKwlJTF9QTV9XQUtFVVBfQllfVElNRVIgPSA2LAorCUlMX1BNX1dBS0VVUF9CWV9EUklWRVIgPSA3LAorCUlMX1BNX1dBS0VVUF9CWV9SRktJTEwgPSA4LAogCS8qIDMgcmVzZXJ2ZWQgKi8KLQlJV0xfUE1fTlVNX09GX01PREVTID0gMTIsCisJSUxfUE1fTlVNX09GX01PREVTID0gMTIsCiB9OwogCiAvKgotICogQ0FSRF9TVEFURV9OT1RJRklDQVRJT04gPSAweGExIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKKyAqIE5fQ0FSRF9TVEFURSA9IDB4YTEgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQogICovCi1zdHJ1Y3QgaXdsX2NhcmRfc3RhdGVfbm90aWYgeworc3RydWN0IGlsX2NhcmRfc3RhdGVfbm90aWYgewogCV9fbGUzMiBmbGFnczsKIH0gX19wYWNrZWQ7CiAKQEAgLTIzNTcsMTEgKzIzMzgsMTEgQEAKICNkZWZpbmUgQ1RfQ0FSRF9ESVNBQkxFRCAgIDB4MDQKICNkZWZpbmUgUlhPTl9DQVJEX0RJU0FCTEVEIDB4MTAKIAotc3RydWN0IGl3bF9jdF9raWxsX2NvbmZpZyB7Ci0JX19sZTMyICAgcmVzZXJ2ZWQ7Ci0JX19sZTMyICAgY3JpdGljYWxfdGVtcGVyYXR1cmVfTTsKLQlfX2xlMzIgICBjcml0aWNhbF90ZW1wZXJhdHVyZV9SOwotfSAgX19wYWNrZWQ7CitzdHJ1Y3QgaWxfY3Rfa2lsbF9jb25maWcgeworCV9fbGUzMiByZXNlcnZlZDsKKwlfX2xlMzIgY3JpdGljYWxfdGVtcGVyYXR1cmVfTTsKKwlfX2xlMzIgY3JpdGljYWxfdGVtcGVyYXR1cmVfUjsKK30gX19wYWNrZWQ7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICg4KQpAQCAtMjM3Myw3ICsyMzU0LDcgQEAKICNkZWZpbmUgU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFICBjcHVfdG9fbGUzMigxKQogCiAvKioKLSAqIHN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsIC0gZW50cnkgaW4gUkVQTFlfU0NBTl9DTUQgY2hhbm5lbCB0YWJsZQorICogc3RydWN0IGlsX3NjYW5fY2hhbm5lbCAtIGVudHJ5IGluIENfU0NBTiBjaGFubmVsIHRhYmxlCiAgKgogICogT25lIGZvciBlYWNoIGNoYW5uZWwgaW4gdGhlIHNjYW4gbGlzdC4KICAqIEVhY2ggY2hhbm5lbCBjYW4gaW5kZXBlbmRlbnRseSBzZWxlY3Q6CkBAIC0yMzgzLDcgKzIzNjQsNyBAQAogICogICAgIHF1aWV0X3BsY3BfdGgsIGdvb2RfQ1JDX3RoKQogICoKICAqIFRvIGF2b2lkIHVDb2RlIGVycm9ycywgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgYXJlIHRydWUgKHNlZSBjb21tZW50cwotICogdW5kZXIgc3RydWN0IGl3bF9zY2FuX2NtZCBhYm91dCBtYXhfb3V0X3RpbWUgYW5kIHF1aWV0X3RpbWUpOgorICogdW5kZXIgc3RydWN0IGlsX3NjYW5fY21kIGFib3V0IG1heF9vdXRfdGltZSBhbmQgcXVpZXRfdGltZSk6CiAgKiAxKSAgSWYgdXNpbmcgcGFzc2l2ZV9kd2VsbCAoaS5lLiBwYXNzaXZlX2R3ZWxsICE9IDApOgogICogICAgIGFjdGl2ZV9kd2VsbCA8PSBwYXNzaXZlX2R3ZWxsICg8IG1heF9vdXRfdGltZSBpZiBtYXhfb3V0X3RpbWUgIT0gMCkKICAqIDIpICBxdWlldF90aW1lIDw9IGFjdGl2ZV9kd2VsbApAQCAtMjM5MSw3ICsyMzcyLDcgQEAKICAqICAgICBwYXNzaXZlX2R3ZWxsIDwgbWF4X291dF90aW1lCiAgKiAgICAgYWN0aXZlX2R3ZWxsIDwgbWF4X291dF90aW1lCiAgKi8KLXN0cnVjdCBpd2wzOTQ1X3NjYW5fY2hhbm5lbCB7CitzdHJ1Y3QgaWwzOTQ1X3NjYW5fY2hhbm5lbCB7CiAJLyoKIAkgKiB0eXBlIGlzIGRlZmluZWQgYXM6CiAJICogMDowIDEgPSBhY3RpdmUsIDAgPSBwYXNzaXZlCkBAIC0yNDAwLDE2ICsyMzgxLDE2IEBACiAJICogNTo3IHJlc2VydmVkCiAJICovCiAJdTggdHlwZTsKLQl1OCBjaGFubmVsOwkvKiBiYW5kIGlzIHNlbGVjdGVkIGJ5IGl3bDM5NDVfc2Nhbl9jbWQgImZsYWdzIiBmaWVsZCAqLwotCXN0cnVjdCBpd2wzOTQ1X3R4X3Bvd2VyIHRwYzsKKwl1OCBjaGFubmVsOwkJLyogYmFuZCBpcyBzZWxlY3RlZCBieSBpbDM5NDVfc2Nhbl9jbWQgImZsYWdzIiBmaWVsZCAqLworCXN0cnVjdCBpbDM5NDVfdHhfcG93ZXIgdHBjOwogCV9fbGUxNiBhY3RpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCA1LTUwICovCiAJX19sZTE2IHBhc3NpdmVfZHdlbGw7CS8qIGluIDEwMjQtdVNlYyBUVSAodGltZSB1bml0cyksIHR5cCAyMC01MDAgKi8KIH0gX19wYWNrZWQ7CiAKIC8qIHNldCBudW1iZXIgb2YgZGlyZWN0IHByb2JlcyB1OCB0eXBlICovCi0jZGVmaW5lIElXTDM5X1NDQU5fUFJPQkVfTUFTSyhuKSAoKEJJVChuKSB8IChCSVQobikgLSBCSVQoMSkpKSkKKyNkZWZpbmUgSUwzOV9TQ0FOX1BST0JFX01BU0sobikgKChCSVQobikgfCAoQklUKG4pIC0gQklUKDEpKSkpCiAKLXN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsIHsKK3N0cnVjdCBpbF9zY2FuX2NoYW5uZWwgewogCS8qCiAJICogdHlwZSBpcyBkZWZpbmVkIGFzOgogCSAqIDA6MCAxID0gYWN0aXZlLCAwID0gcGFzc2l2ZQpAQCAtMjQxOCw3ICsyMzk5LDcgQEAKIAkgKiAyMTozMSByZXNlcnZlZAogCSAqLwogCV9fbGUzMiB0eXBlOwotCV9fbGUxNiBjaGFubmVsOwkvKiBiYW5kIGlzIHNlbGVjdGVkIGJ5IGl3bF9zY2FuX2NtZCAiZmxhZ3MiIGZpZWxkICovCisJX19sZTE2IGNoYW5uZWw7CQkvKiBiYW5kIGlzIHNlbGVjdGVkIGJ5IGlsX3NjYW5fY21kICJmbGFncyIgZmllbGQgKi8KIAl1OCB0eF9nYWluOwkJLyogZ2FpbiBmb3IgYW5hbG9nIHJhZGlvICovCiAJdTggZHNwX2F0dGVuOwkJLyogZ2FpbiBmb3IgRFNQICovCiAJX19sZTE2IGFjdGl2ZV9kd2VsbDsJLyogaW4gMTAyNC11U2VjIFRVICh0aW1lIHVuaXRzKSwgdHlwIDUtNTAgKi8KQEAgLTI0MjYsMTcgKzI0MDcsMTcgQEAKIH0gX19wYWNrZWQ7CiAKIC8qIHNldCBudW1iZXIgb2YgZGlyZWN0IHByb2JlcyBfX2xlMzIgdHlwZSAqLwotI2RlZmluZSBJV0xfU0NBTl9QUk9CRV9NQVNLKG4pCWNwdV90b19sZTMyKChCSVQobikgfCAoQklUKG4pIC0gQklUKDEpKSkpCisjZGVmaW5lIElMX1NDQU5fUFJPQkVfTUFTSyhuKQljcHVfdG9fbGUzMigoQklUKG4pIHwgKEJJVChuKSAtIEJJVCgxKSkpKQogCiAvKioKLSAqIHN0cnVjdCBpd2xfc3NpZF9pZSAtIGRpcmVjdGVkIHNjYW4gbmV0d29yayBpbmZvcm1hdGlvbiBlbGVtZW50CisgKiBzdHJ1Y3QgaWxfc3NpZF9pZSAtIGRpcmVjdGVkIHNjYW4gbmV0d29yayBpbmZvcm1hdGlvbiBlbGVtZW50CiAgKgotICogVXAgdG8gMjAgb2YgdGhlc2UgbWF5IGFwcGVhciBpbiBSRVBMWV9TQ0FOX0NNRCAoTm90ZTogT25seSA0IGFyZSBpbgotICogMzk0NSBTQ0FOIGFwaSksIHNlbGVjdGVkIGJ5ICJ0eXBlIiBiaXQgZmllbGQgaW4gc3RydWN0IGl3bF9zY2FuX2NoYW5uZWw7CisgKiBVcCB0byAyMCBvZiB0aGVzZSBtYXkgYXBwZWFyIGluIENfU0NBTiAoTm90ZTogT25seSA0IGFyZSBpbgorICogMzk0NSBTQ0FOIGFwaSksIHNlbGVjdGVkIGJ5ICJ0eXBlIiBiaXQgZmllbGQgaW4gc3RydWN0IGlsX3NjYW5fY2hhbm5lbDsKICAqIGVhY2ggY2hhbm5lbCBtYXkgc2VsZWN0IGRpZmZlcmVudCBzc2lkcyBmcm9tIGFtb25nIHRoZSAyMCAoNCkgZW50cmllcy4KICAqIFNTSUQgSUVzIGdldCB0cmFuc21pdHRlZCBpbiByZXZlcnNlIG9yZGVyIG9mIGVudHJ5LgogICovCi1zdHJ1Y3QgaXdsX3NzaWRfaWUgeworc3RydWN0IGlsX3NzaWRfaWUgewogCXU4IGlkOwogCXU4IGxlbjsKIAl1OCBzc2lkWzMyXTsKQEAgLTI0NDUsMTQgKzI0MjYsMTQgQEAKICNkZWZpbmUgUFJPQkVfT1BUSU9OX01BWF8zOTQ1CQk0CiAjZGVmaW5lIFBST0JFX09QVElPTl9NQVgJCTIwCiAjZGVmaW5lIFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEUJY3B1X3RvX2xlMzIoMHhGRkZGRkZGRikKLSNkZWZpbmUgSVdMX0dPT0RfQ1JDX1RIX0RJU0FCTEVECTAKLSNkZWZpbmUgSVdMX0dPT0RfQ1JDX1RIX0RFRkFVTFQJCWNwdV90b19sZTE2KDEpCi0jZGVmaW5lIElXTF9HT09EX0NSQ19USF9ORVZFUgkJY3B1X3RvX2xlMTYoMHhmZmZmKQotI2RlZmluZSBJV0xfTUFYX1NDQU5fU0laRSAxMDI0Ci0jZGVmaW5lIElXTF9NQVhfQ01EX1NJWkUgNDA5NgorI2RlZmluZSBJTF9HT09EX0NSQ19USF9ESVNBQkxFRAkwCisjZGVmaW5lIElMX0dPT0RfQ1JDX1RIX0RFRkFVTFQJCWNwdV90b19sZTE2KDEpCisjZGVmaW5lIElMX0dPT0RfQ1JDX1RIX05FVkVSCQljcHVfdG9fbGUxNigweGZmZmYpCisjZGVmaW5lIElMX01BWF9TQ0FOX1NJWkUgMTAyNAorI2RlZmluZSBJTF9NQVhfQ01EX1NJWkUgNDA5NgogCiAvKgotICogUkVQTFlfU0NBTl9DTUQgPSAweDgwIChjb21tYW5kKQorICogQ19TQ0FOID0gMHg4MCAoY29tbWFuZCkKICAqCiAgKiBUaGUgaGFyZHdhcmUgc2NhbiBjb21tYW5kIGlzIHZlcnkgcG93ZXJmdWw7IHRoZSBkcml2ZXIgY2FuIHNldCBpdCB1cCB0bwogICogbWFpbnRhaW4gKHJlbGF0aXZlbHkpIG5vcm1hbCBuZXR3b3JrIHRyYWZmaWMgd2hpbGUgZG9pbmcgYSBzY2FuIGluIHRoZQpAQCAtMjUwMSwxMCArMjQ4MiwxMCBAQAogICogRHJpdmVyIG11c3QgdXNlIHNlcGFyYXRlIHNjYW4gY29tbWFuZHMgZm9yIDIuNCB2cy4gNSBHSHogYmFuZHMuCiAgKgogICogVG8gYXZvaWQgdUNvZGUgZXJyb3JzLCBzZWUgdGltaW5nIHJlc3RyaWN0aW9ucyBkZXNjcmliZWQgdW5kZXIKLSAqIHN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsLgorICogc3RydWN0IGlsX3NjYW5fY2hhbm5lbC4KICAqLwogCi1zdHJ1Y3QgaXdsMzk0NV9zY2FuX2NtZCB7CitzdHJ1Y3QgaWwzOTQ1X3NjYW5fY21kIHsKIAlfX2xlMTYgbGVuOwogCXU4IHJlc2VydmVkMDsKIAl1OCBjaGFubmVsX2NvdW50OwkvKiAjIGNoYW5uZWxzIGluIGNoYW5uZWwgbGlzdCAqLwpAQCAtMjUyNSwxMCArMjUwNiwxMCBAQAogCiAJLyogRm9yIGFjdGl2ZSBzY2FucyAoc2V0IHRvIGFsbC0wcyBmb3IgcGFzc2l2ZSBzY2FucykuCiAJICogRG9lcyBub3QgaW5jbHVkZSBwYXlsb2FkLiAgTXVzdCBzcGVjaWZ5IFR4IHJhdGU7IG5vIHJhdGUgc2NhbGluZy4gKi8KLQlzdHJ1Y3QgaXdsMzk0NV90eF9jbWQgdHhfY21kOworCXN0cnVjdCBpbDM5NDVfdHhfY21kIHR4X2NtZDsKIAogCS8qIEZvciBkaXJlY3RlZCBhY3RpdmUgc2NhbnMgKHNldCB0byBhbGwtMHMgb3RoZXJ3aXNlKSAqLwotCXN0cnVjdCBpd2xfc3NpZF9pZSBkaXJlY3Rfc2NhbltQUk9CRV9PUFRJT05fTUFYXzM5NDVdOworCXN0cnVjdCBpbF9zc2lkX2llIGRpcmVjdF9zY2FuW1BST0JFX09QVElPTl9NQVhfMzk0NV07CiAKIAkvKgogCSAqIFByb2JlIHJlcXVlc3QgZnJhbWUsIGZvbGxvd2VkIGJ5IGNoYW5uZWwgbGlzdC4KQEAgLTI1MzgsMTcgKzI1MTksMTcgQEAKIAkgKiBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gbGlzdCBpcyBzcGVjaWZpZWQgYnkgY2hhbm5lbF9jb3VudC4KIAkgKiBFYWNoIGNoYW5uZWwgaW4gbGlzdCBpcyBvZiB0eXBlOgogCSAqCi0JICogc3RydWN0IGl3bDM5NDVfc2Nhbl9jaGFubmVsIGNoYW5uZWxzWzBdOworCSAqIHN0cnVjdCBpbDM5NDVfc2Nhbl9jaGFubmVsIGNoYW5uZWxzWzBdOwogCSAqCiAJICogTk9URTogIE9ubHkgb25lIGJhbmQgb2YgY2hhbm5lbHMgY2FuIGJlIHNjYW5uZWQgcGVyIHBhc3MuICBZb3UKIAkgKiBtdXN0IG5vdCBtaXggMi40R0h6IGNoYW5uZWxzIGFuZCA1LjJHSHogY2hhbm5lbHMsIGFuZCB5b3UgbXVzdCB3YWl0Ci0JICogZm9yIG9uZSBzY2FuIHRvIGNvbXBsZXRlIChpLmUuIHJlY2VpdmUgU0NBTl9DT01QTEVURV9OT1RJRklDQVRJT04pCisJICogZm9yIG9uZSBzY2FuIHRvIGNvbXBsZXRlIChpLmUuIHJlY2VpdmUgTl9TQ0FOX0NPTVBMRVRFKQogCSAqIGJlZm9yZSByZXF1ZXN0aW5nIGFub3RoZXIgc2Nhbi4KIAkgKi8KIAl1OCBkYXRhWzBdOwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGl3bF9zY2FuX2NtZCB7CitzdHJ1Y3QgaWxfc2Nhbl9jbWQgewogCV9fbGUxNiBsZW47CiAJdTggcmVzZXJ2ZWQwOwogCXU4IGNoYW5uZWxfY291bnQ7CS8qICMgY2hhbm5lbHMgaW4gY2hhbm5lbCBsaXN0ICovCkBAIC0yNTY5LDEwICsyNTUwLDEwIEBACiAKIAkvKiBGb3IgYWN0aXZlIHNjYW5zIChzZXQgdG8gYWxsLTBzIGZvciBwYXNzaXZlIHNjYW5zKS4KIAkgKiBEb2VzIG5vdCBpbmNsdWRlIHBheWxvYWQuICBNdXN0IHNwZWNpZnkgVHggcmF0ZTsgbm8gcmF0ZSBzY2FsaW5nLiAqLwotCXN0cnVjdCBpd2xfdHhfY21kIHR4X2NtZDsKKwlzdHJ1Y3QgaWxfdHhfY21kIHR4X2NtZDsKIAogCS8qIEZvciBkaXJlY3RlZCBhY3RpdmUgc2NhbnMgKHNldCB0byBhbGwtMHMgb3RoZXJ3aXNlKSAqLwotCXN0cnVjdCBpd2xfc3NpZF9pZSBkaXJlY3Rfc2NhbltQUk9CRV9PUFRJT05fTUFYXTsKKwlzdHJ1Y3QgaWxfc3NpZF9pZSBkaXJlY3Rfc2NhbltQUk9CRV9PUFRJT05fTUFYXTsKIAogCS8qCiAJICogUHJvYmUgcmVxdWVzdCBmcmFtZSwgZm9sbG93ZWQgYnkgY2hhbm5lbCBsaXN0LgpAQCAtMjU4MiwxMSArMjU2MywxMSBAQAogCSAqIE51bWJlciBvZiBjaGFubmVscyBpbiBsaXN0IGlzIHNwZWNpZmllZCBieSBjaGFubmVsX2NvdW50LgogCSAqIEVhY2ggY2hhbm5lbCBpbiBsaXN0IGlzIG9mIHR5cGU6CiAJICoKLQkgKiBzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCBjaGFubmVsc1swXTsKKwkgKiBzdHJ1Y3QgaWxfc2Nhbl9jaGFubmVsIGNoYW5uZWxzWzBdOwogCSAqCiAJICogTk9URTogIE9ubHkgb25lIGJhbmQgb2YgY2hhbm5lbHMgY2FuIGJlIHNjYW5uZWQgcGVyIHBhc3MuICBZb3UKIAkgKiBtdXN0IG5vdCBtaXggMi40R0h6IGNoYW5uZWxzIGFuZCA1LjJHSHogY2hhbm5lbHMsIGFuZCB5b3UgbXVzdCB3YWl0Ci0JICogZm9yIG9uZSBzY2FuIHRvIGNvbXBsZXRlIChpLmUuIHJlY2VpdmUgU0NBTl9DT01QTEVURV9OT1RJRklDQVRJT04pCisJICogZm9yIG9uZSBzY2FuIHRvIGNvbXBsZXRlIChpLmUuIHJlY2VpdmUgTl9TQ0FOX0NPTVBMRVRFKQogCSAqIGJlZm9yZSByZXF1ZXN0aW5nIGFub3RoZXIgc2Nhbi4KIAkgKi8KIAl1OCBkYXRhWzBdOwpAQCAtMjU5OCwxNiArMjU3OSwxNiBAQAogI2RlZmluZSBBQk9SVF9TVEFUVVMgICAgICAgICAgICAweDIKIAogLyoKLSAqIFJFUExZX1NDQU5fQ01EID0gMHg4MCAocmVzcG9uc2UpCisgKiBDX1NDQU4gPSAweDgwIChyZXNwb25zZSkKICAqLwotc3RydWN0IGl3bF9zY2FucmVxX25vdGlmaWNhdGlvbiB7CitzdHJ1Y3QgaWxfc2NhbnJlcV9ub3RpZmljYXRpb24gewogCV9fbGUzMiBzdGF0dXM7CQkvKiAxOiBva2F5LCAyOiBjYW5ub3QgZnVsZmlsbCByZXF1ZXN0ICovCiB9IF9fcGFja2VkOwogCiAvKgotICogU0NBTl9TVEFSVF9OT1RJRklDQVRJT04gPSAweDgyIChub3RpZmljYXRpb24gb25seSwgbm90IGEgY29tbWFuZCkKKyAqIE5fU0NBTl9TVEFSVCA9IDB4ODIgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQogICovCi1zdHJ1Y3QgaXdsX3NjYW5zdGFydF9ub3RpZmljYXRpb24geworc3RydWN0IGlsX3NjYW5zdGFydF9ub3RpZmljYXRpb24gewogCV9fbGUzMiB0c2ZfbG93OwogCV9fbGUzMiB0c2ZfaGlnaDsKIAlfX2xlMzIgYmVhY29uX3RpbWVyOwpAQCAtMjYyMCwzMCArMjYwMSwzMCBAQAogI2RlZmluZSAgU0NBTl9PV05FUl9TVEFUVVMgMHgxCiAjZGVmaW5lICBNRUFTVVJFX09XTkVSX1NUQVRVUyAweDIKIAotI2RlZmluZSBJV0xfUFJPQkVfU1RBVFVTX09LCQkwCi0jZGVmaW5lIElXTF9QUk9CRV9TVEFUVVNfVFhfRkFJTEVECUJJVCgwKQorI2RlZmluZSBJTF9QUk9CRV9TVEFUVVNfT0sJCTAKKyNkZWZpbmUgSUxfUFJPQkVfU1RBVFVTX1RYX0ZBSUxFRAlCSVQoMCkKIC8qIGVycm9yIHN0YXR1c2VzIGNvbWJpbmVkIHdpdGggVFhfRkFJTEVEICovCi0jZGVmaW5lIElXTF9QUk9CRV9TVEFUVVNfRkFJTF9UVEwJQklUKDEpCi0jZGVmaW5lIElXTF9QUk9CRV9TVEFUVVNfRkFJTF9CVAlCSVQoMikKKyNkZWZpbmUgSUxfUFJPQkVfU1RBVFVTX0ZBSUxfVFRMCUJJVCgxKQorI2RlZmluZSBJTF9QUk9CRV9TVEFUVVNfRkFJTF9CVAlCSVQoMikKIAotI2RlZmluZSBOVU1CRVJfT0ZfU1RBVElTVElDUyAxCS8qIGZpcnN0IF9fbGUzMiBpcyBnb29kIENSQyAqLworI2RlZmluZSBOVU1CRVJfT0ZfU1RBVFMgMQkvKiBmaXJzdCBfX2xlMzIgaXMgZ29vZCBDUkMgKi8KIC8qCi0gKiBTQ0FOX1JFU1VMVFNfTk9USUZJQ0FUSU9OID0gMHg4MyAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKiBOX1NDQU5fUkVTVUxUUyA9IDB4ODMgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQogICovCi1zdHJ1Y3QgaXdsX3NjYW5yZXN1bHRzX25vdGlmaWNhdGlvbiB7CitzdHJ1Y3QgaWxfc2NhbnJlc3VsdHNfbm90aWZpY2F0aW9uIHsKIAl1OCBjaGFubmVsOwogCXU4IGJhbmQ7CiAJdTggcHJvYmVfc3RhdHVzOwotCXU4IG51bV9wcm9iZV9ub3Rfc2VudDsgLyogbm90IGVub3VnaCB0aW1lIHRvIHNlbmQgKi8KKwl1OCBudW1fcHJvYmVfbm90X3NlbnQ7CS8qIG5vdCBlbm91Z2ggdGltZSB0byBzZW5kICovCiAJX19sZTMyIHRzZl9sb3c7CiAJX19sZTMyIHRzZl9oaWdoOwotCV9fbGUzMiBzdGF0aXN0aWNzW05VTUJFUl9PRl9TVEFUSVNUSUNTXTsKKwlfX2xlMzIgc3RhdHNbTlVNQkVSX09GX1NUQVRTXTsKIH0gX19wYWNrZWQ7CiAKIC8qCi0gKiBTQ0FOX0NPTVBMRVRFX05PVElGSUNBVElPTiA9IDB4ODQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQorICogTl9TQ0FOX0NPTVBMRVRFID0gMHg4NCAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCiAgKi8KLXN0cnVjdCBpd2xfc2NhbmNvbXBsZXRlX25vdGlmaWNhdGlvbiB7CitzdHJ1Y3QgaWxfc2NhbmNvbXBsZXRlX25vdGlmaWNhdGlvbiB7CiAJdTggc2Nhbm5lZF9jaGFubmVsczsKIAl1OCBzdGF0dXM7CiAJdTggbGFzdF9jaGFubmVsOwpAQCAtMjY1MSw1MCArMjYzMiw0OSBAQAogCV9fbGUzMiB0c2ZfaGlnaDsKIH0gX19wYWNrZWQ7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogKDkpCiAgKiBJQlNTL0FQIENvbW1hbmRzIGFuZCBOb3RpZmljYXRpb25zOgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotZW51bSBpd2xfaWJzc19tYW5hZ2VyIHsKLQlJV0xfTk9UX0lCU1NfTUFOQUdFUiA9IDAsCi0JSVdMX0lCU1NfTUFOQUdFUiA9IDEsCitlbnVtIGlsX2lic3NfbWFuYWdlciB7CisJSUxfTk9UX0lCU1NfTUFOQUdFUiA9IDAsCisJSUxfSUJTU19NQU5BR0VSID0gMSwKIH07CiAKIC8qCi0gKiBCRUFDT05fTk9USUZJQ0FUSU9OID0gMHg5MCAobm90aWZpY2F0aW9uIG9ubHksIG5vdCBhIGNvbW1hbmQpCisgKiBOX0JFQUNPTiA9IDB4OTAgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQogICovCiAKLXN0cnVjdCBpd2wzOTQ1X2JlYWNvbl9ub3RpZiB7Ci0Jc3RydWN0IGl3bDM5NDVfdHhfcmVzcCBiZWFjb25fbm90aWZ5X2hkcjsKK3N0cnVjdCBpbDM5NDVfYmVhY29uX25vdGlmIHsKKwlzdHJ1Y3QgaWwzOTQ1X3R4X3Jlc3AgYmVhY29uX25vdGlmeV9oZHI7CiAJX19sZTMyIGxvd190c2Y7CiAJX19sZTMyIGhpZ2hfdHNmOwogCV9fbGUzMiBpYnNzX21ncl9zdGF0dXM7CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgaXdsNDk2NV9iZWFjb25fbm90aWYgewotCXN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgYmVhY29uX25vdGlmeV9oZHI7CitzdHJ1Y3QgaWw0OTY1X2JlYWNvbl9ub3RpZiB7CisJc3RydWN0IGlsNDk2NV90eF9yZXNwIGJlYWNvbl9ub3RpZnlfaGRyOwogCV9fbGUzMiBsb3dfdHNmOwogCV9fbGUzMiBoaWdoX3RzZjsKIAlfX2xlMzIgaWJzc19tZ3Jfc3RhdHVzOwogfSBfX3BhY2tlZDsKIAogLyoKLSAqIFJFUExZX1RYX0JFQUNPTiA9IDB4OTEgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKKyAqIENfVFhfQkVBQ09OPSAweDkxIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCiAgKi8KIAotc3RydWN0IGl3bDM5NDVfdHhfYmVhY29uX2NtZCB7Ci0Jc3RydWN0IGl3bDM5NDVfdHhfY21kIHR4Oworc3RydWN0IGlsMzk0NV90eF9iZWFjb25fY21kIHsKKwlzdHJ1Y3QgaWwzOTQ1X3R4X2NtZCB0eDsKIAlfX2xlMTYgdGltX2lkeDsKIAl1OCB0aW1fc2l6ZTsKIAl1OCByZXNlcnZlZDE7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWVbMF07CS8qIGJlYWNvbiBmcmFtZSAqLwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGl3bF90eF9iZWFjb25fY21kIHsKLQlzdHJ1Y3QgaXdsX3R4X2NtZCB0eDsKK3N0cnVjdCBpbF90eF9iZWFjb25fY21kIHsKKwlzdHJ1Y3QgaWxfdHhfY21kIHR4OwogCV9fbGUxNiB0aW1faWR4OwogCXU4IHRpbV9zaXplOwogCXU4IHJlc2VydmVkMTsKQEAgLTI3MDcsNyArMjY4Nyw3IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jZGVmaW5lIElXTF9URU1QX0NPTlZFUlQgMjYwCisjZGVmaW5lIElMX1RFTVBfQ09OVkVSVCAyNjAKIAogI2RlZmluZSBTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMUyAgOAogI2RlZmluZSBTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMUyAgNApAQCAtMjcyNyw5ICsyNzA3LDkgQEAKIAl9IGZhaWxlZDsKIH0gX19wYWNrZWQ7CiAKLS8qIHN0YXRpc3RpY3MgY29tbWFuZCByZXNwb25zZSAqLworLyogc3RhdHMgY29tbWFuZCByZXNwb25zZSAqLwogCi1zdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9waHkgeworc3RydWN0IGl3bDM5X3N0YXRzX3J4X3BoeSB7CiAJX19sZTMyIGluYV9jbnQ7CiAJX19sZTMyIGZpbmFfY250OwogCV9fbGUzMiBwbGNwX2VycjsKQEAgLTI3NDcsNyArMjcyNyw3IEBACiAJX19sZTMyIHNlbnRfY3RzX2NudDsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X25vbl9waHkgeworc3RydWN0IGl3bDM5X3N0YXRzX3J4X25vbl9waHkgewogCV9fbGUzMiBib2d1c19jdHM7CS8qIENUUyByZWNlaXZlZCB3aGVuIG5vdCBleHBlY3RpbmcgQ1RTICovCiAJX19sZTMyIGJvZ3VzX2FjazsJLyogQUNLIHJlY2VpdmVkIHdoZW4gbm90IGV4cGVjdGluZyBBQ0sgKi8KIAlfX2xlMzIgbm9uX2Jzc2lkX2ZyYW1lczsJLyogbnVtYmVyIG9mIGZyYW1lcyB3aXRoIEJTU0lEIHRoYXQKQEAgLTI3NTgsMTMgKzI3MzgsMTMgQEAKIAkJCQkJICogb3VyIHNlcnZpbmcgY2hhbm5lbCAqLwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfcnggewotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X3BoeSBvZmRtOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X3BoeSBjY2s7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3Nfcnhfbm9uX3BoeSBnZW5lcmFsOworc3RydWN0IGl3bDM5X3N0YXRzX3J4IHsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnhfcGh5IG9mZG07CisJc3RydWN0IGl3bDM5X3N0YXRzX3J4X3BoeSBjY2s7CisJc3RydWN0IGl3bDM5X3N0YXRzX3J4X25vbl9waHkgZ2VuZXJhbDsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3R4IHsKK3N0cnVjdCBpd2wzOV9zdGF0c190eCB7CiAJX19sZTMyIHByZWFtYmxlX2NudDsKIAlfX2xlMzIgcnhfZGV0ZWN0ZWRfY250OwogCV9fbGUzMiBidF9wcmlvX2RlZmVyX2NudDsKQEAgLTI3NzYsMzEgKzI3NTYsMzEgQEAKIAlfX2xlMzIgYWN0dWFsX2Fja19jbnQ7CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3Qgc3RhdGlzdGljc19kYmcgeworc3RydWN0IHN0YXRzX2RiZyB7CiAJX19sZTMyIGJ1cnN0X2NoZWNrOwogCV9fbGUzMiBidXJzdF9jb3VudDsKIAlfX2xlMzIgd2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudDsKIAlfX2xlMzIgcmVzZXJ2ZWRbM107CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19kaXYgeworc3RydWN0IGl3bDM5X3N0YXRzX2RpdiB7CiAJX19sZTMyIHR4X29uX2E7CiAJX19sZTMyIHR4X29uX2I7CiAJX19sZTMyIGV4ZWNfdGltZTsKIAlfX2xlMzIgcHJvYmVfdGltZTsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2dlbmVyYWwgeworc3RydWN0IGl3bDM5X3N0YXRzX2dlbmVyYWwgewogCV9fbGUzMiB0ZW1wZXJhdHVyZTsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgZGJnOworCXN0cnVjdCBzdGF0c19kYmcgZGJnOwogCV9fbGUzMiBzbGVlcF90aW1lOwogCV9fbGUzMiBzbG90c19vdXQ7CiAJX19sZTMyIHNsb3RzX2lkbGU7CiAJX19sZTMyIHR0bF90aW1lc3RhbXA7Ci0Jc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfZGl2IGRpdjsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfZGl2IGRpdjsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSB7CitzdHJ1Y3Qgc3RhdHNfcnhfcGh5IHsKIAlfX2xlMzIgaW5hX2NudDsKIAlfX2xlMzIgZmluYV9jbnQ7CiAJX19sZTMyIHBsY3BfZXJyOwpAQCAtMjgyMyw3ICsyODAzLDcgQEAKIAlfX2xlMzIgcmVzZXJ2ZWQzOwogfSBfX3BhY2tlZDsKIAotc3RydWN0IHN0YXRpc3RpY3NfcnhfaHRfcGh5IHsKK3N0cnVjdCBzdGF0c19yeF9odF9waHkgewogCV9fbGUzMiBwbGNwX2VycjsKIAlfX2xlMzIgb3ZlcnJ1bl9lcnI7CiAJX19sZTMyIGVhcmx5X292ZXJydW5fZXJyOwpAQCAtMjgzOCw3ICsyODE4LDcgQEAKIAogI2RlZmluZSBJTlRFUkZFUkVOQ0VfREFUQV9BVkFJTEFCTEUgICAgICBjcHVfdG9fbGUzMigxKQogCi1zdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5IHsKK3N0cnVjdCBzdGF0c19yeF9ub25fcGh5IHsKIAlfX2xlMzIgYm9ndXNfY3RzOwkvKiBDVFMgcmVjZWl2ZWQgd2hlbiBub3QgZXhwZWN0aW5nIENUUyAqLwogCV9fbGUzMiBib2d1c19hY2s7CS8qIEFDSyByZWNlaXZlZCB3aGVuIG5vdCBleHBlY3RpbmcgQUNLICovCiAJX19sZTMyIG5vbl9ic3NpZF9mcmFtZXM7CS8qIG51bWJlciBvZiBmcmFtZXMgd2l0aCBCU1NJRCB0aGF0CkBAIC0yODUyLDE1ICsyODMyLDE1IEBACiAJX19sZTMyIG51bV9taXNzZWRfYmNvbjsJLyogbnVtYmVyIG9mIG1pc3NlZCBiZWFjb25zICovCiAJX19sZTMyIGFkY19yeF9zYXR1cmF0aW9uX3RpbWU7CS8qIGNvdW50IGluIDAuOHVzIHVuaXRzIHRoZSB0aW1lIHRoZQogCQkJCQkgKiBBREMgd2FzIGluIHNhdHVyYXRpb24gKi8KLQlfX2xlMzIgaW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZTsvKiB0b3RhbCB0aW1lIChpbiAwLjh1cykgc2VhcmNoZWQKLQkJCQkJICAqIGZvciBJTkEgKi8KKwlfX2xlMzIgaW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZTsJLyogdG90YWwgdGltZSAoaW4gMC44dXMpIHNlYXJjaGVkCisJCQkJCQkgKiBmb3IgSU5BICovCiAJX19sZTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYTsJLyogUlNTSSBzaWxlbmNlIGFmdGVyIGJlYWNvbiBmcmFtZSAqLwogCV9fbGUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2I7CS8qIFJTU0kgc2lsZW5jZSBhZnRlciBiZWFjb24gZnJhbWUgKi8KIAlfX2xlMzIgYmVhY29uX3NpbGVuY2VfcnNzaV9jOwkvKiBSU1NJIHNpbGVuY2UgYWZ0ZXIgYmVhY29uIGZyYW1lICovCiAJX19sZTMyIGludGVyZmVyZW5jZV9kYXRhX2ZsYWc7CS8qIGZsYWcgZm9yIGludGVyZmVyZW5jZSBkYXRhCiAJCQkJCSAqIGF2YWlsYWJpbGl0eS4gMSB3aGVuIGRhdGEgaXMKIAkJCQkJICogYXZhaWxhYmxlLiAqLwotCV9fbGUzMiBjaGFubmVsX2xvYWQ7CQkvKiBjb3VudHMgUlggRW5hYmxlIHRpbWUgaW4gdVNlYyAqLworCV9fbGUzMiBjaGFubmVsX2xvYWQ7CS8qIGNvdW50cyBSWCBFbmFibGUgdGltZSBpbiB1U2VjICovCiAJX19sZTMyIGRzcF9mYWxzZV9hbGFybXM7CS8qIERTUCBmYWxzZSBhbGFybSAoYm90aCBPRkRNCiAJCQkJCSAqIGFuZCBDQ0spIGNvdW50ZXIgKi8KIAlfX2xlMzIgYmVhY29uX3Jzc2lfYTsKQEAgLTI4NzEsMjggKzI4NTEsMjggQEAKIAlfX2xlMzIgYmVhY29uX2VuZXJneV9jOwogfSBfX3BhY2tlZDsKIAotc3RydWN0IHN0YXRpc3RpY3NfcnggewotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSBvZmRtOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSBjY2s7Ci0Jc3RydWN0IHN0YXRpc3RpY3Nfcnhfbm9uX3BoeSBnZW5lcmFsOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X2h0X3BoeSBvZmRtX2h0Oworc3RydWN0IHN0YXRzX3J4IHsKKwlzdHJ1Y3Qgc3RhdHNfcnhfcGh5IG9mZG07CisJc3RydWN0IHN0YXRzX3J4X3BoeSBjY2s7CisJc3RydWN0IHN0YXRzX3J4X25vbl9waHkgZ2VuZXJhbDsKKwlzdHJ1Y3Qgc3RhdHNfcnhfaHRfcGh5IG9mZG1faHQ7CiB9IF9fcGFja2VkOwogCiAvKioKLSAqIHN0cnVjdCBzdGF0aXN0aWNzX3R4X3Bvd2VyIC0gY3VycmVudCB0eCBwb3dlcgorICogc3RydWN0IHN0YXRzX3R4X3Bvd2VyIC0gY3VycmVudCB0eCBwb3dlcgogICoKICAqIEBhbnRfYTogY3VycmVudCB0eCBwb3dlciBvbiBjaGFpbiBhIGluIDEvMiBkQiBzdGVwCiAgKiBAYW50X2I6IGN1cnJlbnQgdHggcG93ZXIgb24gY2hhaW4gYiBpbiAxLzIgZEIgc3RlcAogICogQGFudF9jOiBjdXJyZW50IHR4IHBvd2VyIG9uIGNoYWluIGMgaW4gMS8yIGRCIHN0ZXAKICAqLwotc3RydWN0IHN0YXRpc3RpY3NfdHhfcG93ZXIgeworc3RydWN0IHN0YXRzX3R4X3Bvd2VyIHsKIAl1OCBhbnRfYTsKIAl1OCBhbnRfYjsKIAl1OCBhbnRfYzsKIAl1OCByZXNlcnZlZDsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBzdGF0aXN0aWNzX3R4X25vbl9waHlfYWdnIHsKK3N0cnVjdCBzdGF0c190eF9ub25fcGh5X2FnZyB7CiAJX19sZTMyIGJhX3RpbWVvdXQ7CiAJX19sZTMyIGJhX3Jlc2NoZWR1bGVfZnJhbWVzOwogCV9fbGUzMiBzY2RfcXVlcnlfYWdnX2ZyYW1lX2NudDsKQEAgLTI5MDUsNyArMjg4NSw3IEBACiAJX19sZTMyIHJ4X2JhX3JzcF9jbnQ7CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3Qgc3RhdGlzdGljc190eCB7CitzdHJ1Y3Qgc3RhdHNfdHggewogCV9fbGUzMiBwcmVhbWJsZV9jbnQ7CiAJX19sZTMyIHJ4X2RldGVjdGVkX2NudDsKIAlfX2xlMzIgYnRfcHJpb19kZWZlcl9jbnQ7CkBAIC0yOTIwLDEzICsyOTAwLDEyIEBACiAJX19sZTMyIGJ1cnN0X2Fib3J0X21pc3NpbmdfbmV4dF9mcmFtZV9jbnQ7CiAJX19sZTMyIGN0c190aW1lb3V0X2NvbGxpc2lvbjsKIAlfX2xlMzIgYWNrX29yX2JhX3RpbWVvdXRfY29sbGlzaW9uOwotCXN0cnVjdCBzdGF0aXN0aWNzX3R4X25vbl9waHlfYWdnIGFnZzsKKwlzdHJ1Y3Qgc3RhdHNfdHhfbm9uX3BoeV9hZ2cgYWdnOwogCiAJX19sZTMyIHJlc2VydmVkMTsKIH0gX19wYWNrZWQ7CiAKLQotc3RydWN0IHN0YXRpc3RpY3NfZGl2IHsKK3N0cnVjdCBzdGF0c19kaXYgewogCV9fbGUzMiB0eF9vbl9hOwogCV9fbGUzMiB0eF9vbl9iOwogCV9fbGUzMiBleGVjX3RpbWU7CkBAIC0yOTM1LDE0ICsyOTE0LDE0IEBACiAJX19sZTMyIHJlc2VydmVkMjsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfY29tbW9uIHsKLQlfX2xlMzIgdGVtcGVyYXR1cmU7ICAgLyogcmFkaW8gdGVtcGVyYXR1cmUgKi8KLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgZGJnOworc3RydWN0IHN0YXRzX2dlbmVyYWxfY29tbW9uIHsKKwlfX2xlMzIgdGVtcGVyYXR1cmU7CS8qIHJhZGlvIHRlbXBlcmF0dXJlICovCisJc3RydWN0IHN0YXRzX2RiZyBkYmc7CiAJX19sZTMyIHNsZWVwX3RpbWU7CiAJX19sZTMyIHNsb3RzX291dDsKIAlfX2xlMzIgc2xvdHNfaWRsZTsKIAlfX2xlMzIgdHRsX3RpbWVzdGFtcDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19kaXYgZGl2OworCXN0cnVjdCBzdGF0c19kaXYgZGl2OwogCV9fbGUzMiByeF9lbmFibGVfY291bnRlcjsKIAkvKgogCSAqIG51bV9vZl9zb3Nfc3RhdGVzOgpAQCAtMjk1Miw3MyArMjkzMSw3MyBAQAogCV9fbGUzMiBudW1fb2Zfc29zX3N0YXRlczsKIH0gX19wYWNrZWQ7CiAKLXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWwgewotCXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfY29tbW9uIGNvbW1vbjsKK3N0cnVjdCBzdGF0c19nZW5lcmFsIHsKKwlzdHJ1Y3Qgc3RhdHNfZ2VuZXJhbF9jb21tb24gY29tbW9uOwogCV9fbGUzMiByZXNlcnZlZDI7CiAJX19sZTMyIHJlc2VydmVkMzsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgVUNPREVfU1RBVElTVElDU19DTEVBUl9NU0sJCSgweDEgPDwgMCkKLSNkZWZpbmUgVUNPREVfU1RBVElTVElDU19GUkVRVUVOQ1lfTVNLCQkoMHgxIDw8IDEpCi0jZGVmaW5lIFVDT0RFX1NUQVRJU1RJQ1NfTkFSUk9XX0JBTkRfTVNLCSgweDEgPDwgMikKKyNkZWZpbmUgVUNPREVfU1RBVFNfQ0xFQVJfTVNLCQkoMHgxIDw8IDApCisjZGVmaW5lIFVDT0RFX1NUQVRTX0ZSRVFVRU5DWV9NU0sJCSgweDEgPDwgMSkKKyNkZWZpbmUgVUNPREVfU1RBVFNfTkFSUk9XX0JBTkRfTVNLCSgweDEgPDwgMikKIAogLyoKLSAqIFJFUExZX1NUQVRJU1RJQ1NfQ01EID0gMHg5YywKKyAqIENfU1RBVFMgPSAweDljLAogICogYWxsIGRldmljZXMgaWRlbnRpY2FsLgogICoKLSAqIFRoaXMgY29tbWFuZCB0cmlnZ2VycyBhbiBpbW1lZGlhdGUgcmVzcG9uc2UgY29udGFpbmluZyB1Q29kZSBzdGF0aXN0aWNzLgotICogVGhlIHJlc3BvbnNlIGlzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyBTVEFUSVNUSUNTX05PVElGSUNBVElPTiAweDlkLCBiZWxvdy4KKyAqIFRoaXMgY29tbWFuZCB0cmlnZ2VycyBhbiBpbW1lZGlhdGUgcmVzcG9uc2UgY29udGFpbmluZyB1Q29kZSBzdGF0cy4KKyAqIFRoZSByZXNwb25zZSBpcyBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgTl9TVEFUUyAweDlkLCBiZWxvdy4KICAqCiAgKiBJZiB0aGUgQ0xFQVJfU1RBVFMgY29uZmlndXJhdGlvbiBmbGFnIGlzIHNldCwgdUNvZGUgd2lsbCBjbGVhciBpdHMKLSAqIGludGVybmFsIGNvcHkgb2YgdGhlIHN0YXRpc3RpY3MgKGNvdW50ZXJzKSBhZnRlciBpc3N1aW5nIHRoZSByZXNwb25zZS4KLSAqIFRoaXMgZmxhZyBkb2VzIG5vdCBhZmZlY3QgU1RBVElTVElDU19OT1RJRklDQVRJT05zIGFmdGVyIGJlYWNvbnMgKHNlZSBiZWxvdykuCisgKiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBzdGF0cyAoY291bnRlcnMpIGFmdGVyIGlzc3VpbmcgdGhlIHJlc3BvbnNlLgorICogVGhpcyBmbGFnIGRvZXMgbm90IGFmZmVjdCBOX1NUQVRTcyBhZnRlciBiZWFjb25zIChzZWUgYmVsb3cpLgogICoKICAqIElmIHRoZSBESVNBQkxFX05PVElGIGNvbmZpZ3VyYXRpb24gZmxhZyBpcyBzZXQsIHVDb2RlIHdpbGwgbm90IGlzc3VlCi0gKiBTVEFUSVNUSUNTX05PVElGSUNBVElPTnMgYWZ0ZXIgcmVjZWl2ZWQgYmVhY29ucyAoc2VlIGJlbG93KS4gIFRoaXMgZmxhZwotICogZG9lcyBub3QgYWZmZWN0IHRoZSByZXNwb25zZSB0byB0aGUgUkVQTFlfU1RBVElTVElDU19DTUQgMHg5YyBpdHNlbGYuCisgKiBOX1NUQVRTcyBhZnRlciByZWNlaXZlZCBiZWFjb25zIChzZWUgYmVsb3cpLiAgVGhpcyBmbGFnCisgKiBkb2VzIG5vdCBhZmZlY3QgdGhlIHJlc3BvbnNlIHRvIHRoZSBDX1NUQVRTIDB4OWMgaXRzZWxmLgogICovCi0jZGVmaW5lIElXTF9TVEFUU19DT05GX0NMRUFSX1NUQVRTIGNwdV90b19sZTMyKDB4MSkJLyogc2VlIGFib3ZlICovCi0jZGVmaW5lIElXTF9TVEFUU19DT05GX0RJU0FCTEVfTk9USUYgY3B1X3RvX2xlMzIoMHgyKS8qIHNlZSBhYm92ZSAqLwotc3RydWN0IGl3bF9zdGF0aXN0aWNzX2NtZCB7Ci0JX19sZTMyIGNvbmZpZ3VyYXRpb25fZmxhZ3M7CS8qIElXTF9TVEFUU19DT05GXyogKi8KKyNkZWZpbmUgSUxfU1RBVFNfQ09ORl9DTEVBUl9TVEFUUyBjcHVfdG9fbGUzMigweDEpCS8qIHNlZSBhYm92ZSAqLworI2RlZmluZSBJTF9TVEFUU19DT05GX0RJU0FCTEVfTk9USUYgY3B1X3RvX2xlMzIoMHgyKQkvKiBzZWUgYWJvdmUgKi8KK3N0cnVjdCBpbF9zdGF0c19jbWQgeworCV9fbGUzMiBjb25maWd1cmF0aW9uX2ZsYWdzOwkvKiBJTF9TVEFUU19DT05GXyogKi8KIH0gX19wYWNrZWQ7CiAKIC8qCi0gKiBTVEFUSVNUSUNTX05PVElGSUNBVElPTiA9IDB4OWQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQorICogTl9TVEFUUyA9IDB4OWQgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQogICoKICAqIEJ5IGRlZmF1bHQsIHVDb2RlIGlzc3VlcyB0aGlzIG5vdGlmaWNhdGlvbiBhZnRlciByZWNlaXZpbmcgYSBiZWFjb24KICAqIHdoaWxlIGFzc29jaWF0ZWQuICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IsIHNldCBESVNBQkxFX05PVElGIGZsYWcgaW4gdGhlCi0gKiBSRVBMWV9TVEFUSVNUSUNTX0NNRCAweDljLCBhYm92ZS4KKyAqIENfU1RBVFMgMHg5YywgYWJvdmUuCiAgKgogICogU3RhdGlzdGljcyBjb3VudGVycyBjb250aW51ZSB0byBpbmNyZW1lbnQgYmVhY29uIGFmdGVyIGJlYWNvbiwgYnV0IGFyZQotICogY2xlYXJlZCB3aGVuIGNoYW5naW5nIGNoYW5uZWxzIG9yIHdoZW4gZHJpdmVyIGlzc3VlcyBSRVBMWV9TVEFUSVNUSUNTX0NNRAorICogY2xlYXJlZCB3aGVuIGNoYW5naW5nIGNoYW5uZWxzIG9yIHdoZW4gZHJpdmVyIGlzc3VlcyBDX1NUQVRTCiAgKiAweDljIHdpdGggQ0xFQVJfU1RBVFMgYml0IHNldCAoc2VlIGFib3ZlKS4KICAqCi0gKiB1Q29kZSBhbHNvIGlzc3VlcyB0aGlzIG5vdGlmaWNhdGlvbiBkdXJpbmcgc2NhbnMuICB1Q29kZSBjbGVhcnMgc3RhdGlzdGljcwotICogYXBwcm9wcmlhdGVseSBzbyB0aGF0IGVhY2ggbm90aWZpY2F0aW9uIGNvbnRhaW5zIHN0YXRpc3RpY3MgZm9yIG9ubHkgdGhlCisgKiB1Q29kZSBhbHNvIGlzc3VlcyB0aGlzIG5vdGlmaWNhdGlvbiBkdXJpbmcgc2NhbnMuICB1Q29kZSBjbGVhcnMgc3RhdHMKKyAqIGFwcHJvcHJpYXRlbHkgc28gdGhhdCBlYWNoIG5vdGlmaWNhdGlvbiBjb250YWlucyBzdGF0cyBmb3Igb25seSB0aGUKICAqIG9uZSBjaGFubmVsIHRoYXQgaGFzIGp1c3QgYmVlbiBzY2FubmVkLgogICovCi0jZGVmaW5lIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0JBTkRfMjRHX01TSyAgICAgICAgIGNwdV90b19sZTMyKDB4MikKLSNkZWZpbmUgU1RBVElTVElDU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSyAgICAgICAgY3B1X3RvX2xlMzIoMHg4KQorI2RlZmluZSBTVEFUU19SRVBMWV9GTEdfQkFORF8yNEdfTVNLICAgICAgICAgY3B1X3RvX2xlMzIoMHgyKQorI2RlZmluZSBTVEFUU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSyAgICAgICAgY3B1X3RvX2xlMzIoMHg4KQogCi1zdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzIHsKK3N0cnVjdCBpbDM5NDVfbm90aWZfc3RhdHMgewogCV9fbGUzMiBmbGFnOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4IHJ4OwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3R4IHR4OwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2dlbmVyYWwgZ2VuZXJhbDsKKwlzdHJ1Y3QgaXdsMzlfc3RhdHNfcnggcng7CisJc3RydWN0IGl3bDM5X3N0YXRzX3R4IHR4OworCXN0cnVjdCBpd2wzOV9zdGF0c19nZW5lcmFsIGdlbmVyYWw7CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3Mgeworc3RydWN0IGlsX25vdGlmX3N0YXRzIHsKIAlfX2xlMzIgZmxhZzsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeCByeDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc190eCB0eDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsIGdlbmVyYWw7CisJc3RydWN0IHN0YXRzX3J4IHJ4OworCXN0cnVjdCBzdGF0c190eCB0eDsKKwlzdHJ1Y3Qgc3RhdHNfZ2VuZXJhbCBnZW5lcmFsOwogfSBfX3BhY2tlZDsKIAogLyoKLSAqIE1JU1NFRF9CRUFDT05TX05PVElGSUNBVElPTiA9IDB4YTIgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQorICogTl9NSVNTRURfQkVBQ09OUyA9IDB4YTIgKG5vdGlmaWNhdGlvbiBvbmx5LCBub3QgYSBjb21tYW5kKQogICoKLSAqIHVDb2RlIHNlbmQgTUlTU0VEX0JFQUNPTlNfTk9USUZJQ0FUSU9OIHRvIGRyaXZlciB3aGVuIGRldGVjdCBiZWFjb24gbWlzc2VkCisgKiB1Q29kZSBzZW5kIE5fTUlTU0VEX0JFQUNPTlMgdG8gZHJpdmVyIHdoZW4gZGV0ZWN0IGJlYWNvbiBtaXNzZWQKICAqIGluIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgbWlzc2VkIGJlYWNvbnMsIHdoaWNoIG1lYW4gd2hlbiBkcml2ZXIgcmVjZWl2ZSB0aGUKICAqIG5vdGlmaWNhdGlvbiwgaW5zaWRlIHRoZSBjb21tYW5kLCBpdCBjYW4gZmluZCBhbGwgdGhlIGJlYWNvbnMgaW5mb3JtYXRpb24KICAqIHdoaWNoIGluY2x1ZGUgbnVtYmVyIG9mIHRvdGFsIG1pc3NlZCBiZWFjb25zLCBudW1iZXIgb2YgY29uc2VjdXRpdmUgbWlzc2VkCkBAIC0zMDM1LDE4ICszMDE0LDE3IEBACiAgKgogICovCiAKLSNkZWZpbmUgSVdMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX01JTgkoMSkKLSNkZWZpbmUgSVdMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX0RFRgkoNSkKLSNkZWZpbmUgSVdMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX01BWAlJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGCisjZGVmaW5lIElMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX01JTgkoMSkKKyNkZWZpbmUgSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGCSg1KQorI2RlZmluZSBJTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9NQVgJSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGCiAKLXN0cnVjdCBpd2xfbWlzc2VkX2JlYWNvbl9ub3RpZiB7CitzdHJ1Y3QgaWxfbWlzc2VkX2JlYWNvbl9ub3RpZiB7CiAJX19sZTMyIGNvbnNlY3V0aXZlX21pc3NlZF9iZWFjb25zOwogCV9fbGUzMiB0b3RhbF9taXNzZWRfYmVjb25zOwogCV9fbGUzMiBudW1fZXhwZWN0ZWRfYmVhY29uczsKIAlfX2xlMzIgbnVtX3JlY3ZkX2JlYWNvbnM7CiB9IF9fcGFja2VkOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICgxMSkKICAqIFJ4IENhbGlicmF0aW9uIENvbW1hbmRzOgpAQCAtMzA2Miw3ICszMDQwLDcgQEAKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqCi0gKiBTRU5TSVRJVklUWV9DTUQgPSAweGE4IChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKiBDX1NFTlNJVElWSVRZID0gMHhhOCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQogICoKICAqIFRoaXMgY29tbWFuZCBzZXRzIHVwIHRoZSBSeCBzaWduYWwgZGV0ZWN0b3IgZm9yIGEgc2Vuc2l0aXZpdHkgbGV2ZWwgdGhhdAogICogaXMgaGlnaCBlbm91Z2ggdG8gbG9jayBvbnRvIGFsbCBzaWduYWxzIHdpdGhpbiB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrLApAQCAtMzA3NiwxMiArMzA1NCwxMiBAQAogICogdGltZSBsaXN0ZW5pbmcsIG5vdCB0cmFuc21pdHRpbmcpLiAgRHJpdmVyIG11c3QgYWRqdXN0IHNlbnNpdGl2aXR5IHNvIHRoYXQKICAqIHRoZSByYXRpbyBvZiBhY3R1YWwgZmFsc2UgYWxhcm1zIHRvIGFjdHVhbCBSeCB0aW1lIGZhbGxzIHdpdGhpbiB0aGlzIHJhbmdlLgogICoKLSAqIFdoaWxlIGFzc29jaWF0ZWQsIHVDb2RlIGRlbGl2ZXJzIFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OcyBhZnRlciBlYWNoCisgKiBXaGlsZSBhc3NvY2lhdGVkLCB1Q29kZSBkZWxpdmVycyBOX1NUQVRTcyBhZnRlciBlYWNoCiAgKiByZWNlaXZlZCBiZWFjb24uICBUaGVzZSBwcm92aWRlIGluZm9ybWF0aW9uIHRvIHRoZSBkcml2ZXIgdG8gYW5hbHl6ZSB0aGUKLSAqIHNlbnNpdGl2aXR5LiAgRG9uJ3QgYW5hbHl6ZSBzdGF0aXN0aWNzIHRoYXQgY29tZSBpbiBmcm9tIHNjYW5uaW5nLCBvciBhbnkKLSAqIG90aGVyIG5vbi1hc3NvY2lhdGVkLW5ldHdvcmsgc291cmNlLiAgUGVydGluZW50IHN0YXRpc3RpY3MgaW5jbHVkZToKKyAqIHNlbnNpdGl2aXR5LiAgRG9uJ3QgYW5hbHl6ZSBzdGF0cyB0aGF0IGNvbWUgaW4gZnJvbSBzY2FubmluZywgb3IgYW55CisgKiBvdGhlciBub24tYXNzb2NpYXRlZC1uZXR3b3JrIHNvdXJjZS4gIFBlcnRpbmVudCBzdGF0cyBpbmNsdWRlOgogICoKLSAqIEZyb20gImdlbmVyYWwiIHN0YXRpc3RpY3MgKHN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkpOgorICogRnJvbSAiZ2VuZXJhbCIgc3RhdHMgKHN0cnVjdCBzdGF0c19yeF9ub25fcGh5KToKICAqCiAgKiAoYmVhY29uX2VuZXJneV9bYWJjXSAmIDB4MEZGMDApID4+IDggKHVuc2lnbmVkLCBoaWdoZXIgdmFsdWUgaXMgbG93ZXIgbGV2ZWwpCiAgKiAgIE1lYXN1cmUgb2YgZW5lcmd5IG9mIGRlc2lyZWQgc2lnbmFsLiAgVXNlZCBmb3IgZXN0YWJsaXNoaW5nIGEgbGV2ZWwKQEAgLTMwOTQsNyArMzA3Miw3IEBACiAgKiAgIHVTZWNzIG9mIGFjdHVhbCBSeCB0aW1lIGR1cmluZyBiZWFjb24gcGVyaW9kICh2YXJpZXMgYWNjb3JkaW5nIHRvCiAgKiAgIGhvdyBtdWNoIHRpbWUgd2FzIHNwZW50IHRyYW5zbWl0dGluZykuCiAgKgotICogRnJvbSAiY2NrIiBhbmQgIm9mZG0iIHN0YXRpc3RpY3MgKHN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSksIHNlcGFyYXRlbHk6CisgKiBGcm9tICJjY2siIGFuZCAib2ZkbSIgc3RhdHMgKHN0cnVjdCBzdGF0c19yeF9waHkpLCBzZXBhcmF0ZWx5OgogICoKICAqIGZhbHNlX2FsYXJtX2NudAogICogICBTaWduYWwgbG9ja3MgYWJhbmRvbmVkIGVhcmx5IChiZWZvcmUgcGh5LWxldmVsIGhlYWRlcikuCkBAIC0zMTExLDE1ICszMDg5LDE1IEBACiAgKgogICogVG90YWwgbnVtYmVyIG9mIGZhbHNlIGFsYXJtcyA9IGZhbHNlX2FsYXJtcyArIHBsY3BfZXJycwogICoKLSAqIEZvciBPRkRNLCBhZGp1c3QgdGhlIGZvbGxvd2luZyB0YWJsZSBlbnRyaWVzIGluIHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfY21kCisgKiBGb3IgT0ZETSwgYWRqdXN0IHRoZSBmb2xsb3dpbmcgdGFibGUgZW50cmllcyBpbiBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfY21kCiAgKiAobm90aWNlIHRoYXQgdGhlIHN0YXJ0IHBvaW50cyBmb3IgT0ZETSBhcmUgYXQgb3IgY2xvc2UgdG8gc2V0dGluZ3MgZm9yCiAgKiBtYXhpbXVtIHNlbnNpdGl2aXR5KToKICAqCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVJUICAvICBNSU4gIC8gIE1BWAotICogICBIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX0lOREVYICAgICAgICAgIDkwICAgLyAgIDg1ICAvICAxMjAKLSAqICAgSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9NUkNfSU5ERVggICAgIDE3MCAgIC8gIDE3MCAgLyAgMjEwCi0gKiAgIEhEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fSU5ERVggICAgICAgICAxMDUgICAvICAxMDUgIC8gIDE0MAotICogICBIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX01SQ19JTkRFWCAgICAgMjIwICAgLyAgMjIwICAvICAyNzAKKyAqICAgSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9JRFggICAgICAgICAgOTAgICAvICAgODUgIC8gIDEyMAorICogICBIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JRFggICAgIDE3MCAgIC8gIDE3MCAgLyAgMjEwCisgKiAgIEhEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fSURYICAgICAgICAgMTA1ICAgLyAgMTA1ICAvICAxNDAKKyAqICAgSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9NUkNfSURYICAgICAyMjAgICAvICAyMjAgIC8gIDI3MAogICoKICAqICAgSWYgYWN0dWFsIHJhdGUgb2YgT0ZETSBmYWxzZSBhbGFybXMgKCsgcGxjcF9lcnJvcnMpIGlzIHRvbyBoaWdoCiAgKiAgIChncmVhdGVyIHRoYW4gNTAgZm9yIGVhY2ggMjA0LjggbXNlY3MgbGlzdGVuaW5nKSwgcmVkdWNlIHNlbnNpdGl2aXR5CkBAIC0zMTUyLDMwICszMTMwLDMwIEBACiAgKiAgICAgICAgUmVzZXQgdGhpcyB0byAwIGF0IHRoZSBmaXJzdCBiZWFjb24gcGVyaW9kIHRoYXQgZmFsbHMgd2l0aGluIHRoZQogICogICAgICAgICJnb29kIiByYW5nZSAoNSB0byA1MCBmYWxzZSBhbGFybXMgcGVyIDIwNC44IG1pbGxpc2Vjb25kcyByeCkuCiAgKgotICogVGhlbiwgYWRqdXN0IHRoZSBmb2xsb3dpbmcgQ0NLIHRhYmxlIGVudHJpZXMgaW4gc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQKKyAqIFRoZW4sIGFkanVzdCB0aGUgZm9sbG93aW5nIENDSyB0YWJsZSBlbnRyaWVzIGluIHN0cnVjdCBpbF9zZW5zaXRpdml0eV9jbWQKICAqIChub3RpY2UgdGhhdCB0aGUgc3RhcnQgcG9pbnRzIGZvciBDQ0sgYXJlIGF0IG1heGltdW0gc2Vuc2l0aXZpdHkpOgogICoKICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RBUlQgIC8gIE1JTiAgLyAgTUFYCi0gKiAgIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSU5ERVggICAgICAgICAxMjUgICAvICAxMjUgIC8gIDIwMAotICogICBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX01SQ19JTkRFWCAgICAgMjAwICAgLyAgMjAwICAvICA0MDAKLSAqICAgSERfTUlOX0VORVJHWV9DQ0tfREVUX0lOREVYICAgICAgICAgICAgICAgIDEwMCAgIC8gICAgMCAgLyAgMTAwCisgKiAgIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSURYICAgICAgICAgMTI1ICAgLyAgMTI1ICAvICAyMDAKKyAqICAgSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSURYICAgICAyMDAgICAvICAyMDAgIC8gIDQwMAorICogICBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSURYICAgICAgICAgICAgICAgIDEwMCAgIC8gICAgMCAgLyAgMTAwCiAgKgogICogICBJZiBhY3R1YWwgcmF0ZSBvZiBDQ0sgZmFsc2UgYWxhcm1zICgrIHBsY3BfZXJyb3JzKSBpcyB0b28gaGlnaAogICogICAoZ3JlYXRlciB0aGFuIDUwIGZvciBlYWNoIDIwNC44IG1zZWNzIGxpc3RlbmluZyksIG1ldGhvZCBmb3IgcmVkdWNpbmcKICAqICAgc2Vuc2l0aXZpdHkgaXM6CiAgKgotICogICAxKSAgKkFkZCogMyB0byB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX01SQ19JTkRFWCwKKyAqICAgMSkgICpBZGQqIDMgdG8gdmFsdWUgaW4gSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSURYLAogICogICAgICAgdXAgdG8gbWF4IDQwMC4KICAqCi0gKiAgIDIpICBJZiBjdXJyZW50IHZhbHVlIGluIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSU5ERVggaXMgPCAxNjAsCisgKiAgIDIpICBJZiBjdXJyZW50IHZhbHVlIGluIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSURYIGlzIDwgMTYwLAogICogICAgICAgc2Vuc2l0aXZpdHkgaGFzIGJlZW4gcmVkdWNlZCBhIHNpZ25pZmljYW50IGFtb3VudDsgYnJpbmcgaXQgdXAgdG8KICAqICAgICAgIGEgbW9kZXJhdGUgMTYxLiAgT3RoZXJ3aXNlLCAqYWRkKiAzLCB1cCB0byBtYXggMjAwLgogICoKLSAqICAgMykgIGEpICBJZiBjdXJyZW50IHZhbHVlIGluIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSU5ERVggaXMgPiAxNjAsCisgKiAgIDMpICBhKSAgSWYgY3VycmVudCB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lEWCBpcyA+IDE2MCwKICAqICAgICAgIHNlbnNpdGl2aXR5IGhhcyBiZWVuIHJlZHVjZWQgb25seSBhIG1vZGVyYXRlIG9yIHNtYWxsIGFtb3VudDsKLSAqICAgICAgICpzdWJ0cmFjdCogMiBmcm9tIHZhbHVlIGluIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JTkRFWCwKKyAqICAgICAgICpzdWJ0cmFjdCogMiBmcm9tIHZhbHVlIGluIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JRFgsCiAgKiAgICAgICBkb3duIHRvIG1pbiAwLiAgT3RoZXJ3aXNlIChpZiBnYWluIGhhcyBiZWVuIHNpZ25pZmljYW50bHkgcmVkdWNlZCksCi0gKiAgICAgICBkb24ndCBjaGFuZ2UgdGhlIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JTkRFWCB2YWx1ZS4KKyAqICAgICAgIGRvbid0IGNoYW5nZSB0aGUgSERfTUlOX0VORVJHWV9DQ0tfREVUX0lEWCB2YWx1ZS4KICAqCiAgKiAgICAgICBiKSAgU2F2ZSBhIHNuYXBzaG90IG9mIHRoZSAic2lsZW5jZSByZWZlcmVuY2UiLgogICoKQEAgLTMxOTEsMTMgKzMxNjksMTMgQEAKICAqCiAgKiAgIE1ldGhvZCBmb3IgaW5jcmVhc2luZyBzZW5zaXRpdml0eToKICAqCi0gKiAgIDEpICAqU3VidHJhY3QqIDMgZnJvbSB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lOREVYLAorICogICAxKSAgKlN1YnRyYWN0KiAzIGZyb20gdmFsdWUgaW4gSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9JRFgsCiAgKiAgICAgICBkb3duIHRvIG1pbiAxMjUuCiAgKgotICogICAyKSAgKlN1YnRyYWN0KiAzIGZyb20gdmFsdWUgaW4gSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSU5ERVgsCisgKiAgIDIpICAqU3VidHJhY3QqIDMgZnJvbSB2YWx1ZSBpbiBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX01SQ19JRFgsCiAgKiAgICAgICBkb3duIHRvIG1pbiAyMDAuCiAgKgotICogICAzKSAgKkFkZCogMiB0byB2YWx1ZSBpbiBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSU5ERVgsIHVwIHRvIG1heCAxMDAuCisgKiAgIDMpICAqQWRkKiAyIHRvIHZhbHVlIGluIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JRFgsIHVwIHRvIG1heCAxMDAuCiAgKgogICogICBJZiBhY3R1YWwgcmF0ZSBvZiBDQ0sgZmFsc2UgYWxhcm1zICgrIHBsY3BfZXJyb3JzKSBpcyB3aXRoaW4gZ29vZCByYW5nZQogICogICAoYmV0d2VlbiA1IGFuZCA1MCBmb3IgZWFjaCAyMDQuOCBtc2VjcyBsaXN0ZW5pbmcpOgpAQCAtMzIwNiw1NyArMzE4NCw1NiBAQAogICoKICAqICAgMikgIElmIHByZXZpb3VzIGJlYWNvbiBoYWQgdG9vIG1hbnkgQ0NLIGZhbHNlIGFsYXJtcyAoKyBwbGNwX2Vycm9ycyksCiAgKiAgICAgICBnaXZlIHNvbWUgZXh0cmEgbWFyZ2luIHRvIGVuZXJneSB0aHJlc2hvbGQgYnkgKnN1YnRyYWN0aW5nKiA4Ci0gKiAgICAgICBmcm9tIHZhbHVlIGluIEhEX01JTl9FTkVSR1lfQ0NLX0RFVF9JTkRFWC4KKyAqICAgICAgIGZyb20gdmFsdWUgaW4gSERfTUlOX0VORVJHWV9DQ0tfREVUX0lEWC4KICAqCiAgKiAgIEZvciBhbGwgY2FzZXMgKHRvbyBmZXcsIHRvbyBtYW55LCBnb29kIHJhbmdlKSwgbWFrZSBzdXJlIHRoYXQgdGhlIENDSwogICogICBkZXRlY3Rpb24gdGhyZXNob2xkIChlbmVyZ3kpIGlzIGJlbG93IHRoZSBlbmVyZ3kgbGV2ZWwgZm9yIHJvYnVzdAogICogICBkZXRlY3Rpb24gb3ZlciB0aGUgcGFzdCAxMCBiZWFjb24gcGVyaW9kcywgdGhlICJNYXggY2NrIGVuZXJneSIuCiAgKiAgIExvd2VyIHZhbHVlcyBtZWFuIGhpZ2hlciBlbmVyZ3k7IHRoaXMgbWVhbnMgbWFraW5nIHN1cmUgdGhhdCB0aGUgdmFsdWUKLSAqICAgaW4gSERfTUlOX0VORVJHWV9DQ0tfREVUX0lOREVYIGlzIGF0IG9yICphYm92ZSogIk1heCBjY2sgZW5lcmd5Ii4KKyAqICAgaW4gSERfTUlOX0VORVJHWV9DQ0tfREVUX0lEWCBpcyBhdCBvciAqYWJvdmUqICJNYXggY2NrIGVuZXJneSIuCiAgKgogICovCiAKIC8qCi0gKiBUYWJsZSBlbnRyaWVzIGluIFNFTlNJVElWSVRZX0NNRCAoc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQpCisgKiBUYWJsZSBlbnRyaWVzIGluIENfU0VOU0lUSVZJVFkgKHN0cnVjdCBpbF9zZW5zaXRpdml0eV9jbWQpCiAgKi8KLSNkZWZpbmUgSERfVEFCTEVfU0laRSAgKDExKQkvKiBudW1iZXIgb2YgZW50cmllcyAqLwotI2RlZmluZSBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSU5ERVggICAgICAgICAgICAgICAgICgwKQkvKiB0YWJsZSBpbmRleGVzICovCi0jZGVmaW5lIEhEX01JTl9FTkVSR1lfT0ZETV9ERVRfSU5ERVggICAgICAgICAgICAgICAgKDEpCi0jZGVmaW5lIEhEX0FVVE9fQ09SUjMyX1gxX1RIX0FERF9NSU5fSU5ERVggICAgICAgICAgKDIpCi0jZGVmaW5lIEhEX0FVVE9fQ09SUjMyX1gxX1RIX0FERF9NSU5fTVJDX0lOREVYICAgICAgKDMpCi0jZGVmaW5lIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fTVJDX0lOREVYICAgICAgKDQpCi0jZGVmaW5lIEhEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fSU5ERVggICAgICAgICAgKDUpCi0jZGVmaW5lIEhEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fTVJDX0lOREVYICAgICAgKDYpCi0jZGVmaW5lIEhEX0JBUktFUl9DT1JSX1RIX0FERF9NSU5fSU5ERVggICAgICAgICAgICAgKDcpCi0jZGVmaW5lIEhEX0JBUktFUl9DT1JSX1RIX0FERF9NSU5fTVJDX0lOREVYICAgICAgICAgKDgpCi0jZGVmaW5lIEhEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fSU5ERVggICAgICAgICAgKDkpCi0jZGVmaW5lIEhEX09GRE1fRU5FUkdZX1RIX0lOX0lOREVYICAgICAgICAgICAgICAgICAgKDEwKQorI2RlZmluZSBIRF9UQkxfU0laRSAgKDExKQkvKiBudW1iZXIgb2YgZW50cmllcyAqLworI2RlZmluZSBIRF9NSU5fRU5FUkdZX0NDS19ERVRfSURYICAgICAgICAgICAgICAgICAoMCkJLyogdGFibGUgaWR4ZXMgKi8KKyNkZWZpbmUgSERfTUlOX0VORVJHWV9PRkRNX0RFVF9JRFggICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIEhEX0FVVE9fQ09SUjMyX1gxX1RIX0FERF9NSU5fSURYICAgICAgICAgICgyKQorI2RlZmluZSBIRF9BVVRPX0NPUlIzMl9YMV9USF9BRERfTUlOX01SQ19JRFggICAgICAoMykKKyNkZWZpbmUgSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9NUkNfSURYICAgICAgKDQpCisjZGVmaW5lIEhEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fSURYICAgICAgICAgICg1KQorI2RlZmluZSBIRF9BVVRPX0NPUlIzMl9YNF9USF9BRERfTUlOX01SQ19JRFggICAgICAoNikKKyNkZWZpbmUgSERfQkFSS0VSX0NPUlJfVEhfQUREX01JTl9JRFggICAgICAgICAgICAgKDcpCisjZGVmaW5lIEhEX0JBUktFUl9DT1JSX1RIX0FERF9NSU5fTVJDX0lEWCAgICAgICAgICg4KQorI2RlZmluZSBIRF9BVVRPX0NPUlI0MF9YNF9USF9BRERfTUlOX0lEWCAgICAgICAgICAoOSkKKyNkZWZpbmUgSERfT0ZETV9FTkVSR1lfVEhfSU5fSURYICAgICAgICAgICAgICAgICAgKDEwKQogCi0vKiBDb250cm9sIGZpZWxkIGluIHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfY21kICovCi0jZGVmaW5lIFNFTlNJVElWSVRZX0NNRF9DT05UUk9MX0RFRkFVTFRfVEFCTEUJY3B1X3RvX2xlMTYoMCkKLSNkZWZpbmUgU0VOU0lUSVZJVFlfQ01EX0NPTlRST0xfV09SS19UQUJMRQljcHVfdG9fbGUxNigxKQorLyogQ29udHJvbCBmaWVsZCBpbiBzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfY21kICovCisjZGVmaW5lIENfU0VOU0lUSVZJVFlfQ09OVFJPTF9ERUZBVUxUX1RCTAljcHVfdG9fbGUxNigwKQorI2RlZmluZSBDX1NFTlNJVElWSVRZX0NPTlRST0xfV09SS19UQkwJY3B1X3RvX2xlMTYoMSkKIAogLyoqCi0gKiBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2NtZAorICogc3RydWN0IGlsX3NlbnNpdGl2aXR5X2NtZAogICogQGNvbnRyb2w6ICAoMSkgdXBkYXRlcyB3b3JraW5nIHRhYmxlLCAoMCkgdXBkYXRlcyBkZWZhdWx0IHRhYmxlCi0gKiBAdGFibGU6ICBlbmVyZ3kgdGhyZXNob2xkIHZhbHVlcywgdXNlIEhEXyogYXMgaW5kZXggaW50byB0YWJsZQorICogQHRhYmxlOiAgZW5lcmd5IHRocmVzaG9sZCB2YWx1ZXMsIHVzZSBIRF8qIGFzIGlkeCBpbnRvIHRhYmxlCiAgKgogICogQWx3YXlzIHVzZSAiMSIgaW4gImNvbnRyb2wiIHRvIHVwZGF0ZSB1Q29kZSdzIHdvcmtpbmcgdGFibGUgYW5kIERTUC4KICAqLwotc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQgewotCV9fbGUxNiBjb250cm9sOwkJCS8qIGFsd2F5cyB1c2UgIjEiICovCi0JX19sZTE2IHRhYmxlW0hEX1RBQkxFX1NJWkVdOwkvKiB1c2UgSERfKiBhcyBpbmRleCAqLworc3RydWN0IGlsX3NlbnNpdGl2aXR5X2NtZCB7CisJX19sZTE2IGNvbnRyb2w7CQkvKiBhbHdheXMgdXNlICIxIiAqLworCV9fbGUxNiB0YWJsZVtIRF9UQkxfU0laRV07CS8qIHVzZSBIRF8qIGFzIGlkeCAqLwogfSBfX3BhY2tlZDsKIAotCiAvKioKLSAqIFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQgPSAweGIwIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCisgKiBDX1BIWV9DQUxJQlJBVElPTiA9IDB4YjAgKGNvbW1hbmQsIGhhcyBzaW1wbGUgZ2VuZXJpYyByZXNwb25zZSkKICAqCiAgKiBUaGlzIGNvbW1hbmQgc2V0cyB0aGUgcmVsYXRpdmUgZ2FpbnMgb2YgNDk2NSBkZXZpY2UncyAzIHJhZGlvIHJlY2VpdmVyIGNoYWlucy4KICAqCiAgKiBBZnRlciB0aGUgZmlyc3QgYXNzb2NpYXRpb24sIGRyaXZlciBzaG91bGQgYWNjdW11bGF0ZSBzaWduYWwgYW5kIG5vaXNlCi0gKiBzdGF0aXN0aWNzIGZyb20gdGhlIFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OcyB0aGF0IGZvbGxvdyB0aGUgZmlyc3QgMjAKLSAqIGJlYWNvbnMgZnJvbSB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrIChkb24ndCBjb2xsZWN0IHN0YXRpc3RpY3MgdGhhdCBjb21lCisgKiBzdGF0cyBmcm9tIHRoZSBOX1NUQVRTcyB0aGF0IGZvbGxvdyB0aGUgZmlyc3QgMjAKKyAqIGJlYWNvbnMgZnJvbSB0aGUgYXNzb2NpYXRlZCBuZXR3b3JrIChkb24ndCBjb2xsZWN0IHN0YXRzIHRoYXQgY29tZQogICogaW4gZnJvbSBzY2FubmluZywgb3IgYW55IG90aGVyIG5vbi1uZXR3b3JrIHNvdXJjZSkuCiAgKgogICogRElTQ09OTkVDVEVEIEFOVEVOTkE6CkBAIC0zMjY0LDcgKzMyNDEsNyBAQAogICogRHJpdmVyIHNob3VsZCBkZXRlcm1pbmUgd2hpY2ggYW50ZW5uYXMgYXJlIGFjdHVhbGx5IGNvbm5lY3RlZCwgYnkgY29tcGFyaW5nCiAgKiBhdmVyYWdlIGJlYWNvbiBzaWduYWwgbGV2ZWxzIGZvciB0aGUgMyBSeCBjaGFpbnMuICBBY2N1bXVsYXRlIChhZGQpIHRoZQogICogZm9sbG93aW5nIHZhbHVlcyBvdmVyIDIwIGJlYWNvbnMsIG9uZSBhY2N1bXVsYXRvciBmb3IgZWFjaCBvZiB0aGUgY2hhaW5zCi0gKiBhL2IvYywgZnJvbSBzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5OgorICogYS9iL2MsIGZyb20gc3RydWN0IHN0YXRzX3J4X25vbl9waHk6CiAgKgogICogYmVhY29uX3Jzc2lfW2FiY10gJiAweDBGRiAodW5zaWduZWQsIHVuaXRzIGluIGRCKQogICoKQEAgLTMyODMsNyArMzI2MCw3IEBACiAgKiB0byBhbnRlbm5hcywgc2VlIGFib3ZlKSBmb3IgZ2FpbiwgYnkgY29tcGFyaW5nIHRoZSBhdmVyYWdlIHNpZ25hbCBsZXZlbHMKICAqIGRldGVjdGVkIGR1cmluZyB0aGUgc2lsZW5jZSBhZnRlciBlYWNoIGJlYWNvbiAoYmFja2dyb3VuZCBub2lzZSkuCiAgKiBBY2N1bXVsYXRlIChhZGQpIHRoZSBmb2xsb3dpbmcgdmFsdWVzIG92ZXIgMjAgYmVhY29ucywgb25lIGFjY3VtdWxhdG9yIGZvcgotICogZWFjaCBvZiB0aGUgY2hhaW5zIGEvYi9jLCBmcm9tIHN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHk6CisgKiBlYWNoIG9mIHRoZSBjaGFpbnMgYS9iL2MsIGZyb20gc3RydWN0IHN0YXRzX3J4X25vbl9waHk6CiAgKgogICogYmVhY29uX3NpbGVuY2VfcnNzaV9bYWJjXSAmIDB4MEZGICh1bnNpZ25lZCwgdW5pdHMgaW4gZEIpCiAgKgpAQCAtMzI5NCw3ICszMjcxLDcgQEAKICAqIChhY2N1bV9ub2lzZVtpXSAtIGFjY3VtX25vaXNlW3JlZmVyZW5jZV0pIC8gMzAKICAqCiAgKiBUaGUgIjMwIiBhZGp1c3RzIHRoZSBkQiBpbiB0aGUgMjAgYWNjdW11bGF0ZWQgc2FtcGxlcyB0byB1bml0cyBvZiAxLjUgZEIuCi0gKiBGb3IgdXNlIGluIGRpZmZfZ2Fpbl9bYWJjXSBmaWVsZHMgb2Ygc3RydWN0IGl3bF9jYWxpYnJhdGlvbl9jbWQsIHRoZQorICogRm9yIHVzZSBpbiBkaWZmX2dhaW5fW2FiY10gZmllbGRzIG9mIHN0cnVjdCBpbF9jYWxpYnJhdGlvbl9jbWQsIHRoZQogICogZHJpdmVyIHNob3VsZCBsaW1pdCB0aGUgZGlmZmVyZW5jZSByZXN1bHRzIHRvIGEgcmFuZ2Ugb2YgMC0zICgwLTQuNSBkQiksCiAgKiBhbmQgc2V0IGJpdCAyIHRvIGluZGljYXRlICJyZWR1Y2UgZ2FpbiIuICBUaGUgdmFsdWUgZm9yIHRoZSByZWZlcmVuY2UKICAqICh3ZWFrZXN0KSBjaGFpbiBzaG91bGQgYmUgIjAiLgpAQCAtMzMwNiwyNCArMzI4MywyNCBAQAogCiAvKiBQaHkgY2FsaWJyYXRpb24gY29tbWFuZCBmb3Igc2VyaWVzICovCiAvKiBUaGUgZGVmYXVsdCBjYWxpYnJhdGUgdGFibGUgc2l6ZSBpZiBub3Qgc3BlY2lmaWVkIGJ5IGZpcm13YXJlICovCi0jZGVmaW5lIElXTF9ERUZBVUxUX1NUQU5EQVJEX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkUJMTgKKyNkZWZpbmUgSUxfREVGQVVMVF9TVEFOREFSRF9QSFlfQ0FMSUJSQVRFX1RCTF9TSVpFCTE4CiBlbnVtIHsKLQlJV0xfUEhZX0NBTElCUkFURV9ESUZGX0dBSU5fQ01ECQk9IDcsCi0JSVdMX01BWF9TVEFOREFSRF9QSFlfQ0FMSUJSQVRFX1RCTF9TSVpFCT0gMTksCisJSUxfUEhZX0NBTElCUkFURV9ESUZGX0dBSU5fQ01EID0gNywKKwlJTF9NQVhfU1RBTkRBUkRfUEhZX0NBTElCUkFURV9UQkxfU0laRSA9IDE5LAogfTsKIAotI2RlZmluZSBJV0xfTUFYX1BIWV9DQUxJQlJBVEVfVEJMX1NJWkUJCSgyNTMpCisjZGVmaW5lIElMX01BWF9QSFlfQ0FMSUJSQVRFX1RCTF9TSVpFCQkoMjUzKQogCi1zdHJ1Y3QgaXdsX2NhbGliX2hkciB7CitzdHJ1Y3QgaWxfY2FsaWJfaGRyIHsKIAl1OCBvcF9jb2RlOwogCXU4IGZpcnN0X2dyb3VwOwogCXU4IGdyb3Vwc19udW07CiAJdTggZGF0YV92YWxpZDsKIH0gX19wYWNrZWQ7CiAKLS8qIElXTF9QSFlfQ0FMSUJSQVRFX0RJRkZfR0FJTl9DTUQgKDcpICovCi1zdHJ1Y3QgaXdsX2NhbGliX2RpZmZfZ2Fpbl9jbWQgewotCXN0cnVjdCBpd2xfY2FsaWJfaGRyIGhkcjsKKy8qIElMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRCAoNykgKi8KK3N0cnVjdCBpbF9jYWxpYl9kaWZmX2dhaW5fY21kIHsKKwlzdHJ1Y3QgaWxfY2FsaWJfaGRyIGhkcjsKIAlzOCBkaWZmX2dhaW5fYTsJCS8qIHNlZSBhYm92ZSAqLwogCXM4IGRpZmZfZ2Fpbl9iOwogCXM4IGRpZmZfZ2Fpbl9jOwpAQCAtMzMzOCwxMiArMzMxNSwxMiBAQAogCiAvKgogICogTEVEcyBDb21tYW5kICYgUmVzcG9uc2UKLSAqIFJFUExZX0xFRFNfQ01EID0gMHg0OCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQorICogQ19MRURTID0gMHg0OCAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQogICoKICAqIEZvciBlYWNoIG9mIDMgcG9zc2libGUgTEVEcyAoQWN0aXZpdHkvTGluay9UZWNoLCBzZWxlY3RlZCBieSAiaWQiIGZpZWxkKSwKICAqIHRoaXMgY29tbWFuZCB0dXJucyBpdCBvbiBvciBvZmYsIG9yIHNldHMgdXAgYSBwZXJpb2RpYyBibGlua2luZyBjeWNsZS4KICAqLwotc3RydWN0IGl3bF9sZWRfY21kIHsKK3N0cnVjdCBpbF9sZWRfY21kIHsKIAlfX2xlMzIgaW50ZXJ2YWw7CS8qICJpbnRlcnZhbCIgaW4gdVNlYyAqLwogCXU4IGlkOwkJCS8qIDE6IEFjdGl2aXR5LCAyOiBMaW5rLCAzOiBUZWNoICovCiAJdTggb2ZmOwkJCS8qICMgaW50ZXJ2YWxzIG9mZiB3aGlsZSBibGlua2luZzsKQEAgLTMzNTMsMTQgKzMzMzAsMTUgQEAKIAl1OCByZXNlcnZlZDsKIH0gX19wYWNrZWQ7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogKDEzKQogICogVW5pb24gb2YgYWxsIGV4cGVjdGVkIG5vdGlmaWNhdGlvbnMvcmVzcG9uc2VzOgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RydWN0IGl3bF9yeF9wYWNrZXQgeworI2RlZmluZSBJTF9SWF9GUkFNRV9TSVpFX01TSwkweDAwMDAzZmZmCisKK3N0cnVjdCBpbF9yeF9wa3QgewogCS8qCiAJICogVGhlIGZpcnN0IDQgYnl0ZXMgb2YgdGhlIFJYIGZyYW1lIGhlYWRlciBjb250YWluIGJvdGggdGhlIFJYIGZyYW1lCiAJICogc2l6ZSBhbmQgc29tZSBmbGFncy4KQEAgLTMzNzIsMjcgKzMzNTAsMjcgQEAKIAkgKiAxMy0wMDogUlggZnJhbWUgc2l6ZQogCSAqLwogCV9fbGUzMiBsZW5fbl9mbGFnczsKLQlzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIgaGRyOworCXN0cnVjdCBpbF9jbWRfaGVhZGVyIGhkcjsKIAl1bmlvbiB7Ci0JCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lIHJ4X2ZyYW1lOwotCQlzdHJ1Y3QgaXdsMzk0NV90eF9yZXNwIHR4X3Jlc3A7Ci0JCXN0cnVjdCBpd2wzOTQ1X2JlYWNvbl9ub3RpZiBiZWFjb25fc3RhdHVzOworCQlzdHJ1Y3QgaWwzOTQ1X3J4X2ZyYW1lIHJ4X2ZyYW1lOworCQlzdHJ1Y3QgaWwzOTQ1X3R4X3Jlc3AgdHhfcmVzcDsKKwkJc3RydWN0IGlsMzk0NV9iZWFjb25fbm90aWYgYmVhY29uX3N0YXR1czsKIAotCQlzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3AgYWxpdmVfZnJhbWU7Ci0JCXN0cnVjdCBpd2xfc3BlY3RydW1fbm90aWZpY2F0aW9uIHNwZWN0cnVtX25vdGlmOwotCQlzdHJ1Y3QgaXdsX2NzYV9ub3RpZmljYXRpb24gY3NhX25vdGlmOwotCQlzdHJ1Y3QgaXdsX2Vycm9yX3Jlc3AgZXJyX3Jlc3A7Ci0JCXN0cnVjdCBpd2xfY2FyZF9zdGF0ZV9ub3RpZiBjYXJkX3N0YXRlX25vdGlmOwotCQlzdHJ1Y3QgaXdsX2FkZF9zdGFfcmVzcCBhZGRfc3RhOwotCQlzdHJ1Y3QgaXdsX3JlbV9zdGFfcmVzcCByZW1fc3RhOwotCQlzdHJ1Y3QgaXdsX3NsZWVwX25vdGlmaWNhdGlvbiBzbGVlcF9ub3RpZjsKLQkJc3RydWN0IGl3bF9zcGVjdHJ1bV9yZXNwIHNwZWN0cnVtOwotCQlzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3Mgc3RhdHM7Ci0JCXN0cnVjdCBpd2xfY29tcHJlc3NlZF9iYV9yZXNwIGNvbXByZXNzZWRfYmE7Ci0JCXN0cnVjdCBpd2xfbWlzc2VkX2JlYWNvbl9ub3RpZiBtaXNzZWRfYmVhY29uOworCQlzdHJ1Y3QgaWxfYWxpdmVfcmVzcCBhbGl2ZV9mcmFtZTsKKwkJc3RydWN0IGlsX3NwZWN0cnVtX25vdGlmaWNhdGlvbiBzcGVjdHJ1bV9ub3RpZjsKKwkJc3RydWN0IGlsX2NzYV9ub3RpZmljYXRpb24gY3NhX25vdGlmOworCQlzdHJ1Y3QgaWxfZXJyb3JfcmVzcCBlcnJfcmVzcDsKKwkJc3RydWN0IGlsX2NhcmRfc3RhdGVfbm90aWYgY2FyZF9zdGF0ZV9ub3RpZjsKKwkJc3RydWN0IGlsX2FkZF9zdGFfcmVzcCBhZGRfc3RhOworCQlzdHJ1Y3QgaWxfcmVtX3N0YV9yZXNwIHJlbV9zdGE7CisJCXN0cnVjdCBpbF9zbGVlcF9ub3RpZmljYXRpb24gc2xlZXBfbm90aWY7CisJCXN0cnVjdCBpbF9zcGVjdHJ1bV9yZXNwIHNwZWN0cnVtOworCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgc3RhdHM7CisJCXN0cnVjdCBpbF9jb21wcmVzc2VkX2JhX3Jlc3AgY29tcHJlc3NlZF9iYTsKKwkJc3RydWN0IGlsX21pc3NlZF9iZWFjb25fbm90aWYgbWlzc2VkX2JlYWNvbjsKIAkJX19sZTMyIHN0YXR1czsKIAkJdTggcmF3WzBdOwogCX0gdTsKIH0gX19wYWNrZWQ7CiAKLSNlbmRpZgkJCQkvKiBfX2l3bF9sZWdhY3lfY29tbWFuZHNfaF9fICovCisjZW5kaWYgLyogX19pbF9jb21tYW5kc19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2NvbW1vbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY0NTRkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2NvbW1vbi5jCkBAIC0wLDAgKzEsNTg2NyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKKyAqIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCitpbnQKK19pbF9wb2xsX2JpdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBhZGRyLCB1MzIgYml0cywgdTMyIG1hc2ssIGludCB0aW1lb3V0KQoreworCWNvbnN0IGludCBpbnRlcnZhbCA9IDEwOyAvKiBtaWNyb3NlY29uZHMgKi8KKwlpbnQgdCA9IDA7CisKKwlkbyB7CisJCWlmICgoX2lsX3JkKGlsLCBhZGRyKSAmIG1hc2spID09IChiaXRzICYgbWFzaykpCisJCQlyZXR1cm4gdDsKKwkJdWRlbGF5KGludGVydmFsKTsKKwkJdCArPSBpbnRlcnZhbDsKKwl9IHdoaWxlICh0IDwgdGltZW91dCk7CisKKwlyZXR1cm4gLUVUSU1FRE9VVDsKK30KK0VYUE9SVF9TWU1CT0woX2lsX3BvbGxfYml0KTsKKwordm9pZAoraWxfc2V0X2JpdChzdHJ1Y3QgaWxfcHJpdiAqcCwgdTMyIHIsIHUzMiBtKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCV9pbF9zZXRfYml0KHAsIHIsIG0pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChpbF9zZXRfYml0KTsKKwordm9pZAoraWxfY2xlYXJfYml0KHN0cnVjdCBpbF9wcml2ICpwLCB1MzIgciwgdTMyIG0pCit7CisJdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJX2lsX2NsZWFyX2JpdChwLCByLCBtKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfY2xlYXJfYml0KTsKKworaW50CitfaWxfZ3JhYl9uaWNfYWNjZXNzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbnQgcmV0OworCXUzMiB2YWw7CisKKwkvKiB0aGlzIGJpdCB3YWtlcyB1cCB0aGUgTklDICovCisJX2lsX3NldF9iaXQoaWwsIENTUl9HUF9DTlRSTCwgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKKworCS8qCisJICogVGhlc2UgYml0cyBzYXkgdGhlIGRldmljZSBpcyBydW5uaW5nLCBhbmQgc2hvdWxkIGtlZXAgcnVubmluZyBmb3IKKwkgKiBhdCBsZWFzdCBhIHNob3J0IHdoaWxlIChhdCBsZWFzdCBhcyBsb25nIGFzIE1BQ19BQ0NFU1NfUkVRIHN0YXlzIDEpLAorCSAqIGJ1dCB0aGV5IGRvIG5vdCBpbmRpY2F0ZSB0aGF0IGVtYmVkZGVkIFNSQU0gaXMgcmVzdG9yZWQgeWV0OworCSAqIDM5NDUgYW5kIDQ5NjUgaGF2ZSB2b2xhdGlsZSBTUkFNLCBhbmQgbXVzdCBzYXZlL3Jlc3RvcmUgY29udGVudHMKKwkgKiB0by9mcm9tIGhvc3QgRFJBTSB3aGVuIHNsZWVwaW5nL3dha2luZyBmb3IgcG93ZXItc2F2aW5nLgorCSAqIEVhY2ggZGlyZWN0aW9uIHRha2VzIGFwcHJveGltYXRlbHkgMS80IG1pbGxpc2Vjb25kOyB3aXRoIHRoaXMKKwkgKiBvdmVyaGVhZCwgaXQncyBhIGdvb2QgaWRlYSB0byBncmFiIGFuZCBob2xkIE1BQ19BQ0NFU1NfUkVRVUVTVCBpZiBhCisJICogc2VyaWVzIG9mIHJlZ2lzdGVyIGFjY2Vzc2VzIGFyZSBleHBlY3RlZCAoZS5nLiByZWFkaW5nIEV2ZW50IExvZyksCisJICogdG8ga2VlcCBkZXZpY2UgZnJvbSBzbGVlcGluZy4KKwkgKgorCSAqIENTUl9VQ09ERV9EUlZfR1AxIHJlZ2lzdGVyIGJpdCBNQUNfU0xFRVAgPT0gMCBpbmRpY2F0ZXMgdGhhdAorCSAqIFNSQU0gaXMgb2theS9yZXN0b3JlZC4gIFdlIGRvbid0IGNoZWNrIHRoYXQgaGVyZSBiZWNhdXNlIHRoaXMgY2FsbAorCSAqIGlzIGp1c3QgZm9yIGhhcmR3YXJlIHJlZ2lzdGVyIGFjY2VzczsgYnV0IEdQMSBNQUNfU0xFRVAgY2hlY2sgaXMgYQorCSAqIGdvb2QgaWRlYSBiZWZvcmUgYWNjZXNzaW5nIDM5NDUvNDk2NSBTUkFNIChlLmcuIHJlYWRpbmcgRXZlbnQgTG9nKS4KKwkgKgorCSAqLworCXJldCA9CisJICAgIF9pbF9wb2xsX2JpdChpbCwgQ1NSX0dQX0NOVFJMLCBDU1JfR1BfQ05UUkxfUkVHX1ZBTF9NQUNfQUNDRVNTX0VOLAorCQkJIChDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZIHwKKwkJCSAgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0dPSU5HX1RPX1NMRUVQKSwgMTUwMDApOworCWlmIChyZXQgPCAwKSB7CisJCXZhbCA9IF9pbF9yZChpbCwgQ1NSX0dQX0NOVFJMKTsKKwkJSUxfRVJSKCJNQUMgaXMgaW4gZGVlcCBzbGVlcCEuICBDU1JfR1BfQ05UUkwgPSAweCUwOFhcbiIsIHZhbCk7CisJCV9pbF93cihpbCwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfRk9SQ0VfTk1JKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfaWxfZ3JhYl9uaWNfYWNjZXNzKTsKKworaW50CitpbF9wb2xsX2JpdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBhZGRyLCB1MzIgbWFzaywgaW50IHRpbWVvdXQpCit7CisJY29uc3QgaW50IGludGVydmFsID0gMTA7IC8qIG1pY3Jvc2Vjb25kcyAqLworCWludCB0ID0gMDsKKworCWRvIHsKKwkJaWYgKChpbF9yZChpbCwgYWRkcikgJiBtYXNrKSA9PSBtYXNrKQorCQkJcmV0dXJuIHQ7CisJCXVkZWxheShpbnRlcnZhbCk7CisJCXQgKz0gaW50ZXJ2YWw7CisJfSB3aGlsZSAodCA8IHRpbWVvdXQpOworCisJcmV0dXJuIC1FVElNRURPVVQ7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3BvbGxfYml0KTsKKwordTMyCitpbF9yZF9wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKwl1MzIgdmFsOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKTsKKwl2YWwgPSBfaWxfcmRfcHJwaChpbCwgcmVnKTsKKwlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJcmV0dXJuIHZhbDsKK30KK0VYUE9SVF9TWU1CT0woaWxfcmRfcHJwaCk7CisKK3ZvaWQKK2lsX3dyX3BycGgoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYWRkciwgdTMyIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJaWYgKCFfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKSkgeworCQlfaWxfd3JfcHJwaChpbCwgYWRkciwgdmFsKTsKKwkJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfd3JfcHJwaCk7CisKK3UzMgoraWxfcmVhZF90YXJnX21lbShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOworCXUzMiB2YWx1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJX2lsX2dyYWJfbmljX2FjY2VzcyhpbCk7CisKKwlfaWxfd3IoaWwsIEhCVVNfVEFSR19NRU1fUkFERFIsIGFkZHIpOworCXJtYigpOworCXZhbHVlID0gX2lsX3JkKGlsLCBIQlVTX1RBUkdfTUVNX1JEQVQpOworCisJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCXJldHVybiB2YWx1ZTsKK30KK0VYUE9SVF9TWU1CT0woaWxfcmVhZF90YXJnX21lbSk7CisKK3ZvaWQKK2lsX3dyaXRlX3RhcmdfbWVtKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIGFkZHIsIHUzMiB2YWwpCit7CisJdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCWlmICghX2lsX2dyYWJfbmljX2FjY2VzcyhpbCkpIHsKKwkJX2lsX3dyKGlsLCBIQlVTX1RBUkdfTUVNX1dBRERSLCBhZGRyKTsKKwkJd21iKCk7CisJCV9pbF93cihpbCwgSEJVU19UQVJHX01FTV9XREFULCB2YWwpOworCQlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChpbF93cml0ZV90YXJnX21lbSk7CisKK2NvbnN0IGNoYXIgKgoraWxfZ2V0X2NtZF9zdHJpbmcodTggY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJCUlMX0NNRChOX0FMSVZFKTsKKwkJSUxfQ01EKE5fRVJST1IpOworCQlJTF9DTUQoQ19SWE9OKTsKKwkJSUxfQ01EKENfUlhPTl9BU1NPQyk7CisJCUlMX0NNRChDX1FPU19QQVJBTSk7CisJCUlMX0NNRChDX1JYT05fVElNSU5HKTsKKwkJSUxfQ01EKENfQUREX1NUQSk7CisJCUlMX0NNRChDX1JFTV9TVEEpOworCQlJTF9DTUQoQ19XRVBLRVkpOworCQlJTF9DTUQoTl8zOTQ1X1JYKTsKKwkJSUxfQ01EKENfVFgpOworCQlJTF9DTUQoQ19SQVRFX1NDQUxFKTsKKwkJSUxfQ01EKENfTEVEUyk7CisJCUlMX0NNRChDX1RYX0xJTktfUVVBTElUWV9DTUQpOworCQlJTF9DTUQoQ19DSEFOTkVMX1NXSVRDSCk7CisJCUlMX0NNRChOX0NIQU5ORUxfU1dJVENIKTsKKwkJSUxfQ01EKENfU1BFQ1RSVU1fTUVBU1VSRU1FTlQpOworCQlJTF9DTUQoTl9TUEVDVFJVTV9NRUFTVVJFTUVOVCk7CisJCUlMX0NNRChDX1BPV0VSX1RCTCk7CisJCUlMX0NNRChOX1BNX1NMRUVQKTsKKwkJSUxfQ01EKE5fUE1fREVCVUdfU1RBVFMpOworCQlJTF9DTUQoQ19TQ0FOKTsKKwkJSUxfQ01EKENfU0NBTl9BQk9SVCk7CisJCUlMX0NNRChOX1NDQU5fU1RBUlQpOworCQlJTF9DTUQoTl9TQ0FOX1JFU1VMVFMpOworCQlJTF9DTUQoTl9TQ0FOX0NPTVBMRVRFKTsKKwkJSUxfQ01EKE5fQkVBQ09OKTsKKwkJSUxfQ01EKENfVFhfQkVBQ09OKTsKKwkJSUxfQ01EKENfVFhfUFdSX1RCTCk7CisJCUlMX0NNRChDX0JUX0NPTkZJRyk7CisJCUlMX0NNRChDX1NUQVRTKTsKKwkJSUxfQ01EKE5fU1RBVFMpOworCQlJTF9DTUQoTl9DQVJEX1NUQVRFKTsKKwkJSUxfQ01EKE5fTUlTU0VEX0JFQUNPTlMpOworCQlJTF9DTUQoQ19DVF9LSUxMX0NPTkZJRyk7CisJCUlMX0NNRChDX1NFTlNJVElWSVRZKTsKKwkJSUxfQ01EKENfUEhZX0NBTElCUkFUSU9OKTsKKwkJSUxfQ01EKE5fUlhfUEhZKTsKKwkJSUxfQ01EKE5fUlhfTVBEVSk7CisJCUlMX0NNRChOX1JYKTsKKwkJSUxfQ01EKE5fQ09NUFJFU1NFRF9CQSk7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJVTktOT1dOIjsKKworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfZ2V0X2NtZF9zdHJpbmcpOworCisjZGVmaW5lIEhPU1RfQ09NUExFVEVfVElNRU9VVCAoSFogLyAyKQorCitzdGF0aWMgdm9pZAoraWxfZ2VuZXJpY19jbWRfY2FsbGJhY2soc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkJc3RydWN0IGlsX3J4X3BrdCAqcGt0KQoreworCWlmIChwa3QtPmhkci5mbGFncyAmIElMX0NNRF9GQUlMRURfTVNLKSB7CisJCUlMX0VSUigiQmFkIHJldHVybiBmcm9tICVzICgweCUwOFgpXG4iLAorCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOworCQlyZXR1cm47CisJfQorI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXN3aXRjaCAoY21kLT5oZHIuY21kKSB7CisJY2FzZSBDX1RYX0xJTktfUVVBTElUWV9DTUQ6CisJY2FzZSBDX1NFTlNJVElWSVRZOgorCQlEX0hDX0RVTVAoImJhY2sgZnJvbSAlcyAoMHglMDhYKVxuIiwKKwkJCSAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5oZHIuY21kKSwgcGt0LT5oZHIuZmxhZ3MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEX0hDKCJiYWNrIGZyb20gJXMgKDB4JTA4WClcbiIsIGlsX2dldF9jbWRfc3RyaW5nKGNtZC0+aGRyLmNtZCksCisJCSAgICAgcGt0LT5oZHIuZmxhZ3MpOworCX0KKyNlbmRpZgorfQorCitzdGF0aWMgaW50CitpbF9zZW5kX2NtZF9hc3luYyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9ob3N0X2NtZCAqY21kKQoreworCWludCByZXQ7CisKKwlCVUdfT04oIShjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSk7CisKKwkvKiBBbiBhc3luY2hyb25vdXMgY29tbWFuZCBjYW4gbm90IGV4cGVjdCBhbiBTS0IgdG8gYmUgc2V0LiAqLworCUJVR19PTihjbWQtPmZsYWdzICYgQ01EX1dBTlRfU0tCKTsKKworCS8qIEFzc2lnbiBhIGdlbmVyaWMgY2FsbGJhY2sgaWYgb25lIGlzIG5vdCBwcm92aWRlZCAqLworCWlmICghY21kLT5jYWxsYmFjaykKKwkJY21kLT5jYWxsYmFjayA9IGlsX2dlbmVyaWNfY21kX2NhbGxiYWNrOworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybiAtRUJVU1k7CisKKwlyZXQgPSBpbF9lbnF1ZXVlX2hjbWQoaWwsIGNtZCk7CisJaWYgKHJldCA8IDApIHsKKwkJSUxfRVJSKCJFcnJvciBzZW5kaW5nICVzOiBlbnF1ZXVlX2hjbWQgZmFpbGVkOiAlZFxuIiwKKwkJICAgICAgIGlsX2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworaW50CitpbF9zZW5kX2NtZF9zeW5jKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2hvc3RfY21kICpjbWQpCit7CisJaW50IGNtZF9pZHg7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlCVUdfT04oY21kLT5mbGFncyAmIENNRF9BU1lOQyk7CisKKwkvKiBBIHN5bmNocm9ub3VzIGNvbW1hbmQgY2FuIG5vdCBoYXZlIGEgY2FsbGJhY2sgc2V0LiAqLworCUJVR19PTihjbWQtPmNhbGxiYWNrKTsKKworCURfSU5GTygiQXR0ZW1wdGluZyB0byBzZW5kIHN5bmMgY29tbWFuZCAlc1xuIiwKKwkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOworCisJc2V0X2JpdChTX0hDTURfQUNUSVZFLCAmaWwtPnN0YXR1cyk7CisJRF9JTkZPKCJTZXR0aW5nIEhDTURfQUNUSVZFIGZvciBjb21tYW5kICVzXG4iLAorCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisKKwljbWRfaWR4ID0gaWxfZW5xdWV1ZV9oY21kKGlsLCBjbWQpOworCWlmIChjbWRfaWR4IDwgMCkgeworCQlyZXQgPSBjbWRfaWR4OworCQlJTF9FUlIoIkVycm9yIHNlbmRpbmcgJXM6IGVucXVldWVfaGNtZCBmYWlsZWQ6ICVkXG4iLAorCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksIHJldCk7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChpbC0+d2FpdF9jb21tYW5kX3F1ZXVlLAorCQkJCSAhdGVzdF9iaXQoU19IQ01EX0FDVElWRSwgJmlsLT5zdGF0dXMpLAorCQkJCSBIT1NUX0NPTVBMRVRFX1RJTUVPVVQpOworCWlmICghcmV0KSB7CisJCWlmICh0ZXN0X2JpdChTX0hDTURfQUNUSVZFLCAmaWwtPnN0YXR1cykpIHsKKwkJCUlMX0VSUigiRXJyb3Igc2VuZGluZyAlczogdGltZSBvdXQgYWZ0ZXIgJWRtcy5cbiIsCisJCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCksCisJCQkgICAgICAgamlmZmllc190b19tc2VjcyhIT1NUX0NPTVBMRVRFX1RJTUVPVVQpKTsKKworCQkJY2xlYXJfYml0KFNfSENNRF9BQ1RJVkUsICZpbC0+c3RhdHVzKTsKKwkJCURfSU5GTygiQ2xlYXJpbmcgSENNRF9BQ1RJVkUgZm9yIGNvbW1hbmQgJXNcbiIsCisJCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOworCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJCWdvdG8gY2FuY2VsOworCQl9CisJfQorCisJaWYgKHRlc3RfYml0KFNfUkZfS0lMTF9IVywgJmlsLT5zdGF0dXMpKSB7CisJCUlMX0VSUigiQ29tbWFuZCAlcyBhYm9ydGVkOiBSRiBLSUxMIFN3aXRjaFxuIiwKKwkJICAgICAgIGlsX2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKKwkJcmV0ID0gLUVDQU5DRUxFRDsKKwkJZ290byBmYWlsOworCX0KKwlpZiAodGVzdF9iaXQoU19GV19FUlJPUiwgJmlsLT5zdGF0dXMpKSB7CisJCUlMX0VSUigiQ29tbWFuZCAlcyBmYWlsZWQ6IEZXIEVycm9yXG4iLAorCQkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOworCQlyZXQgPSAtRUlPOworCQlnb3RvIGZhaWw7CisJfQorCWlmICgoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikgJiYgIWNtZC0+cmVwbHlfcGFnZSkgeworCQlJTF9FUlIoIkVycm9yOiBSZXNwb25zZSBOVUxMIGluICclcydcbiIsCisJCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gY2FuY2VsOworCX0KKworCXJldCA9IDA7CisJZ290byBvdXQ7CisKK2NhbmNlbDoKKwlpZiAoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikgeworCQkvKgorCQkgKiBDYW5jZWwgdGhlIENNRF9XQU5UX1NLQiBmbGFnIGZvciB0aGUgY21kIGluIHRoZQorCQkgKiBUWCBjbWQgcXVldWUuIE90aGVyd2lzZSBpbiBjYXNlIHRoZSBjbWQgY29tZXMKKwkJICogaW4gbGF0ZXIsIGl0IHdpbGwgcG9zc2libHkgc2V0IGFuIGludmFsaWQKKwkJICogYWRkcmVzcyAoY21kLT5tZXRhLnNvdXJjZSkuCisJCSAqLworCQlpbC0+dHhxW2lsLT5jbWRfcXVldWVdLm1ldGFbY21kX2lkeF0uZmxhZ3MgJj0gfkNNRF9XQU5UX1NLQjsKKwl9CitmYWlsOgorCWlmIChjbWQtPnJlcGx5X3BhZ2UpIHsKKwkJaWxfZnJlZV9wYWdlcyhpbCwgY21kLT5yZXBseV9wYWdlKTsKKwkJY21kLT5yZXBseV9wYWdlID0gMDsKKwl9CitvdXQ6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9jbWRfc3luYyk7CisKK2ludAoraWxfc2VuZF9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaG9zdF9jbWQgKmNtZCkKK3sKKwlpZiAoY21kLT5mbGFncyAmIENNRF9BU1lOQykKKwkJcmV0dXJuIGlsX3NlbmRfY21kX2FzeW5jKGlsLCBjbWQpOworCisJcmV0dXJuIGlsX3NlbmRfY21kX3N5bmMoaWwsIGNtZCk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NlbmRfY21kKTsKKworaW50CitpbF9zZW5kX2NtZF9wZHUoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpZCwgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBpZCwKKwkJLmxlbiA9IGxlbiwKKwkJLmRhdGEgPSBkYXRhLAorCX07CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfc3luYyhpbCwgJmNtZCk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NlbmRfY21kX3BkdSk7CisKK2ludAoraWxfc2VuZF9jbWRfcGR1X2FzeW5jKHN0cnVjdCBpbF9wcml2ICppbCwgdTggaWQsIHUxNiBsZW4sIGNvbnN0IHZvaWQgKmRhdGEsCisJCSAgICAgIHZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCQkJc3RydWN0IGlsX3J4X3BrdCAqcGt0KSkKK3sKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBpZCwKKwkJLmxlbiA9IGxlbiwKKwkJLmRhdGEgPSBkYXRhLAorCX07CisKKwljbWQuZmxhZ3MgfD0gQ01EX0FTWU5DOworCWNtZC5jYWxsYmFjayA9IGNhbGxiYWNrOworCisJcmV0dXJuIGlsX3NlbmRfY21kX2FzeW5jKGlsLCAmY21kKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9jbWRfcGR1X2FzeW5jKTsKKworLyogZGVmYXVsdDogSUxfTEVEX0JMSU5LKDApIHVzaW5nIGJsaW5raW5nIGlkeCB0YWJsZSAqLworc3RhdGljIGludCBsZWRfbW9kZTsKK21vZHVsZV9wYXJhbShsZWRfbW9kZSwgaW50LCBTX0lSVUdPKTsKK01PRFVMRV9QQVJNX0RFU0MobGVkX21vZGUsCisJCSAiMD1zeXN0ZW0gZGVmYXVsdCwgIiAiMT1PbihSRiBPbikvT2ZmKFJGIE9mZiksIDI9YmxpbmtpbmciKTsKKworLyogVGhyb3VnaHB1dAkJT0ZGIHRpbWUobXMpCU9OIHRpbWUgKG1zKQorICoJPjMwMAkJCTI1CQkyNQorICoJPjIwMCB0byAzMDAJCTQwCQk0MAorICoJPjEwMCB0byAyMDAJCTU1CQk1NQorICoJPjcwIHRvIDEwMAkJNjUJCTY1CisgKgk+NTAgdG8gNzAJCTc1CQk3NQorICoJPjIwIHRvIDUwCQk4NQkJODUKKyAqCT4xMCB0byAyMAkJOTUJCTk1CisgKgk+NSB0byAxMAkJMTEwCQkxMTAKKyAqCT4xIHRvIDUJCQkxMzAJCTEzMAorICoJPjAgdG8gMQkJCTE2NwkJMTY3CisgKgk8PTAJCQkJCVNPTElEIE9OCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3RwdF9ibGluayBpbF9ibGlua1tdID0geworCXsudGhyb3VnaHB1dCA9IDAsCQkuYmxpbmtfdGltZSA9IDMzNH0sCisJey50aHJvdWdocHV0ID0gMSAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDI2MH0sCisJey50aHJvdWdocHV0ID0gNSAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDIyMH0sCisJey50aHJvdWdocHV0ID0gMTAgKiAxMDI0IC0gMSwJLmJsaW5rX3RpbWUgPSAxOTB9LAorCXsudGhyb3VnaHB1dCA9IDIwICogMTAyNCAtIDEsCS5ibGlua190aW1lID0gMTcwfSwKKwl7LnRocm91Z2hwdXQgPSA1MCAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDE1MH0sCisJey50aHJvdWdocHV0ID0gNzAgKiAxMDI0IC0gMSwJLmJsaW5rX3RpbWUgPSAxMzB9LAorCXsudGhyb3VnaHB1dCA9IDEwMCAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDExMH0sCisJey50aHJvdWdocHV0ID0gMjAwICogMTAyNCAtIDEsCS5ibGlua190aW1lID0gODB9LAorCXsudGhyb3VnaHB1dCA9IDMwMCAqIDEwMjQgLSAxLAkuYmxpbmtfdGltZSA9IDUwfSwKK307CisKKy8qCisgKiBBZGp1c3QgbGVkIGJsaW5rIHJhdGUgdG8gY29tcGVuc2F0ZSBvbiBhIE1BQyBDbG9jayBkaWZmZXJlbmNlIG9uIGV2ZXJ5IEhXCisgKiBMZWQgYmxpbmsgcmF0ZSBhbmFseXNpcyBzaG93ZWQgYW4gYXZlcmFnZSBkZXZpYXRpb24gb2YgMCUgb24gMzk0NSwKKyAqIDUlIG9uIDQ5NjUgSFcuCisgKiBOZWVkIHRvIGNvbXBlbnNhdGUgb24gdGhlIGxlZCBvbi9vZmYgdGltZSBwZXIgSFcgYWNjb3JkaW5nIHRvIHRoZSBkZXZpYXRpb24KKyAqIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgbGVkIGZyZXF1ZW5jeQorICogVGhlIGNhbGN1bGF0aW9uIGlzOiAoMTAwLWF2ZXJhZ2VEZXZpYXRpb24pLzEwMCAqIGJsaW5rVGltZQorICogRm9yIGNvZGUgZWZmaWNpZW5jeSB0aGUgY2FsY3VsYXRpb24gd2lsbCBiZToKKyAqICAgICBjb21wZW5zYXRpb24gPSAoMTAwIC0gYXZlcmFnZURldmlhdGlvbikgKiA2NCAvIDEwMAorICogICAgIE5ld0JsaW5rVGltZSA9IChjb21wZW5zYXRpb24gKiBCbGlua1RpbWUpIC8gNjQKKyAqLworc3RhdGljIGlubGluZSB1OAoraWxfYmxpbmtfY29tcGVuc2F0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgdTggdGltZSwgdTE2IGNvbXBlbnNhdGlvbikKK3sKKwlpZiAoIWNvbXBlbnNhdGlvbikgeworCQlJTF9FUlIoInVuZGVmaW5lZCBibGluayBjb21wZW5zYXRpb246ICIKKwkJICAgICAgICJ1c2UgcHJlLWRlZmluZWQgYmxpbmtpbmcgdGltZVxuIik7CisJCXJldHVybiB0aW1lOworCX0KKworCXJldHVybiAodTgpICgodGltZSAqIGNvbXBlbnNhdGlvbikgPj4gNik7Cit9CisKKy8qIFNldCBsZWQgcGF0dGVybiBjb21tYW5kICovCitzdGF0aWMgaW50CitpbF9sZWRfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgdW5zaWduZWQgbG9uZyBvbiwgdW5zaWduZWQgbG9uZyBvZmYpCit7CisJc3RydWN0IGlsX2xlZF9jbWQgbGVkX2NtZCA9IHsKKwkJLmlkID0gSUxfTEVEX0xJTkssCisJCS5pbnRlcnZhbCA9IElMX0RFRl9MRURfSU5UUlZMCisJfTsKKwlpbnQgcmV0OworCisJaWYgKCF0ZXN0X2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cykpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoaWwtPmJsaW5rX29uID09IG9uICYmIGlsLT5ibGlua19vZmYgPT0gb2ZmKQorCQlyZXR1cm4gMDsKKworCWlmIChvZmYgPT0gMCkgeworCQkvKiBsZWQgaXMgU09MSURfT04gKi8KKwkJb24gPSBJTF9MRURfU09MSUQ7CisJfQorCisJRF9MRUQoIkxlZCBibGluayB0aW1lIGNvbXBlbnNhdGlvbj0ldVxuIiwKKwkgICAgICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bGVkX2NvbXBlbnNhdGlvbik7CisJbGVkX2NtZC5vbiA9CisJICAgIGlsX2JsaW5rX2NvbXBlbnNhdGlvbihpbCwgb24sCisJCQkJICBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+bGVkX2NvbXBlbnNhdGlvbik7CisJbGVkX2NtZC5vZmYgPQorCSAgICBpbF9ibGlua19jb21wZW5zYXRpb24oaWwsIG9mZiwKKwkJCQkgIGlsLT5jZmctPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKKworCXJldCA9IGlsLT5jZmctPm9wcy0+bGVkLT5jbWQoaWwsICZsZWRfY21kKTsKKwlpZiAoIXJldCkgeworCQlpbC0+Ymxpbmtfb24gPSBvbjsKKwkJaWwtPmJsaW5rX29mZiA9IG9mZjsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2lsX2xlZF9icmlnaHRuZXNzX3NldChzdHJ1Y3QgbGVkX2NsYXNzZGV2ICpsZWRfY2RldiwKKwkJICAgICAgZW51bSBsZWRfYnJpZ2h0bmVzcyBicmlnaHRuZXNzKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZihsZWRfY2Rldiwgc3RydWN0IGlsX3ByaXYsIGxlZCk7CisJdW5zaWduZWQgbG9uZyBvbiA9IDA7CisKKwlpZiAoYnJpZ2h0bmVzcyA+IDApCisJCW9uID0gSUxfTEVEX1NPTElEOworCisJaWxfbGVkX2NtZChpbCwgb24sIDApOworfQorCitzdGF0aWMgaW50CitpbF9sZWRfYmxpbmtfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LCB1bnNpZ25lZCBsb25nICpkZWxheV9vbiwKKwkJIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29mZikKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBpbF9wcml2LCBsZWQpOworCisJcmV0dXJuIGlsX2xlZF9jbWQoaWwsICpkZWxheV9vbiwgKmRlbGF5X29mZik7Cit9CisKK3ZvaWQKK2lsX2xlZHNfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IG1vZGUgPSBsZWRfbW9kZTsKKwlpbnQgcmV0OworCisJaWYgKG1vZGUgPT0gSUxfTEVEX0RFRkFVTFQpCisJCW1vZGUgPSBpbC0+Y2ZnLT5sZWRfbW9kZTsKKworCWlsLT5sZWQubmFtZSA9CisJICAgIGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMtbGVkIiwgd2lwaHlfbmFtZShpbC0+aHctPndpcGh5KSk7CisJaWwtPmxlZC5icmlnaHRuZXNzX3NldCA9IGlsX2xlZF9icmlnaHRuZXNzX3NldDsKKwlpbC0+bGVkLmJsaW5rX3NldCA9IGlsX2xlZF9ibGlua19zZXQ7CisJaWwtPmxlZC5tYXhfYnJpZ2h0bmVzcyA9IDE7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIElMX0xFRF9ERUZBVUxUOgorCQlXQVJOX09OKDEpOworCQlicmVhazsKKwljYXNlIElMX0xFRF9CTElOSzoKKwkJaWwtPmxlZC5kZWZhdWx0X3RyaWdnZXIgPQorCQkgICAgaWVlZTgwMjExX2NyZWF0ZV90cHRfbGVkX3RyaWdnZXIoaWwtPmh3LAorCQkJCQkJICAgICBJRUVFODAyMTFfVFBUX0xFRFRSSUdfRkxfQ09OTkVDVEVELAorCQkJCQkJICAgICBpbF9ibGluaywKKwkJCQkJCSAgICAgQVJSQVlfU0laRShpbF9ibGluaykpOworCQlicmVhazsKKwljYXNlIElMX0xFRF9SRl9TVEFURToKKwkJaWwtPmxlZC5kZWZhdWx0X3RyaWdnZXIgPSBpZWVlODAyMTFfZ2V0X3JhZGlvX2xlZF9uYW1lKGlsLT5odyk7CisJCWJyZWFrOworCX0KKworCXJldCA9IGxlZF9jbGFzc2Rldl9yZWdpc3RlcigmaWwtPnBjaV9kZXYtPmRldiwgJmlsLT5sZWQpOworCWlmIChyZXQpIHsKKwkJa2ZyZWUoaWwtPmxlZC5uYW1lKTsKKwkJcmV0dXJuOworCX0KKworCWlsLT5sZWRfcmVnaXN0ZXJlZCA9IHRydWU7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2xlZHNfaW5pdCk7CisKK3ZvaWQKK2lsX2xlZHNfZXhpdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaWYgKCFpbC0+bGVkX3JlZ2lzdGVyZWQpCisJCXJldHVybjsKKworCWxlZF9jbGFzc2Rldl91bnJlZ2lzdGVyKCZpbC0+bGVkKTsKKwlrZnJlZShpbC0+bGVkLm5hbWUpOworfQorRVhQT1JUX1NZTUJPTChpbF9sZWRzX2V4aXQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiogRUVQUk9NIEJBTkRTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgaWxfZWVwcm9tX2JhbmQgZGVmaW5pdGlvbnMgYmVsb3cgcHJvdmlkZSB0aGUgbWFwcGluZyBmcm9tIHRoZQorICogRUVQUk9NIGNvbnRlbnRzIHRvIHRoZSBzcGVjaWZpYyBjaGFubmVsIG51bWJlciBzdXBwb3J0ZWQgZm9yIGVhY2gKKyAqIGJhbmQuCisgKgorICogRm9yIGV4YW1wbGUsIGlsX3ByaXYtPmVlcHJvbS5iYW5kXzNfY2hhbm5lbHNbNF0gZnJvbSB0aGUgYmFuZF8zCisgKiBkZWZpbml0aW9uIGJlbG93IG1hcHMgdG8gcGh5c2ljYWwgY2hhbm5lbCA0MiBpbiB0aGUgNS4yR0h6IHNwZWN0cnVtLgorICogVGhlIHNwZWNpZmljIGdlb2dyYXBoeSBhbmQgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoYXQgY2hhbm5lbAorICogaXMgY29udGFpbmVkIGluIHRoZSBlZXByb20gbWFwIGl0c2VsZi4KKyAqCisgKiBEdXJpbmcgaW5pdCwgd2UgY29weSB0aGUgZWVwcm9tIGluZm9ybWF0aW9uIGFuZCBjaGFubmVsIG1hcAorICogaW5mb3JtYXRpb24gaW50byBpbC0+Y2hhbm5lbF9pbmZvXzI0LzUyIGFuZCBpbC0+Y2hhbm5lbF9tYXBfMjQvNTIKKyAqCisgKiBjaGFubmVsX21hcF8yNC81MiBwcm92aWRlcyB0aGUgaWR4IGluIHRoZSBjaGFubmVsX2luZm8gYXJyYXkgZm9yIGEKKyAqIGdpdmVuIGNoYW5uZWwuICBXZSBoYXZlIHRvIGhhdmUgdHdvIHNlcGFyYXRlIG1hcHMgYXMgdGhlcmUgaXMgY2hhbm5lbAorICogb3ZlcmxhcCB3aXRoIHRoZSAyLjRHSHogYW5kIDUuMkdIeiBzcGVjdHJ1bSBhcyBzZWVuIGluIGJhbmRfMSBhbmQKKyAqIGJhbmRfMgorICoKKyAqIEEgdmFsdWUgb2YgMHhmZiBzdG9yZWQgaW4gdGhlIGNoYW5uZWxfbWFwIGluZGljYXRlcyB0aGF0IHRoZSBjaGFubmVsCisgKiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBoYXJkd2FyZSBhdCBhbGwuCisgKgorICogQSB2YWx1ZSBvZiAweGZlIGluIHRoZSBjaGFubmVsX21hcCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2hhbm5lbCBpcyBub3QKKyAqIHZhbGlkIGZvciBUeCB3aXRoIHRoZSBjdXJyZW50IGhhcmR3YXJlLiAgVGhpcyBtZWFucyB0aGF0CisgKiB3aGlsZSB0aGUgc3lzdGVtIGNhbiB0dW5lIGFuZCByZWNlaXZlIG9uIGEgZ2l2ZW4gY2hhbm5lbCwgaXQgbWF5IG5vdAorICogYmUgYWJsZSB0byBhc3NvY2lhdGUgb3IgdHJhbnNtaXQgYW55IGZyYW1lcyBvbiB0aGF0CisgKiBjaGFubmVsLiAgVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBjaGFubmVsIGluZm9ybWF0aW9uIGZvciB0aGF0CisgKiBlbnRyeS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAyLjQgR0h6ICovCitjb25zdCB1OCBpbF9lZXByb21fYmFuZF8xWzE0XSA9IHsKKwkxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKK307CisKKy8qIDUuMiBHSHogYmFuZHMgKi8KK3N0YXRpYyBjb25zdCB1OCBpbF9lZXByb21fYmFuZF8yW10gPSB7CS8qIDQ5MTUtNTA4ME1IeiAqLworCTE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxODksIDE5MiwgMTk2LCA3LCA4LCAxMSwgMTIsIDE2Cit9OworCitzdGF0aWMgY29uc3QgdTggaWxfZWVwcm9tX2JhbmRfM1tdID0gewkvKiA1MTcwLTUzMjBNSHogKi8KKwkzNCwgMzYsIDM4LCA0MCwgNDIsIDQ0LCA0NiwgNDgsIDUyLCA1NiwgNjAsIDY0Cit9OworCitzdGF0aWMgY29uc3QgdTggaWxfZWVwcm9tX2JhbmRfNFtdID0gewkvKiA1NTAwLTU3MDBNSHogKi8KKwkxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAorfTsKKworc3RhdGljIGNvbnN0IHU4IGlsX2VlcHJvbV9iYW5kXzVbXSA9IHsJLyogNTcyNS01ODI1TUh6ICovCisJMTQ1LCAxNDksIDE1MywgMTU3LCAxNjEsIDE2NQorfTsKKworc3RhdGljIGNvbnN0IHU4IGlsX2VlcHJvbV9iYW5kXzZbXSA9IHsJLyogMi40IGh0NDAgY2hhbm5lbCAqLworCTEsIDIsIDMsIDQsIDUsIDYsIDcKK307CisKK3N0YXRpYyBjb25zdCB1OCBpbF9lZXByb21fYmFuZF83W10gPSB7CS8qIDUuMiBodDQwIGNoYW5uZWwgKi8KKwkzNiwgNDQsIDUyLCA2MCwgMTAwLCAxMDgsIDExNiwgMTI0LCAxMzIsIDE0OSwgMTU3Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRUVQUk9NIHJlbGF0ZWQgZnVuY3Rpb25zCisgKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitpbF9lZXByb21fdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdTMyIGdwID0gX2lsX3JkKGlsLCBDU1JfRUVQUk9NX0dQKSAmIENTUl9FRVBST01fR1BfVkFMSURfTVNLOworCWludCByZXQgPSAwOworCisJRF9FRVBST00oIkVFUFJPTSBzaWduYXR1cmU9MHglMDh4XG4iLCBncCk7CisJc3dpdGNoIChncCkgeworCWNhc2UgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTEVTU19USEFOXzRLOgorCWNhc2UgQ1NSX0VFUFJPTV9HUF9HT09EX1NJR19FRVBfTU9SRV9USEFOXzRLOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJTF9FUlIoImJhZCBFRVBST00gc2lnbmF0dXJlLCIgIkVFUFJPTV9HUD0weCUwOHhcbiIsIGdwKTsKKwkJcmV0ID0gLUVOT0VOVDsKKwkJYnJlYWs7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2NvbnN0IHU4ICoKK2lsX2VlcHJvbV9xdWVyeV9hZGRyKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwgc2l6ZV90IG9mZnNldCkKK3sKKwlCVUdfT04ob2Zmc2V0ID49IGlsLT5jZmctPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZSk7CisJcmV0dXJuICZpbC0+ZWVwcm9tW29mZnNldF07Cit9CitFWFBPUlRfU1lNQk9MKGlsX2VlcHJvbV9xdWVyeV9hZGRyKTsKKwordTE2CitpbF9lZXByb21fcXVlcnkxNihjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIHNpemVfdCBvZmZzZXQpCit7CisJaWYgKCFpbC0+ZWVwcm9tKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHUxNikgaWwtPmVlcHJvbVtvZmZzZXRdIHwgKCh1MTYpIGlsLT5lZXByb21bb2Zmc2V0ICsgMV0gPDwgOCk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2VlcHJvbV9xdWVyeTE2KTsKKworLyoqCisgKiBpbF9lZXByb21faW5pdCAtIHJlYWQgRUVQUk9NIGNvbnRlbnRzCisgKgorICogTG9hZCB0aGUgRUVQUk9NIGNvbnRlbnRzIGZyb20gYWRhcHRlciBpbnRvIGlsLT5lZXByb20KKyAqCisgKiBOT1RFOiAgVGhpcyByb3V0aW5lIHVzZXMgdGhlIG5vbi1kZWJ1ZyBJTyBhY2Nlc3MgZnVuY3Rpb25zLgorICovCitpbnQKK2lsX2VlcHJvbV9pbml0KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlfX2xlMTYgKmU7CisJdTMyIGdwID0gX2lsX3JkKGlsLCBDU1JfRUVQUk9NX0dQKTsKKwlpbnQgc3o7CisJaW50IHJldDsKKwl1MTYgYWRkcjsKKworCS8qIGFsbG9jYXRlIGVlcHJvbSAqLworCXN6ID0gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmVlcHJvbV9zaXplOworCURfRUVQUk9NKCJOVk0gc2l6ZSA9ICVkXG4iLCBzeik7CisJaWwtPmVlcHJvbSA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWlmICghaWwtPmVlcHJvbSkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGFsbG9jX2VycjsKKwl9CisJZSA9IChfX2xlMTYgKikgaWwtPmVlcHJvbTsKKworCWlsLT5jZmctPm9wcy0+bGliLT5hcG1fb3BzLmluaXQoaWwpOworCisJcmV0ID0gaWxfZWVwcm9tX3ZlcmlmeV9zaWduYXR1cmUoaWwpOworCWlmIChyZXQgPCAwKSB7CisJCUlMX0VSUigiRUVQUk9NIG5vdCBmb3VuZCwgRUVQUk9NX0dQPTB4JTA4eFxuIiwgZ3ApOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBNYWtlIHN1cmUgZHJpdmVyIChpbnN0ZWFkIG9mIHVDb2RlKSBpcyBhbGxvd2VkIHRvIHJlYWQgRUVQUk9NICovCisJcmV0ID0gaWwtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMuYWNxdWlyZV9zZW1hcGhvcmUoaWwpOworCWlmIChyZXQgPCAwKSB7CisJCUlMX0VSUigiRmFpbGVkIHRvIGFjcXVpcmUgRUVQUk9NIHNlbWFwaG9yZS5cbiIpOworCQlyZXQgPSAtRU5PRU5UOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBlZXByb20gaXMgYW4gYXJyYXkgb2YgMTZiaXQgdmFsdWVzICovCisJZm9yIChhZGRyID0gMDsgYWRkciA8IHN6OyBhZGRyICs9IHNpemVvZih1MTYpKSB7CisJCXUzMiByOworCisJCV9pbF93cihpbCwgQ1NSX0VFUFJPTV9SRUcsCisJCSAgICAgICBDU1JfRUVQUk9NX1JFR19NU0tfQUREUiAmIChhZGRyIDw8IDEpKTsKKworCQlyZXQgPQorCQkgICAgX2lsX3BvbGxfYml0KGlsLCBDU1JfRUVQUk9NX1JFRywKKwkJCQkgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0ssCisJCQkJIENTUl9FRVBST01fUkVHX1JFQURfVkFMSURfTVNLLAorCQkJCSBJTF9FRVBST01fQUNDRVNTX1RJTUVPVVQpOworCQlpZiAocmV0IDwgMCkgeworCQkJSUxfRVJSKCJUaW1lIG91dCByZWFkaW5nIEVFUFJPTVslZF1cbiIsIGFkZHIpOworCQkJZ290byBkb25lOworCQl9CisJCXIgPSBfaWxfcmQoaWwsIENTUl9FRVBST01fUkVHKTsKKwkJZVthZGRyIC8gMl0gPSBjcHVfdG9fbGUxNihyID4+IDE2KTsKKwl9CisKKwlEX0VFUFJPTSgiTlZNIFR5cGU6ICVzLCB2ZXJzaW9uOiAweCV4XG4iLCAiRUVQUk9NIiwKKwkJIGlsX2VlcHJvbV9xdWVyeTE2KGlsLCBFRVBST01fVkVSU0lPTikpOworCisJcmV0ID0gMDsKK2RvbmU6CisJaWwtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVsZWFzZV9zZW1hcGhvcmUoaWwpOworCitlcnI6CisJaWYgKHJldCkKKwkJaWxfZWVwcm9tX2ZyZWUoaWwpOworCS8qIFJlc2V0IGNoaXAgdG8gc2F2ZSBwb3dlciB1bnRpbCB3ZSBsb2FkIHVDb2RlIGR1cmluZyAidXAiLiAqLworCWlsX2FwbV9zdG9wKGlsKTsKK2FsbG9jX2VycjoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9lZXByb21faW5pdCk7CisKK3ZvaWQKK2lsX2VlcHJvbV9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlrZnJlZShpbC0+ZWVwcm9tKTsKKwlpbC0+ZWVwcm9tID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaWxfZWVwcm9tX2ZyZWUpOworCitzdGF0aWMgdm9pZAoraWxfaW5pdF9iYW5kX3JlZmVyZW5jZShjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCBlZXBfYmFuZCwKKwkJICAgICAgIGludCAqZWVwcm9tX2NoX2NvdW50LAorCQkgICAgICAgY29uc3Qgc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsICoqZWVwcm9tX2NoX2luZm8sCisJCSAgICAgICBjb25zdCB1OCAqKmVlcHJvbV9jaF9pZHgpCit7CisJdTMyIG9mZnNldCA9CisJICAgIGlsLT5jZmctPm9wcy0+bGliLT5lZXByb21fb3BzLnJlZ3VsYXRvcnlfYmFuZHNbZWVwX2JhbmQgLSAxXTsKKwlzd2l0Y2ggKGVlcF9iYW5kKSB7CisJY2FzZSAxOgkJLyogMi40R0h6IGJhbmQgKi8KKwkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfMSk7CisJCSplZXByb21fY2hfaW5mbyA9CisJCSAgICAoc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsICopaWxfZWVwcm9tX3F1ZXJ5X2FkZHIoaWwsCisJCQkJCQkJCSAgICAgb2Zmc2V0KTsKKwkJKmVlcHJvbV9jaF9pZHggPSBpbF9lZXByb21fYmFuZF8xOworCQlicmVhazsKKwljYXNlIDI6CQkvKiA0LjlHSHogYmFuZCAqLworCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF8yKTsKKwkJKmVlcHJvbV9jaF9pbmZvID0KKwkJICAgIChzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKilpbF9lZXByb21fcXVlcnlfYWRkcihpbCwKKwkJCQkJCQkJICAgICBvZmZzZXQpOworCQkqZWVwcm9tX2NoX2lkeCA9IGlsX2VlcHJvbV9iYW5kXzI7CisJCWJyZWFrOworCWNhc2UgMzoJCS8qIDUuMkdIeiBiYW5kICovCisJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzMpOworCQkqZWVwcm9tX2NoX2luZm8gPQorCQkgICAgKHN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCAqKWlsX2VlcHJvbV9xdWVyeV9hZGRyKGlsLAorCQkJCQkJCQkgICAgIG9mZnNldCk7CisJCSplZXByb21fY2hfaWR4ID0gaWxfZWVwcm9tX2JhbmRfMzsKKwkJYnJlYWs7CisJY2FzZSA0OgkJLyogNS41R0h6IGJhbmQgKi8KKwkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfNCk7CisJCSplZXByb21fY2hfaW5mbyA9CisJCSAgICAoc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsICopaWxfZWVwcm9tX3F1ZXJ5X2FkZHIoaWwsCisJCQkJCQkJCSAgICAgb2Zmc2V0KTsKKwkJKmVlcHJvbV9jaF9pZHggPSBpbF9lZXByb21fYmFuZF80OworCQlicmVhazsKKwljYXNlIDU6CQkvKiA1LjdHSHogYmFuZCAqLworCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF81KTsKKwkJKmVlcHJvbV9jaF9pbmZvID0KKwkJICAgIChzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKilpbF9lZXByb21fcXVlcnlfYWRkcihpbCwKKwkJCQkJCQkJICAgICBvZmZzZXQpOworCQkqZWVwcm9tX2NoX2lkeCA9IGlsX2VlcHJvbV9iYW5kXzU7CisJCWJyZWFrOworCWNhc2UgNjoJCS8qIDIuNEdIeiBodDQwIGNoYW5uZWxzICovCisJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzYpOworCQkqZWVwcm9tX2NoX2luZm8gPQorCQkgICAgKHN0cnVjdCBpbF9lZXByb21fY2hhbm5lbCAqKWlsX2VlcHJvbV9xdWVyeV9hZGRyKGlsLAorCQkJCQkJCQkgICAgIG9mZnNldCk7CisJCSplZXByb21fY2hfaWR4ID0gaWxfZWVwcm9tX2JhbmRfNjsKKwkJYnJlYWs7CisJY2FzZSA3OgkJLyogNSBHSHogaHQ0MCBjaGFubmVscyAqLworCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF83KTsKKwkJKmVlcHJvbV9jaF9pbmZvID0KKwkJICAgIChzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKilpbF9lZXByb21fcXVlcnlfYWRkcihpbCwKKwkJCQkJCQkJICAgICBvZmZzZXQpOworCQkqZWVwcm9tX2NoX2lkeCA9IGlsX2VlcHJvbV9iYW5kXzc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KK30KKworI2RlZmluZSBDSEVDS19BTkRfUFJJTlQoeCkgKChlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfIyN4KSBcCisJCQkgICAgPyAjIHggIiAiIDogIiIpCisvKioKKyAqIGlsX21vZF9odDQwX2NoYW5faW5mbyAtIENvcHkgaHQ0MCBjaGFubmVsIGluZm8gaW50byBkcml2ZXIncyBpbC4KKyAqCisgKiBEb2VzIG5vdCBzZXQgdXAgYSBjb21tYW5kLCBvciB0b3VjaCBoYXJkd2FyZS4KKyAqLworc3RhdGljIGludAoraWxfbW9kX2h0NDBfY2hhbl9pbmZvKHN0cnVjdCBpbF9wcml2ICppbCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLCB1MTYgY2hhbm5lbCwKKwkJICAgICAgY29uc3Qgc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsICplZXByb21fY2gsCisJCSAgICAgIHU4IGNsZWFyX2h0NDBfZXh0ZW5zaW9uX2NoYW5uZWwpCit7CisJc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKworCWNoX2luZm8gPQorCSAgICAoc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqKWlsX2dldF9jaGFubmVsX2luZm8oaWwsIGJhbmQsIGNoYW5uZWwpOworCisJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKQorCQlyZXR1cm4gLTE7CisKKwlEX0VFUFJPTSgiSFQ0MCBDaC4gJWQgWyVzR0h6XSAlcyVzJXMlcyVzKDB4JTAyeCAlZGRCbSk6IgorCQkgIiBBZC1Ib2MgJXNzdXBwb3J0ZWRcbiIsIGNoX2luZm8tPmNoYW5uZWwsCisJCSBpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKSA/ICI1LjIiIDogIjIuNCIsCisJCSBDSEVDS19BTkRfUFJJTlQoSUJTUyksIENIRUNLX0FORF9QUklOVChBQ1RJVkUpLAorCQkgQ0hFQ0tfQU5EX1BSSU5UKFJBREFSKSwgQ0hFQ0tfQU5EX1BSSU5UKFdJREUpLAorCQkgQ0hFQ0tfQU5EX1BSSU5UKERGUyksIGVlcHJvbV9jaC0+ZmxhZ3MsCisJCSBlZXByb21fY2gtPm1heF9wb3dlcl9hdmcsCisJCSAoKGVlcHJvbV9jaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9JQlNTKSAmJgorCQkgICEoZWVwcm9tX2NoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX1JBREFSKSkgPyAiIiA6ICJub3QgIik7CisKKwljaF9pbmZvLT5odDQwX2VlcHJvbSA9ICplZXByb21fY2g7CisJY2hfaW5mby0+aHQ0MF9tYXhfcG93ZXJfYXZnID0gZWVwcm9tX2NoLT5tYXhfcG93ZXJfYXZnOworCWNoX2luZm8tPmh0NDBfZmxhZ3MgPSBlZXByb21fY2gtPmZsYWdzOworCWlmIChlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfVkFMSUQpCisJCWNoX2luZm8tPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgJj0KKwkJICAgIH5jbGVhcl9odDQwX2V4dGVuc2lvbl9jaGFubmVsOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgQ0hFQ0tfQU5EX1BSSU5UX0koeCkgKChlZXByb21fY2hfaW5mb1tjaF0uZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF8jI3gpIFwKKwkJCSAgICA/ICMgeCAiICIgOiAiIikKKworLyoqCisgKiBpbF9pbml0X2NoYW5uZWxfbWFwIC0gU2V0IHVwIGRyaXZlcidzIGluZm8gZm9yIGFsbCBwb3NzaWJsZSBjaGFubmVscworICovCitpbnQKK2lsX2luaXRfY2hhbm5lbF9tYXAoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCBlZXByb21fY2hfY291bnQgPSAwOworCWNvbnN0IHU4ICplZXByb21fY2hfaWR4ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgKmVlcHJvbV9jaF9pbmZvID0gTlVMTDsKKwlpbnQgYmFuZCwgY2g7CisJc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKworCWlmIChpbC0+Y2hhbm5lbF9jb3VudCkgeworCQlEX0VFUFJPTSgiQ2hhbm5lbCBtYXAgYWxyZWFkeSBpbml0aWFsaXplZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEX0VFUFJPTSgiSW5pdGlhbGl6aW5nIHJlZ3VsYXRvcnkgaW5mbyBmcm9tIEVFUFJPTVxuIik7CisKKwlpbC0+Y2hhbm5lbF9jb3VudCA9CisJICAgIEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfMSkgKyBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzIpICsKKwkgICAgQVJSQVlfU0laRShpbF9lZXByb21fYmFuZF8zKSArIEFSUkFZX1NJWkUoaWxfZWVwcm9tX2JhbmRfNCkgKworCSAgICBBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzUpOworCisJRF9FRVBST00oIlBhcnNpbmcgZGF0YSBmb3IgJWQgY2hhbm5lbHMuXG4iLCBpbC0+Y2hhbm5lbF9jb3VudCk7CisKKwlpbC0+Y2hhbm5lbF9pbmZvID0KKwkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IGlsX2NoYW5uZWxfaW5mbykgKiBpbC0+Y2hhbm5lbF9jb3VudCwKKwkJICAgIEdGUF9LRVJORUwpOworCWlmICghaWwtPmNoYW5uZWxfaW5mbykgeworCQlJTF9FUlIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBjaGFubmVsX2luZm9cbiIpOworCQlpbC0+Y2hhbm5lbF9jb3VudCA9IDA7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWNoX2luZm8gPSBpbC0+Y2hhbm5lbF9pbmZvOworCisJLyogTG9vcCB0aHJvdWdoIHRoZSA1IEVFUFJPTSBiYW5kcyBhZGRpbmcgdGhlbSBpbiBvcmRlciB0byB0aGUKKwkgKiBjaGFubmVsIG1hcCB3ZSBtYWludGFpbiAodGhhdCBjb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYW4KKwkgKiB3aGF0IGp1c3QgaW4gdGhlIEVFUFJPTSkgKi8KKwlmb3IgKGJhbmQgPSAxOyBiYW5kIDw9IDU7IGJhbmQrKykgeworCisJCWlsX2luaXRfYmFuZF9yZWZlcmVuY2UoaWwsIGJhbmQsICZlZXByb21fY2hfY291bnQsCisJCQkJICAgICAgICZlZXByb21fY2hfaW5mbywgJmVlcHJvbV9jaF9pZHgpOworCisJCS8qIExvb3AgdGhyb3VnaCBlYWNoIGJhbmQgYWRkaW5nIGVhY2ggb2YgdGhlIGNoYW5uZWxzICovCisJCWZvciAoY2ggPSAwOyBjaCA8IGVlcHJvbV9jaF9jb3VudDsgY2grKykgeworCQkJY2hfaW5mby0+Y2hhbm5lbCA9IGVlcHJvbV9jaF9pZHhbY2hdOworCQkJY2hfaW5mby0+YmFuZCA9CisJCQkgICAgKGJhbmQgPT0KKwkJCSAgICAgMSkgPyBJRUVFODAyMTFfQkFORF8yR0haIDogSUVFRTgwMjExX0JBTkRfNUdIWjsKKworCQkJLyogcGVybWFuZW50bHkgc3RvcmUgRUVQUk9NJ3MgY2hhbm5lbCByZWd1bGF0b3J5IGZsYWdzCisJCQkgKiAgIGFuZCBtYXggcG93ZXIgaW4gY2hhbm5lbCBpbmZvIGRhdGFiYXNlLiAqLworCQkJY2hfaW5mby0+ZWVwcm9tID0gZWVwcm9tX2NoX2luZm9bY2hdOworCisJCQkvKiBDb3B5IHRoZSBydW4tdGltZSBmbGFncyBzbyB0aGV5IGFyZSB0aGVyZSBldmVuIG9uCisJCQkgKiBpbnZhbGlkIGNoYW5uZWxzICovCisJCQljaF9pbmZvLT5mbGFncyA9IGVlcHJvbV9jaF9pbmZvW2NoXS5mbGFnczsKKwkJCS8qIEZpcnN0IHdyaXRlIHRoYXQgaHQ0MCBpcyBub3QgZW5hYmxlZCwgYW5kIHRoZW4gZW5hYmxlCisJCQkgKiBvbmUgYnkgb25lICovCisJCQljaF9pbmZvLT5odDQwX2V4dGVuc2lvbl9jaGFubmVsID0KKwkJCSAgICBJRUVFODAyMTFfQ0hBTl9OT19IVDQwOworCisJCQlpZiAoIShpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSkgeworCQkJCURfRUVQUk9NKCJDaC4gJWQgRmxhZ3MgJXggWyVzR0h6XSAtICIKKwkJCQkJICJObyB0cmFmZmljXG4iLCBjaF9pbmZvLT5jaGFubmVsLAorCQkJCQkgY2hfaW5mby0+ZmxhZ3MsCisJCQkJCSBpbF9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKSA/ICI1LjIiIDoKKwkJCQkJICIyLjQiKTsKKwkJCQljaF9pbmZvKys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIEluaXRpYWxpemUgcmVndWxhdG9yeS1iYXNlZCBydW4tdGltZSBkYXRhICovCisJCQljaF9pbmZvLT5tYXhfcG93ZXJfYXZnID0gY2hfaW5mby0+Y3Vycl90eHBvdyA9CisJCQkgICAgZWVwcm9tX2NoX2luZm9bY2hdLm1heF9wb3dlcl9hdmc7CisJCQljaF9pbmZvLT5zY2FuX3Bvd2VyID0gZWVwcm9tX2NoX2luZm9bY2hdLm1heF9wb3dlcl9hdmc7CisJCQljaF9pbmZvLT5taW5fcG93ZXIgPSAwOworCisJCQlEX0VFUFJPTSgiQ2guICVkIFslc0dIel0gIiAiJXMlcyVzJXMlcyVzKDB4JTAyeCAlZGRCbSk6IgorCQkJCSAiIEFkLUhvYyAlc3N1cHBvcnRlZFxuIiwgY2hfaW5mby0+Y2hhbm5lbCwKKwkJCQkgaWxfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbykgPyAiNS4yIiA6ICIyLjQiLAorCQkJCSBDSEVDS19BTkRfUFJJTlRfSShWQUxJRCksCisJCQkJIENIRUNLX0FORF9QUklOVF9JKElCU1MpLAorCQkJCSBDSEVDS19BTkRfUFJJTlRfSShBQ1RJVkUpLAorCQkJCSBDSEVDS19BTkRfUFJJTlRfSShSQURBUiksCisJCQkJIENIRUNLX0FORF9QUklOVF9JKFdJREUpLAorCQkJCSBDSEVDS19BTkRfUFJJTlRfSShERlMpLAorCQkJCSBlZXByb21fY2hfaW5mb1tjaF0uZmxhZ3MsCisJCQkJIGVlcHJvbV9jaF9pbmZvW2NoXS5tYXhfcG93ZXJfYXZnLAorCQkJCSAoKGVlcHJvbV9jaF9pbmZvW2NoXS4KKwkJCQkgICBmbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpICYmCisJCQkJICAhKGVlcHJvbV9jaF9pbmZvW2NoXS4KKwkJCQkgICAgZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9SQURBUikpID8gIiIgOgorCQkJCSAibm90ICIpOworCisJCQljaF9pbmZvKys7CisJCX0KKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBkbyBoYXZlIEhUNDAgY2hhbm5lbHMgKi8KKwlpZiAoaWwtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1s1XSA9PQorCSAgICBFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDAgJiYKKwkgICAgaWwtPmNmZy0+b3BzLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1s2XSA9PQorCSAgICBFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDApCisJCXJldHVybiAwOworCisJLyogVHdvIGFkZGl0aW9uYWwgRUVQUk9NIGJhbmRzIGZvciAyLjQgYW5kIDUgR0h6IEhUNDAgY2hhbm5lbHMgKi8KKwlmb3IgKGJhbmQgPSA2OyBiYW5kIDw9IDc7IGJhbmQrKykgeworCQllbnVtIGllZWU4MDIxMV9iYW5kIGllZWViYW5kOworCisJCWlsX2luaXRfYmFuZF9yZWZlcmVuY2UoaWwsIGJhbmQsICZlZXByb21fY2hfY291bnQsCisJCQkJICAgICAgICZlZXByb21fY2hfaW5mbywgJmVlcHJvbV9jaF9pZHgpOworCisJCS8qIEVFUFJPTSBiYW5kIDYgaXMgMi40LCBiYW5kIDcgaXMgNSBHSHogKi8KKwkJaWVlZWJhbmQgPQorCQkgICAgKGJhbmQgPT0gNikgPyBJRUVFODAyMTFfQkFORF8yR0haIDogSUVFRTgwMjExX0JBTkRfNUdIWjsKKworCQkvKiBMb29wIHRocm91Z2ggZWFjaCBiYW5kIGFkZGluZyBlYWNoIG9mIHRoZSBjaGFubmVscyAqLworCQlmb3IgKGNoID0gMDsgY2ggPCBlZXByb21fY2hfY291bnQ7IGNoKyspIHsKKwkJCS8qIFNldCB1cCBkcml2ZXIncyBpbmZvIGZvciBsb3dlciBoYWxmICovCisJCQlpbF9tb2RfaHQ0MF9jaGFuX2luZm8oaWwsIGllZWViYW5kLCBlZXByb21fY2hfaWR4W2NoXSwKKwkJCQkJICAgICAgJmVlcHJvbV9jaF9pbmZvW2NoXSwKKwkJCQkJICAgICAgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MFBMVVMpOworCisJCQkvKiBTZXQgdXAgZHJpdmVyJ3MgaW5mbyBmb3IgdXBwZXIgaGFsZiAqLworCQkJaWxfbW9kX2h0NDBfY2hhbl9pbmZvKGlsLCBpZWVlYmFuZCwKKwkJCQkJICAgICAgZWVwcm9tX2NoX2lkeFtjaF0gKyA0LAorCQkJCQkgICAgICAmZWVwcm9tX2NoX2luZm9bY2hdLAorCQkJCQkgICAgICBJRUVFODAyMTFfQ0hBTl9OT19IVDQwTUlOVVMpOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2luaXRfY2hhbm5lbF9tYXApOworCisvKgorICogaWxfZnJlZV9jaGFubmVsX21hcCAtIHVuZG8gYWxsb2NhdGlvbnMgaW4gaWxfaW5pdF9jaGFubmVsX21hcAorICovCit2b2lkCitpbF9mcmVlX2NoYW5uZWxfbWFwKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlrZnJlZShpbC0+Y2hhbm5lbF9pbmZvKTsKKwlpbC0+Y2hhbm5lbF9jb3VudCA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2ZyZWVfY2hhbm5lbF9tYXApOworCisvKioKKyAqIGlsX2dldF9jaGFubmVsX2luZm8gLSBGaW5kIGRyaXZlcidzIGlsYXRlIGNoYW5uZWwgaW5mbworICoKKyAqIEJhc2VkIG9uIGJhbmQgYW5kIGNoYW5uZWwgbnVtYmVyLgorICovCitjb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICoKK2lsX2dldF9jaGFubmVsX2luZm8oY29uc3Qgc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCSAgICB1MTYgY2hhbm5lbCkKK3sKKwlpbnQgaTsKKworCXN3aXRjaCAoYmFuZCkgeworCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKKwkJZm9yIChpID0gMTQ7IGkgPCBpbC0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7CisJCQlpZiAoaWwtPmNoYW5uZWxfaW5mb1tpXS5jaGFubmVsID09IGNoYW5uZWwpCisJCQkJcmV0dXJuICZpbC0+Y2hhbm5lbF9pbmZvW2ldOworCQl9CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKKwkJaWYgKGNoYW5uZWwgPj0gMSAmJiBjaGFubmVsIDw9IDE0KQorCQkJcmV0dXJuICZpbC0+Y2hhbm5lbF9pbmZvW2NoYW5uZWwgLSAxXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJQlVHKCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2dldF9jaGFubmVsX2luZm8pOworCisvKgorICogU2V0dGluZyBwb3dlciBsZXZlbCBhbGxvd3MgdGhlIGNhcmQgdG8gZ28gdG8gc2xlZXAgd2hlbiBub3QgYnVzeS4KKyAqCisgKiBXZSBjYWxjdWxhdGUgYSBzbGVlcCBjb21tYW5kIGJhc2VkIG9uIHRoZSByZXF1aXJlZCBsYXRlbmN5LCB3aGljaAorICogd2UgZ2V0IGZyb20gbWFjODAyMTEuIEluIG9yZGVyIHRvIGhhbmRsZSB0aGVybWFsIHRocm90dGxpbmcsIHdlIGNhbgorICogYWxzbyB1c2UgcHJlLWRlZmluZWQgcG93ZXIgbGV2ZWxzLgorICovCisKKy8qCisgKiBUaGlzIGRlZmluZXMgdGhlIG9sZCBwb3dlciBsZXZlbHMuIFRoZXkgYXJlIHN0aWxsIHVzZWQgYnkgZGVmYXVsdAorICogKGxldmVsIDEpIGFuZCBmb3IgdGhlcm1hbCB0aHJvdHRsZSAobGV2ZWxzIDMgdGhyb3VnaCA1KQorICovCisKK3N0cnVjdCBpbF9wb3dlcl92ZWNfZW50cnkgeworCXN0cnVjdCBpbF9wb3dlcnRhYmxlX2NtZCBjbWQ7CisJdTggbm9fZHRpbTsJCS8qIG51bWJlciBvZiBza2lwIGR0aW0gKi8KK307CisKK3N0YXRpYyB2b2lkCitpbF9wb3dlcl9zbGVlcF9jYW1fY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3Bvd2VydGFibGVfY21kICpjbWQpCit7CisJbWVtc2V0KGNtZCwgMCwgc2l6ZW9mKCpjbWQpKTsKKworCWlmIChpbC0+cG93ZXJfZGF0YS5wY2lfcG0pCisJCWNtZC0+ZmxhZ3MgfD0gSUxfUE9XRVJfUENJX1BNX01TSzsKKworCURfUE9XRVIoIlNsZWVwIGNvbW1hbmQgZm9yIENBTVxuIik7Cit9CisKK3N0YXRpYyBpbnQKK2lsX3NldF9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9wb3dlcnRhYmxlX2NtZCAqY21kKQoreworCURfUE9XRVIoIlNlbmRpbmcgcG93ZXIvc2xlZXAgY29tbWFuZFxuIik7CisJRF9QT1dFUigiRmxhZ3MgdmFsdWUgPSAweCUwOFhcbiIsIGNtZC0+ZmxhZ3MpOworCURfUE9XRVIoIlR4IHRpbWVvdXQgPSAldVxuIiwgbGUzMl90b19jcHUoY21kLT50eF9kYXRhX3RpbWVvdXQpKTsKKwlEX1BPV0VSKCJSeCB0aW1lb3V0ID0gJXVcbiIsIGxlMzJfdG9fY3B1KGNtZC0+cnhfZGF0YV90aW1lb3V0KSk7CisJRF9QT1dFUigiU2xlZXAgaW50ZXJ2YWwgdmVjdG9yID0geyAlZCAsICVkICwgJWQgLCAlZCAsICVkIH1cbiIsCisJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbMF0pLAorCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzFdKSwKKwkJbGUzMl90b19jcHUoY21kLT5zbGVlcF9pbnRlcnZhbFsyXSksCisJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbM10pLAorCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzRdKSk7CisKKwlyZXR1cm4gaWxfc2VuZF9jbWRfcGR1KGlsLCBDX1BPV0VSX1RCTCwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX3Bvd2VydGFibGVfY21kKSwgY21kKTsKK30KKworaW50CitpbF9wb3dlcl9zZXRfbW9kZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9wb3dlcnRhYmxlX2NtZCAqY21kLCBib29sIGZvcmNlKQoreworCWludCByZXQ7CisJYm9vbCB1cGRhdGVfY2hhaW5zOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCS8qIERvbid0IHVwZGF0ZSB0aGUgUlggY2hhaW4gd2hlbiBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbiBpcyBydW5uaW5nICovCisJdXBkYXRlX2NoYWlucyA9IGlsLT5jaGFpbl9ub2lzZV9kYXRhLnN0YXRlID09IElMX0NIQUlOX05PSVNFX0RPTkUgfHwKKwkgICAgaWwtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUgPT0gSUxfQ0hBSU5fTk9JU0VfQUxJVkU7CisKKwlpZiAoIW1lbWNtcCgmaWwtPnBvd2VyX2RhdGEuc2xlZXBfY21kLCBjbWQsIHNpemVvZigqY21kKSkgJiYgIWZvcmNlKQorCQlyZXR1cm4gMDsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHNjYW4gY29tcGxldGUgdXNlIHNsZWVwX3Bvd2VyX25leHQsIG5lZWQgdG8gYmUgdXBkYXRlZCAqLworCW1lbWNweSgmaWwtPnBvd2VyX2RhdGEuc2xlZXBfY21kX25leHQsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKKwlpZiAodGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpICYmICFmb3JjZSkgeworCQlEX0lORk8oIkRlZmVyIHBvd2VyIHNldCBtb2RlIHdoaWxlIHNjYW5uaW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNtZC0+ZmxhZ3MgJiBJTF9QT1dFUl9EUklWRVJfQUxMT1dfU0xFRVBfTVNLKQorCQlzZXRfYml0KFNfUE9XRVJfUE1JLCAmaWwtPnN0YXR1cyk7CisKKwlyZXQgPSBpbF9zZXRfcG93ZXIoaWwsIGNtZCk7CisJaWYgKCFyZXQpIHsKKwkJaWYgKCEoY21kLT5mbGFncyAmIElMX1BPV0VSX0RSSVZFUl9BTExPV19TTEVFUF9NU0spKQorCQkJY2xlYXJfYml0KFNfUE9XRVJfUE1JLCAmaWwtPnN0YXR1cyk7CisKKwkJaWYgKGlsLT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MgJiYgdXBkYXRlX2NoYWlucykKKwkJCWlsLT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MoaWwpOworCQllbHNlIGlmIChpbC0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKQorCQkJRF9QT1dFUigiQ2Fubm90IHVwZGF0ZSB0aGUgcG93ZXIsIGNoYWluIG5vaXNlICIKKwkJCQkiY2FsaWJyYXRpb24gcnVubmluZzogJWRcbiIsCisJCQkJaWwtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUpOworCisJCW1lbWNweSgmaWwtPnBvd2VyX2RhdGEuc2xlZXBfY21kLCBjbWQsIHNpemVvZigqY21kKSk7CisJfSBlbHNlCisJCUlMX0VSUigic2V0IHBvd2VyIGZhaWwsIHJldCA9ICVkIiwgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK2ludAoraWxfcG93ZXJfdXBkYXRlX21vZGUoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGZvcmNlKQoreworCXN0cnVjdCBpbF9wb3dlcnRhYmxlX2NtZCBjbWQ7CisKKwlpbF9wb3dlcl9zbGVlcF9jYW1fY21kKGlsLCAmY21kKTsKKwlyZXR1cm4gaWxfcG93ZXJfc2V0X21vZGUoaWwsICZjbWQsIGZvcmNlKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfcG93ZXJfdXBkYXRlX21vZGUpOworCisvKiBpbml0aWFsaXplIHRvIGRlZmF1bHQgKi8KK3ZvaWQKK2lsX3Bvd2VyX2luaXRpYWxpemUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXUxNiBsY3RsID0gaWxfcGNpZV9saW5rX2N0bChpbCk7CisKKwlpbC0+cG93ZXJfZGF0YS5wY2lfcG0gPSAhKGxjdGwgJiBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDBTX0VOKTsKKworCWlsLT5wb3dlcl9kYXRhLmRlYnVnX3NsZWVwX2xldmVsX292ZXJyaWRlID0gLTE7CisKKwltZW1zZXQoJmlsLT5wb3dlcl9kYXRhLnNsZWVwX2NtZCwgMCwgc2l6ZW9mKGlsLT5wb3dlcl9kYXRhLnNsZWVwX2NtZCkpOworfQorRVhQT1JUX1NZTUJPTChpbF9wb3dlcl9pbml0aWFsaXplKTsKKworLyogRm9yIGFjdGl2ZSBzY2FuLCBsaXN0ZW4gQUNUSVZFX0RXRUxMX1RJTUUgKG1zZWMpIG9uIGVhY2ggY2hhbm5lbCBhZnRlcgorICogc2VuZGluZyBwcm9iZSByZXEuICBUaGlzIHNob3VsZCBiZSBzZXQgbG9uZyBlbm91Z2ggdG8gaGVhciBwcm9iZSByZXNwb25zZXMKKyAqIGZyb20gbW9yZSB0aGFuIG9uZSBBUC4gICovCisjZGVmaW5lIElMX0FDVElWRV9EV0VMTF9USU1FXzI0ICAgICgzMCkJLyogYWxsIHRpbWVzIGluIG1zZWMgKi8KKyNkZWZpbmUgSUxfQUNUSVZFX0RXRUxMX1RJTUVfNTIgICAgKDIwKQorCisjZGVmaW5lIElMX0FDVElWRV9EV0VMTF9GQUNUT1JfMjRHSFogKDMpCisjZGVmaW5lIElMX0FDVElWRV9EV0VMTF9GQUNUT1JfNTJHSFogKDIpCisKKy8qIEZvciBwYXNzaXZlIHNjYW4sIGxpc3RlbiBQQVNTSVZFX0RXRUxMX1RJTUUgKG1zZWMpIG9uIGVhY2ggY2hhbm5lbC4KKyAqIE11c3QgYmUgc2V0IGxvbmdlciB0aGFuIGFjdGl2ZSBkd2VsbCB0aW1lLgorICogRm9yIHRoZSBtb3N0IHJlbGlhYmxlIHNjYW4sIHNldCA+IEFQIGJlYWNvbiBpbnRlcnZhbCAodHlwaWNhbGx5IDEwMG1zZWMpLiAqLworI2RlZmluZSBJTF9QQVNTSVZFX0RXRUxMX1RJTUVfMjQgICAoMjApCS8qIGFsbCB0aW1lcyBpbiBtc2VjICovCisjZGVmaW5lIElMX1BBU1NJVkVfRFdFTExfVElNRV81MiAgICgxMCkKKyNkZWZpbmUgSUxfUEFTU0lWRV9EV0VMTF9CQVNFICAgICAgKDEwMCkKKyNkZWZpbmUgSUxfQ0hBTk5FTF9UVU5FX1RJTUUgICAgICAgNQorCitzdGF0aWMgaW50CitpbF9zZW5kX3NjYW5fYWJvcnQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQ7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0OworCXN0cnVjdCBpbF9ob3N0X2NtZCBjbWQgPSB7CisJCS5pZCA9IENfU0NBTl9BQk9SVCwKKwkJLmZsYWdzID0gQ01EX1dBTlRfU0tCLAorCX07CisKKwkvKiBFeGl0IGluc3RhbnRseSB3aXRoIGVycm9yIHdoZW4gZGV2aWNlIGlzIG5vdCByZWFkeQorCSAqIHRvIHJlY2VpdmUgc2NhbiBhYm9ydCBjb21tYW5kIG9yIGl0IGRvZXMgbm90IHBlcmZvcm0KKwkgKiBoYXJkd2FyZSBzY2FuIGN1cnJlbnRseSAqLworCWlmICghdGVzdF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpIHx8CisJICAgICF0ZXN0X2JpdChTX0dFT19DT05GSUdVUkVELCAmaWwtPnN0YXR1cykgfHwKKwkgICAgIXRlc3RfYml0KFNfU0NBTl9IVywgJmlsLT5zdGF0dXMpIHx8CisJICAgIHRlc3RfYml0KFNfRldfRVJST1IsICZpbC0+c3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm4gLUVJTzsKKworCXJldCA9IGlsX3NlbmRfY21kX3N5bmMoaWwsICZjbWQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlwa3QgPSAoc3RydWN0IGlsX3J4X3BrdCAqKWNtZC5yZXBseV9wYWdlOworCWlmIChwa3QtPnUuc3RhdHVzICE9IENBTl9BQk9SVF9TVEFUVVMpIHsKKwkJLyogVGhlIHNjYW4gYWJvcnQgd2lsbCByZXR1cm4gMSBmb3Igc3VjY2VzcyBvcgorCQkgKiAyIGZvciAiZmFpbHVyZSIuICBBIGZhaWx1cmUgY29uZGl0aW9uIGNhbiBiZQorCQkgKiBkdWUgdG8gc2ltcGx5IG5vdCBiZWluZyBpbiBhbiBhY3RpdmUgc2NhbiB3aGljaAorCQkgKiBjYW4gb2NjdXIgaWYgd2Ugc2VuZCB0aGUgc2NhbiBhYm9ydCBiZWZvcmUgd2UKKwkJICogdGhlIG1pY3JvY29kZSBoYXMgbm90aWZpZWQgdXMgdGhhdCBhIHNjYW4gaXMKKwkJICogY29tcGxldGVkLiAqLworCQlEX1NDQU4oIlNDQU5fQUJPUlQgcmV0ICVkLlxuIiwgcGt0LT51LnN0YXR1cyk7CisJCXJldCA9IC1FSU87CisJfQorCisJaWxfZnJlZV9wYWdlcyhpbCwgY21kLnJlcGx5X3BhZ2UpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitpbF9jb21wbGV0ZV9zY2FuKHN0cnVjdCBpbF9wcml2ICppbCwgYm9vbCBhYm9ydGVkKQoreworCS8qIGNoZWNrIGlmIHNjYW4gd2FzIHJlcXVlc3RlZCBmcm9tIG1hYzgwMjExICovCisJaWYgKGlsLT5zY2FuX3JlcXVlc3QpIHsKKwkJRF9TQ0FOKCJDb21wbGV0ZSBzY2FuIGluIG1hYzgwMjExXG4iKTsKKwkJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKGlsLT5odywgYWJvcnRlZCk7CisJfQorCisJaWwtPnNjYW5fdmlmID0gTlVMTDsKKwlpbC0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKK30KKwordm9pZAoraWxfZm9yY2Vfc2Nhbl9lbmQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAoIXRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIkZvcmNpbmcgc2NhbiBlbmQgd2hpbGUgbm90IHNjYW5uaW5nXG4iKTsKKwkJcmV0dXJuOworCX0KKworCURfU0NBTigiRm9yY2luZyBzY2FuIGVuZFxuIik7CisJY2xlYXJfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKTsKKwljbGVhcl9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7CisJY2xlYXJfYml0KFNfU0NBTl9BQk9SVElORywgJmlsLT5zdGF0dXMpOworCWlsX2NvbXBsZXRlX3NjYW4oaWwsIHRydWUpOworfQorCitzdGF0aWMgdm9pZAoraWxfZG9fc2Nhbl9hYm9ydChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmlsLT5tdXRleCk7CisKKwlpZiAoIXRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIk5vdCBwZXJmb3JtaW5nIHNjYW4gdG8gYWJvcnRcbiIpOworCQlyZXR1cm47CisJfQorCisJaWYgKHRlc3RfYW5kX3NldF9iaXQoU19TQ0FOX0FCT1JUSU5HLCAmaWwtPnN0YXR1cykpIHsKKwkJRF9TQ0FOKCJTY2FuIGFib3J0IGluIHByb2dyZXNzXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJldCA9IGlsX3NlbmRfc2Nhbl9hYm9ydChpbCk7CisJaWYgKHJldCkgeworCQlEX1NDQU4oIlNlbmQgc2NhbiBhYm9ydCBmYWlsZWQgJWRcbiIsIHJldCk7CisJCWlsX2ZvcmNlX3NjYW5fZW5kKGlsKTsKKwl9IGVsc2UKKwkJRF9TQ0FOKCJTdWNjZXNzZnVsbHkgc2VuZCBzY2FuIGFib3J0XG4iKTsKK30KKworLyoqCisgKiBpbF9zY2FuX2NhbmNlbCAtIENhbmNlbCBhbnkgY3VycmVudGx5IGV4ZWN1dGluZyBIVyBzY2FuCisgKi8KK2ludAoraWxfc2Nhbl9jYW5jZWwoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCURfU0NBTigiUXVldWluZyBhYm9ydCBzY2FuXG4iKTsKKwlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+YWJvcnRfc2Nhbik7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NjYW5fY2FuY2VsKTsKKworLyoqCisgKiBpbF9zY2FuX2NhbmNlbF90aW1lb3V0IC0gQ2FuY2VsIGFueSBjdXJyZW50bHkgZXhlY3V0aW5nIEhXIHNjYW4KKyAqIEBtczogYW1vdW50IG9mIHRpbWUgdG8gd2FpdCAoaW4gbWlsbGlzZWNvbmRzKSBmb3Igc2NhbiB0byBhYm9ydAorICoKKyAqLworaW50CitpbF9zY2FuX2NhbmNlbF90aW1lb3V0KHN0cnVjdCBpbF9wcml2ICppbCwgdW5zaWduZWQgbG9uZyBtcykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhtcyk7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJRF9TQ0FOKCJTY2FuIGNhbmNlbCB0aW1lb3V0XG4iKTsKKworCWlsX2RvX3NjYW5fYWJvcnQoaWwpOworCisJd2hpbGUgKHRpbWVfYmVmb3JlX2VxKGppZmZpZXMsIHRpbWVvdXQpKSB7CisJCWlmICghdGVzdF9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cykpCisJCQlicmVhazsKKwkJbXNsZWVwKDIwKTsKKwl9CisKKwlyZXR1cm4gdGVzdF9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NjYW5fY2FuY2VsX3RpbWVvdXQpOworCisvKiBTZXJ2aWNlIHJlc3BvbnNlIHRvIENfU0NBTiAoMHg4MCkgKi8KK3N0YXRpYyB2b2lkCitpbF9oZGxfc2NhbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXN0cnVjdCBpbF9zY2FucmVxX25vdGlmaWNhdGlvbiAqbm90aWYgPQorCSAgICAoc3RydWN0IGlsX3NjYW5yZXFfbm90aWZpY2F0aW9uICopcGt0LT51LnJhdzsKKworCURfU0NBTigiU2NhbiByZXF1ZXN0IHN0YXR1cyA9IDB4JXhcbiIsIG5vdGlmLT5zdGF0dXMpOworI2VuZGlmCit9CisKKy8qIFNlcnZpY2UgTl9TQ0FOX1NUQVJUICgweDgyKSAqLworc3RhdGljIHZvaWQKK2lsX2hkbF9zY2FuX3N0YXJ0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX3NjYW5zdGFydF9ub3RpZmljYXRpb24gKm5vdGlmID0KKwkgICAgKHN0cnVjdCBpbF9zY2Fuc3RhcnRfbm90aWZpY2F0aW9uICopcGt0LT51LnJhdzsKKwlpbC0+c2Nhbl9zdGFydF90c2YgPSBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2xvdyk7CisJRF9TQ0FOKCJTY2FuIHN0YXJ0OiAiICIlZCBbODAyLjExJXNdICIKKwkgICAgICAgIihUU0Y6IDB4JTA4WDolMDhYKSAtICVkIChiZWFjb24gdGltZXIgJXUpXG4iLCBub3RpZi0+Y2hhbm5lbCwKKwkgICAgICAgbm90aWYtPmJhbmQgPyAiYmciIDogImEiLCBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2hpZ2gpLAorCSAgICAgICBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2xvdyksIG5vdGlmLT5zdGF0dXMsIG5vdGlmLT5iZWFjb25fdGltZXIpOworfQorCisvKiBTZXJ2aWNlIE5fU0NBTl9SRVNVTFRTICgweDgzKSAqLworc3RhdGljIHZvaWQKK2lsX2hkbF9zY2FuX3Jlc3VsdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfc2NhbnJlc3VsdHNfbm90aWZpY2F0aW9uICpub3RpZiA9CisJICAgIChzdHJ1Y3QgaWxfc2NhbnJlc3VsdHNfbm90aWZpY2F0aW9uICopcGt0LT51LnJhdzsKKworCURfU0NBTigiU2NhbiBjaC5yZXM6ICIgIiVkIFs4MDIuMTElc10gIiAiKFRTRjogMHglMDhYOiUwOFgpIC0gJWQgIgorCSAgICAgICAiZWxhcHNlZD0lbHUgdXNlY1xuIiwgbm90aWYtPmNoYW5uZWwsIG5vdGlmLT5iYW5kID8gImJnIiA6ICJhIiwKKwkgICAgICAgbGUzMl90b19jcHUobm90aWYtPnRzZl9oaWdoKSwgbGUzMl90b19jcHUobm90aWYtPnRzZl9sb3cpLAorCSAgICAgICBsZTMyX3RvX2NwdShub3RpZi0+c3RhdHNbMF0pLAorCSAgICAgICBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2xvdykgLSBpbC0+c2Nhbl9zdGFydF90c2YpOworI2VuZGlmCit9CisKKy8qIFNlcnZpY2UgTl9TQ0FOX0NPTVBMRVRFICgweDg0KSAqLworc3RhdGljIHZvaWQKK2lsX2hkbF9zY2FuX2NvbXBsZXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaWxfc2NhbmNvbXBsZXRlX25vdGlmaWNhdGlvbiAqc2Nhbl9ub3RpZiA9ICh2b2lkICopcGt0LT51LnJhdzsKKyNlbmRpZgorCisJRF9TQ0FOKCJTY2FuIGNvbXBsZXRlOiAlZCBjaGFubmVscyAoVFNGIDB4JTA4WDolMDhYKSAtICVkXG4iLAorCSAgICAgICBzY2FuX25vdGlmLT5zY2FubmVkX2NoYW5uZWxzLCBzY2FuX25vdGlmLT50c2ZfbG93LAorCSAgICAgICBzY2FuX25vdGlmLT50c2ZfaGlnaCwgc2Nhbl9ub3RpZi0+c3RhdHVzKTsKKworCS8qIFRoZSBIVyBpcyBubyBsb25nZXIgc2Nhbm5pbmcgKi8KKwljbGVhcl9iaXQoU19TQ0FOX0hXLCAmaWwtPnN0YXR1cyk7CisKKwlEX1NDQU4oIlNjYW4gb24gJXNHSHogdG9vayAlZG1zXG4iLAorCSAgICAgICAoaWwtPnNjYW5fYmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKSA/ICIyLjQiIDogIjUuMiIsCisJICAgICAgIGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyAtIGlsLT5zY2FuX3N0YXJ0KSk7CisKKwlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+c2Nhbl9jb21wbGV0ZWQpOworfQorCit2b2lkCitpbF9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwkvKiBzY2FuIGhhbmRsZXJzICovCisJaWwtPmhhbmRsZXJzW0NfU0NBTl0gPSBpbF9oZGxfc2NhbjsKKwlpbC0+aGFuZGxlcnNbTl9TQ0FOX1NUQVJUXSA9IGlsX2hkbF9zY2FuX3N0YXJ0OworCWlsLT5oYW5kbGVyc1tOX1NDQU5fUkVTVUxUU10gPSBpbF9oZGxfc2Nhbl9yZXN1bHRzOworCWlsLT5oYW5kbGVyc1tOX1NDQU5fQ09NUExFVEVdID0gaWxfaGRsX3NjYW5fY29tcGxldGU7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NldHVwX3J4X3NjYW5faGFuZGxlcnMpOworCitpbmxpbmUgdTE2CitpbF9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUoc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCQkgdTggbl9wcm9iZXMpCit7CisJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJcmV0dXJuIElMX0FDVElWRV9EV0VMTF9USU1FXzUyICsKKwkJICAgIElMX0FDVElWRV9EV0VMTF9GQUNUT1JfNTJHSFogKiAobl9wcm9iZXMgKyAxKTsKKwllbHNlCisJCXJldHVybiBJTF9BQ1RJVkVfRFdFTExfVElNRV8yNCArCisJCSAgICBJTF9BQ1RJVkVfRFdFTExfRkFDVE9SXzI0R0haICogKG5fcHJvYmVzICsgMSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2dldF9hY3RpdmVfZHdlbGxfdGltZSk7CisKK3UxNgoraWxfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKKwkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwl1MTYgdmFsdWU7CisKKwl1MTYgcGFzc2l2ZSA9CisJICAgIChiYW5kID09CisJICAgICBJRUVFODAyMTFfQkFORF8yR0haKSA/IElMX1BBU1NJVkVfRFdFTExfQkFTRSArCisJICAgIElMX1BBU1NJVkVfRFdFTExfVElNRV8yNCA6IElMX1BBU1NJVkVfRFdFTExfQkFTRSArCisJICAgIElMX1BBU1NJVkVfRFdFTExfVElNRV81MjsKKworCWlmIChpbF9pc19hbnlfYXNzb2NpYXRlZChpbCkpIHsKKwkJLyoKKwkJICogSWYgd2UncmUgYXNzb2NpYXRlZCwgd2UgY2xhbXAgdGhlIG1heGltdW0gcGFzc2l2ZQorCQkgKiBkd2VsbCB0aW1lIHRvIGJlIDk4JSBvZiB0aGUgc21hbGxlc3QgYmVhY29uIGludGVydmFsCisJCSAqIChtaW51cyAyICogY2hhbm5lbCB0dW5lIHRpbWUpCisJCSAqLworCQl2YWx1ZSA9IGN0eC0+dmlmID8gY3R4LT52aWYtPmJzc19jb25mLmJlYWNvbl9pbnQgOiAwOworCQlpZiAodmFsdWUgPiBJTF9QQVNTSVZFX0RXRUxMX0JBU0UgfHwgIXZhbHVlKQorCQkJdmFsdWUgPSBJTF9QQVNTSVZFX0RXRUxMX0JBU0U7CisJCXZhbHVlID0gKHZhbHVlICogOTgpIC8gMTAwIC0gSUxfQ0hBTk5FTF9UVU5FX1RJTUUgKiAyOworCQlwYXNzaXZlID0gbWluKHZhbHVlLCBwYXNzaXZlKTsKKwl9CisKKwlyZXR1cm4gcGFzc2l2ZTsKK30KK0VYUE9SVF9TWU1CT0woaWxfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZSk7CisKK3ZvaWQKK2lsX2luaXRfc2Nhbl9wYXJhbXMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXU4IGFudF9pZHggPSBmbHMoaWwtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpIC0gMTsKKwlpZiAoIWlsLT5zY2FuX3R4X2FudFtJRUVFODAyMTFfQkFORF81R0haXSkKKwkJaWwtPnNjYW5fdHhfYW50W0lFRUU4MDIxMV9CQU5EXzVHSFpdID0gYW50X2lkeDsKKwlpZiAoIWlsLT5zY2FuX3R4X2FudFtJRUVFODAyMTFfQkFORF8yR0haXSkKKwkJaWwtPnNjYW5fdHhfYW50W0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gYW50X2lkeDsKK30KK0VYUE9SVF9TWU1CT0woaWxfaW5pdF9zY2FuX3BhcmFtcyk7CisKK3N0YXRpYyBpbnQKK2lsX3NjYW5faW5pdGlhdGUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKFdBUk5fT04oIWlsLT5jZmctPm9wcy0+dXRpbHMtPnJlcXVlc3Rfc2NhbikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmlsLT5zY2FuX2NoZWNrKTsKKworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKSB7CisJCUlMX1dBUk4oIlJlcXVlc3Qgc2NhbiBjYWxsZWQgd2hlbiBkcml2ZXIgbm90IHJlYWR5LlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICh0ZXN0X2JpdChTX1NDQU5fSFcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIk11bHRpcGxlIGNvbmN1cnJlbnQgc2NhbiByZXF1ZXN0cyBpbiBwYXJhbGxlbC5cbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICh0ZXN0X2JpdChTX1NDQU5fQUJPUlRJTkcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIlNjYW4gcmVxdWVzdCB3aGlsZSBhYm9ydCBwZW5kaW5nLlxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJRF9TQ0FOKCJTdGFydGluZyBzY2FuLi4uXG4iKTsKKworCXNldF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpOworCWlsLT5zY2FuX3N0YXJ0ID0gamlmZmllczsKKworCXJldCA9IGlsLT5jZmctPm9wcy0+dXRpbHMtPnJlcXVlc3Rfc2NhbihpbCwgdmlmKTsKKwlpZiAocmV0KSB7CisJCWNsZWFyX2JpdChTX1NDQU5OSU5HLCAmaWwtPnN0YXR1cyk7CisJCXJldHVybiByZXQ7CisJfQorCisJcXVldWVfZGVsYXllZF93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+c2Nhbl9jaGVjaywKKwkJCSAgIElMX1NDQU5fQ0hFQ0tfV0FUQ0hET0cpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWxfbWFjX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlpbnQgcmV0OworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJaWYgKHJlcS0+bl9jaGFubmVscyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpZiAodGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKSB7CisJCURfU0NBTigiU2NhbiBhbHJlYWR5IGluIHByb2dyZXNzLlxuIik7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwkvKiBtYWM4MDIxMSB3aWxsIG9ubHkgYXNrIGZvciBvbmUgYmFuZCBhdCBhIHRpbWUgKi8KKwlpbC0+c2Nhbl9yZXF1ZXN0ID0gcmVxOworCWlsLT5zY2FuX3ZpZiA9IHZpZjsKKwlpbC0+c2Nhbl9iYW5kID0gcmVxLT5jaGFubmVsc1swXS0+YmFuZDsKKworCXJldCA9IGlsX3NjYW5faW5pdGlhdGUoaWwsIHZpZik7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWxfbWFjX2h3X3NjYW4pOworCitzdGF0aWMgdm9pZAoraWxfYmdfc2Nhbl9jaGVjayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0KKwkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpbF9wcml2LCBzY2FuX2NoZWNrLndvcmspOworCisJRF9TQ0FOKCJTY2FuIGNoZWNrIHdvcmtcbiIpOworCisJLyogU2luY2Ugd2UgYXJlIGhlcmUgZmlybXdhcmUgZG9lcyBub3QgZmluaXNoIHNjYW4gYW5kCisJICogbW9zdCBsaWtlbHkgaXMgaW4gYmFkIHNoYXBlLCBzbyB3ZSBkb24ndCBib3RoZXIgdG8KKwkgKiBzZW5kIGFib3J0IGNvbW1hbmQsIGp1c3QgZm9yY2Ugc2NhbiBjb21wbGV0ZSB0byBtYWM4MDIxMSAqLworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisJaWxfZm9yY2Vfc2Nhbl9lbmQoaWwpOworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKK30KKworLyoqCisgKiBpbF9maWxsX3Byb2JlX3JlcSAtIGZpbGwgaW4gYWxsIHJlcXVpcmVkIGZpZWxkcyBhbmQgSUUgZm9yIHByb2JlIHJlcXVlc3QKKyAqLworCit1MTYKK2lsX2ZpbGxfcHJvYmVfcmVxKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9tZ210ICpmcmFtZSwKKwkJICBjb25zdCB1OCAqdGEsIGNvbnN0IHU4ICppZXMsIGludCBpZV9sZW4sIGludCBsZWZ0KQoreworCWludCBsZW4gPSAwOworCXU4ICpwb3MgPSBOVUxMOworCisJLyogTWFrZSBzdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZSBmb3IgdGhlIHByb2JlIHJlcXVlc3QsCisJICogdHdvIG1hbmRhdG9yeSBJRXMgYW5kIHRoZSBkYXRhICovCisJbGVmdCAtPSAyNDsKKwlpZiAobGVmdCA8IDApCisJCXJldHVybiAwOworCisJZnJhbWUtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVRKTsKKwltZW1jcHkoZnJhbWUtPmRhLCBpbF9iY2FzdF9hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KGZyYW1lLT5zYSwgdGEsIEVUSF9BTEVOKTsKKwltZW1jcHkoZnJhbWUtPmJzc2lkLCBpbF9iY2FzdF9hZGRyLCBFVEhfQUxFTik7CisJZnJhbWUtPnNlcV9jdHJsID0gMDsKKworCWxlbiArPSAyNDsKKworCS8qIC4uLm5leHQgSUUuLi4gKi8KKwlwb3MgPSAmZnJhbWUtPnUucHJvYmVfcmVxLnZhcmlhYmxlWzBdOworCisJLyogZmlsbCBpbiBvdXIgaW5kaXJlY3QgU1NJRCBJRSAqLworCWxlZnQgLT0gMjsKKwlpZiAobGVmdCA8IDApCisJCXJldHVybiAwOworCSpwb3MrKyA9IFdMQU5fRUlEX1NTSUQ7CisJKnBvcysrID0gMDsKKworCWxlbiArPSAyOworCisJaWYgKFdBUk5fT04obGVmdCA8IGllX2xlbikpCisJCXJldHVybiBsZW47CisKKwlpZiAoaWVzICYmIGllX2xlbikgeworCQltZW1jcHkocG9zLCBpZXMsIGllX2xlbik7CisJCWxlbiArPSBpZV9sZW47CisJfQorCisJcmV0dXJuICh1MTYpIGxlbjsKK30KK0VYUE9SVF9TWU1CT0woaWxfZmlsbF9wcm9iZV9yZXEpOworCitzdGF0aWMgdm9pZAoraWxfYmdfYWJvcnRfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpbF9wcml2LCBhYm9ydF9zY2FuKTsKKworCURfU0NBTigiQWJvcnQgc2NhbiB3b3JrXG4iKTsKKworCS8qIFdlIGtlZXAgc2Nhbl9jaGVjayB3b3JrIHF1ZXVlZCBpbiBjYXNlIHdoZW4gZmlybXdhcmUgd2lsbCBub3QKKwkgKiByZXBvcnQgYmFjayBzY2FuIGNvbXBsZXRlZCBub3RpZmljYXRpb24gKi8KKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlsX3NjYW5fY2FuY2VsX3RpbWVvdXQoaWwsIDIwMCk7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZAoraWxfYmdfc2Nhbl9jb21wbGV0ZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWxfcHJpdiwgc2Nhbl9jb21wbGV0ZWQpOworCWJvb2wgYWJvcnRlZDsKKworCURfU0NBTigiQ29tcGxldGVkIHNjYW4uXG4iKTsKKworCWNhbmNlbF9kZWxheWVkX3dvcmsoJmlsLT5zY2FuX2NoZWNrKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlhYm9ydGVkID0gdGVzdF9hbmRfY2xlYXJfYml0KFNfU0NBTl9BQk9SVElORywgJmlsLT5zdGF0dXMpOworCWlmIChhYm9ydGVkKQorCQlEX1NDQU4oIkFib3J0ZWQgc2NhbiBjb21wbGV0ZWQuXG4iKTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSkgeworCQlEX1NDQU4oIlNjYW4gYWxyZWFkeSBjb21wbGV0ZWQuXG4iKTsKKwkJZ290byBvdXRfc2V0dGluZ3M7CisJfQorCisJaWxfY29tcGxldGVfc2NhbihpbCwgYWJvcnRlZCk7CisKK291dF9zZXR0aW5nczoKKwkvKiBDYW4gd2Ugc3RpbGwgdGFsayB0byBmaXJtd2FyZSA/ICovCisJaWYgKCFpbF9pc19yZWFkeV9yZihpbCkpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBXZSBkbyBub3QgY29tbWl0IHBvd2VyIHNldHRpbmdzIHdoaWxlIHNjYW4gaXMgcGVuZGluZywKKwkgKiBkbyBpdCBub3cgaWYgdGhlIHNldHRpbmdzIGNoYW5nZWQuCisJICovCisJaWxfcG93ZXJfc2V0X21vZGUoaWwsICZpbC0+cG93ZXJfZGF0YS5zbGVlcF9jbWRfbmV4dCwgZmFsc2UpOworCWlsX3NldF90eF9wb3dlcihpbCwgaWwtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKKworCWlsLT5jZmctPm9wcy0+dXRpbHMtPnBvc3Rfc2NhbihpbCk7CisKK291dDoKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7Cit9CisKK3ZvaWQKK2lsX3NldHVwX3NjYW5fZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJSU5JVF9XT1JLKCZpbC0+c2Nhbl9jb21wbGV0ZWQsIGlsX2JnX3NjYW5fY29tcGxldGVkKTsKKwlJTklUX1dPUksoJmlsLT5hYm9ydF9zY2FuLCBpbF9iZ19hYm9ydF9zY2FuKTsKKwlJTklUX0RFTEFZRURfV09SSygmaWwtPnNjYW5fY2hlY2ssIGlsX2JnX3NjYW5fY2hlY2spOworfQorRVhQT1JUX1NZTUJPTChpbF9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmspOworCit2b2lkCitpbF9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwljYW5jZWxfd29ya19zeW5jKCZpbC0+YWJvcnRfc2Nhbik7CisJY2FuY2VsX3dvcmtfc3luYygmaWwtPnNjYW5fY29tcGxldGVkKTsKKworCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmlsLT5zY2FuX2NoZWNrKSkgeworCQltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCQlpbF9mb3JjZV9zY2FuX2VuZChpbCk7CisJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlsX2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmspOworCisvKiBpbC0+c3RhX2xvY2sgbXVzdCBiZSBoZWxkICovCitzdGF0aWMgdm9pZAoraWxfc3RhX3Vjb2RlX2FjdGl2YXRlKHN0cnVjdCBpbF9wcml2ICppbCwgdTggc3RhX2lkKQoreworCisJaWYgKCEoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9EUklWRVJfQUNUSVZFKSkKKwkJSUxfRVJSKCJBQ1RJVkFURSBhIG5vbiBEUklWRVIgYWN0aXZlIHN0YXRpb24gaWQgJXUgYWRkciAlcE1cbiIsCisJCSAgICAgICBzdGFfaWQsIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7CisKKwlpZiAoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9VQ09ERV9BQ1RJVkUpIHsKKwkJRF9BU1NPQygiU1RBIGlkICV1IGFkZHIgJXBNIGFscmVhZHkgcHJlc2VudCIKKwkJCSIgaW4gdUNvZGUgKGFjY29yZGluZyB0byBkcml2ZXIpXG4iLCBzdGFfaWQsCisJCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCX0gZWxzZSB7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSUxfU1RBX1VDT0RFX0FDVElWRTsKKwkJRF9BU1NPQygiQWRkZWQgU1RBIGlkICV1IGFkZHIgJXBNIHRvIHVDb2RlXG4iLCBzdGFfaWQsCisJCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCX0KK30KKworc3RhdGljIGludAoraWxfcHJvY2Vzc19hZGRfc3RhX3Jlc3Aoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfYWRkc3RhX2NtZCAqYWRkc3RhLAorCQkJc3RydWN0IGlsX3J4X3BrdCAqcGt0LCBib29sIHN5bmMpCit7CisJdTggc3RhX2lkID0gYWRkc3RhLT5zdGEuc3RhX2lkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IC1FSU87CisKKwlpZiAocGt0LT5oZHIuZmxhZ3MgJiBJTF9DTURfRkFJTEVEX01TSykgeworCQlJTF9FUlIoIkJhZCByZXR1cm4gZnJvbSBDX0FERF9TVEEgKDB4JTA4WClcbiIsIHBrdC0+aGRyLmZsYWdzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlEX0lORk8oIlByb2Nlc3NpbmcgcmVzcG9uc2UgZm9yIGFkZGluZyBzdGF0aW9uICV1XG4iLCBzdGFfaWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChwa3QtPnUuYWRkX3N0YS5zdGF0dXMpIHsKKwljYXNlIEFERF9TVEFfU1VDQ0VTU19NU0s6CisJCURfSU5GTygiQ19BRERfU1RBIFBBU1NFRFxuIik7CisJCWlsX3N0YV91Y29kZV9hY3RpdmF0ZShpbCwgc3RhX2lkKTsKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBBRERfU1RBX05PX1JPT01fSU5fVEJMOgorCQlJTF9FUlIoIkFkZGluZyBzdGF0aW9uICVkIGZhaWxlZCwgbm8gcm9vbSBpbiB0YWJsZS5cbiIsIHN0YV9pZCk7CisJCWJyZWFrOworCWNhc2UgQUREX1NUQV9OT19CTE9DS19BQ0tfUkVTT1VSQ0U6CisJCUlMX0VSUigiQWRkaW5nIHN0YXRpb24gJWQgZmFpbGVkLCBubyBibG9jayBhY2sgcmVzb3VyY2UuXG4iLAorCQkgICAgICAgc3RhX2lkKTsKKwkJYnJlYWs7CisJY2FzZSBBRERfU1RBX01PRElGWV9OT05fRVhJU1RfU1RBOgorCQlJTF9FUlIoIkF0dGVtcHRpbmcgdG8gbW9kaWZ5IG5vbi1leGlzdGluZyBzdGF0aW9uICVkXG4iLAorCQkgICAgICAgc3RhX2lkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRF9BU1NPQygiUmVjZWl2ZWQgQ19BRERfU1RBOigweCUwOFgpXG4iLCBwa3QtPnUuYWRkX3N0YS5zdGF0dXMpOworCQlicmVhazsKKwl9CisKKwlEX0lORk8oIiVzIHN0YXRpb24gaWQgJXUgYWRkciAlcE1cbiIsCisJICAgICAgIGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID09CisJICAgICAgIFNUQV9DT05UUk9MX01PRElGWV9NU0sgPyAiTW9kaWZpZWQiIDogIkFkZGVkIiwgc3RhX2lkLAorCSAgICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCisJLyoKKwkgKiBYWFg6IFRoZSBNQUMgYWRkcmVzcyBpbiB0aGUgY29tbWFuZCBidWZmZXIgaXMgb2Z0ZW4gY2hhbmdlZCBmcm9tCisJICogdGhlIG9yaWdpbmFsIHNlbnQgdG8gdGhlIGRldmljZS4gVGhhdCBpcywgdGhlIE1BQyBhZGRyZXNzCisJICogd3JpdHRlbiB0byB0aGUgY29tbWFuZCBidWZmZXIgb2Z0ZW4gaXMgbm90IHRoZSBzYW1lIE1BQyBhZGRyZXNzCisJICogcmVhZCBmcm9tIHRoZSBjb21tYW5kIGJ1ZmZlciB3aGVuIHRoZSBjb21tYW5kIHJldHVybnMuIFRoaXMKKwkgKiBpc3N1ZSBoYXMgbm90IHlldCBiZWVuIHJlc29sdmVkIGFuZCB0aGlzIGRlYnVnZ2luZyBpcyBsZWZ0IHRvCisJICogb2JzZXJ2ZSB0aGUgcHJvYmxlbS4KKwkgKi8KKwlEX0lORk8oIiVzIHN0YXRpb24gYWNjb3JkaW5nIHRvIGNtZCBidWZmZXIgJXBNXG4iLAorCSAgICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9PQorCSAgICAgICBTVEFfQ09OVFJPTF9NT0RJRllfTVNLID8gIk1vZGlmaWVkIiA6ICJBZGRlZCIsIGFkZHN0YS0+c3RhLmFkZHIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK2lsX2FkZF9zdGFfY2FsbGJhY2soc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqY21kLAorCQkgICAgc3RydWN0IGlsX3J4X3BrdCAqcGt0KQoreworCXN0cnVjdCBpbF9hZGRzdGFfY21kICphZGRzdGEgPSAoc3RydWN0IGlsX2FkZHN0YV9jbWQgKiljbWQtPmNtZC5wYXlsb2FkOworCisJaWxfcHJvY2Vzc19hZGRfc3RhX3Jlc3AoaWwsIGFkZHN0YSwgcGt0LCBmYWxzZSk7CisKK30KKworaW50CitpbF9zZW5kX2FkZF9zdGEoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfYWRkc3RhX2NtZCAqc3RhLCB1OCBmbGFncykKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSBOVUxMOworCWludCByZXQgPSAwOworCXU4IGRhdGFbc2l6ZW9mKCpzdGEpXTsKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX0FERF9TVEEsCisJCS5mbGFncyA9IGZsYWdzLAorCQkuZGF0YSA9IGRhdGEsCisJfTsKKwl1OCBzdGFfaWQgX19tYXliZV91bnVzZWQgPSBzdGEtPnN0YS5zdGFfaWQ7CisKKwlEX0lORk8oIkFkZGluZyBzdGEgJXUgKCVwTSkgJXNzeW5jaHJvbm91c2x5XG4iLCBzdGFfaWQsIHN0YS0+c3RhLmFkZHIsCisJICAgICAgIGZsYWdzICYgQ01EX0FTWU5DID8gImEiIDogIiIpOworCisJaWYgKGZsYWdzICYgQ01EX0FTWU5DKQorCQljbWQuY2FsbGJhY2sgPSBpbF9hZGRfc3RhX2NhbGxiYWNrOworCWVsc2UgeworCQljbWQuZmxhZ3MgfD0gQ01EX1dBTlRfU0tCOworCQltaWdodF9zbGVlcCgpOworCX0KKworCWNtZC5sZW4gPSBpbC0+Y2ZnLT5vcHMtPnV0aWxzLT5idWlsZF9hZGRzdGFfaGNtZChzdGEsIGRhdGEpOworCXJldCA9IGlsX3NlbmRfY21kKGlsLCAmY21kKTsKKworCWlmIChyZXQgfHwgKGZsYWdzICYgQ01EX0FTWU5DKSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChyZXQgPT0gMCkgeworCQlwa3QgPSAoc3RydWN0IGlsX3J4X3BrdCAqKWNtZC5yZXBseV9wYWdlOworCQlyZXQgPSBpbF9wcm9jZXNzX2FkZF9zdGFfcmVzcChpbCwgc3RhLCBwa3QsIHRydWUpOworCX0KKwlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQucmVwbHlfcGFnZSk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX2FkZF9zdGEpOworCitzdGF0aWMgdm9pZAoraWxfc2V0X2h0X2FkZF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgdTggaWR4LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkgICAgICBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpzdGFfaHRfaW5mID0gJnN0YS0+aHRfY2FwOworCV9fbGUzMiBzdGFfZmxhZ3M7CisJdTggbWltb19wc19tb2RlOworCisJaWYgKCFzdGEgfHwgIXN0YV9odF9pbmYtPmh0X3N1cHBvcnRlZCkKKwkJZ290byBkb25lOworCisJbWltb19wc19tb2RlID0gKHN0YV9odF9pbmYtPmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU01fUFMpID4+IDI7CisJRF9BU1NPQygic3BhdGlhbCBtdWx0aXBsZXhpbmcgcG93ZXIgc2F2ZSBtb2RlOiAlc1xuIiwKKwkJKG1pbW9fcHNfbW9kZSA9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpID8gInN0YXRpYyIgOgorCQkobWltb19wc19tb2RlID09IFdMQU5fSFRfQ0FQX1NNX1BTX0RZTkFNSUMpID8gImR5bmFtaWMiIDoKKwkJImRpc2FibGVkIik7CisKKwlzdGFfZmxhZ3MgPSBpbC0+c3RhdGlvbnNbaWR4XS5zdGEuc3RhdGlvbl9mbGFnczsKKworCXN0YV9mbGFncyAmPSB+KFNUQV9GTEdfUlRTX01JTU9fUFJPVF9NU0sgfCBTVEFfRkxHX01JTU9fRElTX01TSyk7CisKKwlzd2l0Y2ggKG1pbW9fcHNfbW9kZSkgeworCWNhc2UgV0xBTl9IVF9DQVBfU01fUFNfU1RBVElDOgorCQlzdGFfZmxhZ3MgfD0gU1RBX0ZMR19NSU1PX0RJU19NU0s7CisJCWJyZWFrOworCWNhc2UgV0xBTl9IVF9DQVBfU01fUFNfRFlOQU1JQzoKKwkJc3RhX2ZsYWdzIHw9IFNUQV9GTEdfUlRTX01JTU9fUFJPVF9NU0s7CisJCWJyZWFrOworCWNhc2UgV0xBTl9IVF9DQVBfU01fUFNfRElTQUJMRUQ6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUlMX1dBUk4oIkludmFsaWQgTUlNTyBQUyBtb2RlICVkXG4iLCBtaW1vX3BzX21vZGUpOworCQlicmVhazsKKwl9CisKKwlzdGFfZmxhZ3MgfD0KKwkgICAgY3B1X3RvX2xlMzIoKHUzMikgc3RhX2h0X2luZi0+CisJCQlhbXBkdV9mYWN0b3IgPDwgU1RBX0ZMR19NQVhfQUdHX1NJWkVfUE9TKTsKKworCXN0YV9mbGFncyB8PQorCSAgICBjcHVfdG9fbGUzMigodTMyKSBzdGFfaHRfaW5mLT4KKwkJCWFtcGR1X2RlbnNpdHkgPDwgU1RBX0ZMR19BR0dfTVBEVV9ERU5TSVRZX1BPUyk7CisKKwlpZiAoaWxfaXNfaHQ0MF90eF9hbGxvd2VkKGlsLCBjdHgsICZzdGEtPmh0X2NhcCkpCisJCXN0YV9mbGFncyB8PSBTVEFfRkxHX0hUNDBfRU5fTVNLOworCWVsc2UKKwkJc3RhX2ZsYWdzICY9IH5TVEFfRkxHX0hUNDBfRU5fTVNLOworCisJaWwtPnN0YXRpb25zW2lkeF0uc3RhLnN0YXRpb25fZmxhZ3MgPSBzdGFfZmxhZ3M7Citkb25lOgorCXJldHVybjsKK30KKworLyoqCisgKiBpbF9wcmVwX3N0YXRpb24gLSBQcmVwYXJlIHN0YXRpb24gaW5mb3JtYXRpb24gZm9yIGFkZGl0aW9uCisgKgorICogc2hvdWxkIGJlIGNhbGxlZCB3aXRoIHN0YV9sb2NrIGhlbGQKKyAqLwordTgKK2lsX3ByZXBfc3RhdGlvbihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJY29uc3QgdTggKmFkZHIsIGJvb2wgaXNfYXAsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3RydWN0IGlsX3N0YXRpb25fZW50cnkgKnN0YXRpb247CisJaW50IGk7CisJdTggc3RhX2lkID0gSUxfSU5WQUxJRF9TVEFUSU9OOworCXUxNiByYXRlOworCisJaWYgKGlzX2FwKQorCQlzdGFfaWQgPSBjdHgtPmFwX3N0YV9pZDsKKwllbHNlIGlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihhZGRyKSkKKwkJc3RhX2lkID0gY3R4LT5iY2FzdF9zdGFfaWQ7CisJZWxzZQorCQlmb3IgKGkgPSBJTF9TVEFfSUQ7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7CisJCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcgorCQkJICAgIChpbC0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyLCBhZGRyKSkgeworCQkJCXN0YV9pZCA9IGk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghaWwtPnN0YXRpb25zW2ldLnVzZWQgJiYKKwkJCSAgICBzdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKQorCQkJCXN0YV9pZCA9IGk7CisJCX0KKworCS8qCisJICogVGhlc2UgdHdvIGNvbmRpdGlvbnMgaGF2ZSB0aGUgc2FtZSBvdXRjb21lLCBidXQga2VlcCB0aGVtCisJICogc2VwYXJhdGUKKwkgKi8KKwlpZiAodW5saWtlbHkoc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTikpCisJCXJldHVybiBzdGFfaWQ7CisKKwkvKgorCSAqIHVDb2RlIGlzIG5vdCBhYmxlIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSByZXF1ZXN0cyB0byBhZGQgYQorCSAqIHN0YXRpb24uIEtlZXAgdHJhY2sgaWYgb25lIGlzIGluIHByb2dyZXNzIHNvIHRoYXQgd2UgZG8gbm90IHNlbmQKKwkgKiBhbm90aGVyLgorCSAqLworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1MpIHsKKwkJRF9JTkZPKCJTVEEgJWQgYWxyZWFkeSBpbiBwcm9jZXNzIG9mIGJlaW5nIGFkZGVkLlxuIiwgc3RhX2lkKTsKKwkJcmV0dXJuIHN0YV9pZDsKKwl9CisKKwlpZiAoKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfRFJJVkVSX0FDVElWRSkgJiYKKwkgICAgKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSAmJgorCSAgICAhY29tcGFyZV9ldGhlcl9hZGRyKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkciwgYWRkcikpIHsKKwkJRF9BU1NPQygiU1RBICVkICglcE0pIGFscmVhZHkgYWRkZWQsIG5vdCBhZGRpbmcgYWdhaW4uXG4iLAorCQkJc3RhX2lkLCBhZGRyKTsKKwkJcmV0dXJuIHN0YV9pZDsKKwl9CisKKwlzdGF0aW9uID0gJmlsLT5zdGF0aW9uc1tzdGFfaWRdOworCXN0YXRpb24tPnVzZWQgPSBJTF9TVEFfRFJJVkVSX0FDVElWRTsKKwlEX0FTU09DKCJBZGQgU1RBIHRvIGRyaXZlciBJRCAlZDogJXBNXG4iLCBzdGFfaWQsIGFkZHIpOworCWlsLT5udW1fc3RhdGlvbnMrKzsKKworCS8qIFNldCB1cCB0aGUgQ19BRERfU1RBIGNvbW1hbmQgdG8gc2VuZCB0byBkZXZpY2UgKi8KKwltZW1zZXQoJnN0YXRpb24tPnN0YSwgMCwgc2l6ZW9mKHN0cnVjdCBpbF9hZGRzdGFfY21kKSk7CisJbWVtY3B5KHN0YXRpb24tPnN0YS5zdGEuYWRkciwgYWRkciwgRVRIX0FMRU4pOworCXN0YXRpb24tPnN0YS5tb2RlID0gMDsKKwlzdGF0aW9uLT5zdGEuc3RhLnN0YV9pZCA9IHN0YV9pZDsKKwlzdGF0aW9uLT5zdGEuc3RhdGlvbl9mbGFncyA9IGN0eC0+c3RhdGlvbl9mbGFnczsKKwlzdGF0aW9uLT5jdHhpZCA9IGN0eC0+Y3R4aWQ7CisKKwlpZiAoc3RhKSB7CisJCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXZfY29tbW9uICpzdGFfcHJpdjsKKworCQlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwkJc3RhX3ByaXYtPmN0eCA9IGN0eDsKKwl9CisKKwkvKgorCSAqIE9LIHRvIGNhbGwgdW5jb25kaXRpb25hbGx5LCBzaW5jZSBsb2NhbCBzdGF0aW9ucyAoSUJTUyBCU1NJRAorCSAqIFNUQSBhbmQgYnJvYWRjYXN0IFNUQSkgcGFzcyBpbiBhIE5VTEwgc3RhLCBhbmQgbWFjODAyMTEKKwkgKiBkb2Vzbid0IGFsbG93IEhUIElCU1MuCisJICovCisJaWxfc2V0X2h0X2FkZF9zdGF0aW9uKGlsLCBzdGFfaWQsIHN0YSwgY3R4KTsKKworCS8qIDM5NDUgb25seSAqLworCXJhdGUgPSAoaWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgPyBSQVRFXzZNX1BMQ1AgOiBSQVRFXzFNX1BMQ1A7CisJLyogVHVybiBvbiBib3RoIGFudGVubmFzIGZvciB0aGUgc3RhdGlvbi4uLiAqLworCXN0YXRpb24tPnN0YS5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUxNihyYXRlIHwgUkFURV9NQ1NfQU5UX0FCX01TSyk7CisKKwlyZXR1cm4gc3RhX2lkOworCit9CitFWFBPUlRfU1lNQk9MX0dQTChpbF9wcmVwX3N0YXRpb24pOworCisjZGVmaW5lIFNUQV9XQUlUX1RJTUVPVVQgKEhaLzIpCisKKy8qKgorICogaWxfYWRkX3N0YXRpb25fY29tbW9uIC0KKyAqLworaW50CitpbF9hZGRfc3RhdGlvbl9jb21tb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCSAgICAgIGNvbnN0IHU4ICphZGRyLCBib29sIGlzX2FwLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkgICAgICB1OCAqc3RhX2lkX3IpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOworCWludCByZXQgPSAwOworCXU4IHN0YV9pZDsKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCisJKnN0YV9pZF9yID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlzdGFfaWQgPSBpbF9wcmVwX3N0YXRpb24oaWwsIGN0eCwgYWRkciwgaXNfYXAsIHN0YSk7CisJaWYgKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pIHsKKwkJSUxfRVJSKCJVbmFibGUgdG8gcHJlcGFyZSBzdGF0aW9uICVwTSBmb3IgYWRkaXRpb25cbiIsIGFkZHIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIHVDb2RlIGlzIG5vdCBhYmxlIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSByZXF1ZXN0cyB0byBhZGQgYQorCSAqIHN0YXRpb24uIEtlZXAgdHJhY2sgaWYgb25lIGlzIGluIHByb2dyZXNzIHNvIHRoYXQgd2UgZG8gbm90IHNlbmQKKwkgKiBhbm90aGVyLgorCSAqLworCWlmIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0lOUFJPR1JFU1MpIHsKKwkJRF9JTkZPKCJTVEEgJWQgYWxyZWFkeSBpbiBwcm9jZXNzIG9mIGJlaW5nIGFkZGVkLlxuIiwgc3RhX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJaWYgKChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCisJICAgIChpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkpIHsKKwkJRF9BU1NPQygiU1RBICVkICglcE0pIGFscmVhZHkgYWRkZWQsIG5vdCBhZGRpbmcgYWdhaW4uXG4iLAorCQkJc3RhX2lkLCBhZGRyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKKwltZW1jcHkoJnN0YV9jbWQsICZpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCisJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfYWRkc3RhX2NtZCkpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisKKwkvKiBBZGQgc3RhdGlvbiB0byBkZXZpY2UncyBzdGF0aW9uIHRhYmxlICovCisJcmV0ID0gaWxfc2VuZF9hZGRfc3RhKGlsLCAmc3RhX2NtZCwgQ01EX1NZTkMpOworCWlmIChyZXQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJCUlMX0VSUigiQWRkaW5nIHN0YXRpb24gJXBNIGZhaWxlZC5cbiIsCisJCSAgICAgICBpbC0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOworCQlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JTF9TVEFfRFJJVkVSX0FDVElWRTsKKwkJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJfQorCSpzdGFfaWRfciA9IHN0YV9pZDsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9hZGRfc3RhdGlvbl9jb21tb24pOworCisvKioKKyAqIGlsX3N0YV91Y29kZV9kZWFjdGl2YXRlIC0gZGVhY3RpdmF0ZSB1Y29kZSBzdGF0dXMgZm9yIGEgc3RhdGlvbgorICoKKyAqIGlsLT5zdGFfbG9jayBtdXN0IGJlIGhlbGQKKyAqLworc3RhdGljIHZvaWQKK2lsX3N0YV91Y29kZV9kZWFjdGl2YXRlKHN0cnVjdCBpbF9wcml2ICppbCwgdTggc3RhX2lkKQoreworCS8qIFVjb2RlIG11c3QgYmUgYWN0aXZlIGFuZCBkcml2ZXIgbXVzdCBiZSBub24gYWN0aXZlICovCisJaWYgKChpbC0+c3RhdGlvbnNbc3RhX2lkXS4KKwkgICAgIHVzZWQgJiAoSUxfU1RBX1VDT0RFX0FDVElWRSB8IElMX1NUQV9EUklWRVJfQUNUSVZFKSkgIT0KKwkgICAgSUxfU1RBX1VDT0RFX0FDVElWRSkKKwkJSUxfRVJSKCJyZW1vdmVkIG5vbiBhY3RpdmUgU1RBICV1XG4iLCBzdGFfaWQpOworCisJaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0FDVElWRTsKKworCW1lbXNldCgmaWwtPnN0YXRpb25zW3N0YV9pZF0sIDAsIHNpemVvZihzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSkpOworCURfQVNTT0MoIlJlbW92ZWQgU1RBICV1XG4iLCBzdGFfaWQpOworfQorCitzdGF0aWMgaW50CitpbF9zZW5kX3JlbW92ZV9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggKiBhZGRyLCBpbnQgc3RhX2lkLAorCQkgICAgICAgYm9vbCB0ZW1wb3JhcnkpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0OworCWludCByZXQ7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CisJc3RydWN0IGlsX3JlbV9zdGFfY21kIHJtX3N0YV9jbWQ7CisKKwlzdHJ1Y3QgaWxfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDX1JFTV9TVEEsCisJCS5sZW4gPSBzaXplb2Yoc3RydWN0IGlsX3JlbV9zdGFfY21kKSwKKwkJLmZsYWdzID0gQ01EX1NZTkMsCisJCS5kYXRhID0gJnJtX3N0YV9jbWQsCisJfTsKKworCW1lbXNldCgmcm1fc3RhX2NtZCwgMCwgc2l6ZW9mKHJtX3N0YV9jbWQpKTsKKwlybV9zdGFfY21kLm51bV9zdGEgPSAxOworCW1lbWNweSgmcm1fc3RhX2NtZC5hZGRyLCBhZGRyLCBFVEhfQUxFTik7CisKKwljbWQuZmxhZ3MgfD0gQ01EX1dBTlRfU0tCOworCisJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOworCisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXBrdCA9IChzdHJ1Y3QgaWxfcnhfcGt0ICopY21kLnJlcGx5X3BhZ2U7CisJaWYgKHBrdC0+aGRyLmZsYWdzICYgSUxfQ01EX0ZBSUxFRF9NU0spIHsKKwkJSUxfRVJSKCJCYWQgcmV0dXJuIGZyb20gQ19SRU1fU1RBICgweCUwOFgpXG4iLCBwa3QtPmhkci5mbGFncyk7CisJCXJldCA9IC1FSU87CisJfQorCisJaWYgKCFyZXQpIHsKKwkJc3dpdGNoIChwa3QtPnUucmVtX3N0YS5zdGF0dXMpIHsKKwkJY2FzZSBSRU1fU1RBX1NVQ0NFU1NfTVNLOgorCQkJaWYgKCF0ZW1wb3JhcnkpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCQlpbF9zdGFfdWNvZGVfZGVhY3RpdmF0ZShpbCwgc3RhX2lkKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssCisJCQkJCQkgICAgICAgZmxhZ3Nfc3Bpbik7CisJCQl9CisJCQlEX0FTU09DKCJDX1JFTV9TVEEgUEFTU0VEXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0ID0gLUVJTzsKKwkJCUlMX0VSUigiQ19SRU1fU1RBIGZhaWxlZFxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKwlpbF9mcmVlX3BhZ2VzKGlsLCBjbWQucmVwbHlfcGFnZSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGlsX3JlbW92ZV9zdGF0aW9uIC0gUmVtb3ZlIGRyaXZlcidzIGtub3dsZWRnZSBvZiBzdGF0aW9uLgorICovCitpbnQKK2lsX3JlbW92ZV9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggc3RhX2lkLCBjb25zdCB1OCAqIGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaWxfaXNfcmVhZHkoaWwpKSB7CisJCURfSU5GTygiVW5hYmxlIHRvIHJlbW92ZSBzdGF0aW9uICVwTSwgZGV2aWNlIG5vdCByZWFkeS5cbiIsCisJCSAgICAgICBhZGRyKTsKKwkJLyoKKwkJICogSXQgaXMgdHlwaWNhbCBmb3Igc3RhdGlvbnMgdG8gYmUgcmVtb3ZlZCB3aGVuIHdlIGFyZQorCQkgKiBnb2luZyBkb3duLiBSZXR1cm4gc3VjY2VzcyBzaW5jZSBkZXZpY2Ugd2lsbCBiZSBkb3duCisJCSAqIHNvb24gYW55d2F5CisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlEX0FTU09DKCJSZW1vdmluZyBTVEEgZnJvbSBkcml2ZXI6JWQgICVwTVxuIiwgc3RhX2lkLCBhZGRyKTsKKworCWlmIChXQVJOX09OKHN0YV9pZCA9PSBJTF9JTlZBTElEX1NUQVRJT04pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCWlmICghKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfRFJJVkVSX0FDVElWRSkpIHsKKwkJRF9JTkZPKCJSZW1vdmluZyAlcE0gYnV0IG5vbiBEUklWRVIgYWN0aXZlXG4iLCBhZGRyKTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCWlmICghKGlsLT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJTF9TVEFfVUNPREVfQUNUSVZFKSkgeworCQlEX0lORk8oIlJlbW92aW5nICVwTSBidXQgbm9uIFVDT0RFIGFjdGl2ZVxuIiwgYWRkcik7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpZiAoaWwtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElMX1NUQV9MT0NBTCkgeworCQlrZnJlZShpbC0+c3RhdGlvbnNbc3RhX2lkXS5scSk7CisJCWlsLT5zdGF0aW9uc1tzdGFfaWRdLmxxID0gTlVMTDsKKwl9CisKKwlpbC0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JTF9TVEFfRFJJVkVSX0FDVElWRTsKKworCWlsLT5udW1fc3RhdGlvbnMtLTsKKworCUJVR19PTihpbC0+bnVtX3N0YXRpb25zIDwgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBpbF9zZW5kX3JlbW92ZV9zdGF0aW9uKGlsLCBhZGRyLCBzdGFfaWQsIGZhbHNlKTsKK291dF9lcnI6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJcmV0dXJuIC1FSU5WQUw7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbF9yZW1vdmVfc3RhdGlvbik7CisKKy8qKgorICogaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMgLSBjbGVhciB1Y29kZSBzdGF0aW9uIHRhYmxlIGJpdHMKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNsZWFycyBhbGwgdGhlIGJpdHMgaW4gdGhlIGRyaXZlciBpbmRpY2F0aW5nCisgKiB3aGljaCBzdGF0aW9ucyBhcmUgYWN0aXZlIGluIHRoZSB1Y29kZS4gQ2FsbCB3aGVuIHNvbWV0aGluZworICogb3RoZXIgdGhhbiBleHBsaWNpdCBzdGF0aW9uIG1hbmFnZW1lbnQgd291bGQgY2F1c2UgdGhpcyBpbgorICogdGhlIHVjb2RlLCBlLmcuIHVuYXNzb2NpYXRlZCBSWE9OLgorICovCit2b2lkCitpbF9jbGVhcl91Y29kZV9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47CisJYm9vbCBjbGVhcmVkID0gZmFsc2U7CisKKwlEX0lORk8oIkNsZWFyaW5nIHVjb2RlIHN0YXRpb25zIGluIGRyaXZlclxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgeworCQlpZiAoY3R4ICYmIGN0eC0+Y3R4aWQgIT0gaWwtPnN0YXRpb25zW2ldLmN0eGlkKQorCQkJY29udGludWU7CisKKwkJaWYgKGlsLT5zdGF0aW9uc1tpXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkgeworCQkJRF9JTkZPKCJDbGVhcmluZyB1Y29kZSBhY3RpdmUgZm9yIHN0YXRpb24gJWRcbiIsIGkpOworCQkJaWwtPnN0YXRpb25zW2ldLnVzZWQgJj0gfklMX1NUQV9VQ09ERV9BQ1RJVkU7CisJCQljbGVhcmVkID0gdHJ1ZTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCisJaWYgKCFjbGVhcmVkKQorCQlEX0lORk8oIk5vIGFjdGl2ZSBzdGF0aW9ucyBmb3VuZCB0byBiZSBjbGVhcmVkXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMpOworCisvKioKKyAqIGlsX3Jlc3RvcmVfc3RhdGlvbnMoKSAtIFJlc3RvcmUgZHJpdmVyIGtub3duIHN0YXRpb25zIHRvIGRldmljZQorICoKKyAqIEFsbCBzdGF0aW9ucyBjb25zaWRlcmVkIGFjdGl2ZSBieSBkcml2ZXIsIGJ1dCBub3QgcHJlc2VudCBpbiB1Y29kZSwgaXMKKyAqIHJlc3RvcmVkLgorICoKKyAqIEZ1bmN0aW9uIHNsZWVwcy4KKyAqLwordm9pZAoraWxfcmVzdG9yZV9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgaWxfYWRkc3RhX2NtZCBzdGFfY21kOworCXN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kIGxxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3Nfc3BpbjsKKwlpbnQgaTsKKwlib29sIGZvdW5kID0gZmFsc2U7CisJaW50IHJldDsKKwlib29sIHNlbmRfbHE7CisKKwlpZiAoIWlsX2lzX3JlYWR5KGlsKSkgeworCQlEX0lORk8oIk5vdCByZWFkeSB5ZXQsIG5vdCByZXN0b3JpbmcgYW55IHN0YXRpb25zLlxuIik7CisJCXJldHVybjsKKwl9CisKKwlEX0FTU09DKCJSZXN0b3JpbmcgYWxsIGtub3duIHN0YXRpb25zIC4uLiBzdGFydC5cbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCWZvciAoaSA9IDA7IGkgPCBpbC0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7CisJCWlmIChjdHgtPmN0eGlkICE9IGlsLT5zdGF0aW9uc1tpXS5jdHhpZCkKKwkJCWNvbnRpbnVlOworCQlpZiAoKGlsLT5zdGF0aW9uc1tpXS51c2VkICYgSUxfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCisJCSAgICAhKGlsLT5zdGF0aW9uc1tpXS51c2VkICYgSUxfU1RBX1VDT0RFX0FDVElWRSkpIHsKKwkJCURfQVNTT0MoIlJlc3RvcmluZyBzdGEgJXBNXG4iLAorCQkJCWlsLT5zdGF0aW9uc1tpXS5zdGEuc3RhLmFkZHIpOworCQkJaWwtPnN0YXRpb25zW2ldLnN0YS5tb2RlID0gMDsKKwkJCWlsLT5zdGF0aW9uc1tpXS51c2VkIHw9IElMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCQkJZm91bmQgPSB0cnVlOworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IGlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zOyBpKyspIHsKKwkJaWYgKChpbC0+c3RhdGlvbnNbaV0udXNlZCAmIElMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSkgeworCQkJbWVtY3B5KCZzdGFfY21kLCAmaWwtPnN0YXRpb25zW2ldLnN0YSwKKwkJCSAgICAgICBzaXplb2Yoc3RydWN0IGlsX2FkZHN0YV9jbWQpKTsKKwkJCXNlbmRfbHEgPSBmYWxzZTsKKwkJCWlmIChpbC0+c3RhdGlvbnNbaV0ubHEpIHsKKwkJCQltZW1jcHkoJmxxLCBpbC0+c3RhdGlvbnNbaV0ubHEsCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCkpOworCQkJCXNlbmRfbHEgPSB0cnVlOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCXJldCA9IGlsX3NlbmRfYWRkX3N0YShpbCwgJnN0YV9jbWQsIENNRF9TWU5DKTsKKwkJCWlmIChyZXQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJCQlJTF9FUlIoIkFkZGluZyBzdGF0aW9uICVwTSBmYWlsZWQuXG4iLAorCQkJCSAgICAgICBpbC0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyKTsKKwkJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX0RSSVZFUl9BQ1RJVkU7CisJCQkJaWwtPnN0YXRpb25zW2ldLnVzZWQgJj0KKwkJCQkgICAgfklMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5zdGFfbG9jaywKKwkJCQkJCSAgICAgICBmbGFnc19zcGluKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBSYXRlIHNjYWxpbmcgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwgc2VuZAorCQkJICogY3VycmVudCBMUSBjb21tYW5kCisJCQkgKi8KKwkJCWlmIChzZW5kX2xxKQorCQkJCWlsX3NlbmRfbHFfY21kKGlsLCBjdHgsICZscSwgQ01EX1NZTkMsIHRydWUpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7CisJCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0lOUFJPR1JFU1M7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCWlmICghZm91bmQpCisJCURfSU5GTygiUmVzdG9yaW5nIGFsbCBrbm93biBzdGF0aW9ucyIKKwkJICAgICAgICIgLi4uLiBubyBzdGF0aW9ucyB0byBiZSByZXN0b3JlZC5cbiIpOworCWVsc2UKKwkJRF9JTkZPKCJSZXN0b3JpbmcgYWxsIGtub3duIHN0YXRpb25zIiAiIC4uLi4gY29tcGxldGUuXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfcmVzdG9yZV9zdGF0aW9ucyk7CisKK2ludAoraWxfZ2V0X2ZyZWVfdWNvZGVfa2V5X2lkeChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPnN0YV9rZXlfbWF4X251bTsgaSsrKQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgJmlsLT51Y29kZV9rZXlfdGFibGUpKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gV0VQX0lOVkFMSURfT0ZGU0VUOworfQorRVhQT1JUX1NZTUJPTChpbF9nZXRfZnJlZV91Y29kZV9rZXlfaWR4KTsKKwordm9pZAoraWxfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgaWwtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgeworCQlpZiAoIShpbC0+c3RhdGlvbnNbaV0udXNlZCAmIElMX1NUQV9CQ0FTVCkpCisJCQljb250aW51ZTsKKworCQlpbC0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SUxfU1RBX1VDT0RFX0FDVElWRTsKKwkJaWwtPm51bV9zdGF0aW9ucy0tOworCQlCVUdfT04oaWwtPm51bV9zdGF0aW9ucyA8IDApOworCQlrZnJlZShpbC0+c3RhdGlvbnNbaV0ubHEpOworCQlpbC0+c3RhdGlvbnNbaV0ubHEgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMpOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCitzdGF0aWMgdm9pZAoraWxfZHVtcF9scV9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEpCit7CisJaW50IGk7CisJRF9SQVRFKCJscSBzdGF0aW9uIGlkIDB4JXhcbiIsIGxxLT5zdGFfaWQpOworCURfUkFURSgibHEgYW50IDB4JVggMHglWFxuIiwgbHEtPmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zaywKKwkgICAgICAgbHEtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2spOworCisJZm9yIChpID0gMDsgaSA8IExJTktfUVVBTF9NQVhfUkVUUllfTlVNOyBpKyspCisJCURfUkFURSgibHEgaWR4ICVkIDB4JVhcbiIsIGksIGxxLT5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZHVtcF9scV9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEpCit7Cit9CisjZW5kaWYKKworLyoqCisgKiBpbF9pc19scV90YWJsZV92YWxpZCgpIC0gVGVzdCBvbmUgYXNwZWN0IG9mIExRIGNtZCBmb3IgdmFsaWRpdHkKKyAqCisgKiBJdCBzb21ldGltZXMgaGFwcGVucyB3aGVuIGEgSFQgcmF0ZSBoYXMgYmVlbiBpbiB1c2UgYW5kIHdlCisgKiBsb29zZSBjb25uZWN0aXZpdHkgd2l0aCBBUCB0aGVuIG1hYzgwMjExIHdpbGwgZmlyc3QgdGVsbCB1cyB0aGF0IHRoZQorICogY3VycmVudCBjaGFubmVsIGlzIG5vdCBIVCBhbnltb3JlIGJlZm9yZSByZW1vdmluZyB0aGUgc3RhdGlvbi4gSW4gc3VjaCBhCisgKiBzY2VuYXJpbyB0aGUgUlhPTiBmbGFncyB3aWxsIGJlIHVwZGF0ZWQgdG8gaW5kaWNhdGUgd2UgYXJlIG5vdAorICogY29tbXVuaWNhdGluZyBIVCBhbnltb3JlLCBidXQgdGhlIExRIGNvbW1hbmQgbWF5IHN0aWxsIGNvbnRhaW4gSFQgcmF0ZXMuCisgKiBUZXN0IGZvciB0aGlzIHRvIHByZXZlbnQgZHJpdmVyIGZyb20gc2VuZGluZyBMUSBjb21tYW5kIGJldHdlZW4gdGhlIHRpbWUKKyAqIFJYT04gZmxhZ3MgYXJlIHVwZGF0ZWQgYW5kIHdoZW4gTFEgY29tbWFuZCBpcyB1cGRhdGVkLgorICovCitzdGF0aWMgYm9vbAoraWxfaXNfbHFfdGFibGVfdmFsaWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCSAgICAgc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgKmxxKQoreworCWludCBpOworCisJaWYgKGN0eC0+aHQuZW5hYmxlZCkKKwkJcmV0dXJuIHRydWU7CisKKwlEX0lORk8oIkNoYW5uZWwgJXUgaXMgbm90IGFuIEhUIGNoYW5uZWxcbiIsIGN0eC0+YWN0aXZlLmNoYW5uZWwpOworCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKSB7CisJCWlmIChsZTMyX3RvX2NwdShscS0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzKSAmIFJBVEVfTUNTX0hUX01TSykgeworCQkJRF9JTkZPKCJpZHggJWQgb2YgTFEgZXhwZWN0cyBIVCBjaGFubmVsXG4iLCBpKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqCisgKiBpbF9zZW5kX2xxX2NtZCgpIC0gU2VuZCBsaW5rIHF1YWxpdHkgY29tbWFuZAorICogQGluaXQ6IFRoaXMgY29tbWFuZCBpcyBzZW50IGFzIHBhcnQgb2Ygc3RhdGlvbiBpbml0aWFsaXphdGlvbiByaWdodAorICogICAgICAgIGFmdGVyIHN0YXRpb24gaGFzIGJlZW4gYWRkZWQuCisgKgorICogVGhlIGxpbmsgcXVhbGl0eSBjb21tYW5kIGlzIHNlbnQgYXMgdGhlIGxhc3Qgc3RlcCBvZiBzdGF0aW9uIGNyZWF0aW9uLgorICogVGhpcyBpcyB0aGUgc3BlY2lhbCBjYXNlIGluIHdoaWNoIGluaXQgaXMgc2V0IGFuZCB3ZSBjYWxsIGEgY2FsbGJhY2sgaW4KKyAqIHRoaXMgY2FzZSB0byBjbGVhciB0aGUgc3RhdGUgaW5kaWNhdGluZyB0aGF0IHN0YXRpb24gY3JlYXRpb24gaXMgaW4KKyAqIHByb2dyZXNzLgorICovCitpbnQKK2lsX3NlbmRfbHFfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCSAgICAgICBzdHJ1Y3QgaWxfbGlua19xdWFsaXR5X2NtZCAqbHEsIHU4IGZsYWdzLCBib29sIGluaXQpCit7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOworCisJc3RydWN0IGlsX2hvc3RfY21kIGNtZCA9IHsKKwkJLmlkID0gQ19UWF9MSU5LX1FVQUxJVFlfQ01ELAorCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kKSwKKwkJLmZsYWdzID0gZmxhZ3MsCisJCS5kYXRhID0gbHEsCisJfTsKKworCWlmIChXQVJOX09OKGxxLT5zdGFfaWQgPT0gSUxfSU5WQUxJRF9TVEFUSU9OKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwlpZiAoIShpbC0+c3RhdGlvbnNbbHEtPnN0YV9pZF0udXNlZCAmIElMX1NUQV9EUklWRVJfQUNUSVZFKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKworCWlsX2R1bXBfbHFfY21kKGlsLCBscSk7CisJQlVHX09OKGluaXQgJiYgKGNtZC5mbGFncyAmIENNRF9BU1lOQykpOworCisJaWYgKGlsX2lzX2xxX3RhYmxlX3ZhbGlkKGlsLCBjdHgsIGxxKSkKKwkJcmV0ID0gaWxfc2VuZF9jbWQoaWwsICZjbWQpOworCWVsc2UKKwkJcmV0ID0gLUVJTlZBTDsKKworCWlmIChjbWQuZmxhZ3MgJiBDTURfQVNZTkMpCisJCXJldHVybiByZXQ7CisKKwlpZiAoaW5pdCkgeworCQlEX0lORk8oImluaXQgTFEgY29tbWFuZCBjb21wbGV0ZSwiCisJCSAgICAgICAiIGNsZWFyaW5nIHN0YSBhZGRpdGlvbiBzdGF0dXMgZm9yIHN0YSAlZFxuIiwKKwkJICAgICAgIGxxLT5zdGFfaWQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKKwkJaWwtPnN0YXRpb25zW2xxLT5zdGFfaWRdLnVzZWQgJj0gfklMX1NUQV9VQ09ERV9JTlBST0dSRVNTOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9zZW5kX2xxX2NtZCk7CisKK2ludAoraWxfbWFjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9wcml2X2NvbW1vbiAqc3RhX2NvbW1vbiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlpbnQgcmV0OworCisJRF9JTkZPKCJyZWNlaXZlZCByZXF1ZXN0IHRvIHJlbW92ZSBzdGF0aW9uICVwTVxuIiwgc3RhLT5hZGRyKTsKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCURfSU5GTygicHJvY2VlZGluZyB0byByZW1vdmUgc3RhdGlvbiAlcE1cbiIsIHN0YS0+YWRkcik7CisJcmV0ID0gaWxfcmVtb3ZlX3N0YXRpb24oaWwsIHN0YV9jb21tb24tPnN0YV9pZCwgc3RhLT5hZGRyKTsKKwlpZiAocmV0KQorCQlJTF9FUlIoIkVycm9yIHJlbW92aW5nIHN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChpbF9tYWNfc3RhX3JlbW92ZSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKiBSWC1GVU5DVElPTlMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBSeCB0aGVvcnkgb2Ygb3BlcmF0aW9uCisgKgorICogRHJpdmVyIGFsbG9jYXRlcyBhIGNpcmN1bGFyIGJ1ZmZlciBvZiBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9ycyAoUkJEcyksCisgKiBlYWNoIG9mIHdoaWNoIHBvaW50IHRvIFJlY2VpdmUgQnVmZmVycyB0byBiZSBmaWxsZWQgYnkgdGhlIE5JQy4gIFRoZXNlIGdldAorICogdXNlZCBub3Qgb25seSBmb3IgUnggZnJhbWVzLCBidXQgZm9yIGFueSBjb21tYW5kIHJlc3BvbnNlIG9yIG5vdGlmaWNhdGlvbgorICogZnJvbSB0aGUgTklDLiAgVGhlIGRyaXZlciBhbmQgTklDIG1hbmFnZSB0aGUgUnggYnVmZmVycyBieSBtZWFucworICogb2YgaWR4ZXMgaW50byB0aGUgY2lyY3VsYXIgYnVmZmVyLgorICoKKyAqIFJ4IFF1ZXVlIEluZGV4ZXMKKyAqIFRoZSBob3N0L2Zpcm13YXJlIHNoYXJlIHR3byBpZHggcmVnaXN0ZXJzIGZvciBtYW5hZ2luZyB0aGUgUnggYnVmZmVycy4KKyAqCisgKiBUaGUgUkVBRCBpZHggbWFwcyB0byB0aGUgZmlyc3QgcG9zaXRpb24gdGhhdCB0aGUgZmlybXdhcmUgbWF5IGJlIHdyaXRpbmcKKyAqIHRvIC0tIHRoZSBkcml2ZXIgY2FuIHJlYWQgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGlzIHBvc2l0aW9uIGFuZCBnZXQKKyAqIGdvb2QgZGF0YS4KKyAqIFRoZSBSRUFEIGlkeCBpcyBtYW5hZ2VkIGJ5IHRoZSBmaXJtd2FyZSBvbmNlIHRoZSBjYXJkIGlzIGVuYWJsZWQuCisgKgorICogVGhlIFdSSVRFIGlkeCBtYXBzIHRvIHRoZSBsYXN0IHBvc2l0aW9uIHRoZSBkcml2ZXIgaGFzIHJlYWQgZnJvbSAtLSB0aGUKKyAqIHBvc2l0aW9uIHByZWNlZGluZyBXUklURSBpcyB0aGUgbGFzdCBzbG90IHRoZSBmaXJtd2FyZSBjYW4gcGxhY2UgYSBwYWNrZXQuCisgKgorICogVGhlIHF1ZXVlIGlzIGVtcHR5IChubyBnb29kIGRhdGEpIGlmIFdSSVRFID0gUkVBRCAtIDEsIGFuZCBpcyBmdWxsIGlmCisgKiBXUklURSA9IFJFQUQuCisgKgorICogRHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGUgaG9zdCBzZXRzIHVwIHRoZSBSRUFEIHF1ZXVlIHBvc2l0aW9uIHRvIHRoZSBmaXJzdAorICogSURYIHBvc2l0aW9uLCBhbmQgV1JJVEUgdG8gdGhlIGxhc3QgKFJFQUQgLSAxIHdyYXBwZWQpCisgKgorICogV2hlbiB0aGUgZmlybXdhcmUgcGxhY2VzIGEgcGFja2V0IGluIGEgYnVmZmVyLCBpdCB3aWxsIGFkdmFuY2UgdGhlIFJFQUQgaWR4CisgKiBhbmQgZmlyZSB0aGUgUlggaW50ZXJydXB0LiAgVGhlIGRyaXZlciBjYW4gdGhlbiBxdWVyeSB0aGUgUkVBRCBpZHggYW5kCisgKiBwcm9jZXNzIGFzIG1hbnkgcGFja2V0cyBhcyBwb3NzaWJsZSwgbW92aW5nIHRoZSBXUklURSBpZHggZm9yd2FyZCBhcyBpdAorICogcmVzZXRzIHRoZSBSeCBxdWV1ZSBidWZmZXJzIHdpdGggbmV3IG1lbW9yeS4KKyAqCisgKiBUaGUgbWFuYWdlbWVudCBpbiB0aGUgZHJpdmVyIGlzIGFzIGZvbGxvd3M6CisgKiArIEEgbGlzdCBvZiBwcmUtYWxsb2NhdGVkIFNLQnMgaXMgc3RvcmVkIGluIGl3bC0+cnhxLT5yeF9mcmVlLiAgV2hlbgorICogICBpd2wtPnJ4cS0+ZnJlZV9jb3VudCBkcm9wcyB0byBvciBiZWxvdyBSWF9MT1dfV0FURVJNQVJLLCB3b3JrIGlzIHNjaGVkdWxlZAorICogICB0byByZXBsZW5pc2ggdGhlIGl3bC0+cnhxLT5yeF9mcmVlLgorICogKyBJbiBpbF9yeF9yZXBsZW5pc2ggKHNjaGVkdWxlZCkgaWYgJ3Byb2Nlc3NlZCcgIT0gJ3JlYWQnIHRoZW4gdGhlCisgKiAgIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGFuZCB0aGUgUkVBRCBJRFggaXMgdXBkYXRlZCAodXBkYXRpbmcgdGhlCisgKiAgICdwcm9jZXNzZWQnIGFuZCAncmVhZCcgZHJpdmVyIGlkeGVzIGFzIHdlbGwpCisgKiArIEEgcmVjZWl2ZWQgcGFja2V0IGlzIHByb2Nlc3NlZCBhbmQgaGFuZGVkIHRvIHRoZSBrZXJuZWwgbmV0d29yayBzdGFjaywKKyAqICAgZGV0YWNoZWQgZnJvbSB0aGUgaXdsLT5yeHEuICBUaGUgZHJpdmVyICdwcm9jZXNzZWQnIGlkeCBpcyB1cGRhdGVkLgorICogKyBUaGUgSG9zdC9GaXJtd2FyZSBpd2wtPnJ4cSBpcyByZXBsZW5pc2hlZCBhdCB0YXNrbGV0IHRpbWUgZnJvbSB0aGUgcnhfZnJlZQorICogICBsaXN0LiBJZiB0aGVyZSBhcmUgbm8gYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUsIHRoZSBSRUFECisgKiAgIElEWCBpcyBub3QgaW5jcmVtZW50ZWQgYW5kIGl3bC0+c3RhdHVzKFJYX1NUQUxMRUQpIGlzIHNldC4gIElmIHRoZXJlCisgKiAgIHdlcmUgZW5vdWdoIGZyZWUgYnVmZmVycyBhbmQgUlhfU1RBTExFRCBpcyBzZXQgaXQgaXMgY2xlYXJlZC4KKyAqCisgKgorICogRHJpdmVyIHNlcXVlbmNlOgorICoKKyAqIGlsX3J4X3F1ZXVlX2FsbG9jKCkgICBBbGxvY2F0ZXMgcnhfZnJlZQorICogaWxfcnhfcmVwbGVuaXNoKCkgICAgIFJlcGxlbmlzaGVzIHJ4X2ZyZWUgbGlzdCBmcm9tIHJ4X3VzZWQsIGFuZCBjYWxscworICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWxfcnhfcXVldWVfcmVzdG9jaworICogaWxfcnhfcXVldWVfcmVzdG9jaygpIE1vdmVzIGF2YWlsYWJsZSBidWZmZXJzIGZyb20gcnhfZnJlZSBpbnRvIFJ4CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgdXBkYXRlcyBmaXJtd2FyZSBwb2ludGVycywgYW5kIHVwZGF0ZXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBXUklURSBpZHguICBJZiBpbnN1ZmZpY2llbnQgcnhfZnJlZSBidWZmZXJzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgYXZhaWxhYmxlLCBzY2hlZHVsZXMgaWxfcnhfcmVwbGVuaXNoCisgKgorICogLS0gZW5hYmxlIGludGVycnVwdHMgLS0KKyAqIElTUiAtIGlsX3J4KCkgICAgICAgICBEZXRhY2ggaWxfcnhfYnVmcyBmcm9tIHBvb2wgdXAgdG8gdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFEIElEWCwgZGV0YWNoaW5nIHRoZSBTS0IgZnJvbSB0aGUgcG9vbC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdmVzIHRoZSBwYWNrZXQgYnVmZmVyIGZyb20gcXVldWUgdG8gcnhfdXNlZC4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxzIGlsX3J4X3F1ZXVlX3Jlc3RvY2sgdG8gcmVmaWxsIGFueSBlbXB0eQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHMuCisgKiAuLi4KKyAqCisgKi8KKworLyoqCisgKiBpbF9yeF9xdWV1ZV9zcGFjZSAtIFJldHVybiBudW1iZXIgb2YgZnJlZSBzbG90cyBhdmFpbGFibGUgaW4gcXVldWUuCisgKi8KK2ludAoraWxfcnhfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGlsX3J4X3F1ZXVlICpxKQoreworCWludCBzID0gcS0+cmVhZCAtIHEtPndyaXRlOworCWlmIChzIDw9IDApCisJCXMgKz0gUlhfUVVFVUVfU0laRTsKKwkvKiBrZWVwIHNvbWUgYnVmZmVyIHRvIG5vdCBjb25mdXNlIGZ1bGwgYW5kIGVtcHR5IHF1ZXVlICovCisJcyAtPSAyOworCWlmIChzIDwgMCkKKwkJcyA9IDA7CisJcmV0dXJuIHM7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3J4X3F1ZXVlX3NwYWNlKTsKKworLyoqCisgKiBpbF9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyIC0gVXBkYXRlIHRoZSB3cml0ZSBwb2ludGVyIGZvciB0aGUgUlggcXVldWUKKyAqLwordm9pZAoraWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiByeF93cnRfcHRyX3JlZyA9IGlsLT5od19wYXJhbXMucnhfd3J0X3B0cl9yZWc7CisJdTMyIHJlZzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5sb2NrLCBmbGFncyk7CisKKwlpZiAocS0+bmVlZF91cGRhdGUgPT0gMCkKKwkJZ290byBleGl0X3VubG9jazsKKworCS8qIElmIHBvd2VyLXNhdmluZyBpcyBpbiB1c2UsIG1ha2Ugc3VyZSBkZXZpY2UgaXMgYXdha2UgKi8KKwlpZiAodGVzdF9iaXQoU19QT1dFUl9QTUksICZpbC0+c3RhdHVzKSkgeworCQlyZWcgPSBfaWxfcmQoaWwsIENTUl9VQ09ERV9EUlZfR1AxKTsKKworCQlpZiAocmVnICYgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX01BQ19TTEVFUCkgeworCQkJRF9JTkZPKCJSeCBxdWV1ZSByZXF1ZXN0aW5nIHdha2V1cCwiICIgR1AxID0gMHgleFxuIiwKKwkJCSAgICAgICByZWcpOworCQkJaWxfc2V0X2JpdChpbCwgQ1NSX0dQX0NOVFJMLAorCQkJCSAgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7CisJCQlnb3RvIGV4aXRfdW5sb2NrOworCQl9CisKKwkJcS0+d3JpdGVfYWN0dWFsID0gKHEtPndyaXRlICYgfjB4Nyk7CisJCWlsX3dyKGlsLCByeF93cnRfcHRyX3JlZywgcS0+d3JpdGVfYWN0dWFsKTsKKworCQkvKiBFbHNlIGRldmljZSBpcyBhc3N1bWVkIHRvIGJlIGF3YWtlICovCisJfSBlbHNlIHsKKwkJLyogRGV2aWNlIGV4cGVjdHMgYSBtdWx0aXBsZSBvZiA4ICovCisJCXEtPndyaXRlX2FjdHVhbCA9IChxLT53cml0ZSAmIH4weDcpOworCQlpbF93cihpbCwgcnhfd3J0X3B0cl9yZWcsIHEtPndyaXRlX2FjdHVhbCk7CisJfQorCisJcS0+bmVlZF91cGRhdGUgPSAwOworCitleGl0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIpOworCitpbnQKK2lsX3J4X3F1ZXVlX2FsbG9jKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSA9ICZpbC0+cnhxOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbC0+cGNpX2Rldi0+ZGV2OworCWludCBpOworCisJc3Bpbl9sb2NrX2luaXQoJnJ4cS0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfZnJlZSk7CisJSU5JVF9MSVNUX0hFQUQoJnJ4cS0+cnhfdXNlZCk7CisKKwkvKiBBbGxvYyB0aGUgY2lyY3VsYXIgYnVmZmVyIG9mIFJlYWQgQnVmZmVyIERlc2NyaXB0b3JzIChSQkRzKSAqLworCXJ4cS0+YmQgPQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgJnJ4cS0+YmRfZG1hLAorCQkJICAgICAgIEdGUF9LRVJORUwpOworCWlmICghcnhxLT5iZCkKKwkJZ290byBlcnJfYmQ7CisKKwlyeHEtPnJiX3N0dHMgPQorCSAgICBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplb2Yoc3RydWN0IGlsX3JiX3N0YXR1cyksCisJCQkgICAgICAgJnJ4cS0+cmJfc3R0c19kbWEsIEdGUF9LRVJORUwpOworCWlmICghcnhxLT5yYl9zdHRzKQorCQlnb3RvIGVycl9yYjsKKworCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLworCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspCisJCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKKworCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQorCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLworCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOworCXJ4cS0+d3JpdGVfYWN0dWFsID0gMDsKKwlyeHEtPmZyZWVfY291bnQgPSAwOworCXJ4cS0+bmVlZF91cGRhdGUgPSAwOworCXJldHVybiAwOworCitlcnJfcmI6CisJZG1hX2ZyZWVfY29oZXJlbnQoJmlsLT5wY2lfZGV2LT5kZXYsIDQgKiBSWF9RVUVVRV9TSVpFLCByeHEtPmJkLAorCQkJICByeHEtPmJkX2RtYSk7CitlcnJfYmQ6CisJcmV0dXJuIC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MKGlsX3J4X3F1ZXVlX2FsbG9jKTsKKwordm9pZAoraWxfaGRsX3NwZWN0cnVtX21lYXN1cmVtZW50KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX3NwZWN0cnVtX25vdGlmaWNhdGlvbiAqcmVwb3J0ID0gJihwa3QtPnUuc3BlY3RydW1fbm90aWYpOworCisJaWYgKCFyZXBvcnQtPnN0YXRlKSB7CisJCURfMTFIKCJTcGVjdHJ1bSBNZWFzdXJlIE5vdGlmaWNhdGlvbjogU3RhcnRcbiIpOworCQlyZXR1cm47CisJfQorCisJbWVtY3B5KCZpbC0+bWVhc3VyZV9yZXBvcnQsIHJlcG9ydCwgc2l6ZW9mKCpyZXBvcnQpKTsKKwlpbC0+bWVhc3VyZW1lbnRfc3RhdHVzIHw9IE1FQVNVUkVNRU5UX1JFQURZOworfQorRVhQT1JUX1NZTUJPTChpbF9oZGxfc3BlY3RydW1fbWVhc3VyZW1lbnQpOworCisvKgorICogcmV0dXJucyBub24temVybyBpZiBwYWNrZXQgc2hvdWxkIGJlIGRyb3BwZWQKKyAqLworaW50CitpbF9zZXRfZGVjcnlwdGVkX2ZsYWcoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAorCQkgICAgICB1MzIgZGVjcnlwdF9yZXMsIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0cykKK3sKKwl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2NvbnRyb2wpOworCisJLyoKKwkgKiBBbGwgY29udGV4dHMgaGF2ZSB0aGUgc2FtZSBzZXR0aW5nIGhlcmUgZHVlIHRvIGl0IGJlaW5nCisJICogYSBtb2R1bGUgcGFyYW1ldGVyLCBzbyBPSyB0byBjaGVjayBhbnkgY29udGV4dC4KKwkgKi8KKwlpZiAoaWwtPmN0eC5hY3RpdmUuZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfRElTX0RFQ1JZUFRfTVNLKQorCQlyZXR1cm4gMDsKKworCWlmICghKGZjICYgSUVFRTgwMjExX0ZDVExfUFJPVEVDVEVEKSkKKwkJcmV0dXJuIDA7CisKKwlEX1JYKCJkZWNyeXB0X3JlczoweCV4XG4iLCBkZWNyeXB0X3Jlcyk7CisJc3dpdGNoIChkZWNyeXB0X3JlcyAmIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTVNLKSB7CisJY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1RLSVA6CisJCS8qIFRoZSB1Q29kZSBoYXMgZ290IGEgYmFkIHBoYXNlIDEgS2V5LCBwdXNoZXMgdGhlIHBhY2tldC4KKwkJICogRGVjcnlwdGlvbiB3aWxsIGJlIGRvbmUgaW4gU1cuICovCisJCWlmICgoZGVjcnlwdF9yZXMgJiBSWF9SRVNfU1RBVFVTX0RFQ1JZUFRfVFlQRV9NU0spID09CisJCSAgICBSWF9SRVNfU1RBVFVTX0JBRF9LRVlfVFRBSykKKwkJCWJyZWFrOworCisJY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1dFUDoKKwkJaWYgKChkZWNyeXB0X3JlcyAmIFJYX1JFU19TVEFUVVNfREVDUllQVF9UWVBFX01TSykgPT0KKwkJICAgIFJYX1JFU19TVEFUVVNfQkFEX0lDVl9NSUMpIHsKKwkJCS8qIGJhZCBJQ1YsIHRoZSBwYWNrZXQgaXMgZGVzdHJveWVkIHNpbmNlIHRoZQorCQkJICogZGVjcnlwdGlvbiBpcyBpbnBsYWNlLCBkcm9wIGl0ICovCisJCQlEX1JYKCJQYWNrZXQgZGVzdHJveWVkXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCWNhc2UgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9DQ01QOgorCQlpZiAoKGRlY3J5cHRfcmVzICYgUlhfUkVTX1NUQVRVU19ERUNSWVBUX1RZUEVfTVNLKSA9PQorCQkgICAgUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LKSB7CisJCQlEX1JYKCJodyBkZWNyeXB0IHN1Y2Nlc3NmdWxseSEhIVxuIik7CisJCQlzdGF0cy0+ZmxhZyB8PSBSWF9GTEFHX0RFQ1JZUFRFRDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X2RlY3J5cHRlZF9mbGFnKTsKKworLyoqCisgKiBpbF90eHFfdXBkYXRlX3dyaXRlX3B0ciAtIFNlbmQgbmV3IHdyaXRlIGlkeCB0byBoYXJkd2FyZQorICovCit2b2lkCitpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKQoreworCXUzMiByZWcgPSAwOworCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7CisKKwlpZiAodHhxLT5uZWVkX3VwZGF0ZSA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBpZiB3ZSdyZSB0cnlpbmcgdG8gc2F2ZSBwb3dlciAqLworCWlmICh0ZXN0X2JpdChTX1BPV0VSX1BNSSwgJmlsLT5zdGF0dXMpKSB7CisJCS8qIHdha2UgdXAgbmljIGlmIGl0J3MgcG93ZXJlZCBkb3duIC4uLgorCQkgKiB1Q29kZSB3aWxsIHdha2UgdXAsIGFuZCBpbnRlcnJ1cHQgdXMgYWdhaW4sIHNvIG5leHQKKwkJICogdGltZSB3ZSdsbCBza2lwIHRoaXMgcGFydC4gKi8KKwkJcmVnID0gX2lsX3JkKGlsLCBDU1JfVUNPREVfRFJWX0dQMSk7CisKKwkJaWYgKHJlZyAmIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9NQUNfU0xFRVApIHsKKwkJCURfSU5GTygiVHggcXVldWUgJWQgcmVxdWVzdGluZyB3YWtldXAsIiAiIEdQMSA9IDB4JXhcbiIsCisJCQkgICAgICAgdHhxX2lkLCByZWcpOworCQkJaWxfc2V0X2JpdChpbCwgQ1NSX0dQX0NOVFJMLAorCQkJCSAgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpbF93cihpbCwgSEJVU19UQVJHX1dSUFRSLCB0eHEtPnEud3JpdGVfcHRyIHwgKHR4cV9pZCA8PCA4KSk7CisKKwkJLyoKKwkJICogZWxzZSBub3QgaW4gcG93ZXItc2F2ZSBtb2RlLAorCQkgKiB1Q29kZSB3aWxsIG5ldmVyIHNsZWVwIHdoZW4gd2UncmUKKwkJICogdHJ5aW5nIHRvIHR4IChkdXJpbmcgUkZLSUxMLCB3ZSdyZSBub3QgdHJ5aW5nIHRvIHR4KS4KKwkJICovCisJfSBlbHNlCisJCV9pbF93cihpbCwgSEJVU19UQVJHX1dSUFRSLCB0eHEtPnEud3JpdGVfcHRyIHwgKHR4cV9pZCA8PCA4KSk7CisJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3R4cV91cGRhdGVfd3JpdGVfcHRyKTsKKworLyoqCisgKiBpbF90eF9xdWV1ZV91bm1hcCAtICBVbm1hcCBhbnkgcmVtYWluaW5nIERNQSBtYXBwaW5ncyBhbmQgZnJlZSBza2IncworICovCit2b2lkCitpbF90eF9xdWV1ZV91bm1hcChzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVt0eHFfaWRdOworCXN0cnVjdCBpbF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisKKwlpZiAocS0+bl9iZCA9PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAocS0+d3JpdGVfcHRyICE9IHEtPnJlYWRfcHRyKSB7CisJCWlsLT5jZmctPm9wcy0+bGliLT50eHFfZnJlZV90ZmQoaWwsIHR4cSk7CisJCXEtPnJlYWRfcHRyID0gaWxfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIsIHEtPm5fYmQpOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfdHhfcXVldWVfdW5tYXApOworCisvKioKKyAqIGlsX3R4X3F1ZXVlX2ZyZWUgLSBEZWFsbG9jYXRlIERNQSBxdWV1ZS4KKyAqIEB0eHE6IFRyYW5zbWl0IHF1ZXVlIHRvIGRlYWxsb2NhdGUuCisgKgorICogRW1wdHkgcXVldWUgYnkgcmVtb3ZpbmcgYW5kIGRlc3Ryb3lpbmcgYWxsIEJEJ3MuCisgKiBGcmVlIGFsbCBidWZmZXJzLgorICogMC1maWxsLCBidXQgZG8gbm90IGZyZWUgInR4cSIgZGVzY3JpcHRvciBzdHJ1Y3R1cmUuCisgKi8KK3ZvaWQKK2lsX3R4X3F1ZXVlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkKQoreworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbdHhxX2lkXTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmaWwtPnBjaV9kZXYtPmRldjsKKwlpbnQgaTsKKworCWlsX3R4X3F1ZXVlX3VubWFwKGlsLCB0eHFfaWQpOworCisJLyogRGUtYWxsb2MgYXJyYXkgb2YgY29tbWFuZC90eCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8IFRGRF9UWF9DTURfU0xPVFM7IGkrKykKKwkJa2ZyZWUodHhxLT5jbWRbaV0pOworCisJLyogRGUtYWxsb2MgY2lyY3VsYXIgYnVmZmVyIG9mIFRGRHMgKi8KKwlpZiAodHhxLT5xLm5fYmQpCisJCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgaWwtPmh3X3BhcmFtcy50ZmRfc2l6ZSAqIHR4cS0+cS5uX2JkLAorCQkJCSAgdHhxLT50ZmRzLCB0eHEtPnEuZG1hX2FkZHIpOworCisJLyogRGUtYWxsb2MgYXJyYXkgb2YgcGVyLVRGRCBkcml2ZXIgZGF0YSAqLworCWtmcmVlKHR4cS0+dHhiKTsKKwl0eHEtPnR4YiA9IE5VTEw7CisKKwkvKiBkZWFsbG9jYXRlIGFycmF5cyAqLworCWtmcmVlKHR4cS0+Y21kKTsKKwlrZnJlZSh0eHEtPm1ldGEpOworCXR4cS0+Y21kID0gTlVMTDsKKwl0eHEtPm1ldGEgPSBOVUxMOworCisJLyogMC1maWxsIHF1ZXVlIGRlc2NyaXB0b3Igc3RydWN0dXJlICovCisJbWVtc2V0KHR4cSwgMCwgc2l6ZW9mKCp0eHEpKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfdHhfcXVldWVfZnJlZSk7CisKKy8qKgorICogaWxfY21kX3F1ZXVlX3VubWFwIC0gVW5tYXAgYW55IHJlbWFpbmluZyBETUEgbWFwcGluZ3MgZnJvbSBjb21tYW5kIHF1ZXVlCisgKi8KK3ZvaWQKK2lsX2NtZF9xdWV1ZV91bm1hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVtpbC0+Y21kX3F1ZXVlXTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmdHhxLT5xOworCWludCBpOworCisJaWYgKHEtPm5fYmQgPT0gMCkKKwkJcmV0dXJuOworCisJd2hpbGUgKHEtPnJlYWRfcHRyICE9IHEtPndyaXRlX3B0cikgeworCQlpID0gaWxfZ2V0X2NtZF9pZHgocSwgcS0+cmVhZF9wdHIsIDApOworCisJCWlmICh0eHEtPm1ldGFbaV0uZmxhZ3MgJiBDTURfTUFQUEVEKSB7CisJCQlwY2lfdW5tYXBfc2luZ2xlKGlsLT5wY2lfZGV2LAorCQkJCQkgZG1hX3VubWFwX2FkZHIoJnR4cS0+bWV0YVtpXSwgbWFwcGluZyksCisJCQkJCSBkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaV0sIGxlbiksCisJCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQkJdHhxLT5tZXRhW2ldLmZsYWdzID0gMDsKKwkJfQorCisJCXEtPnJlYWRfcHRyID0gaWxfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIsIHEtPm5fYmQpOworCX0KKworCWkgPSBxLT5uX3dpbjsKKwlpZiAodHhxLT5tZXRhW2ldLmZsYWdzICYgQ01EX01BUFBFRCkgeworCQlwY2lfdW5tYXBfc2luZ2xlKGlsLT5wY2lfZGV2LAorCQkJCSBkbWFfdW5tYXBfYWRkcigmdHhxLT5tZXRhW2ldLCBtYXBwaW5nKSwKKwkJCQkgZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2ldLCBsZW4pLAorCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCQl0eHEtPm1ldGFbaV0uZmxhZ3MgPSAwOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfY21kX3F1ZXVlX3VubWFwKTsKKworLyoqCisgKiBpbF9jbWRfcXVldWVfZnJlZSAtIERlYWxsb2NhdGUgRE1BIHF1ZXVlLgorICogQHR4cTogVHJhbnNtaXQgcXVldWUgdG8gZGVhbGxvY2F0ZS4KKyAqCisgKiBFbXB0eSBxdWV1ZSBieSByZW1vdmluZyBhbmQgZGVzdHJveWluZyBhbGwgQkQncy4KKyAqIEZyZWUgYWxsIGJ1ZmZlcnMuCisgKiAwLWZpbGwsIGJ1dCBkbyBub3QgZnJlZSAidHhxIiBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KKyAqLwordm9pZAoraWxfY21kX3F1ZXVlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbaWwtPmNtZF9xdWV1ZV07CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmlsLT5wY2lfZGV2LT5kZXY7CisJaW50IGk7CisKKwlpbF9jbWRfcXVldWVfdW5tYXAoaWwpOworCisJLyogRGUtYWxsb2MgYXJyYXkgb2YgY29tbWFuZC90eCBidWZmZXJzICovCisJZm9yIChpID0gMDsgaSA8PSBURkRfQ01EX1NMT1RTOyBpKyspCisJCWtmcmVlKHR4cS0+Y21kW2ldKTsKKworCS8qIERlLWFsbG9jIGNpcmN1bGFyIGJ1ZmZlciBvZiBURkRzICovCisJaWYgKHR4cS0+cS5uX2JkKQorCQlkbWFfZnJlZV9jb2hlcmVudChkZXYsIGlsLT5od19wYXJhbXMudGZkX3NpemUgKiB0eHEtPnEubl9iZCwKKwkJCQkgIHR4cS0+dGZkcywgdHhxLT5xLmRtYV9hZGRyKTsKKworCS8qIGRlYWxsb2NhdGUgYXJyYXlzICovCisJa2ZyZWUodHhxLT5jbWQpOworCWtmcmVlKHR4cS0+bWV0YSk7CisJdHhxLT5jbWQgPSBOVUxMOworCXR4cS0+bWV0YSA9IE5VTEw7CisKKwkvKiAwLWZpbGwgcXVldWUgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQodHhxLCAwLCBzaXplb2YoKnR4cSkpOworfQorRVhQT1JUX1NZTUJPTChpbF9jbWRfcXVldWVfZnJlZSk7CisKKy8qKioqKioqKioqKioqKiogRE1BLVFVRVVFLUdFTkVSQUwtRlVOQ1RJT05TICAqKioqKgorICogRE1BIHNlcnZpY2VzCisgKgorICogVGhlb3J5IG9mIG9wZXJhdGlvbgorICoKKyAqIEEgVHggb3IgUnggcXVldWUgcmVzaWRlcyBpbiBob3N0IERSQU0sIGFuZCBpcyBjb21wcmlzZWQgb2YgYSBjaXJjdWxhciBidWZmZXIKKyAqIG9mIGJ1ZmZlciBkZXNjcmlwdG9ycywgZWFjaCBvZiB3aGljaCBwb2ludHMgdG8gb25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIGZvcgorICogdGhlIGRldmljZSB0byByZWFkIGZyb20gb3IgZmlsbC4gIERyaXZlciBhbmQgZGV2aWNlIGV4Y2hhbmdlIHN0YXR1cyBvZiBlYWNoCisgKiBxdWV1ZSB2aWEgInJlYWQiIGFuZCAid3JpdGUiIHBvaW50ZXJzLiAgRHJpdmVyIGtlZXBzIG1pbmltdW0gb2YgMiBlbXB0eQorICogZW50cmllcyBpbiBlYWNoIGNpcmN1bGFyIGJ1ZmZlciwgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmZ1c2luZyBlbXB0eSBhbmQgZnVsbAorICogcXVldWUgc3RhdGVzLgorICoKKyAqIFRoZSBkZXZpY2UgcmVhZHMgb3Igd3JpdGVzIHRoZSBkYXRhIGluIHRoZSBxdWV1ZXMgdmlhIHRoZSBkZXZpY2UncyBzZXZlcmFsCisgKiBETUEvRklGTyBjaGFubmVscy4gIEVhY2ggcXVldWUgaXMgbWFwcGVkIHRvIGEgc2luZ2xlIERNQSBjaGFubmVsLgorICoKKyAqIEZvciBUeCBxdWV1ZSwgdGhlcmUgYXJlIGxvdyBtYXJrIGFuZCBoaWdoIG1hcmsgbGltaXRzLiBJZiwgYWZ0ZXIgcXVldWluZworICogdGhlIHBhY2tldCBmb3IgVHgsIGZyZWUgc3BhY2UgYmVjb21lIDwgbG93IG1hcmssIFR4IHF1ZXVlIHN0b3BwZWQuIFdoZW4KKyAqIHJlY2xhaW1pbmcgcGFja2V0cyAob24gJ3R4IGRvbmUgSVJRKSwgaWYgZnJlZSBzcGFjZSBiZWNvbWUgPiBoaWdoIG1hcmssCisgKiBUeCBxdWV1ZSByZXN1bWVkLgorICoKKyAqIFNlZSBtb3JlIGRldGFpbGVkIGluZm8gaW4gNDk2NS5oLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW50CitpbF9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaWxfcXVldWUgKnEpCit7CisJaW50IHMgPSBxLT5yZWFkX3B0ciAtIHEtPndyaXRlX3B0cjsKKworCWlmIChxLT5yZWFkX3B0ciA+IHEtPndyaXRlX3B0cikKKwkJcyAtPSBxLT5uX2JkOworCisJaWYgKHMgPD0gMCkKKwkJcyArPSBxLT5uX3dpbjsKKwkvKiBrZWVwIHNvbWUgcmVzZXJ2ZSB0byBub3QgY29uZnVzZSBlbXB0eSBhbmQgZnVsbCBzaXR1YXRpb25zICovCisJcyAtPSAyOworCWlmIChzIDwgMCkKKwkJcyA9IDA7CisJcmV0dXJuIHM7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3F1ZXVlX3NwYWNlKTsKKworCisvKioKKyAqIGlsX3F1ZXVlX2luaXQgLSBJbml0aWFsaXplIHF1ZXVlJ3MgaGlnaC9sb3ctd2F0ZXIgYW5kIHJlYWQvd3JpdGUgaWR4ZXMKKyAqLworc3RhdGljIGludAoraWxfcXVldWVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9xdWV1ZSAqcSwgaW50IGNvdW50LCBpbnQgc2xvdHNfbnVtLAorCSAgICAgIHUzMiBpZCkKK3sKKwlxLT5uX2JkID0gY291bnQ7CisJcS0+bl93aW4gPSBzbG90c19udW07CisJcS0+aWQgPSBpZDsKKworCS8qIGNvdW50IG11c3QgYmUgcG93ZXItb2YtdHdvIHNpemUsIG90aGVyd2lzZSBpbF9xdWV1ZV9pbmNfd3JhcAorCSAqIGFuZCBpbF9xdWV1ZV9kZWNfd3JhcCBhcmUgYnJva2VuLiAqLworCUJVR19PTighaXNfcG93ZXJfb2ZfMihjb3VudCkpOworCisJLyogc2xvdHNfbnVtIG11c3QgYmUgcG93ZXItb2YtdHdvIHNpemUsIG90aGVyd2lzZQorCSAqIGlsX2dldF9jbWRfaWR4IGlzIGJyb2tlbi4gKi8KKwlCVUdfT04oIWlzX3Bvd2VyX29mXzIoc2xvdHNfbnVtKSk7CisKKwlxLT5sb3dfbWFyayA9IHEtPm5fd2luIC8gNDsKKwlpZiAocS0+bG93X21hcmsgPCA0KQorCQlxLT5sb3dfbWFyayA9IDQ7CisKKwlxLT5oaWdoX21hcmsgPSBxLT5uX3dpbiAvIDg7CisJaWYgKHEtPmhpZ2hfbWFyayA8IDIpCisJCXEtPmhpZ2hfbWFyayA9IDI7CisKKwlxLT53cml0ZV9wdHIgPSBxLT5yZWFkX3B0ciA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBpbF90eF9xdWV1ZV9hbGxvYyAtIEFsbG9jIGRyaXZlciBkYXRhIGFuZCBURkQgQ0IgZm9yIG9uZSBUeC9jbWQgcXVldWUKKyAqLworc3RhdGljIGludAoraWxfdHhfcXVldWVfYWxsb2Moc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwgdTMyIGlkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZpbC0+cGNpX2Rldi0+ZGV2OworCXNpemVfdCB0ZmRfc3ogPSBpbC0+aHdfcGFyYW1zLnRmZF9zaXplICogVEZEX1FVRVVFX1NJWkVfTUFYOworCisJLyogRHJpdmVyIGlsYXRlIGRhdGEsIG9ubHkgZm9yIFR4IChub3QgY29tbWFuZCkgcXVldWVzLAorCSAqIG5vdCBzaGFyZWQgd2l0aCBkZXZpY2UuICovCisJaWYgKGlkICE9IGlsLT5jbWRfcXVldWUpIHsKKwkJdHhxLT50eGIgPSBrY2FsbG9jKFRGRF9RVUVVRV9TSVpFX01BWCwgc2l6ZW9mKHR4cS0+dHhiWzBdKSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0eHEtPnR4YikgeworCQkJSUxfRVJSKCJrbWFsbG9jIGZvciBhdXhpbGlhcnkgQkQgIgorCQkJICAgICAgICJzdHJ1Y3R1cmVzIGZhaWxlZFxuIik7CisJCQlnb3RvIGVycm9yOworCQl9CisJfSBlbHNlIHsKKwkJdHhxLT50eGIgPSBOVUxMOworCX0KKworCS8qIENpcmN1bGFyIGJ1ZmZlciBvZiB0cmFuc21pdCBmcmFtZSBkZXNjcmlwdG9ycyAoVEZEcyksCisJICogc2hhcmVkIHdpdGggZGV2aWNlICovCisJdHhxLT50ZmRzID0KKwkgICAgZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgdGZkX3N6LCAmdHhxLT5xLmRtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4cS0+dGZkcykgeworCQlJTF9FUlIoInBjaV9hbGxvY19jb25zaXN0ZW50KCV6ZCkgZmFpbGVkXG4iLCB0ZmRfc3opOworCQlnb3RvIGVycm9yOworCX0KKwl0eHEtPnEuaWQgPSBpZDsKKworCXJldHVybiAwOworCitlcnJvcjoKKwlrZnJlZSh0eHEtPnR4Yik7CisJdHhxLT50eGIgPSBOVUxMOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKKy8qKgorICogaWxfdHhfcXVldWVfaW5pdCAtIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG9uZSB0eC9jbWQgcXVldWUKKyAqLworaW50CitpbF90eF9xdWV1ZV9pbml0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEsIGludCBzbG90c19udW0sCisJCSB1MzIgdHhxX2lkKQoreworCWludCBpLCBsZW47CisJaW50IHJldDsKKwlpbnQgYWN0dWFsX3Nsb3RzID0gc2xvdHNfbnVtOworCisJLyoKKwkgKiBBbGxvYyBidWZmZXIgYXJyYXkgZm9yIGNvbW1hbmRzIChUeCBvciBvdGhlciB0eXBlcyBvZiBjb21tYW5kcykuCisJICogRm9yIHRoZSBjb21tYW5kIHF1ZXVlICgjNC8jOSksIGFsbG9jYXRlIGNvbW1hbmQgc3BhY2UgKyBvbmUgYmlnCisJICogY29tbWFuZCBmb3Igc2Nhbiwgc2luY2Ugc2NhbiBjb21tYW5kIGlzIHZlcnkgaHVnZTsgdGhlIHN5c3RlbSB3aWxsCisJICogbm90IGhhdmUgdHdvIHNjYW5zIGF0IHRoZSBzYW1lIHRpbWUsIHNvIG9ubHkgb25lIGlzIG5lZWRlZC4KKwkgKiBGb3Igbm9ybWFsIFR4IHF1ZXVlcyAoYWxsIG90aGVyIHF1ZXVlcyksIG5vIHN1cGVyLXNpemUgY29tbWFuZAorCSAqIHNwYWNlIGlzIG5lZWRlZC4KKwkgKi8KKwlpZiAodHhxX2lkID09IGlsLT5jbWRfcXVldWUpCisJCWFjdHVhbF9zbG90cysrOworCisJdHhxLT5tZXRhID0KKwkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IGlsX2NtZF9tZXRhKSAqIGFjdHVhbF9zbG90cywgR0ZQX0tFUk5FTCk7CisJdHhxLT5jbWQgPQorCSAgICBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqKSAqIGFjdHVhbF9zbG90cywgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXR4cS0+bWV0YSB8fCAhdHhxLT5jbWQpCisJCWdvdG8gb3V0X2ZyZWVfYXJyYXlzOworCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBpbF9kZXZpY2VfY21kKTsKKwlmb3IgKGkgPSAwOyBpIDwgYWN0dWFsX3Nsb3RzOyBpKyspIHsKKwkJLyogb25seSBoYXBwZW5zIGZvciBjbWQgcXVldWUgKi8KKwkJaWYgKGkgPT0gc2xvdHNfbnVtKQorCQkJbGVuID0gSUxfTUFYX0NNRF9TSVpFOworCisJCXR4cS0+Y21kW2ldID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCQlpZiAoIXR4cS0+Y21kW2ldKQorCQkJZ290byBlcnI7CisJfQorCisJLyogQWxsb2MgZHJpdmVyIGRhdGEgYXJyYXkgYW5kIFRGRCBjaXJjdWxhciBidWZmZXIgKi8KKwlyZXQgPSBpbF90eF9xdWV1ZV9hbGxvYyhpbCwgdHhxLCB0eHFfaWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOworCisJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7CisKKwkvKgorCSAqIEZvciB0aGUgZGVmYXVsdCBxdWV1ZXMgMC0zLCBzZXQgdXAgdGhlIHN3cV9pZAorCSAqIGFscmVhZHkgLS0gYWxsIG90aGVycyBuZWVkIHRvIGdldCBvbmUgbGF0ZXIKKwkgKiAoaWYgdGhleSBuZWVkIG9uZSBhdCBhbGwpLgorCSAqLworCWlmICh0eHFfaWQgPCA0KQorCQlpbF9zZXRfc3dxX2lkKHR4cSwgdHhxX2lkLCB0eHFfaWQpOworCisJLyogVEZEX1FVRVVFX1NJWkVfTUFYIG11c3QgYmUgcG93ZXItb2YtdHdvIHNpemUsIG90aGVyd2lzZQorCSAqIGlsX3F1ZXVlX2luY193cmFwIGFuZCBpbF9xdWV1ZV9kZWNfd3JhcCBhcmUgYnJva2VuLiAqLworCUJVSUxEX0JVR19PTihURkRfUVVFVUVfU0laRV9NQVggJiAoVEZEX1FVRVVFX1NJWkVfTUFYIC0gMSkpOworCisJLyogSW5pdGlhbGl6ZSBxdWV1ZSdzIGhpZ2gvbG93LXdhdGVyIG1hcmtzLCBhbmQgaGVhZC90YWlsIGlkeGVzICovCisJaWxfcXVldWVfaW5pdChpbCwgJnR4cS0+cSwgVEZEX1FVRVVFX1NJWkVfTUFYLCBzbG90c19udW0sIHR4cV9pZCk7CisKKwkvKiBUZWxsIGRldmljZSB3aGVyZSB0byBmaW5kIHF1ZXVlICovCisJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9pbml0KGlsLCB0eHEpOworCisJcmV0dXJuIDA7CitlcnI6CisJZm9yIChpID0gMDsgaSA8IGFjdHVhbF9zbG90czsgaSsrKQorCQlrZnJlZSh0eHEtPmNtZFtpXSk7CitvdXRfZnJlZV9hcnJheXM6CisJa2ZyZWUodHhxLT5tZXRhKTsKKwlrZnJlZSh0eHEtPmNtZCk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KK0VYUE9SVF9TWU1CT0woaWxfdHhfcXVldWVfaW5pdCk7CisKK3ZvaWQKK2lsX3R4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEsIGludCBzbG90c19udW0sCisJCSAgdTMyIHR4cV9pZCkKK3sKKwlpbnQgYWN0dWFsX3Nsb3RzID0gc2xvdHNfbnVtOworCisJaWYgKHR4cV9pZCA9PSBpbC0+Y21kX3F1ZXVlKQorCQlhY3R1YWxfc2xvdHMrKzsKKworCW1lbXNldCh0eHEtPm1ldGEsIDAsIHNpemVvZihzdHJ1Y3QgaWxfY21kX21ldGEpICogYWN0dWFsX3Nsb3RzKTsKKworCXR4cS0+bmVlZF91cGRhdGUgPSAwOworCisJLyogSW5pdGlhbGl6ZSBxdWV1ZSdzIGhpZ2gvbG93LXdhdGVyIG1hcmtzLCBhbmQgaGVhZC90YWlsIGlkeGVzICovCisJaWxfcXVldWVfaW5pdChpbCwgJnR4cS0+cSwgVEZEX1FVRVVFX1NJWkVfTUFYLCBzbG90c19udW0sIHR4cV9pZCk7CisKKwkvKiBUZWxsIGRldmljZSB3aGVyZSB0byBmaW5kIHF1ZXVlICovCisJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9pbml0KGlsLCB0eHEpOworfQorRVhQT1JUX1NZTUJPTChpbF90eF9xdWV1ZV9yZXNldCk7CisKKy8qKioqKioqKioqKioqKiogSE9TVCBDT01NQU5EIFFVRVVFIEZVTkNUSU9OUyAgICoqKioqLworCisvKioKKyAqIGlsX2VucXVldWVfaGNtZCAtIGVucXVldWUgYSB1Q29kZSBjb21tYW5kCisgKiBAaWw6IGRldmljZSBpbGF0ZSBkYXRhIHBvaW50CisgKiBAY21kOiBhIHBvaW50IHRvIHRoZSB1Y29kZSBjb21tYW5kIHN0cnVjdHVyZQorICoKKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIDwgMCB2YWx1ZXMgdG8gaW5kaWNhdGUgdGhlIG9wZXJhdGlvbiBpcworICogZmFpbGVkLiBPbiBzdWNjZXNzLCBpdCB0dXJucyB0aGUgaWR4ICg+IDApIG9mIGNvbW1hbmQgaW4gdGhlCisgKiBjb21tYW5kIHF1ZXVlLgorICovCitpbnQKK2lsX2VucXVldWVfaGNtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9ob3N0X2NtZCAqY21kKQoreworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbaWwtPmNtZF9xdWV1ZV07CisJc3RydWN0IGlsX3F1ZXVlICpxID0gJnR4cS0+cTsKKwlzdHJ1Y3QgaWxfZGV2aWNlX2NtZCAqb3V0X2NtZDsKKwlzdHJ1Y3QgaWxfY21kX21ldGEgKm91dF9tZXRhOworCWRtYV9hZGRyX3QgcGh5c19hZGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGxlbjsKKwl1MzIgaWR4OworCXUxNiBmaXhfc2l6ZTsKKworCWNtZC0+bGVuID0gaWwtPmNmZy0+b3BzLT51dGlscy0+Z2V0X2hjbWRfc2l6ZShjbWQtPmlkLCBjbWQtPmxlbik7CisJZml4X3NpemUgPSAodTE2KSAoY21kLT5sZW4gKyBzaXplb2Yob3V0X2NtZC0+aGRyKSk7CisKKwkvKiBJZiBhbnkgb2YgdGhlIGNvbW1hbmQgc3RydWN0dXJlcyBlbmQgdXAgYmVpbmcgbGFyZ2VyIHRoYW4KKwkgKiB0aGUgVEZEX01BWF9QQVlMT0FEX1NJWkUsIGFuZCBpdCBzZW50IGFzIGEgJ3NtYWxsJyBjb21tYW5kIHRoZW4KKwkgKiB3ZSB3aWxsIG5lZWQgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFRGRCBlbnRyaWVzCisJICogQWxzbywgY2hlY2sgdG8gc2VlIGlmIGNvbW1hbmQgYnVmZmVyIHNob3VsZCBub3QgZXhjZWVkIHRoZSBzaXplCisJICogb2YgZGV2aWNlX2NtZCBhbmQgbWF4X2NtZF9zaXplLiAqLworCUJVR19PTigoZml4X3NpemUgPiBURkRfTUFYX1BBWUxPQURfU0laRSkgJiYKKwkgICAgICAgIShjbWQtPmZsYWdzICYgQ01EX1NJWkVfSFVHRSkpOworCUJVR19PTihmaXhfc2l6ZSA+IElMX01BWF9DTURfU0laRSk7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSB8fCBpbF9pc19jdGtpbGwoaWwpKSB7CisJCUlMX1dBUk4oIk5vdCBzZW5kaW5nIGNvbW1hbmQgLSAlcyBLSUxMXG4iLAorCQkJaWxfaXNfcmZraWxsKGlsKSA/ICJSRiIgOiAiQ1QiKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5oY21kX2xvY2ssIGZsYWdzKTsKKworCWlmIChpbF9xdWV1ZV9zcGFjZShxKSA8ICgoY21kLT5mbGFncyAmIENNRF9BU1lOQykgPyAyIDogMSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmhjbWRfbG9jaywgZmxhZ3MpOworCisJCUlMX0VSUigiUmVzdGFydGluZyBhZGFwdGVyIGR1ZSB0byBjb21tYW5kIHF1ZXVlIGZ1bGxcbiIpOworCQlxdWV1ZV93b3JrKGlsLT53b3JrcXVldWUsICZpbC0+cmVzdGFydCk7CisJCXJldHVybiAtRU5PU1BDOworCX0KKworCWlkeCA9IGlsX2dldF9jbWRfaWR4KHEsIHEtPndyaXRlX3B0ciwgY21kLT5mbGFncyAmIENNRF9TSVpFX0hVR0UpOworCW91dF9jbWQgPSB0eHEtPmNtZFtpZHhdOworCW91dF9tZXRhID0gJnR4cS0+bWV0YVtpZHhdOworCisJaWYgKFdBUk5fT04ob3V0X21ldGEtPmZsYWdzICYgQ01EX01BUFBFRCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmhjbWRfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwltZW1zZXQob3V0X21ldGEsIDAsIHNpemVvZigqb3V0X21ldGEpKTsJLyogcmUtaW5pdGlhbGl6ZSB0byBOVUxMICovCisJb3V0X21ldGEtPmZsYWdzID0gY21kLT5mbGFncyB8IENNRF9NQVBQRUQ7CisJaWYgKGNtZC0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpCisJCW91dF9tZXRhLT5zb3VyY2UgPSBjbWQ7CisJaWYgKGNtZC0+ZmxhZ3MgJiBDTURfQVNZTkMpCisJCW91dF9tZXRhLT5jYWxsYmFjayA9IGNtZC0+Y2FsbGJhY2s7CisKKwlvdXRfY21kLT5oZHIuY21kID0gY21kLT5pZDsKKwltZW1jcHkoJm91dF9jbWQtPmNtZC5wYXlsb2FkLCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBvdXRfY21kIG5vdyBoYXMgYWxsIG9mIHRoZSBpbmNvbWluZyBjbWQKKwkgKiBpbmZvcm1hdGlvbiAqLworCisJb3V0X2NtZC0+aGRyLmZsYWdzID0gMDsKKwlvdXRfY21kLT5oZHIuc2VxdWVuY2UgPQorCSAgICBjcHVfdG9fbGUxNihRVUVVRV9UT19TRVEoaWwtPmNtZF9xdWV1ZSkgfCBJRFhfVE9fU0VRKHEtPndyaXRlX3B0cikpOworCWlmIChjbWQtPmZsYWdzICYgQ01EX1NJWkVfSFVHRSkKKwkJb3V0X2NtZC0+aGRyLnNlcXVlbmNlIHw9IFNFUV9IVUdFX0ZSQU1FOworCWxlbiA9IHNpemVvZihzdHJ1Y3QgaWxfZGV2aWNlX2NtZCk7CisJaWYgKGlkeCA9PSBURkRfQ01EX1NMT1RTKQorCQlsZW4gPSBJTF9NQVhfQ01EX1NJWkU7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlzd2l0Y2ggKG91dF9jbWQtPmhkci5jbWQpIHsKKwljYXNlIENfVFhfTElOS19RVUFMSVRZX0NNRDoKKwljYXNlIENfU0VOU0lUSVZJVFk6CisJCURfSENfRFVNUCgiU2VuZGluZyBjb21tYW5kICVzICgjJXgpLCBzZXE6IDB4JTA0WCwgIgorCQkJICAiJWQgYnl0ZXMgYXQgJWRbJWRdOiVkXG4iLAorCQkJICBpbF9nZXRfY21kX3N0cmluZyhvdXRfY21kLT5oZHIuY21kKSwgb3V0X2NtZC0+aGRyLmNtZCwKKwkJCSAgbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSwgZml4X3NpemUsCisJCQkgIHEtPndyaXRlX3B0ciwgaWR4LCBpbC0+Y21kX3F1ZXVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJRF9IQygiU2VuZGluZyBjb21tYW5kICVzICgjJXgpLCBzZXE6IDB4JTA0WCwgIgorCQkgICAgICIlZCBieXRlcyBhdCAlZFslZF06JWRcbiIsCisJCSAgICAgaWxfZ2V0X2NtZF9zdHJpbmcob3V0X2NtZC0+aGRyLmNtZCksIG91dF9jbWQtPmhkci5jbWQsCisJCSAgICAgbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSwgZml4X3NpemUsIHEtPndyaXRlX3B0ciwKKwkJICAgICBpZHgsIGlsLT5jbWRfcXVldWUpOworCX0KKyNlbmRpZgorCXR4cS0+bmVlZF91cGRhdGUgPSAxOworCisJaWYgKGlsLT5jZmctPm9wcy0+bGliLT50eHFfdXBkYXRlX2J5dGVfY250X3RibCkKKwkJLyogU2V0IHVwIGVudHJ5IGluIHF1ZXVlJ3MgYnl0ZSBjb3VudCBjaXJjdWxhciBidWZmZXIgKi8KKwkJaWwtPmNmZy0+b3BzLT5saWItPnR4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKGlsLCB0eHEsIDApOworCisJcGh5c19hZGRyID0KKwkgICAgcGNpX21hcF9zaW5nbGUoaWwtPnBjaV9kZXYsICZvdXRfY21kLT5oZHIsIGZpeF9zaXplLAorCQkJICAgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKKwlkbWFfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHBoeXNfYWRkcik7CisJZG1hX3VubWFwX2xlbl9zZXQob3V0X21ldGEsIGxlbiwgZml4X3NpemUpOworCisJaWwtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChpbCwgdHhxLCBwaHlzX2FkZHIsIGZpeF9zaXplLAorCQkJCQkJIDEsIFUzMl9QQUQoY21kLT5sZW4pKTsKKworCS8qIEluY3JlbWVudCBhbmQgdXBkYXRlIHF1ZXVlJ3Mgd3JpdGUgaWR4ICovCisJcS0+d3JpdGVfcHRyID0gaWxfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyLCBxLT5uX2JkKTsKKwlpbF90eHFfdXBkYXRlX3dyaXRlX3B0cihpbCwgdHhxKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5oY21kX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gaWR4OworfQorCisvKioKKyAqIGlsX2hjbWRfcXVldWVfcmVjbGFpbSAtIFJlY2xhaW0gVFggY29tbWFuZCBxdWV1ZSBlbnRyaWVzIGFscmVhZHkgVHgnZAorICoKKyAqIFdoZW4gRlcgYWR2YW5jZXMgJ1InIGlkeCwgYWxsIGVudHJpZXMgYmV0d2VlbiBvbGQgYW5kIG5ldyAnUicgaWR4CisgKiBuZWVkIHRvIGJlIHJlY2xhaW1lZC4gQXMgcmVzdWx0LCBzb21lIGZyZWUgc3BhY2UgZm9ybXMuICBJZiB0aGVyZSBpcworICogZW5vdWdoIGZyZWUgc3BhY2UgKD4gbG93IG1hcmspLCB3YWtlIHRoZSBzdGFjayB0aGF0IGZlZWRzIHVzLgorICovCitzdGF0aWMgdm9pZAoraWxfaGNtZF9xdWV1ZV9yZWNsYWltKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCwgaW50IGlkeCwgaW50IGNtZF9pZHgpCit7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEgPSAmaWwtPnR4cVt0eHFfaWRdOworCXN0cnVjdCBpbF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CisJaW50IG5mcmVlZCA9IDA7CisKKwlpZiAoaWR4ID49IHEtPm5fYmQgfHwgaWxfcXVldWVfdXNlZChxLCBpZHgpID09IDApIHsKKwkJSUxfRVJSKCJSZWFkIGlkeCBmb3IgRE1BIHF1ZXVlIHR4cSBpZCAoJWQpLCBpZHggJWQsICIKKwkJICAgICAgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwgdHhxX2lkLCBpZHgsIHEtPm5fYmQsCisJCSAgICAgICBxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaWR4ID0gaWxfcXVldWVfaW5jX3dyYXAoaWR4LCBxLT5uX2JkKTsgcS0+cmVhZF9wdHIgIT0gaWR4OworCSAgICAgcS0+cmVhZF9wdHIgPSBpbF9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCkpIHsKKworCQlpZiAobmZyZWVkKysgPiAwKSB7CisJCQlJTF9FUlIoIkhDTUQgc2tpcHBlZDogaWR4ICglZCkgJWQgJWRcbiIsIGlkeCwKKwkJCSAgICAgICBxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKKwkJCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5yZXN0YXJ0KTsKKwkJfQorCisJfQorfQorCisvKioKKyAqIGlsX3R4X2NtZF9jb21wbGV0ZSAtIFB1bGwgdW51c2VkIGJ1ZmZlcnMgb2ZmIHRoZSBxdWV1ZSBhbmQgcmVjbGFpbSB0aGVtCisgKiBAcnhiOiBSeCBidWZmZXIgdG8gcmVjbGFpbQorICoKKyAqIElmIGFuIFJ4IGJ1ZmZlciBoYXMgYW4gYXN5bmMgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIGl0IHRoZSBjYWxsYmFjaworICogd2lsbCBiZSBleGVjdXRlZC4gIFRoZSBhdHRhY2hlZCBza2IgKGlmIHByZXNlbnQpIHdpbGwgb25seSBiZSBmcmVlZAorICogaWYgdGhlIGNhbGxiYWNrIHJldHVybnMgMQorICovCit2b2lkCitpbF90eF9jbWRfY29tcGxldGUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpCit7CisJc3RydWN0IGlsX3J4X3BrdCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwl1MTYgc2VxdWVuY2UgPSBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSk7CisJaW50IHR4cV9pZCA9IFNFUV9UT19RVUVVRShzZXF1ZW5jZSk7CisJaW50IGlkeCA9IFNFUV9UT19JRFgoc2VxdWVuY2UpOworCWludCBjbWRfaWR4OworCWJvb2wgaHVnZSA9ICEhKHBrdC0+aGRyLnNlcXVlbmNlICYgU0VRX0hVR0VfRlJBTUUpOworCXN0cnVjdCBpbF9kZXZpY2VfY21kICpjbWQ7CisJc3RydWN0IGlsX2NtZF9tZXRhICptZXRhOworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbaWwtPmNtZF9xdWV1ZV07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIElmIGEgVHggY29tbWFuZCBpcyBiZWluZyBoYW5kbGVkIGFuZCBpdCBpc24ndCBpbiB0aGUgYWN0dWFsCisJICogY29tbWFuZCBxdWV1ZSB0aGVuIHRoZXJlIGEgY29tbWFuZCByb3V0aW5nIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkCisJICogaW4gdGhlIHF1ZXVlIG1hbmFnZW1lbnQgY29kZS4gKi8KKwlpZiAoV0FSTgorCSAgICAodHhxX2lkICE9IGlsLT5jbWRfcXVldWUsCisJICAgICAid3JvbmcgY29tbWFuZCBxdWV1ZSAlZCAoc2hvdWxkIGJlICVkKSwgc2VxdWVuY2UgMHglWCByZWFkcD0lZCB3cml0ZXA9JWRcbiIsCisJICAgICB0eHFfaWQsIGlsLT5jbWRfcXVldWUsIHNlcXVlbmNlLCBpbC0+dHhxW2lsLT5jbWRfcXVldWVdLnEucmVhZF9wdHIsCisJICAgICBpbC0+dHhxW2lsLT5jbWRfcXVldWVdLnEud3JpdGVfcHRyKSkgeworCQlpbF9wcmludF9oZXhfZXJyb3IoaWwsIHBrdCwgMzIpOworCQlyZXR1cm47CisJfQorCisJY21kX2lkeCA9IGlsX2dldF9jbWRfaWR4KCZ0eHEtPnEsIGlkeCwgaHVnZSk7CisJY21kID0gdHhxLT5jbWRbY21kX2lkeF07CisJbWV0YSA9ICZ0eHEtPm1ldGFbY21kX2lkeF07CisKKwl0eHEtPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCisJcGNpX3VubWFwX3NpbmdsZShpbC0+cGNpX2RldiwgZG1hX3VubWFwX2FkZHIobWV0YSwgbWFwcGluZyksCisJCQkgZG1hX3VubWFwX2xlbihtZXRhLCBsZW4pLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOworCisJLyogSW5wdXQgZXJyb3IgY2hlY2tpbmcgaXMgZG9uZSB3aGVuIGNvbW1hbmRzIGFyZSBhZGRlZCB0byBxdWV1ZS4gKi8KKwlpZiAobWV0YS0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpIHsKKwkJbWV0YS0+c291cmNlLT5yZXBseV9wYWdlID0gKHVuc2lnbmVkIGxvbmcpcnhiX2FkZHIocnhiKTsKKwkJcnhiLT5wYWdlID0gTlVMTDsKKwl9IGVsc2UgaWYgKG1ldGEtPmNhbGxiYWNrKQorCQltZXRhLT5jYWxsYmFjayhpbCwgY21kLCBwa3QpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5oY21kX2xvY2ssIGZsYWdzKTsKKworCWlsX2hjbWRfcXVldWVfcmVjbGFpbShpbCwgdHhxX2lkLCBpZHgsIGNtZF9pZHgpOworCisJaWYgKCEobWV0YS0+ZmxhZ3MgJiBDTURfQVNZTkMpKSB7CisJCWNsZWFyX2JpdChTX0hDTURfQUNUSVZFLCAmaWwtPnN0YXR1cyk7CisJCURfSU5GTygiQ2xlYXJpbmcgSENNRF9BQ1RJVkUgZm9yIGNvbW1hbmQgJXNcbiIsCisJCSAgICAgICBpbF9nZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpKTsKKwkJd2FrZV91cCgmaWwtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisJfQorCisJLyogTWFyayBhcyB1bm1hcHBlZCAqLworCW1ldGEtPmZsYWdzID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5oY21kX2xvY2ssIGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfdHhfY21kX2NvbXBsZXRlKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJpd2wtbGVnYWN5OiBjb21tb24gZnVuY3Rpb25zIGZvciAzOTQ1IGFuZCA0OTY1Iik7CitNT0RVTEVfVkVSU0lPTihJV0xXSUZJX1ZFUlNJT04pOworTU9EVUxFX0FVVEhPUihEUlZfQ09QWVJJR0hUICIgIiBEUlZfQVVUSE9SKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworLyoKKyAqIHNldCBidF9jb2V4X2FjdGl2ZSB0byB0cnVlLCB1Q29kZSB3aWxsIGRvIGtpbGwvZGVmZXIKKyAqIGV2ZXJ5IHRpbWUgdGhlIHByaW9yaXR5IGxpbmUgaXMgYXNzZXJ0ZWQgKEJUIGlzIHNlbmRpbmcgc2lnbmFscyBvbiB0aGUKKyAqIHByaW9yaXR5IGxpbmUgaW4gdGhlIFBDSXgpLgorICogc2V0IGJ0X2NvZXhfYWN0aXZlIHRvIGZhbHNlLCB1Q29kZSB3aWxsIGlnbm9yZSB0aGUgQlQgYWN0aXZpdHkgYW5kCisgKiBwZXJmb3JtIHRoZSBub3JtYWwgb3BlcmF0aW9uCisgKgorICogVXNlciBtaWdodCBleHBlcmllbmNlIHRyYW5zbWl0IGlzc3VlIG9uIHNvbWUgcGxhdGZvcm0gZHVlIHRvIFdpRmkvQlQKKyAqIGNvLWV4aXN0IHByb2JsZW0uIFRoZSBwb3NzaWJsZSBiZWhhdmlvcnMgYXJlOgorICogICBBYmxlIHRvIHNjYW4gYW5kIGZpbmRpbmcgYWxsIHRoZSBhdmFpbGFibGUgQVAKKyAqICAgTm90IGFibGUgdG8gYXNzb2NpYXRlIHdpdGggYW55IEFQCisgKiBPbiB0aG9zZSBwbGF0Zm9ybXMsIFdpRmkgY29tbXVuaWNhdGlvbiBjYW4gYmUgcmVzdG9yZWQgYnkgc2V0CisgKiAiYnRfY29leF9hY3RpdmUiIG1vZHVsZSBwYXJhbWV0ZXIgdG8gImZhbHNlIgorICoKKyAqIGRlZmF1bHQ6IGJ0X2NvZXhfYWN0aXZlID0gdHJ1ZSAoQlRfQ09FWF9FTkFCTEUpCisgKi8KK3N0YXRpYyBib29sIGJ0X2NvZXhfYWN0aXZlID0gdHJ1ZTsKK21vZHVsZV9wYXJhbShidF9jb2V4X2FjdGl2ZSwgYm9vbCwgU19JUlVHTyk7CitNT0RVTEVfUEFSTV9ERVNDKGJ0X2NvZXhfYWN0aXZlLCAiZW5hYmxlIHdpZmkvYmx1ZXRvb3RoIGNvLWV4aXN0Iik7CisKK3UzMiBpbF9kZWJ1Z19sZXZlbDsKK0VYUE9SVF9TWU1CT0woaWxfZGVidWdfbGV2ZWwpOworCitjb25zdCB1OCBpbF9iY2FzdF9hZGRyW0VUSF9BTEVOXSA9IHsgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiB9OworRVhQT1JUX1NZTUJPTChpbF9iY2FzdF9hZGRyKTsKKworLyogVGhpcyBmdW5jdGlvbiBib3RoIGFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgaHcgYW5kIGlsLiAqLworc3RydWN0IGllZWU4MDIxMV9odyAqCitpbF9hbGxvY19hbGwoc3RydWN0IGlsX2NmZyAqY2ZnKQoreworCXN0cnVjdCBpbF9wcml2ICppbDsKKwkvKiBtYWM4MDIxMSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGlzIGRldmljZSBpbnN0YW5jZSwgaW5jbHVkaW5nCisJICogICBzcGFjZSBmb3IgdGhpcyBkcml2ZXIncyBpbGF0ZSBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKKworCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZihzdHJ1Y3QgaWxfcHJpdiksCisJCQkJY2ZnLT5vcHMtPmllZWU4MDIxMV9vcHMpOworCWlmIChodyA9PSBOVUxMKSB7CisJCXByX2VycigiJXM6IENhbiBub3QgYWxsb2NhdGUgbmV0d29yayBkZXZpY2VcbiIsIGNmZy0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWlsID0gaHctPnByaXY7CisJaWwtPmh3ID0gaHc7CisKK291dDoKKwlyZXR1cm4gaHc7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2FsbG9jX2FsbCk7CisKKyNkZWZpbmUgTUFYX0JJVF9SQVRFXzQwX01IWiAxNTAJLyogTWJwcyAqLworI2RlZmluZSBNQVhfQklUX1JBVEVfMjBfTUhaIDcyCS8qIE1icHMgKi8KK3N0YXRpYyB2b2lkCitpbF9pbml0X2h0X2h3X2NhcGFiKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwKKwkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfaW5mbywKKwkJICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwl1MTYgbWF4X2JpdF9yYXRlID0gMDsKKwl1OCByeF9jaGFpbnNfbnVtID0gaWwtPmh3X3BhcmFtcy5yeF9jaGFpbnNfbnVtOworCXU4IHR4X2NoYWluc19udW0gPSBpbC0+aHdfcGFyYW1zLnR4X2NoYWluc19udW07CisKKwlodF9pbmZvLT5jYXAgPSAwOworCW1lbXNldCgmaHRfaW5mby0+bWNzLCAwLCBzaXplb2YoaHRfaW5mby0+bWNzKSk7CisKKwlodF9pbmZvLT5odF9zdXBwb3J0ZWQgPSB0cnVlOworCisJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOworCW1heF9iaXRfcmF0ZSA9IE1BWF9CSVRfUkFURV8yMF9NSFo7CisJaWYgKGlsLT5od19wYXJhbXMuaHQ0MF9jaGFubmVsICYgQklUKGJhbmQpKSB7CisJCWh0X2luZm8tPmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MDsKKwkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwOworCQlodF9pbmZvLT5tY3MucnhfbWFza1s0XSA9IDB4MDE7CisJCW1heF9iaXRfcmF0ZSA9IE1BWF9CSVRfUkFURV80MF9NSFo7CisJfQorCisJaWYgKGlsLT5jZmctPm1vZF9wYXJhbXMtPmFtc2R1X3NpemVfOEspCisJCWh0X2luZm8tPmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX01BWF9BTVNEVTsKKworCWh0X2luZm8tPmFtcGR1X2ZhY3RvciA9IENGR19IVF9SWF9BTVBEVV9GQUNUT1JfREVGOworCWh0X2luZm8tPmFtcGR1X2RlbnNpdHkgPSBDRkdfSFRfTVBEVV9ERU5TSVRZX0RFRjsKKworCWh0X2luZm8tPm1jcy5yeF9tYXNrWzBdID0gMHhGRjsKKwlpZiAocnhfY2hhaW5zX251bSA+PSAyKQorCQlodF9pbmZvLT5tY3MucnhfbWFza1sxXSA9IDB4RkY7CisJaWYgKHJ4X2NoYWluc19udW0gPj0gMykKKwkJaHRfaW5mby0+bWNzLnJ4X21hc2tbMl0gPSAweEZGOworCisJLyogSGlnaGVzdCBzdXBwb3J0ZWQgUnggZGF0YSByYXRlICovCisJbWF4X2JpdF9yYXRlICo9IHJ4X2NoYWluc19udW07CisJV0FSTl9PTihtYXhfYml0X3JhdGUgJiB+SUVFRTgwMjExX0hUX01DU19SWF9ISUdIRVNUX01BU0spOworCWh0X2luZm8tPm1jcy5yeF9oaWdoZXN0ID0gY3B1X3RvX2xlMTYobWF4X2JpdF9yYXRlKTsKKworCS8qIFR4IE1DUyBjYXBhYmlsaXRpZXMgKi8KKwlodF9pbmZvLT5tY3MudHhfcGFyYW1zID0gSUVFRTgwMjExX0hUX01DU19UWF9ERUZJTkVEOworCWlmICh0eF9jaGFpbnNfbnVtICE9IHJ4X2NoYWluc19udW0pIHsKKwkJaHRfaW5mby0+bWNzLnR4X3BhcmFtcyB8PSBJRUVFODAyMTFfSFRfTUNTX1RYX1JYX0RJRkY7CisJCWh0X2luZm8tPm1jcy50eF9wYXJhbXMgfD0KKwkJICAgICgodHhfY2hhaW5zX251bSAtCisJCSAgICAgIDEpIDw8IElFRUU4MDIxMV9IVF9NQ1NfVFhfTUFYX1NUUkVBTVNfU0hJRlQpOworCX0KK30KKworLyoqCisgKiBpbF9pbml0X2dlb3MgLSBJbml0aWFsaXplIG1hYzgwMjExJ3MgZ2VvL2NoYW5uZWwgaW5mbyBiYXNlZCBmcm9tIGVlcHJvbQorICovCitpbnQKK2lsX2luaXRfZ2VvcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2g7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmdlb19jaDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKnJhdGVzOworCWludCBpID0gMDsKKwlzOCBtYXhfdHhfcG93ZXIgPSAwOworCisJaWYgKGlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2JpdHJhdGVzIHx8CisJICAgIGlsLT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2JpdHJhdGVzKSB7CisJCURfSU5GTygiR2VvZ3JhcGh5IG1vZGVzIGFscmVhZHkgaW5pdGlhbGl6ZWQuXG4iKTsKKwkJc2V0X2JpdChTX0dFT19DT05GSUdVUkVELCAmaWwtPnN0YXR1cyk7CisJCXJldHVybiAwOworCX0KKworCWNoYW5uZWxzID0KKwkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9jaGFubmVsKSAqIGlsLT5jaGFubmVsX2NvdW50LAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGFubmVscykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYXRlcyA9CisJICAgIGt6YWxsb2MoKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3JhdGUpICogUkFURV9DT1VOVF9MRUdBQ1kpLAorCQkgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFyYXRlcykgeworCQlrZnJlZShjaGFubmVscyk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIDUuMkdIeiBjaGFubmVscyBzdGFydCBhZnRlciB0aGUgMi40R0h6IGNoYW5uZWxzICovCisJc2JhbmQgPSAmaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOworCXNiYW5kLT5jaGFubmVscyA9ICZjaGFubmVsc1tBUlJBWV9TSVpFKGlsX2VlcHJvbV9iYW5kXzEpXTsKKwkvKiBqdXN0IE9GRE0gKi8KKwlzYmFuZC0+Yml0cmF0ZXMgPSAmcmF0ZXNbSUxfRklSU1RfT0ZETV9SQVRFXTsKKwlzYmFuZC0+bl9iaXRyYXRlcyA9IFJBVEVfQ09VTlRfTEVHQUNZIC0gSUxfRklSU1RfT0ZETV9SQVRFOworCisJaWYgKGlsLT5jZmctPnNrdSAmIElMX1NLVV9OKQorCQlpbF9pbml0X2h0X2h3X2NhcGFiKGlsLCAmc2JhbmQtPmh0X2NhcCwgSUVFRTgwMjExX0JBTkRfNUdIWik7CisKKwlzYmFuZCA9ICZpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07CisJc2JhbmQtPmNoYW5uZWxzID0gY2hhbm5lbHM7CisJLyogT0ZETSAmIENDSyAqLworCXNiYW5kLT5iaXRyYXRlcyA9IHJhdGVzOworCXNiYW5kLT5uX2JpdHJhdGVzID0gUkFURV9DT1VOVF9MRUdBQ1k7CisKKwlpZiAoaWwtPmNmZy0+c2t1ICYgSUxfU0tVX04pCisJCWlsX2luaXRfaHRfaHdfY2FwYWIoaWwsICZzYmFuZC0+aHRfY2FwLCBJRUVFODAyMTFfQkFORF8yR0haKTsKKworCWlsLT5pZWVlX2NoYW5uZWxzID0gY2hhbm5lbHM7CisJaWwtPmllZWVfcmF0ZXMgPSByYXRlczsKKworCWZvciAoaSA9IDA7IGkgPCBpbC0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7CisJCWNoID0gJmlsLT5jaGFubmVsX2luZm9baV07CisKKwkJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoKSkKKwkJCWNvbnRpbnVlOworCisJCXNiYW5kID0gJmlsLT5iYW5kc1tjaC0+YmFuZF07CisKKwkJZ2VvX2NoID0gJnNiYW5kLT5jaGFubmVsc1tzYmFuZC0+bl9jaGFubmVscysrXTsKKworCQlnZW9fY2gtPmNlbnRlcl9mcmVxID0KKwkJICAgIGllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaC0+Y2hhbm5lbCwgY2gtPmJhbmQpOworCQlnZW9fY2gtPm1heF9wb3dlciA9IGNoLT5tYXhfcG93ZXJfYXZnOworCQlnZW9fY2gtPm1heF9hbnRlbm5hX2dhaW4gPSAweGZmOworCQlnZW9fY2gtPmh3X3ZhbHVlID0gY2gtPmNoYW5uZWw7CisKKwkJaWYgKGlsX2lzX2NoYW5uZWxfdmFsaWQoY2gpKSB7CisJCQlpZiAoIShjaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9JQlNTKSkKKwkJCQlnZW9fY2gtPmZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX05PX0lCU1M7CisKKwkJCWlmICghKGNoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX0FDVElWRSkpCisJCQkJZ2VvX2NoLT5mbGFncyB8PSBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU47CisKKwkJCWlmIChjaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9SQURBUikKKwkJCQlnZW9fY2gtPmZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX1JBREFSOworCisJCQlnZW9fY2gtPmZsYWdzIHw9IGNoLT5odDQwX2V4dGVuc2lvbl9jaGFubmVsOworCisJCQlpZiAoY2gtPm1heF9wb3dlcl9hdmcgPiBtYXhfdHhfcG93ZXIpCisJCQkJbWF4X3R4X3Bvd2VyID0gY2gtPm1heF9wb3dlcl9hdmc7CisJCX0gZWxzZSB7CisJCQlnZW9fY2gtPmZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEOworCQl9CisKKwkJRF9JTkZPKCJDaGFubmVsICVkIEZyZXE9JWRbJXNHSHpdICVzIGZsYWc9MHglWFxuIiwgY2gtPmNoYW5uZWwsCisJCSAgICAgICBnZW9fY2gtPmNlbnRlcl9mcmVxLAorCQkgICAgICAgaWxfaXNfY2hhbm5lbF9hX2JhbmQoY2gpID8gIjUuMiIgOiAiMi40IiwKKwkJICAgICAgIGdlb19jaC0+CisJCSAgICAgICBmbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEID8gInJlc3RyaWN0ZWQiIDogInZhbGlkIiwKKwkJICAgICAgIGdlb19jaC0+ZmxhZ3MpOworCX0KKworCWlsLT50eF9wb3dlcl9kZXZpY2VfbG10ID0gbWF4X3R4X3Bvd2VyOworCWlsLT50eF9wb3dlcl91c2VyX2xtdCA9IG1heF90eF9wb3dlcjsKKwlpbC0+dHhfcG93ZXJfbmV4dCA9IG1heF90eF9wb3dlcjsKKworCWlmIChpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscyA9PSAwICYmCisJICAgIChpbC0+Y2ZnLT5za3UgJiBJTF9TS1VfQSkpIHsKKwkJSUxfSU5GTygiSW5jb3JyZWN0bHkgZGV0ZWN0ZWQgQkcgY2FyZCBhcyBBQkcuICIKKwkJCSJQbGVhc2Ugc2VuZCB5b3VyIFBDSSBJRCAweCUwNFg6MHglMDRYIHRvIG1haW50YWluZXIuXG4iLAorCQkJaWwtPnBjaV9kZXYtPmRldmljZSwgaWwtPnBjaV9kZXYtPnN1YnN5c3RlbV9kZXZpY2UpOworCQlpbC0+Y2ZnLT5za3UgJj0gfklMX1NLVV9BOworCX0KKworCUlMX0lORk8oIlR1bmFibGUgY2hhbm5lbHM6ICVkIDgwMi4xMWJnLCAlZCA4MDIuMTFhIGNoYW5uZWxzXG4iLAorCQlpbC0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0ubl9jaGFubmVscywKKwkJaWwtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fY2hhbm5lbHMpOworCisJc2V0X2JpdChTX0dFT19DT05GSUdVUkVELCAmaWwtPnN0YXR1cyk7CisKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfaW5pdF9nZW9zKTsKKworLyoKKyAqIGlsX2ZyZWVfZ2VvcyAtIHVuZG8gYWxsb2NhdGlvbnMgaW4gaWxfaW5pdF9nZW9zCisgKi8KK3ZvaWQKK2lsX2ZyZWVfZ2VvcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJa2ZyZWUoaWwtPmllZWVfY2hhbm5lbHMpOworCWtmcmVlKGlsLT5pZWVlX3JhdGVzKTsKKwljbGVhcl9iaXQoU19HRU9fQ09ORklHVVJFRCwgJmlsLT5zdGF0dXMpOworfQorRVhQT1JUX1NZTUJPTChpbF9mcmVlX2dlb3MpOworCitzdGF0aWMgYm9vbAoraWxfaXNfY2hhbm5lbF9leHRlbnNpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCQl1MTYgY2hhbm5lbCwgdTggZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0KQoreworCWNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm87CisKKwljaF9pbmZvID0gaWxfZ2V0X2NoYW5uZWxfaW5mbyhpbCwgYmFuZCwgY2hhbm5lbCk7CisJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID09IElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFKQorCQlyZXR1cm4gIShjaF9pbmZvLT4KKwkJCSBodDQwX2V4dGVuc2lvbl9jaGFubmVsICYgSUVFRTgwMjExX0NIQU5fTk9fSFQ0MFBMVVMpOworCWVsc2UgaWYgKGV4dGVuc2lvbl9jaGFuX29mZnNldCA9PSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVykKKwkJcmV0dXJuICEoY2hfaW5mby0+CisJCQkgaHQ0MF9leHRlbnNpb25fY2hhbm5lbCAmIElFRUU4MDIxMV9DSEFOX05PX0hUNDBNSU5VUyk7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wKK2lsX2lzX2h0NDBfdHhfYWxsb3dlZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXApCit7CisJaWYgKCFjdHgtPmh0LmVuYWJsZWQgfHwgIWN0eC0+aHQuaXNfNDBtaHopCisJCXJldHVybiBmYWxzZTsKKworCS8qCisJICogV2UgZG8gbm90IGNoZWNrIGZvciBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MAorCSAqIHRoZSBiaXQgd2lsbCBub3Qgc2V0IGlmIGl0IGlzIHB1cmUgNDBNSHogY2FzZQorCSAqLworCWlmIChodF9jYXAgJiYgIWh0X2NhcC0+aHRfc3VwcG9ydGVkKQorCQlyZXR1cm4gZmFsc2U7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworCWlmIChpbC0+ZGlzYWJsZV9odDQwKQorCQlyZXR1cm4gZmFsc2U7CisjZW5kaWYKKworCXJldHVybiBpbF9pc19jaGFubmVsX2V4dGVuc2lvbihpbCwgaWwtPmJhbmQsCisJCQkJICAgICAgIGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSwKKwkJCQkgICAgICAgY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQpOworfQorRVhQT1JUX1NZTUJPTChpbF9pc19odDQwX3R4X2FsbG93ZWQpOworCitzdGF0aWMgdTE2CitpbF9hZGp1c3RfYmVhY29uX2ludGVydmFsKHUxNiBiZWFjb25fdmFsLCB1MTYgbWF4X2JlYWNvbl92YWwpCit7CisJdTE2IG5ld192YWw7CisJdTE2IGJlYWNvbl9mYWN0b3I7CisKKwkvKgorCSAqIElmIG1hYzgwMjExIGhhc24ndCBnaXZlbiB1cyBhIGJlYWNvbiBpbnRlcnZhbCwgcHJvZ3JhbQorCSAqIHRoZSBkZWZhdWx0IGludG8gdGhlIGRldmljZS4KKwkgKi8KKwlpZiAoIWJlYWNvbl92YWwpCisJCXJldHVybiBERUZBVUxUX0JFQUNPTl9JTlRFUlZBTDsKKworCS8qCisJICogSWYgdGhlIGJlYWNvbiBpbnRlcnZhbCB3ZSBvYnRhaW5lZCBmcm9tIHRoZSBwZWVyCisJICogaXMgdG9vIGxhcmdlLCB3ZSdsbCBoYXZlIHRvIHdha2UgdXAgbW9yZSBvZnRlbgorCSAqIChhbmQgaW4gSUJTUyBjYXNlLCB3ZSdsbCBiZWFjb24gdG9vIG11Y2gpCisJICoKKwkgKiBGb3IgZXhhbXBsZSwgaWYgbWF4X2JlYWNvbl92YWwgaXMgNDA5NiwgYW5kIHRoZQorCSAqIHJlcXVlc3RlZCBiZWFjb24gaW50ZXJ2YWwgaXMgNzAwMCwgd2UnbGwgaGF2ZSB0bworCSAqIHVzZSAzNTAwIHRvIGJlIGFibGUgdG8gd2FrZSB1cCBvbiB0aGUgYmVhY29ucy4KKwkgKgorCSAqIFRoaXMgY291bGQgYmFkbHkgaW5mbHVlbmNlIGJlYWNvbiBkZXRlY3Rpb24gc3RhdHMuCisJICovCisKKwliZWFjb25fZmFjdG9yID0gKGJlYWNvbl92YWwgKyBtYXhfYmVhY29uX3ZhbCkgLyBtYXhfYmVhY29uX3ZhbDsKKwluZXdfdmFsID0gYmVhY29uX3ZhbCAvIGJlYWNvbl9mYWN0b3I7CisKKwlpZiAoIW5ld192YWwpCisJCW5ld192YWwgPSBtYXhfYmVhY29uX3ZhbDsKKworCXJldHVybiBuZXdfdmFsOworfQorCitpbnQKK2lsX3NlbmRfcnhvbl90aW1pbmcoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJdTY0IHRzZjsKKwlzMzIgaW50ZXJ2YWxfdG0sIHJlbTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSBOVUxMOworCXUxNiBiZWFjb25faW50OworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKKworCWNvbmYgPSAmaWwtPmh3LT5jb25mOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCW1lbXNldCgmY3R4LT50aW1pbmcsIDAsIHNpemVvZihzdHJ1Y3QgaWxfcnhvbl90aW1lX2NtZCkpOworCisJY3R4LT50aW1pbmcudGltZXN0YW1wID0gY3B1X3RvX2xlNjQoaWwtPnRpbWVzdGFtcCk7CisJY3R4LT50aW1pbmcubGlzdGVuX2ludGVydmFsID0gY3B1X3RvX2xlMTYoY29uZi0+bGlzdGVuX2ludGVydmFsKTsKKworCWJlYWNvbl9pbnQgPSB2aWYgPyB2aWYtPmJzc19jb25mLmJlYWNvbl9pbnQgOiAwOworCisJLyoKKwkgKiBUT0RPOiBGb3IgSUJTUyB3ZSBuZWVkIHRvIGdldCBhdGltX3dpbiBmcm9tIG1hYzgwMjExLAorCSAqICAgICAgIGZvciBub3cganVzdCBhbHdheXMgdXNlIDAKKwkgKi8KKwljdHgtPnRpbWluZy5hdGltX3dpbiA9IDA7CisKKwliZWFjb25faW50ID0KKwkgICAgaWxfYWRqdXN0X2JlYWNvbl9pbnRlcnZhbChiZWFjb25faW50LAorCQkJCSAgICAgIGlsLT5od19wYXJhbXMubWF4X2JlYWNvbl9pdHJ2bCAqCisJCQkJICAgICAgVElNRV9VTklUKTsKKwljdHgtPnRpbWluZy5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihiZWFjb25faW50KTsKKworCXRzZiA9IGlsLT50aW1lc3RhbXA7CS8qIHRzZiBpcyBtb2RpZmVkIGJ5IGRvX2RpdjogY29weSBpdCAqLworCWludGVydmFsX3RtID0gYmVhY29uX2ludCAqIFRJTUVfVU5JVDsKKwlyZW0gPSBkb19kaXYodHNmLCBpbnRlcnZhbF90bSk7CisJY3R4LT50aW1pbmcuYmVhY29uX2luaXRfdmFsID0gY3B1X3RvX2xlMzIoaW50ZXJ2YWxfdG0gLSByZW0pOworCisJY3R4LT50aW1pbmcuZHRpbV9wZXJpb2QgPSB2aWYgPyAodmlmLT5ic3NfY29uZi5kdGltX3BlcmlvZCA/IDogMSkgOiAxOworCisJRF9BU1NPQygiYmVhY29uIGludGVydmFsICVkIGJlYWNvbiB0aW1lciAlZCBiZWFjb24gdGltICVkXG4iLAorCQlsZTE2X3RvX2NwdShjdHgtPnRpbWluZy5iZWFjb25faW50ZXJ2YWwpLAorCQlsZTMyX3RvX2NwdShjdHgtPnRpbWluZy5iZWFjb25faW5pdF92YWwpLAorCQlsZTE2X3RvX2NwdShjdHgtPnRpbWluZy5hdGltX3dpbikpOworCisJcmV0dXJuIGlsX3NlbmRfY21kX3BkdShpbCwgY3R4LT5yeG9uX3RpbWluZ19jbWQsIHNpemVvZihjdHgtPnRpbWluZyksCisJCQkgICAgICAgJmN0eC0+dGltaW5nKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9yeG9uX3RpbWluZyk7CisKK3ZvaWQKK2lsX3NldF9yeG9uX2h3Y3J5cHRvKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkgICAgIGludCBod19kZWNyeXB0KQoreworCXN0cnVjdCBpbF9yeG9uX2NtZCAqcnhvbiA9ICZjdHgtPnN0YWdpbmc7CisKKwlpZiAoaHdfZGVjcnlwdCkKKwkJcnhvbi0+ZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9ESVNfREVDUllQVF9NU0s7CisJZWxzZQorCQlyeG9uLT5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfRElTX0RFQ1JZUFRfTVNLOworCit9CitFWFBPUlRfU1lNQk9MKGlsX3NldF9yeG9uX2h3Y3J5cHRvKTsKKworLyogdmFsaWRhdGUgUlhPTiBzdHJ1Y3R1cmUgaXMgdmFsaWQgKi8KK2ludAoraWxfY2hlY2tfcnhvbl9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGlsX3J4b25fY21kICpyeG9uID0gJmN0eC0+c3RhZ2luZzsKKwlib29sIGVycm9yID0gZmFsc2U7CisKKwlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spIHsKKwkJaWYgKHJ4b24tPmZsYWdzICYgUlhPTl9GTEdfVEdKX05BUlJPV19CQU5EX01TSykgeworCQkJSUxfV0FSTigiY2hlY2sgMi40Rzogd3JvbmcgbmFycm93XG4iKTsKKwkJCWVycm9yID0gdHJ1ZTsKKwkJfQorCQlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19SQURBUl9ERVRFQ1RfTVNLKSB7CisJCQlJTF9XQVJOKCJjaGVjayAyLjRHOiB3cm9uZyByYWRhclxuIik7CisJCQllcnJvciA9IHRydWU7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIShyeG9uLT5mbGFncyAmIFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLKSkgeworCQkJSUxfV0FSTigiY2hlY2sgNS4yRzogbm90IHNob3J0IHNsb3QhXG4iKTsKKwkJCWVycm9yID0gdHJ1ZTsKKwkJfQorCQlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19DQ0tfTVNLKSB7CisJCQlJTF9XQVJOKCJjaGVjayA1LjJHOiBDQ0shXG4iKTsKKwkJCWVycm9yID0gdHJ1ZTsKKwkJfQorCX0KKwlpZiAoKHJ4b24tPm5vZGVfYWRkclswXSB8IHJ4b24tPmJzc2lkX2FkZHJbMF0pICYgMHgxKSB7CisJCUlMX1dBUk4oIm1hYy9ic3NpZCBtY2FzdCFcbiIpOworCQllcnJvciA9IHRydWU7CisJfQorCisJLyogbWFrZSBzdXJlIGJhc2ljIHJhdGVzIDZNYnBzIGFuZCAxTWJwcyBhcmUgc3VwcG9ydGVkICovCisJaWYgKChyeG9uLT5vZmRtX2Jhc2ljX3JhdGVzICYgUkFURV82TV9NQVNLKSA9PSAwICYmCisJICAgIChyeG9uLT5jY2tfYmFzaWNfcmF0ZXMgJiBSQVRFXzFNX01BU0spID09IDApIHsKKwkJSUxfV0FSTigibmVpdGhlciAxIG5vciA2IGFyZSBiYXNpY1xuIik7CisJCWVycm9yID0gdHJ1ZTsKKwl9CisKKwlpZiAobGUxNl90b19jcHUocnhvbi0+YXNzb2NfaWQpID4gMjAwNykgeworCQlJTF9XQVJOKCJhaWQgPiAyMDA3XG4iKTsKKwkJZXJyb3IgPSB0cnVlOworCX0KKworCWlmICgocnhvbi0+ZmxhZ3MgJiAoUlhPTl9GTEdfQ0NLX01TSyB8IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLKSkgPT0KKwkgICAgKFJYT05fRkxHX0NDS19NU0sgfCBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSykpIHsKKwkJSUxfV0FSTigiQ0NLIGFuZCBzaG9ydCBzbG90XG4iKTsKKwkJZXJyb3IgPSB0cnVlOworCX0KKworCWlmICgocnhvbi0+ZmxhZ3MgJiAoUlhPTl9GTEdfQ0NLX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSykpID09CisJICAgIChSWE9OX0ZMR19DQ0tfTVNLIHwgUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLKSkgeworCQlJTF9XQVJOKCJDQ0sgYW5kIGF1dG8gZGV0ZWN0Iik7CisJCWVycm9yID0gdHJ1ZTsKKwl9CisKKwlpZiAoKHJ4b24tPgorCSAgICAgZmxhZ3MgJiAoUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLIHwgUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLKSkgPT0KKwkgICAgUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLKSB7CisJCUlMX1dBUk4oIlRHZyBidXQgbm8gYXV0by1kZXRlY3RcbiIpOworCQllcnJvciA9IHRydWU7CisJfQorCisJaWYgKGVycm9yKQorCQlJTF9XQVJOKCJUdW5pbmcgdG8gY2hhbm5lbCAlZFxuIiwgbGUxNl90b19jcHUocnhvbi0+Y2hhbm5lbCkpOworCisJaWYgKGVycm9yKSB7CisJCUlMX0VSUigiSW52YWxpZCBSWE9OXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbF9jaGVja19yeG9uX2NtZCk7CisKKy8qKgorICogaWxfZnVsbF9yeG9uX3JlcXVpcmVkIC0gY2hlY2sgaWYgZnVsbCBSWE9OICh2cyBSWE9OX0FTU09DKSBjbWQgaXMgbmVlZGVkCisgKiBAaWw6IHN0YWdpbmdfcnhvbiBpcyBjb21wYXJlZCB0byBhY3RpdmVfcnhvbgorICoKKyAqIElmIHRoZSBSWE9OIHN0cnVjdHVyZSBpcyBjaGFuZ2luZyBlbm91Z2ggdG8gcmVxdWlyZSBhIG5ldyB0dW5lLAorICogb3IgaXMgY2xlYXJpbmcgdGhlIFJYT05fRklMVEVSX0FTU09DX01TSywgdGhlbiByZXR1cm4gMSB0byBpbmRpY2F0ZSB0aGF0CisgKiBhIG5ldyB0dW5lIChmdWxsIFJYT04gY29tbWFuZCwgcmF0aGVyIHRoYW4gUlhPTl9BU1NPQyBjbWQpIGlzIHJlcXVpcmVkLgorICovCitpbnQKK2lsX2Z1bGxfcnhvbl9yZXF1aXJlZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwljb25zdCBzdHJ1Y3QgaWxfcnhvbl9jbWQgKnN0YWdpbmcgPSAmY3R4LT5zdGFnaW5nOworCWNvbnN0IHN0cnVjdCBpbF9yeG9uX2NtZCAqYWN0aXZlID0gJmN0eC0+YWN0aXZlOworCisjZGVmaW5lIENISyhjb25kKQkJCQkJCQlcCisJaWYgKChjb25kKSkgewkJCQkJCQlcCisJCURfSU5GTygibmVlZCBmdWxsIFJYT04gLSAiICNjb25kICJcbiIpOwlcCisJCXJldHVybiAxOwkJCQkJCVwKKwl9CisKKyNkZWZpbmUgQ0hLX05FUShjMSwgYzIpCQkJCQkJXAorCWlmICgoYzEpICE9IChjMikpIHsJCQkJCVwKKwkJRF9JTkZPKCJuZWVkIGZ1bGwgUlhPTiAtICIJXAorCQkJICAgICAgICNjMSAiICE9ICIgI2MyICIgLSAlZCAhPSAlZFxuIiwJXAorCQkJICAgICAgIChjMSksIChjMikpOwkJCVwKKwkJcmV0dXJuIDE7CQkJCQlcCisJfQorCisJLyogVGhlc2UgaXRlbXMgYXJlIG9ubHkgc2V0dGFibGUgZnJvbSB0aGUgZnVsbCBSWE9OIGNvbW1hbmQgKi8KKwlDSEsoIWlsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpOworCUNISyhjb21wYXJlX2V0aGVyX2FkZHIoc3RhZ2luZy0+YnNzaWRfYWRkciwgYWN0aXZlLT5ic3NpZF9hZGRyKSk7CisJQ0hLKGNvbXBhcmVfZXRoZXJfYWRkcihzdGFnaW5nLT5ub2RlX2FkZHIsIGFjdGl2ZS0+bm9kZV9hZGRyKSk7CisJQ0hLKGNvbXBhcmVfZXRoZXJfYWRkcgorCSAgICAoc3RhZ2luZy0+d2xhcF9ic3NpZF9hZGRyLCBhY3RpdmUtPndsYXBfYnNzaWRfYWRkcikpOworCUNIS19ORVEoc3RhZ2luZy0+ZGV2X3R5cGUsIGFjdGl2ZS0+ZGV2X3R5cGUpOworCUNIS19ORVEoc3RhZ2luZy0+Y2hhbm5lbCwgYWN0aXZlLT5jaGFubmVsKTsKKwlDSEtfTkVRKHN0YWdpbmctPmFpcl9wcm9wYWdhdGlvbiwgYWN0aXZlLT5haXJfcHJvcGFnYXRpb24pOworCUNIS19ORVEoc3RhZ2luZy0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzLAorCQlhY3RpdmUtPm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcyk7CisJQ0hLX05FUShzdGFnaW5nLT5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzLAorCQlhY3RpdmUtPm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMpOworCUNIS19ORVEoc3RhZ2luZy0+YXNzb2NfaWQsIGFjdGl2ZS0+YXNzb2NfaWQpOworCisJLyogZmxhZ3MsIGZpbHRlcl9mbGFncywgb2ZkbV9iYXNpY19yYXRlcywgYW5kIGNja19iYXNpY19yYXRlcyBjYW4KKwkgKiBiZSB1cGRhdGVkIHdpdGggdGhlIFJYT05fQVNTT0MgY29tbWFuZCAtLSBob3dldmVyIG9ubHkgc29tZQorCSAqIGZsYWcgdHJhbnNpdGlvbnMgYXJlIGFsbG93ZWQgdXNpbmcgUlhPTl9BU1NPQyAqLworCisJLyogQ2hlY2sgaWYgd2UgYXJlIG5vdCBzd2l0Y2hpbmcgYmFuZHMgKi8KKwlDSEtfTkVRKHN0YWdpbmctPmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLLAorCQlhY3RpdmUtPmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKTsKKworCS8qIENoZWNrIGlmIHdlIGFyZSBzd2l0Y2hpbmcgYXNzb2NpYXRpb24gdG9nZ2xlICovCisJQ0hLX05FUShzdGFnaW5nLT5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0ssCisJCWFjdGl2ZS0+ZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfQVNTT0NfTVNLKTsKKworI3VuZGVmIENISworI3VuZGVmIENIS19ORVEKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbF9mdWxsX3J4b25fcmVxdWlyZWQpOworCit1OAoraWxfZ2V0X2xvd2VzdF9wbGNwKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCS8qCisJICogQXNzaWduIHRoZSBsb3dlc3QgcmF0ZSAtLSBzaG91bGQgcmVhbGx5IGdldCB0aGlzIGZyb20KKwkgKiB0aGUgYmVhY29uIHNrYiBmcm9tIG1hYzgwMjExLgorCSAqLworCWlmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spCisJCXJldHVybiBSQVRFXzFNX1BMQ1A7CisJZWxzZQorCQlyZXR1cm4gUkFURV82TV9QTENQOworfQorRVhQT1JUX1NZTUJPTChpbF9nZXRfbG93ZXN0X3BsY3ApOworCitzdGF0aWMgdm9pZAorX2lsX3NldF9yeG9uX2h0KHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2h0X2NvbmZpZyAqaHRfY29uZiwKKwkJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBpbF9yeG9uX2NtZCAqcnhvbiA9ICZjdHgtPnN0YWdpbmc7CisKKwlpZiAoIWN0eC0+aHQuZW5hYmxlZCkgeworCQlyeG9uLT5mbGFncyAmPQorCQkgICAgfihSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLIHwKKwkJICAgICAgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0sgfCBSWE9OX0ZMR19IVDQwX1BST1RfTVNLCisJCSAgICAgIHwgUlhPTl9GTEdfSFRfUFJPVF9NU0spOworCQlyZXR1cm47CisJfQorCisJcnhvbi0+ZmxhZ3MgfD0KKwkgICAgY3B1X3RvX2xlMzIoY3R4LT5odC5wcm90ZWN0aW9uIDw8IFJYT05fRkxHX0hUX09QRVJBVElOR19NT0RFX1BPUyk7CisKKwkvKiBTZXQgdXAgY2hhbm5lbCBiYW5kd2lkdGg6CisJICogMjAgTUh6IG9ubHksIDIwLzQwIG1peGVkIG9yIHB1cmUgNDAgaWYgaHQ0MCBvayAqLworCS8qIGNsZWFyIHRoZSBIVCBjaGFubmVsIG1vZGUgYmVmb3JlIHNldCB0aGUgbW9kZSAqLworCXJ4b24tPmZsYWdzICY9CisJICAgIH4oUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01TSyB8IFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLKTsKKwlpZiAoaWxfaXNfaHQ0MF90eF9hbGxvd2VkKGlsLCBjdHgsIE5VTEwpKSB7CisJCS8qIHB1cmUgaHQ0MCAqLworCQlpZiAoY3R4LT5odC5wcm90ZWN0aW9uID09IElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fMjBNSFopIHsKKwkJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9QVVJFXzQwOworCQkJLyogTm90ZTogY29udHJvbCBjaGFubmVsIGlzIG9wcG9zaXRlIG9mIGV4dGVuc2lvbiBjaGFubmVsICovCisJCQlzd2l0Y2ggKGN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0KSB7CisJCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOgorCQkJCXJ4b24tPmZsYWdzICY9CisJCQkJICAgIH5SWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c6CisJCQkJcnhvbi0+ZmxhZ3MgfD0gUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0s7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBOb3RlOiBjb250cm9sIGNoYW5uZWwgaXMgb3Bwb3NpdGUgb2YgZXh0ZW5zaW9uIGNoYW5uZWwgKi8KKwkJCXN3aXRjaCAoY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQpIHsKKwkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU6CisJCQkJcnhvbi0+ZmxhZ3MgJj0KKwkJCQkgICAgfihSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSyk7CisJCQkJcnhvbi0+ZmxhZ3MgfD0gUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01JWEVEOworCQkJCWJyZWFrOworCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzoKKwkJCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSzsKKwkJCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTUlYRUQ7CisJCQkJYnJlYWs7CisJCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU6CisJCQlkZWZhdWx0OgorCQkJCS8qIGNoYW5uZWwgbG9jYXRpb24gb25seSB2YWxpZCBpZiBpbiBNaXhlZCBtb2RlICovCisJCQkJSUxfRVJSKCJpbnZhbGlkIGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldFxuIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTEVHQUNZOworCX0KKworCWlmIChpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQorCQlpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKGlsLCBjdHgpOworCisJRF9BU1NPQygicnhvbiBmbGFncyAweCVYIG9wZXJhdGlvbiBtb2RlIDoweCVYICIKKwkJImV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCAweCV4XG4iLCBsZTMyX3RvX2NwdShyeG9uLT5mbGFncyksCisJCWN0eC0+aHQucHJvdGVjdGlvbiwgY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQpOworfQorCit2b2lkCitpbF9zZXRfcnhvbl9odChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9odF9jb25maWcgKmh0X2NvbmYpCit7CisJX2lsX3NldF9yeG9uX2h0KGlsLCBodF9jb25mLCAmaWwtPmN0eCk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NldF9yeG9uX2h0KTsKKworLyogUmV0dXJuIHZhbGlkLCB1bnVzZWQsIGNoYW5uZWwgZm9yIGEgcGFzc2l2ZSBzY2FuIHRvIHJlc2V0IHRoZSBSRiAqLwordTgKK2lsX2dldF9zaW5nbGVfY2hhbm5lbF9udW1iZXIoc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCit7CisJY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKKwlpbnQgaTsKKwl1OCBjaGFubmVsID0gMDsKKwl1OCBtaW4sIG1heDsKKworCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKKwkJbWluID0gMTQ7CisJCW1heCA9IGlsLT5jaGFubmVsX2NvdW50OworCX0gZWxzZSB7CisJCW1pbiA9IDA7CisJCW1heCA9IDE0OworCX0KKworCWZvciAoaSA9IG1pbjsgaSA8IG1heDsgaSsrKSB7CisJCWNoYW5uZWwgPSBpbC0+Y2hhbm5lbF9pbmZvW2ldLmNoYW5uZWw7CisJCWlmIChjaGFubmVsID09IGxlMTZfdG9fY3B1KGlsLT5jdHguc3RhZ2luZy5jaGFubmVsKSkKKwkJCWNvbnRpbnVlOworCisJCWNoX2luZm8gPSBpbF9nZXRfY2hhbm5lbF9pbmZvKGlsLCBiYW5kLCBjaGFubmVsKTsKKwkJaWYgKGlsX2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY2hhbm5lbDsKK30KK0VYUE9SVF9TWU1CT0woaWxfZ2V0X3NpbmdsZV9jaGFubmVsX251bWJlcik7CisKKy8qKgorICogaWxfc2V0X3J4b25fY2hhbm5lbCAtIFNldCB0aGUgYmFuZCBhbmQgY2hhbm5lbCB2YWx1ZXMgaW4gc3RhZ2luZyBSWE9OCisgKiBAY2g6IHJlcXVlc3RlZCBjaGFubmVsIGFzIGEgcG9pbnRlciB0byBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKKworICogTk9URTogIERvZXMgbm90IGNvbW1pdCB0byB0aGUgaGFyZHdhcmU7IGl0IHNldHMgYXBwcm9wcmlhdGUgYml0IGZpZWxkcworICogaW4gdGhlIHN0YWdpbmcgUlhPTiBmbGFnIHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgY2gtPmJhbmQKKyAqLworaW50CitpbF9zZXRfcnhvbl9jaGFubmVsKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaCwKKwkJICAgIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQgPSBjaC0+YmFuZDsKKwl1MTYgY2hhbm5lbCA9IGNoLT5od192YWx1ZTsKKworCWlmIChsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCkgPT0gY2hhbm5lbCAmJiBpbC0+YmFuZCA9PSBiYW5kKQorCQlyZXR1cm4gMDsKKworCWN0eC0+c3RhZ2luZy5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7CisJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19CQU5EXzI0R19NU0s7CisJZWxzZQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfQkFORF8yNEdfTVNLOworCisJaWwtPmJhbmQgPSBiYW5kOworCisJRF9JTkZPKCJTdGFnaW5nIGNoYW5uZWwgc2V0IHRvICVkIFslZF1cbiIsIGNoYW5uZWwsIGJhbmQpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NldF9yeG9uX2NoYW5uZWwpOworCit2b2lkCitpbF9zZXRfZmxhZ3NfZm9yX2JhbmQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCSAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7CisJCWN0eC0+c3RhZ2luZy5mbGFncyAmPQorCQkgICAgfihSWE9OX0ZMR19CQU5EXzI0R19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0sgfAorCQkgICAgICBSWE9OX0ZMR19DQ0tfTVNLKTsKKwkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCX0gZWxzZSB7CisJCS8qIENvcGllZCBmcm9tIGlsX3Bvc3RfYXNzb2NpYXRlKCkgKi8KKwkJaWYgKHZpZiAmJiB2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9zbG90KQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCQllbHNlCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOworCisJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19CQU5EXzI0R19NU0s7CisJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0s7CisJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfQ0NLX01TSzsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NldF9mbGFnc19mb3JfYmFuZCk7CisKKy8qCisgKiBpbml0aWFsaXplIHJ4b24gc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMgZnJvbSBlZXByb20KKyAqLwordm9pZAoraWxfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCisJbWVtc2V0KCZjdHgtPnN0YWdpbmcsIDAsIHNpemVvZihjdHgtPnN0YWdpbmcpKTsKKworCWlmICghY3R4LT52aWYpIHsKKwkJY3R4LT5zdGFnaW5nLmRldl90eXBlID0gY3R4LT51bnVzZWRfZGV2dHlwZTsKKwl9IGVsc2UKKwkJc3dpdGNoIChjdHgtPnZpZi0+dHlwZSkgeworCisJCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJCWN0eC0+c3RhZ2luZy5kZXZfdHlwZSA9IGN0eC0+c3RhdGlvbl9kZXZ0eXBlOworCQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyA9IFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLOworCQkJYnJlYWs7CisKKwkJY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKKwkJCWN0eC0+c3RhZ2luZy5kZXZfdHlwZSA9IGN0eC0+aWJzc19kZXZ0eXBlOworCQkJY3R4LT5zdGFnaW5nLmZsYWdzID0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyA9CisJCQkgICAgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0sgfAorCQkJICAgIFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCUlMX0VSUigiVW5zdXBwb3J0ZWQgaW50ZXJmYWNlIHR5cGUgJWRcbiIsCisJCQkgICAgICAgY3R4LT52aWYtPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKworI2lmIDAKKwkvKiBUT0RPOiAgRmlndXJlIG91dCB3aGVuIHNob3J0X3ByZWFtYmxlIHdvdWxkIGJlIHNldCBhbmQgY2FjaGUgZnJvbQorCSAqIHRoYXQgKi8KKwlpZiAoIWh3X3RvX2xvY2FsKGlsLT5odyktPnNob3J0X3ByZWFtYmxlKQorCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKKwllbHNlCisJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisjZW5kaWYKKworCWNoX2luZm8gPQorCSAgICBpbF9nZXRfY2hhbm5lbF9pbmZvKGlsLCBpbC0+YmFuZCwgbGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCkpOworCisJaWYgKCFjaF9pbmZvKQorCQljaF9pbmZvID0gJmlsLT5jaGFubmVsX2luZm9bMF07CisKKwljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoX2luZm8tPmNoYW5uZWwpOworCWlsLT5iYW5kID0gY2hfaW5mby0+YmFuZDsKKworCWlsX3NldF9mbGFnc19mb3JfYmFuZChpbCwgY3R4LCBpbC0+YmFuZCwgY3R4LT52aWYpOworCisJY3R4LT5zdGFnaW5nLm9mZG1fYmFzaWNfcmF0ZXMgPQorCSAgICAoSUxfT0ZETV9SQVRFU19NQVNLID4+IElMX0ZJUlNUX09GRE1fUkFURSkgJiAweEZGOworCWN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXMgPQorCSAgICAoSUxfQ0NLX1JBVEVTX01BU0sgPj4gSUxfRklSU1RfQ0NLX1JBVEUpICYgMHhGOworCisJLyogY2xlYXIgYm90aCBNSVggYW5kIFBVUkU0MCBtb2RlIGZsYWcgKi8KKwljdHgtPnN0YWdpbmcuZmxhZ3MgJj0KKwkgICAgfihSWE9OX0ZMR19DSEFOTkVMX01PREVfTUlYRUQgfCBSWE9OX0ZMR19DSEFOTkVMX01PREVfUFVSRV80MCk7CisJaWYgKGN0eC0+dmlmKQorCQltZW1jcHkoY3R4LT5zdGFnaW5nLm5vZGVfYWRkciwgY3R4LT52aWYtPmFkZHIsIEVUSF9BTEVOKTsKKworCWN0eC0+c3RhZ2luZy5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgPSAweGZmOworCWN0eC0+c3RhZ2luZy5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzID0gMHhmZjsKK30KK0VYUE9SVF9TWU1CT0woaWxfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyk7CisKK3ZvaWQKK2lsX3NldF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpodyA9IE5VTEw7CisJc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlOworCWludCBpOworCisJaHcgPSBpbF9nZXRfaHdfbW9kZShpbCwgaWwtPmJhbmQpOworCWlmICghaHcpIHsKKwkJSUxfRVJSKCJGYWlsZWQgdG8gc2V0IHJhdGU6IHVuYWJsZSB0byBnZXQgaHcgbW9kZVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbC0+YWN0aXZlX3JhdGUgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGh3LT5uX2JpdHJhdGVzOyBpKyspIHsKKwkJcmF0ZSA9ICYoaHctPmJpdHJhdGVzW2ldKTsKKwkJaWYgKHJhdGUtPmh3X3ZhbHVlIDwgUkFURV9DT1VOVF9MRUdBQ1kpCisJCQlpbC0+YWN0aXZlX3JhdGUgfD0gKDEgPDwgcmF0ZS0+aHdfdmFsdWUpOworCX0KKworCURfUkFURSgiU2V0IGFjdGl2ZV9yYXRlID0gJTB4XG4iLCBpbC0+YWN0aXZlX3JhdGUpOworCisJaWwtPmN0eC5zdGFnaW5nLmNja19iYXNpY19yYXRlcyA9CisJICAgIChJTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyA+PiBJTF9GSVJTVF9DQ0tfUkFURSkgJiAweEY7CisKKwlpbC0+Y3R4LnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9CisJICAgIChJTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgPj4gSUxfRklSU1RfT0ZETV9SQVRFKSAmIDB4RkY7Cit9CitFWFBPUlRfU1lNQk9MKGlsX3NldF9yYXRlKTsKKwordm9pZAoraWxfY2hzd2l0Y2hfZG9uZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgaXNfc3VjY2VzcykKK3sKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZShjdHgtPnZpZiwgaXNfc3VjY2Vzcyk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2Noc3dpdGNoX2RvbmUpOworCit2b2lkCitpbF9oZGxfY3NhKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX2NzYV9ub3RpZmljYXRpb24gKmNzYSA9ICYocGt0LT51LmNzYV9ub3RpZik7CisKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwlzdHJ1Y3QgaWxfcnhvbl9jbWQgKnJ4b24gPSAodm9pZCAqKSZjdHgtPmFjdGl2ZTsKKworCWlmICghdGVzdF9iaXQoU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCWlmICghbGUzMl90b19jcHUoY3NhLT5zdGF0dXMpICYmIGNzYS0+Y2hhbm5lbCA9PSBpbC0+c3dpdGNoX2NoYW5uZWwpIHsKKwkJcnhvbi0+Y2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKKwkJY3R4LT5zdGFnaW5nLmNoYW5uZWwgPSBjc2EtPmNoYW5uZWw7CisJCURfMTFIKCJDU0Egbm90aWY6IGNoYW5uZWwgJWRcbiIsIGxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOworCQlpbF9jaHN3aXRjaF9kb25lKGlsLCB0cnVlKTsKKwl9IGVsc2UgeworCQlJTF9FUlIoIkNTQSBub3RpZiAoZmFpbCkgOiBjaGFubmVsICVkXG4iLAorCQkgICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7CisJCWlsX2Noc3dpdGNoX2RvbmUoaWwsIGZhbHNlKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlsX2hkbF9jc2EpOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCit2b2lkCitpbF9wcmludF9yeF9jb25maWdfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBpbF9yeG9uX2NtZCAqcnhvbiA9ICZjdHgtPnN0YWdpbmc7CisKKwlEX1JBRElPKCJSWCBDT05GSUc6XG4iKTsKKwlpbF9wcmludF9oZXhfZHVtcChpbCwgSUxfRExfUkFESU8sICh1OCAqKSByeG9uLCBzaXplb2YoKnJ4b24pKTsKKwlEX1JBRElPKCJ1MTYgY2hhbm5lbDogMHgleFxuIiwgbGUxNl90b19jcHUocnhvbi0+Y2hhbm5lbCkpOworCURfUkFESU8oInUzMiBmbGFnczogMHglMDhYXG4iLCBsZTMyX3RvX2NwdShyeG9uLT5mbGFncykpOworCURfUkFESU8oInUzMiBmaWx0ZXJfZmxhZ3M6IDB4JTA4eFxuIiwgbGUzMl90b19jcHUocnhvbi0+ZmlsdGVyX2ZsYWdzKSk7CisJRF9SQURJTygidTggZGV2X3R5cGU6IDB4JXhcbiIsIHJ4b24tPmRldl90eXBlKTsKKwlEX1JBRElPKCJ1OCBvZmRtX2Jhc2ljX3JhdGVzOiAweCUwMnhcbiIsIHJ4b24tPm9mZG1fYmFzaWNfcmF0ZXMpOworCURfUkFESU8oInU4IGNja19iYXNpY19yYXRlczogMHglMDJ4XG4iLCByeG9uLT5jY2tfYmFzaWNfcmF0ZXMpOworCURfUkFESU8oInU4WzZdIG5vZGVfYWRkcjogJXBNXG4iLCByeG9uLT5ub2RlX2FkZHIpOworCURfUkFESU8oInU4WzZdIGJzc2lkX2FkZHI6ICVwTVxuIiwgcnhvbi0+YnNzaWRfYWRkcik7CisJRF9SQURJTygidTE2IGFzc29jX2lkOiAweCV4XG4iLCBsZTE2X3RvX2NwdShyeG9uLT5hc3NvY19pZCkpOworfQorRVhQT1JUX1NZTUJPTChpbF9wcmludF9yeF9jb25maWdfY21kKTsKKyNlbmRpZgorLyoqCisgKiBpbF9pcnFfaGFuZGxlX2Vycm9yIC0gY2FsbGVkIGZvciBIVyBvciBTVyBlcnJvciBpbnRlcnJ1cHQgZnJvbSBjYXJkCisgKi8KK3ZvaWQKK2lsX2lycV9oYW5kbGVfZXJyb3Ioc3RydWN0IGlsX3ByaXYgKmlsKQoreworCS8qIFNldCB0aGUgRlcgZXJyb3IgZmxhZyAtLSBjbGVhcmVkIG9uIGlsX2Rvd24gKi8KKwlzZXRfYml0KFNfRldfRVJST1IsICZpbC0+c3RhdHVzKTsKKworCS8qIENhbmNlbCBjdXJyZW50bHkgcXVldWVkIGNvbW1hbmQuICovCisJY2xlYXJfYml0KFNfSENNRF9BQ1RJVkUsICZpbC0+c3RhdHVzKTsKKworCUlMX0VSUigiTG9hZGVkIGZpcm13YXJlIHZlcnNpb246ICVzXG4iLCBpbC0+aHctPndpcGh5LT5md192ZXJzaW9uKTsKKworCWlsLT5jZmctPm9wcy0+bGliLT5kdW1wX25pY19lcnJvcl9sb2coaWwpOworCWlmIChpbC0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maCkKKwkJaWwtPmNmZy0+b3BzLT5saWItPmR1bXBfZmgoaWwsIE5VTEwsIGZhbHNlKTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIElMX0RMX0ZXX0VSUk9SUykKKwkJaWxfcHJpbnRfcnhfY29uZmlnX2NtZChpbCwgJmlsLT5jdHgpOworI2VuZGlmCisKKwl3YWtlX3VwKCZpbC0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKKworCS8qIEtlZXAgdGhlIHJlc3RhcnQgcHJvY2VzcyBmcm9tIHRyeWluZyB0byBzZW5kIGhvc3QKKwkgKiBjb21tYW5kcyBieSBjbGVhcmluZyB0aGUgSU5JVCBzdGF0dXMgYml0ICovCisJY2xlYXJfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKTsKKworCWlmICghdGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkgeworCQlJTF9EQkcoSUxfRExfRldfRVJST1JTLAorCQkgICAgICAgIlJlc3RhcnRpbmcgYWRhcHRlciBkdWUgdG8gdUNvZGUgZXJyb3IuXG4iKTsKKworCQlpZiAoaWwtPmNmZy0+bW9kX3BhcmFtcy0+cmVzdGFydF9mdykKKwkJCXF1ZXVlX3dvcmsoaWwtPndvcmtxdWV1ZSwgJmlsLT5yZXN0YXJ0KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGlsX2lycV9oYW5kbGVfZXJyb3IpOworCitzdGF0aWMgaW50CitpbF9hcG1fc3RvcF9tYXN0ZXIoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQgPSAwOworCisJLyogc3RvcCBkZXZpY2UncyBidXNtYXN0ZXIgRE1BIGFjdGl2aXR5ICovCisJaWxfc2V0X2JpdChpbCwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfU1RPUF9NQVNURVIpOworCisJcmV0ID0KKwkgICAgX2lsX3BvbGxfYml0KGlsLCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19NQVNURVJfRElTQUJMRUQsCisJCQkgQ1NSX1JFU0VUX1JFR19GTEFHX01BU1RFUl9ESVNBQkxFRCwgMTAwKTsKKwlpZiAocmV0KQorCQlJTF9XQVJOKCJNYXN0ZXIgRGlzYWJsZSBUaW1lZCBPdXQsIDEwMCB1c2VjXG4iKTsKKworCURfSU5GTygic3RvcCBtYXN0ZXJcbiIpOworCisJcmV0dXJuIHJldDsKK30KKwordm9pZAoraWxfYXBtX3N0b3Aoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCURfSU5GTygiU3RvcCBjYXJkLCBwdXQgaW4gbG93IHBvd2VyIHN0YXRlXG4iKTsKKworCS8qIFN0b3AgZGV2aWNlJ3MgRE1BIGFjdGl2aXR5ICovCisJaWxfYXBtX3N0b3BfbWFzdGVyKGlsKTsKKworCS8qIFJlc2V0IHRoZSBlbnRpcmUgZGV2aWNlICovCisJaWxfc2V0X2JpdChpbCwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfU1dfUkVTRVQpOworCisJdWRlbGF5KDEwKTsKKworCS8qCisJICogQ2xlYXIgImluaXRpYWxpemF0aW9uIGNvbXBsZXRlIiBiaXQgdG8gbW92ZSBhZGFwdGVyIGZyb20KKwkgKiBEMEEqIChwb3dlcmVkLXVwIEFjdGl2ZSkgLS0+IEQwVSogKFVuaW5pdGlhbGl6ZWQpIHN0YXRlLgorCSAqLworCWlsX2NsZWFyX2JpdChpbCwgQ1NSX0dQX0NOVFJMLCBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSU5JVF9ET05FKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfYXBtX3N0b3ApOworCisvKgorICogU3RhcnQgdXAgTklDJ3MgYmFzaWMgZnVuY3Rpb25hbGl0eSBhZnRlciBpdCBoYXMgYmVlbiByZXNldAorICogKGUuZy4gYWZ0ZXIgcGxhdGZvcm0gYm9vdCwgb3Igc2h1dGRvd24gdmlhIGlsX2FwbV9zdG9wKCkpCisgKiBOT1RFOiAgVGhpcyBkb2VzIG5vdCBsb2FkIHVDb2RlIG5vciBzdGFydCB0aGUgZW1iZWRkZWQgcHJvY2Vzc29yCisgKi8KK2ludAoraWxfYXBtX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWludCByZXQgPSAwOworCXUxNiBsY3RsOworCisJRF9JTkZPKCJJbml0IGNhcmQncyBiYXNpYyBmdW5jdGlvbnNcbiIpOworCisJLyoKKwkgKiBVc2UgInNldF9iaXQiIGJlbG93IHJhdGhlciB0aGFuICJ3cml0ZSIsIHRvIHByZXNlcnZlIGFueSBoYXJkd2FyZQorCSAqIGJpdHMgYWxyZWFkeSBzZXQgYnkgZGVmYXVsdCBhZnRlciByZXNldC4KKwkgKi8KKworCS8qIERpc2FibGUgTDBTIGV4aXQgdGltZXIgKHBsYXRmb3JtIE5NSSBXb3JrL0Fyb3VuZCkgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfR0lPX0NISUNLRU5fQklUUywKKwkJICAgQ1NSX0dJT19DSElDS0VOX0JJVFNfUkVHX0JJVF9ESVNfTDBTX0VYSVRfVElNRVIpOworCisJLyoKKwkgKiBEaXNhYmxlIEwwcyB3aXRob3V0IGFmZmVjdGluZyBMMTsKKwkgKiAgZG9uJ3Qgd2FpdCBmb3IgSUNIIEwwcyAoSUNIIGJ1ZyBXL0EpCisJICovCisJaWxfc2V0X2JpdChpbCwgQ1NSX0dJT19DSElDS0VOX0JJVFMsCisJCSAgIENTUl9HSU9fQ0hJQ0tFTl9CSVRTX1JFR19CSVRfTDFBX05PX0wwU19SWCk7CisKKwkvKiBTZXQgRkggd2FpdCB0aHJlc2hvbGQgdG8gbWF4aW11bSAoSFcgZXJyb3IgZHVyaW5nIHN0cmVzcyBXL0EpICovCisJaWxfc2V0X2JpdChpbCwgQ1NSX0RCR19IUEVUX01FTV9SRUcsIENTUl9EQkdfSFBFVF9NRU1fUkVHX1ZBTCk7CisKKwkvKgorCSAqIEVuYWJsZSBIQVAgSU5UQSAoaW50ZXJydXB0IGZyb20gbWFuYWdlbWVudCBidXMpIHRvCisJICogd2FrZSBkZXZpY2UncyBQQ0kgRXhwcmVzcyBsaW5rIEwxYSAtPiBMMHMKKwkgKiBOT1RFOiAgVGhpcyBpcyBuby1vcCBmb3IgMzk0NSAobm9uLWV4aXN0ZW50IGJpdCkKKwkgKi8KKwlpbF9zZXRfYml0KGlsLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKKwkJICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0hBUF9XQUtFX0wxQSk7CisKKwkvKgorCSAqIEhXIGJ1ZyBXL0EgZm9yIGluc3RhYmlsaXR5IGluIFBDSWUgYnVzIEwwLT5MMFMtPkwxIHRyYW5zaXRpb24uCisJICogQ2hlY2sgaWYgQklPUyAob3IgT1MpIGVuYWJsZWQgTDEtQVNQTSBvbiB0aGlzIGRldmljZS4KKwkgKiBJZiBzbyAobGlrZWx5KSwgZGlzYWJsZSBMMFMsIHNvIGRldmljZSBtb3ZlcyBkaXJlY3RseSBMMC0+TDE7CisJICogICAgY29zdHMgbmVnbGlnaWJsZSBhbW91bnQgb2YgcG93ZXIgc2F2aW5ncy4KKwkgKiBJZiBub3QgKHVubGlrZWx5KSwgZW5hYmxlIEwwUywgc28gdGhlcmUgaXMgYXQgbGVhc3Qgc29tZQorCSAqICAgIHBvd2VyIHNhdmluZ3MsIGV2ZW4gd2l0aG91dCBMMS4KKwkgKi8KKwlpZiAoaWwtPmNmZy0+YmFzZV9wYXJhbXMtPnNldF9sMHMpIHsKKwkJbGN0bCA9IGlsX3BjaWVfbGlua19jdGwoaWwpOworCQlpZiAoKGxjdGwgJiBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4pID09CisJCSAgICBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4pIHsKKwkJCS8qIEwxLUFTUE0gZW5hYmxlZDsgZGlzYWJsZSghKSBMMFMgICovCisJCQlpbF9zZXRfYml0KGlsLCBDU1JfR0lPX1JFRywKKwkJCQkgICBDU1JfR0lPX1JFR19WQUxfTDBTX0VOQUJMRUQpOworCQkJRF9QT1dFUigiTDEgRW5hYmxlZDsgRGlzYWJsaW5nIEwwU1xuIik7CisJCX0gZWxzZSB7CisJCQkvKiBMMS1BU1BNIGRpc2FibGVkOyBlbmFibGUoISkgTDBTICovCisJCQlpbF9jbGVhcl9iaXQoaWwsIENTUl9HSU9fUkVHLAorCQkJCSAgICAgQ1NSX0dJT19SRUdfVkFMX0wwU19FTkFCTEVEKTsKKwkJCURfUE9XRVIoIkwxIERpc2FibGVkOyBFbmFibGluZyBMMFNcbiIpOworCQl9CisJfQorCisJLyogQ29uZmlndXJlIGFuYWxvZyBwaGFzZS1sb2NrLWxvb3AgYmVmb3JlIGFjdGl2YXRpbmcgdG8gRDBBICovCisJaWYgKGlsLT5jZmctPmJhc2VfcGFyYW1zLT5wbGxfY2ZnX3ZhbCkKKwkJaWxfc2V0X2JpdChpbCwgQ1NSX0FOQV9QTExfQ0ZHLAorCQkJICAgaWwtPmNmZy0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKTsKKworCS8qCisJICogU2V0ICJpbml0aWFsaXphdGlvbiBjb21wbGV0ZSIgYml0IHRvIG1vdmUgYWRhcHRlciBmcm9tCisJICogRDBVKiAtLT4gRDBBKiAocG93ZXJlZC11cCBhY3RpdmUpIHN0YXRlLgorCSAqLworCWlsX3NldF9iaXQoaWwsIENTUl9HUF9DTlRSTCwgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0lOSVRfRE9ORSk7CisKKwkvKgorCSAqIFdhaXQgZm9yIGNsb2NrIHN0YWJpbGl6YXRpb247IG9uY2Ugc3RhYmlsaXplZCwgYWNjZXNzIHRvCisJICogZGV2aWNlLWludGVybmFsIHJlc291cmNlcyBpcyBzdXBwb3J0ZWQsIGUuZy4gaWxfd3JfcHJwaCgpCisJICogYW5kIGFjY2Vzc2VzIHRvIHVDb2RlIFNSQU0uCisJICovCisJcmV0ID0KKwkgICAgX2lsX3BvbGxfYml0KGlsLCBDU1JfR1BfQ05UUkwsCisJCQkgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19DTE9DS19SRUFEWSwKKwkJCSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZLCAyNTAwMCk7CisJaWYgKHJldCA8IDApIHsKKwkJRF9JTkZPKCJGYWlsZWQgdG8gaW5pdCB0aGUgY2FyZFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogRW5hYmxlIERNQSBhbmQgQlNNIChpZiB1c2VkKSBjbG9ja3MsIHdhaXQgZm9yIHRoZW0gdG8gc3RhYmlsaXplLgorCSAqIEJTTSAoQm9vc3RyYXAgU3RhdGUgTWFjaGluZSkgaXMgb25seSBpbiAzOTQ1IGFuZCA0OTY1LgorCSAqCisJICogV3JpdGUgdG8gIkNMS19FTl9SRUciOyAiMSIgYml0cyBlbmFibGUgY2xvY2tzLCB3aGlsZSAiMCIgYml0cworCSAqIGRvIG5vdCBkaXNhYmxlIGNsb2Nrcy4gIFRoaXMgcHJlc2VydmVzIGFueSBoYXJkd2FyZSBiaXRzIGFscmVhZHkKKwkgKiBzZXQgYnkgZGVmYXVsdCBpbiAiQ0xLX0NUUkxfUkVHIiBhZnRlciByZXNldC4KKwkgKi8KKwlpZiAoaWwtPmNmZy0+YmFzZV9wYXJhbXMtPnVzZV9ic20pCisJCWlsX3dyX3BycGgoaWwsIEFQTUdfQ0xLX0VOX1JFRywKKwkJCSAgIEFQTUdfQ0xLX1ZBTF9ETUFfQ0xLX1JRVCB8IEFQTUdfQ0xLX1ZBTF9CU01fQ0xLX1JRVCk7CisJZWxzZQorCQlpbF93cl9wcnBoKGlsLCBBUE1HX0NMS19FTl9SRUcsIEFQTUdfQ0xLX1ZBTF9ETUFfQ0xLX1JRVCk7CisJdWRlbGF5KDIwKTsKKworCS8qIERpc2FibGUgTDEtQWN0aXZlICovCisJaWxfc2V0X2JpdHNfcHJwaChpbCwgQVBNR19QQ0lERVZfU1RUX1JFRywKKwkJCSBBUE1HX1BDSURFVl9TVFRfVkFMX0wxX0FDVF9ESVMpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWxfYXBtX2luaXQpOworCitpbnQKK2lsX3NldF90eF9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHM4IHR4X3Bvd2VyLCBib29sIGZvcmNlKQoreworCWludCByZXQ7CisJczggcHJldl90eF9wb3dlcjsKKwlib29sIGRlZmVyOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWlmIChpbC0+dHhfcG93ZXJfdXNlcl9sbXQgPT0gdHhfcG93ZXIgJiYgIWZvcmNlKQorCQlyZXR1cm4gMDsKKworCWlmICghaWwtPmNmZy0+b3BzLT5saWItPnNlbmRfdHhfcG93ZXIpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCS8qIDAgZEJtIG1lYW4gMSBtaWxsaXdhdHQgKi8KKwlpZiAodHhfcG93ZXIgPCAwKSB7CisJCUlMX1dBUk4oIlJlcXVlc3RlZCB1c2VyIFRYUE9XRVIgJWQgYmVsb3cgMSBtVy5cbiIsIHR4X3Bvd2VyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHR4X3Bvd2VyID4gaWwtPnR4X3Bvd2VyX2RldmljZV9sbXQpIHsKKwkJSUxfV0FSTigiUmVxdWVzdGVkIHVzZXIgVFhQT1dFUiAlZCBhYm92ZSB1cHBlciBsaW1pdCAlZC5cbiIsCisJCQl0eF9wb3dlciwgaWwtPnR4X3Bvd2VyX2RldmljZV9sbXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWlsX2lzX3JlYWR5X3JmKGlsKSkKKwkJcmV0dXJuIC1FSU87CisKKwkvKiBzY2FuIGNvbXBsZXRlIGFuZCBjb21taXRfcnhvbiB1c2UgdHhfcG93ZXJfbmV4dCB2YWx1ZSwKKwkgKiBpdCBhbHdheXMgbmVlZCB0byBiZSB1cGRhdGVkIGZvciBuZXdlc3QgcmVxdWVzdCAqLworCWlsLT50eF9wb3dlcl9uZXh0ID0gdHhfcG93ZXI7CisKKwkvKiBkbyBub3Qgc2V0IHR4IHBvd2VyIHdoZW4gc2Nhbm5pbmcgb3IgY2hhbm5lbCBjaGFuZ2luZyAqLworCWRlZmVyID0gdGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpIHx8CisJICAgIG1lbWNtcCgmY3R4LT5hY3RpdmUsICZjdHgtPnN0YWdpbmcsIHNpemVvZihjdHgtPnN0YWdpbmcpKTsKKwlpZiAoZGVmZXIgJiYgIWZvcmNlKSB7CisJCURfSU5GTygiRGVmZXJyaW5nIHR4IHBvd2VyIHNldFxuIik7CisJCXJldHVybiAwOworCX0KKworCXByZXZfdHhfcG93ZXIgPSBpbC0+dHhfcG93ZXJfdXNlcl9sbXQ7CisJaWwtPnR4X3Bvd2VyX3VzZXJfbG10ID0gdHhfcG93ZXI7CisKKwlyZXQgPSBpbC0+Y2ZnLT5vcHMtPmxpYi0+c2VuZF90eF9wb3dlcihpbCk7CisKKwkvKiBpZiBmYWlsIHRvIHNldCB0eF9wb3dlciwgcmVzdG9yZSB0aGUgb3JpZy4gdHggcG93ZXIgKi8KKwlpZiAocmV0KSB7CisJCWlsLT50eF9wb3dlcl91c2VyX2xtdCA9IHByZXZfdHhfcG93ZXI7CisJCWlsLT50eF9wb3dlcl9uZXh0ID0gcHJldl90eF9wb3dlcjsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0X3R4X3Bvd2VyKTsKKwordm9pZAoraWxfc2VuZF9idF9jb25maWcoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXN0cnVjdCBpbF9idF9jbWQgYnRfY21kID0geworCQkubGVhZF90aW1lID0gQlRfTEVBRF9USU1FX0RFRiwKKwkJLm1heF9raWxsID0gQlRfTUFYX0tJTExfREVGLAorCQkua2lsbF9hY2tfbWFzayA9IDAsCisJCS5raWxsX2N0c19tYXNrID0gMCwKKwl9OworCisJaWYgKCFidF9jb2V4X2FjdGl2ZSkKKwkJYnRfY21kLmZsYWdzID0gQlRfQ09FWF9ESVNBQkxFOworCWVsc2UKKwkJYnRfY21kLmZsYWdzID0gQlRfQ09FWF9FTkFCTEU7CisKKwlEX0lORk8oIkJUIGNvZXggJXNcbiIsCisJICAgICAgIChidF9jbWQuZmxhZ3MgPT0gQlRfQ09FWF9ESVNBQkxFKSA/ICJkaXNhYmxlIiA6ICJhY3RpdmUiKTsKKworCWlmIChpbF9zZW5kX2NtZF9wZHUoaWwsIENfQlRfQ09ORklHLCBzaXplb2Yoc3RydWN0IGlsX2J0X2NtZCksICZidF9jbWQpKQorCQlJTF9FUlIoImZhaWxlZCB0byBzZW5kIEJUIENvZXggQ29uZmlnXG4iKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9idF9jb25maWcpOworCitpbnQKK2lsX3NlbmRfc3RhdHNfcmVxdWVzdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGZsYWdzLCBib29sIGNsZWFyKQoreworCXN0cnVjdCBpbF9zdGF0c19jbWQgc3RhdHNfY21kID0geworCQkuY29uZmlndXJhdGlvbl9mbGFncyA9IGNsZWFyID8gSUxfU1RBVFNfQ09ORl9DTEVBUl9TVEFUUyA6IDAsCisJfTsKKworCWlmIChmbGFncyAmIENNRF9BU1lOQykKKwkJcmV0dXJuIGlsX3NlbmRfY21kX3BkdV9hc3luYyhpbCwgQ19TVEFUUywgc2l6ZW9mKHN0cnVjdCBpbF9zdGF0c19jbWQpLAorCQkJCQkgICAgICZzdGF0c19jbWQsIE5VTEwpOworCWVsc2UKKwkJcmV0dXJuIGlsX3NlbmRfY21kX3BkdShpbCwgQ19TVEFUUywgc2l6ZW9mKHN0cnVjdCBpbF9zdGF0c19jbWQpLAorCQkJCSAgICAgICAmc3RhdHNfY21kKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2VuZF9zdGF0c19yZXF1ZXN0KTsKKwordm9pZAoraWxfaGRsX3BtX3NsZWVwKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGlsX3NsZWVwX25vdGlmaWNhdGlvbiAqc2xlZXAgPSAmKHBrdC0+dS5zbGVlcF9ub3RpZik7CisJRF9SWCgic2xlZXAgbW9kZTogJWQsIHNyYzogJWRcbiIsCisJICAgICBzbGVlcC0+cG1fc2xlZXBfbW9kZSwgc2xlZXAtPnBtX3dha2V1cF9zcmMpOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGlsX2hkbF9wbV9zbGVlcCk7CisKK3ZvaWQKK2lsX2hkbF9wbV9kZWJ1Z19zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4YikKK3sKKwlzdHJ1Y3QgaWxfcnhfcGt0ICpwa3QgPSByeGJfYWRkcihyeGIpOworCXUzMiBsZW4gPSBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIElMX1JYX0ZSQU1FX1NJWkVfTVNLOworCURfUkFESU8oIkR1bXBpbmcgJWQgYnl0ZXMgb2YgdW5oYW5kbGVkIG5vdGlmaWNhdGlvbiBmb3IgJXM6XG4iLCBsZW4sCisJCWlsX2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCkpOworCWlsX3ByaW50X2hleF9kdW1wKGlsLCBJTF9ETF9SQURJTywgcGt0LT51LnJhdywgbGVuKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfaGRsX3BtX2RlYnVnX3N0YXRzKTsKKwordm9pZAoraWxfaGRsX2Vycm9yKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKQoreworCXN0cnVjdCBpbF9yeF9wa3QgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisKKwlJTF9FUlIoIkVycm9yIFJlcGx5IHR5cGUgMHglMDhYIGNtZCAlcyAoMHglMDJYKSAiCisJICAgICAgICJzZXEgMHglMDRYIHNlciAweCUwOFhcbiIsCisJICAgICAgIGxlMzJfdG9fY3B1KHBrdC0+dS5lcnJfcmVzcC5lcnJvcl90eXBlKSwKKwkgICAgICAgaWxfZ2V0X2NtZF9zdHJpbmcocGt0LT51LmVycl9yZXNwLmNtZF9pZCksCisJICAgICAgIHBrdC0+dS5lcnJfcmVzcC5jbWRfaWQsCisJICAgICAgIGxlMTZfdG9fY3B1KHBrdC0+dS5lcnJfcmVzcC5iYWRfY21kX3NlcV9udW0pLAorCSAgICAgICBsZTMyX3RvX2NwdShwa3QtPnUuZXJyX3Jlc3AuZXJyb3JfaW5mbykpOworfQorRVhQT1JUX1NZTUJPTChpbF9oZGxfZXJyb3IpOworCit2b2lkCitpbF9jbGVhcl9pc3Jfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCW1lbXNldCgmaWwtPmlzcl9zdGF0cywgMCwgc2l6ZW9mKGlsLT5pc3Jfc3RhdHMpKTsKK30KKworaW50CitpbF9tYWNfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTE2IHF1ZXVlLAorCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHE7CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwlpZiAoIWlsX2lzX3JlYWR5X3JmKGlsKSkgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIFJGIG5vdCByZWFkeVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmIChxdWV1ZSA+PSBBQ19OVU0pIHsKKwkJRF9NQUM4MDIxMSgibGVhdmUgLSBxdWV1ZSA+PSBBQ19OVU0gJWRcbiIsIHF1ZXVlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcSA9IEFDX05VTSAtIDEgLSBxdWV1ZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJaWwtPmN0eC5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uY3dfbWluID0KKwkgICAgY3B1X3RvX2xlMTYocGFyYW1zLT5jd19taW4pOworCWlsLT5jdHgucW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmN3X21heCA9CisJICAgIGNwdV90b19sZTE2KHBhcmFtcy0+Y3dfbWF4KTsKKwlpbC0+Y3R4LnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5haWZzbiA9IHBhcmFtcy0+YWlmczsKKwlpbC0+Y3R4LnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5lZGNhX3R4b3AgPQorCSAgICBjcHVfdG9fbGUxNigocGFyYW1zLT50eG9wICogMzIpKTsKKworCWlsLT5jdHgucW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLnJlc2VydmVkMSA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbF9tYWNfY29uZl90eCk7CisKK2ludAoraWxfbWFjX3R4X2xhc3RfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCisJcmV0dXJuIGlsLT5pYnNzX21hbmFnZXIgPT0gSUxfSUJTU19NQU5BR0VSOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaWxfbWFjX3R4X2xhc3RfYmVhY29uKTsKKworc3RhdGljIGludAoraWxfc2V0X21vZGUoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJaWxfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhpbCwgY3R4KTsKKworCWlmIChpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQorCQlpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKGlsLCBjdHgpOworCisJcmV0dXJuIGlsX2NvbW1pdF9yeG9uKGlsLCBjdHgpOworfQorCitzdGF0aWMgaW50CitpbF9zZXR1cF9pbnRlcmZhY2Uoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOworCWludCBlcnI7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJLyoKKwkgKiBUaGlzIHZhcmlhYmxlIHdpbGwgYmUgY29ycmVjdCBvbmx5IHdoZW4gdGhlcmUncyBqdXN0CisJICogYSBzaW5nbGUgY29udGV4dCwgYnV0IGFsbCBjb2RlIHVzaW5nIGl0IGlzIGZvciBoYXJkd2FyZQorCSAqIHRoYXQgc3VwcG9ydHMgb25seSBvbmUgY29udGV4dC4KKwkgKi8KKwlpbC0+aXdfbW9kZSA9IHZpZi0+dHlwZTsKKworCWN0eC0+aXNfYWN0aXZlID0gdHJ1ZTsKKworCWVyciA9IGlsX3NldF9tb2RlKGlsLCBjdHgpOworCWlmIChlcnIpIHsKKwkJaWYgKCFjdHgtPmFsd2F5c19hY3RpdmUpCisJCQljdHgtPmlzX2FjdGl2ZSA9IGZhbHNlOworCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCitpbnQKK2lsX21hY19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXN0cnVjdCBpbF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJaW50IGVycjsKKwl1MzIgbW9kZXM7CisKKwlEX01BQzgwMjExKCJlbnRlcjogdHlwZSAlZCwgYWRkciAlcE1cbiIsIHZpZi0+dHlwZSwgdmlmLT5hZGRyKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpZiAoIWlsX2lzX3JlYWR5X3JmKGlsKSkgeworCQlJTF9XQVJOKCJUcnkgdG8gYWRkIGludGVyZmFjZSB3aGVuIGRldmljZSBub3QgcmVhZHlcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBjaGVjayBpZiBidXN5IGNvbnRleHQgaXMgZXhjbHVzaXZlICovCisJaWYgKGlsLT5jdHgudmlmICYmCisJICAgIChpbC0+Y3R4LmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgJiBCSVQoaWwtPmN0eC52aWYtPnR5cGUpKSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwltb2RlcyA9IGlsLT5jdHguaW50ZXJmYWNlX21vZGVzIHwgaWwtPmN0eC5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOworCWlmICghKG1vZGVzICYgQklUKHZpZi0+dHlwZSkpKSB7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwl2aWZfcHJpdi0+Y3R4ID0gJmlsLT5jdHg7CisJaWwtPmN0eC52aWYgPSB2aWY7CisKKwllcnIgPSBpbF9zZXR1cF9pbnRlcmZhY2UoaWwsICZpbC0+Y3R4KTsKKwlpZiAoZXJyKSB7CisJCWlsLT5jdHgudmlmID0gTlVMTDsKKwkJaWwtPml3X21vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOworCX0KKworb3V0OgorCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCURfTUFDODAyMTEoImxlYXZlXG4iKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChpbF9tYWNfYWRkX2ludGVyZmFjZSk7CisKK3N0YXRpYyB2b2lkCitpbF90ZWFyZG93bl9pbnRlcmZhY2Uoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICAgICBib29sIG1vZGVfY2hhbmdlKQoreworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpbC0+bXV0ZXgpOworCisJaWYgKGlsLT5zY2FuX3ZpZiA9PSB2aWYpIHsKKwkJaWxfc2Nhbl9jYW5jZWxfdGltZW91dChpbCwgMjAwKTsKKwkJaWxfZm9yY2Vfc2Nhbl9lbmQoaWwpOworCX0KKworCWlmICghbW9kZV9jaGFuZ2UpIHsKKwkJaWxfc2V0X21vZGUoaWwsIGN0eCk7CisJCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQorCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKKwl9Cit9CisKK3ZvaWQKK2lsX21hY19yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisKKwlEX01BQzgwMjExKCJlbnRlclxuIik7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCisJV0FSTl9PTihjdHgtPnZpZiAhPSB2aWYpOworCWN0eC0+dmlmID0gTlVMTDsKKworCWlsX3RlYXJkb3duX2ludGVyZmFjZShpbCwgdmlmLCBmYWxzZSk7CisKKwltZW1zZXQoaWwtPmJzc2lkLCAwLCBFVEhfQUxFTik7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCit9CitFWFBPUlRfU1lNQk9MKGlsX21hY19yZW1vdmVfaW50ZXJmYWNlKTsKKworaW50CitpbF9hbGxvY190eHFfbWVtKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpZiAoIWlsLT50eHEpCisJCWlsLT50eHEgPQorCQkgICAga3phbGxvYyhzaXplb2Yoc3RydWN0IGlsX3R4X3F1ZXVlKSAqCisJCQkgICAgaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMsIEdGUF9LRVJORUwpOworCWlmICghaWwtPnR4cSkgeworCQlJTF9FUlIoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciB0eHFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2FsbG9jX3R4cV9tZW0pOworCit2b2lkCitpbF90eHFfbWVtKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlrZnJlZShpbC0+dHhxKTsKKwlpbC0+dHhxID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaWxfdHhxX21lbSk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworCisjZGVmaW5lIElMX1RSQUZGSUNfRFVNUF9TSVpFCShJTF9UUkFGRklDX0VOVFJZX1NJWkUgKiBJTF9UUkFGRklDX0VOVFJJRVMpCisKK3ZvaWQKK2lsX3Jlc2V0X3RyYWZmaWNfbG9nKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpbC0+dHhfdHJhZmZpY19pZHggPSAwOworCWlsLT5yeF90cmFmZmljX2lkeCA9IDA7CisJaWYgKGlsLT50eF90cmFmZmljKQorCQltZW1zZXQoaWwtPnR4X3RyYWZmaWMsIDAsIElMX1RSQUZGSUNfRFVNUF9TSVpFKTsKKwlpZiAoaWwtPnJ4X3RyYWZmaWMpCisJCW1lbXNldChpbC0+cnhfdHJhZmZpYywgMCwgSUxfVFJBRkZJQ19EVU1QX1NJWkUpOworfQorCitpbnQKK2lsX2FsbG9jX3RyYWZmaWNfbWVtKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwl1MzIgdHJhZmZpY19zaXplID0gSUxfVFJBRkZJQ19EVU1QX1NJWkU7CisKKwlpZiAoaWxfZGVidWdfbGV2ZWwgJiBJTF9ETF9UWCkgeworCQlpZiAoIWlsLT50eF90cmFmZmljKSB7CisJCQlpbC0+dHhfdHJhZmZpYyA9IGt6YWxsb2ModHJhZmZpY19zaXplLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghaWwtPnR4X3RyYWZmaWMpCisJCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJaWYgKGlsX2RlYnVnX2xldmVsICYgSUxfRExfUlgpIHsKKwkJaWYgKCFpbC0+cnhfdHJhZmZpYykgeworCQkJaWwtPnJ4X3RyYWZmaWMgPSBremFsbG9jKHRyYWZmaWNfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWlsLT5yeF90cmFmZmljKQorCQkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCWlsX3Jlc2V0X3RyYWZmaWNfbG9nKGlsKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woaWxfYWxsb2NfdHJhZmZpY19tZW0pOworCit2b2lkCitpbF9mcmVlX3RyYWZmaWNfbWVtKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlrZnJlZShpbC0+dHhfdHJhZmZpYyk7CisJaWwtPnR4X3RyYWZmaWMgPSBOVUxMOworCisJa2ZyZWUoaWwtPnJ4X3RyYWZmaWMpOworCWlsLT5yeF90cmFmZmljID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaWxfZnJlZV90cmFmZmljX21lbSk7CisKK3ZvaWQKK2lsX2RiZ19sb2dfdHhfZGF0YV9mcmFtZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUxNiBsZW5ndGgsCisJCQkgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcikKK3sKKwlfX2xlMTYgZmM7CisJdTE2IGxlbjsKKworCWlmIChsaWtlbHkoIShpbF9kZWJ1Z19sZXZlbCAmIElMX0RMX1RYKSkpCisJCXJldHVybjsKKworCWlmICghaWwtPnR4X3RyYWZmaWMpCisJCXJldHVybjsKKworCWZjID0gaGVhZGVyLT5mcmFtZV9jb250cm9sOworCWlmIChpZWVlODAyMTFfaXNfZGF0YShmYykpIHsKKwkJbGVuID0KKwkJICAgIChsZW5ndGggPgorCQkgICAgIElMX1RSQUZGSUNfRU5UUllfU0laRSkgPyBJTF9UUkFGRklDX0VOVFJZX1NJWkUgOiBsZW5ndGg7CisJCW1lbWNweSgoaWwtPnR4X3RyYWZmaWMgKworCQkJKGlsLT50eF90cmFmZmljX2lkeCAqIElMX1RSQUZGSUNfRU5UUllfU0laRSkpLCBoZWFkZXIsCisJCSAgICAgICBsZW4pOworCQlpbC0+dHhfdHJhZmZpY19pZHggPQorCQkgICAgKGlsLT50eF90cmFmZmljX2lkeCArIDEpICUgSUxfVFJBRkZJQ19FTlRSSUVTOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKTsKKwordm9pZAoraWxfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IGxlbmd0aCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQoreworCV9fbGUxNiBmYzsKKwl1MTYgbGVuOworCisJaWYgKGxpa2VseSghKGlsX2RlYnVnX2xldmVsICYgSUxfRExfUlgpKSkKKwkJcmV0dXJuOworCisJaWYgKCFpbC0+cnhfdHJhZmZpYykKKwkJcmV0dXJuOworCisJZmMgPSBoZWFkZXItPmZyYW1lX2NvbnRyb2w7CisJaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgeworCQlsZW4gPQorCQkgICAgKGxlbmd0aCA+CisJCSAgICAgSUxfVFJBRkZJQ19FTlRSWV9TSVpFKSA/IElMX1RSQUZGSUNfRU5UUllfU0laRSA6IGxlbmd0aDsKKwkJbWVtY3B5KChpbC0+cnhfdHJhZmZpYyArCisJCQkoaWwtPnJ4X3RyYWZmaWNfaWR4ICogSUxfVFJBRkZJQ19FTlRSWV9TSVpFKSksIGhlYWRlciwKKwkJICAgICAgIGxlbik7CisJCWlsLT5yeF90cmFmZmljX2lkeCA9CisJCSAgICAoaWwtPnJ4X3RyYWZmaWNfaWR4ICsgMSkgJSBJTF9UUkFGRklDX0VOVFJJRVM7CisJfQorfQorRVhQT1JUX1NZTUJPTChpbF9kYmdfbG9nX3J4X2RhdGFfZnJhbWUpOworCitjb25zdCBjaGFyICoKK2lsX2dldF9tZ210X3N0cmluZyhpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJCUlMX0NNRChNQU5BR0VNRU5UX0FTU09DX1JFUSk7CisJCUlMX0NNRChNQU5BR0VNRU5UX0FTU09DX1JFU1ApOworCQlJTF9DTUQoTUFOQUdFTUVOVF9SRUFTU09DX1JFUSk7CisJCUlMX0NNRChNQU5BR0VNRU5UX1JFQVNTT0NfUkVTUCk7CisJCUlMX0NNRChNQU5BR0VNRU5UX1BST0JFX1JFUSk7CisJCUlMX0NNRChNQU5BR0VNRU5UX1BST0JFX1JFU1ApOworCQlJTF9DTUQoTUFOQUdFTUVOVF9CRUFDT04pOworCQlJTF9DTUQoTUFOQUdFTUVOVF9BVElNKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfRElTQVNTT0MpOworCQlJTF9DTUQoTUFOQUdFTUVOVF9BVVRIKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfREVBVVRIKTsKKwkJSUxfQ01EKE1BTkFHRU1FTlRfQUNUSU9OKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCisJfQorfQorCitjb25zdCBjaGFyICoKK2lsX2dldF9jdHJsX3N0cmluZyhpbnQgY21kKQoreworCXN3aXRjaCAoY21kKSB7CisJCUlMX0NNRChDT05UUk9MX0JBQ0tfUkVRKTsKKwkJSUxfQ01EKENPTlRST0xfQkFDSyk7CisJCUlMX0NNRChDT05UUk9MX1BTUE9MTCk7CisJCUlMX0NNRChDT05UUk9MX1JUUyk7CisJCUlMX0NNRChDT05UUk9MX0NUUyk7CisJCUlMX0NNRChDT05UUk9MX0FDSyk7CisJCUlMX0NNRChDT05UUk9MX0NGRU5EKTsKKwkJSUxfQ01EKENPTlRST0xfQ0ZFTkRBQ0spOworCWRlZmF1bHQ6CisJCXJldHVybiAiVU5LTk9XTiI7CisKKwl9Cit9CisKK3ZvaWQKK2lsX2NsZWFyX3RyYWZmaWNfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCW1lbXNldCgmaWwtPnR4X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHRyYWZmaWNfc3RhdHMpKTsKKwltZW1zZXQoJmlsLT5yeF9zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCB0cmFmZmljX3N0YXRzKSk7Cit9CisKKy8qCisgKiBpZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUyBkZWZpbmVkLAorICogaWxfdXBkYXRlX3N0YXRzIGZ1bmN0aW9uIHdpbGwKKyAqIHJlY29yZCBhbGwgdGhlIE1HTVQsIENUUkwgYW5kIERBVEEgcGt0IGZvciBib3RoIFRYIGFuZCBSeCBwYXNzCisgKiBVc2UgZGVidWdGcyB0byBkaXNwbGF5IHRoZSByeC9yeF9zdGF0cworICogaWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMgbm90IGJlaW5nIGRlZmluZWQsIHRoZW4gbm8gTUdNVCBhbmQgQ1RSTAorICogaW5mb3JtYXRpb24gd2lsbCBiZSByZWNvcmRlZCwgYnV0IERBVEEgcGt0IHN0aWxsIHdpbGwgYmUgcmVjb3JkZWQKKyAqIGZvciB0aGUgcmVhc29uIG9mIGlsX2xlZC5jIG5lZWQgdG8gY29udHJvbCB0aGUgbGVkIGJsaW5raW5nIGJhc2VkIG9uCisgKiBudW1iZXIgb2YgdHggYW5kIHJ4IGRhdGEuCisgKgorICovCit2b2lkCitpbF91cGRhdGVfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGlzX3R4LCBfX2xlMTYgZmMsIHUxNiBsZW4pCit7CisJc3RydWN0IHRyYWZmaWNfc3RhdHMgKnN0YXRzOworCisJaWYgKGlzX3R4KQorCQlzdGF0cyA9ICZpbC0+dHhfc3RhdHM7CisJZWxzZQorCQlzdGF0cyA9ICZpbC0+cnhfc3RhdHM7CisKKwlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKSB7CisJCXN3aXRjaCAoZmMgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9TVFlQRSkpIHsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRKToKKwkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQVNTT0NfUkVRXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFU1ApOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9BU1NPQ19SRVNQXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRKToKKwkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUkVBU1NPQ19SRVFdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVNQKToKKwkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUkVBU1NPQ19SRVNQXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk6CisJCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX1BST0JFX1JFUV0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKToKKwkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfUFJPQkVfUkVTUF0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9CRUFDT05dKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVRJTSk6CisJCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0FUSU1dKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfRElTQVNTT0MpOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9ESVNBU1NPQ10rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVVRIKToKKwkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQVVUSF0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOgorCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9ERUFVVEhdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQUNUSU9OKToKKwkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQUNUSU9OXSsrOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19jdGwoZmMpKSB7CisJCXN3aXRjaCAoZmMgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9TVFlQRSkpIHsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQkFDS19SRVEpOgorCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9CQUNLX1JFUV0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9CQUNLKToKKwkJCXN0YXRzLT5jdHJsW0NPTlRST0xfQkFDS10rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QU1BPTEwpOgorCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9QU1BPTExdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUlRTKToKKwkJCXN0YXRzLT5jdHJsW0NPTlRST0xfUlRTXSsrOworCQkJYnJlYWs7CisJCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0NUUyk6CisJCQlzdGF0cy0+Y3RybFtDT05UUk9MX0NUU10rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BQ0spOgorCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9BQ0tdKys7CisJCQlicmVhazsKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQ0ZFTkQpOgorCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9DRkVORF0rKzsKKwkJCWJyZWFrOworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9DRkVOREFDSyk6CisJCQlzdGF0cy0+Y3RybFtDT05UUk9MX0NGRU5EQUNLXSsrOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvKiBkYXRhICovCisJCXN0YXRzLT5kYXRhX2NudCsrOworCQlzdGF0cy0+ZGF0YV9ieXRlcyArPSBsZW47CisJfQorfQorRVhQT1JUX1NZTUJPTChpbF91cGRhdGVfc3RhdHMpOworI2VuZGlmCisKK2ludAoraWxfZm9yY2VfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGV4dGVybmFsKQoreworCXN0cnVjdCBpbF9mb3JjZV9yZXNldCAqZm9yY2VfcmVzZXQ7CisKKwlpZiAodGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlmb3JjZV9yZXNldCA9ICZpbC0+Zm9yY2VfcmVzZXQ7CisJZm9yY2VfcmVzZXQtPnJlc2V0X3JlcXVlc3RfY291bnQrKzsKKwlpZiAoIWV4dGVybmFsKSB7CisJCWlmIChmb3JjZV9yZXNldC0+bGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzICYmCisJCSAgICB0aW1lX2FmdGVyKGZvcmNlX3Jlc2V0LT5sYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXMgKworCQkJICAgICAgIGZvcmNlX3Jlc2V0LT5yZXNldF9kdXJhdGlvbiwgamlmZmllcykpIHsKKwkJCURfSU5GTygiZm9yY2UgcmVzZXQgcmVqZWN0ZWRcbiIpOworCQkJZm9yY2VfcmVzZXQtPnJlc2V0X3JlamVjdF9jb3VudCsrOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9CisJZm9yY2VfcmVzZXQtPnJlc2V0X3N1Y2Nlc3NfY291bnQrKzsKKwlmb3JjZV9yZXNldC0+bGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzID0gamlmZmllczsKKworCS8qCisJICogaWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBleHRlcm5hbChleDogZGVidWdmcyksCisJICogdGhlbiBhbHdheXMgcGVyZm9ybSB0aGUgcmVxdWVzdCBpbiByZWdhcmRsZXNzIHRoZSBtb2R1bGUKKwkgKiBwYXJhbWV0ZXIgc2V0dGluZworCSAqIGlmIHRoZSByZXF1ZXN0IGlzIGZyb20gaW50ZXJuYWwgKHVDb2RlIGVycm9yIG9yIGRyaXZlcgorCSAqIGRldGVjdCBmYWlsdXJlKSwgdGhlbiBmd19yZXN0YXJ0IG1vZHVsZSBwYXJhbWV0ZXIKKwkgKiBuZWVkIHRvIGJlIGNoZWNrIGJlZm9yZSBwZXJmb3JtaW5nIGZpcm13YXJlIHJlbG9hZAorCSAqLworCisJaWYgKCFleHRlcm5hbCAmJiAhaWwtPmNmZy0+bW9kX3BhcmFtcy0+cmVzdGFydF9mdykgeworCQlEX0lORk8oIkNhbmNlbCBmaXJtd2FyZSByZWxvYWQgYmFzZWQgb24gIgorCQkgICAgICAgIm1vZHVsZSBwYXJhbWV0ZXIgc2V0dGluZ1xuIik7CisJCXJldHVybiAwOworCX0KKworCUlMX0VSUigiT24gZGVtYW5kIGZpcm13YXJlIHJlbG9hZFxuIik7CisKKwkvKiBTZXQgdGhlIEZXIGVycm9yIGZsYWcgLS0gY2xlYXJlZCBvbiBpbF9kb3duICovCisJc2V0X2JpdChTX0ZXX0VSUk9SLCAmaWwtPnN0YXR1cyk7CisJd2FrZV91cCgmaWwtPndhaXRfY29tbWFuZF9xdWV1ZSk7CisJLyoKKwkgKiBLZWVwIHRoZSByZXN0YXJ0IHByb2Nlc3MgZnJvbSB0cnlpbmcgdG8gc2VuZCBob3N0CisJICogY29tbWFuZHMgYnkgY2xlYXJpbmcgdGhlIElOSVQgc3RhdHVzIGJpdAorCSAqLworCWNsZWFyX2JpdChTX1JFQURZLCAmaWwtPnN0YXR1cyk7CisJcXVldWVfd29yayhpbC0+d29ya3F1ZXVlLCAmaWwtPnJlc3RhcnQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludAoraWxfbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQllbnVtIG5sODAyMTFfaWZ0eXBlIG5ld3R5cGUsIGJvb2wgbmV3cDJwKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisJdTMyIG1vZGVzOworCWludCBlcnI7CisKKwluZXd0eXBlID0gaWVlZTgwMjExX2lmdHlwZV9wMnAobmV3dHlwZSwgbmV3cDJwKTsKKworCW11dGV4X2xvY2soJmlsLT5tdXRleCk7CisKKwlpZiAoIWN0eC0+dmlmIHx8ICFpbF9pc19yZWFkeV9yZihpbCkpIHsKKwkJLyoKKwkJICogSHVoPyBCdXQgd2FpdCAuLi4gdGhpcyBjYW4gbWF5YmUgaGFwcGVuIHdoZW4KKwkJICogd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIGZpcm13YXJlIHJlc3RhcnQhCisJCSAqLworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCW1vZGVzID0gY3R4LT5pbnRlcmZhY2VfbW9kZXMgfCBjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7CisJaWYgKCEobW9kZXMgJiBCSVQobmV3dHlwZSkpKSB7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoKGlsLT5jdHguZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmIEJJVChpbC0+Y3R4LnZpZi0+dHlwZSkpIHx8CisJICAgIChpbC0+Y3R4LmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qIHN1Y2Nlc3MgKi8KKwlpbF90ZWFyZG93bl9pbnRlcmZhY2UoaWwsIHZpZiwgdHJ1ZSk7CisJdmlmLT50eXBlID0gbmV3dHlwZTsKKwl2aWYtPnAycCA9IG5ld3AycDsKKwllcnIgPSBpbF9zZXR1cF9pbnRlcmZhY2UoaWwsIGN0eCk7CisJV0FSTl9PTihlcnIpOworCS8qCisJICogV2UndmUgc3dpdGNoZWQgaW50ZXJuYWxseSwgYnV0IHN1Ym1pdHRpbmcgdG8gdGhlCisJICogZGV2aWNlIG1heSBoYXZlIGZhaWxlZCBmb3Igc29tZSByZWFzb24uIE1hc2sgdGhpcworCSAqIGVycm9yLCBiZWNhdXNlIG90aGVyd2lzZSBtYWM4MDIxMSB3aWxsIG5vdCBzd2l0Y2gKKwkgKiAoYW5kIHNldCB0aGUgaW50ZXJmYWNlIHR5cGUgYmFjaykgYW5kIHdlJ2xsIGJlCisJICogb3V0IG9mIHN5bmMgd2l0aCBpdC4KKwkgKi8KKwllcnIgPSAwOworCitvdXQ6CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKGlsX21hY19jaGFuZ2VfaW50ZXJmYWNlKTsKKworLyoKKyAqIE9uIGV2ZXJ5IHdhdGNoZG9nIHRpY2sgd2UgY2hlY2sgKGxhdGVzdCkgdGltZSBzdGFtcC4gSWYgaXQgZG9lcyBub3QKKyAqIGNoYW5nZSBkdXJpbmcgdGltZW91dCBwZXJpb2QgYW5kIHF1ZXVlIGlzIG5vdCBlbXB0eSB3ZSByZXNldCBmaXJtd2FyZS4KKyAqLworc3RhdGljIGludAoraWxfY2hlY2tfc3R1Y2tfcXVldWUoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgY250KQoreworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxID0gJmlsLT50eHFbY250XTsKKwlzdHJ1Y3QgaWxfcXVldWUgKnEgPSAmdHhxLT5xOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKKwlpbnQgcmV0OworCisJaWYgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikgeworCQl0eHEtPnRpbWVfc3RhbXAgPSBqaWZmaWVzOworCQlyZXR1cm4gMDsKKwl9CisKKwl0aW1lb3V0ID0KKwkgICAgdHhxLT50aW1lX3N0YW1wICsKKwkgICAgbXNlY3NfdG9famlmZmllcyhpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCk7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgeworCQlJTF9FUlIoIlF1ZXVlICVkIHN0dWNrIGZvciAldSBtcy5cbiIsIHEtPmlkLAorCQkgICAgICAgaWwtPmNmZy0+YmFzZV9wYXJhbXMtPndkX3RpbWVvdXQpOworCQlyZXQgPSBpbF9mb3JjZV9yZXNldChpbCwgZmFsc2UpOworCQlyZXR1cm4gKHJldCA9PSAtRUFHQUlOKSA/IDAgOiAxOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogTWFraW5nIHdhdGNoZG9nIHRpY2sgYmUgYSBxdWFydGVyIG9mIHRpbWVvdXQgYXNzdXJlIHdlIHdpbGwKKyAqIGRpc2NvdmVyIHRoZSBxdWV1ZSBodW5nIGJldHdlZW4gdGltZW91dCBhbmQgMS4yNSp0aW1lb3V0CisgKi8KKyNkZWZpbmUgSUxfV0RfVElDSyh0aW1lb3V0KSAoKHRpbWVvdXQpIC8gNCkKKworLyoKKyAqIFdhdGNoZG9nIHRpbWVyIGNhbGxiYWNrLCB3ZSBjaGVjayBlYWNoIHR4IHF1ZXVlIGZvciBzdHVjaywgaWYgaWYgaHVuZworICogd2UgcmVzZXQgdGhlIGZpcm13YXJlLiBJZiBldmVyeXRoaW5nIGlzIGZpbmUganVzdCByZWFybSB0aGUgdGltZXIuCisgKi8KK3ZvaWQKK2lsX2JnX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSAoc3RydWN0IGlsX3ByaXYgKilkYXRhOworCWludCBjbnQ7CisJdW5zaWduZWQgbG9uZyB0aW1lb3V0OworCisJaWYgKHRlc3RfYml0KFNfRVhJVF9QRU5ESU5HLCAmaWwtPnN0YXR1cykpCisJCXJldHVybjsKKworCXRpbWVvdXQgPSBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dDsKKwlpZiAodGltZW91dCA9PSAwKQorCQlyZXR1cm47CisKKwkvKiBtb25pdG9yIGFuZCBjaGVjayBmb3Igc3R1Y2sgY21kIHF1ZXVlICovCisJaWYgKGlsX2NoZWNrX3N0dWNrX3F1ZXVlKGlsLCBpbC0+Y21kX3F1ZXVlKSkKKwkJcmV0dXJuOworCisJLyogbW9uaXRvciBhbmQgY2hlY2sgZm9yIG90aGVyIHN0dWNrIHF1ZXVlcyAqLworCWlmIChpbF9pc19hbnlfYXNzb2NpYXRlZChpbCkpIHsKKwkJZm9yIChjbnQgPSAwOyBjbnQgPCBpbC0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBjbnQrKykgeworCQkJLyogc2tpcCBhcyB3ZSBhbHJlYWR5IGNoZWNrZWQgdGhlIGNvbW1hbmQgcXVldWUgKi8KKwkJCWlmIChjbnQgPT0gaWwtPmNtZF9xdWV1ZSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChpbF9jaGVja19zdHVja19xdWV1ZShpbCwgY250KSkKKwkJCQlyZXR1cm47CisJCX0KKwl9CisKKwltb2RfdGltZXIoJmlsLT53YXRjaGRvZywKKwkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhJTF9XRF9USUNLKHRpbWVvdXQpKSk7Cit9CitFWFBPUlRfU1lNQk9MKGlsX2JnX3dhdGNoZG9nKTsKKwordm9pZAoraWxfc2V0dXBfd2F0Y2hkb2coc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gaWwtPmNmZy0+YmFzZV9wYXJhbXMtPndkX3RpbWVvdXQ7CisKKwlpZiAodGltZW91dCkKKwkJbW9kX3RpbWVyKCZpbC0+d2F0Y2hkb2csCisJCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKElMX1dEX1RJQ0sodGltZW91dCkpKTsKKwllbHNlCisJCWRlbF90aW1lcigmaWwtPndhdGNoZG9nKTsKK30KK0VYUE9SVF9TWU1CT0woaWxfc2V0dXBfd2F0Y2hkb2cpOworCisvKgorICogZXh0ZW5kZWQgYmVhY29uIHRpbWUgZm9ybWF0CisgKiB0aW1lIGluIHVzZWMgd2lsbCBiZSBjaGFuZ2VkIGludG8gYSAzMi1iaXQgdmFsdWUgaW4gZXh0ZW5kZWQ6aW50ZXJuYWwgZm9ybWF0CisgKiB0aGUgZXh0ZW5kZWQgcGFydCBpcyB0aGUgYmVhY29uIGNvdW50cworICogdGhlIGludGVybmFsIHBhcnQgaXMgdGhlIHRpbWUgaW4gdXNlYyB3aXRoaW4gb25lIGJlYWNvbiBpbnRlcnZhbAorICovCit1MzIKK2lsX3VzZWNzX3RvX2JlYWNvbnMoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgdXNlYywgdTMyIGJlYWNvbl9pbnRlcnZhbCkKK3sKKwl1MzIgcXVvdDsKKwl1MzIgcmVtOworCXUzMiBpbnRlcnZhbCA9IGJlYWNvbl9pbnRlcnZhbCAqIFRJTUVfVU5JVDsKKworCWlmICghaW50ZXJ2YWwgfHwgIXVzZWMpCisJCXJldHVybiAwOworCisJcXVvdCA9CisJICAgICh1c2VjIC8KKwkgICAgIGludGVydmFsKSAmIChpbF9iZWFjb25fdGltZV9tYXNrX2hpZ2goaWwsCisJCQkJCQkgICBpbC0+aHdfcGFyYW1zLgorCQkJCQkJICAgYmVhY29uX3RpbWVfdHNmX2JpdHMpID4+IGlsLT4KKwkJCSAgaHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKKwlyZW0gPQorCSAgICAodXNlYyAlIGludGVydmFsKSAmIGlsX2JlYWNvbl90aW1lX21hc2tfbG93KGlsLAorCQkJCQkJCWlsLT5od19wYXJhbXMuCisJCQkJCQkJYmVhY29uX3RpbWVfdHNmX2JpdHMpOworCisJcmV0dXJuIChxdW90IDw8IGlsLT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpICsgcmVtOworfQorRVhQT1JUX1NZTUJPTChpbF91c2Vjc190b19iZWFjb25zKTsKKworLyogYmFzZSBpcyB1c3VhbGx5IHdoYXQgd2UgZ2V0IGZyb20gdWNvZGUgd2l0aCBlYWNoIHJlY2VpdmVkIGZyYW1lLAorICogdGhlIHNhbWUgYXMgSFcgdGltZXIgY291bnRlciBjb3VudGluZyBkb3duCisgKi8KK19fbGUzMgoraWxfYWRkX2JlYWNvbl90aW1lKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIGJhc2UsIHUzMiBhZGRvbiwKKwkJICAgdTMyIGJlYWNvbl9pbnRlcnZhbCkKK3sKKwl1MzIgYmFzZV9sb3cgPSBiYXNlICYgaWxfYmVhY29uX3RpbWVfbWFza19sb3coaWwsCisJCQkJCQkgICAgICBpbC0+aHdfcGFyYW1zLgorCQkJCQkJICAgICAgYmVhY29uX3RpbWVfdHNmX2JpdHMpOworCXUzMiBhZGRvbl9sb3cgPSBhZGRvbiAmIGlsX2JlYWNvbl90aW1lX21hc2tfbG93KGlsLAorCQkJCQkJCWlsLT5od19wYXJhbXMuCisJCQkJCQkJYmVhY29uX3RpbWVfdHNmX2JpdHMpOworCXUzMiBpbnRlcnZhbCA9IGJlYWNvbl9pbnRlcnZhbCAqIFRJTUVfVU5JVDsKKwl1MzIgcmVzID0gKGJhc2UgJiBpbF9iZWFjb25fdGltZV9tYXNrX2hpZ2goaWwsCisJCQkJCQkgICBpbC0+aHdfcGFyYW1zLgorCQkJCQkJICAgYmVhY29uX3RpbWVfdHNmX2JpdHMpKSArCisJICAgIChhZGRvbiAmIGlsX2JlYWNvbl90aW1lX21hc2tfaGlnaChpbCwKKwkJCQkJICAgICAgaWwtPmh3X3BhcmFtcy4KKwkJCQkJICAgICAgYmVhY29uX3RpbWVfdHNmX2JpdHMpKTsKKworCWlmIChiYXNlX2xvdyA+IGFkZG9uX2xvdykKKwkJcmVzICs9IGJhc2VfbG93IC0gYWRkb25fbG93OworCWVsc2UgaWYgKGJhc2VfbG93IDwgYWRkb25fbG93KSB7CisJCXJlcyArPSBpbnRlcnZhbCArIGJhc2VfbG93IC0gYWRkb25fbG93OworCQlyZXMgKz0gKDEgPDwgaWwtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7CisJfSBlbHNlCisJCXJlcyArPSAoMSA8PCBpbC0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKKworCXJldHVybiBjcHVfdG9fbGUzMihyZXMpOworfQorRVhQT1JUX1NZTUJPTChpbF9hZGRfYmVhY29uX3RpbWUpOworCisjaWZkZWYgQ09ORklHX1BNCisKK2ludAoraWxfcGNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOworCXN0cnVjdCBpbF9wcml2ICppbCA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKKworCS8qCisJICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBzeXN0ZW0gZ29lcyBpbnRvIHN1c3BlbmQgc3RhdGUKKwkgKiBtYWM4MDIxMSB3aWxsIGNhbGwgaWxfbWFjX3N0b3AoKSBmcm9tIHRoZSBtYWM4MDIxMSBzdXNwZW5kIGZ1bmN0aW9uCisJICogZmlyc3QgYnV0IHNpbmNlIGlsX21hY19zdG9wKCkgaGFzIG5vIGtub3dsZWRnZSBvZiB3aG8gdGhlIGNhbGxlciBpcywKKwkgKiBpdCB3aWxsIG5vdCBjYWxsIGFwbV9vcHMuc3RvcCgpIHRvIHN0b3AgdGhlIERNQSBvcGVyYXRpb24uCisJICogQ2FsbGluZyBhcG1fb3BzLnN0b3AgaGVyZSB0byBtYWtlIHN1cmUgd2Ugc3RvcCB0aGUgRE1BLgorCSAqLworCWlsX2FwbV9zdG9wKGlsKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbF9wY2lfc3VzcGVuZCk7CisKK2ludAoraWxfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCWJvb2wgaHdfcmZraWxsID0gZmFsc2U7CisKKwkvKgorCSAqIFdlIGRpc2FibGUgdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgKDB4NDEpIHRvIGtlZXAKKwkgKiBQQ0kgVHggcmV0cmllcyBmcm9tIGludGVyZmVyaW5nIHdpdGggQzMgQ1BVIHN0YXRlLgorCSAqLworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0ZHX1JFVFJZX1RJTUVPVVQsIDB4MDApOworCisJaWxfZW5hYmxlX2ludGVycnVwdHMoaWwpOworCisJaWYgKCEoX2lsX3JkKGlsLCBDU1JfR1BfQ05UUkwpICYgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpKQorCQlod19yZmtpbGwgPSB0cnVlOworCisJaWYgKGh3X3Jma2lsbCkKKwkJc2V0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKwllbHNlCisJCWNsZWFyX2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKTsKKworCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUoaWwtPmh3LT53aXBoeSwgaHdfcmZraWxsKTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChpbF9wY2lfcmVzdW1lKTsKKworY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaWxfcG1fb3BzID0geworCS5zdXNwZW5kID0gaWxfcGNpX3N1c3BlbmQsCisJLnJlc3VtZSA9IGlsX3BjaV9yZXN1bWUsCisJLmZyZWV6ZSA9IGlsX3BjaV9zdXNwZW5kLAorCS50aGF3ID0gaWxfcGNpX3Jlc3VtZSwKKwkucG93ZXJvZmYgPSBpbF9wY2lfc3VzcGVuZCwKKwkucmVzdG9yZSA9IGlsX3BjaV9yZXN1bWUsCit9OworRVhQT1JUX1NZTUJPTChpbF9wbV9vcHMpOworCisjZW5kaWYgLyogQ09ORklHX1BNICovCisKK3N0YXRpYyB2b2lkCitpbF91cGRhdGVfcW9zKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworCWlmICh0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKQorCQlyZXR1cm47CisKKwlpZiAoIWN0eC0+aXNfYWN0aXZlKQorCQlyZXR1cm47CisKKwljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MgPSAwOworCisJaWYgKGN0eC0+cW9zX2RhdGEucW9zX2FjdGl2ZSkKKwkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0ucW9zX2ZsYWdzIHw9CisJCSAgICBRT1NfUEFSQU1fRkxHX1VQREFURV9FRENBX01TSzsKKworCWlmIChjdHgtPmh0LmVuYWJsZWQpCisJCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLnFvc19mbGFncyB8PSBRT1NfUEFSQU1fRkxHX1RHTl9NU0s7CisKKwlEX1FPUygic2VuZCBRb1MgY21kIHdpdGggUW9zIGFjdGl2ZT0lZCBGTEFHUz0weCVYXG4iLAorCSAgICAgIGN0eC0+cW9zX2RhdGEucW9zX2FjdGl2ZSwgY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0ucW9zX2ZsYWdzKTsKKworCWlsX3NlbmRfY21kX3BkdV9hc3luYyhpbCwgY3R4LT5xb3NfY21kLCBzaXplb2Yoc3RydWN0IGlsX3Fvc3BhcmFtX2NtZCksCisJCQkgICAgICAmY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0sIE5VTEwpOworfQorCisvKioKKyAqIGlsX21hY19jb25maWcgLSBtYWM4MDIxMSBjb25maWcgY2FsbGJhY2sKKyAqLworaW50CitpbF9tYWNfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCkKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwljb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvOworCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBjb25mLT5jaGFubmVsOworCXN0cnVjdCBpbF9odF9jb25maWcgKmh0X2NvbmYgPSAmaWwtPmN1cnJlbnRfaHRfY29uZmlnOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9ICZpbC0+Y3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOworCWludCByZXQgPSAwOworCXUxNiBjaDsKKwlpbnQgc2Nhbl9hY3RpdmUgPSAwOworCWJvb2wgaHRfY2hhbmdlZCA9IGZhbHNlOworCisJaWYgKFdBUk5fT04oIWlsLT5jZmctPm9wcy0+bGVnYWN5KSkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbXV0ZXhfbG9jaygmaWwtPm11dGV4KTsKKworCURfTUFDODAyMTEoImVudGVyIHRvIGNoYW5uZWwgJWQgY2hhbmdlZCAweCVYXG4iLCBjaGFubmVsLT5od192YWx1ZSwKKwkJICAgY2hhbmdlZCk7CisKKwlpZiAodW5saWtlbHkodGVzdF9iaXQoU19TQ0FOTklORywgJmlsLT5zdGF0dXMpKSkgeworCQlzY2FuX2FjdGl2ZSA9IDE7CisJCURfTUFDODAyMTEoInNjYW4gYWN0aXZlXG4iKTsKKwl9CisKKwlpZiAoY2hhbmdlZCAmCisJICAgIChJRUVFODAyMTFfQ09ORl9DSEFOR0VfU01QUyB8IElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKSkgeworCQkvKiBtYWM4MDIxMSB1c2VzIHN0YXRpYyBmb3Igbm9uLUhUIHdoaWNoIGlzIHdoYXQgd2Ugd2FudCAqLworCQlpbC0+Y3VycmVudF9odF9jb25maWcuc21wcyA9IGNvbmYtPnNtcHNfbW9kZTsKKworCQkvKgorCQkgKiBSZWNhbGN1bGF0ZSBjaGFpbiBjb3VudHMuCisJCSAqCisJCSAqIElmIG1vbml0b3IgbW9kZSBpcyBlbmFibGVkIHRoZW4gbWFjODAyMTEgd2lsbAorCQkgKiBzZXQgdXAgdGhlIFNNIFBTIG1vZGUgdG8gT0ZGIGlmIGFuIEhUIGNoYW5uZWwgaXMKKwkJICogY29uZmlndXJlZC4KKwkJICovCisJCWlmIChpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQorCQkJaWwtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihpbCwgJmlsLT5jdHgpOworCX0KKworCS8qIGR1cmluZyBzY2FubmluZyBtYWM4MDIxMSB3aWxsIGRlbGF5IGNoYW5uZWwgc2V0dGluZyB1bnRpbAorCSAqIHNjYW4gZmluaXNoIHdpdGggY2hhbmdlZCA9IDAKKwkgKi8KKwlpZiAoIWNoYW5nZWQgfHwgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkpIHsKKworCQlpZiAoc2Nhbl9hY3RpdmUpCisJCQlnb3RvIHNldF9jaF9vdXQ7CisKKwkJY2ggPSBjaGFubmVsLT5od192YWx1ZTsKKwkJY2hfaW5mbyA9IGlsX2dldF9jaGFubmVsX2luZm8oaWwsIGNoYW5uZWwtPmJhbmQsIGNoKTsKKwkJaWYgKCFpbF9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7CisJCQlEX01BQzgwMjExKCJsZWF2ZSAtIGludmFsaWQgY2hhbm5lbFxuIik7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBzZXRfY2hfb3V0OworCQl9CisKKwkJaWYgKGlsLT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCisJCSAgICAhaWxfaXNfY2hhbm5lbF9pYnNzKGNoX2luZm8pKSB7CisJCQlEX01BQzgwMjExKCJsZWF2ZSAtIG5vdCBJQlNTIGNoYW5uZWxcbiIpOworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWdvdG8gc2V0X2NoX291dDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJCS8qIENvbmZpZ3VyZSBIVDQwIGNoYW5uZWxzICovCisJCWlmIChjdHgtPmh0LmVuYWJsZWQgIT0gY29uZl9pc19odChjb25mKSkgeworCQkJY3R4LT5odC5lbmFibGVkID0gY29uZl9pc19odChjb25mKTsKKwkJCWh0X2NoYW5nZWQgPSB0cnVlOworCQl9CisJCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKKwkJCWlmIChjb25mX2lzX2h0NDBfbWludXMoY29uZikpIHsKKwkJCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9CisJCQkJICAgIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOworCQkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOworCQkJfSBlbHNlIGlmIChjb25mX2lzX2h0NDBfcGx1cyhjb25mKSkgeworCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCQkgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU7CisJCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7CisJCQl9IGVsc2UgeworCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCQkgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKKwkJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7CisJCQl9CisJCX0gZWxzZQorCQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOworCisJCS8qCisJCSAqIERlZmF1bHQgdG8gbm8gcHJvdGVjdGlvbi4gUHJvdGVjdGlvbiBtb2RlIHdpbGwKKwkJICogbGF0ZXIgYmUgc2V0IGZyb20gQlNTIGNvbmZpZyBpbiBpbF9odF9jb25mCisJCSAqLworCQljdHgtPmh0LnByb3RlY3Rpb24gPSBJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OX05PTkU7CisKKwkJLyogaWYgd2UgYXJlIHN3aXRjaGluZyBmcm9tIGh0IHRvIDIuNCBjbGVhciBmbGFncworCQkgKiBmcm9tIGFueSBodCByZWxhdGVkIGluZm8gc2luY2UgMi40IGRvZXMgbm90CisJCSAqIHN1cHBvcnQgaHQgKi8KKwkJaWYgKChsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCkgIT0gY2gpKQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzID0gMDsKKworCQlpbF9zZXRfcnhvbl9jaGFubmVsKGlsLCBjaGFubmVsLCBjdHgpOworCQlpbF9zZXRfcnhvbl9odChpbCwgaHRfY29uZik7CisKKwkJaWxfc2V0X2ZsYWdzX2Zvcl9iYW5kKGlsLCBjdHgsIGNoYW5uZWwtPmJhbmQsIGN0eC0+dmlmKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJCWlmIChpbC0+Y2ZnLT5vcHMtPmxlZ2FjeS0+dXBkYXRlX2JjYXN0X3N0YXRpb25zKQorCQkJcmV0ID0gaWwtPmNmZy0+b3BzLT5sZWdhY3ktPnVwZGF0ZV9iY2FzdF9zdGF0aW9ucyhpbCk7CisKK3NldF9jaF9vdXQ6CisJCS8qIFRoZSBsaXN0IG9mIHN1cHBvcnRlZCByYXRlcyBhbmQgcmF0ZSBtYXNrIGNhbiBiZSBkaWZmZXJlbnQKKwkJICogZm9yIGVhY2ggYmFuZDsgc2luY2UgdGhlIGJhbmQgbWF5IGhhdmUgY2hhbmdlZCwgcmVzZXQKKwkJICogdGhlIHJhdGUgbWFzayB0byB3aGF0IG1hYzgwMjExIGxpc3RzICovCisJCWlsX3NldF9yYXRlKGlsKTsKKwl9CisKKwlpZiAoY2hhbmdlZCAmIChJRUVFODAyMTFfQ09ORl9DSEFOR0VfUFMgfCBJRUVFODAyMTFfQ09ORl9DSEFOR0VfSURMRSkpIHsKKwkJcmV0ID0gaWxfcG93ZXJfdXBkYXRlX21vZGUoaWwsIGZhbHNlKTsKKwkJaWYgKHJldCkKKwkJCURfTUFDODAyMTEoIkVycm9yIHNldHRpbmcgc2xlZXAgbGV2ZWxcbiIpOworCX0KKworCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BPV0VSKSB7CisJCURfTUFDODAyMTEoIlRYIFBvd2VyIG9sZD0lZCBuZXc9JWRcbiIsIGlsLT50eF9wb3dlcl91c2VyX2xtdCwKKwkJCSAgIGNvbmYtPnBvd2VyX2xldmVsKTsKKworCQlpbF9zZXRfdHhfcG93ZXIoaWwsIGNvbmYtPnBvd2VyX2xldmVsLCBmYWxzZSk7CisJfQorCisJaWYgKCFpbF9pc19yZWFkeShpbCkpIHsKKwkJRF9NQUM4MDIxMSgibGVhdmUgLSBub3QgcmVhZHlcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAoc2Nhbl9hY3RpdmUpCisJCWdvdG8gb3V0OworCisJaWYgKG1lbWNtcCgmY3R4LT5hY3RpdmUsICZjdHgtPnN0YWdpbmcsIHNpemVvZihjdHgtPnN0YWdpbmcpKSkKKwkJaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7CisJZWxzZQorCQlEX0lORk8oIk5vdCByZS1zZW5kaW5nIHNhbWUgUlhPTiBjb25maWd1cmF0aW9uLlxuIik7CisJaWYgKGh0X2NoYW5nZWQpCisJCWlsX3VwZGF0ZV9xb3MoaWwsIGN0eCk7CisKK291dDoKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7CisJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGlsX21hY19jb25maWcpOworCit2b2lkCitpbF9tYWNfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlpZiAoV0FSTl9PTighaWwtPmNmZy0+b3BzLT5sZWdhY3kpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCURfTUFDODAyMTEoImVudGVyXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCW1lbXNldCgmaWwtPmN1cnJlbnRfaHRfY29uZmlnLCAwLCBzaXplb2Yoc3RydWN0IGlsX2h0X2NvbmZpZykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCS8qIG5ldyBhc3NvY2lhdGlvbiBnZXQgcmlkIG9mIGlic3MgYmVhY29uIHNrYiAqLworCWlmIChpbC0+YmVhY29uX3NrYikKKwkJZGV2X2tmcmVlX3NrYihpbC0+YmVhY29uX3NrYik7CisKKwlpbC0+YmVhY29uX3NrYiA9IE5VTEw7CisKKwlpbC0+dGltZXN0YW1wID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpbF9zY2FuX2NhbmNlbF90aW1lb3V0KGlsLCAxMDApOworCWlmICghaWxfaXNfcmVhZHlfcmYoaWwpKSB7CisJCURfTUFDODAyMTEoImxlYXZlIC0gbm90IHJlYWR5XG4iKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJLyogd2UgYXJlIHJlc3RhcnRpbmcgYXNzb2NpYXRpb24gcHJvY2VzcworCSAqIGNsZWFyIFJYT05fRklMVEVSX0FTU09DX01TSyBiaXQKKwkgKi8KKwljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7CisKKwlpbF9zZXRfcmF0ZShpbCk7CisKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7Cit9CitFWFBPUlRfU1lNQk9MKGlsX21hY19yZXNldF90c2YpOworCitzdGF0aWMgdm9pZAoraWxfaHRfY29uZihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZpbC0+Y3VycmVudF9odF9jb25maWc7CisJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiA9ICZ2aWYtPmJzc19jb25mOworCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCA9IGlsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisKKwlEX0FTU09DKCJlbnRlcjpcbiIpOworCisJaWYgKCFjdHgtPmh0LmVuYWJsZWQpCisJCXJldHVybjsKKworCWN0eC0+aHQucHJvdGVjdGlvbiA9CisJICAgIGJzc19jb25mLT5odF9vcGVyYXRpb25fbW9kZSAmIElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT047CisJY3R4LT5odC5ub25fZ2Zfc3RhX3ByZXNlbnQgPQorCSAgICAhIShic3NfY29uZi0+CisJICAgICAgIGh0X29wZXJhdGlvbl9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfTk9OX0dGX1NUQV9QUlNOVCk7CisKKwlodF9jb25mLT5zaW5nbGVfY2hhaW5fc3VmZmljaWVudCA9IGZhbHNlOworCisJc3dpdGNoICh2aWYtPnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhKHZpZiwgYnNzX2NvbmYtPmJzc2lkKTsKKwkJaWYgKHN0YSkgeworCQkJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAgPSAmc3RhLT5odF9jYXA7CisJCQlpbnQgbWF4c3RyZWFtczsKKworCQkJbWF4c3RyZWFtcyA9CisJCQkgICAgKGh0X2NhcC0+bWNzLgorCQkJICAgICB0eF9wYXJhbXMgJiBJRUVFODAyMTFfSFRfTUNTX1RYX01BWF9TVFJFQU1TX01BU0spCisJCQkgICAgPj4gSUVFRTgwMjExX0hUX01DU19UWF9NQVhfU1RSRUFNU19TSElGVDsKKwkJCW1heHN0cmVhbXMgKz0gMTsKKworCQkJaWYgKGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPT0gMCAmJgorCQkJICAgIGh0X2NhcC0+bWNzLnJ4X21hc2tbMl0gPT0gMCkKKwkJCQlodF9jb25mLT5zaW5nbGVfY2hhaW5fc3VmZmljaWVudCA9IHRydWU7CisJCQlpZiAobWF4c3RyZWFtcyA8PSAxKQorCQkJCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBJZiBhdCBhbGwsIHRoaXMgY2FuIG9ubHkgaGFwcGVuIHRocm91Z2ggYSByYWNlCisJCQkgKiB3aGVuIHRoZSBBUCBkaXNjb25uZWN0cyB1cyB3aGlsZSB3ZSdyZSBzdGlsbAorCQkJICogc2V0dGluZyB1cCB0aGUgY29ubmVjdGlvbiwgaW4gdGhhdCBjYXNlIG1hYzgwMjExCisJCQkgKiB3aWxsIHNvb24gdGVsbCB1cyBhYm91dCB0aGF0LgorCQkJICovCisJCQlodF9jb25mLT5zaW5nbGVfY2hhaW5fc3VmZmljaWVudCA9IHRydWU7CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CisJCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJRF9BU1NPQygibGVhdmVcbiIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3NldF9ub19hc3NvYyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gaWxfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKworCS8qCisJICogaW5mb3JtIHRoZSB1Y29kZSB0aGF0IHRoZXJlIGlzIG5vIGxvbmdlciBhbgorCSAqIGFzc29jaWF0aW9uIGFuZCB0aGF0IG5vIG1vcmUgcGFja2V0cyBzaG91bGQgYmUKKwkgKiBzZW50CisJICovCisJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOworCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IDA7CisJaWxfY29tbWl0X3J4b24oaWwsIGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkCitpbF9iZWFjb25fdXBkYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGh3LT5wcml2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJX19sZTY0IHRpbWVzdGFtcDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcsIHZpZik7CisKKwlpZiAoIXNrYikKKwkJcmV0dXJuOworCisJRF9NQUM4MDIxMSgiZW50ZXJcbiIpOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmaWwtPm11dGV4KTsKKworCWlmICghaWwtPmJlYWNvbl9jdHgpIHsKKwkJSUxfRVJSKCJ1cGRhdGUgYmVhY29uIGJ1dCBubyBiZWFjb24gY29udGV4dCFcbiIpOworCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKworCWlmIChpbC0+YmVhY29uX3NrYikKKwkJZGV2X2tmcmVlX3NrYihpbC0+YmVhY29uX3NrYik7CisKKwlpbC0+YmVhY29uX3NrYiA9IHNrYjsKKworCXRpbWVzdGFtcCA9ICgoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2tiLT5kYXRhKS0+dS5iZWFjb24udGltZXN0YW1wOworCWlsLT50aW1lc3RhbXAgPSBsZTY0X3RvX2NwdSh0aW1lc3RhbXApOworCisJRF9NQUM4MDIxMSgibGVhdmVcbiIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWlsX2lzX3JlYWR5X3JmKGlsKSkgeworCQlEX01BQzgwMjExKCJsZWF2ZSAtIFJGIG5vdCByZWFkeVxuIik7CisJCXJldHVybjsKKwl9CisKKwlpbC0+Y2ZnLT5vcHMtPmxlZ2FjeS0+cG9zdF9hc3NvY2lhdGUoaWwpOworfQorCit2b2lkCitpbF9tYWNfYnNzX2luZm9fY2hhbmdlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLCB1MzIgY2hhbmdlcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSBpbF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOworCWludCByZXQ7CisKKwlpZiAoV0FSTl9PTighaWwtPmNmZy0+b3BzLT5sZWdhY3kpKQorCQlyZXR1cm47CisKKwlEX01BQzgwMjExKCJjaGFuZ2VzID0gMHglWFxuIiwgY2hhbmdlcyk7CisKKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCisJaWYgKCFpbF9pc19hbGl2ZShpbCkpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbC0+bXV0ZXgpOworCQlyZXR1cm47CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9RT1MpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwkJY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlID0gYnNzX2NvbmYtPnFvczsKKwkJaWxfdXBkYXRlX3FvcyhpbCwgY3R4KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKSB7CisJCS8qCisJCSAqIHRoZSBhZGRfaW50ZXJmYWNlIGNvZGUgbXVzdCBtYWtlIHN1cmUgd2Ugb25seSBldmVyCisJCSAqIGhhdmUgYSBzaW5nbGUgaW50ZXJmYWNlIHRoYXQgY291bGQgYmUgYmVhY29uaW5nIGF0CisJCSAqIGFueSB0aW1lLgorCQkgKi8KKwkJaWYgKHZpZi0+YnNzX2NvbmYuZW5hYmxlX2JlYWNvbikKKwkJCWlsLT5iZWFjb25fY3R4ID0gY3R4OworCQllbHNlCisJCQlpbC0+YmVhY29uX2N0eCA9IE5VTEw7CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CU1NJRCkgeworCQlEX01BQzgwMjExKCJCU1NJRCAlcE1cbiIsIGJzc19jb25mLT5ic3NpZCk7CisKKwkJLyoKKwkJICogSWYgdGhlcmUgaXMgY3VycmVudGx5IGEgSFcgc2NhbiBnb2luZyBvbiBpbiB0aGUKKwkJICogYmFja2dyb3VuZCB0aGVuIHdlIG5lZWQgdG8gY2FuY2VsIGl0IGVsc2UgdGhlIFJYT04KKwkJICogYmVsb3cvaW4gcG9zdF9hc3NvY2lhdGUgd2lsbCBmYWlsLgorCQkgKi8KKwkJaWYgKGlsX3NjYW5fY2FuY2VsX3RpbWVvdXQoaWwsIDEwMCkpIHsKKwkJCUlMX1dBUk4oIkFib3J0ZWQgc2NhbiBzdGlsbCBpbiBwcm9ncmVzcyBhZnRlciAxMDBtc1xuIik7CisJCQlEX01BQzgwMjExKCJsZWF2aW5nIC0gc2NhbiBhYm9ydCBmYWlsZWQuXG4iKTsKKwkJCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKwkJCXJldHVybjsKKwkJfQorCisJCS8qIG1hYzgwMjExIG9ubHkgc2V0cyBhc3NvYyB3aGVuIGluIFNUQVRJT04gbW9kZSAqLworCQlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DIHx8IGJzc19jb25mLT5hc3NvYykgeworCQkJbWVtY3B5KGN0eC0+c3RhZ2luZy5ic3NpZF9hZGRyLCBic3NfY29uZi0+YnNzaWQsCisJCQkgICAgICAgRVRIX0FMRU4pOworCisJCQkvKiBjdXJyZW50bHkgbmVlZGVkIGluIGEgZmV3IHBsYWNlcyAqLworCQkJbWVtY3B5KGlsLT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7CisJCX0gZWxzZSB7CisJCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7CisJCX0KKworCX0KKworCS8qCisJICogVGhpcyBuZWVkcyB0byBiZSBhZnRlciBzZXR0aW5nIHRoZSBCU1NJRCBpbiBjYXNlCisJICogbWFjODAyMTEgZGVjaWRlcyB0byBkbyBib3RoIGNoYW5nZXMgYXQgb25jZSBiZWNhdXNlCisJICogaXQgd2lsbCBpbnZva2UgcG9zdF9hc3NvY2lhdGUuCisJICovCisJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyAmJiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JFQUNPTikpCisJCWlsX2JlYWNvbl91cGRhdGUoaHcsIHZpZik7CisKKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRSkgeworCQlEX01BQzgwMjExKCJFUlBfUFJFQU1CTEUgJWRcbiIsIGJzc19jb25mLT51c2Vfc2hvcnRfcHJlYW1ibGUpOworCQlpZiAoYnNzX2NvbmYtPnVzZV9zaG9ydF9wcmVhbWJsZSkKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7CisJCWVsc2UKKwkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOworCX0KKworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UKSB7CisJCURfTUFDODAyMTEoIkVSUF9DVFMgJWRcbiIsIGJzc19jb25mLT51c2VfY3RzX3Byb3QpOworCQlpZiAoYnNzX2NvbmYtPnVzZV9jdHNfcHJvdCAmJiBpbC0+YmFuZCAhPSBJRUVFODAyMTFfQkFORF81R0haKQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1RHR19QUk9URUNUX01TSzsKKwkJZWxzZQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0s7CisJCWlmIChic3NfY29uZi0+dXNlX2N0c19wcm90KQorCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NFTEZfQ1RTX0VOOworCQllbHNlCisJCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NFTEZfQ1RTX0VOOworCX0KKworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQkFTSUNfUkFURVMpIHsKKwkJLyogWFhYIHVzZSB0aGlzIGluZm9ybWF0aW9uCisJCSAqCisJCSAqIFRvIGRvIHRoYXQsIHJlbW92ZSBjb2RlIGZyb20gaWxfc2V0X3JhdGUoKSBhbmQgcHV0IHNvbWV0aGluZworCQkgKiBsaWtlIHRoaXMgaGVyZToKKwkJICoKKwkJIGlmIChBLWJhbmQpCisJCSBjdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9CisJCSBic3NfY29uZi0+YmFzaWNfcmF0ZXM7CisJCSBlbHNlCisJCSBjdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9CisJCSBic3NfY29uZi0+YmFzaWNfcmF0ZXMgPj4gNDsKKwkJIGN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXMgPQorCQkgYnNzX2NvbmYtPmJhc2ljX3JhdGVzICYgMHhGOworCQkgKi8KKwl9CisKKwlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0hUKSB7CisJCWlsX2h0X2NvbmYoaWwsIHZpZik7CisKKwkJaWYgKGlsLT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCisJCQlpbC0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKGlsLCBjdHgpOworCX0KKworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQVNTT0MpIHsKKwkJRF9NQUM4MDIxMSgiQVNTT0MgJWRcbiIsIGJzc19jb25mLT5hc3NvYyk7CisJCWlmIChic3NfY29uZi0+YXNzb2MpIHsKKwkJCWlsLT50aW1lc3RhbXAgPSBic3NfY29uZi0+dGltZXN0YW1wOworCisJCQlpZiAoIWlsX2lzX3Jma2lsbChpbCkpCisJCQkJaWwtPmNmZy0+b3BzLT5sZWdhY3ktPnBvc3RfYXNzb2NpYXRlKGlsKTsKKwkJfSBlbHNlCisJCQlpbF9zZXRfbm9fYXNzb2MoaWwsIHZpZik7CisJfQorCisJaWYgKGNoYW5nZXMgJiYgaWxfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSAmJiBic3NfY29uZi0+YWlkKSB7CisJCURfTUFDODAyMTEoIkNoYW5nZXMgKCUjeCkgd2hpbGUgYXNzb2NpYXRlZFxuIiwgY2hhbmdlcyk7CisJCXJldCA9IGlsX3NlbmRfcnhvbl9hc3NvYyhpbCwgY3R4KTsKKwkJaWYgKCFyZXQpIHsKKwkJCS8qIFN5bmMgYWN0aXZlX3J4b24gd2l0aCBsYXRlc3QgY2hhbmdlLiAqLworCQkJbWVtY3B5KCh2b2lkICopJmN0eC0+YWN0aXZlLCAmY3R4LT5zdGFnaW5nLAorCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaWxfcnhvbl9jbWQpKTsKKwkJfQorCX0KKworCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpIHsKKwkJaWYgKHZpZi0+YnNzX2NvbmYuZW5hYmxlX2JlYWNvbikgeworCQkJbWVtY3B5KGN0eC0+c3RhZ2luZy5ic3NpZF9hZGRyLCBic3NfY29uZi0+YnNzaWQsCisJCQkgICAgICAgRVRIX0FMRU4pOworCQkJbWVtY3B5KGlsLT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7CisJCQlpbC0+Y2ZnLT5vcHMtPmxlZ2FjeS0+Y29uZmlnX2FwKGlsKTsKKwkJfSBlbHNlCisJCQlpbF9zZXRfbm9fYXNzb2MoaWwsIHZpZik7CisJfQorCisJaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9JQlNTKSB7CisJCXJldCA9CisJCSAgICBpbC0+Y2ZnLT5vcHMtPmxlZ2FjeS0+bWFuYWdlX2lic3Nfc3RhdGlvbihpbCwgdmlmLAorCQkJCQkJCSAgICAgIGJzc19jb25mLT4KKwkJCQkJCQkgICAgICBpYnNzX2pvaW5lZCk7CisJCWlmIChyZXQpCisJCQlJTF9FUlIoImZhaWxlZCB0byAlcyBJQlNTIHN0YXRpb24gJXBNXG4iLAorCQkJICAgICAgIGJzc19jb25mLT5pYnNzX2pvaW5lZCA/ICJhZGQiIDogInJlbW92ZSIsCisJCQkgICAgICAgYnNzX2NvbmYtPmJzc2lkKTsKKwl9CisKKwltdXRleF91bmxvY2soJmlsLT5tdXRleCk7CisKKwlEX01BQzgwMjExKCJsZWF2ZVxuIik7Cit9CitFWFBPUlRfU1lNQk9MKGlsX21hY19ic3NfaW5mb19jaGFuZ2VkKTsKKworaXJxcmV0dXJuX3QKK2lsX2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGRhdGE7CisJdTMyIGludGEsIGludGFfbWFzazsKKwl1MzIgaW50YV9maDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmICghaWwpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+bG9jaywgZmxhZ3MpOworCisJLyogRGlzYWJsZSAoYnV0IGRvbid0IGNsZWFyISkgaW50ZXJydXB0cyBoZXJlIHRvIGF2b2lkCisJICogICAgYmFjay10by1iYWNrIElTUnMgYW5kIHNwb3JhZGljIGludGVycnVwdHMgZnJvbSBvdXIgTklDLgorCSAqIElmIHdlIGhhdmUgc29tZXRoaW5nIHRvIHNlcnZpY2UsIHRoZSB0YXNrbGV0IHdpbGwgcmUtZW5hYmxlIGludHMuCisJICogSWYgd2UgKmRvbid0KiBoYXZlIHNvbWV0aGluZywgd2UnbGwgcmUtZW5hYmxlIGJlZm9yZSBsZWF2aW5nIGhlcmUuICovCisJaW50YV9tYXNrID0gX2lsX3JkKGlsLCBDU1JfSU5UX01BU0spOwkvKiBqdXN0IGZvciBkZWJ1ZyAqLworCV9pbF93cihpbCwgQ1NSX0lOVF9NQVNLLCAweDAwMDAwMDAwKTsKKworCS8qIERpc2NvdmVyIHdoaWNoIGludGVycnVwdHMgYXJlIGFjdGl2ZS9wZW5kaW5nICovCisJaW50YSA9IF9pbF9yZChpbCwgQ1NSX0lOVCk7CisJaW50YV9maCA9IF9pbF9yZChpbCwgQ1NSX0ZIX0lOVF9TVEFUVVMpOworCisJLyogSWdub3JlIGludGVycnVwdCBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gTklDIHRvIHNlcnZpY2UuCisJICogVGhpcyBtYXkgYmUgZHVlIHRvIElSUSBzaGFyZWQgd2l0aCBhbm90aGVyIGRldmljZSwKKwkgKiBvciBkdWUgdG8gc3BvcmFkaWMgaW50ZXJydXB0cyB0aHJvd24gZnJvbSBvdXIgTklDLiAqLworCWlmICghaW50YSAmJiAhaW50YV9maCkgeworCQlEX0lTUigiSWdub3JlIGludGVycnVwdCwgaW50YSA9PSAwLCBpbnRhX2ZoID09IDBcbiIpOworCQlnb3RvIG5vbmU7CisJfQorCisJaWYgKGludGEgPT0gMHhGRkZGRkZGRiB8fCAoaW50YSAmIDB4RkZGRkZGRjApID09IDB4YTVhNWE1YTApIHsKKwkJLyogSGFyZHdhcmUgZGlzYXBwZWFyZWQuIEl0IG1pZ2h0IGhhdmUgYWxyZWFkeSByYWlzZWQKKwkJICogYW4gaW50ZXJydXB0ICovCisJCUlMX1dBUk4oIkhBUkRXQVJFIEdPTkU/PyBJTlRBID09IDB4JTA4eFxuIiwgaW50YSk7CisJCWdvdG8gdW5wbHVnZ2VkOworCX0KKworCURfSVNSKCJJU1IgaW50YSAweCUwOHgsIGVuYWJsZWQgMHglMDh4LCBmaCAweCUwOHhcbiIsIGludGEsIGludGFfbWFzaywKKwkgICAgICBpbnRhX2ZoKTsKKworCWludGEgJj0gfkNTUl9JTlRfQklUX1NDRDsKKworCS8qIGlsX2lycV90YXNrbGV0KCkgd2lsbCBzZXJ2aWNlIGludGVycnVwdHMgYW5kIHJlLWVuYWJsZSB0aGVtICovCisJaWYgKGxpa2VseShpbnRhIHx8IGludGFfZmgpKQorCQl0YXNrbGV0X3NjaGVkdWxlKCZpbC0+aXJxX3Rhc2tsZXQpOworCit1bnBsdWdnZWQ6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7CisKK25vbmU6CisJLyogcmUtZW5hYmxlIGludGVycnVwdHMgaGVyZSBzaW5jZSB3ZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIHNlcnZpY2UuICovCisJLyogb25seSBSZS1lbmFibGUgaWYgZGlzYWJsZWQgYnkgaXJxICovCisJaWYgKHRlc3RfYml0KFNfSU5UX0VOQUJMRUQsICZpbC0+c3RhdHVzKSkKKwkJaWxfZW5hYmxlX2ludGVycnVwdHMoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIElSUV9OT05FOworfQorRVhQT1JUX1NZTUJPTChpbF9pc3IpOworCisvKgorICogIGlsX3R4X2NtZF9wcm90ZWN0aW9uOiBTZXQgcnRzL2N0cy4gMzk0NSBhbmQgNDk2NSBvbmx5IHNoYXJlIHRoaXMKKyAqICBmdW5jdGlvbi4KKyAqLwordm9pZAoraWxfdHhfY21kX3Byb3RlY3Rpb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCisJCSAgICAgX19sZTE2IGZjLCBfX2xlMzIgKnR4X2ZsYWdzKQoreworCWlmIChpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9SVFNfQ1RTKSB7CisJCSp0eF9mbGFncyB8PSBUWF9DTURfRkxHX1JUU19NU0s7CisJCSp0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19DVFNfTVNLOworCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19GVUxMX1RYT1BfUFJPVF9NU0s7CisKKwkJaWYgKCFpZWVlODAyMTFfaXNfbWdtdChmYykpCisJCQlyZXR1cm47CisKKwkJc3dpdGNoIChmYyAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9GQ1RMX1NUWVBFKSkgeworCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BVVRIKToKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfREVBVVRIKToKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVNTT0NfUkVRKToKKwkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUkVBU1NPQ19SRVEpOgorCQkJKnR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX1JUU19NU0s7CisJCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19DVFNfTVNLOworCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgaWYgKGluZm8tPmNvbnRyb2wucmF0ZXNbMF0uCisJCSAgIGZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCkgeworCQkqdHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfUlRTX01TSzsKKwkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfQ1RTX01TSzsKKwkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfRlVMTF9UWE9QX1BST1RfTVNLOworCX0KK30KK0VYUE9SVF9TWU1CT0woaWxfdHhfY21kX3Byb3RlY3Rpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmZhMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY29tbW9uLmgKQEAgLTAsMCArMSwzMjQ2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQorICogZmlsZSBjYWxsZWQgTElDRU5TRS4KKyAqCisgKiBDb250YWN0IEluZm9ybWF0aW9uOgorICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgorICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NworICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19pbF9jb3JlX2hfXworI2RlZmluZSBfX2lsX2NvcmVfaF9fCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4JCS8qIGZvciBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqLworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKyNpbmNsdWRlIDxuZXQvaWVlZTgwMjExX3JhZGlvdGFwLmg+CisKKyNpbmNsdWRlICJjb21tYW5kcy5oIgorI2luY2x1ZGUgImNzci5oIgorI2luY2x1ZGUgInBycGguaCIKKworc3RydWN0IGlsX2hvc3RfY21kOworc3RydWN0IGlsX2NtZDsKK3N0cnVjdCBpbF90eF9xdWV1ZTsKKworI2RlZmluZSBJTF9FUlIoZiwgYS4uLikgZGV2X2VycigmaWwtPnBjaV9kZXYtPmRldiwgZiwgIyMgYSkKKyNkZWZpbmUgSUxfV0FSTihmLCBhLi4uKSBkZXZfd2FybigmaWwtPnBjaV9kZXYtPmRldiwgZiwgIyMgYSkKKyNkZWZpbmUgSUxfSU5GTyhmLCBhLi4uKSBkZXZfaW5mbygmaWwtPnBjaV9kZXYtPmRldiwgZiwgIyMgYSkKKworI2RlZmluZSBSWF9RVUVVRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDI1NgorI2RlZmluZSBSWF9RVUVVRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDI1NQorI2RlZmluZSBSWF9RVUVVRV9TSVpFX0xPRyAgICAgICAgICAgICAgICAgICAgIDgKKworLyoKKyAqIFJYIHJlbGF0ZWQgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zCisgKi8KKyNkZWZpbmUgUlhfRlJFRV9CVUZGRVJTIDY0CisjZGVmaW5lIFJYX0xPV19XQVRFUk1BUksgOAorCisjZGVmaW5lIFUzMl9QQUQobikJCSgoNC0obikpJjB4MykKKworLyogQ1QtS0lMTCBjb25zdGFudHMgKi8KKyNkZWZpbmUgQ1RfS0lMTF9USFJFU0hPTERfTEVHQUNZICAgMTEwCS8qIGluIENlbHNpdXMgKi8KKworLyogRGVmYXVsdCBub2lzZSBsZXZlbCB0byByZXBvcnQgd2hlbiBub2lzZSBtZWFzdXJlbWVudCBpcyBub3QgYXZhaWxhYmxlLgorICogICBUaGlzIG1heSBiZSBiZWNhdXNlIHdlJ3JlOgorICogICAxKSAgTm90IGFzc29jaWF0ZWQgKDQ5NjUsIG5vIGJlYWNvbiBzdGF0cyBiZWluZyBzZW50IHRvIGRyaXZlcikKKyAqICAgMikgIFNjYW5uaW5nIChub2lzZSBtZWFzdXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBhc3NvY2lhdGVkIGNoYW5uZWwpCisgKiAgIDMpICBSZWNlaXZpbmcgQ0NLICgzOTQ1IGRlbGl2ZXJzIG5vaXNlIGluZm8gb25seSBmb3IgT0ZETSBmcmFtZXMpCisgKiBVc2UgZGVmYXVsdCBub2lzZSB2YWx1ZSBvZiAtMTI3IC4uLiB0aGlzIGlzIGJlbG93IHRoZSByYW5nZSBvZiBtZWFzdXJhYmxlCisgKiAgIFJ4IGRCbSBmb3IgZWl0aGVyIDM5NDUgb3IgNDk2NSwgc28gaXQgY2FuIGluZGljYXRlICJ1bm1lYXN1cmFibGUiIHRvIHVzZXIuCisgKiAgIEFsc28sIC0xMjcgd29ya3MgYmV0dGVyIHRoYW4gMCB3aGVuIGF2ZXJhZ2luZyBmcmFtZXMgd2l0aC93aXRob3V0CisgKiAgIG5vaXNlIGluZm8gKGUuZy4gYXZlcmFnaW5nIG1pZ2h0IGJlIGRvbmUgaW4gYXBwKTsgbWVhc3VyZWQgZEJtIHZhbHVlcyBhcmUKKyAqICAgYWx3YXlzIG5lZ2F0aXZlIC4uLiB1c2luZyBhIG5lZ2F0aXZlIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGtlZXBzIGFsbAorICogICBhdmVyYWdlcyB3aXRoaW4gYW4gczgncyAodXNlZCBpbiBzb21lIGFwcHMpIHJhbmdlIG9mIG5lZ2F0aXZlIHZhbHVlcy4gKi8KKyNkZWZpbmUgSUxfTk9JU0VfTUVBU19OT1RfQVZBSUxBQkxFICgtMTI3KQorCisvKgorICogUlRTIHRocmVzaG9sZCBoZXJlIGlzIHRvdGFsIHNpemUgWzIzNDddIG1pbnVzIDQgRkNTIGJ5dGVzCisgKiBQZXIgc3BlYzoKKyAqICAgYSB2YWx1ZSBvZiAwIG1lYW5zIFJUUyBvbiBhbGwgZGF0YS9tYW5hZ2VtZW50IHBhY2tldHMKKyAqICAgYSB2YWx1ZSA+IG1heCBNU0RVIHNpemUgbWVhbnMgbm8gUlRTCisgKiBlbHNlIFJUUyBmb3IgZGF0YS9tYW5hZ2VtZW50IGZyYW1lcyB3aGVyZSBNUERVIGlzIGxhcmdlcgorICogICB0aGFuIFJUUyB2YWx1ZS4KKyAqLworI2RlZmluZSBERUZBVUxUX1JUU19USFJFU0hPTEQgICAgIDIzNDdVCisjZGVmaW5lIE1JTl9SVFNfVEhSRVNIT0xEICAgICAgICAgMFUKKyNkZWZpbmUgTUFYX1JUU19USFJFU0hPTEQgICAgICAgICAyMzQ3VQorI2RlZmluZSBNQVhfTVNEVV9TSVpFCQkgIDIzMDRVCisjZGVmaW5lIE1BWF9NUERVX1NJWkUJCSAgMjM0NlUKKyNkZWZpbmUgREVGQVVMVF9CRUFDT05fSU5URVJWQUwgICAxMDBVCisjZGVmaW5lCURFRkFVTFRfU0hPUlRfUkVUUllfTElNSVQgN1UKKyNkZWZpbmUJREVGQVVMVF9MT05HX1JFVFJZX0xJTUlUICA0VQorCitzdHJ1Y3QgaWxfcnhfYnVmIHsKKwlkbWFfYWRkcl90IHBhZ2VfZG1hOworCXN0cnVjdCBwYWdlICpwYWdlOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNkZWZpbmUgcnhiX2FkZHIocikgcGFnZV9hZGRyZXNzKHItPnBhZ2UpCisKKy8qIGRlZmluZWQgYmVsb3cgKi8KK3N0cnVjdCBpbF9kZXZpY2VfY21kOworCitzdHJ1Y3QgaWxfY21kX21ldGEgeworCS8qIG9ubHkgZm9yIFNZTkMgY29tbWFuZHMsIGlmZiB0aGUgcmVwbHkgc2tiIGlzIHdhbnRlZCAqLworCXN0cnVjdCBpbF9ob3N0X2NtZCAqc291cmNlOworCS8qCisJICogb25seSBmb3IgQVNZTkMgY29tbWFuZHMKKwkgKiAod2hpY2ggaXMgc29tZXdoYXQgc3R1cGlkIC0tIGxvb2sgYXQgY29tbW9uLmMgZm9yIGluc3RhbmNlCisJICogd2hpY2ggZHVwbGljYXRlcyBhIGJ1bmNoIG9mIGNvZGUgYmVjYXVzZSB0aGUgY2FsbGJhY2sgaXNuJ3QKKwkgKiBpbnZva2VkIGZvciBTWU5DIGNvbW1hbmRzLCBpZiBpdCB3ZXJlIGFuZCBpdHMgcmVzdWx0IHBhc3NlZAorCSAqIHRocm91Z2ggaXQgd291bGQgYmUgc2ltcGxlci4uLikKKwkgKi8KKwl2b2lkICgqY2FsbGJhY2spIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9kZXZpY2VfY21kICpjbWQsCisJCQkgIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCk7CisKKwkvKiBUaGUgQ01EX1NJWkVfSFVHRSBmbGFnIGJpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tbWFuZAorCSAqIHN0cnVjdHVyZSBpcyBzdG9yZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2hhcmVkIHF1ZXVlIG1lbW9yeS4gKi8KKwl1MzIgZmxhZ3M7CisKKwkgREVGSU5FX0RNQV9VTk1BUF9BRERSKG1hcHBpbmcpOworCSBERUZJTkVfRE1BX1VOTUFQX0xFTihsZW4pOworfTsKKworLyoKKyAqIEdlbmVyaWMgcXVldWUgc3RydWN0dXJlCisgKgorICogQ29udGFpbnMgY29tbW9uIGRhdGEgZm9yIFJ4IGFuZCBUeCBxdWV1ZXMKKyAqLworc3RydWN0IGlsX3F1ZXVlIHsKKwlpbnQgbl9iZDsJCS8qIG51bWJlciBvZiBCRHMgaW4gdGhpcyBxdWV1ZSAqLworCWludCB3cml0ZV9wdHI7CQkvKiAxLXN0IGVtcHR5IGVudHJ5IChpZHgpIGhvc3RfdyAqLworCWludCByZWFkX3B0cjsJCS8qIGxhc3QgdXNlZCBlbnRyeSAoaWR4KSBob3N0X3IgKi8KKwkvKiB1c2UgZm9yIG1vbml0b3JpbmcgYW5kIHJlY292ZXJpbmcgdGhlIHN0dWNrIHF1ZXVlICovCisJZG1hX2FkZHJfdCBkbWFfYWRkcjsJLyogcGh5c2ljYWwgYWRkciBmb3IgQkQncyAqLworCWludCBuX3dpbjsJCS8qIHNhZmUgcXVldWUgd2luICovCisJdTMyIGlkOworCWludCBsb3dfbWFyazsJCS8qIGxvdyB3YXRlcm1hcmssIHJlc3VtZSBxdWV1ZSBpZiBmcmVlCisJCQkJICogc3BhY2UgbW9yZSB0aGFuIHRoaXMgKi8KKwlpbnQgaGlnaF9tYXJrOwkJLyogaGlnaCB3YXRlcm1hcmssIHN0b3AgcXVldWUgaWYgZnJlZQorCQkJCSAqIHNwYWNlIGxlc3MgdGhhbiB0aGlzICovCit9OworCisvKiBPbmUgZm9yIGVhY2ggVEZEICovCitzdHJ1Y3QgaWxfdHhfaW5mbyB7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7Cit9OworCisvKioKKyAqIHN0cnVjdCBpbF90eF9xdWV1ZSAtIFR4IFF1ZXVlIGZvciBETUEKKyAqIEBxOiBnZW5lcmljIFJ4L1R4IHF1ZXVlIGRlc2NyaXB0b3IKKyAqIEBiZDogYmFzZSBvZiBjaXJjdWxhciBidWZmZXIgb2YgVEZEcworICogQGNtZDogYXJyYXkgb2YgY29tbWFuZC9UWCBidWZmZXIgcG9pbnRlcnMKKyAqIEBtZXRhOiBhcnJheSBvZiBtZXRhIGRhdGEgZm9yIGVhY2ggY29tbWFuZC90eCBidWZmZXIKKyAqIEBkbWFfYWRkcl9jbWQ6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgY21kL3R4IGJ1ZmZlciBhcnJheQorICogQHR4YjogYXJyYXkgb2YgcGVyLVRGRCBkcml2ZXIgZGF0YQorICogQHRpbWVfc3RhbXA6IHRpbWUgKGluIGppZmZpZXMpIG9mIGxhc3QgcmVhZF9wdHIgY2hhbmdlCisgKiBAbmVlZF91cGRhdGU6IGluZGljYXRlcyBuZWVkIHRvIHVwZGF0ZSByZWFkL3dyaXRlIGlkeAorICogQHNjaGVkX3JldHJ5OiBpbmRpY2F0ZXMgcXVldWUgaXMgaGlnaC10aHJvdWdocHV0IGFnZ3JlZ2F0aW9uIChIVCBBR0cpIGVuYWJsZWQKKyAqCisgKiBBIFR4IHF1ZXVlIGNvbnNpc3RzIG9mIGNpcmN1bGFyIGJ1ZmZlciBvZiBCRHMgKGEuay5hLiBURkRzLCB0cmFuc21pdCBmcmFtZQorICogZGVzY3JpcHRvcnMpIGFuZCByZXF1aXJlZCBsb2NraW5nIHN0cnVjdHVyZXMuCisgKi8KKyNkZWZpbmUgVEZEX1RYX0NNRF9TTE9UUyAyNTYKKyNkZWZpbmUgVEZEX0NNRF9TTE9UUyAzMgorCitzdHJ1Y3QgaWxfdHhfcXVldWUgeworCXN0cnVjdCBpbF9xdWV1ZSBxOworCXZvaWQgKnRmZHM7CisJc3RydWN0IGlsX2RldmljZV9jbWQgKipjbWQ7CisJc3RydWN0IGlsX2NtZF9tZXRhICptZXRhOworCXN0cnVjdCBpbF90eF9pbmZvICp0eGI7CisJdW5zaWduZWQgbG9uZyB0aW1lX3N0YW1wOworCXU4IG5lZWRfdXBkYXRlOworCXU4IHNjaGVkX3JldHJ5OworCXU4IGFjdGl2ZTsKKwl1OCBzd3FfaWQ7Cit9OworCisvKgorICogRUVQUk9NIGFjY2VzcyB0aW1lIHZhbHVlczoKKyAqCisgKiBEcml2ZXIgaW5pdGlhdGVzIEVFUFJPTSByZWFkIGJ5IHdyaXRpbmcgYnl0ZSBhZGRyZXNzIDw8IDEgdG8gQ1NSX0VFUFJPTV9SRUcuCisgKiBEcml2ZXIgdGhlbiBwb2xscyBDU1JfRUVQUk9NX1JFRyBmb3IgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0sgKDB4MSkuCisgKiBXaGVuIHBvbGxpbmcsIHdhaXQgMTAgdVNlYyBiZXR3ZWVuIHBvbGxpbmcgbG9vcHMsIHVwIHRvIGEgbWF4aW11bSA1MDAwIHVTZWMuCisgKiBEcml2ZXIgcmVhZHMgMTYtYml0IHZhbHVlIGZyb20gYml0cyAzMS0xNiBvZiBDU1JfRUVQUk9NX1JFRy4KKyAqLworI2RlZmluZSBJTF9FRVBST01fQUNDRVNTX1RJTUVPVVQJNTAwMAkvKiB1U2VjICovCisKKyNkZWZpbmUgSUxfRUVQUk9NX1NFTV9USU1FT1VUCQkxMAkvKiBtaWNyb3NlY29uZHMgKi8KKyNkZWZpbmUgSUxfRUVQUk9NX1NFTV9SRVRSWV9MSU1JVAkxMDAwCS8qIG51bWJlciBvZiBhdHRlbXB0cyAobm90IHRpbWUpICovCisKKy8qCisgKiBSZWd1bGF0b3J5IGNoYW5uZWwgdXNhZ2UgZmxhZ3MgaW4gRUVQUk9NIHN0cnVjdCBpbDQ5NjVfZWVwcm9tX2NoYW5uZWwuZmxhZ3MuCisgKgorICogSUJTUyBhbmQvb3IgQVAgb3BlcmF0aW9uIGlzIGFsbG93ZWQgKm9ubHkqIG9uIHRob3NlIGNoYW5uZWxzIHdpdGgKKyAqIChWQUxJRCAmJiBJQlNTICYmIEFDVElWRSAmJiAhUkFEQVIpLiAgVGhpcyByZXN0cmljdGlvbiBpcyBpbiBwbGFjZSBiZWNhdXNlCisgKiBSQURBUiBkZXRlY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgNDk2NSBkcml2ZXIsIGJ1dCBpcyBhCisgKiByZXF1aXJlbWVudCBmb3IgZXN0YWJsaXNoaW5nIGEgbmV3IG5ldHdvcmsgZm9yIGxlZ2FsIG9wZXJhdGlvbiBvbiBjaGFubmVscworICogcmVxdWlyaW5nIFJBREFSIGRldGVjdGlvbiBvciByZXN0cmljdGluZyBBQ1RJVkUgc2Nhbm5pbmcuCisgKgorICogTk9URTogICJXSURFIiBmbGFnIGRvZXMgbm90IGluZGljYXRlIGFueXRoaW5nIGFib3V0ICJIVDQwIiA0MCBNSHogY2hhbm5lbHMuCisgKiAgICAgICAgSXQgb25seSBpbmRpY2F0ZXMgdGhhdCAyMCBNSHogY2hhbm5lbCB1c2UgaXMgc3VwcG9ydGVkOyBIVDQwIGNoYW5uZWwKKyAqICAgICAgICB1c2FnZSBpcyBpbmRpY2F0ZWQgYnkgYSBzZXBhcmF0ZSBzZXQgb2YgcmVndWxhdG9yeSBmbGFncyBmb3IgZWFjaAorICogICAgICAgIEhUNDAgY2hhbm5lbCBwYWlyLgorICoKKyAqIE5PVEU6ICBVc2luZyBhIGNoYW5uZWwgaW5hcHByb3ByaWF0ZWx5IHdpbGwgcmVzdWx0IGluIGEgdUNvZGUgZXJyb3IhCisgKi8KKyNkZWZpbmUgSUxfTlVNX1RYX0NBTElCX0dST1VQUyA1CitlbnVtIHsKKwlFRVBST01fQ0hBTk5FTF9WQUxJRCA9ICgxIDw8IDApLAkvKiB1c2FibGUgZm9yIHRoaXMgU0tVL2dlbyAqLworCUVFUFJPTV9DSEFOTkVMX0lCU1MgPSAoMSA8PCAxKSwJLyogdXNhYmxlIGFzIGFuIElCU1MgY2hhbm5lbCAqLworCS8qIEJpdCAyIFJlc2VydmVkICovCisJRUVQUk9NX0NIQU5ORUxfQUNUSVZFID0gKDEgPDwgMyksCS8qIGFjdGl2ZSBzY2FubmluZyBhbGxvd2VkICovCisJRUVQUk9NX0NIQU5ORUxfUkFEQVIgPSAoMSA8PCA0KSwJLyogcmFkYXIgZGV0ZWN0aW9uIHJlcXVpcmVkICovCisJRUVQUk9NX0NIQU5ORUxfV0lERSA9ICgxIDw8IDUpLAkvKiAyMCBNSHogY2hhbm5lbCBva2F5ICovCisJLyogQml0IDYgUmVzZXJ2ZWQgKHdhcyBOYXJyb3cgQ2hhbm5lbCkgKi8KKwlFRVBST01fQ0hBTk5FTF9ERlMgPSAoMSA8PCA3KSwJLyogZHluYW1pYyBmcmVxIHNlbGVjdGlvbiBjYW5kaWRhdGUgKi8KK307CisKKy8qIFNLVSBDYXBhYmlsaXRpZXMgKi8KKy8qIDM5NDUgb25seSAqLworI2RlZmluZSBFRVBST01fU0tVX0NBUF9TV19SRl9LSUxMX0VOQUJMRSAgICAgICAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBFRVBST01fU0tVX0NBUF9IV19SRl9LSUxMX0VOQUJMRSAgICAgICAgICAgICAgICAoMSA8PCAxKQorCisvKiAqcmVndWxhdG9yeSogY2hhbm5lbCBkYXRhIGZvcm1hdCBpbiBlZXByb20sIG9uZSBmb3IgZWFjaCBjaGFubmVsLgorICogVGhlcmUgYXJlIHNlcGFyYXRlIGVudHJpZXMgZm9yIEhUNDAgKDQwIE1IeikgdnMuIG5vcm1hbCAoMjAgTUh6KSBjaGFubmVscy4gKi8KK3N0cnVjdCBpbF9lZXByb21fY2hhbm5lbCB7CisJdTggZmxhZ3M7CQkvKiBFRVBST01fQ0hBTk5FTF8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLworCXM4IG1heF9wb3dlcl9hdmc7CS8qIG1heCBwb3dlciAoZEJtKSBvbiB0aGlzIGNobmwsIGxpbWl0IDMxICovCit9IF9fcGFja2VkOworCisvKiAzOTQ1IFNwZWNpZmljICovCisjZGVmaW5lIEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OCSgweDJmKQorCisvKiA0OTY1IGhhcyB0d28gcmFkaW8gdHJhbnNtaXR0ZXJzIChhbmQgMyByYWRpbyByZWNlaXZlcnMpICovCisjZGVmaW5lIEVFUFJPTV9UWF9QT1dFUl9UWF9DSEFJTlMgICAgICAoMikKKworLyogNDk2NSBoYXMgcm9vbSBmb3IgdXAgdG8gOCBzZXRzIG9mIHR4cG93ZXIgY2FsaWJyYXRpb24gZGF0YSAqLworI2RlZmluZSBFRVBST01fVFhfUE9XRVJfQkFORFMgICAgICAgICAgKDgpCisKKy8qIDQ5NjUgZmFjdG9yeSBjYWxpYnJhdGlvbiBtZWFzdXJlcyB0eHBvd2VyIGdhaW4gc2V0dGluZ3MgZm9yCisgKiBlYWNoIG9mIDMgdGFyZ2V0IG91dHB1dCBsZXZlbHMgKi8KKyNkZWZpbmUgRUVQUk9NX1RYX1BPV0VSX01FQVNVUkVNRU5UUyAgICgzKQorCisvKiA0OTY1IFNwZWNpZmljICovCisvKiA0OTY1IGRyaXZlciBkb2VzIG5vdCB3b3JrIHdpdGggdHhwb3dlciBjYWxpYnJhdGlvbiB2ZXJzaW9uIDwgNSAqLworI2RlZmluZSBFRVBST01fNDk2NV9UWF9QT1dFUl9WRVJTSU9OICAgICg1KQorI2RlZmluZSBFRVBST01fNDk2NV9FRVBST01fVkVSU0lPTgkoMHgyZikKKyNkZWZpbmUgRUVQUk9NXzQ5NjVfQ0FMSUJfVkVSU0lPTl9PRkZTRVQgICAgICAgKDIqMHhCNikJLyogMiBieXRlcyAqLworI2RlZmluZSBFRVBST01fNDk2NV9DQUxJQl9UWFBPV0VSX09GRlNFVCAgICAgICAoMioweEU4KQkvKiA0OCAgYnl0ZXMgKi8KKyNkZWZpbmUgRUVQUk9NXzQ5NjVfQk9BUkRfUkVWSVNJT04gICAgICAgICAgICAgKDIqMHg0RikJLyogMiBieXRlcyAqLworI2RlZmluZSBFRVBST01fNDk2NV9CT0FSRF9QQkEgICAgICAgICAgICAgICAgICAoMioweDU2KzEpCS8qIDkgYnl0ZXMgKi8KKworLyogMi40IEdIeiAqLworZXh0ZXJuIGNvbnN0IHU4IGlsX2VlcHJvbV9iYW5kXzFbMTRdOworCisvKgorICogZmFjdG9yeSBjYWxpYnJhdGlvbiBkYXRhIGZvciBvbmUgdHhwb3dlciBsZXZlbCwgb24gb25lIGNoYW5uZWwsCisgKiBtZWFzdXJlZCBvbiBvbmUgb2YgdGhlIDIgdHggY2hhaW5zIChyYWRpbyB0cmFuc21pdHRlciBhbmQgYXNzb2NpYXRlZAorICogYW50ZW5uYSkuICBFRVBST00gY29udGFpbnM6CisgKgorICogMSkgIFRlbXBlcmF0dXJlIChkZWdyZWVzIENlbHNpdXMpIG9mIGRldmljZSB3aGVuIG1lYXN1cmVtZW50IHdhcyBtYWRlLgorICoKKyAqIDIpICBHYWluIHRhYmxlIGlkeCB1c2VkIHRvIGFjaGlldmUgdGhlIHRhcmdldCBtZWFzdXJlbWVudCBwb3dlci4KKyAqICAgICBUaGlzIHJlZmVycyB0byB0aGUgIndlbGwta25vd24iIGdhaW4gdGFibGVzIChzZWUgNDk2NS5oKS4KKyAqCisgKiAzKSAgQWN0dWFsIG1lYXN1cmVkIG91dHB1dCBwb3dlciwgaW4gaGFsZi1kQm0gKCIzNCIgPSAxNyBkQm0pLgorICoKKyAqIDQpICBSRiBwb3dlciBhbXBsaWZpZXIgZGV0ZWN0b3IgbGV2ZWwgbWVhc3VyZW1lbnQgKG5vdCB1c2VkKS4KKyAqLworc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9tZWFzdXJlIHsKKwl1OCB0ZW1wZXJhdHVyZTsJCS8qIERldmljZSB0ZW1wZXJhdHVyZSAoQ2Vsc2l1cykgKi8KKwl1OCBnYWluX2lkeDsJCS8qIEluZGV4IGludG8gZ2FpbiB0YWJsZSAqLworCXU4IGFjdHVhbF9wb3c7CQkvKiBNZWFzdXJlZCBSRiBvdXRwdXQgcG93ZXIsIGhhbGYtZEJtICovCisJczggcGFfZGV0OwkJLyogUG93ZXIgYW1wIGRldGVjdG9yIGxldmVsIChub3QgdXNlZCkgKi8KK30gX19wYWNrZWQ7CisKKy8qCisgKiBtZWFzdXJlbWVudCBzZXQgZm9yIG9uZSBjaGFubmVsLiAgRUVQUk9NIGNvbnRhaW5zOgorICoKKyAqIDEpICBDaGFubmVsIG51bWJlciBtZWFzdXJlZAorICoKKyAqIDIpICBNZWFzdXJlbWVudHMgZm9yIGVhY2ggb2YgMyBwb3dlciBsZXZlbHMgZm9yIGVhY2ggb2YgMiByYWRpbyB0cmFuc21pdHRlcnMKKyAqICAgICAoYS5rLmEuICJ0eCBjaGFpbnMiKSAoNiBtZWFzdXJlbWVudHMgYWx0b2dldGhlcikKKyAqLworc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9jaF9pbmZvIHsKKwl1OCBjaF9udW07CisJc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9tZWFzdXJlCisJICAgIG1lYXN1cmVtZW50c1tFRVBST01fVFhfUE9XRVJfVFhfQ0hBSU5TXQorCSAgICBbRUVQUk9NX1RYX1BPV0VSX01FQVNVUkVNRU5UU107Cit9IF9fcGFja2VkOworCisvKgorICogdHhwb3dlciBzdWJiYW5kIGluZm8uCisgKgorICogRm9yIGVhY2ggZnJlcXVlbmN5IHN1YmJhbmQsIEVFUFJPTSBjb250YWlucyB0aGUgZm9sbG93aW5nOgorICoKKyAqIDEpICBGaXJzdCBhbmQgbGFzdCBjaGFubmVscyB3aXRoaW4gcmFuZ2Ugb2YgdGhlIHN1YmJhbmQuICAiMCIgdmFsdWVzCisgKiAgICAgaW5kaWNhdGUgdGhhdCB0aGlzIHNhbXBsZSBzZXQgaXMgbm90IGJlaW5nIHVzZWQuCisgKgorICogMikgIFNhbXBsZSBtZWFzdXJlbWVudCBzZXRzIGZvciAyIGNoYW5uZWxzIGNsb3NlIHRvIHRoZSByYW5nZSBlbmRwb2ludHMuCisgKi8KK3N0cnVjdCBpbF9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvIHsKKwl1OCBjaF9mcm9tOwkJLyogY2hhbm5lbCBudW1iZXIgb2YgbG93ZXN0IGNoYW5uZWwgaW4gc3ViYmFuZCAqLworCXU4IGNoX3RvOwkJLyogY2hhbm5lbCBudW1iZXIgb2YgaGlnaGVzdCBjaGFubmVsIGluIHN1YmJhbmQgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2NoX2luZm8gY2gxOworCXN0cnVjdCBpbF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaDI7Cit9IF9fcGFja2VkOworCisvKgorICogdHhwb3dlciBjYWxpYnJhdGlvbiBpbmZvLiAgRUVQUk9NIGNvbnRhaW5zOgorICoKKyAqIDEpICBGYWN0b3J5LW1lYXN1cmVkIHNhdHVyYXRpb24gcG93ZXIgbGV2ZWxzIChtYXhpbXVtIGxldmVscyBhdCB3aGljaAorICogICAgIHR4IHBvd2VyIGFtcGxpZmllciBjYW4gb3V0cHV0IGEgc2lnbmFsIHdpdGhvdXQgdG9vIG11Y2ggZGlzdG9ydGlvbikuCisgKiAgICAgVGhlcmUgaXMgb25lIGxldmVsIGZvciAyLjQgR0h6IGJhbmQgYW5kIG9uZSBmb3IgNSBHSHogYmFuZC4gIFRoZXNlCisgKiAgICAgdmFsdWVzIGFwcGx5IHRvIGFsbCBjaGFubmVscyB3aXRoaW4gZWFjaCBvZiB0aGUgYmFuZHMuCisgKgorICogMikgIEZhY3RvcnktbWVhc3VyZWQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgbGV2ZWwuICBUaGlzIGlzIGFzc3VtZWQgdG8gYmUKKyAqICAgICBjb25zdGFudCAoaS5lLiBzYW1lIHZhbHVlIGFwcGxpZXMgdG8gYWxsIGNoYW5uZWxzL2JhbmRzKSB3aGlsZSB0aGUKKyAqICAgICBmYWN0b3J5IG1lYXN1cmVtZW50cyBhcmUgYmVpbmcgbWFkZS4KKyAqCisgKiAzKSAgVXAgdG8gOCBzZXRzIG9mIGZhY3RvcnktbWVhc3VyZWQgdHhwb3dlciBjYWxpYnJhdGlvbiB2YWx1ZXMuCisgKiAgICAgVGhlc2UgYXJlIGZvciBkaWZmZXJlbnQgZnJlcXVlbmN5IHJhbmdlcywgc2luY2UgdHhwb3dlciBnYWluCisgKiAgICAgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBhbmFsb2cgcmFkaW8gY2lyY3VpdHJ5IHZhcnkgd2l0aCBmcmVxdWVuY3kuCisgKgorICogICAgIE5vdCBhbGwgc2V0cyBuZWVkIHRvIGJlIGZpbGxlZCB3aXRoIGRhdGE7CisgKiAgICAgc3RydWN0IGlsX2VlcHJvbV9jYWxpYl9zdWJiYW5kX2luZm8gY29udGFpbnMgcmFuZ2Ugb2YgY2hhbm5lbHMKKyAqICAgICAoMCBpZiB1bnVzZWQpIGZvciBlYWNoIHNldCBvZiBkYXRhLgorICovCitzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2luZm8geworCXU4IHNhdHVyYXRpb25fcG93ZXIyNDsJLyogaGFsZi1kQm0gKGUuZy4gIjM0IiA9IDE3IGRCbSkgKi8KKwl1OCBzYXR1cmF0aW9uX3Bvd2VyNTI7CS8qIGhhbGYtZEJtICovCisJX19sZTE2IHZvbHRhZ2U7CQkvKiBzaWduZWQgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX3N1YmJhbmRfaW5mbyBiYW5kX2luZm9bRUVQUk9NX1RYX1BPV0VSX0JBTkRTXTsKK30gX19wYWNrZWQ7CisKKy8qIEdlbmVyYWwgKi8KKyNkZWZpbmUgRUVQUk9NX0RFVklDRV9JRCAgICAgICAgICAgICAgICAgICAgKDIqMHgwOCkJLyogMiBieXRlcyAqLworI2RlZmluZSBFRVBST01fTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgICAoMioweDE1KQkvKiA2ICBieXRlcyAqLworI2RlZmluZSBFRVBST01fQk9BUkRfUkVWSVNJT04gICAgICAgICAgICAgICAoMioweDM1KQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fQk9BUkRfUEJBX05VTUJFUiAgICAgICAgICAgICAoMioweDNCKzEpCS8qIDkgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICgyKjB4NDQpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9TS1VfQ0FQICAgICAgICAgICAgICAgICAgICAgICgyKjB4NDUpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9PRU1fTU9ERSAgICAgICAgICAgICAgICAgICAgICgyKjB4NDYpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9XT1dMQU5fTU9ERSAgICAgICAgICAgICAgICAgICgyKjB4NDcpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9SQURJT19DT05GSUcgICAgICAgICAgICAgICAgICgyKjB4NDgpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9OVU1fTUFDX0FERFJFU1MgICAgICAgICAgICAgICgyKjB4NEMpCS8qIDIgIGJ5dGVzICovCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFza3MgYXJlIHRvIGJlIGFwcGxpZWQgb24gRUVQUk9NX1JBRElPX0NPTkZJRyAqLworI2RlZmluZSBFRVBST01fUkZfQ0ZHX1RZUEVfTVNLKHgpICAgKHggJiAweDMpCS8qIGJpdHMgMC0xICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19TVEVQX01TSyh4KSAgICgoeCA+PiAyKSAgJiAweDMpCS8qIGJpdHMgMi0zICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19EQVNIX01TSyh4KSAgICgoeCA+PiA0KSAgJiAweDMpCS8qIGJpdHMgNC01ICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19QTlVNX01TSyh4KSAgICgoeCA+PiA2KSAgJiAweDMpCS8qIGJpdHMgNi03ICAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19UWF9BTlRfTVNLKHgpICgoeCA+PiA4KSAgJiAweEYpCS8qIGJpdHMgOC0xMSAgKi8KKyNkZWZpbmUgRUVQUk9NX1JGX0NGR19SWF9BTlRfTVNLKHgpICgoeCA+PiAxMikgJiAweEYpCS8qIGJpdHMgMTItMTUgKi8KKworI2RlZmluZSBFRVBST01fMzk0NV9SRl9DRkdfVFlQRV9NQVggIDB4MAorI2RlZmluZSBFRVBST01fNDk2NV9SRl9DRkdfVFlQRV9NQVggIDB4MQorCisvKgorICogUGVyLWNoYW5uZWwgcmVndWxhdG9yeSBkYXRhLgorICoKKyAqIEVhY2ggY2hhbm5lbCB0aGF0ICptaWdodCogYmUgc3VwcG9ydGVkIGJ5IGl3bCBoYXMgYSBmaXhlZCBsb2NhdGlvbgorICogaW4gRUVQUk9NIGNvbnRhaW5pbmcgRUVQUk9NX0NIQU5ORUxfKiB1c2FnZSBmbGFncyAoTFNCKSBhbmQgbWF4IHJlZ3VsYXRvcnkKKyAqIHR4cG93ZXIgKE1TQikuCisgKgorICogRW50cmllcyBpbW1lZGlhdGVseSBiZWxvdyBhcmUgZm9yIDIwIE1IeiBjaGFubmVsIHdpZHRoLiAgSFQ0MCAoNDAgTUh6KQorICogY2hhbm5lbHMgKG9ubHkgZm9yIDQ5NjUsIG5vdCBzdXBwb3J0ZWQgYnkgMzk0NSkgYXBwZWFyIGxhdGVyIGluIHRoZSBFRVBST00uCisgKgorICogMi40IEdIeiBjaGFubmVscyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKKyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9TS1VfSUQgICAgICAgICAgICAoMioweDYwKQkvKiA0ICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzEgICAgICAgICAgICAoMioweDYyKQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzFfQ0hBTk5FTFMgICAoMioweDYzKQkvKiAyOCBieXRlcyAqLworCisvKgorICogNC45IEdIeiBjaGFubmVscyAxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5LCAxOTIsIDE5NiwKKyAqIDUuMCBHSHogY2hhbm5lbHMgNywgOCwgMTEsIDEyLCAxNgorICogKDQ5MTUtNTA4ME1IeikgKG5vbmUgb2YgdGhlc2UgaXMgZXZlciBzdXBwb3J0ZWQpCisgKi8KKyNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yICAgICAgICAgICAgKDIqMHg3MSkJLyogMiAgYnl0ZXMgKi8KKyNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yX0NIQU5ORUxTICAgKDIqMHg3MikJLyogMjYgYnl0ZXMgKi8KKworLyoKKyAqIDUuMiBHSHogY2hhbm5lbHMgMzQsIDM2LCAzOCwgNDAsIDQyLCA0NCwgNDYsIDQ4LCA1MiwgNTYsIDYwLCA2NAorICogKDUxNzAtNTMyME1IeikKKyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzMgICAgICAgICAgICAoMioweDdGKQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzNfQ0hBTk5FTFMgICAoMioweDgwKQkvKiAyNCBieXRlcyAqLworCisvKgorICogNS41IEdIeiBjaGFubmVscyAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAorICogKDU1MDAtNTcwME1IeikKKyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzQgICAgICAgICAgICAoMioweDhDKQkvKiAyICBieXRlcyAqLworI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzRfQ0hBTk5FTFMgICAoMioweDhEKQkvKiAyMiBieXRlcyAqLworCisvKgorICogNS43IEdIeiBjaGFubmVscyAxNDUsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1CisgKiAoNTcyNS01ODI1TUh6KQorICovCisjZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNSAgICAgICAgICAgICgyKjB4OTgpCS8qIDIgIGJ5dGVzICovCisjZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNV9DSEFOTkVMUyAgICgyKjB4OTkpCS8qIDEyIGJ5dGVzICovCisKKy8qCisgKiAyLjQgR0h6IEhUNDAgY2hhbm5lbHMgMSAoNSksIDIgKDYpLCAzICg3KSwgNCAoOCksIDUgKDkpLCA2ICgxMCksIDcgKDExKQorICoKKyAqIFRoZSBjaGFubmVsIGxpc3RlZCBpcyB0aGUgY2VudGVyIG9mIHRoZSBsb3dlciAyMCBNSHogaGFsZiBvZiB0aGUgY2hhbm5lbC4KKyAqIFRoZSBvdmVyYWxsIGNlbnRlciBmcmVxdWVuY3kgaXMgYWN0dWFsbHkgMiBjaGFubmVscyAoMTAgTUh6KSBhYm92ZSB0aGF0LAorICogYW5kIHRoZSB1cHBlciBoYWxmIG9mIGVhY2ggSFQ0MCBjaGFubmVsIGlzIGNlbnRlcmVkIDQgY2hhbm5lbHMgKDIwIE1IeikgYXdheQorICogZnJvbSB0aGUgbG93ZXIgaGFsZjsgZS5nLiB0aGUgdXBwZXIgaGFsZiBvZiBIVDQwIGNoYW5uZWwgMSBpcyBjaGFubmVsIDUsCisgKiBhbmQgdGhlIG92ZXJhbGwgSFQ0MCBjaGFubmVsIHdpZHRoIGNlbnRlcnMgb24gY2hhbm5lbCAzLgorICoKKyAqIE5PVEU6ICBUaGUgUlhPTiBjb21tYW5kIHVzZXMgMjAgTUh6IGNoYW5uZWwgbnVtYmVycyB0byBzcGVjaWZ5IHRoZQorICogICAgICAgIGNvbnRyb2wgY2hhbm5lbCB0byB3aGljaCB0byB0dW5lLiAgUlhPTiBhbHNvIHNwZWNpZmllcyB3aGV0aGVyIHRoZQorICogICAgICAgIGNvbnRyb2wgY2hhbm5lbCBpcyB0aGUgdXBwZXIgb3IgbG93ZXIgaGFsZiBvZiBhIEhUNDAgY2hhbm5lbC4KKyAqCisgKiBOT1RFOiAgNDk2NSBkb2VzIG5vdCBzdXBwb3J0IEhUNDAgY2hhbm5lbHMgb24gMi40IEdIei4KKyAqLworI2RlZmluZSBFRVBST01fNDk2NV9SRUdVTEFUT1JZX0JBTkRfMjRfSFQ0MF9DSEFOTkVMUyAoMioweEEwKQkvKiAxNCBieXRlcyAqLworCisvKgorICogNS4yIEdIeiBIVDQwIGNoYW5uZWxzIDM2ICg0MCksIDQ0ICg0OCksIDUyICg1NiksIDYwICg2NCksCisgKiAxMDAgKDEwNCksIDEwOCAoMTEyKSwgMTE2ICgxMjApLCAxMjQgKDEyOCksIDEzMiAoMTM2KSwgMTQ5ICgxNTMpLCAxNTcgKDE2MSkKKyAqLworI2RlZmluZSBFRVBST01fNDk2NV9SRUdVTEFUT1JZX0JBTkRfNTJfSFQ0MF9DSEFOTkVMUyAoMioweEE4KQkvKiAyMiBieXRlcyAqLworCisjZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MAkJCSgwKQorCitzdHJ1Y3QgaWxfZWVwcm9tX29wcyB7CisJY29uc3QgdTMyIHJlZ3VsYXRvcnlfYmFuZHNbN107CisJaW50ICgqYWNxdWlyZV9zZW1hcGhvcmUpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCXZvaWQgKCpyZWxlYXNlX3NlbWFwaG9yZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7Cit9OworCitpbnQgaWxfZWVwcm9tX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfZWVwcm9tX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsKTsKK2NvbnN0IHU4ICppbF9lZXByb21fcXVlcnlfYWRkcihjb25zdCBzdHJ1Y3QgaWxfcHJpdiAqaWwsIHNpemVfdCBvZmZzZXQpOwordTE2IGlsX2VlcHJvbV9xdWVyeTE2KGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwgc2l6ZV90IG9mZnNldCk7CitpbnQgaWxfaW5pdF9jaGFubmVsX21hcChzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF9mcmVlX2NoYW5uZWxfbWFwKHN0cnVjdCBpbF9wcml2ICppbCk7Citjb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICppbF9nZXRfY2hhbm5lbF9pbmZvKGNvbnN0IHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkJCSAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJCQkJICB1MTYgY2hhbm5lbCk7CisKKyNkZWZpbmUgSUxfTlVNX1NDQU5fUkFURVMgICAgICAgICAoMikKKworc3RydWN0IGlsNDk2NV9jaGFubmVsX3RnZF9pbmZvIHsKKwl1OCB0eXBlOworCXM4IG1heF9wb3dlcjsKK307CisKK3N0cnVjdCBpbDQ5NjVfY2hhbm5lbF90Z2hfaW5mbyB7CisJczY0IGxhc3RfcmFkYXJfdGltZTsKK307CisKKyNkZWZpbmUgSUw0OTY1X01BWF9SQVRFICgzMykKKworc3RydWN0IGlsMzk0NV9jbGlwX2dyb3VwIHsKKwkvKiBtYXhpbXVtIHBvd2VyIGxldmVsIHRvIHByZXZlbnQgY2xpcHBpbmcgZm9yIGVhY2ggcmF0ZSwgZGVyaXZlZCBieQorCSAqICAgdXMgZnJvbSB0aGlzIGJhbmQncyBzYXR1cmF0aW9uIHBvd2VyIGluIEVFUFJPTSAqLworCWNvbnN0IHM4IGNsaXBfcG93ZXJzW0lMX01BWF9SQVRFU107Cit9OworCisvKiBjdXJyZW50IFR4IHBvd2VyIHZhbHVlcyB0byB1c2UsIG9uZSBmb3IgZWFjaCByYXRlIGZvciBlYWNoIGNoYW5uZWwuCisgKiByZXF1ZXN0ZWQgcG93ZXIgaXMgbGltaXRlZCBieToKKyAqIC0tIHJlZ3VsYXRvcnkgRUVQUk9NIGxpbWl0cyBmb3IgdGhpcyBjaGFubmVsCisgKiAtLSBoYXJkd2FyZSBjYXBhYmlsaXRpZXMgKGNsaXAtcG93ZXJzKQorICogLS0gc3BlY3RydW0gbWFuYWdlbWVudAorICogLS0gdXNlciBwcmVmZXJlbmNlIChlLmcuIGl3Y29uZmlnKQorICogd2hlbiByZXF1ZXN0ZWQgcG93ZXIgaXMgc2V0LCBiYXNlIHBvd2VyIGlkeCBtdXN0IGFsc28gYmUgc2V0LiAqLworc3RydWN0IGlsMzk0NV9jaGFubmVsX3Bvd2VyX2luZm8geworCXN0cnVjdCBpbDM5NDVfdHhfcG93ZXIgdHBjOwkvKiBhY3R1YWwgcmFkaW8gYW5kIERTUCBnYWluIHNldHRpbmdzICovCisJczggcG93ZXJfdGFibGVfaWR4OwkvKiBhY3R1YWwgKGNvbXBlbnN0J2QpIGlkeCBpbnRvIGdhaW4gdGFibGUgKi8KKwlzOCBiYXNlX3Bvd2VyX2lkeDsJLyogZ2FpbiBpZHggZm9yIHBvd2VyIGF0IGZhY3RvcnkgdGVtcC4gKi8KKwlzOCByZXF1ZXN0ZWRfcG93ZXI7CS8qIHBvd2VyIChkQm0pIHJlcXVlc3RlZCBmb3IgdGhpcyBjaG5sL3JhdGUgKi8KK307CisKKy8qIGN1cnJlbnQgc2NhbiBUeCBwb3dlciB2YWx1ZXMgdG8gdXNlLCBvbmUgZm9yIGVhY2ggc2NhbiByYXRlIGZvciBlYWNoCisgKiBjaGFubmVsLiAqLworc3RydWN0IGlsMzk0NV9zY2FuX3Bvd2VyX2luZm8geworCXN0cnVjdCBpbDM5NDVfdHhfcG93ZXIgdHBjOwkvKiBhY3R1YWwgcmFkaW8gYW5kIERTUCBnYWluIHNldHRpbmdzICovCisJczggcG93ZXJfdGFibGVfaWR4OwkvKiBhY3R1YWwgKGNvbXBlbnN0J2QpIGlkeCBpbnRvIGdhaW4gdGFibGUgKi8KKwlzOCByZXF1ZXN0ZWRfcG93ZXI7CS8qIHNjYW4gcHdyIChkQm0pIHJlcXVlc3RlZCBmb3IgY2hubC9yYXRlICovCit9OworCisvKgorICogT25lIGZvciBlYWNoIGNoYW5uZWwsIGhvbGRzIGFsbCBjaGFubmVsIHNldHVwIGRhdGEKKyAqIFNvbWUgb2YgdGhlIGZpZWxkcyAoZS5nLiBlZXByb20gYW5kIGZsYWdzL21heF9wb3dlcl9hdmcpIGFyZSByZWR1bmRhbnQKKyAqICAgICB3aXRoIG9uZSBhbm90aGVyIQorICovCitzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvIHsKKwlzdHJ1Y3QgaWw0OTY1X2NoYW5uZWxfdGdkX2luZm8gdGdkOworCXN0cnVjdCBpbDQ5NjVfY2hhbm5lbF90Z2hfaW5mbyB0Z2g7CisJc3RydWN0IGlsX2VlcHJvbV9jaGFubmVsIGVlcHJvbTsJLyogRUVQUk9NIHJlZ3VsYXRvcnkgbGltaXQgKi8KKwlzdHJ1Y3QgaWxfZWVwcm9tX2NoYW5uZWwgaHQ0MF9lZXByb207CS8qIEVFUFJPTSByZWd1bGF0b3J5IGxpbWl0IGZvcgorCQkJCQkJICogSFQ0MCBjaGFubmVsICovCisKKwl1OCBjaGFubmVsOwkJLyogY2hhbm5lbCBudW1iZXIgKi8KKwl1OCBmbGFnczsJCS8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLworCXM4IG1heF9wb3dlcl9hdmc7CS8qIChkQm0pIHJlZ3VsLiBlZXByb20sIG5vcm1hbCBUeCwgYW55IHJhdGUgKi8KKwlzOCBjdXJyX3R4cG93OwkJLyogKGRCbSkgcmVndWxhdG9yeS9zcGVjdHJ1bS91c2VyIChub3QgaC93KSBsaW1pdCAqLworCXM4IG1pbl9wb3dlcjsJCS8qIGFsd2F5cyAwICovCisJczggc2Nhbl9wb3dlcjsJCS8qIChkQm0pIHJlZ3VsLiBlZXByb20sIGRpcmVjdCBzY2FucywgYW55IHJhdGUgKi8KKworCXU4IGdyb3VwX2lkeDsJCS8qIDAtNCwgbWFwcyBjaGFubmVsIHRvIGdyb3VwMS8yLzMvNC81ICovCisJdTggYmFuZF9pZHg7CQkvKiAwLTQsIG1hcHMgY2hhbm5lbCB0byBiYW5kMS8yLzMvNC81ICovCisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCisJLyogSFQ0MCBjaGFubmVsIGluZm8gKi8KKwlzOCBodDQwX21heF9wb3dlcl9hdmc7CS8qIChkQm0pIHJlZ3VsLiBlZXByb20sIG5vcm1hbCBUeCwgYW55IHJhdGUgKi8KKwl1OCBodDQwX2ZsYWdzOwkJLyogZmxhZ3MgY29waWVkIGZyb20gRUVQUk9NICovCisJdTggaHQ0MF9leHRlbnNpb25fY2hhbm5lbDsJLyogSFRfSUVfRVhUX0NIQU5ORUxfKiAqLworCisJLyogUmFkaW8vRFNQIGdhaW4gc2V0dGluZ3MgZm9yIGVhY2ggIm5vcm1hbCIgZGF0YSBUeCByYXRlLgorCSAqIFRoZXNlIGluY2x1ZGUsIGluIGFkZGl0aW9uIHRvIFJGIGFuZCBEU1AgZ2FpbiwgYSBmZXcgZmllbGRzIGZvcgorCSAqICAgcmVtZW1iZXJpbmcvbW9kaWZ5aW5nIGdhaW4gc2V0dGluZ3MgKGlkeGVzKS4gKi8KKwlzdHJ1Y3QgaWwzOTQ1X2NoYW5uZWxfcG93ZXJfaW5mbyBwb3dlcl9pbmZvW0lMNDk2NV9NQVhfUkFURV07CisKKwkvKiBSYWRpby9EU1AgZ2FpbiBzZXR0aW5ncyBmb3IgZWFjaCBzY2FuIHJhdGUsIGZvciBkaXJlY3RlZCBzY2Fucy4gKi8KKwlzdHJ1Y3QgaWwzOTQ1X3NjYW5fcG93ZXJfaW5mbyBzY2FuX3B3cl9pbmZvW0lMX05VTV9TQ0FOX1JBVEVTXTsKK307CisKKyNkZWZpbmUgSUxfVFhfRklGT19CSwkJMAkvKiBzaGFyZWQgKi8KKyNkZWZpbmUgSUxfVFhfRklGT19CRQkJMQorI2RlZmluZSBJTF9UWF9GSUZPX1ZJCQkyCS8qIHNoYXJlZCAqLworI2RlZmluZSBJTF9UWF9GSUZPX1ZPCQkzCisjZGVmaW5lIElMX1RYX0ZJRk9fVU5VU0VECS0xCisKKy8qIE1pbmltdW0gbnVtYmVyIG9mIHF1ZXVlcy4gTUFYX05VTSBpcyBkZWZpbmVkIGluIGh3IHNwZWNpZmljIGZpbGVzLgorICogU2V0IHRoZSBtaW5pbXVtIHRvIGFjY29tbW9kYXRlIHRoZSA0IHN0YW5kYXJkIFRYIHF1ZXVlcywgMSBjb21tYW5kCisgKiBxdWV1ZSwgMiAodW51c2VkKSBIQ0NBIHF1ZXVlcywgYW5kIDQgSFQgcXVldWVzIChvbmUgZm9yIGVhY2ggQUMpICovCisjZGVmaW5lIElMX01JTl9OVU1fUVVFVUVTCTEwCisKKyNkZWZpbmUgSUxfREVGQVVMVF9DTURfUVVFVUVfTlVNCTQKKworI2RlZmluZSBJRUVFODAyMTFfREFUQV9MRU4gICAgICAgICAgICAgIDIzMDQKKyNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAgICAgICAgICAgICAzMAorI2RlZmluZSBJRUVFODAyMTFfSExFTiAgICAgICAgICAgICAgICAgIChJRUVFODAyMTFfNEFERFJfTEVOKQorI2RlZmluZSBJRUVFODAyMTFfRlJBTUVfTEVOICAgICAgICAgICAgIChJRUVFODAyMTFfREFUQV9MRU4gKyBJRUVFODAyMTFfSExFTikKKworc3RydWN0IGlsX2ZyYW1lIHsKKwl1bmlvbiB7CisJCXN0cnVjdCBpZWVlODAyMTFfaGRyIGZyYW1lOworCQlzdHJ1Y3QgaWxfdHhfYmVhY29uX2NtZCBiZWFjb247CisJCXU4IHJhd1tJRUVFODAyMTFfRlJBTUVfTEVOXTsKKwkJdTggY21kWzM2MF07CisJfSB1OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKKyNkZWZpbmUgU0VRX1RPX1NOKHNlcSkgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKKyNkZWZpbmUgU05fVE9fU0VRKHNzbikgKCgoc3NuKSA8PCA0KSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKKyNkZWZpbmUgTUFYX1NOICgoSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQorCitlbnVtIHsKKwlDTURfU1lOQyA9IDAsCisJQ01EX1NJWkVfTk9STUFMID0gMCwKKwlDTURfTk9fU0tCID0gMCwKKwlDTURfU0laRV9IVUdFID0gKDEgPDwgMCksCisJQ01EX0FTWU5DID0gKDEgPDwgMSksCisJQ01EX1dBTlRfU0tCID0gKDEgPDwgMiksCisJQ01EX01BUFBFRCA9ICgxIDw8IDMpLAorfTsKKworI2RlZmluZSBERUZfQ01EX1BBWUxPQURfU0laRSAzMjAKKworLyoqCisgKiBzdHJ1Y3QgaWxfZGV2aWNlX2NtZAorICoKKyAqIEZvciBhbGxvY2F0aW9uIG9mIHRoZSBjb21tYW5kIGFuZCB0eCBxdWV1ZXMsIHRoaXMgZXN0YWJsaXNoZXMgdGhlIG92ZXJhbGwKKyAqIHNpemUgb2YgdGhlIGxhcmdlc3QgY29tbWFuZCB3ZSBzZW5kIHRvIHVDb2RlLCBleGNlcHQgZm9yIGEgc2NhbiBjb21tYW5kCisgKiAod2hpY2ggaXMgcmVsYXRpdmVseSBodWdlOyBzcGFjZSBpcyBhbGxvY2F0ZWQgc2VwYXJhdGVseSkuCisgKi8KK3N0cnVjdCBpbF9kZXZpY2VfY21kIHsKKwlzdHJ1Y3QgaWxfY21kX2hlYWRlciBoZHI7CS8qIHVDb2RlIEFQSSAqLworCXVuaW9uIHsKKwkJdTMyIGZsYWdzOworCQl1OCB2YWw4OworCQl1MTYgdmFsMTY7CisJCXUzMiB2YWwzMjsKKwkJc3RydWN0IGlsX3R4X2NtZCB0eDsKKwkJdTggcGF5bG9hZFtERUZfQ01EX1BBWUxPQURfU0laRV07CisJfSBfX3BhY2tlZCBjbWQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIFRGRF9NQVhfUEFZTE9BRF9TSVpFIChzaXplb2Yoc3RydWN0IGlsX2RldmljZV9jbWQpKQorCitzdHJ1Y3QgaWxfaG9zdF9jbWQgeworCWNvbnN0IHZvaWQgKmRhdGE7CisJdW5zaWduZWQgbG9uZyByZXBseV9wYWdlOworCXZvaWQgKCpjYWxsYmFjaykgKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCSAgc3RydWN0IGlsX3J4X3BrdCAqcGt0KTsKKwl1MzIgZmxhZ3M7CisJdTE2IGxlbjsKKwl1OCBpZDsKK307CisKKyNkZWZpbmUgU1VQX1JBVEVfMTFBX01BWF9OVU1fQ0hBTk5FTFMgIDgKKyNkZWZpbmUgU1VQX1JBVEVfMTFCX01BWF9OVU1fQ0hBTk5FTFMgIDQKKyNkZWZpbmUgU1VQX1JBVEVfMTFHX01BWF9OVU1fQ0hBTk5FTFMgIDEyCisKKy8qKgorICogc3RydWN0IGlsX3J4X3F1ZXVlIC0gUnggcXVldWUKKyAqIEBiZDogZHJpdmVyJ3MgcG9pbnRlciB0byBidWZmZXIgb2YgcmVjZWl2ZSBidWZmZXIgZGVzY3JpcHRvcnMgKHJiZCkKKyAqIEBiZF9kbWE6IGJ1cyBhZGRyZXNzIG9mIGJ1ZmZlciBvZiByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9ycyAocmJkKQorICogQHJlYWQ6IFNoYXJlZCBpZHggdG8gbmV3ZXN0IGF2YWlsYWJsZSBSeCBidWZmZXIKKyAqIEB3cml0ZTogU2hhcmVkIGlkeCB0byBvbGRlc3Qgd3JpdHRlbiBSeCBwYWNrZXQKKyAqIEBmcmVlX2NvdW50OiBOdW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBidWZmZXJzIGluIHJ4X2ZyZWUKKyAqIEByeF9mcmVlOiBsaXN0IG9mIGZyZWUgU0tCcyBmb3IgdXNlCisgKiBAcnhfdXNlZDogTGlzdCBvZiBSeCBidWZmZXJzIHdpdGggbm8gU0tCCisgKiBAbmVlZF91cGRhdGU6IGZsYWcgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byB1cGRhdGUgcmVhZC93cml0ZSBpZHgKKyAqIEByYl9zdHRzOiBkcml2ZXIncyBwb2ludGVyIHRvIHJlY2VpdmUgYnVmZmVyIHN0YXR1cworICogQHJiX3N0dHNfZG1hOiBidXMgYWRkcmVzcyBvZiByZWNlaXZlIGJ1ZmZlciBzdGF0dXMKKyAqCisgKiBOT1RFOiAgcnhfZnJlZSBhbmQgcnhfdXNlZCBhcmUgdXNlZCBhcyBhIEZJRk8gZm9yIGlsX3J4X2J1ZnMKKyAqLworc3RydWN0IGlsX3J4X3F1ZXVlIHsKKwlfX2xlMzIgKmJkOworCWRtYV9hZGRyX3QgYmRfZG1hOworCXN0cnVjdCBpbF9yeF9idWYgcG9vbFtSWF9RVUVVRV9TSVpFICsgUlhfRlJFRV9CVUZGRVJTXTsKKwlzdHJ1Y3QgaWxfcnhfYnVmICpxdWV1ZVtSWF9RVUVVRV9TSVpFXTsKKwl1MzIgcmVhZDsKKwl1MzIgd3JpdGU7CisJdTMyIGZyZWVfY291bnQ7CisJdTMyIHdyaXRlX2FjdHVhbDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2ZyZWU7CisJc3RydWN0IGxpc3RfaGVhZCByeF91c2VkOworCWludCBuZWVkX3VwZGF0ZTsKKwlzdHJ1Y3QgaWxfcmJfc3RhdHVzICpyYl9zdHRzOworCWRtYV9hZGRyX3QgcmJfc3R0c19kbWE7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworI2RlZmluZSBJTF9TVVBQT1JURURfUkFURVNfSUVfTEVOICAgICAgICAgOAorCisjZGVmaW5lIE1BWF9USURfQ09VTlQgICAgICAgIDkKKworI2RlZmluZSBJTF9JTlZBTElEX1JBVEUgICAgIDB4RkYKKyNkZWZpbmUgSUxfSU5WQUxJRF9WQUxVRSAgICAtMQorCisvKioKKyAqIHN0cnVjdCBpbF9odF9hZ2cgLS0gYWdncmVnYXRpb24gc3RhdHVzIHdoaWxlIHdhaXRpbmcgZm9yIGJsb2NrLWFjaworICogQHR4cV9pZDogVHggcXVldWUgdXNlZCBmb3IgVHggYXR0ZW1wdAorICogQGZyYW1lX2NvdW50OiAjIGZyYW1lcyBhdHRlbXB0ZWQgYnkgVHggY29tbWFuZAorICogQHdhaXRfZm9yX2JhOiBFeHBlY3QgYmxvY2stYWNrIGJlZm9yZSBuZXh0IFR4IHJlcGx5CisgKiBAc3RhcnRfaWR4OiBJbmRleCBvZiAxc3QgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKSBpbiBUeCB3aW4KKyAqIEBiaXRtYXAwOiBMb3cgb3JkZXIgYml0bWFwLCBvbmUgYml0IGZvciBlYWNoIGZyYW1lIHBlbmRpbmcgQUNLIGluIFR4IHdpbgorICogQGJpdG1hcDE6IEhpZ2ggb3JkZXIsIG9uZSBiaXQgZm9yIGVhY2ggZnJhbWUgcGVuZGluZyBBQ0sgaW4gVHggd2luCisgKiBAcmF0ZV9uX2ZsYWdzOiBSYXRlIGF0IHdoaWNoIFR4IHdhcyBhdHRlbXB0ZWQKKyAqCisgKiBJZiBDX1RYIGluZGljYXRlcyB0aGF0IGFnZ3JlZ2F0aW9uIHdhcyBhdHRlbXB0ZWQsIGRyaXZlciBtdXN0IHdhaXQKKyAqIGZvciBibG9jayBhY2sgKE5fQ09NUFJFU1NFRF9CQSkuICBUaGlzIHN0cnVjdCBzdG9yZXMgdHggcmVwbHkgaW5mbworICogdW50aWwgYmxvY2sgYWNrIGFycml2ZXMuCisgKi8KK3N0cnVjdCBpbF9odF9hZ2cgeworCXUxNiB0eHFfaWQ7CisJdTE2IGZyYW1lX2NvdW50OworCXUxNiB3YWl0X2Zvcl9iYTsKKwl1MTYgc3RhcnRfaWR4OworCXU2NCBiaXRtYXA7CisJdTMyIHJhdGVfbl9mbGFnczsKKyNkZWZpbmUgSUxfQUdHX09GRiAwCisjZGVmaW5lIElMX0FHR19PTiAxCisjZGVmaW5lIElMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBIDIKKyNkZWZpbmUgSUxfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkEgMworCXU4IHN0YXRlOworfTsKKworc3RydWN0IGlsX3RpZF9kYXRhIHsKKwl1MTYgc2VxX251bWJlcjsJCS8qIDQ5NjUgb25seSAqLworCXUxNiB0ZmRzX2luX3F1ZXVlOworCXN0cnVjdCBpbF9odF9hZ2cgYWdnOworfTsKKworc3RydWN0IGlsX2h3X2tleSB7CisJdTMyIGNpcGhlcjsKKwlpbnQga2V5bGVuOworCXU4IGtleWlkeDsKKwl1OCBrZXlbMzJdOworfTsKKwordW5pb24gaWxfaHRfcmF0ZV9zdXBwIHsKKwl1MTYgcmF0ZXM7CisJc3RydWN0IHsKKwkJdTggc2lzb19yYXRlOworCQl1OCBtaW1vX3JhdGU7CisJfTsKK307CisKKyNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl84SyAgICgweDApCisjZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfMTZLICAoMHgxKQorI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzMySyAgKDB4MikKKyNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl82NEsgICgweDMpCisjZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfREVGICBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzY0SworI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SX01BWCAgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl82NEsKKyNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl9NSU4gIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfOEsKKworLyoKKyAqIE1heGltYWwgTVBEVSBkZW5zaXR5IGZvciBUWCBhZ2dyZWdhdGlvbgorICogNCAtIDJ1cyBkZW5zaXR5CisgKiA1IC0gNHVzIGRlbnNpdHkKKyAqIDYgLSA4dXMgZGVuc2l0eQorICogNyAtIDE2dXMgZGVuc2l0eQorICovCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfMlVTRUMgICAoMHg0KQorI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZXzRVU0VDICAgKDB4NSkKKyNkZWZpbmUgQ0ZHX0hUX01QRFVfREVOU0lUWV84VVNFQyAgICgweDYpCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfMTZVU0VDICAoMHg3KQorI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZX0RFRiBDRkdfSFRfTVBEVV9ERU5TSVRZXzRVU0VDCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfTUFYIENGR19IVF9NUERVX0RFTlNJVFlfMTZVU0VDCisjZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfTUlOICAgICAoMHgxKQorCitzdHJ1Y3QgaWxfaHRfY29uZmlnIHsKKwlib29sIHNpbmdsZV9jaGFpbl9zdWZmaWNpZW50OworCWVudW0gaWVlZTgwMjExX3NtcHNfbW9kZSBzbXBzOwkvKiBjdXJyZW50IHNtcHMgbW9kZSAqLworfTsKKworLyogUW9TIHN0cnVjdHVyZXMgKi8KK3N0cnVjdCBpbF9xb3NfaW5mbyB7CisJaW50IHFvc19hY3RpdmU7CisJc3RydWN0IGlsX3Fvc3BhcmFtX2NtZCBkZWZfcW9zX3Bhcm07Cit9OworCisvKgorICogU3RydWN0dXJlIHNob3VsZCBiZSBhY2Nlc3NlZCB3aXRoIHN0YV9sb2NrIGhlbGQuIFdoZW4gc3RhdGlvbiBhZGRpdGlvbgorICogaXMgaW4gcHJvZ3Jlc3MgKElMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3Mgb25seQorICogdGhlIGNvbW1hbmRzIChpbF9hZGRzdGFfY21kIGFuZCBpbF9saW5rX3F1YWxpdHlfY21kKSB3aXRob3V0CisgKiBzdGFfbG9jayBoZWxkLgorICovCitzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSB7CisJc3RydWN0IGlsX2FkZHN0YV9jbWQgc3RhOworCXN0cnVjdCBpbF90aWRfZGF0YSB0aWRbTUFYX1RJRF9DT1VOVF07CisJdTggdXNlZCwgY3R4aWQ7CisJc3RydWN0IGlsX2h3X2tleSBrZXlpbmZvOworCXN0cnVjdCBpbF9saW5rX3F1YWxpdHlfY21kICpscTsKK307CisKK3N0cnVjdCBpbF9zdGF0aW9uX3ByaXZfY29tbW9uIHsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7CisJdTggc3RhX2lkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgaWxfdmlmX3ByaXYgLSBkcml2ZXIncyBpbGF0ZSBwZXItaW50ZXJmYWNlIGluZm9ybWF0aW9uCisgKgorICogV2hlbiBtYWM4MDIxMSBhbGxvY2F0ZXMgYSB2aXJ0dWFsIGludGVyZmFjZSwgaXQgY2FuIGFsbG9jYXRlCisgKiBzcGFjZSBmb3IgdXMgdG8gcHV0IGRhdGEgaW50by4KKyAqLworc3RydWN0IGlsX3ZpZl9wcml2IHsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHg7CisJdTggaWJzc19ic3NpZF9zdGFfaWQ7Cit9OworCisvKiBvbmUgZm9yIGVhY2ggdUNvZGUgaW1hZ2UgKGluc3QvZGF0YSwgYm9vdC9pbml0L3J1bnRpbWUpICovCitzdHJ1Y3QgZndfZGVzYyB7CisJdm9pZCAqdl9hZGRyOwkJLyogYWNjZXNzIGJ5IGRyaXZlciAqLworCWRtYV9hZGRyX3QgcF9hZGRyOwkvKiBhY2Nlc3MgYnkgY2FyZCdzIGJ1c21hc3RlciBETUEgKi8KKwl1MzIgbGVuOwkJLyogYnl0ZXMgKi8KK307CisKKy8qIHVDb2RlIGZpbGUgbGF5b3V0ICovCitzdHJ1Y3QgaWxfdWNvZGVfaGVhZGVyIHsKKwlfX2xlMzIgdmVyOwkJLyogbWFqb3IvbWlub3IvQVBJL3NlcmlhbCAqLworCXN0cnVjdCB7CisJCV9fbGUzMiBpbnN0X3NpemU7CS8qIGJ5dGVzIG9mIHJ1bnRpbWUgY29kZSAqLworCQlfX2xlMzIgZGF0YV9zaXplOwkvKiBieXRlcyBvZiBydW50aW1lIGRhdGEgKi8KKwkJX19sZTMyIGluaXRfc2l6ZTsJLyogYnl0ZXMgb2YgaW5pdCBjb2RlICovCisJCV9fbGUzMiBpbml0X2RhdGFfc2l6ZTsJLyogYnl0ZXMgb2YgaW5pdCBkYXRhICovCisJCV9fbGUzMiBib290X3NpemU7CS8qIGJ5dGVzIG9mIGJvb3RzdHJhcCBjb2RlICovCisJCXU4IGRhdGFbMF07CS8qIGluIHNhbWUgb3JkZXIgYXMgc2l6ZXMgKi8KKwl9IHYxOworfTsKKworc3RydWN0IGlsNDk2NV9pYnNzX3NlcSB7CisJdTggbWFjW0VUSF9BTEVOXTsKKwl1MTYgc2VxX251bTsKKwl1MTYgZnJhZ19udW07CisJdW5zaWduZWQgbG9uZyBwYWNrZXRfdGltZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgaWxfc2Vuc2l0aXZpdHlfcmFuZ2VzIHsKKwl1MTYgbWluX25yZ19jY2s7CisJdTE2IG1heF9ucmdfY2NrOworCisJdTE2IG5yZ190aF9jY2s7CisJdTE2IG5yZ190aF9vZmRtOworCisJdTE2IGF1dG9fY29ycl9taW5fb2ZkbTsKKwl1MTYgYXV0b19jb3JyX21pbl9vZmRtX21yYzsKKwl1MTYgYXV0b19jb3JyX21pbl9vZmRtX3gxOworCXUxNiBhdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxOworCisJdTE2IGF1dG9fY29ycl9tYXhfb2ZkbTsKKwl1MTYgYXV0b19jb3JyX21heF9vZmRtX21yYzsKKwl1MTYgYXV0b19jb3JyX21heF9vZmRtX3gxOworCXUxNiBhdXRvX2NvcnJfbWF4X29mZG1fbXJjX3gxOworCisJdTE2IGF1dG9fY29ycl9tYXhfY2NrOworCXUxNiBhdXRvX2NvcnJfbWF4X2Nja19tcmM7CisJdTE2IGF1dG9fY29ycl9taW5fY2NrOworCXUxNiBhdXRvX2NvcnJfbWluX2Nja19tcmM7CisKKwl1MTYgYmFya2VyX2NvcnJfdGhfbWluOworCXUxNiBiYXJrZXJfY29ycl90aF9taW5fbXJjOworCXUxNiBucmdfdGhfY2NhOworfTsKKworI2RlZmluZSBLRUxWSU5fVE9fQ0VMU0lVUyh4KSAoKHgpLTI3MykKKyNkZWZpbmUgQ0VMU0lVU19UT19LRUxWSU4oeCkgKCh4KSsyNzMpCisKKy8qKgorICogc3RydWN0IGlsX2h3X3BhcmFtcworICogQG1heF90eHFfbnVtOiBNYXggIyBUeCBxdWV1ZXMgc3VwcG9ydGVkCisgKiBAZG1hX2NobmxfbnVtOiBOdW1iZXIgb2YgVHggRE1BL0ZJRk8gY2hhbm5lbHMKKyAqIEBzY2RfYmNfdGJsc19zaXplOiBzaXplIG9mIHNjaGVkdWxlciBieXRlIGNvdW50IHRhYmxlcworICogQHRmZF9zaXplOiBURkQgc2l6ZQorICogQHR4L3J4X2NoYWluc19udW06IE51bWJlciBvZiBUWC9SWCBjaGFpbnMKKyAqIEB2YWxpZF90eC9yeF9hbnQ6IHVzYWJsZSBhbnRlbm5hcworICogQG1heF9yeHFfc2l6ZTogTWF4ICMgUnggZnJhbWVzIGluIFJ4IHF1ZXVlIChtdXN0IGJlIHBvd2VyLW9mLTIpCisgKiBAbWF4X3J4cV9sb2c6IExvZy1iYXNlLTIgb2YgbWF4X3J4cV9zaXplCisgKiBAcnhfcGFnZV9vcmRlcjogUnggYnVmZmVyIHBhZ2Ugb3JkZXIKKyAqIEByeF93cnRfcHRyX3JlZzogRkh7Mzl9X1JTQ1NSX0NITkwwX1dQVFIKKyAqIEBtYXhfc3RhdGlvbnM6CisgKiBAaHQ0MF9jaGFubmVsOiBpcyA0ME1IeiB3aWR0aCBwb3NzaWJsZSBpbiBiYW5kIDIuNAorICogQklUKElFRUU4MDIxMV9CQU5EXzVHSFopIEJJVChJRUVFODAyMTFfQkFORF81R0haKQorICogQHN3X2NyeXB0bzogMCBmb3IgaHcsIDEgZm9yIHN3CisgKiBAbWF4X3h4eF9zaXplOiBmb3IgdWNvZGUgdXNlcworICogQGN0X2tpbGxfdGhyZXNob2xkOiB0ZW1wZXJhdHVyZSB0aHJlc2hvbGQKKyAqIEBiZWFjb25fdGltZV90c2ZfYml0czogbnVtYmVyIG9mIHZhbGlkIHRzZiBiaXRzIGZvciBiZWFjb24gdGltZQorICogQHN0cnVjdCBpbF9zZW5zaXRpdml0eV9yYW5nZXM6IHJhbmdlIG9mIHNlbnNpdGl2aXR5IHZhbHVlcworICovCitzdHJ1Y3QgaWxfaHdfcGFyYW1zIHsKKwl1OCBtYXhfdHhxX251bTsKKwl1OCBkbWFfY2hubF9udW07CisJdTE2IHNjZF9iY190YmxzX3NpemU7CisJdTMyIHRmZF9zaXplOworCXU4IHR4X2NoYWluc19udW07CisJdTggcnhfY2hhaW5zX251bTsKKwl1OCB2YWxpZF90eF9hbnQ7CisJdTggdmFsaWRfcnhfYW50OworCXUxNiBtYXhfcnhxX3NpemU7CisJdTE2IG1heF9yeHFfbG9nOworCXUzMiByeF9wYWdlX29yZGVyOworCXUzMiByeF93cnRfcHRyX3JlZzsKKwl1OCBtYXhfc3RhdGlvbnM7CisJdTggaHQ0MF9jaGFubmVsOworCXU4IG1heF9iZWFjb25faXRydmw7CS8qIGluIDEwMjQgbXMgKi8KKwl1MzIgbWF4X2luc3Rfc2l6ZTsKKwl1MzIgbWF4X2RhdGFfc2l6ZTsKKwl1MzIgbWF4X2JzbV9zaXplOworCXUzMiBjdF9raWxsX3RocmVzaG9sZDsJLyogdmFsdWUgaW4gaHctZGVwZW5kZW50IHVuaXRzICovCisJdTE2IGJlYWNvbl90aW1lX3RzZl9iaXRzOworCWNvbnN0IHN0cnVjdCBpbF9zZW5zaXRpdml0eV9yYW5nZXMgKnNlbnM7Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRnVuY3Rpb25zIGltcGxlbWVudGVkIGluIGNvcmUgbW9kdWxlIHdoaWNoIGFyZSBmb3J3YXJkIGRlY2xhcmVkIGhlcmUKKyAqIGZvciB1c2UgYnkgaXdsLVs0LTVdLmMKKyAqCisgKiBOT1RFOiAgVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGhhcmR3YXJlIHNwZWNpZmljCisgKiB3aGljaCBpcyB3aHkgdGhleSBhcmUgaW4gdGhlIGNvcmUgbW9kdWxlIGZpbGVzLgorICoKKyAqIE5hbWluZyBjb252ZW50aW9uIC0tCisgKiBpbF8gICAgICAgICA8LS0gSXMgcGFydCBvZiBpd2x3aWZpCisgKiBpd2xYWFhYXyAgICAgPC0tIEhhcmR3YXJlIHNwZWNpZmljIChpbXBsZW1lbnRlZCBpbiBpd2wtWFhYWC5jIGZvciBYWFhYKQorICogaWw0OTY1X2JnXyAgICAgIDwtLSBDYWxsZWQgZnJvbSB3b3JrIHF1ZXVlIGNvbnRleHQKKyAqIGlsNDk2NV9tYWNfICAgICA8LS0gbWFjODAyMTEgY2FsbGJhY2sKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiB2b2lkIGlsNDk2NV91cGRhdGVfY2hhaW5fZmxhZ3Moc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBjb25zdCB1OCBpbF9iY2FzdF9hZGRyW0VUSF9BTEVOXTsKK2V4dGVybiBpbnQgaWxfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGlsX3F1ZXVlICpxKTsKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9xdWV1ZV91c2VkKGNvbnN0IHN0cnVjdCBpbF9xdWV1ZSAqcSwgaW50IGkpCit7CisJcmV0dXJuIHEtPndyaXRlX3B0ciA+PSBxLT5yZWFkX3B0ciA/IChpID49IHEtPnJlYWRfcHRyICYmCisJCQkJCSAgICAgIGkgPCBxLT53cml0ZV9wdHIpIDogIShpIDwKKwkJCQkJCQkJICAgIHEtPnJlYWRfcHRyCisJCQkJCQkJCSAgICAmJiBpID49CisJCQkJCQkJCSAgICBxLT4KKwkJCQkJCQkJICAgIHdyaXRlX3B0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsX2dldF9jbWRfaWR4KHN0cnVjdCBpbF9xdWV1ZSAqcSwgdTMyIGlkeCwgaW50IGlzX2h1Z2UpCit7CisJLyoKKwkgKiBUaGlzIGlzIGZvciBpbml0IGNhbGlicmF0aW9uIHJlc3VsdCBhbmQgc2NhbiBjb21tYW5kIHdoaWNoCisJICogcmVxdWlyZWQgYnVmZmVyID4gVEZEX01BWF9QQVlMT0FEX1NJWkUsCisJICogdGhlIGJpZyBidWZmZXIgYXQgZW5kIG9mIGNvbW1hbmQgYXJyYXkKKwkgKi8KKwlpZiAoaXNfaHVnZSkKKwkJcmV0dXJuIHEtPm5fd2luOwkvKiBtdXN0IGJlIHBvd2VyIG9mIDIgKi8KKworCS8qIE90aGVyd2lzZSwgdXNlIG5vcm1hbCBzaXplIGJ1ZmZlcnMgKi8KKwlyZXR1cm4gaWR4ICYgKHEtPm5fd2luIC0gMSk7Cit9CisKK3N0cnVjdCBpbF9kbWFfcHRyIHsKKwlkbWFfYWRkcl90IGRtYTsKKwl2b2lkICphZGRyOworCXNpemVfdCBzaXplOworfTsKKworI2RlZmluZSBJTF9PUEVSQVRJT05fTU9ERV9BVVRPICAgICAwCisjZGVmaW5lIElMX09QRVJBVElPTl9NT0RFX0hUX09OTFkgIDEKKyNkZWZpbmUgSUxfT1BFUkFUSU9OX01PREVfTUlYRUQgICAgMgorI2RlZmluZSBJTF9PUEVSQVRJT05fTU9ERV8yME1IWiAgICAzCisKKyNkZWZpbmUgSUxfVFhfQ1JDX1NJWkUgNAorI2RlZmluZSBJTF9UWF9ERUxJTUlURVJfU0laRSA0CisKKyNkZWZpbmUgVFhfUE9XRVJfSUxfSUxMRUdBTF9WT0xUQUdFIC0xMDAwMAorCisvKiBTZW5zaXRpdml0eSBhbmQgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gKi8KKyNkZWZpbmUgSU5JVElBTElaQVRJT05fVkFMVUUJCTB4RkZGRgorI2RlZmluZSBJTDQ5NjVfQ0FMX05VTV9CRUFDT05TCQkyMAorI2RlZmluZSBJTF9DQUxfTlVNX0JFQUNPTlMJCTE2CisjZGVmaW5lIE1BWElNVU1fQUxMT1dFRF9QQVRITE9TUwkxNQorCisjZGVmaW5lIENIQUlOX05PSVNFX01BWF9ERUxUQV9HQUlOX0NPREUgMworCisjZGVmaW5lIE1BWF9GQV9PRkRNICA1MAorI2RlZmluZSBNSU5fRkFfT0ZETSAgNQorI2RlZmluZSBNQVhfRkFfQ0NLICAgNTAKKyNkZWZpbmUgTUlOX0ZBX0NDSyAgIDUKKworI2RlZmluZSBBVVRPX0NPUlJfU1RFUF9PRkRNICAgICAgIDEKKworI2RlZmluZSBBVVRPX0NPUlJfU1RFUF9DQ0sgICAgIDMKKyNkZWZpbmUgQVVUT19DT1JSX01BWF9USF9DQ0sgICAxNjAKKworI2RlZmluZSBOUkdfRElGRiAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgTlJHX1NURVBfQ0NLICAgICAgICAgICAyCisjZGVmaW5lIE5SR19NQVJHSU4gICAgICAgICAgICAgOAorI2RlZmluZSBNQVhfTlVNQkVSX0NDS19OT19GQSAxMDAKKworI2RlZmluZSBBVVRPX0NPUlJfQ0NLX01JTl9WQUxfREVGICAgICgxMjUpCisKKyNkZWZpbmUgQ0hBSU5fQSAgICAgICAgICAgICAwCisjZGVmaW5lIENIQUlOX0IgICAgICAgICAgICAgMQorI2RlZmluZSBDSEFJTl9DICAgICAgICAgICAgIDIKKyNkZWZpbmUgQ0hBSU5fTk9JU0VfREVMVEFfR0FJTl9JTklUX1ZBTCA0CisjZGVmaW5lIEFMTF9CQU5EX0ZJTFRFUgkJCTB4RkYwMAorI2RlZmluZSBJTl9CQU5EX0ZJTFRFUgkJCTB4RkYKKyNkZWZpbmUgTUlOX0FWRVJBR0VfTk9JU0VfTUFYX1ZBTFVFCTB4RkZGRkZGRkYKKworI2RlZmluZSBOUkdfTlVNX1BSRVZfU1RBVF9MICAgICAyMAorI2RlZmluZSBOVU1fUlhfQ0hBSU5TICAgICAgICAgICAzCisKK2VudW0gaWw0OTY1X2ZhbHNlX2FsYXJtX3N0YXRlIHsKKwlJTF9GQV9UT09fTUFOWSA9IDAsCisJSUxfRkFfVE9PX0ZFVyA9IDEsCisJSUxfRkFfR09PRF9SQU5HRSA9IDIsCit9OworCitlbnVtIGlsNDk2NV9jaGFpbl9ub2lzZV9zdGF0ZSB7CisJSUxfQ0hBSU5fTk9JU0VfQUxJVkUgPSAwLAkvKiBtdXN0IGJlIDAgKi8KKwlJTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFLAorCUlMX0NIQUlOX05PSVNFX0NBTElCUkFURUQsCisJSUxfQ0hBSU5fTk9JU0VfRE9ORSwKK307CisKK2VudW0gaWw0OTY1X2NhbGliX2VuYWJsZWRfc3RhdGUgeworCUlMX0NBTElCX0RJU0FCTEVEID0gMCwJLyogbXVzdCBiZSAwICovCisJSUxfQ0FMSUJfRU5BQkxFRCA9IDEsCit9OworCisvKgorICogZW51bSBpbF9jYWxpYgorICogZGVmaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggcmVzdWx0cyBvZiBpbml0aWFsIGNhbGlicmF0aW9ucworICogc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgdUNvZGUKKyAqLworZW51bSBpbF9jYWxpYiB7CisJSUxfQ0FMSUJfTUFYLAorfTsKKworLyogT3BhcXVlIGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KK3N0cnVjdCBpbF9jYWxpYl9yZXN1bHQgeworCXZvaWQgKmJ1ZjsKKwlzaXplX3QgYnVmX2xlbjsKK307CisKK2VudW0gdWNvZGVfdHlwZSB7CisJVUNPREVfTk9ORSA9IDAsCisJVUNPREVfSU5JVCwKKwlVQ09ERV9SVAorfTsKKworLyogU2Vuc2l0aXZpdHkgY2FsaWIgZGF0YSAqLworc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgeworCXUzMiBhdXRvX2NvcnJfb2ZkbTsKKwl1MzIgYXV0b19jb3JyX29mZG1fbXJjOworCXUzMiBhdXRvX2NvcnJfb2ZkbV94MTsKKwl1MzIgYXV0b19jb3JyX29mZG1fbXJjX3gxOworCXUzMiBhdXRvX2NvcnJfY2NrOworCXUzMiBhdXRvX2NvcnJfY2NrX21yYzsKKworCXUzMiBsYXN0X2JhZF9wbGNwX2NudF9vZmRtOworCXUzMiBsYXN0X2ZhX2NudF9vZmRtOworCXUzMiBsYXN0X2JhZF9wbGNwX2NudF9jY2s7CisJdTMyIGxhc3RfZmFfY250X2NjazsKKworCXUzMiBucmdfY3Vycl9zdGF0ZTsKKwl1MzIgbnJnX3ByZXZfc3RhdGU7CisJdTMyIG5yZ192YWx1ZVsxMF07CisJdTggbnJnX3NpbGVuY2VfcnNzaVtOUkdfTlVNX1BSRVZfU1RBVF9MXTsKKwl1MzIgbnJnX3NpbGVuY2VfcmVmOworCXUzMiBucmdfZW5lcmd5X2lkeDsKKwl1MzIgbnJnX3NpbGVuY2VfaWR4OworCXUzMiBucmdfdGhfY2NrOworCXMzMiBucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZjsKKwl1MzIgbnVtX2luX2Nja19ub19mYTsKKwl1MzIgbnJnX3RoX29mZG07CisKKwl1MTYgYmFya2VyX2NvcnJfdGhfbWluOworCXUxNiBiYXJrZXJfY29ycl90aF9taW5fbXJjOworCXUxNiBucmdfdGhfY2NhOworfTsKKworLyogQ2hhaW4gbm9pc2UgKGRpZmZlcmVudGlhbCBSeCBnYWluKSBjYWxpYiBkYXRhICovCitzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSB7CisJdTMyIGFjdGl2ZV9jaGFpbnM7CisJdTMyIGNoYWluX25vaXNlX2E7CisJdTMyIGNoYWluX25vaXNlX2I7CisJdTMyIGNoYWluX25vaXNlX2M7CisJdTMyIGNoYWluX3NpZ25hbF9hOworCXUzMiBjaGFpbl9zaWduYWxfYjsKKwl1MzIgY2hhaW5fc2lnbmFsX2M7CisJdTE2IGJlYWNvbl9jb3VudDsKKwl1OCBkaXNjb25uX2FycmF5W05VTV9SWF9DSEFJTlNdOworCXU4IGRlbHRhX2dhaW5fY29kZVtOVU1fUlhfQ0hBSU5TXTsKKwl1OCByYWRpb193cml0ZTsKKwl1OCBzdGF0ZTsKK307CisKKyNkZWZpbmUJRUVQUk9NX1NFTV9USU1FT1VUIDEwCS8qIG1pbGxpc2Vjb25kcyAqLworI2RlZmluZSBFRVBST01fU0VNX1JFVFJZX0xJTUlUIDEwMDAJLyogbnVtYmVyIG9mIGF0dGVtcHRzIChub3QgdGltZSkgKi8KKworI2RlZmluZSBJTF9UUkFGRklDX0VOVFJJRVMJKDI1NikKKyNkZWZpbmUgSUxfVFJBRkZJQ19FTlRSWV9TSVpFICAoNjQpCisKK2VudW0geworCU1FQVNVUkVNRU5UX1JFQURZID0gKDEgPDwgMCksCisJTUVBU1VSRU1FTlRfQUNUSVZFID0gKDEgPDwgMSksCit9OworCisvKiBpbnRlcnJ1cHQgc3RhdHMgKi8KK3N0cnVjdCBpc3Jfc3RhdHMgeworCXUzMiBodzsKKwl1MzIgc3c7CisJdTMyIGVycl9jb2RlOworCXUzMiBzY2g7CisJdTMyIGFsaXZlOworCXUzMiByZmtpbGw7CisJdTMyIGN0a2lsbDsKKwl1MzIgd2FrZXVwOworCXUzMiByeDsKKwl1MzIgaGFuZGxlcnNbSUxfQ05fTUFYXTsKKwl1MzIgdHg7CisJdTMyIHVuaGFuZGxlZDsKK307CisKKy8qIG1hbmFnZW1lbnQgc3RhdHMgKi8KK2VudW0gaWxfbWdtdF9zdGF0cyB7CisJTUFOQUdFTUVOVF9BU1NPQ19SRVEgPSAwLAorCU1BTkFHRU1FTlRfQVNTT0NfUkVTUCwKKwlNQU5BR0VNRU5UX1JFQVNTT0NfUkVRLAorCU1BTkFHRU1FTlRfUkVBU1NPQ19SRVNQLAorCU1BTkFHRU1FTlRfUFJPQkVfUkVRLAorCU1BTkFHRU1FTlRfUFJPQkVfUkVTUCwKKwlNQU5BR0VNRU5UX0JFQUNPTiwKKwlNQU5BR0VNRU5UX0FUSU0sCisJTUFOQUdFTUVOVF9ESVNBU1NPQywKKwlNQU5BR0VNRU5UX0FVVEgsCisJTUFOQUdFTUVOVF9ERUFVVEgsCisJTUFOQUdFTUVOVF9BQ1RJT04sCisJTUFOQUdFTUVOVF9NQVgsCit9OworLyogY29udHJvbCBzdGF0cyAqLworZW51bSBpbF9jdHJsX3N0YXRzIHsKKwlDT05UUk9MX0JBQ0tfUkVRID0gMCwKKwlDT05UUk9MX0JBQ0ssCisJQ09OVFJPTF9QU1BPTEwsCisJQ09OVFJPTF9SVFMsCisJQ09OVFJPTF9DVFMsCisJQ09OVFJPTF9BQ0ssCisJQ09OVFJPTF9DRkVORCwKKwlDT05UUk9MX0NGRU5EQUNLLAorCUNPTlRST0xfTUFYLAorfTsKKworc3RydWN0IHRyYWZmaWNfc3RhdHMgeworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJdTMyIG1nbXRbTUFOQUdFTUVOVF9NQVhdOworCXUzMiBjdHJsW0NPTlRST0xfTUFYXTsKKwl1MzIgZGF0YV9jbnQ7CisJdTY0IGRhdGFfYnl0ZXM7CisjZW5kaWYKK307CisKKy8qCisgKiBob3N0IGludGVycnVwdCB0aW1lb3V0IHZhbHVlCisgKiB1c2VkIHdpdGggc2V0dGluZyBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lcgorICogdGhlIENTUl9JTlRfQ09BTEVTQ0lORyBpcyBhbiA4IGJpdCByZWdpc3RlciBpbiAzMi11c2VjIHVuaXQKKyAqCisgKiBkZWZhdWx0IGludGVycnVwdCBjb2FsZXNjaW5nIHRpbWVyIGlzIDY0IHggMzIgPSAyMDQ4IHVzZWNzCisgKiBkZWZhdWx0IGludGVycnVwdCBjb2FsZXNjaW5nIGNhbGlicmF0aW9uIHRpbWVyIGlzIDE2IHggMzIgPSA1MTIgdXNlY3MKKyAqLworI2RlZmluZSBJTF9IT1NUX0lOVF9USU1FT1VUX01BWAkoMHhGRikKKyNkZWZpbmUgSUxfSE9TVF9JTlRfVElNRU9VVF9ERUYJKDB4NDApCisjZGVmaW5lIElMX0hPU1RfSU5UX1RJTUVPVVRfTUlOCSgweDApCisjZGVmaW5lIElMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfTUFYCSgweEZGKQorI2RlZmluZSBJTF9IT1NUX0lOVF9DQUxJQl9USU1FT1VUX0RFRgkoMHgxMCkKKyNkZWZpbmUgSUxfSE9TVF9JTlRfQ0FMSUJfVElNRU9VVF9NSU4JKDB4MCkKKworI2RlZmluZSBJTF9ERUxBWV9ORVhUX0ZPUkNFX0ZXX1JFTE9BRCAoSFoqNSkKKworLyogVFggcXVldWUgd2F0Y2hkb2cgdGltZW91dHMgaW4gbVNlY3MgKi8KKyNkZWZpbmUgSUxfREVGX1dEX1RJTUVPVVQJKDIwMDApCisjZGVmaW5lIElMX0xPTkdfV0RfVElNRU9VVAkoMTAwMDApCisjZGVmaW5lIElMX01BWF9XRF9USU1FT1VUCSgxMjAwMDApCisKK3N0cnVjdCBpbF9mb3JjZV9yZXNldCB7CisJaW50IHJlc2V0X3JlcXVlc3RfY291bnQ7CisJaW50IHJlc2V0X3N1Y2Nlc3NfY291bnQ7CisJaW50IHJlc2V0X3JlamVjdF9jb3VudDsKKwl1bnNpZ25lZCBsb25nIHJlc2V0X2R1cmF0aW9uOworCXVuc2lnbmVkIGxvbmcgbGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzOworfTsKKworLyogZXh0ZW5kIGJlYWNvbiB0aW1lIGZvcm1hdCBiaXQgc2hpZnRpbmcgICovCisvKgorICogZm9yIF8zOTQ1IGRldmljZXMKKyAqIGJpdHMgMzE6MjQgLSBleHRlbmRlZAorICogYml0cyAyMzowICAtIGludGVydmFsCisgKi8KKyNkZWZpbmUgSUwzOTQ1X0VYVF9CRUFDT05fVElNRV9QT1MJMjQKKy8qCisgKiBmb3IgXzQ5NjUgZGV2aWNlcworICogYml0cyAzMToyMiAtIGV4dGVuZGVkCisgKiBiaXRzIDIxOjAgIC0gaW50ZXJ2YWwKKyAqLworI2RlZmluZSBJTDQ5NjVfRVhUX0JFQUNPTl9USU1FX1BPUwkyMgorCitzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0IHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCisJY29uc3QgdTggKmFjX3RvX2ZpZm87CisJY29uc3QgdTggKmFjX3RvX3F1ZXVlOworCXU4IG1jYXN0X3F1ZXVlOworCisJLyoKKwkgKiBXZSBjb3VsZCB1c2UgdGhlIHZpZiB0byBpbmRpY2F0ZSBhY3RpdmUsIGJ1dCB3ZQorCSAqIGFsc28gbmVlZCBpdCB0byBiZSBhY3RpdmUgZHVyaW5nIGRpc2FibGluZyB3aGVuCisJICogd2UgYWxyZWFkeSByZW1vdmVkIHRoZSB2aWYgZm9yIHR5cGUgc2V0dGluZy4KKwkgKi8KKwlib29sIGFsd2F5c19hY3RpdmUsIGlzX2FjdGl2ZTsKKworCWJvb2wgaHRfbmVlZF9tdWx0aXBsZV9jaGFpbnM7CisKKwlpbnQgY3R4aWQ7CisKKwl1MzIgaW50ZXJmYWNlX21vZGVzLCBleGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOworCXU4IHVudXNlZF9kZXZ0eXBlLCBhcF9kZXZ0eXBlLCBpYnNzX2RldnR5cGUsIHN0YXRpb25fZGV2dHlwZTsKKworCS8qCisJICogV2UgZGVjbGFyZSB0aGlzIGNvbnN0IHNvIGl0IGNhbiBvbmx5IGJlCisJICogY2hhbmdlZCB2aWEgZXhwbGljaXQgY2FzdCB3aXRoaW4gdGhlCisJICogcm91dGluZXMgdGhhdCBhY3R1YWxseSB1cGRhdGUgdGhlIHBoeXNpY2FsCisJICogaGFyZHdhcmUuCisJICovCisJY29uc3Qgc3RydWN0IGlsX3J4b25fY21kIGFjdGl2ZTsKKwlzdHJ1Y3QgaWxfcnhvbl9jbWQgc3RhZ2luZzsKKworCXN0cnVjdCBpbF9yeG9uX3RpbWVfY21kIHRpbWluZzsKKworCXN0cnVjdCBpbF9xb3NfaW5mbyBxb3NfZGF0YTsKKworCXU4IGJjYXN0X3N0YV9pZCwgYXBfc3RhX2lkOworCisJdTggcnhvbl9jbWQsIHJ4b25fYXNzb2NfY21kLCByeG9uX3RpbWluZ19jbWQ7CisJdTggcW9zX2NtZDsKKwl1OCB3ZXBfa2V5X2NtZDsKKworCXN0cnVjdCBpbF93ZXBfa2V5IHdlcF9rZXlzW1dFUF9LRVlTX01BWF07CisJdTgga2V5X21hcHBpbmdfa2V5czsKKworCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOworCisJc3RydWN0IHsKKwkJYm9vbCBub25fZ2Zfc3RhX3ByZXNlbnQ7CisJCXU4IHByb3RlY3Rpb247CisJCWJvb2wgZW5hYmxlZCwgaXNfNDBtaHo7CisJCXU4IGV4dGVuc2lvbl9jaGFuX29mZnNldDsKKwl9IGh0OworfTsKKworc3RydWN0IGlsX3Bvd2VyX21nciB7CisJc3RydWN0IGlsX3Bvd2VydGFibGVfY21kIHNsZWVwX2NtZDsKKwlzdHJ1Y3QgaWxfcG93ZXJ0YWJsZV9jbWQgc2xlZXBfY21kX25leHQ7CisJaW50IGRlYnVnX3NsZWVwX2xldmVsX292ZXJyaWRlOworCWJvb2wgcGNpX3BtOworfTsKKworc3RydWN0IGlsX3ByaXYgeworCisJLyogaWVlZSBkZXZpY2UgdXNlZCBieSBnZW5lcmljIGllZWUgcHJvY2Vzc2luZyBjb2RlICovCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICppZWVlX2NoYW5uZWxzOworCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqaWVlZV9yYXRlczsKKwlzdHJ1Y3QgaWxfY2ZnICpjZmc7CisKKwkvKiB0ZW1wb3JhcnkgZnJhbWUgc3RvcmFnZSBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBmcmVlX2ZyYW1lczsKKwlpbnQgZnJhbWVzX2NvdW50OworCisJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOworCWludCBhbGxvY19yeGJfcGFnZTsKKworCXZvaWQgKCpoYW5kbGVyc1tJTF9DTl9NQVhdKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICAgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKKworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZHNbSUVFRTgwMjExX05VTV9CQU5EU107CisKKwkvKiBzcGVjdHJ1bSBtZWFzdXJlbWVudCByZXBvcnQgY2FjaGluZyAqLworCXN0cnVjdCBpbF9zcGVjdHJ1bV9ub3RpZmljYXRpb24gbWVhc3VyZV9yZXBvcnQ7CisJdTggbWVhc3VyZW1lbnRfc3RhdHVzOworCisJLyogdWNvZGUgYmVhY29uIHRpbWUgKi8KKwl1MzIgdWNvZGVfYmVhY29uX3RpbWU7CisJaW50IG1pc3NlZF9iZWFjb25fdGhyZXNob2xkOworCisJLyogdHJhY2sgSUJTUyBtYW5hZ2VyIChsYXN0IGJlYWNvbikgc3RhdHVzICovCisJdTMyIGlic3NfbWFuYWdlcjsKKworCS8qIGZvcmNlIHJlc2V0ICovCisJc3RydWN0IGlsX2ZvcmNlX3Jlc2V0IGZvcmNlX3Jlc2V0OworCisJLyogd2UgYWxsb2NhdGUgYXJyYXkgb2YgaWxfY2hhbm5lbF9pbmZvIGZvciBOSUMncyB2YWxpZCBjaGFubmVscy4KKwkgKiAgICBBY2Nlc3MgdmlhIGNoYW5uZWwgIyB1c2luZyBpbmRpcmVjdCBpZHggYXJyYXkgKi8KKwlzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaGFubmVsX2luZm87CS8qIGNoYW5uZWwgaW5mbyBhcnJheSAqLworCXU4IGNoYW5uZWxfY291bnQ7CS8qICMgb2YgY2hhbm5lbHMgKi8KKworCS8qIHRoZXJtYWwgY2FsaWJyYXRpb24gKi8KKwlzMzIgdGVtcGVyYXR1cmU7CS8qIGRlZ3JlZXMgS2VsdmluICovCisJczMyIGxhc3RfdGVtcGVyYXR1cmU7CisKKwkvKiBpbml0IGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KKwlzdHJ1Y3QgaWxfY2FsaWJfcmVzdWx0IGNhbGliX3Jlc3VsdHNbSUxfQ0FMSUJfTUFYXTsKKworCS8qIFNjYW4gcmVsYXRlZCB2YXJpYWJsZXMgKi8KKwl1bnNpZ25lZCBsb25nIHNjYW5fc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBzY2FuX3N0YXJ0X3RzZjsKKwl2b2lkICpzY2FuX2NtZDsKKwllbnVtIGllZWU4MDIxMV9iYW5kIHNjYW5fYmFuZDsKKwlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcXVlc3Q7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnNjYW5fdmlmOworCXU4IHNjYW5fdHhfYW50W0lFRUU4MDIxMV9OVU1fQkFORFNdOworCXU4IG1nbXRfdHhfYW50OworCisJLyogc3BpbmxvY2sgKi8KKwlzcGlubG9ja190IGxvY2s7CS8qIHByb3RlY3QgZ2VuZXJhbCBzaGFyZWQgZGF0YSAqLworCXNwaW5sb2NrX3QgaGNtZF9sb2NrOwkvKiBwcm90ZWN0IGhjbWQgKi8KKwlzcGlubG9ja190IHJlZ19sb2NrOwkvKiBwcm90ZWN0IGh3IHJlZ2lzdGVyIGFjY2VzcyAqLworCXN0cnVjdCBtdXRleCBtdXRleDsKKworCS8qIGJhc2ljIHBjaS1uZXR3b3JrIGRyaXZlciBzdHVmZiAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCisJLyogcGNpIGhhcmR3YXJlIGFkZHJlc3Mgc3VwcG9ydCAqLworCXZvaWQgX19pb21lbSAqaHdfYmFzZTsKKwl1MzIgaHdfcmV2OworCXUzMiBod193YV9yZXY7CisJdTggcmV2X2lkOworCisJLyogY29tbWFuZCBxdWV1ZSBudW1iZXIgKi8KKwl1OCBjbWRfcXVldWU7CisKKwkvKiBtYXggbnVtYmVyIG9mIHN0YXRpb24ga2V5cyAqLworCXU4IHN0YV9rZXlfbWF4X251bTsKKworCS8qIEVFUFJPTSBNQUMgYWRkcmVzc2VzICovCisJc3RydWN0IG1hY19hZGRyZXNzIGFkZHJlc3Nlc1sxXTsKKworCS8qIHVDb2RlIGltYWdlcywgc2F2ZSB0byByZWxvYWQgaW4gY2FzZSBvZiBmYWlsdXJlICovCisJaW50IGZ3X2lkeDsJCS8qIGZpcm13YXJlIHdlJ3JlIHRyeWluZyB0byBsb2FkICovCisJdTMyIHVjb2RlX3ZlcjsJCS8qIHZlcnNpb24gb2YgdWNvZGUsIGNvcHkgb2YKKwkJCQkgICBpbF91Y29kZS52ZXIgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9jb2RlOwkvKiBydW50aW1lIGluc3QgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9kYXRhOwkvKiBydW50aW1lIGRhdGEgb3JpZ2luYWwgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9kYXRhX2JhY2t1cDsJLyogcnVudGltZSBkYXRhIHNhdmUvcmVzdG9yZSAqLworCXN0cnVjdCBmd19kZXNjIHVjb2RlX2luaXQ7CS8qIGluaXRpYWxpemF0aW9uIGluc3QgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9pbml0X2RhdGE7CS8qIGluaXRpYWxpemF0aW9uIGRhdGEgKi8KKwlzdHJ1Y3QgZndfZGVzYyB1Y29kZV9ib290OwkvKiBib290c3RyYXAgaW5zdCAqLworCWVudW0gdWNvZGVfdHlwZSB1Y29kZV90eXBlOworCXU4IHVjb2RlX3dyaXRlX2NvbXBsZXRlOwkvKiB0aGUgaW1hZ2Ugd3JpdGUgaXMgY29tcGxldGUgKi8KKwljaGFyIGZpcm13YXJlX25hbWVbMjVdOworCisJc3RydWN0IGlsX3J4b25fY29udGV4dCBjdHg7CisKKwlfX2xlMTYgc3dpdGNoX2NoYW5uZWw7CisKKwkvKiAxc3QgcmVzcG9uc2VzIGZyb20gaW5pdGlhbGl6ZSBhbmQgcnVudGltZSB1Q29kZSBpbWFnZXMuCisJICogXzQ5NjUncyBpbml0aWFsaXplIGFsaXZlIHJlc3BvbnNlIGNvbnRhaW5zIHNvbWUgY2FsaWJyYXRpb24gZGF0YS4gKi8KKwlzdHJ1Y3QgaWxfaW5pdF9hbGl2ZV9yZXNwIGNhcmRfYWxpdmVfaW5pdDsKKwlzdHJ1Y3QgaWxfYWxpdmVfcmVzcCBjYXJkX2FsaXZlOworCisJdTE2IGFjdGl2ZV9yYXRlOworCisJdTggc3RhcnRfY2FsaWI7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgc2Vuc2l0aXZpdHlfZGF0YTsKKwlzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSBjaGFpbl9ub2lzZV9kYXRhOworCV9fbGUxNiBzZW5zaXRpdml0eV90YmxbSERfVEJMX1NJWkVdOworCisJc3RydWN0IGlsX2h0X2NvbmZpZyBjdXJyZW50X2h0X2NvbmZpZzsKKworCS8qIFJhdGUgc2NhbGluZyBkYXRhICovCisJdTggcmV0cnlfcmF0ZTsKKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfY29tbWFuZF9xdWV1ZTsKKworCWludCBhY3Rpdml0eV90aW1lcl9hY3RpdmU7CisKKwkvKiBSeCBhbmQgVHggRE1BIHByb2Nlc3NpbmcgcXVldWVzICovCisJc3RydWN0IGlsX3J4X3F1ZXVlIHJ4cTsKKwlzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cTsKKwl1bnNpZ25lZCBsb25nIHR4cV9jdHhfYWN0aXZlX21zazsKKwlzdHJ1Y3QgaWxfZG1hX3B0ciBrdzsJLyoga2VlcCB3YXJtIGFkZHJlc3MgKi8KKwlzdHJ1Y3QgaWxfZG1hX3B0ciBzY2RfYmNfdGJsczsKKworCXUzMiBzY2RfYmFzZV9hZGRyOwkvKiBzY2hlZHVsZXIgc3JhbSBiYXNlIGFkZHJlc3MgKi8KKworCXVuc2lnbmVkIGxvbmcgc3RhdHVzOworCisJLyogY291bnRzIG1nbXQsIGN0bCwgYW5kIGRhdGEgcGFja2V0cyAqLworCXN0cnVjdCB0cmFmZmljX3N0YXRzIHR4X3N0YXRzOworCXN0cnVjdCB0cmFmZmljX3N0YXRzIHJ4X3N0YXRzOworCisJLyogY291bnRzIGludGVycnVwdHMgKi8KKwlzdHJ1Y3QgaXNyX3N0YXRzIGlzcl9zdGF0czsKKworCXN0cnVjdCBpbF9wb3dlcl9tZ3IgcG93ZXJfZGF0YTsKKworCS8qIGNvbnRleHQgaW5mb3JtYXRpb24gKi8KKwl1OCBic3NpZFtFVEhfQUxFTl07CS8qIHVzZWQgb25seSBvbiAzOTQ1IGJ1dCBmaWxsZWQgYnkgY29yZSAqLworCisJLyogc3RhdGlvbiB0YWJsZSB2YXJpYWJsZXMgKi8KKworCS8qIE5vdGU6IGlmIGxvY2sgYW5kIHN0YV9sb2NrIGFyZSBuZWVkZWQsIGxvY2sgbXVzdCBiZSBhY3F1aXJlZCBmaXJzdCAqLworCXNwaW5sb2NrX3Qgc3RhX2xvY2s7CisJaW50IG51bV9zdGF0aW9uczsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSBzdGF0aW9uc1tJTF9TVEFUSU9OX0NPVU5UXTsKKwl1bnNpZ25lZCBsb25nIHVjb2RlX2tleV90YWJsZTsKKworCS8qIHF1ZXVlIHJlZmNvdW50cyAqLworI2RlZmluZSBJTF9NQVhfSFdfUVVFVUVTCTMyCisJdW5zaWduZWQgbG9uZyBxdWV1ZV9zdG9wcGVkW0JJVFNfVE9fTE9OR1MoSUxfTUFYX0hXX1FVRVVFUyldOworCS8qIGZvciBlYWNoIEFDICovCisJYXRvbWljX3QgcXVldWVfc3RvcF9jb3VudFs0XTsKKworCS8qIEluZGljYXRpb24gaWYgaWVlZTgwMjExX29wcy0+b3BlbiBoYXMgYmVlbiBjYWxsZWQgKi8KKwl1OCBpc19vcGVuOworCisJdTggbWFjODAyMTFfcmVnaXN0ZXJlZDsKKworCS8qIGVlcHJvbSAtLSB0aGlzIGlzIGluIHRoZSBjYXJkJ3MgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyICovCisJdTggKmVlcHJvbTsKKwlzdHJ1Y3QgaWxfZWVwcm9tX2NhbGliX2luZm8gKmNhbGliX2luZm87CisKKwllbnVtIG5sODAyMTFfaWZ0eXBlIGl3X21vZGU7CisKKwkvKiBMYXN0IFJ4J2QgYmVhY29uIHRpbWVzdGFtcCAqLworCXU2NCB0aW1lc3RhbXA7CisKKwl1bmlvbiB7CisjaWYgZGVmaW5lZChDT05GSUdfSVdMMzk0NSkgfHwgZGVmaW5lZChDT05GSUdfSVdMMzk0NV9NT0RVTEUpCisJCXN0cnVjdCB7CisJCQl2b2lkICpzaGFyZWRfdmlydDsKKwkJCWRtYV9hZGRyX3Qgc2hhcmVkX3BoeXM7CisKKwkJCXN0cnVjdCBkZWxheWVkX3dvcmsgdGhlcm1hbF9wZXJpb2RpYzsKKwkJCXN0cnVjdCBkZWxheWVkX3dvcmsgcmZraWxsX3BvbGw7CisKKwkJCXN0cnVjdCBpbDM5NDVfbm90aWZfc3RhdHMgc3RhdHM7CisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwkJCXN0cnVjdCBpbDM5NDVfbm90aWZfc3RhdHMgYWNjdW1fc3RhdHM7CisJCQlzdHJ1Y3QgaWwzOTQ1X25vdGlmX3N0YXRzIGRlbHRhX3N0YXRzOworCQkJc3RydWN0IGlsMzk0NV9ub3RpZl9zdGF0cyBtYXhfZGVsdGE7CisjZW5kaWYKKworCQkJdTMyIHN0YV9zdXBwX3JhdGVzOworCQkJaW50IGxhc3RfcnhfcnNzaTsJLyogRnJvbSBSeCBwYWNrZXQgc3RhdHMgKi8KKworCQkJLyogUngnZCBwYWNrZXQgdGltaW5nIGluZm9ybWF0aW9uICovCisJCQl1MzIgbGFzdF9iZWFjb25fdGltZTsKKwkJCXU2NCBsYXN0X3RzZjsKKworCQkJLyoKKwkJCSAqIGVhY2ggY2FsaWJyYXRpb24gY2hhbm5lbCBncm91cCBpbiB0aGUKKwkJCSAqIEVFUFJPTSBoYXMgYSBkZXJpdmVkIGNsaXAgc2V0dGluZyBmb3IKKwkJCSAqIGVhY2ggcmF0ZS4KKwkJCSAqLworCQkJY29uc3Qgc3RydWN0IGlsMzk0NV9jbGlwX2dyb3VwIGNsaXBfZ3JvdXBzWzVdOworCisJCX0gXzM5NDU7CisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19JV0w0OTY1KSB8fCBkZWZpbmVkKENPTkZJR19JV0w0OTY1X01PRFVMRSkKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBpbF9yeF9waHlfcmVzIGxhc3RfcGh5X3JlczsKKwkJCWJvb2wgbGFzdF9waHlfcmVzX3ZhbGlkOworCisJCQlzdHJ1Y3QgY29tcGxldGlvbiBmaXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlOworCisJCQkvKgorCQkJICogY2hhaW4gbm9pc2UgcmVzZXQgYW5kIGdhaW4gY29tbWFuZHMgYXJlIHRoZQorCQkJICogdHdvIGV4dHJhIGNhbGlicmF0aW9uIGNvbW1hbmRzIGZvbGxvd3MgdGhlIHN0YW5kYXJkCisJCQkgKiBwaHkgY2FsaWJyYXRpb24gY29tbWFuZHMKKwkJCSAqLworCQkJdTggcGh5X2NhbGliX2NoYWluX25vaXNlX3Jlc2V0X2NtZDsKKwkJCXU4IHBoeV9jYWxpYl9jaGFpbl9ub2lzZV9nYWluX2NtZDsKKworCQkJc3RydWN0IGlsX25vdGlmX3N0YXRzIHN0YXRzOworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCisJCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgYWNjdW1fc3RhdHM7CisJCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgZGVsdGFfc3RhdHM7CisJCQlzdHJ1Y3QgaWxfbm90aWZfc3RhdHMgbWF4X2RlbHRhOworI2VuZGlmCisKKwkJfSBfNDk2NTsKKyNlbmRpZgorCX07CisKKwlzdHJ1Y3QgaWxfaHdfcGFyYW1zIGh3X3BhcmFtczsKKworCXUzMiBpbnRhX21hc2s7CisKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqd29ya3F1ZXVlOworCisJc3RydWN0IHdvcmtfc3RydWN0IHJlc3RhcnQ7CisJc3RydWN0IHdvcmtfc3RydWN0IHNjYW5fY29tcGxldGVkOworCXN0cnVjdCB3b3JrX3N0cnVjdCByeF9yZXBsZW5pc2g7CisJc3RydWN0IHdvcmtfc3RydWN0IGFib3J0X3NjYW47CisKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpiZWFjb25fY3R4OworCXN0cnVjdCBza19idWZmICpiZWFjb25fc2tiOworCisJc3RydWN0IHdvcmtfc3RydWN0IHR4X2ZsdXNoOworCisJc3RydWN0IHRhc2tsZXRfc3RydWN0IGlycV90YXNrbGV0OworCisJc3RydWN0IGRlbGF5ZWRfd29yayBpbml0X2FsaXZlX3N0YXJ0OworCXN0cnVjdCBkZWxheWVkX3dvcmsgYWxpdmVfc3RhcnQ7CisJc3RydWN0IGRlbGF5ZWRfd29yayBzY2FuX2NoZWNrOworCisJLyogVFggUG93ZXIgKi8KKwlzOCB0eF9wb3dlcl91c2VyX2xtdDsKKwlzOCB0eF9wb3dlcl9kZXZpY2VfbG10OworCXM4IHR4X3Bvd2VyX25leHQ7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwkvKiBkZWJ1Z2dpbmcgaW5mbyAqLworCXUzMiBkZWJ1Z19sZXZlbDsJLyogcGVyIGRldmljZSBkZWJ1Z2dpbmcgd2lsbCBvdmVycmlkZSBnbG9iYWwKKwkJCQkgICBpbF9kZWJ1Z19sZXZlbCBpZiBzZXQgKi8KKyNlbmRpZgkJCQkvKiBDT05GSUdfSVdMRUdBQ1lfREVCVUcgKi8KKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworCS8qIGRlYnVnZnMgKi8KKwl1MTYgdHhfdHJhZmZpY19pZHg7CisJdTE2IHJ4X3RyYWZmaWNfaWR4OworCXU4ICp0eF90cmFmZmljOworCXU4ICpyeF90cmFmZmljOworCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfZGlyOworCXUzMiBkYmdmc19zcmFtX29mZnNldCwgZGJnZnNfc3JhbV9sZW47CisJYm9vbCBkaXNhYmxlX2h0NDA7CisjZW5kaWYJCQkJLyogQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMgKi8KKworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eHBvd2VyX3dvcms7CisJdTMyIGRpc2FibGVfc2Vuc19jYWw7CisJdTMyIGRpc2FibGVfY2hhaW5fbm9pc2VfY2FsOworCXUzMiBkaXNhYmxlX3R4X3Bvd2VyX2NhbDsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcnVuX3RpbWVfY2FsaWJfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzdGF0c19wZXJpb2RpYzsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZzsKKwlib29sIGh3X3JlYWR5OworCisJc3RydWN0IGxlZF9jbGFzc2RldiBsZWQ7CisJdW5zaWduZWQgbG9uZyBibGlua19vbiwgYmxpbmtfb2ZmOworCWJvb2wgbGVkX3JlZ2lzdGVyZWQ7Cit9OwkJCQkvKmlsX3ByaXYgKi8KKworc3RhdGljIGlubGluZSB2b2lkCitpbF90eHFfY3R4X2FjdGl2YXRlKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCkKK3sKKwlzZXRfYml0KHR4cV9pZCwgJmlsLT50eHFfY3R4X2FjdGl2ZV9tc2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3R4cV9jdHhfZGVhY3RpdmF0ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGludCB0eHFfaWQpCit7CisJY2xlYXJfYml0KHR4cV9pZCwgJmlsLT50eHFfY3R4X2FjdGl2ZV9tc2spOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpZWVlODAyMTFfaGRyICoKK2lsX3R4X3F1ZXVlX2dldF9oZHIoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkLCBpbnQgaWR4KQoreworCWlmIChpbC0+dHhxW3R4cV9pZF0udHhiW2lkeF0uc2tiKQorCQlyZXR1cm4gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopaWwtPnR4cVt0eHFfaWRdLnR4YltpZHhdLnNrYi0+CisJCSAgICBkYXRhOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKgoraWxfcnhvbl9jdHhfZnJvbV92aWYoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaWxfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCisJcmV0dXJuIHZpZl9wcml2LT5jdHg7Cit9CisKKyNkZWZpbmUgZm9yX2VhY2hfY29udGV4dChpbCwgX2N0eCkgXAorCWZvciAoX2N0eCA9ICZpbC0+Y3R4OyBfY3R4ID09ICZpbC0+Y3R4OyBfY3R4KyspCisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19hc3NvY2lhdGVkKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gKGlsLT5jdHguYWN0aXZlLmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSykgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsX2lzX2FueV9hc3NvY2lhdGVkKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gaWxfaXNfYXNzb2NpYXRlZChpbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19hc3NvY2lhdGVkX2N0eChzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIChjdHgtPmFjdGl2ZS5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spID8gMSA6IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19jaGFubmVsX3ZhbGlkKGNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoX2luZm8pCit7CisJaWYgKGNoX2luZm8gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIChjaF9pbmZvLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX1ZBTElEKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY2hhbm5lbF9yYWRhcihjb25zdCBzdHJ1Y3QgaWxfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQoreworCXJldHVybiAoY2hfaW5mby0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9SQURBUikgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSB1OAoraWxfaXNfY2hhbm5lbF9hX2JhbmQoY29uc3Qgc3RydWN0IGlsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbykKK3sKKwlyZXR1cm4gY2hfaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY2hhbm5lbF9wYXNzaXZlKGNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoKQoreworCXJldHVybiAoIShjaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9BQ1RJVkUpKSA/IDEgOiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY2hhbm5lbF9pYnNzKGNvbnN0IHN0cnVjdCBpbF9jaGFubmVsX2luZm8gKmNoKQoreworCXJldHVybiAoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfSUJTUykgPyAxIDogMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2lsX2ZyZWVfcGFnZXMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgcGFnZSAqcGFnZSkKK3sKKwlfX2ZyZWVfcGFnZXMocGFnZSwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKKwlpbC0+YWxsb2NfcnhiX3BhZ2UtLTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9mcmVlX3BhZ2VzKHN0cnVjdCBpbF9wcml2ICppbCwgdW5zaWduZWQgbG9uZyBwYWdlKQoreworCWZyZWVfcGFnZXMocGFnZSwgaWwtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKKwlpbC0+YWxsb2NfcnhiX3BhZ2UtLTsKK30KKworI2RlZmluZSBJV0xXSUZJX1ZFUlNJT04gImluLXRyZWU6IgorI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQoYykgMjAwMy0yMDExIEludGVsIENvcnBvcmF0aW9uIgorI2RlZmluZSBEUlZfQVVUSE9SICAgICAiPGlsd0BsaW51eC5pbnRlbC5jb20+IgorCisjZGVmaW5lIElMX1BDSV9ERVZJQ0UoZGV2LCBzdWJkZXYsIGNmZykgXAorCS52ZW5kb3IgPSBQQ0lfVkVORE9SX0lEX0lOVEVMLCAgLmRldmljZSA9IChkZXYpLCBcCisJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsIC5zdWJkZXZpY2UgPSAoc3ViZGV2KSwgXAorCS5kcml2ZXJfZGF0YSA9IChrZXJuZWxfdWxvbmdfdCkmKGNmZykKKworI2RlZmluZSBUSU1FX1VOSVQJCTEwMjQKKworI2RlZmluZSBJTF9TS1VfRyAgICAgICAweDEKKyNkZWZpbmUgSUxfU0tVX0EgICAgICAgMHgyCisjZGVmaW5lIElMX1NLVV9OICAgICAgIDB4OAorCisjZGVmaW5lIElMX0NNRCh4KSBjYXNlIHg6IHJldHVybiAjeAorCisvKiBTaXplIG9mIG9uZSBSeCBidWZmZXIgaW4gaG9zdCBEUkFNICovCisjZGVmaW5lIElMX1JYX0JVRl9TSVpFXzNLICgzICogMTAwMCkJLyogMzk0NSBvbmx5ICovCisjZGVmaW5lIElMX1JYX0JVRl9TSVpFXzRLICg0ICogMTAyNCkKKyNkZWZpbmUgSUxfUlhfQlVGX1NJWkVfOEsgKDggKiAxMDI0KQorCitzdHJ1Y3QgaWxfaGNtZF9vcHMgeworCWludCAoKnJ4b25fYXNzb2MpIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisJaW50ICgqY29tbWl0X3J4b24pIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisJdm9pZCAoKnNldF9yeG9uX2NoYWluKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit9OworCitzdHJ1Y3QgaWxfaGNtZF91dGlsc19vcHMgeworCXUxNigqZ2V0X2hjbWRfc2l6ZSkgKHU4IGNtZF9pZCwgdTE2IGxlbik7CisJdTE2KCpidWlsZF9hZGRzdGFfaGNtZCkgKGNvbnN0IHN0cnVjdCBpbF9hZGRzdGFfY21kICpjbWQsIHU4ICpkYXRhKTsKKwlpbnQgKCpyZXF1ZXN0X3NjYW4pIChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOworCXZvaWQgKCpwb3N0X3NjYW4pIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworfTsKKworc3RydWN0IGlsX2FwbV9vcHMgeworCWludCAoKmluaXQpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCXZvaWQgKCpjb25maWcpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworfTsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTCitzdHJ1Y3QgaWxfZGVidWdmc19vcHMgeworCXNzaXplX3QoKnJ4X3N0YXRzX3JlYWQpIChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisJc3NpemVfdCgqdHhfc3RhdHNfcmVhZCkgKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKKwlzc2l6ZV90KCpnZW5lcmFsX3N0YXRzX3JlYWQpIChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJCQkgICAgICBsb2ZmX3QgKnBwb3MpOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgaWxfdGVtcF9vcHMgeworCXZvaWQgKCp0ZW1wZXJhdHVyZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7Cit9OworCitzdHJ1Y3QgaWxfbGliX29wcyB7CisJLyogc2V0IGh3IGRlcGVuZGVudCBwYXJhbWV0ZXJzICovCisJaW50ICgqc2V0X2h3X3BhcmFtcykgKHN0cnVjdCBpbF9wcml2ICppbCk7CisJLyogSGFuZGxpbmcgVFggKi8KKwl2b2lkICgqdHhxX3VwZGF0ZV9ieXRlX2NudF90YmwpIChzdHJ1Y3QgaWxfcHJpdiAqaWwsCisJCQkJCSBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSwKKwkJCQkJIHUxNiBieXRlX2NudCk7CisJaW50ICgqdHhxX2F0dGFjaF9idWZfdG9fdGZkKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICAgIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLCBkbWFfYWRkcl90IGFkZHIsCisJCQkJICAgICAgdTE2IGxlbiwgdTggcmVzZXQsIHU4IHBhZCk7CisJdm9pZCAoKnR4cV9mcmVlX3RmZCkgKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3R4X3F1ZXVlICp0eHEpOworCWludCAoKnR4cV9pbml0KSAoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7CisJLyogc2V0dXAgUnggaGFuZGxlciAqLworCXZvaWQgKCpoYW5kbGVyX3NldHVwKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwkvKiBhbGl2ZSBub3RpZmljYXRpb24gYWZ0ZXIgaW5pdCB1Q29kZSBsb2FkICovCisJdm9pZCAoKmluaXRfYWxpdmVfc3RhcnQpIChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCS8qIGNoZWNrIHZhbGlkaXR5IG9mIHJ0YyBkYXRhIGFkZHJlc3MgKi8KKwlpbnQgKCppc192YWxpZF9ydGNfZGF0YV9hZGRyKSAodTMyIGFkZHIpOworCS8qIDFzdCB1Y29kZSBsb2FkICovCisJaW50ICgqbG9hZF91Y29kZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKwl2b2lkICgqZHVtcF9uaWNfZXJyb3JfbG9nKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwlpbnQgKCpkdW1wX2ZoKSAoc3RydWN0IGlsX3ByaXYgKmlsLCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOworCWludCAoKnNldF9jaGFubmVsX3N3aXRjaCkgKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpOworCS8qIHBvd2VyIG1hbmFnZW1lbnQgKi8KKwlzdHJ1Y3QgaWxfYXBtX29wcyBhcG1fb3BzOworCisJLyogcG93ZXIgKi8KKwlpbnQgKCpzZW5kX3R4X3Bvd2VyKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwl2b2lkICgqdXBkYXRlX2NoYWluX2ZsYWdzKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworCS8qIGVlcHJvbSBvcGVyYXRpb25zICovCisJc3RydWN0IGlsX2VlcHJvbV9vcHMgZWVwcm9tX29wczsKKworCS8qIHRlbXBlcmF0dXJlICovCisJc3RydWN0IGlsX3RlbXBfb3BzIHRlbXBfb3BzOworCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHRlMKKwlzdHJ1Y3QgaWxfZGVidWdmc19vcHMgZGVidWdmc19vcHM7CisjZW5kaWYKKworfTsKKworc3RydWN0IGlsX2xlZF9vcHMgeworCWludCAoKmNtZCkgKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2xlZF9jbWQgKmxlZF9jbWQpOworfTsKKworc3RydWN0IGlsX2xlZ2FjeV9vcHMgeworCXZvaWQgKCpwb3N0X2Fzc29jaWF0ZSkgKHN0cnVjdCBpbF9wcml2ICppbCk7CisJdm9pZCAoKmNvbmZpZ19hcCkgKHN0cnVjdCBpbF9wcml2ICppbCk7CisJLyogc3RhdGlvbiBtYW5hZ2VtZW50ICovCisJaW50ICgqdXBkYXRlX2JjYXN0X3N0YXRpb25zKSAoc3RydWN0IGlsX3ByaXYgKmlsKTsKKwlpbnQgKCptYW5hZ2VfaWJzc19zdGF0aW9uKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29sIGFkZCk7Cit9OworCitzdHJ1Y3QgaWxfb3BzIHsKKwljb25zdCBzdHJ1Y3QgaWxfbGliX29wcyAqbGliOworCWNvbnN0IHN0cnVjdCBpbF9oY21kX29wcyAqaGNtZDsKKwljb25zdCBzdHJ1Y3QgaWxfaGNtZF91dGlsc19vcHMgKnV0aWxzOworCWNvbnN0IHN0cnVjdCBpbF9sZWRfb3BzICpsZWQ7CisJY29uc3Qgc3RydWN0IGlsX25pY19vcHMgKm5pYzsKKwljb25zdCBzdHJ1Y3QgaWxfbGVnYWN5X29wcyAqbGVnYWN5OworCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzICppZWVlODAyMTFfb3BzOworfTsKKworc3RydWN0IGlsX21vZF9wYXJhbXMgeworCWludCBzd19jcnlwdG87CQkvKiBkZWY6IDAgPSB1c2luZyBoYXJkd2FyZSBlbmNyeXB0aW9uICovCisJaW50IGRpc2FibGVfaHdfc2NhbjsJLyogZGVmOiAwID0gdXNlIGgvdyBzY2FuICovCisJaW50IG51bV9vZl9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCisJaW50IGRpc2FibGVfMTFuOwkvKiBkZWY6IDAgPSAxMW4gY2FwYWJpbGl0aWVzIGVuYWJsZWQgKi8KKwlpbnQgYW1zZHVfc2l6ZV84SzsJLyogZGVmOiAxID0gZW5hYmxlIDhLIGFtc2R1IHNpemUgKi8KKwlpbnQgYW50ZW5uYTsJCS8qIGRlZjogMCA9IGJvdGggYW50ZW5uYXMgKHVzZSBkaXZlcnNpdHkpICovCisJaW50IHJlc3RhcnRfZnc7CQkvKiBkZWY6IDEgPSByZXN0YXJ0IGZpcm13YXJlICovCit9OworCisvKgorICogQGxlZF9jb21wZW5zYXRpb246IGNvbXBlbnNhdGUgb24gdGhlIGxlZCBvbi9vZmYgdGltZSBwZXIgSFcgYWNjb3JkaW5nCisgKgl0byB0aGUgZGV2aWF0aW9uIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgbGVkIGZyZXF1ZW5jeS4KKyAqCVRoZSBkZXRhaWwgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBjb21tb24uYworICogQGNoYWluX25vaXNlX251bV9iZWFjb25zOiBudW1iZXIgb2YgYmVhY29ucyB1c2VkIHRvIGNvbXB1dGUgY2hhaW4gbm9pc2UKKyAqIEB3ZF90aW1lb3V0OiBUWCBxdWV1ZXMgd2F0Y2hkb2cgdGltZW91dAorICogQHRlbXBlcmF0dXJlX2tlbHZpbjogdGVtcGVyYXR1cmUgcmVwb3J0IGJ5IHVDb2RlIGluIGtlbHZpbgorICogQHVjb2RlX3RyYWNpbmc6IHN1cHBvcnQgdWNvZGUgY29udGludW91cyB0cmFjaW5nCisgKiBAc2Vuc2l0aXZpdHlfY2FsaWJfYnlfZHJpdmVyOiBkcml2ZXIgaGFzIHRoZSBjYXBhYmlsaXR5IHRvIHBlcmZvcm0KKyAqCXNlbnNpdGl2aXR5IGNhbGlicmF0aW9uIG9wZXJhdGlvbgorICogQGNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcjogZHJpdmVyIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBwZXJmb3JtCisgKgljaGFpbiBub2lzZSBjYWxpYnJhdGlvbiBvcGVyYXRpb24KKyAqLworc3RydWN0IGlsX2Jhc2VfcGFyYW1zIHsKKwlpbnQgZWVwcm9tX3NpemU7CisJaW50IG51bV9vZl9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCisJaW50IG51bV9vZl9hbXBkdV9xdWV1ZXM7CS8qIGRlZjogSFcgZGVwZW5kZW50ICovCisJLyogZm9yIGlsX2FwbV9pbml0KCkgKi8KKwl1MzIgcGxsX2NmZ192YWw7CisJYm9vbCBzZXRfbDBzOworCWJvb2wgdXNlX2JzbTsKKworCXUxNiBsZWRfY29tcGVuc2F0aW9uOworCWludCBjaGFpbl9ub2lzZV9udW1fYmVhY29uczsKKwl1bnNpZ25lZCBpbnQgd2RfdGltZW91dDsKKwlib29sIHRlbXBlcmF0dXJlX2tlbHZpbjsKKwljb25zdCBib29sIHVjb2RlX3RyYWNpbmc7CisJY29uc3QgYm9vbCBzZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXI7CisJY29uc3QgYm9vbCBjaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXI7Cit9OworCisjZGVmaW5lIElMX0xFRF9TT0xJRCAxMQorI2RlZmluZSBJTF9ERUZfTEVEX0lOVFJWTCBjcHVfdG9fbGUzMigxMDAwKQorCisjZGVmaW5lIElMX0xFRF9BQ1RJVklUWSAgICAgICAoMDw8MSkKKyNkZWZpbmUgSUxfTEVEX0xJTksgICAgICAgICAgICgxPDwxKQorCisvKgorICogTEVEIG1vZGUKKyAqICAgIElMX0xFRF9ERUZBVUxUOiAgdXNlIGRldmljZSBkZWZhdWx0CisgKiAgICBJTF9MRURfUkZfU1RBVEU6IHR1cm4gTEVEIG9uL29mZiBiYXNlZCBvbiBSRiBzdGF0ZQorICoJCQlMRUQgT04gID0gUkYgT04KKyAqCQkJTEVEIE9GRiA9IFJGIE9GRgorICogICAgSUxfTEVEX0JMSU5LOiAgICBhZGp1c3QgbGVkIGJsaW5rIHJhdGUgYmFzZWQgb24gYmxpbmsgdGFibGUKKyAqLworZW51bSBpbF9sZWRfbW9kZSB7CisJSUxfTEVEX0RFRkFVTFQsCisJSUxfTEVEX1JGX1NUQVRFLAorCUlMX0xFRF9CTElOSywKK307CisKK3ZvaWQgaWxfbGVkc19pbml0KHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsX2xlZHNfZXhpdChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworCisvKioKKyAqIHN0cnVjdCBpbF9jZmcKKyAqIEBmd19uYW1lX3ByZTogRmlybXdhcmUgZmlsZW5hbWUgcHJlZml4LiBUaGUgYXBpIHZlcnNpb24gYW5kIGV4dGVuc2lvbgorICoJKC51Y29kZSkgd2lsbCBiZSBhZGRlZCB0byBmaWxlbmFtZSBiZWZvcmUgbG9hZGluZyBmcm9tIGRpc2suIFRoZQorICoJZmlsZW5hbWUgaXMgY29uc3RydWN0ZWQgYXMgZndfbmFtZV9wcmU8YXBpPi51Y29kZS4KKyAqIEB1Y29kZV9hcGlfbWF4OiBIaWdoZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCisgKiBAdWNvZGVfYXBpX21pbjogTG93ZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCisgKiBAc2Nhbl9hbnRlbm5hczogYXZhaWxhYmxlIGFudGVubmEgZm9yIHNjYW4gb3BlcmF0aW9uCisgKiBAbGVkX21vZGU6IDA9YmxpbmtpbmcsIDE9T24oUkYgT24pL09mZihSRiBPZmYpCisgKgorICogV2UgZW5hYmxlIHRoZSBkcml2ZXIgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3cnQgQVBJIHZlcnNpb24uIFRoZQorICogZHJpdmVyIHNwZWNpZmllcyB3aGljaCBBUElzIGl0IHN1cHBvcnRzICh3aXRoIEB1Y29kZV9hcGlfbWF4IGJlaW5nIHRoZQorICogaGlnaGVzdCBhbmQgQHVjb2RlX2FwaV9taW4gdGhlIGxvd2VzdCkuIEZpcm13YXJlIHdpbGwgb25seSBiZSBsb2FkZWQgaWYKKyAqIGl0IGhhcyBhIHN1cHBvcnRlZCBBUEkgdmVyc2lvbi4gVGhlIGZpcm13YXJlJ3MgQVBJIHZlcnNpb24gd2lsbCBiZQorICogc3RvcmVkIGluIEBpbF9wcml2LCBlbmFibGluZyB0aGUgZHJpdmVyIHRvIG1ha2UgcnVudGltZSBjaGFuZ2VzIGJhc2VkCisgKiBvbiBmaXJtd2FyZSB2ZXJzaW9uIHVzZWQuCisgKgorICogRm9yIGV4YW1wbGUsCisgKiBpZiAoSUxfVUNPREVfQVBJKGlsLT51Y29kZV92ZXIpID49IDIpIHsKKyAqCURyaXZlciBpbnRlcmFjdHMgd2l0aCBGaXJtd2FyZSBBUEkgdmVyc2lvbiA+PSAyLgorICogfSBlbHNlIHsKKyAqCURyaXZlciBpbnRlcmFjdHMgd2l0aCBGaXJtd2FyZSBBUEkgdmVyc2lvbiAxLgorICogfQorICoKKyAqIFRoZSBpZGVhbCB1c2FnZSBvZiB0aGlzIGluZnJhc3RydWN0dXJlIGlzIHRvIHRyZWF0IGEgbmV3IHVjb2RlIEFQSQorICogcmVsZWFzZSBhcyBhIG5ldyBoYXJkd2FyZSByZXZpc2lvbi4gVGhhdCBpcywgdGhyb3VnaCB1dGlsaXppbmcgdGhlCisgKiBpbF9oY21kX3V0aWxzX29wcyBldGMuIHdlIGFjY29tbW9kYXRlIGRpZmZlcmVudCBjb21tYW5kIHN0cnVjdHVyZXMKKyAqIGFuZCBmbG93cyBiZXR3ZWVuIGhhcmR3YXJlIHZlcnNpb25zIGFzIHdlbGwgYXMgdGhlaXIgQVBJCisgKiB2ZXJzaW9ucy4KKyAqCisgKi8KK3N0cnVjdCBpbF9jZmcgeworCS8qIHBhcmFtcyBzcGVjaWZpYyB0byBhbiBpbmRpdmlkdWFsIGRldmljZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpmd19uYW1lX3ByZTsKKwljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21heDsKKwljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21pbjsKKwl1OCB2YWxpZF90eF9hbnQ7CisJdTggdmFsaWRfcnhfYW50OworCXVuc2lnbmVkIGludCBza3U7CisJdTE2IGVlcHJvbV92ZXI7CisJdTE2IGVlcHJvbV9jYWxpYl92ZXI7CisJY29uc3Qgc3RydWN0IGlsX29wcyAqb3BzOworCS8qIG1vZHVsZSBiYXNlZCBwYXJhbWV0ZXJzIHdoaWNoIGNhbiBiZSBzZXQgZnJvbSBtb2Rwcm9iZSBjbWQgKi8KKwljb25zdCBzdHJ1Y3QgaWxfbW9kX3BhcmFtcyAqbW9kX3BhcmFtczsKKwkvKiBwYXJhbXMgbm90IGxpa2VseSB0byBjaGFuZ2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLworCXN0cnVjdCBpbF9iYXNlX3BhcmFtcyAqYmFzZV9wYXJhbXM7CisJLyogcGFyYW1zIGxpa2VseSB0byBjaGFuZ2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLworCXU4IHNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX05VTV9CQU5EU107CisJZW51bSBpbF9sZWRfbW9kZSBsZWRfbW9kZTsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgTCBpIGIgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBpZWVlODAyMTFfaHcgKmlsX2FsbG9jX2FsbChzdHJ1Y3QgaWxfY2ZnICpjZmcpOworaW50IGlsX21hY19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICB1MTYgcXVldWUsIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpOworaW50IGlsX21hY190eF9sYXN0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CisKK3ZvaWQgaWxfc2V0X3J4b25faHdjcnlwdG8oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgIGludCBod19kZWNyeXB0KTsKK2ludCBpbF9jaGVja19yeG9uX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CitpbnQgaWxfZnVsbF9yeG9uX3JlcXVpcmVkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KTsKK2ludCBpbF9zZXRfcnhvbl9jaGFubmVsKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaCwKKwkJCXN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit2b2lkIGlsX3NldF9mbGFnc19mb3JfYmFuZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJCSAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cit1OCBpbF9nZXRfc2luZ2xlX2NoYW5uZWxfbnVtYmVyKHN0cnVjdCBpbF9wcml2ICppbCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKTsKK3ZvaWQgaWxfc2V0X3J4b25faHQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaHRfY29uZmlnICpodF9jb25mKTsKK2Jvb2wgaWxfaXNfaHQ0MF90eF9hbGxvd2VkKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXApOwordm9pZCBpbF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHN0cnVjdCBpbF9wcml2ICppbCwKKwkJCQkgIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7Cit2b2lkIGlsX3NldF9yYXRlKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfc2V0X2RlY3J5cHRlZF9mbGFnKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKKwkJCSAgdTMyIGRlY3J5cHRfcmVzLCBzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHMpOwordm9pZCBpbF9pcnFfaGFuZGxlX2Vycm9yKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfbWFjX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwordm9pZCBpbF9tYWNfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CitpbnQgaWxfbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgZW51bSBubDgwMjExX2lmdHlwZSBuZXd0eXBlLCBib29sIG5ld3AycCk7CitpbnQgaWxfYWxsb2NfdHhxX21lbShzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF90eHFfbWVtKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworaW50IGlsX2FsbG9jX3RyYWZmaWNfbWVtKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsX2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfcmVzZXRfdHJhZmZpY19sb2coc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfZGJnX2xvZ190eF9kYXRhX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IGxlbmd0aCwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpOwordm9pZCBpbF9kYmdfbG9nX3J4X2RhdGFfZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgbGVuZ3RoLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcik7Citjb25zdCBjaGFyICppbF9nZXRfbWdtdF9zdHJpbmcoaW50IGNtZCk7Citjb25zdCBjaGFyICppbF9nZXRfY3RybF9zdHJpbmcoaW50IGNtZCk7Cit2b2lkIGlsX2NsZWFyX3RyYWZmaWNfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfdXBkYXRlX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCwgYm9vbCBpc190eCwgX19sZTE2IGZjLCB1MTYgbGVuKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAoraWxfYWxsb2NfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGlsX3ByaXYgKmlsKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3Jlc2V0X3RyYWZmaWNfbG9nKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9kYmdfbG9nX3R4X2RhdGFfZnJhbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MTYgbGVuZ3RoLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IGxlbmd0aCwKKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIGJvb2wgaXNfdHgsIF9fbGUxNiBmYywgdTE2IGxlbikKK3sKK30KKyNlbmRpZgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBSWCBoYW5kbGVycy4KKyAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBpbF9oZGxfcG1fc2xlZXAoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbF9oZGxfcG1fZGVidWdfc3RhdHMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOwordm9pZCBpbF9oZGxfZXJyb3Ioc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhfYnVmICpyeGIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogUlgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWxfY21kX3F1ZXVlX3VubWFwKHN0cnVjdCBpbF9wcml2ICppbCk7Cit2b2lkIGlsX2NtZF9xdWV1ZV9mcmVlKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfcnhfcXVldWVfYWxsb2Moc3RydWN0IGlsX3ByaXYgKmlsKTsKK3ZvaWQgaWxfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9xdWV1ZSAqcSk7CitpbnQgaWxfcnhfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGlsX3J4X3F1ZXVlICpxKTsKK3ZvaWQgaWxfdHhfY21kX2NvbXBsZXRlKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKKy8qIEhhbmRsZXJzICovCit2b2lkIGlsX2hkbF9zcGVjdHJ1bV9tZWFzdXJlbWVudChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9idWYgKnJ4Yik7Cit2b2lkIGlsX3JlY292ZXJfZnJvbV9zdGF0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCk7Cit2b2lkIGlsX2Noc3dpdGNoX2RvbmUoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGlzX3N1Y2Nlc3MpOwordm9pZCBpbF9oZGxfY3NhKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4X2J1ZiAqcnhiKTsKKworLyogVFggaGVscGVycyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogVFgKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWxfdHhxX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfdHhfcXVldWUgKnR4cSk7CitpbnQgaWxfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLCBpbnQgc2xvdHNfbnVtLAorCQkgICAgIHUzMiB0eHFfaWQpOwordm9pZCBpbF90eF9xdWV1ZV9yZXNldChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLAorCQkgICAgICAgaW50IHNsb3RzX251bSwgdTMyIHR4cV9pZCk7Cit2b2lkIGlsX3R4X3F1ZXVlX3VubWFwKHN0cnVjdCBpbF9wcml2ICppbCwgaW50IHR4cV9pZCk7Cit2b2lkIGlsX3R4X3F1ZXVlX2ZyZWUoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgdHhxX2lkKTsKK3ZvaWQgaWxfc2V0dXBfd2F0Y2hkb2coc3RydWN0IGlsX3ByaXYgKmlsKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogVFggcG93ZXIKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGlsX3NldF90eF9wb3dlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHM4IHR4X3Bvd2VyLCBib29sIGZvcmNlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFJhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3U4IGlsX2dldF9sb3dlc3RfcGxjcChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTY2FubmluZworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgaWxfaW5pdF9zY2FuX3BhcmFtcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsX3NjYW5fY2FuY2VsKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfc2Nhbl9jYW5jZWxfdGltZW91dChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHVuc2lnbmVkIGxvbmcgbXMpOwordm9pZCBpbF9mb3JjZV9zY2FuX2VuZChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsX21hY19od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEpOwordm9pZCBpbF9pbnRlcm5hbF9zaG9ydF9od19zY2FuKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfZm9yY2VfcmVzZXQoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGV4dGVybmFsKTsKK3UxNiBpbF9maWxsX3Byb2JlX3JlcShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqZnJhbWUsCisJCSAgICAgIGNvbnN0IHU4ICp0YSwgY29uc3QgdTggKmllLCBpbnQgaWVfbGVuLCBpbnQgbGVmdCk7Cit2b2lkIGlsX3NldHVwX3J4X3NjYW5faGFuZGxlcnMoc3RydWN0IGlsX3ByaXYgKmlsKTsKK3UxNiBpbF9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUoc3RydWN0IGlsX3ByaXYgKmlsLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCQkgICAgIHU4IG5fcHJvYmVzKTsKK3UxNiBpbF9nZXRfcGFzc2l2ZV9kd2VsbF90aW1lKHN0cnVjdCBpbF9wcml2ICppbCwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Cit2b2lkIGlsX3NldHVwX3NjYW5fZGVmZXJyZWRfd29yayhzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qIEZvciBmYXN0ZXIgYWN0aXZlIHNjYW5uaW5nLCBzY2FuIHdpbGwgbW92ZSB0byB0aGUgbmV4dCBjaGFubmVsIGlmIGZld2VyIHRoYW4KKyAqIFBMQ1BfUVVJRVRfVEhSRVNIIHBhY2tldHMgYXJlIGhlYXJkIG9uIHRoaXMgY2hhbm5lbCB3aXRoaW4KKyAqIEFDVElWRV9RVUlFVF9USU1FIGFmdGVyIHNlbmRpbmcgcHJvYmUgcmVxdWVzdC4gIFRoaXMgc2hvcnRlbnMgdGhlIGR3ZWxsCisgKiB0aW1lIGlmIGl0J3MgYSBxdWlldCBjaGFubmVsIChub3RoaW5nIHJlc3BvbmRlZCB0byBvdXIgcHJvYmUsIGFuZCB0aGVyZSdzCisgKiBubyBvdGhlciB0cmFmZmljKS4KKyAqIERpc2FibGUgInF1aWV0IiBmZWF0dXJlIGJ5IHNldHRpbmcgUExDUF9RVUlFVF9USFJFU0ggdG8gMC4gKi8KKyNkZWZpbmUgSUxfQUNUSVZFX1FVSUVUX1RJTUUgICAgICAgY3B1X3RvX2xlMTYoMTApCS8qIG1zZWMgKi8KKyNkZWZpbmUgSUxfUExDUF9RVUlFVF9USFJFU0ggICAgICAgY3B1X3RvX2xlMTYoMSkJLyogcGFja2V0cyAqLworCisjZGVmaW5lIElMX1NDQU5fQ0hFQ0tfV0FUQ0hET0cJCShIWiAqIDcpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICBTIGUgbiBkIGkgbiBnICAgICBIIG8gcyB0ICAgICBDIG8gbSBtIGEgbiBkIHMgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IGNoYXIgKmlsX2dldF9jbWRfc3RyaW5nKHU4IGNtZCk7CitpbnQgX19tdXN0X2NoZWNrIGlsX3NlbmRfY21kX3N5bmMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaG9zdF9jbWQgKmNtZCk7CitpbnQgaWxfc2VuZF9jbWQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfaG9zdF9jbWQgKmNtZCk7CitpbnQgX19tdXN0X2NoZWNrIGlsX3NlbmRfY21kX3BkdShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHU4IGlkLCB1MTYgbGVuLAorCQkJCSBjb25zdCB2b2lkICpkYXRhKTsKK2ludCBpbF9zZW5kX2NtZF9wZHVfYXN5bmMoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBpZCwgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSwKKwkJCSAgdm9pZCAoKmNhbGxiYWNrKSAoc3RydWN0IGlsX3ByaXYgKmlsLAorCQkJCQkgICAgc3RydWN0IGlsX2RldmljZV9jbWQgKmNtZCwKKwkJCQkJICAgIHN0cnVjdCBpbF9yeF9wa3QgKnBrdCkpOworCitpbnQgaWxfZW5xdWV1ZV9oY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX2hvc3RfY21kICpjbWQpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIFBDSQkJCQkJCSAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW5saW5lIHUxNgoraWxfcGNpZV9saW5rX2N0bChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJaW50IHBvczsKKwl1MTYgcGNpX2xua19jdGw7CisJcG9zID0gcGNpX3BjaWVfY2FwKGlsLT5wY2lfZGV2KTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChpbC0+cGNpX2RldiwgcG9zICsgUENJX0VYUF9MTktDVEwsICZwY2lfbG5rX2N0bCk7CisJcmV0dXJuIHBjaV9sbmtfY3RsOworfQorCit2b2lkIGlsX2JnX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSk7Cit1MzIgaWxfdXNlY3NfdG9fYmVhY29ucyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiB1c2VjLCB1MzIgYmVhY29uX2ludGVydmFsKTsKK19fbGUzMiBpbF9hZGRfYmVhY29uX3RpbWUoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYmFzZSwgdTMyIGFkZG9uLAorCQkJICB1MzIgYmVhY29uX2ludGVydmFsKTsKKworI2lmZGVmIENPTkZJR19QTQoraW50IGlsX3BjaV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CitpbnQgaWxfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGlsX3BtX29wczsKKworI2RlZmluZSBJTF9MRUdBQ1lfUE1fT1BTCSgmaWxfcG1fb3BzKQorCisjZWxzZSAvKiAhQ09ORklHX1BNICovCisKKyNkZWZpbmUgSUxfTEVHQUNZX1BNX09QUwlOVUxMCisKKyNlbmRpZiAvKiAhQ09ORklHX1BNICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgRXJyb3IgSGFuZGxpbmcgRGVidWdnaW5nCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIGlsNDk2NV9kdW1wX25pY19lcnJvcl9sb2coc3RydWN0IGlsX3ByaXYgKmlsKTsKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKK3ZvaWQgaWxfcHJpbnRfcnhfY29uZmlnX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkCitpbF9wcmludF9yeF9jb25maWdfY21kKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KQoreworfQorI2VuZGlmCisKK3ZvaWQgaWxfY2xlYXJfaXNyX3N0YXRzKHN0cnVjdCBpbF9wcml2ICppbCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiAgR0VPUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGlsX2luaXRfZ2VvcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOwordm9pZCBpbF9mcmVlX2dlb3Moc3RydWN0IGlsX3ByaXYgKmlsKTsKKworLyoqKioqKioqKioqKioqKiBEUklWRVIgU1RBVFVTIEZVTkNUSU9OUyAgICoqKioqLworCisjZGVmaW5lIFNfSENNRF9BQ1RJVkUJMAkvKiBob3N0IGNvbW1hbmQgaW4gcHJvZ3Jlc3MgKi8KKy8qIDEgaXMgdW51c2VkICh1c2VkIHRvIGJlIFNfSENNRF9TWU5DX0FDVElWRSkgKi8KKyNkZWZpbmUgU19JTlRfRU5BQkxFRAkyCisjZGVmaW5lIFNfUkZfS0lMTF9IVwkzCisjZGVmaW5lIFNfQ1RfS0lMTAkJNAorI2RlZmluZSBTX0lOSVQJCTUKKyNkZWZpbmUgU19BTElWRQkJNgorI2RlZmluZSBTX1JFQURZCQk3CisjZGVmaW5lIFNfVEVNUEVSQVRVUkUJOAorI2RlZmluZSBTX0dFT19DT05GSUdVUkVECTkKKyNkZWZpbmUgU19FWElUX1BFTkRJTkcJMTAKKyNkZWZpbmUgU19TVEFUUwkJMTIKKyNkZWZpbmUgU19TQ0FOTklORwkJMTMKKyNkZWZpbmUgU19TQ0FOX0FCT1JUSU5HCTE0CisjZGVmaW5lIFNfU0NBTl9IVwkJMTUKKyNkZWZpbmUgU19QT1dFUl9QTUkJMTYKKyNkZWZpbmUgU19GV19FUlJPUgkJMTcKKyNkZWZpbmUgU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HIDE4CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19yZWFkeShzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJLyogVGhlIGFkYXB0ZXIgaXMgJ3JlYWR5JyBpZiBSRUFEWSBhbmQgR0VPX0NPTkZJR1VSRUQgYml0cyBhcmUKKwkgKiBzZXQgYnV0IEVYSVRfUEVORElORyBpcyBub3QgKi8KKwlyZXR1cm4gdGVzdF9iaXQoU19SRUFEWSwgJmlsLT5zdGF0dXMpICYmCisJICAgIHRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKSAmJgorCSAgICAhdGVzdF9iaXQoU19FWElUX1BFTkRJTkcsICZpbC0+c3RhdHVzKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsX2lzX2FsaXZlKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoU19BTElWRSwgJmlsLT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJcmV0dXJuIHRlc3RfYml0KFNfSU5JVCwgJmlsLT5zdGF0dXMpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfcmZraWxsX2h3KHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoU19SRl9LSUxMX0hXLCAmaWwtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19yZmtpbGwoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXJldHVybiBpbF9pc19yZmtpbGxfaHcoaWwpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfaXNfY3RraWxsKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoU19DVF9LSUxMLCAmaWwtPnN0YXR1cyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9pc19yZWFkeV9yZihzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisKKwlpZiAoaWxfaXNfcmZraWxsKGlsKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gaWxfaXNfcmVhZHkoaWwpOworfQorCitleHRlcm4gdm9pZCBpbF9zZW5kX2J0X2NvbmZpZyhzdHJ1Y3QgaWxfcHJpdiAqaWwpOworZXh0ZXJuIGludCBpbF9zZW5kX3N0YXRzX3JlcXVlc3Qoc3RydWN0IGlsX3ByaXYgKmlsLCB1OCBmbGFncywgYm9vbCBjbGVhcik7Cit2b2lkIGlsX2FwbV9zdG9wKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfYXBtX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworaW50IGlsX3NlbmRfcnhvbl90aW1pbmcoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpOworc3RhdGljIGlubGluZSBpbnQKK2lsX3NlbmRfcnhvbl9hc3NvYyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gaWwtPmNmZy0+b3BzLT5oY21kLT5yeG9uX2Fzc29jKGlsLCBjdHgpOworfQorCitzdGF0aWMgaW5saW5lIGludAoraWxfY29tbWl0X3J4b24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuIGlsLT5jZmctPm9wcy0+aGNtZC0+Y29tbWl0X3J4b24oaWwsIGN0eCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqCitpbF9nZXRfaHdfbW9kZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKK3sKKwlyZXR1cm4gaWwtPmh3LT53aXBoeS0+YmFuZHNbYmFuZF07Cit9CisKKy8qIG1hYzgwMjExIGhhbmRsZXJzICovCitpbnQgaWxfbWFjX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGNoYW5nZWQpOwordm9pZCBpbF9tYWNfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKK3ZvaWQgaWxfbWFjX2Jzc19pbmZvX2NoYW5nZWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLCB1MzIgY2hhbmdlcyk7Cit2b2lkIGlsX3R4X2NtZF9wcm90ZWN0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAorCQkJICBfX2xlMTYgZmMsIF9fbGUzMiAqdHhfZmxhZ3MpOworCitpcnFyZXR1cm5fdCBpbF9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSk7CisKK2V4dGVybiB2b2lkIGlsX3NldF9iaXQoc3RydWN0IGlsX3ByaXYgKnAsIHUzMiByLCB1MzIgbSk7CitleHRlcm4gdm9pZCBpbF9jbGVhcl9iaXQoc3RydWN0IGlsX3ByaXYgKnAsIHUzMiByLCB1MzIgbSk7CitleHRlcm4gaW50IF9pbF9ncmFiX25pY19hY2Nlc3Moc3RydWN0IGlsX3ByaXYgKmlsKTsKK2V4dGVybiBpbnQgX2lsX3BvbGxfYml0KHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIGFkZHIsIHUzMiBiaXRzLCB1MzIgbWFzaywgaW50IHRpbWVvdXQpOworZXh0ZXJuIGludCBpbF9wb2xsX2JpdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBhZGRyLCB1MzIgbWFzaywgaW50IHRpbWVvdXQpOworZXh0ZXJuIHUzMiBpbF9yZF9wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZyk7CitleHRlcm4gdm9pZCBpbF93cl9wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIGFkZHIsIHUzMiB2YWwpOworZXh0ZXJuIHUzMiBpbF9yZWFkX3RhcmdfbWVtKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIGFkZHIpOworZXh0ZXJuIHZvaWQgaWxfd3JpdGVfdGFyZ19tZW0oc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYWRkciwgdTMyIHZhbCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2lsX3dyaXRlOChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiBvZnMsIHU4IHZhbCkKK3sKKwlpb3dyaXRlOCh2YWwsIGlsLT5od19iYXNlICsgb2ZzKTsKK30KKyNkZWZpbmUgaWxfd3JpdGU4KGlsLCBvZnMsIHZhbCkgX2lsX3dyaXRlOChpbCwgb2ZzLCB2YWwpCisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2lsX3dyKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIG9mcywgdTMyIHZhbCkKK3sKKwlpb3dyaXRlMzIodmFsLCBpbC0+aHdfYmFzZSArIG9mcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyCitfaWxfcmQoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgb2ZzKQoreworCXJldHVybiBpb3JlYWQzMihpbC0+aHdfYmFzZSArIG9mcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2lsX2NsZWFyX2JpdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiByZWcsIHUzMiBtYXNrKQoreworCV9pbF93cihpbCwgcmVnLCBfaWxfcmQoaWwsIHJlZykgJiB+bWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2lsX3NldF9iaXQoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgcmVnLCB1MzIgbWFzaykKK3sKKwlfaWxfd3IoaWwsIHJlZywgX2lsX3JkKGlsLCByZWcpIHwgbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJX2lsX2NsZWFyX2JpdChpbCwgQ1NSX0dQX0NOVFJMLCBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgoraWxfcmQoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgcmVnKQoreworCXUzMiB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJX2lsX2dyYWJfbmljX2FjY2VzcyhpbCk7CisJdmFsdWUgPSBfaWxfcmQoaWwsIHJlZyk7CisJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF93cihzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiByZWcsIHUzMiB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7CisJaWYgKCFfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKSkgeworCQlfaWxfd3IoaWwsIHJlZywgdmFsdWUpOworCQlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHUzMgorX2lsX3JkX3BycGgoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgcmVnKQoreworCV9pbF93cihpbCwgSEJVU19UQVJHX1BSUEhfUkFERFIsIHJlZyB8ICgzIDw8IDI0KSk7CisJcm1iKCk7CisJcmV0dXJuIF9pbF9yZChpbCwgSEJVU19UQVJHX1BSUEhfUkRBVCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX2lsX3dyX3BycGgoc3RydWN0IGlsX3ByaXYgKmlsLCB1MzIgYWRkciwgdTMyIHZhbCkKK3sKKwlfaWxfd3IoaWwsIEhCVVNfVEFSR19QUlBIX1dBRERSLCAoKGFkZHIgJiAweDAwMDBGRkZGKSB8ICgzIDw8IDI0KSkpOworCXdtYigpOworCV9pbF93cihpbCwgSEJVU19UQVJHX1BSUEhfV0RBVCwgdmFsKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9zZXRfYml0c19wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZywgdTMyIG1hc2spCit7CisJdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCV9pbF9ncmFiX25pY19hY2Nlc3MoaWwpOworCV9pbF93cl9wcnBoKGlsLCByZWcsIChfaWxfcmRfcHJwaChpbCwgcmVnKSB8IG1hc2spKTsKKwlfaWxfcmVsZWFzZV9uaWNfYWNjZXNzKGlsKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfc2V0X2JpdHNfbWFza19wcnBoKHN0cnVjdCBpbF9wcml2ICppbCwgdTMyIHJlZywgdTMyIGJpdHMsIHUzMiBtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKKwlfaWxfZ3JhYl9uaWNfYWNjZXNzKGlsKTsKKwlfaWxfd3JfcHJwaChpbCwgcmVnLCAoKF9pbF9yZF9wcnBoKGlsLCByZWcpICYgbWFzaykgfCBiaXRzKSk7CisJX2lsX3JlbGVhc2VfbmljX2FjY2VzcyhpbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2NsZWFyX2JpdHNfcHJwaChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUzMiByZWcsIHUzMiBtYXNrKQoreworCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOworCXUzMiB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOworCV9pbF9ncmFiX25pY19hY2Nlc3MoaWwpOworCXZhbCA9IF9pbF9yZF9wcnBoKGlsLCByZWcpOworCV9pbF93cl9wcnBoKGlsLCByZWcsICh2YWwgJiB+bWFzaykpOworCV9pbF9yZWxlYXNlX25pY19hY2Nlc3MoaWwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlsLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKK30KKworI2RlZmluZSBIV19LRVlfRFlOQU1JQyAwCisjZGVmaW5lIEhXX0tFWV9ERUZBVUxUIDEKKworI2RlZmluZSBJTF9TVEFfRFJJVkVSX0FDVElWRSBCSVQoMCkJLyogZHJpdmVyIGVudHJ5IGlzIGFjdGl2ZSAqLworI2RlZmluZSBJTF9TVEFfVUNPREVfQUNUSVZFICBCSVQoMSkJLyogdWNvZGUgZW50cnkgaXMgYWN0aXZlICovCisjZGVmaW5lIElMX1NUQV9VQ09ERV9JTlBST0dSRVNTICBCSVQoMikJLyogdWNvZGUgZW50cnkgaXMgaW4gcHJvY2VzcyBvZgorCQkJCQkgICBiZWluZyBhY3RpdmF0ZWQgKi8KKyNkZWZpbmUgSUxfU1RBX0xPQ0FMIEJJVCgzKQkvKiBzdGF0aW9uIHN0YXRlIG5vdCBkaXJlY3RlZCBieSBtYWM4MDIxMTsKKwkJCQkgICAodGhpcyBpcyBmb3IgdGhlIElCU1MgQlNTSUQgc3RhdGlvbnMpICovCisjZGVmaW5lIElMX1NUQV9CQ0FTVCBCSVQoNCkJLyogdGhpcyBzdGF0aW9uIGlzIHRoZSBzcGVjaWFsIGJjYXN0IHN0YXRpb24gKi8KKwordm9pZCBpbF9yZXN0b3JlX3N0YXRpb25zKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4KTsKK3ZvaWQgaWxfY2xlYXJfdWNvZGVfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgpOwordm9pZCBpbF9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpbF9wcml2ICppbCk7CitpbnQgaWxfZ2V0X2ZyZWVfdWNvZGVfa2V5X2lkeChzdHJ1Y3QgaWxfcHJpdiAqaWwpOworaW50IGlsX3NlbmRfYWRkX3N0YShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9hZGRzdGFfY21kICpzdGEsIHU4IGZsYWdzKTsKK2ludCBpbF9hZGRfc3RhdGlvbl9jb21tb24oc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHgsCisJCQkgIGNvbnN0IHU4ICphZGRyLCBib29sIGlzX2FwLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1OCAqc3RhX2lkX3IpOworaW50IGlsX3JlbW92ZV9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgdTggc3RhX2lkLCBjb25zdCB1OCAqIGFkZHIpOworaW50IGlsX21hY19zdGFfcmVtb3ZlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKKwordTggaWxfcHJlcF9zdGF0aW9uKHN0cnVjdCBpbF9wcml2ICppbCwgc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4LAorCQkgICBjb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CisKK2ludCBpbF9zZW5kX2xxX2NtZChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmN0eCwKKwkJICAgc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgKmxxLCB1OCBmbGFncywgYm9vbCBpbml0KTsKKworLyoqCisgKiBpbF9jbGVhcl9kcml2ZXJfc3RhdGlvbnMgLSBjbGVhciBrbm93bGVkZ2Ugb2YgYWxsIHN0YXRpb25zIGZyb20gZHJpdmVyCisgKiBAaWw6IGl3bCBpbCBzdHJ1Y3QKKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBkdXJpbmcgaWxfZG93bigpIHRvIG1ha2Ugc3VyZSB0aGF0IGluIHRoZSBjYXNlCisgKiB3ZSdyZSBjb21pbmcgdGhlcmUgZnJvbSBhIGhhcmR3YXJlIHJlc3RhcnQgbWFjODAyMTEgd2lsbCBiZQorICogYWJsZSB0byByZWNvbmZpZ3VyZSBzdGF0aW9ucyAtLSBpZiB3ZSdyZSBnZXR0aW5nIHRoZXJlIGluIHRoZQorICogbm9ybWFsIGRvd24gZmxvdyB0aGVuIHRoZSBzdGF0aW9ucyB3aWxsIGFscmVhZHkgYmUgY2xlYXJlZC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkCitpbF9jbGVhcl9kcml2ZXJfc3RhdGlvbnMoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGlsX3J4b25fY29udGV4dCAqY3R4ID0gJmlsLT5jdHg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7CisJbWVtc2V0KGlsLT5zdGF0aW9ucywgMCwgc2l6ZW9mKGlsLT5zdGF0aW9ucykpOworCWlsLT5udW1fc3RhdGlvbnMgPSAwOworCisJaWwtPnVjb2RlX2tleV90YWJsZSA9IDA7CisKKwkvKgorCSAqIFJlbW92ZSBhbGwga2V5IGluZm9ybWF0aW9uIHRoYXQgaXMgbm90IHN0b3JlZCBhcyBwYXJ0CisJICogb2Ygc3RhdGlvbiBpbmZvcm1hdGlvbiBzaW5jZSBtYWM4MDIxMSBtYXkgbm90IGhhdmUgaGFkCisJICogYSBjaGFuY2UgdG8gcmVtb3ZlIGFsbCB0aGUga2V5cy4gV2hlbiBkZXZpY2UgaXMKKwkgKiByZWNvbmZpZ3VyZWQgYnkgbWFjODAyMTEgYWZ0ZXIgYW4gZXJyb3IgYWxsIGtleXMgd2lsbAorCSAqIGJlIHJlY29uZmlndXJlZC4KKwkgKi8KKwltZW1zZXQoY3R4LT53ZXBfa2V5cywgMCwgc2l6ZW9mKGN0eC0+d2VwX2tleXMpKTsKKwljdHgtPmtleV9tYXBwaW5nX2tleXMgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaWwtPnN0YV9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitpbF9zdGFfaWQoc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlpZiAoV0FSTl9PTighc3RhKSkKKwkJcmV0dXJuIElMX0lOVkFMSURfU1RBVElPTjsKKworCXJldHVybiAoKHN0cnVjdCBpbF9zdGF0aW9uX3ByaXZfY29tbW9uICopc3RhLT5kcnZfcHJpdiktPnN0YV9pZDsKK30KKworLyoqCisgKiBpbF9zdGFfaWRfb3JfYnJvYWRjYXN0IC0gcmV0dXJuIHN0YV9pZCBvciBicm9hZGNhc3Qgc3RhCisgKiBAaWw6IGl3bCBpbAorICogQGNvbnRleHQ6IHRoZSBjdXJyZW50IGNvbnRleHQKKyAqIEBzdGE6IG1hYzgwMjExIHN0YXRpb24KKyAqCisgKiBJbiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgbWFjODAyMTEgcGFzc2VzIGEgc3RhdGlvbiBwb2ludGVyCisgKiB0aGF0IG1heSBiZSAlTlVMTCwgZm9yIGV4YW1wbGUgZHVyaW5nIFRYIG9yIGtleSBzZXR1cC4gSW4KKyAqIHRoYXQgY2FzZSwgd2UgbmVlZCB0byB1c2UgdGhlIGJyb2FkY2FzdCBzdGF0aW9uLCBzbyB0aGlzCisgKiBpbmxpbmUgd3JhcHMgdGhhdCBwYXR0ZXJuLgorICovCitzdGF0aWMgaW5saW5lIGludAoraWxfc3RhX2lkX29yX2Jyb2FkY2FzdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF9yeG9uX2NvbnRleHQgKmNvbnRleHQsCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCWludCBzdGFfaWQ7CisKKwlpZiAoIXN0YSkKKwkJcmV0dXJuIGNvbnRleHQtPmJjYXN0X3N0YV9pZDsKKworCXN0YV9pZCA9IGlsX3N0YV9pZChzdGEpOworCisJLyoKKwkgKiBtYWM4MDIxMSBzaG91bGQgbm90IGJlIHBhc3NpbmcgYSBwYXJ0aWFsbHkKKwkgKiBpbml0aWFsaXNlZCBzdGF0aW9uIQorCSAqLworCVdBUk5fT04oc3RhX2lkID09IElMX0lOVkFMSURfU1RBVElPTik7CisKKwlyZXR1cm4gc3RhX2lkOworfQorCisvKioKKyAqIGlsX3F1ZXVlX2luY193cmFwIC0gaW5jcmVtZW50IHF1ZXVlIGlkeCwgd3JhcCBiYWNrIHRvIGJlZ2lubmluZworICogQGlkeCAtLSBjdXJyZW50IGlkeAorICogQG5fYmQgLS0gdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gcXVldWUgKG11c3QgYmUgcG93ZXIgb2YgMikKKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lsX3F1ZXVlX2luY193cmFwKGludCBpZHgsIGludCBuX2JkKQoreworCXJldHVybiArK2lkeCAmIChuX2JkIC0gMSk7Cit9CisKKy8qKgorICogaWxfcXVldWVfZGVjX3dyYXAgLSBkZWNyZW1lbnQgcXVldWUgaWR4LCB3cmFwIGJhY2sgdG8gZW5kCisgKiBAaWR4IC0tIGN1cnJlbnQgaWR4CisgKiBAbl9iZCAtLSB0b3RhbCBudW1iZXIgb2YgZW50cmllcyBpbiBxdWV1ZSAobXVzdCBiZSBwb3dlciBvZiAyKQorICovCitzdGF0aWMgaW5saW5lIGludAoraWxfcXVldWVfZGVjX3dyYXAoaW50IGlkeCwgaW50IG5fYmQpCit7CisJcmV0dXJuIC0taWR4ICYgKG5fYmQgLSAxKTsKK30KKworLyogVE9ETzogTW92ZSBmd19kZXNjIGZ1bmN0aW9ucyB0byBpd2wtcGNpLmtvICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2ZyZWVfZndfZGVzYyhzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldiwgc3RydWN0IGZ3X2Rlc2MgKmRlc2MpCit7CisJaWYgKGRlc2MtPnZfYWRkcikKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBjaV9kZXYtPmRldiwgZGVzYy0+bGVuLCBkZXNjLT52X2FkZHIsCisJCQkJICBkZXNjLT5wX2FkZHIpOworCWRlc2MtPnZfYWRkciA9IE5VTEw7CisJZGVzYy0+bGVuID0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2lsX2FsbG9jX2Z3X2Rlc2Moc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHN0cnVjdCBmd19kZXNjICpkZXNjKQoreworCWlmICghZGVzYy0+bGVuKSB7CisJCWRlc2MtPnZfYWRkciA9IE5VTEw7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWRlc2MtPnZfYWRkciA9CisJICAgIGRtYV9hbGxvY19jb2hlcmVudCgmcGNpX2Rldi0+ZGV2LCBkZXNjLT5sZW4sICZkZXNjLT5wX2FkZHIsCisJCQkgICAgICAgR0ZQX0tFUk5FTCk7CisJcmV0dXJuIChkZXNjLT52X2FkZHIgIT0gTlVMTCkgPyAwIDogLUVOT01FTTsKK30KKworLyoKKyAqIHdlIGhhdmUgOCBiaXRzIHVzZWQgbGlrZSB0aGlzOgorICoKKyAqIDcgNiA1IDQgMyAyIDEgMAorICogfCB8IHwgfCB8IHwgfCB8CisgKiB8IHwgfCB8IHwgfCArLSstLS0tLS0tLSBBQyBxdWV1ZSAoMC0zKQorICogfCB8IHwgfCB8IHwKKyAqIHwgKy0rLSstKy0rLS0tLS0tLS0tLS0tIEhXIHF1ZXVlIElECisgKiB8CisgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB1bnVzZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lkCitpbF9zZXRfc3dxX2lkKHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxLCB1OCBhYywgdTggaHdxKQoreworCUJVR19PTihhYyA+IDMpOwkJLyogb25seSBoYXZlIDIgYml0cyAqLworCUJVR19PTihod3EgPiAzMSk7CS8qIG9ubHkgdXNlIDUgYml0cyAqLworCisJdHhxLT5zd3FfaWQgPSAoaHdxIDw8IDIpIHwgYWM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfd2FrZV9xdWV1ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKQoreworCXU4IHF1ZXVlID0gdHhxLT5zd3FfaWQ7CisJdTggYWMgPSBxdWV1ZSAmIDM7CisJdTggaHdxID0gKHF1ZXVlID4+IDIpICYgMHgxZjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoaHdxLCBpbC0+cXVldWVfc3RvcHBlZCkpCisJCWlmIChhdG9taWNfZGVjX3JldHVybigmaWwtPnF1ZXVlX3N0b3BfY291bnRbYWNdKSA8PSAwKQorCQkJaWVlZTgwMjExX3dha2VfcXVldWUoaWwtPmh3LCBhYyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfc3RvcF9xdWV1ZShzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxKQoreworCXU4IHF1ZXVlID0gdHhxLT5zd3FfaWQ7CisJdTggYWMgPSBxdWV1ZSAmIDM7CisJdTggaHdxID0gKHF1ZXVlID4+IDIpICYgMHgxZjsKKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChod3EsIGlsLT5xdWV1ZV9zdG9wcGVkKSkKKwkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZpbC0+cXVldWVfc3RvcF9jb3VudFthY10pID4gMCkKKwkJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKGlsLT5odywgYWMpOworfQorCisjaWZkZWYgaWVlZTgwMjExX3N0b3BfcXVldWUKKyN1bmRlZiBpZWVlODAyMTFfc3RvcF9xdWV1ZQorI2VuZGlmCisKKyNkZWZpbmUgaWVlZTgwMjExX3N0b3BfcXVldWUgRE9fTk9UX1VTRV9pZWVlODAyMTFfc3RvcF9xdWV1ZQorCisjaWZkZWYgaWVlZTgwMjExX3dha2VfcXVldWUKKyN1bmRlZiBpZWVlODAyMTFfd2FrZV9xdWV1ZQorI2VuZGlmCisKKyNkZWZpbmUgaWVlZTgwMjExX3dha2VfcXVldWUgRE9fTk9UX1VTRV9pZWVlODAyMTFfd2FrZV9xdWV1ZQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJY2xlYXJfYml0KFNfSU5UX0VOQUJMRUQsICZpbC0+c3RhdHVzKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmcm9tIHVDb2RlL05JQyB0byBob3N0ICovCisJX2lsX3dyKGlsLCBDU1JfSU5UX01BU0ssIDB4MDAwMDAwMDApOworCisJLyogYWNrbm93bGVkZ2UvY2xlYXIvcmVzZXQgYW55IGludGVycnVwdHMgc3RpbGwgcGVuZGluZworCSAqIGZyb20gdUNvZGUgb3IgZmxvdyBoYW5kbGVyIChSeC9UeCBETUEpICovCisJX2lsX3dyKGlsLCBDU1JfSU5ULCAweGZmZmZmZmZmKTsKKwlfaWxfd3IoaWwsIENTUl9GSF9JTlRfU1RBVFVTLCAweGZmZmZmZmZmKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitpbF9lbmFibGVfcmZraWxsX2ludChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJX2lsX3dyKGlsLCBDU1JfSU5UX01BU0ssIENTUl9JTlRfQklUX1JGX0tJTEwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlzZXRfYml0KFNfSU5UX0VOQUJMRUQsICZpbC0+c3RhdHVzKTsKKwlfaWxfd3IoaWwsIENTUl9JTlRfTUFTSywgaWwtPmludGFfbWFzayk7Cit9CisKKy8qKgorICogaWxfYmVhY29uX3RpbWVfbWFza19sb3cgLSBtYXNrIG9mIGxvd2VyIDMyIGJpdCBvZiBiZWFjb24gdGltZQorICogQGlsIC0tIHBvaW50ZXIgdG8gaWxfcHJpdiBkYXRhIHN0cnVjdHVyZQorICogQHRzZl9iaXRzIC0tIG51bWJlciBvZiBiaXRzIG5lZWQgdG8gc2hpZnQgZm9yIG1hc2tpbmcpCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitpbF9iZWFjb25fdGltZV9tYXNrX2xvdyhzdHJ1Y3QgaWxfcHJpdiAqaWwsIHUxNiB0c2ZfYml0cykKK3sKKwlyZXR1cm4gKDEgPDwgdHNmX2JpdHMpIC0gMTsKK30KKworLyoqCisgKiBpbF9iZWFjb25fdGltZV9tYXNrX2hpZ2ggLSBtYXNrIG9mIGhpZ2hlciAzMiBiaXQgb2YgYmVhY29uIHRpbWUKKyAqIEBpbCAtLSBwb2ludGVyIHRvIGlsX3ByaXYgZGF0YSBzdHJ1Y3R1cmUKKyAqIEB0c2ZfYml0cyAtLSBudW1iZXIgb2YgYml0cyBuZWVkIHRvIHNoaWZ0IGZvciBtYXNraW5nKQorICovCitzdGF0aWMgaW5saW5lIHUzMgoraWxfYmVhY29uX3RpbWVfbWFza19oaWdoKHN0cnVjdCBpbF9wcml2ICppbCwgdTE2IHRzZl9iaXRzKQoreworCXJldHVybiAoKDEgPDwgKDMyIC0gdHNmX2JpdHMpKSAtIDEpIDw8IHRzZl9iaXRzOworfQorCisvKioKKyAqIHN0cnVjdCBpbF9yYl9zdGF0dXMgLSByZXNldmUgYnVmZmVyIHN0YXR1cyBob3N0IG1lbW9yeSBtYXBwZWQgRkggcmVnaXN0ZXJzCisgKgorICogQGNsb3NlZF9yYl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpZHggb2YgdGhlIFJCIHdoaWNoIHdhcyBjbG9zZWQKKyAqIEBjbG9zZWRfZnJfbnVtIFswOjExXSAtIEluZGljYXRlcyB0aGUgaWR4IG9mIHRoZSBSWCBGcmFtZSB3aGljaCB3YXMgY2xvc2VkCisgKiBAZmluaXNoZWRfcmJfbnVtIFswOjExXSAtIEluZGljYXRlcyB0aGUgaWR4IG9mIHRoZSBjdXJyZW50IFJCCisgKgkJCSAgICAgaW4gd2hpY2ggdGhlIGxhc3QgZnJhbWUgd2FzIHdyaXR0ZW4gdG8KKyAqIEBmaW5pc2hlZF9mcl9udW0gWzA6MTFdIC0gSW5kaWNhdGVzIHRoZSBpZHggb2YgdGhlIFJYIEZyYW1lCisgKgkJCSAgICAgd2hpY2ggd2FzIHRyYW5zZmVycmVkCisgKi8KK3N0cnVjdCBpbF9yYl9zdGF0dXMgeworCV9fbGUxNiBjbG9zZWRfcmJfbnVtOworCV9fbGUxNiBjbG9zZWRfZnJfbnVtOworCV9fbGUxNiBmaW5pc2hlZF9yYl9udW07CisJX19sZTE2IGZpbmlzaGVkX2ZyX25hbTsKKwlfX2xlMzIgX191bnVzZWQ7CS8qIDM5NDUgb25seSAqLworfSBfX3BhY2tlZDsKKworI2RlZmluZSBURkRfUVVFVUVfU0laRV9NQVggICAgICAoMjU2KQorI2RlZmluZSBURkRfUVVFVUVfU0laRV9CQ19EVVAJKDY0KQorI2RlZmluZSBURkRfUVVFVUVfQkNfU0laRQkoVEZEX1FVRVVFX1NJWkVfTUFYICsgVEZEX1FVRVVFX1NJWkVfQkNfRFVQKQorI2RlZmluZSBJTF9UWF9ETUFfTUFTSyAgICAgICAgRE1BX0JJVF9NQVNLKDM2KQorI2RlZmluZSBJTF9OVU1fT0ZfVEJTCQkyMAorCitzdGF0aWMgaW5saW5lIHU4CitpbF9nZXRfZG1hX2hpX2FkZHIoZG1hX2FkZHJfdCBhZGRyKQoreworCXJldHVybiAoc2l6ZW9mKGFkZHIpID4gc2l6ZW9mKHUzMikgPyAoYWRkciA+PiAxNikgPj4gMTYgOiAwKSAmIDB4RjsKK30KKworLyoqCisgKiBzdHJ1Y3QgaWxfdGZkX3RiIHRyYW5zbWl0IGJ1ZmZlciBkZXNjcmlwdG9yIHdpdGhpbiB0cmFuc21pdCBmcmFtZSBkZXNjcmlwdG9yCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZG1hIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0cmFuc21pc3Npb24gYWRkcmVzcworICoKKyAqIEBsbzogbG93IFszMTowXSBwb3J0aW9uIG9mIHRoZSBkbWEgYWRkcmVzcyBvZiBUWCBidWZmZXIgZXZlcnkgZXZlbiBpcworICoJdW5hbGlnbmVkIG9uIDE2IGJpdCBib3VuZGFyeQorICogQGhpX25fbGVuOiAwLTMgWzM1OjMyXSBwb3J0aW9uIG9mIGRtYQorICoJICAgICAgNC0xNSBsZW5ndGggb2YgdGhlIHR4IGJ1ZmZlcgorICovCitzdHJ1Y3QgaWxfdGZkX3RiIHsKKwlfX2xlMzIgbG87CisJX19sZTE2IGhpX25fbGVuOworfSBfX3BhY2tlZDsKKworLyoqCisgKiBzdHJ1Y3QgaWxfdGZkCisgKgorICogVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvciAoVEZEKQorICoKKyAqIEAgX19yZXNlcnZlZDFbM10gcmVzZXJ2ZWQKKyAqIEAgbnVtX3RicyAwLTQgbnVtYmVyIG9mIGFjdGl2ZSB0YnMKKyAqCSAgICAgNSAgIHJlc2VydmVkCisgKiAJICAgICA2LTcgcGFkZGluZyAobm90IHVzZWQpCisgKiBAIHRic1syMF0JdHJhbnNtaXQgZnJhbWUgYnVmZmVyIGRlc2NyaXB0b3JzCisgKiBAIF9fcGFkCXBhZGRpbmcKKyAqCisgKiBFYWNoIFR4IHF1ZXVlIHVzZXMgYSBjaXJjdWxhciBidWZmZXIgb2YgMjU2IFRGRHMgc3RvcmVkIGluIGhvc3QgRFJBTS4KKyAqIEJvdGggZHJpdmVyIGFuZCBkZXZpY2Ugc2hhcmUgdGhlc2UgY2lyY3VsYXIgYnVmZmVycywgZWFjaCBvZiB3aGljaCBtdXN0IGJlCisgKiBjb250aWd1b3VzIDI1NiBURkRzIHggMTI4IGJ5dGVzLXBlci1URkQgPSAzMiBLQnl0ZXMKKyAqCisgKiBEcml2ZXIgbXVzdCBpbmRpY2F0ZSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgYmFzZSBvZiBlYWNoCisgKiBjaXJjdWxhciBidWZmZXIgdmlhIHRoZSBGSDQ5X01FTV9DQkJDX1FVRVVFIHJlZ2lzdGVycy4KKyAqCisgKiBFYWNoIFRGRCBjb250YWlucyBwb2ludGVyL3NpemUgaW5mb3JtYXRpb24gZm9yIHVwIHRvIDIwIGRhdGEgYnVmZmVycworICogaW4gaG9zdCBEUkFNLiAgVGhlc2UgYnVmZmVycyBjb2xsZWN0aXZlbHkgY29udGFpbiB0aGUgKG9uZSkgZnJhbWUgZGVzY3JpYmVkCisgKiBieSB0aGUgVEZELiAgRWFjaCBidWZmZXIgbXVzdCBiZSBhIHNpbmdsZSBjb250aWd1b3VzIGJsb2NrIG9mIG1lbW9yeSB3aXRoaW4KKyAqIGl0c2VsZiwgYnV0IGJ1ZmZlcnMgbWF5IGJlIHNjYXR0ZXJlZCBpbiBob3N0IERSQU0uICBFYWNoIGJ1ZmZlciBoYXMgbWF4IHNpemUKKyAqIG9mICg0SyAtIDQpLiAgVGhlIGNvbmNhdGVuYXRlcyBhbGwgb2YgYSBURkQncyBidWZmZXJzIGludG8gYSBzaW5nbGUKKyAqIFR4IGZyYW1lLCB1cCB0byA4IEtCeXRlcyBpbiBzaXplLgorICoKKyAqIEEgbWF4aW11bSBvZiAyNTUgKG5vdCAyNTYhKSBURkRzIG1heSBiZSBvbiBhIHF1ZXVlIHdhaXRpbmcgZm9yIFR4LgorICovCitzdHJ1Y3QgaWxfdGZkIHsKKwl1OCBfX3Jlc2VydmVkMVszXTsKKwl1OCBudW1fdGJzOworCXN0cnVjdCBpbF90ZmRfdGIgdGJzW0lMX05VTV9PRl9UQlNdOworCV9fbGUzMiBfX3BhZDsKK30gX19wYWNrZWQ7CisvKiBQQ0kgcmVnaXN0ZXJzICovCisjZGVmaW5lIFBDSV9DRkdfUkVUUllfVElNRU9VVAkweDA0MQorCisvKiBQQ0kgcmVnaXN0ZXIgdmFsdWVzICovCisjZGVmaW5lIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMFNfRU4JMHgwMQorI2RlZmluZSBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4JMHgwMgorCitzdHJ1Y3QgaWxfcmF0ZV9pbmZvIHsKKwl1OCBwbGNwOwkJLyogdUNvZGUgQVBJOiAgUkFURV82TV9QTENQLCBldGMuICovCisJdTggcGxjcF9zaXNvOwkJLyogdUNvZGUgQVBJOiAgUkFURV9TSVNPXzZNX1BMQ1AsIGV0Yy4gKi8KKwl1OCBwbGNwX21pbW8yOwkJLyogdUNvZGUgQVBJOiAgUkFURV9NSU1PMl82TV9QTENQLCBldGMuICovCisJdTggaWVlZTsJCS8qIE1BQyBoZWFkZXI6ICBSQVRFXzZNX0lFRUUsIGV0Yy4gKi8KKwl1OCBwcmV2X2llZWU7CQkvKiBwcmV2aW91cyByYXRlIGluIElFRUUgc3BlZWRzICovCisJdTggbmV4dF9pZWVlOwkJLyogbmV4dCByYXRlIGluIElFRUUgc3BlZWRzICovCisJdTggcHJldl9yczsJCS8qIHByZXZpb3VzIHJhdGUgdXNlZCBpbiBycyBhbGdvICovCisJdTggbmV4dF9yczsJCS8qIG5leHQgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KKwl1OCBwcmV2X3JzX3RnZzsJCS8qIHByZXZpb3VzIHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLworCXU4IG5leHRfcnNfdGdnOwkJLyogbmV4dCByYXRlIHVzZWQgaW4gVEdHIHJzIGFsZ28gKi8KK307CisKK3N0cnVjdCBpbDM5NDVfcmF0ZV9pbmZvIHsKKwl1OCBwbGNwOwkJLyogdUNvZGUgQVBJOiAgUkFURV82TV9QTENQLCBldGMuICovCisJdTggaWVlZTsJCS8qIE1BQyBoZWFkZXI6ICBSQVRFXzZNX0lFRUUsIGV0Yy4gKi8KKwl1OCBwcmV2X2llZWU7CQkvKiBwcmV2aW91cyByYXRlIGluIElFRUUgc3BlZWRzICovCisJdTggbmV4dF9pZWVlOwkJLyogbmV4dCByYXRlIGluIElFRUUgc3BlZWRzICovCisJdTggcHJldl9yczsJCS8qIHByZXZpb3VzIHJhdGUgdXNlZCBpbiBycyBhbGdvICovCisJdTggbmV4dF9yczsJCS8qIG5leHQgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KKwl1OCBwcmV2X3JzX3RnZzsJCS8qIHByZXZpb3VzIHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLworCXU4IG5leHRfcnNfdGdnOwkJLyogbmV4dCByYXRlIHVzZWQgaW4gVEdHIHJzIGFsZ28gKi8KKwl1OCB0YWJsZV9yc19pZHg7CS8qIGlkeCBpbiByYXRlIHNjYWxlIHRhYmxlIGNtZCAqLworCXU4IHByZXZfdGFibGVfcnM7CS8qIHByZXYgaW4gcmF0ZSB0YWJsZSBjbWQgKi8KK307CisKKy8qCisgKiBUaGVzZSBzZXJ2ZSBhcyBpZHhlcyBpbnRvCisgKiBzdHJ1Y3QgaWxfcmF0ZV9pbmZvIGlsX3JhdGVzW1JBVEVfQ09VTlRdOworICovCitlbnVtIHsKKwlSQVRFXzFNX0lEWCA9IDAsCisJUkFURV8yTV9JRFgsCisJUkFURV81TV9JRFgsCisJUkFURV8xMU1fSURYLAorCVJBVEVfNk1fSURYLAorCVJBVEVfOU1fSURYLAorCVJBVEVfMTJNX0lEWCwKKwlSQVRFXzE4TV9JRFgsCisJUkFURV8yNE1fSURYLAorCVJBVEVfMzZNX0lEWCwKKwlSQVRFXzQ4TV9JRFgsCisJUkFURV81NE1fSURYLAorCVJBVEVfNjBNX0lEWCwKKwlSQVRFX0NPVU5ULAorCVJBVEVfQ09VTlRfTEVHQUNZID0gUkFURV9DT1VOVCAtIDEsCS8qIEV4Y2x1ZGluZyA2ME0gKi8KKwlSQVRFX0NPVU5UXzM5NDUgPSBSQVRFX0NPVU5UIC0gMSwKKwlSQVRFX0lOVk1fSURYID0gUkFURV9DT1VOVCwKKwlSQVRFX0lOVkFMSUQgPSBSQVRFX0NPVU5ULAorfTsKKworZW51bSB7CisJUkFURV82TV9JRFhfVEJMID0gMCwKKwlSQVRFXzlNX0lEWF9UQkwsCisJUkFURV8xMk1fSURYX1RCTCwKKwlSQVRFXzE4TV9JRFhfVEJMLAorCVJBVEVfMjRNX0lEWF9UQkwsCisJUkFURV8zNk1fSURYX1RCTCwKKwlSQVRFXzQ4TV9JRFhfVEJMLAorCVJBVEVfNTRNX0lEWF9UQkwsCisJUkFURV8xTV9JRFhfVEJMLAorCVJBVEVfMk1fSURYX1RCTCwKKwlSQVRFXzVNX0lEWF9UQkwsCisJUkFURV8xMU1fSURYX1RCTCwKKwlSQVRFX0lOVk1fSURYX1RCTCA9IFJBVEVfSU5WTV9JRFggLSAxLAorfTsKKworZW51bSB7CisJSUxfRklSU1RfT0ZETV9SQVRFID0gUkFURV82TV9JRFgsCisJSUwzOV9MQVNUX09GRE1fUkFURSA9IFJBVEVfNTRNX0lEWCwKKwlJTF9MQVNUX09GRE1fUkFURSA9IFJBVEVfNjBNX0lEWCwKKwlJTF9GSVJTVF9DQ0tfUkFURSA9IFJBVEVfMU1fSURYLAorCUlMX0xBU1RfQ0NLX1JBVEUgPSBSQVRFXzExTV9JRFgsCit9OworCisvKiAjZGVmaW5lIHZzLiBlbnVtIHRvIGtlZXAgZnJvbSBkZWZhdWx0aW5nIHRvICdsYXJnZSBpbnRlZ2VyJyAqLworI2RlZmluZQlSQVRFXzZNX01BU0sgICAoMSA8PCBSQVRFXzZNX0lEWCkKKyNkZWZpbmUJUkFURV85TV9NQVNLICAgKDEgPDwgUkFURV85TV9JRFgpCisjZGVmaW5lCVJBVEVfMTJNX01BU0sgICgxIDw8IFJBVEVfMTJNX0lEWCkKKyNkZWZpbmUJUkFURV8xOE1fTUFTSyAgKDEgPDwgUkFURV8xOE1fSURYKQorI2RlZmluZQlSQVRFXzI0TV9NQVNLICAoMSA8PCBSQVRFXzI0TV9JRFgpCisjZGVmaW5lCVJBVEVfMzZNX01BU0sgICgxIDw8IFJBVEVfMzZNX0lEWCkKKyNkZWZpbmUJUkFURV80OE1fTUFTSyAgKDEgPDwgUkFURV80OE1fSURYKQorI2RlZmluZQlSQVRFXzU0TV9NQVNLICAoMSA8PCBSQVRFXzU0TV9JRFgpCisjZGVmaW5lIFJBVEVfNjBNX01BU0sgICgxIDw8IFJBVEVfNjBNX0lEWCkKKyNkZWZpbmUJUkFURV8xTV9NQVNLICAgKDEgPDwgUkFURV8xTV9JRFgpCisjZGVmaW5lCVJBVEVfMk1fTUFTSyAgICgxIDw8IFJBVEVfMk1fSURYKQorI2RlZmluZQlSQVRFXzVNX01BU0sgICAoMSA8PCBSQVRFXzVNX0lEWCkKKyNkZWZpbmUJUkFURV8xMU1fTUFTSyAgKDEgPDwgUkFURV8xMU1fSURYKQorCisvKiB1Q29kZSBBUEkgdmFsdWVzIGZvciBsZWdhY3kgYml0IHJhdGVzLCBib3RoIE9GRE0gYW5kIENDSyAqLworZW51bSB7CisJUkFURV82TV9QTENQID0gMTMsCisJUkFURV85TV9QTENQID0gMTUsCisJUkFURV8xMk1fUExDUCA9IDUsCisJUkFURV8xOE1fUExDUCA9IDcsCisJUkFURV8yNE1fUExDUCA9IDksCisJUkFURV8zNk1fUExDUCA9IDExLAorCVJBVEVfNDhNX1BMQ1AgPSAxLAorCVJBVEVfNTRNX1BMQ1AgPSAzLAorCVJBVEVfNjBNX1BMQ1AgPSAzLAkvKkZJWE1FOlJTOnNob3VsZCBiZSByZW1vdmVkICovCisJUkFURV8xTV9QTENQID0gMTAsCisJUkFURV8yTV9QTENQID0gMjAsCisJUkFURV81TV9QTENQID0gNTUsCisJUkFURV8xMU1fUExDUCA9IDExMCwKKwkvKkZJWE1FOlJTOmFkZCBSQVRFX0xFR0FDWV9JTlZNX1BMQ1AgPSAwLCAqLworfTsKKworLyogdUNvZGUgQVBJIHZhbHVlcyBmb3IgT0ZETSBoaWdoLXRocm91Z2hwdXQgKEhUKSBiaXQgcmF0ZXMgKi8KK2VudW0geworCVJBVEVfU0lTT182TV9QTENQID0gMCwKKwlSQVRFX1NJU09fMTJNX1BMQ1AgPSAxLAorCVJBVEVfU0lTT18xOE1fUExDUCA9IDIsCisJUkFURV9TSVNPXzI0TV9QTENQID0gMywKKwlSQVRFX1NJU09fMzZNX1BMQ1AgPSA0LAorCVJBVEVfU0lTT180OE1fUExDUCA9IDUsCisJUkFURV9TSVNPXzU0TV9QTENQID0gNiwKKwlSQVRFX1NJU09fNjBNX1BMQ1AgPSA3LAorCVJBVEVfTUlNTzJfNk1fUExDUCA9IDB4OCwKKwlSQVRFX01JTU8yXzEyTV9QTENQID0gMHg5LAorCVJBVEVfTUlNTzJfMThNX1BMQ1AgPSAweGEsCisJUkFURV9NSU1PMl8yNE1fUExDUCA9IDB4YiwKKwlSQVRFX01JTU8yXzM2TV9QTENQID0gMHhjLAorCVJBVEVfTUlNTzJfNDhNX1BMQ1AgPSAweGQsCisJUkFURV9NSU1PMl81NE1fUExDUCA9IDB4ZSwKKwlSQVRFX01JTU8yXzYwTV9QTENQID0gMHhmLAorCVJBVEVfU0lTT19JTlZNX1BMQ1AsCisJUkFURV9NSU1PMl9JTlZNX1BMQ1AgPSBSQVRFX1NJU09fSU5WTV9QTENQLAorfTsKKworLyogTUFDIGhlYWRlciB2YWx1ZXMgZm9yIGJpdCByYXRlcyAqLworZW51bSB7CisJUkFURV82TV9JRUVFID0gMTIsCisJUkFURV85TV9JRUVFID0gMTgsCisJUkFURV8xMk1fSUVFRSA9IDI0LAorCVJBVEVfMThNX0lFRUUgPSAzNiwKKwlSQVRFXzI0TV9JRUVFID0gNDgsCisJUkFURV8zNk1fSUVFRSA9IDcyLAorCVJBVEVfNDhNX0lFRUUgPSA5NiwKKwlSQVRFXzU0TV9JRUVFID0gMTA4LAorCVJBVEVfNjBNX0lFRUUgPSAxMjAsCisJUkFURV8xTV9JRUVFID0gMiwKKwlSQVRFXzJNX0lFRUUgPSA0LAorCVJBVEVfNU1fSUVFRSA9IDExLAorCVJBVEVfMTFNX0lFRUUgPSAyMiwKK307CisKKyNkZWZpbmUgSUxfQ0NLX0JBU0lDX1JBVEVTX01BU0sgICAgXAorCShSQVRFXzFNX01BU0sgICAgICAgICAgfCBcCisJUkFURV8yTV9NQVNLKQorCisjZGVmaW5lIElMX0NDS19SQVRFU19NQVNLICAgICAgICAgIFwKKwkoSUxfQ0NLX0JBU0lDX1JBVEVTX01BU0sgIHwgXAorCVJBVEVfNU1fTUFTSyAgICAgICAgICB8IFwKKwlSQVRFXzExTV9NQVNLKQorCisjZGVmaW5lIElMX09GRE1fQkFTSUNfUkFURVNfTUFTSyAgIFwKKwkoUkFURV82TV9NQVNLICAgICAgICAgfCBcCisJUkFURV8xMk1fTUFTSyAgICAgICAgIHwgXAorCVJBVEVfMjRNX01BU0spCisKKyNkZWZpbmUgSUxfT0ZETV9SQVRFU19NQVNLICAgICAgICAgXAorCShJTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgfCBcCisJUkFURV85TV9NQVNLICAgICAgICAgIHwgXAorCVJBVEVfMThNX01BU0sgICAgICAgICB8IFwKKwlSQVRFXzM2TV9NQVNLICAgICAgICAgfCBcCisJUkFURV80OE1fTUFTSyAgICAgICAgIHwgXAorCVJBVEVfNTRNX01BU0spCisKKyNkZWZpbmUgSUxfQkFTSUNfUkFURVNfTUFTSyAgICAgICAgIFwKKwkoSUxfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAorCSBJTF9DQ0tfQkFTSUNfUkFURVNfTUFTSykKKworI2RlZmluZSBSQVRFU19NQVNLICgoMSA8PCBSQVRFX0NPVU5UKSAtIDEpCisjZGVmaW5lIFJBVEVTX01BU0tfMzk0NSAoKDEgPDwgUkFURV9DT1VOVF8zOTQ1KSAtIDEpCisKKyNkZWZpbmUgSUxfSU5WQUxJRF9WQUxVRSAgICAtMQorCisjZGVmaW5lIElMX01JTl9SU1NJX1ZBTCAgICAgICAgICAgICAgICAgLTEwMAorI2RlZmluZSBJTF9NQVhfUlNTSV9WQUwgICAgICAgICAgICAgICAgICAgIDAKKworLyogVGhlc2UgdmFsdWVzIHNwZWNpZnkgaG93IG1hbnkgVHggZnJhbWUgYXR0ZW1wdHMgYmVmb3JlCisgKiBzZWFyY2hpbmcgZm9yIGEgbmV3IG1vZHVsYXRpb24gbW9kZSAqLworI2RlZmluZSBJTF9MRUdBQ1lfRkFJTFVSRV9MSU1JVAkxNjAKKyNkZWZpbmUgSUxfTEVHQUNZX1NVQ0NFU1NfTElNSVQJNDgwCisjZGVmaW5lIElMX0xFR0FDWV9UQkxfQ09VTlQJCTE2MAorCisjZGVmaW5lIElMX05PTkVfTEVHQUNZX0ZBSUxVUkVfTElNSVQJNDAwCisjZGVmaW5lIElMX05PTkVfTEVHQUNZX1NVQ0NFU1NfTElNSVQJNDUwMAorI2RlZmluZSBJTF9OT05FX0xFR0FDWV9UQkxfQ09VTlQJMTUwMAorCisvKiBTdWNjZXNzIHJhdGlvIChBQ0tlZCAvIGF0dGVtcHRlZCB0eCBmcmFtZXMpIHZhbHVlcyAocGVyZmVjdCBpcyAxMjggKiAxMDApICovCisjZGVmaW5lIElMX1JTX0dPT0RfUkFUSU8JCTEyODAwCS8qIDEwMCUgKi8KKyNkZWZpbmUgUkFURV9TQ0FMRV9TV0lUQ0gJCTEwODgwCS8qICA4NSUgKi8KKyNkZWZpbmUgUkFURV9ISUdIX1RICQkxMDg4MAkvKiAgODUlICovCisjZGVmaW5lIFJBVEVfSU5DUkVBU0VfVEgJCTY0MDAJLyogIDUwJSAqLworI2RlZmluZSBSQVRFX0RFQ1JFQVNFX1RICQkxOTIwCS8qICAxNSUgKi8KKworLyogcG9zc2libGUgYWN0aW9ucyB3aGVuIGluIGxlZ2FjeSBtb2RlICovCisjZGVmaW5lIElMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTEgICAgICAwCisjZGVmaW5lIElMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTIgICAgICAxCisjZGVmaW5lIElMX0xFR0FDWV9TV0lUQ0hfU0lTTyAgICAgICAgICAyCisjZGVmaW5lIElMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQUIgICAgICAzCisjZGVmaW5lIElMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQUMgICAgICA0CisjZGVmaW5lIElMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQkMgICAgICA1CisKKy8qIHBvc3NpYmxlIGFjdGlvbnMgd2hlbiBpbiBzaXNvIG1vZGUgKi8KKyNkZWZpbmUgSUxfU0lTT19TV0lUQ0hfQU5URU5OQTEgICAgICAgIDAKKyNkZWZpbmUgSUxfU0lTT19TV0lUQ0hfQU5URU5OQTIgICAgICAgIDEKKyNkZWZpbmUgSUxfU0lTT19TV0lUQ0hfTUlNTzJfQUIgICAgICAgIDIKKyNkZWZpbmUgSUxfU0lTT19TV0lUQ0hfTUlNTzJfQUMgICAgICAgIDMKKyNkZWZpbmUgSUxfU0lTT19TV0lUQ0hfTUlNTzJfQkMgICAgICAgIDQKKyNkZWZpbmUgSUxfU0lTT19TV0lUQ0hfR0kgICAgICAgICAgICAgIDUKKworLyogcG9zc2libGUgYWN0aW9ucyB3aGVuIGluIG1pbW8gbW9kZSAqLworI2RlZmluZSBJTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTEgICAgICAgMAorI2RlZmluZSBJTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTIgICAgICAgMQorI2RlZmluZSBJTF9NSU1PMl9TV0lUQ0hfU0lTT19BICAgICAgICAgMgorI2RlZmluZSBJTF9NSU1PMl9TV0lUQ0hfU0lTT19CICAgICAgICAgMworI2RlZmluZSBJTF9NSU1PMl9TV0lUQ0hfU0lTT19DICAgICAgICAgNAorI2RlZmluZSBJTF9NSU1PMl9TV0lUQ0hfR0kgICAgICAgICAgICAgNQorCisjZGVmaW5lIElMX01BWF9TRUFSQ0ggSUxfTUlNTzJfU1dJVENIX0dJCisKKyNkZWZpbmUgSUxfQUNUSU9OX0xJTUlUCQkzCS8qICMgcG9zc2libGUgYWN0aW9ucyAqLworCisjZGVmaW5lIExRX1NJWkUJCTIJLyogMiBtb2RlIHRhYmxlczogICJBY3RpdmUiIGFuZCAiU2VhcmNoIiAqLworCisvKiBsb2FkIHBlciB0aWQgZGVmaW5lcyBmb3IgQS1NUERVIGFjdGl2YXRpb24gKi8KKyNkZWZpbmUgSUxfQUdHX1RQVF9USFJFSE9MRAkwCisjZGVmaW5lIElMX0FHR19MT0FEX1RIUkVTSE9MRAkxMAorI2RlZmluZSBJTF9BR0dfQUxMX1RJRAkJMHhmZgorI2RlZmluZSBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HCTUwCS8qbVMgKi8KKyNkZWZpbmUgVElEX1FVRVVFX01BWF9TSVpFCTIwCisjZGVmaW5lIFRJRF9ST1VORF9WQUxVRQkJNQkvKiBtUyAqLworI2RlZmluZSBUSURfTUFYX0xPQURfQ09VTlQJOAorCisjZGVmaW5lIFRJRF9NQVhfVElNRV9ESUZGICgoVElEX1FVRVVFX01BWF9TSVpFIC0gMSkgKiBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HKQorI2RlZmluZSBUSU1FX1dSQVBfQVJPVU5EKHgsIHkpICgoKHkpID4gKHgpKSA/ICh5KSAtICh4KSA6ICgwLSh4KSkgKyAoeSkpCisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgaWxfcmF0ZV9pbmZvIGlsX3JhdGVzW1JBVEVfQ09VTlRdOworCitlbnVtIGlsX3RhYmxlX3R5cGUgeworCUxRX05PTkUsCisJTFFfRywJCQkvKiBsZWdhY3kgdHlwZXMgKi8KKwlMUV9BLAorCUxRX1NJU08sCQkvKiBoaWdoLXRocm91Z2hwdXQgdHlwZXMgKi8KKwlMUV9NSU1PMiwKKwlMUV9NQVgsCit9OworCisjZGVmaW5lIGlzX2xlZ2FjeSh0YmwpICgodGJsKSA9PSBMUV9HIHx8ICh0YmwpID09IExRX0EpCisjZGVmaW5lIGlzX3Npc28odGJsKSAoKHRibCkgPT0gTFFfU0lTTykKKyNkZWZpbmUgaXNfbWltbzIodGJsKSAoKHRibCkgPT0gTFFfTUlNTzIpCisjZGVmaW5lIGlzX21pbW8odGJsKSAoaXNfbWltbzIodGJsKSkKKyNkZWZpbmUgaXNfSHQodGJsKSAoaXNfc2lzbyh0YmwpIHx8IGlzX21pbW8odGJsKSkKKyNkZWZpbmUgaXNfYV9iYW5kKHRibCkgKCh0YmwpID09IExRX0EpCisjZGVmaW5lIGlzX2dfYW5kKHRibCkgKCh0YmwpID09IExRX0cpCisKKyNkZWZpbmUJQU5UX05PTkUJMHgwCisjZGVmaW5lCUFOVF9BCQlCSVQoMCkKKyNkZWZpbmUJQU5UX0IJCUJJVCgxKQorI2RlZmluZQlBTlRfQUIJCShBTlRfQSB8IEFOVF9CKQorI2RlZmluZSBBTlRfQwkJQklUKDIpCisjZGVmaW5lCUFOVF9BQwkJKEFOVF9BIHwgQU5UX0MpCisjZGVmaW5lIEFOVF9CQwkJKEFOVF9CIHwgQU5UX0MpCisjZGVmaW5lIEFOVF9BQkMJCShBTlRfQUIgfCBBTlRfQykKKworI2RlZmluZSBJTF9NQVhfTUNTX0RJU1BMQVlfU0laRQkxMgorCitzdHJ1Y3QgaWxfcmF0ZV9tY3NfaW5mbyB7CisJY2hhciBtYnBzW0lMX01BWF9NQ1NfRElTUExBWV9TSVpFXTsKKwljaGFyIG1jc1tJTF9NQVhfTUNTX0RJU1BMQVlfU0laRV07Cit9OworCisvKioKKyAqIHN0cnVjdCBpbF9yYXRlX3NjYWxlX2RhdGEgLS0gdHggc3VjY2VzcyBoaXN0b3J5IGZvciBvbmUgcmF0ZQorICovCitzdHJ1Y3QgaWxfcmF0ZV9zY2FsZV9kYXRhIHsKKwl1NjQgZGF0YTsJCS8qIGJpdG1hcCBvZiBzdWNjZXNzZnVsIGZyYW1lcyAqLworCXMzMiBzdWNjZXNzX2NvdW50ZXI7CS8qIG51bWJlciBvZiBmcmFtZXMgc3VjY2Vzc2Z1bCAqLworCXMzMiBzdWNjZXNzX3JhdGlvOwkvKiBwZXItY2VudCAqIDEyOCAgKi8KKwlzMzIgY291bnRlcjsJCS8qIG51bWJlciBvZiBmcmFtZXMgYXR0ZW1wdGVkICovCisJczMyIGF2ZXJhZ2VfdHB0OwkvKiBzdWNjZXNzIHJhdGlvICogZXhwZWN0ZWQgdGhyb3VnaHB1dCAqLworCXVuc2lnbmVkIGxvbmcgc3RhbXA7Cit9OworCisvKioKKyAqIHN0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyAtLSB0eCBwYXJhbXMgYW5kIHN1Y2Nlc3MgaGlzdG9yeSBmb3IgYWxsIHJhdGVzCisgKgorICogVGhlcmUgYXJlIHR3byBvZiB0aGVzZSBpbiBzdHJ1Y3QgaWxfbHFfc3RhLAorICogb25lIGZvciAiYWN0aXZlIiwgYW5kIG9uZSBmb3IgInNlYXJjaCIuCisgKi8KK3N0cnVjdCBpbF9zY2FsZV90YmxfaW5mbyB7CisJZW51bSBpbF90YWJsZV90eXBlIGxxX3R5cGU7CisJdTggYW50X3R5cGU7CisJdTggaXNfU0dJOwkJLyogMSA9IHNob3J0IGd1YXJkIGludGVydmFsICovCisJdTggaXNfaHQ0MDsJCS8qIDEgPSA0MCBNSHogY2hhbm5lbCB3aWR0aCAqLworCXU4IGlzX2R1cDsJCS8qIDEgPSBkdXBsaWNhdGVkIGRhdGEgc3RyZWFtcyAqLworCXU4IGFjdGlvbjsJCS8qIGNoYW5nZSBtb2R1bGF0aW9uOyBJTF9bTEVHQUNZL1NJU08vTUlNT11fU1dJVENIXyogKi8KKwl1OCBtYXhfc2VhcmNoOwkJLyogbWF4aW11biBudW1iZXIgb2YgdGFibGVzIHdlIGNhbiBzZWFyY2ggKi8KKwlzMzIgKmV4cGVjdGVkX3RwdDsJLyogdGhyb3VnaHB1dCBtZXRyaWNzOyBleHBlY3RlZF90cHRfRywgZXRjLiAqLworCXUzMiBjdXJyZW50X3JhdGU7CS8qIHJhdGVfbl9mbGFncywgdUNvZGUgQVBJIGZvcm1hdCAqLworCXN0cnVjdCBpbF9yYXRlX3NjYWxlX2RhdGEgd2luW1JBVEVfQ09VTlRdOwkvKiByYXRlIGhpc3RvcmllcyAqLworfTsKKworc3RydWN0IGlsX3RyYWZmaWNfbG9hZCB7CisJdW5zaWduZWQgbG9uZyB0aW1lX3N0YW1wOwkvKiBhZ2Ugb2YgdGhlIG9sZGVzdCBzdGF0cyAqLworCXUzMiBwYWNrZXRfY291bnRbVElEX1FVRVVFX01BWF9TSVpFXTsJLyogcGFja2V0IGNvdW50IGluIHRoaXMgdGltZQorCQkJCQkJICogc2xpY2UgKi8KKwl1MzIgdG90YWw7CQkvKiB0b3RhbCBudW0gb2YgcGFja2V0cyBkdXJpbmcgdGhlCisJCQkJICogbGFzdCBUSURfTUFYX1RJTUVfRElGRiAqLworCXU4IHF1ZXVlX2NvdW50OwkJLyogbnVtYmVyIG9mIHF1ZXVlcyB0aGF0IGhhcworCQkJCSAqIGJlZW4gdXNlZCBzaW5jZSB0aGUgbGFzdCBjbGVhbnVwICovCisJdTggaGVhZDsJCS8qIHN0YXJ0IG9mIHRoZSBjaXJjdWxhciBidWZmZXIgKi8KK307CisKKy8qKgorICogc3RydWN0IGlsX2xxX3N0YSAtLSBkcml2ZXIncyByYXRlIHNjYWxpbmcgaWxhdGUgc3RydWN0dXJlCisgKgorICogUG9pbnRlciB0byB0aGlzIGdldHMgcGFzc2VkIGJhY2sgYW5kIGZvcnRoIGJldHdlZW4gZHJpdmVyIGFuZCBtYWM4MDIxMS4KKyAqLworc3RydWN0IGlsX2xxX3N0YSB7CisJdTggYWN0aXZlX3RibDsJCS8qIGlkeCBvZiBhY3RpdmUgdGFibGUsIHJhbmdlIDAtMSAqLworCXU4IGVuYWJsZV9jb3VudGVyOwkvKiBpbmRpY2F0ZXMgSFQgbW9kZSAqLworCXU4IHN0YXlfaW5fdGJsOwkJLyogMTogZGlzYWxsb3csIDA6IGFsbG93IHNlYXJjaCBmb3IgbmV3IG1vZGUgKi8KKwl1OCBzZWFyY2hfYmV0dGVyX3RibDsJLyogMTogY3VycmVudGx5IHRyeWluZyBhbHRlcm5hdGUgbW9kZSAqLworCXMzMiBsYXN0X3RwdDsKKworCS8qIFRoZSBmb2xsb3dpbmcgZGV0ZXJtaW5lIHdoZW4gdG8gc2VhcmNoIGZvciBhIG5ldyBtb2RlICovCisJdTMyIHRhYmxlX2NvdW50X2xpbWl0OworCXUzMiBtYXhfZmFpbHVyZV9saW1pdDsJLyogIyBmYWlsZWQgZnJhbWVzIGJlZm9yZSBuZXcgc2VhcmNoICovCisJdTMyIG1heF9zdWNjZXNzX2xpbWl0OwkvKiAjIHN1Y2Nlc3NmdWwgZnJhbWVzIGJlZm9yZSBuZXcgc2VhcmNoICovCisJdTMyIHRhYmxlX2NvdW50OworCXUzMiB0b3RhbF9mYWlsZWQ7CS8qIHRvdGFsIGZhaWxlZCBmcmFtZXMsIGFueS9hbGwgcmF0ZXMgKi8KKwl1MzIgdG90YWxfc3VjY2VzczsJLyogdG90YWwgc3VjY2Vzc2Z1bCBmcmFtZXMsIGFueS9hbGwgcmF0ZXMgKi8KKwl1NjQgZmx1c2hfdGltZXI7CS8qIHRpbWUgc3RheWluZyBpbiBtb2RlIGJlZm9yZSBuZXcgc2VhcmNoICovCisKKwl1OCBhY3Rpb25fY291bnRlcjsJLyogIyBtb2RlLXN3aXRjaCBhY3Rpb25zIHRyaWVkICovCisJdTggaXNfZ3JlZW47CisJdTggaXNfZHVwOworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKKworCS8qIFRoZSBmb2xsb3dpbmcgYXJlIGJpdG1hcHMgb2YgcmF0ZXM7IFJBVEVfNk1fTUFTSywgZXRjLiAqLworCXUzMiBzdXBwX3JhdGVzOworCXUxNiBhY3RpdmVfbGVnYWN5X3JhdGU7CisJdTE2IGFjdGl2ZV9zaXNvX3JhdGU7CisJdTE2IGFjdGl2ZV9taW1vMl9yYXRlOworCXM4IG1heF9yYXRlX2lkeDsJLyogTWF4IHJhdGUgc2V0IGJ5IHVzZXIgKi8KKwl1OCBtaXNzZWRfcmF0ZV9jb3VudGVyOworCisJc3RydWN0IGlsX2xpbmtfcXVhbGl0eV9jbWQgbHE7CisJc3RydWN0IGlsX3NjYWxlX3RibF9pbmZvIGxxX2luZm9bTFFfU0laRV07CS8qICJhY3RpdmUiLCAic2VhcmNoIiAqLworCXN0cnVjdCBpbF90cmFmZmljX2xvYWQgbG9hZFtUSURfTUFYX0xPQURfQ09VTlRdOworCXU4IHR4X2FnZ190aWRfZW47CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKKwlzdHJ1Y3QgZGVudHJ5ICpyc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfZmlsZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfZmlsZTsKKwlzdHJ1Y3QgZGVudHJ5ICpyc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX2ZpbGU7CisJc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX3R4X2FnZ190aWRfZW5fZmlsZTsKKwl1MzIgZGJnX2ZpeGVkX3JhdGU7CisjZW5kaWYKKwlzdHJ1Y3QgaWxfcHJpdiAqZHJ2OworCisJLyogdXNlZCB0byBiZSBpbiBzdGFfaW5mbyAqLworCWludCBsYXN0X3R4cmF0ZV9pZHg7CisJLyogbGFzdCB0eCByYXRlX25fZmxhZ3MgKi8KKwl1MzIgbGFzdF9yYXRlX25fZmxhZ3M7CisJLyogcGFja2V0cyBkZXN0aW5lZCBmb3IgdGhpcyBTVEEgYXJlIGFnZ3JlZ2F0ZWQgKi8KKwl1OCBpc19hZ2c7Cit9OworCisvKgorICogaWxfc3RhdGlvbl9wcml2OiBEcml2ZXIncyBpbGF0ZSBzdGF0aW9uIGluZm9ybWF0aW9uCisgKgorICogV2hlbiBtYWM4MDIxMSBjcmVhdGVzIGEgc3RhdGlvbiBpdCByZXNlcnZlcyBzb21lIHNwYWNlIChody0+c3RhX2RhdGFfc2l6ZSkKKyAqIGluIHRoZSBzdHJ1Y3R1cmUgZm9yIHVzZSBieSBkcml2ZXIuIFRoaXMgc3RydWN0dXJlIGlzIHBsYWNlcyBpbiB0aGF0CisgKiBzcGFjZS4KKyAqCisgKiBUaGUgY29tbW9uIHN0cnVjdCBNVVNUIGJlIGZpcnN0IGJlY2F1c2UgaXQgaXMgc2hhcmVkIGJldHdlZW4KKyAqIDM5NDUgYW5kIDQ5NjUhCisgKi8KK3N0cnVjdCBpbF9zdGF0aW9uX3ByaXYgeworCXN0cnVjdCBpbF9zdGF0aW9uX3ByaXZfY29tbW9uIGNvbW1vbjsKKwlzdHJ1Y3QgaWxfbHFfc3RhIGxxX3N0YTsKKwlhdG9taWNfdCBwZW5kaW5nX2ZyYW1lczsKKwlib29sIGNsaWVudDsKKwlib29sIGFzbGVlcDsKK307CisKK3N0YXRpYyBpbmxpbmUgdTgKK2lsNDk2NV9udW1fb2ZfYW50KHU4IG0pCit7CisJcmV0dXJuICEhKG0gJiBBTlRfQSkgKyAhIShtICYgQU5UX0IpICsgISEobSAmIEFOVF9DKTsKK30KKworc3RhdGljIGlubGluZSB1OAoraWw0OTY1X2ZpcnN0X2FudGVubmEodTggbWFzaykKK3sKKwlpZiAobWFzayAmIEFOVF9BKQorCQlyZXR1cm4gQU5UX0E7CisJaWYgKG1hc2sgJiBBTlRfQikKKwkJcmV0dXJuIEFOVF9COworCXJldHVybiBBTlRfQzsKK30KKworLyoqCisgKiBpbDM5NDVfcmF0ZV9zY2FsZV9pbml0IC0gSW5pdGlhbGl6ZSB0aGUgcmF0ZSBzY2FsZSB0YWJsZSBiYXNlZCBvbiBhc3NvYyBpbmZvCisgKgorICogVGhlIHNwZWNpZmljIHRocm91Z2hwdXQgdGFibGUgdXNlZCBpcyBiYXNlZCBvbiB0aGUgdHlwZSBvZiBuZXR3b3JrCisgKiB0aGUgYXNzb2NpYXRlZCB3aXRoLCBpbmNsdWRpbmcgQSwgQiwgRywgYW5kIEcgdy8gVEdHIHByb3RlY3Rpb24KKyAqLworZXh0ZXJuIHZvaWQgaWwzOTQ1X3JhdGVfc2NhbGVfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgczMyIHN0YV9pZCk7CisKKy8qIEluaXRpYWxpemUgc3RhdGlvbidzIHJhdGUgc2NhbGluZyBpbmZvcm1hdGlvbiBhZnRlciBhZGRpbmcgc3RhdGlvbiAqLworZXh0ZXJuIHZvaWQgaWw0OTY1X3JzX3JhdGVfaW5pdChzdHJ1Y3QgaWxfcHJpdiAqaWwsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJdTggc3RhX2lkKTsKK2V4dGVybiB2b2lkIGlsMzk0NV9yc19yYXRlX2luaXQoc3RydWN0IGlsX3ByaXYgKmlsLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCXU4IHN0YV9pZCk7CisKKy8qKgorICogaWxfcmF0ZV9jb250cm9sX3JlZ2lzdGVyIC0gUmVnaXN0ZXIgdGhlIHJhdGUgY29udHJvbCBhbGdvcml0aG0gY2FsbGJhY2tzCisgKgorICogU2luY2UgdGhlIHJhdGUgY29udHJvbCBhbGdvcml0aG0gaXMgaGFyZHdhcmUgc3BlY2lmaWMsIHRoZXJlIGlzIG5vIG5lZWQKKyAqIG9yIHJlYXNvbiB0byBwbGFjZSBpdCBhcyBhIHN0YW5kIGFsb25lIG1vZHVsZS4gIFRoZSBkcml2ZXIgY2FuIGNhbGwKKyAqIGlsX3JhdGVfY29udHJvbF9yZWdpc3RlciBpbiBvcmRlciB0byByZWdpc3RlciB0aGUgcmF0ZSBjb250cm9sIGNhbGxiYWNrcworICogd2l0aCB0aGUgbWFjODAyMTEgc3Vic3lzdGVtLiAgVGhpcyBzaG91bGQgYmUgcGVyZm9ybWVkIHByaW9yIHRvIGNhbGxpbmcKKyAqIGllZWU4MDIxMV9yZWdpc3Rlcl9odworICoKKyAqLworZXh0ZXJuIGludCBpbDQ5NjVfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKHZvaWQpOworZXh0ZXJuIGludCBpbDM5NDVfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKHZvaWQpOworCisvKioKKyAqIGlsX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyIC0gVW5yZWdpc3RlciB0aGUgcmF0ZSBjb250cm9sIGNhbGxiYWNrcworICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjYWxsaW5nIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3LCBidXQgYmVmb3JlCisgKiB0aGUgZHJpdmVyIGlzIHVubG9hZGVkLgorICovCitleHRlcm4gdm9pZCBpbDQ5NjVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIodm9pZCk7CitleHRlcm4gdm9pZCBpbDM5NDVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIodm9pZCk7CisKK2V4dGVybiBpbnQgaWxfcG93ZXJfdXBkYXRlX21vZGUoc3RydWN0IGlsX3ByaXYgKmlsLCBib29sIGZvcmNlKTsKK2V4dGVybiB2b2lkIGlsX3Bvd2VyX2luaXRpYWxpemUoc3RydWN0IGlsX3ByaXYgKmlsKTsKKworZXh0ZXJuIHUzMiBpbF9kZWJ1Z19sZXZlbDsKKworI2lmZGVmIENPTkZJR19JV0xFR0FDWV9ERUJVRworLyoKKyAqIGlsX2dldF9kZWJ1Z19sZXZlbDogUmV0dXJuIGFjdGl2ZSBkZWJ1ZyBsZXZlbCBmb3IgZGV2aWNlCisgKgorICogVXNpbmcgc3lzZnMgaXQgaXMgcG9zc2libGUgdG8gc2V0IHBlciBkZXZpY2UgZGVidWcgbGV2ZWwuIFRoaXMgZGVidWcKKyAqIGxldmVsIHdpbGwgYmUgdXNlZCBpZiBzZXQsIG90aGVyd2lzZSB0aGUgZ2xvYmFsIGRlYnVnIGxldmVsIHdoaWNoIGNhbiBiZQorICogc2V0IHZpYSBtb2R1bGUgcGFyYW1ldGVyIGlzIHVzZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyCitpbF9nZXRfZGVidWdfbGV2ZWwoc3RydWN0IGlsX3ByaXYgKmlsKQoreworCWlmIChpbC0+ZGVidWdfbGV2ZWwpCisJCXJldHVybiBpbC0+ZGVidWdfbGV2ZWw7CisJZWxzZQorCQlyZXR1cm4gaWxfZGVidWdfbGV2ZWw7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB1MzIKK2lsX2dldF9kZWJ1Z19sZXZlbChzdHJ1Y3QgaWxfcHJpdiAqaWwpCit7CisJcmV0dXJuIGlsX2RlYnVnX2xldmVsOworfQorI2VuZGlmCisKKyNkZWZpbmUgaWxfcHJpbnRfaGV4X2Vycm9yKGlsLCBwLCBsZW4pCQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiaXdsIGRhdGE6ICIsCQkJCVwKKwkJICAgICAgIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsIHAsIGxlbiwgMSk7CQlcCit9IHdoaWxlICgwKQorCisjaWZkZWYgQ09ORklHX0lXTEVHQUNZX0RFQlVHCisjZGVmaW5lIElMX0RCRyhsZXZlbCwgZm10LCBhcmdzLi4uKQkJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIGxldmVsKQkJCQlcCisJCWRldl9wcmludGsoS0VSTl9FUlIsICZpbC0+aHctPndpcGh5LT5kZXYsCQlcCisJCQkgIiVjICVzICIgZm10LCBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywJXAorCQkJX19mdW5jX18gLCAjIyBhcmdzKTsJCQkJXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBpbF9wcmludF9oZXhfZHVtcChpbCwgbGV2ZWwsIHAsIGxlbikJCQkJXAorZG8gewkJCQkJCQkJCVwKKwlpZiAoaWxfZ2V0X2RlYnVnX2xldmVsKGlsKSAmIGxldmVsKQkJCQlcCisJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJpd2wgZGF0YTogIiwJCVwKKwkJCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLCBwLCBsZW4sIDEpOwlcCit9IHdoaWxlICgwKQorCisjZWxzZQorI2RlZmluZSBJTF9EQkcobGV2ZWwsIGZtdCwgYXJncy4uLikKK3N0YXRpYyBpbmxpbmUgdm9pZAoraWxfcHJpbnRfaGV4X2R1bXAoc3RydWN0IGlsX3ByaXYgKmlsLCBpbnQgbGV2ZWwsIGNvbnN0IHZvaWQgKnAsIHUzMiBsZW4pCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0lXTEVHQUNZX0RFQlVHICovCisKKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUdGUworaW50IGlsX2RiZ2ZzX3JlZ2lzdGVyKHN0cnVjdCBpbF9wcml2ICppbCwgY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIGlsX2RiZ2ZzX3VucmVnaXN0ZXIoc3RydWN0IGlsX3ByaXYgKmlsKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAoraWxfZGJnZnNfcmVnaXN0ZXIoc3RydWN0IGlsX3ByaXYgKmlsLCBjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2lsX2RiZ2ZzX3VucmVnaXN0ZXIoc3RydWN0IGlsX3ByaXYgKmlsKQoreworfQorI2VuZGlmIC8qIENPTkZJR19JV0xFR0FDWV9ERUJVR0ZTICovCisKKy8qCisgKiBUbyB1c2UgdGhlIGRlYnVnIHN5c3RlbToKKyAqCisgKiBJZiB5b3UgYXJlIGRlZmluaW5nIGEgbmV3IGRlYnVnIGNsYXNzaWZpY2F0aW9uLCBzaW1wbHkgYWRkIGl0IHRvIHRoZSAjZGVmaW5lCisgKiBsaXN0IGhlcmUgaW4gdGhlIGZvcm0gb2YKKyAqCisgKiAjZGVmaW5lIElMX0RMX3h4eHggVkFMVUUKKyAqCisgKiB3aGVyZSB4eHh4IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3NpZmljYXRpb24gKGZvciBleGFtcGxlLCBXRVApLgorICoKKyAqIFlvdSB0aGVuIG5lZWQgdG8gZWl0aGVyIGFkZCBhIElMX3h4eHhfREVCVUcoKSBtYWNybyBkZWZpbml0aW9uIGZvciB5b3VyCisgKiBjbGFzc2lmaWNhdGlvbiwgb3IgdXNlIElMX0RCRyhJTF9ETF94eHh4LCAuLi4pIHdoZW5ldmVyIHlvdSB3YW50CisgKiB0byBzZW5kIG91dHB1dCB0byB0aGF0IGNsYXNzaWZpY2F0aW9uLgorICoKKyAqIFRoZSBhY3RpdmUgZGVidWcgbGV2ZWxzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgZmlsZXMKKyAqCisgKgkvc3lzL21vZHVsZS9pd2w0OTY1L3BhcmFtZXRlcnMvZGVidWcKKyAqCS9zeXMvbW9kdWxlL2l3bDM5NDUvcGFyYW1ldGVycy9kZWJ1ZworICoJL3N5cy9jbGFzcy9uZXQvd2xhbjAvZGV2aWNlL2RlYnVnX2xldmVsCisgKgorICogd2hlbiBDT05GSUdfSVdMRUdBQ1lfREVCVUc9eS4KKyAqLworCisvKiAweDAwMDAwMDBGIC0gMHgwMDAwMDAwMSAqLworI2RlZmluZSBJTF9ETF9JTkZPCQkoMSA8PCAwKQorI2RlZmluZSBJTF9ETF9NQUM4MDIxMQkJKDEgPDwgMSkKKyNkZWZpbmUgSUxfRExfSENNRAkJKDEgPDwgMikKKyNkZWZpbmUgSUxfRExfU1RBVEUJCSgxIDw8IDMpCisvKiAweDAwMDAwMEYwIC0gMHgwMDAwMDAxMCAqLworI2RlZmluZSBJTF9ETF9NQUNEVU1QCQkoMSA8PCA0KQorI2RlZmluZSBJTF9ETF9IQ01EX0RVTVAJCSgxIDw8IDUpCisjZGVmaW5lIElMX0RMX0VFUFJPTQkJKDEgPDwgNikKKyNkZWZpbmUgSUxfRExfUkFESU8JCSgxIDw8IDcpCisvKiAweDAwMDAwRjAwIC0gMHgwMDAwMDEwMCAqLworI2RlZmluZSBJTF9ETF9QT1dFUgkJKDEgPDwgOCkKKyNkZWZpbmUgSUxfRExfVEVNUAkJKDEgPDwgOSkKKyNkZWZpbmUgSUxfRExfTk9USUYJCSgxIDw8IDEwKQorI2RlZmluZSBJTF9ETF9TQ0FOCQkoMSA8PCAxMSkKKy8qIDB4MDAwMEYwMDAgLSAweDAwMDAxMDAwICovCisjZGVmaW5lIElMX0RMX0FTU09DCQkoMSA8PCAxMikKKyNkZWZpbmUgSUxfRExfRFJPUAkJKDEgPDwgMTMpCisjZGVmaW5lIElMX0RMX1RYUE9XRVIJCSgxIDw8IDE0KQorI2RlZmluZSBJTF9ETF9BUAkJKDEgPDwgMTUpCisvKiAweDAwMEYwMDAwIC0gMHgwMDAxMDAwMCAqLworI2RlZmluZSBJTF9ETF9GVwkJKDEgPDwgMTYpCisjZGVmaW5lIElMX0RMX1JGX0tJTEwJCSgxIDw8IDE3KQorI2RlZmluZSBJTF9ETF9GV19FUlJPUlMJCSgxIDw8IDE4KQorI2RlZmluZSBJTF9ETF9MRUQJCSgxIDw8IDE5KQorLyogMHgwMEYwMDAwMCAtIDB4MDAxMDAwMDAgKi8KKyNkZWZpbmUgSUxfRExfUkFURQkJKDEgPDwgMjApCisjZGVmaW5lIElMX0RMX0NBTElCCQkoMSA8PCAyMSkKKyNkZWZpbmUgSUxfRExfV0VQCQkoMSA8PCAyMikKKyNkZWZpbmUgSUxfRExfVFgJCSgxIDw8IDIzKQorLyogMHgwRjAwMDAwMCAtIDB4MDEwMDAwMDAgKi8KKyNkZWZpbmUgSUxfRExfUlgJCSgxIDw8IDI0KQorI2RlZmluZSBJTF9ETF9JU1IJCSgxIDw8IDI1KQorI2RlZmluZSBJTF9ETF9IVAkJKDEgPDwgMjYpCisvKiAweEYwMDAwMDAwIC0gMHgxMDAwMDAwMCAqLworI2RlZmluZSBJTF9ETF8xMUgJCSgxIDw8IDI4KQorI2RlZmluZSBJTF9ETF9TVEFUUwkJKDEgPDwgMjkpCisjZGVmaW5lIElMX0RMX1RYX1JFUExZCQkoMSA8PCAzMCkKKyNkZWZpbmUgSUxfRExfUU9TCQkoMSA8PCAzMSkKKworI2RlZmluZSBEX0lORk8oZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9JTkZPLCBmLCAjIyBhKQorI2RlZmluZSBEX01BQzgwMjExKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9NQUM4MDIxMSwgZiwgIyMgYSkKKyNkZWZpbmUgRF9NQUNEVU1QKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9NQUNEVU1QLCBmLCAjIyBhKQorI2RlZmluZSBEX1RFTVAoZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9URU1QLCBmLCAjIyBhKQorI2RlZmluZSBEX1NDQU4oZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9TQ0FOLCBmLCAjIyBhKQorI2RlZmluZSBEX1JYKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfUlgsIGYsICMjIGEpCisjZGVmaW5lIERfVFgoZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9UWCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9JU1IoZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9JU1IsIGYsICMjIGEpCisjZGVmaW5lIERfTEVEKGYsIGEuLi4pCQlJTF9EQkcoSUxfRExfTEVELCBmLCAjIyBhKQorI2RlZmluZSBEX1dFUChmLCBhLi4uKQkJSUxfREJHKElMX0RMX1dFUCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9IQyhmLCBhLi4uKQkJSUxfREJHKElMX0RMX0hDTUQsIGYsICMjIGEpCisjZGVmaW5lIERfSENfRFVNUChmLCBhLi4uKQlJTF9EQkcoSUxfRExfSENNRF9EVU1QLCBmLCAjIyBhKQorI2RlZmluZSBEX0VFUFJPTShmLCBhLi4uKQlJTF9EQkcoSUxfRExfRUVQUk9NLCBmLCAjIyBhKQorI2RlZmluZSBEX0NBTElCKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9DQUxJQiwgZiwgIyMgYSkKKyNkZWZpbmUgRF9GVyhmLCBhLi4uKQkJSUxfREJHKElMX0RMX0ZXLCBmLCAjIyBhKQorI2RlZmluZSBEX1JGX0tJTEwoZiwgYS4uLikJSUxfREJHKElMX0RMX1JGX0tJTEwsIGYsICMjIGEpCisjZGVmaW5lIERfRFJPUChmLCBhLi4uKQkJSUxfREJHKElMX0RMX0RST1AsIGYsICMjIGEpCisjZGVmaW5lIERfQVAoZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9BUCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9UWFBPV0VSKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9UWFBPV0VSLCBmLCAjIyBhKQorI2RlZmluZSBEX1JBVEUoZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9SQVRFLCBmLCAjIyBhKQorI2RlZmluZSBEX05PVElGKGYsIGEuLi4pCUlMX0RCRyhJTF9ETF9OT1RJRiwgZiwgIyMgYSkKKyNkZWZpbmUgRF9BU1NPQyhmLCBhLi4uKQlJTF9EQkcoSUxfRExfQVNTT0MsIGYsICMjIGEpCisjZGVmaW5lIERfSFQoZiwgYS4uLikJCUlMX0RCRyhJTF9ETF9IVCwgZiwgIyMgYSkKKyNkZWZpbmUgRF9TVEFUUyhmLCBhLi4uKQlJTF9EQkcoSUxfRExfU1RBVFMsIGYsICMjIGEpCisjZGVmaW5lIERfVFhfUkVQTFkoZiwgYS4uLikJSUxfREJHKElMX0RMX1RYX1JFUExZLCBmLCAjIyBhKQorI2RlZmluZSBEX1FPUyhmLCBhLi4uKQkJSUxfREJHKElMX0RMX1FPUywgZiwgIyMgYSkKKyNkZWZpbmUgRF9SQURJTyhmLCBhLi4uKQlJTF9EQkcoSUxfRExfUkFESU8sIGYsICMjIGEpCisjZGVmaW5lIERfUE9XRVIoZiwgYS4uLikJSUxfREJHKElMX0RMX1BPV0VSLCBmLCAjIyBhKQorI2RlZmluZSBEXzExSChmLCBhLi4uKQkJSUxfREJHKElMX0RMXzExSCwgZiwgIyMgYSkKKworI2VuZGlmIC8qIF9faWxfY29yZV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jc3IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2Nzci5oCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIGRyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1jc3IuaApyZW5hbWUgdG8gZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvY3NyLmgKaW5kZXggNjY4YTk2MS4uOTEzOGUxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNzci5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2Nzci5oCkBAIC02MCw4ICs2MCw4IEBACiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2Nzcl9oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X2Nzcl9oX18KKyNpZm5kZWYgX19pbF9jc3JfaF9fCisjZGVmaW5lIF9faWxfY3NyX2hfXwogLyoKICAqIENTUiAoY29udHJvbCBhbmQgc3RhdHVzIHJlZ2lzdGVycykKICAqCkBAIC03MCw5ICs3MCw5IEBACiAgKiBsb3cgcG93ZXIgc3RhdGVzIGR1ZSB0byBkcml2ZXItaW52b2tlZCBkZXZpY2UgcmVzZXRzCiAgKiAoZS5nLiBDU1JfUkVTRVRfUkVHX0ZMQUdfU1dfUkVTRVQpIG9yIHVDb2RlLWRyaXZlbiBwb3dlci1zYXZpbmcgbW9kZXMuCiAgKgotICogVXNlIGl3bF93cml0ZTMyKCkgYW5kIGl3bF9yZWFkMzIoKSBmYW1pbHkgdG8gYWNjZXNzIHRoZXNlIHJlZ2lzdGVyczsKKyAqIFVzZSBfaWxfd3IoKSBhbmQgX2lsX3JkKCkgZmFtaWx5IHRvIGFjY2VzcyB0aGVzZSByZWdpc3RlcnM7CiAgKiB0aGVzZSBwcm92aWRlIHNpbXBsZSBQQ0kgYnVzIGFjY2Vzcywgd2l0aG91dCB3YWtpbmcgdXAgdGhlIE1BQy4KLSAqIERvIG5vdCB1c2UgaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMigpIGZhbWlseSBmb3IgdGhlc2UgcmVnaXN0ZXJzOworICogRG8gbm90IHVzZSBpbF93cigpIGZhbWlseSBmb3IgdGhlc2UgcmVnaXN0ZXJzOwogICogbm8gbmVlZCB0byAiZ3JhYiBuaWMgYWNjZXNzIiB2aWEgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRLgogICogVGhlIE1BQyAodUNvZGUgcHJvY2Vzc29yLCBldGMuKSBkb2VzIG5vdCBuZWVkIHRvIGJlIHBvd2VyZWQgdXAgZm9yIGFjY2Vzc2luZwogICogdGhlIENTUiByZWdpc3RlcnMuCkBAIC04MiwxNiArODIsMTYgQEAKICAqLwogI2RlZmluZSBDU1JfQkFTRSAgICAoMHgwMDApCiAKLSNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUcgICAgKENTUl9CQVNFKzB4MDAwKSAvKiBoYXJkd2FyZSBpbnRlcmZhY2UgY29uZmlnICovCi0jZGVmaW5lIENTUl9JTlRfQ09BTEVTQ0lORyAgICAgIChDU1JfQkFTRSsweDAwNCkgLyogYWNjdW0gaW50cywgMzItdXNlYyB1bml0cyAqLwotI2RlZmluZSBDU1JfSU5UICAgICAgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMDgpIC8qIGhvc3QgaW50ZXJydXB0IHN0YXR1cy9hY2sgKi8KLSNkZWZpbmUgQ1NSX0lOVF9NQVNLICAgICAgICAgICAgKENTUl9CQVNFKzB4MDBjKSAvKiBob3N0IGludGVycnVwdCBlbmFibGUgKi8KLSNkZWZpbmUgQ1NSX0ZIX0lOVF9TVEFUVVMgICAgICAgKENTUl9CQVNFKzB4MDEwKSAvKiBidXNtYXN0ZXIgaW50IHN0YXR1cy9hY2sqLwotI2RlZmluZSBDU1JfR1BJT19JTiAgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMTgpIC8qIHJlYWQgZXh0ZXJuYWwgY2hpcCBwaW5zICovCi0jZGVmaW5lIENTUl9SRVNFVCAgICAgICAgICAgICAgIChDU1JfQkFTRSsweDAyMCkgLyogYnVzbWFzdGVyIGVuYWJsZSwgTk1JLCBldGMqLworI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFRyAgICAoQ1NSX0JBU0UrMHgwMDApCS8qIGhhcmR3YXJlIGludGVyZmFjZSBjb25maWcgKi8KKyNkZWZpbmUgQ1NSX0lOVF9DT0FMRVNDSU5HICAgICAgKENTUl9CQVNFKzB4MDA0KQkvKiBhY2N1bSBpbnRzLCAzMi11c2VjIHVuaXRzICovCisjZGVmaW5lIENTUl9JTlQgICAgICAgICAgICAgICAgIChDU1JfQkFTRSsweDAwOCkJLyogaG9zdCBpbnRlcnJ1cHQgc3RhdHVzL2FjayAqLworI2RlZmluZSBDU1JfSU5UX01BU0sgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMGMpCS8qIGhvc3QgaW50ZXJydXB0IGVuYWJsZSAqLworI2RlZmluZSBDU1JfRkhfSU5UX1NUQVRVUyAgICAgICAoQ1NSX0JBU0UrMHgwMTApCS8qIGJ1c21hc3RlciBpbnQgc3RhdHVzL2FjayAqLworI2RlZmluZSBDU1JfR1BJT19JTiAgICAgICAgICAgICAoQ1NSX0JBU0UrMHgwMTgpCS8qIHJlYWQgZXh0ZXJuYWwgY2hpcCBwaW5zICovCisjZGVmaW5lIENTUl9SRVNFVCAgICAgICAgICAgICAgIChDU1JfQkFTRSsweDAyMCkJLyogYnVzbWFzdGVyIGVuYWJsZSwgTk1JLCBldGMgKi8KICNkZWZpbmUgQ1NSX0dQX0NOVFJMICAgICAgICAgICAgKENTUl9CQVNFKzB4MDI0KQogCi0vKiAybmQgYnl0ZSBvZiBDU1JfSU5UX0NPQUxFU0NJTkcsIG5vdCBhY2Nlc3NpYmxlIHZpYSBpd2xfd3JpdGUzMigpISAqLworLyogMm5kIGJ5dGUgb2YgQ1NSX0lOVF9DT0FMRVNDSU5HLCBub3QgYWNjZXNzaWJsZSB2aWEgX2lsX3dyKCkhICovCiAjZGVmaW5lIENTUl9JTlRfUEVSSU9ESUNfUkVHCShDU1JfQkFTRSsweDAwNSkKIAogLyoKQEAgLTE2NiwyNiArMTY2LDI2IEBACiAKICNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0hBUF9XQUtFX0wxQQkoMHgwMDA4MDAwMCkKICNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNCSgweDAwMjAwMDAwKQotI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1JFQURZCSgweDAwNDAwMDAwKSAvKiBQQ0lfT1dOX1NFTSAqLwotI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1BSRVBBUkVfRE9ORSAoMHgwMjAwMDAwMCkgLyogTUVfT1dOICovCi0jZGVmaW5lIENTUl9IV19JRl9DT05GSUdfUkVHX1BSRVBBUkUJCSAgKDB4MDgwMDAwMDApIC8qIFdBS0VfTUUgKi8KKyNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19SRUFEWQkoMHgwMDQwMDAwMCkJLyogUENJX09XTl9TRU0gKi8KKyNkZWZpbmUgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUgKDB4MDIwMDAwMDApCS8qIE1FX09XTiAqLworI2RlZmluZSBDU1JfSFdfSUZfQ09ORklHX1JFR19QUkVQQVJFCQkgICgweDA4MDAwMDAwKQkvKiBXQUtFX01FICovCiAKLSNkZWZpbmUgQ1NSX0lOVF9QRVJJT0RJQ19ESVMJCQkoMHgwMCkgLyogZGlzYWJsZSBwZXJpb2RpYyBpbnQqLwotI2RlZmluZSBDU1JfSU5UX1BFUklPRElDX0VOQQkJCSgweEZGKSAvKiAyNTUqMzIgdXNlYyB+IDggbXNlYyovCisjZGVmaW5lIENTUl9JTlRfUEVSSU9ESUNfRElTCQkJKDB4MDApCS8qIGRpc2FibGUgcGVyaW9kaWMgaW50ICovCisjZGVmaW5lIENTUl9JTlRfUEVSSU9ESUNfRU5BCQkJKDB4RkYpCS8qIDI1NSozMiB1c2VjIH4gOCBtc2VjICovCiAKIC8qIGludGVycnVwdCBmbGFncyBpbiBJTlRBLCBzZXQgYnkgdUNvZGUgb3IgaGFyZHdhcmUgKGUuZy4gZG1hKSwKICAqIGFja25vd2xlZGdlZCAocmVzZXQpIGJ5IGhvc3Qgd3JpdGluZyAiMSIgdG8gZmxhZ2dlZCBiaXRzLiAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9GSF9SWCAgICAgICAgKDEgPDwgMzEpIC8qIFJ4IERNQSwgY21kIHJlc3BvbnNlcywgRkhfSU5UWzE3OjE2XSAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9IV19FUlIgICAgICAgKDEgPDwgMjkpIC8qIERNQSBoYXJkd2FyZSBlcnJvciBGSF9JTlRbMzFdICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1JYX1BFUklPRElDCSAoMSA8PCAyOCkgLyogUnggcGVyaW9kaWMgKi8KLSNkZWZpbmUgQ1NSX0lOVF9CSVRfRkhfVFggICAgICAgICgxIDw8IDI3KSAvKiBUeCBETUEgRkhfSU5UWzE6MF0gKi8KLSNkZWZpbmUgQ1NSX0lOVF9CSVRfU0NEICAgICAgICAgICgxIDw8IDI2KSAvKiBUWFEgcG9pbnRlciBhZHZhbmNlZCAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9TV19FUlIgICAgICAgKDEgPDwgMjUpIC8qIHVDb2RlIGVycm9yICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1JGX0tJTEwgICAgICAoMSA8PCA3KSAgLyogSFcgUkZLSUxMIHN3aXRjaCBHUF9DTlRSTFsyN10gdG9nZ2xlZCAqLwotI2RlZmluZSBDU1JfSU5UX0JJVF9DVF9LSUxMICAgICAgKDEgPDwgNikgIC8qIENyaXRpY2FsIHRlbXAgKGNoaXAgdG9vIGhvdCkgcmZraWxsICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1NXX1JYICAgICAgICAoMSA8PCAzKSAgLyogUngsIGNvbW1hbmQgcmVzcG9uc2VzLCAzOTQ1ICovCi0jZGVmaW5lIENTUl9JTlRfQklUX1dBS0VVUCAgICAgICAoMSA8PCAxKSAgLyogTklDIGNvbnRyb2xsZXIgd2FraW5nIHVwIChwd3IgbWdtdCkgKi8KLSNkZWZpbmUgQ1NSX0lOVF9CSVRfQUxJVkUgICAgICAgICgxIDw8IDApICAvKiB1Q29kZSBpbnRlcnJ1cHRzIG9uY2UgaXQgaW5pdGlhbGl6ZXMgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfRkhfUlggICAgICAgICgxIDw8IDMxKQkvKiBSeCBETUEsIGNtZCByZXNwb25zZXMsIEZIX0lOVFsxNzoxNl0gKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfSFdfRVJSICAgICAgICgxIDw8IDI5KQkvKiBETUEgaGFyZHdhcmUgZXJyb3IgRkhfSU5UWzMxXSAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9SWF9QRVJJT0RJQwkgKDEgPDwgMjgpCS8qIFJ4IHBlcmlvZGljICovCisjZGVmaW5lIENTUl9JTlRfQklUX0ZIX1RYICAgICAgICAoMSA8PCAyNykJLyogVHggRE1BIEZIX0lOVFsxOjBdICovCisjZGVmaW5lIENTUl9JTlRfQklUX1NDRCAgICAgICAgICAoMSA8PCAyNikJLyogVFhRIHBvaW50ZXIgYWR2YW5jZWQgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfU1dfRVJSICAgICAgICgxIDw8IDI1KQkvKiB1Q29kZSBlcnJvciAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9SRl9LSUxMICAgICAgKDEgPDwgNykJLyogSFcgUkZLSUxMIHN3aXRjaCBHUF9DTlRSTFsyN10gdG9nZ2xlZCAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9DVF9LSUxMICAgICAgKDEgPDwgNikJLyogQ3JpdGljYWwgdGVtcCAoY2hpcCB0b28gaG90KSByZmtpbGwgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfU1dfUlggICAgICAgICgxIDw8IDMpCS8qIFJ4LCBjb21tYW5kIHJlc3BvbnNlcywgMzk0NSAqLworI2RlZmluZSBDU1JfSU5UX0JJVF9XQUtFVVAgICAgICAgKDEgPDwgMSkJLyogTklDIGNvbnRyb2xsZXIgd2FraW5nIHVwIChwd3IgbWdtdCkgKi8KKyNkZWZpbmUgQ1NSX0lOVF9CSVRfQUxJVkUgICAgICAgICgxIDw8IDApCS8qIHVDb2RlIGludGVycnVwdHMgb25jZSBpdCBpbml0aWFsaXplcyAqLwogCiAjZGVmaW5lIENTUl9JTklfU0VUX01BU0sJKENTUl9JTlRfQklUX0ZIX1JYICAgfCBcCiAJCQkJIENTUl9JTlRfQklUX0hXX0VSUiAgfCBcCkBAIC0xOTcsMjEgKzE5NywyMCBAQAogCQkJCSBDU1JfSU5UX0JJVF9BTElWRSkKIAogLyogaW50ZXJydXB0IGZsYWdzIGluIEZIIChmbG93IGhhbmRsZXIpIChQQ0kgYnVzbWFzdGVyIERNQSkgKi8KLSNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfRVJSICAgICAgICgxIDw8IDMxKSAvKiBFcnJvciAqLwotI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9ISV9QUklPUiAgKDEgPDwgMzApIC8qIEhpZ2ggcHJpb3JpdHkgUngsIGJ5cGFzcyBjb2FsZXNjaW5nICovCi0jZGVmaW5lIENTUjM5X0ZIX0lOVF9CSVRfUlhfQ0hOTDIgICgxIDw8IDE4KSAvKiBSeCBjaGFubmVsIDIgKDM5NDUgb25seSkgKi8KLSNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDEgICgxIDw8IDE3KSAvKiBSeCBjaGFubmVsIDEgKi8KLSNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDAgICgxIDw8IDE2KSAvKiBSeCBjaGFubmVsIDAgKi8KLSNkZWZpbmUgQ1NSMzlfRkhfSU5UX0JJVF9UWF9DSE5MNiAgKDEgPDwgNikgIC8qIFR4IGNoYW5uZWwgNiAoMzk0NSBvbmx5KSAqLwotI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMSAgKDEgPDwgMSkgIC8qIFR4IGNoYW5uZWwgMSAqLwotI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMCAgKDEgPDwgMCkgIC8qIFR4IGNoYW5uZWwgMCAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9FUlIgICAgICAgKDEgPDwgMzEpCS8qIEVycm9yICovCisjZGVmaW5lIENTUl9GSF9JTlRfQklUX0hJX1BSSU9SICAoMSA8PCAzMCkJLyogSGlnaCBwcmlvcml0eSBSeCwgYnlwYXNzIGNvYWxlc2NpbmcgKi8KKyNkZWZpbmUgQ1NSMzlfRkhfSU5UX0JJVF9SWF9DSE5MMiAgKDEgPDwgMTgpCS8qIFJ4IGNoYW5uZWwgMiAoMzk0NSBvbmx5KSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMSAgKDEgPDwgMTcpCS8qIFJ4IGNoYW5uZWwgMSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMCAgKDEgPDwgMTYpCS8qIFJ4IGNoYW5uZWwgMCAqLworI2RlZmluZSBDU1IzOV9GSF9JTlRfQklUX1RYX0NITkw2ICAoMSA8PCA2KQkvKiBUeCBjaGFubmVsIDYgKDM5NDUgb25seSkgKi8KKyNkZWZpbmUgQ1NSX0ZIX0lOVF9CSVRfVFhfQ0hOTDEgICgxIDw8IDEpCS8qIFR4IGNoYW5uZWwgMSAqLworI2RlZmluZSBDU1JfRkhfSU5UX0JJVF9UWF9DSE5MMCAgKDEgPDwgMCkJLyogVHggY2hhbm5lbCAwICovCiAKICNkZWZpbmUgQ1NSMzlfRkhfSU5UX1JYX01BU0sJKENTUl9GSF9JTlRfQklUX0hJX1BSSU9SIHwgXAogCQkJCSBDU1IzOV9GSF9JTlRfQklUX1JYX0NITkwyIHwgXAogCQkJCSBDU1JfRkhfSU5UX0JJVF9SWF9DSE5MMSB8IFwKIAkJCQkgQ1NSX0ZIX0lOVF9CSVRfUlhfQ0hOTDApCiAKLQogI2RlZmluZSBDU1IzOV9GSF9JTlRfVFhfTUFTSwkoQ1NSMzlfRkhfSU5UX0JJVF9UWF9DSE5MNiB8IFwKIAkJCQkgQ1NSX0ZIX0lOVF9CSVRfVFhfQ0hOTDEgfCBcCiAJCQkJIENTUl9GSF9JTlRfQklUX1RYX0NITkwwKQpAQCAtMjg1LDcgKzI4NCw2IEBACiAjZGVmaW5lIENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfUE9XRVJfU0FWRSAgICAgICAgICgweDA0MDAwMDAwKQogI2RlZmluZSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVyAgICAgICAgICAoMHgwODAwMDAwMCkKIAotCiAvKiBFRVBST00gUkVHICovCiAjZGVmaW5lIENTUl9FRVBST01fUkVHX1JFQURfVkFMSURfTVNLCSgweDAwMDAwMDAxKQogI2RlZmluZSBDU1JfRUVQUk9NX1JFR19CSVRfQ01ECQkoMHgwMDAwMDAwMikKQEAgLTI5MywxOSArMjkxLDE4IEBACiAjZGVmaW5lIENTUl9FRVBST01fUkVHX01TS19EQVRBCQkoMHhGRkZGMDAwMCkKIAogLyogRUVQUk9NIEdQICovCi0jZGVmaW5lIENTUl9FRVBST01fR1BfVkFMSURfTVNLCQkoMHgwMDAwMDAwNykgLyogc2lnbmF0dXJlICovCisjZGVmaW5lIENTUl9FRVBST01fR1BfVkFMSURfTVNLCQkoMHgwMDAwMDAwNykJLyogc2lnbmF0dXJlICovCiAjZGVmaW5lIENTUl9FRVBST01fR1BfSUZfT1dORVJfTVNLCSgweDAwMDAwMTgwKQogI2RlZmluZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9MRVNTX1RIQU5fNEsJCSgweDAwMDAwMDAyKQogI2RlZmluZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9NT1JFX1RIQU5fNEsJCSgweDAwMDAwMDA0KQogCiAvKiBHUCBSRUcgKi8KLSNkZWZpbmUgQ1NSX0dQX1JFR19QT1dFUl9TQVZFX1NUQVRVU19NU0sgICAgICAgICAgICAoMHgwMzAwMDAwMCkgLyogYml0IDI0LzI1ICovCisjZGVmaW5lIENTUl9HUF9SRUdfUE9XRVJfU0FWRV9TVEFUVVNfTVNLICAgICAgICAgICAgKDB4MDMwMDAwMDApCS8qIGJpdCAyNC8yNSAqLwogI2RlZmluZSBDU1JfR1BfUkVHX05PX1BPV0VSX1NBVkUgICAgICAgICAgICAoMHgwMDAwMDAwMCkKICNkZWZpbmUgQ1NSX0dQX1JFR19NQUNfUE9XRVJfU0FWRSAgICAgICAgICAgKDB4MDEwMDAwMDApCiAjZGVmaW5lIENTUl9HUF9SRUdfUEhZX1BPV0VSX1NBVkUgICAgICAgICAgICgweDAyMDAwMDAwKQogI2RlZmluZSBDU1JfR1BfUkVHX1BPV0VSX1NBVkVfRVJST1IgICAgICAgICAoMHgwMzAwMDAwMCkKIAotCiAvKiBDU1IgR0lPICovCiAjZGVmaW5lIENTUl9HSU9fUkVHX1ZBTF9MMFNfRU5BQkxFRAkoMHgwMDAwMDAwMikKIApAQCAtMzU3LDcgKzM1NCw3IEBACiAvKiBIUEVUIE1FTSBkZWJ1ZyAqLwogI2RlZmluZSBDU1JfREJHX0hQRVRfTUVNX1JFR19WQUwJKDB4RkZGRjAwMDApCiAKLS8qIERSQU0gSU5UIFRBQkxFICovCisvKiBEUkFNIElOVCBUQkwgKi8KICNkZWZpbmUgQ1NSX0RSQU1fSU5UX1RCTF9FTkFCTEUJCSgxIDw8IDMxKQogI2RlZmluZSBDU1JfRFJBTV9JTklUX1RCTF9XUkFQX0NIRUNLCSgxIDw8IDI3KQogCkBAIC0zNjgsMTMgKzM2NSwxMyBAQAogICogdG8gaW5kaXJlY3RseSBhY2Nlc3MgZGV2aWNlJ3MgaW50ZXJuYWwgbWVtb3J5IG9yIHJlZ2lzdGVycyB0aGF0CiAgKiBtYXkgYmUgcG93ZXJlZC1kb3duLgogICoKLSAqIFVzZSBpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKCkvaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKCkgZmFtaWx5CisgKiBVc2UgaWxfd3IoKS9pbF9yZCgpIGZhbWlseQogICogZm9yIHRoZXNlIHJlZ2lzdGVyczsKICAqIGhvc3QgbXVzdCAiZ3JhYiBuaWMgYWNjZXNzIiB2aWEgQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRCiAgKiB0byBtYWtlIHN1cmUgdGhlIE1BQyAodUNvZGUgcHJvY2Vzc29yLCBldGMuKSBpcyBwb3dlcmVkIHVwIGZvciBhY2Nlc3NpbmcKICAqIGludGVybmFsIHJlc291cmNlcy4KICAqCi0gKiBEbyBub3QgdXNlIGl3bF93cml0ZTMyKCkvaXdsX3JlYWQzMigpIGZhbWlseSB0byBhY2Nlc3MgdGhlc2UgcmVnaXN0ZXJzOworICogRG8gbm90IHVzZSBfaWxfd3IoKS9faWxfcmQoKSBmYW1pbHkgdG8gYWNjZXNzIHRoZXNlIHJlZ2lzdGVyczsKICAqIHRoZXNlIHByb3ZpZGUgb25seSBzaW1wbGUgUENJIGJ1cyBhY2Nlc3MsIHdpdGhvdXQgd2FraW5nIHVwIHRoZSBNQUMuCiAgKi8KICNkZWZpbmUgSEJVU19CQVNFCSgweDQwMCkKQEAgLTQxMSwxMiArNDA4LDEyIEBACiAjZGVmaW5lIEhCVVNfVEFSR19QUlBIX1JEQVQgICAgIChIQlVTX0JBU0UrMHgwNTApCiAKIC8qCi0gKiBQZXItVHgtcXVldWUgd3JpdGUgcG9pbnRlciAoaW5kZXgsIHJlYWxseSEpCi0gKiBJbmRpY2F0ZXMgaW5kZXggdG8gbmV4dCBURkQgdGhhdCBkcml2ZXIgd2lsbCBmaWxsICgxIHBhc3QgbGF0ZXN0IGZpbGxlZCkuCisgKiBQZXItVHgtcXVldWUgd3JpdGUgcG9pbnRlciAoaWR4LCByZWFsbHkhKQorICogSW5kaWNhdGVzIGlkeCB0byBuZXh0IFRGRCB0aGF0IGRyaXZlciB3aWxsIGZpbGwgKDEgcGFzdCBsYXRlc3QgZmlsbGVkKS4KICAqIEJpdCB1c2FnZToKLSAqICAwLTc6ICBxdWV1ZSB3cml0ZSBpbmRleAorICogIDAtNzogIHF1ZXVlIHdyaXRlIGlkeAogICogMTEtODogIHF1ZXVlIHNlbGVjdG9yCiAgKi8KICNkZWZpbmUgSEJVU19UQVJHX1dSUFRSICAgICAgICAgKEhCVVNfQkFTRSsweDA2MCkKIAotI2VuZGlmIC8qICFfX2l3bF9sZWdhY3lfY3NyX2hfXyAqLworI2VuZGlmIC8qICFfX2lsX2Nzcl9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2RlYnVnLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9kZWJ1Zy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYjg5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9kZWJ1Zy5jCkBAIC0wLDAgKzEsMTQxMSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKKyAqIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxsaW51eC9pZWVlODAyMTEuaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworI2luY2x1ZGUgImNvbW1vbi5oIgorCisvKiBjcmVhdGUgYW5kIHJlbW92ZSBvZiBmaWxlcyAqLworI2RlZmluZSBERUJVR0ZTX0FERF9GSUxFKG5hbWUsIHBhcmVudCwgbW9kZSkgZG8gewkJCVwKKwlpZiAoIWRlYnVnZnNfY3JlYXRlX2ZpbGUoI25hbWUsIG1vZGUsIHBhcmVudCwgaWwsCQlcCisJCQkgJmlsX2RiZ2ZzXyMjbmFtZSMjX29wcykpCQlcCisJCWdvdG8gZXJyOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgREVCVUdGU19BRERfQk9PTChuYW1lLCBwYXJlbnQsIHB0cikgZG8gewkJCVwKKwlzdHJ1Y3QgZGVudHJ5ICpfX3RtcDsJCQkJCQlcCisJX190bXAgPSBkZWJ1Z2ZzX2NyZWF0ZV9ib29sKCNuYW1lLCBTX0lXVVNSIHwgU19JUlVTUiwJCVwKKwkJCQkgICAgcGFyZW50LCBwdHIpOwkJCVwKKwlpZiAoSVNfRVJSKF9fdG1wKSB8fCAhX190bXApCQkJCQlcCisJCWdvdG8gZXJyOwkJCQkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgREVCVUdGU19BRERfWDMyKG5hbWUsIHBhcmVudCwgcHRyKSBkbyB7CQkJCVwKKwlzdHJ1Y3QgZGVudHJ5ICpfX3RtcDsJCQkJCQlcCisJX190bXAgPSBkZWJ1Z2ZzX2NyZWF0ZV94MzIoI25hbWUsIFNfSVdVU1IgfCBTX0lSVVNSLAkJXAorCQkJCSAgIHBhcmVudCwgcHRyKTsJCQlcCisJaWYgKElTX0VSUihfX3RtcCkgfHwgIV9fdG1wKQkJCQkJXAorCQlnb3RvIGVycjsJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKiBmaWxlIG9wZXJhdGlvbiAqLworI2RlZmluZSBERUJVR0ZTX1JFQURfRlVOQyhuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIHNzaXplX3QgaWxfZGJnZnNfIyNuYW1lIyNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgICAgICAgICAgICAgICBcCisJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwgICAgICAgICAgXAorCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7CisKKyNkZWZpbmUgREVCVUdGU19XUklURV9GVU5DKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBzc2l6ZV90IGlsX2RiZ2ZzXyMjbmFtZSMjX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCAgICAgICAgICAgICAgXAorCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsICAgIFwKKwkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOworCitzdGF0aWMgaW50CitpbF9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOworCXJldHVybiAwOworfQorCisjZGVmaW5lIERFQlVHRlNfUkVBRF9GSUxFX09QUyhuYW1lKQkJCQlcCisJREVCVUdGU19SRUFEX0ZVTkMobmFtZSk7CQkJCVwKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGlsX2RiZ2ZzXyMjbmFtZSMjX29wcyA9IHsJXAorCS5yZWFkID0gaWxfZGJnZnNfIyNuYW1lIyNfcmVhZCwJCQkJXAorCS5vcGVuID0gaWxfZGJnZnNfb3Blbl9maWxlX2dlbmVyaWMsCQkJXAorCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkJCQlcCit9OworCisjZGVmaW5lIERFQlVHRlNfV1JJVEVfRklMRV9PUFMobmFtZSkJCQkJXAorCURFQlVHRlNfV1JJVEVfRlVOQyhuYW1lKTsJCQkJXAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaWxfZGJnZnNfIyNuYW1lIyNfb3BzID0gewlcCisJLndyaXRlID0gaWxfZGJnZnNfIyNuYW1lIyNfd3JpdGUsCQkJXAorCS5vcGVuID0gaWxfZGJnZnNfb3Blbl9maWxlX2dlbmVyaWMsCQkJXAorCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkJCQlcCit9OworCisjZGVmaW5lIERFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhuYW1lKQkJCVwKKwlERUJVR0ZTX1JFQURfRlVOQyhuYW1lKTsJCQkJXAorCURFQlVHRlNfV1JJVEVfRlVOQyhuYW1lKTsJCQkJXAorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaWxfZGJnZnNfIyNuYW1lIyNfb3BzID0gewlcCisJLndyaXRlID0gaWxfZGJnZnNfIyNuYW1lIyNfd3JpdGUsCQkJXAorCS5yZWFkID0gaWxfZGJnZnNfIyNuYW1lIyNfcmVhZCwJCQkJXAorCS5vcGVuID0gaWxfZGJnZnNfb3Blbl9maWxlX2dlbmVyaWMsCQkJXAorCS5sbHNlZWsgPSBnZW5lcmljX2ZpbGVfbGxzZWVrLAkJCQlcCit9OworCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciAqYnVmOworCWludCBwb3MgPSAwOworCisJaW50IGNudDsKKwlzc2l6ZV90IHJldDsKKwljb25zdCBzaXplX3QgYnVmc3ogPQorCSAgICAxMDAgKyBzaXplb2YoY2hhcikgKiA1MCAqIChNQU5BR0VNRU5UX01BWCArIENPTlRST0xfTUFYKTsKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiTWFuYWdlbWVudDpcbiIpOworCWZvciAoY250ID0gMDsgY250IDwgTUFOQUdFTUVOVF9NQVg7IGNudCsrKSB7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdCUyNXNcdFx0OiAldVxuIiwKKwkJCSAgICAgIGlsX2dldF9tZ210X3N0cmluZyhjbnQpLCBpbC0+dHhfc3RhdHMubWdtdFtjbnRdKTsKKwl9CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiQ29udHJvbFxuIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBDT05UUk9MX01BWDsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0JTI1c1x0XHQ6ICV1XG4iLAorCQkJICAgICAgaWxfZ2V0X2N0cmxfc3RyaW5nKGNudCksIGlsLT50eF9zdGF0cy5jdHJsW2NudF0pOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJEYXRhOlxuIik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRjbnQ6ICV1XG4iLAorCQkgICAgICBpbC0+dHhfc3RhdHMuZGF0YV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0Ynl0ZXM6ICVsbHVcbiIsCisJCSAgICAgIGlsLT50eF9zdGF0cy5kYXRhX2J5dGVzKTsKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19jbGVhcl90cmFmZmljX3N0YXRzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJCSAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdTMyIGNsZWFyX2ZsYWc7CisJY2hhciBidWZbOF07CisJaW50IGJ1Zl9zaXplOworCisJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOworCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzc2NhbmYoYnVmLCAiJXgiLCAmY2xlYXJfZmxhZykgIT0gMSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWxfY2xlYXJfdHJhZmZpY19zdGF0cyhpbCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyICpidWY7CisJaW50IHBvcyA9IDA7CisJaW50IGNudDsKKwlzc2l6ZV90IHJldDsKKwljb25zdCBzaXplX3QgYnVmc3ogPQorCSAgICAxMDAgKyBzaXplb2YoY2hhcikgKiA1MCAqIChNQU5BR0VNRU5UX01BWCArIENPTlRST0xfTUFYKTsKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJNYW5hZ2VtZW50OlxuIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBNQU5BR0VNRU5UX01BWDsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0JTI1c1x0XHQ6ICV1XG4iLAorCQkJICAgICAgaWxfZ2V0X21nbXRfc3RyaW5nKGNudCksIGlsLT5yeF9zdGF0cy5tZ210W2NudF0pOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJDb250cm9sOlxuIik7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBDT05UUk9MX01BWDsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0JTI1c1x0XHQ6ICV1XG4iLAorCQkJICAgICAgaWxfZ2V0X2N0cmxfc3RyaW5nKGNudCksIGlsLT5yeF9zdGF0cy5jdHJsW2NudF0pOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJEYXRhOlxuIik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRjbnQ6ICV1XG4iLAorCQkgICAgICBpbC0+cnhfc3RhdHMuZGF0YV9jbnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0Ynl0ZXM6ICVsbHVcbiIsCisJCSAgICAgIGlsLT5yeF9zdGF0cy5kYXRhX2J5dGVzKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBCWVRFMV9NQVNLIDB4MDAwMDAwZmY7CisjZGVmaW5lIEJZVEUyX01BU0sgMHgwMDAwZmZmZjsKKyNkZWZpbmUgQllURTNfTUFTSyAweDAwZmZmZmZmOworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3NyYW1fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgIGxvZmZfdCAqcHBvcykKK3sKKwl1MzIgdmFsOworCWNoYXIgKmJ1ZjsKKwlzc2l6ZV90IHJldDsKKwlpbnQgaTsKKwlpbnQgcG9zID0gMDsKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc2l6ZV90IGJ1ZnN6OworCisJLyogZGVmYXVsdCBpcyB0byBkdW1wIHRoZSBlbnRpcmUgZGF0YSBzZWdtZW50ICovCisJaWYgKCFpbC0+ZGJnZnNfc3JhbV9vZmZzZXQgJiYgIWlsLT5kYmdmc19zcmFtX2xlbikgeworCQlpbC0+ZGJnZnNfc3JhbV9vZmZzZXQgPSAweDgwMDAwMDsKKwkJaWYgKGlsLT51Y29kZV90eXBlID09IFVDT0RFX0lOSVQpCisJCQlpbC0+ZGJnZnNfc3JhbV9sZW4gPSBpbC0+dWNvZGVfaW5pdF9kYXRhLmxlbjsKKwkJZWxzZQorCQkJaWwtPmRiZ2ZzX3NyYW1fbGVuID0gaWwtPnVjb2RlX2RhdGEubGVuOworCX0KKwlidWZzeiA9IDMwICsgaWwtPmRiZ2ZzX3NyYW1fbGVuICogc2l6ZW9mKGNoYXIpICogMTA7CisJYnVmID0ga21hbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgInNyYW1fbGVuOiAweCV4XG4iLAorCQkgICAgICBpbC0+ZGJnZnNfc3JhbV9sZW4pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgInNyYW1fb2Zmc2V0OiAweCV4XG4iLAorCQkgICAgICBpbC0+ZGJnZnNfc3JhbV9vZmZzZXQpOworCWZvciAoaSA9IGlsLT5kYmdmc19zcmFtX2xlbjsgaSA+IDA7IGkgLT0gNCkgeworCQl2YWwgPQorCQkgICAgaWxfcmVhZF90YXJnX21lbShpbCwKKwkJCQkgICAgIGlsLT5kYmdmc19zcmFtX29mZnNldCArCisJCQkJICAgICBpbC0+ZGJnZnNfc3JhbV9sZW4gLSBpKTsKKwkJaWYgKGkgPCA0KSB7CisJCQlzd2l0Y2ggKGkpIHsKKwkJCWNhc2UgMToKKwkJCQl2YWwgJj0gQllURTFfTUFTSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQl2YWwgJj0gQllURTJfTUFTSzsKKwkJCQlicmVhazsKKwkJCWNhc2UgMzoKKwkJCQl2YWwgJj0gQllURTNfTUFTSzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIShpICUgMTYpKQorCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKKwkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiMHglMDh4ICIsIHZhbCk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19zcmFtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbNjRdOworCWludCBidWZfc2l6ZTsKKwl1MzIgb2Zmc2V0LCBsZW47CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV4LCV4IiwgJm9mZnNldCwgJmxlbikgPT0gMikgeworCQlpbC0+ZGJnZnNfc3JhbV9vZmZzZXQgPSBvZmZzZXQ7CisJCWlsLT5kYmdmc19zcmFtX2xlbiA9IGxlbjsKKwl9IGVsc2UgeworCQlpbC0+ZGJnZnNfc3JhbV9vZmZzZXQgPSAwOworCQlpbC0+ZGJnZnNfc3JhbV9sZW4gPSAwOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3N0YXRpb25zX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWxfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbjsKKwlpbnQgbWF4X3N0YSA9IGlsLT5od19wYXJhbXMubWF4X3N0YXRpb25zOworCWNoYXIgKmJ1ZjsKKwlpbnQgaSwgaiwgcG9zID0gMDsKKwlzc2l6ZV90IHJldDsKKwkvKiBBZGQgMzAgZm9yIGluaXRpYWwgc3RyaW5nICovCisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gMzAgKyBzaXplb2YoY2hhcikgKiA1MDAgKiAoaWwtPm51bV9zdGF0aW9ucyk7CisKKwlidWYgPSBrbWFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJudW0gb2Ygc3RhdGlvbnM6ICVkXG5cbiIsCisJCSAgICAgIGlsLT5udW1fc3RhdGlvbnMpOworCisJZm9yIChpID0gMDsgaSA8IG1heF9zdGE7IGkrKykgeworCQlzdGF0aW9uID0gJmlsLT5zdGF0aW9uc1tpXTsKKwkJaWYgKCFzdGF0aW9uLT51c2VkKQorCQkJY29udGludWU7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAic3RhdGlvbiAlZCAtIGFkZHI6ICVwTSwgZmxhZ3M6ICUjeFxuIiwgaSwKKwkJCSAgICAgIHN0YXRpb24tPnN0YS5zdGEuYWRkciwKKwkJCSAgICAgIHN0YXRpb24tPnN0YS5zdGF0aW9uX2ZsYWdzX21zayk7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAiVElEXHRzZXFfbnVtXHR0eHFfaWRcdGZyYW1lc1x0dGZkc1x0Iik7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAic3RhcnRfaWR4XHRiaXRtYXBcdFx0XHRyYXRlX25fZmxhZ3NcbiIpOworCisJCWZvciAoaiA9IDA7IGogPCBNQVhfVElEX0NPVU5UOyBqKyspIHsKKwkJCXBvcyArPQorCQkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJCSAgICAgICIlZDpcdCUjeFx0JSN4XHQldVx0JXVcdCV1XHRcdCUjLjE2bGx4XHQlI3giLAorCQkJCSAgICAgIGosIHN0YXRpb24tPnRpZFtqXS5zZXFfbnVtYmVyLAorCQkJCSAgICAgIHN0YXRpb24tPnRpZFtqXS5hZ2cudHhxX2lkLAorCQkJCSAgICAgIHN0YXRpb24tPnRpZFtqXS5hZ2cuZnJhbWVfY291bnQsCisJCQkJICAgICAgc3RhdGlvbi0+dGlkW2pdLnRmZHNfaW5fcXVldWUsCisJCQkJICAgICAgc3RhdGlvbi0+dGlkW2pdLmFnZy5zdGFydF9pZHgsCisJCQkJICAgICAgc3RhdGlvbi0+dGlkW2pdLmFnZy5iaXRtYXAsCisJCQkJICAgICAgc3RhdGlvbi0+dGlkW2pdLmFnZy5yYXRlX25fZmxhZ3MpOworCisJCQlpZiAoc3RhdGlvbi0+dGlkW2pdLmFnZy53YWl0X2Zvcl9iYSkKKwkJCQlwb3MgKz0KKwkJCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkJCSAgICAgICIgLSB3YWl0Zm9yYmEiKTsKKwkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7CisJCX0KKworCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOworCX0KKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX252bV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwLCBvZnMgPSAwLCBidWZfc2l6ZSA9IDA7CisJY29uc3QgdTggKnB0cjsKKwljaGFyICpidWY7CisJdTE2IGVlcHJvbV92ZXI7CisJc2l6ZV90IGVlcHJvbV9sZW4gPSBpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemU7CisJYnVmX3NpemUgPSA0ICogZWVwcm9tX2xlbiArIDI1NjsKKworCWlmIChlZXByb21fbGVuICUgMTYpIHsKKwkJSUxfRVJSKCJOVk0gc2l6ZSBpcyBub3QgbXVsdGlwbGUgb2YgMTYuXG4iKTsKKwkJcmV0dXJuIC1FTk9EQVRBOworCX0KKworCXB0ciA9IGlsLT5lZXByb207CisJaWYgKCFwdHIpIHsKKwkJSUxfRVJSKCJJbnZhbGlkIEVFUFJPTSBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwkvKiA0IGNoYXJhY3RlcnMgZm9yIGJ5dGUgMHhZWSAqLworCWJ1ZiA9IGt6YWxsb2MoYnVmX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCUlMX0VSUigiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZWVwcm9tX3ZlciA9IGlsX2VlcHJvbV9xdWVyeTE2KGlsLCBFRVBST01fVkVSU0lPTik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1Zl9zaXplIC0gcG9zLCAiRUVQUk9NICIgInZlcnNpb246IDB4JXhcbiIsCisJCSAgICAgIGVlcHJvbV92ZXIpOworCWZvciAob2ZzID0gMDsgb2ZzIDwgZWVwcm9tX2xlbjsgb2ZzICs9IDE2KSB7CisJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZfc2l6ZSAtIHBvcywgIjB4JS40eCAiLCBvZnMpOworCQloZXhfZHVtcF90b19idWZmZXIocHRyICsgb2ZzLCAxNiwgMTYsIDIsIGJ1ZiArIHBvcywKKwkJCQkgICBidWZfc2l6ZSAtIHBvcywgMCk7CisJCXBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKKwkJaWYgKGJ1Zl9zaXplIC0gcG9zID4gMCkKKwkJCWJ1Zltwb3MrK10gPSAnXG4nOworCX0KKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX2NoYW5uZWxzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWxzID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzdXBwX2JhbmQgPSBOVUxMOworCWludCBwb3MgPSAwLCBpLCBidWZzeiA9IFBBR0VfU0laRTsKKwljaGFyICpidWY7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoIXRlc3RfYml0KFNfR0VPX0NPTkZJR1VSRUQsICZpbC0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1ZikgeworCQlJTF9FUlIoIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc3VwcF9iYW5kID0gaWxfZ2V0X2h3X21vZGUoaWwsIElFRUU4MDIxMV9CQU5EXzJHSFopOworCWlmIChzdXBwX2JhbmQpIHsKKwkJY2hhbm5lbHMgPSBzdXBwX2JhbmQtPmNoYW5uZWxzOworCisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAiRGlzcGxheWluZyAlZCBjaGFubmVscyBpbiAyLjRHSHogYmFuZCA4MDIuMTFiZyk6XG4iLAorCQkJICAgICAgc3VwcF9iYW5kLT5uX2NoYW5uZWxzKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgc3VwcF9iYW5kLT5uX2NoYW5uZWxzOyBpKyspCisJCQlwb3MgKz0KKwkJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCQkgICAgICAiJWQ6ICVkZEJtOiBCU1MlcyVzLCAlcy5cbiIsCisJCQkJICAgICAgY2hhbm5lbHNbaV0uaHdfdmFsdWUsCisJCQkJICAgICAgY2hhbm5lbHNbaV0ubWF4X3Bvd2VyLAorCQkJCSAgICAgIGNoYW5uZWxzW2ldLgorCQkJCSAgICAgIGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUkFEQVIgPworCQkJCSAgICAgICIgKElFRUUgODAyLjExaCByZXF1aXJlZCkiIDogIiIsCisJCQkJICAgICAgKChjaGFubmVsc1tpXS4KKwkJCQkJZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9OT19JQlNTKSB8fAorCQkJCSAgICAgICAoY2hhbm5lbHNbaV0uCisJCQkJCWZsYWdzICYgSUVFRTgwMjExX0NIQU5fUkFEQVIpKSA/ICIiIDoKKwkJCQkgICAgICAiLCBJQlNTIiwKKwkJCQkgICAgICBjaGFubmVsc1tpXS4KKwkJCQkgICAgICBmbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiA/CisJCQkJICAgICAgInBhc3NpdmUgb25seSIgOiAiYWN0aXZlL3Bhc3NpdmUiKTsKKwl9CisJc3VwcF9iYW5kID0gaWxfZ2V0X2h3X21vZGUoaWwsIElFRUU4MDIxMV9CQU5EXzVHSFopOworCWlmIChzdXBwX2JhbmQpIHsKKwkJY2hhbm5lbHMgPSBzdXBwX2JhbmQtPmNoYW5uZWxzOworCisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAiRGlzcGxheWluZyAlZCBjaGFubmVscyBpbiA1LjJHSHogYmFuZCAoODAyLjExYSlcbiIsCisJCQkgICAgICBzdXBwX2JhbmQtPm5fY2hhbm5lbHMpOworCisJCWZvciAoaSA9IDA7IGkgPCBzdXBwX2JhbmQtPm5fY2hhbm5lbHM7IGkrKykKKwkJCXBvcyArPQorCQkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJCSAgICAgICIlZDogJWRkQm06IEJTUyVzJXMsICVzLlxuIiwKKwkJCQkgICAgICBjaGFubmVsc1tpXS5od192YWx1ZSwKKwkJCQkgICAgICBjaGFubmVsc1tpXS5tYXhfcG93ZXIsCisJCQkJICAgICAgY2hhbm5lbHNbaV0uCisJCQkJICAgICAgZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUiA/CisJCQkJICAgICAgIiAoSUVFRSA4MDIuMTFoIHJlcXVpcmVkKSIgOiAiIiwKKwkJCQkgICAgICAoKGNoYW5uZWxzW2ldLgorCQkJCQlmbGFncyAmIElFRUU4MDIxMV9DSEFOX05PX0lCU1MpIHx8CisJCQkJICAgICAgIChjaGFubmVsc1tpXS4KKwkJCQkJZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUikpID8gIiIgOgorCQkJCSAgICAgICIsIElCU1MiLAorCQkJCSAgICAgIGNoYW5uZWxzW2ldLgorCQkJCSAgICAgIGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOID8KKwkJCQkgICAgICAicGFzc2l2ZSBvbmx5IiA6ICJhY3RpdmUvcGFzc2l2ZSIpOworCX0KKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19zdGF0dXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgICAgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzUxMl07CisJaW50IHBvcyA9IDA7CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX0hDTURfQUNUSVZFOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX0hDTURfQUNUSVZFLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfSU5UX0VOQUJMRUQ6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfSU5UX0VOQUJMRUQsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19SRl9LSUxMX0hXOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX1JGX0tJTExfSFcsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19DVF9LSUxMOlx0XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfQ1RfS0lMTCwgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX0lOSVQ6XHRcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19JTklULCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfQUxJVkU6XHRcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19BTElWRSwgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1JFQURZOlx0XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfUkVBRFksICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19URU1QRVJBVFVSRTpcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19URU1QRVJBVFVSRSwgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX0dFT19DT05GSUdVUkVEOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX0dFT19DT05GSUdVUkVELCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfRVhJVF9QRU5ESU5HOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX0VYSVRfUEVORElORywgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1NUQVRTOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX1NUQVRTLCAmaWwtPnN0YXR1cykpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNfU0NBTk5JTkc6XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfU0NBTk5JTkcsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19TQ0FOX0FCT1JUSU5HOlx0ICVkXG4iLAorCQkgICAgICB0ZXN0X2JpdChTX1NDQU5fQUJPUlRJTkcsICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19TQ0FOX0hXOlx0XHQgJWRcbiIsCisJCSAgICAgIHRlc3RfYml0KFNfU0NBTl9IVywgJmlsLT5zdGF0dXMpKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTX1BPV0VSX1BNSTpcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19QT1dFUl9QTUksICZpbC0+c3RhdHVzKSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU19GV19FUlJPUjpcdCAlZFxuIiwKKwkJICAgICAgdGVzdF9iaXQoU19GV19FUlJPUiwgJmlsLT5zdGF0dXMpKTsKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19pbnRlcnJ1cHRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCQlsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHBvcyA9IDA7CisJaW50IGNudCA9IDA7CisJY2hhciAqYnVmOworCWludCBidWZzeiA9IDI0ICogNjQ7CS8qIDI0IGl0ZW1zICogNjQgY2hhciBwZXIgaXRlbSAqLworCXNzaXplX3QgcmV0OworCisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkludGVycnVwdCBTdGF0aXN0aWNzIFJlcG9ydDpcbiIpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiSFcgRXJyb3I6XHRcdFx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLmh3KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVyBFcnJvcjpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGlsLT5pc3Jfc3RhdHMuc3cpOworCWlmIChpbC0+aXNyX3N0YXRzLnN3IHx8IGlsLT5pc3Jfc3RhdHMuaHcpIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJcdExhc3QgUmVzdGFydGluZyBDb2RlOiAgMHglWFxuIiwKKwkJCSAgICAgIGlsLT5pc3Jfc3RhdHMuZXJyX2NvZGUpOworCX0KKyNpZmRlZiBDT05GSUdfSVdMRUdBQ1lfREVCVUcKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJGcmFtZSB0cmFuc21pdHRlZDpcdFx0ICV1XG4iLAorCQkgICAgICBpbC0+aXNyX3N0YXRzLnNjaCk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiQWxpdmUgaW50ZXJydXB0Olx0XHQgJXVcbiIsCisJCSAgICAgIGlsLT5pc3Jfc3RhdHMuYWxpdmUpOworI2VuZGlmCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkgICAgICAiSFcgUkYgS0lMTCBzd2l0Y2ggdG9nZ2xlZDpcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy5yZmtpbGwpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiQ1QgS0lMTDpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGlsLT5pc3Jfc3RhdHMuY3RraWxsKTsKKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIldha2V1cCBJbnRlcnJ1cHQ6XHRcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy53YWtldXApOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiUnggY29tbWFuZCByZXNwb25zZXM6XHRcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy5yeCk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCBJTF9DTl9NQVg7IGNudCsrKSB7CisJCWlmIChpbC0+aXNyX3N0YXRzLmhhbmRsZXJzW2NudF0gPiAwKQorCQkJcG9zICs9CisJCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkJICAgICAgIlx0UnggaGFuZGxlclslMzZzXTpcdFx0ICV1XG4iLAorCQkJCSAgICAgIGlsX2dldF9jbWRfc3RyaW5nKGNudCksCisJCQkJICAgICAgaWwtPmlzcl9zdGF0cy5oYW5kbGVyc1tjbnRdKTsKKwl9CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJUeC9GSCBpbnRlcnJ1cHQ6XHRcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy50eCk7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJVbmV4cGVjdGVkIElOVEE6XHRcdCAldVxuIiwKKwkJICAgICAgaWwtPmlzcl9zdGF0cy51bmhhbmRsZWQpOworCisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfaW50ZXJydXB0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzhdOworCWludCBidWZfc2l6ZTsKKwl1MzIgcmVzZXRfZmxhZzsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV4IiwgJnJlc2V0X2ZsYWcpICE9IDEpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChyZXNldF9mbGFnID09IDApCisJCWlsX2NsZWFyX2lzcl9zdGF0cyhpbCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19xb3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsCisJCSAgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWxfcnhvbl9jb250ZXh0ICpjdHggPSAmaWwtPmN0eDsKKwlpbnQgcG9zID0gMCwgaTsKKwljaGFyIGJ1ZlsyNTZdOworCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOworCisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY29udGV4dCAlZDpcbiIsIGN0eC0+Y3R4aWQpOworCWZvciAoaSA9IDA7IGkgPCBBQ19OVU07IGkrKykgeworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICAgICAgIlx0Y3dfbWluXHRjd19tYXhcdGFpZnNuXHR0eG9wXG4iKTsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJBQ1slZF1cdCV1XHQldVx0JXVcdCV1XG4iLCBpLAorCQkJICAgICAgY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbaV0uY3dfbWluLAorCQkJICAgICAgY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbaV0uY3dfbWF4LAorCQkJICAgICAgY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbaV0uYWlmc24sCisJCQkgICAgICBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5lZGNhX3R4b3ApOworCX0KKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX2Rpc2FibGVfaHQ0MF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1Zls4XTsKKwlpbnQgYnVmX3NpemU7CisJaW50IGh0NDA7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHNzY2FuZihidWYsICIlZCIsICZodDQwKSAhPSAxKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoIWlsX2lzX2FueV9hc3NvY2lhdGVkKGlsKSkKKwkJaWwtPmRpc2FibGVfaHQ0MCA9IGh0NDAgPyB0cnVlIDogZmFsc2U7CisJZWxzZSB7CisJCUlMX0VSUigiU3RhIGFzc29jaWF0ZWQgd2l0aCBBUCAtICIKKwkJICAgICAgICJDaGFuZ2UgdG8gNDBNSHogY2hhbm5lbCBzdXBwb3J0IGlzIG5vdCBhbGxvd2VkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfZGlzYWJsZV9odDQwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1ZlsxMDBdOworCWludCBwb3MgPSAwOworCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiMTFuIDQwTUh6IE1vZGU6ICVzXG4iLAorCQkgICAgICBpbC0+ZGlzYWJsZV9odDQwID8gIkRpc2FibGVkIiA6ICJFbmFibGVkIik7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworfQorCitERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoc3JhbSk7CitERUJVR0ZTX1JFQURfRklMRV9PUFMobnZtKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhzdGF0aW9ucyk7CitERUJVR0ZTX1JFQURfRklMRV9PUFMoY2hhbm5lbHMpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHN0YXR1cyk7CitERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoaW50ZXJydXB0KTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhxb3MpOworREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGRpc2FibGVfaHQ0MCk7CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc190cmFmZmljX2xvZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMCwgb2ZzID0gMDsKKwlpbnQgY250ID0gMCwgZW50cnk7CisJc3RydWN0IGlsX3R4X3F1ZXVlICp0eHE7CisJc3RydWN0IGlsX3F1ZXVlICpxOworCXN0cnVjdCBpbF9yeF9xdWV1ZSAqcnhxID0gJmlsLT5yeHE7CisJY2hhciAqYnVmOworCWludCBidWZzeiA9CisJICAgICgoSUxfVFJBRkZJQ19FTlRSSUVTICogSUxfVFJBRkZJQ19FTlRSWV9TSVpFICogNjQpICogMikgKworCSAgICAoaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgKiAzMiAqIDgpICsgNDAwOworCWNvbnN0IHU4ICpwdHI7CisJc3NpemVfdCByZXQ7CisKKwlpZiAoIWlsLT50eHEpIHsKKwkJSUxfRVJSKCJ0eHEgbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCUlMX0VSUigiQ2FuIG5vdCBhbGxvY2F0ZSBidWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiVHggUXVldWVcbiIpOworCWZvciAoY250ID0gMDsgY250IDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgY250KyspIHsKKwkJdHhxID0gJmlsLT50eHFbY250XTsKKwkJcSA9ICZ0eHEtPnE7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAicVslZF06IHJlYWRfcHRyOiAldSwgd3JpdGVfcHRyOiAldVxuIiwgY250LAorCQkJICAgICAgcS0+cmVhZF9wdHIsIHEtPndyaXRlX3B0cik7CisJfQorCWlmIChpbC0+dHhfdHJhZmZpYyAmJiAoaWxfZGVidWdfbGV2ZWwgJiBJTF9ETF9UWCkpIHsKKwkJcHRyID0gaWwtPnR4X3RyYWZmaWM7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJUeCBUcmFmZmljIGlkeDogJXVcbiIsCisJCQkgICAgICBpbC0+dHhfdHJhZmZpY19pZHgpOworCQlmb3IgKGNudCA9IDAsIG9mcyA9IDA7IGNudCA8IElMX1RSQUZGSUNfRU5UUklFUzsgY250KyspIHsKKwkJCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IElMX1RSQUZGSUNfRU5UUllfU0laRSAvIDE2OworCQkJICAgICBlbnRyeSsrLCBvZnMgKz0gMTYpIHsKKwkJCQlwb3MgKz0KKwkJCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIweCUuNHggIiwKKwkJCQkJICAgICAgb2ZzKTsKKwkJCQloZXhfZHVtcF90b19idWZmZXIocHRyICsgb2ZzLCAxNiwgMTYsIDIsCisJCQkJCQkgICBidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAwKTsKKwkJCQlwb3MgKz0gc3RybGVuKGJ1ZiArIHBvcyk7CisJCQkJaWYgKGJ1ZnN6IC0gcG9zID4gMCkKKwkJCQkJYnVmW3BvcysrXSA9ICdcbic7CisJCQl9CisJCX0KKwl9CisKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJSeCBRdWV1ZVxuIik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAicmVhZDogJXUsIHdyaXRlOiAldVxuIiwKKwkJICAgICAgcnhxLT5yZWFkLCByeHEtPndyaXRlKTsKKworCWlmIChpbC0+cnhfdHJhZmZpYyAmJiAoaWxfZGVidWdfbGV2ZWwgJiBJTF9ETF9SWCkpIHsKKwkJcHRyID0gaWwtPnJ4X3RyYWZmaWM7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJSeCBUcmFmZmljIGlkeDogJXVcbiIsCisJCQkgICAgICBpbC0+cnhfdHJhZmZpY19pZHgpOworCQlmb3IgKGNudCA9IDAsIG9mcyA9IDA7IGNudCA8IElMX1RSQUZGSUNfRU5UUklFUzsgY250KyspIHsKKwkJCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IElMX1RSQUZGSUNfRU5UUllfU0laRSAvIDE2OworCQkJICAgICBlbnRyeSsrLCBvZnMgKz0gMTYpIHsKKwkJCQlwb3MgKz0KKwkJCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIweCUuNHggIiwKKwkJCQkJICAgICAgb2ZzKTsKKwkJCQloZXhfZHVtcF90b19idWZmZXIocHRyICsgb2ZzLCAxNiwgMTYsIDIsCisJCQkJCQkgICBidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAwKTsKKwkJCQlwb3MgKz0gc3RybGVuKGJ1ZiArIHBvcyk7CisJCQkJaWYgKGJ1ZnN6IC0gcG9zID4gMCkKKwkJCQkJYnVmW3BvcysrXSA9ICdcbic7CisJCQl9CisJCX0KKwl9CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc190cmFmZmljX2xvZ193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzhdOworCWludCBidWZfc2l6ZTsKKwlpbnQgdHJhZmZpY19sb2c7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHNzY2FuZihidWYsICIlZCIsICZ0cmFmZmljX2xvZykgIT0gMSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHRyYWZmaWNfbG9nID09IDApCisJCWlsX3Jlc2V0X3RyYWZmaWNfbG9nKGlsKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3R4X3F1ZXVlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgICAgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBpbF90eF9xdWV1ZSAqdHhxOworCXN0cnVjdCBpbF9xdWV1ZSAqcTsKKwljaGFyICpidWY7CisJaW50IHBvcyA9IDA7CisJaW50IGNudDsKKwlpbnQgcmV0OworCWNvbnN0IHNpemVfdCBidWZzeiA9CisJICAgIHNpemVvZihjaGFyKSAqIDY0ICogaWwtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CisKKwlpZiAoIWlsLT50eHEpIHsKKwkJSUxfRVJSKCJ0eHEgbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWZvciAoY250ID0gMDsgY250IDwgaWwtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgY250KyspIHsKKwkJdHhxID0gJmlsLT50eHFbY250XTsKKwkJcSA9ICZ0eHEtPnE7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCQkgICAgICAiaHdxICUuMmQ6IHJlYWQ9JXUgd3JpdGU9JXUgc3RvcD0lZCIKKwkJCSAgICAgICIgc3dxX2lkPSUjLjJ4IChhYyAlZC9od3EgJWQpXG4iLCBjbnQsCisJCQkgICAgICBxLT5yZWFkX3B0ciwgcS0+d3JpdGVfcHRyLAorCQkJICAgICAgISF0ZXN0X2JpdChjbnQsIGlsLT5xdWV1ZV9zdG9wcGVkKSwKKwkJCSAgICAgIHR4cS0+c3dxX2lkLCB0eHEtPnN3cV9pZCAmIDMsCisJCQkgICAgICAodHhxLT5zd3FfaWQgPj4gMikgJiAweDFmKTsKKwkJaWYgKGNudCA+PSA0KQorCQkJY29udGludWU7CisJCS8qIGZvciB0aGUgQUNzLCBkaXNwbGF5IHRoZSBzdG9wIGNvdW50IHRvbyAqLworCQlwb3MgKz0KKwkJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAorCQkJICAgICAgIiAgICAgICAgc3RvcC1jb3VudDogJWRcbiIsCisJCQkgICAgICBhdG9taWNfcmVhZCgmaWwtPnF1ZXVlX3N0b3BfY291bnRbY250XSkpOworCX0KKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19yeF9xdWV1ZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwKKwkJICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaWxfcnhfcXVldWUgKnJ4cSA9ICZpbC0+cnhxOworCWNoYXIgYnVmWzI1Nl07CisJaW50IHBvcyA9IDA7CisJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CisKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJyZWFkOiAldVxuIiwgcnhxLT5yZWFkKTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJ3cml0ZTogJXVcbiIsIHJ4cS0+d3JpdGUpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImZyZWVfY291bnQ6ICV1XG4iLAorCQkgICAgICByeHEtPmZyZWVfY291bnQpOworCWlmIChyeHEtPnJiX3N0dHMpIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNsb3NlZF9yYl9udW06ICV1XG4iLAorCQkJICAgICAgbGUxNl90b19jcHUocnhxLT5yYl9zdHRzLT4KKwkJCQkJICBjbG9zZWRfcmJfbnVtKSAmIDB4MEZGRik7CisJfSBlbHNlIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJCSAgICAgICJjbG9zZWRfcmJfbnVtOiBOb3QgQWxsb2NhdGVkXG4iKTsKKwl9CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfdWNvZGVfcnhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIGlsLT5jZmctPm9wcy0+bGliLT5kZWJ1Z2ZzX29wcy5yeF9zdGF0c19yZWFkKGZpbGUsIHVzZXJfYnVmLAorCQkJCQkJCSAgICBjb3VudCwgcHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc191Y29kZV90eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlyZXR1cm4gaWwtPmNmZy0+b3BzLT5saWItPmRlYnVnZnNfb3BzLnR4X3N0YXRzX3JlYWQoZmlsZSwgdXNlcl9idWYsCisJCQkJCQkJICAgIGNvdW50LCBwcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBpbC0+Y2ZnLT5vcHMtPmxpYi0+ZGVidWdmc19vcHMuZ2VuZXJhbF9zdGF0c19yZWFkKGZpbGUsIHVzZXJfYnVmLAorCQkJCQkJCQkgY291bnQsIHBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfc2Vuc2l0aXZpdHlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwlpbnQgY250ID0gMDsKKwljaGFyICpidWY7CisJaW50IGJ1ZnN6ID0gc2l6ZW9mKHN0cnVjdCBpbF9zZW5zaXRpdml0eV9kYXRhKSAqIDQgKyAxMDA7CisJc3NpemVfdCByZXQ7CisJc3RydWN0IGlsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGE7CisKKwlkYXRhID0gJmlsLT5zZW5zaXRpdml0eV9kYXRhOworCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOworCWlmICghYnVmKSB7CisJCUlMX0VSUigiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJhdXRvX2NvcnJfb2ZkbTpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmF1dG9fY29ycl9vZmRtKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJhdXRvX2NvcnJfb2ZkbV9tcmM6XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJhdXRvX2NvcnJfb2ZkbV94MTpcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYXV0b19jb3JyX29mZG1fbXJjX3gxOlx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYXV0b19jb3JyX2NjazpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmF1dG9fY29ycl9jY2spOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9jY2tfbXJjOlx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICJsYXN0X2JhZF9wbGNwX2NudF9vZmRtOlx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0pOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImxhc3RfZmFfY250X29mZG06XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibGFzdF9iYWRfcGxjcF9jbnRfY2NrOlx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2Njayk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibGFzdF9mYV9jbnRfY2NrOlx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmxhc3RfZmFfY250X2Njayk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX2N1cnJfc3RhdGU6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5ucmdfY3Vycl9zdGF0ZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3ByZXZfc3RhdGU6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5ucmdfcHJldl9zdGF0ZSk7CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3ZhbHVlOlx0XHRcdCIpOworCWZvciAoY250ID0gMDsgY250IDwgMTA7IGNudCsrKSB7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIgJXUiLAorCQkJICAgICAgZGF0YS0+bnJnX3ZhbHVlW2NudF0pOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOworCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19zaWxlbmNlX3Jzc2k6XHRcdCIpOworCWZvciAoY250ID0gMDsgY250IDwgTlJHX05VTV9QUkVWX1NUQVRfTDsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiAldSIsCisJCQkgICAgICBkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2NudF0pOworCX0KKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19zaWxlbmNlX3JlZjpcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5ucmdfc2lsZW5jZV9yZWYpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19lbmVyZ3lfaWR4Olx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+bnJnX2VuZXJneV9pZHgpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19zaWxlbmNlX2lkeDpcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5ucmdfc2lsZW5jZV9pZHgpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ190aF9jY2s6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5ucmdfdGhfY2NrKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICJucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZjpcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm51bV9pbl9jY2tfbm9fZmE6XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+bnVtX2luX2Nja19ub19mYSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3RoX29mZG06XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5ucmdfdGhfb2ZkbSk7CisKKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKKwlrZnJlZShidWYpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19jaGFpbl9ub2lzZV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBwb3MgPSAwOworCWludCBjbnQgPSAwOworCWNoYXIgKmJ1ZjsKKwlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IGlsX2NoYWluX25vaXNlX2RhdGEpICogNCArIDEwMDsKKwlzc2l6ZV90IHJldDsKKwlzdHJ1Y3QgaWxfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YTsKKworCWRhdGEgPSAmaWwtPmNoYWluX25vaXNlX2RhdGE7CisJYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpIHsKKwkJSUxfRVJSKCJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImFjdGl2ZV9jaGFpbnM6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5hY3RpdmVfY2hhaW5zKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9ub2lzZV9hOlx0XHRcdCAldVxuIiwKKwkJICAgICAgZGF0YS0+Y2hhaW5fbm9pc2VfYSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2hhaW5fbm9pc2VfYjpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmNoYWluX25vaXNlX2IpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX25vaXNlX2M6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5jaGFpbl9ub2lzZV9jKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9zaWduYWxfYTpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmNoYWluX3NpZ25hbF9hKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9zaWduYWxfYjpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmNoYWluX3NpZ25hbF9iKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9zaWduYWxfYzpcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPmNoYWluX3NpZ25hbF9jKTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJiZWFjb25fY291bnQ6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5iZWFjb25fY291bnQpOworCisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiZGlzY29ubl9hcnJheTpcdFx0XHQiKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IE5VTV9SWF9DSEFJTlM7IGNudCsrKSB7CisJCXBvcyArPQorCQkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIgJXUiLAorCQkJICAgICAgZGF0YS0+ZGlzY29ubl9hcnJheVtjbnRdKTsKKwl9CisJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJkZWx0YV9nYWluX2NvZGU6XHRcdCIpOworCWZvciAoY250ID0gMDsgY250IDwgTlVNX1JYX0NIQUlOUzsgY250KyspIHsKKwkJcG9zICs9CisJCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiAldSIsCisJCQkgICAgICBkYXRhLT5kZWx0YV9nYWluX2NvZGVbY250XSk7CisJfQorCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAicmFkaW9fd3JpdGU6XHRcdFx0ICV1XG4iLAorCQkgICAgICBkYXRhLT5yYWRpb193cml0ZSk7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAic3RhdGU6XHRcdFx0XHQgJXVcbiIsCisJCSAgICAgIGRhdGEtPnN0YXRlKTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3Bvd2VyX3NhdmVfc3RhdHVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciBidWZbNjBdOworCWludCBwb3MgPSAwOworCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOworCXUzMiBwd3JzYXZlX3N0YXR1czsKKworCXB3cnNhdmVfc3RhdHVzID0KKwkgICAgX2lsX3JkKGlsLCBDU1JfR1BfQ05UUkwpICYgQ1NSX0dQX1JFR19QT1dFUl9TQVZFX1NUQVRVU19NU0s7CisKKwlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJQb3dlciBTYXZlIFN0YXR1czogIik7CisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJXNcbiIsCisJCSAgICAgIChwd3JzYXZlX3N0YXR1cyA9PSBDU1JfR1BfUkVHX05PX1BPV0VSX1NBVkUpID8gIm5vbmUiIDoKKwkJICAgICAgKHB3cnNhdmVfc3RhdHVzID09IENTUl9HUF9SRUdfTUFDX1BPV0VSX1NBVkUpID8gIk1BQyIgOgorCQkgICAgICAocHdyc2F2ZV9zdGF0dXMgPT0gQ1NSX0dQX1JFR19QSFlfUE9XRVJfU0FWRSkgPyAiUEhZIiA6CisJCSAgICAgICJlcnJvciIpOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfY2xlYXJfdWNvZGVfc3RhdHNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkJCSBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNoYXIgYnVmWzhdOworCWludCBidWZfc2l6ZTsKKwlpbnQgY2xlYXI7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHNzY2FuZihidWYsICIlZCIsICZjbGVhcikgIT0gMSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBtYWtlIHJlcXVlc3QgdG8gdUNvZGUgdG8gcmV0cmlldmUgc3RhdHMgaW5mb3JtYXRpb24gKi8KKwltdXRleF9sb2NrKCZpbC0+bXV0ZXgpOworCWlsX3NlbmRfc3RhdHNfcmVxdWVzdChpbCwgQ01EX1NZTkMsIHRydWUpOworCW11dGV4X3VubG9jaygmaWwtPm11dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3J4b25fZmxhZ3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBsZW4gPSAwOworCWNoYXIgYnVmWzIwXTsKKworCWxlbiA9IHNwcmludGYoYnVmLCAiMHglMDRYXG4iLCBsZTMyX3RvX2NwdShpbC0+Y3R4LmFjdGl2ZS5mbGFncykpOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX3J4b25fZmlsdGVyX2ZsYWdzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgbGVuID0gMDsKKwljaGFyIGJ1ZlsyMF07CisKKwlsZW4gPQorCSAgICBzcHJpbnRmKGJ1ZiwgIjB4JTA0WFxuIiwgbGUzMl90b19jcHUoaWwtPmN0eC5hY3RpdmUuZmlsdGVyX2ZsYWdzKSk7CisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfZmhfcmVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAorCQkgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJY2hhciAqYnVmOworCWludCBwb3MgPSAwOworCXNzaXplX3QgcmV0ID0gLUVGQVVMVDsKKworCWlmIChpbC0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maCkgeworCQlyZXQgPSBwb3MgPSBpbC0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maChpbCwgJmJ1ZiwgdHJ1ZSk7CisJCWlmIChidWYpIHsKKwkJCXJldCA9CisJCQkgICAgc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsCisJCQkJCQkgICAgcG9zKTsKKwkJCWtmcmVlKGJ1Zik7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfbWlzc2VkX2JlYWNvbl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisKKwlzdHJ1Y3QgaWxfcHJpdiAqaWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHBvcyA9IDA7CisJY2hhciBidWZbMTJdOworCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOworCisJcG9zICs9CisJICAgIHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJWRcbiIsCisJCSAgICAgIGlsLT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCk7CisKKwlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitpbF9kYmdmc19taXNzZWRfYmVhY29uX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1Zls4XTsKKwlpbnQgYnVmX3NpemU7CisJaW50IG1pc3NlZDsKKworCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJm1pc3NlZCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobWlzc2VkIDwgSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUlOIHx8CisJICAgIG1pc3NlZCA+IElMX01JU1NFRF9CRUFDT05fVEhSRVNIT0xEX01BWCkKKwkJaWwtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkID0gSUxfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGOworCWVsc2UKKwkJaWwtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkID0gbWlzc2VkOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfZm9yY2VfcmVzZXRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcG9zID0gMDsKKwljaGFyIGJ1ZlszMDBdOworCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOworCXN0cnVjdCBpbF9mb3JjZV9yZXNldCAqZm9yY2VfcmVzZXQ7CisKKwlmb3JjZV9yZXNldCA9ICZpbC0+Zm9yY2VfcmVzZXQ7CisKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdG51bWJlciBvZiByZXNldCByZXF1ZXN0OiAlZFxuIiwKKwkJICAgICAgZm9yY2VfcmVzZXQtPnJlc2V0X3JlcXVlc3RfY291bnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKKwkJICAgICAgIlx0bnVtYmVyIG9mIHJlc2V0IHJlcXVlc3Qgc3VjY2VzczogJWRcbiIsCisJCSAgICAgIGZvcmNlX3Jlc2V0LT5yZXNldF9zdWNjZXNzX2NvdW50KTsKKwlwb3MgKz0KKwkgICAgc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCisJCSAgICAgICJcdG51bWJlciBvZiByZXNldCByZXF1ZXN0IHJlamVjdDogJWRcbiIsCisJCSAgICAgIGZvcmNlX3Jlc2V0LT5yZXNldF9yZWplY3RfY291bnQpOworCXBvcyArPQorCSAgICBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0cmVzZXQgZHVyYXRpb246ICVsdVxuIiwKKwkJICAgICAgZm9yY2VfcmVzZXQtPnJlc2V0X2R1cmF0aW9uKTsKKworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKK30KKworc3RhdGljIHNzaXplX3QKK2lsX2RiZ2ZzX2ZvcmNlX3Jlc2V0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCWludCByZXQ7CisJc3RydWN0IGlsX3ByaXYgKmlsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcmV0ID0gaWxfZm9yY2VfcmVzZXQoaWwsIHRydWUpOworCisJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdAoraWxfZGJnZnNfd2RfdGltZW91dF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKworCXN0cnVjdCBpbF9wcml2ICppbCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwljaGFyIGJ1Zls4XTsKKwlpbnQgYnVmX3NpemU7CisJaW50IHRpbWVvdXQ7CisKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHNzY2FuZihidWYsICIlZCIsICZ0aW1lb3V0KSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodGltZW91dCA8IDAgfHwgdGltZW91dCA+IElMX01BWF9XRF9USU1FT1VUKQorCQl0aW1lb3V0ID0gSUxfREVGX1dEX1RJTUVPVVQ7CisKKwlpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCA9IHRpbWVvdXQ7CisJaWxfc2V0dXBfd2F0Y2hkb2coaWwpOworCXJldHVybiBjb3VudDsKK30KKworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4X3N0YXRzKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyh0eF9zdGF0cyk7CitERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFModHJhZmZpY19sb2cpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4X3F1ZXVlKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyh0eF9xdWV1ZSk7CitERUJVR0ZTX1JFQURfRklMRV9PUFModWNvZGVfcnhfc3RhdHMpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHVjb2RlX3R4X3N0YXRzKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyh1Y29kZV9nZW5lcmFsX3N0YXRzKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhzZW5zaXRpdml0eSk7CitERUJVR0ZTX1JFQURfRklMRV9PUFMoY2hhaW5fbm9pc2UpOworREVCVUdGU19SRUFEX0ZJTEVfT1BTKHBvd2VyX3NhdmVfc3RhdHVzKTsKK0RFQlVHRlNfV1JJVEVfRklMRV9PUFMoY2xlYXJfdWNvZGVfc3RhdHMpOworREVCVUdGU19XUklURV9GSUxFX09QUyhjbGVhcl90cmFmZmljX3N0YXRzKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhmaF9yZWcpOworREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKG1pc3NlZF9iZWFjb24pOworREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKGZvcmNlX3Jlc2V0KTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhyeG9uX2ZsYWdzKTsKK0RFQlVHRlNfUkVBRF9GSUxFX09QUyhyeG9uX2ZpbHRlcl9mbGFncyk7CitERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKHdkX3RpbWVvdXQpOworCisvKgorICogQ3JlYXRlIHRoZSBkZWJ1Z2ZzIGZpbGVzIGFuZCBkaXJlY3RvcmllcworICoKKyAqLworaW50CitpbF9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgaWxfcHJpdiAqaWwsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGRlbnRyeSAqcGh5ZCA9IGlsLT5ody0+d2lwaHktPmRlYnVnZnNkaXI7CisJc3RydWN0IGRlbnRyeSAqZGlyX2RydiwgKmRpcl9kYXRhLCAqZGlyX3JmLCAqZGlyX2RlYnVnOworCisJZGlyX2RydiA9IGRlYnVnZnNfY3JlYXRlX2RpcihuYW1lLCBwaHlkKTsKKwlpZiAoIWRpcl9kcnYpCisJCXJldHVybiAtRU5PTUVNOworCisJaWwtPmRlYnVnZnNfZGlyID0gZGlyX2RydjsKKworCWRpcl9kYXRhID0gZGVidWdmc19jcmVhdGVfZGlyKCJkYXRhIiwgZGlyX2Rydik7CisJaWYgKCFkaXJfZGF0YSkKKwkJZ290byBlcnI7CisJZGlyX3JmID0gZGVidWdmc19jcmVhdGVfZGlyKCJyZiIsIGRpcl9kcnYpOworCWlmICghZGlyX3JmKQorCQlnb3RvIGVycjsKKwlkaXJfZGVidWcgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRlYnVnIiwgZGlyX2Rydik7CisJaWYgKCFkaXJfZGVidWcpCisJCWdvdG8gZXJyOworCisJREVCVUdGU19BRERfRklMRShudm0sIGRpcl9kYXRhLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHNyYW0sIGRpcl9kYXRhLCBTX0lXVVNSIHwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShzdGF0aW9ucywgZGlyX2RhdGEsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUoY2hhbm5lbHMsIGRpcl9kYXRhLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHN0YXR1cywgZGlyX2RhdGEsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUoaW50ZXJydXB0LCBkaXJfZGF0YSwgU19JV1VTUiB8IFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUocW9zLCBkaXJfZGF0YSwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShkaXNhYmxlX2h0NDAsIGRpcl9kYXRhLCBTX0lXVVNSIHwgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShyeF9zdGF0cywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHR4X3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUodHJhZmZpY19sb2csIGRpcl9kZWJ1ZywgU19JV1VTUiB8IFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUocnhfcXVldWUsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRSh0eF9xdWV1ZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHBvd2VyX3NhdmVfc3RhdHVzLCBkaXJfZGVidWcsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUoY2xlYXJfdWNvZGVfc3RhdHMsIGRpcl9kZWJ1ZywgU19JV1VTUik7CisJREVCVUdGU19BRERfRklMRShjbGVhcl90cmFmZmljX3N0YXRzLCBkaXJfZGVidWcsIFNfSVdVU1IpOworCURFQlVHRlNfQUREX0ZJTEUoZmhfcmVnLCBkaXJfZGVidWcsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUobWlzc2VkX2JlYWNvbiwgZGlyX2RlYnVnLCBTX0lXVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKGZvcmNlX3Jlc2V0LCBkaXJfZGVidWcsIFNfSVdVU1IgfCBTX0lSVVNSKTsKKwlERUJVR0ZTX0FERF9GSUxFKHVjb2RlX3J4X3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOworCURFQlVHRlNfQUREX0ZJTEUodWNvZGVfdHhfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRSh1Y29kZV9nZW5lcmFsX3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOworCisJaWYgKGlsLT5jZmctPmJhc2VfcGFyYW1zLT5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIpCisJCURFQlVHRlNfQUREX0ZJTEUoc2Vuc2l0aXZpdHksIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJaWYgKGlsLT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIpCisJCURFQlVHRlNfQUREX0ZJTEUoY2hhaW5fbm9pc2UsIGRpcl9kZWJ1ZywgU19JUlVTUik7CisJREVCVUdGU19BRERfRklMRShyeG9uX2ZsYWdzLCBkaXJfZGVidWcsIFNfSVdVU1IpOworCURFQlVHRlNfQUREX0ZJTEUocnhvbl9maWx0ZXJfZmxhZ3MsIGRpcl9kZWJ1ZywgU19JV1VTUik7CisJREVCVUdGU19BRERfRklMRSh3ZF90aW1lb3V0LCBkaXJfZGVidWcsIFNfSVdVU1IpOworCWlmIChpbC0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2Vuc2l0aXZpdHlfY2FsaWJfYnlfZHJpdmVyKQorCQlERUJVR0ZTX0FERF9CT09MKGRpc2FibGVfc2Vuc2l0aXZpdHksIGRpcl9yZiwKKwkJCQkgJmlsLT5kaXNhYmxlX3NlbnNfY2FsKTsKKwlpZiAoaWwtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX2NhbGliX2J5X2RyaXZlcikKKwkJREVCVUdGU19BRERfQk9PTChkaXNhYmxlX2NoYWluX25vaXNlLCBkaXJfcmYsCisJCQkJICZpbC0+ZGlzYWJsZV9jaGFpbl9ub2lzZV9jYWwpOworCURFQlVHRlNfQUREX0JPT0woZGlzYWJsZV90eF9wb3dlciwgZGlyX3JmLCAmaWwtPmRpc2FibGVfdHhfcG93ZXJfY2FsKTsKKwlyZXR1cm4gMDsKKworZXJyOgorCUlMX0VSUigiQ2FuJ3QgY3JlYXRlIHRoZSBkZWJ1Z2ZzIGRpcmVjdG9yeVxuIik7CisJaWxfZGJnZnNfdW5yZWdpc3RlcihpbCk7CisJcmV0dXJuIC1FTk9NRU07Cit9CitFWFBPUlRfU1lNQk9MKGlsX2RiZ2ZzX3JlZ2lzdGVyKTsKKworLyoqCisgKiBSZW1vdmUgdGhlIGRlYnVnZnMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisgKgorICovCit2b2lkCitpbF9kYmdmc191bnJlZ2lzdGVyKHN0cnVjdCBpbF9wcml2ICppbCkKK3sKKwlpZiAoIWlsLT5kZWJ1Z2ZzX2RpcikKKwkJcmV0dXJuOworCisJZGVidWdmc19yZW1vdmVfcmVjdXJzaXZlKGlsLT5kZWJ1Z2ZzX2Rpcik7CisJaWwtPmRlYnVnZnNfZGlyID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woaWxfZGJnZnNfdW5yZWdpc3Rlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1kZWJ1Z2ZzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYWJiMzguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtZGVidWdmcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJpd2wtMzk0NS1kZWJ1Z2ZzLmgiCi0KLQotc3RhdGljIGludCBpd2wzOTQ1X3N0YXRpc3RpY3NfZmxhZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNoYXIgKmJ1ZiwgaW50IGJ1ZnN6KQotewotCWludCBwID0gMDsKLQotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlN0YXRpc3RpY3MgRmxhZygweCVYKTpcbiIsCi0JCSAgICAgICBsZTMyX3RvX2NwdShwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmZsYWcpKTsKLQlpZiAobGUzMl90b19jcHUocHJpdi0+XzM5NDUuc3RhdGlzdGljcy5mbGFnKSAmCi0JCQlVQ09ERV9TVEFUSVNUSUNTX0NMRUFSX01TSykKLQkJcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLAotCQkJICAgICAgICJcdFN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOwotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0T3BlcmF0aW9uYWwgRnJlcXVlbmN5OiAlc1xuIiwKLQkJICAgICAgIChsZTMyX3RvX2NwdShwcml2LT5fMzk0NS5zdGF0aXN0aWNzLmZsYWcpICYKLQkJCVVDT0RFX1NUQVRJU1RJQ1NfRlJFUVVFTkNZX01TSykKLQkJCT8gIjIuNCBHSHoiIDogIjUuMiBHSHoiKTsKLQlwICs9IHNjbnByaW50ZihidWYgKyBwLCBidWZzeiAtIHAsICJcdFRHaiBOYXJyb3cgQmFuZDogJXNcbiIsCi0JCSAgICAgICAobGUzMl90b19jcHUocHJpdi0+XzM5NDUuc3RhdGlzdGljcy5mbGFnKSAmCi0JCQlVQ09ERV9TVEFUSVNUSUNTX05BUlJPV19CQU5EX01TSykKLQkJCT8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0JcmV0dXJuIHA7Ci19Ci0KLXNzaXplX3QgaXdsMzk0NV91Y29kZV9yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCSAgICBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgcG9zID0gMDsKLQljaGFyICpidWY7Ci0JaW50IGJ1ZnN6ID0gc2l6ZW9mKHN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X3BoeSkgKiA0MCArCi0JCSAgICBzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRpc3RpY3Nfcnhfbm9uX3BoeSkgKiA0MCArIDQwMDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9waHkgKm9mZG0sICphY2N1bV9vZmRtLCAqZGVsdGFfb2ZkbSwKLQkJCQkJKm1heF9vZmRtOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3J4X3BoeSAqY2NrLCAqYWNjdW1fY2NrLCAqZGVsdGFfY2NrLCAqbWF4X2NjazsKLQlzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9ub25fcGh5ICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKLQlzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19yeF9ub25fcGh5ICpkZWx0YV9nZW5lcmFsLCAqbWF4X2dlbmVyYWw7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJSVdMX0VSUihwcml2LCAiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCi0JICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5Ci0JICovCi0Jb2ZkbSA9ICZwcml2LT5fMzk0NS5zdGF0aXN0aWNzLnJ4Lm9mZG07Ci0JY2NrID0gJnByaXYtPl8zOTQ1LnN0YXRpc3RpY3MucnguY2NrOwotCWdlbmVyYWwgPSAmcHJpdi0+XzM5NDUuc3RhdGlzdGljcy5yeC5nZW5lcmFsOwotCWFjY3VtX29mZG0gPSAmcHJpdi0+XzM5NDUuYWNjdW1fc3RhdGlzdGljcy5yeC5vZmRtOwotCWFjY3VtX2NjayA9ICZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLnJ4LmNjazsKLQlhY2N1bV9nZW5lcmFsID0gJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MucnguZ2VuZXJhbDsKLQlkZWx0YV9vZmRtID0gJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3Mucngub2ZkbTsKLQlkZWx0YV9jY2sgPSAmcHJpdi0+XzM5NDUuZGVsdGFfc3RhdGlzdGljcy5yeC5jY2s7Ci0JZGVsdGFfZ2VuZXJhbCA9ICZwcml2LT5fMzk0NS5kZWx0YV9zdGF0aXN0aWNzLnJ4LmdlbmVyYWw7Ci0JbWF4X29mZG0gPSAmcHJpdi0+XzM5NDUubWF4X2RlbHRhLnJ4Lm9mZG07Ci0JbWF4X2NjayA9ICZwcml2LT5fMzk0NS5tYXhfZGVsdGEucnguY2NrOwotCW1heF9nZW5lcmFsID0gJnByaXYtPl8zOTQ1Lm1heF9kZWx0YS5yeC5nZW5lcmFsOwotCi0JcG9zICs9IGl3bDM5NDVfc3RhdGlzdGljc19mbGFnKHByaXYsIGJ1ZiwgYnVmc3opOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiUtMzJzICAgICBjdXJyZW50IgotCQkJICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKLQkJCSAiU3RhdGlzdGljc19SeCAtIE9GRE06Iik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImluYV9jbnQ6IiwgbGUzMl90b19jcHUob2ZkbS0+aW5hX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+aW5hX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5pbmFfY250LCBtYXhfb2ZkbS0+aW5hX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImZpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmluYV9jbnQpLCBhY2N1bV9vZmRtLT5maW5hX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5maW5hX2NudCwgbWF4X29mZG0tPmZpbmFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgInBsY3BfZXJyOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+cGxjcF9lcnIpLCBhY2N1bV9vZmRtLT5wbGNwX2VyciwKLQkJCSBkZWx0YV9vZmRtLT5wbGNwX2VyciwgbWF4X29mZG0tPnBsY3BfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgICJjcmMzMl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9lcnIpLCBhY2N1bV9vZmRtLT5jcmMzMl9lcnIsCi0JCQkgZGVsdGFfb2ZkbS0+Y3JjMzJfZXJyLCBtYXhfb2ZkbS0+Y3JjMzJfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwgIm92ZXJydW5fZXJyOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+b3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX29mZG0tPm92ZXJydW5fZXJyLCBkZWx0YV9vZmRtLT5vdmVycnVuX2VyciwKLQkJCSBtYXhfb2ZkbS0+b3ZlcnJ1bl9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJlYXJseV9vdmVycnVuX2VycjoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmVhcmx5X292ZXJydW5fZXJyKSwKLQkJCSBhY2N1bV9vZmRtLT5lYXJseV9vdmVycnVuX2VyciwKLQkJCSBkZWx0YV9vZmRtLT5lYXJseV9vdmVycnVuX2VyciwKLQkJCSBtYXhfb2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJjcmMzMl9nb29kOiIsIGxlMzJfdG9fY3B1KG9mZG0tPmNyYzMyX2dvb2QpLAotCQkJIGFjY3VtX29mZG0tPmNyYzMyX2dvb2QsIGRlbHRhX29mZG0tPmNyYzMyX2dvb2QsCi0JCQkgbWF4X29mZG0tPmNyYzMyX2dvb2QpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLCAiZmFsc2VfYWxhcm1fY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmFsc2VfYWxhcm1fY250KSwKLQkJCSBhY2N1bV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsCi0JCQkgZGVsdGFfb2ZkbS0+ZmFsc2VfYWxhcm1fY250LAotCQkJIG1heF9vZmRtLT5mYWxzZV9hbGFybV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJmaW5hX3N5bmNfZXJyX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfc3luY19lcnJfY250KSwKLQkJCSBhY2N1bV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKLQkJCSBtYXhfb2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJzZmRfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNmZF90aW1lb3V0KSwKLQkJCSBhY2N1bV9vZmRtLT5zZmRfdGltZW91dCwKLQkJCSBkZWx0YV9vZmRtLT5zZmRfdGltZW91dCwKLQkJCSBtYXhfb2ZkbS0+c2ZkX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJmaW5hX3RpbWVvdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5maW5hX3RpbWVvdXQpLAotCQkJIGFjY3VtX29mZG0tPmZpbmFfdGltZW91dCwKLQkJCSBkZWx0YV9vZmRtLT5maW5hX3RpbWVvdXQsCi0JCQkgbWF4X29mZG0tPmZpbmFfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInVucmVzcG9uZGVkX3J0czoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnVucmVzcG9uZGVkX3J0cyksCi0JCQkgYWNjdW1fb2ZkbS0+dW5yZXNwb25kZWRfcnRzLAotCQkJIGRlbHRhX29mZG0tPnVucmVzcG9uZGVkX3J0cywKLQkJCSBtYXhfb2ZkbS0+dW5yZXNwb25kZWRfcnRzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAicnhlX2ZyYW1lX2xtdF9vdnJ1bjoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuKSwKLQkJCSBhY2N1bV9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKLQkJCSBkZWx0YV9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKLQkJCSBtYXhfb2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJzZW50X2Fja19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5zZW50X2Fja19jbnQpLAotCQkJIGFjY3VtX29mZG0tPnNlbnRfYWNrX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5zZW50X2Fja19jbnQsCi0JCQkgbWF4X29mZG0tPnNlbnRfYWNrX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInNlbnRfY3RzX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfY3RzX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9jdHNfY250LAotCQkJIGRlbHRhX29mZG0tPnNlbnRfY3RzX2NudCwgbWF4X29mZG0tPnNlbnRfY3RzX2NudCk7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIlLTMycyAgICAgY3VycmVudCIKLQkJCSAiYWN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiIsCi0JCQkgIlN0YXRpc3RpY3NfUnggLSBDQ0s6Iik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImluYV9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmluYV9jbnQpLCBhY2N1bV9jY2stPmluYV9jbnQsCi0JCQkgZGVsdGFfY2NrLT5pbmFfY250LCBtYXhfY2NrLT5pbmFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiZmluYV9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfY250KSwgYWNjdW1fY2NrLT5maW5hX2NudCwKLQkJCSBkZWx0YV9jY2stPmZpbmFfY250LCBtYXhfY2NrLT5maW5hX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInBsY3BfZXJyOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5wbGNwX2VyciksIGFjY3VtX2Njay0+cGxjcF9lcnIsCi0JCQkgZGVsdGFfY2NrLT5wbGNwX2VyciwgbWF4X2Njay0+cGxjcF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJjcmMzMl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmNyYzMyX2VyciksIGFjY3VtX2Njay0+Y3JjMzJfZXJyLAotCQkJIGRlbHRhX2Njay0+Y3JjMzJfZXJyLCBtYXhfY2NrLT5jcmMzMl9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJvdmVycnVuX2VycjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+b3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX2Njay0+b3ZlcnJ1bl9lcnIsCi0JCQkgZGVsdGFfY2NrLT5vdmVycnVuX2VyciwgbWF4X2Njay0+b3ZlcnJ1bl9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJlYXJseV9vdmVycnVuX2VycjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX2Njay0+ZWFybHlfb3ZlcnJ1bl9lcnIsCi0JCQkgZGVsdGFfY2NrLT5lYXJseV9vdmVycnVuX2VyciwKLQkJCSBtYXhfY2NrLT5lYXJseV9vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImNyYzMyX2dvb2Q6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmNyYzMyX2dvb2QpLCBhY2N1bV9jY2stPmNyYzMyX2dvb2QsCi0JCQkgZGVsdGFfY2NrLT5jcmMzMl9nb29kLAotCQkJIG1heF9jY2stPmNyYzMyX2dvb2QpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJmYWxzZV9hbGFybV9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZhbHNlX2FsYXJtX2NudCksCi0JCQkgYWNjdW1fY2NrLT5mYWxzZV9hbGFybV9jbnQsCi0JCQkgZGVsdGFfY2NrLT5mYWxzZV9hbGFybV9jbnQsIG1heF9jY2stPmZhbHNlX2FsYXJtX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImZpbmFfc3luY19lcnJfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5maW5hX3N5bmNfZXJyX2NudCksCi0JCQkgYWNjdW1fY2NrLT5maW5hX3N5bmNfZXJyX2NudCwKLQkJCSBkZWx0YV9jY2stPmZpbmFfc3luY19lcnJfY250LAotCQkJIG1heF9jY2stPmZpbmFfc3luY19lcnJfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAic2ZkX3RpbWVvdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPnNmZF90aW1lb3V0KSwKLQkJCSBhY2N1bV9jY2stPnNmZF90aW1lb3V0LAotCQkJIGRlbHRhX2Njay0+c2ZkX3RpbWVvdXQsIG1heF9jY2stPnNmZF90aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiZmluYV90aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5maW5hX3RpbWVvdXQpLAotCQkJIGFjY3VtX2Njay0+ZmluYV90aW1lb3V0LAotCQkJIGRlbHRhX2Njay0+ZmluYV90aW1lb3V0LCBtYXhfY2NrLT5maW5hX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJ1bnJlc3BvbmRlZF9ydHM6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPnVucmVzcG9uZGVkX3J0cyksCi0JCQkgYWNjdW1fY2NrLT51bnJlc3BvbmRlZF9ydHMsCi0JCQkgZGVsdGFfY2NrLT51bnJlc3BvbmRlZF9ydHMsCi0JCQkgbWF4X2Njay0+dW5yZXNwb25kZWRfcnRzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAicnhlX2ZyYW1lX2xtdF9vdnJ1bjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAotCQkJIGFjY3VtX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCi0JCQkgZGVsdGFfY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKLQkJCSBtYXhfY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInNlbnRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2VudF9hY2tfY250KSwKLQkJCSBhY2N1bV9jY2stPnNlbnRfYWNrX2NudCwKLQkJCSBkZWx0YV9jY2stPnNlbnRfYWNrX2NudCwKLQkJCSBtYXhfY2NrLT5zZW50X2Fja19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJzZW50X2N0c19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPnNlbnRfY3RzX2NudCksCi0JCQkgYWNjdW1fY2NrLT5zZW50X2N0c19jbnQsCi0JCQkgZGVsdGFfY2NrLT5zZW50X2N0c19jbnQsCi0JCQkgbWF4X2Njay0+c2VudF9jdHNfY250KTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiUtMzJzICAgICBjdXJyZW50IgotCQkJICJhY3VtdWxhdGl2ZSAgICAgICBkZWx0YSAgICAgICAgIG1heFxuIiwKLQkJCSAiU3RhdGlzdGljc19SeCAtIEdFTkVSQUw6Iik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImJvZ3VzX2N0czoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJvZ3VzX2N0cyksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+Ym9ndXNfY3RzLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJvZ3VzX2N0cywgbWF4X2dlbmVyYWwtPmJvZ3VzX2N0cyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImJvZ3VzX2FjazoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJvZ3VzX2FjayksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+Ym9ndXNfYWNrLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJvZ3VzX2FjaywgbWF4X2dlbmVyYWwtPmJvZ3VzX2Fjayk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgIm5vbl9ic3NpZF9mcmFtZXM6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzLAotCQkJIGRlbHRhX2dlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMsCi0JCQkgbWF4X2dlbmVyYWwtPm5vbl9ic3NpZF9mcmFtZXMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJmaWx0ZXJlZF9mcmFtZXM6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcywKLQkJCSBkZWx0YV9nZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMsCi0JCQkgbWF4X2dlbmVyYWwtPmZpbHRlcmVkX2ZyYW1lcyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgIm5vbl9jaGFubmVsX2JlYWNvbnM6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAotCQkJIGRlbHRhX2dlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMsCi0JCQkgbWF4X2dlbmVyYWwtPm5vbl9jaGFubmVsX2JlYWNvbnMpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90IGl3bDM5NDVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHBvcyA9IDA7Ci0JY2hhciAqYnVmOwotCWludCBidWZzeiA9IChzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfdHgpICogNDgpICsgMjUwOwotCXNzaXplX3QgcmV0OwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX3R4ICp0eCwgKmFjY3VtX3R4LCAqZGVsdGFfdHgsICptYXhfdHg7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJSVdMX0VSUihwcml2LCAiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKgotCSAqIFRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCi0JICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5Ci0JICovCi0JdHggPSAmcHJpdi0+XzM5NDUuc3RhdGlzdGljcy50eDsKLQlhY2N1bV90eCA9ICZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLnR4OwotCWRlbHRhX3R4ID0gJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3MudHg7Ci0JbWF4X3R4ID0gJnByaXYtPl8zOTQ1Lm1heF9kZWx0YS50eDsKLQlwb3MgKz0gaXdsMzk0NV9zdGF0aXN0aWNzX2ZsYWcocHJpdiwgYnVmLCBidWZzeik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJS0zMnMgICAgIGN1cnJlbnQiCi0JCQkgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAotCQkJICJTdGF0aXN0aWNzX1R4OiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJwcmVhbWJsZToiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5wcmVhbWJsZV9jbnQpLAotCQkJIGFjY3VtX3R4LT5wcmVhbWJsZV9jbnQsCi0JCQkgZGVsdGFfdHgtPnByZWFtYmxlX2NudCwgbWF4X3R4LT5wcmVhbWJsZV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJyeF9kZXRlY3RlZF9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+cnhfZGV0ZWN0ZWRfY250KSwKLQkJCSBhY2N1bV90eC0+cnhfZGV0ZWN0ZWRfY250LAotCQkJIGRlbHRhX3R4LT5yeF9kZXRlY3RlZF9jbnQsIG1heF90eC0+cnhfZGV0ZWN0ZWRfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYnRfcHJpb19kZWZlcl9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YnRfcHJpb19kZWZlcl9jbnQpLAotCQkJIGFjY3VtX3R4LT5idF9wcmlvX2RlZmVyX2NudCwKLQkJCSBkZWx0YV90eC0+YnRfcHJpb19kZWZlcl9jbnQsCi0JCQkgbWF4X3R4LT5idF9wcmlvX2RlZmVyX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImJ0X3ByaW9fa2lsbF9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YnRfcHJpb19raWxsX2NudCksCi0JCQkgYWNjdW1fdHgtPmJ0X3ByaW9fa2lsbF9jbnQsCi0JCQkgZGVsdGFfdHgtPmJ0X3ByaW9fa2lsbF9jbnQsCi0JCQkgbWF4X3R4LT5idF9wcmlvX2tpbGxfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiZmV3X2J5dGVzX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5mZXdfYnl0ZXNfY250KSwKLQkJCSBhY2N1bV90eC0+ZmV3X2J5dGVzX2NudCwKLQkJCSBkZWx0YV90eC0+ZmV3X2J5dGVzX2NudCwgbWF4X3R4LT5mZXdfYnl0ZXNfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiY3RzX3RpbWVvdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+Y3RzX3RpbWVvdXQpLCBhY2N1bV90eC0+Y3RzX3RpbWVvdXQsCi0JCQkgZGVsdGFfdHgtPmN0c190aW1lb3V0LCBtYXhfdHgtPmN0c190aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiYWNrX3RpbWVvdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YWNrX3RpbWVvdXQpLAotCQkJIGFjY3VtX3R4LT5hY2tfdGltZW91dCwKLQkJCSBkZWx0YV90eC0+YWNrX3RpbWVvdXQsIG1heF90eC0+YWNrX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJleHBlY3RlZF9hY2tfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmV4cGVjdGVkX2Fja19jbnQpLAotCQkJIGFjY3VtX3R4LT5leHBlY3RlZF9hY2tfY250LAotCQkJIGRlbHRhX3R4LT5leHBlY3RlZF9hY2tfY250LAotCQkJIG1heF90eC0+ZXhwZWN0ZWRfYWNrX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImFjdHVhbF9hY2tfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFjdHVhbF9hY2tfY250KSwKLQkJCSBhY2N1bV90eC0+YWN0dWFsX2Fja19jbnQsCi0JCQkgZGVsdGFfdHgtPmFjdHVhbF9hY2tfY250LAotCQkJIG1heF90eC0+YWN0dWFsX2Fja19jbnQpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90IGl3bDM5NDVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IGl3bDM5X3N0YXRpc3RpY3NfZ2VuZXJhbCkgKiAxMCArIDMwMDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19nZW5lcmFsICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKLQlzdHJ1Y3QgaXdsMzlfc3RhdGlzdGljc19nZW5lcmFsICpkZWx0YV9nZW5lcmFsLCAqbWF4X2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZGJnICpkYmcsICphY2N1bV9kYmcsICpkZWx0YV9kYmcsICptYXhfZGJnOwotCXN0cnVjdCBpd2wzOV9zdGF0aXN0aWNzX2RpdiAqZGl2LCAqYWNjdW1fZGl2LCAqZGVsdGFfZGl2LCAqbWF4X2RpdjsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hbGl2ZShwcml2KSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQlidWYgPSBremFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikgewotCQlJV0xfRVJSKHByaXYsICJDYW4gbm90IGFsbG9jYXRlIEJ1ZmZlclxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qCi0JICogVGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgKiB0aGUgbGFzdCBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiBmcm9tIHVDb2RlCi0JICogbWlnaHQgbm90IHJlZmxlY3QgdGhlIGN1cnJlbnQgdUNvZGUgYWN0aXZpdHkKLQkgKi8KLQlnZW5lcmFsID0gJnByaXYtPl8zOTQ1LnN0YXRpc3RpY3MuZ2VuZXJhbDsKLQlkYmcgPSAmcHJpdi0+XzM5NDUuc3RhdGlzdGljcy5nZW5lcmFsLmRiZzsKLQlkaXYgPSAmcHJpdi0+XzM5NDUuc3RhdGlzdGljcy5nZW5lcmFsLmRpdjsKLQlhY2N1bV9nZW5lcmFsID0gJnByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbDsKLQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl8zOTQ1LmRlbHRhX3N0YXRpc3RpY3MuZ2VuZXJhbDsKLQltYXhfZ2VuZXJhbCA9ICZwcml2LT5fMzk0NS5tYXhfZGVsdGEuZ2VuZXJhbDsKLQlhY2N1bV9kYmcgPSAmcHJpdi0+XzM5NDUuYWNjdW1fc3RhdGlzdGljcy5nZW5lcmFsLmRiZzsKLQlkZWx0YV9kYmcgPSAmcHJpdi0+XzM5NDUuZGVsdGFfc3RhdGlzdGljcy5nZW5lcmFsLmRiZzsKLQltYXhfZGJnID0gJnByaXYtPl8zOTQ1Lm1heF9kZWx0YS5nZW5lcmFsLmRiZzsKLQlhY2N1bV9kaXYgPSAmcHJpdi0+XzM5NDUuYWNjdW1fc3RhdGlzdGljcy5nZW5lcmFsLmRpdjsKLQlkZWx0YV9kaXYgPSAmcHJpdi0+XzM5NDUuZGVsdGFfc3RhdGlzdGljcy5nZW5lcmFsLmRpdjsKLQltYXhfZGl2ID0gJnByaXYtPl8zOTQ1Lm1heF9kZWx0YS5nZW5lcmFsLmRpdjsKLQlwb3MgKz0gaXdsMzk0NV9zdGF0aXN0aWNzX2ZsYWcocHJpdiwgYnVmLCBidWZzeik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiJS0zMnMgICAgIGN1cnJlbnQiCi0JCQkgImFjdW11bGF0aXZlICAgICAgIGRlbHRhICAgICAgICAgbWF4XG4iLAotCQkJICJTdGF0aXN0aWNzX0dlbmVyYWw6Iik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImJ1cnN0X2NoZWNrOiIsCi0JCQkgbGUzMl90b19jcHUoZGJnLT5idXJzdF9jaGVjayksCi0JCQkgYWNjdW1fZGJnLT5idXJzdF9jaGVjaywKLQkJCSBkZWx0YV9kYmctPmJ1cnN0X2NoZWNrLCBtYXhfZGJnLT5idXJzdF9jaGVjayk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgImJ1cnN0X2NvdW50OiIsCi0JCQkgbGUzMl90b19jcHUoZGJnLT5idXJzdF9jb3VudCksCi0JCQkgYWNjdW1fZGJnLT5idXJzdF9jb3VudCwKLQkJCSBkZWx0YV9kYmctPmJ1cnN0X2NvdW50LCBtYXhfZGJnLT5idXJzdF9jb3VudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInNsZWVwX3RpbWU6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5zbGVlcF90aW1lKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5zbGVlcF90aW1lLAotCQkJIGRlbHRhX2dlbmVyYWwtPnNsZWVwX3RpbWUsIG1heF9nZW5lcmFsLT5zbGVlcF90aW1lKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAic2xvdHNfb3V0OiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfb3V0KSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5zbG90c19vdXQsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfb3V0LCBtYXhfZ2VuZXJhbC0+c2xvdHNfb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAic2xvdHNfaWRsZToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsb3RzX2lkbGUpLAotCQkJIGFjY3VtX2dlbmVyYWwtPnNsb3RzX2lkbGUsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfaWRsZSwgbWF4X2dlbmVyYWwtPnNsb3RzX2lkbGUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgInR0bF90aW1lc3RhbXA6XHRcdFx0JXVcbiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+dHRsX3RpbWVzdGFtcCkpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSAiICAlLTMwcyAlMTB1ICAlMTB1ICAlMTB1ICAlMTB1XG4iLAotCQkJICJ0eF9vbl9hOiIsCi0JCQkgbGUzMl90b19jcHUoZGl2LT50eF9vbl9hKSwgYWNjdW1fZGl2LT50eF9vbl9hLAotCQkJIGRlbHRhX2Rpdi0+dHhfb25fYSwgbWF4X2Rpdi0+dHhfb25fYSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiIsCi0JCQkgInR4X29uX2I6IiwKLQkJCSBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2IpLCBhY2N1bV9kaXYtPnR4X29uX2IsCi0JCQkgZGVsdGFfZGl2LT50eF9vbl9iLCBtYXhfZGl2LT50eF9vbl9iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAiZXhlY190aW1lOiIsCi0JCQkgbGUzMl90b19jcHUoZGl2LT5leGVjX3RpbWUpLCBhY2N1bV9kaXYtPmV4ZWNfdGltZSwKLQkJCSBkZWx0YV9kaXYtPmV4ZWNfdGltZSwgbWF4X2Rpdi0+ZXhlY190aW1lKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgIiAgJS0zMHMgJTEwdSAgJTEwdSAgJTEwdSAgJTEwdVxuIiwKLQkJCSAicHJvYmVfdGltZToiLAotCQkJIGxlMzJfdG9fY3B1KGRpdi0+cHJvYmVfdGltZSksIGFjY3VtX2Rpdi0+cHJvYmVfdGltZSwKLQkJCSBkZWx0YV9kaXYtPnByb2JlX3RpbWUsIG1heF9kaXYtPnByb2JlX3RpbWUpOwotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWRlYnVnZnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWRlYnVnZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZlZjRiMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1kZWJ1Z2ZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotc3NpemVfdCBpd2wzOTQ1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotc3NpemVfdCBpd2wzOTQ1X3Vjb2RlX3R4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpOwotc3NpemVfdCBpd2wzOTQ1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkgbG9mZl90ICpwcG9zKTsKLSNlbHNlCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSAgIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkgICBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Vjb2RlX3R4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSAgIGNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LAotCQkJCQkgICBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiAwOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1maC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtZmguaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2Yzk5MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1maC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgotICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKiBCU0QgTElDRU5TRQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX2l3bF8zOTQ1X2ZoX2hfXwotI2RlZmluZSBfX2l3bF8zOTQ1X2ZoX2hfXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogaXdsMzk0NSBGbG93IEhhbmRsZXIgRGVmaW5pdGlvbnMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qKgotICogVGhpcyBJL08gYXJlYSBpcyBkaXJlY3RseSByZWFkL3dyaXRhYmxlIGJ5IGRyaXZlciAoZS5nLiBMaW51eCB1c2VzIHdyaXRlbCgpKQotICogQWRkcmVzc2VzIGFyZSBvZmZzZXRzIGZyb20gZGV2aWNlJ3MgUENJIGhhcmR3YXJlIGJhc2UgYWRkcmVzcy4KLSAqLwotI2RlZmluZSBGSDM5X01FTV9MT1dFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgwODAwKQotI2RlZmluZSBGSDM5X01FTV9VUFBFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgxMDAwKQotCi0jZGVmaW5lIEZIMzlfQ0JDQ19UQUJMRQkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHgxNDApCi0jZGVmaW5lIEZIMzlfVEZEQl9UQUJMRQkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHgxODApCi0jZGVmaW5lIEZIMzlfUkNTUl9UQUJMRQkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHg0MDApCi0jZGVmaW5lIEZIMzlfUlNTUl9UQUJMRQkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHg0YzApCi0jZGVmaW5lIEZIMzlfVENTUl9UQUJMRQkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHg1MDApCi0jZGVmaW5lIEZIMzlfVFNTUl9UQUJMRQkJKEZIMzlfTUVNX0xPV0VSX0JPVU5EICsgMHg2ODApCi0KLS8qIFRGREIgKFRyYW5zbWl0IEZyYW1lIEJ1ZmZlciBEZXNjcmlwdG9yKSAqLwotI2RlZmluZSBGSDM5X1RGREIoX2NoLCBidWYpCQkJKEZIMzlfVEZEQl9UQUJMRSArIFwKLQkJCQkJCSAoKF9jaCkgKiAyICsgKGJ1ZikpICogMHgyOCkKLSNkZWZpbmUgRkgzOV9URkRCX0NITkxfQlVGX0NUUkxfUkVHKF9jaCkJKEZIMzlfVEZEQl9UQUJMRSArIDB4NTAgKiAoX2NoKSkKLQotLyogQ0JDQyBjaGFubmVsIGlzIFswLDJdICovCi0jZGVmaW5lIEZIMzlfQ0JDQyhfY2gpCQkoRkgzOV9DQkNDX1RBQkxFICsgKF9jaCkgKiAweDgpCi0jZGVmaW5lIEZIMzlfQ0JDQ19DVFJMKF9jaCkJKEZIMzlfQ0JDQyhfY2gpICsgMHgwMCkKLSNkZWZpbmUgRkgzOV9DQkNDX0JBU0UoX2NoKQkoRkgzOV9DQkNDKF9jaCkgKyAweDA0KQotCi0vKiBSQ1NSIGNoYW5uZWwgaXMgWzAsMl0gKi8KLSNkZWZpbmUgRkgzOV9SQ1NSKF9jaCkJCQkoRkgzOV9SQ1NSX1RBQkxFICsgKF9jaCkgKiAweDQwKQotI2RlZmluZSBGSDM5X1JDU1JfQ09ORklHKF9jaCkJCShGSDM5X1JDU1IoX2NoKSArIDB4MDApCi0jZGVmaW5lIEZIMzlfUkNTUl9SQkRfQkFTRShfY2gpCQkoRkgzOV9SQ1NSKF9jaCkgKyAweDA0KQotI2RlZmluZSBGSDM5X1JDU1JfV1BUUihfY2gpCQkoRkgzOV9SQ1NSKF9jaCkgKyAweDIwKQotI2RlZmluZSBGSDM5X1JDU1JfUlBUUl9BRERSKF9jaCkJKEZIMzlfUkNTUihfY2gpICsgMHgyNCkKLQotI2RlZmluZSBGSDM5X1JTQ1NSX0NITkwwX1dQVFIJCShGSDM5X1JDU1JfV1BUUigwKSkKLQotLyogUlNTUiAqLwotI2RlZmluZSBGSDM5X1JTU1JfQ1RSTAkJCShGSDM5X1JTU1JfVEFCTEUgKyAweDAwMCkKLSNkZWZpbmUgRkgzOV9SU1NSX1NUQVRVUwkJKEZIMzlfUlNTUl9UQUJMRSArIDB4MDA0KQotCi0vKiBUQ1NSICovCi0jZGVmaW5lIEZIMzlfVENTUihfY2gpCQkJKEZIMzlfVENTUl9UQUJMRSArIChfY2gpICogMHgyMCkKLSNkZWZpbmUgRkgzOV9UQ1NSX0NPTkZJRyhfY2gpCQkoRkgzOV9UQ1NSKF9jaCkgKyAweDAwKQotI2RlZmluZSBGSDM5X1RDU1JfQ1JFRElUKF9jaCkJCShGSDM5X1RDU1IoX2NoKSArIDB4MDQpCi0jZGVmaW5lIEZIMzlfVENTUl9CVUZGX1NUVFMoX2NoKQkoRkgzOV9UQ1NSKF9jaCkgKyAweDA4KQotCi0vKiBUU1NSICovCi0jZGVmaW5lIEZIMzlfVFNTUl9DQkJfQkFTRSAgICAgICAgKEZIMzlfVFNTUl9UQUJMRSArIDB4MDAwKQotI2RlZmluZSBGSDM5X1RTU1JfTVNHX0NPTkZJRyAgICAgIChGSDM5X1RTU1JfVEFCTEUgKyAweDAwOCkKLSNkZWZpbmUgRkgzOV9UU1NSX1RYX1NUQVRVUyAgICAgICAoRkgzOV9UU1NSX1RBQkxFICsgMHgwMTApCi0KLQotLyogREJNICovCi0KLSNkZWZpbmUgRkgzOV9TUlZDX0NITkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDYpCi0KLSNkZWZpbmUgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfUE9TX1JCRENfU0laRSAgICAgKDIwKQotI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19QT1NfSVJRX1JCVEggICAgICAoNCkKLQotI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19CSVRfV1JfU1RUU19FTiAgICAoMHgwODAwMDAwMCkKLQotI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5fRU5BQkxFICAgICAgICAoMHg4MDAwMDAwMCkKLQotI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkRSQkRfRU5fRU5BQkxFICAgICAgICAgICAoMHgyMDAwMDAwMCkKLQotI2RlZmluZSBGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjgJCSgweDAxMDAwMDAwKQotCi0jZGVmaW5lIEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9JUlFfREVTVF9JTlRfSE9TVAkJKDB4MDAwMDEwMDApCi0KLSNkZWZpbmUgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX0ZICQkJKDB4MDAwMDAwMDApCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX1RYRgkJKDB4MDAwMDAwMDApCi0jZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9EUklWRVIJCSgweDAwMDAwMDAxKQotCi0jZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0RJU0FCTEVfVkFMCSgweDAwMDAwMDAwKQotI2RlZmluZSBGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9FTkFCTEVfVkFMCSgweDAwMDAwMDA4KQotCi0jZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfSUZURkQJCSgweDAwMjAwMDAwKQotCi0jZGVmaW5lIEZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19OT0lOVAkJKDB4MDAwMDAwMDApCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX1BBVVNFCQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOQUJMRQkJKDB4ODAwMDAwMDApCi0KLSNkZWZpbmUgRkgzOV9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfVkFMX1RGREJfVkFMSUQJCSgweDAwMDA0MDAwKQotCi0jZGVmaW5lIEZIMzlfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX0JJVF9URkRCX1dQVFIJCSgweDAwMDAwMDAxKQotCi0jZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfU05PT1BfUkRfVFhQRF9PTgkoMHhGRjAwMDAwMCkKLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SRF9UWFBEX09OCSgweDAwRkYwMDAwKQotCi0jZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjhCCSgweDAwMDAwNDAwKQotCi0jZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfU05PT1BfUkRfVEZEX09OCQkoMHgwMDAwMDEwMCkKLSNkZWZpbmUgRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9PUkRFUl9SRF9DQkJfT04JCSgweDAwMDAwMDgwKQotCi0jZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfT1JERVJfUlNQX1dBSVRfVEgJKDB4MDAwMDAwMjApCi0jZGVmaW5lIEZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfUlNQX1dBSVRfVEgJCSgweDAwMDAwMDA1KQotCi0jZGVmaW5lIEZIMzlfVFNTUl9UWF9TVEFUVVNfUkVHX0JJVF9CVUZTX0VNUFRZKF9jaCkJKEJJVChfY2gpIDw8IDI0KQotI2RlZmluZSBGSDM5X1RTU1JfVFhfU1RBVFVTX1JFR19CSVRfTk9fUEVORF9SRVEoX2NoKQkoQklUKF9jaCkgPDwgMTYpCi0KLSNkZWZpbmUgRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfTVNLX0NITkxfSURMRShfY2gpIFwKLQkoRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfQklUX0JVRlNfRU1QVFkoX2NoKSB8IFwKLQkgRkgzOV9UU1NSX1RYX1NUQVRVU19SRUdfQklUX05PX1BFTkRfUkVRKF9jaCkpCi0KLSNkZWZpbmUgRkgzOV9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUJCQkoMHgwMTAwMDAwMCkKLQotc3RydWN0IGl3bDM5NDVfdGZkX3RiIHsKLQlfX2xlMzIgYWRkcjsKLQlfX2xlMzIgbGVuOwotfSBfX3BhY2tlZDsKLQotc3RydWN0IGl3bDM5NDVfdGZkIHsKLQlfX2xlMzIgY29udHJvbF9mbGFnczsKLQlzdHJ1Y3QgaXdsMzk0NV90ZmRfdGIgdGJzWzRdOwotCXU4IF9fcGFkWzI4XTsKLX0gX19wYWNrZWQ7Ci0KLQotI2VuZGlmIC8qIF9faXdsXzM5NDVfZmhfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1ody5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtaHcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzYTY4ZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1ody5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgotICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKiBCU0QgTElDRU5TRQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFBsZWFzZSB1c2UgdGhpcyBmaWxlIChpd2wtMzk0NS1ody5oKSBvbmx5IGZvciBoYXJkd2FyZS1yZWxhdGVkIGRlZmluaXRpb25zLgotICogUGxlYXNlIHVzZSBpd2wtY29tbWFuZHMuaCBmb3IgdUNvZGUgQVBJIGRlZmluaXRpb25zLgotICogUGxlYXNlIHVzZSBpd2wtMzk0NS5oIGZvciBkcml2ZXIgaW1wbGVtZW50YXRpb24gZGVmaW5pdGlvbnMuCi0gKi8KLQotI2lmbmRlZiBfX2l3bF8zOTQ1X2h3X18KLSNkZWZpbmUgX19pd2xfMzk0NV9od19fCi0KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0KLS8qIFJTU0kgdG8gZEJtICovCi0jZGVmaW5lIElXTDM5X1JTU0lfT0ZGU0VUCTk1Ci0KLS8qCi0gKiBFRVBST00gcmVsYXRlZCBjb25zdGFudHMsIGVudW1zLCBhbmQgc3RydWN0dXJlcy4KLSAqLwotI2RlZmluZSBFRVBST01fU0tVX0NBUF9PUF9NT0RFX01SQyAgICAgICAgICAgICAgICAgICAgICAoMSA8PCA3KQotCi0vKgotICogTWFwcGluZyBvZiBhIFR4IHBvd2VyIGxldmVsLCBhdCBmYWN0b3J5IGNhbGlicmF0aW9uIHRlbXBlcmF0dXJlLAotICogICB0byBhIHJhZGlvL0RTUCBnYWluIHRhYmxlIGluZGV4LgotICogT25lIGZvciBlYWNoIG9mIDUgInNhbXBsZSIgcG93ZXIgbGV2ZWxzIGluIGVhY2ggYmFuZC4KLSAqIHZfZGV0IGlzIG1lYXN1cmVkIGF0IHRoZSBmYWN0b3J5LCB1c2luZyB0aGUgMzk0NSdzIGJ1aWx0LWluIHBvd2VyIGFtcGxpZmllcgotICogICAoUEEpIG91dHB1dCB2b2x0YWdlIGRldGVjdG9yLiAgVGhpcyBzYW1lIGRldGVjdG9yIGlzIHVzZWQgZHVyaW5nIFR4IG9mCi0gKiAgIGxvbmcgcGFja2V0cyBpbiBub3JtYWwgb3BlcmF0aW9uIHRvIHByb3ZpZGUgZmVlZGJhY2sgYXMgdG8gcHJvcGVyIG91dHB1dAotICogICBsZXZlbC4KLSAqIERhdGEgY29waWVkIGZyb20gRUVQUk9NLgotICogRE8gTk9UIEFMVEVSIFRISVMgU1RSVUNUVVJFISEhCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX3NhbXBsZSB7Ci0JdTggZ2Fpbl9pbmRleDsJCS8qIGluZGV4IGludG8gcG93ZXIgKGdhaW4pIHNldHVwIHRhYmxlIC4uLiAqLwotCXM4IHBvd2VyOwkJLyogLi4uIGZvciB0aGlzIHB3ciBsZXZlbCBmb3IgdGhpcyBjaG5sIGdyb3VwICovCi0JdTE2IHZfZGV0OwkJLyogUEEgb3V0cHV0IHZvbHRhZ2UgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiBNYXBwaW5ncyBvZiBUeCBwb3dlciBsZXZlbHMgLT4gbm9taW5hbCByYWRpby9EU1AgZ2FpbiB0YWJsZSBpbmRleGVzLgotICogT25lIGZvciBlYWNoIGNoYW5uZWwgZ3JvdXAgKGEuay5hLiAiYmFuZCIpICgxIGZvciBCRywgNCBmb3IgQSkuCi0gKiBUeCBwb3dlciBzZXR1cCBjb2RlIGludGVycG9sYXRlcyBiZXR3ZWVuIHRoZSA1ICJzYW1wbGUiIHBvd2VyIGxldmVscwotICogICAgdG8gZGV0ZXJtaW5lIHRoZSBub21pbmFsIHNldHVwIGZvciBhIHJlcXVlc3RlZCBwb3dlciBsZXZlbC4KLSAqIERhdGEgY29waWVkIGZyb20gRUVQUk9NLgotICogRE8gTk9UIEFMVEVSIFRISVMgU1RSVUNUVVJFISEhCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwIHsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb21fdHhwb3dlcl9zYW1wbGUgc2FtcGxlc1s1XTsgIC8qIDUgcG93ZXIgbGV2ZWxzICovCi0JczMyIGEsIGIsIGMsIGQsIGU7CS8qIGNvZWZmaWNpZW50cyBmb3Igdm9sdGFnZS0+cG93ZXIKLQkJCQkgKiBmb3JtdWxhIChzaWduZWQpICovCi0JczMyIEZhLCBGYiwgRmMsIEZkLCBGZTsJLyogdGhlc2UgbW9kaWZ5IGNvZWZmcyBiYXNlZCBvbgotCQkJCSAqIGZyZXF1ZW5jeSAoc2lnbmVkKSAqLwotCXM4IHNhdHVyYXRpb25fcG93ZXI7CS8qIGhpZ2hlc3QgcG93ZXIgcG9zc2libGUgYnkgaC93IGluIHRoaXMKLQkJCQkgKiBiYW5kICovCi0JdTggZ3JvdXBfY2hhbm5lbDsJLyogInJlcHJlc2VudGF0aXZlIiBjaGFubmVsICMgaW4gdGhpcyBiYW5kICovCi0JczE2IHRlbXBlcmF0dXJlOwkvKiBoL3cgdGVtcGVyYXR1cmUgYXQgZmFjdG9yeSBjYWxpYiB0aGlzIGJhbmQKLQkJCQkgKiAoc2lnbmVkKSAqLwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIFRlbXBlcmF0dXJlLWJhc2VkIFR4LXBvd2VyIGNvbXBlbnNhdGlvbiBkYXRhLCBub3QgYmFuZC1zcGVjaWZpYy4KLSAqIFRoZXNlIGNvZWZmaWNpZW50cyBhcmUgdXNlIHRvIG1vZGlmeSBhL2IvYy9kL2UgY29lZmZzIGJhc2VkIG9uCi0gKiAgIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IHRlbXBlcmF0dXJlIGFuZCBmYWN0b3J5IGNhbGliIHRlbXBlcmF0dXJlLgotICogRGF0YSBjb3BpZWQgZnJvbSBFRVBST00uCi0gKi8KLXN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90ZW1wZXJhdHVyZV9jb3JyIHsKLQl1MzIgVGE7Ci0JdTMyIFRiOwotCXUzMiBUYzsKLQl1MzIgVGQ7Ci0JdTMyIFRlOwotfSBfX3BhY2tlZDsKLQotLyoKLSAqIEVFUFJPTSBtYXAKLSAqLwotc3RydWN0IGl3bDM5NDVfZWVwcm9tIHsKLQl1OCByZXNlcnZlZDBbMTZdOwotCXUxNiBkZXZpY2VfaWQ7CS8qIGFicy5vZnM6IDE2ICovCi0JdTggcmVzZXJ2ZWQxWzJdOwotCXUxNiBwbWM7CQkvKiBhYnMub2ZzOiAyMCAqLwotCXU4IHJlc2VydmVkMlsyMF07Ci0JdTggbWFjX2FkZHJlc3NbNl07CS8qIGFicy5vZnM6IDQyICovCi0JdTggcmVzZXJ2ZWQzWzU4XTsKLQl1MTYgYm9hcmRfcmV2aXNpb247CS8qIGFicy5vZnM6IDEwNiAqLwotCXU4IHJlc2VydmVkNFsxMV07Ci0JdTggYm9hcmRfcGJhX251bWJlcls5XTsJLyogYWJzLm9mczogMTE5ICovCi0JdTggcmVzZXJ2ZWQ1WzhdOwotCXUxNiB2ZXJzaW9uOwkJLyogYWJzLm9mczogMTM2ICovCi0JdTggc2t1X2NhcDsJCS8qIGFicy5vZnM6IDEzOCAqLwotCXU4IGxlZHNfbW9kZTsJCS8qIGFicy5vZnM6IDEzOSAqLwotCXUxNiBvZW1fbW9kZTsKLQl1MTYgd293bGFuX21vZGU7CS8qIGFicy5vZnM6IDE0MiAqLwotCXUxNiBsZWRzX3RpbWVfaW50ZXJ2YWw7CS8qIGFicy5vZnM6IDE0NCAqLwotCXU4IGxlZHNfb2ZmX3RpbWU7CS8qIGFicy5vZnM6IDE0NiAqLwotCXU4IGxlZHNfb25fdGltZTsJLyogYWJzLm9mczogMTQ3ICovCi0JdTggYWxtZ29yX21fdmVyc2lvbjsJLyogYWJzLm9mczogMTQ4ICovCi0JdTggYW50ZW5uYV9zd2l0Y2hfdHlwZTsJLyogYWJzLm9mczogMTQ5ICovCi0JdTggcmVzZXJ2ZWQ2WzQyXTsKLQl1OCBza3VfaWRbNF07CQkvKiBhYnMub2ZzOiAxOTIgKi8KLQotLyoKLSAqIFBlci1jaGFubmVsIHJlZ3VsYXRvcnkgZGF0YS4KLSAqCi0gKiBFYWNoIGNoYW5uZWwgdGhhdCAqbWlnaHQqIGJlIHN1cHBvcnRlZCBieSAzOTQ1IGhhcyBhIGZpeGVkIGxvY2F0aW9uCi0gKiBpbiBFRVBST00gY29udGFpbmluZyBFRVBST01fQ0hBTk5FTF8qIHVzYWdlIGZsYWdzIChMU0IpIGFuZCBtYXggcmVndWxhdG9yeQotICogdHhwb3dlciAoTVNCKS4KLSAqCi0gKiBFbnRyaWVzIGltbWVkaWF0ZWx5IGJlbG93IGFyZSBmb3IgMjAgTUh6IGNoYW5uZWwgd2lkdGguCi0gKgotICogMi40IEdIeiBjaGFubmVscyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKLSAqLwotCXUxNiBiYW5kXzFfY291bnQ7CS8qIGFicy5vZnM6IDE5NiAqLwotCXN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgYmFuZF8xX2NoYW5uZWxzWzE0XTsgIC8qIGFicy5vZnM6IDE5OCAqLwotCi0vKgotICogNC45IEdIeiBjaGFubmVscyAxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5LCAxOTIsIDE5NiwKLSAqIDUuMCBHSHogY2hhbm5lbHMgNywgOCwgMTEsIDEyLCAxNgotICogKDQ5MTUtNTA4ME1IeikgKG5vbmUgb2YgdGhlc2UgaXMgZXZlciBzdXBwb3J0ZWQpCi0gKi8KLQl1MTYgYmFuZF8yX2NvdW50OwkvKiBhYnMub2ZzOiAyMjYgKi8KLQlzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsIGJhbmRfMl9jaGFubmVsc1sxM107ICAvKiBhYnMub2ZzOiAyMjggKi8KLQotLyoKLSAqIDUuMiBHSHogY2hhbm5lbHMgMzQsIDM2LCAzOCwgNDAsIDQyLCA0NCwgNDYsIDQ4LCA1MiwgNTYsIDYwLCA2NAotICogKDUxNzAtNTMyME1IeikKLSAqLwotCXUxNiBiYW5kXzNfY291bnQ7CS8qIGFicy5vZnM6IDI1NCAqLwotCXN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgYmFuZF8zX2NoYW5uZWxzWzEyXTsgIC8qIGFicy5vZnM6IDI1NiAqLwotCi0vKgotICogNS41IEdIeiBjaGFubmVscyAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAotICogKDU1MDAtNTcwME1IeikKLSAqLwotCXUxNiBiYW5kXzRfY291bnQ7CS8qIGFicy5vZnM6IDI4MCAqLwotCXN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgYmFuZF80X2NoYW5uZWxzWzExXTsgIC8qIGFicy5vZnM6IDI4MiAqLwotCi0vKgotICogNS43IEdIeiBjaGFubmVscyAxNDUsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0gKiAoNTcyNS01ODI1TUh6KQotICovCi0JdTE2IGJhbmRfNV9jb3VudDsJLyogYWJzLm9mczogMzA0ICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCBiYW5kXzVfY2hhbm5lbHNbNl07ICAvKiBhYnMub2ZzOiAzMDYgKi8KLQotCXU4IHJlc2VydmVkOVsxOTRdOwotCi0vKgotICogMzk0NSBUeHBvd2VyIGNhbGlicmF0aW9uIGRhdGEuCi0gKi8KLSNkZWZpbmUgSVdMX05VTV9UWF9DQUxJQl9HUk9VUFMgNQotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwIGdyb3Vwc1tJV0xfTlVNX1RYX0NBTElCX0dST1VQU107Ci0vKiBhYnMub2ZzOiA1MTIgKi8KLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb21fdGVtcGVyYXR1cmVfY29yciBjb3JyZWN0aW9uczsgIC8qIGFicy5vZnM6IDgzMiAqLwotCXU4IHJlc2VydmVkMTZbMTcyXTsJLyogZmlsbCBvdXQgdG8gZnVsbCAxMDI0IGJ5dGUgYmxvY2sgKi8KLX0gX19wYWNrZWQ7Ci0KLSNkZWZpbmUgSVdMMzk0NV9FRVBST01fSU1HX1NJWkUgMTAyNAotCi0vKiBFbmQgb2YgRUVQUk9NICovCi0KLSNkZWZpbmUgUENJX0NGR19SRVZfSURfQklUX0JBU0lDX1NLVSAgICAgICAgICAgICAgICAoMHg0MCkJLyogYml0IDYgICAgKi8KLSNkZWZpbmUgUENJX0NGR19SRVZfSURfQklUX1JUUCAgICAgICAgICAgICAgICAgICAgICAoMHg4MCkJLyogYml0IDcgICAgKi8KLQotLyogNCBEQVRBICsgMSBDTUQuIFRoZXJlIGFyZSAyIEhDQ0EgcXVldWVzIHRoYXQgYXJlIG5vdCB1c2VkLiAqLwotI2RlZmluZSBJV0wzOV9OVU1fUVVFVUVTICAgICAgICA1Ci0jZGVmaW5lIElXTDM5X0NNRF9RVUVVRV9OVU0JNAotCi0jZGVmaW5lIElXTF9ERUZBVUxUX1RYX1JFVFJZICAxNQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFJGRF9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNAotI2RlZmluZSBOVU1fVEZEX0NIVU5LUyAgICAgICAgICAgICAgICAgICAgICAgIDQKLQotI2RlZmluZSBSWF9RVUVVRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDI1NgotI2RlZmluZSBSWF9RVUVVRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDI1NQotI2RlZmluZSBSWF9RVUVVRV9TSVpFX0xPRyAgICAgICAgICAgICAgICAgICAgIDgKLQotI2RlZmluZSBVMzJfUEFEKG4pCQkoKDQtKG4pKSYweDMpCi0KLSNkZWZpbmUgVEZEX0NUTF9DT1VOVF9TRVQobikgICAgICAgKG4gPDwgMjQpCi0jZGVmaW5lIFRGRF9DVExfQ09VTlRfR0VUKGN0bCkgICAgICgoY3RsID4+IDI0KSAmIDcpCi0jZGVmaW5lIFRGRF9DVExfUEFEX1NFVChuKSAgICAgICAgIChuIDw8IDI4KQotI2RlZmluZSBURkRfQ1RMX1BBRF9HRVQoY3RsKSAgICAgICAoY3RsID4+IDI4KQotCi0vKiBTaXplcyBhbmQgYWRkcmVzc2VzIGZvciBpbnN0cnVjdGlvbiBhbmQgZGF0YSBtZW1vcnkgKFNSQU0pIGluCi0gKiAzOTQ1J3MgZW1iZWRkZWQgcHJvY2Vzc29yLiAgRHJpdmVyIGFjY2VzcyBpcyB2aWEgSEJVU19UQVJHX01FTV8qIHJlZ3MuICovCi0jZGVmaW5lIElXTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5ECQkoMHgwMDAwMDApCi0jZGVmaW5lIElXTDM5X1JUQ19JTlNUX1VQUEVSX0JPVU5ECQkoMHgwMTQwMDApCi0KLSNkZWZpbmUgSVdMMzlfUlRDX0RBVEFfTE9XRVJfQk9VTkQJCSgweDgwMDAwMCkKLSNkZWZpbmUgSVdMMzlfUlRDX0RBVEFfVVBQRVJfQk9VTkQJCSgweDgwODAwMCkKLQotI2RlZmluZSBJV0wzOV9SVENfSU5TVF9TSVpFIChJV0wzOV9SVENfSU5TVF9VUFBFUl9CT1VORCAtIFwKLQkJCQlJV0wzOV9SVENfSU5TVF9MT1dFUl9CT1VORCkKLSNkZWZpbmUgSVdMMzlfUlRDX0RBVEFfU0laRSAoSVdMMzlfUlRDX0RBVEFfVVBQRVJfQk9VTkQgLSBcCi0JCQkJSVdMMzlfUlRDX0RBVEFfTE9XRVJfQk9VTkQpCi0KLSNkZWZpbmUgSVdMMzlfTUFYX0lOU1RfU0laRSBJV0wzOV9SVENfSU5TVF9TSVpFCi0jZGVmaW5lIElXTDM5X01BWF9EQVRBX1NJWkUgSVdMMzlfUlRDX0RBVEFfU0laRQotCi0vKiBTaXplIG9mIHVDb2RlIGluc3RydWN0aW9uIG1lbW9yeSBpbiBib290c3RyYXAgc3RhdGUgbWFjaGluZSAqLwotI2RlZmluZSBJV0wzOV9NQVhfQlNNX1NJWkUgSVdMMzlfUlRDX0lOU1RfU0laRQotCi1zdGF0aWMgaW5saW5lIGludCBpd2wzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIodTMyIGFkZHIpCi17Ci0JcmV0dXJuIChhZGRyID49IElXTDM5X1JUQ19EQVRBX0xPV0VSX0JPVU5EKSAmJgotCSAgICAgICAoYWRkciA8IElXTDM5X1JUQ19EQVRBX1VQUEVSX0JPVU5EKTsKLX0KLQotLyogQmFzZSBwaHlzaWNhbCBhZGRyZXNzIG9mIGl3bDM5NDVfc2hhcmVkIGlzIHByb3ZpZGVkIHRvIEZIX1RTU1JfQ0JCX0JBU0UKLSAqIGFuZCAmaXdsMzk0NV9zaGFyZWQucnhfcmVhZF9wdHJbMF0gaXMgcHJvdmlkZWQgdG8gRkhfUkNTUl9SUFRSX0FERFIoMCkgKi8KLXN0cnVjdCBpd2wzOTQ1X3NoYXJlZCB7Ci0JX19sZTMyIHR4X2Jhc2VfcHRyWzhdOwotfSBfX3BhY2tlZDsKLQotc3RhdGljIGlubGluZSB1OCBpd2wzOTQ1X2h3X2dldF9yYXRlKF9fbGUxNiByYXRlX25fZmxhZ3MpCi17Ci0JcmV0dXJuIGxlMTZfdG9fY3B1KHJhdGVfbl9mbGFncykgJiAweEZGOwotfQotCi1zdGF0aWMgaW5saW5lIHUxNiBpd2wzOTQ1X2h3X2dldF9yYXRlX25fZmxhZ3MoX19sZTE2IHJhdGVfbl9mbGFncykKLXsKLQlyZXR1cm4gbGUxNl90b19jcHUocmF0ZV9uX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSBfX2xlMTYgaXdsMzk0NV9od19zZXRfcmF0ZV9uX2ZsYWdzKHU4IHJhdGUsIHUxNiBmbGFncykKLXsKLQlyZXR1cm4gY3B1X3RvX2xlMTYoKHUxNilyYXRlfGZsYWdzKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1sZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E3ZjBmMy4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1sZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLQotI2luY2x1ZGUgIml3bC1jb21tYW5kcy5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUtbGVkLmgiCi0KLQotLyogU2VuZCBsZWQgY29tbWFuZCAqLwotc3RhdGljIGludCBpd2wzOTQ1X3NlbmRfbGVkX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9sZWRfY21kICpsZWRfY21kKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9MRURTX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX2xlZF9jbWQpLAotCQkuZGF0YSA9IGxlZF9jbWQsCi0JCS5mbGFncyA9IENNRF9BU1lOQywKLQkJLmNhbGxiYWNrID0gTlVMTCwKLQl9OwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWQocHJpdiwgJmNtZCk7Ci19Ci0KLWNvbnN0IHN0cnVjdCBpd2xfbGVkX29wcyBpd2wzOTQ1X2xlZF9vcHMgPSB7Ci0JLmNtZCA9IGl3bDM5NDVfc2VuZF9sZWRfY21kLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LWxlZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtbGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2NzE2MjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtbGVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF8zOTQ1X2xlZF9oX18KLSNkZWZpbmUgX19pd2xfMzk0NV9sZWRfaF9fCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2xlZF9vcHMgaXdsMzk0NV9sZWRfb3BzOwotCi0jZW5kaWYgLyogX19pd2xfMzk0NV9sZWRfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1ycy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUtcnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZhZWFmMi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS1ycy5jCisrKyAvZGV2L251bGwKQEAgLTEsOTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0KLSNkZWZpbmUgUlNfTkFNRSAiaXdsLTM5NDUtcnMiCi0KLXN0YXRpYyBzMzIgaXdsMzk0NV9leHBlY3RlZF90cHRfZ1tJV0xfUkFURV9DT1VOVF8zOTQ1XSA9IHsKLQk3LCAxMywgMzUsIDU4LCAwLCAwLCA3NiwgMTA0LCAxMzAsIDE2OCwgMTkxLCAyMDIKLX07Ci0KLXN0YXRpYyBzMzIgaXdsMzk0NV9leHBlY3RlZF90cHRfZ19wcm90W0lXTF9SQVRFX0NPVU5UXzM5NDVdID0gewotCTcsIDEzLCAzNSwgNTgsIDAsIDAsIDAsIDgwLCA5MywgMTEzLCAxMjMsIDEyNQotfTsKLQotc3RhdGljIHMzMiBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9hW0lXTF9SQVRFX0NPVU5UXzM5NDVdID0gewotCTAsIDAsIDAsIDAsIDQwLCA1NywgNzIsIDk4LCAxMjEsIDE1NCwgMTc3LCAxODYKLX07Ci0KLXN0YXRpYyBzMzIgaXdsMzk0NV9leHBlY3RlZF90cHRfYltJV0xfUkFURV9DT1VOVF8zOTQ1XSA9IHsKLQk3LCAxMywgMzUsIDU4LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCi19OwotCi1zdHJ1Y3QgaXdsMzk0NV90cHRfZW50cnkgewotCXM4IG1pbl9yc3NpOwotCXU4IGluZGV4OwotfTsKLQotc3RhdGljIHN0cnVjdCBpd2wzOTQ1X3RwdF9lbnRyeSBpd2wzOTQ1X3RwdF90YWJsZV9hW10gPSB7Ci0Jey02MCwgSVdMX1JBVEVfNTRNX0lOREVYfSwKLQl7LTY0LCBJV0xfUkFURV80OE1fSU5ERVh9LAotCXstNzIsIElXTF9SQVRFXzM2TV9JTkRFWH0sCi0Jey04MCwgSVdMX1JBVEVfMjRNX0lOREVYfSwKLQl7LTg0LCBJV0xfUkFURV8xOE1fSU5ERVh9LAotCXstODUsIElXTF9SQVRFXzEyTV9JTkRFWH0sCi0Jey04NywgSVdMX1JBVEVfOU1fSU5ERVh9LAotCXstODksIElXTF9SQVRFXzZNX0lOREVYfQotfTsKLQotc3RhdGljIHN0cnVjdCBpd2wzOTQ1X3RwdF9lbnRyeSBpd2wzOTQ1X3RwdF90YWJsZV9nW10gPSB7Ci0Jey02MCwgSVdMX1JBVEVfNTRNX0lOREVYfSwKLQl7LTY0LCBJV0xfUkFURV80OE1fSU5ERVh9LAotCXstNjgsIElXTF9SQVRFXzM2TV9JTkRFWH0sCi0Jey04MCwgSVdMX1JBVEVfMjRNX0lOREVYfSwKLQl7LTg0LCBJV0xfUkFURV8xOE1fSU5ERVh9LAotCXstODUsIElXTF9SQVRFXzEyTV9JTkRFWH0sCi0Jey04NiwgSVdMX1JBVEVfMTFNX0lOREVYfSwKLQl7LTg4LCBJV0xfUkFURV81TV9JTkRFWH0sCi0Jey05MCwgSVdMX1JBVEVfMk1fSU5ERVh9LAotCXstOTIsIElXTF9SQVRFXzFNX0lOREVYfQotfTsKLQotI2RlZmluZSBJV0xfUkFURV9NQVhfV0lORE9XICAgICAgICAgIDYyCi0jZGVmaW5lIElXTF9SQVRFX0ZMVVNICQkoMypIWikKLSNkZWZpbmUgSVdMX1JBVEVfV0lOX0ZMVVNIICAgICAgIChIWi8yKQotI2RlZmluZSBJV0wzOV9SQVRFX0hJR0hfVEggICAgICAgICAgMTE1MjAKLSNkZWZpbmUgSVdMX1NVQ0NFU1NfVVBfVEgJICAgODk2MAotI2RlZmluZSBJV0xfU1VDQ0VTU19ET1dOX1RICSAgMTA4ODAKLSNkZWZpbmUgSVdMX1JBVEVfTUlOX0ZBSUxVUkVfVEggICAgICAgNgotI2RlZmluZSBJV0xfUkFURV9NSU5fU1VDQ0VTU19USCAgICAgICA4Ci0jZGVmaW5lIElXTF9SQVRFX0RFQ1JFQVNFX1RIICAgICAgIDE5MjAKLSNkZWZpbmUgSVdMX1JBVEVfUkVUUllfVEgJICAgICAxNQotCi1zdGF0aWMgdTggaXdsMzk0NV9nZXRfcmF0ZV9pbmRleF9ieV9yc3NpKHMzMiByc3NpLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCi17Ci0JdTMyIGluZGV4ID0gMDsKLQl1MzIgdGFibGVfc2l6ZSA9IDA7Ci0Jc3RydWN0IGl3bDM5NDVfdHB0X2VudHJ5ICp0cHRfdGFibGUgPSBOVUxMOwotCi0JaWYgKChyc3NpIDwgSVdMX01JTl9SU1NJX1ZBTCkgfHwgKHJzc2kgPiBJV0xfTUFYX1JTU0lfVkFMKSkKLQkJcnNzaSA9IElXTF9NSU5fUlNTSV9WQUw7Ci0KLQlzd2l0Y2ggKGJhbmQpIHsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6Ci0JCXRwdF90YWJsZSA9IGl3bDM5NDVfdHB0X3RhYmxlX2c7Ci0JCXRhYmxlX3NpemUgPSBBUlJBWV9TSVpFKGl3bDM5NDVfdHB0X3RhYmxlX2cpOwotCQlicmVhazsKLQotCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKLQkJdHB0X3RhYmxlID0gaXdsMzk0NV90cHRfdGFibGVfYTsKLQkJdGFibGVfc2l6ZSA9IEFSUkFZX1NJWkUoaXdsMzk0NV90cHRfdGFibGVfYSk7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JCWJyZWFrOwotCX0KLQotCXdoaWxlICgoaW5kZXggPCB0YWJsZV9zaXplKSAmJiAocnNzaSA8IHRwdF90YWJsZVtpbmRleF0ubWluX3Jzc2kpKQotCQlpbmRleCsrOwotCi0JaW5kZXggPSBtaW4oaW5kZXgsICh0YWJsZV9zaXplIC0gMSkpOwotCi0JcmV0dXJuIHRwdF90YWJsZVtpbmRleF0uaW5kZXg7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfY2xlYXJfd2luZG93KHN0cnVjdCBpd2wzOTQ1X3JhdGVfc2NhbGVfZGF0YSAqd2luZG93KQotewotCXdpbmRvdy0+ZGF0YSA9IDA7Ci0Jd2luZG93LT5zdWNjZXNzX2NvdW50ZXIgPSAwOwotCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA9IC0xOwotCXdpbmRvdy0+Y291bnRlciA9IDA7Ci0Jd2luZG93LT5hdmVyYWdlX3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCXdpbmRvdy0+c3RhbXAgPSAwOwotfQotCi0vKioKLSAqIGl3bDM5NDVfcmF0ZV9zY2FsZV9mbHVzaF93aW5kb3dzIC0gZmx1c2ggb3V0IHRoZSByYXRlIHNjYWxlIHdpbmRvd3MKLSAqCi0gKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygd2luZG93cyB0aGF0IGhhdmUgZ2F0aGVyZWQgZGF0YSBidXQgd2VyZQotICogbm90IGZsdXNoZWQuICBJZiB0aGVyZSB3ZXJlIGFueSB0aGF0IHdlcmUgbm90IGZsdXNoZWQsIHRoZW4KLSAqIHJlc2NoZWR1bGUgdGhlIHJhdGUgZmx1c2hpbmcgcm91dGluZS4KLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3JhdGVfc2NhbGVfZmx1c2hfd2luZG93cyhzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YSkKLXsKLQlpbnQgdW5mbHVzaGVkID0gMDsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiBfX21heWJlX3VudXNlZCA9IHJzX3N0YS0+cHJpdjsKLQotCS8qCi0JICogRm9yIGVhY2ggcmF0ZSwgaWYgd2UgaGF2ZSBjb2xsZWN0ZWQgZGF0YSBvbiB0aGF0IHJhdGUKLQkgKiBhbmQgaXQgaGFzIGJlZW4gbW9yZSB0aGFuIElXTF9SQVRFX1dJTl9GTFVTSAotCSAqIHNpbmNlIHdlIGZsdXNoZWQsIGNsZWFyIG91dCB0aGUgZ2F0aGVyZWQgc3RhdGlzdGljcwotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBJV0xfUkFURV9DT1VOVF8zOTQ1OyBpKyspIHsKLQkJaWYgKCFyc19zdGEtPndpbltpXS5jb3VudGVyKQotCQkJY29udGludWU7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCByc19zdGEtPndpbltpXS5zdGFtcCArCi0JCQkgICAgICAgSVdMX1JBVEVfV0lOX0ZMVVNIKSkgewotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgImZsdXNoaW5nICVkIHNhbXBsZXMgb2YgcmF0ZSAiCi0JCQkJICAgICAgICJpbmRleCAlZFxuIiwKLQkJCQkgICAgICAgcnNfc3RhLT53aW5baV0uY291bnRlciwgaSk7Ci0JCQlpd2wzOTQ1X2NsZWFyX3dpbmRvdygmcnNfc3RhLT53aW5baV0pOwotCQl9IGVsc2UKLQkJCXVuZmx1c2hlZCsrOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQl9Ci0KLQlyZXR1cm4gdW5mbHVzaGVkOwotfQotCi0jZGVmaW5lIElXTF9SQVRFX0ZMVVNIX01BWCAgICAgICAgICAgICAgNTAwMAkvKiBtc2VjICovCi0jZGVmaW5lIElXTF9SQVRFX0ZMVVNIX01JTiAgICAgICAgICAgICAgNTAJLyogbXNlYyAqLwotI2RlZmluZSBJV0xfQVZFUkFHRV9QQUNLRVRTICAgICAgICAgICAgIDE1MDAKLQotc3RhdGljIHZvaWQgaXdsMzk0NV9iZ19yYXRlX3NjYWxlX2ZsdXNoKHVuc2lnbmVkIGxvbmcgZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YSA9ICh2b2lkICopZGF0YTsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgX19tYXliZV91bnVzZWQgPSByc19zdGEtPnByaXY7Ci0JaW50IHVuZmx1c2hlZCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgcGFja2V0X2NvdW50LCBkdXJhdGlvbiwgcHBzOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImVudGVyXG4iKTsKLQotCXVuZmx1c2hlZCA9IGl3bDM5NDVfcmF0ZV9zY2FsZV9mbHVzaF93aW5kb3dzKHJzX3N0YSk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBOdW1iZXIgb2YgcGFja2V0cyBSeCdkIHNpbmNlIGxhc3QgdGltZSB0aGlzIHRpbWVyIHJhbiAqLwotCXBhY2tldF9jb3VudCA9IChyc19zdGEtPnR4X3BhY2tldHMgLSByc19zdGEtPmxhc3RfdHhfcGFja2V0cykgKyAxOwotCi0JcnNfc3RhLT5sYXN0X3R4X3BhY2tldHMgPSByc19zdGEtPnR4X3BhY2tldHMgKyAxOwotCi0JaWYgKHVuZmx1c2hlZCkgewotCQlkdXJhdGlvbiA9Ci0JCSAgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSByc19zdGEtPmxhc3RfcGFydGlhbF9mbHVzaCk7Ci0KLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlR4J2QgJWQgcGFja2V0cyBpbiAlZG1zXG4iLAotCQkJICAgICAgIHBhY2tldF9jb3VudCwgZHVyYXRpb24pOwotCi0JCS8qIERldGVybWluZSBwYWNrZXRzIHBlciBzZWNvbmQgKi8KLQkJaWYgKGR1cmF0aW9uKQotCQkJcHBzID0gKHBhY2tldF9jb3VudCAqIDEwMDApIC8gZHVyYXRpb247Ci0JCWVsc2UKLQkJCXBwcyA9IDA7Ci0KLQkJaWYgKHBwcykgewotCQkJZHVyYXRpb24gPSAoSVdMX0FWRVJBR0VfUEFDS0VUUyAqIDEwMDApIC8gcHBzOwotCQkJaWYgKGR1cmF0aW9uIDwgSVdMX1JBVEVfRkxVU0hfTUlOKQotCQkJCWR1cmF0aW9uID0gSVdMX1JBVEVfRkxVU0hfTUlOOwotCQkJZWxzZSBpZiAoZHVyYXRpb24gPiBJV0xfUkFURV9GTFVTSF9NQVgpCi0JCQkJZHVyYXRpb24gPSBJV0xfUkFURV9GTFVTSF9NQVg7Ci0JCX0gZWxzZQotCQkJZHVyYXRpb24gPSBJV0xfUkFURV9GTFVTSF9NQVg7Ci0KLQkJcnNfc3RhLT5mbHVzaF90aW1lID0gbXNlY3NfdG9famlmZmllcyhkdXJhdGlvbik7Ci0KLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIm5ldyBmbHVzaCBwZXJpb2Q6ICVkIG1zZWMgYXZlICVkXG4iLAotCQkJICAgICAgIGR1cmF0aW9uLCBwYWNrZXRfY291bnQpOwotCi0JCW1vZF90aW1lcigmcnNfc3RhLT5yYXRlX3NjYWxlX2ZsdXNoLCBqaWZmaWVzICsKLQkJCSAgcnNfc3RhLT5mbHVzaF90aW1lKTsKLQotCQlyc19zdGEtPmxhc3RfcGFydGlhbF9mbHVzaCA9IGppZmZpZXM7Ci0JfSBlbHNlIHsKLQkJcnNfc3RhLT5mbHVzaF90aW1lID0gSVdMX1JBVEVfRkxVU0g7Ci0JCXJzX3N0YS0+Zmx1c2hfcGVuZGluZyA9IDA7Ci0JfQotCS8qIElmIHRoZXJlIHdlcmVuJ3QgYW55IHVuZmx1c2hlZCBlbnRyaWVzLCB3ZSBkb24ndCBzY2hlZHVsZSB0aGUgdGltZXIKLQkgKiB0byBydW4gYWdhaW4gKi8KLQotCXJzX3N0YS0+bGFzdF9mbHVzaCA9IGppZmZpZXM7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9jb2xsZWN0X3R4X2RhdGEgLSBVcGRhdGUgdGhlIHN1Y2Nlc3MvZmFpbHVyZSBzbGlkaW5nIHdpbmRvdwotICoKLSAqIFdlIGtlZXAgYSBzbGlkaW5nIHdpbmRvdyBvZiB0aGUgbGFzdCA2NCBwYWNrZXRzIHRyYW5zbWl0dGVkCi0gKiBhdCB0aGlzIHJhdGUuICB3aW5kb3ctPmRhdGEgY29udGFpbnMgdGhlIGJpdG1hc2sgb2Ygc3VjY2Vzc2Z1bAotICogcGFja2V0cy4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9jb2xsZWN0X3R4X2RhdGEoc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGEsCi0JCQkJc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3csCi0JCQkJaW50IHN1Y2Nlc3MsIGludCByZXRyaWVzLCBpbnQgaW5kZXgpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzMzIgZmFpbF9jb3VudDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgX19tYXliZV91bnVzZWQgPSByc19zdGEtPnByaXY7Ci0KLQlpZiAoIXJldHJpZXMpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgImxlYXZlOiByZXRyaWVzID09IDAgLS0gc2hvdWxkIGJlIGF0IGxlYXN0IDFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBLZWVwIHRyYWNrIG9mIG9ubHkgdGhlIGxhdGVzdCA2MiB0eCBmcmFtZSBhdHRlbXB0cyBpbiB0aGlzIHJhdGUncwotCSAqIGhpc3Rvcnkgd2luZG93OyBhbnl0aGluZyBvbGRlciBpc24ndCByZWFsbHkgcmVsZXZhbnQgYW55IG1vcmUuCi0JICogSWYgd2UgaGF2ZSBmaWxsZWQgdXAgdGhlIHNsaWRpbmcgd2luZG93LCBkcm9wIHRoZSBvbGRlc3QgYXR0ZW1wdDsKLQkgKiBpZiB0aGUgb2xkZXN0IGF0dGVtcHQgKGhpZ2hlc3QgYml0IGluIGJpdG1hcCkgc2hvd3MgInN1Y2Nlc3MiLAotCSAqIHN1YnRyYWN0ICIxIiBmcm9tIHRoZSBzdWNjZXNzIGNvdW50ZXIgKHRoaXMgaXMgdGhlIG1haW4gcmVhc29uCi0JICogd2Uga2VlcCB0aGVzZSBiaXRtYXBzISkuCi0JICogKi8KLQl3aGlsZSAocmV0cmllcyA+IDApIHsKLQkJaWYgKHdpbmRvdy0+Y291bnRlciA+PSBJV0xfUkFURV9NQVhfV0lORE9XKSB7Ci0KLQkJCS8qIHJlbW92ZSBlYXJsaWVzdCAqLwotCQkJd2luZG93LT5jb3VudGVyID0gSVdMX1JBVEVfTUFYX1dJTkRPVyAtIDE7Ci0KLQkJCWlmICh3aW5kb3ctPmRhdGEgJiAoMVVMTCA8PCAoSVdMX1JBVEVfTUFYX1dJTkRPVyAtIDEpKSkgewotCQkJCXdpbmRvdy0+ZGF0YSAmPSB+KDFVTEwgPDwgKElXTF9SQVRFX01BWF9XSU5ET1cgLSAxKSk7Ci0JCQkJd2luZG93LT5zdWNjZXNzX2NvdW50ZXItLTsKLQkJCX0KLQkJfQotCi0JCS8qIEluY3JlbWVudCBmcmFtZXMtYXR0ZW1wdGVkIGNvdW50ZXIgKi8KLQkJd2luZG93LT5jb3VudGVyKys7Ci0KLQkJLyogU2hpZnQgYml0bWFwIGJ5IG9uZSBmcmFtZSAodGhyb3cgYXdheSBvbGRlc3QgaGlzdG9yeSksCi0JCSAqIE9SIGluICIxIiwgYW5kIGluY3JlbWVudCAic3VjY2VzcyIgaWYgdGhpcwotCQkgKiBmcmFtZSB3YXMgc3VjY2Vzc2Z1bC4gKi8KLQkJd2luZG93LT5kYXRhIDw8PSAxOwotCQlpZiAoc3VjY2VzcyA+IDApIHsKLQkJCXdpbmRvdy0+c3VjY2Vzc19jb3VudGVyKys7Ci0JCQl3aW5kb3ctPmRhdGEgfD0gMHgxOwotCQkJc3VjY2Vzcy0tOwotCQl9Ci0KLQkJcmV0cmllcy0tOwotCX0KLQotCS8qIENhbGN1bGF0ZSBjdXJyZW50IHN1Y2Nlc3MgcmF0aW8sIGF2b2lkIGRpdmlkZS1ieS0wISAqLwotCWlmICh3aW5kb3ctPmNvdW50ZXIgPiAwKQotCQl3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPSAxMjggKiAoMTAwICogd2luZG93LT5zdWNjZXNzX2NvdW50ZXIpCi0JCQkJCS8gd2luZG93LT5jb3VudGVyOwotCWVsc2UKLQkJd2luZG93LT5zdWNjZXNzX3JhdGlvID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0KLQlmYWlsX2NvdW50ID0gd2luZG93LT5jb3VudGVyIC0gd2luZG93LT5zdWNjZXNzX2NvdW50ZXI7Ci0KLQkvKiBDYWxjdWxhdGUgYXZlcmFnZSB0aHJvdWdocHV0LCBpZiB3ZSBoYXZlIGVub3VnaCBoaXN0b3J5LiAqLwotCWlmICgoZmFpbF9jb3VudCA+PSBJV0xfUkFURV9NSU5fRkFJTFVSRV9USCkgfHwKLQkgICAgKHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyID49IElXTF9SQVRFX01JTl9TVUNDRVNTX1RIKSkKLQkJd2luZG93LT5hdmVyYWdlX3RwdCA9ICgod2luZG93LT5zdWNjZXNzX3JhdGlvICoKLQkJCQlyc19zdGEtPmV4cGVjdGVkX3RwdFtpbmRleF0gKyA2NCkgLyAxMjgpOwotCWVsc2UKLQkJd2luZG93LT5hdmVyYWdlX3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCi0JLyogVGFnIHRoaXMgd2luZG93IGFzIGhhdmluZyBiZWVuIHVwZGF0ZWQgKi8KLQl3aW5kb3ctPnN0YW1wID0gamlmZmllczsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJzX3N0YS0+bG9jaywgZmxhZ3MpOwotCi19Ci0KLS8qCi0gKiBDYWxsZWQgYWZ0ZXIgYWRkaW5nIGEgbmV3IHN0YXRpb24gdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcKLSAqLwotdm9pZCBpd2wzOTQ1X3JzX3JhdGVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHN0YV9pZCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OwotCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZwcml2LT5ody0+Y29uZjsKLQlzdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdiAqcHN0YTsKLQlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKLQlpbnQgaTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJlbnRlclxuIik7Ci0JaWYgKHN0YV9pZCA9PSBwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5iY2FzdF9zdGFfaWQpCi0JCWdvdG8gb3V0OwotCi0JcHN0YSA9IChzdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdiAqKSBzdGEtPmRydl9wcml2OwotCXJzX3N0YSA9ICZwc3RhLT5yc19zdGE7Ci0Jc2JhbmQgPSBody0+d2lwaHktPmJhbmRzW2NvbmYtPmNoYW5uZWwtPmJhbmRdOwotCi0JcnNfc3RhLT5wcml2ID0gcHJpdjsKLQotCXJzX3N0YS0+c3RhcnRfcmF0ZSA9IElXTF9SQVRFX0lOVkFMSUQ7Ci0KLQkvKiBkZWZhdWx0IHRvIGp1c3QgODAyLjExYiAqLwotCXJzX3N0YS0+ZXhwZWN0ZWRfdHB0ID0gaXdsMzk0NV9leHBlY3RlZF90cHRfYjsKLQotCXJzX3N0YS0+bGFzdF9wYXJ0aWFsX2ZsdXNoID0gamlmZmllczsKLQlyc19zdGEtPmxhc3RfZmx1c2ggPSBqaWZmaWVzOwotCXJzX3N0YS0+Zmx1c2hfdGltZSA9IElXTF9SQVRFX0ZMVVNIOwotCXJzX3N0YS0+bGFzdF90eF9wYWNrZXRzID0gMDsKLQotCXJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaC5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcnNfc3RhOwotCXJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaC5mdW5jdGlvbiA9IGl3bDM5NDVfYmdfcmF0ZV9zY2FsZV9mbHVzaDsKLQotCWZvciAoaSA9IDA7IGkgPCBJV0xfUkFURV9DT1VOVF8zOTQ1OyBpKyspCi0JCWl3bDM5NDVfY2xlYXJfd2luZG93KCZyc19zdGEtPndpbltpXSk7Ci0KLQkvKiBUT0RPOiB3aGF0IGlzIGEgZ29vZCBzdGFydGluZyByYXRlIGZvciBTVEE/IEFib3V0IG1pZGRsZT8gTWF5YmUgbm90Ci0JICogdGhlIGxvd2VzdCBvciB0aGUgaGlnaGVzdCByYXRlLi4gQ291bGQgY29uc2lkZXIgdXNpbmcgUlNTSSBmcm9tCi0JICogcHJldmlvdXMgcGFja2V0cz8gTmVlZCB0byBoYXZlIElFRUUgODAyLjFYIGF1dGggc3VjY2VlZCBpbW1lZGlhdGVseQotCSAqIGFmdGVyIGFzc29jLi4gKi8KLQotCWZvciAoaSA9IHNiYW5kLT5uX2JpdHJhdGVzIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJaWYgKHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0gJiAoMSA8PCBpKSkgewotCQkJcnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcml2LT5fMzk0NS5zdGFfc3VwcF9yYXRlcyA9IHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF07Ci0JLyogRm9yIDUgR0h6IGJhbmQgaXQgc3RhcnQgYXQgSVdMX0ZJUlNUX09GRE1fUkFURSAqLwotCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7Ci0JCXJzX3N0YS0+bGFzdF90eHJhdGVfaWR4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JCXByaXYtPl8zOTQ1LnN0YV9zdXBwX3JhdGVzID0gcHJpdi0+XzM5NDUuc3RhX3N1cHBfcmF0ZXMgPDwKLQkJCQkJCUlXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JfQotCi1vdXQ6Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JV0xfU1RBX1VDT0RFX0lOUFJPR1JFU1M7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAibGVhdmVcbiIpOwotfQotCi1zdGF0aWMgdm9pZCAqaXdsMzk0NV9yc19hbGxvYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGRlbnRyeSAqZGVidWdmc2RpcikKLXsKLQlyZXR1cm4gaHctPnByaXY7Ci19Ci0KLS8qIHJhdGUgc2NhbGUgcmVxdWlyZXMgZnJlZSBmdW5jdGlvbiB0byBiZSBpbXBsZW1lbnRlZCAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yc19mcmVlKHZvaWQgKnByaXYpCi17Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCAqaXdsMzk0NV9yc19hbGxvY19zdGEodm9pZCAqaXdsX3ByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGdmcF90IGdmcCkKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKnJzX3N0YTsKLQlzdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdiAqcHN0YSA9ICh2b2lkICopIHN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2IF9fbWF5YmVfdW51c2VkID0gaXdsX3ByaXY7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiZW50ZXJcbiIpOwotCi0JcnNfc3RhID0gJnBzdGEtPnJzX3N0YTsKLQotCXNwaW5fbG9ja19pbml0KCZyc19zdGEtPmxvY2spOwotCWluaXRfdGltZXIoJnJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaCk7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIHJzX3N0YTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9yc19mcmVlX3N0YSh2b2lkICppd2xfcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCXZvaWQgKnByaXZfc3RhKQotewotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhID0gcHJpdl9zdGE7Ci0KLQkvKgotCSAqIEJlIGNhcmVmdWwgbm90IHRvIHVzZSBhbnkgbWVtYmVycyBvZiBpd2wzOTQ1X3JzX3N0YSAobGlrZSB0cnlpbmcKLQkgKiB0byB1c2UgaXdsX3ByaXYgdG8gcHJpbnQgb3V0IGRlYnVnZ2luZykgc2luY2UgaXQgbWF5IG5vdCBiZSBmdWxseQotCSAqIGluaXRpYWxpemVkIGF0IHRoaXMgcG9pbnQuCi0JICovCi0JZGVsX3RpbWVyX3N5bmMoJnJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaCk7Ci19Ci0KLQotLyoqCi0gKiBpd2wzOTQ1X3JzX3R4X3N0YXR1cyAtIFVwZGF0ZSByYXRlIGNvbnRyb2wgdmFsdWVzIGJhc2VkIG9uIFR4IHJlc3VsdHMKLSAqCi0gKiBOT1RFOiBVc2VzIGl3bF9wcml2LT5yZXRyeV9yYXRlIGZvciB0aGUgIyBvZiByZXRyaWVzIGF0dGVtcHRlZCBieQotICogdGhlIGhhcmR3YXJlIGZvciBlYWNoIHJhdGUuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnNfdHhfc3RhdHVzKHZvaWQgKnByaXZfcmF0ZSwgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCi0JCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCi0JCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzOCByZXRyaWVzID0gMCwgY3VycmVudF9jb3VudDsKLQlpbnQgc2NhbGVfcmF0ZV9pbmRleCwgZmlyc3RfaW5kZXgsIGxhc3RfaW5kZXg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSAoc3RydWN0IGl3bF9wcml2ICopcHJpdl9yYXRlOwotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhID0gcHJpdl9zdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImVudGVyXG4iKTsKLQotCXJldHJpZXMgPSBpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQ7Ci0JLyogU2FuaXR5IENoZWNrIGZvciByZXRyaWVzICovCi0JaWYgKHJldHJpZXMgPiBJV0xfUkFURV9SRVRSWV9USCkKLQkJcmV0cmllcyA9IElXTF9SQVRFX1JFVFJZX1RIOwotCi0JZmlyc3RfaW5kZXggPSBzYmFuZC0+Yml0cmF0ZXNbaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeF0uaHdfdmFsdWU7Ci0JaWYgKChmaXJzdF9pbmRleCA8IDApIHx8IChmaXJzdF9pbmRleCA+PSBJV0xfUkFURV9DT1VOVF8zOTQ1KSkgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmU6IFJhdGUgb3V0IG9mIGJvdW5kczogJWRcbiIsIGZpcnN0X2luZGV4KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghcHJpdl9zdGEpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgImxlYXZlOiBObyBTVEEgcHJpdiBkYXRhIHRvIHVwZGF0ZSFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KLQlpZiAoIXJzX3N0YS0+cHJpdikgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmU6IFNUQSBwcml2IGRhdGEgdW5pbml0aWFsaXplZCFcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0KLQlyc19zdGEtPnR4X3BhY2tldHMrKzsKLQotCXNjYWxlX3JhdGVfaW5kZXggPSBmaXJzdF9pbmRleDsKLQlsYXN0X2luZGV4ID0gZmlyc3RfaW5kZXg7Ci0KLQkvKgotCSAqIFVwZGF0ZSB0aGUgd2luZG93IGZvciBlYWNoIHJhdGUuICBXZSBkZXRlcm1pbmUgd2hpY2ggcmF0ZXMKLQkgKiB3ZXJlIFR4J2QgYmFzZWQgb24gdGhlIHRvdGFsIG51bWJlciBvZiByZXRyaWVzIHZzLiB0aGUgbnVtYmVyCi0JICogb2YgcmV0cmllcyBjb25maWd1cmVkIGZvciBlYWNoIHJhdGUgLS0gY3VycmVudGx5IHNldCB0byB0aGUKLQkgKiBwcml2IHZhbHVlICdyZXRyeV9yYXRlJyB2cy4gcmF0ZSBzcGVjaWZpYwotCSAqCi0JICogT24gZXhpdCBmcm9tIHRoaXMgd2hpbGUgbG9vcCBsYXN0X2luZGV4IGluZGljYXRlcyB0aGUgcmF0ZQotCSAqIGF0IHdoaWNoIHRoZSBmcmFtZSB3YXMgZmluYWxseSB0cmFuc21pdHRlZCAob3IgZmFpbGVkIGlmIG5vCi0JICogQUNLKQotCSAqLwotCXdoaWxlIChyZXRyaWVzID4gMSkgewotCQlpZiAoKHJldHJpZXMgLSAxKSA8IHByaXYtPnJldHJ5X3JhdGUpIHsKLQkJCWN1cnJlbnRfY291bnQgPSAocmV0cmllcyAtIDEpOwotCQkJbGFzdF9pbmRleCA9IHNjYWxlX3JhdGVfaW5kZXg7Ci0JCX0gZWxzZSB7Ci0JCQljdXJyZW50X2NvdW50ID0gcHJpdi0+cmV0cnlfcmF0ZTsKLQkJCWxhc3RfaW5kZXggPSBpd2wzOTQ1X3JzX25leHRfcmF0ZShwcml2LAotCQkJCQkJCSBzY2FsZV9yYXRlX2luZGV4KTsKLQkJfQotCi0JCS8qIFVwZGF0ZSB0aGlzIHJhdGUgYWNjb3VudGluZyBmb3IgYXMgbWFueSByZXRyaWVzCi0JCSAqIGFzIHdhcyB1c2VkIGZvciBpdCAocGVyIGN1cnJlbnRfY291bnQpICovCi0JCWl3bDM5NDVfY29sbGVjdF90eF9kYXRhKHJzX3N0YSwKLQkJCQkgICAgJnJzX3N0YS0+d2luW3NjYWxlX3JhdGVfaW5kZXhdLAotCQkJCSAgICAwLCBjdXJyZW50X2NvdW50LCBzY2FsZV9yYXRlX2luZGV4KTsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlVwZGF0ZSByYXRlICVkIGZvciAlZCByZXRyaWVzLlxuIiwKLQkJCSAgICAgICBzY2FsZV9yYXRlX2luZGV4LCBjdXJyZW50X2NvdW50KTsKLQotCQlyZXRyaWVzIC09IGN1cnJlbnRfY291bnQ7Ci0KLQkJc2NhbGVfcmF0ZV9pbmRleCA9IGxhc3RfaW5kZXg7Ci0JfQotCi0KLQkvKiBVcGRhdGUgdGhlIGxhc3QgaW5kZXggd2luZG93IHdpdGggc3VjY2Vzcy9mYWlsdXJlIGJhc2VkIG9uIEFDSyAqLwotCUlXTF9ERUJVR19SQVRFKHByaXYsICJVcGRhdGUgcmF0ZSAlZCB3aXRoICVzLlxuIiwKLQkJICAgICAgIGxhc3RfaW5kZXgsCi0JCSAgICAgICAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spID8KLQkJICAgICAgICJzdWNjZXNzIiA6ICJmYWlsdXJlIik7Ci0JaXdsMzk0NV9jb2xsZWN0X3R4X2RhdGEocnNfc3RhLAotCQkJICAgICZyc19zdGEtPndpbltsYXN0X2luZGV4XSwKLQkJCSAgICBpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSywgMSwgbGFzdF9pbmRleCk7Ci0KLQkvKiBXZSB1cGRhdGVkIHRoZSByYXRlIHNjYWxlIHdpbmRvdyAtLSBpZiBpdHMgYmVlbiBtb3JlIHRoYW4KLQkgKiBmbHVzaF90aW1lIHNpbmNlIHRoZSBsYXN0IHJ1biwgc2NoZWR1bGUgdGhlIGZsdXNoCi0JICogYWdhaW4gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAoIXJzX3N0YS0+Zmx1c2hfcGVuZGluZyAmJgotCSAgICB0aW1lX2FmdGVyKGppZmZpZXMsIHJzX3N0YS0+bGFzdF9mbHVzaCArCi0JCSAgICAgICByc19zdGEtPmZsdXNoX3RpbWUpKSB7Ci0KLQkJcnNfc3RhLT5sYXN0X3BhcnRpYWxfZmx1c2ggPSBqaWZmaWVzOwotCQlyc19zdGEtPmZsdXNoX3BlbmRpbmcgPSAxOwotCQltb2RfdGltZXIoJnJzX3N0YS0+cmF0ZV9zY2FsZV9mbHVzaCwKLQkJCSAgamlmZmllcyArIHJzX3N0YS0+Zmx1c2hfdGltZSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnNfc3RhLT5sb2NrLCBmbGFncyk7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmVcbiIpOwotfQotCi1zdGF0aWMgdTE2IGl3bDM5NDVfZ2V0X2FkamFjZW50X3JhdGUoc3RydWN0IGl3bDM5NDVfcnNfc3RhICpyc19zdGEsCi0JCQkJIHU4IGluZGV4LCB1MTYgcmF0ZV9tYXNrLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCi17Ci0JdTggaGlnaCA9IElXTF9SQVRFX0lOVkFMSUQ7Ci0JdTggbG93ID0gSVdMX1JBVEVfSU5WQUxJRDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgX19tYXliZV91bnVzZWQgPSByc19zdGEtPnByaXY7Ci0KLQkvKiA4MDIuMTFBIHdhbGtzIHRvIHRoZSBuZXh0IGxpdGVyYWwgYWRqYWNlbnQgcmF0ZSBpbgotCSAqIHRoZSByYXRlIHRhYmxlICovCi0JaWYgKHVubGlrZWx5KGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikpIHsKLQkJaW50IGk7Ci0JCXUzMiBtYXNrOwotCi0JCS8qIEZpbmQgdGhlIHByZXZpb3VzIHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCi0JCWkgPSBpbmRleCAtIDE7Ci0JCWZvciAobWFzayA9ICgxIDw8IGkpOyBpID49IDA7IGktLSwgbWFzayA+Pj0gMSkgewotCQkJaWYgKHJhdGVfbWFzayAmIG1hc2spIHsKLQkJCQlsb3cgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLyogRmluZCB0aGUgbmV4dCByYXRlIHRoYXQgaXMgaW4gdGhlIHJhdGUgbWFzayAqLwotCQlpID0gaW5kZXggKyAxOwotCQlmb3IgKG1hc2sgPSAoMSA8PCBpKTsgaSA8IElXTF9SQVRFX0NPVU5UXzM5NDU7Ci0JCSAgICAgaSsrLCBtYXNrIDw8PSAxKSB7Ci0JCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgewotCQkJCWhpZ2ggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChoaWdoIDw8IDgpIHwgbG93OwotCX0KLQotCWxvdyA9IGluZGV4OwotCXdoaWxlIChsb3cgIT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQlpZiAocnNfc3RhLT50Z2cpCi0JCQlsb3cgPSBpd2wzOTQ1X3JhdGVzW2xvd10ucHJldl9yc190Z2c7Ci0JCWVsc2UKLQkJCWxvdyA9IGl3bDM5NDVfcmF0ZXNbbG93XS5wcmV2X3JzOwotCQlpZiAobG93ID09IElXTF9SQVRFX0lOVkFMSUQpCi0JCQlicmVhazsKLQkJaWYgKHJhdGVfbWFzayAmICgxIDw8IGxvdykpCi0JCQlicmVhazsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNraXBwaW5nIG1hc2tlZCBsb3dlciByYXRlOiAlZFxuIiwgbG93KTsKLQl9Ci0KLQloaWdoID0gaW5kZXg7Ci0Jd2hpbGUgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQlpZiAocnNfc3RhLT50Z2cpCi0JCQloaWdoID0gaXdsMzk0NV9yYXRlc1toaWdoXS5uZXh0X3JzX3RnZzsKLQkJZWxzZQotCQkJaGlnaCA9IGl3bDM5NDVfcmF0ZXNbaGlnaF0ubmV4dF9yczsKLQkJaWYgKGhpZ2ggPT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJCWJyZWFrOwotCQlpZiAocmF0ZV9tYXNrICYgKDEgPDwgaGlnaCkpCi0JCQlicmVhazsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNraXBwaW5nIG1hc2tlZCBoaWdoZXIgcmF0ZTogJWRcbiIsIGhpZ2gpOwotCX0KLQotCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3JzX2dldF9yYXRlIC0gZmluZCB0aGUgcmF0ZSBmb3IgdGhlIHJlcXVlc3RlZCBwYWNrZXQKLSAqCi0gKiBSZXR1cm5zIHRoZSBpZWVlODAyMTFfcmF0ZSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIGJ5IHRoZSBkcml2ZXIuCi0gKgotICogVGhlIHJhdGUgY29udHJvbCBhbGdvcml0aG0gaGFzIG5vIGludGVybmFsIG1hcHBpbmcgYmV0d2VlbiBod19tb2RlJ3MKLSAqIHJhdGUgb3JkZXJpbmcgYW5kIHRoZSByYXRlIG9yZGVyaW5nIHVzZWQgYnkgdGhlIHJhdGUgY29udHJvbCBhbGdvcml0aG0uCi0gKgotICogVGhlIHJhdGUgY29udHJvbCBhbGdvcml0aG0gdXNlcyBhIHNpbmdsZSB0YWJsZSBvZiByYXRlcyB0aGF0IGdvZXMgYWNyb3NzCi0gKiB0aGUgZW50aXJlIEEvQi9HIHNwZWN0cnVtIHZzLiBiZWluZyBsaW1pdGVkIHRvIGp1c3Qgb25lIHBhcnRpY3VsYXIKLSAqIGh3X21vZGUuCi0gKgotICogQXMgc3VjaCwgd2UgY2FuJ3QgY29udmVydCB0aGUgaW5kZXggb2J0YWluZWQgYmVsb3cgaW50byB0aGUgaHdfbW9kZSdzCi0gKiByYXRlIHRhYmxlIGFuZCBtdXN0IHJlZmVyZW5jZSB0aGUgZHJpdmVyIGFsbG9jYXRlZCByYXRlIHRhYmxlCi0gKgotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3JzX2dldF9yYXRlKHZvaWQgKnByaXZfciwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCXZvaWQgKnByaXZfc3RhLAlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGVfY29udHJvbCAqdHhyYykKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCA9IHR4cmMtPnNiYW5kOwotCXN0cnVjdCBza19idWZmICpza2IgPSB0eHJjLT5za2I7Ci0JdTggbG93ID0gSVdMX1JBVEVfSU5WQUxJRDsKLQl1OCBoaWdoID0gSVdMX1JBVEVfSU5WQUxJRDsKLQl1MTYgaGlnaF9sb3c7Ci0JaW50IGluZGV4OwotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhID0gcHJpdl9zdGE7Ci0Jc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3cgPSBOVUxMOwotCWludCBjdXJyZW50X3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCWludCBsb3dfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JaW50IGhpZ2hfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JdTMyIGZhaWxfY291bnQ7Ci0Jczggc2NhbGVfYWN0aW9uID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUxNiByYXRlX21hc2s7Ci0JczggbWF4X3JhdGVfaWR4ID0gLTE7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2IF9fbWF5YmVfdW51c2VkID0gKHN0cnVjdCBpd2xfcHJpdiAqKXByaXZfcjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiZW50ZXJcbiIpOwotCi0JLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KLQlpZiAocnNfc3RhICYmICFyc19zdGEtPnByaXYpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlJhdGUgc2NhbGluZyBpbmZvcm1hdGlvbiBub3QgaW5pdGlhbGl6ZWQgeWV0LlxuIik7Ci0JCXByaXZfc3RhID0gTlVMTDsKLQl9Ci0KLQlpZiAocmF0ZV9jb250cm9sX3NlbmRfbG93KHN0YSwgcHJpdl9zdGEsIHR4cmMpKQotCQlyZXR1cm47Ci0KLQlyYXRlX21hc2sgPSBzdGEtPnN1cHBfcmF0ZXNbc2JhbmQtPmJhbmRdOwotCi0JLyogZ2V0IHVzZXIgbWF4IHJhdGUgaWYgc2V0ICovCi0JbWF4X3JhdGVfaWR4ID0gdHhyYy0+bWF4X3JhdGVfaWR4OwotCWlmICgoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgJiYgKG1heF9yYXRlX2lkeCAhPSAtMSkpCi0JCW1heF9yYXRlX2lkeCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCWlmICgobWF4X3JhdGVfaWR4IDwgMCkgfHwgKG1heF9yYXRlX2lkeCA+PSBJV0xfUkFURV9DT1VOVCkpCi0JCW1heF9yYXRlX2lkeCA9IC0xOwotCi0JaW5kZXggPSBtaW4ocnNfc3RhLT5sYXN0X3R4cmF0ZV9pZHggJiAweGZmZmYsIElXTF9SQVRFX0NPVU5UXzM5NDUgLSAxKTsKLQotCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlyYXRlX21hc2sgPSByYXRlX21hc2sgPDwgSVdMX0ZJUlNUX09GRE1fUkFURTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCS8qIGZvciByZWNlbnQgYXNzb2MsIGNob29zZSBiZXN0IHJhdGUgcmVnYXJkaW5nCi0JICogdG8gcnNzaSB2YWx1ZQotCSAqLwotCWlmIChyc19zdGEtPnN0YXJ0X3JhdGUgIT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQlpZiAocnNfc3RhLT5zdGFydF9yYXRlIDwgaW5kZXggJiYKLQkJICAgKHJhdGVfbWFzayAmICgxIDw8IHJzX3N0YS0+c3RhcnRfcmF0ZSkpKQotCQkJaW5kZXggPSByc19zdGEtPnN0YXJ0X3JhdGU7Ci0JCXJzX3N0YS0+c3RhcnRfcmF0ZSA9IElXTF9SQVRFX0lOVkFMSUQ7Ci0JfQotCi0JLyogZm9yY2UgdXNlciBtYXggcmF0ZSBpZiBzZXQgYnkgdXNlciAqLwotCWlmICgobWF4X3JhdGVfaWR4ICE9IC0xKSAmJiAobWF4X3JhdGVfaWR4IDwgaW5kZXgpKSB7Ci0JCWlmIChyYXRlX21hc2sgJiAoMSA8PCBtYXhfcmF0ZV9pZHgpKQotCQkJaW5kZXggPSBtYXhfcmF0ZV9pZHg7Ci0JfQotCi0Jd2luZG93ID0gJihyc19zdGEtPndpbltpbmRleF0pOwotCi0JZmFpbF9jb3VudCA9IHdpbmRvdy0+Y291bnRlciAtIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyOwotCi0JaWYgKCgoZmFpbF9jb3VudCA8IElXTF9SQVRFX01JTl9GQUlMVVJFX1RIKSAmJgotCSAgICAgKHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyIDwgSVdMX1JBVEVfTUlOX1NVQ0NFU1NfVEgpKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCQlJV0xfREVCVUdfUkFURShwcml2LCAiSW52YWxpZCBhdmVyYWdlX3RwdCBvbiByYXRlICVkOiAiCi0JCQkgICAgICAgImNvdW50ZXI6ICVkLCBzdWNjZXNzX2NvdW50ZXI6ICVkLCAiCi0JCQkgICAgICAgImV4cGVjdGVkX3RwdCBpcyAlc05VTExcbiIsCi0JCQkgICAgICAgaW5kZXgsCi0JCQkgICAgICAgd2luZG93LT5jb3VudGVyLAotCQkJICAgICAgIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyLAotCQkJICAgICAgIHJzX3N0YS0+ZXhwZWN0ZWRfdHB0ID8gIm5vdCAiIDogIiIpOwotCi0JICAgLyogQ2FuJ3QgY2FsY3VsYXRlIHRoaXMgeWV0OyBub3QgZW5vdWdoIGhpc3RvcnkgKi8KLQkJd2luZG93LT5hdmVyYWdlX3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCQlnb3RvIG91dDsKLQotCX0KLQotCWN1cnJlbnRfdHB0ID0gd2luZG93LT5hdmVyYWdlX3RwdDsKLQotCWhpZ2hfbG93ID0gaXdsMzk0NV9nZXRfYWRqYWNlbnRfcmF0ZShyc19zdGEsIGluZGV4LCByYXRlX21hc2ssCi0JCQkJCSAgICAgc2JhbmQtPmJhbmQpOwotCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKLQloaWdoID0gKGhpZ2hfbG93ID4+IDgpICYgMHhmZjsKLQotCS8qIElmIHVzZXIgc2V0IG1heCByYXRlLCBkb250IGFsbG93IGhpZ2hlciB0aGFuIHVzZXIgY29uc3RyYWluICovCi0JaWYgKChtYXhfcmF0ZV9pZHggIT0gLTEpICYmIChtYXhfcmF0ZV9pZHggPCBoaWdoKSkKLQkJaGlnaCA9IElXTF9SQVRFX0lOVkFMSUQ7Ci0KLQkvKiBDb2xsZWN0IE1lYXN1cmVkIHRocm91Z2hwdXRzIG9mIGFkamFjZW50IHJhdGVzICovCi0JaWYgKGxvdyAhPSBJV0xfUkFURV9JTlZBTElEKQotCQlsb3dfdHB0ID0gcnNfc3RhLT53aW5bbG93XS5hdmVyYWdlX3RwdDsKLQotCWlmIChoaWdoICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCWhpZ2hfdHB0ID0gcnNfc3RhLT53aW5baGlnaF0uYXZlcmFnZV90cHQ7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCXNjYWxlX2FjdGlvbiA9IDA7Ci0KLQkvKiBMb3cgc3VjY2VzcyByYXRpbyAsIG5lZWQgdG8gZHJvcCB0aGUgcmF0ZSAqLwotCWlmICgod2luZG93LT5zdWNjZXNzX3JhdGlvIDwgSVdMX1JBVEVfREVDUkVBU0VfVEgpIHx8ICFjdXJyZW50X3RwdCkgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAiZGVjcmVhc2UgcmF0ZSBiZWNhdXNlIG9mIGxvdyBzdWNjZXNzX3JhdGlvXG4iKTsKLQkJc2NhbGVfYWN0aW9uID0gLTE7Ci0JLyogTm8gdGhyb3VnaHB1dCBtZWFzdXJlZCB5ZXQgZm9yIGFkamFjZW50IHJhdGVzLAotCSAqIHRyeSBpbmNyZWFzZSAqLwotCX0gZWxzZSBpZiAoKGxvd190cHQgPT0gSVdMX0lOVkFMSURfVkFMVUUpICYmCi0JCSAgIChoaWdoX3RwdCA9PSBJV0xfSU5WQUxJRF9WQUxVRSkpIHsKLQotCQlpZiAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEICYmIHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUkFURV9JTkNSRUFTRV9USCkKLQkJCXNjYWxlX2FjdGlvbiA9IDE7Ci0JCWVsc2UgaWYgKGxvdyAhPSBJV0xfUkFURV9JTlZBTElEKQotCQkJc2NhbGVfYWN0aW9uID0gMDsKLQotCS8qIEJvdGggYWRqYWNlbnQgdGhyb3VnaHB1dHMgYXJlIG1lYXN1cmVkLCBidXQgbmVpdGhlciBvbmUgaGFzCi0JICogYmV0dGVyIHRocm91Z2hwdXQ7IHdlJ3JlIHVzaW5nIHRoZSBiZXN0IHJhdGUsIGRvbid0IGNoYW5nZQotCSAqIGl0ISAqLwotCX0gZWxzZSBpZiAoKGxvd190cHQgIT0gSVdMX0lOVkFMSURfVkFMVUUpICYmCi0JCSAoaGlnaF90cHQgIT0gSVdMX0lOVkFMSURfVkFMVUUpICYmCi0JCSAobG93X3RwdCA8IGN1cnJlbnRfdHB0KSAmJiAoaGlnaF90cHQgPCBjdXJyZW50X3RwdCkpIHsKLQotCQlJV0xfREVCVUdfUkFURShwcml2LCAiTm8gYWN0aW9uIC0tIGxvdyBbJWRdICYgaGlnaCBbJWRdIDwgIgotCQkJICAgICAgICJjdXJyZW50X3RwdCBbJWRdXG4iLAotCQkJICAgICAgIGxvd190cHQsIGhpZ2hfdHB0LCBjdXJyZW50X3RwdCk7Ci0JCXNjYWxlX2FjdGlvbiA9IDA7Ci0KLQkvKiBBdCBsZWFzdCBvbmUgb2YgdGhlIHJhdGVzIGhhcyBiZXR0ZXIgdGhyb3VnaHB1dCAqLwotCX0gZWxzZSB7Ci0JCWlmIChoaWdoX3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgewotCi0JCQkvKiBIaWdoIHJhdGUgaGFzIGJldHRlciB0aHJvdWdocHV0LCBJbmNyZWFzZQotCQkJICogcmF0ZSAqLwotCQkJaWYgKGhpZ2hfdHB0ID4gY3VycmVudF90cHQgJiYKLQkJCQl3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPj0gSVdMX1JBVEVfSU5DUkVBU0VfVEgpCi0JCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJCWVsc2UgewotCQkJCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkJICAgICJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgaGlnaCB0cHRcbiIpOwotCQkJCXNjYWxlX2FjdGlvbiA9IDA7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAobG93X3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgewotCQkJaWYgKGxvd190cHQgPiBjdXJyZW50X3RwdCkgewotCQkJCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkJICAgICJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHRwdFxuIik7Ci0JCQkJc2NhbGVfYWN0aW9uID0gLTE7Ci0JCQl9IGVsc2UgaWYgKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUkFURV9JTkNSRUFTRV9USCkgewotCQkJCS8qIExvd2VyIHJhdGUgaGFzIGJldHRlcgotCQkJCSAqIHRocm91Z2hwdXQsZGVjcmVhc2UgcmF0ZSAqLwotCQkJCXNjYWxlX2FjdGlvbiA9IDE7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiBTYW5pdHkgY2hlY2s7IGFza2VkIGZvciBkZWNyZWFzZSwgYnV0IHN1Y2Nlc3MgcmF0ZSBvciB0aHJvdWdocHV0Ci0JICogaGFzIGJlZW4gZ29vZCBhdCBvbGQgcmF0ZS4gIERvbid0IGNoYW5nZSBpdC4gKi8KLQlpZiAoKHNjYWxlX2FjdGlvbiA9PSAtMSkgJiYgKGxvdyAhPSBJV0xfUkFURV9JTlZBTElEKSAmJgotCQkgICAgKCh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPiBJV0xfUkFURV9ISUdIX1RIKSB8fAotCQkgICAgIChjdXJyZW50X3RwdCA+ICgxMDAgKiByc19zdGEtPmV4cGVjdGVkX3RwdFtsb3ddKSkpKQotCQlzY2FsZV9hY3Rpb24gPSAwOwotCi0Jc3dpdGNoIChzY2FsZV9hY3Rpb24pIHsKLQljYXNlIC0xOgotCi0JCS8qIERlY3Jlc2UgcmF0ZSAqLwotCQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCQlpbmRleCA9IGxvdzsKLQkJYnJlYWs7Ci0KLQljYXNlIDE6Ci0JCS8qIEluY3JlYXNlIHJhdGUgKi8KLQkJaWYgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJCWluZGV4ID0gaGlnaDsKLQotCQlicmVhazsKLQotCWNhc2UgMDoKLQlkZWZhdWx0OgotCQkvKiBObyBjaGFuZ2UgKi8KLQkJYnJlYWs7Ci0JfQotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNlbGVjdGVkICVkIChhY3Rpb24gJWQpIC0gbG93ICVkIGhpZ2ggJWRcbiIsCi0JCSAgICAgICBpbmRleCwgc2NhbGVfYWN0aW9uLCBsb3csIGhpZ2gpOwotCi0gb3V0OgotCi0JaWYgKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsKLQkJaWYgKFdBUk5fT05fT05DRShpbmRleCA8IElXTF9GSVJTVF9PRkRNX1JBVEUpKQotCQkJaW5kZXggPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCQlyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IGluZGV4OwotCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeCA9IGluZGV4IC0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQl9IGVsc2UgewotCQlyc19zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IGluZGV4OwotCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeCA9IHJzX3N0YS0+bGFzdF90eHJhdGVfaWR4OwotCX0KLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJsZWF2ZTogJWRcbiIsIGluZGV4KTsKLX0KLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi1zdGF0aWMgaW50IGl3bDM5NDVfb3Blbl9maWxlX2dlbmVyaWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JZmlsZS0+cHJpdmF0ZV9kYXRhID0gaW5vZGUtPmlfcHJpdmF0ZTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJCSAgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyICpidWZmOwotCWludCBkZXNjID0gMDsKLQlpbnQgajsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKmxxX3N0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQotCWJ1ZmYgPSBrbWFsbG9jKDEwMjQsIEdGUF9LRVJORUwpOwotCWlmICghYnVmZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlkZXNjICs9IHNwcmludGYoYnVmZiArIGRlc2MsICJ0eCBwYWNrZXRzPSVkIGxhc3QgcmF0ZSBpbmRleD0lZFxuIgotCQkJInJhdGU9MHglWCBmbHVzaCB0aW1lICVkXG4iLAotCQkJbHFfc3RhLT50eF9wYWNrZXRzLAotCQkJbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHgsCi0JCQlscV9zdGEtPnN0YXJ0X3JhdGUsIGppZmZpZXNfdG9fbXNlY3MobHFfc3RhLT5mbHVzaF90aW1lKSk7Ci0JZm9yIChqID0gMDsgaiA8IElXTF9SQVRFX0NPVU5UXzM5NDU7IGorKykgewotCQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLAotCQkJCSJjb3VudGVyPSVkIHN1Y2Nlc3M9JWQgJSU9JWRcbiIsCi0JCQkJbHFfc3RhLT53aW5bal0uY291bnRlciwKLQkJCQlscV9zdGEtPndpbltqXS5zdWNjZXNzX2NvdW50ZXIsCi0JCQkJbHFfc3RhLT53aW5bal0uc3VjY2Vzc19yYXRpbyk7Ci0JfQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmZiwgZGVzYyk7Ci0Ja2ZyZWUoYnVmZik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX29wcyA9IHsKLQkucmVhZCA9IGl3bDM5NDVfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX3JlYWQsCi0JLm9wZW4gPSBpd2wzOTQ1X29wZW5fZmlsZV9nZW5lcmljLAotCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKLX07Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfYWRkX2RlYnVnZnModm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEsCi0JCQkJc3RydWN0IGRlbnRyeSAqZGlyKQotewotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7Ci0KLQlscV9zdGEtPnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlID0KLQkJZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zdGF0c190YWJsZSIsIDA2MDAsIGRpciwKLQkJbHFfc3RhLCAmcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX29wcyk7Ci0KLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9yZW1vdmVfZGVidWdmcyh2b2lkICpwcml2LCB2b2lkICpwcml2X3N0YSkKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgKmxxX3N0YSA9IHByaXZfc3RhOwotCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGUpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBJbml0aWFsaXphdGlvbiBvZiByYXRlIHNjYWxpbmcgaW5mb3JtYXRpb24gaXMgZG9uZSBieSBkcml2ZXIgYWZ0ZXIKLSAqIHRoZSBzdGF0aW9uIGlzIGFkZGVkLiBTaW5jZSBtYWM4MDIxMSBjYWxscyB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhCi0gKiBzdGF0aW9uIGlzIGFkZGVkIHdlIGlnbm9yZSBpdC4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yc19yYXRlX2luaXRfc3R1Yih2b2lkICpwcml2X3IsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSkKLXsKLX0KLQotc3RhdGljIHN0cnVjdCByYXRlX2NvbnRyb2xfb3BzIHJzX29wcyA9IHsKLQkubW9kdWxlID0gTlVMTCwKLQkubmFtZSA9IFJTX05BTUUsCi0JLnR4X3N0YXR1cyA9IGl3bDM5NDVfcnNfdHhfc3RhdHVzLAotCS5nZXRfcmF0ZSA9IGl3bDM5NDVfcnNfZ2V0X3JhdGUsCi0JLnJhdGVfaW5pdCA9IGl3bDM5NDVfcnNfcmF0ZV9pbml0X3N0dWIsCi0JLmFsbG9jID0gaXdsMzk0NV9yc19hbGxvYywKLQkuZnJlZSA9IGl3bDM5NDVfcnNfZnJlZSwKLQkuYWxsb2Nfc3RhID0gaXdsMzk0NV9yc19hbGxvY19zdGEsCi0JLmZyZWVfc3RhID0gaXdsMzk0NV9yc19mcmVlX3N0YSwKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUwotCS5hZGRfc3RhX2RlYnVnZnMgPSBpd2wzOTQ1X2FkZF9kZWJ1Z2ZzLAotCS5yZW1vdmVfc3RhX2RlYnVnZnMgPSBpd2wzOTQ1X3JlbW92ZV9kZWJ1Z2ZzLAotI2VuZGlmCi0KLX07Ci12b2lkIGl3bDM5NDVfcmF0ZV9zY2FsZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzMzIgc3RhX2lkKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXMzMiByc3NpID0gMDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2wzOTQ1X3JzX3N0YSAqcnNfc3RhOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7Ci0Jc3RydWN0IGl3bDM5NDVfc3RhX3ByaXYgKnBzdGE7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiZW50ZXJcbiIpOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCi0Jc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhKHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnZpZiwKLQkJCQkgcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOwotCWlmICghc3RhKSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJVbmFibGUgdG8gZmluZCBzdGF0aW9uIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nLlxuIik7Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlyZXR1cm47Ci0JfQotCi0JcHN0YSA9ICh2b2lkICopIHN0YS0+ZHJ2X3ByaXY7Ci0JcnNfc3RhID0gJnBzdGEtPnJzX3N0YTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCXJzX3N0YS0+dGdnID0gMDsKLQlzd2l0Y2ggKHByaXYtPmJhbmQpIHsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6Ci0JCS8qIFRPRE86IHRoaXMgYWx3YXlzIGRvZXMgRywgbm90IGEgcmVncmVzc2lvbiAqLwotCQlpZiAocHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWN0aXZlLmZsYWdzICYKLQkJCQkJCVJYT05fRkxHX1RHR19QUk9URUNUX01TSykgewotCQkJcnNfc3RhLT50Z2cgPSAxOwotCQkJcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9nX3Byb3Q7Ci0JCX0gZWxzZQotCQkJcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9nOwotCQlicmVhazsKLQotCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKLQkJcnNfc3RhLT5leHBlY3RlZF90cHQgPSBpd2wzOTQ1X2V4cGVjdGVkX3RwdF9hOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9OVU1fQkFORFM6Ci0JCUJVRygpOwotCQlicmVhazsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc19zdGEtPmxvY2ssIGZsYWdzKTsKLQotCXJzc2kgPSBwcml2LT5fMzk0NS5sYXN0X3J4X3Jzc2k7Ci0JaWYgKHJzc2kgPT0gMCkKLQkJcnNzaSA9IElXTF9NSU5fUlNTSV9WQUw7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiTmV0d29yayBSU1NJOiAlZFxuIiwgcnNzaSk7Ci0KLQlyc19zdGEtPnN0YXJ0X3JhdGUgPSBpd2wzOTQ1X2dldF9yYXRlX2luZGV4X2J5X3Jzc2kocnNzaSwgcHJpdi0+YmFuZCk7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmU6IHJzc2kgJWQgYXNzaWduIHJhdGUgaW5kZXg6ICIKLQkJICAgICAgICIlZCAocGxjcCAweCV4KVxuIiwgcnNzaSwgcnNfc3RhLT5zdGFydF9yYXRlLAotCQkgICAgICAgaXdsMzk0NV9yYXRlc1tyc19zdGEtPnN0YXJ0X3JhdGVdLnBsY3ApOwotCXJjdV9yZWFkX3VubG9jaygpOwotfQotCi1pbnQgaXdsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIodm9pZCkKLXsKLQlyZXR1cm4gaWVlZTgwMjExX3JhdGVfY29udHJvbF9yZWdpc3RlcigmcnNfb3BzKTsKLX0KLQotdm9pZCBpd2wzOTQ1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKHZvaWQpCi17Ci0JaWVlZTgwMjExX3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCZyc19vcHMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzBhNzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTM5NDUuYworKysgL2Rldi9udWxsCkBAIC0xLDI3NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtZmguaCIKLSNpbmNsdWRlICJpd2wtMzk0NS1maC5oIgotI2luY2x1ZGUgIml3bC1jb21tYW5kcy5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtMzk0NS5oIgotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0jaW5jbHVkZSAiaXdsLWxlZC5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LWxlZC5oIgotI2luY2x1ZGUgIml3bC0zOTQ1LWRlYnVnZnMuaCIKLQotI2RlZmluZSBJV0xfREVDTEFSRV9SQVRFX0lORk8ociwgaXAsIGluLCBycCwgcm4sIHBwLCBucCkgICAgXAotCVtJV0xfUkFURV8jI3IjI01fSU5ERVhdID0geyBJV0xfUkFURV8jI3IjI01fUExDUCwgICBcCi0JCQkJICAgIElXTF9SQVRFXyMjciMjTV9JRUVFLCAgIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNpcCMjTV9JTkRFWCwgXAotCQkJCSAgICBJV0xfUkFURV8jI2luIyNNX0lOREVYLCBcCi0JCQkJICAgIElXTF9SQVRFXyMjcnAjI01fSU5ERVgsIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNybiMjTV9JTkRFWCwgXAotCQkJCSAgICBJV0xfUkFURV8jI3BwIyNNX0lOREVYLCBcCi0JCQkJICAgIElXTF9SQVRFXyMjbnAjI01fSU5ERVgsIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNyIyNNX0lOREVYX1RBQkxFLCBcCi0JCQkJICAgIElXTF9SQVRFXyMjaXAjI01fSU5ERVhfVEFCTEUgfQotCi0vKgotICogUGFyYW1ldGVyIG9yZGVyOgotICogICByYXRlLCBwcmV2IHJhdGUsIG5leHQgcmF0ZSwgcHJldiB0Z2cgcmF0ZSwgbmV4dCB0Z2cgcmF0ZQotICoKLSAqIElmIHRoZXJlIGlzbid0IGEgdmFsaWQgbmV4dCBvciBwcmV2aW91cyByYXRlIHRoZW4gSU5WIGlzIHVzZWQgd2hpY2gKLSAqIG1hcHMgdG8gSVdMX1JBVEVfSU5WQUxJRAotICoKLSAqLwotY29uc3Qgc3RydWN0IGl3bDM5NDVfcmF0ZV9pbmZvIGl3bDM5NDVfcmF0ZXNbSVdMX1JBVEVfQ09VTlRfMzk0NV0gPSB7Ci0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDEsIElOViwgMiwgSU5WLCAyLCBJTlYsIDIpLCAgICAvKiAgMW1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMiwgMSwgNSwgMSwgNSwgMSwgNSksICAgICAgICAgIC8qICAybWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTyg1LCAyLCA2LCAyLCAxMSwgMiwgMTEpLCAgICAgICAgLyo1LjVtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDExLCA5LCAxMiwgNSwgMTIsIDUsIDE4KSwgICAgICAvKiAxMW1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNiwgNSwgOSwgNSwgMTEsIDUsIDExKSwgICAgICAgIC8qICA2bWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTyg5LCA2LCAxMSwgNSwgMTEsIDUsIDExKSwgICAgICAgLyogIDltYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDEyLCAxMSwgMTgsIDExLCAxOCwgMTEsIDE4KSwgICAvKiAxMm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTgsIDEyLCAyNCwgMTIsIDI0LCAxMSwgMjQpLCAgIC8qIDE4bWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTygyNCwgMTgsIDM2LCAxOCwgMzYsIDE4LCAzNiksICAgLyogMjRtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDM2LCAyNCwgNDgsIDI0LCA0OCwgMjQsIDQ4KSwgICAvKiAzNm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNDgsIDM2LCA1NCwgMzYsIDU0LCAzNiwgNTQpLCAgIC8qIDQ4bWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTyg1NCwgNDgsIElOViwgNDgsIElOViwgNDgsIElOViksLyogNTRtYnBzICovCi19OwotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDM5NDVfZ2V0X3ByZXZfaWVlZV9yYXRlKHU4IHJhdGVfaW5kZXgpCi17Ci0JdTggcmF0ZSA9IGl3bDM5NDVfcmF0ZXNbcmF0ZV9pbmRleF0ucHJldl9pZWVlOwotCi0JaWYgKHJhdGUgPT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJcmF0ZSA9IHJhdGVfaW5kZXg7Ci0JcmV0dXJuIHJhdGU7Ci19Ci0KLS8qIDEgPSBlbmFibGUgdGhlIGl3bDM5NDVfZGlzYWJsZV9ldmVudHMoKSBmdW5jdGlvbiAqLwotI2RlZmluZSBJV0xfRVZUX0RJU0FCTEUgKDApCi0jZGVmaW5lIElXTF9FVlRfRElTQUJMRV9TSVpFICgxNTMyLzMyKQotCi0vKioKLSAqIGl3bDM5NDVfZGlzYWJsZV9ldmVudHMgLSBEaXNhYmxlIHNlbGVjdGVkIGV2ZW50cyBpbiB1Q29kZSBldmVudCBsb2cKLSAqCi0gKiBEaXNhYmxlIGFuIGV2ZW50IGJ5IHdyaXRpbmcgIjEicyBpbnRvICJkaXNhYmxlIgotICogICBiaXRtYXAgaW4gU1JBTS4gIEJpdCBwb3NpdGlvbiBjb3JyZXNwb25kcyB0byBFdmVudCAjIChpZC90eXBlKS4KLSAqICAgRGVmYXVsdCB2YWx1ZXMgb2YgMCBlbmFibGUgdUNvZGUgZXZlbnRzIHRvIGJlIGxvZ2dlZC4KLSAqIFVzZSBmb3Igb25seSBzcGVjaWFsIGRlYnVnZ2luZy4gIFRoaXMgZnVuY3Rpb24gaXMganVzdCBhIHBsYWNlaG9sZGVyIGFzLWlzLAotICogICB5b3UnbGwgbmVlZCB0byBwcm92aWRlIHRoZSBzcGVjaWFsIGJpdHMhIC4uLgotICogICAuLi4gYW5kIHNldCBJV0xfRVZUX0RJU0FCTEUgdG8gMS4gKi8KLXZvaWQgaXdsMzk0NV9kaXNhYmxlX2V2ZW50cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IGk7Ci0JdTMyIGJhc2U7CQkvKiBTUkFNIGFkZHJlc3Mgb2YgZXZlbnQgbG9nIGhlYWRlciAqLwotCXUzMiBkaXNhYmxlX3B0cjsJLyogU1JBTSBhZGRyZXNzIG9mIGV2ZW50LWRpc2FibGUgYml0bWFwIGFycmF5ICovCi0JdTMyIGFycmF5X3NpemU7CQkvKiAjIG9mIHUzMiBlbnRyaWVzIGluIGFycmF5ICovCi0Jc3RhdGljIGNvbnN0IHUzMiBldnRfZGlzYWJsZVtJV0xfRVZUX0RJU0FCTEVfU0laRV0gPSB7Ci0JCTB4MDAwMDAwMDAsCS8qICAgMzEgLSAgICAwICBFdmVudCBpZCBudW1iZXJzICovCi0JCTB4MDAwMDAwMDAsCS8qICAgNjMgLSAgIDMyICovCi0JCTB4MDAwMDAwMDAsCS8qICAgOTUgLSAgIDY0ICovCi0JCTB4MDAwMDAwMDAsCS8qICAxMjcgLSAgIDk2ICovCi0JCTB4MDAwMDAwMDAsCS8qICAxNTkgLSAgMTI4ICovCi0JCTB4MDAwMDAwMDAsCS8qICAxOTEgLSAgMTYwICovCi0JCTB4MDAwMDAwMDAsCS8qICAyMjMgLSAgMTkyICovCi0JCTB4MDAwMDAwMDAsCS8qICAyNTUgLSAgMjI0ICovCi0JCTB4MDAwMDAwMDAsCS8qICAyODcgLSAgMjU2ICovCi0JCTB4MDAwMDAwMDAsCS8qICAzMTkgLSAgMjg4ICovCi0JCTB4MDAwMDAwMDAsCS8qICAzNTEgLSAgMzIwICovCi0JCTB4MDAwMDAwMDAsCS8qICAzODMgLSAgMzUyICovCi0JCTB4MDAwMDAwMDAsCS8qICA0MTUgLSAgMzg0ICovCi0JCTB4MDAwMDAwMDAsCS8qICA0NDcgLSAgNDE2ICovCi0JCTB4MDAwMDAwMDAsCS8qICA0NzkgLSAgNDQ4ICovCi0JCTB4MDAwMDAwMDAsCS8qICA1MTEgLSAgNDgwICovCi0JCTB4MDAwMDAwMDAsCS8qICA1NDMgLSAgNTEyICovCi0JCTB4MDAwMDAwMDAsCS8qICA1NzUgLSAgNTQ0ICovCi0JCTB4MDAwMDAwMDAsCS8qICA2MDcgLSAgNTc2ICovCi0JCTB4MDAwMDAwMDAsCS8qICA2MzkgLSAgNjA4ICovCi0JCTB4MDAwMDAwMDAsCS8qICA2NzEgLSAgNjQwICovCi0JCTB4MDAwMDAwMDAsCS8qICA3MDMgLSAgNjcyICovCi0JCTB4MDAwMDAwMDAsCS8qICA3MzUgLSAgNzA0ICovCi0JCTB4MDAwMDAwMDAsCS8qICA3NjcgLSAgNzM2ICovCi0JCTB4MDAwMDAwMDAsCS8qICA3OTkgLSAgNzY4ICovCi0JCTB4MDAwMDAwMDAsCS8qICA4MzEgLSAgODAwICovCi0JCTB4MDAwMDAwMDAsCS8qICA4NjMgLSAgODMyICovCi0JCTB4MDAwMDAwMDAsCS8qICA4OTUgLSAgODY0ICovCi0JCTB4MDAwMDAwMDAsCS8qICA5MjcgLSAgODk2ICovCi0JCTB4MDAwMDAwMDAsCS8qICA5NTkgLSAgOTI4ICovCi0JCTB4MDAwMDAwMDAsCS8qICA5OTEgLSAgOTYwICovCi0JCTB4MDAwMDAwMDAsCS8qIDEwMjMgLSAgOTkyICovCi0JCTB4MDAwMDAwMDAsCS8qIDEwNTUgLSAxMDI0ICovCi0JCTB4MDAwMDAwMDAsCS8qIDEwODcgLSAxMDU2ICovCi0JCTB4MDAwMDAwMDAsCS8qIDExMTkgLSAxMDg4ICovCi0JCTB4MDAwMDAwMDAsCS8qIDExNTEgLSAxMTIwICovCi0JCTB4MDAwMDAwMDAsCS8qIDExODMgLSAxMTUyICovCi0JCTB4MDAwMDAwMDAsCS8qIDEyMTUgLSAxMTg0ICovCi0JCTB4MDAwMDAwMDAsCS8qIDEyNDcgLSAxMjE2ICovCi0JCTB4MDAwMDAwMDAsCS8qIDEyNzkgLSAxMjQ4ICovCi0JCTB4MDAwMDAwMDAsCS8qIDEzMTEgLSAxMjgwICovCi0JCTB4MDAwMDAwMDAsCS8qIDEzNDMgLSAxMzEyICovCi0JCTB4MDAwMDAwMDAsCS8qIDEzNzUgLSAxMzQ0ICovCi0JCTB4MDAwMDAwMDAsCS8qIDE0MDcgLSAxMzc2ICovCi0JCTB4MDAwMDAwMDAsCS8qIDE0MzkgLSAxNDA4ICovCi0JCTB4MDAwMDAwMDAsCS8qIDE0NzEgLSAxNDQwICovCi0JCTB4MDAwMDAwMDAsCS8qIDE1MDMgLSAxNDcyICovCi0JfTsKLQotCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlLmxvZ19ldmVudF90YWJsZV9wdHIpOwotCWlmICghaXdsMzk0NV9od192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgZXZlbnQgbG9nIHBvaW50ZXIgMHglMDhYXG4iLCBiYXNlKTsKLQkJcmV0dXJuOwotCX0KLQotCWRpc2FibGVfcHRyID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAoNCAqIHNpemVvZih1MzIpKSk7Ci0JYXJyYXlfc2l6ZSA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgKDUgKiBzaXplb2YodTMyKSkpOwotCi0JaWYgKElXTF9FVlRfRElTQUJMRSAmJiAoYXJyYXlfc2l6ZSA9PSBJV0xfRVZUX0RJU0FCTEVfU0laRSkpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkRpc2FibGluZyBzZWxlY3RlZCB1Q29kZSBsb2cgZXZlbnRzIGF0IDB4JXhcbiIsCi0JCQkgICAgICAgZGlzYWJsZV9wdHIpOwotCQlmb3IgKGkgPSAwOyBpIDwgSVdMX0VWVF9ESVNBQkxFX1NJWkU7IGkrKykKLQkJCWl3bF9sZWdhY3lfd3JpdGVfdGFyZ19tZW0ocHJpdiwKLQkJCQkJICAgZGlzYWJsZV9wdHIgKyAoaSAqIHNpemVvZih1MzIpKSwKLQkJCQkJICAgZXZ0X2Rpc2FibGVbaV0pOwotCi0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlNlbGVjdGVkIHVDb2RlIGxvZyBldmVudHMgbWF5IGJlIGRpc2FibGVkXG4iKTsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIiAgYnkgd3JpdGluZyBcIjFcInMgaW50byBkaXNhYmxlIGJpdG1hcFxuIik7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICIgIGluIFNSQU0gYXQgMHgleCwgc2l6ZSAlZCB1MzJzXG4iLAotCQkJICAgICAgIGRpc2FibGVfcHRyLCBhcnJheV9zaXplKTsKLQl9Ci0KLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X2h3cmF0ZV90b19wbGNwX2lkeCh1OCBwbGNwKQotewotCWludCBpZHg7Ci0KLQlmb3IgKGlkeCA9IDA7IGlkeCA8IElXTF9SQVRFX0NPVU5UXzM5NDU7IGlkeCsrKQotCQlpZiAoaXdsMzk0NV9yYXRlc1tpZHhdLnBsY3AgPT0gcGxjcCkKLQkJCXJldHVybiBpZHg7Ci0JcmV0dXJuIC0xOwotfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0jZGVmaW5lIFRYX1NUQVRVU19FTlRSWSh4KSBjYXNlIFRYXzM5NDVfU1RBVFVTX0ZBSUxfICMjIHg6IHJldHVybiAjeAotCi1zdGF0aWMgY29uc3QgY2hhciAqaXdsMzk0NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKLXsKLQlzd2l0Y2ggKHN0YXR1cyAmIFRYX1NUQVRVU19NU0spIHsKLQljYXNlIFRYXzM5NDVfU1RBVFVTX1NVQ0NFU1M6Ci0JCXJldHVybiAiU1VDQ0VTUyI7Ci0JCVRYX1NUQVRVU19FTlRSWShTSE9SVF9MSU1JVCk7Ci0JCVRYX1NUQVRVU19FTlRSWShMT05HX0xJTUlUKTsKLQkJVFhfU1RBVFVTX0VOVFJZKEZJRk9fVU5ERVJSVU4pOwotCQlUWF9TVEFUVVNfRU5UUlkoTUdNTlRfQUJPUlQpOwotCQlUWF9TVEFUVVNfRU5UUlkoTkVYVF9GUkFHKTsKLQkJVFhfU1RBVFVTX0VOVFJZKExJRkVfRVhQSVJFKTsKLQkJVFhfU1RBVFVTX0VOVFJZKERFU1RfUFMpOwotCQlUWF9TVEFUVVNfRU5UUlkoQUJPUlRFRCk7Ci0JCVRYX1NUQVRVU19FTlRSWShCVF9SRVRSWSk7Ci0JCVRYX1NUQVRVU19FTlRSWShTVEFfSU5WQUxJRCk7Ci0JCVRYX1NUQVRVU19FTlRSWShGUkFHX0RST1BQRUQpOwotCQlUWF9TVEFUVVNfRU5UUlkoVElEX0RJU0FCTEUpOwotCQlUWF9TVEFUVVNfRU5UUlkoRlJBTUVfRkxVU0hFRCk7Ci0JCVRYX1NUQVRVU19FTlRSWShJTlNVRkZJQ0lFTlRfQ0ZfUE9MTCk7Ci0JCVRYX1NUQVRVU19FTlRSWShUWF9MT0NLRUQpOwotCQlUWF9TVEFUVVNfRU5UUlkoTk9fQkVBQ09OX09OX1JBREFSKTsKLQl9Ci0KLQlyZXR1cm4gIlVOS05PV04iOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqaXdsMzk0NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKLXsKLQlyZXR1cm4gIiI7Ci19Ci0jZW5kaWYKLQotLyoKLSAqIGdldCBpZWVlIHByZXYgcmF0ZSBmcm9tIHJhdGUgc2NhbGUgdGFibGUuCi0gKiBmb3IgQSBhbmQgQiBtb2RlIHdlIG5lZWQgdG8gb3ZlcnJpZ2h0IHByZXYKLSAqIHZhbHVlCi0gKi8KLWludCBpd2wzOTQ1X3JzX25leHRfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCByYXRlKQotewotCWludCBuZXh0X3JhdGUgPSBpd2wzOTQ1X2dldF9wcmV2X2llZWVfcmF0ZShyYXRlKTsKLQotCXN3aXRjaCAocHJpdi0+YmFuZCkgewotCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKLQkJaWYgKHJhdGUgPT0gSVdMX1JBVEVfMTJNX0lOREVYKQotCQkJbmV4dF9yYXRlID0gSVdMX1JBVEVfOU1fSU5ERVg7Ci0JCWVsc2UgaWYgKHJhdGUgPT0gSVdMX1JBVEVfNk1fSU5ERVgpCi0JCQluZXh0X3JhdGUgPSBJV0xfUkFURV82TV9JTkRFWDsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQlpZiAoIShwcml2LT5fMzk0NS5zdGFfc3VwcF9yYXRlcyAmIElXTF9PRkRNX1JBVEVTX01BU0spICYmCi0JCSAgICBpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQocHJpdiwgSVdMX1JYT05fQ1RYX0JTUykpIHsKLQkJCWlmIChyYXRlID09IElXTF9SQVRFXzExTV9JTkRFWCkKLQkJCQluZXh0X3JhdGUgPSBJV0xfUkFURV81TV9JTkRFWDsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBuZXh0X3JhdGU7Ci19Ci0KLQotLyoqCi0gKiBpd2wzOTQ1X3R4X3F1ZXVlX3JlY2xhaW0gLSBSZWNsYWltIFR4IHF1ZXVlIGVudHJpZXMgYWxyZWFkeSBUeCdkCi0gKgotICogV2hlbiBGVyBhZHZhbmNlcyAnUicgaW5kZXgsIGFsbCBlbnRyaWVzIGJldHdlZW4gb2xkIGFuZCBuZXcgJ1InIGluZGV4Ci0gKiBuZWVkIHRvIGJlIHJlY2xhaW1lZC4gQXMgcmVzdWx0LCBzb21lIGZyZWUgc3BhY2UgZm9ybXMuIElmIHRoZXJlIGlzCi0gKiBlbm91Z2ggZnJlZSBzcGFjZSAoPiBsb3cgbWFyayksIHdha2UgdGhlIHN0YWNrIHRoYXQgZmVlZHMgdXMuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfdHhfcXVldWVfcmVjbGFpbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBpbnQgdHhxX2lkLCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCXN0cnVjdCBpd2xfdHhfaW5mbyAqdHhfaW5mbzsKLQotCUJVR19PTih0eHFfaWQgPT0gSVdMMzlfQ01EX1FVRVVFX05VTSk7Ci0KLQlmb3IgKGluZGV4ID0gaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcChpbmRleCwgcS0+bl9iZCk7Ci0JCXEtPnJlYWRfcHRyICE9IGluZGV4OwotCQlxLT5yZWFkX3B0ciA9IGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAocS0+cmVhZF9wdHIsIHEtPm5fYmQpKSB7Ci0KLQkJdHhfaW5mbyA9ICZ0eHEtPnR4Ylt0eHEtPnEucmVhZF9wdHJdOwotCQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUocHJpdi0+aHcsIHR4X2luZm8tPnNrYik7Ci0JCXR4X2luZm8tPnNrYiA9IE5VTEw7Ci0JCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9mcmVlX3RmZChwcml2LCB0eHEpOwotCX0KLQotCWlmIChpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKHEpID4gcS0+bG93X21hcmsgJiYgKHR4cV9pZCA+PSAwKSAmJgotCQkJKHR4cV9pZCAhPSBJV0wzOV9DTURfUVVFVUVfTlVNKSAmJgotCQkJcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKLQkJaXdsX2xlZ2FjeV93YWtlX3F1ZXVlKHByaXYsIHR4cSk7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9yeF9yZXBseV90eCAtIEhhbmRsZSBUeCByZXNwb25zZQotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X3JlcGx5X3R4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQl1MTYgc2VxdWVuY2UgPSBsZTE2X3RvX2NwdShwa3QtPmhkci5zZXF1ZW5jZSk7Ci0JaW50IHR4cV9pZCA9IFNFUV9UT19RVUVVRShzZXF1ZW5jZSk7Ci0JaW50IGluZGV4ID0gU0VRX1RPX0lOREVYKHNlcXVlbmNlKTsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwotCXN0cnVjdCBpd2wzOTQ1X3R4X3Jlc3AgKnR4X3Jlc3AgPSAodm9pZCAqKSZwa3QtPnUucmF3WzBdOwotCXUzMiAgc3RhdHVzID0gbGUzMl90b19jcHUodHhfcmVzcC0+c3RhdHVzKTsKLQlpbnQgcmF0ZV9pZHg7Ci0JaW50IGZhaWw7Ci0KLQlpZiAoKGluZGV4ID49IHR4cS0+cS5uX2JkKSB8fCAoaXdsX2xlZ2FjeV9xdWV1ZV91c2VkKCZ0eHEtPnEsIGluZGV4KSA9PSAwKSkgewotCQlJV0xfRVJSKHByaXYsICJSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxX2lkICglZCkgaW5kZXggJWQgIgotCQkJICAiaXMgb3V0IG9mIHJhbmdlIFswLSVkXSAlZCAlZFxuIiwgdHhxX2lkLAotCQkJICBpbmRleCwgdHhxLT5xLm5fYmQsIHR4cS0+cS53cml0ZV9wdHIsCi0JCQkgIHR4cS0+cS5yZWFkX3B0cik7Ci0JCXJldHVybjsKLQl9Ci0KLQl0eHEtPnRpbWVfc3RhbXAgPSBqaWZmaWVzOwotCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiKTsKLQlpZWVlODAyMTFfdHhfaW5mb19jbGVhcl9zdGF0dXMoaW5mbyk7Ci0KLQkvKiBGaWxsIHRoZSBNUlIgY2hhaW4gd2l0aCBzb21lIGluZm8gYWJvdXQgb24tY2hpcCByZXRyYW5zbWlzc2lvbnMgKi8KLQlyYXRlX2lkeCA9IGl3bDM5NDVfaHdyYXRlX3RvX3BsY3BfaWR4KHR4X3Jlc3AtPnJhdGUpOwotCWlmIChpbmZvLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCXJhdGVfaWR4IC09IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0KLQlmYWlsID0gdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZTsKLQotCWluZm8tPnN0YXR1cy5yYXRlc1swXS5pZHggPSByYXRlX2lkeDsKLQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSBmYWlsICsgMTsgLyogYWRkIGZpbmFsIGF0dGVtcHQgKi8KLQotCS8qIHR4X3N0YXR1cy0+cnRzX3JldHJ5X2NvdW50ID0gdHhfcmVzcC0+ZmFpbHVyZV9ydHM7ICovCi0JaW5mby0+ZmxhZ3MgfD0gKChzdGF0dXMgJiBUWF9TVEFUVVNfTVNLKSA9PSBUWF9TVEFUVVNfU1VDQ0VTUykgPwotCQkJCUlFRUU4MDIxMV9UWF9TVEFUX0FDSyA6IDA7Ci0KLQlJV0xfREVCVUdfVFgocHJpdiwgIlR4IHF1ZXVlICVkIFN0YXR1cyAlcyAoMHglMDh4KSBwbGNwIHJhdGUgJWQgcmV0cmllcyAlZFxuIiwKLQkJCXR4cV9pZCwgaXdsMzk0NV9nZXRfdHhfZmFpbF9yZWFzb24oc3RhdHVzKSwgc3RhdHVzLAotCQkJdHhfcmVzcC0+cmF0ZSwgdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSk7Ci0KLQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIlR4IHF1ZXVlIHJlY2xhaW0gJWRcbiIsIGluZGV4KTsKLQlpd2wzOTQ1X3R4X3F1ZXVlX3JlY2xhaW0ocHJpdiwgdHhxX2lkLCBpbmRleCk7Ci0KLQlpZiAoc3RhdHVzICYgVFhfQUJPUlRfUkVRVUlSRURfTVNLKQotCQlJV0xfRVJSKHByaXYsICJUT0RPOiAgSW1wbGVtZW50IFR4IEFCT1JUIFJFUVVJUkVEISEhXG4iKTsKLX0KLQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEludGVsIFBSTy9XaXJlbGVzcyAzOTQ1QUJHL0JHIE5ldHdvcmsgQ29ubmVjdGlvbgotICoKLSAqICBSWCBoYW5kbGVyIGltcGxlbWVudGF0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotc3RhdGljIHZvaWQgaXdsMzk0NV9hY2N1bXVsYXRpdmVfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgICBfX2xlMzIgKnN0YXRzKQotewotCWludCBpOwotCV9fbGUzMiAqcHJldl9zdGF0czsKLQl1MzIgKmFjY3VtX3N0YXRzOwotCXUzMiAqZGVsdGEsICptYXhfZGVsdGE7Ci0KLQlwcmV2X3N0YXRzID0gKF9fbGUzMiAqKSZwcml2LT5fMzk0NS5zdGF0aXN0aWNzOwotCWFjY3VtX3N0YXRzID0gKHUzMiAqKSZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzOwotCWRlbHRhID0gKHUzMiAqKSZwcml2LT5fMzk0NS5kZWx0YV9zdGF0aXN0aWNzOwotCW1heF9kZWx0YSA9ICh1MzIgKikmcHJpdi0+XzM5NDUubWF4X2RlbHRhOwotCi0JZm9yIChpID0gc2l6ZW9mKF9fbGUzMik7IGkgPCBzaXplb2Yoc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyk7Ci0JICAgICBpICs9IHNpemVvZihfX2xlMzIpLCBzdGF0cysrLCBwcmV2X3N0YXRzKyssIGRlbHRhKyssCi0JICAgICBtYXhfZGVsdGErKywgYWNjdW1fc3RhdHMrKykgewotCQlpZiAobGUzMl90b19jcHUoKnN0YXRzKSA+IGxlMzJfdG9fY3B1KCpwcmV2X3N0YXRzKSkgewotCQkJKmRlbHRhID0gKGxlMzJfdG9fY3B1KCpzdGF0cykgLQotCQkJCWxlMzJfdG9fY3B1KCpwcmV2X3N0YXRzKSk7Ci0JCQkqYWNjdW1fc3RhdHMgKz0gKmRlbHRhOwotCQkJaWYgKCpkZWx0YSA+ICptYXhfZGVsdGEpCi0JCQkJKm1heF9kZWx0YSA9ICpkZWx0YTsKLQkJfQotCX0KLQotCS8qIHJlc2V0IGFjY3VtdWxhdGl2ZSBzdGF0aXN0aWNzIGZvciAibm8tY291bnRlciIgdHlwZSBzdGF0aXN0aWNzICovCi0JcHJpdi0+XzM5NDUuYWNjdW1fc3RhdGlzdGljcy5nZW5lcmFsLnRlbXBlcmF0dXJlID0KLQkJcHJpdi0+XzM5NDUuc3RhdGlzdGljcy5nZW5lcmFsLnRlbXBlcmF0dXJlOwotCXByaXYtPl8zOTQ1LmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC50dGxfdGltZXN0YW1wID0KLQkJcHJpdi0+XzM5NDUuc3RhdGlzdGljcy5nZW5lcmFsLnR0bF90aW1lc3RhbXA7Ci19Ci0jZW5kaWYKLQotdm9pZCBpd2wzOTQ1X2h3X3J4X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQotCUlXTF9ERUJVR19SWChwcml2LCAiU3RhdGlzdGljcyBub3RpZmljYXRpb24gcmVjZWl2ZWQgKCVkIHZzICVkKS5cbiIsCi0JCSAgICAgKGludClzaXplb2Yoc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyksCi0JCSAgICAgbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSyk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQlpd2wzOTQ1X2FjY3VtdWxhdGl2ZV9zdGF0aXN0aWNzKHByaXYsIChfX2xlMzIgKikmcGt0LT51LnJhdyk7Ci0jZW5kaWYKLQotCW1lbWNweSgmcHJpdi0+XzM5NDUuc3RhdGlzdGljcywgcGt0LT51LnJhdywgc2l6ZW9mKHByaXYtPl8zOTQ1LnN0YXRpc3RpY3MpKTsKLX0KLQotdm9pZCBpd2wzOTQ1X3JlcGx5X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0JX19sZTMyICpmbGFnID0gKF9fbGUzMiAqKSZwa3QtPnUucmF3OwotCi0JaWYgKGxlMzJfdG9fY3B1KCpmbGFnKSAmIFVDT0RFX1NUQVRJU1RJQ1NfQ0xFQVJfTVNLKSB7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQkJbWVtc2V0KCZwcml2LT5fMzk0NS5hY2N1bV9zdGF0aXN0aWNzLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X25vdGlmX3N0YXRpc3RpY3MpKTsKLQkJbWVtc2V0KCZwcml2LT5fMzk0NS5kZWx0YV9zdGF0aXN0aWNzLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X25vdGlmX3N0YXRpc3RpY3MpKTsKLQkJbWVtc2V0KCZwcml2LT5fMzk0NS5tYXhfZGVsdGEsIDAsCi0JCQlzaXplb2Yoc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcykpOwotI2VuZGlmCi0JCUlXTF9ERUJVR19SWChwcml2LCAiU3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7Ci0JfQotCWl3bDM5NDVfaHdfcnhfc3RhdGlzdGljcyhwcml2LCByeGIpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBNaXNjLiBpbnRlcm5hbCBzdGF0ZSBhbmQgaGVscGVyIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgZm9yIGEgbnVtYmVyIG9mIHN0YXRpc3RpY3MsIHNlZSB0aGUgY2FsbGVyLiAqLwotc3RhdGljIGludCBpd2wzOTQ1X2lzX25ldHdvcmtfcGFja2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcikKLXsKLQkvKiBGaWx0ZXIgaW5jb21pbmcgcGFja2V0cyB0byBkZXRlcm1pbmUgaWYgdGhleSBhcmUgdGFyZ2V0ZWQgdG93YXJkCi0JICogdGhpcyBuZXR3b3JrLCBkaXNjYXJkaW5nIHBhY2tldHMgY29taW5nIGZyb20gb3Vyc2VsdmVzICovCi0Jc3dpdGNoIChwcml2LT5pd19tb2RlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzogLyogSGVhZGVyOiBEZXN0LiB8IFNvdXJjZSAgICB8IEJTU0lEICovCi0JCS8qIHBhY2tldHMgdG8gb3VyIElCU1MgdXBkYXRlIGluZm9ybWF0aW9uICovCi0JCXJldHVybiAhY29tcGFyZV9ldGhlcl9hZGRyKGhlYWRlci0+YWRkcjMsIHByaXYtPmJzc2lkKTsKLQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046IC8qIEhlYWRlcjogRGVzdC4gfCBBUHtCU1NJRH0gfCBTb3VyY2UgKi8KLQkJLyogcGFja2V0cyB0byBvdXIgSUJTUyB1cGRhdGUgaW5mb3JtYXRpb24gKi8KLQkJcmV0dXJuICFjb21wYXJlX2V0aGVyX2FkZHIoaGVhZGVyLT5hZGRyMiwgcHJpdi0+YnNzaWQpOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAxOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9wYXNzX3BhY2tldF90b19tYWM4MDIxMShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilJV0xfUlhfREFUQShwa3QpOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2hkciAqcnhfaGRyID0gSVdMX1JYX0hEUihwa3QpOwotCXN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2VuZCAqcnhfZW5kID0gSVdMX1JYX0VORChwa3QpOwotCXUxNiBsZW4gPSBsZTE2X3RvX2NwdShyeF9oZHItPmxlbik7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0KLQkvKiBXZSByZWNlaXZlZCBkYXRhIGZyb20gdGhlIEhXLCBzbyBzdG9wIHRoZSB3YXRjaGRvZyAqLwotCWlmICh1bmxpa2VseShsZW4gKyBJV0wzOV9SWF9GUkFNRV9TSVpFID4KLQkJICAgICBQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpKSB7Ci0JCUlXTF9ERUJVR19EUk9QKHByaXYsICJDb3JydXB0aW9uIGRldGVjdGVkIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBXZSBvbmx5IHByb2Nlc3MgZGF0YSBwYWNrZXRzIGlmIHRoZSBpbnRlcmZhY2UgaXMgb3BlbiAqLwotCWlmICh1bmxpa2VseSghcHJpdi0+aXNfb3BlbikpIHsKLQkJSVdMX0RFQlVHX0RST1BfTElNSVQocHJpdiwKLQkJCSJEcm9wcGluZyBwYWNrZXQgd2hpbGUgaW50ZXJmYWNlIGlzIG5vdCBvcGVuLlxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7Ci0JaWYgKCFza2IpIHsKLQkJSVdMX0VSUihwcml2LCAiZGV2X2FsbG9jX3NrYiBmYWlsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFpd2wzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvKQotCQlpd2xfbGVnYWN5X3NldF9kZWNyeXB0ZWRfZmxhZyhwcml2LAotCQkJCSAgICAgICAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilyeGJfYWRkcihyeGIpLAotCQkJCSAgICAgICBsZTMyX3RvX2NwdShyeF9lbmQtPnN0YXR1cyksIHN0YXRzKTsKLQotCXNrYl9hZGRfcnhfZnJhZyhza2IsIDAsIHJ4Yi0+cGFnZSwKLQkJCSh2b2lkICopcnhfaGRyLT5wYXlsb2FkIC0gKHZvaWQgKilwa3QsIGxlbik7Ci0KLQlpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhwcml2LCBmYWxzZSwgZmMsIGxlbik7Ci0JbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpOwotCi0JaWVlZTgwMjExX3J4KHByaXYtPmh3LCBza2IpOwotCXByaXYtPmFsbG9jX3J4Yl9wYWdlLS07Ci0JcnhiLT5wYWdlID0gTlVMTDsKLX0KLQotI2RlZmluZSBJV0xfREVMQVlfTkVYVF9TQ0FOX0FGVEVSX0FTU09DIChIWio2KQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X3JlcGx5X3J4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyOwotCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzIHJ4X3N0YXR1czsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9zdGF0cyAqcnhfc3RhdHMgPSBJV0xfUlhfU1RBVFMocGt0KTsKLQlzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9oZHIgKnJ4X2hkciA9IElXTF9SWF9IRFIocGt0KTsKLQlzdHJ1Y3QgaXdsMzk0NV9yeF9mcmFtZV9lbmQgKnJ4X2VuZCA9IElXTF9SWF9FTkQocGt0KTsKLQl1MTYgcnhfc3RhdHNfc2lnX2F2ZyBfX21heWJlX3VudXNlZCA9IGxlMTZfdG9fY3B1KHJ4X3N0YXRzLT5zaWdfYXZnKTsKLQl1MTYgcnhfc3RhdHNfbm9pc2VfZGlmZiBfX21heWJlX3VudXNlZCA9IGxlMTZfdG9fY3B1KHJ4X3N0YXRzLT5ub2lzZV9kaWZmKTsKLQl1OCBuZXR3b3JrX3BhY2tldDsKLQotCXJ4X3N0YXR1cy5mbGFnID0gMDsKLQlyeF9zdGF0dXMubWFjdGltZSA9IGxlNjRfdG9fY3B1KHJ4X2VuZC0+dGltZXN0YW1wKTsKLQlyeF9zdGF0dXMuYmFuZCA9IChyeF9oZHItPnBoeV9mbGFncyAmIFJYX1JFU19QSFlfRkxBR1NfQkFORF8yNF9NU0spID8KLQkJCQlJRUVFODAyMTFfQkFORF8yR0haIDogSUVFRTgwMjExX0JBTkRfNUdIWjsKLQlyeF9zdGF0dXMuZnJlcSA9Ci0JCWllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShsZTE2X3RvX2NwdShyeF9oZHItPmNoYW5uZWwpLAotCQkJCQkgICAgICAgcnhfc3RhdHVzLmJhbmQpOwotCi0Jcnhfc3RhdHVzLnJhdGVfaWR4ID0gaXdsMzk0NV9od3JhdGVfdG9fcGxjcF9pZHgocnhfaGRyLT5yYXRlKTsKLQlpZiAocnhfc3RhdHVzLmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJcnhfc3RhdHVzLnJhdGVfaWR4IC09IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0KLQlyeF9zdGF0dXMuYW50ZW5uYSA9IChsZTE2X3RvX2NwdShyeF9oZHItPnBoeV9mbGFncykgJgotCQkJCQlSWF9SRVNfUEhZX0ZMQUdTX0FOVEVOTkFfTVNLKSA+PiA0OwotCi0JLyogc2V0IHRoZSBwcmVhbWJsZSBmbGFnIGlmIGFwcHJvcHJpYXRlICovCi0JaWYgKHJ4X2hkci0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19TSE9SVF9QUkVBTUJMRV9NU0spCi0JCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7Ci0KLQlpZiAoKHVubGlrZWx5KHJ4X3N0YXRzLT5waHlfY291bnQgPiAyMCkpKSB7Ci0JCUlXTF9ERUJVR19EUk9QKHByaXYsICJkc3Agc2l6ZSBvdXQgb2YgcmFuZ2UgWzAsMjBdOiAlZC9uIiwKLQkJCQlyeF9zdGF0cy0+cGh5X2NvdW50KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghKHJ4X2VuZC0+c3RhdHVzICYgUlhfUkVTX1NUQVRVU19OT19DUkMzMl9FUlJPUikKLQkgICAgfHwgIShyeF9lbmQtPnN0YXR1cyAmIFJYX1JFU19TVEFUVVNfTk9fUlhFX09WRVJGTE9XKSkgewotCQlJV0xfREVCVUdfUlgocHJpdiwgIkJhZCBDUkMgb3IgRklGTzogMHglMDhYLlxuIiwgcnhfZW5kLT5zdGF0dXMpOwotCQlyZXR1cm47Ci0JfQotCi0KLQotCS8qIENvbnZlcnQgMzk0NSdzIHJzc2kgaW5kaWNhdG9yIHRvIGRCbSAqLwotCXJ4X3N0YXR1cy5zaWduYWwgPSByeF9zdGF0cy0+cnNzaSAtIElXTDM5X1JTU0lfT0ZGU0VUOwotCi0JSVdMX0RFQlVHX1NUQVRTKHByaXYsICJSc3NpICVkIHNpZ19hdmcgJWQgbm9pc2VfZGlmZiAlZFxuIiwKLQkJCXJ4X3N0YXR1cy5zaWduYWwsIHJ4X3N0YXRzX3NpZ19hdmcsCi0JCQlyeF9zdGF0c19ub2lzZV9kaWZmKTsKLQotCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKUlXTF9SWF9EQVRBKHBrdCk7Ci0KLQluZXR3b3JrX3BhY2tldCA9IGl3bDM5NDVfaXNfbmV0d29ya19wYWNrZXQocHJpdiwgaGVhZGVyKTsKLQotCUlXTF9ERUJVR19TVEFUU19MSU1JVChwcml2LCAiWyVjXSAlZCBSU1NJOiVkIFNpZ25hbDoldSwgUmF0ZToldVxuIiwKLQkJCSAgICAgIG5ldHdvcmtfcGFja2V0ID8gJyonIDogJyAnLAotCQkJICAgICAgbGUxNl90b19jcHUocnhfaGRyLT5jaGFubmVsKSwKLQkJCSAgICAgIHJ4X3N0YXR1cy5zaWduYWwsIHJ4X3N0YXR1cy5zaWduYWwsCi0JCQkgICAgICByeF9zdGF0dXMucmF0ZV9pZHgpOwotCi0JaXdsX2xlZ2FjeV9kYmdfbG9nX3J4X2RhdGFfZnJhbWUocHJpdiwgbGUxNl90b19jcHUocnhfaGRyLT5sZW4pLAotCQkJCQkJaGVhZGVyKTsKLQotCWlmIChuZXR3b3JrX3BhY2tldCkgewotCQlwcml2LT5fMzk0NS5sYXN0X2JlYWNvbl90aW1lID0KLQkJCWxlMzJfdG9fY3B1KHJ4X2VuZC0+YmVhY29uX3RpbWVzdGFtcCk7Ci0JCXByaXYtPl8zOTQ1Lmxhc3RfdHNmID0gbGU2NF90b19jcHUocnhfZW5kLT50aW1lc3RhbXApOwotCQlwcml2LT5fMzk0NS5sYXN0X3J4X3Jzc2kgPSByeF9zdGF0dXMuc2lnbmFsOwotCX0KLQotCWl3bDM5NDVfcGFzc19wYWNrZXRfdG9fbWFjODAyMTEocHJpdiwgcnhiLCAmcnhfc3RhdHVzKTsKLX0KLQotaW50IGl3bDM5NDVfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkgICAgIGRtYV9hZGRyX3QgYWRkciwgdTE2IGxlbiwgdTggcmVzZXQsIHU4IHBhZCkKLXsKLQlpbnQgY291bnQ7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcTsKLQlzdHJ1Y3QgaXdsMzk0NV90ZmQgKnRmZCwgKnRmZF90bXA7Ci0KLQlxID0gJnR4cS0+cTsKLQl0ZmRfdG1wID0gKHN0cnVjdCBpd2wzOTQ1X3RmZCAqKXR4cS0+dGZkczsKLQl0ZmQgPSAmdGZkX3RtcFtxLT53cml0ZV9wdHJdOwotCi0JaWYgKHJlc2V0KQotCQltZW1zZXQodGZkLCAwLCBzaXplb2YoKnRmZCkpOwotCi0JY291bnQgPSBURkRfQ1RMX0NPVU5UX0dFVChsZTMyX3RvX2NwdSh0ZmQtPmNvbnRyb2xfZmxhZ3MpKTsKLQotCWlmICgoY291bnQgPj0gTlVNX1RGRF9DSFVOS1MpIHx8IChjb3VudCA8IDApKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIGNhbiBub3Qgc2VuZCBtb3JlIHRoYW4gJWQgY2h1bmtzXG4iLAotCQkJICBOVU1fVEZEX0NIVU5LUyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXRmZC0+dGJzW2NvdW50XS5hZGRyID0gY3B1X3RvX2xlMzIoYWRkcik7Ci0JdGZkLT50YnNbY291bnRdLmxlbiA9IGNwdV90b19sZTMyKGxlbik7Ci0KLQljb3VudCsrOwotCi0JdGZkLT5jb250cm9sX2ZsYWdzID0gY3B1X3RvX2xlMzIoVEZEX0NUTF9DT1VOVF9TRVQoY291bnQpIHwKLQkJCQkJIFRGRF9DVExfUEFEX1NFVChwYWQpKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDM5NDVfaHdfdHhxX2ZyZWVfdGZkIC0gRnJlZSBvbmUgVEZELCB0aG9zZSBhdCBpbmRleCBbdHhxLT5xLnJlYWRfcHRyXQotICoKLSAqIERvZXMgTk9UIGFkdmFuY2UgYW55IGluZGV4ZXMKLSAqLwotdm9pZCBpd2wzOTQ1X2h3X3R4cV9mcmVlX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKLXsKLQlzdHJ1Y3QgaXdsMzk0NV90ZmQgKnRmZF90bXAgPSAoc3RydWN0IGl3bDM5NDVfdGZkICopdHhxLT50ZmRzOwotCWludCBpbmRleCA9IHR4cS0+cS5yZWFkX3B0cjsKLQlzdHJ1Y3QgaXdsMzk0NV90ZmQgKnRmZCA9ICZ0ZmRfdG1wW2luZGV4XTsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gcHJpdi0+cGNpX2RldjsKLQlpbnQgaTsKLQlpbnQgY291bnRlcjsKLQotCS8qIHNhbml0eSBjaGVjayAqLwotCWNvdW50ZXIgPSBURkRfQ1RMX0NPVU5UX0dFVChsZTMyX3RvX2NwdSh0ZmQtPmNvbnRyb2xfZmxhZ3MpKTsKLQlpZiAoY291bnRlciA+IE5VTV9URkRfQ0hVTktTKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlRvbyBtYW55IGNodW5rczogJWlcbiIsIGNvdW50ZXIpOwotCQkvKiBAdG9kbyBpc3N1ZSBmYXRhbCBlcnJvciwgaXQgaXMgcXVpdGUgc2VyaW91cyBzaXR1YXRpb24gKi8KLQkJcmV0dXJuOwotCX0KLQotCS8qIFVubWFwIHR4X2NtZCAqLwotCWlmIChjb3VudGVyKQotCQlwY2lfdW5tYXBfc2luZ2xlKGRldiwKLQkJCQlkbWFfdW5tYXBfYWRkcigmdHhxLT5tZXRhW2luZGV4XSwgbWFwcGluZyksCi0JCQkJZG1hX3VubWFwX2xlbigmdHhxLT5tZXRhW2luZGV4XSwgbGVuKSwKLQkJCQlQQ0lfRE1BX1RPREVWSUNFKTsKLQotCS8qIHVubWFwIGNodW5rcyBpZiBhbnkgKi8KLQotCWZvciAoaSA9IDE7IGkgPCBjb3VudGVyOyBpKyspCi0JCXBjaV91bm1hcF9zaW5nbGUoZGV2LCBsZTMyX3RvX2NwdSh0ZmQtPnRic1tpXS5hZGRyKSwKLQkJCSBsZTMyX3RvX2NwdSh0ZmQtPnRic1tpXS5sZW4pLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQotCS8qIGZyZWUgU0tCICovCi0JaWYgKHR4cS0+dHhiKSB7Ci0JCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQkJc2tiID0gdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2I7Ci0KLQkJLyogY2FuIGJlIGNhbGxlZCBmcm9tIGlycXMtZGlzYWJsZWQgY29udGV4dCAqLwotCQlpZiAoc2tiKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCQkJdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IgPSBOVUxMOwotCQl9Ci0JfQotfQotCi0vKioKLSAqIGl3bDM5NDVfaHdfYnVpbGRfdHhfY21kX3JhdGUgLSBBZGQgcmF0ZSBwb3J0aW9uIHRvIFRYX0NNRDoKLSAqCi0qLwotdm9pZCBpd2wzOTQ1X2h3X2J1aWxkX3R4X2NtZF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKLQkJCQkgIGludCBzdGFfaWQsIGludCB0eF9pZCkKLXsKLQl1MTYgaHdfdmFsdWUgPSBpZWVlODAyMTFfZ2V0X3R4X3JhdGUocHJpdi0+aHcsIGluZm8pLT5od192YWx1ZTsKLQl1MTYgcmF0ZV9pbmRleCA9IG1pbihod192YWx1ZSAmIDB4ZmZmZiwgSVdMX1JBVEVfQ09VTlRfMzk0NSk7Ci0JdTE2IHJhdGVfbWFzazsKLQlpbnQgcmF0ZTsKLQl1OCBydHNfcmV0cnlfbGltaXQ7Ci0JdTggZGF0YV9yZXRyeV9saW1pdDsKLQlfX2xlMzIgdHhfZmxhZ3M7Ci0JX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOwotCXN0cnVjdCBpd2wzOTQ1X3R4X2NtZCAqdHhfY21kID0gKHN0cnVjdCBpd2wzOTQ1X3R4X2NtZCAqKWNtZC0+Y21kLnBheWxvYWQ7Ci0KLQlyYXRlID0gaXdsMzk0NV9yYXRlc1tyYXRlX2luZGV4XS5wbGNwOwotCXR4X2ZsYWdzID0gdHhfY21kLT50eF9mbGFnczsKLQotCS8qIFdlIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gZ2V0IHRoZSBzdGEtPnN1cHBfcmF0ZXMgd2hpbGUKLQkgKiBpbiB0aGlzIHJ1bm5pbmcgY29udGV4dCAqLwotCXJhdGVfbWFzayA9IElXTF9SQVRFU19NQVNLXzM5NDU7Ci0KLQkvKiBTZXQgcmV0cnkgbGltaXQgb24gREFUQSBwYWNrZXRzIGFuZCBQcm9iZSBSZXNwb25zZXMqLwotCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpCi0JCWRhdGFfcmV0cnlfbGltaXQgPSAzOwotCWVsc2UKLQkJZGF0YV9yZXRyeV9saW1pdCA9IElXTF9ERUZBVUxUX1RYX1JFVFJZOwotCXR4X2NtZC0+ZGF0YV9yZXRyeV9saW1pdCA9IGRhdGFfcmV0cnlfbGltaXQ7Ci0KLQlpZiAodHhfaWQgPj0gSVdMMzlfQ01EX1FVRVVFX05VTSkKLQkJcnRzX3JldHJ5X2xpbWl0ID0gMzsKLQllbHNlCi0JCXJ0c19yZXRyeV9saW1pdCA9IDc7Ci0KLQlpZiAoZGF0YV9yZXRyeV9saW1pdCA8IHJ0c19yZXRyeV9saW1pdCkKLQkJcnRzX3JldHJ5X2xpbWl0ID0gZGF0YV9yZXRyeV9saW1pdDsKLQl0eF9jbWQtPnJ0c19yZXRyeV9saW1pdCA9IHJ0c19yZXRyeV9saW1pdDsKLQotCXR4X2NtZC0+cmF0ZSA9IHJhdGU7Ci0JdHhfY21kLT50eF9mbGFncyA9IHR4X2ZsYWdzOwotCi0JLyogT0ZETSAqLwotCXR4X2NtZC0+c3VwcF9yYXRlc1swXSA9Ci0JICAgKChyYXRlX21hc2sgJiBJV0xfT0ZETV9SQVRFU19NQVNLKSA+PiBJV0xfRklSU1RfT0ZETV9SQVRFKSAmIDB4RkY7Ci0KLQkvKiBDQ0sgKi8KLQl0eF9jbWQtPnN1cHBfcmF0ZXNbMV0gPSAocmF0ZV9tYXNrICYgMHhGKTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJUeCBzdGEgaWQ6ICVkLCByYXRlOiAlZCAocGxjcCksIGZsYWdzOiAweCU0WCAiCi0JCSAgICAgICAiY2NrL29mZG0gbWFzazogMHgleC8weCV4XG4iLCBzdGFfaWQsCi0JCSAgICAgICB0eF9jbWQtPnJhdGUsIGxlMzJfdG9fY3B1KHR4X2NtZC0+dHhfZmxhZ3MpLAotCQkgICAgICAgdHhfY21kLT5zdXBwX3JhdGVzWzFdLCB0eF9jbWQtPnN1cHBfcmF0ZXNbMF0pOwotfQotCi1zdGF0aWMgdTggaXdsMzk0NV9zeW5jX3N0YShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBzdGFfaWQsIHUxNiB0eF9yYXRlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3Nfc3BpbjsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fZW50cnkgKnN0YXRpb247Ci0KLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCi0JCXJldHVybiBJV0xfSU5WQUxJRF9TVEFUSU9OOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQlzdGF0aW9uID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF07Ci0KLQlzdGF0aW9uLT5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9UWF9SQVRFX01TSzsKLQlzdGF0aW9uLT5zdGEucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMTYodHhfcmF0ZSk7Ci0Jc3RhdGlvbi0+c3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOwotCWl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGF0aW9uLT5zdGEsIENNRF9BU1lOQyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNDQUxFIHN5bmMgc3RhdGlvbiAlZCB0byByYXRlICVkXG4iLAotCQkJc3RhX2lkLCB0eF9yYXRlKTsKLQlyZXR1cm4gc3RhX2lkOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3NldF9wd3Jfdm1haW4oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotLyoKLSAqIChmb3IgZG9jdW1lbnRhdGlvbiBwdXJwb3NlcykKLSAqIHRvIHNldCBwb3dlciB0byBWX0FVWCwgZG8KLQotCQlpZiAocGNpX3BtZV9jYXBhYmxlKHByaXYtPnBjaV9kZXYsIFBDSV9EM2NvbGQpKSB7Ci0JCQlpd2xfbGVnYWN5X3NldF9iaXRzX21hc2tfcHJwaChwcml2LCBBUE1HX1BTX0NUUkxfUkVHLAotCQkJCQlBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfVkFVWCwKLQkJCQkJfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7Ci0KLQkJCWl3bF9wb2xsX2JpdChwcml2LCBDU1JfR1BJT19JTiwKLQkJCQkgICAgIENTUl9HUElPX0lOX1ZBTF9WQVVYX1BXUl9TUkMsCi0JCQkJICAgICBDU1JfR1BJT19JTl9CSVRfQVVYX1BPV0VSLCA1MDAwKTsKLQkJfQotICovCi0KLQlpd2xfbGVnYWN5X3NldF9iaXRzX21hc2tfcHJwaChwcml2LCBBUE1HX1BTX0NUUkxfUkVHLAotCQkJQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZNQUlOLAotCQkJfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7Ci0KLQlpd2xfcG9sbF9iaXQocHJpdiwgQ1NSX0dQSU9fSU4sIENTUl9HUElPX0lOX1ZBTF9WTUFJTl9QV1JfU1JDLAotCQkgICAgIENTUl9HUElPX0lOX0JJVF9BVVhfUE9XRVIsIDUwMDApOwkvKiB1UyAqLwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfcnhfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSkKLXsKLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfUkNTUl9SQkRfQkFTRSgwKSwgcnhxLT5iZF9kbWEpOwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9SQ1NSX1JQVFJfQUREUigwKSwKLQkJCQkJcnhxLT5yYl9zdHRzX2RtYSk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSDM5X1JDU1JfV1BUUigwKSwgMCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSDM5X1JDU1JfQ09ORklHKDApLAotCQlGSDM5X1JDU1JfUlhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5fRU5BQkxFIHwKLQkJRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JEUkJEX0VOX0VOQUJMRSB8Ci0JCUZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX0JJVF9XUl9TVFRTX0VOIHwKLQkJRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX01BWF9GUkFHX1NJWkVfMTI4IHwKLQkJKFJYX1FVRVVFX1NJWkVfTE9HIDw8IEZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1BPU19SQkRDX1NJWkUpIHwKLQkJRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX0lSUV9ERVNUX0lOVF9IT1NUIHwKLQkJKDEgPDwgRkgzOV9SQ1NSX1JYX0NPTkZJR19SRUdfUE9TX0lSUV9SQlRIKSB8Ci0JCUZIMzlfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9NU0dfTU9ERV9GSCk7Ci0KLQkvKiBmYWtlIHJlYWQgdG8gZmx1c2ggYWxsIHByZXYgSS9PICovCi0JaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEZIMzlfUlNTUl9DVFJMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfdHhfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCi0JLyogYnlwYXNzIG1vZGUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9NT0RFX1JFRywgMHgyKTsKLQotCS8qIFJBIDAgaXMgYWN0aXZlICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFMTV9TQ0RfQVJBU1RBVF9SRUcsIDB4MDEpOwotCi0JLyogYWxsIDYgZmlmbyBhcmUgYWN0aXZlICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFMTV9TQ0RfVFhGQUNUX1JFRywgMHgzZik7Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9TQllQX01PREVfMV9SRUcsIDB4MDEwMDAwKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9TQllQX01PREVfMl9SRUcsIDB4MDMwMDAyKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQUxNX1NDRF9UWEY0TUZfUkVHLCAweDAwMDAwNCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFMTV9TQ0RfVFhGNU1GX1JFRywgMHgwMDAwMDUpOwotCi0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSDM5X1RTU1JfQ0JCX0JBU0UsCi0JCQkgICAgIHByaXYtPl8zOTQ1LnNoYXJlZF9waHlzKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9UU1NSX01TR19DT05GSUcsCi0JCUZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfU05PT1BfUkRfVFhQRF9PTiB8Ci0JCUZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfT1JERVJfUkRfVFhQRF9PTiB8Ci0JCUZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfTUFYX0ZSQUdfU0laRV8xMjhCIHwKLQkJRkgzOV9UU1NSX1RYX01TR19DT05GSUdfUkVHX1ZBTF9TTk9PUF9SRF9URkRfT04gfAotCQlGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX09SREVSX1JEX0NCQl9PTiB8Ci0JCUZIMzlfVFNTUl9UWF9NU0dfQ09ORklHX1JFR19WQUxfT1JERVJfUlNQX1dBSVRfVEggfAotCQlGSDM5X1RTU1JfVFhfTVNHX0NPTkZJR19SRUdfVkFMX1JTUF9XQUlUX1RIKTsKLQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsMzk0NV90eHFfY3R4X3Jlc2V0IC0gUmVzZXQgVFggcXVldWUgY29udGV4dAotICoKLSAqIERlc3Ryb3lzIGFsbCBETUEgc3RydWN0dXJlcyBhbmQgaW5pdGlhbGl6ZSB0aGVtIGFnYWluCi0gKi8KLXN0YXRpYyBpbnQgaXdsMzk0NV90eHFfY3R4X3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmM7Ci0JaW50IHR4cV9pZCwgc2xvdHNfbnVtOwotCi0JaXdsMzk0NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0KLQkvKiBhbGxvY2F0ZSB0eCBxdWV1ZSBzdHJ1Y3R1cmUgKi8KLQlyYyA9IGl3bF9sZWdhY3lfYWxsb2NfdHhxX21lbShwcml2KTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCS8qIFR4IENNRCBxdWV1ZSAqLwotCXJjID0gaXdsMzk0NV90eF9yZXNldChwcml2KTsKLQlpZiAocmMpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKiBUeCBxdWV1ZShzKSAqLwotCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykgewotCQlzbG90c19udW0gPSAodHhxX2lkID09IElXTDM5X0NNRF9RVUVVRV9OVU0pID8KLQkJCQlURkRfQ01EX1NMT1RTIDogVEZEX1RYX0NNRF9TTE9UUzsKLQkJcmMgPSBpd2xfbGVnYWN5X3R4X3F1ZXVlX2luaXQocHJpdiwgJnByaXYtPnR4cVt0eHFfaWRdLAotCQkJCQkJc2xvdHNfbnVtLCB0eHFfaWQpOwotCQlpZiAocmMpIHsKLQkJCUlXTF9FUlIocHJpdiwgIlR4ICVkIHF1ZXVlIGluaXQgZmFpbGVkXG4iLCB0eHFfaWQpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLQotIGVycm9yOgotCWl3bDM5NDVfaHdfdHhxX2N0eF9mcmVlKHByaXYpOwotCXJldHVybiByYzsKLX0KLQotCi0vKgotICogU3RhcnQgdXAgMzk0NSdzIGJhc2ljIGZ1bmN0aW9uYWxpdHkgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVzZXQKLSAqIChlLmcuIGFmdGVyIHBsYXRmb3JtIGJvb3QsIG9yIHNodXRkb3duIHZpYSBpd2xfbGVnYWN5X2FwbV9zdG9wKCkpCi0gKiBOT1RFOiAgVGhpcyBkb2VzIG5vdCBsb2FkIHVDb2RlIG5vciBzdGFydCB0aGUgZW1iZWRkZWQgcHJvY2Vzc29yCi0gKi8KLXN0YXRpYyBpbnQgaXdsMzk0NV9hcG1faW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IGl3bF9sZWdhY3lfYXBtX2luaXQocHJpdik7Ci0KLQkvKiBDbGVhciBBUE1HIChOSUMncyBpbnRlcm5hbCBwb3dlciBtYW5hZ2VtZW50KSBpbnRlcnJ1cHRzICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFQTUdfUlRDX0lOVF9NU0tfUkVHLCAweDApOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBUE1HX1JUQ19JTlRfU1RUX1JFRywgMHhGRkZGRkZGRik7Ci0KLQkvKiBSZXNldCByYWRpbyBjaGlwICovCi0JaXdsX2xlZ2FjeV9zZXRfYml0c19wcnBoKHByaXYsIEFQTUdfUFNfQ1RSTF9SRUcsCi0JCQkJQVBNR19QU19DVFJMX1ZBTF9SRVNFVF9SRVEpOwotCXVkZWxheSg1KTsKLQlpd2xfbGVnYWN5X2NsZWFyX2JpdHNfcHJwaChwcml2LCBBUE1HX1BTX0NUUkxfUkVHLAotCQkJCUFQTUdfUFNfQ1RSTF9WQUxfUkVTRVRfUkVRKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfbmljX2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggcmV2X2lkID0gcHJpdi0+cGNpX2Rldi0+cmV2aXNpb247Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogRGV0ZXJtaW5lIEhXIHR5cGUgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSFcgUmV2aXNpb24gSUQgPSAweCVYXG4iLCByZXZfaWQpOwotCi0JaWYgKHJldl9pZCAmIFBDSV9DRkdfUkVWX0lEX0JJVF9SVFApCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSVFAgdHlwZVxuIik7Ci0JZWxzZSBpZiAocmV2X2lkICYgUENJX0NGR19SRVZfSURfQklUX0JBU0lDX1NLVSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiMzk0NSBSQURJTy1NQiB0eXBlXG4iKTsKLQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJICAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUXzM5NDVfTUIpOwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICIzOTQ1IFJBRElPLU1NIHR5cGVcbiIpOwotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfMzk0NV9NTSk7Ci0JfQotCi0JaWYgKEVFUFJPTV9TS1VfQ0FQX09QX01PREVfTVJDID09IGVlcHJvbS0+c2t1X2NhcCkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU0tVIE9QIG1vZGUgaXMgbXJjXG4iKTsKLQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJICAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUX1NLVV9NUkMpOwotCX0gZWxzZQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU0tVIE9QIG1vZGUgaXMgYmFzaWNcbiIpOwotCi0JaWYgKChlZXByb20tPmJvYXJkX3JldmlzaW9uICYgMHhGMCkgPT0gMHhEMCkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiMzk0NUFCRyByZXZpc2lvbiBpcyAweCVYXG4iLAotCQkJICAgICAgIGVlcHJvbS0+Ym9hcmRfcmV2aXNpb24pOwotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRfQk9BUkRfVFlQRSk7Ci0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIjM5NDVBQkcgcmV2aXNpb24gaXMgMHglWFxuIiwKLQkJCSAgICAgICBlZXByb20tPmJvYXJkX3JldmlzaW9uKTsKLQkJaXdsX2xlZ2FjeV9jbGVhcl9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkgICAgICBDU1IzOV9IV19JRl9DT05GSUdfUkVHX0JJVF9CT0FSRF9UWVBFKTsKLQl9Ci0KLQlpZiAoZWVwcm9tLT5hbG1nb3JfbV92ZXJzaW9uIDw9IDEpIHsKLQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJICAgIENTUjM5X0hXX0lGX0NPTkZJR19SRUdfQklUU19TSUxJQ09OX1RZUEVfQSk7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJDYXJkIE0gdHlwZSBBIHZlcnNpb24gaXMgMHglWFxuIiwKLQkJCSAgICAgICBlZXByb20tPmFsbWdvcl9tX3ZlcnNpb24pOwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJDYXJkIE0gdHlwZSBCIHZlcnNpb24gaXMgMHglWFxuIiwKLQkJCSAgICAgICBlZXByb20tPmFsbWdvcl9tX3ZlcnNpb24pOwotCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkgICAgQ1NSMzlfSFdfSUZfQ09ORklHX1JFR19CSVRTX1NJTElDT05fVFlQRV9CKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKGVlcHJvbS0+c2t1X2NhcCAmIEVFUFJPTV9TS1VfQ0FQX1NXX1JGX0tJTExfRU5BQkxFKQotCQlJV0xfREVCVUdfUkZfS0lMTChwcml2LCAiU1cgUkYgS0lMTCBzdXBwb3J0ZWQgaW4gRUVQUk9NLlxuIik7Ci0KLQlpZiAoZWVwcm9tLT5za3VfY2FwICYgRUVQUk9NX1NLVV9DQVBfSFdfUkZfS0lMTF9FTkFCTEUpCi0JCUlXTF9ERUJVR19SRl9LSUxMKHByaXYsICJIVyBSRiBLSUxMIHN1cHBvcnRlZCBpbiBFRVBST00uXG4iKTsKLX0KLQotaW50IGl3bDM5NDVfaHdfbmljX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByYzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXByaXYtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuaW5pdChwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpd2wzOTQ1X3NldF9wd3Jfdm1haW4ocHJpdik7Ci0KLQlwcml2LT5jZmctPm9wcy0+bGliLT5hcG1fb3BzLmNvbmZpZyhwcml2KTsKLQotCS8qIEFsbG9jYXRlIHRoZSBSWCBxdWV1ZSwgb3IgcmVzZXQgaWYgaXQgaXMgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KLQlpZiAoIXJ4cS0+YmQpIHsKLQkJcmMgPSBpd2xfbGVnYWN5X3J4X3F1ZXVlX2FsbG9jKHByaXYpOwotCQlpZiAocmMpIHsKLQkJCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBpbml0aWFsaXplIFJ4IHF1ZXVlXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfSBlbHNlCi0JCWl3bDM5NDVfcnhfcXVldWVfcmVzZXQocHJpdiwgcnhxKTsKLQotCWl3bDM5NDVfcnhfcmVwbGVuaXNoKHByaXYpOwotCi0JaXdsMzk0NV9yeF9pbml0KHByaXYsIHJ4cSk7Ci0KLQotCS8qIExvb2sgYXQgdXNpbmcgdGhpcyBpbnN0ZWFkOgotCXJ4cS0+bmVlZF91cGRhdGUgPSAxOwotCWl3bF9sZWdhY3lfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihwcml2LCByeHEpOwotCSovCi0KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfUkNTUl9XUFRSKDApLCByeHEtPndyaXRlICYgfjcpOwotCi0JcmMgPSBpd2wzOTQ1X3R4cV9jdHhfcmVzZXQocHJpdik7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlzZXRfYml0KFNUQVRVU19JTklULCAmcHJpdi0+c3RhdHVzKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDM5NDVfaHdfdHhxX2N0eF9mcmVlIC0gRnJlZSBUWFEgQ29udGV4dAotICoKLSAqIERlc3Ryb3kgYWxsIFRYIERNQSBxdWV1ZXMgYW5kIHN0cnVjdHVyZXMKLSAqLwotdm9pZCBpd2wzOTQ1X2h3X3R4cV9jdHhfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHR4cV9pZDsKLQotCS8qIFR4IHF1ZXVlcyAqLwotCWlmIChwcml2LT50eHEpCi0JCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOwotCQkgICAgIHR4cV9pZCsrKQotCQkJaWYgKHR4cV9pZCA9PSBJV0wzOV9DTURfUVVFVUVfTlVNKQotCQkJCWl3bF9sZWdhY3lfY21kX3F1ZXVlX2ZyZWUocHJpdik7Ci0JCQllbHNlCi0JCQkJaXdsX2xlZ2FjeV90eF9xdWV1ZV9mcmVlKHByaXYsIHR4cV9pZCk7Ci0KLQkvKiBmcmVlIHR4IHF1ZXVlIHN0cnVjdHVyZSAqLwotCWl3bF9sZWdhY3lfdHhxX21lbShwcml2KTsKLX0KLQotdm9pZCBpd2wzOTQ1X2h3X3R4cV9jdHhfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHR4cV9pZDsKLQotCS8qIHN0b3AgU0NEICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFMTV9TQ0RfTU9ERV9SRUcsIDApOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBBTE1fU0NEX1RYRkFDVF9SRUcsIDApOwotCi0JLyogcmVzZXQgVEZEIHF1ZXVlcyAqLwotCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykgewotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfVENTUl9DT05GSUcodHhxX2lkKSwgMHgwKTsKLQkJaXdsX3BvbGxfZGlyZWN0X2JpdChwcml2LCBGSDM5X1RTU1JfVFhfU1RBVFVTLAotCQkJCUZIMzlfVFNTUl9UWF9TVEFUVVNfUkVHX01TS19DSE5MX0lETEUodHhxX2lkKSwKLQkJCQkxMDAwKTsKLQl9Ci0KLQlpd2wzOTQ1X2h3X3R4cV9jdHhfZnJlZShwcml2KTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2h3X3JlZ19hZGp1c3RfcG93ZXJfYnlfdGVtcAotICogcmV0dXJuIGluZGV4IGRlbHRhIGludG8gcG93ZXIgZ2FpbiBzZXR0aW5ncyB0YWJsZQotKi8KLXN0YXRpYyBpbnQgaXdsMzk0NV9od19yZWdfYWRqdXN0X3Bvd2VyX2J5X3RlbXAoaW50IG5ld19yZWFkaW5nLCBpbnQgb2xkX3JlYWRpbmcpCi17Ci0JcmV0dXJuIChuZXdfcmVhZGluZyAtIG9sZF9yZWFkaW5nKSAqICgtMTEpIC8gMTAwOwotfQotCi0vKioKLSAqIGl3bDM5NDVfaHdfcmVnX3RlbXBfb3V0X29mX3JhbmdlIC0gS2VlcCB0ZW1wZXJhdHVyZSBpbiBzYW5lIHJhbmdlCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGl3bDM5NDVfaHdfcmVnX3RlbXBfb3V0X29mX3JhbmdlKGludCB0ZW1wZXJhdHVyZSkKLXsKLQlyZXR1cm4gKCh0ZW1wZXJhdHVyZSA8IC0yNjApIHx8ICh0ZW1wZXJhdHVyZSA+IDI1KSkgPyAxIDogMDsKLX0KLQotaW50IGl3bDM5NDVfaHdfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlyZXR1cm4gaXdsX3JlYWQzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMik7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfdHhwb3dlcl9nZXRfdGVtcGVyYXR1cmUKLSAqIGdldCB0aGUgY3VycmVudCB0ZW1wZXJhdHVyZSBieSByZWFkaW5nIGZyb20gTklDCi0qLwotc3RhdGljIGludCBpd2wzOTQ1X2h3X3JlZ190eHBvd2VyX2dldF90ZW1wZXJhdHVyZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCWludCB0ZW1wZXJhdHVyZTsKLQotCXRlbXBlcmF0dXJlID0gaXdsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUocHJpdik7Ci0KLQkvKiBkcml2ZXIncyBva2F5IHJhbmdlIGlzIC0yNjAgdG8gKzI1LgotCSAqICAgaHVtYW4gcmVhZGFibGUgb2theSByYW5nZSBpcyAwIHRvICsyODUgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVGVtcGVyYXR1cmU6ICVkXG4iLCB0ZW1wZXJhdHVyZSArIElXTF9URU1QX0NPTlZFUlQpOwotCi0JLyogaGFuZGxlIGluc2FuZSB0ZW1wIHJlYWRpbmcgKi8KLQlpZiAoaXdsMzk0NV9od19yZWdfdGVtcF9vdXRfb2ZfcmFuZ2UodGVtcGVyYXR1cmUpKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIGJhZCB0ZW1wZXJhdHVyZSB2YWx1ZSAgJWRcbiIsIHRlbXBlcmF0dXJlKTsKLQotCQkvKiBpZiByZWFsbHkgcmVhbGx5IGhvdCg/KSwKLQkJICogICBzdWJzdGl0dXRlIHRoZSAzcmQgYmFuZC9ncm91cCdzIHRlbXAgbWVhc3VyZWQgYXQgZmFjdG9yeSAqLwotCQlpZiAocHJpdi0+bGFzdF90ZW1wZXJhdHVyZSA+IDEwMCkKLQkJCXRlbXBlcmF0dXJlID0gZWVwcm9tLT5ncm91cHNbMl0udGVtcGVyYXR1cmU7Ci0JCWVsc2UgLyogZWxzZSB1c2UgbW9zdCByZWNlbnQgInNhbmUiIHZhbHVlIGZyb20gZHJpdmVyICovCi0JCQl0ZW1wZXJhdHVyZSA9IHByaXYtPmxhc3RfdGVtcGVyYXR1cmU7Ci0JfQotCi0JcmV0dXJuIHRlbXBlcmF0dXJlOwkvKiByYXcsIG5vdCAiaHVtYW4gcmVhZGFibGUiICovCi19Ci0KLS8qIEFkanVzdCBUeHBvd2VyIG9ubHkgaWYgdGVtcGVyYXR1cmUgdmFyaWFuY2UgaXMgZ3JlYXRlciB0aGFuIHRocmVzaG9sZC4KLSAqCi0gKiBCb3RoIGFyZSBsb3dlciB0aGFuIG9sZGVyIHZlcnNpb25zJyA5IGRlZ3JlZXMgKi8KLSNkZWZpbmUgSVdMX1RFTVBFUkFUVVJFX0xJTUlUX1RJTUVSICAgNgotCi0vKioKLSAqIGl3bDM5NDVfaXNfdGVtcF9jYWxpYl9uZWVkZWQgLSBkZXRlcm1pbmVzIGlmIG5ldyBjYWxpYnJhdGlvbiBpcyBuZWVkZWQKLSAqCi0gKiByZWNvcmRzIG5ldyB0ZW1wZXJhdHVyZSBpbiB0eF9tZ3ItPnRlbXBlcmF0dXJlLgotICogcmVwbGFjZXMgdHhfbWdyLT5sYXN0X3RlbXBlcmF0dXJlICpvbmx5KiBpZiBjYWxpYiBuZWVkZWQKLSAqICAgIChhc3N1bWVzIGNhbGxlciB3aWxsIGFjdHVhbGx5IGRvIHRoZSBjYWxpYnJhdGlvbiEpLiAqLwotc3RhdGljIGludCBpd2wzOTQ1X2lzX3RlbXBfY2FsaWJfbmVlZGVkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgdGVtcF9kaWZmOwotCi0JcHJpdi0+dGVtcGVyYXR1cmUgPSBpd2wzOTQ1X2h3X3JlZ190eHBvd2VyX2dldF90ZW1wZXJhdHVyZShwcml2KTsKLQl0ZW1wX2RpZmYgPSBwcml2LT50ZW1wZXJhdHVyZSAtIHByaXYtPmxhc3RfdGVtcGVyYXR1cmU7Ci0KLQkvKiBnZXQgYWJzb2x1dGUgdmFsdWUgKi8KLQlpZiAodGVtcF9kaWZmIDwgMCkgewotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkdldHRpbmcgY29vbGVyLCBkZWx0YSAlZCxcbiIsIHRlbXBfZGlmZik7Ci0JCXRlbXBfZGlmZiA9IC10ZW1wX2RpZmY7Ci0JfSBlbHNlIGlmICh0ZW1wX2RpZmYgPT0gMCkKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJTYW1lIHRlbXAsXG4iKTsKLQllbHNlCi0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiR2V0dGluZyB3YXJtZXIsIGRlbHRhICVkLFxuIiwgdGVtcF9kaWZmKTsKLQotCS8qIGlmIHdlIGRvbid0IG5lZWQgY2FsaWJyYXRpb24sICpkb24ndCogdXBkYXRlIGxhc3RfdGVtcGVyYXR1cmUgKi8KLQlpZiAodGVtcF9kaWZmIDwgSVdMX1RFTVBFUkFUVVJFX0xJTUlUX1RJTUVSKSB7Ci0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiVGltZWQgdGhlcm1hbCBjYWxpYiBub3QgbmVlZGVkXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJUaW1lZCB0aGVybWFsIGNhbGliIG5lZWRlZFxuIik7Ci0KLQkvKiBhc3N1bWUgdGhhdCBjYWxsZXIgd2lsbCBhY3R1YWxseSBkbyBjYWxpYiAuLi4KLQkgKiAgIHVwZGF0ZSB0aGUgImxhc3QgdGVtcGVyYXR1cmUiIHZhbHVlICovCi0JcHJpdi0+bGFzdF90ZW1wZXJhdHVyZSA9IHByaXYtPnRlbXBlcmF0dXJlOwotCXJldHVybiAxOwotfQotCi0jZGVmaW5lIElXTF9NQVhfR0FJTl9FTlRSSUVTIDc4Ci0jZGVmaW5lIElXTF9DQ0tfRlJPTV9PRkRNX1BPV0VSX0RJRkYgIC01Ci0jZGVmaW5lIElXTF9DQ0tfRlJPTV9PRkRNX0lOREVYX0RJRkYgKDEwKQotCi0vKiByYWRpbyBhbmQgRFNQIHBvd2VyIHRhYmxlLCBlYWNoIHN0ZXAgaXMgMS8yIGRCLgotICogMXN0IG51bWJlciBpcyBmb3IgUkYgYW5hbG9nIGdhaW4sIDJuZCBudW1iZXIgaXMgZm9yIERTUCBwcmUtREFDIGdhaW4uICovCi1zdGF0aWMgc3RydWN0IGl3bDM5NDVfdHhfcG93ZXIgcG93ZXJfZ2Fpbl90YWJsZVsyXVtJV0xfTUFYX0dBSU5fRU5UUklFU10gPSB7Ci0JewotCSB7MjUxLCAxMjd9LAkJLyogMi40IEdIeiwgaGlnaGVzdCBwb3dlciAqLwotCSB7MjUxLCAxMjd9LAotCSB7MjUxLCAxMjd9LAotCSB7MjUxLCAxMjd9LAotCSB7MjUxLCAxMjV9LAotCSB7MjUxLCAxMTB9LAotCSB7MjUxLCAxMDV9LAotCSB7MjUxLCA5OH0sCi0JIHsxODcsIDEyNX0sCi0JIHsxODcsIDExNX0sCi0JIHsxODcsIDEwOH0sCi0JIHsxODcsIDk5fSwKLQkgezI0MywgMTE5fSwKLQkgezI0MywgMTExfSwKLQkgezI0MywgMTA1fSwKLQkgezI0MywgOTd9LAotCSB7MjQzLCA5Mn0sCi0JIHsyMTEsIDEwNn0sCi0JIHsyMTEsIDEwMH0sCi0JIHsxNzksIDEyMH0sCi0JIHsxNzksIDExM30sCi0JIHsxNzksIDEwN30sCi0JIHsxNDcsIDEyNX0sCi0JIHsxNDcsIDExOX0sCi0JIHsxNDcsIDExMn0sCi0JIHsxNDcsIDEwNn0sCi0JIHsxNDcsIDEwMX0sCi0JIHsxNDcsIDk3fSwKLQkgezE0NywgOTF9LAotCSB7MTE1LCAxMDd9LAotCSB7MjM1LCAxMjF9LAotCSB7MjM1LCAxMTV9LAotCSB7MjM1LCAxMDl9LAotCSB7MjAzLCAxMjd9LAotCSB7MjAzLCAxMjF9LAotCSB7MjAzLCAxMTV9LAotCSB7MjAzLCAxMDh9LAotCSB7MjAzLCAxMDJ9LAotCSB7MjAzLCA5Nn0sCi0JIHsyMDMsIDkyfSwKLQkgezE3MSwgMTEwfSwKLQkgezE3MSwgMTA0fSwKLQkgezE3MSwgOTh9LAotCSB7MTM5LCAxMTZ9LAotCSB7MjI3LCAxMjV9LAotCSB7MjI3LCAxMTl9LAotCSB7MjI3LCAxMTN9LAotCSB7MjI3LCAxMDd9LAotCSB7MjI3LCAxMDF9LAotCSB7MjI3LCA5Nn0sCi0JIHsxOTUsIDExM30sCi0JIHsxOTUsIDEwNn0sCi0JIHsxOTUsIDEwMn0sCi0JIHsxOTUsIDk1fSwKLQkgezE2MywgMTEzfSwKLQkgezE2MywgMTA2fSwKLQkgezE2MywgMTAyfSwKLQkgezE2MywgOTV9LAotCSB7MTMxLCAxMTN9LAotCSB7MTMxLCAxMDZ9LAotCSB7MTMxLCAxMDJ9LAotCSB7MTMxLCA5NX0sCi0JIHs5OSwgMTEzfSwKLQkgezk5LCAxMDZ9LAotCSB7OTksIDEwMn0sCi0JIHs5OSwgOTV9LAotCSB7NjcsIDExM30sCi0JIHs2NywgMTA2fSwKLQkgezY3LCAxMDJ9LAotCSB7NjcsIDk1fSwKLQkgezM1LCAxMTN9LAotCSB7MzUsIDEwNn0sCi0JIHszNSwgMTAyfSwKLQkgezM1LCA5NX0sCi0JIHszLCAxMTN9LAotCSB7MywgMTA2fSwKLQkgezMsIDEwMn0sCi0JIHszLCA5NX0gfSwJCS8qIDIuNCBHSHosIGxvd2VzdCBwb3dlciAqLwotCXsKLQkgezI1MSwgMTI3fSwJCS8qIDUueCBHSHosIGhpZ2hlc3QgcG93ZXIgKi8KLQkgezI1MSwgMTIwfSwKLQkgezI1MSwgMTE0fSwKLQkgezIxOSwgMTE5fSwKLQkgezIxOSwgMTAxfSwKLQkgezE4NywgMTEzfSwKLQkgezE4NywgMTAyfSwKLQkgezE1NSwgMTE0fSwKLQkgezE1NSwgMTAzfSwKLQkgezEyMywgMTE3fSwKLQkgezEyMywgMTA3fSwKLQkgezEyMywgOTl9LAotCSB7MTIzLCA5Mn0sCi0JIHs5MSwgMTA4fSwKLQkgezU5LCAxMjV9LAotCSB7NTksIDExOH0sCi0JIHs1OSwgMTA5fSwKLQkgezU5LCAxMDJ9LAotCSB7NTksIDk2fSwKLQkgezU5LCA5MH0sCi0JIHsyNywgMTA0fSwKLQkgezI3LCA5OH0sCi0JIHsyNywgOTJ9LAotCSB7MTE1LCAxMTh9LAotCSB7MTE1LCAxMTF9LAotCSB7MTE1LCAxMDR9LAotCSB7ODMsIDEyNn0sCi0JIHs4MywgMTIxfSwKLQkgezgzLCAxMTN9LAotCSB7ODMsIDEwNX0sCi0JIHs4MywgOTl9LAotCSB7NTEsIDExOH0sCi0JIHs1MSwgMTExfSwKLQkgezUxLCAxMDR9LAotCSB7NTEsIDk4fSwKLQkgezE5LCAxMTZ9LAotCSB7MTksIDEwOX0sCi0JIHsxOSwgMTAyfSwKLQkgezE5LCA5OH0sCi0JIHsxOSwgOTN9LAotCSB7MTcxLCAxMTN9LAotCSB7MTcxLCAxMDd9LAotCSB7MTcxLCA5OX0sCi0JIHsxMzksIDEyMH0sCi0JIHsxMzksIDExM30sCi0JIHsxMzksIDEwN30sCi0JIHsxMzksIDk5fSwKLQkgezEwNywgMTIwfSwKLQkgezEwNywgMTEzfSwKLQkgezEwNywgMTA3fSwKLQkgezEwNywgOTl9LAotCSB7NzUsIDEyMH0sCi0JIHs3NSwgMTEzfSwKLQkgezc1LCAxMDd9LAotCSB7NzUsIDk5fSwKLQkgezQzLCAxMjB9LAotCSB7NDMsIDExM30sCi0JIHs0MywgMTA3fSwKLQkgezQzLCA5OX0sCi0JIHsxMSwgMTIwfSwKLQkgezExLCAxMTN9LAotCSB7MTEsIDEwN30sCi0JIHsxMSwgOTl9LAotCSB7MTMxLCAxMDd9LAotCSB7MTMxLCA5OX0sCi0JIHs5OSwgMTIwfSwKLQkgezk5LCAxMTN9LAotCSB7OTksIDEwN30sCi0JIHs5OSwgOTl9LAotCSB7NjcsIDEyMH0sCi0JIHs2NywgMTEzfSwKLQkgezY3LCAxMDd9LAotCSB7NjcsIDk5fSwKLQkgezM1LCAxMjB9LAotCSB7MzUsIDExM30sCi0JIHszNSwgMTA3fSwKLQkgezM1LCA5OX0sCi0JIHszLCAxMjB9IH0JCS8qIDUueCBHSHosIGxvd2VzdCBwb3dlciAqLwotfTsKLQotc3RhdGljIGlubGluZSB1OCBpd2wzOTQ1X2h3X3JlZ19maXhfcG93ZXJfaW5kZXgoaW50IGluZGV4KQotewotCWlmIChpbmRleCA8IDApCi0JCXJldHVybiAwOwotCWlmIChpbmRleCA+PSBJV0xfTUFYX0dBSU5fRU5UUklFUykKLQkJcmV0dXJuIElXTF9NQVhfR0FJTl9FTlRSSUVTIC0gMTsKLQlyZXR1cm4gKHU4KSBpbmRleDsKLX0KLQotLyogS2ljayBvZmYgdGhlcm1hbCByZWNhbGlicmF0aW9uIGNoZWNrIGV2ZXJ5IDYwIHNlY29uZHMgKi8KLSNkZWZpbmUgUkVHX1JFQ0FMSUJfUEVSSU9EICg2MCkKLQotLyoqCi0gKiBpd2wzOTQ1X2h3X3JlZ19zZXRfc2Nhbl9wb3dlciAtIFNldCBUeCBwb3dlciBmb3Igc2NhbiBwcm9iZSByZXF1ZXN0cwotICoKLSAqIFNldCAoaW4gb3VyIGNoYW5uZWwgaW5mbyBkYXRhYmFzZSkgdGhlIGRpcmVjdCBzY2FuIFR4IHBvd2VyIGZvciAxIE1iaXQgKENDSykKLSAqIG9yIDYgTWJpdCAoT0ZETSkgcmF0ZXMuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfaHdfcmVnX3NldF9zY2FuX3Bvd2VyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHNjYW5fdGJsX2luZGV4LAotCQkJICAgICAgIHMzMiByYXRlX2luZGV4LCBjb25zdCBzOCAqY2xpcF9wd3JzLAotCQkJICAgICAgIHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvLAotCQkJICAgICAgIGludCBiYW5kX2luZGV4KQotewotCXN0cnVjdCBpd2wzOTQ1X3NjYW5fcG93ZXJfaW5mbyAqc2Nhbl9wb3dlcl9pbmZvOwotCXM4IHBvd2VyOwotCXU4IHBvd2VyX2luZGV4OwotCi0Jc2Nhbl9wb3dlcl9pbmZvID0gJmNoX2luZm8tPnNjYW5fcHdyX2luZm9bc2Nhbl90YmxfaW5kZXhdOwotCi0JLyogdXNlIHRoaXMgY2hhbm5lbCBncm91cCdzIDZNYml0IGNsaXBwaW5nL3NhdHVyYXRpb24gcHdyLAotCSAqICAgYnV0IGNhcCBhdCByZWd1bGF0b3J5IHNjYW4gcG93ZXIgcmVzdHJpY3Rpb24gKHNldCBkdXJpbmcgaW5pdAotCSAqICAgYmFzZWQgb24gZWVwcm9tIGNoYW5uZWwgZGF0YSkgZm9yIHRoaXMgY2hhbm5lbC4gICovCi0JcG93ZXIgPSBtaW4oY2hfaW5mby0+c2Nhbl9wb3dlciwgY2xpcF9wd3JzW0lXTF9SQVRFXzZNX0lOREVYX1RBQkxFXSk7Ci0KLQlwb3dlciA9IG1pbihwb3dlciwgcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQpOwotCXNjYW5fcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcG93ZXI7Ci0KLQkvKiBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBuZXcgc2NhbiAqcG93ZXIqIGFuZCBjdXJyZW50ICJub3JtYWwiCi0JICogICBUeCAqcG93ZXIqIGZvciA2TWIuICBVc2UgdGhpcyBkaWZmZXJlbmNlICh4MikgdG8gYWRqdXN0IHRoZQotCSAqICAgY3VycmVudCAibm9ybWFsIiB0ZW1wZXJhdHVyZS1jb21wZW5zYXRlZCBUeCBwb3dlciAqaW5kZXgqIGZvcgotCSAqICAgdGhpcyByYXRlICgxTWIgb3IgNk1iKSB0byB5aWVsZCBuZXcgdGVtcC1jb21wZW5zYXRlZCBzY2FuIHBvd2VyCi0JICogICAqaW5kZXgqLiAqLwotCXBvd2VyX2luZGV4ID0gY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2luZGV4XS5wb3dlcl90YWJsZV9pbmRleAotCSAgICAtIChwb3dlciAtIGNoX2luZm8tPnBvd2VyX2luZm8KLQkgICAgICAgW0lXTF9SQVRFXzZNX0lOREVYX1RBQkxFXS5yZXF1ZXN0ZWRfcG93ZXIpICogMjsKLQotCS8qIHN0b3JlIHJlZmVyZW5jZSBpbmRleCB0aGF0IHdlIHVzZSB3aGVuIGFkanVzdGluZyAqYWxsKiBzY2FuCi0JICogICBwb3dlcnMuICBTbyB3ZSBjYW4gYWNjb21tb2RhdGUgdXNlciAoYWxsIGNoYW5uZWwpIG9yIHNwZWN0cnVtCi0JICogICBtYW5hZ2VtZW50IChzaW5nbGUgY2hhbm5lbCkgcG93ZXIgY2hhbmdlcyAiYmV0d2VlbiIgdGVtcGVyYXR1cmUKLQkgKiAgIGZlZWRiYWNrIGNvbXBlbnNhdGlvbiBwcm9jZWR1cmVzLgotCSAqIGRvbid0IGZvcmNlIGZpdCB0aGlzIHJlZmVyZW5jZSBpbmRleCBpbnRvIGdhaW4gdGFibGU7IGl0IG1heSBiZSBhCi0JICogICBuZWdhdGl2ZSBudW1iZXIuICBUaGlzIHdpbGwgaGVscCBhdm9pZCBlcnJvcnMgd2hlbiB3ZSdyZSBhdAotCSAqICAgdGhlIGxvd2VyIGJvdW5kcyAoaGlnaGVzdCBnYWlucywgZm9yIHdhcm1lc3QgdGVtcGVyYXR1cmVzKQotCSAqICAgb2YgdGhlIHRhYmxlLiAqLwotCi0JLyogZG9uJ3QgZXhjZWVkIHRhYmxlIGJvdW5kcyBmb3IgInJlYWwiIHNldHRpbmcgKi8KLQlwb3dlcl9pbmRleCA9IGl3bDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pbmRleChwb3dlcl9pbmRleCk7Ci0KLQlzY2FuX3Bvd2VyX2luZm8tPnBvd2VyX3RhYmxlX2luZGV4ID0gcG93ZXJfaW5kZXg7Ci0Jc2Nhbl9wb3dlcl9pbmZvLT50cGMudHhfZ2FpbiA9Ci0JICAgIHBvd2VyX2dhaW5fdGFibGVbYmFuZF9pbmRleF1bcG93ZXJfaW5kZXhdLnR4X2dhaW47Ci0Jc2Nhbl9wb3dlcl9pbmZvLT50cGMuZHNwX2F0dGVuID0KLQkgICAgcG93ZXJfZ2Fpbl90YWJsZVtiYW5kX2luZGV4XVtwb3dlcl9pbmRleF0uZHNwX2F0dGVuOwotfQotCi0vKioKLSAqIGl3bDM5NDVfc2VuZF90eF9wb3dlciAtIGZpbGwgaW4gVHggUG93ZXIgY29tbWFuZCB3aXRoIGdhaW4gc2V0dGluZ3MKLSAqCi0gKiBDb25maWd1cmVzIHBvd2VyIHNldHRpbmdzIGZvciBhbGwgcmF0ZXMgZm9yIHRoZSBjdXJyZW50IGNoYW5uZWwsCi0gKiB1c2luZyB2YWx1ZXMgZnJvbSBjaGFubmVsIGluZm8gc3RydWN0LCBhbmQgc2VuZCB0byBOSUMKLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3NlbmRfdHhfcG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByYXRlX2lkeCwgaTsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGl3bDM5NDVfdHhwb3dlcnRhYmxlX2NtZCB0eHBvd2VyID0gewotCQkuY2hhbm5lbCA9IHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5jaGFubmVsLAotCX07Ci0JdTE2IGNoYW47Ci0KLQlpZiAoV0FSTl9PTkNFKHRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKSwKLQkJICAgICAgIlRYIFBvd2VyIHJlcXVlc3RlZCB3aGlsZSBzY2FubmluZyFcbiIpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWNoYW4gPSBsZTE2X3RvX2NwdShwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5hY3RpdmUuY2hhbm5lbCk7Ci0KLQl0eHBvd2VyLmJhbmQgPSAocHJpdi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSA/IDAgOiAxOwotCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgcHJpdi0+YmFuZCwgY2hhbik7Ci0JaWYgKCFjaF9pbmZvKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJGYWlsZWQgdG8gZ2V0IGNoYW5uZWwgaW5mbyBmb3IgY2hhbm5lbCAlZCBbJWRdXG4iLAotCQkJY2hhbiwgcHJpdi0+YmFuZCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7Ci0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiTm90IGNhbGxpbmcgVFhfUFdSX1RBQkxFX0NNRCBvbiAiCi0JCQkJIm5vbi1UeCBjaGFubmVsLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIGZpbGwgY21kIHdpdGggcG93ZXIgc2V0dGluZ3MgZm9yIGFsbCByYXRlcyBmb3IgY3VycmVudCBjaGFubmVsICovCi0JLyogRmlsbCBPRkRNIHJhdGUgKi8KLQlmb3IgKHJhdGVfaWR4ID0gSVdMX0ZJUlNUX09GRE1fUkFURSwgaSA9IDA7Ci0JICAgICByYXRlX2lkeCA8PSBJV0wzOV9MQVNUX09GRE1fUkFURTsgcmF0ZV9pZHgrKywgaSsrKSB7Ci0KLQkJdHhwb3dlci5wb3dlcltpXS50cGMgPSBjaF9pbmZvLT5wb3dlcl9pbmZvW2ldLnRwYzsKLQkJdHhwb3dlci5wb3dlcltpXS5yYXRlID0gaXdsMzk0NV9yYXRlc1tyYXRlX2lkeF0ucGxjcDsKLQotCQlJV0xfREVCVUdfUE9XRVIocHJpdiwgImNoICVkOiVkIHJmICVkIGRzcCAlM2QgcmF0ZSBjb2RlIDB4JTAyeFxuIiwKLQkJCQlsZTE2X3RvX2NwdSh0eHBvd2VyLmNoYW5uZWwpLAotCQkJCXR4cG93ZXIuYmFuZCwKLQkJCQl0eHBvd2VyLnBvd2VyW2ldLnRwYy50eF9nYWluLAotCQkJCXR4cG93ZXIucG93ZXJbaV0udHBjLmRzcF9hdHRlbiwKLQkJCQl0eHBvd2VyLnBvd2VyW2ldLnJhdGUpOwotCX0KLQkvKiBGaWxsIENDSyByYXRlcyAqLwotCWZvciAocmF0ZV9pZHggPSBJV0xfRklSU1RfQ0NLX1JBVEU7Ci0JICAgICByYXRlX2lkeCA8PSBJV0xfTEFTVF9DQ0tfUkFURTsgcmF0ZV9pZHgrKywgaSsrKSB7Ci0JCXR4cG93ZXIucG93ZXJbaV0udHBjID0gY2hfaW5mby0+cG93ZXJfaW5mb1tpXS50cGM7Ci0JCXR4cG93ZXIucG93ZXJbaV0ucmF0ZSA9IGl3bDM5NDVfcmF0ZXNbcmF0ZV9pZHhdLnBsY3A7Ci0KLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJjaCAlZDolZCByZiAlZCBkc3AgJTNkIHJhdGUgY29kZSAweCUwMnhcbiIsCi0JCQkJbGUxNl90b19jcHUodHhwb3dlci5jaGFubmVsKSwKLQkJCQl0eHBvd2VyLmJhbmQsCi0JCQkJdHhwb3dlci5wb3dlcltpXS50cGMudHhfZ2FpbiwKLQkJCQl0eHBvd2VyLnBvd2VyW2ldLnRwYy5kc3BfYXR0ZW4sCi0JCQkJdHhwb3dlci5wb3dlcltpXS5yYXRlKTsKLQl9Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfVFhfUFdSX1RBQkxFX0NNRCwKLQkJCQlzaXplb2Yoc3RydWN0IGl3bDM5NDVfdHhwb3dlcnRhYmxlX2NtZCksCi0JCQkJJnR4cG93ZXIpOwotCi19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfc2V0X25ld19wb3dlciAtIENvbmZpZ3VyZXMgcG93ZXIgdGFibGVzIGF0IG5ldyBsZXZlbHMKLSAqIEBjaF9pbmZvOiBDaGFubmVsIHRvIHVwZGF0ZS4gIFVzZXMgcG93ZXJfaW5mby5yZXF1ZXN0ZWRfcG93ZXIuCi0gKgotICogUmVwbGFjZSByZXF1ZXN0ZWRfcG93ZXIgYW5kIGJhc2VfcG93ZXJfaW5kZXggY2hfaW5mbyBmaWVsZHMgZm9yCi0gKiBvbmUgY2hhbm5lbC4KLSAqCi0gKiBDYWxsZWQgaWYgdXNlciBvciBzcGVjdHJ1bSBtYW5hZ2VtZW50IGNoYW5nZXMgcG93ZXIgcHJlZmVyZW5jZXMuCi0gKiBUYWtlcyBpbnRvIGFjY291bnQgaC93IGFuZCBtb2R1bGF0aW9uIGxpbWl0YXRpb25zIChjbGlwIHBvd2VyKS4KLSAqCi0gKiBUaGlzIGRvZXMgKm5vdCogc2VuZCBhbnl0aGluZyB0byBOSUMsIGp1c3Qgc2V0cyB1cCBjaF9pbmZvIGZvciBvbmUgY2hhbm5lbC4KLSAqCi0gKiBOT1RFOiByZWdfY29tcGVuc2F0ZV9mb3JfdGVtcGVyYXR1cmVfZGlmKCkgKm11c3QqIGJlIHJ1biBhZnRlciB0aGlzIHRvCi0gKgkgcHJvcGVybHkgZmlsbCBvdXQgdGhlIHNjYW4gcG93ZXJzLCBhbmQgYWN0dWFsIGgvdyBnYWluIHNldHRpbmdzLAotICoJIGFuZCBzZW5kIGNoYW5nZXMgdG8gTklDCi0gKi8KLXN0YXRpYyBpbnQgaXdsMzk0NV9od19yZWdfc2V0X25ld19wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvKQotewotCXN0cnVjdCBpd2wzOTQ1X2NoYW5uZWxfcG93ZXJfaW5mbyAqcG93ZXJfaW5mbzsKLQlpbnQgcG93ZXJfY2hhbmdlZCA9IDA7Ci0JaW50IGk7Ci0JY29uc3QgczggKmNsaXBfcHdyczsKLQlpbnQgcG93ZXI7Ci0KLQkvKiBHZXQgdGhpcyBjaG5sZ3JwJ3MgcmF0ZS10by1tYXgvY2xpcC1wb3dlcnMgdGFibGUgKi8KLQljbGlwX3B3cnMgPSBwcml2LT5fMzk0NS5jbGlwX2dyb3Vwc1tjaF9pbmZvLT5ncm91cF9pbmRleF0uY2xpcF9wb3dlcnM7Ci0KLQkvKiBHZXQgdGhpcyBjaGFubmVsJ3MgcmF0ZS10by1jdXJyZW50LXBvd2VyIHNldHRpbmdzIHRhYmxlICovCi0JcG93ZXJfaW5mbyA9IGNoX2luZm8tPnBvd2VyX2luZm87Ci0KLQkvKiB1cGRhdGUgT0ZETSBUeHBvd2VyIHNldHRpbmdzICovCi0JZm9yIChpID0gSVdMX1JBVEVfNk1fSU5ERVhfVEFCTEU7IGkgPD0gSVdMX1JBVEVfNTRNX0lOREVYX1RBQkxFOwotCSAgICAgaSsrLCArK3Bvd2VyX2luZm8pIHsKLQkJaW50IGRlbHRhX2lkeDsKLQotCQkvKiBsaW1pdCBuZXcgcG93ZXIgdG8gYmUgbm8gbW9yZSB0aGFuIGgvdyBjYXBhYmlsaXR5ICovCi0JCXBvd2VyID0gbWluKGNoX2luZm8tPmN1cnJfdHhwb3csIGNsaXBfcHdyc1tpXSk7Ci0JCWlmIChwb3dlciA9PSBwb3dlcl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIpCi0JCQljb250aW51ZTsKLQotCQkvKiBmaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBvbGQgYW5kIG5ldyByZXF1ZXN0ZWQgcG93ZXJzLAotCQkgKiAgICB1cGRhdGUgYmFzZSAobm9uLXRlbXAtY29tcGVuc2F0ZWQpIHBvd2VyIGluZGV4ICovCi0JCWRlbHRhX2lkeCA9IChwb3dlciAtIHBvd2VyX2luZm8tPnJlcXVlc3RlZF9wb3dlcikgKiAyOwotCQlwb3dlcl9pbmZvLT5iYXNlX3Bvd2VyX2luZGV4IC09IGRlbHRhX2lkeDsKLQotCQkvKiBzYXZlIG5ldyByZXF1ZXN0ZWQgcG93ZXIgdmFsdWUgKi8KLQkJcG93ZXJfaW5mby0+cmVxdWVzdGVkX3Bvd2VyID0gcG93ZXI7Ci0KLQkJcG93ZXJfY2hhbmdlZCA9IDE7Ci0JfQotCi0JLyogdXBkYXRlIENDSyBUeHBvd2VyIHNldHRpbmdzLCBiYXNlZCBvbiBPRkRNIDEyTSBzZXR0aW5nIC4uLgotCSAqICAgIC4uLiBhbGwgQ0NLIHBvd2VyIHNldHRpbmdzIGZvciBhIGdpdmVuIGNoYW5uZWwgYXJlIHRoZSAqc2FtZSouICovCi0JaWYgKHBvd2VyX2NoYW5nZWQpIHsKLQkJcG93ZXIgPQotCQkgICAgY2hfaW5mby0+cG93ZXJfaW5mb1tJV0xfUkFURV8xMk1fSU5ERVhfVEFCTEVdLgotCQkgICAgcmVxdWVzdGVkX3Bvd2VyICsgSVdMX0NDS19GUk9NX09GRE1fUE9XRVJfRElGRjsKLQotCQkvKiBkbyBhbGwgQ0NLIHJhdGVzJyBpd2wzOTQ1X2NoYW5uZWxfcG93ZXJfaW5mbyBzdHJ1Y3R1cmVzICovCi0JCWZvciAoaSA9IElXTF9SQVRFXzFNX0lOREVYX1RBQkxFOyBpIDw9IElXTF9SQVRFXzExTV9JTkRFWF9UQUJMRTsgaSsrKSB7Ci0JCQlwb3dlcl9pbmZvLT5yZXF1ZXN0ZWRfcG93ZXIgPSBwb3dlcjsKLQkJCXBvd2VyX2luZm8tPmJhc2VfcG93ZXJfaW5kZXggPQotCQkJICAgIGNoX2luZm8tPnBvd2VyX2luZm9bSVdMX1JBVEVfMTJNX0lOREVYX1RBQkxFXS4KLQkJCSAgICBiYXNlX3Bvd2VyX2luZGV4ICsgSVdMX0NDS19GUk9NX09GRE1fSU5ERVhfRElGRjsKLQkJCSsrcG93ZXJfaW5mbzsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDM5NDVfaHdfcmVnX2dldF9jaF90eHBvd2VyX2xpbWl0IC0gcmV0dXJucyBuZXcgcG93ZXIgbGltaXQgZm9yIGNoYW5uZWwKLSAqCi0gKiBOT1RFOiBSZXR1cm5lZCBwb3dlciBsaW1pdCBtYXkgYmUgbGVzcyAoYnV0IG5vdCBtb3JlKSB0aGFuIHJlcXVlc3RlZCwKLSAqCSBiYXNlZCBzdHJpY3RseSBvbiByZWd1bGF0b3J5IChlZXByb20gYW5kIHNwZWN0cnVtIG1ndCkgbGltaXRhdGlvbnMKLSAqCSAobm8gY29uc2lkZXJhdGlvbiBmb3IgaC93IGNsaXBwaW5nIGxpbWl0YXRpb25zKS4KLSAqLwotc3RhdGljIGludCBpd2wzOTQ1X2h3X3JlZ19nZXRfY2hfdHhwb3dlcl9saW1pdChzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbykKLXsKLQlzOCBtYXhfcG93ZXI7Ci0KLSNpZiAwCi0JLyogaWYgd2UncmUgdXNpbmcgVEdkIGxpbWl0cywgdXNlIGxvd2VyIG9mIFRHZCBvciBFRVBST00gKi8KLQlpZiAoY2hfaW5mby0+dGdkX2RhdGEubWF4X3Bvd2VyICE9IDApCi0JCW1heF9wb3dlciA9IG1pbihjaF9pbmZvLT50Z2RfZGF0YS5tYXhfcG93ZXIsCi0JCQkJY2hfaW5mby0+ZWVwcm9tLm1heF9wb3dlcl9hdmcpOwotCi0JLyogZWxzZSBqdXN0IHVzZSBFRVBST00gbGltaXRzICovCi0JZWxzZQotI2VuZGlmCi0JCW1heF9wb3dlciA9IGNoX2luZm8tPmVlcHJvbS5tYXhfcG93ZXJfYXZnOwotCi0JcmV0dXJuIG1pbihtYXhfcG93ZXIsIGNoX2luZm8tPm1heF9wb3dlcl9hdmcpOwotfQotCi0vKioKLSAqIGl3bDM5NDVfaHdfcmVnX2NvbXBfdHhwb3dlcl90ZW1wIC0gQ29tcGVuc2F0ZSBmb3IgdGVtcGVyYXR1cmUKLSAqCi0gKiBDb21wZW5zYXRlIHR4cG93ZXIgc2V0dGluZ3Mgb2YgKmFsbCogY2hhbm5lbHMgZm9yIHRlbXBlcmF0dXJlLgotICogVGhpcyBvbmx5IGFjY291bnRzIGZvciB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgdGVtcGVyYXR1cmUKLSAqICAgYW5kIHRoZSBmYWN0b3J5IGNhbGlicmF0aW9uIHRlbXBlcmF0dXJlcywgYW5kIGJhc2VzIHRoZSBuZXcgc2V0dGluZ3MKLSAqICAgb24gdGhlIGNoYW5uZWwncyBiYXNlX3Bvd2VyX2luZGV4LgotICoKLSAqIElmIFJ4T24gaXMgImFzc29jaWF0ZWQiLCB0aGlzIHNlbmRzIHRoZSBuZXcgVHhwb3dlciB0byBOSUMhCi0gKi8KLXN0YXRpYyBpbnQgaXdsMzk0NV9od19yZWdfY29tcF90eHBvd2VyX3RlbXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvID0gTlVMTDsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JaW50IGRlbHRhX2luZGV4OwotCWNvbnN0IHM4ICpjbGlwX3B3cnM7IC8qIGFycmF5IG9mIGgvdyBtYXggcG93ZXIgbGV2ZWxzIGZvciBlYWNoIHJhdGUgKi8KLQl1OCBhX2JhbmQ7Ci0JdTggcmF0ZV9pbmRleDsKLQl1OCBzY2FuX3RibF9pbmRleDsKLQl1OCBpOwotCWludCByZWZfdGVtcDsKLQlpbnQgdGVtcGVyYXR1cmUgPSBwcml2LT50ZW1wZXJhdHVyZTsKLQotCWlmIChwcml2LT5kaXNhYmxlX3R4X3Bvd2VyX2NhbCB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCS8qIGRvIG5vdCBwZXJmb3JtIHR4IHBvd2VyIGNhbGlicmF0aW9uICovCi0JCXJldHVybiAwOwotCX0KLQkvKiBzZXQgdXAgbmV3IFR4IHBvd2VyIGluZm8gZm9yIGVhY2ggYW5kIGV2ZXJ5IGNoYW5uZWwsIDIuNCBhbmQgNS54ICovCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPmNoYW5uZWxfY291bnQ7IGkrKykgewotCQljaF9pbmZvID0gJnByaXYtPmNoYW5uZWxfaW5mb1tpXTsKLQkJYV9iYW5kID0gaXdsX2xlZ2FjeV9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKTsKLQotCQkvKiBHZXQgdGhpcyBjaG5sZ3JwJ3MgZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZSAqLwotCQlyZWZfdGVtcCA9IChzMTYpZWVwcm9tLT5ncm91cHNbY2hfaW5mby0+Z3JvdXBfaW5kZXhdLgotCQkgICAgdGVtcGVyYXR1cmU7Ci0KLQkJLyogZ2V0IHBvd2VyIGluZGV4IGFkanVzdG1lbnQgYmFzZWQgb24gY3VycmVudCBhbmQgZmFjdG9yeQotCQkgKiB0ZW1wcyAqLwotCQlkZWx0YV9pbmRleCA9IGl3bDM5NDVfaHdfcmVnX2FkanVzdF9wb3dlcl9ieV90ZW1wKHRlbXBlcmF0dXJlLAotCQkJCQkJCSAgICAgIHJlZl90ZW1wKTsKLQotCQkvKiBzZXQgdHggcG93ZXIgdmFsdWUgZm9yIGFsbCByYXRlcywgT0ZETSBhbmQgQ0NLICovCi0JCWZvciAocmF0ZV9pbmRleCA9IDA7IHJhdGVfaW5kZXggPCBJV0xfUkFURV9DT1VOVF8zOTQ1OwotCQkgICAgIHJhdGVfaW5kZXgrKykgewotCQkJaW50IHBvd2VyX2lkeCA9Ci0JCQkgICAgY2hfaW5mby0+cG93ZXJfaW5mb1tyYXRlX2luZGV4XS5iYXNlX3Bvd2VyX2luZGV4OwotCi0JCQkvKiB0ZW1wZXJhdHVyZSBjb21wZW5zYXRlICovCi0JCQlwb3dlcl9pZHggKz0gZGVsdGFfaW5kZXg7Ci0KLQkJCS8qIHN0YXkgd2l0aGluIHRhYmxlIHJhbmdlICovCi0JCQlwb3dlcl9pZHggPSBpd2wzOTQ1X2h3X3JlZ19maXhfcG93ZXJfaW5kZXgocG93ZXJfaWR4KTsKLQkJCWNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pbmRleF0uCi0JCQkgICAgcG93ZXJfdGFibGVfaW5kZXggPSAodTgpIHBvd2VyX2lkeDsKLQkJCWNoX2luZm8tPnBvd2VyX2luZm9bcmF0ZV9pbmRleF0udHBjID0KLQkJCSAgICBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcG93ZXJfaWR4XTsKLQkJfQotCi0JCS8qIEdldCB0aGlzIGNobmxncnAncyByYXRlLXRvLW1heC9jbGlwLXBvd2VycyB0YWJsZSAqLwotCQljbGlwX3B3cnMgPSBwcml2LT5fMzk0NS5jbGlwX2dyb3Vwc1tjaF9pbmZvLT5ncm91cF9pbmRleF0uY2xpcF9wb3dlcnM7Ci0KLQkJLyogc2V0IHNjYW4gdHggcG93ZXIsIDFNYml0IGZvciBDQ0ssIDZNYml0IGZvciBPRkRNICovCi0JCWZvciAoc2Nhbl90YmxfaW5kZXggPSAwOwotCQkgICAgIHNjYW5fdGJsX2luZGV4IDwgSVdMX05VTV9TQ0FOX1JBVEVTOyBzY2FuX3RibF9pbmRleCsrKSB7Ci0JCQlzMzIgYWN0dWFsX2luZGV4ID0gKHNjYW5fdGJsX2luZGV4ID09IDApID8KLQkJCSAgICBJV0xfUkFURV8xTV9JTkRFWF9UQUJMRSA6IElXTF9SQVRFXzZNX0lOREVYX1RBQkxFOwotCQkJaXdsMzk0NV9od19yZWdfc2V0X3NjYW5fcG93ZXIocHJpdiwgc2Nhbl90YmxfaW5kZXgsCi0JCQkJCSAgIGFjdHVhbF9pbmRleCwgY2xpcF9wd3JzLAotCQkJCQkgICBjaF9pbmZvLCBhX2JhbmQpOwotCQl9Ci0JfQotCi0JLyogc2VuZCBUeHBvd2VyIGNvbW1hbmQgZm9yIGN1cnJlbnQgY2hhbm5lbCB0byB1Y29kZSAqLwotCXJldHVybiBwcml2LT5jZmctPm9wcy0+bGliLT5zZW5kX3R4X3Bvd2VyKHByaXYpOwotfQotCi1pbnQgaXdsMzk0NV9od19yZWdfc2V0X3R4cG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzOCBwb3dlcikKLXsKLQlzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQlzOCBtYXhfcG93ZXI7Ci0JdTggYV9iYW5kOwotCXU4IGk7Ci0KLQlpZiAocHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQgPT0gcG93ZXIpIHsKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJSZXF1ZXN0ZWQgVHggcG93ZXIgc2FtZSBhcyBjdXJyZW50ICIKLQkJCQkibGltaXQ6ICVkZEJtLlxuIiwgcG93ZXIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlNldHRpbmcgdXBwZXIgbGltaXQgY2xhbXAgdG8gJWRkQm0uXG4iLCBwb3dlcik7Ci0JcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQgPSBwb3dlcjsKLQotCS8qIHNldCB1cCBuZXcgVHggcG93ZXJzIGZvciBlYWNoIGFuZCBldmVyeSBjaGFubmVsLCAyLjQgYW5kIDUueCAqLwotCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPmNoYW5uZWxfY291bnQ7IGkrKykgewotCQljaF9pbmZvID0gJnByaXYtPmNoYW5uZWxfaW5mb1tpXTsKLQkJYV9iYW5kID0gaXdsX2xlZ2FjeV9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKTsKLQotCQkvKiBmaW5kIG1pbmltdW0gcG93ZXIgb2YgYWxsIHVzZXIgYW5kIHJlZ3VsYXRvcnkgY29uc3RyYWludHMKLQkJICogICAgKGRvZXMgbm90IGNvbnNpZGVyIGgvdyBjbGlwcGluZyBsaW1pdGF0aW9ucykgKi8KLQkJbWF4X3Bvd2VyID0gaXdsMzk0NV9od19yZWdfZ2V0X2NoX3R4cG93ZXJfbGltaXQoY2hfaW5mbyk7Ci0JCW1heF9wb3dlciA9IG1pbihwb3dlciwgbWF4X3Bvd2VyKTsKLQkJaWYgKG1heF9wb3dlciAhPSBjaF9pbmZvLT5jdXJyX3R4cG93KSB7Ci0JCQljaF9pbmZvLT5jdXJyX3R4cG93ID0gbWF4X3Bvd2VyOwotCi0JCQkvKiB0aGlzIGNvbnNpZGVycyB0aGUgaC93IGNsaXBwaW5nIGxpbWl0YXRpb25zICovCi0JCQlpd2wzOTQ1X2h3X3JlZ19zZXRfbmV3X3Bvd2VyKHByaXYsIGNoX2luZm8pOwotCQl9Ci0JfQotCi0JLyogdXBkYXRlIHR4cG93ZXIgc2V0dGluZ3MgZm9yIGFsbCBjaGFubmVscywKLQkgKiAgIHNlbmQgdG8gTklDIGlmIGFzc29jaWF0ZWQuICovCi0JaXdsMzk0NV9pc190ZW1wX2NhbGliX25lZWRlZChwcml2KTsKLQlpd2wzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcChwcml2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfc2VuZF9yeG9uX2Fzc29jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCWludCByYyA9IDA7Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdDsKLQlzdHJ1Y3QgaXdsMzk0NV9yeG9uX2Fzc29jX2NtZCByeG9uX2Fzc29jOwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9SWE9OX0FTU09DLAotCQkubGVuID0gc2l6ZW9mKHJ4b25fYXNzb2MpLAotCQkuZmxhZ3MgPSBDTURfV0FOVF9TS0IsCi0JCS5kYXRhID0gJnJ4b25fYXNzb2MsCi0JfTsKLQljb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqcnhvbjEgPSAmY3R4LT5zdGFnaW5nOwotCWNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICpyeG9uMiA9ICZjdHgtPmFjdGl2ZTsKLQotCWlmICgocnhvbjEtPmZsYWdzID09IHJ4b24yLT5mbGFncykgJiYKLQkgICAgKHJ4b24xLT5maWx0ZXJfZmxhZ3MgPT0gcnhvbjItPmZpbHRlcl9mbGFncykgJiYKLQkgICAgKHJ4b24xLT5jY2tfYmFzaWNfcmF0ZXMgPT0gcnhvbjItPmNja19iYXNpY19yYXRlcykgJiYKLQkgICAgKHJ4b24xLT5vZmRtX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5vZmRtX2Jhc2ljX3JhdGVzKSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVXNpbmcgY3VycmVudCBSWE9OX0FTU09DLiAgTm90IHJlc2VuZGluZy5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyeG9uX2Fzc29jLmZsYWdzID0gY3R4LT5zdGFnaW5nLmZsYWdzOwotCXJ4b25fYXNzb2MuZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKLQlyeG9uX2Fzc29jLm9mZG1fYmFzaWNfcmF0ZXMgPSBjdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlczsKLQlyeG9uX2Fzc29jLmNja19iYXNpY19yYXRlcyA9IGN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXM7Ci0Jcnhvbl9hc3NvYy5yZXNlcnZlZCA9IDA7Ci0KLQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfc3luYyhwcml2LCAmY21kKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQotCXBrdCA9IChzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqKWNtZC5yZXBseV9wYWdlOwotCWlmIChwa3QtPmhkci5mbGFncyAmIElXTF9DTURfRkFJTEVEX01TSykgewotCQlJV0xfRVJSKHByaXYsICJCYWQgcmV0dXJuIGZyb20gUkVQTFlfUlhPTl9BU1NPQyBjb21tYW5kXG4iKTsKLQkJcmMgPSAtRUlPOwotCX0KLQotCWl3bF9sZWdhY3lfZnJlZV9wYWdlcyhwcml2LCBjbWQucmVwbHlfcGFnZSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9jb21taXRfcnhvbiAtIGNvbW1pdCBzdGFnaW5nX3J4b24gdG8gaGFyZHdhcmUKLSAqCi0gKiBUaGUgUlhPTiBjb21tYW5kIGluIHN0YWdpbmdfcnhvbiBpcyBjb21taXR0ZWQgdG8gdGhlIGhhcmR3YXJlIGFuZAotICogdGhlIGFjdGl2ZV9yeG9uIHN0cnVjdHVyZSBpcyB1cGRhdGVkIHdpdGggdGhlIG5ldyBkYXRhLiAgVGhpcwotICogZnVuY3Rpb24gY29ycmVjdGx5IHRyYW5zaXRpb25zIG91dCBvZiB0aGUgUlhPTl9BU1NPQ19NU0sgc3RhdGUgaWYKLSAqIGEgSFcgdHVuZSBpcyByZXF1aXJlZCBiYXNlZCBvbiB0aGUgUlhPTiBzdHJ1Y3R1cmUgY2hhbmdlcy4KLSAqLwotaW50IGl3bDM5NDVfY29tbWl0X3J4b24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCS8qIGNhc3QgYXdheSB0aGUgY29uc3QgZm9yIGFjdGl2ZV9yeG9uIGluIHRoaXMgZnVuY3Rpb24gKi8KLQlzdHJ1Y3QgaXdsMzk0NV9yeG9uX2NtZCAqYWN0aXZlX3J4b24gPSAodm9pZCAqKSZjdHgtPmFjdGl2ZTsKLQlzdHJ1Y3QgaXdsMzk0NV9yeG9uX2NtZCAqc3RhZ2luZ19yeG9uID0gKHZvaWQgKikmY3R4LT5zdGFnaW5nOwotCWludCByYyA9IDA7Ci0JYm9vbCBuZXdfYXNzb2MgPSAhIShzdGFnaW5nX3J4b24tPmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSyk7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLTE7Ci0KLQkvKiBhbHdheXMgZ2V0IHRpbWVzdGFtcCB3aXRoIFJ4IGZyYW1lICovCi0Jc3RhZ2luZ19yeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19UU0YySE9TVF9NU0s7Ci0KLQkvKiBzZWxlY3QgYW50ZW5uYSAqLwotCXN0YWdpbmdfcnhvbi0+ZmxhZ3MgJj0KLQkgICAgfihSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9TRUxfTVNLKTsKLQlzdGFnaW5nX3J4b24tPmZsYWdzIHw9IGl3bDM5NDVfZ2V0X2FudGVubmFfZmxhZ3MocHJpdik7Ci0KLQlyYyA9IGl3bF9sZWdhY3lfY2hlY2tfcnhvbl9jbWQocHJpdiwgY3R4KTsKLQlpZiAocmMpIHsKLQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBSWE9OIGNvbmZpZ3VyYXRpb24uICBOb3QgY29tbWl0dGluZy5cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBJZiB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgYSBmdWxsIFJYT04sIHdlIGNhbiB1c2UKLQkgKiBpd2wzOTQ1X3J4b25fYXNzb2NfY21kIHdoaWNoIGlzIHVzZWQgdG8gcmVjb25maWd1cmUgZmlsdGVyCi0JICogYW5kIG90aGVyIGZsYWdzIGZvciB0aGUgY3VycmVudCByYWRpbyBjb25maWd1cmF0aW9uLiAqLwotCWlmICghaXdsX2xlZ2FjeV9mdWxsX3J4b25fcmVxdWlyZWQocHJpdiwKLQkJCSZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSkpIHsKLQkJcmMgPSBpd2xfbGVnYWN5X3NlbmRfcnhvbl9hc3NvYyhwcml2LAotCQkJCQkgJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKLQkJaWYgKHJjKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIFJYT05fQVNTT0MgIgotCQkJCSAgImNvbmZpZ3VyYXRpb24gKCVkKS5cbiIsIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCi0JCW1lbWNweShhY3RpdmVfcnhvbiwgc3RhZ2luZ19yeG9uLCBzaXplb2YoKmFjdGl2ZV9yeG9uKSk7Ci0JCS8qCi0JCSAqIFdlIGRvIG5vdCBjb21taXQgdHggcG93ZXIgc2V0dGluZ3Mgd2hpbGUgY2hhbm5lbCBjaGFuZ2luZywKLQkJICogZG8gaXQgbm93IGlmIHR4IHBvd2VyIGNoYW5nZWQuCi0JCSAqLwotCQlpd2xfbGVnYWN5X3NldF90eF9wb3dlcihwcml2LCBwcml2LT50eF9wb3dlcl9uZXh0LCBmYWxzZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIElmIHdlIGFyZSBjdXJyZW50bHkgYXNzb2NpYXRlZCBhbmQgdGhlIG5ldyBjb25maWcgcmVxdWlyZXMKLQkgKiBhbiBSWE9OX0FTU09DIGFuZCB0aGUgbmV3IGNvbmZpZyB3YW50cyB0aGUgYXNzb2NpYXRlZCBtYXNrIGVuYWJsZWQsCi0JICogd2UgbXVzdCBjbGVhciB0aGUgYXNzb2NpYXRlZCBmcm9tIHRoZSBhY3RpdmUgY29uZmlndXJhdGlvbgotCSAqIGJlZm9yZSB3ZSBhcHBseSB0aGUgbmV3IGNvbmZpZyAqLwotCWlmIChpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQocHJpdiwgSVdMX1JYT05fQ1RYX0JTUykgJiYgbmV3X2Fzc29jKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJUb2dnbGluZyBhc3NvY2lhdGVkIGJpdCBvbiBjdXJyZW50IFJYT05cbiIpOwotCQlhY3RpdmVfcnhvbi0+ZmlsdGVyX2ZsYWdzICY9IH5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0KLQkJLyoKLQkJICogcmVzZXJ2ZWQ0IGFuZCA1IGNvdWxkIGhhdmUgYmVlbiBmaWxsZWQgYnkgdGhlIGl3bGNvcmUgY29kZS4KLQkJICogTGV0J3MgY2xlYXIgdGhlbSBiZWZvcmUgcHVzaGluZyB0byB0aGUgMzk0NS4KLQkJICovCi0JCWFjdGl2ZV9yeG9uLT5yZXNlcnZlZDQgPSAwOwotCQlhY3RpdmVfcnhvbi0+cmVzZXJ2ZWQ1ID0gMDsKLQkJcmMgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBSRVBMWV9SWE9OLAotCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9yeG9uX2NtZCksCi0JCQkJICAgICAgJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZSk7Ci0KLQkJLyogSWYgdGhlIG1hc2sgY2xlYXJpbmcgZmFpbGVkIHRoZW4gd2Ugc2V0Ci0JCSAqIGFjdGl2ZV9yeG9uIGJhY2sgdG8gd2hhdCBpdCB3YXMgcHJldmlvdXNseSAqLwotCQlpZiAocmMpIHsKLQkJCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCQkJSVdMX0VSUihwcml2LCAiRXJyb3IgY2xlYXJpbmcgQVNTT0NfTVNLIG9uIGN1cnJlbnQgIgotCQkJCSAgImNvbmZpZ3VyYXRpb24gKCVkKS5cbiIsIHJjKTsKLQkJCXJldHVybiByYzsKLQkJfQotCQlpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zKHByaXYsCi0JCQkJCSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10pOwotCQlpd2xfbGVnYWN5X3Jlc3RvcmVfc3RhdGlvbnMocHJpdiwKLQkJCQkJICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0JfQotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlNlbmRpbmcgUlhPTlxuIgotCQkgICAgICAgIiogd2l0aCVzIFJYT05fRklMVEVSX0FTU09DX01TS1xuIgotCQkgICAgICAgIiogY2hhbm5lbCA9ICVkXG4iCi0JCSAgICAgICAiKiBic3NpZCA9ICVwTVxuIiwKLQkJICAgICAgIChuZXdfYXNzb2MgPyAiIiA6ICJvdXQiKSwKLQkJICAgICAgIGxlMTZfdG9fY3B1KHN0YWdpbmdfcnhvbi0+Y2hhbm5lbCksCi0JCSAgICAgICBzdGFnaW5nX3J4b24tPmJzc2lkX2FkZHIpOwotCi0JLyoKLQkgKiByZXNlcnZlZDQgYW5kIDUgY291bGQgaGF2ZSBiZWVuIGZpbGxlZCBieSB0aGUgaXdsY29yZSBjb2RlLgotCSAqIExldCdzIGNsZWFyIHRoZW0gYmVmb3JlIHB1c2hpbmcgdG8gdGhlIDM5NDUuCi0JICovCi0Jc3RhZ2luZ19yeG9uLT5yZXNlcnZlZDQgPSAwOwotCXN0YWdpbmdfcnhvbi0+cmVzZXJ2ZWQ1ID0gMDsKLQotCWl3bF9sZWdhY3lfc2V0X3J4b25faHdjcnlwdG8ocHJpdiwgY3R4LCAhaXdsMzk0NV9tb2RfcGFyYW1zLnN3X2NyeXB0byk7Ci0KLQkvKiBBcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gKi8KLQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1JYT04sCi0JCQkgICAgICBzaXplb2Yoc3RydWN0IGl3bDM5NDVfcnhvbl9jbWQpLAotCQkJICAgICAgc3RhZ2luZ19yeG9uKTsKLQlpZiAocmMpIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2V0dGluZyBuZXcgY29uZmlndXJhdGlvbiAoJWQpLlxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JbWVtY3B5KGFjdGl2ZV9yeG9uLCBzdGFnaW5nX3J4b24sIHNpemVvZigqYWN0aXZlX3J4b24pKTsKLQotCWlmICghbmV3X2Fzc29jKSB7Ci0JCWl3bF9sZWdhY3lfY2xlYXJfdWNvZGVfc3RhdGlvbnMocHJpdiwKLQkJCQkJICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0JCWl3bF9sZWdhY3lfcmVzdG9yZV9zdGF0aW9ucyhwcml2LAotCQkJCQkmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10pOwotCX0KLQotCS8qIElmIHdlIGlzc3VlIGEgbmV3IFJYT04gY29tbWFuZCB3aGljaCByZXF1aXJlZCBhIHR1bmUgdGhlbiB3ZSBtdXN0Ci0JICogc2VuZCBhIG5ldyBUWFBPV0VSIGNvbW1hbmQgb3Igd2Ugd29uJ3QgYmUgYWJsZSB0byBUeCBhbnkgZnJhbWVzICovCi0JcmMgPSBpd2xfbGVnYWN5X3NldF90eF9wb3dlcihwcml2LCBwcml2LT50eF9wb3dlcl9uZXh0LCB0cnVlKTsKLQlpZiAocmMpIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2V0dGluZyBUeCBwb3dlciAoJWQpLlxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JLyogSW5pdCB0aGUgaGFyZHdhcmUncyByYXRlIGZhbGxiYWNrIG9yZGVyIGJhc2VkIG9uIHRoZSBiYW5kICovCi0JcmMgPSBpd2wzOTQ1X2luaXRfaHdfcmF0ZV90YWJsZShwcml2KTsKLQlpZiAocmMpIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3Igc2V0dGluZyBIVyByYXRlIHRhYmxlOiAlMDJYXG4iLCByYyk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMgLSAgY2FsbGVkIHdoZW4gdGltZSB0byBjaGVjayBvdXIgdGVtcGVyYXR1cmUuCi0gKgotICogLS0gcmVzZXQgcGVyaW9kaWMgdGltZXIKLSAqIC0tIHNlZSBpZiB0ZW1wIGhhcyBjaGFuZ2VkIGVub3VnaCB0byB3YXJyYW50IHJlLWNhbGlicmF0aW9uIC4uLiBpZiBzbzoKLSAqICAgICAtLSBjb3JyZWN0IGNvZWZmcyBmb3IgdGVtcCAoY2FuIHJlc2V0IHRlbXAgdGltZXIpCi0gKiAgICAgLS0gc2F2ZSB0aGlzIHRlbXAgYXMgImxhc3QiLAotICogICAgIC0tIHNlbmQgbmV3IHNldCBvZiBnYWluIHNldHRpbmdzIHRvIE5JQwotICogTk9URTogIFRoaXMgc2hvdWxkIGNvbnRpbnVlIHdvcmtpbmcsIGV2ZW4gd2hlbiB3ZSdyZSBub3QgYXNzb2NpYXRlZCwKLSAqICAgc28gd2UgY2FuIGtlZXAgb3VyIGludGVybmFsIHRhYmxlIG9mIHNjYW4gcG93ZXJzIGN1cnJlbnQuICovCi12b2lkIGl3bDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIFRoaXMgd2lsbCBraWNrIGluIHRoZSAiYnJ1dGUgZm9yY2UiCi0JICogaXdsMzk0NV9od19yZWdfY29tcF90eHBvd2VyX3RlbXAoKSBiZWxvdyAqLwotCWlmICghaXdsMzk0NV9pc190ZW1wX2NhbGliX25lZWRlZChwcml2KSkKLQkJZ290byByZXNjaGVkdWxlOwotCi0JLyogU2V0IHVwIGEgbmV3IHNldCBvZiB0ZW1wLWFkanVzdGVkIFR4UG93ZXJzLCBzZW5kIHRvIE5JQy4KLQkgKiBUaGlzIGlzIGJhc2VkICpvbmx5KiBvbiBjdXJyZW50IHRlbXBlcmF0dXJlLAotCSAqIGlnbm9yaW5nIGFueSBwcmV2aW91cyBwb3dlciBtZWFzdXJlbWVudHMgKi8KLQlpd2wzOTQ1X2h3X3JlZ19jb21wX3R4cG93ZXJfdGVtcChwcml2KTsKLQotIHJlc2NoZWR1bGU6Ci0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwKLQkJCSAgICZwcml2LT5fMzk0NS50aGVybWFsX3BlcmlvZGljLCBSRUdfUkVDQUxJQl9QRVJJT0QgKiBIWik7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfYmdfcmVnX3R4cG93ZXJfcGVyaW9kaWMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsCi0JCQkJCSAgICAgXzM5NDUudGhlcm1hbF9wZXJpb2RpYy53b3JrKTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMocHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLS8qKgotICogaXdsMzk0NV9od19yZWdfZ2V0X2NoX2dycF9pbmRleCAtIGZpbmQgdGhlIGNoYW5uZWwtZ3JvdXAgaW5kZXggKDAtNCkKLSAqIAkJCQkgICBmb3IgdGhlIGNoYW5uZWwuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIGNoYW5uZWwtaW5mbyBzdHJ1Y3RzLgotICoKLSAqIE5PVEU6IFRoZXNlIGNoYW5uZWwgZ3JvdXBzIGRvICpOT1QqIG1hdGNoIHRoZSBiYW5kcyBhYm92ZSEKLSAqCSBUaGVzZSBjaGFubmVsIGdyb3VwcyBhcmUgYmFzZWQgb24gZmFjdG9yeS10ZXN0ZWQgY2hhbm5lbHM7Ci0gKgkgb24gQS1iYW5kLCBFRVBST00ncyAiZ3JvdXAgZnJlcXVlbmN5IiBlbnRyaWVzIHJlcHJlc2VudCB0aGUgdG9wCi0gKgkgY2hhbm5lbCBpbiBlYWNoIGdyb3VwIDEtNC4gIEdyb3VwIDUgQWxsIEIvRyBjaGFubmVscyBhcmUgaW4gZ3JvdXAgMC4KLSAqLwotc3RhdGljIHUxNiBpd2wzOTQ1X2h3X3JlZ19nZXRfY2hfZ3JwX2luZGV4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICAgY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8pCi17Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwICpjaF9ncnAgPSAmZWVwcm9tLT5ncm91cHNbMF07Ci0JdTggZ3JvdXA7Ci0JdTE2IGdyb3VwX2luZGV4ID0gMDsJLyogYmFzZWQgb24gZmFjdG9yeSBjYWxpYiBmcmVxdWVuY2llcyAqLwotCXU4IGdycF9jaGFubmVsOwotCi0JLyogRmluZCB0aGUgZ3JvdXAgaW5kZXggZm9yIHRoZSBjaGFubmVsIC4uLiBkb24ndCB1c2UgaW5kZXggMSg/KSAqLwotCWlmIChpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pKSB7Ci0JCWZvciAoZ3JvdXAgPSAxOyBncm91cCA8IDU7IGdyb3VwKyspIHsKLQkJCWdycF9jaGFubmVsID0gY2hfZ3JwW2dyb3VwXS5ncm91cF9jaGFubmVsOwotCQkJaWYgKGNoX2luZm8tPmNoYW5uZWwgPD0gZ3JwX2NoYW5uZWwpIHsKLQkJCQlncm91cF9pbmRleCA9IGdyb3VwOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8qIGdyb3VwIDQgaGFzIGEgZmV3IGNoYW5uZWxzICphYm92ZSogaXRzIGZhY3RvcnkgY2FsIGZyZXEgKi8KLQkJaWYgKGdyb3VwID09IDUpCi0JCQlncm91cF9pbmRleCA9IDQ7Ci0JfSBlbHNlCi0JCWdyb3VwX2luZGV4ID0gMDsJLyogMi40IEdIeiwgZ3JvdXAgMCAqLwotCi0JSVdMX0RFQlVHX1BPV0VSKHByaXYsICJDaG5sICVkIG1hcHBlZCB0byBncnAgJWRcbiIsIGNoX2luZm8tPmNoYW5uZWwsCi0JCQlncm91cF9pbmRleCk7Ci0JcmV0dXJuIGdyb3VwX2luZGV4OwotfQotCi0vKioKLSAqIGl3bDM5NDVfaHdfcmVnX2dldF9tYXRjaGVkX3Bvd2VyX2luZGV4IC0gSW50ZXJwb2xhdGUgdG8gZ2V0IG5vbWluYWwgaW5kZXgKLSAqCi0gKiBJbnRlcnBvbGF0ZSB0byBnZXQgbm9taW5hbCAoaS5lLiBhdCBmYWN0b3J5IGNhbGlicmF0aW9uIHRlbXBlcmF0dXJlKSBpbmRleAotICogICBpbnRvIHJhZGlvL0RTUCBnYWluIHNldHRpbmdzIHRhYmxlIGZvciByZXF1ZXN0ZWQgcG93ZXIuCi0gKi8KLXN0YXRpYyBpbnQgaXdsMzk0NV9od19yZWdfZ2V0X21hdGNoZWRfcG93ZXJfaW5kZXgoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICBzOCByZXF1ZXN0ZWRfcG93ZXIsCi0JCQkJICAgICAgIHMzMiBzZXR0aW5nX2luZGV4LCBzMzIgKm5ld19pbmRleCkKLXsKLQljb25zdCBzdHJ1Y3QgaXdsMzk0NV9lZXByb21fdHhwb3dlcl9ncm91cCAqY2hubF9ncnAgPSBOVUxMOwotCXN0cnVjdCBpd2wzOTQ1X2VlcHJvbSAqZWVwcm9tID0gKHN0cnVjdCBpd2wzOTQ1X2VlcHJvbSAqKXByaXYtPmVlcHJvbTsKLQlzMzIgaW5kZXgwLCBpbmRleDE7Ci0JczMyIHBvd2VyID0gMiAqIHJlcXVlc3RlZF9wb3dlcjsKLQlzMzIgaTsKLQljb25zdCBzdHJ1Y3QgaXdsMzk0NV9lZXByb21fdHhwb3dlcl9zYW1wbGUgKnNhbXBsZXM7Ci0JczMyIGdhaW5zMCwgZ2FpbnMxOwotCXMzMiByZXM7Ci0JczMyIGRlbm9taW5hdG9yOwotCi0JY2hubF9ncnAgPSAmZWVwcm9tLT5ncm91cHNbc2V0dGluZ19pbmRleF07Ci0Jc2FtcGxlcyA9IGNobmxfZ3JwLT5zYW1wbGVzOwotCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKLQkJaWYgKHBvd2VyID09IHNhbXBsZXNbaV0ucG93ZXIpIHsKLQkJCSpuZXdfaW5kZXggPSBzYW1wbGVzW2ldLmdhaW5faW5kZXg7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX0KLQotCWlmIChwb3dlciA+IHNhbXBsZXNbMV0ucG93ZXIpIHsKLQkJaW5kZXgwID0gMDsKLQkJaW5kZXgxID0gMTsKLQl9IGVsc2UgaWYgKHBvd2VyID4gc2FtcGxlc1syXS5wb3dlcikgewotCQlpbmRleDAgPSAxOwotCQlpbmRleDEgPSAyOwotCX0gZWxzZSBpZiAocG93ZXIgPiBzYW1wbGVzWzNdLnBvd2VyKSB7Ci0JCWluZGV4MCA9IDI7Ci0JCWluZGV4MSA9IDM7Ci0JfSBlbHNlIHsKLQkJaW5kZXgwID0gMzsKLQkJaW5kZXgxID0gNDsKLQl9Ci0KLQlkZW5vbWluYXRvciA9IChzMzIpIHNhbXBsZXNbaW5kZXgxXS5wb3dlciAtIChzMzIpIHNhbXBsZXNbaW5kZXgwXS5wb3dlcjsKLQlpZiAoZGVub21pbmF0b3IgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JZ2FpbnMwID0gKHMzMikgc2FtcGxlc1tpbmRleDBdLmdhaW5faW5kZXggKiAoMSA8PCAxOSk7Ci0JZ2FpbnMxID0gKHMzMikgc2FtcGxlc1tpbmRleDFdLmdhaW5faW5kZXggKiAoMSA8PCAxOSk7Ci0JcmVzID0gZ2FpbnMwICsgKGdhaW5zMSAtIGdhaW5zMCkgKgotCSAgICAoKHMzMikgcG93ZXIgLSAoczMyKSBzYW1wbGVzW2luZGV4MF0ucG93ZXIpIC8gZGVub21pbmF0b3IgKwotCSAgICAoMSA8PCAxOCk7Ci0JKm5ld19pbmRleCA9IHJlcyA+PiAxOTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9od19yZWdfaW5pdF9jaGFubmVsX2dyb3VwcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTMyIGk7Ci0JczMyIHJhdGVfaW5kZXg7Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCWNvbnN0IHN0cnVjdCBpd2wzOTQ1X2VlcHJvbV90eHBvd2VyX2dyb3VwICpncm91cDsKLQotCUlXTF9ERUJVR19QT1dFUihwcml2LCAiSW5pdGlhbGl6aW5nIGZhY3RvcnkgY2FsaWIgaW5mbyBmcm9tIEVFUFJPTVxuIik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVdMX05VTV9UWF9DQUxJQl9HUk9VUFM7IGkrKykgewotCQlzOCAqY2xpcF9wd3JzOwkvKiB0YWJsZSBvZiBwb3dlciBsZXZlbHMgZm9yIGVhY2ggcmF0ZSAqLwotCQlzOCBzYXR1cl9wd3I7CS8qIHNhdHVyYXRpb24gcG93ZXIgZm9yIGVhY2ggY2hubCBncm91cCAqLwotCQlncm91cCA9ICZlZXByb20tPmdyb3Vwc1tpXTsKLQotCQkvKiBzYW5pdHkgY2hlY2sgb24gZmFjdG9yeSBzYXR1cmF0aW9uIHBvd2VyIHZhbHVlICovCi0JCWlmIChncm91cC0+c2F0dXJhdGlvbl9wb3dlciA8IDQwKSB7Ci0JCQlJV0xfV0FSTihwcml2LCAiRXJyb3I6IHNhdHVyYXRpb24gcG93ZXIgaXMgJWQsICIKLQkJCQkgICAgImxlc3MgdGhhbiBtaW5pbXVtIGV4cGVjdGVkIDQwXG4iLAotCQkJCSAgICBncm91cC0+c2F0dXJhdGlvbl9wb3dlcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvKgotCQkgKiBEZXJpdmUgcmVxdWVzdGVkIHBvd2VyIGxldmVscyBmb3IgZWFjaCByYXRlLCBiYXNlZCBvbgotCQkgKiAgIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAoc2F0dXJhdGlvbiBwb3dlciBmb3IgYmFuZCkuCi0JCSAqIEJhc2ljIHZhbHVlIGlzIDNkQiBkb3duIGZyb20gc2F0dXJhdGlvbiwgd2l0aCBmdXJ0aGVyCi0JCSAqICAgcG93ZXIgcmVkdWN0aW9ucyBmb3IgaGlnaGVzdCAzIGRhdGEgcmF0ZXMuICBUaGVzZQotCQkgKiAgIGJhY2tvZmZzIHByb3ZpZGUgaGVhZHJvb20gZm9yIGhpZ2ggcmF0ZSBtb2R1bGF0aW9uCi0JCSAqICAgcG93ZXIgcGVha3MsIHdpdGhvdXQgdG9vIG11Y2ggZGlzdG9ydGlvbiAoY2xpcHBpbmcpLgotCQkgKi8KLQkJLyogd2UnbGwgZmlsbCBpbiB0aGlzIGFycmF5IHdpdGggaC93IG1heCBwb3dlciBsZXZlbHMgKi8KLQkJY2xpcF9wd3JzID0gKHM4ICopIHByaXYtPl8zOTQ1LmNsaXBfZ3JvdXBzW2ldLmNsaXBfcG93ZXJzOwotCi0JCS8qIGRpdmlkZSBmYWN0b3J5IHNhdHVyYXRpb24gcG93ZXIgYnkgMiB0byBmaW5kIC0zZEIgbGV2ZWwgKi8KLQkJc2F0dXJfcHdyID0gKHM4KSAoZ3JvdXAtPnNhdHVyYXRpb25fcG93ZXIgPj4gMSk7Ci0KLQkJLyogZmlsbCBpbiBjaGFubmVsIGdyb3VwJ3Mgbm9taW5hbCBwb3dlcnMgZm9yIGVhY2ggcmF0ZSAqLwotCQlmb3IgKHJhdGVfaW5kZXggPSAwOwotCQkgICAgIHJhdGVfaW5kZXggPCBJV0xfUkFURV9DT1VOVF8zOTQ1OyByYXRlX2luZGV4KyssIGNsaXBfcHdycysrKSB7Ci0JCQlzd2l0Y2ggKHJhdGVfaW5kZXgpIHsKLQkJCWNhc2UgSVdMX1JBVEVfMzZNX0lOREVYX1RBQkxFOgotCQkJCWlmIChpID09IDApCS8qIEIvRyAqLwotCQkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyOwotCQkJCWVsc2UJLyogQSAqLwotCQkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyIC0gNTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVdMX1JBVEVfNDhNX0lOREVYX1RBQkxFOgotCQkJCWlmIChpID09IDApCi0JCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3IgLSA3OwotCQkJCWVsc2UKLQkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDEwOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJV0xfUkFURV81NE1fSU5ERVhfVEFCTEU6Ci0JCQkJaWYgKGkgPT0gMCkKLQkJCQkJKmNsaXBfcHdycyA9IHNhdHVyX3B3ciAtIDk7Ci0JCQkJZWxzZQotCQkJCQkqY2xpcF9wd3JzID0gc2F0dXJfcHdyIC0gMTI7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OgotCQkJCSpjbGlwX3B3cnMgPSBzYXR1cl9wd3I7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLS8qKgotICogaXdsMzk0NV90eHBvd2VyX3NldF9mcm9tX2VlcHJvbSAtIFNldCBjaGFubmVsIHBvd2VyIGluZm8gYmFzZWQgb24gRUVQUk9NCi0gKgotICogU2Vjb25kIHBhc3MgKGR1cmluZyBpbml0KSB0byBzZXQgdXAgcHJpdi0+Y2hhbm5lbF9pbmZvCi0gKgotICogU2V0IHVwIFR4LXBvd2VyIHNldHRpbmdzIGluIG91ciBjaGFubmVsIGluZm8gZGF0YWJhc2UgZm9yIGVhY2ggVkFMSUQKLSAqIChmb3IgdGhpcyBnZW8vU0tVKSBjaGFubmVsLCBhdCBhbGwgVHggZGF0YSByYXRlcywgYmFzZWQgb24gZWVwcm9tIHZhbHVlcwotICogYW5kIGN1cnJlbnQgdGVtcGVyYXR1cmUuCi0gKgotICogU2luY2UgdGhpcyBpcyBiYXNlZCBvbiBjdXJyZW50IHRlbXBlcmF0dXJlIChhdCBpbml0IHRpbWUpLCB0aGVzZSB2YWx1ZXMgbWF5Ci0gKiBub3QgYmUgdmFsaWQgZm9yIHZlcnkgbG9uZywgYnV0IGl0IGdpdmVzIHVzIGEgc3RhcnRpbmcvZGVmYXVsdCBwb2ludCwKLSAqIGFuZCBhbGxvd3MgdXMgdG8gYWN0aXZlIChpLmUuIHVzaW5nIFR4KSBzY2FuLgotICoKLSAqIFRoaXMgZG9lcyAqbm90KiB3cml0ZSB2YWx1ZXMgdG8gTklDLCBqdXN0IHNldHMgdXAgb3VyIGludGVybmFsIHRhYmxlLgotICovCi1pbnQgaXdsMzk0NV90eHBvd2VyX3NldF9mcm9tX2VlcHJvbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8gPSBOVUxMOwotCXN0cnVjdCBpd2wzOTQ1X2NoYW5uZWxfcG93ZXJfaW5mbyAqcHdyX2luZm87Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb20gPSAoc3RydWN0IGl3bDM5NDVfZWVwcm9tICopcHJpdi0+ZWVwcm9tOwotCWludCBkZWx0YV9pbmRleDsKLQl1OCByYXRlX2luZGV4OwotCXU4IHNjYW5fdGJsX2luZGV4OwotCWNvbnN0IHM4ICpjbGlwX3B3cnM7CS8qIGFycmF5IG9mIHBvd2VyIGxldmVscyBmb3IgZWFjaCByYXRlICovCi0JdTggZ2FpbiwgZHNwX2F0dGVuOwotCXM4IHBvd2VyOwotCXU4IHB3cl9pbmRleCwgYmFzZV9wd3JfaW5kZXgsIGFfYmFuZDsKLQl1OCBpOwotCWludCB0ZW1wZXJhdHVyZTsKLQotCS8qIHNhdmUgdGVtcGVyYXR1cmUgcmVmZXJlbmNlLAotCSAqICAgc28gd2UgY2FuIGRldGVybWluZSBuZXh0IHRpbWUgdG8gY2FsaWJyYXRlICovCi0JdGVtcGVyYXR1cmUgPSBpd2wzOTQ1X2h3X3JlZ190eHBvd2VyX2dldF90ZW1wZXJhdHVyZShwcml2KTsKLQlwcml2LT5sYXN0X3RlbXBlcmF0dXJlID0gdGVtcGVyYXR1cmU7Ci0KLQlpd2wzOTQ1X2h3X3JlZ19pbml0X2NoYW5uZWxfZ3JvdXBzKHByaXYpOwotCi0JLyogaW5pdGlhbGl6ZSBUeCBwb3dlciBpbmZvIGZvciBlYWNoIGFuZCBldmVyeSBjaGFubmVsLCAyLjQgYW5kIDUueCAqLwotCWZvciAoaSA9IDAsIGNoX2luZm8gPSBwcml2LT5jaGFubmVsX2luZm87IGkgPCBwcml2LT5jaGFubmVsX2NvdW50OwotCSAgICAgaSsrLCBjaF9pbmZvKyspIHsKLQkJYV9iYW5kID0gaXdsX2xlZ2FjeV9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKTsKLQkJaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpCi0JCQljb250aW51ZTsKLQotCQkvKiBmaW5kIHRoaXMgY2hhbm5lbCdzIGNoYW5uZWwgZ3JvdXAgKCpub3QqICJiYW5kIikgaW5kZXggKi8KLQkJY2hfaW5mby0+Z3JvdXBfaW5kZXggPQotCQkJaXdsMzk0NV9od19yZWdfZ2V0X2NoX2dycF9pbmRleChwcml2LCBjaF9pbmZvKTsKLQotCQkvKiBHZXQgdGhpcyBjaG5sZ3JwJ3MgcmF0ZS0+bWF4L2NsaXAtcG93ZXJzIHRhYmxlICovCi0JCWNsaXBfcHdycyA9IHByaXYtPl8zOTQ1LmNsaXBfZ3JvdXBzW2NoX2luZm8tPmdyb3VwX2luZGV4XS5jbGlwX3Bvd2VyczsKLQotCQkvKiBjYWxjdWxhdGUgcG93ZXIgaW5kZXggKmFkanVzdG1lbnQqIHZhbHVlIGFjY29yZGluZyB0bwotCQkgKiAgZGlmZiBiZXR3ZWVuIGN1cnJlbnQgdGVtcGVyYXR1cmUgYW5kIGZhY3RvcnkgdGVtcGVyYXR1cmUgKi8KLQkJZGVsdGFfaW5kZXggPSBpd2wzOTQ1X2h3X3JlZ19hZGp1c3RfcG93ZXJfYnlfdGVtcCh0ZW1wZXJhdHVyZSwKLQkJCQllZXByb20tPmdyb3Vwc1tjaF9pbmZvLT5ncm91cF9pbmRleF0uCi0JCQkJdGVtcGVyYXR1cmUpOwotCi0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiRGVsdGEgaW5kZXggZm9yIGNoYW5uZWwgJWQ6ICVkIFslZF1cbiIsCi0JCQkJY2hfaW5mby0+Y2hhbm5lbCwgZGVsdGFfaW5kZXgsIHRlbXBlcmF0dXJlICsKLQkJCQlJV0xfVEVNUF9DT05WRVJUKTsKLQotCQkvKiBzZXQgdHggcG93ZXIgdmFsdWUgZm9yIGFsbCBPRkRNIHJhdGVzICovCi0JCWZvciAocmF0ZV9pbmRleCA9IDA7IHJhdGVfaW5kZXggPCBJV0xfT0ZETV9SQVRFUzsKLQkJICAgICByYXRlX2luZGV4KyspIHsKLQkJCXMzMiB1bmluaXRpYWxpemVkX3Zhcihwb3dlcl9pZHgpOwotCQkJaW50IHJjOwotCi0JCQkvKiB1c2UgY2hhbm5lbCBncm91cCdzIGNsaXAtcG93ZXIgdGFibGUsCi0JCQkgKiAgIGJ1dCBkb24ndCBleGNlZWQgY2hhbm5lbCdzIG1heCBwb3dlciAqLwotCQkJczggcHdyID0gbWluKGNoX2luZm8tPm1heF9wb3dlcl9hdmcsCi0JCQkJICAgICBjbGlwX3B3cnNbcmF0ZV9pbmRleF0pOwotCi0JCQlwd3JfaW5mbyA9ICZjaF9pbmZvLT5wb3dlcl9pbmZvW3JhdGVfaW5kZXhdOwotCi0JCQkvKiBnZXQgYmFzZSAoaS5lLiBhdCBmYWN0b3J5LW1lYXN1cmVkIHRlbXBlcmF0dXJlKQotCQkJICogICAgcG93ZXIgdGFibGUgaW5kZXggZm9yIHRoaXMgcmF0ZSdzIHBvd2VyICovCi0JCQlyYyA9IGl3bDM5NDVfaHdfcmVnX2dldF9tYXRjaGVkX3Bvd2VyX2luZGV4KHByaXYsIHB3ciwKLQkJCQkJCQkgY2hfaW5mby0+Z3JvdXBfaW5kZXgsCi0JCQkJCQkJICZwb3dlcl9pZHgpOwotCQkJaWYgKHJjKSB7Ci0JCQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBwb3dlciBpbmRleFxuIik7Ci0JCQkJcmV0dXJuIHJjOwotCQkJfQotCQkJcHdyX2luZm8tPmJhc2VfcG93ZXJfaW5kZXggPSAodTgpIHBvd2VyX2lkeDsKLQotCQkJLyogdGVtcGVyYXR1cmUgY29tcGVuc2F0ZSAqLwotCQkJcG93ZXJfaWR4ICs9IGRlbHRhX2luZGV4OwotCi0JCQkvKiBzdGF5IHdpdGhpbiByYW5nZSBvZiBnYWluIHRhYmxlICovCi0JCQlwb3dlcl9pZHggPSBpd2wzOTQ1X2h3X3JlZ19maXhfcG93ZXJfaW5kZXgocG93ZXJfaWR4KTsKLQotCQkJLyogZmlsbCAxIE9GRE0gcmF0ZSdzIGl3bDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvIHN0cnVjdCAqLwotCQkJcHdyX2luZm8tPnJlcXVlc3RlZF9wb3dlciA9IHB3cjsKLQkJCXB3cl9pbmZvLT5wb3dlcl90YWJsZV9pbmRleCA9ICh1OCkgcG93ZXJfaWR4OwotCQkJcHdyX2luZm8tPnRwYy50eF9nYWluID0KLQkJCSAgICBwb3dlcl9nYWluX3RhYmxlW2FfYmFuZF1bcG93ZXJfaWR4XS50eF9nYWluOwotCQkJcHdyX2luZm8tPnRwYy5kc3BfYXR0ZW4gPQotCQkJICAgIHBvd2VyX2dhaW5fdGFibGVbYV9iYW5kXVtwb3dlcl9pZHhdLmRzcF9hdHRlbjsKLQkJfQotCi0JCS8qIHNldCB0eCBwb3dlciBmb3IgQ0NLIHJhdGVzLCBiYXNlZCBvbiBPRkRNIDEyIE1iaXQgc2V0dGluZ3MqLwotCQlwd3JfaW5mbyA9ICZjaF9pbmZvLT5wb3dlcl9pbmZvW0lXTF9SQVRFXzEyTV9JTkRFWF9UQUJMRV07Ci0JCXBvd2VyID0gcHdyX2luZm8tPnJlcXVlc3RlZF9wb3dlciArCi0JCQlJV0xfQ0NLX0ZST01fT0ZETV9QT1dFUl9ESUZGOwotCQlwd3JfaW5kZXggPSBwd3JfaW5mby0+cG93ZXJfdGFibGVfaW5kZXggKwotCQkJSVdMX0NDS19GUk9NX09GRE1fSU5ERVhfRElGRjsKLQkJYmFzZV9wd3JfaW5kZXggPSBwd3JfaW5mby0+YmFzZV9wb3dlcl9pbmRleCArCi0JCQlJV0xfQ0NLX0ZST01fT0ZETV9JTkRFWF9ESUZGOwotCi0JCS8qIHN0YXkgd2l0aGluIHRhYmxlIHJhbmdlICovCi0JCXB3cl9pbmRleCA9IGl3bDM5NDVfaHdfcmVnX2ZpeF9wb3dlcl9pbmRleChwd3JfaW5kZXgpOwotCQlnYWluID0gcG93ZXJfZ2Fpbl90YWJsZVthX2JhbmRdW3B3cl9pbmRleF0udHhfZ2FpbjsKLQkJZHNwX2F0dGVuID0gcG93ZXJfZ2Fpbl90YWJsZVthX2JhbmRdW3B3cl9pbmRleF0uZHNwX2F0dGVuOwotCi0JCS8qIGZpbGwgZWFjaCBDQ0sgcmF0ZSdzIGl3bDM5NDVfY2hhbm5lbF9wb3dlcl9pbmZvIHN0cnVjdHVyZQotCQkgKiBOT1RFOiAgQWxsIENDSy1yYXRlIFR4cHdycyBhcmUgdGhlIHNhbWUgZm9yIGEgZ2l2ZW4gY2hubCEKLQkJICogTk9URTogIENDSyByYXRlcyBzdGFydCBhdCBlbmQgb2YgT0ZETSByYXRlcyEgKi8KLQkJZm9yIChyYXRlX2luZGV4ID0gMDsKLQkJICAgICByYXRlX2luZGV4IDwgSVdMX0NDS19SQVRFUzsgcmF0ZV9pbmRleCsrKSB7Ci0JCQlwd3JfaW5mbyA9ICZjaF9pbmZvLT5wb3dlcl9pbmZvW3JhdGVfaW5kZXgrSVdMX09GRE1fUkFURVNdOwotCQkJcHdyX2luZm8tPnJlcXVlc3RlZF9wb3dlciA9IHBvd2VyOwotCQkJcHdyX2luZm8tPnBvd2VyX3RhYmxlX2luZGV4ID0gcHdyX2luZGV4OwotCQkJcHdyX2luZm8tPmJhc2VfcG93ZXJfaW5kZXggPSBiYXNlX3B3cl9pbmRleDsKLQkJCXB3cl9pbmZvLT50cGMudHhfZ2FpbiA9IGdhaW47Ci0JCQlwd3JfaW5mby0+dHBjLmRzcF9hdHRlbiA9IGRzcF9hdHRlbjsKLQkJfQotCi0JCS8qIHNldCBzY2FuIHR4IHBvd2VyLCAxTWJpdCBmb3IgQ0NLLCA2TWJpdCBmb3IgT0ZETSAqLwotCQlmb3IgKHNjYW5fdGJsX2luZGV4ID0gMDsKLQkJICAgICBzY2FuX3RibF9pbmRleCA8IElXTF9OVU1fU0NBTl9SQVRFUzsgc2Nhbl90YmxfaW5kZXgrKykgewotCQkJczMyIGFjdHVhbF9pbmRleCA9IChzY2FuX3RibF9pbmRleCA9PSAwKSA/Ci0JCQkJSVdMX1JBVEVfMU1fSU5ERVhfVEFCTEUgOiBJV0xfUkFURV82TV9JTkRFWF9UQUJMRTsKLQkJCWl3bDM5NDVfaHdfcmVnX3NldF9zY2FuX3Bvd2VyKHByaXYsIHNjYW5fdGJsX2luZGV4LAotCQkJCWFjdHVhbF9pbmRleCwgY2xpcF9wd3JzLCBjaF9pbmZvLCBhX2JhbmQpOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2wzOTQ1X2h3X3J4cV9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmM7Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfUkNTUl9DT05GSUcoMCksIDApOwotCXJjID0gaXdsX3BvbGxfZGlyZWN0X2JpdChwcml2LCBGSDM5X1JTU1JfU1RBVFVTLAotCQkJRkgzOV9SU1NSX0NITkwwX1JYX1NUQVRVU19DSE5MX0lETEUsIDEwMDApOwotCWlmIChyYyA8IDApCi0JCUlXTF9FUlIocHJpdiwgIkNhbid0IHN0b3AgUnggRE1BLlxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bDM5NDVfaHdfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKLXsKLQlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOwotCi0Jc3RydWN0IGl3bDM5NDVfc2hhcmVkICpzaGFyZWRfZGF0YSA9IHByaXYtPl8zOTQ1LnNoYXJlZF92aXJ0OwotCi0Jc2hhcmVkX2RhdGEtPnR4X2Jhc2VfcHRyW3R4cV9pZF0gPSBjcHVfdG9fbGUzMigodTMyKXR4cS0+cS5kbWFfYWRkcik7Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfQ0JDQ19DVFJMKHR4cV9pZCksIDApOwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9DQkNDX0JBU0UodHhxX2lkKSwgMCk7Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIMzlfVENTUl9DT05GSUcodHhxX2lkKSwKLQkJRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfUlRDX05PSU5UIHwKLQkJRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX1RYRiB8Ci0JCUZIMzlfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfSUZURkQgfAotCQlGSDM5X1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9FTkFCTEVfVkFMIHwKLQkJRkgzOV9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOQUJMRSk7Ci0KLQkvKiBmYWtlIHJlYWQgdG8gZmx1c2ggYWxsIHByZXYuIHdyaXRlcyAqLwotCWl3bF9yZWFkMzIocHJpdiwgRkgzOV9UU1NSX0NCQl9CQVNFKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogSENNRCB1dGlscwotICovCi1zdGF0aWMgdTE2IGl3bDM5NDVfZ2V0X2hjbWRfc2l6ZSh1OCBjbWRfaWQsIHUxNiBsZW4pCi17Ci0Jc3dpdGNoIChjbWRfaWQpIHsKLQljYXNlIFJFUExZX1JYT046Ci0JCXJldHVybiBzaXplb2Yoc3RydWN0IGl3bDM5NDVfcnhvbl9jbWQpOwotCWNhc2UgUE9XRVJfVEFCTEVfQ01EOgotCQlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3Bvd2VydGFibGVfY21kKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gbGVuOwotCX0KLX0KLQotCi1zdGF0aWMgdTE2IGl3bDM5NDVfYnVpbGRfYWRkc3RhX2hjbWQoY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCAqY21kLAotCQkJCQkJCQl1OCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9hZGRzdGFfY21kICphZGRzdGEgPSAoc3RydWN0IGl3bDM5NDVfYWRkc3RhX2NtZCAqKWRhdGE7Ci0JYWRkc3RhLT5tb2RlID0gY21kLT5tb2RlOwotCW1lbWNweSgmYWRkc3RhLT5zdGEsICZjbWQtPnN0YSwgc2l6ZW9mKHN0cnVjdCBzdGFfaWRfbW9kaWZ5KSk7Ci0JbWVtY3B5KCZhZGRzdGEtPmtleSwgJmNtZC0+a2V5LCBzaXplb2Yoc3RydWN0IGl3bDQ5NjVfa2V5aW5mbykpOwotCWFkZHN0YS0+c3RhdGlvbl9mbGFncyA9IGNtZC0+c3RhdGlvbl9mbGFnczsKLQlhZGRzdGEtPnN0YXRpb25fZmxhZ3NfbXNrID0gY21kLT5zdGF0aW9uX2ZsYWdzX21zazsKLQlhZGRzdGEtPnRpZF9kaXNhYmxlX3R4ID0gY3B1X3RvX2xlMTYoMCk7Ci0JYWRkc3RhLT5yYXRlX25fZmxhZ3MgPSBjbWQtPnJhdGVfbl9mbGFnczsKLQlhZGRzdGEtPmFkZF9pbW1lZGlhdGVfYmFfdGlkID0gY21kLT5hZGRfaW1tZWRpYXRlX2JhX3RpZDsKLQlhZGRzdGEtPnJlbW92ZV9pbW1lZGlhdGVfYmFfdGlkID0gY21kLT5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZDsKLQlhZGRzdGEtPmFkZF9pbW1lZGlhdGVfYmFfc3NuID0gY21kLT5hZGRfaW1tZWRpYXRlX2JhX3NzbjsKLQotCXJldHVybiAodTE2KXNpemVvZihzdHJ1Y3QgaXdsMzk0NV9hZGRzdGFfY21kKTsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X2FkZF9ic3NpZF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgIGNvbnN0IHU4ICphZGRyLCB1OCAqc3RhX2lkX3IpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlpbnQgcmV0OwotCXU4IHN0YV9pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKHN0YV9pZF9yKQotCQkqc3RhX2lkX3IgPSBJV0xfSU5WQUxJRF9TVEFUSU9OOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9hZGRfc3RhdGlvbl9jb21tb24ocHJpdiwgY3R4LCBhZGRyLCAwLCBOVUxMLCAmc3RhX2lkKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE1cbiIsIGFkZHIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCWlmIChzdGFfaWRfcikKLQkJKnN0YV9pZF9yID0gc3RhX2lkOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElXTF9TVEFfTE9DQUw7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotc3RhdGljIGludCBpd2wzOTQ1X21hbmFnZV9pYnNzX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29sIGFkZCkKLXsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKLQlpbnQgcmV0OwotCi0JaWYgKGFkZCkgewotCQlyZXQgPSBpd2wzOTQ1X2FkZF9ic3NpZF9zdGF0aW9uKHByaXYsIHZpZi0+YnNzX2NvbmYuYnNzaWQsCi0JCQkJCQkmdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0KLQkJaXdsMzk0NV9zeW5jX3N0YShwcml2LCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQsCi0JCQkJIChwcml2LT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopID8KLQkJCQkgSVdMX1JBVEVfNk1fUExDUCA6IElXTF9SQVRFXzFNX1BMQ1ApOwotCQlpd2wzOTQ1X3JhdGVfc2NhbGVfaW5pdChwcml2LT5odywgdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9yZW1vdmVfc3RhdGlvbihwcml2LCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQsCi0JCQkJICB2aWYtPmJzc19jb25mLmJzc2lkKTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2luaXRfaHdfcmF0ZV90YWJsZSAtIEluaXRpYWxpemUgdGhlIGhhcmR3YXJlIHJhdGUgZmFsbGJhY2sgdGFibGUKLSAqLwotaW50IGl3bDM5NDVfaW5pdF9od19yYXRlX3RhYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmMsIGksIGluZGV4LCBwcmV2X2luZGV4OwotCXN0cnVjdCBpd2wzOTQ1X3JhdGVfc2NhbGluZ19jbWQgcmF0ZV9jbWQgPSB7Ci0JCS5yZXNlcnZlZCA9IHswLCAwLCAwfSwKLQl9OwotCXN0cnVjdCBpd2wzOTQ1X3JhdGVfc2NhbGluZ19pbmZvICp0YWJsZSA9IHJhdGVfY21kLnRhYmxlOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaXdsMzk0NV9yYXRlcyk7IGkrKykgewotCQlpbmRleCA9IGl3bDM5NDVfcmF0ZXNbaV0udGFibGVfcnNfaW5kZXg7Ci0KLQkJdGFibGVbaW5kZXhdLnJhdGVfbl9mbGFncyA9Ci0JCQlpd2wzOTQ1X2h3X3NldF9yYXRlX25fZmxhZ3MoaXdsMzk0NV9yYXRlc1tpXS5wbGNwLCAwKTsKLQkJdGFibGVbaW5kZXhdLnRyeV9jbnQgPSBwcml2LT5yZXRyeV9yYXRlOwotCQlwcmV2X2luZGV4ID0gaXdsMzk0NV9nZXRfcHJldl9pZWVlX3JhdGUoaSk7Ci0JCXRhYmxlW2luZGV4XS5uZXh0X3JhdGVfaW5kZXggPQotCQkJCWl3bDM5NDVfcmF0ZXNbcHJldl9pbmRleF0udGFibGVfcnNfaW5kZXg7Ci0JfQotCi0Jc3dpdGNoIChwcml2LT5iYW5kKSB7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF81R0haOgotCQlJV0xfREVCVUdfUkFURShwcml2LCAiU2VsZWN0IEEgbW9kZSByYXRlIHNjYWxlXG4iKTsKLQkJLyogSWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgQ0NLIHJhdGVzIGlzIHVzZWQsCi0JCSAqIGhhdmUgaXQgZmFsbCBiYWNrIHRvIHRoZSA2TSBPRkRNIHJhdGUgKi8KLQkJZm9yIChpID0gSVdMX1JBVEVfMU1fSU5ERVhfVEFCTEU7Ci0JCQlpIDw9IElXTF9SQVRFXzExTV9JTkRFWF9UQUJMRTsgaSsrKQotCQkJdGFibGVbaV0ubmV4dF9yYXRlX2luZGV4ID0KLQkJCSAgaXdsMzk0NV9yYXRlc1tJV0xfRklSU1RfT0ZETV9SQVRFXS50YWJsZV9yc19pbmRleDsKLQotCQkvKiBEb24ndCBmYWxsIGJhY2sgdG8gQ0NLIHJhdGVzICovCi0JCXRhYmxlW0lXTF9SQVRFXzEyTV9JTkRFWF9UQUJMRV0ubmV4dF9yYXRlX2luZGV4ID0KLQkJCQkJCUlXTF9SQVRFXzlNX0lOREVYX1RBQkxFOwotCi0JCS8qIERvbid0IGRyb3Agb3V0IG9mIE9GRE0gcmF0ZXMgKi8KLQkJdGFibGVbSVdMX1JBVEVfNk1fSU5ERVhfVEFCTEVdLm5leHRfcmF0ZV9pbmRleCA9Ci0JCSAgICBpd2wzOTQ1X3JhdGVzW0lXTF9GSVJTVF9PRkRNX1JBVEVdLnRhYmxlX3JzX2luZGV4OwotCQlicmVhazsKLQotCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNlbGVjdCBCL0cgbW9kZSByYXRlIHNjYWxlXG4iKTsKLQkJLyogSWYgYW4gT0ZETSByYXRlIGlzIHVzZWQsIGhhdmUgaXQgZmFsbCBiYWNrIHRvIHRoZQotCQkgKiAxTSBDQ0sgcmF0ZXMgKi8KLQotCQlpZiAoIShwcml2LT5fMzk0NS5zdGFfc3VwcF9yYXRlcyAmIElXTF9PRkRNX1JBVEVTX01BU0spICYmCi0JCSAgICBpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQocHJpdiwgSVdMX1JYT05fQ1RYX0JTUykpIHsKLQotCQkJaW5kZXggPSBJV0xfRklSU1RfQ0NLX1JBVEU7Ci0JCQlmb3IgKGkgPSBJV0xfUkFURV82TV9JTkRFWF9UQUJMRTsKLQkJCSAgICAgaSA8PSBJV0xfUkFURV81NE1fSU5ERVhfVEFCTEU7IGkrKykKLQkJCQl0YWJsZVtpXS5uZXh0X3JhdGVfaW5kZXggPQotCQkJCQlpd2wzOTQ1X3JhdGVzW2luZGV4XS50YWJsZV9yc19pbmRleDsKLQotCQkJaW5kZXggPSBJV0xfUkFURV8xMU1fSU5ERVhfVEFCTEU7Ci0JCQkvKiBDQ0sgc2hvdWxkbid0IGZhbGwgYmFjayB0byBPRkRNLi4uICovCi0JCQl0YWJsZVtpbmRleF0ubmV4dF9yYXRlX2luZGV4ID0gSVdMX1JBVEVfNU1fSU5ERVhfVEFCTEU7Ci0JCX0KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlXQVJOX09OKDEpOwotCQlicmVhazsKLQl9Ci0KLQkvKiBVcGRhdGUgdGhlIHJhdGUgc2NhbGluZyBmb3IgY29udHJvbCBmcmFtZSBUeCAqLwotCXJhdGVfY21kLnRhYmxlX2lkID0gMDsKLQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1JBVEVfU0NBTEUsIHNpemVvZihyYXRlX2NtZCksCi0JCQkgICAgICAmcmF0ZV9jbWQpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JLyogVXBkYXRlIHRoZSByYXRlIHNjYWxpbmcgZm9yIGRhdGEgZnJhbWUgVHggKi8KLQlyYXRlX2NtZC50YWJsZV9pZCA9IDE7Ci0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1JBVEVfU0NBTEUsIHNpemVvZihyYXRlX2NtZCksCi0JCQkJJnJhdGVfY21kKTsKLX0KLQotLyogQ2FsbGVkIHdoZW4gaW5pdGlhbGl6aW5nIGRyaXZlciAqLwotaW50IGl3bDM5NDVfaHdfc2V0X2h3X3BhcmFtcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JbWVtc2V0KCh2b2lkICopJnByaXYtPmh3X3BhcmFtcywgMCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfaHdfcGFyYW1zKSk7Ci0KLQlwcml2LT5fMzk0NS5zaGFyZWRfdmlydCA9Ci0JCWRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LAotCQkJCSAgIHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9zaGFyZWQpLAotCQkJCSAgICZwcml2LT5fMzk0NS5zaGFyZWRfcGh5cywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT5fMzk0NS5zaGFyZWRfdmlydCkgewotCQlJV0xfRVJSKHByaXYsICJmYWlsZWQgdG8gYWxsb2NhdGUgcGNpIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCS8qIEFzc2lnbiBudW1iZXIgb2YgVXNhYmxlIFRYIHF1ZXVlcyAqLwotCXByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bSA9IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7Ci0KLQlwcml2LT5od19wYXJhbXMudGZkX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bDM5NDVfdGZkKTsKLQlwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA9IGdldF9vcmRlcihJV0xfUlhfQlVGX1NJWkVfM0spOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfcnhxX3NpemUgPSBSWF9RVUVVRV9TSVpFOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfcnhxX2xvZyA9IFJYX1FVRVVFX1NJWkVfTE9HOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnMgPSBJV0wzOTQ1X1NUQVRJT05fQ09VTlQ7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYmNhc3Rfc3RhX2lkID0gSVdMMzk0NV9CUk9BRENBU1RfSUQ7Ci0KLQlwcml2LT5zdGFfa2V5X21heF9udW0gPSBTVEFfS0VZX01BWF9OVU07Ci0KLQlwcml2LT5od19wYXJhbXMucnhfd3J0X3B0cl9yZWcgPSBGSDM5X1JTQ1NSX0NITkwwX1dQVFI7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9iZWFjb25faXRydmwgPSBJV0wzOV9NQVhfVUNPREVfQkVBQ09OX0lOVEVSVkFMOwotCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyA9IElXTDM5NDVfRVhUX0JFQUNPTl9USU1FX1BPUzsKLQotCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBpbnQgaXdsMzk0NV9od19nZXRfYmVhY29uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgIHN0cnVjdCBpd2wzOTQ1X2ZyYW1lICpmcmFtZSwgdTggcmF0ZSkKLXsKLQlzdHJ1Y3QgaXdsMzk0NV90eF9iZWFjb25fY21kICp0eF9iZWFjb25fY21kOwotCXVuc2lnbmVkIGludCBmcmFtZV9zaXplOwotCi0JdHhfYmVhY29uX2NtZCA9IChzdHJ1Y3QgaXdsMzk0NV90eF9iZWFjb25fY21kICopJmZyYW1lLT51OwotCW1lbXNldCh0eF9iZWFjb25fY21kLCAwLCBzaXplb2YoKnR4X2JlYWNvbl9jbWQpKTsKLQotCXR4X2JlYWNvbl9jbWQtPnR4LnN0YV9pZCA9Ci0JCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZDsKLQl0eF9iZWFjb25fY21kLT50eC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKLQotCWZyYW1lX3NpemUgPSBpd2wzOTQ1X2ZpbGxfYmVhY29uX2ZyYW1lKHByaXYsCi0JCQkJdHhfYmVhY29uX2NtZC0+ZnJhbWUsCi0JCQkJc2l6ZW9mKGZyYW1lLT51KSAtIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOwotCi0JQlVHX09OKGZyYW1lX3NpemUgPiBNQVhfTVBEVV9TSVpFKTsKLQl0eF9iZWFjb25fY21kLT50eC5sZW4gPSBjcHVfdG9fbGUxNigodTE2KWZyYW1lX3NpemUpOwotCi0JdHhfYmVhY29uX2NtZC0+dHgucmF0ZSA9IHJhdGU7Ci0JdHhfYmVhY29uX2NtZC0+dHgudHhfZmxhZ3MgPSAoVFhfQ01EX0ZMR19TRVFfQ1RMX01TSyB8Ci0JCQkJICAgICAgVFhfQ01EX0ZMR19UU0ZfTVNLKTsKLQotCS8qIHN1cHBfcmF0ZXNbMF0gPT0gT0ZETSBzdGFydCBhdCBJV0xfRklSU1RfT0ZETV9SQVRFKi8KLQl0eF9iZWFjb25fY21kLT50eC5zdXBwX3JhdGVzWzBdID0KLQkJKElXTF9PRkRNX0JBU0lDX1JBVEVTX01BU0sgPj4gSVdMX0ZJUlNUX09GRE1fUkFURSkgJiAweEZGOwotCi0JdHhfYmVhY29uX2NtZC0+dHguc3VwcF9yYXRlc1sxXSA9Ci0JCShJV0xfQ0NLX0JBU0lDX1JBVEVTX01BU0sgJiAweEYpOwotCi0JcmV0dXJuIHNpemVvZihzdHJ1Y3QgaXdsMzk0NV90eF9iZWFjb25fY21kKSArIGZyYW1lX3NpemU7Ci19Ci0KLXZvaWQgaXdsMzk0NV9od19yeF9oYW5kbGVyX3NldHVwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9UWF0gPSBpd2wzOTQ1X3J4X3JlcGx5X3R4OwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZXzM5NDVfUlhdID0gaXdsMzk0NV9yeF9yZXBseV9yeDsKLX0KLQotdm9pZCBpd2wzOTQ1X2h3X3NldHVwX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCUlOSVRfREVMQVlFRF9XT1JLKCZwcml2LT5fMzk0NS50aGVybWFsX3BlcmlvZGljLAotCQkJICBpd2wzOTQ1X2JnX3JlZ190eHBvd2VyX3BlcmlvZGljKTsKLX0KLQotdm9pZCBpd2wzOTQ1X2h3X2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5fMzk0NS50aGVybWFsX3BlcmlvZGljKTsKLX0KLQotLyogY2hlY2sgY29udGVudHMgb2Ygc3BlY2lhbCBib290c3RyYXAgdUNvZGUgU1JBTSAqLwotc3RhdGljIGludCBpd2wzOTQ1X3ZlcmlmeV9ic20oc3RydWN0IGl3bF9wcml2ICpwcml2KQotIHsKLQlfX2xlMzIgKmltYWdlID0gcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JdTMyIGxlbiA9IHByaXYtPnVjb2RlX2Jvb3QubGVuOwotCXUzMiByZWc7Ci0JdTMyIHZhbDsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJCZWdpbiB2ZXJpZnkgYnNtXG4iKTsKLQotCS8qIHZlcmlmeSBCU00gU1JBTSBjb250ZW50cyAqLwotCXZhbCA9IGl3bF9sZWdhY3lfcmVhZF9wcnBoKHByaXYsIEJTTV9XUl9EV0NPVU5UX1JFRyk7Ci0JZm9yIChyZWcgPSBCU01fU1JBTV9MT1dFUl9CT1VORDsKLQkgICAgIHJlZyA8IEJTTV9TUkFNX0xPV0VSX0JPVU5EICsgbGVuOwotCSAgICAgcmVnICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7Ci0JCXZhbCA9IGl3bF9sZWdhY3lfcmVhZF9wcnBoKHByaXYsIHJlZyk7Ci0JCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgewotCQkJSVdMX0VSUihwcml2LCAiQlNNIHVDb2RlIHZlcmlmaWNhdGlvbiBmYWlsZWQgYXQgIgotCQkJCSAgImFkZHIgMHglMDhYKyV1IChvZiAldSksIGlzIDB4JXgsIHMvYiAweCV4XG4iLAotCQkJCSAgQlNNX1NSQU1fTE9XRVJfQk9VTkQsCi0JCQkJICByZWcgLSBCU01fU1JBTV9MT1dFUl9CT1VORCwgbGVuLAotCQkJCSAgdmFsLCBsZTMyX3RvX2NwdSgqaW1hZ2UpKTsKLQkJCXJldHVybiAtRUlPOwotCQl9Ci0JfQotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJTTSBib290c3RyYXAgdUNvZGUgaW1hZ2UgT0tcbiIpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEVFUFJPTSByZWxhdGVkIGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDbGVhciB0aGUgT1dORVJfTVNLLCB0byBlc3RhYmxpc2ggZHJpdmVyIChpbnN0ZWFkIG9mIHVDb2RlIHJ1bm5pbmcgb24KLSAqIGVtYmVkZGVkIGNvbnRyb2xsZXIpIGFzIEVFUFJPTSByZWFkZXI7IGVhY2ggcmVhZCBpcyBhIHNlcmllcyBvZiBwdWxzZXMKLSAqIHRvL2Zyb20gdGhlIEVFUFJPTSBjaGlwLCBub3QgYSBzaW5nbGUgZXZlbnQsIHNvIGV2ZW4gcmVhZHMgY291bGQgY29uZmxpY3QKLSAqIGlmIHRoZXkgd2VyZW4ndCBhcmJpdHJhdGVkIGJ5IHNvbWUgb3duZXJzaGlwIG1lY2hhbmlzbS4gIEhlcmUsIHRoZSBkcml2ZXIKLSAqIHNpbXBseSBjbGFpbXMgb3duZXJzaGlwLCB3aGljaCBzaG91bGQgYmUgc2FmZSB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCi0gKiAoaS5lLiBiZWZvcmUgbG9hZGluZyB1Q29kZSEpLgotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlfaXdsX2xlZ2FjeV9jbGVhcl9iaXQocHJpdiwgQ1NSX0VFUFJPTV9HUCwgQ1NSX0VFUFJPTV9HUF9JRl9PV05FUl9NU0spOwotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlyZXR1cm47Ci19Ci0KLSAvKioKLSAgKiBpd2wzOTQ1X2xvYWRfYnNtIC0gTG9hZCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zCi0gICoKLSAgKiBCU00gb3BlcmF0aW9uOgotICAqCi0gICogVGhlIEJvb3RzdHJhcCBTdGF0ZSBNYWNoaW5lIChCU00pIHN0b3JlcyBhIHNob3J0IGJvb3RzdHJhcCB1Q29kZSBwcm9ncmFtCi0gICogaW4gc3BlY2lhbCBTUkFNIHRoYXQgZG9lcyBub3QgcG93ZXIgZG93biBkdXJpbmcgUkZLSUxMLiAgV2hlbiBwb3dlcmluZyBiYWNrCi0gICogdXAgYWZ0ZXIgcG93ZXItc2F2aW5nIHNsZWVwcyAob3IgZHVyaW5nIGluaXRpYWwgdUNvZGUgbG9hZCksIHRoZSBCU00gbG9hZHMKLSAgKiB0aGUgYm9vdHN0cmFwIHByb2dyYW0gaW50byB0aGUgb24tYm9hcmQgcHJvY2Vzc29yLCBhbmQgc3RhcnRzIGl0LgotICAqCi0gICogVGhlIGJvb3RzdHJhcCBwcm9ncmFtIGxvYWRzICh2aWEgRE1BKSBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgZm9yIGEgbmV3Ci0gICogcHJvZ3JhbSBmcm9tIGhvc3QgRFJBTSBsb2NhdGlvbnMgaW5kaWNhdGVkIGJ5IHRoZSBob3N0IGRyaXZlciBpbiB0aGUKLSAgKiBCU01fRFJBTV8qIHJlZ2lzdGVycy4gIE9uY2UgdGhlIG5ldyBwcm9ncmFtIGlzIGxvYWRlZCwgaXQgc3RhcnRzCi0gICogYXV0b21hdGljYWxseS4KLSAgKgotICAqIFdoZW4gaW5pdGlhbGl6aW5nIHRoZSBOSUMsIHRoZSBob3N0IGRyaXZlciBwb2ludHMgdGhlIEJTTSB0byB0aGUKLSAgKiAiaW5pdGlhbGl6ZSIgdUNvZGUgaW1hZ2UuICBUaGlzIHVDb2RlIHNldHMgdXAgc29tZSBpbnRlcm5hbCBkYXRhLCB0aGVuCi0gICogbm90aWZpZXMgaG9zdCB2aWEgImluaXRpYWxpemUgYWxpdmUiIHRoYXQgaXQgaXMgY29tcGxldGUuCi0gICoKLSAgKiBUaGUgaG9zdCB0aGVuIHJlcGxhY2VzIHRoZSBCU01fRFJBTV8qIHBvaW50ZXIgdmFsdWVzIHRvIHBvaW50IHRvIHRoZQotICAqIG5vcm1hbCBydW50aW1lIHVDb2RlIGluc3RydWN0aW9ucyBhbmQgYSBiYWNrdXAgdUNvZGUgZGF0YSBjYWNoZSBidWZmZXIKLSAgKiAoZmlsbGVkIGluaXRpYWxseSB3aXRoIHN0YXJ0aW5nIGRhdGEgdmFsdWVzIGZvciB0aGUgb24tYm9hcmQgcHJvY2Vzc29yKSwKLSAgKiB0aGVuIHRyaWdnZXJzIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gbG9hZCBhbmQgbGF1bmNoIHRoZSBydW50aW1lIHVDb2RlLAotICAqIHdoaWNoIGJlZ2lucyBub3JtYWwgb3BlcmF0aW9uLgotICAqCi0gICogV2hlbiBkb2luZyBhIHBvd2VyLXNhdmUgc2h1dGRvd24sIHJ1bnRpbWUgdUNvZGUgc2F2ZXMgZGF0YSBTUkFNIGludG8KLSAgKiB0aGUgYmFja3VwIGRhdGEgY2FjaGUgaW4gRFJBTSBiZWZvcmUgU1JBTSBpcyBwb3dlcmVkIGRvd24uCi0gICoKLSAgKiBXaGVuIHBvd2VyaW5nIGJhY2sgdXAsIHRoZSBCU00gbG9hZHMgdGhlIGJvb3RzdHJhcCBwcm9ncmFtLiAgVGhpcyByZWxvYWRzCi0gICogdGhlIHJ1bnRpbWUgdUNvZGUgaW5zdHJ1Y3Rpb25zIGFuZCB0aGUgYmFja3VwIGRhdGEgY2FjaGUgaW50byBTUkFNLAotICAqIGFuZCByZS1sYXVuY2hlcyB0aGUgcnVudGltZSB1Q29kZSBmcm9tIHdoZXJlIGl0IGxlZnQgb2ZmLgotICAqLwotc3RhdGljIGludCBpd2wzOTQ1X2xvYWRfYnNtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlfX2xlMzIgKmltYWdlID0gcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JdTMyIGxlbiA9IHByaXYtPnVjb2RlX2Jvb3QubGVuOwotCWRtYV9hZGRyX3QgcGluc3Q7Ci0JZG1hX2FkZHJfdCBwZGF0YTsKLQl1MzIgaW5zdF9sZW47Ci0JdTMyIGRhdGFfbGVuOwotCWludCByYzsKLQlpbnQgaTsKLQl1MzIgZG9uZTsKLQl1MzIgcmVnX29mZnNldDsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJCZWdpbiBsb2FkIGJzbVxuIik7Ci0KLQkvKiBtYWtlIHN1cmUgYm9vdHN0cmFwIHByb2dyYW0gaXMgbm8gbGFyZ2VyIHRoYW4gQlNNJ3MgU1JBTSBzaXplICovCi0JaWYgKGxlbiA+IElXTDM5X01BWF9CU01fU0laRSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBUZWxsIGJvb3RzdHJhcCB1Q29kZSB3aGVyZSB0byBmaW5kIHRoZSAiSW5pdGlhbGl6ZSIgdUNvZGUKLQkqICAgaW4gaG9zdCBEUkFNIC4uLiBob3N0IERSQU0gcGh5c2ljYWwgYWRkcmVzcyBiaXRzIDMxOjAgZm9yIDM5NDUuCi0JKiBOT1RFOiAgaXdsMzk0NV9pbml0aWFsaXplX2FsaXZlX3N0YXJ0KCkgd2lsbCByZXBsYWNlIHRoZXNlIHZhbHVlcywKLQkqICAgICAgICBhZnRlciB0aGUgImluaXRpYWxpemUiIHVDb2RlIGhhcyBydW4sIHRvIHBvaW50IHRvCi0JKiAgICAgICAgcnVudGltZS9wcm90b2NvbCBpbnN0cnVjdGlvbnMgYW5kIGJhY2t1cCBkYXRhIGNhY2hlLiAqLwotCXBpbnN0ID0gcHJpdi0+dWNvZGVfaW5pdC5wX2FkZHI7Ci0JcGRhdGEgPSBwcml2LT51Y29kZV9pbml0X2RhdGEucF9hZGRyOwotCWluc3RfbGVuID0gcHJpdi0+dWNvZGVfaW5pdC5sZW47Ci0JZGF0YV9sZW4gPSBwcml2LT51Y29kZV9pbml0X2RhdGEubGVuOwotCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0lOU1RfUFRSX1JFRywgcGluc3QpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9EQVRBX1BUUl9SRUcsIHBkYXRhKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9CWVRFQ09VTlRfUkVHLCBpbnN0X2xlbik7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0RBVEFfQllURUNPVU5UX1JFRywgZGF0YV9sZW4pOwotCi0JLyogRmlsbCBCU00gbWVtb3J5IHdpdGggYm9vdHN0cmFwIGluc3RydWN0aW9ucyAqLwotCWZvciAocmVnX29mZnNldCA9IEJTTV9TUkFNX0xPV0VSX0JPVU5EOwotCSAgICAgcmVnX29mZnNldCA8IEJTTV9TUkFNX0xPV0VSX0JPVU5EICsgbGVuOwotCSAgICAgcmVnX29mZnNldCArPSBzaXplb2YodTMyKSwgaW1hZ2UrKykKLQkJX2l3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCByZWdfb2Zmc2V0LAotCQkJCQkgIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCi0JcmMgPSBpd2wzOTQ1X3ZlcmlmeV9ic20ocHJpdik7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQkvKiBUZWxsIEJTTSB0byBjb3B5IGZyb20gQlNNIFNSQU0gaW50byBpbnN0cnVjdGlvbiBTUkFNLCB3aGVuIGFza2VkICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9XUl9NRU1fU1JDX1JFRywgMHgwKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX1dSX01FTV9EU1RfUkVHLAotCQkJCSBJV0wzOV9SVENfSU5TVF9MT1dFUl9CT1VORCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9XUl9EV0NPVU5UX1JFRywgbGVuIC8gc2l6ZW9mKHUzMikpOwotCi0JLyogTG9hZCBib290c3RyYXAgY29kZSBpbnRvIGluc3RydWN0aW9uIFNSQU0gbm93LAotCSAqICAgdG8gcHJlcGFyZSB0byBsb2FkICJpbml0aWFsaXplIiB1Q29kZSAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fV1JfQ1RSTF9SRUcsCi0JCUJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQpOwotCi0JLyogV2FpdCBmb3IgbG9hZCBvZiBib290c3RyYXAgdUNvZGUgdG8gZmluaXNoICovCi0JZm9yIChpID0gMDsgaSA8IDEwMDsgaSsrKSB7Ci0JCWRvbmUgPSBpd2xfbGVnYWN5X3JlYWRfcHJwaChwcml2LCBCU01fV1JfQ1RSTF9SRUcpOwotCQlpZiAoIShkb25lICYgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVCkpCi0JCQlicmVhazsKLQkJdWRlbGF5KDEwKTsKLQl9Ci0JaWYgKGkgPCAxMDApCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJCU00gd3JpdGUgY29tcGxldGUsIHBvbGwgJWQgaXRlcmF0aW9uc1xuIiwgaSk7Ci0JZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIkJTTSB3cml0ZSBkaWQgbm90IGNvbXBsZXRlIVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qIEVuYWJsZSBmdXR1cmUgYm9vdCBsb2FkcyB3aGVuZXZlciBwb3dlciBtYW5hZ2VtZW50IHVuaXQgdHJpZ2dlcnMgaXQKLQkgKiAgIChlLmcuIHdoZW4gcG93ZXJpbmcgYmFjayB1cCBhZnRlciBwb3dlci1zYXZlIHNodXRkb3duKSAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fV1JfQ1RSTF9SRUcsCi0JCUJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlRfRU4pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2hjbWRfb3BzIGl3bDM5NDVfaGNtZCA9IHsKLQkucnhvbl9hc3NvYyA9IGl3bDM5NDVfc2VuZF9yeG9uX2Fzc29jLAotCS5jb21taXRfcnhvbiA9IGl3bDM5NDVfY29tbWl0X3J4b24sCi19OwotCi1zdGF0aWMgc3RydWN0IGl3bF9saWJfb3BzIGl3bDM5NDVfbGliID0gewotCS50eHFfYXR0YWNoX2J1Zl90b190ZmQgPSBpd2wzOTQ1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZCwKLQkudHhxX2ZyZWVfdGZkID0gaXdsMzk0NV9od190eHFfZnJlZV90ZmQsCi0JLnR4cV9pbml0ID0gaXdsMzk0NV9od190eF9xdWV1ZV9pbml0LAotCS5sb2FkX3Vjb2RlID0gaXdsMzk0NV9sb2FkX2JzbSwKLQkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaXdsMzk0NV9kdW1wX25pY19lcnJvcl9sb2csCi0JLmFwbV9vcHMgPSB7Ci0JCS5pbml0ID0gaXdsMzk0NV9hcG1faW5pdCwKLQkJLmNvbmZpZyA9IGl3bDM5NDVfbmljX2NvbmZpZywKLQl9LAotCS5lZXByb21fb3BzID0gewotCQkucmVndWxhdG9yeV9iYW5kcyA9IHsKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMV9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMl9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfM19DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNF9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNV9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCwKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCwKLQkJfSwKLQkJLmFjcXVpcmVfc2VtYXBob3JlID0gaXdsMzk0NV9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUsCi0JCS5yZWxlYXNlX3NlbWFwaG9yZSA9IGl3bDM5NDVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlLAotCX0sCi0JLnNlbmRfdHhfcG93ZXIJPSBpd2wzOTQ1X3NlbmRfdHhfcG93ZXIsCi0JLmlzX3ZhbGlkX3J0Y19kYXRhX2FkZHIgPSBpd2wzOTQ1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIsCi0KLQkuZGVidWdmc19vcHMgPSB7Ci0JCS5yeF9zdGF0c19yZWFkID0gaXdsMzk0NV91Y29kZV9yeF9zdGF0c19yZWFkLAotCQkudHhfc3RhdHNfcmVhZCA9IGl3bDM5NDVfdWNvZGVfdHhfc3RhdHNfcmVhZCwKLQkJLmdlbmVyYWxfc3RhdHNfcmVhZCA9IGl3bDM5NDVfdWNvZGVfZ2VuZXJhbF9zdGF0c19yZWFkLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfb3BzIGl3bDM5NDVfbGVnYWN5X29wcyA9IHsKLQkucG9zdF9hc3NvY2lhdGUgPSBpd2wzOTQ1X3Bvc3RfYXNzb2NpYXRlLAotCS5jb25maWdfYXAgPSBpd2wzOTQ1X2NvbmZpZ19hcCwKLQkubWFuYWdlX2lic3Nfc3RhdGlvbiA9IGl3bDM5NDVfbWFuYWdlX2lic3Nfc3RhdGlvbiwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2hjbWRfdXRpbHNfb3BzIGl3bDM5NDVfaGNtZF91dGlscyA9IHsKLQkuZ2V0X2hjbWRfc2l6ZSA9IGl3bDM5NDVfZ2V0X2hjbWRfc2l6ZSwKLQkuYnVpbGRfYWRkc3RhX2hjbWQgPSBpd2wzOTQ1X2J1aWxkX2FkZHN0YV9oY21kLAotCS5yZXF1ZXN0X3NjYW4gPSBpd2wzOTQ1X3JlcXVlc3Rfc2NhbiwKLQkucG9zdF9zY2FuID0gaXdsMzk0NV9wb3N0X3NjYW4sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9vcHMgaXdsMzk0NV9vcHMgPSB7Ci0JLmxpYiA9ICZpd2wzOTQ1X2xpYiwKLQkuaGNtZCA9ICZpd2wzOTQ1X2hjbWQsCi0JLnV0aWxzID0gJml3bDM5NDVfaGNtZF91dGlscywKLQkubGVkID0gJml3bDM5NDVfbGVkX29wcywKLQkubGVnYWN5ID0gJml3bDM5NDVfbGVnYWN5X29wcywKLQkuaWVlZTgwMjExX29wcyA9ICZpd2wzOTQ1X2h3X29wcywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zIGl3bDM5NDVfYmFzZV9wYXJhbXMgPSB7Ci0JLmVlcHJvbV9zaXplID0gSVdMMzk0NV9FRVBST01fSU1HX1NJWkUsCi0JLm51bV9vZl9xdWV1ZXMgPSBJV0wzOV9OVU1fUVVFVUVTLAotCS5wbGxfY2ZnX3ZhbCA9IENTUjM5X0FOQV9QTExfQ0ZHX1ZBTCwKLQkuc2V0X2wwcyA9IGZhbHNlLAotCS51c2VfYnNtID0gdHJ1ZSwKLQkubGVkX2NvbXBlbnNhdGlvbiA9IDY0LAotCS53ZF90aW1lb3V0ID0gSVdMX0RFRl9XRF9USU1FT1VULAotfTsKLQotc3RhdGljIHN0cnVjdCBpd2xfY2ZnIGl3bDM5NDVfYmdfY2ZnID0gewotCS5uYW1lID0gIjM5NDVCRyIsCi0JLmZ3X25hbWVfcHJlID0gSVdMMzk0NV9GV19QUkUsCi0JLnVjb2RlX2FwaV9tYXggPSBJV0wzOTQ1X1VDT0RFX0FQSV9NQVgsCi0JLnVjb2RlX2FwaV9taW4gPSBJV0wzOTQ1X1VDT0RFX0FQSV9NSU4sCi0JLnNrdSA9IElXTF9TS1VfRywKLQkuZWVwcm9tX3ZlciA9IEVFUFJPTV8zOTQ1X0VFUFJPTV9WRVJTSU9OLAotCS5vcHMgPSAmaXdsMzk0NV9vcHMsCi0JLm1vZF9wYXJhbXMgPSAmaXdsMzk0NV9tb2RfcGFyYW1zLAotCS5iYXNlX3BhcmFtcyA9ICZpd2wzOTQ1X2Jhc2VfcGFyYW1zLAotCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCi19OwotCi1zdGF0aWMgc3RydWN0IGl3bF9jZmcgaXdsMzk0NV9hYmdfY2ZnID0gewotCS5uYW1lID0gIjM5NDVBQkciLAotCS5md19uYW1lX3ByZSA9IElXTDM5NDVfRldfUFJFLAotCS51Y29kZV9hcGlfbWF4ID0gSVdMMzk0NV9VQ09ERV9BUElfTUFYLAotCS51Y29kZV9hcGlfbWluID0gSVdMMzk0NV9VQ09ERV9BUElfTUlOLAotCS5za3UgPSBJV0xfU0tVX0F8SVdMX1NLVV9HLAotCS5lZXByb21fdmVyID0gRUVQUk9NXzM5NDVfRUVQUk9NX1ZFUlNJT04sCi0JLm9wcyA9ICZpd2wzOTQ1X29wcywKLQkubW9kX3BhcmFtcyA9ICZpd2wzOTQ1X21vZF9wYXJhbXMsCi0JLmJhc2VfcGFyYW1zID0gJml3bDM5NDVfYmFzZV9wYXJhbXMsCi0JLmxlZF9tb2RlID0gSVdMX0xFRF9CTElOSywKLX07Ci0KLURFRklORV9QQ0lfREVWSUNFX1RBQkxFKGl3bDM5NDVfaHdfY2FyZF9pZHMpID0gewotCXtJV0xfUENJX0RFVklDRSgweDQyMjIsIDB4MTAwNSwgaXdsMzk0NV9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjIyLCAweDEwMzQsIGl3bDM5NDVfYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIyMiwgMHgxMDQ0LCBpd2wzOTQ1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDQyMjcsIDB4MTAxNCwgaXdsMzk0NV9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjIyLCBQQ0lfQU5ZX0lELCBpd2wzOTQ1X2FiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHg0MjI3LCBQQ0lfQU5ZX0lELCBpd2wzOTQ1X2FiZ19jZmcpfSwKLQl7MH0KLX07Ci0KLU1PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpd2wzOTQ1X2h3X2NhcmRfaWRzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtMzk0NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTE4YjU5Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC0zOTQ1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUGxlYXNlIHVzZSB0aGlzIGZpbGUgKGl3bC0zOTQ1LmgpIGZvciBkcml2ZXIgaW1wbGVtZW50YXRpb24gZGVmaW5pdGlvbnMuCi0gKiBQbGVhc2UgdXNlIGl3bC0zOTQ1LWNvbW1hbmRzLmggZm9yIHVDb2RlIEFQSSBkZWZpbml0aW9ucy4KLSAqIFBsZWFzZSB1c2UgaXdsLTM5NDUtaHcuaCBmb3IgaGFyZHdhcmUtcmVsYXRlZCBkZWZpbml0aW9ucy4KLSAqLwotCi0jaWZuZGVmIF9faXdsXzM5NDVfaF9fCi0jZGVmaW5lIF9faXdsXzM5NDVfaF9fCi0KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4gLyogZm9yIHN0cnVjdCBwY2lfZGV2aWNlX2lkICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgotCi0vKiBIYXJkd2FyZSBzcGVjaWZpYyBmaWxlIGRlZmluZXMgdGhlIFBDSSBJRHMgdGFibGUgZm9yIHRoYXQgaGFyZHdhcmUgbW9kdWxlICovCi1leHRlcm4gY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgaXdsMzk0NV9od19jYXJkX2lkc1tdOwotCi0jaW5jbHVkZSAiaXdsLWNzci5oIgotI2luY2x1ZGUgIml3bC1wcnBoLmgiCi0jaW5jbHVkZSAiaXdsLWZoLmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUtaHcuaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLSNpbmNsdWRlICJpd2wtcG93ZXIuaCIKLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWxlZC5oIgotCi0vKiBIaWdoZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0wzOTQ1X1VDT0RFX0FQSV9NQVggMgotCi0vKiBMb3dlc3QgZmlybXdhcmUgQVBJIHZlcnNpb24gc3VwcG9ydGVkICovCi0jZGVmaW5lIElXTDM5NDVfVUNPREVfQVBJX01JTiAxCi0KLSNkZWZpbmUgSVdMMzk0NV9GV19QUkUJIml3bHdpZmktMzk0NS0iCi0jZGVmaW5lIF9JV0wzOTQ1X01PRFVMRV9GSVJNV0FSRShhcGkpIElXTDM5NDVfRldfUFJFICNhcGkgIi51Y29kZSIKLSNkZWZpbmUgSVdMMzk0NV9NT0RVTEVfRklSTVdBUkUoYXBpKSBfSVdMMzk0NV9NT0RVTEVfRklSTVdBUkUoYXBpKQotCi0vKiBEZWZhdWx0IG5vaXNlIGxldmVsIHRvIHJlcG9ydCB3aGVuIG5vaXNlIG1lYXN1cmVtZW50IGlzIG5vdCBhdmFpbGFibGUuCi0gKiAgIFRoaXMgbWF5IGJlIGJlY2F1c2Ugd2UncmU6Ci0gKiAgIDEpICBOb3QgYXNzb2NpYXRlZCAoNDk2NSwgbm8gYmVhY29uIHN0YXRpc3RpY3MgYmVpbmcgc2VudCB0byBkcml2ZXIpCi0gKiAgIDIpICBTY2FubmluZyAobm9pc2UgbWVhc3VyZW1lbnQgZG9lcyBub3QgYXBwbHkgdG8gYXNzb2NpYXRlZCBjaGFubmVsKQotICogICAzKSAgUmVjZWl2aW5nIENDSyAoMzk0NSBkZWxpdmVycyBub2lzZSBpbmZvIG9ubHkgZm9yIE9GRE0gZnJhbWVzKQotICogVXNlIGRlZmF1bHQgbm9pc2UgdmFsdWUgb2YgLTEyNyAuLi4gdGhpcyBpcyBiZWxvdyB0aGUgcmFuZ2Ugb2YgbWVhc3VyYWJsZQotICogICBSeCBkQm0gZm9yIGVpdGhlciAzOTQ1IG9yIDQ5NjUsIHNvIGl0IGNhbiBpbmRpY2F0ZSAidW5tZWFzdXJhYmxlIiB0byB1c2VyLgotICogICBBbHNvLCAtMTI3IHdvcmtzIGJldHRlciB0aGFuIDAgd2hlbiBhdmVyYWdpbmcgZnJhbWVzIHdpdGgvd2l0aG91dAotICogICBub2lzZSBpbmZvIChlLmcuIGF2ZXJhZ2luZyBtaWdodCBiZSBkb25lIGluIGFwcCk7IG1lYXN1cmVkIGRCbSB2YWx1ZXMgYXJlCi0gKiAgIGFsd2F5cyBuZWdhdGl2ZSAuLi4gdXNpbmcgYSBuZWdhdGl2ZSB2YWx1ZSBhcyB0aGUgZGVmYXVsdCBrZWVwcyBhbGwKLSAqICAgYXZlcmFnZXMgd2l0aGluIGFuIHM4J3MgKHVzZWQgaW4gc29tZSBhcHBzKSByYW5nZSBvZiBuZWdhdGl2ZSB2YWx1ZXMuICovCi0jZGVmaW5lIElXTF9OT0lTRV9NRUFTX05PVF9BVkFJTEFCTEUgKC0xMjcpCi0KLS8qIE1vZHVsZSBwYXJhbWV0ZXJzIGFjY2Vzc2libGUgZnJvbSBpd2wtKi5jICovCi1leHRlcm4gc3RydWN0IGl3bF9tb2RfcGFyYW1zIGl3bDM5NDVfbW9kX3BhcmFtczsKLQotc3RydWN0IGl3bDM5NDVfcmF0ZV9zY2FsZV9kYXRhIHsKLQl1NjQgZGF0YTsKLQlzMzIgc3VjY2Vzc19jb3VudGVyOwotCXMzMiBzdWNjZXNzX3JhdGlvOwotCXMzMiBjb3VudGVyOwotCXMzMiBhdmVyYWdlX3RwdDsKLQl1bnNpZ25lZCBsb25nIHN0YW1wOwotfTsKLQotc3RydWN0IGl3bDM5NDVfcnNfc3RhIHsKLQlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2OwotCXMzMiAqZXhwZWN0ZWRfdHB0OwotCXVuc2lnbmVkIGxvbmcgbGFzdF9wYXJ0aWFsX2ZsdXNoOwotCXVuc2lnbmVkIGxvbmcgbGFzdF9mbHVzaDsKLQl1MzIgZmx1c2hfdGltZTsKLQl1MzIgbGFzdF90eF9wYWNrZXRzOwotCXUzMiB0eF9wYWNrZXRzOwotCXU4IHRnZzsKLQl1OCBmbHVzaF9wZW5kaW5nOwotCXU4IHN0YXJ0X3JhdGU7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgcmF0ZV9zY2FsZV9mbHVzaDsKLQlzdHJ1Y3QgaXdsMzk0NV9yYXRlX3NjYWxlX2RhdGEgd2luW0lXTF9SQVRFX0NPVU5UXzM5NDVdOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0Jc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGU7Ci0jZW5kaWYKLQotCS8qIHVzZWQgdG8gYmUgaW4gc3RhX2luZm8gKi8KLQlpbnQgbGFzdF90eHJhdGVfaWR4OwotfTsKLQotCi0vKgotICogVGhlIGNvbW1vbiBzdHJ1Y3QgTVVTVCBiZSBmaXJzdCBiZWNhdXNlIGl0IGlzIHNoYXJlZCBiZXR3ZWVuCi0gKiAzOTQ1IGFuZCA0OTY1IQotICovCi1zdHJ1Y3QgaXdsMzk0NV9zdGFfcHJpdiB7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXZfY29tbW9uIGNvbW1vbjsKLQlzdHJ1Y3QgaXdsMzk0NV9yc19zdGEgcnNfc3RhOwotfTsKLQotZW51bSBpd2wzOTQ1X2FudGVubmEgewotCUlXTF9BTlRFTk5BX0RJVkVSU0lUWSwKLQlJV0xfQU5URU5OQV9NQUlOLAotCUlXTF9BTlRFTk5BX0FVWAotfTsKLQotLyoKLSAqIFJUUyB0aHJlc2hvbGQgaGVyZSBpcyB0b3RhbCBzaXplIFsyMzQ3XSBtaW51cyA0IEZDUyBieXRlcwotICogUGVyIHNwZWM6Ci0gKiAgIGEgdmFsdWUgb2YgMCBtZWFucyBSVFMgb24gYWxsIGRhdGEvbWFuYWdlbWVudCBwYWNrZXRzCi0gKiAgIGEgdmFsdWUgPiBtYXggTVNEVSBzaXplIG1lYW5zIG5vIFJUUwotICogZWxzZSBSVFMgZm9yIGRhdGEvbWFuYWdlbWVudCBmcmFtZXMgd2hlcmUgTVBEVSBpcyBsYXJnZXIKLSAqICAgdGhhbiBSVFMgdmFsdWUuCi0gKi8KLSNkZWZpbmUgREVGQVVMVF9SVFNfVEhSRVNIT0xEICAgICAyMzQ3VQotI2RlZmluZSBNSU5fUlRTX1RIUkVTSE9MRCAgICAgICAgIDBVCi0jZGVmaW5lIE1BWF9SVFNfVEhSRVNIT0xEICAgICAgICAgMjM0N1UKLSNkZWZpbmUgTUFYX01TRFVfU0laRQkJICAyMzA0VQotI2RlZmluZSBNQVhfTVBEVV9TSVpFCQkgIDIzNDZVCi0jZGVmaW5lIERFRkFVTFRfQkVBQ09OX0lOVEVSVkFMICAgMTAwVQotI2RlZmluZQlERUZBVUxUX1NIT1JUX1JFVFJZX0xJTUlUIDdVCi0jZGVmaW5lCURFRkFVTFRfTE9OR19SRVRSWV9MSU1JVCAgNFUKLQotI2RlZmluZSBJV0xfVFhfRklGT19BQzAJMAotI2RlZmluZSBJV0xfVFhfRklGT19BQzEJMQotI2RlZmluZSBJV0xfVFhfRklGT19BQzIJMgotI2RlZmluZSBJV0xfVFhfRklGT19BQzMJMwotI2RlZmluZSBJV0xfVFhfRklGT19IQ0NBXzEJNQotI2RlZmluZSBJV0xfVFhfRklGT19IQ0NBXzIJNgotI2RlZmluZSBJV0xfVFhfRklGT19OT05FCTcKLQotI2RlZmluZSBJRUVFODAyMTFfREFUQV9MRU4gICAgICAgICAgICAgIDIzMDQKLSNkZWZpbmUgSUVFRTgwMjExXzRBRERSX0xFTiAgICAgICAgICAgICAzMAotI2RlZmluZSBJRUVFODAyMTFfSExFTiAgICAgICAgICAgICAgICAgIChJRUVFODAyMTFfNEFERFJfTEVOKQotI2RlZmluZSBJRUVFODAyMTFfRlJBTUVfTEVOICAgICAgICAgICAgIChJRUVFODAyMTFfREFUQV9MRU4gKyBJRUVFODAyMTFfSExFTikKLQotc3RydWN0IGl3bDM5NDVfZnJhbWUgewotCXVuaW9uIHsKLQkJc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWU7Ci0JCXN0cnVjdCBpd2wzOTQ1X3R4X2JlYWNvbl9jbWQgYmVhY29uOwotCQl1OCByYXdbSUVFRTgwMjExX0ZSQU1FX0xFTl07Ci0JCXU4IGNtZFszNjBdOwotCX0gdTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi0jZGVmaW5lIFNFUV9UT19TTihzZXEpICgoKHNlcSkgJiBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQpCi0jZGVmaW5lIFNOX1RPX1NFUShzc24pICgoKHNzbikgPDwgNCkgJiBJRUVFODAyMTFfU0NUTF9TRVEpCi0jZGVmaW5lIE1BWF9TTiAoKElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKLQotI2RlZmluZSBTVVBfUkFURV8xMUFfTUFYX05VTV9DSEFOTkVMUyAgOAotI2RlZmluZSBTVVBfUkFURV8xMUJfTUFYX05VTV9DSEFOTkVMUyAgNAotI2RlZmluZSBTVVBfUkFURV8xMUdfTUFYX05VTV9DSEFOTkVMUyAgMTIKLQotI2RlZmluZSBJV0xfU1VQUE9SVEVEX1JBVEVTX0lFX0xFTiAgICAgICAgIDgKLQotI2RlZmluZSBTQ0FOX0lOVEVSVkFMIDEwMAotCi0jZGVmaW5lIE1BWF9USURfQ09VTlQgICAgICAgIDkKLQotI2RlZmluZSBJV0xfSU5WQUxJRF9SQVRFICAgICAweEZGCi0jZGVmaW5lIElXTF9JTlZBTElEX1ZBTFVFICAgIC0xCi0KLSNkZWZpbmUgU1RBX1BTX1NUQVRVU19XQUtFICAgICAgICAgICAgIDAKLSNkZWZpbmUgU1RBX1BTX1NUQVRVU19TTEVFUCAgICAgICAgICAgIDEKLQotc3RydWN0IGl3bDM5NDVfaWJzc19zZXEgewotCXU4IG1hY1tFVEhfQUxFTl07Ci0JdTE2IHNlcV9udW07Ci0JdTE2IGZyYWdfbnVtOwotCXVuc2lnbmVkIGxvbmcgcGFja2V0X3RpbWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotfTsKLQotI2RlZmluZSBJV0xfUlhfSERSKHgpICgoc3RydWN0IGl3bDM5NDVfcnhfZnJhbWVfaGRyICopKFwKLQkJICAgICAgIHgtPnUucnhfZnJhbWUuc3RhdHMucGF5bG9hZCArIFwKLQkJICAgICAgIHgtPnUucnhfZnJhbWUuc3RhdHMucGh5X2NvdW50KSkKLSNkZWZpbmUgSVdMX1JYX0VORCh4KSAoKHN0cnVjdCBpd2wzOTQ1X3J4X2ZyYW1lX2VuZCAqKShcCi0JCSAgICAgICBJV0xfUlhfSERSKHgpLT5wYXlsb2FkICsgXAotCQkgICAgICAgbGUxNl90b19jcHUoSVdMX1JYX0hEUih4KS0+bGVuKSkpCi0jZGVmaW5lIElXTF9SWF9TVEFUUyh4KSAoJngtPnUucnhfZnJhbWUuc3RhdHMpCi0jZGVmaW5lIElXTF9SWF9EQVRBKHgpIChJV0xfUlhfSERSKHgpLT5wYXlsb2FkKQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gaXdsMzk0NS1iYXNlLmMgd2hpY2ggYXJlIGZvcndhcmQgZGVjbGFyZWQgaGVyZQotICogZm9yIHVzZSBieSBpd2wtKi5jCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIGludCBpd2wzOTQ1X2NhbGNfZGJfZnJvbV9yYXRpbyhpbnQgc2lnX3JhdGlvKTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfcnhfcmVwbGVuaXNoKHZvaWQgKmRhdGEpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9yeF9xdWV1ZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGl3bDM5NDVfZmlsbF9iZWFjb25fZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLCBpbnQgbGVmdCk7Ci1leHRlcm4gaW50IGl3bDM5NDVfZHVtcF9uaWNfZXZlbnRfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmdWxsX2xvZywKLQkJCQkgICAgICAgY2hhciAqKmJ1ZiwgYm9vbCBkaXNwbGF5KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gaXdsLVszNF0qLmMgd2hpY2ggYXJlIGZvcndhcmQgZGVjbGFyZWQgaGVyZQotICogZm9yIHVzZSBieSBpd2wzOTQ1LWJhc2UuYwotICoKLSAqIE5PVEU6ICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBoYXJkd2FyZSBzcGVjaWZpYwotICogd2hpY2ggaXMgd2h5IHRoZXkgYXJlIGluIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBmaWxlcyAodnMuIGl3bC1iYXNlLmMpCi0gKgotICogTmFtaW5nIGNvbnZlbnRpb24gLS0KLSAqIGl3bDM5NDVfICAgICAgICAgPC0tIEl0cyBwYXJ0IG9mIGl3bHdpZmkgKHNob3VsZCBiZSBjaGFuZ2VkIHRvIGl3bDM5NDVfKQotICogaXdsMzk0NV9od18gICAgICA8LS0gSGFyZHdhcmUgc3BlY2lmaWMgKGltcGxlbWVudGVkIGluIGl3bC1YWFhYLmMgYnkgYWxsIEhXKQotICogaXdsWFhYWF8gICAgIDwtLSBIYXJkd2FyZSBzcGVjaWZpYyAoaW1wbGVtZW50ZWQgaW4gaXdsLVhYWFguYyBmb3IgWFhYWCkKLSAqIGl3bDM5NDVfYmdfICAgICAgPC0tIENhbGxlZCBmcm9tIHdvcmsgcXVldWUgY29udGV4dAotICogaXdsMzk0NV9tYWNfICAgICA8LS0gbWFjODAyMTEgY2FsbGJhY2sKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWV4dGVybiB2b2lkIGl3bDM5NDVfaHdfcnhfaGFuZGxlcl9zZXR1cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIHZvaWQgaXdsMzk0NV9od19zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X2h3X2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gaW50IGl3bDM5NDVfaHdfcnhxX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gaW50IGl3bDM5NDVfaHdfbmljX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9od19uaWNfc3RvcF9tYXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X2h3X3R4cV9jdHhfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X25pY19yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJCSAgICBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4sCi0JCQkJCSAgICB1OCByZXNldCwgdTggcGFkKTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKTsKLWV4dGVybiBpbnQgaXdsMzk0NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9od190eF9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpOwotZXh0ZXJuIHVuc2lnbmVkIGludCBpd2wzOTQ1X2h3X2dldF9iZWFjb25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgc3RydWN0IGl3bDM5NDVfZnJhbWUgKmZyYW1lLCB1OCByYXRlKTsKLXZvaWQgaXdsMzk0NV9od19idWlsZF90eF9jbWRfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCwKLQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKLQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkJICBpbnQgc3RhX2lkLCBpbnQgdHhfaWQpOwotZXh0ZXJuIGludCBpd2wzOTQ1X2h3X3JlZ19zZW5kX3R4cG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9od19yZWdfc2V0X3R4cG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzOCBwb3dlcik7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X2h3X3J4X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bDM5NDVfcmVwbHlfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X2Rpc2FibGVfZXZlbnRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gaW50IGl3bDQ5NjVfZ2V0X3RlbXBlcmF0dXJlKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X3Bvc3RfYXNzb2NpYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X2NvbmZpZ19hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi1leHRlcm4gaW50IGl3bDM5NDVfY29tbWl0X3J4b24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotCi0vKioKLSAqIGl3bDM5NDVfaHdfZmluZF9zdGF0aW9uIC0gRmluZCBzdGF0aW9uIGlkIGZvciBhIGdpdmVuIEJTU0lECi0gKiBAYnNzaWQ6IE1BQyBhZGRyZXNzIG9mIHN0YXRpb24gSUQgdG8gZmluZAotICoKLSAqIE5PVEU6ICBUaGlzIHNob3VsZCBub3QgYmUgaGFyZHdhcmUgc3BlY2lmaWMgYnV0IHRoZSBjb2RlIGhhcwotICogbm90IHlldCBiZWVuIG1lcmdlZCBpbnRvIGEgc2luZ2xlIGNvbW1vbiBsYXllciBmb3IgbWFuYWdpbmcgdGhlCi0gKiBzdGF0aW9uIHRhYmxlcy4KLSAqLwotZXh0ZXJuIHU4IGl3bDM5NDVfaHdfZmluZF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY29uc3QgdTggKmJzc2lkKTsKLQotZXh0ZXJuIHN0cnVjdCBpZWVlODAyMTFfb3BzIGl3bDM5NDVfaHdfb3BzOwotCi0vKgotICogRm9yd2FyZCBkZWNsYXJlIGl3bC0zOTQ1LmMgZnVuY3Rpb25zIGZvciBpd2wzOTQ1LWJhc2UuYwotICovCi1leHRlcm4gX19sZTMyIGl3bDM5NDVfZ2V0X2FudGVubmFfZmxhZ3MoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsMzk0NV9pbml0X2h3X3JhdGVfdGFibGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiB2b2lkIGl3bDM5NDVfcmVnX3R4cG93ZXJfcGVyaW9kaWMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBpbnQgaXdsMzk0NV90eHBvd2VyX3NldF9mcm9tX2VlcHJvbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi1leHRlcm4gY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKml3bDM5NDVfZ2V0X2NoYW5uZWxfaW5mbygKLQljb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgdTE2IGNoYW5uZWwpOwotCi1leHRlcm4gaW50IGl3bDM5NDVfcnNfbmV4dF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHJhdGUpOwotCi0vKiBzY2FubmluZyAqLwotaW50IGl3bDM5NDVfcmVxdWVzdF9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci12b2lkIGl3bDM5NDVfcG9zdF9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLS8qIHJhdGVzICovCi1leHRlcm4gY29uc3Qgc3RydWN0IGl3bDM5NDVfcmF0ZV9pbmZvIGl3bDM5NDVfcmF0ZXNbSVdMX1JBVEVfQ09VTlRfMzk0NV07Ci0KLS8qIFJlcXVpcmVzIGZ1bGwgZGVjbGFyYXRpb24gb2YgaXdsX3ByaXYgYmVmb3JlIGluY2x1ZGluZyAqLwotI2luY2x1ZGUgIml3bC1pby5oIgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWNhbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1jYWxpYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjJkODc3Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWNhbGliLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC00OTY1LWNhbGliLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogSU5JVCBjYWxpYnJhdGlvbnMgZnJhbWV3b3JrCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfZGF0YSB7Ci0JdTMyIGJlYWNvbl9zaWxlbmNlX3Jzc2lfYTsKLQl1MzIgYmVhY29uX3NpbGVuY2VfcnNzaV9iOwotCXUzMiBiZWFjb25fc2lsZW5jZV9yc3NpX2M7Ci0JdTMyIGJlYWNvbl9lbmVyZ3lfYTsKLQl1MzIgYmVhY29uX2VuZXJneV9iOwotCXUzMiBiZWFjb25fZW5lcmd5X2M7Ci19OwotCi12b2lkIGl3bDQ5NjVfY2FsaWJfZnJlZV9yZXN1bHRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBJV0xfQ0FMSUJfTUFYOyBpKyspIHsKLQkJa2ZyZWUocHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWYpOwotCQlwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1ZiA9IE5VTEw7Ci0JCXByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmX2xlbiA9IDA7Ci0JfQotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJVTlRJTUUgY2FsaWJyYXRpb25zIGZyYW1ld29yawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiAiZmFsc2UgYWxhcm1zIiBhcmUgc2lnbmFscyB0aGF0IG91ciBEU1AgdHJpZXMgdG8gbG9jayBvbnRvLAotICogICBidXQgdGhlbiBkZXRlcm1pbmVzIHRoYXQgdGhleSBhcmUgZWl0aGVyIG5vaXNlLCBvciB0cmFuc21pc3Npb25zCi0gKiAgIGZyb20gYSBkaXN0YW50IHdpcmVsZXNzIG5ldHdvcmsgKGFsc28gIm5vaXNlIiwgcmVhbGx5KSB0aGF0IGdldAotICogICAic3RlcHBlZCBvbiIgYnkgc3Ryb25nZXIgdHJhbnNtaXNzaW9ucyB3aXRoaW4gb3VyIG93biBuZXR3b3JrLgotICogVGhpcyBhbGdvcml0aG0gYXR0ZW1wdHMgdG8gc2V0IGEgc2Vuc2l0aXZpdHkgbGV2ZWwgdGhhdCBpcyBoaWdoCi0gKiAgIGVub3VnaCB0byByZWNlaXZlIGFsbCBvZiBvdXIgb3duIG5ldHdvcmsgdHJhZmZpYywgYnV0IG5vdCBzbwotICogICBoaWdoIHRoYXQgb3VyIERTUCBnZXRzIHRvbyBidXN5IHRyeWluZyB0byBsb2NrIG9udG8gbm9uLW5ldHdvcmsKLSAqICAgYWN0aXZpdHkvbm9pc2UuICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2Vuc19lbmVyZ3lfY2NrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICB1MzIgbm9ybV9mYSwKLQkJCQkgICB1MzIgcnhfZW5hYmxlX3RpbWUsCi0JCQkJICAgc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9kYXRhICpyeF9pbmZvKQotewotCXUzMiBtYXhfbnJnX2NjayA9IDA7Ci0JaW50IGkgPSAwOwotCXU4IG1heF9zaWxlbmNlX3Jzc2kgPSAwOwotCXUzMiBzaWxlbmNlX3JlZiA9IDA7Ci0JdTggc2lsZW5jZV9yc3NpX2EgPSAwOwotCXU4IHNpbGVuY2VfcnNzaV9iID0gMDsKLQl1OCBzaWxlbmNlX3Jzc2lfYyA9IDA7Ci0JdTMyIHZhbDsKLQotCS8qICJmYWxzZV9hbGFybXMiIHZhbHVlcyBiZWxvdyBhcmUgY3Jvc3MtbXVsdGlwbGljYXRpb25zIHRvIGFzc2VzcyB0aGUKLQkgKiAgIG51bWJlcnMgb2YgZmFsc2UgYWxhcm1zIHdpdGhpbiB0aGUgbWVhc3VyZWQgcGVyaW9kIG9mIGFjdHVhbCBSeAotCSAqICAgKFJ4IGlzIG9mZiB3aGVuIHdlJ3JlIHR4aW5nKSwgdnMgdGhlIG1pbi9tYXggZXhwZWN0ZWQgZmFsc2UgYWxhcm1zCi0JICogICAoc29tZSBzaG91bGQgYmUgZXhwZWN0ZWQgaWYgcnggaXMgc2Vuc2l0aXZlIGVub3VnaCkgaW4gYQotCSAqICAgaHlwb3RoZXRpY2FsIGxpc3RlbmluZyBwZXJpb2Qgb2YgMjAwIHRpbWUgdW5pdHMgKFRVKSwgMjA0LjggbXNlYzoKLQkgKgotCSAqIE1JTl9GQS9maXhlZC10aW1lIDwgZmFsc2VfYWxhcm1zL2FjdHVhbC1yeC10aW1lIDwgTUFYX0ZBL2JlYWNvbi10aW1lCi0JICoKLQkgKiAqLwotCXUzMiBmYWxzZV9hbGFybXMgPSBub3JtX2ZhICogMjAwICogMTAyNDsKLQl1MzIgbWF4X2ZhbHNlX2FsYXJtcyA9IE1BWF9GQV9DQ0sgKiByeF9lbmFibGVfdGltZTsKLQl1MzIgbWluX2ZhbHNlX2FsYXJtcyA9IE1JTl9GQV9DQ0sgKiByeF9lbmFibGVfdGltZTsKLQlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzICpyYW5nZXMgPSBwcml2LT5od19wYXJhbXMuc2VuczsKLQotCWRhdGEgPSAmKHByaXYtPnNlbnNpdGl2aXR5X2RhdGEpOwotCi0JZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYgPSAwOwotCi0JLyogRmluZCBtYXggc2lsZW5jZSByc3NpIGFtb25nIGFsbCAzIHJlY2VpdmVycy4KLQkgKiBUaGlzIGlzIGJhY2tncm91bmQgbm9pc2UsIHdoaWNoIG1heSBpbmNsdWRlIHRyYW5zbWlzc2lvbnMgZnJvbSBvdGhlcgotCSAqICAgIG5ldHdvcmtzLCBtZWFzdXJlZCBkdXJpbmcgc2lsZW5jZSBiZWZvcmUgb3VyIG5ldHdvcmsncyBiZWFjb24gKi8KLQlzaWxlbmNlX3Jzc2lfYSA9ICh1OCkoKHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSAmCi0JCQkgICAgQUxMX0JBTkRfRklMVEVSKSA+PiA4KTsKLQlzaWxlbmNlX3Jzc2lfYiA9ICh1OCkoKHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYiAmCi0JCQkgICAgQUxMX0JBTkRfRklMVEVSKSA+PiA4KTsKLQlzaWxlbmNlX3Jzc2lfYyA9ICh1OCkoKHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYyAmCi0JCQkgICAgQUxMX0JBTkRfRklMVEVSKSA+PiA4KTsKLQotCXZhbCA9IG1heChzaWxlbmNlX3Jzc2lfYiwgc2lsZW5jZV9yc3NpX2MpOwotCW1heF9zaWxlbmNlX3Jzc2kgPSBtYXgoc2lsZW5jZV9yc3NpX2EsICh1OCkgdmFsKTsKLQotCS8qIFN0b3JlIHNpbGVuY2UgcnNzaSBpbiAyMC1iZWFjb24gaGlzdG9yeSB0YWJsZSAqLwotCWRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbZGF0YS0+bnJnX3NpbGVuY2VfaWR4XSA9IG1heF9zaWxlbmNlX3Jzc2k7Ci0JZGF0YS0+bnJnX3NpbGVuY2VfaWR4Kys7Ci0JaWYgKGRhdGEtPm5yZ19zaWxlbmNlX2lkeCA+PSBOUkdfTlVNX1BSRVZfU1RBVF9MKQotCQlkYXRhLT5ucmdfc2lsZW5jZV9pZHggPSAwOwotCi0JLyogRmluZCBtYXggc2lsZW5jZSByc3NpIGFjcm9zcyAyMCBiZWFjb24gaGlzdG9yeSAqLwotCWZvciAoaSA9IDA7IGkgPCBOUkdfTlVNX1BSRVZfU1RBVF9MOyBpKyspIHsKLQkJdmFsID0gZGF0YS0+bnJnX3NpbGVuY2VfcnNzaVtpXTsKLQkJc2lsZW5jZV9yZWYgPSBtYXgoc2lsZW5jZV9yZWYsIHZhbCk7Ci0JfQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAic2lsZW5jZSBhICV1LCBiICV1LCBjICV1LCAyMC1iY24gbWF4ICV1XG4iLAotCQkJc2lsZW5jZV9yc3NpX2EsIHNpbGVuY2VfcnNzaV9iLCBzaWxlbmNlX3Jzc2lfYywKLQkJCXNpbGVuY2VfcmVmKTsKLQotCS8qIEZpbmQgbWF4IHJ4IGVuZXJneSAobWluIHZhbHVlISkgYW1vbmcgYWxsIDMgcmVjZWl2ZXJzLAotCSAqICAgbWVhc3VyZWQgZHVyaW5nIGJlYWNvbiBmcmFtZS4KLQkgKiBTYXZlIGl0IGluIDEwLWJlYWNvbiBoaXN0b3J5IHRhYmxlLiAqLwotCWkgPSBkYXRhLT5ucmdfZW5lcmd5X2lkeDsKLQl2YWwgPSBtaW4ocnhfaW5mby0+YmVhY29uX2VuZXJneV9iLCByeF9pbmZvLT5iZWFjb25fZW5lcmd5X2MpOwotCWRhdGEtPm5yZ192YWx1ZVtpXSA9IG1pbihyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2EsIHZhbCk7Ci0KLQlkYXRhLT5ucmdfZW5lcmd5X2lkeCsrOwotCWlmIChkYXRhLT5ucmdfZW5lcmd5X2lkeCA+PSAxMCkKLQkJZGF0YS0+bnJnX2VuZXJneV9pZHggPSAwOwotCi0JLyogRmluZCBtaW4gcnggZW5lcmd5IChtYXggdmFsdWUpIGFjcm9zcyAxMCBiZWFjb24gaGlzdG9yeS4KLQkgKiBUaGlzIGlzIHRoZSBtaW5pbXVtIHNpZ25hbCBsZXZlbCB0aGF0IHdlIHdhbnQgdG8gcmVjZWl2ZSB3ZWxsLgotCSAqIEFkZCBiYWNrb2ZmIChtYXJnaW4gc28gd2UgZG9uJ3QgbWlzcyBzbGlnaHRseSBsb3dlciBlbmVyZ3kgZnJhbWVzKS4KLQkgKiBUaGlzIGVzdGFibGlzaGVzIGFuIHVwcGVyIGJvdW5kIChtaW4gdmFsdWUpIGZvciBlbmVyZ3kgdGhyZXNob2xkLiAqLwotCW1heF9ucmdfY2NrID0gZGF0YS0+bnJnX3ZhbHVlWzBdOwotCWZvciAoaSA9IDE7IGkgPCAxMDsgaSsrKQotCQltYXhfbnJnX2NjayA9ICh1MzIpIG1heChtYXhfbnJnX2NjaywgKGRhdGEtPm5yZ192YWx1ZVtpXSkpOwotCW1heF9ucmdfY2NrICs9IDY7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgInJ4IGVuZXJneSBhICV1LCBiICV1LCBjICV1LCAxMC1iY24gbWF4L21pbiAldVxuIiwKLQkJCXJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYSwgcnhfaW5mby0+YmVhY29uX2VuZXJneV9iLAotCQkJcnhfaW5mby0+YmVhY29uX2VuZXJneV9jLCBtYXhfbnJnX2NjayAtIDYpOwotCi0JLyogQ291bnQgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGJlYWNvbnMgd2l0aCBmZXdlci10aGFuLWRlc2lyZWQKLQkgKiAgIGZhbHNlIGFsYXJtcy4gKi8KLQlpZiAoZmFsc2VfYWxhcm1zIDwgbWluX2ZhbHNlX2FsYXJtcykKLQkJZGF0YS0+bnVtX2luX2Nja19ub19mYSsrOwotCWVsc2UKLQkJZGF0YS0+bnVtX2luX2Nja19ub19mYSA9IDA7Ci0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJjb25zZWN1dGl2ZSBiY25zIHdpdGggZmV3IGZhbHNlIGFsYXJtcyA9ICV1XG4iLAotCQkJZGF0YS0+bnVtX2luX2Nja19ub19mYSk7Ci0KLQkvKiBJZiB3ZSBnb3QgdG9vIG1hbnkgZmFsc2UgYWxhcm1zIHRoaXMgdGltZSwgcmVkdWNlIHNlbnNpdGl2aXR5ICovCi0JaWYgKChmYWxzZV9hbGFybXMgPiBtYXhfZmFsc2VfYWxhcm1zKSAmJgotCQkoZGF0YS0+YXV0b19jb3JyX2NjayA+IEFVVE9fQ09SUl9NQVhfVEhfQ0NLKSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm5vcm0gRkEgJXUgPiBtYXggRkEgJXVcbiIsCi0JCSAgICAgZmFsc2VfYWxhcm1zLCBtYXhfZmFsc2VfYWxhcm1zKTsKLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICIuLi4gcmVkdWNpbmcgc2Vuc2l0aXZpdHlcbiIpOwotCQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElXTF9GQV9UT09fTUFOWTsKLQkJLyogU3RvcmUgZm9yICJmZXdlciB0aGFuIGRlc2lyZWQiIG9uIGxhdGVyIGJlYWNvbiAqLwotCQlkYXRhLT5ucmdfc2lsZW5jZV9yZWYgPSBzaWxlbmNlX3JlZjsKLQotCQkvKiBpbmNyZWFzZSBlbmVyZ3kgdGhyZXNob2xkIChyZWR1Y2UgbnJnIHZhbHVlKQotCQkgKiAgIHRvIGRlY3JlYXNlIHNlbnNpdGl2aXR5ICovCi0JCWRhdGEtPm5yZ190aF9jY2sgPSBkYXRhLT5ucmdfdGhfY2NrIC0gTlJHX1NURVBfQ0NLOwotCS8qIEVsc2UgaWYgd2UgZ290IGZld2VyIHRoYW4gZGVzaXJlZCwgaW5jcmVhc2Ugc2Vuc2l0aXZpdHkgKi8KLQl9IGVsc2UgaWYgKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpIHsKLQkJZGF0YS0+bnJnX2N1cnJfc3RhdGUgPSBJV0xfRkFfVE9PX0ZFVzsKLQotCQkvKiBDb21wYXJlIHNpbGVuY2UgbGV2ZWwgd2l0aCBzaWxlbmNlIGxldmVsIGZvciBtb3N0IHJlY2VudAotCQkgKiAgIGhlYWx0aHkgbnVtYmVyIG9yIHRvbyBtYW55IGZhbHNlIGFsYXJtcyAqLwotCQlkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZiA9IChzMzIpZGF0YS0+bnJnX3NpbGVuY2VfcmVmIC0KLQkJCQkJCSAgIChzMzIpc2lsZW5jZV9yZWY7Ci0KLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsCi0JCQkgIm5vcm0gRkEgJXUgPCBtaW4gRkEgJXUsIHNpbGVuY2UgZGlmZiAlZFxuIiwKLQkJCSBmYWxzZV9hbGFybXMsIG1pbl9mYWxzZV9hbGFybXMsCi0JCQkgZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYpOwotCi0JCS8qIEluY3JlYXNlIHZhbHVlIHRvIGluY3JlYXNlIHNlbnNpdGl2aXR5LCBidXQgb25seSBpZjoKLQkJICogMWEpIHByZXZpb3VzIGJlYWNvbiBkaWQgKm5vdCogaGF2ZSAqdG9vIG1hbnkqIGZhbHNlIGFsYXJtcwotCQkgKiAxYikgQU5EIHRoZXJlJ3MgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGluIFJ4IGxldmVscwotCQkgKiAgICAgIGZyb20gYSBwcmV2aW91cyBiZWFjb24gd2l0aCB0b28gbWFueSwgb3IgaGVhbHRoeSAjIEZBcwotCQkgKiBPUiAyKSBXZSd2ZSBzZWVuIGEgbG90IG9mIGJlYWNvbnMgKDEwMCkgd2l0aCB0b28gZmV3Ci0JCSAqICAgICAgIGZhbHNlIGFsYXJtcyAqLwotCQlpZiAoKGRhdGEtPm5yZ19wcmV2X3N0YXRlICE9IElXTF9GQV9UT09fTUFOWSkgJiYKLQkJCSgoZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYgPiBOUkdfRElGRikgfHwKLQkJCShkYXRhLT5udW1faW5fY2NrX25vX2ZhID4gTUFYX05VTUJFUl9DQ0tfTk9fRkEpKSkgewotCi0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIi4uLiBpbmNyZWFzaW5nIHNlbnNpdGl2aXR5XG4iKTsKLQkJCS8qIEluY3JlYXNlIG5yZyB2YWx1ZSB0byBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLwotCQkJdmFsID0gZGF0YS0+bnJnX3RoX2NjayArIE5SR19TVEVQX0NDSzsKLQkJCWRhdGEtPm5yZ190aF9jY2sgPSBtaW4oKHUzMilyYW5nZXMtPm1pbl9ucmdfY2NrLCB2YWwpOwotCQl9IGVsc2UgewotCQkJSVdMX0RFQlVHX0NBTElCKHByaXYsCi0JCQkJCSAiLi4uIGJ1dCBub3QgY2hhbmdpbmcgc2Vuc2l0aXZpdHlcbiIpOwotCQl9Ci0KLQkvKiBFbHNlIHdlIGdvdCBhIGhlYWx0aHkgbnVtYmVyIG9mIGZhbHNlIGFsYXJtcywga2VlcCBzdGF0dXMgcXVvICovCi0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICIgRkEgaW4gc2FmZSB6b25lXG4iKTsKLQkJZGF0YS0+bnJnX2N1cnJfc3RhdGUgPSBJV0xfRkFfR09PRF9SQU5HRTsKLQotCQkvKiBTdG9yZSBmb3IgdXNlIGluICJmZXdlciB0aGFuIGRlc2lyZWQiIHdpdGggbGF0ZXIgYmVhY29uICovCi0JCWRhdGEtPm5yZ19zaWxlbmNlX3JlZiA9IHNpbGVuY2VfcmVmOwotCi0JCS8qIElmIHByZXZpb3VzIGJlYWNvbiBoYWQgdG9vIG1hbnkgZmFsc2UgYWxhcm1zLAotCQkgKiAgIGdpdmUgaXQgc29tZSBleHRyYSBtYXJnaW4gYnkgcmVkdWNpbmcgc2Vuc2l0aXZpdHkgYWdhaW4KLQkJICogICAoYnV0IGRvbid0IGdvIGJlbG93IG1lYXN1cmVkIGVuZXJneSBvZiBkZXNpcmVkIFJ4KSAqLwotCQlpZiAoSVdMX0ZBX1RPT19NQU5ZID09IGRhdGEtPm5yZ19wcmV2X3N0YXRlKSB7Ci0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIi4uLiBpbmNyZWFzaW5nIG1hcmdpblxuIik7Ci0JCQlpZiAoZGF0YS0+bnJnX3RoX2NjayA+IChtYXhfbnJnX2NjayArIE5SR19NQVJHSU4pKQotCQkJCWRhdGEtPm5yZ190aF9jY2sgLT0gTlJHX01BUkdJTjsKLQkJCWVsc2UKLQkJCQlkYXRhLT5ucmdfdGhfY2NrID0gbWF4X25yZ19jY2s7Ci0JCX0KLQl9Ci0KLQkvKiBNYWtlIHN1cmUgdGhlIGVuZXJneSB0aHJlc2hvbGQgZG9lcyBub3QgZ28gYWJvdmUgdGhlIG1lYXN1cmVkCi0JICogZW5lcmd5IG9mIHRoZSBkZXNpcmVkIFJ4IHNpZ25hbHMgKHJlZHVjZWQgYnkgYmFja29mZiBtYXJnaW4pLAotCSAqIG9yIGVsc2Ugd2UgbWlnaHQgc3RhcnQgbWlzc2luZyBSeCBmcmFtZXMuCi0JICogTG93ZXIgdmFsdWUgaXMgaGlnaGVyIGVuZXJneSwgc28gd2UgdXNlIG1heCgpIQotCSAqLwotCWRhdGEtPm5yZ190aF9jY2sgPSBtYXgobWF4X25yZ19jY2ssIGRhdGEtPm5yZ190aF9jY2spOwotCUlXTF9ERUJVR19DQUxJQihwcml2LCAibmV3IG5yZ190aF9jY2sgJXVcbiIsIGRhdGEtPm5yZ190aF9jY2spOwotCi0JZGF0YS0+bnJnX3ByZXZfc3RhdGUgPSBkYXRhLT5ucmdfY3Vycl9zdGF0ZTsKLQotCS8qIEF1dG8tY29ycmVsYXRpb24gQ0NLIGFsZ29yaXRobSAqLwotCWlmIChmYWxzZV9hbGFybXMgPiBtaW5fZmFsc2VfYWxhcm1zKSB7Ci0KLQkJLyogaW5jcmVhc2UgYXV0b19jb3JyIHZhbHVlcyB0byBkZWNyZWFzZSBzZW5zaXRpdml0eQotCQkgKiBzbyB0aGUgRFNQIHdvbid0IGJlIGRpc3R1cmJlZCBieSB0aGUgbm9pc2UKLQkJICovCi0JCWlmIChkYXRhLT5hdXRvX2NvcnJfY2NrIDwgQVVUT19DT1JSX01BWF9USF9DQ0spCi0JCQlkYXRhLT5hdXRvX2NvcnJfY2NrID0gQVVUT19DT1JSX01BWF9USF9DQ0sgKyAxOwotCQllbHNlIHsKLQkJCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9jY2sgKyBBVVRPX0NPUlJfU1RFUF9DQ0s7Ci0JCQlkYXRhLT5hdXRvX2NvcnJfY2NrID0KLQkJCQltaW4oKHUzMilyYW5nZXMtPmF1dG9fY29ycl9tYXhfY2NrLCB2YWwpOwotCQl9Ci0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9jY2tfbXJjICsgQVVUT19DT1JSX1NURVBfQ0NLOwotCQlkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyA9Ci0JCQltaW4oKHUzMilyYW5nZXMtPmF1dG9fY29ycl9tYXhfY2NrX21yYywgdmFsKTsKLQl9IGVsc2UgaWYgKChmYWxzZV9hbGFybXMgPCBtaW5fZmFsc2VfYWxhcm1zKSAmJgotCSAgICgoZGF0YS0+bnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmYgPiBOUkdfRElGRikgfHwKLQkgICAoZGF0YS0+bnVtX2luX2Nja19ub19mYSA+IE1BWF9OVU1CRVJfQ0NLX05PX0ZBKSkpIHsKLQotCQkvKiBEZWNyZWFzZSBhdXRvX2NvcnIgdmFsdWVzIHRvIGluY3JlYXNlIHNlbnNpdGl2aXR5ICovCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9jY2sgLSBBVVRPX0NPUlJfU1RFUF9DQ0s7Ci0JCWRhdGEtPmF1dG9fY29ycl9jY2sgPQotCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX2NjaywgdmFsKTsKLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgLSBBVVRPX0NPUlJfU1RFUF9DQ0s7Ci0JCWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjID0KLQkJCW1heCgodTMyKXJhbmdlcy0+YXV0b19jb3JyX21pbl9jY2tfbXJjLCB2YWwpOwotCX0KLQotCXJldHVybiAwOwotfQotCi0KLXN0YXRpYyBpbnQgaXdsNDk2NV9zZW5zX2F1dG9fY29ycl9vZmRtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICAgdTMyIG5vcm1fZmEsCi0JCQkJICAgICAgIHUzMiByeF9lbmFibGVfdGltZSkKLXsKLQl1MzIgdmFsOwotCXUzMiBmYWxzZV9hbGFybXMgPSBub3JtX2ZhICogMjAwICogMTAyNDsKLQl1MzIgbWF4X2ZhbHNlX2FsYXJtcyA9IE1BWF9GQV9PRkRNICogcnhfZW5hYmxlX3RpbWU7Ci0JdTMyIG1pbl9mYWxzZV9hbGFybXMgPSBNSU5fRkFfT0ZETSAqIHJ4X2VuYWJsZV90aW1lOwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXMgKnJhbmdlcyA9IHByaXYtPmh3X3BhcmFtcy5zZW5zOwotCi0JZGF0YSA9ICYocHJpdi0+c2Vuc2l0aXZpdHlfZGF0YSk7Ci0KLQkvKiBJZiB3ZSBnb3QgdG9vIG1hbnkgZmFsc2UgYWxhcm1zIHRoaXMgdGltZSwgcmVkdWNlIHNlbnNpdGl2aXR5ICovCi0JaWYgKGZhbHNlX2FsYXJtcyA+IG1heF9mYWxzZV9hbGFybXMpIHsKLQotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm5vcm0gRkEgJXUgPiBtYXggRkEgJXUpXG4iLAotCQkJICAgICBmYWxzZV9hbGFybXMsIG1heF9mYWxzZV9hbGFybXMpOwotCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtICsgQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG0gPQotCQkJbWluKCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWF4X29mZG0sIHZhbCk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjICsgQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjID0KLQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9vZmRtX21yYywgdmFsKTsKLQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSArIEFVVE9fQ09SUl9TVEVQX09GRE07Ci0JCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxID0KLQkJCW1pbigodTMyKXJhbmdlcy0+YXV0b19jb3JyX21heF9vZmRtX3gxLCB2YWwpOwotCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSArIEFVVE9fQ09SUl9TVEVQX09GRE07Ci0JCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSA9Ci0JCQltaW4oKHUzMilyYW5nZXMtPmF1dG9fY29ycl9tYXhfb2ZkbV9tcmNfeDEsIHZhbCk7Ci0JfQotCi0JLyogRWxzZSBpZiB3ZSBnb3QgZmV3ZXIgdGhhbiBkZXNpcmVkLCBpbmNyZWFzZSBzZW5zaXRpdml0eSAqLwotCWVsc2UgaWYgKGZhbHNlX2FsYXJtcyA8IG1pbl9mYWxzZV9hbGFybXMpIHsKLQotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm5vcm0gRkEgJXUgPCBtaW4gRkEgJXVcbiIsCi0JCQkgICAgIGZhbHNlX2FsYXJtcywgbWluX2ZhbHNlX2FsYXJtcyk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG0gLSBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbSA9Ci0JCQltYXgoKHUzMilyYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbSwgdmFsKTsKLQotCQl2YWwgPSBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgLSBBVVRPX0NPUlJfU1RFUF9PRkRNOwotCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMgPQotCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1fbXJjLCB2YWwpOwotCi0JCXZhbCA9IGRhdGEtPmF1dG9fY29ycl9vZmRtX3gxIC0gQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG1feDEgPQotCQkJbWF4KCh1MzIpcmFuZ2VzLT5hdXRvX2NvcnJfbWluX29mZG1feDEsIHZhbCk7Ci0KLQkJdmFsID0gZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxIC0gQVVUT19DT1JSX1NURVBfT0ZETTsKLQkJZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxID0KLQkJCW1heCgodTMyKXJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yY194MSwgdmFsKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm1pbiBGQSAldSA8IG5vcm0gRkEgJXUgPCBtYXggRkEgJXUgT0tcbiIsCi0JCQkgbWluX2ZhbHNlX2FsYXJtcywgZmFsc2VfYWxhcm1zLCBtYXhfZmFsc2VfYWxhcm1zKTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcHJlcGFyZV9sZWdhY3lfc2Vuc2l0aXZpdHlfdGJsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEsCi0JCQkJX19sZTE2ICp0YmwpCi17Ci0JdGJsW0hEX0FVVE9fQ09SUjMyX1g0X1RIX0FERF9NSU5fSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9vZmRtKTsKLQl0YmxbSERfQVVUT19DT1JSMzJfWDRfVEhfQUREX01JTl9NUkNfSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyk7Ci0JdGJsW0hEX0FVVE9fQ09SUjMyX1gxX1RIX0FERF9NSU5fSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxKTsKLQl0YmxbSERfQVVUT19DT1JSMzJfWDFfVEhfQUREX01JTl9NUkNfSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNigodTE2KWRhdGEtPmF1dG9fY29ycl9vZmRtX21yY194MSk7Ci0KLQl0YmxbSERfQVVUT19DT1JSNDBfWDRfVEhfQUREX01JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+YXV0b19jb3JyX2Njayk7Ci0JdGJsW0hEX0FVVE9fQ09SUjQwX1g0X1RIX0FERF9NSU5fTVJDX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoKHUxNilkYXRhLT5hdXRvX2NvcnJfY2NrX21yYyk7Ci0KLQl0YmxbSERfTUlOX0VORVJHWV9DQ0tfREVUX0lOREVYXSA9Ci0JCQkJY3B1X3RvX2xlMTYoKHUxNilkYXRhLT5ucmdfdGhfY2NrKTsKLQl0YmxbSERfTUlOX0VORVJHWV9PRkRNX0RFVF9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KCh1MTYpZGF0YS0+bnJnX3RoX29mZG0pOwotCi0JdGJsW0hEX0JBUktFUl9DT1JSX1RIX0FERF9NSU5fSU5ERVhdID0KLQkJCQljcHVfdG9fbGUxNihkYXRhLT5iYXJrZXJfY29ycl90aF9taW4pOwotCXRibFtIRF9CQVJLRVJfQ09SUl9USF9BRERfTUlOX01SQ19JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KGRhdGEtPmJhcmtlcl9jb3JyX3RoX21pbl9tcmMpOwotCXRibFtIRF9PRkRNX0VORVJHWV9USF9JTl9JTkRFWF0gPQotCQkJCWNwdV90b19sZTE2KGRhdGEtPm5yZ190aF9jY2EpOwotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJvZmRtOiBhYyAldSBtcmMgJXUgeDEgJXUgbXJjX3gxICV1IHRocmVzaCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9vZmRtLCBkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmMsCi0JCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSwgZGF0YS0+YXV0b19jb3JyX29mZG1fbXJjX3gxLAotCQkJZGF0YS0+bnJnX3RoX29mZG0pOwotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJjY2s6IGFjICV1IG1yYyAldSB0aHJlc2ggJXVcbiIsCi0JCQlkYXRhLT5hdXRvX2NvcnJfY2NrLCBkYXRhLT5hdXRvX2NvcnJfY2NrX21yYywKLQkJCWRhdGEtPm5yZ190aF9jY2spOwotfQotCi0vKiBQcmVwYXJlIGEgU0VOU0lUSVZJVFlfQ01ELCBzZW5kIHRvIHVDb2RlIGlmIHZhbHVlcyBoYXZlIGNoYW5nZWQgKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9zZW5zaXRpdml0eV93cml0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQgY21kOwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSAqZGF0YSA9IE5VTEw7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWRfb3V0ID0gewotCQkuaWQgPSBTRU5TSVRJVklUWV9DTUQsCi0JCS5sZW4gPSBzaXplb2Yoc3RydWN0IGl3bF9zZW5zaXRpdml0eV9jbWQpLAotCQkuZmxhZ3MgPSBDTURfQVNZTkMsCi0JCS5kYXRhID0gJmNtZCwKLQl9OwotCi0JZGF0YSA9ICYocHJpdi0+c2Vuc2l0aXZpdHlfZGF0YSk7Ci0KLQltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOwotCi0JaXdsNDk2NV9wcmVwYXJlX2xlZ2FjeV9zZW5zaXRpdml0eV90YmwocHJpdiwgZGF0YSwgJmNtZC50YWJsZVswXSk7Ci0KLQkvKiBVcGRhdGUgdUNvZGUncyAid29yayIgdGFibGUsIGFuZCBjb3B5IGl0IHRvIERTUCAqLwotCWNtZC5jb250cm9sID0gU0VOU0lUSVZJVFlfQ01EX0NPTlRST0xfV09SS19UQUJMRTsKLQotCS8qIERvbid0IHNlbmQgY29tbWFuZCB0byB1Q29kZSBpZiBub3RoaW5nIGhhcyBjaGFuZ2VkICovCi0JaWYgKCFtZW1jbXAoJmNtZC50YWJsZVswXSwgJihwcml2LT5zZW5zaXRpdml0eV90YmxbMF0pLAotCQkgICAgc2l6ZW9mKHUxNikqSERfVEFCTEVfU0laRSkpIHsKLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJObyBjaGFuZ2UgaW4gU0VOU0lUSVZJVFlfQ01EXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogQ29weSB0YWJsZSBmb3IgY29tcGFyaXNvbiBuZXh0IHRpbWUgKi8KLQltZW1jcHkoJihwcml2LT5zZW5zaXRpdml0eV90YmxbMF0pLCAmKGNtZC50YWJsZVswXSksCi0JICAgICAgIHNpemVvZih1MTYpKkhEX1RBQkxFX1NJWkUpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWQocHJpdiwgJmNtZF9vdXQpOwotfQotCi12b2lkIGl3bDQ5NjVfaW5pdF9zZW5zaXRpdml0eShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0JaW50IGk7Ci0Jc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlcyAqcmFuZ2VzID0gcHJpdi0+aHdfcGFyYW1zLnNlbnM7Ci0KLQlpZiAocHJpdi0+ZGlzYWJsZV9zZW5zX2NhbCkKLQkJcmV0dXJuOwotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJTdGFydCBpd2w0OTY1X2luaXRfc2Vuc2l0aXZpdHlcbiIpOwotCi0JLyogQ2xlYXIgZHJpdmVyJ3Mgc2Vuc2l0aXZpdHkgYWxnbyBkYXRhICovCi0JZGF0YSA9ICYocHJpdi0+c2Vuc2l0aXZpdHlfZGF0YSk7Ci0KLQlpZiAocmFuZ2VzID09IE5VTEwpCi0JCXJldHVybjsKLQotCW1lbXNldChkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhKSk7Ci0KLQlkYXRhLT5udW1faW5fY2NrX25vX2ZhID0gMDsKLQlkYXRhLT5ucmdfY3Vycl9zdGF0ZSA9IElXTF9GQV9UT09fTUFOWTsKLQlkYXRhLT5ucmdfcHJldl9zdGF0ZSA9IElXTF9GQV9UT09fTUFOWTsKLQlkYXRhLT5ucmdfc2lsZW5jZV9yZWYgPSAwOwotCWRhdGEtPm5yZ19zaWxlbmNlX2lkeCA9IDA7Ci0JZGF0YS0+bnJnX2VuZXJneV9pZHggPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IDEwOyBpKyspCi0JCWRhdGEtPm5yZ192YWx1ZVtpXSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJHX05VTV9QUkVWX1NUQVRfTDsgaSsrKQotCQlkYXRhLT5ucmdfc2lsZW5jZV9yc3NpW2ldID0gMDsKLQotCWRhdGEtPmF1dG9fY29ycl9vZmRtID0gIHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtOwotCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyA9IHJhbmdlcy0+YXV0b19jb3JyX21pbl9vZmRtX21yYzsKLQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV94MSAgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV94MTsKLQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fb2ZkbV9tcmNfeDE7Ci0JZGF0YS0+YXV0b19jb3JyX2NjayA9IEFVVE9fQ09SUl9DQ0tfTUlOX1ZBTF9ERUY7Ci0JZGF0YS0+YXV0b19jb3JyX2Nja19tcmMgPSByYW5nZXMtPmF1dG9fY29ycl9taW5fY2NrX21yYzsKLQlkYXRhLT5ucmdfdGhfY2NrID0gcmFuZ2VzLT5ucmdfdGhfY2NrOwotCWRhdGEtPm5yZ190aF9vZmRtID0gcmFuZ2VzLT5ucmdfdGhfb2ZkbTsKLQlkYXRhLT5iYXJrZXJfY29ycl90aF9taW4gPSByYW5nZXMtPmJhcmtlcl9jb3JyX3RoX21pbjsKLQlkYXRhLT5iYXJrZXJfY29ycl90aF9taW5fbXJjID0gcmFuZ2VzLT5iYXJrZXJfY29ycl90aF9taW5fbXJjOwotCWRhdGEtPm5yZ190aF9jY2EgPSByYW5nZXMtPm5yZ190aF9jY2E7Ci0KLQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtID0gMDsKLQlkYXRhLT5sYXN0X2ZhX2NudF9vZmRtID0gMDsKLQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgPSAwOwotCWRhdGEtPmxhc3RfZmFfY250X2NjayA9IDA7Ci0KLQlyZXQgfD0gaXdsNDk2NV9zZW5zaXRpdml0eV93cml0ZShwcml2KTsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIjw8cmV0dXJuIDB4JVhcbiIsIHJldCk7Ci19Ci0KLXZvaWQgaXdsNDk2NV9zZW5zaXRpdml0eV9jYWxpYnJhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnJlc3ApCi17Ci0JdTMyIHJ4X2VuYWJsZV90aW1lOwotCXUzMiBmYV9jY2s7Ci0JdTMyIGZhX29mZG07Ci0JdTMyIGJhZF9wbGNwX2NjazsKLQl1MzIgYmFkX3BsY3Bfb2ZkbTsKLQl1MzIgbm9ybV9mYV9vZmRtOwotCXUzMiBub3JtX2ZhX2NjazsKLQlzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X2RhdGEgKmRhdGEgPSBOVUxMOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkgKnJ4X2luZm87Ci0Jc3RydWN0IHN0YXRpc3RpY3NfcnhfcGh5ICpvZmRtLCAqY2NrOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9kYXRhIHN0YXRpczsKLQotCWlmIChwcml2LT5kaXNhYmxlX3NlbnNfY2FsKQotCQlyZXR1cm47Ci0KLQlkYXRhID0gJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKTsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hbnlfYXNzb2NpYXRlZChwcml2KSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIjw8IC0gbm90IGFzc29jaWF0ZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJ4X2luZm8gPSAmKCgoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICopcmVzcCktPnJ4LmdlbmVyYWwpOwotCW9mZG0gPSAmKCgoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICopcmVzcCktPnJ4Lm9mZG0pOwotCWNjayA9ICYoKChzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgKilyZXNwKS0+cnguY2NrKTsKLQotCWlmIChyeF9pbmZvLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnICE9IElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIjw8IGludmFsaWQgZGF0YS5cbiIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBFeHRyYWN0IFN0YXRpc3RpY3M6ICovCi0JcnhfZW5hYmxlX3RpbWUgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5jaGFubmVsX2xvYWQpOwotCWZhX2NjayA9IGxlMzJfdG9fY3B1KGNjay0+ZmFsc2VfYWxhcm1fY250KTsKLQlmYV9vZmRtID0gbGUzMl90b19jcHUob2ZkbS0+ZmFsc2VfYWxhcm1fY250KTsKLQliYWRfcGxjcF9jY2sgPSBsZTMyX3RvX2NwdShjY2stPnBsY3BfZXJyKTsKLQliYWRfcGxjcF9vZmRtID0gbGUzMl90b19jcHUob2ZkbS0+cGxjcF9lcnIpOwotCi0Jc3RhdGlzLmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSA9Ci0JCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2EpOwotCXN0YXRpcy5iZWFjb25fc2lsZW5jZV9yc3NpX2IgPQotCQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKTsKLQlzdGF0aXMuYmVhY29uX3NpbGVuY2VfcnNzaV9jID0KLQkJCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYyk7Ci0Jc3RhdGlzLmJlYWNvbl9lbmVyZ3lfYSA9Ci0JCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fZW5lcmd5X2EpOwotCXN0YXRpcy5iZWFjb25fZW5lcmd5X2IgPQotCQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX2VuZXJneV9iKTsKLQlzdGF0aXMuYmVhY29uX2VuZXJneV9jID0KLQkJCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9lbmVyZ3lfYyk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgInJ4X2VuYWJsZV90aW1lID0gJXUgdXNlY3NcbiIsIHJ4X2VuYWJsZV90aW1lKTsKLQotCWlmICghcnhfZW5hYmxlX3RpbWUpIHsKLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICI8PCBSWCBFbmFibGUgVGltZSA9PSAwIVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBUaGVzZSBzdGF0aXN0aWNzIGluY3JlYXNlIG1vbm90b25pY2FsbHksIGFuZCBkbyBub3QgcmVzZXQKLQkgKiAgIGF0IGVhY2ggYmVhY29uLiAgQ2FsY3VsYXRlIGRpZmZlcmVuY2UgZnJvbSBsYXN0IHZhbHVlLCBvciBqdXN0Ci0JICogICB1c2UgdGhlIG5ldyBzdGF0aXN0aWNzIHZhbHVlIGlmIGl0IGhhcyByZXNldCBvciB3cmFwcGVkIGFyb3VuZC4gKi8KLQlpZiAoZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrID4gYmFkX3BsY3BfY2NrKQotCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2sgPSBiYWRfcGxjcF9jY2s7Ci0JZWxzZSB7Ci0JCWJhZF9wbGNwX2NjayAtPSBkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9jY2s7Ci0JCWRhdGEtPmxhc3RfYmFkX3BsY3BfY250X2NjayArPSBiYWRfcGxjcF9jY2s7Ci0JfQotCi0JaWYgKGRhdGEtPmxhc3RfYmFkX3BsY3BfY250X29mZG0gPiBiYWRfcGxjcF9vZmRtKQotCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtID0gYmFkX3BsY3Bfb2ZkbTsKLQllbHNlIHsKLQkJYmFkX3BsY3Bfb2ZkbSAtPSBkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtOwotCQlkYXRhLT5sYXN0X2JhZF9wbGNwX2NudF9vZmRtICs9IGJhZF9wbGNwX29mZG07Ci0JfQotCi0JaWYgKGRhdGEtPmxhc3RfZmFfY250X29mZG0gPiBmYV9vZmRtKQotCQlkYXRhLT5sYXN0X2ZhX2NudF9vZmRtID0gZmFfb2ZkbTsKLQllbHNlIHsKLQkJZmFfb2ZkbSAtPSBkYXRhLT5sYXN0X2ZhX2NudF9vZmRtOwotCQlkYXRhLT5sYXN0X2ZhX2NudF9vZmRtICs9IGZhX29mZG07Ci0JfQotCi0JaWYgKGRhdGEtPmxhc3RfZmFfY250X2NjayA+IGZhX2NjaykKLQkJZGF0YS0+bGFzdF9mYV9jbnRfY2NrID0gZmFfY2NrOwotCWVsc2UgewotCQlmYV9jY2sgLT0gZGF0YS0+bGFzdF9mYV9jbnRfY2NrOwotCQlkYXRhLT5sYXN0X2ZhX2NudF9jY2sgKz0gZmFfY2NrOwotCX0KLQotCS8qIFRvdGFsIGFib3J0ZWQgc2lnbmFsIGxvY2tzICovCi0Jbm9ybV9mYV9vZmRtID0gZmFfb2ZkbSArIGJhZF9wbGNwX29mZG07Ci0Jbm9ybV9mYV9jY2sgPSBmYV9jY2sgKyBiYWRfcGxjcF9jY2s7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwKLQkJCSAiY2NrOiBmYSAldSBiYWRwICV1ICBvZmRtOiBmYSAldSBiYWRwICV1XG4iLCBmYV9jY2ssCi0JCQliYWRfcGxjcF9jY2ssIGZhX29mZG0sIGJhZF9wbGNwX29mZG0pOwotCi0JaXdsNDk2NV9zZW5zX2F1dG9fY29ycl9vZmRtKHByaXYsIG5vcm1fZmFfb2ZkbSwgcnhfZW5hYmxlX3RpbWUpOwotCWl3bDQ5NjVfc2Vuc19lbmVyZ3lfY2NrKHByaXYsIG5vcm1fZmFfY2NrLCByeF9lbmFibGVfdGltZSwgJnN0YXRpcyk7Ci0KLQlpd2w0OTY1X3NlbnNpdGl2aXR5X3dyaXRlKHByaXYpOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDQ5NjVfZmluZF9maXJzdF9jaGFpbih1OCBtYXNrKQotewotCWlmIChtYXNrICYgQU5UX0EpCi0JCXJldHVybiBDSEFJTl9BOwotCWlmIChtYXNrICYgQU5UX0IpCi0JCXJldHVybiBDSEFJTl9COwotCXJldHVybiBDSEFJTl9DOwotfQotCi0vKioKLSAqIFJ1biBkaXNjb25uZWN0ZWQgYW50ZW5uYSBhbGdvcml0aG0gdG8gZmluZCBvdXQgd2hpY2ggYW50ZW5uYXMgYXJlCi0gKiBkaXNjb25uZWN0ZWQuCi0gKi8KLXN0YXRpYyB2b2lkCi1pd2w0OTY1X2ZpbmRfZGlzY29ubl9hbnRlbm5hKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyKiBhdmVyYWdlX3NpZywKLQkJCQkgICAgIHN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YSkKLXsKLQl1MzIgYWN0aXZlX2NoYWlucyA9IDA7Ci0JdTMyIG1heF9hdmVyYWdlX3NpZzsKLQl1MTYgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaTsKLQl1OCBudW1fdHhfY2hhaW5zOwotCXU4IGZpcnN0X2NoYWluOwotCXUxNiBpID0gMDsKLQotCWF2ZXJhZ2Vfc2lnWzBdID0gZGF0YS0+Y2hhaW5fc2lnbmFsX2EgLwotCQkJIHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOwotCWF2ZXJhZ2Vfc2lnWzFdID0gZGF0YS0+Y2hhaW5fc2lnbmFsX2IgLwotCQkJIHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOwotCWF2ZXJhZ2Vfc2lnWzJdID0gZGF0YS0+Y2hhaW5fc2lnbmFsX2MgLwotCQkJIHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOwotCi0JaWYgKGF2ZXJhZ2Vfc2lnWzBdID49IGF2ZXJhZ2Vfc2lnWzFdKSB7Ci0JCW1heF9hdmVyYWdlX3NpZyA9IGF2ZXJhZ2Vfc2lnWzBdOwotCQltYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pID0gMDsKLQkJYWN0aXZlX2NoYWlucyA9ICgxIDw8IG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpOwotCX0gZWxzZSB7Ci0JCW1heF9hdmVyYWdlX3NpZyA9IGF2ZXJhZ2Vfc2lnWzFdOwotCQltYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pID0gMTsKLQkJYWN0aXZlX2NoYWlucyA9ICgxIDw8IG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpOwotCX0KLQotCWlmIChhdmVyYWdlX3NpZ1syXSA+PSBtYXhfYXZlcmFnZV9zaWcpIHsKLQkJbWF4X2F2ZXJhZ2Vfc2lnID0gYXZlcmFnZV9zaWdbMl07Ci0JCW1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kgPSAyOwotCQlhY3RpdmVfY2hhaW5zID0gKDEgPDwgbWF4X2F2ZXJhZ2Vfc2lnX2FudGVubmFfaSk7Ci0JfQotCi0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJhdmVyYWdlX3NpZzogYSAlZCBiICVkIGMgJWRcbiIsCi0JCSAgICAgYXZlcmFnZV9zaWdbMF0sIGF2ZXJhZ2Vfc2lnWzFdLCBhdmVyYWdlX3NpZ1syXSk7Ci0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJtYXhfYXZlcmFnZV9zaWcgPSAlZCwgYW50ZW5uYSAlZFxuIiwKLQkJICAgICBtYXhfYXZlcmFnZV9zaWcsIG1heF9hdmVyYWdlX3NpZ19hbnRlbm5hX2kpOwotCi0JLyogQ29tcGFyZSBzaWduYWwgc3RyZW5ndGhzIGZvciBhbGwgMyByZWNlaXZlcnMuICovCi0JZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgewotCQlpZiAoaSAhPSBtYXhfYXZlcmFnZV9zaWdfYW50ZW5uYV9pKSB7Ci0JCQlzMzIgcnNzaV9kZWx0YSA9IChtYXhfYXZlcmFnZV9zaWcgLSBhdmVyYWdlX3NpZ1tpXSk7Ci0KLQkJCS8qIElmIHNpZ25hbCBpcyB2ZXJ5IHdlYWssIGNvbXBhcmVkIHdpdGgKLQkJCSAqIHN0cm9uZ2VzdCwgbWFyayBpdCBhcyBkaXNjb25uZWN0ZWQuICovCi0JCQlpZiAocnNzaV9kZWx0YSA+IE1BWElNVU1fQUxMT1dFRF9QQVRITE9TUykKLQkJCQlkYXRhLT5kaXNjb25uX2FycmF5W2ldID0gMTsKLQkJCWVsc2UKLQkJCQlhY3RpdmVfY2hhaW5zIHw9ICgxIDw8IGkpOwotCQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJpID0gJWQgIHJzc2lEZWx0YSA9ICVkICAiCi0JCQkgICAgICJkaXNjb25uX2FycmF5W2ldID0gJWRcbiIsCi0JCQkgICAgIGksIHJzc2lfZGVsdGEsIGRhdGEtPmRpc2Nvbm5fYXJyYXlbaV0pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgYWJvdmUgYWxnb3JpdGhtIHNvbWV0aW1lcyBmYWlscyB3aGVuIHRoZSB1Y29kZQotCSAqIHJlcG9ydHMgMCBmb3IgYWxsIGNoYWlucy4gSXQncyBub3QgY2xlYXIgd2h5IHRoYXQKLQkgKiBoYXBwZW5zIHRvIHN0YXJ0IHdpdGgsIGJ1dCBpdCBpcyB0aGVuIGNhdXNpbmcgdHJvdWJsZQotCSAqIGJlY2F1c2UgdGhpcyBjYW4gbWFrZSB1cyBlbmFibGUgbW9yZSBjaGFpbnMgdGhhbiB0aGUKLQkgKiBoYXJkd2FyZSByZWFsbHkgaGFzLgotCSAqCi0JICogVG8gYmUgc2FmZSwgc2ltcGx5IG1hc2sgb3V0IGFueSBjaGFpbnMgdGhhdCB3ZSBrbm93Ci0JICogYXJlIG5vdCBvbiB0aGUgZGV2aWNlLgotCSAqLwotCWFjdGl2ZV9jaGFpbnMgJj0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudDsKLQotCW51bV90eF9jaGFpbnMgPSAwOwotCWZvciAoaSA9IDA7IGkgPCBOVU1fUlhfQ0hBSU5TOyBpKyspIHsKLQkJLyogbG9vcHMgb24gYWxsIHRoZSBiaXRzIG9mCi0JCSAqIHByaXYtPmh3X3NldHRpbmcudmFsaWRfdHhfYW50ICovCi0JCXU4IGFudF9tc2sgPSAoMSA8PCBpKTsKLQkJaWYgKCEocHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCAmIGFudF9tc2spKQotCQkJY29udGludWU7Ci0KLQkJbnVtX3R4X2NoYWlucysrOwotCQlpZiAoZGF0YS0+ZGlzY29ubl9hcnJheVtpXSA9PSAwKQotCQkJLyogdGhlcmUgaXMgYSBUeCBhbnRlbm5hIGNvbm5lY3RlZCAqLwotCQkJYnJlYWs7Ci0JCWlmIChudW1fdHhfY2hhaW5zID09IHByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtICYmCi0JCSAgICBkYXRhLT5kaXNjb25uX2FycmF5W2ldKSB7Ci0JCQkvKgotCQkJICogSWYgYWxsIGNoYWlucyBhcmUgZGlzY29ubmVjdGVkCi0JCQkgKiBjb25uZWN0IHRoZSBmaXJzdCB2YWxpZCB0eCBjaGFpbgotCQkJICovCi0JCQlmaXJzdF9jaGFpbiA9Ci0JCQlpd2w0OTY1X2ZpbmRfZmlyc3RfY2hhaW4ocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQpOwotCQkJZGF0YS0+ZGlzY29ubl9hcnJheVtmaXJzdF9jaGFpbl0gPSAwOwotCQkJYWN0aXZlX2NoYWlucyB8PSBCSVQoZmlyc3RfY2hhaW4pOwotCQkJSVdMX0RFQlVHX0NBTElCKHByaXYsCi0JCQkJCSJBbGwgVHggY2hhaW5zIGFyZSBkaXNjb25uZWN0ZWQgVy9BIC0gZGVjbGFyZSAlZCBhcyBjb25uZWN0ZWRcbiIsCi0JCQkJCWZpcnN0X2NoYWluKTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JaWYgKGFjdGl2ZV9jaGFpbnMgIT0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3J4X2FudCAmJgotCSAgICBhY3RpdmVfY2hhaW5zICE9IHByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucykKLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsCi0JCQkJIkRldGVjdGVkIHRoYXQgbm90IGFsbCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkISAiCi0JCQkJIkNvbm5lY3RlZDogJSN4LCB2YWxpZDogJSN4LlxuIiwKLQkJCQlhY3RpdmVfY2hhaW5zLCBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50KTsKLQotCS8qIFNhdmUgZm9yIHVzZSB3aXRoaW4gUlhPTiwgVFgsIFNDQU4gY29tbWFuZHMsIGV0Yy4gKi8KLQlkYXRhLT5hY3RpdmVfY2hhaW5zID0gYWN0aXZlX2NoYWluczsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImFjdGl2ZV9jaGFpbnMgKGJpdHdpc2UpID0gMHgleFxuIiwKLQkJCWFjdGl2ZV9jaGFpbnMpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2dhaW5fY29tcHV0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQl1MzIgKmF2ZXJhZ2Vfbm9pc2UsCi0JCXUxNiBtaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2ksCi0JCXUzMiBtaW5fYXZlcmFnZV9ub2lzZSwKLQkJdTggZGVmYXVsdF9jaGFpbikKLXsKLQlpbnQgaSwgcmV0OwotCXN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YSA9ICZwcml2LT5jaGFpbl9ub2lzZV9kYXRhOwotCi0JZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW21pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaV0gPSAwOwotCi0JZm9yIChpID0gZGVmYXVsdF9jaGFpbjsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgewotCQlzMzIgZGVsdGFfZyA9IDA7Ci0KLQkJaWYgKCEoZGF0YS0+ZGlzY29ubl9hcnJheVtpXSkgJiYKLQkJICAgIChkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0gPT0KLQkJCSAgICAgQ0hBSU5fTk9JU0VfREVMVEFfR0FJTl9JTklUX1ZBTCkpIHsKLQkJCWRlbHRhX2cgPSBhdmVyYWdlX25vaXNlW2ldIC0gbWluX2F2ZXJhZ2Vfbm9pc2U7Ci0JCQlkYXRhLT5kZWx0YV9nYWluX2NvZGVbaV0gPSAodTgpKChkZWx0YV9nICogMTApIC8gMTUpOwotCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldID0KLQkJCQltaW4oZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2ldLAotCQkJCSh1OCkgQ0hBSU5fTk9JU0VfTUFYX0RFTFRBX0dBSU5fQ09ERSk7Ci0KLQkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9Ci0JCQkJKGRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSB8ICgxIDw8IDIpKTsKLQkJfSBlbHNlIHsKLQkJCWRhdGEtPmRlbHRhX2dhaW5fY29kZVtpXSA9IDA7Ci0JCX0KLQl9Ci0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJkZWx0YV9nYWluX2NvZGVzOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJICAgICBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMF0sCi0JCSAgICAgZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzFdLAotCQkgICAgIGRhdGEtPmRlbHRhX2dhaW5fY29kZVsyXSk7Ci0KLQkvKiBEaWZmZXJlbnRpYWwgZ2FpbiBnZXRzIHNlbnQgdG8gdUNvZGUgb25seSBvbmNlICovCi0JaWYgKCFkYXRhLT5yYWRpb193cml0ZSkgewotCQlzdHJ1Y3QgaXdsX2NhbGliX2RpZmZfZ2Fpbl9jbWQgY21kOwotCQlkYXRhLT5yYWRpb193cml0ZSA9IDE7Ci0KLQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQkJY21kLmhkci5vcF9jb2RlID0gSVdMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRDsKLQkJY21kLmRpZmZfZ2Fpbl9hID0gZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlWzBdOwotCQljbWQuZGlmZl9nYWluX2IgPSBkYXRhLT5kZWx0YV9nYWluX2NvZGVbMV07Ci0JCWNtZC5kaWZmX2dhaW5fYyA9IGRhdGEtPmRlbHRhX2dhaW5fY29kZVsyXTsKLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRCwKLQkJCQkgICAgICBzaXplb2YoY21kKSwgJmNtZCk7Ci0JCWlmIChyZXQpCi0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImZhaWwgc2VuZGluZyBjbWQgIgotCQkJCSAgICAgIlJFUExZX1BIWV9DQUxJQlJBVElPTl9DTURcbiIpOwotCi0JCS8qIFRPRE8gd2UgbWlnaHQgd2FudCByZWNhbGN1bGF0ZQotCQkgKiByeF9jaGFpbiBpbiByeG9uIGNtZCAqLwotCi0JCS8qIE1hcmsgc28gd2UgcnVuIHRoaXMgYWxnbyBvbmx5IG9uY2UhICovCi0JCWRhdGEtPnN0YXRlID0gSVdMX0NIQUlOX05PSVNFX0NBTElCUkFURUQ7Ci0JfQotfQotCi0KLQotLyoKLSAqIEFjY3VtdWxhdGUgMTYgYmVhY29ucyBvZiBzaWduYWwgYW5kIG5vaXNlIHN0YXRpc3RpY3MgZm9yIGVhY2ggb2YKLSAqICAgMyByZWNlaXZlcnMvYW50ZW5uYXMvcngtY2hhaW5zLCB0aGVuIGZpZ3VyZSBvdXQ6Ci0gKiAxKSAgV2hpY2ggYW50ZW5uYXMgYXJlIGNvbm5lY3RlZC4KLSAqIDIpICBEaWZmZXJlbnRpYWwgcnggZ2FpbiBzZXR0aW5ncyB0byBiYWxhbmNlIHRoZSAzIHJlY2VpdmVycy4KLSAqLwotdm9pZCBpd2w0OTY1X2NoYWluX25vaXNlX2NhbGlicmF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdm9pZCAqc3RhdF9yZXNwKQotewotCXN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSAqZGF0YSA9IE5VTEw7Ci0KLQl1MzIgY2hhaW5fbm9pc2VfYTsKLQl1MzIgY2hhaW5fbm9pc2VfYjsKLQl1MzIgY2hhaW5fbm9pc2VfYzsKLQl1MzIgY2hhaW5fc2lnX2E7Ci0JdTMyIGNoYWluX3NpZ19iOwotCXUzMiBjaGFpbl9zaWdfYzsKLQl1MzIgYXZlcmFnZV9zaWdbTlVNX1JYX0NIQUlOU10gPSB7SU5JVElBTElaQVRJT05fVkFMVUV9OwotCXUzMiBhdmVyYWdlX25vaXNlW05VTV9SWF9DSEFJTlNdID0ge0lOSVRJQUxJWkFUSU9OX1ZBTFVFfTsKLQl1MzIgbWluX2F2ZXJhZ2Vfbm9pc2UgPSBNSU5fQVZFUkFHRV9OT0lTRV9NQVhfVkFMVUU7Ci0JdTE2IG1pbl9hdmVyYWdlX25vaXNlX2FudGVubmFfaSA9IElOSVRJQUxJWkFUSU9OX1ZBTFVFOwotCXUxNiBpID0gMDsKLQl1MTYgcnhvbl9jaG51bSA9IElOSVRJQUxJWkFUSU9OX1ZBTFVFOwotCXUxNiBzdGF0X2NobnVtID0gSU5JVElBTElaQVRJT05fVkFMVUU7Ci0JdTggcnhvbl9iYW5kMjQ7Ci0JdTggc3RhdF9iYW5kMjQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5ICpyeF9pbmZvOwotCi0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCWlmIChwcml2LT5kaXNhYmxlX2NoYWluX25vaXNlX2NhbCkKLQkJcmV0dXJuOwotCi0JZGF0YSA9ICYocHJpdi0+Y2hhaW5fbm9pc2VfZGF0YSk7Ci0KLQkvKgotCSAqIEFjY3VtdWxhdGUganVzdCB0aGUgZmlyc3QgImNoYWluX25vaXNlX251bV9iZWFjb25zIiBhZnRlcgotCSAqIHRoZSBmaXJzdCBhc3NvY2lhdGlvbiwgdGhlbiB3ZSdyZSBkb25lIGZvcmV2ZXIuCi0JICovCi0JaWYgKGRhdGEtPnN0YXRlICE9IElXTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFKSB7Ci0JCWlmIChkYXRhLT5zdGF0ZSA9PSBJV0xfQ0hBSU5fTk9JU0VfQUxJVkUpCi0JCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIldhaXQgZm9yIG5vaXNlIGNhbGliIHJlc2V0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlyeF9pbmZvID0gJigoKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyAqKXN0YXRfcmVzcCktPgotCQkgICAgICByeC5nZW5lcmFsKTsKLQotCWlmIChyeF9pbmZvLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnICE9IElOVEVSRkVSRU5DRV9EQVRBX0FWQUlMQUJMRSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIiA8PCBJbnRlcmZlcmVuY2UgZGF0YSB1bmF2YWlsYWJsZVxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJcmV0dXJuOwotCX0KLQotCXJ4b25fYmFuZDI0ID0gISEoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKTsKLQlyeG9uX2NobnVtID0gbGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpOwotCi0Jc3RhdF9iYW5kMjQgPSAhISgoKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyAqKQotCQkJIHN0YXRfcmVzcCktPmZsYWcgJgotCQkJIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0JBTkRfMjRHX01TSyk7Ci0Jc3RhdF9jaG51bSA9IGxlMzJfdG9fY3B1KCgoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzICopCi0JCQkJIHN0YXRfcmVzcCktPmZsYWcpID4+IDE2OwotCi0JLyogTWFrZSBzdXJlIHdlIGFjY3VtdWxhdGUgZGF0YSBmb3IganVzdCB0aGUgYXNzb2NpYXRlZCBjaGFubmVsCi0JICogICAoZXZlbiBpZiBzY2FubmluZykuICovCi0JaWYgKChyeG9uX2NobnVtICE9IHN0YXRfY2hudW0pIHx8IChyeG9uX2JhbmQyNCAhPSBzdGF0X2JhbmQyNCkpIHsKLQkJSVdMX0RFQlVHX0NBTElCKHByaXYsICJTdGF0cyBub3QgZnJvbSBjaGFuPSVkLCBiYW5kMjQ9JWRcbiIsCi0JCQkJcnhvbl9jaG51bSwgcnhvbl9iYW5kMjQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKgotCSAqICBBY2N1bXVsYXRlIGJlYWNvbiBzdGF0aXN0aWNzIHZhbHVlcyBhY3Jvc3MKLQkgKiAiY2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMiCi0JICovCi0JY2hhaW5fbm9pc2VfYSA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSkgJgotCQkJCUlOX0JBTkRfRklMVEVSOwotCWNoYWluX25vaXNlX2IgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpICYKLQkJCQlJTl9CQU5EX0ZJTFRFUjsKLQljaGFpbl9ub2lzZV9jID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9jKSAmCi0JCQkJSU5fQkFORF9GSUxURVI7Ci0KLQljaGFpbl9zaWdfYSA9IGxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9yc3NpX2EpICYgSU5fQkFORF9GSUxURVI7Ci0JY2hhaW5fc2lnX2IgPSBsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fcnNzaV9iKSAmIElOX0JBTkRfRklMVEVSOwotCWNoYWluX3NpZ19jID0gbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3Jzc2lfYykgJiBJTl9CQU5EX0ZJTFRFUjsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWRhdGEtPmJlYWNvbl9jb3VudCsrOwotCi0JZGF0YS0+Y2hhaW5fbm9pc2VfYSA9IChjaGFpbl9ub2lzZV9hICsgZGF0YS0+Y2hhaW5fbm9pc2VfYSk7Ci0JZGF0YS0+Y2hhaW5fbm9pc2VfYiA9IChjaGFpbl9ub2lzZV9iICsgZGF0YS0+Y2hhaW5fbm9pc2VfYik7Ci0JZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IChjaGFpbl9ub2lzZV9jICsgZGF0YS0+Y2hhaW5fbm9pc2VfYyk7Ci0KLQlkYXRhLT5jaGFpbl9zaWduYWxfYSA9IChjaGFpbl9zaWdfYSArIGRhdGEtPmNoYWluX3NpZ25hbF9hKTsKLQlkYXRhLT5jaGFpbl9zaWduYWxfYiA9IChjaGFpbl9zaWdfYiArIGRhdGEtPmNoYWluX3NpZ25hbF9iKTsKLQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IChjaGFpbl9zaWdfYyArIGRhdGEtPmNoYWluX3NpZ25hbF9jKTsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiY2hhbj0lZCwgYmFuZDI0PSVkLCBiZWFjb249JWRcbiIsCi0JCQlyeG9uX2NobnVtLCByeG9uX2JhbmQyNCwgZGF0YS0+YmVhY29uX2NvdW50KTsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNoYWluX3NpZzogYSAlZCBiICVkIGMgJWRcbiIsCi0JCQljaGFpbl9zaWdfYSwgY2hhaW5fc2lnX2IsIGNoYWluX3NpZ19jKTsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImNoYWluX25vaXNlOiBhICVkIGIgJWQgYyAlZFxuIiwKLQkJCWNoYWluX25vaXNlX2EsIGNoYWluX25vaXNlX2IsIGNoYWluX25vaXNlX2MpOwotCi0JLyogSWYgdGhpcyBpcyB0aGUgImNoYWluX25vaXNlX251bV9iZWFjb25zIiwgZGV0ZXJtaW5lOgotCSAqIDEpICBEaXNjb25uZWN0ZWQgYW50ZW5uYXMgKHVzaW5nIHNpZ25hbCBzdHJlbmd0aHMpCi0JICogMikgIERpZmZlcmVudGlhbCBnYWluICh1c2luZyBzaWxlbmNlIG5vaXNlKSB0byBiYWxhbmNlIHJlY2VpdmVycyAqLwotCWlmIChkYXRhLT5iZWFjb25fY291bnQgIT0KLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfbnVtX2JlYWNvbnMpCi0JCXJldHVybjsKLQotCS8qIEFuYWx5emUgc2lnbmFsIGZvciBkaXNjb25uZWN0ZWQgYW50ZW5uYSAqLwotCWl3bDQ5NjVfZmluZF9kaXNjb25uX2FudGVubmEocHJpdiwgYXZlcmFnZV9zaWcsIGRhdGEpOwotCi0JLyogQW5hbHl6ZSBub2lzZSBmb3IgcnggYmFsYW5jZSAqLwotCWF2ZXJhZ2Vfbm9pc2VbMF0gPSBkYXRhLT5jaGFpbl9ub2lzZV9hIC8KLQkJCSAgIHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOwotCWF2ZXJhZ2Vfbm9pc2VbMV0gPSBkYXRhLT5jaGFpbl9ub2lzZV9iIC8KLQkJCSAgIHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOwotCWF2ZXJhZ2Vfbm9pc2VbMl0gPSBkYXRhLT5jaGFpbl9ub2lzZV9jIC8KLQkJCSAgIHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX251bV9iZWFjb25zOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykgewotCQlpZiAoIShkYXRhLT5kaXNjb25uX2FycmF5W2ldKSAmJgotCQkgICAoYXZlcmFnZV9ub2lzZVtpXSA8PSBtaW5fYXZlcmFnZV9ub2lzZSkpIHsKLQkJCS8qIFRoaXMgbWVhbnMgdGhhdCBjaGFpbiBpIGlzIGFjdGl2ZSBhbmQgaGFzCi0JCQkgKiBsb3dlciBub2lzZSB2YWx1ZXMgc28gZmFyOiAqLwotCQkJbWluX2F2ZXJhZ2Vfbm9pc2UgPSBhdmVyYWdlX25vaXNlW2ldOwotCQkJbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pID0gaTsKLQkJfQotCX0KLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiYXZlcmFnZV9ub2lzZTogYSAlZCBiICVkIGMgJWRcbiIsCi0JCQlhdmVyYWdlX25vaXNlWzBdLCBhdmVyYWdlX25vaXNlWzFdLAotCQkJYXZlcmFnZV9ub2lzZVsyXSk7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm1pbl9hdmVyYWdlX25vaXNlID0gJWQsIGFudGVubmEgJWRcbiIsCi0JCQltaW5fYXZlcmFnZV9ub2lzZSwgbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pKTsKLQotCWl3bDQ5NjVfZ2Fpbl9jb21wdXRhdGlvbihwcml2LCBhdmVyYWdlX25vaXNlLAotCQkJbWluX2F2ZXJhZ2Vfbm9pc2VfYW50ZW5uYV9pLCBtaW5fYXZlcmFnZV9ub2lzZSwKLQkJCWl3bDQ5NjVfZmluZF9maXJzdF9jaGFpbihwcml2LT5jZmctPnZhbGlkX3J4X2FudCkpOwotCi0JLyogU29tZSBwb3dlciBjaGFuZ2VzIG1heSBoYXZlIGJlZW4gbWFkZSBkdXJpbmcgdGhlIGNhbGlicmF0aW9uLgotCSAqIFVwZGF0ZSBhbmQgY29tbWl0IHRoZSBSWE9OCi0JICovCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncykKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKHByaXYpOwotCi0JZGF0YS0+c3RhdGUgPSBJV0xfQ0hBSU5fTk9JU0VfRE9ORTsKLQlpd2xfbGVnYWN5X3Bvd2VyX3VwZGF0ZV9tb2RlKHByaXYsIGZhbHNlKTsKLX0KLQotdm9pZCBpd2w0OTY1X3Jlc2V0X3J1bl90aW1lX2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgaTsKLQltZW1zZXQoJihwcml2LT5zZW5zaXRpdml0eV9kYXRhKSwgMCwKLQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSkpOwotCW1lbXNldCgmKHByaXYtPmNoYWluX25vaXNlX2RhdGEpLCAwLAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhKSk7Ci0JZm9yIChpID0gMDsgaSA8IE5VTV9SWF9DSEFJTlM7IGkrKykKLQkJcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5kZWx0YV9nYWluX2NvZGVbaV0gPQotCQkJCUNIQUlOX05PSVNFX0RFTFRBX0dBSU5fSU5JVF9WQUw7Ci0KLQkvKiBBc2sgZm9yIHN0YXRpc3RpY3Mgbm93LCB0aGUgdUNvZGUgd2lsbCBzZW5kIG5vdGlmaWNhdGlvbgotCSAqIHBlcmlvZGljYWxseSBhZnRlciBhc3NvY2lhdGlvbiAqLwotCWl3bF9sZWdhY3lfc2VuZF9zdGF0aXN0aWNzX3JlcXVlc3QocHJpdiwgQ01EX0FTWU5DLCB0cnVlKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5MzY2NS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1kZWJ1Z2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKgotKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0qCi0qIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSoKLSogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0qCi0qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0qCi0qIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0qIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0qIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0qIFVTQQotKgotKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0qCi0qIENvbnRhY3QgSW5mb3JtYXRpb246Ci0qICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1kZWJ1Z2ZzLmgiCi0KLXN0YXRpYyBjb25zdCBjaGFyICpmbXRfdmFsdWUgPSAiICAlLTMwcyAlMTB1XG4iOwotc3RhdGljIGNvbnN0IGNoYXIgKmZtdF90YWJsZSA9ICIgICUtMzBzICUxMHUgICUxMHUgICUxMHUgICUxMHVcbiI7Ci1zdGF0aWMgY29uc3QgY2hhciAqZm10X2hlYWRlciA9Ci0JIiUtMzJzICAgIGN1cnJlbnQgIGN1bXVsYXRpdmUgICAgICAgZGVsdGEgICAgICAgICBtYXhcbiI7Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9zdGF0aXN0aWNzX2ZsYWcoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjaGFyICpidWYsIGludCBidWZzeikKLXsKLQlpbnQgcCA9IDA7Ci0JdTMyIGZsYWc7Ci0KLQlmbGFnID0gbGUzMl90b19jcHUocHJpdi0+XzQ5NjUuc3RhdGlzdGljcy5mbGFnKTsKLQotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlN0YXRpc3RpY3MgRmxhZygweCVYKTpcbiIsIGZsYWcpOwotCWlmIChmbGFnICYgVUNPREVfU1RBVElTVElDU19DTEVBUl9NU0spCi0JCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwKLQkJIlx0U3RhdGlzdGljcyBoYXZlIGJlZW4gY2xlYXJlZFxuIik7Ci0JcCArPSBzY25wcmludGYoYnVmICsgcCwgYnVmc3ogLSBwLCAiXHRPcGVyYXRpb25hbCBGcmVxdWVuY3k6ICVzXG4iLAotCQkoZmxhZyAmIFVDT0RFX1NUQVRJU1RJQ1NfRlJFUVVFTkNZX01TSykKLQkJPyAiMi40IEdIeiIgOiAiNS4yIEdIeiIpOwotCXAgKz0gc2NucHJpbnRmKGJ1ZiArIHAsIGJ1ZnN6IC0gcCwgIlx0VEdqIE5hcnJvdyBCYW5kOiAlc1xuIiwKLQkJKGZsYWcgJiBVQ09ERV9TVEFUSVNUSUNTX05BUlJPV19CQU5EX01TSykKLQkJID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7Ci0KLQlyZXR1cm4gcDsKLX0KLQotc3NpemVfdCBpd2w0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHBvcyA9IDA7Ci0JY2hhciAqYnVmOwotCWludCBidWZzeiA9IHNpemVvZihzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkpICogNDAgKwotCQkgICAgc2l6ZW9mKHN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkpICogNDAgKwotCQkgICAgc2l6ZW9mKHN0cnVjdCBzdGF0aXN0aWNzX3J4X2h0X3BoeSkgKiA0MCArIDQwMDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9waHkgKm9mZG0sICphY2N1bV9vZmRtLCAqZGVsdGFfb2ZkbSwgKm1heF9vZmRtOwotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X3BoeSAqY2NrLCAqYWNjdW1fY2NrLCAqZGVsdGFfY2NrLCAqbWF4X2NjazsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5ICpnZW5lcmFsLCAqYWNjdW1fZ2VuZXJhbDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19yeF9ub25fcGh5ICpkZWx0YV9nZW5lcmFsLCAqbWF4X2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfcnhfaHRfcGh5ICpodCwgKmFjY3VtX2h0LCAqZGVsdGFfaHQsICptYXhfaHQ7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJSVdMX0VSUihwcml2LCAiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKgotCSAqIHRoZSBzdGF0aXN0aWMgaW5mb3JtYXRpb24gZGlzcGxheSBoZXJlIGlzIGJhc2VkIG9uCi0JICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAqIG1pZ2h0IG5vdCByZWZsZWN0IHRoZSBjdXJyZW50IHVDb2RlIGFjdGl2aXR5Ci0JICovCi0Jb2ZkbSA9ICZwcml2LT5fNDk2NS5zdGF0aXN0aWNzLnJ4Lm9mZG07Ci0JY2NrID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MucnguY2NrOwotCWdlbmVyYWwgPSAmcHJpdi0+XzQ5NjUuc3RhdGlzdGljcy5yeC5nZW5lcmFsOwotCWh0ID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3Mucngub2ZkbV9odDsKLQlhY2N1bV9vZmRtID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3Mucngub2ZkbTsKLQlhY2N1bV9jY2sgPSAmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcy5yeC5jY2s7Ci0JYWNjdW1fZ2VuZXJhbCA9ICZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzLnJ4LmdlbmVyYWw7Ci0JYWNjdW1faHQgPSAmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcy5yeC5vZmRtX2h0OwotCWRlbHRhX29mZG0gPSAmcHJpdi0+XzQ5NjUuZGVsdGFfc3RhdGlzdGljcy5yeC5vZmRtOwotCWRlbHRhX2NjayA9ICZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLnJ4LmNjazsKLQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl80OTY1LmRlbHRhX3N0YXRpc3RpY3MucnguZ2VuZXJhbDsKLQlkZWx0YV9odCA9ICZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLnJ4Lm9mZG1faHQ7Ci0JbWF4X29mZG0gPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLnJ4Lm9mZG07Ci0JbWF4X2NjayA9ICZwcml2LT5fNDk2NS5tYXhfZGVsdGEucnguY2NrOwotCW1heF9nZW5lcmFsID0gJnByaXYtPl80OTY1Lm1heF9kZWx0YS5yeC5nZW5lcmFsOwotCW1heF9odCA9ICZwcml2LT5fNDk2NS5tYXhfZGVsdGEucngub2ZkbV9odDsKLQotCXBvcyArPSBpd2w0OTY1X3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X2hlYWRlciwgIlN0YXRpc3RpY3NfUnggLSBPRkRNOiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+aW5hX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+aW5hX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5pbmFfY250LCBtYXhfb2ZkbS0+aW5hX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmluYV9jbnQpLCBhY2N1bV9vZmRtLT5maW5hX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5maW5hX2NudCwgbWF4X29mZG0tPmZpbmFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicGxjcF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5wbGNwX2VyciksIGFjY3VtX29mZG0tPnBsY3BfZXJyLAotCQkJIGRlbHRhX29mZG0tPnBsY3BfZXJyLCBtYXhfb2ZkbS0+cGxjcF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjcmMzMl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9lcnIpLCBhY2N1bV9vZmRtLT5jcmMzMl9lcnIsCi0JCQkgZGVsdGFfb2ZkbS0+Y3JjMzJfZXJyLCBtYXhfb2ZkbS0+Y3JjMzJfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5vdmVycnVuX2VyciksCi0JCQkgYWNjdW1fb2ZkbS0+b3ZlcnJ1bl9lcnIsIGRlbHRhX29mZG0tPm92ZXJydW5fZXJyLAotCQkJIG1heF9vZmRtLT5vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImVhcmx5X292ZXJydW5fZXJyOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIGRlbHRhX29mZG0tPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIG1heF9vZmRtLT5lYXJseV9vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImNyYzMyX2dvb2Q6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5jcmMzMl9nb29kKSwKLQkJCSBhY2N1bV9vZmRtLT5jcmMzMl9nb29kLCBkZWx0YV9vZmRtLT5jcmMzMl9nb29kLAotCQkJIG1heF9vZmRtLT5jcmMzMl9nb29kKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmFsc2VfYWxhcm1fY250OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmFsc2VfYWxhcm1fY250KSwKLQkJCSBhY2N1bV9vZmRtLT5mYWxzZV9hbGFybV9jbnQsCi0JCQkgZGVsdGFfb2ZkbS0+ZmFsc2VfYWxhcm1fY250LAotCQkJIG1heF9vZmRtLT5mYWxzZV9hbGFybV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJmaW5hX3N5bmNfZXJyX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmZpbmFfc3luY19lcnJfY250KSwKLQkJCSBhY2N1bV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKLQkJCSBkZWx0YV9vZmRtLT5maW5hX3N5bmNfZXJyX2NudCwKLQkJCSBtYXhfb2ZkbS0+ZmluYV9zeW5jX2Vycl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJzZmRfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNmZF90aW1lb3V0KSwKLQkJCSBhY2N1bV9vZmRtLT5zZmRfdGltZW91dCwgZGVsdGFfb2ZkbS0+c2ZkX3RpbWVvdXQsCi0JCQkgbWF4X29mZG0tPnNmZF90aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmluYV90aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+ZmluYV90aW1lb3V0KSwKLQkJCSBhY2N1bV9vZmRtLT5maW5hX3RpbWVvdXQsIGRlbHRhX29mZG0tPmZpbmFfdGltZW91dCwKLQkJCSBtYXhfb2ZkbS0+ZmluYV90aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAidW5yZXNwb25kZWRfcnRzOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+dW5yZXNwb25kZWRfcnRzKSwKLQkJCSBhY2N1bV9vZmRtLT51bnJlc3BvbmRlZF9ydHMsCi0JCQkgZGVsdGFfb2ZkbS0+dW5yZXNwb25kZWRfcnRzLAotCQkJIG1heF9vZmRtLT51bnJlc3BvbmRlZF9ydHMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyeGVfZnJhbWVfbG10X292cnVuOiIsCi0JCQkgbGUzMl90b19jcHUob2ZkbS0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAotCQkJIGFjY3VtX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIGRlbHRhX29mZG0tPnJ4ZV9mcmFtZV9saW1pdF9vdmVycnVuLAotCQkJIG1heF9vZmRtLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYWNrX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9hY2tfY250LCBkZWx0YV9vZmRtLT5zZW50X2Fja19jbnQsCi0JCQkgbWF4X29mZG0tPnNlbnRfYWNrX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfY3RzX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfY3RzX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9jdHNfY250LCBkZWx0YV9vZmRtLT5zZW50X2N0c19jbnQsCi0JCQkgbWF4X29mZG0tPnNlbnRfY3RzX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfYmFfcnNwX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnNlbnRfYmFfcnNwX2NudCksCi0JCQkgYWNjdW1fb2ZkbS0+c2VudF9iYV9yc3BfY250LAotCQkJIGRlbHRhX29mZG0tPnNlbnRfYmFfcnNwX2NudCwKLQkJCSBtYXhfb2ZkbS0+c2VudF9iYV9yc3BfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZHNwX3NlbGZfa2lsbDoiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPmRzcF9zZWxmX2tpbGwpLAotCQkJIGFjY3VtX29mZG0tPmRzcF9zZWxmX2tpbGwsCi0JCQkgZGVsdGFfb2ZkbS0+ZHNwX3NlbGZfa2lsbCwKLQkJCSBtYXhfb2ZkbS0+ZHNwX3NlbGZfa2lsbCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgIm1oX2Zvcm1hdF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShvZmRtLT5taF9mb3JtYXRfZXJyKSwKLQkJCSBhY2N1bV9vZmRtLT5taF9mb3JtYXRfZXJyLAotCQkJIGRlbHRhX29mZG0tPm1oX2Zvcm1hdF9lcnIsCi0JCQkgbWF4X29mZG0tPm1oX2Zvcm1hdF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyZV9hY3FfbWFpbl9yc3NpX3N1bToiLAotCQkJIGxlMzJfdG9fY3B1KG9mZG0tPnJlX2FjcV9tYWluX3Jzc2lfc3VtKSwKLQkJCSBhY2N1bV9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKLQkJCSBkZWx0YV9vZmRtLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKLQkJCSBtYXhfb2ZkbS0+cmVfYWNxX21haW5fcnNzaV9zdW0pOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF9oZWFkZXIsICJTdGF0aXN0aWNzX1J4IC0gQ0NLOiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5pbmFfY250KSwgYWNjdW1fY2NrLT5pbmFfY250LAotCQkJIGRlbHRhX2Njay0+aW5hX2NudCwgbWF4X2Njay0+aW5hX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZpbmFfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5maW5hX2NudCksIGFjY3VtX2Njay0+ZmluYV9jbnQsCi0JCQkgZGVsdGFfY2NrLT5maW5hX2NudCwgbWF4X2Njay0+ZmluYV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJwbGNwX2VycjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+cGxjcF9lcnIpLCBhY2N1bV9jY2stPnBsY3BfZXJyLAotCQkJIGRlbHRhX2Njay0+cGxjcF9lcnIsIG1heF9jY2stPnBsY3BfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiY3JjMzJfZXJyOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5jcmMzMl9lcnIpLCBhY2N1bV9jY2stPmNyYzMyX2VyciwKLQkJCSBkZWx0YV9jY2stPmNyYzMyX2VyciwgbWF4X2Njay0+Y3JjMzJfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPm92ZXJydW5fZXJyKSwKLQkJCSBhY2N1bV9jY2stPm92ZXJydW5fZXJyLCBkZWx0YV9jY2stPm92ZXJydW5fZXJyLAotCQkJIG1heF9jY2stPm92ZXJydW5fZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZWFybHlfb3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmVhcmx5X292ZXJydW5fZXJyKSwKLQkJCSBhY2N1bV9jY2stPmVhcmx5X292ZXJydW5fZXJyLAotCQkJIGRlbHRhX2Njay0+ZWFybHlfb3ZlcnJ1bl9lcnIsCi0JCQkgbWF4X2Njay0+ZWFybHlfb3ZlcnJ1bl9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjcmMzMl9nb29kOiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5jcmMzMl9nb29kKSwgYWNjdW1fY2NrLT5jcmMzMl9nb29kLAotCQkJIGRlbHRhX2Njay0+Y3JjMzJfZ29vZCwgbWF4X2Njay0+Y3JjMzJfZ29vZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZhbHNlX2FsYXJtX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZmFsc2VfYWxhcm1fY250KSwKLQkJCSBhY2N1bV9jY2stPmZhbHNlX2FsYXJtX2NudCwKLQkJCSBkZWx0YV9jY2stPmZhbHNlX2FsYXJtX2NudCwgbWF4X2Njay0+ZmFsc2VfYWxhcm1fY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmluYV9zeW5jX2Vycl9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfc3luY19lcnJfY250KSwKLQkJCSBhY2N1bV9jY2stPmZpbmFfc3luY19lcnJfY250LAotCQkJIGRlbHRhX2Njay0+ZmluYV9zeW5jX2Vycl9jbnQsCi0JCQkgbWF4X2Njay0+ZmluYV9zeW5jX2Vycl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJzZmRfdGltZW91dDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2ZkX3RpbWVvdXQpLAotCQkJIGFjY3VtX2Njay0+c2ZkX3RpbWVvdXQsIGRlbHRhX2Njay0+c2ZkX3RpbWVvdXQsCi0JCQkgbWF4X2Njay0+c2ZkX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJmaW5hX3RpbWVvdXQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPmZpbmFfdGltZW91dCksCi0JCQkgYWNjdW1fY2NrLT5maW5hX3RpbWVvdXQsIGRlbHRhX2Njay0+ZmluYV90aW1lb3V0LAotCQkJIG1heF9jY2stPmZpbmFfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInVucmVzcG9uZGVkX3J0czoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+dW5yZXNwb25kZWRfcnRzKSwKLQkJCSBhY2N1bV9jY2stPnVucmVzcG9uZGVkX3J0cywgZGVsdGFfY2NrLT51bnJlc3BvbmRlZF9ydHMsCi0JCQkgbWF4X2Njay0+dW5yZXNwb25kZWRfcnRzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicnhlX2ZyYW1lX2xtdF9vdnJ1bjoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4pLAotCQkJIGFjY3VtX2Njay0+cnhlX2ZyYW1lX2xpbWl0X292ZXJydW4sCi0JCQkgZGVsdGFfY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1biwKLQkJCSBtYXhfY2NrLT5yeGVfZnJhbWVfbGltaXRfb3ZlcnJ1bik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNlbnRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+c2VudF9hY2tfY250KSwKLQkJCSBhY2N1bV9jY2stPnNlbnRfYWNrX2NudCwgZGVsdGFfY2NrLT5zZW50X2Fja19jbnQsCi0JCQkgbWF4X2Njay0+c2VudF9hY2tfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAic2VudF9jdHNfY250OiIsCi0JCQkgbGUzMl90b19jcHUoY2NrLT5zZW50X2N0c19jbnQpLAotCQkJIGFjY3VtX2Njay0+c2VudF9jdHNfY250LCBkZWx0YV9jY2stPnNlbnRfY3RzX2NudCwKLQkJCSBtYXhfY2NrLT5zZW50X2N0c19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJzZW50X2JhX3JzcF9jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPnNlbnRfYmFfcnNwX2NudCksCi0JCQkgYWNjdW1fY2NrLT5zZW50X2JhX3JzcF9jbnQsCi0JCQkgZGVsdGFfY2NrLT5zZW50X2JhX3JzcF9jbnQsCi0JCQkgbWF4X2Njay0+c2VudF9iYV9yc3BfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZHNwX3NlbGZfa2lsbDoiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+ZHNwX3NlbGZfa2lsbCksCi0JCQkgYWNjdW1fY2NrLT5kc3Bfc2VsZl9raWxsLCBkZWx0YV9jY2stPmRzcF9zZWxmX2tpbGwsCi0JCQkgbWF4X2Njay0+ZHNwX3NlbGZfa2lsbCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgIm1oX2Zvcm1hdF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShjY2stPm1oX2Zvcm1hdF9lcnIpLAotCQkJIGFjY3VtX2Njay0+bWhfZm9ybWF0X2VyciwgZGVsdGFfY2NrLT5taF9mb3JtYXRfZXJyLAotCQkJIG1heF9jY2stPm1oX2Zvcm1hdF9lcnIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyZV9hY3FfbWFpbl9yc3NpX3N1bToiLAotCQkJIGxlMzJfdG9fY3B1KGNjay0+cmVfYWNxX21haW5fcnNzaV9zdW0pLAotCQkJIGFjY3VtX2Njay0+cmVfYWNxX21haW5fcnNzaV9zdW0sCi0JCQkgZGVsdGFfY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSwKLQkJCSBtYXhfY2NrLT5yZV9hY3FfbWFpbl9yc3NpX3N1bSk7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X2hlYWRlciwgIlN0YXRpc3RpY3NfUnggLSBHRU5FUkFMOiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJib2d1c19jdHM6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5ib2d1c19jdHMpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJvZ3VzX2N0cywgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfY3RzLAotCQkJIG1heF9nZW5lcmFsLT5ib2d1c19jdHMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJib2d1c19hY2s6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5ib2d1c19hY2spLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJvZ3VzX2FjaywgZGVsdGFfZ2VuZXJhbC0+Ym9ndXNfYWNrLAotCQkJIG1heF9nZW5lcmFsLT5ib2d1c19hY2spOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJub25fYnNzaWRfZnJhbWVzOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcyksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+bm9uX2Jzc2lkX2ZyYW1lcywKLQkJCSBkZWx0YV9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzLAotCQkJIG1heF9nZW5lcmFsLT5ub25fYnNzaWRfZnJhbWVzKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZmlsdGVyZWRfZnJhbWVzOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+ZmlsdGVyZWRfZnJhbWVzLAotCQkJIG1heF9nZW5lcmFsLT5maWx0ZXJlZF9mcmFtZXMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJub25fY2hhbm5lbF9iZWFjb25zOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucyksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+bm9uX2NoYW5uZWxfYmVhY29ucywKLQkJCSBkZWx0YV9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zLAotCQkJIG1heF9nZW5lcmFsLT5ub25fY2hhbm5lbF9iZWFjb25zKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiY2hhbm5lbF9iZWFjb25zOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+Y2hhbm5lbF9iZWFjb25zKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+Y2hhbm5lbF9iZWFjb25zLAotCQkJIG1heF9nZW5lcmFsLT5jaGFubmVsX2JlYWNvbnMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJudW1fbWlzc2VkX2Jjb246IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5udW1fbWlzc2VkX2Jjb24pLAotCQkJIGFjY3VtX2dlbmVyYWwtPm51bV9taXNzZWRfYmNvbiwKLQkJCSBkZWx0YV9nZW5lcmFsLT5udW1fbWlzc2VkX2Jjb24sCi0JCQkgbWF4X2dlbmVyYWwtPm51bV9taXNzZWRfYmNvbik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFkY19yeF9zYXR1cmF0aW9uX3RpbWU6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5hZGNfcnhfc2F0dXJhdGlvbl90aW1lKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5hZGNfcnhfc2F0dXJhdGlvbl90aW1lLAotCQkJIGRlbHRhX2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUsCi0JCQkgbWF4X2dlbmVyYWwtPmFkY19yeF9zYXR1cmF0aW9uX3RpbWUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJpbmFfZGV0ZWN0X3NlYXJjaF90bToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmluYV9kZXRlY3Rpb25fc2VhcmNoX3RpbWUpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmluYV9kZXRlY3Rpb25fc2VhcmNoX3RpbWUsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+aW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZSwKLQkJCSBtYXhfZ2VuZXJhbC0+aW5hX2RldGVjdGlvbl9zZWFyY2hfdGltZSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJlYWNvbl9zaWxlbmNlX3Jzc2lfYToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9hLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSwKLQkJCSBtYXhfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9hKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYmVhY29uX3NpbGVuY2VfcnNzaV9iOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3NpbGVuY2VfcnNzaV9iLAotCQkJIG1heF9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2IpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJiZWFjb25fc2lsZW5jZV9yc3NpX2M6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYywKLQkJCSBkZWx0YV9nZW5lcmFsLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MsCi0JCQkgbWF4X2dlbmVyYWwtPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImludGVyZmVyZW5jZV9kYXRhX2ZsYWc6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5pbnRlcmZlcmVuY2VfZGF0YV9mbGFnLAotCQkJIGRlbHRhX2dlbmVyYWwtPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcsCi0JCQkgbWF4X2dlbmVyYWwtPmludGVyZmVyZW5jZV9kYXRhX2ZsYWcpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjaGFubmVsX2xvYWQ6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5jaGFubmVsX2xvYWQpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmNoYW5uZWxfbG9hZCwKLQkJCSBkZWx0YV9nZW5lcmFsLT5jaGFubmVsX2xvYWQsCi0JCQkgbWF4X2dlbmVyYWwtPmNoYW5uZWxfbG9hZCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImRzcF9mYWxzZV9hbGFybXM6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5kc3BfZmFsc2VfYWxhcm1zKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5kc3BfZmFsc2VfYWxhcm1zLAotCQkJIGRlbHRhX2dlbmVyYWwtPmRzcF9mYWxzZV9hbGFybXMsCi0JCQkgbWF4X2dlbmVyYWwtPmRzcF9mYWxzZV9hbGFybXMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJiZWFjb25fcnNzaV9hOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYSwKLQkJCSBkZWx0YV9nZW5lcmFsLT5iZWFjb25fcnNzaV9hLAotCQkJIG1heF9nZW5lcmFsLT5iZWFjb25fcnNzaV9hKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYmVhY29uX3Jzc2lfYjoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9yc3NpX2IpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9yc3NpX2IsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYiwKLQkJCSBtYXhfZ2VuZXJhbC0+YmVhY29uX3Jzc2lfYik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJlYWNvbl9yc3NpX2M6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fcnNzaV9jKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5iZWFjb25fcnNzaV9jLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9yc3NpX2MsCi0JCQkgbWF4X2dlbmVyYWwtPmJlYWNvbl9yc3NpX2MpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJiZWFjb25fZW5lcmd5X2E6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5iZWFjb25fZW5lcmd5X2EpLAotCQkJIGFjY3VtX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYSwKLQkJCSBkZWx0YV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2EsCi0JCQkgbWF4X2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJlYWNvbl9lbmVyZ3lfYjoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYiksCi0JCQkgYWNjdW1fZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9iLAotCQkJIGRlbHRhX2dlbmVyYWwtPmJlYWNvbl9lbmVyZ3lfYiwKLQkJCSBtYXhfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYmVhY29uX2VuZXJneV9jOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9jKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+YmVhY29uX2VuZXJneV9jLAotCQkJIG1heF9nZW5lcmFsLT5iZWFjb25fZW5lcmd5X2MpOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF9oZWFkZXIsICJTdGF0aXN0aWNzX1J4IC0gT0ZETV9IVDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicGxjcF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+cGxjcF9lcnIpLCBhY2N1bV9odC0+cGxjcF9lcnIsCi0JCQkgZGVsdGFfaHQtPnBsY3BfZXJyLCBtYXhfaHQtPnBsY3BfZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAib3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+b3ZlcnJ1bl9lcnIpLCBhY2N1bV9odC0+b3ZlcnJ1bl9lcnIsCi0JCQkgZGVsdGFfaHQtPm92ZXJydW5fZXJyLCBtYXhfaHQtPm92ZXJydW5fZXJyKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZWFybHlfb3ZlcnJ1bl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+ZWFybHlfb3ZlcnJ1bl9lcnIpLAotCQkJIGFjY3VtX2h0LT5lYXJseV9vdmVycnVuX2VyciwKLQkJCSBkZWx0YV9odC0+ZWFybHlfb3ZlcnJ1bl9lcnIsCi0JCQkgbWF4X2h0LT5lYXJseV9vdmVycnVuX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImNyYzMyX2dvb2Q6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+Y3JjMzJfZ29vZCksIGFjY3VtX2h0LT5jcmMzMl9nb29kLAotCQkJIGRlbHRhX2h0LT5jcmMzMl9nb29kLCBtYXhfaHQtPmNyYzMyX2dvb2QpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJjcmMzMl9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+Y3JjMzJfZXJyKSwgYWNjdW1faHQtPmNyYzMyX2VyciwKLQkJCSBkZWx0YV9odC0+Y3JjMzJfZXJyLCBtYXhfaHQtPmNyYzMyX2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgIm1oX2Zvcm1hdF9lcnI6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+bWhfZm9ybWF0X2VyciksCi0JCQkgYWNjdW1faHQtPm1oX2Zvcm1hdF9lcnIsCi0JCQkgZGVsdGFfaHQtPm1oX2Zvcm1hdF9lcnIsIG1heF9odC0+bWhfZm9ybWF0X2Vycik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZ19jcmMzMl9nb29kOiIsCi0JCQkgbGUzMl90b19jcHUoaHQtPmFnZ19jcmMzMl9nb29kKSwKLQkJCSBhY2N1bV9odC0+YWdnX2NyYzMyX2dvb2QsCi0JCQkgZGVsdGFfaHQtPmFnZ19jcmMzMl9nb29kLCBtYXhfaHQtPmFnZ19jcmMzMl9nb29kKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYWdnX21wZHVfY250OiIsCi0JCQkgbGUzMl90b19jcHUoaHQtPmFnZ19tcGR1X2NudCksCi0JCQkgYWNjdW1faHQtPmFnZ19tcGR1X2NudCwKLQkJCSBkZWx0YV9odC0+YWdnX21wZHVfY250LCBtYXhfaHQtPmFnZ19tcGR1X2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZ19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShodC0+YWdnX2NudCksIGFjY3VtX2h0LT5hZ2dfY250LAotCQkJIGRlbHRhX2h0LT5hZ2dfY250LCBtYXhfaHQtPmFnZ19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJ1bnN1cHBvcnRfbWNzOiIsCi0JCQkgbGUzMl90b19jcHUoaHQtPnVuc3VwcG9ydF9tY3MpLAotCQkJIGFjY3VtX2h0LT51bnN1cHBvcnRfbWNzLAotCQkJIGRlbHRhX2h0LT51bnN1cHBvcnRfbWNzLCBtYXhfaHQtPnVuc3VwcG9ydF9tY3MpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90IGl3bDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSAoc2l6ZW9mKHN0cnVjdCBzdGF0aXN0aWNzX3R4KSAqIDQ4KSArIDI1MDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc190eCAqdHgsICphY2N1bV90eCwgKmRlbHRhX3R4LCAqbWF4X3R4OwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogdGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQotCSAgKi8KLQl0eCA9ICZwcml2LT5fNDk2NS5zdGF0aXN0aWNzLnR4OwotCWFjY3VtX3R4ID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3MudHg7Ci0JZGVsdGFfdHggPSAmcHJpdi0+XzQ5NjUuZGVsdGFfc3RhdGlzdGljcy50eDsKLQltYXhfdHggPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLnR4OwotCi0JcG9zICs9IGl3bDQ5NjVfc3RhdGlzdGljc19mbGFnKHByaXYsIGJ1ZiwgYnVmc3opOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfaGVhZGVyLCAiU3RhdGlzdGljc19UeDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicHJlYW1ibGU6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+cHJlYW1ibGVfY250KSwKLQkJCSBhY2N1bV90eC0+cHJlYW1ibGVfY250LAotCQkJIGRlbHRhX3R4LT5wcmVhbWJsZV9jbnQsIG1heF90eC0+cHJlYW1ibGVfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicnhfZGV0ZWN0ZWRfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPnJ4X2RldGVjdGVkX2NudCksCi0JCQkgYWNjdW1fdHgtPnJ4X2RldGVjdGVkX2NudCwKLQkJCSBkZWx0YV90eC0+cnhfZGV0ZWN0ZWRfY250LCBtYXhfdHgtPnJ4X2RldGVjdGVkX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImJ0X3ByaW9fZGVmZXJfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmJ0X3ByaW9fZGVmZXJfY250KSwKLQkJCSBhY2N1bV90eC0+YnRfcHJpb19kZWZlcl9jbnQsCi0JCQkgZGVsdGFfdHgtPmJ0X3ByaW9fZGVmZXJfY250LAotCQkJIG1heF90eC0+YnRfcHJpb19kZWZlcl9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJidF9wcmlvX2tpbGxfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmJ0X3ByaW9fa2lsbF9jbnQpLAotCQkJIGFjY3VtX3R4LT5idF9wcmlvX2tpbGxfY250LAotCQkJIGRlbHRhX3R4LT5idF9wcmlvX2tpbGxfY250LAotCQkJIG1heF90eC0+YnRfcHJpb19raWxsX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImZld19ieXRlc19jbnQ6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+ZmV3X2J5dGVzX2NudCksCi0JCQkgYWNjdW1fdHgtPmZld19ieXRlc19jbnQsCi0JCQkgZGVsdGFfdHgtPmZld19ieXRlc19jbnQsIG1heF90eC0+ZmV3X2J5dGVzX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImN0c190aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmN0c190aW1lb3V0KSwgYWNjdW1fdHgtPmN0c190aW1lb3V0LAotCQkJIGRlbHRhX3R4LT5jdHNfdGltZW91dCwgbWF4X3R4LT5jdHNfdGltZW91dCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFja190aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFja190aW1lb3V0KSwKLQkJCSBhY2N1bV90eC0+YWNrX3RpbWVvdXQsCi0JCQkgZGVsdGFfdHgtPmFja190aW1lb3V0LCBtYXhfdHgtPmFja190aW1lb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZXhwZWN0ZWRfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5leHBlY3RlZF9hY2tfY250KSwKLQkJCSBhY2N1bV90eC0+ZXhwZWN0ZWRfYWNrX2NudCwKLQkJCSBkZWx0YV90eC0+ZXhwZWN0ZWRfYWNrX2NudCwKLQkJCSBtYXhfdHgtPmV4cGVjdGVkX2Fja19jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhY3R1YWxfYWNrX2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hY3R1YWxfYWNrX2NudCksCi0JCQkgYWNjdW1fdHgtPmFjdHVhbF9hY2tfY250LAotCQkJIGRlbHRhX3R4LT5hY3R1YWxfYWNrX2NudCwKLQkJCSBtYXhfdHgtPmFjdHVhbF9hY2tfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZHVtcF9tc2R1X2NudDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5kdW1wX21zZHVfY250KSwKLQkJCSBhY2N1bV90eC0+ZHVtcF9tc2R1X2NudCwKLQkJCSBkZWx0YV90eC0+ZHVtcF9tc2R1X2NudCwKLQkJCSBtYXhfdHgtPmR1bXBfbXNkdV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhYm9ydF9ueHRfZnJhbWVfbWlzbWF0Y2g6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQpLAotCQkJIGFjY3VtX3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCwKLQkJCSBkZWx0YV90eC0+YnVyc3RfYWJvcnRfbmV4dF9mcmFtZV9taXNtYXRjaF9jbnQsCi0JCQkgbWF4X3R4LT5idXJzdF9hYm9ydF9uZXh0X2ZyYW1lX21pc21hdGNoX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFib3J0X21pc3Npbmdfbnh0X2ZyYW1lOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmJ1cnN0X2Fib3J0X21pc3NpbmdfbmV4dF9mcmFtZV9jbnQpLAotCQkJIGFjY3VtX3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250LAotCQkJIGRlbHRhX3R4LT5idXJzdF9hYm9ydF9taXNzaW5nX25leHRfZnJhbWVfY250LAotCQkJIG1heF90eC0+YnVyc3RfYWJvcnRfbWlzc2luZ19uZXh0X2ZyYW1lX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImN0c190aW1lb3V0X2NvbGxpc2lvbjoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5jdHNfdGltZW91dF9jb2xsaXNpb24pLAotCQkJIGFjY3VtX3R4LT5jdHNfdGltZW91dF9jb2xsaXNpb24sCi0JCQkgZGVsdGFfdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbiwKLQkJCSBtYXhfdHgtPmN0c190aW1lb3V0X2NvbGxpc2lvbik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFja19iYV90aW1lb3V0X2NvbGxpc2lvbjoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb24pLAotCQkJIGFjY3VtX3R4LT5hY2tfb3JfYmFfdGltZW91dF9jb2xsaXNpb24sCi0JCQkgZGVsdGFfdHgtPmFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbiwKLQkJCSBtYXhfdHgtPmFja19vcl9iYV90aW1lb3V0X2NvbGxpc2lvbik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyBiYV90aW1lb3V0OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5iYV90aW1lb3V0KSwKLQkJCSBhY2N1bV90eC0+YWdnLmJhX3RpbWVvdXQsCi0JCQkgZGVsdGFfdHgtPmFnZy5iYV90aW1lb3V0LAotCQkJIG1heF90eC0+YWdnLmJhX3RpbWVvdXQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgYmFfcmVzY2hlZF9mcmFtZXM6IiwKLQkJCSBsZTMyX3RvX2NwdSh0eC0+YWdnLmJhX3Jlc2NoZWR1bGVfZnJhbWVzKSwKLQkJCSBhY2N1bV90eC0+YWdnLmJhX3Jlc2NoZWR1bGVfZnJhbWVzLAotCQkJIGRlbHRhX3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMsCi0JCQkgbWF4X3R4LT5hZ2cuYmFfcmVzY2hlZHVsZV9mcmFtZXMpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgc2NkX3F1ZXJ5X2FnZ19mcmFtZToiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQpLAotCQkJIGFjY3VtX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZ19mcmFtZV9jbnQsCi0JCQkgZGVsdGFfdHgtPmFnZy5zY2RfcXVlcnlfYWdnX2ZyYW1lX2NudCwKLQkJCSBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfYWdnX2ZyYW1lX2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyBzY2RfcXVlcnlfbm9fYWdnOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5zY2RfcXVlcnlfbm9fYWdnKSwKLQkJCSBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9ub19hZ2csCi0JCQkgZGVsdGFfdHgtPmFnZy5zY2RfcXVlcnlfbm9fYWdnLAotCQkJIG1heF90eC0+YWdnLnNjZF9xdWVyeV9ub19hZ2cpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgc2NkX3F1ZXJ5X2FnZzoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X2FnZyksCi0JCQkgYWNjdW1fdHgtPmFnZy5zY2RfcXVlcnlfYWdnLAotCQkJIGRlbHRhX3R4LT5hZ2cuc2NkX3F1ZXJ5X2FnZywKLQkJCSBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfYWdnKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiYWdnIHNjZF9xdWVyeV9taXNtYXRjaDoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cuc2NkX3F1ZXJ5X21pc21hdGNoKSwKLQkJCSBhY2N1bV90eC0+YWdnLnNjZF9xdWVyeV9taXNtYXRjaCwKLQkJCSBkZWx0YV90eC0+YWdnLnNjZF9xdWVyeV9taXNtYXRjaCwKLQkJCSBtYXhfdHgtPmFnZy5zY2RfcXVlcnlfbWlzbWF0Y2gpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgZnJhbWVfbm90X3JlYWR5OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5mcmFtZV9ub3RfcmVhZHkpLAotCQkJIGFjY3VtX3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5LAotCQkJIGRlbHRhX3R4LT5hZ2cuZnJhbWVfbm90X3JlYWR5LAotCQkJIG1heF90eC0+YWdnLmZyYW1lX25vdF9yZWFkeSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyB1bmRlcnJ1bjoiLAotCQkJIGxlMzJfdG9fY3B1KHR4LT5hZ2cudW5kZXJydW4pLAotCQkJIGFjY3VtX3R4LT5hZ2cudW5kZXJydW4sCi0JCQkgZGVsdGFfdHgtPmFnZy51bmRlcnJ1biwgbWF4X3R4LT5hZ2cudW5kZXJydW4pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJhZ2cgYnRfcHJpb19raWxsOiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5idF9wcmlvX2tpbGwpLAotCQkJIGFjY3VtX3R4LT5hZ2cuYnRfcHJpb19raWxsLAotCQkJIGRlbHRhX3R4LT5hZ2cuYnRfcHJpb19raWxsLAotCQkJIG1heF90eC0+YWdnLmJ0X3ByaW9fa2lsbCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgImFnZyByeF9iYV9yc3BfY250OiIsCi0JCQkgbGUzMl90b19jcHUodHgtPmFnZy5yeF9iYV9yc3BfY250KSwKLQkJCSBhY2N1bV90eC0+YWdnLnJ4X2JhX3JzcF9jbnQsCi0JCQkgZGVsdGFfdHgtPmFnZy5yeF9iYV9yc3BfY250LAotCQkJIG1heF90eC0+YWdnLnJ4X2JhX3JzcF9jbnQpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zc2l6ZV90Ci1pd2w0OTY1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbCkgKiAxMCArIDMwMDsKLQlzc2l6ZV90IHJldDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2NvbW1vbiAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZ2VuZXJhbF9jb21tb24gKmRlbHRhX2dlbmVyYWwsICptYXhfZ2VuZXJhbDsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19kYmcgKmRiZywgKmFjY3VtX2RiZywgKmRlbHRhX2RiZywgKm1heF9kYmc7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfZGl2ICpkaXYsICphY2N1bV9kaXYsICpkZWx0YV9kaXYsICptYXhfZGl2OwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogdGhlIHN0YXRpc3RpYyBpbmZvcm1hdGlvbiBkaXNwbGF5IGhlcmUgaXMgYmFzZWQgb24KLQkgICogdGhlIGxhc3Qgc3RhdGlzdGljcyBub3RpZmljYXRpb24gZnJvbSB1Q29kZQotCSAgKiBtaWdodCBub3QgcmVmbGVjdCB0aGUgY3VycmVudCB1Q29kZSBhY3Rpdml0eQotCSAgKi8KLQlnZW5lcmFsID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JZGJnID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24uZGJnOwotCWRpdiA9ICZwcml2LT5fNDk2NS5zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRpdjsKLQlhY2N1bV9nZW5lcmFsID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JYWNjdW1fZGJnID0gJnByaXYtPl80OTY1LmFjY3VtX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24uZGJnOwotCWFjY3VtX2RpdiA9ICZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRpdjsKLQlkZWx0YV9nZW5lcmFsID0gJnByaXYtPl80OTY1LmRlbHRhX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JbWF4X2dlbmVyYWwgPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLmdlbmVyYWwuY29tbW9uOwotCWRlbHRhX2RiZyA9ICZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uLmRiZzsKLQltYXhfZGJnID0gJnByaXYtPl80OTY1Lm1heF9kZWx0YS5nZW5lcmFsLmNvbW1vbi5kYmc7Ci0JZGVsdGFfZGl2ID0gJnByaXYtPl80OTY1LmRlbHRhX3N0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24uZGl2OwotCW1heF9kaXYgPSAmcHJpdi0+XzQ5NjUubWF4X2RlbHRhLmdlbmVyYWwuY29tbW9uLmRpdjsKLQotCXBvcyArPSBpd2w0OTY1X3N0YXRpc3RpY3NfZmxhZyhwcml2LCBidWYsIGJ1ZnN6KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X2hlYWRlciwgIlN0YXRpc3RpY3NfR2VuZXJhbDoiKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3ZhbHVlLCAidGVtcGVyYXR1cmU6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT50ZW1wZXJhdHVyZSkpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdmFsdWUsICJ0dGxfdGltZXN0YW1wOiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+dHRsX3RpbWVzdGFtcCkpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJidXJzdF9jaGVjazoiLAotCQkJIGxlMzJfdG9fY3B1KGRiZy0+YnVyc3RfY2hlY2spLAotCQkJIGFjY3VtX2RiZy0+YnVyc3RfY2hlY2ssCi0JCQkgZGVsdGFfZGJnLT5idXJzdF9jaGVjaywgbWF4X2RiZy0+YnVyc3RfY2hlY2spOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJidXJzdF9jb3VudDoiLAotCQkJIGxlMzJfdG9fY3B1KGRiZy0+YnVyc3RfY291bnQpLAotCQkJIGFjY3VtX2RiZy0+YnVyc3RfY291bnQsCi0JCQkgZGVsdGFfZGJnLT5idXJzdF9jb3VudCwgbWF4X2RiZy0+YnVyc3RfY291bnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJ3YWl0X2Zvcl9zaWxlbmNlX3RpbWVvdXRfY291bnQ6IiwKLQkJCSBsZTMyX3RvX2NwdShkYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQpLAotCQkJIGFjY3VtX2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCwKLQkJCSBkZWx0YV9kYmctPndhaXRfZm9yX3NpbGVuY2VfdGltZW91dF9jbnQsCi0JCQkgbWF4X2RiZy0+d2FpdF9mb3Jfc2lsZW5jZV90aW1lb3V0X2NudCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInNsZWVwX3RpbWU6IiwKLQkJCSBsZTMyX3RvX2NwdShnZW5lcmFsLT5zbGVlcF90aW1lKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5zbGVlcF90aW1lLAotCQkJIGRlbHRhX2dlbmVyYWwtPnNsZWVwX3RpbWUsIG1heF9nZW5lcmFsLT5zbGVlcF90aW1lKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAic2xvdHNfb3V0OiIsCi0JCQkgbGUzMl90b19jcHUoZ2VuZXJhbC0+c2xvdHNfb3V0KSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5zbG90c19vdXQsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfb3V0LCBtYXhfZ2VuZXJhbC0+c2xvdHNfb3V0KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAic2xvdHNfaWRsZToiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnNsb3RzX2lkbGUpLAotCQkJIGFjY3VtX2dlbmVyYWwtPnNsb3RzX2lkbGUsCi0JCQkgZGVsdGFfZ2VuZXJhbC0+c2xvdHNfaWRsZSwgbWF4X2dlbmVyYWwtPnNsb3RzX2lkbGUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJ0eF9vbl9hOiIsCi0JCQkgbGUzMl90b19jcHUoZGl2LT50eF9vbl9hKSwgYWNjdW1fZGl2LT50eF9vbl9hLAotCQkJIGRlbHRhX2Rpdi0+dHhfb25fYSwgbWF4X2Rpdi0+dHhfb25fYSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIGZtdF90YWJsZSwgInR4X29uX2I6IiwKLQkJCSBsZTMyX3RvX2NwdShkaXYtPnR4X29uX2IpLCBhY2N1bV9kaXYtPnR4X29uX2IsCi0JCQkgZGVsdGFfZGl2LT50eF9vbl9iLCBtYXhfZGl2LT50eF9vbl9iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAiZXhlY190aW1lOiIsCi0JCQkgbGUzMl90b19jcHUoZGl2LT5leGVjX3RpbWUpLCBhY2N1bV9kaXYtPmV4ZWNfdGltZSwKLQkJCSBkZWx0YV9kaXYtPmV4ZWNfdGltZSwgbWF4X2Rpdi0+ZXhlY190aW1lKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkgZm10X3RhYmxlLCAicHJvYmVfdGltZToiLAotCQkJIGxlMzJfdG9fY3B1KGRpdi0+cHJvYmVfdGltZSksIGFjY3VtX2Rpdi0+cHJvYmVfdGltZSwKLQkJCSBkZWx0YV9kaXYtPnByb2JlX3RpbWUsIG1heF9kaXYtPnByb2JlX3RpbWUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJyeF9lbmFibGVfY291bnRlcjoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPnJ4X2VuYWJsZV9jb3VudGVyKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlciwKLQkJCSBkZWx0YV9nZW5lcmFsLT5yeF9lbmFibGVfY291bnRlciwKLQkJCSBtYXhfZ2VuZXJhbC0+cnhfZW5hYmxlX2NvdW50ZXIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSBmbXRfdGFibGUsICJudW1fb2Zfc29zX3N0YXRlczoiLAotCQkJIGxlMzJfdG9fY3B1KGdlbmVyYWwtPm51bV9vZl9zb3Nfc3RhdGVzKSwKLQkJCSBhY2N1bV9nZW5lcmFsLT5udW1fb2Zfc29zX3N0YXRlcywKLQkJCSBkZWx0YV9nZW5lcmFsLT5udW1fb2Zfc29zX3N0YXRlcywKLQkJCSBtYXhfZ2VuZXJhbC0+bnVtX29mX3Nvc19zdGF0ZXMpOwotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWRlYnVnZnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4ZTM1My4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1kZWJ1Z2ZzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotc3NpemVfdCBpd2w0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci1zc2l6ZV90IGl3bDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLXNzaXplX3QgaXdsNDk2NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLSNlbHNlCi1zdGF0aWMgc3NpemVfdAotaXdsNDk2NV91Y29kZV9yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJICAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXJldHVybiAwOwotfQotc3RhdGljIHNzaXplX3QKLWl3bDQ5NjVfdWNvZGVfdHhfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlyZXR1cm4gMDsKLX0KLXN0YXRpYyBzc2l6ZV90Ci1pd2w0OTY1X3Vjb2RlX2dlbmVyYWxfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWVlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtZWVwcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOWJhYWIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtZWVwcm9tLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLQotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEVFUFJPTSByZWxhdGVkIGZ1bmN0aW9ucwotICoKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRoZSBkZXZpY2UncyBFRVBST00gc2VtYXBob3JlIHByZXZlbnRzIGNvbmZsaWN0cyBiZXR3ZWVuIGRyaXZlciBhbmQgdUNvZGUKLSAqIHdoZW4gYWNjZXNzaW5nIHRoZSBFRVBST007IGVhY2ggYWNjZXNzIGlzIGEgc2VyaWVzIG9mIHB1bHNlcyB0by9mcm9tIHRoZQotICogRUVQUk9NIGNoaXAsIG5vdCBhIHNpbmdsZSBldmVudCwgc28gZXZlbiByZWFkcyBjb3VsZCBjb25mbGljdCBpZiB0aGV5Ci0gKiB3ZXJlbid0IGFyYml0cmF0ZWQgYnkgdGhlIHNlbWFwaG9yZS4KLSAqLwotaW50IGl3bDQ5NjVfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MTYgY291bnQ7Ci0JaW50IHJldDsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IEVFUFJPTV9TRU1fUkVUUllfTElNSVQ7IGNvdW50KyspIHsKLQkJLyogUmVxdWVzdCBzZW1hcGhvcmUgKi8KLQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJICAgIENTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSk7Ci0KLQkJLyogU2VlIGlmIHdlIGdvdCBpdCAqLwotCQlyZXQgPSBpd2xfcG9sbF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNLAotCQkJCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9FRVBST01fT1dOX1NFTSwKLQkJCQlFRVBST01fU0VNX1RJTUVPVVQpOwotCQlpZiAocmV0ID49IDApIHsKLQkJCUlXTF9ERUJVR19JTyhwcml2LAotCQkJCSJBY3F1aXJlZCBzZW1hcGhvcmUgYWZ0ZXIgJWQgdHJpZXMuXG4iLAotCQkJCWNvdW50KzEpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaXdsNDk2NV9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWl3bF9sZWdhY3lfY2xlYXJfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfRUVQUk9NX09XTl9TRU0pOwotCi19Ci0KLWludCBpd2w0OTY1X2VlcHJvbV9jaGVja192ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MTYgZWVwcm9tX3ZlcjsKLQl1MTYgY2FsaWJfdmVyOwotCi0JZWVwcm9tX3ZlciA9IGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1ZFUlNJT04pOwotCWNhbGliX3ZlciA9IGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYocHJpdiwKLQkJCUVFUFJPTV80OTY1X0NBTElCX1ZFUlNJT05fT0ZGU0VUKTsKLQotCWlmIChlZXByb21fdmVyIDwgcHJpdi0+Y2ZnLT5lZXByb21fdmVyIHx8Ci0JICAgIGNhbGliX3ZlciA8IHByaXYtPmNmZy0+ZWVwcm9tX2NhbGliX3ZlcikKLQkJZ290byBlcnI7Ci0KLQlJV0xfSU5GTyhwcml2LCAiZGV2aWNlIEVFUFJPTSBWRVI9MHgleCwgQ0FMSUI9MHgleFxuIiwKLQkJIGVlcHJvbV92ZXIsIGNhbGliX3Zlcik7Ci0KLQlyZXR1cm4gMDsKLWVycjoKLQlJV0xfRVJSKHByaXYsICJVbnN1cHBvcnRlZCAodG9vIG9sZCkgRUVQUk9NIFZFUj0weCV4IDwgMHgleCAiCi0JCSAgIkNBTElCPTB4JXggPCAweCV4XG4iLAotCQkgIGVlcHJvbV92ZXIsIHByaXYtPmNmZy0+ZWVwcm9tX3ZlciwKLQkJICBjYWxpYl92ZXIsICBwcml2LT5jZmctPmVlcHJvbV9jYWxpYl92ZXIpOwotCXJldHVybiAtRUlOVkFMOwotCi19Ci0KLXZvaWQgaXdsNDk2NV9lZXByb21fZ2V0X21hYyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4ICptYWMpCi17Ci0JY29uc3QgdTggKmFkZHIgPSBpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsCi0JCQkJCUVFUFJPTV9NQUNfQUREUkVTUyk7Ci0JbWVtY3B5KG1hYywgYWRkciwgRVRIX0FMRU4pOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtaHcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWh3LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNmZhMjguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtaHcuaAorKysgL2Rldi9udWxsCkBAIC0xLDgxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhpcyBmaWxlIGlzIHByb3ZpZGVkIHVuZGVyIGEgZHVhbCBCU0QvR1BMdjIgbGljZW5zZS4gIFdoZW4gdXNpbmcgb3IKLSAqIHJlZGlzdHJpYnV0aW5nIHRoaXMgZmlsZSwgeW91IG1heSBkbyBzbyB1bmRlciBlaXRoZXIgbGljZW5zZS4KLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICogQlNEIExJQ0VOU0UKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKiAgKiBOZWl0aGVyIHRoZSBuYW1lIEludGVsIENvcnBvcmF0aW9uIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBQbGVhc2UgdXNlIHRoaXMgZmlsZSAoaXdsLTQ5NjUtaHcuaCkgb25seSBmb3IgaGFyZHdhcmUtcmVsYXRlZCBkZWZpbml0aW9ucy4KLSAqIFVzZSBpd2wtY29tbWFuZHMuaCBmb3IgdUNvZGUgQVBJIGRlZmluaXRpb25zLgotICogVXNlIGl3bC1kZXYuaCBmb3IgZHJpdmVyIGltcGxlbWVudGF0aW9uIGRlZmluaXRpb25zLgotICovCi0KLSNpZm5kZWYgX19pd2xfNDk2NV9od19oX18KLSNkZWZpbmUgX19pd2xfNDk2NV9od19oX18KLQotI2luY2x1ZGUgIml3bC1maC5oIgotCi0vKiBFRVBST00gKi8KLSNkZWZpbmUgSVdMNDk2NV9FRVBST01fSU1HX1NJWkUJCQkxMDI0Ci0KLS8qCi0gKiB1Q29kZSBxdWV1ZSBtYW5hZ2VtZW50IGRlZmluaXRpb25zIC4uLgotICogVGhlIGZpcnN0IHF1ZXVlIHVzZWQgZm9yIGJsb2NrLWFjayBhZ2dyZWdhdGlvbiBpcyAjNyAoNDk2NSBvbmx5KS4KLSAqIEFsbCBibG9jay1hY2sgYWdncmVnYXRpb24gcXVldWVzIHNob3VsZCBtYXAgdG8gVHggRE1BL0ZJRk8gY2hhbm5lbCA3LgotICovCi0jZGVmaW5lIElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFCTcKLQotLyogU2l6ZXMgYW5kIGFkZHJlc3NlcyBmb3IgaW5zdHJ1Y3Rpb24gYW5kIGRhdGEgbWVtb3J5IChTUkFNKSBpbgotICogNDk2NSdzIGVtYmVkZGVkIHByb2Nlc3Nvci4gIERyaXZlciBhY2Nlc3MgaXMgdmlhIEhCVVNfVEFSR19NRU1fKiByZWdzLiAqLwotI2RlZmluZSBJV0w0OV9SVENfSU5TVF9MT1dFUl9CT1VORAkJKDB4MDAwMDAwKQotI2RlZmluZSBJV0w0OV9SVENfSU5TVF9VUFBFUl9CT1VORAkJKDB4MDE4MDAwKQotCi0jZGVmaW5lIElXTDQ5X1JUQ19EQVRBX0xPV0VSX0JPVU5ECQkoMHg4MDAwMDApCi0jZGVmaW5lIElXTDQ5X1JUQ19EQVRBX1VQUEVSX0JPVU5ECQkoMHg4MEEwMDApCi0KLSNkZWZpbmUgSVdMNDlfUlRDX0lOU1RfU0laRSAgKElXTDQ5X1JUQ19JTlNUX1VQUEVSX0JPVU5EIC0gXAotCQkJCUlXTDQ5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKQotI2RlZmluZSBJV0w0OV9SVENfREFUQV9TSVpFICAoSVdMNDlfUlRDX0RBVEFfVVBQRVJfQk9VTkQgLSBcCi0JCQkJSVdMNDlfUlRDX0RBVEFfTE9XRVJfQk9VTkQpCi0KLSNkZWZpbmUgSVdMNDlfTUFYX0lOU1RfU0laRSBJV0w0OV9SVENfSU5TVF9TSVpFCi0jZGVmaW5lIElXTDQ5X01BWF9EQVRBX1NJWkUgSVdMNDlfUlRDX0RBVEFfU0laRQotCi0vKiBTaXplIG9mIHVDb2RlIGluc3RydWN0aW9uIG1lbW9yeSBpbiBib290c3RyYXAgc3RhdGUgbWFjaGluZSAqLwotI2RlZmluZSBJV0w0OV9NQVhfQlNNX1NJWkUgQlNNX1NSQU1fU0laRQotCi1zdGF0aWMgaW5saW5lIGludCBpd2w0OTY1X2h3X3ZhbGlkX3J0Y19kYXRhX2FkZHIodTMyIGFkZHIpCi17Ci0JcmV0dXJuIChhZGRyID49IElXTDQ5X1JUQ19EQVRBX0xPV0VSX0JPVU5EKSAmJgotCSAgICAgICAoYWRkciA8IElXTDQ5X1JUQ19EQVRBX1VQUEVSX0JPVU5EKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBURU1QRVJBVFVSRSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIDQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24uCi0gKgotICogVGhlIGRyaXZlciBtdXN0IGNhbGN1bGF0ZSB0aGUgZGV2aWNlIHRlbXBlcmF0dXJlIGJlZm9yZSBjYWxjdWxhdGluZwotICogYSB0eHBvd2VyIHNldHRpbmcgKGFtcGxpZmllciBnYWluIGlzIHRlbXBlcmF0dXJlIGRlcGVuZGVudCkuICBUaGUKLSAqIGNhbGN1bGF0aW9uIHVzZXMgNCBtZWFzdXJlbWVudHMsIDMgb2Ygd2hpY2ggKFIxLCBSMiwgUjMpIGFyZSBjYWxpYnJhdGlvbgotICogdmFsdWVzIHVzZWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBkcml2ZXIsIGFuZCBvbmUgb2Ygd2hpY2ggKFI0KSBpcyB0aGUKLSAqIHJlYWwtdGltZSB0ZW1wZXJhdHVyZSBpbmRpY2F0b3IuCi0gKgotICogdUNvZGUgcHJvdmlkZXMgYWxsIDQgdmFsdWVzIHRvIHRoZSBkcml2ZXIgdmlhIHRoZSAiaW5pdGlhbGl6ZSBhbGl2ZSIKLSAqIG5vdGlmaWNhdGlvbiAoc2VlIHN0cnVjdCBpd2w0OTY1X2luaXRfYWxpdmVfcmVzcCkuICBBZnRlciB0aGUgcnVudGltZSB1Q29kZQotICogaW1hZ2UgbG9hZHMsIHVDb2RlIHVwZGF0ZXMgdGhlIFI0IHZhbHVlIHZpYSBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbnMKLSAqIChzZWUgU1RBVElTVElDU19OT1RJRklDQVRJT04pLCB3aGljaCBvY2N1ciBhZnRlciBlYWNoIHJlY2VpdmVkIGJlYWNvbgotICogd2hlbiBhc3NvY2lhdGVkLCBvciBjYW4gYmUgcmVxdWVzdGVkIHZpYSBSRVBMWV9TVEFUSVNUSUNTX0NNRC4KLSAqCi0gKiBOT1RFOiAgdUNvZGUgcHJvdmlkZXMgdGhlIFI0IHZhbHVlIGFzIGEgMjMtYml0IHNpZ25lZCB2YWx1ZS4gIERyaXZlcgotICogICAgICAgIG11c3Qgc2lnbi1leHRlbmQgdG8gMzIgYml0cyBiZWZvcmUgYXBwbHlpbmcgZm9ybXVsYSBiZWxvdy4KLSAqCi0gKiBGb3JtdWxhOgotICoKLSAqIGRlZ3JlZXMgS2VsdmluID0gKCg5NyAqIDI1OSAqIChSNCAtIFIyKSAvIChSMyAtIFIxKSkgLyAxMDApICsgOAotICoKLSAqIE5PVEU6ICBUaGUgYmFzaWMgZm9ybXVsYSBpcyAyNTkgKiAoUjQtUjIpIC8gKFIzLVIxKS4gIFRoZSA5Ny8xMDAgaXMKLSAqIGFuIGFkZGl0aW9uYWwgY29ycmVjdGlvbiwgd2hpY2ggc2hvdWxkIGJlIGNlbnRlcmVkIGFyb3VuZCAwIGRlZ3JlZXMKLSAqIENlbHNpdXMgKDI3MyBkZWdyZWVzIEtlbHZpbikuICBUaGUgOCAoMyBwZXJjZW50IG9mIDI3MykgY29tcGVuc2F0ZXMgZm9yCi0gKiBjZW50ZXJpbmcgdGhlIDk3LzEwMCBjb3JyZWN0aW9uIGFyb3VuZCAwIGRlZ3JlZXMgSy4KLSAqCi0gKiBBZGQgMjczIHRvIEtlbHZpbiB2YWx1ZSB0byBmaW5kIGRlZ3JlZXMgQ2Vsc2l1cywgZm9yIGNvbXBhcmluZyBjdXJyZW50Ci0gKiB0ZW1wZXJhdHVyZSB3aXRoIGZhY3RvcnktbWVhc3VyZWQgdGVtcGVyYXR1cmVzIHdoZW4gY2FsY3VsYXRpbmcgdHhwb3dlcgotICogc2V0dGluZ3MuCi0gKi8KLSNkZWZpbmUgVEVNUEVSQVRVUkVfQ0FMSUJfS0VMVklOX09GRlNFVCA4Ci0jZGVmaW5lIFRFTVBFUkFUVVJFX0NBTElCX0FfVkFMIDI1OQotCi0vKiBMaW1pdCByYW5nZSBvZiBjYWxjdWxhdGVkIHRlbXBlcmF0dXJlIHRvIGJlIGJldHdlZW4gdGhlc2UgS2VsdmluIHZhbHVlcyAqLwotI2RlZmluZSBJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUlOICAoMjYzKQotI2RlZmluZSBJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUFYICAoNDEwKQotCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9URU1QRVJBVFVSRV9PVVRfT0ZfUkFOR0UodCkgXAotCSgoKHQpIDwgSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01JTikgfHwgXAotCSAoKHQpID4gSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01BWCkpCi0KLS8qKioqKioqKioqKioqKioqKioqKiogRU5EIFRFTVBFUkFUVVJFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKiBTVEFSVCBUWFBPV0VSICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIDQ5NjUgdHhwb3dlciBjYWxjdWxhdGlvbnMgcmVseSBvbiBpbmZvcm1hdGlvbiBmcm9tIHRocmVlIHNvdXJjZXM6Ci0gKgotICogICAgIDEpIEVFUFJPTQotICogICAgIDIpICJpbml0aWFsaXplIiBhbGl2ZSBub3RpZmljYXRpb24KLSAqICAgICAzKSBzdGF0aXN0aWNzIG5vdGlmaWNhdGlvbnMKLSAqCi0gKiBFRVBST00gZGF0YSBjb25zaXN0cyBvZjoKLSAqCi0gKiAxKSAgUmVndWxhdG9yeSBpbmZvcm1hdGlvbiAobWF4IHR4cG93ZXIgYW5kIGNoYW5uZWwgdXNhZ2UgZmxhZ3MpIGlzIHByb3ZpZGVkCi0gKiAgICAgc2VwYXJhdGVseSBmb3IgZWFjaCBjaGFubmVsIHRoYXQgY2FuIHBvc3NpYmx5IHN1cHBvcnRlZCBieSA0OTY1LgotICogICAgIDQwIE1IeiB3aWRlICguMTFuIEhUNDApIGNoYW5uZWxzIGFyZSBsaXN0ZWQgc2VwYXJhdGVseSBmcm9tIDIwIE1IegotICogICAgIChsZWdhY3kpIGNoYW5uZWxzLgotICoKLSAqICAgICBTZWUgc3RydWN0IGl3bDQ5NjVfZWVwcm9tX2NoYW5uZWwgZm9yIGZvcm1hdCwgYW5kIHN0cnVjdCBpd2w0OTY1X2VlcHJvbQotICogICAgIGZvciBsb2NhdGlvbnMgaW4gRUVQUk9NLgotICoKLSAqIDIpICBGYWN0b3J5IHR4cG93ZXIgY2FsaWJyYXRpb24gaW5mb3JtYXRpb24gaXMgcHJvdmlkZWQgc2VwYXJhdGVseSBmb3IKLSAqICAgICBzdWItYmFuZHMgb2YgY29udGlndW91cyBjaGFubmVscy4gIDIuNEdIeiBoYXMganVzdCBvbmUgc3ViLWJhbmQsCi0gKiAgICAgYnV0IDUgR0h6IGhhcyBzZXZlcmFsIHN1Yi1iYW5kcy4KLSAqCi0gKiAgICAgSW4gYWRkaXRpb24sIHBlci1iYW5kICgyLjQgYW5kIDUgR2h6KSBzYXR1cmF0aW9uIHR4cG93ZXJzIGFyZSBwcm92aWRlZC4KLSAqCi0gKiAgICAgU2VlIHN0cnVjdCBpd2w0OTY1X2VlcHJvbV9jYWxpYl9pbmZvIChhbmQgdGhlIHRyZWUgb2Ygc3RydWN0dXJlcwotICogICAgIGNvbnRhaW5lZCB3aXRoaW4gaXQpIGZvciBmb3JtYXQsIGFuZCBzdHJ1Y3QgaXdsNDk2NV9lZXByb20gZm9yCi0gKiAgICAgbG9jYXRpb25zIGluIEVFUFJPTS4KLSAqCi0gKiAiSW5pdGlhbGl6YXRpb24gYWxpdmUiIG5vdGlmaWNhdGlvbiAoc2VlIHN0cnVjdCBpd2w0OTY1X2luaXRfYWxpdmVfcmVzcCkKLSAqIGNvbnNpc3RzIG9mOgotICoKLSAqIDEpICBUZW1wZXJhdHVyZSBjYWxjdWxhdGlvbiBwYXJhbWV0ZXJzLgotICoKLSAqIDIpICBQb3dlciBzdXBwbHkgdm9sdGFnZSBtZWFzdXJlbWVudC4KLSAqCi0gKiAzKSAgVHggZ2FpbiBjb21wZW5zYXRpb24gdG8gYmFsYW5jZSAyIHRyYW5zbWl0dGVycyBmb3IgTUlNTyB1c2UuCi0gKgotICogU3RhdGlzdGljcyBub3RpZmljYXRpb25zIGRlbGl2ZXI6Ci0gKgotICogMSkgIEN1cnJlbnQgdmFsdWVzIGZvciB0ZW1wZXJhdHVyZSBwYXJhbSBSNC4KLSAqLwotCi0vKioKLSAqIFRvIGNhbGN1bGF0ZSBhIHR4cG93ZXIgc2V0dGluZyBmb3IgYSBnaXZlbiBkZXNpcmVkIHRhcmdldCB0eHBvd2VyLCBjaGFubmVsLAotICogbW9kdWxhdGlvbiBiaXQgcmF0ZSwgYW5kIHRyYW5zbWl0dGVyIGNoYWluICg0OTY1IGhhcyAyIHRyYW5zbWl0dGVycyB0bwotICogc3VwcG9ydCBNSU1PIGFuZCB0cmFuc21pdCBkaXZlcnNpdHkpLCBkcml2ZXIgbXVzdCBkbyB0aGUgZm9sbG93aW5nOgotICoKLSAqIDEpICBDb21wYXJlIGRlc2lyZWQgdHhwb3dlciB2cy4gKEVFUFJPTSkgcmVndWxhdG9yeSBsaW1pdCBmb3IgdGhpcyBjaGFubmVsLgotICogICAgIERvIG5vdCBleGNlZWQgcmVndWxhdG9yeSBsaW1pdDsgcmVkdWNlIHRhcmdldCB0eHBvd2VyIGlmIG5lY2Vzc2FyeS4KLSAqCi0gKiAgICAgSWYgc2V0dGluZyB1cCB0eHBvd2VycyBmb3IgTUlNTyByYXRlcyAocmF0ZSBpbmRleGVzIDgtMTUsIDI0LTMxKSwKLSAqICAgICAyIHRyYW5zbWl0dGVycyB3aWxsIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHk7IGRyaXZlciBtdXN0IHJlZHVjZSB0aGUKLSAqICAgICByZWd1bGF0b3J5IGxpbWl0IGJ5IDMgZEIgKGhhbGYtcG93ZXIpIGZvciBlYWNoIHRyYW5zbWl0dGVyLCBzbyB0aGUKLSAqICAgICBjb21iaW5lZCB0b3RhbCBvdXRwdXQgb2YgdGhlIDIgdHJhbnNtaXR0ZXJzIGlzIHdpdGhpbiByZWd1bGF0b3J5IGxpbWl0cy4KLSAqCi0gKgotICogMikgIENvbXBhcmUgdGFyZ2V0IHR4cG93ZXIgdnMuIChFRVBST00pIHNhdHVyYXRpb24gdHhwb3dlciAqcmVkdWNlZCBieQotICogICAgIGJhY2tvZmYgZm9yIHRoaXMgYml0IHJhdGUqLiAgRG8gbm90IGV4Y2VlZCAoc2F0dXJhdGlvbiAtIGJhY2tvZmZbcmF0ZV0pOwotICogICAgIHJlZHVjZSB0YXJnZXQgdHhwb3dlciBpZiBuZWNlc3NhcnkuCi0gKgotICogICAgIEJhY2tvZmYgdmFsdWVzIGJlbG93IGFyZSBpbiAxLzIgZEIgdW5pdHMgKGVxdWl2YWxlbnQgdG8gc3RlcHMgaW4KLSAqICAgICB0eHBvd2VyIGdhaW4gdGFibGVzKToKLSAqCi0gKiAgICAgT0ZETSA2IC0gMzYgTUJpdDogIDEwIHN0ZXBzICg1IGRCKQotICogICAgIE9GRE0gNDggTUJpdDogICAgICAxNSBzdGVwcyAoNy41IGRCKQotICogICAgIE9GRE0gNTQgTUJpdDogICAgICAxNyBzdGVwcyAoOC41IGRCKQotICogICAgIE9GRE0gNjAgTUJpdDogICAgICAyMCBzdGVwcyAoMTAgZEIpCi0gKiAgICAgQ0NLIGFsbCByYXRlczogICAgIDEwIHN0ZXBzICg1IGRCKQotICoKLSAqICAgICBCYWNrb2ZmIHZhbHVlcyBhcHBseSB0byBzYXR1cmF0aW9uIHR4cG93ZXIgb24gYSBwZXItdHJhbnNtaXR0ZXIgYmFzaXM7Ci0gKiAgICAgd2hlbiB1c2luZyBNSU1PICgyIHRyYW5zbWl0dGVycyksIGVhY2ggdHJhbnNtaXR0ZXIgdXNlcyB0aGUgc2FtZQotICogICAgIHNhdHVyYXRpb24gbGV2ZWwgcHJvdmlkZWQgaW4gRUVQUk9NLCBhbmQgdGhlIHNhbWUgYmFja29mZiB2YWx1ZXM7Ci0gKiAgICAgbm8gcmVkdWN0aW9uIChzdWNoIGFzIHdpdGggcmVndWxhdG9yeSB0eHBvd2VyIGxpbWl0cykgaXMgcmVxdWlyZWQuCi0gKgotICogICAgIFNhdHVyYXRpb24gYW5kIEJhY2tvZmYgdmFsdWVzIGFwcGx5IGVxdWFsbHkgdG8gMjAgTWh6IChsZWdhY3kpIGNoYW5uZWwKLSAqICAgICB3aWR0aHMgYW5kIDQwIE1oeiAoLjExbiBIVDQwKSBjaGFubmVsIHdpZHRoczsgdGhlcmUgaXMgbm8gc2VwYXJhdGUKLSAqICAgICBmYWN0b3J5IG1lYXN1cmVtZW50IGZvciBodDQwIGNoYW5uZWxzLgotICoKLSAqICAgICBUaGUgcmVzdWx0IG9mIHRoaXMgc3RlcCBpcyB0aGUgZmluYWwgdGFyZ2V0IHR4cG93ZXIuICBUaGUgcmVzdCBvZgotICogICAgIHRoZSBzdGVwcyBmaWd1cmUgb3V0IHRoZSBwcm9wZXIgc2V0dGluZ3MgZm9yIHRoZSBkZXZpY2UgdG8gYWNoaWV2ZQotICogICAgIHRoYXQgdGFyZ2V0IHR4cG93ZXIuCi0gKgotICoKLSAqIDMpICBEZXRlcm1pbmUgKEVFUFJPTSkgY2FsaWJyYXRpb24gc3ViIGJhbmQgZm9yIHRoZSB0YXJnZXQgY2hhbm5lbCwgYnkKLSAqICAgICBjb21wYXJpbmcgYWdhaW5zdCBmaXJzdCBhbmQgbGFzdCBjaGFubmVscyBpbiBlYWNoIHN1YiBiYW5kCi0gKiAgICAgKHNlZSBzdHJ1Y3QgaXdsNDk2NV9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvKS4KLSAqCi0gKgotICogNCkgIExpbmVhcmx5IGludGVycG9sYXRlIChFRVBST00pIGZhY3RvcnkgY2FsaWJyYXRpb24gbWVhc3VyZW1lbnQgc2V0cywKLSAqICAgICByZWZlcmVuY2luZyB0aGUgMiBmYWN0b3J5LW1lYXN1cmVkIChzYW1wbGUpIGNoYW5uZWxzIHdpdGhpbiB0aGUgc3ViIGJhbmQuCi0gKgotICogICAgIEludGVycG9sYXRpb24gaXMgYmFzZWQgb24gZGlmZmVyZW5jZSBiZXR3ZWVuIHRhcmdldCBjaGFubmVsJ3MgZnJlcXVlbmN5Ci0gKiAgICAgYW5kIHRoZSBzYW1wbGUgY2hhbm5lbHMnIGZyZXF1ZW5jaWVzLiAgU2luY2UgY2hhbm5lbCBudW1iZXJzIGFyZSBiYXNlZAotICogICAgIG9uIGZyZXF1ZW5jeSAoNSBNSHogYmV0d2VlbiBlYWNoIGNoYW5uZWwgbnVtYmVyKSwgdGhpcyBpcyBlcXVpdmFsZW50Ci0gKiAgICAgdG8gaW50ZXJwb2xhdGluZyBiYXNlZCBvbiBjaGFubmVsIG51bWJlciBkaWZmZXJlbmNlcy4KLSAqCi0gKiAgICAgTm90ZSB0aGF0IHRoZSBzYW1wbGUgY2hhbm5lbHMgbWF5IG9yIG1heSBub3QgYmUgdGhlIGNoYW5uZWxzIGF0IHRoZQotICogICAgIGVkZ2VzIG9mIHRoZSBzdWIgYmFuZC4gIFRoZSB0YXJnZXQgY2hhbm5lbCBtYXkgYmUgIm91dHNpZGUiIG9mIHRoZQotICogICAgIHNwYW4gb2YgdGhlIHNhbXBsZWQgY2hhbm5lbHMuCi0gKgotICogICAgIERyaXZlciBtYXkgY2hvb3NlIHRoZSBwYWlyIChmb3IgMiBUeCBjaGFpbnMpIG9mIG1lYXN1cmVtZW50cyAoc2VlCi0gKiAgICAgc3RydWN0IGl3bDQ5NjVfZWVwcm9tX2NhbGliX2NoX2luZm8pIGZvciB3aGljaCB0aGUgYWN0dWFsIG1lYXN1cmVkCi0gKiAgICAgdHhwb3dlciBjb21lcyBjbG9zZXN0IHRvIHRoZSBkZXNpcmVkIHR4cG93ZXIuICBVc3VhbGx5LCB0aG91Z2gsCi0gKiAgICAgdGhlIG1pZGRsZSBzZXQgb2YgbWVhc3VyZW1lbnRzIGlzIGNsb3Nlc3QgdG8gdGhlIHJlZ3VsYXRvcnkgbGltaXRzLAotICogICAgIGFuZCBpcyB0aGVyZWZvcmUgYSBnb29kIGNob2ljZSBmb3IgYWxsIHR4cG93ZXIgY2FsY3VsYXRpb25zICh0aGlzCi0gKiAgICAgYXNzdW1lcyB0aGF0IGhpZ2ggYWNjdXJhY3kgaXMgbmVlZGVkIGZvciBtYXhpbWl6aW5nIGxlZ2FsIHR4cG93ZXIsCi0gKiAgICAgd2hpbGUgbG93ZXIgdHhwb3dlciBjb25maWd1cmF0aW9ucyBkbyBub3QgbmVlZCBhcyBtdWNoIGFjY3VyYWN5KS4KLSAqCi0gKiAgICAgRHJpdmVyIHNob3VsZCBpbnRlcnBvbGF0ZSBib3RoIG1lbWJlcnMgb2YgdGhlIGNob3NlbiBtZWFzdXJlbWVudCBwYWlyLAotICogICAgIGkuZS4gZm9yIGJvdGggVHggY2hhaW5zIChyYWRpbyB0cmFuc21pdHRlcnMpLCB1bmxlc3MgdGhlIGRyaXZlciBrbm93cwotICogICAgIHRoYXQgb25seSBvbmUgb2YgdGhlIGNoYWlucyB3aWxsIGJlIHVzZWQgKGUuZy4gb25seSBvbmUgdHggYW50ZW5uYQotICogICAgIGNvbm5lY3RlZCwgYnV0IHRoaXMgc2hvdWxkIGJlIHVudXN1YWwpLiAgVGhlIHJhdGUgc2NhbGluZyBhbGdvcml0aG0KLSAqICAgICBzd2l0Y2hlcyBhbnRlbm5hcyB0byBmaW5kIGJlc3QgcGVyZm9ybWFuY2UsIHNvIGJvdGggVHggY2hhaW5zIHdpbGwKLSAqICAgICBiZSB1c2VkIChhbHRob3VnaCBvbmx5IG9uZSBhdCBhIHRpbWUpIGV2ZW4gZm9yIG5vbi1NSU1PIHRyYW5zbWlzc2lvbnMuCi0gKgotICogICAgIERyaXZlciBzaG91bGQgaW50ZXJwb2xhdGUgZmFjdG9yeSB2YWx1ZXMgZm9yIHRlbXBlcmF0dXJlLCBnYWluIHRhYmxlCi0gKiAgICAgaW5kZXgsIGFuZCBhY3R1YWwgcG93ZXIuICBUaGUgcG93ZXIgYW1wbGlmaWVyIGRldGVjdG9yIHZhbHVlcyBhcmUKLSAqICAgICBub3QgdXNlZCBieSB0aGUgZHJpdmVyLgotICoKLSAqICAgICBTYW5pdHkgY2hlY2s6ICBJZiB0aGUgdGFyZ2V0IGNoYW5uZWwgaGFwcGVucyB0byBiZSBvbmUgb2YgdGhlIHNhbXBsZQotICogICAgIGNoYW5uZWxzLCB0aGUgcmVzdWx0cyBzaG91bGQgYWdyZWUgd2l0aCB0aGUgc2FtcGxlIGNoYW5uZWwncwotICogICAgIG1lYXN1cmVtZW50cyEKLSAqCi0gKgotICogNSkgIEZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGRlc2lyZWQgdHhwb3dlciBhbmQgKGludGVycG9sYXRlZCkKLSAqICAgICBmYWN0b3J5LW1lYXN1cmVkIHR4cG93ZXIuICBVc2luZyAoaW50ZXJwb2xhdGVkKSBmYWN0b3J5IGdhaW4gdGFibGUgaW5kZXgKLSAqICAgICAoc2hvd24gZWxzZXdoZXJlKSBhcyBhIHN0YXJ0aW5nIHBvaW50LCBhZGp1c3QgdGhpcyBpbmRleCBsb3dlciB0bwotICogICAgIGluY3JlYXNlIHR4cG93ZXIsIG9yIGhpZ2hlciB0byBkZWNyZWFzZSB0eHBvd2VyLCB1bnRpbCB0aGUgdGFyZ2V0Ci0gKiAgICAgdHhwb3dlciBpcyByZWFjaGVkLiAgRWFjaCBzdGVwIGluIHRoZSBnYWluIHRhYmxlIGlzIDEvMiBkQi4KLSAqCi0gKiAgICAgRm9yIGV4YW1wbGUsIGlmIGZhY3RvcnkgbWVhc3VyZWQgdHhwb3dlciBpcyAxNiBkQm0sIGFuZCB0YXJnZXQgdHhwb3dlcgotICogICAgIGlzIDEzIGRCbSwgYWRkIDYgc3RlcHMgdG8gdGhlIGZhY3RvcnkgZ2FpbiBpbmRleCB0byByZWR1Y2UgdHhwb3dlcgotICogICAgIGJ5IDMgZEIuCi0gKgotICoKLSAqIDYpICBGaW5kIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IGRldmljZSB0ZW1wZXJhdHVyZSBhbmQgKGludGVycG9sYXRlZCkKLSAqICAgICBmYWN0b3J5LW1lYXN1cmVkIHRlbXBlcmF0dXJlIGZvciBzdWItYmFuZC4gIEZhY3RvcnkgdmFsdWVzIGFyZSBpbgotICogICAgIGRlZ3JlZXMgQ2Vsc2l1cy4gIFRvIGNhbGN1bGF0ZSBjdXJyZW50IHRlbXBlcmF0dXJlLCBzZWUgY29tbWVudHMgZm9yCi0gKiAgICAgIjQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24iLgotICoKLSAqICAgICBJZiBjdXJyZW50IHRlbXBlcmF0dXJlIGlzIGhpZ2hlciB0aGFuIGZhY3RvcnkgdGVtcGVyYXR1cmUsIGRyaXZlciBtdXN0Ci0gKiAgICAgaW5jcmVhc2UgZ2FpbiAobG93ZXIgZ2FpbiB0YWJsZSBpbmRleCksIGFuZCB2aWNlIHZlcnNlLgotICoKLSAqICAgICBUZW1wZXJhdHVyZSBhZmZlY3RzIGdhaW4gZGlmZmVyZW50bHkgZm9yIGRpZmZlcmVudCBjaGFubmVsczoKLSAqCi0gKiAgICAgMi40IEdIeiBhbGwgY2hhbm5lbHM6ICAzLjUgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCi0gKiAgICAgNSBHSHogY2hhbm5lbHMgMzQtNDM6ICA0LjUgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCi0gKiAgICAgNSBHSHogY2hhbm5lbHMgPj0gNDQ6ICA0LjAgZGVncmVlcyBwZXIgaGFsZi1kQiBzdGVwCi0gKgotICogICAgIE5PVEU6ICBUZW1wZXJhdHVyZSBjYW4gaW5jcmVhc2UgcmFwaWRseSB3aGVuIHRyYW5zbWl0dGluZywgZXNwZWNpYWxseQotICogICAgICAgICAgICB3aXRoIGhlYXZ5IHRyYWZmaWMgYXQgaGlnaCB0eHBvd2Vycy4gIERyaXZlciBzaG91bGQgdXBkYXRlCi0gKiAgICAgICAgICAgIHRlbXBlcmF0dXJlIGNhbGN1bGF0aW9ucyBvZnRlbiB1bmRlciB0aGVzZSBjb25kaXRpb25zIHRvCi0gKiAgICAgICAgICAgIG1haW50YWluIHN0cm9uZyB0eHBvd2VyIGluIHRoZSBmYWNlIG9mIHJpc2luZyB0ZW1wZXJhdHVyZS4KLSAqCi0gKgotICogNykgIEZpbmQgZGlmZmVyZW5jZSBiZXR3ZWVuIGN1cnJlbnQgcG93ZXIgc3VwcGx5IHZvbHRhZ2UgaW5kaWNhdG9yCi0gKiAgICAgKGZyb20gImluaXRpYWxpemUgYWxpdmUiKSBhbmQgZmFjdG9yeS1tZWFzdXJlZCBwb3dlciBzdXBwbHkgdm9sdGFnZQotICogICAgIGluZGljYXRvciAoRUVQUk9NKS4KLSAqCi0gKiAgICAgSWYgdGhlIGN1cnJlbnQgdm9sdGFnZSBpcyBoaWdoZXIgKGluZGljYXRvciBpcyBsb3dlcikgdGhhbiBmYWN0b3J5Ci0gKiAgICAgdm9sdGFnZSwgZ2FpbiBzaG91bGQgYmUgcmVkdWNlZCAoZ2FpbiB0YWJsZSBpbmRleCBpbmNyZWFzZWQpIGJ5OgotICoKLSAqICAgICAoZWVwcm9tIC0gY3VycmVudCkgLyA3Ci0gKgotICogICAgIElmIHRoZSBjdXJyZW50IHZvbHRhZ2UgaXMgbG93ZXIgKGluZGljYXRvciBpcyBoaWdoZXIpIHRoYW4gZmFjdG9yeQotICogICAgIHZvbHRhZ2UsIGdhaW4gc2hvdWxkIGJlIGluY3JlYXNlZCAoZ2FpbiB0YWJsZSBpbmRleCBkZWNyZWFzZWQpIGJ5OgotICoKLSAqICAgICAyICogKGN1cnJlbnQgLSBlZXByb20pIC8gNwotICoKLSAqICAgICBJZiBudW1iZXIgb2YgaW5kZXggc3RlcHMgaW4gZWl0aGVyIGRpcmVjdGlvbiB0dXJucyBvdXQgdG8gYmUgPiAyLAotICogICAgIHNvbWV0aGluZyBpcyB3cm9uZyAuLi4ganVzdCB1c2UgMC4KLSAqCi0gKiAgICAgTk9URTogIFZvbHRhZ2UgY29tcGVuc2F0aW9uIGlzIGluZGVwZW5kZW50IG9mIGJhbmQvY2hhbm5lbC4KLSAqCi0gKiAgICAgTk9URTogICJJbml0aWFsaXplIiB1Q29kZSBtZWFzdXJlcyBjdXJyZW50IHZvbHRhZ2UsIHdoaWNoIGlzIGFzc3VtZWQKLSAqICAgICAgICAgICAgdG8gYmUgY29uc3RhbnQgYWZ0ZXIgdGhpcyBpbml0aWFsIG1lYXN1cmVtZW50LiAgVm9sdGFnZQotICogICAgICAgICAgICBjb21wZW5zYXRpb24gZm9yIHR4cG93ZXIgKG51bWJlciBvZiBzdGVwcyBpbiBnYWluIHRhYmxlKQotICogICAgICAgICAgICBtYXkgYmUgY2FsY3VsYXRlZCBvbmNlIGFuZCB1c2VkIHVudGlsIHRoZSBuZXh0IHVDb2RlIGJvb3Rsb2FkLgotICoKLSAqCi0gKiA4KSAgSWYgc2V0dGluZyB1cCB0eHBvd2VycyBmb3IgTUlNTyByYXRlcyAocmF0ZSBpbmRleGVzIDgtMTUsIDI0LTMxKSwKLSAqICAgICBhZGp1c3QgdHhwb3dlciBmb3IgZWFjaCB0cmFuc21pdHRlciBjaGFpbiwgc28gdHhwb3dlciBpcyBiYWxhbmNlZAotICogICAgIGJldHdlZW4gdGhlIHR3byBjaGFpbnMuICBUaGVyZSBhcmUgNSBwYWlycyBvZiB0eF9hdHRlbltncm91cF1bY2hhaW5dCi0gKiAgICAgdmFsdWVzIGluICJpbml0aWFsaXplIGFsaXZlIiwgb25lIHBhaXIgZm9yIGVhY2ggb2YgNSBjaGFubmVsIHJhbmdlczoKLSAqCi0gKiAgICAgR3JvdXAgMDogIDUgR0h6IGNoYW5uZWwgMzQtNDMKLSAqICAgICBHcm91cCAxOiAgNSBHSHogY2hhbm5lbCA0NC03MAotICogICAgIEdyb3VwIDI6ICA1IEdIeiBjaGFubmVsIDcxLTEyNAotICogICAgIEdyb3VwIDM6ICA1IEdIeiBjaGFubmVsIDEyNS0yMDAKLSAqICAgICBHcm91cCA0OiAgMi40IEdIeiBhbGwgY2hhbm5lbHMKLSAqCi0gKiAgICAgQWRkIHRoZSB0eF9hdHRlbltncm91cF1bY2hhaW5dIHZhbHVlIHRvIHRoZSBpbmRleCBmb3IgdGhlIHRhcmdldCBjaGFpbi4KLSAqICAgICBUaGUgdmFsdWVzIGFyZSBzaWduZWQsIGJ1dCBhcmUgaW4gcGFpcnMgb2YgMCBhbmQgYSBub24tbmVnYXRpdmUgbnVtYmVyLAotICogICAgIHNvIGFzIHRvIHJlZHVjZSBnYWluIChpZiBuZWNlc3NhcnkpIG9mIHRoZSAiaG90dGVyIiBjaGFubmVsLiAgVGhpcwotICogICAgIGF2b2lkcyBhbnkgbmVlZCB0byBkb3VibGUtY2hlY2sgZm9yIHJlZ3VsYXRvcnkgY29tcGxpYW5jZSBhZnRlcgotICogICAgIHRoaXMgc3RlcC4KLSAqCi0gKgotICogOSkgIElmIHNldHRpbmcgdXAgZm9yIGEgQ0NLIHJhdGUsIGxvd2VyIHRoZSBnYWluIGJ5IGFkZGluZyBhIENDSyBjb21wZW5zYXRpb24KLSAqICAgICB2YWx1ZSB0byB0aGUgaW5kZXg6Ci0gKgotICogICAgIEhhcmR3YXJlIHJldiBCOiAgOSBzdGVwcyAoNC41IGRCKQotICogICAgIEhhcmR3YXJlIHJldiBDOiAgNSBzdGVwcyAoMi41IGRCKQotICoKLSAqICAgICBIYXJkd2FyZSByZXYgZm9yIDQ5NjUgY2FuIGJlIGRldGVybWluZWQgYnkgcmVhZGluZyBDU1JfSFdfUkVWX1dBX1JFRywKLSAqICAgICBiaXRzIFszOjJdLCAxID0gQiwgMiA9IEMuCi0gKgotICogICAgIE5PVEU6ICBUaGlzIGNvbXBlbnNhdGlvbiBpcyBpbiBhZGRpdGlvbiB0byBhbnkgc2F0dXJhdGlvbiBiYWNrb2ZmIHRoYXQKLSAqICAgICAgICAgICAgbWlnaHQgaGF2ZSBiZWVuIGFwcGxpZWQgaW4gYW4gZWFybGllciBzdGVwLgotICoKLSAqCi0gKiAxMCkgU2VsZWN0IHRoZSBnYWluIHRhYmxlLCBiYXNlZCBvbiBiYW5kICgyLjQgdnMgNSBHSHopLgotICoKLSAqICAgICBMaW1pdCB0aGUgYWRqdXN0ZWQgaW5kZXggdG8gc3RheSB3aXRoaW4gdGhlIHRhYmxlIQotICoKLSAqCi0gKiAxMSkgUmVhZCBnYWluIHRhYmxlIGVudHJpZXMgZm9yIERTUCBhbmQgcmFkaW8gZ2FpbiwgcGxhY2UgaW50byBhcHByb3ByaWF0ZQotICogICAgIGxvY2F0aW9uKHMpIGluIGNvbW1hbmQgKHN0cnVjdCBpd2w0OTY1X3R4cG93ZXJ0YWJsZV9jbWQpLgotICovCi0KLS8qKgotICogV2hlbiBNSU1PIGlzIHVzZWQgKDIgdHJhbnNtaXR0ZXJzIG9wZXJhdGluZyBzaW11bHRhbmVvdXNseSksIGRyaXZlciBzaG91bGQKLSAqIGxpbWl0IGVhY2ggdHJhbnNtaXR0ZXIgdG8gZGVsaXZlciBhIG1heCBvZiAzIGRCIGJlbG93IHRoZSByZWd1bGF0b3J5IGxpbWl0Ci0gKiBmb3IgdGhlIGRldmljZS4gIFRoYXQgaXMsIHVzZSBoYWxmIHBvd2VyIGZvciBlYWNoIHRyYW5zbWl0dGVyLCBzbyB0b3RhbAotICogdHhwb3dlciBpcyB3aXRoaW4gcmVndWxhdG9yeSBsaW1pdHMuCi0gKgotICogVGhlIHZhbHVlICI2IiByZXByZXNlbnRzIG51bWJlciBvZiBzdGVwcyBpbiBnYWluIHRhYmxlIHRvIHJlZHVjZSBwb3dlciAzIGRCLgotICogRWFjaCBzdGVwIGlzIDEvMiBkQi4KLSAqLwotI2RlZmluZSBJV0xfVFhfUE9XRVJfTUlNT19SRUdVTEFUT1JZX0NPTVBFTlNBVElPTiAoNikKLQotLyoqCi0gKiBDQ0sgZ2FpbiBjb21wZW5zYXRpb24uCi0gKgotICogV2hlbiBjYWxjdWxhdGluZyB0eHBvd2VycyBmb3IgQ0NLLCBhZnRlciBtYWtpbmcgc3VyZSB0aGF0IHRoZSB0YXJnZXQgcG93ZXIKLSAqIGlzIHdpdGhpbiByZWd1bGF0b3J5IGFuZCBzYXR1cmF0aW9uIGxpbWl0cywgZHJpdmVyIG11c3QgYWRkaXRpb25hbGx5Ci0gKiBiYWNrIG9mZiBnYWluIGJ5IGFkZGluZyB0aGVzZSB2YWx1ZXMgdG8gdGhlIGdhaW4gdGFibGUgaW5kZXguCi0gKgotICogSGFyZHdhcmUgcmV2IGZvciA0OTY1IGNhbiBiZSBkZXRlcm1pbmVkIGJ5IHJlYWRpbmcgQ1NSX0hXX1JFVl9XQV9SRUcsCi0gKiBiaXRzIFszOjJdLCAxID0gQiwgMiA9IEMuCi0gKi8KLSNkZWZpbmUgSVdMX1RYX1BPV0VSX0NDS19DT01QRU5TQVRJT05fQl9TVEVQICg5KQotI2RlZmluZSBJV0xfVFhfUE9XRVJfQ0NLX0NPTVBFTlNBVElPTl9DX1NURVAgKDUpCi0KLS8qCi0gKiA0OTY1IHBvd2VyIHN1cHBseSB2b2x0YWdlIGNvbXBlbnNhdGlvbiBmb3IgdHhwb3dlcgotICovCi0jZGVmaW5lIFRYX1BPV0VSX0lXTF9WT0xUQUdFX0NPREVTX1BFUl8wM1YgICAoNykKLQotLyoqCi0gKiBHYWluIHRhYmxlcy4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIHRhYmxlcyBjb250YWluIHBhaXIgb2YgdmFsdWVzIGZvciBzZXR0aW5nIHR4cG93ZXIsIGkuZS4KLSAqIGdhaW4gc2V0dGluZ3MgZm9yIHRoZSBvdXRwdXQgb2YgdGhlIGRldmljZSdzIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciAoRFNQKSwKLSAqIGFuZCBmb3IgdGhlIGFuYWxvZyBnYWluIHN0cnVjdHVyZSBvZiB0aGUgdHJhbnNtaXR0ZXIuCi0gKgotICogRWFjaCBlbnRyeSBpbiB0aGUgZ2FpbiB0YWJsZXMgcmVwcmVzZW50cyBhIHN0ZXAgb2YgMS8yIGRCLiAgTm90ZSB0aGF0IHRoZXNlCi0gKiBhcmUgKnJlbGF0aXZlKiBzdGVwcywgbm90IGluZGljYXRpb25zIG9mIGFic29sdXRlIG91dHB1dCBwb3dlci4gIE91dHB1dAotICogcG93ZXIgdmFyaWVzIHdpdGggdGVtcGVyYXR1cmUsIHZvbHRhZ2UsIGFuZCBjaGFubmVsIGZyZXF1ZW5jeSwgYW5kIGFsc28KLSAqIHJlcXVpcmVzIGNvbnNpZGVyYXRpb24gb2YgYXZlcmFnZSBwb3dlciAodG8gc2F0aXNmeSByZWd1bGF0b3J5IGNvbnN0cmFpbnRzKSwKLSAqIGFuZCBwZWFrIHBvd2VyICh0byBhdm9pZCBkaXN0b3J0aW9uIG9mIHRoZSBvdXRwdXQgc2lnbmFsKS4KLSAqCi0gKiBFYWNoIGVudHJ5IGNvbnRhaW5zIHR3byB2YWx1ZXM6Ci0gKiAxKSAgRFNQIGdhaW4gKG9yIHNvbWV0aW1lcyBjYWxsZWQgRFNQIGF0dGVudWF0aW9uKS4gIFRoaXMgaXMgYSBmaW5lLWdyYWluZWQKLSAqICAgICBsaW5lYXIgdmFsdWUgdGhhdCBtdWx0aXBsaWVzIHRoZSBvdXRwdXQgb2YgdGhlIGRpZ2l0YWwgc2lnbmFsIHByb2Nlc3NvciwKLSAqICAgICBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgYW5hbG9nIHJhZGlvLgotICogMikgIFJhZGlvIGdhaW4uICBUaGlzIHNldHMgdGhlIGFuYWxvZyBnYWluIG9mIHRoZSByYWRpbyBUeCBwYXRoLgotICogICAgIEl0IGlzIGEgY29hcnNlciBzZXR0aW5nLCBhbmQgYmVoYXZlcyBpbiBhIGxvZ2FyaXRobWljIChkQikgZmFzaGlvbi4KLSAqCi0gKiBFRVBST00gY29udGFpbnMgZmFjdG9yeSBjYWxpYnJhdGlvbiBkYXRhIGZvciB0eHBvd2VyLiAgVGhpcyBtYXBzIGFjdHVhbAotICogbWVhc3VyZWQgdHhwb3dlciBsZXZlbHMgdG8gZ2FpbiBzZXR0aW5ncyBpbiB0aGUgIndlbGwga25vd24iIHRhYmxlcwotICogYmVsb3cgKCJ3ZWxsLWtub3duIiBtZWFucyBoZXJlIHRoYXQgYm90aCBmYWN0b3J5IGNhbGlicmF0aW9uICphbmQqIHRoZQotICogZHJpdmVyIHdvcmsgd2l0aCB0aGUgc2FtZSB0YWJsZSkuCi0gKgotICogVGhlcmUgYXJlIHNlcGFyYXRlIHRhYmxlcyBmb3IgMi40IEdIeiBhbmQgNSBHSHogYmFuZHMuICBUaGUgNSBHSHogdGFibGUKLSAqIGhhcyBhbiBleHRlbnNpb24gKGludG8gbmVnYXRpdmUgaW5kZXhlcyksIGluIGNhc2UgdGhlIGRyaXZlciBuZWVkcyB0bwotICogYm9vc3QgcG93ZXIgc2V0dGluZyBmb3IgaGlnaCBkZXZpY2UgdGVtcGVyYXR1cmVzIChoaWdoZXIgdGhhbiB3b3VsZCBiZQotICogcHJlc2VudCBkdXJpbmcgZmFjdG9yeSBjYWxpYnJhdGlvbikuICBBIDUgR2h6IEVFUFJPTSBpbmRleCBvZiAiNDAiCi0gKiBjb3JyZXNwb25kcyB0byB0aGUgNDl0aCBlbnRyeSBpbiB0aGUgdGFibGUgdXNlZCBieSB0aGUgZHJpdmVyLgotICovCi0jZGVmaW5lIE1JTl9UWF9HQUlOX0lOREVYCQkoMCkgIC8qIGhpZ2hlc3QgZ2FpbiwgbG93ZXN0IGlkeCwgMi40ICovCi0jZGVmaW5lIE1JTl9UWF9HQUlOX0lOREVYXzUyR0haX0VYVAkoLTkpIC8qIGhpZ2hlc3QgZ2FpbiwgbG93ZXN0IGlkeCwgNSAqLwotCi0vKioKLSAqIDIuNCBHSHogZ2FpbiB0YWJsZQotICoKLSAqIEluZGV4ICAgIERzcCBnYWluICAgUmFkaW8gZ2FpbgotICogICAwICAgICAgICAxMTAgICAgICAgICAweDNmICAgICAgKGhpZ2hlc3QgZ2FpbikKLSAqICAgMSAgICAgICAgMTA0ICAgICAgICAgMHgzZgotICogICAyICAgICAgICAgOTggICAgICAgICAweDNmCi0gKiAgIDMgICAgICAgIDExMCAgICAgICAgIDB4M2UKLSAqICAgNCAgICAgICAgMTA0ICAgICAgICAgMHgzZQotICogICA1ICAgICAgICAgOTggICAgICAgICAweDNlCi0gKiAgIDYgICAgICAgIDExMCAgICAgICAgIDB4M2QKLSAqICAgNyAgICAgICAgMTA0ICAgICAgICAgMHgzZAotICogICA4ICAgICAgICAgOTggICAgICAgICAweDNkCi0gKiAgIDkgICAgICAgIDExMCAgICAgICAgIDB4M2MKLSAqICAxMCAgICAgICAgMTA0ICAgICAgICAgMHgzYwotICogIDExICAgICAgICAgOTggICAgICAgICAweDNjCi0gKiAgMTIgICAgICAgIDExMCAgICAgICAgIDB4M2IKLSAqICAxMyAgICAgICAgMTA0ICAgICAgICAgMHgzYgotICogIDE0ICAgICAgICAgOTggICAgICAgICAweDNiCi0gKiAgMTUgICAgICAgIDExMCAgICAgICAgIDB4M2EKLSAqICAxNiAgICAgICAgMTA0ICAgICAgICAgMHgzYQotICogIDE3ICAgICAgICAgOTggICAgICAgICAweDNhCi0gKiAgMTggICAgICAgIDExMCAgICAgICAgIDB4MzkKLSAqICAxOSAgICAgICAgMTA0ICAgICAgICAgMHgzOQotICogIDIwICAgICAgICAgOTggICAgICAgICAweDM5Ci0gKiAgMjEgICAgICAgIDExMCAgICAgICAgIDB4MzgKLSAqICAyMiAgICAgICAgMTA0ICAgICAgICAgMHgzOAotICogIDIzICAgICAgICAgOTggICAgICAgICAweDM4Ci0gKiAgMjQgICAgICAgIDExMCAgICAgICAgIDB4MzcKLSAqICAyNSAgICAgICAgMTA0ICAgICAgICAgMHgzNwotICogIDI2ICAgICAgICAgOTggICAgICAgICAweDM3Ci0gKiAgMjcgICAgICAgIDExMCAgICAgICAgIDB4MzYKLSAqICAyOCAgICAgICAgMTA0ICAgICAgICAgMHgzNgotICogIDI5ICAgICAgICAgOTggICAgICAgICAweDM2Ci0gKiAgMzAgICAgICAgIDExMCAgICAgICAgIDB4MzUKLSAqICAzMSAgICAgICAgMTA0ICAgICAgICAgMHgzNQotICogIDMyICAgICAgICAgOTggICAgICAgICAweDM1Ci0gKiAgMzMgICAgICAgIDExMCAgICAgICAgIDB4MzQKLSAqICAzNCAgICAgICAgMTA0ICAgICAgICAgMHgzNAotICogIDM1ICAgICAgICAgOTggICAgICAgICAweDM0Ci0gKiAgMzYgICAgICAgIDExMCAgICAgICAgIDB4MzMKLSAqICAzNyAgICAgICAgMTA0ICAgICAgICAgMHgzMwotICogIDM4ICAgICAgICAgOTggICAgICAgICAweDMzCi0gKiAgMzkgICAgICAgIDExMCAgICAgICAgIDB4MzIKLSAqICA0MCAgICAgICAgMTA0ICAgICAgICAgMHgzMgotICogIDQxICAgICAgICAgOTggICAgICAgICAweDMyCi0gKiAgNDIgICAgICAgIDExMCAgICAgICAgIDB4MzEKLSAqICA0MyAgICAgICAgMTA0ICAgICAgICAgMHgzMQotICogIDQ0ICAgICAgICAgOTggICAgICAgICAweDMxCi0gKiAgNDUgICAgICAgIDExMCAgICAgICAgIDB4MzAKLSAqICA0NiAgICAgICAgMTA0ICAgICAgICAgMHgzMAotICogIDQ3ICAgICAgICAgOTggICAgICAgICAweDMwCi0gKiAgNDggICAgICAgIDExMCAgICAgICAgICAweDYKLSAqICA0OSAgICAgICAgMTA0ICAgICAgICAgIDB4NgotICogIDUwICAgICAgICAgOTggICAgICAgICAgMHg2Ci0gKiAgNTEgICAgICAgIDExMCAgICAgICAgICAweDUKLSAqICA1MiAgICAgICAgMTA0ICAgICAgICAgIDB4NQotICogIDUzICAgICAgICAgOTggICAgICAgICAgMHg1Ci0gKiAgNTQgICAgICAgIDExMCAgICAgICAgICAweDQKLSAqICA1NSAgICAgICAgMTA0ICAgICAgICAgIDB4NAotICogIDU2ICAgICAgICAgOTggICAgICAgICAgMHg0Ci0gKiAgNTcgICAgICAgIDExMCAgICAgICAgICAweDMKLSAqICA1OCAgICAgICAgMTA0ICAgICAgICAgIDB4MwotICogIDU5ICAgICAgICAgOTggICAgICAgICAgMHgzCi0gKiAgNjAgICAgICAgIDExMCAgICAgICAgICAweDIKLSAqICA2MSAgICAgICAgMTA0ICAgICAgICAgIDB4MgotICogIDYyICAgICAgICAgOTggICAgICAgICAgMHgyCi0gKiAgNjMgICAgICAgIDExMCAgICAgICAgICAweDEKLSAqICA2NCAgICAgICAgMTA0ICAgICAgICAgIDB4MQotICogIDY1ICAgICAgICAgOTggICAgICAgICAgMHgxCi0gKiAgNjYgICAgICAgIDExMCAgICAgICAgICAweDAKLSAqICA2NyAgICAgICAgMTA0ICAgICAgICAgIDB4MAotICogIDY4ICAgICAgICAgOTggICAgICAgICAgMHgwCi0gKiAgNjkgICAgICAgICA5NyAgICAgICAgICAgIDAKLSAqICA3MCAgICAgICAgIDk2ICAgICAgICAgICAgMAotICogIDcxICAgICAgICAgOTUgICAgICAgICAgICAwCi0gKiAgNzIgICAgICAgICA5NCAgICAgICAgICAgIDAKLSAqICA3MyAgICAgICAgIDkzICAgICAgICAgICAgMAotICogIDc0ICAgICAgICAgOTIgICAgICAgICAgICAwCi0gKiAgNzUgICAgICAgICA5MSAgICAgICAgICAgIDAKLSAqICA3NiAgICAgICAgIDkwICAgICAgICAgICAgMAotICogIDc3ICAgICAgICAgODkgICAgICAgICAgICAwCi0gKiAgNzggICAgICAgICA4OCAgICAgICAgICAgIDAKLSAqICA3OSAgICAgICAgIDg3ICAgICAgICAgICAgMAotICogIDgwICAgICAgICAgODYgICAgICAgICAgICAwCi0gKiAgODEgICAgICAgICA4NSAgICAgICAgICAgIDAKLSAqICA4MiAgICAgICAgIDg0ICAgICAgICAgICAgMAotICogIDgzICAgICAgICAgODMgICAgICAgICAgICAwCi0gKiAgODQgICAgICAgICA4MiAgICAgICAgICAgIDAKLSAqICA4NSAgICAgICAgIDgxICAgICAgICAgICAgMAotICogIDg2ICAgICAgICAgODAgICAgICAgICAgICAwCi0gKiAgODcgICAgICAgICA3OSAgICAgICAgICAgIDAKLSAqICA4OCAgICAgICAgIDc4ICAgICAgICAgICAgMAotICogIDg5ICAgICAgICAgNzcgICAgICAgICAgICAwCi0gKiAgOTAgICAgICAgICA3NiAgICAgICAgICAgIDAKLSAqICA5MSAgICAgICAgIDc1ICAgICAgICAgICAgMAotICogIDkyICAgICAgICAgNzQgICAgICAgICAgICAwCi0gKiAgOTMgICAgICAgICA3MyAgICAgICAgICAgIDAKLSAqICA5NCAgICAgICAgIDcyICAgICAgICAgICAgMAotICogIDk1ICAgICAgICAgNzEgICAgICAgICAgICAwCi0gKiAgOTYgICAgICAgICA3MCAgICAgICAgICAgIDAKLSAqICA5NyAgICAgICAgIDY5ICAgICAgICAgICAgMAotICogIDk4ICAgICAgICAgNjggICAgICAgICAgICAwCi0gKi8KLQotLyoqCi0gKiA1IEdIeiBnYWluIHRhYmxlCi0gKgotICogSW5kZXggICAgRHNwIGdhaW4gICBSYWRpbyBnYWluCi0gKiAgLTkgCSAgICAgIDEyMyAgICAgICAgIDB4M0YgICAgICAoaGlnaGVzdCBnYWluKQotICogIC04IAkgICAgICAxMTcgICAgICAgICAweDNGCi0gKiAgLTcgICAgICAgIDExMCAgICAgICAgIDB4M0YKLSAqICAtNiAgICAgICAgMTA0ICAgICAgICAgMHgzRgotICogIC01ICAgICAgICAgOTggICAgICAgICAweDNGCi0gKiAgLTQgICAgICAgIDExMCAgICAgICAgIDB4M0UKLSAqICAtMyAgICAgICAgMTA0ICAgICAgICAgMHgzRQotICogIC0yICAgICAgICAgOTggICAgICAgICAweDNFCi0gKiAgLTEgICAgICAgIDExMCAgICAgICAgIDB4M0QKLSAqICAgMCAgICAgICAgMTA0ICAgICAgICAgMHgzRAotICogICAxICAgICAgICAgOTggICAgICAgICAweDNECi0gKiAgIDIgICAgICAgIDExMCAgICAgICAgIDB4M0MKLSAqICAgMyAgICAgICAgMTA0ICAgICAgICAgMHgzQwotICogICA0ICAgICAgICAgOTggICAgICAgICAweDNDCi0gKiAgIDUgICAgICAgIDExMCAgICAgICAgIDB4M0IKLSAqICAgNiAgICAgICAgMTA0ICAgICAgICAgMHgzQgotICogICA3ICAgICAgICAgOTggICAgICAgICAweDNCCi0gKiAgIDggICAgICAgIDExMCAgICAgICAgIDB4M0EKLSAqICAgOSAgICAgICAgMTA0ICAgICAgICAgMHgzQQotICogIDEwICAgICAgICAgOTggICAgICAgICAweDNBCi0gKiAgMTEgICAgICAgIDExMCAgICAgICAgIDB4MzkKLSAqICAxMiAgICAgICAgMTA0ICAgICAgICAgMHgzOQotICogIDEzICAgICAgICAgOTggICAgICAgICAweDM5Ci0gKiAgMTQgICAgICAgIDExMCAgICAgICAgIDB4MzgKLSAqICAxNSAgICAgICAgMTA0ICAgICAgICAgMHgzOAotICogIDE2ICAgICAgICAgOTggICAgICAgICAweDM4Ci0gKiAgMTcgICAgICAgIDExMCAgICAgICAgIDB4MzcKLSAqICAxOCAgICAgICAgMTA0ICAgICAgICAgMHgzNwotICogIDE5ICAgICAgICAgOTggICAgICAgICAweDM3Ci0gKiAgMjAgICAgICAgIDExMCAgICAgICAgIDB4MzYKLSAqICAyMSAgICAgICAgMTA0ICAgICAgICAgMHgzNgotICogIDIyICAgICAgICAgOTggICAgICAgICAweDM2Ci0gKiAgMjMgICAgICAgIDExMCAgICAgICAgIDB4MzUKLSAqICAyNCAgICAgICAgMTA0ICAgICAgICAgMHgzNQotICogIDI1ICAgICAgICAgOTggICAgICAgICAweDM1Ci0gKiAgMjYgICAgICAgIDExMCAgICAgICAgIDB4MzQKLSAqICAyNyAgICAgICAgMTA0ICAgICAgICAgMHgzNAotICogIDI4ICAgICAgICAgOTggICAgICAgICAweDM0Ci0gKiAgMjkgICAgICAgIDExMCAgICAgICAgIDB4MzMKLSAqICAzMCAgICAgICAgMTA0ICAgICAgICAgMHgzMwotICogIDMxICAgICAgICAgOTggICAgICAgICAweDMzCi0gKiAgMzIgICAgICAgIDExMCAgICAgICAgIDB4MzIKLSAqICAzMyAgICAgICAgMTA0ICAgICAgICAgMHgzMgotICogIDM0ICAgICAgICAgOTggICAgICAgICAweDMyCi0gKiAgMzUgICAgICAgIDExMCAgICAgICAgIDB4MzEKLSAqICAzNiAgICAgICAgMTA0ICAgICAgICAgMHgzMQotICogIDM3ICAgICAgICAgOTggICAgICAgICAweDMxCi0gKiAgMzggICAgICAgIDExMCAgICAgICAgIDB4MzAKLSAqICAzOSAgICAgICAgMTA0ICAgICAgICAgMHgzMAotICogIDQwICAgICAgICAgOTggICAgICAgICAweDMwCi0gKiAgNDEgICAgICAgIDExMCAgICAgICAgIDB4MjUKLSAqICA0MiAgICAgICAgMTA0ICAgICAgICAgMHgyNQotICogIDQzICAgICAgICAgOTggICAgICAgICAweDI1Ci0gKiAgNDQgICAgICAgIDExMCAgICAgICAgIDB4MjQKLSAqICA0NSAgICAgICAgMTA0ICAgICAgICAgMHgyNAotICogIDQ2ICAgICAgICAgOTggICAgICAgICAweDI0Ci0gKiAgNDcgICAgICAgIDExMCAgICAgICAgIDB4MjMKLSAqICA0OCAgICAgICAgMTA0ICAgICAgICAgMHgyMwotICogIDQ5ICAgICAgICAgOTggICAgICAgICAweDIzCi0gKiAgNTAgICAgICAgIDExMCAgICAgICAgIDB4MjIKLSAqICA1MSAgICAgICAgMTA0ICAgICAgICAgMHgxOAotICogIDUyICAgICAgICAgOTggICAgICAgICAweDE4Ci0gKiAgNTMgICAgICAgIDExMCAgICAgICAgIDB4MTcKLSAqICA1NCAgICAgICAgMTA0ICAgICAgICAgMHgxNwotICogIDU1ICAgICAgICAgOTggICAgICAgICAweDE3Ci0gKiAgNTYgICAgICAgIDExMCAgICAgICAgIDB4MTYKLSAqICA1NyAgICAgICAgMTA0ICAgICAgICAgMHgxNgotICogIDU4ICAgICAgICAgOTggICAgICAgICAweDE2Ci0gKiAgNTkgICAgICAgIDExMCAgICAgICAgIDB4MTUKLSAqICA2MCAgICAgICAgMTA0ICAgICAgICAgMHgxNQotICogIDYxICAgICAgICAgOTggICAgICAgICAweDE1Ci0gKiAgNjIgICAgICAgIDExMCAgICAgICAgIDB4MTQKLSAqICA2MyAgICAgICAgMTA0ICAgICAgICAgMHgxNAotICogIDY0ICAgICAgICAgOTggICAgICAgICAweDE0Ci0gKiAgNjUgICAgICAgIDExMCAgICAgICAgIDB4MTMKLSAqICA2NiAgICAgICAgMTA0ICAgICAgICAgMHgxMwotICogIDY3ICAgICAgICAgOTggICAgICAgICAweDEzCi0gKiAgNjggICAgICAgIDExMCAgICAgICAgIDB4MTIKLSAqICA2OSAgICAgICAgMTA0ICAgICAgICAgMHgwOAotICogIDcwICAgICAgICAgOTggICAgICAgICAweDA4Ci0gKiAgNzEgICAgICAgIDExMCAgICAgICAgIDB4MDcKLSAqICA3MiAgICAgICAgMTA0ICAgICAgICAgMHgwNwotICogIDczICAgICAgICAgOTggICAgICAgICAweDA3Ci0gKiAgNzQgICAgICAgIDExMCAgICAgICAgIDB4MDYKLSAqICA3NSAgICAgICAgMTA0ICAgICAgICAgMHgwNgotICogIDc2ICAgICAgICAgOTggICAgICAgICAweDA2Ci0gKiAgNzcgICAgICAgIDExMCAgICAgICAgIDB4MDUKLSAqICA3OCAgICAgICAgMTA0ICAgICAgICAgMHgwNQotICogIDc5ICAgICAgICAgOTggICAgICAgICAweDA1Ci0gKiAgODAgICAgICAgIDExMCAgICAgICAgIDB4MDQKLSAqICA4MSAgICAgICAgMTA0ICAgICAgICAgMHgwNAotICogIDgyICAgICAgICAgOTggICAgICAgICAweDA0Ci0gKiAgODMgICAgICAgIDExMCAgICAgICAgIDB4MDMKLSAqICA4NCAgICAgICAgMTA0ICAgICAgICAgMHgwMwotICogIDg1ICAgICAgICAgOTggICAgICAgICAweDAzCi0gKiAgODYgICAgICAgIDExMCAgICAgICAgIDB4MDIKLSAqICA4NyAgICAgICAgMTA0ICAgICAgICAgMHgwMgotICogIDg4ICAgICAgICAgOTggICAgICAgICAweDAyCi0gKiAgODkgICAgICAgIDExMCAgICAgICAgIDB4MDEKLSAqICA5MCAgICAgICAgMTA0ICAgICAgICAgMHgwMQotICogIDkxICAgICAgICAgOTggICAgICAgICAweDAxCi0gKiAgOTIgICAgICAgIDExMCAgICAgICAgIDB4MDAKLSAqICA5MyAgICAgICAgMTA0ICAgICAgICAgMHgwMAotICogIDk0ICAgICAgICAgOTggICAgICAgICAweDAwCi0gKiAgOTUgICAgICAgICA5MyAgICAgICAgIDB4MDAKLSAqICA5NiAgICAgICAgIDg4ICAgICAgICAgMHgwMAotICogIDk3ICAgICAgICAgODMgICAgICAgICAweDAwCi0gKiAgOTggICAgICAgICA3OCAgICAgICAgIDB4MDAKLSAqLwotCi0KLS8qKgotICogU2FuaXR5IGNoZWNrcyBhbmQgZGVmYXVsdCB2YWx1ZXMgZm9yIEVFUFJPTSByZWd1bGF0b3J5IGxldmVscy4KLSAqIElmIEVFUFJPTSB2YWx1ZXMgZmFsbCBvdXRzaWRlIE1JTi9NQVggcmFuZ2UsIHVzZSBkZWZhdWx0IHZhbHVlcy4KLSAqCi0gKiBSZWd1bGF0b3J5IGxpbWl0cyByZWZlciB0byB0aGUgbWF4aW11bSBhdmVyYWdlIHR4cG93ZXIgYWxsb3dlZCBieQotICogcmVndWxhdG9yeSBhZ2VuY2llcyBpbiB0aGUgZ2VvZ3JhcGhpZXMgaW4gd2hpY2ggdGhlIGRldmljZSBpcyBtZWFudAotICogdG8gYmUgb3BlcmF0ZWQuICBUaGVzZSBsaW1pdHMgYXJlIFNLVS1zcGVjaWZpYyAoaS5lLiBnZW9ncmFwaHktc3BlY2lmaWMpLAotICogYW5kIGNoYW5uZWwtc3BlY2lmaWM7IGVhY2ggY2hhbm5lbCBoYXMgYW4gaW5kaXZpZHVhbCByZWd1bGF0b3J5IGxpbWl0Ci0gKiBsaXN0ZWQgaW4gdGhlIEVFUFJPTS4KLSAqCi0gKiBVbml0cyBhcmUgaW4gaGFsZi1kQm0gKGkuZS4gIjM0IiBtZWFucyAxNyBkQm0pLgotICovCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfMjQgICAoMzQpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1JFR1VMQVRPUllfNTIgICAoMzQpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9SRUdVTEFUT1JZX01JTiAgICAgICAgICAoMCkKLSNkZWZpbmUgSVdMX1RYX1BPV0VSX1JFR1VMQVRPUllfTUFYICAgICAgICAgICgzNCkKLQotLyoqCi0gKiBTYW5pdHkgY2hlY2tzIGFuZCBkZWZhdWx0IHZhbHVlcyBmb3IgRUVQUk9NIHNhdHVyYXRpb24gbGV2ZWxzLgotICogSWYgRUVQUk9NIHZhbHVlcyBmYWxsIG91dHNpZGUgTUlOL01BWCByYW5nZSwgdXNlIGRlZmF1bHQgdmFsdWVzLgotICoKLSAqIFNhdHVyYXRpb24gaXMgdGhlIGhpZ2hlc3QgbGV2ZWwgdGhhdCB0aGUgb3V0cHV0IHBvd2VyIGFtcGxpZmllciBjYW4gcHJvZHVjZQotICogd2l0aG91dCBzaWduaWZpY2FudCBjbGlwcGluZyBkaXN0b3J0aW9uLiAgVGhpcyBpcyBhICJwZWFrIiBwb3dlciBsZXZlbC4KLSAqIERpZmZlcmVudCB0eXBlcyBvZiBtb2R1bGF0aW9uIChpLmUuIHZhcmlvdXMgInJhdGVzIiwgYW5kIE9GRE0gdnMuIENDSykKLSAqIHJlcXVpcmUgZGlmZmVyaW5nIGFtb3VudHMgb2YgYmFja29mZiwgcmVsYXRpdmUgdG8gdGhlaXIgYXZlcmFnZSBwb3dlciBvdXRwdXQsCi0gKiBpbiBvcmRlciB0byBhdm9pZCBjbGlwcGluZyBkaXN0b3J0aW9uLgotICoKLSAqIERyaXZlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHZpb2xhdGluZyBuZWl0aGVyIHRoZSBzYXR1cmF0aW9uIGxpbWl0LAotICogbm9yIHRoZSByZWd1bGF0b3J5IGxpbWl0LCB3aGVuIGNhbGN1bGF0aW5nIFR4IHBvd2VyIHNldHRpbmdzIGZvciB2YXJpb3VzCi0gKiByYXRlcy4KLSAqCi0gKiBVbml0cyBhcmUgaW4gaGFsZi1kQm0gKGkuZS4gIjM4IiBtZWFucyAxOSBkQm0pLgotICovCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fMjQgICAoMzgpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fNTIgICAoMzgpCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01JTiAgICAgICAgICAoMjApCi0jZGVmaW5lIElXTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01BWCAgICAgICAgICAoNTApCi0KLS8qKgotICogQ2hhbm5lbCBncm91cHMgdXNlZCBmb3IgVHggQXR0ZW51YXRpb24gY2FsaWJyYXRpb24gKE1JTU8gdHggY2hhbm5lbCBiYWxhbmNlKQotICogYW5kIHRoZXJtYWwgVHhwb3dlciBjYWxpYnJhdGlvbi4KLSAqCi0gKiBXaGVuIGNhbGN1bGF0aW5nIHR4cG93ZXIsIGRyaXZlciBtdXN0IGNvbXBlbnNhdGUgZm9yIGN1cnJlbnQgZGV2aWNlCi0gKiB0ZW1wZXJhdHVyZTsgaGlnaGVyIHRlbXBlcmF0dXJlIHJlcXVpcmVzIGhpZ2hlciBnYWluLiAgRHJpdmVyIG11c3QgY2FsY3VsYXRlCi0gKiBjdXJyZW50IHRlbXBlcmF0dXJlIChzZWUgIjQ5NjUgdGVtcGVyYXR1cmUgY2FsY3VsYXRpb24iKSwgdGhlbiBjb21wYXJlIHZzLgotICogZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZW1wZXJhdHVyZSBpbiBFRVBST007IGlmIGN1cnJlbnQgdGVtcGVyYXR1cmUgaXMgaGlnaGVyCi0gKiB0aGFuIGZhY3RvcnkgdGVtcGVyYXR1cmUsIGRyaXZlciBtdXN0ICppbmNyZWFzZSogZ2FpbiBieSBwcm9wb3J0aW9ucyBzaG93bgotICogaW4gdGFibGUgYmVsb3cuICBJZiBjdXJyZW50IHRlbXBlcmF0dXJlIGlzIGxvd2VyIHRoYW4gZmFjdG9yeSwgZHJpdmVyIG11c3QKLSAqICpkZWNyZWFzZSogZ2Fpbi4KLSAqCi0gKiBEaWZmZXJlbnQgZnJlcXVlbmN5IHJhbmdlcyByZXF1aXJlIGRpZmZlcmVudCBjb21wZW5zYXRpb24sIGFzIHNob3duIGJlbG93LgotICovCi0vKiBHcm91cCAwLCA1LjIgR0h6IGNoIDM0LTQzOiAgNC41IGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSMV9GQ0ggMzQKLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSMV9MQ0ggNDMKLQotLyogR3JvdXAgMSwgNS4zIEdIeiBjaCA0NC03MDogIDQuMCBkZWdyZWVzIHBlciAxLzIgZEIuICovCi0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjJfRkNIIDQ0Ci0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjJfTENIIDcwCi0KLS8qIEdyb3VwIDIsIDUuNSBHSHogY2ggNzEtMTI0OiAgNC4wIGRlZ3JlZXMgcGVyIDEvMiBkQi4gKi8KLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSM19GQ0ggNzEKLSNkZWZpbmUgQ0FMSUJfSVdMX1RYX0FUVEVOX0dSM19MQ0ggMTI0Ci0KLS8qIEdyb3VwIDMsIDUuNyBHSHogY2ggMTI1LTIwMDogIDQuMCBkZWdyZWVzIHBlciAxLzIgZEIuICovCi0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjRfRkNIIDEyNQotI2RlZmluZSBDQUxJQl9JV0xfVFhfQVRURU5fR1I0X0xDSCAyMDAKLQotLyogR3JvdXAgNCwgMi40IEdIeiBhbGwgY2hhbm5lbHM6ICAzLjUgZGVncmVlcyBwZXIgMS8yIGRCLiAqLwotI2RlZmluZSBDQUxJQl9JV0xfVFhfQVRURU5fR1I1X0ZDSCAxCi0jZGVmaW5lIENBTElCX0lXTF9UWF9BVFRFTl9HUjVfTENIIDIwCi0KLWVudW0gewotCUNBTElCX0NIX0dST1VQXzEgPSAwLAotCUNBTElCX0NIX0dST1VQXzIgPSAxLAotCUNBTElCX0NIX0dST1VQXzMgPSAyLAotCUNBTElCX0NIX0dST1VQXzQgPSAzLAotCUNBTElCX0NIX0dST1VQXzUgPSA0LAotCUNBTElCX0NIX0dST1VQX01BWAotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKiBFTkQgVFhQT1dFUiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKioKLSAqIFR4L1J4IFF1ZXVlcwotICoKLSAqIE1vc3QgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGRyaXZlciBhbmQgNDk2NSBpcyB2aWEgcXVldWVzIG9mIGRhdGEgYnVmZmVycy4KLSAqIEZvciBleGFtcGxlLCBhbGwgY29tbWFuZHMgdGhhdCB0aGUgZHJpdmVyIGlzc3VlcyB0byBkZXZpY2UncyBlbWJlZGRlZAotICogY29udHJvbGxlciAodUNvZGUpIGFyZSB2aWEgdGhlIGNvbW1hbmQgcXVldWUgKG9uZSBvZiB0aGUgVHggcXVldWVzKS4gIEFsbAotICogdUNvZGUgY29tbWFuZCByZXNwb25zZXMvcmVwbGllcy9ub3RpZmljYXRpb25zLCBpbmNsdWRpbmcgUnggZnJhbWVzLCBhcmUKLSAqIGNvbnZleWVkIGZyb20gdUNvZGUgdG8gZHJpdmVyIHZpYSB0aGUgUnggcXVldWUuCi0gKgotICogTW9zdCBzdXBwb3J0IGZvciB0aGVzZSBxdWV1ZXMsIGluY2x1ZGluZyBoYW5kc2hha2Ugc3VwcG9ydCwgcmVzaWRlcyBpbgotICogc3RydWN0dXJlcyBpbiBob3N0IERSQU0sIHNoYXJlZCBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIHRoZSBkZXZpY2UuICBXaGVuCi0gKiBhbGxvY2F0aW5nIHRoaXMgbWVtb3J5LCB0aGUgZHJpdmVyIG11c3QgbWFrZSBzdXJlIHRoYXQgZGF0YSB3cml0dGVuIGJ5Ci0gKiB0aGUgaG9zdCBDUFUgdXBkYXRlcyBEUkFNIGltbWVkaWF0ZWx5IChhbmQgZG9lcyBub3QgZ2V0ICJzdHVjayIgaW4gQ1BVJ3MKLSAqIGNhY2hlIG1lbW9yeSksIHNvIERSQU0gYW5kIGNhY2hlIGFyZSBjb25zaXN0ZW50LCBhbmQgdGhlIGRldmljZSBjYW4KLSAqIGltbWVkaWF0ZWx5IHNlZSBjaGFuZ2VzIG1hZGUgYnkgdGhlIGRyaXZlci4KLSAqCi0gKiA0OTY1IHN1cHBvcnRzIHVwIHRvIDE2IERSQU0tYmFzZWQgVHggcXVldWVzLCBhbmQgc2VydmljZXMgdGhlc2UgcXVldWVzIHZpYQotICogdXAgdG8gNyBETUEgY2hhbm5lbHMgKEZJRk9zKS4gIEVhY2ggVHggcXVldWUgaXMgc3VwcG9ydGVkIGJ5IGEgY2lyY3VsYXIgYXJyYXkKLSAqIGluIERSQU0gY29udGFpbmluZyAyNTYgVHJhbnNtaXQgRnJhbWUgRGVzY3JpcHRvcnMgKFRGRHMpLgotICovCi0jZGVmaW5lIElXTDQ5X05VTV9GSUZPUyAJNwotI2RlZmluZSBJV0w0OV9DTURfRklGT19OVU0JNAotI2RlZmluZSBJV0w0OV9OVU1fUVVFVUVTCTE2Ci0jZGVmaW5lIElXTDQ5X05VTV9BTVBEVV9RVUVVRVMJOAotCi0KLS8qKgotICogc3RydWN0IGl3bDQ5NjVfc2NoZWRxX2JjX3RibAotICoKLSAqIEJ5dGUgQ291bnQgdGFibGUKLSAqCi0gKiBFYWNoIFR4IHF1ZXVlIHVzZXMgYSBieXRlLWNvdW50IHRhYmxlIGNvbnRhaW5pbmcgMzIwIGVudHJpZXM6Ci0gKiBvbmUgMTYtYml0IGVudHJ5IGZvciBlYWNoIG9mIDI1NiBURkRzLCBwbHVzIGFuIGFkZGl0aW9uYWwgNjQgZW50cmllcyB0aGF0Ci0gKiBkdXBsaWNhdGUgdGhlIGZpcnN0IDY0IGVudHJpZXMgKHRvIGF2b2lkIHdyYXAtYXJvdW5kIHdpdGhpbiBhIFR4IHdpbmRvdzsKLSAqIG1heCBUeCB3aW5kb3cgaXMgNjQgVEZEcykuCi0gKgotICogV2hlbiBkcml2ZXIgc2V0cyB1cCBhIG5ldyBURkQsIGl0IG11c3QgYWxzbyBlbnRlciB0aGUgdG90YWwgYnl0ZSBjb3VudAotICogb2YgdGhlIGZyYW1lIHRvIGJlIHRyYW5zbWl0dGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdGhlIGJ5dGUKLSAqIGNvdW50IHRhYmxlIGZvciB0aGUgY2hvc2VuIFR4IHF1ZXVlLiAgSWYgdGhlIFRGRCBpbmRleCBpcyAwLTYzLCB0aGUgZHJpdmVyCi0gKiBtdXN0IGR1cGxpY2F0ZSB0aGUgYnl0ZSBjb3VudCBlbnRyeSBpbiBjb3JyZXNwb25kaW5nIGluZGV4IDI1Ni0zMTkuCi0gKgotICogcGFkZGluZyBwdXRzIGVhY2ggYnl0ZSBjb3VudCB0YWJsZSBvbiBhIDEwMjQtYnl0ZSBib3VuZGFyeTsKLSAqIDQ5NjUgYXNzdW1lcyB0YWJsZXMgYXJlIHNlcGFyYXRlZCBieSAxMDI0IGJ5dGVzLgotICovCi1zdHJ1Y3QgaXdsNDk2NV9zY2RfYmNfdGJsIHsKLQlfX2xlMTYgdGZkX29mZnNldFtURkRfUVVFVUVfQkNfU0laRV07Ci0JdTggcGFkWzEwMjQgLSAoVEZEX1FVRVVFX0JDX1NJWkUpICogc2l6ZW9mKF9fbGUxNildOwotfSBfX3BhY2tlZDsKLQotCi0jZGVmaW5lIElXTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQJCSgweDAwMDAwMCkKLQotLyogUlNTSSB0byBkQm0gKi8KLSNkZWZpbmUgSVdMNDk2NV9SU1NJX09GRlNFVAk0NAotCi0vKiBQQ0kgcmVnaXN0ZXJzICovCi0jZGVmaW5lIFBDSV9DRkdfUkVUUllfVElNRU9VVAkweDA0MQotCi0vKiBQQ0kgcmVnaXN0ZXIgdmFsdWVzICovCi0jZGVmaW5lIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMFNfRU4JMHgwMQotI2RlZmluZSBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDFfRU4JMHgwMgotCi0jZGVmaW5lIElXTDQ5NjVfREVGQVVMVF9UWF9SRVRSWSAgMTUKLQotLyogRUVQUk9NICovCi0jZGVmaW5lIElXTDQ5NjVfRklSU1RfQU1QRFVfUVVFVUUJMTAKLQotCi0jZW5kaWYgLyogIV9faXdsXzQ5NjVfaHdfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1sZWQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODYyZmRjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtbGVkLmgiCi0KLS8qIFNlbmQgbGVkIGNvbW1hbmQgKi8KLXN0YXRpYyBpbnQKLWl3bDQ5NjVfc2VuZF9sZWRfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9sZWRfY21kICpsZWRfY21kKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9MRURTX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX2xlZF9jbWQpLAotCQkuZGF0YSA9IGxlZF9jbWQsCi0JCS5mbGFncyA9IENNRF9BU1lOQywKLQkJLmNhbGxiYWNrID0gTlVMTCwKLQl9OwotCXUzMiByZWc7Ci0KLQlyZWcgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9MRURfUkVHKTsKLQlpZiAocmVnICE9IChyZWcgJiBDU1JfTEVEX0JTTV9DVFJMX01TSykpCi0JCWl3bF93cml0ZTMyKHByaXYsIENTUl9MRURfUkVHLCByZWcgJiBDU1JfTEVEX0JTTV9DVFJMX01TSyk7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZChwcml2LCAmY21kKTsKLX0KLQotLyogU2V0IGxlZCByZWdpc3RlciBvZmYgKi8KLXZvaWQgaXdsNDk2NV9sZWRfZW5hYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfTEVEX1JFRywgQ1NSX0xFRF9SRUdfVFJVTl9PTik7Ci19Ci0KLWNvbnN0IHN0cnVjdCBpd2xfbGVkX29wcyBpd2w0OTY1X2xlZF9vcHMgPSB7Ci0JLmNtZCA9IGl3bDQ5NjVfc2VuZF9sZWRfY21kLAotfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LWxlZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZDM2MTUuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF80OTY1X2xlZF9oX18KLSNkZWZpbmUgX19pd2xfNDk2NV9sZWRfaF9fCi0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgaXdsX2xlZF9vcHMgaXdsNDk2NV9sZWRfb3BzOwotdm9pZCBpd2w0OTY1X2xlZF9lbmFibGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotI2VuZGlmIC8qIF9faXdsXzQ5NjVfbGVkX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1saWIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJlNmQ5ZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1saWIuYworKysgL2Rldi9udWxsCkBAIC0xLDExOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtaHcuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLQotdm9pZCBpd2w0OTY1X2NoZWNrX2Fib3J0X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgdTggZnJhbWVfY291bnQsIHUzMiBzdGF0dXMpCi17Ci0JaWYgKGZyYW1lX2NvdW50ID09IDEgJiYgc3RhdHVzID09IFRYX1NUQVRVU19GQUlMX1JGS0lMTF9GTFVTSCkgewotCQlJV0xfRVJSKHByaXYsICJUeCBmbHVzaCBjb21tYW5kIHRvIGZsdXNoIG91dCBhbGwgZnJhbWVzXG4iKTsKLQkJaWYgKCF0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+dHhfZmx1c2gpOwotCX0KLX0KLQotLyoKLSAqIEVFUFJPTQotICovCi1zdHJ1Y3QgaXdsX21vZF9wYXJhbXMgaXdsNDk2NV9tb2RfcGFyYW1zID0gewotCS5hbXNkdV9zaXplXzhLID0gMSwKLQkucmVzdGFydF9mdyA9IDEsCi0JLyogdGhlIHJlc3QgYXJlIDAgYnkgZGVmYXVsdCAqLwotfTsKLQotdm9pZCBpd2w0OTY1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X2ZyZWUpOwotCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X3VzZWQpOwotCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspIHsKLQkJLyogSW4gdGhlIHJlc2V0IGZ1bmN0aW9uLCB0aGVzZSBidWZmZXJzIG1heSBoYXZlIGJlZW4gYWxsb2NhdGVkCi0JCSAqIHRvIGFuIFNLQiwgc28gd2UgbmVlZCB0byB1bm1hcCBhbmQgZnJlZSBwb3RlbnRpYWwgc3RvcmFnZSAqLwotCQlpZiAocnhxLT5wb29sW2ldLnBhZ2UgIT0gTlVMTCkgewotCQkJcGNpX3VubWFwX3BhZ2UocHJpdi0+cGNpX2RldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJX19pd2xfbGVnYWN5X2ZyZWVfcGFnZXMocHJpdiwgcnhxLT5wb29sW2ldLnBhZ2UpOwotCQkJcnhxLT5wb29sW2ldLnBhZ2UgPSBOVUxMOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRTsgaSsrKQotCQlyeHEtPnF1ZXVlW2ldID0gTlVMTDsKLQotCS8qIFNldCB1cyBzbyB0aGF0IHdlIGhhdmUgcHJvY2Vzc2VkIGFuZCB1c2VkIGFsbCBidWZmZXJzLCBidXQgaGF2ZQotCSAqIG5vdCByZXN0b2NrZWQgdGhlIFJ4IHF1ZXVlIHdpdGggZnJlc2ggYnVmZmVycyAqLwotCXJ4cS0+cmVhZCA9IHJ4cS0+d3JpdGUgPSAwOwotCXJ4cS0+d3JpdGVfYWN0dWFsID0gMDsKLQlyeHEtPmZyZWVfY291bnQgPSAwOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotfQotCi1pbnQgaXdsNDk2NV9yeF9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCXUzMiByYl9zaXplOwotCWNvbnN0IHUzMiByZmRubG9nID0gUlhfUVVFVUVfU0laRV9MT0c7IC8qIDI1NiBSQkRzICovCi0JdTMyIHJiX3RpbWVvdXQgPSAwOwotCi0JaWYgKHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKLQkJcmJfc2l6ZSA9IEZIX1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV84SzsKLQllbHNlCi0JCXJiX3NpemUgPSBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfNEs7Ci0KLQkvKiBTdG9wIFJ4IERNQSAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRywgMCk7Ci0KLQkvKiBSZXNldCBkcml2ZXIncyBSeCBxdWV1ZSB3cml0ZSBpbmRleCAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfUkJEQ0JfV1BUUl9SRUcsIDApOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgdG8gZmluZCBSQkQgY2lyY3VsYXIgYnVmZmVyIGluIERSQU0gKi8KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHLAotCQkJICAgKHUzMikocnhxLT5iZF9kbWEgPj4gOCkpOwotCi0JLyogVGVsbCBkZXZpY2Ugd2hlcmUgaW4gRFJBTSB0byB1cGRhdGUgaXRzIFJ4IHN0YXR1cyAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRywKLQkJCSAgIHJ4cS0+cmJfc3R0c19kbWEgPj4gNCk7Ci0KLQkvKiBFbmFibGUgUnggRE1BCi0JICogRGlyZWN0IHJ4IGludGVycnVwdHMgdG8gaG9zdHMKLQkgKiBSeCBidWZmZXIgc2l6ZSA0IG9yIDhrCi0JICogUkIgdGltZW91dCAweDEwCi0JICogMjU2IFJCRHMKLQkgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcsCi0JCQkgICBGSF9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX0VOQUJMRV9WQUwgfAotCQkJICAgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfSVJRX0RFU1RfSU5UX0hPU1RfVkFMIHwKLQkJCSAgIEZIX1JDU1JfQ0hOTDBfUlhfQ09ORklHX1NJTkdMRV9GUkFNRV9NU0sgfAotCQkJICAgcmJfc2l6ZXwKLQkJCSAgIChyYl90aW1lb3V0IDw8IEZIX1JDU1JfUlhfQ09ORklHX1JFR19JUlFfUkJUSF9QT1MpfAotCQkJICAgKHJmZG5sb2cgPDwgRkhfUkNTUl9SWF9DT05GSUdfUkJEQ0JfU0laRV9QT1MpKTsKLQotCS8qIFNldCBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lciB0byBkZWZhdWx0ICgyMDQ4IHVzZWNzKSAqLwotCWl3bF93cml0ZTgocHJpdiwgQ1NSX0lOVF9DT0FMRVNDSU5HLCBJV0xfSE9TVF9JTlRfVElNRU9VVF9ERUYpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfc2V0X3B3cl92bWFpbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0vKgotICogKGZvciBkb2N1bWVudGF0aW9uIHB1cnBvc2VzKQotICogdG8gc2V0IHBvd2VyIHRvIFZfQVVYLCBkbzoKLQotCQlpZiAocGNpX3BtZV9jYXBhYmxlKHByaXYtPnBjaV9kZXYsIFBDSV9EM2NvbGQpKQotCQkJaXdsX2xlZ2FjeV9zZXRfYml0c19tYXNrX3BycGgocHJpdiwgQVBNR19QU19DVFJMX1JFRywKLQkJCQkJICAgICAgIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WQVVYLAotCQkJCQkgICAgICAgfkFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQyk7Ci0gKi8KLQotCWl3bF9sZWdhY3lfc2V0X2JpdHNfbWFza19wcnBoKHByaXYsIEFQTUdfUFNfQ1RSTF9SRUcsCi0JCQkgICAgICAgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX1ZNQUlOLAotCQkJICAgICAgIH5BUE1HX1BTX0NUUkxfTVNLX1BXUl9TUkMpOwotfQotCi1pbnQgaXdsNDk2NV9od19uaWNfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCWludCByZXQ7Ci0KLQkvKiBuaWNfaW5pdCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KHByaXYpOwotCi0JLyogU2V0IGludGVycnVwdCBjb2FsZXNjaW5nIGNhbGlicmF0aW9uIHRpbWVyIHRvIGRlZmF1bHQgKDUxMiB1c2VjcykgKi8KLQlpd2xfd3JpdGU4KHByaXYsIENTUl9JTlRfQ09BTEVTQ0lORywgSVdMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfREVGKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWl3bDQ5NjVfc2V0X3B3cl92bWFpbihwcml2KTsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPmFwbV9vcHMuY29uZmlnKHByaXYpOwotCi0JLyogQWxsb2NhdGUgdGhlIFJYIHF1ZXVlLCBvciByZXNldCBpZiBpdCBpcyBhbHJlYWR5IGFsbG9jYXRlZCAqLwotCWlmICghcnhxLT5iZCkgewotCQlyZXQgPSBpd2xfbGVnYWN5X3J4X3F1ZXVlX2FsbG9jKHByaXYpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBSeCBxdWV1ZVxuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCX0gZWxzZQotCQlpd2w0OTY1X3J4X3F1ZXVlX3Jlc2V0KHByaXYsIHJ4cSk7Ci0KLQlpd2w0OTY1X3J4X3JlcGxlbmlzaChwcml2KTsKLQotCWl3bDQ5NjVfcnhfaW5pdChwcml2LCByeHEpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJ4cS0+bmVlZF91cGRhdGUgPSAxOwotCWl3bF9sZWdhY3lfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihwcml2LCByeHEpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWxsb2NhdGUgb3IgcmVzZXQgYW5kIGluaXQgYWxsIFR4IGFuZCBDb21tYW5kIHF1ZXVlcyAqLwotCWlmICghcHJpdi0+dHhxKSB7Ci0JCXJldCA9IGl3bDQ5NjVfdHhxX2N0eF9hbGxvYyhwcml2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfSBlbHNlCi0JCWl3bDQ5NjVfdHhxX2N0eF9yZXNldChwcml2KTsKLQotCXNldF9iaXQoU1RBVFVTX0lOSVQsICZwcml2LT5zdGF0dXMpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9kbWFfYWRkcjJyYmRfcHRyIC0gY29udmVydCBhIERNQSBhZGRyZXNzIHRvIGEgdUNvZGUgcmVhZCBidWZmZXIgcHRyCi0gKi8KLXN0YXRpYyBpbmxpbmUgX19sZTMyIGl3bDQ5NjVfZG1hX2FkZHIycmJkX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgZG1hX2FkZHJfdCBkbWFfYWRkcikKLXsKLQlyZXR1cm4gY3B1X3RvX2xlMzIoKHUzMikoZG1hX2FkZHIgPj4gOCkpOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnhfcXVldWVfcmVzdG9jayAtIHJlZmlsbCBSWCBxdWV1ZSBmcm9tIHByZS1hbGxvY2F0ZWQgcG9vbAotICoKLSAqIElmIHRoZXJlIGFyZSBzbG90cyBpbiB0aGUgUlggcXVldWUgdGhhdCBuZWVkIHRvIGJlIHJlc3RvY2tlZCwKLSAqIGFuZCB3ZSBoYXZlIGZyZWUgcHJlLWFsbG9jYXRlZCBidWZmZXJzLCBmaWxsIHRoZSByYW5rcyBhcyBtdWNoCi0gKiBhcyB3ZSBjYW4sIHB1bGxpbmcgZnJvbSByeF9mcmVlLgotICoKLSAqIFRoaXMgbW92ZXMgdGhlICd3cml0ZScgaW5kZXggZm9yd2FyZCB0byBjYXRjaCB1cCB3aXRoICdwcm9jZXNzZWQnLCBhbmQKLSAqIGFsc28gdXBkYXRlcyB0aGUgbWVtb3J5IGFkZHJlc3MgaW4gdGhlIGZpcm13YXJlIHRvIHJlZmVyZW5jZSB0aGUgbmV3Ci0gKiB0YXJnZXQgYnVmZmVyLgotICovCi12b2lkIGl3bDQ5NjVfcnhfcXVldWVfcmVzdG9jayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0Jd2hpbGUgKChpd2xfbGVnYWN5X3J4X3F1ZXVlX3NwYWNlKHJ4cSkgPiAwKSAmJiAocnhxLT5mcmVlX2NvdW50KSkgewotCQkvKiBUaGUgb3ZlcndyaXR0ZW4gcnhiIG11c3QgYmUgYSB1c2VkIG9uZSAqLwotCQlyeGIgPSByeHEtPnF1ZXVlW3J4cS0+d3JpdGVdOwotCQlCVUdfT04ocnhiICYmIHJ4Yi0+cGFnZSk7Ci0KLQkJLyogR2V0IG5leHQgZnJlZSBSeCBidWZmZXIsIHJlbW92ZSBmcm9tIGZyZWUgbGlzdCAqLwotCQllbGVtZW50ID0gcnhxLT5yeF9mcmVlLm5leHQ7Ci0JCXJ4YiA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyLCBsaXN0KTsKLQkJbGlzdF9kZWwoZWxlbWVudCk7Ci0KLQkJLyogUG9pbnQgdG8gUnggYnVmZmVyIHZpYSBuZXh0IFJCRCBpbiBjaXJjdWxhciBidWZmZXIgKi8KLQkJcnhxLT5iZFtyeHEtPndyaXRlXSA9IGl3bDQ5NjVfZG1hX2FkZHIycmJkX3B0cihwcml2LAotCQkJCQkJCSAgICAgIHJ4Yi0+cGFnZV9kbWEpOwotCQlyeHEtPnF1ZXVlW3J4cS0+d3JpdGVdID0gcnhiOwotCQlyeHEtPndyaXRlID0gKHJ4cS0+d3JpdGUgKyAxKSAmIFJYX1FVRVVFX01BU0s7Ci0JCXJ4cS0+ZnJlZV9jb3VudC0tOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkvKiBJZiB0aGUgcHJlLWFsbG9jYXRlZCBidWZmZXIgcG9vbCBpcyBkcm9wcGluZyBsb3csIHNjaGVkdWxlIHRvCi0JICogcmVmaWxsIGl0ICovCi0JaWYgKHJ4cS0+ZnJlZV9jb3VudCA8PSBSWF9MT1dfV0FURVJNQVJLKQotCQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJ4X3JlcGxlbmlzaCk7Ci0KLQotCS8qIElmIHdlJ3ZlIGFkZGVkIG1vcmUgc3BhY2UgZm9yIHRoZSBmaXJtd2FyZSB0byBwbGFjZSBkYXRhLCB0ZWxsIGl0LgotCSAqIEluY3JlbWVudCBkZXZpY2UncyB3cml0ZSBwb2ludGVyIGluIG11bHRpcGxlcyBvZiA4LiAqLwotCWlmIChyeHEtPndyaXRlX2FjdHVhbCAhPSAocnhxLT53cml0ZSAmIH4weDcpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJcnhxLT5uZWVkX3VwZGF0ZSA9IDE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQlpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgcnhxKTsKLQl9Ci19Ci0KLS8qKgotICogaXdsNDk2NV9yeF9yZXBsZW5pc2ggLSBNb3ZlIGFsbCB1c2VkIHBhY2tldCBmcm9tIHJ4X3VzZWQgdG8gcnhfZnJlZQotICoKLSAqIFdoZW4gbW92aW5nIHRvIHJ4X2ZyZWUgYW4gU0tCIGlzIGFsbG9jYXRlZCBmb3IgdGhlIHNsb3QuCi0gKgotICogQWxzbyByZXN0b2NrIHRoZSBSeCBxdWV1ZSB2aWEgaXdsX3J4X3F1ZXVlX3Jlc3RvY2suCi0gKiBUaGlzIGlzIGNhbGxlZCBhcyBhIHNjaGVkdWxlZCB3b3JrIGl0ZW0gKGV4Y2VwdCBmb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uKQotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3J4X2FsbG9jYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgZ2ZwX3QgcHJpb3JpdHkpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JZ2ZwX3QgZ2ZwX21hc2sgPSBwcmlvcml0eTsKLQotCXdoaWxlICgxKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChyeHEtPmZyZWVfY291bnQgPiBSWF9MT1dfV0FURVJNQVJLKQotCQkJZ2ZwX21hc2sgfD0gX19HRlBfTk9XQVJOOwotCi0JCWlmIChwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciA+IDApCi0JCQlnZnBfbWFzayB8PSBfX0dGUF9DT01QOwotCi0JCS8qIEFsbG9jIGEgbmV3IHJlY2VpdmUgYnVmZmVyICovCi0JCXBhZ2UgPSBhbGxvY19wYWdlcyhnZnBfbWFzaywgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOwotCQlpZiAoIXBhZ2UpIHsKLQkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgImFsbG9jX3BhZ2VzIGZhaWxlZCwgIgotCQkJCQkgICAgICAgIm9yZGVyOiAlZFxuIiwKLQkJCQkJICAgICAgIHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKLQotCQkJaWYgKChyeHEtPmZyZWVfY291bnQgPD0gUlhfTE9XX1dBVEVSTUFSSykgJiYKLQkJCSAgICBuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJSVdMX0NSSVQocHJpdiwKLQkJCQkJIkZhaWxlZCB0byBhbGxvY19wYWdlcyB3aXRoICVzLiAiCi0JCQkJCSJPbmx5ICV1IGZyZWUgYnVmZmVycyByZW1haW5pbmcuXG4iLAotCQkJCQkgcHJpb3JpdHkgPT0gR0ZQX0FUT01JQyA/Ci0JCQkJCQkgIkdGUF9BVE9NSUMiIDogIkdGUF9LRVJORUwiLAotCQkJCQkgcnhxLT5mcmVlX2NvdW50KTsKLQkJCS8qIFdlIGRvbid0IHJlc2NoZWR1bGUgcmVwbGVuaXNoIHdvcmsgaGVyZSAtLSB3ZSB3aWxsCi0JCQkgKiBjYWxsIHRoZSByZXN0b2NrIG1ldGhvZCBhbmQgaWYgaXQgc3RpbGwgbmVlZHMKLQkJCSAqIG1vcmUgYnVmZmVycyBpdCB3aWxsIHNjaGVkdWxlIHJlcGxlbmlzaCAqLwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWlmIChsaXN0X2VtcHR5KCZyeHEtPnJ4X3VzZWQpKSB7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJCV9fZnJlZV9wYWdlcyhwYWdlLCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxlbWVudCA9IHJ4cS0+cnhfdXNlZC5uZXh0OwotCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKGVsZW1lbnQpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCUJVR19PTihyeGItPnBhZ2UpOwotCQlyeGItPnBhZ2UgPSBwYWdlOwotCQkvKiBHZXQgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgUkIgKi8KLQkJcnhiLT5wYWdlX2RtYSA9IHBjaV9tYXBfcGFnZShwcml2LT5wY2lfZGV2LCBwYWdlLCAwLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkvKiBkbWEgYWRkcmVzcyBtdXN0IGJlIG5vIG1vcmUgdGhhbiAzNiBiaXRzICovCi0JCUJVR19PTihyeGItPnBhZ2VfZG1hICYgfkRNQV9CSVRfTUFTSygzNikpOwotCQkvKiBhbmQgYWxzbyAyNTYgYnl0ZSBhbGlnbmVkISAqLwotCQlCVUdfT04ocnhiLT5wYWdlX2RtYSAmIERNQV9CSVRfTUFTSyg4KSk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7Ci0JCXJ4cS0+ZnJlZV9jb3VudCsrOwotCQlwcml2LT5hbGxvY19yeGJfcGFnZSsrOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCX0KLX0KLQotdm9pZCBpd2w0OTY1X3J4X3JlcGxlbmlzaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWl3bDQ5NjVfcnhfYWxsb2NhdGUocHJpdiwgR0ZQX0tFUk5FTCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bDQ5NjVfcnhfcXVldWVfcmVzdG9jayhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXZvaWQgaXdsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2w0OTY1X3J4X2FsbG9jYXRlKHByaXYsIEdGUF9BVE9NSUMpOwotCi0JaXdsNDk2NV9yeF9xdWV1ZV9yZXN0b2NrKHByaXYpOwotfQotCi0vKiBBc3N1bWVzIHRoYXQgdGhlIHNrYiBmaWVsZCBvZiB0aGUgYnVmZmVycyBpbiAncG9vbCcgaXMga2VwdCBhY2N1cmF0ZS4KLSAqIElmIGFuIFNLQiBoYXMgYmVlbiBkZXRhY2hlZCwgdGhlIFBPT0wgbmVlZHMgdG8gaGF2ZSBpdHMgU0tCIHNldCB0byBOVUxMCi0gKiBUaGlzIGZyZWUgcm91dGluZSB3YWxrcyB0aGUgbGlzdCBvZiBQT09MIGVudHJpZXMgYW5kIGlmIFNLQiBpcyBzZXQgdG8KLSAqIG5vbiBOVUxMIGl0IGlzIHVubWFwcGVkIGFuZCBmcmVlZAotICovCi12b2lkIGl3bDQ5NjVfcnhfcXVldWVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSkKLXsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyBpIDwgUlhfUVVFVUVfU0laRSArIFJYX0ZSRUVfQlVGRkVSUzsgaSsrKSB7Ci0JCWlmIChyeHEtPnBvb2xbaV0ucGFnZSAhPSBOVUxMKSB7Ci0JCQlwY2lfdW5tYXBfcGFnZShwcml2LT5wY2lfZGV2LCByeHEtPnBvb2xbaV0ucGFnZV9kbWEsCi0JCQkJUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCQlfX2l3bF9sZWdhY3lfZnJlZV9wYWdlcyhwcml2LCByeHEtPnBvb2xbaV0ucGFnZSk7Ci0JCQlyeHEtPnBvb2xbaV0ucGFnZSA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgcnhxLT5iZCwKLQkJCSAgcnhxLT5iZF9kbWEpOwotCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIHNpemVvZihzdHJ1Y3QgaXdsX3JiX3N0YXR1cyksCi0JCQkgIHJ4cS0+cmJfc3R0cywgcnhxLT5yYl9zdHRzX2RtYSk7Ci0JcnhxLT5iZCA9IE5VTEw7Ci0JcnhxLT5yYl9zdHRzICA9IE5VTEw7Ci19Ci0KLWludCBpd2w0OTY1X3J4cV9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQotCS8qIHN0b3AgUnggRE1BICovCi0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLCAwKTsKLQlpd2xfcG9sbF9kaXJlY3RfYml0KHByaXYsIEZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcsCi0JCQkgICAgRkhfUlNTUl9DSE5MMF9SWF9TVEFUVVNfQ0hOTF9JRExFLCAxMDAwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHUzMiByYXRlX25fZmxhZ3MsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQlpbnQgaWR4ID0gMDsKLQlpbnQgYmFuZF9vZmZzZXQgPSAwOwotCi0JLyogSFQgcmF0ZSBmb3JtYXQ6IG1hYzgwMjExIHdhbnRzIGFuIE1DUyBudW1iZXIsIHdoaWNoIGlzIGp1c3QgTFNCICovCi0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgewotCQlpZHggPSAocmF0ZV9uX2ZsYWdzICYgMHhmZik7Ci0JCXJldHVybiBpZHg7Ci0JLyogTGVnYWN5IHJhdGUgZm9ybWF0LCBzZWFyY2ggZm9yIG1hdGNoIGluIHRhYmxlICovCi0JfSBlbHNlIHsKLQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCWJhbmRfb2Zmc2V0ID0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJZm9yIChpZHggPSBiYW5kX29mZnNldDsgaWR4IDwgSVdMX1JBVEVfQ09VTlRfTEVHQUNZOyBpZHgrKykKLQkJCWlmIChpd2xlZ2FjeV9yYXRlc1tpZHhdLnBsY3AgPT0gKHJhdGVfbl9mbGFncyAmIDB4RkYpKQotCQkJCXJldHVybiBpZHggLSBiYW5kX29mZnNldDsKLQl9Ci0KLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9jYWxjX3Jzc2koc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgaXdsX3J4X3BoeV9yZXMgKnJ4X3Jlc3ApCi17Ci0JLyogZGF0YSBmcm9tIFBIWS9EU1AgcmVnYXJkaW5nIHNpZ25hbCBzdHJlbmd0aCwgZXRjLiwKLQkgKiAgIGNvbnRlbnRzIGFyZSBhbHdheXMgdGhlcmUsIG5vdCBjb25maWd1cmFibGUgYnkgaG9zdC4gICovCi0Jc3RydWN0IGl3bDQ5NjVfcnhfbm9uX2NmZ19waHkgKm5jcGh5ID0KLQkgICAgKHN0cnVjdCBpd2w0OTY1X3J4X25vbl9jZmdfcGh5ICopcnhfcmVzcC0+bm9uX2NmZ19waHlfYnVmOwotCXUzMiBhZ2MgPSAobGUxNl90b19jcHUobmNwaHktPmFnY19pbmZvKSAmIElXTDQ5X0FHQ19EQl9NQVNLKQotCQkJPj4gSVdMNDlfQUdDX0RCX1BPUzsKLQotCXUzMiB2YWxpZF9hbnRlbm5hZSA9Ci0JICAgIChsZTE2X3RvX2NwdShyeF9yZXNwLT5waHlfZmxhZ3MpICYgSVdMNDlfUlhfUEhZX0ZMQUdTX0FOVEVOTkFFX01BU0spCi0JCQk+PiBJV0w0OV9SWF9QSFlfRkxBR1NfQU5URU5OQUVfT0ZGU0VUOwotCXU4IG1heF9yc3NpID0gMDsKLQl1MzIgaTsKLQotCS8qIEZpbmQgbWF4IHJzc2kgYW1vbmcgMyBwb3NzaWJsZSByZWNlaXZlcnMuCi0JICogVGhlc2UgdmFsdWVzIGFyZSBtZWFzdXJlZCBieSB0aGUgZGlnaXRhbCBzaWduYWwgcHJvY2Vzc29yIChEU1ApLgotCSAqIFRoZXkgc2hvdWxkIHN0YXkgZmFpcmx5IGNvbnN0YW50IGV2ZW4gYXMgdGhlIHNpZ25hbCBzdHJlbmd0aCB2YXJpZXMsCi0JICogICBpZiB0aGUgcmFkaW8ncyBhdXRvbWF0aWMgZ2FpbiBjb250cm9sIChBR0MpIGlzIHdvcmtpbmcgcmlnaHQuCi0JICogQUdDIHZhbHVlIChzZWUgYmVsb3cpIHdpbGwgcHJvdmlkZSB0aGUgImludGVyZXN0aW5nIiBpbmZvLiAqLwotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCi0JCWlmICh2YWxpZF9hbnRlbm5hZSAmICgxIDw8IGkpKQotCQkJbWF4X3Jzc2kgPSBtYXgobmNwaHktPnJzc2lfaW5mb1tpIDw8IDFdLCBtYXhfcnNzaSk7Ci0KLQlJV0xfREVCVUdfU1RBVFMocHJpdiwgIlJzc2kgSW4gQSAlZCBCICVkIEMgJWQgTWF4ICVkIEFHQyBkQiAlZFxuIiwKLQkJbmNwaHktPnJzc2lfaW5mb1swXSwgbmNwaHktPnJzc2lfaW5mb1syXSwgbmNwaHktPnJzc2lfaW5mb1s0XSwKLQkJbWF4X3Jzc2ksIGFnYyk7Ci0KLQkvKiBkQm0gPSBtYXhfcnNzaSBkQiAtIGFnYyBkQiAtIGNvbnN0YW50LgotCSAqIEhpZ2hlciBBR0MgKGhpZ2hlciByYWRpbyBnYWluKSBtZWFucyBsb3dlciBzaWduYWwuICovCi0JcmV0dXJuIG1heF9yc3NpIC0gYWdjIC0gSVdMNDk2NV9SU1NJX09GRlNFVDsKLX0KLQotCi1zdGF0aWMgdTMyIGl3bDQ5NjVfdHJhbnNsYXRlX3J4X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBkZWNyeXB0X2luKQotewotCXUzMiBkZWNyeXB0X291dCA9IDA7Ci0KLQlpZiAoKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NUQVRJT05fRk9VTkQpID09Ci0JCQkJCVJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORCkKLQkJZGVjcnlwdF9vdXQgfD0gKFJYX1JFU19TVEFUVVNfU1RBVElPTl9GT1VORCB8Ci0JCQkJUlhfUkVTX1NUQVRVU19OT19TVEFUSU9OX0lORk9fTUlTTUFUQ0gpOwotCi0JZGVjcnlwdF9vdXQgfD0gKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSyk7Ci0KLQkvKiBwYWNrZXQgd2FzIG5vdCBlbmNyeXB0ZWQgKi8KLQlpZiAoKGRlY3J5cHRfaW4gJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSykgPT0KLQkJCQkJUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9OT05FKQotCQlyZXR1cm4gZGVjcnlwdF9vdXQ7Ci0KLQkvKiBwYWNrZXQgd2FzIGVuY3J5cHRlZCB3aXRoIHVua25vd24gYWxnICovCi0JaWYgKChkZWNyeXB0X2luICYgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9NU0spID09Ci0JCQkJCVJYX1JFU19TVEFUVVNfU0VDX1RZUEVfRVJSKQotCQlyZXR1cm4gZGVjcnlwdF9vdXQ7Ci0KLQkvKiBkZWNyeXB0aW9uIHdhcyBub3QgZG9uZSBpbiBIVyAqLwotCWlmICgoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19ERUNfRE9ORV9NU0spICE9Ci0JCQkJCVJYX01QRFVfUkVTX1NUQVRVU19ERUNfRE9ORV9NU0spCi0JCXJldHVybiBkZWNyeXB0X291dDsKLQotCXN3aXRjaCAoZGVjcnlwdF9pbiAmIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfTVNLKSB7Ci0KLQljYXNlIFJYX1JFU19TVEFUVVNfU0VDX1RZUEVfQ0NNUDoKLQkJLyogYWxnIGlzIENDTTogY2hlY2sgTUlDIG9ubHkgKi8KLQkJaWYgKCEoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19NSUNfT0spKQotCQkJLyogQmFkIE1JQyAqLwotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQzsKLQkJZWxzZQotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LOwotCi0JCWJyZWFrOwotCi0JY2FzZSBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX1RLSVA6Ci0JCWlmICghKGRlY3J5cHRfaW4gJiBSWF9NUERVX1JFU19TVEFUVVNfVFRBS19PSykpIHsKLQkJCS8qIEJhZCBUVEFLICovCi0JCQlkZWNyeXB0X291dCB8PSBSWF9SRVNfU1RBVFVTX0JBRF9LRVlfVFRBSzsKLQkJCWJyZWFrOwotCQl9Ci0JCS8qIGZhbGwgdGhyb3VnaCBpZiBUVEFLIE9LICovCi0JZGVmYXVsdDoKLQkJaWYgKCEoZGVjcnlwdF9pbiAmIFJYX01QRFVfUkVTX1NUQVRVU19JQ1ZfT0spKQotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19CQURfSUNWX01JQzsKLQkJZWxzZQotCQkJZGVjcnlwdF9vdXQgfD0gUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LOwotCQlicmVhazsKLQl9Ci0KLQlJV0xfREVCVUdfUlgocHJpdiwgImRlY3J5cHRfaW46MHgleCAgZGVjcnlwdF9vdXQgPSAweCV4XG4iLAotCQkJCQlkZWNyeXB0X2luLCBkZWNyeXB0X291dCk7Ci0KLQlyZXR1cm4gZGVjcnlwdF9vdXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcGFzc19wYWNrZXRfdG9fbWFjODAyMTEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAotCQkJCQl1MTYgbGVuLAotCQkJCQl1MzIgYW1wZHVfc3RhdHVzLAotCQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YiwKLQkJCQkJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzKQotewotCXN0cnVjdCBza19idWZmICpza2I7Ci0JX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOwotCi0JLyogV2Ugb25seSBwcm9jZXNzIGRhdGEgcGFja2V0cyBpZiB0aGUgaW50ZXJmYWNlIGlzIG9wZW4gKi8KLQlpZiAodW5saWtlbHkoIXByaXYtPmlzX29wZW4pKSB7Ci0JCUlXTF9ERUJVR19EUk9QX0xJTUlUKHByaXYsCi0JCSAgICAiRHJvcHBpbmcgcGFja2V0IHdoaWxlIGludGVyZmFjZSBpcyBub3Qgb3Blbi5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogSW4gY2FzZSBvZiBIVyBhY2NlbGVyYXRlZCBjcnlwdG8gYW5kIGJhZCBkZWNyeXB0aW9uLCBkcm9wICovCi0JaWYgKCFwcml2LT5jZmctPm1vZF9wYXJhbXMtPnN3X2NyeXB0byAmJgotCSAgICBpd2xfbGVnYWN5X3NldF9kZWNyeXB0ZWRfZmxhZyhwcml2LCBoZHIsIGFtcGR1X3N0YXR1cywgc3RhdHMpKQotCQlyZXR1cm47Ci0KLQlza2IgPSBkZXZfYWxsb2Nfc2tiKDEyOCk7Ci0JaWYgKCFza2IpIHsKLQkJSVdMX0VSUihwcml2LCAiZGV2X2FsbG9jX3NrYiBmYWlsZWRcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0Jc2tiX2FkZF9yeF9mcmFnKHNrYiwgMCwgcnhiLT5wYWdlLCAodm9pZCAqKWhkciAtIHJ4Yl9hZGRyKHJ4YiksIGxlbik7Ci0KLQlpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhwcml2LCBmYWxzZSwgZmMsIGxlbik7Ci0JbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihza2IpLCBzdGF0cywgc2l6ZW9mKCpzdGF0cykpOwotCi0JaWVlZTgwMjExX3J4KHByaXYtPmh3LCBza2IpOwotCXByaXYtPmFsbG9jX3J4Yl9wYWdlLS07Ci0JcnhiLT5wYWdlID0gTlVMTDsKLX0KLQotLyogQ2FsbGVkIGZvciBSRVBMWV9SWCAobGVnYWN5IEFCRyBmcmFtZXMpLCBvcgotICogUkVQTFlfUlhfTVBEVV9DTUQgKEhUIGhpZ2gtdGhyb3VnaHB1dCBOIGZyYW1lcykuICovCi12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfcngoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXI7Ci0Jc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgcnhfc3RhdHVzOwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfcnhfcGh5X3JlcyAqcGh5X3JlczsKLQlfX2xlMzIgcnhfcGt0X3N0YXR1czsKLQlzdHJ1Y3QgaXdsX3J4X21wZHVfcmVzX3N0YXJ0ICphbXNkdTsKLQl1MzIgbGVuOwotCXUzMiBhbXBkdV9zdGF0dXM7Ci0JdTMyIHJhdGVfbl9mbGFnczsKLQotCS8qKgotCSAqIFJFUExZX1JYIGFuZCBSRVBMWV9SWF9NUERVX0NNRCBhcmUgaGFuZGxlZCBkaWZmZXJlbnRseS4KLQkgKglSRVBMWV9SWDogcGh5c2ljYWwgbGF5ZXIgaW5mbyBpcyBpbiB0aGlzIGJ1ZmZlcgotCSAqCVJFUExZX1JYX01QRFVfQ01EOiBwaHlzaWNhbCBsYXllciBpbmZvIHdhcyBzZW50IGluIHNlcGFyYXRlCi0JICoJCWNvbW1hbmQgYW5kIGNhY2hlZCBpbiBwcml2LT5sYXN0X3BoeV9yZXMKLQkgKgotCSAqIEhlcmUgd2Ugc2V0IHVwIGxvY2FsIHZhcmlhYmxlcyBkZXBlbmRpbmcgb24gd2hpY2ggY29tbWFuZCBpcwotCSAqIHJlY2VpdmVkLgotCSAqLwotCWlmIChwa3QtPmhkci5jbWQgPT0gUkVQTFlfUlgpIHsKLQkJcGh5X3JlcyA9IChzdHJ1Y3QgaXdsX3J4X3BoeV9yZXMgKilwa3QtPnUucmF3OwotCQloZWFkZXIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikocGt0LT51LnJhdyArIHNpemVvZigqcGh5X3JlcykKLQkJCQkrIHBoeV9yZXMtPmNmZ19waHlfY250KTsKLQotCQlsZW4gPSBsZTE2X3RvX2NwdShwaHlfcmVzLT5ieXRlX2NvdW50KTsKLQkJcnhfcGt0X3N0YXR1cyA9ICooX19sZTMyICopKHBrdC0+dS5yYXcgKyBzaXplb2YoKnBoeV9yZXMpICsKLQkJCQlwaHlfcmVzLT5jZmdfcGh5X2NudCArIGxlbik7Ci0JCWFtcGR1X3N0YXR1cyA9IGxlMzJfdG9fY3B1KHJ4X3BrdF9zdGF0dXMpOwotCX0gZWxzZSB7Ci0JCWlmICghcHJpdi0+XzQ5NjUubGFzdF9waHlfcmVzX3ZhbGlkKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJNUERVIGZyYW1lIHdpdGhvdXQgY2FjaGVkIFBIWSBkYXRhXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlwaHlfcmVzID0gJnByaXYtPl80OTY1Lmxhc3RfcGh5X3JlczsKLQkJYW1zZHUgPSAoc3RydWN0IGl3bF9yeF9tcGR1X3Jlc19zdGFydCAqKXBrdC0+dS5yYXc7Ci0JCWhlYWRlciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkpOwotCQlsZW4gPSBsZTE2X3RvX2NwdShhbXNkdS0+Ynl0ZV9jb3VudCk7Ci0JCXJ4X3BrdF9zdGF0dXMgPSAqKF9fbGUzMiAqKShwa3QtPnUucmF3ICsgc2l6ZW9mKCphbXNkdSkgKyBsZW4pOwotCQlhbXBkdV9zdGF0dXMgPSBpd2w0OTY1X3RyYW5zbGF0ZV9yeF9zdGF0dXMocHJpdiwKLQkJCQlsZTMyX3RvX2NwdShyeF9wa3Rfc3RhdHVzKSk7Ci0JfQotCi0JaWYgKCh1bmxpa2VseShwaHlfcmVzLT5jZmdfcGh5X2NudCA+IDIwKSkpIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgImRzcCBzaXplIG91dCBvZiByYW5nZSBbMCwyMF06ICVkL24iLAotCQkJCXBoeV9yZXMtPmNmZ19waHlfY250KTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICghKHJ4X3BrdF9zdGF0dXMgJiBSWF9SRVNfU1RBVFVTX05PX0NSQzMyX0VSUk9SKSB8fAotCSAgICAhKHJ4X3BrdF9zdGF0dXMgJiBSWF9SRVNfU1RBVFVTX05PX1JYRV9PVkVSRkxPVykpIHsKLQkJSVdMX0RFQlVHX1JYKHByaXYsICJCYWQgQ1JDIG9yIEZJRk86IDB4JTA4WC5cbiIsCi0JCQkJbGUzMl90b19jcHUocnhfcGt0X3N0YXR1cykpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogVGhpcyB3aWxsIGJlIHVzZWQgaW4gc2V2ZXJhbCBwbGFjZXMgbGF0ZXIgKi8KLQlyYXRlX25fZmxhZ3MgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5yYXRlX25fZmxhZ3MpOwotCi0JLyogcnhfc3RhdHVzIGNhcnJpZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhY2tldCB0byBtYWM4MDIxMSAqLwotCXJ4X3N0YXR1cy5tYWN0aW1lID0gbGU2NF90b19jcHUocGh5X3Jlcy0+dGltZXN0YW1wKTsKLQlyeF9zdGF0dXMuYmFuZCA9IChwaHlfcmVzLT5waHlfZmxhZ3MgJiBSWF9SRVNfUEhZX0ZMQUdTX0JBTkRfMjRfTVNLKSA/Ci0JCQkJSUVFRTgwMjExX0JBTkRfMkdIWiA6IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci0Jcnhfc3RhdHVzLmZyZXEgPQotCQlpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3kobGUxNl90b19jcHUocGh5X3Jlcy0+Y2hhbm5lbCksCi0JCQkJCQkJcnhfc3RhdHVzLmJhbmQpOwotCXJ4X3N0YXR1cy5yYXRlX2lkeCA9Ci0JCWl3bDQ5NjVfaHdyYXRlX3RvX21hYzgwMjExX2lkeChyYXRlX25fZmxhZ3MsIHJ4X3N0YXR1cy5iYW5kKTsKLQlyeF9zdGF0dXMuZmxhZyA9IDA7Ci0KLQkvKiBUU0YgaXNuJ3QgcmVsaWFibGUuIEluIG9yZGVyIHRvIGFsbG93IHNtb290aCB1c2VyIGV4cGVyaWVuY2UsCi0JICogdGhpcyBXL0EgZG9lc24ndCBwcm9wYWdhdGUgaXQgdG8gdGhlIG1hYzgwMjExICovCi0JLypyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX01BQ1RJTUVfTVBEVTsqLwotCi0JcHJpdi0+dWNvZGVfYmVhY29uX3RpbWUgPSBsZTMyX3RvX2NwdShwaHlfcmVzLT5iZWFjb25fdGltZV9zdGFtcCk7Ci0KLQkvKiBGaW5kIG1heCBzaWduYWwgc3RyZW5ndGggKGRCbSkgYW1vbmcgMyBhbnRlbm5hL3JlY2VpdmVyIGNoYWlucyAqLwotCXJ4X3N0YXR1cy5zaWduYWwgPSBpd2w0OTY1X2NhbGNfcnNzaShwcml2LCBwaHlfcmVzKTsKLQotCWl3bF9sZWdhY3lfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHByaXYsIGxlbiwgaGVhZGVyKTsKLQlJV0xfREVCVUdfU1RBVFNfTElNSVQocHJpdiwgIlJzc2kgJWQsIFRTRiAlbGx1XG4iLAotCQlyeF9zdGF0dXMuc2lnbmFsLCAodW5zaWduZWQgbG9uZyBsb25nKXJ4X3N0YXR1cy5tYWN0aW1lKTsKLQotCS8qCi0JICogImFudGVubmEgbnVtYmVyIgotCSAqCi0JICogSXQgc2VlbXMgdGhhdCB0aGUgYW50ZW5uYSBmaWVsZCBpbiB0aGUgcGh5IGZsYWdzIHZhbHVlCi0JICogaXMgYWN0dWFsbHkgYSBiaXQgZmllbGQuIFRoaXMgaXMgdW5kZWZpbmVkIGJ5IHJhZGlvdGFwLAotCSAqIGl0IHdhbnRzIGFuIGFjdHVhbCBhbnRlbm5hIG51bWJlciBidXQgSSBhbHdheXMgZ2V0ICI3IgotCSAqIGZvciBtb3N0IGxlZ2FjeSBmcmFtZXMgSSByZWNlaXZlIGluZGljYXRpbmcgdGhhdCB0aGUKLQkgKiBzYW1lIGZyYW1lIHdhcyByZWNlaXZlZCBvbiBhbGwgdGhyZWUgUlggY2hhaW5zLgotCSAqCi0JICogSSB0aGluayB0aGlzIGZpZWxkIHNob3VsZCBiZSByZW1vdmVkIGluIGZhdm9yIG9mIGEKLQkgKiBuZXcgODAyLjExbiByYWRpb3RhcCBmaWVsZCAiUlggY2hhaW5zIiB0aGF0IGlzIGRlZmluZWQKLQkgKiBhcyBhIGJpdG1hc2suCi0JICovCi0Jcnhfc3RhdHVzLmFudGVubmEgPQotCQkobGUxNl90b19jcHUocGh5X3Jlcy0+cGh5X2ZsYWdzKSAmIFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9NU0spCi0JCT4+IFJYX1JFU19QSFlfRkxBR1NfQU5URU5OQV9QT1M7Ci0KLQkvKiBzZXQgdGhlIHByZWFtYmxlIGZsYWcgaWYgYXBwcm9wcmlhdGUgKi8KLQlpZiAocGh5X3Jlcy0+cGh5X2ZsYWdzICYgUlhfUkVTX1BIWV9GTEFHU19TSE9SVF9QUkVBTUJMRV9NU0spCi0JCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfU0hPUlRQUkU7Ci0KLQkvKiBTZXQgdXAgdGhlIEhUIHBoeSBmbGFncyAqLwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spCi0JCXJ4X3N0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSFQ7Ci0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUNDBfTVNLKQotCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHXzQwTUhaOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQotCQlyeF9zdGF0dXMuZmxhZyB8PSBSWF9GTEFHX1NIT1JUX0dJOwotCi0JaXdsNDk2NV9wYXNzX3BhY2tldF90b19tYWM4MDIxMShwcml2LCBoZWFkZXIsIGxlbiwgYW1wZHVfc3RhdHVzLAotCQkJCSAgICByeGIsICZyeF9zdGF0dXMpOwotfQotCi0vKiBDYWNoZSBwaHkgZGF0YSAoUnggc2lnbmFsIHN0cmVuZ3RoLCBldGMpIGZvciBIVCBmcmFtZSAoUkVQTFlfUlhfUEhZX0NNRCkuCi0gKiBUaGlzIHdpbGwgYmUgdXNlZCBsYXRlciBpbiBpd2xfcnhfcmVwbHlfcngoKSBmb3IgUkVQTFlfUlhfTVBEVV9DTUQuICovCi12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfcnhfcGh5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlwcml2LT5fNDk2NS5sYXN0X3BoeV9yZXNfdmFsaWQgPSB0cnVlOwotCW1lbWNweSgmcHJpdi0+XzQ5NjUubGFzdF9waHlfcmVzLCBwa3QtPnUucmF3LAotCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9yeF9waHlfcmVzKSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkgICAgIHU4IGlzX2FjdGl2ZSwgdTggbl9wcm9iZXMsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCAqc2Nhbl9jaCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47Ci0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTE2IHBhc3NpdmVfZHdlbGwgPSAwOwotCXUxNiBhY3RpdmVfZHdlbGwgPSAwOwotCWludCBhZGRlZCwgaTsKLQl1MTYgY2hhbm5lbDsKLQotCXNiYW5kID0gaXdsX2dldF9od19tb2RlKHByaXYsIGJhbmQpOwotCWlmICghc2JhbmQpCi0JCXJldHVybiAwOwotCi0JYWN0aXZlX2R3ZWxsID0gaXdsX2xlZ2FjeV9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgbl9wcm9iZXMpOwotCXBhc3NpdmVfZHdlbGwgPSBpd2xfbGVnYWN5X2dldF9wYXNzaXZlX2R3ZWxsX3RpbWUocHJpdiwgYmFuZCwgdmlmKTsKLQotCWlmIChwYXNzaXZlX2R3ZWxsIDw9IGFjdGl2ZV9kd2VsbCkKLQkJcGFzc2l2ZV9kd2VsbCA9IGFjdGl2ZV9kd2VsbCArIDE7Ci0KLQlmb3IgKGkgPSAwLCBhZGRlZCA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fY2hhbm5lbHM7IGkrKykgewotCQljaGFuID0gcHJpdi0+c2Nhbl9yZXF1ZXN0LT5jaGFubmVsc1tpXTsKLQotCQlpZiAoY2hhbi0+YmFuZCAhPSBiYW5kKQotCQkJY29udGludWU7Ci0KLQkJY2hhbm5lbCA9IGNoYW4tPmh3X3ZhbHVlOwotCQlzY2FuX2NoLT5jaGFubmVsID0gY3B1X3RvX2xlMTYoY2hhbm5lbCk7Ci0KLQkJY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBiYW5kLCBjaGFubmVsKTsKLQkJaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJCUlXTF9ERUJVR19TQ0FOKHByaXYsCi0JCQkJICJDaGFubmVsICVkIGlzIElOVkFMSUQgZm9yIHRoaXMgYmFuZC5cbiIsCi0JCQkJCWNoYW5uZWwpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIWlzX2FjdGl2ZSB8fCBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfcGFzc2l2ZShjaF9pbmZvKSB8fAotCQkgICAgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSkKLQkJCXNjYW5fY2gtPnR5cGUgPSBTQ0FOX0NIQU5ORUxfVFlQRV9QQVNTSVZFOwotCQllbHNlCi0JCQlzY2FuX2NoLT50eXBlID0gU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFOwotCi0JCWlmIChuX3Byb2JlcykKLQkJCXNjYW5fY2gtPnR5cGUgfD0gSVdMX1NDQU5fUFJPQkVfTUFTSyhuX3Byb2Jlcyk7Ci0KLQkJc2Nhbl9jaC0+YWN0aXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYoYWN0aXZlX2R3ZWxsKTsKLQkJc2Nhbl9jaC0+cGFzc2l2ZV9kd2VsbCA9IGNwdV90b19sZTE2KHBhc3NpdmVfZHdlbGwpOwotCi0JCS8qIFNldCB0eHBvd2VyIGxldmVscyB0byBkZWZhdWx0cyAqLwotCQlzY2FuX2NoLT5kc3BfYXR0ZW4gPSAxMTA7Ci0KLQkJLyogTk9URTogaWYgd2Ugd2VyZSBkb2luZyA2TWIgT0ZETSBmb3Igc2NhbnMgd2UnZCB1c2UKLQkJICogcG93ZXIgbGV2ZWw6Ci0JCSAqIHNjYW5fY2gtPnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMiA8PCAzKSkgfCAzOwotCQkgKi8KLQkJaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCXNjYW5fY2gtPnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoMyA8PCAzKSkgfCAzOwotCQllbHNlCi0JCQlzY2FuX2NoLT50eF9nYWluID0gKCgxIDw8IDUpIHwgKDUgPDwgMykpOwotCi0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FubmluZyBjaD0lZCBwcm9iPTB4JVggWyVzICVkXVxuIiwKLQkJCSAgICAgICBjaGFubmVsLCBsZTMyX3RvX2NwdShzY2FuX2NoLT50eXBlKSwKLQkJCSAgICAgICAoc2Nhbl9jaC0+dHlwZSAmIFNDQU5fQ0hBTk5FTF9UWVBFX0FDVElWRSkgPwotCQkJCSJBQ1RJVkUiIDogIlBBU1NJVkUiLAotCQkJICAgICAgIChzY2FuX2NoLT50eXBlICYgU0NBTl9DSEFOTkVMX1RZUEVfQUNUSVZFKSA/Ci0JCQkgICAgICAgYWN0aXZlX2R3ZWxsIDogcGFzc2l2ZV9kd2VsbCk7Ci0KLQkJc2Nhbl9jaCsrOwotCQlhZGRlZCsrOwotCX0KLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJ0b3RhbCBjaGFubmVscyB0byBzY2FuICVkXG4iLCBhZGRlZCk7Ci0JcmV0dXJuIGFkZGVkOwotfQotCi1pbnQgaXdsNDk2NV9yZXF1ZXN0X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9TQ0FOX0NNRCwKLQkJLmxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3NjYW5fY21kKSwKLQkJLmZsYWdzID0gQ01EX1NJWkVfSFVHRSwKLQl9OwotCXN0cnVjdCBpd2xfc2Nhbl9jbWQgKnNjYW47Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQl1MzIgcmF0ZV9mbGFncyA9IDA7Ci0JdTE2IGNtZF9sZW47Ci0JdTE2IHJ4X2NoYWluID0gMDsKLQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7Ci0JdTggbl9wcm9iZXMgPSAwOwotCXU4IHJ4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF9yeF9hbnQ7Ci0JdTggcmF0ZTsKLQlib29sIGlzX2FjdGl2ZSA9IGZhbHNlOwotCWludCAgY2hhbl9tb2Q7Ci0JdTggYWN0aXZlX2NoYWluczsKLQl1OCBzY2FuX3R4X2FudGVubmFzID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHZpZikKLQkJY3R4ID0gaXdsX2xlZ2FjeV9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOwotCi0JaWYgKCFwcml2LT5zY2FuX2NtZCkgewotCQlwcml2LT5zY2FuX2NtZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpd2xfc2Nhbl9jbWQpICsKLQkJCQkJIElXTF9NQVhfU0NBTl9TSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwcml2LT5zY2FuX2NtZCkgewotCQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwKLQkJCQkgICAgICAgImZhaWwgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBzY2FuXG4iKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCXNjYW4gPSBwcml2LT5zY2FuX2NtZDsKLQltZW1zZXQoc2NhbiwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfc2Nhbl9jbWQpICsgSVdMX01BWF9TQ0FOX1NJWkUpOwotCi0Jc2Nhbi0+cXVpZXRfcGxjcF90aCA9IElXTF9QTENQX1FVSUVUX1RIUkVTSDsKLQlzY2FuLT5xdWlldF90aW1lID0gSVdMX0FDVElWRV9RVUlFVF9USU1FOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfYW55X2Fzc29jaWF0ZWQocHJpdikpIHsKLQkJdTE2IGludGVydmFsOwotCQl1MzIgZXh0cmE7Ci0JCXUzMiBzdXNwZW5kX3RpbWUgPSAxMDA7Ci0JCXUzMiBzY2FuX3N1c3BlbmRfdGltZSA9IDEwMDsKLQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU2Nhbm5pbmcgd2hpbGUgYXNzb2NpYXRlZC4uLlxuIik7Ci0JCWludGVydmFsID0gdmlmLT5ic3NfY29uZi5iZWFjb25faW50OwotCi0JCXNjYW4tPnN1c3BlbmRfdGltZSA9IDA7Ci0JCXNjYW4tPm1heF9vdXRfdGltZSA9IGNwdV90b19sZTMyKDIwMCAqIDEwMjQpOwotCQlpZiAoIWludGVydmFsKQotCQkJaW50ZXJ2YWwgPSBzdXNwZW5kX3RpbWU7Ci0KLQkJZXh0cmEgPSAoc3VzcGVuZF90aW1lIC8gaW50ZXJ2YWwpIDw8IDIyOwotCQlzY2FuX3N1c3BlbmRfdGltZSA9IChleHRyYSB8Ci0JCSAgICAoKHN1c3BlbmRfdGltZSAlIGludGVydmFsKSAqIDEwMjQpKTsKLQkJc2Nhbi0+c3VzcGVuZF90aW1lID0gY3B1X3RvX2xlMzIoc2Nhbl9zdXNwZW5kX3RpbWUpOwotCQlJV0xfREVCVUdfU0NBTihwcml2LCAic3VzcGVuZF90aW1lIDB4JVggYmVhY29uIGludGVydmFsICVkXG4iLAotCQkJICAgICAgIHNjYW5fc3VzcGVuZF90aW1lLCBpbnRlcnZhbCk7Ci0JfQotCi0JaWYgKHByaXYtPnNjYW5fcmVxdWVzdC0+bl9zc2lkcykgewotCQlpbnQgaSwgcCA9IDA7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJLaWNraW5nIG9mZiBhY3RpdmUgc2NhblxuIik7Ci0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fc3NpZHM7IGkrKykgewotCQkJLyogYWx3YXlzIGRvZXMgd2lsZGNhcmQgYW55d2F5ICovCi0JCQlpZiAoIXByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pCi0JCQkJY29udGludWU7Ci0JCQlzY2FuLT5kaXJlY3Rfc2NhbltwXS5pZCA9IFdMQU5fRUlEX1NTSUQ7Ci0JCQlzY2FuLT5kaXJlY3Rfc2NhbltwXS5sZW4gPQotCQkJCXByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW47Ci0JCQltZW1jcHkoc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uc3NpZCwKLQkJCSAgICAgICBwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWQsCi0JCQkgICAgICAgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbik7Ci0JCQluX3Byb2JlcysrOwotCQkJcCsrOwotCQl9Ci0JCWlzX2FjdGl2ZSA9IHRydWU7Ci0JfSBlbHNlCi0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTdGFydCBwYXNzaXZlIHNjYW4uXG4iKTsKLQotCXNjYW4tPnR4X2NtZC50eF9mbGFncyA9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7Ci0Jc2Nhbi0+dHhfY21kLnN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOwotCXNjYW4tPnR4X2NtZC5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKLQotCXN3aXRjaCAocHJpdi0+c2Nhbl9iYW5kKSB7Ci0JY2FzZSBJRUVFODAyMTFfQkFORF8yR0haOgotCQlzY2FuLT5mbGFncyA9IFJYT05fRkxHX0JBTkRfMjRHX01TSyB8IFJYT05fRkxHX0FVVE9fREVURUNUX01TSzsKLQkJY2hhbl9tb2QgPSBsZTMyX3RvX2NwdSgKLQkJCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5mbGFncyAmCi0JCQkJCQlSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLKQotCQkJCSAgICAgICA+PiBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TOwotCQlpZiAoY2hhbl9tb2QgPT0gQ0hBTk5FTF9NT0RFX1BVUkVfNDApIHsKLQkJCXJhdGUgPSBJV0xfUkFURV82TV9QTENQOwotCQl9IGVsc2UgewotCQkJcmF0ZSA9IElXTF9SQVRFXzFNX1BMQ1A7Ci0JCQlyYXRlX2ZsYWdzID0gUkFURV9NQ1NfQ0NLX01TSzsKLQkJfQotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6Ci0JCXJhdGUgPSBJV0xfUkFURV82TV9QTENQOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfV0FSTihwcml2LCAiSW52YWxpZCBzY2FuIGJhbmRcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKgotCSAqIElmIGFjdGl2ZSBzY2FubmluZyBpcyByZXF1ZXN0ZWQgYnV0IGEgY2VydGFpbiBjaGFubmVsIGlzCi0JICogbWFya2VkIHBhc3NpdmUsIHdlIGNhbiBkbyBhY3RpdmUgc2Nhbm5pbmcgaWYgd2UgZGV0ZWN0Ci0JICogdHJhbnNtaXNzaW9ucy4KLQkgKgotCSAqIFRoZXJlIGlzIGFuIGlzc3VlIHdpdGggc29tZSBmaXJtd2FyZSB2ZXJzaW9ucyB0aGF0IHRyaWdnZXJzCi0JICogYSBzeXNhc3NlcnQgb24gYSAiZ29vZCBDUkMgdGhyZXNob2xkIiBvZiB6ZXJvICg9PSBkaXNhYmxlZCksCi0JICogb24gYSByYWRhciBjaGFubmVsIGV2ZW4gdGhvdWdoIHRoaXMgbWVhbnMgdGhhdCB3ZSBzaG91bGQgTk9UCi0JICogc2VuZCBwcm9iZXMuCi0JICoKLQkgKiBUaGUgImdvb2QgQ1JDIHRocmVzaG9sZCIgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCB3ZQotCSAqIG5lZWQgdG8gcmVjZWl2ZSBkdXJpbmcgb3VyIGR3ZWxsIHRpbWUgb24gYSBjaGFubmVsIGJlZm9yZQotCSAqIHNlbmRpbmcgb3V0IHByb2JlcyAtLSBzZXR0aW5nIHRoaXMgdG8gYSBodWdlIHZhbHVlIHdpbGwKLQkgKiBtZWFuIHdlIG5ldmVyIHJlYWNoIGl0LCBidXQgYXQgdGhlIHNhbWUgdGltZSB3b3JrIGFyb3VuZAotCSAqIHRoZSBhZm9yZW1lbnRpb25lZCBpc3N1ZS4gVGh1cyB1c2UgSVdMX0dPT0RfQ1JDX1RIX05FVkVSCi0JICogaGVyZSBpbnN0ZWFkIG9mIElXTF9HT09EX0NSQ19USF9ESVNBQkxFRC4KLQkgKi8KLQlzY2FuLT5nb29kX0NSQ190aCA9IGlzX2FjdGl2ZSA/IElXTF9HT09EX0NSQ19USF9ERUZBVUxUIDoKLQkJCQkJSVdMX0dPT0RfQ1JDX1RIX05FVkVSOwotCi0JYmFuZCA9IHByaXYtPnNjYW5fYmFuZDsKLQotCWlmIChwcml2LT5jZmctPnNjYW5fcnhfYW50ZW5uYXNbYmFuZF0pCi0JCXJ4X2FudCA9IHByaXYtPmNmZy0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXTsKLQotCXByaXYtPnNjYW5fdHhfYW50W2JhbmRdID0gaXdsNDk2NV90b2dnbGVfdHhfYW50KHByaXYsCi0JCQkJCQlwcml2LT5zY2FuX3R4X2FudFtiYW5kXSwKLQkJCQkJCSAgICBzY2FuX3R4X2FudGVubmFzKTsKLQlyYXRlX2ZsYWdzIHw9IGl3bDQ5NjVfYW50X2lkeF90b19mbGFncyhwcml2LT5zY2FuX3R4X2FudFtiYW5kXSk7Ci0Jc2Nhbi0+dHhfY21kLnJhdGVfbl9mbGFncyA9IGl3bDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlLCByYXRlX2ZsYWdzKTsKLQotCS8qIEluIHBvd2VyIHNhdmUgbW9kZSB1c2Ugb25lIGNoYWluLCBvdGhlcndpc2UgdXNlIGFsbCBjaGFpbnMgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1BPV0VSX1BNSSwgJnByaXYtPnN0YXR1cykpIHsKLQkJLyogcnhfYW50IGhhcyBiZWVuIHNldCB0byBhbGwgdmFsaWQgY2hhaW5zIHByZXZpb3VzbHkgKi8KLQkJYWN0aXZlX2NoYWlucyA9IHJ4X2FudCAmCi0JCQkJKCh1OCkocHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zKSk7Ci0JCWlmICghYWN0aXZlX2NoYWlucykKLQkJCWFjdGl2ZV9jaGFpbnMgPSByeF9hbnQ7Ci0KLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgImNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWluczogJXVcbiIsCi0JCQkJcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5hY3RpdmVfY2hhaW5zKTsKLQotCQlyeF9hbnQgPSBpd2w0OTY1X2ZpcnN0X2FudGVubmEoYWN0aXZlX2NoYWlucyk7Ci0JfQotCi0JLyogTUlNTyBpcyBub3QgdXNlZCBoZXJlLCBidXQgdmFsdWUgaXMgcmVxdWlyZWQgKi8KLQlyeF9jaGFpbiB8PSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50IDw8IFJYT05fUlhfQ0hBSU5fVkFMSURfUE9TOwotCXJ4X2NoYWluIHw9IHJ4X2FudCA8PCBSWE9OX1JYX0NIQUlOX0ZPUkNFX01JTU9fU0VMX1BPUzsKLQlyeF9jaGFpbiB8PSByeF9hbnQgPDwgUlhPTl9SWF9DSEFJTl9GT1JDRV9TRUxfUE9TOwotCXJ4X2NoYWluIHw9IDB4MSA8PCBSWE9OX1JYX0NIQUlOX0RSSVZFUl9GT1JDRV9QT1M7Ci0Jc2Nhbi0+cnhfY2hhaW4gPSBjcHVfdG9fbGUxNihyeF9jaGFpbik7Ci0KLQljbWRfbGVuID0gaXdsX2xlZ2FjeV9maWxsX3Byb2JlX3JlcShwcml2LAotCQkJCQkoc3RydWN0IGllZWU4MDIxMV9tZ210ICopc2Nhbi0+ZGF0YSwKLQkJCQkJdmlmLT5hZGRyLAotCQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPmllLAotCQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPmllX2xlbiwKLQkJCQkJSVdMX01BWF9TQ0FOX1NJWkUgLSBzaXplb2YoKnNjYW4pKTsKLQlzY2FuLT50eF9jbWQubGVuID0gY3B1X3RvX2xlMTYoY21kX2xlbik7Ci0KLQlzY2FuLT5maWx0ZXJfZmxhZ3MgfD0gKFJYT05fRklMVEVSX0FDQ0VQVF9HUlBfTVNLIHwKLQkJCSAgICAgICBSWE9OX0ZJTFRFUl9CQ09OX0FXQVJFX01TSyk7Ci0KLQlzY2FuLT5jaGFubmVsX2NvdW50ID0gaXdsNDk2NV9nZXRfY2hhbm5lbHNfZm9yX3NjYW4ocHJpdiwgdmlmLCBiYW5kLAotCQkJCQkJaXNfYWN0aXZlLCBuX3Byb2JlcywKLQkJCQkJCSh2b2lkICopJnNjYW4tPmRhdGFbY21kX2xlbl0pOwotCWlmIChzY2FuLT5jaGFubmVsX2NvdW50ID09IDApIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgImNoYW5uZWwgY291bnQgJWRcbiIsIHNjYW4tPmNoYW5uZWxfY291bnQpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQljbWQubGVuICs9IGxlMTZfdG9fY3B1KHNjYW4tPnR4X2NtZC5sZW4pICsKLQkgICAgc2Nhbi0+Y2hhbm5lbF9jb3VudCAqIHNpemVvZihzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbCk7Ci0JY21kLmRhdGEgPSBzY2FuOwotCXNjYW4tPmxlbiA9IGNwdV90b19sZTE2KGNtZC5sZW4pOwotCi0Jc2V0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMocHJpdiwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJY2xlYXJfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBpd2w0OTY1X21hbmFnZV9pYnNzX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGJvb2wgYWRkKQotewotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCi0JaWYgKGFkZCkKLQkJcmV0dXJuIGl3bDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24ocHJpdiwgdmlmX3ByaXYtPmN0eCwKLQkJCQkJCXZpZi0+YnNzX2NvbmYuYnNzaWQsCi0JCQkJCQkmdmlmX3ByaXYtPmlic3NfYnNzaWRfc3RhX2lkKTsKLQlyZXR1cm4gaXdsX2xlZ2FjeV9yZW1vdmVfc3RhdGlvbihwcml2LCB2aWZfcHJpdi0+aWJzc19ic3NpZF9zdGFfaWQsCi0JCQkJICB2aWYtPmJzc19jb25mLmJzc2lkKTsKLX0KLQotdm9pZCBpd2w0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyZWVkKQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnN0YV9sb2NrKTsKLQotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUgPj0gZnJlZWQpCi0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSAtPSBmcmVlZDsKLQllbHNlIHsKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJmcmVlIG1vcmUgdGhhbiB0ZmRzX2luX3F1ZXVlICgldTolZClcbiIsCi0JCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUsCi0JCQlmcmVlZCk7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0udGZkc19pbl9xdWV1ZSA9IDA7Ci0JfQotfQotCi0jZGVmaW5lIElXTF9UWF9RVUVVRV9NU0sJMHhmZmZmZgotCi1zdGF0aWMgYm9vbCBpd2w0OTY1X2lzX3NpbmdsZV9yeF9zdHJlYW0oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiBwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zbXBzID09IElFRUU4MDIxMV9TTVBTX1NUQVRJQyB8fAotCSAgICAgICBwcml2LT5jdXJyZW50X2h0X2NvbmZpZy5zaW5nbGVfY2hhaW5fc3VmZmljaWVudDsKLX0KLQotI2RlZmluZSBJV0xfTlVNX1JYX0NIQUlOU19NVUxUSVBMRQkzCi0jZGVmaW5lIElXTF9OVU1fUlhfQ0hBSU5TX1NJTkdMRQkyCi0jZGVmaW5lIElXTF9OVU1fSURMRV9DSEFJTlNfRFVBTAkyCi0jZGVmaW5lIElXTF9OVU1fSURMRV9DSEFJTlNfU0lOR0xFCTEKLQotLyoKLSAqIERldGVybWluZSBob3cgbWFueSByZWNlaXZlci9hbnRlbm5hIGNoYWlucyB0byB1c2UuCi0gKgotICogTW9yZSBwcm92aWRlcyBiZXR0ZXIgcmVjZXB0aW9uIHZpYSBkaXZlcnNpdHkuICBGZXdlciBzYXZlcyBwb3dlcgotICogYXQgdGhlIGV4cGVuc2Ugb2YgdGhyb3VnaHB1dCwgYnV0IG9ubHkgd2hlbiBub3QgaW4gcG93ZXJzYXZlIHRvCi0gKiBzdGFydCB3aXRoLgotICoKLSAqIE1JTU8gKGR1YWwgc3RyZWFtKSByZXF1aXJlcyBhdCBsZWFzdCAyLCBidXQgd29ya3MgYmV0dGVyIHdpdGggMy4KLSAqIFRoaXMgZG9lcyBub3QgZGV0ZXJtaW5lICp3aGljaCogY2hhaW5zIHRvIHVzZSwganVzdCBob3cgbWFueS4KLSAqLwotc3RhdGljIGludCBpd2w0OTY1X2dldF9hY3RpdmVfcnhfY2hhaW5fY291bnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qICMgb2YgUnggY2hhaW5zIHRvIHVzZSB3aGVuIGV4cGVjdGluZyBNSU1PLiAqLwotCWlmIChpd2w0OTY1X2lzX3NpbmdsZV9yeF9zdHJlYW0ocHJpdikpCi0JCXJldHVybiBJV0xfTlVNX1JYX0NIQUlOU19TSU5HTEU7Ci0JZWxzZQotCQlyZXR1cm4gSVdMX05VTV9SWF9DSEFJTlNfTVVMVElQTEU7Ci19Ci0KLS8qCi0gKiBXaGVuIHdlIGFyZSBpbiBwb3dlciBzYXZpbmcgbW9kZSwgdW5sZXNzIGRldmljZSBzdXBwb3J0IHNwYXRpYWwKLSAqIG11bHRpcGxleGluZyBwb3dlciBzYXZlLCB1c2UgdGhlIGFjdGl2ZSBjb3VudCBmb3IgcnggY2hhaW4gY291bnQuCi0gKi8KLXN0YXRpYyBpbnQKLWl3bDQ5NjVfZ2V0X2lkbGVfcnhfY2hhaW5fY291bnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgYWN0aXZlX2NudCkKLXsKLQkvKiAjIFJ4IGNoYWlucyB3aGVuIGlkbGluZywgZGVwZW5kaW5nIG9uIFNNUFMgbW9kZSAqLwotCXN3aXRjaCAocHJpdi0+Y3VycmVudF9odF9jb25maWcuc21wcykgewotCWNhc2UgSUVFRTgwMjExX1NNUFNfU1RBVElDOgotCWNhc2UgSUVFRTgwMjExX1NNUFNfRFlOQU1JQzoKLQkJcmV0dXJuIElXTF9OVU1fSURMRV9DSEFJTlNfU0lOR0xFOwotCWNhc2UgSUVFRTgwMjExX1NNUFNfT0ZGOgotCQlyZXR1cm4gYWN0aXZlX2NudDsKLQlkZWZhdWx0OgotCQlXQVJOKDEsICJpbnZhbGlkIFNNUFMgbW9kZSAlZCIsCi0JCSAgICAgcHJpdi0+Y3VycmVudF9odF9jb25maWcuc21wcyk7Ci0JCXJldHVybiBhY3RpdmVfY250OwotCX0KLX0KLQotLyogdXAgdG8gNCBjaGFpbnMgKi8KLXN0YXRpYyB1OCBpd2w0OTY1X2NvdW50X2NoYWluX2JpdG1hcCh1MzIgY2hhaW5fYml0bWFwKQotewotCXU4IHJlczsKLQlyZXMgPSAoY2hhaW5fYml0bWFwICYgQklUKDApKSA+PiAwOwotCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDEpKSA+PiAxOwotCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDIpKSA+PiAyOwotCXJlcyArPSAoY2hhaW5fYml0bWFwICYgQklUKDMpKSA+PiAzOwotCXJldHVybiByZXM7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9zZXRfcnhvbl9jaGFpbiAtIFNldCB1cCBSeCBjaGFpbiB1c2FnZSBpbiAic3RhZ2luZyIgUlhPTiBpbWFnZQotICoKLSAqIFNlbGVjdHMgaG93IG1hbnkgYW5kIHdoaWNoIFJ4IHJlY2VpdmVycy9hbnRlbm5hcy9jaGFpbnMgdG8gdXNlLgotICogVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZm9yIHNjYW4gY29tbWFuZCAuLi4gaXQgcHV0cyBkYXRhIGluIHdyb25nIHBsYWNlLgotICovCi12b2lkIGl3bDQ5NjVfc2V0X3J4b25fY2hhaW4oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCWJvb2wgaXNfc2luZ2xlID0gaXdsNDk2NV9pc19zaW5nbGVfcnhfc3RyZWFtKHByaXYpOwotCWJvb2wgaXNfY2FtID0gIXRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpOwotCXU4IGlkbGVfcnhfY250LCBhY3RpdmVfcnhfY250LCB2YWxpZF9yeF9jbnQ7Ci0JdTMyIGFjdGl2ZV9jaGFpbnM7Ci0JdTE2IHJ4X2NoYWluOwotCi0JLyogVGVsbCB1Q29kZSB3aGljaCBhbnRlbm5hcyBhcmUgYWN0dWFsbHkgY29ubmVjdGVkLgotCSAqIEJlZm9yZSBmaXJzdCBhc3NvY2lhdGlvbiwgd2UgYXNzdW1lIGFsbCBhbnRlbm5hcyBhcmUgY29ubmVjdGVkLgotCSAqIEp1c3QgYWZ0ZXIgZmlyc3QgYXNzb2NpYXRpb24sIGl3bDQ5NjVfY2hhaW5fbm9pc2VfY2FsaWJyYXRpb24oKQotCSAqICAgIGNoZWNrcyB3aGljaCBhbnRlbm5hcyBhY3R1YWxseSAqYXJlKiBjb25uZWN0ZWQuICovCi0JaWYgKHByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucykKLQkJYWN0aXZlX2NoYWlucyA9IHByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWluczsKLQllbHNlCi0JCWFjdGl2ZV9jaGFpbnMgPSBwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50OwotCi0JcnhfY2hhaW4gPSBhY3RpdmVfY2hhaW5zIDw8IFJYT05fUlhfQ0hBSU5fVkFMSURfUE9TOwotCi0JLyogSG93IG1hbnkgcmVjZWl2ZXJzIHNob3VsZCB3ZSB1c2U/ICovCi0JYWN0aXZlX3J4X2NudCA9IGl3bDQ5NjVfZ2V0X2FjdGl2ZV9yeF9jaGFpbl9jb3VudChwcml2KTsKLQlpZGxlX3J4X2NudCA9IGl3bDQ5NjVfZ2V0X2lkbGVfcnhfY2hhaW5fY291bnQocHJpdiwgYWN0aXZlX3J4X2NudCk7Ci0KLQotCS8qIGNvcnJlY3QgcnggY2hhaW4gY291bnQgYWNjb3JkaW5nIGh3IHNldHRpbmdzCi0JICogYW5kIGNoYWluIG5vaXNlIGNhbGlicmF0aW9uCi0JICovCi0JdmFsaWRfcnhfY250ID0gaXdsNDk2NV9jb3VudF9jaGFpbl9iaXRtYXAoYWN0aXZlX2NoYWlucyk7Ci0JaWYgKHZhbGlkX3J4X2NudCA8IGFjdGl2ZV9yeF9jbnQpCi0JCWFjdGl2ZV9yeF9jbnQgPSB2YWxpZF9yeF9jbnQ7Ci0KLQlpZiAodmFsaWRfcnhfY250IDwgaWRsZV9yeF9jbnQpCi0JCWlkbGVfcnhfY250ID0gdmFsaWRfcnhfY250OwotCi0JcnhfY2hhaW4gfD0gYWN0aXZlX3J4X2NudCA8PCBSWE9OX1JYX0NIQUlOX01JTU9fQ05UX1BPUzsKLQlyeF9jaGFpbiB8PSBpZGxlX3J4X2NudCAgPDwgUlhPTl9SWF9DSEFJTl9DTlRfUE9TOwotCi0JY3R4LT5zdGFnaW5nLnJ4X2NoYWluID0gY3B1X3RvX2xlMTYocnhfY2hhaW4pOwotCi0JaWYgKCFpc19zaW5nbGUgJiYgKGFjdGl2ZV9yeF9jbnQgPj0gSVdMX05VTV9SWF9DSEFJTlNfU0lOR0xFKSAmJiBpc19jYW0pCi0JCWN0eC0+c3RhZ2luZy5yeF9jaGFpbiB8PSBSWE9OX1JYX0NIQUlOX01JTU9fRk9SQ0VfTVNLOwotCWVsc2UKLQkJY3R4LT5zdGFnaW5nLnJ4X2NoYWluICY9IH5SWE9OX1JYX0NIQUlOX01JTU9fRk9SQ0VfTVNLOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJyeF9jaGFpbj0weCVYIGFjdGl2ZT0lZCBpZGxlPSVkXG4iLAotCQkJY3R4LT5zdGFnaW5nLnJ4X2NoYWluLAotCQkJYWN0aXZlX3J4X2NudCwgaWRsZV9yeF9jbnQpOwotCi0JV0FSTl9PTihhY3RpdmVfcnhfY250ID09IDAgfHwgaWRsZV9yeF9jbnQgPT0gMCB8fAotCQlhY3RpdmVfcnhfY250IDwgaWRsZV9yeF9jbnQpOwotfQotCi11OCBpd2w0OTY1X3RvZ2dsZV90eF9hbnQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBhbnQsIHU4IHZhbGlkKQotewotCWludCBpOwotCXU4IGluZCA9IGFudDsKLQotCWZvciAoaSA9IDA7IGkgPCBSQVRFX0FOVF9OVU0gLSAxOyBpKyspIHsKLQkJaW5kID0gKGluZCArIDEpIDwgUkFURV9BTlRfTlVNID8gIGluZCArIDEgOiAwOwotCQlpZiAodmFsaWQgJiBCSVQoaW5kKSkKLQkJCXJldHVybiBpbmQ7Ci0JfQotCXJldHVybiBhbnQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICppd2w0OTY1X2dldF9maF9zdHJpbmcoaW50IGNtZCkKLXsKLQlzd2l0Y2ggKGNtZCkgewotCUlXTF9DTUQoRkhfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRyk7Ci0JSVdMX0NNRChGSF9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRyk7Ci0JSVdMX0NNRChGSF9SU0NTUl9DSE5MMF9XUFRSKTsKLQlJV0xfQ01EKEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcpOwotCUlXTF9DTUQoRkhfTUVNX1JTU1JfU0hBUkVEX0NUUkxfUkVHKTsKLQlJV0xfQ01EKEZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcpOwotCUlXTF9DTUQoRkhfTUVNX1JTU1JfUlhfRU5BQkxFX0VSUl9JUlEyRFJWKTsKLQlJV0xfQ01EKEZIX1RTU1JfVFhfU1RBVFVTX1JFRyk7Ci0JSVdMX0NNRChGSF9UU1NSX1RYX0VSUk9SX1JFRyk7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJVTktOT1dOIjsKLQl9Ci19Ci0KLWludCBpd2w0OTY1X2R1bXBfZmgoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpCi17Ci0JaW50IGk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaW50IHBvcyA9IDA7Ci0Jc2l6ZV90IGJ1ZnN6ID0gMDsKLSNlbmRpZgotCXN0YXRpYyBjb25zdCB1MzIgZmhfdGJsW10gPSB7Ci0JCUZIX1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcsCi0JCUZIX1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHLAotCQlGSF9SU0NTUl9DSE5MMF9XUFRSLAotCQlGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHLAotCQlGSF9NRU1fUlNTUl9TSEFSRURfQ1RSTF9SRUcsCi0JCUZIX01FTV9SU1NSX1JYX1NUQVRVU19SRUcsCi0JCUZIX01FTV9SU1NSX1JYX0VOQUJMRV9FUlJfSVJRMkRSViwKLQkJRkhfVFNTUl9UWF9TVEFUVVNfUkVHLAotCQlGSF9UU1NSX1RYX0VSUk9SX1JFRwotCX07Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKGRpc3BsYXkpIHsKLQkJYnVmc3ogPSBBUlJBWV9TSVpFKGZoX3RibCkgKiA0OCArIDQwOwotCQkqYnVmID0ga21hbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghKmJ1ZikKLQkJCXJldHVybiAtRU5PTUVNOwotCQlwb3MgKz0gc2NucHJpbnRmKCpidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJGSCByZWdpc3RlciB2YWx1ZXM6XG4iKTsKLQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZmhfdGJsKTsgaSsrKSB7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKCpidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSIgICUzNHM6IDBYJTA4eFxuIiwKLQkJCQlpd2w0OTY1X2dldF9maF9zdHJpbmcoZmhfdGJsW2ldKSwKLQkJCQlpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgZmhfdGJsW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0jZW5kaWYKLQlJV0xfRVJSKHByaXYsICJGSCByZWdpc3RlciB2YWx1ZXM6XG4iKTsKLQlmb3IgKGkgPSAwOyBpIDwgIEFSUkFZX1NJWkUoZmhfdGJsKTsgaSsrKSB7Ci0JCUlXTF9FUlIocHJpdiwgIiAgJTM0czogMFglMDh4XG4iLAotCQkJaXdsNDk2NV9nZXRfZmhfc3RyaW5nKGZoX3RibFtpXSksCi0JCQlpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgZmhfdGJsW2ldKSk7Ci0JfQotCXJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZWJlMjEuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDI4NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC00OTY1LmgiCi0KLSNkZWZpbmUgSVdMNDk2NV9SU19OQU1FICJpd2wtNDk2NS1ycyIKLQotI2RlZmluZSBOVU1fVFJZX0JFRk9SRV9BTlRfVE9HR0xFIDEKLSNkZWZpbmUgSVdMX05VTUJFUl9UUlkgICAgICAxCi0jZGVmaW5lIElXTF9IVF9OVU1CRVJfVFJZICAgMwotCi0jZGVmaW5lIElXTF9SQVRFX01BWF9XSU5ET1cJCTYyCS8qICMgdHggaW4gaGlzdG9yeSB3aW5kb3cgKi8KLSNkZWZpbmUgSVdMX1JBVEVfTUlOX0ZBSUxVUkVfVEgJCTYJLyogbWluIGZhaWx1cmVzIHRvIGNhbGMgdHB0ICovCi0jZGVmaW5lIElXTF9SQVRFX01JTl9TVUNDRVNTX1RICQk4CS8qIG1pbiBzdWNjZXNzZXMgdG8gY2FsYyB0cHQgKi8KLQotLyogbWF4IGFsbG93ZWQgcmF0ZSBtaXNzIGJlZm9yZSBzeW5jIExRIGNtZCAqLwotI2RlZmluZSBJV0xfTUlTU0VEX1JBVEVfTUFYCQkxNQotLyogbWF4IHRpbWUgdG8gYWNjdW0gaGlzdG9yeSAyIHNlY29uZHMgKi8KLSNkZWZpbmUgSVdMX1JBVEVfU0NBTEVfRkxVU0hfSU5UVkwgICAoMypIWikKLQotc3RhdGljIHU4IHJzX2h0X3RvX2xlZ2FjeVtdID0gewotCUlXTF9SQVRFXzZNX0lOREVYLCBJV0xfUkFURV82TV9JTkRFWCwKLQlJV0xfUkFURV82TV9JTkRFWCwgSVdMX1JBVEVfNk1fSU5ERVgsCi0JSVdMX1JBVEVfNk1fSU5ERVgsCi0JSVdMX1JBVEVfNk1fSU5ERVgsIElXTF9SQVRFXzlNX0lOREVYLAotCUlXTF9SQVRFXzEyTV9JTkRFWCwgSVdMX1JBVEVfMThNX0lOREVYLAotCUlXTF9SQVRFXzI0TV9JTkRFWCwgSVdMX1JBVEVfMzZNX0lOREVYLAotCUlXTF9SQVRFXzQ4TV9JTkRFWCwgSVdMX1JBVEVfNTRNX0lOREVYCi19OwotCi1zdGF0aWMgY29uc3QgdTggYW50X3RvZ2dsZV9sb29rdXBbXSA9IHsKLQkvKkFOVF9OT05FIC0+ICovIEFOVF9OT05FLAotCS8qQU5UX0EgICAgLT4gKi8gQU5UX0IsCi0JLypBTlRfQiAgICAtPiAqLyBBTlRfQywKLQkvKkFOVF9BQiAgIC0+ICovIEFOVF9CQywKLQkvKkFOVF9DICAgIC0+ICovIEFOVF9BLAotCS8qQU5UX0FDICAgLT4gKi8gQU5UX0FCLAotCS8qQU5UX0JDICAgLT4gKi8gQU5UX0FDLAotCS8qQU5UX0FCQyAgLT4gKi8gQU5UX0FCQywKLX07Ci0KLSNkZWZpbmUgSVdMX0RFQ0xBUkVfUkFURV9JTkZPKHIsIHMsIGlwLCBpbiwgcnAsIHJuLCBwcCwgbnApICAgIFwKLQlbSVdMX1JBVEVfIyNyIyNNX0lOREVYXSA9IHsgSVdMX1JBVEVfIyNyIyNNX1BMQ1AsICAgICAgXAotCQkJCSAgICBJV0xfUkFURV9TSVNPXyMjcyMjTV9QTENQLCBcCi0JCQkJICAgIElXTF9SQVRFX01JTU8yXyMjcyMjTV9QTENQLFwKLQkJCQkgICAgSVdMX1JBVEVfIyNyIyNNX0lFRUUsICAgICAgXAotCQkJCSAgICBJV0xfUkFURV8jI2lwIyNNX0lOREVYLCAgICBcCi0JCQkJICAgIElXTF9SQVRFXyMjaW4jI01fSU5ERVgsICAgIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNycCMjTV9JTkRFWCwgICAgXAotCQkJCSAgICBJV0xfUkFURV8jI3JuIyNNX0lOREVYLCAgICBcCi0JCQkJICAgIElXTF9SQVRFXyMjcHAjI01fSU5ERVgsICAgIFwKLQkJCQkgICAgSVdMX1JBVEVfIyNucCMjTV9JTkRFWCB9Ci0KLS8qCi0gKiBQYXJhbWV0ZXIgb3JkZXI6Ci0gKiAgIHJhdGUsIGh0IHJhdGUsIHByZXYgcmF0ZSwgbmV4dCByYXRlLCBwcmV2IHRnZyByYXRlLCBuZXh0IHRnZyByYXRlCi0gKgotICogSWYgdGhlcmUgaXNuJ3QgYSB2YWxpZCBuZXh0IG9yIHByZXZpb3VzIHJhdGUgdGhlbiBJTlYgaXMgdXNlZCB3aGljaAotICogbWFwcyB0byBJV0xfUkFURV9JTlZBTElECi0gKgotICovCi1jb25zdCBzdHJ1Y3QgaXdsX3JhdGVfaW5mbyBpd2xlZ2FjeV9yYXRlc1tJV0xfUkFURV9DT1VOVF0gPSB7Ci0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDEsIElOViwgSU5WLCAyLCBJTlYsIDIsIElOViwgMiksICAgIC8qICAxbWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTygyLCBJTlYsIDEsIDUsIDEsIDUsIDEsIDUpLCAgICAgICAgICAvKiAgMm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNSwgSU5WLCAyLCA2LCAyLCAxMSwgMiwgMTEpLCAgICAgICAgLyo1LjVtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDExLCBJTlYsIDksIDEyLCA5LCAxMiwgNSwgMTgpLCAgICAgIC8qIDExbWJwcyAqLwotCUlXTF9ERUNMQVJFX1JBVEVfSU5GTyg2LCA2LCA1LCA5LCA1LCAxMSwgNSwgMTEpLCAgICAgICAgLyogIDZtYnBzICovCi0JSVdMX0RFQ0xBUkVfUkFURV9JTkZPKDksIDYsIDYsIDExLCA2LCAxMSwgNSwgMTEpLCAgICAgICAvKiAgOW1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTIsIDEyLCAxMSwgMTgsIDExLCAxOCwgMTEsIDE4KSwgICAvKiAxMm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMTgsIDE4LCAxMiwgMjQsIDEyLCAyNCwgMTEsIDI0KSwgICAvKiAxOG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMjQsIDI0LCAxOCwgMzYsIDE4LCAzNiwgMTgsIDM2KSwgICAvKiAyNG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oMzYsIDM2LCAyNCwgNDgsIDI0LCA0OCwgMjQsIDQ4KSwgICAvKiAzNm1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNDgsIDQ4LCAzNiwgNTQsIDM2LCA1NCwgMzYsIDU0KSwgICAvKiA0OG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNTQsIDU0LCA0OCwgSU5WLCA0OCwgSU5WLCA0OCwgSU5WKSwvKiA1NG1icHMgKi8KLQlJV0xfREVDTEFSRV9SQVRFX0lORk8oNjAsIDYwLCA0OCwgSU5WLCA0OCwgSU5WLCA0OCwgSU5WKSwvKiA2MG1icHMgKi8KLX07Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgodTMyIHJhdGVfbl9mbGFncykKLXsKLQlpbnQgaWR4ID0gMDsKLQotCS8qIEhUIHJhdGUgZm9ybWF0ICovCi0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykgewotCQlpZHggPSAocmF0ZV9uX2ZsYWdzICYgMHhmZik7Ci0KLQkJaWYgKGlkeCA+PSBJV0xfUkFURV9NSU1PMl82TV9QTENQKQotCQkJaWR4ID0gaWR4IC0gSVdMX1JBVEVfTUlNTzJfNk1fUExDUDsKLQotCQlpZHggKz0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJLyogc2tpcCA5TSBub3Qgc3VwcG9ydGVkIGluIGh0Ki8KLQkJaWYgKGlkeCA+PSBJV0xfUkFURV85TV9JTkRFWCkKLQkJCWlkeCArPSAxOwotCQlpZiAoKGlkeCA+PSBJV0xfRklSU1RfT0ZETV9SQVRFKSAmJiAoaWR4IDw9IElXTF9MQVNUX09GRE1fUkFURSkpCi0JCQlyZXR1cm4gaWR4OwotCi0JLyogbGVnYWN5IHJhdGUgZm9ybWF0LCBzZWFyY2ggZm9yIG1hdGNoIGluIHRhYmxlICovCi0JfSBlbHNlIHsKLQkJZm9yIChpZHggPSAwOyBpZHggPCBBUlJBWV9TSVpFKGl3bGVnYWN5X3JhdGVzKTsgaWR4KyspCi0JCQlpZiAoaXdsZWdhY3lfcmF0ZXNbaWR4XS5wbGNwID09IChyYXRlX25fZmxhZ3MgJiAweEZGKSkKLQkJCQlyZXR1cm4gaWR4OwotCX0KLQotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19yYXRlX3NjYWxlX3BlcmZvcm0oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQkgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhKTsKLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfZmlsbF9saW5rX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsIHUzMiByYXRlX25fZmxhZ3MpOwotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJCWJvb2wgZm9yY2Vfc2VhcmNoKTsKLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3Moc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCSAgICAgdTMyICpyYXRlX25fZmxhZ3MsIGludCBpbmRleCk7Ci0jZWxzZQotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19kYmdmc19zZXRfbWNzKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkgICAgIHUzMiAqcmF0ZV9uX2ZsYWdzLCBpbnQgaW5kZXgpCi17fQotI2VuZGlmCi0KLS8qKgotICogVGhlIGZvbGxvd2luZyB0YWJsZXMgY29udGFpbiB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCBtZXRyaWNzIGZvciBhbGwgcmF0ZXMKLSAqCi0gKgkxLCAyLCA1LjUsIDExLCA2LCA5LCAxMiwgMTgsIDI0LCAzNiwgNDgsIDU0LCA2MCBNQml0cwotICoKLSAqIHdoZXJlIGludmFsaWQgZW50cmllcyBhcmUgemVyb3MuCi0gKgotICogQ0NLIHJhdGVzIGFyZSBvbmx5IHZhbGlkIGluIGxlZ2FjeSB0YWJsZSBhbmQgd2lsbCBvbmx5IGJlIHVzZWQgaW4gRwotICogKDIuNCBHSHopIGJhbmQuCi0gKi8KLQotc3RhdGljIHMzMiBleHBlY3RlZF90cHRfbGVnYWN5W0lXTF9SQVRFX0NPVU5UXSA9IHsKLQk3LCAxMywgMzUsIDU4LCA0MCwgNTcsIDcyLCA5OCwgMTIxLCAxNTQsIDE3NywgMTg2LCAwCi19OwotCi1zdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9zaXNvMjBNSHpbNF1bSVdMX1JBVEVfQ09VTlRdID0gewotCXswLCAwLCAwLCAwLCA0MiwgMCwgIDc2LCAxMDIsIDEyNCwgMTU4LCAxODMsIDE5MywgMjAyfSwgLyogTm9ybSAqLwotCXswLCAwLCAwLCAwLCA0NiwgMCwgIDgyLCAxMTAsIDEzMiwgMTY3LCAxOTIsIDIwMiwgMjEwfSwgLyogU0dJICovCi0JezAsIDAsIDAsIDAsIDQ4LCAwLCAgOTMsIDEzNSwgMTc2LCAyNTEsIDMxOSwgMzUxLCAzODF9LCAvKiBBR0cgKi8KLQl7MCwgMCwgMCwgMCwgNTMsIDAsIDEwMiwgMTQ5LCAxOTMsIDI3NSwgMzQ4LCAzODEsIDQxM30sIC8qIEFHRytTR0kgKi8KLX07Ci0KLXN0YXRpYyBzMzIgZXhwZWN0ZWRfdHB0X3Npc280ME1Iels0XVtJV0xfUkFURV9DT1VOVF0gPSB7Ci0JezAsIDAsIDAsIDAsICA3NywgMCwgMTI3LCAxNjAsIDE4NCwgMjIwLCAyNDIsIDI1MCwgMjU3fSwgLyogTm9ybSAqLwotCXswLCAwLCAwLCAwLCAgODMsIDAsIDEzNSwgMTY5LCAxOTMsIDIyOSwgMjUwLCAyNTcsIDI2NH0sIC8qIFNHSSAqLwotCXswLCAwLCAwLCAwLCAgOTYsIDAsIDE4MiwgMjU5LCAzMjgsIDQ1MSwgNTUzLCA1OTgsIDY0MH0sIC8qIEFHRyAqLwotCXswLCAwLCAwLCAwLCAxMDYsIDAsIDE5OSwgMjgyLCAzNTcsIDQ4NywgNTkzLCA2NDAsIDY4M30sIC8qIEFHRytTR0kgKi8KLX07Ci0KLXN0YXRpYyBzMzIgZXhwZWN0ZWRfdHB0X21pbW8yXzIwTUh6WzRdW0lXTF9SQVRFX0NPVU5UXSA9IHsKLQl7MCwgMCwgMCwgMCwgIDc0LCAwLCAxMjMsIDE1NSwgMTc5LCAyMTMsIDIzNSwgMjQzLCAyNTB9LCAvKiBOb3JtICovCi0JezAsIDAsIDAsIDAsICA4MSwgMCwgMTMxLCAxNjQsIDE4NywgMjIxLCAyNDIsIDI1MCwgMjU2fSwgLyogU0dJICovCi0JezAsIDAsIDAsIDAsICA5MiwgMCwgMTc1LCAyNTAsIDMxNywgNDM2LCA1MzQsIDU3OCwgNjE5fSwgLyogQUdHICovCi0JezAsIDAsIDAsIDAsIDEwMiwgMCwgMTkyLCAyNzMsIDM0NCwgNDcwLCA1NzMsIDYxOSwgNjYwfSwgLyogQUdHK1NHSSovCi19OwotCi1zdGF0aWMgczMyIGV4cGVjdGVkX3RwdF9taW1vMl80ME1Iels0XVtJV0xfUkFURV9DT1VOVF0gPSB7Ci0JezAsIDAsIDAsIDAsIDEyMywgMCwgMTgyLCAyMTQsIDIzNSwgMjY0LCAyNzksIDI4NSwgMjg5fSwgLyogTm9ybSAqLwotCXswLCAwLCAwLCAwLCAxMzEsIDAsIDE5MSwgMjIyLCAyNDIsIDI3MCwgMjg0LCAyODksIDI5M30sIC8qIFNHSSAqLwotCXswLCAwLCAwLCAwLCAxODAsIDAsIDMyNywgNDQ2LCA1NDUsIDcwOCwgODI4LCA4NzgsIDkyMn0sIC8qIEFHRyAqLwotCXswLCAwLCAwLCAwLCAxOTcsIDAsIDM1NSwgNDgxLCA1ODQsIDc1MiwgODcyLCA5MjIsIDk2Nn0sIC8qIEFHRytTR0kgKi8KLX07Ci0KLS8qIG1icHMsIG1jcyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfcmF0ZV9tY3NfaW5mbyBpd2xfcmF0ZV9tY3NbSVdMX1JBVEVfQ09VTlRdID0gewotCXsgICIxIiwgIkJQU0sgRFNTUyJ9LAotCXsgICIyIiwgIlFQU0sgRFNTUyJ9LAotCXsiNS41IiwgIkJQU0sgQ0NLIn0sCi0JeyAiMTEiLCAiUVBTSyBDQ0sifSwKLQl7ICAiNiIsICJCUFNLIDEvMiJ9LAotCXsgICI5IiwgIkJQU0sgMS8yIn0sCi0JeyAiMTIiLCAiUVBTSyAxLzIifSwKLQl7ICIxOCIsICJRUFNLIDMvNCJ9LAotCXsgIjI0IiwgIjE2UUFNIDEvMiJ9LAotCXsgIjM2IiwgIjE2UUFNIDMvNCJ9LAotCXsgIjQ4IiwgIjY0UUFNIDIvMyJ9LAotCXsgIjU0IiwgIjY0UUFNIDMvNCJ9LAotCXsgIjYwIiwgIjY0UUFNIDUvNiJ9LAotfTsKLQotI2RlZmluZSBNQ1NfSU5ERVhfUEVSX1NUUkVBTQkoOCkKLQotc3RhdGljIGlubGluZSB1OCBpd2w0OTY1X3JzX2V4dHJhY3RfcmF0ZSh1MzIgcmF0ZV9uX2ZsYWdzKQotewotCXJldHVybiAodTgpKHJhdGVfbl9mbGFncyAmIDB4RkYpOwotfQotCi1zdGF0aWMgdm9pZAotaXdsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdyhzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSAqd2luZG93KQotewotCXdpbmRvdy0+ZGF0YSA9IDA7Ci0Jd2luZG93LT5zdWNjZXNzX2NvdW50ZXIgPSAwOwotCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA9IElXTF9JTlZBTElEX1ZBTFVFOwotCXdpbmRvdy0+Y291bnRlciA9IDA7Ci0Jd2luZG93LT5hdmVyYWdlX3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCXdpbmRvdy0+c3RhbXAgPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDQ5NjVfcnNfaXNfdmFsaWRfYW50KHU4IHZhbGlkX2FudGVubmEsIHU4IGFudF90eXBlKQotewotCXJldHVybiAoYW50X3R5cGUgJiB2YWxpZF9hbnRlbm5hKSA9PSBhbnRfdHlwZTsKLX0KLQotLyoKLSAqCXJlbW92ZXMgdGhlIG9sZCBkYXRhIGZyb20gdGhlIHN0YXRpc3RpY3MuIEFsbCBkYXRhIHRoYXQgaXMgb2xkZXIgdGhhbgotICoJVElEX01BWF9USU1FX0RJRkYsIHdpbGwgYmUgZGVsZXRlZC4KLSAqLwotc3RhdGljIHZvaWQKLWl3bDQ5NjVfcnNfdGxfcm1fb2xkX3N0YXRzKHN0cnVjdCBpd2xfdHJhZmZpY19sb2FkICp0bCwgdTMyIGN1cnJfdGltZSkKLXsKLQkvKiBUaGUgb2xkZXN0IGFnZSB3ZSB3YW50IHRvIGtlZXAgKi8KLQl1MzIgb2xkZXN0X3RpbWUgPSBjdXJyX3RpbWUgLSBUSURfTUFYX1RJTUVfRElGRjsKLQotCXdoaWxlICh0bC0+cXVldWVfY291bnQgJiYKLQkgICAgICAgKHRsLT50aW1lX3N0YW1wIDwgb2xkZXN0X3RpbWUpKSB7Ci0JCXRsLT50b3RhbCAtPSB0bC0+cGFja2V0X2NvdW50W3RsLT5oZWFkXTsKLQkJdGwtPnBhY2tldF9jb3VudFt0bC0+aGVhZF0gPSAwOwotCQl0bC0+dGltZV9zdGFtcCArPSBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HOwotCQl0bC0+cXVldWVfY291bnQtLTsKLQkJdGwtPmhlYWQrKzsKLQkJaWYgKHRsLT5oZWFkID49IFRJRF9RVUVVRV9NQVhfU0laRSkKLQkJCXRsLT5oZWFkID0gMDsKLQl9Ci19Ci0KLS8qCi0gKglpbmNyZW1lbnQgdHJhZmZpYyBsb2FkIHZhbHVlIGZvciB0aWQgYW5kIGFsc28gcmVtb3ZlCi0gKglhbnkgb2xkIHZhbHVlcyBpZiBwYXNzZWQgdGhlIGNlcnRhaW4gdGltZSBwZXJpb2QKLSAqLwotc3RhdGljIHU4IGl3bDQ5NjVfcnNfdGxfYWRkX3BhY2tldChzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfZGF0YSwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCi17Ci0JdTMyIGN1cnJfdGltZSA9IGppZmZpZXNfdG9fbXNlY3MoamlmZmllcyk7Ci0JdTMyIHRpbWVfZGlmZjsKLQlzMzIgaW5kZXg7Ci0Jc3RydWN0IGl3bF90cmFmZmljX2xvYWQgKnRsID0gTlVMTDsKLQl1OCB0aWQ7Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJdTggKnFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0JCXRpZCA9IHFjWzBdICYgMHhmOwotCX0gZWxzZQotCQlyZXR1cm4gTUFYX1RJRF9DT1VOVDsKLQotCWlmICh1bmxpa2VseSh0aWQgPj0gVElEX01BWF9MT0FEX0NPVU5UKSkKLQkJcmV0dXJuIE1BWF9USURfQ09VTlQ7Ci0KLQl0bCA9ICZscV9kYXRhLT5sb2FkW3RpZF07Ci0KLQljdXJyX3RpbWUgLT0gY3Vycl90aW1lICUgVElEX1JPVU5EX1ZBTFVFOwotCi0JLyogSGFwcGVucyBvbmx5IGZvciB0aGUgZmlyc3QgcGFja2V0LiBJbml0aWFsaXplIHRoZSBkYXRhICovCi0JaWYgKCEodGwtPnF1ZXVlX2NvdW50KSkgewotCQl0bC0+dG90YWwgPSAxOwotCQl0bC0+dGltZV9zdGFtcCA9IGN1cnJfdGltZTsKLQkJdGwtPnF1ZXVlX2NvdW50ID0gMTsKLQkJdGwtPmhlYWQgPSAwOwotCQl0bC0+cGFja2V0X2NvdW50WzBdID0gMTsKLQkJcmV0dXJuIE1BWF9USURfQ09VTlQ7Ci0JfQotCi0JdGltZV9kaWZmID0gVElNRV9XUkFQX0FST1VORCh0bC0+dGltZV9zdGFtcCwgY3Vycl90aW1lKTsKLQlpbmRleCA9IHRpbWVfZGlmZiAvIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkc7Ci0KLQkvKiBUaGUgaGlzdG9yeSBpcyB0b28gbG9uZzogcmVtb3ZlIGRhdGEgdGhhdCBpcyBvbGRlciB0aGFuICovCi0JLyogVElEX01BWF9USU1FX0RJRkYgKi8KLQlpZiAoaW5kZXggPj0gVElEX1FVRVVFX01BWF9TSVpFKQotCQlpd2w0OTY1X3JzX3RsX3JtX29sZF9zdGF0cyh0bCwgY3Vycl90aW1lKTsKLQotCWluZGV4ID0gKHRsLT5oZWFkICsgaW5kZXgpICUgVElEX1FVRVVFX01BWF9TSVpFOwotCXRsLT5wYWNrZXRfY291bnRbaW5kZXhdID0gdGwtPnBhY2tldF9jb3VudFtpbmRleF0gKyAxOwotCXRsLT50b3RhbCA9IHRsLT50b3RhbCArIDE7Ci0KLQlpZiAoKGluZGV4ICsgMSkgPiB0bC0+cXVldWVfY291bnQpCi0JCXRsLT5xdWV1ZV9jb3VudCA9IGluZGV4ICsgMTsKLQotCXJldHVybiB0aWQ7Ci19Ci0KLS8qCi0JZ2V0IHRoZSB0cmFmZmljIGxvYWQgdmFsdWUgZm9yIHRpZAotKi8KLXN0YXRpYyB1MzIgaXdsNDk2NV9yc190bF9nZXRfbG9hZChzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfZGF0YSwgdTggdGlkKQotewotCXUzMiBjdXJyX3RpbWUgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMpOwotCXUzMiB0aW1lX2RpZmY7Ci0JczMyIGluZGV4OwotCXN0cnVjdCBpd2xfdHJhZmZpY19sb2FkICp0bCA9IE5VTEw7Ci0KLQlpZiAodGlkID49IFRJRF9NQVhfTE9BRF9DT1VOVCkKLQkJcmV0dXJuIDA7Ci0KLQl0bCA9ICYobHFfZGF0YS0+bG9hZFt0aWRdKTsKLQotCWN1cnJfdGltZSAtPSBjdXJyX3RpbWUgJSBUSURfUk9VTkRfVkFMVUU7Ci0KLQlpZiAoISh0bC0+cXVldWVfY291bnQpKQotCQlyZXR1cm4gMDsKLQotCXRpbWVfZGlmZiA9IFRJTUVfV1JBUF9BUk9VTkQodGwtPnRpbWVfc3RhbXAsIGN1cnJfdGltZSk7Ci0JaW5kZXggPSB0aW1lX2RpZmYgLyBUSURfUVVFVUVfQ0VMTF9TUEFDSU5HOwotCi0JLyogVGhlIGhpc3RvcnkgaXMgdG9vIGxvbmc6IHJlbW92ZSBkYXRhIHRoYXQgaXMgb2xkZXIgdGhhbiAqLwotCS8qIFRJRF9NQVhfVElNRV9ESUZGICovCi0JaWYgKGluZGV4ID49IFRJRF9RVUVVRV9NQVhfU0laRSkKLQkJaXdsNDk2NV9yc190bF9ybV9vbGRfc3RhdHModGwsIGN1cnJfdGltZSk7Ci0KLQlyZXR1cm4gdGwtPnRvdGFsOwotfQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfdGxfdHVybl9vbl9hZ2dfZm9yX3RpZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX2RhdGEsIHU4IHRpZCwKLQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCWludCByZXQgPSAtRUFHQUlOOwotCXUzMiBsb2FkOwotCi0JbG9hZCA9IGl3bDQ5NjVfcnNfdGxfZ2V0X2xvYWQobHFfZGF0YSwgdGlkKTsKLQotCWlmIChsb2FkID4gSVdMX0FHR19MT0FEX1RIUkVTSE9MRCkgewotCQlJV0xfREVCVUdfSFQocHJpdiwgIlN0YXJ0aW5nIFR4IGFnZzogU1RBOiAlcE0gdGlkOiAlZFxuIiwKLQkJCQlzdGEtPmFkZHIsIHRpZCk7Ci0JCXJldCA9IGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkLCA1MDAwKTsKLQkJaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCQkvKgotCQkJICogZHJpdmVyIGFuZCBtYWM4MDIxMSBpcyBvdXQgb2Ygc3luYwotCQkJICogdGhpcyBtaWdodCBiZSBjYXVzZSBieSByZWxvYWRpbmcgZmlybXdhcmUKLQkJCSAqIHN0b3AgdGhlIHR4IGJhIHNlc3Npb24gaGVyZQotCQkJICovCi0JCQlJV0xfRVJSKHByaXYsICJGYWlsIHN0YXJ0IFR4IGFnZyBvbiB0aWQ6ICVkXG4iLAotCQkJCXRpZCk7Ci0JCQlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0YSwgdGlkKTsKLQkJfQotCX0gZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIkFnZ3JlZ2F0aW9uIG5vdCBlbmFibGVkIGZvciB0aWQgJWQgIgotCQkJImJlY2F1c2UgbG9hZCA9ICV1XG4iLCB0aWQsIGxvYWQpOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX3RsX3R1cm5fb25fYWdnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggdGlkLAotCQkJICAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX2RhdGEsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCWlmICh0aWQgPCBUSURfTUFYX0xPQURfQ09VTlQpCi0JCWl3bDQ5NjVfcnNfdGxfdHVybl9vbl9hZ2dfZm9yX3RpZChwcml2LCBscV9kYXRhLCB0aWQsIHN0YSk7Ci0JZWxzZQotCQlJV0xfRVJSKHByaXYsICJ0aWQgZXhjZWVkcyBtYXggbG9hZCBjb3VudDogJWQvJWRcbiIsCi0JCQl0aWQsIFRJRF9NQVhfTE9BRF9DT1VOVCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bDQ5NjVfZ2V0X2l3bDQ5NjVfbnVtX29mX2FudF9mcm9tX3JhdGUodTMyIHJhdGVfbl9mbGFncykKLXsKLQlyZXR1cm4gISEocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0FfTVNLKSArCi0JICAgICAgICEhKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9CX01TSykgKwotCSAgICAgICAhIShyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19BTlRfQ19NU0spOwotfQotCi0vKgotICogU3RhdGljIGZ1bmN0aW9uIHRvIGdldCB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCBmcm9tIGFuIGl3bF9zY2FsZV90YmxfaW5mbwotICogdGhhdCB3cmFwcyBhIE5VTEwgcG9pbnRlciBjaGVjawotICovCi1zdGF0aWMgczMyCi1pd2w0OTY1X2dldF9leHBlY3RlZF90cHQoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgcnNfaW5kZXgpCi17Ci0JaWYgKHRibC0+ZXhwZWN0ZWRfdHB0KQotCQlyZXR1cm4gdGJsLT5leHBlY3RlZF90cHRbcnNfaW5kZXhdOwotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhIC0gVXBkYXRlIHRoZSBzdWNjZXNzL2ZhaWx1cmUgc2xpZGluZyB3aW5kb3cKLSAqCi0gKiBXZSBrZWVwIGEgc2xpZGluZyB3aW5kb3cgb2YgdGhlIGxhc3QgNjIgcGFja2V0cyB0cmFuc21pdHRlZAotICogYXQgdGhpcyByYXRlLiAgd2luZG93LT5kYXRhIGNvbnRhaW5zIHRoZSBiaXRtYXNrIG9mIHN1Y2Nlc3NmdWwKLSAqIHBhY2tldHMuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9yc19jb2xsZWN0X3R4X2RhdGEoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAotCQkJICAgICAgaW50IHNjYWxlX2luZGV4LCBpbnQgYXR0ZW1wdHMsIGludCBzdWNjZXNzZXMpCi17Ci0Jc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdyA9IE5VTEw7Ci0Jc3RhdGljIGNvbnN0IHU2NCBtYXNrID0gKCgodTY0KTEpIDw8IChJV0xfUkFURV9NQVhfV0lORE9XIC0gMSkpOwotCXMzMiBmYWlsX2NvdW50LCB0cHQ7Ci0KLQlpZiAoc2NhbGVfaW5kZXggPCAwIHx8IHNjYWxlX2luZGV4ID49IElXTF9SQVRFX0NPVU5UKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qIFNlbGVjdCB3aW5kb3cgZm9yIGN1cnJlbnQgdHggYml0IHJhdGUgKi8KLQl3aW5kb3cgPSAmKHRibC0+d2luW3NjYWxlX2luZGV4XSk7Ci0KLQkvKiBHZXQgZXhwZWN0ZWQgdGhyb3VnaHB1dCAqLwotCXRwdCA9IGl3bDQ5NjVfZ2V0X2V4cGVjdGVkX3RwdCh0YmwsIHNjYWxlX2luZGV4KTsKLQotCS8qCi0JICogS2VlcCB0cmFjayBvZiBvbmx5IHRoZSBsYXRlc3QgNjIgdHggZnJhbWUgYXR0ZW1wdHMgaW4gdGhpcyByYXRlJ3MKLQkgKiBoaXN0b3J5IHdpbmRvdzsgYW55dGhpbmcgb2xkZXIgaXNuJ3QgcmVhbGx5IHJlbGV2YW50IGFueSBtb3JlLgotCSAqIElmIHdlIGhhdmUgZmlsbGVkIHVwIHRoZSBzbGlkaW5nIHdpbmRvdywgZHJvcCB0aGUgb2xkZXN0IGF0dGVtcHQ7Ci0JICogaWYgdGhlIG9sZGVzdCBhdHRlbXB0IChoaWdoZXN0IGJpdCBpbiBiaXRtYXApIHNob3dzICJzdWNjZXNzIiwKLQkgKiBzdWJ0cmFjdCAiMSIgZnJvbSB0aGUgc3VjY2VzcyBjb3VudGVyICh0aGlzIGlzIHRoZSBtYWluIHJlYXNvbgotCSAqIHdlIGtlZXAgdGhlc2UgYml0bWFwcyEpLgotCSAqLwotCXdoaWxlIChhdHRlbXB0cyA+IDApIHsKLQkJaWYgKHdpbmRvdy0+Y291bnRlciA+PSBJV0xfUkFURV9NQVhfV0lORE9XKSB7Ci0KLQkJCS8qIHJlbW92ZSBlYXJsaWVzdCAqLwotCQkJd2luZG93LT5jb3VudGVyID0gSVdMX1JBVEVfTUFYX1dJTkRPVyAtIDE7Ci0KLQkJCWlmICh3aW5kb3ctPmRhdGEgJiBtYXNrKSB7Ci0JCQkJd2luZG93LT5kYXRhICY9IH5tYXNrOwotCQkJCXdpbmRvdy0+c3VjY2Vzc19jb3VudGVyLS07Ci0JCQl9Ci0JCX0KLQotCQkvKiBJbmNyZW1lbnQgZnJhbWVzLWF0dGVtcHRlZCBjb3VudGVyICovCi0JCXdpbmRvdy0+Y291bnRlcisrOwotCi0JCS8qIFNoaWZ0IGJpdG1hcCBieSBvbmUgZnJhbWUgdG8gdGhyb3cgYXdheSBvbGRlc3QgaGlzdG9yeSAqLwotCQl3aW5kb3ctPmRhdGEgPDw9IDE7Ci0KLQkJLyogTWFyayB0aGUgbW9zdCByZWNlbnQgI3N1Y2Nlc3NlcyBhdHRlbXB0cyBhcyBzdWNjZXNzZnVsICovCi0JCWlmIChzdWNjZXNzZXMgPiAwKSB7Ci0JCQl3aW5kb3ctPnN1Y2Nlc3NfY291bnRlcisrOwotCQkJd2luZG93LT5kYXRhIHw9IDB4MTsKLQkJCXN1Y2Nlc3Nlcy0tOwotCQl9Ci0KLQkJYXR0ZW1wdHMtLTsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgY3VycmVudCBzdWNjZXNzIHJhdGlvLCBhdm9pZCBkaXZpZGUtYnktMCEgKi8KLQlpZiAod2luZG93LT5jb3VudGVyID4gMCkKLQkJd2luZG93LT5zdWNjZXNzX3JhdGlvID0gMTI4ICogKDEwMCAqIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyKQotCQkJCQkvIHdpbmRvdy0+Y291bnRlcjsKLQllbHNlCi0JCXdpbmRvdy0+c3VjY2Vzc19yYXRpbyA9IElXTF9JTlZBTElEX1ZBTFVFOwotCi0JZmFpbF9jb3VudCA9IHdpbmRvdy0+Y291bnRlciAtIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyOwotCi0JLyogQ2FsY3VsYXRlIGF2ZXJhZ2UgdGhyb3VnaHB1dCwgaWYgd2UgaGF2ZSBlbm91Z2ggaGlzdG9yeS4gKi8KLQlpZiAoKGZhaWxfY291bnQgPj0gSVdMX1JBVEVfTUlOX0ZBSUxVUkVfVEgpIHx8Ci0JICAgICh3aW5kb3ctPnN1Y2Nlc3NfY291bnRlciA+PSBJV0xfUkFURV9NSU5fU1VDQ0VTU19USCkpCi0JCXdpbmRvdy0+YXZlcmFnZV90cHQgPSAod2luZG93LT5zdWNjZXNzX3JhdGlvICogdHB0ICsgNjQpIC8gMTI4OwotCWVsc2UKLQkJd2luZG93LT5hdmVyYWdlX3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCi0JLyogVGFnIHRoaXMgd2luZG93IGFzIGhhdmluZyBiZWVuIHVwZGF0ZWQgKi8KLQl3aW5kb3ctPnN0YW1wID0gamlmZmllczsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogRmlsbCB1Q29kZSBBUEkgcmF0ZV9uX2ZsYWdzIGZpZWxkLCBiYXNlZCBvbiAic2VhcmNoIiBvciAiYWN0aXZlIiB0YWJsZS4KLSAqLwotc3RhdGljIHUzMiBpd2w0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwKLQkJCQkgaW50IGluZGV4LCB1OCB1c2VfZ3JlZW4pCi17Ci0JdTMyIHJhdGVfbl9mbGFncyA9IDA7Ci0KLQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKLQkJcmF0ZV9uX2ZsYWdzID0gaXdsZWdhY3lfcmF0ZXNbaW5kZXhdLnBsY3A7Ci0JCWlmIChpbmRleCA+PSBJV0xfRklSU1RfQ0NLX1JBVEUgJiYgaW5kZXggPD0gSVdMX0xBU1RfQ0NLX1JBVEUpCi0JCQlyYXRlX25fZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKLQotCX0gZWxzZSBpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgewotCQlpZiAoaW5kZXggPiBJV0xfTEFTVF9PRkRNX1JBVEUpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkludmFsaWQgSFQgcmF0ZSBpbmRleCAlZFxuIiwgaW5kZXgpOwotCQkJaW5kZXggPSBJV0xfTEFTVF9PRkRNX1JBVEU7Ci0JCX0KLQkJcmF0ZV9uX2ZsYWdzID0gUkFURV9NQ1NfSFRfTVNLOwotCi0JCWlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkpCi0JCQlyYXRlX25fZmxhZ3MgfD0JaXdsZWdhY3lfcmF0ZXNbaW5kZXhdLnBsY3Bfc2lzbzsKLQkJZWxzZQotCQkJcmF0ZV9uX2ZsYWdzIHw9CWl3bGVnYWN5X3JhdGVzW2luZGV4XS5wbGNwX21pbW8yOwotCX0gZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgdGJsLT5scV90eXBlICVkXG4iLCB0YmwtPmxxX3R5cGUpOwotCX0KLQotCXJhdGVfbl9mbGFncyB8PSAoKHRibC0+YW50X3R5cGUgPDwgUkFURV9NQ1NfQU5UX1BPUykgJgotCQkJCQkJICAgICBSQVRFX01DU19BTlRfQUJDX01TSyk7Ci0KLQlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgewotCQlpZiAodGJsLT5pc19odDQwKSB7Ci0JCQlpZiAodGJsLT5pc19kdXApCi0JCQkJcmF0ZV9uX2ZsYWdzIHw9IFJBVEVfTUNTX0RVUF9NU0s7Ci0JCQllbHNlCi0JCQkJcmF0ZV9uX2ZsYWdzIHw9IFJBVEVfTUNTX0hUNDBfTVNLOwotCQl9Ci0JCWlmICh0YmwtPmlzX1NHSSkKLQkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19TR0lfTVNLOwotCi0JCWlmICh1c2VfZ3JlZW4pIHsKLQkJCXJhdGVfbl9mbGFncyB8PSBSQVRFX01DU19HRl9NU0s7Ci0JCQlpZiAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpICYmIHRibC0+aXNfU0dJKSB7Ci0JCQkJcmF0ZV9uX2ZsYWdzICY9IH5SQVRFX01DU19TR0lfTVNLOwotCQkJCUlXTF9FUlIocHJpdiwgIkdGIHdhcyBzZXQgd2l0aCBTR0k6U0lTT1xuIik7Ci0JCQl9Ci0JCX0KLQl9Ci0JcmV0dXJuIHJhdGVfbl9mbGFnczsKLX0KLQotLyoKLSAqIEludGVycHJldCB1Q29kZSBBUEkncyByYXRlX25fZmxhZ3MgZm9ybWF0LAotICogZmlsbCAic2VhcmNoIiBvciAiYWN0aXZlIiB0eCBtb2RlIHRhYmxlLgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKGNvbnN0IHUzMiByYXRlX25fZmxhZ3MsCi0JCQkJICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkgICAgc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAotCQkJCSAgICBpbnQgKnJhdGVfaWR4KQotewotCXUzMiBhbnRfbXNrID0gKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0FOVF9BQkNfTVNLKTsKLQl1OCBpd2w0OTY1X251bV9vZl9hbnQgPSBpd2w0OTY1X2dldF9pd2w0OTY1X251bV9vZl9hbnRfZnJvbV9yYXRlKHJhdGVfbl9mbGFncyk7Ci0JdTggbWNzOwotCi0JbWVtc2V0KHRibCwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8pKTsKLQkqcmF0ZV9pZHggPSBpd2w0OTY1X2h3cmF0ZV90b19wbGNwX2lkeChyYXRlX25fZmxhZ3MpOwotCi0JaWYgKCpyYXRlX2lkeCAgPT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQkqcmF0ZV9pZHggPSAtMTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXRibC0+aXNfU0dJID0gMDsJLyogZGVmYXVsdCBsZWdhY3kgc2V0dXAgKi8KLQl0YmwtPmlzX2h0NDAgPSAwOwotCXRibC0+aXNfZHVwID0gMDsKLQl0YmwtPmFudF90eXBlID0gKGFudF9tc2sgPj4gUkFURV9NQ1NfQU5UX1BPUyk7Ci0JdGJsLT5scV90eXBlID0gTFFfTk9ORTsKLQl0YmwtPm1heF9zZWFyY2ggPSBJV0xfTUFYX1NFQVJDSDsKLQotCS8qIGxlZ2FjeSByYXRlIGZvcm1hdCAqLwotCWlmICghKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0hUX01TSykpIHsKLQkJaWYgKGl3bDQ5NjVfbnVtX29mX2FudCA9PSAxKSB7Ci0JCQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJCXRibC0+bHFfdHlwZSA9IExRX0E7Ci0JCQllbHNlCi0JCQkJdGJsLT5scV90eXBlID0gTFFfRzsKLQkJfQotCS8qIEhUIHJhdGUgZm9ybWF0ICovCi0JfSBlbHNlIHsKLQkJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX1NHSV9NU0spCi0JCQl0YmwtPmlzX1NHSSA9IDE7Ci0KLQkJaWYgKChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykgfHwKLQkJICAgIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19EVVBfTVNLKSkKLQkJCXRibC0+aXNfaHQ0MCA9IDE7Ci0KLQkJaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0RVUF9NU0spCi0JCQl0YmwtPmlzX2R1cCA9IDE7Ci0KLQkJbWNzID0gaXdsNDk2NV9yc19leHRyYWN0X3JhdGUocmF0ZV9uX2ZsYWdzKTsKLQotCQkvKiBTSVNPICovCi0JCWlmIChtY3MgPD0gSVdMX1JBVEVfU0lTT182ME1fUExDUCkgewotCQkJaWYgKGl3bDQ5NjVfbnVtX29mX2FudCA9PSAxKQotCQkJCXRibC0+bHFfdHlwZSA9IExRX1NJU087IC8qZWxzZSBOT05FKi8KLQkJLyogTUlNTzIgKi8KLQkJfSBlbHNlIHsKLQkJCWlmIChpd2w0OTY1X251bV9vZl9hbnQgPT0gMikKLQkJCQl0YmwtPmxxX3R5cGUgPSBMUV9NSU1PMjsKLQkJfQotCX0KLQlyZXR1cm4gMDsKLX0KLQotLyogc3dpdGNoIHRvIGFub3RoZXIgYW50ZW5uYS9hbnRlbm5hcyBhbmQgcmV0dXJuIDEgKi8KLS8qIGlmIG5vIG90aGVyIHZhbGlkIGFudGVubmEgZm91bmQsIHJldHVybiAwICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodTMyIHZhbGlkX2FudCwgdTMyICpyYXRlX25fZmxhZ3MsCi0JCQkgICAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCkKLXsKLQl1OCBuZXdfYW50X3R5cGU7Ci0KLQlpZiAoIXRibC0+YW50X3R5cGUgfHwgdGJsLT5hbnRfdHlwZSA+IEFOVF9BQkMpCi0JCXJldHVybiAwOwotCi0JaWYgKCFpd2w0OTY1X3JzX2lzX3ZhbGlkX2FudCh2YWxpZF9hbnQsIHRibC0+YW50X3R5cGUpKQotCQlyZXR1cm4gMDsKLQotCW5ld19hbnRfdHlwZSA9IGFudF90b2dnbGVfbG9va3VwW3RibC0+YW50X3R5cGVdOwotCi0Jd2hpbGUgKChuZXdfYW50X3R5cGUgIT0gdGJsLT5hbnRfdHlwZSkgJiYKLQkgICAgICAgIWl3bDQ5NjVfcnNfaXNfdmFsaWRfYW50KHZhbGlkX2FudCwgbmV3X2FudF90eXBlKSkKLQkJbmV3X2FudF90eXBlID0gYW50X3RvZ2dsZV9sb29rdXBbbmV3X2FudF90eXBlXTsKLQotCWlmIChuZXdfYW50X3R5cGUgPT0gdGJsLT5hbnRfdHlwZSkKLQkJcmV0dXJuIDA7Ci0KLQl0YmwtPmFudF90eXBlID0gbmV3X2FudF90eXBlOwotCSpyYXRlX25fZmxhZ3MgJj0gflJBVEVfTUNTX0FOVF9BQkNfTVNLOwotCSpyYXRlX25fZmxhZ3MgfD0gbmV3X2FudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1M7Ci0JcmV0dXJuIDE7Ci19Ci0KLS8qKgotICogR3JlZW4tZmllbGQgbW9kZSBpcyB2YWxpZCBpZiB0aGUgc3RhdGlvbiBzdXBwb3J0cyBpdCBhbmQKLSAqIHRoZXJlIGFyZSBubyBub24tR0Ygc3RhdGlvbnMgcHJlc2VudCBpbiB0aGUgQlNTLgotICovCi1zdGF0aWMgYm9vbCBpd2w0OTY1X3JzX3VzZV9ncmVlbihzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7Ci0KLQlyZXR1cm4gKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfR1JOX0ZMRCkgJiYKLQkJIShjdHgtPmh0Lm5vbl9nZl9zdGFfcHJlc2VudCk7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9yc19nZXRfc3VwcG9ydGVkX3JhdGVzIC0gZ2V0IHRoZSBhdmFpbGFibGUgcmF0ZXMKLSAqCi0gKiBpZiBtYW5hZ2VtZW50IGZyYW1lIG9yIGJyb2FkY2FzdCBmcmFtZSBvbmx5IHJldHVybgotICogYmFzaWMgYXZhaWxhYmxlIHJhdGVzLgotICoKLSAqLwotc3RhdGljIHUxNiBpd2w0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMoc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkJICBlbnVtIGl3bF90YWJsZV90eXBlIHJhdGVfdHlwZSkKLXsKLQlpZiAoaXNfbGVnYWN5KHJhdGVfdHlwZSkpIHsKLQkJcmV0dXJuIGxxX3N0YS0+YWN0aXZlX2xlZ2FjeV9yYXRlOwotCX0gZWxzZSB7Ci0JCWlmIChpc19zaXNvKHJhdGVfdHlwZSkpCi0JCQlyZXR1cm4gbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlOwotCQllbHNlCi0JCQlyZXR1cm4gbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZTsKLQl9Ci19Ci0KLXN0YXRpYyB1MTYKLWl3bDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBpbmRleCwgdTE2IHJhdGVfbWFzaywKLQkJCQlpbnQgcmF0ZV90eXBlKQotewotCXU4IGhpZ2ggPSBJV0xfUkFURV9JTlZBTElEOwotCXU4IGxvdyA9IElXTF9SQVRFX0lOVkFMSUQ7Ci0KLQkvKiA4MDIuMTFBIG9yIGh0IHdhbGtzIHRvIHRoZSBuZXh0IGxpdGVyYWwgYWRqYWNlbnQgcmF0ZSBpbgotCSAqIHRoZSByYXRlIHRhYmxlICovCi0JaWYgKGlzX2FfYmFuZChyYXRlX3R5cGUpIHx8ICFpc19sZWdhY3kocmF0ZV90eXBlKSkgewotCQlpbnQgaTsKLQkJdTMyIG1hc2s7Ci0KLQkJLyogRmluZCB0aGUgcHJldmlvdXMgcmF0ZSB0aGF0IGlzIGluIHRoZSByYXRlIG1hc2sgKi8KLQkJaSA9IGluZGV4IC0gMTsKLQkJZm9yIChtYXNrID0gKDEgPDwgaSk7IGkgPj0gMDsgaS0tLCBtYXNrID4+PSAxKSB7Ci0JCQlpZiAocmF0ZV9tYXNrICYgbWFzaykgewotCQkJCWxvdyA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvKiBGaW5kIHRoZSBuZXh0IHJhdGUgdGhhdCBpcyBpbiB0aGUgcmF0ZSBtYXNrICovCi0JCWkgPSBpbmRleCArIDE7Ci0JCWZvciAobWFzayA9ICgxIDw8IGkpOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKywgbWFzayA8PD0gMSkgewotCQkJaWYgKHJhdGVfbWFzayAmIG1hc2spIHsKLQkJCQloaWdoID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKLQl9Ci0KLQlsb3cgPSBpbmRleDsKLQl3aGlsZSAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKLQkJbG93ID0gaXdsZWdhY3lfcmF0ZXNbbG93XS5wcmV2X3JzOwotCQlpZiAobG93ID09IElXTF9SQVRFX0lOVkFMSUQpCi0JCQlicmVhazsKLQkJaWYgKHJhdGVfbWFzayAmICgxIDw8IGxvdykpCi0JCQlicmVhazsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNraXBwaW5nIG1hc2tlZCBsb3dlciByYXRlOiAlZFxuIiwgbG93KTsKLQl9Ci0KLQloaWdoID0gaW5kZXg7Ci0Jd2hpbGUgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQloaWdoID0gaXdsZWdhY3lfcmF0ZXNbaGlnaF0ubmV4dF9yczsKLQkJaWYgKGhpZ2ggPT0gSVdMX1JBVEVfSU5WQUxJRCkKLQkJCWJyZWFrOwotCQlpZiAocmF0ZV9tYXNrICYgKDEgPDwgaGlnaCkpCi0JCQlicmVhazsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIlNraXBwaW5nIG1hc2tlZCBoaWdoZXIgcmF0ZTogJWRcbiIsIGhpZ2gpOwotCX0KLQotCXJldHVybiAoaGlnaCA8PCA4KSB8IGxvdzsKLX0KLQotc3RhdGljIHUzMiBpd2w0OTY1X3JzX2dldF9sb3dlcl9yYXRlKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkgICAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwKLQkJCSAgICAgdTggc2NhbGVfaW5kZXgsIHU4IGh0X3Bvc3NpYmxlKQotewotCXMzMiBsb3c7Ci0JdTE2IHJhdGVfbWFzazsKLQl1MTYgaGlnaF9sb3c7Ci0JdTggc3dpdGNoX3RvX2xlZ2FjeSA9IDA7Ci0JdTggaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGxxX3N0YS0+ZHJ2OwotCi0JLyogY2hlY2sgaWYgd2UgbmVlZCB0byBzd2l0Y2ggZnJvbSBIVCB0byBsZWdhY3kgcmF0ZXMuCi0JICogYXNzdW1wdGlvbiBpcyB0aGF0IG1hbmRhdG9yeSByYXRlcyAoMU1icHMgb3IgNk1icHMpCi0JICogYXJlIGFsd2F5cyBzdXBwb3J0ZWQgKHNwZWMgZGVtYW5kKSAqLwotCWlmICghaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkgJiYgKCFodF9wb3NzaWJsZSB8fCAhc2NhbGVfaW5kZXgpKSB7Ci0JCXN3aXRjaF90b19sZWdhY3kgPSAxOwotCQlzY2FsZV9pbmRleCA9IHJzX2h0X3RvX2xlZ2FjeVtzY2FsZV9pbmRleF07Ci0JCWlmIChscV9zdGEtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJCXRibC0+bHFfdHlwZSA9IExRX0E7Ci0JCWVsc2UKLQkJCXRibC0+bHFfdHlwZSA9IExRX0c7Ci0KLQkJaWYgKGl3bDQ5NjVfbnVtX29mX2FudCh0YmwtPmFudF90eXBlKSA+IDEpCi0JCQl0YmwtPmFudF90eXBlID0KLQkJCQlpd2w0OTY1X2ZpcnN0X2FudGVubmEocHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCk7Ci0KLQkJdGJsLT5pc19odDQwID0gMDsKLQkJdGJsLT5pc19TR0kgPSAwOwotCQl0YmwtPm1heF9zZWFyY2ggPSBJV0xfTUFYX1NFQVJDSDsKLQl9Ci0KLQlyYXRlX21hc2sgPSBpd2w0OTY1X3JzX2dldF9zdXBwb3J0ZWRfcmF0ZXMobHFfc3RhLCBOVUxMLCB0YmwtPmxxX3R5cGUpOwotCi0JLyogTWFzayB3aXRoIHN0YXRpb24gcmF0ZSByZXN0cmljdGlvbiAqLwotCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgewotCQkvKiBzdXBwX3JhdGVzIGhhcyBubyBDQ0sgYml0cyBpbiBBIG1vZGUgKi8KLQkJaWYgKGxxX3N0YS0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJcmF0ZV9tYXNrICA9ICh1MTYpKHJhdGVfbWFzayAmCi0JCQkgICAobHFfc3RhLT5zdXBwX3JhdGVzIDw8IElXTF9GSVJTVF9PRkRNX1JBVEUpKTsKLQkJZWxzZQotCQkJcmF0ZV9tYXNrID0gKHUxNikocmF0ZV9tYXNrICYgbHFfc3RhLT5zdXBwX3JhdGVzKTsKLQl9Ci0KLQkvKiBJZiB3ZSBzd2l0Y2hlZCBmcm9tIEhUIHRvIGxlZ2FjeSwgY2hlY2sgY3VycmVudCByYXRlICovCi0JaWYgKHN3aXRjaF90b19sZWdhY3kgJiYgKHJhdGVfbWFzayAmICgxIDw8IHNjYWxlX2luZGV4KSkpIHsKLQkJbG93ID0gc2NhbGVfaW5kZXg7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWhpZ2hfbG93ID0gaXdsNDk2NV9yc19nZXRfYWRqYWNlbnRfcmF0ZShscV9zdGEtPmRydiwKLQkJCQkJc2NhbGVfaW5kZXgsIHJhdGVfbWFzaywKLQkJCQkJdGJsLT5scV90eXBlKTsKLQlsb3cgPSBoaWdoX2xvdyAmIDB4ZmY7Ci0KLQlpZiAobG93ID09IElXTF9SQVRFX0lOVkFMSUQpCi0JCWxvdyA9IHNjYWxlX2luZGV4OwotCi1vdXQ6Ci0JcmV0dXJuIGl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKGxxX3N0YS0+ZHJ2LCB0YmwsIGxvdywgaXNfZ3JlZW4pOwotfQotCi0vKgotICogU2ltcGxlIGZ1bmN0aW9uIHRvIGNvbXBhcmUgdHdvIHJhdGUgc2NhbGUgdGFibGUgdHlwZXMKLSAqLwotc3RhdGljIGJvb2wgaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqYSwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICpiKQotewotCXJldHVybiAoYS0+bHFfdHlwZSA9PSBiLT5scV90eXBlKSAmJiAoYS0+YW50X3R5cGUgPT0gYi0+YW50X3R5cGUpICYmCi0JCShhLT5pc19TR0kgPT0gYi0+aXNfU0dJKTsKLX0KLQotLyoKLSAqIG1hYzgwMjExIHNlbmRzIHVzIFR4IHN0YXR1cwotICovCi1zdGF0aWMgdm9pZAotaXdsNDk2NV9yc190eF9zdGF0dXModm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSwKLQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWludCBsZWdhY3lfc3VjY2VzczsKLQlpbnQgcmV0cmllczsKLQlpbnQgcnNfaW5kZXgsIG1hY19pbmRleCwgaTsKLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7Ci0Jc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICp0YWJsZTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilwcml2X3I7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwotCWVudW0gbWFjODAyMTFfcmF0ZV9jb250cm9sX2ZsYWdzIG1hY19mbGFnczsKLQl1MzIgdHhfcmF0ZTsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvIHRibF90eXBlOwotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKmN1cnJfdGJsLCAqb3RoZXJfdGJsLCAqdG1wX3RibDsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OwotCi0JSVdMX0RFQlVHX1JBVEVfTElNSVQocHJpdiwKLQkJImdldCBmcmFtZSBhY2sgcmVzcG9uc2UsIHVwZGF0ZSByYXRlIHNjYWxlIHdpbmRvd1xuIik7Ci0KLQkvKiBUcmVhdCB1bmluaXRpYWxpemVkIHJhdGUgc2NhbGluZyBkYXRhIHNhbWUgYXMgbm9uLWV4aXN0aW5nLiAqLwotCWlmICghbHFfc3RhKSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJTdGF0aW9uIHJhdGUgc2NhbGluZyBub3QgY3JlYXRlZCB5ZXQuXG4iKTsKLQkJcmV0dXJuOwotCX0gZWxzZSBpZiAoIWxxX3N0YS0+ZHJ2KSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJSYXRlIHNjYWxpbmcgbm90IGluaXRpYWxpemVkIHlldC5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpIHx8Ci0JICAgIGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spCi0JCXJldHVybjsKLQotCS8qIFRoaXMgcGFja2V0IHdhcyBhZ2dyZWdhdGVkIGJ1dCBkb2Vzbid0IGNhcnJ5IHN0YXR1cyBpbmZvICovCi0JaWYgKChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpICYmCi0JICAgICEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BTVBEVSkpCi0JCXJldHVybjsKLQotCS8qCi0JICogSWdub3JlIHRoaXMgVHggZnJhbWUgcmVzcG9uc2UgaWYgaXRzIGluaXRpYWwgcmF0ZSBkb2Vzbid0IG1hdGNoCi0JICogdGhhdCBvZiBsYXRlc3QgTGluayBRdWFsaXR5IGNvbW1hbmQuICBUaGVyZSBtYXkgYmUgc3RyYWdnbGVycwotCSAqIGZyb20gYSBwcmV2aW91cyBMaW5rIFF1YWxpdHkgY29tbWFuZCwgYnV0IHdlJ3JlIG5vIGxvbmdlciBpbnRlcmVzdGVkCi0JICogaW4gdGhvc2U7IHRoZXkncmUgZWl0aGVyIGZyb20gdGhlICJhY3RpdmUiIG1vZGUgd2hpbGUgd2UncmUgdHJ5aW5nCi0JICogdG8gY2hlY2sgInNlYXJjaCIgbW9kZSwgb3IgYSBwcmlvciAic2VhcmNoIiBtb2RlIGFmdGVyIHdlJ3ZlIG1vdmVkCi0JICogdG8gYSBuZXcgInNlYXJjaCIgbW9kZSAod2hpY2ggbWlnaHQgYmVjb21lIHRoZSBuZXcgImFjdGl2ZSIgbW9kZSkuCi0JICovCi0JdGFibGUgPSAmbHFfc3RhLT5scTsKLQl0eF9yYXRlID0gbGUzMl90b19jcHUodGFibGUtPnJzX3RhYmxlWzBdLnJhdGVfbl9mbGFncyk7Ci0JaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3ModHhfcmF0ZSwKLQkJCSBwcml2LT5iYW5kLCAmdGJsX3R5cGUsICZyc19pbmRleCk7Ci0JaWYgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJcnNfaW5kZXggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQltYWNfZmxhZ3MgPSBpbmZvLT5zdGF0dXMucmF0ZXNbMF0uZmxhZ3M7Ci0JbWFjX2luZGV4ID0gaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeDsKLQkvKiBGb3IgSFQgcGFja2V0cywgbWFwIE1DUyB0byBQTENQICovCi0JaWYgKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MpIHsKLQkJbWFjX2luZGV4ICY9IFJBVEVfTUNTX0NPREVfTVNLOwkvKiBSZW1vdmUgIyBvZiBzdHJlYW1zICovCi0JCWlmIChtYWNfaW5kZXggPj0gKElXTF9SQVRFXzlNX0lOREVYIC0gSVdMX0ZJUlNUX09GRE1fUkFURSkpCi0JCQltYWNfaW5kZXgrKzsKLQkJLyoKLQkJICogbWFjODAyMTEgSFQgaW5kZXggaXMgYWx3YXlzIHplcm8taW5kZXhlZDsgd2UgbmVlZCB0byBtb3ZlCi0JCSAqIEhUIE9GRE0gcmF0ZXMgYWZ0ZXIgQ0NLIHJhdGVzIGluIDIuNCBHSHogYmFuZAotCQkgKi8KLQkJaWYgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikKLQkJCW1hY19pbmRleCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCX0KLQkvKiBIZXJlIHdlIGFjdHVhbGx5IGNvbXBhcmUgdGhpcyByYXRlIHRvIHRoZSBsYXRlc3QgTFEgY29tbWFuZCAqLwotCWlmICgobWFjX2luZGV4IDwgMCkgfHwKLQkgICAgKHRibF90eXBlLmlzX1NHSSAhPQotCQkJISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJKSkgfHwKLQkgICAgKHRibF90eXBlLmlzX2h0NDAgIT0KLQkJCSEhKG1hY19mbGFncyAmIElFRUU4MDIxMV9UWF9SQ180MF9NSFpfV0lEVEgpKSB8fAotCSAgICAodGJsX3R5cGUuaXNfZHVwICE9Ci0JCQkhIShtYWNfZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfRFVQX0RBVEEpKSB8fAotCSAgICAodGJsX3R5cGUuYW50X3R5cGUgIT0gaW5mby0+YW50ZW5uYV9zZWxfdHgpIHx8Ci0JICAgICghISh0eF9yYXRlICYgUkFURV9NQ1NfSFRfTVNLKSAhPQotCQkJISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykpIHx8Ci0JICAgICghISh0eF9yYXRlICYgUkFURV9NQ1NfR0ZfTVNLKSAhPQotCQkJISEobWFjX2ZsYWdzICYgSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEKSkgfHwKLQkgICAgKHJzX2luZGV4ICE9IG1hY19pbmRleCkpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJImluaXRpYWwgcmF0ZSAlZCBkb2VzIG5vdCBtYXRjaCAlZCAoMHgleClcbiIsCi0JCQkgbWFjX2luZGV4LCByc19pbmRleCwgdHhfcmF0ZSk7Ci0JCS8qCi0JCSAqIFNpbmNlIHJhdGVzIG1pcy1tYXRjaCwgdGhlIGxhc3QgTFEgY29tbWFuZCBtYXkgaGF2ZSBmYWlsZWQuCi0JCSAqIEFmdGVyIElXTF9NSVNTRURfUkFURV9NQVggbWlzLW1hdGNoZXMsIHJlc3luYyB0aGUgdUNvZGUgd2l0aAotCQkgKiAuLi4gZHJpdmVyLgotCQkgKi8KLQkJbHFfc3RhLT5taXNzZWRfcmF0ZV9jb3VudGVyKys7Ci0JCWlmIChscV9zdGEtPm1pc3NlZF9yYXRlX2NvdW50ZXIgPiBJV0xfTUlTU0VEX1JBVEVfTUFYKSB7Ci0JCQlscV9zdGEtPm1pc3NlZF9yYXRlX2NvdW50ZXIgPSAwOwotCQkJaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscV9zdGEtPmxxLAotCQkJCQkJCUNNRF9BU1lOQywgZmFsc2UpOwotCQl9Ci0JCS8qIFJlZ2FyZGxlc3MsIGlnbm9yZSB0aGlzIHN0YXR1cyBpbmZvIGZvciBvdXRkYXRlZCByYXRlICovCi0JCXJldHVybjsKLQl9IGVsc2UKLQkJLyogUmF0ZSBkaWQgbWF0Y2gsIHNvIHJlc2V0IHRoZSBtaXNzZWRfcmF0ZV9jb3VudGVyICovCi0JCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IDA7Ci0KLQkvKiBGaWd1cmUgb3V0IGlmIHJhdGUgc2NhbGUgYWxnb3JpdGhtIGlzIGluIGFjdGl2ZSBvciBzZWFyY2ggdGFibGUgKi8KLQlpZiAoaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoJnRibF90eXBlLAotCQkJCSYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pKSkgewotCQljdXJyX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCQlvdGhlcl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JfSBlbHNlIGlmIChpd2w0OTY1X3RhYmxlX3R5cGVfbWF0Y2hlcygmdGJsX3R5cGUsCi0JCQkJJmxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSkpIHsKLQkJY3Vycl90YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1sxIC0gbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JCW90aGVyX3RibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkiTmVpdGhlciBhY3RpdmUgbm9yIHNlYXJjaCBtYXRjaGVzIHR4IHJhdGVcbiIpOwotCQl0bXBfdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJhY3RpdmUtIGxxOiV4LCBhbnQ6JXgsIFNHSTolZFxuIiwKLQkJCXRtcF90YmwtPmxxX3R5cGUsIHRtcF90YmwtPmFudF90eXBlLCB0bXBfdGJsLT5pc19TR0kpOwotCQl0bXBfdGJsID0gJihscV9zdGEtPmxxX2luZm9bMSAtIGxxX3N0YS0+YWN0aXZlX3RibF0pOwotCQlJV0xfREVCVUdfUkFURShwcml2LCAic2VhcmNoLSBscToleCwgYW50OiV4LCBTR0k6JWRcbiIsCi0JCQl0bXBfdGJsLT5scV90eXBlLCB0bXBfdGJsLT5hbnRfdHlwZSwgdG1wX3RibC0+aXNfU0dJKTsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgImFjdHVhbC0gbHE6JXgsIGFudDoleCwgU0dJOiVkXG4iLAotCQkJdGJsX3R5cGUubHFfdHlwZSwgdGJsX3R5cGUuYW50X3R5cGUsIHRibF90eXBlLmlzX1NHSSk7Ci0JCS8qCi0JCSAqIG5vIG1hdGNoaW5nIHRhYmxlIGZvdW5kLCBsZXQncyBieS1wYXNzIHRoZSBkYXRhIGNvbGxlY3Rpb24KLQkJICogYW5kIGNvbnRpbnVlIHRvIHBlcmZvcm0gcmF0ZSBzY2FsZSB0byBmaW5kIHRoZSByYXRlIHRhYmxlCi0JCSAqLwotCQlpd2w0OTY1X3JzX3N0YXlfaW5fdGFibGUobHFfc3RhLCB0cnVlKTsKLQkJZ290byBkb25lOwotCX0KLQotCS8qCi0JICogVXBkYXRpbmcgdGhlIGZyYW1lIGhpc3RvcnkgZGVwZW5kcyBvbiB3aGV0aGVyIHBhY2tldHMgd2VyZQotCSAqIGFnZ3JlZ2F0ZWQuCi0JICoKLQkgKiBGb3IgYWdncmVnYXRpb24sIGFsbCBwYWNrZXRzIHdlcmUgdHJhbnNtaXR0ZWQgYXQgdGhlIHNhbWUgcmF0ZSwgdGhlCi0JICogZmlyc3QgaW5kZXggaW50byByYXRlIHNjYWxlIHRhYmxlLgotCSAqLwotCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FNUERVKSB7Ci0JCXR4X3JhdGUgPSBsZTMyX3RvX2NwdSh0YWJsZS0+cnNfdGFibGVbMF0ucmF0ZV9uX2ZsYWdzKTsKLQkJaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3ModHhfcmF0ZSwgcHJpdi0+YmFuZCwgJnRibF90eXBlLAotCQkJCSZyc19pbmRleCk7Ci0JCWl3bDQ5NjVfcnNfY29sbGVjdF90eF9kYXRhKGN1cnJfdGJsLCByc19pbmRleCwKLQkJCQkgICBpbmZvLT5zdGF0dXMuYW1wZHVfbGVuLAotCQkJCSAgIGluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuKTsKLQotCQkvKiBVcGRhdGUgc3VjY2Vzcy9mYWlsIGNvdW50cyBpZiBub3Qgc2VhcmNoaW5nIGZvciBuZXcgbW9kZSAqLwotCQlpZiAobHFfc3RhLT5zdGF5X2luX3RibCkgewotCQkJbHFfc3RhLT50b3RhbF9zdWNjZXNzICs9IGluZm8tPnN0YXR1cy5hbXBkdV9hY2tfbGVuOwotCQkJbHFfc3RhLT50b3RhbF9mYWlsZWQgKz0gKGluZm8tPnN0YXR1cy5hbXBkdV9sZW4gLQotCQkJCQlpbmZvLT5zdGF0dXMuYW1wZHVfYWNrX2xlbik7Ci0JCX0KLQl9IGVsc2UgewotCS8qCi0JICogRm9yIGxlZ2FjeSwgdXBkYXRlIGZyYW1lIGhpc3Rvcnkgd2l0aCBmb3IgZWFjaCBUeCByZXRyeS4KLQkgKi8KLQkJcmV0cmllcyA9IGluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCAtIDE7Ci0JCS8qIEhXIGRvZXNuJ3Qgc2VuZCBtb3JlIHRoYW4gMTUgcmV0cmllcyAqLwotCQlyZXRyaWVzID0gbWluKHJldHJpZXMsIDE1KTsKLQotCQkvKiBUaGUgbGFzdCB0cmFuc21pc3Npb24gbWF5IGhhdmUgYmVlbiBzdWNjZXNzZnVsICovCi0JCWxlZ2FjeV9zdWNjZXNzID0gISEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spOwotCQkvKiBDb2xsZWN0IGRhdGEgZm9yIGVhY2ggcmF0ZSB1c2VkIGR1cmluZyBmYWlsZWQgVFggYXR0ZW1wdHMgKi8KLQkJZm9yIChpID0gMDsgaSA8PSByZXRyaWVzOyArK2kpIHsKLQkJCXR4X3JhdGUgPSBsZTMyX3RvX2NwdSh0YWJsZS0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzKTsKLQkJCWl3bDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKHR4X3JhdGUsIHByaXYtPmJhbmQsCi0JCQkJCSZ0YmxfdHlwZSwgJnJzX2luZGV4KTsKLQkJCS8qCi0JCQkgKiBPbmx5IGNvbGxlY3Qgc3RhdHMgaWYgcmV0cmllZCByYXRlIGlzIGluIHRoZSBzYW1lIFJTCi0JCQkgKiB0YWJsZSBhcyBhY3RpdmUvc2VhcmNoLgotCQkJICovCi0JCQlpZiAoaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoJnRibF90eXBlLCBjdXJyX3RibCkpCi0JCQkJdG1wX3RibCA9IGN1cnJfdGJsOwotCQkJZWxzZSBpZiAoaXdsNDk2NV90YWJsZV90eXBlX21hdGNoZXMoJnRibF90eXBlLAotCQkJCQkJCQkgb3RoZXJfdGJsKSkKLQkJCQl0bXBfdGJsID0gb3RoZXJfdGJsOwotCQkJZWxzZQotCQkJCWNvbnRpbnVlOwotCQkJaXdsNDk2NV9yc19jb2xsZWN0X3R4X2RhdGEodG1wX3RibCwgcnNfaW5kZXgsIDEsCi0JCQkJCSAgIGkgPCByZXRyaWVzID8gMCA6IGxlZ2FjeV9zdWNjZXNzKTsKLQkJfQotCi0JCS8qIFVwZGF0ZSBzdWNjZXNzL2ZhaWwgY291bnRzIGlmIG5vdCBzZWFyY2hpbmcgZm9yIG5ldyBtb2RlICovCi0JCWlmIChscV9zdGEtPnN0YXlfaW5fdGJsKSB7Ci0JCQlscV9zdGEtPnRvdGFsX3N1Y2Nlc3MgKz0gbGVnYWN5X3N1Y2Nlc3M7Ci0JCQlscV9zdGEtPnRvdGFsX2ZhaWxlZCArPSByZXRyaWVzICsgKDEgLSBsZWdhY3lfc3VjY2Vzcyk7Ci0JCX0KLQl9Ci0JLyogVGhlIGxhc3QgVFggcmF0ZSBpcyBjYWNoZWQgaW4gbHFfc3RhOyBpdCdzIHNldCBpbiBpZi9lbHNlIGFib3ZlICovCi0JbHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyA9IHR4X3JhdGU7Ci1kb25lOgotCS8qIFNlZSBpZiB0aGVyZSdzIGEgYmV0dGVyIHJhdGUgb3IgbW9kdWxhdGlvbiBtb2RlIHRvIHRyeS4gKi8KLQlpZiAoc3RhICYmIHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0pCi0JCWl3bDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHByaXYsIHNrYiwgc3RhLCBscV9zdGEpOwotfQotCi0vKgotICogQmVnaW4gYSBwZXJpb2Qgb2Ygc3RheWluZyB3aXRoIGEgc2VsZWN0ZWQgbW9kdWxhdGlvbiBtb2RlLgotICogU2V0ICJzdGF5X2luX3RibCIgZmxhZyB0byBwcmV2ZW50IGFueSBtb2RlIHN3aXRjaGVzLgotICogU2V0IGZyYW1lIHR4IHN1Y2Nlc3MgbGltaXRzIGFjY29yZGluZyB0byBsZWdhY3kgdnMuIGhpZ2gtdGhyb3VnaHB1dCwKLSAqIGFuZCByZXNldCBvdmVyYWxsIChzcGFubmluZyBhbGwgcmF0ZXMpIHR4IHN1Y2Nlc3MgaGlzdG9yeSBzdGF0aXN0aWNzLgotICogVGhlc2UgY29udHJvbCBob3cgbG9uZyB3ZSBzdGF5IHVzaW5nIHNhbWUgbW9kdWxhdGlvbiBtb2RlIGJlZm9yZQotICogc2VhcmNoaW5nIGZvciBhIG5ldyBtb2RlLgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX3NldF9zdGF5X2luX3RhYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggaXNfbGVnYWN5LAotCQkJCSBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhKQotewotCUlXTF9ERUJVR19SQVRFKHByaXYsICJ3ZSBhcmUgc3RheWluZyBpbiB0aGUgc2FtZSB0YWJsZVxuIik7Ci0JbHFfc3RhLT5zdGF5X2luX3RibCA9IDE7CS8qIG9ubHkgcGxhY2UgdGhpcyBnZXRzIHNldCAqLwotCWlmIChpc19sZWdhY3kpIHsKLQkJbHFfc3RhLT50YWJsZV9jb3VudF9saW1pdCA9IElXTF9MRUdBQ1lfVEFCTEVfQ09VTlQ7Ci0JCWxxX3N0YS0+bWF4X2ZhaWx1cmVfbGltaXQgPSBJV0xfTEVHQUNZX0ZBSUxVUkVfTElNSVQ7Ci0JCWxxX3N0YS0+bWF4X3N1Y2Nlc3NfbGltaXQgPSBJV0xfTEVHQUNZX1NVQ0NFU1NfTElNSVQ7Ci0JfSBlbHNlIHsKLQkJbHFfc3RhLT50YWJsZV9jb3VudF9saW1pdCA9IElXTF9OT05FX0xFR0FDWV9UQUJMRV9DT1VOVDsKLQkJbHFfc3RhLT5tYXhfZmFpbHVyZV9saW1pdCA9IElXTF9OT05FX0xFR0FDWV9GQUlMVVJFX0xJTUlUOwotCQlscV9zdGEtPm1heF9zdWNjZXNzX2xpbWl0ID0gSVdMX05PTkVfTEVHQUNZX1NVQ0NFU1NfTElNSVQ7Ci0JfQotCWxxX3N0YS0+dGFibGVfY291bnQgPSAwOwotCWxxX3N0YS0+dG90YWxfZmFpbGVkID0gMDsKLQlscV9zdGEtPnRvdGFsX3N1Y2Nlc3MgPSAwOwotCWxxX3N0YS0+Zmx1c2hfdGltZXIgPSBqaWZmaWVzOwotCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPSAwOwotfQotCi0vKgotICogRmluZCBjb3JyZWN0IHRocm91Z2hwdXQgdGFibGUgZm9yIGdpdmVuIG1vZGUgb2YgbW9kdWxhdGlvbgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUoc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwpCi17Ci0JLyogVXNlZCB0byBjaG9vc2UgYW1vbmcgSFQgdGFibGVzICovCi0JczMyICgqaHRfdGJsX3BvaW50ZXIpW0lXTF9SQVRFX0NPVU5UXTsKLQotCS8qIENoZWNrIGZvciBpbnZhbGlkIExRIHR5cGUgKi8KLQlpZiAoV0FSTl9PTl9PTkNFKCFpc19sZWdhY3kodGJsLT5scV90eXBlKSAmJiAhaXNfSHQodGJsLT5scV90eXBlKSkpIHsKLQkJdGJsLT5leHBlY3RlZF90cHQgPSBleHBlY3RlZF90cHRfbGVnYWN5OwotCQlyZXR1cm47Ci0JfQotCi0JLyogTGVnYWN5IHJhdGVzIGhhdmUgb25seSBvbmUgdGFibGUgKi8KLQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKLQkJdGJsLT5leHBlY3RlZF90cHQgPSBleHBlY3RlZF90cHRfbGVnYWN5OwotCQlyZXR1cm47Ci0JfQotCi0JLyogQ2hvb3NlIGFtb25nIG1hbnkgSFQgdGFibGVzIGRlcGVuZGluZyBvbiBudW1iZXIgb2Ygc3RyZWFtcwotCSAqIChTSVNPL01JTU8yKSwgY2hhbm5lbCB3aWR0aCAoMjAvNDApLCBTR0ksIGFuZCBhZ2dyZWdhdGlvbgotCSAqIHN0YXR1cyAqLwotCWlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkgJiYgKCF0YmwtPmlzX2h0NDAgfHwgbHFfc3RhLT5pc19kdXApKQotCQlodF90YmxfcG9pbnRlciA9IGV4cGVjdGVkX3RwdF9zaXNvMjBNSHo7Ci0JZWxzZSBpZiAoaXNfc2lzbyh0YmwtPmxxX3R5cGUpKQotCQlodF90YmxfcG9pbnRlciA9IGV4cGVjdGVkX3RwdF9zaXNvNDBNSHo7Ci0JZWxzZSBpZiAoaXNfbWltbzIodGJsLT5scV90eXBlKSAmJiAoIXRibC0+aXNfaHQ0MCB8fCBscV9zdGEtPmlzX2R1cCkpCi0JCWh0X3RibF9wb2ludGVyID0gZXhwZWN0ZWRfdHB0X21pbW8yXzIwTUh6OwotCWVsc2UgLyogaWYgKGlzX21pbW8yKHRibC0+bHFfdHlwZSkpIDwtLSBtdXN0IGJlIHRydWUgKi8KLQkJaHRfdGJsX3BvaW50ZXIgPSBleHBlY3RlZF90cHRfbWltbzJfNDBNSHo7Ci0KLQlpZiAoIXRibC0+aXNfU0dJICYmICFscV9zdGEtPmlzX2FnZykJCS8qIE5vcm1hbCAqLwotCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzBdOwotCWVsc2UgaWYgKHRibC0+aXNfU0dJICYmICFscV9zdGEtPmlzX2FnZykJLyogU0dJICovCi0JCXRibC0+ZXhwZWN0ZWRfdHB0ID0gaHRfdGJsX3BvaW50ZXJbMV07Ci0JZWxzZSBpZiAoIXRibC0+aXNfU0dJICYmIGxxX3N0YS0+aXNfYWdnKQkvKiBBR0cgKi8KLQkJdGJsLT5leHBlY3RlZF90cHQgPSBodF90YmxfcG9pbnRlclsyXTsKLQllbHNlCQkJCQkJLyogQUdHK1NHSSAqLwotCQl0YmwtPmV4cGVjdGVkX3RwdCA9IGh0X3RibF9wb2ludGVyWzNdOwotfQotCi0vKgotICogRmluZCBzdGFydGluZyByYXRlIGZvciBuZXcgInNlYXJjaCIgaGlnaC10aHJvdWdocHV0IG1vZGUgb2YgbW9kdWxhdGlvbi4KLSAqIEdvYWwgaXMgdG8gZmluZCBsb3dlc3QgZXhwZWN0ZWQgcmF0ZSAodW5kZXIgcGVyZmVjdCBjb25kaXRpb25zKSB0aGF0IGlzCi0gKiBhYm92ZSB0aGUgY3VycmVudCBtZWFzdXJlZCB0aHJvdWdocHV0IG9mICJhY3RpdmUiIG1vZGUsIHRvIGdpdmUgbmV3IG1vZGUKLSAqIGEgZmFpciBjaGFuY2UgdG8gcHJvdmUgaXRzZWxmIHdpdGhvdXQgdG9vIG1hbnkgY2hhbGxlbmdlcy4KLSAqCi0gKiBUaGlzIGdldHMgY2FsbGVkIHdoZW4gdHJhbnNpdGlvbmluZyB0byBtb3JlIGFnZ3Jlc3NpdmUgbW9kdWxhdGlvbgotICogKGkuZS4gbGVnYWN5IHRvIFNJU08gb3IgTUlNTywgb3IgU0lTTyB0byBNSU1PKSwgYXMgd2VsbCBhcyBsZXNzIGFnZ3Jlc3NpdmUKLSAqIChpLmUuIE1JTU8gdG8gU0lTTykuICBXaGVuIG1vdmluZyB0byBNSU1PLCBiaXQgcmF0ZSB3aWxsIHR5cGljYWxseSBuZWVkCi0gKiB0byBkZWNyZWFzZSB0byBtYXRjaCAiYWN0aXZlIiB0aHJvdWdocHV0LiAgV2hlbiBtb3ZpbmcgZnJvbSBNSU1PIHRvIFNJU08sCi0gKiBiaXQgcmF0ZSB3aWxsIHR5cGljYWxseSBuZWVkIHRvIGluY3JlYXNlLCBidXQgbm90IGlmIHBlcmZvcm1hbmNlIHdhcyBiYWQuCi0gKi8KLXN0YXRpYyBzMzIgaXdsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhLAotCQkJICAgIHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCwJLyogInNlYXJjaCIgKi8KLQkJCSAgICB1MTYgcmF0ZV9tYXNrLCBzOCBpbmRleCkKLXsKLQkvKiAiYWN0aXZlIiB2YWx1ZXMgKi8KLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICphY3RpdmVfdGJsID0KLQkgICAgJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JczMyIGFjdGl2ZV9zciA9IGFjdGl2ZV90YmwtPndpbltpbmRleF0uc3VjY2Vzc19yYXRpbzsKLQlzMzIgYWN0aXZlX3RwdCA9IGFjdGl2ZV90YmwtPmV4cGVjdGVkX3RwdFtpbmRleF07Ci0KLQkvKiBleHBlY3RlZCAic2VhcmNoIiB0aHJvdWdocHV0ICovCi0JczMyICp0cHRfdGJsID0gdGJsLT5leHBlY3RlZF90cHQ7Ci0KLQlzMzIgbmV3X3JhdGUsIGhpZ2gsIGxvdywgc3RhcnRfaGk7Ci0JdTE2IGhpZ2hfbG93OwotCXM4IHJhdGUgPSBpbmRleDsKLQotCW5ld19yYXRlID0gaGlnaCA9IGxvdyA9IHN0YXJ0X2hpID0gSVdMX1JBVEVfSU5WQUxJRDsKLQotCWZvciAoOyA7KSB7Ci0JCWhpZ2hfbG93ID0gaXdsNDk2NV9yc19nZXRfYWRqYWNlbnRfcmF0ZShwcml2LCByYXRlLCByYXRlX21hc2ssCi0JCQkJCQl0YmwtPmxxX3R5cGUpOwotCi0JCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKLQkJaGlnaCA9IChoaWdoX2xvdyA+PiA4KSAmIDB4ZmY7Ci0KLQkJLyoKLQkJICogTG93ZXIgdGhlICJzZWFyY2giIGJpdCByYXRlLCB0byBnaXZlIG5ldyAic2VhcmNoIiBtb2RlCi0JCSAqIGFwcHJveGltYXRlbHkgdGhlIHNhbWUgdGhyb3VnaHB1dCBhcyAiYWN0aXZlIiBpZjoKLQkJICoKLQkJICogMSkgIkFjdGl2ZSIgbW9kZSBoYXMgYmVlbiB3b3JraW5nIG1vZGVzdGx5IHdlbGwgKGJ1dCBub3QKLQkJICogICAgZ3JlYXQpLCBhbmQgZXhwZWN0ZWQgInNlYXJjaCIgdGhyb3VnaHB1dCAodW5kZXIgcGVyZmVjdAotCQkgKiAgICBjb25kaXRpb25zKSBhdCBjYW5kaWRhdGUgcmF0ZSBpcyBhYm92ZSB0aGUgYWN0dWFsCi0JCSAqICAgIG1lYXN1cmVkICJhY3RpdmUiIHRocm91Z2hwdXQgKGJ1dCBsZXNzIHRoYW4gZXhwZWN0ZWQKLQkJICogICAgImFjdGl2ZSIgdGhyb3VnaHB1dCB1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpLgotCQkgKiBPUgotCQkgKiAyKSAiQWN0aXZlIiBtb2RlIGhhcyBiZWVuIHdvcmtpbmcgcGVyZmVjdGx5IG9yIHZlcnkgd2VsbAotCQkgKiAgICBhbmQgZXhwZWN0ZWQgInNlYXJjaCIgdGhyb3VnaHB1dCAodW5kZXIgcGVyZmVjdAotCQkgKiAgICBjb25kaXRpb25zKSBhdCBjYW5kaWRhdGUgcmF0ZSBpcyBhYm92ZSBleHBlY3RlZAotCQkgKiAgICAiYWN0aXZlIiB0aHJvdWdocHV0ICh1bmRlciBwZXJmZWN0IGNvbmRpdGlvbnMpLgotCQkgKi8KLQkJaWYgKCgoKDEwMCAqIHRwdF90YmxbcmF0ZV0pID4gbHFfc3RhLT5sYXN0X3RwdCkgJiYKLQkJICAgICAoKGFjdGl2ZV9zciA+IElXTF9SQVRFX0RFQ1JFQVNFX1RIKSAmJgotCQkgICAgICAoYWN0aXZlX3NyIDw9IElXTF9SQVRFX0hJR0hfVEgpICYmCi0JCSAgICAgICh0cHRfdGJsW3JhdGVdIDw9IGFjdGl2ZV90cHQpKSkgfHwKLQkJICAgICgoYWN0aXZlX3NyID49IElXTF9SQVRFX1NDQUxFX1NXSVRDSCkgJiYKLQkJICAgICAodHB0X3RibFtyYXRlXSA+IGFjdGl2ZV90cHQpKSkgewotCi0JCQkvKiAoMm5kIG9yIGxhdGVyIHBhc3MpCi0JCQkgKiBJZiB3ZSd2ZSBhbHJlYWR5IHRyaWVkIHRvIHJhaXNlIHRoZSByYXRlLCBhbmQgYXJlCi0JCQkgKiBub3cgdHJ5aW5nIHRvIGxvd2VyIGl0LCB1c2UgdGhlIGhpZ2hlciByYXRlLiAqLwotCQkJaWYgKHN0YXJ0X2hpICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKLQkJCQluZXdfcmF0ZSA9IHN0YXJ0X2hpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCQluZXdfcmF0ZSA9IHJhdGU7Ci0KLQkJCS8qIExvb3AgYWdhaW4gd2l0aCBsb3dlciByYXRlICovCi0JCQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCQkJcmF0ZSA9IGxvdzsKLQotCQkJLyogTG93ZXIgcmF0ZSBub3QgYXZhaWxhYmxlLCB1c2UgdGhlIG9yaWdpbmFsICovCi0JCQllbHNlCi0JCQkJYnJlYWs7Ci0KLQkJLyogRWxzZSB0cnkgdG8gcmFpc2UgdGhlICJzZWFyY2giIHJhdGUgdG8gbWF0Y2ggImFjdGl2ZSIgKi8KLQkJfSBlbHNlIHsKLQkJCS8qICgybmQgb3IgbGF0ZXIgcGFzcykKLQkJCSAqIElmIHdlJ3ZlIGFscmVhZHkgdHJpZWQgdG8gbG93ZXIgdGhlIHJhdGUsIGFuZCBhcmUKLQkJCSAqIG5vdyB0cnlpbmcgdG8gcmFpc2UgaXQsIHVzZSB0aGUgbG93ZXIgcmF0ZS4gKi8KLQkJCWlmIChuZXdfcmF0ZSAhPSBJV0xfUkFURV9JTlZBTElEKQotCQkJCWJyZWFrOwotCi0JCQkvKiBMb29wIGFnYWluIHdpdGggaGlnaGVyIHJhdGUgKi8KLQkJCWVsc2UgaWYgKGhpZ2ggIT0gSVdMX1JBVEVfSU5WQUxJRCkgewotCQkJCXN0YXJ0X2hpID0gaGlnaDsKLQkJCQlyYXRlID0gaGlnaDsKLQotCQkJLyogSGlnaGVyIHJhdGUgbm90IGF2YWlsYWJsZSwgdXNlIHRoZSBvcmlnaW5hbCAqLwotCQkJfSBlbHNlIHsKLQkJCQluZXdfcmF0ZSA9IHJhdGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbmV3X3JhdGU7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgc2VhcmNoIHRhYmxlIGZvciBNSU1PMgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfc3dpdGNoX3RvX21pbW8yKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwsIGludCBpbmRleCkKLXsKLQl1MTYgcmF0ZV9tYXNrOwotCXMzMiByYXRlOwotCXM4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHN0YV9wcml2LT5jb21tb24uY3R4OwotCi0JaWYgKCFjb25mX2lzX2h0KGNvbmYpIHx8ICFzdGEtPmh0X2NhcC5odF9zdXBwb3J0ZWQpCi0JCXJldHVybiAtMTsKLQotCWlmICgoKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU01fUFMpID4+IDIpCi0JCQkJCQk9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpCi0JCXJldHVybiAtMTsKLQotCS8qIE5lZWQgYm90aCBUeCBjaGFpbnMvYW50ZW5uYXMgdG8gc3VwcG9ydCBNSU1PICovCi0JaWYgKHByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtIDwgMikKLQkJcmV0dXJuIC0xOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiB0cnkgdG8gc3dpdGNoIHRvIE1JTU8yXG4iKTsKLQotCXRibC0+bHFfdHlwZSA9IExRX01JTU8yOwotCXRibC0+aXNfZHVwID0gbHFfc3RhLT5pc19kdXA7Ci0JdGJsLT5hY3Rpb24gPSAwOwotCXRibC0+bWF4X3NlYXJjaCA9IElXTF9NQVhfU0VBUkNIOwotCXJhdGVfbWFzayA9IGxxX3N0YS0+YWN0aXZlX21pbW8yX3JhdGU7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19odDQwX3R4X2FsbG93ZWQocHJpdiwgY3R4LCAmc3RhLT5odF9jYXApKQotCQl0YmwtPmlzX2h0NDAgPSAxOwotCWVsc2UKLQkJdGJsLT5pc19odDQwID0gMDsKLQotCWl3bDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHRibCk7Ci0KLQlyYXRlID0gaXdsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHByaXYsIGxxX3N0YSwgdGJsLCByYXRlX21hc2ssIGluZGV4KTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogTUlNTzIgYmVzdCByYXRlICVkIG1hc2sgJVhcbiIsCi0JCQkJcmF0ZSwgcmF0ZV9tYXNrKTsKLQlpZiAoKHJhdGUgPT0gSVdMX1JBVEVfSU5WQUxJRCkgfHwgISgoMSA8PCByYXRlKSAmIHJhdGVfbWFzaykpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCQkiQ2FuJ3Qgc3dpdGNoIHdpdGggaW5kZXggJWQgcmF0ZSBtYXNrICV4XG4iLAotCQkJCQkJcmF0ZSwgcmF0ZV9tYXNrKTsKLQkJcmV0dXJuIC0xOwotCX0KLQl0YmwtPmN1cnJlbnRfcmF0ZSA9IGl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKHByaXYsCi0JCQkJCQkgdGJsLCByYXRlLCBpc19ncmVlbik7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFN3aXRjaCB0byBuZXcgbWNzICVYIGluZGV4IGlzIGdyZWVuICVYXG4iLAotCQkgICAgIHRibC0+Y3VycmVudF9yYXRlLCBpc19ncmVlbik7Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXQgdXAgc2VhcmNoIHRhYmxlIGZvciBTSVNPCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9yc19zd2l0Y2hfdG9fc2lzbyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgICAgc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLCBpbnQgaW5kZXgpCi17Ci0JdTE2IHJhdGVfbWFzazsKLQl1OCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47Ci0JczMyIHJhdGU7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKLQotCWlmICghY29uZl9pc19odChjb25mKSB8fCAhc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKQotCQlyZXR1cm4gLTE7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IHRyeSB0byBzd2l0Y2ggdG8gU0lTT1xuIik7Ci0KLQl0YmwtPmlzX2R1cCA9IGxxX3N0YS0+aXNfZHVwOwotCXRibC0+bHFfdHlwZSA9IExRX1NJU087Ci0JdGJsLT5hY3Rpb24gPSAwOwotCXRibC0+bWF4X3NlYXJjaCA9IElXTF9NQVhfU0VBUkNIOwotCXJhdGVfbWFzayA9IGxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2h0NDBfdHhfYWxsb3dlZChwcml2LCBjdHgsICZzdGEtPmh0X2NhcCkpCi0JCXRibC0+aXNfaHQ0MCA9IDE7Ci0JZWxzZQotCQl0YmwtPmlzX2h0NDAgPSAwOwotCi0JaWYgKGlzX2dyZWVuKQotCQl0YmwtPmlzX1NHSSA9IDA7IC8qMTFuIHNwZWM6IG5vIFNHSSBpbiBTSVNPK0dyZWVuZmllbGQqLwotCi0JaXdsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwgdGJsKTsKLQlyYXRlID0gaXdsNDk2NV9yc19nZXRfYmVzdF9yYXRlKHByaXYsIGxxX3N0YSwgdGJsLCByYXRlX21hc2ssIGluZGV4KTsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogZ2V0IGJlc3QgcmF0ZSAlZCBtYXNrICVYXG4iLCByYXRlLCByYXRlX21hc2spOwotCWlmICgocmF0ZSA9PSBJV0xfUkFURV9JTlZBTElEKSB8fCAhKCgxIDw8IHJhdGUpICYgcmF0ZV9tYXNrKSkgewotCQlJV0xfREVCVUdfUkFURShwcml2LAotCQkJImNhbiBub3Qgc3dpdGNoIHdpdGggaW5kZXggJWQgcmF0ZSBtYXNrICV4XG4iLAotCQkJICAgICByYXRlLCByYXRlX21hc2spOwotCQlyZXR1cm4gLTE7Ci0JfQotCXRibC0+Y3VycmVudF9yYXRlID0gaXdsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwocHJpdiwKLQkJCQkJCXRibCwgcmF0ZSwgaXNfZ3JlZW4pOwotCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogU3dpdGNoIHRvIG5ldyBtY3MgJVggaW5kZXggaXMgZ3JlZW4gJVhcbiIsCi0JCSAgICAgdGJsLT5jdXJyZW50X3JhdGUsIGlzX2dyZWVuKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoKLSAqIFRyeSB0byBzd2l0Y2ggdG8gbmV3IG1vZHVsYXRpb24gbW9kZSBmcm9tIGxlZ2FjeQotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfcnNfbW92ZV9sZWdhY3lfb3RoZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkJaW50IGluZGV4KQotewotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibCA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnNlYXJjaF90YmwgPQotCQkJCSYobHFfc3RhLT5scV9pbmZvWygxIC0gbHFfc3RhLT5hY3RpdmVfdGJsKV0pOwotCXN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3cgPSAmKHRibC0+d2luW2luZGV4XSk7Ci0JdTMyIHN6ID0gKHNpemVvZihzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvKSAtCi0JCSAgKHNpemVvZihzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSkgKiBJV0xfUkFURV9DT1VOVCkpOwotCXU4IHN0YXJ0X2FjdGlvbjsKLQl1OCB2YWxpZF90eF9hbnQgPSBwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OwotCXU4IHR4X2NoYWluc19udW0gPSBwcml2LT5od19wYXJhbXMudHhfY2hhaW5zX251bTsKLQlpbnQgcmV0ID0gMDsKLQl1OCB1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMDsKLQotCXRibC0+YWN0aW9uID0gSVdMX0xFR0FDWV9TV0lUQ0hfU0lTTzsKLQotCXN0YXJ0X2FjdGlvbiA9IHRibC0+YWN0aW9uOwotCWZvciAoOyA7KSB7Ci0JCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKLQkJc3dpdGNoICh0YmwtPmFjdGlvbikgewotCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExOgotCQljYXNlIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkEyOgotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBMZWdhY3kgdG9nZ2xlIEFudGVubmFcbiIpOwotCi0JCQlpZiAoKHRibC0+YWN0aW9uID09IElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkExICYmCi0JCQkJCQkJdHhfY2hhaW5zX251bSA8PSAxKSB8fAotCQkJICAgICh0YmwtPmFjdGlvbiA9PSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMiAmJgotCQkJCQkJCXR4X2NoYWluc19udW0gPD0gMikpCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIERvbid0IGNoYW5nZSBhbnRlbm5hIGlmIHN1Y2Nlc3MgaGFzIGJlZW4gZ3JlYXQgKi8KLQkJCWlmICh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gPj0gSVdMX1JTX0dPT0RfUkFUSU8pCi0JCQkJYnJlYWs7Ci0KLQkJCS8qIFNldCB1cCBzZWFyY2ggdGFibGUgdG8gdHJ5IG90aGVyIGFudGVubmEgKi8KLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQotCQkJaWYgKGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCSZzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUsIHNlYXJjaF90YmwpKSB7Ci0JCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7Ci0JCQkJaXdsNDk2NV9yc19zZXRfZXhwZWN0ZWRfdHB0X3RhYmxlKGxxX3N0YSwKLQkJCQkJCQkJc2VhcmNoX3RibCk7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9TSVNPOgotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBMZWdhY3kgc3dpdGNoIHRvIFNJU09cbiIpOwotCi0JCQkvKiBTZXQgdXAgc2VhcmNoIHRhYmxlIHRvIHRyeSBTSVNPICovCi0JCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7Ci0JCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAwOwotCQkJcmV0ID0gaXdsNDk2NV9yc19zd2l0Y2hfdG9fc2lzbyhwcml2LCBscV9zdGEsIGNvbmYsIHN0YSwKLQkJCQkJCSBzZWFyY2hfdGJsLCBpbmRleCk7Ci0JCQlpZiAoIXJldCkgewotCQkJCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIgPSAwOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCi0JCQlicmVhazsKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQjoKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQzoKLQkJY2FzZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQzoKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogTGVnYWN5IHN3aXRjaCB0byBNSU1PMlxuIik7Ci0KLQkJCS8qIFNldCB1cCBzZWFyY2ggdGFibGUgdG8gdHJ5IE1JTU8gKi8KLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7Ci0KLQkJCWlmICh0YmwtPmFjdGlvbiA9PSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9BQikKLQkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9BQjsKLQkJCWVsc2UgaWYgKHRibC0+YWN0aW9uID09IElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FDKQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0FDOwotCQkJZWxzZQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0JDOwotCi0JCQlpZiAoIWl3bDQ5NjVfcnNfaXNfdmFsaWRfYW50KHZhbGlkX3R4X2FudCwKLQkJCQkJCXNlYXJjaF90YmwtPmFudF90eXBlKSkKLQkJCQlicmVhazsKLQotCQkJcmV0ID0gaXdsNDk2NV9yc19zd2l0Y2hfdG9fbWltbzIocHJpdiwgbHFfc3RhLAotCQkJCQkJY29uZiwgc3RhLAotCQkJCQkJIHNlYXJjaF90YmwsIGluZGV4KTsKLQkJCWlmICghcmV0KSB7Ci0JCQkJbHFfc3RhLT5hY3Rpb25fY291bnRlciA9IDA7Ci0JCQkJZ290byBvdXQ7Ci0JCQl9Ci0JCQlicmVhazsKLQkJfQotCQl0YmwtPmFjdGlvbisrOwotCQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQykKLQkJCXRibC0+YWN0aW9uID0gSVdMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTE7Ci0KLQkJaWYgKHRibC0+YWN0aW9uID09IHN0YXJ0X2FjdGlvbikKLQkJCWJyZWFrOwotCi0JfQotCXNlYXJjaF90YmwtPmxxX3R5cGUgPSBMUV9OT05FOwotCXJldHVybiAwOwotCi1vdXQ6Ci0JbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7Ci0JdGJsLT5hY3Rpb24rKzsKLQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQykKLQkJdGJsLT5hY3Rpb24gPSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMTsKLQlpZiAodXBkYXRlX3NlYXJjaF90YmxfY291bnRlcikKLQkJc2VhcmNoX3RibC0+YWN0aW9uID0gdGJsLT5hY3Rpb247Ci0JcmV0dXJuIDA7Ci0KLX0KLQotLyoKLSAqIFRyeSB0byBzd2l0Y2ggdG8gbmV3IG1vZHVsYXRpb24gbW9kZSBmcm9tIFNJU08KLSAqLwotc3RhdGljIGludCBpd2w0OTY1X3JzX21vdmVfc2lzb190b19vdGhlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKLQkJCQkgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgaW50IGluZGV4KQotewotCXU4IGlzX2dyZWVuID0gbHFfc3RhLT5pc19ncmVlbjsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1tscV9zdGEtPmFjdGl2ZV90YmxdKTsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICpzZWFyY2hfdGJsID0KLQkJCQkmKGxxX3N0YS0+bHFfaW5mb1soMSAtIGxxX3N0YS0+YWN0aXZlX3RibCldKTsKLQlzdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSAqd2luZG93ID0gJih0YmwtPndpbltpbmRleF0pOwotCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwID0gJnN0YS0+aHRfY2FwOwotCXUzMiBzeiA9IChzaXplb2Yoc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbykgLQotCQkgIChzaXplb2Yoc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEpICogSVdMX1JBVEVfQ09VTlQpKTsKLQl1OCBzdGFydF9hY3Rpb247Ci0JdTggdmFsaWRfdHhfYW50ID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQl1OCB0eF9jaGFpbnNfbnVtID0gcHJpdi0+aHdfcGFyYW1zLnR4X2NoYWluc19udW07Ci0JdTggdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDA7Ci0JaW50IHJldDsKLQotCXN0YXJ0X2FjdGlvbiA9IHRibC0+YWN0aW9uOwotCi0JZm9yICg7OykgewotCQlscV9zdGEtPmFjdGlvbl9jb3VudGVyKys7Ci0JCXN3aXRjaCAodGJsLT5hY3Rpb24pIHsKLQkJY2FzZSBJV0xfU0lTT19TV0lUQ0hfQU5URU5OQTE6Ci0JCWNhc2UgSVdMX1NJU09fU1dJVENIX0FOVEVOTkEyOgotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBTSVNPIHRvZ2dsZSBBbnRlbm5hXG4iKTsKLQkJCWlmICgodGJsLT5hY3Rpb24gPT0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExICYmCi0JCQkJCQl0eF9jaGFpbnNfbnVtIDw9IDEpIHx8Ci0JCQkgICAgKHRibC0+YWN0aW9uID09IElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMiAmJgotCQkJCQkJdHhfY2hhaW5zX251bSA8PSAyKSkKLQkJCQlicmVhazsKLQotCQkJaWYgKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUlNfR09PRF9SQVRJTykKLQkJCQlicmVhazsKLQotCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOwotCQkJaWYgKGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCSAgICAgICAmc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlLCBzZWFyY2hfdGJsKSkgewotCQkJCXVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAxOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSVdMX1NJU09fU1dJVENIX01JTU8yX0FCOgotCQljYXNlIElXTF9TSVNPX1NXSVRDSF9NSU1PMl9BQzoKLQkJY2FzZSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQkM6Ci0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFNJU08gc3dpdGNoIHRvIE1JTU8yXG4iKTsKLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQkJCXNlYXJjaF90YmwtPmlzX1NHSSA9IDA7Ci0KLQkJCWlmICh0YmwtPmFjdGlvbiA9PSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUIpCi0JCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUI7Ci0JCQllbHNlIGlmICh0YmwtPmFjdGlvbiA9PSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUMpCi0JCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQUM7Ci0JCQllbHNlCi0JCQkJc2VhcmNoX3RibC0+YW50X3R5cGUgPSBBTlRfQkM7Ci0KLQkJCWlmICghaXdsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LAotCQkJCQkJIHNlYXJjaF90YmwtPmFudF90eXBlKSkKLQkJCQlicmVhazsKLQotCQkJcmV0ID0gaXdsNDk2NV9yc19zd2l0Y2hfdG9fbWltbzIocHJpdiwgbHFfc3RhLAotCQkJCQkJY29uZiwgc3RhLAotCQkJCQkJIHNlYXJjaF90YmwsIGluZGV4KTsKLQkJCWlmICghcmV0KQotCQkJCWdvdG8gb3V0OwotCQkJYnJlYWs7Ci0JCWNhc2UgSVdMX1NJU09fU1dJVENIX0dJOgotCQkJaWYgKCF0YmwtPmlzX2h0NDAgJiYgIShodF9jYXAtPmNhcCAmCi0JCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAodGJsLT5pc19odDQwICYmICEoaHRfY2FwLT5jYXAgJgotCQkJCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQotCQkJCWJyZWFrOwotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFNJU08gdG9nZ2xlIFNHSS9OR0lcbiIpOwotCi0JCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7Ci0JCQlpZiAoaXNfZ3JlZW4pIHsKLQkJCQlpZiAoIXRibC0+aXNfU0dJKQotCQkJCQlicmVhazsKLQkJCQllbHNlCi0JCQkJCUlXTF9FUlIocHJpdiwKLQkJCQkJCSJTR0kgd2FzIHNldCBpbiBHRitTSVNPXG4iKTsKLQkJCX0KLQkJCXNlYXJjaF90YmwtPmlzX1NHSSA9ICF0YmwtPmlzX1NHSTsKLQkJCWl3bDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHNlYXJjaF90YmwpOwotCQkJaWYgKHRibC0+aXNfU0dJKSB7Ci0JCQkJczMyIHRwdCA9IGxxX3N0YS0+bGFzdF90cHQgLyAxMDA7Ci0JCQkJaWYgKHRwdCA+PSBzZWFyY2hfdGJsLT5leHBlY3RlZF90cHRbaW5kZXhdKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXNlYXJjaF90YmwtPmN1cnJlbnRfcmF0ZSA9Ci0JCQkJaXdsNDk2NV9yYXRlX25fZmxhZ3NfZnJvbV90YmwocHJpdiwgc2VhcmNoX3RibCwKLQkJCQkJCSAgICAgIGluZGV4LCBpc19ncmVlbik7Ci0JCQl1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyID0gMTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0JCXRibC0+YWN0aW9uKys7Ci0JCWlmICh0YmwtPmFjdGlvbiA+IElXTF9TSVNPX1NXSVRDSF9HSSkKLQkJCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExOwotCi0JCWlmICh0YmwtPmFjdGlvbiA9PSBzdGFydF9hY3Rpb24pCi0JCQlicmVhazsKLQl9Ci0Jc2VhcmNoX3RibC0+bHFfdHlwZSA9IExRX05PTkU7Ci0JcmV0dXJuIDA7Ci0KLSBvdXQ6Ci0JbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7Ci0JdGJsLT5hY3Rpb24rKzsKLQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfU0lTT19TV0lUQ0hfR0kpCi0JCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExOwotCWlmICh1cGRhdGVfc2VhcmNoX3RibF9jb3VudGVyKQotCQlzZWFyY2hfdGJsLT5hY3Rpb24gPSB0YmwtPmFjdGlvbjsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogVHJ5IHRvIHN3aXRjaCB0byBuZXcgbW9kdWxhdGlvbiBtb2RlIGZyb20gTUlNTzIKLSAqLwotc3RhdGljIGludCBpd2w0OTY1X3JzX21vdmVfbWltbzJfdG9fb3RoZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhLAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGludCBpbmRleCkKLXsKLQlzOCBpc19ncmVlbiA9IGxxX3N0YS0+aXNfZ3JlZW47Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqc2VhcmNoX3RibCA9Ci0JCQkJJihscV9zdGEtPmxxX2luZm9bKDEgLSBscV9zdGEtPmFjdGl2ZV90YmwpXSk7Ci0Jc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgKndpbmRvdyA9ICYodGJsLT53aW5baW5kZXhdKTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKLQl1MzIgc3ogPSAoc2l6ZW9mKHN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8pIC0KLQkJICAoc2l6ZW9mKHN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhKSAqIElXTF9SQVRFX0NPVU5UKSk7Ci0JdTggc3RhcnRfYWN0aW9uOwotCXU4IHZhbGlkX3R4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7Ci0JdTggdHhfY2hhaW5zX251bSA9IHByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtOwotCXU4IHVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAwOwotCWludCByZXQ7Ci0KLQlzdGFydF9hY3Rpb24gPSB0YmwtPmFjdGlvbjsKLQlmb3IgKDs7KSB7Ci0JCWxxX3N0YS0+YWN0aW9uX2NvdW50ZXIrKzsKLQkJc3dpdGNoICh0YmwtPmFjdGlvbikgewotCQljYXNlIElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE6Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9BTlRFTk5BMjoKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogTUlNTzIgdG9nZ2xlIEFudGVubmFzXG4iKTsKLQotCQkJaWYgKHR4X2NoYWluc19udW0gPD0gMikKLQkJCQlicmVhazsKLQotCQkJaWYgKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyA+PSBJV0xfUlNfR09PRF9SQVRJTykKLQkJCQlicmVhazsKLQotCQkJbWVtY3B5KHNlYXJjaF90YmwsIHRibCwgc3opOwotCQkJaWYgKGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCSAgICAgICAmc2VhcmNoX3RibC0+Y3VycmVudF9yYXRlLCBzZWFyY2hfdGJsKSkgewotCQkJCXVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIgPSAxOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJYnJlYWs7Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0E6Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0I6Ci0JCWNhc2UgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0M6Ci0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IE1JTU8yIHN3aXRjaCB0byBTSVNPXG4iKTsKLQotCQkJLyogU2V0IHVwIG5ldyBzZWFyY2ggdGFibGUgZm9yIFNJU08gKi8KLQkJCW1lbWNweShzZWFyY2hfdGJsLCB0YmwsIHN6KTsKLQotCQkJaWYgKHRibC0+YWN0aW9uID09IElXTF9NSU1PMl9TV0lUQ0hfU0lTT19BKQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0E7Ci0JCQllbHNlIGlmICh0YmwtPmFjdGlvbiA9PSBJV0xfTUlNTzJfU1dJVENIX1NJU09fQikKLQkJCQlzZWFyY2hfdGJsLT5hbnRfdHlwZSA9IEFOVF9COwotCQkJZWxzZQotCQkJCXNlYXJjaF90YmwtPmFudF90eXBlID0gQU5UX0M7Ci0KLQkJCWlmICghaXdsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LAotCQkJCQkJc2VhcmNoX3RibC0+YW50X3R5cGUpKQotCQkJCWJyZWFrOwotCi0JCQlyZXQgPSBpd2w0OTY1X3JzX3N3aXRjaF90b19zaXNvKHByaXYsIGxxX3N0YSwKLQkJCQkJCWNvbmYsIHN0YSwKLQkJCQkJCSBzZWFyY2hfdGJsLCBpbmRleCk7Ci0JCQlpZiAoIXJldCkKLQkJCQlnb3RvIG91dDsKLQotCQkJYnJlYWs7Ci0KLQkJY2FzZSBJV0xfTUlNTzJfU1dJVENIX0dJOgotCQkJaWYgKCF0YmwtPmlzX2h0NDAgJiYgIShodF9jYXAtPmNhcCAmCi0JCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMCkpCi0JCQkJYnJlYWs7Ci0JCQlpZiAodGJsLT5pc19odDQwICYmICEoaHRfY2FwLT5jYXAgJgotCQkJCQkJSUVFRTgwMjExX0hUX0NBUF9TR0lfNDApKQotCQkJCWJyZWFrOwotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IE1JTU8yIHRvZ2dsZSBTR0kvTkdJXG4iKTsKLQotCQkJLyogU2V0IHVwIG5ldyBzZWFyY2ggdGFibGUgZm9yIE1JTU8yICovCi0JCQltZW1jcHkoc2VhcmNoX3RibCwgdGJsLCBzeik7Ci0JCQlzZWFyY2hfdGJsLT5pc19TR0kgPSAhdGJsLT5pc19TR0k7Ci0JCQlpd2w0OTY1X3JzX3NldF9leHBlY3RlZF90cHRfdGFibGUobHFfc3RhLCBzZWFyY2hfdGJsKTsKLQkJCS8qCi0JCQkgKiBJZiBhY3RpdmUgdGFibGUgYWxyZWFkeSB1c2VzIHRoZSBmYXN0ZXN0IHBvc3NpYmxlCi0JCQkgKiBtb2R1bGF0aW9uIChkdWFsIHN0cmVhbSB3aXRoIHNob3J0IGd1YXJkIGludGVydmFsKSwKLQkJCSAqIGFuZCBpdCdzIHdvcmtpbmcgd2VsbCwgdGhlcmUncyBubyBuZWVkIHRvIGxvb2sKLQkJCSAqIGZvciBhIGJldHRlciB0eXBlIG9mIG1vZHVsYXRpb24hCi0JCQkgKi8KLQkJCWlmICh0YmwtPmlzX1NHSSkgewotCQkJCXMzMiB0cHQgPSBscV9zdGEtPmxhc3RfdHB0IC8gMTAwOwotCQkJCWlmICh0cHQgPj0gc2VhcmNoX3RibC0+ZXhwZWN0ZWRfdHB0W2luZGV4XSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlzZWFyY2hfdGJsLT5jdXJyZW50X3JhdGUgPQotCQkJCWl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKHByaXYsIHNlYXJjaF90YmwsCi0JCQkJCQkgICAgICBpbmRleCwgaXNfZ3JlZW4pOwotCQkJdXBkYXRlX3NlYXJjaF90YmxfY291bnRlciA9IDE7Ci0JCQlnb3RvIG91dDsKLQotCQl9Ci0JCXRibC0+YWN0aW9uKys7Ci0JCWlmICh0YmwtPmFjdGlvbiA+IElXTF9NSU1PMl9TV0lUQ0hfR0kpCi0JCQl0YmwtPmFjdGlvbiA9IElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE7Ci0KLQkJaWYgKHRibC0+YWN0aW9uID09IHN0YXJ0X2FjdGlvbikKLQkJCWJyZWFrOwotCX0KLQlzZWFyY2hfdGJsLT5scV90eXBlID0gTFFfTk9ORTsKLQlyZXR1cm4gMDsKLSBvdXQ6Ci0JbHFfc3RhLT5zZWFyY2hfYmV0dGVyX3RibCA9IDE7Ci0JdGJsLT5hY3Rpb24rKzsKLQlpZiAodGJsLT5hY3Rpb24gPiBJV0xfTUlNTzJfU1dJVENIX0dJKQotCQl0YmwtPmFjdGlvbiA9IElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTE7Ci0JaWYgKHVwZGF0ZV9zZWFyY2hfdGJsX2NvdW50ZXIpCi0JCXNlYXJjaF90YmwtPmFjdGlvbiA9IHRibC0+YWN0aW9uOwotCi0JcmV0dXJuIDA7Ci0KLX0KLQotLyoKLSAqIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIGNvbnRpbnVlIHVzaW5nIHNhbWUgbW9kdWxhdGlvbiBtb2RlLCBvcgotICogYmVnaW4gc2VhcmNoIGZvciBhIG5ldyBtb2RlLCBiYXNlZCBvbjoKLSAqIDEpICMgdHggc3VjY2Vzc2VzIG9yIGZhaWx1cmVzIHdoaWxlIHVzaW5nIHRoaXMgbW9kZQotICogMikgIyB0aW1lcyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KLSAqIDMpIGVsYXBzZWQgdGltZSBpbiB0aGlzIG1vZGUgKG5vdCB1c2VkLCBmb3Igbm93KQotICovCi1zdGF0aWMgdm9pZAotaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsIGJvb2wgZm9yY2Vfc2VhcmNoKQotewotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibDsKLQlpbnQgaTsKLQlpbnQgYWN0aXZlX3RibDsKLQlpbnQgZmx1c2hfaW50ZXJ2YWxfcGFzc2VkID0gMDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0JYWN0aXZlX3RibCA9IGxxX3N0YS0+YWN0aXZlX3RibDsKLQotCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKLQotCS8qIElmIHdlJ3ZlIGJlZW4gZGlzYWxsb3dpbmcgc2VhcmNoLCBzZWUgaWYgd2Ugc2hvdWxkIG5vdyBhbGxvdyBpdCAqLwotCWlmIChscV9zdGEtPnN0YXlfaW5fdGJsKSB7Ci0KLQkJLyogRWxhcHNlZCB0aW1lIHVzaW5nIGN1cnJlbnQgbW9kdWxhdGlvbiBtb2RlICovCi0JCWlmIChscV9zdGEtPmZsdXNoX3RpbWVyKQotCQkJZmx1c2hfaW50ZXJ2YWxfcGFzc2VkID0KLQkJCXRpbWVfYWZ0ZXIoamlmZmllcywKLQkJCQkJKHVuc2lnbmVkIGxvbmcpKGxxX3N0YS0+Zmx1c2hfdGltZXIgKwotCQkJCQlJV0xfUkFURV9TQ0FMRV9GTFVTSF9JTlRWTCkpOwotCi0JCS8qCi0JCSAqIENoZWNrIGlmIHdlIHNob3VsZCBhbGxvdyBzZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUuCi0JCSAqIElmIG1hbnkgZnJhbWVzIGhhdmUgZmFpbGVkIG9yIHN1Y2NlZWRlZCwgb3Igd2UndmUgdXNlZAotCQkgKiB0aGlzIHNhbWUgbW9kdWxhdGlvbiBmb3IgYSBsb25nIHRpbWUsIGFsbG93IHNlYXJjaCwgYW5kCi0JCSAqIHJlc2V0IGhpc3Rvcnkgc3RhdHMgdGhhdCBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2Ugc2hvdWxkCi0JCSAqIGFsbG93IGEgbmV3IHNlYXJjaC4gIEFsc28gKGJlbG93KSByZXNldCBhbGwgYml0bWFwcyBhbmQKLQkJICogc3RhdHMgaW4gYWN0aXZlIGhpc3RvcnkuCi0JCSAqLwotCQlpZiAoZm9yY2Vfc2VhcmNoIHx8Ci0JCSAgICAobHFfc3RhLT50b3RhbF9mYWlsZWQgPiBscV9zdGEtPm1heF9mYWlsdXJlX2xpbWl0KSB8fAotCQkgICAgKGxxX3N0YS0+dG90YWxfc3VjY2VzcyA+IGxxX3N0YS0+bWF4X3N1Y2Nlc3NfbGltaXQpIHx8Ci0JCSAgICAoKCFscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKSAmJiAobHFfc3RhLT5mbHVzaF90aW1lcikKLQkJICAgICAmJiAoZmx1c2hfaW50ZXJ2YWxfcGFzc2VkKSkpIHsKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogc3RheSBpcyBleHBpcmVkICVkICVkICVkXG46IiwKLQkJCQkgICAgIGxxX3N0YS0+dG90YWxfZmFpbGVkLAotCQkJCSAgICAgbHFfc3RhLT50b3RhbF9zdWNjZXNzLAotCQkJCSAgICAgZmx1c2hfaW50ZXJ2YWxfcGFzc2VkKTsKLQotCQkJLyogQWxsb3cgc2VhcmNoIGZvciBuZXcgbW9kZSAqLwotCQkJbHFfc3RhLT5zdGF5X2luX3RibCA9IDA7CS8qIG9ubHkgcGxhY2UgcmVzZXQgKi8KLQkJCWxxX3N0YS0+dG90YWxfZmFpbGVkID0gMDsKLQkJCWxxX3N0YS0+dG90YWxfc3VjY2VzcyA9IDA7Ci0JCQlscV9zdGEtPmZsdXNoX3RpbWVyID0gMDsKLQotCQkvKgotCQkgKiBFbHNlIGlmIHdlJ3ZlIHVzZWQgdGhpcyBtb2R1bGF0aW9uIG1vZGUgZW5vdWdoIHJlcGV0aXRpb25zCi0JCSAqIChyZWdhcmRsZXNzIG9mIGVsYXBzZWQgdGltZSBvciBzdWNjZXNzL2ZhaWx1cmUpLCByZXNldAotCQkgKiBoaXN0b3J5IGJpdG1hcHMgYW5kIHJhdGUtc3BlY2lmaWMgc3RhdHMgZm9yIGFsbCByYXRlcyBpbgotCQkgKiBhY3RpdmUgdGFibGUuCi0JCSAqLwotCQl9IGVsc2UgewotCQkJbHFfc3RhLT50YWJsZV9jb3VudCsrOwotCQkJaWYgKGxxX3N0YS0+dGFibGVfY291bnQgPj0KLQkJCSAgICBscV9zdGEtPnRhYmxlX2NvdW50X2xpbWl0KSB7Ci0JCQkJbHFfc3RhLT50YWJsZV9jb3VudCA9IDA7Ci0KLQkJCQlJV0xfREVCVUdfUkFURShwcml2LAotCQkJCQkiTFE6IHN0YXkgaW4gdGFibGUgY2xlYXIgd2luXG4iKTsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKykKLQkJCQkJaXdsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdygKLQkJCQkJCSYodGJsLT53aW5baV0pKTsKLQkJCX0KLQkJfQotCi0JCS8qIElmIHRyYW5zaXRpb25pbmcgdG8gYWxsb3cgInNlYXJjaCIsIHJlc2V0IGFsbCBoaXN0b3J5Ci0JCSAqIGJpdG1hcHMgYW5kIHN0YXRzIGluIGFjdGl2ZSB0YWJsZSAodGhpcyB3aWxsIGJlY29tZSB0aGUgbmV3Ci0JCSAqICJzZWFyY2giIHRhYmxlKS4gKi8KLQkJaWYgKCFscV9zdGEtPnN0YXlfaW5fdGJsKSB7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKykKLQkJCQlpd2w0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luZG93KAotCQkJCQkJCSYodGJsLT53aW5baV0pKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIHNldHVwIHJhdGUgdGFibGUgaW4gdUNvZGUKLSAqIHJldHVybiByYXRlX25fZmxhZ3MgYXMgdXNlZCBpbiB0aGUgdGFibGUKLSAqLwotc3RhdGljIHUzMiBpd2w0OTY1X3JzX3VwZGF0ZV9yYXRlX3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsCi0JCQkJc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLAotCQkJCWludCBpbmRleCwgdTggaXNfZ3JlZW4pCi17Ci0JdTMyIHJhdGU7Ci0KLQkvKiBVcGRhdGUgdUNvZGUncyByYXRlIHRhYmxlLiAqLwotCXJhdGUgPSBpd2w0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChwcml2LCB0YmwsIGluZGV4LCBpc19ncmVlbik7Ci0JaXdsNDk2NV9yc19maWxsX2xpbmtfY21kKHByaXYsIGxxX3N0YSwgcmF0ZSk7Ci0JaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscV9zdGEtPmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKLQotCXJldHVybiByYXRlOwotfQotCi0vKgotICogRG8gcmF0ZSBzY2FsaW5nIGFuZCBzZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfcmF0ZV9zY2FsZV9wZXJmb3JtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCSAgc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHByaXYtPmh3OwotCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlpbnQgbG93ID0gSVdMX1JBVEVfSU5WQUxJRDsKLQlpbnQgaGlnaCA9IElXTF9SQVRFX0lOVkFMSUQ7Ci0JaW50IGluZGV4OwotCWludCBpOwotCXN0cnVjdCBpd2xfcmF0ZV9zY2FsZV9kYXRhICp3aW5kb3cgPSBOVUxMOwotCWludCBjdXJyZW50X3RwdCA9IElXTF9JTlZBTElEX1ZBTFVFOwotCWludCBsb3dfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JaW50IGhpZ2hfdHB0ID0gSVdMX0lOVkFMSURfVkFMVUU7Ci0JdTMyIGZhaWxfY291bnQ7Ci0Jczggc2NhbGVfYWN0aW9uID0gMDsKLQl1MTYgcmF0ZV9tYXNrOwotCXU4IHVwZGF0ZV9scSA9IDA7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsLCAqdGJsMTsKLQl1MTYgcmF0ZV9zY2FsZV9pbmRleF9tc2sgPSAwOwotCXUzMiByYXRlOwotCXU4IGlzX2dyZWVuID0gMDsKLQl1OCBhY3RpdmVfdGJsID0gMDsKLQl1OCBkb25lX3NlYXJjaCA9IDA7Ci0JdTE2IGhpZ2hfbG93OwotCXMzMiBzcjsKLQl1OCB0aWQgPSBNQVhfVElEX0NPVU5UOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gc3RhX3ByaXYtPmNvbW1vbi5jdHg7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAicmF0ZSBzY2FsZSBjYWxjdWxhdGUgbmV3IHJhdGUgZm9yIHNrYlxuIik7Ci0KLQkvKiBTZW5kIG1hbmFnZW1lbnQgZnJhbWVzIGFuZCBOT19BQ0sgZGF0YSB1c2luZyBsb3dlc3QgcmF0ZS4gKi8KLQkvKiBUT0RPOiB0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGltcHJvdmVkLi4gKi8KLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkgfHwKLQkgICAgaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykKLQkJcmV0dXJuOwotCi0JaWYgKCFzdGEgfHwgIWxxX3N0YSkKLQkJcmV0dXJuOwotCi0JbHFfc3RhLT5zdXBwX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzW2xxX3N0YS0+YmFuZF07Ci0KLQl0aWQgPSBpd2w0OTY1X3JzX3RsX2FkZF9wYWNrZXQobHFfc3RhLCBoZHIpOwotCWlmICgodGlkICE9IE1BWF9USURfQ09VTlQpICYmIChscV9zdGEtPnR4X2FnZ190aWRfZW4gJiAoMSA8PCB0aWQpKSkgewotCQl0aWRfZGF0YSA9ICZwcml2LT5zdGF0aW9uc1tscV9zdGEtPmxxLnN0YV9pZF0udGlkW3RpZF07Ci0JCWlmICh0aWRfZGF0YS0+YWdnLnN0YXRlID09IElXTF9BR0dfT0ZGKQotCQkJbHFfc3RhLT5pc19hZ2cgPSAwOwotCQllbHNlCi0JCQlscV9zdGEtPmlzX2FnZyA9IDE7Ci0JfSBlbHNlCi0JCWxxX3N0YS0+aXNfYWdnID0gMDsKLQotCS8qCi0JICogU2VsZWN0IHJhdGUtc2NhbGUgLyBtb2R1bGF0aW9uLW1vZGUgdGFibGUgdG8gd29yayB3aXRoIGluCi0JICogdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbjogICJzZWFyY2giIGlmIHNlYXJjaGluZyBmb3IgYmV0dGVyCi0JICogbW9kdWxhdGlvbiBtb2RlLCBvciAiYWN0aXZlIiBpZiBkb2luZyByYXRlIHNjYWxpbmcgd2l0aGluIGEgbW9kZS4KLQkgKi8KLQlpZiAoIWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpCi0JCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7Ci0JZWxzZQotCQlhY3RpdmVfdGJsID0gMSAtIGxxX3N0YS0+YWN0aXZlX3RibDsKLQotCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKLQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpCi0JCWxxX3N0YS0+aXNfZ3JlZW4gPSAwOwotCWVsc2UKLQkJbHFfc3RhLT5pc19ncmVlbiA9IGl3bDQ5NjVfcnNfdXNlX2dyZWVuKHN0YSk7Ci0JaXNfZ3JlZW4gPSBscV9zdGEtPmlzX2dyZWVuOwotCi0JLyogY3VycmVudCB0eCByYXRlICovCi0JaW5kZXggPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJSYXRlIHNjYWxlIGluZGV4ICVkIGZvciB0eXBlICVkXG4iLCBpbmRleCwKLQkJICAgICAgIHRibC0+bHFfdHlwZSk7Ci0KLQkvKiByYXRlcyBhdmFpbGFibGUgZm9yIHRoaXMgYXNzb2NpYXRpb24sIGFuZCBmb3IgbW9kdWxhdGlvbiBtb2RlICovCi0JcmF0ZV9tYXNrID0gaXdsNDk2NV9yc19nZXRfc3VwcG9ydGVkX3JhdGVzKGxxX3N0YSwgaGRyLCB0YmwtPmxxX3R5cGUpOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgIm1hc2sgMHglMDRYXG4iLCByYXRlX21hc2spOwotCi0JLyogbWFzayB3aXRoIHN0YXRpb24gcmF0ZSByZXN0cmljdGlvbiAqLwotCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkgewotCQlpZiAobHFfc3RhLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCQkvKiBzdXBwX3JhdGVzIGhhcyBubyBDQ0sgYml0cyBpbiBBIG1vZGUgKi8KLQkJCXJhdGVfc2NhbGVfaW5kZXhfbXNrID0gKHUxNikgKHJhdGVfbWFzayAmCi0JCQkJKGxxX3N0YS0+c3VwcF9yYXRlcyA8PCBJV0xfRklSU1RfT0ZETV9SQVRFKSk7Ci0JCWVsc2UKLQkJCXJhdGVfc2NhbGVfaW5kZXhfbXNrID0gKHUxNikgKHJhdGVfbWFzayAmCi0JCQkJCQkgICAgICBscV9zdGEtPnN1cHBfcmF0ZXMpOwotCi0JfSBlbHNlCi0JCXJhdGVfc2NhbGVfaW5kZXhfbXNrID0gcmF0ZV9tYXNrOwotCi0JaWYgKCFyYXRlX3NjYWxlX2luZGV4X21zaykKLQkJcmF0ZV9zY2FsZV9pbmRleF9tc2sgPSByYXRlX21hc2s7Ci0KLQlpZiAoISgoMSA8PCBpbmRleCkgJiByYXRlX3NjYWxlX2luZGV4X21zaykpIHsKLQkJSVdMX0VSUihwcml2LCAiQ3VycmVudCBSYXRlIGlzIG5vdCB2YWxpZFxuIik7Ci0JCWlmIChscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKSB7Ci0JCQkvKiByZXZlcnQgdG8gYWN0aXZlIHRhYmxlIGlmIHNlYXJjaCB0YWJsZSBpcyBub3QgdmFsaWQqLwotCQkJdGJsLT5scV90eXBlID0gTFFfTk9ORTsKLQkJCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAwOwotCQkJdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0JCQkvKiBnZXQgImFjdGl2ZSIgcmF0ZSBpbmZvICovCi0JCQlpbmRleCA9IGl3bDQ5NjVfaHdyYXRlX3RvX3BsY3BfaWR4KHRibC0+Y3VycmVudF9yYXRlKTsKLQkJCXJhdGUgPSBpd2w0OTY1X3JzX3VwZGF0ZV9yYXRlX3RibChwcml2LCBjdHgsIGxxX3N0YSwKLQkJCQkJCSAgdGJsLCBpbmRleCwgaXNfZ3JlZW4pOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBHZXQgZXhwZWN0ZWQgdGhyb3VnaHB1dCB0YWJsZSBhbmQgaGlzdG9yeSB3aW5kb3cgZm9yIGN1cnJlbnQgcmF0ZSAqLwotCWlmICghdGJsLT5leHBlY3RlZF90cHQpIHsKLQkJSVdMX0VSUihwcml2LCAidGJsLT5leHBlY3RlZF90cHQgaXMgTlVMTFxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiBmb3JjZSB1c2VyIG1heCByYXRlIGlmIHNldCBieSB1c2VyICovCi0JaWYgKChscV9zdGEtPm1heF9yYXRlX2lkeCAhPSAtMSkgJiYKLQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgaW5kZXgpKSB7Ci0JCWluZGV4ID0gbHFfc3RhLT5tYXhfcmF0ZV9pZHg7Ci0JCXVwZGF0ZV9scSA9IDE7Ci0JCXdpbmRvdyA9ICYodGJsLT53aW5baW5kZXhdKTsKLQkJZ290byBscV91cGRhdGU7Ci0JfQotCi0Jd2luZG93ID0gJih0YmwtPndpbltpbmRleF0pOwotCi0JLyoKLQkgKiBJZiB0aGVyZSBpcyBub3QgZW5vdWdoIGhpc3RvcnkgdG8gY2FsY3VsYXRlIGFjdHVhbCBhdmVyYWdlCi0JICogdGhyb3VnaHB1dCwga2VlcCBhbmFseXppbmcgcmVzdWx0cyBvZiBtb3JlIHR4IGZyYW1lcywgd2l0aG91dAotCSAqIGNoYW5naW5nIHJhdGUgb3IgbW9kZSAoYnlwYXNzIG1vc3Qgb2YgdGhlIHJlc3Qgb2YgdGhpcyBmdW5jdGlvbikuCi0JICogU2V0IHVwIG5ldyByYXRlIHRhYmxlIGluIHVDb2RlIG9ubHkgaWYgb2xkIHJhdGUgaXMgbm90IHN1cHBvcnRlZAotCSAqIGluIGN1cnJlbnQgYXNzb2NpYXRpb24gKHVzZSBuZXcgcmF0ZSBmb3VuZCBhYm92ZSkuCi0JICovCi0JZmFpbF9jb3VudCA9IHdpbmRvdy0+Y291bnRlciAtIHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyOwotCWlmICgoZmFpbF9jb3VudCA8IElXTF9SQVRFX01JTl9GQUlMVVJFX1RIKSAmJgotCQkJKHdpbmRvdy0+c3VjY2Vzc19jb3VudGVyIDwgSVdMX1JBVEVfTUlOX1NVQ0NFU1NfVEgpKSB7Ci0JCUlXTF9ERUJVR19SQVRFKHByaXYsICJMUTogc3RpbGwgYmVsb3cgVEguIHN1Y2M9JWQgdG90YWw9JWQgIgotCQkJICAgICAgICJmb3IgaW5kZXggJWRcbiIsCi0JCQkgICAgICAgd2luZG93LT5zdWNjZXNzX2NvdW50ZXIsIHdpbmRvdy0+Y291bnRlciwgaW5kZXgpOwotCi0JCS8qIENhbid0IGNhbGN1bGF0ZSB0aGlzIHlldDsgbm90IGVub3VnaCBoaXN0b3J5ICovCi0JCXdpbmRvdy0+YXZlcmFnZV90cHQgPSBJV0xfSU5WQUxJRF9WQUxVRTsKLQotCQkvKiBTaG91bGQgd2Ugc3RheSB3aXRoIHRoaXMgbW9kdWxhdGlvbiBtb2RlLAotCQkgKiBvciBzZWFyY2ggZm9yIGEgbmV3IG9uZT8gKi8KLQkJaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKGxxX3N0YSwgZmFsc2UpOwotCi0JCWdvdG8gb3V0OwotCX0KLQkvKiBFbHNlIHdlIGhhdmUgZW5vdWdoIHNhbXBsZXM7IGNhbGN1bGF0ZSBlc3RpbWF0ZSBvZgotCSAqIGFjdHVhbCBhdmVyYWdlIHRocm91Z2hwdXQgKi8KLQlpZiAod2luZG93LT5hdmVyYWdlX3RwdCAhPSAoKHdpbmRvdy0+c3VjY2Vzc19yYXRpbyAqCi0JCQl0YmwtPmV4cGVjdGVkX3RwdFtpbmRleF0gKyA2NCkgLyAxMjgpKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSAiZXhwZWN0ZWRfdHB0IHNob3VsZCBoYXZlIGJlZW4gY2FsY3VsYXRlZCBieSBub3dcbiIpOwotCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0ID0gKCh3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8gKgotCQkJCQl0YmwtPmV4cGVjdGVkX3RwdFtpbmRleF0gKyA2NCkgLyAxMjgpOwotCX0KLQotCS8qIElmIHdlIGFyZSBzZWFyY2hpbmcgZm9yIGJldHRlciBtb2R1bGF0aW9uIG1vZGUsIGNoZWNrIHN1Y2Nlc3MuICovCi0JaWYgKGxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpIHsKLQkJLyogSWYgZ29vZCBzdWNjZXNzLCBjb250aW51ZSB1c2luZyB0aGUgInNlYXJjaCIgbW9kZTsKLQkJICogbm8gbmVlZCB0byBzZW5kIG5ldyBsaW5rIHF1YWxpdHkgY29tbWFuZCwgc2luY2Ugd2UncmUKLQkJICogY29udGludWluZyB0byB1c2UgdGhlIHNldHVwIHRoYXQgd2UndmUgYmVlbiB0cnlpbmcuICovCi0JCWlmICh3aW5kb3ctPmF2ZXJhZ2VfdHB0ID4gbHFfc3RhLT5sYXN0X3RwdCkgewotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IFNXSVRDSElORyBUTyBORVcgVEFCTEUgIgotCQkJCQkic3VjPSVkIGN1ci10cHQ9JWQgb2xkLXRwdD0lZFxuIiwKLQkJCQkJd2luZG93LT5zdWNjZXNzX3JhdGlvLAotCQkJCQl3aW5kb3ctPmF2ZXJhZ2VfdHB0LAotCQkJCQlscV9zdGEtPmxhc3RfdHB0KTsKLQotCQkJaWYgKCFpc19sZWdhY3kodGJsLT5scV90eXBlKSkKLQkJCQlscV9zdGEtPmVuYWJsZV9jb3VudGVyID0gMTsKLQotCQkJLyogU3dhcCB0YWJsZXM7ICJzZWFyY2giIGJlY29tZXMgImFjdGl2ZSIgKi8KLQkJCWxxX3N0YS0+YWN0aXZlX3RibCA9IGFjdGl2ZV90Ymw7Ci0JCQljdXJyZW50X3RwdCA9IHdpbmRvdy0+YXZlcmFnZV90cHQ7Ci0KLQkJLyogRWxzZSBwb29yIHN1Y2Nlc3M7IGdvIGJhY2sgdG8gbW9kZSBpbiAiYWN0aXZlIiB0YWJsZSAqLwotCQl9IGVsc2UgewotCi0JCQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IEdPSU5HIEJBQ0sgVE8gVEhFIE9MRCBUQUJMRSAiCi0JCQkJCSJzdWM9JWQgY3VyLXRwdD0lZCBvbGQtdHB0PSVkXG4iLAotCQkJCQl3aW5kb3ctPnN1Y2Nlc3NfcmF0aW8sCi0JCQkJCXdpbmRvdy0+YXZlcmFnZV90cHQsCi0JCQkJCWxxX3N0YS0+bGFzdF90cHQpOwotCi0JCQkvKiBOdWxsaWZ5ICJzZWFyY2giIHRhYmxlICovCi0JCQl0YmwtPmxxX3R5cGUgPSBMUV9OT05FOwotCi0JCQkvKiBSZXZlcnQgdG8gImFjdGl2ZSIgdGFibGUgKi8KLQkJCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7Ci0JCQl0YmwgPSAmKGxxX3N0YS0+bHFfaW5mb1thY3RpdmVfdGJsXSk7Ci0KLQkJCS8qIFJldmVydCB0byAiYWN0aXZlIiByYXRlIGFuZCB0aHJvdWdocHV0IGluZm8gKi8KLQkJCWluZGV4ID0gaXdsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgodGJsLT5jdXJyZW50X3JhdGUpOwotCQkJY3VycmVudF90cHQgPSBscV9zdGEtPmxhc3RfdHB0OwotCi0JCQkvKiBOZWVkIHRvIHNldCB1cCBhIG5ldyByYXRlIHRhYmxlIGluIHVDb2RlICovCi0JCQl1cGRhdGVfbHEgPSAxOwotCQl9Ci0KLQkJLyogRWl0aGVyIHdheSwgd2UndmUgbWFkZSBhIGRlY2lzaW9uOyBtb2R1bGF0aW9uIG1vZGUKLQkJICogc2VhcmNoIGlzIGRvbmUsIGFsbG93IHJhdGUgYWRqdXN0bWVudCBuZXh0IHRpbWUuICovCi0JCWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwgPSAwOwotCQlkb25lX3NlYXJjaCA9IDE7CS8qIERvbid0IHN3aXRjaCBtb2RlcyBiZWxvdyEgKi8KLQkJZ290byBscV91cGRhdGU7Ci0JfQotCi0JLyogKEVsc2UpIG5vdCBpbiBzZWFyY2ggb2YgYmV0dGVyIG1vZHVsYXRpb24gbW9kZSwgdHJ5IGZvciBiZXR0ZXIKLQkgKiBzdGFydGluZyByYXRlLCB3aGlsZSBzdGF5aW5nIGluIHRoaXMgbW9kZS4gKi8KLQloaWdoX2xvdyA9IGl3bDQ5NjVfcnNfZ2V0X2FkamFjZW50X3JhdGUocHJpdiwgaW5kZXgsCi0JCQkJCXJhdGVfc2NhbGVfaW5kZXhfbXNrLAotCQkJCQl0YmwtPmxxX3R5cGUpOwotCWxvdyA9IGhpZ2hfbG93ICYgMHhmZjsKLQloaWdoID0gKGhpZ2hfbG93ID4+IDgpICYgMHhmZjsKLQotCS8qIElmIHVzZXIgc2V0IG1heCByYXRlLCBkb250IGFsbG93IGhpZ2hlciB0aGFuIHVzZXIgY29uc3RyYWluICovCi0JaWYgKChscV9zdGEtPm1heF9yYXRlX2lkeCAhPSAtMSkgJiYKLQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4IDwgaGlnaCkpCi0JCWhpZ2ggPSBJV0xfUkFURV9JTlZBTElEOwotCi0Jc3IgPSB3aW5kb3ctPnN1Y2Nlc3NfcmF0aW87Ci0KLQkvKiBDb2xsZWN0IG1lYXN1cmVkIHRocm91Z2hwdXRzIGZvciBjdXJyZW50IGFuZCBhZGphY2VudCByYXRlcyAqLwotCWN1cnJlbnRfdHB0ID0gd2luZG93LT5hdmVyYWdlX3RwdDsKLQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCWxvd190cHQgPSB0YmwtPndpbltsb3ddLmF2ZXJhZ2VfdHB0OwotCWlmIChoaWdoICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCWhpZ2hfdHB0ID0gdGJsLT53aW5baGlnaF0uYXZlcmFnZV90cHQ7Ci0KLQlzY2FsZV9hY3Rpb24gPSAwOwotCi0JLyogVG9vIG1hbnkgZmFpbHVyZXMsIGRlY3JlYXNlIHJhdGUgKi8KLQlpZiAoKHNyIDw9IElXTF9SQVRFX0RFQ1JFQVNFX1RIKSB8fCAoY3VycmVudF90cHQgPT0gMCkpIHsKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCSJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHN1Y2Nlc3NfcmF0aW9cbiIpOwotCQlzY2FsZV9hY3Rpb24gPSAtMTsKLQotCS8qIE5vIHRocm91Z2hwdXQgbWVhc3VyZWQgeWV0IGZvciBhZGphY2VudCByYXRlczsgdHJ5IGluY3JlYXNlLiAqLwotCX0gZWxzZSBpZiAoKGxvd190cHQgPT0gSVdMX0lOVkFMSURfVkFMVUUpICYmCi0JCSAgIChoaWdoX3RwdCA9PSBJV0xfSU5WQUxJRF9WQUxVRSkpIHsKLQotCQlpZiAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEICYmIHNyID49IElXTF9SQVRFX0lOQ1JFQVNFX1RIKQotCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJZWxzZSBpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpCi0JCQlzY2FsZV9hY3Rpb24gPSAwOwotCX0KLQotCS8qIEJvdGggYWRqYWNlbnQgdGhyb3VnaHB1dHMgYXJlIG1lYXN1cmVkLCBidXQgbmVpdGhlciBvbmUgaGFzIGJldHRlcgotCSAqIHRocm91Z2hwdXQ7IHdlJ3JlIHVzaW5nIHRoZSBiZXN0IHJhdGUsIGRvbid0IGNoYW5nZSBpdCEgKi8KLQllbHNlIGlmICgobG93X3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJIChoaWdoX3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgJiYKLQkJIChsb3dfdHB0IDwgY3VycmVudF90cHQpICYmCi0JCSAoaGlnaF90cHQgPCBjdXJyZW50X3RwdCkpCi0JCXNjYWxlX2FjdGlvbiA9IDA7Ci0KLQkvKiBBdCBsZWFzdCBvbmUgYWRqYWNlbnQgcmF0ZSdzIHRocm91Z2hwdXQgaXMgbWVhc3VyZWQsCi0JICogYW5kIG1heSBoYXZlIGJldHRlciBwZXJmb3JtYW5jZS4gKi8KLQllbHNlIHsKLQkJLyogSGlnaGVyIGFkamFjZW50IHJhdGUncyB0aHJvdWdocHV0IGlzIG1lYXN1cmVkICovCi0JCWlmIChoaWdoX3RwdCAhPSBJV0xfSU5WQUxJRF9WQUxVRSkgewotCQkJLyogSGlnaGVyIHJhdGUgaGFzIGJldHRlciB0aHJvdWdocHV0ICovCi0JCQlpZiAoaGlnaF90cHQgPiBjdXJyZW50X3RwdCAmJgotCQkJCQlzciA+PSBJV0xfUkFURV9JTkNSRUFTRV9USCkgewotCQkJCXNjYWxlX2FjdGlvbiA9IDE7Ci0JCQl9IGVsc2UgewotCQkJCXNjYWxlX2FjdGlvbiA9IDA7Ci0JCQl9Ci0KLQkJLyogTG93ZXIgYWRqYWNlbnQgcmF0ZSdzIHRocm91Z2hwdXQgaXMgbWVhc3VyZWQgKi8KLQkJfSBlbHNlIGlmIChsb3dfdHB0ICE9IElXTF9JTlZBTElEX1ZBTFVFKSB7Ci0JCQkvKiBMb3dlciByYXRlIGhhcyBiZXR0ZXIgdGhyb3VnaHB1dCAqLwotCQkJaWYgKGxvd190cHQgPiBjdXJyZW50X3RwdCkgewotCQkJCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkJICAgICJkZWNyZWFzZSByYXRlIGJlY2F1c2Ugb2YgbG93IHRwdFxuIik7Ci0JCQkJc2NhbGVfYWN0aW9uID0gLTE7Ci0JCQl9IGVsc2UgaWYgKHNyID49IElXTF9SQVRFX0lOQ1JFQVNFX1RIKSB7Ci0JCQkJc2NhbGVfYWN0aW9uID0gMTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIFNhbml0eSBjaGVjazsgYXNrZWQgZm9yIGRlY3JlYXNlLCBidXQgc3VjY2VzcyByYXRlIG9yIHRocm91Z2hwdXQKLQkgKiBoYXMgYmVlbiBnb29kIGF0IG9sZCByYXRlLiAgRG9uJ3QgY2hhbmdlIGl0LiAqLwotCWlmICgoc2NhbGVfYWN0aW9uID09IC0xKSAmJiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpICYmCi0JCSAgICAoKHNyID4gSVdMX1JBVEVfSElHSF9USCkgfHwKLQkJICAgICAoY3VycmVudF90cHQgPiAoMTAwICogdGJsLT5leHBlY3RlZF90cHRbbG93XSkpKSkKLQkJc2NhbGVfYWN0aW9uID0gMDsKLQotCXN3aXRjaCAoc2NhbGVfYWN0aW9uKSB7Ci0JY2FzZSAtMToKLQkJLyogRGVjcmVhc2Ugc3RhcnRpbmcgcmF0ZSwgdXBkYXRlIHVDb2RlJ3MgcmF0ZSB0YWJsZSAqLwotCQlpZiAobG93ICE9IElXTF9SQVRFX0lOVkFMSUQpIHsKLQkJCXVwZGF0ZV9scSA9IDE7Ci0JCQlpbmRleCA9IGxvdzsKLQkJfQotCi0JCWJyZWFrOwotCWNhc2UgMToKLQkJLyogSW5jcmVhc2Ugc3RhcnRpbmcgcmF0ZSwgdXBkYXRlIHVDb2RlJ3MgcmF0ZSB0YWJsZSAqLwotCQlpZiAoaGlnaCAhPSBJV0xfUkFURV9JTlZBTElEKSB7Ci0JCQl1cGRhdGVfbHEgPSAxOwotCQkJaW5kZXggPSBoaWdoOwotCQl9Ci0KLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQkvKiBObyBjaGFuZ2UgKi8KLQlkZWZhdWx0OgotCQlicmVhazsKLQl9Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiY2hvb3NlIHJhdGUgc2NhbGUgaW5kZXggJWQgYWN0aW9uICVkIGxvdyAlZCAiCi0JCSAgICAiaGlnaCAlZCB0eXBlICVkXG4iLAotCQkgICAgIGluZGV4LCBzY2FsZV9hY3Rpb24sIGxvdywgaGlnaCwgdGJsLT5scV90eXBlKTsKLQotbHFfdXBkYXRlOgotCS8qIFJlcGxhY2UgdUNvZGUncyByYXRlIHRhYmxlIGZvciB0aGUgZGVzdGluYXRpb24gc3RhdGlvbi4gKi8KLQlpZiAodXBkYXRlX2xxKQotCQlyYXRlID0gaXdsNDk2NV9yc191cGRhdGVfcmF0ZV90YmwocHJpdiwgY3R4LCBscV9zdGEsCi0JCQkJCSAgdGJsLCBpbmRleCwgaXNfZ3JlZW4pOwotCi0JLyogU2hvdWxkIHdlIHN0YXkgd2l0aCB0aGlzIG1vZHVsYXRpb24gbW9kZSwKLQkgKiBvciBzZWFyY2ggZm9yIGEgbmV3IG9uZT8gKi8KLQkgaXdsNDk2NV9yc19zdGF5X2luX3RhYmxlKGxxX3N0YSwgZmFsc2UpOwotCi0JLyoKLQkgKiBTZWFyY2ggZm9yIG5ldyBtb2R1bGF0aW9uIG1vZGUgaWYgd2UncmU6Ci0JICogMSkgIE5vdCBjaGFuZ2luZyByYXRlcyByaWdodCBub3cKLQkgKiAyKSAgTm90IGp1c3QgZmluaXNoaW5nIHVwIGEgc2VhcmNoCi0JICogMykgIEFsbG93aW5nIGEgbmV3IHNlYXJjaAotCSAqLwotCWlmICghdXBkYXRlX2xxICYmICFkb25lX3NlYXJjaCAmJgotCQkhbHFfc3RhLT5zdGF5X2luX3RibCAmJiB3aW5kb3ctPmNvdW50ZXIpIHsKLQkJLyogU2F2ZSBjdXJyZW50IHRocm91Z2hwdXQgdG8gY29tcGFyZSB3aXRoICJzZWFyY2giIHRocm91Z2hwdXQqLwotCQlscV9zdGEtPmxhc3RfdHB0ID0gY3VycmVudF90cHQ7Ci0KLQkJLyogU2VsZWN0IGEgbmV3ICJzZWFyY2giIG1vZHVsYXRpb24gbW9kZSB0byB0cnkuCi0JCSAqIElmIG9uZSBpcyBmb3VuZCwgc2V0IHVwIHRoZSBuZXcgInNlYXJjaCIgdGFibGUuICovCi0JCWlmIChpc19sZWdhY3kodGJsLT5scV90eXBlKSkKLQkJCWl3bDQ5NjVfcnNfbW92ZV9sZWdhY3lfb3RoZXIocHJpdiwgbHFfc3RhLAotCQkJCQkJCWNvbmYsIHN0YSwgaW5kZXgpOwotCQllbHNlIGlmIChpc19zaXNvKHRibC0+bHFfdHlwZSkpCi0JCQlpd2w0OTY1X3JzX21vdmVfc2lzb190b19vdGhlcihwcml2LCBscV9zdGEsCi0JCQkJCQkJY29uZiwgc3RhLCBpbmRleCk7Ci0JCWVsc2UgLyogKGlzX21pbW8yKHRibC0+bHFfdHlwZSkpICovCi0JCQlpd2w0OTY1X3JzX21vdmVfbWltbzJfdG9fb3RoZXIocHJpdiwgbHFfc3RhLAotCQkJCQkJCWNvbmYsIHN0YSwgaW5kZXgpOwotCi0JCS8qIElmIG5ldyAic2VhcmNoIiBtb2RlIHdhcyBzZWxlY3RlZCwgc2V0IHVwIGluIHVDb2RlIHRhYmxlICovCi0JCWlmIChscV9zdGEtPnNlYXJjaF9iZXR0ZXJfdGJsKSB7Ci0JCQkvKiBBY2Nlc3MgdGhlICJzZWFyY2giIHRhYmxlLCBjbGVhciBpdHMgaGlzdG9yeS4gKi8KLQkJCXRibCA9ICYobHFfc3RhLT5scV9pbmZvWygxIC0gbHFfc3RhLT5hY3RpdmVfdGJsKV0pOwotCQkJZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UOyBpKyspCi0JCQkJaXdsNDk2NV9yc19yYXRlX3NjYWxlX2NsZWFyX3dpbmRvdygKLQkJCQkJCQkmKHRibC0+d2luW2ldKSk7Ci0KLQkJCS8qIFVzZSBuZXcgInNlYXJjaCIgc3RhcnQgcmF0ZSAqLwotCQkJaW5kZXggPSBpd2w0OTY1X2h3cmF0ZV90b19wbGNwX2lkeCh0YmwtPmN1cnJlbnRfcmF0ZSk7Ci0KLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsCi0JCQkJIlN3aXRjaCBjdXJyZW50ICBtY3M6ICVYIGluZGV4OiAlZFxuIiwKLQkJCQkgICAgIHRibC0+Y3VycmVudF9yYXRlLCBpbmRleCk7Ci0JCQlpd2w0OTY1X3JzX2ZpbGxfbGlua19jbWQocHJpdiwgbHFfc3RhLAotCQkJCQkJdGJsLT5jdXJyZW50X3JhdGUpOwotCQkJaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsCi0JCQkJCQkmbHFfc3RhLT5scSwgQ01EX0FTWU5DLCBmYWxzZSk7Ci0JCX0gZWxzZQotCQkJZG9uZV9zZWFyY2ggPSAxOwotCX0KLQotCWlmIChkb25lX3NlYXJjaCAmJiAhbHFfc3RhLT5zdGF5X2luX3RibCkgewotCQkvKiBJZiB0aGUgImFjdGl2ZSIgKG5vbi1zZWFyY2gpIG1vZGUgd2FzIGxlZ2FjeSwKLQkJICogYW5kIHdlJ3ZlIHRyaWVkIHN3aXRjaGluZyBhbnRlbm5hcywKLQkJICogYnV0IHdlIGhhdmVuJ3QgYmVlbiBhYmxlIHRvIHRyeSBIVCBtb2RlcyAobm90IGF2YWlsYWJsZSksCi0JCSAqIHN0YXkgd2l0aCBiZXN0IGFudGVubmEgbGVnYWN5IG1vZHVsYXRpb24gZm9yIGEgd2hpbGUKLQkJICogYmVmb3JlIG5leHQgcm91bmQgb2YgbW9kZSBjb21wYXJpc29ucy4gKi8KLQkJdGJsMSA9ICYobHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF0pOwotCQlpZiAoaXNfbGVnYWN5KHRibDEtPmxxX3R5cGUpICYmICFjb25mX2lzX2h0KGNvbmYpICYmCi0JCSAgICBscV9zdGEtPmFjdGlvbl9jb3VudGVyID4gdGJsMS0+bWF4X3NlYXJjaCkgewotCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgIkxROiBTVEFZIGluIGxlZ2FjeSB0YWJsZVxuIik7Ci0JCQlpd2w0OTY1X3JzX3NldF9zdGF5X2luX3RhYmxlKHByaXYsIDEsIGxxX3N0YSk7Ci0JCX0KLQotCQkvKiBJZiB3ZSdyZSBpbiBhbiBIVCBtb2RlLCBhbmQgYWxsIDMgbW9kZSBzd2l0Y2ggYWN0aW9ucwotCQkgKiBoYXZlIGJlZW4gdHJpZWQgYW5kIGNvbXBhcmVkLCBzdGF5IGluIHRoaXMgYmVzdCBtb2R1bGF0aW9uCi0JCSAqIG1vZGUgZm9yIGEgd2hpbGUgYmVmb3JlIG5leHQgcm91bmQgb2YgbW9kZSBjb21wYXJpc29ucy4gKi8KLQkJaWYgKGxxX3N0YS0+ZW5hYmxlX2NvdW50ZXIgJiYKLQkJICAgIChscV9zdGEtPmFjdGlvbl9jb3VudGVyID49IHRibDEtPm1heF9zZWFyY2gpKSB7Ci0JCQlpZiAoKGxxX3N0YS0+bGFzdF90cHQgPiBJV0xfQUdHX1RQVF9USFJFSE9MRCkgJiYKLQkJCSAgICAobHFfc3RhLT50eF9hZ2dfdGlkX2VuICYgKDEgPDwgdGlkKSkgJiYKLQkJCSAgICAodGlkICE9IE1BWF9USURfQ09VTlQpKSB7Ci0JCQkJdGlkX2RhdGEgPQotCQkJCSAgICZwcml2LT5zdGF0aW9uc1tscV9zdGEtPmxxLnN0YV9pZF0udGlkW3RpZF07Ci0JCQkJaWYgKHRpZF9kYXRhLT5hZ2cuc3RhdGUgPT0gSVdMX0FHR19PRkYpIHsKLQkJCQkJSVdMX0RFQlVHX1JBVEUocHJpdiwKLQkJCQkJCSAgICAgICAidHJ5IHRvIGFnZ3JlZ2F0ZSB0aWQgJWRcbiIsCi0JCQkJCQkgICAgICAgdGlkKTsKLQkJCQkJaXdsNDk2NV9yc190bF90dXJuX29uX2FnZyhwcml2LCB0aWQsCi0JCQkJCQkJICBscV9zdGEsIHN0YSk7Ci0JCQkJfQotCQkJfQotCQkJaXdsNDk2NV9yc19zZXRfc3RheV9pbl90YWJsZShwcml2LCAwLCBscV9zdGEpOwotCQl9Ci0JfQotCi1vdXQ6Ci0JdGJsLT5jdXJyZW50X3JhdGUgPSBpd2w0OTY1X3JhdGVfbl9mbGFnc19mcm9tX3RibChwcml2LCB0YmwsCi0JCQkJCQkJaW5kZXgsIGlzX2dyZWVuKTsKLQlpID0gaW5kZXg7Ci0JbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHggPSBpOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnNfaW5pdGlhbGl6ZV9scSAtIEluaXRpYWxpemUgYSBzdGF0aW9uJ3MgaGFyZHdhcmUgcmF0ZSB0YWJsZQotICoKLSAqIFRoZSB1Q29kZSdzIHN0YXRpb24gdGFibGUgY29udGFpbnMgYSB0YWJsZSBvZiBmYWxsYmFjayByYXRlcwotICogZm9yIGF1dG9tYXRpYyBmYWxsYmFjayBkdXJpbmcgdHJhbnNtaXNzaW9uLgotICoKLSAqIE5PVEU6IFRoaXMgc2V0cyB1cCBhIGRlZmF1bHQgc2V0IG9mIHZhbHVlcy4gIFRoZXNlIHdpbGwgYmUgcmVwbGFjZWQgbGF0ZXIKLSAqICAgICAgIGlmIHRoZSBkcml2ZXIncyBpd2wtNDk2NS1ycyByYXRlIHNjYWxpbmcgYWxnb3JpdGhtIGlzIHVzZWQsIGluc3RlYWQgb2YKLSAqICAgICAgIHJjODAyMTFfc2ltcGxlLgotICoKLSAqIE5PVEU6IFJ1biBSRVBMWV9BRERfU1RBIGNvbW1hbmQgdG8gc2V0IHVwIHN0YXRpb24gdGFibGUgZW50cnksIGJlZm9yZQotICogICAgICAgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICh3aGljaCBydW5zIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQsCi0gKiAgICAgICB3aGljaCByZXF1aXJlcyBzdGF0aW9uIHRhYmxlIGVudHJ5IHRvIGV4aXN0KS4KLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19pbml0aWFsaXplX2xxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhKQotewotCXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gKnRibDsKLQlpbnQgcmF0ZV9pZHg7Ci0JaW50IGk7Ci0JdTMyIHJhdGU7Ci0JdTggdXNlX2dyZWVuID0gaXdsNDk2NV9yc191c2VfZ3JlZW4oc3RhKTsKLQl1OCBhY3RpdmVfdGJsID0gMDsKLQl1OCB2YWxpZF90eF9hbnQ7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlpZiAoIXN0YSB8fCAhbHFfc3RhKQotCQlyZXR1cm47Ci0KLQlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQljdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKLQotCWkgPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKLQotCXZhbGlkX3R4X2FudCA9IHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQ7Ci0KLQlpZiAoIWxxX3N0YS0+c2VhcmNoX2JldHRlcl90YmwpCi0JCWFjdGl2ZV90YmwgPSBscV9zdGEtPmFjdGl2ZV90Ymw7Ci0JZWxzZQotCQlhY3RpdmVfdGJsID0gMSAtIGxxX3N0YS0+YWN0aXZlX3RibDsKLQotCXRibCA9ICYobHFfc3RhLT5scV9pbmZvW2FjdGl2ZV90YmxdKTsKLQotCWlmICgoaSA8IDApIHx8IChpID49IElXTF9SQVRFX0NPVU5UKSkKLQkJaSA9IDA7Ci0KLQlyYXRlID0gaXdsZWdhY3lfcmF0ZXNbaV0ucGxjcDsKLQl0YmwtPmFudF90eXBlID0gaXdsNDk2NV9maXJzdF9hbnRlbm5hKHZhbGlkX3R4X2FudCk7Ci0JcmF0ZSB8PSB0YmwtPmFudF90eXBlIDw8IFJBVEVfTUNTX0FOVF9QT1M7Ci0KLQlpZiAoaSA+PSBJV0xfRklSU1RfQ0NLX1JBVEUgJiYgaSA8PSBJV0xfTEFTVF9DQ0tfUkFURSkKLQkJcmF0ZSB8PSBSQVRFX01DU19DQ0tfTVNLOwotCi0JaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3MocmF0ZSwgcHJpdi0+YmFuZCwgdGJsLCAmcmF0ZV9pZHgpOwotCWlmICghaXdsNDk2NV9yc19pc192YWxpZF9hbnQodmFsaWRfdHhfYW50LCB0YmwtPmFudF90eXBlKSkKLQkJaXdsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsICZyYXRlLCB0YmwpOwotCi0JcmF0ZSA9IGl3bDQ5NjVfcmF0ZV9uX2ZsYWdzX2Zyb21fdGJsKHByaXYsIHRibCwgcmF0ZV9pZHgsIHVzZV9ncmVlbik7Ci0JdGJsLT5jdXJyZW50X3JhdGUgPSByYXRlOwotCWl3bDQ5NjVfcnNfc2V0X2V4cGVjdGVkX3RwdF90YWJsZShscV9zdGEsIHRibCk7Ci0JaXdsNDk2NV9yc19maWxsX2xpbmtfY21kKE5VTEwsIGxxX3N0YSwgcmF0ZSk7Ci0JcHJpdi0+c3RhdGlvbnNbbHFfc3RhLT5scS5zdGFfaWRdLmxxID0gJmxxX3N0YS0+bHE7Ci0JaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscV9zdGEtPmxxLCBDTURfU1lOQywgdHJ1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkCi1pd2w0OTY1X3JzX2dldF9yYXRlKHZvaWQgKnByaXZfciwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdm9pZCAqcHJpdl9zdGEsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGVfY29udHJvbCAqdHhyYykKLXsKLQotCXN0cnVjdCBza19idWZmICpza2IgPSB0eHJjLT5za2I7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQgPSB0eHJjLT5zYmFuZDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgX19tYXliZV91bnVzZWQgPSAoc3RydWN0IGl3bF9wcml2ICopcHJpdl9yOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gcHJpdl9zdGE7Ci0JaW50IHJhdGVfaWR4OwotCi0JSVdMX0RFQlVHX1JBVEVfTElNSVQocHJpdiwgInJhdGUgc2NhbGUgY2FsY3VsYXRlIG5ldyByYXRlIGZvciBza2JcbiIpOwotCi0JLyogR2V0IG1heCByYXRlIGlmIHVzZXIgc2V0IG1heCByYXRlICovCi0JaWYgKGxxX3N0YSkgewotCQlscV9zdGEtPm1heF9yYXRlX2lkeCA9IHR4cmMtPm1heF9yYXRlX2lkeDsKLQkJaWYgKChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSAmJgotCQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4ICE9IC0xKSkKLQkJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ICs9IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JCWlmICgobHFfc3RhLT5tYXhfcmF0ZV9pZHggPCAwKSB8fAotCQkgICAgKGxxX3N0YS0+bWF4X3JhdGVfaWR4ID49IElXTF9SQVRFX0NPVU5UKSkKLQkJCWxxX3N0YS0+bWF4X3JhdGVfaWR4ID0gLTE7Ci0JfQotCi0JLyogVHJlYXQgdW5pbml0aWFsaXplZCByYXRlIHNjYWxpbmcgZGF0YSBzYW1lIGFzIG5vbi1leGlzdGluZy4gKi8KLQlpZiAobHFfc3RhICYmICFscV9zdGEtPmRydikgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAiUmF0ZSBzY2FsaW5nIG5vdCBpbml0aWFsaXplZCB5ZXQuXG4iKTsKLQkJcHJpdl9zdGEgPSBOVUxMOwotCX0KLQotCS8qIFNlbmQgbWFuYWdlbWVudCBmcmFtZXMgYW5kIE5PX0FDSyBkYXRhIHVzaW5nIGxvd2VzdCByYXRlLiAqLwotCWlmIChyYXRlX2NvbnRyb2xfc2VuZF9sb3coc3RhLCBwcml2X3N0YSwgdHhyYykpCi0JCXJldHVybjsKLQotCWlmICghbHFfc3RhKQotCQlyZXR1cm47Ci0KLQlyYXRlX2lkeCAgPSBscV9zdGEtPmxhc3RfdHhyYXRlX2lkeDsKLQotCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfSFRfTVNLKSB7Ci0JCXJhdGVfaWR4IC09IElXTF9GSVJTVF9PRkRNX1JBVEU7Ci0JCS8qIDZNIGFuZCA5TSBzaGFyZWQgc2FtZSBNQ1MgaW5kZXggKi8KLQkJcmF0ZV9pZHggPSAocmF0ZV9pZHggPiAwKSA/IChyYXRlX2lkeCAtIDEpIDogMDsKLQkJaWYgKGl3bDQ5NjVfcnNfZXh0cmFjdF9yYXRlKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MpID49Ci0JCQkgSVdMX1JBVEVfTUlNTzJfNk1fUExDUCkKLQkJCXJhdGVfaWR4ID0gcmF0ZV9pZHggKyBNQ1NfSU5ERVhfUEVSX1NUUkVBTTsKLQkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyA9IElFRUU4MDIxMV9UWF9SQ19NQ1M7Ci0JCWlmIChscV9zdGEtPmxhc3RfcmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfU0dJX01TSykKLQkJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgfD0KLQkJCQkJSUVFRTgwMjExX1RYX1JDX1NIT1JUX0dJOwotCQlpZiAobHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0RVUF9NU0spCi0JCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9Ci0JCQkJCUlFRUU4MDIxMV9UWF9SQ19EVVBfREFUQTsKLQkJaWYgKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykKLQkJCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uZmxhZ3MgfD0KLQkJCQkJSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKLQkJaWYgKGxxX3N0YS0+bGFzdF9yYXRlX25fZmxhZ3MgJiBSQVRFX01DU19HRl9NU0spCi0JCQlpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzIHw9Ci0JCQkJCUlFRUU4MDIxMV9UWF9SQ19HUkVFTl9GSUVMRDsKLQl9IGVsc2UgewotCQkvKiBDaGVjayBmb3IgaW52YWxpZCByYXRlcyAqLwotCQlpZiAoKHJhdGVfaWR4IDwgMCkgfHwgKHJhdGVfaWR4ID49IElXTF9SQVRFX0NPVU5UX0xFR0FDWSkgfHwKLQkJCQkoKHNiYW5kLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopICYmCi0JCQkJIChyYXRlX2lkeCA8IElXTF9GSVJTVF9PRkRNX1JBVEUpKSkKLQkJCXJhdGVfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgoc2JhbmQsIHN0YSk7Ci0JCS8qIE9uIHZhbGlkIDUgR0h6IHJhdGUsIGFkanVzdCBpbmRleCAqLwotCQllbHNlIGlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQkJcmF0ZV9pZHggLT0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQkJaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyA9IDA7Ci0JfQotCWluZm8tPmNvbnRyb2wucmF0ZXNbMF0uaWR4ID0gcmF0ZV9pZHg7Ci0KLX0KLQotc3RhdGljIHZvaWQgKml3bDQ5NjVfcnNfYWxsb2Nfc3RhKHZvaWQgKnByaXZfcmF0ZSwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSAgZ2ZwX3QgZ2ZwKQotewotCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGE7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0KLQkJCQkoc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKikgc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0KLQlwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKXByaXZfcmF0ZTsKLQlJV0xfREVCVUdfUkFURShwcml2LCAiY3JlYXRlIHN0YXRpb24gcmF0ZSBzY2FsZSB3aW5kb3dcbiIpOwotCi0JbHFfc3RhID0gJnN0YV9wcml2LT5scV9zdGE7Ci0KLQlyZXR1cm4gbHFfc3RhOwotfQotCi0vKgotICogQ2FsbGVkIGFmdGVyIGFkZGluZyBhIG5ldyBzdGF0aW9uIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nCi0gKi8KLXZvaWQKLWl3bDQ5NjVfcnNfcmF0ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQl1OCBzdGFfaWQpCi17Ci0JaW50IGksIGo7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwcml2LT5odzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmcHJpdi0+aHctPmNvbmY7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXAgPSAmc3RhLT5odF9jYXA7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OwotCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7Ci0KLQlzdGFfcHJpdiA9IChzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqKSBzdGEtPmRydl9wcml2OwotCWxxX3N0YSA9ICZzdGFfcHJpdi0+bHFfc3RhOwotCXNiYW5kID0gaHctPndpcGh5LT5iYW5kc1tjb25mLT5jaGFubmVsLT5iYW5kXTsKLQotCi0JbHFfc3RhLT5scS5zdGFfaWQgPSBzdGFfaWQ7Ci0KLQlmb3IgKGogPSAwOyBqIDwgTFFfU0laRTsgaisrKQotCQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlQ7IGkrKykKLQkJCWl3bDQ5NjVfcnNfcmF0ZV9zY2FsZV9jbGVhcl93aW5kb3coCi0JCQkJCSZscV9zdGEtPmxxX2luZm9bal0ud2luW2ldKTsKLQotCWxxX3N0YS0+Zmx1c2hfdGltZXIgPSAwOwotCWxxX3N0YS0+c3VwcF9yYXRlcyA9IHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF07Ci0JZm9yIChqID0gMDsgaiA8IExRX1NJWkU7IGorKykKLQkJZm9yIChpID0gMDsgaSA8IElXTF9SQVRFX0NPVU5UOyBpKyspCi0JCQlpd2w0OTY1X3JzX3JhdGVfc2NhbGVfY2xlYXJfd2luZG93KAotCQkJCQkmbHFfc3RhLT5scV9pbmZvW2pdLndpbltpXSk7Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiTFE6IgotCQkJIioqKiByYXRlIHNjYWxlIHN0YXRpb24gZ2xvYmFsIGluaXQgZm9yIHN0YXRpb24gJWQgKioqXG4iLAotCQkgICAgICAgc3RhX2lkKTsKLQkvKiBUT0RPOiB3aGF0IGlzIGEgZ29vZCBzdGFydGluZyByYXRlIGZvciBTVEE/IEFib3V0IG1pZGRsZT8gTWF5YmUgbm90Ci0JICogdGhlIGxvd2VzdCBvciB0aGUgaGlnaGVzdCByYXRlLi4gQ291bGQgY29uc2lkZXIgdXNpbmcgUlNTSSBmcm9tCi0JICogcHJldmlvdXMgcGFja2V0cz8gTmVlZCB0byBoYXZlIElFRUUgODAyLjFYIGF1dGggc3VjY2VlZCBpbW1lZGlhdGVseQotCSAqIGFmdGVyIGFzc29jLi4gKi8KLQotCWxxX3N0YS0+aXNfZHVwID0gMDsKLQlscV9zdGEtPm1heF9yYXRlX2lkeCA9IC0xOwotCWxxX3N0YS0+bWlzc2VkX3JhdGVfY291bnRlciA9IElXTF9NSVNTRURfUkFURV9NQVg7Ci0JbHFfc3RhLT5pc19ncmVlbiA9IGl3bDQ5NjVfcnNfdXNlX2dyZWVuKHN0YSk7Ci0JbHFfc3RhLT5hY3RpdmVfbGVnYWN5X3JhdGUgPSBwcml2LT5hY3RpdmVfcmF0ZSAmIH4oMHgxMDAwKTsKLQlscV9zdGEtPmJhbmQgPSBwcml2LT5iYW5kOwotCS8qCi0JICogYWN0aXZlX3Npc29fcmF0ZSBtYXNrIGluY2x1ZGVzIDkgTUJpdHMgKGJpdCA1KSwgYW5kIENDSyAoYml0cyAwLTMpLAotCSAqIHN1cHBfcmF0ZXNbXSBkb2VzIG5vdDsgc2hpZnQgdG8gY29udmVydCBmb3JtYXQsIGZvcmNlIDkgTUJpdHMgb2ZmLgotCSAqLwotCWxxX3N0YS0+YWN0aXZlX3Npc29fcmF0ZSA9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMF0gPDwgMTsKLQlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgfD0gaHRfY2FwLT5tY3MucnhfbWFza1swXSAmIDB4MTsKLQlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgJj0gfigodTE2KTB4Mik7Ci0JbHFfc3RhLT5hY3RpdmVfc2lzb19yYXRlIDw8PSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCi0JLyogU2FtZSBoZXJlICovCi0JbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSA9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gPDwgMTsKLQlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlIHw9IGh0X2NhcC0+bWNzLnJ4X21hc2tbMV0gJiAweDE7Ci0JbHFfc3RhLT5hY3RpdmVfbWltbzJfcmF0ZSAmPSB+KCh1MTYpMHgyKTsKLQlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlIDw8PSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCi0JLyogVGhlc2UgdmFsdWVzIHdpbGwgYmUgb3ZlcnJpZGRlbiBsYXRlciAqLwotCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrID0KLQkJaXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9Ci0JCXByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJgotCQl+aXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCWlmICghbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrKSB7Ci0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9IEFOVF9BQjsKLQl9IGVsc2UgaWYgKGl3bDQ5NjVfbnVtX29mX2FudChwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50KSA9PSAyKSB7Ci0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayA9Ci0JCQlwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OwotCX0KLQotCS8qIGFzIGRlZmF1bHQgYWxsb3cgYWdncmVnYXRpb24gZm9yIGFsbCB0aWRzICovCi0JbHFfc3RhLT50eF9hZ2dfdGlkX2VuID0gSVdMX0FHR19BTExfVElEOwotCWxxX3N0YS0+ZHJ2ID0gcHJpdjsKLQotCS8qIFNldCBsYXN0X3R4cmF0ZV9pZHggdG8gbG93ZXN0IHJhdGUgKi8KLQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCA9IHJhdGVfbG93ZXN0X2luZGV4KHNiYW5kLCBzdGEpOwotCWlmIChzYmFuZC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlscV9zdGEtPmxhc3RfdHhyYXRlX2lkeCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCWxxX3N0YS0+aXNfYWdnID0gMDsKLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0JbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IDA7Ci0jZW5kaWYKLQotCWl3bDQ5NjVfcnNfaW5pdGlhbGl6ZV9scShwcml2LCBjb25mLCBzdGEsIGxxX3N0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfZmlsbF9saW5rX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEsIHUzMiBuZXdfcmF0ZSkKLXsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvIHRibF90eXBlOwotCWludCBpbmRleCA9IDA7Ci0JaW50IHJhdGVfaWR4OwotCWludCByZXBlYXRfcmF0ZSA9IDA7Ci0JdTggYW50X3RvZ2dsZV9jbnQgPSAwOwotCXU4IHVzZV9odF9wb3NzaWJsZSA9IDE7Ci0JdTggdmFsaWRfdHhfYW50ID0gMDsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxxX2NtZCA9ICZscV9zdGEtPmxxOwotCi0JLyogT3ZlcnJpZGUgc3RhcnRpbmcgcmF0ZSAoaW5kZXggMCkgaWYgbmVlZGVkIGZvciBkZWJ1ZyBwdXJwb3NlcyAqLwotCWl3bDQ5NjVfcnNfZGJnZnNfc2V0X21jcyhscV9zdGEsICZuZXdfcmF0ZSwgaW5kZXgpOwotCi0JLyogSW50ZXJwcmV0IG5ld19yYXRlIChyYXRlX25fZmxhZ3MpICovCi0JaXdsNDk2NV9yc19nZXRfdGJsX2luZm9fZnJvbV9tY3MobmV3X3JhdGUsIGxxX3N0YS0+YmFuZCwKLQkJCQkgICZ0YmxfdHlwZSwgJnJhdGVfaWR4KTsKLQotCS8qIEhvdyBtYW55IHRpbWVzIHNob3VsZCB3ZSByZXBlYXQgdGhlIGluaXRpYWwgcmF0ZT8gKi8KLQlpZiAoaXNfbGVnYWN5KHRibF90eXBlLmxxX3R5cGUpKSB7Ci0JCWFudF90b2dnbGVfY250ID0gMTsKLQkJcmVwZWF0X3JhdGUgPSBJV0xfTlVNQkVSX1RSWTsKLQl9IGVsc2UgewotCQlyZXBlYXRfcmF0ZSA9IElXTF9IVF9OVU1CRVJfVFJZOwotCX0KLQotCWxxX2NtZC0+Z2VuZXJhbF9wYXJhbXMubWltb19kZWxpbWl0ZXIgPQotCQkJaXNfbWltbyh0YmxfdHlwZS5scV90eXBlKSA/IDEgOiAwOwotCi0JLyogRmlsbCAxc3QgdGFibGUgZW50cnkgKGluZGV4IDApICovCi0JbHFfY21kLT5yc190YWJsZVtpbmRleF0ucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMzIobmV3X3JhdGUpOwotCi0JaWYgKGl3bDQ5NjVfbnVtX29mX2FudCh0YmxfdHlwZS5hbnRfdHlwZSkgPT0gMSkgewotCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zayA9Ci0JCQkJCQl0YmxfdHlwZS5hbnRfdHlwZTsKLQl9IGVsc2UgaWYgKGl3bDQ5NjVfbnVtX29mX2FudCh0YmxfdHlwZS5hbnRfdHlwZSkgPT0gMikgewotCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQotCQkJCQkJdGJsX3R5cGUuYW50X3R5cGU7Ci0JfSAvKiBvdGhlcndpc2Ugd2UgZG9uJ3QgbW9kaWZ5IHRoZSBleGlzdGluZyB2YWx1ZSAqLwotCi0JaW5kZXgrKzsKLQlyZXBlYXRfcmF0ZS0tOwotCWlmIChwcml2KQotCQl2YWxpZF90eF9hbnQgPSBwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50OwotCi0JLyogRmlsbCByZXN0IG9mIHJhdGUgdGFibGUgKi8KLQl3aGlsZSAoaW5kZXggPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTSkgewotCQkvKiBSZXBlYXQgaW5pdGlhbC9uZXh0IHJhdGUuCi0JCSAqIEZvciBsZWdhY3kgSVdMX05VTUJFUl9UUlkgPT0gMSwgdGhpcyBsb29wIHdpbGwgbm90IGV4ZWN1dGUuCi0JCSAqIEZvciBIVCBJV0xfSFRfTlVNQkVSX1RSWSA9PSAzLCB0aGlzIGV4ZWN1dGVzIHR3aWNlLiAqLwotCQl3aGlsZSAocmVwZWF0X3JhdGUgPiAwICYmIChpbmRleCA8IExJTktfUVVBTF9NQVhfUkVUUllfTlVNKSkgewotCQkJaWYgKGlzX2xlZ2FjeSh0YmxfdHlwZS5scV90eXBlKSkgewotCQkJCWlmIChhbnRfdG9nZ2xlX2NudCA8IE5VTV9UUllfQkVGT1JFX0FOVF9UT0dHTEUpCi0JCQkJCWFudF90b2dnbGVfY250Kys7Ci0JCQkJZWxzZSBpZiAocHJpdiAmJgotCQkJCQkgaXdsNDk2NV9yc190b2dnbGVfYW50ZW5uYSh2YWxpZF90eF9hbnQsCi0JCQkJCQkJJm5ld19yYXRlLCAmdGJsX3R5cGUpKQotCQkJCQlhbnRfdG9nZ2xlX2NudCA9IDE7Ci0JCQl9Ci0KLQkJCS8qIE92ZXJyaWRlIG5leHQgcmF0ZSBpZiBuZWVkZWQgZm9yIGRlYnVnIHB1cnBvc2VzICovCi0JCQlpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3MobHFfc3RhLCAmbmV3X3JhdGUsIGluZGV4KTsKLQotCQkJLyogRmlsbCBuZXh0IHRhYmxlIGVudHJ5ICovCi0JCQlscV9jbWQtPnJzX3RhYmxlW2luZGV4XS5yYXRlX25fZmxhZ3MgPQotCQkJCQljcHVfdG9fbGUzMihuZXdfcmF0ZSk7Ci0JCQlyZXBlYXRfcmF0ZS0tOwotCQkJaW5kZXgrKzsKLQkJfQotCi0JCWl3bDQ5NjVfcnNfZ2V0X3RibF9pbmZvX2Zyb21fbWNzKG5ld19yYXRlLAotCQkJCQkJbHFfc3RhLT5iYW5kLCAmdGJsX3R5cGUsCi0JCQkJCQkmcmF0ZV9pZHgpOwotCi0JCS8qIEluZGljYXRlIHRvIHVDb2RlIHdoaWNoIGVudHJpZXMgbWlnaHQgYmUgTUlNTy4KLQkJICogSWYgaW5pdGlhbCByYXRlIHdhcyBNSU1PLCB0aGlzIHdpbGwgZmluYWxseSBlbmQgdXAKLQkJICogYXMgKElXTF9IVF9OVU1CRVJfVFJZICogMiksIGFmdGVyIDJuZCBwYXNzLCBvdGhlcndpc2UgMC4gKi8KLQkJaWYgKGlzX21pbW8odGJsX3R5cGUubHFfdHlwZSkpCi0JCQlscV9jbWQtPmdlbmVyYWxfcGFyYW1zLm1pbW9fZGVsaW1pdGVyID0gaW5kZXg7Ci0KLQkJLyogR2V0IG5leHQgcmF0ZSAqLwotCQluZXdfcmF0ZSA9IGl3bDQ5NjVfcnNfZ2V0X2xvd2VyX3JhdGUobHFfc3RhLAotCQkJCQkmdGJsX3R5cGUsIHJhdGVfaWR4LAotCQkJCQkgICAgIHVzZV9odF9wb3NzaWJsZSk7Ci0KLQkJLyogSG93IG1hbnkgdGltZXMgc2hvdWxkIHdlIHJlcGVhdCB0aGUgbmV4dCByYXRlPyAqLwotCQlpZiAoaXNfbGVnYWN5KHRibF90eXBlLmxxX3R5cGUpKSB7Ci0JCQlpZiAoYW50X3RvZ2dsZV9jbnQgPCBOVU1fVFJZX0JFRk9SRV9BTlRfVE9HR0xFKQotCQkJCWFudF90b2dnbGVfY250Kys7Ci0JCQllbHNlIGlmIChwcml2ICYmCi0JCQkJIGl3bDQ5NjVfcnNfdG9nZ2xlX2FudGVubmEodmFsaWRfdHhfYW50LAotCQkJCQkJICAgJm5ld19yYXRlLCAmdGJsX3R5cGUpKQotCQkJCWFudF90b2dnbGVfY250ID0gMTsKLQotCQkJcmVwZWF0X3JhdGUgPSBJV0xfTlVNQkVSX1RSWTsKLQkJfSBlbHNlIHsKLQkJCXJlcGVhdF9yYXRlID0gSVdMX0hUX05VTUJFUl9UUlk7Ci0JCX0KLQotCQkvKiBEb24ndCBhbGxvdyBIVCByYXRlcyBhZnRlciBuZXh0IHBhc3MuCi0JCSAqIGl3bDQ5NjVfcnNfZ2V0X2xvd2VyX3JhdGUoKSB3aWxsIGNoYW5nZSB0eXBlIHRvIExRX0Egb3IgTFFfRy4gKi8KLQkJdXNlX2h0X3Bvc3NpYmxlID0gMDsKLQotCQkvKiBPdmVycmlkZSBuZXh0IHJhdGUgaWYgbmVlZGVkIGZvciBkZWJ1ZyBwdXJwb3NlcyAqLwotCQlpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3MobHFfc3RhLCAmbmV3X3JhdGUsIGluZGV4KTsKLQotCQkvKiBGaWxsIG5leHQgdGFibGUgZW50cnkgKi8KLQkJbHFfY21kLT5yc190YWJsZVtpbmRleF0ucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMzIobmV3X3JhdGUpOwotCi0JCWluZGV4Kys7Ci0JCXJlcGVhdF9yYXRlLS07Ci0JfQotCi0JbHFfY21kLT5hZ2dfcGFyYW1zLmFnZ19mcmFtZV9jbnRfbGltaXQgPSBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRjsKLQlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCA9IExJTktfUVVBTF9BR0dfRElTQUJMRV9TVEFSVF9ERUY7Ci0KLQlscV9jbWQtPmFnZ19wYXJhbXMuYWdnX3RpbWVfbGltaXQgPQotCQljcHVfdG9fbGUxNihMSU5LX1FVQUxfQUdHX1RJTUVfTElNSVRfREVGKTsKLX0KLQotc3RhdGljIHZvaWQKLSppd2w0OTY1X3JzX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzZGlyKQotewotCXJldHVybiBody0+cHJpdjsKLX0KLS8qIHJhdGUgc2NhbGUgcmVxdWlyZXMgZnJlZSBmdW5jdGlvbiB0byBiZSBpbXBsZW1lbnRlZCAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yc19mcmVlKHZvaWQgKnByaXZfcmF0ZSkKLXsKLQlyZXR1cm47Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfZnJlZV9zdGEodm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJdm9pZCAqcHJpdl9zdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2IF9fbWF5YmVfdW51c2VkID0gcHJpdl9yOwotCi0JSVdMX0RFQlVHX1JBVEUocHJpdiwgImVudGVyXG4iKTsKLQlJV0xfREVCVUdfUkFURShwcml2LCAibGVhdmVcbiIpOwotfQotCi0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUwotc3RhdGljIGludCBpd2w0OTY1X29wZW5fZmlsZV9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCWZpbGUtPnByaXZhdGVfZGF0YSA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX2RiZ2ZzX3NldF9tY3Moc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSwKLQkJCSAgICAgdTMyICpyYXRlX25fZmxhZ3MsIGludCBpbmRleCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0JdTggdmFsaWRfdHhfYW50OwotCXU4IGFudF9zZWxfdHg7Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0JdmFsaWRfdHhfYW50ID0gcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQlpZiAobHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSkgewotCQlhbnRfc2VsX3R4ID0KLQkJICAoKGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgJiBSQVRFX01DU19BTlRfQUJDX01TSykKLQkJICA+PiBSQVRFX01DU19BTlRfUE9TKTsKLQkJaWYgKCh2YWxpZF90eF9hbnQgJiBhbnRfc2VsX3R4KSA9PSBhbnRfc2VsX3R4KSB7Ci0JCQkqcmF0ZV9uX2ZsYWdzID0gbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZTsKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJGaXhlZCByYXRlIE9OXG4iKTsKLQkJfSBlbHNlIHsKLQkJCWxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUgPSAwOwotCQkJSVdMX0VSUihwcml2LAotCQkJICAgICJJbnZhbGlkIGFudGVubmEgc2VsZWN0aW9uIDB4JVgsIFZhbGlkIGlzIDB4JVhcbiIsCi0JCQkgICAgYW50X3NlbF90eCwgdmFsaWRfdHhfYW50KTsKLQkJCUlXTF9ERUJVR19SQVRFKHByaXYsICJGaXhlZCByYXRlIE9GRlxuIik7Ci0JCX0KLQl9IGVsc2UgewotCQlJV0xfREVCVUdfUkFURShwcml2LCAiRml4ZWQgcmF0ZSBPRkZcbiIpOwotCX0KLX0KLQotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfbHFfc3RhICpscV9zdGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2OwotCWNoYXIgYnVmWzY0XTsKLQlzaXplX3QgYnVmX3NpemU7Ci0JdTMyIHBhcnNlZF9yYXRlOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9Ci0JCWNvbnRhaW5lcl9vZihscV9zdGEsIHN0cnVjdCBpd2xfc3RhdGlvbl9wcml2LCBscV9zdGEpOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBzdGFfcHJpdi0+Y29tbW9uLmN0eDsKLQotCXByaXYgPSBscV9zdGEtPmRydjsKLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKHNzY2FuZihidWYsICIleCIsICZwYXJzZWRfcmF0ZSkgPT0gMSkKLQkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IHBhcnNlZF9yYXRlOwotCWVsc2UKLQkJbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSA9IDA7Ci0KLQlscV9zdGEtPmFjdGl2ZV9sZWdhY3lfcmF0ZSA9IDB4MEZGRjsJLyogMSAtIDU0IE1CaXRzLCBpbmNsdWRlcyBDQ0sgKi8KLQlscV9zdGEtPmFjdGl2ZV9zaXNvX3JhdGUgICA9IDB4MUZEMDsJLyogNiAtIDYwIE1CaXRzLCBubyA5LCBubyBDQ0sgKi8KLQlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlICA9IDB4MUZEMDsJLyogNiAtIDYwIE1CaXRzLCBubyA5LCBubyBDQ0sgKi8KLQotCUlXTF9ERUJVR19SQVRFKHByaXYsICJzdGFfaWQgJWQgcmF0ZSAweCVYXG4iLAotCQlscV9zdGEtPmxxLnN0YV9pZCwgbHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSk7Ci0KLQlpZiAobHFfc3RhLT5kYmdfZml4ZWRfcmF0ZSkgewotCQlpd2w0OTY1X3JzX2ZpbGxfbGlua19jbWQoTlVMTCwgbHFfc3RhLCBscV9zdGEtPmRiZ19maXhlZF9yYXRlKTsKLQkJaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChscV9zdGEtPmRydiwgY3R4LCAmbHFfc3RhLT5scSwgQ01EX0FTWU5DLAotCQkJCWZhbHNlKTsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQljaGFyIF9fdXNlciAqdXNlcl9idWYsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCWNoYXIgKmJ1ZmY7Ci0JaW50IGRlc2MgPSAwOwotCWludCBpID0gMDsKLQlpbnQgaW5kZXggPSAwOwotCXNzaXplX3QgcmV0OwotCi0Jc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0Jc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyAqdGJsID0gJihscV9zdGEtPmxxX2luZm9bbHFfc3RhLT5hY3RpdmVfdGJsXSk7Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0JYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJzdGFfaWQgJWRcbiIsIGxxX3N0YS0+bHEuc3RhX2lkKTsKLQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAiZmFpbGVkPSVkIHN1Y2Nlc3M9JWQgcmF0ZT0wJVhcbiIsCi0JCQlscV9zdGEtPnRvdGFsX2ZhaWxlZCwgbHFfc3RhLT50b3RhbF9zdWNjZXNzLAotCQkJbHFfc3RhLT5hY3RpdmVfbGVnYWN5X3JhdGUpOwotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJmaXhlZCByYXRlIDB4JVhcbiIsCi0JCQlscV9zdGEtPmRiZ19maXhlZF9yYXRlKTsKLQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAidmFsaWRfdHhfYW50ICVzJXMlc1xuIiwKLQkgICAgKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgJiBBTlRfQSkgPyAiQU5UX0EsIiA6ICIiLAotCSAgICAocHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCAmIEFOVF9CKSA/ICJBTlRfQiwiIDogIiIsCi0JICAgIChwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYgQU5UX0MpID8gIkFOVF9DIiA6ICIiKTsKLQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAibHEgdHlwZSAlc1xuIiwKLQkgICAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpID8gImxlZ2FjeSIgOiAiSFQiKTsKLQlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkgewotCQlkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAiICVzIiwKLQkJICAgKGlzX3Npc28odGJsLT5scV90eXBlKSkgPyAiU0lTTyIgOiAiTUlNTzIiKTsKLQkJICAgZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgIiAlcyIsCi0JCSAgICh0YmwtPmlzX2h0NDApID8gIjQwTUh6IiA6ICIyME1IeiIpOwotCQkgICBkZXNjICs9IHNwcmludGYoYnVmZitkZXNjLCAiICVzICVzICVzXG4iLAotCQkJKHRibC0+aXNfU0dJKSA/ICJTR0kiIDogIiIsCi0JCSAgIChscV9zdGEtPmlzX2dyZWVuKSA/ICJHRiBlbmFibGVkIiA6ICIiLAotCQkgICAobHFfc3RhLT5pc19hZ2cpID8gIkFHRyBvbiIgOiAiIik7Ci0JfQotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICJsYXN0IHR4IHJhdGU9MHglWFxuIiwKLQkJbHFfc3RhLT5sYXN0X3JhdGVfbl9mbGFncyk7Ci0JZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgImdlbmVyYWw6IgotCQkiZmxhZ3M9MHglWCBtaW1vLWQ9JWQgcy1hbnQweCV4IGQtYW50PTB4JXhcbiIsCi0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuZmxhZ3MsCi0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMubWltb19kZWxpbWl0ZXIsCi0JCWxxX3N0YS0+bHEuZ2VuZXJhbF9wYXJhbXMuc2luZ2xlX3N0cmVhbV9hbnRfbXNrLAotCQlscV9zdGEtPmxxLmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2spOwotCi0JZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywgImFnZzoiCi0JCQkidGltZV9saW1pdD0lZCBkaXN0X3N0YXJ0X3RoPSVkIGZyYW1lX2NudF9saW1pdD0lZFxuIiwKLQkJCWxlMTZfdG9fY3B1KGxxX3N0YS0+bHEuYWdnX3BhcmFtcy5hZ2dfdGltZV9saW1pdCksCi0JCQlscV9zdGEtPmxxLmFnZ19wYXJhbXMuYWdnX2Rpc19zdGFydF90aCwKLQkJCWxxX3N0YS0+bHEuYWdnX3BhcmFtcy5hZ2dfZnJhbWVfY250X2xpbWl0KTsKLQotCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkiU3RhcnQgaWR4IFswXT0weCV4IFsxXT0weCV4IFsyXT0weCV4IFszXT0weCV4XG4iLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzBdLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzFdLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzJdLAotCQkJbHFfc3RhLT5scS5nZW5lcmFsX3BhcmFtcy5zdGFydF9yYXRlX2luZGV4WzNdKTsKLQotCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKSB7Ci0JCWluZGV4ID0gaXdsNDk2NV9od3JhdGVfdG9fcGxjcF9pZHgoCi0JCQlsZTMyX3RvX2NwdShscV9zdGEtPmxxLnJzX3RhYmxlW2ldLnJhdGVfbl9mbGFncykpOwotCQlpZiAoaXNfbGVnYWN5KHRibC0+bHFfdHlwZSkpIHsKLQkJCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsICIgcmF0ZVslZF0gMHglWCAlc21icHNcbiIsCi0JCQlpLAotCQkJbGUzMl90b19jcHUobHFfc3RhLT5scS5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MpLAotCQkJaXdsX3JhdGVfbWNzW2luZGV4XS5tYnBzKTsKLQkJfSBlbHNlIHsKLQkJCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkiIHJhdGVbJWRdIDB4JVggJXNtYnBzICglcylcbiIsCi0JCQlpLAotCQkJbGUzMl90b19jcHUobHFfc3RhLT5scS5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MpLAotCQkJaXdsX3JhdGVfbWNzW2luZGV4XS5tYnBzLCBpd2xfcmF0ZV9tY3NbaW5kZXhdLm1jcyk7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZmYsIGRlc2MpOwotCWtmcmVlKGJ1ZmYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHJzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9vcHMgPSB7Ci0JLndyaXRlID0gaXdsNDk2NV9yc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfd3JpdGUsCi0JLnJlYWQgPSBpd2w0OTY1X3JzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9yZWFkLAotCS5vcGVuID0gaXdsNDk2NV9vcGVuX2ZpbGVfZ2VuZXJpYywKLQkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCi19Owotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9yc19zdGFfZGJnZnNfc3RhdHNfdGFibGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCWNoYXIgX191c2VyICp1c2VyX2J1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0JY2hhciAqYnVmZjsKLQlpbnQgZGVzYyA9IDA7Ci0JaW50IGksIGo7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JYnVmZiA9IGttYWxsb2MoMTAyNCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWZmKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWZvciAoaSA9IDA7IGkgPCBMUV9TSVpFOyBpKyspIHsKLQkJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKLQkJCQkiJXMgdHlwZT0lZCBTR0k9JWQgSFQ0MD0lZCBEVVA9JWQgR0Y9JWRcbiIKLQkJCQkicmF0ZT0weCVYXG4iLAotCQkJCWxxX3N0YS0+YWN0aXZlX3RibCA9PSBpID8gIioiIDogIngiLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS5scV90eXBlLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS5pc19TR0ksCi0JCQkJbHFfc3RhLT5scV9pbmZvW2ldLmlzX2h0NDAsCi0JCQkJbHFfc3RhLT5scV9pbmZvW2ldLmlzX2R1cCwKLQkJCQlscV9zdGEtPmlzX2dyZWVuLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS5jdXJyZW50X3JhdGUpOwotCQlmb3IgKGogPSAwOyBqIDwgSVdMX1JBVEVfQ09VTlQ7IGorKykgewotCQkJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKLQkJCQkiY291bnRlcj0lZCBzdWNjZXNzPSVkICUlPSVkXG4iLAotCQkJCWxxX3N0YS0+bHFfaW5mb1tpXS53aW5bal0uY291bnRlciwKLQkJCQlscV9zdGEtPmxxX2luZm9baV0ud2luW2pdLnN1Y2Nlc3NfY291bnRlciwKLQkJCQlscV9zdGEtPmxxX2luZm9baV0ud2luW2pdLnN1Y2Nlc3NfcmF0aW8pOwotCQl9Ci0JfQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmZiwgZGVzYyk7Ci0Ja2ZyZWUoYnVmZik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX29wcyA9IHsKLQkucmVhZCA9IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX3JlYWQsCi0JLm9wZW4gPSBpd2w0OTY1X29wZW5fZmlsZV9nZW5lcmljLAotCS5sbHNlZWsgPSBkZWZhdWx0X2xsc2VlaywKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQljaGFyIGJ1ZmZbMTIwXTsKLQlpbnQgZGVzYyA9IDA7Ci0Jc3NpemVfdCByZXQ7Ci0KLQlzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfc3RhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvICp0YmwgPSAmbHFfc3RhLT5scV9pbmZvW2xxX3N0YS0+YWN0aXZlX3RibF07Ci0KLQlwcml2ID0gbHFfc3RhLT5kcnY7Ci0KLQlpZiAoaXNfSHQodGJsLT5scV90eXBlKSkKLQkJZGVzYyArPSBzcHJpbnRmKGJ1ZmYrZGVzYywKLQkJCQkiQml0IFJhdGU9ICVkIE1iL3NcbiIsCi0JCQkJdGJsLT5leHBlY3RlZF90cHRbbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHhdKTsKLQllbHNlCi0JCWRlc2MgKz0gc3ByaW50ZihidWZmK2Rlc2MsCi0JCQkJIkJpdCBSYXRlPSAlZCBNYi9zXG4iLAotCQkJCWl3bGVnYWN5X3JhdGVzW2xxX3N0YS0+bGFzdF90eHJhdGVfaWR4XS5pZWVlID4+IDEpOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWZmLCBkZXNjKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByc19zdGFfZGJnZnNfcmF0ZV9zY2FsZV9kYXRhX29wcyA9IHsKLQkucmVhZCA9IGl3bDQ5NjVfcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9yZWFkLAotCS5vcGVuID0gaXdsNDk2NV9vcGVuX2ZpbGVfZ2VuZXJpYywKLQkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCi19OwotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JzX2FkZF9kZWJ1Z2ZzKHZvaWQgKnByaXYsIHZvaWQgKnByaXZfc3RhLAotCQkJCQlzdHJ1Y3QgZGVudHJ5ICpkaXIpCi17Ci0Jc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9IHByaXZfc3RhOwotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGUgPQotCQlkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyYXRlX3NjYWxlX3RhYmxlIiwgU19JUlVTUiB8IFNfSVdVU1IsIGRpciwKLQkJCQlscV9zdGEsICZyc19zdGFfZGJnZnNfc2NhbGVfdGFibGVfb3BzKTsKLQlscV9zdGEtPnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9maWxlID0KLQkJZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zdGF0c190YWJsZSIsIFNfSVJVU1IsIGRpciwKLQkJCWxxX3N0YSwgJnJzX3N0YV9kYmdmc19zdGF0c190YWJsZV9vcHMpOwotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9maWxlID0KLQkJZGVidWdmc19jcmVhdGVfZmlsZSgicmF0ZV9zY2FsZV9kYXRhIiwgU19JUlVTUiwgZGlyLAotCQkJbHFfc3RhLCAmcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9vcHMpOwotCWxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3R4X2FnZ190aWRfZW5fZmlsZSA9Ci0JCWRlYnVnZnNfY3JlYXRlX3U4KCJ0eF9hZ2dfdGlkX2VuYWJsZSIsIFNfSVJVU1IgfCBTX0lXVVNSLCBkaXIsCi0JCSZscV9zdGEtPnR4X2FnZ190aWRfZW4pOwotCi19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnNfcmVtb3ZlX2RlYnVnZnModm9pZCAqcHJpdiwgdm9pZCAqcHJpdl9zdGEpCi17Ci0Jc3RydWN0IGl3bF9scV9zdGEgKmxxX3N0YSA9IHByaXZfc3RhOwotCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGUpOwotCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGUpOwotCWRlYnVnZnNfcmVtb3ZlKGxxX3N0YS0+cnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9maWxlKTsKLQlkZWJ1Z2ZzX3JlbW92ZShscV9zdGEtPnJzX3N0YV9kYmdmc190eF9hZ2dfdGlkX2VuX2ZpbGUpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBJbml0aWFsaXphdGlvbiBvZiByYXRlIHNjYWxpbmcgaW5mb3JtYXRpb24gaXMgZG9uZSBieSBkcml2ZXIgYWZ0ZXIKLSAqIHRoZSBzdGF0aW9uIGlzIGFkZGVkLiBTaW5jZSBtYWM4MDIxMSBjYWxscyB0aGlzIGZ1bmN0aW9uIGJlZm9yZSBhCi0gKiBzdGF0aW9uIGlzIGFkZGVkIHdlIGlnbm9yZSBpdC4KLSAqLwotc3RhdGljIHZvaWQKLWl3bDQ5NjVfcnNfcmF0ZV9pbml0X3N0dWIodm9pZCAqcHJpdl9yLCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB2b2lkICpwcml2X3N0YSkKLXsKLX0KLXN0YXRpYyBzdHJ1Y3QgcmF0ZV9jb250cm9sX29wcyByc180OTY1X29wcyA9IHsKLQkubW9kdWxlID0gTlVMTCwKLQkubmFtZSA9IElXTDQ5NjVfUlNfTkFNRSwKLQkudHhfc3RhdHVzID0gaXdsNDk2NV9yc190eF9zdGF0dXMsCi0JLmdldF9yYXRlID0gaXdsNDk2NV9yc19nZXRfcmF0ZSwKLQkucmF0ZV9pbml0ID0gaXdsNDk2NV9yc19yYXRlX2luaXRfc3R1YiwKLQkuYWxsb2MgPSBpd2w0OTY1X3JzX2FsbG9jLAotCS5mcmVlID0gaXdsNDk2NV9yc19mcmVlLAotCS5hbGxvY19zdGEgPSBpd2w0OTY1X3JzX2FsbG9jX3N0YSwKLQkuZnJlZV9zdGEgPSBpd2w0OTY1X3JzX2ZyZWVfc3RhLAotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0JLmFkZF9zdGFfZGVidWdmcyA9IGl3bDQ5NjVfcnNfYWRkX2RlYnVnZnMsCi0JLnJlbW92ZV9zdGFfZGVidWdmcyA9IGl3bDQ5NjVfcnNfcmVtb3ZlX2RlYnVnZnMsCi0jZW5kaWYKLX07Ci0KLWludCBpd2w0OTY1X3JhdGVfY29udHJvbF9yZWdpc3Rlcih2b2lkKQotewotCXJldHVybiBpZWVlODAyMTFfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCZyc180OTY1X29wcyk7Ci19Ci0KLXZvaWQgaXdsNDk2NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3Rlcih2b2lkKQotewotCWllZWU4MDIxMV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigmcnNfNDk2NV9vcHMpOwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXJ4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMTQ0YmIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtcnguYworKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtY2FsaWIuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1ody5oIgotI2luY2x1ZGUgIml3bC00OTY1LmgiCi0KLXZvaWQgaXdsNDk2NV9yeF9taXNzZWRfYmVhY29uX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfbWlzc2VkX2JlYWNvbl9ub3RpZiAqbWlzc2VkX2JlYWNvbjsKLQotCW1pc3NlZF9iZWFjb24gPSAmcGt0LT51Lm1pc3NlZF9iZWFjb247Ci0JaWYgKGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPmNvbnNlY3V0aXZlX21pc3NlZF9iZWFjb25zKSA+Ci0JICAgIHByaXYtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkKSB7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LAotCQkgICAgIm1pc3NlZCBiY24gY25zcSAlZCB0b3RsICVkIHJjZCAlZCBleHBjdGQgJWRcbiIsCi0JCSAgICBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT5jb25zZWN1dGl2ZV9taXNzZWRfYmVhY29ucyksCi0JCSAgICBsZTMyX3RvX2NwdShtaXNzZWRfYmVhY29uLT50b3RhbF9taXNzZWRfYmVjb25zKSwKLQkJICAgIGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPm51bV9yZWN2ZF9iZWFjb25zKSwKLQkJICAgIGxlMzJfdG9fY3B1KG1pc3NlZF9iZWFjb24tPm51bV9leHBlY3RlZF9iZWFjb25zKSk7Ci0JCWlmICghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJCWl3bDQ5NjVfaW5pdF9zZW5zaXRpdml0eShwcml2KTsKLQl9Ci19Ci0KLS8qIENhbGN1bGF0ZSBub2lzZSBsZXZlbCwgYmFzZWQgb24gbWVhc3VyZW1lbnRzIGR1cmluZyBuZXR3b3JrIHNpbGVuY2UganVzdAotICogICBiZWZvcmUgYXJyaXZpbmcgYmVhY29uLiAgVGhpcyBtZWFzdXJlbWVudCBjYW4gYmUgZG9uZSBvbmx5IGlmIHdlIGtub3cKLSAqICAgZXhhY3RseSB3aGVuIHRvIGV4cGVjdCBiZWFjb25zLCB0aGVyZWZvcmUgb25seSB3aGVuIHdlJ3JlIGFzc29jaWF0ZWQuICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3J4X2NhbGNfbm9pc2Uoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBzdGF0aXN0aWNzX3J4X25vbl9waHkgKnJ4X2luZm87Ci0JaW50IG51bV9hY3RpdmVfcnggPSAwOwotCWludCB0b3RhbF9zaWxlbmNlID0gMDsKLQlpbnQgYmNuX3NpbGVuY2VfYSwgYmNuX3NpbGVuY2VfYiwgYmNuX3NpbGVuY2VfYzsKLQlpbnQgbGFzdF9yeF9ub2lzZTsKLQotCXJ4X2luZm8gPSAmKHByaXYtPl80OTY1LnN0YXRpc3RpY3MucnguZ2VuZXJhbCk7Ci0JYmNuX3NpbGVuY2VfYSA9Ci0JCWxlMzJfdG9fY3B1KHJ4X2luZm8tPmJlYWNvbl9zaWxlbmNlX3Jzc2lfYSkgJiBJTl9CQU5EX0ZJTFRFUjsKLQliY25fc2lsZW5jZV9iID0KLQkJbGUzMl90b19jcHUocnhfaW5mby0+YmVhY29uX3NpbGVuY2VfcnNzaV9iKSAmIElOX0JBTkRfRklMVEVSOwotCWJjbl9zaWxlbmNlX2MgPQotCQlsZTMyX3RvX2NwdShyeF9pbmZvLT5iZWFjb25fc2lsZW5jZV9yc3NpX2MpICYgSU5fQkFORF9GSUxURVI7Ci0KLQlpZiAoYmNuX3NpbGVuY2VfYSkgewotCQl0b3RhbF9zaWxlbmNlICs9IGJjbl9zaWxlbmNlX2E7Ci0JCW51bV9hY3RpdmVfcngrKzsKLQl9Ci0JaWYgKGJjbl9zaWxlbmNlX2IpIHsKLQkJdG90YWxfc2lsZW5jZSArPSBiY25fc2lsZW5jZV9iOwotCQludW1fYWN0aXZlX3J4Kys7Ci0JfQotCWlmIChiY25fc2lsZW5jZV9jKSB7Ci0JCXRvdGFsX3NpbGVuY2UgKz0gYmNuX3NpbGVuY2VfYzsKLQkJbnVtX2FjdGl2ZV9yeCsrOwotCX0KLQotCS8qIEF2ZXJhZ2UgYW1vbmcgYWN0aXZlIGFudGVubmFzICovCi0JaWYgKG51bV9hY3RpdmVfcngpCi0JCWxhc3Rfcnhfbm9pc2UgPSAodG90YWxfc2lsZW5jZSAvIG51bV9hY3RpdmVfcngpIC0gMTA3OwotCWVsc2UKLQkJbGFzdF9yeF9ub2lzZSA9IElXTF9OT0lTRV9NRUFTX05PVF9BVkFJTEFCTEU7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgImluYmFuZCBzaWxlbmNlIGEgJXUsIGIgJXUsIGMgJXUsIGRCbSAlZFxuIiwKLQkJCWJjbl9zaWxlbmNlX2EsIGJjbl9zaWxlbmNlX2IsIGJjbl9zaWxlbmNlX2MsCi0JCQlsYXN0X3J4X25vaXNlKTsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0vKgotICogIGJhc2VkIG9uIHRoZSBhc3N1bXB0aW9uIG9mIGFsbCBzdGF0aXN0aWNzIGNvdW50ZXIgYXJlIGluIERXT1JECi0gKiAgRklYTUU6IFRoaXMgZnVuY3Rpb24gaXMgZm9yIGRlYnVnZ2luZywgZG8gbm90IGRlYWwgd2l0aAotICogIHRoZSBjYXNlIG9mIGNvdW50ZXJzIHJvbGwtb3Zlci4KLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9hY2N1bXVsYXRpdmVfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCV9fbGUzMiAqc3RhdHMpCi17Ci0JaW50IGksIHNpemU7Ci0JX19sZTMyICpwcmV2X3N0YXRzOwotCXUzMiAqYWNjdW1fc3RhdHM7Ci0JdTMyICpkZWx0YSwgKm1heF9kZWx0YTsKLQlzdHJ1Y3Qgc3RhdGlzdGljc19nZW5lcmFsX2NvbW1vbiAqZ2VuZXJhbCwgKmFjY3VtX2dlbmVyYWw7Ci0Jc3RydWN0IHN0YXRpc3RpY3NfdHggKnR4LCAqYWNjdW1fdHg7Ci0KLQlwcmV2X3N0YXRzID0gKF9fbGUzMiAqKSZwcml2LT5fNDk2NS5zdGF0aXN0aWNzOwotCWFjY3VtX3N0YXRzID0gKHUzMiAqKSZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzOwotCXNpemUgPSBzaXplb2Yoc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzKTsKLQlnZW5lcmFsID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb247Ci0JYWNjdW1fZ2VuZXJhbCA9ICZwcml2LT5fNDk2NS5hY2N1bV9zdGF0aXN0aWNzLmdlbmVyYWwuY29tbW9uOwotCXR4ID0gJnByaXYtPl80OTY1LnN0YXRpc3RpY3MudHg7Ci0JYWNjdW1fdHggPSAmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcy50eDsKLQlkZWx0YSA9ICh1MzIgKikmcHJpdi0+XzQ5NjUuZGVsdGFfc3RhdGlzdGljczsKLQltYXhfZGVsdGEgPSAodTMyICopJnByaXYtPl80OTY1Lm1heF9kZWx0YTsKLQotCWZvciAoaSA9IHNpemVvZihfX2xlMzIpOyBpIDwgc2l6ZTsKLQkgICAgIGkgKz0gc2l6ZW9mKF9fbGUzMiksIHN0YXRzKyssIHByZXZfc3RhdHMrKywgZGVsdGErKywKLQkgICAgIG1heF9kZWx0YSsrLCBhY2N1bV9zdGF0cysrKSB7Ci0JCWlmIChsZTMyX3RvX2NwdSgqc3RhdHMpID4gbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKSB7Ci0JCQkqZGVsdGEgPSAobGUzMl90b19jcHUoKnN0YXRzKSAtCi0JCQkJbGUzMl90b19jcHUoKnByZXZfc3RhdHMpKTsKLQkJCSphY2N1bV9zdGF0cyArPSAqZGVsdGE7Ci0JCQlpZiAoKmRlbHRhID4gKm1heF9kZWx0YSkKLQkJCQkqbWF4X2RlbHRhID0gKmRlbHRhOwotCQl9Ci0JfQotCi0JLyogcmVzZXQgYWNjdW11bGF0aXZlIHN0YXRpc3RpY3MgZm9yICJuby1jb3VudGVyIiB0eXBlIHN0YXRpc3RpY3MgKi8KLQlhY2N1bV9nZW5lcmFsLT50ZW1wZXJhdHVyZSA9IGdlbmVyYWwtPnRlbXBlcmF0dXJlOwotCWFjY3VtX2dlbmVyYWwtPnR0bF90aW1lc3RhbXAgPSBnZW5lcmFsLT50dGxfdGltZXN0YW1wOwotfQotI2VuZGlmCi0KLSNkZWZpbmUgUkVHX1JFQ0FMSUJfUEVSSU9EICg2MCkKLQotdm9pZCBpd2w0OTY1X3J4X3N0YXRpc3RpY3Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0JaW50IGNoYW5nZTsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQotCUlXTF9ERUJVR19SWChwcml2LAotCQkgICAgICJTdGF0aXN0aWNzIG5vdGlmaWNhdGlvbiByZWNlaXZlZCAoJWQgdnMgJWQpLlxuIiwKLQkJICAgICAoaW50KXNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpLAotCQkgICAgIGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYKLQkJICAgICBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSyk7Ci0KLQljaGFuZ2UgPSAoKHByaXYtPl80OTY1LnN0YXRpc3RpY3MuZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUgIT0KLQkJICAgcGt0LT51LnN0YXRzLmdlbmVyYWwuY29tbW9uLnRlbXBlcmF0dXJlKSB8fAotCQkgICAoKHByaXYtPl80OTY1LnN0YXRpc3RpY3MuZmxhZyAmCi0JCSAgIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spICE9Ci0JCSAgIChwa3QtPnUuc3RhdHMuZmxhZyAmCi0JCSAgIFNUQVRJU1RJQ1NfUkVQTFlfRkxHX0hUNDBfTU9ERV9NU0spKSk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQlpd2w0OTY1X2FjY3VtdWxhdGl2ZV9zdGF0aXN0aWNzKHByaXYsIChfX2xlMzIgKikmcGt0LT51LnN0YXRzKTsKLSNlbmRpZgotCi0JLyogVE9ETzogcmVhZGluZyBzb21lIG9mIHN0YXRpc3RpY3MgaXMgdW5uZWVkZWQgKi8KLQltZW1jcHkoJnByaXYtPl80OTY1LnN0YXRpc3RpY3MsICZwa3QtPnUuc3RhdHMsCi0JCXNpemVvZihwcml2LT5fNDk2NS5zdGF0aXN0aWNzKSk7Ci0KLQlzZXRfYml0KFNUQVRVU19TVEFUSVNUSUNTLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIFJlc2NoZWR1bGUgdGhlIHN0YXRpc3RpY3MgdGltZXIgdG8gb2NjdXIgaW4KLQkgKiBSRUdfUkVDQUxJQl9QRVJJT0Qgc2Vjb25kcyB0byBlbnN1cmUgd2UgZ2V0IGEKLQkgKiB0aGVybWFsIHVwZGF0ZSBldmVuIGlmIHRoZSB1Q29kZSBkb2Vzbid0IGdpdmUKLQkgKiB1cyBvbmUgKi8KLQltb2RfdGltZXIoJnByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMsIGppZmZpZXMgKwotCQkgIG1zZWNzX3RvX2ppZmZpZXMoUkVHX1JFQ0FMSUJfUEVSSU9EICogMTAwMCkpOwotCi0JaWYgKHVubGlrZWx5KCF0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSAmJgotCSAgICAocGt0LT5oZHIuY21kID09IFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OKSkgewotCQlpd2w0OTY1X3J4X2NhbGNfbm9pc2UocHJpdik7Ci0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cnVuX3RpbWVfY2FsaWJfd29yayk7Ci0JfQotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT50ZW1wX29wcy50ZW1wZXJhdHVyZSAmJiBjaGFuZ2UpCi0JCXByaXYtPmNmZy0+b3BzLT5saWItPnRlbXBfb3BzLnRlbXBlcmF0dXJlKHByaXYpOwotfQotCi12b2lkIGl3bDQ5NjVfcmVwbHlfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQotCWlmIChsZTMyX3RvX2NwdShwa3QtPnUuc3RhdHMuZmxhZykgJiBVQ09ERV9TVEFUSVNUSUNTX0NMRUFSX01TSykgewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0JCW1lbXNldCgmcHJpdi0+XzQ5NjUuYWNjdW1fc3RhdGlzdGljcywgMCwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpKTsKLQkJbWVtc2V0KCZwcml2LT5fNDk2NS5kZWx0YV9zdGF0aXN0aWNzLCAwLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcykpOwotCQltZW1zZXQoJnByaXYtPl80OTY1Lm1heF9kZWx0YSwgMCwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MpKTsKLSNlbmRpZgotCQlJV0xfREVCVUdfUlgocHJpdiwgIlN0YXRpc3RpY3MgaGF2ZSBiZWVuIGNsZWFyZWRcbiIpOwotCX0KLQlpd2w0OTY1X3J4X3N0YXRpc3RpY3MocHJpdiwgcnhiKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXN0YS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtc3RhLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjJjMjMuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtc3RhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLQotc3RhdGljIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqCi1pd2w0OTY1X3N0YV9hbGxvY19scShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHN0YV9pZCkKLXsKLQlpbnQgaSwgcjsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kOwotCXUzMiByYXRlX2ZsYWdzID0gMDsKLQlfX2xlMzIgcmF0ZV9uX2ZsYWdzOwotCi0JbGlua19jbWQgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWxpbmtfY21kKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIExRIGNtZC5cbiIpOwotCQlyZXR1cm4gTlVMTDsKLQl9Ci0JLyogU2V0IHVwIHRoZSByYXRlIHNjYWxpbmcgdG8gc3RhcnQgYXQgc2VsZWN0ZWQgcmF0ZSwgZmFsbCBiYWNrCi0JICogYWxsIHRoZSB3YXkgZG93biB0byAxTSBpbiBJRUVFIG9yZGVyLCBhbmQgdGhlbiBzcGluIG9uIDFNICovCi0JaWYgKHByaXYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKLQkJciA9IElXTF9SQVRFXzZNX0lOREVYOwotCWVsc2UKLQkJciA9IElXTF9SQVRFXzFNX0lOREVYOwotCi0JaWYgKHIgPj0gSVdMX0ZJUlNUX0NDS19SQVRFICYmIHIgPD0gSVdMX0xBU1RfQ0NLX1JBVEUpCi0JCXJhdGVfZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKLQotCXJhdGVfZmxhZ3MgfD0gaXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpIDw8Ci0JCQkJUkFURV9NQ1NfQU5UX1BPUzsKLQlyYXRlX25fZmxhZ3MgPSBpd2w0OTY1X2h3X3NldF9yYXRlX25fZmxhZ3MoaXdsZWdhY3lfcmF0ZXNbcl0ucGxjcCwKLQkJCQkJCSAgIHJhdGVfZmxhZ3MpOwotCWZvciAoaSA9IDA7IGkgPCBMSU5LX1FVQUxfTUFYX1JFVFJZX05VTTsgaSsrKQotCQlsaW5rX2NtZC0+cnNfdGFibGVbaV0ucmF0ZV9uX2ZsYWdzID0gcmF0ZV9uX2ZsYWdzOwotCi0JbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLnNpbmdsZV9zdHJlYW1fYW50X21zayA9Ci0JCQkJaXdsNDk2NV9maXJzdF9hbnRlbm5hKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCi0JbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQotCQlwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50ICYKLQkJfml3bDQ5NjVfZmlyc3RfYW50ZW5uYShwcml2LT5od19wYXJhbXMudmFsaWRfdHhfYW50KTsKLQlpZiAoIWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrKSB7Ci0JCWxpbmtfY21kLT5nZW5lcmFsX3BhcmFtcy5kdWFsX3N0cmVhbV9hbnRfbXNrID0gQU5UX0FCOwotCX0gZWxzZSBpZiAoaXdsNDk2NV9udW1fb2ZfYW50KHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpID09IDIpIHsKLQkJbGlua19jbWQtPmdlbmVyYWxfcGFyYW1zLmR1YWxfc3RyZWFtX2FudF9tc2sgPQotCQkJcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudDsKLQl9Ci0KLQlsaW5rX2NtZC0+YWdnX3BhcmFtcy5hZ2dfZGlzX3N0YXJ0X3RoID0gTElOS19RVUFMX0FHR19ESVNBQkxFX1NUQVJUX0RFRjsKLQlsaW5rX2NtZC0+YWdnX3BhcmFtcy5hZ2dfdGltZV9saW1pdCA9Ci0JCWNwdV90b19sZTE2KExJTktfUVVBTF9BR0dfVElNRV9MSU1JVF9ERUYpOwotCi0JbGlua19jbWQtPnN0YV9pZCA9IHN0YV9pZDsKLQotCXJldHVybiBsaW5rX2NtZDsKLX0KLQotLyoKLSAqIGl3bDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24gLSBBZGQgdGhlIHNwZWNpYWwgSUJTUyBCU1NJRCBzdGF0aW9uCi0gKgotICogRnVuY3Rpb24gc2xlZXBzLgotICovCi1pbnQKLWl3bDQ5NjVfYWRkX2Jzc2lkX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgICBjb25zdCB1OCAqYWRkciwgdTggKnN0YV9pZF9yKQotewotCWludCByZXQ7Ci0JdTggc3RhX2lkOwotCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmIChzdGFfaWRfcikKLQkJKnN0YV9pZF9yID0gSVdMX0lOVkFMSURfU1RBVElPTjsKLQotCXJldCA9IGl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uKHByaXYsIGN0eCwgYWRkciwgMCwgTlVMTCwgJnN0YV9pZCk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gYWRkIHN0YXRpb24gJXBNXG4iLCBhZGRyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoc3RhX2lkX3IpCi0JCSpzdGFfaWRfciA9IHN0YV9pZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJV0xfU1RBX0xPQ0FMOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQkvKiBTZXQgdXAgZGVmYXVsdCByYXRlIHNjYWxpbmcgdGFibGUgaW4gZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCWxpbmtfY21kID0gaXdsNDk2NV9zdGFfYWxsb2NfbHEocHJpdiwgc3RhX2lkKTsKLQlpZiAoIWxpbmtfY21kKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIHN0YXRpb24gJXBNLlxuIiwKLQkJCWFkZHIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfbHFfY21kKHByaXYsIGN0eCwgbGlua19jbWQsIENNRF9TWU5DLCB0cnVlKTsKLQlpZiAocmV0KQotCQlJV0xfRVJSKHByaXYsICJMaW5rIHF1YWxpdHkgY29tbWFuZCBmYWlsZWQgKCVkKVxuIiwgcmV0KTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBsaW5rX2NtZDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCQkgICAgICBib29sIHNlbmRfaWZfZW1wdHkpCi17Ci0JaW50IGksIG5vdF9lbXB0eSA9IDA7Ci0JdTggYnVmZltzaXplb2Yoc3RydWN0IGl3bF93ZXBfY21kKSArCi0JCXNpemVvZihzdHJ1Y3QgaXdsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYXTsKLQlzdHJ1Y3QgaXdsX3dlcF9jbWQgKndlcF9jbWQgPSAoc3RydWN0IGl3bF93ZXBfY21kICopYnVmZjsKLQlzaXplX3QgY21kX3NpemUgID0gc2l6ZW9mKHN0cnVjdCBpd2xfd2VwX2NtZCk7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IGN0eC0+d2VwX2tleV9jbWQsCi0JCS5kYXRhID0gd2VwX2NtZCwKLQkJLmZsYWdzID0gQ01EX1NZTkMsCi0JfTsKLQotCW1pZ2h0X3NsZWVwKCk7Ci0KLQltZW1zZXQod2VwX2NtZCwgMCwgY21kX3NpemUgKwotCQkJKHNpemVvZihzdHJ1Y3QgaXdsX3dlcF9rZXkpICogV0VQX0tFWVNfTUFYKSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgV0VQX0tFWVNfTUFYIDsgaSsrKSB7Ci0JCXdlcF9jbWQtPmtleVtpXS5rZXlfaW5kZXggPSBpOwotCQlpZiAoY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZSkgewotCQkJd2VwX2NtZC0+a2V5W2ldLmtleV9vZmZzZXQgPSBpOwotCQkJbm90X2VtcHR5ID0gMTsKLQkJfSBlbHNlIHsKLQkJCXdlcF9jbWQtPmtleVtpXS5rZXlfb2Zmc2V0ID0gV0VQX0lOVkFMSURfT0ZGU0VUOwotCQl9Ci0KLQkJd2VwX2NtZC0+a2V5W2ldLmtleV9zaXplID0gY3R4LT53ZXBfa2V5c1tpXS5rZXlfc2l6ZTsKLQkJbWVtY3B5KCZ3ZXBfY21kLT5rZXlbaV0ua2V5WzNdLCBjdHgtPndlcF9rZXlzW2ldLmtleSwKLQkJCQljdHgtPndlcF9rZXlzW2ldLmtleV9zaXplKTsKLQl9Ci0KLQl3ZXBfY21kLT5nbG9iYWxfa2V5X3R5cGUgPSBXRVBfS0VZX1dFUF9UWVBFOwotCXdlcF9jbWQtPm51bV9rZXlzID0gV0VQX0tFWVNfTUFYOwotCi0JY21kX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBpd2xfd2VwX2tleSkgKiBXRVBfS0VZU19NQVg7Ci0KLQljbWQubGVuID0gY21kX3NpemU7Ci0KLQlpZiAobm90X2VtcHR5IHx8IHNlbmRfaWZfZW1wdHkpCi0JCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kKHByaXYsICZjbWQpOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci19Ci0KLWludCBpd2w0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIGl3bDQ5NjVfc3RhdGljX3dlcGtleV9jbWQocHJpdiwgY3R4LCBmYWxzZSk7Ci19Ci0KLWludCBpd2w0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZikKLXsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX1dFUChwcml2LCAiUmVtb3ZpbmcgZGVmYXVsdCBXRVAga2V5OiBpZHg9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmtleWlkeCk7Ci0KLQltZW1zZXQoJmN0eC0+d2VwX2tleXNba2V5Y29uZi0+a2V5aWR4XSwgMCwgc2l6ZW9mKGN0eC0+d2VwX2tleXNbMF0pKTsKLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpIHsKLQkJSVdMX0RFQlVHX1dFUChwcml2LAotCQkiTm90IHNlbmRpbmcgUkVQTFlfV0VQS0VZIGNvbW1hbmQgZHVlIHRvIFJGS0lMTC5cbiIpOwotCQkvKiBidXQga2V5cyBpbiBkZXZpY2UgYXJlIGNsZWFyIGFueXdheSBzbyByZXR1cm4gc3VjY2VzcyAqLwotCQlyZXR1cm4gMDsKLQl9Ci0JcmV0ID0gaXdsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChwcml2LCBjdHgsIDEpOwotCUlXTF9ERUJVR19XRVAocHJpdiwgIlJlbW92ZSBkZWZhdWx0IFdFUCBrZXk6IGlkeD0lZCByZXQ9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmtleWlkeCwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBpd2w0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZikKLXsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKGtleWNvbmYtPmtleWxlbiAhPSBXRVBfS0VZX0xFTl8xMjggJiYKLQkgICAga2V5Y29uZi0+a2V5bGVuICE9IFdFUF9LRVlfTEVOXzY0KSB7Ci0JCUlXTF9ERUJVR19XRVAocHJpdiwgIkJhZCBXRVAga2V5IGxlbmd0aCAlZFxuIiwga2V5Y29uZi0+a2V5bGVuKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0Ja2V5Y29uZi0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQlrZXljb25mLT5od19rZXlfaWR4ID0gSFdfS0VZX0RFRkFVTFQ7Ci0JcHJpdi0+c3RhdGlvbnNbY3R4LT5hcF9zdGFfaWRdLmtleWluZm8uY2lwaGVyID0ga2V5Y29uZi0+Y2lwaGVyOwotCi0JY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleV9zaXplID0ga2V5Y29uZi0+a2V5bGVuOwotCW1lbWNweSgmY3R4LT53ZXBfa2V5c1trZXljb25mLT5rZXlpZHhdLmtleSwgJmtleWNvbmYtPmtleSwKLQkJCQkJCQlrZXljb25mLT5rZXlsZW4pOwotCi0JcmV0ID0gaXdsNDk2NV9zdGF0aWNfd2Vwa2V5X2NtZChwcml2LCBjdHgsIGZhbHNlKTsKLQlJV0xfREVCVUdfV0VQKHByaXYsICJTZXQgZGVmYXVsdCBXRVAga2V5OiBsZW49JWQgaWR4PSVkIHJldD0lZFxuIiwKLQkJa2V5Y29uZi0+a2V5bGVuLCBrZXljb25mLT5rZXlpZHgsIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2V0X3dlcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCQkJdTggc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX19sZTE2IGtleV9mbGFncyA9IDA7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0Ja2V5Y29uZi0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQotCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfV0VQIHwgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0spOwotCWtleV9mbGFncyB8PSBjcHVfdG9fbGUxNihrZXljb25mLT5rZXlpZHggPDwgU1RBX0tFWV9GTEdfS0VZSURfUE9TKTsKLQlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7Ci0KLQlpZiAoa2V5Y29uZi0+a2V5bGVuID09IFdFUF9LRVlfTEVOXzEyOCkKLQkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfRkxHX0tFWV9TSVpFX01TSzsKLQotCWlmIChzdGFfaWQgPT0gY3R4LT5iY2FzdF9zdGFfaWQpCi0JCWtleV9mbGFncyB8PSBTVEFfS0VZX01VTFRJQ0FTVF9NU0s7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5jaXBoZXIgPSBrZXljb25mLT5jaXBoZXI7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleWxlbiA9IGtleWNvbmYtPmtleWxlbjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5aWR4ID0ga2V5Y29uZi0+a2V5aWR4OwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksCi0JCQkJa2V5Y29uZi0+a2V5LCBrZXljb25mLT5rZXlsZW4pOwotCi0JbWVtY3B5KCZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5WzNdLAotCQkJCWtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKLQotCWlmICgocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyAmIFNUQV9LRVlfRkxHX0VOQ1JZUFRfTVNLKQotCQkJPT0gU1RBX0tFWV9GTEdfTk9fRU5DKQotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9Ci0JCQkJIGl3bF9sZWdhY3lfZ2V0X2ZyZWVfdWNvZGVfa2V5X2luZGV4KHByaXYpOwotCS8qIGVsc2UsIHdlIGFyZSBvdmVycmlkaW5nIGFuIGV4aXN0aW5nIGtleSA9PiBubyBuZWVkIHRvIGFsbG9jYXRlZCByb29tCi0JICogaW4gdUNvZGUuICovCi0KLQlXQVJOKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID09IFdFUF9JTlZBTElEX09GRlNFVCwKLQkJIm5vIHNwYWNlIGZvciBhIG5ldyBrZXkiKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgPSBrZXlfZmxhZ3M7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCQkgdTggc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX19sZTE2IGtleV9mbGFncyA9IDA7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0Ja2V5X2ZsYWdzIHw9IChTVEFfS0VZX0ZMR19DQ01QIHwgU1RBX0tFWV9GTEdfTUFQX0tFWV9NU0spOwotCWtleV9mbGFncyB8PSBjcHVfdG9fbGUxNihrZXljb25mLT5rZXlpZHggPDwgU1RBX0tFWV9GTEdfS0VZSURfUE9TKTsKLQlrZXlfZmxhZ3MgJj0gflNUQV9LRVlfRkxHX0lOVkFMSUQ7Ci0KLQlpZiAoc3RhX2lkID09IGN0eC0+YmNhc3Rfc3RhX2lkKQotCQlrZXlfZmxhZ3MgfD0gU1RBX0tFWV9NVUxUSUNBU1RfTVNLOwotCi0Ja2V5Y29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0ga2V5Y29uZi0+a2V5bGVuOwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwKLQkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKLQotCW1lbWNweShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5LCBrZXljb25mLT5rZXksCi0JICAgICAgIGtleWNvbmYtPmtleWxlbik7Ci0KLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykKLQkJCT09IFNUQV9LRVlfRkxHX05PX0VOQykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQotCQkJCSBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChwcml2KTsKLQkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQotCSAqIGluIHVDb2RlLiAqLwotCi0JV0FSTihwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQsCi0JCSJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7Ci0KLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0ga2V5X2ZsYWdzOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0KLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCSBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YV9jbWQsIENNRF9TWU5DKTsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X3NldF90a2lwX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJCSB1OCBzdGFfaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQlfX2xlMTYga2V5X2ZsYWdzID0gMDsKLQotCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfVEtJUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKLQlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7Ci0Ja2V5X2ZsYWdzICY9IH5TVEFfS0VZX0ZMR19JTlZBTElEOwotCi0JaWYgKHN0YV9pZCA9PSBjdHgtPmJjYXN0X3N0YV9pZCkKLQkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfTVVMVElDQVNUX01TSzsKLQotCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmNpcGhlciA9IGtleWNvbmYtPmNpcGhlcjsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm8ua2V5bGVuID0gMTY7Ci0KLQlpZiAoKHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfZmxhZ3MgJiBTVEFfS0VZX0ZMR19FTkNSWVBUX01TSykKLQkJCT09IFNUQV9LRVlfRkxHX05PX0VOQykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPQotCQkJCSBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChwcml2KTsKLQkvKiBlbHNlLCB3ZSBhcmUgb3ZlcnJpZGluZyBhbiBleGlzdGluZyBrZXkgPT4gbm8gbmVlZCB0byBhbGxvY2F0ZWQgcm9vbQotCSAqIGluIHVDb2RlLiAqLwotCi0JV0FSTihwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQsCi0JCSJubyBzcGFjZSBmb3IgYSBuZXcga2V5Iik7Ci0KLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0ga2V5X2ZsYWdzOwotCi0KLQkvKiBUaGlzIGNvcHkgaXMgYWN1dGFsbHkgbm90IG5lZWRlZDogd2UgZ2V0IHRoZSBrZXkgd2l0aCBlYWNoIFRYICovCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5rZXksIGtleWNvbmYtPmtleSwgMTYpOwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXksIGtleWNvbmYtPmtleSwgMTYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXZvaWQgaXdsNDk2NV91cGRhdGVfdGtpcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpCi17Ci0JdTggc3RhX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbChwcml2KSkgewotCQkvKiBjYW5jZWwgc2NhbiBmYWlsZWQsIGp1c3QgbGl2ZSB3LyBiYWQga2V5IGFuZCByZWx5Ci0JCSAgIGJyaWVmbHkgb24gU1cgZGVjcnlwdGlvbiAqLwotCQlyZXR1cm47Ci0JfQotCi0Jc3RhX2lkID0gaXdsX2xlZ2FjeV9zdGFfaWRfb3JfYnJvYWRjYXN0KHByaXYsIGN0eCwgc3RhKTsKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCi0JCXJldHVybjsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHNjX2J5dGUyID0gKHU4KSBpdjMyOwotCi0JZm9yIChpID0gMDsgaSA8IDU7IGkrKykKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LnRraXBfcnhfdHRha1tpXSA9Ci0JCQljcHVfdG9fbGUxNihwaGFzZTFrZXlbaV0pOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9LRVlfTUFTSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQotCWl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLX0KLQotaW50IGl3bDQ5NjVfcmVtb3ZlX2R5bmFtaWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJICAgdTggc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IGtleV9mbGFnczsKLQl1OCBrZXlpZHg7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JY3R4LT5rZXlfbWFwcGluZ19rZXlzLS07Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlrZXlfZmxhZ3MgPSBsZTE2X3RvX2NwdShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzKTsKLQlrZXlpZHggPSAoa2V5X2ZsYWdzID4+IFNUQV9LRVlfRkxHX0tFWUlEX1BPUykgJiAweDM7Ci0KLQlJV0xfREVCVUdfV0VQKHByaXYsICJSZW1vdmUgZHluYW1pYyBrZXk6IGlkeD0lZCBzdGE9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmtleWlkeCwgc3RhX2lkKTsKLQotCWlmIChrZXljb25mLT5rZXlpZHggIT0ga2V5aWR4KSB7Ci0JCS8qIFdlIG5lZWQgdG8gcmVtb3ZlIGEga2V5IHdpdGggaW5kZXggZGlmZmVyZW50IHRoYXQgdGhlIG9uZQotCQkgKiBpbiB0aGUgdUNvZGUuIFRoaXMgbWVhbnMgdGhhdCB0aGUga2V5IHdlIG5lZWQgdG8gcmVtb3ZlIGhhcwotCQkgKiBiZWVuIHJlcGxhY2VkIGJ5IGFub3RoZXIgb25lIHdpdGggZGlmZmVyZW50IGluZGV4LgotCQkgKiBEb24ndCBkbyBhbnl0aGluZyBhbmQgcmV0dXJuIG9rCi0JCSAqLwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VUKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJSZW1vdmluZyB3cm9uZyBrZXkgJWQgMHgleFxuIiwKLQkJCSAgICBrZXljb25mLT5rZXlpZHgsIGtleV9mbGFncyk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0LAotCQkmcHJpdi0+dWNvZGVfa2V5X3RhYmxlKSkKLQkJSVdMX0VSUihwcml2LCAiaW5kZXggJWQgbm90IHVzZWQgaW4gdUNvZGUga2V5IHRhYmxlLlxuIiwKLQkJCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0KTsKLQltZW1zZXQoJnByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mbywgMCwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpd2xfaHdfa2V5KSk7Ci0JbWVtc2V0KCZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXksIDAsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXdsNDk2NV9rZXlpbmZvKSk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9Ci0JCQlTVEFfS0VZX0ZMR19OT19FTkMgfCBTVEFfS0VZX0ZMR19JTlZBTElEOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXlfb2Zmc2V0ID0gV0VQX0lOVkFMSURfT0ZGU0VUOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpIHsKLQkJSVdMX0RFQlVHX1dFUChwcml2LAotCQkgIk5vdCBzZW5kaW5nIFJFUExZX0FERF9TVEEgY29tbWFuZCBiZWNhdXNlIFJGS0lMTCBlbmFibGVkLlxuIik7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCXNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwotfQotCi1pbnQgaXdsNDk2NV9zZXRfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQotewotCWludCByZXQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQljdHgtPmtleV9tYXBwaW5nX2tleXMrKzsKLQlrZXljb25mLT5od19rZXlfaWR4ID0gSFdfS0VZX0RZTkFNSUM7Ci0KLQlzd2l0Y2ggKGtleWNvbmYtPmNpcGhlcikgewotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJcmV0ID0gaXdsNDk2NV9zZXRfY2NtcF9keW5hbWljX2tleV9pbmZvKHByaXYsIGN0eCwKLQkJCQkJCQlrZXljb25mLCBzdGFfaWQpOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCXJldCA9IGl3bDQ5NjVfc2V0X3RraXBfZHluYW1pY19rZXlfaW5mbyhwcml2LCBjdHgsCi0JCQkJCQkJa2V5Y29uZiwgc3RhX2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MDoKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJcmV0ID0gaXdsNDk2NV9zZXRfd2VwX2R5bmFtaWNfa2V5X2luZm8ocHJpdiwgY3R4LAotCQkJCQkJCWtleWNvbmYsIHN0YV9pZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJVbmtub3duIGFsZzogJXMgY2lwaGVyID0gJXhcbiIsIF9fZnVuY19fLAotCQkJa2V5Y29uZi0+Y2lwaGVyKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQlJV0xfREVCVUdfV0VQKHByaXYsCi0JCSJTZXQgZHluYW1pYyBrZXk6IGNpcGhlcj0leCBsZW49JWQgaWR4PSVkIHN0YT0lZCByZXQ9JWRcbiIsCi0JCSAgICAgIGtleWNvbmYtPmNpcGhlciwga2V5Y29uZi0+a2V5bGVuLCBrZXljb25mLT5rZXlpZHgsCi0JCSAgICAgIHN0YV9pZCwgcmV0KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uIC0gYWRkIGJyb2FkY2FzdCBzdGF0aW9uIGludG8gZHJpdmVyJ3Mgc3RhdGlvbiB0YWJsZS4KLSAqCi0gKiBUaGlzIGFkZHMgdGhlIGJyb2FkY2FzdCBzdGF0aW9uIGludG8gdGhlIGRyaXZlcidzIHN0YXRpb24gdGFibGUKLSAqIGFuZCBtYXJrcyBpdCBkcml2ZXIgYWN0aXZlLCBzbyB0aGF0IGl0IHdpbGwgYmUgcmVzdG9yZWQgdG8gdGhlCi0gKiBkZXZpY2UgYXQgdGhlIG5leHQgYmVzdCB0aW1lLgotICovCi1pbnQgaXdsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBzdGFfaWQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3ByZXBfc3RhdGlvbihwcml2LCBjdHgsIGl3bGVnYWN5X2JjYXN0X2FkZHIsCi0JCQkJCQkJCWZhbHNlLCBOVUxMKTsKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIHByZXBhcmUgYnJvYWRjYXN0IHN0YXRpb25cbiIpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJV0xfU1RBX0RSSVZFUl9BQ1RJVkU7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkIHw9IElXTF9TVEFfQkNBU1Q7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCWxpbmtfY21kID0gaXdsNDk2NV9zdGFfYWxsb2NfbHEocHJpdiwgc3RhX2lkKTsKLQlpZiAoIWxpbmtfY21kKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJVbmFibGUgdG8gaW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgZm9yIGJjYXN0IHN0YXRpb24uXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IGxpbmtfY21kOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9uIC0gdXBkYXRlIGJyb2FkY2FzdCBzdGF0aW9uJ3MgTFEgY29tbWFuZAotICoKLSAqIE9ubHkgdXNlZCBieSBpd2w0OTY1LiBQbGFjZWQgaGVyZSB0byBoYXZlIGFsbCBiY2FzdCBzdGF0aW9uIG1hbmFnZW1lbnQKLSAqIGNvZGUgdG9nZXRoZXIuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxpbmtfY21kOwotCXU4IHN0YV9pZCA9IGN0eC0+YmNhc3Rfc3RhX2lkOwotCi0JbGlua19jbWQgPSBpd2w0OTY1X3N0YV9hbGxvY19scShwcml2LCBzdGFfaWQpOwotCWlmICghbGlua19jbWQpIHsKLQkJSVdMX0VSUihwcml2LAotCQkiVW5hYmxlIHRvIGluaXRpYWxpemUgcmF0ZSBzY2FsaW5nIGZvciBiY2FzdCBzdGF0aW9uLlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmxxKQotCQlrZnJlZShwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmxxKTsKLQllbHNlCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCSJCY2FzdCBzdGF0aW9uIHJhdGUgc2NhbGluZyBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LlxuIik7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSA9IGxpbmtfY21kOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bDQ5NjVfdXBkYXRlX2JjYXN0X3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCWludCByZXQgPSAwOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJcmV0ID0gaXdsNDk2NV91cGRhdGVfYmNhc3Rfc3RhdGlvbihwcml2LCBjdHgpOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZCAtIEVuYWJsZSBUeCBmb3IgdGhpcyBUSUQgaW4gc3RhdGlvbiB0YWJsZQotICovCi1pbnQgaXdsNDk2NV9zdGFfdHhfbW9kaWZ5X2VuYWJsZV90aWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCBpbnQgdGlkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCBzdGFfY21kOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JLyogUmVtb3ZlICJkaXNhYmxlIiBmbGFnLCB0byBlbmFibGUgVHggZm9yIHRoaXMgVElEICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gU1RBX01PRElGWV9USURfRElTQUJMRV9UWDsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS50aWRfZGlzYWJsZV90eCAmPSBjcHVfdG9fbGUxNih+KDEgPDwgdGlkKSk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LCAmc3RhX2NtZCwgQ01EX1NZTkMpOwotfQotCi1pbnQgaXdsNDk2NV9zdGFfcnhfYWdnX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCSBpbnQgdGlkLCB1MTYgc3NuKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHN0YV9pZDsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YV9jbWQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZChzdGEpOwotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikKLQkJcmV0dXJuIC1FTlhJTzsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3NfbXNrID0gMDsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0FEREJBX1RJRF9NU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuYWRkX2ltbWVkaWF0ZV9iYV90aWQgPSAodTgpdGlkOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmFkZF9pbW1lZGlhdGVfYmFfc3NuID0gY3B1X3RvX2xlMTYoc3NuKTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKLQltZW1jcHkoJnN0YV9jbWQsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwKLQkJCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLWludCBpd2w0OTY1X3N0YV9yeF9hZ2dfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQlpbnQgdGlkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHN0YV9pZDsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YV9jbWQ7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZChzdGEpOwotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikgewotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIHN0YXRpb24gZm9yIEFHRyB0aWQgJWRcbiIsIHRpZCk7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFnc19tc2sgPSAwOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfREVMQkFfVElEX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZCA9ICh1OCl0aWQ7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsCi0JCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQpKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLXZvaWQKLWl3bDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBzdGFfaWQsIGludCBjbnQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3MgfD0gU1RBX0ZMR19QV1JfU0FWRV9NU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFnc19tc2sgPSBTVEFfRkxHX1BXUl9TQVZFX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPQotCQkJCQlTVEFfTU9ESUZZX1NMRUVQX1RYX0NPVU5UX01TSzsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zbGVlcF90eF9jb3VudCA9IGNwdV90b19sZTE2KGNudCk7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JaXdsX2xlZ2FjeV9zZW5kX2FkZF9zdGEocHJpdiwKLQkJCQkmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXR4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMTJlMzYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdHguYworKysgL2Rldi9udWxsCkBAIC0xLDEzNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotI2luY2x1ZGUgIml3bC00OTY1LWh3LmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUuaCIKLQotLyoKLSAqIG1hYzgwMjExIHF1ZXVlcywgQUNzLCBoYXJkd2FyZSBxdWV1ZXMsIEZJRk9zLgotICoKLSAqIENmLiBodHRwOi8vd2lyZWxlc3Mua2VybmVsLm9yZy9lbi9kZXZlbG9wZXJzL0RvY3VtZW50YXRpb24vbWFjODAyMTEvcXVldWVzCi0gKgotICogTWFjODAyMTEgdXNlcyB0aGUgZm9sbG93aW5nIG51bWJlcnMsIHdoaWNoIHdlIGdldCBhcyBmcm9tIGl0Ci0gKiBieSB3YXkgb2Ygc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik6Ci0gKgotICoJVk8JMAotICoJVkkJMQotICoJQkUJMgotICoJQksJMwotICoKLSAqCi0gKiBSZWd1bGFyIChub3QgQS1NUERVKSBmcmFtZXMgYXJlIHB1dCBpbnRvIGhhcmR3YXJlIHF1ZXVlcyBjb3JyZXNwb25kaW5nCi0gKiB0byB0aGUgRklGT3MsIHNlZSBjb21tZW50cyBpbiBpd2wtcHJwaC5oLiBBZ2dyZWdhdGVkIGZyYW1lcyBnZXQgdGhlaXIKLSAqIG93biBxdWV1ZSBwZXIgYWdncmVnYXRpb24gc2Vzc2lvbiAoUkEvVElEIGNvbWJpbmF0aW9uKSwgc3VjaCBxdWV1ZXMgYXJlCi0gKiBzZXQgdXAgdG8gbWFwIGludG8gRklGT3MgdG9vLCBmb3Igd2hpY2ggd2UgbmVlZCBhbiBBQy0+RklGTyBtYXBwaW5nLiBJbgotICogb3JkZXIgdG8gbWFwIGZyYW1lcyB0byB0aGUgcmlnaHQgcXVldWUsIHdlIGFsc28gbmVlZCBhbiBBQy0+aHcgcXVldWUKLSAqIG1hcHBpbmcuIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZS4KLSAqCi0gKiBEdWUgdG8gdGhlIHdheSBodyBxdWV1ZXMgYXJlIHNldCB1cCAoYnkgdGhlIGh3IHNwZWNpZmljIG1vZHVsZXMgbGlrZQotICogaXdsLTQ5NjUuYyksIHRoZSBBQy0+aHcgcXVldWUgbWFwcGluZyBpcyB0aGUgaWRlbnRpdHkKLSAqIG1hcHBpbmcuCi0gKi8KLQotc3RhdGljIGNvbnN0IHU4IHRpZF90b19hY1tdID0gewotCUlFRUU4MDIxMV9BQ19CRSwKLQlJRUVFODAyMTFfQUNfQkssCi0JSUVFRTgwMjExX0FDX0JLLAotCUlFRUU4MDIxMV9BQ19CRSwKLQlJRUVFODAyMTFfQUNfVkksCi0JSUVFRTgwMjExX0FDX1ZJLAotCUlFRUU4MDIxMV9BQ19WTywKLQlJRUVFODAyMTFfQUNfVk8KLX07Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bDQ5NjVfZ2V0X2FjX2Zyb21fdGlkKHUxNiB0aWQpCi17Ci0JaWYgKGxpa2VseSh0aWQgPCBBUlJBWV9TSVpFKHRpZF90b19hYykpKQotCQlyZXR1cm4gdGlkX3RvX2FjW3RpZF07Ci0KLQkvKiBubyBzdXBwb3J0IGZvciBUSURzIDgtMTUgeWV0ICovCi0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50Ci1pd2w0OTY1X2dldF9maWZvX2Zyb21fdGlkKHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsIHUxNiB0aWQpCi17Ci0JaWYgKGxpa2VseSh0aWQgPCBBUlJBWV9TSVpFKHRpZF90b19hYykpKQotCQlyZXR1cm4gY3R4LT5hY190b19maWZvW3RpZF90b19hY1t0aWRdXTsKLQotCS8qIG5vIHN1cHBvcnQgZm9yIFRJRHMgOC0xNSB5ZXQgKi8KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotLyoKLSAqIGhhbmRsZSBidWlsZCBSRVBMWV9UWCBjb21tYW5kIG5vdGlmaWNhdGlvbi4KLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV90eF9jbWRfYnVpbGRfYmFzaWMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQlzdHJ1Y3QgaXdsX3R4X2NtZCAqdHhfY21kLAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCi0JCQkJCXU4IHN0ZF9pZCkKLXsKLQlfX2xlMTYgZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0JX19sZTMyIHR4X2ZsYWdzID0gdHhfY21kLT50eF9mbGFnczsKLQotCXR4X2NtZC0+c3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7Ci0JaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSykpIHsKLQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLOwotCQlpZiAoaWVlZTgwMjExX2lzX21nbXQoZmMpKQotCQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQkJaWYgKGllZWU4MDIxMV9pc19wcm9iZV9yZXNwKGZjKSAmJgotCQkgICAgIShsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSAmIDB4ZikpCi0JCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1RTRl9NU0s7Ci0JfSBlbHNlIHsKLQkJdHhfZmxhZ3MgJj0gKH5UWF9DTURfRkxHX0FDS19NU0spOwotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0KLQotCWlmIChpZWVlODAyMTFfaXNfYmFja19yZXEoZmMpKQotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX0FDS19NU0sgfCBUWF9DTURfRkxHX0lNTV9CQV9SU1BfTUFTSzsKLQotCXR4X2NtZC0+c3RhX2lkID0gc3RkX2lkOwotCWlmIChpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCi0JCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfTU9SRV9GUkFHX01TSzsKLQotCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7Ci0JCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwotCQl0eF9jbWQtPnRpZF90c3BlYyA9IHFjWzBdICYgMHhmOwotCQl0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19TRVFfQ1RMX01TSzsKLQl9IGVsc2UgewotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0KLQotCWl3bF9sZWdhY3lfdHhfY21kX3Byb3RlY3Rpb24ocHJpdiwgaW5mbywgZmMsICZ0eF9mbGFncyk7Ci0KLQl0eF9mbGFncyAmPSB+KFRYX0NNRF9GTEdfQU5UX1NFTF9NU0spOwotCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpIHsKLQkJaWYgKGllZWU4MDIxMV9pc19hc3NvY19yZXEoZmMpIHx8IGllZWU4MDIxMV9pc19yZWFzc29jX3JlcShmYykpCi0JCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDMpOwotCQllbHNlCi0JCQl0eF9jbWQtPnRpbWVvdXQucG1fZnJhbWVfdGltZW91dCA9IGNwdV90b19sZTE2KDIpOwotCX0gZWxzZSB7Ci0JCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gMDsKLQl9Ci0KLQl0eF9jbWQtPmRyaXZlcl90eG9wID0gMDsKLQl0eF9jbWQtPnR4X2ZsYWdzID0gdHhfZmxhZ3M7Ci0JdHhfY21kLT5uZXh0X2ZyYW1lX2xlbiA9IDA7Ci19Ci0KLSNkZWZpbmUgUlRTX0RGQVVMVF9SRVRSWV9MSU1JVAkJNjAKLQotc3RhdGljIHZvaWQgaXdsNDk2NV90eF9jbWRfYnVpbGRfcmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3R4X2NtZCAqdHhfY21kLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJICAgICAgX19sZTE2IGZjKQotewotCXUzMiByYXRlX2ZsYWdzOwotCWludCByYXRlX2lkeDsKLQl1OCBydHNfcmV0cnlfbGltaXQ7Ci0JdTggZGF0YV9yZXRyeV9saW1pdDsKLQl1OCByYXRlX3BsY3A7Ci0KLQkvKiBTZXQgcmV0cnkgbGltaXQgb24gREFUQSBwYWNrZXRzIGFuZCBQcm9iZSBSZXNwb25zZXMqLwotCWlmIChpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpCi0JCWRhdGFfcmV0cnlfbGltaXQgPSAzOwotCWVsc2UKLQkJZGF0YV9yZXRyeV9saW1pdCA9IElXTDQ5NjVfREVGQVVMVF9UWF9SRVRSWTsKLQl0eF9jbWQtPmRhdGFfcmV0cnlfbGltaXQgPSBkYXRhX3JldHJ5X2xpbWl0OwotCi0JLyogU2V0IHJldHJ5IGxpbWl0IG9uIFJUUyBwYWNrZXRzICovCi0JcnRzX3JldHJ5X2xpbWl0ID0gUlRTX0RGQVVMVF9SRVRSWV9MSU1JVDsKLQlpZiAoZGF0YV9yZXRyeV9saW1pdCA8IHJ0c19yZXRyeV9saW1pdCkKLQkJcnRzX3JldHJ5X2xpbWl0ID0gZGF0YV9yZXRyeV9saW1pdDsKLQl0eF9jbWQtPnJ0c19yZXRyeV9saW1pdCA9IHJ0c19yZXRyeV9saW1pdDsKLQotCS8qIERBVEEgcGFja2V0cyB3aWxsIHVzZSB0aGUgdUNvZGUgc3RhdGlvbiB0YWJsZSBmb3IgcmF0ZS9hbnRlbm5hCi0JICogc2VsZWN0aW9uICovCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgewotCQl0eF9jbWQtPmluaXRpYWxfcmF0ZV9pbmRleCA9IDA7Ci0JCXR4X2NtZC0+dHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19TVEFfUkFURV9NU0s7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCBUWCByYXRlIHN0b3JlZCBpbiBtYWM4MDIxMSBoYXMgdGhlIE1DUyBiaXQgc2V0LCBpdCdzCi0JICogbm90IHJlYWxseSBhIFRYIHJhdGUuICBUaHVzLCB3ZSB1c2UgdGhlIGxvd2VzdCBzdXBwb3J0ZWQgcmF0ZSBmb3IKLQkgKiB0aGlzIGJhbmQuICBBbHNvIHVzZSB0aGUgbG93ZXN0IHN1cHBvcnRlZCByYXRlIGlmIHRoZSBzdG9yZWQgcmF0ZQotCSAqIGluZGV4IGlzIGludmFsaWQuCi0JICovCi0JcmF0ZV9pZHggPSBpbmZvLT5jb250cm9sLnJhdGVzWzBdLmlkeDsKLQlpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19NQ1MgfHwKLQkJCShyYXRlX2lkeCA8IDApIHx8IChyYXRlX2lkeCA+IElXTF9SQVRFX0NPVU5UX0xFR0FDWSkpCi0JCXJhdGVfaWR4ID0gcmF0ZV9sb3dlc3RfaW5kZXgoJnByaXYtPmJhbmRzW2luZm8tPmJhbmRdLAotCQkJCWluZm8tPmNvbnRyb2wuc3RhKTsKLQkvKiBGb3IgNSBHSFogYmFuZCwgcmVtYXAgbWFjODAyMTEgcmF0ZSBpbmRpY2VzIGludG8gZHJpdmVyIGluZGljZXMgKi8KLQlpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQotCQlyYXRlX2lkeCArPSBJV0xfRklSU1RfT0ZETV9SQVRFOwotCS8qIEdldCBQTENQIHJhdGUgZm9yIHR4X2NtZC0+cmF0ZV9uX2ZsYWdzICovCi0JcmF0ZV9wbGNwID0gaXdsZWdhY3lfcmF0ZXNbcmF0ZV9pZHhdLnBsY3A7Ci0JLyogWmVybyBvdXQgZmxhZ3MgZm9yIHRoaXMgcGFja2V0ICovCi0JcmF0ZV9mbGFncyA9IDA7Ci0KLQkvKiBTZXQgQ0NLIGZsYWcgYXMgbmVlZGVkICovCi0JaWYgKChyYXRlX2lkeCA+PSBJV0xfRklSU1RfQ0NLX1JBVEUpICYmIChyYXRlX2lkeCA8PSBJV0xfTEFTVF9DQ0tfUkFURSkpCi0JCXJhdGVfZmxhZ3MgfD0gUkFURV9NQ1NfQ0NLX01TSzsKLQotCS8qIFNldCB1cCBhbnRlbm5hcyAqLwotCXByaXYtPm1nbXRfdHhfYW50ID0gaXdsNDk2NV90b2dnbGVfdHhfYW50KHByaXYsIHByaXYtPm1nbXRfdHhfYW50LAotCQkJCSAgICAgIHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpOwotCi0JcmF0ZV9mbGFncyB8PSBpd2w0OTY1X2FudF9pZHhfdG9fZmxhZ3MocHJpdi0+bWdtdF90eF9hbnQpOwotCi0JLyogU2V0IHRoZSByYXRlIGluIHRoZSBUWCBjbWQgKi8KLQl0eF9jbWQtPnJhdGVfbl9mbGFncyA9IGl3bDQ5NjVfaHdfc2V0X3JhdGVfbl9mbGFncyhyYXRlX3BsY3AsIHJhdGVfZmxhZ3MpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3R4X2NtZF9idWlsZF9od2NyeXB0byhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJCSAgICAgIHN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQsCi0JCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYl9mcmFnLAotCQkJCSAgICAgIGludCBzdGFfaWQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiA9IGluZm8tPmNvbnRyb2wuaHdfa2V5OwotCi0Jc3dpdGNoIChrZXljb25mLT5jaXBoZXIpIHsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCXR4X2NtZC0+c2VjX2N0bCA9IFRYX0NNRF9TRUNfQ0NNOwotCQltZW1jcHkodHhfY21kLT5rZXksIGtleWNvbmYtPmtleSwga2V5Y29uZi0+a2V5bGVuKTsKLQkJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKLQkJCXR4X2NtZC0+dHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BR0dfQ0NNUF9NU0s7Ci0JCUlXTF9ERUJVR19UWChwcml2LCAidHhfY21kIHdpdGggQUVTIGh3Y3J5cHRvXG4iKTsKLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCXR4X2NtZC0+c2VjX2N0bCA9IFRYX0NNRF9TRUNfVEtJUDsKLQkJaWVlZTgwMjExX2dldF90a2lwX3AyayhrZXljb25mLCBza2JfZnJhZywgdHhfY21kLT5rZXkpOwotCQlJV0xfREVCVUdfVFgocHJpdiwgInR4X2NtZCB3aXRoIHRraXAgaHdjcnlwdG9cbiIpOwotCQlicmVhazsKLQotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQl0eF9jbWQtPnNlY19jdGwgfD0gVFhfQ01EX1NFQ19LRVkxMjg7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6Ci0JCXR4X2NtZC0+c2VjX2N0bCB8PSAoVFhfQ01EX1NFQ19XRVAgfAotCQkJKGtleWNvbmYtPmtleWlkeCAmIFRYX0NNRF9TRUNfTVNLKSA8PCBUWF9DTURfU0VDX1NISUZUKTsKLQotCQltZW1jcHkoJnR4X2NtZC0+a2V5WzNdLCBrZXljb25mLT5rZXksIGtleWNvbmYtPmtleWxlbik7Ci0KLQkJSVdMX0RFQlVHX1RYKHByaXYsICJDb25maWd1cmluZyBwYWNrZXQgZm9yIFdFUCBlbmNyeXB0aW9uICIKLQkJCSAgICAgIndpdGgga2V5ICVkXG4iLCBrZXljb25mLT5rZXlpZHgpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIlVua25vd24gZW5jb2RlIGNpcGhlciAleFxuIiwga2V5Y29uZi0+Y2lwaGVyKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKgotICogc3RhcnQgUkVQTFlfVFggY29tbWFuZCBwcm9jZXNzCi0gKi8KLWludCBpd2w0OTY1X3R4X3NrYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSA9IGluZm8tPmNvbnRyb2wuc3RhOwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9IE5VTEw7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxOwotCXN0cnVjdCBpd2xfcXVldWUgKnE7Ci0Jc3RydWN0IGl3bF9kZXZpY2VfY21kICpvdXRfY21kOwotCXN0cnVjdCBpd2xfY21kX21ldGEgKm91dF9tZXRhOwotCXN0cnVjdCBpd2xfdHhfY21kICp0eF9jbWQ7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlpbnQgdHhxX2lkOwotCWRtYV9hZGRyX3QgcGh5c19hZGRyOwotCWRtYV9hZGRyX3QgdHhjbWRfcGh5czsKLQlkbWFfYWRkcl90IHNjcmF0Y2hfcGh5czsKLQl1MTYgbGVuLCBmaXJzdGxlbiwgc2Vjb25kbGVuOwotCXUxNiBzZXFfbnVtYmVyID0gMDsKLQlfX2xlMTYgZmM7Ci0JdTggaGRyX2xlbjsKLQl1OCBzdGFfaWQ7Ci0JdTggd2FpdF93cml0ZV9wdHIgPSAwOwotCXU4IHRpZCA9IDA7Ci0JdTggKnFjID0gTlVMTDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWJvb2wgaXNfYWdnID0gZmFsc2U7Ci0KLQlpZiAoaW5mby0+Y29udHJvbC52aWYpCi0JCWN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYoaW5mby0+Y29udHJvbC52aWYpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgIkRyb3BwaW5nIC0gUkYgS0lMTFxuIik7Ci0JCWdvdG8gZHJvcF91bmxvY2s7Ci0JfQotCi0JZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaWVlZTgwMjExX2lzX2F1dGgoZmMpKQotCQlJV0xfREVCVUdfVFgocHJpdiwgIlNlbmRpbmcgQVVUSCBmcmFtZVxuIik7Ci0JZWxzZSBpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShmYykpCi0JCUlXTF9ERUJVR19UWChwcml2LCAiU2VuZGluZyBBU1NPQyBmcmFtZVxuIik7Ci0JZWxzZSBpZiAoaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJTZW5kaW5nIFJFQVNTT0MgZnJhbWVcbiIpOwotI2VuZGlmCi0KLQloZHJfbGVuID0gaWVlZTgwMjExX2hkcmxlbihmYyk7Ci0KLQkvKiBGb3IgbWFuYWdlbWVudCBmcmFtZXMgdXNlIGJyb2FkY2FzdCBpZCB0byBkbyBub3QgYnJlYWsgYWdncmVnYXRpb24gKi8KLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGZjKSkKLQkJc3RhX2lkID0gY3R4LT5iY2FzdF9zdGFfaWQ7Ci0JZWxzZSB7Ci0JCS8qIEZpbmQgaW5kZXggaW50byBzdGF0aW9uIHRhYmxlIGZvciBkZXN0aW5hdGlvbiBzdGF0aW9uICovCi0JCXN0YV9pZCA9IGl3bF9sZWdhY3lfc3RhX2lkX29yX2Jyb2FkY2FzdChwcml2LCBjdHgsIGluZm8tPmNvbnRyb2wuc3RhKTsKLQotCQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pIHsKLQkJCUlXTF9ERUJVR19EUk9QKHByaXYsICJEcm9wcGluZyAtIElOVkFMSUQgU1RBVElPTjogJXBNXG4iLAotCQkJCSAgICAgICBoZHItPmFkZHIxKTsKLQkJCWdvdG8gZHJvcF91bmxvY2s7Ci0JCX0KLQl9Ci0KLQlJV0xfREVCVUdfVFgocHJpdiwgInN0YXRpb24gSWQgJWRcbiIsIHN0YV9pZCk7Ci0KLQlpZiAoc3RhKQotCQlzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQotCWlmIChzdGFfcHJpdiAmJiBzdGFfcHJpdi0+YXNsZWVwICYmCi0JICAgIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfUE9MTF9SRVNQT05TRSkpIHsKLQkJLyoKLQkJICogVGhpcyBzZW5kcyBhbiBhc3luY2hyb25vdXMgY29tbWFuZCB0byB0aGUgZGV2aWNlLAotCQkgKiBidXQgd2UgY2FuIHJlbHkgb24gaXQgYmVpbmcgcHJvY2Vzc2VkIGJlZm9yZSB0aGUKLQkJICogbmV4dCBmcmFtZSBpcyBwcm9jZXNzZWQgLS0gYW5kIHRoZSBuZXh0IGZyYW1lIHRvCi0JCSAqIHRoaXMgc3RhdGlvbiBpcyB0aGUgb25lIHRoYXQgd2lsbCBjb25zdW1lIHRoaXMKLQkJICogY291bnRlci4KLQkJICogRm9yIG5vdyBzZXQgdGhlIGNvdW50ZXIgdG8ganVzdCAxIHNpbmNlIHdlIGRvIG5vdAotCQkgKiBzdXBwb3J0IHVBUFNEIHlldC4KLQkJICovCi0JCWl3bDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChwcml2LCBzdGFfaWQsIDEpOwotCX0KLQotCS8qCi0JICogU2VuZCB0aGlzIGZyYW1lIGFmdGVyIERUSU0gLS0gdGhlcmUncyBhIHNwZWNpYWwgcXVldWUKLQkgKiByZXNlcnZlZCBmb3IgdGhpcyBmb3IgY29udGV4dHMgdGhhdCBzdXBwb3J0IEFQIG1vZGUuCi0JICovCi0JaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9TRU5EX0FGVEVSX0RUSU0pIHsKLQkJdHhxX2lkID0gY3R4LT5tY2FzdF9xdWV1ZTsKLQkJLyoKLQkJICogVGhlIG1pY3JvY29kZSB3aWxsIGNsZWFyIHRoZSBtb3JlIGRhdGEKLQkJICogYml0IGluIHRoZSBsYXN0IGZyYW1lIGl0IHRyYW5zbWl0cy4KLQkJICovCi0JCWhkci0+ZnJhbWVfY29udHJvbCB8PQotCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfTU9SRURBVEEpOwotCX0gZWxzZQotCQl0eHFfaWQgPSBjdHgtPmFjX3RvX3F1ZXVlW3NrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpXTsKLQotCS8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZC9zYXZlZCBhYm92ZSB3aGVuIGxvY2tpbmcgcHJpdi0+bG9jayAqLwotCXNwaW5fbG9jaygmcHJpdi0+c3RhX2xvY2spOwotCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKLQkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKLQkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKLQkJaWYgKFdBUk5fT05fT05DRSh0aWQgPj0gTUFYX1RJRF9DT1VOVCkpIHsKLQkJCXNwaW5fdW5sb2NrKCZwcml2LT5zdGFfbG9jayk7Ci0JCQlnb3RvIGRyb3BfdW5sb2NrOwotCQl9Ci0JCXNlcV9udW1iZXIgPSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnNlcV9udW1iZXI7Ci0JCXNlcV9udW1iZXIgJj0gSUVFRTgwMjExX1NDVExfU0VROwotCQloZHItPnNlcV9jdHJsID0gaGRyLT5zZXFfY3RybCAmCi0JCQkJY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NDVExfRlJBRyk7Ci0JCWhkci0+c2VxX2N0cmwgfD0gY3B1X3RvX2xlMTYoc2VxX251bWJlcik7Ci0JCXNlcV9udW1iZXIgKz0gMHgxMDsKLQkJLyogYWdncmVnYXRpb24gaXMgb24gZm9yIHRoaXMgPHN0YSx0aWQ+ICovCi0JCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUgJiYKLQkJICAgIHByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID09IElXTF9BR0dfT04pIHsKLQkJCXR4cV9pZCA9IHByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnR4cV9pZDsKLQkJCWlzX2FnZyA9IHRydWU7Ci0JCX0KLQl9Ci0KLQl0eHEgPSAmcHJpdi0+dHhxW3R4cV9pZF07Ci0JcSA9ICZ0eHEtPnE7Ci0KLQlpZiAodW5saWtlbHkoaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyaykpIHsKLQkJc3Bpbl91bmxvY2soJnByaXYtPnN0YV9sb2NrKTsKLQkJZ290byBkcm9wX3VubG9jazsKLQl9Ci0KLQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSkgewotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnRmZHNfaW5fcXVldWUrKzsKLQkJaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhmYykpCi0JCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLnNlcV9udW1iZXIgPSBzZXFfbnVtYmVyOwotCX0KLQotCXNwaW5fdW5sb2NrKCZwcml2LT5zdGFfbG9jayk7Ci0KLQkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCi0JbWVtc2V0KCYodHhxLT50eGJbcS0+d3JpdGVfcHRyXSksIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3R4X2luZm8pKTsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLnNrYiA9IHNrYjsKLQl0eHEtPnR4YltxLT53cml0ZV9wdHJdLmN0eCA9IGN0eDsKLQotCS8qIFNldCB1cCBmaXJzdCBlbXB0eSBlbnRyeSBpbiBxdWV1ZSdzIGFycmF5IG9mIFR4L2NtZCBidWZmZXJzICovCi0Jb3V0X2NtZCA9IHR4cS0+Y21kW3EtPndyaXRlX3B0cl07Ci0Jb3V0X21ldGEgPSAmdHhxLT5tZXRhW3EtPndyaXRlX3B0cl07Ci0JdHhfY21kID0gJm91dF9jbWQtPmNtZC50eDsKLQltZW1zZXQoJm91dF9jbWQtPmhkciwgMCwgc2l6ZW9mKG91dF9jbWQtPmhkcikpOwotCW1lbXNldCh0eF9jbWQsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3R4X2NtZCkpOwotCi0JLyoKLQkgKiBTZXQgdXAgdGhlIFR4LWNvbW1hbmQgKG5vdCBNQUMhKSBoZWFkZXIuCi0JICogU3RvcmUgdGhlIGNob3NlbiBUeCBxdWV1ZSBhbmQgVEZEIGluZGV4IHdpdGhpbiB0aGUgc2VxdWVuY2UgZmllbGQ7Ci0JICogYWZ0ZXIgVHgsIHVDb2RlJ3MgVHggcmVzcG9uc2Ugd2lsbCByZXR1cm4gdGhpcyB2YWx1ZSBzbyBkcml2ZXIgY2FuCi0JICogbG9jYXRlIHRoZSBmcmFtZSB3aXRoaW4gdGhlIHR4IHF1ZXVlIGFuZCBkbyBwb3N0LXR4IHByb2Nlc3NpbmcuCi0JICovCi0Jb3V0X2NtZC0+aGRyLmNtZCA9IFJFUExZX1RYOwotCW91dF9jbWQtPmhkci5zZXF1ZW5jZSA9IGNwdV90b19sZTE2KCh1MTYpKFFVRVVFX1RPX1NFUSh0eHFfaWQpIHwKLQkJCQlJTkRFWF9UT19TRVEocS0+d3JpdGVfcHRyKSkpOwotCi0JLyogQ29weSBNQUMgaGVhZGVyIGZyb20gc2tiIGludG8gY29tbWFuZCBidWZmZXIgKi8KLQltZW1jcHkodHhfY21kLT5oZHIsIGhkciwgaGRyX2xlbik7Ci0KLQotCS8qIFRvdGFsICMgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8KLQlsZW4gPSAodTE2KXNrYi0+bGVuOwotCXR4X2NtZC0+bGVuID0gY3B1X3RvX2xlMTYobGVuKTsKLQotCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSkKLQkJaXdsNDk2NV90eF9jbWRfYnVpbGRfaHdjcnlwdG8ocHJpdiwgaW5mbywgdHhfY21kLCBza2IsIHN0YV9pZCk7Ci0KLQkvKiBUT0RPIG5lZWQgdGhpcyBmb3IgYnVyc3QgbW9kZSBsYXRlciBvbiAqLwotCWl3bDQ5NjVfdHhfY21kX2J1aWxkX2Jhc2ljKHByaXYsIHNrYiwgdHhfY21kLCBpbmZvLCBoZHIsIHN0YV9pZCk7Ci0JaXdsX2xlZ2FjeV9kYmdfbG9nX3R4X2RhdGFfZnJhbWUocHJpdiwgbGVuLCBoZHIpOwotCi0JaXdsNDk2NV90eF9jbWRfYnVpbGRfcmF0ZShwcml2LCB0eF9jbWQsIGluZm8sIGZjKTsKLQotCWl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzKHByaXYsIHRydWUsIGZjLCBsZW4pOwotCS8qCi0JICogVXNlIHRoZSBmaXJzdCBlbXB0eSBlbnRyeSBpbiB0aGlzIHF1ZXVlJ3MgY29tbWFuZCBidWZmZXIgYXJyYXkKLQkgKiB0byBjb250YWluIHRoZSBUeCBjb21tYW5kIGFuZCBNQUMgaGVhZGVyIGNvbmNhdGVuYXRlZCB0b2dldGhlcgotCSAqIChwYXlsb2FkIGRhdGEgd2lsbCBiZSBpbiBhbm90aGVyIGJ1ZmZlcikuCi0JICogU2l6ZSBvZiB0aGlzIHZhcmllcywgZHVlIHRvIHZhcnlpbmcgTUFDIGhlYWRlciBsZW5ndGguCi0JICogSWYgZW5kIGlzIG5vdCBkd29yZCBhbGlnbmVkLCB3ZSdsbCBoYXZlIDIgZXh0cmEgYnl0ZXMgYXQgdGhlIGVuZAotCSAqIG9mIHRoZSBNQUMgaGVhZGVyIChkZXZpY2UgcmVhZHMgb24gZHdvcmQgYm91bmRhcmllcykuCi0JICogV2UnbGwgdGVsbCBkZXZpY2UgYWJvdXQgdGhpcyBwYWRkaW5nIGxhdGVyLgotCSAqLwotCWxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX3R4X2NtZCkgKwotCQlzaXplb2Yoc3RydWN0IGl3bF9jbWRfaGVhZGVyKSArIGhkcl9sZW47Ci0JZmlyc3RsZW4gPSAobGVuICsgMykgJiB+MzsKLQotCS8qIFRlbGwgTklDIGFib3V0IGFueSAyLWJ5dGUgcGFkZGluZyBhZnRlciBNQUMgaGVhZGVyICovCi0JaWYgKGZpcnN0bGVuICE9IGxlbikKLQkJdHhfY21kLT50eF9mbGFncyB8PSBUWF9DTURfRkxHX01IX1BBRF9NU0s7Ci0KLQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgVHggY29tbWFuZCdzIGhlYWRlciAobm90IE1BQyBoZWFkZXIhKSwKLQkgKiB3aXRoaW4gY29tbWFuZCBidWZmZXIgYXJyYXkuICovCi0JdHhjbWRfcGh5cyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsCi0JCQkJICAgICZvdXRfY21kLT5oZHIsIGZpcnN0bGVuLAotCQkJCSAgICBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCWRtYV91bm1hcF9hZGRyX3NldChvdXRfbWV0YSwgbWFwcGluZywgdHhjbWRfcGh5cyk7Ci0JZG1hX3VubWFwX2xlbl9zZXQob3V0X21ldGEsIGxlbiwgZmlyc3RsZW4pOwotCS8qIEFkZCBidWZmZXIgY29udGFpbmluZyBUeCBjb21tYW5kIGFuZCBNQUMoISkgaGVhZGVyIHRvIFRGRCdzCi0JICogZmlyc3QgZW50cnkgKi8KLQlwcml2LT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQocHJpdiwgdHhxLAotCQkJCQkJICAgdHhjbWRfcGh5cywgZmlyc3RsZW4sIDEsIDApOwotCi0JaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXR4cS0+bmVlZF91cGRhdGUgPSAxOwotCX0gZWxzZSB7Ci0JCXdhaXRfd3JpdGVfcHRyID0gMTsKLQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7Ci0JfQotCi0JLyogU2V0IHVwIFRGRCdzIDJuZCBlbnRyeSB0byBwb2ludCBkaXJlY3RseSB0byByZW1haW5kZXIgb2Ygc2tiLAotCSAqIGlmIGFueSAoODAyLjExIG51bGwgZnJhbWVzIGhhdmUgbm8gcGF5bG9hZCkuICovCi0Jc2Vjb25kbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOwotCWlmIChzZWNvbmRsZW4gPiAwKSB7Ci0JCXBoeXNfYWRkciA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsIHNrYi0+ZGF0YSArIGhkcl9sZW4sCi0JCQkJCSAgIHNlY29uZGxlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChwcml2LCB0eHEsCi0JCQkJCQkJICAgcGh5c19hZGRyLCBzZWNvbmRsZW4sCi0JCQkJCQkJICAgMCwgMCk7Ci0JfQotCi0Jc2NyYXRjaF9waHlzID0gdHhjbWRfcGh5cyArIHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9oZWFkZXIpICsKLQkJCQlvZmZzZXRvZihzdHJ1Y3QgaXdsX3R4X2NtZCwgc2NyYXRjaCk7Ci0KLQkvKiB0YWtlIGJhY2sgb3duZXJzaGlwIG9mIERNQSBidWZmZXIgdG8gZW5hYmxlIHVwZGF0ZSAqLwotCXBjaV9kbWFfc3luY19zaW5nbGVfZm9yX2NwdShwcml2LT5wY2lfZGV2LCB0eGNtZF9waHlzLAotCQkJCSAgICBmaXJzdGxlbiwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQl0eF9jbWQtPmRyYW1fbHNiX3B0ciA9IGNwdV90b19sZTMyKHNjcmF0Y2hfcGh5cyk7Ci0JdHhfY21kLT5kcmFtX21zYl9wdHIgPSBpd2xfbGVnYWN5X2dldF9kbWFfaGlfYWRkcihzY3JhdGNoX3BoeXMpOwotCi0JSVdMX0RFQlVHX1RYKHByaXYsICJzZXF1ZW5jZSBuciA9IDBYJXhcbiIsCi0JCSAgICAgbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSk7Ci0JSVdMX0RFQlVHX1RYKHByaXYsICJ0eF9mbGFncyA9IDBYJXhcbiIsIGxlMzJfdG9fY3B1KHR4X2NtZC0+dHhfZmxhZ3MpKTsKLQlpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgSVdMX0RMX1RYLCAodTggKil0eF9jbWQsIHNpemVvZigqdHhfY21kKSk7Ci0JaXdsX3ByaW50X2hleF9kdW1wKHByaXYsIElXTF9ETF9UWCwgKHU4ICopdHhfY21kLT5oZHIsIGhkcl9sZW4pOwotCi0JLyogU2V0IHVwIGVudHJ5IGZvciB0aGlzIFRGRCBpbiBUeCBieXRlLWNvdW50IGFycmF5ICovCi0JaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX3VwZGF0ZV9ieXRlX2NudF90YmwocHJpdiwgdHhxLAotCQkJCQkJICAgICBsZTE2X3RvX2NwdSh0eF9jbWQtPmxlbikpOwotCi0JcGNpX2RtYV9zeW5jX3NpbmdsZV9mb3JfZGV2aWNlKHByaXYtPnBjaV9kZXYsIHR4Y21kX3BoeXMsCi0JCQkJICAgICAgIGZpcnN0bGVuLCBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X3R4KHByaXYsCi0JCQkgICAgICYoKHN0cnVjdCBpd2xfdGZkICopdHhxLT50ZmRzKVt0eHEtPnEud3JpdGVfcHRyXSwKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKSwKLQkJCSAgICAgJm91dF9jbWQtPmhkciwgZmlyc3RsZW4sCi0JCQkgICAgIHNrYi0+ZGF0YSArIGhkcl9sZW4sIHNlY29uZGxlbik7Ci0KLQkvKiBUZWxsIGRldmljZSB0aGUgd3JpdGUgaW5kZXggKmp1c3QgcGFzdCogdGhpcyBsYXRlc3QgZmlsbGVkIFRGRCAqLwotCXEtPndyaXRlX3B0ciA9IGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyLCBxLT5uX2JkKTsKLQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHR4cSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyoKLQkgKiBBdCB0aGlzIHBvaW50IHRoZSBmcmFtZSBpcyAidHJhbnNtaXR0ZWQiIHN1Y2Nlc3NmdWxseQotCSAqIGFuZCB3ZSB3aWxsIGdldCBhIFRYIHN0YXR1cyBub3RpZmljYXRpb24gZXZlbnR1YWxseSwKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiByZXQuICJyZXQiIG9ubHkgaW5kaWNhdGVzCi0JICogd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlci4KLQkgKi8KLQotCS8qCi0JICogQXZvaWQgYXRvbWljIG9wcyBpZiBpdCBpc24ndCBhbiBhc3NvY2lhdGVkIGNsaWVudC4KLQkgKiBBbHNvLCBpZiB0aGlzIGlzIGEgcGFja2V0IGZvciBhZ2dyZWdhdGlvbiwgZG9uJ3QKLQkgKiBpbmNyZWFzZSB0aGUgY291bnRlciBiZWNhdXNlIHRoZSB1Y29kZSB3aWxsIHN0b3AKLQkgKiBhZ2dyZWdhdGlvbiBxdWV1ZXMgd2hlbiB0aGVpciByZXNwZWN0aXZlIHN0YXRpb24KLQkgKiBnb2VzIHRvIHNsZWVwLgotCSAqLwotCWlmIChzdGFfcHJpdiAmJiBzdGFfcHJpdi0+Y2xpZW50ICYmICFpc19hZ2cpCi0JCWF0b21pY19pbmMoJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcyk7Ci0KLQlpZiAoKGl3bF9sZWdhY3lfcXVldWVfc3BhY2UocSkgPCBxLT5oaWdoX21hcmspICYmCi0JCQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKSB7Ci0JCWlmICh3YWl0X3dyaXRlX3B0cikgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJCXR4cS0+bmVlZF91cGRhdGUgPSAxOwotCQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCB0eHEpOwotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCQl9IGVsc2UgewotCQkJaXdsX2xlZ2FjeV9zdG9wX3F1ZXVlKHByaXYsIHR4cSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLQotZHJvcF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsNDk2NV9hbGxvY19kbWFfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9kbWFfcHRyICpwdHIsIHNpemVfdCBzaXplKQotewotCXB0ci0+YWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCBzaXplLCAmcHRyLT5kbWEsCi0JCQkJICAgICAgIEdGUF9LRVJORUwpOwotCWlmICghcHRyLT5hZGRyKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwdHItPnNpemUgPSBzaXplOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsNDk2NV9mcmVlX2RtYV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaXdsX2RtYV9wdHIgKnB0cikKLXsKLQlpZiAodW5saWtlbHkoIXB0ci0+YWRkcikpCi0JCXJldHVybjsKLQotCWRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wY2lfZGV2LT5kZXYsIHB0ci0+c2l6ZSwgcHRyLT5hZGRyLCBwdHItPmRtYSk7Ci0JbWVtc2V0KHB0ciwgMCwgc2l6ZW9mKCpwdHIpKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2h3X3R4cV9jdHhfZnJlZSAtIEZyZWUgVFhRIENvbnRleHQKLSAqCi0gKiBEZXN0cm95IGFsbCBUWCBETUEgcXVldWVzIGFuZCBzdHJ1Y3R1cmVzCi0gKi8KLXZvaWQgaXdsNDk2NV9od190eHFfY3R4X2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCB0eHFfaWQ7Ci0KLQkvKiBUeCBxdWV1ZXMgKi8KLQlpZiAocHJpdi0+dHhxKSB7Ci0JCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKLQkJCWlmICh0eHFfaWQgPT0gcHJpdi0+Y21kX3F1ZXVlKQotCQkJCWl3bF9sZWdhY3lfY21kX3F1ZXVlX2ZyZWUocHJpdik7Ci0JCQllbHNlCi0JCQkJaXdsX2xlZ2FjeV90eF9xdWV1ZV9mcmVlKHByaXYsIHR4cV9pZCk7Ci0JfQotCWl3bDQ5NjVfZnJlZV9kbWFfcHRyKHByaXYsICZwcml2LT5rdyk7Ci0KLQlpd2w0OTY1X2ZyZWVfZG1hX3B0cihwcml2LCAmcHJpdi0+c2NkX2JjX3RibHMpOwotCi0JLyogZnJlZSB0eCBxdWV1ZSBzdHJ1Y3R1cmUgKi8KLQlpd2xfbGVnYWN5X3R4cV9tZW0ocHJpdik7Ci19Ci0KLS8qKgotICogaXdsNDk2NV90eHFfY3R4X2FsbG9jIC0gYWxsb2NhdGUgVFggcXVldWUgY29udGV4dAotICogQWxsb2NhdGUgYWxsIFR4IERNQSBzdHJ1Y3R1cmVzIGFuZCBpbml0aWFsaXplIHRoZW0KLSAqCi0gKiBAcGFyYW0gcHJpdgotICogQHJldHVybiBlcnJvciBjb2RlCi0gKi8KLWludCBpd2w0OTY1X3R4cV9jdHhfYWxsb2Moc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQ7Ci0JaW50IHR4cV9pZCwgc2xvdHNfbnVtOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQkvKiBGcmVlIGFsbCB0eC9jbWQgcXVldWVzIGFuZCBrZWVwLXdhcm0gYnVmZmVyICovCi0JaXdsNDk2NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0KLQlyZXQgPSBpd2w0OTY1X2FsbG9jX2RtYV9wdHIocHJpdiwgJnByaXYtPnNjZF9iY190YmxzLAotCQkJCXByaXYtPmh3X3BhcmFtcy5zY2RfYmNfdGJsc19zaXplKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIlNjaGVkdWxlciBCQyBUYWJsZSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3JfYmNfdGJsczsKLQl9Ci0JLyogQWxsb2Mga2VlcC13YXJtIGJ1ZmZlciAqLwotCXJldCA9IGl3bDQ5NjVfYWxsb2NfZG1hX3B0cihwcml2LCAmcHJpdi0+a3csIElXTF9LV19TSVpFKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIktlZXAgV2FybSBhbGxvY2F0aW9uIGZhaWxlZFxuIik7Ci0JCWdvdG8gZXJyb3Jfa3c7Ci0JfQotCi0JLyogYWxsb2NhdGUgdHggcXVldWUgc3RydWN0dXJlICovCi0JcmV0ID0gaXdsX2xlZ2FjeV9hbGxvY190eHFfbWVtKHByaXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLwotCWl3bDQ5NjVfdHhxX3NldF9zY2hlZChwcml2LCAwKTsKLQotCS8qIFRlbGwgTklDIHdoZXJlIHRvIGZpbmQgdGhlICJrZWVwIHdhcm0iIGJ1ZmZlciAqLwotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkhfS1dfTUVNX0FERFJfUkVHLCBwcml2LT5rdy5kbWEgPj4gNCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBBbGxvYyBhbmQgaW5pdCBhbGwgVHggcXVldWVzLCBpbmNsdWRpbmcgdGhlIGNvbW1hbmQgcXVldWUgKCM0LyM5KSAqLwotCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykgewotCQlzbG90c19udW0gPSAodHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSkgPwotCQkJCQlURkRfQ01EX1NMT1RTIDogVEZEX1RYX0NNRF9TTE9UUzsKLQkJcmV0ID0gaXdsX2xlZ2FjeV90eF9xdWV1ZV9pbml0KHByaXYsCi0JCQkJCSZwcml2LT50eHFbdHhxX2lkXSwgc2xvdHNfbnVtLAotCQkJCSAgICAgICB0eHFfaWQpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJUeCAlZCBxdWV1ZSBpbml0IGZhaWxlZFxuIiwgdHhxX2lkKTsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotCi0gZXJyb3I6Ci0JaXdsNDk2NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0JaXdsNDk2NV9mcmVlX2RtYV9wdHIocHJpdiwgJnByaXYtPmt3KTsKLSBlcnJvcl9rdzoKLQlpd2w0OTY1X2ZyZWVfZG1hX3B0cihwcml2LCAmcHJpdi0+c2NkX2JjX3RibHMpOwotIGVycm9yX2JjX3RibHM6Ci0JcmV0dXJuIHJldDsKLX0KLQotdm9pZCBpd2w0OTY1X3R4cV9jdHhfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCB0eHFfaWQsIHNsb3RzX251bTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIFR1cm4gb2ZmIGFsbCBUeCBETUEgZmlmb3MgKi8KLQlpd2w0OTY1X3R4cV9zZXRfc2NoZWQocHJpdiwgMCk7Ci0KLQkvKiBUZWxsIE5JQyB3aGVyZSB0byBmaW5kIHRoZSAia2VlcCB3YXJtIiBidWZmZXIgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX0tXX01FTV9BRERSX1JFRywgcHJpdi0+a3cuZG1hID4+IDQpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWxsb2MgYW5kIGluaXQgYWxsIFR4IHF1ZXVlcywgaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlICgjNCkgKi8KLQlmb3IgKHR4cV9pZCA9IDA7IHR4cV9pZCA8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgdHhxX2lkKyspIHsKLQkJc2xvdHNfbnVtID0gdHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSA/Ci0JCQkgICAgVEZEX0NNRF9TTE9UUyA6IFRGRF9UWF9DTURfU0xPVFM7Ci0JCWl3bF9sZWdhY3lfdHhfcXVldWVfcmVzZXQocHJpdiwgJnByaXYtPnR4cVt0eHFfaWRdLAotCQkJCQkJc2xvdHNfbnVtLCB0eHFfaWQpOwotCX0KLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4cV9jdHhfc3RvcCAtIFN0b3AgYWxsIFR4IERNQSBjaGFubmVscwotICovCi12b2lkIGl3bDQ5NjVfdHhxX2N0eF9zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgY2gsIHR4cV9pZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogVHVybiBvZmYgYWxsIFR4IERNQSBmaWZvcyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpd2w0OTY1X3R4cV9zZXRfc2NoZWQocHJpdiwgMCk7Ci0KLQkvKiBTdG9wIGVhY2ggVHggRE1BIGNoYW5uZWwsIGFuZCB3YWl0IGZvciBpdCB0byBiZSBpZGxlICovCi0JZm9yIChjaCA9IDA7IGNoIDwgcHJpdi0+aHdfcGFyYW1zLmRtYV9jaG5sX251bTsgY2grKykgewotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsCi0JCQkJRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2gpLCAweDApOwotCQlpZiAoaXdsX3BvbGxfZGlyZWN0X2JpdChwcml2LCBGSF9UU1NSX1RYX1NUQVRVU19SRUcsCi0JCQkJICAgIEZIX1RTU1JfVFhfU1RBVFVTX1JFR19NU0tfQ0hOTF9JRExFKGNoKSwKLQkJCQkgICAgMTAwMCkpCi0JCQlJV0xfRVJSKHByaXYsICJGYWlsaW5nIG9uIHRpbWVvdXQgd2hpbGUgc3RvcHBpbmciCi0JCQkgICAgIiBETUEgY2hhbm5lbCAlZCBbMHglMDh4XSIsIGNoLAotCQkJICAgIGl3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LAotCQkJCQlGSF9UU1NSX1RYX1NUQVRVU19SRUcpKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCFwcml2LT50eHEpCi0JCXJldHVybjsKLQotCS8qIFVubWFwIERNQSBmcm9tIGhvc3Qgc3lzdGVtIGFuZCBmcmVlIHNrYidzICovCi0JZm9yICh0eHFfaWQgPSAwOyB0eHFfaWQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IHR4cV9pZCsrKQotCQlpZiAodHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSkKLQkJCWl3bF9sZWdhY3lfY21kX3F1ZXVlX3VubWFwKHByaXYpOwotCQllbHNlCi0JCQlpd2xfbGVnYWN5X3R4X3F1ZXVlX3VubWFwKHByaXYsIHR4cV9pZCk7Ci19Ci0KLS8qCi0gKiBGaW5kIGZpcnN0IGF2YWlsYWJsZSAobG93ZXN0IHVudXNlZCkgVHggUXVldWUsIG1hcmsgaXQgImFjdGl2ZSIuCi0gKiBDYWxsZWQgb25seSB3aGVuIGZpbmRpbmcgcXVldWUgZm9yIGFnZ3JlZ2F0aW9uLgotICogU2hvdWxkIG5ldmVyIHJldHVybiBhbnl0aGluZyA8IDcsIGJlY2F1c2UgdGhleSBzaG91bGQgYWxyZWFkeQotICogYmUgaW4gdXNlIGFzIEVEQ0EgQUMgKDAtMyksIENvbW1hbmQgKDQpLCByZXNlcnZlZCAoNSwgNikKLSAqLwotc3RhdGljIGludCBpd2w0OTY1X3R4cV9jdHhfYWN0aXZhdGVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHR4cV9pZDsKLQotCWZvciAodHhxX2lkID0gMDsgdHhxX2lkIDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyB0eHFfaWQrKykKLQkJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KHR4cV9pZCwgJnByaXYtPnR4cV9jdHhfYWN0aXZlX21zaykpCi0JCQlyZXR1cm4gdHhxX2lkOwotCXJldHVybiAtMTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4X3F1ZXVlX3N0b3Bfc2NoZWR1bGVyIC0gU3RvcCBxdWV1ZSwgYnV0IGtlZXAgY29uZmlndXJhdGlvbgotICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3R4X3F1ZXVlX3N0b3Bfc2NoZWR1bGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHUxNiB0eHFfaWQpCi17Ci0JLyogU2ltcGx5IHN0b3AgdGhlIHF1ZXVlLCBidXQgZG9uJ3QgY2hhbmdlIGFueSBjb25maWd1cmF0aW9uOwotCSAqIHRoZSBTQ0RfQUNUX0VOIGJpdCBpcyB0aGUgd3JpdGUtZW5hYmxlIG1hc2sgZm9yIHRoZSBBQ1RJVkUgYml0LiAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LAotCQlJV0w0OV9TQ0RfUVVFVUVfU1RBVFVTX0JJVFModHhxX2lkKSwKLQkJKDAgPDwgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19BQ1RJVkUpfAotCQkoMSA8PCBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ1RfRU4pKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4X3F1ZXVlX3NldF9xMnJhdGlkIC0gTWFwIHVuaXF1ZSByZWNlaXZlci90aWQgY29tYmluYXRpb24gdG8gYSBxdWV1ZQotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhfcXVldWVfc2V0X3EycmF0aWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgcmFfdGlkLAotCQkJCQl1MTYgdHhxX2lkKQotewotCXUzMiB0YmxfZHdfYWRkcjsKLQl1MzIgdGJsX2R3OwotCXUxNiBzY2RfcTJyYXRpZDsKLQotCXNjZF9xMnJhdGlkID0gcmFfdGlkICYgSVdMX1NDRF9RVUVVRV9SQV9USURfTUFQX1JBVElEX01TSzsKLQotCXRibF9kd19hZGRyID0gcHJpdi0+c2NkX2Jhc2VfYWRkciArCi0JCQlJV0w0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUodHhxX2lkKTsKLQotCXRibF9kdyA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCB0YmxfZHdfYWRkcik7Ci0KLQlpZiAodHhxX2lkICYgMHgxKQotCQl0YmxfZHcgPSAoc2NkX3EycmF0aWQgPDwgMTYpIHwgKHRibF9kdyAmIDB4MDAwMEZGRkYpOwotCWVsc2UKLQkJdGJsX2R3ID0gc2NkX3EycmF0aWQgfCAodGJsX2R3ICYgMHhGRkZGMDAwMCk7Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsIHRibF9kd19hZGRyLCB0YmxfZHcpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsNDk2NV90eF9xdWV1ZV9hZ2dfZW5hYmxlIC0gU2V0IHVwICYgZW5hYmxlIGFnZ3JlZ2F0aW9uIGZvciBzZWxlY3RlZCBxdWV1ZQotICoKLSAqIE5PVEU6ICB0eHFfaWQgbXVzdCBiZSBncmVhdGVyIHRoYW4gSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUsCi0gKiAgICAgICAgaS5lLiBpdCBtdXN0IGJlIG9uZSBvZiB0aGUgaGlnaGVyIHF1ZXVlcyB1c2VkIGZvciBhZ2dyZWdhdGlvbgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhxX2FnZ19lbmFibGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkLAotCQkJCSAgaW50IHR4X2ZpZm8sIGludCBzdGFfaWQsIGludCB0aWQsIHUxNiBzc25faWR4KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTE2IHJhX3RpZDsKLQlpbnQgcmV0OwotCi0JaWYgKChJV0w0OV9GSVJTVF9BTVBEVV9RVUVVRSA+IHR4cV9pZCkgfHwKLQkgICAgKElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFICsKLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlcyA8PSB0eHFfaWQpKSB7Ci0JCUlXTF9XQVJOKHByaXYsCi0JCQkicXVldWUgbnVtYmVyIG91dCBvZiByYW5nZTogJWQsIG11c3QgYmUgJWQgdG8gJWRcbiIsCi0JCQl0eHFfaWQsIElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFLAotCQkJSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUgKwotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX2FtcGR1X3F1ZXVlcyAtIDEpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyYV90aWQgPSBCVUlMRF9SQXhUSUQoc3RhX2lkLCB0aWQpOwotCi0JLyogTW9kaWZ5IGRldmljZSdzIHN0YXRpb24gdGFibGUgdG8gVHggdGhpcyBUSUQgKi8KLQlyZXQgPSBpd2w0OTY1X3N0YV90eF9tb2RpZnlfZW5hYmxlX3RpZChwcml2LCBzdGFfaWQsIHRpZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBTdG9wIHRoaXMgVHggcXVldWUgYmVmb3JlIGNvbmZpZ3VyaW5nIGl0ICovCi0JaXdsNDk2NV90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcihwcml2LCB0eHFfaWQpOwotCi0JLyogTWFwIHJlY2VpdmVyLWFkZHJlc3MgLyB0cmFmZmljLUlEIHRvIHRoaXMgcXVldWUgKi8KLQlpd2w0OTY1X3R4X3F1ZXVlX3NldF9xMnJhdGlkKHByaXYsIHJhX3RpZCwgdHhxX2lkKTsKLQotCS8qIFNldCB0aGlzIHF1ZXVlIGFzIGEgY2hhaW4tYnVpbGRpbmcgcXVldWUgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXRzX3BycGgocHJpdiwgSVdMNDlfU0NEX1FVRVVFQ0hBSU5fU0VMLCAoMSA8PCB0eHFfaWQpKTsKLQotCS8qIFBsYWNlIGZpcnN0IFRGRCBhdCBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHN0YXJ0IHNlcXVlbmNlIG51bWJlci4KLQkgKiBBc3N1bWVzIHRoYXQgc3NuX2lkeCBpcyB2YWxpZCAoIT0gMHhGRkYpICovCi0JcHJpdi0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0ciA9IChzc25faWR4ICYgMHhmZik7Ci0JcHJpdi0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOwotCWl3bDQ5NjVfc2V0X3dyX3B0cnMocHJpdiwgdHhxX2lkLCBzc25faWR4KTsKLQotCS8qIFNldCB1cCBUeCB3aW5kb3cgc2l6ZSBhbmQgZnJhbWUgbGltaXQgZm9yIHRoaXMgcXVldWUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsCi0JCXByaXYtPnNjZF9iYXNlX2FkZHIgKyBJV0w0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQodHhxX2lkKSwKLQkJKFNDRF9XSU5fU0laRSA8PCBJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzFfV0lOX1NJWkVfUE9TKSAmCi0JCUlXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9NU0spOwotCi0JaXdsX2xlZ2FjeV93cml0ZV90YXJnX21lbShwcml2LCBwcml2LT5zY2RfYmFzZV9hZGRyICsKLQkJSVdMNDlfU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKHR4cV9pZCkgKyBzaXplb2YodTMyKSwKLQkJKFNDRF9GUkFNRV9MSU1JVCA8PCBJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfUE9TKQotCQkmIElXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9NU0spOwotCi0JaXdsX2xlZ2FjeV9zZXRfYml0c19wcnBoKHByaXYsIElXTDQ5X1NDRF9JTlRFUlJVUFRfTUFTSywgKDEgPDwgdHhxX2lkKSk7Ci0KLQkvKiBTZXQgdXAgU3RhdHVzIGFyZWEgaW4gU1JBTSwgbWFwIHRvIFR4IERNQS9GSUZPLCBhY3RpdmF0ZSB0aGUgcXVldWUgKi8KLQlpd2w0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMocHJpdiwgJnByaXYtPnR4cVt0eHFfaWRdLCB0eF9maWZvLCAxKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0KLWludCBpd2w0OTY1X3R4X2FnZ19zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbikKLXsKLQlpbnQgc3RhX2lkOwotCWludCB0eF9maWZvOwotCWludCB0eHFfaWQ7Ci0JaW50IHJldDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwotCi0JdHhfZmlmbyA9IGl3bDQ5NjVfZ2V0X2ZpZm9fZnJvbV90aWQoaXdsX2xlZ2FjeV9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLCB0aWQpOwotCWlmICh1bmxpa2VseSh0eF9maWZvIDwgMCkpCi0JCXJldHVybiB0eF9maWZvOwotCi0JSVdMX1dBUk4ocHJpdiwgIiVzIG9uIHJhID0gJXBNIHRpZCA9ICVkXG4iLAotCQkJX19mdW5jX18sIHN0YS0+YWRkciwgdGlkKTsKLQotCXN0YV9pZCA9IGl3bF9sZWdhY3lfc3RhX2lkKHN0YSk7Ci0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlN0YXJ0IEFHRyBvbiBpbnZhbGlkIHN0YXRpb25cbiIpOwotCQlyZXR1cm4gLUVOWElPOwotCX0KLQlpZiAodW5saWtlbHkodGlkID49IE1BWF9USURfQ09VTlQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSAhPSBJV0xfQUdHX09GRikgewotCQlJV0xfRVJSKHByaXYsICJTdGFydCBBR0cgd2hlbiBzdGF0ZSBpcyBub3QgSVdMX0FHR19PRkYgIVxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0JdHhxX2lkID0gaXdsNDk2NV90eHFfY3R4X2FjdGl2YXRlX2ZyZWUocHJpdik7Ci0JaWYgKHR4cV9pZCA9PSAtMSkgewotCQlJV0xfRVJSKHByaXYsICJObyBmcmVlIGFnZ3JlZ2F0aW9uIHF1ZXVlIGF2YWlsYWJsZVxuIik7Ci0JCXJldHVybiAtRU5YSU87Ci0JfQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JdGlkX2RhdGEgPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKLQkqc3NuID0gU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKTsKLQl0aWRfZGF0YS0+YWdnLnR4cV9pZCA9IHR4cV9pZDsKLQlpd2xfbGVnYWN5X3NldF9zd3FfaWQoJnByaXYtPnR4cVt0eHFfaWRdLAotCQkJCWl3bDQ5NjVfZ2V0X2FjX2Zyb21fdGlkKHRpZCksIHR4cV9pZCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXJldCA9IGl3bDQ5NjVfdHhxX2FnZ19lbmFibGUocHJpdiwgdHhxX2lkLCB0eF9maWZvLAotCQkJCQkJICBzdGFfaWQsIHRpZCwgKnNzbik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXRpZF9kYXRhID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07Ci0JaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJIVyBxdWV1ZSBpcyBlbXB0eVxuIik7Ci0JCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJV0xfQUdHX09OOwotCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfSFQocHJpdiwKLQkJCSJIVyBxdWV1ZSBpcyBOT1QgZW1wdHk6ICVkIHBhY2tldHMgaW4gSFcgcXVldWVcbiIsCi0JCQkgICAgIHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlKTsKLQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gcmV0OwotfQotCi0vKioKLSAqIHR4cV9pZCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBJV0w0OV9GSVJTVF9BTVBEVV9RVUVVRQotICogcHJpdi0+bG9jayBtdXN0IGJlIGhlbGQgYnkgdGhlIGNhbGxlcgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhxX2FnZ19kaXNhYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IHR4cV9pZCwKLQkJCQkgICB1MTYgc3NuX2lkeCwgdTggdHhfZmlmbykKLXsKLQlpZiAoKElXTDQ5X0ZJUlNUX0FNUERVX1FVRVVFID4gdHhxX2lkKSB8fAotCSAgICAoSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUgKwotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIDw9IHR4cV9pZCkpIHsKLQkJSVdMX1dBUk4ocHJpdiwKLQkJCSJxdWV1ZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlZCwgbXVzdCBiZSAlZCB0byAlZFxuIiwKLQkJCXR4cV9pZCwgSVdMNDlfRklSU1RfQU1QRFVfUVVFVUUsCi0JCQlJV0w0OV9GSVJTVF9BTVBEVV9RVUVVRSArCi0JCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzIC0gMSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWl3bDQ5NjVfdHhfcXVldWVfc3RvcF9zY2hlZHVsZXIocHJpdiwgdHhxX2lkKTsKLQotCWl3bF9sZWdhY3lfY2xlYXJfYml0c19wcnBoKHByaXYsCi0JCQlJV0w0OV9TQ0RfUVVFVUVDSEFJTl9TRUwsICgxIDw8IHR4cV9pZCkpOwotCi0JcHJpdi0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0ciA9IChzc25faWR4ICYgMHhmZik7Ci0JcHJpdi0+dHhxW3R4cV9pZF0ucS53cml0ZV9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOwotCS8qIHN1cHBvc2VzIHRoYXQgc3NuX2lkeCBpcyB2YWxpZCAoIT0gMHhGRkYpICovCi0JaXdsNDk2NV9zZXRfd3JfcHRycyhwcml2LCB0eHFfaWQsIHNzbl9pZHgpOwotCi0JaXdsX2xlZ2FjeV9jbGVhcl9iaXRzX3BycGgocHJpdiwKLQkJCSBJV0w0OV9TQ0RfSU5URVJSVVBUX01BU0ssICgxIDw8IHR4cV9pZCkpOwotCWl3bF90eHFfY3R4X2RlYWN0aXZhdGUocHJpdiwgdHhxX2lkKTsKLQlpd2w0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMocHJpdiwgJnByaXYtPnR4cVt0eHFfaWRdLCB0eF9maWZvLCAwKTsKLQotCXJldHVybiAwOwotfQotCi1pbnQgaXdsNDk2NV90eF9hZ2dfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkKQotewotCWludCB0eF9maWZvX2lkLCB0eHFfaWQsIHN0YV9pZCwgc3NuOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwotCWludCB3cml0ZV9wdHIsIHJlYWRfcHRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl0eF9maWZvX2lkID0gaXdsNDk2NV9nZXRfZmlmb19mcm9tX3RpZChpd2xfbGVnYWN5X3J4b25fY3R4X2Zyb21fdmlmKHZpZiksIHRpZCk7Ci0JaWYgKHVubGlrZWx5KHR4X2ZpZm9faWQgPCAwKSkKLQkJcmV0dXJuIHR4X2ZpZm9faWQ7Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZChzdGEpOwotCi0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgc3RhdGlvbiBmb3IgQUdHIHRpZCAlZFxuIiwgdGlkKTsKLQkJcmV0dXJuIC1FTlhJTzsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXRpZF9kYXRhID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF07Ci0Jc3NuID0gKHRpZF9kYXRhLT5zZXFfbnVtYmVyICYgSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0OwotCXR4cV9pZCA9IHRpZF9kYXRhLT5hZ2cudHhxX2lkOwotCi0Jc3dpdGNoIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSkgewotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOgotCQkvKgotCQkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHBlZXIgc3RvcHMgYWdncmVnYXRpb24KLQkJICogYWdhaW4gYmVmb3JlIHdlJ3ZlIGhhZCBhIGNoYW5jZSB0byBkcmFpbiB0aGUKLQkJICogcXVldWUgd2Ugc2VsZWN0ZWQgcHJldmlvdXNseSwgaS5lLiBiZWZvcmUgdGhlCi0JCSAqIHNlc3Npb24gd2FzIHJlYWxseSBzdGFydGVkIGNvbXBsZXRlbHkuCi0JCSAqLwotCQlJV0xfREVCVUdfSFQocHJpdiwgIkFHRyBzdG9wIGJlZm9yZSBzZXR1cCBkb25lXG4iKTsKLQkJZ290byB0dXJuX29mZjsKLQljYXNlIElXTF9BR0dfT046Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9XQVJOKHByaXYsICJTdG9wcGluZyBBR0cgd2hpbGUgc3RhdGUgbm90IE9OIG9yIHN0YXJ0aW5nXG4iKTsKLQl9Ci0KLQl3cml0ZV9wdHIgPSBwcml2LT50eHFbdHhxX2lkXS5xLndyaXRlX3B0cjsKLQlyZWFkX3B0ciA9IHByaXYtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHI7Ci0KLQkvKiBUaGUgcXVldWUgaXMgbm90IGVtcHR5ICovCi0JaWYgKHdyaXRlX3B0ciAhPSByZWFkX3B0cikgewotCQlJV0xfREVCVUdfSFQocHJpdiwgIlN0b3BwaW5nIGEgbm9uIGVtcHR5IEFHRyBIVyBRVUVVRVxuIik7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID0KLQkJCQlJV0xfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQotCUlXTF9ERUJVR19IVChwcml2LCAiSFcgcXVldWUgaXMgZW1wdHlcbiIpOwotIHR1cm5fb2ZmOgotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnLnN0YXRlID0gSVdMX0FHR19PRkY7Ci0KLQkvKiBkbyBub3QgcmVzdG9yZS9zYXZlIGlycXMgKi8KLQlzcGluX3VubG9jaygmcHJpdi0+c3RhX2xvY2spOwotCXNwaW5fbG9jaygmcHJpdi0+bG9jayk7Ci0KLQkvKgotCSAqIHRoZSBvbmx5IHJlYXNvbiB0aGlzIGNhbGwgY2FuIGZhaWwgaXMgcXVldWUgbnVtYmVyIG91dCBvZiByYW5nZSwKLQkgKiB3aGljaCBjYW4gaGFwcGVuIGlmIHVDb2RlIGlzIHJlbG9hZGVkIGFuZCBhbGwgdGhlIHN0YXRpb24KLQkgKiBpbmZvcm1hdGlvbiBhcmUgbG9zdC4gaWYgaXQgaXMgb3V0c2lkZSB0aGUgcmFuZ2UsIHRoZXJlIGlzIG5vIG5lZWQKLQkgKiB0byBkZWFjdGl2YXRlIHRoZSB1Q29kZSBxdWV1ZSwganVzdCByZXR1cm4gInN1Y2Nlc3MiIHRvIGFsbG93Ci0JICogIG1hYzgwMjExIHRvIGNsZWFuIHVwIGl0IG93biBkYXRhLgotCSAqLwotCWl3bDQ5NjVfdHhxX2FnZ19kaXNhYmxlKHByaXYsIHR4cV9pZCwgc3NuLCB0eF9maWZvX2lkKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgc3RhLT5hZGRyLCB0aWQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2w0OTY1X3R4cV9jaGVja19lbXB0eShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICBpbnQgc3RhX2lkLCB1OCB0aWQsIGludCB0eHFfaWQpCi17Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZwcml2LT50eHFbdHhxX2lkXS5xOwotCXU4ICphZGRyID0gcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHI7Ci0Jc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGEgPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS50aWRbdGlkXTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCi0JY3R4ID0gJnByaXYtPmNvbnRleHRzW3ByaXYtPnN0YXRpb25zW3N0YV9pZF0uY3R4aWRdOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+c3RhX2xvY2spOwotCi0Jc3dpdGNoIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZy5zdGF0ZSkgewotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOgotCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlICovCi0JCS8qIGFnZ3JlZ2F0ZWQgSFcgcXVldWUgKi8KLQkJaWYgKCh0eHFfaWQgID09IHRpZF9kYXRhLT5hZ2cudHhxX2lkKSAmJgotCQkgICAgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikpIHsKLQkJCXUxNiBzc24gPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOwotCQkJaW50IHR4X2ZpZm8gPSBpd2w0OTY1X2dldF9maWZvX2Zyb21fdGlkKGN0eCwgdGlkKTsKLQkJCUlXTF9ERUJVR19IVChwcml2LAotCQkJCSJIVyBxdWV1ZSBlbXB0eTogY29udGludWUgREVMQkEgZmxvd1xuIik7Ci0JCQlpd2w0OTY1X3R4cV9hZ2dfZGlzYWJsZShwcml2LCB0eHFfaWQsIHNzbiwgdHhfZmlmbyk7Ci0JCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0FHR19PRkY7Ci0JCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKGN0eC0+dmlmLCBhZGRyLCB0aWQpOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOgotCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlIHF1ZXVlICovCi0JCWlmICh0aWRfZGF0YS0+dGZkc19pbl9xdWV1ZSA9PSAwKSB7Ci0JCQlJV0xfREVCVUdfSFQocHJpdiwKLQkJCQkiSFcgcXVldWUgZW1wdHk6IGNvbnRpbnVlIEFEREJBIGZsb3dcbiIpOwotCQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfT047Ci0JCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZShjdHgtPnZpZiwgYWRkciwgdGlkKTsKLQkJfQotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9ub25fYWdnX3R4X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJCSAgICAgY29uc3QgdTggKmFkZHIxKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2OwotCi0JcmN1X3JlYWRfbG9jaygpOwotCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YShjdHgtPnZpZiwgYWRkcjEpOwotCWlmIChzdGEpIHsKLQkJc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0JCS8qIGF2b2lkIGF0b21pYyBvcHMgaWYgdGhpcyBpc24ndCBhIGNsaWVudCAqLwotCQlpZiAoc3RhX3ByaXYtPmNsaWVudCAmJgotCQkgICAgYXRvbWljX2RlY19yZXR1cm4oJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcykgPT0gMCkKLQkJCWllZWU4MDIxMV9zdGFfYmxvY2tfYXdha2UocHJpdi0+aHcsIHN0YSwgZmFsc2UpOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQotc3RhdGljIHZvaWQKLWl3bDQ5NjVfdHhfc3RhdHVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9pbmZvICp0eF9pbmZvLAotCQkJICAgICBib29sIGlzX2FnZykKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHR4X2luZm8tPnNrYi0+ZGF0YTsKLQotCWlmICghaXNfYWdnKQotCQlpd2w0OTY1X25vbl9hZ2dfdHhfc3RhdHVzKHByaXYsIHR4X2luZm8tPmN0eCwgaGRyLT5hZGRyMSk7Ci0KLQlpZWVlODAyMTFfdHhfc3RhdHVzX2lycXNhZmUocHJpdi0+aHcsIHR4X2luZm8tPnNrYik7Ci19Ci0KLWludCBpd2w0OTY1X3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkLCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCXN0cnVjdCBpd2xfdHhfaW5mbyAqdHhfaW5mbzsKLQlpbnQgbmZyZWVkID0gMDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwotCi0JaWYgKChpbmRleCA+PSBxLT5uX2JkKSB8fCAoaXdsX2xlZ2FjeV9xdWV1ZV91c2VkKHEsIGluZGV4KSA9PSAwKSkgewotCQlJV0xfRVJSKHByaXYsICJSZWFkIGluZGV4IGZvciBETUEgcXVldWUgdHhxIGlkICglZCksIGluZGV4ICVkLCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkLlxuIiwgdHhxX2lkLAotCQkJICBpbmRleCwgcS0+bl9iZCwgcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaW5kZXggPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKGluZGV4LCBxLT5uX2JkKTsKLQkgICAgIHEtPnJlYWRfcHRyICE9IGluZGV4OwotCSAgICAgcS0+cmVhZF9wdHIgPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgewotCi0JCXR4X2luZm8gPSAmdHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXTsKLQotCQlpZiAoV0FSTl9PTl9PTkNFKHR4X2luZm8tPnNrYiA9PSBOVUxMKSkKLQkJCWNvbnRpbnVlOwotCi0JCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXR4X2luZm8tPnNrYi0+ZGF0YTsKLQkJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJbmZyZWVkKys7Ci0KLQkJaXdsNDk2NV90eF9zdGF0dXMocHJpdiwgdHhfaW5mbywKLQkJCQkgdHhxX2lkID49IElXTDQ5NjVfRklSU1RfQU1QRFVfUVVFVUUpOwotCQl0eF9pbmZvLT5za2IgPSBOVUxMOwotCi0JCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9mcmVlX3RmZChwcml2LCB0eHEpOwotCX0KLQlyZXR1cm4gbmZyZWVkOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEgLSBVcGRhdGUgdHggc3RhdHVzIGZyb20gYmxvY2stYWNrCi0gKgotICogR28gdGhyb3VnaCBibG9jay1hY2sncyBiaXRtYXAgb2YgQUNLJ2QgZnJhbWVzLCB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mCi0gKiBBQ0sgdnMuIG5vdC4gIFRoaXMgZ2V0cyBzZW50IHRvIG1hYzgwMjExLCB0aGVuIHRvIHJhdGUgc2NhbGluZyBhbGdvLgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X2NvbXByZXNzZWRfYmEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnLAotCQkJCSBzdHJ1Y3QgaXdsX2NvbXByZXNzZWRfYmFfcmVzcCAqYmFfcmVzcCkKLQotewotCWludCBpLCBzaCwgYWNrOwotCXUxNiBzZXFfY3RsID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2VxX2N0bCk7Ci0JdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOwotCWludCBzdWNjZXNzZXMgPSAwOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKLQl1NjQgYml0bWFwLCBzZW50X2JpdG1hcDsKLQotCWlmICh1bmxpa2VseSghYWdnLT53YWl0X2Zvcl9iYSkpICB7Ci0JCWlmICh1bmxpa2VseShiYV9yZXNwLT5iaXRtYXApKQotCQkJSVdMX0VSUihwcml2LCAiUmVjZWl2ZWQgQkEgd2hlbiBub3QgZXhwZWN0ZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKiBNYXJrIHRoYXQgdGhlIGV4cGVjdGVkIGJsb2NrLWFjayByZXNwb25zZSBhcnJpdmVkICovCi0JYWdnLT53YWl0X2Zvcl9iYSA9IDA7Ci0JSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJCQSAlZCAlZFxuIiwgYWdnLT5zdGFydF9pZHgsCi0JCQkJCQkJYmFfcmVzcC0+c2VxX2N0bCk7Ci0KLQkvKiBDYWxjdWxhdGUgc2hpZnQgdG8gYWxpZ24gYmxvY2stYWNrIGJpdHMgd2l0aCBvdXIgVHggd2luZG93IGJpdHMgKi8KLQlzaCA9IGFnZy0+c3RhcnRfaWR4IC0gU0VRX1RPX0lOREVYKHNlcV9jdGwgPj4gNCk7Ci0JaWYgKHNoIDwgMCkgLyogdGJ3IHNvbWV0aGluZyBpcyB3cm9uZyB3aXRoIGluZGljZXMgKi8KLQkJc2ggKz0gMHgxMDA7Ci0KLQlpZiAoYWdnLT5mcmFtZV9jb3VudCA+ICg2NCAtIHNoKSkgewotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIm1vcmUgZnJhbWVzIHRoYW4gYml0bWFwIHNpemUiKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qIGRvbid0IHVzZSA2NC1iaXQgdmFsdWVzIGZvciBub3cgKi8KLQliaXRtYXAgPSBsZTY0X3RvX2NwdShiYV9yZXNwLT5iaXRtYXApID4+IHNoOwotCi0JLyogY2hlY2sgZm9yIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhY2NvcmRpbmcgdG8gdGhlCi0JICogdHJhbnNtaXR0ZWQgYml0bWFwIGFuZCBibG9jay1hY2sgYml0bWFwICovCi0Jc2VudF9iaXRtYXAgPSBiaXRtYXAgJiBhZ2ctPmJpdG1hcDsKLQotCS8qIEZvciBlYWNoIGZyYW1lIGF0dGVtcHRlZCBpbiBhZ2dyZWdhdGlvbiwKLQkgKiB1cGRhdGUgZHJpdmVyJ3MgcmVjb3JkIG9mIHR4IGZyYW1lJ3Mgc3RhdHVzLiAqLwotCWkgPSAwOwotCXdoaWxlIChzZW50X2JpdG1hcCkgewotCQlhY2sgPSBzZW50X2JpdG1hcCAmIDFVTEw7Ci0JCXN1Y2Nlc3NlcyArPSBhY2s7Ci0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiJXMgT04gaT0lZCBpZHg9JWQgcmF3PSVkXG4iLAotCQkJYWNrID8gIkFDSyIgOiAiTkFDSyIsIGksCi0JCQkoYWdnLT5zdGFydF9pZHggKyBpKSAmIDB4ZmYsCi0JCQlhZ2ctPnN0YXJ0X2lkeCArIGkpOwotCQlzZW50X2JpdG1hcCA+Pj0gMTsKLQkJKytpOwotCX0KLQotCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiQml0bWFwICVsbHhcbiIsCi0JCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRtYXApOwotCi0JaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IocHJpdi0+dHhxW3NjZF9mbG93XS50eGJbYWdnLT5zdGFydF9pZHhdLnNrYik7Ci0JbWVtc2V0KCZpbmZvLT5zdGF0dXMsIDAsIHNpemVvZihpbmZvLT5zdGF0dXMpKTsKLQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7Ci0JaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQU1QRFU7Ci0JaW5mby0+c3RhdHVzLmFtcGR1X2Fja19sZW4gPSBzdWNjZXNzZXM7Ci0JaW5mby0+c3RhdHVzLmFtcGR1X2xlbiA9IGFnZy0+ZnJhbWVfY291bnQ7Ci0JaXdsNDk2NV9od3JhdGVfdG9fdHhfY29udHJvbChwcml2LCBhZ2ctPnJhdGVfbl9mbGFncywgaW5mbyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiB0cmFuc2xhdGUgdWNvZGUgcmVzcG9uc2UgdG8gbWFjODAyMTEgdHggc3RhdHVzIGNvbnRyb2wgdmFsdWVzCi0gKi8KLXZvaWQgaXdsNDk2NV9od3JhdGVfdG9fdHhfY29udHJvbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByYXRlX25fZmxhZ3MsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8pCi17Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9yYXRlICpyID0gJmluZm8tPmNvbnRyb2wucmF0ZXNbMF07Ci0KLQlpbmZvLT5hbnRlbm5hX3NlbF90eCA9Ci0JCSgocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfQU5UX0FCQ19NU0spID4+IFJBVEVfTUNTX0FOVF9QT1MpOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVF9NU0spCi0JCXItPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9SQ19NQ1M7Ci0JaWYgKHJhdGVfbl9mbGFncyAmIFJBVEVfTUNTX0dGX01TSykKLQkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX0dSRUVOX0ZJRUxEOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19IVDQwX01TSykKLQkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsKLQlpZiAocmF0ZV9uX2ZsYWdzICYgUkFURV9NQ1NfRFVQX01TSykKLQkJci0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1JDX0RVUF9EQVRBOwotCWlmIChyYXRlX25fZmxhZ3MgJiBSQVRFX01DU19TR0lfTVNLKQotCQlyLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0k7Ci0Jci0+aWR4ID0gaXdsNDk2NV9od3JhdGVfdG9fbWFjODAyMTFfaWR4KHJhdGVfbl9mbGFncywgaW5mby0+YmFuZCk7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9yeF9yZXBseV9jb21wcmVzc2VkX2JhIC0gSGFuZGxlciBmb3IgUkVQTFlfQ09NUFJFU1NFRF9CQQotICoKLSAqIEhhbmRsZXMgYmxvY2stYWNrbm93bGVkZ2Ugbm90aWZpY2F0aW9uIGZyb20gZGV2aWNlLCB3aGljaCByZXBvcnRzIHN1Y2Nlc3MKLSAqIG9mIGZyYW1lcyBzZW50IHZpYSBhZ2dyZWdhdGlvbi4KLSAqLwotdm9pZCBpd2w0OTY1X3J4X3JlcGx5X2NvbXByZXNzZWRfYmEoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX2NvbXByZXNzZWRfYmFfcmVzcCAqYmFfcmVzcCA9ICZwa3QtPnUuY29tcHJlc3NlZF9iYTsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSBOVUxMOwotCXN0cnVjdCBpd2xfaHRfYWdnICphZ2c7Ci0JaW50IGluZGV4OwotCWludCBzdGFfaWQ7Ci0JaW50IHRpZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JLyogImZsb3ciIGNvcnJlc3BvbmRzIHRvIFR4IHF1ZXVlICovCi0JdTE2IHNjZF9mbG93ID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX2Zsb3cpOwotCi0JLyogInNzbiIgaXMgc3RhcnQgb2YgYmxvY2stYWNrIFR4IHdpbmRvdywgY29ycmVzcG9uZHMgdG8gaW5kZXgKLQkgKiAoaW4gVHggcXVldWUncyBjaXJjdWxhciBidWZmZXIpIG9mIGZpcnN0IFRGRC9mcmFtZSBpbiB3aW5kb3cgKi8KLQl1MTYgYmFfcmVzcF9zY2Rfc3NuID0gbGUxNl90b19jcHUoYmFfcmVzcC0+c2NkX3Nzbik7Ci0KLQlpZiAoc2NkX2Zsb3cgPj0gcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtKSB7Ci0JCUlXTF9FUlIocHJpdiwKLQkJCSJCVUdfT04gc2NkX2Zsb3cgaXMgYmlnZ2VyIHRoYW4gbnVtYmVyIG9mIHF1ZXVlc1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQl0eHEgPSAmcHJpdi0+dHhxW3NjZF9mbG93XTsKLQlzdGFfaWQgPSBiYV9yZXNwLT5zdGFfaWQ7Ci0JdGlkID0gYmFfcmVzcC0+dGlkOwotCWFnZyA9ICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnRpZFt0aWRdLmFnZzsKLQlpZiAodW5saWtlbHkoYWdnLT50eHFfaWQgIT0gc2NkX2Zsb3cpKSB7Ci0JCS8qCi0JCSAqIEZJWE1FOiB0aGlzIGlzIGEgdUNvZGUgYnVnIHdoaWNoIG5lZWQgdG8gYmUgYWRkcmVzc2VkLAotCQkgKiBsb2cgdGhlIGluZm9ybWF0aW9uIGFuZCByZXR1cm4gZm9yIG5vdyEKLQkJICogc2luY2UgaXQgaXMgcG9zc2libGUgaGFwcGVuIHZlcnkgb2Z0ZW4gYW5kIGluIG9yZGVyCi0JCSAqIG5vdCB0byBmaWxsIHRoZSBzeXNsb2csIGRvbid0IGVuYWJsZSB0aGUgbG9nZ2luZyBieSBkZWZhdWx0Ci0JCSAqLwotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwKLQkJCSJCQSBzY2RfZmxvdyAlZCBkb2VzIG5vdCBtYXRjaCB0eHFfaWQgJWRcbiIsCi0JCQlzY2RfZmxvdywgYWdnLT50eHFfaWQpOwotCQlyZXR1cm47Ci0JfQotCi0JLyogRmluZCBpbmRleCBqdXN0IGJlZm9yZSBibG9jay1hY2sgd2luZG93ICovCi0JaW5kZXggPSBpd2xfbGVnYWN5X3F1ZXVlX2RlY193cmFwKGJhX3Jlc3Bfc2NkX3NzbiAmIDB4ZmYsIHR4cS0+cS5uX2JkKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJSRVBMWV9DT01QUkVTU0VEX0JBIFslZF0gUmVjZWl2ZWQgZnJvbSAlcE0sICIKLQkJCSAgICJzdGFfaWQgPSAlZFxuIiwKLQkJCSAgIGFnZy0+d2FpdF9mb3JfYmEsCi0JCQkgICAodTggKikgJmJhX3Jlc3AtPnN0YV9hZGRyX2xvMzIsCi0JCQkgICBiYV9yZXNwLT5zdGFfaWQpOwotCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiVElEID0gJWQsIFNlcUN0bCA9ICVkLCBiaXRtYXAgPSAweCVsbHgsIgotCQkJInNjZF9mbG93ID0gIgotCQkJICAgIiVkLCBzY2Rfc3NuID0gJWRcbiIsCi0JCQkgICBiYV9yZXNwLT50aWQsCi0JCQkgICBiYV9yZXNwLT5zZXFfY3RsLAotCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShiYV9yZXNwLT5iaXRtYXApLAotCQkJICAgYmFfcmVzcC0+c2NkX2Zsb3csCi0JCQkgICBiYV9yZXNwLT5zY2Rfc3NuKTsKLQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkRBVCBzdGFydF9pZHggPSAlZCwgYml0bWFwID0gMHglbGx4XG4iLAotCQkJICAgYWdnLT5zdGFydF9pZHgsCi0JCQkgICAodW5zaWduZWQgbG9uZyBsb25nKWFnZy0+Yml0bWFwKTsKLQotCS8qIFVwZGF0ZSBkcml2ZXIncyByZWNvcmQgb2YgQUNLIHZzLiBub3QgZm9yIGVhY2ggZnJhbWUgaW4gd2luZG93ICovCi0JaXdsNDk2NV90eF9zdGF0dXNfcmVwbHlfY29tcHJlc3NlZF9iYShwcml2LCBhZ2csIGJhX3Jlc3ApOwotCi0JLyogUmVsZWFzZSBhbGwgVEZEcyBiZWZvcmUgdGhlIFNTTiwgaS5lLiBhbGwgVEZEcyBpbiBmcm9udCBvZgotCSAqIGJsb2NrLWFjayB3aW5kb3cgKHdlIGFzc3VtZSB0aGF0IHRoZXkndmUgYmVlbiBzdWNjZXNzZnVsbHkKLQkgKiB0cmFuc21pdHRlZCAuLi4gaWYgbm90LCBpdCdzIHRvbyBsYXRlIGFueXdheSkuICovCi0JaWYgKHR4cS0+cS5yZWFkX3B0ciAhPSAoYmFfcmVzcF9zY2Rfc3NuICYgMHhmZikpIHsKLQkJLyogY2FsY3VsYXRlIG1hYzgwMjExIGFtcGR1IHN3IHF1ZXVlIHRvIHdha2UgKi8KLQkJaW50IGZyZWVkID0gaXdsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHByaXYsIHNjZF9mbG93LCBpbmRleCk7Ci0JCWl3bDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHByaXYsIHN0YV9pZCwgdGlkLCBmcmVlZCk7Ci0KLQkJaWYgKChpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrKSAmJgotCQkgICAgcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCAmJgotCQkgICAgKGFnZy0+c3RhdGUgIT0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKSkKLQkJCWl3bF9sZWdhY3lfd2FrZV9xdWV1ZShwcml2LCB0eHEpOwotCi0JCWl3bDQ5NjVfdHhxX2NoZWNrX2VtcHR5KHByaXYsIHN0YV9pZCwgdGlkLCBzY2RfZmxvdyk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotY29uc3QgY2hhciAqaXdsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cykKLXsKLSNkZWZpbmUgVFhfU1RBVFVTX0ZBSUwoeCkgY2FzZSBUWF9TVEFUVVNfRkFJTF8gIyMgeDogcmV0dXJuICN4Ci0jZGVmaW5lIFRYX1NUQVRVU19QT1NUUE9ORSh4KSBjYXNlIFRYX1NUQVRVU19QT1NUUE9ORV8gIyMgeDogcmV0dXJuICN4Ci0KLQlzd2l0Y2ggKHN0YXR1cyAmIFRYX1NUQVRVU19NU0spIHsKLQljYXNlIFRYX1NUQVRVU19TVUNDRVNTOgotCQlyZXR1cm4gIlNVQ0NFU1MiOwotCVRYX1NUQVRVU19QT1NUUE9ORShERUxBWSk7Ci0JVFhfU1RBVFVTX1BPU1RQT05FKEZFV19CWVRFUyk7Ci0JVFhfU1RBVFVTX1BPU1RQT05FKFFVSUVUX1BFUklPRCk7Ci0JVFhfU1RBVFVTX1BPU1RQT05FKENBTENfVFRBSyk7Ci0JVFhfU1RBVFVTX0ZBSUwoSU5URVJOQUxfQ1JPU1NFRF9SRVRSWSk7Ci0JVFhfU1RBVFVTX0ZBSUwoU0hPUlRfTElNSVQpOwotCVRYX1NUQVRVU19GQUlMKExPTkdfTElNSVQpOwotCVRYX1NUQVRVU19GQUlMKEZJRk9fVU5ERVJSVU4pOwotCVRYX1NUQVRVU19GQUlMKERSQUlOX0ZMT1cpOwotCVRYX1NUQVRVU19GQUlMKFJGS0lMTF9GTFVTSCk7Ci0JVFhfU1RBVFVTX0ZBSUwoTElGRV9FWFBJUkUpOwotCVRYX1NUQVRVU19GQUlMKERFU1RfUFMpOwotCVRYX1NUQVRVU19GQUlMKEhPU1RfQUJPUlRFRCk7Ci0JVFhfU1RBVFVTX0ZBSUwoQlRfUkVUUlkpOwotCVRYX1NUQVRVU19GQUlMKFNUQV9JTlZBTElEKTsKLQlUWF9TVEFUVVNfRkFJTChGUkFHX0RST1BQRUQpOwotCVRYX1NUQVRVU19GQUlMKFRJRF9ESVNBQkxFKTsKLQlUWF9TVEFUVVNfRkFJTChGSUZPX0ZMVVNIRUQpOwotCVRYX1NUQVRVU19GQUlMKElOU1VGRklDSUVOVF9DRl9QT0xMKTsKLQlUWF9TVEFUVVNfRkFJTChQQVNTSVZFX05PX1JYKTsKLQlUWF9TVEFUVVNfRkFJTChOT19CRUFDT05fT05fUkFEQVIpOwotCX0KLQotCXJldHVybiAiVU5LTk9XTiI7Ci0KLSN1bmRlZiBUWF9TVEFUVVNfRkFJTAotI3VuZGVmIFRYX1NUQVRVU19QT1NUUE9ORQotfQotI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdWNvZGUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LXVjb2RlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMWQxNDguLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtdWNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1ody5oIgotI2luY2x1ZGUgIml3bC00OTY1LmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtY2FsaWIuaCIKLQotI2RlZmluZSBJV0xfQUNfVU5TRVQgLTEKLQotLyoqCi0gKiBpd2xfdmVyaWZ5X2luc3Rfc3BhcnNlIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKLSAqICAgdXNpbmcgc2FtcGxlIGRhdGEgMTAwIGJ5dGVzIGFwYXJ0LiAgSWYgdGhlc2Ugc2FtcGxlIHBvaW50cyBhcmUgZ29vZCwKLSAqICAgaXQncyBhIHByZXR0eSBnb29kIGJldCB0aGF0IGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGVtIGlzIGdvb2QsIHRvby4KLSAqLwotc3RhdGljIGludAotaXdsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LCBfX2xlMzIgKmltYWdlLCB1MzIgbGVuKQotewotCXUzMiB2YWw7Ci0JaW50IHJldCA9IDA7Ci0JdTMyIGVycmNudCA9IDA7Ci0JdTMyIGk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAxMDAsIGltYWdlICs9IDEwMC9zaXplb2YodTMyKSkgewotCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KLQkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCi0JCSAqIGlmIElXTF9ETF9JTyBpcyBzZXQgKi8KLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JBRERSLAotCQkJaSArIElXTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCQl2YWwgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgewotCQkJcmV0ID0gLUVJTzsKLQkJCWVycmNudCsrOwotCQkJaWYgKGVycmNudCA+PSAzKQotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3ZlcmlmeV9pbnN0X2Z1bGwgLSB2ZXJpZnkgcnVudGltZSB1Q29kZSBpbWFnZSBpbiBjYXJkIHZzLiBob3N0LAotICogICAgIGxvb2tpbmcgYXQgYWxsIGRhdGEuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV92ZXJpZnlfaW5zdF9mdWxsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgX19sZTMyICppbWFnZSwKLQkJCQkgdTMyIGxlbikKLXsKLQl1MzIgdmFsOwotCXUzMiBzYXZlX2xlbiA9IGxlbjsKLQlpbnQgcmV0ID0gMDsKLQl1MzIgZXJyY250OwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKLQotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SQUREUiwKLQkJCSAgIElXTDQ5NjVfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCi0JZXJyY250ID0gMDsKLQlmb3IgKDsgbGVuID4gMDsgbGVuIC09IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7Ci0JCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLwotCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKLQkJICogaWYgSVdMX0RMX0lPIGlzIHNldCAqLwotCQl2YWwgPSBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fUkRBVCk7Ci0JCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkgewotCQkJSVdMX0VSUihwcml2LCAidUNvZGUgSU5TVCBzZWN0aW9uIGlzIGludmFsaWQgYXQgIgotCQkJCSAgIm9mZnNldCAweCV4LCBpcyAweCV4LCBzL2IgMHgleFxuIiwKLQkJCQkgIHNhdmVfbGVuIC0gbGVuLCB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCQkJcmV0ID0gLUVJTzsKLQkJCWVycmNudCsrOwotCQkJaWYgKGVycmNudCA+PSAyMCkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCWlmICghZXJyY250KQotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkgICAgInVjb2RlIGltYWdlIGluIElOU1RSVUNUSU9OIG1lbW9yeSBpcyBnb29kXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICogaXdsNDk2NV92ZXJpZnlfdWNvZGUgLSBkZXRlcm1pbmUgd2hpY2ggaW5zdHJ1Y3Rpb24gaW1hZ2UgaXMgaW4gU1JBTSwKLSAqICAgIGFuZCB2ZXJpZnkgaXRzIGNvbnRlbnRzCi0gKi8KLWludCBpd2w0OTY1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JX19sZTMyICppbWFnZTsKLQl1MzIgbGVuOwotCWludCByZXQ7Ci0KLQkvKiBUcnkgYm9vdHN0cmFwICovCi0JaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JcmV0ID0gaXdsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgaW1hZ2UsIGxlbik7Ci0JaWYgKCFyZXQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJvb3RzdHJhcCB1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIFRyeSBpbml0aWFsaXplICovCi0JaW1hZ2UgPSAoX19sZTMyICopcHJpdi0+dWNvZGVfaW5pdC52X2FkZHI7Ci0JbGVuID0gcHJpdi0+dWNvZGVfaW5pdC5sZW47Ci0JcmV0ID0gaXdsNDk2NV92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgaW1hZ2UsIGxlbik7Ci0JaWYgKCFyZXQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemUgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBUcnkgcnVudGltZS9wcm90b2NvbCAqLwotCWltYWdlID0gKF9fbGUzMiAqKXByaXYtPnVjb2RlX2NvZGUudl9hZGRyOwotCWxlbiA9IHByaXYtPnVjb2RlX2NvZGUubGVuOwotCXJldCA9IGl3bDQ5NjVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOwotCWlmICghcmV0KSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSdW50aW1lIHVDb2RlIGlzIGdvb2QgaW4gaW5zdCBTUkFNXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JSVdMX0VSUihwcml2LCAiTk8gVkFMSUQgVUNPREUgSU1BR0UgSU4gSU5TVFJVQ1RJT04gU1JBTSEhXG4iKTsKLQotCS8qIFNpbmNlIG5vdGhpbmcgc2VlbXMgdG8gbWF0Y2gsIHNob3cgZmlyc3Qgc2V2ZXJhbCBkYXRhIGVudHJpZXMgaW4KLQkgKiBpbnN0cnVjdGlvbiBTUkFNLCBzbyBtYXliZSB2aXN1YWwgaW5zcGVjdGlvbiB3aWxsIGdpdmUgYSBjbHVlLgotCSAqIFNlbGVjdGlvbiBvZiBib290c3RyYXAgaW1hZ2UgKHZzLiBvdGhlciBpbWFnZXMpIGlzIGFyYml0cmFyeS4gKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9ib290LmxlbjsKLQlyZXQgPSBpd2w0OTY1X3ZlcmlmeV9pbnN0X2Z1bGwocHJpdiwgaW1hZ2UsIGxlbik7Ci0KLQlyZXR1cm4gcmV0OwotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjRmY2UuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUuYworKysgL2Rldi9udWxsCkBAIC0xLDIxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2tidWZmLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+Ci0KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1jYWxpYi5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1sZWQuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS5oIgotI2luY2x1ZGUgIml3bC00OTY1LWRlYnVnZnMuaCIKLQotc3RhdGljIGludCBpd2w0OTY1X3NlbmRfdHhfcG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXN0YXRpYyBpbnQgaXdsNDk2NV9od19nZXRfdGVtcGVyYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMNDk2NV9VQ09ERV9BUElfTUFYIDIKLQotLyogTG93ZXN0IGZpcm13YXJlIEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCAqLwotI2RlZmluZSBJV0w0OTY1X1VDT0RFX0FQSV9NSU4gMgotCi0jZGVmaW5lIElXTDQ5NjVfRldfUFJFICJpd2x3aWZpLTQ5NjUtIgotI2RlZmluZSBfSVdMNDk2NV9NT0RVTEVfRklSTVdBUkUoYXBpKSBJV0w0OTY1X0ZXX1BSRSAjYXBpICIudWNvZGUiCi0jZGVmaW5lIElXTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkgX0lXTDQ5NjVfTU9EVUxFX0ZJUk1XQVJFKGFwaSkKLQotLyogY2hlY2sgY29udGVudHMgb2Ygc3BlY2lhbCBib290c3RyYXAgdUNvZGUgU1JBTSAqLwotc3RhdGljIGludCBpd2w0OTY1X3ZlcmlmeV9ic20oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCV9fbGUzMiAqaW1hZ2UgPSBwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQl1MzIgbGVuID0gcHJpdi0+dWNvZGVfYm9vdC5sZW47Ci0JdTMyIHJlZzsKLQl1MzIgdmFsOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJlZ2luIHZlcmlmeSBic21cbiIpOwotCi0JLyogdmVyaWZ5IEJTTSBTUkFNIGNvbnRlbnRzICovCi0JdmFsID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgQlNNX1dSX0RXQ09VTlRfUkVHKTsKLQlmb3IgKHJlZyA9IEJTTV9TUkFNX0xPV0VSX0JPVU5EOwotCSAgICAgcmVnIDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47Ci0JICAgICByZWcgKz0gc2l6ZW9mKHUzMiksIGltYWdlKyspIHsKLQkJdmFsID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgcmVnKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJCU00gdUNvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZCBhdCAiCi0JCQkJICAiYWRkciAweCUwOFgrJXUgKG9mICV1KSwgaXMgMHgleCwgcy9iIDB4JXhcbiIsCi0JCQkJICBCU01fU1JBTV9MT1dFUl9CT1VORCwKLQkJCQkgIHJlZyAtIEJTTV9TUkFNX0xPV0VSX0JPVU5ELCBsZW4sCi0JCQkJICB2YWwsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCQkJcmV0dXJuIC1FSU87Ci0JCX0KLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQlNNIGJvb3RzdHJhcCB1Q29kZSBpbWFnZSBPS1xuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2xvYWRfYnNtIC0gTG9hZCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zCi0gKgotICogQlNNIG9wZXJhdGlvbjoKLSAqCi0gKiBUaGUgQm9vdHN0cmFwIFN0YXRlIE1hY2hpbmUgKEJTTSkgc3RvcmVzIGEgc2hvcnQgYm9vdHN0cmFwIHVDb2RlIHByb2dyYW0KLSAqIGluIHNwZWNpYWwgU1JBTSB0aGF0IGRvZXMgbm90IHBvd2VyIGRvd24gZHVyaW5nIFJGS0lMTC4gIFdoZW4gcG93ZXJpbmcgYmFjawotICogdXAgYWZ0ZXIgcG93ZXItc2F2aW5nIHNsZWVwcyAob3IgZHVyaW5nIGluaXRpYWwgdUNvZGUgbG9hZCksIHRoZSBCU00gbG9hZHMKLSAqIHRoZSBib290c3RyYXAgcHJvZ3JhbSBpbnRvIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IsIGFuZCBzdGFydHMgaXQuCi0gKgotICogVGhlIGJvb3RzdHJhcCBwcm9ncmFtIGxvYWRzICh2aWEgRE1BKSBpbnN0cnVjdGlvbnMgYW5kIGRhdGEgZm9yIGEgbmV3Ci0gKiBwcm9ncmFtIGZyb20gaG9zdCBEUkFNIGxvY2F0aW9ucyBpbmRpY2F0ZWQgYnkgdGhlIGhvc3QgZHJpdmVyIGluIHRoZQotICogQlNNX0RSQU1fKiByZWdpc3RlcnMuICBPbmNlIHRoZSBuZXcgcHJvZ3JhbSBpcyBsb2FkZWQsIGl0IHN0YXJ0cwotICogYXV0b21hdGljYWxseS4KLSAqCi0gKiBXaGVuIGluaXRpYWxpemluZyB0aGUgTklDLCB0aGUgaG9zdCBkcml2ZXIgcG9pbnRzIHRoZSBCU00gdG8gdGhlCi0gKiAiaW5pdGlhbGl6ZSIgdUNvZGUgaW1hZ2UuICBUaGlzIHVDb2RlIHNldHMgdXAgc29tZSBpbnRlcm5hbCBkYXRhLCB0aGVuCi0gKiBub3RpZmllcyBob3N0IHZpYSAiaW5pdGlhbGl6ZSBhbGl2ZSIgdGhhdCBpdCBpcyBjb21wbGV0ZS4KLSAqCi0gKiBUaGUgaG9zdCB0aGVuIHJlcGxhY2VzIHRoZSBCU01fRFJBTV8qIHBvaW50ZXIgdmFsdWVzIHRvIHBvaW50IHRvIHRoZQotICogbm9ybWFsIHJ1bnRpbWUgdUNvZGUgaW5zdHJ1Y3Rpb25zIGFuZCBhIGJhY2t1cCB1Q29kZSBkYXRhIGNhY2hlIGJ1ZmZlcgotICogKGZpbGxlZCBpbml0aWFsbHkgd2l0aCBzdGFydGluZyBkYXRhIHZhbHVlcyBmb3IgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciksCi0gKiB0aGVuIHRyaWdnZXJzIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gbG9hZCBhbmQgbGF1bmNoIHRoZSBydW50aW1lIHVDb2RlLAotICogd2hpY2ggYmVnaW5zIG5vcm1hbCBvcGVyYXRpb24uCi0gKgotICogV2hlbiBkb2luZyBhIHBvd2VyLXNhdmUgc2h1dGRvd24sIHJ1bnRpbWUgdUNvZGUgc2F2ZXMgZGF0YSBTUkFNIGludG8KLSAqIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbiBEUkFNIGJlZm9yZSBTUkFNIGlzIHBvd2VyZWQgZG93bi4KLSAqCi0gKiBXaGVuIHBvd2VyaW5nIGJhY2sgdXAsIHRoZSBCU00gbG9hZHMgdGhlIGJvb3RzdHJhcCBwcm9ncmFtLiAgVGhpcyByZWxvYWRzCi0gKiB0aGUgcnVudGltZSB1Q29kZSBpbnN0cnVjdGlvbnMgYW5kIHRoZSBiYWNrdXAgZGF0YSBjYWNoZSBpbnRvIFNSQU0sCi0gKiBhbmQgcmUtbGF1bmNoZXMgdGhlIHJ1bnRpbWUgdUNvZGUgZnJvbSB3aGVyZSBpdCBsZWZ0IG9mZi4KLSAqLwotc3RhdGljIGludCBpd2w0OTY1X2xvYWRfYnNtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlfX2xlMzIgKmltYWdlID0gcHJpdi0+dWNvZGVfYm9vdC52X2FkZHI7Ci0JdTMyIGxlbiA9IHByaXYtPnVjb2RlX2Jvb3QubGVuOwotCWRtYV9hZGRyX3QgcGluc3Q7Ci0JZG1hX2FkZHJfdCBwZGF0YTsKLQl1MzIgaW5zdF9sZW47Ci0JdTMyIGRhdGFfbGVuOwotCWludCBpOwotCXUzMiBkb25lOwotCXUzMiByZWdfb2Zmc2V0OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQmVnaW4gbG9hZCBic21cbiIpOwotCi0JcHJpdi0+dWNvZGVfdHlwZSA9IFVDT0RFX1JUOwotCi0JLyogbWFrZSBzdXJlIGJvb3RzdHJhcCBwcm9ncmFtIGlzIG5vIGxhcmdlciB0aGFuIEJTTSdzIFNSQU0gc2l6ZSAqLwotCWlmIChsZW4gPiBJV0w0OV9NQVhfQlNNX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JLyogVGVsbCBib290c3RyYXAgdUNvZGUgd2hlcmUgdG8gZmluZCB0aGUgIkluaXRpYWxpemUiIHVDb2RlCi0JICogICBpbiBob3N0IERSQU0gLi4uIGhvc3QgRFJBTSBwaHlzaWNhbCBhZGRyZXNzIGJpdHMgMzU6NCBmb3IgNDk2NS4KLQkgKiBOT1RFOiAgaXdsX2luaXRfYWxpdmVfc3RhcnQoKSB3aWxsIHJlcGxhY2UgdGhlc2UgdmFsdWVzLAotCSAqICAgICAgICBhZnRlciB0aGUgImluaXRpYWxpemUiIHVDb2RlIGhhcyBydW4sIHRvIHBvaW50IHRvCi0JICogICAgICAgIHJ1bnRpbWUvcHJvdG9jb2wgaW5zdHJ1Y3Rpb25zIGFuZCBiYWNrdXAgZGF0YSBjYWNoZS4KLQkgKi8KLQlwaW5zdCA9IHByaXYtPnVjb2RlX2luaXQucF9hZGRyID4+IDQ7Ci0JcGRhdGEgPSBwcml2LT51Y29kZV9pbml0X2RhdGEucF9hZGRyID4+IDQ7Ci0JaW5zdF9sZW4gPSBwcml2LT51Y29kZV9pbml0LmxlbjsKLQlkYXRhX2xlbiA9IHByaXYtPnVjb2RlX2luaXRfZGF0YS5sZW47Ci0KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9JTlNUX0JZVEVDT1VOVF9SRUcsIGluc3RfbGVuKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fREFUQV9CWVRFQ09VTlRfUkVHLCBkYXRhX2xlbik7Ci0KLQkvKiBGaWxsIEJTTSBtZW1vcnkgd2l0aCBib290c3RyYXAgaW5zdHJ1Y3Rpb25zICovCi0JZm9yIChyZWdfb2Zmc2V0ID0gQlNNX1NSQU1fTE9XRVJfQk9VTkQ7Ci0JICAgICByZWdfb2Zmc2V0IDwgQlNNX1NSQU1fTE9XRVJfQk9VTkQgKyBsZW47Ci0JICAgICByZWdfb2Zmc2V0ICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKQotCQlfaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIHJlZ19vZmZzZXQsIGxlMzJfdG9fY3B1KCppbWFnZSkpOwotCi0JcmV0ID0gaXdsNDk2NV92ZXJpZnlfYnNtKHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBUZWxsIEJTTSB0byBjb3B5IGZyb20gQlNNIFNSQU0gaW50byBpbnN0cnVjdGlvbiBTUkFNLCB3aGVuIGFza2VkICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9XUl9NRU1fU1JDX1JFRywgMHgwKTsKLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwKLQkJCUJTTV9XUl9NRU1fRFNUX1JFRywgSVdMNDlfUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fV1JfRFdDT1VOVF9SRUcsIGxlbiAvIHNpemVvZih1MzIpKTsKLQotCS8qIExvYWQgYm9vdHN0cmFwIGNvZGUgaW50byBpbnN0cnVjdGlvbiBTUkFNIG5vdywKLQkgKiAgIHRvIHByZXBhcmUgdG8gbG9hZCAiaW5pdGlhbGl6ZSIgdUNvZGUgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX1dSX0NUUkxfUkVHLCBCU01fV1JfQ1RSTF9SRUdfQklUX1NUQVJUKTsKLQotCS8qIFdhaXQgZm9yIGxvYWQgb2YgYm9vdHN0cmFwIHVDb2RlIHRvIGZpbmlzaCAqLwotCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgewotCQlkb25lID0gaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgQlNNX1dSX0NUUkxfUkVHKTsKLQkJaWYgKCEoZG9uZSAmIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQpKQotCQkJYnJlYWs7Ci0JCXVkZWxheSgxMCk7Ci0JfQotCWlmIChpIDwgMTAwKQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQlNNIHdyaXRlIGNvbXBsZXRlLCBwb2xsICVkIGl0ZXJhdGlvbnNcbiIsIGkpOwotCWVsc2UgewotCQlJV0xfRVJSKHByaXYsICJCU00gd3JpdGUgZGlkIG5vdCBjb21wbGV0ZSFcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQkvKiBFbmFibGUgZnV0dXJlIGJvb3QgbG9hZHMgd2hlbmV2ZXIgcG93ZXIgbWFuYWdlbWVudCB1bml0IHRyaWdnZXJzIGl0Ci0JICogICAoZS5nLiB3aGVuIHBvd2VyaW5nIGJhY2sgdXAgYWZ0ZXIgcG93ZXItc2F2ZSBzaHV0ZG93bikgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwKLQkJCUJTTV9XUl9DVFJMX1JFRywgQlNNX1dSX0NUUkxfUkVHX0JJVF9TVEFSVF9FTik7Ci0KLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfc2V0X3Vjb2RlX3B0cnMgLSBTZXQgdUNvZGUgYWRkcmVzcyBsb2NhdGlvbgotICoKLSAqIFRlbGwgaW5pdGlhbGl6YXRpb24gdUNvZGUgd2hlcmUgdG8gZmluZCBydW50aW1lIHVDb2RlLgotICoKLSAqIEJTTSByZWdpc3RlcnMgaW5pdGlhbGx5IGNvbnRhaW4gcG9pbnRlcnMgdG8gaW5pdGlhbGl6YXRpb24gdUNvZGUuCi0gKiBXZSBuZWVkIHRvIHJlcGxhY2UgdGhlbSB0byBsb2FkIHJ1bnRpbWUgdUNvZGUgaW5zdCBhbmQgZGF0YSwKLSAqIGFuZCB0byBzYXZlIHJ1bnRpbWUgZGF0YSB3aGVuIHBvd2VyaW5nIGRvd24uCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9zZXRfdWNvZGVfcHRycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JZG1hX2FkZHJfdCBwaW5zdDsKLQlkbWFfYWRkcl90IHBkYXRhOwotCWludCByZXQgPSAwOwotCi0JLyogYml0cyAzNTo0IGZvciA0OTY1ICovCi0JcGluc3QgPSBwcml2LT51Y29kZV9jb2RlLnBfYWRkciA+PiA0OwotCXBkYXRhID0gcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAucF9hZGRyID4+IDQ7Ci0KLQkvKiBUZWxsIGJvb3RzdHJhcCB1Q29kZSB3aGVyZSB0byBmaW5kIGltYWdlIHRvIGxvYWQgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcsCi0JCQkJIHByaXYtPnVjb2RlX2RhdGEubGVuKTsKLQotCS8qIEluc3QgYnl0ZSBjb3VudCBtdXN0IGJlIGxhc3QgdG8gc2V0IHVwLCBiaXQgMzEgc2lnbmFscyB1Q29kZQotCSAqICAgdGhhdCBhbGwgbmV3IHB0ci9zaXplIGluZm8gaXMgaW4gcGxhY2UgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9CWVRFQ09VTlRfUkVHLAotCQkJCSBwcml2LT51Y29kZV9jb2RlLmxlbiB8IEJTTV9EUkFNX0lOU1RfTE9BRCk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJ1bnRpbWUgdUNvZGUgcG9pbnRlcnMgYXJlIHNldC5cbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2luaXRfYWxpdmVfc3RhcnQgLSBDYWxsZWQgYWZ0ZXIgUkVQTFlfQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCi0gKgotICogQ2FsbGVkIGFmdGVyIFJFUExZX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tICJpbml0aWFsaXplIiB1Q29kZS4KLSAqCi0gKiBUaGUgNDk2NSAiaW5pdGlhbGl6ZSIgQUxJVkUgcmVwbHkgY29udGFpbnMgY2FsaWJyYXRpb24gZGF0YSBmb3I6Ci0gKiAgIFZvbHRhZ2UsIHRlbXBlcmF0dXJlLCBhbmQgTUlNTyB0eCBnYWluIGNvcnJlY3Rpb24sIG5vdyBzdG9yZWQgaW4gcHJpdgotICogICAoMzk0NSBkb2VzIG5vdCBjb250YWluIHRoaXMgZGF0YSkuCi0gKgotICogVGVsbCAiaW5pdGlhbGl6ZSIgdUNvZGUgdG8gZ28gYWhlYWQgYW5kIGxvYWQgdGhlIHJ1bnRpbWUgdUNvZGUuCi0qLwotc3RhdGljIHZvaWQgaXdsNDk2NV9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiBCb290c3RyYXAgdUNvZGUgaGFzIGxvYWRlZCBpbml0aWFsaXplIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KLQkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQotCSAqICJpbml0aWFsaXplIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KLQlpZiAoaXdsNDk2NV92ZXJpZnlfdWNvZGUocHJpdikpIHsKLQkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJhZCBcImluaXRpYWxpemVcIiB1Q29kZSBsb2FkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQkvKiBDYWxjdWxhdGUgdGVtcGVyYXR1cmUgKi8KLQlwcml2LT50ZW1wZXJhdHVyZSA9IGl3bDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKHByaXYpOwotCi0JLyogU2VuZCBwb2ludGVycyB0byBwcm90b2NvbC9ydW50aW1lIHVDb2RlIGltYWdlIC4uLiBpbml0IGNvZGUgd2lsbAotCSAqIGxvYWQgYW5kIGxhdW5jaCBydW50aW1lIHVDb2RlLCB3aGljaCB3aWxsIHNlbmQgdXMgYW5vdGhlciAiQWxpdmUiCi0JICogbm90aWZpY2F0aW9uLiAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCWlmIChpd2w0OTY1X3NldF91Y29kZV9wdHJzKHByaXYpKSB7Ci0JCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb24gbG9hZCB3b24ndCBoYXBwZW47Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNvdWxkbid0IHNldCB1cCB1Q29kZSBwb2ludGVycy5cbiIpOwotCQlnb3RvIHJlc3RhcnQ7Ci0JfQotCXJldHVybjsKLQotcmVzdGFydDoKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotfQotCi1zdGF0aWMgYm9vbCBpdzQ5NjVfaXNfaHQ0MF9jaGFubmVsKF9fbGUzMiByeG9uX2ZsYWdzKQotewotCWludCBjaGFuX21vZCA9IGxlMzJfdG9fY3B1KHJ4b25fZmxhZ3MgJiBSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLKQotCQkJCSAgICA+PiBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TOwotCXJldHVybiAoKGNoYW5fbW9kID09IENIQU5ORUxfTU9ERV9QVVJFXzQwKSB8fAotCQkgIChjaGFuX21vZCA9PSBDSEFOTkVMX01PREVfTUlYRUQpKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9uaWNfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUxNiByYWRpb19jZmc7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JcmFkaW9fY2ZnID0gaXdsX2xlZ2FjeV9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fUkFESU9fQ09ORklHKTsKLQotCS8qIHdyaXRlIHJhZGlvIGNvbmZpZyB2YWx1ZXMgdG8gcmVnaXN0ZXIgKi8KLQlpZiAoRUVQUk9NX1JGX0NGR19UWVBFX01TSyhyYWRpb19jZmcpID09IEVFUFJPTV80OTY1X1JGX0NGR19UWVBFX01BWCkKLQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJICAgIEVFUFJPTV9SRl9DRkdfVFlQRV9NU0socmFkaW9fY2ZnKSB8Ci0JCQkgICAgRUVQUk9NX1JGX0NGR19TVEVQX01TSyhyYWRpb19jZmcpIHwKLQkJCSAgICBFRVBST01fUkZfQ0ZHX0RBU0hfTVNLKHJhZGlvX2NmZykpOwotCi0JLyogc2V0IENTUl9IV19DT05GSUdfUkVHIGZvciB1Q29kZSB1c2UgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCSAgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfUkFESU9fU0kgfAotCQkgICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX01BQ19TSSk7Ci0KLQlwcml2LT5jYWxpYl9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2luZm8gKikKLQkJaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihwcml2LAotCQkJCUVFUFJPTV80OTY1X0NBTElCX1RYUE9XRVJfT0ZGU0VUKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLX0KLQotLyogUmVzZXQgZGlmZmVyZW50aWFsIFJ4IGdhaW5zIGluIE5JQyB0byBwcmVwYXJlIGZvciBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbi4KLSAqIENhbGxlZCBhZnRlciBldmVyeSBhc3NvY2lhdGlvbiwgYnV0IHRoaXMgcnVucyBvbmx5IG9uY2UhCi0gKiAgLi4uIG9uY2UgY2hhaW4gbm9pc2UgaXMgY2FsaWJyYXRlZCB0aGUgZmlyc3QgdGltZSwgaXQncyBnb29kIGZvcmV2ZXIuICAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9jaGFpbl9ub2lzZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhID0gJihwcml2LT5jaGFpbl9ub2lzZV9kYXRhKTsKLQotCWlmICgoZGF0YS0+c3RhdGUgPT0gSVdMX0NIQUlOX05PSVNFX0FMSVZFKSAmJgotCSAgICBpd2xfbGVnYWN5X2lzX2FueV9hc3NvY2lhdGVkKHByaXYpKSB7Ci0JCXN0cnVjdCBpd2xfY2FsaWJfZGlmZl9nYWluX2NtZCBjbWQ7Ci0KLQkJLyogY2xlYXIgZGF0YSBmb3IgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gYWxnb3JpdGhtICovCi0JCWRhdGEtPmNoYWluX25vaXNlX2EgPSAwOwotCQlkYXRhLT5jaGFpbl9ub2lzZV9iID0gMDsKLQkJZGF0YS0+Y2hhaW5fbm9pc2VfYyA9IDA7Ci0JCWRhdGEtPmNoYWluX3NpZ25hbF9hID0gMDsKLQkJZGF0YS0+Y2hhaW5fc2lnbmFsX2IgPSAwOwotCQlkYXRhLT5jaGFpbl9zaWduYWxfYyA9IDA7Ci0JCWRhdGEtPmJlYWNvbl9jb3VudCA9IDA7Ci0KLQkJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQkJY21kLmhkci5vcF9jb2RlID0gSVdMX1BIWV9DQUxJQlJBVEVfRElGRl9HQUlOX0NNRDsKLQkJY21kLmRpZmZfZ2Fpbl9hID0gMDsKLQkJY21kLmRpZmZfZ2Fpbl9iID0gMDsKLQkJY21kLmRpZmZfZ2Fpbl9jID0gMDsKLQkJaWYgKGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1BIWV9DQUxJQlJBVElPTl9DTUQsCi0JCQkJIHNpemVvZihjbWQpLCAmY21kKSkKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiQ291bGQgbm90IHNlbmQgUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRFxuIik7Ci0JCWRhdGEtPnN0YXRlID0gSVdMX0NIQUlOX05PSVNFX0FDQ1VNVUxBVEU7Ci0JCUlXTF9ERUJVR19DQUxJQihwcml2LCAiUnVuIGNoYWluX25vaXNlX2NhbGlicmF0ZVxuIik7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXMgaXdsNDk2NV9zZW5zaXRpdml0eSA9IHsKLQkubWluX25yZ19jY2sgPSA5NywKLQkubWF4X25yZ19jY2sgPSAwLCAvKiBub3QgdXNlZCwgc2V0IHRvIDAgKi8KLQotCS5hdXRvX2NvcnJfbWluX29mZG0gPSA4NSwKLQkuYXV0b19jb3JyX21pbl9vZmRtX21yYyA9IDE3MCwKLQkuYXV0b19jb3JyX21pbl9vZmRtX3gxID0gMTA1LAotCS5hdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxID0gMjIwLAotCi0JLmF1dG9fY29ycl9tYXhfb2ZkbSA9IDEyMCwKLQkuYXV0b19jb3JyX21heF9vZmRtX21yYyA9IDIxMCwKLQkuYXV0b19jb3JyX21heF9vZmRtX3gxID0gMTQwLAotCS5hdXRvX2NvcnJfbWF4X29mZG1fbXJjX3gxID0gMjcwLAotCi0JLmF1dG9fY29ycl9taW5fY2NrID0gMTI1LAotCS5hdXRvX2NvcnJfbWF4X2NjayA9IDIwMCwKLQkuYXV0b19jb3JyX21pbl9jY2tfbXJjID0gMjAwLAotCS5hdXRvX2NvcnJfbWF4X2Nja19tcmMgPSA0MDAsCi0KLQkubnJnX3RoX2NjayA9IDEwMCwKLQkubnJnX3RoX29mZG0gPSAxMDAsCi0KLQkuYmFya2VyX2NvcnJfdGhfbWluID0gMTkwLAotCS5iYXJrZXJfY29ycl90aF9taW5fbXJjID0gMzkwLAotCS5ucmdfdGhfY2NhID0gNjIsCi19OwotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3NldF9jdF90aHJlc2hvbGQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIHdhbnQgS2VsdmluICovCi0JcHJpdi0+aHdfcGFyYW1zLmN0X2tpbGxfdGhyZXNob2xkID0KLQkJQ0VMU0lVU19UT19LRUxWSU4oQ1RfS0lMTF9USFJFU0hPTERfTEVHQUNZKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2h3X3NldF9od19wYXJhbXMKLSAqCi0gKiBDYWxsZWQgd2hlbiBpbml0aWFsaXppbmcgZHJpdmVyCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9od19zZXRfaHdfcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpZiAocHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5udW1fb2ZfcXVldWVzID49IElXTF9NSU5fTlVNX1FVRVVFUyAmJgotCSAgICBwcml2LT5jZmctPm1vZF9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPD0gSVdMNDlfTlVNX1FVRVVFUykKLQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA9Ci0JCQlwcml2LT5jZmctPm1vZF9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7Ci0KLQlwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwotCXByaXYtPmh3X3BhcmFtcy5kbWFfY2hubF9udW0gPSBGSDQ5X1RDU1JfQ0hOTF9OVU07Ci0JcHJpdi0+aHdfcGFyYW1zLnNjZF9iY190YmxzX3NpemUgPQotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqCi0JCQlzaXplb2Yoc3RydWN0IGl3bDQ5NjVfc2NkX2JjX3RibCk7Ci0JcHJpdi0+aHdfcGFyYW1zLnRmZF9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdGZkKTsKLQlwcml2LT5od19wYXJhbXMubWF4X3N0YXRpb25zID0gSVdMNDk2NV9TVEFUSU9OX0NPVU5UOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCA9IElXTDQ5NjVfQlJPQURDQVNUX0lEOwotCXByaXYtPmh3X3BhcmFtcy5tYXhfZGF0YV9zaXplID0gSVdMNDlfUlRDX0RBVEFfU0laRTsKLQlwcml2LT5od19wYXJhbXMubWF4X2luc3Rfc2l6ZSA9IElXTDQ5X1JUQ19JTlNUX1NJWkU7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9ic21fc2l6ZSA9IEJTTV9TUkFNX1NJWkU7Ci0JcHJpdi0+aHdfcGFyYW1zLmh0NDBfY2hhbm5lbCA9IEJJVChJRUVFODAyMTFfQkFORF81R0haKTsKLQotCXByaXYtPmh3X3BhcmFtcy5yeF93cnRfcHRyX3JlZyA9IEZIX1JTQ1NSX0NITkwwX1dQVFI7Ci0KLQlwcml2LT5od19wYXJhbXMudHhfY2hhaW5zX251bSA9IGl3bDQ5NjVfbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7Ci0JcHJpdi0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW0gPSBpd2w0OTY1X251bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOwotCXByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3R4X2FudDsKLQlwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQ7Ci0KLQlpd2w0OTY1X3NldF9jdF90aHJlc2hvbGQocHJpdik7Ci0KLQlwcml2LT5od19wYXJhbXMuc2VucyA9ICZpd2w0OTY1X3NlbnNpdGl2aXR5OwotCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyA9IElXTDQ5NjVfRVhUX0JFQUNPTl9USU1FX1BPUzsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgczMyIGl3bDQ5NjVfbWF0aF9kaXZfcm91bmQoczMyIG51bSwgczMyIGRlbm9tLCBzMzIgKnJlcykKLXsKLQlzMzIgc2lnbiA9IDE7Ci0KLQlpZiAobnVtIDwgMCkgewotCQlzaWduID0gLXNpZ247Ci0JCW51bSA9IC1udW07Ci0JfQotCWlmIChkZW5vbSA8IDApIHsKLQkJc2lnbiA9IC1zaWduOwotCQlkZW5vbSA9IC1kZW5vbTsKLQl9Ci0JKnJlcyA9IDE7Ci0JKnJlcyA9ICgobnVtICogMiArIGRlbm9tKSAvIChkZW5vbSAqIDIpKSAqIHNpZ247Ci0KLQlyZXR1cm4gMTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X2dldF92b2x0YWdlX2NvbXBlbnNhdGlvbiAtIFBvd2VyIHN1cHBseSB2b2x0YWdlIGNvbXAgZm9yIHR4cG93ZXIKLSAqCi0gKiBEZXRlcm1pbmVzIHBvd2VyIHN1cHBseSB2b2x0YWdlIGNvbXBlbnNhdGlvbiBmb3IgdHhwb3dlciBjYWxjdWxhdGlvbnMuCi0gKiBSZXR1cm5zIG51bWJlciBvZiAxLzItZEIgc3RlcHMgdG8gc3VidHJhY3QgZnJvbSBnYWluIHRhYmxlIGluZGV4LAotICogdG8gY29tcGVuc2F0ZSBmb3IgZGlmZmVyZW5jZSBiZXR3ZWVuIHBvd2VyIHN1cHBseSB2b2x0YWdlIGR1cmluZwotICogZmFjdG9yeSBtZWFzdXJlbWVudHMsIHZzLiBjdXJyZW50IHBvd2VyIHN1cHBseSB2b2x0YWdlLgotICoKLSAqIFZvbHRhZ2UgaW5kaWNhdGlvbiBpcyBoaWdoZXIgZm9yIGxvd2VyIHZvbHRhZ2UuCi0gKiBMb3dlciB2b2x0YWdlIHJlcXVpcmVzIG1vcmUgZ2FpbiAobG93ZXIgZ2FpbiB0YWJsZSBpbmRleCkuCi0gKi8KLXN0YXRpYyBzMzIgaXdsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24oczMyIGVlcHJvbV92b2x0YWdlLAotCQkJCQkgICAgczMyIGN1cnJlbnRfdm9sdGFnZSkKLXsKLQlzMzIgY29tcCA9IDA7Ci0KLQlpZiAoKFRYX1BPV0VSX0lXTF9JTExFR0FMX1ZPTFRBR0UgPT0gZWVwcm9tX3ZvbHRhZ2UpIHx8Ci0JICAgIChUWF9QT1dFUl9JV0xfSUxMRUdBTF9WT0xUQUdFID09IGN1cnJlbnRfdm9sdGFnZSkpCi0JCXJldHVybiAwOwotCi0JaXdsNDk2NV9tYXRoX2Rpdl9yb3VuZChjdXJyZW50X3ZvbHRhZ2UgLSBlZXByb21fdm9sdGFnZSwKLQkJCSAgICAgICBUWF9QT1dFUl9JV0xfVk9MVEFHRV9DT0RFU19QRVJfMDNWLCAmY29tcCk7Ci0KLQlpZiAoY3VycmVudF92b2x0YWdlID4gZWVwcm9tX3ZvbHRhZ2UpCi0JCWNvbXAgKj0gMjsKLQlpZiAoKGNvbXAgPCAtMikgfHwgKGNvbXAgPiAyKSkKLQkJY29tcCA9IDA7Ci0KLQlyZXR1cm4gY29tcDsKLX0KLQotc3RhdGljIHMzMiBpd2w0OTY1X2dldF90eF9hdHRlbl9ncnAodTE2IGNoYW5uZWwpCi17Ci0JaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSVdMX1RYX0FUVEVOX0dSNV9GQ0ggJiYKLQkgICAgY2hhbm5lbCA8PSBDQUxJQl9JV0xfVFhfQVRURU5fR1I1X0xDSCkKLQkJcmV0dXJuIENBTElCX0NIX0dST1VQXzU7Ci0KLQlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JV0xfVFhfQVRURU5fR1IxX0ZDSCAmJgotCSAgICBjaGFubmVsIDw9IENBTElCX0lXTF9UWF9BVFRFTl9HUjFfTENIKQotCQlyZXR1cm4gQ0FMSUJfQ0hfR1JPVVBfMTsKLQotCWlmIChjaGFubmVsID49IENBTElCX0lXTF9UWF9BVFRFTl9HUjJfRkNIICYmCi0JICAgIGNoYW5uZWwgPD0gQ0FMSUJfSVdMX1RYX0FUVEVOX0dSMl9MQ0gpCi0JCXJldHVybiBDQUxJQl9DSF9HUk9VUF8yOwotCi0JaWYgKGNoYW5uZWwgPj0gQ0FMSUJfSVdMX1RYX0FUVEVOX0dSM19GQ0ggJiYKLQkgICAgY2hhbm5lbCA8PSBDQUxJQl9JV0xfVFhfQVRURU5fR1IzX0xDSCkKLQkJcmV0dXJuIENBTElCX0NIX0dST1VQXzM7Ci0KLQlpZiAoY2hhbm5lbCA+PSBDQUxJQl9JV0xfVFhfQVRURU5fR1I0X0ZDSCAmJgotCSAgICBjaGFubmVsIDw9IENBTElCX0lXTF9UWF9BVFRFTl9HUjRfTENIKQotCQlyZXR1cm4gQ0FMSUJfQ0hfR1JPVVBfNDsKLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgdTMyIGl3bDQ5NjVfZ2V0X3N1Yl9iYW5kKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGNoYW5uZWwpCi17Ci0JczMyIGIgPSAtMTsKLQotCWZvciAoYiA9IDA7IGIgPCBFRVBST01fVFhfUE9XRVJfQkFORFM7IGIrKykgewotCQlpZiAocHJpdi0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW2JdLmNoX2Zyb20gPT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgoY2hhbm5lbCA+PSBwcml2LT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bYl0uY2hfZnJvbSkKLQkJICAgICYmIChjaGFubmVsIDw9IHByaXYtPmNhbGliX2luZm8tPmJhbmRfaW5mb1tiXS5jaF90bykpCi0JCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gYjsKLX0KLQotc3RhdGljIHMzMiBpd2w0OTY1X2ludGVycG9sYXRlX3ZhbHVlKHMzMiB4LCBzMzIgeDEsIHMzMiB5MSwgczMyIHgyLCBzMzIgeTIpCi17Ci0JczMyIHZhbDsKLQotCWlmICh4MiA9PSB4MSkKLQkJcmV0dXJuIHkxOwotCWVsc2UgewotCQlpd2w0OTY1X21hdGhfZGl2X3JvdW5kKCh4MiAtIHgpICogKHkxIC0geTIpLCAoeDIgLSB4MSksICZ2YWwpOwotCQlyZXR1cm4gdmFsICsgeTI7Ci0JfQotfQotCi0vKioKLSAqIGl3bDQ5NjVfaW50ZXJwb2xhdGVfY2hhbiAtIEludGVycG9sYXRlIGZhY3RvcnkgbWVhc3VyZW1lbnRzIGZvciBvbmUgY2hhbm5lbAotICoKLSAqIEludGVycG9sYXRlcyBmYWN0b3J5IG1lYXN1cmVtZW50cyBmcm9tIHRoZSB0d28gc2FtcGxlIGNoYW5uZWxzIHdpdGhpbiBhCi0gKiBzdWItYmFuZCwgdG8gYXBwbHkgdG8gY2hhbm5lbCBvZiBpbnRlcmVzdC4gIEludGVycG9sYXRpb24gaXMgcHJvcG9ydGlvbmFsIHRvCi0gKiBkaWZmZXJlbmNlcyBpbiBjaGFubmVsIGZyZXF1ZW5jaWVzLCB3aGljaCBpcyBwcm9wb3J0aW9uYWwgdG8gZGlmZmVyZW5jZXMKLSAqIGluIGNoYW5uZWwgbnVtYmVyLgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfaW50ZXJwb2xhdGVfY2hhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBjaGFubmVsLAotCQkJCSAgICBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9jaF9pbmZvICpjaGFuX2luZm8pCi17Ci0JczMyIHMgPSAtMTsKLQl1MzIgYzsKLQl1MzIgbTsKLQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptMTsKLQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptMjsKLQlzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICpvbWVhczsKLQl1MzIgY2hfaTE7Ci0JdTMyIGNoX2kyOwotCi0JcyA9IGl3bDQ5NjVfZ2V0X3N1Yl9iYW5kKHByaXYsIGNoYW5uZWwpOwotCWlmIChzID49IEVFUFJPTV9UWF9QT1dFUl9CQU5EUykgewotCQlJV0xfRVJSKHByaXYsICJUeCBQb3dlciBjYW4gbm90IGZpbmQgY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQljaF9pMSA9IHByaXYtPmNhbGliX2luZm8tPmJhbmRfaW5mb1tzXS5jaDEuY2hfbnVtOwotCWNoX2kyID0gcHJpdi0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW3NdLmNoMi5jaF9udW07Ci0JY2hhbl9pbmZvLT5jaF9udW0gPSAodTgpIGNoYW5uZWw7Ci0KLQlJV0xfREVCVUdfVFhQT1dFUihwcml2LCAiY2hhbm5lbCAlZCBzdWJiYW5kICVkIGZhY3RvcnkgY2FsIGNoICVkICYgJWRcbiIsCi0JCQkgIGNoYW5uZWwsIHMsIGNoX2kxLCBjaF9pMik7Ci0KLQlmb3IgKGMgPSAwOyBjIDwgRUVQUk9NX1RYX1BPV0VSX1RYX0NIQUlOUzsgYysrKSB7Ci0JCWZvciAobSA9IDA7IG0gPCBFRVBST01fVFhfUE9XRVJfTUVBU1VSRU1FTlRTOyBtKyspIHsKLQkJCW0xID0gJihwcml2LT5jYWxpYl9pbmZvLT5iYW5kX2luZm9bc10uY2gxLgotCQkJICAgICAgIG1lYXN1cmVtZW50c1tjXVttXSk7Ci0JCQltMiA9ICYocHJpdi0+Y2FsaWJfaW5mby0+YmFuZF9pbmZvW3NdLmNoMi4KLQkJCSAgICAgICBtZWFzdXJlbWVudHNbY11bbV0pOwotCQkJb21lYXMgPSAmKGNoYW5faW5mby0+bWVhc3VyZW1lbnRzW2NdW21dKTsKLQotCQkJb21lYXMtPmFjdHVhbF9wb3cgPQotCQkJICAgICh1OCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+YWN0dWFsX3BvdywKLQkJCQkJCQkgICBjaF9pMiwKLQkJCQkJCQkgICBtMi0+YWN0dWFsX3Bvdyk7Ci0JCQlvbWVhcy0+Z2Fpbl9pZHggPQotCQkJICAgICh1OCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+Z2Fpbl9pZHgsIGNoX2kyLAotCQkJCQkJCSAgIG0yLT5nYWluX2lkeCk7Ci0JCQlvbWVhcy0+dGVtcGVyYXR1cmUgPQotCQkJICAgICh1OCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+dGVtcGVyYXR1cmUsCi0JCQkJCQkJICAgY2hfaTIsCi0JCQkJCQkJICAgbTItPnRlbXBlcmF0dXJlKTsKLQkJCW9tZWFzLT5wYV9kZXQgPQotCQkJICAgIChzOCkgaXdsNDk2NV9pbnRlcnBvbGF0ZV92YWx1ZShjaGFubmVsLCBjaF9pMSwKLQkJCQkJCQkgICBtMS0+cGFfZGV0LCBjaF9pMiwKLQkJCQkJCQkgICBtMi0+cGFfZGV0KTsKLQotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCBBUDE9JWQgQVAyPSVkIEFQPSVkXG4iLCBjLCBtLAotCQkJCW0xLT5hY3R1YWxfcG93LCBtMi0+YWN0dWFsX3Bvdywgb21lYXMtPmFjdHVhbF9wb3cpOwotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCBOSTE9JWQgTkkyPSVkIE5JPSVkXG4iLCBjLCBtLAotCQkJCW0xLT5nYWluX2lkeCwgbTItPmdhaW5faWR4LCBvbWVhcy0+Z2Fpbl9pZHgpOwotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCBQQTE9JWQgUEEyPSVkIFBBPSVkXG4iLCBjLCBtLAotCQkJCW0xLT5wYV9kZXQsIG0yLT5wYV9kZXQsIG9tZWFzLT5wYV9kZXQpOwotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwKLQkJCQkiY2hhaW4gJWQgbWVhcyAlZCAgVDE9JWQgIFQyPSVkICBUPSVkXG4iLCBjLCBtLAotCQkJCW0xLT50ZW1wZXJhdHVyZSwgbTItPnRlbXBlcmF0dXJlLAotCQkJCW9tZWFzLT50ZW1wZXJhdHVyZSk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyogYml0LXJhdGUtZGVwZW5kZW50IHRhYmxlIHRvIHByZXZlbnQgVHggZGlzdG9ydGlvbiwgaW4gaGFsZi1kQiB1bml0cywKLSAqIGZvciBPRkRNIDYsIDEyLCAxOCwgMjQsIDM2LCA0OCwgNTQsIDYwIE1CaXQsIGFuZCBDQ0sgYWxsIHJhdGVzLiAqLwotc3RhdGljIHMzMiBiYWNrX29mZl90YWJsZVtdID0gewotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBTSVNPIDIwIE1IeiAqLwotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBNSU1PIDIwIE1IeiAqLwotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBTSVNPIDQwIE1IeiAqLwotCTEwLCAxMCwgMTAsIDEwLCAxMCwgMTUsIDE3LCAyMCwJLyogT0ZETSBNSU1PIDQwIE1IeiAqLwotCTEwCQkJLyogQ0NLICovCi19OwotCi0vKiBUaGVybWFsIGNvbXBlbnNhdGlvbiB2YWx1ZXMgZm9yIHR4cG93ZXIgZm9yIHZhcmlvdXMgZnJlcXVlbmN5IHJhbmdlcyAuLi4KLSAqICAgcmF0aW9zIGZyb20gMzoxIHRvIDQuNToxIG9mIGRlZ3JlZXMgKENlbHNpdXMpIHBlciBoYWxmLWRCIGdhaW4gYWRqdXN0ICovCi1zdGF0aWMgc3RydWN0IGl3bDQ5NjVfdHhwb3dlcl9jb21wX2VudHJ5IHsKLQlzMzIgZGVncmVlc19wZXJfMDVkYl9hOwotCXMzMiBkZWdyZWVzX3Blcl8wNWRiX2FfZGVub207Ci19IHR4X3Bvd2VyX2NtcF90YmxlW0NBTElCX0NIX0dST1VQX01BWF0gPSB7Ci0JezksIDJ9LAkJCS8qIGdyb3VwIDAgNS4yLCBjaCAgMzQtNDMgKi8KLQl7NCwgMX0sCQkJLyogZ3JvdXAgMSA1LjIsIGNoICA0NC03MCAqLwotCXs0LCAxfSwJCQkvKiBncm91cCAyIDUuMiwgY2ggIDcxLTEyNCAqLwotCXs0LCAxfSwJCQkvKiBncm91cCAzIDUuMiwgY2ggMTI1LTIwMCAqLwotCXszLCAxfQkJCS8qIGdyb3VwIDQgMi40LCBjaCAgIGFsbCAqLwotfTsKLQotc3RhdGljIHMzMiBnZXRfbWluX3Bvd2VyX2luZGV4KHMzMiByYXRlX3Bvd2VyX2luZGV4LCB1MzIgYmFuZCkKLXsKLQlpZiAoIWJhbmQpIHsKLQkJaWYgKChyYXRlX3Bvd2VyX2luZGV4ICYgNykgPD0gNCkKLQkJCXJldHVybiBNSU5fVFhfR0FJTl9JTkRFWF81MkdIWl9FWFQ7Ci0JfQotCXJldHVybiBNSU5fVFhfR0FJTl9JTkRFWDsKLX0KLQotc3RydWN0IGdhaW5fZW50cnkgewotCXU4IGRzcDsKLQl1OCByYWRpbzsKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZ2Fpbl9lbnRyeSBnYWluX3RhYmxlWzJdWzEwOF0gPSB7Ci0JLyogNS4yR0h6IHBvd2VyIGdhaW4gaW5kZXggdGFibGUgKi8KLQl7Ci0JIHsxMjMsIDB4M0Z9LAkJLyogaGlnaGVzdCB0eHBvd2VyICovCi0JIHsxMTcsIDB4M0Z9LAotCSB7MTEwLCAweDNGfSwKLQkgezEwNCwgMHgzRn0sCi0JIHs5OCwgMHgzRn0sCi0JIHsxMTAsIDB4M0V9LAotCSB7MTA0LCAweDNFfSwKLQkgezk4LCAweDNFfSwKLQkgezExMCwgMHgzRH0sCi0JIHsxMDQsIDB4M0R9LAotCSB7OTgsIDB4M0R9LAotCSB7MTEwLCAweDNDfSwKLQkgezEwNCwgMHgzQ30sCi0JIHs5OCwgMHgzQ30sCi0JIHsxMTAsIDB4M0J9LAotCSB7MTA0LCAweDNCfSwKLQkgezk4LCAweDNCfSwKLQkgezExMCwgMHgzQX0sCi0JIHsxMDQsIDB4M0F9LAotCSB7OTgsIDB4M0F9LAotCSB7MTEwLCAweDM5fSwKLQkgezEwNCwgMHgzOX0sCi0JIHs5OCwgMHgzOX0sCi0JIHsxMTAsIDB4Mzh9LAotCSB7MTA0LCAweDM4fSwKLQkgezk4LCAweDM4fSwKLQkgezExMCwgMHgzN30sCi0JIHsxMDQsIDB4Mzd9LAotCSB7OTgsIDB4Mzd9LAotCSB7MTEwLCAweDM2fSwKLQkgezEwNCwgMHgzNn0sCi0JIHs5OCwgMHgzNn0sCi0JIHsxMTAsIDB4MzV9LAotCSB7MTA0LCAweDM1fSwKLQkgezk4LCAweDM1fSwKLQkgezExMCwgMHgzNH0sCi0JIHsxMDQsIDB4MzR9LAotCSB7OTgsIDB4MzR9LAotCSB7MTEwLCAweDMzfSwKLQkgezEwNCwgMHgzM30sCi0JIHs5OCwgMHgzM30sCi0JIHsxMTAsIDB4MzJ9LAotCSB7MTA0LCAweDMyfSwKLQkgezk4LCAweDMyfSwKLQkgezExMCwgMHgzMX0sCi0JIHsxMDQsIDB4MzF9LAotCSB7OTgsIDB4MzF9LAotCSB7MTEwLCAweDMwfSwKLQkgezEwNCwgMHgzMH0sCi0JIHs5OCwgMHgzMH0sCi0JIHsxMTAsIDB4MjV9LAotCSB7MTA0LCAweDI1fSwKLQkgezk4LCAweDI1fSwKLQkgezExMCwgMHgyNH0sCi0JIHsxMDQsIDB4MjR9LAotCSB7OTgsIDB4MjR9LAotCSB7MTEwLCAweDIzfSwKLQkgezEwNCwgMHgyM30sCi0JIHs5OCwgMHgyM30sCi0JIHsxMTAsIDB4MjJ9LAotCSB7MTA0LCAweDE4fSwKLQkgezk4LCAweDE4fSwKLQkgezExMCwgMHgxN30sCi0JIHsxMDQsIDB4MTd9LAotCSB7OTgsIDB4MTd9LAotCSB7MTEwLCAweDE2fSwKLQkgezEwNCwgMHgxNn0sCi0JIHs5OCwgMHgxNn0sCi0JIHsxMTAsIDB4MTV9LAotCSB7MTA0LCAweDE1fSwKLQkgezk4LCAweDE1fSwKLQkgezExMCwgMHgxNH0sCi0JIHsxMDQsIDB4MTR9LAotCSB7OTgsIDB4MTR9LAotCSB7MTEwLCAweDEzfSwKLQkgezEwNCwgMHgxM30sCi0JIHs5OCwgMHgxM30sCi0JIHsxMTAsIDB4MTJ9LAotCSB7MTA0LCAweDA4fSwKLQkgezk4LCAweDA4fSwKLQkgezExMCwgMHgwN30sCi0JIHsxMDQsIDB4MDd9LAotCSB7OTgsIDB4MDd9LAotCSB7MTEwLCAweDA2fSwKLQkgezEwNCwgMHgwNn0sCi0JIHs5OCwgMHgwNn0sCi0JIHsxMTAsIDB4MDV9LAotCSB7MTA0LCAweDA1fSwKLQkgezk4LCAweDA1fSwKLQkgezExMCwgMHgwNH0sCi0JIHsxMDQsIDB4MDR9LAotCSB7OTgsIDB4MDR9LAotCSB7MTEwLCAweDAzfSwKLQkgezEwNCwgMHgwM30sCi0JIHs5OCwgMHgwM30sCi0JIHsxMTAsIDB4MDJ9LAotCSB7MTA0LCAweDAyfSwKLQkgezk4LCAweDAyfSwKLQkgezExMCwgMHgwMX0sCi0JIHsxMDQsIDB4MDF9LAotCSB7OTgsIDB4MDF9LAotCSB7MTEwLCAweDAwfSwKLQkgezEwNCwgMHgwMH0sCi0JIHs5OCwgMHgwMH0sCi0JIHs5MywgMHgwMH0sCi0JIHs4OCwgMHgwMH0sCi0JIHs4MywgMHgwMH0sCi0JIHs3OCwgMHgwMH0sCi0JIH0sCi0JLyogMi40R0h6IHBvd2VyIGdhaW4gaW5kZXggdGFibGUgKi8KLQl7Ci0JIHsxMTAsIDB4M2Z9LAkJLyogaGlnaGVzdCB0eHBvd2VyICovCi0JIHsxMDQsIDB4M2Z9LAotCSB7OTgsIDB4M2Z9LAotCSB7MTEwLCAweDNlfSwKLQkgezEwNCwgMHgzZX0sCi0JIHs5OCwgMHgzZX0sCi0JIHsxMTAsIDB4M2R9LAotCSB7MTA0LCAweDNkfSwKLQkgezk4LCAweDNkfSwKLQkgezExMCwgMHgzY30sCi0JIHsxMDQsIDB4M2N9LAotCSB7OTgsIDB4M2N9LAotCSB7MTEwLCAweDNifSwKLQkgezEwNCwgMHgzYn0sCi0JIHs5OCwgMHgzYn0sCi0JIHsxMTAsIDB4M2F9LAotCSB7MTA0LCAweDNhfSwKLQkgezk4LCAweDNhfSwKLQkgezExMCwgMHgzOX0sCi0JIHsxMDQsIDB4Mzl9LAotCSB7OTgsIDB4Mzl9LAotCSB7MTEwLCAweDM4fSwKLQkgezEwNCwgMHgzOH0sCi0JIHs5OCwgMHgzOH0sCi0JIHsxMTAsIDB4Mzd9LAotCSB7MTA0LCAweDM3fSwKLQkgezk4LCAweDM3fSwKLQkgezExMCwgMHgzNn0sCi0JIHsxMDQsIDB4MzZ9LAotCSB7OTgsIDB4MzZ9LAotCSB7MTEwLCAweDM1fSwKLQkgezEwNCwgMHgzNX0sCi0JIHs5OCwgMHgzNX0sCi0JIHsxMTAsIDB4MzR9LAotCSB7MTA0LCAweDM0fSwKLQkgezk4LCAweDM0fSwKLQkgezExMCwgMHgzM30sCi0JIHsxMDQsIDB4MzN9LAotCSB7OTgsIDB4MzN9LAotCSB7MTEwLCAweDMyfSwKLQkgezEwNCwgMHgzMn0sCi0JIHs5OCwgMHgzMn0sCi0JIHsxMTAsIDB4MzF9LAotCSB7MTA0LCAweDMxfSwKLQkgezk4LCAweDMxfSwKLQkgezExMCwgMHgzMH0sCi0JIHsxMDQsIDB4MzB9LAotCSB7OTgsIDB4MzB9LAotCSB7MTEwLCAweDZ9LAotCSB7MTA0LCAweDZ9LAotCSB7OTgsIDB4Nn0sCi0JIHsxMTAsIDB4NX0sCi0JIHsxMDQsIDB4NX0sCi0JIHs5OCwgMHg1fSwKLQkgezExMCwgMHg0fSwKLQkgezEwNCwgMHg0fSwKLQkgezk4LCAweDR9LAotCSB7MTEwLCAweDN9LAotCSB7MTA0LCAweDN9LAotCSB7OTgsIDB4M30sCi0JIHsxMTAsIDB4Mn0sCi0JIHsxMDQsIDB4Mn0sCi0JIHs5OCwgMHgyfSwKLQkgezExMCwgMHgxfSwKLQkgezEwNCwgMHgxfSwKLQkgezk4LCAweDF9LAotCSB7MTEwLCAweDB9LAotCSB7MTA0LCAweDB9LAotCSB7OTgsIDB4MH0sCi0JIHs5NywgMH0sCi0JIHs5NiwgMH0sCi0JIHs5NSwgMH0sCi0JIHs5NCwgMH0sCi0JIHs5MywgMH0sCi0JIHs5MiwgMH0sCi0JIHs5MSwgMH0sCi0JIHs5MCwgMH0sCi0JIHs4OSwgMH0sCi0JIHs4OCwgMH0sCi0JIHs4NywgMH0sCi0JIHs4NiwgMH0sCi0JIHs4NSwgMH0sCi0JIHs4NCwgMH0sCi0JIHs4MywgMH0sCi0JIHs4MiwgMH0sCi0JIHs4MSwgMH0sCi0JIHs4MCwgMH0sCi0JIHs3OSwgMH0sCi0JIHs3OCwgMH0sCi0JIHs3NywgMH0sCi0JIHs3NiwgMH0sCi0JIHs3NSwgMH0sCi0JIHs3NCwgMH0sCi0JIHs3MywgMH0sCi0JIHs3MiwgMH0sCi0JIHs3MSwgMH0sCi0JIHs3MCwgMH0sCi0JIHs2OSwgMH0sCi0JIHs2OCwgMH0sCi0JIHs2NywgMH0sCi0JIHs2NiwgMH0sCi0JIHs2NSwgMH0sCi0JIHs2NCwgMH0sCi0JIHs2MywgMH0sCi0JIHs2MiwgMH0sCi0JIHs2MSwgMH0sCi0JIHs2MCwgMH0sCi0JIHs1OSwgMH0sCi0JIH0KLX07Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9maWxsX3R4cG93ZXJfdGJsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggYmFuZCwgdTE2IGNoYW5uZWwsCi0JCQkJICAgIHU4IGlzX2h0NDAsIHU4IGN0cmxfY2hhbl9oaWdoLAotCQkJCSAgICBzdHJ1Y3QgaXdsNDk2NV90eF9wb3dlcl9kYiAqdHhfcG93ZXJfdGJsKQotewotCXU4IHNhdHVyYXRpb25fcG93ZXI7Ci0JczMyIHRhcmdldF9wb3dlcjsKLQlzMzIgdXNlcl90YXJnZXRfcG93ZXI7Ci0JczMyIHBvd2VyX2xpbWl0OwotCXMzMiBjdXJyZW50X3RlbXA7Ci0JczMyIHJlZ19saW1pdDsKLQlzMzIgY3VycmVudF9yZWd1bGF0b3J5OwotCXMzMiB0eGF0dGVuX2dycCA9IENBTElCX0NIX0dST1VQX01BWDsKLQlpbnQgaTsKLQlpbnQgYzsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbyA9IE5VTEw7Ci0Jc3RydWN0IGl3bF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaF9lZXByb21faW5mbzsKLQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlICptZWFzdXJlbWVudDsKLQlzMTYgdm9sdGFnZTsKLQlzMzIgaW5pdF92b2x0YWdlOwotCXMzMiB2b2x0YWdlX2NvbXBlbnNhdGlvbjsKLQlzMzIgZGVncmVlc19wZXJfMDVkYl9udW07Ci0JczMyIGRlZ3JlZXNfcGVyXzA1ZGJfZGVub207Ci0JczMyIGZhY3RvcnlfdGVtcDsKLQlzMzIgdGVtcGVyYXR1cmVfY29tcFsyXTsKLQlzMzIgZmFjdG9yeV9nYWluX2luZGV4WzJdOwotCXMzMiBmYWN0b3J5X2FjdHVhbF9wd3JbMl07Ci0JczMyIHBvd2VyX2luZGV4OwotCi0JLyogdHhfcG93ZXJfdXNlcl9sbXQgaXMgaW4gZEJtLCBjb252ZXJ0IHRvIGhhbGYtZEJtIChoYWxmLWRCIHVuaXRzCi0JICogICBhcmUgdXNlZCBmb3IgaW5kZXhpbmcgaW50byB0eHBvd2VyIHRhYmxlKSAqLwotCXVzZXJfdGFyZ2V0X3Bvd2VyID0gMiAqIHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10OwotCi0JLyogR2V0IGN1cnJlbnQgKFJYT04pIGNoYW5uZWwsIGJhbmQsIHdpZHRoICovCi0JSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNoYW4gJWQgYmFuZCAlZCBpc19odDQwICVkXG4iLCBjaGFubmVsLCBiYW5kLAotCQkJICBpc19odDQwKTsKLQotCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgcHJpdi0+YmFuZCwgY2hhbm5lbCk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQkvKiBnZXQgdHhhdHRlbiBncm91cCwgdXNlZCB0byBzZWxlY3QgMSkgdGhlcm1hbCB0eHBvd2VyIGFkanVzdG1lbnQKLQkgKiAgIGFuZCAyKSBtaW1vIHR4cG93ZXIgYmFsYW5jZSBiZXR3ZWVuIFR4IGNoYWlucy4gKi8KLQl0eGF0dGVuX2dycCA9IGl3bDQ5NjVfZ2V0X3R4X2F0dGVuX2dycChjaGFubmVsKTsKLQlpZiAodHhhdHRlbl9ncnAgPCAwKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbid0IGZpbmQgdHhhdHRlbiBncm91cCBmb3IgY2hhbm5lbCAlZC5cbiIsCi0JCQkgIGNoYW5uZWwpOwotCQlyZXR1cm4gdHhhdHRlbl9ncnA7Ci0JfQotCi0JSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNoYW5uZWwgJWQgYmVsb25ncyB0byB0eGF0dGVuIGdyb3VwICVkXG4iLAotCQkJICBjaGFubmVsLCB0eGF0dGVuX2dycCk7Ci0KLQlpZiAoaXNfaHQ0MCkgewotCQlpZiAoY3RybF9jaGFuX2hpZ2gpCi0JCQljaGFubmVsIC09IDI7Ci0JCWVsc2UKLQkJCWNoYW5uZWwgKz0gMjsKLQl9Ci0KLQkvKiBoYXJkd2FyZSB0eHBvd2VyIGxpbWl0cyAuLi4KLQkgKiBzYXR1cmF0aW9uIChjbGlwcGluZyBkaXN0b3J0aW9uKSB0eHBvd2VycyBhcmUgaW4gaGFsZi1kQm0gKi8KLQlpZiAoYmFuZCkKLQkJc2F0dXJhdGlvbl9wb3dlciA9IHByaXYtPmNhbGliX2luZm8tPnNhdHVyYXRpb25fcG93ZXIyNDsKLQllbHNlCi0JCXNhdHVyYXRpb25fcG93ZXIgPSBwcml2LT5jYWxpYl9pbmZvLT5zYXR1cmF0aW9uX3Bvd2VyNTI7Ci0KLQlpZiAoc2F0dXJhdGlvbl9wb3dlciA8IElXTF9UWF9QT1dFUl9TQVRVUkFUSU9OX01JTiB8fAotCSAgICBzYXR1cmF0aW9uX3Bvd2VyID4gSVdMX1RYX1BPV0VSX1NBVFVSQVRJT05fTUFYKSB7Ci0JCWlmIChiYW5kKQotCQkJc2F0dXJhdGlvbl9wb3dlciA9IElXTF9UWF9QT1dFUl9ERUZBVUxUX1NBVFVSQVRJT05fMjQ7Ci0JCWVsc2UKLQkJCXNhdHVyYXRpb25fcG93ZXIgPSBJV0xfVFhfUE9XRVJfREVGQVVMVF9TQVRVUkFUSU9OXzUyOwotCX0KLQotCS8qIHJlZ3VsYXRvcnkgdHhwb3dlciBsaW1pdHMgLi4uIHJlZ19saW1pdCB2YWx1ZXMgYXJlIGluIGhhbGYtZEJtLAotCSAqICAgbWF4X3Bvd2VyX2F2ZyB2YWx1ZXMgYXJlIGluIGRCbSwgY29udmVydCAqIDIgKi8KLQlpZiAoaXNfaHQ0MCkKLQkJcmVnX2xpbWl0ID0gY2hfaW5mby0+aHQ0MF9tYXhfcG93ZXJfYXZnICogMjsKLQllbHNlCi0JCXJlZ19saW1pdCA9IGNoX2luZm8tPm1heF9wb3dlcl9hdmcgKiAyOwotCi0JaWYgKChyZWdfbGltaXQgPCBJV0xfVFhfUE9XRVJfUkVHVUxBVE9SWV9NSU4pIHx8Ci0JICAgIChyZWdfbGltaXQgPiBJV0xfVFhfUE9XRVJfUkVHVUxBVE9SWV9NQVgpKSB7Ci0JCWlmIChiYW5kKQotCQkJcmVnX2xpbWl0ID0gSVdMX1RYX1BPV0VSX0RFRkFVTFRfUkVHVUxBVE9SWV8yNDsKLQkJZWxzZQotCQkJcmVnX2xpbWl0ID0gSVdMX1RYX1BPV0VSX0RFRkFVTFRfUkVHVUxBVE9SWV81MjsKLQl9Ci0KLQkvKiBJbnRlcnBvbGF0ZSB0eHBvd2VyIGNhbGlicmF0aW9uIHZhbHVlcyBmb3IgdGhpcyBjaGFubmVsLAotCSAqICAgYmFzZWQgb24gZmFjdG9yeSBjYWxpYnJhdGlvbiB0ZXN0cyBvbiBzcGFjZWQgY2hhbm5lbHMuICovCi0JaXdsNDk2NV9pbnRlcnBvbGF0ZV9jaGFuKHByaXYsIGNoYW5uZWwsICZjaF9lZXByb21faW5mbyk7Ci0KLQkvKiBjYWxjdWxhdGUgdHggZ2FpbiBhZGp1c3RtZW50IGJhc2VkIG9uIHBvd2VyIHN1cHBseSB2b2x0YWdlICovCi0Jdm9sdGFnZSA9IGxlMTZfdG9fY3B1KHByaXYtPmNhbGliX2luZm8tPnZvbHRhZ2UpOwotCWluaXRfdm9sdGFnZSA9IChzMzIpbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnZvbHRhZ2UpOwotCXZvbHRhZ2VfY29tcGVuc2F0aW9uID0KLQkgICAgaXdsNDk2NV9nZXRfdm9sdGFnZV9jb21wZW5zYXRpb24odm9sdGFnZSwgaW5pdF92b2x0YWdlKTsKLQotCUlXTF9ERUJVR19UWFBPV0VSKHByaXYsICJjdXJyIHZvbHQgJWQgZWVwcm9tIHZvbHQgJWQgdm9sdCBjb21wICVkXG4iLAotCQkJICBpbml0X3ZvbHRhZ2UsCi0JCQkgIHZvbHRhZ2UsIHZvbHRhZ2VfY29tcGVuc2F0aW9uKTsKLQotCS8qIGdldCBjdXJyZW50IHRlbXBlcmF0dXJlIChDZWxzaXVzKSAqLwotCWN1cnJlbnRfdGVtcCA9IG1heChwcml2LT50ZW1wZXJhdHVyZSwgSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX01JTik7Ci0JY3VycmVudF90ZW1wID0gbWluKHByaXYtPnRlbXBlcmF0dXJlLCBJV0xfVFhfUE9XRVJfVEVNUEVSQVRVUkVfTUFYKTsKLQljdXJyZW50X3RlbXAgPSBLRUxWSU5fVE9fQ0VMU0lVUyhjdXJyZW50X3RlbXApOwotCi0JLyogc2VsZWN0IHRoZXJtYWwgdHhwb3dlciBhZGp1c3RtZW50IHBhcmFtcywgYmFzZWQgb24gY2hhbm5lbCBncm91cAotCSAqICAgKHNhbWUgZnJlcXVlbmN5IGdyb3VwIHVzZWQgZm9yIG1pbW8gdHhhdHRlbiBhZGp1c3RtZW50KSAqLwotCWRlZ3JlZXNfcGVyXzA1ZGJfbnVtID0KLQkgICAgdHhfcG93ZXJfY21wX3RibGVbdHhhdHRlbl9ncnBdLmRlZ3JlZXNfcGVyXzA1ZGJfYTsKLQlkZWdyZWVzX3Blcl8wNWRiX2Rlbm9tID0KLQkgICAgdHhfcG93ZXJfY21wX3RibGVbdHhhdHRlbl9ncnBdLmRlZ3JlZXNfcGVyXzA1ZGJfYV9kZW5vbTsKLQotCS8qIGdldCBwZXItY2hhaW4gdHhwb3dlciB2YWx1ZXMgZnJvbSBmYWN0b3J5IG1lYXN1cmVtZW50cyAqLwotCWZvciAoYyA9IDA7IGMgPCAyOyBjKyspIHsKLQkJbWVhc3VyZW1lbnQgPSAmY2hfZWVwcm9tX2luZm8ubWVhc3VyZW1lbnRzW2NdWzFdOwotCi0JCS8qIHR4Z2FpbiBhZGp1c3RtZW50IChpbiBoYWxmLWRCIHN0ZXBzKSBiYXNlZCBvbiBkaWZmZXJlbmNlCi0JCSAqICAgYmV0d2VlbiBmYWN0b3J5IGFuZCBjdXJyZW50IHRlbXBlcmF0dXJlICovCi0JCWZhY3RvcnlfdGVtcCA9IG1lYXN1cmVtZW50LT50ZW1wZXJhdHVyZTsKLQkJaXdsNDk2NV9tYXRoX2Rpdl9yb3VuZCgoY3VycmVudF90ZW1wIC0gZmFjdG9yeV90ZW1wKSAqCi0JCQkJICAgICAgIGRlZ3JlZXNfcGVyXzA1ZGJfZGVub20sCi0JCQkJICAgICAgIGRlZ3JlZXNfcGVyXzA1ZGJfbnVtLAotCQkJCSAgICAgICAmdGVtcGVyYXR1cmVfY29tcFtjXSk7Ci0KLQkJZmFjdG9yeV9nYWluX2luZGV4W2NdID0gbWVhc3VyZW1lbnQtPmdhaW5faWR4OwotCQlmYWN0b3J5X2FjdHVhbF9wd3JbY10gPSBtZWFzdXJlbWVudC0+YWN0dWFsX3BvdzsKLQotCQlJV0xfREVCVUdfVFhQT1dFUihwcml2LCAiY2hhaW4gPSAlZFxuIiwgYyk7Ci0JCUlXTF9ERUJVR19UWFBPV0VSKHByaXYsICJmY3RyeSB0bXAgJWQsICIKLQkJCQkgICJjdXJyIHRtcCAlZCwgY29tcCAlZCBzdGVwc1xuIiwKLQkJCQkgIGZhY3RvcnlfdGVtcCwgY3VycmVudF90ZW1wLAotCQkJCSAgdGVtcGVyYXR1cmVfY29tcFtjXSk7Ci0KLQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImZjdHJ5IGlkeCAlZCwgZmN0cnkgcHdyICVkXG4iLAotCQkJCSAgZmFjdG9yeV9nYWluX2luZGV4W2NdLAotCQkJCSAgZmFjdG9yeV9hY3R1YWxfcHdyW2NdKTsKLQl9Ci0KLQkvKiBmb3IgZWFjaCBvZiAzMyBiaXQtcmF0ZXMgKGluY2x1ZGluZyAxIGZvciBDQ0spICovCi0JZm9yIChpID0gMDsgaSA8IFBPV0VSX1RBQkxFX05VTV9FTlRSSUVTOyBpKyspIHsKLQkJdTggaXNfbWltb19yYXRlOwotCQl1bmlvbiBpd2w0OTY1X3R4X3Bvd2VyX2R1YWxfc3RyZWFtIHR4X3Bvd2VyOwotCi0JCS8qIGZvciBtaW1vLCByZWR1Y2UgZWFjaCBjaGFpbidzIHR4cG93ZXIgYnkgaGFsZgotCQkgKiAoM2RCLCA2IHN0ZXBzKSwgc28gdG90YWwgb3V0cHV0IHBvd2VyIGlzIHJlZ3VsYXRvcnkKLQkJICogY29tcGxpYW50LiAqLwotCQlpZiAoaSAmIDB4OCkgewotCQkJY3VycmVudF9yZWd1bGF0b3J5ID0gcmVnX2xpbWl0IC0KLQkJCSAgICBJV0xfVFhfUE9XRVJfTUlNT19SRUdVTEFUT1JZX0NPTVBFTlNBVElPTjsKLQkJCWlzX21pbW9fcmF0ZSA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQljdXJyZW50X3JlZ3VsYXRvcnkgPSByZWdfbGltaXQ7Ci0JCQlpc19taW1vX3JhdGUgPSAwOwotCQl9Ci0KLQkJLyogZmluZCB0eHBvd2VyIGxpbWl0LCBlaXRoZXIgaGFyZHdhcmUgb3IgcmVndWxhdG9yeSAqLwotCQlwb3dlcl9saW1pdCA9IHNhdHVyYXRpb25fcG93ZXIgLSBiYWNrX29mZl90YWJsZVtpXTsKLQkJaWYgKHBvd2VyX2xpbWl0ID4gY3VycmVudF9yZWd1bGF0b3J5KQotCQkJcG93ZXJfbGltaXQgPSBjdXJyZW50X3JlZ3VsYXRvcnk7Ci0KLQkJLyogcmVkdWNlIHVzZXIncyB0eHBvd2VyIHJlcXVlc3QgaWYgbmVjZXNzYXJ5Ci0JCSAqIGZvciB0aGlzIHJhdGUgb24gdGhpcyBjaGFubmVsICovCi0JCXRhcmdldF9wb3dlciA9IHVzZXJfdGFyZ2V0X3Bvd2VyOwotCQlpZiAodGFyZ2V0X3Bvd2VyID4gcG93ZXJfbGltaXQpCi0JCQl0YXJnZXRfcG93ZXIgPSBwb3dlcl9saW1pdDsKLQotCQlJV0xfREVCVUdfVFhQT1dFUihwcml2LCAicmF0ZSAlZCBzYXQgJWQgcmVnICVkIHVzciAlZCB0Z3QgJWRcbiIsCi0JCQkJICBpLCBzYXR1cmF0aW9uX3Bvd2VyIC0gYmFja19vZmZfdGFibGVbaV0sCi0JCQkJICBjdXJyZW50X3JlZ3VsYXRvcnksIHVzZXJfdGFyZ2V0X3Bvd2VyLAotCQkJCSAgdGFyZ2V0X3Bvd2VyKTsKLQotCQkvKiBmb3IgZWFjaCBvZiAyIFR4IGNoYWlucyAocmFkaW8gdHJhbnNtaXR0ZXJzKSAqLwotCQlmb3IgKGMgPSAwOyBjIDwgMjsgYysrKSB7Ci0JCQlzMzIgYXR0ZW5fdmFsdWU7Ci0KLQkJCWlmIChpc19taW1vX3JhdGUpCi0JCQkJYXR0ZW5fdmFsdWUgPQotCQkJCSAgICAoczMyKWxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC4KLQkJCQkgICAgdHhfYXR0ZW5bdHhhdHRlbl9ncnBdW2NdKTsKLQkJCWVsc2UKLQkJCQlhdHRlbl92YWx1ZSA9IDA7Ci0KLQkJCS8qIGNhbGN1bGF0ZSBpbmRleDsgaGlnaGVyIGluZGV4IG1lYW5zIGxvd2VyIHR4cG93ZXIgKi8KLQkJCXBvd2VyX2luZGV4ID0gKHU4KSAoZmFjdG9yeV9nYWluX2luZGV4W2NdIC0KLQkJCQkJICAgICh0YXJnZXRfcG93ZXIgLQotCQkJCQkgICAgIGZhY3RvcnlfYWN0dWFsX3B3cltjXSkgLQotCQkJCQkgICAgdGVtcGVyYXR1cmVfY29tcFtjXSAtCi0JCQkJCSAgICB2b2x0YWdlX2NvbXBlbnNhdGlvbiArCi0JCQkJCSAgICBhdHRlbl92YWx1ZSk7Ci0KLS8qCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNhbGN1bGF0ZWQgdHhwb3dlciBpbmRleCAlZFxuIiwKLQkJCQkJCXBvd2VyX2luZGV4KTsgKi8KLQotCQkJaWYgKHBvd2VyX2luZGV4IDwgZ2V0X21pbl9wb3dlcl9pbmRleChpLCBiYW5kKSkKLQkJCQlwb3dlcl9pbmRleCA9IGdldF9taW5fcG93ZXJfaW5kZXgoaSwgYmFuZCk7Ci0KLQkJCS8qIGFkanVzdCA1IEdIeiBpbmRleCB0byBzdXBwb3J0IG5lZ2F0aXZlIGluZGV4ZXMgKi8KLQkJCWlmICghYmFuZCkKLQkJCQlwb3dlcl9pbmRleCArPSA5OwotCi0JCQkvKiBDQ0ssIHJhdGUgMzIsIHJlZHVjZSB0eHBvd2VyIGZvciBDQ0sgKi8KLQkJCWlmIChpID09IFBPV0VSX1RBQkxFX0NDS19FTlRSWSkKLQkJCQlwb3dlcl9pbmRleCArPQotCQkJCSAgICBJV0xfVFhfUE9XRVJfQ0NLX0NPTVBFTlNBVElPTl9DX1NURVA7Ci0KLQkJCS8qIHN0YXkgd2l0aGluIHRoZSB0YWJsZSEgKi8KLQkJCWlmIChwb3dlcl9pbmRleCA+IDEwNykgewotCQkJCUlXTF9XQVJOKHByaXYsICJ0eHBvd2VyIGluZGV4ICVkID4gMTA3XG4iLAotCQkJCQkgICAgcG93ZXJfaW5kZXgpOwotCQkJCXBvd2VyX2luZGV4ID0gMTA3OwotCQkJfQotCQkJaWYgKHBvd2VyX2luZGV4IDwgMCkgewotCQkJCUlXTF9XQVJOKHByaXYsICJ0eHBvd2VyIGluZGV4ICVkIDwgMFxuIiwKLQkJCQkJICAgIHBvd2VyX2luZGV4KTsKLQkJCQlwb3dlcl9pbmRleCA9IDA7Ci0JCQl9Ci0KLQkJCS8qIGZpbGwgdHhwb3dlciBjb21tYW5kIGZvciB0aGlzIHJhdGUvY2hhaW4gKi8KLQkJCXR4X3Bvd2VyLnMucmFkaW9fdHhfZ2FpbltjXSA9Ci0JCQkJZ2Fpbl90YWJsZVtiYW5kXVtwb3dlcl9pbmRleF0ucmFkaW87Ci0JCQl0eF9wb3dlci5zLmRzcF9wcmVkaXNfYXR0ZW5bY10gPQotCQkJCWdhaW5fdGFibGVbYmFuZF1bcG93ZXJfaW5kZXhdLmRzcDsKLQotCQkJSVdMX0RFQlVHX1RYUE9XRVIocHJpdiwgImNoYWluICVkIG1pbW8gJWQgaW5kZXggJWQgIgotCQkJCQkgICJnYWluIDB4JTAyeCBkc3AgJWRcbiIsCi0JCQkJCSAgYywgYXR0ZW5fdmFsdWUsIHBvd2VyX2luZGV4LAotCQkJCQl0eF9wb3dlci5zLnJhZGlvX3R4X2dhaW5bY10sCi0JCQkJCXR4X3Bvd2VyLnMuZHNwX3ByZWRpc19hdHRlbltjXSk7Ci0JCX0gLyogZm9yIGVhY2ggY2hhaW4gKi8KLQotCQl0eF9wb3dlcl90YmwtPnBvd2VyX3RibFtpXS5kdyA9IGNwdV90b19sZTMyKHR4X3Bvd2VyLmR3KTsKLQotCX0gLyogZm9yIGVhY2ggcmF0ZSAqLwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9zZW5kX3R4X3Bvd2VyIC0gQ29uZmlndXJlIHRoZSBUWFBPV0VSIGxldmVsIHVzZXIgbGltaXQKLSAqCi0gKiBVc2VzIHRoZSBhY3RpdmUgUlhPTiBmb3IgY2hhbm5lbCwgYmFuZCwgYW5kIGNoYXJhY3RlcmlzdGljcyAoaHQ0MCwgaGlnaCkKLSAqIFRoZSBwb3dlciBsaW1pdCBpcyB0YWtlbiBmcm9tIHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10LgotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2VuZF90eF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bDQ5NjVfdHhwb3dlcnRhYmxlX2NtZCBjbWQgPSB7IDAgfTsKLQlpbnQgcmV0OwotCXU4IGJhbmQgPSAwOwotCWJvb2wgaXNfaHQ0MCA9IGZhbHNlOwotCXU4IGN0cmxfY2hhbl9oaWdoID0gMDsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JaWYgKFdBUk5fT05DRSh0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyksCi0JCSAgICAgICJUWCBQb3dlciByZXF1ZXN0ZWQgd2hpbGUgc2Nhbm5pbmchXG4iKSkKLQkJcmV0dXJuIC1FQUdBSU47Ci0KLQliYW5kID0gcHJpdi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haOwotCi0JaXNfaHQ0MCA9IGl3NDk2NV9pc19odDQwX2NoYW5uZWwoY3R4LT5hY3RpdmUuZmxhZ3MpOwotCi0JaWYgKGlzX2h0NDAgJiYgKGN0eC0+YWN0aXZlLmZsYWdzICYgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0spKQotCQljdHJsX2NoYW5faGlnaCA9IDE7Ci0KLQljbWQuYmFuZCA9IGJhbmQ7Ci0JY21kLmNoYW5uZWwgPSBjdHgtPmFjdGl2ZS5jaGFubmVsOwotCi0JcmV0ID0gaXdsNDk2NV9maWxsX3R4cG93ZXJfdGJsKHByaXYsIGJhbmQsCi0JCQkJbGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCksCi0JCQkJaXNfaHQ0MCwgY3RybF9jaGFuX2hpZ2gsICZjbWQudHhfcG93ZXIpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwKLQkJCSBSRVBMWV9UWF9QV1JfVEFCTEVfQ01ELCBzaXplb2YoY21kKSwgJmNtZCk7Ci0KLW91dDoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2VuZF9yeG9uX2Fzc29jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCWludCByZXQgPSAwOwotCXN0cnVjdCBpd2w0OTY1X3J4b25fYXNzb2NfY21kIHJ4b25fYXNzb2M7Ci0JY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24xID0gJmN0eC0+c3RhZ2luZzsKLQljb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqcnhvbjIgPSAmY3R4LT5hY3RpdmU7Ci0KLQlpZiAoKHJ4b24xLT5mbGFncyA9PSByeG9uMi0+ZmxhZ3MpICYmCi0JICAgIChyeG9uMS0+ZmlsdGVyX2ZsYWdzID09IHJ4b24yLT5maWx0ZXJfZmxhZ3MpICYmCi0JICAgIChyeG9uMS0+Y2NrX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5jY2tfYmFzaWNfcmF0ZXMpICYmCi0JICAgIChyeG9uMS0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzID09Ci0JICAgICByeG9uMi0+b2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzKSAmJgotCSAgICAocnhvbjEtPm9mZG1faHRfZHVhbF9zdHJlYW1fYmFzaWNfcmF0ZXMgPT0KLQkgICAgIHJ4b24yLT5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzKSAmJgotCSAgICAocnhvbjEtPnJ4X2NoYWluID09IHJ4b24yLT5yeF9jaGFpbikgJiYKLQkgICAgKHJ4b24xLT5vZmRtX2Jhc2ljX3JhdGVzID09IHJ4b24yLT5vZmRtX2Jhc2ljX3JhdGVzKSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVXNpbmcgY3VycmVudCBSWE9OX0FTU09DLiAgTm90IHJlc2VuZGluZy5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlyeG9uX2Fzc29jLmZsYWdzID0gY3R4LT5zdGFnaW5nLmZsYWdzOwotCXJ4b25fYXNzb2MuZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKLQlyeG9uX2Fzc29jLm9mZG1fYmFzaWNfcmF0ZXMgPSBjdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlczsKLQlyeG9uX2Fzc29jLmNja19iYXNpY19yYXRlcyA9IGN0eC0+c3RhZ2luZy5jY2tfYmFzaWNfcmF0ZXM7Ci0Jcnhvbl9hc3NvYy5yZXNlcnZlZCA9IDA7Ci0Jcnhvbl9hc3NvYy5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgPQotCSAgICBjdHgtPnN0YWdpbmcub2ZkbV9odF9zaW5nbGVfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXJ4b25fYXNzb2Mub2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcyA9Ci0JICAgIGN0eC0+c3RhZ2luZy5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzOwotCXJ4b25fYXNzb2MucnhfY2hhaW5fc2VsZWN0X2ZsYWdzID0gY3R4LT5zdGFnaW5nLnJ4X2NoYWluOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMocHJpdiwgUkVQTFlfUlhPTl9BU1NPQywKLQkJCQkgICAgIHNpemVvZihyeG9uX2Fzc29jKSwgJnJ4b25fYXNzb2MsIE5VTEwpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X2NvbW1pdF9yeG9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQkvKiBjYXN0IGF3YXkgdGhlIGNvbnN0IGZvciBhY3RpdmVfcnhvbiBpbiB0aGlzIGZ1bmN0aW9uICovCi0Jc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKmFjdGl2ZV9yeG9uID0gKHZvaWQgKikmY3R4LT5hY3RpdmU7Ci0JaW50IHJldDsKLQlib29sIG5ld19hc3NvYyA9Ci0JCSEhKGN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJiBSWE9OX0ZJTFRFUl9BU1NPQ19NU0spOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKCFjdHgtPmlzX2FjdGl2ZSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBhbHdheXMgZ2V0IHRpbWVzdGFtcCB3aXRoIFJ4IGZyYW1lICovCi0JY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1RTRjJIT1NUX01TSzsKLQotCXJldCA9IGl3bF9sZWdhY3lfY2hlY2tfcnhvbl9jbWQocHJpdiwgY3R4KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkludmFsaWQgUlhPTiBjb25maWd1cmF0aW9uLiAgTm90IGNvbW1pdHRpbmcuXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JLyoKLQkgKiByZWNlaXZlIGNvbW1pdF9yeG9uIHJlcXVlc3QKLQkgKiBhYm9ydCBhbnkgcHJldmlvdXMgY2hhbm5lbCBzd2l0Y2ggaWYgc3RpbGwgaW4gcHJvY2VzcwotCSAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykgJiYKLQkgICAgKHByaXYtPnN3aXRjaF9jaGFubmVsICE9IGN0eC0+c3RhZ2luZy5jaGFubmVsKSkgewotCQlJV0xfREVCVUdfMTFIKHByaXYsICJhYm9ydCBjaGFubmVsIHN3aXRjaCBvbiAlZFxuIiwKLQkJICAgICAgbGUxNl90b19jcHUocHJpdi0+c3dpdGNoX2NoYW5uZWwpKTsKLQkJaXdsX2xlZ2FjeV9jaHN3aXRjaF9kb25lKHByaXYsIGZhbHNlKTsKLQl9Ci0KLQkvKiBJZiB3ZSBkb24ndCBuZWVkIHRvIHNlbmQgYSBmdWxsIFJYT04sIHdlIGNhbiB1c2UKLQkgKiBpd2xfcnhvbl9hc3NvY19jbWQgd2hpY2ggaXMgdXNlZCB0byByZWNvbmZpZ3VyZSBmaWx0ZXIKLQkgKiBhbmQgb3RoZXIgZmxhZ3MgZm9yIHRoZSBjdXJyZW50IHJhZGlvIGNvbmZpZ3VyYXRpb24uICovCi0JaWYgKCFpd2xfbGVnYWN5X2Z1bGxfcnhvbl9yZXF1aXJlZChwcml2LCBjdHgpKSB7Ci0JCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX2Fzc29jKHByaXYsIGN0eCk7Ci0JCWlmIChyZXQpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkVycm9yIHNldHRpbmcgUlhPTl9BU1NPQyAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCi0JCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwotCQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwgY3R4KTsKLQkJLyoKLQkJICogV2UgZG8gbm90IGNvbW1pdCB0eCBwb3dlciBzZXR0aW5ncyB3aGlsZSBjaGFubmVsIGNoYW5naW5nLAotCQkgKiBkbyBpdCBub3cgaWYgdHggcG93ZXIgY2hhbmdlZC4KLQkJICovCi0JCWl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogSWYgd2UgYXJlIGN1cnJlbnRseSBhc3NvY2lhdGVkIGFuZCB0aGUgbmV3IGNvbmZpZyByZXF1aXJlcwotCSAqIGFuIFJYT05fQVNTT0MgYW5kIHRoZSBuZXcgY29uZmlnIHdhbnRzIHRoZSBhc3NvY2lhdGVkIG1hc2sgZW5hYmxlZCwKLQkgKiB3ZSBtdXN0IGNsZWFyIHRoZSBhc3NvY2lhdGVkIGZyb20gdGhlIGFjdGl2ZSBjb25maWd1cmF0aW9uCi0JICogYmVmb3JlIHdlIGFwcGx5IHRoZSBuZXcgY29uZmlnICovCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSAmJiBuZXdfYXNzb2MpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlRvZ2dsaW5nIGFzc29jaWF0ZWQgYml0IG9uIGN1cnJlbnQgUlhPTlxuIik7Ci0JCWFjdGl2ZV9yeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQotCQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBjdHgtPnJ4b25fY21kLAotCQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQpLAotCQkJCSAgICAgICBhY3RpdmVfcnhvbik7Ci0KLQkJLyogSWYgdGhlIG1hc2sgY2xlYXJpbmcgZmFpbGVkIHRoZW4gd2Ugc2V0Ci0JCSAqIGFjdGl2ZV9yeG9uIGJhY2sgdG8gd2hhdCBpdCB3YXMgcHJldmlvdXNseSAqLwotCQlpZiAocmV0KSB7Ci0JCQlhY3RpdmVfcnhvbi0+ZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJCUlXTF9FUlIocHJpdiwgIkVycm9yIGNsZWFyaW5nIEFTU09DX01TSyAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQlpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zKHByaXYsIGN0eCk7Ci0JCWl3bF9sZWdhY3lfcmVzdG9yZV9zdGF0aW9ucyhwcml2LCBjdHgpOwotCQlyZXQgPSBpd2w0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhwcml2LCBjdHgpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gcmVzdG9yZSBXRVAga2V5cyAoJWQpXG4iLCByZXQpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJTZW5kaW5nIFJYT05cbiIKLQkJICAgICAgICIqIHdpdGglcyBSWE9OX0ZJTFRFUl9BU1NPQ19NU0tcbiIKLQkJICAgICAgICIqIGNoYW5uZWwgPSAlZFxuIgotCQkgICAgICAgIiogYnNzaWQgPSAlcE1cbiIsCi0JCSAgICAgICAobmV3X2Fzc29jID8gIiIgOiAib3V0IiksCi0JCSAgICAgICBsZTE2X3RvX2NwdShjdHgtPnN0YWdpbmcuY2hhbm5lbCksCi0JCSAgICAgICBjdHgtPnN0YWdpbmcuYnNzaWRfYWRkcik7Ci0KLQlpd2xfbGVnYWN5X3NldF9yeG9uX2h3Y3J5cHRvKHByaXYsIGN0eCwKLQkJCQkhcHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5zd19jcnlwdG8pOwotCi0JLyogQXBwbHkgdGhlIG5ldyBjb25maWd1cmF0aW9uCi0JICogUlhPTiB1bmFzc29jIGNsZWFycyB0aGUgc3RhdGlvbiB0YWJsZSBpbiB1Q29kZSBzbyByZXN0b3JhdGlvbiBvZgotCSAqIHN0YXRpb25zIGlzIG5lZWRlZCBhZnRlciBpdCAodGhlIFJYT04gY29tbWFuZCkgY29tcGxldGVzCi0JICovCi0JaWYgKCFuZXdfYXNzb2MpIHsKLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX2NtZCwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCksICZjdHgtPnN0YWdpbmcpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIG5ldyBSWE9OICglZClcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSZXR1cm4gZnJvbSAhbmV3X2Fzc29jIFJYT04uXG4iKTsKLQkJbWVtY3B5KGFjdGl2ZV9yeG9uLCAmY3R4LT5zdGFnaW5nLCBzaXplb2YoKmFjdGl2ZV9yeG9uKSk7Ci0JCWl3bF9sZWdhY3lfY2xlYXJfdWNvZGVfc3RhdGlvbnMocHJpdiwgY3R4KTsKLQkJaXdsX2xlZ2FjeV9yZXN0b3JlX3N0YXRpb25zKHByaXYsIGN0eCk7Ci0JCXJldCA9IGl3bDQ5NjVfcmVzdG9yZV9kZWZhdWx0X3dlcF9rZXlzKHByaXYsIGN0eCk7Ci0JCWlmIChyZXQpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byByZXN0b3JlIFdFUCBrZXlzICglZClcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCWlmIChuZXdfYXNzb2MpIHsKLQkJcHJpdi0+c3RhcnRfY2FsaWIgPSAwOwotCQkvKiBBcHBseSB0aGUgbmV3IGNvbmZpZ3VyYXRpb24KLQkJICogUlhPTiBhc3NvYyBkb2Vzbid0IGNsZWFyIHRoZSBzdGF0aW9uIHRhYmxlIGluIHVDb2RlLAotCQkgKi8KLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgY3R4LT5yeG9uX2NtZCwKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCksICZjdHgtPnN0YWdpbmcpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZXR0aW5nIG5ldyBSWE9OICglZClcbiIsIHJldCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JCW1lbWNweShhY3RpdmVfcnhvbiwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKCphY3RpdmVfcnhvbikpOwotCX0KLQlpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQocHJpdiwgY3R4KTsKLQotCWl3bDQ5NjVfaW5pdF9zZW5zaXRpdml0eShwcml2KTsKLQotCS8qIElmIHdlIGlzc3VlIGEgbmV3IFJYT04gY29tbWFuZCB3aGljaCByZXF1aXJlZCBhIHR1bmUgdGhlbiB3ZSBtdXN0Ci0JICogc2VuZCBhIG5ldyBUWFBPV0VSIGNvbW1hbmQgb3Igd2Ugd29uJ3QgYmUgYWJsZSB0byBUeCBhbnkgZnJhbWVzICovCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZXRfdHhfcG93ZXIocHJpdiwgcHJpdi0+dHhfcG93ZXJfbmV4dCwgdHJ1ZSk7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZW5kaW5nIFRYIHBvd2VyICglZClcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsNDk2NV9od19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCi17Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlpbnQgcmM7Ci0JdTggYmFuZCA9IDA7Ci0JYm9vbCBpc19odDQwID0gZmFsc2U7Ci0JdTggY3RybF9jaGFuX2hpZ2ggPSAwOwotCXN0cnVjdCBpd2w0OTY1X2NoYW5uZWxfc3dpdGNoX2NtZCBjbWQ7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0JdTMyIHN3aXRjaF90aW1lX2luX3VzZWMsIHVjb2RlX3N3aXRjaF90aW1lOwotCXUxNiBjaDsKLQl1MzIgdHNmX2xvdzsKLQl1OCBzd2l0Y2hfY291bnQ7Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCk7Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCWJhbmQgPSBwcml2LT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0KLQlpc19odDQwID0gaXc0OTY1X2lzX2h0NDBfY2hhbm5lbChjdHgtPnN0YWdpbmcuZmxhZ3MpOwotCi0JaWYgKGlzX2h0NDAgJiYKLQkgICAgKGN0eC0+c3RhZ2luZy5mbGFncyAmIFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLKSkKLQkJY3RybF9jaGFuX2hpZ2ggPSAxOwotCi0JY21kLmJhbmQgPSBiYW5kOwotCWNtZC5leHBlY3RfYmVhY29uID0gMDsKLQljaCA9IGNoX3N3aXRjaC0+Y2hhbm5lbC0+aHdfdmFsdWU7Ci0JY21kLmNoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7Ci0JY21kLnJ4b25fZmxhZ3MgPSBjdHgtPnN0YWdpbmcuZmxhZ3M7Ci0JY21kLnJ4b25fZmlsdGVyX2ZsYWdzID0gY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFnczsKLQlzd2l0Y2hfY291bnQgPSBjaF9zd2l0Y2gtPmNvdW50OwotCXRzZl9sb3cgPSBjaF9zd2l0Y2gtPnRpbWVzdGFtcCAmIDB4MGZmZmZmZmZmOwotCS8qCi0JICogY2FsY3VsYXRlIHRoZSB1Y29kZSBjaGFubmVsIHN3aXRjaCB0aW1lCi0JICogYWRkaW5nIFRTRiBhcyBvbmUgb2YgdGhlIGZhY3RvciBmb3Igd2hlbiB0byBzd2l0Y2gKLQkgKi8KLQlpZiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lID4gdHNmX2xvdykgJiYgYmVhY29uX2ludGVydmFsKSB7Ci0JCWlmIChzd2l0Y2hfY291bnQgPiAoKHByaXYtPnVjb2RlX2JlYWNvbl90aW1lIC0gdHNmX2xvdykgLwotCQkgICAgYmVhY29uX2ludGVydmFsKSkgewotCQkJc3dpdGNoX2NvdW50IC09IChwcml2LT51Y29kZV9iZWFjb25fdGltZSAtCi0JCQkJdHNmX2xvdykgLyBiZWFjb25faW50ZXJ2YWw7Ci0JCX0gZWxzZQotCQkJc3dpdGNoX2NvdW50ID0gMDsKLQl9Ci0JaWYgKHN3aXRjaF9jb3VudCA8PSAxKQotCQljbWQuc3dpdGNoX3RpbWUgPSBjcHVfdG9fbGUzMihwcml2LT51Y29kZV9iZWFjb25fdGltZSk7Ci0JZWxzZSB7Ci0JCXN3aXRjaF90aW1lX2luX3VzZWMgPQotCQkJdmlmLT5ic3NfY29uZi5iZWFjb25faW50ICogc3dpdGNoX2NvdW50ICogVElNRV9VTklUOwotCQl1Y29kZV9zd2l0Y2hfdGltZSA9IGl3bF9sZWdhY3lfdXNlY3NfdG9fYmVhY29ucyhwcml2LAotCQkJCQkJCSBzd2l0Y2hfdGltZV9pbl91c2VjLAotCQkJCQkJCSBiZWFjb25faW50ZXJ2YWwpOwotCQljbWQuc3dpdGNoX3RpbWUgPSBpd2xfbGVnYWN5X2FkZF9iZWFjb25fdGltZShwcml2LAotCQkJCQkJICAgICAgcHJpdi0+dWNvZGVfYmVhY29uX3RpbWUsCi0JCQkJCQkgICAgICB1Y29kZV9zd2l0Y2hfdGltZSwKLQkJCQkJCSAgICAgIGJlYWNvbl9pbnRlcnZhbCk7Ci0JfQotCUlXTF9ERUJVR18xMUgocHJpdiwgInVDb2RlIHRpbWUgZm9yIHRoZSBzd2l0Y2ggaXMgMHgleFxuIiwKLQkJICAgICAgY21kLnN3aXRjaF90aW1lKTsKLQljaF9pbmZvID0gaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIHByaXYtPmJhbmQsIGNoKTsKLQlpZiAoY2hfaW5mbykKLQkJY21kLmV4cGVjdF9iZWFjb24gPSBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfcmFkYXIoY2hfaW5mbyk7Ci0JZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgImludmFsaWQgY2hhbm5lbCBzd2l0Y2ggZnJvbSAldSB0byAldVxuIiwKLQkJCWN0eC0+YWN0aXZlLmNoYW5uZWwsIGNoKTsKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JfQotCi0JcmMgPSBpd2w0OTY1X2ZpbGxfdHhwb3dlcl90YmwocHJpdiwgYmFuZCwgY2gsIGlzX2h0NDAsCi0JCQkJICAgICAgY3RybF9jaGFuX2hpZ2gsICZjbWQudHhfcG93ZXIpOwotCWlmIChyYykgewotCQlJV0xfREVCVUdfMTFIKHByaXYsICJlcnJvcjolZCAgZmlsbCB0eHBvd2VyX3RibFxuIiwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsCi0JCQkgUkVQTFlfQ0hBTk5FTF9TV0lUQ0gsIHNpemVvZihjbWQpLCAmY21kKTsKLX0KLQotLyoqCi0gKiBpd2w0OTY1X3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsIC0gU2V0IHVwIGVudHJ5IGluIFR4IGJ5dGUtY291bnQgYXJyYXkKLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV90eHFfdXBkYXRlX2J5dGVfY250X3RibChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJCSAgICB1MTYgYnl0ZV9jbnQpCi17Ci0Jc3RydWN0IGl3bDQ5NjVfc2NkX2JjX3RibCAqc2NkX2JjX3RibCA9IHByaXYtPnNjZF9iY190YmxzLmFkZHI7Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKLQlpbnQgd3JpdGVfcHRyID0gdHhxLT5xLndyaXRlX3B0cjsKLQlpbnQgbGVuID0gYnl0ZV9jbnQgKyBJV0xfVFhfQ1JDX1NJWkUgKyBJV0xfVFhfREVMSU1JVEVSX1NJWkU7Ci0JX19sZTE2IGJjX2VudDsKLQotCVdBUk5fT04obGVuID4gMHhGRkYgfHwgd3JpdGVfcHRyID49IFRGRF9RVUVVRV9TSVpFX01BWCk7Ci0KLQliY19lbnQgPSBjcHVfdG9fbGUxNihsZW4gJiAweEZGRik7Ci0JLyogU2V0IHVwIGJ5dGUgY291bnQgd2l0aGluIGZpcnN0IDI1NiBlbnRyaWVzICovCi0Jc2NkX2JjX3RibFt0eHFfaWRdLnRmZF9vZmZzZXRbd3JpdGVfcHRyXSA9IGJjX2VudDsKLQotCS8qIElmIHdpdGhpbiBmaXJzdCA2NCBlbnRyaWVzLCBkdXBsaWNhdGUgYXQgZW5kICovCi0JaWYgKHdyaXRlX3B0ciA8IFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKLQkJc2NkX2JjX3RibFt0eHFfaWRdLgotCQkJdGZkX29mZnNldFtURkRfUVVFVUVfU0laRV9NQVggKyB3cml0ZV9wdHJdID0gYmNfZW50OwotfQotCi0vKioKLSAqIGl3bDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlIC0gcmV0dXJuIHRoZSBjYWxpYnJhdGVkIHRlbXBlcmF0dXJlIChpbiBLZWx2aW4pCi0gKiBAc3RhdGlzdGljczogUHJvdmlkZXMgdGhlIHRlbXBlcmF0dXJlIHJlYWRpbmcgZnJvbSB0aGUgdUNvZGUKLSAqCi0gKiBBIHJldHVybiBvZiA8MCBpbmRpY2F0ZXMgYm9ndXMgZGF0YSBpbiB0aGUgc3RhdGlzdGljcwotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfaHdfZ2V0X3RlbXBlcmF0dXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzMzIgdGVtcGVyYXR1cmU7Ci0JczMyIHZ0OwotCXMzMiBSMSwgUjIsIFIzOwotCXUzMiBSNDsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfVEVNUEVSQVRVUkUsICZwcml2LT5zdGF0dXMpICYmCi0JICAgIChwcml2LT5fNDk2NS5zdGF0aXN0aWNzLmZsYWcgJgotCQkJU1RBVElTVElDU19SRVBMWV9GTEdfSFQ0MF9NT0RFX01TSykpIHsKLQkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlJ1bm5pbmcgSFQ0MCB0ZW1wZXJhdHVyZSBjYWxpYnJhdGlvblxuIik7Ci0JCVIxID0gKHMzMilsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjFbMV0pOwotCQlSMiA9IChzMzIpbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IyWzFdKTsKLQkJUjMgPSAoczMyKWxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yM1sxXSk7Ci0JCVI0ID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3I0WzFdKTsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfVEVNUChwcml2LCAiUnVubmluZyB0ZW1wZXJhdHVyZSBjYWxpYnJhdGlvblxuIik7Ci0JCVIxID0gKHMzMilsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQudGhlcm1fcjFbMF0pOwotCQlSMiA9IChzMzIpbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3IyWzBdKTsKLQkJUjMgPSAoczMyKWxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmVfaW5pdC50aGVybV9yM1swXSk7Ci0JCVI0ID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LnRoZXJtX3I0WzBdKTsKLQl9Ci0KLQkvKgotCSAqIFRlbXBlcmF0dXJlIGlzIG9ubHkgMjMgYml0cywgc28gc2lnbiBleHRlbmQgb3V0IHRvIDMyLgotCSAqCi0JICogTk9URSBJZiB3ZSBoYXZlbid0IHJlY2VpdmVkIGEgc3RhdGlzdGljcyBub3RpZmljYXRpb24geWV0Ci0JICogd2l0aCBhbiB1cGRhdGVkIHRlbXBlcmF0dXJlLCB1c2UgUjQgcHJvdmlkZWQgdG8gdXMgaW4gdGhlCi0JICogImluaXRpYWxpemUiIEFMSVZFIHJlc3BvbnNlLgotCSAqLwotCWlmICghdGVzdF9iaXQoU1RBVFVTX1RFTVBFUkFUVVJFLCAmcHJpdi0+c3RhdHVzKSkKLQkJdnQgPSBzaWduX2V4dGVuZDMyKFI0LCAyMyk7Ci0JZWxzZQotCQl2dCA9IHNpZ25fZXh0ZW5kMzIobGUzMl90b19jcHUocHJpdi0+XzQ5NjUuc3RhdGlzdGljcy4KLQkJCQkgZ2VuZXJhbC5jb21tb24udGVtcGVyYXR1cmUpLCAyMyk7Ci0KLQlJV0xfREVCVUdfVEVNUChwcml2LCAiQ2FsaWIgdmFsdWVzIFJbMS0zXTogJWQgJWQgJWQgUjQ6ICVkXG4iLCBSMSwgUjIsIFIzLCB2dCk7Ci0KLQlpZiAoUjMgPT0gUjEpIHsKLQkJSVdMX0VSUihwcml2LCAiQ2FsaWJyYXRpb24gY29uZmxpY3QgUjEgPT0gUjNcbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyogQ2FsY3VsYXRlIHRlbXBlcmF0dXJlIGluIGRlZ3JlZXMgS2VsdmluLCBhZGp1c3QgYnkgOTclLgotCSAqIEFkZCBvZmZzZXQgdG8gY2VudGVyIHRoZSBhZGp1c3RtZW50IGFyb3VuZCAwIGRlZ3JlZXMgQ2VudGlncmFkZS4gKi8KLQl0ZW1wZXJhdHVyZSA9IFRFTVBFUkFUVVJFX0NBTElCX0FfVkFMICogKHZ0IC0gUjIpOwotCXRlbXBlcmF0dXJlIC89IChSMyAtIFIxKTsKLQl0ZW1wZXJhdHVyZSA9ICh0ZW1wZXJhdHVyZSAqIDk3KSAvIDEwMCArIFRFTVBFUkFUVVJFX0NBTElCX0tFTFZJTl9PRkZTRVQ7Ci0KLQlJV0xfREVCVUdfVEVNUChwcml2LCAiQ2FsaWJyYXRlZCB0ZW1wZXJhdHVyZTogJWRLLCAlZENcbiIsCi0JCQl0ZW1wZXJhdHVyZSwgS0VMVklOX1RPX0NFTFNJVVModGVtcGVyYXR1cmUpKTsKLQotCXJldHVybiB0ZW1wZXJhdHVyZTsKLX0KLQotLyogQWRqdXN0IFR4cG93ZXIgb25seSBpZiB0ZW1wZXJhdHVyZSB2YXJpYW5jZSBpcyBncmVhdGVyIHRoYW4gdGhyZXNob2xkLiAqLwotI2RlZmluZSBJV0xfVEVNUEVSQVRVUkVfVEhSRVNIT0xEICAgMwotCi0vKioKLSAqIGl3bDQ5NjVfaXNfdGVtcF9jYWxpYl9uZWVkZWQgLSBkZXRlcm1pbmVzIGlmIG5ldyBjYWxpYnJhdGlvbiBpcyBuZWVkZWQKLSAqCi0gKiBJZiB0aGUgdGVtcGVyYXR1cmUgY2hhbmdlZCBoYXMgY2hhbmdlZCBzdWZmaWNpZW50bHksIHRoZW4gYSByZWNhbGlicmF0aW9uCi0gKiBpcyBuZWVkZWQuCi0gKgotICogQXNzdW1lcyBjYWxsZXIgd2lsbCByZXBsYWNlIHByaXYtPmxhc3RfdGVtcGVyYXR1cmUgb25jZSBjYWxpYnJhdGlvbgotICogZXhlY3V0ZWQuCi0gKi8KLXN0YXRpYyBpbnQgaXdsNDk2NV9pc190ZW1wX2NhbGliX25lZWRlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHRlbXBfZGlmZjsKLQotCWlmICghdGVzdF9iaXQoU1RBVFVTX1NUQVRJU1RJQ1MsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9ERUJVR19URU1QKHByaXYsICJUZW1wZXJhdHVyZSBub3QgdXBkYXRlZCAtLSBubyBzdGF0aXN0aWNzLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCXRlbXBfZGlmZiA9IHByaXYtPnRlbXBlcmF0dXJlIC0gcHJpdi0+bGFzdF90ZW1wZXJhdHVyZTsKLQotCS8qIGdldCBhYnNvbHV0ZSB2YWx1ZSAqLwotCWlmICh0ZW1wX2RpZmYgPCAwKSB7Ci0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiR2V0dGluZyBjb29sZXIsIGRlbHRhICVkXG4iLCB0ZW1wX2RpZmYpOwotCQl0ZW1wX2RpZmYgPSAtdGVtcF9kaWZmOwotCX0gZWxzZSBpZiAodGVtcF9kaWZmID09IDApCi0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiVGVtcGVyYXR1cmUgdW5jaGFuZ2VkXG4iKTsKLQllbHNlCi0JCUlXTF9ERUJVR19QT1dFUihwcml2LCAiR2V0dGluZyB3YXJtZXIsIGRlbHRhICVkXG4iLCB0ZW1wX2RpZmYpOwotCi0JaWYgKHRlbXBfZGlmZiA8IElXTF9URU1QRVJBVFVSRV9USFJFU0hPTEQpIHsKLQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICIgPT4gdGhlcm1hbCB0eHBvd2VyIGNhbGliIG5vdCBuZWVkZWRcbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIiA9PiB0aGVybWFsIHR4cG93ZXIgY2FsaWIgbmVlZGVkXG4iKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3RlbXBlcmF0dXJlX2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzMzIgdGVtcDsKLQotCXRlbXAgPSBpd2w0OTY1X2h3X2dldF90ZW1wZXJhdHVyZShwcml2KTsKLQlpZiAoSVdMX1RYX1BPV0VSX1RFTVBFUkFUVVJFX09VVF9PRl9SQU5HRSh0ZW1wKSkKLQkJcmV0dXJuOwotCi0JaWYgKHByaXYtPnRlbXBlcmF0dXJlICE9IHRlbXApIHsKLQkJaWYgKHByaXYtPnRlbXBlcmF0dXJlKQotCQkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlRlbXBlcmF0dXJlIGNoYW5nZWQgIgotCQkJCSAgICAgICAiZnJvbSAlZEMgdG8gJWRDXG4iLAotCQkJCSAgICAgICBLRUxWSU5fVE9fQ0VMU0lVUyhwcml2LT50ZW1wZXJhdHVyZSksCi0JCQkJICAgICAgIEtFTFZJTl9UT19DRUxTSVVTKHRlbXApKTsKLQkJZWxzZQotCQkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIlRlbXBlcmF0dXJlICIKLQkJCQkgICAgICAgImluaXRpYWxpemVkIHRvICVkQ1xuIiwKLQkJCQkgICAgICAgS0VMVklOX1RPX0NFTFNJVVModGVtcCkpOwotCX0KLQotCXByaXYtPnRlbXBlcmF0dXJlID0gdGVtcDsKLQlzZXRfYml0KFNUQVRVU19URU1QRVJBVFVSRSwgJnByaXYtPnN0YXR1cyk7Ci0KLQlpZiAoIXByaXYtPmRpc2FibGVfdHhfcG93ZXJfY2FsICYmCi0JICAgICB1bmxpa2VseSghdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgJiYKLQkgICAgIGl3bDQ5NjVfaXNfdGVtcF9jYWxpYl9uZWVkZWQocHJpdikpCi0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+dHhwb3dlcl93b3JrKTsKLX0KLQotc3RhdGljIHUxNiBpd2w0OTY1X2dldF9oY21kX3NpemUodTggY21kX2lkLCB1MTYgbGVuKQotewotCXN3aXRjaCAoY21kX2lkKSB7Ci0JY2FzZSBSRVBMWV9SWE9OOgotCQlyZXR1cm4gKHUxNikgc2l6ZW9mKHN0cnVjdCBpd2w0OTY1X3J4b25fY21kKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gbGVuOwotCX0KLX0KLQotc3RhdGljIHUxNiBpd2w0OTY1X2J1aWxkX2FkZHN0YV9oY21kKGNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgKmNtZCwKLQkJCQkJCQkJdTggKmRhdGEpCi17Ci0Jc3RydWN0IGl3bDQ5NjVfYWRkc3RhX2NtZCAqYWRkc3RhID0gKHN0cnVjdCBpd2w0OTY1X2FkZHN0YV9jbWQgKilkYXRhOwotCWFkZHN0YS0+bW9kZSA9IGNtZC0+bW9kZTsKLQltZW1jcHkoJmFkZHN0YS0+c3RhLCAmY21kLT5zdGEsIHNpemVvZihzdHJ1Y3Qgc3RhX2lkX21vZGlmeSkpOwotCW1lbWNweSgmYWRkc3RhLT5rZXksICZjbWQtPmtleSwgc2l6ZW9mKHN0cnVjdCBpd2w0OTY1X2tleWluZm8pKTsKLQlhZGRzdGEtPnN0YXRpb25fZmxhZ3MgPSBjbWQtPnN0YXRpb25fZmxhZ3M7Ci0JYWRkc3RhLT5zdGF0aW9uX2ZsYWdzX21zayA9IGNtZC0+c3RhdGlvbl9mbGFnc19tc2s7Ci0JYWRkc3RhLT50aWRfZGlzYWJsZV90eCA9IGNtZC0+dGlkX2Rpc2FibGVfdHg7Ci0JYWRkc3RhLT5hZGRfaW1tZWRpYXRlX2JhX3RpZCA9IGNtZC0+YWRkX2ltbWVkaWF0ZV9iYV90aWQ7Ci0JYWRkc3RhLT5yZW1vdmVfaW1tZWRpYXRlX2JhX3RpZCA9IGNtZC0+cmVtb3ZlX2ltbWVkaWF0ZV9iYV90aWQ7Ci0JYWRkc3RhLT5hZGRfaW1tZWRpYXRlX2JhX3NzbiA9IGNtZC0+YWRkX2ltbWVkaWF0ZV9iYV9zc247Ci0JYWRkc3RhLT5zbGVlcF90eF9jb3VudCA9IGNtZC0+c2xlZXBfdHhfY291bnQ7Ci0JYWRkc3RhLT5yZXNlcnZlZDEgPSBjcHVfdG9fbGUxNigwKTsKLQlhZGRzdGEtPnJlc2VydmVkMiA9IGNwdV90b19sZTE2KDApOwotCi0JcmV0dXJuICh1MTYpc2l6ZW9mKHN0cnVjdCBpd2w0OTY1X2FkZHN0YV9jbWQpOwotfQotCi1zdGF0aWMgaW5saW5lIHUzMiBpd2w0OTY1X2dldF9zY2Rfc3NuKHN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgKnR4X3Jlc3ApCi17Ci0JcmV0dXJuIGxlMzJfdG9fY3B1cCgmdHhfcmVzcC0+dS5zdGF0dXMgKyB0eF9yZXNwLT5mcmFtZV9jb3VudCkgJiBNQVhfU047Ci19Ci0KLS8qKgotICogaXdsNDk2NV90eF9zdGF0dXNfcmVwbHlfdHggLSBIYW5kbGUgVHggcmVzcG9uc2UgZm9yIGZyYW1lcyBpbiBhZ2dyZWdhdGlvbiBxdWV1ZQotICovCi1zdGF0aWMgaW50IGl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X3R4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnLAotCQkJCSAgICAgIHN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgKnR4X3Jlc3AsCi0JCQkJICAgICAgaW50IHR4cV9pZCwgdTE2IHN0YXJ0X2lkeCkKLXsKLQl1MTYgc3RhdHVzOwotCXN0cnVjdCBhZ2dfdHhfc3RhdHVzICpmcmFtZV9zdGF0dXMgPSB0eF9yZXNwLT51LmFnZ19zdGF0dXM7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gTlVMTDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gTlVMTDsKLQl1MzIgcmF0ZV9uX2ZsYWdzID0gbGUzMl90b19jcHUodHhfcmVzcC0+cmF0ZV9uX2ZsYWdzKTsKLQlpbnQgaSwgc2gsIGlkeDsKLQl1MTYgc2VxOwotCWlmIChhZ2ctPndhaXRfZm9yX2JhKQotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgImdvdCB0eCByZXNwb25zZSB3L28gYmxvY2stYWNrXG4iKTsKLQotCWFnZy0+ZnJhbWVfY291bnQgPSB0eF9yZXNwLT5mcmFtZV9jb3VudDsKLQlhZ2ctPnN0YXJ0X2lkeCA9IHN0YXJ0X2lkeDsKLQlhZ2ctPnJhdGVfbl9mbGFncyA9IHJhdGVfbl9mbGFnczsKLQlhZ2ctPmJpdG1hcCA9IDA7Ci0KLQkvKiBudW0gZnJhbWVzIGF0dGVtcHRlZCBieSBUeCBjb21tYW5kICovCi0JaWYgKGFnZy0+ZnJhbWVfY291bnQgPT0gMSkgewotCQkvKiBPbmx5IG9uZSBmcmFtZSB3YXMgYXR0ZW1wdGVkOyBubyBibG9jay1hY2sgd2lsbCBhcnJpdmUgKi8KLQkJc3RhdHVzID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzWzBdLnN0YXR1cyk7Ci0JCWlkeCA9IHN0YXJ0X2lkeDsKLQotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkZyYW1lQ250ID0gJWQsIFN0YXJ0SWR4PSVkIGlkeD0lZFxuIiwKLQkJCQkgICBhZ2ctPmZyYW1lX2NvdW50LCBhZ2ctPnN0YXJ0X2lkeCwgaWR4KTsKLQotCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihwcml2LT50eHFbdHhxX2lkXS50eGJbaWR4XS5za2IpOwotCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSB0eF9yZXNwLT5mYWlsdXJlX2ZyYW1lICsgMTsKLQkJaW5mby0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9UWF9DVExfQU1QRFU7Ci0JCWluZm8tPmZsYWdzIHw9IGl3bDQ5NjVfdHhfc3RhdHVzX3RvX21hYzgwMjExKHN0YXR1cyk7Ci0JCWl3bDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2wocHJpdiwgcmF0ZV9uX2ZsYWdzLCBpbmZvKTsKLQotCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIjEgRnJhbWUgMHgleCBmYWlsdXJlIDolZFxuIiwKLQkJCQkgICAgc3RhdHVzICYgMHhmZiwgdHhfcmVzcC0+ZmFpbHVyZV9mcmFtZSk7Ci0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiUmF0ZSBJbmZvIHJhdGVfbl9mbGFncz0leFxuIiwgcmF0ZV9uX2ZsYWdzKTsKLQotCQlhZ2ctPndhaXRfZm9yX2JhID0gMDsKLQl9IGVsc2UgewotCQkvKiBUd28gb3IgbW9yZSBmcmFtZXMgd2VyZSBhdHRlbXB0ZWQ7IGV4cGVjdCBibG9jay1hY2sgKi8KLQkJdTY0IGJpdG1hcCA9IDA7Ci0JCWludCBzdGFydCA9IGFnZy0+c3RhcnRfaWR4OwotCi0JCS8qIENvbnN0cnVjdCBiaXQtbWFwIG9mIHBlbmRpbmcgZnJhbWVzIHdpdGhpbiBUeCB3aW5kb3cgKi8KLQkJZm9yIChpID0gMDsgaSA8IGFnZy0+ZnJhbWVfY291bnQ7IGkrKykgewotCQkJdTE2IHNjOwotCQkJc3RhdHVzID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzW2ldLnN0YXR1cyk7Ci0JCQlzZXEgID0gbGUxNl90b19jcHUoZnJhbWVfc3RhdHVzW2ldLnNlcXVlbmNlKTsKLQkJCWlkeCA9IFNFUV9UT19JTkRFWChzZXEpOwotCQkJdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcSk7Ci0KLQkJCWlmIChzdGF0dXMgJiAoQUdHX1RYX1NUQVRFX0ZFV19CWVRFU19NU0sgfAotCQkJCSAgICAgIEFHR19UWF9TVEFURV9BQk9SVF9NU0spKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIkZyYW1lQ250ID0gJWQsIHR4cV9pZD0lZCBpZHg9JWRcbiIsCi0JCQkJCSAgIGFnZy0+ZnJhbWVfY291bnQsIHR4cV9pZCwgaWR4KTsKLQotCQkJaGRyID0gaXdsX2xlZ2FjeV90eF9xdWV1ZV9nZXRfaGRyKHByaXYsIHR4cV9pZCwgaWR4KTsKLQkJCWlmICghaGRyKSB7Ci0JCQkJSVdMX0VSUihwcml2LAotCQkJCQkiQlVHX09OIGlkeCBkb2Vzbid0IHBvaW50IHRvIHZhbGlkIHNrYiIKLQkJCQkJIiBpZHg9JWQsIHR4cV9pZD0lZFxuIiwgaWR4LCB0eHFfaWQpOwotCQkJCXJldHVybiAtMTsKLQkJCX0KLQotCQkJc2MgPSBsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKTsKLQkJCWlmIChpZHggIT0gKFNFUV9UT19TTihzYykgJiAweGZmKSkgewotCQkJCUlXTF9FUlIocHJpdiwKLQkJCQkJIkJVR19PTiBpZHggZG9lc24ndCBtYXRjaCBzZXEgY29udHJvbCIKLQkJCQkJIiBpZHg9JWQsIHNlcV9pZHg9JWQsIHNlcT0lZFxuIiwKLQkJCQkJaWR4LCBTRVFfVE9fU04oc2MpLCBoZHItPnNlcV9jdHJsKTsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiQUdHIEZyYW1lIGk9JWQgaWR4ICVkIHNlcT0lZFxuIiwKLQkJCQkJICAgaSwgaWR4LCBTRVFfVE9fU04oc2MpKTsKLQotCQkJc2ggPSBpZHggLSBzdGFydDsKLQkJCWlmIChzaCA+IDY0KSB7Ci0JCQkJc2ggPSAoc3RhcnQgLSBpZHgpICsgMHhmZjsKLQkJCQliaXRtYXAgPSBiaXRtYXAgPDwgc2g7Ci0JCQkJc2ggPSAwOwotCQkJCXN0YXJ0ID0gaWR4OwotCQkJfSBlbHNlIGlmIChzaCA8IC02NCkKLQkJCQlzaCAgPSAweGZmIC0gKHN0YXJ0IC0gaWR4KTsKLQkJCWVsc2UgaWYgKHNoIDwgMCkgewotCQkJCXNoID0gc3RhcnQgLSBpZHg7Ci0JCQkJc3RhcnQgPSBpZHg7Ci0JCQkJYml0bWFwID0gYml0bWFwIDw8IHNoOwotCQkJCXNoID0gMDsKLQkJCX0KLQkJCWJpdG1hcCB8PSAxVUxMIDw8IHNoOwotCQkJSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJzdGFydD0lZCBiaXRtYXA9MHglbGx4XG4iLAotCQkJCQkgICBzdGFydCwgKHVuc2lnbmVkIGxvbmcgbG9uZyliaXRtYXApOwotCQl9Ci0KLQkJYWdnLT5iaXRtYXAgPSBiaXRtYXA7Ci0JCWFnZy0+c3RhcnRfaWR4ID0gc3RhcnQ7Ci0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiRnJhbWVzICVkIHN0YXJ0X2lkeD0lZCBiaXRtYXA9MHglbGx4XG4iLAotCQkJCSAgIGFnZy0+ZnJhbWVfY291bnQsIGFnZy0+c3RhcnRfaWR4LAotCQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpYWdnLT5iaXRtYXApOwotCi0JCWlmIChiaXRtYXApCi0JCQlhZ2ctPndhaXRfZm9yX2JhID0gMTsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB1OCBpd2w0OTY1X2ZpbmRfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNvbnN0IHU4ICphZGRyKQotewotCWludCBpOwotCWludCBzdGFydCA9IDA7Ci0JaW50IHJldCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykpCi0JCXN0YXJ0ID0gSVdMX1NUQV9JRDsKLQotCWlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihhZGRyKSkKLQkJcmV0dXJuIHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCWZvciAoaSA9IHN0YXJ0OyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKQotCQlpZiAocHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmJgotCQkgICAgKCFjb21wYXJlX2V0aGVyX2FkZHIocHJpdi0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyLAotCQkJCQkgYWRkcikpKSB7Ci0JCQlyZXQgPSBpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQotCUlXTF9ERUJVR19BU1NPQ19MSU1JVChwcml2LCAiY2FuIG5vdCBmaW5kIFNUQSAlcE0gdG90YWwgJWRcbiIsCi0JCQkgICAgICBhZGRyLCBwcml2LT5udW1fc3RhdGlvbnMpOwotCi0gb3V0OgotCS8qCi0JICogSXQgbWF5IGJlIHBvc3NpYmxlIHRoYXQgbW9yZSBjb21tYW5kcyBpbnRlcmFjdGluZyB3aXRoIHN0YXRpb25zCi0JICogYXJyaXZlIGJlZm9yZSB3ZSBjb21wbGV0ZWQgcHJvY2Vzc2luZyB0aGUgYWRkaW5nIG9mCi0JICogc3RhdGlvbgotCSAqLwotCWlmIChyZXQgIT0gSVdMX0lOVkFMSURfU1RBVElPTiAmJgotCSAgICAoIShwcml2LT5zdGF0aW9uc1tyZXRdLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkgfHwKLQkgICAgICgocHJpdi0+c3RhdGlvbnNbcmV0XS51c2VkICYgSVdMX1NUQV9VQ09ERV9BQ1RJVkUpICYmCi0JICAgICAgKHByaXYtPnN0YXRpb25zW3JldF0udXNlZCAmIElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUykpKSkgewotCQlJV0xfRVJSKHByaXYsICJSZXF1ZXN0ZWQgc3RhdGlvbiBpbmZvIGZvciBzdGEgJWQgYmVmb3JlIHJlYWR5LlxuIiwKLQkJCXJldCk7Ci0JCXJldCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X2dldF9yYV9zdGFfaWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyKQotewotCWlmIChwcml2LT5pd19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKLQkJcmV0dXJuIElXTF9BUF9JRDsKLQl9IGVsc2UgewotCQl1OCAqZGEgPSBpZWVlODAyMTFfZ2V0X0RBKGhkcik7Ci0JCXJldHVybiBpd2w0OTY1X2ZpbmRfc3RhdGlvbihwcml2LCBkYSk7Ci0JfQotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnhfcmVwbHlfdHggLSBIYW5kbGUgc3RhbmRhcmQgKG5vbi1hZ2dyZWdhdGlvbikgVHggcmVzcG9uc2UKLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9yeF9yZXBseV90eChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0JdTE2IHNlcXVlbmNlID0gbGUxNl90b19jcHUocGt0LT5oZHIuc2VxdWVuY2UpOwotCWludCB0eHFfaWQgPSBTRVFfVE9fUVVFVUUoc2VxdWVuY2UpOwotCWludCBpbmRleCA9IFNFUV9UT19JTkRFWChzZXF1ZW5jZSk7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwotCXN0cnVjdCBpd2w0OTY1X3R4X3Jlc3AgKnR4X3Jlc3AgPSAodm9pZCAqKSZwa3QtPnUucmF3WzBdOwotCXUzMiAgc3RhdHVzID0gbGUzMl90b19jcHUodHhfcmVzcC0+dS5zdGF0dXMpOwotCWludCB1bmluaXRpYWxpemVkX3Zhcih0aWQpOwotCWludCBzdGFfaWQ7Ci0JaW50IGZyZWVkOwotCXU4ICpxYyA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICgoaW5kZXggPj0gdHhxLT5xLm5fYmQpIHx8IChpd2xfbGVnYWN5X3F1ZXVlX3VzZWQoJnR4cS0+cSwgaW5kZXgpID09IDApKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlJlYWQgaW5kZXggZm9yIERNQSBxdWV1ZSB0eHFfaWQgKCVkKSBpbmRleCAlZCAiCi0JCQkgICJpcyBvdXQgb2YgcmFuZ2UgWzAtJWRdICVkICVkXG4iLCB0eHFfaWQsCi0JCQkgIGluZGV4LCB0eHEtPnEubl9iZCwgdHhxLT5xLndyaXRlX3B0ciwKLQkJCSAgdHhxLT5xLnJlYWRfcHRyKTsKLQkJcmV0dXJuOwotCX0KLQotCXR4cS0+dGltZV9zdGFtcCA9IGppZmZpZXM7Ci0JaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHhxLT50eGJbdHhxLT5xLnJlYWRfcHRyXS5za2IpOwotCW1lbXNldCgmaW5mby0+c3RhdHVzLCAwLCBzaXplb2YoaW5mby0+c3RhdHVzKSk7Ci0KLQloZHIgPSBpd2xfbGVnYWN5X3R4X3F1ZXVlX2dldF9oZHIocHJpdiwgdHhxX2lkLCBpbmRleCk7Ci0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0JCXRpZCA9IHFjWzBdICYgMHhmOwotCX0KLQotCXN0YV9pZCA9IGl3bDQ5NjVfZ2V0X3JhX3N0YV9pZChwcml2LCBoZHIpOwotCWlmICh0eHEtPnNjaGVkX3JldHJ5ICYmIHVubGlrZWx5KHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkgewotCQlJV0xfRVJSKHByaXYsICJTdGF0aW9uIG5vdCBrbm93blxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlpZiAodHhxLT5zY2hlZF9yZXRyeSkgewotCQljb25zdCB1MzIgc2NkX3NzbiA9IGl3bDQ5NjVfZ2V0X3NjZF9zc24odHhfcmVzcCk7Ci0JCXN0cnVjdCBpd2xfaHRfYWdnICphZ2cgPSBOVUxMOwotCQlXQVJOX09OKCFxYyk7Ci0KLQkJYWdnID0gJnByaXYtPnN0YXRpb25zW3N0YV9pZF0udGlkW3RpZF0uYWdnOwotCi0JCWl3bDQ5NjVfdHhfc3RhdHVzX3JlcGx5X3R4KHByaXYsIGFnZywgdHhfcmVzcCwgdHhxX2lkLCBpbmRleCk7Ci0KLQkJLyogY2hlY2sgaWYgQkFSIGlzIG5lZWRlZCAqLwotCQlpZiAoKHR4X3Jlc3AtPmZyYW1lX2NvdW50ID09IDEpICYmICFpd2w0OTY1X2lzX3R4X3N1Y2Nlc3Moc3RhdHVzKSkKLQkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9TVEFUX0FNUERVX05PX0JBQ0s7Ci0KLQkJaWYgKHR4cS0+cS5yZWFkX3B0ciAhPSAoc2NkX3NzbiAmIDB4ZmYpKSB7Ci0JCQlpbmRleCA9IGl3bF9sZWdhY3lfcXVldWVfZGVjX3dyYXAoc2NkX3NzbiAmIDB4ZmYsCi0JCQkJCQkJCXR4cS0+cS5uX2JkKTsKLQkJCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiUmV0cnkgc2NoZWR1bGVyIHJlY2xhaW0gc2NkX3NzbiAiCi0JCQkJCSAgICIlZCBpbmRleCAlZFxuIiwgc2NkX3NzbiAsIGluZGV4KTsKLQkJCWZyZWVkID0gaXdsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHByaXYsIHR4cV9pZCwgaW5kZXgpOwotCQkJaWYgKHFjKQotCQkJCWl3bDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHByaXYsIHN0YV9pZCwKLQkJCQkJCSAgICAgICB0aWQsIGZyZWVkKTsKLQotCQkJaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgJiYKLQkJCSAgICAoaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZSgmdHhxLT5xKSA+IHR4cS0+cS5sb3dfbWFyaykKLQkJCQkgJiYgKGFnZy0+c3RhdGUgIT0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKSkKLQkJCQlpd2xfbGVnYWN5X3dha2VfcXVldWUocHJpdiwgdHhxKTsKLQkJfQotCX0gZWxzZSB7Ci0JCWluZm8tPnN0YXR1cy5yYXRlc1swXS5jb3VudCA9IHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUgKyAxOwotCQlpbmZvLT5mbGFncyB8PSBpd2w0OTY1X3R4X3N0YXR1c190b19tYWM4MDIxMShzdGF0dXMpOwotCQlpd2w0OTY1X2h3cmF0ZV90b190eF9jb250cm9sKHByaXYsCi0JCQkJCWxlMzJfdG9fY3B1KHR4X3Jlc3AtPnJhdGVfbl9mbGFncyksCi0JCQkJCWluZm8pOwotCi0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiVFhRICVkIHN0YXR1cyAlcyAoMHglMDh4KSAiCi0JCQkJICAgInJhdGVfbl9mbGFncyAweCV4IHJldHJpZXMgJWRcbiIsCi0JCQkJICAgdHhxX2lkLAotCQkJCSAgIGl3bDQ5NjVfZ2V0X3R4X2ZhaWxfcmVhc29uKHN0YXR1cyksIHN0YXR1cywKLQkJCQkgICBsZTMyX3RvX2NwdSh0eF9yZXNwLT5yYXRlX25fZmxhZ3MpLAotCQkJCSAgIHR4X3Jlc3AtPmZhaWx1cmVfZnJhbWUpOwotCi0JCWZyZWVkID0gaXdsNDk2NV90eF9xdWV1ZV9yZWNsYWltKHByaXYsIHR4cV9pZCwgaW5kZXgpOwotCQlpZiAocWMgJiYgbGlrZWx5KHN0YV9pZCAhPSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKLQkJCWl3bDQ5NjVfZnJlZV90ZmRzX2luX3F1ZXVlKHByaXYsIHN0YV9pZCwgdGlkLCBmcmVlZCk7Ci0JCWVsc2UgaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQotCQkJSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJTdGF0aW9uIG5vdCBrbm93blxuIik7Ci0KLQkJaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgJiYKLQkJICAgIChpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrKSkKLQkJCWl3bF9sZWdhY3lfd2FrZV9xdWV1ZShwcml2LCB0eHEpOwotCX0KLQlpZiAocWMgJiYgbGlrZWx5KHN0YV9pZCAhPSBJV0xfSU5WQUxJRF9TVEFUSU9OKSkKLQkJaXdsNDk2NV90eHFfY2hlY2tfZW1wdHkocHJpdiwgc3RhX2lkLCB0aWQsIHR4cV9pZCk7Ci0KLQlpd2w0OTY1X2NoZWNrX2Fib3J0X3N0YXR1cyhwcml2LCB0eF9yZXNwLT5mcmFtZV9jb3VudCwgc3RhdHVzKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnhfYmVhY29uX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bDQ5NjVfYmVhY29uX25vdGlmICpiZWFjb24gPSAodm9pZCAqKXBrdC0+dS5yYXc7Ci0JdTggcmF0ZSBfX21heWJlX3VudXNlZCA9Ci0JCWl3bDQ5NjVfaHdfZ2V0X3JhdGUoYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5yYXRlX25fZmxhZ3MpOwotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJiZWFjb24gc3RhdHVzICUjeCwgcmV0cmllczolZCBpYnNzbWdyOiVkICIKLQkJInRzZjoweCUuOHglLjh4IHJhdGU6JWRcbiIsCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIudS5zdGF0dXMpICYgVFhfU1RBVFVTX01TSywKLQkJYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5mYWlsdXJlX2ZyYW1lLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmlic3NfbWdyX3N0YXR1cyksCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+aGlnaF90c2YpLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmxvd190c2YpLCByYXRlKTsKLQotCXByaXYtPmlic3NfbWFuYWdlciA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKTsKLX0KLQotLyogU2V0IHVwIDQ5NjUtc3BlY2lmaWMgUnggZnJhbWUgcmVwbHkgaGFuZGxlcnMgKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcnhfaGFuZGxlcl9zZXR1cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogTGVnYWN5IFJ4IGZyYW1lcyAqLwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX1JYXSA9IGl3bDQ5NjVfcnhfcmVwbHlfcng7Ci0JLyogVHggcmVzcG9uc2UgKi8KLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9UWF0gPSBpd2w0OTY1X3J4X3JlcGx5X3R4OwotCXByaXYtPnJ4X2hhbmRsZXJzW0JFQUNPTl9OT1RJRklDQVRJT05dID0gaXdsNDk2NV9yeF9iZWFjb25fbm90aWY7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgaXdsX2hjbWRfb3BzIGl3bDQ5NjVfaGNtZCA9IHsKLQkucnhvbl9hc3NvYyA9IGl3bDQ5NjVfc2VuZF9yeG9uX2Fzc29jLAotCS5jb21taXRfcnhvbiA9IGl3bDQ5NjVfY29tbWl0X3J4b24sCi0JLnNldF9yeG9uX2NoYWluID0gaXdsNDk2NV9zZXRfcnhvbl9jaGFpbiwKLX07Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfcG9zdF9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JLyoKLQkgKiBTaW5jZSBzZXR0aW5nIHRoZSBSWE9OIG1heSBoYXZlIGJlZW4gZGVmZXJyZWQgd2hpbGUKLQkgKiBwZXJmb3JtaW5nIHRoZSBzY2FuLCBmaXJlIG9uZSBvZmYgaWYgbmVlZGVkCi0JICovCi0JaWYgKG1lbWNtcCgmY3R4LT5zdGFnaW5nLCAmY3R4LT5hY3RpdmUsIHNpemVvZihjdHgtPnN0YWdpbmcpKSkKLQkJaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3Bvc3RfYXNzb2NpYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSBOVUxMOwotCWludCByZXQgPSAwOwotCi0JaWYgKCF2aWYgfHwgIXByaXYtPmlzX29wZW4pCi0JCXJldHVybjsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDIwMCk7Ci0KLQljb25mID0gaXdsX2xlZ2FjeV9pZWVlODAyMTFfZ2V0X2h3X2NvbmYocHJpdi0+aHcpOwotCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCWl3bF9sZWdhY3lfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyhwcml2LCBjdHgpOwotCWlmIChyZXQpCi0JCUlXTF9XQVJOKHByaXYsICJSWE9OIHRpbWluZyAtICIKLQkJCSAgICAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOwotCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0KLQlpd2xfbGVnYWN5X3NldF9yeG9uX2h0KHByaXYsICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZyk7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQotCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQotCWN0eC0+c3RhZ2luZy5hc3NvY19pZCA9IGNwdV90b19sZTE2KHZpZi0+YnNzX2NvbmYuYWlkKTsKLQotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiYXNzb2MgaWQgJWQgYmVhY29uIGludGVydmFsICVkXG4iLAotCQkJdmlmLT5ic3NfY29uZi5haWQsIHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCk7Ci0KLQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpCi0JCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JZWxzZQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQotCWlmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spIHsKLQkJaWYgKHZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCWVsc2UKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JfQotCi0JaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJBc3NvY2lhdGVkIGFzICVkIHRvOiAlcE1cbiIsCi0JCQl2aWYtPmJzc19jb25mLmFpZCwgY3R4LT5hY3RpdmUuYnNzaWRfYWRkcik7Ci0KLQlzd2l0Y2ggKHZpZi0+dHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJaXdsNDk2NV9zZW5kX2JlYWNvbl9jbWQocHJpdik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIiVzIFNob3VsZCBub3QgYmUgY2FsbGVkIGluICVkIG1vZGVcbiIsCi0JCQkgIF9fZnVuY19fLCB2aWYtPnR5cGUpOwotCQlicmVhazsKLQl9Ci0KLQkvKiB0aGUgY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gd2lsbCBlbmFibGVkIFBNIHVwb24gY29tcGxldGlvbgotCSAqIElmIGNoYWluIG5vaXNlIGhhcyBhbHJlYWR5IGJlZW4gcnVuLCB0aGVuIHdlIG5lZWQgdG8gZW5hYmxlCi0JICogcG93ZXIgbWFuYWdlbWVudCBoZXJlICovCi0JaWYgKHByaXYtPmNoYWluX25vaXNlX2RhdGEuc3RhdGUgPT0gSVdMX0NIQUlOX05PSVNFX0RPTkUpCi0JCWl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgZmFsc2UpOwotCi0JLyogRW5hYmxlIFJ4IGRpZmZlcmVudGlhbCBnYWluIGFuZCBzZW5zaXRpdml0eSBjYWxpYnJhdGlvbnMgKi8KLQlpd2w0OTY1X2NoYWluX25vaXNlX3Jlc2V0KHByaXYpOwotCXByaXYtPnN0YXJ0X2NhbGliID0gMTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9jb25maWdfYXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCWludCByZXQgPSAwOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQkvKiBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSBkb25lIG9ubHkgYXQgQVAgYnJpbmcgdXAgKi8KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgewotCi0JCS8qIFJYT04gLSB1bmFzc29jICh0byBzZXQgdGltaW5nIGNvbW1hbmQpICovCi0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JCS8qIFJYT04gVGltaW5nICovCi0JCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyhwcml2LCBjdHgpOwotCQlpZiAocmV0KQotCQkJSVdMX1dBUk4ocHJpdiwgIlJYT04gdGltaW5nIGZhaWxlZCAtICIKLQkJCQkJIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKLQotCQkvKiBBUCBoYXMgYWxsIGFudGVubmFzICovCi0JCXByaXYtPmNoYWluX25vaXNlX2RhdGEuYWN0aXZlX2NoYWlucyA9Ci0JCQlwcml2LT5od19wYXJhbXMudmFsaWRfcnhfYW50OwotCQlpd2xfbGVnYWN5X3NldF9yeG9uX2h0KHByaXYsICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZyk7Ci0JCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQotCQljdHgtPnN0YWdpbmcuYXNzb2NfaWQgPSAwOwotCi0JCWlmICh2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PQotCQkJCVJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQkJZWxzZQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9Ci0JCQkJflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQotCQlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7Ci0JCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKLQkJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0KLQkJCQkJUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCQllbHNlCi0JCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9Ci0JCQkJCX5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQkJfQotCQkvKiBuZWVkIHRvIHNlbmQgYmVhY29uIGNtZCBiZWZvcmUgY29tbWl0dGluZyBhc3NvYyBSWE9OISAqLwotCQlpd2w0OTY1X3NlbmRfYmVhY29uX2NtZChwcml2KTsKLQkJLyogcmVzdG9yZSBSWE9OIGFzc29jICovCi0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCQlpd2xfbGVnYWN5X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0JfQotCWl3bDQ5NjVfc2VuZF9iZWFjb25fY21kKHByaXYpOwotfQotCi1zdGF0aWMgc3RydWN0IGl3bF9oY21kX3V0aWxzX29wcyBpd2w0OTY1X2hjbWRfdXRpbHMgPSB7Ci0JLmdldF9oY21kX3NpemUgPSBpd2w0OTY1X2dldF9oY21kX3NpemUsCi0JLmJ1aWxkX2FkZHN0YV9oY21kID0gaXdsNDk2NV9idWlsZF9hZGRzdGFfaGNtZCwKLQkucmVxdWVzdF9zY2FuID0gaXdsNDk2NV9yZXF1ZXN0X3NjYW4sCi0JLnBvc3Rfc2NhbiA9IGl3bDQ5NjVfcG9zdF9zY2FuLAotfTsKLQotc3RhdGljIHN0cnVjdCBpd2xfbGliX29wcyBpd2w0OTY1X2xpYiA9IHsKLQkuc2V0X2h3X3BhcmFtcyA9IGl3bDQ5NjVfaHdfc2V0X2h3X3BhcmFtcywKLQkudHhxX3VwZGF0ZV9ieXRlX2NudF90YmwgPSBpd2w0OTY1X3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsLAotCS50eHFfYXR0YWNoX2J1Zl90b190ZmQgPSBpd2w0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZCwKLQkudHhxX2ZyZWVfdGZkID0gaXdsNDk2NV9od190eHFfZnJlZV90ZmQsCi0JLnR4cV9pbml0ID0gaXdsNDk2NV9od190eF9xdWV1ZV9pbml0LAotCS5yeF9oYW5kbGVyX3NldHVwID0gaXdsNDk2NV9yeF9oYW5kbGVyX3NldHVwLAotCS5pc192YWxpZF9ydGNfZGF0YV9hZGRyID0gaXdsNDk2NV9od192YWxpZF9ydGNfZGF0YV9hZGRyLAotCS5pbml0X2FsaXZlX3N0YXJ0ID0gaXdsNDk2NV9pbml0X2FsaXZlX3N0YXJ0LAotCS5sb2FkX3Vjb2RlID0gaXdsNDk2NV9sb2FkX2JzbSwKLQkuZHVtcF9uaWNfZXJyb3JfbG9nID0gaXdsNDk2NV9kdW1wX25pY19lcnJvcl9sb2csCi0JLmR1bXBfZmggPSBpd2w0OTY1X2R1bXBfZmgsCi0JLnNldF9jaGFubmVsX3N3aXRjaCA9IGl3bDQ5NjVfaHdfY2hhbm5lbF9zd2l0Y2gsCi0JLmFwbV9vcHMgPSB7Ci0JCS5pbml0ID0gaXdsX2xlZ2FjeV9hcG1faW5pdCwKLQkJLmNvbmZpZyA9IGl3bDQ5NjVfbmljX2NvbmZpZywKLQl9LAotCS5lZXByb21fb3BzID0gewotCQkucmVndWxhdG9yeV9iYW5kcyA9IHsKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMV9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfMl9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfM19DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNF9DSEFOTkVMUywKLQkJCUVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNV9DSEFOTkVMUywKLQkJCUVFUFJPTV80OTY1X1JFR1VMQVRPUllfQkFORF8yNF9IVDQwX0NIQU5ORUxTLAotCQkJRUVQUk9NXzQ5NjVfUkVHVUxBVE9SWV9CQU5EXzUyX0hUNDBfQ0hBTk5FTFMKLQkJfSwKLQkJLmFjcXVpcmVfc2VtYXBob3JlID0gaXdsNDk2NV9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUsCi0JCS5yZWxlYXNlX3NlbWFwaG9yZSA9IGl3bDQ5NjVfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlLAotCX0sCi0JLnNlbmRfdHhfcG93ZXIJPSBpd2w0OTY1X3NlbmRfdHhfcG93ZXIsCi0JLnVwZGF0ZV9jaGFpbl9mbGFncyA9IGl3bDQ5NjVfdXBkYXRlX2NoYWluX2ZsYWdzLAotCS50ZW1wX29wcyA9IHsKLQkJLnRlbXBlcmF0dXJlID0gaXdsNDk2NV90ZW1wZXJhdHVyZV9jYWxpYiwKLQl9LAotCS5kZWJ1Z2ZzX29wcyA9IHsKLQkJLnJ4X3N0YXRzX3JlYWQgPSBpd2w0OTY1X3Vjb2RlX3J4X3N0YXRzX3JlYWQsCi0JCS50eF9zdGF0c19yZWFkID0gaXdsNDk2NV91Y29kZV90eF9zdGF0c19yZWFkLAotCQkuZ2VuZXJhbF9zdGF0c19yZWFkID0gaXdsNDk2NV91Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQsCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9vcHMgaXdsNDk2NV9sZWdhY3lfb3BzID0gewotCS5wb3N0X2Fzc29jaWF0ZSA9IGl3bDQ5NjVfcG9zdF9hc3NvY2lhdGUsCi0JLmNvbmZpZ19hcCA9IGl3bDQ5NjVfY29uZmlnX2FwLAotCS5tYW5hZ2VfaWJzc19zdGF0aW9uID0gaXdsNDk2NV9tYW5hZ2VfaWJzc19zdGF0aW9uLAotCS51cGRhdGVfYmNhc3Rfc3RhdGlvbnMgPSBpd2w0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9ucywKLX07Ci0KLXN0cnVjdCBpZWVlODAyMTFfb3BzIGl3bDQ5NjVfaHdfb3BzID0gewotCS50eCA9IGl3bDQ5NjVfbWFjX3R4LAotCS5zdGFydCA9IGl3bDQ5NjVfbWFjX3N0YXJ0LAotCS5zdG9wID0gaXdsNDk2NV9tYWNfc3RvcCwKLQkuYWRkX2ludGVyZmFjZSA9IGl3bF9sZWdhY3lfbWFjX2FkZF9pbnRlcmZhY2UsCi0JLnJlbW92ZV9pbnRlcmZhY2UgPSBpd2xfbGVnYWN5X21hY19yZW1vdmVfaW50ZXJmYWNlLAotCS5jaGFuZ2VfaW50ZXJmYWNlID0gaXdsX2xlZ2FjeV9tYWNfY2hhbmdlX2ludGVyZmFjZSwKLQkuY29uZmlnID0gaXdsX2xlZ2FjeV9tYWNfY29uZmlnLAotCS5jb25maWd1cmVfZmlsdGVyID0gaXdsNDk2NV9jb25maWd1cmVfZmlsdGVyLAotCS5zZXRfa2V5ID0gaXdsNDk2NV9tYWNfc2V0X2tleSwKLQkudXBkYXRlX3RraXBfa2V5ID0gaXdsNDk2NV9tYWNfdXBkYXRlX3RraXBfa2V5LAotCS5jb25mX3R4ID0gaXdsX2xlZ2FjeV9tYWNfY29uZl90eCwKLQkucmVzZXRfdHNmID0gaXdsX2xlZ2FjeV9tYWNfcmVzZXRfdHNmLAotCS5ic3NfaW5mb19jaGFuZ2VkID0gaXdsX2xlZ2FjeV9tYWNfYnNzX2luZm9fY2hhbmdlZCwKLQkuYW1wZHVfYWN0aW9uID0gaXdsNDk2NV9tYWNfYW1wZHVfYWN0aW9uLAotCS5od19zY2FuID0gaXdsX2xlZ2FjeV9tYWNfaHdfc2NhbiwKLQkuc3RhX2FkZCA9IGl3bDQ5NjVfbWFjX3N0YV9hZGQsCi0JLnN0YV9yZW1vdmUgPSBpd2xfbGVnYWN5X21hY19zdGFfcmVtb3ZlLAotCS5jaGFubmVsX3N3aXRjaCA9IGl3bDQ5NjVfbWFjX2NoYW5uZWxfc3dpdGNoLAotCS50eF9sYXN0X2JlYWNvbiA9IGl3bF9sZWdhY3lfbWFjX3R4X2xhc3RfYmVhY29uLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpd2xfb3BzIGl3bDQ5NjVfb3BzID0gewotCS5saWIgPSAmaXdsNDk2NV9saWIsCi0JLmhjbWQgPSAmaXdsNDk2NV9oY21kLAotCS51dGlscyA9ICZpd2w0OTY1X2hjbWRfdXRpbHMsCi0JLmxlZCA9ICZpd2w0OTY1X2xlZF9vcHMsCi0JLmxlZ2FjeSA9ICZpd2w0OTY1X2xlZ2FjeV9vcHMsCi0JLmllZWU4MDIxMV9vcHMgPSAmaXdsNDk2NV9od19vcHMsCi19OwotCi1zdGF0aWMgc3RydWN0IGl3bF9iYXNlX3BhcmFtcyBpd2w0OTY1X2Jhc2VfcGFyYW1zID0gewotCS5lZXByb21fc2l6ZSA9IElXTDQ5NjVfRUVQUk9NX0lNR19TSVpFLAotCS5udW1fb2ZfcXVldWVzID0gSVdMNDlfTlVNX1FVRVVFUywKLQkubnVtX29mX2FtcGR1X3F1ZXVlcyA9IElXTDQ5X05VTV9BTVBEVV9RVUVVRVMsCi0JLnBsbF9jZmdfdmFsID0gMCwKLQkuc2V0X2wwcyA9IHRydWUsCi0JLnVzZV9ic20gPSB0cnVlLAotCS5sZWRfY29tcGVuc2F0aW9uID0gNjEsCi0JLmNoYWluX25vaXNlX251bV9iZWFjb25zID0gSVdMNDk2NV9DQUxfTlVNX0JFQUNPTlMsCi0JLndkX3RpbWVvdXQgPSBJV0xfREVGX1dEX1RJTUVPVVQsCi0JLnRlbXBlcmF0dXJlX2tlbHZpbiA9IHRydWUsCi0JLnVjb2RlX3RyYWNpbmcgPSB0cnVlLAotCS5zZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAotCS5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIgPSB0cnVlLAotfTsKLQotc3RydWN0IGl3bF9jZmcgaXdsNDk2NV9jZmcgPSB7Ci0JLm5hbWUgPSAiSW50ZWwoUikgV2lyZWxlc3MgV2lGaSBMaW5rIDQ5NjVBR04iLAotCS5md19uYW1lX3ByZSA9IElXTDQ5NjVfRldfUFJFLAotCS51Y29kZV9hcGlfbWF4ID0gSVdMNDk2NV9VQ09ERV9BUElfTUFYLAotCS51Y29kZV9hcGlfbWluID0gSVdMNDk2NV9VQ09ERV9BUElfTUlOLAotCS5za3UgPSBJV0xfU0tVX0F8SVdMX1NLVV9HfElXTF9TS1VfTiwKLQkudmFsaWRfdHhfYW50ID0gQU5UX0FCLAotCS52YWxpZF9yeF9hbnQgPSBBTlRfQUJDLAotCS5lZXByb21fdmVyID0gRUVQUk9NXzQ5NjVfRUVQUk9NX1ZFUlNJT04sCi0JLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNDk2NV9UWF9QT1dFUl9WRVJTSU9OLAotCS5vcHMgPSAmaXdsNDk2NV9vcHMsCi0JLm1vZF9wYXJhbXMgPSAmaXdsNDk2NV9tb2RfcGFyYW1zLAotCS5iYXNlX3BhcmFtcyA9ICZpd2w0OTY1X2Jhc2VfcGFyYW1zLAotCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCi0JLyoKLQkgKiBGb3JjZSB1c2Ugb2YgY2hhaW5zIEIgYW5kIEMgZm9yIHNjYW4gUlggb24gNSBHSHogYmFuZAotCSAqIGJlY2F1c2UgdGhlIGRldmljZSBoYXMgb2ZmLWNoYW5uZWwgcmVjZXB0aW9uIG9uIGNoYWluIEEuCi0JICovCi0JLnNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPSBBTlRfQkMsCi19OwotCi0vKiBNb2R1bGUgZmlybXdhcmUgKi8KLU1PRFVMRV9GSVJNV0FSRShJV0w0OTY1X01PRFVMRV9GSVJNV0FSRShJV0w0OTY1X1VDT0RFX0FQSV9NQVgpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWY4MTYzLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC00OTY1LmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFRoaXMgZmlsZSBpcyBwcm92aWRlZCB1bmRlciBhIGR1YWwgQlNEL0dQTHYyIGxpY2Vuc2UuICBXaGVuIHVzaW5nIG9yCi0gKiByZWRpc3RyaWJ1dGluZyB0aGlzIGZpbGUsIHlvdSBtYXkgZG8gc28gdW5kZXIgZWl0aGVyIGxpY2Vuc2UuCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqIEJTRCBMSUNFTlNFCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDUgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICogICogTmVpdGhlciB0aGUgbmFtZSBJbnRlbCBDb3Jwb3JhdGlvbiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCi0gKiAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF80OTY1X2hfXwotI2RlZmluZSBfX2l3bF80OTY1X2hfXwotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotCi0vKiBjb25maWd1cmF0aW9uIGZvciB0aGUgXzQ5NjUgZGV2aWNlcyAqLwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDQ5NjVfY2ZnOwotCi1leHRlcm4gc3RydWN0IGl3bF9tb2RfcGFyYW1zIGl3bDQ5NjVfbW9kX3BhcmFtczsKLQotZXh0ZXJuIHN0cnVjdCBpZWVlODAyMTFfb3BzIGl3bDQ5NjVfaHdfb3BzOwotCi0vKiB0eCBxdWV1ZSAqLwotdm9pZCBpd2w0OTY1X2ZyZWVfdGZkc19pbl9xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyZWVkKTsKLQotLyogUlhPTiAqLwotdm9pZCBpd2w0OTY1X3NldF9yeG9uX2NoYWluKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLQotLyogdUNvZGUgKi8KLWludCBpd2w0OTY1X3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKiBsaWIgKi8KLXZvaWQgaXdsNDk2NV9jaGVja19hYm9ydF9zdGF0dXMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHU4IGZyYW1lX2NvdW50LCB1MzIgc3RhdHVzKTsKLQotdm9pZCBpd2w0OTY1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKTsKLWludCBpd2w0OTY1X3J4X2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEpOwotaW50IGl3bDQ5NjVfaHdfbmljX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2w0OTY1X2R1bXBfZmgoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOwotCi0vKiByeCAqLwotdm9pZCBpd2w0OTY1X3J4X3F1ZXVlX3Jlc3RvY2soc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsNDk2NV9yeF9yZXBsZW5pc2goc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsNDk2NV9yeF9yZXBsZW5pc2hfbm93KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bDQ5NjVfcnhfcXVldWVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSk7Ci1pbnQgaXdsNDk2NV9yeHFfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bDQ5NjVfaHdyYXRlX3RvX21hYzgwMjExX2lkeCh1MzIgcmF0ZV9uX2ZsYWdzLCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpOwotdm9pZCBpd2w0OTY1X3J4X3JlcGx5X3J4KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfcnhfcGh5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bDQ5NjVfcnhfaGFuZGxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLS8qIHR4ICovCi12b2lkIGl3bDQ5NjVfaHdfdHhxX2ZyZWVfdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKTsKLWludCBpd2w0OTY1X2h3X3R4cV9hdHRhY2hfYnVmX3RvX3RmZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuLCB1OCByZXNldCwgdTggcGFkKTsKLWludCBpd2w0OTY1X2h3X3R4X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSk7Ci12b2lkIGl3bDQ5NjVfaHdyYXRlX3RvX3R4X2NvbnRyb2woc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmF0ZV9uX2ZsYWdzLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvKTsKLWludCBpd2w0OTY1X3R4X3NrYihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IGl3bDQ5NjVfdHhfYWdnX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqc3NuKTsKLWludCBpd2w0OTY1X3R4X2FnZ19zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpOwotaW50IGl3bDQ5NjVfdHhxX2NoZWNrX2VtcHR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIGludCBzdGFfaWQsIHU4IHRpZCwgaW50IHR4cV9pZCk7Ci12b2lkIGl3bDQ5NjVfcnhfcmVwbHlfY29tcHJlc3NlZF9iYShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwotaW50IGl3bDQ5NjVfdHhfcXVldWVfcmVjbGFpbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIGludCBpbmRleCk7Ci12b2lkIGl3bDQ5NjVfaHdfdHhxX2N0eF9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsNDk2NV90eHFfY3R4X2FsbG9jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bDQ5NjVfdHhxX2N0eF9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X3R4cV9jdHhfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X3R4cV9zZXRfc2NoZWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgbWFzayk7Ci0KLS8qCi0gKiBBY3F1aXJlIHByaXYtPmxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAhCi0gKi8KLXZvaWQgaXdsNDk2NV9zZXRfd3JfcHRycyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsIHUzMiBpbmRleCk7Ci0vKioKLSAqIGl3bDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyAtIChvcHRpb25hbGx5KSBzdGFydCBUeC9DbWQgcXVldWUKLSAqIEB0eF9maWZvX2lkOiBUeCBETUEvRklGTyBjaGFubmVsIChyYW5nZSAwLTcpIHRoYXQgdGhlIHF1ZXVlIHdpbGwgZmVlZAotICogQHNjZF9yZXRyeTogKDEpIEluZGljYXRlcyBxdWV1ZSB3aWxsIGJlIHVzZWQgaW4gYWdncmVnYXRpb24gbW9kZQotICoKLSAqIE5PVEU6ICBBY3F1aXJlIHByaXYtPmxvY2sgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiAhCi0gKi8KLXZvaWQgaXdsNDk2NV90eF9xdWV1ZV9zZXRfc3RhdHVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAotCQkJCQlpbnQgdHhfZmlmb19pZCwgaW50IHNjZF9yZXRyeSk7Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGl3bDQ5NjVfdHhfc3RhdHVzX3RvX21hYzgwMjExKHUzMiBzdGF0dXMpCi17Ci0Jc3RhdHVzICY9IFRYX1NUQVRVU19NU0s7Ci0KLQlzd2l0Y2ggKHN0YXR1cykgewotCWNhc2UgVFhfU1RBVFVTX1NVQ0NFU1M6Ci0JY2FzZSBUWF9TVEFUVVNfRElSRUNUX0RPTkU6Ci0JCXJldHVybiBJRUVFODAyMTFfVFhfU1RBVF9BQ0s7Ci0JY2FzZSBUWF9TVEFUVVNfRkFJTF9ERVNUX1BTOgotCQlyZXR1cm4gSUVFRTgwMjExX1RYX1NUQVRfVFhfRklMVEVSRUQ7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIDA7Ci0JfQotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXdsNDk2NV9pc190eF9zdWNjZXNzKHUzMiBzdGF0dXMpCi17Ci0Jc3RhdHVzICY9IFRYX1NUQVRVU19NU0s7Ci0JcmV0dXJuIChzdGF0dXMgPT0gVFhfU1RBVFVTX1NVQ0NFU1MpIHx8Ci0JICAgICAgIChzdGF0dXMgPT0gVFhfU1RBVFVTX0RJUkVDVF9ET05FKTsKLX0KLQotdTggaXdsNDk2NV90b2dnbGVfdHhfYW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggYW50X2lkeCwgdTggdmFsaWQpOwotCi0vKiByeCAqLwotdm9pZCBpd2w0OTY1X3J4X21pc3NlZF9iZWFjb25fbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLWJvb2wgaXdsNDk2NV9nb29kX3BsY3BfaGVhbHRoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCk7Ci12b2lkIGl3bDQ5NjVfcnhfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bDQ5NjVfcmVwbHlfc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLQotLyogc2NhbiAqLwotaW50IGl3bDQ5NjVfcmVxdWVzdF9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci0KLS8qIHN0YXRpb24gbWdtdCAqLwotaW50IGl3bDQ5NjVfbWFuYWdlX2lic3Nfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgYm9vbCBhZGQpOwotCi0vKiBoY21kICovCi1pbnQgaXdsNDk2NV9zZW5kX2JlYWNvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotY29uc3QgY2hhciAqaXdsNDk2NV9nZXRfdHhfZmFpbF9yZWFzb24odTMyIHN0YXR1cyk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBjb25zdCBjaGFyICoKLWl3bDQ5NjVfZ2V0X3R4X2ZhaWxfcmVhc29uKHUzMiBzdGF0dXMpIHsgcmV0dXJuICIiOyB9Ci0jZW5kaWYKLQotLyogc3RhdGlvbiBtYW5hZ2VtZW50ICovCi1pbnQgaXdsNDk2NV9hbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLWludCBpd2w0OTY1X2FkZF9ic3NpZF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJICAgICBjb25zdCB1OCAqYWRkciwgdTggKnN0YV9pZF9yKTsKLWludCBpd2w0OTY1X3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKLWludCBpd2w0OTY1X3NldF9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KTsKLWludCBpd2w0OTY1X3Jlc3RvcmVfZGVmYXVsdF93ZXBfa2V5cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotaW50IGl3bDQ5NjVfc2V0X2R5bmFtaWNfa2V5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksIHU4IHN0YV9pZCk7Ci1pbnQgaXdsNDk2NV9yZW1vdmVfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwgdTggc3RhX2lkKTsKLXZvaWQgaXdsNDk2NV91cGRhdGVfdGtpcF9rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwKLQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpOwotaW50IGl3bDQ5NjVfc3RhX3R4X21vZGlmeV9lbmFibGVfdGlkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCWludCBzdGFfaWQsIGludCB0aWQpOwotaW50IGl3bDQ5NjVfc3RhX3J4X2FnZ19zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkgaW50IHRpZCwgdTE2IHNzbik7Ci1pbnQgaXdsNDk2NV9zdGFfcnhfYWdnX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJaW50IHRpZCk7Ci12b2lkIGl3bDQ5NjVfc3RhX21vZGlmeV9zbGVlcF90eF9jb3VudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlpbnQgc3RhX2lkLCBpbnQgY250KTsKLWludCBpd2w0OTY1X3VwZGF0ZV9iY2FzdF9zdGF0aW9ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKiByYXRlICovCi1zdGF0aWMgaW5saW5lIHUzMiBpd2w0OTY1X2FudF9pZHhfdG9fZmxhZ3ModTggYW50X2lkeCkKLXsKLQlyZXR1cm4gQklUKGFudF9pZHgpIDw8IFJBVEVfTUNTX0FOVF9QT1M7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggaXdsNDk2NV9od19nZXRfcmF0ZShfX2xlMzIgcmF0ZV9uX2ZsYWdzKQotewotCXJldHVybiBsZTMyX3RvX2NwdShyYXRlX25fZmxhZ3MpICYgMHhGRjsKLX0KLQotc3RhdGljIGlubGluZSBfX2xlMzIgaXdsNDk2NV9od19zZXRfcmF0ZV9uX2ZsYWdzKHU4IHJhdGUsIHUzMiBmbGFncykKLXsKLQlyZXR1cm4gY3B1X3RvX2xlMzIoZmxhZ3N8KHUzMilyYXRlKTsKLX0KLQotLyogZWVwcm9tICovCi12b2lkIGl3bDQ5NjVfZWVwcm9tX2dldF9tYWMoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCAqbWFjKTsKLWludCBpd2w0OTY1X2VlcHJvbV9hY3F1aXJlX3NlbWFwaG9yZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2w0OTY1X2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50ICBpd2w0OTY1X2VlcHJvbV9jaGVja192ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLS8qIG1hYzgwMjExIGhhbmRsZXJzIChmb3IgNDk2NSkgKi8KLXZvaWQgaXdsNDk2NV9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOwotaW50IGl3bDQ5NjVfbWFjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLXZvaWQgaXdsNDk2NV9tYWNfc3RvcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7Ci12b2lkIGl3bDQ5NjVfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgdW5zaWduZWQgaW50IGNoYW5nZWRfZmxhZ3MsCi0JCQkgICAgIHVuc2lnbmVkIGludCAqdG90YWxfZmxhZ3MsCi0JCQkgICAgIHU2NCBtdWx0aWNhc3QpOwotaW50IGl3bDQ5NjVfbWFjX3NldF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGVudW0gc2V0X2tleV9jbWQgY21kLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7Ci12b2lkIGl3bDQ5NjVfbWFjX3VwZGF0ZV90a2lwX2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQl1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpOwotaW50IGl3bDQ5NjVfbWFjX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbiwKLQkJCSAgICB1OCBidWZfc2l6ZSk7Ci1pbnQgaXdsNDk2NV9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKLXZvaWQgaXdsNDk2NV9tYWNfY2hhbm5lbF9zd2l0Y2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKTsKLQotI2VuZGlmIC8qIF9faXdsXzQ5NjVfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJkNTY1OS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjY2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLSNpbmNsdWRlICJpd2wtcG93ZXIuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLQotCi1NT0RVTEVfREVTQ1JJUFRJT04oIml3bC1sZWdhY3k6IGNvbW1vbiBmdW5jdGlvbnMgZm9yIDM5NDUgYW5kIDQ5NjUiKTsKLU1PRFVMRV9WRVJTSU9OKElXTFdJRklfVkVSU0lPTik7Ci1NT0RVTEVfQVVUSE9SKERSVl9DT1BZUklHSFQgIiAiIERSVl9BVVRIT1IpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vKgotICogc2V0IGJ0X2NvZXhfYWN0aXZlIHRvIHRydWUsIHVDb2RlIHdpbGwgZG8ga2lsbC9kZWZlcgotICogZXZlcnkgdGltZSB0aGUgcHJpb3JpdHkgbGluZSBpcyBhc3NlcnRlZCAoQlQgaXMgc2VuZGluZyBzaWduYWxzIG9uIHRoZQotICogcHJpb3JpdHkgbGluZSBpbiB0aGUgUENJeCkuCi0gKiBzZXQgYnRfY29leF9hY3RpdmUgdG8gZmFsc2UsIHVDb2RlIHdpbGwgaWdub3JlIHRoZSBCVCBhY3Rpdml0eSBhbmQKLSAqIHBlcmZvcm0gdGhlIG5vcm1hbCBvcGVyYXRpb24KLSAqCi0gKiBVc2VyIG1pZ2h0IGV4cGVyaWVuY2UgdHJhbnNtaXQgaXNzdWUgb24gc29tZSBwbGF0Zm9ybSBkdWUgdG8gV2lGaS9CVAotICogY28tZXhpc3QgcHJvYmxlbS4gVGhlIHBvc3NpYmxlIGJlaGF2aW9ycyBhcmU6Ci0gKiAgIEFibGUgdG8gc2NhbiBhbmQgZmluZGluZyBhbGwgdGhlIGF2YWlsYWJsZSBBUAotICogICBOb3QgYWJsZSB0byBhc3NvY2lhdGUgd2l0aCBhbnkgQVAKLSAqIE9uIHRob3NlIHBsYXRmb3JtcywgV2lGaSBjb21tdW5pY2F0aW9uIGNhbiBiZSByZXN0b3JlZCBieSBzZXQKLSAqICJidF9jb2V4X2FjdGl2ZSIgbW9kdWxlIHBhcmFtZXRlciB0byAiZmFsc2UiCi0gKgotICogZGVmYXVsdDogYnRfY29leF9hY3RpdmUgPSB0cnVlIChCVF9DT0VYX0VOQUJMRSkKLSAqLwotc3RhdGljIGJvb2wgYnRfY29leF9hY3RpdmUgPSB0cnVlOwotbW9kdWxlX3BhcmFtKGJ0X2NvZXhfYWN0aXZlLCBib29sLCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MoYnRfY29leF9hY3RpdmUsICJlbmFibGUgd2lmaS9ibHVldG9vdGggY28tZXhpc3QiKTsKLQotdTMyIGl3bGVnYWN5X2RlYnVnX2xldmVsOwotRVhQT1JUX1NZTUJPTChpd2xlZ2FjeV9kZWJ1Z19sZXZlbCk7Ci0KLWNvbnN0IHU4IGl3bGVnYWN5X2JjYXN0X2FkZHJbRVRIX0FMRU5dID0geyAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGIH07Ci1FWFBPUlRfU1lNQk9MKGl3bGVnYWN5X2JjYXN0X2FkZHIpOwotCi0KLS8qIFRoaXMgZnVuY3Rpb24gYm90aCBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGh3IGFuZCBwcml2LiAqLwotc3RydWN0IGllZWU4MDIxMV9odyAqaXdsX2xlZ2FjeV9hbGxvY19hbGwoc3RydWN0IGl3bF9jZmcgKmNmZykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0JLyogbWFjODAyMTEgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhpcyBkZXZpY2UgaW5zdGFuY2UsIGluY2x1ZGluZwotCSAqICAgc3BhY2UgZm9yIHRoaXMgZHJpdmVyJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KLQlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKLQotCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZihzdHJ1Y3QgaXdsX3ByaXYpLAotCQkJCWNmZy0+b3BzLT5pZWVlODAyMTFfb3BzKTsKLQlpZiAoaHcgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBDYW4gbm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iLAotCQkgICAgICAgY2ZnLT5uYW1lKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcHJpdiA9IGh3LT5wcml2OwotCXByaXYtPmh3ID0gaHc7Ci0KLW91dDoKLQlyZXR1cm4gaHc7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfYWxsb2NfYWxsKTsKLQotI2RlZmluZSBNQVhfQklUX1JBVEVfNDBfTUhaIDE1MCAvKiBNYnBzICovCi0jZGVmaW5lIE1BWF9CSVRfUkFURV8yMF9NSFogNzIgLyogTWJwcyAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9pbml0X2h0X2h3X2NhcGFiKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfaW5mbywKLQkJCSAgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQl1MTYgbWF4X2JpdF9yYXRlID0gMDsKLQl1OCByeF9jaGFpbnNfbnVtID0gcHJpdi0+aHdfcGFyYW1zLnJ4X2NoYWluc19udW07Ci0JdTggdHhfY2hhaW5zX251bSA9IHByaXYtPmh3X3BhcmFtcy50eF9jaGFpbnNfbnVtOwotCi0JaHRfaW5mby0+Y2FwID0gMDsKLQltZW1zZXQoJmh0X2luZm8tPm1jcywgMCwgc2l6ZW9mKGh0X2luZm8tPm1jcykpOwotCi0JaHRfaW5mby0+aHRfc3VwcG9ydGVkID0gdHJ1ZTsKLQotCWh0X2luZm8tPmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMDsKLQltYXhfYml0X3JhdGUgPSBNQVhfQklUX1JBVEVfMjBfTUhaOwotCWlmIChwcml2LT5od19wYXJhbXMuaHQ0MF9jaGFubmVsICYgQklUKGJhbmQpKSB7Ci0JCWh0X2luZm8tPmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MDsKLQkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwOwotCQlodF9pbmZvLT5tY3MucnhfbWFza1s0XSA9IDB4MDE7Ci0JCW1heF9iaXRfcmF0ZSA9IE1BWF9CSVRfUkFURV80MF9NSFo7Ci0JfQotCi0JaWYgKHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKLQkJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVOwotCi0JaHRfaW5mby0+YW1wZHVfZmFjdG9yID0gQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl9ERUY7Ci0JaHRfaW5mby0+YW1wZHVfZGVuc2l0eSA9IENGR19IVF9NUERVX0RFTlNJVFlfREVGOwotCi0JaHRfaW5mby0+bWNzLnJ4X21hc2tbMF0gPSAweEZGOwotCWlmIChyeF9jaGFpbnNfbnVtID49IDIpCi0JCWh0X2luZm8tPm1jcy5yeF9tYXNrWzFdID0gMHhGRjsKLQlpZiAocnhfY2hhaW5zX251bSA+PSAzKQotCQlodF9pbmZvLT5tY3MucnhfbWFza1syXSA9IDB4RkY7Ci0KLQkvKiBIaWdoZXN0IHN1cHBvcnRlZCBSeCBkYXRhIHJhdGUgKi8KLQltYXhfYml0X3JhdGUgKj0gcnhfY2hhaW5zX251bTsKLQlXQVJOX09OKG1heF9iaXRfcmF0ZSAmIH5JRUVFODAyMTFfSFRfTUNTX1JYX0hJR0hFU1RfTUFTSyk7Ci0JaHRfaW5mby0+bWNzLnJ4X2hpZ2hlc3QgPSBjcHVfdG9fbGUxNihtYXhfYml0X3JhdGUpOwotCi0JLyogVHggTUNTIGNhcGFiaWxpdGllcyAqLwotCWh0X2luZm8tPm1jcy50eF9wYXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUQ7Ci0JaWYgKHR4X2NoYWluc19udW0gIT0gcnhfY2hhaW5zX251bSkgewotCQlodF9pbmZvLT5tY3MudHhfcGFyYW1zIHw9IElFRUU4MDIxMV9IVF9NQ1NfVFhfUlhfRElGRjsKLQkJaHRfaW5mby0+bWNzLnR4X3BhcmFtcyB8PSAoKHR4X2NoYWluc19udW0gLSAxKSA8PAotCQkJCUlFRUU4MDIxMV9IVF9NQ1NfVFhfTUFYX1NUUkVBTVNfU0hJRlQpOwotCX0KLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X2luaXRfZ2VvcyAtIEluaXRpYWxpemUgbWFjODAyMTEncyBnZW8vY2hhbm5lbCBpbmZvIGJhc2VkIGZyb20gZWVwcm9tCi0gKi8KLWludCBpd2xfbGVnYWN5X2luaXRfZ2VvcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoOwotCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbHM7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpnZW9fY2g7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlczsKLQlpbnQgaSA9IDA7Ci0JczggbWF4X3R4X3Bvd2VyID0gMDsKLQotCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5uX2JpdHJhdGVzIHx8Ci0JICAgIHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fYml0cmF0ZXMpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkdlb2dyYXBoeSBtb2RlcyBhbHJlYWR5IGluaXRpYWxpemVkLlxuIik7Ci0JCXNldF9iaXQoU1RBVFVTX0dFT19DT05GSUdVUkVELCAmcHJpdi0+c3RhdHVzKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JY2hhbm5lbHMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwpICoKLQkJCSAgIHByaXYtPmNoYW5uZWxfY291bnQsIEdGUF9LRVJORUwpOwotCWlmICghY2hhbm5lbHMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcmF0ZXMgPSBremFsbG9jKChzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yYXRlKSAqIElXTF9SQVRFX0NPVU5UX0xFR0FDWSksCi0JCQlHRlBfS0VSTkVMKTsKLQlpZiAoIXJhdGVzKSB7Ci0JCWtmcmVlKGNoYW5uZWxzKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JLyogNS4yR0h6IGNoYW5uZWxzIHN0YXJ0IGFmdGVyIHRoZSAyLjRHSHogY2hhbm5lbHMgKi8KLQlzYmFuZCA9ICZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKLQlzYmFuZC0+Y2hhbm5lbHMgPSAmY2hhbm5lbHNbQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF8xKV07Ci0JLyoganVzdCBPRkRNICovCi0Jc2JhbmQtPmJpdHJhdGVzID0gJnJhdGVzW0lXTF9GSVJTVF9PRkRNX1JBVEVdOwotCXNiYW5kLT5uX2JpdHJhdGVzID0gSVdMX1JBVEVfQ09VTlRfTEVHQUNZIC0gSVdMX0ZJUlNUX09GRE1fUkFURTsKLQotCWlmIChwcml2LT5jZmctPnNrdSAmIElXTF9TS1VfTikKLQkJaXdsX2xlZ2FjeV9pbml0X2h0X2h3X2NhcGFiKHByaXYsICZzYmFuZC0+aHRfY2FwLAotCQkJCQkgSUVFRTgwMjExX0JBTkRfNUdIWik7Ci0KLQlzYmFuZCA9ICZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXTsKLQlzYmFuZC0+Y2hhbm5lbHMgPSBjaGFubmVsczsKLQkvKiBPRkRNICYgQ0NLICovCi0Jc2JhbmQtPmJpdHJhdGVzID0gcmF0ZXM7Ci0Jc2JhbmQtPm5fYml0cmF0ZXMgPSBJV0xfUkFURV9DT1VOVF9MRUdBQ1k7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5za3UgJiBJV0xfU0tVX04pCi0JCWl3bF9sZWdhY3lfaW5pdF9odF9od19jYXBhYihwcml2LCAmc2JhbmQtPmh0X2NhcCwKLQkJCQkJIElFRUU4MDIxMV9CQU5EXzJHSFopOwotCi0JcHJpdi0+aWVlZV9jaGFubmVscyA9IGNoYW5uZWxzOwotCXByaXYtPmllZWVfcmF0ZXMgPSByYXRlczsKLQotCWZvciAoaSA9IDA7ICBpIDwgcHJpdi0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7Ci0JCWNoID0gJnByaXYtPmNoYW5uZWxfaW5mb1tpXTsKLQotCQlpZiAoIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaCkpCi0JCQljb250aW51ZTsKLQotCQlzYmFuZCA9ICZwcml2LT5iYW5kc1tjaC0+YmFuZF07Ci0KLQkJZ2VvX2NoID0gJnNiYW5kLT5jaGFubmVsc1tzYmFuZC0+bl9jaGFubmVscysrXTsKLQotCQlnZW9fY2gtPmNlbnRlcl9mcmVxID0KLQkJCWllZWU4MDIxMV9jaGFubmVsX3RvX2ZyZXF1ZW5jeShjaC0+Y2hhbm5lbCwgY2gtPmJhbmQpOwotCQlnZW9fY2gtPm1heF9wb3dlciA9IGNoLT5tYXhfcG93ZXJfYXZnOwotCQlnZW9fY2gtPm1heF9hbnRlbm5hX2dhaW4gPSAweGZmOwotCQlnZW9fY2gtPmh3X3ZhbHVlID0gY2gtPmNoYW5uZWw7Ci0KLQkJaWYgKGl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaCkpIHsKLQkJCWlmICghKGNoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpKQotCQkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fTk9fSUJTUzsKLQotCQkJaWYgKCEoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfQUNUSVZFKSkKLQkJCQlnZW9fY2gtPmZsYWdzIHw9IElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTjsKLQotCQkJaWYgKGNoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX1JBREFSKQotCQkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fUkFEQVI7Ci0KLQkJCWdlb19jaC0+ZmxhZ3MgfD0gY2gtPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWw7Ci0KLQkJCWlmIChjaC0+bWF4X3Bvd2VyX2F2ZyA+IG1heF90eF9wb3dlcikKLQkJCQltYXhfdHhfcG93ZXIgPSBjaC0+bWF4X3Bvd2VyX2F2ZzsKLQkJfSBlbHNlIHsKLQkJCWdlb19jaC0+ZmxhZ3MgfD0gSUVFRTgwMjExX0NIQU5fRElTQUJMRUQ7Ci0JCX0KLQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQ2hhbm5lbCAlZCBGcmVxPSVkWyVzR0h6XSAlcyBmbGFnPTB4JVhcbiIsCi0JCQkJY2gtPmNoYW5uZWwsIGdlb19jaC0+Y2VudGVyX2ZyZXEsCi0JCQkJaXdsX2xlZ2FjeV9pc19jaGFubmVsX2FfYmFuZChjaCkgPyAgIjUuMiIgOiAiMi40IiwKLQkJCQlnZW9fY2gtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQgPwotCQkJCSJyZXN0cmljdGVkIiA6ICJ2YWxpZCIsCi0JCQkJIGdlb19jaC0+ZmxhZ3MpOwotCX0KLQotCXByaXYtPnR4X3Bvd2VyX2RldmljZV9sbXQgPSBtYXhfdHhfcG93ZXI7Ci0JcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQgPSBtYXhfdHhfcG93ZXI7Ci0JcHJpdi0+dHhfcG93ZXJfbmV4dCA9IG1heF90eF9wb3dlcjsKLQotCWlmICgocHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscyA9PSAwKSAmJgotCSAgICAgcHJpdi0+Y2ZnLT5za3UgJiBJV0xfU0tVX0EpIHsKLQkJSVdMX0lORk8ocHJpdiwgIkluY29ycmVjdGx5IGRldGVjdGVkIEJHIGNhcmQgYXMgQUJHLiAiCi0JCQkiUGxlYXNlIHNlbmQgeW91ciBQQ0kgSUQgMHglMDRYOjB4JTA0WCB0byBtYWludGFpbmVyLlxuIiwKLQkJCSAgIHByaXYtPnBjaV9kZXYtPmRldmljZSwKLQkJCSAgIHByaXYtPnBjaV9kZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwotCQlwcml2LT5jZmctPnNrdSAmPSB+SVdMX1NLVV9BOwotCX0KLQotCUlXTF9JTkZPKHByaXYsICJUdW5hYmxlIGNoYW5uZWxzOiAlZCA4MDIuMTFiZywgJWQgODAyLjExYSBjaGFubmVsc1xuIiwKLQkJICAgcHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0ubl9jaGFubmVscywKLQkJICAgcHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0ubl9jaGFubmVscyk7Ci0KLQlzZXRfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cyk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9pbml0X2dlb3MpOwotCi0vKgotICogaXdsX2xlZ2FjeV9mcmVlX2dlb3MgLSB1bmRvIGFsbG9jYXRpb25zIGluIGl3bF9sZWdhY3lfaW5pdF9nZW9zCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV9mcmVlX2dlb3Moc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWtmcmVlKHByaXYtPmllZWVfY2hhbm5lbHMpOwotCWtmcmVlKHByaXYtPmllZWVfcmF0ZXMpOwotCWNsZWFyX2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2ZyZWVfZ2Vvcyk7Ci0KLXN0YXRpYyBib29sIGl3bF9sZWdhY3lfaXNfY2hhbm5lbF9leHRlbnNpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAotCQkJCSAgICAgdTE2IGNoYW5uZWwsIHU4IGV4dGVuc2lvbl9jaGFuX29mZnNldCkKLXsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQotCWNoX2luZm8gPSBpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgYmFuZCwgY2hhbm5lbCk7Ci0JaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpCi0JCXJldHVybiBmYWxzZTsKLQotCWlmIChleHRlbnNpb25fY2hhbl9vZmZzZXQgPT0gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkUpCi0JCXJldHVybiAhKGNoX2luZm8tPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgJgotCQkJCQlJRUVFODAyMTFfQ0hBTl9OT19IVDQwUExVUyk7Ci0JZWxzZSBpZiAoZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID09IElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XKQotCQlyZXR1cm4gIShjaF9pbmZvLT5odDQwX2V4dGVuc2lvbl9jaGFubmVsICYKLQkJCQkJSUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTKTsKLQotCXJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBpd2xfbGVnYWN5X2lzX2h0NDBfdHhfYWxsb3dlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCkKLXsKLQlpZiAoIWN0eC0+aHQuZW5hYmxlZCB8fCAhY3R4LT5odC5pc180MG1oeikKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyoKLQkgKiBXZSBkbyBub3QgY2hlY2sgZm9yIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwCi0JICogdGhlIGJpdCB3aWxsIG5vdCBzZXQgaWYgaXQgaXMgcHVyZSA0ME1IeiBjYXNlCi0JICovCi0JaWYgKGh0X2NhcCAmJiAhaHRfY2FwLT5odF9zdXBwb3J0ZWQpCi0JCXJldHVybiBmYWxzZTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0JaWYgKHByaXYtPmRpc2FibGVfaHQ0MCkKLQkJcmV0dXJuIGZhbHNlOwotI2VuZGlmCi0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9pc19jaGFubmVsX2V4dGVuc2lvbihwcml2LCBwcml2LT5iYW5kLAotCQkJbGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpLAotCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2lzX2h0NDBfdHhfYWxsb3dlZCk7Ci0KLXN0YXRpYyB1MTYgaXdsX2xlZ2FjeV9hZGp1c3RfYmVhY29uX2ludGVydmFsKHUxNiBiZWFjb25fdmFsLCB1MTYgbWF4X2JlYWNvbl92YWwpCi17Ci0JdTE2IG5ld192YWw7Ci0JdTE2IGJlYWNvbl9mYWN0b3I7Ci0KLQkvKgotCSAqIElmIG1hYzgwMjExIGhhc24ndCBnaXZlbiB1cyBhIGJlYWNvbiBpbnRlcnZhbCwgcHJvZ3JhbQotCSAqIHRoZSBkZWZhdWx0IGludG8gdGhlIGRldmljZS4KLQkgKi8KLQlpZiAoIWJlYWNvbl92YWwpCi0JCXJldHVybiBERUZBVUxUX0JFQUNPTl9JTlRFUlZBTDsKLQotCS8qCi0JICogSWYgdGhlIGJlYWNvbiBpbnRlcnZhbCB3ZSBvYnRhaW5lZCBmcm9tIHRoZSBwZWVyCi0JICogaXMgdG9vIGxhcmdlLCB3ZSdsbCBoYXZlIHRvIHdha2UgdXAgbW9yZSBvZnRlbgotCSAqIChhbmQgaW4gSUJTUyBjYXNlLCB3ZSdsbCBiZWFjb24gdG9vIG11Y2gpCi0JICoKLQkgKiBGb3IgZXhhbXBsZSwgaWYgbWF4X2JlYWNvbl92YWwgaXMgNDA5NiwgYW5kIHRoZQotCSAqIHJlcXVlc3RlZCBiZWFjb24gaW50ZXJ2YWwgaXMgNzAwMCwgd2UnbGwgaGF2ZSB0bwotCSAqIHVzZSAzNTAwIHRvIGJlIGFibGUgdG8gd2FrZSB1cCBvbiB0aGUgYmVhY29ucy4KLQkgKgotCSAqIFRoaXMgY291bGQgYmFkbHkgaW5mbHVlbmNlIGJlYWNvbiBkZXRlY3Rpb24gc3RhdHMuCi0JICovCi0KLQliZWFjb25fZmFjdG9yID0gKGJlYWNvbl92YWwgKyBtYXhfYmVhY29uX3ZhbCkgLyBtYXhfYmVhY29uX3ZhbDsKLQluZXdfdmFsID0gYmVhY29uX3ZhbCAvIGJlYWNvbl9mYWN0b3I7Ci0KLQlpZiAoIW5ld192YWwpCi0JCW5ld192YWwgPSBtYXhfYmVhY29uX3ZhbDsKLQotCXJldHVybiBuZXdfdmFsOwotfQotCi1pbnQKLWl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JdTY0IHRzZjsKLQlzMzIgaW50ZXJ2YWxfdG0sIHJlbTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSBOVUxMOwotCXUxNiBiZWFjb25faW50OwotCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKLQotCWNvbmYgPSBpd2xfbGVnYWN5X2llZWU4MDIxMV9nZXRfaHdfY29uZihwcml2LT5odyk7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQltZW1zZXQoJmN0eC0+dGltaW5nLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9yeG9uX3RpbWVfY21kKSk7Ci0KLQljdHgtPnRpbWluZy50aW1lc3RhbXAgPSBjcHVfdG9fbGU2NChwcml2LT50aW1lc3RhbXApOwotCWN0eC0+dGltaW5nLmxpc3Rlbl9pbnRlcnZhbCA9IGNwdV90b19sZTE2KGNvbmYtPmxpc3Rlbl9pbnRlcnZhbCk7Ci0KLQliZWFjb25faW50ID0gdmlmID8gdmlmLT5ic3NfY29uZi5iZWFjb25faW50IDogMDsKLQotCS8qCi0JICogVE9ETzogRm9yIElCU1Mgd2UgbmVlZCB0byBnZXQgYXRpbV93aW5kb3cgZnJvbSBtYWM4MDIxMSwKLQkgKgkgZm9yIG5vdyBqdXN0IGFsd2F5cyB1c2UgMAotCSAqLwotCWN0eC0+dGltaW5nLmF0aW1fd2luZG93ID0gMDsKLQotCWJlYWNvbl9pbnQgPSBpd2xfbGVnYWN5X2FkanVzdF9iZWFjb25faW50ZXJ2YWwoYmVhY29uX2ludCwKLQkJCXByaXYtPmh3X3BhcmFtcy5tYXhfYmVhY29uX2l0cnZsICogVElNRV9VTklUKTsKLQljdHgtPnRpbWluZy5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihiZWFjb25faW50KTsKLQotCXRzZiA9IHByaXYtPnRpbWVzdGFtcDsgLyogdHNmIGlzIG1vZGlmZWQgYnkgZG9fZGl2OiBjb3B5IGl0ICovCi0JaW50ZXJ2YWxfdG0gPSBiZWFjb25faW50ICogVElNRV9VTklUOwotCXJlbSA9IGRvX2Rpdih0c2YsIGludGVydmFsX3RtKTsKLQljdHgtPnRpbWluZy5iZWFjb25faW5pdF92YWwgPSBjcHVfdG9fbGUzMihpbnRlcnZhbF90bSAtIHJlbSk7Ci0KLQljdHgtPnRpbWluZy5kdGltX3BlcmlvZCA9IHZpZiA/ICh2aWYtPmJzc19jb25mLmR0aW1fcGVyaW9kID86IDEpIDogMTsKLQotCUlXTF9ERUJVR19BU1NPQyhwcml2LAotCQkJImJlYWNvbiBpbnRlcnZhbCAlZCBiZWFjb24gdGltZXIgJWQgYmVhY29uIHRpbSAlZFxuIiwKLQkJCWxlMTZfdG9fY3B1KGN0eC0+dGltaW5nLmJlYWNvbl9pbnRlcnZhbCksCi0JCQlsZTMyX3RvX2NwdShjdHgtPnRpbWluZy5iZWFjb25faW5pdF92YWwpLAotCQkJbGUxNl90b19jcHUoY3R4LT50aW1pbmcuYXRpbV93aW5kb3cpKTsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShwcml2LCBjdHgtPnJ4b25fdGltaW5nX2NtZCwKLQkJCQlzaXplb2YoY3R4LT50aW1pbmcpLCAmY3R4LT50aW1pbmcpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfcnhvbl90aW1pbmcpOwotCi12b2lkCi1pd2xfbGVnYWN5X3NldF9yeG9uX2h3Y3J5cHRvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJCWludCBod19kZWNyeXB0KQotewotCXN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICpyeG9uID0gJmN0eC0+c3RhZ2luZzsKLQotCWlmIChod19kZWNyeXB0KQotCQlyeG9uLT5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0RJU19ERUNSWVBUX01TSzsKLQllbHNlCi0JCXJ4b24tPmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9ESVNfREVDUllQVF9NU0s7Ci0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXRfcnhvbl9od2NyeXB0byk7Ci0KLS8qIHZhbGlkYXRlIFJYT04gc3RydWN0dXJlIGlzIHZhbGlkICovCi1pbnQKLWl3bF9sZWdhY3lfY2hlY2tfcnhvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCXN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICpyeG9uID0gJmN0eC0+c3RhZ2luZzsKLQlib29sIGVycm9yID0gZmFsc2U7Ci0KLQlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spIHsKLQkJaWYgKHJ4b24tPmZsYWdzICYgUlhPTl9GTEdfVEdKX05BUlJPV19CQU5EX01TSykgewotCQkJSVdMX1dBUk4ocHJpdiwgImNoZWNrIDIuNEc6IHdyb25nIG5hcnJvd1xuIik7Ci0JCQllcnJvciA9IHRydWU7Ci0JCX0KLQkJaWYgKHJ4b24tPmZsYWdzICYgUlhPTl9GTEdfUkFEQVJfREVURUNUX01TSykgewotCQkJSVdMX1dBUk4ocHJpdiwgImNoZWNrIDIuNEc6IHdyb25nIHJhZGFyXG4iKTsKLQkJCWVycm9yID0gdHJ1ZTsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghKHJ4b24tPmZsYWdzICYgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0spKSB7Ci0JCQlJV0xfV0FSTihwcml2LCAiY2hlY2sgNS4yRzogbm90IHNob3J0IHNsb3QhXG4iKTsKLQkJCWVycm9yID0gdHJ1ZTsKLQkJfQotCQlpZiAocnhvbi0+ZmxhZ3MgJiBSWE9OX0ZMR19DQ0tfTVNLKSB7Ci0JCQlJV0xfV0FSTihwcml2LCAiY2hlY2sgNS4yRzogQ0NLIVxuIik7Ci0JCQllcnJvciA9IHRydWU7Ci0JCX0KLQl9Ci0JaWYgKChyeG9uLT5ub2RlX2FkZHJbMF0gfCByeG9uLT5ic3NpZF9hZGRyWzBdKSAmIDB4MSkgewotCQlJV0xfV0FSTihwcml2LCAibWFjL2Jzc2lkIG1jYXN0IVxuIik7Ci0JCWVycm9yID0gdHJ1ZTsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgYmFzaWMgcmF0ZXMgNk1icHMgYW5kIDFNYnBzIGFyZSBzdXBwb3J0ZWQgKi8KLQlpZiAoKHJ4b24tPm9mZG1fYmFzaWNfcmF0ZXMgJiBJV0xfUkFURV82TV9NQVNLKSA9PSAwICYmCi0JICAgIChyeG9uLT5jY2tfYmFzaWNfcmF0ZXMgJiBJV0xfUkFURV8xTV9NQVNLKSA9PSAwKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJuZWl0aGVyIDEgbm9yIDYgYXJlIGJhc2ljXG4iKTsKLQkJZXJyb3IgPSB0cnVlOwotCX0KLQotCWlmIChsZTE2X3RvX2NwdShyeG9uLT5hc3NvY19pZCkgPiAyMDA3KSB7Ci0JCUlXTF9XQVJOKHByaXYsICJhaWQgPiAyMDA3XG4iKTsKLQkJZXJyb3IgPSB0cnVlOwotCX0KLQotCWlmICgocnhvbi0+ZmxhZ3MgJiAoUlhPTl9GTEdfQ0NLX01TSyB8IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLKSkKLQkJCT09IChSWE9OX0ZMR19DQ0tfTVNLIHwgUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0spKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJDQ0sgYW5kIHNob3J0IHNsb3RcbiIpOwotCQllcnJvciA9IHRydWU7Ci0JfQotCi0JaWYgKChyeG9uLT5mbGFncyAmIChSWE9OX0ZMR19DQ0tfTVNLIHwgUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLKSkKLQkJCT09IChSWE9OX0ZMR19DQ0tfTVNLIHwgUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLKSkgewotCQlJV0xfV0FSTihwcml2LCAiQ0NLIGFuZCBhdXRvIGRldGVjdCIpOwotCQllcnJvciA9IHRydWU7Ci0JfQotCi0JaWYgKChyeG9uLT5mbGFncyAmIChSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0sgfAotCQkJICAgIFJYT05fRkxHX1RHR19QUk9URUNUX01TSykpID09Ci0JCQkgICAgUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJUR2cgYnV0IG5vIGF1dG8tZGV0ZWN0XG4iKTsKLQkJZXJyb3IgPSB0cnVlOwotCX0KLQotCWlmIChlcnJvcikKLQkJSVdMX1dBUk4ocHJpdiwgIlR1bmluZyB0byBjaGFubmVsICVkXG4iLAotCQkJICAgIGxlMTZfdG9fY3B1KHJ4b24tPmNoYW5uZWwpKTsKLQotCWlmIChlcnJvcikgewotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIFJYT05cbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfY2hlY2tfcnhvbl9jbWQpOwotCi0vKioKLSAqIGl3bF9sZWdhY3lfZnVsbF9yeG9uX3JlcXVpcmVkIC0gY2hlY2sgaWYgZnVsbCBSWE9OICh2cyBSWE9OX0FTU09DKSBjbWQgaXMgbmVlZGVkCi0gKiBAcHJpdjogc3RhZ2luZ19yeG9uIGlzIGNvbXBhcmVkIHRvIGFjdGl2ZV9yeG9uCi0gKgotICogSWYgdGhlIFJYT04gc3RydWN0dXJlIGlzIGNoYW5naW5nIGVub3VnaCB0byByZXF1aXJlIGEgbmV3IHR1bmUsCi0gKiBvciBpcyBjbGVhcmluZyB0aGUgUlhPTl9GSUxURVJfQVNTT0NfTVNLLCB0aGVuIHJldHVybiAxIHRvIGluZGljYXRlIHRoYXQKLSAqIGEgbmV3IHR1bmUgKGZ1bGwgUlhPTiBjb21tYW5kLCByYXRoZXIgdGhhbiBSWE9OX0FTU09DIGNtZCkgaXMgcmVxdWlyZWQuCi0gKi8KLWludCBpd2xfbGVnYWN5X2Z1bGxfcnhvbl9yZXF1aXJlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCWNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kICpzdGFnaW5nID0gJmN0eC0+c3RhZ2luZzsKLQljb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqYWN0aXZlID0gJmN0eC0+YWN0aXZlOwotCi0jZGVmaW5lIENISyhjb25kKQkJCQkJCQlcCi0JaWYgKChjb25kKSkgewkJCQkJCQlcCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJuZWVkIGZ1bGwgUlhPTiAtICIgI2NvbmQgIlxuIik7CVwKLQkJcmV0dXJuIDE7CQkJCQkJXAotCX0KLQotI2RlZmluZSBDSEtfTkVRKGMxLCBjMikJCQkJCQlcCi0JaWYgKChjMSkgIT0gKGMyKSkgewkJCQkJXAotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAibmVlZCBmdWxsIFJYT04gLSAiCVwKLQkJCSAgICAgICAjYzEgIiAhPSAiICNjMiAiIC0gJWQgIT0gJWRcbiIsCVwKLQkJCSAgICAgICAoYzEpLCAoYzIpKTsJCQlcCi0JCXJldHVybiAxOwkJCQkJXAotCX0KLQotCS8qIFRoZXNlIGl0ZW1zIGFyZSBvbmx5IHNldHRhYmxlIGZyb20gdGhlIGZ1bGwgUlhPTiBjb21tYW5kICovCi0JQ0hLKCFpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpOwotCUNISyhjb21wYXJlX2V0aGVyX2FkZHIoc3RhZ2luZy0+YnNzaWRfYWRkciwgYWN0aXZlLT5ic3NpZF9hZGRyKSk7Ci0JQ0hLKGNvbXBhcmVfZXRoZXJfYWRkcihzdGFnaW5nLT5ub2RlX2FkZHIsIGFjdGl2ZS0+bm9kZV9hZGRyKSk7Ci0JQ0hLKGNvbXBhcmVfZXRoZXJfYWRkcihzdGFnaW5nLT53bGFwX2Jzc2lkX2FkZHIsCi0JCQkJYWN0aXZlLT53bGFwX2Jzc2lkX2FkZHIpKTsKLQlDSEtfTkVRKHN0YWdpbmctPmRldl90eXBlLCBhY3RpdmUtPmRldl90eXBlKTsKLQlDSEtfTkVRKHN0YWdpbmctPmNoYW5uZWwsIGFjdGl2ZS0+Y2hhbm5lbCk7Ci0JQ0hLX05FUShzdGFnaW5nLT5haXJfcHJvcGFnYXRpb24sIGFjdGl2ZS0+YWlyX3Byb3BhZ2F0aW9uKTsKLQlDSEtfTkVRKHN0YWdpbmctPm9mZG1faHRfc2luZ2xlX3N0cmVhbV9iYXNpY19yYXRlcywKLQkJYWN0aXZlLT5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMpOwotCUNIS19ORVEoc3RhZ2luZy0+b2ZkbV9odF9kdWFsX3N0cmVhbV9iYXNpY19yYXRlcywKLQkJYWN0aXZlLT5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzKTsKLQlDSEtfTkVRKHN0YWdpbmctPmFzc29jX2lkLCBhY3RpdmUtPmFzc29jX2lkKTsKLQotCS8qIGZsYWdzLCBmaWx0ZXJfZmxhZ3MsIG9mZG1fYmFzaWNfcmF0ZXMsIGFuZCBjY2tfYmFzaWNfcmF0ZXMgY2FuCi0JICogYmUgdXBkYXRlZCB3aXRoIHRoZSBSWE9OX0FTU09DIGNvbW1hbmQgLS0gaG93ZXZlciBvbmx5IHNvbWUKLQkgKiBmbGFnIHRyYW5zaXRpb25zIGFyZSBhbGxvd2VkIHVzaW5nIFJYT05fQVNTT0MgKi8KLQotCS8qIENoZWNrIGlmIHdlIGFyZSBub3Qgc3dpdGNoaW5nIGJhbmRzICovCi0JQ0hLX05FUShzdGFnaW5nLT5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSywKLQkJYWN0aXZlLT5mbGFncyAmIFJYT05fRkxHX0JBTkRfMjRHX01TSyk7Ci0KLQkvKiBDaGVjayBpZiB3ZSBhcmUgc3dpdGNoaW5nIGFzc29jaWF0aW9uIHRvZ2dsZSAqLwotCUNIS19ORVEoc3RhZ2luZy0+ZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfQVNTT0NfTVNLLAotCQlhY3RpdmUtPmZpbHRlcl9mbGFncyAmIFJYT05fRklMVEVSX0FTU09DX01TSyk7Ci0KLSN1bmRlZiBDSEsKLSN1bmRlZiBDSEtfTkVRCi0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9mdWxsX3J4b25fcmVxdWlyZWQpOwotCi11OCBpd2xfbGVnYWN5X2dldF9sb3dlc3RfcGxjcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQkvKgotCSAqIEFzc2lnbiB0aGUgbG93ZXN0IHJhdGUgLS0gc2hvdWxkIHJlYWxseSBnZXQgdGhpcyBmcm9tCi0JICogdGhlIGJlYWNvbiBza2IgZnJvbSBtYWM4MDIxMS4KLQkgKi8KLQlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKQotCQlyZXR1cm4gSVdMX1JBVEVfMU1fUExDUDsKLQllbHNlCi0JCXJldHVybiBJV0xfUkFURV82TV9QTENQOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2dldF9sb3dlc3RfcGxjcCk7Ci0KLXN0YXRpYyB2b2lkIF9pd2xfbGVnYWN5X3NldF9yeG9uX2h0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgc3RydWN0IGl3bF9odF9jb25maWcgKmh0X2NvbmYsCi0JCQkgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0Jc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24gPSAmY3R4LT5zdGFnaW5nOwotCi0JaWYgKCFjdHgtPmh0LmVuYWJsZWQpIHsKLQkJcnhvbi0+ZmxhZ3MgJj0gfihSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLIHwKLQkJCVJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLIHwKLQkJCVJYT05fRkxHX0hUNDBfUFJPVF9NU0sgfAotCQkJUlhPTl9GTEdfSFRfUFJPVF9NU0spOwotCQlyZXR1cm47Ci0JfQotCi0Jcnhvbi0+ZmxhZ3MgfD0gY3B1X3RvX2xlMzIoY3R4LT5odC5wcm90ZWN0aW9uIDw8Ci0JCQkJCVJYT05fRkxHX0hUX09QRVJBVElOR19NT0RFX1BPUyk7Ci0KLQkvKiBTZXQgdXAgY2hhbm5lbCBiYW5kd2lkdGg6Ci0JICogMjAgTUh6IG9ubHksIDIwLzQwIG1peGVkIG9yIHB1cmUgNDAgaWYgaHQ0MCBvayAqLwotCS8qIGNsZWFyIHRoZSBIVCBjaGFubmVsIG1vZGUgYmVmb3JlIHNldCB0aGUgbW9kZSAqLwotCXJ4b24tPmZsYWdzICY9IH4oUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX01TSyB8Ci0JCQkgUlhPTl9GTEdfQ1RSTF9DSEFOTkVMX0xPQ19ISV9NU0spOwotCWlmIChpd2xfbGVnYWN5X2lzX2h0NDBfdHhfYWxsb3dlZChwcml2LCBjdHgsIE5VTEwpKSB7Ci0JCS8qIHB1cmUgaHQ0MCAqLwotCQlpZiAoY3R4LT5odC5wcm90ZWN0aW9uID09Ci0JCQkJSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl8yME1IWikgewotCQkJcnhvbi0+ZmxhZ3MgfD0gUlhPTl9GTEdfQ0hBTk5FTF9NT0RFX1BVUkVfNDA7Ci0JCQkvKiBOb3RlOiBjb250cm9sIGNoYW5uZWwgaXMgb3Bwb3NpdGUgb2YgZXh0ZW5zaW9uIGNoYW5uZWwgKi8KLQkJCXN3aXRjaCAoY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQpIHsKLQkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU6Ci0JCQkJcnhvbi0+ZmxhZ3MgJj0KLQkJCQkJflJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzoKLQkJCQlyeG9uLT5mbGFncyB8PQotCQkJCQlSWE9OX0ZMR19DVFJMX0NIQU5ORUxfTE9DX0hJX01TSzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8qIE5vdGU6IGNvbnRyb2wgY2hhbm5lbCBpcyBvcHBvc2l0ZSBvZiBleHRlbnNpb24gY2hhbm5lbCAqLwotCQkJc3dpdGNoIChjdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCkgewotCQkJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRToKLQkJCQlyeG9uLT5mbGFncyAmPQotCQkJCQl+KFJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLKTsKLQkJCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTUlYRUQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOgotCQkJCXJ4b24tPmZsYWdzIHw9Ci0JCQkJCVJYT05fRkxHX0NUUkxfQ0hBTk5FTF9MT0NfSElfTVNLOwotCQkJCXJ4b24tPmZsYWdzIHw9IFJYT05fRkxHX0NIQU5ORUxfTU9ERV9NSVhFRDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORToKLQkJCWRlZmF1bHQ6Ci0JCQkJLyogY2hhbm5lbCBsb2NhdGlvbiBvbmx5IHZhbGlkIGlmIGluIE1peGVkIG1vZGUgKi8KLQkJCQlJV0xfRVJSKHByaXYsCi0JCQkJCSJpbnZhbGlkIGV4dGVuc2lvbiBjaGFubmVsIG9mZnNldFxuIik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgewotCQlyeG9uLT5mbGFncyB8PSBSWE9OX0ZMR19DSEFOTkVMX01PREVfTEVHQUNZOwotCX0KLQotCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJyeG9uIGZsYWdzIDB4JVggb3BlcmF0aW9uIG1vZGUgOjB4JVggIgotCQkJImV4dGVuc2lvbiBjaGFubmVsIG9mZnNldCAweCV4XG4iLAotCQkJbGUzMl90b19jcHUocnhvbi0+ZmxhZ3MpLCBjdHgtPmh0LnByb3RlY3Rpb24sCi0JCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCk7Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9zZXRfcnhvbl9odChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaHRfY29uZmlnICpodF9jb25mKQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkKLQkJX2l3bF9sZWdhY3lfc2V0X3J4b25faHQocHJpdiwgaHRfY29uZiwgY3R4KTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXRfcnhvbl9odCk7Ci0KLS8qIFJldHVybiB2YWxpZCwgdW51c2VkLCBjaGFubmVsIGZvciBhIHBhc3NpdmUgc2NhbiB0byByZXNldCB0aGUgUkYgKi8KLXU4IGl3bF9sZWdhY3lfZ2V0X3NpbmdsZV9jaGFubmVsX251bWJlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCkKLXsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQlpbnQgaTsKLQl1OCBjaGFubmVsID0gMDsKLQl1OCBtaW4sIG1heDsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCi0JaWYgKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgewotCQltaW4gPSAxNDsKLQkJbWF4ID0gcHJpdi0+Y2hhbm5lbF9jb3VudDsKLQl9IGVsc2UgewotCQltaW4gPSAwOwotCQltYXggPSAxNDsKLQl9Ci0KLQlmb3IgKGkgPSBtaW47IGkgPCBtYXg7IGkrKykgewotCQlib29sIGJ1c3kgPSBmYWxzZTsKLQotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQkJYnVzeSA9IHByaXYtPmNoYW5uZWxfaW5mb1tpXS5jaGFubmVsID09Ci0JCQkJbGUxNl90b19jcHUoY3R4LT5zdGFnaW5nLmNoYW5uZWwpOwotCQkJaWYgKGJ1c3kpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoYnVzeSkKLQkJCWNvbnRpbnVlOwotCi0JCWNoYW5uZWwgPSBwcml2LT5jaGFubmVsX2luZm9baV0uY2hhbm5lbDsKLQkJY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBiYW5kLCBjaGFubmVsKTsKLQkJaWYgKGl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKLQkJCWJyZWFrOwotCX0KLQotCXJldHVybiBjaGFubmVsOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2dldF9zaW5nbGVfY2hhbm5lbF9udW1iZXIpOwotCi0vKioKLSAqIGl3bF9sZWdhY3lfc2V0X3J4b25fY2hhbm5lbCAtIFNldCB0aGUgYmFuZCBhbmQgY2hhbm5lbCB2YWx1ZXMgaW4gc3RhZ2luZyBSWE9OCi0gKiBAY2g6IHJlcXVlc3RlZCBjaGFubmVsIGFzIGEgcG9pbnRlciB0byBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwKLQotICogTk9URTogIERvZXMgbm90IGNvbW1pdCB0byB0aGUgaGFyZHdhcmU7IGl0IHNldHMgYXBwcm9wcmlhdGUgYml0IGZpZWxkcwotICogaW4gdGhlIHN0YWdpbmcgUlhPTiBmbGFnIHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgY2gtPmJhbmQKLSAqLwotaW50Ci1pd2xfbGVnYWN5X3NldF9yeG9uX2NoYW5uZWwoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoLAotCQkJIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kID0gY2gtPmJhbmQ7Ci0JdTE2IGNoYW5uZWwgPSBjaC0+aHdfdmFsdWU7Ci0KLQlpZiAoKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSA9PSBjaGFubmVsKSAmJgotCSAgICAocHJpdi0+YmFuZCA9PSBiYW5kKSkKLQkJcmV0dXJuIDA7Ci0KLQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoYW5uZWwpOwotCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCWN0eC0+c3RhZ2luZy5mbGFncyAmPSB+UlhPTl9GTEdfQkFORF8yNEdfTVNLOwotCWVsc2UKLQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX0JBTkRfMjRHX01TSzsKLQotCXByaXYtPmJhbmQgPSBiYW5kOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlN0YWdpbmcgY2hhbm5lbCBzZXQgdG8gJWQgWyVkXVxuIiwgY2hhbm5lbCwgYmFuZCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXRfcnhvbl9jaGFubmVsKTsKLQotdm9pZCBpd2xfbGVnYWN5X3NldF9mbGFnc19mb3JfYmFuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCSAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSB7Ci0JCWN0eC0+c3RhZ2luZy5mbGFncyAmPQotCQkgICAgfihSWE9OX0ZMR19CQU5EXzI0R19NU0sgfCBSWE9OX0ZMR19BVVRPX0RFVEVDVF9NU0sKLQkJICAgICAgfCBSWE9OX0ZMR19DQ0tfTVNLKTsKLQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NIT1JUX1NMT1RfTVNLOwotCX0gZWxzZSB7Ci0JCS8qIENvcGllZCBmcm9tIGl3bF9wb3N0X2Fzc29jaWF0ZSgpICovCi0JCWlmICh2aWYgJiYgdmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQkJZWxzZQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfQkFORF8yNEdfTVNLOwotCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLOwotCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX0NDS19NU0s7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NldF9mbGFnc19mb3JfYmFuZCk7Ci0KLS8qCi0gKiBpbml0aWFsaXplIHJ4b24gc3RydWN0dXJlIHdpdGggZGVmYXVsdCB2YWx1ZXMgZnJvbSBlZXByb20KLSAqLwotdm9pZCBpd2xfbGVnYWN5X2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0KLQltZW1zZXQoJmN0eC0+c3RhZ2luZywgMCwgc2l6ZW9mKGN0eC0+c3RhZ2luZykpOwotCi0JaWYgKCFjdHgtPnZpZikgewotCQljdHgtPnN0YWdpbmcuZGV2X3R5cGUgPSBjdHgtPnVudXNlZF9kZXZ0eXBlOwotCX0gZWxzZQotCXN3aXRjaCAoY3R4LT52aWYtPnR5cGUpIHsKLQotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJY3R4LT5zdGFnaW5nLmRldl90eXBlID0gY3R4LT5zdGF0aW9uX2RldnR5cGU7Ci0JCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgPSBSWE9OX0ZJTFRFUl9BQ0NFUFRfR1JQX01TSzsKLQkJYnJlYWs7Ci0KLQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQljdHgtPnN0YWdpbmcuZGV2X3R5cGUgPSBjdHgtPmlic3NfZGV2dHlwZTsKLQkJY3R4LT5zdGFnaW5nLmZsYWdzID0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOwotCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzID0gUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0sgfAotCQkJCQkJICBSWE9OX0ZJTFRFUl9BQ0NFUFRfR1JQX01TSzsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJVbnN1cHBvcnRlZCBpbnRlcmZhY2UgdHlwZSAlZFxuIiwKLQkJCWN0eC0+dmlmLT50eXBlKTsKLQkJYnJlYWs7Ci0JfQotCi0jaWYgMAotCS8qIFRPRE86ICBGaWd1cmUgb3V0IHdoZW4gc2hvcnRfcHJlYW1ibGUgd291bGQgYmUgc2V0IGFuZCBjYWNoZSBmcm9tCi0JICogdGhhdCAqLwotCWlmICghaHdfdG9fbG9jYWwocHJpdi0+aHcpLT5zaG9ydF9wcmVhbWJsZSkKLQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JZWxzZQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOwotI2VuZGlmCi0KLQljaF9pbmZvID0gaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIHByaXYtPmJhbmQsCi0JCQkJICAgICAgIGxlMTZfdG9fY3B1KGN0eC0+YWN0aXZlLmNoYW5uZWwpKTsKLQotCWlmICghY2hfaW5mbykKLQkJY2hfaW5mbyA9ICZwcml2LT5jaGFubmVsX2luZm9bMF07Ci0KLQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoX2luZm8tPmNoYW5uZWwpOwotCXByaXYtPmJhbmQgPSBjaF9pbmZvLT5iYW5kOwotCi0JaXdsX2xlZ2FjeV9zZXRfZmxhZ3NfZm9yX2JhbmQocHJpdiwgY3R4LCBwcml2LT5iYW5kLCBjdHgtPnZpZik7Ci0KLQljdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9Ci0JICAgIChJV0xfT0ZETV9SQVRFU19NQVNLID4+IElXTF9GSVJTVF9PRkRNX1JBVEUpICYgMHhGRjsKLQljdHgtPnN0YWdpbmcuY2NrX2Jhc2ljX3JhdGVzID0KLQkgICAgKElXTF9DQ0tfUkFURVNfTUFTSyA+PiBJV0xfRklSU1RfQ0NLX1JBVEUpICYgMHhGOwotCi0JLyogY2xlYXIgYm90aCBNSVggYW5kIFBVUkU0MCBtb2RlIGZsYWcgKi8KLQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gfihSWE9OX0ZMR19DSEFOTkVMX01PREVfTUlYRUQgfAotCQkJCQlSWE9OX0ZMR19DSEFOTkVMX01PREVfUFVSRV80MCk7Ci0JaWYgKGN0eC0+dmlmKQotCQltZW1jcHkoY3R4LT5zdGFnaW5nLm5vZGVfYWRkciwgY3R4LT52aWYtPmFkZHIsIEVUSF9BTEVOKTsKLQotCWN0eC0+c3RhZ2luZy5vZmRtX2h0X3NpbmdsZV9zdHJlYW1fYmFzaWNfcmF0ZXMgPSAweGZmOwotCWN0eC0+c3RhZ2luZy5vZmRtX2h0X2R1YWxfc3RyZWFtX2Jhc2ljX3JhdGVzID0gMHhmZjsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKTsKLQotdm9pZCBpd2xfbGVnYWN5X3NldF9yYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpodyA9IE5VTEw7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JaW50IGk7Ci0KLQlodyA9IGl3bF9nZXRfaHdfbW9kZShwcml2LCBwcml2LT5iYW5kKTsKLQlpZiAoIWh3KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byBzZXQgcmF0ZTogdW5hYmxlIHRvIGdldCBodyBtb2RlXG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCXByaXYtPmFjdGl2ZV9yYXRlID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBody0+bl9iaXRyYXRlczsgaSsrKSB7Ci0JCXJhdGUgPSAmKGh3LT5iaXRyYXRlc1tpXSk7Ci0JCWlmIChyYXRlLT5od192YWx1ZSA8IElXTF9SQVRFX0NPVU5UX0xFR0FDWSkKLQkJCXByaXYtPmFjdGl2ZV9yYXRlIHw9ICgxIDw8IHJhdGUtPmh3X3ZhbHVlKTsKLQl9Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAiU2V0IGFjdGl2ZV9yYXRlID0gJTB4XG4iLCBwcml2LT5hY3RpdmVfcmF0ZSk7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQljdHgtPnN0YWdpbmcuY2NrX2Jhc2ljX3JhdGVzID0KLQkJICAgIChJV0xfQ0NLX0JBU0lDX1JBVEVTX01BU0sgPj4gSVdMX0ZJUlNUX0NDS19SQVRFKSAmIDB4RjsKLQotCQljdHgtPnN0YWdpbmcub2ZkbV9iYXNpY19yYXRlcyA9Ci0JCSAgIChJV0xfT0ZETV9CQVNJQ19SQVRFU19NQVNLID4+IElXTF9GSVJTVF9PRkRNX1JBVEUpICYgMHhGRjsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2V0X3JhdGUpOwotCi12b2lkIGl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgaXNfc3VjY2VzcykKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGlzX3N1Y2Nlc3MpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUpOwotCi12b2lkIGl3bF9sZWdhY3lfcnhfY3NhKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9jc2Ffbm90aWZpY2F0aW9uICpjc2EgPSAmKHBrdC0+dS5jc2Ffbm90aWYpOwotCi0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqcnhvbiA9ICh2b2lkICopJmN0eC0+YWN0aXZlOwotCi0JaWYgKCF0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCWlmICghbGUzMl90b19jcHUoY3NhLT5zdGF0dXMpICYmIGNzYS0+Y2hhbm5lbCA9PSBwcml2LT5zd2l0Y2hfY2hhbm5lbCkgewotCQlyeG9uLT5jaGFubmVsID0gY3NhLT5jaGFubmVsOwotCQljdHgtPnN0YWdpbmcuY2hhbm5lbCA9IGNzYS0+Y2hhbm5lbDsKLQkJSVdMX0RFQlVHXzExSChwcml2LCAiQ1NBIG5vdGlmOiBjaGFubmVsICVkXG4iLAotCQkJICAgICAgbGUxNl90b19jcHUoY3NhLT5jaGFubmVsKSk7Ci0JCWl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShwcml2LCB0cnVlKTsKLQl9IGVsc2UgewotCQlJV0xfRVJSKHByaXYsICJDU0Egbm90aWYgKGZhaWwpIDogY2hhbm5lbCAlZFxuIiwKLQkJCWxlMTZfdG9fY3B1KGNzYS0+Y2hhbm5lbCkpOwotCQlpd2xfbGVnYWN5X2Noc3dpdGNoX2RvbmUocHJpdiwgZmFsc2UpOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9jc2EpOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi12b2lkIGl3bF9sZWdhY3lfcHJpbnRfcnhfY29uZmlnX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0Jc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgKnJ4b24gPSAmY3R4LT5zdGFnaW5nOwotCi0JSVdMX0RFQlVHX1JBRElPKHByaXYsICJSWCBDT05GSUc6XG4iKTsKLQlpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgSVdMX0RMX1JBRElPLCAodTggKikgcnhvbiwgc2l6ZW9mKCpyeG9uKSk7Ci0JSVdMX0RFQlVHX1JBRElPKHByaXYsICJ1MTYgY2hhbm5lbDogMHgleFxuIiwKLQkJCQlsZTE2X3RvX2NwdShyeG9uLT5jaGFubmVsKSk7Ci0JSVdMX0RFQlVHX1JBRElPKHByaXYsICJ1MzIgZmxhZ3M6IDB4JTA4WFxuIiwgbGUzMl90b19jcHUocnhvbi0+ZmxhZ3MpKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInUzMiBmaWx0ZXJfZmxhZ3M6IDB4JTA4eFxuIiwKLQkJCQlsZTMyX3RvX2NwdShyeG9uLT5maWx0ZXJfZmxhZ3MpKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInU4IGRldl90eXBlOiAweCV4XG4iLCByeG9uLT5kZXZfdHlwZSk7Ci0JSVdMX0RFQlVHX1JBRElPKHByaXYsICJ1OCBvZmRtX2Jhc2ljX3JhdGVzOiAweCUwMnhcbiIsCi0JCQlyeG9uLT5vZmRtX2Jhc2ljX3JhdGVzKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInU4IGNja19iYXNpY19yYXRlczogMHglMDJ4XG4iLAotCQkJCXJ4b24tPmNja19iYXNpY19yYXRlcyk7Ci0JSVdMX0RFQlVHX1JBRElPKHByaXYsICJ1OFs2XSBub2RlX2FkZHI6ICVwTVxuIiwgcnhvbi0+bm9kZV9hZGRyKTsKLQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInU4WzZdIGJzc2lkX2FkZHI6ICVwTVxuIiwgcnhvbi0+YnNzaWRfYWRkcik7Ci0JSVdMX0RFQlVHX1JBRElPKHByaXYsICJ1MTYgYXNzb2NfaWQ6IDB4JXhcbiIsCi0JCQkJbGUxNl90b19jcHUocnhvbi0+YXNzb2NfaWQpKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9wcmludF9yeF9jb25maWdfY21kKTsKLSNlbmRpZgotLyoqCi0gKiBpd2xfbGVnYWN5X2lycV9oYW5kbGVfZXJyb3IgLSBjYWxsZWQgZm9yIEhXIG9yIFNXIGVycm9yIGludGVycnVwdCBmcm9tIGNhcmQKLSAqLwotdm9pZCBpd2xfbGVnYWN5X2lycV9oYW5kbGVfZXJyb3Ioc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIFNldCB0aGUgRlcgZXJyb3IgZmxhZyAtLSBjbGVhcmVkIG9uIGl3bF9kb3duICovCi0Jc2V0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpOwotCi0JLyogQ2FuY2VsIGN1cnJlbnRseSBxdWV1ZWQgY29tbWFuZC4gKi8KLQljbGVhcl9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKTsKLQotCUlXTF9FUlIocHJpdiwgIkxvYWRlZCBmaXJtd2FyZSB2ZXJzaW9uOiAlc1xuIiwKLQkJcHJpdi0+aHctPndpcGh5LT5md192ZXJzaW9uKTsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPmR1bXBfbmljX2Vycm9yX2xvZyhwcml2KTsKLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maCkKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZHVtcF9maChwcml2LCBOVUxMLCBmYWxzZSk7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKHByaXYpICYgSVdMX0RMX0ZXX0VSUk9SUykKLQkJaXdsX2xlZ2FjeV9wcmludF9yeF9jb25maWdfY21kKHByaXYsCi0JCQkJCSZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0jZW5kaWYKLQotCXdha2VfdXAoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0KLQkvKiBLZWVwIHRoZSByZXN0YXJ0IHByb2Nlc3MgZnJvbSB0cnlpbmcgdG8gc2VuZCBob3N0Ci0JICogY29tbWFuZHMgYnkgY2xlYXJpbmcgdGhlIElOSVQgc3RhdHVzIGJpdCAqLwotCWNsZWFyX2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpOwotCi0JaWYgKCF0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUcocHJpdiwgSVdMX0RMX0ZXX0VSUk9SUywKLQkJCSAgIlJlc3RhcnRpbmcgYWRhcHRlciBkdWUgdG8gdUNvZGUgZXJyb3IuXG4iKTsKLQotCQlpZiAocHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5yZXN0YXJ0X2Z3KQotCQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXN0YXJ0KTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfaXJxX2hhbmRsZV9lcnJvcik7Ci0KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV9hcG1fc3RvcF9tYXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQgPSAwOwotCi0JLyogc3RvcCBkZXZpY2UncyBidXNtYXN0ZXIgRE1BIGFjdGl2aXR5ICovCi0JaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX1NUT1BfTUFTVEVSKTsKLQotCXJldCA9IGl3bF9wb2xsX2JpdChwcml2LCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19NQVNURVJfRElTQUJMRUQsCi0JCQlDU1JfUkVTRVRfUkVHX0ZMQUdfTUFTVEVSX0RJU0FCTEVELCAxMDApOwotCWlmIChyZXQpCi0JCUlXTF9XQVJOKHByaXYsICJNYXN0ZXIgRGlzYWJsZSBUaW1lZCBPdXQsIDEwMCB1c2VjXG4iKTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJzdG9wIG1hc3RlclxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGl3bF9sZWdhY3lfYXBtX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCUlXTF9ERUJVR19JTkZPKHByaXYsICJTdG9wIGNhcmQsIHB1dCBpbiBsb3cgcG93ZXIgc3RhdGVcbiIpOwotCi0JLyogU3RvcCBkZXZpY2UncyBETUEgYWN0aXZpdHkgKi8KLQlpd2xfbGVnYWN5X2FwbV9zdG9wX21hc3Rlcihwcml2KTsKLQotCS8qIFJlc2V0IHRoZSBlbnRpcmUgZGV2aWNlICovCi0JaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9SRVNFVCwgQ1NSX1JFU0VUX1JFR19GTEFHX1NXX1JFU0VUKTsKLQotCXVkZWxheSgxMCk7Ci0KLQkvKgotCSAqIENsZWFyICJpbml0aWFsaXphdGlvbiBjb21wbGV0ZSIgYml0IHRvIG1vdmUgYWRhcHRlciBmcm9tCi0JICogRDBBKiAocG93ZXJlZC11cCBBY3RpdmUpIC0tPiBEMFUqIChVbmluaXRpYWxpemVkKSBzdGF0ZS4KLQkgKi8KLQlpd2xfbGVnYWN5X2NsZWFyX2JpdChwcml2LCBDU1JfR1BfQ05UUkwsCi0JCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0lOSVRfRE9ORSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfYXBtX3N0b3ApOwotCi0KLS8qCi0gKiBTdGFydCB1cCBOSUMncyBiYXNpYyBmdW5jdGlvbmFsaXR5IGFmdGVyIGl0IGhhcyBiZWVuIHJlc2V0Ci0gKiAoZS5nLiBhZnRlciBwbGF0Zm9ybSBib290LCBvciBzaHV0ZG93biB2aWEgaXdsX2xlZ2FjeV9hcG1fc3RvcCgpKQotICogTk9URTogIFRoaXMgZG9lcyBub3QgbG9hZCB1Q29kZSBub3Igc3RhcnQgdGhlIGVtYmVkZGVkIHByb2Nlc3NvcgotICovCi1pbnQgaXdsX2xlZ2FjeV9hcG1faW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0JdTE2IGxjdGw7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdCBjYXJkJ3MgYmFzaWMgZnVuY3Rpb25zXG4iKTsKLQotCS8qCi0JICogVXNlICJzZXRfYml0IiBiZWxvdyByYXRoZXIgdGhhbiAid3JpdGUiLCB0byBwcmVzZXJ2ZSBhbnkgaGFyZHdhcmUKLQkgKiBiaXRzIGFscmVhZHkgc2V0IGJ5IGRlZmF1bHQgYWZ0ZXIgcmVzZXQuCi0JICovCi0KLQkvKiBEaXNhYmxlIEwwUyBleGl0IHRpbWVyIChwbGF0Zm9ybSBOTUkgV29yay9Bcm91bmQpICovCi0JaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9HSU9fQ0hJQ0tFTl9CSVRTLAotCQkJICBDU1JfR0lPX0NISUNLRU5fQklUU19SRUdfQklUX0RJU19MMFNfRVhJVF9USU1FUik7Ci0KLQkvKgotCSAqIERpc2FibGUgTDBzIHdpdGhvdXQgYWZmZWN0aW5nIEwxOwotCSAqICBkb24ndCB3YWl0IGZvciBJQ0ggTDBzIChJQ0ggYnVnIFcvQSkKLQkgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0dJT19DSElDS0VOX0JJVFMsCi0JCQkgIENTUl9HSU9fQ0hJQ0tFTl9CSVRTX1JFR19CSVRfTDFBX05PX0wwU19SWCk7Ci0KLQkvKiBTZXQgRkggd2FpdCB0aHJlc2hvbGQgdG8gbWF4aW11bSAoSFcgZXJyb3IgZHVyaW5nIHN0cmVzcyBXL0EpICovCi0JaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9EQkdfSFBFVF9NRU1fUkVHLAotCQkJCQlDU1JfREJHX0hQRVRfTUVNX1JFR19WQUwpOwotCi0JLyoKLQkgKiBFbmFibGUgSEFQIElOVEEgKGludGVycnVwdCBmcm9tIG1hbmFnZW1lbnQgYnVzKSB0bwotCSAqIHdha2UgZGV2aWNlJ3MgUENJIEV4cHJlc3MgbGluayBMMWEgLT4gTDBzCi0JICogTk9URTogIFRoaXMgaXMgbm8tb3AgZm9yIDM5NDUgKG5vbi1leGlzdGVudCBiaXQpCi0JICovCi0JaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJCSAgICBDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfSEFQX1dBS0VfTDFBKTsKLQotCS8qCi0JICogSFcgYnVnIFcvQSBmb3IgaW5zdGFiaWxpdHkgaW4gUENJZSBidXMgTDAtPkwwUy0+TDEgdHJhbnNpdGlvbi4KLQkgKiBDaGVjayBpZiBCSU9TIChvciBPUykgZW5hYmxlZCBMMS1BU1BNIG9uIHRoaXMgZGV2aWNlLgotCSAqIElmIHNvIChsaWtlbHkpLCBkaXNhYmxlIEwwUywgc28gZGV2aWNlIG1vdmVzIGRpcmVjdGx5IEwwLT5MMTsKLQkgKiAgICBjb3N0cyBuZWdsaWdpYmxlIGFtb3VudCBvZiBwb3dlciBzYXZpbmdzLgotCSAqIElmIG5vdCAodW5saWtlbHkpLCBlbmFibGUgTDBTLCBzbyB0aGVyZSBpcyBhdCBsZWFzdCBzb21lCi0JICogICAgcG93ZXIgc2F2aW5ncywgZXZlbiB3aXRob3V0IEwxLgotCSAqLwotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5zZXRfbDBzKSB7Ci0JCWxjdGwgPSBpd2xfbGVnYWN5X3BjaWVfbGlua19jdGwocHJpdik7Ci0JCWlmICgobGN0bCAmIFBDSV9DRkdfTElOS19DVFJMX1ZBTF9MMV9FTikgPT0KLQkJCQkJUENJX0NGR19MSU5LX0NUUkxfVkFMX0wxX0VOKSB7Ci0JCQkvKiBMMS1BU1BNIGVuYWJsZWQ7IGRpc2FibGUoISkgTDBTICAqLwotCQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9HSU9fUkVHLAotCQkJCQlDU1JfR0lPX1JFR19WQUxfTDBTX0VOQUJMRUQpOwotCQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJMMSBFbmFibGVkOyBEaXNhYmxpbmcgTDBTXG4iKTsKLQkJfSBlbHNlIHsKLQkJCS8qIEwxLUFTUE0gZGlzYWJsZWQ7IGVuYWJsZSghKSBMMFMgKi8KLQkJCWl3bF9sZWdhY3lfY2xlYXJfYml0KHByaXYsIENTUl9HSU9fUkVHLAotCQkJCQlDU1JfR0lPX1JFR19WQUxfTDBTX0VOQUJMRUQpOwotCQkJSVdMX0RFQlVHX1BPV0VSKHByaXYsICJMMSBEaXNhYmxlZDsgRW5hYmxpbmcgTDBTXG4iKTsKLQkJfQotCX0KLQotCS8qIENvbmZpZ3VyZSBhbmFsb2cgcGhhc2UtbG9jay1sb29wIGJlZm9yZSBhY3RpdmF0aW5nIHRvIEQwQSAqLwotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5wbGxfY2ZnX3ZhbCkKLQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9BTkFfUExMX0NGRywKLQkJCSAgICBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5wbGxfY2ZnX3ZhbCk7Ci0KLQkvKgotCSAqIFNldCAiaW5pdGlhbGl6YXRpb24gY29tcGxldGUiIGJpdCB0byBtb3ZlIGFkYXB0ZXIgZnJvbQotCSAqIEQwVSogLS0+IEQwQSogKHBvd2VyZWQtdXAgYWN0aXZlKSBzdGF0ZS4KLQkgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLCBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSU5JVF9ET05FKTsKLQotCS8qCi0JICogV2FpdCBmb3IgY2xvY2sgc3RhYmlsaXphdGlvbjsgb25jZSBzdGFiaWxpemVkLCBhY2Nlc3MgdG8KLQkgKiBkZXZpY2UtaW50ZXJuYWwgcmVzb3VyY2VzIGlzIHN1cHBvcnRlZCwgZS5nLiBpd2xfbGVnYWN5X3dyaXRlX3BycGgoKQotCSAqIGFuZCBhY2Nlc3NlcyB0byB1Q29kZSBTUkFNLgotCSAqLwotCXJldCA9IGl3bF9wb2xsX2JpdChwcml2LCBDU1JfR1BfQ05UUkwsCi0JCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZLAotCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19DTE9DS19SRUFEWSwgMjUwMDApOwotCWlmIChyZXQgPCAwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJGYWlsZWQgdG8gaW5pdCB0aGUgY2FyZFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCS8qCi0JICogRW5hYmxlIERNQSBhbmQgQlNNIChpZiB1c2VkKSBjbG9ja3MsIHdhaXQgZm9yIHRoZW0gdG8gc3RhYmlsaXplLgotCSAqIEJTTSAoQm9vc3RyYXAgU3RhdGUgTWFjaGluZSkgaXMgb25seSBpbiAzOTQ1IGFuZCA0OTY1LgotCSAqCi0JICogV3JpdGUgdG8gIkNMS19FTl9SRUciOyAiMSIgYml0cyBlbmFibGUgY2xvY2tzLCB3aGlsZSAiMCIgYml0cwotCSAqIGRvIG5vdCBkaXNhYmxlIGNsb2Nrcy4gIFRoaXMgcHJlc2VydmVzIGFueSBoYXJkd2FyZSBiaXRzIGFscmVhZHkKLQkgKiBzZXQgYnkgZGVmYXVsdCBpbiAiQ0xLX0NUUkxfUkVHIiBhZnRlciByZXNldC4KLQkgKi8KLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+dXNlX2JzbSkKLQkJaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFQTUdfQ0xLX0VOX1JFRywKLQkJCUFQTUdfQ0xLX1ZBTF9ETUFfQ0xLX1JRVCB8IEFQTUdfQ0xLX1ZBTF9CU01fQ0xLX1JRVCk7Ci0JZWxzZQotCQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQVBNR19DTEtfRU5fUkVHLAotCQkJQVBNR19DTEtfVkFMX0RNQV9DTEtfUlFUKTsKLQl1ZGVsYXkoMjApOwotCi0JLyogRGlzYWJsZSBMMS1BY3RpdmUgKi8KLQlpd2xfbGVnYWN5X3NldF9iaXRzX3BycGgocHJpdiwgQVBNR19QQ0lERVZfU1RUX1JFRywKLQkJCSAgQVBNR19QQ0lERVZfU1RUX1ZBTF9MMV9BQ1RfRElTKTsKLQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfYXBtX2luaXQpOwotCi0KLWludCBpd2xfbGVnYWN5X3NldF90eF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHM4IHR4X3Bvd2VyLCBib29sIGZvcmNlKQotewotCWludCByZXQ7Ci0JczggcHJldl90eF9wb3dlcjsKLQlib29sIGRlZmVyOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAocHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQgPT0gdHhfcG93ZXIgJiYgIWZvcmNlKQotCQlyZXR1cm4gMDsKLQotCWlmICghcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2VuZF90eF9wb3dlcikKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JLyogMCBkQm0gbWVhbiAxIG1pbGxpd2F0dCAqLwotCWlmICh0eF9wb3dlciA8IDApIHsKLQkJSVdMX1dBUk4ocHJpdiwKLQkJCSAiUmVxdWVzdGVkIHVzZXIgVFhQT1dFUiAlZCBiZWxvdyAxIG1XLlxuIiwKLQkJCSB0eF9wb3dlcik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICh0eF9wb3dlciA+IHByaXYtPnR4X3Bvd2VyX2RldmljZV9sbXQpIHsKLQkJSVdMX1dBUk4ocHJpdiwKLQkJCSJSZXF1ZXN0ZWQgdXNlciBUWFBPV0VSICVkIGFib3ZlIHVwcGVyIGxpbWl0ICVkLlxuIiwKLQkJCSB0eF9wb3dlciwgcHJpdi0+dHhfcG93ZXJfZGV2aWNlX2xtdCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWlmICghaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihwcml2KSkKLQkJcmV0dXJuIC1FSU87Ci0KLQkvKiBzY2FuIGNvbXBsZXRlIGFuZCBjb21taXRfcnhvbiB1c2UgdHhfcG93ZXJfbmV4dCB2YWx1ZSwKLQkgKiBpdCBhbHdheXMgbmVlZCB0byBiZSB1cGRhdGVkIGZvciBuZXdlc3QgcmVxdWVzdCAqLwotCXByaXYtPnR4X3Bvd2VyX25leHQgPSB0eF9wb3dlcjsKLQotCS8qIGRvIG5vdCBzZXQgdHggcG93ZXIgd2hlbiBzY2FubmluZyBvciBjaGFubmVsIGNoYW5naW5nICovCi0JZGVmZXIgPSB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpIHx8Ci0JCW1lbWNtcCgmY3R4LT5hY3RpdmUsICZjdHgtPnN0YWdpbmcsIHNpemVvZihjdHgtPnN0YWdpbmcpKTsKLQlpZiAoZGVmZXIgJiYgIWZvcmNlKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJEZWZlcnJpbmcgdHggcG93ZXIgc2V0XG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHJldl90eF9wb3dlciA9IHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10OwotCXByaXYtPnR4X3Bvd2VyX3VzZXJfbG10ID0gdHhfcG93ZXI7Ci0KLQlyZXQgPSBwcml2LT5jZmctPm9wcy0+bGliLT5zZW5kX3R4X3Bvd2VyKHByaXYpOwotCi0JLyogaWYgZmFpbCB0byBzZXQgdHhfcG93ZXIsIHJlc3RvcmUgdGhlIG9yaWcuIHR4IHBvd2VyICovCi0JaWYgKHJldCkgewotCQlwcml2LT50eF9wb3dlcl91c2VyX2xtdCA9IHByZXZfdHhfcG93ZXI7Ci0JCXByaXYtPnR4X3Bvd2VyX25leHQgPSBwcmV2X3R4X3Bvd2VyOwotCX0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NldF90eF9wb3dlcik7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9zZW5kX2J0X2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9idF9jbWQgYnRfY21kID0gewotCQkubGVhZF90aW1lID0gQlRfTEVBRF9USU1FX0RFRiwKLQkJLm1heF9raWxsID0gQlRfTUFYX0tJTExfREVGLAotCQkua2lsbF9hY2tfbWFzayA9IDAsCi0JCS5raWxsX2N0c19tYXNrID0gMCwKLQl9OwotCi0JaWYgKCFidF9jb2V4X2FjdGl2ZSkKLQkJYnRfY21kLmZsYWdzID0gQlRfQ09FWF9ESVNBQkxFOwotCWVsc2UKLQkJYnRfY21kLmZsYWdzID0gQlRfQ09FWF9FTkFCTEU7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQlQgY29leCAlc1xuIiwKLQkJKGJ0X2NtZC5mbGFncyA9PSBCVF9DT0VYX0RJU0FCTEUpID8gImRpc2FibGUiIDogImFjdGl2ZSIpOwotCi0JaWYgKGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX0JUX0NPTkZJRywKLQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfYnRfY21kKSwgJmJ0X2NtZCkpCi0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBzZW5kIEJUIENvZXggQ29uZmlnXG4iKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZW5kX2J0X2NvbmZpZyk7Ci0KLWludCBpd2xfbGVnYWN5X3NlbmRfc3RhdGlzdGljc19yZXF1ZXN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggZmxhZ3MsIGJvb2wgY2xlYXIpCi17Ci0Jc3RydWN0IGl3bF9zdGF0aXN0aWNzX2NtZCBzdGF0aXN0aWNzX2NtZCA9IHsKLQkJLmNvbmZpZ3VyYXRpb25fZmxhZ3MgPQotCQkJY2xlYXIgPyBJV0xfU1RBVFNfQ09ORl9DTEVBUl9TVEFUUyA6IDAsCi0JfTsKLQotCWlmIChmbGFncyAmIENNRF9BU1lOQykKLQkJcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1X2FzeW5jKHByaXYsIFJFUExZX1NUQVRJU1RJQ1NfQ01ELAotCQkJCQlzaXplb2Yoc3RydWN0IGl3bF9zdGF0aXN0aWNzX2NtZCksCi0JCQkJCSZzdGF0aXN0aWNzX2NtZCwgTlVMTCk7Ci0JZWxzZQotCQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfU1RBVElTVElDU19DTUQsCi0JCQkJCXNpemVvZihzdHJ1Y3QgaXdsX3N0YXRpc3RpY3NfY21kKSwKLQkJCQkJJnN0YXRpc3RpY3NfY21kKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdCk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9yeF9wbV9zbGVlcF9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX3NsZWVwX25vdGlmaWNhdGlvbiAqc2xlZXAgPSAmKHBrdC0+dS5zbGVlcF9ub3RpZik7Ci0JSVdMX0RFQlVHX1JYKHByaXYsICJzbGVlcCBtb2RlOiAlZCwgc3JjOiAlZFxuIiwKLQkJICAgICBzbGVlcC0+cG1fc2xlZXBfbW9kZSwgc2xlZXAtPnBtX3dha2V1cF9zcmMpOwotI2VuZGlmCi19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcnhfcG1fc2xlZXBfbm90aWYpOwotCi12b2lkIGl3bF9sZWdhY3lfcnhfcG1fZGVidWdfc3RhdGlzdGljc19ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0JdTMyIGxlbiA9IGxlMzJfdG9fY3B1KHBrdC0+bGVuX25fZmxhZ3MpICYgRkhfUlNDU1JfRlJBTUVfU0laRV9NU0s7Ci0JSVdMX0RFQlVHX1JBRElPKHByaXYsICJEdW1waW5nICVkIGJ5dGVzIG9mIHVuaGFuZGxlZCAiCi0JCQkibm90aWZpY2F0aW9uIGZvciAlczpcbiIsIGxlbiwKLQkJCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSk7Ci0JaXdsX3ByaW50X2hleF9kdW1wKHByaXYsIElXTF9ETF9SQURJTywgcGt0LT51LnJhdywgbGVuKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9wbV9kZWJ1Z19zdGF0aXN0aWNzX25vdGlmKTsKLQotdm9pZCBpd2xfbGVnYWN5X3J4X3JlcGx5X2Vycm9yKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCi0JSVdMX0VSUihwcml2LCAiRXJyb3IgUmVwbHkgdHlwZSAweCUwOFggY21kICVzICgweCUwMlgpICIKLQkJInNlcSAweCUwNFggc2VyIDB4JTA4WFxuIiwKLQkJbGUzMl90b19jcHUocGt0LT51LmVycl9yZXNwLmVycm9yX3R5cGUpLAotCQlpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKHBrdC0+dS5lcnJfcmVzcC5jbWRfaWQpLAotCQlwa3QtPnUuZXJyX3Jlc3AuY21kX2lkLAotCQlsZTE2X3RvX2NwdShwa3QtPnUuZXJyX3Jlc3AuYmFkX2NtZF9zZXFfbnVtKSwKLQkJbGUzMl90b19jcHUocGt0LT51LmVycl9yZXNwLmVycm9yX2luZm8pKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9yeF9yZXBseV9lcnJvcik7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9jbGVhcl9pc3Jfc3RhdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCW1lbXNldCgmcHJpdi0+aXNyX3N0YXRzLCAwLCBzaXplb2YocHJpdi0+aXNyX3N0YXRzKSk7Ci19Ci0KLWludCBpd2xfbGVnYWN5X21hY19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTE2IHF1ZXVlLAotCQkJICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHE7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihwcml2KSkgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gUkYgbm90IHJlYWR5XG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JaWYgKHF1ZXVlID49IEFDX05VTSkgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gcXVldWUgPj0gQUNfTlVNICVkXG4iLCBxdWV1ZSk7Ci0JCXJldHVybiAwOwotCX0KLQotCXEgPSBBQ19OVU0gLSAxIC0gcXVldWU7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uY3dfbWluID0KLQkJCWNwdV90b19sZTE2KHBhcmFtcy0+Y3dfbWluKTsKLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uY3dfbWF4ID0KLQkJCWNwdV90b19sZTE2KHBhcmFtcy0+Y3dfbWF4KTsKLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uYWlmc24gPSBwYXJhbXMtPmFpZnM7Ci0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmVkY2FfdHhvcCA9Ci0JCQkJY3B1X3RvX2xlMTYoKHBhcmFtcy0+dHhvcCAqIDMyKSk7Ci0KLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0ucmVzZXJ2ZWQxID0gMDsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfY29uZl90eCk7Ci0KLWludCBpd2xfbGVnYWN5X21hY190eF9sYXN0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCXJldHVybiBwcml2LT5pYnNzX21hbmFnZXIgPT0gSVdMX0lCU1NfTUFOQUdFUjsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGl3bF9sZWdhY3lfbWFjX3R4X2xhc3RfYmVhY29uKTsKLQotc3RhdGljIGludAotaXdsX2xlZ2FjeV9zZXRfbW9kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JaXdsX2xlZ2FjeV9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHByaXYsIGN0eCk7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQotCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQotCXJldHVybiBpd2xfbGVnYWN5X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV9zZXR1cF9pbnRlcmZhY2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCWludCBlcnI7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQkvKgotCSAqIFRoaXMgdmFyaWFibGUgd2lsbCBiZSBjb3JyZWN0IG9ubHkgd2hlbiB0aGVyZSdzIGp1c3QKLQkgKiBhIHNpbmdsZSBjb250ZXh0LCBidXQgYWxsIGNvZGUgdXNpbmcgaXQgaXMgZm9yIGhhcmR3YXJlCi0JICogdGhhdCBzdXBwb3J0cyBvbmx5IG9uZSBjb250ZXh0LgotCSAqLwotCXByaXYtPml3X21vZGUgPSB2aWYtPnR5cGU7Ci0KLQljdHgtPmlzX2FjdGl2ZSA9IHRydWU7Ci0KLQllcnIgPSBpd2xfbGVnYWN5X3NldF9tb2RlKHByaXYsIGN0eCk7Ci0JaWYgKGVycikgewotCQlpZiAoIWN0eC0+YWx3YXlzX2FjdGl2ZSkKLQkJCWN0eC0+aXNfYWN0aXZlID0gZmFsc2U7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotaXdsX2xlZ2FjeV9tYWNfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wLCAqY3R4ID0gTlVMTDsKLQlpbnQgZXJyOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlcjogdHlwZSAlZCwgYWRkciAlcE1cbiIsCi0JCQkgICB2aWYtPnR5cGUsIHZpZi0+YWRkcik7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIlRyeSB0byBhZGQgaW50ZXJmYWNlIHdoZW4gZGV2aWNlIG5vdCByZWFkeVxuIik7Ci0JCWVyciA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgdG1wKSB7Ci0JCXUzMiBwb3NzaWJsZV9tb2RlcyA9Ci0JCQl0bXAtPmludGVyZmFjZV9tb2RlcyB8IHRtcC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKLQotCQlpZiAodG1wLT52aWYpIHsKLQkJCS8qIGNoZWNrIGlmIHRoaXMgYnVzeSBjb250ZXh0IGlzIGV4Y2x1c2l2ZSAqLwotCQkJaWYgKHRtcC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlcyAmCi0JCQkJCQlCSVQodG1wLT52aWYtPnR5cGUpKSB7Ci0JCQkJZXJyID0gLUVJTlZBTDsKLQkJCQlnb3RvIG91dDsKLQkJCX0KLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJaWYgKCEocG9zc2libGVfbW9kZXMgJiBCSVQodmlmLT50eXBlKSkpCi0JCQljb250aW51ZTsKLQotCQkvKiBoYXZlIG1heWJlIHVzYWJsZSBjb250ZXh0IHcvbyBpbnRlcmZhY2UgKi8KLQkJY3R4ID0gdG1wOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIWN0eCkgewotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JdmlmX3ByaXYtPmN0eCA9IGN0eDsKLQljdHgtPnZpZiA9IHZpZjsKLQotCWVyciA9IGl3bF9sZWdhY3lfc2V0dXBfaW50ZXJmYWNlKHByaXYsIGN0eCk7Ci0JaWYgKCFlcnIpCi0JCWdvdG8gb3V0OwotCi0JY3R4LT52aWYgPSBOVUxMOwotCXByaXYtPml3X21vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCXJldHVybiBlcnI7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfbWFjX2FkZF9pbnRlcmZhY2UpOwotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X3RlYXJkb3duX2ludGVyZmFjZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICBib29sIG1vZGVfY2hhbmdlKQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfbGVnYWN5X3J4b25fY3R4X2Zyb21fdmlmKHZpZik7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAocHJpdi0+c2Nhbl92aWYgPT0gdmlmKSB7Ci0JCWl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOwotCQlpd2xfbGVnYWN5X2ZvcmNlX3NjYW5fZW5kKHByaXYpOwotCX0KLQotCWlmICghbW9kZV9jaGFuZ2UpIHsKLQkJaXdsX2xlZ2FjeV9zZXRfbW9kZShwcml2LCBjdHgpOwotCQlpZiAoIWN0eC0+YWx3YXlzX2FjdGl2ZSkKLQkJCWN0eC0+aXNfYWN0aXZlID0gZmFsc2U7Ci0JfQotfQotCi12b2lkIGl3bF9sZWdhY3lfbWFjX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfbGVnYWN5X3J4b25fY3R4X2Zyb21fdmlmKHZpZik7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCVdBUk5fT04oY3R4LT52aWYgIT0gdmlmKTsKLQljdHgtPnZpZiA9IE5VTEw7Ci0KLQlpd2xfbGVnYWN5X3RlYXJkb3duX2ludGVyZmFjZShwcml2LCB2aWYsIGZhbHNlKTsKLQotCW1lbXNldChwcml2LT5ic3NpZCwgMCwgRVRIX0FMRU4pOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfcmVtb3ZlX2ludGVyZmFjZSk7Ci0KLWludCBpd2xfbGVnYWN5X2FsbG9jX3R4cV9tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWlmICghcHJpdi0+dHhxKQotCQlwcml2LT50eHEgPSBremFsbG9jKAotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfdHhfcXVldWUpICoKLQkJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT50eHEpIHsKLQkJSVdMX0VSUihwcml2LCAiTm90IGVub3VnaCBtZW1vcnkgZm9yIHR4cVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9hbGxvY190eHFfbWVtKTsKLQotdm9pZCBpd2xfbGVnYWN5X3R4cV9tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWtmcmVlKHByaXYtPnR4cSk7Ci0JcHJpdi0+dHhxID0gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV90eHFfbWVtKTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0KLSNkZWZpbmUgSVdMX1RSQUZGSUNfRFVNUF9TSVpFCShJV0xfVFJBRkZJQ19FTlRSWV9TSVpFICogSVdMX1RSQUZGSUNfRU5UUklFUykKLQotdm9pZCBpd2xfbGVnYWN5X3Jlc2V0X3RyYWZmaWNfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlwcml2LT50eF90cmFmZmljX2lkeCA9IDA7Ci0JcHJpdi0+cnhfdHJhZmZpY19pZHggPSAwOwotCWlmIChwcml2LT50eF90cmFmZmljKQotCQltZW1zZXQocHJpdi0+dHhfdHJhZmZpYywgMCwgSVdMX1RSQUZGSUNfRFVNUF9TSVpFKTsKLQlpZiAocHJpdi0+cnhfdHJhZmZpYykKLQkJbWVtc2V0KHByaXYtPnJ4X3RyYWZmaWMsIDAsIElXTF9UUkFGRklDX0RVTVBfU0laRSk7Ci19Ci0KLWludCBpd2xfbGVnYWN5X2FsbG9jX3RyYWZmaWNfbWVtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MzIgdHJhZmZpY19zaXplID0gSVdMX1RSQUZGSUNfRFVNUF9TSVpFOwotCi0JaWYgKGl3bGVnYWN5X2RlYnVnX2xldmVsICYgSVdMX0RMX1RYKSB7Ci0JCWlmICghcHJpdi0+dHhfdHJhZmZpYykgewotCQkJcHJpdi0+dHhfdHJhZmZpYyA9Ci0JCQkJa3phbGxvYyh0cmFmZmljX3NpemUsIEdGUF9LRVJORUwpOwotCQkJaWYgKCFwcml2LT50eF90cmFmZmljKQotCQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCWlmIChpd2xlZ2FjeV9kZWJ1Z19sZXZlbCAmIElXTF9ETF9SWCkgewotCQlpZiAoIXByaXYtPnJ4X3RyYWZmaWMpIHsKLQkJCXByaXYtPnJ4X3RyYWZmaWMgPQotCQkJCWt6YWxsb2ModHJhZmZpY19zaXplLCBHRlBfS0VSTkVMKTsKLQkJCWlmICghcHJpdi0+cnhfdHJhZmZpYykKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCX0KLQlpd2xfbGVnYWN5X3Jlc2V0X3RyYWZmaWNfbG9nKHByaXYpOwotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2FsbG9jX3RyYWZmaWNfbWVtKTsKLQotdm9pZCBpd2xfbGVnYWN5X2ZyZWVfdHJhZmZpY19tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWtmcmVlKHByaXYtPnR4X3RyYWZmaWMpOwotCXByaXYtPnR4X3RyYWZmaWMgPSBOVUxMOwotCi0Ja2ZyZWUocHJpdi0+cnhfdHJhZmZpYyk7Ci0JcHJpdi0+cnhfdHJhZmZpYyA9IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZnJlZV90cmFmZmljX21lbSk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9kYmdfbG9nX3R4X2RhdGFfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkgICAgICB1MTYgbGVuZ3RoLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQotewotCV9fbGUxNiBmYzsKLQl1MTYgbGVuOwotCi0JaWYgKGxpa2VseSghKGl3bGVnYWN5X2RlYnVnX2xldmVsICYgSVdMX0RMX1RYKSkpCi0JCXJldHVybjsKLQotCWlmICghcHJpdi0+dHhfdHJhZmZpYykKLQkJcmV0dXJuOwotCi0JZmMgPSBoZWFkZXItPmZyYW1lX2NvbnRyb2w7Ci0JaWYgKGllZWU4MDIxMV9pc19kYXRhKGZjKSkgewotCQlsZW4gPSAobGVuZ3RoID4gSVdMX1RSQUZGSUNfRU5UUllfU0laRSkKLQkJICAgICAgID8gSVdMX1RSQUZGSUNfRU5UUllfU0laRSA6IGxlbmd0aDsKLQkJbWVtY3B5KChwcml2LT50eF90cmFmZmljICsKLQkJICAgICAgIChwcml2LT50eF90cmFmZmljX2lkeCAqIElXTF9UUkFGRklDX0VOVFJZX1NJWkUpKSwKLQkJICAgICAgIGhlYWRlciwgbGVuKTsKLQkJcHJpdi0+dHhfdHJhZmZpY19pZHggPQotCQkJKHByaXYtPnR4X3RyYWZmaWNfaWR4ICsgMSkgJSBJV0xfVFJBRkZJQ19FTlRSSUVTOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9kYmdfbG9nX3R4X2RhdGFfZnJhbWUpOwotCi12b2lkIGl3bF9sZWdhY3lfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJICAgICAgdTE2IGxlbmd0aCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcikKLXsKLQlfX2xlMTYgZmM7Ci0JdTE2IGxlbjsKLQotCWlmIChsaWtlbHkoIShpd2xlZ2FjeV9kZWJ1Z19sZXZlbCAmIElXTF9ETF9SWCkpKQotCQlyZXR1cm47Ci0KLQlpZiAoIXByaXYtPnJ4X3RyYWZmaWMpCi0JCXJldHVybjsKLQotCWZjID0gaGVhZGVyLT5mcmFtZV9jb250cm9sOwotCWlmIChpZWVlODAyMTFfaXNfZGF0YShmYykpIHsKLQkJbGVuID0gKGxlbmd0aCA+IElXTF9UUkFGRklDX0VOVFJZX1NJWkUpCi0JCSAgICAgICA/IElXTF9UUkFGRklDX0VOVFJZX1NJWkUgOiBsZW5ndGg7Ci0JCW1lbWNweSgocHJpdi0+cnhfdHJhZmZpYyArCi0JCSAgICAgICAocHJpdi0+cnhfdHJhZmZpY19pZHggKiBJV0xfVFJBRkZJQ19FTlRSWV9TSVpFKSksCi0JCSAgICAgICBoZWFkZXIsIGxlbik7Ci0JCXByaXYtPnJ4X3RyYWZmaWNfaWR4ID0KLQkJCShwcml2LT5yeF90cmFmZmljX2lkeCArIDEpICUgSVdMX1RSQUZGSUNfRU5UUklFUzsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKTsKLQotY29uc3QgY2hhciAqaXdsX2xlZ2FjeV9nZXRfbWdtdF9zdHJpbmcoaW50IGNtZCkKLXsKLQlzd2l0Y2ggKGNtZCkgewotCQlJV0xfQ01EKE1BTkFHRU1FTlRfQVNTT0NfUkVRKTsKLQkJSVdMX0NNRChNQU5BR0VNRU5UX0FTU09DX1JFU1ApOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfUkVBU1NPQ19SRVEpOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfUkVBU1NPQ19SRVNQKTsKLQkJSVdMX0NNRChNQU5BR0VNRU5UX1BST0JFX1JFUSk7Ci0JCUlXTF9DTUQoTUFOQUdFTUVOVF9QUk9CRV9SRVNQKTsKLQkJSVdMX0NNRChNQU5BR0VNRU5UX0JFQUNPTik7Ci0JCUlXTF9DTUQoTUFOQUdFTUVOVF9BVElNKTsKLQkJSVdMX0NNRChNQU5BR0VNRU5UX0RJU0FTU09DKTsKLQkJSVdMX0NNRChNQU5BR0VNRU5UX0FVVEgpOwotCQlJV0xfQ01EKE1BTkFHRU1FTlRfREVBVVRIKTsKLQkJSVdMX0NNRChNQU5BR0VNRU5UX0FDVElPTik7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuICJVTktOT1dOIjsKLQotCX0KLX0KLQotY29uc3QgY2hhciAqaXdsX2xlZ2FjeV9nZXRfY3RybF9zdHJpbmcoaW50IGNtZCkKLXsKLQlzd2l0Y2ggKGNtZCkgewotCQlJV0xfQ01EKENPTlRST0xfQkFDS19SRVEpOwotCQlJV0xfQ01EKENPTlRST0xfQkFDSyk7Ci0JCUlXTF9DTUQoQ09OVFJPTF9QU1BPTEwpOwotCQlJV0xfQ01EKENPTlRST0xfUlRTKTsKLQkJSVdMX0NNRChDT05UUk9MX0NUUyk7Ci0JCUlXTF9DTUQoQ09OVFJPTF9BQ0spOwotCQlJV0xfQ01EKENPTlRST0xfQ0ZFTkQpOwotCQlJV0xfQ01EKENPTlRST0xfQ0ZFTkRBQ0spOwotCWRlZmF1bHQ6Ci0JCXJldHVybiAiVU5LTk9XTiI7Ci0KLQl9Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9jbGVhcl90cmFmZmljX3N0YXRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQltZW1zZXQoJnByaXYtPnR4X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHRyYWZmaWNfc3RhdHMpKTsKLQltZW1zZXQoJnByaXYtPnJ4X3N0YXRzLCAwLCBzaXplb2Yoc3RydWN0IHRyYWZmaWNfc3RhdHMpKTsKLX0KLQotLyoKLSAqIGlmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTIGRlZmluZWQsCi0gKiBpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyBmdW5jdGlvbiB3aWxsCi0gKiByZWNvcmQgYWxsIHRoZSBNR01ULCBDVFJMIGFuZCBEQVRBIHBrdCBmb3IgYm90aCBUWCBhbmQgUnggcGFzcwotICogVXNlIGRlYnVnRnMgdG8gZGlzcGxheSB0aGUgcngvcnhfc3RhdGlzdGljcwotICogaWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMgbm90IGJlaW5nIGRlZmluZWQsIHRoZW4gbm8gTUdNVCBhbmQgQ1RSTAotICogaW5mb3JtYXRpb24gd2lsbCBiZSByZWNvcmRlZCwgYnV0IERBVEEgcGt0IHN0aWxsIHdpbGwgYmUgcmVjb3JkZWQKLSAqIGZvciB0aGUgcmVhc29uIG9mIGl3bF9sZWQuYyBuZWVkIHRvIGNvbnRyb2wgdGhlIGxlZCBibGlua2luZyBiYXNlZCBvbgotICogbnVtYmVyIG9mIHR4IGFuZCByeCBkYXRhLgotICoKLSAqLwotdm9pZAotaXdsX2xlZ2FjeV91cGRhdGVfc3RhdHMoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGlzX3R4LCBfX2xlMTYgZmMsIHUxNiBsZW4pCi17Ci0Jc3RydWN0IHRyYWZmaWNfc3RhdHMJKnN0YXRzOwotCi0JaWYgKGlzX3R4KQotCQlzdGF0cyA9ICZwcml2LT50eF9zdGF0czsKLQllbHNlCi0JCXN0YXRzID0gJnByaXYtPnJ4X3N0YXRzOwotCi0JaWYgKGllZWU4MDIxMV9pc19tZ210KGZjKSkgewotCQlzd2l0Y2ggKGZjICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfU1RZUEUpKSB7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUSk6Ci0JCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0FTU09DX1JFUV0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9BU1NPQ19SRVNQKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQVNTT0NfUkVTUF0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9SRUFTU09DX1JFUSk6Ci0JCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX1JFQVNTT0NfUkVRXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVTUCk6Ci0JCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX1JFQVNTT0NfUkVTUF0rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVEpOgotCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9QUk9CRV9SRVFdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFJPQkVfUkVTUCk6Ci0JCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX1BST0JFX1JFU1BdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQkVBQ09OKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfQkVBQ09OXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FUSU0pOgotCQkJc3RhdHMtPm1nbXRbTUFOQUdFTUVOVF9BVElNXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0RJU0FTU09DKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfRElTQVNTT0NdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVVUSCk6Ci0JCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0FVVEhdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfREVBVVRIKToKLQkJCXN0YXRzLT5tZ210W01BTkFHRU1FTlRfREVBVVRIXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FDVElPTik6Ci0JCQlzdGF0cy0+bWdtdFtNQU5BR0VNRU5UX0FDVElPTl0rKzsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIGlmIChpZWVlODAyMTFfaXNfY3RsKGZjKSkgewotCQlzd2l0Y2ggKGZjICYgY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfU1RZUEUpKSB7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0JBQ0tfUkVRKToKLQkJCXN0YXRzLT5jdHJsW0NPTlRST0xfQkFDS19SRVFdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQkFDSyk6Ci0JCQlzdGF0cy0+Y3RybFtDT05UUk9MX0JBQ0tdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUFNQT0xMKToKLQkJCXN0YXRzLT5jdHJsW0NPTlRST0xfUFNQT0xMXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1JUUyk6Ci0JCQlzdGF0cy0+Y3RybFtDT05UUk9MX1JUU10rKzsKLQkJCWJyZWFrOwotCQljYXNlIGNwdV90b19sZTE2KElFRUU4MDIxMV9TVFlQRV9DVFMpOgotCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9DVFNdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQUNLKToKLQkJCXN0YXRzLT5jdHJsW0NPTlRST0xfQUNLXSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0NGRU5EKToKLQkJCXN0YXRzLT5jdHJsW0NPTlRST0xfQ0ZFTkRdKys7Ci0JCQlicmVhazsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQ0ZFTkRBQ0spOgotCQkJc3RhdHMtPmN0cmxbQ09OVFJPTF9DRkVOREFDS10rKzsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIHsKLQkJLyogZGF0YSAqLwotCQlzdGF0cy0+ZGF0YV9jbnQrKzsKLQkJc3RhdHMtPmRhdGFfYnl0ZXMgKz0gbGVuOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV91cGRhdGVfc3RhdHMpOwotI2VuZGlmCi0KLWludCBpd2xfbGVnYWN5X2ZvcmNlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBleHRlcm5hbCkKLXsKLQlzdHJ1Y3QgaXdsX2ZvcmNlX3Jlc2V0ICpmb3JjZV9yZXNldDsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmb3JjZV9yZXNldCA9ICZwcml2LT5mb3JjZV9yZXNldDsKLQlmb3JjZV9yZXNldC0+cmVzZXRfcmVxdWVzdF9jb3VudCsrOwotCWlmICghZXh0ZXJuYWwpIHsKLQkJaWYgKGZvcmNlX3Jlc2V0LT5sYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXMgJiYKLQkJICAgIHRpbWVfYWZ0ZXIoZm9yY2VfcmVzZXQtPmxhc3RfZm9yY2VfcmVzZXRfamlmZmllcyArCi0JCSAgICBmb3JjZV9yZXNldC0+cmVzZXRfZHVyYXRpb24sIGppZmZpZXMpKSB7Ci0JCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZm9yY2UgcmVzZXQgcmVqZWN0ZWRcbiIpOwotCQkJZm9yY2VfcmVzZXQtPnJlc2V0X3JlamVjdF9jb3VudCsrOwotCQkJcmV0dXJuIC1FQUdBSU47Ci0JCX0KLQl9Ci0JZm9yY2VfcmVzZXQtPnJlc2V0X3N1Y2Nlc3NfY291bnQrKzsKLQlmb3JjZV9yZXNldC0+bGFzdF9mb3JjZV9yZXNldF9qaWZmaWVzID0gamlmZmllczsKLQotCS8qCi0JICogaWYgdGhlIHJlcXVlc3QgaXMgZnJvbSBleHRlcm5hbChleDogZGVidWdmcyksCi0JICogdGhlbiBhbHdheXMgcGVyZm9ybSB0aGUgcmVxdWVzdCBpbiByZWdhcmRsZXNzIHRoZSBtb2R1bGUKLQkgKiBwYXJhbWV0ZXIgc2V0dGluZwotCSAqIGlmIHRoZSByZXF1ZXN0IGlzIGZyb20gaW50ZXJuYWwgKHVDb2RlIGVycm9yIG9yIGRyaXZlcgotCSAqIGRldGVjdCBmYWlsdXJlKSwgdGhlbiBmd19yZXN0YXJ0IG1vZHVsZSBwYXJhbWV0ZXIKLQkgKiBuZWVkIHRvIGJlIGNoZWNrIGJlZm9yZSBwZXJmb3JtaW5nIGZpcm13YXJlIHJlbG9hZAotCSAqLwotCi0JaWYgKCFleHRlcm5hbCAmJiAhcHJpdi0+Y2ZnLT5tb2RfcGFyYW1zLT5yZXN0YXJ0X2Z3KSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJDYW5jZWwgZmlybXdhcmUgcmVsb2FkIGJhc2VkIG9uICIKLQkJCSAgICAgICAibW9kdWxlIHBhcmFtZXRlciBzZXR0aW5nXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JSVdMX0VSUihwcml2LCAiT24gZGVtYW5kIGZpcm13YXJlIHJlbG9hZFxuIik7Ci0KLQkvKiBTZXQgdGhlIEZXIGVycm9yIGZsYWcgLS0gY2xlYXJlZCBvbiBpd2xfZG93biAqLwotCXNldF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKTsKLQl3YWtlX3VwKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotCS8qCi0JICogS2VlcCB0aGUgcmVzdGFydCBwcm9jZXNzIGZyb20gdHJ5aW5nIHRvIHNlbmQgaG9zdAotCSAqIGNvbW1hbmRzIGJ5IGNsZWFyaW5nIHRoZSBJTklUIHN0YXR1cyBiaXQKLQkgKi8KLQljbGVhcl9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKTsKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludAotaXdsX2xlZ2FjeV9tYWNfY2hhbmdlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQllbnVtIG5sODAyMTFfaWZ0eXBlIG5ld3R5cGUsIGJvb2wgbmV3cDJwKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfbGVnYWN5X3J4b25fY3R4X2Zyb21fdmlmKHZpZik7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKnRtcDsKLQl1MzIgaW50ZXJmYWNlX21vZGVzOwotCWludCBlcnI7Ci0KLQluZXd0eXBlID0gaWVlZTgwMjExX2lmdHlwZV9wMnAobmV3dHlwZSwgbmV3cDJwKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWlmICghY3R4LT52aWYgfHwgIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpIHsKLQkJLyoKLQkJICogSHVoPyBCdXQgd2FpdCAuLi4gdGhpcyBjYW4gbWF5YmUgaGFwcGVuIHdoZW4KLQkJICogd2UncmUgaW4gdGhlIG1pZGRsZSBvZiBhIGZpcm13YXJlIHJlc3RhcnQhCi0JCSAqLwotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWludGVyZmFjZV9tb2RlcyA9IGN0eC0+aW50ZXJmYWNlX21vZGVzIHwgY3R4LT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOwotCi0JaWYgKCEoaW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpKSkgewotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpIHsKLQkJZm9yX2VhY2hfY29udGV4dChwcml2LCB0bXApIHsKLQkJCWlmIChjdHggPT0gdG1wKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoIXRtcC0+dmlmKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvKgotCQkJICogVGhlIGN1cnJlbnQgbW9kZSBzd2l0Y2ggd291bGQgYmUgZXhjbHVzaXZlLCBidXQKLQkJCSAqIGFub3RoZXIgY29udGV4dCBpcyBhY3RpdmUgLi4uIHJlZnVzZSB0aGUgc3dpdGNoLgotCQkJICovCi0JCQllcnIgPSAtRUJVU1k7Ci0JCQlnb3RvIG91dDsKLQkJfQotCX0KLQotCS8qIHN1Y2Nlc3MgKi8KLQlpd2xfbGVnYWN5X3RlYXJkb3duX2ludGVyZmFjZShwcml2LCB2aWYsIHRydWUpOwotCXZpZi0+dHlwZSA9IG5ld3R5cGU7Ci0JdmlmLT5wMnAgPSBuZXdwMnA7Ci0JZXJyID0gaXdsX2xlZ2FjeV9zZXR1cF9pbnRlcmZhY2UocHJpdiwgY3R4KTsKLQlXQVJOX09OKGVycik7Ci0JLyoKLQkgKiBXZSd2ZSBzd2l0Y2hlZCBpbnRlcm5hbGx5LCBidXQgc3VibWl0dGluZyB0byB0aGUKLQkgKiBkZXZpY2UgbWF5IGhhdmUgZmFpbGVkIGZvciBzb21lIHJlYXNvbi4gTWFzayB0aGlzCi0JICogZXJyb3IsIGJlY2F1c2Ugb3RoZXJ3aXNlIG1hYzgwMjExIHdpbGwgbm90IHN3aXRjaAotCSAqIChhbmQgc2V0IHRoZSBpbnRlcmZhY2UgdHlwZSBiYWNrKSBhbmQgd2UnbGwgYmUKLQkgKiBvdXQgb2Ygc3luYyB3aXRoIGl0LgotCSAqLwotCWVyciA9IDA7Ci0KLSBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9tYWNfY2hhbmdlX2ludGVyZmFjZSk7Ci0KLS8qCi0gKiBPbiBldmVyeSB3YXRjaGRvZyB0aWNrIHdlIGNoZWNrIChsYXRlc3QpIHRpbWUgc3RhbXAuIElmIGl0IGRvZXMgbm90Ci0gKiBjaGFuZ2UgZHVyaW5nIHRpbWVvdXQgcGVyaW9kIGFuZCBxdWV1ZSBpcyBub3QgZW1wdHkgd2UgcmVzZXQgZmlybXdhcmUuCi0gKi8KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV9jaGVja19zdHVja19xdWV1ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBjbnQpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVtjbnRdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKLQlpbnQgcmV0OwotCi0JaWYgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikgewotCQl0eHEtPnRpbWVfc3RhbXAgPSBqaWZmaWVzOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl0aW1lb3V0ID0gdHhxLT50aW1lX3N0YW1wICsKLQkJICBtc2Vjc190b19qaWZmaWVzKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPndkX3RpbWVvdXQpOwotCi0JaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywgdGltZW91dCkpIHsKLQkJSVdMX0VSUihwcml2LCAiUXVldWUgJWQgc3R1Y2sgZm9yICV1IG1zLlxuIiwKLQkJCQlxLT5pZCwgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dCk7Ci0JCXJldCA9IGl3bF9sZWdhY3lfZm9yY2VfcmVzZXQocHJpdiwgZmFsc2UpOwotCQlyZXR1cm4gKHJldCA9PSAtRUFHQUlOKSA/IDAgOiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi0vKgotICogTWFraW5nIHdhdGNoZG9nIHRpY2sgYmUgYSBxdWFydGVyIG9mIHRpbWVvdXQgYXNzdXJlIHdlIHdpbGwKLSAqIGRpc2NvdmVyIHRoZSBxdWV1ZSBodW5nIGJldHdlZW4gdGltZW91dCBhbmQgMS4yNSp0aW1lb3V0Ci0gKi8KLSNkZWZpbmUgSVdMX1dEX1RJQ0sodGltZW91dCkgKCh0aW1lb3V0KSAvIDQpCi0KLS8qCi0gKiBXYXRjaGRvZyB0aW1lciBjYWxsYmFjaywgd2UgY2hlY2sgZWFjaCB0eCBxdWV1ZSBmb3Igc3R1Y2ssIGlmIGlmIGh1bmcKLSAqIHdlIHJlc2V0IHRoZSBmaXJtd2FyZS4gSWYgZXZlcnl0aGluZyBpcyBmaW5lIGp1c3QgcmVhcm0gdGhlIHRpbWVyLgotICovCi12b2lkIGl3bF9sZWdhY3lfYmdfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgaXdsX3ByaXYgKilkYXRhOwotCWludCBjbnQ7Ci0JdW5zaWduZWQgbG9uZyB0aW1lb3V0OwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQl0aW1lb3V0ID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dDsKLQlpZiAodGltZW91dCA9PSAwKQotCQlyZXR1cm47Ci0KLQkvKiBtb25pdG9yIGFuZCBjaGVjayBmb3Igc3R1Y2sgY21kIHF1ZXVlICovCi0JaWYgKGl3bF9sZWdhY3lfY2hlY2tfc3R1Y2tfcXVldWUocHJpdiwgcHJpdi0+Y21kX3F1ZXVlKSkKLQkJcmV0dXJuOwotCi0JLyogbW9uaXRvciBhbmQgY2hlY2sgZm9yIG90aGVyIHN0dWNrIHF1ZXVlcyAqLwotCWlmIChpd2xfbGVnYWN5X2lzX2FueV9hc3NvY2lhdGVkKHByaXYpKSB7Ci0JCWZvciAoY250ID0gMDsgY250IDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBjbnQrKykgewotCQkJLyogc2tpcCBhcyB3ZSBhbHJlYWR5IGNoZWNrZWQgdGhlIGNvbW1hbmQgcXVldWUgKi8KLQkJCWlmIChjbnQgPT0gcHJpdi0+Y21kX3F1ZXVlKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGl3bF9sZWdhY3lfY2hlY2tfc3R1Y2tfcXVldWUocHJpdiwgY250KSkKLQkJCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQltb2RfdGltZXIoJnByaXYtPndhdGNoZG9nLCBqaWZmaWVzICsKLQkJICBtc2Vjc190b19qaWZmaWVzKElXTF9XRF9USUNLKHRpbWVvdXQpKSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfYmdfd2F0Y2hkb2cpOwotCi12b2lkIGl3bF9sZWdhY3lfc2V0dXBfd2F0Y2hkb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dDsKLQotCWlmICh0aW1lb3V0KQotCQltb2RfdGltZXIoJnByaXYtPndhdGNoZG9nLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhJV0xfV0RfVElDSyh0aW1lb3V0KSkpOwotCWVsc2UKLQkJZGVsX3RpbWVyKCZwcml2LT53YXRjaGRvZyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2V0dXBfd2F0Y2hkb2cpOwotCi0vKgotICogZXh0ZW5kZWQgYmVhY29uIHRpbWUgZm9ybWF0Ci0gKiB0aW1lIGluIHVzZWMgd2lsbCBiZSBjaGFuZ2VkIGludG8gYSAzMi1iaXQgdmFsdWUgaW4gZXh0ZW5kZWQ6aW50ZXJuYWwgZm9ybWF0Ci0gKiB0aGUgZXh0ZW5kZWQgcGFydCBpcyB0aGUgYmVhY29uIGNvdW50cwotICogdGhlIGludGVybmFsIHBhcnQgaXMgdGhlIHRpbWUgaW4gdXNlYyB3aXRoaW4gb25lIGJlYWNvbiBpbnRlcnZhbAotICovCi11MzIKLWl3bF9sZWdhY3lfdXNlY3NfdG9fYmVhY29ucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCXUzMiB1c2VjLCB1MzIgYmVhY29uX2ludGVydmFsKQotewotCXUzMiBxdW90OwotCXUzMiByZW07Ci0JdTMyIGludGVydmFsID0gYmVhY29uX2ludGVydmFsICogVElNRV9VTklUOwotCi0JaWYgKCFpbnRlcnZhbCB8fCAhdXNlYykKLQkJcmV0dXJuIDA7Ci0KLQlxdW90ID0gKHVzZWMgLyBpbnRlcnZhbCkgJgotCQkoaXdsX2xlZ2FjeV9iZWFjb25fdGltZV9tYXNrX2hpZ2gocHJpdiwKLQkJcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKSA+PgotCQlwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpOwotCXJlbSA9ICh1c2VjICUgaW50ZXJ2YWwpICYgaXdsX2xlZ2FjeV9iZWFjb25fdGltZV9tYXNrX2xvdyhwcml2LAotCQkJCSAgIHByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7Ci0KLQlyZXR1cm4gKHF1b3QgPDwgcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKSArIHJlbTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV91c2Vjc190b19iZWFjb25zKTsKLQotLyogYmFzZSBpcyB1c3VhbGx5IHdoYXQgd2UgZ2V0IGZyb20gdWNvZGUgd2l0aCBlYWNoIHJlY2VpdmVkIGZyYW1lLAotICogdGhlIHNhbWUgYXMgSFcgdGltZXIgY291bnRlciBjb3VudGluZyBkb3duCi0gKi8KLV9fbGUzMiBpd2xfbGVnYWN5X2FkZF9iZWFjb25fdGltZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBiYXNlLAotCQkJICAgdTMyIGFkZG9uLCB1MzIgYmVhY29uX2ludGVydmFsKQotewotCXUzMiBiYXNlX2xvdyA9IGJhc2UgJiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfbG93KHByaXYsCi0JCQkJCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cyk7Ci0JdTMyIGFkZG9uX2xvdyA9IGFkZG9uICYgaXdsX2xlZ2FjeV9iZWFjb25fdGltZV9tYXNrX2xvdyhwcml2LAotCQkJCQlwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpOwotCXUzMiBpbnRlcnZhbCA9IGJlYWNvbl9pbnRlcnZhbCAqIFRJTUVfVU5JVDsKLQl1MzIgcmVzID0gKGJhc2UgJiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfaGlnaChwcml2LAotCQkJCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cykpICsKLQkJCQkoYWRkb24gJiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfaGlnaChwcml2LAotCQkJCXByaXYtPmh3X3BhcmFtcy5iZWFjb25fdGltZV90c2ZfYml0cykpOwotCi0JaWYgKGJhc2VfbG93ID4gYWRkb25fbG93KQotCQlyZXMgKz0gYmFzZV9sb3cgLSBhZGRvbl9sb3c7Ci0JZWxzZSBpZiAoYmFzZV9sb3cgPCBhZGRvbl9sb3cpIHsKLQkJcmVzICs9IGludGVydmFsICsgYmFzZV9sb3cgLSBhZGRvbl9sb3c7Ci0JCXJlcyArPSAoMSA8PCBwcml2LT5od19wYXJhbXMuYmVhY29uX3RpbWVfdHNmX2JpdHMpOwotCX0gZWxzZQotCQlyZXMgKz0gKDEgPDwgcHJpdi0+aHdfcGFyYW1zLmJlYWNvbl90aW1lX3RzZl9iaXRzKTsKLQotCXJldHVybiBjcHVfdG9fbGUzMihyZXMpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2FkZF9iZWFjb25fdGltZSk7Ci0KLSNpZmRlZiBDT05GSUdfUE0KLQotaW50IGl3bF9sZWdhY3lfcGNpX3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2aWNlKQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gdG9fcGNpX2RldihkZXZpY2UpOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQotCS8qCi0JICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBzeXN0ZW0gZ29lcyBpbnRvIHN1c3BlbmQgc3RhdGUKLQkgKiBtYWM4MDIxMSB3aWxsIGNhbGwgaXdsX21hY19zdG9wKCkgZnJvbSB0aGUgbWFjODAyMTEgc3VzcGVuZCBmdW5jdGlvbgotCSAqIGZpcnN0IGJ1dCBzaW5jZSBpd2xfbWFjX3N0b3AoKSBoYXMgbm8ga25vd2xlZGdlIG9mIHdobyB0aGUgY2FsbGVyIGlzLAotCSAqIGl0IHdpbGwgbm90IGNhbGwgYXBtX29wcy5zdG9wKCkgdG8gc3RvcCB0aGUgRE1BIG9wZXJhdGlvbi4KLQkgKiBDYWxsaW5nIGFwbV9vcHMuc3RvcCBoZXJlIHRvIG1ha2Ugc3VyZSB3ZSBzdG9wIHRoZSBETUEuCi0JICovCi0JaXdsX2xlZ2FjeV9hcG1fc3RvcChwcml2KTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3BjaV9zdXNwZW5kKTsKLQotaW50IGl3bF9sZWdhY3lfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSB0b19wY2lfZGV2KGRldmljZSk7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwotCWJvb2wgaHdfcmZraWxsID0gZmFsc2U7Ci0KLQkvKgotCSAqIFdlIGRpc2FibGUgdGhlIFJFVFJZX1RJTUVPVVQgcmVnaXN0ZXIgKDB4NDEpIHRvIGtlZXAKLQkgKiBQQ0kgVHggcmV0cmllcyBmcm9tIGludGVyZmVyaW5nIHdpdGggQzMgQ1BVIHN0YXRlLgotCSAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0ZHX1JFVFJZX1RJTUVPVVQsIDB4MDApOwotCi0JaXdsX2xlZ2FjeV9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKLQotCWlmICghKGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKSAmCi0JCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpKQotCQlod19yZmtpbGwgPSB0cnVlOwotCi0JaWYgKGh3X3Jma2lsbCkKLQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JZWxzZQotCQljbGVhcl9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCi0Jd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShwcml2LT5ody0+d2lwaHksIGh3X3Jma2lsbCk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9wY2lfcmVzdW1lKTsKLQotY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgaXdsX2xlZ2FjeV9wbV9vcHMgPSB7Ci0JLnN1c3BlbmQgPSBpd2xfbGVnYWN5X3BjaV9zdXNwZW5kLAotCS5yZXN1bWUgPSBpd2xfbGVnYWN5X3BjaV9yZXN1bWUsCi0JLmZyZWV6ZSA9IGl3bF9sZWdhY3lfcGNpX3N1c3BlbmQsCi0JLnRoYXcgPSBpd2xfbGVnYWN5X3BjaV9yZXN1bWUsCi0JLnBvd2Vyb2ZmID0gaXdsX2xlZ2FjeV9wY2lfc3VzcGVuZCwKLQkucmVzdG9yZSA9IGl3bF9sZWdhY3lfcGNpX3Jlc3VtZSwKLX07Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcG1fb3BzKTsKLQotI2VuZGlmIC8qIENPTkZJR19QTSAqLwotCi1zdGF0aWMgdm9pZAotaXdsX2xlZ2FjeV91cGRhdGVfcW9zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCWlmICghY3R4LT5pc19hY3RpdmUpCi0JCXJldHVybjsKLQotCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLnFvc19mbGFncyA9IDA7Ci0KLQlpZiAoY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlKQotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MgfD0KLQkJCVFPU19QQVJBTV9GTEdfVVBEQVRFX0VEQ0FfTVNLOwotCi0JaWYgKGN0eC0+aHQuZW5hYmxlZCkKLQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0ucW9zX2ZsYWdzIHw9IFFPU19QQVJBTV9GTEdfVEdOX01TSzsKLQotCUlXTF9ERUJVR19RT1MocHJpdiwgInNlbmQgUW9TIGNtZCB3aXRoIFFvcyBhY3RpdmU9JWQgRkxBR1M9MHglWFxuIiwKLQkJICAgICAgY3R4LT5xb3NfZGF0YS5xb3NfYWN0aXZlLAotCQkgICAgICBjdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MpOwotCi0JaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMocHJpdiwgY3R4LT5xb3NfY21kLAotCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX3Fvc3BhcmFtX2NtZCksCi0JCQkgICAgICAgJmN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLCBOVUxMKTsKLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X21hY19jb25maWcgLSBtYWM4MDIxMSBjb25maWcgY2FsbGJhY2sKLSAqLwotaW50IGl3bF9sZWdhY3lfbWFjX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGNoYW5nZWQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0Jc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNvbmYtPmNoYW5uZWw7Ci0Jc3RydWN0IGl3bF9odF9jb25maWcgKmh0X2NvbmYgPSAmcHJpdi0+Y3VycmVudF9odF9jb25maWc7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzID0gMDsKLQlpbnQgcmV0ID0gMDsKLQl1MTYgY2g7Ci0JaW50IHNjYW5fYWN0aXZlID0gMDsKLQlib29sIGh0X2NoYW5nZWRbTlVNX0lXTF9SWE9OX0NUWF0gPSB7fTsKLQotCWlmIChXQVJOX09OKCFwcml2LT5jZmctPm9wcy0+bGVnYWN5KSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlciB0byBjaGFubmVsICVkIGNoYW5nZWQgMHglWFxuIiwKLQkJCQkJY2hhbm5lbC0+aHdfdmFsdWUsIGNoYW5nZWQpOwotCi0JaWYgKHVubGlrZWx5KHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpKSB7Ci0JCXNjYW5fYWN0aXZlID0gMTsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJzY2FuIGFjdGl2ZVxuIik7Ci0JfQotCi0JaWYgKGNoYW5nZWQgJiAoSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1NNUFMgfAotCQkgICAgICAgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpKSB7Ci0JCS8qIG1hYzgwMjExIHVzZXMgc3RhdGljIGZvciBub24tSFQgd2hpY2ggaXMgd2hhdCB3ZSB3YW50ICovCi0JCXByaXYtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBjb25mLT5zbXBzX21vZGU7Ci0KLQkJLyoKLQkJICogUmVjYWxjdWxhdGUgY2hhaW4gY291bnRzLgotCQkgKgotCQkgKiBJZiBtb25pdG9yIG1vZGUgaXMgZW5hYmxlZCB0aGVuIG1hYzgwMjExIHdpbGwKLQkJICogc2V0IHVwIHRoZSBTTSBQUyBtb2RlIHRvIE9GRiBpZiBhbiBIVCBjaGFubmVsIGlzCi0JCSAqIGNvbmZpZ3VyZWQuCi0JCSAqLwotCQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQotCQkJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpCi0JCQkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7Ci0JfQotCi0JLyogZHVyaW5nIHNjYW5uaW5nIG1hYzgwMjExIHdpbGwgZGVsYXkgY2hhbm5lbCBzZXR0aW5nIHVudGlsCi0JICogc2NhbiBmaW5pc2ggd2l0aCBjaGFuZ2VkID0gMAotCSAqLwotCWlmICghY2hhbmdlZCB8fCAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKSkgewotCQlpZiAoc2Nhbl9hY3RpdmUpCi0JCQlnb3RvIHNldF9jaF9vdXQ7Ci0KLQkJY2ggPSBjaGFubmVsLT5od192YWx1ZTsKLQkJY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBjaGFubmVsLT5iYW5kLCBjaCk7Ci0JCWlmICghaXdsX2xlZ2FjeV9pc19jaGFubmVsX3ZhbGlkKGNoX2luZm8pKSB7Ci0JCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gaW52YWxpZCBjaGFubmVsXG4iKTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCQlnb3RvIHNldF9jaF9vdXQ7Ci0JCX0KLQotCQlpZiAocHJpdi0+aXdfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyAmJgotCQkgICAgIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF9pYnNzKGNoX2luZm8pKSB7Ci0JCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gbm90IElCU1MgY2hhbm5lbFxuIik7Ci0JCQlyZXQgPSAtRUlOVkFMOwotCQkJZ290byBzZXRfY2hfb3V0OwotCQl9Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQkJLyogQ29uZmlndXJlIEhUNDAgY2hhbm5lbHMgKi8KLQkJCWlmIChjdHgtPmh0LmVuYWJsZWQgIT0gY29uZl9pc19odChjb25mKSkgewotCQkJCWN0eC0+aHQuZW5hYmxlZCA9IGNvbmZfaXNfaHQoY29uZik7Ci0JCQkJaHRfY2hhbmdlZFtjdHgtPmN0eGlkXSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoY3R4LT5odC5lbmFibGVkKSB7Ci0JCQkJaWYgKGNvbmZfaXNfaHQ0MF9taW51cyhjb25mKSkgewotCQkJCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9Ci0JCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOwotCQkJCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGNvbmZfaXNfaHQ0MF9wbHVzKGNvbmYpKSB7Ci0JCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU7Ci0JCQkJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKLQkJCQkJY3R4LT5odC5pc180MG1oeiA9IGZhbHNlOwotCQkJCX0KLQkJCX0gZWxzZQotCQkJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKLQotCQkJLyoKLQkJCSAqIERlZmF1bHQgdG8gbm8gcHJvdGVjdGlvbi4gUHJvdGVjdGlvbiBtb2RlIHdpbGwKLQkJCSAqIGxhdGVyIGJlIHNldCBmcm9tIEJTUyBjb25maWcgaW4gaXdsX2h0X2NvbmYKLQkJCSAqLwotCQkJY3R4LT5odC5wcm90ZWN0aW9uID0KLQkJCQkJSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTl9OT05FOwotCi0JCQkvKiBpZiB3ZSBhcmUgc3dpdGNoaW5nIGZyb20gaHQgdG8gMi40IGNsZWFyIGZsYWdzCi0JCQkgKiBmcm9tIGFueSBodCByZWxhdGVkIGluZm8gc2luY2UgMi40IGRvZXMgbm90Ci0JCQkgKiBzdXBwb3J0IGh0ICovCi0JCQlpZiAoKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSAhPSBjaCkpCi0JCQkJY3R4LT5zdGFnaW5nLmZsYWdzID0gMDsKLQotCQkJaXdsX2xlZ2FjeV9zZXRfcnhvbl9jaGFubmVsKHByaXYsIGNoYW5uZWwsIGN0eCk7Ci0JCQlpd2xfbGVnYWN5X3NldF9yeG9uX2h0KHByaXYsIGh0X2NvbmYpOwotCi0JCQlpd2xfbGVnYWN5X3NldF9mbGFnc19mb3JfYmFuZChwcml2LCBjdHgsIGNoYW5uZWwtPmJhbmQsCi0JCQkJCSAgICAgICBjdHgtPnZpZik7Ci0JCX0KLQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKHByaXYtPmNmZy0+b3BzLT5sZWdhY3ktPnVwZGF0ZV9iY2FzdF9zdGF0aW9ucykKLQkJCXJldCA9Ci0JCQlwcml2LT5jZmctPm9wcy0+bGVnYWN5LT51cGRhdGVfYmNhc3Rfc3RhdGlvbnMocHJpdik7Ci0KLSBzZXRfY2hfb3V0OgotCQkvKiBUaGUgbGlzdCBvZiBzdXBwb3J0ZWQgcmF0ZXMgYW5kIHJhdGUgbWFzayBjYW4gYmUgZGlmZmVyZW50Ci0JCSAqIGZvciBlYWNoIGJhbmQ7IHNpbmNlIHRoZSBiYW5kIG1heSBoYXZlIGNoYW5nZWQsIHJlc2V0Ci0JCSAqIHRoZSByYXRlIG1hc2sgdG8gd2hhdCBtYWM4MDIxMSBsaXN0cyAqLwotCQlpd2xfbGVnYWN5X3NldF9yYXRlKHByaXYpOwotCX0KLQotCWlmIChjaGFuZ2VkICYgKElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUyB8Ci0JCQlJRUVFODAyMTFfQ09ORl9DSEFOR0VfSURMRSkpIHsKLQkJcmV0ID0gaXdsX2xlZ2FjeV9wb3dlcl91cGRhdGVfbW9kZShwcml2LCBmYWxzZSk7Ci0JCWlmIChyZXQpCi0JCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIkVycm9yIHNldHRpbmcgc2xlZXAgbGV2ZWxcbiIpOwotCX0KLQotCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX1BPV0VSKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiVFggUG93ZXIgb2xkPSVkIG5ldz0lZFxuIiwKLQkJCXByaXYtPnR4X3Bvd2VyX3VzZXJfbG10LCBjb25mLT5wb3dlcl9sZXZlbCk7Ci0KLQkJaXdsX2xlZ2FjeV9zZXRfdHhfcG93ZXIocHJpdiwgY29uZi0+cG93ZXJfbGV2ZWwsIGZhbHNlKTsKLQl9Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHkocHJpdikpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIG5vdCByZWFkeVxuIik7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWlmIChzY2FuX2FjdGl2ZSkKLQkJZ290byBvdXQ7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQlpZiAobWVtY21wKCZjdHgtPmFjdGl2ZSwgJmN0eC0+c3RhZ2luZywgc2l6ZW9mKGN0eC0+c3RhZ2luZykpKQotCQkJaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCQllbHNlCi0JCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJOb3QgcmUtc2VuZGluZyBzYW1lIFJYT04gY29uZmlndXJhdGlvbi5cbiIpOwotCQlpZiAoaHRfY2hhbmdlZFtjdHgtPmN0eGlkXSkKLQkJCWl3bF9sZWdhY3lfdXBkYXRlX3Fvcyhwcml2LCBjdHgpOwotCX0KLQotb3V0OgotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfbWFjX2NvbmZpZyk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9tYWNfcmVzZXRfdHNmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCS8qIElCU1MgY2FuIG9ubHkgYmUgdGhlIElXTF9SWE9OX0NUWF9CU1MgY29udGV4dCAqLwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlpZiAoV0FSTl9PTighcHJpdi0+Y2ZnLT5vcHMtPmxlZ2FjeSkpCi0JCXJldHVybjsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JbWVtc2V0KCZwcml2LT5jdXJyZW50X2h0X2NvbmZpZywgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfaHRfY29uZmlnKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIG5ldyBhc3NvY2lhdGlvbiBnZXQgcmlkIG9mIGlic3MgYmVhY29uIHNrYiAqLwotCWlmIChwcml2LT5iZWFjb25fc2tiKQotCQlkZXZfa2ZyZWVfc2tiKHByaXYtPmJlYWNvbl9za2IpOwotCi0JcHJpdi0+YmVhY29uX3NrYiA9IE5VTEw7Ci0KLQlwcml2LT50aW1lc3RhbXAgPSAwOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDEwMCk7Ci0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBub3QgcmVhZHlcbiIpOwotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIHdlIGFyZSByZXN0YXJ0aW5nIGFzc29jaWF0aW9uIHByb2Nlc3MKLQkgKiBjbGVhciBSWE9OX0ZJTFRFUl9BU1NPQ19NU0sgYml0Ci0JICovCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCWl3bF9sZWdhY3lfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQotCWl3bF9sZWdhY3lfc2V0X3JhdGUocHJpdik7Ci0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X21hY19yZXNldF90c2YpOwotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2h0X2NvbmYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZzsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOwotCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mID0gJnZpZi0+YnNzX2NvbmY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9sZWdhY3lfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiZW50ZXI6XG4iKTsKLQotCWlmICghY3R4LT5odC5lbmFibGVkKQotCQlyZXR1cm47Ci0KLQljdHgtPmh0LnByb3RlY3Rpb24gPQotCQlic3NfY29uZi0+aHRfb3BlcmF0aW9uX21vZGUgJiBJRUVFODAyMTFfSFRfT1BfTU9ERV9QUk9URUNUSU9OOwotCWN0eC0+aHQubm9uX2dmX3N0YV9wcmVzZW50ID0KLQkJISEoYnNzX2NvbmYtPmh0X29wZXJhdGlvbl9tb2RlICYKLQkJCQlJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fR0ZfU1RBX1BSU05UKTsKLQotCWh0X2NvbmYtPnNpbmdsZV9jaGFpbl9zdWZmaWNpZW50ID0gZmFsc2U7Ci0KLQlzd2l0Y2ggKHZpZi0+dHlwZSkgewotCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEodmlmLCBic3NfY29uZi0+YnNzaWQpOwotCQlpZiAoc3RhKSB7Ci0JCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCA9ICZzdGEtPmh0X2NhcDsKLQkJCWludCBtYXhzdHJlYW1zOwotCi0JCQltYXhzdHJlYW1zID0gKGh0X2NhcC0+bWNzLnR4X3BhcmFtcyAmCi0JCQkgICAgICBJRUVFODAyMTFfSFRfTUNTX1RYX01BWF9TVFJFQU1TX01BU0spCi0JCQkJPj4gSUVFRTgwMjExX0hUX01DU19UWF9NQVhfU1RSRUFNU19TSElGVDsKLQkJCW1heHN0cmVhbXMgKz0gMTsKLQotCQkJaWYgKChodF9jYXAtPm1jcy5yeF9tYXNrWzFdID09IDApICYmCi0JCQkgICAgKGh0X2NhcC0+bWNzLnJ4X21hc2tbMl0gPT0gMCkpCi0JCQkJaHRfY29uZi0+c2luZ2xlX2NoYWluX3N1ZmZpY2llbnQgPSB0cnVlOwotCQkJaWYgKG1heHN0cmVhbXMgPD0gMSkKLQkJCQlodF9jb25mLT5zaW5nbGVfY2hhaW5fc3VmZmljaWVudCA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogSWYgYXQgYWxsLCB0aGlzIGNhbiBvbmx5IGhhcHBlbiB0aHJvdWdoIGEgcmFjZQotCQkJICogd2hlbiB0aGUgQVAgZGlzY29ubmVjdHMgdXMgd2hpbGUgd2UncmUgc3RpbGwKLQkJCSAqIHNldHRpbmcgdXAgdGhlIGNvbm5lY3Rpb24sIGluIHRoYXQgY2FzZSBtYWM4MDIxMQotCQkJICogd2lsbCBzb29uIHRlbGwgdXMgYWJvdXQgdGhhdC4KLQkJCSAqLwotCQkJaHRfY29uZi0+c2luZ2xlX2NoYWluX3N1ZmZpY2llbnQgPSB0cnVlOwotCQl9Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQlicmVhazsKLQljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQlodF9jb25mLT5zaW5nbGVfY2hhaW5fc3VmZmljaWVudCA9IHRydWU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAibGVhdmVcbiIpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9zZXRfbm9fYXNzb2Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfbGVnYWN5X3J4b25fY3R4X2Zyb21fdmlmKHZpZik7Ci0KLQkvKgotCSAqIGluZm9ybSB0aGUgdWNvZGUgdGhhdCB0aGVyZSBpcyBubyBsb25nZXIgYW4KLQkgKiBhc3NvY2lhdGlvbiBhbmQgdGhhdCBubyBtb3JlIHBhY2tldHMgc2hvdWxkIGJlCi0JICogc2VudAotCSAqLwotCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQljdHgtPnN0YWdpbmcuYXNzb2NfaWQgPSAwOwotCWl3bF9sZWdhY3lfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9iZWFjb25fdXBkYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCV9fbGU2NCB0aW1lc3RhbXA7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGllZWU4MDIxMV9iZWFjb25fZ2V0KGh3LCB2aWYpOwotCi0JaWYgKCFza2IpCi0JCXJldHVybjsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCFwcml2LT5iZWFjb25fY3R4KSB7Ci0JCUlXTF9FUlIocHJpdiwgInVwZGF0ZSBiZWFjb24gYnV0IG5vIGJlYWNvbiBjb250ZXh0IVxuIik7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJcmV0dXJuOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZiAocHJpdi0+YmVhY29uX3NrYikKLQkJZGV2X2tmcmVlX3NrYihwcml2LT5iZWFjb25fc2tiKTsKLQotCXByaXYtPmJlYWNvbl9za2IgPSBza2I7Ci0KLQl0aW1lc3RhbXAgPSAoKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXNrYi0+ZGF0YSktPnUuYmVhY29uLnRpbWVzdGFtcDsKLQlwcml2LT50aW1lc3RhbXAgPSBsZTY0X3RvX2NwdSh0aW1lc3RhbXApOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBSRiBub3QgcmVhZHlcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpdi0+Y2ZnLT5vcHMtPmxlZ2FjeS0+cG9zdF9hc3NvY2lhdGUocHJpdik7Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9tYWNfYnNzX2luZm9fY2hhbmdlZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiwKLQkJCQkgICAgIHUzMiBjaGFuZ2VzKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfbGVnYWN5X3J4b25fY3R4X2Zyb21fdmlmKHZpZik7Ci0JaW50IHJldDsKLQotCWlmIChXQVJOX09OKCFwcml2LT5jZmctPm9wcy0+bGVnYWN5KSkKLQkJcmV0dXJuOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJjaGFuZ2VzID0gMHglWFxuIiwgY2hhbmdlcyk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpIHsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX1FPUykgewotCQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCWN0eC0+cW9zX2RhdGEucW9zX2FjdGl2ZSA9IGJzc19jb25mLT5xb3M7Ci0JCWl3bF9sZWdhY3lfdXBkYXRlX3Fvcyhwcml2LCBjdHgpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JfQotCi0JaWYgKGNoYW5nZXMgJiBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCkgewotCQkvKgotCQkgKiB0aGUgYWRkX2ludGVyZmFjZSBjb2RlIG11c3QgbWFrZSBzdXJlIHdlIG9ubHkgZXZlcgotCQkgKiBoYXZlIGEgc2luZ2xlIGludGVyZmFjZSB0aGF0IGNvdWxkIGJlIGJlYWNvbmluZyBhdAotCQkgKiBhbnkgdGltZS4KLQkJICovCi0JCWlmICh2aWYtPmJzc19jb25mLmVuYWJsZV9iZWFjb24pCi0JCQlwcml2LT5iZWFjb25fY3R4ID0gY3R4OwotCQllbHNlCi0JCQlwcml2LT5iZWFjb25fY3R4ID0gTlVMTDsKLQl9Ci0KLQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JTU0lEKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiQlNTSUQgJXBNXG4iLCBic3NfY29uZi0+YnNzaWQpOwotCi0JCS8qCi0JCSAqIElmIHRoZXJlIGlzIGN1cnJlbnRseSBhIEhXIHNjYW4gZ29pbmcgb24gaW4gdGhlCi0JCSAqIGJhY2tncm91bmQgdGhlbiB3ZSBuZWVkIHRvIGNhbmNlbCBpdCBlbHNlIHRoZSBSWE9OCi0JCSAqIGJlbG93L2luIHBvc3RfYXNzb2NpYXRlIHdpbGwgZmFpbC4KLQkJICovCi0JCWlmIChpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMTAwKSkgewotCQkJSVdMX1dBUk4ocHJpdiwKLQkJCQkiQWJvcnRlZCBzY2FuIHN0aWxsIGluIHByb2dyZXNzIGFmdGVyIDEwMG1zXG4iKTsKLQkJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LAotCQkJCSJsZWF2aW5nIC0gc2NhbiBhYm9ydCBmYWlsZWQuXG4iKTsKLQkJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogbWFjODAyMTEgb25seSBzZXRzIGFzc29jIHdoZW4gaW4gU1RBVElPTiBtb2RlICovCi0JCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwgYnNzX2NvbmYtPmFzc29jKSB7Ci0JCQltZW1jcHkoY3R4LT5zdGFnaW5nLmJzc2lkX2FkZHIsCi0JCQkgICAgICAgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7Ci0KLQkJCS8qIGN1cnJlbnRseSBuZWVkZWQgaW4gYSBmZXcgcGxhY2VzICovCi0JCQltZW1jcHkocHJpdi0+YnNzaWQsIGJzc19jb25mLT5ic3NpZCwgRVRIX0FMRU4pOwotCQl9IGVsc2UgewotCQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPQotCQkJCX5SWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogVGhpcyBuZWVkcyB0byBiZSBhZnRlciBzZXR0aW5nIHRoZSBCU1NJRCBpbiBjYXNlCi0JICogbWFjODAyMTEgZGVjaWRlcyB0byBkbyBib3RoIGNoYW5nZXMgYXQgb25jZSBiZWNhdXNlCi0JICogaXQgd2lsbCBpbnZva2UgcG9zdF9hc3NvY2lhdGUuCi0JICovCi0JaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyAmJiBjaGFuZ2VzICYgQlNTX0NIQU5HRURfQkVBQ09OKQotCQlpd2xfbGVnYWN5X2JlYWNvbl91cGRhdGUoaHcsIHZpZik7Ci0KLQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0VSUF9QUkVBTUJMRSkgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIkVSUF9QUkVBTUJMRSAlZFxuIiwKLQkJCQkgICBic3NfY29uZi0+dXNlX3Nob3J0X3ByZWFtYmxlKTsKLQkJaWYgKGJzc19jb25mLT51c2Vfc2hvcnRfcHJlYW1ibGUpCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0gUlhPTl9GTEdfU0hPUlRfUFJFQU1CTEVfTVNLOwotCQllbHNlCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQl9Ci0KLQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0VSUF9DVFNfUFJPVCkgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwKLQkJCSJFUlBfQ1RTICVkXG4iLCBic3NfY29uZi0+dXNlX2N0c19wcm90KTsKLQkJaWYgKGJzc19jb25mLT51c2VfY3RzX3Byb3QgJiYKLQkJCShwcml2LT5iYW5kICE9IElFRUU4MDIxMV9CQU5EXzVHSFopKQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1RHR19QUk9URUNUX01TSzsKLQkJZWxzZQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19UR0dfUFJPVEVDVF9NU0s7Ci0JCWlmIChic3NfY29uZi0+dXNlX2N0c19wcm90KQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NFTEZfQ1RTX0VOOwotCQllbHNlCi0JCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NFTEZfQ1RTX0VOOwotCX0KLQotCWlmIChjaGFuZ2VzICYgQlNTX0NIQU5HRURfQkFTSUNfUkFURVMpIHsKLQkJLyogWFhYIHVzZSB0aGlzIGluZm9ybWF0aW9uCi0JCSAqCi0JCSAqIFRvIGRvIHRoYXQsIHJlbW92ZSBjb2RlIGZyb20gaXdsX2xlZ2FjeV9zZXRfcmF0ZSgpIGFuZCBwdXQgc29tZXRoaW5nCi0JCSAqIGxpa2UgdGhpcyBoZXJlOgotCQkgKgotCQlpZiAoQS1iYW5kKQotCQkJY3R4LT5zdGFnaW5nLm9mZG1fYmFzaWNfcmF0ZXMgPQotCQkJCWJzc19jb25mLT5iYXNpY19yYXRlczsKLQkJZWxzZQotCQkJY3R4LT5zdGFnaW5nLm9mZG1fYmFzaWNfcmF0ZXMgPQotCQkJCWJzc19jb25mLT5iYXNpY19yYXRlcyA+PiA0OwotCQkJY3R4LT5zdGFnaW5nLmNja19iYXNpY19yYXRlcyA9Ci0JCQkJYnNzX2NvbmYtPmJhc2ljX3JhdGVzICYgMHhGOwotCQkgKi8KLQl9Ci0KLQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0hUKSB7Ci0JCWl3bF9sZWdhY3lfaHRfY29uZihwcml2LCB2aWYpOwotCi0JCWlmIChwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4pCi0JCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKLQl9Ci0KLQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0FTU09DKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiQVNTT0MgJWRcbiIsIGJzc19jb25mLT5hc3NvYyk7Ci0JCWlmIChic3NfY29uZi0+YXNzb2MpIHsKLQkJCXByaXYtPnRpbWVzdGFtcCA9IGJzc19jb25mLT50aW1lc3RhbXA7Ci0KLQkJCWlmICghaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpCi0JCQkJcHJpdi0+Y2ZnLT5vcHMtPmxlZ2FjeS0+cG9zdF9hc3NvY2lhdGUocHJpdik7Ci0JCX0gZWxzZQotCQkJaXdsX2xlZ2FjeV9zZXRfbm9fYXNzb2MocHJpdiwgdmlmKTsKLQl9Ci0KLQlpZiAoY2hhbmdlcyAmJiBpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkgJiYgYnNzX2NvbmYtPmFpZCkgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIkNoYW5nZXMgKCUjeCkgd2hpbGUgYXNzb2NpYXRlZFxuIiwKLQkJCQkgICBjaGFuZ2VzKTsKLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX3J4b25fYXNzb2MocHJpdiwgY3R4KTsKLQkJaWYgKCFyZXQpIHsKLQkJCS8qIFN5bmMgYWN0aXZlX3J4b24gd2l0aCBsYXRlc3QgY2hhbmdlLiAqLwotCQkJbWVtY3B5KCh2b2lkICopJmN0eC0+YWN0aXZlLAotCQkJCSZjdHgtPnN0YWdpbmcsCi0JCQkJc2l6ZW9mKHN0cnVjdCBpd2xfbGVnYWN5X3J4b25fY21kKSk7Ci0JCX0KLQl9Ci0KLQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKSB7Ci0JCWlmICh2aWYtPmJzc19jb25mLmVuYWJsZV9iZWFjb24pIHsKLQkJCW1lbWNweShjdHgtPnN0YWdpbmcuYnNzaWRfYWRkciwKLQkJCSAgICAgICBic3NfY29uZi0+YnNzaWQsIEVUSF9BTEVOKTsKLQkJCW1lbWNweShwcml2LT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7Ci0JCQlwcml2LT5jZmctPm9wcy0+bGVnYWN5LT5jb25maWdfYXAocHJpdik7Ci0JCX0gZWxzZQotCQkJaXdsX2xlZ2FjeV9zZXRfbm9fYXNzb2MocHJpdiwgdmlmKTsKLQl9Ci0KLQlpZiAoY2hhbmdlcyAmIEJTU19DSEFOR0VEX0lCU1MpIHsKLQkJcmV0ID0gcHJpdi0+Y2ZnLT5vcHMtPmxlZ2FjeS0+bWFuYWdlX2lic3Nfc3RhdGlvbihwcml2LCB2aWYsCi0JCQkJCQkJYnNzX2NvbmYtPmlic3Nfam9pbmVkKTsKLQkJaWYgKHJldCkKLQkJCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byAlcyBJQlNTIHN0YXRpb24gJXBNXG4iLAotCQkJCWJzc19jb25mLT5pYnNzX2pvaW5lZCA/ICJhZGQiIDogInJlbW92ZSIsCi0JCQkJYnNzX2NvbmYtPmJzc2lkKTsKLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X21hY19ic3NfaW5mb19jaGFuZ2VkKTsKLQotaXJxcmV0dXJuX3QgaXdsX2xlZ2FjeV9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkYXRhOwotCXUzMiBpbnRhLCBpbnRhX21hc2s7Ci0JdTMyIGludGFfZmg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpZiAoIXByaXYpCi0JCXJldHVybiBJUlFfTk9ORTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBEaXNhYmxlIChidXQgZG9uJ3QgY2xlYXIhKSBpbnRlcnJ1cHRzIGhlcmUgdG8gYXZvaWQKLQkgKiAgICBiYWNrLXRvLWJhY2sgSVNScyBhbmQgc3BvcmFkaWMgaW50ZXJydXB0cyBmcm9tIG91ciBOSUMuCi0JICogSWYgd2UgaGF2ZSBzb21ldGhpbmcgdG8gc2VydmljZSwgdGhlIHRhc2tsZXQgd2lsbCByZS1lbmFibGUgaW50cy4KLQkgKiBJZiB3ZSAqZG9uJ3QqIGhhdmUgc29tZXRoaW5nLCB3ZSdsbCByZS1lbmFibGUgYmVmb3JlIGxlYXZpbmcgaGVyZS4gKi8KLQlpbnRhX21hc2sgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9JTlRfTUFTSyk7ICAvKiBqdXN0IGZvciBkZWJ1ZyAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlRfTUFTSywgMHgwMDAwMDAwMCk7Ci0KLQkvKiBEaXNjb3ZlciB3aGljaCBpbnRlcnJ1cHRzIGFyZSBhY3RpdmUvcGVuZGluZyAqLwotCWludGEgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9JTlQpOwotCWludGFfZmggPSBpd2xfcmVhZDMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTKTsKLQotCS8qIElnbm9yZSBpbnRlcnJ1cHQgaWYgdGhlcmUncyBub3RoaW5nIGluIE5JQyB0byBzZXJ2aWNlLgotCSAqIFRoaXMgbWF5IGJlIGR1ZSB0byBJUlEgc2hhcmVkIHdpdGggYW5vdGhlciBkZXZpY2UsCi0JICogb3IgZHVlIHRvIHNwb3JhZGljIGludGVycnVwdHMgdGhyb3duIGZyb20gb3VyIE5JQy4gKi8KLQlpZiAoIWludGEgJiYgIWludGFfZmgpIHsKLQkJSVdMX0RFQlVHX0lTUihwcml2LAotCQkJIklnbm9yZSBpbnRlcnJ1cHQsIGludGEgPT0gMCwgaW50YV9maCA9PSAwXG4iKTsKLQkJZ290byBub25lOwotCX0KLQotCWlmICgoaW50YSA9PSAweEZGRkZGRkZGKSB8fCAoKGludGEgJiAweEZGRkZGRkYwKSA9PSAweGE1YTVhNWEwKSkgewotCQkvKiBIYXJkd2FyZSBkaXNhcHBlYXJlZC4gSXQgbWlnaHQgaGF2ZSBhbHJlYWR5IHJhaXNlZAotCQkgKiBhbiBpbnRlcnJ1cHQgKi8KLQkJSVdMX1dBUk4ocHJpdiwgIkhBUkRXQVJFIEdPTkU/PyBJTlRBID09IDB4JTA4eFxuIiwgaW50YSk7Ci0JCWdvdG8gdW5wbHVnZ2VkOwotCX0KLQotCUlXTF9ERUJVR19JU1IocHJpdiwgIklTUiBpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eFxuIiwKLQkJICAgICAgaW50YSwgaW50YV9tYXNrLCBpbnRhX2ZoKTsKLQotCWludGEgJj0gfkNTUl9JTlRfQklUX1NDRDsKLQotCS8qIGl3bF9pcnFfdGFza2xldCgpIHdpbGwgc2VydmljZSBpbnRlcnJ1cHRzIGFuZCByZS1lbmFibGUgdGhlbSAqLwotCWlmIChsaWtlbHkoaW50YSB8fCBpbnRhX2ZoKSkKLQkJdGFza2xldF9zY2hlZHVsZSgmcHJpdi0+aXJxX3Rhc2tsZXQpOwotCi11bnBsdWdnZWQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfSEFORExFRDsKLQotbm9uZToKLQkvKiByZS1lbmFibGUgaW50ZXJydXB0cyBoZXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgYW55dGhpbmcgdG8gc2VydmljZS4gKi8KLQkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaXNhYmxlZCBieSBpcnEgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0lOVF9FTkFCTEVELCAmcHJpdi0+c3RhdHVzKSkKLQkJaXdsX2xlZ2FjeV9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JcmV0dXJuIElSUV9OT05FOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2lzcik7Ci0KLS8qCi0gKiAgaXdsX2xlZ2FjeV90eF9jbWRfcHJvdGVjdGlvbjogU2V0IHJ0cy9jdHMuIDM5NDUgYW5kIDQ5NjUgb25seSBzaGFyZSB0aGlzCi0gKiAgZnVuY3Rpb24uCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV90eF9jbWRfcHJvdGVjdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvLAotCQkJICAgICAgIF9fbGUxNiBmYywgX19sZTMyICp0eF9mbGFncykKLXsKLQlpZiAoaW5mby0+Y29udHJvbC5yYXRlc1swXS5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19VU0VfUlRTX0NUUykgewotCQkqdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19SVFNfTVNLOwotCQkqdHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfQ1RTX01TSzsKLQkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfRlVMTF9UWE9QX1BST1RfTVNLOwotCi0JCWlmICghaWVlZTgwMjExX2lzX21nbXQoZmMpKQotCQkJcmV0dXJuOwotCi0JCXN3aXRjaCAoZmMgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9TVFlQRSkpIHsKLQkJY2FzZSBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfQVVUSCk6Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0RFQVVUSCk6Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX0FTU09DX1JFUSk6Ci0JCWNhc2UgY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1JFQVNTT0NfUkVRKToKLQkJCSp0eF9mbGFncyAmPSB+VFhfQ01EX0ZMR19SVFNfTVNLOwotCQkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfQ1RTX01TSzsKLQkJCWJyZWFrOwotCQl9Ci0JfSBlbHNlIGlmIChpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYKLQkJICAgSUVFRTgwMjExX1RYX1JDX1VTRV9DVFNfUFJPVEVDVCkgewotCQkqdHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfUlRTX01TSzsKLQkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfQ1RTX01TSzsKLQkJKnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfRlVMTF9UWE9QX1BST1RfTVNLOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV90eF9jbWRfcHJvdGVjdGlvbik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWNvcmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyNzFmZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtY29yZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgotICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKiBCU0QgTElDRU5TRQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2NvcmVfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9jb3JlX2hfXwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqLwotc3RydWN0IGl3bF9ob3N0X2NtZDsKLXN0cnVjdCBpd2xfY21kOwotCi0KLSNkZWZpbmUgSVdMV0lGSV9WRVJTSU9OICJpbi10cmVlOiIKLSNkZWZpbmUgRFJWX0NPUFlSSUdIVAkiQ29weXJpZ2h0KGMpIDIwMDMtMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbiIKLSNkZWZpbmUgRFJWX0FVVEhPUiAgICAgIjxpbHdAbGludXguaW50ZWwuY29tPiIKLQotI2RlZmluZSBJV0xfUENJX0RFVklDRShkZXYsIHN1YmRldiwgY2ZnKSBcCi0JLnZlbmRvciA9IFBDSV9WRU5ET1JfSURfSU5URUwsICAuZGV2aWNlID0gKGRldiksIFwKLQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwgLnN1YmRldmljZSA9IChzdWJkZXYpLCBcCi0JLmRyaXZlcl9kYXRhID0gKGtlcm5lbF91bG9uZ190KSYoY2ZnKQotCi0jZGVmaW5lIFRJTUVfVU5JVAkJMTAyNAotCi0jZGVmaW5lIElXTF9TS1VfRyAgICAgICAweDEKLSNkZWZpbmUgSVdMX1NLVV9BICAgICAgIDB4MgotI2RlZmluZSBJV0xfU0tVX04gICAgICAgMHg4Ci0KLSNkZWZpbmUgSVdMX0NNRCh4KSBjYXNlIHg6IHJldHVybiAjeAotCi1zdHJ1Y3QgaXdsX2hjbWRfb3BzIHsKLQlpbnQgKCpyeG9uX2Fzc29jKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotCWludCAoKmNvbW1pdF9yeG9uKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotCXZvaWQgKCpzZXRfcnhvbl9jaGFpbikoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotfTsKLQotc3RydWN0IGl3bF9oY21kX3V0aWxzX29wcyB7Ci0JdTE2ICgqZ2V0X2hjbWRfc2l6ZSkodTggY21kX2lkLCB1MTYgbGVuKTsKLQl1MTYgKCpidWlsZF9hZGRzdGFfaGNtZCkoY29uc3Qgc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCAqY21kLAotCQkJCQkJCQl1OCAqZGF0YSk7Ci0JaW50ICgqcmVxdWVzdF9zY2FuKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotCXZvaWQgKCpwb3N0X3NjYW4pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci19OwotCi1zdHJ1Y3QgaXdsX2FwbV9vcHMgewotCWludCAoKmluaXQpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0Jdm9pZCAoKmNvbmZpZykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLX07Ci0KLXN0cnVjdCBpd2xfZGVidWdmc19vcHMgewotCXNzaXplX3QgKCpyeF9zdGF0c19yZWFkKShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci0Jc3NpemVfdCAoKnR4X3N0YXRzX3JlYWQpKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLQlzc2l6ZV90ICgqZ2VuZXJhbF9zdGF0c19yZWFkKShzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKLX07Ci0KLXN0cnVjdCBpd2xfdGVtcF9vcHMgewotCXZvaWQgKCp0ZW1wZXJhdHVyZSkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLX07Ci0KLXN0cnVjdCBpd2xfbGliX29wcyB7Ci0JLyogc2V0IGh3IGRlcGVuZGVudCBwYXJhbWV0ZXJzICovCi0JaW50ICgqc2V0X2h3X3BhcmFtcykoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQkvKiBIYW5kbGluZyBUWCAqLwotCXZvaWQgKCp0eHFfdXBkYXRlX2J5dGVfY250X3RibCkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJCXUxNiBieXRlX2NudCk7Ci0JaW50ICgqdHhxX2F0dGFjaF9idWZfdG9fdGZkKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCQkJICAgICBkbWFfYWRkcl90IGFkZHIsCi0JCQkJICAgICB1MTYgbGVuLCB1OCByZXNldCwgdTggcGFkKTsKLQl2b2lkICgqdHhxX2ZyZWVfdGZkKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSk7Ci0JaW50ICgqdHhxX2luaXQpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSk7Ci0JLyogc2V0dXAgUnggaGFuZGxlciAqLwotCXZvaWQgKCpyeF9oYW5kbGVyX3NldHVwKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCS8qIGFsaXZlIG5vdGlmaWNhdGlvbiBhZnRlciBpbml0IHVDb2RlIGxvYWQgKi8KLQl2b2lkICgqaW5pdF9hbGl2ZV9zdGFydCkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQkvKiBjaGVjayB2YWxpZGl0eSBvZiBydGMgZGF0YSBhZGRyZXNzICovCi0JaW50ICgqaXNfdmFsaWRfcnRjX2RhdGFfYWRkcikodTMyIGFkZHIpOwotCS8qIDFzdCB1Y29kZSBsb2FkICovCi0JaW50ICgqbG9hZF91Y29kZSkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotCXZvaWQgKCpkdW1wX25pY19lcnJvcl9sb2cpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0JaW50ICgqZHVtcF9maCkoc3RydWN0IGl3bF9wcml2ICpwcml2LCBjaGFyICoqYnVmLCBib29sIGRpc3BsYXkpOwotCWludCAoKnNldF9jaGFubmVsX3N3aXRjaCkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKTsKLQkvKiBwb3dlciBtYW5hZ2VtZW50ICovCi0Jc3RydWN0IGl3bF9hcG1fb3BzIGFwbV9vcHM7Ci0KLQkvKiBwb3dlciAqLwotCWludCAoKnNlbmRfdHhfcG93ZXIpIChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCXZvaWQgKCp1cGRhdGVfY2hhaW5fZmxhZ3MpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLQkvKiBlZXByb20gb3BlcmF0aW9ucyAoYXMgZGVmaW5lZCBpbiBpd2wtZWVwcm9tLmgpICovCi0Jc3RydWN0IGl3bF9lZXByb21fb3BzIGVlcHJvbV9vcHM7Ci0KLQkvKiB0ZW1wZXJhdHVyZSAqLwotCXN0cnVjdCBpd2xfdGVtcF9vcHMgdGVtcF9vcHM7Ci0KLQlzdHJ1Y3QgaXdsX2RlYnVnZnNfb3BzIGRlYnVnZnNfb3BzOwotCi19OwotCi1zdHJ1Y3QgaXdsX2xlZF9vcHMgewotCWludCAoKmNtZCkoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2xlZF9jbWQgKmxlZF9jbWQpOwotfTsKLQotc3RydWN0IGl3bF9sZWdhY3lfb3BzIHsKLQl2b2lkICgqcG9zdF9hc3NvY2lhdGUpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0Jdm9pZCAoKmNvbmZpZ19hcCkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQkvKiBzdGF0aW9uIG1hbmFnZW1lbnQgKi8KLQlpbnQgKCp1cGRhdGVfYmNhc3Rfc3RhdGlvbnMpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0JaW50ICgqbWFuYWdlX2lic3Nfc3RhdGlvbikoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIGJvb2wgYWRkKTsKLX07Ci0KLXN0cnVjdCBpd2xfb3BzIHsKLQljb25zdCBzdHJ1Y3QgaXdsX2xpYl9vcHMgKmxpYjsKLQljb25zdCBzdHJ1Y3QgaXdsX2hjbWRfb3BzICpoY21kOwotCWNvbnN0IHN0cnVjdCBpd2xfaGNtZF91dGlsc19vcHMgKnV0aWxzOwotCWNvbnN0IHN0cnVjdCBpd2xfbGVkX29wcyAqbGVkOwotCWNvbnN0IHN0cnVjdCBpd2xfbmljX29wcyAqbmljOwotCWNvbnN0IHN0cnVjdCBpd2xfbGVnYWN5X29wcyAqbGVnYWN5OwotCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzICppZWVlODAyMTFfb3BzOwotfTsKLQotc3RydWN0IGl3bF9tb2RfcGFyYW1zIHsKLQlpbnQgc3dfY3J5cHRvOwkJLyogZGVmOiAwID0gdXNpbmcgaGFyZHdhcmUgZW5jcnlwdGlvbiAqLwotCWludCBkaXNhYmxlX2h3X3NjYW47CS8qIGRlZjogMCA9IHVzZSBoL3cgc2NhbiAqLwotCWludCBudW1fb2ZfcXVldWVzOwkvKiBkZWY6IEhXIGRlcGVuZGVudCAqLwotCWludCBkaXNhYmxlXzExbjsJLyogZGVmOiAwID0gMTFuIGNhcGFiaWxpdGllcyBlbmFibGVkICovCi0JaW50IGFtc2R1X3NpemVfOEs7CS8qIGRlZjogMSA9IGVuYWJsZSA4SyBhbXNkdSBzaXplICovCi0JaW50IGFudGVubmE7ICAJCS8qIGRlZjogMCA9IGJvdGggYW50ZW5uYXMgKHVzZSBkaXZlcnNpdHkpICovCi0JaW50IHJlc3RhcnRfZnc7CQkvKiBkZWY6IDEgPSByZXN0YXJ0IGZpcm13YXJlICovCi19OwotCi0vKgotICogQGxlZF9jb21wZW5zYXRpb246IGNvbXBlbnNhdGUgb24gdGhlIGxlZCBvbi9vZmYgdGltZSBwZXIgSFcgYWNjb3JkaW5nCi0gKgl0byB0aGUgZGV2aWF0aW9uIHRvIGFjaGlldmUgdGhlIGRlc2lyZWQgbGVkIGZyZXF1ZW5jeS4KLSAqCVRoZSBkZXRhaWwgYWxnb3JpdGhtIGlzIGRlc2NyaWJlZCBpbiBpd2wtbGVkLmMKLSAqIEBjaGFpbl9ub2lzZV9udW1fYmVhY29uczogbnVtYmVyIG9mIGJlYWNvbnMgdXNlZCB0byBjb21wdXRlIGNoYWluIG5vaXNlCi0gKiBAd2RfdGltZW91dDogVFggcXVldWVzIHdhdGNoZG9nIHRpbWVvdXQKLSAqIEB0ZW1wZXJhdHVyZV9rZWx2aW46IHRlbXBlcmF0dXJlIHJlcG9ydCBieSB1Q29kZSBpbiBrZWx2aW4KLSAqIEB1Y29kZV90cmFjaW5nOiBzdXBwb3J0IHVjb2RlIGNvbnRpbnVvdXMgdHJhY2luZwotICogQHNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcjogZHJpdmVyIGhhcyB0aGUgY2FwYWJpbGl0eSB0byBwZXJmb3JtCi0gKglzZW5zaXRpdml0eSBjYWxpYnJhdGlvbiBvcGVyYXRpb24KLSAqIEBjaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXI6IGRyaXZlciBoYXMgdGhlIGNhcGFiaWxpdHkgdG8gcGVyZm9ybQotICoJY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gb3BlcmF0aW9uCi0gKi8KLXN0cnVjdCBpd2xfYmFzZV9wYXJhbXMgewotCWludCBlZXByb21fc2l6ZTsKLQlpbnQgbnVtX29mX3F1ZXVlczsJLyogZGVmOiBIVyBkZXBlbmRlbnQgKi8KLQlpbnQgbnVtX29mX2FtcGR1X3F1ZXVlczsvKiBkZWY6IEhXIGRlcGVuZGVudCAqLwotCS8qIGZvciBpd2xfbGVnYWN5X2FwbV9pbml0KCkgKi8KLQl1MzIgcGxsX2NmZ192YWw7Ci0JYm9vbCBzZXRfbDBzOwotCWJvb2wgdXNlX2JzbTsKLQotCXUxNiBsZWRfY29tcGVuc2F0aW9uOwotCWludCBjaGFpbl9ub2lzZV9udW1fYmVhY29uczsKLQl1bnNpZ25lZCBpbnQgd2RfdGltZW91dDsKLQlib29sIHRlbXBlcmF0dXJlX2tlbHZpbjsKLQljb25zdCBib29sIHVjb2RlX3RyYWNpbmc7Ci0JY29uc3QgYm9vbCBzZW5zaXRpdml0eV9jYWxpYl9ieV9kcml2ZXI7Ci0JY29uc3QgYm9vbCBjaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXI7Ci19OwotCi0vKioKLSAqIHN0cnVjdCBpd2xfY2ZnCi0gKiBAZndfbmFtZV9wcmU6IEZpcm13YXJlIGZpbGVuYW1lIHByZWZpeC4gVGhlIGFwaSB2ZXJzaW9uIGFuZCBleHRlbnNpb24KLSAqCSgudWNvZGUpIHdpbGwgYmUgYWRkZWQgdG8gZmlsZW5hbWUgYmVmb3JlIGxvYWRpbmcgZnJvbSBkaXNrLiBUaGUKLSAqCWZpbGVuYW1lIGlzIGNvbnN0cnVjdGVkIGFzIGZ3X25hbWVfcHJlPGFwaT4udWNvZGUuCi0gKiBAdWNvZGVfYXBpX21heDogSGlnaGVzdCB2ZXJzaW9uIG9mIHVDb2RlIEFQSSBzdXBwb3J0ZWQgYnkgZHJpdmVyLgotICogQHVjb2RlX2FwaV9taW46IExvd2VzdCB2ZXJzaW9uIG9mIHVDb2RlIEFQSSBzdXBwb3J0ZWQgYnkgZHJpdmVyLgotICogQHNjYW5fYW50ZW5uYXM6IGF2YWlsYWJsZSBhbnRlbm5hIGZvciBzY2FuIG9wZXJhdGlvbgotICogQGxlZF9tb2RlOiAwPWJsaW5raW5nLCAxPU9uKFJGIE9uKS9PZmYoUkYgT2ZmKQotICoKLSAqIFdlIGVuYWJsZSB0aGUgZHJpdmVyIHRvIGJlIGJhY2t3YXJkIGNvbXBhdGlibGUgd3J0IEFQSSB2ZXJzaW9uLiBUaGUKLSAqIGRyaXZlciBzcGVjaWZpZXMgd2hpY2ggQVBJcyBpdCBzdXBwb3J0cyAod2l0aCBAdWNvZGVfYXBpX21heCBiZWluZyB0aGUKLSAqIGhpZ2hlc3QgYW5kIEB1Y29kZV9hcGlfbWluIHRoZSBsb3dlc3QpLiBGaXJtd2FyZSB3aWxsIG9ubHkgYmUgbG9hZGVkIGlmCi0gKiBpdCBoYXMgYSBzdXBwb3J0ZWQgQVBJIHZlcnNpb24uIFRoZSBmaXJtd2FyZSdzIEFQSSB2ZXJzaW9uIHdpbGwgYmUKLSAqIHN0b3JlZCBpbiBAaXdsX3ByaXYsIGVuYWJsaW5nIHRoZSBkcml2ZXIgdG8gbWFrZSBydW50aW1lIGNoYW5nZXMgYmFzZWQKLSAqIG9uIGZpcm13YXJlIHZlcnNpb24gdXNlZC4KLSAqCi0gKiBGb3IgZXhhbXBsZSwKLSAqIGlmIChJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3ZlcikgPj0gMikgewotICoJRHJpdmVyIGludGVyYWN0cyB3aXRoIEZpcm13YXJlIEFQSSB2ZXJzaW9uID49IDIuCi0gKiB9IGVsc2UgewotICoJRHJpdmVyIGludGVyYWN0cyB3aXRoIEZpcm13YXJlIEFQSSB2ZXJzaW9uIDEuCi0gKiB9Ci0gKgotICogVGhlIGlkZWFsIHVzYWdlIG9mIHRoaXMgaW5mcmFzdHJ1Y3R1cmUgaXMgdG8gdHJlYXQgYSBuZXcgdWNvZGUgQVBJCi0gKiByZWxlYXNlIGFzIGEgbmV3IGhhcmR3YXJlIHJldmlzaW9uLiBUaGF0IGlzLCB0aHJvdWdoIHV0aWxpemluZyB0aGUKLSAqIGl3bF9oY21kX3V0aWxzX29wcyBldGMuIHdlIGFjY29tbW9kYXRlIGRpZmZlcmVudCBjb21tYW5kIHN0cnVjdHVyZXMKLSAqIGFuZCBmbG93cyBiZXR3ZWVuIGhhcmR3YXJlIHZlcnNpb25zIGFzIHdlbGwgYXMgdGhlaXIgQVBJCi0gKiB2ZXJzaW9ucy4KLSAqCi0gKi8KLXN0cnVjdCBpd2xfY2ZnIHsKLQkvKiBwYXJhbXMgc3BlY2lmaWMgdG8gYW4gaW5kaXZpZHVhbCBkZXZpY2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqZndfbmFtZV9wcmU7Ci0JY29uc3QgdW5zaWduZWQgaW50IHVjb2RlX2FwaV9tYXg7Ci0JY29uc3QgdW5zaWduZWQgaW50IHVjb2RlX2FwaV9taW47Ci0JdTggICB2YWxpZF90eF9hbnQ7Ci0JdTggICB2YWxpZF9yeF9hbnQ7Ci0JdW5zaWduZWQgaW50IHNrdTsKLQl1MTYgIGVlcHJvbV92ZXI7Ci0JdTE2ICBlZXByb21fY2FsaWJfdmVyOwotCWNvbnN0IHN0cnVjdCBpd2xfb3BzICpvcHM7Ci0JLyogbW9kdWxlIGJhc2VkIHBhcmFtZXRlcnMgd2hpY2ggY2FuIGJlIHNldCBmcm9tIG1vZHByb2JlIGNtZCAqLwotCWNvbnN0IHN0cnVjdCBpd2xfbW9kX3BhcmFtcyAqbW9kX3BhcmFtczsKLQkvKiBwYXJhbXMgbm90IGxpa2VseSB0byBjaGFuZ2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLwotCXN0cnVjdCBpd2xfYmFzZV9wYXJhbXMgKmJhc2VfcGFyYW1zOwotCS8qIHBhcmFtcyBsaWtlbHkgdG8gY2hhbmdlIHdpdGhpbiBhIGRldmljZSBmYW1pbHkgKi8KLQl1OCBzY2FuX3J4X2FudGVubmFzW0lFRUU4MDIxMV9OVU1fQkFORFNdOwotCWVudW0gaXdsX2xlZF9tb2RlIGxlZF9tb2RlOwotfTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBMIGkgYiAgICAgICAgICAgICAgICAgKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IGllZWU4MDIxMV9odyAqaXdsX2xlZ2FjeV9hbGxvY19hbGwoc3RydWN0IGl3bF9jZmcgKmNmZyk7Ci1pbnQgaXdsX2xlZ2FjeV9tYWNfY29uZl90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHUxNiBxdWV1ZSwKLQkJICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zICpwYXJhbXMpOwotaW50IGl3bF9sZWdhY3lfbWFjX3R4X2xhc3RfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKLXZvaWQgaXdsX2xlZ2FjeV9zZXRfcnhvbl9od2NyeXB0byhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4LAotCQkJaW50IGh3X2RlY3J5cHQpOwotaW50IGl3bF9sZWdhY3lfY2hlY2tfcnhvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci1pbnQgaXdsX2xlZ2FjeV9mdWxsX3J4b25fcmVxdWlyZWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci1pbnQgaXdsX2xlZ2FjeV9zZXRfcnhvbl9jaGFubmVsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2gsCi0JCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLXZvaWQgaXdsX2xlZ2FjeV9zZXRfZmxhZ3NfZm9yX2JhbmQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLAotCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotdTggaXdsX2xlZ2FjeV9nZXRfc2luZ2xlX2NoYW5uZWxfbnVtYmVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCk7Ci12b2lkIGl3bF9sZWdhY3lfc2V0X3J4b25faHQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9odF9jb25maWcgKmh0X2NvbmYpOwotYm9vbCBpd2xfbGVnYWN5X2lzX2h0NDBfdHhfYWxsb3dlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCk7Ci12b2lkIGl3bF9sZWdhY3lfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7Ci12b2lkIGl3bF9sZWdhY3lfc2V0X3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X3NldF9kZWNyeXB0ZWRfZmxhZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAotCQkJICAgdTMyIGRlY3J5cHRfcmVzLAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXRzKTsKLXZvaWQgaXdsX2xlZ2FjeV9pcnFfaGFuZGxlX2Vycm9yKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2xlZ2FjeV9tYWNfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci12b2lkIGl3bF9sZWdhY3lfbWFjX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLWludCBpd2xfbGVnYWN5X21hY19jaGFuZ2VfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgICBlbnVtIG5sODAyMTFfaWZ0eXBlIG5ld3R5cGUsIGJvb2wgbmV3cDJwKTsKLWludCBpd2xfbGVnYWN5X2FsbG9jX3R4cV9tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV90eHFfbWVtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUwotaW50IGl3bF9sZWdhY3lfYWxsb2NfdHJhZmZpY19tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9mcmVlX3RyYWZmaWNfbWVtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bF9sZWdhY3lfcmVzZXRfdHJhZmZpY19sb2coc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9kYmdfbG9nX3R4X2RhdGFfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXUxNiBsZW5ndGgsIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZWFkZXIpOwotdm9pZCBpd2xfbGVnYWN5X2RiZ19sb2dfcnhfZGF0YV9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJdTE2IGxlbmd0aCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcik7Ci1jb25zdCBjaGFyICppd2xfbGVnYWN5X2dldF9tZ210X3N0cmluZyhpbnQgY21kKTsKLWNvbnN0IGNoYXIgKml3bF9sZWdhY3lfZ2V0X2N0cmxfc3RyaW5nKGludCBjbWQpOwotdm9pZCBpd2xfbGVnYWN5X2NsZWFyX3RyYWZmaWNfc3RhdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV91cGRhdGVfc3RhdHMoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGlzX3R4LCBfX2xlMTYgZmMsCi0JCSAgICAgIHUxNiBsZW4pOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfYWxsb2NfdHJhZmZpY19tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiAwOwotfQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfZnJlZV90cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9yZXNldF90cmFmZmljX2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9kYmdfbG9nX3R4X2RhdGFfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkgICAgICB1MTYgbGVuZ3RoLCBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGVhZGVyKQotewotfQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfZGJnX2xvZ19yeF9kYXRhX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJICAgICAgdTE2IGxlbmd0aCwgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhlYWRlcikKLXsKLX0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgaXNfdHgsCi0JCQkJICAgIF9fbGUxNiBmYywgdTE2IGxlbikKLXsKLX0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBSWCBoYW5kbGVycy4KLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpd2xfbGVnYWN5X3J4X3BtX3NsZWVwX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLXZvaWQgaXdsX2xlZ2FjeV9yeF9wbV9kZWJ1Z19zdGF0aXN0aWNzX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci12b2lkIGl3bF9sZWdhY3lfcnhfcmVwbHlfZXJyb3Ioc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogUlgKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgaXdsX2xlZ2FjeV9jbWRfcXVldWVfdW5tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9jbWRfcXVldWVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfcnhfcXVldWVfYWxsb2Moc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBpd2xfcnhfcXVldWUgKnEpOwotaW50IGl3bF9sZWdhY3lfcnhfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcSk7Ci12b2lkIGl3bF9sZWdhY3lfdHhfY21kX2NvbXBsZXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4Yik7Ci0vKiBIYW5kbGVycyAqLwotdm9pZCBpd2xfbGVnYWN5X3J4X3NwZWN0cnVtX21lYXN1cmVfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKTsKLXZvaWQgaXdsX2xlZ2FjeV9yZWNvdmVyX2Zyb21fc3RhdGlzdGljcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCk7Ci12b2lkIGl3bF9sZWdhY3lfY2hzd2l0Y2hfZG9uZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgaXNfc3VjY2Vzcyk7Ci12b2lkIGl3bF9sZWdhY3lfcnhfY3NhKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwotCi0vKiBUWCBoZWxwZXJzICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBUWAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKTsKLWludCBpd2xfbGVnYWN5X3R4X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCi0JCSAgICAgIGludCBzbG90c19udW0sIHUzMiB0eHFfaWQpOwotdm9pZCBpd2xfbGVnYWN5X3R4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCWludCBzbG90c19udW0sIHUzMiB0eHFfaWQpOwotdm9pZCBpd2xfbGVnYWN5X3R4X3F1ZXVlX3VubWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCk7Ci12b2lkIGl3bF9sZWdhY3lfdHhfcXVldWVfZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQpOwotdm9pZCBpd2xfbGVnYWN5X3NldHVwX3dhdGNoZG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFRYIHBvd2VyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWludCBpd2xfbGVnYWN5X3NldF90eF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHM4IHR4X3Bvd2VyLCBib29sIGZvcmNlKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFJhdGUKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXU4IGl3bF9sZWdhY3lfZ2V0X2xvd2VzdF9wbGNwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIFNjYW5uaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotdm9pZCBpd2xfbGVnYWN5X2luaXRfc2Nhbl9wYXJhbXMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X3NjYW5fY2FuY2VsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdW5zaWduZWQgbG9uZyBtcyk7Ci12b2lkIGl3bF9sZWdhY3lfZm9yY2Vfc2Nhbl9lbmQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X21hY19od19zY2FuKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgIHN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSk7Ci12b2lkIGl3bF9sZWdhY3lfaW50ZXJuYWxfc2hvcnRfaHdfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfZm9yY2VfcmVzZXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGV4dGVybmFsKTsKLXUxNiBpd2xfbGVnYWN5X2ZpbGxfcHJvYmVfcmVxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqZnJhbWUsCi0JCSAgICAgICBjb25zdCB1OCAqdGEsIGNvbnN0IHU4ICppZSwgaW50IGllX2xlbiwgaW50IGxlZnQpOwotdm9pZCBpd2xfbGVnYWN5X3NldHVwX3J4X3NjYW5faGFuZGxlcnMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXUxNiBpd2xfbGVnYWN5X2dldF9hY3RpdmVfZHdlbGxfdGltZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkgICAgICB1OCBuX3Byb2Jlcyk7Ci11MTYgaXdsX2xlZ2FjeV9nZXRfcGFzc2l2ZV9kd2VsbF90aW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7Ci12b2lkIGl3bF9sZWdhY3lfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bF9sZWdhY3lfY2FuY2VsX3NjYW5fZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi0vKiBGb3IgZmFzdGVyIGFjdGl2ZSBzY2FubmluZywgc2NhbiB3aWxsIG1vdmUgdG8gdGhlIG5leHQgY2hhbm5lbCBpZiBmZXdlciB0aGFuCi0gKiBQTENQX1FVSUVUX1RIUkVTSCBwYWNrZXRzIGFyZSBoZWFyZCBvbiB0aGlzIGNoYW5uZWwgd2l0aGluCi0gKiBBQ1RJVkVfUVVJRVRfVElNRSBhZnRlciBzZW5kaW5nIHByb2JlIHJlcXVlc3QuICBUaGlzIHNob3J0ZW5zIHRoZSBkd2VsbAotICogdGltZSBpZiBpdCdzIGEgcXVpZXQgY2hhbm5lbCAobm90aGluZyByZXNwb25kZWQgdG8gb3VyIHByb2JlLCBhbmQgdGhlcmUncwotICogbm8gb3RoZXIgdHJhZmZpYykuCi0gKiBEaXNhYmxlICJxdWlldCIgZmVhdHVyZSBieSBzZXR0aW5nIFBMQ1BfUVVJRVRfVEhSRVNIIHRvIDAuICovCi0jZGVmaW5lIElXTF9BQ1RJVkVfUVVJRVRfVElNRSAgICAgICBjcHVfdG9fbGUxNigxMCkgIC8qIG1zZWMgKi8KLSNkZWZpbmUgSVdMX1BMQ1BfUVVJRVRfVEhSRVNIICAgICAgIGNwdV90b19sZTE2KDEpICAvKiBwYWNrZXRzICovCi0KLSNkZWZpbmUgSVdMX1NDQU5fQ0hFQ0tfV0FUQ0hET0cJCShIWiAqIDcpCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBTIGUgbiBkIGkgbiBnICAgICBIIG8gcyB0ICAgICBDIG8gbSBtIGEgbiBkIHMgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNvbnN0IGNoYXIgKml3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcodTggY21kKTsKLWludCBfX211c3RfY2hlY2sgaXdsX2xlZ2FjeV9zZW5kX2NtZF9zeW5jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpOwotaW50IGl3bF9sZWdhY3lfc2VuZF9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpOwotaW50IF9fbXVzdF9jaGVjayBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IGlkLAotCQkJCSAgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSk7Ci1pbnQgaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHVfYXN5bmMoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBpZCwgdTE2IGxlbiwKLQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsCi0JCQkgICB2b2lkICgqY2FsbGJhY2spKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJCQkgICAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkpOwotCi1pbnQgaXdsX2xlZ2FjeV9lbnF1ZXVlX2hjbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpOwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogUENJCQkJCQkJICAgICAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbmxpbmUgdTE2IGl3bF9sZWdhY3lfcGNpZV9saW5rX2N0bChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHBvczsKLQl1MTYgcGNpX2xua19jdGw7Ci0JcG9zID0gcGNpX3BjaWVfY2FwKHByaXYtPnBjaV9kZXYpOwotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHByaXYtPnBjaV9kZXYsIHBvcyArIFBDSV9FWFBfTE5LQ1RMLCAmcGNpX2xua19jdGwpOwotCXJldHVybiBwY2lfbG5rX2N0bDsKLX0KLQotdm9pZCBpd2xfbGVnYWN5X2JnX3dhdGNoZG9nKHVuc2lnbmVkIGxvbmcgZGF0YSk7Ci11MzIgaXdsX2xlZ2FjeV91c2Vjc190b19iZWFjb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJdTMyIHVzZWMsIHUzMiBiZWFjb25faW50ZXJ2YWwpOwotX19sZTMyIGl3bF9sZWdhY3lfYWRkX2JlYWNvbl90aW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGJhc2UsCi0JCQkgICB1MzIgYWRkb24sIHUzMiBiZWFjb25faW50ZXJ2YWwpOwotCi0jaWZkZWYgQ09ORklHX1BNCi1pbnQgaXdsX2xlZ2FjeV9wY2lfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwotaW50IGl3bF9sZWdhY3lfcGNpX3Jlc3VtZShzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwotZXh0ZXJuIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIGl3bF9sZWdhY3lfcG1fb3BzOwotCi0jZGVmaW5lIElXTF9MRUdBQ1lfUE1fT1BTCSgmaXdsX2xlZ2FjeV9wbV9vcHMpCi0KLSNlbHNlIC8qICFDT05GSUdfUE0gKi8KLQotI2RlZmluZSBJV0xfTEVHQUNZX1BNX09QUwlOVUxMCi0KLSNlbmRpZiAvKiAhQ09ORklHX1BNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiAgRXJyb3IgSGFuZGxpbmcgRGVidWdnaW5nCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIGl3bDQ5NjVfZHVtcF9uaWNfZXJyb3JfbG9nKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi12b2lkIGl3bF9sZWdhY3lfcHJpbnRfcnhfY29uZmlnX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3ByaW50X3J4X2NvbmZpZ19jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotfQotI2VuZGlmCi0KLXZvaWQgaXdsX2xlZ2FjeV9jbGVhcl9pc3Jfc3RhdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qICBHRU9TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1pbnQgaXdsX2xlZ2FjeV9pbml0X2dlb3Moc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9mcmVlX2dlb3Moc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotLyoqKioqKioqKioqKioqKiBEUklWRVIgU1RBVFVTIEZVTkNUSU9OUyAgICoqKioqLwotCi0jZGVmaW5lIFNUQVRVU19IQ01EX0FDVElWRQkwCS8qIGhvc3QgY29tbWFuZCBpbiBwcm9ncmVzcyAqLwotLyogMSBpcyB1bnVzZWQgKHVzZWQgdG8gYmUgU1RBVFVTX0hDTURfU1lOQ19BQ1RJVkUpICovCi0jZGVmaW5lIFNUQVRVU19JTlRfRU5BQkxFRAkyCi0jZGVmaW5lIFNUQVRVU19SRl9LSUxMX0hXCTMKLSNkZWZpbmUgU1RBVFVTX0NUX0tJTEwJCTQKLSNkZWZpbmUgU1RBVFVTX0lOSVQJCTUKLSNkZWZpbmUgU1RBVFVTX0FMSVZFCQk2Ci0jZGVmaW5lIFNUQVRVU19SRUFEWQkJNwotI2RlZmluZSBTVEFUVVNfVEVNUEVSQVRVUkUJOAotI2RlZmluZSBTVEFUVVNfR0VPX0NPTkZJR1VSRUQJOQotI2RlZmluZSBTVEFUVVNfRVhJVF9QRU5ESU5HCTEwCi0jZGVmaW5lIFNUQVRVU19TVEFUSVNUSUNTCTEyCi0jZGVmaW5lIFNUQVRVU19TQ0FOTklORwkJMTMKLSNkZWZpbmUgU1RBVFVTX1NDQU5fQUJPUlRJTkcJMTQKLSNkZWZpbmUgU1RBVFVTX1NDQU5fSFcJCTE1Ci0jZGVmaW5lIFNUQVRVU19QT1dFUl9QTUkJMTYKLSNkZWZpbmUgU1RBVFVTX0ZXX0VSUk9SCQkxNwotI2RlZmluZSBTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORyAxOAotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX3JlYWR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiBUaGUgYWRhcHRlciBpcyAncmVhZHknIGlmIFJFQURZIGFuZCBHRU9fQ09ORklHVVJFRCBiaXRzIGFyZQotCSAqIHNldCBidXQgRVhJVF9QRU5ESU5HIGlzIG5vdCAqLwotCXJldHVybiB0ZXN0X2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpICYmCi0JICAgICAgIHRlc3RfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cykgJiYKLQkgICAgICAgIXRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX2FsaXZlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlyZXR1cm4gdGVzdF9iaXQoU1RBVFVTX0FMSVZFLCAmcHJpdi0+c3RhdHVzKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlyZXR1cm4gdGVzdF9iaXQoU1RBVFVTX0lOSVQsICZwcml2LT5zdGF0dXMpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX3Jma2lsbF9odyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcmV0dXJuIHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19yZmtpbGwoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiBpd2xfbGVnYWN5X2lzX3Jma2lsbF9odyhwcml2KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19jdGtpbGwoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXJldHVybiB0ZXN0X2JpdChTVEFUVVNfQ1RfS0lMTCwgJnByaXYtPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfcmVhZHlfcmYoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCi0JaWYgKGl3bF9sZWdhY3lfaXNfcmZraWxsKHByaXYpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiBpd2xfbGVnYWN5X2lzX3JlYWR5KHByaXYpOwotfQotCi1leHRlcm4gdm9pZCBpd2xfbGVnYWN5X3NlbmRfYnRfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1leHRlcm4gaW50IGl3bF9sZWdhY3lfc2VuZF9zdGF0aXN0aWNzX3JlcXVlc3Qoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICB1OCBmbGFncywgYm9vbCBjbGVhcik7Ci12b2lkIGl3bF9sZWdhY3lfYXBtX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X2FwbV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLWludCBpd2xfbGVnYWN5X3NlbmRfcnhvbl90aW1pbmcoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9zZW5kX3J4b25fYXNzb2Moc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JcmV0dXJuIHByaXYtPmNmZy0+b3BzLT5oY21kLT5yeG9uX2Fzc29jKHByaXYsIGN0eCk7Ci19Ci1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2NvbW1pdF9yeG9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCXJldHVybiBwcml2LT5jZmctPm9wcy0+aGNtZC0+Y29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLX0KLXN0YXRpYyBpbmxpbmUgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqaXdsX2dldF9od19tb2RlKAotCQkJc3RydWN0IGl3bF9wcml2ICpwcml2LCBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQpCi17Ci0JcmV0dXJuIHByaXYtPmh3LT53aXBoeS0+YmFuZHNbYmFuZF07Ci19Ci0KLS8qIG1hYzgwMjExIGhhbmRsZXJzICovCi1pbnQgaXdsX2xlZ2FjeV9tYWNfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgY2hhbmdlZCk7Ci12b2lkIGl3bF9sZWdhY3lfbWFjX3Jlc2V0X3RzZihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotdm9pZCBpd2xfbGVnYWN5X21hY19ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAotCQkJCSAgICAgdTMyIGNoYW5nZXMpOwotdm9pZCBpd2xfbGVnYWN5X3R4X2NtZF9wcm90ZWN0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJX19sZTE2IGZjLCBfX2xlMzIgKnR4X2ZsYWdzKTsKLQotaXJxcmV0dXJuX3QgaXdsX2xlZ2FjeV9pc3IoaW50IGlycSwgdm9pZCAqZGF0YSk7Ci0KLSNlbmRpZiAvKiBfX2l3bF9sZWdhY3lfY29yZV9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRlYnVnLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTMxMTIuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRlYnVnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF9sZWdhY3lfZGVidWdfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9kZWJ1Z19oX18KLQotc3RydWN0IGl3bF9wcml2OwotZXh0ZXJuIHUzMiBpd2xlZ2FjeV9kZWJ1Z19sZXZlbDsKLQotI2RlZmluZSBJV0xfRVJSKHAsIGYsIGEuLi4pIGRldl9lcnIoJigocCktPnBjaV9kZXYtPmRldiksIGYsICMjIGEpCi0jZGVmaW5lIElXTF9XQVJOKHAsIGYsIGEuLi4pIGRldl93YXJuKCYoKHApLT5wY2lfZGV2LT5kZXYpLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfSU5GTyhwLCBmLCBhLi4uKSBkZXZfaW5mbygmKChwKS0+cGNpX2Rldi0+ZGV2KSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0NSSVQocCwgZiwgYS4uLikgZGV2X2NyaXQoJigocCktPnBjaV9kZXYtPmRldiksIGYsICMjIGEpCi0KLSNkZWZpbmUgaXdsX3ByaW50X2hleF9lcnJvcihwcml2LCBwLCBsZW4pCQkJCSBcCi1kbyB7CQkJCQkJCQkJXAotCXByaW50X2hleF9kdW1wKEtFUk5fRVJSLCAiaXdsIGRhdGE6ICIsCQkJCVwKLQkJICAgICAgIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsIHAsIGxlbiwgMSk7CQlcCi19IHdoaWxlICgwKQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0jZGVmaW5lIElXTF9ERUJVRyhfX3ByaXYsIGxldmVsLCBmbXQsIGFyZ3MuLi4pCQkJCVwKLWRvIHsJCQkJCQkJCQlcCi0JaWYgKGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKF9fcHJpdikgJiAobGV2ZWwpKQkJCVwKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJihfX3ByaXYtPmh3LT53aXBoeS0+ZGV2KSwJCVwKLQkJCSAiJWMgJXMgIiBmbXQsIGluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLAlcCi0JCQlfX2Z1bmNfXyAsICMjIGFyZ3MpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIElXTF9ERUJVR19MSU1JVChfX3ByaXYsIGxldmVsLCBmbXQsIGFyZ3MuLi4pCQkJXAotZG8gewkJCQkJCQkJCVwKLQlpZiAoKGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKF9fcHJpdikgJiAobGV2ZWwpKSAmJiBuZXRfcmF0ZWxpbWl0KCkpCVwKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgJihfX3ByaXYtPmh3LT53aXBoeS0+ZGV2KSwJCVwKLQkJCSIlYyAlcyAiIGZtdCwgaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsCVwKLQkJCSBfX2Z1bmNfXyAsICMjIGFyZ3MpOwkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIGl3bF9wcmludF9oZXhfZHVtcChwcml2LCBsZXZlbCwgcCwgbGVuKSAJCQlcCi1kbyB7CQkJCQkJCQkJXAotCWlmIChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIGxldmVsKQkJCQlcCi0JCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsICJpd2wgZGF0YTogIiwJCVwKLQkJCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLCBwLCBsZW4sIDEpOwlcCi19IHdoaWxlICgwKQotCi0jZWxzZQotI2RlZmluZSBJV0xfREVCVUcoX19wcml2LCBsZXZlbCwgZm10LCBhcmdzLi4uKQotI2RlZmluZSBJV0xfREVCVUdfTElNSVQoX19wcml2LCBsZXZlbCwgZm10LCBhcmdzLi4uKQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9wcmludF9oZXhfZHVtcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBsZXZlbCwKLQkJCQkgICAgICBjb25zdCB2b2lkICpwLCB1MzIgbGVuKQote30KLSNlbmRpZgkJCQkvKiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcgKi8KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi1pbnQgaXdsX2xlZ2FjeV9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNvbnN0IGNoYXIgKm5hbWUpOwotdm9pZCBpd2xfbGVnYWN5X2RiZ2ZzX3VucmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludAotaXdsX2xlZ2FjeV9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9kYmdmc191bnJlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLX0KLSNlbmRpZgkJCQkvKiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUdGUyAqLwotCi0vKgotICogVG8gdXNlIHRoZSBkZWJ1ZyBzeXN0ZW06Ci0gKgotICogSWYgeW91IGFyZSBkZWZpbmluZyBhIG5ldyBkZWJ1ZyBjbGFzc2lmaWNhdGlvbiwgc2ltcGx5IGFkZCBpdCB0byB0aGUgI2RlZmluZQotICogbGlzdCBoZXJlIGluIHRoZSBmb3JtIG9mCi0gKgotICogI2RlZmluZSBJV0xfRExfeHh4eCBWQUxVRQotICoKLSAqIHdoZXJlIHh4eHggc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBjbGFzc2lmaWNhdGlvbiAoZm9yIGV4YW1wbGUsIFdFUCkuCi0gKgotICogWW91IHRoZW4gbmVlZCB0byBlaXRoZXIgYWRkIGEgSVdMX3h4eHhfREVCVUcoKSBtYWNybyBkZWZpbml0aW9uIGZvciB5b3VyCi0gKiBjbGFzc2lmaWNhdGlvbiwgb3IgdXNlIElXTF9ERUJVRyhJV0xfRExfeHh4eCwgLi4uKSB3aGVuZXZlciB5b3Ugd2FudAotICogdG8gc2VuZCBvdXRwdXQgdG8gdGhhdCBjbGFzc2lmaWNhdGlvbi4KLSAqCi0gKiBUaGUgYWN0aXZlIGRlYnVnIGxldmVscyBjYW4gYmUgYWNjZXNzZWQgdmlhIGZpbGVzCi0gKgotICogCS9zeXMvbW9kdWxlL2l3bDQ5NjUvcGFyYW1ldGVycy9kZWJ1Z3s1MH0KLSAqCS9zeXMvbW9kdWxlL2l3bDM5NDUvcGFyYW1ldGVycy9kZWJ1ZwotICogCS9zeXMvY2xhc3MvbmV0L3dsYW4wL2RldmljZS9kZWJ1Z19sZXZlbAotICoKLSAqIHdoZW4gQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHPXkuCi0gKi8KLQotLyogMHgwMDAwMDAwRiAtIDB4MDAwMDAwMDEgKi8KLSNkZWZpbmUgSVdMX0RMX0lORk8JCSgxIDw8IDApCi0jZGVmaW5lIElXTF9ETF9NQUM4MDIxMQkJKDEgPDwgMSkKLSNkZWZpbmUgSVdMX0RMX0hDTUQJCSgxIDw8IDIpCi0jZGVmaW5lIElXTF9ETF9TVEFURQkJKDEgPDwgMykKLS8qIDB4MDAwMDAwRjAgLSAweDAwMDAwMDEwICovCi0jZGVmaW5lIElXTF9ETF9NQUNEVU1QCQkoMSA8PCA0KQotI2RlZmluZSBJV0xfRExfSENNRF9EVU1QCSgxIDw8IDUpCi0jZGVmaW5lIElXTF9ETF9FRVBST00JCSgxIDw8IDYpCi0jZGVmaW5lIElXTF9ETF9SQURJTwkJKDEgPDwgNykKLS8qIDB4MDAwMDBGMDAgLSAweDAwMDAwMTAwICovCi0jZGVmaW5lIElXTF9ETF9QT1dFUgkJKDEgPDwgOCkKLSNkZWZpbmUgSVdMX0RMX1RFTVAJCSgxIDw8IDkpCi0jZGVmaW5lIElXTF9ETF9OT1RJRgkJKDEgPDwgMTApCi0jZGVmaW5lIElXTF9ETF9TQ0FOCQkoMSA8PCAxMSkKLS8qIDB4MDAwMEYwMDAgLSAweDAwMDAxMDAwICovCi0jZGVmaW5lIElXTF9ETF9BU1NPQwkJKDEgPDwgMTIpCi0jZGVmaW5lIElXTF9ETF9EUk9QCQkoMSA8PCAxMykKLSNkZWZpbmUgSVdMX0RMX1RYUE9XRVIJCSgxIDw8IDE0KQotI2RlZmluZSBJV0xfRExfQVAJCSgxIDw8IDE1KQotLyogMHgwMDBGMDAwMCAtIDB4MDAwMTAwMDAgKi8KLSNkZWZpbmUgSVdMX0RMX0ZXCQkoMSA8PCAxNikKLSNkZWZpbmUgSVdMX0RMX1JGX0tJTEwJCSgxIDw8IDE3KQotI2RlZmluZSBJV0xfRExfRldfRVJST1JTCSgxIDw8IDE4KQotI2RlZmluZSBJV0xfRExfTEVECQkoMSA8PCAxOSkKLS8qIDB4MDBGMDAwMDAgLSAweDAwMTAwMDAwICovCi0jZGVmaW5lIElXTF9ETF9SQVRFCQkoMSA8PCAyMCkKLSNkZWZpbmUgSVdMX0RMX0NBTElCCQkoMSA8PCAyMSkKLSNkZWZpbmUgSVdMX0RMX1dFUAkJKDEgPDwgMjIpCi0jZGVmaW5lIElXTF9ETF9UWAkJKDEgPDwgMjMpCi0vKiAweDBGMDAwMDAwIC0gMHgwMTAwMDAwMCAqLwotI2RlZmluZSBJV0xfRExfUlgJCSgxIDw8IDI0KQotI2RlZmluZSBJV0xfRExfSVNSCQkoMSA8PCAyNSkKLSNkZWZpbmUgSVdMX0RMX0hUCQkoMSA8PCAyNikKLSNkZWZpbmUgSVdMX0RMX0lPCQkoMSA8PCAyNykKLS8qIDB4RjAwMDAwMDAgLSAweDEwMDAwMDAwICovCi0jZGVmaW5lIElXTF9ETF8xMUgJCSgxIDw8IDI4KQotI2RlZmluZSBJV0xfRExfU1RBVFMJCSgxIDw8IDI5KQotI2RlZmluZSBJV0xfRExfVFhfUkVQTFkJCSgxIDw8IDMwKQotI2RlZmluZSBJV0xfRExfUU9TCQkoMSA8PCAzMSkKLQotI2RlZmluZSBJV0xfREVCVUdfSU5GTyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0lORk8sIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19NQUM4MDIxMShwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX01BQzgwMjExLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfTUFDRFVNUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX01BQ0RVTVAsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19URU1QKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfVEVNUCwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1NDQU4ocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9TQ0FOLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfUlgocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9SWCwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1RYKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfVFgsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19JU1IocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9JU1IsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19MRUQocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9MRUQsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19XRVAocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9XRVAsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19IQyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0hDTUQsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19IQ19EVU1QKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfSENNRF9EVU1QLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfRUVQUk9NKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfRUVQUk9NLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfQ0FMSUIocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9DQUxJQiwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0ZXKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfRlcsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19SRl9LSUxMKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfUkZfS0lMTCwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0RST1AocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9EUk9QLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfRFJPUF9MSU1JVChwLCBmLCBhLi4uKQlcCi0JCUlXTF9ERUJVR19MSU1JVChwLCBJV0xfRExfRFJPUCwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0FQKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfQVAsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19UWFBPV0VSKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfVFhQT1dFUiwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0lPKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfSU8sIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19SQVRFKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfUkFURSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1JBVEVfTElNSVQocCwgZiwgYS4uLikJXAotCQlJV0xfREVCVUdfTElNSVQocCwgSVdMX0RMX1JBVEUsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19OT1RJRihwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX05PVElGLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfQVNTT0MocCwgZiwgYS4uLikJXAotCQlJV0xfREVCVUcocCwgSVdMX0RMX0FTU09DIHwgSVdMX0RMX0lORk8sIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19BU1NPQ19MSU1JVChwLCBmLCBhLi4uKQlcCi0JCUlXTF9ERUJVR19MSU1JVChwLCBJV0xfRExfQVNTT0MgfCBJV0xfRExfSU5GTywgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0hUKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfSFQsIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19TVEFUUyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1NUQVRTLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfU1RBVFNfTElNSVQocCwgZiwgYS4uLikJXAotCQlJV0xfREVCVUdfTElNSVQocCwgSVdMX0RMX1NUQVRTLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfVFhfUkVQTFkocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9UWF9SRVBMWSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1RYX1JFUExZX0xJTUlUKHAsIGYsIGEuLi4pIFwKLQkJSVdMX0RFQlVHX0xJTUlUKHAsIElXTF9ETF9UWF9SRVBMWSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1FPUyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1FPUywgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1JBRElPKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfUkFESU8sIGYsICMjIGEpCi0jZGVmaW5lIElXTF9ERUJVR19QT1dFUihwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1BPV0VSLCBmLCAjIyBhKQotI2RlZmluZSBJV0xfREVCVUdfMTFIKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfMTFILCBmLCAjIyBhKQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGVidWdmcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDA3ZGNhLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZWJ1Z2ZzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotCi0vKiBjcmVhdGUgYW5kIHJlbW92ZSBvZiBmaWxlcyAqLwotI2RlZmluZSBERUJVR0ZTX0FERF9GSUxFKG5hbWUsIHBhcmVudCwgbW9kZSkgZG8gewkJCVwKLQlpZiAoIWRlYnVnZnNfY3JlYXRlX2ZpbGUoI25hbWUsIG1vZGUsIHBhcmVudCwgcHJpdiwJCVwKLQkJCSAmaXdsX2xlZ2FjeV9kYmdmc18jI25hbWUjI19vcHMpKQkJXAotCQlnb3RvIGVycjsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIERFQlVHRlNfQUREX0JPT0wobmFtZSwgcGFyZW50LCBwdHIpIGRvIHsJCQlcCi0Jc3RydWN0IGRlbnRyeSAqX190bXA7CQkJCQkJXAotCV9fdG1wID0gZGVidWdmc19jcmVhdGVfYm9vbCgjbmFtZSwgU19JV1VTUiB8IFNfSVJVU1IsCQlcCi0JCQkJICAgIHBhcmVudCwgcHRyKTsJCQlcCi0JaWYgKElTX0VSUihfX3RtcCkgfHwgIV9fdG1wKQkJCQkJXAotCQlnb3RvIGVycjsJCQkJCQlcCi19IHdoaWxlICgwKQotCi0jZGVmaW5lIERFQlVHRlNfQUREX1gzMihuYW1lLCBwYXJlbnQsIHB0cikgZG8gewkJCQlcCi0Jc3RydWN0IGRlbnRyeSAqX190bXA7CQkJCQkJXAotCV9fdG1wID0gZGVidWdmc19jcmVhdGVfeDMyKCNuYW1lLCBTX0lXVVNSIHwgU19JUlVTUiwJCVwKLQkJCQkgICBwYXJlbnQsIHB0cik7CQkJXAotCWlmIChJU19FUlIoX190bXApIHx8ICFfX3RtcCkJCQkJCVwKLQkJZ290byBlcnI7CQkJCQkJXAotfSB3aGlsZSAoMCkKLQotLyogZmlsZSBvcGVyYXRpb24gKi8KLSNkZWZpbmUgREVCVUdGU19SRUFEX0ZVTkMobmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfIyNuYW1lIyNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgICAgICAgICAgICAgICBcCi0JCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwgICAgICAgICAgXAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci0KLSNkZWZpbmUgREVCVUdGU19XUklURV9GVU5DKG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfIyNuYW1lIyNfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsICAgICAgICAgICAgICBcCi0JCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwgICAgXAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcyk7Ci0KLQotc3RhdGljIGludAotaXdsX2xlZ2FjeV9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQlmaWxlLT5wcml2YXRlX2RhdGEgPSBpbm9kZS0+aV9wcml2YXRlOwotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIERFQlVHRlNfUkVBRF9GSUxFX09QUyhuYW1lKSAJCQkJXAotCURFQlVHRlNfUkVBRF9GVU5DKG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX29wcyA9IHsJXAotCS5yZWFkID0gaXdsX2xlZ2FjeV9kYmdmc18jI25hbWUjI19yZWFkLAkJCQlcCi0JLm9wZW4gPSBpd2xfbGVnYWN5X2RiZ2ZzX29wZW5fZmlsZV9nZW5lcmljLCAgICAgICAgICAgICAgICAgICAgCVwKLQkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywJCQkJCVwKLX07Ci0KLSNkZWZpbmUgREVCVUdGU19XUklURV9GSUxFX09QUyhuYW1lKSAJCQkJXAotCURFQlVHRlNfV1JJVEVfRlVOQyhuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX29wcyA9IHsJXAotCS53cml0ZSA9IGl3bF9sZWdhY3lfZGJnZnNfIyNuYW1lIyNfd3JpdGUsCQkJXAotCS5vcGVuID0gaXdsX2xlZ2FjeV9kYmdmc19vcGVuX2ZpbGVfZ2VuZXJpYywgICAgICAgICAgICAgICAgICAgIAlcCi0JLmxsc2VlayA9IGdlbmVyaWNfZmlsZV9sbHNlZWssCQkJCQlcCi19OwotCi0jZGVmaW5lIERFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQlERUJVR0ZTX1JFQURfRlVOQyhuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotCURFQlVHRlNfV1JJVEVfRlVOQyhuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpd2xfbGVnYWN5X2RiZ2ZzXyMjbmFtZSMjX29wcyA9IHsJXAotCS53cml0ZSA9IGl3bF9sZWdhY3lfZGJnZnNfIyNuYW1lIyNfd3JpdGUsCQkJXAotCS5yZWFkID0gaXdsX2xlZ2FjeV9kYmdmc18jI25hbWUjI19yZWFkLAkJCQlcCi0JLm9wZW4gPSBpd2xfbGVnYWN5X2RiZ2ZzX29wZW5fZmlsZV9nZW5lcmljLAkJCVwKLQkubGxzZWVrID0gZ2VuZXJpY19maWxlX2xsc2VlaywJCQkJCVwKLX07Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdHhfc3RhdGlzdGljc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyICpidWY7Ci0JaW50IHBvcyA9IDA7Ci0KLQlpbnQgY250OwotCXNzaXplX3QgcmV0OwotCWNvbnN0IHNpemVfdCBidWZzeiA9IDEwMCArCi0JCXNpemVvZihjaGFyKSAqIDUwICogKE1BTkFHRU1FTlRfTUFYICsgQ09OVFJPTF9NQVgpOwotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJNYW5hZ2VtZW50OlxuIik7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCBNQU5BR0VNRU5UX01BWDsgY250KyspIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSAiXHQlMjVzXHRcdDogJXVcbiIsCi0JCQkJIGl3bF9sZWdhY3lfZ2V0X21nbXRfc3RyaW5nKGNudCksCi0JCQkJIHByaXYtPnR4X3N0YXRzLm1nbXRbY250XSk7Ci0JfQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkNvbnRyb2xcbiIpOwotCWZvciAoY250ID0gMDsgY250IDwgQ09OVFJPTF9NQVg7IGNudCsrKSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkgIlx0JTI1c1x0XHQ6ICV1XG4iLAotCQkJCSBpd2xfbGVnYWN5X2dldF9jdHJsX3N0cmluZyhjbnQpLAotCQkJCSBwcml2LT50eF9zdGF0cy5jdHJsW2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJEYXRhOlxuIik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXHRjbnQ6ICV1XG4iLAotCQkJIHByaXYtPnR4X3N0YXRzLmRhdGFfY250KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdGJ5dGVzOiAlbGx1XG4iLAotCQkJIHByaXYtPnR4X3N0YXRzLmRhdGFfYnl0ZXMpOwotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QKLWl3bF9sZWdhY3lfZGJnZnNfY2xlYXJfdHJhZmZpY19zdGF0aXN0aWNzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQl1MzIgY2xlYXJfZmxhZzsKLQljaGFyIGJ1Zls4XTsKLQlpbnQgYnVmX3NpemU7Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChzc2NhbmYoYnVmLCAiJXgiLCAmY2xlYXJfZmxhZykgIT0gMSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaXdsX2xlZ2FjeV9jbGVhcl90cmFmZmljX3N0YXRzKHByaXYpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3J4X3N0YXRpc3RpY3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7Ci0KLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqYnVmOwotCWludCBwb3MgPSAwOwotCWludCBjbnQ7Ci0Jc3NpemVfdCByZXQ7Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gMTAwICsKLQkJc2l6ZW9mKGNoYXIpICogNTAgKiAoTUFOQUdFTUVOVF9NQVggKyBDT05UUk9MX01BWCk7Ci0JYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiTWFuYWdlbWVudDpcbiIpOwotCWZvciAoY250ID0gMDsgY250IDwgTUFOQUdFTUVOVF9NQVg7IGNudCsrKSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkgIlx0JTI1c1x0XHQ6ICV1XG4iLAotCQkJCSBpd2xfbGVnYWN5X2dldF9tZ210X3N0cmluZyhjbnQpLAotCQkJCSBwcml2LT5yeF9zdGF0cy5tZ210W2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJDb250cm9sOlxuIik7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCBDT05UUk9MX01BWDsgY250KyspIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSAiXHQlMjVzXHRcdDogJXVcbiIsCi0JCQkJIGl3bF9sZWdhY3lfZ2V0X2N0cmxfc3RyaW5nKGNudCksCi0JCQkJIHByaXYtPnJ4X3N0YXRzLmN0cmxbY250XSk7Ci0JfQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkRhdGE6XG4iKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcdGNudDogJXVcbiIsCi0JCQkgcHJpdi0+cnhfc3RhdHMuZGF0YV9jbnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlx0Ynl0ZXM6ICVsbHVcbiIsCi0JCQkgcHJpdi0+cnhfc3RhdHMuZGF0YV9ieXRlcyk7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLSNkZWZpbmUgQllURTFfTUFTSyAweDAwMDAwMGZmOwotI2RlZmluZSBCWVRFMl9NQVNLIDB4MDAwMGZmZmY7Ci0jZGVmaW5lIEJZVEUzX01BU0sgMHgwMGZmZmZmZjsKLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfc3JhbV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXUzMiB2YWw7Ci0JY2hhciAqYnVmOwotCXNzaXplX3QgcmV0OwotCWludCBpOwotCWludCBwb3MgPSAwOwotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlzaXplX3QgYnVmc3o7Ci0KLQkvKiBkZWZhdWx0IGlzIHRvIGR1bXAgdGhlIGVudGlyZSBkYXRhIHNlZ21lbnQgKi8KLQlpZiAoIXByaXYtPmRiZ2ZzX3NyYW1fb2Zmc2V0ICYmICFwcml2LT5kYmdmc19zcmFtX2xlbikgewotCQlwcml2LT5kYmdmc19zcmFtX29mZnNldCA9IDB4ODAwMDAwOwotCQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKQotCQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4gPSBwcml2LT51Y29kZV9pbml0X2RhdGEubGVuOwotCQllbHNlCi0JCQlwcml2LT5kYmdmc19zcmFtX2xlbiA9IHByaXYtPnVjb2RlX2RhdGEubGVuOwotCX0KLQlidWZzeiA9ICAzMCArIHByaXYtPmRiZ2ZzX3NyYW1fbGVuICogc2l6ZW9mKGNoYXIpICogMTA7Ci0JYnVmID0ga21hbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgInNyYW1fbGVuOiAweCV4XG4iLAotCQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgInNyYW1fb2Zmc2V0OiAweCV4XG4iLAotCQkJcHJpdi0+ZGJnZnNfc3JhbV9vZmZzZXQpOwotCWZvciAoaSA9IHByaXYtPmRiZ2ZzX3NyYW1fbGVuOyBpID4gMDsgaSAtPSA0KSB7Ci0JCXZhbCA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBwcml2LT5kYmdmc19zcmFtX29mZnNldCArIFwKLQkJCQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4gLSBpKTsKLQkJaWYgKGkgPCA0KSB7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCWNhc2UgMToKLQkJCQl2YWwgJj0gQllURTFfTUFTSzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMjoKLQkJCQl2YWwgJj0gQllURTJfTUFTSzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMzoKLQkJCQl2YWwgJj0gQllURTNfTUFTSzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoIShpICUgMTYpKQotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiMHglMDh4ICIsIHZhbCk7Ci0JfQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfc3JhbV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbNjRdOwotCWludCBidWZfc2l6ZTsKLQl1MzIgb2Zmc2V0LCBsZW47Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JaWYgKHNzY2FuZihidWYsICIleCwleCIsICZvZmZzZXQsICZsZW4pID09IDIpIHsKLQkJcHJpdi0+ZGJnZnNfc3JhbV9vZmZzZXQgPSBvZmZzZXQ7Ci0JCXByaXYtPmRiZ2ZzX3NyYW1fbGVuID0gbGVuOwotCX0gZWxzZSB7Ci0JCXByaXYtPmRiZ2ZzX3NyYW1fb2Zmc2V0ID0gMDsKLQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4gPSAwOwotCX0KLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QKLWl3bF9sZWdhY3lfZGJnZnNfc3RhdGlvbnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGl3bF9zdGF0aW9uX2VudHJ5ICpzdGF0aW9uOwotCWludCBtYXhfc3RhID0gcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsKLQljaGFyICpidWY7Ci0JaW50IGksIGosIHBvcyA9IDA7Ci0Jc3NpemVfdCByZXQ7Ci0JLyogQWRkIDMwIGZvciBpbml0aWFsIHN0cmluZyAqLwotCWNvbnN0IHNpemVfdCBidWZzeiA9IDMwICsgc2l6ZW9mKGNoYXIpICogNTAwICogKHByaXYtPm51bV9zdGF0aW9ucyk7Ci0KLQlidWYgPSBrbWFsbG9jKGJ1ZnN6LCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJudW0gb2Ygc3RhdGlvbnM6ICVkXG5cbiIsCi0JCQlwcml2LT5udW1fc3RhdGlvbnMpOwotCi0JZm9yIChpID0gMDsgaSA8IG1heF9zdGE7IGkrKykgewotCQlzdGF0aW9uID0gJnByaXYtPnN0YXRpb25zW2ldOwotCQlpZiAoIXN0YXRpb24tPnVzZWQpCi0JCQljb250aW51ZTsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSAic3RhdGlvbiAlZCAtIGFkZHI6ICVwTSwgZmxhZ3M6ICUjeFxuIiwKLQkJCQkgaSwgc3RhdGlvbi0+c3RhLnN0YS5hZGRyLAotCQkJCSBzdGF0aW9uLT5zdGEuc3RhdGlvbl9mbGFnc19tc2spOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIlRJRFx0c2VxX251bVx0dHhxX2lkXHRmcmFtZXNcdHRmZHNcdCIpOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJInN0YXJ0X2lkeFx0Yml0bWFwXHRcdFx0cmF0ZV9uX2ZsYWdzXG4iKTsKLQotCQlmb3IgKGogPSAwOyBqIDwgTUFYX1RJRF9DT1VOVDsgaisrKSB7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIiVkOlx0JSN4XHQlI3hcdCV1XHQldVx0JXVcdFx0JSMuMTZsbHhcdCUjeCIsCi0JCQkJaiwgc3RhdGlvbi0+dGlkW2pdLnNlcV9udW1iZXIsCi0JCQkJc3RhdGlvbi0+dGlkW2pdLmFnZy50eHFfaWQsCi0JCQkJc3RhdGlvbi0+dGlkW2pdLmFnZy5mcmFtZV9jb3VudCwKLQkJCQlzdGF0aW9uLT50aWRbal0udGZkc19pbl9xdWV1ZSwKLQkJCQlzdGF0aW9uLT50aWRbal0uYWdnLnN0YXJ0X2lkeCwKLQkJCQlzdGF0aW9uLT50aWRbal0uYWdnLmJpdG1hcCwKLQkJCQlzdGF0aW9uLT50aWRbal0uYWdnLnJhdGVfbl9mbGFncyk7Ci0KLQkJCWlmIChzdGF0aW9uLT50aWRbal0uYWdnLndhaXRfZm9yX2JhKQotCQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJCSAiIC0gd2FpdGZvcmJhIik7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCQl9Ci0KLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKLQl9Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfbnZtX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkgICAgICAgc2l6ZV90IGNvdW50LAotCQkJCSAgICAgICBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3NpemVfdCByZXQ7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwLCBvZnMgPSAwLCBidWZfc2l6ZSA9IDA7Ci0JY29uc3QgdTggKnB0cjsKLQljaGFyICpidWY7Ci0JdTE2IGVlcHJvbV92ZXI7Ci0Jc2l6ZV90IGVlcHJvbV9sZW4gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZTsKLQlidWZfc2l6ZSA9IDQgKiBlZXByb21fbGVuICsgMjU2OwotCi0JaWYgKGVlcHJvbV9sZW4gJSAxNikgewotCQlJV0xfRVJSKHByaXYsICJOVk0gc2l6ZSBpcyBub3QgbXVsdGlwbGUgb2YgMTYuXG4iKTsKLQkJcmV0dXJuIC1FTk9EQVRBOwotCX0KLQotCXB0ciA9IHByaXYtPmVlcHJvbTsKLQlpZiAoIXB0cikgewotCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIEVFUFJPTSBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQkvKiA0IGNoYXJhY3RlcnMgZm9yIGJ5dGUgMHhZWSAqLwotCWJ1ZiA9IGt6YWxsb2MoYnVmX3NpemUsIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCWVlcHJvbV92ZXIgPSBpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9WRVJTSU9OKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmX3NpemUgLSBwb3MsICJFRVBST00gIgotCQkJInZlcnNpb246IDB4JXhcbiIsIGVlcHJvbV92ZXIpOwotCWZvciAob2ZzID0gMCA7IG9mcyA8IGVlcHJvbV9sZW4gOyBvZnMgKz0gMTYpIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1Zl9zaXplIC0gcG9zLCAiMHglLjR4ICIsIG9mcyk7Ci0JCWhleF9kdW1wX3RvX2J1ZmZlcihwdHIgKyBvZnMsIDE2ICwgMTYsIDIsIGJ1ZiArIHBvcywKLQkJCQkgICBidWZfc2l6ZSAtIHBvcywgMCk7Ci0JCXBvcyArPSBzdHJsZW4oYnVmICsgcG9zKTsKLQkJaWYgKGJ1Zl9zaXplIC0gcG9zID4gMCkKLQkJCWJ1Zltwb3MrK10gPSAnXG4nOwotCX0KLQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QKLWl3bF9sZWdhY3lfZGJnZnNfY2hhbm5lbHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVscyA9IE5VTEw7Ci0JY29uc3Qgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc3VwcF9iYW5kID0gTlVMTDsKLQlpbnQgcG9zID0gMCwgaSwgYnVmc3ogPSBQQUdFX1NJWkU7Ci0JY2hhciAqYnVmOwotCXNzaXplX3QgcmV0OwotCi0JaWYgKCF0ZXN0X2JpdChTVEFUVVNfR0VPX0NPTkZJR1VSRUQsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0Jc3VwcF9iYW5kID0gaXdsX2dldF9od19tb2RlKHByaXYsIElFRUU4MDIxMV9CQU5EXzJHSFopOwotCWlmIChzdXBwX2JhbmQpIHsKLQkJY2hhbm5lbHMgPSBzdXBwX2JhbmQtPmNoYW5uZWxzOwotCi0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiRGlzcGxheWluZyAlZCBjaGFubmVscyBpbiAyLjRHSHogYmFuZCA4MDIuMTFiZyk6XG4iLAotCQkJCXN1cHBfYmFuZC0+bl9jaGFubmVscyk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHN1cHBfYmFuZC0+bl9jaGFubmVsczsgaSsrKQotCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSIlZDogJWRkQm06IEJTUyVzJXMsICVzLlxuIiwKLQkJCQljaGFubmVsc1tpXS5od192YWx1ZSwKLQkJCQljaGFubmVsc1tpXS5tYXhfcG93ZXIsCi0JCQkJY2hhbm5lbHNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9SQURBUiA/Ci0JCQkJIiAoSUVFRSA4MDIuMTFoIHJlcXVpcmVkKSIgOiAiIiwKLQkJCQkoKGNoYW5uZWxzW2ldLmZsYWdzICYgSUVFRTgwMjExX0NIQU5fTk9fSUJTUykKLQkJCQl8fCAoY2hhbm5lbHNbaV0uZmxhZ3MgJgotCQkJCUlFRUU4MDIxMV9DSEFOX1JBREFSKSkgPyAiIiA6Ci0JCQkJIiwgSUJTUyIsCi0JCQkJY2hhbm5lbHNbaV0uZmxhZ3MgJgotCQkJCUlFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTiA/Ci0JCQkJInBhc3NpdmUgb25seSIgOiAiYWN0aXZlL3Bhc3NpdmUiKTsKLQl9Ci0Jc3VwcF9iYW5kID0gaXdsX2dldF9od19tb2RlKHByaXYsIElFRUU4MDIxMV9CQU5EXzVHSFopOwotCWlmIChzdXBwX2JhbmQpIHsKLQkJY2hhbm5lbHMgPSBzdXBwX2JhbmQtPmNoYW5uZWxzOwotCi0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiRGlzcGxheWluZyAlZCBjaGFubmVscyBpbiA1LjJHSHogYmFuZCAoODAyLjExYSlcbiIsCi0JCQkJc3VwcF9iYW5kLT5uX2NoYW5uZWxzKTsKLQotCQlmb3IgKGkgPSAwOyBpIDwgc3VwcF9iYW5kLT5uX2NoYW5uZWxzOyBpKyspCi0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIiVkOiAlZGRCbTogQlNTJXMlcywgJXMuXG4iLAotCQkJCWNoYW5uZWxzW2ldLmh3X3ZhbHVlLAotCQkJCWNoYW5uZWxzW2ldLm1heF9wb3dlciwKLQkJCQljaGFubmVsc1tpXS5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1JBREFSID8KLQkJCQkiIChJRUVFIDgwMi4xMWggcmVxdWlyZWQpIiA6ICIiLAotCQkJCSgoY2hhbm5lbHNbaV0uZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9OT19JQlNTKQotCQkJCXx8IChjaGFubmVsc1tpXS5mbGFncyAmCi0JCQkJSUVFRTgwMjExX0NIQU5fUkFEQVIpKSA/ICIiIDoKLQkJCQkiLCBJQlNTIiwKLQkJCQljaGFubmVsc1tpXS5mbGFncyAmCi0JCQkJSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOID8KLQkJCQkicGFzc2l2ZSBvbmx5IiA6ICJhY3RpdmUvcGFzc2l2ZSIpOwotCX0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfc3RhdHVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzUxMl07Ci0JaW50IHBvcyA9IDA7Ci0JY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfSENNRF9BQ1RJVkU6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19IQ01EX0FDVElWRSwgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19JTlRfRU5BQkxFRDpcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX0lOVF9FTkFCTEVELCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX1JGX0tJTExfSFc6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX0NUX0tJTEw6XHRcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX0NUX0tJTEwsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfSU5JVDpcdFx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfSU5JVCwgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19BTElWRTpcdFx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfQUxJVkUsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfUkVBRFk6XHRcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX1RFTVBFUkFUVVJFOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfVEVNUEVSQVRVUkUsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfR0VPX0NPTkZJR1VSRUQ6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19FWElUX1BFTkRJTkc6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfU1RBVElTVElDUzpcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX1NUQVRJU1RJQ1MsICZwcml2LT5zdGF0dXMpKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJTVEFUVVNfU0NBTk5JTkc6XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19TQ0FOX0FCT1JUSU5HOlx0ICVkXG4iLAotCQl0ZXN0X2JpdChTVEFUVVNfU0NBTl9BQk9SVElORywgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19TQ0FOX0hXOlx0XHQgJWRcbiIsCi0JCXRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1RBVFVTX1BPV0VSX1BNSTpcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX1BPV0VSX1BNSSwgJnByaXYtPnN0YXR1cykpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlNUQVRVU19GV19FUlJPUjpcdCAlZFxuIiwKLQkJdGVzdF9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSk7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX2ludGVycnVwdF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7Ci0KLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHBvcyA9IDA7Ci0JaW50IGNudCA9IDA7Ci0JY2hhciAqYnVmOwotCWludCBidWZzeiA9IDI0ICogNjQ7IC8qIDI0IGl0ZW1zICogNjQgY2hhciBwZXIgaXRlbSAqLwotCXNzaXplX3QgcmV0OwotCi0JYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJSVdMX0VSUihwcml2LCAiQ2FuIG5vdCBhbGxvY2F0ZSBCdWZmZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiSW50ZXJydXB0IFN0YXRpc3RpY3MgUmVwb3J0OlxuIik7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJIVyBFcnJvcjpcdFx0XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy5odyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiU1cgRXJyb3I6XHRcdFx0ICV1XG4iLAotCQlwcml2LT5pc3Jfc3RhdHMuc3cpOwotCWlmIChwcml2LT5pc3Jfc3RhdHMuc3cgfHwgcHJpdi0+aXNyX3N0YXRzLmh3KSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSJcdExhc3QgUmVzdGFydGluZyBDb2RlOiAgMHglWFxuIiwKLQkJCXByaXYtPmlzcl9zdGF0cy5lcnJfY29kZSk7Ci0JfQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkZyYW1lIHRyYW5zbWl0dGVkOlx0XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy5zY2gpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIkFsaXZlIGludGVycnVwdDpcdFx0ICV1XG4iLAotCQlwcml2LT5pc3Jfc3RhdHMuYWxpdmUpOwotI2VuZGlmCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkiSFcgUkYgS0lMTCBzd2l0Y2ggdG9nZ2xlZDpcdCAldVxuIiwKLQkJcHJpdi0+aXNyX3N0YXRzLnJma2lsbCk7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJDVCBLSUxMOlx0XHRcdCAldVxuIiwKLQkJcHJpdi0+aXNyX3N0YXRzLmN0a2lsbCk7Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJXYWtldXAgSW50ZXJydXB0Olx0XHQgJXVcbiIsCi0JCXByaXYtPmlzcl9zdGF0cy53YWtldXApOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkiUnggY29tbWFuZCByZXNwb25zZXM6XHRcdCAldVxuIiwKLQkJcHJpdi0+aXNyX3N0YXRzLnJ4KTsKLQlmb3IgKGNudCA9IDA7IGNudCA8IFJFUExZX01BWDsgY250KyspIHsKLQkJaWYgKHByaXYtPmlzcl9zdGF0cy5yeF9oYW5kbGVyc1tjbnRdID4gMCkKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiXHRSeCBoYW5kbGVyWyUzNnNdOlx0XHQgJXVcbiIsCi0JCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbnQpLAotCQkJCXByaXYtPmlzcl9zdGF0cy5yeF9oYW5kbGVyc1tjbnRdKTsKLQl9Ci0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJUeC9GSCBpbnRlcnJ1cHQ6XHRcdCAldVxuIiwKLQkJcHJpdi0+aXNyX3N0YXRzLnR4KTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlVuZXhwZWN0ZWQgSU5UQTpcdFx0ICV1XG4iLAotCQlwcml2LT5pc3Jfc3RhdHMudW5oYW5kbGVkKTsKLQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19pbnRlcnJ1cHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbOF07Ci0JaW50IGJ1Zl9zaXplOwotCXUzMiByZXNldF9mbGFnOwotCi0JbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwotCWJ1Zl9zaXplID0gbWluKGNvdW50LCBzaXplb2YoYnVmKSAtICAxKTsKLQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCB1c2VyX2J1ZiwgYnVmX3NpemUpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQlpZiAoc3NjYW5mKGJ1ZiwgIiV4IiwgJnJlc2V0X2ZsYWcpICE9IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChyZXNldF9mbGFnID09IDApCi0JCWl3bF9sZWdhY3lfY2xlYXJfaXNyX3N0YXRzKHByaXYpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdAotaXdsX2xlZ2FjeV9kYmdmc19xb3NfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCSAgICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQlpbnQgcG9zID0gMCwgaTsKLQljaGFyIGJ1ZlsyNTYgKiBOVU1fSVdMX1JYT05fQ1RYXTsKLQljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNvbnRleHQgJWQ6XG4iLAotCQkJCSBjdHgtPmN0eGlkKTsKLQkJZm9yIChpID0gMDsgaSA8IEFDX05VTTsgaSsrKSB7Ci0JCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIlx0Y3dfbWluXHRjd19tYXhcdGFpZnNuXHR0eG9wXG4iKTsKLQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiQUNbJWRdXHQldVx0JXVcdCV1XHQldVxuIiwgaSwKLQkJCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1tpXS5jd19taW4sCi0JCQkJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbaV0uY3dfbWF4LAotCQkJCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW2ldLmFpZnNuLAotCQkJCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW2ldLmVkY2FfdHhvcCk7Ci0JCX0KLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiXG4iKTsKLQl9Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX2Rpc2FibGVfaHQ0MF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1Zls4XTsKLQlpbnQgYnVmX3NpemU7Ci0JaW50IGh0NDA7Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmaHQ0MCkgIT0gMSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKCFpd2xfbGVnYWN5X2lzX2FueV9hc3NvY2lhdGVkKHByaXYpKQotCQlwcml2LT5kaXNhYmxlX2h0NDAgPSBodDQwID8gdHJ1ZSA6IGZhbHNlOwotCWVsc2UgewotCQlJV0xfRVJSKHByaXYsICJTdGEgYXNzb2NpYXRlZCB3aXRoIEFQIC0gIgotCQkJIkNoYW5nZSB0byA0ME1IeiBjaGFubmVsIHN1cHBvcnQgaXMgbm90IGFsbG93ZWRcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfZGlzYWJsZV9odDQwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbMTAwXTsKLQlpbnQgcG9zID0gMDsKLQljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSIxMW4gNDBNSHogTW9kZTogJXNcbiIsCi0JCQlwcml2LT5kaXNhYmxlX2h0NDAgPyAiRGlzYWJsZWQiIDogIkVuYWJsZWQiKTsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci19Ci0KLURFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhzcmFtKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhudm0pOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHN0YXRpb25zKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhjaGFubmVscyk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFMoc3RhdHVzKTsKLURFQlVHRlNfUkVBRF9XUklURV9GSUxFX09QUyhpbnRlcnJ1cHQpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHFvcyk7Ci1ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoZGlzYWJsZV9odDQwKTsKLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc190cmFmZmljX2xvZ19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwLCBvZnMgPSAwOwotCWludCBjbnQgPSAwLCBlbnRyeTsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHE7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcTsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSAoKElXTF9UUkFGRklDX0VOVFJJRVMgKiBJV0xfVFJBRkZJQ19FTlRSWV9TSVpFICogNjQpICogMikgKwotCQkocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyAqIDMyICogOCkgKyA0MDA7Ci0JY29uc3QgdTggKnB0cjsKLQlzc2l6ZV90IHJldDsKLQotCWlmICghcHJpdi0+dHhxKSB7Ci0JCUlXTF9FUlIocHJpdiwgInR4cSBub3QgcmVhZHlcbiIpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0JYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpIHsKLQkJSVdMX0VSUihwcml2LCAiQ2FuIG5vdCBhbGxvY2F0ZSBidWZmZXJcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiVHggUXVldWVcbiIpOwotCWZvciAoY250ID0gMDsgY250IDwgcHJpdi0+aHdfcGFyYW1zLm1heF90eHFfbnVtOyBjbnQrKykgewotCQl0eHEgPSAmcHJpdi0+dHhxW2NudF07Ci0JCXEgPSAmdHhxLT5xOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJInFbJWRdOiByZWFkX3B0cjogJXUsIHdyaXRlX3B0cjogJXVcbiIsCi0JCQkJY250LCBxLT5yZWFkX3B0ciwgcS0+d3JpdGVfcHRyKTsKLQl9Ci0JaWYgKHByaXYtPnR4X3RyYWZmaWMgJiYgKGl3bGVnYWN5X2RlYnVnX2xldmVsICYgSVdMX0RMX1RYKSkgewotCQlwdHIgPSBwcml2LT50eF90cmFmZmljOwotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJIlR4IFRyYWZmaWMgaWR4OiAldVxuIiwJcHJpdi0+dHhfdHJhZmZpY19pZHgpOwotCQlmb3IgKGNudCA9IDAsIG9mcyA9IDA7IGNudCA8IElXTF9UUkFGRklDX0VOVFJJRVM7IGNudCsrKSB7Ci0JCQlmb3IgKGVudHJ5ID0gMDsgZW50cnkgPCBJV0xfVFJBRkZJQ19FTlRSWV9TSVpFIC8gMTY7Ci0JCQkgICAgIGVudHJ5KyssICBvZnMgKz0gMTYpIHsKLQkJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkJCQkiMHglLjR4ICIsIG9mcyk7Ci0JCQkJaGV4X2R1bXBfdG9fYnVmZmVyKHB0ciArIG9mcywgMTYsIDE2LCAyLAotCQkJCQkJICAgYnVmICsgcG9zLCBidWZzeiAtIHBvcywgMCk7Ci0JCQkJcG9zICs9IHN0cmxlbihidWYgKyBwb3MpOwotCQkJCWlmIChidWZzeiAtIHBvcyA+IDApCi0JCQkJCWJ1Zltwb3MrK10gPSAnXG4nOwotCQkJfQotCQl9Ci0JfQotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiUnggUXVldWVcbiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSJyZWFkOiAldSwgd3JpdGU6ICV1XG4iLAotCQkJIHJ4cS0+cmVhZCwgcnhxLT53cml0ZSk7Ci0KLQlpZiAocHJpdi0+cnhfdHJhZmZpYyAmJiAoaXdsZWdhY3lfZGVidWdfbGV2ZWwgJiBJV0xfRExfUlgpKSB7Ci0JCXB0ciA9IHByaXYtPnJ4X3RyYWZmaWM7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiUnggVHJhZmZpYyBpZHg6ICV1XG4iLAlwcml2LT5yeF90cmFmZmljX2lkeCk7Ci0JCWZvciAoY250ID0gMCwgb2ZzID0gMDsgY250IDwgSVdMX1RSQUZGSUNfRU5UUklFUzsgY250KyspIHsKLQkJCWZvciAoZW50cnkgPSAwOyBlbnRyeSA8IElXTF9UUkFGRklDX0VOVFJZX1NJWkUgLyAxNjsKLQkJCSAgICAgZW50cnkrKywgIG9mcyArPSAxNikgewotCQkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkJCSIweCUuNHggIiwgb2ZzKTsKLQkJCQloZXhfZHVtcF90b19idWZmZXIocHRyICsgb2ZzLCAxNiwgMTYsIDIsCi0JCQkJCQkgICBidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAwKTsKLQkJCQlwb3MgKz0gc3RybGVuKGJ1ZiArIHBvcyk7Ci0JCQkJaWYgKGJ1ZnN6IC0gcG9zID4gMCkKLQkJCQkJYnVmW3BvcysrXSA9ICdcbic7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQlrZnJlZShidWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdHJhZmZpY19sb2dfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbOF07Ci0JaW50IGJ1Zl9zaXplOwotCWludCB0cmFmZmljX2xvZzsKLQotCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKLQlidWZfc2l6ZSA9IG1pbihjb3VudCwgc2l6ZW9mKGJ1ZikgLSAgMSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGJ1Zl9zaXplKSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHNzY2FuZihidWYsICIlZCIsICZ0cmFmZmljX2xvZykgIT0gMSkKLQkJcmV0dXJuIC1FRkFVTFQ7Ci0JaWYgKHRyYWZmaWNfbG9nID09IDApCi0JCWl3bF9sZWdhY3lfcmVzZXRfdHJhZmZpY19sb2cocHJpdik7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfdHhfcXVldWVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7Ci0KLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxOwotCXN0cnVjdCBpd2xfcXVldWUgKnE7Ci0JY2hhciAqYnVmOwotCWludCBwb3MgPSAwOwotCWludCBjbnQ7Ci0JaW50IHJldDsKLQljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoY2hhcikgKiA2NCAqCi0JCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKLQotCWlmICghcHJpdi0+dHhxKSB7Ci0JCUlXTF9FUlIocHJpdiwgInR4cSBub3QgcmVhZHlcbiIpOwotCQlyZXR1cm4gLUVBR0FJTjsKLQl9Ci0JYnVmID0ga3phbGxvYyhidWZzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JZm9yIChjbnQgPSAwOyBjbnQgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IGNudCsrKSB7Ci0JCXR4cSA9ICZwcml2LT50eHFbY250XTsKLQkJcSA9ICZ0eHEtPnE7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCQkiaHdxICUuMmQ6IHJlYWQ9JXUgd3JpdGU9JXUgc3RvcD0lZCIKLQkJCQkiIHN3cV9pZD0lIy4yeCAoYWMgJWQvaHdxICVkKVxuIiwKLQkJCQljbnQsIHEtPnJlYWRfcHRyLCBxLT53cml0ZV9wdHIsCi0JCQkJISF0ZXN0X2JpdChjbnQsIHByaXYtPnF1ZXVlX3N0b3BwZWQpLAotCQkJCXR4cS0+c3dxX2lkLCB0eHEtPnN3cV9pZCAmIDMsCi0JCQkJKHR4cS0+c3dxX2lkID4+IDIpICYgMHgxZik7Ci0JCWlmIChjbnQgPj0gNCkKLQkJCWNvbnRpbnVlOwotCQkvKiBmb3IgdGhlIEFDcywgZGlzcGxheSB0aGUgc3RvcCBjb3VudCB0b28gKi8KLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSIgICAgICAgIHN0b3AtY291bnQ6ICVkXG4iLAotCQkJCWF0b21pY19yZWFkKCZwcml2LT5xdWV1ZV9zdG9wX2NvdW50W2NudF0pKTsKLQl9Ci0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3J4X3F1ZXVlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0JY2hhciBidWZbMjU2XTsKLQlpbnQgcG9zID0gMDsKLQljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgInJlYWQ6ICV1XG4iLAotCQkJCQkJcnhxLT5yZWFkKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJ3cml0ZTogJXVcbiIsCi0JCQkJCQlyeHEtPndyaXRlKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJmcmVlX2NvdW50OiAldVxuIiwKLQkJCQkJCXJ4cS0+ZnJlZV9jb3VudCk7Ci0JaWYgKHJ4cS0+cmJfc3R0cykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjbG9zZWRfcmJfbnVtOiAldVxuIiwKLQkJCSBsZTE2X3RvX2NwdShyeHEtPnJiX3N0dHMtPmNsb3NlZF9yYl9udW0pICYgIDB4MEZGRik7Ci0JfSBlbHNlIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCQkiY2xvc2VkX3JiX251bTogTm90IEFsbG9jYXRlZFxuIik7Ci0JfQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc191Y29kZV9yeF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZGVidWdmc19vcHMucnhfc3RhdHNfcmVhZChmaWxlLAotCQkJdXNlcl9idWYsIGNvdW50LCBwcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc191Y29kZV90eF9zdGF0c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlyZXR1cm4gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZGVidWdmc19vcHMudHhfc3RhdHNfcmVhZChmaWxlLAotCQkJdXNlcl9idWYsIGNvdW50LCBwcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc191Y29kZV9nZW5lcmFsX3N0YXRzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCXJldHVybiBwcml2LT5jZmctPm9wcy0+bGliLT5kZWJ1Z2ZzX29wcy5nZW5lcmFsX3N0YXRzX3JlYWQoZmlsZSwKLQkJCXVzZXJfYnVmLCBjb3VudCwgcHBvcyk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfc2Vuc2l0aXZpdHlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWludCBjbnQgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhKSAqIDQgKyAxMDA7Ci0Jc3NpemVfdCByZXQ7Ci0Jc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhICpkYXRhOwotCi0JZGF0YSA9ICZwcml2LT5zZW5zaXRpdml0eV9kYXRhOwotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYXV0b19jb3JyX29mZG06XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+YXV0b19jb3JyX29mZG0pOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSJhdXRvX2NvcnJfb2ZkbV9tcmM6XHRcdCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9vZmRtX21yYyk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYXV0b19jb3JyX29mZG1feDE6XHRcdCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9vZmRtX3gxKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiYXV0b19jb3JyX29mZG1fbXJjX3gxOlx0XHQgJXVcbiIsCi0JCQlkYXRhLT5hdXRvX2NvcnJfb2ZkbV9tcmNfeDEpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImF1dG9fY29ycl9jY2s6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+YXV0b19jb3JyX2Njayk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYXV0b19jb3JyX2Nja19tcmM6XHRcdCAldVxuIiwKLQkJCWRhdGEtPmF1dG9fY29ycl9jY2tfbXJjKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkibGFzdF9iYWRfcGxjcF9jbnRfb2ZkbTpcdFx0ICV1XG4iLAotCQkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfb2ZkbSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibGFzdF9mYV9jbnRfb2ZkbTpcdFx0ICV1XG4iLAotCQkJZGF0YS0+bGFzdF9mYV9jbnRfb2ZkbSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJImxhc3RfYmFkX3BsY3BfY250X2NjazpcdFx0ICV1XG4iLAotCQkJZGF0YS0+bGFzdF9iYWRfcGxjcF9jbnRfY2NrKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJsYXN0X2ZhX2NudF9jY2s6XHRcdCAldVxuIiwKLQkJCWRhdGEtPmxhc3RfZmFfY250X2Njayk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX2N1cnJfc3RhdGU6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+bnJnX2N1cnJfc3RhdGUpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19wcmV2X3N0YXRlOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPm5yZ19wcmV2X3N0YXRlKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfdmFsdWU6XHRcdFx0Iik7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCAxMDsgY250KyspIHsKLQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiICV1IiwKLQkJCQlkYXRhLT5ucmdfdmFsdWVbY250XSk7Ci0JfQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3NpbGVuY2VfcnNzaTpcdFx0Iik7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCBOUkdfTlVNX1BSRVZfU1RBVF9MOyBjbnQrKykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIgJXUiLAotCQkJCWRhdGEtPm5yZ19zaWxlbmNlX3Jzc2lbY250XSk7Ci0JfQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3NpbGVuY2VfcmVmOlx0XHQgJXVcbiIsCi0JCQlkYXRhLT5ucmdfc2lsZW5jZV9yZWYpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIm5yZ19lbmVyZ3lfaWR4Olx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPm5yZ19lbmVyZ3lfaWR4KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJucmdfc2lsZW5jZV9pZHg6XHRcdCAldVxuIiwKLQkJCWRhdGEtPm5yZ19zaWxlbmNlX2lkeCk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3RoX2NjazpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5ucmdfdGhfY2NrKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkibnJnX2F1dG9fY29ycl9zaWxlbmNlX2RpZmY6XHQgJXVcbiIsCi0JCQlkYXRhLT5ucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnVtX2luX2Nja19ub19mYTpcdFx0ICV1XG4iLAotCQkJZGF0YS0+bnVtX2luX2Nja19ub19mYSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAibnJnX3RoX29mZG06XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+bnJnX3RoX29mZG0pOwotCi0JcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHBvcyk7Ci0Ja2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfY2hhaW5fbm9pc2VfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWludCBjbnQgPSAwOwotCWNoYXIgKmJ1ZjsKLQlpbnQgYnVmc3ogPSBzaXplb2Yoc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhKSAqIDQgKyAxMDA7Ci0Jc3NpemVfdCByZXQ7Ci0Jc3RydWN0IGl3bF9jaGFpbl9ub2lzZV9kYXRhICpkYXRhOwotCi0JZGF0YSA9ICZwcml2LT5jaGFpbl9ub2lzZV9kYXRhOwotCWJ1ZiA9IGt6YWxsb2MoYnVmc3osIEdGUF9LRVJORUwpOwotCWlmICghYnVmKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiYWN0aXZlX2NoYWluczpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5hY3RpdmVfY2hhaW5zKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9ub2lzZV9hOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmNoYWluX25vaXNlX2EpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX25vaXNlX2I6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+Y2hhaW5fbm9pc2VfYik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2hhaW5fbm9pc2VfYzpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5jaGFpbl9ub2lzZV9jKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJjaGFpbl9zaWduYWxfYTpcdFx0XHQgJXVcbiIsCi0JCQlkYXRhLT5jaGFpbl9zaWduYWxfYSk7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiY2hhaW5fc2lnbmFsX2I6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+Y2hhaW5fc2lnbmFsX2IpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImNoYWluX3NpZ25hbF9jOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPmNoYWluX3NpZ25hbF9jKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJiZWFjb25fY291bnQ6XHRcdFx0ICV1XG4iLAotCQkJZGF0YS0+YmVhY29uX2NvdW50KTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgImRpc2Nvbm5fYXJyYXk6XHRcdFx0Iik7Ci0JZm9yIChjbnQgPSAwOyBjbnQgPCBOVU1fUlhfQ0hBSU5TOyBjbnQrKykgewotCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIgJXUiLAotCQkJCWRhdGEtPmRpc2Nvbm5fYXJyYXlbY250XSk7Ci0JfQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIlxuIik7Ci0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiZGVsdGFfZ2Fpbl9jb2RlOlx0XHQiKTsKLQlmb3IgKGNudCA9IDA7IGNudCA8IE5VTV9SWF9DSEFJTlM7IGNudCsrKSB7Ci0JCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiAldSIsCi0JCQkJZGF0YS0+ZGVsdGFfZ2Fpbl9jb2RlW2NudF0pOwotCX0KLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJcbiIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgInJhZGlvX3dyaXRlOlx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPnJhZGlvX3dyaXRlKTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJzdGF0ZTpcdFx0XHRcdCAldVxuIiwKLQkJCWRhdGEtPnN0YXRlKTsKLQotCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotCWtmcmVlKGJ1Zik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19wb3dlcl9zYXZlX3N0YXR1c19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkJICAgIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbNjBdOwotCWludCBwb3MgPSAwOwotCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOwotCXUzMiBwd3JzYXZlX3N0YXR1czsKLQotCXB3cnNhdmVfc3RhdHVzID0gaXdsX3JlYWQzMihwcml2LCBDU1JfR1BfQ05UUkwpICYKLQkJCUNTUl9HUF9SRUdfUE9XRVJfU0FWRV9TVEFUVVNfTVNLOwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLCAiUG93ZXIgU2F2ZSBTdGF0dXM6ICIpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVzXG4iLAotCQkocHdyc2F2ZV9zdGF0dXMgPT0gQ1NSX0dQX1JFR19OT19QT1dFUl9TQVZFKSA/ICJub25lIiA6Ci0JCShwd3JzYXZlX3N0YXR1cyA9PSBDU1JfR1BfUkVHX01BQ19QT1dFUl9TQVZFKSA/ICJNQUMiIDoKLQkJKHB3cnNhdmVfc3RhdHVzID09IENTUl9HUF9SRUdfUEhZX1BPV0VSX1NBVkUpID8gIlBIWSIgOgotCQkiZXJyb3IiKTsKLQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19jbGVhcl91Y29kZV9zdGF0aXN0aWNzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWNoYXIgYnVmWzhdOwotCWludCBidWZfc2l6ZTsKLQlpbnQgY2xlYXI7Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmY2xlYXIpICE9IDEpCi0JCXJldHVybiAtRUZBVUxUOwotCi0JLyogbWFrZSByZXF1ZXN0IHRvIHVDb2RlIHRvIHJldHJpZXZlIHN0YXRpc3RpY3MgaW5mb3JtYXRpb24gKi8KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXdsX2xlZ2FjeV9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChwcml2LCBDTURfU1lOQywgdHJ1ZSk7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlyZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfcnhvbl9mbGFnc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQlpbnQgbGVuID0gMDsKLQljaGFyIGJ1ZlsyMF07Ci0KLQlsZW4gPSBzcHJpbnRmKGJ1ZiwgIjB4JTA0WFxuIiwKLQkJbGUzMl90b19jcHUocHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWN0aXZlLmZsYWdzKSk7Ci0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3J4b25fZmlsdGVyX2ZsYWdzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBsZW4gPSAwOwotCWNoYXIgYnVmWzIwXTsKLQotCWxlbiA9IHNwcmludGYoYnVmLCAiMHglMDRYXG4iLAotCWxlMzJfdG9fY3B1KHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5maWx0ZXJfZmxhZ3MpKTsKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIGxlbik7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bF9sZWdhY3lfZGJnZnNfZmhfcmVnX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciAqYnVmOwotCWludCBwb3MgPSAwOwotCXNzaXplX3QgcmV0ID0gLUVGQVVMVDsKLQotCWlmIChwcml2LT5jZmctPm9wcy0+bGliLT5kdW1wX2ZoKSB7Ci0JCXJldCA9IHBvcyA9IHByaXYtPmNmZy0+b3BzLT5saWItPmR1bXBfZmgocHJpdiwgJmJ1ZiwgdHJ1ZSk7Ci0JCWlmIChidWYpIHsKLQkJCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLAotCQkJCQkJICAgICAgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLQkJCWtmcmVlKGJ1Zik7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX21pc3NlZF9iZWFjb25fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCWludCBwb3MgPSAwOwotCWNoYXIgYnVmWzEyXTsKLQljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKLQotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywgIiVkXG4iLAotCQkJcHJpdi0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQpOwotCi0JcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBwb3MpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX21pc3NlZF9iZWFjb25fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbOF07Ci0JaW50IGJ1Zl9zaXplOwotCWludCBtaXNzZWQ7Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmbWlzc2VkKSAhPSAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChtaXNzZWQgPCBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfTUlOIHx8Ci0JICAgIG1pc3NlZCA+IElXTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9NQVgpCi0JCXByaXYtPm1pc3NlZF9iZWFjb25fdGhyZXNob2xkID0KLQkJCUlXTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUY7Ci0JZWxzZQotCQlwcml2LT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCA9IG1pc3NlZDsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19mb3JjZV9yZXNldF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQljaGFyIF9fdXNlciAqdXNlcl9idWYsCi0JCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKSB7Ci0KLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JaW50IHBvcyA9IDA7Ci0JY2hhciBidWZbMzAwXTsKLQljb25zdCBzaXplX3QgYnVmc3ogPSBzaXplb2YoYnVmKTsKLQlzdHJ1Y3QgaXdsX2ZvcmNlX3Jlc2V0ICpmb3JjZV9yZXNldDsKLQotCWZvcmNlX3Jlc2V0ID0gJnByaXYtPmZvcmNlX3Jlc2V0OwotCi0JcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJIlx0bnVtYmVyIG9mIHJlc2V0IHJlcXVlc3Q6ICVkXG4iLAotCQkJZm9yY2VfcmVzZXQtPnJlc2V0X3JlcXVlc3RfY291bnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSJcdG51bWJlciBvZiByZXNldCByZXF1ZXN0IHN1Y2Nlc3M6ICVkXG4iLAotCQkJZm9yY2VfcmVzZXQtPnJlc2V0X3N1Y2Nlc3NfY291bnQpOwotCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKLQkJCSJcdG51bWJlciBvZiByZXNldCByZXF1ZXN0IHJlamVjdDogJWRcbiIsCi0JCQlmb3JjZV9yZXNldC0+cmVzZXRfcmVqZWN0X2NvdW50KTsKLQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCi0JCQkiXHRyZXNldCBkdXJhdGlvbjogJWx1XG4iLAotCQkJZm9yY2VfcmVzZXQtPnJlc2V0X2R1cmF0aW9uKTsKLQotCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsX2xlZ2FjeV9kYmdmc19mb3JjZV9yZXNldF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykgewotCi0JaW50IHJldDsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X2ZvcmNlX3Jlc2V0KHByaXYsIHRydWUpOwotCi0JcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2xfbGVnYWN5X2RiZ2ZzX3dkX3RpbWVvdXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCWNvbnN0IGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpIHsKLQotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1Zls4XTsKLQlpbnQgYnVmX3NpemU7Ci0JaW50IHRpbWVvdXQ7Ci0KLQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7Ci0JYnVmX3NpemUgPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gIDEpOwotCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJfYnVmLCBidWZfc2l6ZSkpCi0JCXJldHVybiAtRUZBVUxUOwotCWlmIChzc2NhbmYoYnVmLCAiJWQiLCAmdGltZW91dCkgIT0gMSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKHRpbWVvdXQgPCAwIHx8IHRpbWVvdXQgPiBJV0xfTUFYX1dEX1RJTUVPVVQpCi0JCXRpbWVvdXQgPSBJV0xfREVGX1dEX1RJTUVPVVQ7Ci0KLQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT53ZF90aW1lb3V0ID0gdGltZW91dDsKLQlpd2xfbGVnYWN5X3NldHVwX3dhdGNoZG9nKHByaXYpOwotCXJldHVybiBjb3VudDsKLX0KLQotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4X3N0YXRpc3RpY3MpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHR4X3N0YXRpc3RpY3MpOwotREVCVUdGU19SRUFEX1dSSVRFX0ZJTEVfT1BTKHRyYWZmaWNfbG9nKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhyeF9xdWV1ZSk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFModHhfcXVldWUpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHVjb2RlX3J4X3N0YXRzKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyh1Y29kZV90eF9zdGF0cyk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFModWNvZGVfZ2VuZXJhbF9zdGF0cyk7Ci1ERUJVR0ZTX1JFQURfRklMRV9PUFMoc2Vuc2l0aXZpdHkpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKGNoYWluX25vaXNlKTsKLURFQlVHRlNfUkVBRF9GSUxFX09QUyhwb3dlcl9zYXZlX3N0YXR1cyk7Ci1ERUJVR0ZTX1dSSVRFX0ZJTEVfT1BTKGNsZWFyX3Vjb2RlX3N0YXRpc3RpY3MpOwotREVCVUdGU19XUklURV9GSUxFX09QUyhjbGVhcl90cmFmZmljX3N0YXRpc3RpY3MpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKGZoX3JlZyk7Ci1ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMobWlzc2VkX2JlYWNvbik7Ci1ERUJVR0ZTX1JFQURfV1JJVEVfRklMRV9PUFMoZm9yY2VfcmVzZXQpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4b25fZmxhZ3MpOwotREVCVUdGU19SRUFEX0ZJTEVfT1BTKHJ4b25fZmlsdGVyX2ZsYWdzKTsKLURFQlVHRlNfV1JJVEVfRklMRV9PUFMod2RfdGltZW91dCk7Ci0KLS8qCi0gKiBDcmVhdGUgdGhlIGRlYnVnZnMgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCi0gKgotICovCi1pbnQgaXdsX2xlZ2FjeV9kYmdmc19yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNvbnN0IGNoYXIgKm5hbWUpCi17Ci0Jc3RydWN0IGRlbnRyeSAqcGh5ZCA9IHByaXYtPmh3LT53aXBoeS0+ZGVidWdmc2RpcjsKLQlzdHJ1Y3QgZGVudHJ5ICpkaXJfZHJ2LCAqZGlyX2RhdGEsICpkaXJfcmYsICpkaXJfZGVidWc7Ci0KLQlkaXJfZHJ2ID0gZGVidWdmc19jcmVhdGVfZGlyKG5hbWUsIHBoeWQpOwotCWlmICghZGlyX2RydikKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwcml2LT5kZWJ1Z2ZzX2RpciA9IGRpcl9kcnY7Ci0KLQlkaXJfZGF0YSA9IGRlYnVnZnNfY3JlYXRlX2RpcigiZGF0YSIsIGRpcl9kcnYpOwotCWlmICghZGlyX2RhdGEpCi0JCWdvdG8gZXJyOwotCWRpcl9yZiA9IGRlYnVnZnNfY3JlYXRlX2RpcigicmYiLCBkaXJfZHJ2KTsKLQlpZiAoIWRpcl9yZikKLQkJZ290byBlcnI7Ci0JZGlyX2RlYnVnID0gZGVidWdmc19jcmVhdGVfZGlyKCJkZWJ1ZyIsIGRpcl9kcnYpOwotCWlmICghZGlyX2RlYnVnKQotCQlnb3RvIGVycjsKLQotCURFQlVHRlNfQUREX0ZJTEUobnZtLCBkaXJfZGF0YSwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRShzcmFtLCBkaXJfZGF0YSwgU19JV1VTUiB8IFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUoc3RhdGlvbnMsIGRpcl9kYXRhLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKGNoYW5uZWxzLCBkaXJfZGF0YSwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRShzdGF0dXMsIGRpcl9kYXRhLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKGludGVycnVwdCwgZGlyX2RhdGEsIFNfSVdVU1IgfCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHFvcywgZGlyX2RhdGEsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUoZGlzYWJsZV9odDQwLCBkaXJfZGF0YSwgU19JV1VTUiB8IFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUocnhfc3RhdGlzdGljcywgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHR4X3N0YXRpc3RpY3MsIGRpcl9kZWJ1ZywgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRSh0cmFmZmljX2xvZywgZGlyX2RlYnVnLCBTX0lXVVNSIHwgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRShyeF9xdWV1ZSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHR4X3F1ZXVlLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUocG93ZXJfc2F2ZV9zdGF0dXMsIGRpcl9kZWJ1ZywgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRShjbGVhcl91Y29kZV9zdGF0aXN0aWNzLCBkaXJfZGVidWcsIFNfSVdVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUoY2xlYXJfdHJhZmZpY19zdGF0aXN0aWNzLCBkaXJfZGVidWcsIFNfSVdVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUoZmhfcmVnLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUobWlzc2VkX2JlYWNvbiwgZGlyX2RlYnVnLCBTX0lXVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKGZvcmNlX3Jlc2V0LCBkaXJfZGVidWcsIFNfSVdVU1IgfCBTX0lSVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHVjb2RlX3J4X3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUodWNvZGVfdHhfc3RhdHMsIGRpcl9kZWJ1ZywgU19JUlVTUik7Ci0JREVCVUdGU19BRERfRklMRSh1Y29kZV9nZW5lcmFsX3N0YXRzLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCi0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnNlbnNpdGl2aXR5X2NhbGliX2J5X2RyaXZlcikKLQkJREVCVUdGU19BRERfRklMRShzZW5zaXRpdml0eSwgZGlyX2RlYnVnLCBTX0lSVVNSKTsKLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2VfY2FsaWJfYnlfZHJpdmVyKQotCQlERUJVR0ZTX0FERF9GSUxFKGNoYWluX25vaXNlLCBkaXJfZGVidWcsIFNfSVJVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUocnhvbl9mbGFncywgZGlyX2RlYnVnLCBTX0lXVVNSKTsKLQlERUJVR0ZTX0FERF9GSUxFKHJ4b25fZmlsdGVyX2ZsYWdzLCBkaXJfZGVidWcsIFNfSVdVU1IpOwotCURFQlVHRlNfQUREX0ZJTEUod2RfdGltZW91dCwgZGlyX2RlYnVnLCBTX0lXVVNSKTsKLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2Vuc2l0aXZpdHlfY2FsaWJfYnlfZHJpdmVyKQotCQlERUJVR0ZTX0FERF9CT09MKGRpc2FibGVfc2Vuc2l0aXZpdHksIGRpcl9yZiwKLQkJCQkgJnByaXYtPmRpc2FibGVfc2Vuc19jYWwpOwotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5jaGFpbl9ub2lzZV9jYWxpYl9ieV9kcml2ZXIpCi0JCURFQlVHRlNfQUREX0JPT0woZGlzYWJsZV9jaGFpbl9ub2lzZSwgZGlyX3JmLAotCQkJCSAmcHJpdi0+ZGlzYWJsZV9jaGFpbl9ub2lzZV9jYWwpOwotCURFQlVHRlNfQUREX0JPT0woZGlzYWJsZV90eF9wb3dlciwgZGlyX3JmLAotCQkJCSZwcml2LT5kaXNhYmxlX3R4X3Bvd2VyX2NhbCk7Ci0JcmV0dXJuIDA7Ci0KLWVycjoKLQlJV0xfRVJSKHByaXYsICJDYW4ndCBjcmVhdGUgdGhlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKLQlpd2xfbGVnYWN5X2RiZ2ZzX3VucmVnaXN0ZXIocHJpdik7Ci0JcmV0dXJuIC1FTk9NRU07Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZGJnZnNfcmVnaXN0ZXIpOwotCi0vKioKLSAqIFJlbW92ZSB0aGUgZGVidWdmcyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKLSAqCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV9kYmdmc191bnJlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpZiAoIXByaXYtPmRlYnVnZnNfZGlyKQotCQlyZXR1cm47Ci0KLQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUocHJpdi0+ZGVidWdmc19kaXIpOwotCXByaXYtPmRlYnVnZnNfZGlyID0gTlVMTDsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9kYmdmc191bnJlZ2lzdGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM3ODZlZC4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFBsZWFzZSB1c2UgdGhpcyBmaWxlIChpd2wtZGV2LmgpIGZvciBkcml2ZXIgaW1wbGVtZW50YXRpb24gZGVmaW5pdGlvbnMuCi0gKiBQbGVhc2UgdXNlIGl3bC1jb21tYW5kcy5oIGZvciB1Q29kZSBBUEkgZGVmaW5pdGlvbnMuCi0gKiBQbGVhc2UgdXNlIGl3bC00OTY1LWh3LmggZm9yIGhhcmR3YXJlLXJlbGF0ZWQgZGVmaW5pdGlvbnMuCi0gKi8KLQotI2lmbmRlZiBfX2l3bF9sZWdhY3lfZGV2X2hfXwotI2RlZmluZSBfX2l3bF9sZWdhY3lfZGV2X2hfXwotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+IC8qIGZvciBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2xlZHMuaD4KLSNpbmNsdWRlIDxsaW51eC93YWl0Lmg+Ci0jaW5jbHVkZSA8bmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oPgotCi0jaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgotI2luY2x1ZGUgIml3bC1jc3IuaCIKLSNpbmNsdWRlICJpd2wtcHJwaC5oIgotI2luY2x1ZGUgIml3bC1maC5oIgotI2luY2x1ZGUgIml3bC1kZWJ1Zy5oIgotI2luY2x1ZGUgIml3bC00OTY1LWh3LmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUtaHcuaCIKLSNpbmNsdWRlICJpd2wtbGVkLmgiCi0jaW5jbHVkZSAiaXdsLXBvd2VyLmgiCi0jaW5jbHVkZSAiaXdsLWxlZ2FjeS1ycy5oIgotCi1zdHJ1Y3QgaXdsX3R4X3F1ZXVlOwotCi0vKiBDVC1LSUxMIGNvbnN0YW50cyAqLwotI2RlZmluZSBDVF9LSUxMX1RIUkVTSE9MRF9MRUdBQ1kgICAxMTAgLyogaW4gQ2Vsc2l1cyAqLwotCi0vKiBEZWZhdWx0IG5vaXNlIGxldmVsIHRvIHJlcG9ydCB3aGVuIG5vaXNlIG1lYXN1cmVtZW50IGlzIG5vdCBhdmFpbGFibGUuCi0gKiAgIFRoaXMgbWF5IGJlIGJlY2F1c2Ugd2UncmU6Ci0gKiAgIDEpICBOb3QgYXNzb2NpYXRlZCAoNDk2NSwgbm8gYmVhY29uIHN0YXRpc3RpY3MgYmVpbmcgc2VudCB0byBkcml2ZXIpCi0gKiAgIDIpICBTY2FubmluZyAobm9pc2UgbWVhc3VyZW1lbnQgZG9lcyBub3QgYXBwbHkgdG8gYXNzb2NpYXRlZCBjaGFubmVsKQotICogICAzKSAgUmVjZWl2aW5nIENDSyAoMzk0NSBkZWxpdmVycyBub2lzZSBpbmZvIG9ubHkgZm9yIE9GRE0gZnJhbWVzKQotICogVXNlIGRlZmF1bHQgbm9pc2UgdmFsdWUgb2YgLTEyNyAuLi4gdGhpcyBpcyBiZWxvdyB0aGUgcmFuZ2Ugb2YgbWVhc3VyYWJsZQotICogICBSeCBkQm0gZm9yIGVpdGhlciAzOTQ1IG9yIDQ5NjUsIHNvIGl0IGNhbiBpbmRpY2F0ZSAidW5tZWFzdXJhYmxlIiB0byB1c2VyLgotICogICBBbHNvLCAtMTI3IHdvcmtzIGJldHRlciB0aGFuIDAgd2hlbiBhdmVyYWdpbmcgZnJhbWVzIHdpdGgvd2l0aG91dAotICogICBub2lzZSBpbmZvIChlLmcuIGF2ZXJhZ2luZyBtaWdodCBiZSBkb25lIGluIGFwcCk7IG1lYXN1cmVkIGRCbSB2YWx1ZXMgYXJlCi0gKiAgIGFsd2F5cyBuZWdhdGl2ZSAuLi4gdXNpbmcgYSBuZWdhdGl2ZSB2YWx1ZSBhcyB0aGUgZGVmYXVsdCBrZWVwcyBhbGwKLSAqICAgYXZlcmFnZXMgd2l0aGluIGFuIHM4J3MgKHVzZWQgaW4gc29tZSBhcHBzKSByYW5nZSBvZiBuZWdhdGl2ZSB2YWx1ZXMuICovCi0jZGVmaW5lIElXTF9OT0lTRV9NRUFTX05PVF9BVkFJTEFCTEUgKC0xMjcpCi0KLS8qCi0gKiBSVFMgdGhyZXNob2xkIGhlcmUgaXMgdG90YWwgc2l6ZSBbMjM0N10gbWludXMgNCBGQ1MgYnl0ZXMKLSAqIFBlciBzcGVjOgotICogICBhIHZhbHVlIG9mIDAgbWVhbnMgUlRTIG9uIGFsbCBkYXRhL21hbmFnZW1lbnQgcGFja2V0cwotICogICBhIHZhbHVlID4gbWF4IE1TRFUgc2l6ZSBtZWFucyBubyBSVFMKLSAqIGVsc2UgUlRTIGZvciBkYXRhL21hbmFnZW1lbnQgZnJhbWVzIHdoZXJlIE1QRFUgaXMgbGFyZ2VyCi0gKiAgIHRoYW4gUlRTIHZhbHVlLgotICovCi0jZGVmaW5lIERFRkFVTFRfUlRTX1RIUkVTSE9MRCAgICAgMjM0N1UKLSNkZWZpbmUgTUlOX1JUU19USFJFU0hPTEQgICAgICAgICAwVQotI2RlZmluZSBNQVhfUlRTX1RIUkVTSE9MRCAgICAgICAgIDIzNDdVCi0jZGVmaW5lIE1BWF9NU0RVX1NJWkUJCSAgMjMwNFUKLSNkZWZpbmUgTUFYX01QRFVfU0laRQkJICAyMzQ2VQotI2RlZmluZSBERUZBVUxUX0JFQUNPTl9JTlRFUlZBTCAgIDEwMFUKLSNkZWZpbmUJREVGQVVMVF9TSE9SVF9SRVRSWV9MSU1JVCA3VQotI2RlZmluZQlERUZBVUxUX0xPTkdfUkVUUllfTElNSVQgIDRVCi0KLXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciB7Ci0JZG1hX2FkZHJfdCBwYWdlX2RtYTsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci19OwotCi0jZGVmaW5lIHJ4Yl9hZGRyKHIpIHBhZ2VfYWRkcmVzcyhyLT5wYWdlKQotCi0vKiBkZWZpbmVkIGJlbG93ICovCi1zdHJ1Y3QgaXdsX2RldmljZV9jbWQ7Ci0KLXN0cnVjdCBpd2xfY21kX21ldGEgewotCS8qIG9ubHkgZm9yIFNZTkMgY29tbWFuZHMsIGlmZiB0aGUgcmVwbHkgc2tiIGlzIHdhbnRlZCAqLwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgKnNvdXJjZTsKLQkvKgotCSAqIG9ubHkgZm9yIEFTWU5DIGNvbW1hbmRzCi0JICogKHdoaWNoIGlzIHNvbWV3aGF0IHN0dXBpZCAtLSBsb29rIGF0IGl3bC1zdGEuYyBmb3IgaW5zdGFuY2UKLQkgKiB3aGljaCBkdXBsaWNhdGVzIGEgYnVuY2ggb2YgY29kZSBiZWNhdXNlIHRoZSBjYWxsYmFjayBpc24ndAotCSAqIGludm9rZWQgZm9yIFNZTkMgY29tbWFuZHMsIGlmIGl0IHdlcmUgYW5kIGl0cyByZXN1bHQgcGFzc2VkCi0JICogdGhyb3VnaCBpdCB3b3VsZCBiZSBzaW1wbGVyLi4uKQotCSAqLwotCXZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kLAotCQkJIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QpOwotCi0JLyogVGhlIENNRF9TSVpFX0hVR0UgZmxhZyBiaXQgaW5kaWNhdGVzIHRoYXQgdGhlIGNvbW1hbmQKLQkgKiBzdHJ1Y3R1cmUgaXMgc3RvcmVkIGF0IHRoZSBlbmQgb2YgdGhlIHNoYXJlZCBxdWV1ZSBtZW1vcnkuICovCi0JdTMyIGZsYWdzOwotCi0JREVGSU5FX0RNQV9VTk1BUF9BRERSKG1hcHBpbmcpOwotCURFRklORV9ETUFfVU5NQVBfTEVOKGxlbik7Ci19OwotCi0vKgotICogR2VuZXJpYyBxdWV1ZSBzdHJ1Y3R1cmUKLSAqCi0gKiBDb250YWlucyBjb21tb24gZGF0YSBmb3IgUnggYW5kIFR4IHF1ZXVlcwotICovCi1zdHJ1Y3QgaXdsX3F1ZXVlIHsKLQlpbnQgbl9iZDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBCRHMgaW4gdGhpcyBxdWV1ZSAqLwotCWludCB3cml0ZV9wdHI7ICAgICAgIC8qIDEtc3QgZW1wdHkgZW50cnkgKGluZGV4KSBob3N0X3cqLwotCWludCByZWFkX3B0cjsgICAgICAgICAvKiBsYXN0IHVzZWQgZW50cnkgKGluZGV4KSBob3N0X3IqLwotCS8qIHVzZSBmb3IgbW9uaXRvcmluZyBhbmQgcmVjb3ZlcmluZyB0aGUgc3R1Y2sgcXVldWUgKi8KLQlkbWFfYWRkcl90IGRtYV9hZGRyOyAgIC8qIHBoeXNpY2FsIGFkZHIgZm9yIEJEJ3MgKi8KLQlpbnQgbl93aW5kb3c7CSAgICAgICAvKiBzYWZlIHF1ZXVlIHdpbmRvdyAqLwotCXUzMiBpZDsKLQlpbnQgbG93X21hcms7CSAgICAgICAvKiBsb3cgd2F0ZXJtYXJrLCByZXN1bWUgcXVldWUgaWYgZnJlZQotCQkJCSogc3BhY2UgbW9yZSB0aGFuIHRoaXMgKi8KLQlpbnQgaGlnaF9tYXJrOyAgICAgICAgIC8qIGhpZ2ggd2F0ZXJtYXJrLCBzdG9wIHF1ZXVlIGlmIGZyZWUKLQkJCQkqIHNwYWNlIGxlc3MgdGhhbiB0aGlzICovCi19OwotCi0vKiBPbmUgZm9yIGVhY2ggVEZEICovCi1zdHJ1Y3QgaXdsX3R4X2luZm8gewotCXN0cnVjdCBza19idWZmICpza2I7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLX07Ci0KLS8qKgotICogc3RydWN0IGl3bF90eF9xdWV1ZSAtIFR4IFF1ZXVlIGZvciBETUEKLSAqIEBxOiBnZW5lcmljIFJ4L1R4IHF1ZXVlIGRlc2NyaXB0b3IKLSAqIEBiZDogYmFzZSBvZiBjaXJjdWxhciBidWZmZXIgb2YgVEZEcwotICogQGNtZDogYXJyYXkgb2YgY29tbWFuZC9UWCBidWZmZXIgcG9pbnRlcnMKLSAqIEBtZXRhOiBhcnJheSBvZiBtZXRhIGRhdGEgZm9yIGVhY2ggY29tbWFuZC90eCBidWZmZXIKLSAqIEBkbWFfYWRkcl9jbWQ6IHBoeXNpY2FsIGFkZHJlc3Mgb2YgY21kL3R4IGJ1ZmZlciBhcnJheQotICogQHR4YjogYXJyYXkgb2YgcGVyLVRGRCBkcml2ZXIgZGF0YQotICogQHRpbWVfc3RhbXA6IHRpbWUgKGluIGppZmZpZXMpIG9mIGxhc3QgcmVhZF9wdHIgY2hhbmdlCi0gKiBAbmVlZF91cGRhdGU6IGluZGljYXRlcyBuZWVkIHRvIHVwZGF0ZSByZWFkL3dyaXRlIGluZGV4Ci0gKiBAc2NoZWRfcmV0cnk6IGluZGljYXRlcyBxdWV1ZSBpcyBoaWdoLXRocm91Z2hwdXQgYWdncmVnYXRpb24gKEhUIEFHRykgZW5hYmxlZAotICoKLSAqIEEgVHggcXVldWUgY29uc2lzdHMgb2YgY2lyY3VsYXIgYnVmZmVyIG9mIEJEcyAoYS5rLmEuIFRGRHMsIHRyYW5zbWl0IGZyYW1lCi0gKiBkZXNjcmlwdG9ycykgYW5kIHJlcXVpcmVkIGxvY2tpbmcgc3RydWN0dXJlcy4KLSAqLwotI2RlZmluZSBURkRfVFhfQ01EX1NMT1RTIDI1NgotI2RlZmluZSBURkRfQ01EX1NMT1RTIDMyCi0KLXN0cnVjdCBpd2xfdHhfcXVldWUgewotCXN0cnVjdCBpd2xfcXVldWUgcTsKLQl2b2lkICp0ZmRzOwotCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqKmNtZDsKLQlzdHJ1Y3QgaXdsX2NtZF9tZXRhICptZXRhOwotCXN0cnVjdCBpd2xfdHhfaW5mbyAqdHhiOwotCXVuc2lnbmVkIGxvbmcgdGltZV9zdGFtcDsKLQl1OCBuZWVkX3VwZGF0ZTsKLQl1OCBzY2hlZF9yZXRyeTsKLQl1OCBhY3RpdmU7Ci0JdTggc3dxX2lkOwotfTsKLQotI2RlZmluZSBJV0xfTlVNX1NDQU5fUkFURVMgICAgICAgICAoMikKLQotc3RydWN0IGl3bDQ5NjVfY2hhbm5lbF90Z2RfaW5mbyB7Ci0JdTggdHlwZTsKLQlzOCBtYXhfcG93ZXI7Ci19OwotCi1zdHJ1Y3QgaXdsNDk2NV9jaGFubmVsX3RnaF9pbmZvIHsKLQlzNjQgbGFzdF9yYWRhcl90aW1lOwotfTsKLQotI2RlZmluZSBJV0w0OTY1X01BWF9SQVRFICgzMykKLQotc3RydWN0IGl3bDM5NDVfY2xpcF9ncm91cCB7Ci0JLyogbWF4aW11bSBwb3dlciBsZXZlbCB0byBwcmV2ZW50IGNsaXBwaW5nIGZvciBlYWNoIHJhdGUsIGRlcml2ZWQgYnkKLQkgKiAgIHVzIGZyb20gdGhpcyBiYW5kJ3Mgc2F0dXJhdGlvbiBwb3dlciBpbiBFRVBST00gKi8KLQljb25zdCBzOCBjbGlwX3Bvd2Vyc1tJV0xfTUFYX1JBVEVTXTsKLX07Ci0KLS8qIGN1cnJlbnQgVHggcG93ZXIgdmFsdWVzIHRvIHVzZSwgb25lIGZvciBlYWNoIHJhdGUgZm9yIGVhY2ggY2hhbm5lbC4KLSAqIHJlcXVlc3RlZCBwb3dlciBpcyBsaW1pdGVkIGJ5OgotICogLS0gcmVndWxhdG9yeSBFRVBST00gbGltaXRzIGZvciB0aGlzIGNoYW5uZWwKLSAqIC0tIGhhcmR3YXJlIGNhcGFiaWxpdGllcyAoY2xpcC1wb3dlcnMpCi0gKiAtLSBzcGVjdHJ1bSBtYW5hZ2VtZW50Ci0gKiAtLSB1c2VyIHByZWZlcmVuY2UgKGUuZy4gaXdjb25maWcpCi0gKiB3aGVuIHJlcXVlc3RlZCBwb3dlciBpcyBzZXQsIGJhc2UgcG93ZXIgaW5kZXggbXVzdCBhbHNvIGJlIHNldC4gKi8KLXN0cnVjdCBpd2wzOTQ1X2NoYW5uZWxfcG93ZXJfaW5mbyB7Ci0Jc3RydWN0IGl3bDM5NDVfdHhfcG93ZXIgdHBjOwkvKiBhY3R1YWwgcmFkaW8gYW5kIERTUCBnYWluIHNldHRpbmdzICovCi0JczggcG93ZXJfdGFibGVfaW5kZXg7CS8qIGFjdHVhbCAoY29tcGVuc3QnZCkgaW5kZXggaW50byBnYWluIHRhYmxlICovCi0JczggYmFzZV9wb3dlcl9pbmRleDsJLyogZ2FpbiBpbmRleCBmb3IgcG93ZXIgYXQgZmFjdG9yeSB0ZW1wLiAqLwotCXM4IHJlcXVlc3RlZF9wb3dlcjsJLyogcG93ZXIgKGRCbSkgcmVxdWVzdGVkIGZvciB0aGlzIGNobmwvcmF0ZSAqLwotfTsKLQotLyogY3VycmVudCBzY2FuIFR4IHBvd2VyIHZhbHVlcyB0byB1c2UsIG9uZSBmb3IgZWFjaCBzY2FuIHJhdGUgZm9yIGVhY2gKLSAqIGNoYW5uZWwuICovCi1zdHJ1Y3QgaXdsMzk0NV9zY2FuX3Bvd2VyX2luZm8gewotCXN0cnVjdCBpd2wzOTQ1X3R4X3Bvd2VyIHRwYzsJLyogYWN0dWFsIHJhZGlvIGFuZCBEU1AgZ2FpbiBzZXR0aW5ncyAqLwotCXM4IHBvd2VyX3RhYmxlX2luZGV4OwkvKiBhY3R1YWwgKGNvbXBlbnN0J2QpIGluZGV4IGludG8gZ2FpbiB0YWJsZSAqLwotCXM4IHJlcXVlc3RlZF9wb3dlcjsJLyogc2NhbiBwd3IgKGRCbSkgcmVxdWVzdGVkIGZvciBjaG5sL3JhdGUgKi8KLX07Ci0KLS8qCi0gKiBPbmUgZm9yIGVhY2ggY2hhbm5lbCwgaG9sZHMgYWxsIGNoYW5uZWwgc2V0dXAgZGF0YQotICogU29tZSBvZiB0aGUgZmllbGRzIChlLmcuIGVlcHJvbSBhbmQgZmxhZ3MvbWF4X3Bvd2VyX2F2ZykgYXJlIHJlZHVuZGFudAotICogICAgIHdpdGggb25lIGFub3RoZXIhCi0gKi8KLXN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvIHsKLQlzdHJ1Y3QgaXdsNDk2NV9jaGFubmVsX3RnZF9pbmZvIHRnZDsKLQlzdHJ1Y3QgaXdsNDk2NV9jaGFubmVsX3RnaF9pbmZvIHRnaDsKLQlzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsIGVlcHJvbTsJLyogRUVQUk9NIHJlZ3VsYXRvcnkgbGltaXQgKi8KLQlzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsIGh0NDBfZWVwcm9tOwkvKiBFRVBST00gcmVndWxhdG9yeSBsaW1pdCBmb3IKLQkJCQkJCSAqIEhUNDAgY2hhbm5lbCAqLwotCi0JdTggY2hhbm5lbDsJICAvKiBjaGFubmVsIG51bWJlciAqLwotCXU4IGZsYWdzOwkgIC8qIGZsYWdzIGNvcGllZCBmcm9tIEVFUFJPTSAqLwotCXM4IG1heF9wb3dlcl9hdmc7IC8qIChkQm0pIHJlZ3VsLiBlZXByb20sIG5vcm1hbCBUeCwgYW55IHJhdGUgKi8KLQlzOCBjdXJyX3R4cG93OwkgIC8qIChkQm0pIHJlZ3VsYXRvcnkvc3BlY3RydW0vdXNlciAobm90IGgvdykgbGltaXQgKi8KLQlzOCBtaW5fcG93ZXI7CSAgLyogYWx3YXlzIDAgKi8KLQlzOCBzY2FuX3Bvd2VyOwkgIC8qIChkQm0pIHJlZ3VsLiBlZXByb20sIGRpcmVjdCBzY2FucywgYW55IHJhdGUgKi8KLQotCXU4IGdyb3VwX2luZGV4OwkgIC8qIDAtNCwgbWFwcyBjaGFubmVsIHRvIGdyb3VwMS8yLzMvNC81ICovCi0JdTggYmFuZF9pbmRleDsJICAvKiAwLTQsIG1hcHMgY2hhbm5lbCB0byBiYW5kMS8yLzMvNC81ICovCi0JZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwotCi0JLyogSFQ0MCBjaGFubmVsIGluZm8gKi8KLQlzOCBodDQwX21heF9wb3dlcl9hdmc7CS8qIChkQm0pIHJlZ3VsLiBlZXByb20sIG5vcm1hbCBUeCwgYW55IHJhdGUgKi8KLQl1OCBodDQwX2ZsYWdzOwkJLyogZmxhZ3MgY29waWVkIGZyb20gRUVQUk9NICovCi0JdTggaHQ0MF9leHRlbnNpb25fY2hhbm5lbDsgLyogSFRfSUVfRVhUX0NIQU5ORUxfKiAqLwotCi0JLyogUmFkaW8vRFNQIGdhaW4gc2V0dGluZ3MgZm9yIGVhY2ggIm5vcm1hbCIgZGF0YSBUeCByYXRlLgotCSAqIFRoZXNlIGluY2x1ZGUsIGluIGFkZGl0aW9uIHRvIFJGIGFuZCBEU1AgZ2FpbiwgYSBmZXcgZmllbGRzIGZvcgotCSAqICAgcmVtZW1iZXJpbmcvbW9kaWZ5aW5nIGdhaW4gc2V0dGluZ3MgKGluZGV4ZXMpLiAqLwotCXN0cnVjdCBpd2wzOTQ1X2NoYW5uZWxfcG93ZXJfaW5mbyBwb3dlcl9pbmZvW0lXTDQ5NjVfTUFYX1JBVEVdOwotCi0JLyogUmFkaW8vRFNQIGdhaW4gc2V0dGluZ3MgZm9yIGVhY2ggc2NhbiByYXRlLCBmb3IgZGlyZWN0ZWQgc2NhbnMuICovCi0Jc3RydWN0IGl3bDM5NDVfc2Nhbl9wb3dlcl9pbmZvIHNjYW5fcHdyX2luZm9bSVdMX05VTV9TQ0FOX1JBVEVTXTsKLX07Ci0KLSNkZWZpbmUgSVdMX1RYX0ZJRk9fQksJCTAJLyogc2hhcmVkICovCi0jZGVmaW5lIElXTF9UWF9GSUZPX0JFCQkxCi0jZGVmaW5lIElXTF9UWF9GSUZPX1ZJCQkyCS8qIHNoYXJlZCAqLwotI2RlZmluZSBJV0xfVFhfRklGT19WTwkJMwotI2RlZmluZSBJV0xfVFhfRklGT19VTlVTRUQJLTEKLQotLyogTWluaW11bSBudW1iZXIgb2YgcXVldWVzLiBNQVhfTlVNIGlzIGRlZmluZWQgaW4gaHcgc3BlY2lmaWMgZmlsZXMuCi0gKiBTZXQgdGhlIG1pbmltdW0gdG8gYWNjb21tb2RhdGUgdGhlIDQgc3RhbmRhcmQgVFggcXVldWVzLCAxIGNvbW1hbmQKLSAqIHF1ZXVlLCAyICh1bnVzZWQpIEhDQ0EgcXVldWVzLCBhbmQgNCBIVCBxdWV1ZXMgKG9uZSBmb3IgZWFjaCBBQykgKi8KLSNkZWZpbmUgSVdMX01JTl9OVU1fUVVFVUVTCTEwCi0KLSNkZWZpbmUgSVdMX0RFRkFVTFRfQ01EX1FVRVVFX05VTQk0Ci0KLSNkZWZpbmUgSUVFRTgwMjExX0RBVEFfTEVOICAgICAgICAgICAgICAyMzA0Ci0jZGVmaW5lIElFRUU4MDIxMV80QUREUl9MRU4gICAgICAgICAgICAgMzAKLSNkZWZpbmUgSUVFRTgwMjExX0hMRU4gICAgICAgICAgICAgICAgICAoSUVFRTgwMjExXzRBRERSX0xFTikKLSNkZWZpbmUgSUVFRTgwMjExX0ZSQU1FX0xFTiAgICAgICAgICAgICAoSUVFRTgwMjExX0RBVEFfTEVOICsgSUVFRTgwMjExX0hMRU4pCi0KLXN0cnVjdCBpd2xfZnJhbWUgewotCXVuaW9uIHsKLQkJc3RydWN0IGllZWU4MDIxMV9oZHIgZnJhbWU7Ci0JCXN0cnVjdCBpd2xfdHhfYmVhY29uX2NtZCBiZWFjb247Ci0JCXU4IHJhd1tJRUVFODAyMTFfRlJBTUVfTEVOXTsKLQkJdTggY21kWzM2MF07Ci0JfSB1OwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX07Ci0KLSNkZWZpbmUgU0VRX1RPX1NOKHNlcSkgKCgoc2VxKSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkgPj4gNCkKLSNkZWZpbmUgU05fVE9fU0VRKHNzbikgKCgoc3NuKSA8PCA0KSAmIElFRUU4MDIxMV9TQ1RMX1NFUSkKLSNkZWZpbmUgTUFYX1NOICgoSUVFRTgwMjExX1NDVExfU0VRKSA+PiA0KQotCi1lbnVtIHsKLQlDTURfU1lOQyA9IDAsCi0JQ01EX1NJWkVfTk9STUFMID0gMCwKLQlDTURfTk9fU0tCID0gMCwKLQlDTURfU0laRV9IVUdFID0gKDEgPDwgMCksCi0JQ01EX0FTWU5DID0gKDEgPDwgMSksCi0JQ01EX1dBTlRfU0tCID0gKDEgPDwgMiksCi0JQ01EX01BUFBFRCA9ICgxIDw8IDMpLAotfTsKLQotI2RlZmluZSBERUZfQ01EX1BBWUxPQURfU0laRSAzMjAKLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX2RldmljZV9jbWQKLSAqCi0gKiBGb3IgYWxsb2NhdGlvbiBvZiB0aGUgY29tbWFuZCBhbmQgdHggcXVldWVzLCB0aGlzIGVzdGFibGlzaGVzIHRoZSBvdmVyYWxsCi0gKiBzaXplIG9mIHRoZSBsYXJnZXN0IGNvbW1hbmQgd2Ugc2VuZCB0byB1Q29kZSwgZXhjZXB0IGZvciBhIHNjYW4gY29tbWFuZAotICogKHdoaWNoIGlzIHJlbGF0aXZlbHkgaHVnZTsgc3BhY2UgaXMgYWxsb2NhdGVkIHNlcGFyYXRlbHkpLgotICovCi1zdHJ1Y3QgaXdsX2RldmljZV9jbWQgewotCXN0cnVjdCBpd2xfY21kX2hlYWRlciBoZHI7CS8qIHVDb2RlIEFQSSAqLwotCXVuaW9uIHsKLQkJdTMyIGZsYWdzOwotCQl1OCB2YWw4OwotCQl1MTYgdmFsMTY7Ci0JCXUzMiB2YWwzMjsKLQkJc3RydWN0IGl3bF90eF9jbWQgdHg7Ci0JCXU4IHBheWxvYWRbREVGX0NNRF9QQVlMT0FEX1NJWkVdOwotCX0gX19wYWNrZWQgY21kOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBURkRfTUFYX1BBWUxPQURfU0laRSAoc2l6ZW9mKHN0cnVjdCBpd2xfZGV2aWNlX2NtZCkpCi0KLQotc3RydWN0IGl3bF9ob3N0X2NtZCB7Ci0JY29uc3Qgdm9pZCAqZGF0YTsKLQl1bnNpZ25lZCBsb25nIHJlcGx5X3BhZ2U7Ci0Jdm9pZCAoKmNhbGxiYWNrKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCk7Ci0JdTMyIGZsYWdzOwotCXUxNiBsZW47Ci0JdTggaWQ7Ci19OwotCi0jZGVmaW5lIFNVUF9SQVRFXzExQV9NQVhfTlVNX0NIQU5ORUxTICA4Ci0jZGVmaW5lIFNVUF9SQVRFXzExQl9NQVhfTlVNX0NIQU5ORUxTICA0Ci0jZGVmaW5lIFNVUF9SQVRFXzExR19NQVhfTlVNX0NIQU5ORUxTICAxMgotCi0vKioKLSAqIHN0cnVjdCBpd2xfcnhfcXVldWUgLSBSeCBxdWV1ZQotICogQGJkOiBkcml2ZXIncyBwb2ludGVyIHRvIGJ1ZmZlciBvZiByZWNlaXZlIGJ1ZmZlciBkZXNjcmlwdG9ycyAocmJkKQotICogQGJkX2RtYTogYnVzIGFkZHJlc3Mgb2YgYnVmZmVyIG9mIHJlY2VpdmUgYnVmZmVyIGRlc2NyaXB0b3JzIChyYmQpCi0gKiBAcmVhZDogU2hhcmVkIGluZGV4IHRvIG5ld2VzdCBhdmFpbGFibGUgUnggYnVmZmVyCi0gKiBAd3JpdGU6IFNoYXJlZCBpbmRleCB0byBvbGRlc3Qgd3JpdHRlbiBSeCBwYWNrZXQKLSAqIEBmcmVlX2NvdW50OiBOdW1iZXIgb2YgcHJlLWFsbG9jYXRlZCBidWZmZXJzIGluIHJ4X2ZyZWUKLSAqIEByeF9mcmVlOiBsaXN0IG9mIGZyZWUgU0tCcyBmb3IgdXNlCi0gKiBAcnhfdXNlZDogTGlzdCBvZiBSeCBidWZmZXJzIHdpdGggbm8gU0tCCi0gKiBAbmVlZF91cGRhdGU6IGZsYWcgdG8gaW5kaWNhdGUgd2UgbmVlZCB0byB1cGRhdGUgcmVhZC93cml0ZSBpbmRleAotICogQHJiX3N0dHM6IGRyaXZlcidzIHBvaW50ZXIgdG8gcmVjZWl2ZSBidWZmZXIgc3RhdHVzCi0gKiBAcmJfc3R0c19kbWE6IGJ1cyBhZGRyZXNzIG9mIHJlY2VpdmUgYnVmZmVyIHN0YXR1cwotICoKLSAqIE5PVEU6ICByeF9mcmVlIGFuZCByeF91c2VkIGFyZSB1c2VkIGFzIGEgRklGTyBmb3IgaXdsX3J4X21lbV9idWZmZXJzCi0gKi8KLXN0cnVjdCBpd2xfcnhfcXVldWUgewotCV9fbGUzMiAqYmQ7Ci0JZG1hX2FkZHJfdCBiZF9kbWE7Ci0Jc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyIHBvb2xbUlhfUVVFVUVfU0laRSArIFJYX0ZSRUVfQlVGRkVSU107Ci0Jc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpxdWV1ZVtSWF9RVUVVRV9TSVpFXTsKLQl1MzIgcmVhZDsKLQl1MzIgd3JpdGU7Ci0JdTMyIGZyZWVfY291bnQ7Ci0JdTMyIHdyaXRlX2FjdHVhbDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHJ4X2ZyZWU7Ci0Jc3RydWN0IGxpc3RfaGVhZCByeF91c2VkOwotCWludCBuZWVkX3VwZGF0ZTsKLQlzdHJ1Y3QgaXdsX3JiX3N0YXR1cyAqcmJfc3R0czsKLQlkbWFfYWRkcl90IHJiX3N0dHNfZG1hOwotCXNwaW5sb2NrX3QgbG9jazsKLX07Ci0KLSNkZWZpbmUgSVdMX1NVUFBPUlRFRF9SQVRFU19JRV9MRU4gICAgICAgICA4Ci0KLSNkZWZpbmUgTUFYX1RJRF9DT1VOVCAgICAgICAgOQotCi0jZGVmaW5lIElXTF9JTlZBTElEX1JBVEUgICAgIDB4RkYKLSNkZWZpbmUgSVdMX0lOVkFMSURfVkFMVUUgICAgLTEKLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX2h0X2FnZyAtLSBhZ2dyZWdhdGlvbiBzdGF0dXMgd2hpbGUgd2FpdGluZyBmb3IgYmxvY2stYWNrCi0gKiBAdHhxX2lkOiBUeCBxdWV1ZSB1c2VkIGZvciBUeCBhdHRlbXB0Ci0gKiBAZnJhbWVfY291bnQ6ICMgZnJhbWVzIGF0dGVtcHRlZCBieSBUeCBjb21tYW5kCi0gKiBAd2FpdF9mb3JfYmE6IEV4cGVjdCBibG9jay1hY2sgYmVmb3JlIG5leHQgVHggcmVwbHkKLSAqIEBzdGFydF9pZHg6IEluZGV4IG9mIDFzdCBUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9yIChURkQpIGluIFR4IHdpbmRvdwotICogQGJpdG1hcDA6IExvdyBvcmRlciBiaXRtYXAsIG9uZSBiaXQgZm9yIGVhY2ggZnJhbWUgcGVuZGluZyBBQ0sgaW4gVHggd2luZG93Ci0gKiBAYml0bWFwMTogSGlnaCBvcmRlciwgb25lIGJpdCBmb3IgZWFjaCBmcmFtZSBwZW5kaW5nIEFDSyBpbiBUeCB3aW5kb3cKLSAqIEByYXRlX25fZmxhZ3M6IFJhdGUgYXQgd2hpY2ggVHggd2FzIGF0dGVtcHRlZAotICoKLSAqIElmIFJFUExZX1RYIGluZGljYXRlcyB0aGF0IGFnZ3JlZ2F0aW9uIHdhcyBhdHRlbXB0ZWQsIGRyaXZlciBtdXN0IHdhaXQKLSAqIGZvciBibG9jayBhY2sgKFJFUExZX0NPTVBSRVNTRURfQkEpLiAgVGhpcyBzdHJ1Y3Qgc3RvcmVzIHR4IHJlcGx5IGluZm8KLSAqIHVudGlsIGJsb2NrIGFjayBhcnJpdmVzLgotICovCi1zdHJ1Y3QgaXdsX2h0X2FnZyB7Ci0JdTE2IHR4cV9pZDsKLQl1MTYgZnJhbWVfY291bnQ7Ci0JdTE2IHdhaXRfZm9yX2JhOwotCXUxNiBzdGFydF9pZHg7Ci0JdTY0IGJpdG1hcDsKLQl1MzIgcmF0ZV9uX2ZsYWdzOwotI2RlZmluZSBJV0xfQUdHX09GRiAwCi0jZGVmaW5lIElXTF9BR0dfT04gMQotI2RlZmluZSBJV0xfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkEgMgotI2RlZmluZSBJV0xfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkEgMwotCXU4IHN0YXRlOwotfTsKLQotCi1zdHJ1Y3QgaXdsX3RpZF9kYXRhIHsKLQl1MTYgc2VxX251bWJlcjsgLyogNDk2NSBvbmx5ICovCi0JdTE2IHRmZHNfaW5fcXVldWU7Ci0Jc3RydWN0IGl3bF9odF9hZ2cgYWdnOwotfTsKLQotc3RydWN0IGl3bF9od19rZXkgewotCXUzMiBjaXBoZXI7Ci0JaW50IGtleWxlbjsKLQl1OCBrZXlpZHg7Ci0JdTgga2V5WzMyXTsKLX07Ci0KLXVuaW9uIGl3bF9odF9yYXRlX3N1cHAgewotCXUxNiByYXRlczsKLQlzdHJ1Y3QgewotCQl1OCBzaXNvX3JhdGU7Ci0JCXU4IG1pbW9fcmF0ZTsKLQl9OwotfTsKLQotI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzhLICAgKDB4MCkKLSNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl8xNksgICgweDEpCi0jZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfMzJLICAoMHgyKQotI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzY0SyAgKDB4MykKLSNkZWZpbmUgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl9ERUYgIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfNjRLCi0jZGVmaW5lIENGR19IVF9SWF9BTVBEVV9GQUNUT1JfTUFYICBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SXzY0SwotI2RlZmluZSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SX01JTiAgQ0ZHX0hUX1JYX0FNUERVX0ZBQ1RPUl84SwotCi0vKgotICogTWF4aW1hbCBNUERVIGRlbnNpdHkgZm9yIFRYIGFnZ3JlZ2F0aW9uCi0gKiA0IC0gMnVzIGRlbnNpdHkKLSAqIDUgLSA0dXMgZGVuc2l0eQotICogNiAtIDh1cyBkZW5zaXR5Ci0gKiA3IC0gMTZ1cyBkZW5zaXR5Ci0gKi8KLSNkZWZpbmUgQ0ZHX0hUX01QRFVfREVOU0lUWV8yVVNFQyAgICgweDQpCi0jZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfNFVTRUMgICAoMHg1KQotI2RlZmluZSBDRkdfSFRfTVBEVV9ERU5TSVRZXzhVU0VDICAgKDB4NikKLSNkZWZpbmUgQ0ZHX0hUX01QRFVfREVOU0lUWV8xNlVTRUMgICgweDcpCi0jZGVmaW5lIENGR19IVF9NUERVX0RFTlNJVFlfREVGIENGR19IVF9NUERVX0RFTlNJVFlfNFVTRUMKLSNkZWZpbmUgQ0ZHX0hUX01QRFVfREVOU0lUWV9NQVggQ0ZHX0hUX01QRFVfREVOU0lUWV8xNlVTRUMKLSNkZWZpbmUgQ0ZHX0hUX01QRFVfREVOU0lUWV9NSU4gICAgICgweDEpCi0KLXN0cnVjdCBpd2xfaHRfY29uZmlnIHsKLQlib29sIHNpbmdsZV9jaGFpbl9zdWZmaWNpZW50OwotCWVudW0gaWVlZTgwMjExX3NtcHNfbW9kZSBzbXBzOyAvKiBjdXJyZW50IHNtcHMgbW9kZSAqLwotfTsKLQotLyogUW9TIHN0cnVjdHVyZXMgKi8KLXN0cnVjdCBpd2xfcW9zX2luZm8gewotCWludCBxb3NfYWN0aXZlOwotCXN0cnVjdCBpd2xfcW9zcGFyYW1fY21kIGRlZl9xb3NfcGFybTsKLX07Ci0KLS8qCi0gKiBTdHJ1Y3R1cmUgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggc3RhX2xvY2sgaGVsZC4gV2hlbiBzdGF0aW9uIGFkZGl0aW9uCi0gKiBpcyBpbiBwcm9ncmVzcyAoSVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3Mgb25seQotICogdGhlIGNvbW1hbmRzIChpd2xfbGVnYWN5X2FkZHN0YV9jbWQgYW5kIGl3bF9saW5rX3F1YWxpdHlfY21kKSB3aXRob3V0Ci0gKiBzdGFfbG9jayBoZWxkLgotICovCi1zdHJ1Y3QgaXdsX3N0YXRpb25fZW50cnkgewotCXN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgc3RhOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgdGlkW01BWF9USURfQ09VTlRdOwotCXU4IHVzZWQsIGN0eGlkOwotCXN0cnVjdCBpd2xfaHdfa2V5IGtleWluZm87Ci0Jc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICpscTsKLX07Ci0KLXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2X2NvbW1vbiB7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQl1OCBzdGFfaWQ7Ci19OwotCi0vKgotICogaXdsX3N0YXRpb25fcHJpdjogRHJpdmVyJ3MgcHJpdmF0ZSBzdGF0aW9uIGluZm9ybWF0aW9uCi0gKgotICogV2hlbiBtYWM4MDIxMSBjcmVhdGVzIGEgc3RhdGlvbiBpdCByZXNlcnZlcyBzb21lIHNwYWNlIChody0+c3RhX2RhdGFfc2l6ZSkKLSAqIGluIHRoZSBzdHJ1Y3R1cmUgZm9yIHVzZSBieSBkcml2ZXIuIFRoaXMgc3RydWN0dXJlIGlzIHBsYWNlcyBpbiB0aGF0Ci0gKiBzcGFjZS4KLSAqCi0gKiBUaGUgY29tbW9uIHN0cnVjdCBNVVNUIGJlIGZpcnN0IGJlY2F1c2UgaXQgaXMgc2hhcmVkIGJldHdlZW4KLSAqIDM5NDUgYW5kIDQ5NjUhCi0gKi8KLXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2IHsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdl9jb21tb24gY29tbW9uOwotCXN0cnVjdCBpd2xfbHFfc3RhIGxxX3N0YTsKLQlhdG9taWNfdCBwZW5kaW5nX2ZyYW1lczsKLQlib29sIGNsaWVudDsKLQlib29sIGFzbGVlcDsKLX07Ci0KLS8qKgotICogc3RydWN0IGl3bF92aWZfcHJpdiAtIGRyaXZlcidzIHByaXZhdGUgcGVyLWludGVyZmFjZSBpbmZvcm1hdGlvbgotICoKLSAqIFdoZW4gbWFjODAyMTEgYWxsb2NhdGVzIGEgdmlydHVhbCBpbnRlcmZhY2UsIGl0IGNhbiBhbGxvY2F0ZQotICogc3BhY2UgZm9yIHVzIHRvIHB1dCBkYXRhIGludG8uCi0gKi8KLXN0cnVjdCBpd2xfdmlmX3ByaXYgewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JdTggaWJzc19ic3NpZF9zdGFfaWQ7Ci19OwotCi0vKiBvbmUgZm9yIGVhY2ggdUNvZGUgaW1hZ2UgKGluc3QvZGF0YSwgYm9vdC9pbml0L3J1bnRpbWUpICovCi1zdHJ1Y3QgZndfZGVzYyB7Ci0Jdm9pZCAqdl9hZGRyOwkJLyogYWNjZXNzIGJ5IGRyaXZlciAqLwotCWRtYV9hZGRyX3QgcF9hZGRyOwkvKiBhY2Nlc3MgYnkgY2FyZCdzIGJ1c21hc3RlciBETUEgKi8KLQl1MzIgbGVuOwkJLyogYnl0ZXMgKi8KLX07Ci0KLS8qIHVDb2RlIGZpbGUgbGF5b3V0ICovCi1zdHJ1Y3QgaXdsX3Vjb2RlX2hlYWRlciB7Ci0JX19sZTMyIHZlcjsJLyogbWFqb3IvbWlub3IvQVBJL3NlcmlhbCAqLwotCXN0cnVjdCB7Ci0JCV9fbGUzMiBpbnN0X3NpemU7CS8qIGJ5dGVzIG9mIHJ1bnRpbWUgY29kZSAqLwotCQlfX2xlMzIgZGF0YV9zaXplOwkvKiBieXRlcyBvZiBydW50aW1lIGRhdGEgKi8KLQkJX19sZTMyIGluaXRfc2l6ZTsJLyogYnl0ZXMgb2YgaW5pdCBjb2RlICovCi0JCV9fbGUzMiBpbml0X2RhdGFfc2l6ZTsJLyogYnl0ZXMgb2YgaW5pdCBkYXRhICovCi0JCV9fbGUzMiBib290X3NpemU7CS8qIGJ5dGVzIG9mIGJvb3RzdHJhcCBjb2RlICovCi0JCXU4IGRhdGFbMF07CQkvKiBpbiBzYW1lIG9yZGVyIGFzIHNpemVzICovCi0JfSB2MTsKLX07Ci0KLXN0cnVjdCBpd2w0OTY1X2lic3Nfc2VxIHsKLQl1OCBtYWNbRVRIX0FMRU5dOwotCXUxNiBzZXFfbnVtOwotCXUxNiBmcmFnX251bTsKLQl1bnNpZ25lZCBsb25nIHBhY2tldF90aW1lOwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLX07Ci0KLXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzIHsKLQl1MTYgbWluX25yZ19jY2s7Ci0JdTE2IG1heF9ucmdfY2NrOwotCi0JdTE2IG5yZ190aF9jY2s7Ci0JdTE2IG5yZ190aF9vZmRtOwotCi0JdTE2IGF1dG9fY29ycl9taW5fb2ZkbTsKLQl1MTYgYXV0b19jb3JyX21pbl9vZmRtX21yYzsKLQl1MTYgYXV0b19jb3JyX21pbl9vZmRtX3gxOwotCXUxNiBhdXRvX2NvcnJfbWluX29mZG1fbXJjX3gxOwotCi0JdTE2IGF1dG9fY29ycl9tYXhfb2ZkbTsKLQl1MTYgYXV0b19jb3JyX21heF9vZmRtX21yYzsKLQl1MTYgYXV0b19jb3JyX21heF9vZmRtX3gxOwotCXUxNiBhdXRvX2NvcnJfbWF4X29mZG1fbXJjX3gxOwotCi0JdTE2IGF1dG9fY29ycl9tYXhfY2NrOwotCXUxNiBhdXRvX2NvcnJfbWF4X2Nja19tcmM7Ci0JdTE2IGF1dG9fY29ycl9taW5fY2NrOwotCXUxNiBhdXRvX2NvcnJfbWluX2Nja19tcmM7Ci0KLQl1MTYgYmFya2VyX2NvcnJfdGhfbWluOwotCXUxNiBiYXJrZXJfY29ycl90aF9taW5fbXJjOwotCXUxNiBucmdfdGhfY2NhOwotfTsKLQotCi0jZGVmaW5lIEtFTFZJTl9UT19DRUxTSVVTKHgpICgoeCktMjczKQotI2RlZmluZSBDRUxTSVVTX1RPX0tFTFZJTih4KSAoKHgpKzI3MykKLQotCi0vKioKLSAqIHN0cnVjdCBpd2xfaHdfcGFyYW1zCi0gKiBAbWF4X3R4cV9udW06IE1heCAjIFR4IHF1ZXVlcyBzdXBwb3J0ZWQKLSAqIEBkbWFfY2hubF9udW06IE51bWJlciBvZiBUeCBETUEvRklGTyBjaGFubmVscwotICogQHNjZF9iY190YmxzX3NpemU6IHNpemUgb2Ygc2NoZWR1bGVyIGJ5dGUgY291bnQgdGFibGVzCi0gKiBAdGZkX3NpemU6IFRGRCBzaXplCi0gKiBAdHgvcnhfY2hhaW5zX251bTogTnVtYmVyIG9mIFRYL1JYIGNoYWlucwotICogQHZhbGlkX3R4L3J4X2FudDogdXNhYmxlIGFudGVubmFzCi0gKiBAbWF4X3J4cV9zaXplOiBNYXggIyBSeCBmcmFtZXMgaW4gUnggcXVldWUgKG11c3QgYmUgcG93ZXItb2YtMikKLSAqIEBtYXhfcnhxX2xvZzogTG9nLWJhc2UtMiBvZiBtYXhfcnhxX3NpemUKLSAqIEByeF9wYWdlX29yZGVyOiBSeCBidWZmZXIgcGFnZSBvcmRlcgotICogQHJ4X3dydF9wdHJfcmVnOiBGSHszOX1fUlNDU1JfQ0hOTDBfV1BUUgotICogQG1heF9zdGF0aW9uczoKLSAqIEBodDQwX2NoYW5uZWw6IGlzIDQwTUh6IHdpZHRoIHBvc3NpYmxlIGluIGJhbmQgMi40Ci0gKiBCSVQoSUVFRTgwMjExX0JBTkRfNUdIWikgQklUKElFRUU4MDIxMV9CQU5EXzVHSFopCi0gKiBAc3dfY3J5cHRvOiAwIGZvciBodywgMSBmb3Igc3cKLSAqIEBtYXhfeHh4X3NpemU6IGZvciB1Y29kZSB1c2VzCi0gKiBAY3Rfa2lsbF90aHJlc2hvbGQ6IHRlbXBlcmF0dXJlIHRocmVzaG9sZAotICogQGJlYWNvbl90aW1lX3RzZl9iaXRzOiBudW1iZXIgb2YgdmFsaWQgdHNmIGJpdHMgZm9yIGJlYWNvbiB0aW1lCi0gKiBAc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXM6IHJhbmdlIG9mIHNlbnNpdGl2aXR5IHZhbHVlcwotICovCi1zdHJ1Y3QgaXdsX2h3X3BhcmFtcyB7Ci0JdTggbWF4X3R4cV9udW07Ci0JdTggZG1hX2NobmxfbnVtOwotCXUxNiBzY2RfYmNfdGJsc19zaXplOwotCXUzMiB0ZmRfc2l6ZTsKLQl1OCAgdHhfY2hhaW5zX251bTsKLQl1OCAgcnhfY2hhaW5zX251bTsKLQl1OCAgdmFsaWRfdHhfYW50OwotCXU4ICB2YWxpZF9yeF9hbnQ7Ci0JdTE2IG1heF9yeHFfc2l6ZTsKLQl1MTYgbWF4X3J4cV9sb2c7Ci0JdTMyIHJ4X3BhZ2Vfb3JkZXI7Ci0JdTMyIHJ4X3dydF9wdHJfcmVnOwotCXU4ICBtYXhfc3RhdGlvbnM7Ci0JdTggIGh0NDBfY2hhbm5lbDsKLQl1OCAgbWF4X2JlYWNvbl9pdHJ2bDsJLyogaW4gMTAyNCBtcyAqLwotCXUzMiBtYXhfaW5zdF9zaXplOwotCXUzMiBtYXhfZGF0YV9zaXplOwotCXUzMiBtYXhfYnNtX3NpemU7Ci0JdTMyIGN0X2tpbGxfdGhyZXNob2xkOyAvKiB2YWx1ZSBpbiBody1kZXBlbmRlbnQgdW5pdHMgKi8KLQl1MTYgYmVhY29uX3RpbWVfdHNmX2JpdHM7Ci0JY29uc3Qgc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXMgKnNlbnM7Ci19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBGdW5jdGlvbnMgaW1wbGVtZW50ZWQgaW4gY29yZSBtb2R1bGUgd2hpY2ggYXJlIGZvcndhcmQgZGVjbGFyZWQgaGVyZQotICogZm9yIHVzZSBieSBpd2wtWzQtNV0uYwotICoKLSAqIE5PVEU6ICBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhlc2UgZnVuY3Rpb25zIGFyZSBub3QgaGFyZHdhcmUgc3BlY2lmaWMKLSAqIHdoaWNoIGlzIHdoeSB0aGV5IGFyZSBpbiB0aGUgY29yZSBtb2R1bGUgZmlsZXMuCi0gKgotICogTmFtaW5nIGNvbnZlbnRpb24gLS0KLSAqIGl3bF8gICAgICAgICA8LS0gSXMgcGFydCBvZiBpd2x3aWZpCi0gKiBpd2xYWFhYXyAgICAgPC0tIEhhcmR3YXJlIHNwZWNpZmljIChpbXBsZW1lbnRlZCBpbiBpd2wtWFhYWC5jIGZvciBYWFhYKQotICogaXdsNDk2NV9iZ18gICAgICA8LS0gQ2FsbGVkIGZyb20gd29yayBxdWV1ZSBjb250ZXh0Ci0gKiBpd2w0OTY1X21hY18gICAgIDwtLSBtYWM4MDIxMSBjYWxsYmFjawotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotZXh0ZXJuIHZvaWQgaXdsNDk2NV91cGRhdGVfY2hhaW5fZmxhZ3Moc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWV4dGVybiBjb25zdCB1OCBpd2xlZ2FjeV9iY2FzdF9hZGRyW0VUSF9BTEVOXTsKLWV4dGVybiBpbnQgaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZShjb25zdCBzdHJ1Y3QgaXdsX3F1ZXVlICpxKTsKLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfcXVldWVfdXNlZChjb25zdCBzdHJ1Y3QgaXdsX3F1ZXVlICpxLCBpbnQgaSkKLXsKLQlyZXR1cm4gcS0+d3JpdGVfcHRyID49IHEtPnJlYWRfcHRyID8KLQkJKGkgPj0gcS0+cmVhZF9wdHIgJiYgaSA8IHEtPndyaXRlX3B0cikgOgotCQkhKGkgPCBxLT5yZWFkX3B0ciAmJiBpID49IHEtPndyaXRlX3B0cik7Ci19Ci0KLQotc3RhdGljIGlubGluZSB1OCBpd2xfbGVnYWN5X2dldF9jbWRfaW5kZXgoc3RydWN0IGl3bF9xdWV1ZSAqcSwgdTMyIGluZGV4LAotCQkJCQkJCQlpbnQgaXNfaHVnZSkKLXsKLQkvKgotCSAqIFRoaXMgaXMgZm9yIGluaXQgY2FsaWJyYXRpb24gcmVzdWx0IGFuZCBzY2FuIGNvbW1hbmQgd2hpY2gKLQkgKiByZXF1aXJlZCBidWZmZXIgPiBURkRfTUFYX1BBWUxPQURfU0laRSwKLQkgKiB0aGUgYmlnIGJ1ZmZlciBhdCBlbmQgb2YgY29tbWFuZCBhcnJheQotCSAqLwotCWlmIChpc19odWdlKQotCQlyZXR1cm4gcS0+bl93aW5kb3c7CS8qIG11c3QgYmUgcG93ZXIgb2YgMiAqLwotCi0JLyogT3RoZXJ3aXNlLCB1c2Ugbm9ybWFsIHNpemUgYnVmZmVycyAqLwotCXJldHVybiBpbmRleCAmIChxLT5uX3dpbmRvdyAtIDEpOwotfQotCi0KLXN0cnVjdCBpd2xfZG1hX3B0ciB7Ci0JZG1hX2FkZHJfdCBkbWE7Ci0Jdm9pZCAqYWRkcjsKLQlzaXplX3Qgc2l6ZTsKLX07Ci0KLSNkZWZpbmUgSVdMX09QRVJBVElPTl9NT0RFX0FVVE8gICAgIDAKLSNkZWZpbmUgSVdMX09QRVJBVElPTl9NT0RFX0hUX09OTFkgIDEKLSNkZWZpbmUgSVdMX09QRVJBVElPTl9NT0RFX01JWEVEICAgIDIKLSNkZWZpbmUgSVdMX09QRVJBVElPTl9NT0RFXzIwTUhaICAgIDMKLQotI2RlZmluZSBJV0xfVFhfQ1JDX1NJWkUgNAotI2RlZmluZSBJV0xfVFhfREVMSU1JVEVSX1NJWkUgNAotCi0jZGVmaW5lIFRYX1BPV0VSX0lXTF9JTExFR0FMX1ZPTFRBR0UgLTEwMDAwCi0KLS8qIFNlbnNpdGl2aXR5IGFuZCBjaGFpbiBub2lzZSBjYWxpYnJhdGlvbiAqLwotI2RlZmluZSBJTklUSUFMSVpBVElPTl9WQUxVRQkJMHhGRkZGCi0jZGVmaW5lIElXTDQ5NjVfQ0FMX05VTV9CRUFDT05TCQkyMAotI2RlZmluZSBJV0xfQ0FMX05VTV9CRUFDT05TCQkxNgotI2RlZmluZSBNQVhJTVVNX0FMTE9XRURfUEFUSExPU1MJMTUKLQotI2RlZmluZSBDSEFJTl9OT0lTRV9NQVhfREVMVEFfR0FJTl9DT0RFIDMKLQotI2RlZmluZSBNQVhfRkFfT0ZETSAgNTAKLSNkZWZpbmUgTUlOX0ZBX09GRE0gIDUKLSNkZWZpbmUgTUFYX0ZBX0NDSyAgIDUwCi0jZGVmaW5lIE1JTl9GQV9DQ0sgICA1Ci0KLSNkZWZpbmUgQVVUT19DT1JSX1NURVBfT0ZETSAgICAgICAxCi0KLSNkZWZpbmUgQVVUT19DT1JSX1NURVBfQ0NLICAgICAzCi0jZGVmaW5lIEFVVE9fQ09SUl9NQVhfVEhfQ0NLICAgMTYwCi0KLSNkZWZpbmUgTlJHX0RJRkYgICAgICAgICAgICAgICAyCi0jZGVmaW5lIE5SR19TVEVQX0NDSyAgICAgICAgICAgMgotI2RlZmluZSBOUkdfTUFSR0lOICAgICAgICAgICAgIDgKLSNkZWZpbmUgTUFYX05VTUJFUl9DQ0tfTk9fRkEgMTAwCi0KLSNkZWZpbmUgQVVUT19DT1JSX0NDS19NSU5fVkFMX0RFRiAgICAoMTI1KQotCi0jZGVmaW5lIENIQUlOX0EgICAgICAgICAgICAgMAotI2RlZmluZSBDSEFJTl9CICAgICAgICAgICAgIDEKLSNkZWZpbmUgQ0hBSU5fQyAgICAgICAgICAgICAyCi0jZGVmaW5lIENIQUlOX05PSVNFX0RFTFRBX0dBSU5fSU5JVF9WQUwgNAotI2RlZmluZSBBTExfQkFORF9GSUxURVIJCQkweEZGMDAKLSNkZWZpbmUgSU5fQkFORF9GSUxURVIJCQkweEZGCi0jZGVmaW5lIE1JTl9BVkVSQUdFX05PSVNFX01BWF9WQUxVRQkweEZGRkZGRkZGCi0KLSNkZWZpbmUgTlJHX05VTV9QUkVWX1NUQVRfTCAgICAgMjAKLSNkZWZpbmUgTlVNX1JYX0NIQUlOUyAgICAgICAgICAgMwotCi1lbnVtIGl3bDQ5NjVfZmFsc2VfYWxhcm1fc3RhdGUgewotCUlXTF9GQV9UT09fTUFOWSA9IDAsCi0JSVdMX0ZBX1RPT19GRVcgPSAxLAotCUlXTF9GQV9HT09EX1JBTkdFID0gMiwKLX07Ci0KLWVudW0gaXdsNDk2NV9jaGFpbl9ub2lzZV9zdGF0ZSB7Ci0JSVdMX0NIQUlOX05PSVNFX0FMSVZFID0gMCwgIC8qIG11c3QgYmUgMCAqLwotCUlXTF9DSEFJTl9OT0lTRV9BQ0NVTVVMQVRFLAotCUlXTF9DSEFJTl9OT0lTRV9DQUxJQlJBVEVELAotCUlXTF9DSEFJTl9OT0lTRV9ET05FLAotfTsKLQotZW51bSBpd2w0OTY1X2NhbGliX2VuYWJsZWRfc3RhdGUgewotCUlXTF9DQUxJQl9ESVNBQkxFRCA9IDAsICAvKiBtdXN0IGJlIDAgKi8KLQlJV0xfQ0FMSUJfRU5BQkxFRCA9IDEsCi19OwotCi0vKgotICogZW51bSBpd2xfY2FsaWIKLSAqIGRlZmluZXMgdGhlIG9yZGVyIGluIHdoaWNoIHJlc3VsdHMgb2YgaW5pdGlhbCBjYWxpYnJhdGlvbnMKLSAqIHNob3VsZCBiZSBzZW50IHRvIHRoZSBydW50aW1lIHVDb2RlCi0gKi8KLWVudW0gaXdsX2NhbGliIHsKLQlJV0xfQ0FMSUJfTUFYLAotfTsKLQotLyogT3BhcXVlIGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KLXN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0IHsKLQl2b2lkICpidWY7Ci0Jc2l6ZV90IGJ1Zl9sZW47Ci19OwotCi1lbnVtIHVjb2RlX3R5cGUgewotCVVDT0RFX05PTkUgPSAwLAotCVVDT0RFX0lOSVQsCi0JVUNPREVfUlQKLX07Ci0KLS8qIFNlbnNpdGl2aXR5IGNhbGliIGRhdGEgKi8KLXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSB7Ci0JdTMyIGF1dG9fY29ycl9vZmRtOwotCXUzMiBhdXRvX2NvcnJfb2ZkbV9tcmM7Ci0JdTMyIGF1dG9fY29ycl9vZmRtX3gxOwotCXUzMiBhdXRvX2NvcnJfb2ZkbV9tcmNfeDE7Ci0JdTMyIGF1dG9fY29ycl9jY2s7Ci0JdTMyIGF1dG9fY29ycl9jY2tfbXJjOwotCi0JdTMyIGxhc3RfYmFkX3BsY3BfY250X29mZG07Ci0JdTMyIGxhc3RfZmFfY250X29mZG07Ci0JdTMyIGxhc3RfYmFkX3BsY3BfY250X2NjazsKLQl1MzIgbGFzdF9mYV9jbnRfY2NrOwotCi0JdTMyIG5yZ19jdXJyX3N0YXRlOwotCXUzMiBucmdfcHJldl9zdGF0ZTsKLQl1MzIgbnJnX3ZhbHVlWzEwXTsKLQl1OCAgbnJnX3NpbGVuY2VfcnNzaVtOUkdfTlVNX1BSRVZfU1RBVF9MXTsKLQl1MzIgbnJnX3NpbGVuY2VfcmVmOwotCXUzMiBucmdfZW5lcmd5X2lkeDsKLQl1MzIgbnJnX3NpbGVuY2VfaWR4OwotCXUzMiBucmdfdGhfY2NrOwotCXMzMiBucmdfYXV0b19jb3JyX3NpbGVuY2VfZGlmZjsKLQl1MzIgbnVtX2luX2Nja19ub19mYTsKLQl1MzIgbnJnX3RoX29mZG07Ci0KLQl1MTYgYmFya2VyX2NvcnJfdGhfbWluOwotCXUxNiBiYXJrZXJfY29ycl90aF9taW5fbXJjOwotCXUxNiBucmdfdGhfY2NhOwotfTsKLQotLyogQ2hhaW4gbm9pc2UgKGRpZmZlcmVudGlhbCBSeCBnYWluKSBjYWxpYiBkYXRhICovCi1zdHJ1Y3QgaXdsX2NoYWluX25vaXNlX2RhdGEgewotCXUzMiBhY3RpdmVfY2hhaW5zOwotCXUzMiBjaGFpbl9ub2lzZV9hOwotCXUzMiBjaGFpbl9ub2lzZV9iOwotCXUzMiBjaGFpbl9ub2lzZV9jOwotCXUzMiBjaGFpbl9zaWduYWxfYTsKLQl1MzIgY2hhaW5fc2lnbmFsX2I7Ci0JdTMyIGNoYWluX3NpZ25hbF9jOwotCXUxNiBiZWFjb25fY291bnQ7Ci0JdTggZGlzY29ubl9hcnJheVtOVU1fUlhfQ0hBSU5TXTsKLQl1OCBkZWx0YV9nYWluX2NvZGVbTlVNX1JYX0NIQUlOU107Ci0JdTggcmFkaW9fd3JpdGU7Ci0JdTggc3RhdGU7Ci19OwotCi0jZGVmaW5lCUVFUFJPTV9TRU1fVElNRU9VVCAxMAkJLyogbWlsbGlzZWNvbmRzICovCi0jZGVmaW5lIEVFUFJPTV9TRU1fUkVUUllfTElNSVQgMTAwMAkvKiBudW1iZXIgb2YgYXR0ZW1wdHMgKG5vdCB0aW1lKSAqLwotCi0jZGVmaW5lIElXTF9UUkFGRklDX0VOVFJJRVMJKDI1NikKLSNkZWZpbmUgSVdMX1RSQUZGSUNfRU5UUllfU0laRSAgKDY0KQotCi1lbnVtIHsKLQlNRUFTVVJFTUVOVF9SRUFEWSA9ICgxIDw8IDApLAotCU1FQVNVUkVNRU5UX0FDVElWRSA9ICgxIDw8IDEpLAotfTsKLQotLyogaW50ZXJydXB0IHN0YXRpc3RpY3MgKi8KLXN0cnVjdCBpc3Jfc3RhdGlzdGljcyB7Ci0JdTMyIGh3OwotCXUzMiBzdzsKLQl1MzIgZXJyX2NvZGU7Ci0JdTMyIHNjaDsKLQl1MzIgYWxpdmU7Ci0JdTMyIHJma2lsbDsKLQl1MzIgY3RraWxsOwotCXUzMiB3YWtldXA7Ci0JdTMyIHJ4OwotCXUzMiByeF9oYW5kbGVyc1tSRVBMWV9NQVhdOwotCXUzMiB0eDsKLQl1MzIgdW5oYW5kbGVkOwotfTsKLQotLyogbWFuYWdlbWVudCBzdGF0aXN0aWNzICovCi1lbnVtIGl3bF9tZ210X3N0YXRzIHsKLQlNQU5BR0VNRU5UX0FTU09DX1JFUSA9IDAsCi0JTUFOQUdFTUVOVF9BU1NPQ19SRVNQLAotCU1BTkFHRU1FTlRfUkVBU1NPQ19SRVEsCi0JTUFOQUdFTUVOVF9SRUFTU09DX1JFU1AsCi0JTUFOQUdFTUVOVF9QUk9CRV9SRVEsCi0JTUFOQUdFTUVOVF9QUk9CRV9SRVNQLAotCU1BTkFHRU1FTlRfQkVBQ09OLAotCU1BTkFHRU1FTlRfQVRJTSwKLQlNQU5BR0VNRU5UX0RJU0FTU09DLAotCU1BTkFHRU1FTlRfQVVUSCwKLQlNQU5BR0VNRU5UX0RFQVVUSCwKLQlNQU5BR0VNRU5UX0FDVElPTiwKLQlNQU5BR0VNRU5UX01BWCwKLX07Ci0vKiBjb250cm9sIHN0YXRpc3RpY3MgKi8KLWVudW0gaXdsX2N0cmxfc3RhdHMgewotCUNPTlRST0xfQkFDS19SRVEgPSAgMCwKLQlDT05UUk9MX0JBQ0ssCi0JQ09OVFJPTF9QU1BPTEwsCi0JQ09OVFJPTF9SVFMsCi0JQ09OVFJPTF9DVFMsCi0JQ09OVFJPTF9BQ0ssCi0JQ09OVFJPTF9DRkVORCwKLQlDT05UUk9MX0NGRU5EQUNLLAotCUNPTlRST0xfTUFYLAotfTsKLQotc3RydWN0IHRyYWZmaWNfc3RhdHMgewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0JdTMyIG1nbXRbTUFOQUdFTUVOVF9NQVhdOwotCXUzMiBjdHJsW0NPTlRST0xfTUFYXTsKLQl1MzIgZGF0YV9jbnQ7Ci0JdTY0IGRhdGFfYnl0ZXM7Ci0jZW5kaWYKLX07Ci0KLS8qCi0gKiBob3N0IGludGVycnVwdCB0aW1lb3V0IHZhbHVlCi0gKiB1c2VkIHdpdGggc2V0dGluZyBpbnRlcnJ1cHQgY29hbGVzY2luZyB0aW1lcgotICogdGhlIENTUl9JTlRfQ09BTEVTQ0lORyBpcyBhbiA4IGJpdCByZWdpc3RlciBpbiAzMi11c2VjIHVuaXQKLSAqCi0gKiBkZWZhdWx0IGludGVycnVwdCBjb2FsZXNjaW5nIHRpbWVyIGlzIDY0IHggMzIgPSAyMDQ4IHVzZWNzCi0gKiBkZWZhdWx0IGludGVycnVwdCBjb2FsZXNjaW5nIGNhbGlicmF0aW9uIHRpbWVyIGlzIDE2IHggMzIgPSA1MTIgdXNlY3MKLSAqLwotI2RlZmluZSBJV0xfSE9TVF9JTlRfVElNRU9VVF9NQVgJKDB4RkYpCi0jZGVmaW5lIElXTF9IT1NUX0lOVF9USU1FT1VUX0RFRgkoMHg0MCkKLSNkZWZpbmUgSVdMX0hPU1RfSU5UX1RJTUVPVVRfTUlOCSgweDApCi0jZGVmaW5lIElXTF9IT1NUX0lOVF9DQUxJQl9USU1FT1VUX01BWAkoMHhGRikKLSNkZWZpbmUgSVdMX0hPU1RfSU5UX0NBTElCX1RJTUVPVVRfREVGCSgweDEwKQotI2RlZmluZSBJV0xfSE9TVF9JTlRfQ0FMSUJfVElNRU9VVF9NSU4JKDB4MCkKLQotI2RlZmluZSBJV0xfREVMQVlfTkVYVF9GT1JDRV9GV19SRUxPQUQgKEhaKjUpCi0KLS8qIFRYIHF1ZXVlIHdhdGNoZG9nIHRpbWVvdXRzIGluIG1TZWNzICovCi0jZGVmaW5lIElXTF9ERUZfV0RfVElNRU9VVAkoMjAwMCkKLSNkZWZpbmUgSVdMX0xPTkdfV0RfVElNRU9VVAkoMTAwMDApCi0jZGVmaW5lIElXTF9NQVhfV0RfVElNRU9VVAkoMTIwMDAwKQotCi1zdHJ1Y3QgaXdsX2ZvcmNlX3Jlc2V0IHsKLQlpbnQgcmVzZXRfcmVxdWVzdF9jb3VudDsKLQlpbnQgcmVzZXRfc3VjY2Vzc19jb3VudDsKLQlpbnQgcmVzZXRfcmVqZWN0X2NvdW50OwotCXVuc2lnbmVkIGxvbmcgcmVzZXRfZHVyYXRpb247Ci0JdW5zaWduZWQgbG9uZyBsYXN0X2ZvcmNlX3Jlc2V0X2ppZmZpZXM7Ci19OwotCi0vKiBleHRlbmQgYmVhY29uIHRpbWUgZm9ybWF0IGJpdCBzaGlmdGluZyAgKi8KLS8qCi0gKiBmb3IgXzM5NDUgZGV2aWNlcwotICogYml0cyAzMToyNCAtIGV4dGVuZGVkCi0gKiBiaXRzIDIzOjAgIC0gaW50ZXJ2YWwKLSAqLwotI2RlZmluZSBJV0wzOTQ1X0VYVF9CRUFDT05fVElNRV9QT1MJMjQKLS8qCi0gKiBmb3IgXzQ5NjUgZGV2aWNlcwotICogYml0cyAzMToyMiAtIGV4dGVuZGVkCi0gKiBiaXRzIDIxOjAgIC0gaW50ZXJ2YWwKLSAqLwotI2RlZmluZSBJV0w0OTY1X0VYVF9CRUFDT05fVElNRV9QT1MJMjIKLQotZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIHsKLQlJV0xfUlhPTl9DVFhfQlNTLAotCi0JTlVNX0lXTF9SWE9OX0NUWAotfTsKLQotc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgewotCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7Ci0KLQljb25zdCB1OCAqYWNfdG9fZmlmbzsKLQljb25zdCB1OCAqYWNfdG9fcXVldWU7Ci0JdTggbWNhc3RfcXVldWU7Ci0KLQkvKgotCSAqIFdlIGNvdWxkIHVzZSB0aGUgdmlmIHRvIGluZGljYXRlIGFjdGl2ZSwgYnV0IHdlCi0JICogYWxzbyBuZWVkIGl0IHRvIGJlIGFjdGl2ZSBkdXJpbmcgZGlzYWJsaW5nIHdoZW4KLQkgKiB3ZSBhbHJlYWR5IHJlbW92ZWQgdGhlIHZpZiBmb3IgdHlwZSBzZXR0aW5nLgotCSAqLwotCWJvb2wgYWx3YXlzX2FjdGl2ZSwgaXNfYWN0aXZlOwotCi0JYm9vbCBodF9uZWVkX211bHRpcGxlX2NoYWluczsKLQotCWVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHhpZDsKLQotCXUzMiBpbnRlcmZhY2VfbW9kZXMsIGV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7Ci0JdTggdW51c2VkX2RldnR5cGUsIGFwX2RldnR5cGUsIGlic3NfZGV2dHlwZSwgc3RhdGlvbl9kZXZ0eXBlOwotCi0JLyoKLQkgKiBXZSBkZWNsYXJlIHRoaXMgY29uc3Qgc28gaXQgY2FuIG9ubHkgYmUKLQkgKiBjaGFuZ2VkIHZpYSBleHBsaWNpdCBjYXN0IHdpdGhpbiB0aGUKLQkgKiByb3V0aW5lcyB0aGF0IGFjdHVhbGx5IHVwZGF0ZSB0aGUgcGh5c2ljYWwKLQkgKiBoYXJkd2FyZS4KLQkgKi8KLQljb25zdCBzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCBhY3RpdmU7Ci0Jc3RydWN0IGl3bF9sZWdhY3lfcnhvbl9jbWQgc3RhZ2luZzsKLQotCXN0cnVjdCBpd2xfcnhvbl90aW1lX2NtZCB0aW1pbmc7Ci0KLQlzdHJ1Y3QgaXdsX3Fvc19pbmZvIHFvc19kYXRhOwotCi0JdTggYmNhc3Rfc3RhX2lkLCBhcF9zdGFfaWQ7Ci0KLQl1OCByeG9uX2NtZCwgcnhvbl9hc3NvY19jbWQsIHJ4b25fdGltaW5nX2NtZDsKLQl1OCBxb3NfY21kOwotCXU4IHdlcF9rZXlfY21kOwotCi0Jc3RydWN0IGl3bF93ZXBfa2V5IHdlcF9rZXlzW1dFUF9LRVlTX01BWF07Ci0JdTgga2V5X21hcHBpbmdfa2V5czsKLQotCV9fbGUzMiBzdGF0aW9uX2ZsYWdzOwotCi0Jc3RydWN0IHsKLQkJYm9vbCBub25fZ2Zfc3RhX3ByZXNlbnQ7Ci0JCXU4IHByb3RlY3Rpb247Ci0JCWJvb2wgZW5hYmxlZCwgaXNfNDBtaHo7Ci0JCXU4IGV4dGVuc2lvbl9jaGFuX29mZnNldDsKLQl9IGh0OwotfTsKLQotc3RydWN0IGl3bF9wcml2IHsKLQotCS8qIGllZWUgZGV2aWNlIHVzZWQgYnkgZ2VuZXJpYyBpZWVlIHByb2Nlc3NpbmcgY29kZSAqLwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqaWVlZV9jaGFubmVsczsKLQlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgKmllZWVfcmF0ZXM7Ci0Jc3RydWN0IGl3bF9jZmcgKmNmZzsKLQotCS8qIHRlbXBvcmFyeSBmcmFtZSBzdG9yYWdlIGxpc3QgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIGZyZWVfZnJhbWVzOwotCWludCBmcmFtZXNfY291bnQ7Ci0KLQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7Ci0JaW50IGFsbG9jX3J4Yl9wYWdlOwotCi0Jdm9pZCAoKnJ4X2hhbmRsZXJzW1JFUExZX01BWF0pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpOwotCi0Jc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKLQotCS8qIHNwZWN0cnVtIG1lYXN1cmVtZW50IHJlcG9ydCBjYWNoaW5nICovCi0Jc3RydWN0IGl3bF9zcGVjdHJ1bV9ub3RpZmljYXRpb24gbWVhc3VyZV9yZXBvcnQ7Ci0JdTggbWVhc3VyZW1lbnRfc3RhdHVzOwotCi0JLyogdWNvZGUgYmVhY29uIHRpbWUgKi8KLQl1MzIgdWNvZGVfYmVhY29uX3RpbWU7Ci0JaW50IG1pc3NlZF9iZWFjb25fdGhyZXNob2xkOwotCi0JLyogdHJhY2sgSUJTUyBtYW5hZ2VyIChsYXN0IGJlYWNvbikgc3RhdHVzICovCi0JdTMyIGlic3NfbWFuYWdlcjsKLQotCS8qIGZvcmNlIHJlc2V0ICovCi0Jc3RydWN0IGl3bF9mb3JjZV9yZXNldCBmb3JjZV9yZXNldDsKLQotCS8qIHdlIGFsbG9jYXRlIGFycmF5IG9mIGl3bF9jaGFubmVsX2luZm8gZm9yIE5JQydzIHZhbGlkIGNoYW5uZWxzLgotCSAqICAgIEFjY2VzcyB2aWEgY2hhbm5lbCAjIHVzaW5nIGluZGlyZWN0IGluZGV4IGFycmF5ICovCi0Jc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoYW5uZWxfaW5mbzsJLyogY2hhbm5lbCBpbmZvIGFycmF5ICovCi0JdTggY2hhbm5lbF9jb3VudDsJLyogIyBvZiBjaGFubmVscyAqLwotCi0JLyogdGhlcm1hbCBjYWxpYnJhdGlvbiAqLwotCXMzMiB0ZW1wZXJhdHVyZTsJLyogZGVncmVlcyBLZWx2aW4gKi8KLQlzMzIgbGFzdF90ZW1wZXJhdHVyZTsKLQotCS8qIGluaXQgY2FsaWJyYXRpb24gcmVzdWx0cyAqLwotCXN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0IGNhbGliX3Jlc3VsdHNbSVdMX0NBTElCX01BWF07Ci0KLQkvKiBTY2FuIHJlbGF0ZWQgdmFyaWFibGVzICovCi0JdW5zaWduZWQgbG9uZyBzY2FuX3N0YXJ0OwotCXVuc2lnbmVkIGxvbmcgc2Nhbl9zdGFydF90c2Y7Ci0Jdm9pZCAqc2Nhbl9jbWQ7Ci0JZW51bSBpZWVlODAyMTFfYmFuZCBzY2FuX2JhbmQ7Ci0Jc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqc2Nhbl9yZXF1ZXN0OwotCXN0cnVjdCBpZWVlODAyMTFfdmlmICpzY2FuX3ZpZjsKLQl1OCBzY2FuX3R4X2FudFtJRUVFODAyMTFfTlVNX0JBTkRTXTsKLQl1OCBtZ210X3R4X2FudDsKLQotCS8qIHNwaW5sb2NrICovCi0Jc3BpbmxvY2tfdCBsb2NrOwkvKiBwcm90ZWN0IGdlbmVyYWwgc2hhcmVkIGRhdGEgKi8KLQlzcGlubG9ja190IGhjbWRfbG9jazsJLyogcHJvdGVjdCBoY21kICovCi0Jc3BpbmxvY2tfdCByZWdfbG9jazsJLyogcHJvdGVjdCBodyByZWdpc3RlciBhY2Nlc3MgKi8KLQlzdHJ1Y3QgbXV0ZXggbXV0ZXg7Ci0KLQkvKiBiYXNpYyBwY2ktbmV0d29yayBkcml2ZXIgc3R1ZmYgKi8KLQlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKLQotCS8qIHBjaSBoYXJkd2FyZSBhZGRyZXNzIHN1cHBvcnQgKi8KLQl2b2lkIF9faW9tZW0gKmh3X2Jhc2U7Ci0JdTMyICBod19yZXY7Ci0JdTMyICBod193YV9yZXY7Ci0JdTggICByZXZfaWQ7Ci0KLQkvKiBtaWNyb2NvZGUvZGV2aWNlIHN1cHBvcnRzIG11bHRpcGxlIGNvbnRleHRzICovCi0JdTggdmFsaWRfY29udGV4dHM7Ci0KLQkvKiBjb21tYW5kIHF1ZXVlIG51bWJlciAqLwotCXU4IGNtZF9xdWV1ZTsKLQotCS8qIG1heCBudW1iZXIgb2Ygc3RhdGlvbiBrZXlzICovCi0JdTggc3RhX2tleV9tYXhfbnVtOwotCi0JLyogRUVQUk9NIE1BQyBhZGRyZXNzZXMgKi8KLQlzdHJ1Y3QgbWFjX2FkZHJlc3MgYWRkcmVzc2VzWzFdOwotCi0JLyogdUNvZGUgaW1hZ2VzLCBzYXZlIHRvIHJlbG9hZCBpbiBjYXNlIG9mIGZhaWx1cmUgKi8KLQlpbnQgZndfaW5kZXg7CQkJLyogZmlybXdhcmUgd2UncmUgdHJ5aW5nIHRvIGxvYWQgKi8KLQl1MzIgdWNvZGVfdmVyOwkJCS8qIHZlcnNpb24gb2YgdWNvZGUsIGNvcHkgb2YKLQkJCQkJICAgaXdsX3Vjb2RlLnZlciAqLwotCXN0cnVjdCBmd19kZXNjIHVjb2RlX2NvZGU7CS8qIHJ1bnRpbWUgaW5zdCAqLwotCXN0cnVjdCBmd19kZXNjIHVjb2RlX2RhdGE7CS8qIHJ1bnRpbWUgZGF0YSBvcmlnaW5hbCAqLwotCXN0cnVjdCBmd19kZXNjIHVjb2RlX2RhdGFfYmFja3VwOwkvKiBydW50aW1lIGRhdGEgc2F2ZS9yZXN0b3JlICovCi0Jc3RydWN0IGZ3X2Rlc2MgdWNvZGVfaW5pdDsJLyogaW5pdGlhbGl6YXRpb24gaW5zdCAqLwotCXN0cnVjdCBmd19kZXNjIHVjb2RlX2luaXRfZGF0YTsJLyogaW5pdGlhbGl6YXRpb24gZGF0YSAqLwotCXN0cnVjdCBmd19kZXNjIHVjb2RlX2Jvb3Q7CS8qIGJvb3RzdHJhcCBpbnN0ICovCi0JZW51bSB1Y29kZV90eXBlIHVjb2RlX3R5cGU7Ci0JdTggdWNvZGVfd3JpdGVfY29tcGxldGU7CS8qIHRoZSBpbWFnZSB3cml0ZSBpcyBjb21wbGV0ZSAqLwotCWNoYXIgZmlybXdhcmVfbmFtZVsyNV07Ci0KLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCBjb250ZXh0c1tOVU1fSVdMX1JYT05fQ1RYXTsKLQotCV9fbGUxNiBzd2l0Y2hfY2hhbm5lbDsKLQotCS8qIDFzdCByZXNwb25zZXMgZnJvbSBpbml0aWFsaXplIGFuZCBydW50aW1lIHVDb2RlIGltYWdlcy4KLQkgKiBfNDk2NSdzIGluaXRpYWxpemUgYWxpdmUgcmVzcG9uc2UgY29udGFpbnMgc29tZSBjYWxpYnJhdGlvbiBkYXRhLiAqLwotCXN0cnVjdCBpd2xfaW5pdF9hbGl2ZV9yZXNwIGNhcmRfYWxpdmVfaW5pdDsKLQlzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3AgY2FyZF9hbGl2ZTsKLQotCXUxNiBhY3RpdmVfcmF0ZTsKLQotCXU4IHN0YXJ0X2NhbGliOwotCXN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfZGF0YSBzZW5zaXRpdml0eV9kYXRhOwotCXN0cnVjdCBpd2xfY2hhaW5fbm9pc2VfZGF0YSBjaGFpbl9ub2lzZV9kYXRhOwotCV9fbGUxNiBzZW5zaXRpdml0eV90YmxbSERfVEFCTEVfU0laRV07Ci0KLQlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyBjdXJyZW50X2h0X2NvbmZpZzsKLQotCS8qIFJhdGUgc2NhbGluZyBkYXRhICovCi0JdTggcmV0cnlfcmF0ZTsKLQotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRfY29tbWFuZF9xdWV1ZTsKLQotCWludCBhY3Rpdml0eV90aW1lcl9hY3RpdmU7Ci0KLQkvKiBSeCBhbmQgVHggRE1BIHByb2Nlc3NpbmcgcXVldWVzICovCi0Jc3RydWN0IGl3bF9yeF9xdWV1ZSByeHE7Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxOwotCXVuc2lnbmVkIGxvbmcgdHhxX2N0eF9hY3RpdmVfbXNrOwotCXN0cnVjdCBpd2xfZG1hX3B0ciAga3c7CS8qIGtlZXAgd2FybSBhZGRyZXNzICovCi0Jc3RydWN0IGl3bF9kbWFfcHRyICBzY2RfYmNfdGJsczsKLQotCXUzMiBzY2RfYmFzZV9hZGRyOwkvKiBzY2hlZHVsZXIgc3JhbSBiYXNlIGFkZHJlc3MgKi8KLQotCXVuc2lnbmVkIGxvbmcgc3RhdHVzOwotCi0JLyogY291bnRzIG1nbXQsIGN0bCwgYW5kIGRhdGEgcGFja2V0cyAqLwotCXN0cnVjdCB0cmFmZmljX3N0YXRzIHR4X3N0YXRzOwotCXN0cnVjdCB0cmFmZmljX3N0YXRzIHJ4X3N0YXRzOwotCi0JLyogY291bnRzIGludGVycnVwdHMgKi8KLQlzdHJ1Y3QgaXNyX3N0YXRpc3RpY3MgaXNyX3N0YXRzOwotCi0Jc3RydWN0IGl3bF9wb3dlcl9tZ3IgcG93ZXJfZGF0YTsKLQotCS8qIGNvbnRleHQgaW5mb3JtYXRpb24gKi8KLQl1OCBic3NpZFtFVEhfQUxFTl07IC8qIHVzZWQgb25seSBvbiAzOTQ1IGJ1dCBmaWxsZWQgYnkgY29yZSAqLwotCi0JLyogc3RhdGlvbiB0YWJsZSB2YXJpYWJsZXMgKi8KLQotCS8qIE5vdGU6IGlmIGxvY2sgYW5kIHN0YV9sb2NrIGFyZSBuZWVkZWQsIGxvY2sgbXVzdCBiZSBhY3F1aXJlZCBmaXJzdCAqLwotCXNwaW5sb2NrX3Qgc3RhX2xvY2s7Ci0JaW50IG51bV9zdGF0aW9uczsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fZW50cnkgc3RhdGlvbnNbSVdMX1NUQVRJT05fQ09VTlRdOwotCXVuc2lnbmVkIGxvbmcgdWNvZGVfa2V5X3RhYmxlOwotCi0JLyogcXVldWUgcmVmY291bnRzICovCi0jZGVmaW5lIElXTF9NQVhfSFdfUVVFVUVTCTMyCi0JdW5zaWduZWQgbG9uZyBxdWV1ZV9zdG9wcGVkW0JJVFNfVE9fTE9OR1MoSVdMX01BWF9IV19RVUVVRVMpXTsKLQkvKiBmb3IgZWFjaCBBQyAqLwotCWF0b21pY190IHF1ZXVlX3N0b3BfY291bnRbNF07Ci0KLQkvKiBJbmRpY2F0aW9uIGlmIGllZWU4MDIxMV9vcHMtPm9wZW4gaGFzIGJlZW4gY2FsbGVkICovCi0JdTggaXNfb3BlbjsKLQotCXU4IG1hYzgwMjExX3JlZ2lzdGVyZWQ7Ci0KLQkvKiBlZXByb20gLS0gdGhpcyBpcyBpbiB0aGUgY2FyZCdzIGxpdHRsZSBlbmRpYW4gYnl0ZSBvcmRlciAqLwotCXU4ICplZXByb207Ci0Jc3RydWN0IGl3bF9lZXByb21fY2FsaWJfaW5mbyAqY2FsaWJfaW5mbzsKLQotCWVudW0gbmw4MDIxMV9pZnR5cGUgaXdfbW9kZTsKLQotCS8qIExhc3QgUngnZCBiZWFjb24gdGltZXN0YW1wICovCi0JdTY0IHRpbWVzdGFtcDsKLQotCXVuaW9uIHsKLSNpZiBkZWZpbmVkKENPTkZJR19JV0wzOTQ1KSB8fCBkZWZpbmVkKENPTkZJR19JV0wzOTQ1X01PRFVMRSkKLQkJc3RydWN0IHsKLQkJCXZvaWQgKnNoYXJlZF92aXJ0OwotCQkJZG1hX2FkZHJfdCBzaGFyZWRfcGh5czsKLQotCQkJc3RydWN0IGRlbGF5ZWRfd29yayB0aGVybWFsX3BlcmlvZGljOwotCQkJc3RydWN0IGRlbGF5ZWRfd29yayByZmtpbGxfcG9sbDsKLQotCQkJc3RydWN0IGl3bDM5NDVfbm90aWZfc3RhdGlzdGljcyBzdGF0aXN0aWNzOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTCi0JCQlzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzIGFjY3VtX3N0YXRpc3RpY3M7Ci0JCQlzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzIGRlbHRhX3N0YXRpc3RpY3M7Ci0JCQlzdHJ1Y3QgaXdsMzk0NV9ub3RpZl9zdGF0aXN0aWNzIG1heF9kZWx0YTsKLSNlbmRpZgotCi0JCQl1MzIgc3RhX3N1cHBfcmF0ZXM7Ci0JCQlpbnQgbGFzdF9yeF9yc3NpOwkvKiBGcm9tIFJ4IHBhY2tldCBzdGF0aXN0aWNzICovCi0KLQkJCS8qIFJ4J2QgcGFja2V0IHRpbWluZyBpbmZvcm1hdGlvbiAqLwotCQkJdTMyIGxhc3RfYmVhY29uX3RpbWU7Ci0JCQl1NjQgbGFzdF90c2Y7Ci0KLQkJCS8qCi0JCQkgKiBlYWNoIGNhbGlicmF0aW9uIGNoYW5uZWwgZ3JvdXAgaW4gdGhlCi0JCQkgKiBFRVBST00gaGFzIGEgZGVyaXZlZCBjbGlwIHNldHRpbmcgZm9yCi0JCQkgKiBlYWNoIHJhdGUuCi0JCQkgKi8KLQkJCWNvbnN0IHN0cnVjdCBpd2wzOTQ1X2NsaXBfZ3JvdXAgY2xpcF9ncm91cHNbNV07Ci0KLQkJfSBfMzk0NTsKLSNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0lXTDQ5NjUpIHx8IGRlZmluZWQoQ09ORklHX0lXTDQ5NjVfTU9EVUxFKQotCQlzdHJ1Y3QgewotCQkJc3RydWN0IGl3bF9yeF9waHlfcmVzIGxhc3RfcGh5X3JlczsKLQkJCWJvb2wgbGFzdF9waHlfcmVzX3ZhbGlkOwotCi0JCQlzdHJ1Y3QgY29tcGxldGlvbiBmaXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlOwotCi0JCQkvKgotCQkJICogY2hhaW4gbm9pc2UgcmVzZXQgYW5kIGdhaW4gY29tbWFuZHMgYXJlIHRoZQotCQkJICogdHdvIGV4dHJhIGNhbGlicmF0aW9uIGNvbW1hbmRzIGZvbGxvd3MgdGhlIHN0YW5kYXJkCi0JCQkgKiBwaHkgY2FsaWJyYXRpb24gY29tbWFuZHMKLQkJCSAqLwotCQkJdTggcGh5X2NhbGliX2NoYWluX25vaXNlX3Jlc2V0X2NtZDsKLQkJCXU4IHBoeV9jYWxpYl9jaGFpbl9ub2lzZV9nYWluX2NtZDsKLQotCQkJc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIHN0YXRpc3RpY3M7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQkJCXN0cnVjdCBpd2xfbm90aWZfc3RhdGlzdGljcyBhY2N1bV9zdGF0aXN0aWNzOwotCQkJc3RydWN0IGl3bF9ub3RpZl9zdGF0aXN0aWNzIGRlbHRhX3N0YXRpc3RpY3M7Ci0JCQlzdHJ1Y3QgaXdsX25vdGlmX3N0YXRpc3RpY3MgbWF4X2RlbHRhOwotI2VuZGlmCi0KLQkJfSBfNDk2NTsKLSNlbmRpZgotCX07Ci0KLQlzdHJ1Y3QgaXdsX2h3X3BhcmFtcyBod19wYXJhbXM7Ci0KLQl1MzIgaW50YV9tYXNrOwotCi0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKLQotCXN0cnVjdCB3b3JrX3N0cnVjdCByZXN0YXJ0OwotCXN0cnVjdCB3b3JrX3N0cnVjdCBzY2FuX2NvbXBsZXRlZDsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcnhfcmVwbGVuaXNoOwotCXN0cnVjdCB3b3JrX3N0cnVjdCBhYm9ydF9zY2FuOwotCi0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmJlYWNvbl9jdHg7Ci0Jc3RydWN0IHNrX2J1ZmYgKmJlYWNvbl9za2I7Ci0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhfZmx1c2g7Ci0KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXJxX3Rhc2tsZXQ7Ci0KLQlzdHJ1Y3QgZGVsYXllZF93b3JrIGluaXRfYWxpdmVfc3RhcnQ7Ci0Jc3RydWN0IGRlbGF5ZWRfd29yayBhbGl2ZV9zdGFydDsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrIHNjYW5fY2hlY2s7Ci0KLQkvKiBUWCBQb3dlciAqLwotCXM4IHR4X3Bvd2VyX3VzZXJfbG10OwotCXM4IHR4X3Bvd2VyX2RldmljZV9sbXQ7Ci0JczggdHhfcG93ZXJfbmV4dDsKLQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JLyogZGVidWdnaW5nIGluZm8gKi8KLQl1MzIgZGVidWdfbGV2ZWw7IC8qIHBlciBkZXZpY2UgZGVidWdnaW5nIHdpbGwgb3ZlcnJpZGUgZ2xvYmFsCi0JCQkgICAgaXdsZWdhY3lfZGVidWdfbGV2ZWwgaWYgc2V0ICovCi0jZW5kaWYgLyogQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHICovCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHRlMKLQkvKiBkZWJ1Z2ZzICovCi0JdTE2IHR4X3RyYWZmaWNfaWR4OwotCXUxNiByeF90cmFmZmljX2lkeDsKLQl1OCAqdHhfdHJhZmZpYzsKLQl1OCAqcnhfdHJhZmZpYzsKLQlzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2RpcjsKLQl1MzIgZGJnZnNfc3JhbV9vZmZzZXQsIGRiZ2ZzX3NyYW1fbGVuOwotCWJvb2wgZGlzYWJsZV9odDQwOwotI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVR0ZTICovCi0KLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgdHhwb3dlcl93b3JrOwotCXUzMiBkaXNhYmxlX3NlbnNfY2FsOwotCXUzMiBkaXNhYmxlX2NoYWluX25vaXNlX2NhbDsKLQl1MzIgZGlzYWJsZV90eF9wb3dlcl9jYWw7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHJ1bl90aW1lX2NhbGliX3dvcms7Ci0Jc3RydWN0IHRpbWVyX2xpc3Qgc3RhdGlzdGljc19wZXJpb2RpYzsKLQlzdHJ1Y3QgdGltZXJfbGlzdCB3YXRjaGRvZzsKLQlib29sIGh3X3JlYWR5OwotCi0Jc3RydWN0IGxlZF9jbGFzc2RldiBsZWQ7Ci0JdW5zaWduZWQgbG9uZyBibGlua19vbiwgYmxpbmtfb2ZmOwotCWJvb2wgbGVkX3JlZ2lzdGVyZWQ7Ci19OyAvKml3bF9wcml2ICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfdHhxX2N0eF9hY3RpdmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQpCi17Ci0Jc2V0X2JpdCh0eHFfaWQsICZwcml2LT50eHFfY3R4X2FjdGl2ZV9tc2spOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX3R4cV9jdHhfZGVhY3RpdmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQpCi17Ci0JY2xlYXJfYml0KHR4cV9pZCwgJnByaXYtPnR4cV9jdHhfYWN0aXZlX21zayk7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLS8qCi0gKiBpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbDogUmV0dXJuIGFjdGl2ZSBkZWJ1ZyBsZXZlbCBmb3IgZGV2aWNlCi0gKgotICogVXNpbmcgc3lzZnMgaXQgaXMgcG9zc2libGUgdG8gc2V0IHBlciBkZXZpY2UgZGVidWcgbGV2ZWwuIFRoaXMgZGVidWcKLSAqIGxldmVsIHdpbGwgYmUgdXNlZCBpZiBzZXQsIG90aGVyd2lzZSB0aGUgZ2xvYmFsIGRlYnVnIGxldmVsIHdoaWNoIGNhbiBiZQotICogc2V0IHZpYSBtb2R1bGUgcGFyYW1ldGVyIGlzIHVzZWQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpZiAocHJpdi0+ZGVidWdfbGV2ZWwpCi0JCXJldHVybiBwcml2LT5kZWJ1Z19sZXZlbDsKLQllbHNlCi0JCXJldHVybiBpd2xlZ2FjeV9kZWJ1Z19sZXZlbDsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcmV0dXJuIGl3bGVnYWN5X2RlYnVnX2xldmVsOwotfQotI2VuZGlmCi0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqCi1pd2xfbGVnYWN5X3R4X3F1ZXVlX2dldF9oZHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkJIGludCB0eHFfaWQsIGludCBpZHgpCi17Ci0JaWYgKHByaXYtPnR4cVt0eHFfaWRdLnR4YltpZHhdLnNrYikKLQkJcmV0dXJuIChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXByaXYtPnR4cVt0eHFfaWRdLgotCQkJCXR4YltpZHhdLnNrYi0+ZGF0YTsKLQlyZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqCi1pd2xfbGVnYWN5X3J4b25fY3R4X2Zyb21fdmlmKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7Ci0KLQlyZXR1cm4gdmlmX3ByaXYtPmN0eDsKLX0KLQotI2RlZmluZSBmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkJCQkJXAotCWZvciAoY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwkJXAotCSAgICAgY3R4IDwgJnByaXYtPmNvbnRleHRzW05VTV9JV0xfUlhPTl9DVFhdOyBjdHgrKykJXAotCQlpZiAocHJpdi0+dmFsaWRfY29udGV4dHMgJiBCSVQoY3R4LT5jdHhpZCkpCi0KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHhpZCkKLXsKLQlyZXR1cm4gKHByaXYtPmNvbnRleHRzW2N0eGlkXS5hY3RpdmUuZmlsdGVyX2ZsYWdzICYKLQkJCVJYT05fRklMVEVSX0FTU09DX01TSykgPyAxIDogMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19hbnlfYXNzb2NpYXRlZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcmV0dXJuIGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkX2N0eChzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQotewotCXJldHVybiAoY3R4LT5hY3RpdmUuZmlsdGVyX2ZsYWdzICYgUlhPTl9GSUxURVJfQVNTT0NfTVNLKSA/IDEgOiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8pCi17Ci0JaWYgKGNoX2luZm8gPT0gTlVMTCkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIChjaF9pbmZvLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX1ZBTElEKSA/IDEgOiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfcmFkYXIoY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8pCi17Ci0JcmV0dXJuIChjaF9pbmZvLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX1JBREFSKSA/IDEgOiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IGl3bF9sZWdhY3lfaXNfY2hhbm5lbF9hX2JhbmQoY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm8pCi17Ci0JcmV0dXJuIGNoX2luZm8tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWjsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWl3bF9sZWdhY3lfaXNfY2hhbm5lbF9wYXNzaXZlKGNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaCkKLXsKLQlyZXR1cm4gKCEoY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfQUNUSVZFKSkgPyAxIDogMDsKLX0KLQotc3RhdGljIGlubGluZSBpbnQKLWl3bF9sZWdhY3lfaXNfY2hhbm5lbF9pYnNzKGNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaCkKLXsKLQlyZXR1cm4gKGNoLT5mbGFncyAmIEVFUFJPTV9DSEFOTkVMX0lCU1MpID8gMSA6IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotX19pd2xfbGVnYWN5X2ZyZWVfcGFnZXMoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgcGFnZSAqcGFnZSkKLXsKLQlfX2ZyZWVfcGFnZXMocGFnZSwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIpOwotCXByaXYtPmFsbG9jX3J4Yl9wYWdlLS07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2ZyZWVfcGFnZXMoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1bnNpZ25lZCBsb25nIHBhZ2UpCi17Ci0JZnJlZV9wYWdlcyhwYWdlLCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7Ci0JcHJpdi0+YWxsb2NfcnhiX3BhZ2UtLTsKLX0KLSNlbmRpZgkJCQkvKiBfX2l3bF9sZWdhY3lfZGV2X2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWRldnRyYWNlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNlYzk5MS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuYworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0KLS8qIHNwYXJzZSBkb2Vzbid0IGxpa2UgdHJhY2Vwb2ludCBtYWNyb3MgKi8KLSNpZm5kZWYgX19DSEVDS0VSX18KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0KLSNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwotI2luY2x1ZGUgIml3bC1kZXZ0cmFjZS5oIgotCi1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9sZWdhY3lfZGV2X2lvd3JpdGU4KTsKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2xlZ2FjeV9kZXZfaW9yZWFkMzIpOwotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfbGVnYWN5X2Rldl9pb3dyaXRlMzIpOwotRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MKGl3bHdpZmlfbGVnYWN5X2Rldl9yeCk7Ci1FWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woaXdsd2lmaV9sZWdhY3lfZGV2X3R4KTsKLUVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTChpd2x3aWZpX2xlZ2FjeV9kZXZfdWNvZGVfZXJyb3IpOwotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZGV2dHJhY2UuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXZ0cmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDQzNzI1Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1kZXZ0cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWYgIWRlZmluZWQoX19JV0xXSUZJX0xFR0FDWV9ERVZJQ0VfVFJBQ0UpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCi0jZGVmaW5lIF9fSVdMV0lGSV9MRUdBQ1lfREVWSUNFX1RSQUNFCi0KLSNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+Ci0KLSNpZiAhZGVmaW5lZChDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVWSUNFX1RSQUNJTkcpIHx8IGRlZmluZWQoX19DSEVDS0VSX18pCi0jdW5kZWYgVFJBQ0VfRVZFTlQKLSNkZWZpbmUgVFJBQ0VfRVZFTlQobmFtZSwgcHJvdG8sIC4uLikgXAotc3RhdGljIGlubGluZSB2b2lkIHRyYWNlXyAjIyBuYW1lKHByb3RvKSB7fQotI2VuZGlmCi0KLQotI2RlZmluZSBQUklWX0VOVFJZCV9fZmllbGQoc3RydWN0IGl3bF9wcml2ICosIHByaXYpCi0jZGVmaW5lIFBSSVZfQVNTSUdOCShfX2VudHJ5LT5wcml2ID0gcHJpdikKLQotI3VuZGVmIFRSQUNFX1NZU1RFTQotI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaV9sZWdhY3lfaW8KLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9sZWdhY3lfZGV2X2lvcmVhZDMyLAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mZnMsIHUzMiB2YWwpLAotCVRQX0FSR1MocHJpdiwgb2ZmcywgdmFsKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlQUklWX0VOVFJZCi0JCV9fZmllbGQodTMyLCBvZmZzKQotCQlfX2ZpZWxkKHUzMiwgdmFsKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOwotCQlfX2VudHJ5LT5vZmZzID0gb2ZmczsKLQkJX19lbnRyeS0+dmFsID0gdmFsOwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIHJlYWQgaW9bJSN4XSA9ICUjeCIsIF9fZW50cnktPnByaXYsCi0JCQkJCV9fZW50cnktPm9mZnMsIF9fZW50cnktPnZhbCkKLSk7Ci0KLVRSQUNFX0VWRU5UKGl3bHdpZmlfbGVnYWN5X2Rldl9pb3dyaXRlOCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZmZzLCB1OCB2YWwpLAotCVRQX0FSR1MocHJpdiwgb2ZmcywgdmFsKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlQUklWX0VOVFJZCi0JCV9fZmllbGQodTMyLCBvZmZzKQotCQlfX2ZpZWxkKHU4LCB2YWwpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJUFJJVl9BU1NJR047Ci0JCV9fZW50cnktPm9mZnMgPSBvZmZzOwotCQlfX2VudHJ5LT52YWwgPSB2YWw7Ci0JKSwKLQlUUF9wcmludGsoIlslcF0gd3JpdGUgaW9bJSN4XSA9ICUjeCkiLCBfX2VudHJ5LT5wcml2LAotCQkJCQlfX2VudHJ5LT5vZmZzLCBfX2VudHJ5LT52YWwpCi0pOwotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2xlZ2FjeV9kZXZfaW93cml0ZTMyLAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mZnMsIHUzMiB2YWwpLAotCVRQX0FSR1MocHJpdiwgb2ZmcywgdmFsKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlQUklWX0VOVFJZCi0JCV9fZmllbGQodTMyLCBvZmZzKQotCQlfX2ZpZWxkKHUzMiwgdmFsKQotCSksCi0JVFBfZmFzdF9hc3NpZ24oCi0JCVBSSVZfQVNTSUdOOwotCQlfX2VudHJ5LT5vZmZzID0gb2ZmczsKLQkJX19lbnRyeS0+dmFsID0gdmFsOwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIHdyaXRlIGlvWyUjeF0gPSAlI3gpIiwgX19lbnRyeS0+cHJpdiwKLQkJCQkJX19lbnRyeS0+b2ZmcywgX19lbnRyeS0+dmFsKQotKTsKLQotI3VuZGVmIFRSQUNFX1NZU1RFTQotI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaV9sZWdhY3lfdWNvZGUKLQotI3VuZGVmIFRSQUNFX1NZU1RFTQotI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaQotCi1UUkFDRV9FVkVOVChpd2x3aWZpX2xlZ2FjeV9kZXZfaGNtZCwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKmhjbWQsIHNpemVfdCBsZW4sIHUzMiBmbGFncyksCi0JVFBfQVJHUyhwcml2LCBoY21kLCBsZW4sIGZsYWdzKSwKLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlQUklWX0VOVFJZCi0JCV9fZHluYW1pY19hcnJheSh1OCwgaGNtZCwgbGVuKQotCQlfX2ZpZWxkKHUzMiwgZmxhZ3MpCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJUFJJVl9BU1NJR047Ci0JCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KGhjbWQpLCBoY21kLCBsZW4pOwotCQlfX2VudHJ5LT5mbGFncyA9IGZsYWdzOwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIGhjbWQgJSMuMnggKCVzc3luYykiLAotCQkgIF9fZW50cnktPnByaXYsICgodTggKilfX2dldF9keW5hbWljX2FycmF5KGhjbWQpKVswXSwKLQkJICBfX2VudHJ5LT5mbGFncyAmIENNRF9BU1lOQyA/ICJhIiA6ICIiKQotKTsKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9sZWdhY3lfZGV2X3J4LAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdm9pZCAqcnhidWYsIHNpemVfdCBsZW4pLAotCVRQX0FSR1MocHJpdiwgcnhidWYsIGxlbiksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQotCQlfX2R5bmFtaWNfYXJyYXkodTgsIHJ4YnVmLCBsZW4pCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJUFJJVl9BU1NJR047Ci0JCW1lbWNweShfX2dldF9keW5hbWljX2FycmF5KHJ4YnVmKSwgcnhidWYsIGxlbik7Ci0JKSwKLQlUUF9wcmludGsoIlslcF0gUlggY21kICUjLjJ4IiwKLQkJICBfX2VudHJ5LT5wcml2LCAoKHU4ICopX19nZXRfZHluYW1pY19hcnJheShyeGJ1ZikpWzRdKQotKTsKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9sZWdhY3lfZGV2X3R4LAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdm9pZCAqdGZkLCBzaXplX3QgdGZkbGVuLAotCQkgdm9pZCAqYnVmMCwgc2l6ZV90IGJ1ZjBfbGVuLAotCQkgdm9pZCAqYnVmMSwgc2l6ZV90IGJ1ZjFfbGVuKSwKLQlUUF9BUkdTKHByaXYsIHRmZCwgdGZkbGVuLCBidWYwLCBidWYwX2xlbiwgYnVmMSwgYnVmMV9sZW4pLAotCVRQX1NUUlVDVF9fZW50cnkoCi0JCVBSSVZfRU5UUlkKLQotCQlfX2ZpZWxkKHNpemVfdCwgZnJhbWVsZW4pCi0JCV9fZHluYW1pY19hcnJheSh1OCwgdGZkLCB0ZmRsZW4pCi0KLQkJLyoKLQkJICogRG8gbm90IGluc2VydCBiZXR3ZWVuIG9yIGJlbG93IHRoZXNlIGl0ZW1zLAotCQkgKiB3ZSB3YW50IHRvIGtlZXAgdGhlIGZyYW1lIHRvZ2V0aGVyIChleGNlcHQKLQkJICogZm9yIHRoZSBwb3NzaWJsZSBwYWRkaW5nKS4KLQkJICovCi0JCV9fZHluYW1pY19hcnJheSh1OCwgYnVmMCwgYnVmMF9sZW4pCi0JCV9fZHluYW1pY19hcnJheSh1OCwgYnVmMSwgYnVmMV9sZW4pCi0JKSwKLQlUUF9mYXN0X2Fzc2lnbigKLQkJUFJJVl9BU1NJR047Ci0JCV9fZW50cnktPmZyYW1lbGVuID0gYnVmMF9sZW4gKyBidWYxX2xlbjsKLQkJbWVtY3B5KF9fZ2V0X2R5bmFtaWNfYXJyYXkodGZkKSwgdGZkLCB0ZmRsZW4pOwotCQltZW1jcHkoX19nZXRfZHluYW1pY19hcnJheShidWYwKSwgYnVmMCwgYnVmMF9sZW4pOwotCQltZW1jcHkoX19nZXRfZHluYW1pY19hcnJheShidWYxKSwgYnVmMSwgYnVmMV9sZW4pOwotCSksCi0JVFBfcHJpbnRrKCJbJXBdIFRYICUuMnggKCV6dSBieXRlcykiLAotCQkgIF9fZW50cnktPnByaXYsCi0JCSAgKCh1OCAqKV9fZ2V0X2R5bmFtaWNfYXJyYXkoYnVmMCkpWzBdLAotCQkgIF9fZW50cnktPmZyYW1lbGVuKQotKTsKLQotVFJBQ0VfRVZFTlQoaXdsd2lmaV9sZWdhY3lfZGV2X3Vjb2RlX2Vycm9yLAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGRlc2MsIHUzMiB0aW1lLAotCQkgdTMyIGRhdGExLCB1MzIgZGF0YTIsIHUzMiBsaW5lLCB1MzIgYmxpbmsxLAotCQkgdTMyIGJsaW5rMiwgdTMyIGlsaW5rMSwgdTMyIGlsaW5rMiksCi0JVFBfQVJHUyhwcml2LCBkZXNjLCB0aW1lLCBkYXRhMSwgZGF0YTIsIGxpbmUsCi0JCWJsaW5rMSwgYmxpbmsyLCBpbGluazEsIGlsaW5rMiksCi0JVFBfU1RSVUNUX19lbnRyeSgKLQkJUFJJVl9FTlRSWQotCQlfX2ZpZWxkKHUzMiwgZGVzYykKLQkJX19maWVsZCh1MzIsIHRpbWUpCi0JCV9fZmllbGQodTMyLCBkYXRhMSkKLQkJX19maWVsZCh1MzIsIGRhdGEyKQotCQlfX2ZpZWxkKHUzMiwgbGluZSkKLQkJX19maWVsZCh1MzIsIGJsaW5rMSkKLQkJX19maWVsZCh1MzIsIGJsaW5rMikKLQkJX19maWVsZCh1MzIsIGlsaW5rMSkKLQkJX19maWVsZCh1MzIsIGlsaW5rMikKLQkpLAotCVRQX2Zhc3RfYXNzaWduKAotCQlQUklWX0FTU0lHTjsKLQkJX19lbnRyeS0+ZGVzYyA9IGRlc2M7Ci0JCV9fZW50cnktPnRpbWUgPSB0aW1lOwotCQlfX2VudHJ5LT5kYXRhMSA9IGRhdGExOwotCQlfX2VudHJ5LT5kYXRhMiA9IGRhdGEyOwotCQlfX2VudHJ5LT5saW5lID0gbGluZTsKLQkJX19lbnRyeS0+YmxpbmsxID0gYmxpbmsxOwotCQlfX2VudHJ5LT5ibGluazIgPSBibGluazI7Ci0JCV9fZW50cnktPmlsaW5rMSA9IGlsaW5rMTsKLQkJX19lbnRyeS0+aWxpbmsyID0gaWxpbmsyOwotCSksCi0JVFBfcHJpbnRrKCJbJXBdICMlMDJkICUwMTB1IGRhdGEgMHglMDhYIDB4JTA4WCBsaW5lICV1LCAiCi0JCSAgImJsaW5rIDB4JTA1WCAweCUwNVggaWxpbmsgMHglMDVYIDB4JTA1WCIsCi0JCSAgX19lbnRyeS0+cHJpdiwgX19lbnRyeS0+ZGVzYywgX19lbnRyeS0+dGltZSwgX19lbnRyeS0+ZGF0YTEsCi0JCSAgX19lbnRyeS0+ZGF0YTIsIF9fZW50cnktPmxpbmUsIF9fZW50cnktPmJsaW5rMSwKLQkJICBfX2VudHJ5LT5ibGluazIsIF9fZW50cnktPmlsaW5rMSwgX19lbnRyeS0+aWxpbmsyKQotKTsKLQotI2VuZGlmIC8qIF9fSVdMV0lGSV9ERVZJQ0VfVFJBQ0UgKi8KLQotI3VuZGVmIFRSQUNFX0lOQ0xVREVfUEFUSAotI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLgotI3VuZGVmIFRSQUNFX0lOQ0xVREVfRklMRQotI2RlZmluZSBUUkFDRV9JTkNMVURFX0ZJTEUgaXdsLWRldnRyYWNlCi0jaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZWVwcm9tLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZWVwcm9tLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZjNmNDkuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgotICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKiBCU0QgTElDRU5TRQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1jb21tYW5kcy5oIgotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1kZWJ1Zy5oIgotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqIEVFUFJPTSBCQU5EUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogVGhlIGl3bGVnYWN5X2VlcHJvbV9iYW5kIGRlZmluaXRpb25zIGJlbG93IHByb3ZpZGUgdGhlIG1hcHBpbmcgZnJvbSB0aGUKLSAqIEVFUFJPTSBjb250ZW50cyB0byB0aGUgc3BlY2lmaWMgY2hhbm5lbCBudW1iZXIgc3VwcG9ydGVkIGZvciBlYWNoCi0gKiBiYW5kLgotICoKLSAqIEZvciBleGFtcGxlLCBpd2xfcHJpdi0+ZWVwcm9tLmJhbmRfM19jaGFubmVsc1s0XSBmcm9tIHRoZSBiYW5kXzMKLSAqIGRlZmluaXRpb24gYmVsb3cgbWFwcyB0byBwaHlzaWNhbCBjaGFubmVsIDQyIGluIHRoZSA1LjJHSHogc3BlY3RydW0uCi0gKiBUaGUgc3BlY2lmaWMgZ2VvZ3JhcGh5IGFuZCBjYWxpYnJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhhdCBjaGFubmVsCi0gKiBpcyBjb250YWluZWQgaW4gdGhlIGVlcHJvbSBtYXAgaXRzZWxmLgotICoKLSAqIER1cmluZyBpbml0LCB3ZSBjb3B5IHRoZSBlZXByb20gaW5mb3JtYXRpb24gYW5kIGNoYW5uZWwgbWFwCi0gKiBpbmZvcm1hdGlvbiBpbnRvIHByaXYtPmNoYW5uZWxfaW5mb18yNC81MiBhbmQgcHJpdi0+Y2hhbm5lbF9tYXBfMjQvNTIKLSAqCi0gKiBjaGFubmVsX21hcF8yNC81MiBwcm92aWRlcyB0aGUgaW5kZXggaW4gdGhlIGNoYW5uZWxfaW5mbyBhcnJheSBmb3IgYQotICogZ2l2ZW4gY2hhbm5lbC4gIFdlIGhhdmUgdG8gaGF2ZSB0d28gc2VwYXJhdGUgbWFwcyBhcyB0aGVyZSBpcyBjaGFubmVsCi0gKiBvdmVybGFwIHdpdGggdGhlIDIuNEdIeiBhbmQgNS4yR0h6IHNwZWN0cnVtIGFzIHNlZW4gaW4gYmFuZF8xIGFuZAotICogYmFuZF8yCi0gKgotICogQSB2YWx1ZSBvZiAweGZmIHN0b3JlZCBpbiB0aGUgY2hhbm5lbF9tYXAgaW5kaWNhdGVzIHRoYXQgdGhlIGNoYW5uZWwKLSAqIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlIGF0IGFsbC4KLSAqCi0gKiBBIHZhbHVlIG9mIDB4ZmUgaW4gdGhlIGNoYW5uZWxfbWFwIGluZGljYXRlcyB0aGF0IHRoZSBjaGFubmVsIGlzIG5vdAotICogdmFsaWQgZm9yIFR4IHdpdGggdGhlIGN1cnJlbnQgaGFyZHdhcmUuICBUaGlzIG1lYW5zIHRoYXQKLSAqIHdoaWxlIHRoZSBzeXN0ZW0gY2FuIHR1bmUgYW5kIHJlY2VpdmUgb24gYSBnaXZlbiBjaGFubmVsLCBpdCBtYXkgbm90Ci0gKiBiZSBhYmxlIHRvIGFzc29jaWF0ZSBvciB0cmFuc21pdCBhbnkgZnJhbWVzIG9uIHRoYXQKLSAqIGNoYW5uZWwuICBUaGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIGNoYW5uZWwgaW5mb3JtYXRpb24gZm9yIHRoYXQKLSAqIGVudHJ5LgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIDIuNCBHSHogKi8KLWNvbnN0IHU4IGl3bGVnYWN5X2VlcHJvbV9iYW5kXzFbMTRdID0gewotCTEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNAotfTsKLQotLyogNS4yIEdIeiBiYW5kcyAqLwotc3RhdGljIGNvbnN0IHU4IGl3bGVnYWN5X2VlcHJvbV9iYW5kXzJbXSA9IHsJLyogNDkxNS01MDgwTUh6ICovCi0JMTgzLCAxODQsIDE4NSwgMTg3LCAxODgsIDE4OSwgMTkyLCAxOTYsIDcsIDgsIDExLCAxMiwgMTYKLX07Ci0KLXN0YXRpYyBjb25zdCB1OCBpd2xlZ2FjeV9lZXByb21fYmFuZF8zW10gPSB7CS8qIDUxNzAtNTMyME1IeiAqLwotCTM0LCAzNiwgMzgsIDQwLCA0MiwgNDQsIDQ2LCA0OCwgNTIsIDU2LCA2MCwgNjQKLX07Ci0KLXN0YXRpYyBjb25zdCB1OCBpd2xlZ2FjeV9lZXByb21fYmFuZF80W10gPSB7CS8qIDU1MDAtNTcwME1IeiAqLwotCTEwMCwgMTA0LCAxMDgsIDExMiwgMTE2LCAxMjAsIDEyNCwgMTI4LCAxMzIsIDEzNiwgMTQwCi19OwotCi1zdGF0aWMgY29uc3QgdTggaXdsZWdhY3lfZWVwcm9tX2JhbmRfNVtdID0gewkvKiA1NzI1LTU4MjVNSHogKi8KLQkxNDUsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci19OwotCi1zdGF0aWMgY29uc3QgdTggaXdsZWdhY3lfZWVwcm9tX2JhbmRfNltdID0geyAgICAgICAvKiAyLjQgaHQ0MCBjaGFubmVsICovCi0JMSwgMiwgMywgNCwgNSwgNiwgNwotfTsKLQotc3RhdGljIGNvbnN0IHU4IGl3bGVnYWN5X2VlcHJvbV9iYW5kXzdbXSA9IHsgICAgICAgLyogNS4yIGh0NDAgY2hhbm5lbCAqLwotCTM2LCA0NCwgNTIsIDYwLCAxMDAsIDEwOCwgMTE2LCAxMjQsIDEzMiwgMTQ5LCAxNTcKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBFRVBST00gcmVsYXRlZCBmdW5jdGlvbnMKLSAqCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV9lZXByb21fdmVyaWZ5X3NpZ25hdHVyZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTMyIGdwID0gaXdsX3JlYWQzMihwcml2LCBDU1JfRUVQUk9NX0dQKSAmIENTUl9FRVBST01fR1BfVkFMSURfTVNLOwotCWludCByZXQgPSAwOwotCi0JSVdMX0RFQlVHX0VFUFJPTShwcml2LCAiRUVQUk9NIHNpZ25hdHVyZT0weCUwOHhcbiIsIGdwKTsKLQlzd2l0Y2ggKGdwKSB7Ci0JY2FzZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9MRVNTX1RIQU5fNEs6Ci0JY2FzZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9NT1JFX1RIQU5fNEs6Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgImJhZCBFRVBST00gc2lnbmF0dXJlLCIKLQkJCSJFRVBST01fR1A9MHglMDh4XG4iLCBncCk7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi1jb25zdCB1OAotKml3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5X2FkZHIoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCBzaXplX3Qgb2Zmc2V0KQotewotCUJVR19PTihvZmZzZXQgPj0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemUpOwotCXJldHVybiAmcHJpdi0+ZWVwcm9tW29mZnNldF07Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5X2FkZHIpOwotCi11MTYgaXdsX2xlZ2FjeV9lZXByb21fcXVlcnkxNihjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHNpemVfdCBvZmZzZXQpCi17Ci0JaWYgKCFwcml2LT5lZXByb20pCi0JCXJldHVybiAwOwotCXJldHVybiAodTE2KXByaXYtPmVlcHJvbVtvZmZzZXRdIHwgKCh1MTYpcHJpdi0+ZWVwcm9tW29mZnNldCArIDFdIDw8IDgpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeTE2KTsKLQotLyoqCi0gKiBpd2xfbGVnYWN5X2VlcHJvbV9pbml0IC0gcmVhZCBFRVBST00gY29udGVudHMKLSAqCi0gKiBMb2FkIHRoZSBFRVBST00gY29udGVudHMgZnJvbSBhZGFwdGVyIGludG8gcHJpdi0+ZWVwcm9tCi0gKgotICogTk9URTogIFRoaXMgcm91dGluZSB1c2VzIHRoZSBub24tZGVidWcgSU8gYWNjZXNzIGZ1bmN0aW9ucy4KLSAqLwotaW50IGl3bF9sZWdhY3lfZWVwcm9tX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCV9fbGUxNiAqZTsKLQl1MzIgZ3AgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9FRVBST01fR1ApOwotCWludCBzejsKLQlpbnQgcmV0OwotCXUxNiBhZGRyOwotCi0JLyogYWxsb2NhdGUgZWVwcm9tICovCi0Jc3ogPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZTsKLQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJOVk0gc2l6ZSA9ICVkXG4iLCBzeik7Ci0JcHJpdi0+ZWVwcm9tID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT5lZXByb20pIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBhbGxvY19lcnI7Ci0JfQotCWUgPSAoX19sZTE2ICopcHJpdi0+ZWVwcm9tOwotCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+YXBtX29wcy5pbml0KHByaXYpOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9lZXByb21fdmVyaWZ5X3NpZ25hdHVyZShwcml2KTsKLQlpZiAocmV0IDwgMCkgewotCQlJV0xfRVJSKHByaXYsICJFRVBST00gbm90IGZvdW5kLCBFRVBST01fR1A9MHglMDh4XG4iLCBncCk7Ci0JCXJldCA9IC1FTk9FTlQ7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIE1ha2Ugc3VyZSBkcml2ZXIgKGluc3RlYWQgb2YgdUNvZGUpIGlzIGFsbG93ZWQgdG8gcmVhZCBFRVBST00gKi8KLQlyZXQgPSBwcml2LT5jZmctPm9wcy0+bGliLT5lZXByb21fb3BzLmFjcXVpcmVfc2VtYXBob3JlKHByaXYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byBhY3F1aXJlIEVFUFJPTSBzZW1hcGhvcmUuXG4iKTsKLQkJcmV0ID0gLUVOT0VOVDsKLQkJZ290byBlcnI7Ci0JfQotCi0JLyogZWVwcm9tIGlzIGFuIGFycmF5IG9mIDE2Yml0IHZhbHVlcyAqLwotCWZvciAoYWRkciA9IDA7IGFkZHIgPCBzejsgYWRkciArPSBzaXplb2YodTE2KSkgewotCQl1MzIgcjsKLQotCQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIENTUl9FRVBST01fUkVHLAotCQkJICAgICBDU1JfRUVQUk9NX1JFR19NU0tfQUREUiAmIChhZGRyIDw8IDEpKTsKLQotCQlyZXQgPSBpd2xfcG9sbF9iaXQocHJpdiwgQ1NSX0VFUFJPTV9SRUcsCi0JCQkJCSAgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0ssCi0JCQkJCSAgQ1NSX0VFUFJPTV9SRUdfUkVBRF9WQUxJRF9NU0ssCi0JCQkJCSAgSVdMX0VFUFJPTV9BQ0NFU1NfVElNRU9VVCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJUaW1lIG91dCByZWFkaW5nIEVFUFJPTVslZF1cbiIsCi0JCQkJCQkJYWRkcik7Ci0JCQlnb3RvIGRvbmU7Ci0JCX0KLQkJciA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgQ1NSX0VFUFJPTV9SRUcpOwotCQllW2FkZHIgLyAyXSA9IGNwdV90b19sZTE2KHIgPj4gMTYpOwotCX0KLQotCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIk5WTSBUeXBlOiAlcywgdmVyc2lvbjogMHgleFxuIiwKLQkJICAgICAgICJFRVBST00iLAotCQkgICAgICAgaXdsX2xlZ2FjeV9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fVkVSU0lPTikpOwotCi0JcmV0ID0gMDsKLWRvbmU6Ci0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5yZWxlYXNlX3NlbWFwaG9yZShwcml2KTsKLQotZXJyOgotCWlmIChyZXQpCi0JCWl3bF9sZWdhY3lfZWVwcm9tX2ZyZWUocHJpdik7Ci0JLyogUmVzZXQgY2hpcCB0byBzYXZlIHBvd2VyIHVudGlsIHdlIGxvYWQgdUNvZGUgZHVyaW5nICJ1cCIuICovCi0JaXdsX2xlZ2FjeV9hcG1fc3RvcChwcml2KTsKLWFsbG9jX2VycjoKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2VlcHJvbV9pbml0KTsKLQotdm9pZCBpd2xfbGVnYWN5X2VlcHJvbV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlrZnJlZShwcml2LT5lZXByb20pOwotCXByaXYtPmVlcHJvbSA9IE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZWVwcm9tX2ZyZWUpOwotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2luaXRfYmFuZF9yZWZlcmVuY2UoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJaW50IGVlcF9iYW5kLCBpbnQgKmVlcHJvbV9jaF9jb3VudCwKLQkJCWNvbnN0IHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKiplZXByb21fY2hfaW5mbywKLQkJCWNvbnN0IHU4ICoqZWVwcm9tX2NoX2luZGV4KQotewotCXUzMiBvZmZzZXQgPSBwcml2LT5jZmctPm9wcy0+bGliLT4KLQkJCWVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1tlZXBfYmFuZCAtIDFdOwotCXN3aXRjaCAoZWVwX2JhbmQpIHsKLQljYXNlIDE6CQkvKiAyLjRHSHogYmFuZCAqLwotCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF8xKTsKLQkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7Ci0JCSplZXByb21fY2hfaW5kZXggPSBpd2xlZ2FjeV9lZXByb21fYmFuZF8xOwotCQlicmVhazsKLQljYXNlIDI6CQkvKiA0LjlHSHogYmFuZCAqLwotCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF8yKTsKLQkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7Ci0JCSplZXByb21fY2hfaW5kZXggPSBpd2xlZ2FjeV9lZXByb21fYmFuZF8yOwotCQlicmVhazsKLQljYXNlIDM6CQkvKiA1LjJHSHogYmFuZCAqLwotCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF8zKTsKLQkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7Ci0JCSplZXByb21fY2hfaW5kZXggPSBpd2xlZ2FjeV9lZXByb21fYmFuZF8zOwotCQlicmVhazsKLQljYXNlIDQ6CQkvKiA1LjVHSHogYmFuZCAqLwotCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF80KTsKLQkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7Ci0JCSplZXByb21fY2hfaW5kZXggPSBpd2xlZ2FjeV9lZXByb21fYmFuZF80OwotCQlicmVhazsKLQljYXNlIDU6CQkvKiA1LjdHSHogYmFuZCAqLwotCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF81KTsKLQkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7Ci0JCSplZXByb21fY2hfaW5kZXggPSBpd2xlZ2FjeV9lZXByb21fYmFuZF81OwotCQlicmVhazsKLQljYXNlIDY6CQkvKiAyLjRHSHogaHQ0MCBjaGFubmVscyAqLwotCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF82KTsKLQkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfbGVnYWN5X2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7Ci0JCSplZXByb21fY2hfaW5kZXggPSBpd2xlZ2FjeV9lZXByb21fYmFuZF82OwotCQlicmVhazsKLQljYXNlIDc6CQkvKiA1IEdIeiBodDQwIGNoYW5uZWxzICovCi0JCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGl3bGVnYWN5X2VlcHJvbV9iYW5kXzcpOwotCQkqZWVwcm9tX2NoX2luZm8gPSAoc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCAqKQotCQkJCWl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgb2Zmc2V0KTsKLQkJKmVlcHJvbV9jaF9pbmRleCA9IGl3bGVnYWN5X2VlcHJvbV9iYW5kXzc7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUJVRygpOwotCX0KLX0KLQotI2RlZmluZSBDSEVDS19BTkRfUFJJTlQoeCkgKChlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfIyN4KSBcCi0JCQkgICAgPyAjIHggIiAiIDogIiIpCi0vKioKLSAqIGl3bF9sZWdhY3lfbW9kX2h0NDBfY2hhbl9pbmZvIC0gQ29weSBodDQwIGNoYW5uZWwgaW5mbyBpbnRvIGRyaXZlcidzIHByaXYuCi0gKgotICogRG9lcyBub3Qgc2V0IHVwIGEgY29tbWFuZCwgb3IgdG91Y2ggaGFyZHdhcmUuCi0gKi8KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV9tb2RfaHQ0MF9jaGFuX2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kLCB1MTYgY2hhbm5lbCwKLQkJCSAgICAgIGNvbnN0IHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKmVlcHJvbV9jaCwKLQkJCSAgICAgIHU4IGNsZWFyX2h0NDBfZXh0ZW5zaW9uX2NoYW5uZWwpCi17Ci0Jc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0KLQljaF9pbmZvID0gKHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICopCi0JCQlpd2xfbGVnYWN5X2dldF9jaGFubmVsX2luZm8ocHJpdiwgYmFuZCwgY2hhbm5lbCk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkKLQkJcmV0dXJuIC0xOwotCi0JSVdMX0RFQlVHX0VFUFJPTShwcml2LCAiSFQ0MCBDaC4gJWQgWyVzR0h6XSAlcyVzJXMlcyVzKDB4JTAyeCAlZGRCbSk6IgotCQkJIiBBZC1Ib2MgJXNzdXBwb3J0ZWRcbiIsCi0JCQljaF9pbmZvLT5jaGFubmVsLAotCQkJaXdsX2xlZ2FjeV9pc19jaGFubmVsX2FfYmFuZChjaF9pbmZvKSA/Ci0JCQkiNS4yIiA6ICIyLjQiLAotCQkJQ0hFQ0tfQU5EX1BSSU5UKElCU1MpLAotCQkJQ0hFQ0tfQU5EX1BSSU5UKEFDVElWRSksCi0JCQlDSEVDS19BTkRfUFJJTlQoUkFEQVIpLAotCQkJQ0hFQ0tfQU5EX1BSSU5UKFdJREUpLAotCQkJQ0hFQ0tfQU5EX1BSSU5UKERGUyksCi0JCQllZXByb21fY2gtPmZsYWdzLAotCQkJZWVwcm9tX2NoLT5tYXhfcG93ZXJfYXZnLAotCQkJKChlZXByb21fY2gtPmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfSUJTUykKLQkJCSAmJiAhKGVlcHJvbV9jaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9SQURBUikpID8KLQkJCSIiIDogIm5vdCAiKTsKLQotCWNoX2luZm8tPmh0NDBfZWVwcm9tID0gKmVlcHJvbV9jaDsKLQljaF9pbmZvLT5odDQwX21heF9wb3dlcl9hdmcgPSBlZXByb21fY2gtPm1heF9wb3dlcl9hdmc7Ci0JY2hfaW5mby0+aHQ0MF9mbGFncyA9IGVlcHJvbV9jaC0+ZmxhZ3M7Ci0JaWYgKGVlcHJvbV9jaC0+ZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9WQUxJRCkKLQkJY2hfaW5mby0+aHQ0MF9leHRlbnNpb25fY2hhbm5lbCAmPQotCQkJCQl+Y2xlYXJfaHQ0MF9leHRlbnNpb25fY2hhbm5lbDsKLQotCXJldHVybiAwOwotfQotCi0jZGVmaW5lIENIRUNLX0FORF9QUklOVF9JKHgpICgoZWVwcm9tX2NoX2luZm9bY2hdLmZsYWdzICYgRUVQUk9NX0NIQU5ORUxfIyN4KSBcCi0JCQkgICAgPyAjIHggIiAiIDogIiIpCi0KLS8qKgotICogaXdsX2xlZ2FjeV9pbml0X2NoYW5uZWxfbWFwIC0gU2V0IHVwIGRyaXZlcidzIGluZm8gZm9yIGFsbCBwb3NzaWJsZSBjaGFubmVscwotICovCi1pbnQgaXdsX2xlZ2FjeV9pbml0X2NoYW5uZWxfbWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgZWVwcm9tX2NoX2NvdW50ID0gMDsKLQljb25zdCB1OCAqZWVwcm9tX2NoX2luZGV4ID0gTlVMTDsKLQljb25zdCBzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICplZXByb21fY2hfaW5mbyA9IE5VTEw7Ci0JaW50IGJhbmQsIGNoOwotCXN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICpjaF9pbmZvOwotCi0JaWYgKHByaXYtPmNoYW5uZWxfY291bnQpIHsKLQkJSVdMX0RFQlVHX0VFUFJPTShwcml2LCAiQ2hhbm5lbCBtYXAgYWxyZWFkeSBpbml0aWFsaXplZC5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJJbml0aWFsaXppbmcgcmVndWxhdG9yeSBpbmZvIGZyb20gRUVQUk9NXG4iKTsKLQotCXByaXYtPmNoYW5uZWxfY291bnQgPQotCSAgICBBUlJBWV9TSVpFKGl3bGVnYWN5X2VlcHJvbV9iYW5kXzEpICsKLQkgICAgQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF8yKSArCi0JICAgIEFSUkFZX1NJWkUoaXdsZWdhY3lfZWVwcm9tX2JhbmRfMykgKwotCSAgICBBUlJBWV9TSVpFKGl3bGVnYWN5X2VlcHJvbV9iYW5kXzQpICsKLQkgICAgQVJSQVlfU0laRShpd2xlZ2FjeV9lZXByb21fYmFuZF81KTsKLQotCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIlBhcnNpbmcgZGF0YSBmb3IgJWQgY2hhbm5lbHMuXG4iLAotCQkJcHJpdi0+Y2hhbm5lbF9jb3VudCk7Ci0KLQlwcml2LT5jaGFubmVsX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbykgKgotCQkJCSAgICAgcHJpdi0+Y2hhbm5lbF9jb3VudCwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT5jaGFubmVsX2luZm8pIHsKLQkJSVdMX0VSUihwcml2LCAiQ291bGQgbm90IGFsbG9jYXRlIGNoYW5uZWxfaW5mb1xuIik7Ci0JCXByaXYtPmNoYW5uZWxfY291bnQgPSAwOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQljaF9pbmZvID0gcHJpdi0+Y2hhbm5lbF9pbmZvOwotCi0JLyogTG9vcCB0aHJvdWdoIHRoZSA1IEVFUFJPTSBiYW5kcyBhZGRpbmcgdGhlbSBpbiBvcmRlciB0byB0aGUKLQkgKiBjaGFubmVsIG1hcCB3ZSBtYWludGFpbiAodGhhdCBjb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRoYW4KLQkgKiB3aGF0IGp1c3QgaW4gdGhlIEVFUFJPTSkgKi8KLQlmb3IgKGJhbmQgPSAxOyBiYW5kIDw9IDU7IGJhbmQrKykgewotCi0JCWl3bF9sZWdhY3lfaW5pdF9iYW5kX3JlZmVyZW5jZShwcml2LCBiYW5kLCAmZWVwcm9tX2NoX2NvdW50LAotCQkJCQkmZWVwcm9tX2NoX2luZm8sICZlZXByb21fY2hfaW5kZXgpOwotCi0JCS8qIExvb3AgdGhyb3VnaCBlYWNoIGJhbmQgYWRkaW5nIGVhY2ggb2YgdGhlIGNoYW5uZWxzICovCi0JCWZvciAoY2ggPSAwOyBjaCA8IGVlcHJvbV9jaF9jb3VudDsgY2grKykgewotCQkJY2hfaW5mby0+Y2hhbm5lbCA9IGVlcHJvbV9jaF9pbmRleFtjaF07Ci0JCQljaF9pbmZvLT5iYW5kID0gKGJhbmQgPT0gMSkgPyBJRUVFODAyMTFfQkFORF8yR0haIDoKLQkJCSAgICBJRUVFODAyMTFfQkFORF81R0haOwotCi0JCQkvKiBwZXJtYW5lbnRseSBzdG9yZSBFRVBST00ncyBjaGFubmVsIHJlZ3VsYXRvcnkgZmxhZ3MKLQkJCSAqICAgYW5kIG1heCBwb3dlciBpbiBjaGFubmVsIGluZm8gZGF0YWJhc2UuICovCi0JCQljaF9pbmZvLT5lZXByb20gPSBlZXByb21fY2hfaW5mb1tjaF07Ci0KLQkJCS8qIENvcHkgdGhlIHJ1bi10aW1lIGZsYWdzIHNvIHRoZXkgYXJlIHRoZXJlIGV2ZW4gb24KLQkJCSAqIGludmFsaWQgY2hhbm5lbHMgKi8KLQkJCWNoX2luZm8tPmZsYWdzID0gZWVwcm9tX2NoX2luZm9bY2hdLmZsYWdzOwotCQkJLyogRmlyc3Qgd3JpdGUgdGhhdCBodDQwIGlzIG5vdCBlbmFibGVkLCBhbmQgdGhlbiBlbmFibGUKLQkJCSAqIG9uZSBieSBvbmUgKi8KLQkJCWNoX2luZm8tPmh0NDBfZXh0ZW5zaW9uX2NoYW5uZWwgPQotCQkJCQlJRUVFODAyMTFfQ0hBTl9OT19IVDQwOwotCi0JCQlpZiAoIShpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpKSB7Ci0JCQkJSVdMX0RFQlVHX0VFUFJPTShwcml2LAotCQkJCQkgICAgICAgIkNoLiAlZCBGbGFncyAleCBbJXNHSHpdIC0gIgotCQkJCQkgICAgICAgIk5vIHRyYWZmaWNcbiIsCi0JCQkJCSAgICAgICBjaF9pbmZvLT5jaGFubmVsLAotCQkJCQkgICAgICAgY2hfaW5mby0+ZmxhZ3MsCi0JCQkJCSAgICAgICBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfYV9iYW5kKGNoX2luZm8pID8KLQkJCQkJICAgICAgICI1LjIiIDogIjIuNCIpOwotCQkJCWNoX2luZm8rKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJLyogSW5pdGlhbGl6ZSByZWd1bGF0b3J5LWJhc2VkIHJ1bi10aW1lIGRhdGEgKi8KLQkJCWNoX2luZm8tPm1heF9wb3dlcl9hdmcgPSBjaF9pbmZvLT5jdXJyX3R4cG93ID0KLQkJCSAgICBlZXByb21fY2hfaW5mb1tjaF0ubWF4X3Bvd2VyX2F2ZzsKLQkJCWNoX2luZm8tPnNjYW5fcG93ZXIgPSBlZXByb21fY2hfaW5mb1tjaF0ubWF4X3Bvd2VyX2F2ZzsKLQkJCWNoX2luZm8tPm1pbl9wb3dlciA9IDA7Ci0KLQkJCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIkNoLiAlZCBbJXNHSHpdICIKLQkJCQkgICAgICAgIiVzJXMlcyVzJXMlcygweCUwMnggJWRkQm0pOiIKLQkJCQkgICAgICAgIiBBZC1Ib2MgJXNzdXBwb3J0ZWRcbiIsCi0JCQkJICAgICAgIGNoX2luZm8tPmNoYW5uZWwsCi0JCQkJICAgICAgIGl3bF9sZWdhY3lfaXNfY2hhbm5lbF9hX2JhbmQoY2hfaW5mbykgPwotCQkJCSAgICAgICAiNS4yIiA6ICIyLjQiLAotCQkJCSAgICAgICBDSEVDS19BTkRfUFJJTlRfSShWQUxJRCksCi0JCQkJICAgICAgIENIRUNLX0FORF9QUklOVF9JKElCU1MpLAotCQkJCSAgICAgICBDSEVDS19BTkRfUFJJTlRfSShBQ1RJVkUpLAotCQkJCSAgICAgICBDSEVDS19BTkRfUFJJTlRfSShSQURBUiksCi0JCQkJICAgICAgIENIRUNLX0FORF9QUklOVF9JKFdJREUpLAotCQkJCSAgICAgICBDSEVDS19BTkRfUFJJTlRfSShERlMpLAotCQkJCSAgICAgICBlZXByb21fY2hfaW5mb1tjaF0uZmxhZ3MsCi0JCQkJICAgICAgIGVlcHJvbV9jaF9pbmZvW2NoXS5tYXhfcG93ZXJfYXZnLAotCQkJCSAgICAgICAoKGVlcHJvbV9jaF9pbmZvW2NoXS4KLQkJCQkJIGZsYWdzICYgRUVQUk9NX0NIQU5ORUxfSUJTUykKLQkJCQkJJiYgIShlZXByb21fY2hfaW5mb1tjaF0uCi0JCQkJCSAgICAgZmxhZ3MgJiBFRVBST01fQ0hBTk5FTF9SQURBUikpCi0JCQkJICAgICAgID8gIiIgOiAibm90ICIpOwotCi0JCQljaF9pbmZvKys7Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayBpZiB3ZSBkbyBoYXZlIEhUNDAgY2hhbm5lbHMgKi8KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmxpYi0+ZWVwcm9tX29wcy5yZWd1bGF0b3J5X2JhbmRzWzVdID09Ci0JICAgIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MCAmJgotCSAgICBwcml2LT5jZmctPm9wcy0+bGliLT5lZXByb21fb3BzLnJlZ3VsYXRvcnlfYmFuZHNbNl0gPT0KLQkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwKQotCQlyZXR1cm4gMDsKLQotCS8qIFR3byBhZGRpdGlvbmFsIEVFUFJPTSBiYW5kcyBmb3IgMi40IGFuZCA1IEdIeiBIVDQwIGNoYW5uZWxzICovCi0JZm9yIChiYW5kID0gNjsgYmFuZCA8PSA3OyBiYW5kKyspIHsKLQkJZW51bSBpZWVlODAyMTFfYmFuZCBpZWVlYmFuZDsKLQotCQlpd2xfbGVnYWN5X2luaXRfYmFuZF9yZWZlcmVuY2UocHJpdiwgYmFuZCwgJmVlcHJvbV9jaF9jb3VudCwKLQkJCQkJJmVlcHJvbV9jaF9pbmZvLCAmZWVwcm9tX2NoX2luZGV4KTsKLQotCQkvKiBFRVBST00gYmFuZCA2IGlzIDIuNCwgYmFuZCA3IGlzIDUgR0h6ICovCi0JCWllZWViYW5kID0KLQkJCShiYW5kID09IDYpID8gSUVFRTgwMjExX0JBTkRfMkdIWiA6IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci0KLQkJLyogTG9vcCB0aHJvdWdoIGVhY2ggYmFuZCBhZGRpbmcgZWFjaCBvZiB0aGUgY2hhbm5lbHMgKi8KLQkJZm9yIChjaCA9IDA7IGNoIDwgZWVwcm9tX2NoX2NvdW50OyBjaCsrKSB7Ci0JCQkvKiBTZXQgdXAgZHJpdmVyJ3MgaW5mbyBmb3IgbG93ZXIgaGFsZiAqLwotCQkJaXdsX2xlZ2FjeV9tb2RfaHQ0MF9jaGFuX2luZm8ocHJpdiwgaWVlZWJhbmQsCi0JCQkJCQllZXByb21fY2hfaW5kZXhbY2hdLAotCQkJCQkJJmVlcHJvbV9jaF9pbmZvW2NoXSwKLQkJCQkJCUlFRUU4MDIxMV9DSEFOX05PX0hUNDBQTFVTKTsKLQotCQkJLyogU2V0IHVwIGRyaXZlcidzIGluZm8gZm9yIHVwcGVyIGhhbGYgKi8KLQkJCWl3bF9sZWdhY3lfbW9kX2h0NDBfY2hhbl9pbmZvKHByaXYsIGllZWViYW5kLAotCQkJCQkJZWVwcm9tX2NoX2luZGV4W2NoXSArIDQsCi0JCQkJCQkmZWVwcm9tX2NoX2luZm9bY2hdLAotCQkJCQkJSUVFRTgwMjExX0NIQU5fTk9fSFQ0ME1JTlVTKTsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2luaXRfY2hhbm5lbF9tYXApOwotCi0vKgotICogaXdsX2xlZ2FjeV9mcmVlX2NoYW5uZWxfbWFwIC0gdW5kbyBhbGxvY2F0aW9ucyBpbiBpd2xfbGVnYWN5X2luaXRfY2hhbm5lbF9tYXAKLSAqLwotdm9pZCBpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWtmcmVlKHByaXYtPmNoYW5uZWxfaW5mbyk7Ci0JcHJpdi0+Y2hhbm5lbF9jb3VudCA9IDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZnJlZV9jaGFubmVsX21hcCk7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvIC0gRmluZCBkcml2ZXIncyBwcml2YXRlIGNoYW5uZWwgaW5mbwotICoKLSAqIEJhc2VkIG9uIGJhbmQgYW5kIGNoYW5uZWwgbnVtYmVyLgotICovCi1jb25zdCBzdHJ1Y3QKLWl3bF9jaGFubmVsX2luZm8gKml3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgdTE2IGNoYW5uZWwpCi17Ci0JaW50IGk7Ci0KLQlzd2l0Y2ggKGJhbmQpIHsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6Ci0JCWZvciAoaSA9IDE0OyBpIDwgcHJpdi0+Y2hhbm5lbF9jb3VudDsgaSsrKSB7Ci0JCQlpZiAocHJpdi0+Y2hhbm5lbF9pbmZvW2ldLmNoYW5uZWwgPT0gY2hhbm5lbCkKLQkJCQlyZXR1cm4gJnByaXYtPmNoYW5uZWxfaW5mb1tpXTsKLQkJfQotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6Ci0JCWlmIChjaGFubmVsID49IDEgJiYgY2hhbm5lbCA8PSAxNCkKLQkJCXJldHVybiAmcHJpdi0+Y2hhbm5lbF9pbmZvW2NoYW5uZWwgLSAxXTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJQlVHKCk7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZWVwcm9tLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZWVwcm9tLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OWM4MTAuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWVlcHJvbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgotICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKiBCU0QgTElDRU5TRQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2VlcHJvbV9oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X2VlcHJvbV9oX18KLQotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi1zdHJ1Y3QgaXdsX3ByaXY7Ci0KLS8qCi0gKiBFRVBST00gYWNjZXNzIHRpbWUgdmFsdWVzOgotICoKLSAqIERyaXZlciBpbml0aWF0ZXMgRUVQUk9NIHJlYWQgYnkgd3JpdGluZyBieXRlIGFkZHJlc3MgPDwgMSB0byBDU1JfRUVQUk9NX1JFRy4KLSAqIERyaXZlciB0aGVuIHBvbGxzIENTUl9FRVBST01fUkVHIGZvciBDU1JfRUVQUk9NX1JFR19SRUFEX1ZBTElEX01TSyAoMHgxKS4KLSAqIFdoZW4gcG9sbGluZywgd2FpdCAxMCB1U2VjIGJldHdlZW4gcG9sbGluZyBsb29wcywgdXAgdG8gYSBtYXhpbXVtIDUwMDAgdVNlYy4KLSAqIERyaXZlciByZWFkcyAxNi1iaXQgdmFsdWUgZnJvbSBiaXRzIDMxLTE2IG9mIENTUl9FRVBST01fUkVHLgotICovCi0jZGVmaW5lIElXTF9FRVBST01fQUNDRVNTX1RJTUVPVVQJNTAwMCAvKiB1U2VjICovCi0KLSNkZWZpbmUgSVdMX0VFUFJPTV9TRU1fVElNRU9VVAkJMTAgICAvKiBtaWNyb3NlY29uZHMgKi8KLSNkZWZpbmUgSVdMX0VFUFJPTV9TRU1fUkVUUllfTElNSVQJMTAwMCAvKiBudW1iZXIgb2YgYXR0ZW1wdHMgKG5vdCB0aW1lKSAqLwotCi0KLS8qCi0gKiBSZWd1bGF0b3J5IGNoYW5uZWwgdXNhZ2UgZmxhZ3MgaW4gRUVQUk9NIHN0cnVjdCBpd2w0OTY1X2VlcHJvbV9jaGFubmVsLmZsYWdzLgotICoKLSAqIElCU1MgYW5kL29yIEFQIG9wZXJhdGlvbiBpcyBhbGxvd2VkICpvbmx5KiBvbiB0aG9zZSBjaGFubmVscyB3aXRoCi0gKiAoVkFMSUQgJiYgSUJTUyAmJiBBQ1RJVkUgJiYgIVJBREFSKS4gIFRoaXMgcmVzdHJpY3Rpb24gaXMgaW4gcGxhY2UgYmVjYXVzZQotICogUkFEQVIgZGV0ZWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIDQ5NjUgZHJpdmVyLCBidXQgaXMgYQotICogcmVxdWlyZW1lbnQgZm9yIGVzdGFibGlzaGluZyBhIG5ldyBuZXR3b3JrIGZvciBsZWdhbCBvcGVyYXRpb24gb24gY2hhbm5lbHMKLSAqIHJlcXVpcmluZyBSQURBUiBkZXRlY3Rpb24gb3IgcmVzdHJpY3RpbmcgQUNUSVZFIHNjYW5uaW5nLgotICoKLSAqIE5PVEU6ICAiV0lERSIgZmxhZyBkb2VzIG5vdCBpbmRpY2F0ZSBhbnl0aGluZyBhYm91dCAiSFQ0MCIgNDAgTUh6IGNoYW5uZWxzLgotICogICAgICAgIEl0IG9ubHkgaW5kaWNhdGVzIHRoYXQgMjAgTUh6IGNoYW5uZWwgdXNlIGlzIHN1cHBvcnRlZDsgSFQ0MCBjaGFubmVsCi0gKiAgICAgICAgdXNhZ2UgaXMgaW5kaWNhdGVkIGJ5IGEgc2VwYXJhdGUgc2V0IG9mIHJlZ3VsYXRvcnkgZmxhZ3MgZm9yIGVhY2gKLSAqICAgICAgICBIVDQwIGNoYW5uZWwgcGFpci4KLSAqCi0gKiBOT1RFOiAgVXNpbmcgYSBjaGFubmVsIGluYXBwcm9wcmlhdGVseSB3aWxsIHJlc3VsdCBpbiBhIHVDb2RlIGVycm9yIQotICovCi0jZGVmaW5lIElXTF9OVU1fVFhfQ0FMSUJfR1JPVVBTIDUKLWVudW0gewotCUVFUFJPTV9DSEFOTkVMX1ZBTElEID0gKDEgPDwgMCksCS8qIHVzYWJsZSBmb3IgdGhpcyBTS1UvZ2VvICovCi0JRUVQUk9NX0NIQU5ORUxfSUJTUyA9ICgxIDw8IDEpLAkJLyogdXNhYmxlIGFzIGFuIElCU1MgY2hhbm5lbCAqLwotCS8qIEJpdCAyIFJlc2VydmVkICovCi0JRUVQUk9NX0NIQU5ORUxfQUNUSVZFID0gKDEgPDwgMyksCS8qIGFjdGl2ZSBzY2FubmluZyBhbGxvd2VkICovCi0JRUVQUk9NX0NIQU5ORUxfUkFEQVIgPSAoMSA8PCA0KSwJLyogcmFkYXIgZGV0ZWN0aW9uIHJlcXVpcmVkICovCi0JRUVQUk9NX0NIQU5ORUxfV0lERSA9ICgxIDw8IDUpLAkJLyogMjAgTUh6IGNoYW5uZWwgb2theSAqLwotCS8qIEJpdCA2IFJlc2VydmVkICh3YXMgTmFycm93IENoYW5uZWwpICovCi0JRUVQUk9NX0NIQU5ORUxfREZTID0gKDEgPDwgNyksCS8qIGR5bmFtaWMgZnJlcSBzZWxlY3Rpb24gY2FuZGlkYXRlICovCi19OwotCi0vKiBTS1UgQ2FwYWJpbGl0aWVzICovCi0vKiAzOTQ1IG9ubHkgKi8KLSNkZWZpbmUgRUVQUk9NX1NLVV9DQVBfU1dfUkZfS0lMTF9FTkFCTEUgICAgICAgICAgICAgICAgKDEgPDwgMCkKLSNkZWZpbmUgRUVQUk9NX1NLVV9DQVBfSFdfUkZfS0lMTF9FTkFCTEUgICAgICAgICAgICAgICAgKDEgPDwgMSkKLQotLyogKnJlZ3VsYXRvcnkqIGNoYW5uZWwgZGF0YSBmb3JtYXQgaW4gZWVwcm9tLCBvbmUgZm9yIGVhY2ggY2hhbm5lbC4KLSAqIFRoZXJlIGFyZSBzZXBhcmF0ZSBlbnRyaWVzIGZvciBIVDQwICg0MCBNSHopIHZzLiBub3JtYWwgKDIwIE1IeikgY2hhbm5lbHMuICovCi1zdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsIHsKLQl1OCBmbGFnczsJCS8qIEVFUFJPTV9DSEFOTkVMXyogZmxhZ3MgY29waWVkIGZyb20gRUVQUk9NICovCi0JczggbWF4X3Bvd2VyX2F2ZzsJLyogbWF4IHBvd2VyIChkQm0pIG9uIHRoaXMgY2hubCwgbGltaXQgMzEgKi8KLX0gX19wYWNrZWQ7Ci0KLS8qIDM5NDUgU3BlY2lmaWMgKi8KLSNkZWZpbmUgRUVQUk9NXzM5NDVfRUVQUk9NX1ZFUlNJT04JKDB4MmYpCi0KLS8qIDQ5NjUgaGFzIHR3byByYWRpbyB0cmFuc21pdHRlcnMgKGFuZCAzIHJhZGlvIHJlY2VpdmVycykgKi8KLSNkZWZpbmUgRUVQUk9NX1RYX1BPV0VSX1RYX0NIQUlOUyAgICAgICgyKQotCi0vKiA0OTY1IGhhcyByb29tIGZvciB1cCB0byA4IHNldHMgb2YgdHhwb3dlciBjYWxpYnJhdGlvbiBkYXRhICovCi0jZGVmaW5lIEVFUFJPTV9UWF9QT1dFUl9CQU5EUyAgICAgICAgICAoOCkKLQotLyogNDk2NSBmYWN0b3J5IGNhbGlicmF0aW9uIG1lYXN1cmVzIHR4cG93ZXIgZ2FpbiBzZXR0aW5ncyBmb3IKLSAqIGVhY2ggb2YgMyB0YXJnZXQgb3V0cHV0IGxldmVscyAqLwotI2RlZmluZSBFRVBST01fVFhfUE9XRVJfTUVBU1VSRU1FTlRTICAgKDMpCi0KLS8qIDQ5NjUgU3BlY2lmaWMgKi8KLS8qIDQ5NjUgZHJpdmVyIGRvZXMgbm90IHdvcmsgd2l0aCB0eHBvd2VyIGNhbGlicmF0aW9uIHZlcnNpb24gPCA1ICovCi0jZGVmaW5lIEVFUFJPTV80OTY1X1RYX1BPV0VSX1ZFUlNJT04gICAgKDUpCi0jZGVmaW5lIEVFUFJPTV80OTY1X0VFUFJPTV9WRVJTSU9OCSgweDJmKQotI2RlZmluZSBFRVBST01fNDk2NV9DQUxJQl9WRVJTSU9OX09GRlNFVCAgICAgICAoMioweEI2KSAvKiAyIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV80OTY1X0NBTElCX1RYUE9XRVJfT0ZGU0VUICAgICAgICgyKjB4RTgpIC8qIDQ4ICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fNDk2NV9CT0FSRF9SRVZJU0lPTiAgICAgICAgICAgICAoMioweDRGKSAvKiAyIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV80OTY1X0JPQVJEX1BCQSAgICAgICAgICAgICAgICAgICgyKjB4NTYrMSkgLyogOSBieXRlcyAqLwotCi0vKiAyLjQgR0h6ICovCi1leHRlcm4gY29uc3QgdTggaXdsZWdhY3lfZWVwcm9tX2JhbmRfMVsxNF07Ci0KLS8qCi0gKiBmYWN0b3J5IGNhbGlicmF0aW9uIGRhdGEgZm9yIG9uZSB0eHBvd2VyIGxldmVsLCBvbiBvbmUgY2hhbm5lbCwKLSAqIG1lYXN1cmVkIG9uIG9uZSBvZiB0aGUgMiB0eCBjaGFpbnMgKHJhZGlvIHRyYW5zbWl0dGVyIGFuZCBhc3NvY2lhdGVkCi0gKiBhbnRlbm5hKS4gIEVFUFJPTSBjb250YWluczoKLSAqCi0gKiAxKSAgVGVtcGVyYXR1cmUgKGRlZ3JlZXMgQ2Vsc2l1cykgb2YgZGV2aWNlIHdoZW4gbWVhc3VyZW1lbnQgd2FzIG1hZGUuCi0gKgotICogMikgIEdhaW4gdGFibGUgaW5kZXggdXNlZCB0byBhY2hpZXZlIHRoZSB0YXJnZXQgbWVhc3VyZW1lbnQgcG93ZXIuCi0gKiAgICAgVGhpcyByZWZlcnMgdG8gdGhlICJ3ZWxsLWtub3duIiBnYWluIHRhYmxlcyAoc2VlIGl3bC00OTY1LWh3LmgpLgotICoKLSAqIDMpICBBY3R1YWwgbWVhc3VyZWQgb3V0cHV0IHBvd2VyLCBpbiBoYWxmLWRCbSAoIjM0IiA9IDE3IGRCbSkuCi0gKgotICogNCkgIFJGIHBvd2VyIGFtcGxpZmllciBkZXRlY3RvciBsZXZlbCBtZWFzdXJlbWVudCAobm90IHVzZWQpLgotICovCi1zdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9tZWFzdXJlIHsKLQl1OCB0ZW1wZXJhdHVyZTsJCS8qIERldmljZSB0ZW1wZXJhdHVyZSAoQ2Vsc2l1cykgKi8KLQl1OCBnYWluX2lkeDsJCS8qIEluZGV4IGludG8gZ2FpbiB0YWJsZSAqLwotCXU4IGFjdHVhbF9wb3c7CQkvKiBNZWFzdXJlZCBSRiBvdXRwdXQgcG93ZXIsIGhhbGYtZEJtICovCi0JczggcGFfZGV0OwkJLyogUG93ZXIgYW1wIGRldGVjdG9yIGxldmVsIChub3QgdXNlZCkgKi8KLX0gX19wYWNrZWQ7Ci0KLQotLyoKLSAqIG1lYXN1cmVtZW50IHNldCBmb3Igb25lIGNoYW5uZWwuICBFRVBST00gY29udGFpbnM6Ci0gKgotICogMSkgIENoYW5uZWwgbnVtYmVyIG1lYXN1cmVkCi0gKgotICogMikgIE1lYXN1cmVtZW50cyBmb3IgZWFjaCBvZiAzIHBvd2VyIGxldmVscyBmb3IgZWFjaCBvZiAyIHJhZGlvIHRyYW5zbWl0dGVycwotICogICAgIChhLmsuYS4gInR4IGNoYWlucyIpICg2IG1lYXN1cmVtZW50cyBhbHRvZ2V0aGVyKQotICovCi1zdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9jaF9pbmZvIHsKLQl1OCBjaF9udW07Ci0Jc3RydWN0IGl3bF9lZXByb21fY2FsaWJfbWVhc3VyZQotCQltZWFzdXJlbWVudHNbRUVQUk9NX1RYX1BPV0VSX1RYX0NIQUlOU10KLQkJCVtFRVBST01fVFhfUE9XRVJfTUVBU1VSRU1FTlRTXTsKLX0gX19wYWNrZWQ7Ci0KLS8qCi0gKiB0eHBvd2VyIHN1YmJhbmQgaW5mby4KLSAqCi0gKiBGb3IgZWFjaCBmcmVxdWVuY3kgc3ViYmFuZCwgRUVQUk9NIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogMSkgIEZpcnN0IGFuZCBsYXN0IGNoYW5uZWxzIHdpdGhpbiByYW5nZSBvZiB0aGUgc3ViYmFuZC4gICIwIiB2YWx1ZXMKLSAqICAgICBpbmRpY2F0ZSB0aGF0IHRoaXMgc2FtcGxlIHNldCBpcyBub3QgYmVpbmcgdXNlZC4KLSAqCi0gKiAyKSAgU2FtcGxlIG1lYXN1cmVtZW50IHNldHMgZm9yIDIgY2hhbm5lbHMgY2xvc2UgdG8gdGhlIHJhbmdlIGVuZHBvaW50cy4KLSAqLwotc3RydWN0IGl3bF9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvIHsKLQl1OCBjaF9mcm9tOwkvKiBjaGFubmVsIG51bWJlciBvZiBsb3dlc3QgY2hhbm5lbCBpbiBzdWJiYW5kICovCi0JdTggY2hfdG87CS8qIGNoYW5uZWwgbnVtYmVyIG9mIGhpZ2hlc3QgY2hhbm5lbCBpbiBzdWJiYW5kICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaDE7Ci0Jc3RydWN0IGl3bF9lZXByb21fY2FsaWJfY2hfaW5mbyBjaDI7Ci19IF9fcGFja2VkOwotCi0KLS8qCi0gKiB0eHBvd2VyIGNhbGlicmF0aW9uIGluZm8uICBFRVBST00gY29udGFpbnM6Ci0gKgotICogMSkgIEZhY3RvcnktbWVhc3VyZWQgc2F0dXJhdGlvbiBwb3dlciBsZXZlbHMgKG1heGltdW0gbGV2ZWxzIGF0IHdoaWNoCi0gKiAgICAgdHggcG93ZXIgYW1wbGlmaWVyIGNhbiBvdXRwdXQgYSBzaWduYWwgd2l0aG91dCB0b28gbXVjaCBkaXN0b3J0aW9uKS4KLSAqICAgICBUaGVyZSBpcyBvbmUgbGV2ZWwgZm9yIDIuNCBHSHogYmFuZCBhbmQgb25lIGZvciA1IEdIeiBiYW5kLiAgVGhlc2UKLSAqICAgICB2YWx1ZXMgYXBwbHkgdG8gYWxsIGNoYW5uZWxzIHdpdGhpbiBlYWNoIG9mIHRoZSBiYW5kcy4KLSAqCi0gKiAyKSAgRmFjdG9yeS1tZWFzdXJlZCBwb3dlciBzdXBwbHkgdm9sdGFnZSBsZXZlbC4gIFRoaXMgaXMgYXNzdW1lZCB0byBiZQotICogICAgIGNvbnN0YW50IChpLmUuIHNhbWUgdmFsdWUgYXBwbGllcyB0byBhbGwgY2hhbm5lbHMvYmFuZHMpIHdoaWxlIHRoZQotICogICAgIGZhY3RvcnkgbWVhc3VyZW1lbnRzIGFyZSBiZWluZyBtYWRlLgotICoKLSAqIDMpICBVcCB0byA4IHNldHMgb2YgZmFjdG9yeS1tZWFzdXJlZCB0eHBvd2VyIGNhbGlicmF0aW9uIHZhbHVlcy4KLSAqICAgICBUaGVzZSBhcmUgZm9yIGRpZmZlcmVudCBmcmVxdWVuY3kgcmFuZ2VzLCBzaW5jZSB0eHBvd2VyIGdhaW4KLSAqICAgICBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIGFuYWxvZyByYWRpbyBjaXJjdWl0cnkgdmFyeSB3aXRoIGZyZXF1ZW5jeS4KLSAqCi0gKiAgICAgTm90IGFsbCBzZXRzIG5lZWQgdG8gYmUgZmlsbGVkIHdpdGggZGF0YTsKLSAqICAgICBzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9zdWJiYW5kX2luZm8gY29udGFpbnMgcmFuZ2Ugb2YgY2hhbm5lbHMKLSAqICAgICAoMCBpZiB1bnVzZWQpIGZvciBlYWNoIHNldCBvZiBkYXRhLgotICovCi1zdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9pbmZvIHsKLQl1OCBzYXR1cmF0aW9uX3Bvd2VyMjQ7CS8qIGhhbGYtZEJtIChlLmcuICIzNCIgPSAxNyBkQm0pICovCi0JdTggc2F0dXJhdGlvbl9wb3dlcjUyOwkvKiBoYWxmLWRCbSAqLwotCV9fbGUxNiB2b2x0YWdlOwkJLyogc2lnbmVkICovCi0Jc3RydWN0IGl3bF9lZXByb21fY2FsaWJfc3ViYmFuZF9pbmZvCi0JCWJhbmRfaW5mb1tFRVBST01fVFhfUE9XRVJfQkFORFNdOwotfSBfX3BhY2tlZDsKLQotCi0vKiBHZW5lcmFsICovCi0jZGVmaW5lIEVFUFJPTV9ERVZJQ0VfSUQgICAgICAgICAgICAgICAgICAgICgyKjB4MDgpCS8qIDIgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX01BQ19BRERSRVNTICAgICAgICAgICAgICAgICAgKDIqMHgxNSkJLyogNiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX0JPQVJEX1JFVklTSU9OICAgICAgICAgICAgICAgKDIqMHgzNSkJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX0JPQVJEX1BCQV9OVU1CRVIgICAgICAgICAgICAgKDIqMHgzQisxKQkvKiA5ICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fVkVSU0lPTiAgICAgICAgICAgICAgICAgICAgICAoMioweDQ0KQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fU0tVX0NBUCAgICAgICAgICAgICAgICAgICAgICAoMioweDQ1KQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fT0VNX01PREUgICAgICAgICAgICAgICAgICAgICAoMioweDQ2KQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fV09XTEFOX01PREUgICAgICAgICAgICAgICAgICAoMioweDQ3KQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fUkFESU9fQ09ORklHICAgICAgICAgICAgICAgICAoMioweDQ4KQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fTlVNX01BQ19BRERSRVNTICAgICAgICAgICAgICAoMioweDRDKQkvKiAyICBieXRlcyAqLwotCi0vKiBUaGUgZm9sbG93aW5nIG1hc2tzIGFyZSB0byBiZSBhcHBsaWVkIG9uIEVFUFJPTV9SQURJT19DT05GSUcgKi8KLSNkZWZpbmUgRUVQUk9NX1JGX0NGR19UWVBFX01TSyh4KSAgICh4ICYgMHgzKSAgICAgICAgIC8qIGJpdHMgMC0xICAgKi8KLSNkZWZpbmUgRUVQUk9NX1JGX0NGR19TVEVQX01TSyh4KSAgICgoeCA+PiAyKSAgJiAweDMpIC8qIGJpdHMgMi0zICAgKi8KLSNkZWZpbmUgRUVQUk9NX1JGX0NGR19EQVNIX01TSyh4KSAgICgoeCA+PiA0KSAgJiAweDMpIC8qIGJpdHMgNC01ICAgKi8KLSNkZWZpbmUgRUVQUk9NX1JGX0NGR19QTlVNX01TSyh4KSAgICgoeCA+PiA2KSAgJiAweDMpIC8qIGJpdHMgNi03ICAgKi8KLSNkZWZpbmUgRUVQUk9NX1JGX0NGR19UWF9BTlRfTVNLKHgpICgoeCA+PiA4KSAgJiAweEYpIC8qIGJpdHMgOC0xMSAgKi8KLSNkZWZpbmUgRUVQUk9NX1JGX0NGR19SWF9BTlRfTVNLKHgpICgoeCA+PiAxMikgJiAweEYpIC8qIGJpdHMgMTItMTUgKi8KLQotI2RlZmluZSBFRVBST01fMzk0NV9SRl9DRkdfVFlQRV9NQVggIDB4MAotI2RlZmluZSBFRVBST01fNDk2NV9SRl9DRkdfVFlQRV9NQVggIDB4MQotCi0vKgotICogUGVyLWNoYW5uZWwgcmVndWxhdG9yeSBkYXRhLgotICoKLSAqIEVhY2ggY2hhbm5lbCB0aGF0ICptaWdodCogYmUgc3VwcG9ydGVkIGJ5IGl3bCBoYXMgYSBmaXhlZCBsb2NhdGlvbgotICogaW4gRUVQUk9NIGNvbnRhaW5pbmcgRUVQUk9NX0NIQU5ORUxfKiB1c2FnZSBmbGFncyAoTFNCKSBhbmQgbWF4IHJlZ3VsYXRvcnkKLSAqIHR4cG93ZXIgKE1TQikuCi0gKgotICogRW50cmllcyBpbW1lZGlhdGVseSBiZWxvdyBhcmUgZm9yIDIwIE1IeiBjaGFubmVsIHdpZHRoLiAgSFQ0MCAoNDAgTUh6KQotICogY2hhbm5lbHMgKG9ubHkgZm9yIDQ5NjUsIG5vdCBzdXBwb3J0ZWQgYnkgMzk0NSkgYXBwZWFyIGxhdGVyIGluIHRoZSBFRVBST00uCi0gKgotICogMi40IEdIeiBjaGFubmVscyAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQKLSAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9TS1VfSUQgICAgICAgICAgICAoMioweDYwKSAgICAvKiA0ICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzEgICAgICAgICAgICAoMioweDYyKQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzFfQ0hBTk5FTFMgICAoMioweDYzKQkvKiAyOCBieXRlcyAqLwotCi0vKgotICogNC45IEdIeiBjaGFubmVscyAxODMsIDE4NCwgMTg1LCAxODcsIDE4OCwgMTg5LCAxOTIsIDE5NiwKLSAqIDUuMCBHSHogY2hhbm5lbHMgNywgOCwgMTEsIDEyLCAxNgotICogKDQ5MTUtNTA4ME1IeikgKG5vbmUgb2YgdGhlc2UgaXMgZXZlciBzdXBwb3J0ZWQpCi0gKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yICAgICAgICAgICAgKDIqMHg3MSkJLyogMiAgYnl0ZXMgKi8KLSNkZWZpbmUgRUVQUk9NX1JFR1VMQVRPUllfQkFORF8yX0NIQU5ORUxTICAgKDIqMHg3MikJLyogMjYgYnl0ZXMgKi8KLQotLyoKLSAqIDUuMiBHSHogY2hhbm5lbHMgMzQsIDM2LCAzOCwgNDAsIDQyLCA0NCwgNDYsIDQ4LCA1MiwgNTYsIDYwLCA2NAotICogKDUxNzAtNTMyME1IeikKLSAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzMgICAgICAgICAgICAoMioweDdGKQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzNfQ0hBTk5FTFMgICAoMioweDgwKQkvKiAyNCBieXRlcyAqLwotCi0vKgotICogNS41IEdIeiBjaGFubmVscyAxMDAsIDEwNCwgMTA4LCAxMTIsIDExNiwgMTIwLCAxMjQsIDEyOCwgMTMyLCAxMzYsIDE0MAotICogKDU1MDAtNTcwME1IeikKLSAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzQgICAgICAgICAgICAoMioweDhDKQkvKiAyICBieXRlcyAqLwotI2RlZmluZSBFRVBST01fUkVHVUxBVE9SWV9CQU5EXzRfQ0hBTk5FTFMgICAoMioweDhEKQkvKiAyMiBieXRlcyAqLwotCi0vKgotICogNS43IEdIeiBjaGFubmVscyAxNDUsIDE0OSwgMTUzLCAxNTcsIDE2MSwgMTY1Ci0gKiAoNTcyNS01ODI1TUh6KQotICovCi0jZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNSAgICAgICAgICAgICgyKjB4OTgpCS8qIDIgIGJ5dGVzICovCi0jZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfNV9DSEFOTkVMUyAgICgyKjB4OTkpCS8qIDEyIGJ5dGVzICovCi0KLS8qCi0gKiAyLjQgR0h6IEhUNDAgY2hhbm5lbHMgMSAoNSksIDIgKDYpLCAzICg3KSwgNCAoOCksIDUgKDkpLCA2ICgxMCksIDcgKDExKQotICoKLSAqIFRoZSBjaGFubmVsIGxpc3RlZCBpcyB0aGUgY2VudGVyIG9mIHRoZSBsb3dlciAyMCBNSHogaGFsZiBvZiB0aGUgY2hhbm5lbC4KLSAqIFRoZSBvdmVyYWxsIGNlbnRlciBmcmVxdWVuY3kgaXMgYWN0dWFsbHkgMiBjaGFubmVscyAoMTAgTUh6KSBhYm92ZSB0aGF0LAotICogYW5kIHRoZSB1cHBlciBoYWxmIG9mIGVhY2ggSFQ0MCBjaGFubmVsIGlzIGNlbnRlcmVkIDQgY2hhbm5lbHMgKDIwIE1IeikgYXdheQotICogZnJvbSB0aGUgbG93ZXIgaGFsZjsgZS5nLiB0aGUgdXBwZXIgaGFsZiBvZiBIVDQwIGNoYW5uZWwgMSBpcyBjaGFubmVsIDUsCi0gKiBhbmQgdGhlIG92ZXJhbGwgSFQ0MCBjaGFubmVsIHdpZHRoIGNlbnRlcnMgb24gY2hhbm5lbCAzLgotICoKLSAqIE5PVEU6ICBUaGUgUlhPTiBjb21tYW5kIHVzZXMgMjAgTUh6IGNoYW5uZWwgbnVtYmVycyB0byBzcGVjaWZ5IHRoZQotICogICAgICAgIGNvbnRyb2wgY2hhbm5lbCB0byB3aGljaCB0byB0dW5lLiAgUlhPTiBhbHNvIHNwZWNpZmllcyB3aGV0aGVyIHRoZQotICogICAgICAgIGNvbnRyb2wgY2hhbm5lbCBpcyB0aGUgdXBwZXIgb3IgbG93ZXIgaGFsZiBvZiBhIEhUNDAgY2hhbm5lbC4KLSAqCi0gKiBOT1RFOiAgNDk2NSBkb2VzIG5vdCBzdXBwb3J0IEhUNDAgY2hhbm5lbHMgb24gMi40IEdIei4KLSAqLwotI2RlZmluZSBFRVBST01fNDk2NV9SRUdVTEFUT1JZX0JBTkRfMjRfSFQ0MF9DSEFOTkVMUyAoMioweEEwKQkvKiAxNCBieXRlcyAqLwotCi0vKgotICogNS4yIEdIeiBIVDQwIGNoYW5uZWxzIDM2ICg0MCksIDQ0ICg0OCksIDUyICg1NiksIDYwICg2NCksCi0gKiAxMDAgKDEwNCksIDEwOCAoMTEyKSwgMTE2ICgxMjApLCAxMjQgKDEyOCksIDEzMiAoMTM2KSwgMTQ5ICgxNTMpLCAxNTcgKDE2MSkKLSAqLwotI2RlZmluZSBFRVBST01fNDk2NV9SRUdVTEFUT1JZX0JBTkRfNTJfSFQ0MF9DSEFOTkVMUyAoMioweEE4KQkvKiAyMiBieXRlcyAqLwotCi0jZGVmaW5lIEVFUFJPTV9SRUdVTEFUT1JZX0JBTkRfTk9fSFQ0MAkJCSgwKQotCi1zdHJ1Y3QgaXdsX2VlcHJvbV9vcHMgewotCWNvbnN0IHUzMiByZWd1bGF0b3J5X2JhbmRzWzddOwotCWludCAoKmFjcXVpcmVfc2VtYXBob3JlKSAoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQl2b2lkICgqcmVsZWFzZV9zZW1hcGhvcmUpIChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotfTsKLQotCi1pbnQgaXdsX2xlZ2FjeV9lZXByb21faW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotdm9pZCBpd2xfbGVnYWN5X2VlcHJvbV9mcmVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1jb25zdCB1OCAqaXdsX2xlZ2FjeV9lZXByb21fcXVlcnlfYWRkcihjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCXNpemVfdCBvZmZzZXQpOwotdTE2IGl3bF9sZWdhY3lfZWVwcm9tX3F1ZXJ5MTYoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCBzaXplX3Qgb2Zmc2V0KTsKLWludCBpd2xfbGVnYWN5X2luaXRfY2hhbm5lbF9tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9mcmVlX2NoYW5uZWxfbWFwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1jb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqaXdsX2xlZ2FjeV9nZXRfY2hhbm5lbF9pbmZvKAotCQljb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwgdTE2IGNoYW5uZWwpOwotCi0jZW5kaWYgIC8qIF9faXdsX2xlZ2FjeV9lZXByb21faF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtZmguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1maC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTYwOTE4Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1maC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBUaGlzIGZpbGUgaXMgcHJvdmlkZWQgdW5kZXIgYSBkdWFsIEJTRC9HUEx2MiBsaWNlbnNlLiAgV2hlbiB1c2luZyBvcgotICogcmVkaXN0cmlidXRpbmcgdGhpcyBmaWxlLCB5b3UgbWF5IGRvIHNvIHVuZGVyIGVpdGhlciBsaWNlbnNlLgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNSAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKiBCU0QgTElDRU5TRQotICoKLSAqIENvcHlyaWdodChjKSAyMDA1IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqICAqIE5laXRoZXIgdGhlIG5hbWUgSW50ZWwgQ29ycG9yYXRpb24gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX2l3bF9sZWdhY3lfZmhfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9maF9oX18KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBGbG93IEhhbmRsZXIgRGVmaW5pdGlvbnMgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKioKLSAqIFRoaXMgSS9PIGFyZWEgaXMgZGlyZWN0bHkgcmVhZC93cml0YWJsZSBieSBkcml2ZXIgKGUuZy4gTGludXggdXNlcyB3cml0ZWwoKSkKLSAqIEFkZHJlc3NlcyBhcmUgb2Zmc2V0cyBmcm9tIGRldmljZSdzIFBDSSBoYXJkd2FyZSBiYXNlIGFkZHJlc3MuCi0gKi8KLSNkZWZpbmUgRkhfTUVNX0xPV0VSX0JPVU5EICAgICAgICAgICAgICAgICAgICgweDEwMDApCi0jZGVmaW5lIEZIX01FTV9VUFBFUl9CT1VORCAgICAgICAgICAgICAgICAgICAoMHgyMDAwKQotCi0vKioKLSAqIEtlZXAtV2FybSAoS1cpIGJ1ZmZlciBiYXNlIGFkZHJlc3MuCi0gKgotICogRHJpdmVyIG11c3QgYWxsb2NhdGUgYSA0S0J5dGUgYnVmZmVyIHRoYXQgaXMgdXNlZCBieSA0OTY1IGZvciBrZWVwaW5nIHRoZQotICogaG9zdCBEUkFNIHBvd2VyZWQgb24gKHZpYSBkdW1teSBhY2Nlc3NlcyB0byBEUkFNKSB0byBtYWludGFpbiBsb3ctbGF0ZW5jeQotICogRFJBTSBhY2Nlc3Mgd2hlbiA0OTY1IGlzIFR4aW5nIG9yIFJ4aW5nLiAgVGhlIGR1bW15IGFjY2Vzc2VzIHByZXZlbnQgaG9zdAotICogZnJvbSBnb2luZyBpbnRvIGEgcG93ZXItc2F2aW5ncyBtb2RlIHRoYXQgd291bGQgY2F1c2UgaGlnaGVyIERSQU0gbGF0ZW5jeSwKLSAqIGFuZCBwb3NzaWJsZSBkYXRhIG92ZXIvdW5kZXItcnVucywgYmVmb3JlIGFsbCBUeC9SeCBpcyBjb21wbGV0ZS4KLSAqCi0gKiBEcml2ZXIgbG9hZHMgRkhfS1dfTUVNX0FERFJfUkVHIHdpdGggdGhlIHBoeXNpY2FsIGFkZHJlc3MgKGJpdHMgMzU6NCkKLSAqIG9mIHRoZSBidWZmZXIsIHdoaWNoIG11c3QgYmUgNEsgYWxpZ25lZC4gIE9uY2UgdGhpcyBpcyBzZXQgdXAsIHRoZSA0OTY1Ci0gKiBhdXRvbWF0aWNhbGx5IGludm9rZXMga2VlcC13YXJtIGFjY2Vzc2VzIHdoZW4gbm9ybWFsIGFjY2Vzc2VzIG1pZ2h0IG5vdAotICogYmUgc3VmZmljaWVudCB0byBtYWludGFpbiBmYXN0IERSQU0gcmVzcG9uc2UuCi0gKgotICogQml0IGZpZWxkczoKLSAqICAzMS0wOiAgS2VlcC13YXJtIGJ1ZmZlciBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgWzM1OjRdLCBtdXN0IGJlIDRLIGFsaWduZWQKLSAqLwotI2RlZmluZSBGSF9LV19NRU1fQUREUl9SRUcJCSAgICAgKEZIX01FTV9MT1dFUl9CT1VORCArIDB4OTdDKQotCi0KLS8qKgotICogVEZEIENpcmN1bGFyIEJ1ZmZlcnMgQmFzZSAoQ0JCQykgYWRkcmVzc2VzCi0gKgotICogNDk2NSBoYXMgMTYgYmFzZSBwb2ludGVyIHJlZ2lzdGVycywgb25lIGZvciBlYWNoIG9mIDE2IGhvc3QtRFJBTS1yZXNpZGVudAotICogY2lyY3VsYXIgYnVmZmVycyAoQ0JzL3F1ZXVlcykgY29udGFpbmluZyBUcmFuc21pdCBGcmFtZSBEZXNjcmlwdG9ycyAoVEZEcykKLSAqIChzZWUgc3RydWN0IGl3bF90ZmRfZnJhbWUpLiAgVGhlc2UgMTYgcG9pbnRlciByZWdpc3RlcnMgYXJlIG9mZnNldCBieSAweDA0Ci0gKiBieXRlcyBmcm9tIG9uZSBhbm90aGVyLiAgRWFjaCBURkQgY2lyY3VsYXIgYnVmZmVyIGluIERSQU0gbXVzdCBiZSAyNTYtYnl0ZQotICogYWxpZ25lZCAoYWRkcmVzcyBiaXRzIDAtNyBtdXN0IGJlIDApLgotICoKLSAqIEJpdCBmaWVsZHMgaW4gZWFjaCBwb2ludGVyIHJlZ2lzdGVyOgotICogIDI3LTA6IFRGRCBDQiBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgWzM1OjhdLCBtdXN0IGJlIDI1Ni1ieXRlIGFsaWduZWQKLSAqLwotI2RlZmluZSBGSF9NRU1fQ0JCQ19MT1dFUl9CT1VORCAgICAgICAgICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHg5RDApCi0jZGVmaW5lIEZIX01FTV9DQkJDX1VQUEVSX0JPVU5EICAgICAgICAgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEExMCkKLQotLyogRmluZCBURkQgQ0IgYmFzZSBwb2ludGVyIGZvciBnaXZlbiBxdWV1ZSAocmFuZ2UgMC0xNSkuICovCi0jZGVmaW5lIEZIX01FTV9DQkJDX1FVRVVFKHgpICAoRkhfTUVNX0NCQkNfTE9XRVJfQk9VTkQgKyAoeCkgKiAweDQpCi0KLQotLyoqCi0gKiBSeCBTUkFNIENvbnRyb2wgYW5kIFN0YXR1cyBSZWdpc3RlcnMgKFJTQ1NSKQotICoKLSAqIFRoZXNlIHJlZ2lzdGVycyBwcm92aWRlIGhhbmRzaGFrZSBiZXR3ZWVuIGRyaXZlciBhbmQgNDk2NSBmb3IgdGhlIFJ4IHF1ZXVlCi0gKiAodGhpcyBxdWV1ZSBoYW5kbGVzICphbGwqIGNvbW1hbmQgcmVzcG9uc2VzLCBub3RpZmljYXRpb25zLCBSeCBkYXRhLCBldGMuCi0gKiBzZW50IGZyb20gNDk2NSB1Q29kZSB0byBob3N0IGRyaXZlcikuICBVbmxpa2UgVHgsIHRoZXJlIGlzIG9ubHkgb25lIFJ4Ci0gKiBxdWV1ZSwgYW5kIG9ubHkgb25lIFJ4IERNQS9GSUZPIGNoYW5uZWwuICBBbHNvIHVubGlrZSBUeCwgd2hpY2ggY2FuCi0gKiBjb25jYXRlbmF0ZSB1cCB0byAyMCBEUkFNIGJ1ZmZlcnMgdG8gZm9ybSBhIFR4IGZyYW1lLCBlYWNoIFJlY2VpdmUgQnVmZmVyCi0gKiBEZXNjcmlwdG9yIChSQkQpIHBvaW50cyB0byBvbmx5IG9uZSBSeCBCdWZmZXIgKFJCKTsgdGhlcmUgaXMgYSAxOjEKLSAqIG1hcHBpbmcgYmV0d2VlbiBSQkRzIGFuZCBSQnMuCi0gKgotICogRHJpdmVyIG11c3QgYWxsb2NhdGUgaG9zdCBEUkFNIG1lbW9yeSBmb3IgdGhlIGZvbGxvd2luZywgYW5kIHNldCB0aGUKLSAqIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZWFjaCBpbnRvIDQ5NjUgcmVnaXN0ZXJzOgotICoKLSAqIDEpICBSZWNlaXZlIEJ1ZmZlciBEZXNjcmlwdG9yIChSQkQpIGNpcmN1bGFyIGJ1ZmZlciAoQ0IpLCB0eXBpY2FsbHkgd2l0aCAyNTYKLSAqICAgICBlbnRyaWVzIChhbHRob3VnaCBhbnkgcG93ZXIgb2YgMiwgdXAgdG8gNDA5NiwgaXMgc2VsZWN0YWJsZSBieSBkcml2ZXIpLgotICogICAgIEVhY2ggZW50cnkgKDEgZHdvcmQpIHBvaW50cyB0byBhIHJlY2VpdmUgYnVmZmVyIChSQikgb2YgY29uc2lzdGVudCBzaXplCi0gKiAgICAgKHR5cGljYWxseSA0SywgYWx0aG91Z2ggOEsgb3IgMTZLIGFyZSBhbHNvIHNlbGVjdGFibGUgYnkgZHJpdmVyKS4KLSAqICAgICBEcml2ZXIgc2V0cyB1cCBSQiBzaXplIGFuZCBudW1iZXIgb2YgUkJEcyBpbiB0aGUgQ0IgdmlhIFJ4IGNvbmZpZwotICogICAgIHJlZ2lzdGVyIEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcuCi0gKgotICogICAgIEJpdCBmaWVsZHMgd2l0aGluIG9uZSBSQkQ6Ci0gKiAgICAgMjctMDogIFJlY2VpdmUgQnVmZmVyIHBoeXNpY2FsIGFkZHJlc3MgYml0cyBbMzU6OF0sIDI1Ni1ieXRlIGFsaWduZWQKLSAqCi0gKiAgICAgRHJpdmVyIHNldHMgcGh5c2ljYWwgYWRkcmVzcyBbMzU6OF0gb2YgYmFzZSBvZiBSQkQgY2lyY3VsYXIgYnVmZmVyCi0gKiAgICAgaW50byBGSF9SU0NTUl9DSE5MMF9SQkRDQl9CQVNFX1JFRyBbMjc6MF0uCi0gKgotICogMikgIFJ4IHN0YXR1cyBidWZmZXIsIDggYnl0ZXMsIGluIHdoaWNoIDQ5NjUgaW5kaWNhdGVzIHdoaWNoIFJ4IEJ1ZmZlcnMKLSAqICAgICAoUkJzKSBoYXZlIGJlZW4gZmlsbGVkLCB2aWEgYSAid3JpdGUgcG9pbnRlciIsIGFjdHVhbGx5IHRoZSBpbmRleCBvZgotICogICAgIHRoZSBSQidzIGNvcnJlc3BvbmRpbmcgUkJEIHdpdGhpbiB0aGUgY2lyY3VsYXIgYnVmZmVyLiAgRHJpdmVyIHNldHMKLSAqICAgICBwaHlzaWNhbCBhZGRyZXNzIFszNTo0XSBpbnRvIEZIX1JTQ1NSX0NITkwwX1NUVFNfV1BUUl9SRUcgWzMxOjBdLgotICoKLSAqICAgICBCaXQgZmllbGRzIGluIGxvd2VyIGR3b3JkIG9mIFJ4IHN0YXR1cyBidWZmZXIgKHVwcGVyIGR3b3JkIG5vdCB1c2VkCi0gKiAgICAgYnkgZHJpdmVyOyBzZWUgc3RydWN0IGl3bDQ5NjVfc2hhcmVkLCB2YWwwKToKLSAqICAgICAzMS0xMjogIE5vdCB1c2VkIGJ5IGRyaXZlcgotICogICAgIDExLSAwOiAgSW5kZXggb2YgbGFzdCBmaWxsZWQgUnggYnVmZmVyIGRlc2NyaXB0b3IKLSAqICAgICAgICAgICAgICg0OTY1IHdyaXRlcywgZHJpdmVyIHJlYWRzIHRoaXMgdmFsdWUpCi0gKgotICogQXMgdGhlIGRyaXZlciBwcmVwYXJlcyBSZWNlaXZlIEJ1ZmZlcnMgKFJCcykgZm9yIDQ5NjUgdG8gZmlsbCwgZHJpdmVyIG11c3QKLSAqIGVudGVyIHBvaW50ZXJzIHRvIHRoZXNlIFJCcyBpbnRvIGNvbnRpZ3VvdXMgUkJEIGNpcmN1bGFyIGJ1ZmZlciBlbnRyaWVzLAotICogYW5kIHVwZGF0ZSB0aGUgNDk2NSdzICJ3cml0ZSIgaW5kZXggcmVnaXN0ZXIsCi0gKiBGSF9SU0NTUl9DSE5MMF9SQkRDQl9XUFRSX1JFRy4KLSAqCi0gKiBUaGlzICJ3cml0ZSIgaW5kZXggY29ycmVzcG9uZHMgdG8gdGhlICpuZXh0KiBSQkQgdGhhdCB0aGUgZHJpdmVyIHdpbGwgbWFrZQotICogYXZhaWxhYmxlLCBpLmUuIG9uZSBSQkQgcGFzdCB0aGUgdGFpbCBvZiB0aGUgcmVhZHktdG8tZmlsbCBSQkRzIHdpdGhpbgotICogdGhlIGNpcmN1bGFyIGJ1ZmZlci4gIFRoaXMgdmFsdWUgc2hvdWxkIGluaXRpYWxseSBiZSAwIChiZWZvcmUgcHJlcGFyaW5nIGFueQotICogUkJzKSwgc2hvdWxkIGJlIDggYWZ0ZXIgcHJlcGFyaW5nIHRoZSBmaXJzdCA4IFJCcyAoZm9yIGV4YW1wbGUpLCBhbmQgbXVzdAotICogd3JhcCBiYWNrIHRvIDAgYXQgdGhlIGVuZCBvZiB0aGUgY2lyY3VsYXIgYnVmZmVyIChidXQgZG9uJ3Qgd3JhcCBiZWZvcmUKLSAqICJyZWFkIiBpbmRleCBoYXMgYWR2YW5jZWQgcGFzdCAxISAgU2VlIGJlbG93KS4KLSAqIE5PVEU6ICA0OTY1IEVYUEVDVFMgVEhFIFdSSVRFIElOREVYIFRPIEJFIElOQ1JFTUVOVEVEIElOIE1VTFRJUExFUyBPRiA4LgotICoKLSAqIEFzIHRoZSA0OTY1IGZpbGxzIFJCcyAocmVmZXJlbmNlZCBmcm9tIGNvbnRpZ3VvdXMgUkJEcyB3aXRoaW4gdGhlIGNpcmN1bGFyCi0gKiBidWZmZXIpLCBpdCB1cGRhdGVzIHRoZSBSeCBzdGF0dXMgYnVmZmVyIGluIGhvc3QgRFJBTSwgMikgZGVzY3JpYmVkIGFib3ZlLAotICogdG8gdGVsbCB0aGUgZHJpdmVyIHRoZSBpbmRleCBvZiB0aGUgbGF0ZXN0IGZpbGxlZCBSQkQuICBUaGUgZHJpdmVyIG11c3QKLSAqIHJlYWQgdGhpcyAicmVhZCIgaW5kZXggZnJvbSBEUkFNIGFmdGVyIHJlY2VpdmluZyBhbiBSeCBpbnRlcnJ1cHQgZnJvbSA0OTY1LgotICoKLSAqIFRoZSBkcml2ZXIgbXVzdCBhbHNvIGludGVybmFsbHkga2VlcCB0cmFjayBvZiBhIHRoaXJkIGluZGV4LCB3aGljaCBpcyB0aGUKLSAqIG5leHQgUkJEIHRvIHByb2Nlc3MuICBXaGVuIHJlY2VpdmluZyBhbiBSeCBpbnRlcnJ1cHQsIGRyaXZlciBzaG91bGQgcHJvY2VzcwotICogYWxsIGZpbGxlZCBidXQgdW5wcm9jZXNzZWQgUkJzIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywgdGhlIFJCCi0gKiBjb3JyZXNwb25kaW5nIHRvIHRoZSAicmVhZCIgaW5kZXguICBGb3IgZXhhbXBsZSwgaWYgInJlYWQiIGluZGV4IGJlY29tZXMgIjEiLAotICogZHJpdmVyIG1heSBwcm9jZXNzIHRoZSBSQiBwb2ludGVkIHRvIGJ5IFJCRCAwLiAgRGVwZW5kaW5nIG9uIHZvbHVtZSBvZgotICogdHJhZmZpYywgdGhlcmUgbWF5IGJlIG1hbnkgUkJzIHRvIHByb2Nlc3MuCi0gKgotICogSWYgcmVhZCBpbmRleCA9PSB3cml0ZSBpbmRleCwgNDk2NSB0aGlua3MgdGhlcmUgaXMgbm8gcm9vbSB0byBwdXQgbmV3IGRhdGEuCi0gKiBEdWUgdG8gdGhpcywgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGxlZCBSQnMgaXMgMjU1LCBpbnN0ZWFkIG9mIDI1Ni4gIFRvCi0gKiBiZSBzYWZlLCBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBhIGdhcCBvZiBhdCBsZWFzdCAyIFJCRHMgYmV0d2VlbiAid3JpdGUiCi0gKiBhbmQgInJlYWQiIGluZGV4ZXM7IHRoYXQgaXMsIG1ha2Ugc3VyZSB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjU0Ci0gKiBidWZmZXJzIHdhaXRpbmcgdG8gYmUgZmlsbGVkLgotICovCi0jZGVmaW5lIEZIX01FTV9SU0NTUl9MT1dFUl9CT1VORAkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhCQzApCi0jZGVmaW5lIEZIX01FTV9SU0NTUl9VUFBFUl9CT1VORAkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHhDMDApCi0jZGVmaW5lIEZIX01FTV9SU0NTUl9DSE5MMAkJKEZIX01FTV9SU0NTUl9MT1dFUl9CT1VORCkKLQotLyoqCi0gKiBQaHlzaWNhbCBiYXNlIGFkZHJlc3Mgb2YgOC1ieXRlIFJ4IFN0YXR1cyBidWZmZXIuCi0gKiBCaXQgZmllbGRzOgotICogIDMxLTA6IFJ4IHN0YXR1cyBidWZmZXIgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIFszNTo0XSwgbXVzdCAxNi1ieXRlIGFsaWduZWQuCi0gKi8KLSNkZWZpbmUgRkhfUlNDU1JfQ0hOTDBfU1RUU19XUFRSX1JFRwkoRkhfTUVNX1JTQ1NSX0NITkwwKQotCi0vKioKLSAqIFBoeXNpY2FsIGJhc2UgYWRkcmVzcyBvZiBSeCBCdWZmZXIgRGVzY3JpcHRvciBDaXJjdWxhciBCdWZmZXIuCi0gKiBCaXQgZmllbGRzOgotICogIDI3LTA6ICBSQkQgQ0QgcGh5c2ljYWwgYmFzZSBhZGRyZXNzIFszNTo4XSwgbXVzdCBiZSAyNTYtYnl0ZSBhbGlnbmVkLgotICovCi0jZGVmaW5lIEZIX1JTQ1NSX0NITkwwX1JCRENCX0JBU0VfUkVHCShGSF9NRU1fUlNDU1JfQ0hOTDAgKyAweDAwNCkKLQotLyoqCi0gKiBSeCB3cml0ZSBwb2ludGVyIChpbmRleCwgcmVhbGx5ISkuCi0gKiBCaXQgZmllbGRzOgotICogIDExLTA6ICBJbmRleCBvZiBkcml2ZXIncyBtb3N0IHJlY2VudCBwcmVwYXJlZC10by1iZS1maWxsZWQgUkJELCArIDEuCi0gKiAgICAgICAgIE5PVEU6ICBGb3IgMjU2LWVudHJ5IGNpcmN1bGFyIGJ1ZmZlciwgdXNlIG9ubHkgYml0cyBbNzowXS4KLSAqLwotI2RlZmluZSBGSF9SU0NTUl9DSE5MMF9SQkRDQl9XUFRSX1JFRwkoRkhfTUVNX1JTQ1NSX0NITkwwICsgMHgwMDgpCi0jZGVmaW5lIEZIX1JTQ1NSX0NITkwwX1dQVFIgICAgICAgIChGSF9SU0NTUl9DSE5MMF9SQkRDQl9XUFRSX1JFRykKLQotCi0vKioKLSAqIFJ4IENvbmZpZy9TdGF0dXMgUmVnaXN0ZXJzIChSQ1NSKQotICogUnggQ29uZmlnIFJlZyBmb3IgY2hhbm5lbCAwIChvbmx5IGNoYW5uZWwgdXNlZCkKLSAqCi0gKiBEcml2ZXIgbXVzdCBpbml0aWFsaXplIEZIX01FTV9SQ1NSX0NITkwwX0NPTkZJR19SRUcgYXMgZm9sbG93cyBmb3IKLSAqIG5vcm1hbCBvcGVyYXRpb24gKHNlZSBiaXQgZmllbGRzKS4KLSAqCi0gKiBDbGVhcmluZyBGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHIHRvIDAgdHVybnMgb2ZmIFJ4IERNQS4KLSAqIERyaXZlciBzaG91bGQgcG9sbCBGSF9NRU1fUlNTUl9SWF9TVEFUVVNfUkVHCWZvcgotICogRkhfUlNTUl9DSE5MMF9SWF9TVEFUVVNfQ0hOTF9JRExFIChiaXQgMjQpIGJlZm9yZSBjb250aW51aW5nLgotICoKLSAqIEJpdCBmaWVsZHM6Ci0gKiAzMS0zMDogUnggRE1BIGNoYW5uZWwgZW5hYmxlOiAnMDAnIG9mZi9wYXVzZSwgJzAxJyBwYXVzZSBhdCBlbmQgb2YgZnJhbWUsCi0gKiAgICAgICAgJzEwJyBvcGVyYXRlIG5vcm1hbGx5Ci0gKiAyOS0yNDogcmVzZXJ2ZWQKLSAqIDIzLTIwOiAjIFJCRHMgaW4gY2lyY3VsYXIgYnVmZmVyID0gMl52YWx1ZTsgdXNlICI4IiBmb3IgMjU2IFJCRHMgKG5vcm1hbCksCi0gKiAgICAgICAgbWluICI1IiBmb3IgMzIgUkJEcywgbWF4ICIxMiIgZm9yIDQwOTYgUkJEcy4KLSAqIDE5LTE4OiByZXNlcnZlZAotICogMTctMTY6IHNpemUgb2YgZWFjaCByZWNlaXZlIGJ1ZmZlcjsgJzAwJyA0SyAobm9ybWFsKSwgJzAxJyA4SywKLSAqICAgICAgICAnMTAnIDEySywgJzExJyAxNksuCi0gKiAxNS0xNDogcmVzZXJ2ZWQKLSAqIDEzLTEyOiBJUlEgZGVzdGluYXRpb247ICcwMCcgbm9uZSwgJzAxJyBob3N0IGRyaXZlciAobm9ybWFsIG9wZXJhdGlvbikKLSAqIDExLSA0OiB0aW1lb3V0IGZvciBjbG9zaW5nIFJ4IGJ1ZmZlciBhbmQgaW50ZXJydXB0aW5nIGhvc3QgKHVuaXRzIDMyIHVzZWMpCi0gKiAgICAgICAgdHlwaWNhbCB2YWx1ZSAweDEwIChhYm91dCAxLzIgbXNlYykKLSAqICAzLSAwOiByZXNlcnZlZAotICovCi0jZGVmaW5lIEZIX01FTV9SQ1NSX0xPV0VSX0JPVU5EICAgICAgKEZIX01FTV9MT1dFUl9CT1VORCArIDB4QzAwKQotI2RlZmluZSBGSF9NRU1fUkNTUl9VUFBFUl9CT1VORCAgICAgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweENDMCkKLSNkZWZpbmUgRkhfTUVNX1JDU1JfQ0hOTDAgICAgICAgICAgICAoRkhfTUVNX1JDU1JfTE9XRVJfQk9VTkQpCi0KLSNkZWZpbmUgRkhfTUVNX1JDU1JfQ0hOTDBfQ09ORklHX1JFRwkoRkhfTUVNX1JDU1JfQ0hOTDApCi0KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfUkJfVElNRU9VVF9NU0sgKDB4MDAwMDBGRjApIC8qIGJpdHMgNC0xMSAqLwotI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9NU0sgICAoMHgwMDAwMTAwMCkgLyogYml0cyAxMiAqLwotI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19TSU5HTEVfRlJBTUVfTVNLICgweDAwMDA4MDAwKSAvKiBiaXQgMTUgKi8KLSNkZWZpbmUgRkhfUkNTUl9DSE5MMF9SWF9DT05GSUdfUkJfU0laRV9NU0sgICAoMHgwMDAzMDAwMCkgLyogYml0cyAxNi0xNyAqLwotI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19SQkRCQ19TSVpFX01TSyAoMHgwMEYwMDAwMCkgLyogYml0cyAyMC0yMyAqLwotI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19ETUFfQ0hOTF9FTl9NU0sgKDB4QzAwMDAwMDApIC8qIGJpdHMgMzAtMzEqLwotCi0jZGVmaW5lIEZIX1JDU1JfUlhfQ09ORklHX1JCRENCX1NJWkVfUE9TCSgyMCkKLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfUkVHX0lSUV9SQlRIX1BPUwkoNCkKLSNkZWZpbmUgUlhfUkJfVElNRU9VVAkoMHgxMCkKLQotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX1BBVVNFX1ZBTCAgICAgICAgICgweDAwMDAwMDAwKQotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX1BBVVNFX0VPRl9WQUwgICAgICgweDQwMDAwMDAwKQotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19DSE5MX0VOX0VOQUJMRV9WQUwgICAgICAgICgweDgwMDAwMDAwKQotCi0jZGVmaW5lIEZIX1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV80SyAgICAoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfUkNTUl9SWF9DT05GSUdfUkVHX1ZBTF9SQl9TSVpFXzhLICAgICgweDAwMDEwMDAwKQotI2RlZmluZSBGSF9SQ1NSX1JYX0NPTkZJR19SRUdfVkFMX1JCX1NJWkVfMTJLICAgKDB4MDAwMjAwMDApCi0jZGVmaW5lIEZIX1JDU1JfUlhfQ09ORklHX1JFR19WQUxfUkJfU0laRV8xNksgICAoMHgwMDAzMDAwMCkKLQotI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0lHTk9SRV9SWEZfRU1QVFkgICAgICAgICAgICAgICgweDAwMDAwMDA0KQotI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9OT19JTlRfVkFMICAgICgweDAwMDAwMDAwKQotI2RlZmluZSBGSF9SQ1NSX0NITkwwX1JYX0NPTkZJR19JUlFfREVTVF9JTlRfSE9TVF9WQUwgICgweDAwMDAxMDAwKQotCi0jZGVmaW5lIEZIX1JTQ1NSX0ZSQU1FX1NJWkVfTVNLCSgweDAwMDAzRkZGKQkvKiBiaXRzIDAtMTMgKi8KLQotLyoqCi0gKiBSeCBTaGFyZWQgU3RhdHVzIFJlZ2lzdGVycyAoUlNTUikKLSAqCi0gKiBBZnRlciBzdG9wcGluZyBSeCBETUEgY2hhbm5lbCAod3JpdGluZyAwIHRvCi0gKiBGSF9NRU1fUkNTUl9DSE5MMF9DT05GSUdfUkVHKSwgZHJpdmVyIG11c3QgcG9sbAotICogRkhfTUVNX1JTU1JfUlhfU1RBVFVTX1JFRyB1bnRpbCBSeCBjaGFubmVsIGlzIGlkbGUuCi0gKgotICogQml0IGZpZWxkczoKLSAqICAyNDogIDEgPSBDaGFubmVsIDAgaXMgaWRsZQotICoKLSAqIEZIX01FTV9SU1NSX1NIQVJFRF9DVFJMX1JFRyBhbmQgRkhfTUVNX1JTU1JfUlhfRU5BQkxFX0VSUl9JUlEyRFJWCi0gKiBjb250YWluIGRlZmF1bHQgdmFsdWVzIHRoYXQgc2hvdWxkIG5vdCBiZSBhbHRlcmVkIGJ5IHRoZSBkcml2ZXIuCi0gKi8KLSNkZWZpbmUgRkhfTUVNX1JTU1JfTE9XRVJfQk9VTkQgICAgICAgICAgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEM0MCkKLSNkZWZpbmUgRkhfTUVNX1JTU1JfVVBQRVJfQk9VTkQgICAgICAgICAgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEQwMCkKLQotI2RlZmluZSBGSF9NRU1fUlNTUl9TSEFSRURfQ1RSTF9SRUcgICAgICAgKEZIX01FTV9SU1NSX0xPV0VSX0JPVU5EKQotI2RlZmluZSBGSF9NRU1fUlNTUl9SWF9TVEFUVVNfUkVHCShGSF9NRU1fUlNTUl9MT1dFUl9CT1VORCArIDB4MDA0KQotI2RlZmluZSBGSF9NRU1fUlNTUl9SWF9FTkFCTEVfRVJSX0lSUTJEUlZcCi0JCQkJCShGSF9NRU1fUlNTUl9MT1dFUl9CT1VORCArIDB4MDA4KQotCi0jZGVmaW5lIEZIX1JTU1JfQ0hOTDBfUlhfU1RBVFVTX0NITkxfSURMRQkoMHgwMTAwMDAwMCkKLQotI2RlZmluZSBGSF9NRU1fVEZESUJfUkVHMV9BRERSX0JJVFNISUZUCTI4Ci0KLS8qIFRGREIgIEFyZWEgLSBURkRzIGJ1ZmZlciB0YWJsZSAqLwotI2RlZmluZSBGSF9NRU1fVEZESUJfRFJBTV9BRERSX0xTQl9NU0sgICAgICAoMHhGRkZGRkZGRikKLSNkZWZpbmUgRkhfVEZESUJfTE9XRVJfQk9VTkQgICAgICAgKEZIX01FTV9MT1dFUl9CT1VORCArIDB4OTAwKQotI2RlZmluZSBGSF9URkRJQl9VUFBFUl9CT1VORCAgICAgICAoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHg5NTgpCi0jZGVmaW5lIEZIX1RGRElCX0NUUkwwX1JFRyhfY2hubCkgIChGSF9URkRJQl9MT1dFUl9CT1VORCArIDB4OCAqIChfY2hubCkpCi0jZGVmaW5lIEZIX1RGRElCX0NUUkwxX1JFRyhfY2hubCkgIChGSF9URkRJQl9MT1dFUl9CT1VORCArIDB4OCAqIChfY2hubCkgKyAweDQpCi0KLS8qKgotICogVHJhbnNtaXQgRE1BIENoYW5uZWwgQ29udHJvbC9TdGF0dXMgUmVnaXN0ZXJzIChUQ1NSKQotICoKLSAqIDQ5NjUgaGFzIG9uZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGZvciBlYWNoIG9mIDggVHggRE1BL0ZJRk8gY2hhbm5lbHMKLSAqIHN1cHBvcnRlZCBpbiBoYXJkd2FyZSAoZG9uJ3QgY29uZnVzZSB0aGVzZSB3aXRoIHRoZSAxNiBUeCBxdWV1ZXMgaW4gRFJBTSwKLSAqIHdoaWNoIGZlZWQgdGhlIERNQS9GSUZPIGNoYW5uZWxzKTsgY29uZmlnIHJlZ3MgYXJlIHNlcGFyYXRlZCBieSAweDIwIGJ5dGVzLgotICoKLSAqIFRvIHVzZSBhIFR4IERNQSBjaGFubmVsLCBkcml2ZXIgbXVzdCBpbml0aWFsaXplIGl0cwotICogRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2hubCkgd2l0aDoKLSAqCi0gKiBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX0VOQUJMRSB8Ci0gKiBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRU5BQkxFX1ZBTAotICoKLSAqIEFsbCBvdGhlciBiaXRzIHNob3VsZCBiZSAwLgotICoKLSAqIEJpdCBmaWVsZHM6Ci0gKiAzMS0zMDogVHggRE1BIGNoYW5uZWwgZW5hYmxlOiAnMDAnIG9mZi9wYXVzZSwgJzAxJyBwYXVzZSBhdCBlbmQgb2YgZnJhbWUsCi0gKiAgICAgICAgJzEwJyBvcGVyYXRlIG5vcm1hbGx5Ci0gKiAyOS0gNDogUmVzZXJ2ZWQsIHNldCB0byAiMCIKLSAqICAgICAzOiBFbmFibGUgaW50ZXJuYWwgRE1BIHJlcXVlc3RzICgxLCBub3JtYWwgb3BlcmF0aW9uKSwgZGlzYWJsZSAoMCkKLSAqICAyLSAwOiBSZXNlcnZlZCwgc2V0IHRvICIwIgotICovCi0jZGVmaW5lIEZIX1RDU1JfTE9XRVJfQk9VTkQgIChGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEQwMCkKLSNkZWZpbmUgRkhfVENTUl9VUFBFUl9CT1VORCAgKEZIX01FTV9MT1dFUl9CT1VORCArIDB4RTYwKQotCi0vKiBGaW5kIENvbnRyb2wvU3RhdHVzIHJlZyBmb3IgZ2l2ZW4gVHggRE1BL0ZJRk8gY2hhbm5lbCAqLwotI2RlZmluZSBGSDQ5X1RDU1JfQ0hOTF9OVU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDcpCi0jZGVmaW5lIEZINTBfVENTUl9DSE5MX05VTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOCkKLQotLyogVENTUjogdHhfY29uZmlnIHJlZ2lzdGVyIHZhbHVlcyAqLwotI2RlZmluZSBGSF9UQ1NSX0NITkxfVFhfQ09ORklHX1JFRyhfY2hubCkJXAotCQkoRkhfVENTUl9MT1dFUl9CT1VORCArIDB4MjAgKiAoX2NobmwpKQotI2RlZmluZSBGSF9UQ1NSX0NITkxfVFhfQ1JFRElUX1JFRyhfY2hubCkJXAotCQkoRkhfVENTUl9MT1dFUl9CT1VORCArIDB4MjAgKiAoX2NobmwpICsgMHg0KQotI2RlZmluZSBGSF9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUcoX2NobmwpCVwKLQkJKEZIX1RDU1JfTE9XRVJfQk9VTkQgKyAweDIwICogKF9jaG5sKSArIDB4OCkKLQotI2RlZmluZSBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX01TR19NT0RFX1RYRgkJKDB4MDAwMDAwMDApCi0jZGVmaW5lIEZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfTVNHX01PREVfRFJWCQkoMHgwMDAwMDAwMSkKLQotI2RlZmluZSBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRElTQUJMRQkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0VOQUJMRQkoMHgwMDAwMDAwOCkKLQotI2RlZmluZSBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9OT0lOVAkoMHgwMDAwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX0hPU1RfRU5EVEZECSgweDAwMTAwMDAwKQotI2RlZmluZSBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9JRlRGRAkoMHgwMDIwMDAwMCkKLQotI2RlZmluZSBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfUlRDX05PSU5UCSgweDAwMDAwMDAwKQotI2RlZmluZSBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfUlRDX0VORFRGRAkoMHgwMDQwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9DSVJRX1JUQ19JRlRGRAkoMHgwMDgwMDAwMCkKLQotI2RlZmluZSBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX1BBVVNFCSgweDAwMDAwMDAwKQotI2RlZmluZSBGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DSE5MX1BBVVNFX0VPRgkoMHg0MDAwMDAwMCkKLSNkZWZpbmUgRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTkFCTEUJKDB4ODAwMDAwMDApCi0KLSNkZWZpbmUgRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1ZBTF9URkRCX0VNUFRZCSgweDAwMDAwMDAwKQotI2RlZmluZSBGSF9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfVkFMX1RGREJfV0FJVAkoMHgwMDAwMjAwMCkKLSNkZWZpbmUgRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1ZBTF9URkRCX1ZBTElECSgweDAwMDAwMDAzKQotCi0jZGVmaW5lIEZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19QT1NfVEJfTlVNCQkoMjApCi0jZGVmaW5lIEZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19QT1NfVEJfSURYCQkoMTIpCi0KLS8qKgotICogVHggU2hhcmVkIFN0YXR1cyBSZWdpc3RlcnMgKFRTU1IpCi0gKgotICogQWZ0ZXIgc3RvcHBpbmcgVHggRE1BIGNoYW5uZWwgKHdyaXRpbmcgMCB0bwotICogRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2hubCkpLCBkcml2ZXIgbXVzdCBwb2xsCi0gKiBGSF9UU1NSX1RYX1NUQVRVU19SRUcgdW50aWwgc2VsZWN0ZWQgVHggY2hhbm5lbCBpcyBpZGxlCi0gKiAoY2hhbm5lbCdzIGJ1ZmZlcnMgZW1wdHkgfCBubyBwZW5kaW5nIHJlcXVlc3RzKS4KLSAqCi0gKiBCaXQgZmllbGRzOgotICogMzEtMjQ6ICAxID0gQ2hhbm5lbCBidWZmZXJzIGVtcHR5IChjaGFubmVsIDc6MCkKLSAqIDIzLTE2OiAgMSA9IE5vIHBlbmRpbmcgcmVxdWVzdHMgKGNoYW5uZWwgNzowKQotICovCi0jZGVmaW5lIEZIX1RTU1JfTE9XRVJfQk9VTkQJCShGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEVBMCkKLSNkZWZpbmUgRkhfVFNTUl9VUFBFUl9CT1VORAkJKEZIX01FTV9MT1dFUl9CT1VORCArIDB4RUMwKQotCi0jZGVmaW5lIEZIX1RTU1JfVFhfU1RBVFVTX1JFRwkJKEZIX1RTU1JfTE9XRVJfQk9VTkQgKyAweDAxMCkKLQotLyoqCi0gKiBCaXQgZmllbGRzIGZvciBUU1NSKFR4IFNoYXJlZCBTdGF0dXMgJiBDb250cm9sKSBlcnJvciBzdGF0dXMgcmVnaXN0ZXI6Ci0gKiAzMTogIEluZGljYXRlcyBhbiBhZGRyZXNzIGVycm9yIHdoZW4gYWNjZXNzZWQgdG8gaW50ZXJuYWwgbWVtb3J5Ci0gKgl1Q29kZS9kcml2ZXIgbXVzdCB3cml0ZSAiMSIgaW4gb3JkZXIgdG8gY2xlYXIgdGhpcyBmbGFnCi0gKiAzMDogIEluZGljYXRlcyB0aGF0IEhvc3QgZGlkIG5vdCBzZW5kIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZHdvcmRzIHRvIEZICi0gKgl1Q29kZS9kcml2ZXIgbXVzdCB3cml0ZSAiMSIgaW4gb3JkZXIgdG8gY2xlYXIgdGhpcyBmbGFnCi0gKiAxNi05OkVhY2ggc3RhdHVzIGJpdCBpcyBmb3Igb25lIGNoYW5uZWwuIEluZGljYXRlcyB0aGF0IGFuIChFcnJvcikgQWN0RE1BCi0gKgljb21tYW5kIHdhcyByZWNlaXZlZCBmcm9tIHRoZSBzY2hlZHVsZXIgd2hpbGUgdGhlIFRSQiB3YXMgYWxyZWFkeSBmdWxsCi0gKgl3aXRoIHByZXZpb3VzIGNvbW1hbmQKLSAqCXVDb2RlL2RyaXZlciBtdXN0IHdyaXRlICIxIiBpbiBvcmRlciB0byBjbGVhciB0aGlzIGZsYWcKLSAqIDctMDogRWFjaCBzdGF0dXMgYml0IGluZGljYXRlcyBhIGNoYW5uZWwncyBUeENyZWRpdCBlcnJvci4gV2hlbiBhbiBlcnJvcgotICoJYml0IGlzIHNldCwgaXQgaW5kaWNhdGVzIHRoYXQgdGhlIEZIIGhhcyByZWNlaXZlZCBhIGZ1bGwgaW5kaWNhdGlvbgotICoJZnJvbSB0aGUgUlRDIFR4RklGTyBhbmQgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIFR4Q3JlZGl0IGNvdW50ZXIgd2FzCi0gKglub3QgZXF1YWwgdG8gemVyby4gVGhpcyBtZWFuIHRoYXQgdGhlIGNyZWRpdCBtZWNoYW5pc20gd2FzIG5vdAotICoJc3luY2hyb25pemVkIHRvIHRoZSBUeEZJRk8gc3RhdHVzCi0gKgl1Q29kZS9kcml2ZXIgbXVzdCB3cml0ZSAiMSIgaW4gb3JkZXIgdG8gY2xlYXIgdGhpcyBmbGFnCi0gKi8KLSNkZWZpbmUgRkhfVFNTUl9UWF9FUlJPUl9SRUcJCShGSF9UU1NSX0xPV0VSX0JPVU5EICsgMHgwMTgpCi0KLSNkZWZpbmUgRkhfVFNTUl9UWF9TVEFUVVNfUkVHX01TS19DSE5MX0lETEUoX2NobmwpICgoMSA8PCAoX2NobmwpKSA8PCAxNikKLQotLyogVHggc2VydmljZSBjaGFubmVscyAqLwotI2RlZmluZSBGSF9TUlZDX0NITkwJCSg5KQotI2RlZmluZSBGSF9TUlZDX0xPV0VSX0JPVU5ECShGSF9NRU1fTE9XRVJfQk9VTkQgKyAweDlDOCkKLSNkZWZpbmUgRkhfU1JWQ19VUFBFUl9CT1VORAkoRkhfTUVNX0xPV0VSX0JPVU5EICsgMHg5RDApCi0jZGVmaW5lIEZIX1NSVkNfQ0hOTF9TUkFNX0FERFJfUkVHKF9jaG5sKSBcCi0JCShGSF9TUlZDX0xPV0VSX0JPVU5EICsgKChfY2hubCkgLSA5KSAqIDB4NCkKLQotI2RlZmluZSBGSF9UWF9DSElDS0VOX0JJVFNfUkVHCShGSF9NRU1fTE9XRVJfQk9VTkQgKyAweEU5OCkKLS8qIEluc3RydWN0IEZIIHRvIGluY3JlbWVudCB0aGUgcmV0cnkgY291bnQgb2YgYSBwYWNrZXQgd2hlbgotICogaXQgaXMgYnJvdWdodCBmcm9tIHRoZSBtZW1vcnkgdG8gVFgtRklGTwotICovCi0jZGVmaW5lIEZIX1RYX0NISUNLRU5fQklUU19TQ0RfQVVUT19SRVRSWV9FTgkoMHgwMDAwMDAwMikKLQotI2RlZmluZSBSWF9RVUVVRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAgIDI1NgotI2RlZmluZSBSWF9RVUVVRV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDI1NQotI2RlZmluZSBSWF9RVUVVRV9TSVpFX0xPRyAgICAgICAgICAgICAgICAgICAgIDgKLQotLyoKLSAqIFJYIHJlbGF0ZWQgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zCi0gKi8KLSNkZWZpbmUgUlhfRlJFRV9CVUZGRVJTIDY0Ci0jZGVmaW5lIFJYX0xPV19XQVRFUk1BUksgOAotCi0vKiBTaXplIG9mIG9uZSBSeCBidWZmZXIgaW4gaG9zdCBEUkFNICovCi0jZGVmaW5lIElXTF9SWF9CVUZfU0laRV8zSyAoMyAqIDEwMDApIC8qIDM5NDUgb25seSAqLwotI2RlZmluZSBJV0xfUlhfQlVGX1NJWkVfNEsgKDQgKiAxMDI0KQotI2RlZmluZSBJV0xfUlhfQlVGX1NJWkVfOEsgKDggKiAxMDI0KQotCi0vKioKLSAqIHN0cnVjdCBpd2xfcmJfc3RhdHVzIC0gcmVzZXZlIGJ1ZmZlciBzdGF0dXMKLSAqIAlob3N0IG1lbW9yeSBtYXBwZWQgRkggcmVnaXN0ZXJzCi0gKiBAY2xvc2VkX3JiX251bSBbMDoxMV0gLSBJbmRpY2F0ZXMgdGhlIGluZGV4IG9mIHRoZSBSQiB3aGljaCB3YXMgY2xvc2VkCi0gKiBAY2xvc2VkX2ZyX251bSBbMDoxMV0gLSBJbmRpY2F0ZXMgdGhlIGluZGV4IG9mIHRoZSBSWCBGcmFtZSB3aGljaCB3YXMgY2xvc2VkCi0gKiBAZmluaXNoZWRfcmJfbnVtIFswOjExXSAtIEluZGljYXRlcyB0aGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgUkIKLSAqIAlpbiB3aGljaCB0aGUgbGFzdCBmcmFtZSB3YXMgd3JpdHRlbiB0bwotICogQGZpbmlzaGVkX2ZyX251bSBbMDoxMV0gLSBJbmRpY2F0ZXMgdGhlIGluZGV4IG9mIHRoZSBSWCBGcmFtZQotICogCXdoaWNoIHdhcyB0cmFuc2ZlcnJlZAotICovCi1zdHJ1Y3QgaXdsX3JiX3N0YXR1cyB7Ci0JX19sZTE2IGNsb3NlZF9yYl9udW07Ci0JX19sZTE2IGNsb3NlZF9mcl9udW07Ci0JX19sZTE2IGZpbmlzaGVkX3JiX251bTsKLQlfX2xlMTYgZmluaXNoZWRfZnJfbmFtOwotCV9fbGUzMiBfX3VudXNlZDsgLyogMzk0NSBvbmx5ICovCi19IF9fcGFja2VkOwotCi0KLSNkZWZpbmUgVEZEX1FVRVVFX1NJWkVfTUFYICAgICAgKDI1NikKLSNkZWZpbmUgVEZEX1FVRVVFX1NJWkVfQkNfRFVQCSg2NCkKLSNkZWZpbmUgVEZEX1FVRVVFX0JDX1NJWkUJKFRGRF9RVUVVRV9TSVpFX01BWCArIFRGRF9RVUVVRV9TSVpFX0JDX0RVUCkKLSNkZWZpbmUgSVdMX1RYX0RNQV9NQVNLICAgICAgICBETUFfQklUX01BU0soMzYpCi0jZGVmaW5lIElXTF9OVU1fT0ZfVEJTCQkyMAotCi1zdGF0aWMgaW5saW5lIHU4IGl3bF9sZWdhY3lfZ2V0X2RtYV9oaV9hZGRyKGRtYV9hZGRyX3QgYWRkcikKLXsKLQlyZXR1cm4gKHNpemVvZihhZGRyKSA+IHNpemVvZih1MzIpID8gKGFkZHIgPj4gMTYpID4+IDE2IDogMCkgJiAweEY7Ci19Ci0vKioKLSAqIHN0cnVjdCBpd2xfdGZkX3RiIHRyYW5zbWl0IGJ1ZmZlciBkZXNjcmlwdG9yIHdpdGhpbiB0cmFuc21pdCBmcmFtZSBkZXNjcmlwdG9yCi0gKgotICogVGhpcyBzdHJ1Y3R1cmUgY29udGFpbnMgZG1hIGFkZHJlc3MgYW5kIGxlbmd0aCBvZiB0cmFuc21pc3Npb24gYWRkcmVzcwotICoKLSAqIEBsbzogbG93IFszMTowXSBwb3J0aW9uIG9mIHRoZSBkbWEgYWRkcmVzcyBvZiBUWCBidWZmZXIKLSAqIAlldmVyeSBldmVuIGlzIHVuYWxpZ25lZCBvbiAxNiBiaXQgYm91bmRhcnkKLSAqIEBoaV9uX2xlbiAwLTMgWzM1OjMyXSBwb3J0aW9uIG9mIGRtYQotICoJICAgICA0LTE1IGxlbmd0aCBvZiB0aGUgdHggYnVmZmVyCi0gKi8KLXN0cnVjdCBpd2xfdGZkX3RiIHsKLQlfX2xlMzIgbG87Ci0JX19sZTE2IGhpX25fbGVuOwotfSBfX3BhY2tlZDsKLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX3RmZAotICoKLSAqIFRyYW5zbWl0IEZyYW1lIERlc2NyaXB0b3IgKFRGRCkKLSAqCi0gKiBAIF9fcmVzZXJ2ZWQxWzNdIHJlc2VydmVkCi0gKiBAIG51bV90YnMgMC00IG51bWJlciBvZiBhY3RpdmUgdGJzCi0gKgkgICAgIDUgICByZXNlcnZlZAotICogCSAgICAgNi03IHBhZGRpbmcgKG5vdCB1c2VkKQotICogQCB0YnNbMjBdCXRyYW5zbWl0IGZyYW1lIGJ1ZmZlciBkZXNjcmlwdG9ycwotICogQCBfX3BhZCAJcGFkZGluZwotICoKLSAqIEVhY2ggVHggcXVldWUgdXNlcyBhIGNpcmN1bGFyIGJ1ZmZlciBvZiAyNTYgVEZEcyBzdG9yZWQgaW4gaG9zdCBEUkFNLgotICogQm90aCBkcml2ZXIgYW5kIGRldmljZSBzaGFyZSB0aGVzZSBjaXJjdWxhciBidWZmZXJzLCBlYWNoIG9mIHdoaWNoIG11c3QgYmUKLSAqIGNvbnRpZ3VvdXMgMjU2IFRGRHMgeCAxMjggYnl0ZXMtcGVyLVRGRCA9IDMyIEtCeXRlcwotICoKLSAqIERyaXZlciBtdXN0IGluZGljYXRlIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIHRoZSBiYXNlIG9mIGVhY2gKLSAqIGNpcmN1bGFyIGJ1ZmZlciB2aWEgdGhlIEZIX01FTV9DQkJDX1FVRVVFIHJlZ2lzdGVycy4KLSAqCi0gKiBFYWNoIFRGRCBjb250YWlucyBwb2ludGVyL3NpemUgaW5mb3JtYXRpb24gZm9yIHVwIHRvIDIwIGRhdGEgYnVmZmVycwotICogaW4gaG9zdCBEUkFNLiAgVGhlc2UgYnVmZmVycyBjb2xsZWN0aXZlbHkgY29udGFpbiB0aGUgKG9uZSkgZnJhbWUgZGVzY3JpYmVkCi0gKiBieSB0aGUgVEZELiAgRWFjaCBidWZmZXIgbXVzdCBiZSBhIHNpbmdsZSBjb250aWd1b3VzIGJsb2NrIG9mIG1lbW9yeSB3aXRoaW4KLSAqIGl0c2VsZiwgYnV0IGJ1ZmZlcnMgbWF5IGJlIHNjYXR0ZXJlZCBpbiBob3N0IERSQU0uICBFYWNoIGJ1ZmZlciBoYXMgbWF4IHNpemUKLSAqIG9mICg0SyAtIDQpLiAgVGhlIGNvbmNhdGVuYXRlcyBhbGwgb2YgYSBURkQncyBidWZmZXJzIGludG8gYSBzaW5nbGUKLSAqIFR4IGZyYW1lLCB1cCB0byA4IEtCeXRlcyBpbiBzaXplLgotICoKLSAqIEEgbWF4aW11bSBvZiAyNTUgKG5vdCAyNTYhKSBURkRzIG1heSBiZSBvbiBhIHF1ZXVlIHdhaXRpbmcgZm9yIFR4LgotICovCi1zdHJ1Y3QgaXdsX3RmZCB7Ci0JdTggX19yZXNlcnZlZDFbM107Ci0JdTggbnVtX3RiczsKLQlzdHJ1Y3QgaXdsX3RmZF90YiB0YnNbSVdMX05VTV9PRl9UQlNdOwotCV9fbGUzMiBfX3BhZDsKLX0gX19wYWNrZWQ7Ci0KLS8qIEtlZXAgV2FybSBTaXplICovCi0jZGVmaW5lIElXTF9LV19TSVpFIDB4MTAwMAkvKiA0ayAqLwotCi0jZW5kaWYgLyogIV9faXdsX2xlZ2FjeV9maF9oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1oY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaGNtZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTFmYzlmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1oY21kLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKLSAqIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCi0gKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0KLQotY29uc3QgY2hhciAqaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyh1OCBjbWQpCi17Ci0Jc3dpdGNoIChjbWQpIHsKLQkJSVdMX0NNRChSRVBMWV9BTElWRSk7Ci0JCUlXTF9DTUQoUkVQTFlfRVJST1IpOwotCQlJV0xfQ01EKFJFUExZX1JYT04pOwotCQlJV0xfQ01EKFJFUExZX1JYT05fQVNTT0MpOwotCQlJV0xfQ01EKFJFUExZX1FPU19QQVJBTSk7Ci0JCUlXTF9DTUQoUkVQTFlfUlhPTl9USU1JTkcpOwotCQlJV0xfQ01EKFJFUExZX0FERF9TVEEpOwotCQlJV0xfQ01EKFJFUExZX1JFTU9WRV9TVEEpOwotCQlJV0xfQ01EKFJFUExZX1dFUEtFWSk7Ci0JCUlXTF9DTUQoUkVQTFlfMzk0NV9SWCk7Ci0JCUlXTF9DTUQoUkVQTFlfVFgpOwotCQlJV0xfQ01EKFJFUExZX1JBVEVfU0NBTEUpOwotCQlJV0xfQ01EKFJFUExZX0xFRFNfQ01EKTsKLQkJSVdMX0NNRChSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EKTsKLQkJSVdMX0NNRChSRVBMWV9DSEFOTkVMX1NXSVRDSCk7Ci0JCUlXTF9DTUQoQ0hBTk5FTF9TV0lUQ0hfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChSRVBMWV9TUEVDVFJVTV9NRUFTVVJFTUVOVF9DTUQpOwotCQlJV0xfQ01EKFNQRUNUUlVNX01FQVNVUkVfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChQT1dFUl9UQUJMRV9DTUQpOwotCQlJV0xfQ01EKFBNX1NMRUVQX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoUE1fREVCVUdfU1RBVElTVElDX05PVElGSUMpOwotCQlJV0xfQ01EKFJFUExZX1NDQU5fQ01EKTsKLQkJSVdMX0NNRChSRVBMWV9TQ0FOX0FCT1JUX0NNRCk7Ci0JCUlXTF9DTUQoU0NBTl9TVEFSVF9OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKFNDQU5fUkVTVUxUU19OT1RJRklDQVRJT04pOwotCQlJV0xfQ01EKFNDQU5fQ09NUExFVEVfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChCRUFDT05fTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChSRVBMWV9UWF9CRUFDT04pOwotCQlJV0xfQ01EKFJFUExZX1RYX1BXUl9UQUJMRV9DTUQpOwotCQlJV0xfQ01EKFJFUExZX0JUX0NPTkZJRyk7Ci0JCUlXTF9DTUQoUkVQTFlfU1RBVElTVElDU19DTUQpOwotCQlJV0xfQ01EKFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChDQVJEX1NUQVRFX05PVElGSUNBVElPTik7Ci0JCUlXTF9DTUQoTUlTU0VEX0JFQUNPTlNfTk9USUZJQ0FUSU9OKTsKLQkJSVdMX0NNRChSRVBMWV9DVF9LSUxMX0NPTkZJR19DTUQpOwotCQlJV0xfQ01EKFNFTlNJVElWSVRZX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfUEhZX0NBTElCUkFUSU9OX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfUlhfUEhZX0NNRCk7Ci0JCUlXTF9DTUQoUkVQTFlfUlhfTVBEVV9DTUQpOwotCQlJV0xfQ01EKFJFUExZX1JYKTsKLQkJSVdMX0NNRChSRVBMWV9DT01QUkVTU0VEX0JBKTsKLQlkZWZhdWx0OgotCQlyZXR1cm4gIlVOS05PV04iOwotCi0JfQotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKTsKLQotI2RlZmluZSBIT1NUX0NPTVBMRVRFX1RJTUVPVVQgKEhaIC8gMikKLQotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9nZW5lcmljX2NtZF9jYWxsYmFjayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCwKLQkJCQkgICAgIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QpCi17Ci0JaWYgKHBrdC0+aGRyLmZsYWdzICYgSVdMX0NNRF9GQUlMRURfTVNLKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkJhZCByZXR1cm4gZnJvbSAlcyAoMHglMDhYKVxuIiwKLQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpLCBwa3QtPmhkci5mbGFncyk7Ci0JCXJldHVybjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlzd2l0Y2ggKGNtZC0+aGRyLmNtZCkgewotCWNhc2UgUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRDoKLQljYXNlIFNFTlNJVElWSVRZX0NNRDoKLQkJSVdMX0RFQlVHX0hDX0RVTVAocHJpdiwgImJhY2sgZnJvbSAlcyAoMHglMDhYKVxuIiwKLQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpLCBwa3QtPmhkci5mbGFncyk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9ERUJVR19IQyhwcml2LCAiYmFjayBmcm9tICVzICgweCUwOFgpXG4iLAotCQlpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKGNtZC0+aGRyLmNtZCksIHBrdC0+aGRyLmZsYWdzKTsKLQl9Ci0jZW5kaWYKLX0KLQotc3RhdGljIGludAotaXdsX2xlZ2FjeV9zZW5kX2NtZF9hc3luYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKLXsKLQlpbnQgcmV0OwotCi0JQlVHX09OKCEoY21kLT5mbGFncyAmIENNRF9BU1lOQykpOwotCi0JLyogQW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgY2FuIG5vdCBleHBlY3QgYW4gU0tCIHRvIGJlIHNldC4gKi8KLQlCVUdfT04oY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQik7Ci0KLQkvKiBBc3NpZ24gYSBnZW5lcmljIGNhbGxiYWNrIGlmIG9uZSBpcyBub3QgcHJvdmlkZWQgKi8KLQlpZiAoIWNtZC0+Y2FsbGJhY2spCi0JCWNtZC0+Y2FsbGJhY2sgPSBpd2xfbGVnYWN5X2dlbmVyaWNfY21kX2NhbGxiYWNrOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9lbnF1ZXVlX2hjbWQocHJpdiwgY21kKTsKLQlpZiAocmV0IDwgMCkgewotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZW5kaW5nICVzOiBlbnF1ZXVlX2hjbWQgZmFpbGVkOiAlZFxuIiwKLQkJCSAgaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpCi17Ci0JaW50IGNtZF9pZHg7Ci0JaW50IHJldDsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCUJVR19PTihjbWQtPmZsYWdzICYgQ01EX0FTWU5DKTsKLQotCSAvKiBBIHN5bmNocm9ub3VzIGNvbW1hbmQgY2FuIG5vdCBoYXZlIGEgY2FsbGJhY2sgc2V0LiAqLwotCUJVR19PTihjbWQtPmNhbGxiYWNrKTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJBdHRlbXB0aW5nIHRvIHNlbmQgc3luYyBjb21tYW5kICVzXG4iLAotCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7Ci0KLQlzZXRfYml0KFNUQVRVU19IQ01EX0FDVElWRSwgJnByaXYtPnN0YXR1cyk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlNldHRpbmcgSENNRF9BQ1RJVkUgZm9yIGNvbW1hbmQgJXNcbiIsCi0JCQlpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKLQotCWNtZF9pZHggPSBpd2xfbGVnYWN5X2VucXVldWVfaGNtZChwcml2LCBjbWQpOwotCWlmIChjbWRfaWR4IDwgMCkgewotCQlyZXQgPSBjbWRfaWR4OwotCQlJV0xfRVJSKHByaXYsICJFcnJvciBzZW5kaW5nICVzOiBlbnF1ZXVlX2hjbWQgZmFpbGVkOiAlZFxuIiwKLQkJCSAgaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSwgcmV0KTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcmV0ID0gd2FpdF9ldmVudF90aW1lb3V0KHByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSwKLQkJCSF0ZXN0X2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpLAotCQkJSE9TVF9DT01QTEVURV9USU1FT1VUKTsKLQlpZiAoIXJldCkgewotCQlpZiAodGVzdF9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c3RhdHVzKSkgewotCQkJSVdMX0VSUihwcml2LAotCQkJCSJFcnJvciBzZW5kaW5nICVzOiB0aW1lIG91dCBhZnRlciAlZG1zLlxuIiwKLQkJCQlpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpLAotCQkJCWppZmZpZXNfdG9fbXNlY3MoSE9TVF9DT01QTEVURV9USU1FT1VUKSk7Ci0KLQkJCWNsZWFyX2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpOwotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkiQ2xlYXJpbmcgSENNRF9BQ1RJVkUgZm9yIGNvbW1hbmQgJXNcbiIsCi0JCQkJICAgICAgIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwotCQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJCWdvdG8gY2FuY2VsOwotCQl9Ci0JfQotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfRVJSKHByaXYsICJDb21tYW5kICVzIGFib3J0ZWQ6IFJGIEtJTEwgU3dpdGNoXG4iLAotCQkJICAgICAgIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwotCQlyZXQgPSAtRUNBTkNFTEVEOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNvbW1hbmQgJXMgZmFpbGVkOiBGVyBFcnJvclxuIiwKLQkJCSAgICAgICBpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBmYWlsOwotCX0KLQlpZiAoKGNtZC0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpICYmICFjbWQtPnJlcGx5X3BhZ2UpIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3I6IFJlc3BvbnNlIE5VTEwgaW4gJyVzJ1xuIiwKLQkJCSAgaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7Ci0JCXJldCA9IC1FSU87Ci0JCWdvdG8gY2FuY2VsOwotCX0KLQotCXJldCA9IDA7Ci0JZ290byBvdXQ7Ci0KLWNhbmNlbDoKLQlpZiAoY21kLT5mbGFncyAmIENNRF9XQU5UX1NLQikgewotCQkvKgotCQkgKiBDYW5jZWwgdGhlIENNRF9XQU5UX1NLQiBmbGFnIGZvciB0aGUgY21kIGluIHRoZQotCQkgKiBUWCBjbWQgcXVldWUuIE90aGVyd2lzZSBpbiBjYXNlIHRoZSBjbWQgY29tZXMKLQkJICogaW4gbGF0ZXIsIGl0IHdpbGwgcG9zc2libHkgc2V0IGFuIGludmFsaWQKLQkJICogYWRkcmVzcyAoY21kLT5tZXRhLnNvdXJjZSkuCi0JCSAqLwotCQlwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXS5tZXRhW2NtZF9pZHhdLmZsYWdzICY9Ci0JCQkJCQkJfkNNRF9XQU5UX1NLQjsKLQl9Ci1mYWlsOgotCWlmIChjbWQtPnJlcGx5X3BhZ2UpIHsKLQkJaXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIGNtZC0+cmVwbHlfcGFnZSk7Ci0JCWNtZC0+cmVwbHlfcGFnZSA9IDA7Ci0JfQotb3V0OgotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2VuZF9jbWRfc3luYyk7Ci0KLWludCBpd2xfbGVnYWN5X3NlbmRfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9ob3N0X2NtZCAqY21kKQotewotCWlmIChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKQotCQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZF9hc3luYyhwcml2LCBjbWQpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfc3luYyhwcml2LCBjbWQpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfY21kKTsKLQotaW50Ci1pd2xfbGVnYWN5X3NlbmRfY21kX3BkdShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IGlkLCB1MTYgbGVuLCBjb25zdCB2b2lkICpkYXRhKQotewotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBpZCwKLQkJLmxlbiA9IGxlbiwKLQkJLmRhdGEgPSBkYXRhLAotCX07Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9zZW5kX2NtZF9zeW5jKHByaXYsICZjbWQpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfY21kX3BkdSk7Ci0KLWludCBpd2xfbGVnYWN5X3NlbmRfY21kX3BkdV9hc3luYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICB1OCBpZCwgdTE2IGxlbiwgY29uc3Qgdm9pZCAqZGF0YSwKLQkJCSAgIHZvaWQgKCpjYWxsYmFjaykoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJCSAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0KSkKLXsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKLQkJLmlkID0gaWQsCi0JCS5sZW4gPSBsZW4sCi0JCS5kYXRhID0gZGF0YSwKLQl9OwotCi0JY21kLmZsYWdzIHw9IENNRF9BU1lOQzsKLQljbWQuY2FsbGJhY2sgPSBjYWxsYmFjazsKLQotCXJldHVybiBpd2xfbGVnYWN5X3NlbmRfY21kX2FzeW5jKHByaXYsICZjbWQpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfY21kX3BkdV9hc3luYyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaGVscGVycy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWhlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNmMjNlYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtaGVscGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAotICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF9sZWdhY3lfaGVscGVyc19oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X2hlbHBlcnNfaF9fCi0KLSNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0KLSNkZWZpbmUgSVdMX01BU0sobG8sIGhpKSAoKDEgPDwgKGhpKSkgfCAoKDEgPDwgKGhpKSkgLSAoMSA8PCAobG8pKSkpCi0KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKml3bF9sZWdhY3lfaWVlZTgwMjExX2dldF9od19jb25mKAotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXJldHVybiAmaHctPmNvbmY7Ci19Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcCAtIGluY3JlbWVudCBxdWV1ZSBpbmRleCwgd3JhcCBiYWNrIHRvIGJlZ2lubmluZwotICogQGluZGV4IC0tIGN1cnJlbnQgaW5kZXgKLSAqIEBuX2JkIC0tIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHF1ZXVlIChtdXN0IGJlIHBvd2VyIG9mIDIpCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAoaW50IGluZGV4LCBpbnQgbl9iZCkKLXsKLQlyZXR1cm4gKytpbmRleCAmIChuX2JkIC0gMSk7Ci19Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9xdWV1ZV9kZWNfd3JhcCAtIGRlY3JlbWVudCBxdWV1ZSBpbmRleCwgd3JhcCBiYWNrIHRvIGVuZAotICogQGluZGV4IC0tIGN1cnJlbnQgaW5kZXgKLSAqIEBuX2JkIC0tIHRvdGFsIG51bWJlciBvZiBlbnRyaWVzIGluIHF1ZXVlIChtdXN0IGJlIHBvd2VyIG9mIDIpCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfcXVldWVfZGVjX3dyYXAoaW50IGluZGV4LCBpbnQgbl9iZCkKLXsKLQlyZXR1cm4gLS1pbmRleCAmIChuX2JkIC0gMSk7Ci19Ci0KLS8qIFRPRE86IE1vdmUgZndfZGVzYyBmdW5jdGlvbnMgdG8gaXdsLXBjaS5rbyAqLwotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAotCQkJCSAgICBzdHJ1Y3QgZndfZGVzYyAqZGVzYykKLXsKLQlpZiAoZGVzYy0+dl9hZGRyKQotCQlkbWFfZnJlZV9jb2hlcmVudCgmcGNpX2Rldi0+ZGV2LCBkZXNjLT5sZW4sCi0JCQkJICBkZXNjLT52X2FkZHIsIGRlc2MtPnBfYWRkcik7Ci0JZGVzYy0+dl9hZGRyID0gTlVMTDsKLQlkZXNjLT5sZW4gPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCBpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2Moc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCi0JCQkJICAgIHN0cnVjdCBmd19kZXNjICpkZXNjKQotewotCWlmICghZGVzYy0+bGVuKSB7Ci0JCWRlc2MtPnZfYWRkciA9IE5VTEw7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRlc2MtPnZfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGNpX2Rldi0+ZGV2LCBkZXNjLT5sZW4sCi0JCQkJCSAgJmRlc2MtPnBfYWRkciwgR0ZQX0tFUk5FTCk7Ci0JcmV0dXJuIChkZXNjLT52X2FkZHIgIT0gTlVMTCkgPyAwIDogLUVOT01FTTsKLX0KLQotLyoKLSAqIHdlIGhhdmUgOCBiaXRzIHVzZWQgbGlrZSB0aGlzOgotICoKLSAqIDcgNiA1IDQgMyAyIDEgMAotICogfCB8IHwgfCB8IHwgfCB8Ci0gKiB8IHwgfCB8IHwgfCArLSstLS0tLS0tLSBBQyBxdWV1ZSAoMC0zKQotICogfCB8IHwgfCB8IHwKLSAqIHwgKy0rLSstKy0rLS0tLS0tLS0tLS0tIEhXIHF1ZXVlIElECi0gKiB8Ci0gKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB1bnVzZWQKLSAqLwotc3RhdGljIGlubGluZSB2b2lkCi1pd2xfbGVnYWN5X3NldF9zd3FfaWQoc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLCB1OCBhYywgdTggaHdxKQotewotCUJVR19PTihhYyA+IDMpOyAgIC8qIG9ubHkgaGF2ZSAyIGJpdHMgKi8KLQlCVUdfT04oaHdxID4gMzEpOyAvKiBvbmx5IHVzZSA1IGJpdHMgKi8KLQotCXR4cS0+c3dxX2lkID0gKGh3cSA8PCAyKSB8IGFjOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV93YWtlX3F1ZXVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKLXsKLQl1OCBxdWV1ZSA9IHR4cS0+c3dxX2lkOwotCXU4IGFjID0gcXVldWUgJiAzOwotCXU4IGh3cSA9IChxdWV1ZSA+PiAyKSAmIDB4MWY7Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KGh3cSwgcHJpdi0+cXVldWVfc3RvcHBlZCkpCi0JCWlmIChhdG9taWNfZGVjX3JldHVybigmcHJpdi0+cXVldWVfc3RvcF9jb3VudFthY10pIDw9IDApCi0JCQlpZWVlODAyMTFfd2FrZV9xdWV1ZShwcml2LT5odywgYWMpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9zdG9wX3F1ZXVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKLXsKLQl1OCBxdWV1ZSA9IHR4cS0+c3dxX2lkOwotCXU4IGFjID0gcXVldWUgJiAzOwotCXU4IGh3cSA9IChxdWV1ZSA+PiAyKSAmIDB4MWY7Ci0KLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaHdxLCBwcml2LT5xdWV1ZV9zdG9wcGVkKSkKLQkJaWYgKGF0b21pY19pbmNfcmV0dXJuKCZwcml2LT5xdWV1ZV9zdG9wX2NvdW50W2FjXSkgPiAwKQotCQkJaWVlZTgwMjExX3N0b3BfcXVldWUocHJpdi0+aHcsIGFjKTsKLX0KLQotI2lmZGVmIGllZWU4MDIxMV9zdG9wX3F1ZXVlCi0jdW5kZWYgaWVlZTgwMjExX3N0b3BfcXVldWUKLSNlbmRpZgotCi0jZGVmaW5lIGllZWU4MDIxMV9zdG9wX3F1ZXVlIERPX05PVF9VU0VfaWVlZTgwMjExX3N0b3BfcXVldWUKLQotI2lmZGVmIGllZWU4MDIxMV93YWtlX3F1ZXVlCi0jdW5kZWYgaWVlZTgwMjExX3dha2VfcXVldWUKLSNlbmRpZgotCi0jZGVmaW5lIGllZWU4MDIxMV93YWtlX3F1ZXVlIERPX05PVF9VU0VfaWVlZTgwMjExX3dha2VfcXVldWUKLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQljbGVhcl9iaXQoU1RBVFVTX0lOVF9FTkFCTEVELCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIGRpc2FibGUgaW50ZXJydXB0cyBmcm9tIHVDb2RlL05JQyB0byBob3N0ICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVF9NQVNLLCAweDAwMDAwMDAwKTsKLQotCS8qIGFja25vd2xlZGdlL2NsZWFyL3Jlc2V0IGFueSBpbnRlcnJ1cHRzIHN0aWxsIHBlbmRpbmcKLQkgKiBmcm9tIHVDb2RlIG9yIGZsb3cgaGFuZGxlciAoUngvVHggRE1BKSAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlQsIDB4ZmZmZmZmZmYpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTLCAweGZmZmZmZmZmKTsKLQlJV0xfREVCVUdfSVNSKHByaXYsICJEaXNhYmxlZCBpbnRlcnJ1cHRzXG4iKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfZW5hYmxlX3Jma2lsbF9pbnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCUlXTF9ERUJVR19JU1IocHJpdiwgIkVuYWJsaW5nIHJma2lsbCBpbnRlcnJ1cHRcbiIpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlRfTUFTSywgQ1NSX0lOVF9CSVRfUkZfS0lMTCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlJV0xfREVCVUdfSVNSKHByaXYsICJFbmFibGluZyBpbnRlcnJ1cHRzXG4iKTsKLQlzZXRfYml0KFNUQVRVU19JTlRfRU5BQkxFRCwgJnByaXYtPnN0YXR1cyk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVF9NQVNLLCBwcml2LT5pbnRhX21hc2spOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfYmVhY29uX3RpbWVfbWFza19sb3cgLSBtYXNrIG9mIGxvd2VyIDMyIGJpdCBvZiBiZWFjb24gdGltZQotICogQHByaXYgLS0gcG9pbnRlciB0byBpd2xfcHJpdiBkYXRhIHN0cnVjdHVyZQotICogQHRzZl9iaXRzIC0tIG51bWJlciBvZiBiaXRzIG5lZWQgdG8gc2hpZnQgZm9yIG1hc2tpbmcpCi0gKi8KLXN0YXRpYyBpbmxpbmUgdTMyIGl3bF9sZWdhY3lfYmVhY29uX3RpbWVfbWFza19sb3coc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICB1MTYgdHNmX2JpdHMpCi17Ci0JcmV0dXJuICgxIDw8IHRzZl9iaXRzKSAtIDE7Ci19Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9iZWFjb25fdGltZV9tYXNrX2hpZ2ggLSBtYXNrIG9mIGhpZ2hlciAzMiBiaXQgb2YgYmVhY29uIHRpbWUKLSAqIEBwcml2IC0tIHBvaW50ZXIgdG8gaXdsX3ByaXYgZGF0YSBzdHJ1Y3R1cmUKLSAqIEB0c2ZfYml0cyAtLSBudW1iZXIgb2YgYml0cyBuZWVkIHRvIHNoaWZ0IGZvciBtYXNraW5nKQotICovCi1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X2JlYWNvbl90aW1lX21hc2tfaGlnaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgICB1MTYgdHNmX2JpdHMpCi17Ci0JcmV0dXJuICgoMSA8PCAoMzIgLSB0c2ZfYml0cykpIC0gMSkgPDwgdHNmX2JpdHM7Ci19Ci0KLSNlbmRpZgkJCQkvKiBfX2l3bF9sZWdhY3lfaGVscGVyc19oX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1pby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWlvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzVkMzQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWlvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF9sZWdhY3lfaW9faF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9pb19oX18KLQotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWRlYnVnLmgiCi0jaW5jbHVkZSAiaXdsLWRldnRyYWNlLmgiCi0KLS8qCi0gKiBJTywgcmVnaXN0ZXIsIGFuZCBOSUMgbWVtb3J5IGFjY2VzcyBmdW5jdGlvbnMKLSAqCi0gKiBOT1RFIG9uIG5hbWluZyBjb252ZW50aW9uIGFuZCBtYWNybyB1c2FnZSBmb3IgdGhlc2UKLSAqCi0gKiBBIHNpbmdsZSBfIHByZWZpeCBiZWZvcmUgYSBhbiBhY2Nlc3MgZnVuY3Rpb24gbWVhbnMgdGhhdCBubyBzdGF0ZQotICogY2hlY2sgb3IgZGVidWcgaW5mb3JtYXRpb24gaXMgcHJpbnRlZCB3aGVuIHRoYXQgZnVuY3Rpb24gaXMgY2FsbGVkLgotICoKLSAqIEEgZG91YmxlIF9fIHByZWZpeCBiZWZvcmUgYW4gYWNjZXNzIGZ1bmN0aW9uIG1lYW5zIHRoYXQgc3RhdGUgaXMgY2hlY2tlZAotICogYW5kIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIGFuZCBjYWxsZXIgZnVuY3Rpb24gbmFtZSBhcmUgcHJpbnRlZCBpbiBhZGRpdGlvbgotICogdG8gYW55IG90aGVyIGRlYnVnIG91dHB1dC4KLSAqCi0gKiBUaGUgbm9uLXByZWZpeGVkIG5hbWUgaXMgdGhlICNkZWZpbmUgdGhhdCBtYXBzIHRoZSBjYWxsZXIgaW50byBhCi0gKiAjZGVmaW5lIHRoYXQgcHJvdmlkZXMgdGhlIGNhbGxlcidzIG5hbWUgYW5kIF9fTElORV9fIHRvIHRoZSBkb3VibGUKLSAqIHByZWZpeCB2ZXJzaW9uLgotICoKLSAqIElmIHlvdSB3aXNoIHRvIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGhvdXQgYW55IGRlYnVnIG9yIHN0YXRlIGNoZWNraW5nLAotICogeW91IHNob3VsZCB1c2UgdGhlIHNpbmdsZSBfIHByZWZpeCB2ZXJzaW9uIChhcyBpcyB1c2VkIGJ5IGRlcGVuZGVudCBJTwotICogcm91dGluZXMsIGZvciBleGFtcGxlIF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIgY2FsbHMgdGhlIG5vbi1jaGVjayB2ZXJzaW9uIG9mCi0gKiBfaXdsX2xlZ2FjeV9yZWFkMzIuKQotICoKLSAqIFRoZXNlIGRlY2xhcmF0aW9ucyBhcmUgKmV4dHJlbWVseSogdXNlZnVsIGluIHF1aWNrbHkgaXNvbGF0aW5nIGNvZGUgZGVsdGFzCi0gKiB3aGljaCByZXN1bHQgaW4gbWlzY29uZmlndXJhdGlvbiBvZiB0aGUgaGFyZHdhcmUgSS9PLiAgSW4gY29tYmluYXRpb24gd2l0aAotICogZ2l0LWJpc2VjdCBhbmQgdGhlIElPIGRlYnVnIGxldmVsIHlvdSBjYW4gcXVpY2tseSBkZXRlcm1pbmUgdGhlIHNwZWNpZmljCi0gKiBjb21taXQgd2hpY2ggYnJlYWtzIHRoZSBJTyBzZXF1ZW5jZSB0byB0aGUgaGFyZHdhcmUuCi0gKgotICovCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfaXdsX2xlZ2FjeV93cml0ZTgoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgb2ZzLCB1OCB2YWwpCi17Ci0JdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X2lvd3JpdGU4KHByaXYsIG9mcywgdmFsKTsKLQlpb3dyaXRlOCh2YWwsIHByaXYtPmh3X2Jhc2UgKyBvZnMpOwotfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9faXdsX2xlZ2FjeV93cml0ZTgoY29uc3QgY2hhciAqZiwgdTMyIGwsIHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgdTMyIG9mcywgdTggdmFsKQotewotCUlXTF9ERUJVR19JTyhwcml2LCAid3JpdGU4KDB4JTA4WCwgMHglMDJYKSAtICVzICVkXG4iLCBvZnMsIHZhbCwgZiwgbCk7Ci0JX2l3bF9sZWdhY3lfd3JpdGU4KHByaXYsIG9mcywgdmFsKTsKLX0KLSNkZWZpbmUgaXdsX3dyaXRlOChwcml2LCBvZnMsIHZhbCkgXAotCV9faXdsX2xlZ2FjeV93cml0ZTgoX19GSUxFX18sIF9fTElORV9fLCBwcml2LCBvZnMsIHZhbCkKLSNlbHNlCi0jZGVmaW5lIGl3bF93cml0ZTgocHJpdiwgb2ZzLCB2YWwpIF9pd2xfbGVnYWN5X3dyaXRlOChwcml2LCBvZnMsIHZhbCkKLSNlbmRpZgotCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfaXdsX2xlZ2FjeV93cml0ZTMyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mcywgdTMyIHZhbCkKLXsKLQl0cmFjZV9pd2x3aWZpX2xlZ2FjeV9kZXZfaW93cml0ZTMyKHByaXYsIG9mcywgdmFsKTsKLQlpb3dyaXRlMzIodmFsLCBwcml2LT5od19iYXNlICsgb2ZzKTsKLX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSB2b2lkCi1fX2l3bF9sZWdhY3lfd3JpdGUzMihjb25zdCBjaGFyICpmLCB1MzIgbCwgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSB1MzIgb2ZzLCB1MzIgdmFsKQotewotCUlXTF9ERUJVR19JTyhwcml2LCAid3JpdGUzMigweCUwOFgsIDB4JTA4WCkgLSAlcyAlZFxuIiwgb2ZzLCB2YWwsIGYsIGwpOwotCV9pd2xfbGVnYWN5X3dyaXRlMzIocHJpdiwgb2ZzLCB2YWwpOwotfQotI2RlZmluZSBpd2xfd3JpdGUzMihwcml2LCBvZnMsIHZhbCkgXAotCV9faXdsX2xlZ2FjeV93cml0ZTMyKF9fRklMRV9fLCBfX0xJTkVfXywgcHJpdiwgb2ZzLCB2YWwpCi0jZWxzZQotI2RlZmluZSBpd2xfd3JpdGUzMihwcml2LCBvZnMsIHZhbCkgX2l3bF9sZWdhY3lfd3JpdGUzMihwcml2LCBvZnMsIHZhbCkKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHUzMiBfaXdsX2xlZ2FjeV9yZWFkMzIoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgb2ZzKQotewotCXUzMiB2YWwgPSBpb3JlYWQzMihwcml2LT5od19iYXNlICsgb2ZzKTsKLQl0cmFjZV9pd2x3aWZpX2xlZ2FjeV9kZXZfaW9yZWFkMzIocHJpdiwgb2ZzLCB2YWwpOwotCXJldHVybiB2YWw7Ci19Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXN0YXRpYyBpbmxpbmUgdTMyCi1fX2l3bF9sZWdhY3lfcmVhZDMyKGNoYXIgKmYsIHUzMiBsLCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZnMpCi17Ci0JSVdMX0RFQlVHX0lPKHByaXYsICJyZWFkX2RpcmVjdDMyKDB4JTA4WCkgLSAlcyAlZFxuIiwgb2ZzLCBmLCBsKTsKLQlyZXR1cm4gX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIG9mcyk7Ci19Ci0jZGVmaW5lIGl3bF9yZWFkMzIocHJpdiwgb2ZzKSBfX2l3bF9sZWdhY3lfcmVhZDMyKF9fRklMRV9fLCBfX0xJTkVfXywgcHJpdiwgb2ZzKQotI2Vsc2UKLSNkZWZpbmUgaXdsX3JlYWQzMihwLCBvKSBfaXdsX2xlZ2FjeV9yZWFkMzIocCwgbykKLSNlbmRpZgotCi0jZGVmaW5lIElXTF9QT0xMX0lOVEVSVkFMIDEwCS8qIG1pY3Jvc2Vjb25kcyAqLwotc3RhdGljIGlubGluZSBpbnQKLV9pd2xfbGVnYWN5X3BvbGxfYml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGFkZHIsCi0JCQkJdTMyIGJpdHMsIHUzMiBtYXNrLCBpbnQgdGltZW91dCkKLXsKLQlpbnQgdCA9IDA7Ci0KLQlkbyB7Ci0JCWlmICgoX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIGFkZHIpICYgbWFzaykgPT0gKGJpdHMgJiBtYXNrKSkKLQkJCXJldHVybiB0OwotCQl1ZGVsYXkoSVdMX1BPTExfSU5URVJWQUwpOwotCQl0ICs9IElXTF9QT0xMX0lOVEVSVkFMOwotCX0gd2hpbGUgKHQgPCB0aW1lb3V0KTsKLQotCXJldHVybiAtRVRJTUVET1VUOwotfQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSBpbnQgX19pd2xfbGVnYWN5X3BvbGxfYml0KGNvbnN0IGNoYXIgKmYsIHUzMiBsLAotCQkJCSBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBhZGRyLAotCQkJCSB1MzIgYml0cywgdTMyIG1hc2ssIGludCB0aW1lb3V0KQotewotCWludCByZXQgPSBfaXdsX2xlZ2FjeV9wb2xsX2JpdChwcml2LCBhZGRyLCBiaXRzLCBtYXNrLCB0aW1lb3V0KTsKLQlJV0xfREVCVUdfSU8ocHJpdiwgInBvbGxfYml0KDB4JTA4WCwgMHglMDhYLCAweCUwOFgpIC0gJXMtICVzICVkXG4iLAotCQkgICAgIGFkZHIsIGJpdHMsIG1hc2ssCi0JCSAgICAgdW5saWtlbHkocmV0ICA9PSAtRVRJTUVET1VUKSA/ICJ0aW1lb3V0IiA6ICIiLCBmLCBsKTsKLQlyZXR1cm4gcmV0OwotfQotI2RlZmluZSBpd2xfcG9sbF9iaXQocHJpdiwgYWRkciwgYml0cywgbWFzaywgdGltZW91dCkgXAotCV9faXdsX2xlZ2FjeV9wb2xsX2JpdChfX0ZJTEVfXywgX19MSU5FX18sIHByaXYsIGFkZHIsIFwKLQliaXRzLCBtYXNrLCB0aW1lb3V0KQotI2Vsc2UKLSNkZWZpbmUgaXdsX3BvbGxfYml0KHAsIGEsIGIsIG0sIHQpIF9pd2xfbGVnYWN5X3BvbGxfYml0KHAsIGEsIGIsIG0sIHQpCi0jZW5kaWYKLQotc3RhdGljIGlubGluZSB2b2lkIF9pd2xfbGVnYWN5X3NldF9iaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaykKLXsKLQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIHJlZywgX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIHJlZykgfCBtYXNrKTsKLX0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXN0YXRpYyBpbmxpbmUgdm9pZCBfX2l3bF9sZWdhY3lfc2V0X2JpdChjb25zdCBjaGFyICpmLCB1MzIgbCwKLQkJCQkgc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaykKLXsKLQl1MzIgdmFsID0gX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIHJlZykgfCBtYXNrOwotCUlXTF9ERUJVR19JTyhwcml2LCAic2V0X2JpdCgweCUwOFgsIDB4JTA4WCkgPSAweCUwOFhcbiIsIHJlZywKLQkJCQkJCQltYXNrLCB2YWwpOwotCV9pd2xfbGVnYWN5X3dyaXRlMzIocHJpdiwgcmVnLCB2YWwpOwotfQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfc2V0X2JpdChzdHJ1Y3QgaXdsX3ByaXYgKnAsIHUzMiByLCB1MzIgbSkKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlfX2l3bF9sZWdhY3lfc2V0X2JpdChfX0ZJTEVfXywgX19MSU5FX18sIHAsIHIsIG0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotfQotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3NldF9iaXQoc3RydWN0IGl3bF9wcml2ICpwLCB1MzIgciwgdTMyIG0pCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JX2l3bF9sZWdhY3lfc2V0X2JpdChwLCByLCBtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHZvaWQKLV9pd2xfbGVnYWN5X2NsZWFyX2JpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcsIHUzMiBtYXNrKQotewotCV9pd2xfbGVnYWN5X3dyaXRlMzIocHJpdiwgcmVnLCBfaXdsX2xlZ2FjeV9yZWFkMzIocHJpdiwgcmVnKSAmIH5tYXNrKTsKLX0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXN0YXRpYyBpbmxpbmUgdm9pZAotX19pd2xfbGVnYWN5X2NsZWFyX2JpdChjb25zdCBjaGFyICpmLCB1MzIgbCwKLQkJCQkgICBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcsIHUzMiBtYXNrKQotewotCXUzMiB2YWwgPSBfaXdsX2xlZ2FjeV9yZWFkMzIocHJpdiwgcmVnKSAmIH5tYXNrOwotCUlXTF9ERUJVR19JTyhwcml2LCAiY2xlYXJfYml0KDB4JTA4WCwgMHglMDhYKSA9IDB4JTA4WFxuIiwgcmVnLCBtYXNrLCB2YWwpOwotCV9pd2xfbGVnYWN5X3dyaXRlMzIocHJpdiwgcmVnLCB2YWwpOwotfQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfY2xlYXJfYml0KHN0cnVjdCBpd2xfcHJpdiAqcCwgdTMyIHIsIHUzMiBtKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCV9faXdsX2xlZ2FjeV9jbGVhcl9iaXQoX19GSUxFX18sIF9fTElORV9fLCBwLCByLCBtKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9jbGVhcl9iaXQoc3RydWN0IGl3bF9wcml2ICpwLCB1MzIgciwgdTMyIG0pCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcC0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JX2l3bF9sZWdhY3lfY2xlYXJfYml0KHAsIHIsIG0pOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IF9pd2xfbGVnYWN5X2dyYWJfbmljX2FjY2VzcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQl1MzIgdmFsOwotCi0JLyogdGhpcyBiaXQgd2FrZXMgdXAgdGhlIE5JQyAqLwotCV9pd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLAotCQkJCUNTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQUNDRVNTX1JFUSk7Ci0KLQkvKgotCSAqIFRoZXNlIGJpdHMgc2F5IHRoZSBkZXZpY2UgaXMgcnVubmluZywgYW5kIHNob3VsZCBrZWVwIHJ1bm5pbmcgZm9yCi0JICogYXQgbGVhc3QgYSBzaG9ydCB3aGlsZSAoYXQgbGVhc3QgYXMgbG9uZyBhcyBNQUNfQUNDRVNTX1JFUSBzdGF5cyAxKSwKLQkgKiBidXQgdGhleSBkbyBub3QgaW5kaWNhdGUgdGhhdCBlbWJlZGRlZCBTUkFNIGlzIHJlc3RvcmVkIHlldDsKLQkgKiAzOTQ1IGFuZCA0OTY1IGhhdmUgdm9sYXRpbGUgU1JBTSwgYW5kIG11c3Qgc2F2ZS9yZXN0b3JlIGNvbnRlbnRzCi0JICogdG8vZnJvbSBob3N0IERSQU0gd2hlbiBzbGVlcGluZy93YWtpbmcgZm9yIHBvd2VyLXNhdmluZy4KLQkgKiBFYWNoIGRpcmVjdGlvbiB0YWtlcyBhcHByb3hpbWF0ZWx5IDEvNCBtaWxsaXNlY29uZDsgd2l0aCB0aGlzCi0JICogb3ZlcmhlYWQsIGl0J3MgYSBnb29kIGlkZWEgdG8gZ3JhYiBhbmQgaG9sZCBNQUNfQUNDRVNTX1JFUVVFU1QgaWYgYQotCSAqIHNlcmllcyBvZiByZWdpc3RlciBhY2Nlc3NlcyBhcmUgZXhwZWN0ZWQgKGUuZy4gcmVhZGluZyBFdmVudCBMb2cpLAotCSAqIHRvIGtlZXAgZGV2aWNlIGZyb20gc2xlZXBpbmcuCi0JICoKLQkgKiBDU1JfVUNPREVfRFJWX0dQMSByZWdpc3RlciBiaXQgTUFDX1NMRUVQID09IDAgaW5kaWNhdGVzIHRoYXQKLQkgKiBTUkFNIGlzIG9rYXkvcmVzdG9yZWQuICBXZSBkb24ndCBjaGVjayB0aGF0IGhlcmUgYmVjYXVzZSB0aGlzIGNhbGwKLQkgKiBpcyBqdXN0IGZvciBoYXJkd2FyZSByZWdpc3RlciBhY2Nlc3M7IGJ1dCBHUDEgTUFDX1NMRUVQIGNoZWNrIGlzIGEKLQkgKiBnb29kIGlkZWEgYmVmb3JlIGFjY2Vzc2luZyAzOTQ1LzQ5NjUgU1JBTSAoZS5nLiByZWFkaW5nIEV2ZW50IExvZykuCi0JICoKLQkgKi8KLQlyZXQgPSBfaXdsX2xlZ2FjeV9wb2xsX2JpdChwcml2LCBDU1JfR1BfQ05UUkwsCi0JCQkgICBDU1JfR1BfQ05UUkxfUkVHX1ZBTF9NQUNfQUNDRVNTX0VOLAotCQkJICAgKENTUl9HUF9DTlRSTF9SRUdfRkxBR19NQUNfQ0xPQ0tfUkVBRFkgfAotCQkJICAgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19HT0lOR19UT19TTEVFUCksIDE1MDAwKTsKLQlpZiAocmV0IDwgMCkgewotCQl2YWwgPSBfaXdsX2xlZ2FjeV9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKTsKLQkJSVdMX0VSUihwcml2LAotCQkJIk1BQyBpcyBpbiBkZWVwIHNsZWVwIS4gIENTUl9HUF9DTlRSTCA9IDB4JTA4WFxuIiwgdmFsKTsKLQkJX2l3bF9sZWdhY3lfd3JpdGUzMihwcml2LCBDU1JfUkVTRVQsCi0JCQkJQ1NSX1JFU0VUX1JFR19GTEFHX0ZPUkNFX05NSSk7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXJldHVybiAwOwotfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgaW5saW5lIGludCBfX2l3bF9sZWdhY3lfZ3JhYl9uaWNfYWNjZXNzKGNvbnN0IGNoYXIgKmYsIHUzMiBsLAotCQkJCQkgICAgICAgc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCUlXTF9ERUJVR19JTyhwcml2LCAiZ3JhYmJpbmcgbmljIGFjY2VzcyAtICVzICVkXG4iLCBmLCBsKTsKLQlyZXR1cm4gX2l3bF9sZWdhY3lfZ3JhYl9uaWNfYWNjZXNzKHByaXYpOwotfQotI2RlZmluZSBpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpIFwKLQlfX2l3bF9sZWdhY3lfZ3JhYl9uaWNfYWNjZXNzKF9fRklMRV9fLCBfX0xJTkVfXywgcHJpdikKLSNlbHNlCi0jZGVmaW5lIGl3bF9ncmFiX25pY19hY2Nlc3MocHJpdikgXAotCV9pd2xfbGVnYWN5X2dyYWJfbmljX2FjY2Vzcyhwcml2KQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgdm9pZCBfaXdsX2xlZ2FjeV9yZWxlYXNlX25pY19hY2Nlc3Moc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCV9pd2xfbGVnYWN5X2NsZWFyX2JpdChwcml2LCBDU1JfR1BfQ05UUkwsCi0JCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOwotfQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotc3RhdGljIGlubGluZSB2b2lkIF9faXdsX2xlZ2FjeV9yZWxlYXNlX25pY19hY2Nlc3MoY29uc3QgY2hhciAqZiwgdTMyIGwsCi0JCQkJCSAgICBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0KLQlJV0xfREVCVUdfSU8ocHJpdiwgInJlbGVhc2luZyBuaWMgYWNjZXNzIC0gJXMgJWRcbiIsIGYsIGwpOwotCV9pd2xfbGVnYWN5X3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLX0KLSNkZWZpbmUgaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KSBcCi0JX19pd2xfbGVnYWN5X3JlbGVhc2VfbmljX2FjY2VzcyhfX0ZJTEVfXywgX19MSU5FX18sIHByaXYpCi0jZWxzZQotI2RlZmluZSBpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpIFwKLQlfaXdsX2xlZ2FjeV9yZWxlYXNlX25pY19hY2Nlc3MocHJpdikKLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHUzMiBfaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZykKLXsKLQlyZXR1cm4gX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIHJlZyk7Ci19Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgaW5saW5lIHUzMiBfX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihjb25zdCBjaGFyICpmLCB1MzIgbCwKLQkJCQkJc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnKQotewotCXUzMiB2YWx1ZSA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgcmVnKTsKLQlJV0xfREVCVUdfSU8ocHJpdiwKLQkJCSJyZWFkX2RpcmVjdDMyKDB4JTRYKSA9IDB4JTA4eCAtICVzICVkXG4iLCByZWcsIHZhbHVlLAotCQkgICAgIGYsIGwpOwotCXJldHVybiB2YWx1ZTsKLX0KLXN0YXRpYyBpbmxpbmUgdTMyIGl3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiByZWcpCi17Ci0JdTMyIHZhbHVlOwotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdik7Ci0JdmFsdWUgPSBfX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihfX0ZJTEVfXywgX19MSU5FX18sIHByaXYsIHJlZyk7Ci0JaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlyZXR1cm4gdmFsdWU7Ci19Ci0KLSNlbHNlCi1zdGF0aWMgaW5saW5lIHUzMiBpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnKQotewotCXUzMiB2YWx1ZTsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpOwotCXZhbHVlID0gX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LCByZWcpOwotCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JcmV0dXJuIHZhbHVlOwotCi19Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSB2b2lkIF9pd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJIHUzMiByZWcsIHUzMiB2YWx1ZSkKLXsKLQlfaXdsX2xlZ2FjeV93cml0ZTMyKHByaXYsIHJlZywgdmFsdWUpOwotfQotc3RhdGljIGlubGluZSB2b2lkCi1pd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZywgdTMyIHZhbHVlKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWlmICghaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KSkgewotCQlfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCByZWcsIHZhbHVlKTsKLQkJaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfbGVnYWN5X3dyaXRlX3JlZ19idWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgICAgdTMyIHJlZywgdTMyIGxlbiwgdTMyICp2YWx1ZXMpCi17Ci0JdTMyIGNvdW50ID0gc2l6ZW9mKHUzMik7Ci0KLQlpZiAoKHByaXYgIT0gTlVMTCkgJiYgKHZhbHVlcyAhPSBOVUxMKSkgewotCQlmb3IgKDsgMCA8IGxlbjsgbGVuIC09IGNvdW50LCByZWcgKz0gY291bnQsIHZhbHVlcysrKQotCQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCByZWcsICp2YWx1ZXMpOwotCX0KLX0KLQotc3RhdGljIGlubGluZSBpbnQgX2l3bF9sZWdhY3lfcG9sbF9kaXJlY3RfYml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGFkZHIsCi0JCQkJICAgICAgIHUzMiBtYXNrLCBpbnQgdGltZW91dCkKLXsKLQlpbnQgdCA9IDA7Ci0KLQlkbyB7Ci0JCWlmICgoaXdsX2xlZ2FjeV9yZWFkX2RpcmVjdDMyKHByaXYsIGFkZHIpICYgbWFzaykgPT0gbWFzaykKLQkJCXJldHVybiB0OwotCQl1ZGVsYXkoSVdMX1BPTExfSU5URVJWQUwpOwotCQl0ICs9IElXTF9QT0xMX0lOVEVSVkFMOwotCX0gd2hpbGUgKHQgPCB0aW1lb3V0KTsKLQotCXJldHVybiAtRVRJTUVET1VUOwotfQotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi1zdGF0aWMgaW5saW5lIGludCBfX2l3bF9sZWdhY3lfcG9sbF9kaXJlY3RfYml0KGNvbnN0IGNoYXIgKmYsIHUzMiBsLAotCQkJCQkgICAgc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQkgICAgdTMyIGFkZHIsIHUzMiBtYXNrLCBpbnQgdGltZW91dCkKLXsKLQlpbnQgcmV0ICA9IF9pd2xfbGVnYWN5X3BvbGxfZGlyZWN0X2JpdChwcml2LCBhZGRyLCBtYXNrLCB0aW1lb3V0KTsKLQotCWlmICh1bmxpa2VseShyZXQgPT0gLUVUSU1FRE9VVCkpCi0JCUlXTF9ERUJVR19JTyhwcml2LCAicG9sbF9kaXJlY3RfYml0KDB4JTA4WCwgMHglMDhYKSAtICIKLQkJCSAgICAgInRpbWVkb3V0IC0gJXMgJWRcbiIsIGFkZHIsIG1hc2ssIGYsIGwpOwotCWVsc2UKLQkJSVdMX0RFQlVHX0lPKHByaXYsICJwb2xsX2RpcmVjdF9iaXQoMHglMDhYLCAweCUwOFgpID0gMHglMDhYICIKLQkJCSAgICAgIi0gJXMgJWRcbiIsIGFkZHIsIG1hc2ssIHJldCwgZiwgbCk7Ci0JcmV0dXJuIHJldDsKLX0KLSNkZWZpbmUgaXdsX3BvbGxfZGlyZWN0X2JpdChwcml2LCBhZGRyLCBtYXNrLCB0aW1lb3V0KSBcCi1fX2l3bF9sZWdhY3lfcG9sbF9kaXJlY3RfYml0KF9fRklMRV9fLCBfX0xJTkVfXywgcHJpdiwgYWRkciwgbWFzaywgdGltZW91dCkKLSNlbHNlCi0jZGVmaW5lIGl3bF9wb2xsX2RpcmVjdF9iaXQgX2l3bF9sZWdhY3lfcG9sbF9kaXJlY3RfYml0Ci0jZW5kaWYKLQotc3RhdGljIGlubGluZSB1MzIgX2l3bF9sZWdhY3lfcmVhZF9wcnBoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZykKLXsKLQlfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfUFJQSF9SQUREUiwgcmVnIHwgKDMgPDwgMjQpKTsKLQlybWIoKTsKLQlyZXR1cm4gX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfUFJQSF9SREFUKTsKLX0KLXN0YXRpYyBpbmxpbmUgdTMyIGl3bF9sZWdhY3lfcmVhZF9wcnBoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQl1MzIgdmFsOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdik7Ci0JdmFsID0gX2l3bF9sZWdhY3lfcmVhZF9wcnBoKHByaXYsIHJlZyk7Ci0JaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgX2l3bF9sZWdhY3lfd3JpdGVfcHJwaChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgICAgdTMyIGFkZHIsIHUzMiB2YWwpCi17Ci0JX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1BSUEhfV0FERFIsCi0JCQkgICAgICAoKGFkZHIgJiAweDAwMDBGRkZGKSB8ICgzIDw8IDI0KSkpOwotCXdtYigpOwotCV9pd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19QUlBIX1dEQVQsIHZhbCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZAotaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGFkZHIsIHUzMiB2YWwpCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaWYgKCFpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpKSB7Ci0JCV9pd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgYWRkciwgdmFsKTsKLQkJaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci19Ci0KLSNkZWZpbmUgX2l3bF9sZWdhY3lfc2V0X2JpdHNfcHJwaChwcml2LCByZWcsIG1hc2spIFwKLV9pd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgcmVnLCAoX2l3bF9sZWdhY3lfcmVhZF9wcnBoKHByaXYsIHJlZykgfCBtYXNrKSkKLQotc3RhdGljIGlubGluZSB2b2lkCi1pd2xfbGVnYWN5X3NldF9iaXRzX3BycGgoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgcmVnLCB1MzIgbWFzaykKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpOwotCV9pd2xfbGVnYWN5X3NldF9iaXRzX3BycGgocHJpdiwgcmVnLCBtYXNrKTsKLQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotfQotCi0jZGVmaW5lIF9pd2xfbGVnYWN5X3NldF9iaXRzX21hc2tfcHJwaChwcml2LCByZWcsIGJpdHMsIG1hc2spIFwKLV9pd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgcmVnLAkJCQlcCi0JCSAoKF9pd2xfbGVnYWN5X3JlYWRfcHJwaChwcml2LCByZWcpICYgbWFzaykgfCBiaXRzKSkKLQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfc2V0X2JpdHNfbWFza19wcnBoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHJlZywKLQkJCQl1MzIgYml0cywgdTMyIG1hc2spCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KTsKLQlfaXdsX2xlZ2FjeV9zZXRfYml0c19tYXNrX3BycGgocHJpdiwgcmVnLCBiaXRzLCBtYXNrKTsKLQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9jbGVhcl9iaXRzX3BycGgoc3RydWN0IGl3bF9wcml2Ci0JCQkJCQkgKnByaXYsIHUzMiByZWcsIHUzMiBtYXNrKQotewotCXVuc2lnbmVkIGxvbmcgcmVnX2ZsYWdzOwotCXUzMiB2YWw7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaXdsX2dyYWJfbmljX2FjY2Vzcyhwcml2KTsKLQl2YWwgPSBfaXdsX2xlZ2FjeV9yZWFkX3BycGgocHJpdiwgcmVnKTsKLQlfaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIHJlZywgKHZhbCAmIH5tYXNrKSk7Ci0JaXdsX3JlbGVhc2VfbmljX2FjY2Vzcyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSB1MzIgaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGFkZHIpCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0JdTMyIHZhbHVlOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotCWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdik7Ci0KLQlfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JBRERSLCBhZGRyKTsKLQlybWIoKTsKLQl2YWx1ZSA9IF9pd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9SREFUKTsKLQotCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWl3bF9sZWdhY3lfd3JpdGVfdGFyZ19tZW0oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgYWRkciwgdTMyIHZhbCkKLXsKLQl1bnNpZ25lZCBsb25nIHJlZ19mbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5yZWdfbG9jaywgcmVnX2ZsYWdzKTsKLQlpZiAoIWl3bF9ncmFiX25pY19hY2Nlc3MocHJpdikpIHsKLQkJX2l3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01FTV9XQUREUiwgYWRkcik7Ci0JCXdtYigpOwotCQlfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1dEQVQsIHZhbCk7Ci0JCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLWl3bF9sZWdhY3lfd3JpdGVfdGFyZ19tZW1fYnVmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGFkZHIsCi0JCQkJCSAgdTMyIGxlbiwgdTMyICp2YWx1ZXMpCi17Ci0JdW5zaWduZWQgbG9uZyByZWdfZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+cmVnX2xvY2ssIHJlZ19mbGFncyk7Ci0JaWYgKCFpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpKSB7Ci0JCV9pd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NRU1fV0FERFIsIGFkZHIpOwotCQl3bWIoKTsKLQkJZm9yICg7IDAgPCBsZW47IGxlbiAtPSBzaXplb2YodTMyKSwgdmFsdWVzKyspCi0JCQlfaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LAotCQkJCQlIQlVTX1RBUkdfTUVNX1dEQVQsICp2YWx1ZXMpOwotCi0JCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MocHJpdik7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCByZWdfZmxhZ3MpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtbGVkLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtbGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTY4YTQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0KLS8qIGRlZmF1bHQ6IElXTF9MRURfQkxJTksoMCkgdXNpbmcgYmxpbmtpbmcgaW5kZXggdGFibGUgKi8KLXN0YXRpYyBpbnQgbGVkX21vZGU7Ci1tb2R1bGVfcGFyYW0obGVkX21vZGUsIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKGxlZF9tb2RlLCAiMD1zeXN0ZW0gZGVmYXVsdCwgIgotCQkiMT1PbihSRiBPbikvT2ZmKFJGIE9mZiksIDI9YmxpbmtpbmciKTsKLQotLyogVGhyb3VnaHB1dAkJT0ZGIHRpbWUobXMpCU9OIHRpbWUgKG1zKQotICoJPjMwMAkJCTI1CQkyNQotICoJPjIwMCB0byAzMDAJCTQwCQk0MAotICoJPjEwMCB0byAyMDAJCTU1CQk1NQotICoJPjcwIHRvIDEwMAkJNjUJCTY1Ci0gKgk+NTAgdG8gNzAJCTc1CQk3NQotICoJPjIwIHRvIDUwCQk4NQkJODUKLSAqCT4xMCB0byAyMAkJOTUJCTk1Ci0gKgk+NSB0byAxMAkJMTEwCQkxMTAKLSAqCT4xIHRvIDUJCQkxMzAJCTEzMAotICoJPjAgdG8gMQkJCTE2NwkJMTY3Ci0gKgk8PTAJCQkJCVNPTElEIE9OCi0gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3RwdF9ibGluayBpd2xfYmxpbmtbXSA9IHsKLQl7IC50aHJvdWdocHV0ID0gMCwgLmJsaW5rX3RpbWUgPSAzMzQgfSwKLQl7IC50aHJvdWdocHV0ID0gMSAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDI2MCB9LAotCXsgLnRocm91Z2hwdXQgPSA1ICogMTAyNCAtIDEsIC5ibGlua190aW1lID0gMjIwIH0sCi0JeyAudGhyb3VnaHB1dCA9IDEwICogMTAyNCAtIDEsIC5ibGlua190aW1lID0gMTkwIH0sCi0JeyAudGhyb3VnaHB1dCA9IDIwICogMTAyNCAtIDEsIC5ibGlua190aW1lID0gMTcwIH0sCi0JeyAudGhyb3VnaHB1dCA9IDUwICogMTAyNCAtIDEsIC5ibGlua190aW1lID0gMTUwIH0sCi0JeyAudGhyb3VnaHB1dCA9IDcwICogMTAyNCAtIDEsIC5ibGlua190aW1lID0gMTMwIH0sCi0JeyAudGhyb3VnaHB1dCA9IDEwMCAqIDEwMjQgLSAxLCAuYmxpbmtfdGltZSA9IDExMCB9LAotCXsgLnRocm91Z2hwdXQgPSAyMDAgKiAxMDI0IC0gMSwgLmJsaW5rX3RpbWUgPSA4MCB9LAotCXsgLnRocm91Z2hwdXQgPSAzMDAgKiAxMDI0IC0gMSwgLmJsaW5rX3RpbWUgPSA1MCB9LAotfTsKLQotLyoKLSAqIEFkanVzdCBsZWQgYmxpbmsgcmF0ZSB0byBjb21wZW5zYXRlIG9uIGEgTUFDIENsb2NrIGRpZmZlcmVuY2Ugb24gZXZlcnkgSFcKLSAqIExlZCBibGluayByYXRlIGFuYWx5c2lzIHNob3dlZCBhbiBhdmVyYWdlIGRldmlhdGlvbiBvZiAwJSBvbiAzOTQ1LAotICogNSUgb24gNDk2NSBIVy4KLSAqIE5lZWQgdG8gY29tcGVuc2F0ZSBvbiB0aGUgbGVkIG9uL29mZiB0aW1lIHBlciBIVyBhY2NvcmRpbmcgdG8gdGhlIGRldmlhdGlvbgotICogdG8gYWNoaWV2ZSB0aGUgZGVzaXJlZCBsZWQgZnJlcXVlbmN5Ci0gKiBUaGUgY2FsY3VsYXRpb24gaXM6ICgxMDAtYXZlcmFnZURldmlhdGlvbikvMTAwICogYmxpbmtUaW1lCi0gKiBGb3IgY29kZSBlZmZpY2llbmN5IHRoZSBjYWxjdWxhdGlvbiB3aWxsIGJlOgotICogICAgIGNvbXBlbnNhdGlvbiA9ICgxMDAgLSBhdmVyYWdlRGV2aWF0aW9uKSAqIDY0IC8gMTAwCi0gKiAgICAgTmV3QmxpbmtUaW1lID0gKGNvbXBlbnNhdGlvbiAqIEJsaW5rVGltZSkgLyA2NAotICovCi1zdGF0aWMgaW5saW5lIHU4IGl3bF9sZWdhY3lfYmxpbmtfY29tcGVuc2F0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgdTggdGltZSwgdTE2IGNvbXBlbnNhdGlvbikKLXsKLQlpZiAoIWNvbXBlbnNhdGlvbikgewotCQlJV0xfRVJSKHByaXYsICJ1bmRlZmluZWQgYmxpbmsgY29tcGVuc2F0aW9uOiAiCi0JCQkidXNlIHByZS1kZWZpbmVkIGJsaW5raW5nIHRpbWVcbiIpOwotCQlyZXR1cm4gdGltZTsKLQl9Ci0KLQlyZXR1cm4gKHU4KSgodGltZSAqIGNvbXBlbnNhdGlvbikgPj4gNik7Ci19Ci0KLS8qIFNldCBsZWQgcGF0dGVybiBjb21tYW5kICovCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfbGVkX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCSAgICAgICB1bnNpZ25lZCBsb25nIG9uLAotCQkgICAgICAgdW5zaWduZWQgbG9uZyBvZmYpCi17Ci0Jc3RydWN0IGl3bF9sZWRfY21kIGxlZF9jbWQgPSB7Ci0JCS5pZCA9IElXTF9MRURfTElOSywKLQkJLmludGVydmFsID0gSVdMX0RFRl9MRURfSU5UUlZMCi0JfTsKLQlpbnQgcmV0OwotCi0JaWYgKCF0ZXN0X2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm4gLUVCVVNZOwotCi0JaWYgKHByaXYtPmJsaW5rX29uID09IG9uICYmIHByaXYtPmJsaW5rX29mZiA9PSBvZmYpCi0JCXJldHVybiAwOwotCi0JaWYgKG9mZiA9PSAwKSB7Ci0JCS8qIGxlZCBpcyBTT0xJRF9PTiAqLwotCQlvbiA9IElXTF9MRURfU09MSUQ7Ci0JfQotCi0JSVdMX0RFQlVHX0xFRChwcml2LCAiTGVkIGJsaW5rIHRpbWUgY29tcGVuc2F0aW9uPSV1XG4iLAotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bGVkX2NvbXBlbnNhdGlvbik7Ci0JbGVkX2NtZC5vbiA9IGl3bF9sZWdhY3lfYmxpbmtfY29tcGVuc2F0aW9uKHByaXYsIG9uLAotCQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmxlZF9jb21wZW5zYXRpb24pOwotCWxlZF9jbWQub2ZmID0gaXdsX2xlZ2FjeV9ibGlua19jb21wZW5zYXRpb24ocHJpdiwgb2ZmLAotCQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmxlZF9jb21wZW5zYXRpb24pOwotCi0JcmV0ID0gcHJpdi0+Y2ZnLT5vcHMtPmxlZC0+Y21kKHByaXYsICZsZWRfY21kKTsKLQlpZiAoIXJldCkgewotCQlwcml2LT5ibGlua19vbiA9IG9uOwotCQlwcml2LT5ibGlua19vZmYgPSBvZmY7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfbGVkX2JyaWdodG5lc3Nfc2V0KHN0cnVjdCBsZWRfY2xhc3NkZXYgKmxlZF9jZGV2LAotCQkJCSAgIGVudW0gbGVkX2JyaWdodG5lc3MgYnJpZ2h0bmVzcykKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBjb250YWluZXJfb2YobGVkX2NkZXYsIHN0cnVjdCBpd2xfcHJpdiwgbGVkKTsKLQl1bnNpZ25lZCBsb25nIG9uID0gMDsKLQotCWlmIChicmlnaHRuZXNzID4gMCkKLQkJb24gPSBJV0xfTEVEX1NPTElEOwotCi0JaXdsX2xlZ2FjeV9sZWRfY21kKHByaXYsIG9uLCAwKTsKLX0KLQotc3RhdGljIGludCBpd2xfbGVnYWN5X2xlZF9ibGlua19zZXQoc3RydWN0IGxlZF9jbGFzc2RldiAqbGVkX2NkZXYsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgKmRlbGF5X29uLAotCQkJICAgICB1bnNpZ25lZCBsb25nICpkZWxheV9vZmYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGxlZF9jZGV2LCBzdHJ1Y3QgaXdsX3ByaXYsIGxlZCk7Ci0KLQlyZXR1cm4gaXdsX2xlZ2FjeV9sZWRfY21kKHByaXYsICpkZWxheV9vbiwgKmRlbGF5X29mZik7Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9sZWRzX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCBtb2RlID0gbGVkX21vZGU7Ci0JaW50IHJldDsKLQotCWlmIChtb2RlID09IElXTF9MRURfREVGQVVMVCkKLQkJbW9kZSA9IHByaXYtPmNmZy0+bGVkX21vZGU7Ci0KLQlwcml2LT5sZWQubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiJXMtbGVkIiwKLQkJCQkgICB3aXBoeV9uYW1lKHByaXYtPmh3LT53aXBoeSkpOwotCXByaXYtPmxlZC5icmlnaHRuZXNzX3NldCA9IGl3bF9sZWdhY3lfbGVkX2JyaWdodG5lc3Nfc2V0OwotCXByaXYtPmxlZC5ibGlua19zZXQgPSBpd2xfbGVnYWN5X2xlZF9ibGlua19zZXQ7Ci0JcHJpdi0+bGVkLm1heF9icmlnaHRuZXNzID0gMTsKLQotCXN3aXRjaCAobW9kZSkgewotCWNhc2UgSVdMX0xFRF9ERUZBVUxUOgotCQlXQVJOX09OKDEpOwotCQlicmVhazsKLQljYXNlIElXTF9MRURfQkxJTks6Ci0JCXByaXYtPmxlZC5kZWZhdWx0X3RyaWdnZXIgPQotCQkJaWVlZTgwMjExX2NyZWF0ZV90cHRfbGVkX3RyaWdnZXIocHJpdi0+aHcsCi0JCQkJCUlFRUU4MDIxMV9UUFRfTEVEVFJJR19GTF9DT05ORUNURUQsCi0JCQkJCWl3bF9ibGluaywgQVJSQVlfU0laRShpd2xfYmxpbmspKTsKLQkJYnJlYWs7Ci0JY2FzZSBJV0xfTEVEX1JGX1NUQVRFOgotCQlwcml2LT5sZWQuZGVmYXVsdF90cmlnZ2VyID0KLQkJCWllZWU4MDIxMV9nZXRfcmFkaW9fbGVkX25hbWUocHJpdi0+aHcpOwotCQlicmVhazsKLQl9Ci0KLQlyZXQgPSBsZWRfY2xhc3NkZXZfcmVnaXN0ZXIoJnByaXYtPnBjaV9kZXYtPmRldiwgJnByaXYtPmxlZCk7Ci0JaWYgKHJldCkgewotCQlrZnJlZShwcml2LT5sZWQubmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2LT5sZWRfcmVnaXN0ZXJlZCA9IHRydWU7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfbGVkc19pbml0KTsKLQotdm9pZCBpd2xfbGVnYWN5X2xlZHNfZXhpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaWYgKCFwcml2LT5sZWRfcmVnaXN0ZXJlZCkKLQkJcmV0dXJuOwotCi0JbGVkX2NsYXNzZGV2X3VucmVnaXN0ZXIoJnByaXYtPmxlZCk7Ci0Ja2ZyZWUocHJpdi0+bGVkLm5hbWUpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2xlZHNfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtbGVkLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtbGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNzkxZjcuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgX19pd2xfbGVnYWN5X2xlZHNfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9sZWRzX2hfXwotCi0KLXN0cnVjdCBpd2xfcHJpdjsKLQotI2RlZmluZSBJV0xfTEVEX1NPTElEIDExCi0jZGVmaW5lIElXTF9ERUZfTEVEX0lOVFJWTCBjcHVfdG9fbGUzMigxMDAwKQotCi0jZGVmaW5lIElXTF9MRURfQUNUSVZJVFkgICAgICAgKDA8PDEpCi0jZGVmaW5lIElXTF9MRURfTElOSyAgICAgICAgICAgKDE8PDEpCi0KLS8qCi0gKiBMRUQgbW9kZQotICogICAgSVdMX0xFRF9ERUZBVUxUOiAgdXNlIGRldmljZSBkZWZhdWx0Ci0gKiAgICBJV0xfTEVEX1JGX1NUQVRFOiB0dXJuIExFRCBvbi9vZmYgYmFzZWQgb24gUkYgc3RhdGUKLSAqCQkJTEVEIE9OICA9IFJGIE9OCi0gKgkJCUxFRCBPRkYgPSBSRiBPRkYKLSAqICAgIElXTF9MRURfQkxJTks6ICAgIGFkanVzdCBsZWQgYmxpbmsgcmF0ZSBiYXNlZCBvbiBibGluayB0YWJsZQotICovCi1lbnVtIGl3bF9sZWRfbW9kZSB7Ci0JSVdMX0xFRF9ERUZBVUxULAotCUlXTF9MRURfUkZfU1RBVEUsCi0JSVdMX0xFRF9CTElOSywKLX07Ci0KLXZvaWQgaXdsX2xlZ2FjeV9sZWRzX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsX2xlZ2FjeV9sZWRzX2V4aXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLQotI2VuZGlmIC8qIF9faXdsX2xlZ2FjeV9sZWRzX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZ2FjeS1ycy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLWxlZ2FjeS1ycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODY0N2U0Li4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1sZWdhY3ktcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBfX2l3bF9sZWdhY3lfcnNfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9yc19oX18KLQotc3RydWN0IGl3bF9yYXRlX2luZm8gewotCXU4IHBsY3A7CS8qIHVDb2RlIEFQSTogIElXTF9SQVRFXzZNX1BMQ1AsIGV0Yy4gKi8KLQl1OCBwbGNwX3Npc287CS8qIHVDb2RlIEFQSTogIElXTF9SQVRFX1NJU09fNk1fUExDUCwgZXRjLiAqLwotCXU4IHBsY3BfbWltbzI7CS8qIHVDb2RlIEFQSTogIElXTF9SQVRFX01JTU8yXzZNX1BMQ1AsIGV0Yy4gKi8KLQl1OCBpZWVlOwkvKiBNQUMgaGVhZGVyOiAgSVdMX1JBVEVfNk1fSUVFRSwgZXRjLiAqLwotCXU4IHByZXZfaWVlZTsgICAgLyogcHJldmlvdXMgcmF0ZSBpbiBJRUVFIHNwZWVkcyAqLwotCXU4IG5leHRfaWVlZTsgICAgLyogbmV4dCByYXRlIGluIElFRUUgc3BlZWRzICovCi0JdTggcHJldl9yczsgICAgICAvKiBwcmV2aW91cyByYXRlIHVzZWQgaW4gcnMgYWxnbyAqLwotCXU4IG5leHRfcnM7ICAgICAgLyogbmV4dCByYXRlIHVzZWQgaW4gcnMgYWxnbyAqLwotCXU4IHByZXZfcnNfdGdnOyAgLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIFRHRyBycyBhbGdvICovCi0JdTggbmV4dF9yc190Z2c7ICAvKiBuZXh0IHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLwotfTsKLQotc3RydWN0IGl3bDM5NDVfcmF0ZV9pbmZvIHsKLQl1OCBwbGNwOwkJLyogdUNvZGUgQVBJOiAgSVdMX1JBVEVfNk1fUExDUCwgZXRjLiAqLwotCXU4IGllZWU7CQkvKiBNQUMgaGVhZGVyOiAgSVdMX1JBVEVfNk1fSUVFRSwgZXRjLiAqLwotCXU4IHByZXZfaWVlZTsJCS8qIHByZXZpb3VzIHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KLQl1OCBuZXh0X2llZWU7CQkvKiBuZXh0IHJhdGUgaW4gSUVFRSBzcGVlZHMgKi8KLQl1OCBwcmV2X3JzOwkJLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIHJzIGFsZ28gKi8KLQl1OCBuZXh0X3JzOwkJLyogbmV4dCByYXRlIHVzZWQgaW4gcnMgYWxnbyAqLwotCXU4IHByZXZfcnNfdGdnOwkJLyogcHJldmlvdXMgcmF0ZSB1c2VkIGluIFRHRyBycyBhbGdvICovCi0JdTggbmV4dF9yc190Z2c7CQkvKiBuZXh0IHJhdGUgdXNlZCBpbiBUR0cgcnMgYWxnbyAqLwotCXU4IHRhYmxlX3JzX2luZGV4OwkvKiBpbmRleCBpbiByYXRlIHNjYWxlIHRhYmxlIGNtZCAqLwotCXU4IHByZXZfdGFibGVfcnM7CS8qIHByZXYgaW4gcmF0ZSB0YWJsZSBjbWQgKi8KLX07Ci0KLQotLyoKLSAqIFRoZXNlIHNlcnZlIGFzIGluZGV4ZXMgaW50bwotICogc3RydWN0IGl3bF9yYXRlX2luZm8gaXdsZWdhY3lfcmF0ZXNbSVdMX1JBVEVfQ09VTlRdOwotICovCi1lbnVtIHsKLQlJV0xfUkFURV8xTV9JTkRFWCA9IDAsCi0JSVdMX1JBVEVfMk1fSU5ERVgsCi0JSVdMX1JBVEVfNU1fSU5ERVgsCi0JSVdMX1JBVEVfMTFNX0lOREVYLAotCUlXTF9SQVRFXzZNX0lOREVYLAotCUlXTF9SQVRFXzlNX0lOREVYLAotCUlXTF9SQVRFXzEyTV9JTkRFWCwKLQlJV0xfUkFURV8xOE1fSU5ERVgsCi0JSVdMX1JBVEVfMjRNX0lOREVYLAotCUlXTF9SQVRFXzM2TV9JTkRFWCwKLQlJV0xfUkFURV80OE1fSU5ERVgsCi0JSVdMX1JBVEVfNTRNX0lOREVYLAotCUlXTF9SQVRFXzYwTV9JTkRFWCwKLQlJV0xfUkFURV9DT1VOVCwKLQlJV0xfUkFURV9DT1VOVF9MRUdBQ1kgPSBJV0xfUkFURV9DT1VOVCAtIDEsCS8qIEV4Y2x1ZGluZyA2ME0gKi8KLQlJV0xfUkFURV9DT1VOVF8zOTQ1ID0gSVdMX1JBVEVfQ09VTlQgLSAxLAotCUlXTF9SQVRFX0lOVk1fSU5ERVggPSBJV0xfUkFURV9DT1VOVCwKLQlJV0xfUkFURV9JTlZBTElEID0gSVdMX1JBVEVfQ09VTlQsCi19OwotCi1lbnVtIHsKLQlJV0xfUkFURV82TV9JTkRFWF9UQUJMRSA9IDAsCi0JSVdMX1JBVEVfOU1fSU5ERVhfVEFCTEUsCi0JSVdMX1JBVEVfMTJNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzE4TV9JTkRFWF9UQUJMRSwKLQlJV0xfUkFURV8yNE1fSU5ERVhfVEFCTEUsCi0JSVdMX1JBVEVfMzZNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFXzQ4TV9JTkRFWF9UQUJMRSwKLQlJV0xfUkFURV81NE1fSU5ERVhfVEFCTEUsCi0JSVdMX1JBVEVfMU1fSU5ERVhfVEFCTEUsCi0JSVdMX1JBVEVfMk1fSU5ERVhfVEFCTEUsCi0JSVdMX1JBVEVfNU1fSU5ERVhfVEFCTEUsCi0JSVdMX1JBVEVfMTFNX0lOREVYX1RBQkxFLAotCUlXTF9SQVRFX0lOVk1fSU5ERVhfVEFCTEUgPSBJV0xfUkFURV9JTlZNX0lOREVYIC0gMSwKLX07Ci0KLWVudW0gewotCUlXTF9GSVJTVF9PRkRNX1JBVEUgPSBJV0xfUkFURV82TV9JTkRFWCwKLQlJV0wzOV9MQVNUX09GRE1fUkFURSA9IElXTF9SQVRFXzU0TV9JTkRFWCwKLQlJV0xfTEFTVF9PRkRNX1JBVEUgPSBJV0xfUkFURV82ME1fSU5ERVgsCi0JSVdMX0ZJUlNUX0NDS19SQVRFID0gSVdMX1JBVEVfMU1fSU5ERVgsCi0JSVdMX0xBU1RfQ0NLX1JBVEUgPSBJV0xfUkFURV8xMU1fSU5ERVgsCi19OwotCi0vKiAjZGVmaW5lIHZzLiBlbnVtIHRvIGtlZXAgZnJvbSBkZWZhdWx0aW5nIHRvICdsYXJnZSBpbnRlZ2VyJyAqLwotI2RlZmluZQlJV0xfUkFURV82TV9NQVNLICAgKDEgPDwgSVdMX1JBVEVfNk1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzlNX01BU0sgICAoMSA8PCBJV0xfUkFURV85TV9JTkRFWCkKLSNkZWZpbmUJSVdMX1JBVEVfMTJNX01BU0sgICgxIDw8IElXTF9SQVRFXzEyTV9JTkRFWCkKLSNkZWZpbmUJSVdMX1JBVEVfMThNX01BU0sgICgxIDw8IElXTF9SQVRFXzE4TV9JTkRFWCkKLSNkZWZpbmUJSVdMX1JBVEVfMjRNX01BU0sgICgxIDw8IElXTF9SQVRFXzI0TV9JTkRFWCkKLSNkZWZpbmUJSVdMX1JBVEVfMzZNX01BU0sgICgxIDw8IElXTF9SQVRFXzM2TV9JTkRFWCkKLSNkZWZpbmUJSVdMX1JBVEVfNDhNX01BU0sgICgxIDw8IElXTF9SQVRFXzQ4TV9JTkRFWCkKLSNkZWZpbmUJSVdMX1JBVEVfNTRNX01BU0sgICgxIDw8IElXTF9SQVRFXzU0TV9JTkRFWCkKLSNkZWZpbmUgSVdMX1JBVEVfNjBNX01BU0sgICgxIDw8IElXTF9SQVRFXzYwTV9JTkRFWCkKLSNkZWZpbmUJSVdMX1JBVEVfMU1fTUFTSyAgICgxIDw8IElXTF9SQVRFXzFNX0lOREVYKQotI2RlZmluZQlJV0xfUkFURV8yTV9NQVNLICAgKDEgPDwgSVdMX1JBVEVfMk1fSU5ERVgpCi0jZGVmaW5lCUlXTF9SQVRFXzVNX01BU0sgICAoMSA8PCBJV0xfUkFURV81TV9JTkRFWCkKLSNkZWZpbmUJSVdMX1JBVEVfMTFNX01BU0sgICgxIDw8IElXTF9SQVRFXzExTV9JTkRFWCkKLQotLyogdUNvZGUgQVBJIHZhbHVlcyBmb3IgbGVnYWN5IGJpdCByYXRlcywgYm90aCBPRkRNIGFuZCBDQ0sgKi8KLWVudW0gewotCUlXTF9SQVRFXzZNX1BMQ1AgID0gMTMsCi0JSVdMX1JBVEVfOU1fUExDUCAgPSAxNSwKLQlJV0xfUkFURV8xMk1fUExDUCA9IDUsCi0JSVdMX1JBVEVfMThNX1BMQ1AgPSA3LAotCUlXTF9SQVRFXzI0TV9QTENQID0gOSwKLQlJV0xfUkFURV8zNk1fUExDUCA9IDExLAotCUlXTF9SQVRFXzQ4TV9QTENQID0gMSwKLQlJV0xfUkFURV81NE1fUExDUCA9IDMsCi0JSVdMX1JBVEVfNjBNX1BMQ1AgPSAzLC8qRklYTUU6UlM6c2hvdWxkIGJlIHJlbW92ZWQqLwotCUlXTF9SQVRFXzFNX1BMQ1AgID0gMTAsCi0JSVdMX1JBVEVfMk1fUExDUCAgPSAyMCwKLQlJV0xfUkFURV81TV9QTENQICA9IDU1LAotCUlXTF9SQVRFXzExTV9QTENQID0gMTEwLAotCS8qRklYTUU6UlM6YWRkIElXTF9SQVRFX0xFR0FDWV9JTlZNX1BMQ1AgPSAwLCovCi19OwotCi0vKiB1Q29kZSBBUEkgdmFsdWVzIGZvciBPRkRNIGhpZ2gtdGhyb3VnaHB1dCAoSFQpIGJpdCByYXRlcyAqLwotZW51bSB7Ci0JSVdMX1JBVEVfU0lTT182TV9QTENQID0gMCwKLQlJV0xfUkFURV9TSVNPXzEyTV9QTENQID0gMSwKLQlJV0xfUkFURV9TSVNPXzE4TV9QTENQID0gMiwKLQlJV0xfUkFURV9TSVNPXzI0TV9QTENQID0gMywKLQlJV0xfUkFURV9TSVNPXzM2TV9QTENQID0gNCwKLQlJV0xfUkFURV9TSVNPXzQ4TV9QTENQID0gNSwKLQlJV0xfUkFURV9TSVNPXzU0TV9QTENQID0gNiwKLQlJV0xfUkFURV9TSVNPXzYwTV9QTENQID0gNywKLQlJV0xfUkFURV9NSU1PMl82TV9QTENQICA9IDB4OCwKLQlJV0xfUkFURV9NSU1PMl8xMk1fUExDUCA9IDB4OSwKLQlJV0xfUkFURV9NSU1PMl8xOE1fUExDUCA9IDB4YSwKLQlJV0xfUkFURV9NSU1PMl8yNE1fUExDUCA9IDB4YiwKLQlJV0xfUkFURV9NSU1PMl8zNk1fUExDUCA9IDB4YywKLQlJV0xfUkFURV9NSU1PMl80OE1fUExDUCA9IDB4ZCwKLQlJV0xfUkFURV9NSU1PMl81NE1fUExDUCA9IDB4ZSwKLQlJV0xfUkFURV9NSU1PMl82ME1fUExDUCA9IDB4ZiwKLQlJV0xfUkFURV9TSVNPX0lOVk1fUExDUCwKLQlJV0xfUkFURV9NSU1PMl9JTlZNX1BMQ1AgPSBJV0xfUkFURV9TSVNPX0lOVk1fUExDUCwKLX07Ci0KLS8qIE1BQyBoZWFkZXIgdmFsdWVzIGZvciBiaXQgcmF0ZXMgKi8KLWVudW0gewotCUlXTF9SQVRFXzZNX0lFRUUgID0gMTIsCi0JSVdMX1JBVEVfOU1fSUVFRSAgPSAxOCwKLQlJV0xfUkFURV8xMk1fSUVFRSA9IDI0LAotCUlXTF9SQVRFXzE4TV9JRUVFID0gMzYsCi0JSVdMX1JBVEVfMjRNX0lFRUUgPSA0OCwKLQlJV0xfUkFURV8zNk1fSUVFRSA9IDcyLAotCUlXTF9SQVRFXzQ4TV9JRUVFID0gOTYsCi0JSVdMX1JBVEVfNTRNX0lFRUUgPSAxMDgsCi0JSVdMX1JBVEVfNjBNX0lFRUUgPSAxMjAsCi0JSVdMX1JBVEVfMU1fSUVFRSAgPSAyLAotCUlXTF9SQVRFXzJNX0lFRUUgID0gNCwKLQlJV0xfUkFURV81TV9JRUVFICA9IDExLAotCUlXTF9SQVRFXzExTV9JRUVFID0gMjIsCi19OwotCi0jZGVmaW5lIElXTF9DQ0tfQkFTSUNfUkFURVNfTUFTSyAgICBcCi0JKElXTF9SQVRFXzFNX01BU0sgICAgICAgICAgfCBcCi0JSVdMX1JBVEVfMk1fTUFTSykKLQotI2RlZmluZSBJV0xfQ0NLX1JBVEVTX01BU0sgICAgICAgICAgXAotCShJV0xfQ0NLX0JBU0lDX1JBVEVTX01BU0sgIHwgXAotCUlXTF9SQVRFXzVNX01BU0sgICAgICAgICAgfCBcCi0JSVdMX1JBVEVfMTFNX01BU0spCi0KLSNkZWZpbmUgSVdMX09GRE1fQkFTSUNfUkFURVNfTUFTSyAgIFwKLQkoSVdMX1JBVEVfNk1fTUFTSyAgICAgICAgIHwgXAotCUlXTF9SQVRFXzEyTV9NQVNLICAgICAgICAgfCBcCi0JSVdMX1JBVEVfMjRNX01BU0spCi0KLSNkZWZpbmUgSVdMX09GRE1fUkFURVNfTUFTSyAgICAgICAgIFwKLQkoSVdMX09GRE1fQkFTSUNfUkFURVNfTUFTSyB8IFwKLQlJV0xfUkFURV85TV9NQVNLICAgICAgICAgIHwgXAotCUlXTF9SQVRFXzE4TV9NQVNLICAgICAgICAgfCBcCi0JSVdMX1JBVEVfMzZNX01BU0sgICAgICAgICB8IFwKLQlJV0xfUkFURV80OE1fTUFTSyAgICAgICAgIHwgXAotCUlXTF9SQVRFXzU0TV9NQVNLKQotCi0jZGVmaW5lIElXTF9CQVNJQ19SQVRFU19NQVNLICAgICAgICAgXAotCShJV0xfT0ZETV9CQVNJQ19SQVRFU19NQVNLIHwgXAotCSBJV0xfQ0NLX0JBU0lDX1JBVEVTX01BU0spCi0KLSNkZWZpbmUgSVdMX1JBVEVTX01BU0sgKCgxIDw8IElXTF9SQVRFX0NPVU5UKSAtIDEpCi0jZGVmaW5lIElXTF9SQVRFU19NQVNLXzM5NDUgKCgxIDw8IElXTF9SQVRFX0NPVU5UXzM5NDUpIC0gMSkKLQotI2RlZmluZSBJV0xfSU5WQUxJRF9WQUxVRSAgICAtMQotCi0jZGVmaW5lIElXTF9NSU5fUlNTSV9WQUwgICAgICAgICAgICAgICAgIC0xMDAKLSNkZWZpbmUgSVdMX01BWF9SU1NJX1ZBTCAgICAgICAgICAgICAgICAgICAgMAotCi0vKiBUaGVzZSB2YWx1ZXMgc3BlY2lmeSBob3cgbWFueSBUeCBmcmFtZSBhdHRlbXB0cyBiZWZvcmUKLSAqIHNlYXJjaGluZyBmb3IgYSBuZXcgbW9kdWxhdGlvbiBtb2RlICovCi0jZGVmaW5lIElXTF9MRUdBQ1lfRkFJTFVSRV9MSU1JVAkxNjAKLSNkZWZpbmUgSVdMX0xFR0FDWV9TVUNDRVNTX0xJTUlUCTQ4MAotI2RlZmluZSBJV0xfTEVHQUNZX1RBQkxFX0NPVU5UCQkxNjAKLQotI2RlZmluZSBJV0xfTk9ORV9MRUdBQ1lfRkFJTFVSRV9MSU1JVAk0MDAKLSNkZWZpbmUgSVdMX05PTkVfTEVHQUNZX1NVQ0NFU1NfTElNSVQJNDUwMAotI2RlZmluZSBJV0xfTk9ORV9MRUdBQ1lfVEFCTEVfQ09VTlQJMTUwMAotCi0vKiBTdWNjZXNzIHJhdGlvIChBQ0tlZCAvIGF0dGVtcHRlZCB0eCBmcmFtZXMpIHZhbHVlcyAocGVyZmVjdCBpcyAxMjggKiAxMDApICovCi0jZGVmaW5lIElXTF9SU19HT09EX1JBVElPCQkxMjgwMAkvKiAxMDAlICovCi0jZGVmaW5lIElXTF9SQVRFX1NDQUxFX1NXSVRDSAkJMTA4ODAJLyogIDg1JSAqLwotI2RlZmluZSBJV0xfUkFURV9ISUdIX1RICQkxMDg4MAkvKiAgODUlICovCi0jZGVmaW5lIElXTF9SQVRFX0lOQ1JFQVNFX1RICQk2NDAwCS8qICA1MCUgKi8KLSNkZWZpbmUgSVdMX1JBVEVfREVDUkVBU0VfVEgJCTE5MjAJLyogIDE1JSAqLwotCi0vKiBwb3NzaWJsZSBhY3Rpb25zIHdoZW4gaW4gbGVnYWN5IG1vZGUgKi8KLSNkZWZpbmUgSVdMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTEgICAgICAwCi0jZGVmaW5lIElXTF9MRUdBQ1lfU1dJVENIX0FOVEVOTkEyICAgICAgMQotI2RlZmluZSBJV0xfTEVHQUNZX1NXSVRDSF9TSVNPICAgICAgICAgIDIKLSNkZWZpbmUgSVdMX0xFR0FDWV9TV0lUQ0hfTUlNTzJfQUIgICAgICAzCi0jZGVmaW5lIElXTF9MRUdBQ1lfU1dJVENIX01JTU8yX0FDICAgICAgNAotI2RlZmluZSBJV0xfTEVHQUNZX1NXSVRDSF9NSU1PMl9CQyAgICAgIDUKLQotLyogcG9zc2libGUgYWN0aW9ucyB3aGVuIGluIHNpc28gbW9kZSAqLwotI2RlZmluZSBJV0xfU0lTT19TV0lUQ0hfQU5URU5OQTEgICAgICAgIDAKLSNkZWZpbmUgSVdMX1NJU09fU1dJVENIX0FOVEVOTkEyICAgICAgICAxCi0jZGVmaW5lIElXTF9TSVNPX1NXSVRDSF9NSU1PMl9BQiAgICAgICAgMgotI2RlZmluZSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUMgICAgICAgIDMKLSNkZWZpbmUgSVdMX1NJU09fU1dJVENIX01JTU8yX0JDICAgICAgICA0Ci0jZGVmaW5lIElXTF9TSVNPX1NXSVRDSF9HSSAgICAgICAgICAgICAgNQotCi0vKiBwb3NzaWJsZSBhY3Rpb25zIHdoZW4gaW4gbWltbyBtb2RlICovCi0jZGVmaW5lIElXTF9NSU1PMl9TV0lUQ0hfQU5URU5OQTEgICAgICAgMAotI2RlZmluZSBJV0xfTUlNTzJfU1dJVENIX0FOVEVOTkEyICAgICAgIDEKLSNkZWZpbmUgSVdMX01JTU8yX1NXSVRDSF9TSVNPX0EgICAgICAgICAyCi0jZGVmaW5lIElXTF9NSU1PMl9TV0lUQ0hfU0lTT19CICAgICAgICAgMwotI2RlZmluZSBJV0xfTUlNTzJfU1dJVENIX1NJU09fQyAgICAgICAgIDQKLSNkZWZpbmUgSVdMX01JTU8yX1NXSVRDSF9HSSAgICAgICAgICAgICA1Ci0KLSNkZWZpbmUgSVdMX01BWF9TRUFSQ0ggSVdMX01JTU8yX1NXSVRDSF9HSQotCi0jZGVmaW5lIElXTF9BQ1RJT05fTElNSVQJCTMJLyogIyBwb3NzaWJsZSBhY3Rpb25zICovCi0KLSNkZWZpbmUgTFFfU0laRQkJMgkvKiAyIG1vZGUgdGFibGVzOiAgIkFjdGl2ZSIgYW5kICJTZWFyY2giICovCi0KLS8qIGxvYWQgcGVyIHRpZCBkZWZpbmVzIGZvciBBLU1QRFUgYWN0aXZhdGlvbiAqLwotI2RlZmluZSBJV0xfQUdHX1RQVF9USFJFSE9MRAkwCi0jZGVmaW5lIElXTF9BR0dfTE9BRF9USFJFU0hPTEQJMTAKLSNkZWZpbmUgSVdMX0FHR19BTExfVElECQkweGZmCi0jZGVmaW5lIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkcJNTAJLyptUyAqLwotI2RlZmluZSBUSURfUVVFVUVfTUFYX1NJWkUJMjAKLSNkZWZpbmUgVElEX1JPVU5EX1ZBTFVFCQk1CS8qIG1TICovCi0jZGVmaW5lIFRJRF9NQVhfTE9BRF9DT1VOVAk4Ci0KLSNkZWZpbmUgVElEX01BWF9USU1FX0RJRkYgKChUSURfUVVFVUVfTUFYX1NJWkUgLSAxKSAqIFRJRF9RVUVVRV9DRUxMX1NQQUNJTkcpCi0jZGVmaW5lIFRJTUVfV1JBUF9BUk9VTkQoeCwgeSkgKCgoeSkgPiAoeCkpID8gKHkpIC0gKHgpIDogKDAtKHgpKSArICh5KSkKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCBpd2xfcmF0ZV9pbmZvIGl3bGVnYWN5X3JhdGVzW0lXTF9SQVRFX0NPVU5UXTsKLQotZW51bSBpd2xfdGFibGVfdHlwZSB7Ci0JTFFfTk9ORSwKLQlMUV9HLAkJLyogbGVnYWN5IHR5cGVzICovCi0JTFFfQSwKLQlMUV9TSVNPLAkvKiBoaWdoLXRocm91Z2hwdXQgdHlwZXMgKi8KLQlMUV9NSU1PMiwKLQlMUV9NQVgsCi19OwotCi0jZGVmaW5lIGlzX2xlZ2FjeSh0YmwpICgoKHRibCkgPT0gTFFfRykgfHwgKCh0YmwpID09IExRX0EpKQotI2RlZmluZSBpc19zaXNvKHRibCkgKCh0YmwpID09IExRX1NJU08pCi0jZGVmaW5lIGlzX21pbW8yKHRibCkgKCh0YmwpID09IExRX01JTU8yKQotI2RlZmluZSBpc19taW1vKHRibCkgKGlzX21pbW8yKHRibCkpCi0jZGVmaW5lIGlzX0h0KHRibCkgKGlzX3Npc28odGJsKSB8fCBpc19taW1vKHRibCkpCi0jZGVmaW5lIGlzX2FfYmFuZCh0YmwpICgodGJsKSA9PSBMUV9BKQotI2RlZmluZSBpc19nX2FuZCh0YmwpICgodGJsKSA9PSBMUV9HKQotCi0jZGVmaW5lCUFOVF9OT05FCTB4MAotI2RlZmluZQlBTlRfQQkJQklUKDApCi0jZGVmaW5lCUFOVF9CCQlCSVQoMSkKLSNkZWZpbmUJQU5UX0FCCQkoQU5UX0EgfCBBTlRfQikKLSNkZWZpbmUgQU5UX0MJCUJJVCgyKQotI2RlZmluZQlBTlRfQUMJCShBTlRfQSB8IEFOVF9DKQotI2RlZmluZSBBTlRfQkMJCShBTlRfQiB8IEFOVF9DKQotI2RlZmluZSBBTlRfQUJDCQkoQU5UX0FCIHwgQU5UX0MpCi0KLSNkZWZpbmUgSVdMX01BWF9NQ1NfRElTUExBWV9TSVpFCTEyCi0KLXN0cnVjdCBpd2xfcmF0ZV9tY3NfaW5mbyB7Ci0JY2hhcgltYnBzW0lXTF9NQVhfTUNTX0RJU1BMQVlfU0laRV07Ci0JY2hhcgltY3NbSVdMX01BWF9NQ1NfRElTUExBWV9TSVpFXTsKLX07Ci0KLS8qKgotICogc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgLS0gdHggc3VjY2VzcyBoaXN0b3J5IGZvciBvbmUgcmF0ZQotICovCi1zdHJ1Y3QgaXdsX3JhdGVfc2NhbGVfZGF0YSB7Ci0JdTY0IGRhdGE7CQkvKiBiaXRtYXAgb2Ygc3VjY2Vzc2Z1bCBmcmFtZXMgKi8KLQlzMzIgc3VjY2Vzc19jb3VudGVyOwkvKiBudW1iZXIgb2YgZnJhbWVzIHN1Y2Nlc3NmdWwgKi8KLQlzMzIgc3VjY2Vzc19yYXRpbzsJLyogcGVyLWNlbnQgKiAxMjggICovCi0JczMyIGNvdW50ZXI7CQkvKiBudW1iZXIgb2YgZnJhbWVzIGF0dGVtcHRlZCAqLwotCXMzMiBhdmVyYWdlX3RwdDsJLyogc3VjY2VzcyByYXRpbyAqIGV4cGVjdGVkIHRocm91Z2hwdXQgKi8KLQl1bnNpZ25lZCBsb25nIHN0YW1wOwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvIC0tIHR4IHBhcmFtcyBhbmQgc3VjY2VzcyBoaXN0b3J5IGZvciBhbGwgcmF0ZXMKLSAqCi0gKiBUaGVyZSBhcmUgdHdvIG9mIHRoZXNlIGluIHN0cnVjdCBpd2xfbHFfc3RhLAotICogb25lIGZvciAiYWN0aXZlIiwgYW5kIG9uZSBmb3IgInNlYXJjaCIuCi0gKi8KLXN0cnVjdCBpd2xfc2NhbGVfdGJsX2luZm8gewotCWVudW0gaXdsX3RhYmxlX3R5cGUgbHFfdHlwZTsKLQl1OCBhbnRfdHlwZTsKLQl1OCBpc19TR0k7CS8qIDEgPSBzaG9ydCBndWFyZCBpbnRlcnZhbCAqLwotCXU4IGlzX2h0NDA7CS8qIDEgPSA0MCBNSHogY2hhbm5lbCB3aWR0aCAqLwotCXU4IGlzX2R1cDsJLyogMSA9IGR1cGxpY2F0ZWQgZGF0YSBzdHJlYW1zICovCi0JdTggYWN0aW9uOwkvKiBjaGFuZ2UgbW9kdWxhdGlvbjsgSVdMX1tMRUdBQ1kvU0lTTy9NSU1PXV9TV0lUQ0hfKiAqLwotCXU4IG1heF9zZWFyY2g7CS8qIG1heGltdW4gbnVtYmVyIG9mIHRhYmxlcyB3ZSBjYW4gc2VhcmNoICovCi0JczMyICpleHBlY3RlZF90cHQ7CS8qIHRocm91Z2hwdXQgbWV0cmljczsgZXhwZWN0ZWRfdHB0X0csIGV0Yy4gKi8KLQl1MzIgY3VycmVudF9yYXRlOyAgLyogcmF0ZV9uX2ZsYWdzLCB1Q29kZSBBUEkgZm9ybWF0ICovCi0Jc3RydWN0IGl3bF9yYXRlX3NjYWxlX2RhdGEgd2luW0lXTF9SQVRFX0NPVU5UXTsgLyogcmF0ZSBoaXN0b3JpZXMgKi8KLX07Ci0KLXN0cnVjdCBpd2xfdHJhZmZpY19sb2FkIHsKLQl1bnNpZ25lZCBsb25nIHRpbWVfc3RhbXA7CS8qIGFnZSBvZiB0aGUgb2xkZXN0IHN0YXRpc3RpY3MgKi8KLQl1MzIgcGFja2V0X2NvdW50W1RJRF9RVUVVRV9NQVhfU0laRV07ICAgLyogcGFja2V0IGNvdW50IGluIHRoaXMgdGltZQotCQkJCQkJICogc2xpY2UgKi8KLQl1MzIgdG90YWw7CQkJLyogdG90YWwgbnVtIG9mIHBhY2tldHMgZHVyaW5nIHRoZQotCQkJCQkgKiBsYXN0IFRJRF9NQVhfVElNRV9ESUZGICovCi0JdTggcXVldWVfY291bnQ7CQkJLyogbnVtYmVyIG9mIHF1ZXVlcyB0aGF0IGhhcwotCQkJCQkgKiBiZWVuIHVzZWQgc2luY2UgdGhlIGxhc3QgY2xlYW51cCAqLwotCXU4IGhlYWQ7CQkJLyogc3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlciAqLwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgaXdsX2xxX3N0YSAtLSBkcml2ZXIncyByYXRlIHNjYWxpbmcgcHJpdmF0ZSBzdHJ1Y3R1cmUKLSAqCi0gKiBQb2ludGVyIHRvIHRoaXMgZ2V0cyBwYXNzZWQgYmFjayBhbmQgZm9ydGggYmV0d2VlbiBkcml2ZXIgYW5kIG1hYzgwMjExLgotICovCi1zdHJ1Y3QgaXdsX2xxX3N0YSB7Ci0JdTggYWN0aXZlX3RibDsJCS8qIGluZGV4IG9mIGFjdGl2ZSB0YWJsZSwgcmFuZ2UgMC0xICovCi0JdTggZW5hYmxlX2NvdW50ZXI7CS8qIGluZGljYXRlcyBIVCBtb2RlICovCi0JdTggc3RheV9pbl90Ymw7CQkvKiAxOiBkaXNhbGxvdywgMDogYWxsb3cgc2VhcmNoIGZvciBuZXcgbW9kZSAqLwotCXU4IHNlYXJjaF9iZXR0ZXJfdGJsOwkvKiAxOiBjdXJyZW50bHkgdHJ5aW5nIGFsdGVybmF0ZSBtb2RlICovCi0JczMyIGxhc3RfdHB0OwotCi0JLyogVGhlIGZvbGxvd2luZyBkZXRlcm1pbmUgd2hlbiB0byBzZWFyY2ggZm9yIGEgbmV3IG1vZGUgKi8KLQl1MzIgdGFibGVfY291bnRfbGltaXQ7Ci0JdTMyIG1heF9mYWlsdXJlX2xpbWl0OwkvKiAjIGZhaWxlZCBmcmFtZXMgYmVmb3JlIG5ldyBzZWFyY2ggKi8KLQl1MzIgbWF4X3N1Y2Nlc3NfbGltaXQ7CS8qICMgc3VjY2Vzc2Z1bCBmcmFtZXMgYmVmb3JlIG5ldyBzZWFyY2ggKi8KLQl1MzIgdGFibGVfY291bnQ7Ci0JdTMyIHRvdGFsX2ZhaWxlZDsJLyogdG90YWwgZmFpbGVkIGZyYW1lcywgYW55L2FsbCByYXRlcyAqLwotCXUzMiB0b3RhbF9zdWNjZXNzOwkvKiB0b3RhbCBzdWNjZXNzZnVsIGZyYW1lcywgYW55L2FsbCByYXRlcyAqLwotCXU2NCBmbHVzaF90aW1lcjsJLyogdGltZSBzdGF5aW5nIGluIG1vZGUgYmVmb3JlIG5ldyBzZWFyY2ggKi8KLQotCXU4IGFjdGlvbl9jb3VudGVyOwkvKiAjIG1vZGUtc3dpdGNoIGFjdGlvbnMgdHJpZWQgKi8KLQl1OCBpc19ncmVlbjsKLQl1OCBpc19kdXA7Ci0JZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kOwotCi0JLyogVGhlIGZvbGxvd2luZyBhcmUgYml0bWFwcyBvZiByYXRlczsgSVdMX1JBVEVfNk1fTUFTSywgZXRjLiAqLwotCXUzMiBzdXBwX3JhdGVzOwotCXUxNiBhY3RpdmVfbGVnYWN5X3JhdGU7Ci0JdTE2IGFjdGl2ZV9zaXNvX3JhdGU7Ci0JdTE2IGFjdGl2ZV9taW1vMl9yYXRlOwotCXM4IG1heF9yYXRlX2lkeDsgICAgIC8qIE1heCByYXRlIHNldCBieSB1c2VyICovCi0JdTggbWlzc2VkX3JhdGVfY291bnRlcjsKLQotCXN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCBscTsKLQlzdHJ1Y3QgaXdsX3NjYWxlX3RibF9pbmZvIGxxX2luZm9bTFFfU0laRV07IC8qICJhY3RpdmUiLCAic2VhcmNoIiAqLwotCXN0cnVjdCBpd2xfdHJhZmZpY19sb2FkIGxvYWRbVElEX01BWF9MT0FEX0NPVU5UXTsKLQl1OCB0eF9hZ2dfdGlkX2VuOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTCi0Jc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX3NjYWxlX3RhYmxlX2ZpbGU7Ci0Jc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX3N0YXRzX3RhYmxlX2ZpbGU7Ci0Jc3RydWN0IGRlbnRyeSAqcnNfc3RhX2RiZ2ZzX3JhdGVfc2NhbGVfZGF0YV9maWxlOwotCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc190eF9hZ2dfdGlkX2VuX2ZpbGU7Ci0JdTMyIGRiZ19maXhlZF9yYXRlOwotI2VuZGlmCi0Jc3RydWN0IGl3bF9wcml2ICpkcnY7Ci0KLQkvKiB1c2VkIHRvIGJlIGluIHN0YV9pbmZvICovCi0JaW50IGxhc3RfdHhyYXRlX2lkeDsKLQkvKiBsYXN0IHR4IHJhdGVfbl9mbGFncyAqLwotCXUzMiBsYXN0X3JhdGVfbl9mbGFnczsKLQkvKiBwYWNrZXRzIGRlc3RpbmVkIGZvciB0aGlzIFNUQSBhcmUgYWdncmVnYXRlZCAqLwotCXU4IGlzX2FnZzsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgdTggaXdsNDk2NV9udW1fb2ZfYW50KHU4IG1hc2spCi17Ci0JcmV0dXJuICAhISgobWFzaykgJiBBTlRfQSkgKwotCQkhISgobWFzaykgJiBBTlRfQikgKwotCQkhISgobWFzaykgJiBBTlRfQyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggaXdsNDk2NV9maXJzdF9hbnRlbm5hKHU4IG1hc2spCi17Ci0JaWYgKG1hc2sgJiBBTlRfQSkKLQkJcmV0dXJuIEFOVF9BOwotCWlmIChtYXNrICYgQU5UX0IpCi0JCXJldHVybiBBTlRfQjsKLQlyZXR1cm4gQU5UX0M7Ci19Ci0KLQotLyoqCi0gKiBpd2wzOTQ1X3JhdGVfc2NhbGVfaW5pdCAtIEluaXRpYWxpemUgdGhlIHJhdGUgc2NhbGUgdGFibGUgYmFzZWQgb24gYXNzb2MgaW5mbwotICoKLSAqIFRoZSBzcGVjaWZpYyB0aHJvdWdocHV0IHRhYmxlIHVzZWQgaXMgYmFzZWQgb24gdGhlIHR5cGUgb2YgbmV0d29yawotICogdGhlIGFzc29jaWF0ZWQgd2l0aCwgaW5jbHVkaW5nIEEsIEIsIEcsIGFuZCBHIHcvIFRHRyBwcm90ZWN0aW9uCi0gKi8KLWV4dGVybiB2b2lkIGl3bDM5NDVfcmF0ZV9zY2FsZV9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzMzIgc3RhX2lkKTsKLQotLyogSW5pdGlhbGl6ZSBzdGF0aW9uJ3MgcmF0ZSBzY2FsaW5nIGluZm9ybWF0aW9uIGFmdGVyIGFkZGluZyBzdGF0aW9uICovCi1leHRlcm4gdm9pZCBpd2w0OTY1X3JzX3JhdGVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHN0YV9pZCk7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X3JzX3JhdGVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHN0YV9pZCk7Ci0KLS8qKgotICogaXdsX3JhdGVfY29udHJvbF9yZWdpc3RlciAtIFJlZ2lzdGVyIHRoZSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtIGNhbGxiYWNrcwotICoKLSAqIFNpbmNlIHRoZSByYXRlIGNvbnRyb2wgYWxnb3JpdGhtIGlzIGhhcmR3YXJlIHNwZWNpZmljLCB0aGVyZSBpcyBubyBuZWVkCi0gKiBvciByZWFzb24gdG8gcGxhY2UgaXQgYXMgYSBzdGFuZCBhbG9uZSBtb2R1bGUuICBUaGUgZHJpdmVyIGNhbiBjYWxsCi0gKiBpd2xfcmF0ZV9jb250cm9sX3JlZ2lzdGVyIGluIG9yZGVyIHRvIHJlZ2lzdGVyIHRoZSByYXRlIGNvbnRyb2wgY2FsbGJhY2tzCi0gKiB3aXRoIHRoZSBtYWM4MDIxMSBzdWJzeXN0ZW0uICBUaGlzIHNob3VsZCBiZSBwZXJmb3JtZWQgcHJpb3IgdG8gY2FsbGluZwotICogaWVlZTgwMjExX3JlZ2lzdGVyX2h3Ci0gKgotICovCi1leHRlcm4gaW50IGl3bDQ5NjVfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKHZvaWQpOwotZXh0ZXJuIGludCBpd2wzOTQ1X3JhdGVfY29udHJvbF9yZWdpc3Rlcih2b2lkKTsKLQotLyoqCi0gKiBpd2xfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIgLSBVbnJlZ2lzdGVyIHRoZSByYXRlIGNvbnRyb2wgY2FsbGJhY2tzCi0gKgotICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGNhbGxpbmcgaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcsIGJ1dCBiZWZvcmUKLSAqIHRoZSBkcml2ZXIgaXMgdW5sb2FkZWQuCi0gKi8KLWV4dGVybiB2b2lkIGl3bDQ5NjVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBpd2wzOTQ1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKHZvaWQpOwotCi0jZW5kaWYgLyogX19pd2xfbGVnYWN5X3JzX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1wb3dlci5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBvd2VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwM2VmMGQuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBvd2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDA3IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLSNpbmNsdWRlICJpd2wtY29tbWFuZHMuaCIKLSNpbmNsdWRlICJpd2wtZGVidWcuaCIKLSNpbmNsdWRlICJpd2wtcG93ZXIuaCIKLQotLyoKLSAqIFNldHRpbmcgcG93ZXIgbGV2ZWwgYWxsb3dzIHRoZSBjYXJkIHRvIGdvIHRvIHNsZWVwIHdoZW4gbm90IGJ1c3kuCi0gKgotICogV2UgY2FsY3VsYXRlIGEgc2xlZXAgY29tbWFuZCBiYXNlZCBvbiB0aGUgcmVxdWlyZWQgbGF0ZW5jeSwgd2hpY2gKLSAqIHdlIGdldCBmcm9tIG1hYzgwMjExLiBJbiBvcmRlciB0byBoYW5kbGUgdGhlcm1hbCB0aHJvdHRsaW5nLCB3ZSBjYW4KLSAqIGFsc28gdXNlIHByZS1kZWZpbmVkIHBvd2VyIGxldmVscy4KLSAqLwotCi0vKgotICogVGhpcyBkZWZpbmVzIHRoZSBvbGQgcG93ZXIgbGV2ZWxzLiBUaGV5IGFyZSBzdGlsbCB1c2VkIGJ5IGRlZmF1bHQKLSAqIChsZXZlbCAxKSBhbmQgZm9yIHRoZXJtYWwgdGhyb3R0bGUgKGxldmVscyAzIHRocm91Z2ggNSkKLSAqLwotCi1zdHJ1Y3QgaXdsX3Bvd2VyX3ZlY19lbnRyeSB7Ci0Jc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCBjbWQ7Ci0JdTggbm9fZHRpbTsJLyogbnVtYmVyIG9mIHNraXAgZHRpbSAqLwotfTsKLQotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9wb3dlcl9zbGVlcF9jYW1fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCAqY21kKQotewotCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7Ci0KLQlpZiAocHJpdi0+cG93ZXJfZGF0YS5wY2lfcG0pCi0JCWNtZC0+ZmxhZ3MgfD0gSVdMX1BPV0VSX1BDSV9QTV9NU0s7Ci0KLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlNsZWVwIGNvbW1hbmQgZm9yIENBTVxuIik7Ci19Ci0KLXN0YXRpYyBpbnQKLWl3bF9sZWdhY3lfc2V0X3Bvd2VyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCAqY21kKQotewotCUlXTF9ERUJVR19QT1dFUihwcml2LCAiU2VuZGluZyBwb3dlci9zbGVlcCBjb21tYW5kXG4iKTsKLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIkZsYWdzIHZhbHVlID0gMHglMDhYXG4iLCBjbWQtPmZsYWdzKTsKLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlR4IHRpbWVvdXQgPSAldVxuIiwKLQkJCQkJbGUzMl90b19jcHUoY21kLT50eF9kYXRhX3RpbWVvdXQpKTsKLQlJV0xfREVCVUdfUE9XRVIocHJpdiwgIlJ4IHRpbWVvdXQgPSAldVxuIiwKLQkJCQkJbGUzMl90b19jcHUoY21kLT5yeF9kYXRhX3RpbWVvdXQpKTsKLQlJV0xfREVCVUdfUE9XRVIocHJpdiwKLQkJCSJTbGVlcCBpbnRlcnZhbCB2ZWN0b3IgPSB7ICVkICwgJWQgLCAlZCAsICVkICwgJWQgfVxuIiwKLQkJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbMF0pLAotCQkJbGUzMl90b19jcHUoY21kLT5zbGVlcF9pbnRlcnZhbFsxXSksCi0JCQlsZTMyX3RvX2NwdShjbWQtPnNsZWVwX2ludGVydmFsWzJdKSwKLQkJCWxlMzJfdG9fY3B1KGNtZC0+c2xlZXBfaW50ZXJ2YWxbM10pLAotCQkJbGUzMl90b19jcHUoY21kLT5zbGVlcF9pbnRlcnZhbFs0XSkpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFBPV0VSX1RBQkxFX0NNRCwKLQkJCQlzaXplb2Yoc3RydWN0IGl3bF9wb3dlcnRhYmxlX2NtZCksIGNtZCk7Ci19Ci0KLWludAotaXdsX2xlZ2FjeV9wb3dlcl9zZXRfbW9kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgKmNtZCwKLQkJICAgICAgIGJvb2wgZm9yY2UpCi17Ci0JaW50IHJldDsKLQlib29sIHVwZGF0ZV9jaGFpbnM7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQkvKiBEb24ndCB1cGRhdGUgdGhlIFJYIGNoYWluIHdoZW4gY2hhaW4gbm9pc2UgY2FsaWJyYXRpb24gaXMgcnVubmluZyAqLwotCXVwZGF0ZV9jaGFpbnMgPSBwcml2LT5jaGFpbl9ub2lzZV9kYXRhLnN0YXRlID09IElXTF9DSEFJTl9OT0lTRV9ET05FIHx8Ci0JCQlwcml2LT5jaGFpbl9ub2lzZV9kYXRhLnN0YXRlID09IElXTF9DSEFJTl9OT0lTRV9BTElWRTsKLQotCWlmICghbWVtY21wKCZwcml2LT5wb3dlcl9kYXRhLnNsZWVwX2NtZCwgY21kLCBzaXplb2YoKmNtZCkpICYmICFmb3JjZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpCi0JCXJldHVybiAtRUlPOwotCi0JLyogc2NhbiBjb21wbGV0ZSB1c2Ugc2xlZXBfcG93ZXJfbmV4dCwgbmVlZCB0byBiZSB1cGRhdGVkICovCi0JbWVtY3B5KCZwcml2LT5wb3dlcl9kYXRhLnNsZWVwX2NtZF9uZXh0LCBjbWQsIHNpemVvZigqY21kKSk7Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykgJiYgIWZvcmNlKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJEZWZlciBwb3dlciBzZXQgbW9kZSB3aGlsZSBzY2FubmluZ1xuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWlmIChjbWQtPmZsYWdzICYgSVdMX1BPV0VSX0RSSVZFUl9BTExPV19TTEVFUF9NU0spCi0JCXNldF9iaXQoU1RBVFVTX1BPV0VSX1BNSSwgJnByaXYtPnN0YXR1cyk7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NldF9wb3dlcihwcml2LCBjbWQpOwotCWlmICghcmV0KSB7Ci0JCWlmICghKGNtZC0+ZmxhZ3MgJiBJV0xfUE9XRVJfRFJJVkVSX0FMTE9XX1NMRUVQX01TSykpCi0JCQljbGVhcl9iaXQoU1RBVFVTX1BPV0VSX1BNSSwgJnByaXYtPnN0YXR1cyk7Ci0KLQkJaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnVwZGF0ZV9jaGFpbl9mbGFncyAmJiB1cGRhdGVfY2hhaW5zKQotCQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dXBkYXRlX2NoYWluX2ZsYWdzKHByaXYpOwotCQllbHNlIGlmIChwcml2LT5jZmctPm9wcy0+bGliLT51cGRhdGVfY2hhaW5fZmxhZ3MpCi0JCQlJV0xfREVCVUdfUE9XRVIocHJpdiwKLQkJCQkJIkNhbm5vdCB1cGRhdGUgdGhlIHBvd2VyLCBjaGFpbiBub2lzZSAiCi0JCQkJCSJjYWxpYnJhdGlvbiBydW5uaW5nOiAlZFxuIiwKLQkJCQkJcHJpdi0+Y2hhaW5fbm9pc2VfZGF0YS5zdGF0ZSk7Ci0KLQkJbWVtY3B5KCZwcml2LT5wb3dlcl9kYXRhLnNsZWVwX2NtZCwgY21kLCBzaXplb2YoKmNtZCkpOwotCX0gZWxzZQotCQlJV0xfRVJSKHByaXYsICJzZXQgcG93ZXIgZmFpbCwgcmV0ID0gJWQiLCByZXQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGZvcmNlKQotewotCXN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgY21kOwotCi0JaXdsX2xlZ2FjeV9wb3dlcl9zbGVlcF9jYW1fY21kKHByaXYsICZjbWQpOwotCXJldHVybiBpd2xfbGVnYWN5X3Bvd2VyX3NldF9tb2RlKHByaXYsICZjbWQsIGZvcmNlKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9wb3dlcl91cGRhdGVfbW9kZSk7Ci0KLS8qIGluaXRpYWxpemUgdG8gZGVmYXVsdCAqLwotdm9pZCBpd2xfbGVnYWN5X3Bvd2VyX2luaXRpYWxpemUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXUxNiBsY3RsID0gaXdsX2xlZ2FjeV9wY2llX2xpbmtfY3RsKHByaXYpOwotCi0JcHJpdi0+cG93ZXJfZGF0YS5wY2lfcG0gPSAhKGxjdGwgJiBQQ0lfQ0ZHX0xJTktfQ1RSTF9WQUxfTDBTX0VOKTsKLQotCXByaXYtPnBvd2VyX2RhdGEuZGVidWdfc2xlZXBfbGV2ZWxfb3ZlcnJpZGUgPSAtMTsKLQotCW1lbXNldCgmcHJpdi0+cG93ZXJfZGF0YS5zbGVlcF9jbWQsIDAsCi0JCXNpemVvZihwcml2LT5wb3dlcl9kYXRhLnNsZWVwX2NtZCkpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3Bvd2VyX2luaXRpYWxpemUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBvd2VyLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcG93ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMwYjM2YS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcG93ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwNyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAotICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX2l3bF9sZWdhY3lfcG93ZXJfc2V0dGluZ19oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X3Bvd2VyX3NldHRpbmdfaF9fCi0KLSNpbmNsdWRlICJpd2wtY29tbWFuZHMuaCIKLQotZW51bSBpd2xfcG93ZXJfbGV2ZWwgewotCUlXTF9QT1dFUl9JTkRFWF8xLAotCUlXTF9QT1dFUl9JTkRFWF8yLAotCUlXTF9QT1dFUl9JTkRFWF8zLAotCUlXTF9QT1dFUl9JTkRFWF80LAotCUlXTF9QT1dFUl9JTkRFWF81LAotCUlXTF9QT1dFUl9OVU0KLX07Ci0KLXN0cnVjdCBpd2xfcG93ZXJfbWdyIHsKLQlzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kIHNsZWVwX2NtZDsKLQlzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kIHNsZWVwX2NtZF9uZXh0OwotCWludCBkZWJ1Z19zbGVlcF9sZXZlbF9vdmVycmlkZTsKLQlib29sIHBjaV9wbTsKLX07Ci0KLWludAotaXdsX2xlZ2FjeV9wb3dlcl9zZXRfbW9kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcG93ZXJ0YWJsZV9jbWQgKmNtZCwKLQkJICAgICAgIGJvb2wgZm9yY2UpOwotaW50IGl3bF9sZWdhY3lfcG93ZXJfdXBkYXRlX21vZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGZvcmNlKTsKLXZvaWQgaXdsX2xlZ2FjeV9wb3dlcl9pbml0aWFsaXplKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0KLSNlbmRpZiAgLyogX19pd2xfbGVnYWN5X3Bvd2VyX3NldHRpbmdfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1yeC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQyMWVjLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1yeC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAotICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KLSNpbmNsdWRlICJpd2wtZWVwcm9tLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLXN0YS5oIgotI2luY2x1ZGUgIml3bC1pby5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0vKioqKioqKioqKioqKioqKioqKioqKioqKiogUlgtRlVOQ1RJT05TICoqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogUnggdGhlb3J5IG9mIG9wZXJhdGlvbgotICoKLSAqIERyaXZlciBhbGxvY2F0ZXMgYSBjaXJjdWxhciBidWZmZXIgb2YgUmVjZWl2ZSBCdWZmZXIgRGVzY3JpcHRvcnMgKFJCRHMpLAotICogZWFjaCBvZiB3aGljaCBwb2ludCB0byBSZWNlaXZlIEJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJ5IHRoZSBOSUMuICBUaGVzZSBnZXQKLSAqIHVzZWQgbm90IG9ubHkgZm9yIFJ4IGZyYW1lcywgYnV0IGZvciBhbnkgY29tbWFuZCByZXNwb25zZSBvciBub3RpZmljYXRpb24KLSAqIGZyb20gdGhlIE5JQy4gIFRoZSBkcml2ZXIgYW5kIE5JQyBtYW5hZ2UgdGhlIFJ4IGJ1ZmZlcnMgYnkgbWVhbnMKLSAqIG9mIGluZGV4ZXMgaW50byB0aGUgY2lyY3VsYXIgYnVmZmVyLgotICoKLSAqIFJ4IFF1ZXVlIEluZGV4ZXMKLSAqIFRoZSBob3N0L2Zpcm13YXJlIHNoYXJlIHR3byBpbmRleCByZWdpc3RlcnMgZm9yIG1hbmFnaW5nIHRoZSBSeCBidWZmZXJzLgotICoKLSAqIFRoZSBSRUFEIGluZGV4IG1hcHMgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIHRoYXQgdGhlIGZpcm13YXJlIG1heSBiZSB3cml0aW5nCi0gKiB0byAtLSB0aGUgZHJpdmVyIGNhbiByZWFkIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgdGhpcyBwb3NpdGlvbiBhbmQgZ2V0Ci0gKiBnb29kIGRhdGEuCi0gKiBUaGUgUkVBRCBpbmRleCBpcyBtYW5hZ2VkIGJ5IHRoZSBmaXJtd2FyZSBvbmNlIHRoZSBjYXJkIGlzIGVuYWJsZWQuCi0gKgotICogVGhlIFdSSVRFIGluZGV4IG1hcHMgdG8gdGhlIGxhc3QgcG9zaXRpb24gdGhlIGRyaXZlciBoYXMgcmVhZCBmcm9tIC0tIHRoZQotICogcG9zaXRpb24gcHJlY2VkaW5nIFdSSVRFIGlzIHRoZSBsYXN0IHNsb3QgdGhlIGZpcm13YXJlIGNhbiBwbGFjZSBhIHBhY2tldC4KLSAqCi0gKiBUaGUgcXVldWUgaXMgZW1wdHkgKG5vIGdvb2QgZGF0YSkgaWYgV1JJVEUgPSBSRUFEIC0gMSwgYW5kIGlzIGZ1bGwgaWYKLSAqIFdSSVRFID0gUkVBRC4KLSAqCi0gKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRoZSBob3N0IHNldHMgdXAgdGhlIFJFQUQgcXVldWUgcG9zaXRpb24gdG8gdGhlIGZpcnN0Ci0gKiBJTkRFWCBwb3NpdGlvbiwgYW5kIFdSSVRFIHRvIHRoZSBsYXN0IChSRUFEIC0gMSB3cmFwcGVkKQotICoKLSAqIFdoZW4gdGhlIGZpcm13YXJlIHBsYWNlcyBhIHBhY2tldCBpbiBhIGJ1ZmZlciwgaXQgd2lsbCBhZHZhbmNlIHRoZSBSRUFEIGluZGV4Ci0gKiBhbmQgZmlyZSB0aGUgUlggaW50ZXJydXB0LiAgVGhlIGRyaXZlciBjYW4gdGhlbiBxdWVyeSB0aGUgUkVBRCBpbmRleCBhbmQKLSAqIHByb2Nlc3MgYXMgbWFueSBwYWNrZXRzIGFzIHBvc3NpYmxlLCBtb3ZpbmcgdGhlIFdSSVRFIGluZGV4IGZvcndhcmQgYXMgaXQKLSAqIHJlc2V0cyB0aGUgUnggcXVldWUgYnVmZmVycyB3aXRoIG5ldyBtZW1vcnkuCi0gKgotICogVGhlIG1hbmFnZW1lbnQgaW4gdGhlIGRyaXZlciBpcyBhcyBmb2xsb3dzOgotICogKyBBIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBTS0JzIGlzIHN0b3JlZCBpbiBpd2wtPnJ4cS0+cnhfZnJlZS4gIFdoZW4KLSAqICAgaXdsLT5yeHEtPmZyZWVfY291bnQgZHJvcHMgdG8gb3IgYmVsb3cgUlhfTE9XX1dBVEVSTUFSSywgd29yayBpcyBzY2hlZHVsZWQKLSAqICAgdG8gcmVwbGVuaXNoIHRoZSBpd2wtPnJ4cS0+cnhfZnJlZS4KLSAqICsgSW4gaXdsX3J4X3JlcGxlbmlzaCAoc2NoZWR1bGVkKSBpZiAncHJvY2Vzc2VkJyAhPSAncmVhZCcgdGhlbiB0aGUKLSAqICAgaXdsLT5yeHEgaXMgcmVwbGVuaXNoZWQgYW5kIHRoZSBSRUFEIElOREVYIGlzIHVwZGF0ZWQgKHVwZGF0aW5nIHRoZQotICogICAncHJvY2Vzc2VkJyBhbmQgJ3JlYWQnIGRyaXZlciBpbmRleGVzIGFzIHdlbGwpCi0gKiArIEEgcmVjZWl2ZWQgcGFja2V0IGlzIHByb2Nlc3NlZCBhbmQgaGFuZGVkIHRvIHRoZSBrZXJuZWwgbmV0d29yayBzdGFjaywKLSAqICAgZGV0YWNoZWQgZnJvbSB0aGUgaXdsLT5yeHEuICBUaGUgZHJpdmVyICdwcm9jZXNzZWQnIGluZGV4IGlzIHVwZGF0ZWQuCi0gKiArIFRoZSBIb3N0L0Zpcm13YXJlIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGF0IHRhc2tsZXQgdGltZSBmcm9tIHRoZSByeF9mcmVlCi0gKiAgIGxpc3QuIElmIHRoZXJlIGFyZSBubyBhbGxvY2F0ZWQgYnVmZmVycyBpbiBpd2wtPnJ4cS0+cnhfZnJlZSwgdGhlIFJFQUQKLSAqICAgSU5ERVggaXMgbm90IGluY3JlbWVudGVkIGFuZCBpd2wtPnN0YXR1cyhSWF9TVEFMTEVEKSBpcyBzZXQuICBJZiB0aGVyZQotICogICB3ZXJlIGVub3VnaCBmcmVlIGJ1ZmZlcnMgYW5kIFJYX1NUQUxMRUQgaXMgc2V0IGl0IGlzIGNsZWFyZWQuCi0gKgotICoKLSAqIERyaXZlciBzZXF1ZW5jZToKLSAqCi0gKiBpd2xfbGVnYWN5X3J4X3F1ZXVlX2FsbG9jKCkgICBBbGxvY2F0ZXMgcnhfZnJlZQotICogaXdsX3J4X3JlcGxlbmlzaCgpICAgICBSZXBsZW5pc2hlcyByeF9mcmVlIGxpc3QgZnJvbSByeF91c2VkLCBhbmQgY2FsbHMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl3bF9yeF9xdWV1ZV9yZXN0b2NrCi0gKiBpd2xfcnhfcXVldWVfcmVzdG9jaygpIE1vdmVzIGF2YWlsYWJsZSBidWZmZXJzIGZyb20gcnhfZnJlZSBpbnRvIFJ4Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgdXBkYXRlcyBmaXJtd2FyZSBwb2ludGVycywgYW5kIHVwZGF0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBXUklURSBpbmRleC4gIElmIGluc3VmZmljaWVudCByeF9mcmVlIGJ1ZmZlcnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUsIHNjaGVkdWxlcyBpd2xfcnhfcmVwbGVuaXNoCi0gKgotICogLS0gZW5hYmxlIGludGVycnVwdHMgLS0KLSAqIElTUiAtIGl3bF9yeCgpICAgICAgICAgRGV0YWNoIGl3bF9yeF9tZW1fYnVmZmVycyBmcm9tIHBvb2wgdXAgdG8gdGhlCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUFEIElOREVYLCBkZXRhY2hpbmcgdGhlIFNLQiBmcm9tIHRoZSBwb29sLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW92ZXMgdGhlIHBhY2tldCBidWZmZXIgZnJvbSBxdWV1ZSB0byByeF91c2VkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbHMgaXdsX3J4X3F1ZXVlX3Jlc3RvY2sgdG8gcmVmaWxsIGFueSBlbXB0eQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHMuCi0gKiAuLi4KLSAqCi0gKi8KLQotLyoqCi0gKiBpd2xfbGVnYWN5X3J4X3F1ZXVlX3NwYWNlIC0gUmV0dXJuIG51bWJlciBvZiBmcmVlIHNsb3RzIGF2YWlsYWJsZSBpbiBxdWV1ZS4KLSAqLwotaW50IGl3bF9sZWdhY3lfcnhfcXVldWVfc3BhY2UoY29uc3Qgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcSkKLXsKLQlpbnQgcyA9IHEtPnJlYWQgLSBxLT53cml0ZTsKLQlpZiAocyA8PSAwKQotCQlzICs9IFJYX1FVRVVFX1NJWkU7Ci0JLyoga2VlcCBzb21lIGJ1ZmZlciB0byBub3QgY29uZnVzZSBmdWxsIGFuZCBlbXB0eSBxdWV1ZSAqLwotCXMgLT0gMjsKLQlpZiAocyA8IDApCi0JCXMgPSAwOwotCXJldHVybiBzOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X3F1ZXVlX3NwYWNlKTsKLQotLyoqCi0gKiBpd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIgLSBVcGRhdGUgdGhlIHdyaXRlIHBvaW50ZXIgZm9yIHRoZSBSWCBxdWV1ZQotICovCi12b2lkCi1pd2xfbGVnYWN5X3J4X3F1ZXVlX3VwZGF0ZV93cml0ZV9wdHIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHJ4X3dydF9wdHJfcmVnID0gcHJpdi0+aHdfcGFyYW1zLnJ4X3dydF9wdHJfcmVnOwotCXUzMiByZWc7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcS0+bG9jaywgZmxhZ3MpOwotCi0JaWYgKHEtPm5lZWRfdXBkYXRlID09IDApCi0JCWdvdG8gZXhpdF91bmxvY2s7Ci0KLQkvKiBJZiBwb3dlci1zYXZpbmcgaXMgaW4gdXNlLCBtYWtlIHN1cmUgZGV2aWNlIGlzIGF3YWtlICovCi0JaWYgKHRlc3RfYml0KFNUQVRVU19QT1dFUl9QTUksICZwcml2LT5zdGF0dXMpKSB7Ci0JCXJlZyA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDEpOwotCi0JCWlmIChyZWcgJiBDU1JfVUNPREVfRFJWX0dQMV9CSVRfTUFDX1NMRUVQKSB7Ci0JCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJSeCBxdWV1ZSByZXF1ZXN0aW5nIHdha2V1cCwiCi0JCQkJIiBHUDEgPSAweCV4XG4iLCByZWcpOwotCQkJaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9HUF9DTlRSTCwKLQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOwotCQkJZ290byBleGl0X3VubG9jazsKLQkJfQotCi0JCXEtPndyaXRlX2FjdHVhbCA9IChxLT53cml0ZSAmIH4weDcpOwotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIHJ4X3dydF9wdHJfcmVnLAotCQkJCXEtPndyaXRlX2FjdHVhbCk7Ci0KLQkvKiBFbHNlIGRldmljZSBpcyBhc3N1bWVkIHRvIGJlIGF3YWtlICovCi0JfSBlbHNlIHsKLQkJLyogRGV2aWNlIGV4cGVjdHMgYSBtdWx0aXBsZSBvZiA4ICovCi0JCXEtPndyaXRlX2FjdHVhbCA9IChxLT53cml0ZSAmIH4weDcpOwotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIHJ4X3dydF9wdHJfcmVnLAotCQkJcS0+d3JpdGVfYWN0dWFsKTsKLQl9Ci0KLQlxLT5uZWVkX3VwZGF0ZSA9IDA7Ci0KLSBleGl0X3VubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cik7Ci0KLWludCBpd2xfbGVnYWN5X3J4X3F1ZXVlX2FsbG9jKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwcml2LT5wY2lfZGV2LT5kZXY7Ci0JaW50IGk7Ci0KLQlzcGluX2xvY2tfaW5pdCgmcnhxLT5sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF9mcmVlKTsKLQlJTklUX0xJU1RfSEVBRCgmcnhxLT5yeF91c2VkKTsKLQotCS8qIEFsbG9jIHRoZSBjaXJjdWxhciBidWZmZXIgb2YgUmVhZCBCdWZmZXIgRGVzY3JpcHRvcnMgKFJCRHMpICovCi0JcnhxLT5iZCA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIDQgKiBSWF9RVUVVRV9TSVpFLCAmcnhxLT5iZF9kbWEsCi0JCQkJICAgICBHRlBfS0VSTkVMKTsKLQlpZiAoIXJ4cS0+YmQpCi0JCWdvdG8gZXJyX2JkOwotCi0JcnhxLT5yYl9zdHRzID0gZG1hX2FsbG9jX2NvaGVyZW50KGRldiwgc2l6ZW9mKHN0cnVjdCBpd2xfcmJfc3RhdHVzKSwKLQkJCQkJICAmcnhxLT5yYl9zdHRzX2RtYSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFyeHEtPnJiX3N0dHMpCi0JCWdvdG8gZXJyX3JiOwotCi0JLyogRmlsbCB0aGUgcnhfdXNlZCBxdWV1ZSB3aXRoIF9hbGxfIG9mIHRoZSBSeCBidWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8IFJYX0ZSRUVfQlVGRkVSUyArIFJYX1FVRVVFX1NJWkU7IGkrKykKLQkJbGlzdF9hZGRfdGFpbCgmcnhxLT5wb29sW2ldLmxpc3QsICZyeHEtPnJ4X3VzZWQpOwotCi0JLyogU2V0IHVzIHNvIHRoYXQgd2UgaGF2ZSBwcm9jZXNzZWQgYW5kIHVzZWQgYWxsIGJ1ZmZlcnMsIGJ1dCBoYXZlCi0JICogbm90IHJlc3RvY2tlZCB0aGUgUnggcXVldWUgd2l0aCBmcmVzaCBidWZmZXJzICovCi0JcnhxLT5yZWFkID0gcnhxLT53cml0ZSA9IDA7Ci0JcnhxLT53cml0ZV9hY3R1YWwgPSAwOwotCXJ4cS0+ZnJlZV9jb3VudCA9IDA7Ci0JcnhxLT5uZWVkX3VwZGF0ZSA9IDA7Ci0JcmV0dXJuIDA7Ci0KLWVycl9yYjoKLQlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCA0ICogUlhfUVVFVUVfU0laRSwgcnhxLT5iZCwKLQkJCSAgcnhxLT5iZF9kbWEpOwotZXJyX2JkOgotCXJldHVybiAtRU5PTUVNOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3J4X3F1ZXVlX2FsbG9jKTsKLQotCi12b2lkIGl3bF9sZWdhY3lfcnhfc3BlY3RydW1fbWVhc3VyZV9ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9zcGVjdHJ1bV9ub3RpZmljYXRpb24gKnJlcG9ydCA9ICYocGt0LT51LnNwZWN0cnVtX25vdGlmKTsKLQotCWlmICghcmVwb3J0LT5zdGF0ZSkgewotCQlJV0xfREVCVUdfMTFIKHByaXYsCi0JCQkiU3BlY3RydW0gTWVhc3VyZSBOb3RpZmljYXRpb246IFN0YXJ0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCW1lbWNweSgmcHJpdi0+bWVhc3VyZV9yZXBvcnQsIHJlcG9ydCwgc2l6ZW9mKCpyZXBvcnQpKTsKLQlwcml2LT5tZWFzdXJlbWVudF9zdGF0dXMgfD0gTUVBU1VSRU1FTlRfUkVBRFk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcnhfc3BlY3RydW1fbWVhc3VyZV9ub3RpZik7Ci0KLS8qCi0gKiByZXR1cm5zIG5vbi16ZXJvIGlmIHBhY2tldCBzaG91bGQgYmUgZHJvcHBlZAotICovCi1pbnQgaXdsX2xlZ2FjeV9zZXRfZGVjcnlwdGVkX2ZsYWcoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKLQkJCSAgIHUzMiBkZWNyeXB0X3JlcywKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0cykKLXsKLQl1MTYgZmMgPSBsZTE2X3RvX2NwdShoZHItPmZyYW1lX2NvbnRyb2wpOwotCi0JLyoKLQkgKiBBbGwgY29udGV4dHMgaGF2ZSB0aGUgc2FtZSBzZXR0aW5nIGhlcmUgZHVlIHRvIGl0IGJlaW5nCi0JICogYSBtb2R1bGUgcGFyYW1ldGVyLCBzbyBPSyB0byBjaGVjayBhbnkgY29udGV4dC4KLQkgKi8KLQlpZiAocHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWN0aXZlLmZpbHRlcl9mbGFncyAmCi0JCQkJCQlSWE9OX0ZJTFRFUl9ESVNfREVDUllQVF9NU0spCi0JCXJldHVybiAwOwotCi0JaWYgKCEoZmMgJiBJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpKQotCQlyZXR1cm4gMDsKLQotCUlXTF9ERUJVR19SWChwcml2LCAiZGVjcnlwdF9yZXM6MHgleFxuIiwgZGVjcnlwdF9yZXMpOwotCXN3aXRjaCAoZGVjcnlwdF9yZXMgJiBSWF9SRVNfU1RBVFVTX1NFQ19UWVBFX01TSykgewotCWNhc2UgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9US0lQOgotCQkvKiBUaGUgdUNvZGUgaGFzIGdvdCBhIGJhZCBwaGFzZSAxIEtleSwgcHVzaGVzIHRoZSBwYWNrZXQuCi0JCSAqIERlY3J5cHRpb24gd2lsbCBiZSBkb25lIGluIFNXLiAqLwotCQlpZiAoKGRlY3J5cHRfcmVzICYgUlhfUkVTX1NUQVRVU19ERUNSWVBUX1RZUEVfTVNLKSA9PQotCQkgICAgUlhfUkVTX1NUQVRVU19CQURfS0VZX1RUQUspCi0JCQlicmVhazsKLQotCWNhc2UgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9XRVA6Ci0JCWlmICgoZGVjcnlwdF9yZXMgJiBSWF9SRVNfU1RBVFVTX0RFQ1JZUFRfVFlQRV9NU0spID09Ci0JCSAgICBSWF9SRVNfU1RBVFVTX0JBRF9JQ1ZfTUlDKSB7Ci0JCQkvKiBiYWQgSUNWLCB0aGUgcGFja2V0IGlzIGRlc3Ryb3llZCBzaW5jZSB0aGUKLQkJCSAqIGRlY3J5cHRpb24gaXMgaW5wbGFjZSwgZHJvcCBpdCAqLwotCQkJSVdMX0RFQlVHX1JYKHByaXYsICJQYWNrZXQgZGVzdHJveWVkXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCWNhc2UgUlhfUkVTX1NUQVRVU19TRUNfVFlQRV9DQ01QOgotCQlpZiAoKGRlY3J5cHRfcmVzICYgUlhfUkVTX1NUQVRVU19ERUNSWVBUX1RZUEVfTVNLKSA9PQotCQkgICAgUlhfUkVTX1NUQVRVU19ERUNSWVBUX09LKSB7Ci0JCQlJV0xfREVCVUdfUlgocHJpdiwgImh3IGRlY3J5cHQgc3VjY2Vzc2Z1bGx5ISEhXG4iKTsKLQkJCXN0YXRzLT5mbGFnIHw9IFJYX0ZMQUdfREVDUllQVEVEOwotCQl9Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NldF9kZWNyeXB0ZWRfZmxhZyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc2Nhbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXNjYW4uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxYjczYi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc2Nhbi5jCisrKyAvZGV2L251bGwKQEAgLTEsNTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBHUEwgTElDRU5TRSBTVU1NQVJZCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDggLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgotICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKLSAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKLSAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsCi0gKiBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbgotICogaW4gdGhlIGZpbGUgY2FsbGVkIExJQ0VOU0UuR1BMLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLQotLyogRm9yIGFjdGl2ZSBzY2FuLCBsaXN0ZW4gQUNUSVZFX0RXRUxMX1RJTUUgKG1zZWMpIG9uIGVhY2ggY2hhbm5lbCBhZnRlcgotICogc2VuZGluZyBwcm9iZSByZXEuICBUaGlzIHNob3VsZCBiZSBzZXQgbG9uZyBlbm91Z2ggdG8gaGVhciBwcm9iZSByZXNwb25zZXMKLSAqIGZyb20gbW9yZSB0aGFuIG9uZSBBUC4gICovCi0jZGVmaW5lIElXTF9BQ1RJVkVfRFdFTExfVElNRV8yNCAgICAoMzApICAgICAgIC8qIGFsbCB0aW1lcyBpbiBtc2VjICovCi0jZGVmaW5lIElXTF9BQ1RJVkVfRFdFTExfVElNRV81MiAgICAoMjApCi0KLSNkZWZpbmUgSVdMX0FDVElWRV9EV0VMTF9GQUNUT1JfMjRHSFogKDMpCi0jZGVmaW5lIElXTF9BQ1RJVkVfRFdFTExfRkFDVE9SXzUyR0haICgyKQotCi0vKiBGb3IgcGFzc2l2ZSBzY2FuLCBsaXN0ZW4gUEFTU0lWRV9EV0VMTF9USU1FIChtc2VjKSBvbiBlYWNoIGNoYW5uZWwuCi0gKiBNdXN0IGJlIHNldCBsb25nZXIgdGhhbiBhY3RpdmUgZHdlbGwgdGltZS4KLSAqIEZvciB0aGUgbW9zdCByZWxpYWJsZSBzY2FuLCBzZXQgPiBBUCBiZWFjb24gaW50ZXJ2YWwgKHR5cGljYWxseSAxMDBtc2VjKS4gKi8KLSNkZWZpbmUgSVdMX1BBU1NJVkVfRFdFTExfVElNRV8yNCAgICgyMCkgICAgICAgLyogYWxsIHRpbWVzIGluIG1zZWMgKi8KLSNkZWZpbmUgSVdMX1BBU1NJVkVfRFdFTExfVElNRV81MiAgICgxMCkKLSNkZWZpbmUgSVdMX1BBU1NJVkVfRFdFTExfQkFTRSAgICAgICgxMDApCi0jZGVmaW5lIElXTF9DSEFOTkVMX1RVTkVfVElNRSAgICAgICA1Ci0KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV9zZW5kX3NjYW5fYWJvcnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQ7Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdDsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKLQkJLmlkID0gUkVQTFlfU0NBTl9BQk9SVF9DTUQsCi0JCS5mbGFncyA9IENNRF9XQU5UX1NLQiwKLQl9OwotCi0JLyogRXhpdCBpbnN0YW50bHkgd2l0aCBlcnJvciB3aGVuIGRldmljZSBpcyBub3QgcmVhZHkKLQkgKiB0byByZWNlaXZlIHNjYW4gYWJvcnQgY29tbWFuZCBvciBpdCBkb2VzIG5vdCBwZXJmb3JtCi0JICogaGFyZHdhcmUgc2NhbiBjdXJyZW50bHkgKi8KLQlpZiAoIXRlc3RfYml0KFNUQVRVU19SRUFEWSwgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgIXRlc3RfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgIXRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm4gLUVJTzsKLQotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfc3luYyhwcml2LCAmY21kKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcGt0ID0gKHN0cnVjdCBpd2xfcnhfcGFja2V0ICopY21kLnJlcGx5X3BhZ2U7Ci0JaWYgKHBrdC0+dS5zdGF0dXMgIT0gQ0FOX0FCT1JUX1NUQVRVUykgewotCQkvKiBUaGUgc2NhbiBhYm9ydCB3aWxsIHJldHVybiAxIGZvciBzdWNjZXNzIG9yCi0JCSAqIDIgZm9yICJmYWlsdXJlIi4gIEEgZmFpbHVyZSBjb25kaXRpb24gY2FuIGJlCi0JCSAqIGR1ZSB0byBzaW1wbHkgbm90IGJlaW5nIGluIGFuIGFjdGl2ZSBzY2FuIHdoaWNoCi0JCSAqIGNhbiBvY2N1ciBpZiB3ZSBzZW5kIHRoZSBzY2FuIGFib3J0IGJlZm9yZSB3ZQotCQkgKiB0aGUgbWljcm9jb2RlIGhhcyBub3RpZmllZCB1cyB0aGF0IGEgc2NhbiBpcwotCQkgKiBjb21wbGV0ZWQuICovCi0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTQ0FOX0FCT1JUIHJldCAlZC5cbiIsIHBrdC0+dS5zdGF0dXMpOwotCQlyZXQgPSAtRUlPOwotCX0KLQotCWl3bF9sZWdhY3lfZnJlZV9wYWdlcyhwcml2LCBjbWQucmVwbHlfcGFnZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9jb21wbGV0ZV9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBhYm9ydGVkKQotewotCS8qIGNoZWNrIGlmIHNjYW4gd2FzIHJlcXVlc3RlZCBmcm9tIG1hYzgwMjExICovCi0JaWYgKHByaXYtPnNjYW5fcmVxdWVzdCkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiQ29tcGxldGUgc2NhbiBpbiBtYWM4MDIxMVxuIik7Ci0JCWllZWU4MDIxMV9zY2FuX2NvbXBsZXRlZChwcml2LT5odywgYWJvcnRlZCk7Ci0JfQotCi0JcHJpdi0+c2Nhbl92aWYgPSBOVUxMOwotCXByaXYtPnNjYW5fcmVxdWVzdCA9IE5VTEw7Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9mb3JjZV9zY2FuX2VuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCF0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJGb3JjaW5nIHNjYW4gZW5kIHdoaWxlIG5vdCBzY2FubmluZ1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlJV0xfREVCVUdfU0NBTihwcml2LCAiRm9yY2luZyBzY2FuIGVuZFxuIik7Ci0JY2xlYXJfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cyk7Ci0JY2xlYXJfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQljbGVhcl9iaXQoU1RBVFVTX1NDQU5fQUJPUlRJTkcsICZwcml2LT5zdGF0dXMpOwotCWl3bF9sZWdhY3lfY29tcGxldGVfc2Nhbihwcml2LCB0cnVlKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9kb19zY2FuX2Fib3J0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKCF0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJOb3QgcGVyZm9ybWluZyBzY2FuIHRvIGFib3J0XG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmICh0ZXN0X2FuZF9zZXRfYml0KFNUQVRVU19TQ0FOX0FCT1JUSU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiBhYm9ydCBpbiBwcm9ncmVzc1xuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfc2Nhbl9hYm9ydChwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTZW5kIHNjYW4gYWJvcnQgZmFpbGVkICVkXG4iLCByZXQpOwotCQlpd2xfbGVnYWN5X2ZvcmNlX3NjYW5fZW5kKHByaXYpOwotCX0gZWxzZQotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU3VjY2Vzc2Z1bGx5IHNlbmQgc2NhbiBhYm9ydFxuIik7Ci19Ci0KLS8qKgotICogaXdsX3NjYW5fY2FuY2VsIC0gQ2FuY2VsIGFueSBjdXJyZW50bHkgZXhlY3V0aW5nIEhXIHNjYW4KLSAqLwotaW50IGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWwoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJRdWV1aW5nIGFib3J0IHNjYW5cbiIpOwotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+YWJvcnRfc2Nhbik7Ci0JcmV0dXJuIDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWwpOwotCi0vKioKLSAqIGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dCAtIENhbmNlbCBhbnkgY3VycmVudGx5IGV4ZWN1dGluZyBIVyBzY2FuCi0gKiBAbXM6IGFtb3VudCBvZiB0aW1lIHRvIHdhaXQgKGluIG1pbGxpc2Vjb25kcykgZm9yIHNjYW4gdG8gYWJvcnQKLSAqCi0gKi8KLWludCBpd2xfbGVnYWN5X3NjYW5fY2FuY2VsX3RpbWVvdXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1bnNpZ25lZCBsb25nIG1zKQotewotCXVuc2lnbmVkIGxvbmcgdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKG1zKTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FuIGNhbmNlbCB0aW1lb3V0XG4iKTsKLQotCWl3bF9sZWdhY3lfZG9fc2Nhbl9hYm9ydChwcml2KTsKLQotCXdoaWxlICh0aW1lX2JlZm9yZV9lcShqaWZmaWVzLCB0aW1lb3V0KSkgewotCQlpZiAoIXRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKSkKLQkJCWJyZWFrOwotCQltc2xlZXAoMjApOwotCX0KLQotCXJldHVybiB0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnN0YXR1cyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dCk7Ci0KLS8qIFNlcnZpY2UgcmVzcG9uc2UgdG8gUkVQTFlfU0NBTl9DTUQgKDB4ODApICovCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X3J4X3JlcGx5X3NjYW4oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9zY2FucmVxX25vdGlmaWNhdGlvbiAqbm90aWYgPQotCSAgICAoc3RydWN0IGl3bF9zY2FucmVxX25vdGlmaWNhdGlvbiAqKXBrdC0+dS5yYXc7Ci0KLQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiByZXF1ZXN0IHN0YXR1cyA9IDB4JXhcbiIsIG5vdGlmLT5zdGF0dXMpOwotI2VuZGlmCi19Ci0KLS8qIFNlcnZpY2UgU0NBTl9TVEFSVF9OT1RJRklDQVRJT04gKDB4ODIpICovCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X3J4X3NjYW5fc3RhcnRfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX3NjYW5zdGFydF9ub3RpZmljYXRpb24gKm5vdGlmID0KLQkgICAgKHN0cnVjdCBpd2xfc2NhbnN0YXJ0X25vdGlmaWNhdGlvbiAqKXBrdC0+dS5yYXc7Ci0JcHJpdi0+c2Nhbl9zdGFydF90c2YgPSBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2xvdyk7Ci0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gc3RhcnQ6ICIKLQkJICAgICAgICIlZCBbODAyLjExJXNdICIKLQkJICAgICAgICIoVFNGOiAweCUwOFg6JTA4WCkgLSAlZCAoYmVhY29uIHRpbWVyICV1KVxuIiwKLQkJICAgICAgIG5vdGlmLT5jaGFubmVsLAotCQkgICAgICAgbm90aWYtPmJhbmQgPyAiYmciIDogImEiLAotCQkgICAgICAgbGUzMl90b19jcHUobm90aWYtPnRzZl9oaWdoKSwKLQkJICAgICAgIGxlMzJfdG9fY3B1KG5vdGlmLT50c2ZfbG93KSwKLQkJICAgICAgIG5vdGlmLT5zdGF0dXMsIG5vdGlmLT5iZWFjb25fdGltZXIpOwotfQotCi0vKiBTZXJ2aWNlIFNDQU5fUkVTVUxUU19OT1RJRklDQVRJT04gKDB4ODMpICovCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X3J4X3NjYW5fcmVzdWx0c19ub3RpZihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0Jc3RydWN0IGl3bF9zY2FucmVzdWx0c19ub3RpZmljYXRpb24gKm5vdGlmID0KLQkgICAgKHN0cnVjdCBpd2xfc2NhbnJlc3VsdHNfbm90aWZpY2F0aW9uICopcGt0LT51LnJhdzsKLQotCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FuIGNoLnJlczogIgotCQkgICAgICAgIiVkIFs4MDIuMTElc10gIgotCQkgICAgICAgIihUU0Y6IDB4JTA4WDolMDhYKSAtICVkICIKLQkJICAgICAgICJlbGFwc2VkPSVsdSB1c2VjXG4iLAotCQkgICAgICAgbm90aWYtPmNoYW5uZWwsCi0JCSAgICAgICBub3RpZi0+YmFuZCA/ICJiZyIgOiAiYSIsCi0JCSAgICAgICBsZTMyX3RvX2NwdShub3RpZi0+dHNmX2hpZ2gpLAotCQkgICAgICAgbGUzMl90b19jcHUobm90aWYtPnRzZl9sb3cpLAotCQkgICAgICAgbGUzMl90b19jcHUobm90aWYtPnN0YXRpc3RpY3NbMF0pLAotCQkgICAgICAgbGUzMl90b19jcHUobm90aWYtPnRzZl9sb3cpIC0gcHJpdi0+c2Nhbl9zdGFydF90c2YpOwotI2VuZGlmCi19Ci0KLS8qIFNlcnZpY2UgU0NBTl9DT01QTEVURV9OT1RJRklDQVRJT04gKDB4ODQpICovCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X3J4X3NjYW5fY29tcGxldGVfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfc2NhbmNvbXBsZXRlX25vdGlmaWNhdGlvbiAqc2Nhbl9ub3RpZiA9ICh2b2lkICopcGt0LT51LnJhdzsKLSNlbmRpZgotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwKLQkJCSJTY2FuIGNvbXBsZXRlOiAlZCBjaGFubmVscyAoVFNGIDB4JTA4WDolMDhYKSAtICVkXG4iLAotCQkgICAgICAgc2Nhbl9ub3RpZi0+c2Nhbm5lZF9jaGFubmVscywKLQkJICAgICAgIHNjYW5fbm90aWYtPnRzZl9sb3csCi0JCSAgICAgICBzY2FuX25vdGlmLT50c2ZfaGlnaCwgc2Nhbl9ub3RpZi0+c3RhdHVzKTsKLQotCS8qIFRoZSBIVyBpcyBubyBsb25nZXIgc2Nhbm5pbmcgKi8KLQljbGVhcl9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zdGF0dXMpOwotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gb24gJXNHSHogdG9vayAlZG1zXG4iLAotCQkgICAgICAgKHByaXYtPnNjYW5fYmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKSA/ICIyLjQiIDogIjUuMiIsCi0JCSAgICAgICBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBwcml2LT5zY2FuX3N0YXJ0KSk7Ci0KLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnNjYW5fY29tcGxldGVkKTsKLX0KLQotdm9pZCBpd2xfbGVnYWN5X3NldHVwX3J4X3NjYW5faGFuZGxlcnMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIHNjYW4gaGFuZGxlcnMgKi8KLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9TQ0FOX0NNRF0gPSBpd2xfbGVnYWN5X3J4X3JlcGx5X3NjYW47Ci0JcHJpdi0+cnhfaGFuZGxlcnNbU0NBTl9TVEFSVF9OT1RJRklDQVRJT05dID0KLQkJCQkJaXdsX2xlZ2FjeV9yeF9zY2FuX3N0YXJ0X25vdGlmOwotCXByaXYtPnJ4X2hhbmRsZXJzW1NDQU5fUkVTVUxUU19OT1RJRklDQVRJT05dID0KLQkJCQkJaXdsX2xlZ2FjeV9yeF9zY2FuX3Jlc3VsdHNfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbU0NBTl9DT01QTEVURV9OT1RJRklDQVRJT05dID0KLQkJCQkJaXdsX2xlZ2FjeV9yeF9zY2FuX2NvbXBsZXRlX25vdGlmOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NldHVwX3J4X3NjYW5faGFuZGxlcnMpOwotCi1pbmxpbmUgdTE2IGl3bF9sZWdhY3lfZ2V0X2FjdGl2ZV9kd2VsbF90aW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkgICAgIHU4IG5fcHJvYmVzKQotewotCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCXJldHVybiBJV0xfQUNUSVZFX0RXRUxMX1RJTUVfNTIgKwotCQkJSVdMX0FDVElWRV9EV0VMTF9GQUNUT1JfNTJHSFogKiAobl9wcm9iZXMgKyAxKTsKLQllbHNlCi0JCXJldHVybiBJV0xfQUNUSVZFX0RXRUxMX1RJTUVfMjQgKwotCQkJSVdMX0FDVElWRV9EV0VMTF9GQUNUT1JfMjRHSFogKiAobl9wcm9iZXMgKyAxKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9nZXRfYWN0aXZlX2R3ZWxsX3RpbWUpOwotCi11MTYgaXdsX2xlZ2FjeV9nZXRfcGFzc2l2ZV9kd2VsbF90aW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCXUxNiBwYXNzaXZlID0gKGJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikgPwotCSAgICBJV0xfUEFTU0lWRV9EV0VMTF9CQVNFICsgSVdMX1BBU1NJVkVfRFdFTExfVElNRV8yNCA6Ci0JICAgIElXTF9QQVNTSVZFX0RXRUxMX0JBU0UgKyBJV0xfUEFTU0lWRV9EV0VMTF9USU1FXzUyOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfYW55X2Fzc29jaWF0ZWQocHJpdikpIHsKLQkJLyoKLQkJICogSWYgd2UncmUgYXNzb2NpYXRlZCwgd2UgY2xhbXAgdGhlIG1heGltdW0gcGFzc2l2ZQotCQkgKiBkd2VsbCB0aW1lIHRvIGJlIDk4JSBvZiB0aGUgc21hbGxlc3QgYmVhY29uIGludGVydmFsCi0JCSAqIChtaW51cyAyICogY2hhbm5lbCB0dW5lIHRpbWUpCi0JCSAqLwotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQkJdTE2IHZhbHVlOwotCi0JCQlpZiAoIWl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKLQkJCQljb250aW51ZTsKLQkJCXZhbHVlID0gY3R4LT52aWYgPyBjdHgtPnZpZi0+YnNzX2NvbmYuYmVhY29uX2ludCA6IDA7Ci0JCQlpZiAoKHZhbHVlID4gSVdMX1BBU1NJVkVfRFdFTExfQkFTRSkgfHwgIXZhbHVlKQotCQkJCXZhbHVlID0gSVdMX1BBU1NJVkVfRFdFTExfQkFTRTsKLQkJCXZhbHVlID0gKHZhbHVlICogOTgpIC8gMTAwIC0gSVdMX0NIQU5ORUxfVFVORV9USU1FICogMjsKLQkJCXBhc3NpdmUgPSBtaW4odmFsdWUsIHBhc3NpdmUpOwotCQl9Ci0JfQotCi0JcmV0dXJuIHBhc3NpdmU7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZSk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV9pbml0X3NjYW5fcGFyYW1zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1OCBhbnRfaWR4ID0gZmxzKHByaXYtPmh3X3BhcmFtcy52YWxpZF90eF9hbnQpIC0gMTsKLQlpZiAoIXByaXYtPnNjYW5fdHhfYW50W0lFRUU4MDIxMV9CQU5EXzVHSFpdKQotCQlwcml2LT5zY2FuX3R4X2FudFtJRUVFODAyMTFfQkFORF81R0haXSA9IGFudF9pZHg7Ci0JaWYgKCFwcml2LT5zY2FuX3R4X2FudFtJRUVFODAyMTFfQkFORF8yR0haXSkKLQkJcHJpdi0+c2Nhbl90eF9hbnRbSUVFRTgwMjExX0JBTkRfMkdIWl0gPSBhbnRfaWR4OwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2luaXRfc2Nhbl9wYXJhbXMpOwotCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfc2Nhbl9pbml0aWF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0JaW50IHJldDsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPm11dGV4KTsKLQotCWlmIChXQVJOX09OKCFwcml2LT5jZmctPm9wcy0+dXRpbHMtPnJlcXVlc3Rfc2NhbikpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnNjYW5fY2hlY2spOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX3JlYWR5X3JmKHByaXYpKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJSZXF1ZXN0IHNjYW4gY2FsbGVkIHdoZW4gZHJpdmVyIG5vdCByZWFkeS5cbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsCi0JCQkiTXVsdGlwbGUgY29uY3VycmVudCBzY2FuIHJlcXVlc3RzIGluIHBhcmFsbGVsLlxuIik7Ci0JCXJldHVybiAtRUJVU1k7Ci0JfQotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOX0FCT1JUSU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiByZXF1ZXN0IHdoaWxlIGFib3J0IHBlbmRpbmcuXG4iKTsKLQkJcmV0dXJuIC1FQlVTWTsKLQl9Ci0KLQlJV0xfREVCVUdfU0NBTihwcml2LCAiU3RhcnRpbmcgc2Nhbi4uLlxuIik7Ci0KLQlzZXRfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cyk7Ci0JcHJpdi0+c2Nhbl9zdGFydCA9IGppZmZpZXM7Ci0KLQlyZXQgPSBwcml2LT5jZmctPm9wcy0+dXRpbHMtPnJlcXVlc3Rfc2Nhbihwcml2LCB2aWYpOwotCWlmIChyZXQpIHsKLQkJY2xlYXJfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnNjYW5fY2hlY2ssCi0JCQkgICBJV0xfU0NBTl9DSEVDS19XQVRDSERPRyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bF9sZWdhY3lfbWFjX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWlmIChyZXEtPm5fY2hhbm5lbHMgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfU0NBTihwcml2LCAiU2NhbiBhbHJlYWR5IGluIHByb2dyZXNzLlxuIik7Ci0JCXJldCA9IC1FQUdBSU47Ci0JCWdvdG8gb3V0X3VubG9jazsKLQl9Ci0KLQkvKiBtYWM4MDIxMSB3aWxsIG9ubHkgYXNrIGZvciBvbmUgYmFuZCBhdCBhIHRpbWUgKi8KLQlwcml2LT5zY2FuX3JlcXVlc3QgPSByZXE7Ci0JcHJpdi0+c2Nhbl92aWYgPSB2aWY7Ci0JcHJpdi0+c2Nhbl9iYW5kID0gcmVxLT5jaGFubmVsc1swXS0+YmFuZDsKLQotCXJldCA9IGl3bF9sZWdhY3lfc2Nhbl9pbml0aWF0ZShwcml2LCB2aWYpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLW91dF91bmxvY2s6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X21hY19od19zY2FuKTsKLQotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9iZ19zY2FuX2NoZWNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPQotCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGl3bF9wcml2LCBzY2FuX2NoZWNrLndvcmspOwotCi0JSVdMX0RFQlVHX1NDQU4ocHJpdiwgIlNjYW4gY2hlY2sgd29ya1xuIik7Ci0KLQkvKiBTaW5jZSB3ZSBhcmUgaGVyZSBmaXJtd2FyZSBkb2VzIG5vdCBmaW5pc2ggc2NhbiBhbmQKLQkgKiBtb3N0IGxpa2VseSBpcyBpbiBiYWQgc2hhcGUsIHNvIHdlIGRvbid0IGJvdGhlciB0bwotCSAqIHNlbmQgYWJvcnQgY29tbWFuZCwganVzdCBmb3JjZSBzY2FuIGNvbXBsZXRlIHRvIG1hYzgwMjExICovCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bF9sZWdhY3lfZm9yY2Vfc2Nhbl9lbmQocHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9maWxsX3Byb2JlX3JlcSAtIGZpbGwgaW4gYWxsIHJlcXVpcmVkIGZpZWxkcyBhbmQgSUUgZm9yIHByb2JlIHJlcXVlc3QKLSAqLwotCi11MTYKLWl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKmZyYW1lLAotCQkgICAgICAgY29uc3QgdTggKnRhLCBjb25zdCB1OCAqaWVzLCBpbnQgaWVfbGVuLCBpbnQgbGVmdCkKLXsKLQlpbnQgbGVuID0gMDsKLQl1OCAqcG9zID0gTlVMTDsKLQotCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIHRoZSBwcm9iZSByZXF1ZXN0LAotCSAqIHR3byBtYW5kYXRvcnkgSUVzIGFuZCB0aGUgZGF0YSAqLwotCWxlZnQgLT0gMjQ7Ci0JaWYgKGxlZnQgPCAwKQotCQlyZXR1cm4gMDsKLQotCWZyYW1lLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NUWVBFX1BST0JFX1JFUSk7Ci0JbWVtY3B5KGZyYW1lLT5kYSwgaXdsZWdhY3lfYmNhc3RfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweShmcmFtZS0+c2EsIHRhLCBFVEhfQUxFTik7Ci0JbWVtY3B5KGZyYW1lLT5ic3NpZCwgaXdsZWdhY3lfYmNhc3RfYWRkciwgRVRIX0FMRU4pOwotCWZyYW1lLT5zZXFfY3RybCA9IDA7Ci0KLQlsZW4gKz0gMjQ7Ci0KLQkvKiAuLi5uZXh0IElFLi4uICovCi0JcG9zID0gJmZyYW1lLT51LnByb2JlX3JlcS52YXJpYWJsZVswXTsKLQotCS8qIGZpbGwgaW4gb3VyIGluZGlyZWN0IFNTSUQgSUUgKi8KLQlsZWZ0IC09IDI7Ci0JaWYgKGxlZnQgPCAwKQotCQlyZXR1cm4gMDsKLQkqcG9zKysgPSBXTEFOX0VJRF9TU0lEOwotCSpwb3MrKyA9IDA7Ci0KLQlsZW4gKz0gMjsKLQotCWlmIChXQVJOX09OKGxlZnQgPCBpZV9sZW4pKQotCQlyZXR1cm4gbGVuOwotCi0JaWYgKGllcyAmJiBpZV9sZW4pIHsKLQkJbWVtY3B5KHBvcywgaWVzLCBpZV9sZW4pOwotCQlsZW4gKz0gaWVfbGVuOwotCX0KLQotCXJldHVybiAodTE2KWxlbjsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9maWxsX3Byb2JlX3JlcSk7Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfYmdfYWJvcnRfc2NhbihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpd2xfcHJpdiwgYWJvcnRfc2Nhbik7Ci0KLQlJV0xfREVCVUdfU0NBTihwcml2LCAiQWJvcnQgc2NhbiB3b3JrXG4iKTsKLQotCS8qIFdlIGtlZXAgc2Nhbl9jaGVjayB3b3JrIHF1ZXVlZCBpbiBjYXNlIHdoZW4gZmlybXdhcmUgd2lsbCBub3QKLQkgKiByZXBvcnQgYmFjayBzY2FuIGNvbXBsZXRlZCBub3RpZmljYXRpb24gKi8KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDIwMCk7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfYmdfc2Nhbl9jb21wbGV0ZWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaXdsX3ByaXYsIHNjYW5fY29tcGxldGVkKTsKLQlib29sIGFib3J0ZWQ7Ci0KLQlJV0xfREVCVUdfU0NBTihwcml2LCAiQ29tcGxldGVkIHNjYW4uXG4iKTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnNjYW5fY2hlY2spOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JYWJvcnRlZCA9IHRlc3RfYW5kX2NsZWFyX2JpdChTVEFUVVNfU0NBTl9BQk9SVElORywgJnByaXYtPnN0YXR1cyk7Ci0JaWYgKGFib3J0ZWQpCi0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJBYm9ydGVkIHNjYW4gY29tcGxldGVkLlxuIik7Ci0KLQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FuIGFscmVhZHkgY29tcGxldGVkLlxuIik7Ci0JCWdvdG8gb3V0X3NldHRpbmdzOwotCX0KLQotCWl3bF9sZWdhY3lfY29tcGxldGVfc2Nhbihwcml2LCBhYm9ydGVkKTsKLQotb3V0X3NldHRpbmdzOgotCS8qIENhbiB3ZSBzdGlsbCB0YWxrIHRvIGZpcm13YXJlID8gKi8KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpCi0JCWdvdG8gb3V0OwotCi0JLyoKLQkgKiBXZSBkbyBub3QgY29tbWl0IHBvd2VyIHNldHRpbmdzIHdoaWxlIHNjYW4gaXMgcGVuZGluZywKLQkgKiBkbyBpdCBub3cgaWYgdGhlIHNldHRpbmdzIGNoYW5nZWQuCi0JICovCi0JaXdsX2xlZ2FjeV9wb3dlcl9zZXRfbW9kZShwcml2LCAmcHJpdi0+cG93ZXJfZGF0YS5zbGVlcF9jbWRfbmV4dCwgZmFsc2UpOwotCWl3bF9sZWdhY3lfc2V0X3R4X3Bvd2VyKHByaXYsIHByaXYtPnR4X3Bvd2VyX25leHQsIGZhbHNlKTsKLQotCXByaXYtPmNmZy0+b3BzLT51dGlscy0+cG9zdF9zY2FuKHByaXYpOwotCi1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXZvaWQgaXdsX2xlZ2FjeV9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCUlOSVRfV09SSygmcHJpdi0+c2Nhbl9jb21wbGV0ZWQsIGl3bF9sZWdhY3lfYmdfc2Nhbl9jb21wbGV0ZWQpOwotCUlOSVRfV09SSygmcHJpdi0+YWJvcnRfc2NhbiwgaXdsX2xlZ2FjeV9iZ19hYm9ydF9zY2FuKTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+c2Nhbl9jaGVjaywgaXdsX2xlZ2FjeV9iZ19zY2FuX2NoZWNrKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmspOwotCi12b2lkIGl3bF9sZWdhY3lfY2FuY2VsX3NjYW5fZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+YWJvcnRfc2Nhbik7Ci0JY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+c2Nhbl9jb21wbGV0ZWQpOwotCi0JaWYgKGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+c2Nhbl9jaGVjaykpIHsKLQkJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCQlpd2xfbGVnYWN5X2ZvcmNlX3NjYW5fZW5kKHByaXYpOwotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfY2FuY2VsX3NjYW5fZGVmZXJyZWRfd29yayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3BlY3RydW0uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zcGVjdHJ1bS5oCmluZGV4IDlmNzBhNDcuLjg1ZmU0OGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zcGVjdHJ1bS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zcGVjdHJ1bS5oCkBAIC0yNiw4ICsyNiw4IEBACiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZuZGVmIF9faXdsX2xlZ2FjeV9zcGVjdHJ1bV9oX18KLSNkZWZpbmUgX19pd2xfbGVnYWN5X3NwZWN0cnVtX2hfXworI2lmbmRlZiBfX2lsX3NwZWN0cnVtX2hfXworI2RlZmluZSBfX2lsX3NwZWN0cnVtX2hfXwogZW51bSB7CQkJCS8qIGllZWU4MDIxMV9iYXNpY19yZXBvcnQubWFwICovCiAJSUVFRTgwMjExX0JBU0lDX01BUF9CU1MgPSAoMSA8PCAwKSwKIAlJRUVFODAyMTFfQkFTSUNfTUFQX09GRE0gPSAoMSA8PCAxKSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zdGEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEwZGYzZS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtc3RhLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIENvcHlyaWdodChjKSAyMDAzIC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgaXB3Mzk0NSBwcm9qZWN0LCBhcyB3ZWxsCi0gKiBhcyBwb3J0aW9ucyBvZiB0aGUgaWVlZTgwMjExIHN1YnN5c3RlbSBoZWFkZXIgZmlsZXMuCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQKLSAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgotICogbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKLSAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwgVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24gaW4gdGhlCi0gKiBmaWxlIGNhbGxlZCBMSUNFTlNFLgotICoKLSAqIENvbnRhY3QgSW5mb3JtYXRpb246Ci0gKiAgSW50ZWwgTGludXggV2lyZWxlc3MgPGlsd0BsaW51eC5pbnRlbC5jb20+Ci0gKiBJbnRlbCBDb3Jwb3JhdGlvbiwgNTIwMCBOLkUuIEVsYW0gWW91bmcgUGFya3dheSwgSGlsbHNib3JvLCBPUiA5NzEyNC02NDk3Ci0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLQotI2luY2x1ZGUgIml3bC1kZXYuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLQotLyogcHJpdi0+c3RhX2xvY2sgbXVzdCBiZSBoZWxkICovCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X3N0YV91Y29kZV9hY3RpdmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHN0YV9pZCkKLXsKLQotCWlmICghKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkpCi0JCUlXTF9FUlIocHJpdiwKLQkJCSJBQ1RJVkFURSBhIG5vbiBEUklWRVIgYWN0aXZlIHN0YXRpb24gaWQgJXUgYWRkciAlcE1cbiIsCi0JCQlzdGFfaWQsIHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyKTsKLQotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkgewotCQlJV0xfREVCVUdfQVNTT0MocHJpdiwKLQkJCSJTVEEgaWQgJXUgYWRkciAlcE0gYWxyZWFkeSBwcmVzZW50IgotCQkJIiBpbiB1Q29kZSAoYWNjb3JkaW5nIHRvIGRyaXZlcilcbiIsCi0JCQlzdGFfaWQsIHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyKTsKLQl9IGVsc2UgewotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSVdMX1NUQV9VQ09ERV9BQ1RJVkU7Ci0JCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiQWRkZWQgU1RBIGlkICV1IGFkZHIgJXBNIHRvIHVDb2RlXG4iLAotCQkJCXN0YV9pZCwgcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLmFkZHIpOwotCX0KLX0KLQotc3RhdGljIGludCBpd2xfbGVnYWN5X3Byb2Nlc3NfYWRkX3N0YV9yZXNwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCAqYWRkc3RhLAotCQkJCSAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAotCQkJCSAgICBib29sIHN5bmMpCi17Ci0JdTggc3RhX2lkID0gYWRkc3RhLT5zdGEuc3RhX2lkOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJldCA9IC1FSU87Ci0KLQlpZiAocGt0LT5oZHIuZmxhZ3MgJiBJV0xfQ01EX0ZBSUxFRF9NU0spIHsKLQkJSVdMX0VSUihwcml2LCAiQmFkIHJldHVybiBmcm9tIFJFUExZX0FERF9TVEEgKDB4JTA4WClcbiIsCi0JCQlwa3QtPmhkci5mbGFncyk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlByb2Nlc3NpbmcgcmVzcG9uc2UgZm9yIGFkZGluZyBzdGF0aW9uICV1XG4iLAotCQkgICAgICAgc3RhX2lkKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0Jc3dpdGNoIChwa3QtPnUuYWRkX3N0YS5zdGF0dXMpIHsKLQljYXNlIEFERF9TVEFfU1VDQ0VTU19NU0s6Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSRVBMWV9BRERfU1RBIFBBU1NFRFxuIik7Ci0JCWl3bF9sZWdhY3lfc3RhX3Vjb2RlX2FjdGl2YXRlKHByaXYsIHN0YV9pZCk7Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgQUREX1NUQV9OT19ST09NX0lOX1RBQkxFOgotCQlJV0xfRVJSKHByaXYsICJBZGRpbmcgc3RhdGlvbiAlZCBmYWlsZWQsIG5vIHJvb20gaW4gdGFibGUuXG4iLAotCQkJc3RhX2lkKTsKLQkJYnJlYWs7Ci0JY2FzZSBBRERfU1RBX05PX0JMT0NLX0FDS19SRVNPVVJDRToKLQkJSVdMX0VSUihwcml2LAotCQkJIkFkZGluZyBzdGF0aW9uICVkIGZhaWxlZCwgbm8gYmxvY2sgYWNrIHJlc291cmNlLlxuIiwKLQkJCXN0YV9pZCk7Ci0JCWJyZWFrOwotCWNhc2UgQUREX1NUQV9NT0RJRllfTk9OX0VYSVNUX1NUQToKLQkJSVdMX0VSUihwcml2LCAiQXR0ZW1wdGluZyB0byBtb2RpZnkgbm9uLWV4aXN0aW5nIHN0YXRpb24gJWRcbiIsCi0JCQlzdGFfaWQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlY2VpdmVkIFJFUExZX0FERF9TVEE6KDB4JTA4WClcbiIsCi0JCQkJcGt0LT51LmFkZF9zdGEuc3RhdHVzKTsKLQkJYnJlYWs7Ci0JfQotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIiVzIHN0YXRpb24gaWQgJXUgYWRkciAlcE1cbiIsCi0JCSAgICAgICBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID09Ci0JCSAgICAgICBTVEFfQ09OVFJPTF9NT0RJRllfTVNLID8gICJNb2RpZmllZCIgOiAiQWRkZWQiLAotCQkgICAgICAgc3RhX2lkLCBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcik7Ci0KLQkvKgotCSAqIFhYWDogVGhlIE1BQyBhZGRyZXNzIGluIHRoZSBjb21tYW5kIGJ1ZmZlciBpcyBvZnRlbiBjaGFuZ2VkIGZyb20KLQkgKiB0aGUgb3JpZ2luYWwgc2VudCB0byB0aGUgZGV2aWNlLiBUaGF0IGlzLCB0aGUgTUFDIGFkZHJlc3MKLQkgKiB3cml0dGVuIHRvIHRoZSBjb21tYW5kIGJ1ZmZlciBvZnRlbiBpcyBub3QgdGhlIHNhbWUgTUFDIGFkZHJlc3MKLQkgKiByZWFkIGZyb20gdGhlIGNvbW1hbmQgYnVmZmVyIHdoZW4gdGhlIGNvbW1hbmQgcmV0dXJucy4gVGhpcwotCSAqIGlzc3VlIGhhcyBub3QgeWV0IGJlZW4gcmVzb2x2ZWQgYW5kIHRoaXMgZGVidWdnaW5nIGlzIGxlZnQgdG8KLQkgKiBvYnNlcnZlIHRoZSBwcm9ibGVtLgotCSAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICIlcyBzdGF0aW9uIGFjY29yZGluZyB0byBjbWQgYnVmZmVyICVwTVxuIiwKLQkJICAgICAgIHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPT0KLQkJICAgICAgIFNUQV9DT05UUk9MX01PRElGWV9NU0sgPyAiTW9kaWZpZWQiIDogIkFkZGVkIiwKLQkJICAgICAgIGFkZHN0YS0+c3RhLmFkZHIpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2FkZF9zdGFfY2FsbGJhY2soc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCwKLQkJCQkgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCkKLXsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kICphZGRzdGEgPQotCQkoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCAqKWNtZC0+Y21kLnBheWxvYWQ7Ci0KLQlpd2xfbGVnYWN5X3Byb2Nlc3NfYWRkX3N0YV9yZXNwKHByaXYsIGFkZHN0YSwgcGt0LCBmYWxzZSk7Ci0KLX0KLQotaW50IGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJICAgICBzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kICpzdGEsIHU4IGZsYWdzKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSBOVUxMOwotCWludCByZXQgPSAwOwotCXU4IGRhdGFbc2l6ZW9mKCpzdGEpXTsKLQlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKLQkJLmlkID0gUkVQTFlfQUREX1NUQSwKLQkJLmZsYWdzID0gZmxhZ3MsCi0JCS5kYXRhID0gZGF0YSwKLQl9OwotCXU4IHN0YV9pZCBfX21heWJlX3VudXNlZCA9IHN0YS0+c3RhLnN0YV9pZDsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJBZGRpbmcgc3RhICV1ICglcE0pICVzc3luY2hyb25vdXNseVxuIiwKLQkJICAgICAgIHN0YV9pZCwgc3RhLT5zdGEuYWRkciwgZmxhZ3MgJiBDTURfQVNZTkMgPyAgImEiIDogIiIpOwotCi0JaWYgKGZsYWdzICYgQ01EX0FTWU5DKQotCQljbWQuY2FsbGJhY2sgPSBpd2xfbGVnYWN5X2FkZF9zdGFfY2FsbGJhY2s7Ci0JZWxzZSB7Ci0JCWNtZC5mbGFncyB8PSBDTURfV0FOVF9TS0I7Ci0JCW1pZ2h0X3NsZWVwKCk7Ci0JfQotCi0JY21kLmxlbiA9IHByaXYtPmNmZy0+b3BzLT51dGlscy0+YnVpbGRfYWRkc3RhX2hjbWQoc3RhLCBkYXRhKTsKLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kKHByaXYsICZjbWQpOwotCi0JaWYgKHJldCB8fCAoZmxhZ3MgJiBDTURfQVNZTkMpKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKHJldCA9PSAwKSB7Ci0JCXBrdCA9IChzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqKWNtZC5yZXBseV9wYWdlOwotCQlyZXQgPSBpd2xfbGVnYWN5X3Byb2Nlc3NfYWRkX3N0YV9yZXNwKHByaXYsIHN0YSwgcGt0LCB0cnVlKTsKLQl9Ci0JaXdsX2xlZ2FjeV9mcmVlX3BhZ2VzKHByaXYsIGNtZC5yZXBseV9wYWdlKTsKLQotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKTsKLQotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9zZXRfaHRfYWRkX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBpbmRleCwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpzdGFfaHRfaW5mID0gJnN0YS0+aHRfY2FwOwotCV9fbGUzMiBzdGFfZmxhZ3M7Ci0JdTggbWltb19wc19tb2RlOwotCi0JaWYgKCFzdGEgfHwgIXN0YV9odF9pbmYtPmh0X3N1cHBvcnRlZCkKLQkJZ290byBkb25lOwotCi0JbWltb19wc19tb2RlID0gKHN0YV9odF9pbmYtPmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU01fUFMpID4+IDI7Ci0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJzcGF0aWFsIG11bHRpcGxleGluZyBwb3dlciBzYXZlIG1vZGU6ICVzXG4iLAotCQkJKG1pbW9fcHNfbW9kZSA9PSBXTEFOX0hUX0NBUF9TTV9QU19TVEFUSUMpID8KLQkJCSJzdGF0aWMiIDoKLQkJCShtaW1vX3BzX21vZGUgPT0gV0xBTl9IVF9DQVBfU01fUFNfRFlOQU1JQykgPwotCQkJImR5bmFtaWMiIDogImRpc2FibGVkIik7Ci0KLQlzdGFfZmxhZ3MgPSBwcml2LT5zdGF0aW9uc1tpbmRleF0uc3RhLnN0YXRpb25fZmxhZ3M7Ci0KLQlzdGFfZmxhZ3MgJj0gfihTVEFfRkxHX1JUU19NSU1PX1BST1RfTVNLIHwgU1RBX0ZMR19NSU1PX0RJU19NU0spOwotCi0Jc3dpdGNoIChtaW1vX3BzX21vZGUpIHsKLQljYXNlIFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQzoKLQkJc3RhX2ZsYWdzIHw9IFNUQV9GTEdfTUlNT19ESVNfTVNLOwotCQlicmVhazsKLQljYXNlIFdMQU5fSFRfQ0FQX1NNX1BTX0RZTkFNSUM6Ci0JCXN0YV9mbGFncyB8PSBTVEFfRkxHX1JUU19NSU1PX1BST1RfTVNLOwotCQlicmVhazsKLQljYXNlIFdMQU5fSFRfQ0FQX1NNX1BTX0RJU0FCTEVEOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfV0FSTihwcml2LCAiSW52YWxpZCBNSU1PIFBTIG1vZGUgJWRcbiIsIG1pbW9fcHNfbW9kZSk7Ci0JCWJyZWFrOwotCX0KLQotCXN0YV9mbGFncyB8PSBjcHVfdG9fbGUzMigKLQkgICAgICAodTMyKXN0YV9odF9pbmYtPmFtcGR1X2ZhY3RvciA8PCBTVEFfRkxHX01BWF9BR0dfU0laRV9QT1MpOwotCi0Jc3RhX2ZsYWdzIHw9IGNwdV90b19sZTMyKAotCSAgICAgICh1MzIpc3RhX2h0X2luZi0+YW1wZHVfZGVuc2l0eSA8PCBTVEFfRkxHX0FHR19NUERVX0RFTlNJVFlfUE9TKTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2h0NDBfdHhfYWxsb3dlZChwcml2LCBjdHgsICZzdGEtPmh0X2NhcCkpCi0JCXN0YV9mbGFncyB8PSBTVEFfRkxHX0hUNDBfRU5fTVNLOwotCWVsc2UKLQkJc3RhX2ZsYWdzICY9IH5TVEFfRkxHX0hUNDBfRU5fTVNLOwotCi0JcHJpdi0+c3RhdGlvbnNbaW5kZXhdLnN0YS5zdGF0aW9uX2ZsYWdzID0gc3RhX2ZsYWdzOwotIGRvbmU6Ci0JcmV0dXJuOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfcHJlcF9zdGF0aW9uIC0gUHJlcGFyZSBzdGF0aW9uIGluZm9ybWF0aW9uIGZvciBhZGRpdGlvbgotICoKLSAqIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBzdGFfbG9jayBoZWxkCi0gKi8KLXU4IGl3bF9sZWdhY3lfcHJlcF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJICAgIGNvbnN0IHU4ICphZGRyLCBib29sIGlzX2FwLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfc3RhdGlvbl9lbnRyeSAqc3RhdGlvbjsKLQlpbnQgaTsKLQl1OCBzdGFfaWQgPSBJV0xfSU5WQUxJRF9TVEFUSU9OOwotCXUxNiByYXRlOwotCi0JaWYgKGlzX2FwKQotCQlzdGFfaWQgPSBjdHgtPmFwX3N0YV9pZDsKLQllbHNlIGlmIChpc19icm9hZGNhc3RfZXRoZXJfYWRkcihhZGRyKSkKLQkJc3RhX2lkID0gY3R4LT5iY2FzdF9zdGFfaWQ7Ci0JZWxzZQotCQlmb3IgKGkgPSBJV0xfU1RBX0lEOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCQlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcihwcml2LT5zdGF0aW9uc1tpXS5zdGEuc3RhLmFkZHIsCi0JCQkJCQlhZGRyKSkgewotCQkJCXN0YV9pZCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCWlmICghcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmJgotCQkJICAgIHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQotCQkJCXN0YV9pZCA9IGk7Ci0JCX0KLQotCS8qCi0JICogVGhlc2UgdHdvIGNvbmRpdGlvbnMgaGF2ZSB0aGUgc2FtZSBvdXRjb21lLCBidXQga2VlcCB0aGVtCi0JICogc2VwYXJhdGUKLQkgKi8KLQlpZiAodW5saWtlbHkoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pKQotCQlyZXR1cm4gc3RhX2lkOwotCi0JLyoKLQkgKiB1Q29kZSBpcyBub3QgYWJsZSB0byBkZWFsIHdpdGggbXVsdGlwbGUgcmVxdWVzdHMgdG8gYWRkIGEKLQkgKiBzdGF0aW9uLiBLZWVwIHRyYWNrIGlmIG9uZSBpcyBpbiBwcm9ncmVzcyBzbyB0aGF0IHdlIGRvIG5vdCBzZW5kCi0JICogYW5vdGhlci4KLQkgKi8KLQlpZiAocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJIlNUQSAlZCBhbHJlYWR5IGluIHByb2Nlc3Mgb2YgYmVpbmcgYWRkZWQuXG4iLAotCQkJCXN0YV9pZCk7Ci0JCXJldHVybiBzdGFfaWQ7Ci0JfQotCi0JaWYgKChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCi0JICAgIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkgJiYKLQkgICAgIWNvbXBhcmVfZXRoZXJfYWRkcihwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkciwgYWRkcikpIHsKLQkJSVdMX0RFQlVHX0FTU09DKHByaXYsCi0JCQkJIlNUQSAlZCAoJXBNKSBhbHJlYWR5IGFkZGVkLCBub3QgYWRkaW5nIGFnYWluLlxuIiwKLQkJCQlzdGFfaWQsIGFkZHIpOwotCQlyZXR1cm4gc3RhX2lkOwotCX0KLQotCXN0YXRpb24gPSAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXTsKLQlzdGF0aW9uLT51c2VkID0gSVdMX1NUQV9EUklWRVJfQUNUSVZFOwotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiQWRkIFNUQSB0byBkcml2ZXIgSUQgJWQ6ICVwTVxuIiwKLQkJCXN0YV9pZCwgYWRkcik7Ci0JcHJpdi0+bnVtX3N0YXRpb25zKys7Ci0KLQkvKiBTZXQgdXAgdGhlIFJFUExZX0FERF9TVEEgY29tbWFuZCB0byBzZW5kIHRvIGRldmljZSAqLwotCW1lbXNldCgmc3RhdGlvbi0+c3RhLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOwotCW1lbWNweShzdGF0aW9uLT5zdGEuc3RhLmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKLQlzdGF0aW9uLT5zdGEubW9kZSA9IDA7Ci0Jc3RhdGlvbi0+c3RhLnN0YS5zdGFfaWQgPSBzdGFfaWQ7Ci0Jc3RhdGlvbi0+c3RhLnN0YXRpb25fZmxhZ3MgPSBjdHgtPnN0YXRpb25fZmxhZ3M7Ci0Jc3RhdGlvbi0+Y3R4aWQgPSBjdHgtPmN0eGlkOwotCi0JaWYgKHN0YSkgewotCQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdl9jb21tb24gKnN0YV9wcml2OwotCi0JCXN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OwotCQlzdGFfcHJpdi0+Y3R4ID0gY3R4OwotCX0KLQotCS8qCi0JICogT0sgdG8gY2FsbCB1bmNvbmRpdGlvbmFsbHksIHNpbmNlIGxvY2FsIHN0YXRpb25zIChJQlNTIEJTU0lECi0JICogU1RBIGFuZCBicm9hZGNhc3QgU1RBKSBwYXNzIGluIGEgTlVMTCBzdGEsIGFuZCBtYWM4MDIxMQotCSAqIGRvZXNuJ3QgYWxsb3cgSFQgSUJTUy4KLQkgKi8KLQlpd2xfbGVnYWN5X3NldF9odF9hZGRfc3RhdGlvbihwcml2LCBzdGFfaWQsIHN0YSwgY3R4KTsKLQotCS8qIDM5NDUgb25seSAqLwotCXJhdGUgPSAocHJpdi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKSA/Ci0JCUlXTF9SQVRFXzZNX1BMQ1AgOiBJV0xfUkFURV8xTV9QTENQOwotCS8qIFR1cm4gb24gYm90aCBhbnRlbm5hcyBmb3IgdGhlIHN0YXRpb24uLi4gKi8KLQlzdGF0aW9uLT5zdGEucmF0ZV9uX2ZsYWdzID0gY3B1X3RvX2xlMTYocmF0ZSB8IFJBVEVfTUNTX0FOVF9BQl9NU0spOwotCi0JcmV0dXJuIHN0YV9pZDsKLQotfQotRVhQT1JUX1NZTUJPTF9HUEwoaXdsX2xlZ2FjeV9wcmVwX3N0YXRpb24pOwotCi0jZGVmaW5lIFNUQV9XQUlUX1RJTUVPVVQgKEhaLzIpCi0KLS8qKgotICogaXdsX2xlZ2FjeV9hZGRfc3RhdGlvbl9jb21tb24gLQotICovCi1pbnQKLWl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQkgICBjb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4ICpzdGFfaWRfcikKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47Ci0JaW50IHJldCA9IDA7Ci0JdTggc3RhX2lkOwotCXN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgc3RhX2NtZDsKLQotCSpzdGFfaWRfciA9IDA7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3ByZXBfc3RhdGlvbihwcml2LCBjdHgsIGFkZHIsIGlzX2FwLCBzdGEpOwotCWlmIChzdGFfaWQgPT0gSVdMX0lOVkFMSURfU1RBVElPTikgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gcHJlcGFyZSBzdGF0aW9uICVwTSBmb3IgYWRkaXRpb25cbiIsCi0JCQlhZGRyKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQkvKgotCSAqIHVDb2RlIGlzIG5vdCBhYmxlIHRvIGRlYWwgd2l0aCBtdWx0aXBsZSByZXF1ZXN0cyB0byBhZGQgYQotCSAqIHN0YXRpb24uIEtlZXAgdHJhY2sgaWYgb25lIGlzIGluIHByb2dyZXNzIHNvIHRoYXQgd2UgZG8gbm90IHNlbmQKLQkgKiBhbm90aGVyLgotCSAqLwotCWlmIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0lOUFJPR1JFU1MpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCSJTVEEgJWQgYWxyZWFkeSBpbiBwcm9jZXNzIG9mIGJlaW5nIGFkZGVkLlxuIiwKLQkJICAgICAgIHN0YV9pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQkJcmV0dXJuIC1FRVhJU1Q7Ci0JfQotCi0JaWYgKChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCi0JICAgIChwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJiBJV0xfU1RBX1VDT0RFX0FDVElWRSkpIHsKLQkJSVdMX0RFQlVHX0FTU09DKHByaXYsCi0JCQkiU1RBICVkICglcE0pIGFscmVhZHkgYWRkZWQsIG5vdCBhZGRpbmcgYWdhaW4uXG4iLAotCQkJc3RhX2lkLCBhZGRyKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCQlyZXR1cm4gLUVFWElTVDsKLQl9Ci0KLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTOwotCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLAotCQkJCXNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCi0JLyogQWRkIHN0YXRpb24gdG8gZGV2aWNlJ3Mgc3RhdGlvbiB0YWJsZSAqLwotCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci0JaWYgKHJldCkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCQlJV0xfRVJSKHByaXYsICJBZGRpbmcgc3RhdGlvbiAlcE0gZmFpbGVkLlxuIiwKLQkJCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyKTsKLQkJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICY9IH5JV0xfU1RBX0RSSVZFUl9BQ1RJVkU7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JfQotCSpzdGFfaWRfciA9IHN0YV9pZDsKLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2FkZF9zdGF0aW9uX2NvbW1vbik7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9zdGFfdWNvZGVfZGVhY3RpdmF0ZSAtIGRlYWN0aXZhdGUgdWNvZGUgc3RhdHVzIGZvciBhIHN0YXRpb24KLSAqCi0gKiBwcml2LT5zdGFfbG9jayBtdXN0IGJlIGhlbGQKLSAqLwotc3RhdGljIHZvaWQgaXdsX2xlZ2FjeV9zdGFfdWNvZGVfZGVhY3RpdmF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHN0YV9pZCkKLXsKLQkvKiBVY29kZSBtdXN0IGJlIGFjdGl2ZSBhbmQgZHJpdmVyIG11c3QgYmUgbm9uIGFjdGl2ZSAqLwotCWlmICgocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYKLQkgICAgIChJV0xfU1RBX1VDT0RFX0FDVElWRSB8IElXTF9TVEFfRFJJVkVSX0FDVElWRSkpICE9Ci0JCQkJCQlJV0xfU1RBX1VDT0RFX0FDVElWRSkKLQkJSVdMX0VSUihwcml2LCAicmVtb3ZlZCBub24gYWN0aXZlIFNUQSAldVxuIiwgc3RhX2lkKTsKLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9BQ1RJVkU7Ci0KLQltZW1zZXQoJnByaXYtPnN0YXRpb25zW3N0YV9pZF0sIDAsIHNpemVvZihzdHJ1Y3QgaXdsX3N0YXRpb25fZW50cnkpKTsKLQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlbW92ZWQgU1RBICV1XG4iLCBzdGFfaWQpOwotfQotCi1zdGF0aWMgaW50IGl3bF9sZWdhY3lfc2VuZF9yZW1vdmVfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgY29uc3QgdTggKmFkZHIsIGludCBzdGFfaWQsCi0JCQkJICAgYm9vbCB0ZW1wb3JhcnkpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdDsKLQlpbnQgcmV0OwotCi0JdW5zaWduZWQgbG9uZyBmbGFnc19zcGluOwotCXN0cnVjdCBpd2xfcmVtX3N0YV9jbWQgcm1fc3RhX2NtZDsKLQotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9SRU1PVkVfU1RBLAotCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpd2xfcmVtX3N0YV9jbWQpLAotCQkuZmxhZ3MgPSBDTURfU1lOQywKLQkJLmRhdGEgPSAmcm1fc3RhX2NtZCwKLQl9OwotCi0JbWVtc2V0KCZybV9zdGFfY21kLCAwLCBzaXplb2Yocm1fc3RhX2NtZCkpOwotCXJtX3N0YV9jbWQubnVtX3N0YSA9IDE7Ci0JbWVtY3B5KCZybV9zdGFfY21kLmFkZHIsIGFkZHIsIEVUSF9BTEVOKTsKLQotCWNtZC5mbGFncyB8PSBDTURfV0FOVF9TS0I7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kKHByaXYsICZjbWQpOwotCi0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXBrdCA9IChzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqKWNtZC5yZXBseV9wYWdlOwotCWlmIChwa3QtPmhkci5mbGFncyAmIElXTF9DTURfRkFJTEVEX01TSykgewotCQlJV0xfRVJSKHByaXYsICJCYWQgcmV0dXJuIGZyb20gUkVQTFlfUkVNT1ZFX1NUQSAoMHglMDhYKVxuIiwKLQkJCSAgcGt0LT5oZHIuZmxhZ3MpOwotCQlyZXQgPSAtRUlPOwotCX0KLQotCWlmICghcmV0KSB7Ci0JCXN3aXRjaCAocGt0LT51LnJlbV9zdGEuc3RhdHVzKSB7Ci0JCWNhc2UgUkVNX1NUQV9TVUNDRVNTX01TSzoKLQkJCWlmICghdGVtcG9yYXJ5KSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQkJCQlpd2xfbGVnYWN5X3N0YV91Y29kZV9kZWFjdGl2YXRlKHByaXYsIHN0YV9pZCk7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssCi0JCQkJCQkJCWZsYWdzX3NwaW4pOwotCQkJfQotCQkJSVdMX0RFQlVHX0FTU09DKHByaXYsICJSRVBMWV9SRU1PVkVfU1RBIFBBU1NFRFxuIik7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCXJldCA9IC1FSU87Ci0JCQlJV0xfRVJSKHByaXYsICJSRVBMWV9SRU1PVkVfU1RBIGZhaWxlZFxuIik7Ci0JCQlicmVhazsKLQkJfQotCX0KLQlpd2xfbGVnYWN5X2ZyZWVfcGFnZXMocHJpdiwgY21kLnJlcGx5X3BhZ2UpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X3JlbW92ZV9zdGF0aW9uIC0gUmVtb3ZlIGRyaXZlcidzIGtub3dsZWRnZSBvZiBzdGF0aW9uLgotICovCi1pbnQgaXdsX2xlZ2FjeV9yZW1vdmVfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNvbnN0IHU4IHN0YV9pZCwKLQkJICAgICAgIGNvbnN0IHU4ICphZGRyKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHkocHJpdikpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCSJVbmFibGUgdG8gcmVtb3ZlIHN0YXRpb24gJXBNLCBkZXZpY2Ugbm90IHJlYWR5LlxuIiwKLQkJCWFkZHIpOwotCQkvKgotCQkgKiBJdCBpcyB0eXBpY2FsIGZvciBzdGF0aW9ucyB0byBiZSByZW1vdmVkIHdoZW4gd2UgYXJlCi0JCSAqIGdvaW5nIGRvd24uIFJldHVybiBzdWNjZXNzIHNpbmNlIGRldmljZSB3aWxsIGJlIGRvd24KLQkJICogc29vbiBhbnl3YXkKLQkJICovCi0JCXJldHVybiAwOwotCX0KLQotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiUmVtb3ZpbmcgU1RBIGZyb20gZHJpdmVyOiVkICAlcE1cbiIsCi0JCQlzdGFfaWQsIGFkZHIpOwotCi0JaWYgKFdBUk5fT04oc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JaWYgKCEocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS51c2VkICYgSVdMX1NUQV9EUklWRVJfQUNUSVZFKSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUmVtb3ZpbmcgJXBNIGJ1dCBub24gRFJJVkVSIGFjdGl2ZVxuIiwKLQkJCQlhZGRyKTsKLQkJZ290byBvdXRfZXJyOwotCX0KLQotCWlmICghKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfVUNPREVfQUNUSVZFKSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUmVtb3ZpbmcgJXBNIGJ1dCBub24gVUNPREUgYWN0aXZlXG4iLAotCQkJCWFkZHIpOwotCQlnb3RvIG91dF9lcnI7Ci0JfQotCi0JaWYgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfTE9DQUwpIHsKLQkJa2ZyZWUocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSk7Ci0JCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ubHEgPSBOVUxMOwotCX0KLQotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SVdMX1NUQV9EUklWRVJfQUNUSVZFOwotCi0JcHJpdi0+bnVtX3N0YXRpb25zLS07Ci0KLQlCVUdfT04ocHJpdi0+bnVtX3N0YXRpb25zIDwgMCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9yZW1vdmVfc3RhdGlvbihwcml2LCBhZGRyLCBzdGFfaWQsIGZhbHNlKTsKLW91dF9lcnI6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGl3bF9sZWdhY3lfcmVtb3ZlX3N0YXRpb24pOwotCi0vKioKLSAqIGl3bF9sZWdhY3lfY2xlYXJfdWNvZGVfc3RhdGlvbnMgLSBjbGVhciB1Y29kZSBzdGF0aW9uIHRhYmxlIGJpdHMKLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNsZWFycyBhbGwgdGhlIGJpdHMgaW4gdGhlIGRyaXZlciBpbmRpY2F0aW5nCi0gKiB3aGljaCBzdGF0aW9ucyBhcmUgYWN0aXZlIGluIHRoZSB1Y29kZS4gQ2FsbCB3aGVuIHNvbWV0aGluZwotICogb3RoZXIgdGhhbiBleHBsaWNpdCBzdGF0aW9uIG1hbmFnZW1lbnQgd291bGQgY2F1c2UgdGhpcyBpbgotICogdGhlIHVjb2RlLCBlLmcuIHVuYXNzb2NpYXRlZCBSWE9OLgotICovCi12b2lkIGl3bF9sZWdhY3lfY2xlYXJfdWNvZGVfc3RhdGlvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlpbnQgaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzX3NwaW47Ci0JYm9vbCBjbGVhcmVkID0gZmFsc2U7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQ2xlYXJpbmcgdWNvZGUgc3RhdGlvbnMgaW4gZHJpdmVyXG4iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JZm9yIChpID0gMDsgaSA8IHByaXYtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgewotCQlpZiAoY3R4ICYmIGN0eC0+Y3R4aWQgIT0gcHJpdi0+c3RhdGlvbnNbaV0uY3R4aWQpCi0JCQljb250aW51ZTsKLQotCQlpZiAocHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmIElXTF9TVEFfVUNPREVfQUNUSVZFKSB7Ci0JCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJDbGVhcmluZyB1Y29kZSBhY3RpdmUgZm9yIHN0YXRpb24gJWRcbiIsIGkpOwotCQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmPSB+SVdMX1NUQV9VQ09ERV9BQ1RJVkU7Ci0JCQljbGVhcmVkID0gdHJ1ZTsKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0KLQlpZiAoIWNsZWFyZWQpCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkiTm8gYWN0aXZlIHN0YXRpb25zIGZvdW5kIHRvIGJlIGNsZWFyZWRcbiIpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zKTsKLQotLyoqCi0gKiBpd2xfbGVnYWN5X3Jlc3RvcmVfc3RhdGlvbnMoKSAtIFJlc3RvcmUgZHJpdmVyIGtub3duIHN0YXRpb25zIHRvIGRldmljZQotICoKLSAqIEFsbCBzdGF0aW9ucyBjb25zaWRlcmVkIGFjdGl2ZSBieSBkcml2ZXIsIGJ1dCBub3QgcHJlc2VudCBpbiB1Y29kZSwgaXMKLSAqIHJlc3RvcmVkLgotICoKLSAqIEZ1bmN0aW9uIHNsZWVwcy4KLSAqLwotdm9pZAotaXdsX2xlZ2FjeV9yZXN0b3JlX3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCkKLXsKLQlzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kIHN0YV9jbWQ7Ci0Jc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kIGxxOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3Nfc3BpbjsKLQlpbnQgaTsKLQlib29sIGZvdW5kID0gZmFsc2U7Ci0JaW50IHJldDsKLQlib29sIHNlbmRfbHE7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHkocHJpdikpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCSJOb3QgcmVhZHkgeWV0LCBub3QgcmVzdG9yaW5nIGFueSBzdGF0aW9ucy5cbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JSVdMX0RFQlVHX0FTU09DKHByaXYsICJSZXN0b3JpbmcgYWxsIGtub3duIHN0YXRpb25zIC4uLiBzdGFydC5cbiIpOwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JZm9yIChpID0gMDsgaSA8IHByaXYtPmh3X3BhcmFtcy5tYXhfc3RhdGlvbnM7IGkrKykgewotCQlpZiAoY3R4LT5jdHhpZCAhPSBwcml2LT5zdGF0aW9uc1tpXS5jdHhpZCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKHByaXYtPnN0YXRpb25zW2ldLnVzZWQgJiBJV0xfU1RBX0RSSVZFUl9BQ1RJVkUpICYmCi0JCQkgICAgIShwcml2LT5zdGF0aW9uc1tpXS51c2VkICYgSVdMX1NUQV9VQ09ERV9BQ1RJVkUpKSB7Ci0JCQlJV0xfREVCVUdfQVNTT0MocHJpdiwgIlJlc3RvcmluZyBzdGEgJXBNXG4iLAotCQkJCQlwcml2LT5zdGF0aW9uc1tpXS5zdGEuc3RhLmFkZHIpOwotCQkJcHJpdi0+c3RhdGlvbnNbaV0uc3RhLm1vZGUgPSAwOwotCQkJcHJpdi0+c3RhdGlvbnNbaV0udXNlZCB8PSBJV0xfU1RBX1VDT0RFX0lOUFJPR1JFU1M7Ci0JCQlmb3VuZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCWlmICgocHJpdi0+c3RhdGlvbnNbaV0udXNlZCAmIElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUykpIHsKLQkJCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW2ldLnN0YSwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9sZWdhY3lfYWRkc3RhX2NtZCkpOwotCQkJc2VuZF9scSA9IGZhbHNlOwotCQkJaWYgKHByaXYtPnN0YXRpb25zW2ldLmxxKSB7Ci0JCQkJbWVtY3B5KCZscSwgcHJpdi0+c3RhdGlvbnNbaV0ubHEsCi0JCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQpKTsKLQkJCQlzZW5kX2xxID0gdHJ1ZTsKLQkJCX0KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQkJCXJldCA9IGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci0JCQlpZiAocmV0KSB7Ci0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQkJCQlJV0xfRVJSKHByaXYsICJBZGRpbmcgc3RhdGlvbiAlcE0gZmFpbGVkLlxuIiwKLQkJCQkJcHJpdi0+c3RhdGlvbnNbaV0uc3RhLnN0YS5hZGRyKTsKLQkJCQlwcml2LT5zdGF0aW9uc1tpXS51c2VkICY9Ci0JCQkJCQl+SVdMX1NUQV9EUklWRVJfQUNUSVZFOwotCQkJCXByaXYtPnN0YXRpb25zW2ldLnVzZWQgJj0KLQkJCQkJCX5JV0xfU1RBX1VDT0RFX0lOUFJPR1JFU1M7Ci0JCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssCi0JCQkJCQkJCWZsYWdzX3NwaW4pOwotCQkJfQotCQkJLyoKLQkJCSAqIFJhdGUgc2NhbGluZyBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLCBzZW5kCi0JCQkgKiBjdXJyZW50IExRIGNvbW1hbmQKLQkJCSAqLwotCQkJaWYgKHNlbmRfbHEpCi0JCQkJaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChwcml2LCBjdHgsICZscSwKLQkJCQkJCQkJQ01EX1NZTkMsIHRydWUpOwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQkJCXByaXYtPnN0YXRpb25zW2ldLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQlpZiAoIWZvdW5kKQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUmVzdG9yaW5nIGFsbCBrbm93biBzdGF0aW9ucyIKLQkJCQkiIC4uLi4gbm8gc3RhdGlvbnMgdG8gYmUgcmVzdG9yZWQuXG4iKTsKLQllbHNlCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSZXN0b3JpbmcgYWxsIGtub3duIHN0YXRpb25zIgotCQkJCSIgLi4uLiBjb21wbGV0ZS5cbiIpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3Jlc3RvcmVfc3RhdGlvbnMpOwotCi1pbnQgaXdsX2xlZ2FjeV9nZXRfZnJlZV91Y29kZV9rZXlfaW5kZXgoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IHByaXYtPnN0YV9rZXlfbWF4X251bTsgaSsrKQotCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaSwgJnByaXYtPnVjb2RlX2tleV90YWJsZSkpCi0JCQlyZXR1cm4gaTsKLQotCXJldHVybiBXRVBfSU5WQUxJRF9PRkZTRVQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfZ2V0X2ZyZWVfdWNvZGVfa2V5X2luZGV4KTsKLQotdm9pZCBpd2xfbGVnYWN5X2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+aHdfcGFyYW1zLm1heF9zdGF0aW9uczsgaSsrKSB7Ci0JCWlmICghKHByaXYtPnN0YXRpb25zW2ldLnVzZWQgJiBJV0xfU1RBX0JDQVNUKSkKLQkJCWNvbnRpbnVlOwotCi0JCXByaXYtPnN0YXRpb25zW2ldLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfQUNUSVZFOwotCQlwcml2LT5udW1fc3RhdGlvbnMtLTsKLQkJQlVHX09OKHByaXYtPm51bV9zdGF0aW9ucyA8IDApOwotCQlrZnJlZShwcml2LT5zdGF0aW9uc1tpXS5scSk7Ci0JCXByaXYtPnN0YXRpb25zW2ldLmxxID0gTlVMTDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKGl3bF9sZWdhY3lfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyk7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLXN0YXRpYyB2b2lkIGl3bF9sZWdhY3lfZHVtcF9scV9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgc3RydWN0IGl3bF9saW5rX3F1YWxpdHlfY21kICpscSkKLXsKLQlpbnQgaTsKLQlJV0xfREVCVUdfUkFURShwcml2LCAibHEgc3RhdGlvbiBpZCAweCV4XG4iLCBscS0+c3RhX2lkKTsKLQlJV0xfREVCVUdfUkFURShwcml2LCAibHEgYW50IDB4JVggMHglWFxuIiwKLQkJICAgICAgIGxxLT5nZW5lcmFsX3BhcmFtcy5zaW5nbGVfc3RyZWFtX2FudF9tc2ssCi0JCSAgICAgICBscS0+Z2VuZXJhbF9wYXJhbXMuZHVhbF9zdHJlYW1fYW50X21zayk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTElOS19RVUFMX01BWF9SRVRSWV9OVU07IGkrKykKLQkJSVdMX0RFQlVHX1JBVEUocHJpdiwgImxxIGluZGV4ICVkIDB4JVhcbiIsCi0JCQkgICAgICAgaSwgbHEtPnJzX3RhYmxlW2ldLnJhdGVfbl9mbGFncyk7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIGl3bF9sZWdhY3lfZHVtcF9scV9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHEpCi17Ci19Ci0jZW5kaWYKLQotLyoqCi0gKiBpd2xfbGVnYWN5X2lzX2xxX3RhYmxlX3ZhbGlkKCkgLSBUZXN0IG9uZSBhc3BlY3Qgb2YgTFEgY21kIGZvciB2YWxpZGl0eQotICoKLSAqIEl0IHNvbWV0aW1lcyBoYXBwZW5zIHdoZW4gYSBIVCByYXRlIGhhcyBiZWVuIGluIHVzZSBhbmQgd2UKLSAqIGxvb3NlIGNvbm5lY3Rpdml0eSB3aXRoIEFQIHRoZW4gbWFjODAyMTEgd2lsbCBmaXJzdCB0ZWxsIHVzIHRoYXQgdGhlCi0gKiBjdXJyZW50IGNoYW5uZWwgaXMgbm90IEhUIGFueW1vcmUgYmVmb3JlIHJlbW92aW5nIHRoZSBzdGF0aW9uLiBJbiBzdWNoIGEKLSAqIHNjZW5hcmlvIHRoZSBSWE9OIGZsYWdzIHdpbGwgYmUgdXBkYXRlZCB0byBpbmRpY2F0ZSB3ZSBhcmUgbm90Ci0gKiBjb21tdW5pY2F0aW5nIEhUIGFueW1vcmUsIGJ1dCB0aGUgTFEgY29tbWFuZCBtYXkgc3RpbGwgY29udGFpbiBIVCByYXRlcy4KLSAqIFRlc3QgZm9yIHRoaXMgdG8gcHJldmVudCBkcml2ZXIgZnJvbSBzZW5kaW5nIExRIGNvbW1hbmQgYmV0d2VlbiB0aGUgdGltZQotICogUlhPTiBmbGFncyBhcmUgdXBkYXRlZCBhbmQgd2hlbiBMUSBjb21tYW5kIGlzIHVwZGF0ZWQuCi0gKi8KLXN0YXRpYyBib29sIGl3bF9sZWdhY3lfaXNfbHFfdGFibGVfdmFsaWQoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCSAgICAgIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbHEpCi17Ci0JaW50IGk7Ci0KLQlpZiAoY3R4LT5odC5lbmFibGVkKQotCQlyZXR1cm4gdHJ1ZTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJDaGFubmVsICV1IGlzIG5vdCBhbiBIVCBjaGFubmVsXG4iLAotCQkgICAgICAgY3R4LT5hY3RpdmUuY2hhbm5lbCk7Ci0JZm9yIChpID0gMDsgaSA8IExJTktfUVVBTF9NQVhfUkVUUllfTlVNOyBpKyspIHsKLQkJaWYgKGxlMzJfdG9fY3B1KGxxLT5yc190YWJsZVtpXS5yYXRlX25fZmxhZ3MpICYKLQkJCQkJCVJBVEVfTUNTX0hUX01TSykgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkgICAgICAgImluZGV4ICVkIG9mIExRIGV4cGVjdHMgSFQgY2hhbm5lbFxuIiwKLQkJCQkgICAgICAgaSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZCgpIC0gU2VuZCBsaW5rIHF1YWxpdHkgY29tbWFuZAotICogQGluaXQ6IFRoaXMgY29tbWFuZCBpcyBzZW50IGFzIHBhcnQgb2Ygc3RhdGlvbiBpbml0aWFsaXphdGlvbiByaWdodAotICogICAgICAgIGFmdGVyIHN0YXRpb24gaGFzIGJlZW4gYWRkZWQuCi0gKgotICogVGhlIGxpbmsgcXVhbGl0eSBjb21tYW5kIGlzIHNlbnQgYXMgdGhlIGxhc3Qgc3RlcCBvZiBzdGF0aW9uIGNyZWF0aW9uLgotICogVGhpcyBpcyB0aGUgc3BlY2lhbCBjYXNlIGluIHdoaWNoIGluaXQgaXMgc2V0IGFuZCB3ZSBjYWxsIGEgY2FsbGJhY2sgaW4KLSAqIHRoaXMgY2FzZSB0byBjbGVhciB0aGUgc3RhdGUgaW5kaWNhdGluZyB0aGF0IHN0YXRpb24gY3JlYXRpb24gaXMgaW4KLSAqIHByb2dyZXNzLgotICovCi1pbnQgaXdsX2xlZ2FjeV9zZW5kX2xxX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCSAgICBzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxxLCB1OCBmbGFncywgYm9vbCBpbml0KQotewotCWludCByZXQgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3Nfc3BpbjsKLQotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01ELAotCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCksCi0JCS5mbGFncyA9IGZsYWdzLAotCQkuZGF0YSA9IGxxLAotCX07Ci0KLQlpZiAoV0FSTl9PTihscS0+c3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFnc19zcGluKTsKLQlpZiAoIShwcml2LT5zdGF0aW9uc1tscS0+c3RhX2lkXS51c2VkICYgSVdMX1NUQV9EUklWRVJfQUNUSVZFKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0KLQlpd2xfbGVnYWN5X2R1bXBfbHFfY21kKHByaXYsIGxxKTsKLQlCVUdfT04oaW5pdCAmJiAoY21kLmZsYWdzICYgQ01EX0FTWU5DKSk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19scV90YWJsZV92YWxpZChwcml2LCBjdHgsIGxxKSkKLQkJcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZChwcml2LCAmY21kKTsKLQllbHNlCi0JCXJldCA9IC1FSU5WQUw7Ci0KLQlpZiAoY21kLmZsYWdzICYgQ01EX0FTWU5DKQotCQlyZXR1cm4gcmV0OwotCi0JaWYgKGluaXQpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgImluaXQgTFEgY29tbWFuZCBjb21wbGV0ZSwiCi0JCQkJIiBjbGVhcmluZyBzdGEgYWRkaXRpb24gc3RhdHVzIGZvciBzdGEgJWRcbiIsCi0JCQkgICAgICAgbHEtPnN0YV9pZCk7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3Nfc3Bpbik7Ci0JCXByaXYtPnN0YXRpb25zW2xxLT5zdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfVUNPREVfSU5QUk9HUkVTUzsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzX3NwaW4pOwotCX0KLQlyZXR1cm4gcmV0OwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3NlbmRfbHFfY21kKTsKLQotaW50IGl3bF9sZWdhY3lfbWFjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdl9jb21tb24gKnN0YV9jb21tb24gPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7Ci0JaW50IHJldDsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJyZWNlaXZlZCByZXF1ZXN0IHRvIHJlbW92ZSBzdGF0aW9uICVwTVxuIiwKLQkJCXN0YS0+YWRkcik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJwcm9jZWVkaW5nIHRvIHJlbW92ZSBzdGF0aW9uICVwTVxuIiwKLQkJCXN0YS0+YWRkcik7Ci0JcmV0ID0gaXdsX2xlZ2FjeV9yZW1vdmVfc3RhdGlvbihwcml2LCBzdGFfY29tbW9uLT5zdGFfaWQsIHN0YS0+YWRkcik7Ci0JaWYgKHJldCkKLQkJSVdMX0VSUihwcml2LCAiRXJyb3IgcmVtb3Zpbmcgc3RhdGlvbiAlcE1cbiIsCi0JCQlzdGEtPmFkZHIpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfbWFjX3N0YV9yZW1vdmUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXN0YS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXN0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2JkNzVmLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bC1zdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIF9faXdsX2xlZ2FjeV9zdGFfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9zdGFfaF9fCi0KLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0KLSNkZWZpbmUgSFdfS0VZX0RZTkFNSUMgMAotI2RlZmluZSBIV19LRVlfREVGQVVMVCAxCi0KLSNkZWZpbmUgSVdMX1NUQV9EUklWRVJfQUNUSVZFIEJJVCgwKSAvKiBkcml2ZXIgZW50cnkgaXMgYWN0aXZlICovCi0jZGVmaW5lIElXTF9TVEFfVUNPREVfQUNUSVZFICBCSVQoMSkgLyogdWNvZGUgZW50cnkgaXMgYWN0aXZlICovCi0jZGVmaW5lIElXTF9TVEFfVUNPREVfSU5QUk9HUkVTUyAgQklUKDIpIC8qIHVjb2RlIGVudHJ5IGlzIGluIHByb2Nlc3Mgb2YKLQkJCQkJICAgIGJlaW5nIGFjdGl2YXRlZCAqLwotI2RlZmluZSBJV0xfU1RBX0xPQ0FMIEJJVCgzKSAvKiBzdGF0aW9uIHN0YXRlIG5vdCBkaXJlY3RlZCBieSBtYWM4MDIxMTsKLQkJCQkodGhpcyBpcyBmb3IgdGhlIElCU1MgQlNTSUQgc3RhdGlvbnMpICovCi0jZGVmaW5lIElXTF9TVEFfQkNBU1QgQklUKDQpIC8qIHRoaXMgc3RhdGlvbiBpcyB0aGUgc3BlY2lhbCBiY2FzdCBzdGF0aW9uICovCi0KLQotdm9pZCBpd2xfbGVnYWN5X3Jlc3RvcmVfc3RhdGlvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotdm9pZCBpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwotdm9pZCBpd2xfbGVnYWN5X2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xfbGVnYWN5X2dldF9mcmVlX3Vjb2RlX2tleV9pbmRleChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgKnN0YSwgdTggZmxhZ3MpOwotaW50IGl3bF9sZWdhY3lfYWRkX3N0YXRpb25fY29tbW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQljb25zdCB1OCAqYWRkciwgYm9vbCBpc19hcCwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4ICpzdGFfaWRfcik7Ci1pbnQgaXdsX2xlZ2FjeV9yZW1vdmVfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQljb25zdCB1OCBzdGFfaWQsCi0JCQljb25zdCB1OCAqYWRkcik7Ci1pbnQgaXdsX2xlZ2FjeV9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKLQotdTggaXdsX2xlZ2FjeV9wcmVwX3N0YXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKLQkJCWNvbnN0IHU4ICphZGRyLCBib29sIGlzX2FwLAotCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7Ci0KLWludCBpd2xfbGVnYWN5X3NlbmRfbHFfY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgsCi0JCQlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgKmxxLAotCQkJdTggZmxhZ3MsIGJvb2wgaW5pdCk7Ci0KLS8qKgotICogaXdsX2xlZ2FjeV9jbGVhcl9kcml2ZXJfc3RhdGlvbnMgLSBjbGVhciBrbm93bGVkZ2Ugb2YgYWxsIHN0YXRpb25zIGZyb20gZHJpdmVyCi0gKiBAcHJpdjogaXdsIHByaXYgc3RydWN0Ci0gKgotICogVGhpcyBpcyBjYWxsZWQgZHVyaW5nIGl3bF9kb3duKCkgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhlIGNhc2UKLSAqIHdlJ3JlIGNvbWluZyB0aGVyZSBmcm9tIGEgaGFyZHdhcmUgcmVzdGFydCBtYWM4MDIxMSB3aWxsIGJlCi0gKiBhYmxlIHRvIHJlY29uZmlndXJlIHN0YXRpb25zIC0tIGlmIHdlJ3JlIGdldHRpbmcgdGhlcmUgaW4gdGhlCi0gKiBub3JtYWwgZG93biBmbG93IHRoZW4gdGhlIHN0YXRpb25zIHdpbGwgYWxyZWFkeSBiZSBjbGVhcmVkLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgaXdsX2xlZ2FjeV9jbGVhcl9kcml2ZXJfc3RhdGlvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCW1lbXNldChwcml2LT5zdGF0aW9ucywgMCwgc2l6ZW9mKHByaXYtPnN0YXRpb25zKSk7Ci0JcHJpdi0+bnVtX3N0YXRpb25zID0gMDsKLQotCXByaXYtPnVjb2RlX2tleV90YWJsZSA9IDA7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQkvKgotCQkgKiBSZW1vdmUgYWxsIGtleSBpbmZvcm1hdGlvbiB0aGF0IGlzIG5vdCBzdG9yZWQgYXMgcGFydAotCQkgKiBvZiBzdGF0aW9uIGluZm9ybWF0aW9uIHNpbmNlIG1hYzgwMjExIG1heSBub3QgaGF2ZSBoYWQKLQkJICogYSBjaGFuY2UgdG8gcmVtb3ZlIGFsbCB0aGUga2V5cy4gV2hlbiBkZXZpY2UgaXMKLQkJICogcmVjb25maWd1cmVkIGJ5IG1hYzgwMjExIGFmdGVyIGFuIGVycm9yIGFsbCBrZXlzIHdpbGwKLQkJICogYmUgcmVjb25maWd1cmVkLgotCQkgKi8KLQkJbWVtc2V0KGN0eC0+d2VwX2tleXMsIDAsIHNpemVvZihjdHgtPndlcF9rZXlzKSk7Ci0JCWN0eC0+a2V5X21hcHBpbmdfa2V5cyA9IDA7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgaXdsX2xlZ2FjeV9zdGFfaWQoc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlpZiAoV0FSTl9PTighc3RhKSkKLQkJcmV0dXJuIElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQlyZXR1cm4gKChzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdl9jb21tb24gKilzdGEtPmRydl9wcml2KS0+c3RhX2lkOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfc3RhX2lkX29yX2Jyb2FkY2FzdCAtIHJldHVybiBzdGFfaWQgb3IgYnJvYWRjYXN0IHN0YQotICogQHByaXY6IGl3bCBwcml2Ci0gKiBAY29udGV4dDogdGhlIGN1cnJlbnQgY29udGV4dAotICogQHN0YTogbWFjODAyMTEgc3RhdGlvbgotICoKLSAqIEluIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcyBtYWM4MDIxMSBwYXNzZXMgYSBzdGF0aW9uIHBvaW50ZXIKLSAqIHRoYXQgbWF5IGJlICVOVUxMLCBmb3IgZXhhbXBsZSBkdXJpbmcgVFggb3Iga2V5IHNldHVwLiBJbgotICogdGhhdCBjYXNlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgYnJvYWRjYXN0IHN0YXRpb24sIHNvIHRoaXMKLSAqIGlubGluZSB3cmFwcyB0aGF0IHBhdHRlcm4uCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGl3bF9sZWdhY3lfc3RhX2lkX29yX2Jyb2FkY2FzdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmNvbnRleHQsCi0JCQkJCSAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKLXsKLQlpbnQgc3RhX2lkOwotCi0JaWYgKCFzdGEpCi0JCXJldHVybiBjb250ZXh0LT5iY2FzdF9zdGFfaWQ7Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZChzdGEpOwotCi0JLyoKLQkgKiBtYWM4MDIxMSBzaG91bGQgbm90IGJlIHBhc3NpbmcgYSBwYXJ0aWFsbHkKLQkgKiBpbml0aWFsaXNlZCBzdGF0aW9uIQotCSAqLwotCVdBUk5fT04oc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pOwotCi0JcmV0dXJuIHN0YV9pZDsKLX0KLSNlbmRpZiAvKiBfX2l3bF9sZWdhY3lfc3RhX2hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXR4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtdHguYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkZmIxYS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtdHguYworKysgL2Rldi9udWxsCkBAIC0xLDY1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgotI2luY2x1ZGUgPG5ldC9tYWM4MDIxMS5oPgotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWhlbHBlcnMuaCIKLQotLyoqCi0gKiBpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyIC0gU2VuZCBuZXcgd3JpdGUgaW5kZXggdG8gaGFyZHdhcmUKLSAqLwotdm9pZAotaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKLXsKLQl1MzIgcmVnID0gMDsKLQlpbnQgdHhxX2lkID0gdHhxLT5xLmlkOwotCi0JaWYgKHR4cS0+bmVlZF91cGRhdGUgPT0gMCkKLQkJcmV0dXJuOwotCi0JLyogaWYgd2UncmUgdHJ5aW5nIHRvIHNhdmUgcG93ZXIgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1BPV0VSX1BNSSwgJnByaXYtPnN0YXR1cykpIHsKLQkJLyogd2FrZSB1cCBuaWMgaWYgaXQncyBwb3dlcmVkIGRvd24gLi4uCi0JCSAqIHVDb2RlIHdpbGwgd2FrZSB1cCwgYW5kIGludGVycnVwdCB1cyBhZ2Fpbiwgc28gbmV4dAotCQkgKiB0aW1lIHdlJ2xsIHNraXAgdGhpcyBwYXJ0LiAqLwotCQlyZWcgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxKTsKLQotCQlpZiAocmVnICYgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX01BQ19TTEVFUCkgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkJIlR4IHF1ZXVlICVkIHJlcXVlc3Rpbmcgd2FrZXVwLCIKLQkJCQkJIiBHUDEgPSAweCV4XG4iLCB0eHFfaWQsIHJlZyk7Ci0JCQlpd2xfbGVnYWN5X3NldF9iaXQocHJpdiwgQ1NSX0dQX0NOVFJMLAotCQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0FDQ0VTU19SRVEpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfV1JQVFIsCi0JCQkJdHhxLT5xLndyaXRlX3B0ciB8ICh0eHFfaWQgPDwgOCkpOwotCi0JCS8qCi0JCSAqIGVsc2Ugbm90IGluIHBvd2VyLXNhdmUgbW9kZSwKLQkJICogdUNvZGUgd2lsbCBuZXZlciBzbGVlcCB3aGVuIHdlJ3JlCi0JCSAqIHRyeWluZyB0byB0eCAoZHVyaW5nIFJGS0lMTCwgd2UncmUgbm90IHRyeWluZyB0byB0eCkuCi0JCSAqLwotCX0gZWxzZQotCQlpd2xfd3JpdGUzMihwcml2LCBIQlVTX1RBUkdfV1JQVFIsCi0JCQkgICAgdHhxLT5xLndyaXRlX3B0ciB8ICh0eHFfaWQgPDwgOCkpOwotCXR4cS0+bmVlZF91cGRhdGUgPSAwOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKTsKLQotLyoqCi0gKiBpd2xfbGVnYWN5X3R4X3F1ZXVlX3VubWFwIC0gIFVubWFwIGFueSByZW1haW5pbmcgRE1BIG1hcHBpbmdzIGFuZCBmcmVlIHNrYidzCi0gKi8KLXZvaWQgaXdsX2xlZ2FjeV90eF9xdWV1ZV91bm1hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCi0JaWYgKHEtPm5fYmQgPT0gMCkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKHEtPndyaXRlX3B0ciAhPSBxLT5yZWFkX3B0cikgewotCQlwcml2LT5jZmctPm9wcy0+bGliLT50eHFfZnJlZV90ZmQocHJpdiwgdHhxKTsKLQkJcS0+cmVhZF9wdHIgPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfdHhfcXVldWVfdW5tYXApOwotCi0vKioKLSAqIGl3bF9sZWdhY3lfdHhfcXVldWVfZnJlZSAtIERlYWxsb2NhdGUgRE1BIHF1ZXVlLgotICogQHR4cTogVHJhbnNtaXQgcXVldWUgdG8gZGVhbGxvY2F0ZS4KLSAqCi0gKiBFbXB0eSBxdWV1ZSBieSByZW1vdmluZyBhbmQgZGVzdHJveWluZyBhbGwgQkQncy4KLSAqIEZyZWUgYWxsIGJ1ZmZlcnMuCi0gKiAwLWZpbGwsIGJ1dCBkbyBub3QgZnJlZSAidHhxIiBkZXNjcmlwdG9yIHN0cnVjdHVyZS4KLSAqLwotdm9pZCBpd2xfbGVnYWN5X3R4X3F1ZXVlX2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgdHhxX2lkKQotewotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbdHhxX2lkXTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+cGNpX2Rldi0+ZGV2OwotCWludCBpOwotCi0JaXdsX2xlZ2FjeV90eF9xdWV1ZV91bm1hcChwcml2LCB0eHFfaWQpOwotCi0JLyogRGUtYWxsb2MgYXJyYXkgb2YgY29tbWFuZC90eCBidWZmZXJzICovCi0JZm9yIChpID0gMDsgaSA8IFRGRF9UWF9DTURfU0xPVFM7IGkrKykKLQkJa2ZyZWUodHhxLT5jbWRbaV0pOwotCi0JLyogRGUtYWxsb2MgY2lyY3VsYXIgYnVmZmVyIG9mIFRGRHMgKi8KLQlpZiAodHhxLT5xLm5fYmQpCi0JCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgcHJpdi0+aHdfcGFyYW1zLnRmZF9zaXplICoKLQkJCQkgIHR4cS0+cS5uX2JkLCB0eHEtPnRmZHMsIHR4cS0+cS5kbWFfYWRkcik7Ci0KLQkvKiBEZS1hbGxvYyBhcnJheSBvZiBwZXItVEZEIGRyaXZlciBkYXRhICovCi0Ja2ZyZWUodHhxLT50eGIpOwotCXR4cS0+dHhiID0gTlVMTDsKLQotCS8qIGRlYWxsb2NhdGUgYXJyYXlzICovCi0Ja2ZyZWUodHhxLT5jbWQpOwotCWtmcmVlKHR4cS0+bWV0YSk7Ci0JdHhxLT5jbWQgPSBOVUxMOwotCXR4cS0+bWV0YSA9IE5VTEw7Ci0KLQkvKiAwLWZpbGwgcXVldWUgZGVzY3JpcHRvciBzdHJ1Y3R1cmUgKi8KLQltZW1zZXQodHhxLCAwLCBzaXplb2YoKnR4cSkpOwotfQotRVhQT1JUX1NZTUJPTChpd2xfbGVnYWN5X3R4X3F1ZXVlX2ZyZWUpOwotCi0vKioKLSAqIGl3bF9jbWRfcXVldWVfdW5tYXAgLSBVbm1hcCBhbnkgcmVtYWluaW5nIERNQSBtYXBwaW5ncyBmcm9tIGNvbW1hbmQgcXVldWUKLSAqLwotdm9pZCBpd2xfbGVnYWN5X2NtZF9xdWV1ZV91bm1hcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVtwcml2LT5jbWRfcXVldWVdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCWludCBpOwotCi0JaWYgKHEtPm5fYmQgPT0gMCkKLQkJcmV0dXJuOwotCi0Jd2hpbGUgKHEtPnJlYWRfcHRyICE9IHEtPndyaXRlX3B0cikgewotCQlpID0gaXdsX2xlZ2FjeV9nZXRfY21kX2luZGV4KHEsIHEtPnJlYWRfcHRyLCAwKTsKLQotCQlpZiAodHhxLT5tZXRhW2ldLmZsYWdzICYgQ01EX01BUFBFRCkgewotCQkJcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LAotCQkJCQkgZG1hX3VubWFwX2FkZHIoJnR4cS0+bWV0YVtpXSwgbWFwcGluZyksCi0JCQkJCSBkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaV0sIGxlbiksCi0JCQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCQkJdHhxLT5tZXRhW2ldLmZsYWdzID0gMDsKLQkJfQotCi0JCXEtPnJlYWRfcHRyID0gaXdsX2xlZ2FjeV9xdWV1ZV9pbmNfd3JhcChxLT5yZWFkX3B0ciwgcS0+bl9iZCk7Ci0JfQotCi0JaSA9IHEtPm5fd2luZG93OwotCWlmICh0eHEtPm1ldGFbaV0uZmxhZ3MgJiBDTURfTUFQUEVEKSB7Ci0JCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwKLQkJCQkgZG1hX3VubWFwX2FkZHIoJnR4cS0+bWV0YVtpXSwgbWFwcGluZyksCi0JCQkJIGRtYV91bm1hcF9sZW4oJnR4cS0+bWV0YVtpXSwgbGVuKSwKLQkJCQkgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQkJdHhxLT5tZXRhW2ldLmZsYWdzID0gMDsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfY21kX3F1ZXVlX3VubWFwKTsKLQotLyoqCi0gKiBpd2xfbGVnYWN5X2NtZF9xdWV1ZV9mcmVlIC0gRGVhbGxvY2F0ZSBETUEgcXVldWUuCi0gKiBAdHhxOiBUcmFuc21pdCBxdWV1ZSB0byBkZWFsbG9jYXRlLgotICoKLSAqIEVtcHR5IHF1ZXVlIGJ5IHJlbW92aW5nIGFuZCBkZXN0cm95aW5nIGFsbCBCRCdzLgotICogRnJlZSBhbGwgYnVmZmVycy4KLSAqIDAtZmlsbCwgYnV0IGRvIG5vdCBmcmVlICJ0eHEiIGRlc2NyaXB0b3Igc3RydWN0dXJlLgotICovCi12b2lkIGl3bF9sZWdhY3lfY21kX3F1ZXVlX2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSA9ICZwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXTsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+cGNpX2Rldi0+ZGV2OwotCWludCBpOwotCi0JaXdsX2xlZ2FjeV9jbWRfcXVldWVfdW5tYXAocHJpdik7Ci0KLQkvKiBEZS1hbGxvYyBhcnJheSBvZiBjb21tYW5kL3R4IGJ1ZmZlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDw9IFRGRF9DTURfU0xPVFM7IGkrKykKLQkJa2ZyZWUodHhxLT5jbWRbaV0pOwotCi0JLyogRGUtYWxsb2MgY2lyY3VsYXIgYnVmZmVyIG9mIFRGRHMgKi8KLQlpZiAodHhxLT5xLm5fYmQpCi0JCWRtYV9mcmVlX2NvaGVyZW50KGRldiwgcHJpdi0+aHdfcGFyYW1zLnRmZF9zaXplICogdHhxLT5xLm5fYmQsCi0JCQkJICB0eHEtPnRmZHMsIHR4cS0+cS5kbWFfYWRkcik7Ci0KLQkvKiBkZWFsbG9jYXRlIGFycmF5cyAqLwotCWtmcmVlKHR4cS0+Y21kKTsKLQlrZnJlZSh0eHEtPm1ldGEpOwotCXR4cS0+Y21kID0gTlVMTDsKLQl0eHEtPm1ldGEgPSBOVUxMOwotCi0JLyogMC1maWxsIHF1ZXVlIGRlc2NyaXB0b3Igc3RydWN0dXJlICovCi0JbWVtc2V0KHR4cSwgMCwgc2l6ZW9mKCp0eHEpKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV9jbWRfcXVldWVfZnJlZSk7Ci0KLS8qKioqKioqKioqKioqKiogRE1BLVFVRVVFLUdFTkVSQUwtRlVOQ1RJT05TICAqKioqKgotICogRE1BIHNlcnZpY2VzCi0gKgotICogVGhlb3J5IG9mIG9wZXJhdGlvbgotICoKLSAqIEEgVHggb3IgUnggcXVldWUgcmVzaWRlcyBpbiBob3N0IERSQU0sIGFuZCBpcyBjb21wcmlzZWQgb2YgYSBjaXJjdWxhciBidWZmZXIKLSAqIG9mIGJ1ZmZlciBkZXNjcmlwdG9ycywgZWFjaCBvZiB3aGljaCBwb2ludHMgdG8gb25lIG9yIG1vcmUgZGF0YSBidWZmZXJzIGZvcgotICogdGhlIGRldmljZSB0byByZWFkIGZyb20gb3IgZmlsbC4gIERyaXZlciBhbmQgZGV2aWNlIGV4Y2hhbmdlIHN0YXR1cyBvZiBlYWNoCi0gKiBxdWV1ZSB2aWEgInJlYWQiIGFuZCAid3JpdGUiIHBvaW50ZXJzLiAgRHJpdmVyIGtlZXBzIG1pbmltdW0gb2YgMiBlbXB0eQotICogZW50cmllcyBpbiBlYWNoIGNpcmN1bGFyIGJ1ZmZlciwgdG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmZ1c2luZyBlbXB0eSBhbmQgZnVsbAotICogcXVldWUgc3RhdGVzLgotICoKLSAqIFRoZSBkZXZpY2UgcmVhZHMgb3Igd3JpdGVzIHRoZSBkYXRhIGluIHRoZSBxdWV1ZXMgdmlhIHRoZSBkZXZpY2UncyBzZXZlcmFsCi0gKiBETUEvRklGTyBjaGFubmVscy4gIEVhY2ggcXVldWUgaXMgbWFwcGVkIHRvIGEgc2luZ2xlIERNQSBjaGFubmVsLgotICoKLSAqIEZvciBUeCBxdWV1ZSwgdGhlcmUgYXJlIGxvdyBtYXJrIGFuZCBoaWdoIG1hcmsgbGltaXRzLiBJZiwgYWZ0ZXIgcXVldWluZwotICogdGhlIHBhY2tldCBmb3IgVHgsIGZyZWUgc3BhY2UgYmVjb21lIDwgbG93IG1hcmssIFR4IHF1ZXVlIHN0b3BwZWQuIFdoZW4KLSAqIHJlY2xhaW1pbmcgcGFja2V0cyAob24gJ3R4IGRvbmUgSVJRKSwgaWYgZnJlZSBzcGFjZSBiZWNvbWUgPiBoaWdoIG1hcmssCi0gKiBUeCBxdWV1ZSByZXN1bWVkLgotICoKLSAqIFNlZSBtb3JlIGRldGFpbGVkIGluZm8gaW4gaXdsLTQ5NjUtaHcuaC4KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWludCBpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKGNvbnN0IHN0cnVjdCBpd2xfcXVldWUgKnEpCi17Ci0JaW50IHMgPSBxLT5yZWFkX3B0ciAtIHEtPndyaXRlX3B0cjsKLQotCWlmIChxLT5yZWFkX3B0ciA+IHEtPndyaXRlX3B0cikKLQkJcyAtPSBxLT5uX2JkOwotCi0JaWYgKHMgPD0gMCkKLQkJcyArPSBxLT5uX3dpbmRvdzsKLQkvKiBrZWVwIHNvbWUgcmVzZXJ2ZSB0byBub3QgY29uZnVzZSBlbXB0eSBhbmQgZnVsbCBzaXR1YXRpb25zICovCi0JcyAtPSAyOwotCWlmIChzIDwgMCkKLQkJcyA9IDA7Ci0JcmV0dXJuIHM7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfcXVldWVfc3BhY2UpOwotCi0KLS8qKgotICogaXdsX2xlZ2FjeV9xdWV1ZV9pbml0IC0gSW5pdGlhbGl6ZSBxdWV1ZSdzIGhpZ2gvbG93LXdhdGVyIGFuZCByZWFkL3dyaXRlIGluZGV4ZXMKLSAqLwotc3RhdGljIGludCBpd2xfbGVnYWN5X3F1ZXVlX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3F1ZXVlICpxLAotCQkJICBpbnQgY291bnQsIGludCBzbG90c19udW0sIHUzMiBpZCkKLXsKLQlxLT5uX2JkID0gY291bnQ7Ci0JcS0+bl93aW5kb3cgPSBzbG90c19udW07Ci0JcS0+aWQgPSBpZDsKLQotCS8qIGNvdW50IG11c3QgYmUgcG93ZXItb2YtdHdvIHNpemUsIG90aGVyd2lzZSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwCi0JICogYW5kIGl3bF9sZWdhY3lfcXVldWVfZGVjX3dyYXAgYXJlIGJyb2tlbi4gKi8KLQlCVUdfT04oIWlzX3Bvd2VyX29mXzIoY291bnQpKTsKLQotCS8qIHNsb3RzX251bSBtdXN0IGJlIHBvd2VyLW9mLXR3byBzaXplLCBvdGhlcndpc2UKLQkgKiBpd2xfbGVnYWN5X2dldF9jbWRfaW5kZXggaXMgYnJva2VuLiAqLwotCUJVR19PTighaXNfcG93ZXJfb2ZfMihzbG90c19udW0pKTsKLQotCXEtPmxvd19tYXJrID0gcS0+bl93aW5kb3cgLyA0OwotCWlmIChxLT5sb3dfbWFyayA8IDQpCi0JCXEtPmxvd19tYXJrID0gNDsKLQotCXEtPmhpZ2hfbWFyayA9IHEtPm5fd2luZG93IC8gODsKLQlpZiAocS0+aGlnaF9tYXJrIDwgMikKLQkJcS0+aGlnaF9tYXJrID0gMjsKLQotCXEtPndyaXRlX3B0ciA9IHEtPnJlYWRfcHRyID0gMDsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfdHhfcXVldWVfYWxsb2MgLSBBbGxvYyBkcml2ZXIgZGF0YSBhbmQgVEZEIENCIGZvciBvbmUgVHgvY21kIHF1ZXVlCi0gKi8KLXN0YXRpYyBpbnQgaXdsX2xlZ2FjeV90eF9xdWV1ZV9hbGxvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsIHUzMiBpZCkKLXsKLQlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcHJpdi0+cGNpX2Rldi0+ZGV2OwotCXNpemVfdCB0ZmRfc3ogPSBwcml2LT5od19wYXJhbXMudGZkX3NpemUgKiBURkRfUVVFVUVfU0laRV9NQVg7Ci0KLQkvKiBEcml2ZXIgcHJpdmF0ZSBkYXRhLCBvbmx5IGZvciBUeCAobm90IGNvbW1hbmQpIHF1ZXVlcywKLQkgKiBub3Qgc2hhcmVkIHdpdGggZGV2aWNlLiAqLwotCWlmIChpZCAhPSBwcml2LT5jbWRfcXVldWUpIHsKLQkJdHhxLT50eGIgPSBremFsbG9jKHNpemVvZih0eHEtPnR4YlswXSkgKgotCQkJCSAgIFRGRF9RVUVVRV9TSVpFX01BWCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghdHhxLT50eGIpIHsKLQkJCUlXTF9FUlIocHJpdiwgImttYWxsb2MgZm9yIGF1eGlsaWFyeSBCRCAiCi0JCQkJICAic3RydWN0dXJlcyBmYWlsZWRcbiIpOwotCQkJZ290byBlcnJvcjsKLQkJfQotCX0gZWxzZSB7Ci0JCXR4cS0+dHhiID0gTlVMTDsKLQl9Ci0KLQkvKiBDaXJjdWxhciBidWZmZXIgb2YgdHJhbnNtaXQgZnJhbWUgZGVzY3JpcHRvcnMgKFRGRHMpLAotCSAqIHNoYXJlZCB3aXRoIGRldmljZSAqLwotCXR4cS0+dGZkcyA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHRmZF9zeiwgJnR4cS0+cS5kbWFfYWRkciwKLQkJCQkgICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0eHEtPnRmZHMpIHsKLQkJSVdMX0VSUihwcml2LCAicGNpX2FsbG9jX2NvbnNpc3RlbnQoJXpkKSBmYWlsZWRcbiIsIHRmZF9zeik7Ci0JCWdvdG8gZXJyb3I7Ci0JfQotCXR4cS0+cS5pZCA9IGlkOwotCi0JcmV0dXJuIDA7Ci0KLSBlcnJvcjoKLQlrZnJlZSh0eHEtPnR4Yik7Ci0JdHhxLT50eGIgPSBOVUxMOwotCi0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLS8qKgotICogaXdsX2xlZ2FjeV90eF9xdWV1ZV9pbml0IC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgb25lIHR4L2NtZCBxdWV1ZQotICovCi1pbnQgaXdsX2xlZ2FjeV90eF9xdWV1ZV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAotCQkgICAgICBpbnQgc2xvdHNfbnVtLCB1MzIgdHhxX2lkKQotewotCWludCBpLCBsZW47Ci0JaW50IHJldDsKLQlpbnQgYWN0dWFsX3Nsb3RzID0gc2xvdHNfbnVtOwotCi0JLyoKLQkgKiBBbGxvYyBidWZmZXIgYXJyYXkgZm9yIGNvbW1hbmRzIChUeCBvciBvdGhlciB0eXBlcyBvZiBjb21tYW5kcykuCi0JICogRm9yIHRoZSBjb21tYW5kIHF1ZXVlICgjNC8jOSksIGFsbG9jYXRlIGNvbW1hbmQgc3BhY2UgKyBvbmUgYmlnCi0JICogY29tbWFuZCBmb3Igc2Nhbiwgc2luY2Ugc2NhbiBjb21tYW5kIGlzIHZlcnkgaHVnZTsgdGhlIHN5c3RlbSB3aWxsCi0JICogbm90IGhhdmUgdHdvIHNjYW5zIGF0IHRoZSBzYW1lIHRpbWUsIHNvIG9ubHkgb25lIGlzIG5lZWRlZC4KLQkgKiBGb3Igbm9ybWFsIFR4IHF1ZXVlcyAoYWxsIG90aGVyIHF1ZXVlcyksIG5vIHN1cGVyLXNpemUgY29tbWFuZAotCSAqIHNwYWNlIGlzIG5lZWRlZC4KLQkgKi8KLQlpZiAodHhxX2lkID09IHByaXYtPmNtZF9xdWV1ZSkKLQkJYWN0dWFsX3Nsb3RzKys7Ci0KLQl0eHEtPm1ldGEgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9tZXRhKSAqIGFjdHVhbF9zbG90cywKLQkJCSAgICBHRlBfS0VSTkVMKTsKLQl0eHEtPmNtZCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqKSAqIGFjdHVhbF9zbG90cywKLQkJCSAgIEdGUF9LRVJORUwpOwotCi0JaWYgKCF0eHEtPm1ldGEgfHwgIXR4cS0+Y21kKQotCQlnb3RvIG91dF9mcmVlX2FycmF5czsKLQotCWxlbiA9IHNpemVvZihzdHJ1Y3QgaXdsX2RldmljZV9jbWQpOwotCWZvciAoaSA9IDA7IGkgPCBhY3R1YWxfc2xvdHM7IGkrKykgewotCQkvKiBvbmx5IGhhcHBlbnMgZm9yIGNtZCBxdWV1ZSAqLwotCQlpZiAoaSA9PSBzbG90c19udW0pCi0JCQlsZW4gPSBJV0xfTUFYX0NNRF9TSVpFOwotCi0JCXR4cS0+Y21kW2ldID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOwotCQlpZiAoIXR4cS0+Y21kW2ldKQotCQkJZ290byBlcnI7Ci0JfQotCi0JLyogQWxsb2MgZHJpdmVyIGRhdGEgYXJyYXkgYW5kIFRGRCBjaXJjdWxhciBidWZmZXIgKi8KLQlyZXQgPSBpd2xfbGVnYWN5X3R4X3F1ZXVlX2FsbG9jKHByaXYsIHR4cSwgdHhxX2lkKTsKLQlpZiAocmV0KQotCQlnb3RvIGVycjsKLQotCXR4cS0+bmVlZF91cGRhdGUgPSAwOwotCi0JLyoKLQkgKiBGb3IgdGhlIGRlZmF1bHQgcXVldWVzIDAtMywgc2V0IHVwIHRoZSBzd3FfaWQKLQkgKiBhbHJlYWR5IC0tIGFsbCBvdGhlcnMgbmVlZCB0byBnZXQgb25lIGxhdGVyCi0JICogKGlmIHRoZXkgbmVlZCBvbmUgYXQgYWxsKS4KLQkgKi8KLQlpZiAodHhxX2lkIDwgNCkKLQkJaXdsX2xlZ2FjeV9zZXRfc3dxX2lkKHR4cSwgdHhxX2lkLCB0eHFfaWQpOwotCi0JLyogVEZEX1FVRVVFX1NJWkVfTUFYIG11c3QgYmUgcG93ZXItb2YtdHdvIHNpemUsIG90aGVyd2lzZQotCSAqIGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAgYW5kIGl3bF9sZWdhY3lfcXVldWVfZGVjX3dyYXAgYXJlIGJyb2tlbi4gKi8KLQlCVUlMRF9CVUdfT04oVEZEX1FVRVVFX1NJWkVfTUFYICYgKFRGRF9RVUVVRV9TSVpFX01BWCAtIDEpKTsKLQotCS8qIEluaXRpYWxpemUgcXVldWUncyBoaWdoL2xvdy13YXRlciBtYXJrcywgYW5kIGhlYWQvdGFpbCBpbmRleGVzICovCi0JaXdsX2xlZ2FjeV9xdWV1ZV9pbml0KHByaXYsICZ0eHEtPnEsCi0JCQkJVEZEX1FVRVVFX1NJWkVfTUFYLCBzbG90c19udW0sIHR4cV9pZCk7Ci0KLQkvKiBUZWxsIGRldmljZSB3aGVyZSB0byBmaW5kIHF1ZXVlICovCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2luaXQocHJpdiwgdHhxKTsKLQotCXJldHVybiAwOwotZXJyOgotCWZvciAoaSA9IDA7IGkgPCBhY3R1YWxfc2xvdHM7IGkrKykKLQkJa2ZyZWUodHhxLT5jbWRbaV0pOwotb3V0X2ZyZWVfYXJyYXlzOgotCWtmcmVlKHR4cS0+bWV0YSk7Ci0Ja2ZyZWUodHhxLT5jbWQpOwotCi0JcmV0dXJuIC1FTk9NRU07Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfdHhfcXVldWVfaW5pdCk7Ci0KLXZvaWQgaXdsX2xlZ2FjeV90eF9xdWV1ZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCWludCBzbG90c19udW0sIHUzMiB0eHFfaWQpCi17Ci0JaW50IGFjdHVhbF9zbG90cyA9IHNsb3RzX251bTsKLQotCWlmICh0eHFfaWQgPT0gcHJpdi0+Y21kX3F1ZXVlKQotCQlhY3R1YWxfc2xvdHMrKzsKLQotCW1lbXNldCh0eHEtPm1ldGEsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX2NtZF9tZXRhKSAqIGFjdHVhbF9zbG90cyk7Ci0KLQl0eHEtPm5lZWRfdXBkYXRlID0gMDsKLQotCS8qIEluaXRpYWxpemUgcXVldWUncyBoaWdoL2xvdy13YXRlciBtYXJrcywgYW5kIGhlYWQvdGFpbCBpbmRleGVzICovCi0JaXdsX2xlZ2FjeV9xdWV1ZV9pbml0KHByaXYsICZ0eHEtPnEsCi0JCQkJVEZEX1FVRVVFX1NJWkVfTUFYLCBzbG90c19udW0sIHR4cV9pZCk7Ci0KLQkvKiBUZWxsIGRldmljZSB3aGVyZSB0byBmaW5kIHF1ZXVlICovCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2luaXQocHJpdiwgdHhxKTsKLX0KLUVYUE9SVF9TWU1CT0woaXdsX2xlZ2FjeV90eF9xdWV1ZV9yZXNldCk7Ci0KLS8qKioqKioqKioqKioqKiogSE9TVCBDT01NQU5EIFFVRVVFIEZVTkNUSU9OUyAgICoqKioqLwotCi0vKioKLSAqIGl3bF9sZWdhY3lfZW5xdWV1ZV9oY21kIC0gZW5xdWV1ZSBhIHVDb2RlIGNvbW1hbmQKLSAqIEBwcml2OiBkZXZpY2UgcHJpdmF0ZSBkYXRhIHBvaW50Ci0gKiBAY21kOiBhIHBvaW50IHRvIHRoZSB1Y29kZSBjb21tYW5kIHN0cnVjdHVyZQotICoKLSAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIDwgMCB2YWx1ZXMgdG8gaW5kaWNhdGUgdGhlIG9wZXJhdGlvbiBpcwotICogZmFpbGVkLiBPbiBzdWNjZXNzLCBpdCB0dXJucyB0aGUgaW5kZXggKD4gMCkgb2YgY29tbWFuZCBpbiB0aGUKLSAqIGNvbW1hbmQgcXVldWUuCi0gKi8KLWludCBpd2xfbGVnYWN5X2VucXVldWVfaGNtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfaG9zdF9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV07Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7Ci0Jc3RydWN0IGl3bF9kZXZpY2VfY21kICpvdXRfY21kOwotCXN0cnVjdCBpd2xfY21kX21ldGEgKm91dF9tZXRhOwotCWRtYV9hZGRyX3QgcGh5c19hZGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGxlbjsKLQl1MzIgaWR4OwotCXUxNiBmaXhfc2l6ZTsKLQotCWNtZC0+bGVuID0gcHJpdi0+Y2ZnLT5vcHMtPnV0aWxzLT5nZXRfaGNtZF9zaXplKGNtZC0+aWQsIGNtZC0+bGVuKTsKLQlmaXhfc2l6ZSA9ICh1MTYpKGNtZC0+bGVuICsgc2l6ZW9mKG91dF9jbWQtPmhkcikpOwotCi0JLyogSWYgYW55IG9mIHRoZSBjb21tYW5kIHN0cnVjdHVyZXMgZW5kIHVwIGJlaW5nIGxhcmdlciB0aGFuCi0JICogdGhlIFRGRF9NQVhfUEFZTE9BRF9TSVpFLCBhbmQgaXQgc2VudCBhcyBhICdzbWFsbCcgY29tbWFuZCB0aGVuCi0JICogd2Ugd2lsbCBuZWVkIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBURkQgZW50cmllcwotCSAqIEFsc28sIGNoZWNrIHRvIHNlZSBpZiBjb21tYW5kIGJ1ZmZlciBzaG91bGQgbm90IGV4Y2VlZCB0aGUgc2l6ZQotCSAqIG9mIGRldmljZV9jbWQgYW5kIG1heF9jbWRfc2l6ZS4gKi8KLQlCVUdfT04oKGZpeF9zaXplID4gVEZEX01BWF9QQVlMT0FEX1NJWkUpICYmCi0JICAgICAgICEoY21kLT5mbGFncyAmIENNRF9TSVpFX0hVR0UpKTsKLQlCVUdfT04oZml4X3NpemUgPiBJV0xfTUFYX0NNRF9TSVpFKTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX3Jma2lsbChwcml2KSB8fCBpd2xfbGVnYWN5X2lzX2N0a2lsbChwcml2KSkgewotCQlJV0xfV0FSTihwcml2LCAiTm90IHNlbmRpbmcgY29tbWFuZCAtICVzIEtJTExcbiIsCi0JCQkgaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikgPyAiUkYiIDogIkNUIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5oY21kX2xvY2ssIGZsYWdzKTsKLQotCWlmIChpd2xfbGVnYWN5X3F1ZXVlX3NwYWNlKHEpIDwgKChjbWQtPmZsYWdzICYgQ01EX0FTWU5DKSA/IDIgOiAxKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5oY21kX2xvY2ssIGZsYWdzKTsKLQotCQlJV0xfRVJSKHByaXYsICJSZXN0YXJ0aW5nIGFkYXB0ZXIgZHVlIHRvIGNvbW1hbmQgcXVldWUgZnVsbFxuIik7Ci0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVzdGFydCk7Ci0JCXJldHVybiAtRU5PU1BDOwotCX0KLQotCWlkeCA9IGl3bF9sZWdhY3lfZ2V0X2NtZF9pbmRleChxLCBxLT53cml0ZV9wdHIsIGNtZC0+ZmxhZ3MgJiBDTURfU0laRV9IVUdFKTsKLQlvdXRfY21kID0gdHhxLT5jbWRbaWR4XTsKLQlvdXRfbWV0YSA9ICZ0eHEtPm1ldGFbaWR4XTsKLQotCWlmIChXQVJOX09OKG91dF9tZXRhLT5mbGFncyAmIENNRF9NQVBQRUQpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmhjbWRfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gLUVOT1NQQzsKLQl9Ci0KLQltZW1zZXQob3V0X21ldGEsIDAsIHNpemVvZigqb3V0X21ldGEpKTsJLyogcmUtaW5pdGlhbGl6ZSB0byBOVUxMICovCi0Jb3V0X21ldGEtPmZsYWdzID0gY21kLT5mbGFncyB8IENNRF9NQVBQRUQ7Ci0JaWYgKGNtZC0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpCi0JCW91dF9tZXRhLT5zb3VyY2UgPSBjbWQ7Ci0JaWYgKGNtZC0+ZmxhZ3MgJiBDTURfQVNZTkMpCi0JCW91dF9tZXRhLT5jYWxsYmFjayA9IGNtZC0+Y2FsbGJhY2s7Ci0KLQlvdXRfY21kLT5oZHIuY21kID0gY21kLT5pZDsKLQltZW1jcHkoJm91dF9jbWQtPmNtZC5wYXlsb2FkLCBjbWQtPmRhdGEsIGNtZC0+bGVuKTsKLQotCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBvdXRfY21kIG5vdyBoYXMgYWxsIG9mIHRoZSBpbmNvbWluZyBjbWQKLQkgKiBpbmZvcm1hdGlvbiAqLwotCi0Jb3V0X2NtZC0+aGRyLmZsYWdzID0gMDsKLQlvdXRfY21kLT5oZHIuc2VxdWVuY2UgPSBjcHVfdG9fbGUxNihRVUVVRV9UT19TRVEocHJpdi0+Y21kX3F1ZXVlKSB8Ci0JCQlJTkRFWF9UT19TRVEocS0+d3JpdGVfcHRyKSk7Ci0JaWYgKGNtZC0+ZmxhZ3MgJiBDTURfU0laRV9IVUdFKQotCQlvdXRfY21kLT5oZHIuc2VxdWVuY2UgfD0gU0VRX0hVR0VfRlJBTUU7Ci0JbGVuID0gc2l6ZW9mKHN0cnVjdCBpd2xfZGV2aWNlX2NtZCk7Ci0JaWYgKGlkeCA9PSBURkRfQ01EX1NMT1RTKQotCQlsZW4gPSBJV0xfTUFYX0NNRF9TSVpFOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0Jc3dpdGNoIChvdXRfY21kLT5oZHIuY21kKSB7Ci0JY2FzZSBSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EOgotCWNhc2UgU0VOU0lUSVZJVFlfQ01EOgotCQlJV0xfREVCVUdfSENfRFVNUChwcml2LAotCQkJCSJTZW5kaW5nIGNvbW1hbmQgJXMgKCMleCksIHNlcTogMHglMDRYLCAiCi0JCQkJIiVkIGJ5dGVzIGF0ICVkWyVkXTolZFxuIiwKLQkJCQlpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKG91dF9jbWQtPmhkci5jbWQpLAotCQkJCW91dF9jbWQtPmhkci5jbWQsCi0JCQkJbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSwgZml4X3NpemUsCi0JCQkJcS0+d3JpdGVfcHRyLCBpZHgsIHByaXYtPmNtZF9xdWV1ZSk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9ERUJVR19IQyhwcml2LCAiU2VuZGluZyBjb21tYW5kICVzICgjJXgpLCBzZXE6IDB4JTA0WCwgIgotCQkJCSIlZCBieXRlcyBhdCAlZFslZF06JWRcbiIsCi0JCQkJaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhvdXRfY21kLT5oZHIuY21kKSwKLQkJCQlvdXRfY21kLT5oZHIuY21kLAotCQkJCWxlMTZfdG9fY3B1KG91dF9jbWQtPmhkci5zZXF1ZW5jZSksIGZpeF9zaXplLAotCQkJCXEtPndyaXRlX3B0ciwgaWR4LCBwcml2LT5jbWRfcXVldWUpOwotCX0KLSNlbmRpZgotCXR4cS0+bmVlZF91cGRhdGUgPSAxOwotCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnR4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKQotCQkvKiBTZXQgdXAgZW50cnkgaW4gcXVldWUncyBieXRlIGNvdW50IGNpcmN1bGFyIGJ1ZmZlciAqLwotCQlwcml2LT5jZmctPm9wcy0+bGliLT50eHFfdXBkYXRlX2J5dGVfY250X3RibChwcml2LCB0eHEsIDApOwotCi0JcGh5c19hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGNpX2RldiwgJm91dF9jbWQtPmhkciwKLQkJCQkgICBmaXhfc2l6ZSwgUENJX0RNQV9CSURJUkVDVElPTkFMKTsKLQlkbWFfdW5tYXBfYWRkcl9zZXQob3V0X21ldGEsIG1hcHBpbmcsIHBoeXNfYWRkcik7Ci0JZG1hX3VubWFwX2xlbl9zZXQob3V0X21ldGEsIGxlbiwgZml4X3NpemUpOwotCi0JdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X2hjbWQocHJpdiwgJm91dF9jbWQtPmhkciwKLQkJCQkJCWZpeF9zaXplLCBjbWQtPmZsYWdzKTsKLQotCXByaXYtPmNmZy0+b3BzLT5saWItPnR4cV9hdHRhY2hfYnVmX3RvX3RmZChwcml2LCB0eHEsCi0JCQkJCQkgICBwaHlzX2FkZHIsIGZpeF9zaXplLCAxLAotCQkJCQkJICAgVTMyX1BBRChjbWQtPmxlbikpOwotCi0JLyogSW5jcmVtZW50IGFuZCB1cGRhdGUgcXVldWUncyB3cml0ZSBpbmRleCAqLwotCXEtPndyaXRlX3B0ciA9IGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAocS0+d3JpdGVfcHRyLCBxLT5uX2JkKTsKLQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsIHR4cSk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5oY21kX2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gaWR4OwotfQotCi0vKioKLSAqIGl3bF9sZWdhY3lfaGNtZF9xdWV1ZV9yZWNsYWltIC0gUmVjbGFpbSBUWCBjb21tYW5kIHF1ZXVlIGVudHJpZXMgYWxyZWFkeSBUeCdkCi0gKgotICogV2hlbiBGVyBhZHZhbmNlcyAnUicgaW5kZXgsIGFsbCBlbnRyaWVzIGJldHdlZW4gb2xkIGFuZCBuZXcgJ1InIGluZGV4Ci0gKiBuZWVkIHRvIGJlIHJlY2xhaW1lZC4gQXMgcmVzdWx0LCBzb21lIGZyZWUgc3BhY2UgZm9ybXMuICBJZiB0aGVyZSBpcwotICogZW5vdWdoIGZyZWUgc3BhY2UgKD4gbG93IG1hcmspLCB3YWtlIHRoZSBzdGFjayB0aGF0IGZlZWRzIHVzLgotICovCi1zdGF0aWMgdm9pZCBpd2xfbGVnYWN5X2hjbWRfcXVldWVfcmVjbGFpbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCB0eHFfaWQsCi0JCQkJICAgaW50IGlkeCwgaW50IGNtZF9pZHgpCi17Ci0Jc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxID0gJnByaXYtPnR4cVt0eHFfaWRdOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSAmdHhxLT5xOwotCWludCBuZnJlZWQgPSAwOwotCi0JaWYgKChpZHggPj0gcS0+bl9iZCkgfHwgKGl3bF9sZWdhY3lfcXVldWVfdXNlZChxLCBpZHgpID09IDApKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlJlYWQgaW5kZXggZm9yIERNQSBxdWV1ZSB0eHEgaWQgKCVkKSwgaW5kZXggJWQsICIKLQkJCSAgImlzIG91dCBvZiByYW5nZSBbMC0lZF0gJWQgJWQuXG4iLCB0eHFfaWQsCi0JCQkgIGlkeCwgcS0+bl9iZCwgcS0+d3JpdGVfcHRyLCBxLT5yZWFkX3B0cik7Ci0JCXJldHVybjsKLQl9Ci0KLQlmb3IgKGlkeCA9IGl3bF9sZWdhY3lfcXVldWVfaW5jX3dyYXAoaWR4LCBxLT5uX2JkKTsgcS0+cmVhZF9wdHIgIT0gaWR4OwotCSAgICAgcS0+cmVhZF9wdHIgPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKHEtPnJlYWRfcHRyLCBxLT5uX2JkKSkgewotCi0JCWlmIChuZnJlZWQrKyA+IDApIHsKLQkJCUlXTF9FUlIocHJpdiwgIkhDTUQgc2tpcHBlZDogaW5kZXggKCVkKSAlZCAlZFxuIiwgaWR4LAotCQkJCQlxLT53cml0ZV9wdHIsIHEtPnJlYWRfcHRyKTsKLQkJCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cmVzdGFydCk7Ci0JCX0KLQotCX0KLX0KLQotLyoqCi0gKiBpd2xfbGVnYWN5X3R4X2NtZF9jb21wbGV0ZSAtIFB1bGwgdW51c2VkIGJ1ZmZlcnMgb2ZmIHRoZSBxdWV1ZSBhbmQgcmVjbGFpbSB0aGVtCi0gKiBAcnhiOiBSeCBidWZmZXIgdG8gcmVjbGFpbQotICoKLSAqIElmIGFuIFJ4IGJ1ZmZlciBoYXMgYW4gYXN5bmMgY2FsbGJhY2sgYXNzb2NpYXRlZCB3aXRoIGl0IHRoZSBjYWxsYmFjawotICogd2lsbCBiZSBleGVjdXRlZC4gIFRoZSBhdHRhY2hlZCBza2IgKGlmIHByZXNlbnQpIHdpbGwgb25seSBiZSBmcmVlZAotICogaWYgdGhlIGNhbGxiYWNrIHJldHVybnMgMQotICovCi12b2lkCi1pd2xfbGVnYWN5X3R4X2NtZF9jb21wbGV0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXUxNiBzZXF1ZW5jZSA9IGxlMTZfdG9fY3B1KHBrdC0+aGRyLnNlcXVlbmNlKTsKLQlpbnQgdHhxX2lkID0gU0VRX1RPX1FVRVVFKHNlcXVlbmNlKTsKLQlpbnQgaW5kZXggPSBTRVFfVE9fSU5ERVgoc2VxdWVuY2UpOwotCWludCBjbWRfaW5kZXg7Ci0JYm9vbCBodWdlID0gISEocGt0LT5oZHIuc2VxdWVuY2UgJiBTRVFfSFVHRV9GUkFNRSk7Ci0Jc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQ7Ci0Jc3RydWN0IGl3bF9jbWRfbWV0YSAqbWV0YTsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmcHJpdi0+dHhxW3ByaXYtPmNtZF9xdWV1ZV07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qIElmIGEgVHggY29tbWFuZCBpcyBiZWluZyBoYW5kbGVkIGFuZCBpdCBpc24ndCBpbiB0aGUgYWN0dWFsCi0JICogY29tbWFuZCBxdWV1ZSB0aGVuIHRoZXJlIGEgY29tbWFuZCByb3V0aW5nIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkCi0JICogaW4gdGhlIHF1ZXVlIG1hbmFnZW1lbnQgY29kZS4gKi8KLQlpZiAoV0FSTih0eHFfaWQgIT0gcHJpdi0+Y21kX3F1ZXVlLAotCQkgIndyb25nIGNvbW1hbmQgcXVldWUgJWQgKHNob3VsZCBiZSAlZCksIHNlcXVlbmNlIDB4JVggcmVhZHA9JWQgd3JpdGVwPSVkXG4iLAotCQkgIHR4cV9pZCwgcHJpdi0+Y21kX3F1ZXVlLCBzZXF1ZW5jZSwKLQkJICBwcml2LT50eHFbcHJpdi0+Y21kX3F1ZXVlXS5xLnJlYWRfcHRyLAotCQkgIHByaXYtPnR4cVtwcml2LT5jbWRfcXVldWVdLnEud3JpdGVfcHRyKSkgewotCQlpd2xfcHJpbnRfaGV4X2Vycm9yKHByaXYsIHBrdCwgMzIpOwotCQlyZXR1cm47Ci0JfQotCi0JY21kX2luZGV4ID0gaXdsX2xlZ2FjeV9nZXRfY21kX2luZGV4KCZ0eHEtPnEsIGluZGV4LCBodWdlKTsKLQljbWQgPSB0eHEtPmNtZFtjbWRfaW5kZXhdOwotCW1ldGEgPSAmdHhxLT5tZXRhW2NtZF9pbmRleF07Ci0KLQl0eHEtPnRpbWVfc3RhbXAgPSBqaWZmaWVzOwotCi0JcGNpX3VubWFwX3NpbmdsZShwcml2LT5wY2lfZGV2LAotCQkJIGRtYV91bm1hcF9hZGRyKG1ldGEsIG1hcHBpbmcpLAotCQkJIGRtYV91bm1hcF9sZW4obWV0YSwgbGVuKSwKLQkJCSBQQ0lfRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JLyogSW5wdXQgZXJyb3IgY2hlY2tpbmcgaXMgZG9uZSB3aGVuIGNvbW1hbmRzIGFyZSBhZGRlZCB0byBxdWV1ZS4gKi8KLQlpZiAobWV0YS0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpIHsKLQkJbWV0YS0+c291cmNlLT5yZXBseV9wYWdlID0gKHVuc2lnbmVkIGxvbmcpcnhiX2FkZHIocnhiKTsKLQkJcnhiLT5wYWdlID0gTlVMTDsKLQl9IGVsc2UgaWYgKG1ldGEtPmNhbGxiYWNrKQotCQltZXRhLT5jYWxsYmFjayhwcml2LCBjbWQsIHBrdCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Ci0KLQlpd2xfbGVnYWN5X2hjbWRfcXVldWVfcmVjbGFpbShwcml2LCB0eHFfaWQsIGluZGV4LCBjbWRfaW5kZXgpOwotCi0JaWYgKCEobWV0YS0+ZmxhZ3MgJiBDTURfQVNZTkMpKSB7Ci0JCWNsZWFyX2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZwcml2LT5zdGF0dXMpOwotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQ2xlYXJpbmcgSENNRF9BQ1RJVkUgZm9yIGNvbW1hbmQgJXNcbiIsCi0JCQkgICAgICAgaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhjbWQtPmhkci5jbWQpKTsKLQkJd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLQl9Ci0KLQkvKiBNYXJrIGFzIHVubWFwcGVkICovCi0JbWV0YS0+ZmxhZ3MgPSAwOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+aGNtZF9sb2NrLCBmbGFncyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGl3bF9sZWdhY3lfdHhfY21kX2NvbXBsZXRlKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDM5NDUtYmFzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsMzk0NS1iYXNlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyODJkODYuLjAwMDAwMDAKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsMzk0NS1iYXNlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBDb3B5cmlnaHQoYykgMjAwMyAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBkZXJpdmVkIGZyb20gdGhlIGlwdzM5NDUgcHJvamVjdCwgYXMgd2VsbAotICogYXMgcG9ydGlvbnMgb2YgdGhlIGllZWU4MDIxMSBzdWJzeXN0ZW0gaGVhZGVyIGZpbGVzLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Ci0gKiB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCi0gKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKLSAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKLSAqIG1vcmUgZGV0YWlscy4KLSAqCi0gKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCi0gKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKLSAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAsIFVTQQotICoKLSAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGluIHRoZQotICogZmlsZSBjYWxsZWQgTElDRU5TRS4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS1hc3BtLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KLQotI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotCi0jZGVmaW5lIERSVl9OQU1FCSJpd2wzOTQ1IgotCi0jaW5jbHVkZSAiaXdsLWZoLmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUtZmguaCIKLSNpbmNsdWRlICJpd2wtY29tbWFuZHMuaCIKLSNpbmNsdWRlICJpd2wtc3RhLmgiCi0jaW5jbHVkZSAiaXdsLTM5NDUuaCIKLSNpbmNsdWRlICJpd2wtY29yZS5oIgotI2luY2x1ZGUgIml3bC1oZWxwZXJzLmgiCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1zcGVjdHJ1bS5oIgotCi0vKgotICogbW9kdWxlIG5hbWUsIGNvcHlyaWdodCwgdmVyc2lvbiwgZXRjLgotICovCi0KLSNkZWZpbmUgRFJWX0RFU0NSSVBUSU9OCVwKLSJJbnRlbChSKSBQUk8vV2lyZWxlc3MgMzk0NUFCRy9CRyBOZXR3b3JrIENvbm5lY3Rpb24gZHJpdmVyIGZvciBMaW51eCIKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotI2RlZmluZSBWRCAiZCIKLSNlbHNlCi0jZGVmaW5lIFZECi0jZW5kaWYKLQotLyoKLSAqIGFkZCAicyIgdG8gaW5kaWNhdGUgc3BlY3RydW0gbWVhc3VyZW1lbnQgaW5jbHVkZWQuCi0gKiB3ZSBhZGQgaXQgaGVyZSB0byBiZSBjb25zaXN0ZW50IHdpdGggcHJldmlvdXMgcmVsZWFzZXMgaW4gd2hpY2gKLSAqIHRoaXMgd2FzIGNvbmZpZ3VyYWJsZS4KLSAqLwotI2RlZmluZSBEUlZfVkVSU0lPTiAgSVdMV0lGSV9WRVJTSU9OIFZEICJzIgotI2RlZmluZSBEUlZfQ09QWVJJR0hUCSJDb3B5cmlnaHQoYykgMjAwMy0yMDExIEludGVsIENvcnBvcmF0aW9uIgotI2RlZmluZSBEUlZfQVVUSE9SICAgICAiPGlsd0BsaW51eC5pbnRlbC5jb20+IgotCi1NT0RVTEVfREVTQ1JJUFRJT04oRFJWX0RFU0NSSVBUSU9OKTsKLU1PRFVMRV9WRVJTSU9OKERSVl9WRVJTSU9OKTsKLU1PRFVMRV9BVVRIT1IoRFJWX0NPUFlSSUdIVCAiICIgRFJWX0FVVEhPUik7Ci1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci0KLSAvKiBtb2R1bGUgcGFyYW1ldGVycyAqLwotc3RydWN0IGl3bF9tb2RfcGFyYW1zIGl3bDM5NDVfbW9kX3BhcmFtcyA9IHsKLQkuc3dfY3J5cHRvID0gMSwKLQkucmVzdGFydF9mdyA9IDEsCi0JLmRpc2FibGVfaHdfc2NhbiA9IDEsCi0JLyogdGhlIHJlc3QgYXJlIDAgYnkgZGVmYXVsdCAqLwotfTsKLQotLyoqCi0gKiBpd2wzOTQ1X2dldF9hbnRlbm5hX2ZsYWdzIC0gR2V0IGFudGVubmEgZmxhZ3MgZm9yIFJYT04gY29tbWFuZAotICogQHByaXY6IGVlcHJvbSBhbmQgYW50ZW5uYSBmaWVsZHMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIGFudGVubmEgZmxhZ3MKLSAqCi0gKiBwcml2LT5lZXByb20zOSAgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW50ZW5uYSBBVVgvTUFJTiBhcmUgcmV2ZXJzZWQKLSAqIGl3bDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hIHNwZWNpZmllcyB0aGUgYW50ZW5uYSBkaXZlcnNpdHkgbW9kZToKLSAqCi0gKiBJV0xfQU5URU5OQV9ESVZFUlNJVFkgLSBOSUMgc2VsZWN0cyBiZXN0IGFudGVubmEgYnkgaXRzZWxmCi0gKiBJV0xfQU5URU5OQV9NQUlOICAgICAgLSBGb3JjZSBNQUlOIGFudGVubmEKLSAqIElXTF9BTlRFTk5BX0FVWCAgICAgICAtIEZvcmNlIEFVWCBhbnRlbm5hCi0gKi8KLV9fbGUzMiBpd2wzOTQ1X2dldF9hbnRlbm5hX2ZsYWdzKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0KLQlzd2l0Y2ggKGl3bDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hKSB7Ci0JY2FzZSBJV0xfQU5URU5OQV9ESVZFUlNJVFk6Ci0JCXJldHVybiAwOwotCi0JY2FzZSBJV0xfQU5URU5OQV9NQUlOOgotCQlpZiAoZWVwcm9tLT5hbnRlbm5hX3N3aXRjaF90eXBlKQotCQkJcmV0dXJuIFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX0JfTVNLOwotCQlyZXR1cm4gUlhPTl9GTEdfRElTX0RJVl9NU0sgfCBSWE9OX0ZMR19BTlRfQV9NU0s7Ci0KLQljYXNlIElXTF9BTlRFTk5BX0FVWDoKLQkJaWYgKGVlcHJvbS0+YW50ZW5uYV9zd2l0Y2hfdHlwZSkKLQkJCXJldHVybiBSWE9OX0ZMR19ESVNfRElWX01TSyB8IFJYT05fRkxHX0FOVF9BX01TSzsKLQkJcmV0dXJuIFJYT05fRkxHX0RJU19ESVZfTVNLIHwgUlhPTl9GTEdfQU5UX0JfTVNLOwotCX0KLQotCS8qIGJhZCBhbnRlbm5hIHNlbGVjdG9yIHZhbHVlICovCi0JSVdMX0VSUihwcml2LCAiQmFkIGFudGVubmEgc2VsZWN0b3IgdmFsdWUgKDB4JXgpXG4iLAotCQlpd2wzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSk7Ci0KLQlyZXR1cm4gMDsJCS8qICJkaXZlcnNpdHkiIGlzIGRlZmF1bHQgaWYgZXJyb3IgKi8KLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X3NldF9jY21wX2R5bmFtaWNfa2V5X2luZm8oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJICAgdTggc3RhX2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JX19sZTE2IGtleV9mbGFncyA9IDA7Ci0JaW50IHJldDsKLQotCWtleV9mbGFncyB8PSAoU1RBX0tFWV9GTEdfQ0NNUCB8IFNUQV9LRVlfRkxHX01BUF9LRVlfTVNLKTsKLQlrZXlfZmxhZ3MgfD0gY3B1X3RvX2xlMTYoa2V5Y29uZi0+a2V5aWR4IDw8IFNUQV9LRVlfRkxHX0tFWUlEX1BPUyk7Ci0KLQlpZiAoc3RhX2lkID09IHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCkKLQkJa2V5X2ZsYWdzIHw9IFNUQV9LRVlfTVVMVElDQVNUX01TSzsKLQotCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKLQlrZXljb25mLT5od19rZXlfaWR4ID0ga2V5Y29uZi0+a2V5aWR4OwotCWtleV9mbGFncyAmPSB+U1RBX0tFWV9GTEdfSU5WQUxJRDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0ua2V5aW5mby5jaXBoZXIgPSBrZXljb25mLT5jaXBoZXI7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleWxlbiA9IGtleWNvbmYtPmtleWxlbjsKLQltZW1jcHkocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLmtleSwga2V5Y29uZi0+a2V5LAotCSAgICAgICBrZXljb25mLT5rZXlsZW4pOwotCi0JbWVtY3B5KHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleS5rZXksIGtleWNvbmYtPmtleSwKLQkgICAgICAga2V5Y29uZi0+a2V5bGVuKTsKLQotCWlmICgocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyAmIFNUQV9LRVlfRkxHX0VOQ1JZUFRfTVNLKQotCQkJPT0gU1RBX0tFWV9GTEdfTk9fRU5DKQotCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X29mZnNldCA9Ci0JCQkJIGl3bF9sZWdhY3lfZ2V0X2ZyZWVfdWNvZGVfa2V5X2luZGV4KHByaXYpOwotCS8qIGVsc2UsIHdlIGFyZSBvdmVycmlkaW5nIGFuIGV4aXN0aW5nIGtleSA9PiBubyBuZWVkIHRvIGFsbG9jYXRlZCByb29tCi0JKiBpbiB1Q29kZS4gKi8KLQotCVdBUk4ocHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9vZmZzZXQgPT0gV0VQX0lOVkFMSURfT0ZGU0VULAotCQkibm8gc3BhY2UgZm9yIGEgbmV3IGtleSIpOwotCi0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEua2V5LmtleV9mbGFncyA9IGtleV9mbGFnczsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSBTVEFfTU9ESUZZX0tFWV9NQVNLOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLm1vZGUgPSBTVEFfQ09OVFJPTF9NT0RJRllfTVNLOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImh3Y3J5cHRvOiBtb2RpZnkgdWNvZGUgc3RhdGlvbiBrZXkgaW5mb1xuIik7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfYWRkX3N0YShwcml2LAotCQkJCSZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfc2V0X3RraXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCSAgdTggc3RhX2lkKQotewotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X3NldF93ZXBfZHluYW1pY19rZXlfaW5mbyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXljb25mLAotCQkJCSAgdTggc3RhX2lkKQotewotCXJldHVybiAtRU9QTk9UU1VQUDsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X2NsZWFyX3N0YV9rZXlfaW5mbyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IHN0YV9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfbGVnYWN5X2FkZHN0YV9jbWQgc3RhX2NtZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zdGFfbG9jaywgZmxhZ3MpOwotCW1lbXNldCgmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5rZXlpbmZvLCAwLCBzaXplb2Yoc3RydWN0IGl3bF9od19rZXkpKTsKLQltZW1zZXQoJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLmtleSwgMCwKLQkJc2l6ZW9mKHN0cnVjdCBpd2w0OTY1X2tleWluZm8pKTsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5rZXkua2V5X2ZsYWdzID0gU1RBX0tFWV9GTEdfTk9fRU5DOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5tb2RpZnlfbWFzayA9IFNUQV9NT0RJRllfS0VZX01BU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JbWVtY3B5KCZzdGFfY21kLCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIHNpemVvZihzdHJ1Y3QgaXdsX2xlZ2FjeV9hZGRzdGFfY21kKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJod2NyeXB0bzogY2xlYXIgdWNvZGUgc3RhdGlvbiBrZXkgaW5mb1xuIik7Ci0JcmV0dXJuIGl3bF9sZWdhY3lfc2VuZF9hZGRfc3RhKHByaXYsICZzdGFfY21kLCBDTURfU1lOQyk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9zZXRfZHluYW1pY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5Y29uZiwgdTggc3RhX2lkKQotewotCWludCByZXQgPSAwOwotCi0Ja2V5Y29uZi0+aHdfa2V5X2lkeCA9IEhXX0tFWV9EWU5BTUlDOwotCi0Jc3dpdGNoIChrZXljb25mLT5jaXBoZXIpIHsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCXJldCA9IGl3bDM5NDVfc2V0X2NjbXBfZHluYW1pY19rZXlfaW5mbyhwcml2LCBrZXljb25mLCBzdGFfaWQpOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCXJldCA9IGl3bDM5NDVfc2V0X3RraXBfZHluYW1pY19rZXlfaW5mbyhwcml2LCBrZXljb25mLCBzdGFfaWQpOwotCQlicmVhazsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0OgotCQlyZXQgPSBpd2wzOTQ1X3NldF93ZXBfZHluYW1pY19rZXlfaW5mbyhwcml2LCBrZXljb25mLCBzdGFfaWQpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJVbmtub3duIGFsZzogJXMgYWxnPSV4XG4iLCBfX2Z1bmNfXywKLQkJCWtleWNvbmYtPmNpcGhlcik7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JSVdMX0RFQlVHX1dFUChwcml2LCAiU2V0IGR5bmFtaWMga2V5OiBhbGc9JXggbGVuPSVkIGlkeD0lZCBzdGE9JWQgcmV0PSVkXG4iLAotCQkgICAgICBrZXljb25mLT5jaXBoZXIsIGtleWNvbmYtPmtleWxlbiwga2V5Y29uZi0+a2V5aWR4LAotCQkgICAgICBzdGFfaWQsIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfcmVtb3ZlX3N0YXRpY19rZXkoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByZXQgPSAtRU9QTk9UU1VQUDsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9zZXRfc3RhdGljX2tleShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQotewotCWlmIChrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCSAgICBrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCUlXTF9FUlIocHJpdiwgIlN0YXRpYyBrZXkgaW52YWxpZDogY2lwaGVyICV4XG4iLCBrZXktPmNpcGhlcik7Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfY2xlYXJfZnJlZV9mcmFtZXMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiJWQgZnJhbWVzIG9uIHByZS1hbGxvY2F0ZWQgaGVhcCBvbiBjbGVhci5cbiIsCi0JCSAgICAgICBwcml2LT5mcmFtZXNfY291bnQpOwotCi0Jd2hpbGUgKCFsaXN0X2VtcHR5KCZwcml2LT5mcmVlX2ZyYW1lcykpIHsKLQkJZWxlbWVudCA9IHByaXYtPmZyZWVfZnJhbWVzLm5leHQ7Ci0JCWxpc3RfZGVsKGVsZW1lbnQpOwotCQlrZnJlZShsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2wzOTQ1X2ZyYW1lLCBsaXN0KSk7Ci0JCXByaXYtPmZyYW1lc19jb3VudC0tOwotCX0KLQotCWlmIChwcml2LT5mcmFtZXNfY291bnQpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIiVkIGZyYW1lcyBzdGlsbCBpbiB1c2UuICBEaWQgd2UgbG9zZSBvbmU/XG4iLAotCQkJICAgIHByaXYtPmZyYW1lc19jb3VudCk7Ci0JCXByaXYtPmZyYW1lc19jb3VudCA9IDA7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IGl3bDM5NDVfZnJhbWUgKml3bDM5NDVfZ2V0X2ZyZWVfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2wzOTQ1X2ZyYW1lICpmcmFtZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCWlmIChsaXN0X2VtcHR5KCZwcml2LT5mcmVlX2ZyYW1lcykpIHsKLQkJZnJhbWUgPSBremFsbG9jKHNpemVvZigqZnJhbWUpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFmcmFtZSkgewotCQkJSVdMX0VSUihwcml2LCAiQ291bGQgbm90IGFsbG9jYXRlIGZyYW1lIVxuIik7Ci0JCQlyZXR1cm4gTlVMTDsKLQkJfQotCi0JCXByaXYtPmZyYW1lc19jb3VudCsrOwotCQlyZXR1cm4gZnJhbWU7Ci0JfQotCi0JZWxlbWVudCA9IHByaXYtPmZyZWVfZnJhbWVzLm5leHQ7Ci0JbGlzdF9kZWwoZWxlbWVudCk7Ci0JcmV0dXJuIGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGl3bDM5NDVfZnJhbWUsIGxpc3QpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2ZyZWVfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsMzk0NV9mcmFtZSAqZnJhbWUpCi17Ci0JbWVtc2V0KGZyYW1lLCAwLCBzaXplb2YoKmZyYW1lKSk7Ci0JbGlzdF9hZGQoJmZyYW1lLT5saXN0LCAmcHJpdi0+ZnJlZV9mcmFtZXMpOwotfQotCi11bnNpZ25lZCBpbnQgaXdsMzk0NV9maWxsX2JlYWNvbl9mcmFtZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciwKLQkJCQlpbnQgbGVmdCkKLXsKLQotCWlmICghaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkKHByaXYsIElXTF9SWE9OX0NUWF9CU1MpIHx8ICFwcml2LT5iZWFjb25fc2tiKQotCQlyZXR1cm4gMDsKLQotCWlmIChwcml2LT5iZWFjb25fc2tiLT5sZW4gPiBsZWZ0KQotCQlyZXR1cm4gMDsKLQotCW1lbWNweShoZHIsIHByaXYtPmJlYWNvbl9za2ItPmRhdGEsIHByaXYtPmJlYWNvbl9za2ItPmxlbik7Ci0KLQlyZXR1cm4gcHJpdi0+YmVhY29uX3NrYi0+bGVuOwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfc2VuZF9iZWFjb25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsMzk0NV9mcmFtZSAqZnJhbWU7Ci0JdW5zaWduZWQgaW50IGZyYW1lX3NpemU7Ci0JaW50IHJjOwotCXU4IHJhdGU7Ci0KLQlmcmFtZSA9IGl3bDM5NDVfZ2V0X2ZyZWVfZnJhbWUocHJpdik7Ci0KLQlpZiAoIWZyYW1lKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkNvdWxkIG5vdCBvYnRhaW4gZnJlZSBmcmFtZSBidWZmZXIgZm9yIGJlYWNvbiAiCi0JCQkgICJjb21tYW5kLlxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXJhdGUgPSBpd2xfbGVnYWN5X2dldF9sb3dlc3RfcGxjcChwcml2LAotCQkJCSZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSk7Ci0KLQlmcmFtZV9zaXplID0gaXdsMzk0NV9od19nZXRfYmVhY29uX2NtZChwcml2LCBmcmFtZSwgcmF0ZSk7Ci0KLQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9jbWRfcGR1KHByaXYsIFJFUExZX1RYX0JFQUNPTiwgZnJhbWVfc2l6ZSwKLQkJCSAgICAgICZmcmFtZS0+dS5jbWRbMF0pOwotCi0JaXdsMzk0NV9mcmVlX2ZyYW1lKHByaXYsIGZyYW1lKTsKLQotCXJldHVybiByYzsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV91bnNldF9od19wYXJhbXMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWlmIChwcml2LT5fMzk0NS5zaGFyZWRfdmlydCkKLQkJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwKLQkJCQkgIHNpemVvZihzdHJ1Y3QgaXdsMzk0NV9zaGFyZWQpLAotCQkJCSAgcHJpdi0+XzM5NDUuc2hhcmVkX3ZpcnQsCi0JCQkJICBwcml2LT5fMzk0NS5zaGFyZWRfcGh5cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfYnVpbGRfdHhfY21kX2h3Y3J5cHRvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8sCi0JCQkJICAgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQsCi0JCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYl9mcmFnLAotCQkJCSAgICAgIGludCBzdGFfaWQpCi17Ci0Jc3RydWN0IGl3bDM5NDVfdHhfY21kICp0eF9jbWQgPSAoc3RydWN0IGl3bDM5NDVfdHhfY21kICopY21kLT5jbWQucGF5bG9hZDsKLQlzdHJ1Y3QgaXdsX2h3X2tleSAqa2V5aW5mbyA9ICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmtleWluZm87Ci0KLQl0eF9jbWQtPnNlY19jdGwgPSAwOwotCi0Jc3dpdGNoIChrZXlpbmZvLT5jaXBoZXIpIHsKLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6Ci0JCXR4X2NtZC0+c2VjX2N0bCA9IFRYX0NNRF9TRUNfQ0NNOwotCQltZW1jcHkodHhfY21kLT5rZXksIGtleWluZm8tPmtleSwga2V5aW5mby0+a2V5bGVuKTsKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJ0eF9jbWQgd2l0aCBBRVMgaHdjcnlwdG9cbiIpOwotCQlicmVhazsKLQotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKLQkJYnJlYWs7Ci0KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJdHhfY21kLT5zZWNfY3RsIHw9IFRYX0NNRF9TRUNfS0VZMTI4OwotCQkvKiBmYWxsIHRocm91Z2ggKi8KLQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgotCQl0eF9jbWQtPnNlY19jdGwgfD0gVFhfQ01EX1NFQ19XRVAgfAotCQkgICAgKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5od19rZXlfaWR4ICYgVFhfQ01EX1NFQ19NU0spIDw8IFRYX0NNRF9TRUNfU0hJRlQ7Ci0KLQkJbWVtY3B5KCZ0eF9jbWQtPmtleVszXSwga2V5aW5mby0+a2V5LCBrZXlpbmZvLT5rZXlsZW4pOwotCi0JCUlXTF9ERUJVR19UWChwcml2LCAiQ29uZmlndXJpbmcgcGFja2V0IGZvciBXRVAgZW5jcnlwdGlvbiAiCi0JCQkgICAgICJ3aXRoIGtleSAlZFxuIiwgaW5mby0+Y29udHJvbC5od19rZXktPmh3X2tleV9pZHgpOwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIlVua25vd24gZW5jb2RlIGNpcGhlciAleFxuIiwga2V5aW5mby0+Y2lwaGVyKTsKLQkJYnJlYWs7Ci0JfQotfQotCi0vKgotICogaGFuZGxlIGJ1aWxkIFJFUExZX1RYIGNvbW1hbmQgbm90aWZpY2F0aW9uLgotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2J1aWxkX3R4X2NtZF9iYXNpYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCwKLQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbywKLQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsIHU4IHN0ZF9pZCkKLXsKLQlzdHJ1Y3QgaXdsMzk0NV90eF9jbWQgKnR4X2NtZCA9IChzdHJ1Y3QgaXdsMzk0NV90eF9jbWQgKiljbWQtPmNtZC5wYXlsb2FkOwotCV9fbGUzMiB0eF9mbGFncyA9IHR4X2NtZC0+dHhfZmxhZ3M7Ci0JX19sZTE2IGZjID0gaGRyLT5mcmFtZV9jb250cm9sOwotCi0JdHhfY21kLT5zdG9wX3RpbWUubGlmZV90aW1lID0gVFhfQ01EX0xJRkVfVElNRV9JTkZJTklURTsKLQlpZiAoIShpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfTk9fQUNLKSkgewotCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX0FDS19NU0s7Ci0JCWlmIChpZWVlODAyMTFfaXNfbWdtdChmYykpCi0JCQl0eF9mbGFncyB8PSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCQlpZiAoaWVlZTgwMjExX2lzX3Byb2JlX3Jlc3AoZmMpICYmCi0JCSAgICAhKGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICYgMHhmKSkKLQkJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfVFNGX01TSzsKLQl9IGVsc2UgewotCQl0eF9mbGFncyAmPSAoflRYX0NNRF9GTEdfQUNLX01TSyk7Ci0JCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7Ci0JfQotCi0JdHhfY21kLT5zdGFfaWQgPSBzdGRfaWQ7Ci0JaWYgKGllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGZjKSkKLQkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19NT1JFX0ZSQUdfTVNLOwotCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykpIHsKLQkJdTggKnFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0JCXR4X2NtZC0+dGlkX3RzcGVjID0gcWNbMF0gJiAweGY7Ci0JCXR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCX0gZWxzZSB7Ci0JCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7Ci0JfQotCi0JaXdsX2xlZ2FjeV90eF9jbWRfcHJvdGVjdGlvbihwcml2LCBpbmZvLCBmYywgJnR4X2ZsYWdzKTsKLQotCXR4X2ZsYWdzICY9IH4oVFhfQ01EX0ZMR19BTlRfU0VMX01TSyk7Ci0JaWYgKGllZWU4MDIxMV9pc19tZ210KGZjKSkgewotCQlpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShmYykgfHwgaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKLQkJCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gY3B1X3RvX2xlMTYoMyk7Ci0JCWVsc2UKLQkJCXR4X2NtZC0+dGltZW91dC5wbV9mcmFtZV90aW1lb3V0ID0gY3B1X3RvX2xlMTYoMik7Ci0JfSBlbHNlIHsKLQkJdHhfY21kLT50aW1lb3V0LnBtX2ZyYW1lX3RpbWVvdXQgPSAwOwotCX0KLQotCXR4X2NtZC0+ZHJpdmVyX3R4b3AgPSAwOwotCXR4X2NtZC0+dHhfZmxhZ3MgPSB0eF9mbGFnczsKLQl0eF9jbWQtPm5leHRfZnJhbWVfbGVuID0gMDsKLX0KLQotLyoKLSAqIHN0YXJ0IFJFUExZX1RYIGNvbW1hbmQgcHJvY2VzcwotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfdHhfc2tiKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQlzdHJ1Y3QgaXdsMzk0NV90eF9jbWQgKnR4X2NtZDsKLQlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSBOVUxMOwotCXN0cnVjdCBpd2xfcXVldWUgKnEgPSBOVUxMOwotCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqb3V0X2NtZDsKLQlzdHJ1Y3QgaXdsX2NtZF9tZXRhICpvdXRfbWV0YTsKLQlkbWFfYWRkcl90IHBoeXNfYWRkcjsKLQlkbWFfYWRkcl90IHR4Y21kX3BoeXM7Ci0JaW50IHR4cV9pZCA9IHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpOwotCXUxNiBsZW4sIGlkeCwgaGRyX2xlbjsKLQl1OCBpZDsKLQl1OCB1bmljYXN0OwotCXU4IHN0YV9pZDsKLQl1OCB0aWQgPSAwOwotCV9fbGUxNiBmYzsKLQl1OCB3YWl0X3dyaXRlX3B0ciA9IDA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaWYgKGl3bF9sZWdhY3lfaXNfcmZraWxsKHByaXYpKSB7Ci0JCUlXTF9ERUJVR19EUk9QKHByaXYsICJEcm9wcGluZyAtIFJGIEtJTExcbiIpOwotCQlnb3RvIGRyb3BfdW5sb2NrOwotCX0KLQotCWlmICgoaWVlZTgwMjExX2dldF90eF9yYXRlKHByaXYtPmh3LCBpbmZvKS0+aHdfdmFsdWUgJiAweEZGKSA9PSBJV0xfSU5WQUxJRF9SQVRFKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVSUk9SOiBObyBUWCByYXRlIGF2YWlsYWJsZS5cbiIpOwotCQlnb3RvIGRyb3BfdW5sb2NrOwotCX0KLQotCXVuaWNhc3QgPSAhaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSk7Ci0JaWQgPSAwOwotCi0JZmMgPSBoZHItPmZyYW1lX2NvbnRyb2w7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaWVlZTgwMjExX2lzX2F1dGgoZmMpKQotCQlJV0xfREVCVUdfVFgocHJpdiwgIlNlbmRpbmcgQVVUSCBmcmFtZVxuIik7Ci0JZWxzZSBpZiAoaWVlZTgwMjExX2lzX2Fzc29jX3JlcShmYykpCi0JCUlXTF9ERUJVR19UWChwcml2LCAiU2VuZGluZyBBU1NPQyBmcmFtZVxuIik7Ci0JZWxzZSBpZiAoaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSkKLQkJSVdMX0RFQlVHX1RYKHByaXYsICJTZW5kaW5nIFJFQVNTT0MgZnJhbWVcbiIpOwotI2VuZGlmCi0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQloZHJfbGVuID0gaWVlZTgwMjExX2hkcmxlbihmYyk7Ci0KLQkvKiBGaW5kIGluZGV4IGludG8gc3RhdGlvbiB0YWJsZSBmb3IgZGVzdGluYXRpb24gc3RhdGlvbiAqLwotCXN0YV9pZCA9IGl3bF9sZWdhY3lfc3RhX2lkX29yX2Jyb2FkY2FzdCgKLQkJCXByaXYsICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSwKLQkJCWluZm8tPmNvbnRyb2wuc3RhKTsKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pIHsKLQkJSVdMX0RFQlVHX0RST1AocHJpdiwgIkRyb3BwaW5nIC0gSU5WQUxJRCBTVEFUSU9OOiAlcE1cbiIsCi0JCQkgICAgICAgaGRyLT5hZGRyMSk7Ci0JCWdvdG8gZHJvcDsKLQl9Ci0KLQlJV0xfREVCVUdfUkFURShwcml2LCAic3RhdGlvbiBJZCAlZFxuIiwgc3RhX2lkKTsKLQotCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpKSB7Ci0JCXU4ICpxYyA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwotCQl0aWQgPSBxY1swXSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwotCQlpZiAodW5saWtlbHkodGlkID49IE1BWF9USURfQ09VTlQpKQotCQkJZ290byBkcm9wOwotCX0KLQotCS8qIERlc2NyaXB0b3IgZm9yIGNob3NlbiBUeCBxdWV1ZSAqLwotCXR4cSA9ICZwcml2LT50eHFbdHhxX2lkXTsKLQlxID0gJnR4cS0+cTsKLQotCWlmICgoaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyaykpCi0JCWdvdG8gZHJvcDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpZHggPSBpd2xfbGVnYWN5X2dldF9jbWRfaW5kZXgocSwgcS0+d3JpdGVfcHRyLCAwKTsKLQotCS8qIFNldCB1cCBkcml2ZXIgZGF0YSBmb3IgdGhpcyBURkQgKi8KLQltZW1zZXQoJih0eHEtPnR4YltxLT53cml0ZV9wdHJdKSwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfdHhfaW5mbykpOwotCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uc2tiID0gc2tiOwotCXR4cS0+dHhiW3EtPndyaXRlX3B0cl0uY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JLyogSW5pdCBmaXJzdCBlbXB0eSBlbnRyeSBpbiBxdWV1ZSdzIGFycmF5IG9mIFR4L2NtZCBidWZmZXJzICovCi0Jb3V0X2NtZCA9IHR4cS0+Y21kW2lkeF07Ci0Jb3V0X21ldGEgPSAmdHhxLT5tZXRhW2lkeF07Ci0JdHhfY21kID0gKHN0cnVjdCBpd2wzOTQ1X3R4X2NtZCAqKW91dF9jbWQtPmNtZC5wYXlsb2FkOwotCW1lbXNldCgmb3V0X2NtZC0+aGRyLCAwLCBzaXplb2Yob3V0X2NtZC0+aGRyKSk7Ci0JbWVtc2V0KHR4X2NtZCwgMCwgc2l6ZW9mKCp0eF9jbWQpKTsKLQotCS8qCi0JICogU2V0IHVwIHRoZSBUeC1jb21tYW5kIChub3QgTUFDISkgaGVhZGVyLgotCSAqIFN0b3JlIHRoZSBjaG9zZW4gVHggcXVldWUgYW5kIFRGRCBpbmRleCB3aXRoaW4gdGhlIHNlcXVlbmNlIGZpZWxkOwotCSAqIGFmdGVyIFR4LCB1Q29kZSdzIFR4IHJlc3BvbnNlIHdpbGwgcmV0dXJuIHRoaXMgdmFsdWUgc28gZHJpdmVyIGNhbgotCSAqIGxvY2F0ZSB0aGUgZnJhbWUgd2l0aGluIHRoZSB0eCBxdWV1ZSBhbmQgZG8gcG9zdC10eCBwcm9jZXNzaW5nLgotCSAqLwotCW91dF9jbWQtPmhkci5jbWQgPSBSRVBMWV9UWDsKLQlvdXRfY21kLT5oZHIuc2VxdWVuY2UgPSBjcHVfdG9fbGUxNigodTE2KShRVUVVRV9UT19TRVEodHhxX2lkKSB8Ci0JCQkJSU5ERVhfVE9fU0VRKHEtPndyaXRlX3B0cikpKTsKLQotCS8qIENvcHkgTUFDIGhlYWRlciBmcm9tIHNrYiBpbnRvIGNvbW1hbmQgYnVmZmVyICovCi0JbWVtY3B5KHR4X2NtZC0+aGRyLCBoZHIsIGhkcl9sZW4pOwotCi0KLQlpZiAoaW5mby0+Y29udHJvbC5od19rZXkpCi0JCWl3bDM5NDVfYnVpbGRfdHhfY21kX2h3Y3J5cHRvKHByaXYsIGluZm8sIG91dF9jbWQsIHNrYiwgc3RhX2lkKTsKLQotCS8qIFRPRE8gbmVlZCB0aGlzIGZvciBidXJzdCBtb2RlIGxhdGVyIG9uICovCi0JaXdsMzk0NV9idWlsZF90eF9jbWRfYmFzaWMocHJpdiwgb3V0X2NtZCwgaW5mbywgaGRyLCBzdGFfaWQpOwotCi0JLyogc2V0IGlzX2hjY2EgdG8gMDsgaXQgcHJvYmFibHkgd2lsbCBuZXZlciBiZSBpbXBsZW1lbnRlZCAqLwotCWl3bDM5NDVfaHdfYnVpbGRfdHhfY21kX3JhdGUocHJpdiwgb3V0X2NtZCwgaW5mbywgaGRyLCBzdGFfaWQsIDApOwotCi0JLyogVG90YWwgIyBieXRlcyB0byBiZSB0cmFuc21pdHRlZCAqLwotCWxlbiA9ICh1MTYpc2tiLT5sZW47Ci0JdHhfY21kLT5sZW4gPSBjcHVfdG9fbGUxNihsZW4pOwotCi0JaXdsX2xlZ2FjeV9kYmdfbG9nX3R4X2RhdGFfZnJhbWUocHJpdiwgbGVuLCBoZHIpOwotCWl3bF9sZWdhY3lfdXBkYXRlX3N0YXRzKHByaXYsIHRydWUsIGZjLCBsZW4pOwotCXR4X2NtZC0+dHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfQU5UX0FfTVNLOwotCXR4X2NtZC0+dHhfZmxhZ3MgJj0gflRYX0NNRF9GTEdfQU5UX0JfTVNLOwotCi0JaWYgKCFpZWVlODAyMTFfaGFzX21vcmVmcmFncyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXR4cS0+bmVlZF91cGRhdGUgPSAxOwotCX0gZWxzZSB7Ci0JCXdhaXRfd3JpdGVfcHRyID0gMTsKLQkJdHhxLT5uZWVkX3VwZGF0ZSA9IDA7Ci0JfQotCi0JSVdMX0RFQlVHX1RYKHByaXYsICJzZXF1ZW5jZSBuciA9IDBYJXhcbiIsCi0JCSAgICAgbGUxNl90b19jcHUob3V0X2NtZC0+aGRyLnNlcXVlbmNlKSk7Ci0JSVdMX0RFQlVHX1RYKHByaXYsICJ0eF9mbGFncyA9IDBYJXhcbiIsIGxlMzJfdG9fY3B1KHR4X2NtZC0+dHhfZmxhZ3MpKTsKLQlpd2xfcHJpbnRfaGV4X2R1bXAocHJpdiwgSVdMX0RMX1RYLCB0eF9jbWQsIHNpemVvZigqdHhfY21kKSk7Ci0JaXdsX3ByaW50X2hleF9kdW1wKHByaXYsIElXTF9ETF9UWCwgKHU4ICopdHhfY21kLT5oZHIsCi0JCQkgICBpZWVlODAyMTFfaGRybGVuKGZjKSk7Ci0KLQkvKgotCSAqIFVzZSB0aGUgZmlyc3QgZW1wdHkgZW50cnkgaW4gdGhpcyBxdWV1ZSdzIGNvbW1hbmQgYnVmZmVyIGFycmF5Ci0JICogdG8gY29udGFpbiB0aGUgVHggY29tbWFuZCBhbmQgTUFDIGhlYWRlciBjb25jYXRlbmF0ZWQgdG9nZXRoZXIKLQkgKiAocGF5bG9hZCBkYXRhIHdpbGwgYmUgaW4gYW5vdGhlciBidWZmZXIpLgotCSAqIFNpemUgb2YgdGhpcyB2YXJpZXMsIGR1ZSB0byB2YXJ5aW5nIE1BQyBoZWFkZXIgbGVuZ3RoLgotCSAqIElmIGVuZCBpcyBub3QgZHdvcmQgYWxpZ25lZCwgd2UnbGwgaGF2ZSAyIGV4dHJhIGJ5dGVzIGF0IHRoZSBlbmQKLQkgKiBvZiB0aGUgTUFDIGhlYWRlciAoZGV2aWNlIHJlYWRzIG9uIGR3b3JkIGJvdW5kYXJpZXMpLgotCSAqIFdlJ2xsIHRlbGwgZGV2aWNlIGFib3V0IHRoaXMgcGFkZGluZyBsYXRlci4KLQkgKi8KLQlsZW4gPSBzaXplb2Yoc3RydWN0IGl3bDM5NDVfdHhfY21kKSArCi0JCQlzaXplb2Yoc3RydWN0IGl3bF9jbWRfaGVhZGVyKSArIGhkcl9sZW47Ci0JbGVuID0gKGxlbiArIDMpICYgfjM7Ci0KLQkvKiBQaHlzaWNhbCBhZGRyZXNzIG9mIHRoaXMgVHggY29tbWFuZCdzIGhlYWRlciAobm90IE1BQyBoZWFkZXIhKSwKLQkgKiB3aXRoaW4gY29tbWFuZCBidWZmZXIgYXJyYXkuICovCi0JdHhjbWRfcGh5cyA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBjaV9kZXYsICZvdXRfY21kLT5oZHIsCi0JCQkJICAgIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7Ci0JLyogd2UgZG8gbm90IG1hcCBtZXRhIGRhdGEgLi4uIHNvIHdlIGNhbiBzYWZlbHkgYWNjZXNzIGFkZHJlc3MgdG8KLQkgKiBwcm92aWRlIHRvIHVubWFwIGNvbW1hbmQqLwotCWRtYV91bm1hcF9hZGRyX3NldChvdXRfbWV0YSwgbWFwcGluZywgdHhjbWRfcGh5cyk7Ci0JZG1hX3VubWFwX2xlbl9zZXQob3V0X21ldGEsIGxlbiwgbGVuKTsKLQotCS8qIEFkZCBidWZmZXIgY29udGFpbmluZyBUeCBjb21tYW5kIGFuZCBNQUMoISkgaGVhZGVyIHRvIFRGRCdzCi0JICogZmlyc3QgZW50cnkgKi8KLQlwcml2LT5jZmctPm9wcy0+bGliLT50eHFfYXR0YWNoX2J1Zl90b190ZmQocHJpdiwgdHhxLAotCQkJCQkJICAgdHhjbWRfcGh5cywgbGVuLCAxLCAwKTsKLQotCi0JLyogU2V0IHVwIFRGRCdzIDJuZCBlbnRyeSB0byBwb2ludCBkaXJlY3RseSB0byByZW1haW5kZXIgb2Ygc2tiLAotCSAqIGlmIGFueSAoODAyLjExIG51bGwgZnJhbWVzIGhhdmUgbm8gcGF5bG9hZCkuICovCi0JbGVuID0gc2tiLT5sZW4gLSBoZHJfbGVuOwotCWlmIChsZW4pIHsKLQkJcGh5c19hZGRyID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGNpX2Rldiwgc2tiLT5kYXRhICsgaGRyX2xlbiwKLQkJCQkJICAgbGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsKLQkJcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+dHhxX2F0dGFjaF9idWZfdG9fdGZkKHByaXYsIHR4cSwKLQkJCQkJCQkgICBwaHlzX2FkZHIsIGxlbiwKLQkJCQkJCQkgICAwLCBVMzJfUEFEKGxlbikpOwotCX0KLQotCi0JLyogVGVsbCBkZXZpY2UgdGhlIHdyaXRlIGluZGV4ICpqdXN0IHBhc3QqIHRoaXMgbGF0ZXN0IGZpbGxlZCBURkQgKi8KLQlxLT53cml0ZV9wdHIgPSBpd2xfbGVnYWN5X3F1ZXVlX2luY193cmFwKHEtPndyaXRlX3B0ciwgcS0+bl9iZCk7Ci0JaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCB0eHEpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWlmICgoaXdsX2xlZ2FjeV9xdWV1ZV9zcGFjZShxKSA8IHEtPmhpZ2hfbWFyaykKLQkgICAgJiYgcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkgewotCQlpZiAod2FpdF93cml0ZV9wdHIpIHsKLQkJCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCQl0eHEtPm5lZWRfdXBkYXRlID0gMTsKLQkJCWl3bF9sZWdhY3lfdHhxX3VwZGF0ZV93cml0ZV9wdHIocHJpdiwgdHhxKTsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWl3bF9sZWdhY3lfc3RvcF9xdWV1ZShwcml2LCB0eHEpOwotCX0KLQotCXJldHVybiAwOwotCi1kcm9wX3VubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci1kcm9wOgotCXJldHVybiAtMTsKLX0KLQotc3RhdGljIGludCBpd2wzOTQ1X2dldF9tZWFzdXJlbWVudChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9tZWFzdXJlbWVudF9wYXJhbXMgKnBhcmFtcywKLQkJCSAgICAgICB1OCB0eXBlKQotewotCXN0cnVjdCBpd2xfc3BlY3RydW1fY21kIHNwZWN0cnVtOwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1NQRUNUUlVNX01FQVNVUkVNRU5UX0NNRCwKLQkJLmRhdGEgPSAodm9pZCAqKSZzcGVjdHJ1bSwKLQkJLmZsYWdzID0gQ01EX1dBTlRfU0tCLAotCX07Ci0JdTMyIGFkZF90aW1lID0gbGU2NF90b19jcHUocGFyYW1zLT5zdGFydF90aW1lKTsKLQlpbnQgcmM7Ci0JaW50IHNwZWN0cnVtX3Jlc3Bfc3RhdHVzOwotCWludCBkdXJhdGlvbiA9IGxlMTZfdG9fY3B1KHBhcmFtcy0+ZHVyYXRpb24pOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkKHByaXYsIElXTF9SWE9OX0NUWF9CU1MpKQotCQlhZGRfdGltZSA9IGl3bF9sZWdhY3lfdXNlY3NfdG9fYmVhY29ucyhwcml2LAotCQkJbGU2NF90b19jcHUocGFyYW1zLT5zdGFydF90aW1lKSAtIHByaXYtPl8zOTQ1Lmxhc3RfdHNmLAotCQkJbGUxNl90b19jcHUoY3R4LT50aW1pbmcuYmVhY29uX2ludGVydmFsKSk7Ci0KLQltZW1zZXQoJnNwZWN0cnVtLCAwLCBzaXplb2Yoc3BlY3RydW0pKTsKLQotCXNwZWN0cnVtLmNoYW5uZWxfY291bnQgPSBjcHVfdG9fbGUxNigxKTsKLQlzcGVjdHJ1bS5mbGFncyA9Ci0JICAgIFJYT05fRkxHX1RTRjJIT1NUX01TSyB8IFJYT05fRkxHX0FOVF9BX01TSyB8IFJYT05fRkxHX0RJU19ESVZfTVNLOwotCXNwZWN0cnVtLmZpbHRlcl9mbGFncyA9IE1FQVNVUkVNRU5UX0ZJTFRFUl9GTEFHOwotCWNtZC5sZW4gPSBzaXplb2Yoc3BlY3RydW0pOwotCXNwZWN0cnVtLmxlbiA9IGNwdV90b19sZTE2KGNtZC5sZW4gLSBzaXplb2Yoc3BlY3RydW0ubGVuKSk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19hc3NvY2lhdGVkKHByaXYsIElXTF9SWE9OX0NUWF9CU1MpKQotCQlzcGVjdHJ1bS5zdGFydF90aW1lID0KLQkJCWl3bF9sZWdhY3lfYWRkX2JlYWNvbl90aW1lKHByaXYsCi0JCQkJcHJpdi0+XzM5NDUubGFzdF9iZWFjb25fdGltZSwgYWRkX3RpbWUsCi0JCQkJbGUxNl90b19jcHUoY3R4LT50aW1pbmcuYmVhY29uX2ludGVydmFsKSk7Ci0JZWxzZQotCQlzcGVjdHJ1bS5zdGFydF90aW1lID0gMDsKLQotCXNwZWN0cnVtLmNoYW5uZWxzWzBdLmR1cmF0aW9uID0gY3B1X3RvX2xlMzIoZHVyYXRpb24gKiBUSU1FX1VOSVQpOwotCXNwZWN0cnVtLmNoYW5uZWxzWzBdLmNoYW5uZWwgPSBwYXJhbXMtPmNoYW5uZWw7Ci0Jc3BlY3RydW0uY2hhbm5lbHNbMF0udHlwZSA9IHR5cGU7Ci0JaWYgKGN0eC0+YWN0aXZlLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKQotCQlzcGVjdHJ1bS5mbGFncyB8PSBSWE9OX0ZMR19CQU5EXzI0R19NU0sgfAotCQkgICAgUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLIHwgUlhPTl9GTEdfVEdHX1BST1RFQ1RfTVNLOwotCi0JcmMgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMocHJpdiwgJmNtZCk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQlwa3QgPSAoc3RydWN0IGl3bF9yeF9wYWNrZXQgKiljbWQucmVwbHlfcGFnZTsKLQlpZiAocGt0LT5oZHIuZmxhZ3MgJiBJV0xfQ01EX0ZBSUxFRF9NU0spIHsKLQkJSVdMX0VSUihwcml2LCAiQmFkIHJldHVybiBmcm9tIFJFUExZX1JYX09OX0FTU09DIGNvbW1hbmRcbiIpOwotCQlyYyA9IC1FSU87Ci0JfQotCi0Jc3BlY3RydW1fcmVzcF9zdGF0dXMgPSBsZTE2X3RvX2NwdShwa3QtPnUuc3BlY3RydW0uc3RhdHVzKTsKLQlzd2l0Y2ggKHNwZWN0cnVtX3Jlc3Bfc3RhdHVzKSB7Ci0JY2FzZSAwOgkJLyogQ29tbWFuZCB3aWxsIGJlIGhhbmRsZWQgKi8KLQkJaWYgKHBrdC0+dS5zcGVjdHJ1bS5pZCAhPSAweGZmKSB7Ci0JCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUmVwbGFjZWQgZXhpc3RpbmcgbWVhc3VyZW1lbnQ6ICVkXG4iLAotCQkJCQkJcGt0LT51LnNwZWN0cnVtLmlkKTsKLQkJCXByaXYtPm1lYXN1cmVtZW50X3N0YXR1cyAmPSB+TUVBU1VSRU1FTlRfUkVBRFk7Ci0JCX0KLQkJcHJpdi0+bWVhc3VyZW1lbnRfc3RhdHVzIHw9IE1FQVNVUkVNRU5UX0FDVElWRTsKLQkJcmMgPSAwOwotCQlicmVhazsKLQotCWNhc2UgMToJCS8qIENvbW1hbmQgd2lsbCBub3QgYmUgaGFuZGxlZCAqLwotCQlyYyA9IC1FQUdBSU47Ci0JCWJyZWFrOwotCX0KLQotCWl3bF9sZWdhY3lfZnJlZV9wYWdlcyhwcml2LCBjbWQucmVwbHlfcGFnZSk7Ci0KLQlyZXR1cm4gcmM7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfcmVwbHlfYWxpdmUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2xfYWxpdmVfcmVzcCAqcGFsaXZlOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgKnB3b3JrOwotCi0JcGFsaXZlID0gJnBrdC0+dS5hbGl2ZV9mcmFtZTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJBbGl2ZSB1Y29kZSBzdGF0dXMgMHglMDhYIHJldmlzaW9uICIKLQkJICAgICAgICIweCUwMVggMHglMDFYXG4iLAotCQkgICAgICAgcGFsaXZlLT5pc192YWxpZCwgcGFsaXZlLT52ZXJfdHlwZSwKLQkJICAgICAgIHBhbGl2ZS0+dmVyX3N1YnR5cGUpOwotCi0JaWYgKHBhbGl2ZS0+dmVyX3N1YnR5cGUgPT0gSU5JVElBTElaRV9TVUJUWVBFKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXphdGlvbiBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCQltZW1jcHkoJnByaXYtPmNhcmRfYWxpdmVfaW5pdCwgJnBrdC0+dS5hbGl2ZV9mcmFtZSwKLQkJICAgICAgIHNpemVvZihzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3ApKTsKLQkJcHdvcmsgPSAmcHJpdi0+aW5pdF9hbGl2ZV9zdGFydDsKLQl9IGVsc2UgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUnVudGltZSBBbGl2ZSByZWNlaXZlZC5cbiIpOwotCQltZW1jcHkoJnByaXYtPmNhcmRfYWxpdmUsICZwa3QtPnUuYWxpdmVfZnJhbWUsCi0JCSAgICAgICBzaXplb2Yoc3RydWN0IGl3bF9hbGl2ZV9yZXNwKSk7Ci0JCXB3b3JrID0gJnByaXYtPmFsaXZlX3N0YXJ0OwotCQlpd2wzOTQ1X2Rpc2FibGVfZXZlbnRzKHByaXYpOwotCX0KLQotCS8qIFdlIGRlbGF5IHRoZSBBTElWRSByZXNwb25zZSBieSA1bXMgdG8KLQkgKiBnaXZlIHRoZSBIVyBSRiBLaWxsIHRpbWUgdG8gYWN0aXZhdGUuLi4gKi8KLQlpZiAocGFsaXZlLT5pc192YWxpZCA9PSBVQ09ERV9WQUxJRF9PSykKLQkJcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgcHdvcmssCi0JCQkJICAgbXNlY3NfdG9famlmZmllcyg1KSk7Ci0JZWxzZQotCQlJV0xfV0FSTihwcml2LCAidUNvZGUgZGlkIG5vdCByZXNwb25kIE9LLlxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfcmVwbHlfYWRkX3N0YShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotI2VuZGlmCi0KLQlJV0xfREVCVUdfUlgocHJpdiwgIlJlY2VpdmVkIFJFUExZX0FERF9TVEE6IDB4JTAyWFxuIiwgcGt0LT51LnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfYmVhY29uX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsMzk0NV9iZWFjb25fbm90aWYgKmJlYWNvbiA9ICYocGt0LT51LmJlYWNvbl9zdGF0dXMpOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCXU4IHJhdGUgPSBiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLnJhdGU7Ci0KLQlJV0xfREVCVUdfUlgocHJpdiwgImJlYWNvbiBzdGF0dXMgJXggcmV0cmllcyAlZCBpc3MgJWQgIgotCQkidHNmICVkICVkIHJhdGUgJWRcbiIsCi0JCWxlMzJfdG9fY3B1KGJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIuc3RhdHVzKSAmIFRYX1NUQVRVU19NU0ssCi0JCWJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIuZmFpbHVyZV9mcmFtZSwKLQkJbGUzMl90b19jcHUoYmVhY29uLT5pYnNzX21ncl9zdGF0dXMpLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmhpZ2hfdHNmKSwKLQkJbGUzMl90b19jcHUoYmVhY29uLT5sb3dfdHNmKSwgcmF0ZSk7Ci0jZW5kaWYKLQotCXByaXYtPmlic3NfbWFuYWdlciA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKTsKLQotfQotCi0vKiBIYW5kbGUgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUgdGhhdCBjYXJkJ3MgcG93ZXIgc3RhdGUgaXMgY2hhbmdpbmcKLSAqIGR1ZSB0byBzb2Z0d2FyZSwgaGFyZHdhcmUsIG9yIGNyaXRpY2FsIHRlbXBlcmF0dXJlIFJGS0lMTCAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yeF9jYXJkX3N0YXRlX25vdGlmKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIpCi17Ci0Jc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0JdTMyIGZsYWdzID0gbGUzMl90b19jcHUocGt0LT51LmNhcmRfc3RhdGVfbm90aWYuZmxhZ3MpOwotCXVuc2lnbmVkIGxvbmcgc3RhdHVzID0gcHJpdi0+c3RhdHVzOwotCi0JSVdMX1dBUk4ocHJpdiwgIkNhcmQgc3RhdGUgcmVjZWl2ZWQ6IEhXOiVzIFNXOiVzXG4iLAotCQkJICAoZmxhZ3MgJiBIV19DQVJEX0RJU0FCTEVEKSA/ICJLaWxsIiA6ICJPbiIsCi0JCQkgIChmbGFncyAmIFNXX0NBUkRfRElTQUJMRUQpID8gIktpbGwiIDogIk9uIik7Ci0KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9TRVQsCi0JCSAgICBDU1JfVUNPREVfRFJWX0dQMV9CSVRfQ01EX0JMT0NLRUQpOwotCi0JaWYgKGZsYWdzICYgSFdfQ0FSRF9ESVNBQkxFRCkKLQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JZWxzZQotCQljbGVhcl9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCi0KLQlpd2xfbGVnYWN5X3NjYW5fY2FuY2VsKHByaXYpOwotCi0JaWYgKCh0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnN0YXR1cykgIT0KLQkgICAgIHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSkpCi0JCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+aHctPndpcGh5LAotCQkJCXRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSk7Ci0JZWxzZQotCQl3YWtlX3VwKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotfQotCi0vKioKLSAqIGl3bDM5NDVfc2V0dXBfcnhfaGFuZGxlcnMgLSBJbml0aWFsaXplIFJ4IGhhbmRsZXIgY2FsbGJhY2tzCi0gKgotICogU2V0dXAgdGhlIFJYIGhhbmRsZXJzIGZvciBlYWNoIG9mIHRoZSByZXBseSB0eXBlcyBzZW50IGZyb20gdGhlIHVDb2RlCi0gKiB0byB0aGUgaG9zdC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNoYWlucyBpbnRvIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBmaWxlcyBmb3IgdGhlbSB0byBzZXR1cAotICogYW55IGhhcmR3YXJlIHNwZWNpZmljIGhhbmRsZXJzIGFzIHdlbGwuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfc2V0dXBfcnhfaGFuZGxlcnMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX0FMSVZFXSA9IGl3bDM5NDVfcnhfcmVwbHlfYWxpdmU7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfQUREX1NUQV0gPSBpd2wzOTQ1X3J4X3JlcGx5X2FkZF9zdGE7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfRVJST1JdID0gaXdsX2xlZ2FjeV9yeF9yZXBseV9lcnJvcjsKLQlwcml2LT5yeF9oYW5kbGVyc1tDSEFOTkVMX1NXSVRDSF9OT1RJRklDQVRJT05dID0gaXdsX2xlZ2FjeV9yeF9jc2E7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbU1BFQ1RSVU1fTUVBU1VSRV9OT1RJRklDQVRJT05dID0KLQkJCWl3bF9sZWdhY3lfcnhfc3BlY3RydW1fbWVhc3VyZV9ub3RpZjsKLQlwcml2LT5yeF9oYW5kbGVyc1tQTV9TTEVFUF9OT1RJRklDQVRJT05dID0gaXdsX2xlZ2FjeV9yeF9wbV9zbGVlcF9ub3RpZjsKLQlwcml2LT5yeF9oYW5kbGVyc1tQTV9ERUJVR19TVEFUSVNUSUNfTk9USUZJQ10gPQotCSAgICBpd2xfbGVnYWN5X3J4X3BtX2RlYnVnX3N0YXRpc3RpY3Nfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbQkVBQ09OX05PVElGSUNBVElPTl0gPSBpd2wzOTQ1X3J4X2JlYWNvbl9ub3RpZjsKLQotCS8qCi0JICogVGhlIHNhbWUgaGFuZGxlciBpcyB1c2VkIGZvciBib3RoIHRoZSBSRVBMWSB0byBhIGRpc2NyZXRlCi0JICogc3RhdGlzdGljcyByZXF1ZXN0IGZyb20gdGhlIGhvc3QgYXMgd2VsbCBhcyBmb3IgdGhlIHBlcmlvZGljCi0JICogc3RhdGlzdGljcyBub3RpZmljYXRpb25zIChhZnRlciByZWNlaXZlZCBiZWFjb25zKSBmcm9tIHRoZSB1Q29kZS4KLQkgKi8KLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9TVEFUSVNUSUNTX0NNRF0gPSBpd2wzOTQ1X3JlcGx5X3N0YXRpc3RpY3M7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbU1RBVElTVElDU19OT1RJRklDQVRJT05dID0gaXdsMzk0NV9od19yeF9zdGF0aXN0aWNzOwotCi0JaXdsX2xlZ2FjeV9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKHByaXYpOwotCXByaXYtPnJ4X2hhbmRsZXJzW0NBUkRfU1RBVEVfTk9USUZJQ0FUSU9OXSA9IGl3bDM5NDVfcnhfY2FyZF9zdGF0ZV9ub3RpZjsKLQotCS8qIFNldCB1cCBoYXJkd2FyZSBzcGVjaWZpYyBSeCBoYW5kbGVycyAqLwotCWl3bDM5NDVfaHdfcnhfaGFuZGxlcl9zZXR1cChwcml2KTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqIFJYLUZVTkNUSU9OUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFJ4IHRoZW9yeSBvZiBvcGVyYXRpb24KLSAqCi0gKiBUaGUgaG9zdCBhbGxvY2F0ZXMgMzIgRE1BIHRhcmdldCBhZGRyZXNzZXMgYW5kIHBhc3NlcyB0aGUgaG9zdCBhZGRyZXNzCi0gKiB0byB0aGUgZmlybXdhcmUgYXQgcmVnaXN0ZXIgSVdMX1JGRFNfVEFCTEVfTE9XRVIgKyBOICogUkZEX1NJWkUgd2hlcmUgTiBpcwotICogMCB0byAzMQotICoKLSAqIFJ4IFF1ZXVlIEluZGV4ZXMKLSAqIFRoZSBob3N0L2Zpcm13YXJlIHNoYXJlIHR3byBpbmRleCByZWdpc3RlcnMgZm9yIG1hbmFnaW5nIHRoZSBSeCBidWZmZXJzLgotICoKLSAqIFRoZSBSRUFEIGluZGV4IG1hcHMgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIHRoYXQgdGhlIGZpcm13YXJlIG1heSBiZSB3cml0aW5nCi0gKiB0byAtLSB0aGUgZHJpdmVyIGNhbiByZWFkIHVwIHRvIChidXQgbm90IGluY2x1ZGluZykgdGhpcyBwb3NpdGlvbiBhbmQgZ2V0Ci0gKiBnb29kIGRhdGEuCi0gKiBUaGUgUkVBRCBpbmRleCBpcyBtYW5hZ2VkIGJ5IHRoZSBmaXJtd2FyZSBvbmNlIHRoZSBjYXJkIGlzIGVuYWJsZWQuCi0gKgotICogVGhlIFdSSVRFIGluZGV4IG1hcHMgdG8gdGhlIGxhc3QgcG9zaXRpb24gdGhlIGRyaXZlciBoYXMgcmVhZCBmcm9tIC0tIHRoZQotICogcG9zaXRpb24gcHJlY2VkaW5nIFdSSVRFIGlzIHRoZSBsYXN0IHNsb3QgdGhlIGZpcm13YXJlIGNhbiBwbGFjZSBhIHBhY2tldC4KLSAqCi0gKiBUaGUgcXVldWUgaXMgZW1wdHkgKG5vIGdvb2QgZGF0YSkgaWYgV1JJVEUgPSBSRUFEIC0gMSwgYW5kIGlzIGZ1bGwgaWYKLSAqIFdSSVRFID0gUkVBRC4KLSAqCi0gKiBEdXJpbmcgaW5pdGlhbGl6YXRpb24sIHRoZSBob3N0IHNldHMgdXAgdGhlIFJFQUQgcXVldWUgcG9zaXRpb24gdG8gdGhlIGZpcnN0Ci0gKiBJTkRFWCBwb3NpdGlvbiwgYW5kIFdSSVRFIHRvIHRoZSBsYXN0IChSRUFEIC0gMSB3cmFwcGVkKQotICoKLSAqIFdoZW4gdGhlIGZpcm13YXJlIHBsYWNlcyBhIHBhY2tldCBpbiBhIGJ1ZmZlciwgaXQgd2lsbCBhZHZhbmNlIHRoZSBSRUFEIGluZGV4Ci0gKiBhbmQgZmlyZSB0aGUgUlggaW50ZXJydXB0LiAgVGhlIGRyaXZlciBjYW4gdGhlbiBxdWVyeSB0aGUgUkVBRCBpbmRleCBhbmQKLSAqIHByb2Nlc3MgYXMgbWFueSBwYWNrZXRzIGFzIHBvc3NpYmxlLCBtb3ZpbmcgdGhlIFdSSVRFIGluZGV4IGZvcndhcmQgYXMgaXQKLSAqIHJlc2V0cyB0aGUgUnggcXVldWUgYnVmZmVycyB3aXRoIG5ldyBtZW1vcnkuCi0gKgotICogVGhlIG1hbmFnZW1lbnQgaW4gdGhlIGRyaXZlciBpcyBhcyBmb2xsb3dzOgotICogKyBBIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBTS0JzIGlzIHN0b3JlZCBpbiBpd2wtPnJ4cS0+cnhfZnJlZS4gIFdoZW4KLSAqICAgaXdsLT5yeHEtPmZyZWVfY291bnQgZHJvcHMgdG8gb3IgYmVsb3cgUlhfTE9XX1dBVEVSTUFSSywgd29yayBpcyBzY2hlZHVsZWQKLSAqICAgdG8gcmVwbGVuaXNoIHRoZSBpd2wtPnJ4cS0+cnhfZnJlZS4KLSAqICsgSW4gaXdsMzk0NV9yeF9yZXBsZW5pc2ggKHNjaGVkdWxlZCkgaWYgJ3Byb2Nlc3NlZCcgIT0gJ3JlYWQnIHRoZW4gdGhlCi0gKiAgIGl3bC0+cnhxIGlzIHJlcGxlbmlzaGVkIGFuZCB0aGUgUkVBRCBJTkRFWCBpcyB1cGRhdGVkICh1cGRhdGluZyB0aGUKLSAqICAgJ3Byb2Nlc3NlZCcgYW5kICdyZWFkJyBkcml2ZXIgaW5kZXhlcyBhcyB3ZWxsKQotICogKyBBIHJlY2VpdmVkIHBhY2tldCBpcyBwcm9jZXNzZWQgYW5kIGhhbmRlZCB0byB0aGUga2VybmVsIG5ldHdvcmsgc3RhY2ssCi0gKiAgIGRldGFjaGVkIGZyb20gdGhlIGl3bC0+cnhxLiAgVGhlIGRyaXZlciAncHJvY2Vzc2VkJyBpbmRleCBpcyB1cGRhdGVkLgotICogKyBUaGUgSG9zdC9GaXJtd2FyZSBpd2wtPnJ4cSBpcyByZXBsZW5pc2hlZCBhdCB0YXNrbGV0IHRpbWUgZnJvbSB0aGUgcnhfZnJlZQotICogICBsaXN0LiBJZiB0aGVyZSBhcmUgbm8gYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gaXdsLT5yeHEtPnJ4X2ZyZWUsIHRoZSBSRUFECi0gKiAgIElOREVYIGlzIG5vdCBpbmNyZW1lbnRlZCBhbmQgaXdsLT5zdGF0dXMoUlhfU1RBTExFRCkgaXMgc2V0LiAgSWYgdGhlcmUKLSAqICAgd2VyZSBlbm91Z2ggZnJlZSBidWZmZXJzIGFuZCBSWF9TVEFMTEVEIGlzIHNldCBpdCBpcyBjbGVhcmVkLgotICoKLSAqCi0gKiBEcml2ZXIgc2VxdWVuY2U6Ci0gKgotICogaXdsMzk0NV9yeF9yZXBsZW5pc2goKSAgICAgUmVwbGVuaXNoZXMgcnhfZnJlZSBsaXN0IGZyb20gcnhfdXNlZCwgYW5kIGNhbGxzCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2sKLSAqIGl3bDM5NDVfcnhfcXVldWVfcmVzdG9jaygpIE1vdmVzIGF2YWlsYWJsZSBidWZmZXJzIGZyb20gcnhfZnJlZSBpbnRvIFJ4Ci0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSwgdXBkYXRlcyBmaXJtd2FyZSBwb2ludGVycywgYW5kIHVwZGF0ZXMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBXUklURSBpbmRleC4gIElmIGluc3VmZmljaWVudCByeF9mcmVlIGJ1ZmZlcnMKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUsIHNjaGVkdWxlcyBpd2wzOTQ1X3J4X3JlcGxlbmlzaAotICoKLSAqIC0tIGVuYWJsZSBpbnRlcnJ1cHRzIC0tCi0gKiBJU1IgLSBpd2wzOTQ1X3J4KCkgICAgICAgICBEZXRhY2ggaXdsX3J4X21lbV9idWZmZXJzIGZyb20gcG9vbCB1cCB0byB0aGUKLSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQUQgSU5ERVgsIGRldGFjaGluZyB0aGUgU0tCIGZyb20gdGhlIHBvb2wuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3ZlcyB0aGUgcGFja2V0IGJ1ZmZlciBmcm9tIHF1ZXVlIHRvIHJ4X3VzZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxscyBpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2sgdG8gcmVmaWxsIGFueSBlbXB0eQotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHMuCi0gKiAuLi4KLSAqCi0gKi8KLQotLyoqCi0gKiBpd2wzOTQ1X2RtYV9hZGRyMnJiZF9wdHIgLSBjb252ZXJ0IGEgRE1BIGFkZHJlc3MgdG8gYSB1Q29kZSByZWFkIGJ1ZmZlciBwdHIKLSAqLwotc3RhdGljIGlubGluZSBfX2xlMzIgaXdsMzk0NV9kbWFfYWRkcjJyYmRfcHRyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJICBkbWFfYWRkcl90IGRtYV9hZGRyKQotewotCXJldHVybiBjcHVfdG9fbGUzMigodTMyKWRtYV9hZGRyKTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2sgLSByZWZpbGwgUlggcXVldWUgZnJvbSBwcmUtYWxsb2NhdGVkIHBvb2wKLSAqCi0gKiBJZiB0aGVyZSBhcmUgc2xvdHMgaW4gdGhlIFJYIHF1ZXVlIHRoYXQgbmVlZCB0byBiZSByZXN0b2NrZWQsCi0gKiBhbmQgd2UgaGF2ZSBmcmVlIHByZS1hbGxvY2F0ZWQgYnVmZmVycywgZmlsbCB0aGUgcmFua3MgYXMgbXVjaAotICogYXMgd2UgY2FuLCBwdWxsaW5nIGZyb20gcnhfZnJlZS4KLSAqCi0gKiBUaGlzIG1vdmVzIHRoZSAnd3JpdGUnIGluZGV4IGZvcndhcmQgdG8gY2F0Y2ggdXAgd2l0aCAncHJvY2Vzc2VkJywgYW5kCi0gKiBhbHNvIHVwZGF0ZXMgdGhlIG1lbW9yeSBhZGRyZXNzIGluIHRoZSBmaXJtd2FyZSB0byByZWZlcmVuY2UgdGhlIG5ldwotICogdGFyZ2V0IGJ1ZmZlci4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yeF9xdWV1ZV9yZXN0b2NrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEgPSAmcHJpdi0+cnhxOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7Ci0Jc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGI7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgd3JpdGU7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0Jd3JpdGUgPSByeHEtPndyaXRlICYgfjB4NzsKLQl3aGlsZSAoKGl3bF9sZWdhY3lfcnhfcXVldWVfc3BhY2UocnhxKSA+IDApICYmIChyeHEtPmZyZWVfY291bnQpKSB7Ci0JCS8qIEdldCBuZXh0IGZyZWUgUnggYnVmZmVyLCByZW1vdmUgZnJvbSBmcmVlIGxpc3QgKi8KLQkJZWxlbWVudCA9IHJ4cS0+cnhfZnJlZS5uZXh0OwotCQlyeGIgPSBsaXN0X2VudHJ5KGVsZW1lbnQsIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciwgbGlzdCk7Ci0JCWxpc3RfZGVsKGVsZW1lbnQpOwotCi0JCS8qIFBvaW50IHRvIFJ4IGJ1ZmZlciB2aWEgbmV4dCBSQkQgaW4gY2lyY3VsYXIgYnVmZmVyICovCi0JCXJ4cS0+YmRbcnhxLT53cml0ZV0gPSBpd2wzOTQ1X2RtYV9hZGRyMnJiZF9wdHIocHJpdiwgcnhiLT5wYWdlX2RtYSk7Ci0JCXJ4cS0+cXVldWVbcnhxLT53cml0ZV0gPSByeGI7Ci0JCXJ4cS0+d3JpdGUgPSAocnhxLT53cml0ZSArIDEpICYgUlhfUVVFVUVfTUFTSzsKLQkJcnhxLT5mcmVlX2NvdW50LS07Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCS8qIElmIHRoZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlciBwb29sIGlzIGRyb3BwaW5nIGxvdywgc2NoZWR1bGUgdG8KLQkgKiByZWZpbGwgaXQgKi8KLQlpZiAocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUkspCi0JCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+cnhfcmVwbGVuaXNoKTsKLQotCi0JLyogSWYgd2UndmUgYWRkZWQgbW9yZSBzcGFjZSBmb3IgdGhlIGZpcm13YXJlIHRvIHBsYWNlIGRhdGEsIHRlbGwgaXQuCi0JICogSW5jcmVtZW50IGRldmljZSdzIHdyaXRlIHBvaW50ZXIgaW4gbXVsdGlwbGVzIG9mIDguICovCi0JaWYgKChyeHEtPndyaXRlX2FjdHVhbCAhPSAocnhxLT53cml0ZSAmIH4weDcpKQotCSAgICB8fCAoYWJzKHJ4cS0+d3JpdGUgLSByeHEtPnJlYWQpID4gNykpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQlyeHEtPm5lZWRfdXBkYXRlID0gMTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0JCWl3bF9sZWdhY3lfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihwcml2LCByeHEpOwotCX0KLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3J4X3JlcGxlbmlzaCAtIE1vdmUgYWxsIHVzZWQgcGFja2V0IGZyb20gcnhfdXNlZCB0byByeF9mcmVlCi0gKgotICogV2hlbiBtb3ZpbmcgdG8gcnhfZnJlZSBhbiBTS0IgaXMgYWxsb2NhdGVkIGZvciB0aGUgc2xvdC4KLSAqCi0gKiBBbHNvIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHZpYSBpd2wzOTQ1X3J4X3F1ZXVlX3Jlc3RvY2suCi0gKiBUaGlzIGlzIGNhbGxlZCBhcyBhIHNjaGVkdWxlZCB3b3JrIGl0ZW0gKGV4Y2VwdCBmb3IgZHVyaW5nIGluaXRpYWxpemF0aW9uKQotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X2FsbG9jYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgZ2ZwX3QgcHJpb3JpdHkpCi17Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbGVtZW50OwotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JZ2ZwX3QgZ2ZwX21hc2sgPSBwcmlvcml0eTsKLQotCXdoaWxlICgxKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQotCQlpZiAobGlzdF9lbXB0eSgmcnhxLT5yeF91c2VkKSkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0KLQkJaWYgKHJ4cS0+ZnJlZV9jb3VudCA+IFJYX0xPV19XQVRFUk1BUkspCi0JCQlnZnBfbWFzayB8PSBfX0dGUF9OT1dBUk47Ci0KLQkJaWYgKHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID4gMCkKLQkJCWdmcF9tYXNrIHw9IF9fR0ZQX0NPTVA7Ci0KLQkJLyogQWxsb2MgYSBuZXcgcmVjZWl2ZSBidWZmZXIgKi8KLQkJcGFnZSA9IGFsbG9jX3BhZ2VzKGdmcF9tYXNrLCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlcik7Ci0JCWlmICghcGFnZSkgewotCQkJaWYgKG5ldF9yYXRlbGltaXQoKSkKLQkJCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRmFpbGVkIHRvIGFsbG9jYXRlIFNLQiBidWZmZXIuXG4iKTsKLQkJCWlmICgocnhxLT5mcmVlX2NvdW50IDw9IFJYX0xPV19XQVRFUk1BUkspICYmCi0JCQkgICAgbmV0X3JhdGVsaW1pdCgpKQotCQkJCUlXTF9DUklUKHByaXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgU0tCIGJ1ZmZlciB3aXRoICVzLiBPbmx5ICV1IGZyZWUgYnVmZmVycyByZW1haW5pbmcuXG4iLAotCQkJCQkgcHJpb3JpdHkgPT0gR0ZQX0FUT01JQyA/ICAiR0ZQX0FUT01JQyIgOiAiR0ZQX0tFUk5FTCIsCi0JCQkJCSByeHEtPmZyZWVfY291bnQpOwotCQkJLyogV2UgZG9uJ3QgcmVzY2hlZHVsZSByZXBsZW5pc2ggd29yayBoZXJlIC0tIHdlIHdpbGwKLQkJCSAqIGNhbGwgdGhlIHJlc3RvY2sgbWV0aG9kIGFuZCBpZiBpdCBzdGlsbCBuZWVkcwotCQkJICogbW9yZSBidWZmZXJzIGl0IHdpbGwgc2NoZWR1bGUgcmVwbGVuaXNoICovCi0JCQlicmVhazsKLQkJfQotCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKGxpc3RfZW1wdHkoJnJ4cS0+cnhfdXNlZCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQkJX19mcmVlX3BhZ2VzKHBhZ2UsIHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyKTsKLQkJCXJldHVybjsKLQkJfQotCQllbGVtZW50ID0gcnhxLT5yeF91c2VkLm5leHQ7Ci0JCXJ4YiA9IGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyLCBsaXN0KTsKLQkJbGlzdF9kZWwoZWxlbWVudCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCXJ4Yi0+cGFnZSA9IHBhZ2U7Ci0JCS8qIEdldCBwaHlzaWNhbCBhZGRyZXNzIG9mIFJCL1NLQiAqLwotCQlyeGItPnBhZ2VfZG1hID0gcGNpX21hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHBhZ2UsIDAsCi0JCQkJUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAotCQkJCVBDSV9ETUFfRlJPTURFVklDRSk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7Ci0JCXJ4cS0+ZnJlZV9jb3VudCsrOwotCQlwcml2LT5hbGxvY19yeGJfcGFnZSsrOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCX0KLX0KLQotdm9pZCBpd2wzOTQ1X3J4X3F1ZXVlX3Jlc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IGk7Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X2ZyZWUpOwotCUlOSVRfTElTVF9IRUFEKCZyeHEtPnJ4X3VzZWQpOwotCS8qIEZpbGwgdGhlIHJ4X3VzZWQgcXVldWUgd2l0aCBfYWxsXyBvZiB0aGUgUnggYnVmZmVycyAqLwotCWZvciAoaSA9IDA7IGkgPCBSWF9GUkVFX0JVRkZFUlMgKyBSWF9RVUVVRV9TSVpFOyBpKyspIHsKLQkJLyogSW4gdGhlIHJlc2V0IGZ1bmN0aW9uLCB0aGVzZSBidWZmZXJzIG1heSBoYXZlIGJlZW4gYWxsb2NhdGVkCi0JCSAqIHRvIGFuIFNLQiwgc28gd2UgbmVlZCB0byB1bm1hcCBhbmQgZnJlZSBwb3RlbnRpYWwgc3RvcmFnZSAqLwotCQlpZiAocnhxLT5wb29sW2ldLnBhZ2UgIT0gTlVMTCkgewotCQkJcGNpX3VubWFwX3BhZ2UocHJpdi0+cGNpX2RldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJX19pd2xfbGVnYWN5X2ZyZWVfcGFnZXMocHJpdiwgcnhxLT5wb29sW2ldLnBhZ2UpOwotCQkJcnhxLT5wb29sW2ldLnBhZ2UgPSBOVUxMOwotCQl9Ci0JCWxpc3RfYWRkX3RhaWwoJnJ4cS0+cG9vbFtpXS5saXN0LCAmcnhxLT5yeF91c2VkKTsKLQl9Ci0KLQkvKiBTZXQgdXMgc28gdGhhdCB3ZSBoYXZlIHByb2Nlc3NlZCBhbmQgdXNlZCBhbGwgYnVmZmVycywgYnV0IGhhdmUKLQkgKiBub3QgcmVzdG9ja2VkIHRoZSBSeCBxdWV1ZSB3aXRoIGZyZXNoIGJ1ZmZlcnMgKi8KLQlyeHEtPnJlYWQgPSByeHEtPndyaXRlID0gMDsKLQlyeHEtPndyaXRlX2FjdHVhbCA9IDA7Ci0JcnhxLT5mcmVlX2NvdW50ID0gMDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLX0KLQotdm9pZCBpd2wzOTQ1X3J4X3JlcGxlbmlzaCh2b2lkICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWl3bDM5NDVfcnhfYWxsb2NhdGUocHJpdiwgR0ZQX0tFUk5FTCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bDM5NDVfcnhfcXVldWVfcmVzdG9jayhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfcnhfcmVwbGVuaXNoX25vdyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaXdsMzk0NV9yeF9hbGxvY2F0ZShwcml2LCBHRlBfQVRPTUlDKTsKLQotCWl3bDM5NDVfcnhfcXVldWVfcmVzdG9jayhwcml2KTsKLX0KLQotCi0vKiBBc3N1bWVzIHRoYXQgdGhlIHNrYiBmaWVsZCBvZiB0aGUgYnVmZmVycyBpbiAncG9vbCcgaXMga2VwdCBhY2N1cmF0ZS4KLSAqIElmIGFuIFNLQiBoYXMgYmVlbiBkZXRhY2hlZCwgdGhlIFBPT0wgbmVlZHMgdG8gaGF2ZSBpdHMgU0tCIHNldCB0byBOVUxMCi0gKiBUaGlzIGZyZWUgcm91dGluZSB3YWxrcyB0aGUgbGlzdCBvZiBQT09MIGVudHJpZXMgYW5kIGlmIFNLQiBpcyBzZXQgdG8KLSAqIG5vbiBOVUxMIGl0IGlzIHVubWFwcGVkIGFuZCBmcmVlZAotICovCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X3J4X3F1ZXVlX2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4X3F1ZXVlICpyeHEpCi17Ci0JaW50IGk7Ci0JZm9yIChpID0gMDsgaSA8IFJYX1FVRVVFX1NJWkUgKyBSWF9GUkVFX0JVRkZFUlM7IGkrKykgewotCQlpZiAocnhxLT5wb29sW2ldLnBhZ2UgIT0gTlVMTCkgewotCQkJcGNpX3VubWFwX3BhZ2UocHJpdi0+cGNpX2RldiwgcnhxLT5wb29sW2ldLnBhZ2VfZG1hLAotCQkJCVBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJX19pd2xfbGVnYWN5X2ZyZWVfcGFnZXMocHJpdiwgcnhxLT5wb29sW2ldLnBhZ2UpOwotCQkJcnhxLT5wb29sW2ldLnBhZ2UgPSBOVUxMOwotCQl9Ci0JfQotCi0JZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBjaV9kZXYtPmRldiwgNCAqIFJYX1FVRVVFX1NJWkUsIHJ4cS0+YmQsCi0JCQkgIHJ4cS0+YmRfZG1hKTsKLQlkbWFfZnJlZV9jb2hlcmVudCgmcHJpdi0+cGNpX2Rldi0+ZGV2LCBzaXplb2Yoc3RydWN0IGl3bF9yYl9zdGF0dXMpLAotCQkJICByeHEtPnJiX3N0dHMsIHJ4cS0+cmJfc3R0c19kbWEpOwotCXJ4cS0+YmQgPSBOVUxMOwotCXJ4cS0+cmJfc3R0cyAgPSBOVUxMOwotfQotCi0KLS8qIENvbnZlcnQgbGluZWFyIHNpZ25hbC10by1ub2lzZSByYXRpbyBpbnRvIGRCICovCi1zdGF0aWMgdTggcmF0aW8yZEJbMTAwXSA9IHsKLS8qCSAwICAgMSAgIDIgICAzICAgNCAgIDUgICA2ICAgNyAgIDggICA5ICovCi0JIDAsICAwLCAgNiwgMTAsIDEyLCAxNCwgMTYsIDE3LCAxOCwgMTksIC8qIDAwIC0gMDkgKi8KLQkyMCwgMjEsIDIyLCAyMiwgMjMsIDIzLCAyNCwgMjUsIDI2LCAyNiwgLyogMTAgLSAxOSAqLwotCTI2LCAyNiwgMjYsIDI3LCAyNywgMjgsIDI4LCAyOCwgMjksIDI5LCAvKiAyMCAtIDI5ICovCi0JMjksIDMwLCAzMCwgMzAsIDMxLCAzMSwgMzEsIDMxLCAzMiwgMzIsIC8qIDMwIC0gMzkgKi8KLQkzMiwgMzIsIDMyLCAzMywgMzMsIDMzLCAzMywgMzMsIDM0LCAzNCwgLyogNDAgLSA0OSAqLwotCTM0LCAzNCwgMzQsIDM0LCAzNSwgMzUsIDM1LCAzNSwgMzUsIDM1LCAvKiA1MCAtIDU5ICovCi0JMzYsIDM2LCAzNiwgMzYsIDM2LCAzNiwgMzYsIDM3LCAzNywgMzcsIC8qIDYwIC0gNjkgKi8KLQkzNywgMzcsIDM3LCAzNywgMzcsIDM4LCAzOCwgMzgsIDM4LCAzOCwgLyogNzAgLSA3OSAqLwotCTM4LCAzOCwgMzgsIDM4LCAzOCwgMzksIDM5LCAzOSwgMzksIDM5LCAvKiA4MCAtIDg5ICovCi0JMzksIDM5LCAzOSwgMzksIDM5LCA0MCwgNDAsIDQwLCA0MCwgNDAgIC8qIDkwIC0gOTkgKi8KLX07Ci0KLS8qIENhbGN1bGF0ZXMgYSByZWxhdGl2ZSBkQiB2YWx1ZSBmcm9tIGEgcmF0aW8gb2YgbGluZWFyCi0gKiAgIChpLmUuIG5vdCBkQikgc2lnbmFsIGxldmVscy4KLSAqIENvbnZlcnNpb24gYXNzdW1lcyB0aGF0IGxldmVscyBhcmUgdm9sdGFnZXMgKDIwKmxvZyksIG5vdCBwb3dlcnMgKDEwKmxvZykuICovCi1pbnQgaXdsMzk0NV9jYWxjX2RiX2Zyb21fcmF0aW8oaW50IHNpZ19yYXRpbykKLXsKLQkvKiAxMDAwOjEgb3IgaGlnaGVyIGp1c3QgcmVwb3J0IGFzIDYwIGRCICovCi0JaWYgKHNpZ19yYXRpbyA+PSAxMDAwKQotCQlyZXR1cm4gNjA7Ci0KLQkvKiAxMDA6MSBvciBoaWdoZXIsIGRpdmlkZSBieSAxMCBhbmQgdXNlIHRhYmxlLAotCSAqICAgYWRkIDIwIGRCIHRvIG1ha2UgdXAgZm9yIGRpdmlkZSBieSAxMCAqLwotCWlmIChzaWdfcmF0aW8gPj0gMTAwKQotCQlyZXR1cm4gMjAgKyAoaW50KXJhdGlvMmRCW3NpZ19yYXRpby8xMF07Ci0KLQkvKiBXZSBzaG91bGRuJ3Qgc2VlIHRoaXMgKi8KLQlpZiAoc2lnX3JhdGlvIDwgMSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBVc2UgdGFibGUgZm9yIHJhdGlvcyAxOjEgLSA5OToxICovCi0JcmV0dXJuIChpbnQpcmF0aW8yZEJbc2lnX3JhdGlvXTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3J4X2hhbmRsZSAtIE1haW4gZW50cnkgZnVuY3Rpb24gZm9yIHJlY2VpdmluZyByZXNwb25zZXMgZnJvbSB1Q29kZQotICoKLSAqIFVzZXMgdGhlIHByaXYtPnJ4X2hhbmRsZXJzIGNhbGxiYWNrIGZ1bmN0aW9uIGFycmF5IHRvIGludm9rZQotICogdGhlIGFwcHJvcHJpYXRlIGhhbmRsZXJzLCBpbmNsdWRpbmcgY29tbWFuZCByZXNwb25zZXMsCi0gKiBmcmFtZS1yZWNlaXZlZCBub3RpZmljYXRpb25zLCBhbmQgb3RoZXIgbm90aWZpY2F0aW9ucy4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yeF9oYW5kbGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiOwotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3Q7Ci0Jc3RydWN0IGl3bF9yeF9xdWV1ZSAqcnhxID0gJnByaXYtPnJ4cTsKLQl1MzIgciwgaTsKLQlpbnQgcmVjbGFpbTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXU4IGZpbGxfcnggPSAwOwotCXUzMiBjb3VudCA9IDg7Ci0JaW50IHRvdGFsX2VtcHR5ID0gMDsKLQotCS8qIHVDb2RlJ3MgcmVhZCBpbmRleCAoc3RvcmVkIGluIHNoYXJlZCBEUkFNKSBpbmRpY2F0ZXMgdGhlIGxhc3QgUngKLQkgKiBidWZmZXIgdGhhdCB0aGUgZHJpdmVyIG1heSBwcm9jZXNzIChsYXN0IGJ1ZmZlciBmaWxsZWQgYnkgdWNvZGUpLiAqLwotCXIgPSBsZTE2X3RvX2NwdShyeHEtPnJiX3N0dHMtPmNsb3NlZF9yYl9udW0pICYgIDB4MEZGRjsKLQlpID0gcnhxLT5yZWFkOwotCi0JLyogY2FsY3VsYXRlIHRvdGFsIGZyYW1lcyBuZWVkIHRvIGJlIHJlc3RvY2sgYWZ0ZXIgaGFuZGxpbmcgUlggKi8KLQl0b3RhbF9lbXB0eSA9IHIgLSByeHEtPndyaXRlX2FjdHVhbDsKLQlpZiAodG90YWxfZW1wdHkgPCAwKQotCQl0b3RhbF9lbXB0eSArPSBSWF9RVUVVRV9TSVpFOwotCi0JaWYgKHRvdGFsX2VtcHR5ID4gKFJYX1FVRVVFX1NJWkUgLyAyKSkKLQkJZmlsbF9yeCA9IDE7Ci0JLyogUnggaW50ZXJydXB0LCBidXQgbm90aGluZyBzZW50IGZyb20gdUNvZGUgKi8KLQlpZiAoaSA9PSByKQotCQlJV0xfREVCVUdfUlgocHJpdiwgInIgPSAlZCwgaSA9ICVkXG4iLCByLCBpKTsKLQotCXdoaWxlIChpICE9IHIpIHsKLQkJaW50IGxlbjsKLQotCQlyeGIgPSByeHEtPnF1ZXVlW2ldOwotCi0JCS8qIElmIGFuIFJYQiBkb2Vzbid0IGhhdmUgYSBSeCBxdWV1ZSBzbG90IGFzc29jaWF0ZWQgd2l0aCBpdCwKLQkJICogdGhlbiBhIGJ1ZyBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIHRoZSBxdWV1ZSByZWZpbGxpbmcKLQkJICogcm91dGluZXMgLS0gY2F0Y2ggaXQgaGVyZSAqLwotCQlCVUdfT04ocnhiID09IE5VTEwpOwotCi0JCXJ4cS0+cXVldWVbaV0gPSBOVUxMOwotCi0JCXBjaV91bm1hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4Yi0+cGFnZV9kbWEsCi0JCQkgICAgICAgUEFHRV9TSVpFIDw8IHByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyLAotCQkJICAgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7Ci0JCXBrdCA9IHJ4Yl9hZGRyKHJ4Yik7Ci0KLQkJbGVuID0gbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSzsKLQkJbGVuICs9IHNpemVvZih1MzIpOyAvKiBhY2NvdW50IGZvciBzdGF0dXMgd29yZCAqLwotCQl0cmFjZV9pd2x3aWZpX2xlZ2FjeV9kZXZfcngocHJpdiwgcGt0LCBsZW4pOwotCi0JCS8qIFJlY2xhaW0gYSBjb21tYW5kIGJ1ZmZlciBvbmx5IGlmIHRoaXMgcGFja2V0IGlzIGEgcmVzcG9uc2UKLQkJICogICB0byBhIChkcml2ZXItb3JpZ2luYXRlZCkgY29tbWFuZC4KLQkJICogSWYgdGhlIHBhY2tldCAoZS5nLiBSeCBmcmFtZSkgb3JpZ2luYXRlZCBmcm9tIHVDb2RlLAotCQkgKiAgIHRoZXJlIGlzIG5vIGNvbW1hbmQgYnVmZmVyIHRvIHJlY2xhaW0uCi0JCSAqIFVjb2RlIHNob3VsZCBzZXQgU0VRX1JYX0ZSQU1FIGJpdCBpZiB1Y29kZS1vcmlnaW5hdGVkLAotCQkgKiAgIGJ1dCBhcHBhcmVudGx5IGEgZmV3IGRvbid0IGdldCBzZXQ7IGNhdGNoIHRoZW0gaGVyZS4gKi8KLQkJcmVjbGFpbSA9ICEocGt0LT5oZHIuc2VxdWVuY2UgJiBTRVFfUlhfRlJBTUUpICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFNUQVRJU1RJQ1NfTk9USUZJQ0FUSU9OKSAmJgotCQkJKHBrdC0+aGRyLmNtZCAhPSBSRVBMWV9UWCk7Ci0KLQkJLyogQmFzZWQgb24gdHlwZSBvZiBjb21tYW5kIHJlc3BvbnNlIG9yIG5vdGlmaWNhdGlvbiwKLQkJICogICBoYW5kbGUgdGhvc2UgdGhhdCBuZWVkIGhhbmRsaW5nIHZpYSBmdW5jdGlvbiBpbgotCQkgKiAgIHJ4X2hhbmRsZXJzIHRhYmxlLiAgU2VlIGl3bDM5NDVfc2V0dXBfcnhfaGFuZGxlcnMoKSAqLwotCQlpZiAocHJpdi0+cnhfaGFuZGxlcnNbcGt0LT5oZHIuY21kXSkgewotCQkJSVdMX0RFQlVHX1JYKHByaXYsICJyID0gJWQsIGkgPSAlZCwgJXMsIDB4JTAyeFxuIiwgciwgaSwKLQkJCWl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwgcGt0LT5oZHIuY21kKTsKLQkJCXByaXYtPmlzcl9zdGF0cy5yeF9oYW5kbGVyc1twa3QtPmhkci5jbWRdKys7Ci0JCQlwcml2LT5yeF9oYW5kbGVyc1twa3QtPmhkci5jbWRdIChwcml2LCByeGIpOwotCQl9IGVsc2UgewotCQkJLyogTm8gaGFuZGxpbmcgbmVlZGVkICovCi0JCQlJV0xfREVCVUdfUlgocHJpdiwKLQkJCQkiciAlZCBpICVkIE5vIGhhbmRsZXIgbmVlZGVkIGZvciAlcywgMHglMDJ4XG4iLAotCQkJCXIsIGksIGl3bF9sZWdhY3lfZ2V0X2NtZF9zdHJpbmcocGt0LT5oZHIuY21kKSwKLQkJCQlwa3QtPmhkci5jbWQpOwotCQl9Ci0KLQkJLyoKLQkJICogWFhYOiBBZnRlciBoZXJlLCB3ZSBzaG91bGQgYWx3YXlzIGNoZWNrIHJ4Yi0+cGFnZQotCQkgKiBhZ2FpbnN0IE5VTEwgYmVmb3JlIHRvdWNoaW5nIGl0IG9yIGl0cyB2aXJ0dWFsCi0JCSAqIG1lbW9yeSAocGt0KS4gQmVjYXVzZSBzb21lIHJ4X2hhbmRsZXIgbWlnaHQgaGF2ZQotCQkgKiBhbHJlYWR5IHRha2VuIG9yIGZyZWVkIHRoZSBwYWdlcy4KLQkJICovCi0KLQkJaWYgKHJlY2xhaW0pIHsKLQkJCS8qIEludm9rZSBhbnkgY2FsbGJhY2tzLCB0cmFuc2ZlciB0aGUgYnVmZmVyIHRvIGNhbGxlciwKLQkJCSAqIGFuZCBmaXJlIG9mZiB0aGUgKHBvc3NpYmx5KSBibG9ja2luZyBpd2xfbGVnYWN5X3NlbmRfY21kKCkKLQkJCSAqIGFzIHdlIHJlY2xhaW0gdGhlIGRyaXZlciBjb21tYW5kIHF1ZXVlICovCi0JCQlpZiAocnhiLT5wYWdlKQotCQkJCWl3bF9sZWdhY3lfdHhfY21kX2NvbXBsZXRlKHByaXYsIHJ4Yik7Ci0JCQllbHNlCi0JCQkJSVdMX1dBUk4ocHJpdiwgIkNsYWltIG51bGwgcnhiP1xuIik7Ci0JCX0KLQotCQkvKiBSZXVzZSB0aGUgcGFnZSBpZiBwb3NzaWJsZS4gRm9yIG5vdGlmaWNhdGlvbiBwYWNrZXRzIGFuZAotCQkgKiBTS0JzIHRoYXQgZmFpbCB0byBSeCBjb3JyZWN0bHksIGFkZCB0aGVtIGJhY2sgaW50byB0aGUKLQkJICogcnhfZnJlZSBsaXN0IGZvciByZXVzZSBsYXRlci4gKi8KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCQlpZiAocnhiLT5wYWdlICE9IE5VTEwpIHsKLQkJCXJ4Yi0+cGFnZV9kbWEgPSBwY2lfbWFwX3BhZ2UocHJpdi0+cGNpX2RldiwgcnhiLT5wYWdlLAotCQkJCTAsIFBBR0VfU0laRSA8PCBwcml2LT5od19wYXJhbXMucnhfcGFnZV9vcmRlciwKLQkJCQlQQ0lfRE1BX0ZST01ERVZJQ0UpOwotCQkJbGlzdF9hZGRfdGFpbCgmcnhiLT5saXN0LCAmcnhxLT5yeF9mcmVlKTsKLQkJCXJ4cS0+ZnJlZV9jb3VudCsrOwotCQl9IGVsc2UKLQkJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfdXNlZCk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnhxLT5sb2NrLCBmbGFncyk7Ci0KLQkJaSA9IChpICsgMSkgJiBSWF9RVUVVRV9NQVNLOwotCQkvKiBJZiB0aGVyZSBhcmUgYSBsb3Qgb2YgdW51c2VkIGZyYW1lcywKLQkJICogcmVzdG9jayB0aGUgUnggcXVldWUgc28gdWNvZGUgd29uJ3QgYXNzZXJ0LiAqLwotCQlpZiAoZmlsbF9yeCkgewotCQkJY291bnQrKzsKLQkJCWlmIChjb3VudCA+PSA4KSB7Ci0JCQkJcnhxLT5yZWFkID0gaTsKLQkJCQlpd2wzOTQ1X3J4X3JlcGxlbmlzaF9ub3cocHJpdik7Ci0JCQkJY291bnQgPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JLyogQmFja3RyYWNrIG9uZSBlbnRyeSAqLwotCXJ4cS0+cmVhZCA9IGk7Ci0JaWYgKGZpbGxfcngpCi0JCWl3bDM5NDVfcnhfcmVwbGVuaXNoX25vdyhwcml2KTsKLQllbHNlCi0JCWl3bDM5NDVfcnhfcXVldWVfcmVzdG9jayhwcml2KTsKLX0KLQotLyogY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGZsdXNoIGFueSBzY2hlZHVsZWQgdGFza2xldCAqLwotc3RhdGljIGlubGluZSB2b2lkIGl3bDM5NDVfc3luY2hyb25pemVfaXJxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiB3YWl0IHRvIG1ha2Ugc3VyZSB3ZSBmbHVzaCBwZW5kaW5nIHRhc2tsZXQqLwotCXN5bmNocm9uaXplX2lycShwcml2LT5wY2lfZGV2LT5pcnEpOwotCXRhc2tsZXRfa2lsbCgmcHJpdi0+aXJxX3Rhc2tsZXQpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqaXdsMzk0NV9kZXNjX2xvb2t1cChpbnQgaSkKLXsKLQlzd2l0Y2ggKGkpIHsKLQljYXNlIDE6Ci0JCXJldHVybiAiRkFJTCI7Ci0JY2FzZSAyOgotCQlyZXR1cm4gIkJBRF9QQVJBTSI7Ci0JY2FzZSAzOgotCQlyZXR1cm4gIkJBRF9DSEVDS1NVTSI7Ci0JY2FzZSA0OgotCQlyZXR1cm4gIk5NSV9JTlRFUlJVUFQiOwotCWNhc2UgNToKLQkJcmV0dXJuICJTWVNBU1NFUlQiOwotCWNhc2UgNjoKLQkJcmV0dXJuICJGQVRBTF9FUlJPUiI7Ci0JfQotCi0JcmV0dXJuICJVTktOT1dOIjsKLX0KLQotI2RlZmluZSBFUlJPUl9TVEFSVF9PRkZTRVQgICgxICogc2l6ZW9mKHUzMikpCi0jZGVmaW5lIEVSUk9SX0VMRU1fU0laRSAgICAgKDcgKiBzaXplb2YodTMyKSkKLQotdm9pZCBpd2wzOTQ1X2R1bXBfbmljX2Vycm9yX2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTMyIGk7Ci0JdTMyIGRlc2MsIHRpbWUsIGNvdW50LCBiYXNlLCBkYXRhMTsKLQl1MzIgYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyOwotCi0JYmFzZSA9IGxlMzJfdG9fY3B1KHByaXYtPmNhcmRfYWxpdmUuZXJyb3JfZXZlbnRfdGFibGVfcHRyKTsKLQotCWlmICghaXdsMzk0NV9od192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7Ci0JCUlXTF9FUlIocHJpdiwgIk5vdCB2YWxpZCBlcnJvciBsb2cgcG9pbnRlciAweCUwOFhcbiIsIGJhc2UpOwotCQlyZXR1cm47Ci0JfQotCi0KLQljb3VudCA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlKTsKLQotCWlmIChFUlJPUl9TVEFSVF9PRkZTRVQgPD0gY291bnQgKiBFUlJPUl9FTEVNX1NJWkUpIHsKLQkJSVdMX0VSUihwcml2LCAiU3RhcnQgSVdMIEVycm9yIExvZyBEdW1wOlxuIik7Ci0JCUlXTF9FUlIocHJpdiwgIlN0YXR1czogMHglMDhsWCwgY291bnQ6ICVkXG4iLAotCQkJcHJpdi0+c3RhdHVzLCBjb3VudCk7Ci0JfQotCi0JSVdMX0VSUihwcml2LCAiRGVzYyAgICAgICBUaW1lICAgICAgIGFzcnRQQyAgYmxpbmsyICIKLQkJICAiaWxpbmsxICBubWlQQyAgIExpbmVcbiIpOwotCWZvciAoaSA9IEVSUk9SX1NUQVJUX09GRlNFVDsKLQkgICAgIGkgPCAoY291bnQgKiBFUlJPUl9FTEVNX1NJWkUpICsgRVJST1JfU1RBUlRfT0ZGU0VUOwotCSAgICAgaSArPSBFUlJPUl9FTEVNX1NJWkUpIHsKLQkJZGVzYyA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgaSk7Ci0JCXRpbWUgPQotCQkgICAgaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyBpICsgMSAqIHNpemVvZih1MzIpKTsKLQkJYmxpbmsxID0KLQkJICAgIGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgaSArIDIgKiBzaXplb2YodTMyKSk7Ci0JCWJsaW5rMiA9Ci0JCSAgICBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIGkgKyAzICogc2l6ZW9mKHUzMikpOwotCQlpbGluazEgPQotCQkgICAgaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyBpICsgNCAqIHNpemVvZih1MzIpKTsKLQkJaWxpbmsyID0KLQkJICAgIGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgaSArIDUgKiBzaXplb2YodTMyKSk7Ci0JCWRhdGExID0KLQkJICAgIGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgaSArIDYgKiBzaXplb2YodTMyKSk7Ci0KLQkJSVdMX0VSUihwcml2LAotCQkJIiUtMTNzICgweCVYKSAlMDEwdSAweCUwNVggMHglMDVYIDB4JTA1WCAweCUwNVggJXVcblxuIiwKLQkJCWl3bDM5NDVfZGVzY19sb29rdXAoZGVzYyksIGRlc2MsIHRpbWUsIGJsaW5rMSwgYmxpbmsyLAotCQkJaWxpbmsxLCBpbGluazIsIGRhdGExKTsKLQkJdHJhY2VfaXdsd2lmaV9sZWdhY3lfZGV2X3Vjb2RlX2Vycm9yKHByaXYsIGRlc2MsIHRpbWUsIGRhdGExLCAwLAotCQkJCQkwLCBibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazIpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9pcnFfdGFza2xldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTMyIGludGEsIGhhbmRsZWQgPSAwOwotCXUzMiBpbnRhX2ZoOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JdTMyIGludGFfbWFzazsKLSNlbmRpZgotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIEFjay9jbGVhci9yZXNldCBwZW5kaW5nIHVDb2RlIGludGVycnVwdHMuCi0JICogTm90ZTogIFNvbWUgYml0cyBpbiBDU1JfSU5UIGFyZSAiT1IiIG9mIGJpdHMgaW4gQ1NSX0ZIX0lOVF9TVEFUVVMsCi0JICogIGFuZCB3aWxsIGNsZWFyIG9ubHkgd2hlbiBDU1JfRkhfSU5UX1NUQVRVUyBnZXRzIGNsZWFyZWQuICovCi0JaW50YSA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0lOVCk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVCwgaW50YSk7Ci0KLQkvKiBBY2svY2xlYXIvcmVzZXQgcGVuZGluZyBmbG93LWhhbmRsZXIgKERNQSkgaW50ZXJydXB0cy4KLQkgKiBBbnkgbmV3IGludGVycnVwdHMgdGhhdCBoYXBwZW4gYWZ0ZXIgdGhpcywgZWl0aGVyIHdoaWxlIHdlJ3JlCi0JICogaW4gdGhpcyB0YXNrbGV0LCBvciBsYXRlciwgd2lsbCBzaG93IHVwIGluIG5leHQgSVNSL3Rhc2tsZXQuICovCi0JaW50YV9maCA9IGl3bF9yZWFkMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTLCBpbnRhX2ZoKTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCWlmIChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIElXTF9ETF9JU1IpIHsKLQkJLyoganVzdCBmb3IgZGVidWcgKi8KLQkJaW50YV9tYXNrID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UX01BU0spOwotCQlJV0xfREVCVUdfSVNSKHByaXYsICJpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eFxuIiwKLQkJCSAgICAgIGludGEsIGludGFfbWFzaywgaW50YV9maCk7Ci0JfQotI2VuZGlmCi0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBTaW5jZSBDU1JfSU5UIGFuZCBDU1JfRkhfSU5UX1NUQVRVUyByZWFkcyBhbmQgY2xlYXJzIGFyZSBub3QKLQkgKiBhdG9taWMsIG1ha2Ugc3VyZSB0aGF0IGludGEgY292ZXJzIGFsbCB0aGUgaW50ZXJydXB0cyB0aGF0Ci0JICogd2UndmUgZGlzY292ZXJlZCwgZXZlbiBpZiBGSCBpbnRlcnJ1cHQgY2FtZSBpbiBqdXN0IGFmdGVyCi0JICogcmVhZGluZyBDU1JfSU5ULiAqLwotCWlmIChpbnRhX2ZoICYgQ1NSMzlfRkhfSU5UX1JYX01BU0spCi0JCWludGEgfD0gQ1NSX0lOVF9CSVRfRkhfUlg7Ci0JaWYgKGludGFfZmggJiBDU1IzOV9GSF9JTlRfVFhfTUFTSykKLQkJaW50YSB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKLQotCS8qIE5vdyBzZXJ2aWNlIGFsbCBpbnRlcnJ1cHQgYml0cyBkaXNjb3ZlcmVkIGFib3ZlLiAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfSFdfRVJSKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkhhcmR3YXJlIGVycm9yIGRldGVjdGVkLiAgUmVzdGFydGluZy5cbiIpOwotCi0JCS8qIFRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLwotCQlpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQotCQlwcml2LT5pc3Jfc3RhdHMuaHcrKzsKLQkJaXdsX2xlZ2FjeV9pcnFfaGFuZGxlX2Vycm9yKHByaXYpOwotCi0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfSFdfRVJSOwotCi0JCXJldHVybjsKLQl9Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQlpZiAoaXdsX2xlZ2FjeV9nZXRfZGVidWdfbGV2ZWwocHJpdikgJiAoSVdMX0RMX0lTUikpIHsKLQkJLyogTklDIGZpcmVzIHRoaXMsIGJ1dCB3ZSBkb24ndCB1c2UgaXQsIHJlZHVuZGFudCB3aXRoIFdBS0VVUCAqLwotCQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1NDRCkgewotCQkJSVdMX0RFQlVHX0lTUihwcml2LCAiU2NoZWR1bGVyIGZpbmlzaGVkIHRvIHRyYW5zbWl0ICIKLQkJCQkgICAgICAidGhlIGZyYW1lL2ZyYW1lcy5cbiIpOwotCQkJcHJpdi0+aXNyX3N0YXRzLnNjaCsrOwotCQl9Ci0KLQkJLyogQWxpdmUgbm90aWZpY2F0aW9uIHZpYSBSeCBpbnRlcnJ1cHQgd2lsbCBkbyB0aGUgcmVhbCB3b3JrICovCi0JCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfQUxJVkUpIHsKLQkJCUlXTF9ERUJVR19JU1IocHJpdiwgIkFsaXZlIGludGVycnVwdFxuIik7Ci0JCQlwcml2LT5pc3Jfc3RhdHMuYWxpdmUrKzsKLQkJfQotCX0KLSNlbmRpZgotCS8qIFNhZmVseSBpZ25vcmUgdGhlc2UgYml0cyBmb3IgZGVidWcgY2hlY2tzIGJlbG93ICovCi0JaW50YSAmPSB+KENTUl9JTlRfQklUX1NDRCB8IENTUl9JTlRfQklUX0FMSVZFKTsKLQotCS8qIEVycm9yIGRldGVjdGVkIGJ5IHVDb2RlICovCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9TV19FUlIpIHsKLQkJSVdMX0VSUihwcml2LCAiTWljcm9jb2RlIFNXIGVycm9yIGRldGVjdGVkLiAiCi0JCQkiUmVzdGFydGluZyAweCVYLlxuIiwgaW50YSk7Ci0JCXByaXYtPmlzcl9zdGF0cy5zdysrOwotCQlpd2xfbGVnYWN5X2lycV9oYW5kbGVfZXJyb3IocHJpdik7Ci0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfU1dfRVJSOwotCX0KLQotCS8qIHVDb2RlIHdha2VzIHVwIGFmdGVyIHBvd2VyLWRvd24gc2xlZXAgKi8KLQlpZiAoaW50YSAmIENTUl9JTlRfQklUX1dBS0VVUCkgewotCQlJV0xfREVCVUdfSVNSKHByaXYsICJXYWtldXAgaW50ZXJydXB0XG4iKTsKLQkJaXdsX2xlZ2FjeV9yeF9xdWV1ZV91cGRhdGVfd3JpdGVfcHRyKHByaXYsICZwcml2LT5yeHEpOwotCQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsICZwcml2LT50eHFbMF0pOwotCQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsICZwcml2LT50eHFbMV0pOwotCQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsICZwcml2LT50eHFbMl0pOwotCQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsICZwcml2LT50eHFbM10pOwotCQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsICZwcml2LT50eHFbNF0pOwotCQlpd2xfbGVnYWN5X3R4cV91cGRhdGVfd3JpdGVfcHRyKHByaXYsICZwcml2LT50eHFbNV0pOwotCi0JCXByaXYtPmlzcl9zdGF0cy53YWtldXArKzsKLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9XQUtFVVA7Ci0JfQotCi0JLyogQWxsIHVDb2RlIGNvbW1hbmQgcmVzcG9uc2VzLCBpbmNsdWRpbmcgVHggY29tbWFuZCByZXNwb25zZXMsCi0JICogUnggInJlc3BvbnNlcyIgKGZyYW1lLXJlY2VpdmVkIG5vdGlmaWNhdGlvbiksIGFuZCBvdGhlcgotCSAqIG5vdGlmaWNhdGlvbnMgZnJvbSB1Q29kZSBjb21lIHRocm91Z2ggaGVyZSovCi0JaWYgKGludGEgJiAoQ1NSX0lOVF9CSVRfRkhfUlggfCBDU1JfSU5UX0JJVF9TV19SWCkpIHsKLQkJaXdsMzk0NV9yeF9oYW5kbGUocHJpdik7Ci0JCXByaXYtPmlzcl9zdGF0cy5yeCsrOwotCQloYW5kbGVkIHw9IChDU1JfSU5UX0JJVF9GSF9SWCB8IENTUl9JTlRfQklUX1NXX1JYKTsKLQl9Ci0KLQlpZiAoaW50YSAmIENTUl9JTlRfQklUX0ZIX1RYKSB7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwgIlR4IGludGVycnVwdFxuIik7Ci0JCXByaXYtPmlzcl9zdGF0cy50eCsrOwotCi0JCWl3bF93cml0ZTMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTLCAoMSA8PCA2KSk7Ci0JCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgRkgzOV9UQ1NSX0NSRURJVAotCQkJCQkoRkgzOV9TUlZDX0NITkwpLCAweDApOwotCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX0ZIX1RYOwotCX0KLQotCWlmIChpbnRhICYgfmhhbmRsZWQpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5oYW5kbGVkIElOVEEgYml0cyAweCUwOHhcbiIsIGludGEgJiB+aGFuZGxlZCk7Ci0JCXByaXYtPmlzcl9zdGF0cy51bmhhbmRsZWQrKzsKLQl9Ci0KLQlpZiAoaW50YSAmIH5wcml2LT5pbnRhX21hc2spIHsKLQkJSVdMX1dBUk4ocHJpdiwgIkRpc2FibGVkIElOVEEgYml0cyAweCUwOHggd2VyZSBwZW5kaW5nXG4iLAotCQkJIGludGEgJiB+cHJpdi0+aW50YV9tYXNrKTsKLQkJSVdMX1dBUk4ocHJpdiwgIiAgIHdpdGggRkhfSU5UID0gMHglMDh4XG4iLCBpbnRhX2ZoKTsKLQl9Ci0KLQkvKiBSZS1lbmFibGUgYWxsIGludGVycnVwdHMgKi8KLQkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaXNhYmxlZCBieSBpcnEgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0lOVF9FTkFCTEVELCAmcHJpdi0+c3RhdHVzKSkKLQkJaXdsX2xlZ2FjeV9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCWlmIChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIChJV0xfRExfSVNSKSkgewotCQlpbnRhID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UKTsKLQkJaW50YV9tYXNrID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UX01BU0spOwotCQlpbnRhX2ZoID0gaXdsX3JlYWQzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUyk7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwgIkVuZCBpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eCwgIgotCQkJImZsYWdzIDB4JTA4bHhcbiIsIGludGEsIGludGFfbWFzaywgaW50YV9maCwgZmxhZ3MpOwotCX0KLSNlbmRpZgotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfZ2V0X2NoYW5uZWxzX2Zvcl9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCQkgICAgIHU4IGlzX2FjdGl2ZSwgdTggbl9wcm9iZXMsCi0JCQkJICAgICBzdHJ1Y3QgaXdsMzk0NV9zY2FuX2NoYW5uZWwgKnNjYW5fY2gsCi0JCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQotewotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKLQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQl1MTYgcGFzc2l2ZV9kd2VsbCA9IDA7Ci0JdTE2IGFjdGl2ZV9kd2VsbCA9IDA7Ci0JaW50IGFkZGVkLCBpOwotCi0Jc2JhbmQgPSBpd2xfZ2V0X2h3X21vZGUocHJpdiwgYmFuZCk7Ci0JaWYgKCFzYmFuZCkKLQkJcmV0dXJuIDA7Ci0KLQlhY3RpdmVfZHdlbGwgPSBpd2xfbGVnYWN5X2dldF9hY3RpdmVfZHdlbGxfdGltZShwcml2LCBiYW5kLCBuX3Byb2Jlcyk7Ci0JcGFzc2l2ZV9kd2VsbCA9IGl3bF9sZWdhY3lfZ2V0X3Bhc3NpdmVfZHdlbGxfdGltZShwcml2LCBiYW5kLCB2aWYpOwotCi0JaWYgKHBhc3NpdmVfZHdlbGwgPD0gYWN0aXZlX2R3ZWxsKQotCQlwYXNzaXZlX2R3ZWxsID0gYWN0aXZlX2R3ZWxsICsgMTsKLQotCWZvciAoaSA9IDAsIGFkZGVkID0gMDsgaSA8IHByaXYtPnNjYW5fcmVxdWVzdC0+bl9jaGFubmVsczsgaSsrKSB7Ci0JCWNoYW4gPSBwcml2LT5zY2FuX3JlcXVlc3QtPmNoYW5uZWxzW2ldOwotCi0JCWlmIChjaGFuLT5iYW5kICE9IGJhbmQpCi0JCQljb250aW51ZTsKLQotCQlzY2FuX2NoLT5jaGFubmVsID0gY2hhbi0+aHdfdmFsdWU7Ci0KLQkJY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBiYW5kLAotCQkJCQkJCXNjYW5fY2gtPmNoYW5uZWwpOwotCQlpZiAoIWl3bF9sZWdhY3lfaXNfY2hhbm5lbF92YWxpZChjaF9pbmZvKSkgewotCQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwKLQkJCQkiQ2hhbm5lbCAlZCBpcyBJTlZBTElEIGZvciB0aGlzIGJhbmQuXG4iLAotCQkJICAgICAgIHNjYW5fY2gtPmNoYW5uZWwpOwotCQkJY29udGludWU7Ci0JCX0KLQotCQlzY2FuX2NoLT5hY3RpdmVfZHdlbGwgPSBjcHVfdG9fbGUxNihhY3RpdmVfZHdlbGwpOwotCQlzY2FuX2NoLT5wYXNzaXZlX2R3ZWxsID0gY3B1X3RvX2xlMTYocGFzc2l2ZV9kd2VsbCk7Ci0JCS8qIElmIHBhc3NpdmUgLCBzZXQgdXAgZm9yIGF1dG8tc3dpdGNoCi0JCSAqICBhbmQgdXNlIGxvbmcgYWN0aXZlX2R3ZWxsIHRpbWUuCi0JCSAqLwotCQlpZiAoIWlzX2FjdGl2ZSB8fCBpd2xfbGVnYWN5X2lzX2NoYW5uZWxfcGFzc2l2ZShjaF9pbmZvKSB8fAotCQkgICAgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSkgewotCQkJc2Nhbl9jaC0+dHlwZSA9IDA7CS8qIHBhc3NpdmUgKi8KLQkJCWlmIChJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3ZlcikgPT0gMSkKLQkJCQlzY2FuX2NoLT5hY3RpdmVfZHdlbGwgPSBjcHVfdG9fbGUxNihwYXNzaXZlX2R3ZWxsIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQlzY2FuX2NoLT50eXBlID0gMTsJLyogYWN0aXZlICovCi0JCX0KLQotCQkvKiBTZXQgZGlyZWN0IHByb2JlIGJpdHMuIFRoZXNlIG1heSBiZSB1c2VkIGJvdGggZm9yIGFjdGl2ZQotCQkgKiBzY2FuIGNoYW5uZWxzIChwcm9iZXMgZ2V0cyBzZW50IHJpZ2h0IGF3YXkpLAotCQkgKiBvciBmb3IgcGFzc2l2ZSBjaGFubmVscyAocHJvYmVzIGdldCBzZSBzZW50IG9ubHkgYWZ0ZXIKLQkJICogaGVhcmluZyBjbGVhciBSeCBwYWNrZXQpLiovCi0JCWlmIChJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3ZlcikgPj0gMikgewotCQkJaWYgKG5fcHJvYmVzKQotCQkJCXNjYW5fY2gtPnR5cGUgfD0gSVdMMzlfU0NBTl9QUk9CRV9NQVNLKG5fcHJvYmVzKTsKLQkJfSBlbHNlIHsKLQkJCS8qIHVDb2RlIHYxIGRvZXMgbm90IGFsbG93IHNldHRpbmcgZGlyZWN0IHByb2JlIGJpdHMgb24KLQkJCSAqIHBhc3NpdmUgY2hhbm5lbC4gKi8KLQkJCWlmICgoc2Nhbl9jaC0+dHlwZSAmIDEpICYmIG5fcHJvYmVzKQotCQkJCXNjYW5fY2gtPnR5cGUgfD0gSVdMMzlfU0NBTl9QUk9CRV9NQVNLKG5fcHJvYmVzKTsKLQkJfQotCi0JCS8qIFNldCB0eHBvd2VyIGxldmVscyB0byBkZWZhdWx0cyAqLwotCQlzY2FuX2NoLT50cGMuZHNwX2F0dGVuID0gMTEwOwotCQkvKiBzY2FuX3B3cl9pbmZvLT50cGMuZHNwX2F0dGVuOyAqLwotCi0JCS8qc2Nhbl9wd3JfaW5mby0+dHBjLnR4X2dhaW47ICovCi0JCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopCi0JCQlzY2FuX2NoLT50cGMudHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICgzIDw8IDMpKSB8IDM7Ci0JCWVsc2UgewotCQkJc2Nhbl9jaC0+dHBjLnR4X2dhaW4gPSAoKDEgPDwgNSkgfCAoNSA8PCAzKSk7Ci0JCQkvKiBOT1RFOiBpZiB3ZSB3ZXJlIGRvaW5nIDZNYiBPRkRNIGZvciBzY2FucyB3ZSdkIHVzZQotCQkJICogcG93ZXIgbGV2ZWw6Ci0JCQkgKiBzY2FuX2NoLT50cGMudHhfZ2FpbiA9ICgoMSA8PCA1KSB8ICgyIDw8IDMpKSB8IDM7Ci0JCQkgKi8KLQkJfQotCi0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJTY2FubmluZyAlZCBbJXMgJWRdXG4iLAotCQkJICAgICAgIHNjYW5fY2gtPmNoYW5uZWwsCi0JCQkgICAgICAgKHNjYW5fY2gtPnR5cGUgJiAxKSA/ICJBQ1RJVkUiIDogIlBBU1NJVkUiLAotCQkJICAgICAgIChzY2FuX2NoLT50eXBlICYgMSkgPwotCQkJICAgICAgIGFjdGl2ZV9kd2VsbCA6IHBhc3NpdmVfZHdlbGwpOwotCi0JCXNjYW5fY2grKzsKLQkJYWRkZWQrKzsKLQl9Ci0KLQlJV0xfREVCVUdfU0NBTihwcml2LCAidG90YWwgY2hhbm5lbHMgdG8gc2NhbiAlZFxuIiwgYWRkZWQpOwotCXJldHVybiBhZGRlZDsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9pbml0X2h3X3JhdGVzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZXMpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVdMX1JBVEVfQ09VTlRfTEVHQUNZOyBpKyspIHsKLQkJcmF0ZXNbaV0uYml0cmF0ZSA9IGl3bDM5NDVfcmF0ZXNbaV0uaWVlZSAqIDU7Ci0JCXJhdGVzW2ldLmh3X3ZhbHVlID0gaTsgLyogUmF0ZSBzY2FsaW5nIHdpbGwgd29yayBvbiBpbmRleGVzICovCi0JCXJhdGVzW2ldLmh3X3ZhbHVlX3Nob3J0ID0gaTsKLQkJcmF0ZXNbaV0uZmxhZ3MgPSAwOwotCQlpZiAoKGkgPiBJV0wzOV9MQVNUX09GRE1fUkFURSkgfHwgKGkgPCBJV0xfRklSU1RfT0ZETV9SQVRFKSkgewotCQkJLyoKLQkJCSAqIElmIENDSyAhPSAxTSB0aGVuIHNldCBzaG9ydCBwcmVhbWJsZSByYXRlIGZsYWcuCi0JCQkgKi8KLQkJCXJhdGVzW2ldLmZsYWdzIHw9IChpd2wzOTQ1X3JhdGVzW2ldLnBsY3AgPT0gMTApID8KLQkJCQkwIDogSUVFRTgwMjExX1JBVEVfU0hPUlRfUFJFQU1CTEU7Ci0JCX0KLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiB1Q29kZSBkb3dubG9hZCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2RlYWxsb2NfdWNvZGVfcGNpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfY29kZSk7Ci0JaXdsX2xlZ2FjeV9mcmVlX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2RhdGEpOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhX2JhY2t1cCk7Ci0JaXdsX2xlZ2FjeV9mcmVlX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2luaXQpOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0X2RhdGEpOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9ib290KTsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X3ZlcmlmeV9pbnN0X2Z1bGwgLSB2ZXJpZnkgcnVudGltZSB1Q29kZSBpbWFnZSBpbiBjYXJkIHZzLiBob3N0LAotICogICAgIGxvb2tpbmcgYXQgYWxsIGRhdGEuCi0gKi8KLXN0YXRpYyBpbnQgaXdsMzk0NV92ZXJpZnlfaW5zdF9mdWxsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgX19sZTMyICppbWFnZSwgdTMyIGxlbikKLXsKLQl1MzIgdmFsOwotCXUzMiBzYXZlX2xlbiA9IGxlbjsKLQlpbnQgcmMgPSAwOwotCXUzMiBlcnJjbnQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOwotCi0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JBRERSLAotCQkJICAgICAgIElXTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKLQotCWVycmNudCA9IDA7Ci0JZm9yICg7IGxlbiA+IDA7IGxlbiAtPSBzaXplb2YodTMyKSwgaW1hZ2UrKykgewotCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KLQkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCi0JCSAqIGlmIElXTF9ETF9JTyBpcyBzZXQgKi8KLQkJdmFsID0gX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JEQVQpOwotCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpIHsKLQkJCUlXTF9FUlIocHJpdiwgInVDb2RlIElOU1Qgc2VjdGlvbiBpcyBpbnZhbGlkIGF0ICIKLQkJCQkgICJvZmZzZXQgMHgleCwgaXMgMHgleCwgcy9iIDB4JXhcbiIsCi0JCQkJICBzYXZlX2xlbiAtIGxlbiwgdmFsLCBsZTMyX3RvX2NwdSgqaW1hZ2UpKTsKLQkJCXJjID0gLUVJTzsKLQkJCWVycmNudCsrOwotCQkJaWYgKGVycmNudCA+PSAyMCkKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCi0JaWYgKCFlcnJjbnQpCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkidWNvZGUgaW1hZ2UgaW4gSU5TVFJVQ1RJT04gbWVtb3J5IGlzIGdvb2RcbiIpOwotCi0JcmV0dXJuIHJjOwotfQotCi0KLS8qKgotICogaXdsMzk0NV92ZXJpZnlfaW5zdF9zcGFyc2UgLSB2ZXJpZnkgcnVudGltZSB1Q29kZSBpbWFnZSBpbiBjYXJkIHZzLiBob3N0LAotICogICB1c2luZyBzYW1wbGUgZGF0YSAxMDAgYnl0ZXMgYXBhcnQuICBJZiB0aGVzZSBzYW1wbGUgcG9pbnRzIGFyZSBnb29kLAotICogICBpdCdzIGEgcHJldHR5IGdvb2QgYmV0IHRoYXQgZXZlcnl0aGluZyBiZXR3ZWVuIHRoZW0gaXMgZ29vZCwgdG9vLgotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgX19sZTMyICppbWFnZSwgdTMyIGxlbikKLXsKLQl1MzIgdmFsOwotCWludCByYyA9IDA7Ci0JdTMyIGVycmNudCA9IDA7Ci0JdTMyIGk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOwotCi0JZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAxMDAsIGltYWdlICs9IDEwMC9zaXplb2YodTMyKSkgewotCQkvKiByZWFkIGRhdGEgY29tZXMgdGhyb3VnaCBzaW5nbGUgcG9ydCwgYXV0by1pbmNyIGFkZHIgKi8KLQkJLyogTk9URTogVXNlIHRoZSBkZWJ1Z2xlc3MgcmVhZCBzbyB3ZSBkb24ndCBmbG9vZCBrZXJuZWwgbG9nCi0JCSAqIGlmIElXTF9ETF9JTyBpcyBzZXQgKi8KLQkJaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JBRERSLAotCQkJaSArIElXTDM5X1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKLQkJdmFsID0gX2l3bF9sZWdhY3lfcmVhZF9kaXJlY3QzMihwcml2LCBIQlVTX1RBUkdfTUVNX1JEQVQpOwotCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpIHsKLSNpZiAwIC8qIEVuYWJsZSB0aGlzIGlmIHlvdSB3YW50IHRvIHNlZSBkZXRhaWxzICovCi0JCQlJV0xfRVJSKHByaXYsICJ1Q29kZSBJTlNUIHNlY3Rpb24gaXMgaW52YWxpZCBhdCAiCi0JCQkJICAib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLAotCQkJCSAgaSwgdmFsLCAqaW1hZ2UpOwotI2VuZGlmCi0JCQlyYyA9IC1FSU87Ci0JCQllcnJjbnQrKzsKLQkJCWlmIChlcnJjbnQgPj0gMykKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiByYzsKLX0KLQotCi0vKioKLSAqIGl3bDM5NDVfdmVyaWZ5X3Vjb2RlIC0gZGV0ZXJtaW5lIHdoaWNoIGluc3RydWN0aW9uIGltYWdlIGlzIGluIFNSQU0sCi0gKiAgICBhbmQgdmVyaWZ5IGl0cyBjb250ZW50cwotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfdmVyaWZ5X3Vjb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlfX2xlMzIgKmltYWdlOwotCXUzMiBsZW47Ci0JaW50IHJjID0gMDsKLQotCS8qIFRyeSBib290c3RyYXAgKi8KLQlpbWFnZSA9IChfX2xlMzIgKilwcml2LT51Y29kZV9ib290LnZfYWRkcjsKLQlsZW4gPSBwcml2LT51Y29kZV9ib290LmxlbjsKLQlyYyA9IGl3bDM5NDVfdmVyaWZ5X2luc3Rfc3BhcnNlKHByaXYsIGltYWdlLCBsZW4pOwotCWlmIChyYyA9PSAwKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJCb290c3RyYXAgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBUcnkgaW5pdGlhbGl6ZSAqLwotCWltYWdlID0gKF9fbGUzMiAqKXByaXYtPnVjb2RlX2luaXQudl9hZGRyOwotCWxlbiA9IHByaXYtPnVjb2RlX2luaXQubGVuOwotCXJjID0gaXdsMzk0NV92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgaW1hZ2UsIGxlbik7Ci0JaWYgKHJjID09IDApIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemUgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKiBUcnkgcnVudGltZS9wcm90b2NvbCAqLwotCWltYWdlID0gKF9fbGUzMiAqKXByaXYtPnVjb2RlX2NvZGUudl9hZGRyOwotCWxlbiA9IHByaXYtPnVjb2RlX2NvZGUubGVuOwotCXJjID0gaXdsMzk0NV92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgaW1hZ2UsIGxlbik7Ci0JaWYgKHJjID09IDApIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJ1bnRpbWUgdUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfRVJSKHByaXYsICJOTyBWQUxJRCBVQ09ERSBJTUFHRSBJTiBJTlNUUlVDVElPTiBTUkFNISFcbiIpOwotCi0JLyogU2luY2Ugbm90aGluZyBzZWVtcyB0byBtYXRjaCwgc2hvdyBmaXJzdCBzZXZlcmFsIGRhdGEgZW50cmllcyBpbgotCSAqIGluc3RydWN0aW9uIFNSQU0sIHNvIG1heWJlIHZpc3VhbCBpbnNwZWN0aW9uIHdpbGwgZ2l2ZSBhIGNsdWUuCi0JICogU2VsZWN0aW9uIG9mIGJvb3RzdHJhcCBpbWFnZSAodnMuIG90aGVyIGltYWdlcykgaXMgYXJiaXRyYXJ5LiAqLwotCWltYWdlID0gKF9fbGUzMiAqKXByaXYtPnVjb2RlX2Jvb3Qudl9hZGRyOwotCWxlbiA9IHByaXYtPnVjb2RlX2Jvb3QubGVuOwotCXJjID0gaXdsMzk0NV92ZXJpZnlfaW5zdF9mdWxsKHByaXYsIGltYWdlLCBsZW4pOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X25pY19zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JLyogUmVtb3ZlIGFsbCByZXNldHMgdG8gYWxsb3cgTklDIHRvIG9wZXJhdGUgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfUkVTRVQsIDApOwotfQotCi0jZGVmaW5lIElXTDM5NDVfVUNPREVfR0VUKGl0ZW0pCQkJCQkJXAotc3RhdGljIHUzMiBpd2wzOTQ1X3Vjb2RlX2dldF8jI2l0ZW0oY29uc3Qgc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgKnVjb2RlKVwKLXsJCQkJCQkJCQlcCi0JcmV0dXJuIGxlMzJfdG9fY3B1KHVjb2RlLT52MS5pdGVtKTsJCQkJXAotfQotCi1zdGF0aWMgdTMyIGl3bDM5NDVfdWNvZGVfZ2V0X2hlYWRlcl9zaXplKHUzMiBhcGlfdmVyKQotewotCXJldHVybiAyNDsKLX0KLQotc3RhdGljIHU4ICppd2wzOTQ1X3Vjb2RlX2dldF9kYXRhKGNvbnN0IHN0cnVjdCBpd2xfdWNvZGVfaGVhZGVyICp1Y29kZSkKLXsKLQlyZXR1cm4gKHU4ICopIHVjb2RlLT52MS5kYXRhOwotfQotCi1JV0wzOTQ1X1VDT0RFX0dFVChpbnN0X3NpemUpOwotSVdMMzk0NV9VQ09ERV9HRVQoZGF0YV9zaXplKTsKLUlXTDM5NDVfVUNPREVfR0VUKGluaXRfc2l6ZSk7Ci1JV0wzOTQ1X1VDT0RFX0dFVChpbml0X2RhdGFfc2l6ZSk7Ci1JV0wzOTQ1X1VDT0RFX0dFVChib290X3NpemUpOwotCi0vKioKLSAqIGl3bDM5NDVfcmVhZF91Y29kZSAtIFJlYWQgdUNvZGUgaW1hZ2VzIGZyb20gZGlzayBmaWxlLgotICoKLSAqIENvcHkgaW50byBidWZmZXJzIGZvciBjYXJkIHRvIGZldGNoIHZpYSBidXMtbWFzdGVyaW5nCi0gKi8KLXN0YXRpYyBpbnQgaXdsMzk0NV9yZWFkX3Vjb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQljb25zdCBzdHJ1Y3QgaXdsX3Vjb2RlX2hlYWRlciAqdWNvZGU7Ci0JaW50IHJldCA9IC1FSU5WQUwsIGluZGV4OwotCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWNvZGVfcmF3OwotCS8qIGZpcm13YXJlIGZpbGUgbmFtZSBjb250YWlucyB1Q29kZS9kcml2ZXIgY29tcGF0aWJpbGl0eSB2ZXJzaW9uICovCi0JY29uc3QgY2hhciAqbmFtZV9wcmUgPSBwcml2LT5jZmctPmZ3X25hbWVfcHJlOwotCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWF4ID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWF4OwotCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWluID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWluOwotCWNoYXIgYnVmWzI1XTsKLQl1OCAqc3JjOwotCXNpemVfdCBsZW47Ci0JdTMyIGFwaV92ZXIsIGluc3Rfc2l6ZSwgZGF0YV9zaXplLCBpbml0X3NpemUsIGluaXRfZGF0YV9zaXplLCBib290X3NpemU7Ci0KLQkvKiBBc2sga2VybmVsIGZpcm13YXJlX2NsYXNzIG1vZHVsZSB0byBnZXQgdGhlIGJvb3QgZmlybXdhcmUgb2ZmIGRpc2suCi0JICogcmVxdWVzdF9maXJtd2FyZSgpIGlzIHN5bmNocm9ub3VzLCBmaWxlIGlzIGluIG1lbW9yeSBvbiByZXR1cm4uICovCi0JZm9yIChpbmRleCA9IGFwaV9tYXg7IGluZGV4ID49IGFwaV9taW47IGluZGV4LS0pIHsKLQkJc3ByaW50ZihidWYsICIlcyV1JXMiLCBuYW1lX3ByZSwgaW5kZXgsICIudWNvZGUiKTsKLQkJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmdWNvZGVfcmF3LCBidWYsICZwcml2LT5wY2lfZGV2LT5kZXYpOwotCQlpZiAocmV0IDwgMCkgewotCQkJSVdMX0VSUihwcml2LCAiJXMgZmlybXdhcmUgZmlsZSByZXEgZmFpbGVkOiAlZFxuIiwKLQkJCQkgIGJ1ZiwgcmV0KTsKLQkJCWlmIChyZXQgPT0gLUVOT0VOVCkKLQkJCQljb250aW51ZTsKLQkJCWVsc2UKLQkJCQlnb3RvIGVycm9yOwotCQl9IGVsc2UgewotCQkJaWYgKGluZGV4IDwgYXBpX21heCkKLQkJCQlJV0xfRVJSKHByaXYsICJMb2FkZWQgZmlybXdhcmUgJXMsICIKLQkJCQkJIndoaWNoIGlzIGRlcHJlY2F0ZWQuICIKLQkJCQkJIiBQbGVhc2UgdXNlIEFQSSB2JXUgaW5zdGVhZC5cbiIsCi0JCQkJCSAgYnVmLCBhcGlfbWF4KTsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJHb3QgZmlybXdhcmUgJyVzJyBmaWxlICIKLQkJCQkgICAgICAgIiglemQgYnl0ZXMpIGZyb20gZGlza1xuIiwKLQkJCQkgICAgICAgYnVmLCB1Y29kZV9yYXctPnNpemUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlpZiAocmV0IDwgMCkKLQkJZ290byBlcnJvcjsKLQotCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGdvdCBhdCBsZWFzdCBvdXIgaGVhZGVyISAqLwotCWlmICh1Y29kZV9yYXctPnNpemUgPCAgaXdsMzk0NV91Y29kZV9nZXRfaGVhZGVyX3NpemUoMSkpIHsKLQkJSVdMX0VSUihwcml2LCAiRmlsZSBzaXplIHdheSB0b28gc21hbGwhXG4iKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0KLQkvKiBEYXRhIGZyb20gdWNvZGUgZmlsZTogIGhlYWRlciBmb2xsb3dlZCBieSB1Q29kZSBpbWFnZXMgKi8KLQl1Y29kZSA9IChzdHJ1Y3QgaXdsX3Vjb2RlX2hlYWRlciAqKXVjb2RlX3Jhdy0+ZGF0YTsKLQotCXByaXYtPnVjb2RlX3ZlciA9IGxlMzJfdG9fY3B1KHVjb2RlLT52ZXIpOwotCWFwaV92ZXIgPSBJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3Zlcik7Ci0JaW5zdF9zaXplID0gaXdsMzk0NV91Y29kZV9nZXRfaW5zdF9zaXplKHVjb2RlKTsKLQlkYXRhX3NpemUgPSBpd2wzOTQ1X3Vjb2RlX2dldF9kYXRhX3NpemUodWNvZGUpOwotCWluaXRfc2l6ZSA9IGl3bDM5NDVfdWNvZGVfZ2V0X2luaXRfc2l6ZSh1Y29kZSk7Ci0JaW5pdF9kYXRhX3NpemUgPSBpd2wzOTQ1X3Vjb2RlX2dldF9pbml0X2RhdGFfc2l6ZSh1Y29kZSk7Ci0JYm9vdF9zaXplID0gaXdsMzk0NV91Y29kZV9nZXRfYm9vdF9zaXplKHVjb2RlKTsKLQlzcmMgPSBpd2wzOTQ1X3Vjb2RlX2dldF9kYXRhKHVjb2RlKTsKLQotCS8qIGFwaV92ZXIgc2hvdWxkIG1hdGNoIHRoZSBhcGkgdmVyc2lvbiBmb3JtaW5nIHBhcnQgb2YgdGhlCi0JICogZmlybXdhcmUgZmlsZW5hbWUgLi4uIGJ1dCB3ZSBkb24ndCBjaGVjayBmb3IgdGhhdCBhbmQgb25seSByZWx5Ci0JICogb24gdGhlIEFQSSB2ZXJzaW9uIHJlYWQgZnJvbSBmaXJtd2FyZSBoZWFkZXIgZnJvbSBoZXJlIG9uIGZvcndhcmQgKi8KLQotCWlmIChhcGlfdmVyIDwgYXBpX21pbiB8fCBhcGlfdmVyID4gYXBpX21heCkgewotCQlJV0xfRVJSKHByaXYsICJEcml2ZXIgdW5hYmxlIHRvIHN1cHBvcnQgeW91ciBmaXJtd2FyZSBBUEkuICIKLQkJCSAgIkRyaXZlciBzdXBwb3J0cyB2JXUsIGZpcm13YXJlIGlzIHYldS5cbiIsCi0JCQkgIGFwaV9tYXgsIGFwaV92ZXIpOwotCQlwcml2LT51Y29kZV92ZXIgPSAwOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZWxlYXNlOwotCX0KLQlpZiAoYXBpX3ZlciAhPSBhcGlfbWF4KQotCQlJV0xfRVJSKHByaXYsICJGaXJtd2FyZSBoYXMgb2xkIEFQSSB2ZXJzaW9uLiBFeHBlY3RlZCAldSwgIgotCQkJICAiZ290ICV1LiBOZXcgZmlybXdhcmUgY2FuIGJlIG9idGFpbmVkICIKLQkJCSAgImZyb20gaHR0cDovL3d3dy5pbnRlbGxpbnV4d2lyZWxlc3Mub3JnLlxuIiwKLQkJCSAgYXBpX21heCwgYXBpX3Zlcik7Ci0KLQlJV0xfSU5GTyhwcml2LCAibG9hZGVkIGZpcm13YXJlIHZlcnNpb24gJXUuJXUuJXUuJXVcbiIsCi0JCUlXTF9VQ09ERV9NQUpPUihwcml2LT51Y29kZV92ZXIpLAotCQlJV0xfVUNPREVfTUlOT1IocHJpdi0+dWNvZGVfdmVyKSwKLQkJSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpLAotCQlJV0xfVUNPREVfU0VSSUFMKHByaXYtPnVjb2RlX3ZlcikpOwotCi0Jc25wcmludGYocHJpdi0+aHctPndpcGh5LT5md192ZXJzaW9uLAotCQkgc2l6ZW9mKHByaXYtPmh3LT53aXBoeS0+ZndfdmVyc2lvbiksCi0JCSAiJXUuJXUuJXUuJXUiLAotCQkgSVdMX1VDT0RFX01BSk9SKHByaXYtPnVjb2RlX3ZlciksCi0JCSBJV0xfVUNPREVfTUlOT1IocHJpdi0+dWNvZGVfdmVyKSwKLQkJIElXTF9VQ09ERV9BUEkocHJpdi0+dWNvZGVfdmVyKSwKLQkJIElXTF9VQ09ERV9TRVJJQUwocHJpdi0+dWNvZGVfdmVyKSk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIHVjb2RlIHZlcnNpb24gcmF3ID0gMHgleFxuIiwKLQkJICAgICAgIHByaXYtPnVjb2RlX3Zlcik7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImYvdyBwYWNrYWdlIGhkciBydW50aW1lIGluc3Qgc2l6ZSA9ICV1XG4iLAotCQkgICAgICAgaW5zdF9zaXplKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIHJ1bnRpbWUgZGF0YSBzaXplID0gJXVcbiIsCi0JCSAgICAgICBkYXRhX3NpemUpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgaW5pdCBpbnN0IHNpemUgPSAldVxuIiwKLQkJICAgICAgIGluaXRfc2l6ZSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImYvdyBwYWNrYWdlIGhkciBpbml0IGRhdGEgc2l6ZSA9ICV1XG4iLAotCQkgICAgICAgaW5pdF9kYXRhX3NpemUpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgYm9vdCBpbnN0IHNpemUgPSAldVxuIiwKLQkJICAgICAgIGJvb3Rfc2l6ZSk7Ci0KLQotCS8qIFZlcmlmeSBzaXplIG9mIGZpbGUgdnMuIGltYWdlIHNpemUgaW5mbyBpbiBmaWxlJ3MgaGVhZGVyICovCi0JaWYgKHVjb2RlX3Jhdy0+c2l6ZSAhPSBpd2wzOTQ1X3Vjb2RlX2dldF9oZWFkZXJfc2l6ZShhcGlfdmVyKSArCi0JCWluc3Rfc2l6ZSArIGRhdGFfc2l6ZSArIGluaXRfc2l6ZSArCi0JCWluaXRfZGF0YV9zaXplICsgYm9vdF9zaXplKSB7Ci0KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCSJ1Q29kZSBmaWxlIHNpemUgJXpkIGRvZXMgbm90IG1hdGNoIGV4cGVjdGVkIHNpemVcbiIsCi0JCQl1Y29kZV9yYXctPnNpemUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZWxlYXNlOwotCX0KLQotCS8qIFZlcmlmeSB0aGF0IHVDb2RlIGltYWdlcyB3aWxsIGZpdCBpbiBjYXJkJ3MgU1JBTSAqLwotCWlmIChpbnN0X3NpemUgPiBJV0wzOV9NQVhfSU5TVF9TSVpFKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJ1Q29kZSBpbnN0ciBsZW4gJWQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKLQkJCSAgICAgICBpbnN0X3NpemUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZWxlYXNlOwotCX0KLQotCWlmIChkYXRhX3NpemUgPiBJV0wzOV9NQVhfREFUQV9TSVpFKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJ1Q29kZSBkYXRhIGxlbiAlZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAotCQkJICAgICAgIGRhdGFfc2l6ZSk7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZXJyX3JlbGVhc2U7Ci0JfQotCWlmIChpbml0X3NpemUgPiBJV0wzOV9NQVhfSU5TVF9TSVpFKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJInVDb2RlIGluaXQgaW5zdHIgbGVuICVkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQkJaW5pdF9zaXplKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0JaWYgKGluaXRfZGF0YV9zaXplID4gSVdMMzlfTUFYX0RBVEFfU0laRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LAotCQkJCSJ1Q29kZSBpbml0IGRhdGEgbGVuICVkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQkJaW5pdF9kYXRhX3NpemUpOwotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVycl9yZWxlYXNlOwotCX0KLQlpZiAoYm9vdF9zaXplID4gSVdMMzlfTUFYX0JTTV9TSVpFKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJInVDb2RlIGJvb3QgaW5zdHIgbGVuICVkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQkJYm9vdF9zaXplKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnJfcmVsZWFzZTsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSB1Y29kZSBidWZmZXJzIGZvciBjYXJkJ3MgYnVzLW1hc3RlciBsb2FkaW5nIC4uLiAqLwotCi0JLyogUnVudGltZSBpbnN0cnVjdGlvbnMgYW5kIDIgY29waWVzIG9mIGRhdGE6Ci0JICogMSkgdW5tb2RpZmllZCBmcm9tIGRpc2sKLQkgKiAyKSBiYWNrdXAgY2FjaGUgZm9yIHNhdmUvcmVzdG9yZSBkdXJpbmcgcG93ZXItZG93bnMgKi8KLQlwcml2LT51Y29kZV9jb2RlLmxlbiA9IGluc3Rfc2l6ZTsKLQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2NvZGUpOwotCi0JcHJpdi0+dWNvZGVfZGF0YS5sZW4gPSBkYXRhX3NpemU7Ci0JaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhKTsKLQotCXByaXYtPnVjb2RlX2RhdGFfYmFja3VwLmxlbiA9IGRhdGFfc2l6ZTsKLQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2RhdGFfYmFja3VwKTsKLQotCWlmICghcHJpdi0+dWNvZGVfY29kZS52X2FkZHIgfHwgIXByaXYtPnVjb2RlX2RhdGEudl9hZGRyIHx8Ci0JICAgICFwcml2LT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIpCi0JCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQotCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyBhbmQgZGF0YSAqLwotCWlmIChpbml0X3NpemUgJiYgaW5pdF9kYXRhX3NpemUpIHsKLQkJcHJpdi0+dWNvZGVfaW5pdC5sZW4gPSBpbml0X3NpemU7Ci0JCWl3bF9sZWdhY3lfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfaW5pdCk7Ci0KLQkJcHJpdi0+dWNvZGVfaW5pdF9kYXRhLmxlbiA9IGluaXRfZGF0YV9zaXplOwotCQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2luaXRfZGF0YSk7Ci0KLQkJaWYgKCFwcml2LT51Y29kZV9pbml0LnZfYWRkciB8fCAhcHJpdi0+dWNvZGVfaW5pdF9kYXRhLnZfYWRkcikKLQkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQl9Ci0KLQkvKiBCb290c3RyYXAgKGluc3RydWN0aW9ucyBvbmx5LCBubyBkYXRhKSAqLwotCWlmIChib290X3NpemUpIHsKLQkJcHJpdi0+dWNvZGVfYm9vdC5sZW4gPSBib290X3NpemU7Ci0JCWl3bF9sZWdhY3lfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfYm9vdCk7Ci0KLQkJaWYgKCFwcml2LT51Y29kZV9ib290LnZfYWRkcikKLQkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQl9Ci0KLQkvKiBDb3B5IGltYWdlcyBpbnRvIGJ1ZmZlcnMgZm9yIGNhcmQncyBidXMtbWFzdGVyIHJlYWRzIC4uLiAqLwotCi0JLyogUnVudGltZSBpbnN0cnVjdGlvbnMgKGZpcnN0IGJsb2NrIG9mIGRhdGEgaW4gZmlsZSkgKi8KLQlsZW4gPSBpbnN0X3NpemU7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgdUNvZGUgaW5zdHIgbGVuICV6ZFxuIiwgbGVuKTsKLQltZW1jcHkocHJpdi0+dWNvZGVfY29kZS52X2FkZHIsIHNyYywgbGVuKTsKLQlzcmMgKz0gbGVuOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgInVDb2RlIGluc3RyIGJ1ZiB2YWRkciA9IDB4JXAsIHBhZGRyID0gMHglMDh4XG4iLAotCQlwcml2LT51Y29kZV9jb2RlLnZfYWRkciwgKHUzMilwcml2LT51Y29kZV9jb2RlLnBfYWRkcik7Ci0KLQkvKiBSdW50aW1lIGRhdGEgKDJuZCBibG9jaykKLQkgKiBOT1RFOiAgQ29weSBpbnRvIGJhY2t1cCBidWZmZXIgd2lsbCBiZSBkb25lIGluIGl3bDM5NDVfdXAoKSAgKi8KLQlsZW4gPSBkYXRhX3NpemU7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgdUNvZGUgZGF0YSBsZW4gJXpkXG4iLCBsZW4pOwotCW1lbWNweShwcml2LT51Y29kZV9kYXRhLnZfYWRkciwgc3JjLCBsZW4pOwotCW1lbWNweShwcml2LT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIsIHNyYywgbGVuKTsKLQlzcmMgKz0gbGVuOwotCi0JLyogSW5pdGlhbGl6YXRpb24gaW5zdHJ1Y3Rpb25zICgzcmQgYmxvY2spICovCi0JaWYgKGluaXRfc2l6ZSkgewotCQlsZW4gPSBpbml0X3NpemU7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBpbml0IGluc3RyIGxlbiAlemRcbiIsIGxlbik7Ci0JCW1lbWNweShwcml2LT51Y29kZV9pbml0LnZfYWRkciwgc3JjLCBsZW4pOwotCQlzcmMgKz0gbGVuOwotCX0KLQotCS8qIEluaXRpYWxpemF0aW9uIGRhdGEgKDR0aCBibG9jaykgKi8KLQlpZiAoaW5pdF9kYXRhX3NpemUpIHsKLQkJbGVuID0gaW5pdF9kYXRhX3NpemU7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBpbml0IGRhdGEgbGVuICV6ZFxuIiwgbGVuKTsKLQkJbWVtY3B5KHByaXYtPnVjb2RlX2luaXRfZGF0YS52X2FkZHIsIHNyYywgbGVuKTsKLQkJc3JjICs9IGxlbjsKLQl9Ci0KLQkvKiBCb290c3RyYXAgaW5zdHJ1Y3Rpb25zICg1dGggYmxvY2spICovCi0JbGVuID0gYm9vdF9zaXplOwotCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCSJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIGJvb3QgaW5zdHIgbGVuICV6ZFxuIiwgbGVuKTsKLQltZW1jcHkocHJpdi0+dWNvZGVfYm9vdC52X2FkZHIsIHNyYywgbGVuKTsKLQotCS8qIFdlIGhhdmUgb3VyIGNvcGllcyBub3csIGFsbG93IE9TIHJlbGVhc2UgaXRzIGNvcGllcyAqLwotCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKLQlyZXR1cm4gMDsKLQotIGVycl9wY2lfYWxsb2M6Ci0JSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHBjaSBtZW1vcnlcbiIpOwotCXJldCA9IC1FTk9NRU07Ci0JaXdsMzk0NV9kZWFsbG9jX3Vjb2RlX3BjaShwcml2KTsKLQotIGVycl9yZWxlYXNlOgotCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKLQotIGVycm9yOgotCXJldHVybiByZXQ7Ci19Ci0KLQotLyoqCi0gKiBpd2wzOTQ1X3NldF91Y29kZV9wdHJzIC0gU2V0IHVDb2RlIGFkZHJlc3MgbG9jYXRpb24KLSAqCi0gKiBUZWxsIGluaXRpYWxpemF0aW9uIHVDb2RlIHdoZXJlIHRvIGZpbmQgcnVudGltZSB1Q29kZS4KLSAqCi0gKiBCU00gcmVnaXN0ZXJzIGluaXRpYWxseSBjb250YWluIHBvaW50ZXJzIHRvIGluaXRpYWxpemF0aW9uIHVDb2RlLgotICogV2UgbmVlZCB0byByZXBsYWNlIHRoZW0gdG8gbG9hZCBydW50aW1lIHVDb2RlIGluc3QgYW5kIGRhdGEsCi0gKiBhbmQgdG8gc2F2ZSBydW50aW1lIGRhdGEgd2hlbiBwb3dlcmluZyBkb3duLgotICovCi1zdGF0aWMgaW50IGl3bDM5NDVfc2V0X3Vjb2RlX3B0cnMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWRtYV9hZGRyX3QgcGluc3Q7Ci0JZG1hX2FkZHJfdCBwZGF0YTsKLQotCS8qIGJpdHMgMzE6MCBmb3IgMzk0NSAqLwotCXBpbnN0ID0gcHJpdi0+dWNvZGVfY29kZS5wX2FkZHI7Ci0JcGRhdGEgPSBwcml2LT51Y29kZV9kYXRhX2JhY2t1cC5wX2FkZHI7Ci0KLQkvKiBUZWxsIGJvb3RzdHJhcCB1Q29kZSB3aGVyZSB0byBmaW5kIGltYWdlIHRvIGxvYWQgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9QVFJfUkVHLCBwaW5zdCk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEJTTV9EUkFNX0RBVEFfUFRSX1JFRywgcGRhdGEpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBCU01fRFJBTV9EQVRBX0JZVEVDT1VOVF9SRUcsCi0JCQkJIHByaXYtPnVjb2RlX2RhdGEubGVuKTsKLQotCS8qIEluc3QgYnl0ZSBjb3VudCBtdXN0IGJlIGxhc3QgdG8gc2V0IHVwLCBiaXQgMzEgc2lnbmFscyB1Q29kZQotCSAqICAgdGhhdCBhbGwgbmV3IHB0ci9zaXplIGluZm8gaXMgaW4gcGxhY2UgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgQlNNX0RSQU1fSU5TVF9CWVRFQ09VTlRfUkVHLAotCQkJCSBwcml2LT51Y29kZV9jb2RlLmxlbiB8IEJTTV9EUkFNX0lOU1RfTE9BRCk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiUnVudGltZSB1Q29kZSBwb2ludGVycyBhcmUgc2V0LlxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBpd2wzOTQ1X2luaXRfYWxpdmVfc3RhcnQgLSBDYWxsZWQgYWZ0ZXIgUkVQTFlfQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCi0gKgotICogQ2FsbGVkIGFmdGVyIFJFUExZX0FMSVZFIG5vdGlmaWNhdGlvbiByZWNlaXZlZCBmcm9tICJpbml0aWFsaXplIiB1Q29kZS4KLSAqCi0gKiBUZWxsICJpbml0aWFsaXplIiB1Q29kZSB0byBnbyBhaGVhZCBhbmQgbG9hZCB0aGUgcnVudGltZSB1Q29kZS4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiBDaGVjayBhbGl2ZSByZXNwb25zZSBmb3IgInZhbGlkIiBzaWduIGZyb20gdUNvZGUgKi8KLQlpZiAocHJpdi0+Y2FyZF9hbGl2ZV9pbml0LmlzX3ZhbGlkICE9IFVDT0RFX1ZBTElEX09LKSB7Ci0JCS8qIFdlIGhhZCBhbiBlcnJvciBicmluZ2luZyB1cCB0aGUgaGFyZHdhcmUsIHNvIHRha2UgaXQKLQkJICogYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemUgQWxpdmUgZmFpbGVkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQkvKiBCb290c3RyYXAgdUNvZGUgaGFzIGxvYWRlZCBpbml0aWFsaXplIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KLQkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQotCSAqICJpbml0aWFsaXplIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KLQlpZiAoaXdsMzk0NV92ZXJpZnlfdWNvZGUocHJpdikpIHsKLQkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJhZCBcImluaXRpYWxpemVcIiB1Q29kZSBsb2FkLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQkvKiBTZW5kIHBvaW50ZXJzIHRvIHByb3RvY29sL3J1bnRpbWUgdUNvZGUgaW1hZ2UgLi4uIGluaXQgY29kZSB3aWxsCi0JICogbG9hZCBhbmQgbGF1bmNoIHJ1bnRpbWUgdUNvZGUsIHdoaWNoIHdpbGwgc2VuZCB1cyBhbm90aGVyICJBbGl2ZSIKLQkgKiBub3RpZmljYXRpb24uICovCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkluaXRpYWxpemF0aW9uIEFsaXZlIHJlY2VpdmVkLlxuIik7Ci0JaWYgKGl3bDM5NDVfc2V0X3Vjb2RlX3B0cnMocHJpdikpIHsKLQkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdvbid0IGhhcHBlbjsKLQkJICogdGFrZSBpdCBhbGwgdGhlIHdheSBiYWNrIGRvd24gc28gd2UgY2FuIHRyeSBhZ2FpbiAqLwotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQ291bGRuJ3Qgc2V0IHVwIHVDb2RlIHBvaW50ZXJzLlxuIik7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0JcmV0dXJuOwotCi0gcmVzdGFydDoKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPnJlc3RhcnQpOwotfQotCi0vKioKLSAqIGl3bDM5NDVfYWxpdmVfc3RhcnQgLSBjYWxsZWQgYWZ0ZXIgUkVQTFlfQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCi0gKiAgICAgICAgICAgICAgICAgICBmcm9tIHByb3RvY29sL3J1bnRpbWUgdUNvZGUgKGluaXRpYWxpemF0aW9uIHVDb2RlJ3MKLSAqICAgICAgICAgICAgICAgICAgIEFsaXZlIGdldHMgaGFuZGxlZCBieSBpd2wzOTQ1X2luaXRfYWxpdmVfc3RhcnQoKSkuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDM5NDVfYWxpdmVfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCB0aGVybWFsX3NwaW4gPSAwOwotCXUzMiByZmtpbGw7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJSdW50aW1lIEFsaXZlIHJlY2VpdmVkLlxuIik7Ci0KLQlpZiAocHJpdi0+Y2FyZF9hbGl2ZS5pc192YWxpZCAhPSBVQ09ERV9WQUxJRF9PSykgewotCQkvKiBXZSBoYWQgYW4gZXJyb3IgYnJpbmdpbmcgdXAgdGhlIGhhcmR3YXJlLCBzbyB0YWtlIGl0Ci0JCSAqIGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJBbGl2ZSBmYWlsZWQuXG4iKTsKLQkJZ290byByZXN0YXJ0OwotCX0KLQotCS8qIEluaXRpYWxpemUgdUNvZGUgaGFzIGxvYWRlZCBSdW50aW1lIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KLQkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQotCSAqICJydW50aW1lIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KLQlpZiAoaXdsMzk0NV92ZXJpZnlfdWNvZGUocHJpdikpIHsKLQkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJhZCBydW50aW1lIHVDb2RlIGxvYWQuXG4iKTsKLQkJZ290byByZXN0YXJ0OwotCX0KLQotCXJma2lsbCA9IGl3bF9sZWdhY3lfcmVhZF9wcnBoKHByaXYsIEFQTUdfUkZLSUxMX1JFRyk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJGS0lMTCBzdGF0dXM6IDB4JXhcbiIsIHJma2lsbCk7Ci0KLQlpZiAocmZraWxsICYgMHgxKSB7Ci0JCWNsZWFyX2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JCS8qIGlmIFJGS0lMTCBpcyBub3Qgb24sIHRoZW4gd2FpdCBmb3IgdGhlcm1hbAotCQkgKiBzZW5zb3IgaW4gYWRhcHRlciB0byBraWNrIGluICovCi0JCXdoaWxlIChpd2wzOTQ1X2h3X2dldF90ZW1wZXJhdHVyZShwcml2KSA9PSAwKSB7Ci0JCQl0aGVybWFsX3NwaW4rKzsKLQkJCXVkZWxheSgxMCk7Ci0JCX0KLQotCQlpZiAodGhlcm1hbF9zcGluKQotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlRoZXJtYWwgY2FsaWJyYXRpb24gdG9vayAlZHVzXG4iLAotCQkJCSAgICAgICB0aGVybWFsX3NwaW4gKiAxMCk7Ci0JfSBlbHNlCi0JCXNldF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCi0JLyogQWZ0ZXIgdGhlIEFMSVZFIHJlc3BvbnNlLCB3ZSBjYW4gc2VuZCBjb21tYW5kcyB0byAzOTQ1IHVDb2RlICovCi0Jc2V0X2JpdChTVEFUVVNfQUxJVkUsICZwcml2LT5zdGF0dXMpOwotCi0JLyogRW5hYmxlIHdhdGNoZG9nIHRvIG1vbml0b3IgdGhlIGRyaXZlciB0eCBxdWV1ZXMgKi8KLQlpd2xfbGVnYWN5X3NldHVwX3dhdGNoZG9nKHByaXYpOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfcmZraWxsKHByaXYpKQotCQlyZXR1cm47Ci0KLQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOwotCi0JcHJpdi0+YWN0aXZlX3JhdGUgPSBJV0xfUkFURVNfTUFTS18zOTQ1OwotCi0JaXdsX2xlZ2FjeV9wb3dlcl91cGRhdGVfbW9kZShwcml2LCB0cnVlKTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQocHJpdiwgSVdMX1JYT05fQ1RYX0JTUykpIHsKLQkJc3RydWN0IGl3bDM5NDVfcnhvbl9jbWQgKmFjdGl2ZV9yeG9uID0KLQkJCQkoc3RydWN0IGl3bDM5NDVfcnhvbl9jbWQgKikoJmN0eC0+YWN0aXZlKTsKLQotCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJYWN0aXZlX3J4b24tPmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCX0gZWxzZSB7Ci0JCS8qIEluaXRpYWxpemUgb3VyIHJ4X2NvbmZpZyBkYXRhICovCi0JCWl3bF9sZWdhY3lfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZyhwcml2LCBjdHgpOwotCX0KLQotCS8qIENvbmZpZ3VyZSBCbHVldG9vdGggZGV2aWNlIGNvZXhpc3RlbmNlIHN1cHBvcnQgKi8KLQlpd2xfbGVnYWN5X3NlbmRfYnRfY29uZmlnKHByaXYpOwotCi0Jc2V0X2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpOwotCi0JLyogQ29uZmlndXJlIHRoZSBhZGFwdGVyIGZvciB1bmFzc29jaWF0ZWQgb3BlcmF0aW9uICovCi0JaXdsMzk0NV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JaXdsMzk0NV9yZWdfdHhwb3dlcl9wZXJpb2RpYyhwcml2KTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJBTElWRSBwcm9jZXNzaW5nIGNvbXBsZXRlLlxuIik7Ci0Jd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLQotCXJldHVybjsKLQotIHJlc3RhcnQ6Ci0JcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXN0YXJ0KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi1zdGF0aWMgdm9pZCBfX2l3bDM5NDVfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZXhpdF9wZW5kaW5nOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgRFJWX05BTUUgIiBpcyBnb2luZyBkb3duXG4iKTsKLQotCWl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOwotCi0JZXhpdF9wZW5kaW5nID0gdGVzdF9hbmRfc2V0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIFN0b3AgVFggcXVldWVzIHdhdGNoZG9nLiBXZSBuZWVkIHRvIGhhdmUgU1RBVFVTX0VYSVRfUEVORElORyBiaXQgc2V0Ci0JICogdG8gcHJldmVudCByZWFybSB0aW1lciAqLwotCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaGRvZyk7Ci0KLQkvKiBTdGF0aW9uIGluZm9ybWF0aW9uIHdpbGwgbm93IGJlIGNsZWFyZWQgaW4gZGV2aWNlICovCi0JaXdsX2xlZ2FjeV9jbGVhcl91Y29kZV9zdGF0aW9ucyhwcml2LCBOVUxMKTsKLQlpd2xfbGVnYWN5X2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMocHJpdik7Ci0JaXdsX2xlZ2FjeV9jbGVhcl9kcml2ZXJfc3RhdGlvbnMocHJpdik7Ci0KLQkvKiBVbmJsb2NrIGFueSB3YWl0aW5nIGNhbGxzICovCi0Jd2FrZV91cF9hbGwoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0KLQkvKiBXaXBlIG91dCB0aGUgRVhJVF9QRU5ESU5HIHN0YXR1cyBiaXQgaWYgd2UgYXJlIG5vdCBhY3R1YWxseQotCSAqIGV4aXRpbmcgdGhlIG1vZHVsZSAqLwotCWlmICghZXhpdF9wZW5kaW5nKQotCQljbGVhcl9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBzdG9wIGFuZCByZXNldCB0aGUgb24tYm9hcmQgcHJvY2Vzc29yICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7Ci0KLQkvKiB0ZWxsIHRoZSBkZXZpY2UgdG8gc3RvcCBzZW5kaW5nIGludGVycnVwdHMgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bF9sZWdhY3lfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2wzOTQ1X3N5bmNocm9uaXplX2lycShwcml2KTsKLQotCWlmIChwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKQotCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMocHJpdi0+aHcpOwotCi0JLyogSWYgd2UgaGF2ZSBub3QgcHJldmlvdXNseSBjYWxsZWQgaXdsMzk0NV9pbml0KCkgdGhlbgotCSAqIGNsZWFyIGFsbCBiaXRzIGJ1dCB0aGUgUkYgS2lsbCBiaXRzIGFuZCByZXR1cm4gKi8KLQlpZiAoIWl3bF9sZWdhY3lfaXNfaW5pdChwcml2KSkgewotCQlwcml2LT5zdGF0dXMgPSB0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykgPDwKLQkJCQkJU1RBVFVTX1JGX0tJTExfSFcgfAotCQkJICAgICAgIHRlc3RfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cykgPDwKLQkJCQkJU1RBVFVTX0dFT19DT05GSUdVUkVEIHwKLQkJCQl0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCQlTVEFUVVNfRVhJVF9QRU5ESU5HOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogLi4ub3RoZXJ3aXNlIGNsZWFyIG91dCBhbGwgdGhlIHN0YXR1cyBiaXRzIGJ1dCB0aGUgUkYgS2lsbAotCSAqIGJpdCBhbmQgY29udGludWUgdGFraW5nIHRoZSBOSUMgZG93bi4gKi8KLQlwcml2LT5zdGF0dXMgJj0gdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJU1RBVFVTX1JGX0tJTExfSFcgfAotCQkJdGVzdF9iaXQoU1RBVFVTX0dFT19DT05GSUdVUkVELCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19HRU9fQ09ORklHVVJFRCB8Ci0JCQl0ZXN0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJU1RBVFVTX0ZXX0VSUk9SIHwKLQkJCXRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJU1RBVFVTX0VYSVRfUEVORElORzsKLQotCWl3bDM5NDVfaHdfdHhxX2N0eF9zdG9wKHByaXYpOwotCWl3bDM5NDVfaHdfcnhxX3N0b3AocHJpdik7Ci0KLQkvKiBQb3dlci1kb3duIGRldmljZSdzIGJ1c21hc3RlciBETUEgY2xvY2tzICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFQTUdfQ0xLX0RJU19SRUcsIEFQTUdfQ0xLX1ZBTF9ETUFfQ0xLX1JRVCk7Ci0JdWRlbGF5KDUpOwotCi0JLyogU3RvcCB0aGUgZGV2aWNlLCBhbmQgcHV0IGl0IGluIGxvdyBwb3dlciBzdGF0ZSAqLwotCWl3bF9sZWdhY3lfYXBtX3N0b3AocHJpdik7Ci0KLSBleGl0OgotCW1lbXNldCgmcHJpdi0+Y2FyZF9hbGl2ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpd2xfYWxpdmVfcmVzcCkpOwotCi0JaWYgKHByaXYtPmJlYWNvbl9za2IpCi0JCWRldl9rZnJlZV9za2IocHJpdi0+YmVhY29uX3NrYik7Ci0JcHJpdi0+YmVhY29uX3NrYiA9IE5VTEw7Ci0KLQkvKiBjbGVhciBvdXQgYW55IGZyZWUgZnJhbWVzICovCi0JaXdsMzk0NV9jbGVhcl9mcmVlX2ZyYW1lcyhwcml2KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9kb3duKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JX19pd2wzOTQ1X2Rvd24ocHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlpd2wzOTQ1X2NhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOwotfQotCi0jZGVmaW5lIE1BWF9IV19SRVNUQVJUUyA1Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9hbGxvY19iY2FzdF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTggc3RhX2lkOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0Jc3RhX2lkID0gaXdsX2xlZ2FjeV9wcmVwX3N0YXRpb24ocHJpdiwgY3R4LAotCQkJCQlpd2xlZ2FjeV9iY2FzdF9hZGRyLCBmYWxzZSwgTlVMTCk7Ci0JaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBwcmVwYXJlIGJyb2FkY2FzdCBzdGF0aW9uXG4iKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgfD0gSVdMX1NUQV9EUklWRVJfQUNUSVZFOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCB8PSBJV0xfU1RBX0JDQVNUOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBfX2l3bDM5NDVfdXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWludCByYywgaTsKLQotCXJjID0gaXdsMzk0NV9hbGxvY19iY2FzdF9zdGF0aW9uKHByaXYpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJFeGl0IHBlbmRpbmc7IHdpbGwgbm90IGJyaW5nIHRoZSBOSUMgdXBcbiIpOwotCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlpZiAoIXByaXYtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciB8fCAhcHJpdi0+dWNvZGVfZGF0YS52X2FkZHIpIHsKLQkJSVdMX0VSUihwcml2LCAidWNvZGUgbm90IGF2YWlsYWJsZSBmb3IgZGV2aWNlIGJyaW5nIHVwXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JLyogSWYgcGxhdGZvcm0ncyBSRl9LSUxMIHN3aXRjaCBpcyBOT1Qgc2V0IHRvIEtJTEwgKi8KLQlpZiAoaXdsX3JlYWQzMihwcml2LCBDU1JfR1BfQ05UUkwpICYKLQkJCQlDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfSFdfUkZfS0lMTF9TVykKLQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQllbHNlIHsKLQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JCUlXTF9XQVJOKHByaXYsICJSYWRpbyBkaXNhYmxlZCBieSBIVyBSRiBLaWxsIHN3aXRjaFxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlQsIDB4RkZGRkZGRkYpOwotCi0JcmMgPSBpd2wzOTQ1X2h3X25pY19pbml0KHByaXYpOwotCWlmIChyYykgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW50IG5pY1xuIik7Ci0JCXJldHVybiByYzsKLQl9Ci0KLQkvKiBtYWtlIHN1cmUgcmZraWxsIGhhbmRzaGFrZSBiaXRzIGFyZSBjbGVhcmVkICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLAotCQkgICAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0NNRF9CTE9DS0VEKTsKLQotCS8qIGNsZWFyIChhZ2FpbiksIHRoZW4gZW5hYmxlIGhvc3QgaW50ZXJydXB0cyAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlQsIDB4RkZGRkZGRkYpOwotCWl3bF9sZWdhY3lfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0KLQkvKiByZWFsbHkgbWFrZSBzdXJlIHJma2lsbCBoYW5kc2hha2UgYml0cyBhcmUgY2xlYXJlZCAqLwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwgQ1NSX1VDT0RFX1NXX0JJVF9SRktJTEwpOwotCi0JLyogQ29weSBvcmlnaW5hbCB1Y29kZSBkYXRhIGltYWdlIGZyb20gZGlzayBpbnRvIGJhY2t1cCBjYWNoZS4KLQkgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IncwotCSAqIGRhdGEgU1JBTSBmb3IgYSBjbGVhbiBzdGFydCB3aGVuIHRoZSBydW50aW1lIHByb2dyYW0gZmlyc3QgbG9hZHMuICovCi0JbWVtY3B5KHByaXYtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciwgcHJpdi0+dWNvZGVfZGF0YS52X2FkZHIsCi0JICAgICAgIHByaXYtPnVjb2RlX2RhdGEubGVuKTsKLQotCS8qIFdlIHJldHVybiBzdWNjZXNzIHdoZW4gd2UgcmVzdW1lIGZyb20gc3VzcGVuZCBhbmQgcmZfa2lsbCBpcyBvbi4gKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm4gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFdfUkVTVEFSVFM7IGkrKykgewotCi0JCS8qIGxvYWQgYm9vdHN0cmFwIHN0YXRlIG1hY2hpbmUsCi0JCSAqIGxvYWQgYm9vdHN0cmFwIHByb2dyYW0gaW50byBwcm9jZXNzb3IncyBtZW1vcnksCi0JCSAqIHByZXBhcmUgdG8gbG9hZCB0aGUgImluaXRpYWxpemUiIHVDb2RlICovCi0JCXJjID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+bG9hZF91Y29kZShwcml2KTsKLQotCQlpZiAocmMpIHsKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiVW5hYmxlIHRvIHNldCB1cCBib290c3RyYXAgdUNvZGU6ICVkXG4iLCByYyk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCS8qIHN0YXJ0IGNhcmQ7ICJpbml0aWFsaXplIiB3aWxsIGxvYWQgcnVudGltZSB1Y29kZSAqLwotCQlpd2wzOTQ1X25pY19zdGFydChwcml2KTsKLQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCBEUlZfTkFNRSAiIGlzIGNvbWluZyB1cFxuIik7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0Jc2V0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKLQlfX2l3bDM5NDVfZG93bihwcml2KTsKLQljbGVhcl9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiB0cmllZCB0byByZXN0YXJ0IGFuZCBjb25maWcgdGhlIGRldmljZSBmb3IgYXMgbG9uZyBhcyBvdXIKLQkgKiBwYXRpZW5jZSBjb3VsZCB3aXRoc3RhbmQgKi8KLQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2UgYWZ0ZXIgJWQgYXR0ZW1wdHMuXG4iLCBpKTsKLQlyZXR1cm4gLUVJTzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBXb3JrcXVldWUgY2FsbGJhY2tzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2JnX2luaXRfYWxpdmVfc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9Ci0JICAgIGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIGluaXRfYWxpdmVfc3RhcnQud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlnb3RvIG91dDsKLQotCWl3bDM5NDVfaW5pdF9hbGl2ZV9zdGFydChwcml2KTsKLW91dDoKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9iZ19hbGl2ZV9zdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0KLQkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgYWxpdmVfc3RhcnQud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlnb3RvIG91dDsKLQotCWl3bDM5NDVfYWxpdmVfc3RhcnQocHJpdik7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLS8qCi0gKiAzOTQ1IGNhbm5vdCBpbnRlcnJ1cHQgZHJpdmVyIHdoZW4gaGFyZHdhcmUgcmYga2lsbCBzd2l0Y2ggdG9nZ2xlczsKLSAqIGRyaXZlciBtdXN0IHBvbGwgQ1NSX0dQX0NOVFJMX1JFRyByZWdpc3RlciBmb3IgY2hhbmdlLiAgVGhpcyByZWdpc3RlcgotICogKmlzKiByZWFkYWJsZSBldmVuIHdoZW4gZGV2aWNlIGhhcyBiZWVuIFNXX1JFU0VUIGludG8gbG93IHBvd2VyIG1vZGUKLSAqIChlLmcuIGR1cmluZyBSRiBLSUxMKS4KLSAqLwotc3RhdGljIHZvaWQgaXdsMzk0NV9yZmtpbGxfcG9sbChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0KLQkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgXzM5NDUucmZraWxsX3BvbGwud29yayk7Ci0JYm9vbCBvbGRfcmZraWxsID0gdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCWJvb2wgbmV3X3Jma2lsbCA9ICEoaXdsX3JlYWQzMihwcml2LCBDU1JfR1BfQ05UUkwpCi0JCQkmIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKTsKLQotCWlmIChuZXdfcmZraWxsICE9IG9sZF9yZmtpbGwpIHsKLQkJaWYgKG5ld19yZmtpbGwpCi0JCQlzZXRfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQkJZWxzZQotCQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwgbmV3X3Jma2lsbCk7Ci0KLQkJSVdMX0RFQlVHX1JGX0tJTEwocHJpdiwgIlJGX0tJTEwgYml0IHRvZ2dsZWQgdG8gJXMuXG4iLAotCQkJCW5ld19yZmtpbGwgPyAiZGlzYWJsZSByYWRpbyIgOiAiZW5hYmxlIHJhZGlvIik7Ci0JfQotCi0JLyogS2VlcCB0aGlzIHJ1bm5pbmcsIGV2ZW4gaWYgcmFkaW8gbm93IGVuYWJsZWQuICBUaGlzIHdpbGwgYmUKLQkgKiBjYW5jZWxsZWQgaW4gbWFjX3N0YXJ0KCkgaWYgc3lzdGVtIGRlY2lkZXMgdG8gc3RhcnQgYWdhaW4gKi8KLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+XzM5NDUucmZraWxsX3BvbGwsCi0JCQkgICByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKDIgKiBIWikpOwotCi19Ci0KLWludCBpd2wzOTQ1X3JlcXVlc3Rfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCi17Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1NDQU5fQ01ELAotCQkubGVuID0gc2l6ZW9mKHN0cnVjdCBpd2wzOTQ1X3NjYW5fY21kKSwKLQkJLmZsYWdzID0gQ01EX1NJWkVfSFVHRSwKLQl9OwotCXN0cnVjdCBpd2wzOTQ1X3NjYW5fY21kICpzY2FuOwotCXU4IG5fcHJvYmVzID0gMDsKLQllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7Ci0JYm9vbCBpc19hY3RpdmUgPSBmYWxzZTsKLQlpbnQgcmV0OwotCXUxNiBsZW47Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoIXByaXYtPnNjYW5fY21kKSB7Ci0JCXByaXYtPnNjYW5fY21kID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGl3bDM5NDVfc2Nhbl9jbWQpICsKLQkJCQkJIElXTF9NQVhfU0NBTl9TSVpFLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFwcml2LT5zY2FuX2NtZCkgewotCQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwgIkZhaWwgdG8gYWxsb2NhdGUgc2NhbiBtZW1vcnlcbiIpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQl9Ci0Jc2NhbiA9IHByaXYtPnNjYW5fY21kOwotCW1lbXNldChzY2FuLCAwLCBzaXplb2Yoc3RydWN0IGl3bDM5NDVfc2Nhbl9jbWQpICsgSVdMX01BWF9TQ0FOX1NJWkUpOwotCi0Jc2Nhbi0+cXVpZXRfcGxjcF90aCA9IElXTF9QTENQX1FVSUVUX1RIUkVTSDsKLQlzY2FuLT5xdWlldF90aW1lID0gSVdMX0FDVElWRV9RVUlFVF9USU1FOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZChwcml2LCBJV0xfUlhPTl9DVFhfQlNTKSkgewotCQl1MTYgaW50ZXJ2YWw7Ci0JCXUzMiBleHRyYTsKLQkJdTMyIHN1c3BlbmRfdGltZSA9IDEwMDsKLQkJdTMyIHNjYW5fc3VzcGVuZF90aW1lID0gMTAwOwotCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJTY2FubmluZyB3aGlsZSBhc3NvY2lhdGVkLi4uXG4iKTsKLQotCQlpbnRlcnZhbCA9IHZpZi0+YnNzX2NvbmYuYmVhY29uX2ludDsKLQotCQlzY2FuLT5zdXNwZW5kX3RpbWUgPSAwOwotCQlzY2FuLT5tYXhfb3V0X3RpbWUgPSBjcHVfdG9fbGUzMigyMDAgKiAxMDI0KTsKLQkJaWYgKCFpbnRlcnZhbCkKLQkJCWludGVydmFsID0gc3VzcGVuZF90aW1lOwotCQkvKgotCQkgKiBzdXNwZW5kIHRpbWUgZm9ybWF0OgotCQkgKiAgMC0xOTogYmVhY29uIGludGVydmFsIGluIHVzZWMgKHRpbWUgYmVmb3JlIGV4ZWMuKQotCQkgKiAyMC0yMzogMAotCQkgKiAyNC0zMTogbnVtYmVyIG9mIGJlYWNvbnMgKHN1c3BlbmQgYmV0d2VlbiBjaGFubmVscykKLQkJICovCi0KLQkJZXh0cmEgPSAoc3VzcGVuZF90aW1lIC8gaW50ZXJ2YWwpIDw8IDI0OwotCQlzY2FuX3N1c3BlbmRfdGltZSA9IDB4RkYwRkZGRkYgJgotCQkgICAgKGV4dHJhIHwgKChzdXNwZW5kX3RpbWUgJSBpbnRlcnZhbCkgKiAxMDI0KSk7Ci0KLQkJc2Nhbi0+c3VzcGVuZF90aW1lID0gY3B1X3RvX2xlMzIoc2Nhbl9zdXNwZW5kX3RpbWUpOwotCQlJV0xfREVCVUdfU0NBTihwcml2LCAic3VzcGVuZF90aW1lIDB4JVggYmVhY29uIGludGVydmFsICVkXG4iLAotCQkJICAgICAgIHNjYW5fc3VzcGVuZF90aW1lLCBpbnRlcnZhbCk7Ci0JfQotCi0JaWYgKHByaXYtPnNjYW5fcmVxdWVzdC0+bl9zc2lkcykgewotCQlpbnQgaSwgcCA9IDA7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJLaWNraW5nIG9mZiBhY3RpdmUgc2NhblxuIik7Ci0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fc3NpZHM7IGkrKykgewotCQkJLyogYWx3YXlzIGRvZXMgd2lsZGNhcmQgYW55d2F5ICovCi0JCQlpZiAoIXByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW4pCi0JCQkJY29udGludWU7Ci0JCQlzY2FuLT5kaXJlY3Rfc2NhbltwXS5pZCA9IFdMQU5fRUlEX1NTSUQ7Ci0JCQlzY2FuLT5kaXJlY3Rfc2NhbltwXS5sZW4gPQotCQkJCXByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZF9sZW47Ci0JCQltZW1jcHkoc2Nhbi0+ZGlyZWN0X3NjYW5bcF0uc3NpZCwKLQkJCSAgICAgICBwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWQsCi0JCQkgICAgICAgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbik7Ci0JCQluX3Byb2JlcysrOwotCQkJcCsrOwotCQl9Ci0JCWlzX2FjdGl2ZSA9IHRydWU7Ci0JfSBlbHNlCi0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJLaWNraW5nIG9mZiBwYXNzaXZlIHNjYW4uXG4iKTsKLQotCS8qIFdlIGRvbid0IGJ1aWxkIGEgZGlyZWN0IHNjYW4gcHJvYmUgcmVxdWVzdDsgdGhlIHVDb2RlIHdpbGwgZG8KLQkgKiB0aGF0IGJhc2VkIG9uIHRoZSBkaXJlY3RfbWFzayBhZGRlZCB0byBlYWNoIGNoYW5uZWwgZW50cnkgKi8KLQlzY2FuLT50eF9jbWQudHhfZmxhZ3MgPSBUWF9DTURfRkxHX1NFUV9DVExfTVNLOwotCXNjYW4tPnR4X2NtZC5zdGFfaWQgPSBwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5iY2FzdF9zdGFfaWQ7Ci0Jc2Nhbi0+dHhfY21kLnN0b3BfdGltZS5saWZlX3RpbWUgPSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFOwotCi0JLyogZmxhZ3MgKyByYXRlIHNlbGVjdGlvbiAqLwotCi0Jc3dpdGNoIChwcml2LT5zY2FuX2JhbmQpIHsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6Ci0JCXNjYW4tPmZsYWdzID0gUlhPTl9GTEdfQkFORF8yNEdfTVNLIHwgUlhPTl9GTEdfQVVUT19ERVRFQ1RfTVNLOwotCQlzY2FuLT50eF9jbWQucmF0ZSA9IElXTF9SQVRFXzFNX1BMQ1A7Ci0JCWJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9CQU5EXzVHSFo6Ci0JCXNjYW4tPnR4X2NtZC5yYXRlID0gSVdMX1JBVEVfNk1fUExDUDsKLQkJYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9XQVJOKHByaXYsICJJbnZhbGlkIHNjYW4gYmFuZFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qCi0JICogSWYgYWN0aXZlIHNjYW5pbmcgaXMgcmVxdWVzdGVkIGJ1dCBhIGNlcnRhaW4gY2hhbm5lbAotCSAqIGlzIG1hcmtlZCBwYXNzaXZlLCB3ZSBjYW4gZG8gYWN0aXZlIHNjYW5uaW5nIGlmIHdlCi0JICogZGV0ZWN0IHRyYW5zbWlzc2lvbnMuCi0JICovCi0Jc2Nhbi0+Z29vZF9DUkNfdGggPSBpc19hY3RpdmUgPyBJV0xfR09PRF9DUkNfVEhfREVGQVVMVCA6Ci0JCQkJCUlXTF9HT09EX0NSQ19USF9ESVNBQkxFRDsKLQotCWxlbiA9IGl3bF9sZWdhY3lfZmlsbF9wcm9iZV9yZXEocHJpdiwgKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKXNjYW4tPmRhdGEsCi0JCQkJCXZpZi0+YWRkciwgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5pZSwKLQkJCQkJcHJpdi0+c2Nhbl9yZXF1ZXN0LT5pZV9sZW4sCi0JCQkJCUlXTF9NQVhfU0NBTl9TSVpFIC0gc2l6ZW9mKCpzY2FuKSk7Ci0Jc2Nhbi0+dHhfY21kLmxlbiA9IGNwdV90b19sZTE2KGxlbik7Ci0KLQkvKiBzZWxlY3QgUnggYW50ZW5uYXMgKi8KLQlzY2FuLT5mbGFncyB8PSBpd2wzOTQ1X2dldF9hbnRlbm5hX2ZsYWdzKHByaXYpOwotCi0Jc2Nhbi0+Y2hhbm5lbF9jb3VudCA9IGl3bDM5NDVfZ2V0X2NoYW5uZWxzX2Zvcl9zY2FuKHByaXYsIGJhbmQsIGlzX2FjdGl2ZSwgbl9wcm9iZXMsCi0JCQkJCQkJICAgICh2b2lkICopJnNjYW4tPmRhdGFbbGVuXSwgdmlmKTsKLQlpZiAoc2Nhbi0+Y2hhbm5lbF9jb3VudCA9PSAwKSB7Ci0JCUlXTF9ERUJVR19TQ0FOKHByaXYsICJjaGFubmVsIGNvdW50ICVkXG4iLCBzY2FuLT5jaGFubmVsX2NvdW50KTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JY21kLmxlbiArPSBsZTE2X3RvX2NwdShzY2FuLT50eF9jbWQubGVuKSArCi0JICAgIHNjYW4tPmNoYW5uZWxfY291bnQgKiBzaXplb2Yoc3RydWN0IGl3bDM5NDVfc2Nhbl9jaGFubmVsKTsKLQljbWQuZGF0YSA9IHNjYW47Ci0Jc2Nhbi0+bGVuID0gY3B1X3RvX2xlMTYoY21kLmxlbik7Ci0KLQlzZXRfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQlyZXQgPSBpd2xfbGVnYWN5X3NlbmRfY21kX3N5bmMocHJpdiwgJmNtZCk7Ci0JaWYgKHJldCkKLQkJY2xlYXJfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQlyZXR1cm4gcmV0OwotfQotCi12b2lkIGl3bDM5NDVfcG9zdF9zY2FuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0JLyoKLQkgKiBTaW5jZSBzZXR0aW5nIHRoZSBSWE9OIG1heSBoYXZlIGJlZW4gZGVmZXJyZWQgd2hpbGUKLQkgKiBwZXJmb3JtaW5nIHRoZSBzY2FuLCBmaXJlIG9uZSBvZmYgaWYgbmVlZGVkCi0JICovCi0JaWYgKG1lbWNtcCgmY3R4LT5zdGFnaW5nLCAmY3R4LT5hY3RpdmUsIHNpemVvZihjdHgtPnN0YWdpbmcpKSkKLQkJaXdsMzk0NV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2JnX3Jlc3RhcnQoc3RydWN0IHdvcmtfc3RydWN0ICpkYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGNvbnRhaW5lcl9vZihkYXRhLCBzdHJ1Y3QgaXdsX3ByaXYsIHJlc3RhcnQpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFNUQVRVU19GV19FUlJPUiwgJnByaXYtPnN0YXR1cykpIHsKLQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQkJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkKLQkJCWN0eC0+dmlmID0gTlVMTDsKLQkJcHJpdi0+aXNfb3BlbiA9IDA7Ci0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQlpd2wzOTQ1X2Rvd24ocHJpdik7Ci0JCWllZWU4MDIxMV9yZXN0YXJ0X2h3KHByaXYtPmh3KTsKLQl9IGVsc2UgewotCQlpd2wzOTQ1X2Rvd24ocHJpdik7Ci0KLQkJbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpIHsKLQkJCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJX19pd2wzOTQ1X3VwKHByaXYpOwotCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfYmdfcnhfcmVwbGVuaXNoKHN0cnVjdCB3b3JrX3N0cnVjdCAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPQotCSAgICBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGl3bF9wcml2LCByeF9yZXBsZW5pc2gpOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJZ290byBvdXQ7Ci0KLQlpd2wzOTQ1X3J4X3JlcGxlbmlzaChwcml2KTsKLW91dDoKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLX0KLQotdm9pZCBpd2wzOTQ1X3Bvc3RfYXNzb2NpYXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmMgPSAwOwotCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9IE5VTEw7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCWlmICghY3R4LT52aWYgfHwgIXByaXYtPmlzX29wZW4pCi0JCXJldHVybjsKLQotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiQXNzb2NpYXRlZCBhcyAlZCB0bzogJXBNXG4iLAotCQkJY3R4LT52aWYtPmJzc19jb25mLmFpZCwgY3R4LT5hY3RpdmUuYnNzaWRfYWRkcik7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCWl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOwotCi0JY29uZiA9IGl3bF9sZWdhY3lfaWVlZTgwMjExX2dldF9od19jb25mKHByaXYtPmh3KTsKLQotCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgJj0gflJYT05fRklMVEVSX0FTU09DX01TSzsKLQlpd2wzOTQ1X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0KLQlyYyA9IGl3bF9sZWdhY3lfc2VuZF9yeG9uX3RpbWluZyhwcml2LCBjdHgpOwotCWlmIChyYykKLQkJSVdMX1dBUk4ocHJpdiwgIlJFUExZX1JYT05fVElNSU5HIGZhaWxlZCAtICIKLQkJCSAgICAiQXR0ZW1wdGluZyB0byBjb250aW51ZS5cbiIpOwotCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0KLQljdHgtPnN0YWdpbmcuYXNzb2NfaWQgPSBjcHVfdG9fbGUxNihjdHgtPnZpZi0+YnNzX2NvbmYuYWlkKTsKLQotCUlXTF9ERUJVR19BU1NPQyhwcml2LCAiYXNzb2MgaWQgJWQgYmVhY29uIGludGVydmFsICVkXG4iLAotCQkJY3R4LT52aWYtPmJzc19jb25mLmFpZCwgY3R4LT52aWYtPmJzc19jb25mLmJlYWNvbl9pbnQpOwotCi0JaWYgKGN0eC0+dmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpCi0JCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9QUkVBTUJMRV9NU0s7Ci0JZWxzZQotCQljdHgtPnN0YWdpbmcuZmxhZ3MgJj0gflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQotCWlmIChjdHgtPnN0YWdpbmcuZmxhZ3MgJiBSWE9OX0ZMR19CQU5EXzI0R19NU0spIHsKLQkJaWYgKGN0eC0+dmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PSBSWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQkJZWxzZQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9IH5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQl9Ci0KLQlpd2wzOTQ1X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0KLQlzd2l0Y2ggKGN0eC0+dmlmLT50eXBlKSB7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgotCQlpd2wzOTQ1X3JhdGVfc2NhbGVfaW5pdChwcml2LT5odywgSVdMX0FQX0lEKTsKLQkJYnJlYWs7Ci0JY2FzZSBOTDgwMjExX0lGVFlQRV9BREhPQzoKLQkJaXdsMzk0NV9zZW5kX2JlYWNvbl9jbWQocHJpdik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9FUlIocHJpdiwgIiVzIFNob3VsZCBub3QgYmUgY2FsbGVkIGluICVkIG1vZGVcbiIsCi0JCQlfX2Z1bmNfXywgY3R4LT52aWYtPnR5cGUpOwotCQlicmVhazsKLQl9Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBVQ09ERV9SRUFEWV9USU1FT1VUCSgyICogSFopCi0KLXN0YXRpYyBpbnQgaXdsMzk0NV9tYWNfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JaW50IHJldDsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JLyogd2Ugc2hvdWxkIGJlIHZlcmlmeWluZyB0aGUgZGV2aWNlIGlzIHJlYWR5IHRvIGJlIG9wZW5lZCAqLwotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCS8qIGZldGNoIHVjb2RlIGZpbGUgZnJvbSBkaXNrLCBhbGxvYyBhbmQgY29weSB0byBidXMtbWFzdGVyIGJ1ZmZlcnMgLi4uCi0JICogdWNvZGUgZmlsZW5hbWUgYW5kIG1heCBzaXplcyBhcmUgY2FyZC1zcGVjaWZpYy4gKi8KLQotCWlmICghcHJpdi0+dWNvZGVfY29kZS5sZW4pIHsKLQkJcmV0ID0gaXdsMzk0NV9yZWFkX3Vjb2RlKHByaXYpOwotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJDb3VsZCBub3QgcmVhZCBtaWNyb2NvZGU6ICVkXG4iLCByZXQpOwotCQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JCQlnb3RvIG91dF9yZWxlYXNlX2lycTsKLQkJfQotCX0KLQotCXJldCA9IF9faXdsMzk0NV91cChwcml2KTsKLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHJldCkKLQkJZ290byBvdXRfcmVsZWFzZV9pcnE7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU3RhcnQgVVAgd29yay5cbiIpOwotCi0JLyogV2FpdCBmb3IgU1RBUlRfQUxJVkUgZnJvbSB1Y29kZS4gT3RoZXJ3aXNlIGNhbGxiYWNrcyBmcm9tCi0JICogbWFjODAyMTEgd2lsbCBub3QgYmUgcnVuIHN1Y2Nlc3NmdWxseS4gKi8KLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlLAotCQkJdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKSwKLQkJCVVDT0RFX1JFQURZX1RJTUVPVVQpOwotCWlmICghcmV0KSB7Ci0JCWlmICghdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c3RhdHVzKSkgewotCQkJSVdMX0VSUihwcml2LAotCQkJCSJXYWl0IGZvciBTVEFSVF9BTElWRSB0aW1lb3V0IGFmdGVyICVkbXMuXG4iLAotCQkJCWppZmZpZXNfdG9fbXNlY3MoVUNPREVfUkVBRFlfVElNRU9VVCkpOwotCQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJCWdvdG8gb3V0X3JlbGVhc2VfaXJxOwotCQl9Ci0JfQotCi0JLyogdWNvZGUgaXMgcnVubmluZyBhbmQgd2lsbCBzZW5kIHJma2lsbCBub3RpZmljYXRpb25zLAotCSAqIG5vIG5lZWQgdG8gcG9sbCB0aGUga2lsbHN3aXRjaCBzdGF0ZSBhbnltb3JlICovCi0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+XzM5NDUucmZraWxsX3BvbGwpOwotCi0JcHJpdi0+aXNfb3BlbiA9IDE7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JcmV0dXJuIDA7Ci0KLW91dF9yZWxlYXNlX2lycToKLQlwcml2LT5pc19vcGVuID0gMDsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gZmFpbGVkXG4iKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X21hY19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpZiAoIXByaXYtPmlzX29wZW4pIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIHNraXBcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JcHJpdi0+aXNfb3BlbiA9IDA7Ci0KLQlpd2wzOTQ1X2Rvd24ocHJpdik7Ci0KLQlmbHVzaF93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQotCS8qIHN0YXJ0IHBvbGxpbmcgdGhlIGtpbGxzd2l0Y2ggc3RhdGUgYWdhaW4gKi8KLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+XzM5NDUucmZraWxsX3BvbGwsCi0JCQkgICByb3VuZF9qaWZmaWVzX3JlbGF0aXZlKDIgKiBIWikpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfbWFjX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlJV0xfREVCVUdfVFgocHJpdiwgImRldi0+eG1pdCglZCBieXRlcykgYXQgcmF0ZSAweCUwMnhcbiIsIHNrYi0+bGVuLAotCQkgICAgIGllZWU4MDIxMV9nZXRfdHhfcmF0ZShodywgSUVFRTgwMjExX1NLQl9DQihza2IpKS0+Yml0cmF0ZSk7Ci0KLQlpZiAoaXdsMzk0NV90eF9za2IocHJpdiwgc2tiKSkKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi12b2lkIGl3bDM5NDVfY29uZmlnX2FwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKLQlpbnQgcmMgPSAwOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlyZXR1cm47Ci0KLQkvKiBUaGUgZm9sbG93aW5nIHNob3VsZCBiZSBkb25lIG9ubHkgYXQgQVAgYnJpbmcgdXAgKi8KLQlpZiAoIShpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQocHJpdiwgSVdMX1JYT05fQ1RYX0JTUykpKSB7Ci0KLQkJLyogUlhPTiAtIHVuYXNzb2MgKHRvIHNldCB0aW1pbmcgY29tbWFuZCkgKi8KLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCQlpd2wzOTQ1X2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7Ci0KLQkJLyogUlhPTiBUaW1pbmcgKi8KLQkJcmMgPSBpd2xfbGVnYWN5X3NlbmRfcnhvbl90aW1pbmcocHJpdiwgY3R4KTsKLQkJaWYgKHJjKQotCQkJSVdMX1dBUk4ocHJpdiwgIlJFUExZX1JYT05fVElNSU5HIGZhaWxlZCAtICIKLQkJCQkJIkF0dGVtcHRpbmcgdG8gY29udGludWUuXG4iKTsKLQotCQljdHgtPnN0YWdpbmcuYXNzb2NfaWQgPSAwOwotCi0JCWlmICh2aWYtPmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSkKLQkJCWN0eC0+c3RhZ2luZy5mbGFncyB8PQotCQkJCVJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQkJZWxzZQotCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9Ci0JCQkJflJYT05fRkxHX1NIT1JUX1BSRUFNQkxFX01TSzsKLQotCQlpZiAoY3R4LT5zdGFnaW5nLmZsYWdzICYgUlhPTl9GTEdfQkFORF8yNEdfTVNLKSB7Ci0JCQlpZiAodmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfc2xvdCkKLQkJCQljdHgtPnN0YWdpbmcuZmxhZ3MgfD0KLQkJCQkJUlhPTl9GTEdfU0hPUlRfU0xPVF9NU0s7Ci0JCQllbHNlCi0JCQkJY3R4LT5zdGFnaW5nLmZsYWdzICY9Ci0JCQkJCX5SWE9OX0ZMR19TSE9SVF9TTE9UX01TSzsKLQkJfQotCQkvKiByZXN0b3JlIFJYT04gYXNzb2MgKi8KLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBSWE9OX0ZJTFRFUl9BU1NPQ19NU0s7Ci0JCWl3bDM5NDVfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQl9Ci0JaXdsMzk0NV9zZW5kX2JlYWNvbl9jbWQocHJpdik7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9tYWNfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgZW51bSBzZXRfa2V5X2NtZCBjbWQsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlpbnQgcmV0ID0gMDsKLQl1OCBzdGFfaWQgPSBJV0xfSU5WQUxJRF9TVEFUSU9OOwotCXU4IHN0YXRpY19rZXk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWlmIChpd2wzOTQ1X21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBod2NyeXB0byBkaXNhYmxlZFxuIik7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQkvKgotCSAqIFRvIHN1cHBvcnQgSUJTUyBSU04sIGRvbid0IHByb2dyYW0gZ3JvdXAga2V5cyBpbiBJQlNTLCB0aGUKLQkgKiBoYXJkd2FyZSB3aWxsIHRoZW4gbm90IGF0dGVtcHQgdG8gZGVjcnlwdCB0aGUgZnJhbWVzLgotCSAqLwotCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKLQkgICAgIShrZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0Jc3RhdGljX2tleSA9ICFpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWQocHJpdiwgSVdMX1JYT05fQ1RYX0JTUyk7Ci0KLQlpZiAoIXN0YXRpY19rZXkpIHsKLQkJc3RhX2lkID0gaXdsX2xlZ2FjeV9zdGFfaWRfb3JfYnJvYWRjYXN0KAotCQkJCXByaXYsICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXSwgc3RhKTsKLQkJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApOwotCi0Jc3dpdGNoIChjbWQpIHsKLQljYXNlIFNFVF9LRVk6Ci0JCWlmIChzdGF0aWNfa2V5KQotCQkJcmV0ID0gaXdsMzk0NV9zZXRfc3RhdGljX2tleShwcml2LCBrZXkpOwotCQllbHNlCi0JCQlyZXQgPSBpd2wzOTQ1X3NldF9keW5hbWljX2tleShwcml2LCBrZXksIHN0YV9pZCk7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW5hYmxlIGh3Y3J5cHRvIGtleVxuIik7Ci0JCWJyZWFrOwotCWNhc2UgRElTQUJMRV9LRVk6Ci0JCWlmIChzdGF0aWNfa2V5KQotCQkJcmV0ID0gaXdsMzk0NV9yZW1vdmVfc3RhdGljX2tleShwcml2KTsKLQkJZWxzZQotCQkJcmV0ID0gaXdsMzk0NV9jbGVhcl9zdGFfa2V5X2luZm8ocHJpdiwgc3RhX2lkKTsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJkaXNhYmxlIGh3Y3J5cHRvIGtleVxuIik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bDM5NDVfbWFjX3N0YV9hZGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2wzOTQ1X3N0YV9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlpbnQgcmV0OwotCWJvb2wgaXNfYXAgPSB2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKLQl1OCBzdGFfaWQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicmVjZWl2ZWQgcmVxdWVzdCB0byBhZGQgc3RhdGlvbiAlcE1cbiIsCi0JCQlzdGEtPmFkZHIpOwotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicHJvY2VlZGluZyB0byBhZGQgc3RhdGlvbiAlcE1cbiIsCi0JCQlzdGEtPmFkZHIpOwotCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gSVdMX0lOVkFMSURfU1RBVElPTjsKLQotCi0JcmV0ID0gaXdsX2xlZ2FjeV9hZGRfc3RhdGlvbl9jb21tb24ocHJpdiwKLQkJCQkmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10sCi0JCQkJICAgICBzdGEtPmFkZHIsIGlzX2FwLCBzdGEsICZzdGFfaWQpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGFkZCBzdGF0aW9uICVwTSAoJWQpXG4iLAotCQkJc3RhLT5hZGRyLCByZXQpOwotCQkvKiBTaG91bGQgd2UgcmV0dXJuIHN1Y2Nlc3MgaWYgcmV0dXJuIGNvZGUgaXMgRUVYSVNUID8gKi8KLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0Jc3RhX3ByaXYtPmNvbW1vbi5zdGFfaWQgPSBzdGFfaWQ7Ci0KLQkvKiBJbml0aWFsaXplIHJhdGUgc2NhbGluZyAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXppbmcgcmF0ZSBzY2FsaW5nIGZvciBzdGF0aW9uICVwTVxuIiwKLQkJICAgICAgIHN0YS0+YWRkcik7Ci0JaXdsMzk0NV9yc19yYXRlX2luaXQocHJpdiwgc3RhLCBzdGFfaWQpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDM5NDVfY29uZmlndXJlX2ZpbHRlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAotCQkJCSAgICAgdW5zaWduZWQgaW50ICp0b3RhbF9mbGFncywKLQkJCQkgICAgIHU2NCBtdWx0aWNhc3QpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JX19sZTMyIGZpbHRlcl9vciA9IDAsIGZpbHRlcl9uYW5kID0gMDsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOwotCi0jZGVmaW5lIENISyh0ZXN0LCBmbGFnKQlkbyB7IFwKLQlpZiAoKnRvdGFsX2ZsYWdzICYgKHRlc3QpKQkJXAotCQlmaWx0ZXJfb3IgfD0gKGZsYWcpOwkJXAotCWVsc2UJCQkJCVwKLQkJZmlsdGVyX25hbmQgfD0gKGZsYWcpOwkJXAotCX0gd2hpbGUgKDApCi0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgIkVudGVyOiBjaGFuZ2VkOiAweCV4LCB0b3RhbDogMHgleFxuIiwKLQkJCWNoYW5nZWRfZmxhZ3MsICp0b3RhbF9mbGFncyk7Ci0KLQlDSEsoRklGX09USEVSX0JTUyB8IEZJRl9QUk9NSVNDX0lOX0JTUywgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0spOwotCUNISyhGSUZfQ09OVFJPTCwgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLKTsKLQlDSEsoRklGX0JDTl9QUkJSRVNQX1BST01JU0MsIFJYT05fRklMVEVSX0JDT05fQVdBUkVfTVNLKTsKLQotI3VuZGVmIENISwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+ZmlsdGVyX25hbmQ7Ci0JY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBmaWx0ZXJfb3I7Ci0KLQkvKgotCSAqIE5vdCBjb21taXR0aW5nIGRpcmVjdGx5IGJlY2F1c2UgaGFyZHdhcmUgY2FuIHBlcmZvcm0gYSBzY2FuLAotCSAqIGJ1dCBldmVuIGlmIGh3IGlzIHJlYWR5LCBjb21taXR0aW5nIGhlcmUgYnJlYWtzIGZvciBzb21lIHJlYXNvbiwKLQkgKiB3ZSdsbCBldmVudHVhbGx5IGNvbW1pdCB0aGUgZmlsdGVyIGZsYWdzIGNoYW5nZSBhbnl3YXkuCi0JICovCi0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCS8qCi0JICogUmVjZWl2aW5nIGFsbCBtdWx0aWNhc3QgZnJhbWVzIGlzIGFsd2F5cyBlbmFibGVkIGJ5IHRoZQotCSAqIGRlZmF1bHQgZmxhZ3Mgc2V0dXAgaW4gaXdsX2xlZ2FjeV9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKCkKLQkgKiBzaW5jZSB3ZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgcHJvZ3JhbW1pbmcgbXVsdGljYXN0Ci0JICogZmlsdGVycyBpbnRvIHRoZSBkZXZpY2UuCi0JICovCi0JKnRvdGFsX2ZsYWdzICY9IEZJRl9PVEhFUl9CU1MgfCBGSUZfQUxMTVVMVEkgfCBGSUZfUFJPTUlTQ19JTl9CU1MgfAotCQkJRklGX0JDTl9QUkJSRVNQX1BST01JU0MgfCBGSUZfQ09OVFJPTDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBzeXNmcyBhdHRyaWJ1dGVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGFkZHMgYSBuZXcgYXR0cmlidXRlIHRvIHRoZSBzeXNmcyByZXByZXNlbnRhdGlvbgotICogb2YgdGhpcyBkZXZpY2UgZHJpdmVyIChpLmUuIGEgbmV3IGZpbGUgaW4gL3N5cy9idXMvcGNpL2RyaXZlcnMvaXdsLykKLSAqIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBkZWJ1ZyBsZXZlbC4KLSAqCi0gKiBTZWUgdGhlIGxldmVsIGRlZmluaXRpb25zIGluIGl3bCBmb3IgZGV0YWlscy4KLSAqCi0gKiBUaGUgZGVidWdfbGV2ZWwgYmVpbmcgbWFuYWdlZCB1c2luZyBzeXNmcyBiZWxvdyBpcyBhIHBlciBkZXZpY2UgZGVidWcKLSAqIGxldmVsIHRoYXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgZGVidWcgbGV2ZWwgaWYgaXQgKHRoZSBwZXIKLSAqIGRldmljZSBkZWJ1ZyBsZXZlbCkgaXMgc2V0LgotICovCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Nob3dfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOFhcbiIsIGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKHByaXYpKTsKLX0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc3RvcmVfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOwotCWlmIChyZXQpCi0JCUlXTF9JTkZPKHByaXYsICIlcyBpcyBub3QgaW4gaGV4IG9yIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7Ci0JZWxzZSB7Ci0JCXByaXYtPmRlYnVnX2xldmVsID0gdmFsOwotCQlpZiAoaXdsX2xlZ2FjeV9hbGxvY190cmFmZmljX21lbShwcml2KSkKLQkJCUlXTF9FUlIocHJpdiwKLQkJCQkiTm90IGVub3VnaCBtZW1vcnkgdG8gZ2VuZXJhdGUgdHJhZmZpYyBsb2dcbiIpOwotCX0KLQlyZXR1cm4gc3RybmxlbihidWYsIGNvdW50KTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGRlYnVnX2xldmVsLCBTX0lXVVNSIHwgU19JUlVHTywKLQkJCWl3bDM5NDVfc2hvd19kZWJ1Z19sZXZlbCwgaXdsMzk0NV9zdG9yZV9kZWJ1Z19sZXZlbCk7Ci0KLSNlbmRpZiAvKiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcgKi8KLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIGl3bDM5NDVfaHdfZ2V0X3RlbXBlcmF0dXJlKHByaXYpKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHRlbXBlcmF0dXJlLCBTX0lSVUdPLCBpd2wzOTQ1X3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Nob3dfdHhfcG93ZXIoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHByaXYtPnR4X3Bvd2VyX3VzZXJfbG10KTsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zdG9yZV90eF9wb3dlcihzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JY2hhciAqcCA9IChjaGFyICopYnVmOwotCXUzMiB2YWw7Ci0KLQl2YWwgPSBzaW1wbGVfc3RydG91bChwLCAmcCwgMTApOwotCWlmIChwID09IGJ1ZikKLQkJSVdMX0lORk8ocHJpdiwgIjogJXMgaXMgbm90IGluIGRlY2ltYWwgZm9ybS5cbiIsIGJ1Zik7Ci0JZWxzZQotCQlpd2wzOTQ1X2h3X3JlZ19zZXRfdHhwb3dlcihwcml2LCB2YWwpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIodHhfcG93ZXIsIFNfSVdVU1IgfCBTX0lSVUdPLCBpd2wzOTQ1X3Nob3dfdHhfcG93ZXIsIGl3bDM5NDVfc3RvcmVfdHhfcG93ZXIpOwotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Nob3dfZmxhZ3Moc3RydWN0IGRldmljZSAqZCwKLQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA0WFxuIiwgY3R4LT5hY3RpdmUuZmxhZ3MpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3N0b3JlX2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQl1MzIgZmxhZ3MgPSBzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKGxlMzJfdG9fY3B1KGN0eC0+c3RhZ2luZy5mbGFncykgIT0gZmxhZ3MpIHsKLQkJLyogQ2FuY2VsIGFueSBjdXJyZW50bHkgcnVubmluZyBzY2Fucy4uLiAqLwotCQlpZiAoaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDEwMCkpCi0JCQlJV0xfV0FSTihwcml2LCAiQ291bGQgbm90IGNhbmNlbCBzY2FuLlxuIik7Ci0JCWVsc2UgewotCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNvbW1pdHRpbmcgcnhvbi5mbGFncyA9IDB4JTA0WFxuIiwKLQkJCQkgICAgICAgZmxhZ3MpOwotCQkJY3R4LT5zdGFnaW5nLmZsYWdzID0gY3B1X3RvX2xlMzIoZmxhZ3MpOwotCQkJaXdsMzk0NV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCQl9Ci0JfQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoZmxhZ3MsIFNfSVdVU1IgfCBTX0lSVUdPLCBpd2wzOTQ1X3Nob3dfZmxhZ3MsIGl3bDM5NDVfc3RvcmVfZmxhZ3MpOwotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Nob3dfZmlsdGVyX2ZsYWdzKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0KLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwNFhcbiIsCi0JCWxlMzJfdG9fY3B1KGN0eC0+YWN0aXZlLmZpbHRlcl9mbGFncykpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3N0b3JlX2ZpbHRlcl9mbGFncyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQl1MzIgZmlsdGVyX2ZsYWdzID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpZiAobGUzMl90b19jcHUoY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncykgIT0gZmlsdGVyX2ZsYWdzKSB7Ci0JCS8qIENhbmNlbCBhbnkgY3VycmVudGx5IHJ1bm5pbmcgc2NhbnMuLi4gKi8KLQkJaWYgKGl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApKQotCQkJSVdMX1dBUk4ocHJpdiwgIkNvdWxkIG5vdCBjYW5jZWwgc2Nhbi5cbiIpOwotCQllbHNlIHsKLQkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJDb21taXR0aW5nIHJ4b24uZmlsdGVyX2ZsYWdzID0gIgotCQkJCSAgICAgICAiMHglMDRYXG4iLCBmaWx0ZXJfZmxhZ3MpOwotCQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyA9Ci0JCQkJY3B1X3RvX2xlMzIoZmlsdGVyX2ZsYWdzKTsKLQkJCWl3bDM5NDVfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQkJfQotCX0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGZpbHRlcl9mbGFncywgU19JV1VTUiB8IFNfSVJVR08sIGl3bDM5NDVfc2hvd19maWx0ZXJfZmxhZ3MsCi0JCSAgIGl3bDM5NDVfc3RvcmVfZmlsdGVyX2ZsYWdzKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X21lYXN1cmVtZW50KHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0Jc3RydWN0IGl3bF9zcGVjdHJ1bV9ub3RpZmljYXRpb24gbWVhc3VyZV9yZXBvcnQ7Ci0JdTMyIHNpemUgPSBzaXplb2YobWVhc3VyZV9yZXBvcnQpLCBsZW4gPSAwLCBvZnMgPSAwOwotCXU4ICpkYXRhID0gKHU4ICopJm1lYXN1cmVfcmVwb3J0OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWlmICghKHByaXYtPm1lYXN1cmVtZW50X3N0YXR1cyAmIE1FQVNVUkVNRU5UX1JFQURZKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQltZW1jcHkoJm1lYXN1cmVfcmVwb3J0LCAmcHJpdi0+bWVhc3VyZV9yZXBvcnQsIHNpemUpOwotCXByaXYtPm1lYXN1cmVtZW50X3N0YXR1cyA9IDA7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0Jd2hpbGUgKHNpemUgJiYgKFBBR0VfU0laRSAtIGxlbikpIHsKLQkJaGV4X2R1bXBfdG9fYnVmZmVyKGRhdGEgKyBvZnMsIHNpemUsIDE2LCAxLCBidWYgKyBsZW4sCi0JCQkJICAgUEFHRV9TSVpFIC0gbGVuLCAxKTsKLQkJbGVuID0gc3RybGVuKGJ1Zik7Ci0JCWlmIChQQUdFX1NJWkUgLSBsZW4pCi0JCQlidWZbbGVuKytdID0gJ1xuJzsKLQotCQlvZnMgKz0gMTY7Ci0JCXNpemUgLT0gbWluKHNpemUsIDE2VSk7Ci0JfQotCi0JcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zdG9yZV9tZWFzdXJlbWVudChzdHJ1Y3QgZGV2aWNlICpkLAotCQkJCSBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0Jc3RydWN0IGllZWU4MDIxMV9tZWFzdXJlbWVudF9wYXJhbXMgcGFyYW1zID0gewotCQkuY2hhbm5lbCA9IGxlMTZfdG9fY3B1KGN0eC0+YWN0aXZlLmNoYW5uZWwpLAotCQkuc3RhcnRfdGltZSA9IGNwdV90b19sZTY0KHByaXYtPl8zOTQ1Lmxhc3RfdHNmKSwKLQkJLmR1cmF0aW9uID0gY3B1X3RvX2xlMTYoMSksCi0JfTsKLQl1OCB0eXBlID0gSVdMX01FQVNVUkVfQkFTSUM7Ci0JdTggYnVmZmVyWzMyXTsKLQl1OCBjaGFubmVsOwotCi0JaWYgKGNvdW50KSB7Ci0JCWNoYXIgKnAgPSBidWZmZXI7Ci0JCXN0cm5jcHkoYnVmZmVyLCBidWYsIG1pbihzaXplb2YoYnVmZmVyKSwgY291bnQpKTsKLQkJY2hhbm5lbCA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDApOwotCQlpZiAoY2hhbm5lbCkKLQkJCXBhcmFtcy5jaGFubmVsID0gY2hhbm5lbDsKLQotCQlwID0gYnVmZmVyOwotCQl3aGlsZSAoKnAgJiYgKnAgIT0gJyAnKQotCQkJcCsrOwotCQlpZiAoKnApCi0JCQl0eXBlID0gc2ltcGxlX3N0cnRvdWwocCArIDEsIE5VTEwsIDApOwotCX0KLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbnZva2luZyBtZWFzdXJlbWVudCBvZiB0eXBlICVkIG9uICIKLQkJICAgICAgICJjaGFubmVsICVkIChmb3IgJyVzJylcbiIsIHR5cGUsIHBhcmFtcy5jaGFubmVsLCBidWYpOwotCWl3bDM5NDVfZ2V0X21lYXN1cmVtZW50KHByaXYsICZwYXJhbXMsIHR5cGUpOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIobWVhc3VyZW1lbnQsIFNfSVJVU1IgfCBTX0lXVVNSLAotCQkgICBpd2wzOTQ1X3Nob3dfbWVhc3VyZW1lbnQsIGl3bDM5NDVfc3RvcmVfbWVhc3VyZW1lbnQpOwotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3N0b3JlX3JldHJ5X3JhdGUoc3RydWN0IGRldmljZSAqZCwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQljb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0KLQlwcml2LT5yZXRyeV9yYXRlID0gc2ltcGxlX3N0cnRvdWwoYnVmLCBOVUxMLCAwKTsKLQlpZiAocHJpdi0+cmV0cnlfcmF0ZSA8PSAwKQotCQlwcml2LT5yZXRyeV9yYXRlID0gMTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9zaG93X3JldHJ5X3JhdGUoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIlZCIsIHByaXYtPnJldHJ5X3JhdGUpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIocmV0cnlfcmF0ZSwgU19JV1VTUiB8IFNfSVJVU1IsIGl3bDM5NDVfc2hvd19yZXRyeV9yYXRlLAotCQkgICBpd2wzOTQ1X3N0b3JlX3JldHJ5X3JhdGUpOwotCi0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc2hvd19jaGFubmVscyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCS8qIGFsbCB0aGlzIHNoaXQgZG9lc24ndCBiZWxvbmcgaW50byBzeXNmcyBhbnl3YXkgKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKGNoYW5uZWxzLCBTX0lSVVNSLCBpd2wzOTQ1X3Nob3dfY2hhbm5lbHMsIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Nob3dfYW50ZW5uYShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2FsaXZlKHByaXYpKQotCQlyZXR1cm4gLUVBR0FJTjsKLQotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkXG4iLCBpd2wzOTQ1X21vZF9wYXJhbXMuYW50ZW5uYSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IGl3bDM5NDVfc3RvcmVfYW50ZW5uYShzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2IF9fbWF5YmVfdW51c2VkID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCWludCBhbnQ7Ci0KLQlpZiAoY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc3NjYW5mKGJ1ZiwgIiUxaSIsICZhbnQpICE9IDEpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIm5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIik7Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlpZiAoKGFudCA+PSAwKSAmJiAoYW50IDw9IDIpKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJTZXR0aW5nIGFudGVubmEgc2VsZWN0IHRvICVkLlxuIiwgYW50KTsKLQkJaXdsMzk0NV9tb2RfcGFyYW1zLmFudGVubmEgPSAoZW51bSBpd2wzOTQ1X2FudGVubmEpYW50OwotCX0gZWxzZQotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQmFkIGFudGVubmEgc2VsZWN0IHZhbHVlICVkLlxuIiwgYW50KTsKLQotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoYW50ZW5uYSwgU19JV1VTUiB8IFNfSVJVR08sIGl3bDM5NDVfc2hvd19hbnRlbm5hLCBpd2wzOTQ1X3N0b3JlX2FudGVubmEpOwotCi1zdGF0aWMgc3NpemVfdCBpd2wzOTQ1X3Nob3dfc3RhdHVzKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpCi0JCXJldHVybiAtRUFHQUlOOwotCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjB4JTA4eFxuIiwgKGludClwcml2LT5zdGF0dXMpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoc3RhdHVzLCBTX0lSVUdPLCBpd2wzOTQ1X3Nob3dfc3RhdHVzLCBOVUxMKTsKLQotc3RhdGljIHNzaXplX3QgaXdsMzk0NV9kdW1wX2Vycm9yX2xvZyhzdHJ1Y3QgZGV2aWNlICpkLAotCQkJICAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0JY2hhciAqcCA9IChjaGFyICopYnVmOwotCi0JaWYgKHBbMF0gPT0gJzEnKQotCQlpd2wzOTQ1X2R1bXBfbmljX2Vycm9yX2xvZyhwcml2KTsKLQotCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoZHVtcF9lcnJvcnMsIFNfSVdVU1IsIE5VTEwsIGl3bDM5NDVfZHVtcF9lcnJvcl9sb2cpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBkcml2ZXIgc2V0dXAgYW5kIHRlYXIgZG93bgotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgaXdsMzk0NV9zZXR1cF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlwcml2LT53b3JrcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZShEUlZfTkFNRSk7Ci0KLQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotCi0JSU5JVF9XT1JLKCZwcml2LT5yZXN0YXJ0LCBpd2wzOTQ1X2JnX3Jlc3RhcnQpOwotCUlOSVRfV09SSygmcHJpdi0+cnhfcmVwbGVuaXNoLCBpd2wzOTQ1X2JnX3J4X3JlcGxlbmlzaCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmluaXRfYWxpdmVfc3RhcnQsIGl3bDM5NDVfYmdfaW5pdF9hbGl2ZV9zdGFydCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmFsaXZlX3N0YXJ0LCBpd2wzOTQ1X2JnX2FsaXZlX3N0YXJ0KTsKLQlJTklUX0RFTEFZRURfV09SSygmcHJpdi0+XzM5NDUucmZraWxsX3BvbGwsIGl3bDM5NDVfcmZraWxsX3BvbGwpOwotCi0JaXdsX2xlZ2FjeV9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmsocHJpdik7Ci0KLQlpd2wzOTQ1X2h3X3NldHVwX2RlZmVycmVkX3dvcmsocHJpdik7Ci0KLQlpbml0X3RpbWVyKCZwcml2LT53YXRjaGRvZyk7Ci0JcHJpdi0+d2F0Y2hkb2cuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXByaXY7Ci0JcHJpdi0+d2F0Y2hkb2cuZnVuY3Rpb24gPSBpd2xfbGVnYWN5X2JnX3dhdGNoZG9nOwotCi0JdGFza2xldF9pbml0KCZwcml2LT5pcnFfdGFza2xldCwgKHZvaWQgKCopKHVuc2lnbmVkIGxvbmcpKQotCQkgICAgIGl3bDM5NDVfaXJxX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXByaXYpOwotfQotCi1zdGF0aWMgdm9pZCBpd2wzOTQ1X2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2wzOTQ1X2h3X2NhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOwotCi0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5pbml0X2FsaXZlX3N0YXJ0KTsKLQljYW5jZWxfZGVsYXllZF93b3JrKCZwcml2LT5hbGl2ZV9zdGFydCk7Ci0KLQlpd2xfbGVnYWN5X2NhbmNlbF9zY2FuX2RlZmVycmVkX3dvcmsocHJpdik7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICppd2wzOTQ1X3N5c2ZzX2VudHJpZXNbXSA9IHsKLQkmZGV2X2F0dHJfYW50ZW5uYS5hdHRyLAotCSZkZXZfYXR0cl9jaGFubmVscy5hdHRyLAotCSZkZXZfYXR0cl9kdW1wX2Vycm9ycy5hdHRyLAotCSZkZXZfYXR0cl9mbGFncy5hdHRyLAotCSZkZXZfYXR0cl9maWx0ZXJfZmxhZ3MuYXR0ciwKLQkmZGV2X2F0dHJfbWVhc3VyZW1lbnQuYXR0ciwKLQkmZGV2X2F0dHJfcmV0cnlfcmF0ZS5hdHRyLAotCSZkZXZfYXR0cl9zdGF0dXMuYXR0ciwKLQkmZGV2X2F0dHJfdGVtcGVyYXR1cmUuYXR0ciwKLQkmZGV2X2F0dHJfdHhfcG93ZXIuYXR0ciwKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQkmZGV2X2F0dHJfZGVidWdfbGV2ZWwuYXR0ciwKLSNlbmRpZgotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGl3bDM5NDVfYXR0cmlidXRlX2dyb3VwID0gewotCS5uYW1lID0gTlVMTCwJCS8qIHB1dCBpbiBkZXZpY2UgZGlyZWN0b3J5ICovCi0JLmF0dHJzID0gaXdsMzk0NV9zeXNmc19lbnRyaWVzLAotfTsKLQotc3RydWN0IGllZWU4MDIxMV9vcHMgaXdsMzk0NV9od19vcHMgPSB7Ci0JLnR4ID0gaXdsMzk0NV9tYWNfdHgsCi0JLnN0YXJ0ID0gaXdsMzk0NV9tYWNfc3RhcnQsCi0JLnN0b3AgPSBpd2wzOTQ1X21hY19zdG9wLAotCS5hZGRfaW50ZXJmYWNlID0gaXdsX2xlZ2FjeV9tYWNfYWRkX2ludGVyZmFjZSwKLQkucmVtb3ZlX2ludGVyZmFjZSA9IGl3bF9sZWdhY3lfbWFjX3JlbW92ZV9pbnRlcmZhY2UsCi0JLmNoYW5nZV9pbnRlcmZhY2UgPSBpd2xfbGVnYWN5X21hY19jaGFuZ2VfaW50ZXJmYWNlLAotCS5jb25maWcgPSBpd2xfbGVnYWN5X21hY19jb25maWcsCi0JLmNvbmZpZ3VyZV9maWx0ZXIgPSBpd2wzOTQ1X2NvbmZpZ3VyZV9maWx0ZXIsCi0JLnNldF9rZXkgPSBpd2wzOTQ1X21hY19zZXRfa2V5LAotCS5jb25mX3R4ID0gaXdsX2xlZ2FjeV9tYWNfY29uZl90eCwKLQkucmVzZXRfdHNmID0gaXdsX2xlZ2FjeV9tYWNfcmVzZXRfdHNmLAotCS5ic3NfaW5mb19jaGFuZ2VkID0gaXdsX2xlZ2FjeV9tYWNfYnNzX2luZm9fY2hhbmdlZCwKLQkuaHdfc2NhbiA9IGl3bF9sZWdhY3lfbWFjX2h3X3NjYW4sCi0JLnN0YV9hZGQgPSBpd2wzOTQ1X21hY19zdGFfYWRkLAotCS5zdGFfcmVtb3ZlID0gaXdsX2xlZ2FjeV9tYWNfc3RhX3JlbW92ZSwKLQkudHhfbGFzdF9iZWFjb24gPSBpd2xfbGVnYWN5X21hY190eF9sYXN0X2JlYWNvbiwKLX07Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9pbml0X2RydihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKmVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0KLQlwcml2LT5yZXRyeV9yYXRlID0gMTsKLQlwcml2LT5iZWFjb25fc2tiID0gTlVMTDsKLQotCXNwaW5fbG9ja19pbml0KCZwcml2LT5zdGFfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPmhjbWRfbG9jayk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmcHJpdi0+ZnJlZV9mcmFtZXMpOwotCi0JbXV0ZXhfaW5pdCgmcHJpdi0+bXV0ZXgpOwotCi0JcHJpdi0+aWVlZV9jaGFubmVscyA9IE5VTEw7Ci0JcHJpdi0+aWVlZV9yYXRlcyA9IE5VTEw7Ci0JcHJpdi0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0KLQlwcml2LT5pd19tb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKLQlwcml2LT5taXNzZWRfYmVhY29uX3RocmVzaG9sZCA9IElXTF9NSVNTRURfQkVBQ09OX1RIUkVTSE9MRF9ERUY7Ci0KLQkvKiBpbml0aWFsaXplIGZvcmNlIHJlc2V0ICovCi0JcHJpdi0+Zm9yY2VfcmVzZXQucmVzZXRfZHVyYXRpb24gPSBJV0xfREVMQVlfTkVYVF9GT1JDRV9GV19SRUxPQUQ7Ci0KLQlpZiAoZWVwcm9tLT52ZXJzaW9uIDwgRUVQUk9NXzM5NDVfRUVQUk9NX1ZFUlNJT04pIHsKLQkJSVdMX1dBUk4ocHJpdiwgIlVuc3VwcG9ydGVkIEVFUFJPTSB2ZXJzaW9uOiAweCUwNFhcbiIsCi0JCQkgZWVwcm9tLT52ZXJzaW9uKTsKLQkJcmV0ID0gLUVJTlZBTDsKLQkJZ290byBlcnI7Ci0JfQotCXJldCA9IGl3bF9sZWdhY3lfaW5pdF9jaGFubmVsX21hcChwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgImluaXRpYWxpemluZyByZWd1bGF0b3J5IGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCS8qIFNldCB1cCB0eHBvd2VyIHNldHRpbmdzIGluIGRyaXZlciBmb3IgYWxsIGNoYW5uZWxzICovCi0JaWYgKGl3bDM5NDVfdHhwb3dlcl9zZXRfZnJvbV9lZXByb20ocHJpdikpIHsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBlcnJfZnJlZV9jaGFubmVsX21hcDsKLQl9Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X2luaXRfZ2Vvcyhwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgImluaXRpYWxpemluZyBnZW9zIGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyX2ZyZWVfY2hhbm5lbF9tYXA7Ci0JfQotCWl3bDM5NDVfaW5pdF9od19yYXRlcyhwcml2LCBwcml2LT5pZWVlX3JhdGVzKTsKLQotCXJldHVybiAwOwotCi1lcnJfZnJlZV9jaGFubmVsX21hcDoKLQlpd2xfbGVnYWN5X2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7Ci1lcnI6Ci0JcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBJV0wzOTQ1X01BWF9QUk9CRV9SRVFVRVNUCTIwMAotCi1zdGF0aWMgaW50IGl3bDM5NDVfc2V0dXBfbWFjKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7Ci0KLQlody0+cmF0ZV9jb250cm9sX2FsZ29yaXRobSA9ICJpd2wtMzk0NS1ycyI7Ci0JaHctPnN0YV9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bDM5NDVfc3RhX3ByaXYpOwotCWh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdmlmX3ByaXYpOwotCi0JLyogVGVsbCBtYWM4MDIxMSBvdXIgY2hhcmFjdGVyaXN0aWNzICovCi0JaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfAotCQkgICAgSUVFRTgwMjExX0hXX1NQRUNUUlVNX01HTVQ7Ci0KLQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyA9Ci0JCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmludGVyZmFjZV9tb2RlczsKLQotCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSB8Ci0JCQkgICAgV0lQSFlfRkxBR19ESVNBQkxFX0JFQUNPTl9ISU5UUyB8Ci0JCQkgICAgV0lQSFlfRkxBR19JQlNTX1JTTjsKLQotCWh3LT53aXBoeS0+bWF4X3NjYW5fc3NpZHMgPSBQUk9CRV9PUFRJT05fTUFYXzM5NDU7Ci0JLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBhIHplcm8tbGVuZ3RoIFNTSUQgZWxlbWVudCAqLwotCWh3LT53aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gSVdMMzk0NV9NQVhfUFJPQkVfUkVRVUVTVCAtIDI0IC0gMjsKLQotCS8qIERlZmF1bHQgdmFsdWU7IDQgRURDQSBRT1MgcHJpb3JpdGllcyAqLwotCWh3LT5xdWV1ZXMgPSA0OwotCi0JaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fY2hhbm5lbHMpCi0JCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPQotCQkJJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOwotCi0JaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fY2hhbm5lbHMpCi0JCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQotCQkJJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOwotCi0JaXdsX2xlZ2FjeV9sZWRzX2luaXQocHJpdik7Ci0KLQlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcocHJpdi0+aHcpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGh3IChlcnJvciAlZClcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsMzk0NV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCi17Ci0JaW50IGVyciA9IDAsIGk7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2OwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCXN0cnVjdCBpd2xfY2ZnICpjZmcgPSAoc3RydWN0IGl3bF9jZmcgKikoZW50LT5kcml2ZXJfZGF0YSk7Ci0Jc3RydWN0IGl3bDM5NDVfZWVwcm9tICplZXByb207Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDEuIEFsbG9jYXRpbmcgSFcgZGF0YQotCSAqICoqKioqKioqKioqKioqKioqKioqLwotCi0JLyogbWFjODAyMTEgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdGhpcyBkZXZpY2UgaW5zdGFuY2UsIGluY2x1ZGluZwotCSAqICAgc3BhY2UgZm9yIHRoaXMgZHJpdmVyJ3MgcHJpdmF0ZSBzdHJ1Y3R1cmUgKi8KLQlodyA9IGl3bF9sZWdhY3lfYWxsb2NfYWxsKGNmZyk7Ci0JaWYgKGh3ID09IE5VTEwpIHsKLQkJcHJfZXJyKCJDYW4gbm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iKTsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCXByaXYgPSBody0+cHJpdjsKLQlTRVRfSUVFRTgwMjExX0RFVihodywgJnBkZXYtPmRldik7Ci0KLQlwcml2LT5jbWRfcXVldWUgPSBJV0wzOV9DTURfUVVFVUVfTlVNOwotCi0JLyogMzk0NSBoYXMgb25seSBvbmUgdmFsaWQgY29udGV4dCAqLwotCXByaXYtPnZhbGlkX2NvbnRleHRzID0gQklUKElXTF9SWE9OX0NUWF9CU1MpOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9JV0xfUlhPTl9DVFg7IGkrKykKLQkJcHJpdi0+Y29udGV4dHNbaV0uY3R4aWQgPSBpOwotCi0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ucnhvbl9jbWQgPSBSRVBMWV9SWE9OOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnJ4b25fdGltaW5nX2NtZCA9IFJFUExZX1JYT05fVElNSU5HOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnJ4b25fYXNzb2NfY21kID0gUkVQTFlfUlhPTl9BU1NPQzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5xb3NfY21kID0gUkVQTFlfUU9TX1BBUkFNOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFwX3N0YV9pZCA9IElXTF9BUF9JRDsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS53ZXBfa2V5X2NtZCA9IFJFUExZX1dFUEtFWTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5pbnRlcmZhY2VfbW9kZXMgPQotCQlCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgfAotCQlCSVQoTkw4MDIxMV9JRlRZUEVfQURIT0MpOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmlic3NfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfSUJTUzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5zdGF0aW9uX2RldnR5cGUgPSBSWE9OX0RFVl9UWVBFX0VTUzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS51bnVzZWRfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfRVNTOwotCi0JLyoKLQkgKiBEaXNhYmxpbmcgaGFyZHdhcmUgc2NhbiBtZWFucyB0aGF0IG1hYzgwMjExIHdpbGwgcGVyZm9ybSBzY2FucwotCSAqICJ0aGUgaGFyZCB3YXkiLCByYXRoZXIgdGhhbiB1c2luZyBkZXZpY2UncyBzY2FuLgotCSAqLwotCWlmIChpd2wzOTQ1X21vZF9wYXJhbXMuZGlzYWJsZV9od19zY2FuKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJEaXNhYmxpbmcgaHdfc2NhblxuIik7Ci0JCWl3bDM5NDVfaHdfb3BzLmh3X3NjYW4gPSBOVUxMOwotCX0KLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICIqKiogTE9BRCBEUklWRVIgKioqXG4iKTsKLQlwcml2LT5jZmcgPSBjZmc7Ci0JcHJpdi0+cGNpX2RldiA9IHBkZXY7Ci0JcHJpdi0+aW50YV9tYXNrID0gQ1NSX0lOSV9TRVRfTUFTSzsKLQotCWlmIChpd2xfbGVnYWN5X2FsbG9jX3RyYWZmaWNfbWVtKHByaXYpKQotCQlJV0xfRVJSKHByaXYsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBnZW5lcmF0ZSB0cmFmZmljIGxvZ1xuIik7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogMi4gSW5pdGlhbGl6aW5nIFBDSSBidXMKLQkgKiAqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXBjaV9kaXNhYmxlX2xpbmtfc3RhdGUocGRldiwgUENJRV9MSU5LX1NUQVRFX0wwUyB8IFBDSUVfTElOS19TVEFURV9MMSB8Ci0JCQkJUENJRV9MSU5LX1NUQVRFX0NMS1BNKTsKLQotCWlmIChwY2lfZW5hYmxlX2RldmljZShwZGV2KSkgewotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIG91dF9pZWVlODAyMTFfZnJlZV9odzsKLQl9Ci0KLQlwY2lfc2V0X21hc3RlcihwZGV2KTsKLQotCWVyciA9IHBjaV9zZXRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDMyKSk7Ci0JaWYgKCFlcnIpCi0JCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsKLQlpZiAoZXJyKSB7Ci0JCUlXTF9XQVJOKHByaXYsICJObyBzdWl0YWJsZSBETUEgYXZhaWxhYmxlLlxuIik7Ci0JCWdvdG8gb3V0X3BjaV9kaXNhYmxlX2RldmljZTsKLQl9Ci0KLQlwY2lfc2V0X2RydmRhdGEocGRldiwgcHJpdik7Ci0JZXJyID0gcGNpX3JlcXVlc3RfcmVnaW9ucyhwZGV2LCBEUlZfTkFNRSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfcGNpX2Rpc2FibGVfZGV2aWNlOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqCi0JICogMy4gUmVhZCBSRVYgUmVnaXN0ZXIKLQkgKiAqKioqKioqKioqKioqKioqKioqKi8KLQlwcml2LT5od19iYXNlID0gcGNpX2lvbWFwKHBkZXYsIDAsIDApOwotCWlmICghcHJpdi0+aHdfYmFzZSkgewotCQllcnIgPSAtRU5PREVWOwotCQlnb3RvIG91dF9wY2lfcmVsZWFzZV9yZWdpb25zOwotCX0KLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJwY2lfcmVzb3VyY2VfbGVuID0gMHglMDhsbHhcbiIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicGNpX3Jlc291cmNlX2Jhc2UgPSAlcFxuIiwgcHJpdi0+aHdfYmFzZSk7Ci0KLQkvKiBXZSBkaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwCi0JICogUENJIFR4IHJldHJpZXMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIEMzIENQVSBzdGF0ZSAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCAweDQxLCAweDAwKTsKLQotCS8qIHRoZXNlIHNwaW4gbG9ja3Mgd2lsbCBiZSB1c2VkIGluIGFwbV9vcHMuaW5pdCBhbmQgRUVQUk9NIGFjY2VzcwotCSAqIHdlIHNob3VsZCBpbml0IG5vdwotCSAqLwotCXNwaW5fbG9ja19pbml0KCZwcml2LT5yZWdfbG9jayk7Ci0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPmxvY2spOwotCi0JLyoKLQkgKiBzdG9wIGFuZCByZXNldCB0aGUgb24tYm9hcmQgcHJvY2Vzc29yIGp1c3QgaW4gY2FzZSBpdCBpcyBpbiBhCi0JICogc3RyYW5nZSBzdGF0ZSAuLi4gbGlrZSBiZWluZyBsZWZ0IHN0cmFuZGVkIGJ5IGEgcHJpbWFyeSBrZXJuZWwKLQkgKiBhbmQgdGhpcyBpcyBub3cgdGhlIGtkdW1wIGtlcm5lbCB0cnlpbmcgdG8gc3RhcnQgdXAKLQkgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDQuIFJlYWQgRUVQUk9NCi0JICogKioqKioqKioqKioqKioqKioqKiovCi0KLQkvKiBSZWFkIHRoZSBFRVBST00gKi8KLQllcnIgPSBpd2xfbGVnYWN5X2VlcHJvbV9pbml0KHByaXYpOwotCWlmIChlcnIpIHsKLQkJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXQgRUVQUk9NXG4iKTsKLQkJZ290byBvdXRfaW91bm1hcDsKLQl9Ci0JLyogTUFDIEFkZHJlc3MgbG9jYXRpb24gaW4gRUVQUk9NIHNhbWUgZm9yIDM5NDUvNDk2NSAqLwotCWVlcHJvbSA9IChzdHJ1Y3QgaXdsMzk0NV9lZXByb20gKilwcml2LT5lZXByb207Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIk1BQyBhZGRyZXNzOiAlcE1cbiIsIGVlcHJvbS0+bWFjX2FkZHJlc3MpOwotCVNFVF9JRUVFODAyMTFfUEVSTV9BRERSKHByaXYtPmh3LCBlZXByb20tPm1hY19hZGRyZXNzKTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDUuIFNldHVwIEhXIENvbnN0YW50cwotCSAqICoqKioqKioqKioqKioqKioqKioqLwotCS8qIERldmljZS1zcGVjaWZpYyBzZXR1cCAqLwotCWlmIChpd2wzOTQ1X2h3X3NldF9od19wYXJhbXMocHJpdikpIHsKLQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNldCBodyBzZXR0aW5nc1xuIik7Ci0JCWdvdG8gb3V0X2VlcHJvbV9mcmVlOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDYuIFNldHVwIHByaXYKLQkgKiAqKioqKioqKioqKioqKioqKioqKi8KLQotCWVyciA9IGl3bDM5NDVfaW5pdF9kcnYocHJpdik7Ci0JaWYgKGVycikgewotCQlJV0xfRVJSKHByaXYsICJpbml0aWFsaXppbmcgZHJpdmVyIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0X3Vuc2V0X2h3X3BhcmFtczsKLQl9Ci0KLQlJV0xfSU5GTyhwcml2LCAiRGV0ZWN0ZWQgSW50ZWwgV2lyZWxlc3MgV2lGaSBMaW5rICVzXG4iLAotCQlwcml2LT5jZmctPm5hbWUpOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqCi0JICogNy4gU2V0dXAgU2VydmljZXMKLQkgKiAqKioqKioqKioqKioqKioqKioqKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaXdsX2xlZ2FjeV9kaXNhYmxlX2ludGVycnVwdHMocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JcGNpX2VuYWJsZV9tc2kocHJpdi0+cGNpX2Rldik7Ci0KLQllcnIgPSByZXF1ZXN0X2lycShwcml2LT5wY2lfZGV2LT5pcnEsIGl3bF9sZWdhY3lfaXNyLAotCQkJICBJUlFGX1NIQVJFRCwgRFJWX05BTUUsIHByaXYpOwotCWlmIChlcnIpIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3IgYWxsb2NhdGluZyBJUlEgJWRcbiIsIHByaXYtPnBjaV9kZXYtPmlycSk7Ci0JCWdvdG8gb3V0X2Rpc2FibGVfbXNpOwotCX0KLQotCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpd2wzOTQ1X2F0dHJpYnV0ZV9ncm91cCk7Ci0JaWYgKGVycikgewotCQlJV0xfRVJSKHByaXYsICJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGRldmljZSBhdHRyaWJ1dGVzXG4iKTsKLQkJZ290byBvdXRfcmVsZWFzZV9pcnE7Ci0JfQotCi0JaXdsX2xlZ2FjeV9zZXRfcnhvbl9jaGFubmVsKHByaXYsCi0JCQkgICAgICZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXS5jaGFubmVsc1s1XSwKLQkJCSAgICAgJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKLQlpd2wzOTQ1X3NldHVwX2RlZmVycmVkX3dvcmsocHJpdik7Ci0JaXdsMzk0NV9zZXR1cF9yeF9oYW5kbGVycyhwcml2KTsKLQlpd2xfbGVnYWN5X3Bvd2VyX2luaXRpYWxpemUocHJpdik7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogOC4gU2V0dXAgYW5kIFJlZ2lzdGVyIG1hYzgwMjExCi0JICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCWl3bF9sZWdhY3lfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0KLQllcnIgPSBpd2wzOTQ1X3NldHVwX21hYyhwcml2KTsKLQlpZiAoZXJyKQotCQlnb3RvICBvdXRfcmVtb3ZlX3N5c2ZzOwotCi0JZXJyID0gaXdsX2xlZ2FjeV9kYmdmc19yZWdpc3Rlcihwcml2LCBEUlZfTkFNRSk7Ci0JaWYgKGVycikKLQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIGNyZWF0ZSBkZWJ1Z2ZzIGZpbGVzLiBJZ25vcmluZyBlcnJvcjogJWRcbiIsIGVycik7Ci0KLQkvKiBTdGFydCBtb25pdG9yaW5nIHRoZSBraWxsc3dpdGNoICovCi0JcXVldWVfZGVsYXllZF93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPl8zOTQ1LnJma2lsbF9wb2xsLAotCQkJICAgMiAqIEhaKTsKLQotCXJldHVybiAwOwotCi0gb3V0X3JlbW92ZV9zeXNmczoKLQlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwotCXByaXYtPndvcmtxdWV1ZSA9IE5VTEw7Ci0Jc3lzZnNfcmVtb3ZlX2dyb3VwKCZwZGV2LT5kZXYua29iaiwgJml3bDM5NDVfYXR0cmlidXRlX2dyb3VwKTsKLSBvdXRfcmVsZWFzZV9pcnE6Ci0JZnJlZV9pcnEocHJpdi0+cGNpX2Rldi0+aXJxLCBwcml2KTsKLSBvdXRfZGlzYWJsZV9tc2k6Ci0JcGNpX2Rpc2FibGVfbXNpKHByaXYtPnBjaV9kZXYpOwotCWl3bF9sZWdhY3lfZnJlZV9nZW9zKHByaXYpOwotCWl3bF9sZWdhY3lfZnJlZV9jaGFubmVsX21hcChwcml2KTsKLSBvdXRfdW5zZXRfaHdfcGFyYW1zOgotCWl3bDM5NDVfdW5zZXRfaHdfcGFyYW1zKHByaXYpOwotIG91dF9lZXByb21fZnJlZToKLQlpd2xfbGVnYWN5X2VlcHJvbV9mcmVlKHByaXYpOwotIG91dF9pb3VubWFwOgotCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmh3X2Jhc2UpOwotIG91dF9wY2lfcmVsZWFzZV9yZWdpb25zOgotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0gb3V0X3BjaV9kaXNhYmxlX2RldmljZToKLQlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotIG91dF9pZWVlODAyMTFfZnJlZV9odzoKLQlpd2xfbGVnYWN5X2ZyZWVfdHJhZmZpY19tZW0ocHJpdik7Ci0JaWVlZTgwMjExX2ZyZWVfaHcocHJpdi0+aHcpOwotIG91dDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgaXdsMzk0NV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFwcml2KQotCQlyZXR1cm47Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiKioqIFVOTE9BRCBEUklWRVIgKioqXG4iKTsKLQotCWl3bF9sZWdhY3lfZGJnZnNfdW5yZWdpc3Rlcihwcml2KTsKLQotCXNldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0KLQlpd2xfbGVnYWN5X2xlZHNfZXhpdChwcml2KTsKLQotCWlmIChwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKSB7Ci0JCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KHByaXYtPmh3KTsKLQkJcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDA7Ci0JfSBlbHNlIHsKLQkJaXdsMzk0NV9kb3duKHByaXYpOwotCX0KLQotCS8qCi0JICogTWFrZSBzdXJlIGRldmljZSBpcyByZXNldCB0byBsb3cgcG93ZXIgYmVmb3JlIHVubG9hZGluZyBkcml2ZXIuCi0JICogVGhpcyBtYXkgYmUgcmVkdW5kYW50IHdpdGggaXdsX2Rvd24oKSwgYnV0IHRoZXJlIGFyZSBwYXRocyB0bwotCSAqIHJ1biBpd2xfZG93bigpIHdpdGhvdXQgY2FsbGluZyBhcG1fb3BzLnN0b3AoKSwgYW5kIHRoZXJlIGFyZQotCSAqIHBhdGhzIHRvIGF2b2lkIHJ1bm5pbmcgaXdsX2Rvd24oKSBhdCBhbGwgYmVmb3JlIGxlYXZpbmcgZHJpdmVyLgotCSAqIFRoaXMgKGluZXhwZW5zaXZlKSBjYWxsICptYWtlcyBzdXJlKiBkZXZpY2UgaXMgcmVzZXQuCi0JICovCi0JaXdsX2xlZ2FjeV9hcG1fc3RvcChwcml2KTsKLQotCS8qIG1ha2Ugc3VyZSB3ZSBmbHVzaCBhbnkgcGVuZGluZyBpcnEgb3IKLQkgKiB0YXNrbGV0IGZvciB0aGUgZHJpdmVyCi0JICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfbGVnYWN5X2Rpc2FibGVfaW50ZXJydXB0cyhwcml2KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQlpd2wzOTQ1X3N5bmNocm9uaXplX2lycShwcml2KTsKLQotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpd2wzOTQ1X2F0dHJpYnV0ZV9ncm91cCk7Ci0KLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXYtPl8zOTQ1LnJma2lsbF9wb2xsKTsKLQotCWl3bDM5NDVfZGVhbGxvY191Y29kZV9wY2kocHJpdik7Ci0KLQlpZiAocHJpdi0+cnhxLmJkKQotCQlpd2wzOTQ1X3J4X3F1ZXVlX2ZyZWUocHJpdiwgJnByaXYtPnJ4cSk7Ci0JaXdsMzk0NV9od190eHFfY3R4X2ZyZWUocHJpdik7Ci0KLQlpd2wzOTQ1X3Vuc2V0X2h3X3BhcmFtcyhwcml2KTsKLQotCS8qbmV0aWZfc3RvcF9xdWV1ZShkZXYpOyAqLwotCWZsdXNoX3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwotCi0JLyogaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcgY2FsbHMgaXdsMzk0NV9tYWNfc3RvcCwgd2hpY2ggZmx1c2hlcwotCSAqIHByaXYtPndvcmtxdWV1ZS4uLiBzbyB3ZSBjYW4ndCB0YWtlIGRvd24gdGhlIHdvcmtxdWV1ZQotCSAqIHVudGlsIG5vdy4uLiAqLwotCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7Ci0JcHJpdi0+d29ya3F1ZXVlID0gTlVMTDsKLQlpd2xfbGVnYWN5X2ZyZWVfdHJhZmZpY19tZW0ocHJpdik7Ci0KLQlmcmVlX2lycShwZGV2LT5pcnEsIHByaXYpOwotCXBjaV9kaXNhYmxlX21zaShwZGV2KTsKLQotCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmh3X2Jhc2UpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQotCWl3bF9sZWdhY3lfZnJlZV9jaGFubmVsX21hcChwcml2KTsKLQlpd2xfbGVnYWN5X2ZyZWVfZ2Vvcyhwcml2KTsKLQlrZnJlZShwcml2LT5zY2FuX2NtZCk7Ci0JaWYgKHByaXYtPmJlYWNvbl9za2IpCi0JCWRldl9rZnJlZV9za2IocHJpdi0+YmVhY29uX3NrYik7Ci0KLQlpZWVlODAyMTFfZnJlZV9odyhwcml2LT5odyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogZHJpdmVyIGFuZCBtb2R1bGUgZW50cnkgcG9pbnQKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBpd2wzOTQ1X2RyaXZlciA9IHsKLQkubmFtZSA9IERSVl9OQU1FLAotCS5pZF90YWJsZSA9IGl3bDM5NDVfaHdfY2FyZF9pZHMsCi0JLnByb2JlID0gaXdsMzk0NV9wY2lfcHJvYmUsCi0JLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGl3bDM5NDVfcGNpX3JlbW92ZSksCi0JLmRyaXZlci5wbSA9IElXTF9MRUdBQ1lfUE1fT1BTLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgaXdsMzk0NV9pbml0KHZvaWQpCi17Ci0KLQlpbnQgcmV0OwotCXByX2luZm8oRFJWX0RFU0NSSVBUSU9OICIsICIgRFJWX1ZFUlNJT04gIlxuIik7Ci0JcHJfaW5mbyhEUlZfQ09QWVJJR0hUICJcbiIpOwotCi0JcmV0ID0gaXdsMzk0NV9yYXRlX2NvbnRyb2xfcmVnaXN0ZXIoKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIHJlZ2lzdGVyIHJhdGUgY29udHJvbCBhbGdvcml0aG06ICVkXG4iLCByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJml3bDM5NDVfZHJpdmVyKTsKLQlpZiAocmV0KSB7Ci0JCXByX2VycigiVW5hYmxlIHRvIGluaXRpYWxpemUgUENJIG1vZHVsZVxuIik7Ci0JCWdvdG8gZXJyb3JfcmVnaXN0ZXI7Ci0JfQotCi0JcmV0dXJuIHJldDsKLQotZXJyb3JfcmVnaXN0ZXI6Ci0JaXdsMzk0NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBpd2wzOTQ1X2V4aXQodm9pZCkKLXsKLQlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJml3bDM5NDVfZHJpdmVyKTsKLQlpd2wzOTQ1X3JhdGVfY29udHJvbF91bnJlZ2lzdGVyKCk7Ci19Ci0KLU1PRFVMRV9GSVJNV0FSRShJV0wzOTQ1X01PRFVMRV9GSVJNV0FSRShJV0wzOTQ1X1VDT0RFX0FQSV9NQVgpKTsKLQotbW9kdWxlX3BhcmFtX25hbWVkKGFudGVubmEsIGl3bDM5NDVfbW9kX3BhcmFtcy5hbnRlbm5hLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhhbnRlbm5hLCAic2VsZWN0IGFudGVubmEgKDE9TWFpbiwgMj1BdXgsIGRlZmF1bHQgMCBbYm90aF0pIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoc3djcnlwdG8sIGl3bDM5NDVfbW9kX3BhcmFtcy5zd19jcnlwdG8sIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKHN3Y3J5cHRvLAotCQkidXNpbmcgc29mdHdhcmUgY3J5cHRvIChkZWZhdWx0IDEgW3NvZnR3YXJlXSkiKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChkaXNhYmxlX2h3X3NjYW4sIGl3bDM5NDVfbW9kX3BhcmFtcy5kaXNhYmxlX2h3X3NjYW4sCi0JCWludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfaHdfc2NhbiwgImRpc2FibGUgaGFyZHdhcmUgc2Nhbm5pbmcgKGRlZmF1bHQgMSkiKTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLW1vZHVsZV9wYXJhbV9uYW1lZChkZWJ1ZywgaXdsZWdhY3lfZGVidWdfbGV2ZWwsIHVpbnQsIFNfSVJVR08gfCBTX0lXVVNSKTsKLU1PRFVMRV9QQVJNX0RFU0MoZGVidWcsICJkZWJ1ZyBvdXRwdXQgbWFzayIpOwotI2VuZGlmCi1tb2R1bGVfcGFyYW1fbmFtZWQoZndfcmVzdGFydCwgaXdsMzk0NV9tb2RfcGFyYW1zLnJlc3RhcnRfZncsIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKGZ3X3Jlc3RhcnQsICJyZXN0YXJ0IGZpcm13YXJlIGluIGNhc2Ugb2YgZXJyb3IiKTsKLQotbW9kdWxlX2V4aXQoaXdsMzk0NV9leGl0KTsKLW1vZHVsZV9pbml0KGl3bDM5NDVfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2w0OTY1LWJhc2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDQ5NjUtYmFzZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmZiYTllLi4wMDAwMDAwCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L2l3bDQ5NjUtYmFzZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKLSAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAotICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCi0gKiBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAotICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCi0gKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKLSAqCi0gKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKLSAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCi0gKgotICogQ29udGFjdCBJbmZvcm1hdGlvbjoKLSAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KLSAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2ktYXNwbS5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+Ci0KLSNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KLQotI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgotCi0jZGVmaW5lIERSVl9OQU1FICAgICAgICAiaXdsNDk2NSIKLQotI2luY2x1ZGUgIml3bC1lZXByb20uaCIKLSNpbmNsdWRlICJpd2wtZGV2LmgiCi0jaW5jbHVkZSAiaXdsLWNvcmUuaCIKLSNpbmNsdWRlICJpd2wtaW8uaCIKLSNpbmNsdWRlICJpd2wtaGVscGVycy5oIgotI2luY2x1ZGUgIml3bC1zdGEuaCIKLSNpbmNsdWRlICJpd2wtNDk2NS1jYWxpYi5oIgotI2luY2x1ZGUgIml3bC00OTY1LmgiCi0jaW5jbHVkZSAiaXdsLTQ5NjUtbGVkLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIG1vZHVsZSBib2lsZXIgcGxhdGUKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogbW9kdWxlIG5hbWUsIGNvcHlyaWdodCwgdmVyc2lvbiwgZXRjLgotICovCi0jZGVmaW5lIERSVl9ERVNDUklQVElPTgkiSW50ZWwoUikgV2lyZWxlc3MgV2lGaSA0OTY1IGRyaXZlciBmb3IgTGludXgiCi0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLSNkZWZpbmUgVkQgImQiCi0jZWxzZQotI2RlZmluZSBWRAotI2VuZGlmCi0KLSNkZWZpbmUgRFJWX1ZFUlNJT04gICAgIElXTFdJRklfVkVSU0lPTiBWRAotCi0KLU1PRFVMRV9ERVNDUklQVElPTihEUlZfREVTQ1JJUFRJT04pOwotTU9EVUxFX1ZFUlNJT04oRFJWX1ZFUlNJT04pOwotTU9EVUxFX0FVVEhPUihEUlZfQ09QWVJJR0hUICIgIiBEUlZfQVVUSE9SKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBUygiaXdsNDk2NSIpOwotCi12b2lkIGl3bDQ5NjVfdXBkYXRlX2NoYWluX2ZsYWdzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCi0JaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikgewotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQkJcHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7Ci0JCQlpZiAoY3R4LT5hY3RpdmUucnhfY2hhaW4gIT0gY3R4LT5zdGFnaW5nLnJ4X2NoYWluKQotCQkJCWl3bF9sZWdhY3lfY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9jbGVhcl9mcmVlX2ZyYW1lcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqZWxlbWVudDsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICIlZCBmcmFtZXMgb24gcHJlLWFsbG9jYXRlZCBoZWFwIG9uIGNsZWFyLlxuIiwKLQkJICAgICAgIHByaXYtPmZyYW1lc19jb3VudCk7Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJnByaXYtPmZyZWVfZnJhbWVzKSkgewotCQllbGVtZW50ID0gcHJpdi0+ZnJlZV9mcmFtZXMubmV4dDsKLQkJbGlzdF9kZWwoZWxlbWVudCk7Ci0JCWtmcmVlKGxpc3RfZW50cnkoZWxlbWVudCwgc3RydWN0IGl3bF9mcmFtZSwgbGlzdCkpOwotCQlwcml2LT5mcmFtZXNfY291bnQtLTsKLQl9Ci0KLQlpZiAocHJpdi0+ZnJhbWVzX2NvdW50KSB7Ci0JCUlXTF9XQVJOKHByaXYsICIlZCBmcmFtZXMgc3RpbGwgaW4gdXNlLiAgRGlkIHdlIGxvc2Ugb25lP1xuIiwKLQkJCSAgICBwcml2LT5mcmFtZXNfY291bnQpOwotCQlwcml2LT5mcmFtZXNfY291bnQgPSAwOwotCX0KLX0KLQotc3RhdGljIHN0cnVjdCBpd2xfZnJhbWUgKml3bDQ5NjVfZ2V0X2ZyZWVfZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfZnJhbWUgKmZyYW1lOwotCXN0cnVjdCBsaXN0X2hlYWQgKmVsZW1lbnQ7Ci0JaWYgKGxpc3RfZW1wdHkoJnByaXYtPmZyZWVfZnJhbWVzKSkgewotCQlmcmFtZSA9IGt6YWxsb2Moc2l6ZW9mKCpmcmFtZSksIEdGUF9LRVJORUwpOwotCQlpZiAoIWZyYW1lKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJDb3VsZCBub3QgYWxsb2NhdGUgZnJhbWUhXG4iKTsKLQkJCXJldHVybiBOVUxMOwotCQl9Ci0KLQkJcHJpdi0+ZnJhbWVzX2NvdW50Kys7Ci0JCXJldHVybiBmcmFtZTsKLQl9Ci0KLQllbGVtZW50ID0gcHJpdi0+ZnJlZV9mcmFtZXMubmV4dDsKLQlsaXN0X2RlbChlbGVtZW50KTsKLQlyZXR1cm4gbGlzdF9lbnRyeShlbGVtZW50LCBzdHJ1Y3QgaXdsX2ZyYW1lLCBsaXN0KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9mcmVlX2ZyYW1lKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9mcmFtZSAqZnJhbWUpCi17Ci0JbWVtc2V0KGZyYW1lLCAwLCBzaXplb2YoKmZyYW1lKSk7Ci0JbGlzdF9hZGQoJmZyYW1lLT5saXN0LCAmcHJpdi0+ZnJlZV9mcmFtZXMpOwotfQotCi1zdGF0aWMgdTMyIGl3bDQ5NjVfZmlsbF9iZWFjb25fZnJhbWUoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyLAotCQkJCSBpbnQgbGVmdCkKLXsKLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoIXByaXYtPmJlYWNvbl9za2IpCi0JCXJldHVybiAwOwotCi0JaWYgKHByaXYtPmJlYWNvbl9za2ItPmxlbiA+IGxlZnQpCi0JCXJldHVybiAwOwotCi0JbWVtY3B5KGhkciwgcHJpdi0+YmVhY29uX3NrYi0+ZGF0YSwgcHJpdi0+YmVhY29uX3NrYi0+bGVuKTsKLQotCXJldHVybiBwcml2LT5iZWFjb25fc2tiLT5sZW47Ci19Ci0KLS8qIFBhcnNlIHRoZSBiZWFjb24gZnJhbWUgdG8gZmluZCB0aGUgVElNIGVsZW1lbnQgYW5kIHNldCB0aW1faWR4ICYgdGltX3NpemUgKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfc2V0X2JlYWNvbl90aW0oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfdHhfYmVhY29uX2NtZCAqdHhfYmVhY29uX2NtZCwKLQkJCSAgICAgICB1OCAqYmVhY29uLCB1MzIgZnJhbWVfc2l6ZSkKLXsKLQl1MTYgdGltX2lkeDsKLQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopYmVhY29uOwotCi0JLyoKLQkgKiBUaGUgaW5kZXggaXMgcmVsYXRpdmUgdG8gZnJhbWUgc3RhcnQgYnV0IHdlIHN0YXJ0IGxvb2tpbmcgYXQgdGhlCi0JICogdmFyaWFibGUtbGVuZ3RoIHBhcnQgb2YgdGhlIGJlYWNvbi4KLQkgKi8KLQl0aW1faWR4ID0gbWdtdC0+dS5iZWFjb24udmFyaWFibGUgLSBiZWFjb247Ci0KLQkvKiBQYXJzZSB2YXJpYWJsZS1sZW5ndGggZWxlbWVudHMgb2YgYmVhY29uIHRvIGZpbmQgV0xBTl9FSURfVElNICovCi0Jd2hpbGUgKCh0aW1faWR4IDwgKGZyYW1lX3NpemUgLSAyKSkgJiYKLQkJCShiZWFjb25bdGltX2lkeF0gIT0gV0xBTl9FSURfVElNKSkKLQkJdGltX2lkeCArPSBiZWFjb25bdGltX2lkeCsxXSArIDI7Ci0KLQkvKiBJZiBUSU0gZmllbGQgd2FzIGZvdW5kLCBzZXQgdmFyaWFibGVzICovCi0JaWYgKCh0aW1faWR4IDwgKGZyYW1lX3NpemUgLSAxKSkgJiYgKGJlYWNvblt0aW1faWR4XSA9PSBXTEFOX0VJRF9USU0pKSB7Ci0JCXR4X2JlYWNvbl9jbWQtPnRpbV9pZHggPSBjcHVfdG9fbGUxNih0aW1faWR4KTsKLQkJdHhfYmVhY29uX2NtZC0+dGltX3NpemUgPSBiZWFjb25bdGltX2lkeCsxXTsKLQl9IGVsc2UKLQkJSVdMX1dBUk4ocHJpdiwgIlVuYWJsZSB0byBmaW5kIFRJTSBFbGVtZW50IGluIGJlYWNvblxuIik7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXdsNDk2NV9od19nZXRfYmVhY29uX2NtZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgIHN0cnVjdCBpd2xfZnJhbWUgKmZyYW1lKQotewotCXN0cnVjdCBpd2xfdHhfYmVhY29uX2NtZCAqdHhfYmVhY29uX2NtZDsKLQl1MzIgZnJhbWVfc2l6ZTsKLQl1MzIgcmF0ZV9mbGFnczsKLQl1MzIgcmF0ZTsKLQkvKgotCSAqIFdlIGhhdmUgdG8gc2V0IHVwIHRoZSBUWCBjb21tYW5kLCB0aGUgVFggQmVhY29uIGNvbW1hbmQsIGFuZCB0aGUKLQkgKiBiZWFjb24gY29udGVudHMuCi0JICovCi0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5tdXRleCk7Ci0KLQlpZiAoIXByaXYtPmJlYWNvbl9jdHgpIHsKLQkJSVdMX0VSUihwcml2LCAidHJ5aW5nIHRvIGJ1aWxkIGJlYWNvbiB3L28gYmVhY29uIGNvbnRleHQhXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogSW5pdGlhbGl6ZSBtZW1vcnkgKi8KLQl0eF9iZWFjb25fY21kID0gJmZyYW1lLT51LmJlYWNvbjsKLQltZW1zZXQodHhfYmVhY29uX2NtZCwgMCwgc2l6ZW9mKCp0eF9iZWFjb25fY21kKSk7Ci0KLQkvKiBTZXQgdXAgVFggYmVhY29uIGNvbnRlbnRzICovCi0JZnJhbWVfc2l6ZSA9IGl3bDQ5NjVfZmlsbF9iZWFjb25fZnJhbWUocHJpdiwgdHhfYmVhY29uX2NtZC0+ZnJhbWUsCi0JCQkJc2l6ZW9mKGZyYW1lLT51KSAtIHNpemVvZigqdHhfYmVhY29uX2NtZCkpOwotCWlmIChXQVJOX09OX09OQ0UoZnJhbWVfc2l6ZSA+IE1BWF9NUERVX1NJWkUpKQotCQlyZXR1cm4gMDsKLQlpZiAoIWZyYW1lX3NpemUpCi0JCXJldHVybiAwOwotCi0JLyogU2V0IHVwIFRYIGNvbW1hbmQgZmllbGRzICovCi0JdHhfYmVhY29uX2NtZC0+dHgubGVuID0gY3B1X3RvX2xlMTYoKHUxNilmcmFtZV9zaXplKTsKLQl0eF9iZWFjb25fY21kLT50eC5zdGFfaWQgPSBwcml2LT5iZWFjb25fY3R4LT5iY2FzdF9zdGFfaWQ7Ci0JdHhfYmVhY29uX2NtZC0+dHguc3RvcF90aW1lLmxpZmVfdGltZSA9IFRYX0NNRF9MSUZFX1RJTUVfSU5GSU5JVEU7Ci0JdHhfYmVhY29uX2NtZC0+dHgudHhfZmxhZ3MgPSBUWF9DTURfRkxHX1NFUV9DVExfTVNLIHwKLQkJVFhfQ01EX0ZMR19UU0ZfTVNLIHwgVFhfQ01EX0ZMR19TVEFfUkFURV9NU0s7Ci0KLQkvKiBTZXQgdXAgVFggYmVhY29uIGNvbW1hbmQgZmllbGRzICovCi0JaXdsNDk2NV9zZXRfYmVhY29uX3RpbShwcml2LCB0eF9iZWFjb25fY21kLCAodTggKil0eF9iZWFjb25fY21kLT5mcmFtZSwKLQkJCSAgIGZyYW1lX3NpemUpOwotCi0JLyogU2V0IHVwIHBhY2tldCByYXRlIGFuZCBmbGFncyAqLwotCXJhdGUgPSBpd2xfbGVnYWN5X2dldF9sb3dlc3RfcGxjcChwcml2LCBwcml2LT5iZWFjb25fY3R4KTsKLQlwcml2LT5tZ210X3R4X2FudCA9IGl3bDQ5NjVfdG9nZ2xlX3R4X2FudChwcml2LCBwcml2LT5tZ210X3R4X2FudCwKLQkJCQkJICAgICAgcHJpdi0+aHdfcGFyYW1zLnZhbGlkX3R4X2FudCk7Ci0JcmF0ZV9mbGFncyA9IGl3bDQ5NjVfYW50X2lkeF90b19mbGFncyhwcml2LT5tZ210X3R4X2FudCk7Ci0JaWYgKChyYXRlID49IElXTF9GSVJTVF9DQ0tfUkFURSkgJiYgKHJhdGUgPD0gSVdMX0xBU1RfQ0NLX1JBVEUpKQotCQlyYXRlX2ZsYWdzIHw9IFJBVEVfTUNTX0NDS19NU0s7Ci0JdHhfYmVhY29uX2NtZC0+dHgucmF0ZV9uX2ZsYWdzID0gaXdsNDk2NV9od19zZXRfcmF0ZV9uX2ZsYWdzKHJhdGUsCi0JCQlyYXRlX2ZsYWdzKTsKLQotCXJldHVybiBzaXplb2YoKnR4X2JlYWNvbl9jbWQpICsgZnJhbWVfc2l6ZTsKLX0KLQotaW50IGl3bDQ5NjVfc2VuZF9iZWFjb25fY21kKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2ZyYW1lICpmcmFtZTsKLQl1bnNpZ25lZCBpbnQgZnJhbWVfc2l6ZTsKLQlpbnQgcmM7Ci0KLQlmcmFtZSA9IGl3bDQ5NjVfZ2V0X2ZyZWVfZnJhbWUocHJpdik7Ci0JaWYgKCFmcmFtZSkgewotCQlJV0xfRVJSKHByaXYsICJDb3VsZCBub3Qgb2J0YWluIGZyZWUgZnJhbWUgYnVmZmVyIGZvciBiZWFjb24gIgotCQkJICAiY29tbWFuZC5cbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlmcmFtZV9zaXplID0gaXdsNDk2NV9od19nZXRfYmVhY29uX2NtZChwcml2LCBmcmFtZSk7Ci0JaWYgKCFmcmFtZV9zaXplKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIGNvbmZpZ3VyaW5nIHRoZSBiZWFjb24gY29tbWFuZFxuIik7Ci0JCWl3bDQ5NjVfZnJlZV9mcmFtZShwcml2LCBmcmFtZSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJjID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfVFhfQkVBQ09OLCBmcmFtZV9zaXplLAotCQkJICAgICAgJmZyYW1lLT51LmNtZFswXSk7Ci0KLQlpd2w0OTY1X2ZyZWVfZnJhbWUocHJpdiwgZnJhbWUpOwotCi0JcmV0dXJuIHJjOwotfQotCi1zdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgaXdsNDk2NV90ZmRfdGJfZ2V0X2FkZHIoc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4KQotewotCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOwotCi0JZG1hX2FkZHJfdCBhZGRyID0gZ2V0X3VuYWxpZ25lZF9sZTMyKCZ0Yi0+bG8pOwotCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiBzaXplb2YodTMyKSkKLQkJYWRkciB8PQotCQkoKGRtYV9hZGRyX3QpKGxlMTZfdG9fY3B1KHRiLT5oaV9uX2xlbikgJiAweEYpIDw8IDE2KSA8PCAxNjsKLQotCXJldHVybiBhZGRyOwotfQotCi1zdGF0aWMgaW5saW5lIHUxNiBpd2w0OTY1X3RmZF90Yl9nZXRfbGVuKHN0cnVjdCBpd2xfdGZkICp0ZmQsIHU4IGlkeCkKLXsKLQlzdHJ1Y3QgaXdsX3RmZF90YiAqdGIgPSAmdGZkLT50YnNbaWR4XTsKLQotCXJldHVybiBsZTE2X3RvX2NwdSh0Yi0+aGlfbl9sZW4pID4+IDQ7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2w0OTY1X3RmZF9zZXRfdGIoc3RydWN0IGl3bF90ZmQgKnRmZCwgdTggaWR4LAotCQkJCSAgZG1hX2FkZHJfdCBhZGRyLCB1MTYgbGVuKQotewotCXN0cnVjdCBpd2xfdGZkX3RiICp0YiA9ICZ0ZmQtPnRic1tpZHhdOwotCXUxNiBoaV9uX2xlbiA9IGxlbiA8PCA0OwotCi0JcHV0X3VuYWxpZ25lZF9sZTMyKGFkZHIsICZ0Yi0+bG8pOwotCWlmIChzaXplb2YoZG1hX2FkZHJfdCkgPiBzaXplb2YodTMyKSkKLQkJaGlfbl9sZW4gfD0gKChhZGRyID4+IDE2KSA+PiAxNikgJiAweEY7Ci0KLQl0Yi0+aGlfbl9sZW4gPSBjcHVfdG9fbGUxNihoaV9uX2xlbik7Ci0KLQl0ZmQtPm51bV90YnMgPSBpZHggKyAxOwotfQotCi1zdGF0aWMgaW5saW5lIHU4IGl3bDQ5NjVfdGZkX2dldF9udW1fdGJzKHN0cnVjdCBpd2xfdGZkICp0ZmQpCi17Ci0JcmV0dXJuIHRmZC0+bnVtX3RicyAmIDB4MWY7Ci19Ci0KLS8qKgotICogaXdsNDk2NV9od190eHFfZnJlZV90ZmQgLSBGcmVlIGFsbCBjaHVua3MgcmVmZXJlbmNlZCBieSBURkQgW3R4cS0+cS5yZWFkX3B0cl0KLSAqIEBwcml2IC0gZHJpdmVyIHByaXZhdGUgZGF0YQotICogQHR4cSAtIHR4IHF1ZXVlCi0gKgotICogRG9lcyBOT1QgYWR2YW5jZSBhbnkgVEZEIGNpcmN1bGFyIGJ1ZmZlciByZWFkL3dyaXRlIGluZGV4ZXMKLSAqIERvZXMgTk9UIGZyZWUgdGhlIFRGRCBpdHNlbGYgKHdoaWNoIGlzIHdpdGhpbiBjaXJjdWxhciBidWZmZXIpCi0gKi8KLXZvaWQgaXdsNDk2NV9od190eHFfZnJlZV90ZmQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEpCi17Ci0Jc3RydWN0IGl3bF90ZmQgKnRmZF90bXAgPSAoc3RydWN0IGl3bF90ZmQgKil0eHEtPnRmZHM7Ci0Jc3RydWN0IGl3bF90ZmQgKnRmZDsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gcHJpdi0+cGNpX2RldjsKLQlpbnQgaW5kZXggPSB0eHEtPnEucmVhZF9wdHI7Ci0JaW50IGk7Ci0JaW50IG51bV90YnM7Ci0KLQl0ZmQgPSAmdGZkX3RtcFtpbmRleF07Ci0KLQkvKiBTYW5pdHkgY2hlY2sgb24gbnVtYmVyIG9mIGNodW5rcyAqLwotCW51bV90YnMgPSBpd2w0OTY1X3RmZF9nZXRfbnVtX3Ricyh0ZmQpOwotCi0JaWYgKG51bV90YnMgPj0gSVdMX05VTV9PRl9UQlMpIHsKLQkJSVdMX0VSUihwcml2LCAiVG9vIG1hbnkgY2h1bmtzOiAlaVxuIiwgbnVtX3Ricyk7Ci0JCS8qIEB0b2RvIGlzc3VlIGZhdGFsIGVycm9yLCBpdCBpcyBxdWl0ZSBzZXJpb3VzIHNpdHVhdGlvbiAqLwotCQlyZXR1cm47Ci0JfQotCi0JLyogVW5tYXAgdHhfY21kICovCi0JaWYgKG51bV90YnMpCi0JCXBjaV91bm1hcF9zaW5nbGUoZGV2LAotCQkJCWRtYV91bm1hcF9hZGRyKCZ0eHEtPm1ldGFbaW5kZXhdLCBtYXBwaW5nKSwKLQkJCQlkbWFfdW5tYXBfbGVuKCZ0eHEtPm1ldGFbaW5kZXhdLCBsZW4pLAotCQkJCVBDSV9ETUFfQklESVJFQ1RJT05BTCk7Ci0KLQkvKiBVbm1hcCBjaHVua3MsIGlmIGFueS4gKi8KLQlmb3IgKGkgPSAxOyBpIDwgbnVtX3RiczsgaSsrKQotCQlwY2lfdW5tYXBfc2luZ2xlKGRldiwgaXdsNDk2NV90ZmRfdGJfZ2V0X2FkZHIodGZkLCBpKSwKLQkJCQlpd2w0OTY1X3RmZF90Yl9nZXRfbGVuKHRmZCwgaSksCi0JCQkJUENJX0RNQV9UT0RFVklDRSk7Ci0KLQkvKiBmcmVlIFNLQiAqLwotCWlmICh0eHEtPnR4YikgewotCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwotCi0JCXNrYiA9IHR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiOwotCi0JCS8qIGNhbiBiZSBjYWxsZWQgZnJvbSBpcnFzLWRpc2FibGVkIGNvbnRleHQgKi8KLQkJaWYgKHNrYikgewotCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQkJCXR4cS0+dHhiW3R4cS0+cS5yZWFkX3B0cl0uc2tiID0gTlVMTDsKLQkJfQotCX0KLX0KLQotaW50IGl3bDQ5NjVfaHdfdHhxX2F0dGFjaF9idWZfdG9fdGZkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAotCQkJCSBkbWFfYWRkcl90IGFkZHIsIHUxNiBsZW4sCi0JCQkJIHU4IHJlc2V0LCB1OCBwYWQpCi17Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcTsKLQlzdHJ1Y3QgaXdsX3RmZCAqdGZkLCAqdGZkX3RtcDsKLQl1MzIgbnVtX3RiczsKLQotCXEgPSAmdHhxLT5xOwotCXRmZF90bXAgPSAoc3RydWN0IGl3bF90ZmQgKil0eHEtPnRmZHM7Ci0JdGZkID0gJnRmZF90bXBbcS0+d3JpdGVfcHRyXTsKLQotCWlmIChyZXNldCkKLQkJbWVtc2V0KHRmZCwgMCwgc2l6ZW9mKCp0ZmQpKTsKLQotCW51bV90YnMgPSBpd2w0OTY1X3RmZF9nZXRfbnVtX3Ricyh0ZmQpOwotCi0JLyogRWFjaCBURkQgY2FuIHBvaW50IHRvIGEgbWF4aW11bSAyMCBUeCBidWZmZXJzICovCi0JaWYgKG51bV90YnMgPj0gSVdMX05VTV9PRl9UQlMpIHsKLQkJSVdMX0VSUihwcml2LCAiRXJyb3IgY2FuIG5vdCBzZW5kIG1vcmUgdGhhbiAlZCBjaHVua3NcbiIsCi0JCQkgIElXTF9OVU1fT0ZfVEJTKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JQlVHX09OKGFkZHIgJiB+RE1BX0JJVF9NQVNLKDM2KSk7Ci0JaWYgKHVubGlrZWx5KGFkZHIgJiB+SVdMX1RYX0RNQV9NQVNLKSkKLQkJSVdMX0VSUihwcml2LCAiVW5hbGlnbmVkIGFkZHJlc3MgPSAlbGx4XG4iLAotCQkJICAodW5zaWduZWQgbG9uZyBsb25nKWFkZHIpOwotCi0JaXdsNDk2NV90ZmRfc2V0X3RiKHRmZCwgbnVtX3RicywgYWRkciwgbGVuKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogVGVsbCBuaWMgd2hlcmUgdG8gZmluZCBjaXJjdWxhciBidWZmZXIgb2YgVHggRnJhbWUgRGVzY3JpcHRvcnMgZm9yCi0gKiBnaXZlbiBUeCBxdWV1ZSwgYW5kIGVuYWJsZSB0aGUgRE1BIGNoYW5uZWwgdXNlZCBmb3IgdGhhdCBxdWV1ZS4KLSAqCi0gKiA0OTY1IHN1cHBvcnRzIHVwIHRvIDE2IFR4IHF1ZXVlcyBpbiBEUkFNLCBtYXBwZWQgdG8gdXAgdG8gOCBUeCBETUEKLSAqIGNoYW5uZWxzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZS4KLSAqLwotaW50IGl3bDQ5NjVfaHdfdHhfcXVldWVfaW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQotewotCWludCB0eHFfaWQgPSB0eHEtPnEuaWQ7Ci0KLQkvKiBDaXJjdWxhciBidWZmZXIgKFRGRCBxdWV1ZSBpbiBEUkFNKSBwaHlzaWNhbCBiYXNlIGFkZHJlc3MgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEZIX01FTV9DQkJDX1FVRVVFKHR4cV9pZCksCi0JCQkgICAgIHR4cS0+cS5kbWFfYWRkciA+PiA4KTsKLQotCXJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR2VuZXJpYyBSWCBoYW5kbGVyIGltcGxlbWVudGF0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3J4X3JlcGx5X2FsaXZlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3AgKnBhbGl2ZTsKLQlzdHJ1Y3QgZGVsYXllZF93b3JrICpwd29yazsKLQotCXBhbGl2ZSA9ICZwa3QtPnUuYWxpdmVfZnJhbWU7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQWxpdmUgdWNvZGUgc3RhdHVzIDB4JTA4WCByZXZpc2lvbiAiCi0JCSAgICAgICAiMHglMDFYIDB4JTAxWFxuIiwKLQkJICAgICAgIHBhbGl2ZS0+aXNfdmFsaWQsIHBhbGl2ZS0+dmVyX3R5cGUsCi0JCSAgICAgICBwYWxpdmUtPnZlcl9zdWJ0eXBlKTsKLQotCWlmIChwYWxpdmUtPnZlcl9zdWJ0eXBlID09IElOSVRJQUxJWkVfU1VCVFlQRSkgewotCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdGlhbGl6YXRpb24gQWxpdmUgcmVjZWl2ZWQuXG4iKTsKLQkJbWVtY3B5KCZwcml2LT5jYXJkX2FsaXZlX2luaXQsCi0JCSAgICAgICAmcGt0LT51LmFsaXZlX2ZyYW1lLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfaW5pdF9hbGl2ZV9yZXNwKSk7Ci0JCXB3b3JrID0gJnByaXYtPmluaXRfYWxpdmVfc3RhcnQ7Ci0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlJ1bnRpbWUgQWxpdmUgcmVjZWl2ZWQuXG4iKTsKLQkJbWVtY3B5KCZwcml2LT5jYXJkX2FsaXZlLCAmcGt0LT51LmFsaXZlX2ZyYW1lLAotCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfYWxpdmVfcmVzcCkpOwotCQlwd29yayA9ICZwcml2LT5hbGl2ZV9zdGFydDsKLQl9Ci0KLQkvKiBXZSBkZWxheSB0aGUgQUxJVkUgcmVzcG9uc2UgYnkgNW1zIHRvCi0JICogZ2l2ZSB0aGUgSFcgUkYgS2lsbCB0aW1lIHRvIGFjdGl2YXRlLi4uICovCi0JaWYgKHBhbGl2ZS0+aXNfdmFsaWQgPT0gVUNPREVfVkFMSURfT0spCi0JCXF1ZXVlX2RlbGF5ZWRfd29yayhwcml2LT53b3JrcXVldWUsIHB3b3JrLAotCQkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoNSkpOwotCWVsc2UKLQkJSVdMX1dBUk4ocHJpdiwgInVDb2RlIGRpZCBub3QgcmVzcG9uZCBPSy5cbiIpOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfYmdfc3RhdGlzdGljc19wZXJpb2RpYyAtIFRpbWVyIGNhbGxiYWNrIHRvIHF1ZXVlIHN0YXRpc3RpY3MKLSAqCi0gKiBUaGlzIGNhbGxiYWNrIGlzIHByb3ZpZGVkIGluIG9yZGVyIHRvIHNlbmQgYSBzdGF0aXN0aWNzIHJlcXVlc3QuCi0gKgotICogVGhpcyB0aW1lciBmdW5jdGlvbiBpcyBjb250aW51YWxseSByZXNldCB0byBleGVjdXRlIHdpdGhpbgotICogUkVHX1JFQ0FMSUJfUEVSSU9EIHNlY29uZHMgc2luY2UgdGhlIGxhc3QgU1RBVElTVElDU19OT1RJRklDQVRJT04KLSAqIHdhcyByZWNlaXZlZC4gIFdlIG5lZWQgdG8gZW5zdXJlIHdlIHJlY2VpdmUgdGhlIHN0YXRpc3RpY3MgaW4gb3JkZXIKLSAqIHRvIHVwZGF0ZSB0aGUgdGVtcGVyYXR1cmUgdXNlZCBmb3IgY2FsaWJyYXRpbmcgdGhlIFRYUE9XRVIuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfYmdfc3RhdGlzdGljc19wZXJpb2RpYyh1bnNpZ25lZCBsb25nIGRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gKHN0cnVjdCBpd2xfcHJpdiAqKWRhdGE7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCS8qIGRvbnQgc2VuZCBob3N0IGNvbW1hbmQgaWYgcmYta2lsbCBpcyBvbiAqLwotCWlmICghaXdsX2xlZ2FjeV9pc19yZWFkeV9yZihwcml2KSkKLQkJcmV0dXJuOwotCi0JaXdsX2xlZ2FjeV9zZW5kX3N0YXRpc3RpY3NfcmVxdWVzdChwcml2LCBDTURfQVNZTkMsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9yeF9iZWFjb25fbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCXN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiKQotewotCXN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QgPSByeGJfYWRkcihyeGIpOwotCXN0cnVjdCBpd2w0OTY1X2JlYWNvbl9ub3RpZiAqYmVhY29uID0KLQkJKHN0cnVjdCBpd2w0OTY1X2JlYWNvbl9ub3RpZiAqKXBrdC0+dS5yYXc7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JdTggcmF0ZSA9IGl3bDQ5NjVfaHdfZ2V0X3JhdGUoYmVhY29uLT5iZWFjb25fbm90aWZ5X2hkci5yYXRlX25fZmxhZ3MpOwotCi0JSVdMX0RFQlVHX1JYKHByaXYsICJiZWFjb24gc3RhdHVzICV4IHJldHJpZXMgJWQgaXNzICVkICIKLQkJInRzZiAlZCAlZCByYXRlICVkXG4iLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmJlYWNvbl9ub3RpZnlfaGRyLnUuc3RhdHVzKSAmIFRYX1NUQVRVU19NU0ssCi0JCWJlYWNvbi0+YmVhY29uX25vdGlmeV9oZHIuZmFpbHVyZV9mcmFtZSwKLQkJbGUzMl90b19jcHUoYmVhY29uLT5pYnNzX21ncl9zdGF0dXMpLAotCQlsZTMyX3RvX2NwdShiZWFjb24tPmhpZ2hfdHNmKSwKLQkJbGUzMl90b19jcHUoYmVhY29uLT5sb3dfdHNmKSwgcmF0ZSk7Ci0jZW5kaWYKLQotCXByaXYtPmlic3NfbWFuYWdlciA9IGxlMzJfdG9fY3B1KGJlYWNvbi0+aWJzc19tZ3Jfc3RhdHVzKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9wZXJmb3JtX2N0X2tpbGxfdGFzayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCUlXTF9ERUJVR19QT1dFUihwcml2LCAiU3RvcCBhbGwgcXVldWVzXG4iKTsKLQotCWlmIChwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkKQotCQlpZWVlODAyMTFfc3RvcF9xdWV1ZXMocHJpdi0+aHcpOwotCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfU0VULAotCQkJQ1NSX1VDT0RFX0RSVl9HUDFfUkVHX0JJVF9DVF9LSUxMX0VYSVQpOwotCWl3bF9yZWFkMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDEpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnJlZ19sb2NrLCBmbGFncyk7Ci0JaWYgKCFpd2xfZ3JhYl9uaWNfYWNjZXNzKHByaXYpKQotCQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnJlZ19sb2NrLCBmbGFncyk7Ci19Ci0KLS8qIEhhbmRsZSBub3RpZmljYXRpb24gZnJvbSB1Q29kZSB0aGF0IGNhcmQncyBwb3dlciBzdGF0ZSBpcyBjaGFuZ2luZwotICogZHVlIHRvIHNvZnR3YXJlLCBoYXJkd2FyZSwgb3IgY3JpdGljYWwgdGVtcGVyYXR1cmUgUkZLSUxMICovCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3J4X2NhcmRfc3RhdGVfbm90aWYoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YikKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQl1MzIgZmxhZ3MgPSBsZTMyX3RvX2NwdShwa3QtPnUuY2FyZF9zdGF0ZV9ub3RpZi5mbGFncyk7Ci0JdW5zaWduZWQgbG9uZyBzdGF0dXMgPSBwcml2LT5zdGF0dXM7Ci0KLQlJV0xfREVCVUdfUkZfS0lMTChwcml2LCAiQ2FyZCBzdGF0ZSByZWNlaXZlZDogSFc6JXMgU1c6JXMgQ1Q6JXNcbiIsCi0JCQkgIChmbGFncyAmIEhXX0NBUkRfRElTQUJMRUQpID8gIktpbGwiIDogIk9uIiwKLQkJCSAgKGZsYWdzICYgU1dfQ0FSRF9ESVNBQkxFRCkgPyAiS2lsbCIgOiAiT24iLAotCQkJICAoZmxhZ3MgJiBDVF9DQVJEX0RJU0FCTEVEKSA/Ci0JCQkgICJSZWFjaGVkIiA6ICJOb3QgcmVhY2hlZCIpOwotCi0JaWYgKGZsYWdzICYgKFNXX0NBUkRfRElTQUJMRUQgfCBIV19DQVJEX0RJU0FCTEVEIHwKLQkJICAgICBDVF9DQVJEX0RJU0FCTEVEKSkgewotCi0JCWl3bF93cml0ZTMyKHByaXYsIENTUl9VQ09ERV9EUlZfR1AxX1NFVCwKLQkJCSAgICBDU1JfVUNPREVfRFJWX0dQMV9CSVRfQ01EX0JMT0NLRUQpOwotCi0JCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX01CWF9DLAotCQkJCQlIQlVTX1RBUkdfTUJYX0NfUkVHX0JJVF9DTURfQkxPQ0tFRCk7Ci0KLQkJaWYgKCEoZmxhZ3MgJiBSWE9OX0NBUkRfRElTQUJMRUQpKSB7Ci0JCQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsCi0JCQkJICAgIENTUl9VQ09ERV9EUlZfR1AxX0JJVF9DTURfQkxPQ0tFRCk7Ci0JCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19NQlhfQywKLQkJCQkJSEJVU19UQVJHX01CWF9DX1JFR19CSVRfQ01EX0JMT0NLRUQpOwotCQl9Ci0JfQotCi0JaWYgKGZsYWdzICYgQ1RfQ0FSRF9ESVNBQkxFRCkKLQkJaXdsNDk2NV9wZXJmb3JtX2N0X2tpbGxfdGFzayhwcml2KTsKLQotCWlmIChmbGFncyAmIEhXX0NBUkRfRElTQUJMRUQpCi0JCXNldF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCWVsc2UKLQkJY2xlYXJfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCWlmICghKGZsYWdzICYgUlhPTl9DQVJEX0RJU0FCTEVEKSkKLQkJaXdsX2xlZ2FjeV9zY2FuX2NhbmNlbChwcml2KTsKLQotCWlmICgodGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZzdGF0dXMpICE9Ci0JICAgICB0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpKQotCQl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwKLQkJCXRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKSk7Ci0JZWxzZQotCQl3YWtlX3VwKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfc2V0dXBfcnhfaGFuZGxlcnMgLSBJbml0aWFsaXplIFJ4IGhhbmRsZXIgY2FsbGJhY2tzCi0gKgotICogU2V0dXAgdGhlIFJYIGhhbmRsZXJzIGZvciBlYWNoIG9mIHRoZSByZXBseSB0eXBlcyBzZW50IGZyb20gdGhlIHVDb2RlCi0gKiB0byB0aGUgaG9zdC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGNoYWlucyBpbnRvIHRoZSBoYXJkd2FyZSBzcGVjaWZpYyBmaWxlcyBmb3IgdGhlbSB0byBzZXR1cAotICogYW55IGhhcmR3YXJlIHNwZWNpZmljIGhhbmRsZXJzIGFzIHdlbGwuCi0gKi8KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfc2V0dXBfcnhfaGFuZGxlcnMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX0FMSVZFXSA9IGl3bDQ5NjVfcnhfcmVwbHlfYWxpdmU7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfRVJST1JdID0gaXdsX2xlZ2FjeV9yeF9yZXBseV9lcnJvcjsKLQlwcml2LT5yeF9oYW5kbGVyc1tDSEFOTkVMX1NXSVRDSF9OT1RJRklDQVRJT05dID0gaXdsX2xlZ2FjeV9yeF9jc2E7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbU1BFQ1RSVU1fTUVBU1VSRV9OT1RJRklDQVRJT05dID0KLQkJCWl3bF9sZWdhY3lfcnhfc3BlY3RydW1fbWVhc3VyZV9ub3RpZjsKLQlwcml2LT5yeF9oYW5kbGVyc1tQTV9TTEVFUF9OT1RJRklDQVRJT05dID0gaXdsX2xlZ2FjeV9yeF9wbV9zbGVlcF9ub3RpZjsKLQlwcml2LT5yeF9oYW5kbGVyc1tQTV9ERUJVR19TVEFUSVNUSUNfTk9USUZJQ10gPQotCSAgICBpd2xfbGVnYWN5X3J4X3BtX2RlYnVnX3N0YXRpc3RpY3Nfbm90aWY7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbQkVBQ09OX05PVElGSUNBVElPTl0gPSBpd2w0OTY1X3J4X2JlYWNvbl9ub3RpZjsKLQotCS8qCi0JICogVGhlIHNhbWUgaGFuZGxlciBpcyB1c2VkIGZvciBib3RoIHRoZSBSRVBMWSB0byBhIGRpc2NyZXRlCi0JICogc3RhdGlzdGljcyByZXF1ZXN0IGZyb20gdGhlIGhvc3QgYXMgd2VsbCBhcyBmb3IgdGhlIHBlcmlvZGljCi0JICogc3RhdGlzdGljcyBub3RpZmljYXRpb25zIChhZnRlciByZWNlaXZlZCBiZWFjb25zKSBmcm9tIHRoZSB1Q29kZS4KLQkgKi8KLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9TVEFUSVNUSUNTX0NNRF0gPSBpd2w0OTY1X3JlcGx5X3N0YXRpc3RpY3M7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbU1RBVElTVElDU19OT1RJRklDQVRJT05dID0gaXdsNDk2NV9yeF9zdGF0aXN0aWNzOwotCi0JaXdsX2xlZ2FjeV9zZXR1cF9yeF9zY2FuX2hhbmRsZXJzKHByaXYpOwotCi0JLyogc3RhdHVzIGNoYW5nZSBoYW5kbGVyICovCi0JcHJpdi0+cnhfaGFuZGxlcnNbQ0FSRF9TVEFURV9OT1RJRklDQVRJT05dID0KLQkJCQkJaXdsNDk2NV9yeF9jYXJkX3N0YXRlX25vdGlmOwotCi0JcHJpdi0+cnhfaGFuZGxlcnNbTUlTU0VEX0JFQUNPTlNfTk9USUZJQ0FUSU9OXSA9Ci0JICAgIGl3bDQ5NjVfcnhfbWlzc2VkX2JlYWNvbl9ub3RpZjsKLQkvKiBSeCBoYW5kbGVycyAqLwotCXByaXYtPnJ4X2hhbmRsZXJzW1JFUExZX1JYX1BIWV9DTURdID0gaXdsNDk2NV9yeF9yZXBseV9yeF9waHk7Ci0JcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfUlhfTVBEVV9DTURdID0gaXdsNDk2NV9yeF9yZXBseV9yeDsKLQkvKiBibG9jayBhY2sgKi8KLQlwcml2LT5yeF9oYW5kbGVyc1tSRVBMWV9DT01QUkVTU0VEX0JBXSA9IGl3bDQ5NjVfcnhfcmVwbHlfY29tcHJlc3NlZF9iYTsKLQkvKiBTZXQgdXAgaGFyZHdhcmUgc3BlY2lmaWMgUnggaGFuZGxlcnMgKi8KLQlwcml2LT5jZmctPm9wcy0+bGliLT5yeF9oYW5kbGVyX3NldHVwKHByaXYpOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfcnhfaGFuZGxlIC0gTWFpbiBlbnRyeSBmdW5jdGlvbiBmb3IgcmVjZWl2aW5nIHJlc3BvbnNlcyBmcm9tIHVDb2RlCi0gKgotICogVXNlcyB0aGUgcHJpdi0+cnhfaGFuZGxlcnMgY2FsbGJhY2sgZnVuY3Rpb24gYXJyYXkgdG8gaW52b2tlCi0gKiB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlcnMsIGluY2x1ZGluZyBjb21tYW5kIHJlc3BvbnNlcywKLSAqIGZyYW1lLXJlY2VpdmVkIG5vdGlmaWNhdGlvbnMsIGFuZCBvdGhlciBub3RpZmljYXRpb25zLgotICovCi12b2lkIGl3bDQ5NjVfcnhfaGFuZGxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YjsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0OwotCXN0cnVjdCBpd2xfcnhfcXVldWUgKnJ4cSA9ICZwcml2LT5yeHE7Ci0JdTMyIHIsIGk7Ci0JaW50IHJlY2xhaW07Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1OCBmaWxsX3J4ID0gMDsKLQl1MzIgY291bnQgPSA4OwotCWludCB0b3RhbF9lbXB0eTsKLQotCS8qIHVDb2RlJ3MgcmVhZCBpbmRleCAoc3RvcmVkIGluIHNoYXJlZCBEUkFNKSBpbmRpY2F0ZXMgdGhlIGxhc3QgUngKLQkgKiBidWZmZXIgdGhhdCB0aGUgZHJpdmVyIG1heSBwcm9jZXNzIChsYXN0IGJ1ZmZlciBmaWxsZWQgYnkgdWNvZGUpLiAqLwotCXIgPSBsZTE2X3RvX2NwdShyeHEtPnJiX3N0dHMtPmNsb3NlZF9yYl9udW0pICYgIDB4MEZGRjsKLQlpID0gcnhxLT5yZWFkOwotCi0JLyogUnggaW50ZXJydXB0LCBidXQgbm90aGluZyBzZW50IGZyb20gdUNvZGUgKi8KLQlpZiAoaSA9PSByKQotCQlJV0xfREVCVUdfUlgocHJpdiwgInIgPSAlZCwgaSA9ICVkXG4iLCByLCBpKTsKLQotCS8qIGNhbGN1bGF0ZSB0b3RhbCBmcmFtZXMgbmVlZCB0byBiZSByZXN0b2NrIGFmdGVyIGhhbmRsaW5nIFJYICovCi0JdG90YWxfZW1wdHkgPSByIC0gcnhxLT53cml0ZV9hY3R1YWw7Ci0JaWYgKHRvdGFsX2VtcHR5IDwgMCkKLQkJdG90YWxfZW1wdHkgKz0gUlhfUVVFVUVfU0laRTsKLQotCWlmICh0b3RhbF9lbXB0eSA+IChSWF9RVUVVRV9TSVpFIC8gMikpCi0JCWZpbGxfcnggPSAxOwotCi0Jd2hpbGUgKGkgIT0gcikgewotCQlpbnQgbGVuOwotCi0JCXJ4YiA9IHJ4cS0+cXVldWVbaV07Ci0KLQkJLyogSWYgYW4gUlhCIGRvZXNuJ3QgaGF2ZSBhIFJ4IHF1ZXVlIHNsb3QgYXNzb2NpYXRlZCB3aXRoIGl0LAotCQkgKiB0aGVuIGEgYnVnIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gdGhlIHF1ZXVlIHJlZmlsbGluZwotCQkgKiByb3V0aW5lcyAtLSBjYXRjaCBpdCBoZXJlICovCi0JCUJVR19PTihyeGIgPT0gTlVMTCk7Ci0KLQkJcnhxLT5xdWV1ZVtpXSA9IE5VTEw7Ci0KLQkJcGNpX3VubWFwX3BhZ2UocHJpdi0+cGNpX2RldiwgcnhiLT5wYWdlX2RtYSwKLQkJCSAgICAgICBQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCi0JCQkgICAgICAgUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJcGt0ID0gcnhiX2FkZHIocnhiKTsKLQotCQlsZW4gPSBsZTMyX3RvX2NwdShwa3QtPmxlbl9uX2ZsYWdzKSAmIEZIX1JTQ1NSX0ZSQU1FX1NJWkVfTVNLOwotCQlsZW4gKz0gc2l6ZW9mKHUzMik7IC8qIGFjY291bnQgZm9yIHN0YXR1cyB3b3JkICovCi0JCXRyYWNlX2l3bHdpZmlfbGVnYWN5X2Rldl9yeChwcml2LCBwa3QsIGxlbik7Ci0KLQkJLyogUmVjbGFpbSBhIGNvbW1hbmQgYnVmZmVyIG9ubHkgaWYgdGhpcyBwYWNrZXQgaXMgYSByZXNwb25zZQotCQkgKiAgIHRvIGEgKGRyaXZlci1vcmlnaW5hdGVkKSBjb21tYW5kLgotCQkgKiBJZiB0aGUgcGFja2V0IChlLmcuIFJ4IGZyYW1lKSBvcmlnaW5hdGVkIGZyb20gdUNvZGUsCi0JCSAqICAgdGhlcmUgaXMgbm8gY29tbWFuZCBidWZmZXIgdG8gcmVjbGFpbS4KLQkJICogVWNvZGUgc2hvdWxkIHNldCBTRVFfUlhfRlJBTUUgYml0IGlmIHVjb2RlLW9yaWdpbmF0ZWQsCi0JCSAqICAgYnV0IGFwcGFyZW50bHkgYSBmZXcgZG9uJ3QgZ2V0IHNldDsgY2F0Y2ggdGhlbSBoZXJlLiAqLwotCQlyZWNsYWltID0gIShwa3QtPmhkci5zZXF1ZW5jZSAmIFNFUV9SWF9GUkFNRSkgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gUkVQTFlfUlhfUEhZX0NNRCkgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gUkVQTFlfUlgpICYmCi0JCQkocGt0LT5oZHIuY21kICE9IFJFUExZX1JYX01QRFVfQ01EKSAmJgotCQkJKHBrdC0+aGRyLmNtZCAhPSBSRVBMWV9DT01QUkVTU0VEX0JBKSAmJgotCQkJKHBrdC0+aGRyLmNtZCAhPSBTVEFUSVNUSUNTX05PVElGSUNBVElPTikgJiYKLQkJCShwa3QtPmhkci5jbWQgIT0gUkVQTFlfVFgpOwotCi0JCS8qIEJhc2VkIG9uIHR5cGUgb2YgY29tbWFuZCByZXNwb25zZSBvciBub3RpZmljYXRpb24sCi0JCSAqICAgaGFuZGxlIHRob3NlIHRoYXQgbmVlZCBoYW5kbGluZyB2aWEgZnVuY3Rpb24gaW4KLQkJICogICByeF9oYW5kbGVycyB0YWJsZS4gIFNlZSBpd2w0OTY1X3NldHVwX3J4X2hhbmRsZXJzKCkgKi8KLQkJaWYgKHByaXYtPnJ4X2hhbmRsZXJzW3BrdC0+aGRyLmNtZF0pIHsKLQkJCUlXTF9ERUJVR19SWChwcml2LCAiciA9ICVkLCBpID0gJWQsICVzLCAweCUwMnhcbiIsIHIsCi0JCQkJaSwgaXdsX2xlZ2FjeV9nZXRfY21kX3N0cmluZyhwa3QtPmhkci5jbWQpLAotCQkJCXBrdC0+aGRyLmNtZCk7Ci0JCQlwcml2LT5pc3Jfc3RhdHMucnhfaGFuZGxlcnNbcGt0LT5oZHIuY21kXSsrOwotCQkJcHJpdi0+cnhfaGFuZGxlcnNbcGt0LT5oZHIuY21kXSAocHJpdiwgcnhiKTsKLQkJfSBlbHNlIHsKLQkJCS8qIE5vIGhhbmRsaW5nIG5lZWRlZCAqLwotCQkJSVdMX0RFQlVHX1JYKHByaXYsCi0JCQkJInIgJWQgaSAlZCBObyBoYW5kbGVyIG5lZWRlZCBmb3IgJXMsIDB4JTAyeFxuIiwKLQkJCQlyLCBpLCBpd2xfbGVnYWN5X2dldF9jbWRfc3RyaW5nKHBrdC0+aGRyLmNtZCksCi0JCQkJcGt0LT5oZHIuY21kKTsKLQkJfQotCi0JCS8qCi0JCSAqIFhYWDogQWZ0ZXIgaGVyZSwgd2Ugc2hvdWxkIGFsd2F5cyBjaGVjayByeGItPnBhZ2UKLQkJICogYWdhaW5zdCBOVUxMIGJlZm9yZSB0b3VjaGluZyBpdCBvciBpdHMgdmlydHVhbAotCQkgKiBtZW1vcnkgKHBrdCkuIEJlY2F1c2Ugc29tZSByeF9oYW5kbGVyIG1pZ2h0IGhhdmUKLQkJICogYWxyZWFkeSB0YWtlbiBvciBmcmVlZCB0aGUgcGFnZXMuCi0JCSAqLwotCi0JCWlmIChyZWNsYWltKSB7Ci0JCQkvKiBJbnZva2UgYW55IGNhbGxiYWNrcywgdHJhbnNmZXIgdGhlIGJ1ZmZlciB0byBjYWxsZXIsCi0JCQkgKiBhbmQgZmlyZSBvZmYgdGhlIChwb3NzaWJseSkgYmxvY2tpbmcgaXdsX2xlZ2FjeV9zZW5kX2NtZCgpCi0JCQkgKiBhcyB3ZSByZWNsYWltIHRoZSBkcml2ZXIgY29tbWFuZCBxdWV1ZSAqLwotCQkJaWYgKHJ4Yi0+cGFnZSkKLQkJCQlpd2xfbGVnYWN5X3R4X2NtZF9jb21wbGV0ZShwcml2LCByeGIpOwotCQkJZWxzZQotCQkJCUlXTF9XQVJOKHByaXYsICJDbGFpbSBudWxsIHJ4Yj9cbiIpOwotCQl9Ci0KLQkJLyogUmV1c2UgdGhlIHBhZ2UgaWYgcG9zc2libGUuIEZvciBub3RpZmljYXRpb24gcGFja2V0cyBhbmQKLQkJICogU0tCcyB0aGF0IGZhaWwgdG8gUnggY29ycmVjdGx5LCBhZGQgdGhlbSBiYWNrIGludG8gdGhlCi0JCSAqIHJ4X2ZyZWUgbGlzdCBmb3IgcmV1c2UgbGF0ZXIuICovCi0JCXNwaW5fbG9ja19pcnFzYXZlKCZyeHEtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKHJ4Yi0+cGFnZSAhPSBOVUxMKSB7Ci0JCQlyeGItPnBhZ2VfZG1hID0gcGNpX21hcF9wYWdlKHByaXYtPnBjaV9kZXYsIHJ4Yi0+cGFnZSwKLQkJCQkwLCBQQUdFX1NJWkUgPDwgcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIsCi0JCQkJUENJX0RNQV9GUk9NREVWSUNFKTsKLQkJCWxpc3RfYWRkX3RhaWwoJnJ4Yi0+bGlzdCwgJnJ4cS0+cnhfZnJlZSk7Ci0JCQlyeHEtPmZyZWVfY291bnQrKzsKLQkJfSBlbHNlCi0JCQlsaXN0X2FkZF90YWlsKCZyeGItPmxpc3QsICZyeHEtPnJ4X3VzZWQpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJ4cS0+bG9jaywgZmxhZ3MpOwotCi0JCWkgPSAoaSArIDEpICYgUlhfUVVFVUVfTUFTSzsKLQkJLyogSWYgdGhlcmUgYXJlIGEgbG90IG9mIHVudXNlZCBmcmFtZXMsCi0JCSAqIHJlc3RvY2sgdGhlIFJ4IHF1ZXVlIHNvIHVjb2RlIHdvbnQgYXNzZXJ0LiAqLwotCQlpZiAoZmlsbF9yeCkgewotCQkJY291bnQrKzsKLQkJCWlmIChjb3VudCA+PSA4KSB7Ci0JCQkJcnhxLT5yZWFkID0gaTsKLQkJCQlpd2w0OTY1X3J4X3JlcGxlbmlzaF9ub3cocHJpdik7Ci0JCQkJY291bnQgPSAwOwotCQkJfQotCQl9Ci0JfQotCi0JLyogQmFja3RyYWNrIG9uZSBlbnRyeSAqLwotCXJ4cS0+cmVhZCA9IGk7Ci0JaWYgKGZpbGxfcngpCi0JCWl3bDQ5NjVfcnhfcmVwbGVuaXNoX25vdyhwcml2KTsKLQllbHNlCi0JCWl3bDQ5NjVfcnhfcXVldWVfcmVzdG9jayhwcml2KTsKLX0KLQotLyogY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGZsdXNoIGFueSBzY2hlZHVsZWQgdGFza2xldCAqLwotc3RhdGljIGlubGluZSB2b2lkIGl3bDQ5NjVfc3luY2hyb25pemVfaXJxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQkvKiB3YWl0IHRvIG1ha2Ugc3VyZSB3ZSBmbHVzaCBwZW5kaW5nIHRhc2tsZXQqLwotCXN5bmNocm9uaXplX2lycShwcml2LT5wY2lfZGV2LT5pcnEpOwotCXRhc2tsZXRfa2lsbCgmcHJpdi0+aXJxX3Rhc2tsZXQpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2lycV90YXNrbGV0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQl1MzIgaW50YSwgaGFuZGxlZCA9IDA7Ci0JdTMyIGludGFfZmg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgaTsKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQl1MzIgaW50YV9tYXNrOwotI2VuZGlmCi0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JLyogQWNrL2NsZWFyL3Jlc2V0IHBlbmRpbmcgdUNvZGUgaW50ZXJydXB0cy4KLQkgKiBOb3RlOiAgU29tZSBiaXRzIGluIENTUl9JTlQgYXJlICJPUiIgb2YgYml0cyBpbiBDU1JfRkhfSU5UX1NUQVRVUywKLQkgKiAgYW5kIHdpbGwgY2xlYXIgb25seSB3aGVuIENTUl9GSF9JTlRfU1RBVFVTIGdldHMgY2xlYXJlZC4gKi8KLQlpbnRhID0gaXdsX3JlYWQzMihwcml2LCBDU1JfSU5UKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCBpbnRhKTsKLQotCS8qIEFjay9jbGVhci9yZXNldCBwZW5kaW5nIGZsb3ctaGFuZGxlciAoRE1BKSBpbnRlcnJ1cHRzLgotCSAqIEFueSBuZXcgaW50ZXJydXB0cyB0aGF0IGhhcHBlbiBhZnRlciB0aGlzLCBlaXRoZXIgd2hpbGUgd2UncmUKLQkgKiBpbiB0aGlzIHRhc2tsZXQsIG9yIGxhdGVyLCB3aWxsIHNob3cgdXAgaW4gbmV4dCBJU1IvdGFza2xldC4gKi8KLQlpbnRhX2ZoID0gaXdsX3JlYWQzMihwcml2LCBDU1JfRkhfSU5UX1NUQVRVUyk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0ZIX0lOVF9TVEFUVVMsIGludGFfZmgpOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKHByaXYpICYgSVdMX0RMX0lTUikgewotCQkvKiBqdXN0IGZvciBkZWJ1ZyAqLwotCQlpbnRhX21hc2sgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9JTlRfTUFTSyk7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwgImludGEgMHglMDh4LCBlbmFibGVkIDB4JTA4eCwgZmggMHglMDh4XG4iLAotCQkJICAgICAgaW50YSwgaW50YV9tYXNrLCBpbnRhX2ZoKTsKLQl9Ci0jZW5kaWYKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCS8qIFNpbmNlIENTUl9JTlQgYW5kIENTUl9GSF9JTlRfU1RBVFVTIHJlYWRzIGFuZCBjbGVhcnMgYXJlIG5vdAotCSAqIGF0b21pYywgbWFrZSBzdXJlIHRoYXQgaW50YSBjb3ZlcnMgYWxsIHRoZSBpbnRlcnJ1cHRzIHRoYXQKLQkgKiB3ZSd2ZSBkaXNjb3ZlcmVkLCBldmVuIGlmIEZIIGludGVycnVwdCBjYW1lIGluIGp1c3QgYWZ0ZXIKLQkgKiByZWFkaW5nIENTUl9JTlQuICovCi0JaWYgKGludGFfZmggJiBDU1I0OV9GSF9JTlRfUlhfTUFTSykKLQkJaW50YSB8PSBDU1JfSU5UX0JJVF9GSF9SWDsKLQlpZiAoaW50YV9maCAmIENTUjQ5X0ZIX0lOVF9UWF9NQVNLKQotCQlpbnRhIHw9IENTUl9JTlRfQklUX0ZIX1RYOwotCi0JLyogTm93IHNlcnZpY2UgYWxsIGludGVycnVwdCBiaXRzIGRpc2NvdmVyZWQgYWJvdmUuICovCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9IV19FUlIpIHsKLQkJSVdMX0VSUihwcml2LCAiSGFyZHdhcmUgZXJyb3IgZGV0ZWN0ZWQuICBSZXN0YXJ0aW5nLlxuIik7Ci0KLQkJLyogVGVsbCB0aGUgZGV2aWNlIHRvIHN0b3Agc2VuZGluZyBpbnRlcnJ1cHRzICovCi0JCWl3bF9sZWdhY3lfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCi0JCXByaXYtPmlzcl9zdGF0cy5odysrOwotCQlpd2xfbGVnYWN5X2lycV9oYW5kbGVfZXJyb3IocHJpdik7Ci0KLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9IV19FUlI7Ci0KLQkJcmV0dXJuOwotCX0KLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotCWlmIChpd2xfbGVnYWN5X2dldF9kZWJ1Z19sZXZlbChwcml2KSAmIChJV0xfRExfSVNSKSkgewotCQkvKiBOSUMgZmlyZXMgdGhpcywgYnV0IHdlIGRvbid0IHVzZSBpdCwgcmVkdW5kYW50IHdpdGggV0FLRVVQICovCi0JCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfU0NEKSB7Ci0JCQlJV0xfREVCVUdfSVNSKHByaXYsICJTY2hlZHVsZXIgZmluaXNoZWQgdG8gdHJhbnNtaXQgIgotCQkJCSAgICAgICJ0aGUgZnJhbWUvZnJhbWVzLlxuIik7Ci0JCQlwcml2LT5pc3Jfc3RhdHMuc2NoKys7Ci0JCX0KLQotCQkvKiBBbGl2ZSBub3RpZmljYXRpb24gdmlhIFJ4IGludGVycnVwdCB3aWxsIGRvIHRoZSByZWFsIHdvcmsgKi8KLQkJaWYgKGludGEgJiBDU1JfSU5UX0JJVF9BTElWRSkgewotCQkJSVdMX0RFQlVHX0lTUihwcml2LCAiQWxpdmUgaW50ZXJydXB0XG4iKTsKLQkJCXByaXYtPmlzcl9zdGF0cy5hbGl2ZSsrOwotCQl9Ci0JfQotI2VuZGlmCi0JLyogU2FmZWx5IGlnbm9yZSB0aGVzZSBiaXRzIGZvciBkZWJ1ZyBjaGVja3MgYmVsb3cgKi8KLQlpbnRhICY9IH4oQ1NSX0lOVF9CSVRfU0NEIHwgQ1NSX0lOVF9CSVRfQUxJVkUpOwotCi0JLyogSFcgUkYgS0lMTCBzd2l0Y2ggdG9nZ2xlZCAqLwotCWlmIChpbnRhICYgQ1NSX0lOVF9CSVRfUkZfS0lMTCkgewotCQlpbnQgaHdfcmZfa2lsbCA9IDA7Ci0JCWlmICghKGl3bF9yZWFkMzIocHJpdiwgQ1NSX0dQX0NOVFJMKSAmCi0JCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpKQotCQkJaHdfcmZfa2lsbCA9IDE7Ci0KLQkJSVdMX1dBUk4ocHJpdiwgIlJGX0tJTEwgYml0IHRvZ2dsZWQgdG8gJXMuXG4iLAotCQkJCWh3X3JmX2tpbGwgPyAiZGlzYWJsZSByYWRpbyIgOiAiZW5hYmxlIHJhZGlvIik7Ci0KLQkJcHJpdi0+aXNyX3N0YXRzLnJma2lsbCsrOwotCi0JCS8qIGRyaXZlciBvbmx5IGxvYWRzIHVjb2RlIG9uY2Ugc2V0dGluZyB0aGUgaW50ZXJmYWNlIHVwLgotCQkgKiB0aGUgZHJpdmVyIGFsbG93cyBsb2FkaW5nIHRoZSB1Y29kZSBldmVuIGlmIHRoZSByYWRpbwotCQkgKiBpcyBraWxsZWQuIEhlbmNlIHVwZGF0ZSB0aGUga2lsbHN3aXRjaCBzdGF0ZSBoZXJlLiBUaGUKLQkJICogcmZraWxsIGhhbmRsZXIgd2lsbCBjYXJlIGFib3V0IHJlc3RhcnRpbmcgaWYgbmVlZGVkLgotCQkgKi8KLQkJaWYgKCF0ZXN0X2JpdChTVEFUVVNfQUxJVkUsICZwcml2LT5zdGF0dXMpKSB7Ci0JCQlpZiAoaHdfcmZfa2lsbCkKLQkJCQlzZXRfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQkJCWVsc2UKLQkJCQljbGVhcl9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCQkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShwcml2LT5ody0+d2lwaHksIGh3X3JmX2tpbGwpOwotCQl9Ci0KLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9SRl9LSUxMOwotCX0KLQotCS8qIENoaXAgZ290IHRvbyBob3QgYW5kIHN0b3BwZWQgaXRzZWxmICovCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9DVF9LSUxMKSB7Ci0JCUlXTF9FUlIocHJpdiwgIk1pY3JvY29kZSBDVCBraWxsIGVycm9yIGRldGVjdGVkLlxuIik7Ci0JCXByaXYtPmlzcl9zdGF0cy5jdGtpbGwrKzsKLQkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9DVF9LSUxMOwotCX0KLQotCS8qIEVycm9yIGRldGVjdGVkIGJ5IHVDb2RlICovCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9TV19FUlIpIHsKLQkJSVdMX0VSUihwcml2LCAiTWljcm9jb2RlIFNXIGVycm9yIGRldGVjdGVkLiAiCi0JCQkiIFJlc3RhcnRpbmcgMHglWC5cbiIsIGludGEpOwotCQlwcml2LT5pc3Jfc3RhdHMuc3crKzsKLQkJaXdsX2xlZ2FjeV9pcnFfaGFuZGxlX2Vycm9yKHByaXYpOwotCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX1NXX0VSUjsKLQl9Ci0KLQkvKgotCSAqIHVDb2RlIHdha2VzIHVwIGFmdGVyIHBvd2VyLWRvd24gc2xlZXAuCi0JICogVGVsbCBkZXZpY2UgYWJvdXQgYW55IG5ldyB0eCBvciBob3N0IGNvbW1hbmRzIGVucXVldWVkLAotCSAqIGFuZCBhYm91dCBhbnkgUnggYnVmZmVycyBtYWRlIGF2YWlsYWJsZSB3aGlsZSBhc2xlZXAuCi0JICovCi0JaWYgKGludGEgJiBDU1JfSU5UX0JJVF9XQUtFVVApIHsKLQkJSVdMX0RFQlVHX0lTUihwcml2LCAiV2FrZXVwIGludGVycnVwdFxuIik7Ci0JCWl3bF9sZWdhY3lfcnhfcXVldWVfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+cnhxKTsKLQkJZm9yIChpID0gMDsgaSA8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bTsgaSsrKQotCQkJaXdsX2xlZ2FjeV90eHFfdXBkYXRlX3dyaXRlX3B0cihwcml2LCAmcHJpdi0+dHhxW2ldKTsKLQkJcHJpdi0+aXNyX3N0YXRzLndha2V1cCsrOwotCQloYW5kbGVkIHw9IENTUl9JTlRfQklUX1dBS0VVUDsKLQl9Ci0KLQkvKiBBbGwgdUNvZGUgY29tbWFuZCByZXNwb25zZXMsIGluY2x1ZGluZyBUeCBjb21tYW5kIHJlc3BvbnNlcywKLQkgKiBSeCAicmVzcG9uc2VzIiAoZnJhbWUtcmVjZWl2ZWQgbm90aWZpY2F0aW9uKSwgYW5kIG90aGVyCi0JICogbm90aWZpY2F0aW9ucyBmcm9tIHVDb2RlIGNvbWUgdGhyb3VnaCBoZXJlKi8KLQlpZiAoaW50YSAmIChDU1JfSU5UX0JJVF9GSF9SWCB8IENTUl9JTlRfQklUX1NXX1JYKSkgewotCQlpd2w0OTY1X3J4X2hhbmRsZShwcml2KTsKLQkJcHJpdi0+aXNyX3N0YXRzLnJ4Kys7Ci0JCWhhbmRsZWQgfD0gKENTUl9JTlRfQklUX0ZIX1JYIHwgQ1NSX0lOVF9CSVRfU1dfUlgpOwotCX0KLQotCS8qIFRoaXMgIlR4IiBETUEgY2hhbm5lbCBpcyB1c2VkIG9ubHkgZm9yIGxvYWRpbmcgdUNvZGUgKi8KLQlpZiAoaW50YSAmIENTUl9JTlRfQklUX0ZIX1RYKSB7Ci0JCUlXTF9ERUJVR19JU1IocHJpdiwgInVDb2RlIGxvYWQgaW50ZXJydXB0XG4iKTsKLQkJcHJpdi0+aXNyX3N0YXRzLnR4Kys7Ci0JCWhhbmRsZWQgfD0gQ1NSX0lOVF9CSVRfRkhfVFg7Ci0JCS8qIFdha2UgdXAgdUNvZGUgbG9hZCByb3V0aW5lLCBub3cgdGhhdCBsb2FkIGlzIGNvbXBsZXRlICovCi0JCXByaXYtPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMTsKLQkJd2FrZV91cCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLQl9Ci0KLQlpZiAoaW50YSAmIH5oYW5kbGVkKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuaGFuZGxlZCBJTlRBIGJpdHMgMHglMDh4XG4iLCBpbnRhICYgfmhhbmRsZWQpOwotCQlwcml2LT5pc3Jfc3RhdHMudW5oYW5kbGVkKys7Ci0JfQotCi0JaWYgKGludGEgJiB+KHByaXYtPmludGFfbWFzaykpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIkRpc2FibGVkIElOVEEgYml0cyAweCUwOHggd2VyZSBwZW5kaW5nXG4iLAotCQkJIGludGEgJiB+cHJpdi0+aW50YV9tYXNrKTsKLQkJSVdMX1dBUk4ocHJpdiwgIiAgIHdpdGggRkhfSU5UID0gMHglMDh4XG4iLCBpbnRhX2ZoKTsKLQl9Ci0KLQkvKiBSZS1lbmFibGUgYWxsIGludGVycnVwdHMgKi8KLQkvKiBvbmx5IFJlLWVuYWJsZSBpZiBkaXNhYmxlZCBieSBpcnEgKi8KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0lOVF9FTkFCTEVELCAmcHJpdi0+c3RhdHVzKSkKLQkJaXdsX2xlZ2FjeV9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKLQkvKiBSZS1lbmFibGUgUkZfS0lMTCBpZiBpdCBvY2N1cnJlZCAqLwotCWVsc2UgaWYgKGhhbmRsZWQgJiBDU1JfSU5UX0JJVF9SRl9LSUxMKQotCQlpd2xfbGVnYWN5X2VuYWJsZV9yZmtpbGxfaW50KHByaXYpOwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0JaWYgKGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKHByaXYpICYgKElXTF9ETF9JU1IpKSB7Ci0JCWludGEgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9JTlQpOwotCQlpbnRhX21hc2sgPSBpd2xfcmVhZDMyKHByaXYsIENTUl9JTlRfTUFTSyk7Ci0JCWludGFfZmggPSBpd2xfcmVhZDMyKHByaXYsIENTUl9GSF9JTlRfU1RBVFVTKTsKLQkJSVdMX0RFQlVHX0lTUihwcml2LAotCQkJIkVuZCBpbnRhIDB4JTA4eCwgZW5hYmxlZCAweCUwOHgsIGZoIDB4JTA4eCwgIgotCQkJImZsYWdzIDB4JTA4bHhcbiIsIGludGEsIGludGFfbWFzaywgaW50YV9maCwgZmxhZ3MpOwotCX0KLSNlbmRpZgotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBzeXNmcyBhdHRyaWJ1dGVzCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHCi0KLS8qCi0gKiBUaGUgZm9sbG93aW5nIGFkZHMgYSBuZXcgYXR0cmlidXRlIHRvIHRoZSBzeXNmcyByZXByZXNlbnRhdGlvbgotICogb2YgdGhpcyBkZXZpY2UgZHJpdmVyIChpLmUuIGEgbmV3IGZpbGUgaW4gL3N5cy9jbGFzcy9uZXQvd2xhbjAvZGV2aWNlLykKLSAqIHVzZWQgZm9yIGNvbnRyb2xsaW5nIHRoZSBkZWJ1ZyBsZXZlbC4KLSAqCi0gKiBTZWUgdGhlIGxldmVsIGRlZmluaXRpb25zIGluIGl3bCBmb3IgZGV0YWlscy4KLSAqCi0gKiBUaGUgZGVidWdfbGV2ZWwgYmVpbmcgbWFuYWdlZCB1c2luZyBzeXNmcyBiZWxvdyBpcyBhIHBlciBkZXZpY2UgZGVidWcKLSAqIGxldmVsIHRoYXQgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBnbG9iYWwgZGVidWcgbGV2ZWwgaWYgaXQgKHRoZSBwZXIKLSAqIGRldmljZSBkZWJ1ZyBsZXZlbCkgaXMgc2V0LgotICovCi1zdGF0aWMgc3NpemVfdCBpd2w0OTY1X3Nob3dfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQlyZXR1cm4gc3ByaW50ZihidWYsICIweCUwOFhcbiIsIGl3bF9sZWdhY3lfZ2V0X2RlYnVnX2xldmVsKHByaXYpKTsKLX0KLXN0YXRpYyBzc2l6ZV90IGl3bDQ5NjVfc3RvcmVfZGVidWdfbGV2ZWwoc3RydWN0IGRldmljZSAqZCwKLQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCQkgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGQpOwotCXVuc2lnbmVkIGxvbmcgdmFsOwotCWludCByZXQ7Ci0KLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZ2YWwpOwotCWlmIChyZXQpCi0JCUlXTF9FUlIocHJpdiwgIiVzIGlzIG5vdCBpbiBoZXggb3IgZGVjaW1hbCBmb3JtLlxuIiwgYnVmKTsKLQllbHNlIHsKLQkJcHJpdi0+ZGVidWdfbGV2ZWwgPSB2YWw7Ci0JCWlmIChpd2xfbGVnYWN5X2FsbG9jX3RyYWZmaWNfbWVtKHByaXYpKQotCQkJSVdMX0VSUihwcml2LAotCQkJCSJOb3QgZW5vdWdoIG1lbW9yeSB0byBnZW5lcmF0ZSB0cmFmZmljIGxvZ1xuIik7Ci0JfQotCXJldHVybiBzdHJubGVuKGJ1ZiwgY291bnQpOwotfQotCi1zdGF0aWMgREVWSUNFX0FUVFIoZGVidWdfbGV2ZWwsIFNfSVdVU1IgfCBTX0lSVUdPLAotCQkJaXdsNDk2NV9zaG93X2RlYnVnX2xldmVsLCBpd2w0OTY1X3N0b3JlX2RlYnVnX2xldmVsKTsKLQotCi0jZW5kaWYgLyogQ09ORklHX0lXTFdJRklfTEVHQUNZX0RFQlVHICovCi0KLQotc3RhdGljIHNzaXplX3QgaXdsNDk2NV9zaG93X3RlbXBlcmF0dXJlKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfYWxpdmUocHJpdikpCi0JCXJldHVybiAtRUFHQUlOOwotCi0JcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHByaXYtPnRlbXBlcmF0dXJlKTsKLX0KLQotc3RhdGljIERFVklDRV9BVFRSKHRlbXBlcmF0dXJlLCBTX0lSVUdPLCBpd2w0OTY1X3Nob3dfdGVtcGVyYXR1cmUsIE5VTEwpOwotCi1zdGF0aWMgc3NpemVfdCBpd2w0OTY1X3Nob3dfdHhfcG93ZXIoc3RydWN0IGRldmljZSAqZCwKLQkJCSAgICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZCk7Ci0KLQlpZiAoIWl3bF9sZWdhY3lfaXNfcmVhZHlfcmYocHJpdikpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIm9mZlxuIik7Ci0JZWxzZQotCQlyZXR1cm4gc3ByaW50ZihidWYsICIlZFxuIiwgcHJpdi0+dHhfcG93ZXJfdXNlcl9sbXQpOwotfQotCi1zdGF0aWMgc3NpemVfdCBpd2w0OTY1X3N0b3JlX3R4X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmQsCi0JCQkgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKLQkJCSAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGRldl9nZXRfZHJ2ZGF0YShkKTsKLQl1bnNpZ25lZCBsb25nIHZhbDsKLQlpbnQgcmV0OwotCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7Ci0JaWYgKHJldCkKLQkJSVdMX0lORk8ocHJpdiwgIiVzIGlzIG5vdCBpbiBkZWNpbWFsIGZvcm0uXG4iLCBidWYpOwotCWVsc2UgewotCQlyZXQgPSBpd2xfbGVnYWN5X3NldF90eF9wb3dlcihwcml2LCB2YWwsIGZhbHNlKTsKLQkJaWYgKHJldCkKLQkJCUlXTF9FUlIocHJpdiwgImZhaWxlZCBzZXR0aW5nIHR4IHBvd2VyICgweCVkKS5cbiIsCi0JCQkJcmV0KTsKLQkJZWxzZQotCQkJcmV0ID0gY291bnQ7Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBERVZJQ0VfQVRUUih0eF9wb3dlciwgU19JV1VTUiB8IFNfSVJVR08sCi0JCQlpd2w0OTY1X3Nob3dfdHhfcG93ZXIsIGl3bDQ5NjVfc3RvcmVfdHhfcG93ZXIpOwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqaXdsX3N5c2ZzX2VudHJpZXNbXSA9IHsKLQkmZGV2X2F0dHJfdGVtcGVyYXR1cmUuYXR0ciwKLQkmZGV2X2F0dHJfdHhfcG93ZXIuYXR0ciwKLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9MRUdBQ1lfREVCVUcKLQkmZGV2X2F0dHJfZGVidWdfbGV2ZWwuYXR0ciwKLSNlbmRpZgotCU5VTEwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGl3bF9hdHRyaWJ1dGVfZ3JvdXAgPSB7Ci0JLm5hbWUgPSBOVUxMLAkJLyogcHV0IGluIGRldmljZSBkaXJlY3RvcnkgKi8KLQkuYXR0cnMgPSBpd2xfc3lzZnNfZW50cmllcywKLX07Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiB1Q29kZSBkb3dubG9hZCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2RlYWxsb2NfdWNvZGVfcGNpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2xfbGVnYWN5X2ZyZWVfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfY29kZSk7Ci0JaXdsX2xlZ2FjeV9mcmVlX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2RhdGEpOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9kYXRhX2JhY2t1cCk7Ci0JaXdsX2xlZ2FjeV9mcmVlX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2luaXQpOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0X2RhdGEpOwotCWl3bF9sZWdhY3lfZnJlZV9md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9ib290KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9uaWNfc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCS8qIFJlbW92ZSBhbGwgcmVzZXRzIHRvIGFsbG93IE5JQyB0byBvcGVyYXRlICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULCAwKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV91Y29kZV9jYWxsYmFjayhjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3JhdywKLQkJCQkJdm9pZCAqY29udGV4dCk7Ci1zdGF0aWMgaW50IGl3bDQ5NjVfbWFjX3NldHVwX3JlZ2lzdGVyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJCXUzMiBtYXhfcHJvYmVfbGVuZ3RoKTsKLQotc3RhdGljIGludCBfX211c3RfY2hlY2sgaXdsNDk2NV9yZXF1ZXN0X2Zpcm13YXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBmaXJzdCkKLXsKLQljb25zdCBjaGFyICpuYW1lX3ByZSA9IHByaXYtPmNmZy0+ZndfbmFtZV9wcmU7Ci0JY2hhciB0YWdbOF07Ci0KLQlpZiAoZmlyc3QpIHsKLQkJcHJpdi0+ZndfaW5kZXggPSBwcml2LT5jZmctPnVjb2RlX2FwaV9tYXg7Ci0JCXNwcmludGYodGFnLCAiJWQiLCBwcml2LT5md19pbmRleCk7Ci0JfSBlbHNlIHsKLQkJcHJpdi0+ZndfaW5kZXgtLTsKLQkJc3ByaW50Zih0YWcsICIlZCIsIHByaXYtPmZ3X2luZGV4KTsKLQl9Ci0KLQlpZiAocHJpdi0+ZndfaW5kZXggPCBwcml2LT5jZmctPnVjb2RlX2FwaV9taW4pIHsKLQkJSVdMX0VSUihwcml2LCAibm8gc3VpdGFibGUgZmlybXdhcmUgZm91bmQhXG4iKTsKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0JfQotCi0Jc3ByaW50Zihwcml2LT5maXJtd2FyZV9uYW1lLCAiJXMlcyVzIiwgbmFtZV9wcmUsIHRhZywgIi51Y29kZSIpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImF0dGVtcHRpbmcgdG8gbG9hZCBmaXJtd2FyZSAnJXMnXG4iLAotCQkgICAgICAgcHJpdi0+ZmlybXdhcmVfbmFtZSk7Ci0KLQlyZXR1cm4gcmVxdWVzdF9maXJtd2FyZV9ub3dhaXQoVEhJU19NT0RVTEUsIDEsIHByaXYtPmZpcm13YXJlX25hbWUsCi0JCQkJICAgICAgICZwcml2LT5wY2lfZGV2LT5kZXYsIEdGUF9LRVJORUwsIHByaXYsCi0JCQkJICAgICAgIGl3bDQ5NjVfdWNvZGVfY2FsbGJhY2spOwotfQotCi1zdHJ1Y3QgaXdsNDk2NV9maXJtd2FyZV9waWVjZXMgewotCWNvbnN0IHZvaWQgKmluc3QsICpkYXRhLCAqaW5pdCwgKmluaXRfZGF0YSwgKmJvb3Q7Ci0Jc2l6ZV90IGluc3Rfc2l6ZSwgZGF0YV9zaXplLCBpbml0X3NpemUsIGluaXRfZGF0YV9zaXplLCBib290X3NpemU7Ci19OwotCi1zdGF0aWMgaW50IGl3bDQ5NjVfbG9hZF9maXJtd2FyZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgIGNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqdWNvZGVfcmF3LAotCQkJCSAgICAgICBzdHJ1Y3QgaXdsNDk2NV9maXJtd2FyZV9waWVjZXMgKnBpZWNlcykKLXsKLQlzdHJ1Y3QgaXdsX3Vjb2RlX2hlYWRlciAqdWNvZGUgPSAodm9pZCAqKXVjb2RlX3Jhdy0+ZGF0YTsKLQl1MzIgYXBpX3ZlciwgaGRyX3NpemU7Ci0JY29uc3QgdTggKnNyYzsKLQotCXByaXYtPnVjb2RlX3ZlciA9IGxlMzJfdG9fY3B1KHVjb2RlLT52ZXIpOwotCWFwaV92ZXIgPSBJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3Zlcik7Ci0KLQlzd2l0Y2ggKGFwaV92ZXIpIHsKLQlkZWZhdWx0OgotCWNhc2UgMDoKLQljYXNlIDE6Ci0JY2FzZSAyOgotCQloZHJfc2l6ZSA9IDI0OwotCQlpZiAodWNvZGVfcmF3LT5zaXplIDwgaGRyX3NpemUpIHsKLQkJCUlXTF9FUlIocHJpdiwgIkZpbGUgc2l6ZSB0b28gc21hbGwhXG4iKTsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JCXBpZWNlcy0+aW5zdF9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmluc3Rfc2l6ZSk7Ci0JCXBpZWNlcy0+ZGF0YV9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmRhdGFfc2l6ZSk7Ci0JCXBpZWNlcy0+aW5pdF9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmluaXRfc2l6ZSk7Ci0JCXBpZWNlcy0+aW5pdF9kYXRhX3NpemUgPQotCQkJCWxlMzJfdG9fY3B1KHVjb2RlLT52MS5pbml0X2RhdGFfc2l6ZSk7Ci0JCXBpZWNlcy0+Ym9vdF9zaXplID0gbGUzMl90b19jcHUodWNvZGUtPnYxLmJvb3Rfc2l6ZSk7Ci0JCXNyYyA9IHVjb2RlLT52MS5kYXRhOwotCQlicmVhazsKLQl9Ci0KLQkvKiBWZXJpZnkgc2l6ZSBvZiBmaWxlIHZzLiBpbWFnZSBzaXplIGluZm8gaW4gZmlsZSdzIGhlYWRlciAqLwotCWlmICh1Y29kZV9yYXctPnNpemUgIT0gaGRyX3NpemUgKyBwaWVjZXMtPmluc3Rfc2l6ZSArCi0JCQkJcGllY2VzLT5kYXRhX3NpemUgKyBwaWVjZXMtPmluaXRfc2l6ZSArCi0JCQkJcGllY2VzLT5pbml0X2RhdGFfc2l6ZSArIHBpZWNlcy0+Ym9vdF9zaXplKSB7Ci0KLQkJSVdMX0VSUihwcml2LAotCQkJInVDb2RlIGZpbGUgc2l6ZSAlZCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBzaXplXG4iLAotCQkJKGludCl1Y29kZV9yYXctPnNpemUpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwaWVjZXMtPmluc3QgPSBzcmM7Ci0Jc3JjICs9IHBpZWNlcy0+aW5zdF9zaXplOwotCXBpZWNlcy0+ZGF0YSA9IHNyYzsKLQlzcmMgKz0gcGllY2VzLT5kYXRhX3NpemU7Ci0JcGllY2VzLT5pbml0ID0gc3JjOwotCXNyYyArPSBwaWVjZXMtPmluaXRfc2l6ZTsKLQlwaWVjZXMtPmluaXRfZGF0YSA9IHNyYzsKLQlzcmMgKz0gcGllY2VzLT5pbml0X2RhdGFfc2l6ZTsKLQlwaWVjZXMtPmJvb3QgPSBzcmM7Ci0Jc3JjICs9IHBpZWNlcy0+Ym9vdF9zaXplOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogaXdsNDk2NV91Y29kZV9jYWxsYmFjayAtIGNhbGxiYWNrIHdoZW4gZmlybXdhcmUgd2FzIGxvYWRlZAotICoKLSAqIElmIGxvYWRlZCBzdWNjZXNzZnVsbHksIGNvcGllcyB0aGUgZmlybXdhcmUgaW50byBidWZmZXJzCi0gKiBmb3IgdGhlIGNhcmQgdG8gZmV0Y2ggKHZpYSBETUEpLgotICovCi1zdGF0aWMgdm9pZAotaXdsNDk2NV91Y29kZV9jYWxsYmFjayhjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3Jhdywgdm9pZCAqY29udGV4dCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBjb250ZXh0OwotCXN0cnVjdCBpd2xfdWNvZGVfaGVhZGVyICp1Y29kZTsKLQlpbnQgZXJyOwotCXN0cnVjdCBpd2w0OTY1X2Zpcm13YXJlX3BpZWNlcyBwaWVjZXM7Ci0JY29uc3QgdW5zaWduZWQgaW50IGFwaV9tYXggPSBwcml2LT5jZmctPnVjb2RlX2FwaV9tYXg7Ci0JY29uc3QgdW5zaWduZWQgaW50IGFwaV9taW4gPSBwcml2LT5jZmctPnVjb2RlX2FwaV9taW47Ci0JdTMyIGFwaV92ZXI7Ci0KLQl1MzIgbWF4X3Byb2JlX2xlbmd0aCA9IDIwMDsKLQl1MzIgc3RhbmRhcmRfcGh5X2NhbGlicmF0aW9uX3NpemUgPQotCQkJSVdMX0RFRkFVTFRfU1RBTkRBUkRfUEhZX0NBTElCUkFURV9UQkxfU0laRTsKLQotCW1lbXNldCgmcGllY2VzLCAwLCBzaXplb2YocGllY2VzKSk7Ci0KLQlpZiAoIXVjb2RlX3JhdykgewotCQlpZiAocHJpdi0+ZndfaW5kZXggPD0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWF4KQotCQkJSVdMX0VSUihwcml2LAotCQkJCSJyZXF1ZXN0IGZvciBmaXJtd2FyZSBmaWxlICclcycgZmFpbGVkLlxuIiwKLQkJCQlwcml2LT5maXJtd2FyZV9uYW1lKTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkxvYWRlZCBmaXJtd2FyZSBmaWxlICclcycgKCV6ZCBieXRlcykuXG4iLAotCQkgICAgICAgcHJpdi0+ZmlybXdhcmVfbmFtZSwgdWNvZGVfcmF3LT5zaXplKTsKLQotCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGdvdCBhdCBsZWFzdCB0aGUgQVBJIHZlcnNpb24gbnVtYmVyICovCi0JaWYgKHVjb2RlX3Jhdy0+c2l6ZSA8IDQpIHsKLQkJSVdMX0VSUihwcml2LCAiRmlsZSBzaXplIHdheSB0b28gc21hbGwhXG4iKTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JLyogRGF0YSBmcm9tIHVjb2RlIGZpbGU6ICBoZWFkZXIgZm9sbG93ZWQgYnkgdUNvZGUgaW1hZ2VzICovCi0JdWNvZGUgPSAoc3RydWN0IGl3bF91Y29kZV9oZWFkZXIgKil1Y29kZV9yYXctPmRhdGE7Ci0KLQllcnIgPSBpd2w0OTY1X2xvYWRfZmlybXdhcmUocHJpdiwgdWNvZGVfcmF3LCAmcGllY2VzKTsKLQotCWlmIChlcnIpCi0JCWdvdG8gdHJ5X2FnYWluOwotCi0JYXBpX3ZlciA9IElXTF9VQ09ERV9BUEkocHJpdi0+dWNvZGVfdmVyKTsKLQotCS8qCi0JICogYXBpX3ZlciBzaG91bGQgbWF0Y2ggdGhlIGFwaSB2ZXJzaW9uIGZvcm1pbmcgcGFydCBvZiB0aGUKLQkgKiBmaXJtd2FyZSBmaWxlbmFtZSAuLi4gYnV0IHdlIGRvbid0IGNoZWNrIGZvciB0aGF0IGFuZCBvbmx5IHJlbHkKLQkgKiBvbiB0aGUgQVBJIHZlcnNpb24gcmVhZCBmcm9tIGZpcm13YXJlIGhlYWRlciBmcm9tIGhlcmUgb24gZm9yd2FyZAotCSAqLwotCWlmIChhcGlfdmVyIDwgYXBpX21pbiB8fCBhcGlfdmVyID4gYXBpX21heCkgewotCQlJV0xfRVJSKHByaXYsCi0JCQkiRHJpdmVyIHVuYWJsZSB0byBzdXBwb3J0IHlvdXIgZmlybXdhcmUgQVBJLiAiCi0JCQkiRHJpdmVyIHN1cHBvcnRzIHYldSwgZmlybXdhcmUgaXMgdiV1LlxuIiwKLQkJCWFwaV9tYXgsIGFwaV92ZXIpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci0KLQlpZiAoYXBpX3ZlciAhPSBhcGlfbWF4KQotCQlJV0xfRVJSKHByaXYsCi0JCQkiRmlybXdhcmUgaGFzIG9sZCBBUEkgdmVyc2lvbi4gRXhwZWN0ZWQgdiV1LCAiCi0JCQkiZ290IHYldS4gTmV3IGZpcm13YXJlIGNhbiBiZSBvYnRhaW5lZCAiCi0JCQkiZnJvbSBodHRwOi8vd3d3LmludGVsbGludXh3aXJlbGVzcy5vcmcuXG4iLAotCQkJYXBpX21heCwgYXBpX3Zlcik7Ci0KLQlJV0xfSU5GTyhwcml2LCAibG9hZGVkIGZpcm13YXJlIHZlcnNpb24gJXUuJXUuJXUuJXVcbiIsCi0JCSBJV0xfVUNPREVfTUFKT1IocHJpdi0+dWNvZGVfdmVyKSwKLQkJIElXTF9VQ09ERV9NSU5PUihwcml2LT51Y29kZV92ZXIpLAotCQkgSVdMX1VDT0RFX0FQSShwcml2LT51Y29kZV92ZXIpLAotCQkgSVdMX1VDT0RFX1NFUklBTChwcml2LT51Y29kZV92ZXIpKTsKLQotCXNucHJpbnRmKHByaXYtPmh3LT53aXBoeS0+ZndfdmVyc2lvbiwKLQkJIHNpemVvZihwcml2LT5ody0+d2lwaHktPmZ3X3ZlcnNpb24pLAotCQkgIiV1LiV1LiV1LiV1IiwKLQkJIElXTF9VQ09ERV9NQUpPUihwcml2LT51Y29kZV92ZXIpLAotCQkgSVdMX1VDT0RFX01JTk9SKHByaXYtPnVjb2RlX3ZlciksCi0JCSBJV0xfVUNPREVfQVBJKHByaXYtPnVjb2RlX3ZlciksCi0JCSBJV0xfVUNPREVfU0VSSUFMKHByaXYtPnVjb2RlX3ZlcikpOwotCi0JLyoKLQkgKiBGb3IgYW55IG9mIHRoZSBmYWlsdXJlcyBiZWxvdyAoYmVmb3JlIGFsbG9jYXRpbmcgcGNpIG1lbW9yeSkKLQkgKiB3ZSB3aWxsIHRyeSB0byBsb2FkIGEgdmVyc2lvbiB3aXRoIGEgc21hbGxlciBBUEkgLS0gbWF5YmUgdGhlCi0JICogdXNlciBqdXN0IGdvdCBhIGNvcnJ1cHRlZCB2ZXJzaW9uIG9mIHRoZSBsYXRlc3QgQVBJLgotCSAqLwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImYvdyBwYWNrYWdlIGhkciB1Y29kZSB2ZXJzaW9uIHJhdyA9IDB4JXhcbiIsCi0JCSAgICAgICBwcml2LT51Y29kZV92ZXIpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgcnVudGltZSBpbnN0IHNpemUgPSAlWmRcbiIsCi0JCSAgICAgICBwaWVjZXMuaW5zdF9zaXplKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiZi93IHBhY2thZ2UgaGRyIHJ1bnRpbWUgZGF0YSBzaXplID0gJVpkXG4iLAotCQkgICAgICAgcGllY2VzLmRhdGFfc2l6ZSk7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgImYvdyBwYWNrYWdlIGhkciBpbml0IGluc3Qgc2l6ZSA9ICVaZFxuIiwKLQkJICAgICAgIHBpZWNlcy5pbml0X3NpemUpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgaW5pdCBkYXRhIHNpemUgPSAlWmRcbiIsCi0JCSAgICAgICBwaWVjZXMuaW5pdF9kYXRhX3NpemUpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJmL3cgcGFja2FnZSBoZHIgYm9vdCBpbnN0IHNpemUgPSAlWmRcbiIsCi0JCSAgICAgICBwaWVjZXMuYm9vdF9zaXplKTsKLQotCS8qIFZlcmlmeSB0aGF0IHVDb2RlIGltYWdlcyB3aWxsIGZpdCBpbiBjYXJkJ3MgU1JBTSAqLwotCWlmIChwaWVjZXMuaW5zdF9zaXplID4gcHJpdi0+aHdfcGFyYW1zLm1heF9pbnN0X3NpemUpIHsKLQkJSVdMX0VSUihwcml2LCAidUNvZGUgaW5zdHIgbGVuICVaZCB0b28gbGFyZ2UgdG8gZml0IGluXG4iLAotCQkJcGllY2VzLmluc3Rfc2l6ZSk7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQotCWlmIChwaWVjZXMuZGF0YV9zaXplID4gcHJpdi0+aHdfcGFyYW1zLm1heF9kYXRhX3NpemUpIHsKLQkJSVdMX0VSUihwcml2LCAidUNvZGUgZGF0YSBsZW4gJVpkIHRvbyBsYXJnZSB0byBmaXQgaW5cbiIsCi0JCQlwaWVjZXMuZGF0YV9zaXplKTsKLQkJZ290byB0cnlfYWdhaW47Ci0JfQotCi0JaWYgKHBpZWNlcy5pbml0X3NpemUgPiBwcml2LT5od19wYXJhbXMubWF4X2luc3Rfc2l6ZSkgewotCQlJV0xfRVJSKHByaXYsICJ1Q29kZSBpbml0IGluc3RyIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKLQkJCXBpZWNlcy5pbml0X3NpemUpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci0KLQlpZiAocGllY2VzLmluaXRfZGF0YV9zaXplID4gcHJpdi0+aHdfcGFyYW1zLm1heF9kYXRhX3NpemUpIHsKLQkJSVdMX0VSUihwcml2LCAidUNvZGUgaW5pdCBkYXRhIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKLQkJCXBpZWNlcy5pbml0X2RhdGFfc2l6ZSk7Ci0JCWdvdG8gdHJ5X2FnYWluOwotCX0KLQotCWlmIChwaWVjZXMuYm9vdF9zaXplID4gcHJpdi0+aHdfcGFyYW1zLm1heF9ic21fc2l6ZSkgewotCQlJV0xfRVJSKHByaXYsICJ1Q29kZSBib290IGluc3RyIGxlbiAlWmQgdG9vIGxhcmdlIHRvIGZpdCBpblxuIiwKLQkJCXBpZWNlcy5ib290X3NpemUpOwotCQlnb3RvIHRyeV9hZ2FpbjsKLQl9Ci0KLQkvKiBBbGxvY2F0ZSB1Y29kZSBidWZmZXJzIGZvciBjYXJkJ3MgYnVzLW1hc3RlciBsb2FkaW5nIC4uLiAqLwotCi0JLyogUnVudGltZSBpbnN0cnVjdGlvbnMgYW5kIDIgY29waWVzIG9mIGRhdGE6Ci0JICogMSkgdW5tb2RpZmllZCBmcm9tIGRpc2sKLQkgKiAyKSBiYWNrdXAgY2FjaGUgZm9yIHNhdmUvcmVzdG9yZSBkdXJpbmcgcG93ZXItZG93bnMgKi8KLQlwcml2LT51Y29kZV9jb2RlLmxlbiA9IHBpZWNlcy5pbnN0X3NpemU7Ci0JaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9jb2RlKTsKLQotCXByaXYtPnVjb2RlX2RhdGEubGVuID0gcGllY2VzLmRhdGFfc2l6ZTsKLQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2RhdGEpOwotCi0JcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAubGVuID0gcGllY2VzLmRhdGFfc2l6ZTsKLQlpd2xfbGVnYWN5X2FsbG9jX2Z3X2Rlc2MocHJpdi0+cGNpX2RldiwgJnByaXYtPnVjb2RlX2RhdGFfYmFja3VwKTsKLQotCWlmICghcHJpdi0+dWNvZGVfY29kZS52X2FkZHIgfHwgIXByaXYtPnVjb2RlX2RhdGEudl9hZGRyIHx8Ci0JICAgICFwcml2LT51Y29kZV9kYXRhX2JhY2t1cC52X2FkZHIpCi0JCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQotCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyBhbmQgZGF0YSAqLwotCWlmIChwaWVjZXMuaW5pdF9zaXplICYmIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSkgewotCQlwcml2LT51Y29kZV9pbml0LmxlbiA9IHBpZWNlcy5pbml0X3NpemU7Ci0JCWl3bF9sZWdhY3lfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfaW5pdCk7Ci0KLQkJcHJpdi0+dWNvZGVfaW5pdF9kYXRhLmxlbiA9IHBpZWNlcy5pbml0X2RhdGFfc2l6ZTsKLQkJaXdsX2xlZ2FjeV9hbGxvY19md19kZXNjKHByaXYtPnBjaV9kZXYsICZwcml2LT51Y29kZV9pbml0X2RhdGEpOwotCi0JCWlmICghcHJpdi0+dWNvZGVfaW5pdC52X2FkZHIgfHwgIXByaXYtPnVjb2RlX2luaXRfZGF0YS52X2FkZHIpCi0JCQlnb3RvIGVycl9wY2lfYWxsb2M7Ci0JfQotCi0JLyogQm9vdHN0cmFwIChpbnN0cnVjdGlvbnMgb25seSwgbm8gZGF0YSkgKi8KLQlpZiAocGllY2VzLmJvb3Rfc2l6ZSkgewotCQlwcml2LT51Y29kZV9ib290LmxlbiA9IHBpZWNlcy5ib290X3NpemU7Ci0JCWl3bF9sZWdhY3lfYWxsb2NfZndfZGVzYyhwcml2LT5wY2lfZGV2LCAmcHJpdi0+dWNvZGVfYm9vdCk7Ci0KLQkJaWYgKCFwcml2LT51Y29kZV9ib290LnZfYWRkcikKLQkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKLQl9Ci0KLQkvKiBOb3cgdGhhdCB3ZSBjYW4gbm8gbG9uZ2VyIGZhaWwsIGNvcHkgaW5mb3JtYXRpb24gKi8KLQotCXByaXYtPnN0YV9rZXlfbWF4X251bSA9IFNUQV9LRVlfTUFYX05VTTsKLQotCS8qIENvcHkgaW1hZ2VzIGludG8gYnVmZmVycyBmb3IgY2FyZCdzIGJ1cy1tYXN0ZXIgcmVhZHMgLi4uICovCi0KLQkvKiBSdW50aW1lIGluc3RydWN0aW9ucyAoZmlyc3QgYmxvY2sgb2YgZGF0YSBpbiBmaWxlKSAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJDb3B5aW5nIChidXQgbm90IGxvYWRpbmcpIHVDb2RlIGluc3RyIGxlbiAlWmRcbiIsCi0JCQlwaWVjZXMuaW5zdF9zaXplKTsKLQltZW1jcHkocHJpdi0+dWNvZGVfY29kZS52X2FkZHIsIHBpZWNlcy5pbnN0LCBwaWVjZXMuaW5zdF9zaXplKTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJ1Q29kZSBpbnN0ciBidWYgdmFkZHIgPSAweCVwLCBwYWRkciA9IDB4JTA4eFxuIiwKLQkJcHJpdi0+dWNvZGVfY29kZS52X2FkZHIsICh1MzIpcHJpdi0+dWNvZGVfY29kZS5wX2FkZHIpOwotCi0JLyoKLQkgKiBSdW50aW1lIGRhdGEKLQkgKiBOT1RFOiAgQ29weSBpbnRvIGJhY2t1cCBidWZmZXIgd2lsbCBiZSBkb25lIGluIGl3bF91cCgpCi0JICovCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgdUNvZGUgZGF0YSBsZW4gJVpkXG4iLAotCQkJcGllY2VzLmRhdGFfc2l6ZSk7Ci0JbWVtY3B5KHByaXYtPnVjb2RlX2RhdGEudl9hZGRyLCBwaWVjZXMuZGF0YSwgcGllY2VzLmRhdGFfc2l6ZSk7Ci0JbWVtY3B5KHByaXYtPnVjb2RlX2RhdGFfYmFja3VwLnZfYWRkciwgcGllY2VzLmRhdGEsIHBpZWNlcy5kYXRhX3NpemUpOwotCi0JLyogSW5pdGlhbGl6YXRpb24gaW5zdHJ1Y3Rpb25zICovCi0JaWYgKHBpZWNlcy5pbml0X3NpemUpIHsKLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKLQkJCQkiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBpbml0IGluc3RyIGxlbiAlWmRcbiIsCi0JCQkJcGllY2VzLmluaXRfc2l6ZSk7Ci0JCW1lbWNweShwcml2LT51Y29kZV9pbml0LnZfYWRkciwgcGllY2VzLmluaXQsIHBpZWNlcy5pbml0X3NpemUpOwotCX0KLQotCS8qIEluaXRpYWxpemF0aW9uIGRhdGEgKi8KLQlpZiAocGllY2VzLmluaXRfZGF0YV9zaXplKSB7Ci0JCUlXTF9ERUJVR19JTkZPKHByaXYsCi0JCQkJIkNvcHlpbmcgKGJ1dCBub3QgbG9hZGluZykgaW5pdCBkYXRhIGxlbiAlWmRcbiIsCi0JCQkgICAgICAgcGllY2VzLmluaXRfZGF0YV9zaXplKTsKLQkJbWVtY3B5KHByaXYtPnVjb2RlX2luaXRfZGF0YS52X2FkZHIsIHBpZWNlcy5pbml0X2RhdGEsCi0JCSAgICAgICBwaWVjZXMuaW5pdF9kYXRhX3NpemUpOwotCX0KLQotCS8qIEJvb3RzdHJhcCBpbnN0cnVjdGlvbnMgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiQ29weWluZyAoYnV0IG5vdCBsb2FkaW5nKSBib290IGluc3RyIGxlbiAlWmRcbiIsCi0JCQlwaWVjZXMuYm9vdF9zaXplKTsKLQltZW1jcHkocHJpdi0+dWNvZGVfYm9vdC52X2FkZHIsIHBpZWNlcy5ib290LCBwaWVjZXMuYm9vdF9zaXplKTsKLQotCS8qCi0JICogZmlndXJlIG91dCB0aGUgb2Zmc2V0IG9mIGNoYWluIG5vaXNlIHJlc2V0IGFuZCBnYWluIGNvbW1hbmRzCi0JICogYmFzZSBvbiB0aGUgc2l6ZSBvZiBzdGFuZGFyZCBwaHkgY2FsaWJyYXRpb24gY29tbWFuZHMgdGFibGUgc2l6ZQotCSAqLwotCXByaXYtPl80OTY1LnBoeV9jYWxpYl9jaGFpbl9ub2lzZV9yZXNldF9jbWQgPQotCQlzdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZTsKLQlwcml2LT5fNDk2NS5waHlfY2FsaWJfY2hhaW5fbm9pc2VfZ2Fpbl9jbWQgPQotCQlzdGFuZGFyZF9waHlfY2FsaWJyYXRpb25fc2l6ZSArIDE7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiBUaGlzIGlzIHN0aWxsIHBhcnQgb2YgcHJvYmUoKSBpbiBhIHNlbnNlLi4uCi0JICoKLQkgKiA5LiBTZXR1cCBhbmQgcmVnaXN0ZXIgd2l0aCBtYWM4MDIxMSBhbmQgZGVidWdmcwotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQllcnIgPSBpd2w0OTY1X21hY19zZXR1cF9yZWdpc3Rlcihwcml2LCBtYXhfcHJvYmVfbGVuZ3RoKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF91bmJpbmQ7Ci0KLQllcnIgPSBpd2xfbGVnYWN5X2RiZ2ZzX3JlZ2lzdGVyKHByaXYsIERSVl9OQU1FKTsKLQlpZiAoZXJyKQotCQlJV0xfRVJSKHByaXYsCi0JCSJmYWlsZWQgdG8gY3JlYXRlIGRlYnVnZnMgZmlsZXMuIElnbm9yaW5nIGVycm9yOiAlZFxuIiwgZXJyKTsKLQotCWVyciA9IHN5c2ZzX2NyZWF0ZV9ncm91cCgmcHJpdi0+cGNpX2Rldi0+ZGV2LmtvYmosCi0JCQkJCSZpd2xfYXR0cmlidXRlX2dyb3VwKTsKLQlpZiAoZXJyKSB7Ci0JCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZGV2aWNlIGF0dHJpYnV0ZXNcbiIpOwotCQlnb3RvIG91dF91bmJpbmQ7Ci0JfQotCi0JLyogV2UgaGF2ZSBvdXIgY29waWVzIG5vdywgYWxsb3cgT1MgcmVsZWFzZSBpdHMgY29waWVzICovCi0JcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOwotCWNvbXBsZXRlKCZwcml2LT5fNDk2NS5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKLQlyZXR1cm47Ci0KLSB0cnlfYWdhaW46Ci0JLyogdHJ5IG5leHQsIGlmIGFueSAqLwotCWlmIChpd2w0OTY1X3JlcXVlc3RfZmlybXdhcmUocHJpdiwgZmFsc2UpKQotCQlnb3RvIG91dF91bmJpbmQ7Ci0JcmVsZWFzZV9maXJtd2FyZSh1Y29kZV9yYXcpOwotCXJldHVybjsKLQotIGVycl9wY2lfYWxsb2M6Ci0JSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIGFsbG9jYXRlIHBjaSBtZW1vcnlcbiIpOwotCWl3bDQ5NjVfZGVhbGxvY191Y29kZV9wY2kocHJpdik7Ci0gb3V0X3VuYmluZDoKLQljb21wbGV0ZSgmcHJpdi0+XzQ5NjUuZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7Ci0JZGV2aWNlX3JlbGVhc2VfZHJpdmVyKCZwcml2LT5wY2lfZGV2LT5kZXYpOwotCXJlbGVhc2VfZmlybXdhcmUodWNvZGVfcmF3KTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBkZXNjX2xvb2t1cF90ZXh0W10gPSB7Ci0JIk9LIiwKLQkiRkFJTCIsCi0JIkJBRF9QQVJBTSIsCi0JIkJBRF9DSEVDS1NVTSIsCi0JIk5NSV9JTlRFUlJVUFRfV0RHIiwKLQkiU1lTQVNTRVJUIiwKLQkiRkFUQUxfRVJST1IiLAotCSJCQURfQ09NTUFORCIsCi0JIkhXX0VSUk9SX1RVTkVfTE9DSyIsCi0JIkhXX0VSUk9SX1RFTVBFUkFUVVJFIiwKLQkiSUxMRUdBTF9DSEFOX0ZSRVEiLAotCSJWQ0NfTk9UX1NUQUJMRSIsCi0JIkZIX0VSUk9SIiwKLQkiTk1JX0lOVEVSUlVQVF9IT1NUIiwKLQkiTk1JX0lOVEVSUlVQVF9BQ1RJT05fUFQiLAotCSJOTUlfSU5URVJSVVBUX1VOS05PV04iLAotCSJVQ09ERV9WRVJTSU9OX01JU01BVENIIiwKLQkiSFdfRVJST1JfQUJTX0xPQ0siLAotCSJIV19FUlJPUl9DQUxfTE9DS19GQUlMIiwKLQkiTk1JX0lOVEVSUlVQVF9JTlNUX0FDVElPTl9QVCIsCi0JIk5NSV9JTlRFUlJVUFRfREFUQV9BQ1RJT05fUFQiLAotCSJOTUlfVFJNX0hXX0VSIiwKLQkiTk1JX0lOVEVSUlVQVF9UUk0iLAotCSJOTUlfSU5URVJSVVBUX0JSRUFLX1BPSU5UIiwKLQkiREVCVUdfMCIsCi0JIkRFQlVHXzEiLAotCSJERUJVR18yIiwKLQkiREVCVUdfMyIsCi19OwotCi1zdGF0aWMgc3RydWN0IHsgY2hhciAqbmFtZTsgdTggbnVtOyB9IGFkdmFuY2VkX2xvb2t1cFtdID0gewotCXsgIk5NSV9JTlRFUlJVUFRfV0RHIiwgMHgzNCB9LAotCXsgIlNZU0FTU0VSVCIsIDB4MzUgfSwKLQl7ICJVQ09ERV9WRVJTSU9OX01JU01BVENIIiwgMHgzNyB9LAotCXsgIkJBRF9DT01NQU5EIiwgMHgzOCB9LAotCXsgIk5NSV9JTlRFUlJVUFRfREFUQV9BQ1RJT05fUFQiLCAweDNDIH0sCi0JeyAiRkFUQUxfRVJST1IiLCAweDNEIH0sCi0JeyAiTk1JX1RSTV9IV19FUlIiLCAweDQ2IH0sCi0JeyAiTk1JX0lOVEVSUlVQVF9UUk0iLCAweDRDIH0sCi0JeyAiTk1JX0lOVEVSUlVQVF9CUkVBS19QT0lOVCIsIDB4NTQgfSwKLQl7ICJOTUlfSU5URVJSVVBUX1dER19SWEZfRlVMTCIsIDB4NUMgfSwKLQl7ICJOTUlfSU5URVJSVVBUX1dER19OT19SQkRfUlhGX0ZVTEwiLCAweDY0IH0sCi0JeyAiTk1JX0lOVEVSUlVQVF9IT1NUIiwgMHg2NiB9LAotCXsgIk5NSV9JTlRFUlJVUFRfQUNUSU9OX1BUIiwgMHg3QyB9LAotCXsgIk5NSV9JTlRFUlJVUFRfVU5LTk9XTiIsIDB4ODQgfSwKLQl7ICJOTUlfSU5URVJSVVBUX0lOU1RfQUNUSU9OX1BUIiwgMHg4NiB9LAotCXsgIkFEVkFOQ0VEX1NZU0FTU0VSVCIsIDAgfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICppd2w0OTY1X2Rlc2NfbG9va3VwKHUzMiBudW0pCi17Ci0JaW50IGk7Ci0JaW50IG1heCA9IEFSUkFZX1NJWkUoZGVzY19sb29rdXBfdGV4dCk7Ci0KLQlpZiAobnVtIDwgbWF4KQotCQlyZXR1cm4gZGVzY19sb29rdXBfdGV4dFtudW1dOwotCi0JbWF4ID0gQVJSQVlfU0laRShhZHZhbmNlZF9sb29rdXApIC0gMTsKLQlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKLQkJaWYgKGFkdmFuY2VkX2xvb2t1cFtpXS5udW0gPT0gbnVtKQotCQkJYnJlYWs7Ci0JfQotCXJldHVybiBhZHZhbmNlZF9sb29rdXBbaV0ubmFtZTsKLX0KLQotI2RlZmluZSBFUlJPUl9TVEFSVF9PRkZTRVQgICgxICogc2l6ZW9mKHUzMikpCi0jZGVmaW5lIEVSUk9SX0VMRU1fU0laRSAgICAgKDcgKiBzaXplb2YodTMyKSkKLQotdm9pZCBpd2w0OTY1X2R1bXBfbmljX2Vycm9yX2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTMyIGRhdGEyLCBsaW5lOwotCXUzMiBkZXNjLCB0aW1lLCBjb3VudCwgYmFzZSwgZGF0YTE7Ci0JdTMyIGJsaW5rMSwgYmxpbmsyLCBpbGluazEsIGlsaW5rMjsKLQl1MzIgcGMsIGhjbWQ7Ci0KLQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKSB7Ci0JCWJhc2UgPSBsZTMyX3RvX2NwdShwcml2LT5jYXJkX2FsaXZlX2luaXQuZXJyb3JfZXZlbnRfdGFibGVfcHRyKTsKLQl9IGVsc2UgewotCQliYXNlID0gbGUzMl90b19jcHUocHJpdi0+Y2FyZF9hbGl2ZS5lcnJvcl9ldmVudF90YWJsZV9wdHIpOwotCX0KLQotCWlmICghcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+aXNfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgewotCQlJV0xfRVJSKHByaXYsCi0JCQkiTm90IHZhbGlkIGVycm9yIGxvZyBwb2ludGVyIDB4JTA4WCBmb3IgJXMgdUNvZGVcbiIsCi0JCQliYXNlLCAocHJpdi0+dWNvZGVfdHlwZSA9PSBVQ09ERV9JTklUKSA/ICJJbml0IiA6ICJSVCIpOwotCQlyZXR1cm47Ci0JfQotCi0JY291bnQgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSk7Ci0KLQlpZiAoRVJST1JfU1RBUlRfT0ZGU0VUIDw9IGNvdW50ICogRVJST1JfRUxFTV9TSVpFKSB7Ci0JCUlXTF9FUlIocHJpdiwgIlN0YXJ0IElXTCBFcnJvciBMb2cgRHVtcDpcbiIpOwotCQlJV0xfRVJSKHByaXYsICJTdGF0dXM6IDB4JTA4bFgsIGNvdW50OiAlZFxuIiwKLQkJCXByaXYtPnN0YXR1cywgY291bnQpOwotCX0KLQotCWRlc2MgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDEgKiBzaXplb2YodTMyKSk7Ci0JcHJpdi0+aXNyX3N0YXRzLmVycl9jb2RlID0gZGVzYzsKLQlwYyA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgMiAqIHNpemVvZih1MzIpKTsKLQlibGluazEgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDMgKiBzaXplb2YodTMyKSk7Ci0JYmxpbmsyID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyA0ICogc2l6ZW9mKHUzMikpOwotCWlsaW5rMSA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgNSAqIHNpemVvZih1MzIpKTsKLQlpbGluazIgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDYgKiBzaXplb2YodTMyKSk7Ci0JZGF0YTEgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDcgKiBzaXplb2YodTMyKSk7Ci0JZGF0YTIgPSBpd2xfbGVnYWN5X3JlYWRfdGFyZ19tZW0ocHJpdiwgYmFzZSArIDggKiBzaXplb2YodTMyKSk7Ci0JbGluZSA9IGl3bF9sZWdhY3lfcmVhZF90YXJnX21lbShwcml2LCBiYXNlICsgOSAqIHNpemVvZih1MzIpKTsKLQl0aW1lID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAxMSAqIHNpemVvZih1MzIpKTsKLQloY21kID0gaXdsX2xlZ2FjeV9yZWFkX3RhcmdfbWVtKHByaXYsIGJhc2UgKyAyMiAqIHNpemVvZih1MzIpKTsKLQotCXRyYWNlX2l3bHdpZmlfbGVnYWN5X2Rldl91Y29kZV9lcnJvcihwcml2LCBkZXNjLAotCQkJCQl0aW1lLCBkYXRhMSwgZGF0YTIsIGxpbmUsCi0JCQkJICAgICAgYmxpbmsxLCBibGluazIsIGlsaW5rMSwgaWxpbmsyKTsKLQotCUlXTF9FUlIocHJpdiwgIkRlc2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZSAgICAgICAiCi0JCSJkYXRhMSAgICAgIGRhdGEyICAgICAgbGluZVxuIik7Ci0JSVdMX0VSUihwcml2LCAiJS0yOHMgKDB4JTA0WCkgJTAxMHUgMHglMDhYIDB4JTA4WCAldVxuIiwKLQkJaXdsNDk2NV9kZXNjX2xvb2t1cChkZXNjKSwgZGVzYywgdGltZSwgZGF0YTEsIGRhdGEyLCBsaW5lKTsKLQlJV0xfRVJSKHByaXYsICJwYyAgICAgIGJsaW5rMSAgYmxpbmsyICBpbGluazEgIGlsaW5rMiAgaGNtZFxuIik7Ci0JSVdMX0VSUihwcml2LCAiMHglMDVYIDB4JTA1WCAweCUwNVggMHglMDVYIDB4JTA1WCAweCUwNVhcbiIsCi0JCXBjLCBibGluazEsIGJsaW5rMiwgaWxpbmsxLCBpbGluazIsIGhjbWQpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3JmX2tpbGxfY3RfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2N0X2tpbGxfY29uZmlnIGNtZDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCByZXQgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsCi0JCSAgICBDU1JfVUNPREVfRFJWX0dQMV9SRUdfQklUX0NUX0tJTExfRVhJVCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCi0JY21kLmNyaXRpY2FsX3RlbXBlcmF0dXJlX1IgPQotCQljcHVfdG9fbGUzMihwcml2LT5od19wYXJhbXMuY3Rfa2lsbF90aHJlc2hvbGQpOwotCi0JcmV0ID0gaXdsX2xlZ2FjeV9zZW5kX2NtZF9wZHUocHJpdiwgUkVQTFlfQ1RfS0lMTF9DT05GSUdfQ01ELAotCQkJICAgICAgIHNpemVvZihjbWQpLCAmY21kKTsKLQlpZiAocmV0KQotCQlJV0xfRVJSKHByaXYsICJSRVBMWV9DVF9LSUxMX0NPTkZJR19DTUQgZmFpbGVkXG4iKTsKLQllbHNlCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJSRVBMWV9DVF9LSUxMX0NPTkZJR19DTUQgIgotCQkJCSJzdWNjZWVkZWQsICIKLQkJCQkiY3JpdGljYWwgdGVtcGVyYXR1cmUgaXMgJWRcbiIsCi0JCQkJcHJpdi0+aHdfcGFyYW1zLmN0X2tpbGxfdGhyZXNob2xkKTsKLX0KLQotc3RhdGljIGNvbnN0IHM4IGRlZmF1bHRfcXVldWVfdG9fdHhfZmlmb1tdID0gewotCUlXTF9UWF9GSUZPX1ZPLAotCUlXTF9UWF9GSUZPX1ZJLAotCUlXTF9UWF9GSUZPX0JFLAotCUlXTF9UWF9GSUZPX0JLLAotCUlXTDQ5X0NNRF9GSUZPX05VTSwKLQlJV0xfVFhfRklGT19VTlVTRUQsCi0JSVdMX1RYX0ZJRk9fVU5VU0VELAotfTsKLQotc3RhdGljIGludCBpd2w0OTY1X2FsaXZlX25vdGlmeShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdTMyIGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgaSwgY2hhbjsKLQl1MzIgcmVnX3ZhbDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0KLQkvKiBDbGVhciA0OTY1J3MgaW50ZXJuYWwgVHggU2NoZWR1bGVyIGRhdGEgYmFzZSAqLwotCXByaXYtPnNjZF9iYXNlX2FkZHIgPSBpd2xfbGVnYWN5X3JlYWRfcHJwaChwcml2LAotCQkJCQlJV0w0OV9TQ0RfU1JBTV9CQVNFX0FERFIpOwotCWEgPSBwcml2LT5zY2RfYmFzZV9hZGRyICsgSVdMNDlfU0NEX0NPTlRFWFRfREFUQV9PRkZTRVQ7Ci0JZm9yICg7IGEgPCBwcml2LT5zY2RfYmFzZV9hZGRyICsgSVdMNDlfU0NEX1RYX1NUVFNfQklUTUFQX09GRlNFVDsgYSArPSA0KQotCQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsIGEsIDApOwotCWZvciAoOyBhIDwgcHJpdi0+c2NkX2Jhc2VfYWRkciArIElXTDQ5X1NDRF9UUkFOU0xBVEVfVEJMX09GRlNFVDsgYSArPSA0KQotCQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsIGEsIDApOwotCWZvciAoOyBhIDwgcHJpdi0+c2NkX2Jhc2VfYWRkciArCi0JICAgICAgIElXTDQ5X1NDRF9UUkFOU0xBVEVfVEJMX09GRlNFVF9RVUVVRShwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW0pOyBhICs9IDQpCi0JCWl3bF9sZWdhY3lfd3JpdGVfdGFyZ19tZW0ocHJpdiwgYSwgMCk7Ci0KLQkvKiBUZWwgNDk2NSB3aGVyZSB0byBmaW5kIFR4IGJ5dGUgY291bnQgdGFibGVzICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIElXTDQ5X1NDRF9EUkFNX0JBU0VfQUREUiwKLQkJCXByaXYtPnNjZF9iY190YmxzLmRtYSA+PiAxMCk7Ci0KLQkvKiBFbmFibGUgRE1BIGNoYW5uZWwgKi8KLQlmb3IgKGNoYW4gPSAwOyBjaGFuIDwgRkg0OV9UQ1NSX0NITkxfTlVNIDsgY2hhbisrKQotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsCi0JCQkJRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoY2hhbiksCi0JCQkJRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTkFCTEUgfAotCQkJCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NSRURJVF9FTkFCTEUpOwotCi0JLyogVXBkYXRlIEZIIGNoaWNrZW4gYml0cyAqLwotCXJlZ192YWwgPSBpd2xfbGVnYWN5X3JlYWRfZGlyZWN0MzIocHJpdiwgRkhfVFhfQ0hJQ0tFTl9CSVRTX1JFRyk7Ci0JaXdsX2xlZ2FjeV93cml0ZV9kaXJlY3QzMihwcml2LCBGSF9UWF9DSElDS0VOX0JJVFNfUkVHLAotCQkJICAgcmVnX3ZhbCB8IEZIX1RYX0NISUNLRU5fQklUU19TQ0RfQVVUT19SRVRSWV9FTik7Ci0KLQkvKiBEaXNhYmxlIGNoYWluIG1vZGUgZm9yIGFsbCBxdWV1ZXMgKi8KLQlpd2xfbGVnYWN5X3dyaXRlX3BycGgocHJpdiwgSVdMNDlfU0NEX1FVRVVFQ0hBSU5fU0VMLCAwKTsKLQotCS8qIEluaXRpYWxpemUgZWFjaCBUeCBxdWV1ZSAoaW5jbHVkaW5nIHRoZSBjb21tYW5kIHF1ZXVlKSAqLwotCWZvciAoaSA9IDA7IGkgPCBwcml2LT5od19wYXJhbXMubWF4X3R4cV9udW07IGkrKykgewotCi0JCS8qIFRGRCBjaXJjdWxhciBidWZmZXIgcmVhZC93cml0ZSBpbmRleGVzICovCi0JCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBJV0w0OV9TQ0RfUVVFVUVfUkRQVFIoaSksIDApOwotCQlpd2xfbGVnYWN5X3dyaXRlX2RpcmVjdDMyKHByaXYsIEhCVVNfVEFSR19XUlBUUiwgMCB8IChpIDw8IDgpKTsKLQotCQkvKiBNYXggVHggV2luZG93IHNpemUgZm9yIFNjaGVkdWxlci1BQ0sgbW9kZSAqLwotCQlpd2xfbGVnYWN5X3dyaXRlX3RhcmdfbWVtKHByaXYsIHByaXYtPnNjZF9iYXNlX2FkZHIgKwotCQkJCUlXTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVChpKSwKLQkJCQkoU0NEX1dJTl9TSVpFIDw8Ci0JCQkJSVdMNDlfU0NEX1FVRVVFX0NUWF9SRUcxX1dJTl9TSVpFX1BPUykgJgotCQkJCUlXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9NU0spOwotCi0JCS8qIEZyYW1lIGxpbWl0ICovCi0JCWl3bF9sZWdhY3lfd3JpdGVfdGFyZ19tZW0ocHJpdiwgcHJpdi0+c2NkX2Jhc2VfYWRkciArCi0JCQkJSVdMNDlfU0NEX0NPTlRFWFRfUVVFVUVfT0ZGU0VUKGkpICsKLQkJCQlzaXplb2YodTMyKSwKLQkJCQkoU0NEX0ZSQU1FX0xJTUlUIDw8Ci0JCQkJSVdMNDlfU0NEX1FVRVVFX0NUWF9SRUcyX0ZSQU1FX0xJTUlUX1BPUykgJgotCQkJCUlXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9NU0spOwotCi0JfQotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBJV0w0OV9TQ0RfSU5URVJSVVBUX01BU0ssCi0JCQkJICgxIDw8IHByaXYtPmh3X3BhcmFtcy5tYXhfdHhxX251bSkgLSAxKTsKLQotCS8qIEFjdGl2YXRlIGFsbCBUeCBETUEvRklGTyBjaGFubmVscyAqLwotCWl3bDQ5NjVfdHhxX3NldF9zY2hlZChwcml2LCBJV0xfTUFTSygwLCA2KSk7Ci0KLQlpd2w0OTY1X3NldF93cl9wdHJzKHByaXYsIElXTF9ERUZBVUxUX0NNRF9RVUVVRV9OVU0sIDApOwotCi0JLyogbWFrZSBzdXJlIGFsbCBxdWV1ZSBhcmUgbm90IHN0b3BwZWQgKi8KLQltZW1zZXQoJnByaXYtPnF1ZXVlX3N0b3BwZWRbMF0sIDAsIHNpemVvZihwcml2LT5xdWV1ZV9zdG9wcGVkKSk7Ci0JZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKLQkJYXRvbWljX3NldCgmcHJpdi0+cXVldWVfc3RvcF9jb3VudFtpXSwgMCk7Ci0KLQkvKiByZXNldCB0byAwIHRvIGVuYWJsZSBhbGwgdGhlIHF1ZXVlIGZpcnN0ICovCi0JcHJpdi0+dHhxX2N0eF9hY3RpdmVfbXNrID0gMDsKLQkvKiBNYXAgZWFjaCBUeC9jbWQgcXVldWUgdG8gaXRzIGNvcnJlc3BvbmRpbmcgZmlmbyAqLwotCUJVSUxEX0JVR19PTihBUlJBWV9TSVpFKGRlZmF1bHRfcXVldWVfdG9fdHhfZmlmbykgIT0gNyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShkZWZhdWx0X3F1ZXVlX3RvX3R4X2ZpZm8pOyBpKyspIHsKLQkJaW50IGFjID0gZGVmYXVsdF9xdWV1ZV90b190eF9maWZvW2ldOwotCi0JCWl3bF90eHFfY3R4X2FjdGl2YXRlKHByaXYsIGkpOwotCi0JCWlmIChhYyA9PSBJV0xfVFhfRklGT19VTlVTRUQpCi0JCQljb250aW51ZTsKLQotCQlpd2w0OTY1X3R4X3F1ZXVlX3NldF9zdGF0dXMocHJpdiwgJnByaXYtPnR4cVtpXSwgYWMsIDApOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIGl3bDQ5NjVfYWxpdmVfc3RhcnQgLSBjYWxsZWQgYWZ0ZXIgUkVQTFlfQUxJVkUgbm90aWZpY2F0aW9uIHJlY2VpdmVkCi0gKiAgICAgICAgICAgICAgICAgICBmcm9tIHByb3RvY29sL3J1bnRpbWUgdUNvZGUgKGluaXRpYWxpemF0aW9uIHVDb2RlJ3MKLSAqICAgICAgICAgICAgICAgICAgIEFsaXZlIGdldHMgaGFuZGxlZCBieSBpd2xfaW5pdF9hbGl2ZV9zdGFydCgpKS4KLSAqLwotc3RhdGljIHZvaWQgaXdsNDk2NV9hbGl2ZV9zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJSdW50aW1lIEFsaXZlIHJlY2VpdmVkLlxuIik7Ci0KLQlpZiAocHJpdi0+Y2FyZF9hbGl2ZS5pc192YWxpZCAhPSBVQ09ERV9WQUxJRF9PSykgewotCQkvKiBXZSBoYWQgYW4gZXJyb3IgYnJpbmdpbmcgdXAgdGhlIGhhcmR3YXJlLCBzbyB0YWtlIGl0Ci0JCSAqIGFsbCB0aGUgd2F5IGJhY2sgZG93biBzbyB3ZSBjYW4gdHJ5IGFnYWluICovCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsICJBbGl2ZSBmYWlsZWQuXG4iKTsKLQkJZ290byByZXN0YXJ0OwotCX0KLQotCS8qIEluaXRpYWxpemUgdUNvZGUgaGFzIGxvYWRlZCBSdW50aW1lIHVDb2RlIC4uLiB2ZXJpZnkgaW5zdCBpbWFnZS4KLQkgKiBUaGlzIGlzIGEgcGFyYW5vaWQgY2hlY2ssIGJlY2F1c2Ugd2Ugd291bGQgbm90IGhhdmUgZ290dGVuIHRoZQotCSAqICJydW50aW1lIiBhbGl2ZSBpZiBjb2RlIHdlcmVuJ3QgcHJvcGVybHkgbG9hZGVkLiAgKi8KLQlpZiAoaXdsNDk2NV92ZXJpZnlfdWNvZGUocHJpdikpIHsKLQkJLyogUnVudGltZSBpbnN0cnVjdGlvbiBsb2FkIHdhcyBiYWQ7Ci0JCSAqIHRha2UgaXQgYWxsIHRoZSB3YXkgYmFjayBkb3duIHNvIHdlIGNhbiB0cnkgYWdhaW4gKi8KLQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkJhZCBydW50aW1lIHVDb2RlIGxvYWQuXG4iKTsKLQkJZ290byByZXN0YXJ0OwotCX0KLQotCXJldCA9IGl3bDQ5NjVfYWxpdmVfbm90aWZ5KHByaXYpOwotCWlmIChyZXQpIHsKLQkJSVdMX1dBUk4ocHJpdiwKLQkJCSJDb3VsZCBub3QgY29tcGxldGUgQUxJVkUgdHJhbnNpdGlvbiBbbnRmXTogJWRcbiIsIHJldCk7Ci0JCWdvdG8gcmVzdGFydDsKLQl9Ci0KLQotCS8qIEFmdGVyIHRoZSBBTElWRSByZXNwb25zZSwgd2UgY2FuIHNlbmQgaG9zdCBjb21tYW5kcyB0byB0aGUgdUNvZGUgKi8KLQlzZXRfYml0KFNUQVRVU19BTElWRSwgJnByaXYtPnN0YXR1cyk7Ci0KLQkvKiBFbmFibGUgd2F0Y2hkb2cgdG8gbW9uaXRvciB0aGUgZHJpdmVyIHR4IHF1ZXVlcyAqLwotCWl3bF9sZWdhY3lfc2V0dXBfd2F0Y2hkb2cocHJpdik7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpCi0JCXJldHVybjsKLQotCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhwcml2LT5odyk7Ci0KLQlwcml2LT5hY3RpdmVfcmF0ZSA9IElXTF9SQVRFU19NQVNLOwotCi0JaWYgKGl3bF9sZWdhY3lfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgewotCQlzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqYWN0aXZlX3J4b24gPQotCQkJCShzdHJ1Y3QgaXdsX2xlZ2FjeV9yeG9uX2NtZCAqKSZjdHgtPmFjdGl2ZTsKLQkJLyogYXBwbHkgYW55IGNoYW5nZXMgaW4gc3RhZ2luZyAqLwotCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSzsKLQkJYWN0aXZlX3J4b24tPmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICp0bXA7Ci0JCS8qIEluaXRpYWxpemUgb3VyIHJ4X2NvbmZpZyBkYXRhICovCi0JCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgdG1wKQotCQkJaXdsX2xlZ2FjeV9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHByaXYsIHRtcCk7Ci0KLQkJaWYgKHByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbikKLQkJCXByaXYtPmNmZy0+b3BzLT5oY21kLT5zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCX0KLQotCS8qIENvbmZpZ3VyZSBibHVldG9vdGggY29leGlzdGVuY2UgaWYgZW5hYmxlZCAqLwotCWl3bF9sZWdhY3lfc2VuZF9idF9jb25maWcocHJpdik7Ci0KLQlpd2w0OTY1X3Jlc2V0X3J1bl90aW1lX2NhbGliKHByaXYpOwotCi0Jc2V0X2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpOwotCi0JLyogQ29uZmlndXJlIHRoZSBhZGFwdGVyIGZvciB1bmFzc29jaWF0ZWQgb3BlcmF0aW9uICovCi0JaXdsX2xlZ2FjeV9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCi0JLyogQXQgdGhpcyBwb2ludCwgdGhlIE5JQyBpcyBpbml0aWFsaXplZCBhbmQgb3BlcmF0aW9uYWwgKi8KLQlpd2w0OTY1X3JmX2tpbGxfY3RfY29uZmlnKHByaXYpOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIkFMSVZFIHByb2Nlc3NpbmcgY29tcGxldGUuXG4iKTsKLQl3YWtlX3VwKCZwcml2LT53YWl0X2NvbW1hbmRfcXVldWUpOwotCi0JaXdsX2xlZ2FjeV9wb3dlcl91cGRhdGVfbW9kZShwcml2LCB0cnVlKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVXBkYXRlZCBwb3dlciBtb2RlXG4iKTsKLQotCXJldHVybjsKLQotIHJlc3RhcnQ6Ci0JcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5yZXN0YXJ0KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9jYW5jZWxfZGVmZXJyZWRfd29yayhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCi1zdGF0aWMgdm9pZCBfX2l3bDQ5NjVfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgZXhpdF9wZW5kaW5nOwotCi0JSVdMX0RFQlVHX0lORk8ocHJpdiwgRFJWX05BTUUgIiBpcyBnb2luZyBkb3duXG4iKTsKLQotCWl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOwotCi0JZXhpdF9wZW5kaW5nID0gdGVzdF9hbmRfc2V0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIFN0b3AgVFggcXVldWVzIHdhdGNoZG9nLiBXZSBuZWVkIHRvIGhhdmUgU1RBVFVTX0VYSVRfUEVORElORyBiaXQgc2V0Ci0JICogdG8gcHJldmVudCByZWFybSB0aW1lciAqLwotCWRlbF90aW1lcl9zeW5jKCZwcml2LT53YXRjaGRvZyk7Ci0KLQlpd2xfbGVnYWN5X2NsZWFyX3Vjb2RlX3N0YXRpb25zKHByaXYsIE5VTEwpOwotCWl3bF9sZWdhY3lfZGVhbGxvY19iY2FzdF9zdGF0aW9ucyhwcml2KTsKLQlpd2xfbGVnYWN5X2NsZWFyX2RyaXZlcl9zdGF0aW9ucyhwcml2KTsKLQotCS8qIFVuYmxvY2sgYW55IHdhaXRpbmcgY2FsbHMgKi8KLQl3YWtlX3VwX2FsbCgmcHJpdi0+d2FpdF9jb21tYW5kX3F1ZXVlKTsKLQotCS8qIFdpcGUgb3V0IHRoZSBFWElUX1BFTkRJTkcgc3RhdHVzIGJpdCBpZiB3ZSBhcmUgbm90IGFjdHVhbGx5Ci0JICogZXhpdGluZyB0aGUgbW9kdWxlICovCi0JaWYgKCFleGl0X3BlbmRpbmcpCi0JCWNsZWFyX2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIHN0b3AgYW5kIHJlc2V0IHRoZSBvbi1ib2FyZCBwcm9jZXNzb3IgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfUkVTRVQsIENTUl9SRVNFVF9SRUdfRkxBR19ORVZPX1JFU0VUKTsKLQotCS8qIHRlbGwgdGhlIGRldmljZSB0byBzdG9wIHNlbmRpbmcgaW50ZXJydXB0cyAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5sb2NrLCBmbGFncyk7Ci0JaXdsX2xlZ2FjeV9kaXNhYmxlX2ludGVycnVwdHMocHJpdik7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bDQ5NjVfc3luY2hyb25pemVfaXJxKHByaXYpOwotCi0JaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQpCi0JCWllZWU4MDIxMV9zdG9wX3F1ZXVlcyhwcml2LT5odyk7Ci0KLQkvKiBJZiB3ZSBoYXZlIG5vdCBwcmV2aW91c2x5IGNhbGxlZCBpd2xfaW5pdCgpIHRoZW4KLQkgKiBjbGVhciBhbGwgYml0cyBidXQgdGhlIFJGIEtpbGwgYml0IGFuZCByZXR1cm4gKi8KLQlpZiAoIWl3bF9sZWdhY3lfaXNfaW5pdChwcml2KSkgewotCQlwcml2LT5zdGF0dXMgPSB0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykgPDwKLQkJCQkJU1RBVFVTX1JGX0tJTExfSFcgfAotCQkJICAgICAgIHRlc3RfYml0KFNUQVRVU19HRU9fQ09ORklHVVJFRCwgJnByaXYtPnN0YXR1cykgPDwKLQkJCQkJU1RBVFVTX0dFT19DT05GSUdVUkVEIHwKLQkJCSAgICAgICB0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCQlTVEFUVVNfRVhJVF9QRU5ESU5HOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JLyogLi4ub3RoZXJ3aXNlIGNsZWFyIG91dCBhbGwgdGhlIHN0YXR1cyBiaXRzIGJ1dCB0aGUgUkYgS2lsbAotCSAqIGJpdCBhbmQgY29udGludWUgdGFraW5nIHRoZSBOSUMgZG93bi4gKi8KLQlwcml2LT5zdGF0dXMgJj0gdGVzdF9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJU1RBVFVTX1JGX0tJTExfSFcgfAotCQkJdGVzdF9iaXQoU1RBVFVTX0dFT19DT05GSUdVUkVELCAmcHJpdi0+c3RhdHVzKSA8PAotCQkJCVNUQVRVU19HRU9fQ09ORklHVVJFRCB8Ci0JCQl0ZXN0X2JpdChTVEFUVVNfRldfRVJST1IsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJU1RBVFVTX0ZXX0VSUk9SIHwKLQkJICAgICAgIHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpIDw8Ci0JCQkJU1RBVFVTX0VYSVRfUEVORElORzsKLQotCWl3bDQ5NjVfdHhxX2N0eF9zdG9wKHByaXYpOwotCWl3bDQ5NjVfcnhxX3N0b3AocHJpdik7Ci0KLQkvKiBQb3dlci1kb3duIGRldmljZSdzIGJ1c21hc3RlciBETUEgY2xvY2tzICovCi0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIEFQTUdfQ0xLX0RJU19SRUcsIEFQTUdfQ0xLX1ZBTF9ETUFfQ0xLX1JRVCk7Ci0JdWRlbGF5KDUpOwotCi0JLyogTWFrZSBzdXJlIChyZWR1bmRhbnQpIHdlJ3ZlIHJlbGVhc2VkIG91ciByZXF1ZXN0IHRvIHN0YXkgYXdha2UgKi8KLQlpd2xfbGVnYWN5X2NsZWFyX2JpdChwcml2LCBDU1JfR1BfQ05UUkwsCi0JCQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX01BQ19BQ0NFU1NfUkVRKTsKLQotCS8qIFN0b3AgdGhlIGRldmljZSwgYW5kIHB1dCBpdCBpbiBsb3cgcG93ZXIgc3RhdGUgKi8KLQlpd2xfbGVnYWN5X2FwbV9zdG9wKHByaXYpOwotCi0gZXhpdDoKLQltZW1zZXQoJnByaXYtPmNhcmRfYWxpdmUsIDAsIHNpemVvZihzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3ApKTsKLQotCWRldl9rZnJlZV9za2IocHJpdi0+YmVhY29uX3NrYik7Ci0JcHJpdi0+YmVhY29uX3NrYiA9IE5VTEw7Ci0KLQkvKiBjbGVhciBvdXQgYW55IGZyZWUgZnJhbWVzICovCi0JaXdsNDk2NV9jbGVhcl9mcmVlX2ZyYW1lcyhwcml2KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9kb3duKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JX19pd2w0OTY1X2Rvd24ocHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlpd2w0OTY1X2NhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOwotfQotCi0jZGVmaW5lIEhXX1JFQURZX1RJTUVPVVQgKDUwKQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2V0X2h3X3JlYWR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWl3bF9sZWdhY3lfc2V0X2JpdChwcml2LCBDU1JfSFdfSUZfQ09ORklHX1JFRywKLQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19SRUFEWSk7Ci0KLQkvKiBTZWUgaWYgd2UgZ290IGl0ICovCi0JcmV0ID0gaXdsX3BvbGxfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJCUNTUl9IV19JRl9DT05GSUdfUkVHX0JJVF9OSUNfUkVBRFksCi0JCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19SRUFEWSwKLQkJCQlIV19SRUFEWV9USU1FT1VUKTsKLQlpZiAocmV0ICE9IC1FVElNRURPVVQpCi0JCXByaXYtPmh3X3JlYWR5ID0gdHJ1ZTsKLQllbHNlCi0JCXByaXYtPmh3X3JlYWR5ID0gZmFsc2U7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiaGFyZHdhcmUgJXNcbiIsCi0JCSAgICAgIChwcml2LT5od19yZWFkeSA9PSAxKSA/ICJyZWFkeSIgOiAibm90IHJlYWR5Iik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2w0OTY1X3ByZXBhcmVfY2FyZF9odyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiaXdsNDk2NV9wcmVwYXJlX2NhcmRfaHcgZW50ZXJcbiIpOwotCi0JcmV0ID0gaXdsNDk2NV9zZXRfaHdfcmVhZHkocHJpdik7Ci0JaWYgKHByaXYtPmh3X3JlYWR5KQotCQlyZXR1cm4gcmV0OwotCi0JLyogSWYgSFcgaXMgbm90IHJlYWR5LCBwcmVwYXJlIHRoZSBjb25kaXRpb25zIHRvIGNoZWNrIGFnYWluICovCi0JaXdsX2xlZ2FjeV9zZXRfYml0KHByaXYsIENTUl9IV19JRl9DT05GSUdfUkVHLAotCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfUFJFUEFSRSk7Ci0KLQlyZXQgPSBpd2xfcG9sbF9iaXQocHJpdiwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCi0JCQl+Q1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX05JQ19QUkVQQVJFX0RPTkUsCi0JCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfTklDX1BSRVBBUkVfRE9ORSwgMTUwMDAwKTsKLQotCS8qIEhXIHNob3VsZCBiZSByZWFkeSBieSBub3csIGNoZWNrIGFnYWluLiAqLwotCWlmIChyZXQgIT0gLUVUSU1FRE9VVCkKLQkJaXdsNDk2NV9zZXRfaHdfcmVhZHkocHJpdik7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIE1BWF9IV19SRVNUQVJUUyA1Ci0KLXN0YXRpYyBpbnQgX19pd2w0OTY1X3VwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCWludCBpOwotCWludCByZXQ7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpIHsKLQkJSVdMX1dBUk4ocHJpdiwgIkV4aXQgcGVuZGluZzsgd2lsbCBub3QgYnJpbmcgdGhlIE5JQyB1cFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWlmICghcHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyIHx8ICFwcml2LT51Y29kZV9kYXRhLnZfYWRkcikgewotCQlJV0xfRVJSKHByaXYsICJ1Y29kZSBub3QgYXZhaWxhYmxlIGZvciBkZXZpY2UgYnJpbmd1cFxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCXJldCA9IGl3bDQ5NjVfYWxsb2NfYmNhc3Rfc3RhdGlvbihwcml2LCBjdHgpOwotCQlpZiAocmV0KSB7Ci0JCQlpd2xfbGVnYWN5X2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMocHJpdik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JaXdsNDk2NV9wcmVwYXJlX2NhcmRfaHcocHJpdik7Ci0KLQlpZiAoIXByaXYtPmh3X3JlYWR5KSB7Ci0JCUlXTF9XQVJOKHByaXYsICJFeGl0IEhXIG5vdCByZWFkeVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qIElmIHBsYXRmb3JtJ3MgUkZfS0lMTCBzd2l0Y2ggaXMgTk9UIHNldCB0byBLSUxMICovCi0JaWYgKGl3bF9yZWFkMzIocHJpdiwKLQkJQ1NSX0dQX0NOVFJMKSAmIENTUl9HUF9DTlRSTF9SRUdfRkxBR19IV19SRl9LSUxMX1NXKQotCQljbGVhcl9iaXQoU1RBVFVTX1JGX0tJTExfSFcsICZwcml2LT5zdGF0dXMpOwotCWVsc2UKLQkJc2V0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0KLQlpZiAoaXdsX2xlZ2FjeV9pc19yZmtpbGwocHJpdikpIHsKLQkJd2lwaHlfcmZraWxsX3NldF9od19zdGF0ZShwcml2LT5ody0+d2lwaHksIHRydWUpOwotCi0JCWl3bF9sZWdhY3lfZW5hYmxlX2ludGVycnVwdHMocHJpdik7Ci0JCUlXTF9XQVJOKHByaXYsICJSYWRpbyBkaXNhYmxlZCBieSBIVyBSRiBLaWxsIHN3aXRjaFxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWl3bF93cml0ZTMyKHByaXYsIENTUl9JTlQsIDB4RkZGRkZGRkYpOwotCi0JLyogbXVzdCBiZSBpbml0aWFsaXNlZCBiZWZvcmUgaXdsX2h3X25pY19pbml0ICovCi0JcHJpdi0+Y21kX3F1ZXVlID0gSVdMX0RFRkFVTFRfQ01EX1FVRVVFX05VTTsKLQotCXJldCA9IGl3bDQ5NjVfaHdfbmljX2luaXQocHJpdik7Ci0JaWYgKHJldCkgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdCBuaWNcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qIG1ha2Ugc3VyZSByZmtpbGwgaGFuZHNoYWtlIGJpdHMgYXJlIGNsZWFyZWQgKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsIENTUl9VQ09ERV9TV19CSVRfUkZLSUxMKTsKLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfVUNPREVfRFJWX0dQMV9DTFIsCi0JCSAgICBDU1JfVUNPREVfRFJWX0dQMV9CSVRfQ01EX0JMT0NLRUQpOwotCi0JLyogY2xlYXIgKGFnYWluKSwgdGhlbiBlbmFibGUgaG9zdCBpbnRlcnJ1cHRzICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX0lOVCwgMHhGRkZGRkZGRik7Ci0JaXdsX2xlZ2FjeV9lbmFibGVfaW50ZXJydXB0cyhwcml2KTsKLQotCS8qIHJlYWxseSBtYWtlIHN1cmUgcmZraWxsIGhhbmRzaGFrZSBiaXRzIGFyZSBjbGVhcmVkICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7Ci0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1VDT0RFX0RSVl9HUDFfQ0xSLCBDU1JfVUNPREVfU1dfQklUX1JGS0lMTCk7Ci0KLQkvKiBDb3B5IG9yaWdpbmFsIHVjb2RlIGRhdGEgaW1hZ2UgZnJvbSBkaXNrIGludG8gYmFja3VwIGNhY2hlLgotCSAqIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIG9uLWJvYXJkIHByb2Nlc3NvcidzCi0JICogZGF0YSBTUkFNIGZvciBhIGNsZWFuIHN0YXJ0IHdoZW4gdGhlIHJ1bnRpbWUgcHJvZ3JhbSBmaXJzdCBsb2Fkcy4gKi8KLQltZW1jcHkocHJpdi0+dWNvZGVfZGF0YV9iYWNrdXAudl9hZGRyLCBwcml2LT51Y29kZV9kYXRhLnZfYWRkciwKLQkgICAgICAgcHJpdi0+dWNvZGVfZGF0YS5sZW4pOwotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IV19SRVNUQVJUUzsgaSsrKSB7Ci0KLQkJLyogbG9hZCBib290c3RyYXAgc3RhdGUgbWFjaGluZSwKLQkJICogbG9hZCBib290c3RyYXAgcHJvZ3JhbSBpbnRvIHByb2Nlc3NvcidzIG1lbW9yeSwKLQkJICogcHJlcGFyZSB0byBsb2FkIHRoZSAiaW5pdGlhbGl6ZSIgdUNvZGUgKi8KLQkJcmV0ID0gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+bG9hZF91Y29kZShwcml2KTsKLQotCQlpZiAocmV0KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gc2V0IHVwIGJvb3RzdHJhcCB1Q29kZTogJWRcbiIsCi0JCQkJcmV0KTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJLyogc3RhcnQgY2FyZDsgImluaXRpYWxpemUiIHdpbGwgbG9hZCBydW50aW1lIHVjb2RlICovCi0JCWl3bDQ5NjVfbmljX3N0YXJ0KHByaXYpOwotCi0JCUlXTF9ERUJVR19JTkZPKHByaXYsIERSVl9OQU1FICIgaXMgY29taW5nIHVwXG4iKTsKLQotCQlyZXR1cm4gMDsKLQl9Ci0KLQlzZXRfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpOwotCV9faXdsNDk2NV9kb3duKHByaXYpOwotCWNsZWFyX2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKLQotCS8qIHRyaWVkIHRvIHJlc3RhcnQgYW5kIGNvbmZpZyB0aGUgZGV2aWNlIGZvciBhcyBsb25nIGFzIG91cgotCSAqIHBhdGllbmNlIGNvdWxkIHdpdGhzdGFuZCAqLwotCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBpbml0aWFsaXplIGRldmljZSBhZnRlciAlZCBhdHRlbXB0cy5cbiIsIGkpOwotCXJldHVybiAtRUlPOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIFdvcmtxdWV1ZSBjYWxsYmFja3MKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfYmdfaW5pdF9hbGl2ZV9zdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0KLQkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgaW5pdF9hbGl2ZV9zdGFydC53b3JrKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCWdvdG8gb3V0OwotCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+aW5pdF9hbGl2ZV9zdGFydChwcml2KTsKLW91dDoKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLX0KLQotc3RhdGljIHZvaWQgaXdsNDk2NV9iZ19hbGl2ZV9zdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0KLQkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgYWxpdmVfc3RhcnQud29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKQotCQlnb3RvIG91dDsKLQotCWl3bDQ5NjVfYWxpdmVfc3RhcnQocHJpdik7Ci1vdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfYmdfcnVuX3RpbWVfY2FsaWJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpd2xfcHJpdiwKLQkJCXJ1bl90aW1lX2NhbGliX3dvcmspOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpIHx8Ci0JICAgIHRlc3RfYml0KFNUQVRVU19TQ0FOTklORywgJnByaXYtPnN0YXR1cykpIHsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JCXJldHVybjsKLQl9Ci0KLQlpZiAocHJpdi0+c3RhcnRfY2FsaWIpIHsKLQkJaXdsNDk2NV9jaGFpbl9ub2lzZV9jYWxpYnJhdGlvbihwcml2LAotCQkJCSh2b2lkICopJnByaXYtPl80OTY1LnN0YXRpc3RpY3MpOwotCQlpd2w0OTY1X3NlbnNpdGl2aXR5X2NhbGlicmF0aW9uKHByaXYsCi0JCQkJKHZvaWQgKikmcHJpdi0+XzQ5NjUuc3RhdGlzdGljcyk7Ci0JfQotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfYmdfcmVzdGFydChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgcmVzdGFydCk7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCXJldHVybjsKLQotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoU1RBVFVTX0ZXX0VSUk9SLCAmcHJpdi0+c3RhdHVzKSkgewotCQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCi0JCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQkJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpCi0JCQljdHgtPnZpZiA9IE5VTEw7Ci0JCXByaXYtPmlzX29wZW4gPSAwOwotCi0JCV9faXdsNDk2NV9kb3duKHByaXYpOwotCi0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQlpd2w0OTY1X2NhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOwotCQlpZWVlODAyMTFfcmVzdGFydF9odyhwcml2LT5odyk7Ci0JfSBlbHNlIHsKLQkJaXdsNDk2NV9kb3duKHByaXYpOwotCi0JCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQkJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zdGF0dXMpKSB7Ci0JCQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCV9faXdsNDk2NV91cChwcml2KTsKLQkJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2JnX3J4X3JlcGxlbmlzaChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0KLQkgICAgY29udGFpbmVyX29mKGRhdGEsIHN0cnVjdCBpd2xfcHJpdiwgcnhfcmVwbGVuaXNoKTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bDQ5NjVfcnhfcmVwbGVuaXNoKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgVUNPREVfUkVBRFlfVElNRU9VVAkoNCAqIEhaKQotCi0vKgotICogTm90IGEgbWFjODAyMTEgZW50cnkgcG9pbnQgZnVuY3Rpb24sIGJ1dCBpdCBmaXRzIGluIHdpdGggYWxsIHRoZQotICogb3RoZXIgbWFjODAyMTEgZnVuY3Rpb25zIGdyb3VwZWQgaGVyZS4KLSAqLwotc3RhdGljIGludCBpd2w0OTY1X21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICB1MzIgbWF4X3Byb2JlX2xlbmd0aCkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gIml3bC00OTY1LXJzIjsKLQotCS8qIFRlbGwgbWFjODAyMTEgb3VyIGNoYXJhY3RlcmlzdGljcyAqLwotCWh3LT5mbGFncyA9IElFRUU4MDIxMV9IV19TSUdOQUxfREJNIHwKLQkJICAgIElFRUU4MDIxMV9IV19BTVBEVV9BR0dSRUdBVElPTiB8Ci0JCSAgICBJRUVFODAyMTFfSFdfTkVFRF9EVElNX1BFUklPRCB8Ci0JCSAgICBJRUVFODAyMTFfSFdfU1BFQ1RSVU1fTUdNVCB8Ci0JCSAgICBJRUVFODAyMTFfSFdfUkVQT1JUU19UWF9BQ0tfU1RBVFVTOwotCi0JaWYgKHByaXYtPmNmZy0+c2t1ICYgSVdMX1NLVV9OKQotCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfU01QUyB8Ci0JCQkgICAgIElFRUU4MDIxMV9IV19TVVBQT1JUU19TVEFUSUNfU01QUzsKLQotCWh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfc3RhdGlvbl9wcml2KTsKLQlody0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgaXdsX3ZpZl9wcml2KTsKLQotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IGN0eC0+aW50ZXJmYWNlX21vZGVzOwotCQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7Ci0JfQotCi0JaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZIHwKLQkJCSAgICBXSVBIWV9GTEFHX0RJU0FCTEVfQkVBQ09OX0hJTlRTOwotCi0JLyoKLQkgKiBGb3Igbm93LCBkaXNhYmxlIFBTIGJ5IGRlZmF1bHQgYmVjYXVzZSBpdCBhZmZlY3RzCi0JICogUlggcGVyZm9ybWFuY2Ugc2lnbmlmaWNhbnRseS4KLQkgKi8KLQlody0+d2lwaHktPmZsYWdzICY9IH5XSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7Ci0KLQlody0+d2lwaHktPm1heF9zY2FuX3NzaWRzID0gUFJPQkVfT1BUSU9OX01BWDsKLQkvKiB3ZSBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgYW5kIGEgemVyby1sZW5ndGggU1NJRCBlbGVtZW50ICovCi0JaHctPndpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSBtYXhfcHJvYmVfbGVuZ3RoIC0gMjQgLSAyOwotCi0JLyogRGVmYXVsdCB2YWx1ZTsgNCBFRENBIFFPUyBwcmlvcml0aWVzICovCi0JaHctPnF1ZXVlcyA9IDQ7Ci0KLQlody0+bWF4X2xpc3Rlbl9pbnRlcnZhbCA9IElXTF9DT05OX01BWF9MSVNURU5fSU5URVJWQUw7Ci0KLQlpZiAocHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0ubl9jaGFubmVscykKLQkJcHJpdi0+aHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9Ci0JCQkmcHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07Ci0JaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fY2hhbm5lbHMpCi0JCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQotCQkJJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOwotCi0JaXdsX2xlZ2FjeV9sZWRzX2luaXQocHJpdik7Ci0KLQlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcocHJpdi0+aHcpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGh3IChlcnJvciAlZClcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotaW50IGl3bDQ5NjVfbWFjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCS8qIHdlIHNob3VsZCBiZSB2ZXJpZnlpbmcgdGhlIGRldmljZSBpcyByZWFkeSB0byBiZSBvcGVuZWQgKi8KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0JcmV0ID0gX19pd2w0OTY1X3VwKHByaXYpOwotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWlmIChpd2xfbGVnYWN5X2lzX3Jma2lsbChwcml2KSkKLQkJZ290byBvdXQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiU3RhcnQgVVAgd29yayBkb25lLlxuIik7Ci0KLQkvKiBXYWl0IGZvciBTVEFSVF9BTElWRSBmcm9tIFJ1biBUaW1lIHVjb2RlLiBPdGhlcndpc2UgY2FsbGJhY2tzIGZyb20KLQkgKiBtYWM4MDIxMSB3aWxsIG5vdCBiZSBydW4gc3VjY2Vzc2Z1bGx5LiAqLwotCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChwcml2LT53YWl0X2NvbW1hbmRfcXVldWUsCi0JCQl0ZXN0X2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpLAotCQkJVUNPREVfUkVBRFlfVElNRU9VVCk7Ci0JaWYgKCFyZXQpIHsKLQkJaWYgKCF0ZXN0X2JpdChTVEFUVVNfUkVBRFksICZwcml2LT5zdGF0dXMpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJTVEFSVF9BTElWRSB0aW1lb3V0IGFmdGVyICVkbXMuXG4iLAotCQkJCWppZmZpZXNfdG9fbXNlY3MoVUNPREVfUkVBRFlfVElNRU9VVCkpOwotCQkJcmV0dXJuIC1FVElNRURPVVQ7Ci0JCX0KLQl9Ci0KLQlpd2w0OTY1X2xlZF9lbmFibGUocHJpdik7Ci0KLW91dDoKLQlwcml2LT5pc19vcGVuID0gMTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQlyZXR1cm4gMDsKLX0KLQotdm9pZCBpd2w0OTY1X21hY19zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlpZiAoIXByaXYtPmlzX29wZW4pCi0JCXJldHVybjsKLQotCXByaXYtPmlzX29wZW4gPSAwOwotCi0JaXdsNDk2NV9kb3duKHByaXYpOwotCi0JZmx1c2hfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7Ci0KLQkvKiBVc2VyIHNwYWNlIHNvZnR3YXJlIG1heSBleHBlY3QgZ2V0dGluZyByZmtpbGwgY2hhbmdlcwotCSAqIGV2ZW4gaWYgaW50ZXJmYWNlIGlzIGRvd24gKi8KLQlpd2xfd3JpdGUzMihwcml2LCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQlpd2xfbGVnYWN5X2VuYWJsZV9yZmtpbGxfaW50KHByaXYpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLXZvaWQgaXdsNDk2NV9tYWNfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0KLQlJV0xfREVCVUdfTUFDRFVNUChwcml2LCAiZW50ZXJcbiIpOwotCi0JSVdMX0RFQlVHX1RYKHByaXYsICJkZXYtPnhtaXQoJWQgYnl0ZXMpIGF0IHJhdGUgMHglMDJ4XG4iLCBza2ItPmxlbiwKLQkJICAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIElFRUU4MDIxMV9TS0JfQ0Ioc2tiKSktPmJpdHJhdGUpOwotCi0JaWYgKGl3bDQ5NjVfdHhfc2tiKHByaXYsIHNrYikpCi0JCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0KLQlJV0xfREVCVUdfTUFDRFVNUChwcml2LCAibGVhdmVcbiIpOwotfQotCi12b2lkIGl3bDQ5NjVfbWFjX3VwZGF0ZV90a2lwX2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKLQkJCQl1MzIgaXYzMiwgdTE2ICpwaGFzZTFrZXkpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWl3bDQ5NjVfdXBkYXRlX3RraXBfa2V5KHByaXYsIHZpZl9wcml2LT5jdHgsIGtleWNvbmYsIHN0YSwKLQkJCSAgICBpdjMyLCBwaGFzZTFrZXkpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci19Ci0KLWludCBpd2w0OTY1X21hY19zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNldF9rZXlfY21kIGNtZCwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXkpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHZpZl9wcml2LT5jdHg7Ci0JaW50IHJldDsKLQl1OCBzdGFfaWQ7Ci0JYm9vbCBpc19kZWZhdWx0X3dlcF9rZXkgPSBmYWxzZTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JaWYgKHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+c3dfY3J5cHRvKSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmUgLSBod2NyeXB0byBkaXNhYmxlZFxuIik7Ci0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQl9Ci0KLQlzdGFfaWQgPSBpd2xfbGVnYWN5X3N0YV9pZF9vcl9icm9hZGNhc3QocHJpdiwgdmlmX3ByaXYtPmN0eCwgc3RhKTsKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pCi0JCXJldHVybiAtRUlOVkFMOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+bXV0ZXgpOwotCWl3bF9sZWdhY3lfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAxMDApOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgZ2V0dGluZyBXRVAgZ3JvdXAga2V5IGFuZCB3ZSBkaWRuJ3QgcmVjZWl2ZSBhbnkga2V5IG1hcHBpbmcKLQkgKiBzbyBmYXIsIHdlIGFyZSBpbiBsZWdhY3kgd2VwIG1vZGUgKGdyb3VwIGtleSBvbmx5KSwgb3RoZXJ3aXNlIHdlIGFyZQotCSAqIGluIDFYIG1vZGUuCi0JICogSW4gbGVnYWN5IHdlcCBtb2RlLCB3ZSB1c2UgYW5vdGhlciBob3N0IGNvbW1hbmQgdG8gdGhlIHVDb2RlLgotCSAqLwotCWlmICgoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKLQkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgJiYKLQkgICAgIXN0YSkgewotCQlpZiAoY21kID09IFNFVF9LRVkpCi0JCQlpc19kZWZhdWx0X3dlcF9rZXkgPSAhY3R4LT5rZXlfbWFwcGluZ19rZXlzOwotCQllbHNlCi0JCQlpc19kZWZhdWx0X3dlcF9rZXkgPQotCQkJCQkoa2V5LT5od19rZXlfaWR4ID09IEhXX0tFWV9ERUZBVUxUKTsKLQl9Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU0VUX0tFWToKLQkJaWYgKGlzX2RlZmF1bHRfd2VwX2tleSkKLQkJCXJldCA9IGl3bDQ5NjVfc2V0X2RlZmF1bHRfd2VwX2tleShwcml2LAotCQkJCQkJCXZpZl9wcml2LT5jdHgsIGtleSk7Ci0JCWVsc2UKLQkJCXJldCA9IGl3bDQ5NjVfc2V0X2R5bmFtaWNfa2V5KHByaXYsIHZpZl9wcml2LT5jdHgsCi0JCQkJCQkgIGtleSwgc3RhX2lkKTsKLQotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVuYWJsZSBod2NyeXB0byBrZXlcbiIpOwotCQlicmVhazsKLQljYXNlIERJU0FCTEVfS0VZOgotCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KQotCQkJcmV0ID0gaXdsNDk2NV9yZW1vdmVfZGVmYXVsdF93ZXBfa2V5KHByaXYsIGN0eCwga2V5KTsKLQkJZWxzZQotCQkJcmV0ID0gaXdsNDk2NV9yZW1vdmVfZHluYW1pY19rZXkocHJpdiwgY3R4LAotCQkJCQkJCWtleSwgc3RhX2lkKTsKLQotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImRpc2FibGUgaHdjcnlwdG8ga2V5XG4iKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0ID0gLUVJTlZBTDsKLQl9Ci0KLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBpd2w0OTY1X21hY19hbXBkdV9hY3Rpb24oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgICBlbnVtIGllZWU4MDIxMV9hbXBkdV9tbG1lX2FjdGlvbiBhY3Rpb24sCi0JCQkgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTE2ICpzc24sCi0JCQkgICAgdTggYnVmX3NpemUpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQlJV0xfREVCVUdfSFQocHJpdiwgIkEtTVBEVSBhY3Rpb24gb24gYWRkciAlcE0gdGlkICVkXG4iLAotCQkgICAgIHN0YS0+YWRkciwgdGlkKTsKLQotCWlmICghKHByaXYtPmNmZy0+c2t1ICYgSVdMX1NLVV9OKSkKLQkJcmV0dXJuIC1FQUNDRVM7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlzd2l0Y2ggKGFjdGlvbikgewotCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUQVJUOgotCQlJV0xfREVCVUdfSFQocHJpdiwgInN0YXJ0IFJ4XG4iKTsKLQkJcmV0ID0gaXdsNDk2NV9zdGFfcnhfYWdnX3N0YXJ0KHByaXYsIHN0YSwgdGlkLCAqc3NuKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJzdG9wIFJ4XG4iKTsKLQkJcmV0ID0gaXdsNDk2NV9zdGFfcnhfYWdnX3N0b3AocHJpdiwgc3RhLCB0aWQpOwotCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCQlyZXQgPSAwOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJzdGFydCBUeFxuIik7Ci0JCXJldCA9IGl3bDQ5NjVfdHhfYWdnX3N0YXJ0KHByaXYsIHZpZiwgc3RhLCB0aWQsIHNzbik7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1A6Ci0JCUlXTF9ERUJVR19IVChwcml2LCAic3RvcCBUeFxuIik7Ci0JCXJldCA9IGl3bDQ5NjVfdHhfYWdnX3N0b3AocHJpdiwgdmlmLCBzdGEsIHRpZCk7Ci0JCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSkKLQkJCXJldCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOgotCQlyZXQgPSAwOwotCQlicmVhazsKLQl9Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgaXdsNDk2NV9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKLQlib29sIGlzX2FwID0gdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0JaW50IHJldDsKLQl1OCBzdGFfaWQ7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicmVjZWl2ZWQgcmVxdWVzdCB0byBhZGQgc3RhdGlvbiAlcE1cbiIsCi0JCQlzdGEtPmFkZHIpOwotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicHJvY2VlZGluZyB0byBhZGQgc3RhdGlvbiAlcE1cbiIsCi0JCQlzdGEtPmFkZHIpOwotCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gSVdMX0lOVkFMSURfU1RBVElPTjsKLQotCWF0b21pY19zZXQoJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcywgMCk7Ci0KLQlyZXQgPSBpd2xfbGVnYWN5X2FkZF9zdGF0aW9uX2NvbW1vbihwcml2LCB2aWZfcHJpdi0+Y3R4LCBzdGEtPmFkZHIsCi0JCQkJICAgICBpc19hcCwgc3RhLCAmc3RhX2lkKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE0gKCVkKVxuIiwKLQkJCXN0YS0+YWRkciwgcmV0KTsKLQkJLyogU2hvdWxkIHdlIHJldHVybiBzdWNjZXNzIGlmIHJldHVybiBjb2RlIGlzIEVFWElTVCA/ICovCi0JCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXN0YV9wcml2LT5jb21tb24uc3RhX2lkID0gc3RhX2lkOwotCi0JLyogSW5pdGlhbGl6ZSByYXRlIHNjYWxpbmcgKi8KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW5pdGlhbGl6aW5nIHJhdGUgc2NhbGluZyBmb3Igc3RhdGlvbiAlcE1cbiIsCi0JCSAgICAgICBzdGEtPmFkZHIpOwotCWl3bDQ5NjVfcnNfcmF0ZV9pbml0KHByaXYsIHN0YSwgc3RhX2lkKTsKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIGl3bDQ5NjVfbWFjX2NoYW5uZWxfc3dpdGNoKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9zd2l0Y2ggKmNoX3N3aXRjaCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQljb25zdCBzdHJ1Y3QgaXdsX2NoYW5uZWxfaW5mbyAqY2hfaW5mbzsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYgPSAmaHctPmNvbmY7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gY2hfc3dpdGNoLT5jaGFubmVsOwotCXN0cnVjdCBpd2xfaHRfY29uZmlnICpodF9jb25mID0gJnByaXYtPmN1cnJlbnRfaHRfY29uZmlnOwotCi0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQl1MTYgY2g7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKLQotCWlmIChpd2xfbGVnYWN5X2lzX3Jma2lsbChwcml2KSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cykpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCFpd2xfbGVnYWN5X2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCFwcml2LT5jZmctPm9wcy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gpCi0JCWdvdG8gb3V0OwotCi0JY2ggPSBjaGFubmVsLT5od192YWx1ZTsKLQlpZiAobGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCkgPT0gY2gpCi0JCWdvdG8gb3V0OwotCi0JY2hfaW5mbyA9IGl3bF9sZWdhY3lfZ2V0X2NoYW5uZWxfaW5mbyhwcml2LCBjaGFubmVsLT5iYW5kLCBjaCk7Ci0JaWYgKCFpd2xfbGVnYWN5X2lzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJpbnZhbGlkIGNoYW5uZWxcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxKCZwcml2LT5sb2NrKTsKLQotCXByaXYtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBjb25mLT5zbXBzX21vZGU7Ci0KLQkvKiBDb25maWd1cmUgSFQ0MCBjaGFubmVscyAqLwotCWN0eC0+aHQuZW5hYmxlZCA9IGNvbmZfaXNfaHQoY29uZik7Ci0JaWYgKGN0eC0+aHQuZW5hYmxlZCkgewotCQlpZiAoY29uZl9pc19odDQwX21pbnVzKGNvbmYpKSB7Ci0JCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9Ci0JCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7Ci0JCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjb25mX2lzX2h0NDBfcGx1cyhjb25mKSkgewotCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOwotCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9Ci0JCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKLQkJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKLQkJfQotCX0gZWxzZQotCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7Ci0KLQlpZiAoKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSAhPSBjaCkpCi0JCWN0eC0+c3RhZ2luZy5mbGFncyA9IDA7Ci0KLQlpd2xfbGVnYWN5X3NldF9yeG9uX2NoYW5uZWwocHJpdiwgY2hhbm5lbCwgY3R4KTsKLQlpd2xfbGVnYWN5X3NldF9yeG9uX2h0KHByaXYsIGh0X2NvbmYpOwotCWl3bF9sZWdhY3lfc2V0X2ZsYWdzX2Zvcl9iYW5kKHByaXYsIGN0eCwgY2hhbm5lbC0+YmFuZCwgY3R4LT52aWYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5sb2NrKTsKLQotCWl3bF9sZWdhY3lfc2V0X3JhdGUocHJpdik7Ci0JLyoKLQkgKiBhdCB0aGlzIHBvaW50LCBzdGFnaW5nX3J4b24gaGFzIHRoZQotCSAqIGNvbmZpZ3VyYXRpb24gZm9yIGNoYW5uZWwgc3dpdGNoCi0JICovCi0Jc2V0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0JcHJpdi0+c3dpdGNoX2NoYW5uZWwgPSBjcHVfdG9fbGUxNihjaCk7Ci0JaWYgKHByaXYtPmNmZy0+b3BzLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChwcml2LCBjaF9zd2l0Y2gpKSB7Ci0JCWNsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnN0YXR1cyk7Ci0JCXByaXYtPnN3aXRjaF9jaGFubmVsID0gMDsKLQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGZhbHNlKTsKLQl9Ci0KLW91dDoKLQltdXRleF91bmxvY2soJnByaXYtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotdm9pZCBpd2w0OTY1X2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAotCQkJICAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLAotCQkJICAgICB1NjQgbXVsdGljYXN0KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCV9fbGUzMiBmaWx0ZXJfb3IgPSAwLCBmaWx0ZXJfbmFuZCA9IDA7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotI2RlZmluZSBDSEsodGVzdCwgZmxhZykJZG8geyBcCi0JaWYgKCp0b3RhbF9mbGFncyAmICh0ZXN0KSkJCVwKLQkJZmlsdGVyX29yIHw9IChmbGFnKTsJCVwKLQllbHNlCQkJCQlcCi0JCWZpbHRlcl9uYW5kIHw9IChmbGFnKTsJCVwKLQl9IHdoaWxlICgwKQotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJFbnRlcjogY2hhbmdlZDogMHgleCwgdG90YWw6IDB4JXhcbiIsCi0JCQljaGFuZ2VkX2ZsYWdzLCAqdG90YWxfZmxhZ3MpOwotCi0JQ0hLKEZJRl9PVEhFUl9CU1MgfCBGSUZfUFJPTUlTQ19JTl9CU1MsIFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKLQkvKiBTZXR0aW5nIF9qdXN0XyBSWE9OX0ZJTFRFUl9DVEwySE9TVF9NU0sgY2F1c2VzIEZIIGVycm9ycyAqLwotCUNISyhGSUZfQ09OVFJPTCwgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIHwgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0spOwotCUNISyhGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQywgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0spOwotCi0jdW5kZWYgQ0hLCi0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5maWx0ZXJfbmFuZDsKLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBmaWx0ZXJfb3I7Ci0KLQkJLyoKLQkJICogTm90IGNvbW1pdHRpbmcgZGlyZWN0bHkgYmVjYXVzZSBoYXJkd2FyZSBjYW4gcGVyZm9ybSBhIHNjYW4sCi0JCSAqIGJ1dCB3ZSdsbCBldmVudHVhbGx5IGNvbW1pdCB0aGUgZmlsdGVyIGZsYWdzIGNoYW5nZSBhbnl3YXkuCi0JCSAqLwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotCi0JLyoKLQkgKiBSZWNlaXZpbmcgYWxsIG11bHRpY2FzdCBmcmFtZXMgaXMgYWx3YXlzIGVuYWJsZWQgYnkgdGhlCi0JICogZGVmYXVsdCBmbGFncyBzZXR1cCBpbiBpd2xfbGVnYWN5X2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcoKQotCSAqIHNpbmNlIHdlIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBwcm9ncmFtbWluZyBtdWx0aWNhc3QKLQkgKiBmaWx0ZXJzIGludG8gdGhlIGRldmljZS4KLQkgKi8KLQkqdG90YWxfZmxhZ3MgJj0gRklGX09USEVSX0JTUyB8IEZJRl9BTExNVUxUSSB8IEZJRl9QUk9NSVNDX0lOX0JTUyB8Ci0JCQlGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQyB8IEZJRl9DT05UUk9MOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBkcml2ZXIgc2V0dXAgYW5kIHRlYXJkb3duCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2JnX3R4cG93ZXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpd2xfcHJpdiwKLQkJCXR4cG93ZXJfd29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5tdXRleCk7Ci0KLQkvKiBJZiBhIHNjYW4gaGFwcGVuZWQgdG8gc3RhcnQgYmVmb3JlIHdlIGdvdCBoZXJlCi0JICogdGhlbiBqdXN0IHJldHVybjsgdGhlIHN0YXRpc3RpY3Mgbm90aWZpY2F0aW9uIHdpbGwKLQkgKiBraWNrIG9mZiBhbm90aGVyIHNjaGVkdWxlZCB3b3JrIHRvIGNvbXBlbnNhdGUgZm9yCi0JICogYW55IHRlbXBlcmF0dXJlIGRlbHRhIHdlIG1pc3NlZCBoZXJlLiAqLwotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfU0NBTk5JTkcsICZwcml2LT5zdGF0dXMpKQotCQlnb3RvIG91dDsKLQotCS8qIFJlZ2FyZGxlc3Mgb2YgaWYgd2UgYXJlIGFzc29jaWF0ZWQsIHdlIG11c3QgcmVjb25maWd1cmUgdGhlCi0JICogVFggcG93ZXIgc2luY2UgZnJhbWVzIGNhbiBiZSBzZW50IG9uIG5vbi1yYWRhciBjaGFubmVscyB3aGlsZQotCSAqIG5vdCBhc3NvY2lhdGVkICovCi0JcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2VuZF90eF9wb3dlcihwcml2KTsKLQotCS8qIFVwZGF0ZSBsYXN0X3RlbXBlcmF0dXJlIHRvIGtlZXAgaXNfY2FsaWJfbmVlZGVkIGZyb20gcnVubmluZwotCSAqIHdoZW4gaXQgaXNuJ3QgbmVlZGVkLi4uICovCi0JcHJpdi0+bGFzdF90ZW1wZXJhdHVyZSA9IHByaXYtPnRlbXBlcmF0dXJlOwotb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+bXV0ZXgpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3NldHVwX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXByaXYtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKERSVl9OQU1FKTsKLQotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPndhaXRfY29tbWFuZF9xdWV1ZSk7Ci0KLQlJTklUX1dPUksoJnByaXYtPnJlc3RhcnQsIGl3bDQ5NjVfYmdfcmVzdGFydCk7Ci0JSU5JVF9XT1JLKCZwcml2LT5yeF9yZXBsZW5pc2gsIGl3bDQ5NjVfYmdfcnhfcmVwbGVuaXNoKTsKLQlJTklUX1dPUksoJnByaXYtPnJ1bl90aW1lX2NhbGliX3dvcmssIGl3bDQ5NjVfYmdfcnVuX3RpbWVfY2FsaWJfd29yayk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmluaXRfYWxpdmVfc3RhcnQsIGl3bDQ5NjVfYmdfaW5pdF9hbGl2ZV9zdGFydCk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJnByaXYtPmFsaXZlX3N0YXJ0LCBpd2w0OTY1X2JnX2FsaXZlX3N0YXJ0KTsKLQotCWl3bF9sZWdhY3lfc2V0dXBfc2Nhbl9kZWZlcnJlZF93b3JrKHByaXYpOwotCi0JSU5JVF9XT1JLKCZwcml2LT50eHBvd2VyX3dvcmssIGl3bDQ5NjVfYmdfdHhwb3dlcl93b3JrKTsKLQotCWluaXRfdGltZXIoJnByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMpOwotCXByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMuZGF0YSA9ICh1bnNpZ25lZCBsb25nKXByaXY7Ci0JcHJpdi0+c3RhdGlzdGljc19wZXJpb2RpYy5mdW5jdGlvbiA9IGl3bDQ5NjVfYmdfc3RhdGlzdGljc19wZXJpb2RpYzsKLQotCWluaXRfdGltZXIoJnByaXYtPndhdGNoZG9nKTsKLQlwcml2LT53YXRjaGRvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcpcHJpdjsKLQlwcml2LT53YXRjaGRvZy5mdW5jdGlvbiA9IGl3bF9sZWdhY3lfYmdfd2F0Y2hkb2c7Ci0KLQl0YXNrbGV0X2luaXQoJnByaXYtPmlycV90YXNrbGV0LCAodm9pZCAoKikodW5zaWduZWQgbG9uZykpCi0JCWl3bDQ5NjVfaXJxX3Rhc2tsZXQsICh1bnNpZ25lZCBsb25nKXByaXYpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQljYW5jZWxfd29ya19zeW5jKCZwcml2LT50eHBvd2VyX3dvcmspOwotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+aW5pdF9hbGl2ZV9zdGFydCk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+YWxpdmVfc3RhcnQpOwotCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPnJ1bl90aW1lX2NhbGliX3dvcmspOwotCi0JaXdsX2xlZ2FjeV9jYW5jZWxfc2Nhbl9kZWZlcnJlZF93b3JrKHByaXYpOwotCi0JZGVsX3RpbWVyX3N5bmMoJnByaXYtPnN0YXRpc3RpY3NfcGVyaW9kaWMpOwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X2luaXRfaHdfcmF0ZXMoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlcykKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBJV0xfUkFURV9DT1VOVF9MRUdBQ1k7IGkrKykgewotCQlyYXRlc1tpXS5iaXRyYXRlID0gaXdsZWdhY3lfcmF0ZXNbaV0uaWVlZSAqIDU7Ci0JCXJhdGVzW2ldLmh3X3ZhbHVlID0gaTsgLyogUmF0ZSBzY2FsaW5nIHdpbGwgd29yayBvbiBpbmRleGVzICovCi0JCXJhdGVzW2ldLmh3X3ZhbHVlX3Nob3J0ID0gaTsKLQkJcmF0ZXNbaV0uZmxhZ3MgPSAwOwotCQlpZiAoKGkgPj0gSVdMX0ZJUlNUX0NDS19SQVRFKSAmJiAoaSA8PSBJV0xfTEFTVF9DQ0tfUkFURSkpIHsKLQkJCS8qCi0JCQkgKiBJZiBDQ0sgIT0gMU0gdGhlbiBzZXQgc2hvcnQgcHJlYW1ibGUgcmF0ZSBmbGFnLgotCQkJICovCi0JCQlyYXRlc1tpXS5mbGFncyB8PQotCQkJCShpd2xlZ2FjeV9yYXRlc1tpXS5wbGNwID09IElXTF9SQVRFXzFNX1BMQ1ApID8KLQkJCQkJMCA6IElFRUU4MDIxMV9SQVRFX1NIT1JUX1BSRUFNQkxFOwotCQl9Ci0JfQotfQotLyoKLSAqIEFjcXVpcmUgcHJpdi0+bG9jayBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICEKLSAqLwotdm9pZCBpd2w0OTY1X3NldF93cl9wdHJzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHR4cV9pZCwgdTMyIGluZGV4KQotewotCWl3bF9sZWdhY3lfd3JpdGVfZGlyZWN0MzIocHJpdiwgSEJVU19UQVJHX1dSUFRSLAotCQkJICAgICAoaW5kZXggJiAweGZmKSB8ICh0eHFfaWQgPDwgOCkpOwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBJV0w0OV9TQ0RfUVVFVUVfUkRQVFIodHhxX2lkKSwgaW5kZXgpOwotfQotCi12b2lkIGl3bDQ5NjVfdHhfcXVldWVfc2V0X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCXN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwKLQkJCQkJaW50IHR4X2ZpZm9faWQsIGludCBzY2RfcmV0cnkpCi17Ci0JaW50IHR4cV9pZCA9IHR4cS0+cS5pZDsKLQotCS8qIEZpbmQgb3V0IHdoZXRoZXIgdG8gYWN0aXZhdGUgVHggcXVldWUgKi8KLQlpbnQgYWN0aXZlID0gdGVzdF9iaXQodHhxX2lkLCAmcHJpdi0+dHhxX2N0eF9hY3RpdmVfbXNrKSA/IDEgOiAwOwotCi0JLyogU2V0IHVwIGFuZCBhY3RpdmF0ZSAqLwotCWl3bF9sZWdhY3lfd3JpdGVfcHJwaChwcml2LCBJV0w0OV9TQ0RfUVVFVUVfU1RBVFVTX0JJVFModHhxX2lkKSwKLQkJCSAoYWN0aXZlIDw8IElXTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfQUNUSVZFKSB8Ci0JCQkgKHR4X2ZpZm9faWQgPDwgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19UWEYpIHwKLQkJCSAoc2NkX3JldHJ5IDw8IElXTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfV1NMKSB8Ci0JCQkgKHNjZF9yZXRyeSA8PCBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ0spIHwKLQkJCSBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfTVNLKTsKLQotCXR4cS0+c2NoZWRfcmV0cnkgPSBzY2RfcmV0cnk7Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiJXMgJXMgUXVldWUgJWQgb24gQUMgJWRcbiIsCi0JCSAgICAgICBhY3RpdmUgPyAiQWN0aXZhdGUiIDogIkRlYWN0aXZhdGUiLAotCQkgICAgICAgc2NkX3JldHJ5ID8gIkJBIiA6ICJBQyIsIHR4cV9pZCwgdHhfZmlmb19pZCk7Ci19Ci0KLQotc3RhdGljIGludCBpd2w0OTY1X2luaXRfZHJ2KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0OwotCi0Jc3Bpbl9sb2NrX2luaXQoJnByaXYtPnN0YV9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+aGNtZF9sb2NrKTsKLQotCUlOSVRfTElTVF9IRUFEKCZwcml2LT5mcmVlX2ZyYW1lcyk7Ci0KLQltdXRleF9pbml0KCZwcml2LT5tdXRleCk7Ci0KLQlwcml2LT5pZWVlX2NoYW5uZWxzID0gTlVMTDsKLQlwcml2LT5pZWVlX3JhdGVzID0gTlVMTDsKLQlwcml2LT5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKLQotCXByaXYtPml3X21vZGUgPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOwotCXByaXYtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBJRUVFODAyMTFfU01QU19TVEFUSUM7Ci0JcHJpdi0+bWlzc2VkX2JlYWNvbl90aHJlc2hvbGQgPSBJV0xfTUlTU0VEX0JFQUNPTl9USFJFU0hPTERfREVGOwotCi0JLyogaW5pdGlhbGl6ZSBmb3JjZSByZXNldCAqLwotCXByaXYtPmZvcmNlX3Jlc2V0LnJlc2V0X2R1cmF0aW9uID0gSVdMX0RFTEFZX05FWFRfRk9SQ0VfRldfUkVMT0FEOwotCi0JLyogQ2hvb3NlIHdoaWNoIHJlY2VpdmVycy9hbnRlbm5hcyB0byB1c2UgKi8KLQlpZiAocHJpdi0+Y2ZnLT5vcHMtPmhjbWQtPnNldF9yeG9uX2NoYWluKQotCQlwcml2LT5jZmctPm9wcy0+aGNtZC0+c2V0X3J4b25fY2hhaW4ocHJpdiwKLQkJCQkJJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdKTsKLQotCWl3bF9sZWdhY3lfaW5pdF9zY2FuX3BhcmFtcyhwcml2KTsKLQotCXJldCA9IGl3bF9sZWdhY3lfaW5pdF9jaGFubmVsX21hcChwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgImluaXRpYWxpemluZyByZWd1bGF0b3J5IGZhaWxlZDogJWRcbiIsIHJldCk7Ci0JCWdvdG8gZXJyOwotCX0KLQotCXJldCA9IGl3bF9sZWdhY3lfaW5pdF9nZW9zKHByaXYpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiaW5pdGlhbGl6aW5nIGdlb3MgZmFpbGVkOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJfZnJlZV9jaGFubmVsX21hcDsKLQl9Ci0JaXdsNDk2NV9pbml0X2h3X3JhdGVzKHByaXYsIHByaXYtPmllZWVfcmF0ZXMpOwotCi0JcmV0dXJuIDA7Ci0KLWVycl9mcmVlX2NoYW5uZWxfbWFwOgotCWl3bF9sZWdhY3lfZnJlZV9jaGFubmVsX21hcChwcml2KTsKLWVycjoKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBpd2w0OTY1X3VuaW5pdF9kcnYoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCWl3bDQ5NjVfY2FsaWJfZnJlZV9yZXN1bHRzKHByaXYpOwotCWl3bF9sZWdhY3lfZnJlZV9nZW9zKHByaXYpOwotCWl3bF9sZWdhY3lfZnJlZV9jaGFubmVsX21hcChwcml2KTsKLQlrZnJlZShwcml2LT5zY2FuX2NtZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bDQ5NjVfaHdfZGV0ZWN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlwcml2LT5od19yZXYgPSBfaXdsX2xlZ2FjeV9yZWFkMzIocHJpdiwgQ1NSX0hXX1JFVik7Ci0JcHJpdi0+aHdfd2FfcmV2ID0gX2l3bF9sZWdhY3lfcmVhZDMyKHByaXYsIENTUl9IV19SRVZfV0FfUkVHKTsKLQlwcml2LT5yZXZfaWQgPSBwcml2LT5wY2lfZGV2LT5yZXZpc2lvbjsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSFcgUmV2aXNpb24gSUQgPSAweCVYXG4iLCBwcml2LT5yZXZfaWQpOwotfQotCi1zdGF0aWMgaW50IGl3bDQ5NjVfc2V0X2h3X3BhcmFtcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9yeHFfc2l6ZSA9IFJYX1FVRVVFX1NJWkU7Ci0JcHJpdi0+aHdfcGFyYW1zLm1heF9yeHFfbG9nID0gUlhfUVVFVUVfU0laRV9MT0c7Ci0JaWYgKHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+YW1zZHVfc2l6ZV84SykKLQkJcHJpdi0+aHdfcGFyYW1zLnJ4X3BhZ2Vfb3JkZXIgPSBnZXRfb3JkZXIoSVdMX1JYX0JVRl9TSVpFXzhLKTsKLQllbHNlCi0JCXByaXYtPmh3X3BhcmFtcy5yeF9wYWdlX29yZGVyID0gZ2V0X29yZGVyKElXTF9SWF9CVUZfU0laRV80Syk7Ci0KLQlwcml2LT5od19wYXJhbXMubWF4X2JlYWNvbl9pdHJ2bCA9IElXTF9NQVhfVUNPREVfQkVBQ09OX0lOVEVSVkFMOwotCi0JaWYgKHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+ZGlzYWJsZV8xMW4pCi0JCXByaXYtPmNmZy0+c2t1ICY9IH5JV0xfU0tVX047Ci0KLQkvKiBEZXZpY2Utc3BlY2lmaWMgc2V0dXAgKi8KLQlyZXR1cm4gcHJpdi0+Y2ZnLT5vcHMtPmxpYi0+c2V0X2h3X3BhcmFtcyhwcml2KTsKLX0KLQotc3RhdGljIGNvbnN0IHU4IGl3bDQ5NjVfYnNzX2FjX3RvX2ZpZm9bXSA9IHsKLQlJV0xfVFhfRklGT19WTywKLQlJV0xfVFhfRklGT19WSSwKLQlJV0xfVFhfRklGT19CRSwKLQlJV0xfVFhfRklGT19CSywKLX07Ci0KLXN0YXRpYyBjb25zdCB1OCBpd2w0OTY1X2Jzc19hY190b19xdWV1ZVtdID0gewotCTAsIDEsIDIsIDMsCi19OwotCi1zdGF0aWMgaW50Ci1pd2w0OTY1X3BjaV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKLXsKLQlpbnQgZXJyID0gMCwgaTsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXY7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHc7Ci0Jc3RydWN0IGl3bF9jZmcgKmNmZyA9IChzdHJ1Y3QgaXdsX2NmZyAqKShlbnQtPmRyaXZlcl9kYXRhKTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXUxNiBwY2lfY21kOwotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqKgotCSAqIDEuIEFsbG9jYXRpbmcgSFcgZGF0YQotCSAqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQlodyA9IGl3bF9sZWdhY3lfYWxsb2NfYWxsKGNmZyk7Ci0JaWYgKCFodykgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0JcHJpdiA9IGh3LT5wcml2OwotCS8qIEF0IHRoaXMgcG9pbnQgYm90aCBodyBhbmQgcHJpdiBhcmUgYWxsb2NhdGVkLiAqLwotCi0JLyoKLQkgKiBUaGUgZGVmYXVsdCBjb250ZXh0IGlzIGFsd2F5cyB2YWxpZCwKLQkgKiBtb3JlIG1heSBiZSBkaXNjb3ZlcmVkIHdoZW4gZmlybXdhcmUKLQkgKiBpcyBsb2FkZWQuCi0JICovCi0JcHJpdi0+dmFsaWRfY29udGV4dHMgPSBCSVQoSVdMX1JYT05fQ1RYX0JTUyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX0lXTF9SWE9OX0NUWDsgaSsrKQotCQlwcml2LT5jb250ZXh0c1tpXS5jdHhpZCA9IGk7Ci0KLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5hbHdheXNfYWN0aXZlID0gdHJ1ZTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5pc19hY3RpdmUgPSB0cnVlOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnJ4b25fY21kID0gUkVQTFlfUlhPTjsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5yeG9uX3RpbWluZ19jbWQgPSBSRVBMWV9SWE9OX1RJTUlORzsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5yeG9uX2Fzc29jX2NtZCA9IFJFUExZX1JYT05fQVNTT0M7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ucW9zX2NtZCA9IFJFUExZX1FPU19QQVJBTTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5hcF9zdGFfaWQgPSBJV0xfQVBfSUQ7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10ud2VwX2tleV9jbWQgPSBSRVBMWV9XRVBLRVk7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWNfdG9fZmlmbyA9IGl3bDQ5NjVfYnNzX2FjX3RvX2ZpZm87Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYWNfdG9fcXVldWUgPSBpd2w0OTY1X2Jzc19hY190b19xdWV1ZTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzID0KLQkJQklUKE5MODAyMTFfSUZUWVBFX0FESE9DKTsKLQlwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5pbnRlcmZhY2VfbW9kZXMgPQotCQlCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTik7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYXBfZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfQVA7Ci0JcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uaWJzc19kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9JQlNTOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnN0YXRpb25fZGV2dHlwZSA9IFJYT05fREVWX1RZUEVfRVNTOwotCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnVudXNlZF9kZXZ0eXBlID0gUlhPTl9ERVZfVFlQRV9FU1M7Ci0KLQlCVUlMRF9CVUdfT04oTlVNX0lXTF9SWE9OX0NUWCAhPSAxKTsKLQotCVNFVF9JRUVFODAyMTFfREVWKGh3LCAmcGRldi0+ZGV2KTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICIqKiogTE9BRCBEUklWRVIgKioqXG4iKTsKLQlwcml2LT5jZmcgPSBjZmc7Ci0JcHJpdi0+cGNpX2RldiA9IHBkZXY7Ci0JcHJpdi0+aW50YV9tYXNrID0gQ1NSX0lOSV9TRVRfTUFTSzsKLQotCWlmIChpd2xfbGVnYWN5X2FsbG9jX3RyYWZmaWNfbWVtKHByaXYpKQotCQlJV0xfRVJSKHByaXYsICJOb3QgZW5vdWdoIG1lbW9yeSB0byBnZW5lcmF0ZSB0cmFmZmljIGxvZ1xuIik7Ci0KLQkvKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiAyLiBJbml0aWFsaXppbmcgUENJIGJ1cwotCSAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQlwY2lfZGlzYWJsZV9saW5rX3N0YXRlKHBkZXYsIFBDSUVfTElOS19TVEFURV9MMFMgfCBQQ0lFX0xJTktfU1RBVEVfTDEgfAotCQkJCVBDSUVfTElOS19TVEFURV9DTEtQTSk7Ci0KLQlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXRfaWVlZTgwMjExX2ZyZWVfaHc7Ci0JfQotCi0JcGNpX3NldF9tYXN0ZXIocGRldik7Ci0KLQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzNikpOwotCWlmICghZXJyKQotCQllcnIgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgRE1BX0JJVF9NQVNLKDM2KSk7Ci0JaWYgKGVycikgewotCQllcnIgPSBwY2lfc2V0X2RtYV9tYXNrKHBkZXYsIERNQV9CSVRfTUFTSygzMikpOwotCQlpZiAoIWVycikKLQkJCWVyciA9IHBjaV9zZXRfY29uc2lzdGVudF9kbWFfbWFzayhwZGV2LAotCQkJCQkJCURNQV9CSVRfTUFTSygzMikpOwotCQkvKiBib3RoIGF0dGVtcHRzIGZhaWxlZDogKi8KLQkJaWYgKGVycikgewotCQkJSVdMX1dBUk4ocHJpdiwgIk5vIHN1aXRhYmxlIERNQSBhdmFpbGFibGUuXG4iKTsKLQkJCWdvdG8gb3V0X3BjaV9kaXNhYmxlX2RldmljZTsKLQkJfQotCX0KLQotCWVyciA9IHBjaV9yZXF1ZXN0X3JlZ2lvbnMocGRldiwgRFJWX05BTUUpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X3BjaV9kaXNhYmxlX2RldmljZTsKLQotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBwcml2KTsKLQotCi0JLyoqKioqKioqKioqKioqKioqKioqKioqCi0JICogMy4gUmVhZCBSRVYgcmVnaXN0ZXIKLQkgKioqKioqKioqKioqKioqKioqKioqKiovCi0JcHJpdi0+aHdfYmFzZSA9IHBjaV9pb21hcChwZGV2LCAwLCAwKTsKLQlpZiAoIXByaXYtPmh3X2Jhc2UpIHsKLQkJZXJyID0gLUVOT0RFVjsKLQkJZ290byBvdXRfcGNpX3JlbGVhc2VfcmVnaW9uczsKLQl9Ci0KLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicGNpX3Jlc291cmNlX2xlbiA9IDB4JTA4bGx4XG4iLAotCQkodW5zaWduZWQgbG9uZyBsb25nKSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIDApKTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicGNpX3Jlc291cmNlX2Jhc2UgPSAlcFxuIiwgcHJpdi0+aHdfYmFzZSk7Ci0KLQkvKiB0aGVzZSBzcGluIGxvY2tzIHdpbGwgYmUgdXNlZCBpbiBhcG1fb3BzLmluaXQgYW5kIEVFUFJPTSBhY2Nlc3MKLQkgKiB3ZSBzaG91bGQgaW5pdCBub3cKLQkgKi8KLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+cmVnX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZwcml2LT5sb2NrKTsKLQotCS8qCi0JICogc3RvcCBhbmQgcmVzZXQgdGhlIG9uLWJvYXJkIHByb2Nlc3NvciBqdXN0IGluIGNhc2UgaXQgaXMgaW4gYQotCSAqIHN0cmFuZ2Ugc3RhdGUgLi4uIGxpa2UgYmVpbmcgbGVmdCBzdHJhbmRlZCBieSBhIHByaW1hcnkga2VybmVsCi0JICogYW5kIHRoaXMgaXMgbm93IHRoZSBrZHVtcCBrZXJuZWwgdHJ5aW5nIHRvIHN0YXJ0IHVwCi0JICovCi0JaXdsX3dyaXRlMzIocHJpdiwgQ1NSX1JFU0VULCBDU1JfUkVTRVRfUkVHX0ZMQUdfTkVWT19SRVNFVCk7Ci0KLQlpd2w0OTY1X2h3X2RldGVjdChwcml2KTsKLQlJV0xfSU5GTyhwcml2LCAiRGV0ZWN0ZWQgJXMsIFJFVj0weCVYXG4iLAotCQlwcml2LT5jZmctPm5hbWUsIHByaXYtPmh3X3Jldik7Ci0KLQkvKiBXZSBkaXNhYmxlIHRoZSBSRVRSWV9USU1FT1VUIHJlZ2lzdGVyICgweDQxKSB0byBrZWVwCi0JICogUENJIFR4IHJldHJpZXMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIEMzIENQVSBzdGF0ZSAqLwotCXBjaV93cml0ZV9jb25maWdfYnl0ZShwZGV2LCBQQ0lfQ0ZHX1JFVFJZX1RJTUVPVVQsIDB4MDApOwotCi0JaXdsNDk2NV9wcmVwYXJlX2NhcmRfaHcocHJpdik7Ci0JaWYgKCFwcml2LT5od19yZWFkeSkgewotCQlJV0xfV0FSTihwcml2LCAiRmFpbGVkLCBIVyBub3QgcmVhZHlcbiIpOwotCQlnb3RvIG91dF9pb3VubWFwOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKgotCSAqIDQuIFJlYWQgRUVQUk9NCi0JICoqKioqKioqKioqKioqKioqLwotCS8qIFJlYWQgdGhlIEVFUFJPTSAqLwotCWVyciA9IGl3bF9sZWdhY3lfZWVwcm9tX2luaXQocHJpdik7Ci0JaWYgKGVycikgewotCQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdCBFRVBST01cbiIpOwotCQlnb3RvIG91dF9pb3VubWFwOwotCX0KLQllcnIgPSBpd2w0OTY1X2VlcHJvbV9jaGVja192ZXJzaW9uKHByaXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2ZyZWVfZWVwcm9tOwotCi0JaWYgKGVycikKLQkJZ290byBvdXRfZnJlZV9lZXByb207Ci0KLQkvKiBleHRyYWN0IE1BQyBBZGRyZXNzICovCi0JaXdsNDk2NV9lZXByb21fZ2V0X21hYyhwcml2LCBwcml2LT5hZGRyZXNzZXNbMF0uYWRkcik7Ci0JSVdMX0RFQlVHX0lORk8ocHJpdiwgIk1BQyBhZGRyZXNzOiAlcE1cbiIsIHByaXYtPmFkZHJlc3Nlc1swXS5hZGRyKTsKLQlwcml2LT5ody0+d2lwaHktPmFkZHJlc3NlcyA9IHByaXYtPmFkZHJlc3NlczsKLQlwcml2LT5ody0+d2lwaHktPm5fYWRkcmVzc2VzID0gMTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiA1LiBTZXR1cCBIVyBjb25zdGFudHMKLQkgKioqKioqKioqKioqKioqKioqKioqKioqLwotCWlmIChpd2w0OTY1X3NldF9od19wYXJhbXMocHJpdikpIHsKLQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNldCBodyBwYXJhbWV0ZXJzXG4iKTsKLQkJZ290byBvdXRfZnJlZV9lZXByb207Ci0JfQotCi0JLyoqKioqKioqKioqKioqKioqKioKLQkgKiA2LiBTZXR1cCBwcml2Ci0JICoqKioqKioqKioqKioqKioqKiovCi0KLQllcnIgPSBpd2w0OTY1X2luaXRfZHJ2KHByaXYpOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0X2ZyZWVfZWVwcm9tOwotCS8qIEF0IHRoaXMgcG9pbnQgYm90aCBodyBhbmQgcHJpdiBhcmUgaW5pdGlhbGl6ZWQuICovCi0KLQkvKioqKioqKioqKioqKioqKioqKioKLQkgKiA3LiBTZXR1cCBzZXJ2aWNlcwotCSAqKioqKioqKioqKioqKioqKioqKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bF9sZWdhY3lfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCXBjaV9lbmFibGVfbXNpKHByaXYtPnBjaV9kZXYpOwotCi0JZXJyID0gcmVxdWVzdF9pcnEocHJpdi0+cGNpX2Rldi0+aXJxLCBpd2xfbGVnYWN5X2lzciwKLQkJCSAgSVJRRl9TSEFSRUQsIERSVl9OQU1FLCBwcml2KTsKLQlpZiAoZXJyKSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIGFsbG9jYXRpbmcgSVJRICVkXG4iLCBwcml2LT5wY2lfZGV2LT5pcnEpOwotCQlnb3RvIG91dF9kaXNhYmxlX21zaTsKLQl9Ci0KLQlpd2w0OTY1X3NldHVwX2RlZmVycmVkX3dvcmsocHJpdik7Ci0JaXdsNDk2NV9zZXR1cF9yeF9oYW5kbGVycyhwcml2KTsKLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLQkgKiA4LiBFbmFibGUgaW50ZXJydXB0cyBhbmQgcmVhZCBSRktJTEwgc3RhdGUKLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0JLyogZW5hYmxlIHJma2lsbCBpbnRlcnJ1cHQ6IGh3IGJ1ZyB3L2EgKi8KLQlwY2lfcmVhZF9jb25maWdfd29yZChwcml2LT5wY2lfZGV2LCBQQ0lfQ09NTUFORCwgJnBjaV9jbWQpOwotCWlmIChwY2lfY21kICYgUENJX0NPTU1BTkRfSU5UWF9ESVNBQkxFKSB7Ci0JCXBjaV9jbWQgJj0gflBDSV9DT01NQU5EX0lOVFhfRElTQUJMRTsKLQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHByaXYtPnBjaV9kZXYsIFBDSV9DT01NQU5ELCBwY2lfY21kKTsKLQl9Ci0KLQlpd2xfbGVnYWN5X2VuYWJsZV9yZmtpbGxfaW50KHByaXYpOwotCi0JLyogSWYgcGxhdGZvcm0ncyBSRl9LSUxMIHN3aXRjaCBpcyBOT1Qgc2V0IHRvIEtJTEwgKi8KLQlpZiAoaXdsX3JlYWQzMihwcml2LCBDU1JfR1BfQ05UUkwpICYKLQkJQ1NSX0dQX0NOVFJMX1JFR19GTEFHX0hXX1JGX0tJTExfU1cpCi0JCWNsZWFyX2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cyk7Ci0JZWxzZQotCQlzZXRfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmcHJpdi0+c3RhdHVzKTsKLQotCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUocHJpdi0+aHctPndpcGh5LAotCQl0ZXN0X2JpdChTVEFUVVNfUkZfS0lMTF9IVywgJnByaXYtPnN0YXR1cykpOwotCi0JaXdsX2xlZ2FjeV9wb3dlcl9pbml0aWFsaXplKHByaXYpOwotCi0JaW5pdF9jb21wbGV0aW9uKCZwcml2LT5fNDk2NS5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKLQotCWVyciA9IGl3bDQ5NjVfcmVxdWVzdF9maXJtd2FyZShwcml2LCB0cnVlKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9kZXN0cm95X3dvcmtxdWV1ZTsKLQotCXJldHVybiAwOwotCi0gb3V0X2Rlc3Ryb3lfd29ya3F1ZXVlOgotCWRlc3Ryb3lfd29ya3F1ZXVlKHByaXYtPndvcmtxdWV1ZSk7Ci0JcHJpdi0+d29ya3F1ZXVlID0gTlVMTDsKLQlmcmVlX2lycShwcml2LT5wY2lfZGV2LT5pcnEsIHByaXYpOwotIG91dF9kaXNhYmxlX21zaToKLQlwY2lfZGlzYWJsZV9tc2kocHJpdi0+cGNpX2Rldik7Ci0JaXdsNDk2NV91bmluaXRfZHJ2KHByaXYpOwotIG91dF9mcmVlX2VlcHJvbToKLQlpd2xfbGVnYWN5X2VlcHJvbV9mcmVlKHByaXYpOwotIG91dF9pb3VubWFwOgotCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmh3X2Jhc2UpOwotIG91dF9wY2lfcmVsZWFzZV9yZWdpb25zOgotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwotIG91dF9wY2lfZGlzYWJsZV9kZXZpY2U6Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotIG91dF9pZWVlODAyMTFfZnJlZV9odzoKLQlpd2xfbGVnYWN5X2ZyZWVfdHJhZmZpY19tZW0ocHJpdik7Ci0JaWVlZTgwMjExX2ZyZWVfaHcocHJpdi0+aHcpOwotIG91dDoKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBfX2RldmV4aXQgaXdsNDk2NV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFwcml2KQotCQlyZXR1cm47Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwcml2LT5fNDk2NS5maXJtd2FyZV9sb2FkaW5nX2NvbXBsZXRlKTsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICIqKiogVU5MT0FEIERSSVZFUiAqKipcbiIpOwotCi0JaXdsX2xlZ2FjeV9kYmdmc191bnJlZ2lzdGVyKHByaXYpOwotCXN5c2ZzX3JlbW92ZV9ncm91cCgmcGRldi0+ZGV2LmtvYmosICZpd2xfYXR0cmlidXRlX2dyb3VwKTsKLQotCS8qIGllZWU4MDIxMV91bnJlZ2lzdGVyX2h3IGNhbGwgd2lsIGNhdXNlIGl3bF9tYWNfc3RvcCB0bwotCSAqIHRvIGJlIGNhbGxlZCBhbmQgaXdsNDk2NV9kb3duIHNpbmNlIHdlIGFyZSByZW1vdmluZyB0aGUgZGV2aWNlCi0JICogd2UgbmVlZCB0byBzZXQgU1RBVFVTX0VYSVRfUEVORElORyBiaXQuCi0JICovCi0Jc2V0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c3RhdHVzKTsKLQotCWl3bF9sZWdhY3lfbGVkc19leGl0KHByaXYpOwotCi0JaWYgKHByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQpIHsKLQkJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcocHJpdi0+aHcpOwotCQlwcml2LT5tYWM4MDIxMV9yZWdpc3RlcmVkID0gMDsKLQl9IGVsc2UgewotCQlpd2w0OTY1X2Rvd24ocHJpdik7Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHN1cmUgZGV2aWNlIGlzIHJlc2V0IHRvIGxvdyBwb3dlciBiZWZvcmUgdW5sb2FkaW5nIGRyaXZlci4KLQkgKiBUaGlzIG1heSBiZSByZWR1bmRhbnQgd2l0aCBpd2w0OTY1X2Rvd24oKSwgYnV0IHRoZXJlIGFyZSBwYXRocyB0bwotCSAqIHJ1biBpd2w0OTY1X2Rvd24oKSB3aXRob3V0IGNhbGxpbmcgYXBtX29wcy5zdG9wKCksIGFuZCB0aGVyZSBhcmUKLQkgKiBwYXRocyB0byBhdm9pZCBydW5uaW5nIGl3bDQ5NjVfZG93bigpIGF0IGFsbCBiZWZvcmUgbGVhdmluZyBkcml2ZXIuCi0JICogVGhpcyAoaW5leHBlbnNpdmUpIGNhbGwgKm1ha2VzIHN1cmUqIGRldmljZSBpcyByZXNldC4KLQkgKi8KLQlpd2xfbGVnYWN5X2FwbV9zdG9wKHByaXYpOwotCi0JLyogbWFrZSBzdXJlIHdlIGZsdXNoIGFueSBwZW5kaW5nIGlycSBvcgotCSAqIHRhc2tsZXQgZm9yIHRoZSBkcml2ZXIKLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+bG9jaywgZmxhZ3MpOwotCWl3bF9sZWdhY3lfZGlzYWJsZV9pbnRlcnJ1cHRzKHByaXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPmxvY2ssIGZsYWdzKTsKLQotCWl3bDQ5NjVfc3luY2hyb25pemVfaXJxKHByaXYpOwotCi0JaXdsNDk2NV9kZWFsbG9jX3Vjb2RlX3BjaShwcml2KTsKLQotCWlmIChwcml2LT5yeHEuYmQpCi0JCWl3bDQ5NjVfcnhfcXVldWVfZnJlZShwcml2LCAmcHJpdi0+cnhxKTsKLQlpd2w0OTY1X2h3X3R4cV9jdHhfZnJlZShwcml2KTsKLQotCWl3bF9sZWdhY3lfZWVwcm9tX2ZyZWUocHJpdik7Ci0KLQotCS8qbmV0aWZfc3RvcF9xdWV1ZShkZXYpOyAqLwotCWZsdXNoX3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwotCi0JLyogaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcgY2FsbHMgaXdsX21hY19zdG9wLCB3aGljaCBmbHVzaGVzCi0JICogcHJpdi0+d29ya3F1ZXVlLi4uIHNvIHdlIGNhbid0IHRha2UgZG93biB0aGUgd29ya3F1ZXVlCi0JICogdW50aWwgbm93Li4uICovCi0JZGVzdHJveV93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQlwcml2LT53b3JrcXVldWUgPSBOVUxMOwotCWl3bF9sZWdhY3lfZnJlZV90cmFmZmljX21lbShwcml2KTsKLQotCWZyZWVfaXJxKHByaXYtPnBjaV9kZXYtPmlycSwgcHJpdik7Ci0JcGNpX2Rpc2FibGVfbXNpKHByaXYtPnBjaV9kZXYpOwotCXBjaV9pb3VubWFwKHBkZXYsIHByaXYtPmh3X2Jhc2UpOwotCXBjaV9yZWxlYXNlX3JlZ2lvbnMocGRldik7Ci0JcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwotCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKLQotCWl3bDQ5NjVfdW5pbml0X2Rydihwcml2KTsKLQotCWRldl9rZnJlZV9za2IocHJpdi0+YmVhY29uX3NrYik7Ci0KLQlpZWVlODAyMTFfZnJlZV9odyhwcml2LT5odyk7Ci19Ci0KLS8qCi0gKiBBY3RpdmF0ZS9EZWFjdGl2YXRlIFR4IERNQS9GSUZPIGNoYW5uZWxzIGFjY29yZGluZyB0eCBmaWZvcyBtYXNrCi0gKiBtdXN0IGJlIGNhbGxlZCB1bmRlciBwcml2LT5sb2NrIGFuZCBtYWMgYWNjZXNzCi0gKi8KLXZvaWQgaXdsNDk2NV90eHFfc2V0X3NjaGVkKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG1hc2spCi17Ci0JaXdsX2xlZ2FjeV93cml0ZV9wcnBoKHByaXYsIElXTDQ5X1NDRF9UWEZBQ1QsIG1hc2spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiBkcml2ZXIgYW5kIG1vZHVsZSBlbnRyeSBwb2ludAotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSGFyZHdhcmUgc3BlY2lmaWMgZmlsZSBkZWZpbmVzIHRoZSBQQ0kgSURzIHRhYmxlIGZvciB0aGF0IGhhcmR3YXJlIG1vZHVsZSAqLwotc3RhdGljIERFRklORV9QQ0lfREVWSUNFX1RBQkxFKGl3bDQ5NjVfaHdfY2FyZF9pZHMpID0gewotI2lmIGRlZmluZWQoQ09ORklHX0lXTDQ5NjVfTU9EVUxFKSB8fCBkZWZpbmVkKENPTkZJR19JV0w0OTY1KQotCXtJV0xfUENJX0RFVklDRSgweDQyMjksIFBDSV9BTllfSUQsIGl3bDQ5NjVfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4NDIzMCwgUENJX0FOWV9JRCwgaXdsNDk2NV9jZmcpfSwKLSNlbmRpZiAvKiBDT05GSUdfSVdMNDk2NSAqLwotCi0JezB9Ci19OwotTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGl3bDQ5NjVfaHdfY2FyZF9pZHMpOwotCi1zdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaXdsNDk2NV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBEUlZfTkFNRSwKLQkuaWRfdGFibGUgPSBpd2w0OTY1X2h3X2NhcmRfaWRzLAotCS5wcm9iZSA9IGl3bDQ5NjVfcGNpX3Byb2JlLAotCS5yZW1vdmUgPSBfX2RldmV4aXRfcChpd2w0OTY1X3BjaV9yZW1vdmUpLAotCS5kcml2ZXIucG0gPSBJV0xfTEVHQUNZX1BNX09QUywKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGl3bDQ5NjVfaW5pdCh2b2lkKQotewotCi0JaW50IHJldDsKLQlwcl9pbmZvKERSVl9ERVNDUklQVElPTiAiLCAiIERSVl9WRVJTSU9OICJcbiIpOwotCXByX2luZm8oRFJWX0NPUFlSSUdIVCAiXG4iKTsKLQotCXJldCA9IGl3bDQ5NjVfcmF0ZV9jb250cm9sX3JlZ2lzdGVyKCk7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIlVuYWJsZSB0byByZWdpc3RlciByYXRlIGNvbnRyb2wgYWxnb3JpdGhtOiAlZFxuIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlyZXQgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpd2w0OTY1X2RyaXZlcik7Ci0JaWYgKHJldCkgewotCQlwcl9lcnIoIlVuYWJsZSB0byBpbml0aWFsaXplIFBDSSBtb2R1bGVcbiIpOwotCQlnb3RvIGVycm9yX3JlZ2lzdGVyOwotCX0KLQotCXJldHVybiByZXQ7Ci0KLWVycm9yX3JlZ2lzdGVyOgotCWl3bDQ5NjVfcmF0ZV9jb250cm9sX3VucmVnaXN0ZXIoKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaXdsNDk2NV9leGl0KHZvaWQpCi17Ci0JcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpd2w0OTY1X2RyaXZlcik7Ci0JaXdsNDk2NV9yYXRlX2NvbnRyb2xfdW5yZWdpc3RlcigpOwotfQotCi1tb2R1bGVfZXhpdChpd2w0OTY1X2V4aXQpOwotbW9kdWxlX2luaXQoaXdsNDk2NV9pbml0KTsKLQotI2lmZGVmIENPTkZJR19JV0xXSUZJX0xFR0FDWV9ERUJVRwotbW9kdWxlX3BhcmFtX25hbWVkKGRlYnVnLCBpd2xlZ2FjeV9kZWJ1Z19sZXZlbCwgdWludCwgU19JUlVHTyB8IFNfSVdVU1IpOwotTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgImRlYnVnIG91dHB1dCBtYXNrIik7Ci0jZW5kaWYKLQotbW9kdWxlX3BhcmFtX25hbWVkKHN3Y3J5cHRvLCBpd2w0OTY1X21vZF9wYXJhbXMuc3dfY3J5cHRvLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhzd2NyeXB0bywgInVzaW5nIGNyeXB0byBpbiBzb2Z0d2FyZSAoZGVmYXVsdCAwIFtoYXJkd2FyZV0pIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQocXVldWVzX251bSwgaXdsNDk2NV9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXMsIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKHF1ZXVlc19udW0sICJudW1iZXIgb2YgaHcgcXVldWVzLiIpOwotbW9kdWxlX3BhcmFtX25hbWVkKDExbl9kaXNhYmxlLCBpd2w0OTY1X21vZF9wYXJhbXMuZGlzYWJsZV8xMW4sIGludCwgU19JUlVHTyk7Ci1NT0RVTEVfUEFSTV9ERVNDKDExbl9kaXNhYmxlLCAiZGlzYWJsZSAxMW4gZnVuY3Rpb25hbGl0eSIpOwotbW9kdWxlX3BhcmFtX25hbWVkKGFtc2R1X3NpemVfOEssIGl3bDQ5NjVfbW9kX3BhcmFtcy5hbXNkdV9zaXplXzhLLAotCQkgICBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQyhhbXNkdV9zaXplXzhLLCAiZW5hYmxlIDhLIGFtc2R1IHNpemUiKTsKLW1vZHVsZV9wYXJhbV9uYW1lZChmd19yZXN0YXJ0LCBpd2w0OTY1X21vZF9wYXJhbXMucmVzdGFydF9mdywgaW50LCBTX0lSVUdPKTsKLU1PRFVMRV9QQVJNX0RFU0MoZndfcmVzdGFydCwgInJlc3RhcnQgZmlybXdhcmUgaW4gY2FzZSBvZiBlcnJvciIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBycGguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bGVnYWN5L3BycGguaApzaW1pbGFyaXR5IGluZGV4IDgyJQpyZW5hbWUgZnJvbSBkcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtcHJwaC5oCnJlbmFtZSB0byBkcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9wcnBoLmgKaW5kZXggMzBhNDkzMC4uZmZlYzRiNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLXBycGguaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9wcnBoLmgKQEAgLTYwLDggKzYwLDggQEAKICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYJX19pd2xfbGVnYWN5X3BycGhfaF9fCi0jZGVmaW5lIF9faXdsX2xlZ2FjeV9wcnBoX2hfXworI2lmbmRlZglfX2lsX3BycGhfaF9fCisjZGVmaW5lIF9faWxfcHJwaF9oX18KIAogLyoKICAqIFJlZ2lzdGVycyBpbiB0aGlzIGZpbGUgYXJlIGludGVybmFsLCBub3QgUENJIGJ1cyBtZW1vcnkgbWFwcGVkLgpAQCAtOTEsOSArOTEsOSBAQAogI2RlZmluZSBBUE1HX1BTX0NUUkxfVkFMX1JFU0VUX1JFUQkJKDB4MDQwMDAwMDApCiAjZGVmaW5lIEFQTUdfUFNfQ1RSTF9NU0tfUFdSX1NSQwkJKDB4MDMwMDAwMDApCiAjZGVmaW5lIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19WTUFJTgkJKDB4MDAwMDAwMDApCi0jZGVmaW5lIEFQTUdfUFNfQ1RSTF9WQUxfUFdSX1NSQ19NQVgJCSgweDAxMDAwMDAwKSAvKiAzOTQ1IG9ubHkgKi8KKyNkZWZpbmUgQVBNR19QU19DVFJMX1ZBTF9QV1JfU1JDX01BWAkJKDB4MDEwMDAwMDApCS8qIDM5NDUgb25seSAqLwogI2RlZmluZSBBUE1HX1BTX0NUUkxfVkFMX1BXUl9TUkNfVkFVWAkJKDB4MDIwMDAwMDApCi0jZGVmaW5lIEFQTUdfU1ZSX1ZPTFRBR0VfQ09ORklHX0JJVF9NU0sJKDB4MDAwMDAxRTApIC8qIGJpdCA4OjUgKi8KKyNkZWZpbmUgQVBNR19TVlJfVk9MVEFHRV9DT05GSUdfQklUX01TSwkoMHgwMDAwMDFFMCkJLyogYml0IDg6NSAqLwogI2RlZmluZSBBUE1HX1NWUl9ESUdJVEFMX1ZPTFRBR0VfMV8zMgkJKDB4MDAwMDAwNjApCiAKICNkZWZpbmUgQVBNR19QQ0lERVZfU1RUX1ZBTF9MMV9BQ1RfRElTCQkoMHgwMDAwMDgwMCkKQEAgLTEyMCwxMyArMTIwLDEzIEBACiAgKgogICogMSkgIEluaXRpYWxpemF0aW9uIC0tIHBlcmZvcm1zIGhhcmR3YXJlIGNhbGlicmF0aW9uIGFuZCBzZXRzIHVwIHNvbWUKICAqICAgICBpbnRlcm5hbCBkYXRhLCB0aGVuIG5vdGlmaWVzIGhvc3QgdmlhICJpbml0aWFsaXplIGFsaXZlIiBub3RpZmljYXRpb24KLSAqICAgICAoc3RydWN0IGl3bF9pbml0X2FsaXZlX3Jlc3ApIHRoYXQgaXQgaGFzIGNvbXBsZXRlZCBhbGwgb2YgaXRzIHdvcmsuCisgKiAgICAgKHN0cnVjdCBpbF9pbml0X2FsaXZlX3Jlc3ApIHRoYXQgaXQgaGFzIGNvbXBsZXRlZCBhbGwgb2YgaXRzIHdvcmsuCiAgKiAgICAgQWZ0ZXIgc2lnbmFsIGZyb20gaG9zdCwgaXQgdGhlbiBsb2FkcyBhbmQgc3RhcnRzIHRoZSBydW50aW1lIHByb2dyYW0uCiAgKiAgICAgVGhlIGluaXRpYWxpemF0aW9uIHByb2dyYW0gbXVzdCBiZSB1c2VkIHdoZW4gaW5pdGlhbGx5IHNldHRpbmcgdXAgdGhlCiAgKiAgICAgTklDIGFmdGVyIGxvYWRpbmcgdGhlIGRyaXZlci4KICAqCiAgKiAyKSAgUnVudGltZS9Qcm90b2NvbCAtLSBwZXJmb3JtcyBhbGwgbm9ybWFsIHJ1bnRpbWUgb3BlcmF0aW9ucy4gIFRoaXMKLSAqICAgICBub3RpZmllcyBob3N0IHZpYSAiYWxpdmUiIG5vdGlmaWNhdGlvbiAoc3RydWN0IGl3bF9hbGl2ZV9yZXNwKSB0aGF0IGl0CisgKiAgICAgbm90aWZpZXMgaG9zdCB2aWEgImFsaXZlIiBub3RpZmljYXRpb24gKHN0cnVjdCBpbF9hbGl2ZV9yZXNwKSB0aGF0IGl0CiAgKiAgICAgaXMgcmVhZHkgdG8gYmUgdXNlZC4KICAqCiAgKiBXaGVuIGluaXRpYWxpemluZyB0aGUgTklDLCB0aGUgaG9zdCBkcml2ZXIgZG9lcyB0aGUgZm9sbG93aW5nIHByb2NlZHVyZToKQEAgLTE4OSw3ICsxODksNyBAQAogICogICAgICAgIHByb2NlZHVyZS4KICAqCiAgKiBUaGlzIHNhdmUvcmVzdG9yZSBtZXRob2QgaXMgbW9zdGx5IGZvciBhdXRvbm9tb3VzIHBvd2VyIG1hbmFnZW1lbnQgZHVyaW5nCi0gKiBub3JtYWwgb3BlcmF0aW9uIChyZXN1bHQgb2YgUE9XRVJfVEFCTEVfQ01EKS4gIFBsYXRmb3JtIHN1c3BlbmQvcmVzdW1lIGFuZAorICogbm9ybWFsIG9wZXJhdGlvbiAocmVzdWx0IG9mIENfUE9XRVJfVEJMKS4gIFBsYXRmb3JtIHN1c3BlbmQvcmVzdW1lIGFuZAogICogUkZLSUxMIHNob3VsZCB1c2UgY29tcGxldGUgcmVzdGFydHMgKHdpdGggdG90YWwgcmUtaW5pdGlhbGl6YXRpb24pIG9mIHVDb2RlLAogICogYWxsb3dpbmcgdG90YWwgc2h1dGRvd24gKGluY2x1ZGluZyBCU00gbWVtb3J5KS4KICAqCkBAIC0yMDIsMTkgKzIwMiwxOSBAQAogICovCiAKIC8qIEJTTSBiaXQgZmllbGRzICovCi0jZGVmaW5lIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQgICAgICgweDgwMDAwMDAwKSAvKiBzdGFydCBib290IGxvYWQgbm93ICovCi0jZGVmaW5lIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlRfRU4gICgweDQwMDAwMDAwKSAvKiBlbmFibGUgYm9vdCBhZnRlciBwd3J1cCovCi0jZGVmaW5lIEJTTV9EUkFNX0lOU1RfTE9BRCAgICAgICAgICAgICgweDgwMDAwMDAwKSAvKiBzdGFydCBwcm9ncmFtIGxvYWQgbm93ICovCisjZGVmaW5lIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlQgICAgICgweDgwMDAwMDAwKQkvKiBzdGFydCBib290IGxvYWQgbm93ICovCisjZGVmaW5lIEJTTV9XUl9DVFJMX1JFR19CSVRfU1RBUlRfRU4gICgweDQwMDAwMDAwKQkvKiBlbmFibGUgYm9vdCBhZnRlciBwd3J1cCAqLworI2RlZmluZSBCU01fRFJBTV9JTlNUX0xPQUQgICAgICAgICAgICAoMHg4MDAwMDAwMCkJLyogc3RhcnQgcHJvZ3JhbSBsb2FkIG5vdyAqLwogCiAvKiBCU00gYWRkcmVzc2VzICovCiAjZGVmaW5lIEJTTV9CQVNFICAgICAgICAgICAgICAgICAgICAgKFBSUEhfQkFTRSArIDB4MzQwMCkKICNkZWZpbmUgQlNNX0VORCAgICAgICAgICAgICAgICAgICAgICAoUFJQSF9CQVNFICsgMHgzODAwKQogCi0jZGVmaW5lIEJTTV9XUl9DVFJMX1JFRyAgICAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDApIC8qIGN0bCBhbmQgc3RhdHVzICovCi0jZGVmaW5lIEJTTV9XUl9NRU1fU1JDX1JFRyAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDQpIC8qIHNvdXJjZSBpbiBCU00gbWVtICovCi0jZGVmaW5lIEJTTV9XUl9NRU1fRFNUX1JFRyAgICAgICAgICAgKEJTTV9CQVNFICsgMHgwMDgpIC8qIGRlc3QgaW4gU1JBTSBtZW0gKi8KLSNkZWZpbmUgQlNNX1dSX0RXQ09VTlRfUkVHICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAwQykgLyogYnl0ZXMgKi8KLSNkZWZpbmUgQlNNX1dSX1NUQVRVU19SRUcgICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAxMCkgLyogYml0IDA6ICAxID09IGRvbmUgKi8KKyNkZWZpbmUgQlNNX1dSX0NUUkxfUkVHICAgICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAwMCkJLyogY3RsIGFuZCBzdGF0dXMgKi8KKyNkZWZpbmUgQlNNX1dSX01FTV9TUkNfUkVHICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAwNCkJLyogc291cmNlIGluIEJTTSBtZW0gKi8KKyNkZWZpbmUgQlNNX1dSX01FTV9EU1RfUkVHICAgICAgICAgICAoQlNNX0JBU0UgKyAweDAwOCkJLyogZGVzdCBpbiBTUkFNIG1lbSAqLworI2RlZmluZSBCU01fV1JfRFdDT1VOVF9SRUcgICAgICAgICAgIChCU01fQkFTRSArIDB4MDBDKQkvKiBieXRlcyAqLworI2RlZmluZSBCU01fV1JfU1RBVFVTX1JFRyAgICAgICAgICAgIChCU01fQkFTRSArIDB4MDEwKQkvKiBiaXQgMDogIDEgPT0gZG9uZSAqLwogCiAvKgogICogUG9pbnRlcnMgYW5kIHNpemUgcmVncyBmb3IgYm9vdHN0cmFwIGxvYWQgYW5kIGRhdGEgU1JBTSBzYXZlL3Jlc3RvcmUuCkBAIC0yMzEsOCArMjMxLDcgQEAKICAqIFJlYWQvd3JpdGUsIGFkZHJlc3MgcmFuZ2UgZnJvbSBMT1dFUl9CT1VORCB0byAoTE9XRVJfQk9VTkQgKyBTSVpFIC0xKQogICovCiAjZGVmaW5lIEJTTV9TUkFNX0xPV0VSX0JPVU5EICAgICAgICAgKFBSUEhfQkFTRSArIDB4MzgwMCkKLSNkZWZpbmUgQlNNX1NSQU1fU0laRQkJCSgxMDI0KSAvKiBieXRlcyAqLwotCisjZGVmaW5lIEJTTV9TUkFNX1NJWkUJCQkoMTAyNCkJLyogYnl0ZXMgKi8KIAogLyogMzk0NSBUeCBzY2hlZHVsZXIgcmVnaXN0ZXJzICovCiAjZGVmaW5lIEFMTV9TQ0RfQkFTRSAgICAgICAgICAgICAgICAgICAgICAgIChQUlBIX0JBU0UgKyAweDJFMDApCkBAIC0yNTUsNyArMjU0LDcgQEAKICAqIGJ1dCBvbmUgRE1BIGNoYW5uZWwgbWF5IHRha2UgaW5wdXQgZnJvbSBzZXZlcmFsIHF1ZXVlcy4KICAqCiAgKiBUeCBETUEgRklGT3MgaGF2ZSBkZWRpY2F0ZWQgcHVycG9zZXMuICBGb3IgNDk2NSwgdGhleSBhcmUgdXNlZCBhcyBmb2xsb3dzCi0gKiAoY2YuIGRlZmF1bHRfcXVldWVfdG9fdHhfZmlmbyBpbiBpd2wtNDk2NS5jKToKKyAqIChjZi4gZGVmYXVsdF9xdWV1ZV90b190eF9maWZvIGluIDQ5NjUuYyk6CiAgKgogICogMCAtLSBFRENBIEJLIChiYWNrZ3JvdW5kKSBmcmFtZXMsIGxvd2VzdCBwcmlvcml0eQogICogMSAtLSBFRENBIEJFIChiZXN0IGVmZm9ydCkgZnJhbWVzLCBub3JtYWwgcHJpb3JpdHkKQEAgLTI3NCwyMCArMjczLDIwIEBACiAgKiBUaGUgZHJpdmVyIHNldHMgdXAgZWFjaCBxdWV1ZSB0byB3b3JrIGluIG9uZSBvZiB0d28gbW9kZXM6CiAgKgogICogMSkgIFNjaGVkdWxlci1BY2ssIGluIHdoaWNoIHRoZSBzY2hlZHVsZXIgYXV0b21hdGljYWxseSBzdXBwb3J0cyBhCi0gKiAgICAgYmxvY2stYWNrIChCQSkgd2luZG93IG9mIHVwIHRvIDY0IFRGRHMuICBJbiB0aGlzIG1vZGUsIGVhY2ggcXVldWUKKyAqICAgICBibG9jay1hY2sgKEJBKSB3aW4gb2YgdXAgdG8gNjQgVEZEcy4gIEluIHRoaXMgbW9kZSwgZWFjaCBxdWV1ZQogICogICAgIGNvbnRhaW5zIFRGRHMgZm9yIGEgdW5pcXVlIGNvbWJpbmF0aW9uIG9mIFJlY2lwaWVudCBBZGRyZXNzIChSQSkKICAqICAgICBhbmQgVHJhZmZpYyBJZGVudGlmaWVyIChUSUQpLCB0aGF0IGlzLCB0cmFmZmljIG9mIGEgZ2l2ZW4KICAqICAgICBRdWFsaXR5LU9mLVNlcnZpY2UgKFFPUykgcHJpb3JpdHksIGRlc3RpbmVkIGZvciBhIHNpbmdsZSBzdGF0aW9uLgogICoKICAqICAgICBJbiBzY2hlZHVsZXItYWNrIG1vZGUsIHRoZSBzY2hlZHVsZXIga2VlcHMgdHJhY2sgb2YgdGhlIFR4IHN0YXR1cyBvZgotICogICAgIGVhY2ggZnJhbWUgd2l0aGluIHRoZSBCQSB3aW5kb3csIGluY2x1ZGluZyB3aGV0aGVyIGl0J3MgYmVlbiB0cmFuc21pdHRlZCwKKyAqICAgICBlYWNoIGZyYW1lIHdpdGhpbiB0aGUgQkEgd2luLCBpbmNsdWRpbmcgd2hldGhlciBpdCdzIGJlZW4gdHJhbnNtaXR0ZWQsCiAgKiAgICAgYW5kIHdoZXRoZXIgaXQncyBiZWVuIGFja25vd2xlZGdlZCBieSB0aGUgcmVjZWl2aW5nIHN0YXRpb24uICBUaGUgZGV2aWNlCiAgKiAgICAgYXV0b21hdGljYWxseSBwcm9jZXNzZXMgYmxvY2stYWNrcyByZWNlaXZlZCBmcm9tIHRoZSByZWNlaXZpbmcgU1RBLAogICogICAgIGFuZCByZXNjaGVkdWxlcyB1bi1hY2tlZCBmcmFtZXMgdG8gYmUgcmV0cmFuc21pdHRlZCAoc3VjY2Vzc2Z1bAogICogICAgIFR4IGNvbXBsZXRpb24gbWF5IGVuZCB1cCBiZWluZyBvdXQtb2Ytb3JkZXIpLgogICoKICAqICAgICBUaGUgZHJpdmVyIG11c3QgbWFpbnRhaW4gdGhlIHF1ZXVlJ3MgQnl0ZSBDb3VudCB0YWJsZSBpbiBob3N0IERSQU0KLSAqICAgICAoc3RydWN0IGl3bDQ5NjVfc2NoZWRfcXVldWVfYnl0ZV9jbnRfdGJsKSBmb3IgdGhpcyBtb2RlLgorICogICAgIChzdHJ1Y3QgaWw0OTY1X3NjaGVkX3F1ZXVlX2J5dGVfY250X3RibCkgZm9yIHRoaXMgbW9kZS4KICAqICAgICBUaGlzIG1vZGUgZG9lcyBub3Qgc3VwcG9ydCBmcmFnbWVudGF0aW9uLgogICoKICAqIDIpICBGSUZPIChhLmsuYS4gbm9uLVNjaGVkdWxlci1BQ0spLCBpbiB3aGljaCBlYWNoIFRGRCBpcyBwcm9jZXNzZWQgaW4gb3JkZXIuCkBAIC0zMTYsMzQgKzMxNSwzNCBAQAogICovCiAKIC8qKgotICogTWF4IFR4IHdpbmRvdyBzaXplIGlzIHRoZSBtYXggbnVtYmVyIG9mIGNvbnRpZ3VvdXMgVEZEcyB0aGF0IHRoZSBzY2hlZHVsZXIKKyAqIE1heCBUeCB3aW4gc2l6ZSBpcyB0aGUgbWF4IG51bWJlciBvZiBjb250aWd1b3VzIFRGRHMgdGhhdCB0aGUgc2NoZWR1bGVyCiAgKiBjYW4ga2VlcCB0cmFjayBvZiBhdCBvbmUgdGltZSB3aGVuIGNyZWF0aW5nIGJsb2NrLWFjayBjaGFpbnMgb2YgZnJhbWVzLgogICogTm90ZSB0aGF0ICI2NCIgbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIGFjayBiaXRzIGluIGEgYmxvY2stYWNrIHBhY2tldC4KICAqIERyaXZlciBzaG91bGQgdXNlIFNDRF9XSU5fU0laRSBhbmQgU0NEX0ZSQU1FX0xJTUlUIHZhbHVlcyB0byBpbml0aWFsaXplCi0gKiBJV0w0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQoeCkgdmFsdWVzLgorICogSUw0OV9TQ0RfQ09OVEVYVF9RVUVVRV9PRkZTRVQoeCkgdmFsdWVzLgogICovCiAjZGVmaW5lIFNDRF9XSU5fU0laRQkJCQk2NAogI2RlZmluZSBTQ0RfRlJBTUVfTElNSVQJCQkJNjQKIAogLyogU0NEIHJlZ2lzdGVycyBhcmUgaW50ZXJuYWwsIG11c3QgYmUgYWNjZXNzZWQgdmlhIEhCVVNfVEFSR19QUlBIIHJlZ3MgKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1NUQVJUX09GRlNFVAkJMHhhMDJjMDAKKyNkZWZpbmUgSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUCQkweGEwMmMwMAogCiAvKgogICogNDk2NSB0ZWxscyBkcml2ZXIgU1JBTSBhZGRyZXNzIGZvciBpbnRlcm5hbCBzY2hlZHVsZXIgc3RydWN0cyB2aWEgdGhpcyByZWcuCiAgKiBWYWx1ZSBpcyB2YWxpZCBvbmx5IGFmdGVyICJBbGl2ZSIgcmVzcG9uc2UgZnJvbSB1Q29kZS4KICAqLwotI2RlZmluZSBJV0w0OV9TQ0RfU1JBTV9CQVNFX0FERFIgICAgICAgICAgIChJV0w0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHgwKQorI2RlZmluZSBJTDQ5X1NDRF9TUkFNX0JBU0VfQUREUiAgICAgICAgICAgKElMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MCkKIAogLyoKICAqIERyaXZlciBtYXkgbmVlZCB0byB1cGRhdGUgcXVldWUtZW1wdHkgYml0cyBhZnRlciBjaGFuZ2luZyBxdWV1ZSdzCi0gKiB3cml0ZSBhbmQgcmVhZCBwb2ludGVycyAoaW5kZXhlcykgZHVyaW5nIChyZS0paW5pdGlhbGl6YXRpb24gKGkuZS4gd2hlbgorICogd3JpdGUgYW5kIHJlYWQgcG9pbnRlcnMgKGlkeGVzKSBkdXJpbmcgKHJlLSlpbml0aWFsaXphdGlvbiAoaS5lLiB3aGVuCiAgKiBzY2hlZHVsZXIgaXMgbm90IHRyYWNraW5nIHdoYXQncyBoYXBwZW5pbmcpLgogICogQml0IGZpZWxkczoKICAqIDMxLTE2OiAgV3JpdGUgbWFzayAtLSAxOiB1cGRhdGUgZW1wdHkgYml0LCAwOiBkb24ndCBjaGFuZ2UgZW1wdHkgYml0CiAgKiAxNS0wMDogIEVtcHR5IHN0YXRlLCBvbmUgZm9yIGVhY2ggcXVldWUgLS0gMTogZW1wdHksIDA6IG5vbi1lbXB0eQogICogTk9URTogIFRoaXMgcmVnaXN0ZXIgaXMgbm90IHVzZWQgYnkgTGludXggZHJpdmVyLgogICovCi0jZGVmaW5lIElXTDQ5X1NDRF9FTVBUWV9CSVRTICAgICAgICAgICAgICAgKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDQpCisjZGVmaW5lIElMNDlfU0NEX0VNUFRZX0JJVFMgICAgICAgICAgICAgICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHg0KQogCiAvKgogICogUGh5c2ljYWwgYmFzZSBhZGRyZXNzIG9mIGFycmF5IG9mIGJ5dGUgY291bnQgKEJDKSBjaXJjdWxhciBidWZmZXJzIChDQnMpLgpAQCAtMzUxLDExICszNTAsMTEgQEAKICAqIFRoaXMgcmVnaXN0ZXIgcG9pbnRzIHRvIEJDIENCIGZvciBxdWV1ZSAwLCBtdXN0IGJlIG9uIDEwMjQtYnl0ZSBib3VuZGFyeS4KICAqIE90aGVycyBhcmUgc3BhY2VkIGJ5IDEwMjQgYnl0ZXMuCiAgKiBFYWNoIEJDIENCIGlzIDIgYnl0ZXMgKiAoMjU2ICsgNjQpID0gNzQwIGJ5dGVzLCBmb2xsb3dlZCBieSAzODQgYnl0ZXMgcGFkLgotICogKEluZGV4IGludG8gYSBxdWV1ZSdzIEJDIENCKSA9IChpbmRleCBpbnRvIHF1ZXVlJ3MgVEZEIENCKSA9IChTU04gJiAweGZmKS4KKyAqIChJbmRleCBpbnRvIGEgcXVldWUncyBCQyBDQikgPSAoaWR4IGludG8gcXVldWUncyBURkQgQ0IpID0gKFNTTiAmIDB4ZmYpLgogICogQml0IGZpZWxkczoKICAqIDI1LTAwOiAgQnl0ZSBDb3VudCBDQiBwaHlzaWNhbCBhZGRyZXNzIFszNToxMF0sIG11c3QgYmUgMTAyNC1ieXRlIGFsaWduZWQuCiAgKi8KLSNkZWZpbmUgSVdMNDlfU0NEX0RSQU1fQkFTRV9BRERSICAgICAgICAgICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MTApCisjZGVmaW5lIElMNDlfU0NEX0RSQU1fQkFTRV9BRERSICAgICAgICAgICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHgxMCkKIAogLyoKICAqIEVuYWJsZXMgYW55L2FsbCBUeCBETUEvRklGTyBjaGFubmVscy4KQEAgLTM2NCwyMyArMzYzLDIzIEBACiAgKiBCaXQgZmllbGRzOgogICogIDctIDA6ICBFbmFibGUgKDEpLCBkaXNhYmxlICgwKSwgb25lIGJpdCBmb3IgZWFjaCBjaGFubmVsIDAtNwogICovCi0jZGVmaW5lIElXTDQ5X1NDRF9UWEZBQ1QgICAgICAgICAgICAgICAgICAgKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDFjKQorI2RlZmluZSBJTDQ5X1NDRF9UWEZBQ1QgICAgICAgICAgICAgICAgICAgKElMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4MWMpCiAvKgotICogUXVldWUgKHgpIFdyaXRlIFBvaW50ZXJzIChpbmRleGVzLCByZWFsbHkhKSwgb25lIGZvciBlYWNoIFR4IHF1ZXVlLgorICogUXVldWUgKHgpIFdyaXRlIFBvaW50ZXJzIChpZHhlcywgcmVhbGx5ISksIG9uZSBmb3IgZWFjaCBUeCBxdWV1ZS4KICAqIEluaXRpYWxpemVkIGFuZCB1cGRhdGVkIGJ5IGRyaXZlciBhcyBuZXcgVEZEcyBhcmUgYWRkZWQgdG8gcXVldWUuCi0gKiBOT1RFOiAgSWYgdXNpbmcgQmxvY2sgQWNrLCBpbmRleCBtdXN0IGNvcnJlc3BvbmQgdG8gZnJhbWUncwotICogICAgICAgIFN0YXJ0IFNlcXVlbmNlIE51bWJlcjsgaW5kZXggPSAoU1NOICYgMHhmZikKKyAqIE5PVEU6ICBJZiB1c2luZyBCbG9jayBBY2ssIGlkeCBtdXN0IGNvcnJlc3BvbmQgdG8gZnJhbWUncworICogICAgICAgIFN0YXJ0IFNlcXVlbmNlIE51bWJlcjsgaWR4ID0gKFNTTiAmIDB4ZmYpCiAgKiBOT1RFOiAgQWx0ZXJuYXRpdmUgdG8gSEJVU19UQVJHX1dSUFRSLCB3aGljaCBpcyB3aGF0IExpbnV4IGRyaXZlciB1c2VzPwogICovCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9XUlBUUih4KSAgKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDI0ICsgKHgpICogNCkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfV1JQVFIoeCkgIChJTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDI0ICsgKHgpICogNCkKIAogLyoKLSAqIFF1ZXVlICh4KSBSZWFkIFBvaW50ZXJzIChpbmRleGVzLCByZWFsbHkhKSwgb25lIGZvciBlYWNoIFR4IHF1ZXVlLgotICogRm9yIEZJRk8gbW9kZSwgaW5kZXggaW5kaWNhdGVzIG5leHQgZnJhbWUgdG8gdHJhbnNtaXQuCi0gKiBGb3IgU2NoZWR1bGVyLUFDSyBtb2RlLCBpbmRleCBpbmRpY2F0ZXMgZmlyc3QgZnJhbWUgaW4gVHggd2luZG93LgorICogUXVldWUgKHgpIFJlYWQgUG9pbnRlcnMgKGlkeGVzLCByZWFsbHkhKSwgb25lIGZvciBlYWNoIFR4IHF1ZXVlLgorICogRm9yIEZJRk8gbW9kZSwgaWR4IGluZGljYXRlcyBuZXh0IGZyYW1lIHRvIHRyYW5zbWl0LgorICogRm9yIFNjaGVkdWxlci1BQ0sgbW9kZSwgaWR4IGluZGljYXRlcyBmaXJzdCBmcmFtZSBpbiBUeCB3aW4uCiAgKiBJbml0aWFsaXplZCBieSBkcml2ZXIsIHVwZGF0ZWQgYnkgc2NoZWR1bGVyLgogICovCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9SRFBUUih4KSAgKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDY0ICsgKHgpICogNCkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfUkRQVFIoeCkgIChJTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweDY0ICsgKHgpICogNCkKIAogLyoKICAqIFNlbGVjdCB3aGljaCBxdWV1ZXMgd29yayBpbiBjaGFpbiBtb2RlICgxKSB2cy4gbm90ICgwKS4KQEAgLTM5MSwxOCArMzkwLDE4IEBACiAgKiBOT1RFOiAgSWYgZHJpdmVyIHNldHMgdXAgcXVldWUgZm9yIGNoYWluIG1vZGUsIGl0IHNob3VsZCBiZSBhbHNvIHNldCB1cAogICogICAgICAgIFNjaGVkdWxlci1BQ0sgbW9kZSBhcyB3ZWxsLCB2aWEgU0NEX1FVRVVFX1NUQVRVU19CSVRTKHgpLgogICovCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRUNIQUlOX1NFTCAgKElXTDQ5X1NDRF9TVEFSVF9PRkZTRVQgKyAweGQwKQorI2RlZmluZSBJTDQ5X1NDRF9RVUVVRUNIQUlOX1NFTCAgKElMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4ZDApCiAKIC8qCiAgKiBTZWxlY3Qgd2hpY2ggcXVldWVzIGludGVycnVwdCBkcml2ZXIgd2hlbiBzY2hlZHVsZXIgaW5jcmVtZW50cwotICogYSBxdWV1ZSdzIHJlYWQgcG9pbnRlciAoaW5kZXgpLgorICogYSBxdWV1ZSdzIHJlYWQgcG9pbnRlciAoaWR4KS4KICAqIEJpdCBmaWVsZHM6CiAgKiAzMS0xNjogIFJlc2VydmVkCiAgKiAxNS0wMDogIEludGVycnVwdCBlbmFibGUsIG9uZSBiaXQgZm9yIGVhY2ggcXVldWUgLS0gMTogZW5hYmxlZCwgMDogZGlzYWJsZWQKICAqIE5PVEU6ICBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgYXBwYXJlbnRseSBhIG5vLW9wOyBkcml2ZXIgcmVsaWVzIG9uIGludGVycnVwdHMKICAqICAgICAgICBmcm9tIFJ4IHF1ZXVlIHRvIHJlYWQgVHggY29tbWFuZCByZXNwb25zZXMgYW5kIHVwZGF0ZSBUeCBxdWV1ZXMuCiAgKi8KLSNkZWZpbmUgSVdMNDlfU0NEX0lOVEVSUlVQVF9NQVNLICAoSVdMNDlfU0NEX1NUQVJUX09GRlNFVCArIDB4ZTQpCisjZGVmaW5lIElMNDlfU0NEX0lOVEVSUlVQVF9NQVNLICAoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHhlNCkKIAogLyoKICAqIFF1ZXVlIHNlYXJjaCBzdGF0dXMgcmVnaXN0ZXJzLiAgT25lIGZvciBlYWNoIHF1ZXVlLgpAQCAtNDE0LDcgKzQxMyw3IEBACiAgKiAgICAgICAgRHJpdmVyIHNob3VsZCBpbml0IHRvICIxIiBmb3IgYWdncmVnYXRpb24gbW9kZSwgb3IgIjAiIG90aGVyd2lzZS4KICAqICAgNy02OiBEcml2ZXIgc2hvdWxkIGluaXQgdG8gIjAiCiAgKiAgICAgNTogV2luZG93IFNpemUgTGVmdDsgaW5kaWNhdGVzIHdoZXRoZXIgc2NoZWR1bGVyIGNhbiByZXF1ZXN0Ci0gKiAgICAgICAgYW5vdGhlciBURkQsIGJhc2VkIG9uIHdpbmRvdyBzaXplLCBldGMuICBEcml2ZXIgc2hvdWxkIGluaXQKKyAqICAgICAgICBhbm90aGVyIFRGRCwgYmFzZWQgb24gd2luIHNpemUsIGV0Yy4gIERyaXZlciBzaG91bGQgaW5pdAogICogICAgICAgIHRoaXMgYml0IHRvICIxIiBmb3IgYWdncmVnYXRpb24gbW9kZSwgb3IgIjAiIGZvciBub24tYWdnLgogICogICA0LTE6IFR4IEZJRk8gdG8gdXNlIChyYW5nZSAwLTcpLgogICogICAgIDA6IFF1ZXVlIGlzIGFjdGl2ZSAoMSksIG5vdCBhY3RpdmUgKDApLgpAQCAtNDIzLDE4ICs0MjIsMTggQEAKICAqIE5PVEU6ICBJZiBlbmFibGluZyBTY2hlZHVsZXItQUNLIG1vZGUsIGNoYWluIG1vZGUgc2hvdWxkIGFsc28gYmUgZW5hYmxlZAogICogICAgICAgIHZpYSBTQ0RfUVVFVUVDSEFJTl9TRUwuCiAgKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX1NUQVRVU19CSVRTKHgpXAotCShJV0w0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHgxMDQgKyAoeCkgKiA0KQorI2RlZmluZSBJTDQ5X1NDRF9RVUVVRV9TVEFUVVNfQklUUyh4KVwKKwkoSUw0OV9TQ0RfU1RBUlRfT0ZGU0VUICsgMHgxMDQgKyAoeCkgKiA0KQogCiAvKiBCaXQgZmllbGQgcG9zaXRpb25zICovCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfQUNUSVZFCSgwKQotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1RYRgkoMSkKLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX1BPU19XU0wJKDUpCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfU0NEX0FDSwkoOCkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX0FDVElWRQkoMCkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1RYRgkoMSkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1dTTAkoNSkKKyNkZWZpbmUgSUw0OV9TQ0RfUVVFVUVfU1RUU19SRUdfUE9TX1NDRF9BQ0sJKDgpCiAKIC8qIFdyaXRlIG1hc2tzICovCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfU0NEX0FDVF9FTgkoMTApCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19NU0sJCSgweDAwMDdGQzAwKQorI2RlZmluZSBJTDQ5X1NDRF9RVUVVRV9TVFRTX1JFR19QT1NfU0NEX0FDVF9FTgkoMTApCisjZGVmaW5lIElMNDlfU0NEX1FVRVVFX1NUVFNfUkVHX01TSwkJKDB4MDAwN0ZDMDApCiAKIC8qKgogICogNDk2NSBpbnRlcm5hbCBTUkFNIHN0cnVjdHVyZXMgZm9yIHNjaGVkdWxlciwgc2hhcmVkIHdpdGggZHJpdmVyIC4uLgpAQCAtNDYwLDcgKzQ1OSw3IEBACiAgKiBlYWNoIHF1ZXVlJ3MgZW50cnkgYXMgZm9sbG93czoKICAqCiAgKiBMUyBEd29yZCBiaXQgZmllbGRzOgotICogIDAtMDY6ICBNYXggVHggd2luZG93IHNpemUgZm9yIFNjaGVkdWxlci1BQ0suICBEcml2ZXIgc2hvdWxkIGluaXQgdG8gNjQuCisgKiAgMC0wNjogIE1heCBUeCB3aW4gc2l6ZSBmb3IgU2NoZWR1bGVyLUFDSy4gIERyaXZlciBzaG91bGQgaW5pdCB0byA2NC4KICAqCiAgKiBNUyBEd29yZCBiaXQgZmllbGRzOgogICogMTYtMjI6ICBGcmFtZSBsaW1pdC4gIERyaXZlciBzaG91bGQgaW5pdCB0byAxMCAoMHhhKS4KQEAgLTQ3MCwxNCArNDY5LDE0IEBACiAgKiBJbml0IG11c3QgYmUgZG9uZSBhZnRlciBkcml2ZXIgcmVjZWl2ZXMgIkFsaXZlIiByZXNwb25zZSBmcm9tIDQ5NjUgdUNvZGUsCiAgKiBhbmQgd2hlbiBzZXR0aW5nIHVwIHF1ZXVlIGZvciBhZ2dyZWdhdGlvbi4KICAqLwotI2RlZmluZSBJV0w0OV9TQ0RfQ09OVEVYVF9EQVRBX09GRlNFVAkJCTB4MzgwCi0jZGVmaW5lIElXTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVCh4KSBcCi0JCQkoSVdMNDlfU0NEX0NPTlRFWFRfREFUQV9PRkZTRVQgKyAoKHgpICogOCkpCisjZGVmaW5lIElMNDlfU0NEX0NPTlRFWFRfREFUQV9PRkZTRVQJCQkweDM4MAorI2RlZmluZSBJTDQ5X1NDRF9DT05URVhUX1FVRVVFX09GRlNFVCh4KSBcCisJCQkoSUw0OV9TQ0RfQ09OVEVYVF9EQVRBX09GRlNFVCArICgoeCkgKiA4KSkKIAotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzFfV0lOX1NJWkVfUE9TCQkoMCkKLSNkZWZpbmUgSVdMNDlfU0NEX1FVRVVFX0NUWF9SRUcxX1dJTl9TSVpFX01TSwkJKDB4MDAwMDAwN0YpCi0jZGVmaW5lIElXTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MJKDE2KQotI2RlZmluZSBJV0w0OV9TQ0RfUVVFVUVfQ1RYX1JFRzJfRlJBTUVfTElNSVRfTVNLCSgweDAwN0YwMDAwKQorI2RlZmluZSBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9QT1MJCSgwKQorI2RlZmluZSBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMV9XSU5fU0laRV9NU0sJCSgweDAwMDAwMDdGKQorI2RlZmluZSBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9QT1MJKDE2KQorI2RlZmluZSBJTDQ5X1NDRF9RVUVVRV9DVFhfUkVHMl9GUkFNRV9MSU1JVF9NU0sJKDB4MDA3RjAwMDApCiAKIC8qCiAgKiBUeCBTdGF0dXMgQml0bWFwCkBAIC00ODYsNyArNDg1LDcgQEAKICAqICJBbGl2ZSIgbm90aWZpY2F0aW9uIGZyb20gdUNvZGUuICBBcmVhIGlzIHVzZWQgb25seSBieSBkZXZpY2UgaXRzZWxmOwogICogbm8gb3RoZXIgc3VwcG9ydCAoYmVzaWRlcyBjbGVhcmluZykgaXMgcmVxdWlyZWQgZnJvbSBkcml2ZXIuCiAgKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1RYX1NUVFNfQklUTUFQX09GRlNFVAkJMHg0MDAKKyNkZWZpbmUgSUw0OV9TQ0RfVFhfU1RUU19CSVRNQVBfT0ZGU0VUCQkweDQwMAogCiAvKgogICogUkF4VElEIHRvIHF1ZXVlIHRyYW5zbGF0aW9uIG1hcHBpbmcuCkBAIC00OTQsNyArNDkzLDcgQEAKICAqIFdoZW4gcXVldWUgaXMgaW4gU2NoZWR1bGVyLUFDSyBtb2RlLCBmcmFtZXMgcGxhY2VkIGluIGEgdGhhdCBxdWV1ZSBtdXN0IGJlCiAgKiBmb3Igb25seSBvbmUgY29tYmluYXRpb24gb2YgcmVjZWl2ZXIgYWRkcmVzcyAoUkEpIGFuZCB0cmFmZmljIElEIChUSUQpLCBpLmUuCiAgKiBvbmUgUU9TIHByaW9yaXR5IGxldmVsIGRlc3RpbmVkIGZvciBvbmUgc3RhdGlvbiAoZm9yIHRoaXMgd2lyZWxlc3MgbGluaywKLSAqIG5vdCBmaW5hbCBkZXN0aW5hdGlvbikuICBUaGUgU0NEX1RSQU5TTEFURV9UQUJMRSBhcmVhIHByb3ZpZGVzIDE2IDE2LWJpdAorICogbm90IGZpbmFsIGRlc3RpbmF0aW9uKS4gIFRoZSBTQ0RfVFJBTlNMQVRFX1RCTCBhcmVhIHByb3ZpZGVzIDE2IDE2LWJpdAogICogbWFwcGluZ3MsIG9uZSBmb3IgZWFjaCBvZiB0aGUgMTYgcXVldWVzLiAgSWYgcXVldWUgaXMgbm90IGluIFNjaGVkdWxlci1BQ0sKICAqIG1vZGUsIHRoZSBkZXZpY2UgaWdub3JlcyB0aGUgbWFwcGluZyB2YWx1ZS4KICAqCkBAIC01MDgsMTYgKzUwNywxNiBAQAogICogbXVzdCByZWFkIGEgZHdvcmQtYWxpZ25lZCB2YWx1ZSBmcm9tIGRldmljZSBTUkFNLCByZXBsYWNlIHRoZSAxNi1iaXQgbWFwCiAgKiB2YWx1ZSBvZiBpbnRlcmVzdCwgYW5kIHdyaXRlIHRoZSBkd29yZCB2YWx1ZSBiYWNrIGludG8gZGV2aWNlIFNSQU0uCiAgKi8KLSNkZWZpbmUgSVdMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUCQkweDUwMAorI2RlZmluZSBJTDQ5X1NDRF9UUkFOU0xBVEVfVEJMX09GRlNFVAkJMHg1MDAKIAogLyogRmluZCB0cmFuc2xhdGlvbiB0YWJsZSBkd29yZCB0byByZWFkL3dyaXRlIGZvciBnaXZlbiBxdWV1ZSAqLwotI2RlZmluZSBJV0w0OV9TQ0RfVFJBTlNMQVRFX1RCTF9PRkZTRVRfUVVFVUUoeCkgXAotCSgoSVdMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUICsgKCh4KSAqIDIpKSAmIDB4ZmZmZmZmZmMpCisjZGVmaW5lIElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUX1FVRVVFKHgpIFwKKwkoKElMNDlfU0NEX1RSQU5TTEFURV9UQkxfT0ZGU0VUICsgKCh4KSAqIDIpKSAmIDB4ZmZmZmZmZmMpCiAKLSNkZWZpbmUgSVdMX1NDRF9UWEZJRk9fUE9TX1RJRAkJCSgwKQotI2RlZmluZSBJV0xfU0NEX1RYRklGT19QT1NfUkEJCQkoNCkKLSNkZWZpbmUgSVdMX1NDRF9RVUVVRV9SQV9USURfTUFQX1JBVElEX01TSwkoMHgwMUZGKQorI2RlZmluZSBJTF9TQ0RfVFhGSUZPX1BPU19USUQJCQkoMCkKKyNkZWZpbmUgSUxfU0NEX1RYRklGT19QT1NfUkEJCQkoNCkKKyNkZWZpbmUgSUxfU0NEX1FVRVVFX1JBX1RJRF9NQVBfUkFUSURfTVNLCSgweDAxRkYpCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKiBFTkQgVFggU0NIRURVTEVSICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNlbmRpZgkJCQkvKiBfX2l3bF9sZWdhY3lfcHJwaF9oX18gKi8KKyNlbmRpZiAvKiBfX2lsX3BycGhfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL0tjb25maWcKaW5kZXggNTc3MDNkNS4uYWUwODQ5OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvS2NvbmZpZwpAQCAtMTAyLDEyICsxMDIsMjggQEAKIAkgIG9jY3VyLgogZW5kbWVudQogCi1jb25maWcgSVdMV0lGSV9ERVZJQ0VfU1ZUT09MCi0JYm9vbCAiaXdsd2lmaSBkZXZpY2Ugc3Z0b29sIHN1cHBvcnQiCitjb25maWcgSVdMV0lGSV9ERVZJQ0VfVEVTVE1PREUKKwlkZWZfYm9vbCB5CiAJZGVwZW5kcyBvbiBJV0xXSUZJCi0Jc2VsZWN0IE5MODAyMTFfVEVTVE1PREUKKwlkZXBlbmRzIG9uIE5MODAyMTFfVEVTVE1PREUKIAloZWxwCi0JICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBzdnRvb2wgc3VwcG9ydCBmb3IgaXdsd2lmaSBkZXZpY2UgdGhyb3VnaAotCSAgTkw4MDIxMV9URVNUTU9ERS4gc3Z0b29sIGlzIGEgc29mdHdhcmUgdmFsaWRhdGlvbiB0b29sIHRoYXQgcnVucyBpbgotCSAgdGhlIHVzZXIgc3BhY2UgYW5kIGludGVyYWN0cyB3aXRoIHRoZSBkZXZpY2UgaW4gdGhlIGtlcm5lbCBzcGFjZQotCSAgdGhyb3VnaCB0aGUgZ2VuZXJpYyBuZXRsaW5rIG1lc3NhZ2UgdmlhIE5MODAyMTFfVEVTVE1PREUgY2hhbm5lbC4KKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIHRlc3Rtb2RlIHN1cHBvcnQgZm9yIGl3bHdpZmkgZGV2aWNlIHRocm91Z2gKKwkgIE5MODAyMTFfVEVTVE1PREUuIFRoaXMgcHJvdmlkZSB0aGUgY2FwYWJpbGl0aWVzIG9mIGVuYWJsZSB1c2VyIHNwYWNlCisJICB2YWxpZGF0aW9uIGFwcGxpY2F0aW9ucyB0byBpbnRlcmFjdHMgd2l0aCB0aGUgZGV2aWNlIHRocm91Z2ggdGhlCisJICBnZW5lcmljIG5ldGxpbmsgbWVzc2FnZSB2aWEgTkw4MDIxMV9URVNUTU9ERSBjaGFubmVsLgorCitjb25maWcgSVdMV0lGSV9QMlAKKyAgICAgICBib29sICJpd2x3aWZpIGV4cGVyaW1lbnRhbCBQMlAgc3VwcG9ydCIKKyAgICAgICBkZXBlbmRzIG9uIElXTFdJRkkKKyAgICAgICBoZWxwCisgICAgICAgICBUaGlzIG9wdGlvbiBlbmFibGVzIGV4cGVyaW1lbnRhbCBQMlAgc3VwcG9ydCBmb3Igc29tZSBkZXZpY2VzCisgICAgICAgICBiYXNlZCBvbiBtaWNyb2NvZGUgc3VwcG9ydC4gU2luY2UgUDJQIHN1cHBvcnQgaXMgc3RpbGwgdW5kZXIKKyAgICAgICAgIGRldmVsb3BtZW50LCB0aGlzIG9wdGlvbiBtYXkgZXZlbiBlbmFibGUgaXQgZm9yIHNvbWUgZGV2aWNlcworICAgICAgICAgbm93IHRoYXQgdHVybiBvdXQgdG8gbm90IHN1cHBvcnQgaXQgaW4gdGhlIGZ1dHVyZSBkdWUgdG8KKyAgICAgICAgIG1pY3JvY29kZSByZXN0cmljdGlvbnMuCisKKyAgICAgICAgIFRvIGRldGVybWluZSBpZiB5b3VyIG1pY3JvY29kZSBzdXBwb3J0cyB0aGUgZXhwZXJpbWVudGFsIFAyUAorICAgICAgICAgb2ZmZXJlZCBieSB0aGlzIG9wdGlvbiwgY2hlY2sgaWYgdGhlIGRyaXZlciBhZHZlcnRpc2VzIEFQCisgICAgICAgICBzdXBwb3J0IHdoZW4gaXQgaXMgbG9hZGVkLgorCisgICAgICAgICBTYXkgWSBvbmx5IGlmIHlvdSB3YW50IHRvIGV4cGVyaW1lbnQgd2l0aCBQMlAuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL01ha2VmaWxlIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9NYWtlZmlsZQppbmRleCBjNzNlNWVkLi45ZGM4NGE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvTWFrZWZpbGUKQEAgLTEsNyArMSw3IEBACiAjIFdJRkkKIG9iai0kKENPTkZJR19JV0xXSUZJKQkrPSBpd2x3aWZpLm8KLWl3bHdpZmktb2JqcwkJOj0gaXdsLWFnbi5vIGl3bC1hZ24tcnMubwotaXdsd2lmaS1vYmpzCQkrPSBpd2wtYWduLXVjb2RlLm8gaXdsLWFnbi10eC5vCitpd2x3aWZpLW9ianMJCTo9IGl3bC1hZ24ubyBpd2wtYWduLXJzLm8gaXdsLW1hYzgwMjExLm8KK2l3bHdpZmktb2JqcwkJKz0gaXdsLXVjb2RlLm8gaXdsLWFnbi10eC5vCiBpd2x3aWZpLW9ianMJCSs9IGl3bC1hZ24tbGliLm8gaXdsLWFnbi1jYWxpYi5vIGl3bC1pby5vCiBpd2x3aWZpLW9ianMJCSs9IGl3bC1hZ24tdHQubyBpd2wtYWduLXN0YS5vIGl3bC1hZ24tcngubwogCkBAIC0xOCw3ICsxOCw3IEBACiAKIGl3bHdpZmktJChDT05GSUdfSVdMV0lGSV9ERUJVR0ZTKSArPSBpd2wtZGVidWdmcy5vCiBpd2x3aWZpLSQoQ09ORklHX0lXTFdJRklfREVWSUNFX1RSQUNJTkcpICs9IGl3bC1kZXZ0cmFjZS5vCi1pd2x3aWZpLSQoQ09ORklHX0lXTFdJRklfREVWSUNFX1NWVE9PTCkgKz0gaXdsLXN2LW9wZW4ubworaXdsd2lmaS0kKENPTkZJR19JV0xXSUZJX0RFVklDRV9URVNUTU9ERSkgKz0gaXdsLXRlc3Rtb2RlLm8KIAogQ0ZMQUdTX2l3bC1kZXZ0cmFjZS5vIDo9IC1JJChzcmMpCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTEwMDAuYwppbmRleCBlMTJiNDhjLi4xZWY3YmZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0xMDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMTAwMC5jCkBAIC0xMjQsMTAgKzEyNCwxMCBAQAogewogCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzID49IElXTF9NSU5fTlVNX1FVRVVFUyAmJgogCSAgICBpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzIDw9IElXTEFHTl9OVU1fUVVFVUVTKQotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzID0KKwkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA9CiAJCQlpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzOwogCi0JaHdfcGFyYW1zKHByaXYpLm1heF90eHFfbnVtID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKwlod19wYXJhbXMocHJpdikubWF4X3R4cV9udW0gPSBjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwogCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCA9IElXTEFHTl9CUk9BRENBU1RfSUQ7CiAKIAlod19wYXJhbXMocHJpdikubWF4X2RhdGFfc2l6ZSA9IElXTEFHTl9SVENfREFUQV9TSVpFOwpAQCAtMTM1LDI4ICsxMzUsMTkgQEAKIAogCWh3X3BhcmFtcyhwcml2KS5odDQwX2NoYW5uZWwgPSAgQklUKElFRUU4MDIxMV9CQU5EXzJHSFopOwogCi0JaHdfcGFyYW1zKHByaXYpLnR4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KHByaXYtPmNmZy0+dmFsaWRfdHhfYW50KTsKLQlpZiAocHJpdi0+Y2ZnLT5yeF93aXRoX3Npc29fZGl2ZXJzaXR5KQorCWh3X3BhcmFtcyhwcml2KS50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChjZmcocHJpdiktPnZhbGlkX3R4X2FudCk7CisJaWYgKGNmZyhwcml2KS0+cnhfd2l0aF9zaXNvX2RpdmVyc2l0eSkKIAkJaHdfcGFyYW1zKHByaXYpLnJ4X2NoYWluc19udW0gPSAxOwogCWVsc2UKIAkJaHdfcGFyYW1zKHByaXYpLnJ4X2NoYWluc19udW0gPQotCQkJbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3J4X2FudCk7Ci0JaHdfcGFyYW1zKHByaXYpLnZhbGlkX3R4X2FudCA9IHByaXYtPmNmZy0+dmFsaWRfdHhfYW50OwotCWh3X3BhcmFtcyhwcml2KS52YWxpZF9yeF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3J4X2FudDsKKwkJCW51bV9vZl9hbnQoY2ZnKHByaXYpLT52YWxpZF9yeF9hbnQpOworCWh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQgPSBjZmcocHJpdiktPnZhbGlkX3R4X2FudDsKKwlod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50ID0gY2ZnKHByaXYpLT52YWxpZF9yeF9hbnQ7CiAKIAlpd2wxMDAwX3NldF9jdF90aHJlc2hvbGQocHJpdik7CiAKIAkvKiBTZXQgaW5pdGlhbCBzZW5zaXRpdml0eSBwYXJhbWV0ZXJzICovCi0JLyogU2V0IGluaXRpYWwgY2FsaWJyYXRpb24gc2V0ICovCiAJaHdfcGFyYW1zKHByaXYpLnNlbnMgPSAmaXdsMTAwMF9zZW5zaXRpdml0eTsKLQlod19wYXJhbXMocHJpdikuY2FsaWJfaW5pdF9jZmcgPQotCQkJQklUKElXTF9DQUxJQl9YVEFMKQkJfAotCQkJQklUKElXTF9DQUxJQl9MTykJCXwKLQkJCUJJVChJV0xfQ0FMSUJfVFhfSVEpIAkJfAotCQkJQklUKElXTF9DQUxJQl9UWF9JUV9QRVJEKQl8Ci0JCQlCSVQoSVdMX0NBTElCX0JBU0VfQkFORCk7Ci0JaWYgKHByaXYtPmNmZy0+bmVlZF9kY19jYWxpYikKLQkJaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnIHw9IEJJVChJV0xfQ0FMSUJfREMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xOTEsNiArMTgyLDcgQEAKIAkuY2hhaW5fbm9pc2Vfc2NhbGUgPSAxMDAwLAogCS53ZF90aW1lb3V0ID0gSVdMX0RFRl9XRF9USU1FT1VULAogCS5tYXhfZXZlbnRfbG9nX3NpemUgPSAxMjgsCisJLndkX2Rpc2FibGUgPSB0cnVlLAogfTsKIHN0YXRpYyBzdHJ1Y3QgaXdsX2h0X3BhcmFtcyBpd2wxMDAwX2h0X3BhcmFtcyA9IHsKIAkuaHRfZ3JlZW5maWVsZF9zdXBwb3J0ID0gdHJ1ZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTIwMDAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTIwMDAuYwppbmRleCA3OTQzMTk3Li4wOTQ2OTMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC0yMDAwLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtMjAwMC5jCkBAIC04Niw3ICs4Niw3IEBACiB7CiAJaXdsX3JmX2NvbmZpZyhwcml2KTsKIAotCWlmIChwcml2LT5jZmctPmlxX2ludmVydCkKKwlpZiAoY2ZnKHByaXYpLT5pcV9pbnZlcnQpCiAJCWl3bF9zZXRfYml0KGJ1cyhwcml2KSwgQ1NSX0dQX0RSSVZFUl9SRUcsCiAJCQkgICAgQ1NSX0dQX0RSSVZFUl9SRUdfQklUX1JBRElPX0lRX0lOVkVSKTsKIH0KQEAgLTEyMCwxMCArMTIwLDEwIEBACiB7CiAJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXMgPj0gSVdMX01JTl9OVU1fUVVFVUVTICYmCiAJICAgIGl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXMgPD0gSVdMQUdOX05VTV9RVUVVRVMpCi0JCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPQorCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzID0KIAkJCWl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXM7CiAKLQlod19wYXJhbXMocHJpdikubWF4X3R4cV9udW0gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOworCWh3X3BhcmFtcyhwcml2KS5tYXhfdHhxX251bSA9IGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CiAJcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYmNhc3Rfc3RhX2lkID0gSVdMQUdOX0JST0FEQ0FTVF9JRDsKIAogCWh3X3BhcmFtcyhwcml2KS5tYXhfZGF0YV9zaXplID0gSVdMNjBfUlRDX0RBVEFfU0laRTsKQEAgLTEzMSwyOSArMTMxLDE5IEBACiAKIAlod19wYXJhbXMocHJpdikuaHQ0MF9jaGFubmVsID0gIEJJVChJRUVFODAyMTFfQkFORF8yR0haKTsKIAotCWh3X3BhcmFtcyhwcml2KS50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7Ci0JaWYgKHByaXYtPmNmZy0+cnhfd2l0aF9zaXNvX2RpdmVyc2l0eSkKKwlod19wYXJhbXMocHJpdikudHhfY2hhaW5zX251bSA9IG51bV9vZl9hbnQoY2ZnKHByaXYpLT52YWxpZF90eF9hbnQpOworCWlmIChjZmcocHJpdiktPnJ4X3dpdGhfc2lzb19kaXZlcnNpdHkpCiAJCWh3X3BhcmFtcyhwcml2KS5yeF9jaGFpbnNfbnVtID0gMTsKIAllbHNlCiAJCWh3X3BhcmFtcyhwcml2KS5yeF9jaGFpbnNfbnVtID0KLQkJCW51bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOwotCWh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3R4X2FudDsKLQlod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQ7CisJCQludW1fb2ZfYW50KGNmZyhwcml2KS0+dmFsaWRfcnhfYW50KTsKKwlod19wYXJhbXMocHJpdikudmFsaWRfdHhfYW50ID0gY2ZnKHByaXYpLT52YWxpZF90eF9hbnQ7CisJaHdfcGFyYW1zKHByaXYpLnZhbGlkX3J4X2FudCA9IGNmZyhwcml2KS0+dmFsaWRfcnhfYW50OwogCiAJaXdsMjAwMF9zZXRfY3RfdGhyZXNob2xkKHByaXYpOwogCiAJLyogU2V0IGluaXRpYWwgc2Vuc2l0aXZpdHkgcGFyYW1ldGVycyAqLwotCS8qIFNldCBpbml0aWFsIGNhbGlicmF0aW9uIHNldCAqLwogCWh3X3BhcmFtcyhwcml2KS5zZW5zID0gJml3bDIwMDBfc2Vuc2l0aXZpdHk7Ci0JaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnID0KLQkJQklUKElXTF9DQUxJQl9YVEFMKSAgICAgICAgICAgICB8Ci0JCUJJVChJV0xfQ0FMSUJfTE8pICAgICAgICAgICAgICAgfAotCQlCSVQoSVdMX0NBTElCX1RYX0lRKSAgICAgICAgICAgIHwKLQkJQklUKElXTF9DQUxJQl9CQVNFX0JBTkQpOwotCWlmIChwcml2LT5jZmctPm5lZWRfZGNfY2FsaWIpCi0JCWh3X3BhcmFtcyhwcml2KS5jYWxpYl9ydF9jZmcgfD0gSVdMX0NBTElCX0NGR19EQ19JRFg7Ci0JaWYgKHByaXYtPmNmZy0+bmVlZF90ZW1wX29mZnNldF9jYWxpYikKLQkJaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnIHw9IEJJVChJV0xfQ0FMSUJfVEVNUF9PRkZTRVQpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yNTgsMjUgKzI0OCwxOSBAQAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzIwMDBfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5saWIgPSAmaXdsMjAwMF9saWIsCQkJCQlcCiAJLmJhc2VfcGFyYW1zID0gJml3bDIwMDBfYmFzZV9wYXJhbXMsCQkJXAotCS5uZWVkX2RjX2NhbGliID0gdHJ1ZSwJCQkJCVwKIAkubmVlZF90ZW1wX29mZnNldF9jYWxpYiA9IHRydWUsCQkJCVwKIAkudGVtcF9vZmZzZXRfdjIgPSB0cnVlLAkJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKIAkuaXFfaW52ZXJ0ID0gdHJ1ZQkJCQkJXAogCiBzdHJ1Y3QgaXdsX2NmZyBpd2wyMDAwXzJiZ25fY2ZnID0gewotCS5uYW1lID0gIjIwMDAgU2VyaWVzIDJ4MiBCR04iLAorCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gMjIwMCBCR04iLAogCUlXTF9ERVZJQ0VfMjAwMCwKIAkuaHRfcGFyYW1zID0gJml3bDIwMDBfaHRfcGFyYW1zLAogfTsKIAotc3RydWN0IGl3bF9jZmcgaXdsMjAwMF8yYmdfY2ZnID0gewotCS5uYW1lID0gIjIwMDAgU2VyaWVzIDJ4MiBCRyIsCi0JSVdMX0RFVklDRV8yMDAwLAotfTsKLQogc3RydWN0IGl3bF9jZmcgaXdsMjAwMF8yYmduX2RfY2ZnID0gewotCS5uYW1lID0gIjIwMDBEIFNlcmllcyAyeDIgQkdOIiwKKwkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBXaXJlbGVzcy1OIDIyMDBEIEJHTiIsCiAJSVdMX0RFVklDRV8yMDAwLAogCS5odF9wYXJhbXMgPSAmaXdsMjAwMF9odF9wYXJhbXMsCiB9OwpAQCAtMjkxLDcgKzI3NSw2IEBACiAJLmxpYiA9ICZpd2wyMDMwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMjAzMF9iYXNlX3BhcmFtcywJCQlcCiAJLmJ0X3BhcmFtcyA9ICZpd2wyMDMwX2J0X3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliID0gdHJ1ZSwJCQkJXAogCS50ZW1wX29mZnNldF92MiA9IHRydWUsCQkJCQlcCiAJLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURSwJCQkJXApAQCAtMjk5LDE2ICsyODIsMTEgQEAKIAkuaXFfaW52ZXJ0ID0gdHJ1ZQkJCQkJXAogCiBzdHJ1Y3QgaXdsX2NmZyBpd2wyMDMwXzJiZ25fY2ZnID0gewotCS5uYW1lID0gIjIwMDAgU2VyaWVzIDJ4MiBCR04vQlQiLAorCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gMjIzMCBCR04iLAogCUlXTF9ERVZJQ0VfMjAzMCwKIAkuaHRfcGFyYW1zID0gJml3bDIwMDBfaHRfcGFyYW1zLAogfTsKIAotc3RydWN0IGl3bF9jZmcgaXdsMjAzMF8yYmdfY2ZnID0gewotCS5uYW1lID0gIjIwMDAgU2VyaWVzIDJ4MiBCRy9CVCIsCi0JSVdMX0RFVklDRV8yMDMwLAotfTsKLQogI2RlZmluZSBJV0xfREVWSUNFXzEwNQkJCQkJCVwKIAkuZndfbmFtZV9wcmUgPSBJV0wxMDVfRldfUFJFLAkJCQlcCiAJLnVjb2RlX2FwaV9tYXggPSBJV0wxMDVfVUNPREVfQVBJX01BWCwJCQlcCkBAIC0zMTgsNyArMjk2LDYgQEAKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV8yMDAwX1RYX1BPV0VSX1ZFUlNJT04sCVwKIAkubGliID0gJml3bDIwMDBfbGliLAkJCQkJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2wyMDAwX2Jhc2VfcGFyYW1zLAkJCVwKLQkubmVlZF9kY19jYWxpYiA9IHRydWUsCQkJCQlcCiAJLm5lZWRfdGVtcF9vZmZzZXRfY2FsaWIgPSB0cnVlLAkJCQlcCiAJLnRlbXBfb2Zmc2V0X3YyID0gdHJ1ZSwJCQkJCVwKIAkubGVkX21vZGUgPSBJV0xfTEVEX1JGX1NUQVRFLAkJCQlcCkBAIC0zMjYsMTkgKzMwMywxNCBAQAogCS5yeF93aXRoX3Npc29fZGl2ZXJzaXR5ID0gdHJ1ZSwJCQkJXAogCS5pcV9pbnZlcnQgPSB0cnVlCQkJCQlcCiAKLXN0cnVjdCBpd2xfY2ZnIGl3bDEwNV9iZ19jZmcgPSB7Ci0JLm5hbWUgPSAiMTA1IFNlcmllcyAxeDEgQkciLAotCUlXTF9ERVZJQ0VfMTA1LAotfTsKLQogc3RydWN0IGl3bF9jZmcgaXdsMTA1X2Jnbl9jZmcgPSB7Ci0JLm5hbWUgPSAiMTA1IFNlcmllcyAxeDEgQkdOIiwKKwkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBXaXJlbGVzcy1OIDEwNSBCR04iLAogCUlXTF9ERVZJQ0VfMTA1LAogCS5odF9wYXJhbXMgPSAmaXdsMjAwMF9odF9wYXJhbXMsCiB9OwogCiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDVfYmduX2RfY2ZnID0gewotCS5uYW1lID0gIjEwNUQgU2VyaWVzIDF4MSBCR04iLAorCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFdpcmVsZXNzLU4gMTA1RCBCR04iLAogCUlXTF9ERVZJQ0VfMTA1LAogCS5odF9wYXJhbXMgPSAmaXdsMjAwMF9odF9wYXJhbXMsCiB9OwpAQCAtMzUzLDcgKzMyNSw2IEBACiAJLmxpYiA9ICZpd2wyMDMwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsMjAzMF9iYXNlX3BhcmFtcywJCQlcCiAJLmJ0X3BhcmFtcyA9ICZpd2wyMDMwX2J0X3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliID0gdHJ1ZSwJCQkJXAogCS50ZW1wX29mZnNldF92MiA9IHRydWUsCQkJCQlcCiAJLmxlZF9tb2RlID0gSVdMX0xFRF9SRl9TVEFURSwJCQkJXApAQCAtMzYxLDEzICszMzIsOCBAQAogCS5yeF93aXRoX3Npc29fZGl2ZXJzaXR5ID0gdHJ1ZSwJCQkJXAogCS5pcV9pbnZlcnQgPSB0cnVlCQkJCQlcCiAKLXN0cnVjdCBpd2xfY2ZnIGl3bDEzNV9iZ19jZmcgPSB7Ci0JLm5hbWUgPSAiMTM1IFNlcmllcyAxeDEgQkcvQlQiLAotCUlXTF9ERVZJQ0VfMTM1LAotfTsKLQogc3RydWN0IGl3bF9jZmcgaXdsMTM1X2Jnbl9jZmcgPSB7Ci0JLm5hbWUgPSAiMTM1IFNlcmllcyAxeDEgQkdOL0JUIiwKKwkubmFtZSA9ICJJbnRlbChSKSBDZW50cmlubyhSKSBXaXJlbGVzcy1OIDEzNSBCR04iLAogCUlXTF9ERVZJQ0VfMTM1LAogCS5odF9wYXJhbXMgPSAmaXdsMjAwMF9odF9wYXJhbXMsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNTAwMC5jCmluZGV4IGM1MTFjOTguLmIzYTM2NWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTUwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC01MDAwLmMKQEAgLTEzNCwxMCArMTM0LDEwIEBACiAKICNkZWZpbmUgSVdMXzUxNTBfVk9MVEFHRV9UT19URU1QRVJBVFVSRV9DT0VGRgkoLTUpCiAKLXN0YXRpYyBzMzIgaXdsX3RlbXBfY2FsaWJfdG9fb2Zmc2V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyBzMzIgaXdsX3RlbXBfY2FsaWJfdG9fb2Zmc2V0KHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkKQogewogCXUxNiB0ZW1wZXJhdHVyZSwgdm9sdGFnZTsKLQlfX2xlMTYgKnRlbXBfY2FsaWIgPSAoX19sZTE2ICopaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsCisJX19sZTE2ICp0ZW1wX2NhbGliID0gKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcihzaHJkLAogCQkJCUVFUFJPTV9LRUxWSU5fVEVNUEVSQVRVUkUpOwogCiAJdGVtcGVyYXR1cmUgPSBsZTE2X3RvX2NwdSh0ZW1wX2NhbGliWzBdKTsKQEAgLTE1MSw3ICsxNTEsNyBAQAogewogCWNvbnN0IHMzMiB2b2x0MnRlbXBfY29lZiA9IElXTF81MTUwX1ZPTFRBR0VfVE9fVEVNUEVSQVRVUkVfQ09FRkY7CiAJczMyIHRocmVzaG9sZCA9IChzMzIpQ0VMU0lVU19UT19LRUxWSU4oQ1RfS0lMTF9USFJFU0hPTERfTEVHQUNZKSAtCi0JCQlpd2xfdGVtcF9jYWxpYl90b19vZmZzZXQocHJpdik7CisJCQlpd2xfdGVtcF9jYWxpYl90b19vZmZzZXQocHJpdi0+c2hyZCk7CiAKIAlod19wYXJhbXMocHJpdikuY3Rfa2lsbF90aHJlc2hvbGQgPSB0aHJlc2hvbGQgKiB2b2x0MnRlbXBfY29lZjsKIH0KQEAgLTE2NiwxMCArMTY2LDEwIEBACiB7CiAJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXMgPj0gSVdMX01JTl9OVU1fUVVFVUVTICYmCiAJICAgIGl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXMgPD0gSVdMQUdOX05VTV9RVUVVRVMpCi0JCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPQorCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzID0KIAkJCWl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXM7CiAKLQlod19wYXJhbXMocHJpdikubWF4X3R4cV9udW0gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOworCWh3X3BhcmFtcyhwcml2KS5tYXhfdHhxX251bSA9IGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CiAJcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYmNhc3Rfc3RhX2lkID0gSVdMQUdOX0JST0FEQ0FTVF9JRDsKIAogCWh3X3BhcmFtcyhwcml2KS5tYXhfZGF0YV9zaXplID0gSVdMQUdOX1JUQ19EQVRBX1NJWkU7CkBAIC0xNzgsMjIgKzE3OCwxNSBAQAogCWh3X3BhcmFtcyhwcml2KS5odDQwX2NoYW5uZWwgPSAgQklUKElFRUU4MDIxMV9CQU5EXzJHSFopIHwKIAkJCQkJQklUKElFRUU4MDIxMV9CQU5EXzVHSFopOwogCi0JaHdfcGFyYW1zKHByaXYpLnR4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KHByaXYtPmNmZy0+dmFsaWRfdHhfYW50KTsKLQlod19wYXJhbXMocHJpdikucnhfY2hhaW5zX251bSA9IG51bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOwotCWh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3R4X2FudDsKLQlod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQ7CisJaHdfcGFyYW1zKHByaXYpLnR4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KGNmZyhwcml2KS0+dmFsaWRfdHhfYW50KTsKKwlod19wYXJhbXMocHJpdikucnhfY2hhaW5zX251bSA9IG51bV9vZl9hbnQoY2ZnKHByaXYpLT52YWxpZF9yeF9hbnQpOworCWh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQgPSBjZmcocHJpdiktPnZhbGlkX3R4X2FudDsKKwlod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50ID0gY2ZnKHByaXYpLT52YWxpZF9yeF9hbnQ7CiAKIAlpd2w1MDAwX3NldF9jdF90aHJlc2hvbGQocHJpdik7CiAKIAkvKiBTZXQgaW5pdGlhbCBzZW5zaXRpdml0eSBwYXJhbWV0ZXJzICovCi0JLyogU2V0IGluaXRpYWwgY2FsaWJyYXRpb24gc2V0ICovCiAJaHdfcGFyYW1zKHByaXYpLnNlbnMgPSAmaXdsNTAwMF9zZW5zaXRpdml0eTsKLQlod19wYXJhbXMocHJpdikuY2FsaWJfaW5pdF9jZmcgPQotCQlCSVQoSVdMX0NBTElCX1hUQUwpCQl8Ci0JCUJJVChJV0xfQ0FMSUJfTE8pCQl8Ci0JCUJJVChJV0xfQ0FMSUJfVFhfSVEpCQl8Ci0JCUJJVChJV0xfQ0FMSUJfVFhfSVFfUEVSRCkJfAotCQlCSVQoSVdMX0NBTElCX0JBU0VfQkFORCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTIwMiwxMCArMTk1LDEwIEBACiB7CiAJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXMgPj0gSVdMX01JTl9OVU1fUVVFVUVTICYmCiAJICAgIGl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXMgPD0gSVdMQUdOX05VTV9RVUVVRVMpCi0JCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXMgPQorCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzID0KIAkJCWl3bGFnbl9tb2RfcGFyYW1zLm51bV9vZl9xdWV1ZXM7CiAKLQlod19wYXJhbXMocHJpdikubWF4X3R4cV9udW0gPSBwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOworCWh3X3BhcmFtcyhwcml2KS5tYXhfdHhxX251bSA9IGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPm51bV9vZl9xdWV1ZXM7CiAJcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uYmNhc3Rfc3RhX2lkID0gSVdMQUdOX0JST0FEQ0FTVF9JRDsKIAogCWh3X3BhcmFtcyhwcml2KS5tYXhfZGF0YV9zaXplID0gSVdMQUdOX1JUQ19EQVRBX1NJWkU7CkBAIC0yMTQsMjIgKzIwNywxNSBAQAogCWh3X3BhcmFtcyhwcml2KS5odDQwX2NoYW5uZWwgPSAgQklUKElFRUU4MDIxMV9CQU5EXzJHSFopIHwKIAkJCQkJQklUKElFRUU4MDIxMV9CQU5EXzVHSFopOwogCi0JaHdfcGFyYW1zKHByaXYpLnR4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KHByaXYtPmNmZy0+dmFsaWRfdHhfYW50KTsKLQlod19wYXJhbXMocHJpdikucnhfY2hhaW5zX251bSA9IG51bV9vZl9hbnQocHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOwotCWh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3R4X2FudDsKLQlod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50ID0gcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQ7CisJaHdfcGFyYW1zKHByaXYpLnR4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KGNmZyhwcml2KS0+dmFsaWRfdHhfYW50KTsKKwlod19wYXJhbXMocHJpdikucnhfY2hhaW5zX251bSA9IG51bV9vZl9hbnQoY2ZnKHByaXYpLT52YWxpZF9yeF9hbnQpOworCWh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQgPSBjZmcocHJpdiktPnZhbGlkX3R4X2FudDsKKwlod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50ID0gY2ZnKHByaXYpLT52YWxpZF9yeF9hbnQ7CiAKIAlpd2w1MTUwX3NldF9jdF90aHJlc2hvbGQocHJpdik7CiAKIAkvKiBTZXQgaW5pdGlhbCBzZW5zaXRpdml0eSBwYXJhbWV0ZXJzICovCi0JLyogU2V0IGluaXRpYWwgY2FsaWJyYXRpb24gc2V0ICovCiAJaHdfcGFyYW1zKHByaXYpLnNlbnMgPSAmaXdsNTE1MF9zZW5zaXRpdml0eTsKLQlod19wYXJhbXMocHJpdikuY2FsaWJfaW5pdF9jZmcgPQotCQlCSVQoSVdMX0NBTElCX0xPKQkJfAotCQlCSVQoSVdMX0NBTElCX1RYX0lRKQkJfAotCQlCSVQoSVdMX0NBTElCX0JBU0VfQkFORCk7Ci0JaWYgKHByaXYtPmNmZy0+bmVlZF9kY19jYWxpYikKLQkJaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnIHw9IEJJVChJV0xfQ0FMSUJfREMpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0yMzcsNyArMjIzLDcgQEAKIHN0YXRpYyB2b2lkIGl3bDUxNTBfdGVtcGVyYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCXUzMiB2dCA9IDA7Ci0JczMyIG9mZnNldCA9ICBpd2xfdGVtcF9jYWxpYl90b19vZmZzZXQocHJpdik7CisJczMyIG9mZnNldCA9ICBpd2xfdGVtcF9jYWxpYl90b19vZmZzZXQocHJpdi0+c2hyZCk7CiAKIAl2dCA9IGxlMzJfdG9fY3B1KHByaXYtPnN0YXRpc3RpY3MuY29tbW9uLnRlbXBlcmF0dXJlKTsKIAl2dCA9IHZ0IC8gSVdMXzUxNTBfVk9MVEFHRV9UT19URU1QRVJBVFVSRV9DT0VGRiArIG9mZnNldDsKQEAgLTM2NCw2ICszNTAsNyBAQAogCS53ZF90aW1lb3V0ID0gSVdMX0xPTkdfV0RfVElNRU9VVCwKIAkubWF4X2V2ZW50X2xvZ19zaXplID0gNTEyLAogCS5ub19pZGxlX3N1cHBvcnQgPSB0cnVlLAorCS53ZF9kaXNhYmxlID0gdHJ1ZSwKIH07CiBzdGF0aWMgc3RydWN0IGl3bF9odF9wYXJhbXMgaXdsNTAwMF9odF9wYXJhbXMgPSB7CiAJLmh0X2dyZWVuZmllbGRfc3VwcG9ydCA9IHRydWUsCkBAIC00MzMsNyArNDIwLDcgQEAKIAkuZWVwcm9tX2NhbGliX3ZlciA9IEVFUFJPTV81MDUwX1RYX1BPV0VSX1ZFUlNJT04sCVwKIAkubGliID0gJml3bDUxNTBfbGliLAkJCQkJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w1MDAwX2Jhc2VfcGFyYW1zLAkJCVwKLQkubmVlZF9kY19jYWxpYiA9IHRydWUsCQkJCQlcCisJLm5vX3h0YWxfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCQkJCVwKIAkuaW50ZXJuYWxfd2ltYXhfY29leCA9IHRydWUKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtNjAwMC5jCmluZGV4IGM4NDBjNzguLjU0Yjc1MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLTYwMDAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC02MDAwLmMKQEAgLTQ2LDExICs0NiwxMiBAQAogI2luY2x1ZGUgIml3bC1jZmcuaCIKIAogLyogSGlnaGVzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KLSNkZWZpbmUgSVdMNjAwMF9VQ09ERV9BUElfTUFYIDQKKyNkZWZpbmUgSVdMNjAwMF9VQ09ERV9BUElfTUFYIDYKICNkZWZpbmUgSVdMNjA1MF9VQ09ERV9BUElfTUFYIDUKICNkZWZpbmUgSVdMNjAwMEcyX1VDT0RFX0FQSV9NQVggNgogCiAvKiBPbGRlc3QgdmVyc2lvbiB3ZSB3b24ndCB3YXJuIGFib3V0ICovCisjZGVmaW5lIElXTDYwMDBfVUNPREVfQVBJX09LIDQKICNkZWZpbmUgSVdMNjAwMEcyX1VDT0RFX0FQSV9PSyA1CiAKIC8qIExvd2VzdCBmaXJtd2FyZSBBUEkgdmVyc2lvbiBzdXBwb3J0ZWQgKi8KQEAgLTgwLDcgKzgxLDcgQEAKIHN0YXRpYyB2b2lkIGl3bDYwNTBfYWRkaXRpb25hbF9uaWNfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIAkvKiBJbmRpY2F0ZSBjYWxpYnJhdGlvbiB2ZXJzaW9uIHRvIHVDb2RlLiAqLwotCWlmIChpd2xhZ25fZWVwcm9tX2NhbGliX3ZlcnNpb24ocHJpdikgPj0gNikKKwlpZiAoaXdsX2VlcHJvbV9jYWxpYl92ZXJzaW9uKHByaXYtPnNocmQpID49IDYpCiAJCWl3bF9zZXRfYml0KGJ1cyhwcml2KSwgQ1NSX0dQX0RSSVZFUl9SRUcsCiAJCQkJQ1NSX0dQX0RSSVZFUl9SRUdfQklUX0NBTElCX1ZFUlNJT042KTsKIH0KQEAgLTg4LDcgKzg5LDcgQEAKIHN0YXRpYyB2b2lkIGl3bDYxNTBfYWRkaXRpb25hbF9uaWNfY29uZmlnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIAkvKiBJbmRpY2F0ZSBjYWxpYnJhdGlvbiB2ZXJzaW9uIHRvIHVDb2RlLiAqLwotCWlmIChpd2xhZ25fZWVwcm9tX2NhbGliX3ZlcnNpb24ocHJpdikgPj0gNikKKwlpZiAoaXdsX2VlcHJvbV9jYWxpYl92ZXJzaW9uKHByaXYtPnNocmQpID49IDYpCiAJCWl3bF9zZXRfYml0KGJ1cyhwcml2KSwgQ1NSX0dQX0RSSVZFUl9SRUcsCiAJCQkJQ1NSX0dQX0RSSVZFUl9SRUdfQklUX0NBTElCX1ZFUlNJT042KTsKIAlpd2xfc2V0X2JpdChidXMocHJpdiksIENTUl9HUF9EUklWRVJfUkVHLApAQCAtMTAxLDE0ICsxMDIsMTQgQEAKIAlpd2xfcmZfY29uZmlnKHByaXYpOwogCiAJLyogbm8gbG9ja2luZyByZXF1aXJlZCBmb3IgcmVnaXN0ZXIgd3JpdGUgKi8KLQlpZiAocHJpdi0+Y2ZnLT5wYV90eXBlID09IElXTF9QQV9JTlRFUk5BTCkgeworCWlmIChjZmcocHJpdiktPnBhX3R5cGUgPT0gSVdMX1BBX0lOVEVSTkFMKSB7CiAJCS8qIDJ4MiBJUEEgcGh5IHR5cGUgKi8KIAkJaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfR1BfRFJJVkVSX1JFRywKIAkJCSAgICAgQ1NSX0dQX0RSSVZFUl9SRUdfQklUX1JBRElPX1NLVV8yeDJfSVBBKTsKIAl9CiAJLyogZG8gYWRkaXRpb25hbCBuaWMgY29uZmlndXJhdGlvbiBpZiBuZWVkZWQgKi8KLQlpZiAocHJpdi0+Y2ZnLT5hZGRpdGlvbmFsX25pY19jb25maWcpCi0JCQlwcml2LT5jZmctPmFkZGl0aW9uYWxfbmljX2NvbmZpZyhwcml2KTsKKwlpZiAoY2ZnKHByaXYpLT5hZGRpdGlvbmFsX25pY19jb25maWcpCisJCQljZmcocHJpdiktPmFkZGl0aW9uYWxfbmljX2NvbmZpZyhwcml2KTsKIH0KIAogc3RhdGljIHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzIGl3bDYwMDBfc2Vuc2l0aXZpdHkgPSB7CkBAIC0xNDAsMTAgKzE0MSwxMCBAQAogewogCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzID49IElXTF9NSU5fTlVNX1FVRVVFUyAmJgogCSAgICBpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzIDw9IElXTEFHTl9OVU1fUVVFVUVTKQotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzID0KKwkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlcyA9CiAJCQlpd2xhZ25fbW9kX3BhcmFtcy5udW1fb2ZfcXVldWVzOwogCi0JaHdfcGFyYW1zKHByaXYpLm1heF90eHFfbnVtID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bnVtX29mX3F1ZXVlczsKKwlod19wYXJhbXMocHJpdikubWF4X3R4cV9udW0gPSBjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5udW1fb2ZfcXVldWVzOwogCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmJjYXN0X3N0YV9pZCA9IElXTEFHTl9CUk9BRENBU1RfSUQ7CiAKIAlod19wYXJhbXMocHJpdikubWF4X2RhdGFfc2l6ZSA9IElXTDYwX1JUQ19EQVRBX1NJWkU7CkBAIC0xNTIsMjkgKzE1MywxOSBAQAogCWh3X3BhcmFtcyhwcml2KS5odDQwX2NoYW5uZWwgPSAgQklUKElFRUU4MDIxMV9CQU5EXzJHSFopIHwKIAkJCQkJQklUKElFRUU4MDIxMV9CQU5EXzVHSFopOwogCi0JaHdfcGFyYW1zKHByaXYpLnR4X2NoYWluc19udW0gPSBudW1fb2ZfYW50KHByaXYtPmNmZy0+dmFsaWRfdHhfYW50KTsKLQlpZiAocHJpdi0+Y2ZnLT5yeF93aXRoX3Npc29fZGl2ZXJzaXR5KQorCWh3X3BhcmFtcyhwcml2KS50eF9jaGFpbnNfbnVtID0gbnVtX29mX2FudChjZmcocHJpdiktPnZhbGlkX3R4X2FudCk7CisJaWYgKGNmZyhwcml2KS0+cnhfd2l0aF9zaXNvX2RpdmVyc2l0eSkKIAkJaHdfcGFyYW1zKHByaXYpLnJ4X2NoYWluc19udW0gPSAxOwogCWVsc2UKIAkJaHdfcGFyYW1zKHByaXYpLnJ4X2NoYWluc19udW0gPQotCQkJbnVtX29mX2FudChwcml2LT5jZmctPnZhbGlkX3J4X2FudCk7Ci0JaHdfcGFyYW1zKHByaXYpLnZhbGlkX3R4X2FudCA9IHByaXYtPmNmZy0+dmFsaWRfdHhfYW50OwotCWh3X3BhcmFtcyhwcml2KS52YWxpZF9yeF9hbnQgPSBwcml2LT5jZmctPnZhbGlkX3J4X2FudDsKKwkJCW51bV9vZl9hbnQoY2ZnKHByaXYpLT52YWxpZF9yeF9hbnQpOworCWh3X3BhcmFtcyhwcml2KS52YWxpZF90eF9hbnQgPSBjZmcocHJpdiktPnZhbGlkX3R4X2FudDsKKwlod19wYXJhbXMocHJpdikudmFsaWRfcnhfYW50ID0gY2ZnKHByaXYpLT52YWxpZF9yeF9hbnQ7CiAKIAlpd2w2MDAwX3NldF9jdF90aHJlc2hvbGQocHJpdik7CiAKIAkvKiBTZXQgaW5pdGlhbCBzZW5zaXRpdml0eSBwYXJhbWV0ZXJzICovCi0JLyogU2V0IGluaXRpYWwgY2FsaWJyYXRpb24gc2V0ICovCiAJaHdfcGFyYW1zKHByaXYpLnNlbnMgPSAmaXdsNjAwMF9zZW5zaXRpdml0eTsKLQlod19wYXJhbXMocHJpdikuY2FsaWJfaW5pdF9jZmcgPQotCQlCSVQoSVdMX0NBTElCX1hUQUwpCQl8Ci0JCUJJVChJV0xfQ0FMSUJfTE8pCQl8Ci0JCUJJVChJV0xfQ0FMSUJfVFhfSVEpCQl8Ci0JCUJJVChJV0xfQ0FMSUJfQkFTRV9CQU5EKTsKLQlpZiAocHJpdi0+Y2ZnLT5uZWVkX2RjX2NhbGliKQotCQlod19wYXJhbXMocHJpdikuY2FsaWJfcnRfY2ZnIHw9IElXTF9DQUxJQl9DRkdfRENfSURYOwotCWlmIChwcml2LT5jZmctPm5lZWRfdGVtcF9vZmZzZXRfY2FsaWIpCi0JCWh3X3BhcmFtcyhwcml2KS5jYWxpYl9pbml0X2NmZyB8PSBCSVQoSVdMX0NBTElCX1RFTVBfT0ZGU0VUKTsKIAogCXJldHVybiAwOwogfQpAQCAtMzY0LDcgKzM1NSw2IEBACiAJLmVlcHJvbV9jYWxpYl92ZXIgPSBFRVBST01fNjAwNV9UWF9QT1dFUl9WRVJTSU9OLAlcCiAJLmxpYiA9ICZpd2w2MDAwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNjAwMF9nMl9iYXNlX3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliID0gdHJ1ZSwJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUKIApAQCAtNDA2LDcgKzM5Niw2IEBACiAJLmxpYiA9ICZpd2w2MDMwX2xpYiwJCQkJCVwKIAkuYmFzZV9wYXJhbXMgPSAmaXdsNjAwMF9nMl9iYXNlX3BhcmFtcywJCQlcCiAJLmJ0X3BhcmFtcyA9ICZpd2w2MDAwX2J0X3BhcmFtcywJCQlcCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAkJCQkJXAogCS5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliID0gdHJ1ZSwJCQkJXAogCS5sZWRfbW9kZSA9IElXTF9MRURfUkZfU1RBVEUsCQkJCVwKIAkuYWR2X3BtID0gdHJ1ZQkJCQkJCVwKQEAgLTQzNCwyMSArNDIzLDExIEBACiB9OwogCiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDM1XzJhZ25fY2ZnID0gewotCS5uYW1lID0gIjYwMzUgU2VyaWVzIDJ4MiBBR04vQlQiLAorCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIEFkdmFuY2VkLU4gNjIzNSBBR04iLAogCUlXTF9ERVZJQ0VfNjAzMCwKIAkuaHRfcGFyYW1zID0gJml3bDYwMDBfaHRfcGFyYW1zLAogfTsKIAotc3RydWN0IGl3bF9jZmcgaXdsNjAzNV8yYWJnX2NmZyA9IHsKLQkubmFtZSA9ICI2MDM1IFNlcmllcyAyeDIgQUJHL0JUIiwKLQlJV0xfREVWSUNFXzYwMzAsCi19OwotCi1zdHJ1Y3QgaXdsX2NmZyBpd2w2MDM1XzJiZ19jZmcgPSB7Ci0JLm5hbWUgPSAiNjAzNSBTZXJpZXMgMngyIEJHL0JUIiwKLQlJV0xfREVWSUNFXzYwMzAsCi19OwotCiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDMwX2Jnbl9jZmcgPSB7CiAJLm5hbWUgPSAiSW50ZWwoUikgQ2VudHJpbm8oUikgV2lyZWxlc3MtTiAxMDMwIEJHTiIsCiAJSVdMX0RFVklDRV82MDMwLApAQCAtNDc5LDYgKzQ1OCw3IEBACiAjZGVmaW5lIElXTF9ERVZJQ0VfNjAwMGkJCQkJCVwKIAkuZndfbmFtZV9wcmUgPSBJV0w2MDAwX0ZXX1BSRSwJCQkJXAogCS51Y29kZV9hcGlfbWF4ID0gSVdMNjAwMF9VQ09ERV9BUElfTUFYLAkJCVwKKwkudWNvZGVfYXBpX29rID0gSVdMNjAwMF9VQ09ERV9BUElfT0ssCQkJXAogCS51Y29kZV9hcGlfbWluID0gSVdMNjAwMF9VQ09ERV9BUElfTUlOLAkJCVwKIAkudmFsaWRfdHhfYW50ID0gQU5UX0JDLAkJLyogLmNmZyBvdmVyd3JpdGUgKi8JXAogCS52YWxpZF9yeF9hbnQgPSBBTlRfQkMsCQkvKiAuY2ZnIG92ZXJ3cml0ZSAqLwlcCkBAIC01MTYsNyArNDk2LDYgQEAKIAkuZWVwcm9tX3ZlciA9IEVFUFJPTV82MDUwX0VFUFJPTV9WRVJTSU9OLAkJXAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYwNTBfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDUwX2Jhc2VfcGFyYW1zLAkJCVwKLQkubmVlZF9kY19jYWxpYiA9IHRydWUsCQkJCQlcCiAJLmxlZF9tb2RlID0gSVdMX0xFRF9CTElOSywJCQkJXAogCS5pbnRlcm5hbF93aW1heF9jb2V4ID0gdHJ1ZQogCkBAIC01NDAsNyArNTE5LDYgQEAKIAkuZWVwcm9tX3ZlciA9IEVFUFJPTV82MTUwX0VFUFJPTV9WRVJTSU9OLAkJXAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYxNTBfVFhfUE9XRVJfVkVSU0lPTiwJXAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDUwX2Jhc2VfcGFyYW1zLAkJCVwKLQkubmVlZF9kY19jYWxpYiA9IHRydWUsCQkJCQlcCiAJLmxlZF9tb2RlID0gSVdMX0xFRF9CTElOSywJCQkJXAogCS5pbnRlcm5hbF93aW1heF9jb2V4ID0gdHJ1ZQogCkBAIC01NTksMTcgKzUzNywxNyBAQAogCS5uYW1lID0gIkludGVsKFIpIENlbnRyaW5vKFIpIFVsdGltYXRlLU4gNjMwMCBBR04iLAogCS5md19uYW1lX3ByZSA9IElXTDYwMDBfRldfUFJFLAogCS51Y29kZV9hcGlfbWF4ID0gSVdMNjAwMF9VQ09ERV9BUElfTUFYLAorCS51Y29kZV9hcGlfb2sgPSBJV0w2MDAwX1VDT0RFX0FQSV9PSywKIAkudWNvZGVfYXBpX21pbiA9IElXTDYwMDBfVUNPREVfQVBJX01JTiwKIAkuZWVwcm9tX3ZlciA9IEVFUFJPTV82MDAwX0VFUFJPTV9WRVJTSU9OLAogCS5lZXByb21fY2FsaWJfdmVyID0gRUVQUk9NXzYwMDBfVFhfUE9XRVJfVkVSU0lPTiwKIAkubGliID0gJml3bDYwMDBfbGliLAogCS5iYXNlX3BhcmFtcyA9ICZpd2w2MDAwX2Jhc2VfcGFyYW1zLAogCS5odF9wYXJhbXMgPSAmaXdsNjAwMF9odF9wYXJhbXMsCi0JLm5lZWRfZGNfY2FsaWIgPSB0cnVlLAogCS5sZWRfbW9kZSA9IElXTF9MRURfQkxJTkssCiB9OwogCi1NT0RVTEVfRklSTVdBUkUoSVdMNjAwMF9NT0RVTEVfRklSTVdBUkUoSVdMNjAwMF9VQ09ERV9BUElfTUFYKSk7CitNT0RVTEVfRklSTVdBUkUoSVdMNjAwMF9NT0RVTEVfRklSTVdBUkUoSVdMNjAwMF9VQ09ERV9BUElfT0spKTsKIE1PRFVMRV9GSVJNV0FSRShJV0w2MDUwX01PRFVMRV9GSVJNV0FSRShJV0w2MDUwX1VDT0RFX0FQSV9NQVgpKTsKIE1PRFVMRV9GSVJNV0FSRShJV0w2MDA1X01PRFVMRV9GSVJNV0FSRShJV0w2MDAwRzJfVUNPREVfQVBJX01BWCkpOwogTU9EVUxFX0ZJUk1XQVJFKElXTDYwMzBfTU9EVUxFX0ZJUk1XQVJFKElXTDYwMDBHMl9VQ09ERV9BUElfTUFYKSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tY2FsaWIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5jCmluZGV4IDAzYmFjNDguLjUwZmY4NDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5jCkBAIC04Miw1NiArODIsNjQgQEAKIAl1MzIgYmVhY29uX2VuZXJneV9jOwogfTsKIAotaW50IGl3bF9zZW5kX2NhbGliX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQoraW50IGl3bF9zZW5kX2NhbGliX3Jlc3VsdHMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCiB7Ci0JaW50IHJldCA9IDA7Ci0JaW50IGkgPSAwOwotCiAJc3RydWN0IGl3bF9ob3N0X2NtZCBoY21kID0gewogCQkuaWQgPSBSRVBMWV9QSFlfQ0FMSUJSQVRJT05fQ01ELAogCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OworCXN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0ICpyZXM7CiAKLQlmb3IgKGkgPSAwOyBpIDwgSVdMX0NBTElCX01BWDsgaSsrKSB7Ci0JCWlmICgoQklUKGkpICYgaHdfcGFyYW1zKHByaXYpLmNhbGliX2luaXRfY2ZnKSAmJgotCQkgICAgcHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWYpIHsKLQkJCWhjbWQubGVuWzBdID0gcHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWZfbGVuOwotCQkJaGNtZC5kYXRhWzBdID0gcHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWY7Ci0JCQloY21kLmRhdGFmbGFnc1swXSA9IElXTF9IQ01EX0RGTF9OT0NPUFk7Ci0JCQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWQodHJhbnMocHJpdiksICZoY21kKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlJV0xfRVJSKHByaXYsICJFcnJvciAlZCBpdGVyYXRpb24gJWRcbiIsCi0JCQkJCXJldCwgaSk7Ci0JCQkJYnJlYWs7Ci0JCQl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXMsICZ0cmFucy0+Y2FsaWJfcmVzdWx0cywgbGlzdCkgeworCQlpbnQgcmV0OworCisJCWhjbWQubGVuWzBdID0gcmVzLT5jbWRfbGVuOworCQloY21kLmRhdGFbMF0gPSAmcmVzLT5oZHI7CisJCWhjbWQuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWTsKKwkJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kKHRyYW5zLCAmaGNtZCk7CisJCWlmIChyZXQpIHsKKwkJCUlXTF9FUlIodHJhbnMsICJFcnJvciAlZCBvbiBjYWxpYiBjbWQgJWRcbiIsCisJCQkJcmV0LCByZXMtPmhkci5vcF9jb2RlKTsKKwkJCXJldHVybiByZXQ7CiAJCX0KIAl9CiAKLQlyZXR1cm4gcmV0OwotfQotCi1pbnQgaXdsX2NhbGliX3NldChzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCAqcmVzLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKQotewotCWlmIChyZXMtPmJ1Zl9sZW4gIT0gbGVuKSB7Ci0JCWtmcmVlKHJlcy0+YnVmKTsKLQkJcmVzLT5idWYgPSBremFsbG9jKGxlbiwgR0ZQX0FUT01JQyk7Ci0JfQotCWlmICh1bmxpa2VseShyZXMtPmJ1ZiA9PSBOVUxMKSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXMtPmJ1Zl9sZW4gPSBsZW47Ci0JbWVtY3B5KHJlcy0+YnVmLCBidWYsIGxlbik7CiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaXdsX2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCitpbnQgaXdsX2NhbGliX3NldChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKKwkJICBjb25zdCBzdHJ1Y3QgaXdsX2NhbGliX2hkciAqY21kLCBpbnQgbGVuKQogewotCWludCBpOworCXN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0ICpyZXMsICp0bXA7CiAKLQlmb3IgKGkgPSAwOyBpIDwgSVdMX0NBTElCX01BWDsgaSsrKSB7Ci0JCWtmcmVlKHByaXYtPmNhbGliX3Jlc3VsdHNbaV0uYnVmKTsKLQkJcHJpdi0+Y2FsaWJfcmVzdWx0c1tpXS5idWYgPSBOVUxMOwotCQlwcml2LT5jYWxpYl9yZXN1bHRzW2ldLmJ1Zl9sZW4gPSAwOworCXJlcyA9IGttYWxsb2Moc2l6ZW9mKCpyZXMpICsgbGVuIC0gc2l6ZW9mKHN0cnVjdCBpd2xfY2FsaWJfaGRyKSwKKwkJICAgICAgR0ZQX0FUT01JQyk7CisJaWYgKCFyZXMpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweSgmcmVzLT5oZHIsIGNtZCwgbGVuKTsKKwlyZXMtPmNtZF9sZW4gPSBsZW47CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcCwgJnRyYW5zLT5jYWxpYl9yZXN1bHRzLCBsaXN0KSB7CisJCWlmICh0bXAtPmhkci5vcF9jb2RlID09IHJlcy0+aGRyLm9wX2NvZGUpIHsKKwkJCWxpc3RfcmVwbGFjZSgmdG1wLT5saXN0LCAmcmVzLT5saXN0KTsKKwkJCWtmcmVlKHRtcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCS8qIHdhc24ndCBpbiBsaXN0IGFscmVhZHkgKi8KKwlsaXN0X2FkZF90YWlsKCZyZXMtPmxpc3QsICZ0cmFucy0+Y2FsaWJfcmVzdWx0cyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpd2xfY2FsaWJfZnJlZV9yZXN1bHRzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBpd2xfY2FsaWJfcmVzdWx0ICpyZXMsICp0bXA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCB0bXAsICZ0cmFucy0+Y2FsaWJfcmVzdWx0cywgbGlzdCkgeworCQlsaXN0X2RlbCgmcmVzLT5saXN0KTsKKwkJa2ZyZWUocmVzKTsKIAl9CiB9CiAKQEAgLTUwNSw3ICs1MTMsNyBAQAogCiAJaXdsX3ByZXBhcmVfbGVnYWN5X3NlbnNpdGl2aXR5X3RibChwcml2LCBkYXRhLCAmY21kLmVuaGFuY2VfdGFibGVbMF0pOwogCi0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmhkX3YyKSB7CisJaWYgKGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPmhkX3YyKSB7CiAJCWNtZC5lbmhhbmNlX3RhYmxlW0hEX0lOQV9OT05fU1FVQVJFX0RFVF9PRkRNX0lOREVYXSA9CiAJCQlIRF9JTkFfTk9OX1NRVUFSRV9ERVRfT0ZETV9EQVRBX1YyOwogCQljbWQuZW5oYW5jZV90YWJsZVtIRF9JTkFfTk9OX1NRVUFSRV9ERVRfQ0NLX0lOREVYXSA9CkBAIC04MzksNyArODQ3LDcgQEAKIAkJCSAqIGNvbm5lY3QgdGhlIGZpcnN0IHZhbGlkIHR4IGNoYWluCiAJCQkgKi8KIAkJCWZpcnN0X2NoYWluID0KLQkJCQlmaW5kX2ZpcnN0X2NoYWluKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50KTsKKwkJCQlmaW5kX2ZpcnN0X2NoYWluKGNmZyhwcml2KS0+dmFsaWRfdHhfYW50KTsKIAkJCWRhdGEtPmRpc2Nvbm5fYXJyYXlbZmlyc3RfY2hhaW5dID0gMDsKIAkJCWFjdGl2ZV9jaGFpbnMgfD0gQklUKGZpcnN0X2NoYWluKTsKIAkJCUlXTF9ERUJVR19DQUxJQihwcml2LApAQCAtODgyLDcgKzg5MCw3IEBACiAJCQljb250aW51ZTsKIAkJfQogCi0JCWRlbHRhX2cgPSAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+Y2hhaW5fbm9pc2Vfc2NhbGUgKgorCQlkZWx0YV9nID0gKGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPmNoYWluX25vaXNlX3NjYWxlICoKIAkJCSgoczMyKWF2ZXJhZ2Vfbm9pc2VbZGVmYXVsdF9jaGFpbl0gLQogCQkJKHMzMilhdmVyYWdlX25vaXNlW2ldKSkgLyAxNTAwOwogCkBAIC0xMDM5LDggKzEwNDcsOCBAQAogCQlyZXR1cm47CiAKIAkvKiBBbmFseXplIHNpZ25hbCBmb3IgZGlzY29ubmVjdGVkIGFudGVubmEgKi8KLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKKwlpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKIAkJLyogRGlzYWJsZSBkaXNjb25uZWN0ZWQgYW50ZW5uYSBhbGdvcml0aG0gZm9yIGFkdmFuY2VkCiAJCSAgIGJ0IGNvZXgsIGFzc3VtaW5nIHZhbGlkIGFudGVubmFzIGFyZSBjb25uZWN0ZWQgKi8KIAkJZGF0YS0+YWN0aXZlX2NoYWlucyA9IGh3X3BhcmFtcyhwcml2KS52YWxpZF9yeF9hbnQ7CkBAIC0xMDc0LDcgKzEwODIsNyBAQAogCiAJaXdsYWduX2dhaW5fY29tcHV0YXRpb24ocHJpdiwgYXZlcmFnZV9ub2lzZSwKIAkJCQltaW5fYXZlcmFnZV9ub2lzZV9hbnRlbm5hX2ksIG1pbl9hdmVyYWdlX25vaXNlLAotCQkJCWZpbmRfZmlyc3RfY2hhaW4ocHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpKTsKKwkJCQlmaW5kX2ZpcnN0X2NoYWluKGNmZyhwcml2KS0+dmFsaWRfcnhfYW50KSk7CiAKIAkvKiBTb21lIHBvd2VyIGNoYW5nZXMgbWF5IGhhdmUgYmVlbiBtYWRlIGR1cmluZyB0aGUgY2FsaWJyYXRpb24uCiAJICogVXBkYXRlIGFuZCBjb21taXQgdGhlIFJYT04KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1jYWxpYi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmgKaW5kZXggYTg2OWZjOS4uMTAyNzVjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWNhbGliLmgKQEAgLTcyLDggKzcyLDQgQEAKIHZvaWQgaXdsX2luaXRfc2Vuc2l0aXZpdHkoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsX3Jlc2V0X3J1bl90aW1lX2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAKLWludCBpd2xfc2VuZF9jYWxpYl9yZXN1bHRzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsX2NhbGliX3NldChzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCAqcmVzLCBjb25zdCB1OCAqYnVmLCBpbnQgbGVuKTsKLXZvaWQgaXdsX2NhbGliX2ZyZWVfcmVzdWx0cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotCiAjZW5kaWYgLyogX19pd2xfY2FsaWJfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tbGliLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tbGliLmMKaW5kZXggMWE1MmVkMi4uNjRjZjQzOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLWxpYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1saWIuYwpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogCisjaW5jbHVkZSAiaXdsLXdpZmkuaCIKICNpbmNsdWRlICJpd2wtZGV2LmgiCiAjaW5jbHVkZSAiaXdsLWNvcmUuaCIKICNpbmNsdWRlICJpd2wtaW8uaCIKQEAgLTkyLDExICs5MywxMSBAQAogCWl3bF90dF9oYW5kbGVyKHByaXYpOwogfQogCi11MTYgaXdsYWduX2VlcHJvbV9jYWxpYl92ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3UxNiBpd2xfZWVwcm9tX2NhbGliX3ZlcnNpb24oc3RydWN0IGl3bF9zaGFyZWQgKnNocmQpCiB7CiAJc3RydWN0IGl3bF9lZXByb21fY2FsaWJfaGRyICpoZHI7CiAKLQloZHIgPSAoc3RydWN0IGl3bF9lZXByb21fY2FsaWJfaGRyICopaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsCisJaGRyID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2hkciAqKWl3bF9lZXByb21fcXVlcnlfYWRkcihzaHJkLAogCQkJCQkJCUVFUFJPTV9DQUxJQl9BTEwpOwogCXJldHVybiBoZHItPnZlcnNpb247CiAKQEAgLTEwNSw3ICsxMDYsNyBAQAogLyoKICAqIEVFUFJPTQogICovCi1zdGF0aWMgdTMyIGVlcHJvbV9pbmRpcmVjdF9hZGRyZXNzKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGFkZHJlc3MpCitzdGF0aWMgdTMyIGVlcHJvbV9pbmRpcmVjdF9hZGRyZXNzKGNvbnN0IHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkLCB1MzIgYWRkcmVzcykKIHsKIAl1MTYgb2Zmc2V0ID0gMDsKIApAQCAtMTE0LDMxICsxMTUsMzEgQEAKIAogCXN3aXRjaCAoYWRkcmVzcyAmIElORElSRUNUX1RZUEVfTVNLKSB7CiAJY2FzZSBJTkRJUkVDVF9IT1NUOgotCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX0xJTktfSE9TVCk7CisJCW9mZnNldCA9IGl3bF9lZXByb21fcXVlcnkxNihzaHJkLCBFRVBST01fTElOS19IT1NUKTsKIAkJYnJlYWs7CiAJY2FzZSBJTkRJUkVDVF9HRU5FUkFMOgotCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX0xJTktfR0VORVJBTCk7CisJCW9mZnNldCA9IGl3bF9lZXByb21fcXVlcnkxNihzaHJkLCBFRVBST01fTElOS19HRU5FUkFMKTsKIAkJYnJlYWs7CiAJY2FzZSBJTkRJUkVDVF9SRUdVTEFUT1JZOgotCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX0xJTktfUkVHVUxBVE9SWSk7CisJCW9mZnNldCA9IGl3bF9lZXByb21fcXVlcnkxNihzaHJkLCBFRVBST01fTElOS19SRUdVTEFUT1JZKTsKIAkJYnJlYWs7CiAJY2FzZSBJTkRJUkVDVF9UWFBfTElNSVQ6Ci0JCW9mZnNldCA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fTElOS19UWFBfTElNSVQpOworCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYoc2hyZCwgRUVQUk9NX0xJTktfVFhQX0xJTUlUKTsKIAkJYnJlYWs7CiAJY2FzZSBJTkRJUkVDVF9UWFBfTElNSVRfU0laRToKLQkJb2Zmc2V0ID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9MSU5LX1RYUF9MSU1JVF9TSVpFKTsKKwkJb2Zmc2V0ID0gaXdsX2VlcHJvbV9xdWVyeTE2KHNocmQsIEVFUFJPTV9MSU5LX1RYUF9MSU1JVF9TSVpFKTsKIAkJYnJlYWs7CiAJY2FzZSBJTkRJUkVDVF9DQUxJQlJBVElPTjoKLQkJb2Zmc2V0ID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9MSU5LX0NBTElCUkFUSU9OKTsKKwkJb2Zmc2V0ID0gaXdsX2VlcHJvbV9xdWVyeTE2KHNocmQsIEVFUFJPTV9MSU5LX0NBTElCUkFUSU9OKTsKIAkJYnJlYWs7CiAJY2FzZSBJTkRJUkVDVF9QUk9DRVNTX0FESlNUOgotCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX0xJTktfUFJPQ0VTU19BREpTVCk7CisJCW9mZnNldCA9IGl3bF9lZXByb21fcXVlcnkxNihzaHJkLCBFRVBST01fTElOS19QUk9DRVNTX0FESlNUKTsKIAkJYnJlYWs7CiAJY2FzZSBJTkRJUkVDVF9PVEhFUlM6Ci0JCW9mZnNldCA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fTElOS19PVEhFUlMpOworCQlvZmZzZXQgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYoc2hyZCwgRUVQUk9NX0xJTktfT1RIRVJTKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJSVdMX0VSUihwcml2LCAiaWxsZWdhbCBpbmRpcmVjdCB0eXBlOiAweCVYXG4iLAorCQlJV0xfRVJSKHNocmQtPnRyYW5zLCAiaWxsZWdhbCBpbmRpcmVjdCB0eXBlOiAweCVYXG4iLAogCQlhZGRyZXNzICYgSU5ESVJFQ1RfVFlQRV9NU0spOwogCQlicmVhazsKIAl9CkBAIC0xNDcsMTEgKzE0OCwxMSBAQAogCXJldHVybiAoYWRkcmVzcyAmIEFERFJFU1NfTVNLKSArIChvZmZzZXQgPDwgMSk7CiB9CiAKLWNvbnN0IHU4ICppd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCBzaXplX3Qgb2Zmc2V0KQorY29uc3QgdTggKml3bF9lZXByb21fcXVlcnlfYWRkcihjb25zdCBzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCwgc2l6ZV90IG9mZnNldCkKIHsKLQl1MzIgYWRkcmVzcyA9IGVlcHJvbV9pbmRpcmVjdF9hZGRyZXNzKHByaXYsIG9mZnNldCk7Ci0JQlVHX09OKGFkZHJlc3MgPj0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemUpOwotCXJldHVybiAmcHJpdi0+ZWVwcm9tW2FkZHJlc3NdOworCXUzMiBhZGRyZXNzID0gZWVwcm9tX2luZGlyZWN0X2FkZHJlc3Moc2hyZCwgb2Zmc2V0KTsKKwlCVUdfT04oYWRkcmVzcyA+PSBzaHJkLT5jZmctPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZSk7CisJcmV0dXJuICZzaHJkLT5lZXByb21bYWRkcmVzc107CiB9CiAKIHN0cnVjdCBpd2xfbW9kX3BhcmFtcyBpd2xhZ25fbW9kX3BhcmFtcyA9IHsKQEAgLTIzMiw3ICsyMzMsNyBAQAogCQkJCUlXTF9QQU5fU0NEX0JLX01TSyB8IElXTF9QQU5fU0NEX01HTVRfTVNLIHwKIAkJCQlJV0xfUEFOX1NDRF9NVUxUSUNBU1RfTVNLOwogCi0JaWYgKHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRSkKKwlpZiAoY2ZnKHByaXYpLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFKQogCQlmbHVzaF9jbWQuZmlmb19jb250cm9sIHw9IElXTF9BR0dfVFhfUVVFVUVfTVNLOwogCiAJSVdMX0RFQlVHX0lORk8ocHJpdiwgImZpZm8gcXVldWUgY29udHJvbDogMFgleFxuIiwKQEAgLTM3NCwxNSArMzc1LDE1IEBACiAJQlVJTERfQlVHX09OKHNpemVvZihpd2xhZ25fZGVmXzN3X2xvb2t1cCkgIT0KIAkJCXNpemVvZihiYXNpYy5idDNfbG9va3VwX3RhYmxlKSk7CiAKLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMpIHsKLQkJaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zLT5idF9zZXNzaW9uXzIpIHsKKwlpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMpIHsKKwkJaWYgKGNmZyhwcml2KS0+YnRfcGFyYW1zLT5idF9zZXNzaW9uXzIpIHsKIAkJCWJ0X2NtZF8yMDAwLnByaW9fYm9vc3QgPSBjcHVfdG9fbGUzMigKLQkJCQlwcml2LT5jZmctPmJ0X3BhcmFtcy0+YnRfcHJpb19ib29zdCk7CisJCQkJY2ZnKHByaXYpLT5idF9wYXJhbXMtPmJ0X3ByaW9fYm9vc3QpOwogCQkJYnRfY21kXzIwMDAudHhfcHJpb19ib29zdCA9IDA7CiAJCQlidF9jbWRfMjAwMC5yeF9wcmlvX2Jvb3N0ID0gMDsKIAkJfSBlbHNlIHsKIAkJCWJ0X2NtZF82MDAwLnByaW9fYm9vc3QgPQotCQkJCXByaXYtPmNmZy0+YnRfcGFyYW1zLT5idF9wcmlvX2Jvb3N0OworCQkJCWNmZyhwcml2KS0+YnRfcGFyYW1zLT5idF9wcmlvX2Jvb3N0OwogCQkJYnRfY21kXzYwMDAudHhfcHJpb19ib29zdCA9IDA7CiAJCQlidF9jbWRfNjAwMC5yeF9wcmlvX2Jvb3N0ID0gMDsKIAkJfQpAQCAtNDMwLDcgKzQzMSw3IEBACiAJCSAgICAgICBwcml2LT5idF9mdWxsX2NvbmN1cnJlbnQgPwogCQkgICAgICAgImZ1bGwgY29uY3VycmVuY3kiIDogIjMtd2lyZSIpOwogCi0JaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zLT5idF9zZXNzaW9uXzIpIHsKKwlpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMtPmJ0X3Nlc3Npb25fMikgewogCQltZW1jcHkoJmJ0X2NtZF8yMDAwLmJhc2ljLCAmYmFzaWMsCiAJCQlzaXplb2YoYmFzaWMpKTsKIAkJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucyhwcml2KSwgUkVQTFlfQlRfQ09ORklHLApAQCAtNzk5LDggKzgwMCw4IEBACiAgKi8KIHN0YXRpYyBpbnQgaXdsX2dldF9hY3RpdmVfcnhfY2hhaW5fY291bnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgorCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCSAgICBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgogCSAgICAocHJpdi0+YnRfZnVsbF9jb25jdXJyZW50IHx8CiAJICAgICBwcml2LT5idF90cmFmZmljX2xvYWQgPj0gSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0hJR0gpKSB7CiAJCS8qCkBAIC04MjcsNiArODI4LDcgQEAKIAljYXNlIElFRUU4MDIxMV9TTVBTX1NUQVRJQzoKIAljYXNlIElFRUU4MDIxMV9TTVBTX0RZTkFNSUM6CiAJCXJldHVybiBJV0xfTlVNX0lETEVfQ0hBSU5TX1NJTkdMRTsKKwljYXNlIElFRUU4MDIxMV9TTVBTX0FVVE9NQVRJQzoKIAljYXNlIElFRUU4MDIxMV9TTVBTX09GRjoKIAkJcmV0dXJuIGFjdGl2ZV9jbnQ7CiAJZGVmYXVsdDoKQEAgLTg3MCw4ICs4NzIsOCBAQAogCWVsc2UKIAkJYWN0aXZlX2NoYWlucyA9IGh3X3BhcmFtcyhwcml2KS52YWxpZF9yeF9hbnQ7CiAKLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKKwlpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKIAkgICAgKHByaXYtPmJ0X2Z1bGxfY29uY3VycmVudCB8fAogCSAgICAgcHJpdi0+YnRfdHJhZmZpY19sb2FkID49IElXTF9CVF9DT0VYX1RSQUZGSUNfTE9BRF9ISUdIKSkgewogCQkvKgpAQCAtOTMzLDUzICs5MzUsMzU5IEBACiAJcmV0dXJuIGFudDsKIH0KIAotLyogbm90aWZpY2F0aW9uIHdhaXQgc3VwcG9ydCAqLwotdm9pZCBpd2xhZ25faW5pdF9ub3RpZmljYXRpb25fd2FpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqd2FpdF9lbnRyeSwKLQkJCQkgICB1OCBjbWQsCi0JCQkJICAgdm9pZCAoKmZuKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QsCi0JCQkJCSAgICAgIHZvaWQgKmRhdGEpLAotCQkJCSAgIHZvaWQgKmZuX2RhdGEpCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCitzdGF0aWMgdm9pZCBpd2xhZ25fY29udmVydF9wMWsodTE2ICpwMWssIF9fbGUxNiAqb3V0KQogewotCXdhaXRfZW50cnktPmZuID0gZm47Ci0Jd2FpdF9lbnRyeS0+Zm5fZGF0YSA9IGZuX2RhdGE7Ci0Jd2FpdF9lbnRyeS0+Y21kID0gY21kOwotCXdhaXRfZW50cnktPnRyaWdnZXJlZCA9IGZhbHNlOwotCXdhaXRfZW50cnktPmFib3J0ZWQgPSBmYWxzZTsKKwlpbnQgaTsKIAotCXNwaW5fbG9ja19iaCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKLQlsaXN0X2FkZCgmd2FpdF9lbnRyeS0+bGlzdCwgJnByaXYtPm5vdGlmX3dhaXRzKTsKLQlzcGluX3VubG9ja19iaCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgSVdMQUdOX1AxS19TSVpFOyBpKyspCisJCW91dFtpXSA9IGNwdV90b19sZTE2KHAxa1tpXSk7CiB9CiAKLWludCBpd2xhZ25fd2FpdF9ub3RpZmljYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICBzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5LAotCQkJICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCitzdHJ1Y3Qgd293bGFuX2tleV9kYXRhIHsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OworCXN0cnVjdCBpd2xhZ25fd293bGFuX3JzY190c2NfcGFyYW1zX2NtZCAqcnNjX3RzYzsKKwlzdHJ1Y3QgaXdsYWduX3dvd2xhbl90a2lwX3BhcmFtc19jbWQgKnRraXA7CisJY29uc3QgdTggKmJzc2lkOworCWJvb2wgZXJyb3IsIHVzZV9yc2NfdHNjLCB1c2VfdGtpcDsKK307CisKKworc3RhdGljIHZvaWQgaXdsYWduX3dvd2xhbl9wcm9ncmFtX2tleXMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSwKKwkJCSAgICAgICB2b2lkICpfZGF0YSkKIHsKLQlpbnQgcmV0OworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCB3b3dsYW5fa2V5X2RhdGEgKmRhdGEgPSBfZGF0YTsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gZGF0YS0+Y3R4OworCXN0cnVjdCBhZXNfc2MgKmFlc19zYywgKmFlc190eF9zYyA9IE5VTEw7CisJc3RydWN0IHRraXBfc2MgKnRraXBfc2MsICp0a2lwX3R4X3NjID0gTlVMTDsKKwlzdHJ1Y3QgaXdsYWduX3Axa19jYWNoZSAqcnhfcDFrczsKKwl1OCAqcnhfbWljX2tleTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2tleV9zZXEgc2VxOworCXUzMiBjdXJfcnhfaXYzMiA9IDA7CisJdTE2IHAxa1tJV0xBR05fUDFLX1NJWkVdOworCWludCByZXQsIGk7CiAKLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocHJpdi0+bm90aWZfd2FpdHEsCi0JCQkJIHdhaXRfZW50cnktPnRyaWdnZXJlZCB8fCB3YWl0X2VudHJ5LT5hYm9ydGVkLAotCQkJCSB0aW1lb3V0KTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CiAKLQlzcGluX2xvY2tfYmgoJnByaXYtPm5vdGlmX3dhaXRfbG9jayk7Ci0JbGlzdF9kZWwoJndhaXRfZW50cnktPmxpc3QpOwotCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5ub3RpZl93YWl0X2xvY2spOworCWlmICgoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDAgfHwKKwkgICAgIGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNCkgJiYKKwkgICAgICFzdGEgJiYgIWN0eC0+a2V5X21hcHBpbmdfa2V5cykKKwkJcmV0ID0gaXdsX3NldF9kZWZhdWx0X3dlcF9rZXkocHJpdiwgY3R4LCBrZXkpOworCWVsc2UKKwkJcmV0ID0gaXdsX3NldF9keW5hbWljX2tleShwcml2LCBjdHgsIGtleSwgc3RhKTsKIAotCWlmICh3YWl0X2VudHJ5LT5hYm9ydGVkKQotCQlyZXR1cm4gLUVJTzsKKwlpZiAocmV0KSB7CisJCUlXTF9FUlIocHJpdiwgIkVycm9yIHNldHRpbmcga2V5IGR1cmluZyBzdXNwZW5kIVxuIik7CisJCWRhdGEtPmVycm9yID0gdHJ1ZTsKKwl9CiAKLQkvKiByZXR1cm4gdmFsdWUgaXMgYWx3YXlzID49IDAgKi8KLQlpZiAocmV0IDw9IDApCi0JCXJldHVybiAtRVRJTUVET1VUOwotCXJldHVybiAwOworCXN3aXRjaCAoa2V5LT5jaXBoZXIpIHsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CisJCWlmIChzdGEpIHsKKwkJCXRraXBfc2MgPSBkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy50a2lwLnVuaWNhc3RfcnNjOworCQkJdGtpcF90eF9zYyA9ICZkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy50a2lwLnRzYzsKKworCQkJcnhfcDFrcyA9IGRhdGEtPnRraXAtPnJ4X3VuaTsKKworCQkJaWVlZTgwMjExX2dldF9rZXlfdHhfc2VxKGtleSwgJnNlcSk7CisJCQl0a2lwX3R4X3NjLT5pdjE2ID0gY3B1X3RvX2xlMTYoc2VxLnRraXAuaXYxNik7CisJCQl0a2lwX3R4X3NjLT5pdjMyID0gY3B1X3RvX2xlMzIoc2VxLnRraXAuaXYzMik7CisKKwkJCWllZWU4MDIxMV9nZXRfdGtpcF9wMWtfaXYoa2V5LCBzZXEudGtpcC5pdjMyLCBwMWspOworCQkJaXdsYWduX2NvbnZlcnRfcDFrKHAxaywgZGF0YS0+dGtpcC0+dHgucDFrKTsKKworCQkJbWVtY3B5KGRhdGEtPnRraXAtPm1pY19rZXlzLnR4LAorCQkJICAgICAgICZrZXktPmtleVtOTDgwMjExX1RLSVBfREFUQV9PRkZTRVRfVFhfTUlDX0tFWV0sCisJCQkgICAgICAgSVdMQUdOX01JQ19LRVlfU0laRSk7CisKKwkJCXJ4X21pY19rZXkgPSBkYXRhLT50a2lwLT5taWNfa2V5cy5yeF91bmljYXN0OworCQl9IGVsc2UgeworCQkJdGtpcF9zYyA9CisJCQkJZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MudGtpcC5tdWx0aWNhc3RfcnNjOworCQkJcnhfcDFrcyA9IGRhdGEtPnRraXAtPnJ4X211bHRpOworCQkJcnhfbWljX2tleSA9IGRhdGEtPnRraXAtPm1pY19rZXlzLnJ4X21jYXN0OworCQl9CisKKwkJLyoKKwkJICogRm9yIG5vbi1Rb1MgdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBib3RoIHRoZSB1Q29kZSBhbmQKKwkJICogbWFjODAyMTEgdXNlIFRJRCAwIChhcyB0aGV5IG5lZWQgdG8gdG8gYXZvaWQgcmVwbGF5IGF0dGFja3MpCisJCSAqIGZvciBjaGVja2luZyB0aGUgSVYgaW4gdGhlIGZyYW1lcy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBJV0xBR05fTlVNX1JTQzsgaSsrKSB7CisJCQlpZWVlODAyMTFfZ2V0X2tleV9yeF9zZXEoa2V5LCBpLCAmc2VxKTsKKwkJCXRraXBfc2NbaV0uaXYxNiA9IGNwdV90b19sZTE2KHNlcS50a2lwLml2MTYpOworCQkJdGtpcF9zY1tpXS5pdjMyID0gY3B1X3RvX2xlMzIoc2VxLnRraXAuaXYzMik7CisJCQkvKiB3cmFwcGluZyBpc24ndCBhbGxvd2VkLCBBUCBtdXN0IHJla2V5ICovCisJCQlpZiAoc2VxLnRraXAuaXYzMiA+IGN1cl9yeF9pdjMyKQorCQkJCWN1cl9yeF9pdjMyID0gc2VxLnRraXAuaXYzMjsKKwkJfQorCisJCWllZWU4MDIxMV9nZXRfdGtpcF9yeF9wMWsoa2V5LCBkYXRhLT5ic3NpZCwgY3VyX3J4X2l2MzIsIHAxayk7CisJCWl3bGFnbl9jb252ZXJ0X3AxayhwMWssIHJ4X3Axa3NbMF0ucDFrKTsKKwkJaWVlZTgwMjExX2dldF90a2lwX3J4X3AxayhrZXksIGRhdGEtPmJzc2lkLAorCQkJCQkgIGN1cl9yeF9pdjMyICsgMSwgcDFrKTsKKwkJaXdsYWduX2NvbnZlcnRfcDFrKHAxaywgcnhfcDFrc1sxXS5wMWspOworCisJCW1lbWNweShyeF9taWNfa2V5LAorCQkgICAgICAgJmtleS0+a2V5W05MODAyMTFfVEtJUF9EQVRBX09GRlNFVF9SWF9NSUNfS0VZXSwKKwkJICAgICAgIElXTEFHTl9NSUNfS0VZX1NJWkUpOworCisJCWRhdGEtPnVzZV90a2lwID0gdHJ1ZTsKKwkJZGF0YS0+dXNlX3JzY190c2MgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CisJCWlmIChzdGEpIHsKKwkJCXU4ICpwbiA9IHNlcS5jY21wLnBuOworCisJCQlhZXNfc2MgPSBkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy5hZXMudW5pY2FzdF9yc2M7CisJCQlhZXNfdHhfc2MgPSAmZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MuYWVzLnRzYzsKKworCQkJaWVlZTgwMjExX2dldF9rZXlfdHhfc2VxKGtleSwgJnNlcSk7CisJCQlhZXNfdHhfc2MtPnBuID0gY3B1X3RvX2xlNjQoCisJCQkJCSh1NjQpcG5bNV0gfAorCQkJCQkoKHU2NClwbls0XSA8PCA4KSB8CisJCQkJCSgodTY0KXBuWzNdIDw8IDE2KSB8CisJCQkJCSgodTY0KXBuWzJdIDw8IDI0KSB8CisJCQkJCSgodTY0KXBuWzFdIDw8IDMyKSB8CisJCQkJCSgodTY0KXBuWzBdIDw8IDQwKSk7CisJCX0gZWxzZQorCQkJYWVzX3NjID0gZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MuYWVzLm11bHRpY2FzdF9yc2M7CisKKwkJLyoKKwkJICogRm9yIG5vbi1Rb1MgdGhpcyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCBib3RoIHRoZSB1Q29kZSBhbmQKKwkJICogbWFjODAyMTEgdXNlIFRJRCAwIGZvciBjaGVja2luZyB0aGUgSVYgaW4gdGhlIGZyYW1lcy4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBJV0xBR05fTlVNX1JTQzsgaSsrKSB7CisJCQl1OCAqcG4gPSBzZXEuY2NtcC5wbjsKKworCQkJaWVlZTgwMjExX2dldF9rZXlfcnhfc2VxKGtleSwgaSwgJnNlcSk7CisJCQlhZXNfc2MtPnBuID0gY3B1X3RvX2xlNjQoCisJCQkJCSh1NjQpcG5bNV0gfAorCQkJCQkoKHU2NClwbls0XSA8PCA4KSB8CisJCQkJCSgodTY0KXBuWzNdIDw8IDE2KSB8CisJCQkJCSgodTY0KXBuWzJdIDw8IDI0KSB8CisJCQkJCSgodTY0KXBuWzFdIDw8IDMyKSB8CisJCQkJCSgodTY0KXBuWzBdIDw8IDQwKSk7CisJCX0KKwkJZGF0YS0+dXNlX3JzY190c2MgPSB0cnVlOworCQlicmVhazsKKwl9CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKIH0KIAotdm9pZCBpd2xhZ25fcmVtb3ZlX25vdGlmaWNhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqd2FpdF9lbnRyeSkKK2ludCBpd2xhZ25fc2VuZF9wYXR0ZXJucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQlzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3dsYW4pCiB7Ci0Jc3Bpbl9sb2NrX2JoKCZwcml2LT5ub3RpZl93YWl0X2xvY2spOwotCWxpc3RfZGVsKCZ3YWl0X2VudHJ5LT5saXN0KTsKLQlzcGluX3VubG9ja19iaCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKKwlzdHJ1Y3QgaXdsYWduX3dvd2xhbl9wYXR0ZXJuc19jbWQgKnBhdHRlcm5fY21kOworCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBSRVBMWV9XT1dMQU5fUEFUVEVSTlMsCisJCS5kYXRhZmxhZ3NbMF0gPSBJV0xfSENNRF9ERkxfTk9DT1BZLAorCQkuZmxhZ3MgPSBDTURfU1lOQywKKwl9OworCWludCBpLCBlcnI7CisKKwlpZiAoIXdvd2xhbi0+bl9wYXR0ZXJucykKKwkJcmV0dXJuIDA7CisKKwljbWQubGVuWzBdID0gc2l6ZW9mKCpwYXR0ZXJuX2NtZCkgKworCQl3b3dsYW4tPm5fcGF0dGVybnMgKiBzaXplb2Yoc3RydWN0IGl3bGFnbl93b3dsYW5fcGF0dGVybik7CisKKwlwYXR0ZXJuX2NtZCA9IGttYWxsb2MoY21kLmxlblswXSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwYXR0ZXJuX2NtZCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwYXR0ZXJuX2NtZC0+bl9wYXR0ZXJucyA9IGNwdV90b19sZTMyKHdvd2xhbi0+bl9wYXR0ZXJucyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgd293bGFuLT5uX3BhdHRlcm5zOyBpKyspIHsKKwkJaW50IG1hc2tfbGVuID0gRElWX1JPVU5EX1VQKHdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW4sIDgpOworCisJCW1lbWNweSgmcGF0dGVybl9jbWQtPnBhdHRlcm5zW2ldLm1hc2ssCisJCQl3b3dsYW4tPnBhdHRlcm5zW2ldLm1hc2ssIG1hc2tfbGVuKTsKKwkJbWVtY3B5KCZwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ucGF0dGVybiwKKwkJCXdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybiwKKwkJCXdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW4pOworCQlwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ubWFza19zaXplID0gbWFza19sZW47CisJCXBhdHRlcm5fY21kLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX3NpemUgPQorCQkJd293bGFuLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX2xlbjsKKwl9CisKKwljbWQuZGF0YVswXSA9IHBhdHRlcm5fY21kOworCWVyciA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJmNtZCk7CisJa2ZyZWUocGF0dGVybl9jbWQpOworCXJldHVybiBlcnI7CiB9CisKK2ludCBpd2xhZ25fc3VzcGVuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3dsYW4pCit7CisJc3RydWN0IGl3bGFnbl93b3dsYW5fd2FrZXVwX2ZpbHRlcl9jbWQgd2FrZXVwX2ZpbHRlcl9jbWQ7CisJc3RydWN0IGl3bF9yeG9uX2NtZCByeG9uOworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CisJc3RydWN0IGl3bGFnbl93b3dsYW5fa2VrX2tja19tYXRlcmlhbF9jbWQga2VrX2tja19jbWQ7CisJc3RydWN0IGl3bGFnbl93b3dsYW5fdGtpcF9wYXJhbXNfY21kIHRraXBfY21kID0ge307CisJc3RydWN0IGl3bGFnbl9kM19jb25maWdfY21kIGQzX2NmZ19jbWQgPSB7fTsKKwlzdHJ1Y3Qgd293bGFuX2tleV9kYXRhIGtleV9kYXRhID0geworCQkuY3R4ID0gY3R4LAorCQkuYnNzaWQgPSBjdHgtPmFjdGl2ZS5ic3NpZF9hZGRyLAorCQkudXNlX3JzY190c2MgPSBmYWxzZSwKKwkJLnRraXAgPSAmdGtpcF9jbWQsCisJCS51c2VfdGtpcCA9IGZhbHNlLAorCX07CisJaW50IHJldCwgaTsKKwl1MTYgc2VxOworCisJa2V5X2RhdGEucnNjX3RzYyA9IGt6YWxsb2Moc2l6ZW9mKCprZXlfZGF0YS5yc2NfdHNjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFrZXlfZGF0YS5yc2NfdHNjKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW1lbXNldCgmd2FrZXVwX2ZpbHRlcl9jbWQsIDAsIHNpemVvZih3YWtldXBfZmlsdGVyX2NtZCkpOworCisJLyoKKwkgKiBXZSBrbm93IHRoZSBsYXN0IHVzZWQgc2Vxbm8sIGFuZCB0aGUgdUNvZGUgZXhwZWN0cyB0byBrbm93IHRoYXQKKwkgKiBvbmUsIGl0IHdpbGwgaW5jcmVtZW50IGJlZm9yZSBUWC4KKwkgKi8KKwlzZXEgPSBsZTE2X3RvX2NwdShwcml2LT5sYXN0X3NlcV9jdGwpICYgSUVFRTgwMjExX1NDVExfU0VROworCXdha2V1cF9maWx0ZXJfY21kLm5vbl9xb3Nfc2VxID0gY3B1X3RvX2xlMTYoc2VxKTsKKworCS8qCisJICogRm9yIFFvUyBjb3VudGVycywgd2Ugc3RvcmUgdGhlIG9uZSB0byB1c2UgbmV4dCwgc28gc3VidHJhY3QgMHgxMAorCSAqIHNpbmNlIHRoZSB1Q29kZSB3aWxsIGFkZCAweDEwIGJlZm9yZSB1c2luZyB0aGUgdmFsdWUuCisJICovCisJZm9yIChpID0gMDsgaSA8IElXTF9NQVhfVElEX0NPVU5UOyBpKyspIHsKKwkJc2VxID0gcHJpdi0+dGlkX2RhdGFbSVdMX0FQX0lEXVtpXS5zZXFfbnVtYmVyOworCQlzZXEgLT0gMHgxMDsKKwkJd2FrZXVwX2ZpbHRlcl9jbWQucW9zX3NlcVtpXSA9IGNwdV90b19sZTE2KHNlcSk7CisJfQorCisJaWYgKHdvd2xhbi0+ZGlzY29ubmVjdCkKKwkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQorCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfQkVBQ09OX01JU1MgfAorCQkJCSAgICBJV0xBR05fV09XTEFOX1dBS0VVUF9MSU5LX0NIQU5HRSk7CisJaWYgKHdvd2xhbi0+bWFnaWNfcGt0KQorCQl3YWtldXBfZmlsdGVyX2NtZC5lbmFibGVkIHw9CisJCQljcHVfdG9fbGUzMihJV0xBR05fV09XTEFOX1dBS0VVUF9NQUdJQ19QQUNLRVQpOworCWlmICh3b3dsYW4tPmd0a19yZWtleV9mYWlsdXJlKQorCQl3YWtldXBfZmlsdGVyX2NtZC5lbmFibGVkIHw9CisJCQljcHVfdG9fbGUzMihJV0xBR05fV09XTEFOX1dBS0VVUF9HVEtfUkVLRVlfRkFJTCk7CisJaWYgKHdvd2xhbi0+ZWFwX2lkZW50aXR5X3JlcSkKKwkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQorCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfRUFQX0lERU5UX1JFUSk7CisJaWYgKHdvd2xhbi0+Zm91cl93YXlfaGFuZHNoYWtlKQorCQl3YWtldXBfZmlsdGVyX2NtZC5lbmFibGVkIHw9CisJCQljcHVfdG9fbGUzMihJV0xBR05fV09XTEFOX1dBS0VVUF80V0FZX0hBTkRTSEFLRSk7CisJaWYgKHdvd2xhbi0+bl9wYXR0ZXJucykKKwkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQorCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfUEFUVEVSTl9NQVRDSCk7CisKKwlpZiAod293bGFuLT5yZmtpbGxfcmVsZWFzZSkKKwkJZDNfY2ZnX2NtZC53YWtldXBfZmxhZ3MgfD0KKwkJCWNwdV90b19sZTMyKElXTEFHTl9EM19XQUtFVVBfUkZLSUxMKTsKKworCWl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDIwMCk7CisKKwltZW1jcHkoJnJ4b24sICZjdHgtPmFjdGl2ZSwgc2l6ZW9mKHJ4b24pKTsKKworCWl3bF90cmFuc19zdG9wX2RldmljZSh0cmFucyhwcml2KSk7CisKKwlwcml2LT5zaHJkLT53b3dsYW4gPSB0cnVlOworCisJcmV0ID0gaXdsX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZSh0cmFucyhwcml2KSwgSVdMX1VDT0RFX1dPV0xBTik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwkvKiBub3cgY29uZmlndXJlIFdvV0xBTiB1Y29kZSAqLworCXJldCA9IGl3bF9hbGl2ZV9zdGFydChwcml2KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCW1lbWNweSgmY3R4LT5zdGFnaW5nLCAmcnhvbiwgc2l6ZW9mKHJ4b24pKTsKKwlyZXQgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGl3bF9wb3dlcl91cGRhdGVfbW9kZShwcml2LCB0cnVlKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmICghaXdsYWduX21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7CisJCS8qIG1hcmsgYWxsIGtleXMgY2xlYXIgKi8KKwkJcHJpdi0+dWNvZGVfa2V5X3RhYmxlID0gMDsKKwkJY3R4LT5rZXlfbWFwcGluZ19rZXlzID0gMDsKKworCQkvKgorCQkgKiBUaGlzIG5lZWRzIHRvIGJlIHVubG9ja2VkIGR1ZSB0byBsb2NrIG9yZGVyaW5nCisJCSAqIGNvbnN0cmFpbnRzLiBTaW5jZSB3ZSdyZSBpbiB0aGUgc3VzcGVuZCBwYXRoCisJCSAqIHRoYXQgaXNuJ3QgcmVhbGx5IGEgcHJvYmxlbSB0aG91Z2guCisJCSAqLworCQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwkJaWVlZTgwMjExX2l0ZXJfa2V5cyhwcml2LT5odywgY3R4LT52aWYsCisJCQkJICAgIGl3bGFnbl93b3dsYW5fcHJvZ3JhbV9rZXlzLAorCQkJCSAgICAma2V5X2RhdGEpOworCQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJCWlmIChrZXlfZGF0YS5lcnJvcikgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGtleV9kYXRhLnVzZV9yc2NfdHNjKSB7CisJCQlzdHJ1Y3QgaXdsX2hvc3RfY21kIHJzY190c2NfY21kID0geworCQkJCS5pZCA9IFJFUExZX1dPV0xBTl9UU0NfUlNDX1BBUkFNUywKKwkJCQkuZmxhZ3MgPSBDTURfU1lOQywKKwkJCQkuZGF0YVswXSA9IGtleV9kYXRhLnJzY190c2MsCisJCQkJLmRhdGFmbGFnc1swXSA9IElXTF9IQ01EX0RGTF9OT0NPUFksCisJCQkJLmxlblswXSA9IHNpemVvZihrZXlfZGF0YS5yc2NfdHNjKSwKKwkJCX07CisKKwkJCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJnJzY190c2NfY21kKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoa2V5X2RhdGEudXNlX3RraXApIHsKKwkJCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZF9wZHUodHJhbnMocHJpdiksCisJCQkJCQkgUkVQTFlfV09XTEFOX1RLSVBfUEFSQU1TLAorCQkJCQkJIENNRF9TWU5DLCBzaXplb2YodGtpcF9jbWQpLAorCQkJCQkJICZ0a2lwX2NtZCk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHByaXYtPmhhdmVfcmVrZXlfZGF0YSkgeworCQkJbWVtc2V0KCZrZWtfa2NrX2NtZCwgMCwgc2l6ZW9mKGtla19rY2tfY21kKSk7CisJCQltZW1jcHkoa2VrX2tja19jbWQua2NrLCBwcml2LT5rY2ssIE5MODAyMTFfS0NLX0xFTik7CisJCQlrZWtfa2NrX2NtZC5rY2tfbGVuID0gY3B1X3RvX2xlMTYoTkw4MDIxMV9LQ0tfTEVOKTsKKwkJCW1lbWNweShrZWtfa2NrX2NtZC5rZWssIHByaXYtPmtlaywgTkw4MDIxMV9LRUtfTEVOKTsKKwkJCWtla19rY2tfY21kLmtla19sZW4gPSBjcHVfdG9fbGUxNihOTDgwMjExX0tFS19MRU4pOworCQkJa2VrX2tja19jbWQucmVwbGF5X2N0ciA9IHByaXYtPnJlcGxheV9jdHI7CisKKwkJCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZF9wZHUodHJhbnMocHJpdiksCisJCQkJCQkgUkVQTFlfV09XTEFOX0tFS19LQ0tfTUFURVJJQUwsCisJCQkJCQkgQ01EX1NZTkMsIHNpemVvZihrZWtfa2NrX2NtZCksCisJCQkJCQkgJmtla19rY2tfY21kKTsKKwkJCWlmIChyZXQpCisJCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLCBSRVBMWV9EM19DT05GSUcsIENNRF9TWU5DLAorCQkJCSAgICAgc2l6ZW9mKGQzX2NmZ19jbWQpLCAmZDNfY2ZnX2NtZCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLCBSRVBMWV9XT1dMQU5fV0FLRVVQX0ZJTFRFUiwKKwkJCQkgQ01EX1NZTkMsIHNpemVvZih3YWtldXBfZmlsdGVyX2NtZCksCisJCQkJICZ3YWtldXBfZmlsdGVyX2NtZCk7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpd2xhZ25fc2VuZF9wYXR0ZXJucyhwcml2LCB3b3dsYW4pOworIG91dDoKKwlrZnJlZShrZXlfZGF0YS5yc2NfdHNjKTsKKwlyZXR1cm4gcmV0OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ycy5jCmluZGV4IDY2MTE4Y2UuLjMzNGI1YWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ycy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ycy5jCkBAIC0yOTgsNyArMjk4LDcgQEAKIAl9IGVsc2UKIAkJcmV0dXJuIElXTF9NQVhfVElEX0NPVU5UOwogCi0JaWYgKHVubGlrZWx5KHRpZCA+PSBUSURfTUFYX0xPQURfQ09VTlQpKQorCWlmICh1bmxpa2VseSh0aWQgPj0gSVdMX01BWF9USURfQ09VTlQpKQogCQlyZXR1cm4gSVdMX01BWF9USURfQ09VTlQ7CiAKIAl0bCA9ICZscV9kYXRhLT5sb2FkW3RpZF07CkBAIC0zNTIsNyArMzUyLDcgQEAKIAlscV9zdGEtPmFjdGl2ZV9taW1vMl9yYXRlICA9IDB4MUZEMDsJLyogNiAtIDYwIE1CaXRzLCBubyA5LCBubyBDQ0sgKi8KIAlscV9zdGEtPmFjdGl2ZV9taW1vM19yYXRlICA9IDB4MUZEMDsJLyogNiAtIDYwIE1CaXRzLCBubyA5LCBubyBDQ0sgKi8KIAotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9TVlRPT0wKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVEVTVE1PREUKIAkvKiB0ZXN0bW9kZSBoYXMgaGlnaGVyIHByaW9yaXR5IHRvIG92ZXJ3aXJ0ZSB0aGUgZml4ZWQgcmF0ZSAqLwogCWlmIChwcml2LT50bV9maXhlZF9yYXRlKQogCQlscV9zdGEtPmRiZ19maXhlZF9yYXRlID0gcHJpdi0+dG1fZml4ZWRfcmF0ZTsKQEAgLTM3OSw3ICszNzksNyBAQAogCXMzMiBpbmRleDsKIAlzdHJ1Y3QgaXdsX3RyYWZmaWNfbG9hZCAqdGwgPSBOVUxMOwogCi0JaWYgKHRpZCA+PSBUSURfTUFYX0xPQURfQ09VTlQpCisJaWYgKHRpZCA+PSBJV0xfTUFYX1RJRF9DT1VOVCkKIAkJcmV0dXJuIDA7CiAKIAl0bCA9ICYobHFfZGF0YS0+bG9hZFt0aWRdKTsKQEAgLTQ0NCwxMSArNDQ0LDExIEBACiAJCQkgICAgICBzdHJ1Y3QgaXdsX2xxX3N0YSAqbHFfZGF0YSwKIAkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCiB7Ci0JaWYgKHRpZCA8IFRJRF9NQVhfTE9BRF9DT1VOVCkKKwlpZiAodGlkIDwgSVdMX01BWF9USURfQ09VTlQpCiAJCXJzX3RsX3R1cm5fb25fYWdnX2Zvcl90aWQocHJpdiwgbHFfZGF0YSwgdGlkLCBzdGEpOwogCWVsc2UKLQkJSVdMX0VSUihwcml2LCAidGlkIGV4Y2VlZHMgbWF4IGxvYWQgY291bnQ6ICVkLyVkXG4iLAotCQkJdGlkLCBUSURfTUFYX0xPQURfQ09VTlQpOworCQlJV0xfRVJSKHByaXYsICJ0aWQgZXhjZWVkcyBtYXggVElEIGNvdW50OiAlZC8lZFxuIiwKKwkJCXRpZCwgSVdMX01BWF9USURfQ09VTlQpOwogfQogCiBzdGF0aWMgaW5saW5lIGludCBnZXRfbnVtX29mX2FudF9mcm9tX3JhdGUodTMyIHJhdGVfbl9mbGFncykKQEAgLTEwODEsMTIgKzEwODEsMTIgQEAKIAlpZiAoc3RhICYmIHN0YS0+c3VwcF9yYXRlc1tzYmFuZC0+YmFuZF0pCiAJCXJzX3JhdGVfc2NhbGVfcGVyZm9ybShwcml2LCBza2IsIHN0YSwgbHFfc3RhKTsKIAotI2lmIGRlZmluZWQoQ09ORklHX01BQzgwMjExX0RFQlVHRlMpICYmIGRlZmluZWQoQ09ORklHX0lXTFdJRklfREVWSUNFX1NWVE9PTCkKKyNpZiBkZWZpbmVkKENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTKSAmJiBkZWZpbmVkKENPTkZJR19JV0xXSUZJX0RFVklDRV9URVNUTU9ERSkKIAlpZiAoKHByaXYtPnRtX2ZpeGVkX3JhdGUpICYmCiAJICAgIChwcml2LT50bV9maXhlZF9yYXRlICE9IGxxX3N0YS0+ZGJnX2ZpeGVkX3JhdGUpKQogCQlyc19wcm9ncmFtX2ZpeF9yYXRlKHByaXYsIGxxX3N0YSk7CiAjZW5kaWYKLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpCisJaWYgKGNmZyhwcml2KS0+YnRfcGFyYW1zICYmIGNmZyhwcml2KS0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0KQogCQlyc19idF91cGRhdGVfbHEocHJpdiwgY3R4LCBscV9zdGEpOwogfQogCkBAIC0xNDU4LDEwICsxNDU4LDggQEAKIAkJYnJlYWs7CiAJY2FzZSBJV0xfQlRfQ09FWF9UUkFGRklDX0xPQURfTE9XOgogCQkvKiBhdm9pZCBhbnRlbm5hIEIgdW5sZXNzIE1JTU8gKi8KLQkJdmFsaWRfdHhfYW50ID0KLQkJCWZpcnN0X2FudGVubmEoaHdfcGFyYW1zKHByaXYpLnZhbGlkX3R4X2FudCk7CiAJCWlmICh0YmwtPmFjdGlvbiA9PSBJV0xfTEVHQUNZX1NXSVRDSF9BTlRFTk5BMikKLQkJCXRibC0+YWN0aW9uID0gSVdMX0xFR0FDWV9TV0lUQ0hfQU5URU5OQTE7CisJCQl0YmwtPmFjdGlvbiA9IElXTF9MRUdBQ1lfU1dJVENIX1NJU087CiAJCWJyZWFrOwogCWNhc2UgSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0hJR0g6CiAJY2FzZSBJV0xfQlRfQ09FWF9UUkFGRklDX0xPQURfQ09OVElOVU9VUzoKQEAgLTE2MzYsMTAgKzE2MzQsOCBAQAogCQlicmVhazsKIAljYXNlIElXTF9CVF9DT0VYX1RSQUZGSUNfTE9BRF9MT1c6CiAJCS8qIGF2b2lkIGFudGVubmEgQiB1bmxlc3MgTUlNTyAqLwotCQl2YWxpZF90eF9hbnQgPQotCQkJZmlyc3RfYW50ZW5uYShod19wYXJhbXMocHJpdikudmFsaWRfdHhfYW50KTsKIAkJaWYgKHRibC0+YWN0aW9uID09IElXTF9TSVNPX1NXSVRDSF9BTlRFTk5BMikKLQkJCXRibC0+YWN0aW9uID0gSVdMX1NJU09fU1dJVENIX0FOVEVOTkExOworCQkJdGJsLT5hY3Rpb24gPSBJV0xfU0lTT19TV0lUQ0hfTUlNTzJfQUI7CiAJCWJyZWFrOwogCWNhc2UgSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0hJR0g6CiAJY2FzZSBJV0xfQlRfQ09FWF9UUkFGRklDX0xPQURfQ09OVElOVU9VUzoKQEAgLTIyNzcsNyArMjI3Myw3IEBACiAJdGlkID0gcnNfdGxfYWRkX3BhY2tldChscV9zdGEsIGhkcik7CiAJaWYgKCh0aWQgIT0gSVdMX01BWF9USURfQ09VTlQpICYmCiAJICAgIChscV9zdGEtPnR4X2FnZ190aWRfZW4gJiAoMSA8PCB0aWQpKSkgewotCQl0aWRfZGF0YSA9ICZwcml2LT5zaHJkLT50aWRfZGF0YVtscV9zdGEtPmxxLnN0YV9pZF1bdGlkXTsKKwkJdGlkX2RhdGEgPSAmcHJpdi0+dGlkX2RhdGFbbHFfc3RhLT5scS5zdGFfaWRdW3RpZF07CiAJCWlmICh0aWRfZGF0YS0+YWdnLnN0YXRlID09IElXTF9BR0dfT0ZGKQogCQkJbHFfc3RhLT5pc19hZ2cgPSAwOwogCQllbHNlCkBAIC0yNjQ5LDggKzI2NDUsNyBAQAogCQkJICAgIChscV9zdGEtPnR4X2FnZ190aWRfZW4gJiAoMSA8PCB0aWQpKSAmJgogCQkJICAgICh0aWQgIT0gSVdMX01BWF9USURfQ09VTlQpKSB7CiAJCQkJdTggc3RhX2lkID0gbHFfc3RhLT5scS5zdGFfaWQ7Ci0JCQkJdGlkX2RhdGEgPQotCQkJCSAgICZwcml2LT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF07CisJCQkJdGlkX2RhdGEgPSAmcHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdOwogCQkJCWlmICh0aWRfZGF0YS0+YWdnLnN0YXRlID09IElXTF9BR0dfT0ZGKSB7CiAJCQkJCUlXTF9ERUJVR19SQVRFKHByaXYsCiAJCQkJCQkgICAgICAgInRyeSB0byBhZ2dyZWdhdGUgdGlkICVkXG4iLApAQCAtMjkwOCw3ICsyOTAzLDcgQEAKIAlpZiAoc2JhbmQtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJbHFfc3RhLT5sYXN0X3R4cmF0ZV9pZHggKz0gSVdMX0ZJUlNUX09GRE1fUkFURTsKIAlscV9zdGEtPmlzX2FnZyA9IDA7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1NWVE9PTAorI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9URVNUTU9ERQogCXByaXYtPnRtX2ZpeGVkX3JhdGUgPSAwOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0RFQlVHRlMKQEAgLTMwNTksMTEgKzMwNTQsMTEgQEAKIAkgKiBvdmVyd3JpdGUgaWYgbmVlZGVkLCBwYXNzIGFnZ3JlZ2F0aW9uIHRpbWUgbGltaXQKIAkgKiB0byB1Q29kZSBpbiB1U2VjCiAJICovCi0JaWYgKHByaXYgJiYgcHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFnZ190aW1lX2xpbWl0ICYmCisJaWYgKHByaXYgJiYgY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFnZ190aW1lX2xpbWl0ICYmCiAJICAgIHByaXYtPmJ0X3RyYWZmaWNfbG9hZCA+PSBJV0xfQlRfQ09FWF9UUkFGRklDX0xPQURfSElHSCkKIAkJbHFfY21kLT5hZ2dfcGFyYW1zLmFnZ190aW1lX2xpbWl0ID0KLQkJCWNwdV90b19sZTE2KHByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZ2dfdGltZV9saW1pdCk7CisJCQljcHVfdG9fbGUxNihjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWdnX3RpbWVfbGltaXQpOwogfQogCiBzdGF0aWMgdm9pZCAqcnNfYWxsb2Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNkaXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ycy5oCmluZGV4IGY0ZjZkZWIuLjY2NzViM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ycy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1ycy5oCkBAIC0yODEsNyArMjgxLDYgQEAKICNkZWZpbmUgVElEX1FVRVVFX0NFTExfU1BBQ0lORwk1MAkvKm1TICovCiAjZGVmaW5lIFRJRF9RVUVVRV9NQVhfU0laRQkyMAogI2RlZmluZSBUSURfUk9VTkRfVkFMVUUJCTUJLyogbVMgKi8KLSNkZWZpbmUgVElEX01BWF9MT0FEX0NPVU5UCTgKIAogI2RlZmluZSBUSURfTUFYX1RJTUVfRElGRiAoKFRJRF9RVUVVRV9NQVhfU0laRSAtIDEpICogVElEX1FVRVVFX0NFTExfU1BBQ0lORykKICNkZWZpbmUgVElNRV9XUkFQX0FST1VORCh4LCB5KSAoKCh5KSA+ICh4KSkgPyAoeSkgLSAoeCkgOiAoMC0oeCkpICsgKHkpKQpAQCAtNDAyLDcgKzQwMSw3IEBACiAKIAlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgbHE7CiAJc3RydWN0IGl3bF9zY2FsZV90YmxfaW5mbyBscV9pbmZvW0xRX1NJWkVdOyAvKiAiYWN0aXZlIiwgInNlYXJjaCIgKi8KLQlzdHJ1Y3QgaXdsX3RyYWZmaWNfbG9hZCBsb2FkW1RJRF9NQVhfTE9BRF9DT1VOVF07CisJc3RydWN0IGl3bF90cmFmZmljX2xvYWQgbG9hZFtJV0xfTUFYX1RJRF9DT1VOVF07CiAJdTggdHhfYWdnX3RpZF9lbjsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfREVCVUdGUwogCXN0cnVjdCBkZW50cnkgKnJzX3N0YV9kYmdmc19zY2FsZV90YWJsZV9maWxlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnguYwppbmRleCA1YWY5ZTYyLi5iMjJiMjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnguYwpAQCAtMTE3LDYgKzExNyw3IEBACiAJCUlXTF9DTUQoUkVQTFlfV09XTEFOX1RLSVBfUEFSQU1TKTsKIAkJSVdMX0NNRChSRVBMWV9XT1dMQU5fS0VLX0tDS19NQVRFUklBTCk7CiAJCUlXTF9DTUQoUkVQTFlfV09XTEFOX0dFVF9TVEFUVVMpOworCQlJV0xfQ01EKFJFUExZX0QzX0NPTkZJRyk7CiAJZGVmYXVsdDoKIAkJcmV0dXJuICJVTktOT1dOIjsKIApAQCAtMzE3LDcgKzMxOCw3IEBACiAJCQkJIHVuc2lnbmVkIGludCBtc2VjcykKIHsKIAlpbnQgZGVsdGE7Ci0JaW50IHRocmVzaG9sZCA9IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsY3BfZGVsdGFfdGhyZXNob2xkOworCWludCB0aHJlc2hvbGQgPSBjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5wbGNwX2RlbHRhX3RocmVzaG9sZDsKIAogCWlmICh0aHJlc2hvbGQgPT0gSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfRElTQUJMRSkgewogCQlJV0xfREVCVUdfUkFESU8ocHJpdiwgInBsY3BfZXJyIGNoZWNrIGRpc2FibGVkXG4iKTsKQEAgLTU4Miw4ICs1ODMsOCBAQAogCQlpd2xhZ25fcnhfY2FsY19ub2lzZShwcml2KTsKIAkJcXVldWVfd29yayhwcml2LT5zaHJkLT53b3JrcXVldWUsICZwcml2LT5ydW5fdGltZV9jYWxpYl93b3JrKTsKIAl9Ci0JaWYgKHByaXYtPmNmZy0+bGliLT50ZW1wZXJhdHVyZSAmJiBjaGFuZ2UpCi0JCXByaXYtPmNmZy0+bGliLT50ZW1wZXJhdHVyZShwcml2KTsKKwlpZiAoY2ZnKHByaXYpLT5saWItPnRlbXBlcmF0dXJlICYmIGNoYW5nZSkKKwkJY2ZnKHByaXYpLT5saWItPnRlbXBlcmF0dXJlKHByaXYpOwogCXJldHVybiAwOwogfQogCkBAIC04MDAsNyArODAxLDggQEAKIAkJCQkJICAgICAgIGN0eC0+YWN0aXZlLmJzc2lkX2FkZHIpKQogCQkJCWNvbnRpbnVlOwogCQkJY3R4LT5sYXN0X3R4X3JlamVjdGVkID0gZmFsc2U7Ci0JCQlpd2xfdHJhbnNfd2FrZV9hbnlfcXVldWUodHJhbnMocHJpdiksIGN0eC0+Y3R4aWQpOworCQkJaXdsX3RyYW5zX3dha2VfYW55X3F1ZXVlKHRyYW5zKHByaXYpLCBjdHgtPmN0eGlkLAorCQkJCSJjaGFubmVsIGdvdCBhY3RpdmUiKTsKIAkJfQogCX0KIApAQCAtMTAzMiw2ICsxMDM0LDUwIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaXdsYWduX3J4X25vYV9ub3RpZmljYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfbWVtX2J1ZmZlciAqcnhiLAorCQkJCSAgICAgIHN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqY21kKQoreworCXN0cnVjdCBpd2xfd2lwYW5fbm9hX2RhdGEgKm5ld19kYXRhLCAqb2xkX2RhdGE7CisJc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCA9IHJ4Yl9hZGRyKHJ4Yik7CisJc3RydWN0IGl3bF93aXBhbl9ub2Ffbm90aWZpY2F0aW9uICpub2Ffbm90aWYgPSAodm9pZCAqKXBrdC0+dS5yYXc7CisKKwkvKiBubyBjb25kaXRpb24gLS0gd2UncmUgaW4gc29mdGlycSAqLworCW9sZF9kYXRhID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChwcml2LT5ub2FfZGF0YSwgdHJ1ZSk7CisKKwlpZiAobm9hX25vdGlmLT5ub2FfYWN0aXZlKSB7CisJCXUzMiBsZW4gPSBsZTE2X3RvX2NwdShub2Ffbm90aWYtPm5vYV9hdHRyaWJ1dGUubGVuZ3RoKTsKKwkJdTMyIGNvcHlsZW4gPSBsZW47CisKKwkJLyogRUlELCBsZW4sIE9VSSwgc3VidHlwZSAqLworCQlsZW4gKz0gMSArIDEgKyAzICsgMTsKKwkJLyogUDJQIGlkLCBQMlAgbGVuZ3RoICovCisJCWxlbiArPSAxICsgMjsKKwkJY29weWxlbiArPSAxICsgMjsKKworCQluZXdfZGF0YSA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfZGF0YSkgKyBsZW4sIEdGUF9BVE9NSUMpOworCQlpZiAobmV3X2RhdGEpIHsKKwkJCW5ld19kYXRhLT5sZW5ndGggPSBsZW47CisJCQluZXdfZGF0YS0+ZGF0YVswXSA9IFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzsKKwkJCW5ld19kYXRhLT5kYXRhWzFdID0gbGVuIC0gMjsgLyogbm90IGNvdW50aW5nIEVJRCwgbGVuICovCisJCQluZXdfZGF0YS0+ZGF0YVsyXSA9IChXTEFOX09VSV9XRkEgPj4gMTYpICYgMHhmZjsKKwkJCW5ld19kYXRhLT5kYXRhWzNdID0gKFdMQU5fT1VJX1dGQSA+PiA4KSAmIDB4ZmY7CisJCQluZXdfZGF0YS0+ZGF0YVs0XSA9IChXTEFOX09VSV9XRkEgPj4gMCkgJiAweGZmOworCQkJbmV3X2RhdGEtPmRhdGFbNV0gPSBXTEFOX09VSV9UWVBFX1dGQV9QMlA7CisJCQltZW1jcHkoJm5ld19kYXRhLT5kYXRhWzZdLCAmbm9hX25vdGlmLT5ub2FfYXR0cmlidXRlLAorCQkJICAgICAgIGNvcHlsZW4pOworCQl9CisJfSBlbHNlCisJCW5ld19kYXRhID0gTlVMTDsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihwcml2LT5ub2FfZGF0YSwgbmV3X2RhdGEpOworCisJaWYgKG9sZF9kYXRhKQorCQlrZnJlZV9yY3Uob2xkX2RhdGEsIHJjdV9oZWFkKTsKKworCXJldHVybiAwOworfQorCiAvKioKICAqIGl3bF9zZXR1cF9yeF9oYW5kbGVycyAtIEluaXRpYWxpemUgUnggaGFuZGxlciBjYWxsYmFja3MKICAqCkBAIC0xMDU1LDYgKzExMDEsOCBAQAogCWhhbmRsZXJzW0JFQUNPTl9OT1RJRklDQVRJT05dCQk9IGl3bGFnbl9yeF9iZWFjb25fbm90aWY7CiAJaGFuZGxlcnNbUkVQTFlfQUREX1NUQV0JCQk9IGl3bF9hZGRfc3RhX2NhbGxiYWNrOwogCisJaGFuZGxlcnNbUkVQTFlfV0lQQU5fTk9BX05PVElGSUNBVElPTl0JPSBpd2xhZ25fcnhfbm9hX25vdGlmaWNhdGlvbjsKKwogCS8qCiAJICogVGhlIHNhbWUgaGFuZGxlciBpcyB1c2VkIGZvciBib3RoIHRoZSBSRVBMWSB0byBhIGRpc2NyZXRlCiAJICogc3RhdGlzdGljcyByZXF1ZXN0IGZyb20gdGhlIGhvc3QgYXMgd2VsbCBhcyBmb3IgdGhlIHBlcmlvZGljCkBAIC0xMDgzLDEzICsxMTMxLDEzIEBACiAJcHJpdi0+cnhfaGFuZGxlcnNbUkVQTFlfVFhdID0gaXdsYWduX3J4X3JlcGx5X3R4OwogCiAJLyogc2V0IHVwIG5vdGlmaWNhdGlvbiB3YWl0IHN1cHBvcnQgKi8KLQlzcGluX2xvY2tfaW5pdCgmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKLQlJTklUX0xJU1RfSEVBRCgmcHJpdi0+bm90aWZfd2FpdHMpOwotCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPm5vdGlmX3dhaXRxKTsKKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+c2hyZC0+bm90aWZfd2FpdF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+c2hyZC0+bm90aWZfd2FpdHMpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnByaXYtPnNocmQtPm5vdGlmX3dhaXRxKTsKIAogCS8qIFNldCB1cCBCVCBSeCBoYW5kbGVycyAqLwotCWlmIChwcml2LT5jZmctPmxpYi0+YnRfcnhfaGFuZGxlcl9zZXR1cCkKLQkJcHJpdi0+Y2ZnLT5saWItPmJ0X3J4X2hhbmRsZXJfc2V0dXAocHJpdik7CisJaWYgKGNmZyhwcml2KS0+bGliLT5idF9yeF9oYW5kbGVyX3NldHVwKQorCQljZmcocHJpdiktPmxpYi0+YnRfcnhfaGFuZGxlcl9zZXR1cChwcml2KTsKIAogfQogCkBAIC0xMTA0LDExICsxMTUyLDExIEBACiAJICogZXZlbiBpZiB0aGUgUlggaGFuZGxlciBjb25zdW1lcyB0aGUgUlhCIHdlIGhhdmUKIAkgKiBhY2Nlc3MgdG8gaXQgaW4gdGhlIG5vdGlmaWNhdGlvbiB3YWl0IGVudHJ5LgogCSAqLwotCWlmICghbGlzdF9lbXB0eSgmcHJpdi0+bm90aWZfd2FpdHMpKSB7CisJaWYgKCFsaXN0X2VtcHR5KCZwcml2LT5zaHJkLT5ub3RpZl93YWl0cykpIHsKIAkJc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqdzsKIAotCQlzcGluX2xvY2soJnByaXYtPm5vdGlmX3dhaXRfbG9jayk7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnkodywgJnByaXYtPm5vdGlmX3dhaXRzLCBsaXN0KSB7CisJCXNwaW5fbG9jaygmcHJpdi0+c2hyZC0+bm90aWZfd2FpdF9sb2NrKTsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeSh3LCAmcHJpdi0+c2hyZC0+bm90aWZfd2FpdHMsIGxpc3QpIHsKIAkJCWlmICh3LT5jbWQgIT0gcGt0LT5oZHIuY21kKQogCQkJCWNvbnRpbnVlOwogCQkJSVdMX0RFQlVHX1JYKHByaXYsCkBAIC0xMTE3LDExICsxMTY1LDExIEBACiAJCQkJcGt0LT5oZHIuY21kKTsKIAkJCXctPnRyaWdnZXJlZCA9IHRydWU7CiAJCQlpZiAody0+Zm4pCi0JCQkJdy0+Zm4ocHJpdiwgcGt0LCB3LT5mbl9kYXRhKTsKKwkJCQl3LT5mbih0cmFucyhwcml2KSwgcGt0LCB3LT5mbl9kYXRhKTsKIAkJfQotCQlzcGluX3VubG9jaygmcHJpdi0+bm90aWZfd2FpdF9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnByaXYtPnNocmQtPm5vdGlmX3dhaXRfbG9jayk7CiAKLQkJd2FrZV91cF9hbGwoJnByaXYtPm5vdGlmX3dhaXRxKTsKKwkJd2FrZV91cF9hbGwoJnByaXYtPnNocmQtPm5vdGlmX3dhaXRxKTsKIAl9CiAKIAlpZiAocHJpdi0+cHJlX3J4X2hhbmRsZXIpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnhvbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXJ4b24uYwppbmRleCA1OGEzODFjLi4xYzY2NTk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tcnhvbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1yeG9uLmMKQEAgLTQ1LDcgKzQ1LDggQEAKIAlzZW5kLT5maWx0ZXJfZmxhZ3MgPSBvbGRfZmlsdGVyOwogCiAJaWYgKHJldCkKLQkJSVdMX0VSUihwcml2LCAiRXJyb3IgY2xlYXJpbmcgQVNTT0NfTVNLIG9uIEJTUyAoJWQpXG4iLCByZXQpOworCQlJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHByaXYsCisJCQkiRXJyb3IgY2xlYXJpbmcgQVNTT0NfTVNLIG9uIEJTUyAoJWQpXG4iLCByZXQpOwogCiAJcmV0dXJuIHJldDsKIH0KQEAgLTU5LDcgKzYwLDcgQEAKIAl1OCBvbGRfZGV2X3R5cGUgPSBzZW5kLT5kZXZfdHlwZTsKIAlpbnQgcmV0OwogCi0JaXdsYWduX2luaXRfbm90aWZpY2F0aW9uX3dhaXQocHJpdiwgJmRpc2FibGVfd2FpdCwKKwlpd2xfaW5pdF9ub3RpZmljYXRpb25fd2FpdChwcml2LT5zaHJkLCAmZGlzYWJsZV93YWl0LAogCQkJCSAgICAgIFJFUExZX1dJUEFOX0RFQUNUSVZBVElPTl9DT01QTEVURSwKIAkJCQkgICAgICBOVUxMLCBOVUxMKTsKIApAQCAtNzMsOSArNzQsOSBAQAogCiAJaWYgKHJldCkgewogCQlJV0xfRVJSKHByaXYsICJFcnJvciBkaXNhYmxpbmcgUEFOICglZClcbiIsIHJldCk7Ci0JCWl3bGFnbl9yZW1vdmVfbm90aWZpY2F0aW9uKHByaXYsICZkaXNhYmxlX3dhaXQpOworCQlpd2xfcmVtb3ZlX25vdGlmaWNhdGlvbihwcml2LT5zaHJkLCAmZGlzYWJsZV93YWl0KTsKIAl9IGVsc2UgewotCQlyZXQgPSBpd2xhZ25fd2FpdF9ub3RpZmljYXRpb24ocHJpdiwgJmRpc2FibGVfd2FpdCwgSFopOworCQlyZXQgPSBpd2xfd2FpdF9ub3RpZmljYXRpb24ocHJpdi0+c2hyZCwgJmRpc2FibGVfd2FpdCwgSFopOwogCQlpZiAocmV0KQogCQkJSVdMX0VSUihwcml2LCAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIFBBTiBkaXNhYmxlXG4iKTsKIAl9CkBAIC0xMTYsNyArMTE3LDcgQEAKIAlpZiAoY3R4LT5odC5lbmFibGVkKQogCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5xb3NfZmxhZ3MgfD0gUU9TX1BBUkFNX0ZMR19UR05fTVNLOwogCi0JSVdMX0RFQlVHX1FPUyhwcml2LCAic2VuZCBRb1MgY21kIHdpdGggUW9zIGFjdGl2ZT0lZCBGTEFHUz0weCVYXG4iLAorCUlXTF9ERUJVR19JTkZPKHByaXYsICJzZW5kIFFvUyBjbWQgd2l0aCBRb3MgYWN0aXZlPSVkIEZMQUdTPTB4JVhcbiIsCiAJCSAgICAgIGN0eC0+cW9zX2RhdGEucW9zX2FjdGl2ZSwKIAkJICAgICAgY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0ucW9zX2ZsYWdzKTsKIApAQCAtMTI0LDcgKzEyNSw3IEBACiAJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBpd2xfcW9zcGFyYW1fY21kKSwKIAkJCSAgICAgICAmY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0pOwogCWlmIChyZXQpCi0JCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byB1cGRhdGUgUW9TXG4iKTsKKwkJSVdMX0RFQlVHX1FVSUVUX1JGS0lMTChwcml2LCAiRmFpbGVkIHRvIHVwZGF0ZSBRb1NcbiIpOwogfQogCiBzdGF0aWMgaW50IGl3bGFnbl91cGRhdGVfYmVhY29uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKQEAgLTI5NSw5ICsyOTYsOSBAQAogCX0KIAogCWlmIChjdHgtPnZpZiAmJiBjdHgtPnZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCi0JICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zICYmIHByaXYtPmNmZy0+aHRfcGFyYW1zLT5zbXBzX21vZGUpCisJICAgIGNmZyhwcml2KS0+aHRfcGFyYW1zICYmIGNmZyhwcml2KS0+aHRfcGFyYW1zLT5zbXBzX21vZGUpCiAJCWllZWU4MDIxMV9yZXF1ZXN0X3NtcHMoY3R4LT52aWYsCi0JCQkJICAgICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zLT5zbXBzX21vZGUpOworCQkJCSAgICAgICBjZmcocHJpdiktPmh0X3BhcmFtcy0+c21wc19tb2RlKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDQ0LDggKzQ0NSw4IEBACiAJICogZm9yY2UgQ1RTLXRvLXNlbGYgZnJhbWVzIHByb3RlY3Rpb24gaWYgUlRTLUNUUyBpcyBub3QgcHJlZmVycmVkCiAJICogb25lIGFnZ3JlZ2F0aW9uIHByb3RlY3Rpb24gbWV0aG9kCiAJICovCi0JaWYgKCEocHJpdi0+Y2ZnLT5odF9wYXJhbXMgJiYKLQkgICAgICBwcml2LT5jZmctPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24pKQorCWlmICghKGNmZyhwcml2KS0+aHRfcGFyYW1zICYmCisJICAgICAgY2ZnKHByaXYpLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uKSkKIAkJY3R4LT5zdGFnaW5nLmZsYWdzIHw9IFJYT05fRkxHX1NFTEZfQ1RTX0VOOwogCiAJaWYgKChjdHgtPnZpZiAmJiBjdHgtPnZpZi0+YnNzX2NvbmYudXNlX3Nob3J0X3Nsb3QpIHx8CkBAIC01MjgsNiArNTI5LDI0IEBACiAJcmV0dXJuIDA7CiB9CiAKK3ZvaWQgaXdsYWduX2NvbmZpZ19odDQwKHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQoreworCWlmIChjb25mX2lzX2h0NDBfbWludXMoY29uZikpIHsKKwkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7CisJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOworCX0gZWxzZSBpZiAoY29uZl9pc19odDQwX3BsdXMoY29uZikpIHsKKwkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQorCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU7CisJCWN0eC0+aHQuaXNfNDBtaHogPSB0cnVlOworCX0gZWxzZSB7CisJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KKwkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX05PTkU7CisJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKKwl9Cit9CisKIGludCBpd2xhZ25fbWFjX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGNoYW5nZWQpCiB7CiAJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CkBAIC01NDEsNiArNTYwLDkgQEAKIAogCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKIAorCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkKKwkJZ290byBvdXQ7CisKIAlpZiAodW5saWtlbHkodGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkpIHsKIAkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIHNjYW5uaW5nXG4iKTsKIAkJZ290byBvdXQ7CkBAIC01ODYsMTkgKzYwOCwxMSBAQAogCQkJCWN0eC0+aHQuZW5hYmxlZCA9IGNvbmZfaXNfaHQoY29uZik7CiAKIAkJCWlmIChjdHgtPmh0LmVuYWJsZWQpIHsKLQkJCQlpZiAoY29uZl9pc19odDQwX21pbnVzKGNvbmYpKSB7Ci0JCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOwotCQkJCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGNvbmZfaXNfaHQ0MF9wbHVzKGNvbmYpKSB7Ci0JCQkJCWN0eC0+aHQuZXh0ZW5zaW9uX2NoYW5fb2Zmc2V0ID0KLQkJCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOwotCQkJCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9Ci0JCQkJCQlJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOwotCQkJCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7Ci0JCQkJfQorCQkJCS8qIGlmIEhUNDAgaXMgdXNlZCwgaXQgc2hvdWxkIG5vdCBjaGFuZ2UKKwkJCQkgKiBhZnRlciBhc3NvY2lhdGVkIGV4Y2VwdCBjaGFubmVsIHN3aXRjaCAqLworCQkJCWlmICghY3R4LT5odC5pc180MG1oeiB8fAorCQkJCQkJIWl3bF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKQorCQkJCQlpd2xhZ25fY29uZmlnX2h0NDAoY29uZiwgY3R4KTsKIAkJCX0gZWxzZQogCQkJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKIApAQCAtODQwLDcgKzg1NCw4IEBACiAJCQlpZiAoY3R4LT5sYXN0X3R4X3JlamVjdGVkKSB7CiAJCQkJY3R4LT5sYXN0X3R4X3JlamVjdGVkID0gZmFsc2U7CiAJCQkJaXdsX3RyYW5zX3dha2VfYW55X3F1ZXVlKHRyYW5zKHByaXYpLAotCQkJCQkJCSBjdHgtPmN0eGlkKTsKKwkJCQkJCQkgY3R4LT5jdHhpZCwKKwkJCQkJCQkgIkRpc2Fzc29jOiBmbHVzaCBxdWV1ZSIpOwogCQkJfQogCQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyAmPSB+UlhPTl9GSUxURVJfQVNTT0NfTVNLOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tc3RhLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tc3RhLmMKaW5kZXggZWQ2MjgzNi4uNzM1MzgyNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXN0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi1zdGEuYwpAQCAtMTMwLDI1ICsxMzAsMTUgQEAKIAlyZXR1cm4gaXdsX3Byb2Nlc3NfYWRkX3N0YV9yZXNwKHByaXYsIGFkZHN0YSwgcGt0KTsKIH0KIAotc3RhdGljIHUxNiBpd2xhZ25fYnVpbGRfYWRkc3RhX2hjbWQoY29uc3Qgc3RydWN0IGl3bF9hZGRzdGFfY21kICpjbWQsIHU4ICpkYXRhKQotewotCXUxNiBzaXplID0gKHUxNilzaXplb2Yoc3RydWN0IGl3bF9hZGRzdGFfY21kKTsKLQlzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgKmFkZHN0YSA9IChzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgKilkYXRhOwotCW1lbWNweShhZGRzdGEsIGNtZCwgc2l6ZSk7Ci0JLyogcmVzcnZlZCBpbiA1MDAwICovCi0JYWRkc3RhLT5yYXRlX25fZmxhZ3MgPSBjcHVfdG9fbGUxNigwKTsKLQlyZXR1cm4gc2l6ZTsKLX0KLQogaW50IGl3bF9zZW5kX2FkZF9zdGEoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkgICAgIHN0cnVjdCBpd2xfYWRkc3RhX2NtZCAqc3RhLCB1OCBmbGFncykKIHsKIAlpbnQgcmV0ID0gMDsKLQl1OCBkYXRhW3NpemVvZigqc3RhKV07CiAJc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7CiAJCS5pZCA9IFJFUExZX0FERF9TVEEsCiAJCS5mbGFncyA9IGZsYWdzLAotCQkuZGF0YSA9IHsgZGF0YSwgfSwKKwkJLmRhdGEgPSB7IHN0YSwgfSwKKwkJLmxlbiA9IHsgc2l6ZW9mKCpzdGEpLCB9LAogCX07CiAJdTggc3RhX2lkIF9fbWF5YmVfdW51c2VkID0gc3RhLT5zdGEuc3RhX2lkOwogCkBAIC0xNjAsNyArMTUwLDYgQEAKIAkJbWlnaHRfc2xlZXAoKTsKIAl9CiAKLQljbWQubGVuWzBdID0gaXdsYWduX2J1aWxkX2FkZHN0YV9oY21kKHN0YSwgZGF0YSk7CiAJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kKHRyYW5zKHByaXYpLCAmY21kKTsKIAogCWlmIChyZXQgfHwgKGZsYWdzICYgQ01EX0FTWU5DKSkKQEAgLTQ2Myw2ICs0NTIsNyBAQAogCQkgICAgICAgY29uc3QgdTggKmFkZHIpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1OCB0aWQ7CiAKIAlpZiAoIWl3bF9pc19yZWFkeShwcml2LT5zaHJkKSkgewogCQlJV0xfREVCVUdfSU5GTyhwcml2LApAQCAtNTAxLDYgKzQ5MSwxMCBAQAogCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmxxID0gTlVMTDsKIAl9CiAKKwlmb3IgKHRpZCA9IDA7IHRpZCA8IElXTF9NQVhfVElEX0NPVU5UOyB0aWQrKykKKwkJbWVtc2V0KCZwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF0sIDAsCisJCQlzaXplb2YocHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdKSk7CisKIAlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnVzZWQgJj0gfklXTF9TVEFfRFJJVkVSX0FDVElWRTsKIAogCXByaXYtPm51bV9zdGF0aW9ucy0tOwpAQCAtNjQ3LDcgKzY0MSw3IEBACiAJaW50IHJldDsKIAlzdHJ1Y3QgaXdsX2FkZHN0YV9jbWQgc3RhX2NtZDsKIAlzdHJ1Y3QgaXdsX2xpbmtfcXVhbGl0eV9jbWQgbHE7Ci0JYm9vbCBhY3RpdmU7CisJYm9vbCBhY3RpdmUsIGhhdmVfbHEgPSBmYWxzZTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOwogCWlmICghKHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfRFJJVkVSX0FDVElWRSkpIHsKQEAgLTY1Nyw3ICs2NTEsMTAgQEAKIAogCW1lbWNweSgmc3RhX2NtZCwgJnByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLCBzaXplb2Yoc3RhX2NtZCkpOwogCXN0YV9jbWQubW9kZSA9IDA7Ci0JbWVtY3B5KCZscSwgcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSwgc2l6ZW9mKGxxKSk7CisJaWYgKHByaXYtPnN0YXRpb25zW3N0YV9pZF0ubHEpIHsKKwkJbWVtY3B5KCZscSwgcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5scSwgc2l6ZW9mKGxxKSk7CisJCWhhdmVfbHEgPSB0cnVlOworCX0KIAogCWFjdGl2ZSA9IHByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmIElXTF9TVEFfVUNPREVfQUNUSVZFOwogCXByaXYtPnN0YXRpb25zW3N0YV9pZF0udXNlZCAmPSB+SVdMX1NUQV9EUklWRVJfQUNUSVZFOwpAQCAtNjc5LDcgKzY3Niw4IEBACiAJaWYgKHJldCkKIAkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHJlLWFkZCBTVEEgJXBNICglZClcbiIsCiAJCQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkciwgcmV0KTsKLQlpd2xfc2VuZF9scV9jbWQocHJpdiwgY3R4LCAmbHEsIENNRF9TWU5DLCB0cnVlKTsKKwlpZiAoaGF2ZV9scSkKKwkJaXdsX3NlbmRfbHFfY21kKHByaXYsIGN0eCwgJmxxLCBDTURfU1lOQywgdHJ1ZSk7CiB9CiAKIGludCBpd2xfZ2V0X2ZyZWVfdWNvZGVfa2V5X29mZnNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCkBAIC04MjUsMjggKzgyMyw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGl3bGFnbl9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlpbnQgcmV0OwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlcjogcmVjZWl2ZWQgcmVxdWVzdCB0byByZW1vdmUgIgotCQkJICAgInN0YXRpb24gJXBNXG4iLCBzdGEtPmFkZHIpOwotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfSU5GTyhwcml2LCAicHJvY2VlZGluZyB0byByZW1vdmUgc3RhdGlvbiAlcE1cbiIsCi0JCQlzdGEtPmFkZHIpOwotCXJldCA9IGl3bF9yZW1vdmVfc3RhdGlvbihwcml2LCBzdGFfcHJpdi0+c3RhX2lkLCBzdGEtPmFkZHIpOwotCWlmIChyZXQpCi0JCUlXTF9FUlIocHJpdiwgIkVycm9yIHJlbW92aW5nIHN0YXRpb24gJXBNXG4iLAotCQkJc3RhLT5hZGRyKTsKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCXJldHVybiByZXQ7Ci19CiAKIHZvaWQgaXdsX3N0YV9maWxsX2xxKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKIAkJICAgICB1OCBzdGFfaWQsIHN0cnVjdCBpd2xfbGlua19xdWFsaXR5X2NtZCAqbGlua19jbWQpCkBAIC0xMjY4LDkgKzEyNDQsNiBAQAogCiAJc3dpdGNoIChrZXljb25mLT5jaXBoZXIpIHsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6Ci0JCWtleWNvbmYtPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDOwotCQlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7Ci0KIAkJaWYgKHN0YSkKIAkJCWFkZHIgPSBzdGEtPmFkZHI7CiAJCWVsc2UgLyogc3RhdGlvbiBtb2RlIGNhc2Ugb25seSAqLwpAQCAtMTI4Myw4ICsxMjU2LDYgQEAKIAkJCQkJICBzZXEudGtpcC5pdjMyLCBwMWssIENNRF9TWU5DKTsKIAkJYnJlYWs7CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgotCQlrZXljb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVY7Ci0JCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQNDA6CiAJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6CiAJCXJldCA9IGl3bGFnbl9zZW5kX3N0YV9rZXkocHJpdiwga2V5Y29uZiwgc3RhX2lkLApAQCAtMTQ2NCwyMCArMTQzNSw3IEBACiAJcmV0dXJuIGl3bF9zZW5kX2FkZF9zdGEocHJpdiwgJnN0YV9jbWQsIENNRF9TWU5DKTsKIH0KIAotc3RhdGljIHZvaWQgaXdsX3N0YV9tb2RpZnlfcHNfd2FrZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBzdGFfaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3MgJj0gflNUQV9GTEdfUFdSX1NBVkVfTVNLOwotCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YXRpb25fZmxhZ3NfbXNrID0gU1RBX0ZMR19QV1JfU0FWRV9NU0s7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhLm1vZGlmeV9tYXNrID0gMDsKLQlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zbGVlcF90eF9jb3VudCA9IDA7Ci0JcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEubW9kZSA9IFNUQV9DT05UUk9MX01PRElGWV9NU0s7Ci0JaXdsX3NlbmRfYWRkX3N0YShwcml2LCAmcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEsIENNRF9BU1lOQyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKLQotfQogCiB2b2lkIGl3bF9zdGFfbW9kaWZ5X3NsZWVwX3R4X2NvdW50KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHN0YV9pZCwgaW50IGNudCkKIHsKQEAgLTE0OTQsMzYgKzE0NTIsMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7CiAKIH0KLQotdm9pZCBpd2xhZ25fbWFjX3N0YV9ub3RpZnkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsCi0JCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlpbnQgc3RhX2lkOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQlzd2l0Y2ggKGNtZCkgewotCWNhc2UgU1RBX05PVElGWV9TTEVFUDoKLQkJV0FSTl9PTighc3RhX3ByaXYtPmNsaWVudCk7Ci0JCXN0YV9wcml2LT5hc2xlZXAgPSB0cnVlOwotCQlpZiAoYXRvbWljX3JlYWQoJnN0YV9wcml2LT5wZW5kaW5nX2ZyYW1lcykgPiAwKQotCQkJaWVlZTgwMjExX3N0YV9ibG9ja19hd2FrZShodywgc3RhLCB0cnVlKTsKLQkJYnJlYWs7Ci0JY2FzZSBTVEFfTk9USUZZX0FXQUtFOgotCQlXQVJOX09OKCFzdGFfcHJpdi0+Y2xpZW50KTsKLQkJaWYgKCFzdGFfcHJpdi0+YXNsZWVwKQotCQkJYnJlYWs7Ci0JCXN0YV9wcml2LT5hc2xlZXAgPSBmYWxzZTsKLQkJc3RhX2lkID0gaXdsX3N0YV9pZChzdGEpOwotCQlpZiAoc3RhX2lkICE9IElXTF9JTlZBTElEX1NUQVRJT04pCi0JCQlpd2xfc3RhX21vZGlmeV9wc193YWtlKHByaXYsIHN0YV9pZCk7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10dC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXR0LmMKaW5kZXggYzI3MTgwYS4uYjBkZmY3YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXR0LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXR0LmMKQEAgLTYzMyw3ICs2MzMsNyBAQAogCUlOSVRfV09SSygmcHJpdi0+Y3RfZW50ZXIsIGl3bF9iZ19jdF9lbnRlcik7CiAJSU5JVF9XT1JLKCZwcml2LT5jdF9leGl0LCBpd2xfYmdfY3RfZXhpdCk7CiAKLQlpZiAocHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+YWR2X3RoZXJtYWxfdGhyb3R0bGUpIHsKKwlpZiAoY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+YWR2X3RoZXJtYWxfdGhyb3R0bGUpIHsKIAkJSVdMX0RFQlVHX1RFTVAocHJpdiwgIkFkdmFuY2VkIFRoZXJtYWwgVGhyb3R0bGluZ1xuIik7CiAJCXR0LT5yZXN0cmljdGlvbiA9IGtjYWxsb2MoSVdMX1RJX1NUQVRFX01BWCwKIAkJCQkJICBzaXplb2Yoc3RydWN0IGl3bF90dF9yZXN0cmljdGlvbiksCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdHguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10eC5jCmluZGV4IDM1YTZiNzEuLmM2NjRjMjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10eC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi10eC5jCkBAIC03NCw4ICs3NCw4IEBACiAJZWxzZSBpZiAoaWVlZTgwMjExX2lzX2JhY2tfcmVxKGZjKSkKIAkJdHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19BQ0tfTVNLIHwgVFhfQ01EX0ZMR19JTU1fQkFfUlNQX01BU0s7CiAJZWxzZSBpZiAoaW5mby0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haICYmCi0JCSBwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCQkgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKKwkJIGNmZyhwcml2KS0+YnRfcGFyYW1zICYmCisJCSBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgogCQkgKGllZWU4MDIxMV9pc19hdXRoKGZjKSB8fCBpZWVlODAyMTFfaXNfYXNzb2NfcmVxKGZjKSB8fAogCQkgaWVlZTgwMjExX2lzX3JlYXNzb2NfcmVxKGZjKSB8fAogCQkgc2tiLT5wcm90b2NvbCA9PSBjcHVfdG9fYmUxNihFVEhfUF9QQUUpKSkKQEAgLTkxLDcgKzkxLDEwIEBACiAJCXR4X2NtZC0+dGlkX3RzcGVjID0gcWNbMF0gJiAweGY7CiAJCXR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX1NFUV9DVExfTVNLOwogCX0gZWxzZSB7Ci0JCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJCWlmIChpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQVNTSUdOX1NFUSkKKwkJCXR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU0VRX0NUTF9NU0s7CisJCWVsc2UKKwkJCXR4X2ZsYWdzICY9IH5UWF9DTURfRkxHX1NFUV9DVExfTVNLOwogCX0KIAogCWl3bGFnbl90eF9jbWRfcHJvdGVjdGlvbihwcml2LCBpbmZvLCBmYywgJnR4X2ZsYWdzKTsKQEAgLTE0OCw3ICsxNTEsNyBAQAogCWlmIChpZWVlODAyMTFfaXNfZGF0YShmYykpIHsKIAkJdHhfY21kLT5pbml0aWFsX3JhdGVfaW5kZXggPSAwOwogCQl0eF9jbWQtPnR4X2ZsYWdzIHw9IFRYX0NNRF9GTEdfU1RBX1JBVEVfTVNLOwotI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9TVlRPT0wKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVEVTVE1PREUKIAkJaWYgKHByaXYtPnRtX2ZpeGVkX3JhdGUpIHsKIAkJCS8qCiAJCQkgKiByYXRlIG92ZXJ3cml0ZSBieSB0ZXN0bW9kZQpAQCAtMTYxLDcgKzE2NCw4IEBACiAJCX0KICNlbmRpZgogCQlyZXR1cm47Ci0JfQorCX0gZWxzZSBpZiAoaWVlZTgwMjExX2lzX2JhY2tfcmVxKGZjKSkKKwkJdHhfY21kLT50eF9mbGFncyB8PSBUWF9DTURfRkxHX1NUQV9SQVRFX01TSzsKIAogCS8qKgogCSAqIElmIHRoZSBjdXJyZW50IFRYIHJhdGUgc3RvcmVkIGluIG1hYzgwMjExIGhhcyB0aGUgTUNTIGJpdCBzZXQsIGl0J3MKQEAgLTE4Nyw4ICsxOTEsOCBAQAogCQlyYXRlX2ZsYWdzIHw9IFJBVEVfTUNTX0NDS19NU0s7CiAKIAkvKiBTZXQgdXAgYW50ZW5uYXMgKi8KLQkgaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCi0JICAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgorCSBpZiAoY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgIGNmZyhwcml2KS0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0ICYmCiAJICAgICBwcml2LT5idF9mdWxsX2NvbmN1cnJlbnQpIHsKIAkJLyogb3BlcmF0ZWQgYXMgMXgxIGluIGZ1bGwgY29uY3VycmVuY3kgbW9kZSAqLwogCQlwcml2LT5tZ210X3R4X2FudCA9IGl3bF90b2dnbGVfdHhfYW50KHByaXYsIHByaXYtPm1nbXRfdHhfYW50LApAQCAtMjU4LDggKzI2Miw4IEBACiAKIAlfX2xlMTYgZmM7CiAJdTggaGRyX2xlbjsKLQl1MTYgbGVuOwotCXU4IHN0YV9pZDsKKwl1MTYgbGVuLCBzZXFfbnVtYmVyID0gMDsKKwl1OCBzdGFfaWQsIHRpZCA9IElXTF9NQVhfVElEX0NPVU5UOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJYm9vbCBpc19hZ2cgPSBmYWxzZTsKIApAQCAtMjgzLDYgKzI4NywxOSBAQAogCQlJV0xfREVCVUdfVFgocHJpdiwgIlNlbmRpbmcgUkVBU1NPQyBmcmFtZVxuIik7CiAjZW5kaWYKIAorCWlmICh1bmxpa2VseShpZWVlODAyMTFfaXNfcHJvYmVfcmVzcChmYykpKSB7CisJCXN0cnVjdCBpd2xfd2lwYW5fbm9hX2RhdGEgKm5vYV9kYXRhID0KKwkJCXJjdV9kZXJlZmVyZW5jZShwcml2LT5ub2FfZGF0YSk7CisKKwkJaWYgKG5vYV9kYXRhICYmCisJCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgbm9hX2RhdGEtPmxlbmd0aCwKKwkJCQkgICAgIEdGUF9BVE9NSUMpID09IDApIHsKKwkJCW1lbWNweShza2JfcHV0KHNrYiwgbm9hX2RhdGEtPmxlbmd0aCksCisJCQkgICAgICAgbm9hX2RhdGEtPmRhdGEsIG5vYV9kYXRhLT5sZW5ndGgpOworCQkJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOworCQl9CisJfQorCiAJaGRyX2xlbiA9IGllZWU4MDIxMV9oZHJsZW4oZmMpOwogCiAJLyogRm9yIG1hbmFnZW1lbnQgZnJhbWVzIHVzZSBicm9hZGNhc3QgaWQgdG8gZG8gbm90IGJyZWFrIGFnZ3JlZ2F0aW9uICovCkBAIC0zNTEsOSArMzY4LDUxIEBACiAJaW5mby0+ZHJpdmVyX2RhdGFbMF0gPSBjdHg7CiAJaW5mby0+ZHJpdmVyX2RhdGFbMV0gPSBkZXZfY21kOwogCi0JaWYgKGl3bF90cmFuc190eCh0cmFucyhwcml2KSwgc2tiLCBkZXZfY21kLCBjdHgtPmN0eGlkLCBzdGFfaWQpKQorCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoZmMpICYmICFpZWVlODAyMTFfaXNfcW9zX251bGxmdW5jKGZjKSkgeworCQl1OCAqcWMgPSBOVUxMOworCQlzdHJ1Y3QgaXdsX3RpZF9kYXRhICp0aWRfZGF0YTsKKwkJcWMgPSBpZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKTsKKwkJdGlkID0gcWNbMF0gJiBJRUVFODAyMTFfUU9TX0NUTF9USURfTUFTSzsKKwkJaWYgKFdBUk5fT05fT05DRSh0aWQgPj0gSVdMX01BWF9USURfQ09VTlQpKQorCQkJZ290byBkcm9wX3VubG9ja19zdGE7CisJCXRpZF9kYXRhID0gJnByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXTsKKworCQkvKiBhZ2dyZWdhdGlvbiBpcyBvbiBmb3IgdGhpcyA8c3RhLHRpZD4gKi8KKwkJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSAmJgorCQkgICAgdGlkX2RhdGEtPmFnZy5zdGF0ZSAhPSBJV0xfQUdHX09OKSB7CisJCQlJV0xfRVJSKHByaXYsICJUWF9DVExfQU1QRFUgd2hpbGUgbm90IGluIEFHRzoiCisJCQkJIiBUeCBmbGFncyA9IDB4JTA4eCwgYWdnLnN0YXRlID0gJWQiLAorCQkJCWluZm8tPmZsYWdzLCB0aWRfZGF0YS0+YWdnLnN0YXRlKTsKKwkJCUlXTF9FUlIocHJpdiwgInN0YV9pZCA9ICVkLCB0aWQgPSAlZCBzZXFfbnVtID0gJWQiLAorCQkJCXN0YV9pZCwgdGlkLCBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpKTsKKwkJCWdvdG8gZHJvcF91bmxvY2tfc3RhOworCQl9CisKKwkJLyogV2UgY2FuIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBzdGFjayBpbiBJV0xfQUdHX3tPTixPRkZ9CisJCSAqIG9ubHkuIENoZWNrIHRoaXMgaGVyZS4KKwkJICovCisJCWlmIChXQVJOX09OQ0UodGlkX2RhdGEtPmFnZy5zdGF0ZSAhPSBJV0xfQUdHX09OICYmCisJCSAgICB0aWRfZGF0YS0+YWdnLnN0YXRlICE9IElXTF9BR0dfT0ZGLAorCQkgICAgIlR4IHdoaWxlIGFnZy5zdGF0ZSA9ICVkIiwgdGlkX2RhdGEtPmFnZy5zdGF0ZSkpCisJCQlnb3RvIGRyb3BfdW5sb2NrX3N0YTsKKworCQlzZXFfbnVtYmVyID0gdGlkX2RhdGEtPnNlcV9udW1iZXI7CisJCXNlcV9udW1iZXIgJj0gSUVFRTgwMjExX1NDVExfU0VROworCQloZHItPnNlcV9jdHJsICY9IGNwdV90b19sZTE2KElFRUU4MDIxMV9TQ1RMX0ZSQUcpOworCQloZHItPnNlcV9jdHJsIHw9IGNwdV90b19sZTE2KHNlcV9udW1iZXIpOworCQlzZXFfbnVtYmVyICs9IDB4MTA7CisJfQorCisJLyogQ29weSBNQUMgaGVhZGVyIGZyb20gc2tiIGludG8gY29tbWFuZCBidWZmZXIgKi8KKwltZW1jcHkodHhfY21kLT5oZHIsIGhkciwgaGRyX2xlbik7CisKKwlpZiAoaXdsX3RyYW5zX3R4KHRyYW5zKHByaXYpLCBza2IsIGRldl9jbWQsIGN0eC0+Y3R4aWQsIHN0YV9pZCwgdGlkKSkKIAkJZ290byBkcm9wX3VubG9ja19zdGE7CiAKKwlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSAmJiAhaWVlZTgwMjExX2lzX3Fvc19udWxsZnVuYyhmYykgJiYKKwkgICAgIWllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGZjKSkKKwkJcHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLnNlcV9udW1iZXIgPSBzZXFfbnVtYmVyOworCiAJc3Bpbl91bmxvY2soJnByaXYtPnNocmQtPnN0YV9sb2NrKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zaHJkLT5sb2NrLCBmbGFncyk7CiAKQEAgLTM3OCwxMCArNDM3LDgxIEBACiAJcmV0dXJuIC0xOwogfQogCitpbnQgaXdsYWduX3R4X2FnZ19zdG9wKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQpCit7CisJc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3RhX2lkOworCisJc3RhX2lkID0gaXdsX3N0YV9pZChzdGEpOworCisJaWYgKHN0YV9pZCA9PSBJV0xfSU5WQUxJRF9TVEFUSU9OKSB7CisJCUlXTF9FUlIocHJpdiwgIkludmFsaWQgc3RhdGlvbiBmb3IgQUdHIHRpZCAlZFxuIiwgdGlkKTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKKworCXRpZF9kYXRhID0gJnByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXTsKKworCXN3aXRjaCAocHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZy5zdGF0ZSkgeworCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOgorCQkvKgorCQkqIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgcGVlciBzdG9wcyBhZ2dyZWdhdGlvbgorCQkqIGFnYWluIGJlZm9yZSB3ZSd2ZSBoYWQgYSBjaGFuY2UgdG8gZHJhaW4gdGhlCisJCSogcXVldWUgd2Ugc2VsZWN0ZWQgcHJldmlvdXNseSwgaS5lLiBiZWZvcmUgdGhlCisJCSogc2Vzc2lvbiB3YXMgcmVhbGx5IHN0YXJ0ZWQgY29tcGxldGVseS4KKwkJKi8KKwkJSVdMX0RFQlVHX0hUKHByaXYsICJBR0cgc3RvcCBiZWZvcmUgc2V0dXAgZG9uZVxuIik7CisJCWdvdG8gdHVybl9vZmY7CisJY2FzZSBJV0xfQUdHX09OOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlJV0xfV0FSTihwcml2LCAiU3RvcHBpbmcgQUdHIHdoaWxlIHN0YXRlIG5vdCBPTiAiCisJCQkgIm9yIHN0YXJ0aW5nIGZvciAlZCBvbiAlZCAoJWQpXG4iLCBzdGFfaWQsIHRpZCwKKwkJCSBwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnLnN0YXRlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdGlkX2RhdGEtPmFnZy5zc24gPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOworCisJLyogVGhlcmUgYXJlIHN0aWxsIHBhY2tldHMgZm9yIHRoaXMgUkEgLyBUSUQgaW4gdGhlIEhXICovCisJaWYgKHRpZF9kYXRhLT5hZ2cuc3NuICE9IHRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCkgeworCQlJV0xfREVCVUdfVFhfUVVFVUVTKHByaXYsICJDYW4ndCBwcm9jZWVkOiBzc24gJWQsICIKKwkJCQkgICAgIm5leHRfcmVjbCA9ICVkIiwKKwkJCQkgICAgdGlkX2RhdGEtPmFnZy5zc24sCisJCQkJICAgIHRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCk7CisJCXByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2cuc3RhdGUgPQorCQkJSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwlJV0xfREVCVUdfVFhfUVVFVUVTKHByaXYsICJDYW4gcHJvY2VlZDogc3NuID0gbmV4dF9yZWNsID0gJWQiLAorCQkJICAgIHRpZF9kYXRhLT5hZ2cuc3NuKTsKK3R1cm5fb2ZmOgorCXByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2cuc3RhdGUgPSBJV0xfQUdHX09GRjsKKworCS8qIGRvIG5vdCByZXN0b3JlL3NhdmUgaXJxcyAqLworCXNwaW5fdW5sb2NrKCZwcml2LT5zaHJkLT5zdGFfbG9jayk7CisJc3Bpbl9sb2NrKCZwcml2LT5zaHJkLT5sb2NrKTsKKworCWl3bF90cmFuc190eF9hZ2dfZGlzYWJsZSh0cmFucyhwcml2KSwgc3RhX2lkLCB0aWQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+bG9jaywgZmxhZ3MpOworCisJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIHN0YS0+YWRkciwgdGlkKTsKKworCXJldHVybiAwOworfQorCiBpbnQgaXdsYWduX3R4X2FnZ19zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbikKIHsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3RpZF9kYXRhICp0aWRfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzdGFfaWQ7CiAJaW50IHJldDsKIApAQCAtMzk2LDcgKzUyNiw3IEBACiAJaWYgKHVubGlrZWx5KHRpZCA+PSBJV0xfTUFYX1RJRF9DT1VOVCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHByaXYtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2cuc3RhdGUgIT0gSVdMX0FHR19PRkYpIHsKKwlpZiAocHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZy5zdGF0ZSAhPSBJV0xfQUdHX09GRikgewogCQlJV0xfRVJSKHByaXYsICJTdGFydCBBR0cgd2hlbiBzdGF0ZSBpcyBub3QgSVdMX0FHR19PRkYgIVxuIik7CiAJCXJldHVybiAtRU5YSU87CiAJfQpAQCAtNDA1LDI3ICs1MzUsMTM2IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IGl3bF90cmFuc190eF9hZ2dfYWxsb2ModHJhbnMocHJpdiksIHZpZl9wcml2LT5jdHgtPmN0eGlkLCBzdGFfaWQsCi0JCQkJICAgICB0aWQsIHNzbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7CisKKwl0aWRfZGF0YSA9ICZwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF07CisJdGlkX2RhdGEtPmFnZy5zc24gPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOworCisJKnNzbiA9IHRpZF9kYXRhLT5hZ2cuc3NuOworCisJcmV0ID0gaXdsX3RyYW5zX3R4X2FnZ19hbGxvYyh0cmFucyhwcml2KSwgc3RhX2lkLCB0aWQpOworCWlmIChyZXQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoKnNzbiA9PSB0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQpIHsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyhwcml2LCAiQ2FuIHByb2NlZWQ6IHNzbiA9IG5leHRfcmVjbCA9ICVkIiwKKwkJCQkgICAgdGlkX2RhdGEtPmFnZy5zc24pOworCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0FHR19PTjsKKwkJaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUodmlmLCBzdGEtPmFkZHIsIHRpZCk7CisJfSBlbHNlIHsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyhwcml2LCAiQ2FuJ3QgcHJvY2VlZDogc3NuICVkLCAiCisJCQkJICAgICJuZXh0X3JlY2xhaW1lZCA9ICVkIiwKKwkJCQkgICAgdGlkX2RhdGEtPmFnZy5zc24sCisJCQkJICAgIHRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCk7CisJCXRpZF9kYXRhLT5hZ2cuc3RhdGUgPSBJV0xfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkE7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKIAogCXJldHVybiByZXQ7CiB9CiAKLWludCBpd2xhZ25fdHhfYWdnX3N0b3Aoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCkKK2ludCBpd2xhZ25fdHhfYWdnX29wZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTggYnVmX3NpemUpCiB7Ci0JaW50IHN0YV9pZDsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKSBzdGEtPmRydl9wcml2OworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiBzc247CiAKLQlzdGFfaWQgPSBpd2xfc3RhX2lkKHN0YSk7CisJYnVmX3NpemUgPSBtaW5fdChpbnQsIGJ1Zl9zaXplLCBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRik7CiAKLQlpZiAoc3RhX2lkID09IElXTF9JTlZBTElEX1NUQVRJT04pIHsKLQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCBzdGF0aW9uIGZvciBBR0cgdGlkICVkXG4iLCB0aWQpOwotCQlyZXR1cm4gLUVOWElPOworCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOworCXNzbiA9IHByaXYtPnRpZF9kYXRhW3N0YV9wcml2LT5zdGFfaWRdW3RpZF0uYWdnLnNzbjsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOworCisJaXdsX3RyYW5zX3R4X2FnZ19zZXR1cCh0cmFucyhwcml2KSwgY3R4LT5jdHhpZCwgc3RhX3ByaXYtPnN0YV9pZCwgdGlkLAorCQkJICAgICAgIGJ1Zl9zaXplLCBzc24pOworCisJLyoKKwkgKiBJZiB0aGUgbGltaXQgaXMgMCwgdGhlbiBpdCB3YXNuJ3QgaW5pdGlhbGlzZWQgeWV0LAorCSAqIHVzZSB0aGUgZGVmYXVsdC4gV2UgY2FuIGRvIHRoYXQgc2luY2Ugd2UgdGFrZSB0aGUKKwkgKiBtaW5pbXVtIGJlbG93LCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBnbyBhYm92ZSBvdXIKKwkgKiBkZWZhdWx0IGR1ZSB0byBoYXJkd2FyZSByZXN0cmljdGlvbnMuCisJICovCisJaWYgKHN0YV9wcml2LT5tYXhfYWdnX2J1ZnNpemUgPT0gMCkKKwkJc3RhX3ByaXYtPm1heF9hZ2dfYnVmc2l6ZSA9CisJCQlMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRjsKKworCS8qCisJICogRXZlbiB0aG91Z2ggaW4gdGhlb3J5IHRoZSBwZWVyIGNvdWxkIGhhdmUgZGlmZmVyZW50CisJICogYWdncmVnYXRpb24gcmVvcmRlciBidWZmZXIgc2l6ZXMgZm9yIGRpZmZlcmVudCBzZXNzaW9ucywKKwkgKiBvdXIgdWNvZGUgZG9lc24ndCBhbGxvdyBmb3IgdGhhdCBhbmQgaGFzIGEgZ2xvYmFsIGxpbWl0CisJICogZm9yIGVhY2ggc3RhdGlvbi4gVGhlcmVmb3JlLCB1c2UgdGhlIG1pbmltdW0gb2YgYWxsIHRoZQorCSAqIGFnZ3JlZ2F0aW9uIHNlc3Npb25zIGFuZCBvdXIgZGVmYXVsdCB2YWx1ZS4KKwkgKi8KKwlzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplID0KKwkJbWluKHN0YV9wcml2LT5tYXhfYWdnX2J1ZnNpemUsIGJ1Zl9zaXplKTsKKworCWlmIChjZmcocHJpdiktPmh0X3BhcmFtcyAmJgorCSAgICBjZmcocHJpdiktPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24pIHsKKwkJLyoKKwkJICogc3dpdGNoIHRvIFJUUy9DVFMgaWYgaXQgaXMgdGhlIHByZWZlciBwcm90ZWN0aW9uCisJCSAqIG1ldGhvZCBmb3IgSFQgdHJhZmZpYworCQkgKi8KKworCQlzdGFfcHJpdi0+bHFfc3RhLmxxLmdlbmVyYWxfcGFyYW1zLmZsYWdzIHw9CisJCQlMSU5LX1FVQUxfRkxBR1NfU0VUX1NUQV9UTENfUlRTX01TSzsKIAl9CisJcHJpdi0+YWdnX3RpZHNfY291bnQrKzsKKwlJV0xfREVCVUdfSFQocHJpdiwgInByaXYtPmFnZ190aWRzX2NvdW50ID0gJXVcbiIsCisJCSAgICAgcHJpdi0+YWdnX3RpZHNfY291bnQpOwogCi0JcmV0dXJuIGl3bF90cmFuc190eF9hZ2dfZGlzYWJsZSh0cmFucyhwcml2KSwgdmlmX3ByaXYtPmN0eC0+Y3R4aWQsCi0JCQkJCXN0YV9pZCwgdGlkKTsKKwlzdGFfcHJpdi0+bHFfc3RhLmxxLmFnZ19wYXJhbXMuYWdnX2ZyYW1lX2NudF9saW1pdCA9CisJCXN0YV9wcml2LT5tYXhfYWdnX2J1ZnNpemU7CisKKwlJV0xfSU5GTyhwcml2LCAiVHggYWdncmVnYXRpb24gZW5hYmxlZCBvbiByYSA9ICVwTSB0aWQgPSAlZFxuIiwKKwkJIHN0YS0+YWRkciwgdGlkKTsKKworCXJldHVybiBpd2xfc2VuZF9scV9jbWQocHJpdiwgY3R4LAorCQkJJnN0YV9wcml2LT5scV9zdGEubHEsIENNRF9BU1lOQywgZmFsc2UpOworfQorCitzdGF0aWMgdm9pZCBpd2xhZ25fY2hlY2tfcmF0aWRfZW1wdHkoc3RydWN0IGl3bF9wcml2ICpwcml2LCBpbnQgc3RhX2lkLCB1OCB0aWQpCit7CisJc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGEgPSAmcHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdOworCWVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHg7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwl1OCAqYWRkcjsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnNocmQtPnN0YV9sb2NrKTsKKworCWFkZHIgPSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcjsKKwljdHggPSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmN0eGlkOworCXZpZiA9IHByaXYtPmNvbnRleHRzW2N0eF0udmlmOworCisJc3dpdGNoIChwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uYWdnLnN0YXRlKSB7CisJY2FzZSBJV0xfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkE6CisJCS8qIFRoZXJlIGFyZSBubyBwYWNrZXRzIGZvciB0aGlzIFJBIC8gVElEIGluIHRoZSBIVyBhbnkgbW9yZSAqLworCQlpZiAodGlkX2RhdGEtPmFnZy5zc24gPT0gdGlkX2RhdGEtPm5leHRfcmVjbGFpbWVkKSB7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHByaXYsCisJCQkJIkNhbiBjb250aW51ZSBERUxCQSBmbG93IHNzbiA9IG5leHRfcmVjbCA9IgorCQkJCSIgJWQiLCB0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQpOworCQkJaXdsX3RyYW5zX3R4X2FnZ19kaXNhYmxlKHRyYW5zKHByaXYpLCBzdGFfaWQsIHRpZCk7CisJCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0FHR19PRkY7CisJCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgYWRkciwgdGlkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQToKKwkJLyogVGhlcmUgYXJlIG5vIHBhY2tldHMgZm9yIHRoaXMgUkEgLyBUSUQgaW4gdGhlIEhXIGFueSBtb3JlICovCisJCWlmICh0aWRfZGF0YS0+YWdnLnNzbiA9PSB0aWRfZGF0YS0+bmV4dF9yZWNsYWltZWQpIHsKKwkJCUlXTF9ERUJVR19UWF9RVUVVRVMocHJpdiwKKwkJCQkiQ2FuIGNvbnRpbnVlIEFEREJBIGZsb3cgc3NuID0gbmV4dF9yZWNsID0iCisJCQkJIiAlZCIsIHRpZF9kYXRhLT5uZXh0X3JlY2xhaW1lZCk7CisJCQl0aWRfZGF0YS0+YWdnLnN0YXRlID0gSVdMX0FHR19PTjsKKwkJCWllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgYWRkciwgdGlkKTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkIGl3bGFnbl9ub25fYWdnX3R4X3N0YXR1cyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCkBAIC01NjUsNyArODA0LDcgQEAKIAkJSVdMQUdOX1RYX1JFU19USURfUE9TOwogCWludCBzdGFfaWQgPSAodHhfcmVzcC0+cmFfdGlkICYgSVdMQUdOX1RYX1JFU19SQV9NU0spID4+CiAJCUlXTEFHTl9UWF9SRVNfUkFfUE9TOwotCXN0cnVjdCBpd2xfaHRfYWdnICphZ2cgPSAmcHJpdi0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZzsKKwlzdHJ1Y3QgaXdsX2h0X2FnZyAqYWdnID0gJnByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2c7CiAJdTMyIHN0YXR1cyA9IGxlMTZfdG9fY3B1KHR4X3Jlc3AtPnN0YXR1cy5zdGF0dXMpOwogCWludCBpOwogCkBAIC01ODEsOCArODIwLDggQEAKIAkgKiBub3RpZmljYXRpb24gYWdhaW4uCiAJICovCiAJaWYgKHR4X3Jlc3AtPmJ0X2tpbGxfY291bnQgJiYgdHhfcmVzcC0+ZnJhbWVfY291bnQgPT0gMSAmJgotCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgeworCSAgICBjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCSAgICBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgewogCQlJV0xfREVCVUdfQ09FWChwcml2LCAicmVjZWl2ZSByZXBseSB0eCB3LyBidF9raWxsXG4iKTsKIAl9CiAKQEAgLTc1NSw3ICs5OTQsNyBAQAogCXN0cnVjdCBpd2xhZ25fdHhfcmVzcCAqdHhfcmVzcCA9ICh2b2lkICopJnBrdC0+dS5yYXdbMF07CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAl1MzIgc3RhdHVzID0gbGUxNl90b19jcHUodHhfcmVzcC0+c3RhdHVzLnN0YXR1cyk7Ci0JdTMyIHNzbiA9IGl3bGFnbl9nZXRfc2NkX3Nzbih0eF9yZXNwKTsKKwl1MTYgc3NuID0gaXdsYWduX2dldF9zY2Rfc3NuKHR4X3Jlc3ApOwogCWludCB0aWQ7CiAJaW50IHN0YV9pZDsKIAlpbnQgZnJlZWQ7CkBAIC03NzcsMTAgKzEwMTYsMzQgQEAKIAkJaXdsX3J4X3JlcGx5X3R4X2FnZyhwcml2LCB0eF9yZXNwKTsKIAogCWlmICh0eF9yZXNwLT5mcmFtZV9jb3VudCA9PSAxKSB7CisJCXUxNiBuZXh0X3JlY2xhaW1lZCA9IGxlMTZfdG9fY3B1KHR4X3Jlc3AtPnNlcV9jdGwpOworCQluZXh0X3JlY2xhaW1lZCA9IFNFUV9UT19TTihuZXh0X3JlY2xhaW1lZCArIDB4MTApOworCisJCWlmIChpc19hZ2cpIHsKKwkJCS8qIElmIHRoaXMgaXMgYW4gYWdncmVnYXRpb24gcXVldWUsIHdlIGNhbiByZWx5IG9uIHRoZQorCQkJICogc3NuIHNpbmNlIHRoZSB3aWZpIHNlcXVlbmNlIG51bWJlciBjb3JyZXNwb25kcyB0bworCQkJICogdGhlIGluZGV4IGluIHRoZSBURkQgcmluZyAoJTI1NikuCisJCQkgKiBUaGUgc2VxX2N0bCBpcyB0aGUgc2VxdWVuY2UgY29udHJvbCBvZiB0aGUgcGFja2V0CisJCQkgKiB0byB3aGljaCB0aGlzIFR4IHJlc3BvbnNlIHJlbGF0ZXMuIEJ1dCBpZiB0aGVyZSBpcyBhCisJCQkgKiBob2xlIGluIHRoZSBiaXRtYXAgb2YgdGhlIEJBIHdlIHJlY2VpdmVkLCB0aGlzIFR4CisJCQkgKiByZXNwb25zZSBtYXkgYWxsb3cgdG8gcmVjbGFpbSB0aGUgaG9sZSBhbmQgYWxsIHRoZQorCQkJICogc3Vic2VxdWVudCBwYWNrZXRzIHRoYXQgd2VyZSBhbHJlYWR5IGFja2VkLgorCQkJICogSW4gdGhhdCBjYXNlLCBzZXFfY3RsICE9IHNzbiwgYW5kIHRoZSBuZXh0IHBhY2tldAorCQkJICogdG8gYmUgcmVjbGFpbWVkIHdpbGwgYmUgc3NuIGFuZCBub3Qgc2VxX2N0bC4KKwkJCSAqLworCQkJbmV4dF9yZWNsYWltZWQgPSBzc247CisJCX0KKwogCQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnNrYnMpOworCQlwcml2LT50aWRfZGF0YVtzdGFfaWRdW3RpZF0ubmV4dF9yZWNsYWltZWQgPSBuZXh0X3JlY2xhaW1lZDsKKworCQlJV0xfREVCVUdfVFhfUkVQTFkocHJpdiwgIk5leHQgcmVjbGFpbWVkIHBhY2tldDolZCIsCisJCQkJCSAgbmV4dF9yZWNsYWltZWQpOworCiAJCS8qd2UgY2FuIGZyZWUgdW50aWwgc3NuICUgcS5uX2JkIG5vdCBpbmNsdXNpdmUgKi8KLQkJaXdsX3RyYW5zX3JlY2xhaW0odHJhbnMocHJpdiksIHN0YV9pZCwgdGlkLCB0eHFfaWQsCi0JCQkJICBzc24sIHN0YXR1cywgJnNrYnMpOworCQlXQVJOX09OKGl3bF90cmFuc19yZWNsYWltKHRyYW5zKHByaXYpLCBzdGFfaWQsIHRpZCwgdHhxX2lkLAorCQkJCSAgc3NuLCBzdGF0dXMsICZza2JzKSk7CisJCWl3bGFnbl9jaGVja19yYXRpZF9lbXB0eShwcml2LCBzdGFfaWQsIHRpZCk7CiAJCWZyZWVkID0gMDsKIAkJd2hpbGUgKCFza2JfcXVldWVfZW1wdHkoJnNrYnMpKSB7CiAJCQlza2IgPSBfX3NrYl9kZXF1ZXVlKCZza2JzKTsKQEAgLTgwMCw3ICsxMDYzLDggQEAKIAkJCSAgICBpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSAmJiBjdHgtPnZpZiAmJgogCQkJICAgIGN0eC0+dmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pIHsKIAkJCQljdHgtPmxhc3RfdHhfcmVqZWN0ZWQgPSB0cnVlOwotCQkJCWl3bF90cmFuc19zdG9wX3F1ZXVlKHRyYW5zKHByaXYpLCB0eHFfaWQpOworCQkJCWl3bF90cmFuc19zdG9wX3F1ZXVlKHRyYW5zKHByaXYpLCB0eHFfaWQsCisJCQkJCSJUeCBvbiBwYXNzaXZlIGNoYW5uZWwiKTsKIAogCQkJCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LAogCQkJCQkgICAiVFhRICVkIHN0YXR1cyAlcyAoMHglMDh4KSAiCkBAIC04NzQsMjQgKzExMzgsMTAgQEAKIAogCXN0YV9pZCA9IGJhX3Jlc3AtPnN0YV9pZDsKIAl0aWQgPSBiYV9yZXNwLT50aWQ7Ci0JYWdnID0gJnByaXYtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2c7CisJYWdnID0gJnByaXYtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2c7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKIAotCWlmICh1bmxpa2VseShhZ2ctPnR4cV9pZCAhPSBzY2RfZmxvdykpIHsKLQkJLyoKLQkJICogRklYTUU6IHRoaXMgaXMgYSB1Q29kZSBidWcgd2hpY2ggbmVlZCB0byBiZSBhZGRyZXNzZWQsCi0JCSAqIGxvZyB0aGUgaW5mb3JtYXRpb24gYW5kIHJldHVybiBmb3Igbm93IQotCQkgKiBzaW5jZSBpdCBpcyBwb3NzaWJsZSBoYXBwZW4gdmVyeSBvZnRlbiBhbmQgaW4gb3JkZXIKLQkJICogbm90IHRvIGZpbGwgdGhlIHN5c2xvZywgZG9uJ3QgZW5hYmxlIHRoZSBsb2dnaW5nIGJ5IGRlZmF1bHQKLQkJICovCi0JCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LAotCQkJIkJBIHNjZF9mbG93ICVkIGRvZXMgbm90IG1hdGNoIHR4cV9pZCAlZFxuIiwKLQkJCXNjZF9mbG93LCBhZ2ctPnR4cV9pZCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAwOwotCX0KLQogCWlmICh1bmxpa2VseSghYWdnLT53YWl0X2Zvcl9iYSkpIHsKIAkJaWYgKHVubGlrZWx5KGJhX3Jlc3AtPmJpdG1hcCkpCiAJCQlJV0xfRVJSKHByaXYsICJSZWNlaXZlZCBCQSB3aGVuIG5vdCBleHBlY3RlZFxuIik7CkBAIC04OTksNiArMTE0OSwxNyBAQAogCQlyZXR1cm4gMDsKIAl9CiAKKwlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnJlY2xhaW1lZF9za2JzKTsKKworCS8qIFJlbGVhc2UgYWxsIFRGRHMgYmVmb3JlIHRoZSBTU04sIGkuZS4gYWxsIFRGRHMgaW4gZnJvbnQgb2YKKwkgKiBibG9jay1hY2sgd2luZG93ICh3ZSBhc3N1bWUgdGhhdCB0aGV5J3ZlIGJlZW4gc3VjY2Vzc2Z1bGx5CisJICogdHJhbnNtaXR0ZWQgLi4uIGlmIG5vdCwgaXQncyB0b28gbGF0ZSBhbnl3YXkpLiAqLworCWlmIChpd2xfdHJhbnNfcmVjbGFpbSh0cmFucyhwcml2KSwgc3RhX2lkLCB0aWQsIHNjZF9mbG93LAorCQkJICAgICAgYmFfcmVzcF9zY2Rfc3NuLCAwLCAmcmVjbGFpbWVkX3NrYnMpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCX0KKwogCUlXTF9ERUJVR19UWF9SRVBMWShwcml2LCAiUkVQTFlfQ09NUFJFU1NFRF9CQSBbJWRdIFJlY2VpdmVkIGZyb20gJXBNLCAiCiAJCQkgICAic3RhX2lkID0gJWRcbiIsCiAJCQkgICBhZ2ctPndhaXRfZm9yX2JhLApAQCAtOTA2LDExICsxMTY3LDkgQEAKIAkJCSAgIGJhX3Jlc3AtPnN0YV9pZCk7CiAJSVdMX0RFQlVHX1RYX1JFUExZKHByaXYsICJUSUQgPSAlZCwgU2VxQ3RsID0gJWQsIGJpdG1hcCA9IDB4JWxseCwgIgogCQkJICAgInNjZF9mbG93ID0gJWQsIHNjZF9zc24gPSAlZFxuIiwKLQkJCSAgIGJhX3Jlc3AtPnRpZCwKLQkJCSAgIGJhX3Jlc3AtPnNlcV9jdGwsCisJCQkgICBiYV9yZXNwLT50aWQsIGxlMTZfdG9fY3B1KGJhX3Jlc3AtPnNlcV9jdGwpLAogCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZylsZTY0X3RvX2NwdShiYV9yZXNwLT5iaXRtYXApLAotCQkJICAgYmFfcmVzcC0+c2NkX2Zsb3csCi0JCQkgICBiYV9yZXNwLT5zY2Rfc3NuKTsKKwkJCSAgIHNjZF9mbG93LCBiYV9yZXNwX3NjZF9zc24pOwogCiAJLyogTWFyayB0aGF0IHRoZSBleHBlY3RlZCBibG9jay1hY2sgcmVzcG9uc2UgYXJyaXZlZCAqLwogCWFnZy0+d2FpdF9mb3JfYmEgPSBmYWxzZTsKQEAgLTkyOSwxMyArMTE4OCw5IEBACiAJSVdMX0RFQlVHX0hUKHByaXYsICJhZ2cgZnJhbWVzIHNlbnQ6JWQsIGFja2VkOiVkXG4iLAogCQkJYmFfcmVzcC0+dHhlZCwgYmFfcmVzcC0+dHhlZF8yX2RvbmUpOwogCi0JX19za2JfcXVldWVfaGVhZF9pbml0KCZyZWNsYWltZWRfc2ticyk7CisJcHJpdi0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLm5leHRfcmVjbGFpbWVkID0gYmFfcmVzcF9zY2Rfc3NuOwogCi0JLyogUmVsZWFzZSBhbGwgVEZEcyBiZWZvcmUgdGhlIFNTTiwgaS5lLiBhbGwgVEZEcyBpbiBmcm9udCBvZgotCSAqIGJsb2NrLWFjayB3aW5kb3cgKHdlIGFzc3VtZSB0aGF0IHRoZXkndmUgYmVlbiBzdWNjZXNzZnVsbHkKLQkgKiB0cmFuc21pdHRlZCAuLi4gaWYgbm90LCBpdCdzIHRvbyBsYXRlIGFueXdheSkuICovCi0JaXdsX3RyYW5zX3JlY2xhaW0odHJhbnMocHJpdiksIHN0YV9pZCwgdGlkLCBzY2RfZmxvdywgYmFfcmVzcF9zY2Rfc3NuLAotCQkJICAwLCAmcmVjbGFpbWVkX3NrYnMpOworCWl3bGFnbl9jaGVja19yYXRpZF9lbXB0eShwcml2LCBzdGFfaWQsIHRpZCk7CiAJZnJlZWQgPSAwOwogCXdoaWxlICghc2tiX3F1ZXVlX2VtcHR5KCZyZWNsYWltZWRfc2ticykpIHsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLXVjb2RlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdWNvZGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhMGRkNS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24tdWNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDYzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogR1BMIExJQ0VOU0UgU1VNTUFSWQotICoKLSAqIENvcHlyaWdodChjKSAyMDA4IC0gMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQotICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKLSAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKLSAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCi0gKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCi0gKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLAotICogVVNBCi0gKgotICogVGhlIGZ1bGwgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgaW5jbHVkZWQgaW4gdGhpcyBkaXN0cmlidXRpb24KLSAqIGluIHRoZSBmaWxlIGNhbGxlZCBMSUNFTlNFLkdQTC4KLSAqCi0gKiBDb250YWN0IEluZm9ybWF0aW9uOgotICogIEludGVsIExpbnV4IFdpcmVsZXNzIDxpbHdAbGludXguaW50ZWwuY29tPgotICogSW50ZWwgQ29ycG9yYXRpb24sIDUyMDAgTi5FLiBFbGFtIFlvdW5nIFBhcmt3YXksIEhpbGxzYm9ybywgT1IgOTcxMjQtNjQ5NwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWlvLmgiCi0jaW5jbHVkZSAiaXdsLWFnbi1ody5oIgotI2luY2x1ZGUgIml3bC1hZ24uaCIKLSNpbmNsdWRlICJpd2wtYWduLWNhbGliLmgiCi0jaW5jbHVkZSAiaXdsLXRyYW5zLmgiCi0jaW5jbHVkZSAiaXdsLWZoLmgiCi0KLXN0YXRpYyBzdHJ1Y3QgaXdsX3dpbWF4X2NvZXhfZXZlbnRfZW50cnkgY3VfcHJpb3JpdGllc1tDT0VYX05VTV9PRl9FVkVOVFNdID0gewotCXtDT0VYX0NVX1VOQVNTT0NfSURMRV9SUCwgQ09FWF9DVV9VTkFTU09DX0lETEVfV1AsCi0JIDAsIENPRVhfVU5BU1NPQ19JRExFX0ZMQUdTfSwKLQl7Q09FWF9DVV9VTkFTU09DX01BTlVBTF9TQ0FOX1JQLCBDT0VYX0NVX1VOQVNTT0NfTUFOVUFMX1NDQU5fV1AsCi0JIDAsIENPRVhfVU5BU1NPQ19NQU5VQUxfU0NBTl9GTEFHU30sCi0Je0NPRVhfQ1VfVU5BU1NPQ19BVVRPX1NDQU5fUlAsIENPRVhfQ1VfVU5BU1NPQ19BVVRPX1NDQU5fV1AsCi0JIDAsIENPRVhfVU5BU1NPQ19BVVRPX1NDQU5fRkxBR1N9LAotCXtDT0VYX0NVX0NBTElCUkFUSU9OX1JQLCBDT0VYX0NVX0NBTElCUkFUSU9OX1dQLAotCSAwLCBDT0VYX0NBTElCUkFUSU9OX0ZMQUdTfSwKLQl7Q09FWF9DVV9QRVJJT0RJQ19DQUxJQlJBVElPTl9SUCwgQ09FWF9DVV9QRVJJT0RJQ19DQUxJQlJBVElPTl9XUCwKLQkgMCwgQ09FWF9QRVJJT0RJQ19DQUxJQlJBVElPTl9GTEFHU30sCi0Je0NPRVhfQ1VfQ09OTkVDVElPTl9FU1RBQl9SUCwgQ09FWF9DVV9DT05ORUNUSU9OX0VTVEFCX1dQLAotCSAwLCBDT0VYX0NPTk5FQ1RJT05fRVNUQUJfRkxBR1N9LAotCXtDT0VYX0NVX0FTU09DSUFURURfSURMRV9SUCwgQ09FWF9DVV9BU1NPQ0lBVEVEX0lETEVfV1AsCi0JIDAsIENPRVhfQVNTT0NJQVRFRF9JRExFX0ZMQUdTfSwKLQl7Q09FWF9DVV9BU1NPQ19NQU5VQUxfU0NBTl9SUCwgQ09FWF9DVV9BU1NPQ19NQU5VQUxfU0NBTl9XUCwKLQkgMCwgQ09FWF9BU1NPQ19NQU5VQUxfU0NBTl9GTEFHU30sCi0Je0NPRVhfQ1VfQVNTT0NfQVVUT19TQ0FOX1JQLCBDT0VYX0NVX0FTU09DX0FVVE9fU0NBTl9XUCwKLQkgMCwgQ09FWF9BU1NPQ19BVVRPX1NDQU5fRkxBR1N9LAotCXtDT0VYX0NVX0FTU09DX0FDVElWRV9MRVZFTF9SUCwgQ09FWF9DVV9BU1NPQ19BQ1RJVkVfTEVWRUxfV1AsCi0JIDAsIENPRVhfQVNTT0NfQUNUSVZFX0xFVkVMX0ZMQUdTfSwKLQl7Q09FWF9DVV9SRl9PTl9SUCwgQ09FWF9DVV9SRl9PTl9XUCwgMCwgQ09FWF9DVV9SRl9PTl9GTEFHU30sCi0Je0NPRVhfQ1VfUkZfT0ZGX1JQLCBDT0VYX0NVX1JGX09GRl9XUCwgMCwgQ09FWF9SRl9PRkZfRkxBR1N9LAotCXtDT0VYX0NVX1NUQU5EX0FMT05FX0RFQlVHX1JQLCBDT0VYX0NVX1NUQU5EX0FMT05FX0RFQlVHX1dQLAotCSAwLCBDT0VYX1NUQU5EX0FMT05FX0RFQlVHX0ZMQUdTfSwKLQl7Q09FWF9DVV9JUEFOX0FTU09DX0xFVkVMX1JQLCBDT0VYX0NVX0lQQU5fQVNTT0NfTEVWRUxfV1AsCi0JIDAsIENPRVhfSVBBTl9BU1NPQ19MRVZFTF9GTEFHU30sCi0Je0NPRVhfQ1VfUlNSVkQxX1JQLCBDT0VYX0NVX1JTUlZEMV9XUCwgMCwgQ09FWF9SU1JWRDFfRkxBR1N9LAotCXtDT0VYX0NVX1JTUlZEMl9SUCwgQ09FWF9DVV9SU1JWRDJfV1AsIDAsIENPRVhfUlNSVkQyX0ZMQUdTfQotfTsKLQotLyoKLSAqIHVjb2RlCi0gKi8KLXN0YXRpYyBpbnQgaXdsYWduX2xvYWRfc2VjdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGNvbnN0IGNoYXIgKm5hbWUsCi0JCQkJc3RydWN0IGZ3X2Rlc2MgKmltYWdlLCB1MzIgZHN0X2FkZHIpCi17Ci0JZG1hX2FkZHJfdCBwaHlfYWRkciA9IGltYWdlLT5wX2FkZHI7Ci0JdTMyIGJ5dGVfY250ID0gaW1hZ2UtPmxlbjsKLQlpbnQgcmV0OwotCi0JcHJpdi0+dWNvZGVfd3JpdGVfY29tcGxldGUgPSAwOwotCi0JaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyhwcml2KSwKLQkJRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoRkhfU1JWQ19DSE5MKSwKLQkJRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9QQVVTRSk7Ci0KLQlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzKHByaXYpLAotCQlGSF9TUlZDX0NITkxfU1JBTV9BRERSX1JFRyhGSF9TUlZDX0NITkwpLCBkc3RfYWRkcik7Ci0KLQlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzKHByaXYpLAotCQlGSF9URkRJQl9DVFJMMF9SRUcoRkhfU1JWQ19DSE5MKSwKLQkJcGh5X2FkZHIgJiBGSF9NRU1fVEZESUJfRFJBTV9BRERSX0xTQl9NU0spOwotCi0JaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyhwcml2KSwKLQkJRkhfVEZESUJfQ1RSTDFfUkVHKEZIX1NSVkNfQ0hOTCksCi0JCShpd2xfZ2V0X2RtYV9oaV9hZGRyKHBoeV9hZGRyKQotCQkJPDwgRkhfTUVNX1RGRElCX1JFRzFfQUREUl9CSVRTSElGVCkgfCBieXRlX2NudCk7Ci0KLQlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzKHByaXYpLAotCQlGSF9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUcoRkhfU1JWQ19DSE5MKSwKLQkJMSA8PCBGSF9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfUE9TX1RCX05VTSB8Ci0JCTEgPDwgRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1BPU19UQl9JRFggfAotCQlGSF9UQ1NSX0NITkxfVFhfQlVGX1NUU19SRUdfVkFMX1RGREJfVkFMSUQpOwotCi0JaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyhwcml2KSwKLQkJRkhfVENTUl9DSE5MX1RYX0NPTkZJR19SRUcoRkhfU1JWQ19DSE5MKSwKLQkJRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ0hOTF9FTkFCTEUJfAotCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0RNQV9DUkVESVRfRElTQUJMRQl8Ci0JCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfQ0lSUV9IT1NUX0VORFRGRCk7Ci0KLQlJV0xfREVCVUdfRlcocHJpdiwgIiVzIHVDb2RlIHNlY3Rpb24gYmVpbmcgbG9hZGVkLi4uXG4iLCBuYW1lKTsKLQlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQocHJpdi0+c2hyZC0+d2FpdF9jb21tYW5kX3F1ZXVlLAotCQkJCSBwcml2LT51Y29kZV93cml0ZV9jb21wbGV0ZSwgNSAqIEhaKTsKLQlpZiAoIXJldCkgewotCQlJV0xfRVJSKHByaXYsICJDb3VsZCBub3QgbG9hZCB0aGUgJXMgdUNvZGUgc2VjdGlvblxuIiwKLQkJCW5hbWUpOwotCQlyZXR1cm4gLUVUSU1FRE9VVDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fbG9hZF9naXZlbl91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGZ3X2ltZyAqaW1hZ2UpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQlyZXQgPSBpd2xhZ25fbG9hZF9zZWN0aW9uKHByaXYsICJJTlNUIiwgJmltYWdlLT5jb2RlLAotCQkJCSAgIElXTEFHTl9SVENfSU5TVF9MT1dFUl9CT1VORCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBpd2xhZ25fbG9hZF9zZWN0aW9uKHByaXYsICJEQVRBIiwgJmltYWdlLT5kYXRhLAotCQkJCSAgICBJV0xBR05fUlRDX0RBVEFfTE9XRVJfQk9VTkQpOwotfQotCi0vKgotICogIENhbGlicmF0aW9uCi0gKi8KLXN0YXRpYyBpbnQgaXdsYWduX3NldF9YdGFsX2NhbGliKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX2NhbGliX3h0YWxfZnJlcV9jbWQgY21kOwotCV9fbGUxNiAqeHRhbF9jYWxpYiA9Ci0JCShfX2xlMTYgKilpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgRUVQUk9NX1hUQUwpOwotCi0JaXdsX3NldF9jYWxpYl9oZHIoJmNtZC5oZHIsIElXTF9QSFlfQ0FMSUJSQVRFX0NSWVNUQUxfRlJRX0NNRCk7Ci0JY21kLmNhcF9waW4xID0gbGUxNl90b19jcHUoeHRhbF9jYWxpYlswXSk7Ci0JY21kLmNhcF9waW4yID0gbGUxNl90b19jcHUoeHRhbF9jYWxpYlsxXSk7Ci0JcmV0dXJuIGl3bF9jYWxpYl9zZXQoJnByaXYtPmNhbGliX3Jlc3VsdHNbSVdMX0NBTElCX1hUQUxdLAotCQkJICAgICAodTggKikmY21kLCBzaXplb2YoY21kKSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX3NldF90ZW1wZXJhdHVyZV9vZmZzZXRfY2FsaWIoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfY2FsaWJfdGVtcGVyYXR1cmVfb2Zmc2V0X2NtZCBjbWQ7Ci0JX19sZTE2ICpvZmZzZXRfY2FsaWIgPQotCQkoX19sZTE2ICopaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIEVFUFJPTV9SQVdfVEVNUEVSQVRVUkUpOwotCi0JbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKLQlpd2xfc2V0X2NhbGliX2hkcigmY21kLmhkciwgSVdMX1BIWV9DQUxJQlJBVEVfVEVNUF9PRkZTRVRfQ01EKTsKLQltZW1jcHkoJmNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0LCBvZmZzZXRfY2FsaWIsIHNpemVvZigqb2Zmc2V0X2NhbGliKSk7Ci0JaWYgKCEoY21kLnJhZGlvX3NlbnNvcl9vZmZzZXQpKQotCQljbWQucmFkaW9fc2Vuc29yX29mZnNldCA9IERFRkFVTFRfUkFESU9fU0VOU09SX09GRlNFVDsKLQotCUlXTF9ERUJVR19DQUxJQihwcml2LCAiUmFkaW8gc2Vuc29yIG9mZnNldDogJWRcbiIsCi0JCQlsZTE2X3RvX2NwdShjbWQucmFkaW9fc2Vuc29yX29mZnNldCkpOwotCXJldHVybiBpd2xfY2FsaWJfc2V0KCZwcml2LT5jYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9URU1QX09GRlNFVF0sCi0JCQkgICAgICh1OCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fc2V0X3RlbXBlcmF0dXJlX29mZnNldF9jYWxpYl92MihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF9jYWxpYl90ZW1wZXJhdHVyZV9vZmZzZXRfdjJfY21kIGNtZDsKLQlfX2xlMTYgKm9mZnNldF9jYWxpYl9oaWdoID0gKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LAotCQkJCSAgICAgRUVQUk9NX0tFTFZJTl9URU1QRVJBVFVSRSk7Ci0JX19sZTE2ICpvZmZzZXRfY2FsaWJfbG93ID0KLQkJKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBFRVBST01fUkFXX1RFTVBFUkFUVVJFKTsKLQlzdHJ1Y3QgaXdsX2VlcHJvbV9jYWxpYl9oZHIgKmhkcjsKLQotCW1lbXNldCgmY21kLCAwLCBzaXplb2YoY21kKSk7Ci0JaXdsX3NldF9jYWxpYl9oZHIoJmNtZC5oZHIsIElXTF9QSFlfQ0FMSUJSQVRFX1RFTVBfT0ZGU0VUX0NNRCk7Ci0JaGRyID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2hkciAqKWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LAotCQkJCQkJCUVFUFJPTV9DQUxJQl9BTEwpOwotCW1lbWNweSgmY21kLnJhZGlvX3NlbnNvcl9vZmZzZXRfaGlnaCwgb2Zmc2V0X2NhbGliX2hpZ2gsCi0JCXNpemVvZigqb2Zmc2V0X2NhbGliX2hpZ2gpKTsKLQltZW1jcHkoJmNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0X2xvdywgb2Zmc2V0X2NhbGliX2xvdywKLQkJc2l6ZW9mKCpvZmZzZXRfY2FsaWJfbG93KSk7Ci0JaWYgKCEoY21kLnJhZGlvX3NlbnNvcl9vZmZzZXRfbG93KSkgewotCQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIm5vIGluZm8gaW4gRUVQUk9NLCB1c2UgZGVmYXVsdFxuIik7Ci0JCWNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0X2xvdyA9IERFRkFVTFRfUkFESU9fU0VOU09SX09GRlNFVDsKLQkJY21kLnJhZGlvX3NlbnNvcl9vZmZzZXRfaGlnaCA9IERFRkFVTFRfUkFESU9fU0VOU09SX09GRlNFVDsKLQl9Ci0JbWVtY3B5KCZjbWQuYnVybnRWb2x0YWdlUmVmLCAmaGRyLT52b2x0YWdlLAotCQlzaXplb2YoaGRyLT52b2x0YWdlKSk7Ci0KLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIlJhZGlvIHNlbnNvciBvZmZzZXQgaGlnaDogJWRcbiIsCi0JCQlsZTE2X3RvX2NwdShjbWQucmFkaW9fc2Vuc29yX29mZnNldF9oaWdoKSk7Ci0JSVdMX0RFQlVHX0NBTElCKHByaXYsICJSYWRpbyBzZW5zb3Igb2Zmc2V0IGxvdzogJWRcbiIsCi0JCQlsZTE2X3RvX2NwdShjbWQucmFkaW9fc2Vuc29yX29mZnNldF9sb3cpKTsKLQlJV0xfREVCVUdfQ0FMSUIocHJpdiwgIlZvbHRhZ2UgUmVmOiAlZFxuIiwKLQkJCWxlMTZfdG9fY3B1KGNtZC5idXJudFZvbHRhZ2VSZWYpKTsKLQotCXJldHVybiBpd2xfY2FsaWJfc2V0KCZwcml2LT5jYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9URU1QX09GRlNFVF0sCi0JCQkgICAgICh1OCAqKSZjbWQsIHNpemVvZihjbWQpKTsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fc2VuZF9jYWxpYl9jZmcoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfY2FsaWJfY2ZnX2NtZCBjYWxpYl9jZmdfY21kOwotCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0gewotCQkuaWQgPSBDQUxJQlJBVElPTl9DRkdfQ01ELAotCQkubGVuID0geyBzaXplb2Yoc3RydWN0IGl3bF9jYWxpYl9jZmdfY21kKSwgfSwKLQkJLmRhdGEgPSB7ICZjYWxpYl9jZmdfY21kLCB9LAotCX07Ci0KLQltZW1zZXQoJmNhbGliX2NmZ19jbWQsIDAsIHNpemVvZihjYWxpYl9jZmdfY21kKSk7Ci0JY2FsaWJfY2ZnX2NtZC51Y2RfY2FsaWJfY2ZnLm9uY2UuaXNfZW5hYmxlID0gSVdMX0NBTElCX0lOSVRfQ0ZHX0FMTDsKLQljYWxpYl9jZmdfY21kLnVjZF9jYWxpYl9jZmcub25jZS5zdGFydCA9IElXTF9DQUxJQl9JTklUX0NGR19BTEw7Ci0JY2FsaWJfY2ZnX2NtZC51Y2RfY2FsaWJfY2ZnLm9uY2Uuc2VuZF9yZXMgPSBJV0xfQ0FMSUJfSU5JVF9DRkdfQUxMOwotCWNhbGliX2NmZ19jbWQudWNkX2NhbGliX2NmZy5mbGFncyA9Ci0JCUlXTF9DQUxJQl9DRkdfRkxBR19TRU5EX0NPTVBMRVRFX05URllfTVNLOwotCi0JcmV0dXJuIGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJmNtZCk7Ci19Ci0KLWludCBpd2xhZ25fcnhfY2FsaWJfcmVzdWx0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YiwKLQkJCSAgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCkKLXsKLQlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKLQlzdHJ1Y3QgaXdsX2NhbGliX2hkciAqaGRyID0gKHN0cnVjdCBpd2xfY2FsaWJfaGRyICopcGt0LT51LnJhdzsKLQlpbnQgbGVuID0gbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSzsKLQlpbnQgaW5kZXg7Ci0KLQkvKiByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYgKi8KLQlsZW4gLT0gNDsKLQotCS8qIERlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHJlc3VsdHMgd2lsbCBiZSBzZW50IHRvIHRoZSBydW50aW1lCi0JICogdUNvZGUuIGl3bF9zZW5kX2NhbGliX3Jlc3VsdHMgc2VuZHMgdGhlbSBpbiBhIHJvdyBhY2NvcmRpbmcgdG8KLQkgKiB0aGVpciBpbmRleC4gV2Ugc29ydCB0aGVtIGhlcmUKLQkgKi8KLQlzd2l0Y2ggKGhkci0+b3BfY29kZSkgewotCWNhc2UgSVdMX1BIWV9DQUxJQlJBVEVfRENfQ01EOgotCQlpbmRleCA9IElXTF9DQUxJQl9EQzsKLQkJYnJlYWs7Ci0JY2FzZSBJV0xfUEhZX0NBTElCUkFURV9MT19DTUQ6Ci0JCWluZGV4ID0gSVdMX0NBTElCX0xPOwotCQlicmVhazsKLQljYXNlIElXTF9QSFlfQ0FMSUJSQVRFX1RYX0lRX0NNRDoKLQkJaW5kZXggPSBJV0xfQ0FMSUJfVFhfSVE7Ci0JCWJyZWFrOwotCWNhc2UgSVdMX1BIWV9DQUxJQlJBVEVfVFhfSVFfUEVSRF9DTUQ6Ci0JCWluZGV4ID0gSVdMX0NBTElCX1RYX0lRX1BFUkQ7Ci0JCWJyZWFrOwotCWNhc2UgSVdMX1BIWV9DQUxJQlJBVEVfQkFTRV9CQU5EX0NNRDoKLQkJaW5kZXggPSBJV0xfQ0FMSUJfQkFTRV9CQU5EOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJVbmtub3duIGNhbGlicmF0aW9uIG5vdGlmaWNhdGlvbiAlZFxuIiwKLQkJCSAgaGRyLT5vcF9jb2RlKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpd2xfY2FsaWJfc2V0KCZwcml2LT5jYWxpYl9yZXN1bHRzW2luZGV4XSwgcGt0LT51LnJhdywgbGVuKTsKLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bGFnbl9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpbnQgcmV0OwotCi0JaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCi0JICAgIHByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0KSB7Ci0JCS8qCi0JCSAqIFRlbGwgdUNvZGUgd2UgYXJlIHJlYWR5IHRvIHBlcmZvcm0gY2FsaWJyYXRpb24KLQkJICogbmVlZCB0byBwZXJmb3JtIHRoaXMgYmVmb3JlIGFueSBjYWxpYnJhdGlvbgotCQkgKiBubyBuZWVkIHRvIGNsb3NlIHRoZSBlbnZsb3BlIHNpbmNlIHdlIGFyZSBnb2luZwotCQkgKiB0byBsb2FkIHRoZSBydW50aW1lIHVDb2RlIGxhdGVyLgotCQkgKi8KLQkJcmV0ID0gaXdsYWduX3NlbmRfYnRfZW52KHByaXYsIElXTF9CVF9DT0VYX0VOVl9PUEVOLAotCQkJQlRfQ09FWF9QUklPX1RCTF9FVlRfSU5JVF9DQUxJQjIpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCX0KLQotCXJldCA9IGl3bGFnbl9zZW5kX2NhbGliX2NmZyhwcml2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyoqCi0JICogdGVtcGVyYXR1cmUgb2Zmc2V0IGNhbGlicmF0aW9uIGlzIG9ubHkgbmVlZGVkIGZvciBydW50aW1lIHVjb2RlLAotCSAqIHNvIHByZXBhcmUgdGhlIHZhbHVlIG5vdy4KLQkgKi8KLQlpZiAocHJpdi0+Y2ZnLT5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliKSB7Ci0JCWlmIChwcml2LT5jZmctPnRlbXBfb2Zmc2V0X3YyKQotCQkJcmV0dXJuIGl3bGFnbl9zZXRfdGVtcGVyYXR1cmVfb2Zmc2V0X2NhbGliX3YyKHByaXYpOwotCQllbHNlCi0JCQlyZXR1cm4gaXdsYWduX3NldF90ZW1wZXJhdHVyZV9vZmZzZXRfY2FsaWIocHJpdik7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX3NlbmRfd2ltYXhfY29leChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCi17Ci0Jc3RydWN0IGl3bF93aW1heF9jb2V4X2NtZCBjb2V4X2NtZDsKLQotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5zdXBwb3J0X3dpbWF4X2NvZXhpc3QpIHsKLQkJLyogVW5NYXNrIHdha2UgdXAgc3JjIGF0IGFzc29jaWF0ZWQgc2xlZXAgKi8KLQkJY29leF9jbWQuZmxhZ3MgPSBDT0VYX0ZMQUdTX0FTU09DX1dBX1VOTUFTS19NU0s7Ci0KLQkJLyogVW5NYXNrIHdha2UgdXAgc3JjIGF0IHVuYXNzb2NpYXRlZCBzbGVlcCAqLwotCQljb2V4X2NtZC5mbGFncyB8PSBDT0VYX0ZMQUdTX1VOQVNTT0NfV0FfVU5NQVNLX01TSzsKLQkJbWVtY3B5KGNvZXhfY21kLnN0YV9wcmlvLCBjdV9wcmlvcml0aWVzLAotCQkJc2l6ZW9mKHN0cnVjdCBpd2xfd2ltYXhfY29leF9ldmVudF9lbnRyeSkgKgotCQkJIENPRVhfTlVNX09GX0VWRU5UUyk7Ci0KLQkJLyogZW5hYmxpbmcgdGhlIGNvZXhpc3RlbmNlIGZlYXR1cmUgKi8KLQkJY29leF9jbWQuZmxhZ3MgfD0gQ09FWF9GTEFHU19DT0VYX0VOQUJMRV9NU0s7Ci0KLQkJLyogZW5hYmxpbmcgdGhlIHByaW9yaXRpZXMgdGFibGVzICovCi0JCWNvZXhfY21kLmZsYWdzIHw9IENPRVhfRkxBR1NfU1RBX1RBQkxFX1ZBTElEX01TSzsKLQl9IGVsc2UgewotCQkvKiBjb2V4aXN0ZW5jZSBpcyBkaXNhYmxlZCAqLwotCQltZW1zZXQoJmNvZXhfY21kLCAwLCBzaXplb2YoY29leF9jbWQpKTsKLQl9Ci0JcmV0dXJuIGl3bF90cmFuc19zZW5kX2NtZF9wZHUodHJhbnMocHJpdiksCi0JCQkJQ09FWF9QUklPUklUWV9UQUJMRV9DTUQsIENNRF9TWU5DLAotCQkJCXNpemVvZihjb2V4X2NtZCksICZjb2V4X2NtZCk7Ci19Ci0KLXN0YXRpYyBjb25zdCB1OCBpd2xhZ25fYnRfcHJpb190YmxbQlRfQ09FWF9QUklPX1RCTF9FVlRfTUFYXSA9IHsKLQkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19CWVBBU1MgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKLQkJKDAgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCi0JKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fQllQQVNTIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1BSSU9fUE9TKSB8Ci0JCSgxIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1NIQVJFRF9BTlRFTk5BX1BPUykpLAotCSgoQlRfQ09FWF9QUklPX1RCTF9QUklPX0xPVyA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAotCQkoMCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKLQkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19MT1cgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKLQkJKDEgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCi0JKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fSElHSCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAotCQkoMCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKLQkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19ISUdIIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1BSSU9fUE9TKSB8Ci0JCSgxIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1NIQVJFRF9BTlRFTk5BX1BPUykpLAotCSgoQlRfQ09FWF9QUklPX1RCTF9QUklPX0JZUEFTUyA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAotCQkoMCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKLQkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19DT0VYX09GRiA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAotCQkoMCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKLQkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19DT0VYX09OIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1BSSU9fUE9TKSB8Ci0JCSgwIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1NIQVJFRF9BTlRFTk5BX1BPUykpLAotCTAsIDAsIDAsIDAsIDAsIDAsIDAKLX07Ci0KLXZvaWQgaXdsYWduX3NlbmRfcHJpb190Ymwoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfYnRfY29leF9wcmlvX3RhYmxlX2NtZCBwcmlvX3RibF9jbWQ7Ci0KLQltZW1jcHkocHJpb190YmxfY21kLnByaW9fdGJsLCBpd2xhZ25fYnRfcHJpb190YmwsCi0JCXNpemVvZihpd2xhZ25fYnRfcHJpb190YmwpKTsKLQlpZiAoaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucyhwcml2KSwKLQkJCQlSRVBMWV9CVF9DT0VYX1BSSU9fVEFCTEUsIENNRF9TWU5DLAotCQkJCXNpemVvZihwcmlvX3RibF9jbWQpLCAmcHJpb190YmxfY21kKSkKLQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNlbmQgQlQgcHJpbyB0YmwgY29tbWFuZFxuIik7Ci19Ci0KLWludCBpd2xhZ25fc2VuZF9idF9lbnYoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBhY3Rpb24sIHU4IHR5cGUpCi17Ci0Jc3RydWN0IGl3bF9idF9jb2V4X3Byb3RfZW52X2NtZCBlbnZfY21kOwotCWludCByZXQ7Ci0KLQllbnZfY21kLmFjdGlvbiA9IGFjdGlvbjsKLQllbnZfY21kLnR5cGUgPSB0eXBlOwotCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZF9wZHUodHJhbnMocHJpdiksCi0JCQkgICAgICAgUkVQTFlfQlRfQ09FWF9QUk9UX0VOViwgQ01EX1NZTkMsCi0JCQkgICAgICAgc2l6ZW9mKGVudl9jbWQpLCAmZW52X2NtZCk7Ci0JaWYgKHJldCkKLQkJSVdMX0VSUihwcml2LCAiZmFpbGVkIHRvIHNlbmQgQlQgZW52IGNvbW1hbmRcbiIpOwotCXJldHVybiByZXQ7Ci19Ci0KLQotc3RhdGljIGludCBpd2xhZ25fYWxpdmVfbm90aWZ5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCWludCByZXQ7Ci0KLQlpZiAoIXByaXYtPnR4X2NtZF9wb29sKQotCQlwcml2LT50eF9jbWRfcG9vbCA9Ci0JCQlrbWVtX2NhY2hlX2NyZWF0ZSgiaXdsYWduX2Rldl9jbWQiLAotCQkJCQkgIHNpemVvZihzdHJ1Y3QgaXdsX2RldmljZV9jbWQpLAotCQkJCQkgIHNpemVvZih2b2lkICopLCAwLCBOVUxMKTsKLQotCWlmICghcHJpdi0+dHhfY21kX3Bvb2wpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaXdsX3RyYW5zX3R4X3N0YXJ0KHRyYW5zKHByaXYpKTsKLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkKLQkJY3R4LT5sYXN0X3R4X3JlamVjdGVkID0gZmFsc2U7Ci0KLQlyZXQgPSBpd2xhZ25fc2VuZF93aW1heF9jb2V4KHByaXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBpd2xhZ25fc2V0X1h0YWxfY2FsaWIocHJpdik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiBpd2xfc2VuZF9jYWxpYl9yZXN1bHRzKHByaXYpOwotfQotCi0KLS8qKgotICogaXdsX3ZlcmlmeV9pbnN0X3NwYXJzZSAtIHZlcmlmeSBydW50aW1lIHVDb2RlIGltYWdlIGluIGNhcmQgdnMuIGhvc3QsCi0gKiAgIHVzaW5nIHNhbXBsZSBkYXRhIDEwMCBieXRlcyBhcGFydC4gIElmIHRoZXNlIHNhbXBsZSBwb2ludHMgYXJlIGdvb2QsCi0gKiAgIGl0J3MgYSBwcmV0dHkgZ29vZCBiZXQgdGhhdCBldmVyeXRoaW5nIGJldHdlZW4gdGhlbSBpcyBnb29kLCB0b28uCi0gKi8KLXN0YXRpYyBpbnQgaXdsX3ZlcmlmeV9pbnN0X3NwYXJzZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgICAgc3RydWN0IGZ3X2Rlc2MgKmZ3X2Rlc2MpCi17Ci0JX19sZTMyICppbWFnZSA9IChfX2xlMzIgKilmd19kZXNjLT52X2FkZHI7Ci0JdTMyIGxlbiA9IGZ3X2Rlc2MtPmxlbjsKLQl1MzIgdmFsOwotCXUzMiBpOwotCi0JSVdMX0RFQlVHX0ZXKHByaXYsICJ1Y29kZSBpbnN0IGltYWdlIHNpemUgaXMgJXVcbiIsIGxlbik7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpICs9IDEwMCwgaW1hZ2UgKz0gMTAwL3NpemVvZih1MzIpKSB7Ci0JCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLwotCQkvKiBOT1RFOiBVc2UgdGhlIGRlYnVnbGVzcyByZWFkIHNvIHdlIGRvbid0IGZsb29kIGtlcm5lbCBsb2cKLQkJICogaWYgSVdMX0RMX0lPIGlzIHNldCAqLwotCQlpd2xfd3JpdGVfZGlyZWN0MzIoYnVzKHByaXYpLCBIQlVTX1RBUkdfTUVNX1JBRERSLAotCQkJaSArIElXTEFHTl9SVENfSU5TVF9MT1dFUl9CT1VORCk7Ci0JCXZhbCA9IGl3bF9yZWFkMzIoYnVzKHByaXYpLCBIQlVTX1RBUkdfTUVNX1JEQVQpOwotCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpCi0JCQlyZXR1cm4gLUVJTzsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgaXdsX3ByaW50X21pc21hdGNoX2luc3Qoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgICBzdHJ1Y3QgZndfZGVzYyAqZndfZGVzYykKLXsKLQlfX2xlMzIgKmltYWdlID0gKF9fbGUzMiAqKWZ3X2Rlc2MtPnZfYWRkcjsKLQl1MzIgbGVuID0gZndfZGVzYy0+bGVuOwotCXUzMiB2YWw7Ci0JdTMyIG9mZnM7Ci0JaW50IGVycm9ycyA9IDA7Ci0KLQlJV0xfREVCVUdfRlcocHJpdiwgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKLQotCWl3bF93cml0ZV9kaXJlY3QzMihidXMocHJpdiksIEhCVVNfVEFSR19NRU1fUkFERFIsCi0JCQkgICBJV0xBR05fUlRDX0lOU1RfTE9XRVJfQk9VTkQpOwotCi0JZm9yIChvZmZzID0gMDsKLQkgICAgIG9mZnMgPCBsZW4gJiYgZXJyb3JzIDwgMjA7Ci0JICAgICBvZmZzICs9IHNpemVvZih1MzIpLCBpbWFnZSsrKSB7Ci0JCS8qIHJlYWQgZGF0YSBjb21lcyB0aHJvdWdoIHNpbmdsZSBwb3J0LCBhdXRvLWluY3IgYWRkciAqLwotCQl2YWwgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgSEJVU19UQVJHX01FTV9SREFUKTsKLQkJaWYgKHZhbCAhPSBsZTMyX3RvX2NwdSgqaW1hZ2UpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJ1Q29kZSBJTlNUIHNlY3Rpb24gYXQgIgotCQkJCSJvZmZzZXQgMHgleCwgaXMgMHgleCwgcy9iIDB4JXhcbiIsCi0JCQkJb2ZmcywgdmFsLCBsZTMyX3RvX2NwdSgqaW1hZ2UpKTsKLQkJCWVycm9ycysrOwotCQl9Ci0JfQotfQotCi0vKioKLSAqIGl3bF92ZXJpZnlfdWNvZGUgLSBkZXRlcm1pbmUgd2hpY2ggaW5zdHJ1Y3Rpb24gaW1hZ2UgaXMgaW4gU1JBTSwKLSAqICAgIGFuZCB2ZXJpZnkgaXRzIGNvbnRlbnRzCi0gKi8KLXN0YXRpYyBpbnQgaXdsX3ZlcmlmeV91Y29kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBmd19pbWcgKmltZykKLXsKLQlpZiAoIWl3bF92ZXJpZnlfaW5zdF9zcGFyc2UocHJpdiwgJmltZy0+Y29kZSkpIHsKLQkJSVdMX0RFQlVHX0ZXKHByaXYsICJ1Q29kZSBpcyBnb29kIGluIGluc3QgU1JBTVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCUlXTF9FUlIocHJpdiwgIlVDT0RFIElNQUdFIElOIElOU1RSVUNUSU9OIFNSQU0gTk9UIFZBTElEISFcbiIpOwotCi0JaXdsX3ByaW50X21pc21hdGNoX2luc3QocHJpdiwgJmltZy0+Y29kZSk7Ci0JcmV0dXJuIC1FSU87Ci19Ci0KLXN0cnVjdCBpd2xhZ25fYWxpdmVfZGF0YSB7Ci0JYm9vbCB2YWxpZDsKLQl1OCBzdWJ0eXBlOwotfTsKLQotc3RhdGljIHZvaWQgaXdsYWduX2FsaXZlX2ZuKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAotCQkJICAgIHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGl3bGFnbl9hbGl2ZV9kYXRhICphbGl2ZV9kYXRhID0gZGF0YTsKLQlzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3AgKnBhbGl2ZTsKLQotCXBhbGl2ZSA9ICZwa3QtPnUuYWxpdmVfZnJhbWU7Ci0KLQlJV0xfREVCVUdfRlcocHJpdiwgIkFsaXZlIHVjb2RlIHN0YXR1cyAweCUwOFggcmV2aXNpb24gIgotCQkgICAgICAgIjB4JTAxWCAweCUwMVhcbiIsCi0JCSAgICAgICBwYWxpdmUtPmlzX3ZhbGlkLCBwYWxpdmUtPnZlcl90eXBlLAotCQkgICAgICAgcGFsaXZlLT52ZXJfc3VidHlwZSk7Ci0KLQlwcml2LT5kZXZpY2VfcG9pbnRlcnMuZXJyb3JfZXZlbnRfdGFibGUgPQotCQlsZTMyX3RvX2NwdShwYWxpdmUtPmVycm9yX2V2ZW50X3RhYmxlX3B0cik7Ci0JcHJpdi0+ZGV2aWNlX3BvaW50ZXJzLmxvZ19ldmVudF90YWJsZSA9Ci0JCWxlMzJfdG9fY3B1KHBhbGl2ZS0+bG9nX2V2ZW50X3RhYmxlX3B0cik7Ci0KLQlhbGl2ZV9kYXRhLT5zdWJ0eXBlID0gcGFsaXZlLT52ZXJfc3VidHlwZTsKLQlhbGl2ZV9kYXRhLT52YWxpZCA9IHBhbGl2ZS0+aXNfdmFsaWQgPT0gVUNPREVfVkFMSURfT0s7Ci19Ci0KLSNkZWZpbmUgVUNPREVfQUxJVkVfVElNRU9VVAlIWgotI2RlZmluZSBVQ09ERV9DQUxJQl9USU1FT1VUCSgyKkhaKQotCi1pbnQgaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBmd19pbWcgKmltYWdlLAotCQkJCSBlbnVtIGl3bGFnbl91Y29kZV90eXBlIHVjb2RlX3R5cGUpCi17Ci0Jc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCBhbGl2ZV93YWl0OwotCXN0cnVjdCBpd2xhZ25fYWxpdmVfZGF0YSBhbGl2ZV9kYXRhOwotCWludCByZXQ7Ci0JZW51bSBpd2xhZ25fdWNvZGVfdHlwZSBvbGRfdHlwZTsKLQotCXJldCA9IGl3bF90cmFuc19zdGFydF9kZXZpY2UodHJhbnMocHJpdikpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpd2xhZ25faW5pdF9ub3RpZmljYXRpb25fd2FpdChwcml2LCAmYWxpdmVfd2FpdCwgUkVQTFlfQUxJVkUsCi0JCQkJICAgICAgaXdsYWduX2FsaXZlX2ZuLCAmYWxpdmVfZGF0YSk7Ci0KLQlvbGRfdHlwZSA9IHByaXYtPnVjb2RlX3R5cGU7Ci0JcHJpdi0+dWNvZGVfdHlwZSA9IHVjb2RlX3R5cGU7Ci0KLQlyZXQgPSBpd2xhZ25fbG9hZF9naXZlbl91Y29kZShwcml2LCBpbWFnZSk7Ci0JaWYgKHJldCkgewotCQlwcml2LT51Y29kZV90eXBlID0gb2xkX3R5cGU7Ci0JCWl3bGFnbl9yZW1vdmVfbm90aWZpY2F0aW9uKHByaXYsICZhbGl2ZV93YWl0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpd2xfdHJhbnNfa2lja19uaWModHJhbnMocHJpdikpOwotCi0JLyoKLQkgKiBTb21lIHRoaW5ncyBtYXkgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIG5vdywgYnV0IHdlCi0JICoganVzdCB3YWl0IGZvciB0aGUgQUxJVkUgbm90aWZpY2F0aW9uIGhlcmUuCi0JICovCi0JcmV0ID0gaXdsYWduX3dhaXRfbm90aWZpY2F0aW9uKHByaXYsICZhbGl2ZV93YWl0LCBVQ09ERV9BTElWRV9USU1FT1VUKTsKLQlpZiAocmV0KSB7Ci0JCXByaXYtPnVjb2RlX3R5cGUgPSBvbGRfdHlwZTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoIWFsaXZlX2RhdGEudmFsaWQpIHsKLQkJSVdMX0VSUihwcml2LCAiTG9hZGVkIHVjb2RlIGlzIG5vdCB2YWxpZCFcbiIpOwotCQlwcml2LT51Y29kZV90eXBlID0gb2xkX3R5cGU7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCS8qCi0JICogVGhpcyBzdGVwIHRha2VzIGEgbG9uZyB0aW1lICg2MC04MG1zISEpIGFuZAotCSAqIFdvV0xBTiBpbWFnZSBzaG91bGQgYmUgbG9hZGVkIHF1aWNrbHksIHNvCi0JICogc2tpcCBpdCBmb3IgV29XTEFOLgotCSAqLwotCWlmICh1Y29kZV90eXBlICE9IElXTF9VQ09ERV9XT1dMQU4pIHsKLQkJcmV0ID0gaXdsX3ZlcmlmeV91Y29kZShwcml2LCBpbWFnZSk7Ci0JCWlmIChyZXQpIHsKLQkJCXByaXYtPnVjb2RlX3R5cGUgPSBvbGRfdHlwZTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQotCQkvKiBkZWxheSBhIGJpdCB0byBnaXZlIHJma2lsbCB0aW1lIHRvIHJ1biAqLwotCQltc2xlZXAoNSk7Ci0JfQotCi0JcmV0ID0gaXdsYWduX2FsaXZlX25vdGlmeShwcml2KTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9XQVJOKHByaXYsCi0JCQkiQ291bGQgbm90IGNvbXBsZXRlIEFMSVZFIHRyYW5zaXRpb246ICVkXG4iLCByZXQpOwotCQlwcml2LT51Y29kZV90eXBlID0gb2xkX3R5cGU7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2xhZ25fcnVuX2luaXRfdWNvZGUoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgY2FsaWJfd2FpdDsKLQlpbnQgcmV0OwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JLyogTm8gaW5pdCB1Y29kZSByZXF1aXJlZD8gQ3VyaW91cywgYnV0IG1heWJlIG9rICovCi0JaWYgKCFwcml2LT51Y29kZV9pbml0LmNvZGUubGVuKQotCQlyZXR1cm4gMDsKLQotCWlmIChwcml2LT51Y29kZV90eXBlICE9IElXTF9VQ09ERV9OT05FKQotCQlyZXR1cm4gMDsKLQotCWl3bGFnbl9pbml0X25vdGlmaWNhdGlvbl93YWl0KHByaXYsICZjYWxpYl93YWl0LAotCQkJCSAgICAgIENBTElCUkFUSU9OX0NPTVBMRVRFX05PVElGSUNBVElPTiwKLQkJCQkgICAgICBOVUxMLCBOVUxMKTsKLQotCS8qIFdpbGwgYWxzbyBzdGFydCB0aGUgZGV2aWNlICovCi0JcmV0ID0gaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShwcml2LCAmcHJpdi0+dWNvZGVfaW5pdCwKLQkJCQkJICAgSVdMX1VDT0RFX0lOSVQpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBpd2xhZ25faW5pdF9hbGl2ZV9zdGFydChwcml2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yOwotCi0JLyoKLQkgKiBTb21lIHRoaW5ncyBtYXkgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIG5vdywgYnV0IHdlCi0JICoganVzdCB3YWl0IGZvciB0aGUgY2FsaWJyYXRpb24gY29tcGxldGUgbm90aWZpY2F0aW9uLgotCSAqLwotCXJldCA9IGl3bGFnbl93YWl0X25vdGlmaWNhdGlvbihwcml2LCAmY2FsaWJfd2FpdCwgVUNPREVfQ0FMSUJfVElNRU9VVCk7Ci0KLQlnb3RvIG91dDsKLQotIGVycm9yOgotCWl3bGFnbl9yZW1vdmVfbm90aWZpY2F0aW9uKHByaXYsICZjYWxpYl93YWl0KTsKLSBvdXQ6Ci0JLyogV2hhdGV2ZXIgaGFwcGVuZWQsIHN0b3AgdGhlIGRldmljZSAqLwotCWl3bF90cmFuc19zdG9wX2RldmljZSh0cmFucyhwcml2KSk7Ci0JcmV0dXJuIHJldDsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMKaW5kZXggY2NiYTY5Yi4uYjVjN2M1ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYWduLmMKQEAgLTMwLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgpAQCAtNDQsNiArNDMsNyBAQAogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgogCiAjaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgorI2luY2x1ZGUgIml3bC13aWZpLmgiCiAjaW5jbHVkZSAiaXdsLWRldi5oIgogI2luY2x1ZGUgIml3bC1jb3JlLmgiCiAjaW5jbHVkZSAiaXdsLWlvLmgiCkBAIC0zNjcsNyArMzY3LDcgQEAKIAl1MzIgbnVtX3dyYXBzOyAgLyogIyB0aW1lcyB1Q29kZSB3cmFwcGVkIHRvIHRvcCBvZiBsb2cgKi8KIAl1MzIgbmV4dF9lbnRyeTsgLyogaW5kZXggb2YgbmV4dCBlbnRyeSB0byBiZSB3cml0dGVuIGJ5IHVDb2RlICovCiAKLQliYXNlID0gcHJpdi0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlOworCWJhc2UgPSBwcml2LT5zaHJkLT5kZXZpY2VfcG9pbnRlcnMuZXJyb3JfZXZlbnRfdGFibGU7CiAJaWYgKGl3bGFnbl9od192YWxpZF9ydGNfZGF0YV9hZGRyKGJhc2UpKSB7CiAJCWNhcGFjaXR5ID0gaXdsX3JlYWRfdGFyZ19tZW0oYnVzKHByaXYpLCBiYXNlKTsKIAkJbnVtX3dyYXBzID0gaXdsX3JlYWRfdGFyZ19tZW0oYnVzKHByaXYpLApAQCAtNDUyLDUyICs0NTIsNiBAQAogCWl3bGFnbl9kZXZfdHhmaWZvX2ZsdXNoKHByaXYsIElXTF9EUk9QX0FMTCk7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCi0gKiB1Q29kZSBkb3dubG9hZCBmdW5jdGlvbnMKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBpd2xfZnJlZV9md19kZXNjKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGZ3X2Rlc2MgKmRlc2MpCi17Ci0JaWYgKGRlc2MtPnZfYWRkcikKLQkJZG1hX2ZyZWVfY29oZXJlbnQoYnVzKHByaXYpLT5kZXYsIGRlc2MtPmxlbiwKLQkJCQkgIGRlc2MtPnZfYWRkciwgZGVzYy0+cF9hZGRyKTsKLQlkZXNjLT52X2FkZHIgPSBOVUxMOwotCWRlc2MtPmxlbiA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9mcmVlX2Z3X2ltZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBmd19pbWcgKmltZykKLXsKLQlpd2xfZnJlZV9md19kZXNjKHByaXYsICZpbWctPmNvZGUpOwotCWl3bF9mcmVlX2Z3X2Rlc2MocHJpdiwgJmltZy0+ZGF0YSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9kZWFsbG9jX3Vjb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKLXsKLQlpd2xfZnJlZV9md19pbWcocHJpdiwgJnByaXYtPnVjb2RlX3J0KTsKLQlpd2xfZnJlZV9md19pbWcocHJpdiwgJnByaXYtPnVjb2RlX2luaXQpOwotCWl3bF9mcmVlX2Z3X2ltZyhwcml2LCAmcHJpdi0+dWNvZGVfd293bGFuKTsKLX0KLQotc3RhdGljIGludCBpd2xfYWxsb2NfZndfZGVzYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBmd19kZXNjICpkZXNjLAotCQkJICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQotewotCWlmICghbGVuKSB7Ci0JCWRlc2MtPnZfYWRkciA9IE5VTEw7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWRlc2MtPnZfYWRkciA9IGRtYV9hbGxvY19jb2hlcmVudChidXMocHJpdiktPmRldiwgbGVuLAotCQkJCQkgICZkZXNjLT5wX2FkZHIsIEdGUF9LRVJORUwpOwotCWlmICghZGVzYy0+dl9hZGRyKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCWRlc2MtPmxlbiA9IGxlbjsKLQltZW1jcHkoZGVzYy0+dl9hZGRyLCBkYXRhLCBsZW4pOwotCXJldHVybiAwOwotfQotCiBzdGF0aWMgdm9pZCBpd2xfaW5pdF9jb250ZXh0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHVjb2RlX2ZsYWdzKQogewogCWludCBpOwpAQCAtNTU1LDIzICs1MDksMTQgQEAKIAlCVUlMRF9CVUdfT04oTlVNX0lXTF9SWE9OX0NUWCAhPSAyKTsKIH0KIAotCi1zdHJ1Y3QgaXdsYWduX3Vjb2RlX2NhcGFiaWxpdGllcyB7Ci0JdTMyIG1heF9wcm9iZV9sZW5ndGg7Ci0JdTMyIHN0YW5kYXJkX3BoeV9jYWxpYnJhdGlvbl9zaXplOwotCXUzMiBmbGFnczsKLX07Ci0KIHN0YXRpYyB2b2lkIGl3bF91Y29kZV9jYWxsYmFjayhjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKnVjb2RlX3Jhdywgdm9pZCAqY29udGV4dCk7Ci1zdGF0aWMgaW50IGl3bGFnbl9tYWNfc2V0dXBfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCSAgc3RydWN0IGl3bGFnbl91Y29kZV9jYXBhYmlsaXRpZXMgKmNhcGEpOwogCiAjZGVmaW5lIFVDT0RFX0VYUEVSSU1FTlRBTF9JTkRFWAkxMDAKICNkZWZpbmUgVUNPREVfRVhQRVJJTUVOVEFMX1RBRwkJImV4cCIKIAogc3RhdGljIGludCBfX211c3RfY2hlY2sgaXdsX3JlcXVlc3RfZmlybXdhcmUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBib29sIGZpcnN0KQogewotCWNvbnN0IGNoYXIgKm5hbWVfcHJlID0gcHJpdi0+Y2ZnLT5md19uYW1lX3ByZTsKKwljb25zdCBjaGFyICpuYW1lX3ByZSA9IGNmZyhwcml2KS0+ZndfbmFtZV9wcmU7CiAJY2hhciB0YWdbOF07CiAKIAlpZiAoZmlyc3QpIHsKQEAgLTU4MCwxNCArNTI1LDE0IEBACiAJCXN0cmNweSh0YWcsIFVDT0RFX0VYUEVSSU1FTlRBTF9UQUcpOwogCX0gZWxzZSBpZiAocHJpdi0+ZndfaW5kZXggPT0gVUNPREVfRVhQRVJJTUVOVEFMX0lOREVYKSB7CiAjZW5kaWYKLQkJcHJpdi0+ZndfaW5kZXggPSBwcml2LT5jZmctPnVjb2RlX2FwaV9tYXg7CisJCXByaXYtPmZ3X2luZGV4ID0gY2ZnKHByaXYpLT51Y29kZV9hcGlfbWF4OwogCQlzcHJpbnRmKHRhZywgIiVkIiwgcHJpdi0+ZndfaW5kZXgpOwogCX0gZWxzZSB7CiAJCXByaXYtPmZ3X2luZGV4LS07CiAJCXNwcmludGYodGFnLCAiJWQiLCBwcml2LT5md19pbmRleCk7CiAJfQogCi0JaWYgKHByaXYtPmZ3X2luZGV4IDwgcHJpdi0+Y2ZnLT51Y29kZV9hcGlfbWluKSB7CisJaWYgKHByaXYtPmZ3X2luZGV4IDwgY2ZnKHByaXYpLT51Y29kZV9hcGlfbWluKSB7CiAJCUlXTF9FUlIocHJpdiwgIm5vIHN1aXRhYmxlIGZpcm13YXJlIGZvdW5kIVxuIik7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KQEAgLTg5Miw5ICs4MzcsOSBAQAogCXN0cnVjdCBpd2xfdWNvZGVfaGVhZGVyICp1Y29kZTsKIAlpbnQgZXJyOwogCXN0cnVjdCBpd2xhZ25fZmlybXdhcmVfcGllY2VzIHBpZWNlczsKLQljb25zdCB1bnNpZ25lZCBpbnQgYXBpX21heCA9IHByaXYtPmNmZy0+dWNvZGVfYXBpX21heDsKLQl1bnNpZ25lZCBpbnQgYXBpX29rID0gcHJpdi0+Y2ZnLT51Y29kZV9hcGlfb2s7Ci0JY29uc3QgdW5zaWduZWQgaW50IGFwaV9taW4gPSBwcml2LT5jZmctPnVjb2RlX2FwaV9taW47CisJY29uc3QgdW5zaWduZWQgaW50IGFwaV9tYXggPSBjZmcocHJpdiktPnVjb2RlX2FwaV9tYXg7CisJdW5zaWduZWQgaW50IGFwaV9vayA9IGNmZyhwcml2KS0+dWNvZGVfYXBpX29rOworCWNvbnN0IHVuc2lnbmVkIGludCBhcGlfbWluID0gY2ZnKHByaXYpLT51Y29kZV9hcGlfbWluOwogCXUzMiBhcGlfdmVyOwogCWNoYXIgYnVpbGRzdHJbMjVdOwogCXUzMiBidWlsZDsKQEAgLTEwNDAsMzAgKzk4NSwzMiBAQAogCS8qIFJ1bnRpbWUgaW5zdHJ1Y3Rpb25zIGFuZCAyIGNvcGllcyBvZiBkYXRhOgogCSAqIDEpIHVubW9kaWZpZWQgZnJvbSBkaXNrCiAJICogMikgYmFja3VwIGNhY2hlIGZvciBzYXZlL3Jlc3RvcmUgZHVyaW5nIHBvd2VyLWRvd25zICovCi0JaWYgKGl3bF9hbGxvY19md19kZXNjKHByaXYsICZwcml2LT51Y29kZV9ydC5jb2RlLAorCWlmIChpd2xfYWxsb2NfZndfZGVzYyhidXMocHJpdiksICZ0cmFucyhwcml2KS0+dWNvZGVfcnQuY29kZSwKIAkJCSAgICAgIHBpZWNlcy5pbnN0LCBwaWVjZXMuaW5zdF9zaXplKSkKIAkJZ290byBlcnJfcGNpX2FsbG9jOwotCWlmIChpd2xfYWxsb2NfZndfZGVzYyhwcml2LCAmcHJpdi0+dWNvZGVfcnQuZGF0YSwKKwlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MoYnVzKHByaXYpLCAmdHJhbnMocHJpdiktPnVjb2RlX3J0LmRhdGEsCiAJCQkgICAgICBwaWVjZXMuZGF0YSwgcGllY2VzLmRhdGFfc2l6ZSkpCiAJCWdvdG8gZXJyX3BjaV9hbGxvYzsKIAogCS8qIEluaXRpYWxpemF0aW9uIGluc3RydWN0aW9ucyBhbmQgZGF0YSAqLwogCWlmIChwaWVjZXMuaW5pdF9zaXplICYmIHBpZWNlcy5pbml0X2RhdGFfc2l6ZSkgewotCQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MocHJpdiwgJnByaXYtPnVjb2RlX2luaXQuY29kZSwKKwkJaWYgKGl3bF9hbGxvY19md19kZXNjKGJ1cyhwcml2KSwgJnRyYW5zKHByaXYpLT51Y29kZV9pbml0LmNvZGUsCiAJCQkJICAgICAgcGllY2VzLmluaXQsIHBpZWNlcy5pbml0X3NpemUpKQogCQkJZ290byBlcnJfcGNpX2FsbG9jOwotCQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MocHJpdiwgJnByaXYtPnVjb2RlX2luaXQuZGF0YSwKKwkJaWYgKGl3bF9hbGxvY19md19kZXNjKGJ1cyhwcml2KSwgJnRyYW5zKHByaXYpLT51Y29kZV9pbml0LmRhdGEsCiAJCQkJICAgICAgcGllY2VzLmluaXRfZGF0YSwgcGllY2VzLmluaXRfZGF0YV9zaXplKSkKIAkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKIAl9CiAKIAkvKiBXb1dMQU4gaW5zdHJ1Y3Rpb25zIGFuZCBkYXRhICovCiAJaWYgKHBpZWNlcy53b3dsYW5faW5zdF9zaXplICYmIHBpZWNlcy53b3dsYW5fZGF0YV9zaXplKSB7Ci0JCWlmIChpd2xfYWxsb2NfZndfZGVzYyhwcml2LCAmcHJpdi0+dWNvZGVfd293bGFuLmNvZGUsCisJCWlmIChpd2xfYWxsb2NfZndfZGVzYyhidXMocHJpdiksCisJCQkJICAgICAgJnRyYW5zKHByaXYpLT51Y29kZV93b3dsYW4uY29kZSwKIAkJCQkgICAgICBwaWVjZXMud293bGFuX2luc3QsCiAJCQkJICAgICAgcGllY2VzLndvd2xhbl9pbnN0X3NpemUpKQogCQkJZ290byBlcnJfcGNpX2FsbG9jOwotCQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MocHJpdiwgJnByaXYtPnVjb2RlX3dvd2xhbi5kYXRhLAorCQlpZiAoaXdsX2FsbG9jX2Z3X2Rlc2MoYnVzKHByaXYpLAorCQkJCSAgICAgICZ0cmFucyhwcml2KS0+dWNvZGVfd293bGFuLmRhdGEsCiAJCQkJICAgICAgcGllY2VzLndvd2xhbl9kYXRhLAogCQkJCSAgICAgIHBpZWNlcy53b3dsYW5fZGF0YV9zaXplKSkKIAkJCWdvdG8gZXJyX3BjaV9hbGxvYzsKQEAgLTEwODEsMjAgKzEwMjgsMjMgQEAKIAkJcHJpdi0+aW5pdF9ldnRsb2dfc2l6ZSA9IChwaWVjZXMuaW5pdF9ldnRsb2dfc2l6ZSAtIDE2KS8xMjsKIAllbHNlCiAJCXByaXYtPmluaXRfZXZ0bG9nX3NpemUgPQotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bWF4X2V2ZW50X2xvZ19zaXplOworCQkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+bWF4X2V2ZW50X2xvZ19zaXplOwogCXByaXYtPmluaXRfZXJybG9nX3B0ciA9IHBpZWNlcy5pbml0X2VycmxvZ19wdHI7CiAJcHJpdi0+aW5zdF9ldnRsb2dfcHRyID0gcGllY2VzLmluc3RfZXZ0bG9nX3B0cjsKIAlpZiAocGllY2VzLmluc3RfZXZ0bG9nX3NpemUpCiAJCXByaXYtPmluc3RfZXZ0bG9nX3NpemUgPSAocGllY2VzLmluc3RfZXZ0bG9nX3NpemUgLSAxNikvMTI7CiAJZWxzZQogCQlwcml2LT5pbnN0X2V2dGxvZ19zaXplID0KLQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm1heF9ldmVudF9sb2dfc2l6ZTsKKwkJCWNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPm1heF9ldmVudF9sb2dfc2l6ZTsKIAlwcml2LT5pbnN0X2VycmxvZ19wdHIgPSBwaWVjZXMuaW5zdF9lcnJsb2dfcHRyOworI2lmbmRlZiBDT05GSUdfSVdMV0lGSV9QMlAKKwl1Y29kZV9jYXBhLmZsYWdzICY9IH5JV0xfVUNPREVfVExWX0ZMQUdTX1BBTjsKKyNlbmRpZgogCiAJcHJpdi0+bmV3X3NjYW5fdGhyZXNob2xkX2JlaGF2aW91ciA9CiAJCSEhKHVjb2RlX2NhcGEuZmxhZ3MgJiBJV0xfVUNPREVfVExWX0ZMQUdTX05FV1NDQU4pOwogCi0JaWYgKCEocHJpdi0+Y2ZnLT5za3UgJiBFRVBST01fU0tVX0NBUF9JUEFOX0VOQUJMRSkpCisJaWYgKCEoY2ZnKHByaXYpLT5za3UgJiBFRVBST01fU0tVX0NBUF9JUEFOX0VOQUJMRSkpCiAJCXVjb2RlX2NhcGEuZmxhZ3MgJj0gfklXTF9VQ09ERV9UTFZfRkxBR1NfUEFOOwogCiAJLyoKQEAgLTExMTEsNyArMTA2MSw2IEBACiAJCXByaXYtPnN0YV9rZXlfbWF4X251bSA9IFNUQV9LRVlfTUFYX05VTTsKIAkJcHJpdi0+c2hyZC0+Y21kX3F1ZXVlID0gSVdMX0RFRkFVTFRfQ01EX1FVRVVFX05VTTsKIAl9Ci0KIAkvKgogCSAqIGZpZ3VyZSBvdXQgdGhlIG9mZnNldCBvZiBjaGFpbiBub2lzZSByZXNldCBhbmQgZ2FpbiBjb21tYW5kcwogCSAqIGJhc2Ugb24gdGhlIHNpemUgb2Ygc3RhbmRhcmQgcGh5IGNhbGlicmF0aW9uIGNvbW1hbmRzIHRhYmxlIHNpemUKQEAgLTExNTYsNyArMTEwNSw3IEBACiAKICBlcnJfcGNpX2FsbG9jOgogCUlXTF9FUlIocHJpdiwgImZhaWxlZCB0byBhbGxvY2F0ZSBwY2kgbWVtb3J5XG4iKTsKLQlpd2xfZGVhbGxvY191Y29kZShwcml2KTsKKwlpd2xfZGVhbGxvY191Y29kZSh0cmFucyhwcml2KSk7CiAgb3V0X3VuYmluZDoKIAljb21wbGV0ZSgmcHJpdi0+ZmlybXdhcmVfbG9hZGluZ19jb21wbGV0ZSk7CiAJZGV2aWNlX3JlbGVhc2VfZHJpdmVyKGJ1cyhwcml2KS0+ZGV2KTsKQEAgLTExNzYsNyArMTEyNSw3IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+bG9jaywgZmxhZ3MpOwogCXByaXYtPnRoZXJtYWxfdGhyb3R0bGUuY3Rfa2lsbF90b2dnbGUgPSBmYWxzZTsKIAotCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5zdXBwb3J0X2N0X2tpbGxfZXhpdCkgeworCWlmIChjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5zdXBwb3J0X2N0X2tpbGxfZXhpdCkgewogCQlhZHZfY21kLmNyaXRpY2FsX3RlbXBlcmF0dXJlX2VudGVyID0KIAkJCWNwdV90b19sZTMyKGh3X3BhcmFtcyhwcml2KS5jdF9raWxsX3RocmVzaG9sZCk7CiAJCWFkdl9jbWQuY3JpdGljYWxfdGVtcGVyYXR1cmVfZXhpdCA9CkBAIC0xMjcxLDEwICsxMjIwLDEwIEBACiAJCXJldHVybiAtRVJGS0lMTDsKIAogCS8qIGRvd25sb2FkIHByaW9yaXR5IHRhYmxlIGJlZm9yZSBhbnkgY2FsaWJyYXRpb24gcmVxdWVzdCAqLwotCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgeworCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCSAgICBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgewogCQkvKiBDb25maWd1cmUgQmx1ZXRvb3RoIGRldmljZSBjb2V4aXN0ZW5jZSBzdXBwb3J0ICovCi0JCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcy0+YnRfc2NvX2Rpc2FibGUpCisJCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcy0+YnRfc2NvX2Rpc2FibGUpCiAJCQlwcml2LT5idF9lbmFibGVfcHNwb2xsID0gZmFsc2U7CiAJCWVsc2UKIAkJCXByaXYtPmJ0X2VuYWJsZV9wc3BvbGwgPSB0cnVlOwpAQCAtMTI4NiwxNCArMTIzNSwxNCBAQAogCQlwcml2LT5idF92YWxpZCA9IElXTEFHTl9CVF9WQUxJRF9FTkFCTEVfRkxBR1M7CiAJCXByaXYtPmN1cl9yc3NpX2N0eCA9IE5VTEw7CiAKLQkJaXdsYWduX3NlbmRfcHJpb190YmwocHJpdik7CisJCWl3bF9zZW5kX3ByaW9fdGJsKHRyYW5zKHByaXYpKTsKIAogCQkvKiBGSVhNRTogdy9hIHRvIGZvcmNlIGNoYW5nZSB1Q29kZSBCVCBzdGF0ZSBtYWNoaW5lICovCi0JCXJldCA9IGl3bGFnbl9zZW5kX2J0X2Vudihwcml2LCBJV0xfQlRfQ09FWF9FTlZfT1BFTiwKKwkJcmV0ID0gaXdsX3NlbmRfYnRfZW52KHRyYW5zKHByaXYpLCBJV0xfQlRfQ09FWF9FTlZfT1BFTiwKIAkJCQkJIEJUX0NPRVhfUFJJT19UQkxfRVZUX0lOSVRfQ0FMSUIyKTsKIAkJaWYgKHJldCkKIAkJCXJldHVybiByZXQ7Ci0JCXJldCA9IGl3bGFnbl9zZW5kX2J0X2Vudihwcml2LCBJV0xfQlRfQ09FWF9FTlZfQ0xPU0UsCisJCXJldCA9IGl3bF9zZW5kX2J0X2Vudih0cmFucyhwcml2KSwgSVdMX0JUX0NPRVhfRU5WX0NMT1NFLAogCQkJCQkgQlRfQ09FWF9QUklPX1RCTF9FVlRfSU5JVF9DQUxJQjIpOwogCQlpZiAocmV0KQogCQkJcmV0dXJuIHJldDsKQEAgLTEzMDQsMTYgKzEyNTMsMTcgQEAKIAkJaXdsX3NlbmRfYnRfY29uZmlnKHByaXYpOwogCX0KIAotCWlmIChod19wYXJhbXMocHJpdikuY2FsaWJfcnRfY2ZnKQotCQlpd2xhZ25fc2VuZF9jYWxpYl9jZmdfcnQocHJpdiwKLQkJCQkJIGh3X3BhcmFtcyhwcml2KS5jYWxpYl9ydF9jZmcpOworCS8qCisJICogUGVyZm9ybSBydW50aW1lIGNhbGlicmF0aW9ucywgaW5jbHVkaW5nIERDIGNhbGlicmF0aW9uLgorCSAqLworCWl3bGFnbl9zZW5kX2NhbGliX2NmZ19ydChwcml2LCBJV0xfQ0FMSUJfQ0ZHX0RDX0lEWCk7CiAKIAlpZWVlODAyMTFfd2FrZV9xdWV1ZXMocHJpdi0+aHcpOwogCiAJcHJpdi0+YWN0aXZlX3JhdGUgPSBJV0xfUkFURVNfTUFTSzsKIAogCS8qIENvbmZpZ3VyZSBUeCBhbnRlbm5hIHNlbGVjdGlvbiBiYXNlZCBvbiBIL1cgY29uZmlnICovCi0JaXdsYWduX3NlbmRfdHhfYW50X2NvbmZpZyhwcml2LCBwcml2LT5jZmctPnZhbGlkX3R4X2FudCk7CisJaXdsYWduX3NlbmRfdHhfYW50X2NvbmZpZyhwcml2LCBjZmcocHJpdiktPnZhbGlkX3R4X2FudCk7CiAKIAlpZiAoaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkgJiYgIXByaXYtPnNocmQtPndvd2xhbikgewogCQlzdHJ1Y3QgaXdsX3J4b25fY21kICphY3RpdmVfcnhvbiA9CkBAIC0xMzUyLDcgKzEzMDIsNyBAQAogCiBzdGF0aWMgdm9pZCBpd2xfY2FuY2VsX2RlZmVycmVkX3dvcmsoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIAotc3RhdGljIHZvaWQgX19pd2xfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCit2b2lkIF9faXdsX2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCWludCBleGl0X3BlbmRpbmc7CiAKQEAgLTEzODIsOSArMTMzMiw5IEBACiAJcHJpdi0+YnRfc3RhdHVzID0gMDsKIAlwcml2LT5jdXJfcnNzaV9jdHggPSBOVUxMOwogCXByaXYtPmJ0X2lzX3NjbyA9IDA7Ci0JaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zKQorCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcykKIAkJcHJpdi0+YnRfdHJhZmZpY19sb2FkID0KLQkJCSBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YnRfaW5pdF90cmFmZmljX2xvYWQ7CisJCQkgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmJ0X2luaXRfdHJhZmZpY19sb2FkOwogCWVsc2UKIAkJcHJpdi0+YnRfdHJhZmZpY19sb2FkID0gMDsKIAlwcml2LT5idF9mdWxsX2NvbmN1cnJlbnQgPSBmYWxzZTsKQEAgLTE0MTUsNyArMTM2NSw3IEBACiAJcHJpdi0+YmVhY29uX3NrYiA9IE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIGl3bF9kb3duKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3ZvaWQgaXdsX2Rvd24oc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKIAlfX2l3bF9kb3duKHByaXYpOwpAQCAtMTQyNCw1NyArMTM3NCw2IEBACiAJaXdsX2NhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOwogfQogCi0jZGVmaW5lIE1BWF9IV19SRVNUQVJUUyA1Ci0KLXN0YXRpYyBpbnQgX19pd2xfdXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JaW50IHJldDsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkgewotCQlJV0xfV0FSTihwcml2LCAiRXhpdCBwZW5kaW5nOyB3aWxsIG5vdCBicmluZyB0aGUgTklDIHVwXG4iKTsKLQkJcmV0dXJuIC1FSU87Ci0JfQotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJcmV0ID0gaXdsYWduX2FsbG9jX2JjYXN0X3N0YXRpb24ocHJpdiwgY3R4KTsKLQkJaWYgKHJldCkgewotCQkJaXdsX2RlYWxsb2NfYmNhc3Rfc3RhdGlvbnMocHJpdik7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCi0JcmV0ID0gaXdsYWduX3J1bl9pbml0X3Vjb2RlKHByaXYpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHJ1biBJTklUIHVjb2RlOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXQgPSBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHByaXYsCi0JCQkJCSAgICZwcml2LT51Y29kZV9ydCwKLQkJCQkJICAgSVdMX1VDT0RFX1JFR1VMQVIpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHN0YXJ0IFJUIHVjb2RlOiAlZFxuIiwgcmV0KTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KLQlyZXQgPSBpd2xfYWxpdmVfc3RhcnQocHJpdik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQlyZXR1cm4gMDsKLQotIGVycm9yOgotCXNldF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7Ci0JX19pd2xfZG93bihwcml2KTsKLQljbGVhcl9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7Ci0KLQlJV0xfRVJSKHByaXYsICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBkZXZpY2UuXG4iKTsKLQlyZXR1cm4gcmV0OwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqIFdvcmtxdWV1ZSBjYWxsYmFja3MKQEAgLTE1MDIsNyArMTQwMSw3IEBACiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CiB9CiAKLXN0YXRpYyB2b2lkIGl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQoc3RydWN0IGl3bF9wcml2ICpwcml2KQordm9pZCBpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKIAlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwogCWJvb2wgYnRfZnVsbF9jb25jdXJyZW50OwpAQCAtMTU1OSwxMTczICsxNDU4LDggQEAKIAl9CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoKLSAqIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9ucwotICoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQgaXdsYWduX3N0YV9hcF9saW1pdHNbXSA9IHsKLQl7Ci0JCS5tYXggPSAxLAotCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCi0JfSwKLQl7Ci0JCS5tYXggPSAxLAotCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpd2xhZ25fMnN0YV9saW1pdHNbXSA9IHsKLQl7Ci0JCS5tYXggPSAyLAotCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCi0JfSwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0IGl3bGFnbl9wMnBfc3RhX2dvX2xpbWl0c1tdID0gewotCXsKLQkJLm1heCA9IDEsCi0JCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSwKLQl9LAotCXsKLQkJLm1heCA9IDEsCi0JCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfR08pIHwKLQkJCSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpd2xhZ25fcDJwXzJzdGFfbGltaXRzW10gPSB7Ci0JewotCQkubWF4ID0gMiwKLQkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAotCX0sCi0JewotCQkubWF4ID0gMSwKLQkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpLAotCX0sCi19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9jb21iaW5hdGlvbgotaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19kdWFsbW9kZVtdID0gewotCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAotCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKLQkgIC5iZWFjb25faW50X2luZnJhX21hdGNoID0gdHJ1ZSwKLQkgIC5saW1pdHMgPSBpd2xhZ25fc3RhX2FwX2xpbWl0cywKLQkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduX3N0YV9hcF9saW1pdHMpLAotCX0sCi0JeyAubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDEsCi0JICAubWF4X2ludGVyZmFjZXMgPSAyLAotCSAgLmxpbWl0cyA9IGl3bGFnbl8yc3RhX2xpbWl0cywKLQkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduXzJzdGFfbGltaXRzKSwKLQl9LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfY29tYmluYXRpb24KLWl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfcDJwW10gPSB7Ci0JeyAubnVtX2RpZmZlcmVudF9jaGFubmVscyA9IDEsCi0JICAubWF4X2ludGVyZmFjZXMgPSAyLAotCSAgLmJlYWNvbl9pbnRfaW5mcmFfbWF0Y2ggPSB0cnVlLAotCSAgLmxpbWl0cyA9IGl3bGFnbl9wMnBfc3RhX2dvX2xpbWl0cywKLQkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduX3AycF9zdGFfZ29fbGltaXRzKSwKLQl9LAotCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAotCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKLQkgIC5saW1pdHMgPSBpd2xhZ25fcDJwXzJzdGFfbGltaXRzLAotCSAgLm5fbGltaXRzID0gQVJSQVlfU0laRShpd2xhZ25fcDJwXzJzdGFfbGltaXRzKSwKLQl9LAotfTsKLQotLyoKLSAqIE5vdCBhIG1hYzgwMjExIGVudHJ5IHBvaW50IGZ1bmN0aW9uLCBidXQgaXQgZml0cyBpbiB3aXRoIGFsbCB0aGUKLSAqIG90aGVyIG1hYzgwMjExIGZ1bmN0aW9ucyBncm91cGVkIGhlcmUuCi0gKi8KLXN0YXRpYyBpbnQgaXdsYWduX21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICBzdHJ1Y3QgaXdsYWduX3Vjb2RlX2NhcGFiaWxpdGllcyAqY2FwYSkKLXsKLQlpbnQgcmV0OwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gIml3bC1hZ24tcnMiOwotCi0JLyogVGVsbCBtYWM4MDIxMSBvdXIgY2hhcmFjdGVyaXN0aWNzICovCi0JaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfAotCQkgICAgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OIHwKLQkJICAgIElFRUU4MDIxMV9IV19ORUVEX0RUSU1fUEVSSU9EIHwKLQkJICAgIElFRUU4MDIxMV9IV19TUEVDVFJVTV9NR01UIHwKLQkJICAgIElFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVM7Ci0KLQkvKgotCSAqIEluY2x1ZGluZyB0aGUgZm9sbG93aW5nIGxpbmUgd2lsbCBjcmFzaCBzb21lIEFQJ3MuICBUaGlzCi0JICogd29ya2Fyb3VuZCByZW1vdmVzIHRoZSBzdGltdWx1cyB3aGljaCBjYXVzZXMgdGhlIGNyYXNoIHVudGlsCi0JICogdGhlIEFQIHNvZnR3YXJlIGNhbiBiZSBmaXhlZC4KLQlody0+bWF4X3R4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lcyA9IExJTktfUVVBTF9BR0dfRlJBTUVfTElNSVRfREVGOwotCSAqLwotCi0JaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19QUyB8Ci0JCSAgICAgSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfUFM7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFKQotCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfU01QUyB8Ci0JCQkgICAgIElFRUU4MDIxMV9IV19TVVBQT1JUU19TVEFUSUNfU01QUzsKLQotCWlmIChjYXBhLT5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfTUZQKQotCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX01GUF9DQVBBQkxFOwotCi0JaHctPnN0YV9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYpOwotCWh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdmlmX3ByaXYpOwotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKLQkJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gY3R4LT5pbnRlcmZhY2VfbW9kZXM7Ci0JCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKLQl9Ci0KLQlCVUlMRF9CVUdfT04oTlVNX0lXTF9SWE9OX0NUWCAhPSAyKTsKLQotCWlmIChody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSkgewotCQlody0+d2lwaHktPmlmYWNlX2NvbWJpbmF0aW9ucyA9IGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfcDJwOwotCQlody0+d2lwaHktPm5faWZhY2VfY29tYmluYXRpb25zID0KLQkJCUFSUkFZX1NJWkUoaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19wMnApOwotCX0gZWxzZSBpZiAoaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfQVApKSB7Ci0JCWh3LT53aXBoeS0+aWZhY2VfY29tYmluYXRpb25zID0gaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19kdWFsbW9kZTsKLQkJaHctPndpcGh5LT5uX2lmYWNlX2NvbWJpbmF0aW9ucyA9Ci0JCQlBUlJBWV9TSVpFKGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfZHVhbG1vZGUpOwotCX0KLQotCWh3LT53aXBoeS0+bWF4X3JlbWFpbl9vbl9jaGFubmVsX2R1cmF0aW9uID0gMTAwMDsKLQotCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSB8Ci0JCQkgICAgV0lQSFlfRkxBR19ESVNBQkxFX0JFQUNPTl9ISU5UUyB8Ci0JCQkgICAgV0lQSFlfRkxBR19JQlNTX1JTTjsKLQotCWlmIChwcml2LT51Y29kZV93b3dsYW4uY29kZS5sZW4gJiYgZGV2aWNlX2Nhbl93YWtldXAoYnVzKHByaXYpLT5kZXYpKSB7Ci0JCWh3LT53aXBoeS0+d293bGFuLmZsYWdzID0gV0lQSFlfV09XTEFOX01BR0lDX1BLVCB8Ci0JCQkJCSAgV0lQSFlfV09XTEFOX0RJU0NPTk5FQ1QgfAotCQkJCQkgIFdJUEhZX1dPV0xBTl9FQVBfSURFTlRJVFlfUkVRIHwKLQkJCQkJICBXSVBIWV9XT1dMQU5fUkZLSUxMX1JFTEVBU0U7Ci0JCWlmICghaXdsYWduX21vZF9wYXJhbXMuc3dfY3J5cHRvKQotCQkJaHctPndpcGh5LT53b3dsYW4uZmxhZ3MgfD0KLQkJCQlXSVBIWV9XT1dMQU5fU1VQUE9SVFNfR1RLX1JFS0VZIHwKLQkJCQlXSVBIWV9XT1dMQU5fR1RLX1JFS0VZX0ZBSUxVUkU7Ci0KLQkJaHctPndpcGh5LT53b3dsYW4ubl9wYXR0ZXJucyA9IElXTEFHTl9XT1dMQU5fTUFYX1BBVFRFUk5TOwotCQlody0+d2lwaHktPndvd2xhbi5wYXR0ZXJuX21pbl9sZW4gPQotCQkJCQlJV0xBR05fV09XTEFOX01JTl9QQVRURVJOX0xFTjsKLQkJaHctPndpcGh5LT53b3dsYW4ucGF0dGVybl9tYXhfbGVuID0KLQkJCQkJSVdMQUdOX1dPV0xBTl9NQVhfUEFUVEVSTl9MRU47Ci0JfQotCi0JaWYgKGl3bGFnbl9tb2RfcGFyYW1zLnBvd2VyX3NhdmUpCi0JCWh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwotCWVsc2UKLQkJaHctPndpcGh5LT5mbGFncyAmPSB+V0lQSFlfRkxBR19QU19PTl9CWV9ERUZBVUxUOwotCi0JaHctPndpcGh5LT5tYXhfc2Nhbl9zc2lkcyA9IFBST0JFX09QVElPTl9NQVg7Ci0JLyogd2UgY3JlYXRlIHRoZSA4MDIuMTEgaGVhZGVyIGFuZCBhIHplcm8tbGVuZ3RoIFNTSUQgZWxlbWVudCAqLwotCWh3LT53aXBoeS0+bWF4X3NjYW5faWVfbGVuID0gY2FwYS0+bWF4X3Byb2JlX2xlbmd0aCAtIDI0IC0gMjsKLQotCS8qIERlZmF1bHQgdmFsdWU7IDQgRURDQSBRT1MgcHJpb3JpdGllcyAqLwotCWh3LT5xdWV1ZXMgPSA0OwotCi0JaHctPm1heF9saXN0ZW5faW50ZXJ2YWwgPSBJV0xfQ09OTl9NQVhfTElTVEVOX0lOVEVSVkFMOwotCi0JaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdLm5fY2hhbm5lbHMpCi0JCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0gPQotCQkJJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOwotCWlmIChwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXS5uX2NoYW5uZWxzKQotCQlwcml2LT5ody0+d2lwaHktPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdID0KLQkJCSZwcml2LT5iYW5kc1tJRUVFODAyMTFfQkFORF81R0haXTsKLQotCWl3bF9sZWRzX2luaXQocHJpdik7Ci0KLQlyZXQgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcocHJpdi0+aHcpOwotCWlmIChyZXQpIHsKLQkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHJlZ2lzdGVyIGh3IChlcnJvciAlZClcbiIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAxOwotCi0JcmV0dXJuIDA7Ci19Ci0KLQotc3RhdGljIGludCBpd2xhZ25fbWFjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCS8qIHdlIHNob3VsZCBiZSB2ZXJpZnlpbmcgdGhlIGRldmljZSBpcyByZWFkeSB0byBiZSBvcGVuZWQgKi8KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JcmV0ID0gX19pd2xfdXAocHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCUlXTF9ERUJVR19JTkZPKHByaXYsICJTdGFydCBVUCB3b3JrIGRvbmUuXG4iKTsKLQotCS8qIE5vdyB3ZSBzaG91bGQgYmUgZG9uZSwgYW5kIHRoZSBSRUFEWSBiaXQgc2hvdWxkIGJlIHNldC4gKi8KLQlpZiAoV0FSTl9PTighdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkpCi0JCXJldCA9IC1FSU87Ci0KLQlpd2xhZ25fbGVkX2VuYWJsZShwcml2KTsKLQotCXByaXYtPmlzX29wZW4gPSAxOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWlmICghcHJpdi0+aXNfb3BlbikKLQkJcmV0dXJuOwotCi0JcHJpdi0+aXNfb3BlbiA9IDA7Ci0KLQlpd2xfZG93bihwcml2KTsKLQotCWZsdXNoX3dvcmtxdWV1ZShwcml2LT5zaHJkLT53b3JrcXVldWUpOwotCi0JLyogVXNlciBzcGFjZSBzb2Z0d2FyZSBtYXkgZXhwZWN0IGdldHRpbmcgcmZraWxsIGNoYW5nZXMKLQkgKiBldmVuIGlmIGludGVyZmFjZSBpcyBkb3duICovCi0JaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKLQlpd2xfZW5hYmxlX3Jma2lsbF9pbnQocHJpdik7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotI2lmZGVmIENPTkZJR19QTV9TTEVFUAotc3RhdGljIGludCBpd2xhZ25fc2VuZF9wYXR0ZXJucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKQotewotCXN0cnVjdCBpd2xhZ25fd293bGFuX3BhdHRlcm5zX2NtZCAqcGF0dGVybl9jbWQ7Ci0Jc3RydWN0IGl3bF9ob3N0X2NtZCBjbWQgPSB7Ci0JCS5pZCA9IFJFUExZX1dPV0xBTl9QQVRURVJOUywKLQkJLmRhdGFmbGFnc1swXSA9IElXTF9IQ01EX0RGTF9OT0NPUFksCi0JCS5mbGFncyA9IENNRF9TWU5DLAotCX07Ci0JaW50IGksIGVycjsKLQotCWlmICghd293bGFuLT5uX3BhdHRlcm5zKQotCQlyZXR1cm4gMDsKLQotCWNtZC5sZW5bMF0gPSBzaXplb2YoKnBhdHRlcm5fY21kKSArCi0JCQl3b3dsYW4tPm5fcGF0dGVybnMgKiBzaXplb2Yoc3RydWN0IGl3bGFnbl93b3dsYW5fcGF0dGVybik7Ci0KLQlwYXR0ZXJuX2NtZCA9IGttYWxsb2MoY21kLmxlblswXSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYXR0ZXJuX2NtZCkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlwYXR0ZXJuX2NtZC0+bl9wYXR0ZXJucyA9IGNwdV90b19sZTMyKHdvd2xhbi0+bl9wYXR0ZXJucyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgd293bGFuLT5uX3BhdHRlcm5zOyBpKyspIHsKLQkJaW50IG1hc2tfbGVuID0gRElWX1JPVU5EX1VQKHdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW4sIDgpOwotCi0JCW1lbWNweSgmcGF0dGVybl9jbWQtPnBhdHRlcm5zW2ldLm1hc2ssCi0JCQl3b3dsYW4tPnBhdHRlcm5zW2ldLm1hc2ssIG1hc2tfbGVuKTsKLQkJbWVtY3B5KCZwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ucGF0dGVybiwKLQkJCXdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybiwKLQkJCXdvd2xhbi0+cGF0dGVybnNbaV0ucGF0dGVybl9sZW4pOwotCQlwYXR0ZXJuX2NtZC0+cGF0dGVybnNbaV0ubWFza19zaXplID0gbWFza19sZW47Ci0JCXBhdHRlcm5fY21kLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX3NpemUgPQotCQkJd293bGFuLT5wYXR0ZXJuc1tpXS5wYXR0ZXJuX2xlbjsKLQl9Ci0KLQljbWQuZGF0YVswXSA9IHBhdHRlcm5fY21kOwotCWVyciA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJmNtZCk7Ci0Ja2ZyZWUocGF0dGVybl9jbWQpOwotCXJldHVybiBlcnI7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgaXdsYWduX21hY19zZXRfcmVrZXlfZGF0YShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9ndGtfcmVrZXlfZGF0YSAqZGF0YSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5zd19jcnlwdG8pCi0JCXJldHVybjsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmIChwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS52aWYgIT0gdmlmKQotCQlnb3RvIG91dDsKLQotCW1lbWNweShwcml2LT5rZWssIGRhdGEtPmtlaywgTkw4MDIxMV9LRUtfTEVOKTsKLQltZW1jcHkocHJpdi0+a2NrLCBkYXRhLT5rY2ssIE5MODAyMTFfS0NLX0xFTik7Ci0JcHJpdi0+cmVwbGF5X2N0ciA9IGNwdV90b19sZTY0KGJlNjRfdG9fY3B1cCgoX19iZTY0ICopJmRhdGEtPnJlcGxheV9jdHIpKTsKLQlwcml2LT5oYXZlX3Jla2V5X2RhdGEgPSB0cnVlOwotCi0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi1zdHJ1Y3Qgd293bGFuX2tleV9kYXRhIHsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OwotCXN0cnVjdCBpd2xhZ25fd293bGFuX3JzY190c2NfcGFyYW1zX2NtZCAqcnNjX3RzYzsKLQlzdHJ1Y3QgaXdsYWduX3dvd2xhbl90a2lwX3BhcmFtc19jbWQgKnRraXA7Ci0JY29uc3QgdTggKmJzc2lkOwotCWJvb2wgZXJyb3IsIHVzZV9yc2NfdHNjLCB1c2VfdGtpcDsKLX07Ci0KLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLXN0YXRpYyB2b2lkIGl3bGFnbl9jb252ZXJ0X3Axayh1MTYgKnAxaywgX19sZTE2ICpvdXQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgSVdMQUdOX1AxS19TSVpFOyBpKyspCi0JCW91dFtpXSA9IGNwdV90b19sZTE2KHAxa1tpXSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl93b3dsYW5fcHJvZ3JhbV9rZXlzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXksCi0JCQkJICAgICAgIHZvaWQgKl9kYXRhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCB3b3dsYW5fa2V5X2RhdGEgKmRhdGEgPSBfZGF0YTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gZGF0YS0+Y3R4OwotCXN0cnVjdCBhZXNfc2MgKmFlc19zYywgKmFlc190eF9zYyA9IE5VTEw7Ci0Jc3RydWN0IHRraXBfc2MgKnRraXBfc2MsICp0a2lwX3R4X3NjID0gTlVMTDsKLQlzdHJ1Y3QgaXdsYWduX3Axa19jYWNoZSAqcnhfcDFrczsKLQl1OCAqcnhfbWljX2tleTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2tleV9zZXEgc2VxOwotCXUzMiBjdXJfcnhfaXYzMiA9IDA7Ci0JdTE2IHAxa1tJV0xBR05fUDFLX1NJWkVdOwotCWludCByZXQsIGk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAoKGtleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwIHx8Ci0JICAgICBrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQpICYmCi0JICAgICAhc3RhICYmICFjdHgtPmtleV9tYXBwaW5nX2tleXMpCi0JCXJldCA9IGl3bF9zZXRfZGVmYXVsdF93ZXBfa2V5KHByaXYsIGN0eCwga2V5KTsKLQllbHNlCi0JCXJldCA9IGl3bF9zZXRfZHluYW1pY19rZXkocHJpdiwgY3R4LCBrZXksIHN0YSk7Ci0KLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIkVycm9yIHNldHRpbmcga2V5IGR1cmluZyBzdXNwZW5kIVxuIik7Ci0JCWRhdGEtPmVycm9yID0gdHJ1ZTsKLQl9Ci0KLQlzd2l0Y2ggKGtleS0+Y2lwaGVyKSB7Ci0JY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOgotCQlpZiAoc3RhKSB7Ci0JCQl0a2lwX3NjID0gZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MudGtpcC51bmljYXN0X3JzYzsKLQkJCXRraXBfdHhfc2MgPSAmZGF0YS0+cnNjX3RzYy0+YWxsX3RzY19yc2MudGtpcC50c2M7Ci0KLQkJCXJ4X3Axa3MgPSBkYXRhLT50a2lwLT5yeF91bmk7Ci0KLQkJCWllZWU4MDIxMV9nZXRfa2V5X3R4X3NlcShrZXksICZzZXEpOwotCQkJdGtpcF90eF9zYy0+aXYxNiA9IGNwdV90b19sZTE2KHNlcS50a2lwLml2MTYpOwotCQkJdGtpcF90eF9zYy0+aXYzMiA9IGNwdV90b19sZTMyKHNlcS50a2lwLml2MzIpOwotCi0JCQlpZWVlODAyMTFfZ2V0X3RraXBfcDFrX2l2KGtleSwgc2VxLnRraXAuaXYzMiwgcDFrKTsKLQkJCWl3bGFnbl9jb252ZXJ0X3AxayhwMWssIGRhdGEtPnRraXAtPnR4LnAxayk7Ci0KLQkJCW1lbWNweShkYXRhLT50a2lwLT5taWNfa2V5cy50eCwKLQkJCSAgICAgICAma2V5LT5rZXlbTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX1RYX01JQ19LRVldLAotCQkJICAgICAgIElXTEFHTl9NSUNfS0VZX1NJWkUpOwotCi0JCQlyeF9taWNfa2V5ID0gZGF0YS0+dGtpcC0+bWljX2tleXMucnhfdW5pY2FzdDsKLQkJfSBlbHNlIHsKLQkJCXRraXBfc2MgPSBkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy50a2lwLm11bHRpY2FzdF9yc2M7Ci0JCQlyeF9wMWtzID0gZGF0YS0+dGtpcC0+cnhfbXVsdGk7Ci0JCQlyeF9taWNfa2V5ID0gZGF0YS0+dGtpcC0+bWljX2tleXMucnhfbWNhc3Q7Ci0JCX0KLQotCQkvKgotCQkgKiBGb3Igbm9uLVFvUyB0aGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGJvdGggdGhlIHVDb2RlIGFuZAotCQkgKiBtYWM4MDIxMSB1c2UgVElEIDAgKGFzIHRoZXkgbmVlZCB0byB0byBhdm9pZCByZXBsYXkgYXR0YWNrcykKLQkJICogZm9yIGNoZWNraW5nIHRoZSBJViBpbiB0aGUgZnJhbWVzLgotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IElXTEFHTl9OVU1fUlNDOyBpKyspIHsKLQkJCWllZWU4MDIxMV9nZXRfa2V5X3J4X3NlcShrZXksIGksICZzZXEpOwotCQkJdGtpcF9zY1tpXS5pdjE2ID0gY3B1X3RvX2xlMTYoc2VxLnRraXAuaXYxNik7Ci0JCQl0a2lwX3NjW2ldLml2MzIgPSBjcHVfdG9fbGUzMihzZXEudGtpcC5pdjMyKTsKLQkJCS8qIHdyYXBwaW5nIGlzbid0IGFsbG93ZWQsIEFQIG11c3QgcmVrZXkgKi8KLQkJCWlmIChzZXEudGtpcC5pdjMyID4gY3VyX3J4X2l2MzIpCi0JCQkJY3VyX3J4X2l2MzIgPSBzZXEudGtpcC5pdjMyOwotCQl9Ci0KLQkJaWVlZTgwMjExX2dldF90a2lwX3J4X3AxayhrZXksIGRhdGEtPmJzc2lkLCBjdXJfcnhfaXYzMiwgcDFrKTsKLQkJaXdsYWduX2NvbnZlcnRfcDFrKHAxaywgcnhfcDFrc1swXS5wMWspOwotCQlpZWVlODAyMTFfZ2V0X3RraXBfcnhfcDFrKGtleSwgZGF0YS0+YnNzaWQsCi0JCQkJCSAgY3VyX3J4X2l2MzIgKyAxLCBwMWspOwotCQlpd2xhZ25fY29udmVydF9wMWsocDFrLCByeF9wMWtzWzFdLnAxayk7Ci0KLQkJbWVtY3B5KHJ4X21pY19rZXksCi0JCSAgICAgICAma2V5LT5rZXlbTkw4MDIxMV9US0lQX0RBVEFfT0ZGU0VUX1JYX01JQ19LRVldLAotCQkgICAgICAgSVdMQUdOX01JQ19LRVlfU0laRSk7Ci0KLQkJZGF0YS0+dXNlX3RraXAgPSB0cnVlOwotCQlkYXRhLT51c2VfcnNjX3RzYyA9IHRydWU7Ci0JCWJyZWFrOwotCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoKLQkJaWYgKHN0YSkgewotCQkJdTggKnBuID0gc2VxLmNjbXAucG47Ci0KLQkJCWFlc19zYyA9IGRhdGEtPnJzY190c2MtPmFsbF90c2NfcnNjLmFlcy51bmljYXN0X3JzYzsKLQkJCWFlc190eF9zYyA9ICZkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy5hZXMudHNjOwotCi0JCQlpZWVlODAyMTFfZ2V0X2tleV90eF9zZXEoa2V5LCAmc2VxKTsKLQkJCWFlc190eF9zYy0+cG4gPSBjcHVfdG9fbGU2NCgKLQkJCQkJKHU2NClwbls1XSB8Ci0JCQkJCSgodTY0KXBuWzRdIDw8IDgpIHwKLQkJCQkJKCh1NjQpcG5bM10gPDwgMTYpIHwKLQkJCQkJKCh1NjQpcG5bMl0gPDwgMjQpIHwKLQkJCQkJKCh1NjQpcG5bMV0gPDwgMzIpIHwKLQkJCQkJKCh1NjQpcG5bMF0gPDwgNDApKTsKLQkJfSBlbHNlCi0JCQlhZXNfc2MgPSBkYXRhLT5yc2NfdHNjLT5hbGxfdHNjX3JzYy5hZXMubXVsdGljYXN0X3JzYzsKLQotCQkvKgotCQkgKiBGb3Igbm9uLVFvUyB0aGlzIHJlbGllcyBvbiB0aGUgZmFjdCB0aGF0IGJvdGggdGhlIHVDb2RlIGFuZAotCQkgKiBtYWM4MDIxMSB1c2UgVElEIDAgZm9yIGNoZWNraW5nIHRoZSBJViBpbiB0aGUgZnJhbWVzLgotCQkgKi8KLQkJZm9yIChpID0gMDsgaSA8IElXTEFHTl9OVU1fUlNDOyBpKyspIHsKLQkJCXU4ICpwbiA9IHNlcS5jY21wLnBuOwotCi0JCQlpZWVlODAyMTFfZ2V0X2tleV9yeF9zZXEoa2V5LCBpLCAmc2VxKTsKLQkJCWFlc19zYy0+cG4gPSBjcHVfdG9fbGU2NCgKLQkJCQkJKHU2NClwbls1XSB8Ci0JCQkJCSgodTY0KXBuWzRdIDw8IDgpIHwKLQkJCQkJKCh1NjQpcG5bM10gPDwgMTYpIHwKLQkJCQkJKCh1NjQpcG5bMl0gPDwgMjQpIHwKLQkJCQkJKCh1NjQpcG5bMV0gPDwgMzIpIHwKLQkJCQkJKCh1NjQpcG5bMF0gPDwgNDApKTsKLQkJfQotCQlkYXRhLT51c2VfcnNjX3RzYyA9IHRydWU7Ci0JCWJyZWFrOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfc3VzcGVuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvd2xhbikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsYWduX3dvd2xhbl93YWtldXBfZmlsdGVyX2NtZCB3YWtldXBfZmlsdGVyX2NtZDsKLQlzdHJ1Y3QgaXdsX3J4b25fY21kIHJ4b247Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlzdHJ1Y3QgaXdsYWduX3dvd2xhbl9rZWtfa2NrX21hdGVyaWFsX2NtZCBrZWtfa2NrX2NtZDsKLQlzdHJ1Y3QgaXdsYWduX3dvd2xhbl90a2lwX3BhcmFtc19jbWQgdGtpcF9jbWQgPSB7fTsKLQlzdHJ1Y3Qgd293bGFuX2tleV9kYXRhIGtleV9kYXRhID0gewotCQkuY3R4ID0gY3R4LAotCQkuYnNzaWQgPSBjdHgtPmFjdGl2ZS5ic3NpZF9hZGRyLAotCQkudXNlX3JzY190c2MgPSBmYWxzZSwKLQkJLnRraXAgPSAmdGtpcF9jbWQsCi0JCS51c2VfdGtpcCA9IGZhbHNlLAotCX07Ci0JaW50IHJldCwgaTsKLQl1MTYgc2VxOwotCi0JaWYgKFdBUk5fT04oIXdvd2xhbikpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JLyogRG9uJ3QgYXR0ZW1wdCBXb1dMQU4gd2hlbiBub3QgYXNzb2NpYXRlZCwgdGVhciBkb3duIGluc3RlYWQuICovCi0JaWYgKCFjdHgtPnZpZiB8fCBjdHgtPnZpZi0+dHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OIHx8Ci0JICAgICFpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkgewotCQlyZXQgPSAxOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlrZXlfZGF0YS5yc2NfdHNjID0ga3phbGxvYyhzaXplb2YoKmtleV9kYXRhLnJzY190c2MpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWtleV9kYXRhLnJzY190c2MpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbWVtc2V0KCZ3YWtldXBfZmlsdGVyX2NtZCwgMCwgc2l6ZW9mKHdha2V1cF9maWx0ZXJfY21kKSk7Ci0KLQkvKgotCSAqIFdlIGtub3cgdGhlIGxhc3QgdXNlZCBzZXFubywgYW5kIHRoZSB1Q29kZSBleHBlY3RzIHRvIGtub3cgdGhhdAotCSAqIG9uZSwgaXQgd2lsbCBpbmNyZW1lbnQgYmVmb3JlIFRYLgotCSAqLwotCXNlcSA9IGxlMTZfdG9fY3B1KHByaXYtPmxhc3Rfc2VxX2N0bCkgJiBJRUVFODAyMTFfU0NUTF9TRVE7Ci0Jd2FrZXVwX2ZpbHRlcl9jbWQubm9uX3Fvc19zZXEgPSBjcHVfdG9fbGUxNihzZXEpOwotCi0JLyoKLQkgKiBGb3IgUW9TIGNvdW50ZXJzLCB3ZSBzdG9yZSB0aGUgb25lIHRvIHVzZSBuZXh0LCBzbyBzdWJ0cmFjdCAweDEwCi0JICogc2luY2UgdGhlIHVDb2RlIHdpbGwgYWRkIDB4MTAgYmVmb3JlIHVzaW5nIHRoZSB2YWx1ZS4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCXNlcSA9IHByaXYtPnNocmQtPnRpZF9kYXRhW0lXTF9BUF9JRF1baV0uc2VxX251bWJlcjsKLQkJc2VxIC09IDB4MTA7Ci0JCXdha2V1cF9maWx0ZXJfY21kLnFvc19zZXFbaV0gPSBjcHVfdG9fbGUxNihzZXEpOwotCX0KLQotCWlmICh3b3dsYW4tPmRpc2Nvbm5lY3QpCi0JCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KLQkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0JFQUNPTl9NSVNTIHwKLQkJCQkgICAgSVdMQUdOX1dPV0xBTl9XQUtFVVBfTElOS19DSEFOR0UpOwotCWlmICh3b3dsYW4tPm1hZ2ljX3BrdCkKLQkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQotCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfTUFHSUNfUEFDS0VUKTsKLQlpZiAod293bGFuLT5ndGtfcmVrZXlfZmFpbHVyZSkKLQkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQotCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfR1RLX1JFS0VZX0ZBSUwpOwotCWlmICh3b3dsYW4tPmVhcF9pZGVudGl0eV9yZXEpCi0JCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KLQkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX0VBUF9JREVOVF9SRVEpOwotCWlmICh3b3dsYW4tPmZvdXJfd2F5X2hhbmRzaGFrZSkKLQkJd2FrZXVwX2ZpbHRlcl9jbWQuZW5hYmxlZCB8PQotCQkJY3B1X3RvX2xlMzIoSVdMQUdOX1dPV0xBTl9XQUtFVVBfNFdBWV9IQU5EU0hBS0UpOwotCWlmICh3b3dsYW4tPnJma2lsbF9yZWxlYXNlKQotCQl3YWtldXBfZmlsdGVyX2NtZC5lbmFibGVkIHw9Ci0JCQljcHVfdG9fbGUzMihJV0xBR05fV09XTEFOX1dBS0VVUF9SRktJTEwpOwotCWlmICh3b3dsYW4tPm5fcGF0dGVybnMpCi0JCXdha2V1cF9maWx0ZXJfY21kLmVuYWJsZWQgfD0KLQkJCWNwdV90b19sZTMyKElXTEFHTl9XT1dMQU5fV0FLRVVQX1BBVFRFUk5fTUFUQ0gpOwotCi0JaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKLQotCW1lbWNweSgmcnhvbiwgJmN0eC0+YWN0aXZlLCBzaXplb2YocnhvbikpOwotCi0JaXdsX3RyYW5zX3N0b3BfZGV2aWNlKHRyYW5zKHByaXYpKTsKLQotCXByaXYtPnNocmQtPndvd2xhbiA9IHRydWU7Ci0KLQlyZXQgPSBpd2xhZ25fbG9hZF91Y29kZV93YWl0X2FsaXZlKHByaXYsICZwcml2LT51Y29kZV93b3dsYW4sCi0JCQkJCSAgIElXTF9VQ09ERV9XT1dMQU4pOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQkvKiBub3cgY29uZmlndXJlIFdvV0xBTiB1Y29kZSAqLwotCXJldCA9IGl3bF9hbGl2ZV9zdGFydChwcml2KTsKLQlpZiAocmV0KQotCQlnb3RvIGVycm9yOwotCi0JbWVtY3B5KCZjdHgtPnN0YWdpbmcsICZyeG9uLCBzaXplb2YocnhvbikpOwotCXJldCA9IGl3bGFnbl9jb21taXRfcnhvbihwcml2LCBjdHgpOwotCWlmIChyZXQpCi0JCWdvdG8gZXJyb3I7Ci0KLQlyZXQgPSBpd2xfcG93ZXJfdXBkYXRlX21vZGUocHJpdiwgdHJ1ZSk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCWlmICghaXdsYWduX21vZF9wYXJhbXMuc3dfY3J5cHRvKSB7Ci0JCS8qIG1hcmsgYWxsIGtleXMgY2xlYXIgKi8KLQkJcHJpdi0+dWNvZGVfa2V5X3RhYmxlID0gMDsKLQkJY3R4LT5rZXlfbWFwcGluZ19rZXlzID0gMDsKLQotCQkvKgotCQkgKiBUaGlzIG5lZWRzIHRvIGJlIHVubG9ja2VkIGR1ZSB0byBsb2NrIG9yZGVyaW5nCi0JCSAqIGNvbnN0cmFpbnRzLiBTaW5jZSB3ZSdyZSBpbiB0aGUgc3VzcGVuZCBwYXRoCi0JCSAqIHRoYXQgaXNuJ3QgcmVhbGx5IGEgcHJvYmxlbSB0aG91Z2guCi0JCSAqLwotCQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQkJaWVlZTgwMjExX2l0ZXJfa2V5cyhwcml2LT5odywgY3R4LT52aWYsCi0JCQkJICAgIGl3bGFnbl93b3dsYW5fcHJvZ3JhbV9rZXlzLAotCQkJCSAgICAma2V5X2RhdGEpOwotCQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JCWlmIChrZXlfZGF0YS5lcnJvcikgewotCQkJcmV0ID0gLUVJTzsKLQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQotCQlpZiAoa2V5X2RhdGEudXNlX3JzY190c2MpIHsKLQkJCXN0cnVjdCBpd2xfaG9zdF9jbWQgcnNjX3RzY19jbWQgPSB7Ci0JCQkJLmlkID0gUkVQTFlfV09XTEFOX1RTQ19SU0NfUEFSQU1TLAotCQkJCS5mbGFncyA9IENNRF9TWU5DLAotCQkJCS5kYXRhWzBdID0ga2V5X2RhdGEucnNjX3RzYywKLQkJCQkuZGF0YWZsYWdzWzBdID0gSVdMX0hDTURfREZMX05PQ09QWSwKLQkJCQkubGVuWzBdID0gc2l6ZW9mKCprZXlfZGF0YS5yc2NfdHNjKSwKLQkJCX07Ci0KLQkJCXJldCA9IGl3bF90cmFuc19zZW5kX2NtZCh0cmFucyhwcml2KSwgJnJzY190c2NfY21kKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWlmIChrZXlfZGF0YS51c2VfdGtpcCkgewotCQkJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucyhwcml2KSwKLQkJCQkJCSBSRVBMWV9XT1dMQU5fVEtJUF9QQVJBTVMsCi0JCQkJCQkgQ01EX1NZTkMsIHNpemVvZih0a2lwX2NtZCksCi0JCQkJCQkgJnRraXBfY21kKTsKLQkJCWlmIChyZXQpCi0JCQkJZ290byBlcnJvcjsKLQkJfQotCi0JCWlmIChwcml2LT5oYXZlX3Jla2V5X2RhdGEpIHsKLQkJCW1lbXNldCgma2VrX2tja19jbWQsIDAsIHNpemVvZihrZWtfa2NrX2NtZCkpOwotCQkJbWVtY3B5KGtla19rY2tfY21kLmtjaywgcHJpdi0+a2NrLCBOTDgwMjExX0tDS19MRU4pOwotCQkJa2VrX2tja19jbWQua2NrX2xlbiA9IGNwdV90b19sZTE2KE5MODAyMTFfS0NLX0xFTik7Ci0JCQltZW1jcHkoa2VrX2tja19jbWQua2VrLCBwcml2LT5rZWssIE5MODAyMTFfS0VLX0xFTik7Ci0JCQlrZWtfa2NrX2NtZC5rZWtfbGVuID0gY3B1X3RvX2xlMTYoTkw4MDIxMV9LRUtfTEVOKTsKLQkJCWtla19rY2tfY21kLnJlcGxheV9jdHIgPSBwcml2LT5yZXBsYXlfY3RyOwotCi0JCQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLAotCQkJCQkJIFJFUExZX1dPV0xBTl9LRUtfS0NLX01BVEVSSUFMLAotCQkJCQkJIENNRF9TWU5DLCBzaXplb2Yoa2VrX2tja19jbWQpLAotCQkJCQkJICZrZWtfa2NrX2NtZCk7Ci0JCQlpZiAocmV0KQotCQkJCWdvdG8gZXJyb3I7Ci0JCX0KLQl9Ci0KLQlyZXQgPSBpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zKHByaXYpLCBSRVBMWV9XT1dMQU5fV0FLRVVQX0ZJTFRFUiwKLQkJCQkgQ01EX1NZTkMsIHNpemVvZih3YWtldXBfZmlsdGVyX2NtZCksCi0JCQkJICZ3YWtldXBfZmlsdGVyX2NtZCk7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCXJldCA9IGl3bGFnbl9zZW5kX3BhdHRlcm5zKHByaXYsIHdvd2xhbik7Ci0JaWYgKHJldCkKLQkJZ290byBlcnJvcjsKLQotCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShidXMocHJpdiktPmRldiwgdHJ1ZSk7Ci0KLQkvKiBOb3cgbGV0IHRoZSB1Y29kZSBvcGVyYXRlIG9uIGl0cyBvd24gKi8KLQlpd2xfd3JpdGUzMihidXMocHJpdiksIENTUl9VQ09ERV9EUlZfR1AxX1NFVCwKLQkJCSAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0QzX0NGR19DT01QTEVURSk7Ci0KLQlnb3RvIG91dDsKLQotIGVycm9yOgotCXByaXYtPnNocmQtPndvd2xhbiA9IGZhbHNlOwotCWl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQocHJpdik7Ci0JaWVlZTgwMjExX3Jlc3RhcnRfaHcocHJpdi0+aHcpOwotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlrZnJlZShrZXlfZGF0YS5yc2NfdHNjKTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX21hY19yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIGJhc2UsIHN0YXR1cyA9IDB4ZmZmZmZmZmY7Ci0JaW50IHJldCA9IC1FSU87Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpd2xfd3JpdGUzMihidXMocHJpdiksIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwKLQkJCSAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0QzX0NGR19DT01QTEVURSk7Ci0KLQliYXNlID0gcHJpdi0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlOwotCWlmIChpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgewotCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnVzKHByaXYpLT5yZWdfbG9jaywgZmxhZ3MpOwotCQlyZXQgPSBpd2xfZ3JhYl9uaWNfYWNjZXNzX3NpbGVudChidXMocHJpdikpOwotCQlpZiAocmV0ID09IDApIHsKLQkJCWl3bF93cml0ZTMyKGJ1cyhwcml2KSwgSEJVU19UQVJHX01FTV9SQUREUiwgYmFzZSk7Ci0JCQlzdGF0dXMgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgSEJVU19UQVJHX01FTV9SREFUKTsKLQkJCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MoYnVzKHByaXYpKTsKLQkJfQotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidXMocHJpdiktPnJlZ19sb2NrLCBmbGFncyk7Ci0KLSNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCi0JCWlmIChyZXQgPT0gMCkgewotCQkJaWYgKCFwcml2LT53b3dsYW5fc3JhbSkKLQkJCQlwcml2LT53b3dsYW5fc3JhbSA9Ci0JCQkJCWt6YWxsb2MocHJpdi0+dWNvZGVfd293bGFuLmRhdGEubGVuLAotCQkJCQkJR0ZQX0tFUk5FTCk7Ci0KLQkJCWlmIChwcml2LT53b3dsYW5fc3JhbSkKLQkJCQlfaXdsX3JlYWRfdGFyZ19tZW1fd29yZHMoCi0JCQkJCWJ1cyhwcml2KSwgMHg4MDAwMDAsIHByaXYtPndvd2xhbl9zcmFtLAotCQkJCQlwcml2LT51Y29kZV93b3dsYW4uZGF0YS5sZW4gLyA0KTsKLQkJfQotI2VuZGlmCi0JfQotCi0JLyogd2UnbGwgY2xlYXIgY3R4LT52aWYgZHVyaW5nIGl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQoKSAqLwotCXZpZiA9IGN0eC0+dmlmOwotCi0JcHJpdi0+c2hyZC0+d293bGFuID0gZmFsc2U7Ci0KLQlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoYnVzKHByaXYpLT5kZXYsIGZhbHNlKTsKLQotCWl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQocHJpdik7Ci0KLQltZW1zZXQoKHZvaWQgKikmY3R4LT5hY3RpdmUsIDAsIHNpemVvZihjdHgtPmFjdGl2ZSkpOwotCWl3bF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHByaXYsIGN0eCk7Ci0JaXdsYWduX3NldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7Ci0KLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCWllZWU4MDIxMV9yZXN1bWVfZGlzY29ubmVjdCh2aWYpOwotCi0JcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgaXdsYWduX21hY190eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCUlXTF9ERUJVR19NQUNEVU1QKHByaXYsICJlbnRlclxuIik7Ci0KLQlJV0xfREVCVUdfVFgocHJpdiwgImRldi0+eG1pdCglZCBieXRlcykgYXQgcmF0ZSAweCUwMnhcbiIsIHNrYi0+bGVuLAotCQkgICAgIGllZWU4MDIxMV9nZXRfdHhfcmF0ZShodywgSUVFRTgwMjExX1NLQl9DQihza2IpKS0+Yml0cmF0ZSk7Ci0KLQlpZiAoaXdsYWduX3R4X3NrYihwcml2LCBza2IpKQotCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwotCi0JSVdMX0RFQlVHX01BQ0RVTVAocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX21hY191cGRhdGVfdGtpcF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCi0JCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCi0JCQkJICAgICAgIHUzMiBpdjMyLCB1MTYgKnBoYXNlMWtleSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCWl3bF91cGRhdGVfdGtpcF9rZXkocHJpdiwgdmlmLCBrZXljb25mLCBzdGEsIGl2MzIsIHBoYXNlMWtleSk7Ci19Ci0KLXN0YXRpYyBpbnQgaXdsYWduX21hY19zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNldF9rZXlfY21kIGNtZCwKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSB2aWZfcHJpdi0+Y3R4OwotCWludCByZXQ7Ci0JYm9vbCBpc19kZWZhdWx0X3dlcF9rZXkgPSBmYWxzZTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCi0JaWYgKGl3bGFnbl9tb2RfcGFyYW1zLnN3X2NyeXB0bykgewotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gaHdjcnlwdG8gZGlzYWJsZWRcbiIpOwotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JfQotCi0JLyoKLQkgKiBXZSBjb3VsZCBwcm9ncmFtIHRoZXNlIGtleXMgaW50byB0aGUgaGFyZHdhcmUgYXMgd2VsbCwgYnV0IHdlCi0JICogZG9uJ3QgZXhwZWN0IG11Y2ggbXVsdGljYXN0IHRyYWZmaWMgaW4gSUJTUyBhbmQgaGF2aW5nIGtleXMKLQkgKiBmb3IgbW9yZSBzdGF0aW9ucyBpcyBwcm9iYWJseSBtb3JlIHVzZWZ1bC4KLQkgKgotCSAqIE1hcmsga2V5IFRYLW9ubHkgYW5kIHJldHVybiAwLgotCSAqLwotCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKLQkgICAgIShrZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKSkgewotCQlrZXktPmh3X2tleV9pZHggPSBXRVBfSU5WQUxJRF9PRkZTRVQ7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIElmIHRoZXkga2V5IHdhcyBUWC1vbmx5LCBhY2NlcHQgZGVsZXRpb24gKi8KLQlpZiAoY21kID09IERJU0FCTEVfS0VZICYmIGtleS0+aHdfa2V5X2lkeCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQpCi0JCXJldHVybiAwOwotCi0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCWl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDEwMCk7Ci0KLQlCVUlMRF9CVUdfT04oV0VQX0lOVkFMSURfT0ZGU0VUID09IElXTEFHTl9IV19LRVlfREVGQVVMVCk7Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBnZXR0aW5nIFdFUCBncm91cCBrZXkgYW5kIHdlIGRpZG4ndCByZWNlaXZlIGFueSBrZXkgbWFwcGluZwotCSAqIHNvIGZhciwgd2UgYXJlIGluIGxlZ2FjeSB3ZXAgbW9kZSAoZ3JvdXAga2V5IG9ubHkpLCBvdGhlcndpc2Ugd2UgYXJlCi0JICogaW4gMVggbW9kZS4KLQkgKiBJbiBsZWdhY3kgd2VwIG1vZGUsIHdlIHVzZSBhbm90aGVyIGhvc3QgY29tbWFuZCB0byB0aGUgdUNvZGUuCi0JICovCi0JaWYgKChrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAotCSAgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSAmJiAhc3RhKSB7Ci0JCWlmIChjbWQgPT0gU0VUX0tFWSkKLQkJCWlzX2RlZmF1bHRfd2VwX2tleSA9ICFjdHgtPmtleV9tYXBwaW5nX2tleXM7Ci0JCWVsc2UKLQkJCWlzX2RlZmF1bHRfd2VwX2tleSA9Ci0JCQkJa2V5LT5od19rZXlfaWR4ID09IElXTEFHTl9IV19LRVlfREVGQVVMVDsKLQl9Ci0KLQotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTRVRfS0VZOgotCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KSB7Ci0JCQlyZXQgPSBpd2xfc2V0X2RlZmF1bHRfd2VwX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LCBrZXkpOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0ID0gaXdsX3NldF9keW5hbWljX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LCBrZXksIHN0YSk7Ci0JCWlmIChyZXQpIHsKLQkJCS8qCi0JCQkgKiBjYW4ndCBhZGQga2V5IGZvciBSWCwgYnV0IHdlIGRvbid0IG5lZWQgaXQKLQkJCSAqIGluIHRoZSBkZXZpY2UgZm9yIFRYIHNvIHN0aWxsIHJldHVybiAwCi0JCQkgKi8KLQkJCXJldCA9IDA7Ci0JCQlrZXktPmh3X2tleV9pZHggPSBXRVBfSU5WQUxJRF9PRkZTRVQ7Ci0JCX0KLQotCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVuYWJsZSBod2NyeXB0byBrZXlcbiIpOwotCQlicmVhazsKLQljYXNlIERJU0FCTEVfS0VZOgotCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KQotCQkJcmV0ID0gaXdsX3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkocHJpdiwgY3R4LCBrZXkpOwotCQllbHNlCi0JCQlyZXQgPSBpd2xfcmVtb3ZlX2R5bmFtaWNfa2V5KHByaXYsIGN0eCwga2V5LCBzdGEpOwotCi0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZGlzYWJsZSBod2NyeXB0byBrZXlcbiIpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlyZXQgPSAtRUlOVkFMOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fbWFjX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbiwKLQkJCQkgICB1OCBidWZfc2l6ZSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlpbnQgcmV0ID0gLUVJTlZBTDsKLQlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKSBzdGEtPmRydl9wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAgaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7Ci0KLQlJV0xfREVCVUdfSFQocHJpdiwgIkEtTVBEVSBhY3Rpb24gb24gYWRkciAlcE0gdGlkICVkXG4iLAotCQkgICAgIHN0YS0+YWRkciwgdGlkKTsKLQotCWlmICghKHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRSkpCi0JCXJldHVybiAtRUFDQ0VTOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0Jc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9SWF9TVEFSVDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJzdGFydCBSeFxuIik7Ci0JCXJldCA9IGl3bF9zdGFfcnhfYWdnX3N0YXJ0KHByaXYsIHN0YSwgdGlkLCAqc3NuKTsKLQkJYnJlYWs7Ci0JY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RPUDoKLQkJSVdMX0RFQlVHX0hUKHByaXYsICJzdG9wIFJ4XG4iKTsKLQkJcmV0ID0gaXdsX3N0YV9yeF9hZ2dfc3RvcChwcml2LCBzdGEsIHRpZCk7Ci0JCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkKLQkJCXJldCA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUQVJUOgotCQlJV0xfREVCVUdfSFQocHJpdiwgInN0YXJ0IFR4XG4iKTsKLQkJcmV0ID0gaXdsYWduX3R4X2FnZ19zdGFydChwcml2LCB2aWYsIHN0YSwgdGlkLCBzc24pOwotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QOgotCQlJV0xfREVCVUdfSFQocHJpdiwgInN0b3AgVHhcbiIpOwotCQlyZXQgPSBpd2xhZ25fdHhfYWdnX3N0b3AocHJpdiwgdmlmLCBzdGEsIHRpZCk7Ci0JCWlmICgocmV0ID09IDApICYmIChwcml2LT5hZ2dfdGlkc19jb3VudCA+IDApKSB7Ci0JCQlwcml2LT5hZ2dfdGlkc19jb3VudC0tOwotCQkJSVdMX0RFQlVHX0hUKHByaXYsICJwcml2LT5hZ2dfdGlkc19jb3VudCA9ICV1XG4iLAotCQkJCSAgICAgcHJpdi0+YWdnX3RpZHNfY291bnQpOwotCQl9Ci0JCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkKLQkJCXJldCA9IDA7Ci0JCWlmICghcHJpdi0+YWdnX3RpZHNfY291bnQgJiYgcHJpdi0+Y2ZnLT5odF9wYXJhbXMgJiYKLQkJICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbikgewotCQkJLyoKLQkJCSAqIHN3aXRjaCBvZmYgUlRTL0NUUyBpZiBpdCB3YXMgcHJldmlvdXNseSBlbmFibGVkCi0JCQkgKi8KLQkJCXN0YV9wcml2LT5scV9zdGEubHEuZ2VuZXJhbF9wYXJhbXMuZmxhZ3MgJj0KLQkJCQl+TElOS19RVUFMX0ZMQUdTX1NFVF9TVEFfVExDX1JUU19NU0s7Ci0JCQlpd2xfc2VuZF9scV9jbWQocHJpdiwgaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZiksCi0JCQkJCSZzdGFfcHJpdi0+bHFfc3RhLmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKLQkJfQotCQlicmVhazsKLQljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9PUEVSQVRJT05BTDoKLQkJYnVmX3NpemUgPSBtaW5fdChpbnQsIGJ1Zl9zaXplLCBMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRik7Ci0KLQkJaXdsX3RyYW5zX3R4X2FnZ19zZXR1cCh0cmFucyhwcml2KSwgY3R4LT5jdHhpZCwgaXdsX3N0YV9pZChzdGEpLAotCQkJCXRpZCwgYnVmX3NpemUpOwotCi0JCS8qCi0JCSAqIElmIHRoZSBsaW1pdCBpcyAwLCB0aGVuIGl0IHdhc24ndCBpbml0aWFsaXNlZCB5ZXQsCi0JCSAqIHVzZSB0aGUgZGVmYXVsdC4gV2UgY2FuIGRvIHRoYXQgc2luY2Ugd2UgdGFrZSB0aGUKLQkJICogbWluaW11bSBiZWxvdywgYW5kIHdlIGRvbid0IHdhbnQgdG8gZ28gYWJvdmUgb3VyCi0JCSAqIGRlZmF1bHQgZHVlIHRvIGhhcmR3YXJlIHJlc3RyaWN0aW9ucy4KLQkJICovCi0JCWlmIChzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplID09IDApCi0JCQlzdGFfcHJpdi0+bWF4X2FnZ19idWZzaXplID0KLQkJCQlMSU5LX1FVQUxfQUdHX0ZSQU1FX0xJTUlUX0RFRjsKLQotCQkvKgotCQkgKiBFdmVuIHRob3VnaCBpbiB0aGVvcnkgdGhlIHBlZXIgY291bGQgaGF2ZSBkaWZmZXJlbnQKLQkJICogYWdncmVnYXRpb24gcmVvcmRlciBidWZmZXIgc2l6ZXMgZm9yIGRpZmZlcmVudCBzZXNzaW9ucywKLQkJICogb3VyIHVjb2RlIGRvZXNuJ3QgYWxsb3cgZm9yIHRoYXQgYW5kIGhhcyBhIGdsb2JhbCBsaW1pdAotCQkgKiBmb3IgZWFjaCBzdGF0aW9uLiBUaGVyZWZvcmUsIHVzZSB0aGUgbWluaW11bSBvZiBhbGwgdGhlCi0JCSAqIGFnZ3JlZ2F0aW9uIHNlc3Npb25zIGFuZCBvdXIgZGVmYXVsdCB2YWx1ZS4KLQkJICovCi0JCXN0YV9wcml2LT5tYXhfYWdnX2J1ZnNpemUgPQotCQkJbWluKHN0YV9wcml2LT5tYXhfYWdnX2J1ZnNpemUsIGJ1Zl9zaXplKTsKLQotCQlpZiAocHJpdi0+Y2ZnLT5odF9wYXJhbXMgJiYKLQkJICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbikgewotCQkJLyoKLQkJCSAqIHN3aXRjaCB0byBSVFMvQ1RTIGlmIGl0IGlzIHRoZSBwcmVmZXIgcHJvdGVjdGlvbgotCQkJICogbWV0aG9kIGZvciBIVCB0cmFmZmljCi0JCQkgKi8KLQotCQkJc3RhX3ByaXYtPmxxX3N0YS5scS5nZW5lcmFsX3BhcmFtcy5mbGFncyB8PQotCQkJCUxJTktfUVVBTF9GTEFHU19TRVRfU1RBX1RMQ19SVFNfTVNLOwotCQl9Ci0JCXByaXYtPmFnZ190aWRzX2NvdW50Kys7Ci0JCUlXTF9ERUJVR19IVChwcml2LCAicHJpdi0+YWdnX3RpZHNfY291bnQgPSAldVxuIiwKLQkJCSAgICAgcHJpdi0+YWdnX3RpZHNfY291bnQpOwotCi0JCXN0YV9wcml2LT5scV9zdGEubHEuYWdnX3BhcmFtcy5hZ2dfZnJhbWVfY250X2xpbWl0ID0KLQkJCXN0YV9wcml2LT5tYXhfYWdnX2J1ZnNpemU7Ci0KLQkJaXdsX3NlbmRfbHFfY21kKHByaXYsIGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLAotCQkJCSZzdGFfcHJpdi0+bHFfc3RhLmxxLCBDTURfQVNZTkMsIGZhbHNlKTsKLQotCQlJV0xfSU5GTyhwcml2LCAiVHggYWdncmVnYXRpb24gZW5hYmxlZCBvbiByYSA9ICVwTSB0aWQgPSAlZFxuIiwKLQkJCSBzdGEtPmFkZHIsIHRpZCk7Ci0JCXJldCA9IDA7Ci0JCWJyZWFrOwotCX0KLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKLQlib29sIGlzX2FwID0gdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0JaW50IHJldCA9IDA7Ci0JdTggc3RhX2lkOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJyZWNlaXZlZCByZXF1ZXN0IHRvIGFkZCBzdGF0aW9uICVwTVxuIiwKLQkJCXN0YS0+YWRkcik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJwcm9jZWVkaW5nIHRvIGFkZCBzdGF0aW9uICVwTVxuIiwKLQkJCXN0YS0+YWRkcik7Ci0Jc3RhX3ByaXYtPnN0YV9pZCA9IElXTF9JTlZBTElEX1NUQVRJT047Ci0KLQlhdG9taWNfc2V0KCZzdGFfcHJpdi0+cGVuZGluZ19mcmFtZXMsIDApOwotCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCi0JCXN0YV9wcml2LT5jbGllbnQgPSB0cnVlOwotCi0JcmV0ID0gaXdsX2FkZF9zdGF0aW9uX2NvbW1vbihwcml2LCB2aWZfcHJpdi0+Y3R4LCBzdGEtPmFkZHIsCi0JCQkJICAgICBpc19hcCwgc3RhLCAmc3RhX2lkKTsKLQlpZiAocmV0KSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE0gKCVkKVxuIiwKLQkJCXN0YS0+YWRkciwgcmV0KTsKLQkJLyogU2hvdWxkIHdlIHJldHVybiBzdWNjZXNzIGlmIHJldHVybiBjb2RlIGlzIEVFWElTVCA/ICovCi0JCWdvdG8gb3V0OwotCX0KLQotCXN0YV9wcml2LT5zdGFfaWQgPSBzdGFfaWQ7Ci0KLQkvKiBJbml0aWFsaXplIHJhdGUgc2NhbGluZyAqLwotCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXppbmcgcmF0ZSBzY2FsaW5nIGZvciBzdGF0aW9uICVwTVxuIiwKLQkJICAgICAgIHN0YS0+YWRkcik7Ci0JaXdsX3JzX3JhdGVfaW5pdChwcml2LCBzdGEsIHN0YV9pZCk7Ci0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX21hY19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0JY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87Ci0Jc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOwotCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNoX3N3aXRjaC0+Y2hhbm5lbDsKLQlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZzsKLQkvKgotCSAqIE1VTFRJLUZJWE1FCi0JICogV2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW50ZXJmYWNlcywgd2UgbmVlZCB0bwotCSAqIHJldmlzaXQgdGhpcy4gVGhlIGNoYW5uZWwgc3dpdGNoIGNvbW1hbmQgaW4gdGhlIGRldmljZQotCSAqIG9ubHkgYWZmZWN0cyB0aGUgQlNTIGNvbnRleHQsIGJ1dCB3aGF0IGRvZXMgdGhhdCByZWFsbHkKLQkgKiBtZWFuPyBBbmQgd2hhdCBpZiB3ZSBnZXQgYSBDU0Egb24gdGhlIHNlY29uZCBpbnRlcmZhY2U/Ci0JICogVGhpcyBuZWVkcyBhIGxvdCBvZiB3b3JrLgotCSAqLwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107Ci0JdTE2IGNoOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAoaXdsX2lzX3Jma2lsbChwcml2LT5zaHJkKSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykgfHwKLQkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSB8fAotCSAgICB0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCFpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKLQkJZ290byBvdXQ7Ci0KLQlpZiAoIXByaXYtPmNmZy0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gpCi0JCWdvdG8gb3V0OwotCi0JY2ggPSBjaGFubmVsLT5od192YWx1ZTsKLQlpZiAobGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCkgPT0gY2gpCi0JCWdvdG8gb3V0OwotCi0JY2hfaW5mbyA9IGl3bF9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIGNoYW5uZWwtPmJhbmQsIGNoKTsKLQlpZiAoIWlzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJpbnZhbGlkIGNoYW5uZWxcbiIpOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxKCZwcml2LT5zaHJkLT5sb2NrKTsKLQotCXByaXYtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBjb25mLT5zbXBzX21vZGU7Ci0KLQkvKiBDb25maWd1cmUgSFQ0MCBjaGFubmVscyAqLwotCWN0eC0+aHQuZW5hYmxlZCA9IGNvbmZfaXNfaHQoY29uZik7Ci0JaWYgKGN0eC0+aHQuZW5hYmxlZCkgewotCQlpZiAoY29uZl9pc19odDQwX21pbnVzKGNvbmYpKSB7Ci0JCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9Ci0JCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7Ci0JCQljdHgtPmh0LmlzXzQwbWh6ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjb25mX2lzX2h0NDBfcGx1cyhjb25mKSkgewotCQkJY3R4LT5odC5leHRlbnNpb25fY2hhbl9vZmZzZXQgPQotCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOwotCQkJY3R4LT5odC5pc180MG1oeiA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQljdHgtPmh0LmV4dGVuc2lvbl9jaGFuX29mZnNldCA9Ci0JCQkJSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKLQkJCWN0eC0+aHQuaXNfNDBtaHogPSBmYWxzZTsKLQkJfQotCX0gZWxzZQotCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7Ci0KLQlpZiAoKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSAhPSBjaCkpCi0JCWN0eC0+c3RhZ2luZy5mbGFncyA9IDA7Ci0KLQlpd2xfc2V0X3J4b25fY2hhbm5lbChwcml2LCBjaGFubmVsLCBjdHgpOwotCWl3bF9zZXRfcnhvbl9odChwcml2LCBodF9jb25mKTsKLQlpd2xfc2V0X2ZsYWdzX2Zvcl9iYW5kKHByaXYsIGN0eCwgY2hhbm5lbC0+YmFuZCwgY3R4LT52aWYpOwotCi0Jc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5zaHJkLT5sb2NrKTsKLQotCWl3bF9zZXRfcmF0ZShwcml2KTsKLQkvKgotCSAqIGF0IHRoaXMgcG9pbnQsIHN0YWdpbmdfcnhvbiBoYXMgdGhlCi0JICogY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCBzd2l0Y2gKLQkgKi8KLQlzZXRfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKTsKLQlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKLQlpZiAocHJpdi0+Y2ZnLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChwcml2LCBjaF9zd2l0Y2gpKSB7Ci0JCWNsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7Ci0JCXByaXYtPnN3aXRjaF9jaGFubmVsID0gMDsKLQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGZhbHNlKTsKLQl9Ci0KLW91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAotCQkJCSAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLAotCQkJCSAgICB1NjQgbXVsdGljYXN0KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCV9fbGUzMiBmaWx0ZXJfb3IgPSAwLCBmaWx0ZXJfbmFuZCA9IDA7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKLQotI2RlZmluZSBDSEsodGVzdCwgZmxhZykJZG8geyBcCi0JaWYgKCp0b3RhbF9mbGFncyAmICh0ZXN0KSkJCVwKLQkJZmlsdGVyX29yIHw9IChmbGFnKTsJCVwKLQllbHNlCQkJCQlcCi0JCWZpbHRlcl9uYW5kIHw9IChmbGFnKTsJCVwKLQl9IHdoaWxlICgwKQotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJFbnRlcjogY2hhbmdlZDogMHgleCwgdG90YWw6IDB4JXhcbiIsCi0JCQljaGFuZ2VkX2ZsYWdzLCAqdG90YWxfZmxhZ3MpOwotCi0JQ0hLKEZJRl9PVEhFUl9CU1MgfCBGSUZfUFJPTUlTQ19JTl9CU1MsIFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKLQkvKiBTZXR0aW5nIF9qdXN0XyBSWE9OX0ZJTFRFUl9DVEwySE9TVF9NU0sgY2F1c2VzIEZIIGVycm9ycyAqLwotCUNISyhGSUZfQ09OVFJPTCwgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIHwgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0spOwotCUNISyhGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQywgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0spOwotCi0jdW5kZWYgQ0hLCi0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgewotCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5maWx0ZXJfbmFuZDsKLQkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBmaWx0ZXJfb3I7Ci0KLQkJLyoKLQkJICogTm90IGNvbW1pdHRpbmcgZGlyZWN0bHkgYmVjYXVzZSBoYXJkd2FyZSBjYW4gcGVyZm9ybSBhIHNjYW4sCi0JCSAqIGJ1dCB3ZSdsbCBldmVudHVhbGx5IGNvbW1pdCB0aGUgZmlsdGVyIGZsYWdzIGNoYW5nZSBhbnl3YXkuCi0JCSAqLwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JLyoKLQkgKiBSZWNlaXZpbmcgYWxsIG11bHRpY2FzdCBmcmFtZXMgaXMgYWx3YXlzIGVuYWJsZWQgYnkgdGhlCi0JICogZGVmYXVsdCBmbGFncyBzZXR1cCBpbiBpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZygpCi0JICogc2luY2Ugd2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHByb2dyYW1taW5nIG11bHRpY2FzdAotCSAqIGZpbHRlcnMgaW50byB0aGUgZGV2aWNlLgotCSAqLwotCSp0b3RhbF9mbGFncyAmPSBGSUZfT1RIRVJfQlNTIHwgRklGX0FMTE1VTFRJIHwgRklGX1BST01JU0NfSU5fQlNTIHwKLQkJCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDIHwgRklGX0NPTlRST0w7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bGFnbl9tYWNfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgZHJvcCkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKIAotCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkgewotCQlJV0xfREVCVUdfVFgocHJpdiwgIkFib3J0aW5nIGZsdXNoIGR1ZSB0byBkZXZpY2Ugc2h1dGRvd25cbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQotCWlmIChpd2xfaXNfcmZraWxsKHByaXYtPnNocmQpKSB7Ci0JCUlXTF9ERUJVR19UWChwcml2LCAiQWJvcnRpbmcgZmx1c2ggZHVlIHRvIFJGIEtpbGxcbiIpOwotCQlnb3RvIGRvbmU7Ci0JfQogCi0JLyoKLQkgKiBtYWM4MDIxMSB3aWxsIG5vdCBwdXNoIGFueSBtb3JlIGZyYW1lcyBmb3IgdHJhbnNtaXQKLQkgKiB1bnRpbCB0aGUgZmx1c2ggaXMgY29tcGxldGVkCi0JICovCi0JaWYgKGRyb3ApIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJzZW5kIGZsdXNoIGNvbW1hbmRcbiIpOwotCQlpZiAoaXdsYWduX3R4Zmlmb19mbHVzaChwcml2LCBJV0xfRFJPUF9BTEwpKSB7Ci0JCQlJV0xfRVJSKHByaXYsICJmbHVzaCByZXF1ZXN0IGZhaWxcbiIpOwotCQkJZ290byBkb25lOwotCQl9Ci0JfQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAid2FpdCB0cmFuc21pdC9mbHVzaCBhbGwgZnJhbWVzXG4iKTsKLQlpd2xfdHJhbnNfd2FpdF90eF9xdWV1ZV9lbXB0eSh0cmFucyhwcml2KSk7Ci1kb25lOgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQogCiB2b2lkIGl3bGFnbl9kaXNhYmxlX3JvYyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CkBAIC0yNzU5LDE2MCArMTQ5Myw2IEBACiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CiB9CiAKLXN0YXRpYyBpbnQgaXdsYWduX21hY19yZW1haW5fb25fY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKLQkJCQkgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAotCQkJCSAgICAgaW50IGR1cmF0aW9uKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX1BBTl07Ci0JaW50IGVyciA9IDA7Ci0KLQlpZiAoIShwcml2LT5zaHJkLT52YWxpZF9jb250ZXh0cyAmIEJJVChJV0xfUlhPTl9DVFhfUEFOKSkpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCWlmICghKGN0eC0+aW50ZXJmYWNlX21vZGVzICYgQklUKE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQpKSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0JbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JaWYgKHRlc3RfYml0KFNUQVRVU19TQ0FOX0hXLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkgewotCQllcnIgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OwotCX0KLQotCXByaXYtPmh3X3JvY19jaGFubmVsID0gY2hhbm5lbDsKLQlwcml2LT5od19yb2NfY2hhbnR5cGUgPSBjaGFubmVsX3R5cGU7Ci0JcHJpdi0+aHdfcm9jX2R1cmF0aW9uID0gZHVyYXRpb247Ci0JcHJpdi0+aHdfcm9jX3N0YXJ0X25vdGlmaWVkID0gZmFsc2U7Ci0JY2FuY2VsX2RlbGF5ZWRfd29yaygmcHJpdi0+aHdfcm9jX2Rpc2FibGVfd29yayk7Ci0KLQlpZiAoIWN0eC0+aXNfYWN0aXZlKSB7Ci0JCWN0eC0+aXNfYWN0aXZlID0gdHJ1ZTsKLQkJY3R4LT5zdGFnaW5nLmRldl90eXBlID0gUlhPTl9ERVZfVFlQRV9QMlA7Ci0JCW1lbWNweShjdHgtPnN0YWdpbmcubm9kZV9hZGRyLAotCQkgICAgICAgcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uc3RhZ2luZy5ub2RlX2FkZHIsCi0JCSAgICAgICBFVEhfQUxFTik7Ci0JCW1lbWNweShjdHgtPnN0YWdpbmcuYnNzaWRfYWRkciwKLQkJICAgICAgIHByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLnN0YWdpbmcubm9kZV9hZGRyLAotCQkgICAgICAgRVRIX0FMRU4pOwotCQllcnIgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQkJaWYgKGVycikKLQkJCWdvdG8gb3V0OwotCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzIHw9IFJYT05fRklMVEVSX0FTU09DX01TSyB8Ci0JCQkJCSAgICAgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0sgfAotCQkJCQkgICAgIFJYT05fRklMVEVSX0NUTDJIT1NUX01TSzsKLQotCQllcnIgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQkJaWYgKGVycikgewotCQkJaXdsYWduX2Rpc2FibGVfcm9jKHByaXYpOwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJcHJpdi0+aHdfcm9jX3NldHVwID0gdHJ1ZTsKLQl9Ci0KLQllcnIgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2LCBjdHgtPnZpZiwgSVdMX1NDQU5fUk9DLCBjaGFubmVsLT5iYW5kKTsKLQlpZiAoZXJyKQotCQlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7Ci0KLSBvdXQ6Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfY2FuY2VsX3JlbWFpbl9vbl9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JaWYgKCEocHJpdi0+c2hyZC0+dmFsaWRfY29udGV4dHMgJiBCSVQoSVdMX1JYT05fQ1RYX1BBTikpKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgcHJpdi0+aHdfcm9jX2R1cmF0aW9uKTsKLQlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7Ci0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBpd2xhZ25fbWFjX3R4X3N5bmMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJICAgICAgY29uc3QgdTggKmJzc2lkLAotCQkJICAgICAgZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIHR5cGUpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7Ci0Jc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7Ci0Jc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHZpZl9wcml2LT5jdHg7Ci0JaW50IHJldDsKLQl1OCBzdGFfaWQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAoaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKLQkJcmV0ID0gMDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaWYgKGN0eC0+cHJlYXV0aF9ic3NpZCB8fCB0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnNocmQtPnN0YXR1cykpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlyZXQgPSBpd2xfYWRkX3N0YXRpb25fY29tbW9uKHByaXYsIGN0eCwgYnNzaWQsIHRydWUsIE5VTEwsICZzdGFfaWQpOwotCWlmIChyZXQpCi0JCWdvdG8gb3V0OwotCi0JaWYgKFdBUk5fT04oc3RhX2lkICE9IGN0eC0+YXBfc3RhX2lkKSkgewotCQlyZXQgPSAtRUlPOwotCQlnb3RvIG91dF9yZW1vdmVfc3RhOwotCX0KLQotCW1lbWNweShjdHgtPmJzc2lkLCBic3NpZCwgRVRIX0FMRU4pOwotCWN0eC0+cHJlYXV0aF9ic3NpZCA9IHRydWU7Ci0KLQlyZXQgPSBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKLQotCWlmIChyZXQgPT0gMCkKLQkJZ290byBvdXQ7Ci0KLSBvdXRfcmVtb3ZlX3N0YToKLQlpd2xfcmVtb3ZlX3N0YXRpb24ocHJpdiwgc3RhX2lkLCBic3NpZCk7Ci0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgaXdsYWduX21hY19maW5pc2hfdHhfc3luYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkJCSAgIGNvbnN0IHU4ICpic3NpZCwKLQkJCQkgICBlbnVtIGllZWU4MDIxMV90eF9zeW5jX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmIChpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKLQkJZ290byBvdXQ7Ci0KLQlpd2xfcmVtb3ZlX3N0YXRpb24ocHJpdiwgY3R4LT5hcF9zdGFfaWQsIGJzc2lkKTsKLQljdHgtPnByZWF1dGhfYnNzaWQgPSBmYWxzZTsKLQkvKiBubyBuZWVkIHRvIGNvbW1pdCAqLwotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgogICogZHJpdmVyIHNldHVwIGFuZCB0ZWFyZG93bgpAQCAtMjkzNiw4ICsxNTE2LDggQEAKIAogCWl3bF9zZXR1cF9zY2FuX2RlZmVycmVkX3dvcmsocHJpdik7CiAKLQlpZiAocHJpdi0+Y2ZnLT5saWItPmJ0X3NldHVwX2RlZmVycmVkX3dvcmspCi0JCXByaXYtPmNmZy0+bGliLT5idF9zZXR1cF9kZWZlcnJlZF93b3JrKHByaXYpOworCWlmIChjZmcocHJpdiktPmxpYi0+YnRfc2V0dXBfZGVmZXJyZWRfd29yaykKKwkJY2ZnKHByaXYpLT5saWItPmJ0X3NldHVwX2RlZmVycmVkX3dvcmsocHJpdik7CiAKIAlpbml0X3RpbWVyKCZwcml2LT5zdGF0aXN0aWNzX3BlcmlvZGljKTsKIAlwcml2LT5zdGF0aXN0aWNzX3BlcmlvZGljLmRhdGEgPSAodW5zaWduZWQgbG9uZylwcml2OwpAQCAtMjk1NCw4ICsxNTM0LDggQEAKIAogc3RhdGljIHZvaWQgaXdsX2NhbmNlbF9kZWZlcnJlZF93b3JrKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQlpZiAocHJpdi0+Y2ZnLT5saWItPmNhbmNlbF9kZWZlcnJlZF93b3JrKQotCQlwcml2LT5jZmctPmxpYi0+Y2FuY2VsX2RlZmVycmVkX3dvcmsocHJpdik7CisJaWYgKGNmZyhwcml2KS0+bGliLT5jYW5jZWxfZGVmZXJyZWRfd29yaykKKwkJY2ZnKHByaXYpLT5saWItPmNhbmNlbF9kZWZlcnJlZF93b3JrKHByaXYpOwogCiAJY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+cnVuX3RpbWVfY2FsaWJfd29yayk7CiAJY2FuY2VsX3dvcmtfc3luYygmcHJpdi0+YmVhY29uX3VwZGF0ZSk7CkBAIC0yOTk5LDYgKzE1NzksOCBAQAogCiAJbXV0ZXhfaW5pdCgmcHJpdi0+c2hyZC0+bXV0ZXgpOwogCisJSU5JVF9MSVNUX0hFQUQoJnRyYW5zKHByaXYpLT5jYWxpYl9yZXN1bHRzKTsKKwogCXByaXYtPmllZWVfY2hhbm5lbHMgPSBOVUxMOwogCXByaXYtPmllZWVfcmF0ZXMgPSBOVUxMOwogCXByaXYtPmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwpAQCAtMzAyMiw4ICsxNjA0LDggQEAKIAlpd2xfaW5pdF9zY2FuX3BhcmFtcyhwcml2KTsKIAogCS8qIGluaXQgYnQgY29leCAqLwotCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgeworCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCSAgICBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCkgewogCQlwcml2LT5raWxsX2Fja19tYXNrID0gSVdMQUdOX0JUX0tJTExfQUNLX01BU0tfREVGQVVMVDsKIAkJcHJpdi0+a2lsbF9jdHNfbWFzayA9IElXTEFHTl9CVF9LSUxMX0NUU19NQVNLX0RFRkFVTFQ7CiAJCXByaXYtPmJ0X3ZhbGlkID0gSVdMQUdOX0JUX0FMTF9WQUxJRF9NU0s7CkBAIC0zMDU1LDg4ICsxNjM3LDE5IEBACiAKIHN0YXRpYyB2b2lkIGl3bF91bmluaXRfZHJ2KHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKIHsKLQlpd2xfY2FsaWJfZnJlZV9yZXN1bHRzKHByaXYpOwogCWl3bF9mcmVlX2dlb3MocHJpdik7CiAJaXdsX2ZyZWVfY2hhbm5lbF9tYXAocHJpdik7CiAJaWYgKHByaXYtPnR4X2NtZF9wb29sKQogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocHJpdi0+dHhfY21kX3Bvb2wpOwogCWtmcmVlKHByaXYtPnNjYW5fY21kKTsKIAlrZnJlZShwcml2LT5iZWFjb25fY21kKTsKKwlrZnJlZShyY3VfZGVyZWZlcmVuY2VfcmF3KHByaXYtPm5vYV9kYXRhKSk7CiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogCWtmcmVlKHByaXYtPndvd2xhbl9zcmFtKTsKICNlbmRpZgogfQogCi1zdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3Jzc2lfY2FsbGJhY2soc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICBlbnVtIGllZWU4MDIxMV9yc3NpX2V2ZW50IHJzc2lfZXZlbnQpCi17Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CiAKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkJCXByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0KSB7Ci0JCWlmIChyc3NpX2V2ZW50ID09IFJTU0lfRVZFTlRfTE9XKQotCQkJcHJpdi0+YnRfZW5hYmxlX3BzcG9sbCA9IHRydWU7Ci0JCWVsc2UgaWYgKHJzc2lfZXZlbnQgPT0gUlNTSV9FVkVOVF9ISUdIKQotCQkJcHJpdi0+YnRfZW5hYmxlX3BzcG9sbCA9IGZhbHNlOwotCi0JCWl3bGFnbl9zZW5kX2FkdmFuY2VfYnRfY29uZmlnKHByaXYpOwotCX0gZWxzZSB7Ci0JCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiQWR2YW5jZWQgQlQgY29leCBkaXNhYmxlZCwiCi0JCQkJImlnbm9yaW5nIFJTU0kgY2FsbGJhY2tcbiIpOwotCX0KLQotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOwotfQotCi1zdGF0aWMgaW50IGl3bGFnbl9tYWNfc2V0X3RpbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIGJvb2wgc2V0KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JcXVldWVfd29yayhwcml2LT5zaHJkLT53b3JrcXVldWUsICZwcml2LT5iZWFjb25fdXBkYXRlKTsKLQotCXJldHVybiAwOwotfQotCi1zdHJ1Y3QgaWVlZTgwMjExX29wcyBpd2xhZ25faHdfb3BzID0gewotCS50eCA9IGl3bGFnbl9tYWNfdHgsCi0JLnN0YXJ0ID0gaXdsYWduX21hY19zdGFydCwKLQkuc3RvcCA9IGl3bGFnbl9tYWNfc3RvcCwKLSNpZmRlZiBDT05GSUdfUE1fU0xFRVAKLQkuc3VzcGVuZCA9IGl3bGFnbl9tYWNfc3VzcGVuZCwKLQkucmVzdW1lID0gaXdsYWduX21hY19yZXN1bWUsCi0jZW5kaWYKLQkuYWRkX2ludGVyZmFjZSA9IGl3bGFnbl9tYWNfYWRkX2ludGVyZmFjZSwKLQkucmVtb3ZlX2ludGVyZmFjZSA9IGl3bGFnbl9tYWNfcmVtb3ZlX2ludGVyZmFjZSwKLQkuY2hhbmdlX2ludGVyZmFjZSA9IGl3bGFnbl9tYWNfY2hhbmdlX2ludGVyZmFjZSwKLQkuY29uZmlnID0gaXdsYWduX21hY19jb25maWcsCi0JLmNvbmZpZ3VyZV9maWx0ZXIgPSBpd2xhZ25fY29uZmlndXJlX2ZpbHRlciwKLQkuc2V0X2tleSA9IGl3bGFnbl9tYWNfc2V0X2tleSwKLQkudXBkYXRlX3RraXBfa2V5ID0gaXdsYWduX21hY191cGRhdGVfdGtpcF9rZXksCi0JLnNldF9yZWtleV9kYXRhID0gaXdsYWduX21hY19zZXRfcmVrZXlfZGF0YSwKLQkuY29uZl90eCA9IGl3bGFnbl9tYWNfY29uZl90eCwKLQkuYnNzX2luZm9fY2hhbmdlZCA9IGl3bGFnbl9ic3NfaW5mb19jaGFuZ2VkLAotCS5hbXBkdV9hY3Rpb24gPSBpd2xhZ25fbWFjX2FtcGR1X2FjdGlvbiwKLQkuaHdfc2NhbiA9IGl3bGFnbl9tYWNfaHdfc2NhbiwKLQkuc3RhX25vdGlmeSA9IGl3bGFnbl9tYWNfc3RhX25vdGlmeSwKLQkuc3RhX2FkZCA9IGl3bGFnbl9tYWNfc3RhX2FkZCwKLQkuc3RhX3JlbW92ZSA9IGl3bGFnbl9tYWNfc3RhX3JlbW92ZSwKLQkuY2hhbm5lbF9zd2l0Y2ggPSBpd2xhZ25fbWFjX2NoYW5uZWxfc3dpdGNoLAotCS5mbHVzaCA9IGl3bGFnbl9tYWNfZmx1c2gsCi0JLnR4X2xhc3RfYmVhY29uID0gaXdsYWduX21hY190eF9sYXN0X2JlYWNvbiwKLQkucmVtYWluX29uX2NoYW5uZWwgPSBpd2xhZ25fbWFjX3JlbWFpbl9vbl9jaGFubmVsLAotCS5jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwgPSBpd2xhZ25fbWFjX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbCwKLQkucnNzaV9jYWxsYmFjayA9IGl3bGFnbl9tYWNfcnNzaV9jYWxsYmFjaywKLQlDRkc4MDIxMV9URVNUTU9ERV9DTUQoaXdsYWduX21hY190ZXN0bW9kZV9jbWQpCi0JQ0ZHODAyMTFfVEVTVE1PREVfRFVNUChpd2xhZ25fbWFjX3Rlc3Rtb2RlX2R1bXApCi0JLnR4X3N5bmMgPSBpd2xhZ25fbWFjX3R4X3N5bmMsCi0JLmZpbmlzaF90eF9zeW5jID0gaXdsYWduX21hY19maW5pc2hfdHhfc3luYywKLQkuc2V0X3RpbSA9IGl3bGFnbl9tYWNfc2V0X3RpbSwKLX07CiAKIHN0YXRpYyB1MzIgaXdsX2h3X2RldGVjdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CkBAIC0zMTU2LDQwICsxNjY5LDU1IEBACiAJCWh3X3BhcmFtcyhwcml2KS5yeF9wYWdlX29yZGVyID0KIAkJCWdldF9vcmRlcihJV0xfUlhfQlVGX1NJWkVfNEspOwogCi0JaWYgKGl3bGFnbl9tb2RfcGFyYW1zLmRpc2FibGVfMTFuKQotCQlwcml2LT5jZmctPnNrdSAmPSB+RUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRTsKKwlpZiAoaXdsYWduX21vZF9wYXJhbXMuZGlzYWJsZV8xMW4gJiBJV0xfRElTQUJMRV9IVF9BTEwpCisJCWNmZyhwcml2KS0+c2t1ICY9IH5FRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFOwogCiAJaHdfcGFyYW1zKHByaXYpLm51bV9hbXBkdV9xdWV1ZXMgPQotCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzOworCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5udW1fb2ZfYW1wZHVfcXVldWVzOwogCWh3X3BhcmFtcyhwcml2KS5zaGFkb3dfcmVnX2VuYWJsZSA9Ci0JCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnNoYWRvd19yZWdfZW5hYmxlOwotCWh3X3BhcmFtcyhwcml2KS5za3UgPSBwcml2LT5jZmctPnNrdTsKLQlod19wYXJhbXMocHJpdikud2RfdGltZW91dCA9IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPndkX3RpbWVvdXQ7CisJCWNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPnNoYWRvd19yZWdfZW5hYmxlOworCWh3X3BhcmFtcyhwcml2KS5za3UgPSBjZmcocHJpdiktPnNrdTsKKwlod19wYXJhbXMocHJpdikud2RfdGltZW91dCA9IGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPndkX3RpbWVvdXQ7CiAKIAkvKiBEZXZpY2Utc3BlY2lmaWMgc2V0dXAgKi8KLQlyZXR1cm4gcHJpdi0+Y2ZnLT5saWItPnNldF9od19wYXJhbXMocHJpdik7CisJcmV0dXJuIGNmZyhwcml2KS0+bGliLT5zZXRfaHdfcGFyYW1zKHByaXYpOwogfQogCi0vKiBUaGlzIGZ1bmN0aW9uIGJvdGggYWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBodyBhbmQgcHJpdi4gKi8KLXN0YXRpYyBzdHJ1Y3QgaWVlZTgwMjExX2h3ICppd2xfYWxsb2NfYWxsKHN0cnVjdCBpd2xfY2ZnICpjZmcpCisKKworc3RhdGljIHZvaWQgaXdsX2RlYnVnX2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0Jc3RydWN0IGl3bF9wcml2ICpwcml2OwotCS8qIG1hYzgwMjExIGFsbG9jYXRlcyBtZW1vcnkgZm9yIHRoaXMgZGV2aWNlIGluc3RhbmNlLCBpbmNsdWRpbmcKLQkgKiAgIHNwYWNlIGZvciB0aGlzIGRyaXZlcidzIHByaXZhdGUgc3RydWN0dXJlICovCi0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sIGJ1cyhwcml2KS0+ZGV2LCAiQ09ORklHX0lXTFdJRklfREVCVUcgIgorI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHCisJCSJlbmFibGVkXG4iKTsKKyNlbHNlCisJCSJkaXNhYmxlZFxuIik7CisjZW5kaWYKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgYnVzKHByaXYpLT5kZXYsICJDT05GSUdfSVdMV0lGSV9ERUJVR0ZTICIKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCisJCSJlbmFibGVkXG4iKTsKKyNlbHNlCisJCSJkaXNhYmxlZFxuIik7CisjZW5kaWYKKwlkZXZfcHJpbnRrKEtFUk5fSU5GTywgYnVzKHByaXYpLT5kZXYsICJDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVFJBQ0lORyAiCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1RSQUNJTkcKKwkJImVuYWJsZWRcbiIpOworI2Vsc2UKKwkJImRpc2FibGVkXG4iKTsKKyNlbmRpZgogCi0JaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBpd2xfcHJpdiksICZpd2xhZ25faHdfb3BzKTsKLQlpZiAoaHcgPT0gTlVMTCkgewotCQlwcl9lcnIoIiVzOiBDYW4gbm90IGFsbG9jYXRlIG5ldHdvcmsgZGV2aWNlXG4iLAotCQkgICAgICAgY2ZnLT5uYW1lKTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcHJpdiA9IGh3LT5wcml2OwotCXByaXYtPmh3ID0gaHc7Ci0KLW91dDoKLQlyZXR1cm4gaHc7CisJZGV2X3ByaW50ayhLRVJOX0lORk8sIGJ1cyhwcml2KS0+ZGV2LCAiQ09ORklHX0lXTFdJRklfREVWSUNFX1RFU1RNT0RFICIKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERVZJQ0VfVEVTVE1PREUKKwkJImVuYWJsZWRcbiIpOworI2Vsc2UKKwkJImRpc2FibGVkXG4iKTsKKyNlbmRpZgorCWRldl9wcmludGsoS0VSTl9JTkZPLCBidXMocHJpdiktPmRldiwgIkNPTkZJR19JV0xXSUZJX1AyUCAiCisjaWZkZWYgQ09ORklHX0lXTFdJRklfUDJQCisJCSJlbmFibGVkXG4iKTsKKyNlbHNlCisJCSJkaXNhYmxlZFxuIik7CisjZW5kaWYKIH0KIAogaW50IGl3bF9wcm9iZShzdHJ1Y3QgaXdsX2J1cyAqYnVzLCBjb25zdCBzdHJ1Y3QgaXdsX3RyYW5zX29wcyAqdHJhbnNfb3BzLApAQCAtMzIwNCw4ICsxNzMyLDkgQEAKIAkvKioqKioqKioqKioqKioqKioqKioqKioqCiAJICogMS4gQWxsb2NhdGluZyBIVyBkYXRhCiAJICoqKioqKioqKioqKioqKioqKioqKioqKi8KLQlodyA9IGl3bF9hbGxvY19hbGwoY2ZnKTsKKwlodyA9IGl3bF9hbGxvY19hbGwoKTsKIAlpZiAoIWh3KSB7CisJCXByX2VycigiJXM6IENhbm5vdCBhbGxvY2F0ZSBuZXR3b3JrIGRldmljZVxuIiwgY2ZnLT5uYW1lKTsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMzIyNiw4ICsxNzU1LDExIEBACiAKIAlTRVRfSUVFRTgwMjExX0RFVihodywgYnVzKHByaXYpLT5kZXYpOwogCisJLyogd2hhdCBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzIHdlIGhhdmUgKi8KKwlpd2xfZGVidWdfY29uZmlnKHByaXYpOworCiAJSVdMX0RFQlVHX0lORk8ocHJpdiwgIioqKiBMT0FEIERSSVZFUiAqKipcbiIpOwotCXByaXYtPmNmZyA9IGNmZzsKKwljZmcocHJpdikgPSBjZmc7CiAKIAkvKiBpcyBhbnRlbm5hIGNvdXBsaW5nIG1vcmUgdGhhbiAzNWRCID8gKi8KIAlwcml2LT5idF9hbnRfY291cGxlX29rID0KQEAgLTMyNjEsNyArMTc5Myw3IEBACiAJICoqKioqKioqKioqKioqKioqKioqKioqLwogCWh3X3JldiA9IGl3bF9od19kZXRlY3QocHJpdik7CiAJSVdMX0lORk8ocHJpdiwgIkRldGVjdGVkICVzLCBSRVY9MHglWFxuIiwKLQkJcHJpdi0+Y2ZnLT5uYW1lLCBod19yZXYpOworCQljZmcocHJpdiktPm5hbWUsIGh3X3Jldik7CiAKIAllcnIgPSBpd2xfdHJhbnNfcmVxdWVzdF9pcnEodHJhbnMocHJpdikpOwogCWlmIChlcnIpCkBAIC0zMjkxLDExICsxODIzLDExIEBACiAJCWdvdG8gb3V0X2ZyZWVfZWVwcm9tOwogCiAJLyogZXh0cmFjdCBNQUMgQWRkcmVzcyAqLwotCWl3bF9lZXByb21fZ2V0X21hYyhwcml2LCBwcml2LT5hZGRyZXNzZXNbMF0uYWRkcik7CisJaXdsX2VlcHJvbV9nZXRfbWFjKHByaXYtPnNocmQsIHByaXYtPmFkZHJlc3Nlc1swXS5hZGRyKTsKIAlJV0xfREVCVUdfSU5GTyhwcml2LCAiTUFDIGFkZHJlc3M6ICVwTVxuIiwgcHJpdi0+YWRkcmVzc2VzWzBdLmFkZHIpOwogCXByaXYtPmh3LT53aXBoeS0+YWRkcmVzc2VzID0gcHJpdi0+YWRkcmVzc2VzOwogCXByaXYtPmh3LT53aXBoeS0+bl9hZGRyZXNzZXMgPSAxOwotCW51bV9tYWMgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX05VTV9NQUNfQUREUkVTUyk7CisJbnVtX21hYyA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LT5zaHJkLCBFRVBST01fTlVNX01BQ19BRERSRVNTKTsKIAlpZiAobnVtX21hYyA+IDEpIHsKIAkJbWVtY3B5KHByaXYtPmFkZHJlc3Nlc1sxXS5hZGRyLCBwcml2LT5hZGRyZXNzZXNbMF0uYWRkciwKIAkJICAgICAgIEVUSF9BTEVOKTsKQEAgLTMzNjAsNyArMTg5Miw3IEBACiAJcHJpdi0+c2hyZC0+d29ya3F1ZXVlID0gTlVMTDsKIAlpd2xfdW5pbml0X2Rydihwcml2KTsKIG91dF9mcmVlX2VlcHJvbToKLQlpd2xfZWVwcm9tX2ZyZWUocHJpdik7CisJaXdsX2VlcHJvbV9mcmVlKHByaXYtPnNocmQpOwogb3V0X2ZyZWVfdHJhbnM6CiAJaXdsX3RyYW5zX2ZyZWUodHJhbnMocHJpdikpOwogb3V0X2ZyZWVfdHJhZmZpY19tZW06CkBAIC0zMzg1LDIxICsxOTE3LDE2IEBACiAJc2V0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKTsKIAogCWl3bF90ZXN0bW9kZV9jbGVhbnVwKHByaXYpOwotCWl3bF9sZWRzX2V4aXQocHJpdik7Ci0KLQlpZiAocHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkgewotCQlpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhwcml2LT5odyk7Ci0JCXByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAwOwotCX0KKwlpd2xhZ25fbWFjX3VucmVnaXN0ZXIocHJpdik7CiAKIAlpd2xfdHRfZXhpdChwcml2KTsKIAogCS8qVGhpcyB3aWxsIHN0b3AgdGhlIHF1ZXVlcywgbW92ZSB0aGUgZGV2aWNlIHRvIGxvdyBwb3dlciBzdGF0ZSAqLwogCWl3bF90cmFuc19zdG9wX2RldmljZSh0cmFucyhwcml2KSk7CiAKLQlpd2xfZGVhbGxvY191Y29kZShwcml2KTsKKwlpd2xfZGVhbGxvY191Y29kZSh0cmFucyhwcml2KSk7CiAKLQlpd2xfZWVwcm9tX2ZyZWUocHJpdik7CisJaXdsX2VlcHJvbV9mcmVlKHByaXYtPnNocmQpOwogCiAJLypuZXRpZl9zdG9wX3F1ZXVlKGRldik7ICovCiAJZmx1c2hfd29ya3F1ZXVlKHByaXYtPnNocmQtPndvcmtxdWV1ZSk7CkBAIC0zNDY5LDggKzE5OTYsOSBAQAogTU9EVUxFX1BBUk1fREVTQyhzd2NyeXB0bywgInVzaW5nIGNyeXB0byBpbiBzb2Z0d2FyZSAoZGVmYXVsdCAwIFtoYXJkd2FyZV0pIik7CiBtb2R1bGVfcGFyYW1fbmFtZWQocXVldWVzX251bSwgaXdsYWduX21vZF9wYXJhbXMubnVtX29mX3F1ZXVlcywgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MocXVldWVzX251bSwgIm51bWJlciBvZiBodyBxdWV1ZXMuIik7Ci1tb2R1bGVfcGFyYW1fbmFtZWQoMTFuX2Rpc2FibGUsIGl3bGFnbl9tb2RfcGFyYW1zLmRpc2FibGVfMTFuLCBpbnQsIFNfSVJVR08pOwotTU9EVUxFX1BBUk1fREVTQygxMW5fZGlzYWJsZSwgImRpc2FibGUgMTFuIGZ1bmN0aW9uYWxpdHkiKTsKK21vZHVsZV9wYXJhbV9uYW1lZCgxMW5fZGlzYWJsZSwgaXdsYWduX21vZF9wYXJhbXMuZGlzYWJsZV8xMW4sIHVpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQygxMW5fZGlzYWJsZSwKKwkiZGlzYWJsZSAxMW4gZnVuY3Rpb25hbGl0eSwgYml0bWFwOiAxOiBmdWxsLCAyOiBhZ2cgVFgsIDQ6IGFnZyBSWCIpOwogbW9kdWxlX3BhcmFtX25hbWVkKGFtc2R1X3NpemVfOEssIGl3bGFnbl9tb2RfcGFyYW1zLmFtc2R1X3NpemVfOEssCiAJCSAgIGludCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKGFtc2R1X3NpemVfOEssICJlbmFibGUgOEsgYW1zZHUgc2l6ZSIpOwpAQCAtMzQ5OSw5ICsyMDI3LDEwIEBACiBtb2R1bGVfcGFyYW1fbmFtZWQoYWNrX2NoZWNrLCBpd2xhZ25fbW9kX3BhcmFtcy5hY2tfY2hlY2ssIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhhY2tfY2hlY2ssICJDaGVjayBhY2sgaGVhbHRoIChkZWZhdWx0OiAwIFtkaXNhYmxlZF0pIik7CiAKLW1vZHVsZV9wYXJhbV9uYW1lZCh3ZF9kaXNhYmxlLCBpd2xhZ25fbW9kX3BhcmFtcy53ZF9kaXNhYmxlLCBib29sLCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh3ZF9kaXNhYmxlLCBpd2xhZ25fbW9kX3BhcmFtcy53ZF9kaXNhYmxlLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyh3ZF9kaXNhYmxlLAotCQkiRGlzYWJsZSBzdHVjayBxdWV1ZSB3YXRjaGRvZyB0aW1lciAoZGVmYXVsdDogMCBbZW5hYmxlZF0pIik7CisJCSJEaXNhYmxlIHN0dWNrIHF1ZXVlIHdhdGNoZG9nIHRpbWVyIDA9c3lzdGVtIGRlZmF1bHQsICIKKwkJIjE9ZGlzYWJsZSwgMj1lbmFibGUgKGRlZmF1bHQ6IDApIik7CiAKIC8qCiAgKiBzZXQgYnRfY29leF9hY3RpdmUgdG8gdHJ1ZSwgdUNvZGUgd2lsbCBkbyBraWxsL2RlZmVyCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1hZ24uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCmluZGV4IDViOTM2ZWMuLmY4NGZiM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWFnbi5oCkBAIC02NSw2ICs2NSwxMiBAQAogCiAjaW5jbHVkZSAiaXdsLWRldi5oIgogCitzdHJ1Y3QgaXdsYWduX3Vjb2RlX2NhcGFiaWxpdGllcyB7CisJdTMyIG1heF9wcm9iZV9sZW5ndGg7CisJdTMyIHN0YW5kYXJkX3BoeV9jYWxpYnJhdGlvbl9zaXplOworCXUzMiBmbGFnczsKK307CisKIGV4dGVybiBzdHJ1Y3QgaWVlZTgwMjExX29wcyBpd2xhZ25faHdfb3BzOwogCiBpbnQgaXdsX3Jlc2V0X2ljdChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyk7CkBAIC03Nyw2ICs4MywxNiBAQAogCWhkci0+ZGF0YV92YWxpZCA9IDE7CiB9CiAKK3ZvaWQgX19pd2xfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwordm9pZCBpd2xfZG93bihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwordm9pZCBpd2xhZ25fcHJlcGFyZV9yZXN0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisKKy8qIE1BQzgwMjExICovCitzdHJ1Y3QgaWVlZTgwMjExX2h3ICppd2xfYWxsb2NfYWxsKHZvaWQpOworaW50IGl3bGFnbl9tYWNfc2V0dXBfcmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LAorCQkJICAgICAgc3RydWN0IGl3bGFnbl91Y29kZV9jYXBhYmlsaXRpZXMgKmNhcGEpOwordm9pZCBpd2xhZ25fbWFjX3VucmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKKwogLyogUlhPTiAqLwogaW50IGl3bGFnbl9zZXRfcGFuX3BhcmFtcyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bGFnbl9jb21taXRfcnhvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwpAQCAtODYsMjUgKzEwMiwyNyBAQAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiwKIAkJCSAgICAgdTMyIGNoYW5nZXMpOwordm9pZCBpd2xhZ25fY29uZmlnX2h0NDAoc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLAorCQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCk7CiAKIC8qIHVDb2RlICovCiBpbnQgaXdsYWduX3J4X2NhbGliX3Jlc3VsdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgc3RydWN0IGl3bF9yeF9tZW1fYnVmZmVyICpyeGIsCiAJCQkgICAgc3RydWN0IGl3bF9kZXZpY2VfY21kICpjbWQpOwotaW50IGl3bGFnbl9zZW5kX2J0X2VudihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4IGFjdGlvbiwgdTggdHlwZSk7Ci12b2lkIGl3bGFnbl9zZW5kX3ByaW9fdGJsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsYWduX3J1bl9pbml0X3Vjb2RlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci1pbnQgaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIHN0cnVjdCBmd19pbWcgKmltYWdlLAotCQkJCSBlbnVtIGl3bGFnbl91Y29kZV90eXBlIHVjb2RlX3R5cGUpOwogCiAvKiBsaWIgKi8KIGludCBpd2xhZ25fc2VuZF90eF9wb3dlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogdm9pZCBpd2xhZ25fdGVtcGVyYXR1cmUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXUxNiBpd2xhZ25fZWVwcm9tX2NhbGliX3ZlcnNpb24oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKK3UxNiBpd2xfZWVwcm9tX2NhbGliX3ZlcnNpb24oc3RydWN0IGl3bF9zaGFyZWQgKnNocmQpOwogaW50IGl3bGFnbl90eGZpZm9fZmx1c2goc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgZmx1c2hfY29udHJvbCk7CiB2b2lkIGl3bGFnbl9kZXZfdHhmaWZvX2ZsdXNoKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTE2IGZsdXNoX2NvbnRyb2wpOwogaW50IGl3bGFnbl9zZW5kX2JlYWNvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK2ludCBpd2xhZ25fc2VuZF9wYXR0ZXJucyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKTsKK2ludCBpd2xhZ25fc3VzcGVuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCSAgIHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3dsYW4pOworI2VuZGlmCiAKIC8qIHJ4ICovCiBpbnQgaXdsYWduX2h3cmF0ZV90b19tYWM4MDIxMV9pZHgodTMyIHJhdGVfbl9mbGFncywgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKTsKQEAgLTExNSw2ICsxMzMsOCBAQAogaW50IGl3bGFnbl90eF9za2Ioc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGludCBpd2xhZ25fdHhfYWdnX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHUxNiB0aWQsIHUxNiAqc3NuKTsKK2ludCBpd2xhZ25fdHhfYWdnX29wZXIoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTE2IHRpZCwgdTggYnVmX3NpemUpOwogaW50IGl3bGFnbl90eF9hZ2dfc3RvcChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkKTsKIGludCBpd2xhZ25fcnhfcmVwbHlfY29tcHJlc3NlZF9iYShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCkBAIC0xOTYsOSArMjE2LDYgQEAKIAkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4ICpzdGFfaWRfcik7CiBpbnQgaXdsX3JlbW92ZV9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgY29uc3QgdTggc3RhX2lkLAogCQkgICAgICAgY29uc3QgdTggKmFkZHIpOwotaW50IGl3bGFnbl9tYWNfc3RhX3JlbW92ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOwotCiB1OCBpd2xfcHJlcF9zdGF0aW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKIAkJICAgIGNvbnN0IHU4ICphZGRyLCBib29sIGlzX2FwLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKTsKIApAQCAtMzE2LDEwICszMzMsNiBAQAogaW50IGl3bF91cGRhdGVfYmNhc3Rfc3RhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCiAJCQkgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwogaW50IGl3bF91cGRhdGVfYmNhc3Rfc3RhdGlvbnMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsYWduX21hY19zdGFfbm90aWZ5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCSAgIGVudW0gc3RhX25vdGlmeV9jbWQgY21kLAotCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7CiAKIC8qIHJhdGUgKi8KIHN0YXRpYyBpbmxpbmUgdTMyIGl3bF9hbnRfaWR4X3RvX2ZsYWdzKHU4IGFudF9pZHgpCkBAIC0zMzksMjggKzM1MiwxMSBAQAogCiAvKiBlZXByb20gKi8KIHZvaWQgaXdsX2VlcHJvbV9lbmhhbmNlZF90eHBvd2VyKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bF9lZXByb21fZ2V0X21hYyhjb25zdCBzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHU4ICptYWMpOwordm9pZCBpd2xfZWVwcm9tX2dldF9tYWMoY29uc3Qgc3RydWN0IGl3bF9zaGFyZWQgKnNocmQsIHU4ICptYWMpOwogCi0vKiBub3RpZmljYXRpb24gd2FpdCBzdXBwb3J0ICovCi12b2lkIF9fYWNxdWlyZXMod2FpdF9lbnRyeSkKLWl3bGFnbl9pbml0X25vdGlmaWNhdGlvbl93YWl0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCSAgICAgIHN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgKndhaXRfZW50cnksCi0JCQkgICAgICB1OCBjbWQsCi0JCQkgICAgICB2b2lkICgqZm4pKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkJIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QsCi0JCQkJCSB2b2lkICpkYXRhKSwKLQkJCSAgICAgIHZvaWQgKmZuX2RhdGEpOwotaW50IF9fbXVzdF9jaGVjayBfX3JlbGVhc2VzKHdhaXRfZW50cnkpCi1pd2xhZ25fd2FpdF9ub3RpZmljYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJIHN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgKndhaXRfZW50cnksCi0JCQkgdW5zaWduZWQgbG9uZyB0aW1lb3V0KTsKLXZvaWQgX19yZWxlYXNlcyh3YWl0X2VudHJ5KQotaXdsYWduX3JlbW92ZV9ub3RpZmljYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqd2FpdF9lbnRyeSk7Ci1leHRlcm4gaW50IGl3bGFnbl9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiBleHRlcm4gaW50IGl3bF9hbGl2ZV9zdGFydChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogLyogc3Z0b29sICovCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1NWVE9PTAorI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9URVNUTU9ERQogZXh0ZXJuIGludCBpd2xhZ25fbWFjX3Rlc3Rtb2RlX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdm9pZCAqZGF0YSwKIAkJCQkgICBpbnQgbGVuKTsKIGV4dGVybiBpbnQgaXdsYWduX21hY190ZXN0bW9kZV9kdW1wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtYnVzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1idXMuaAppbmRleCAwOGI5NzU5Li45NDBkNTAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1idXMuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1idXMuaApAQCAtMTIyLDcgKzEyMiw4IEBACiAgKiBzdHJ1Y3QgaXdsX2J1c19vcHMgLSBidXMgc3BlY2lmaWMgb3BlcmF0aW9ucwogICogQGdldF9wbV9zdXBwb3J0OiBtdXN0IHJldHVybnMgdHJ1ZSBpZiB0aGUgYnVzIGNhbiBnbyB0byBzbGVlcAogICogQGFwbV9jb25maWc6IHdpbGwgYmUgY2FsbGVkIGR1cmluZyB0aGUgY29uZmlnIG9mIHRoZSBBUE0KLSAqIEBnZXRfaHdfaWQ6IHByaW50cyB0aGUgaHdfaWQgaW4gdGhlIHByb3ZpZGVkIGJ1ZmZlcgorICogQGdldF9od19pZF9zdHJpbmc6IHByaW50cyB0aGUgaHdfaWQgaW4gdGhlIHByb3ZpZGVkIGJ1ZmZlcgorICogQGdldF9od19pZDogZ2V0IGh3X2lkIGluIHUzMgogICogQHdyaXRlODogd3JpdGUgYSBieXRlIHRvIHJlZ2lzdGVyIGF0IG9mZnNldCBvZnMKICAqIEB3cml0ZTMyOiB3cml0ZSBhIGR3b3JkIHRvIHJlZ2lzdGVyIGF0IG9mZnNldCBvZnMKICAqIEB3cmVhZDMyOiByZWFkIGEgZHdvcmQgYXQgcmVnaXN0ZXIgYXQgb2Zmc2V0IG9mcwpAQCAtMTMwLDcgKzEzMSw4IEBACiBzdHJ1Y3QgaXdsX2J1c19vcHMgewogCWJvb2wgKCpnZXRfcG1fc3VwcG9ydCkoc3RydWN0IGl3bF9idXMgKmJ1cyk7CiAJdm9pZCAoKmFwbV9jb25maWcpKHN0cnVjdCBpd2xfYnVzICpidXMpOwotCXZvaWQgKCpnZXRfaHdfaWQpKHN0cnVjdCBpd2xfYnVzICpidXMsIGNoYXIgYnVmW10sIGludCBidWZfbGVuKTsKKwl2b2lkICgqZ2V0X2h3X2lkX3N0cmluZykoc3RydWN0IGl3bF9idXMgKmJ1cywgY2hhciBidWZbXSwgaW50IGJ1Zl9sZW4pOworCXUzMiAoKmdldF9od19pZCkoc3RydWN0IGl3bF9idXMgKmJ1cyk7CiAJdm9pZCAoKndyaXRlOCkoc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIG9mcywgdTggdmFsKTsKIAl2b2lkICgqd3JpdGUzMikoc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIG9mcywgdTMyIHZhbCk7CiAJdTMyICgqcmVhZDMyKShzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgb2ZzKTsKQEAgLTE3Miw5ICsxNzQsMTUgQEAKIAlidXMtPm9wcy0+YXBtX2NvbmZpZyhidXMpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgYnVzX2dldF9od19pZChzdHJ1Y3QgaXdsX2J1cyAqYnVzLCBjaGFyIGJ1ZltdLCBpbnQgYnVmX2xlbikKK3N0YXRpYyBpbmxpbmUgdm9pZCBidXNfZ2V0X2h3X2lkX3N0cmluZyhzdHJ1Y3QgaXdsX2J1cyAqYnVzLCBjaGFyIGJ1ZltdLAorCQlpbnQgYnVmX2xlbikKIHsKLQlidXMtPm9wcy0+Z2V0X2h3X2lkKGJ1cywgYnVmLCBidWZfbGVuKTsKKwlidXMtPm9wcy0+Z2V0X2h3X2lkX3N0cmluZyhidXMsIGJ1ZiwgYnVmX2xlbik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIGJ1c19nZXRfaHdfaWQoc3RydWN0IGl3bF9idXMgKmJ1cykKK3sKKwlyZXR1cm4gYnVzLT5vcHMtPmdldF9od19pZChidXMpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYnVzX3dyaXRlOChzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgb2ZzLCB1OCB2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jZmcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNmZy5oCmluZGV4IDJhMmRjNDUuLmUxZDc4MjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNmZy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNmZy5oCkBAIC0xMDEsMTcgKzEwMSwxMSBAQAogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEzMF9iZ25fY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEzMF9iZ19jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMjAwMF8yYmduX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wyMDAwXzJiZ19jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMjAwMF8yYmduX2RfY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDIwMzBfMmJnbl9jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMjAzMF8yYmdfY2ZnOwogZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDYwMzVfMmFnbl9jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsNjAzNV8yYWJnX2NmZzsKLWV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2w2MDM1XzJiZ19jZmc7Ci1leHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMTA1X2JnX2NmZzsKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDVfYmduX2NmZzsKIGV4dGVybiBzdHJ1Y3QgaXdsX2NmZyBpd2wxMDVfYmduX2RfY2ZnOwotZXh0ZXJuIHN0cnVjdCBpd2xfY2ZnIGl3bDEzNV9iZ19jZmc7CiBleHRlcm4gc3RydWN0IGl3bF9jZmcgaXdsMTM1X2Jnbl9jZmc7CiAKICNlbmRpZiAvKiBfX2l3bF9wY2lfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29tbWFuZHMuaAppbmRleCA2OWQ1Zjg1Li4yNjVkZTM5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb21tYW5kcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvbW1hbmRzLmgKQEAgLTEwOSwxMCArMTA5LDEwIEBACiAJLyogUlgsIFRYLCBMRURzICovCiAJUkVQTFlfVFggPSAweDFjLAogCVJFUExZX0xFRFNfQ01EID0gMHg0OCwKLQlSRVBMWV9UWF9MSU5LX1FVQUxJVFlfQ01EID0gMHg0ZSwgLyogZm9yIDQ5NjUgYW5kIHVwICovCisJUkVQTFlfVFhfTElOS19RVUFMSVRZX0NNRCA9IDB4NGUsCiAKIAkvKiBXaU1BWCBjb2V4aXN0ZW5jZSAqLwotCUNPRVhfUFJJT1JJVFlfVEFCTEVfQ01EID0gMHg1YSwJLyogZm9yIDUwMDAgc2VyaWVzIGFuZCB1cCAqLworCUNPRVhfUFJJT1JJVFlfVEFCTEVfQ01EID0gMHg1YSwKIAlDT0VYX01FRElVTV9OT1RJRklDQVRJT04gPSAweDViLAogCUNPRVhfRVZFTlRfQ01EID0gMHg1YywKIApAQCAtMTk4LDYgKzE5OCw3IEBACiAJUkVQTFlfV09XTEFOX1RLSVBfUEFSQU1TID0gMHhlMywKIAlSRVBMWV9XT1dMQU5fS0VLX0tDS19NQVRFUklBTCA9IDB4ZTQsCiAJUkVQTFlfV09XTEFOX0dFVF9TVEFUVVMgPSAweGU1LAorCVJFUExZX0QzX0NPTkZJRyA9IDB4ZDMsCiAKIAlSRVBMWV9NQVggPSAweGZmCiB9OwpAQCAtNDY1LDIzICs0NjYsMjcgQEAKIAl1MzIgZnJhbWVfcHRyOwkJLyogZnJhbWUgcG9pbnRlciAqLwogCXUzMiBzdGFja19wdHI7CQkvKiBzdGFjayBwb2ludGVyICovCiAJdTMyIGhjbWQ7CQkvKiBsYXN0IGhvc3QgY29tbWFuZCBoZWFkZXIgKi8KLSNpZiAwCi0JLyogbm8gbmVlZCB0byByZWFkIHRoZSByZW1haW5kZXIsIHdlIGRvbid0IHVzZSB0aGUgdmFsdWVzICovCi0JdTMyIGlzcjA7CQkvKiBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjA6IHJ4dHhfZmxhZyAqLwotCXUzMiBpc3IxOwkJLyogaXNyIHN0YXR1cyByZWdpc3RlciBMTVBNX05JQ19JU1IxOiBob3N0X2ZsYWcgKi8KLQl1MzIgaXNyMjsJCS8qIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMjogZW5jX2ZsYWcgKi8KLQl1MzIgaXNyMzsJCS8qIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMzogdGltZV9mbGFnICovCi0JdTMyIGlzcjQ7CQkvKiBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjQ6IHdpY28gaW50ZXJydXB0ICovCisJdTMyIGlzcjA7CQkvKiBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjA6CisJCQkJICogcnh0eF9mbGFnICovCisJdTMyIGlzcjE7CQkvKiBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjE6CisJCQkJICogaG9zdF9mbGFnICovCisJdTMyIGlzcjI7CQkvKiBpc3Igc3RhdHVzIHJlZ2lzdGVyIExNUE1fTklDX0lTUjI6CisJCQkJICogZW5jX2ZsYWcgKi8KKwl1MzIgaXNyMzsJCS8qIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSMzoKKwkJCQkgKiB0aW1lX2ZsYWcgKi8KKwl1MzIgaXNyNDsJCS8qIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfSVNSNDoKKwkJCQkgKiB3aWNvIGludGVycnVwdCAqLwogCXUzMiBpc3JfcHJlZjsJCS8qIGlzciBzdGF0dXMgcmVnaXN0ZXIgTE1QTV9OSUNfUFJFRl9TVEFUICovCiAJdTMyIHdhaXRfZXZlbnQ7CQkvKiB3YWl0IGV2ZW50KCkgY2FsbGVyIGFkZHJlc3MgKi8KIAl1MzIgbDJwX2NvbnRyb2w7CS8qIEwycENvbnRyb2xGaWVsZCAqLwogCXUzMiBsMnBfZHVyYXRpb247CS8qIEwycER1cmF0aW9uRmllbGQgKi8KIAl1MzIgbDJwX21odmFsaWQ7CS8qIEwycE1oVmFsaWRCaXRzICovCiAJdTMyIGwycF9hZGRyX21hdGNoOwkvKiBMMnBBZGRyTWF0Y2hTdGF0ICovCi0JdTMyIGxtcG1fcG1nX3NlbDsJLyogaW5kaWNhdGUgd2hpY2ggY2xvY2tzIGFyZSB0dXJuZWQgb24gKExNUE1fUE1HX1NFTCkgKi8KLQl1MzIgdV90aW1lc3RhbXA7CS8qIGluZGljYXRlIHdoZW4gdGhlIGRhdGUgYW5kIHRpbWUgb2YgdGhlIGNvbXBpbGF0aW9uICovCisJdTMyIGxtcG1fcG1nX3NlbDsJLyogaW5kaWNhdGUgd2hpY2ggY2xvY2tzIGFyZSB0dXJuZWQgb24KKwkJCQkgKiAoTE1QTV9QTUdfU0VMKSAqLworCXUzMiB1X3RpbWVzdGFtcDsJLyogaW5kaWNhdGUgd2hlbiB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUKKwkJCQkgKiBjb21waWxhdGlvbiAqLwogCXUzMiBmbG93X2hhbmRsZXI7CS8qIEZIIHJlYWQvd3JpdGUgcG9pbnRlcnMsIFJYIGNyZWRpdCAqLwotI2VuZGlmCiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaXdsX2FsaXZlX3Jlc3AgewpAQCAtODA5LDcgKzgxNCw3IEBACiAjZGVmaW5lCUlXTEFHTl9TVEFUSU9OX0NPVU5UCTE2CiAKICNkZWZpbmUJSVdMX0lOVkFMSURfU1RBVElPTiAJMjU1Ci0jZGVmaW5lIElXTF9NQVhfVElEX0NPVU5UCTkKKyNkZWZpbmUgSVdMX01BWF9USURfQ09VTlQJOAogCiAjZGVmaW5lIFNUQV9GTEdfVFhfUkFURV9NU0sJCWNwdV90b19sZTMyKDEgPDwgMikKICNkZWZpbmUgU1RBX0ZMR19QV1JfU0FWRV9NU0sJCWNwdV90b19sZTMyKDEgPDwgOCkKQEAgLTkzMCw4ICs5MzUsNyBAQAogCSAqIGNvcnJlc3BvbmRpbmcgdG8gYml0IChlLmcuIGJpdCA1IGNvbnRyb2xzIFRJRCA1KS4KIAkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfVElEX0RJU0FCTEVfVFggdG8gdXNlIHRoaXMgZmllbGQuICovCiAJX19sZTE2IHRpZF9kaXNhYmxlX3R4OwotCi0JX19sZTE2CXJhdGVfbl9mbGFnczsJCS8qIDM5NDUgb25seSAqLworCV9fbGUxNiBsZWdhY3lfcmVzZXJ2ZWQ7CiAKIAkvKiBUSUQgZm9yIHdoaWNoIHRvIGFkZCBibG9jay1hY2sgc3VwcG9ydC4KIAkgKiBTZXQgbW9kaWZ5X21hc2sgYml0IFNUQV9NT0RJRllfQUREQkFfVElEX01TSyB0byB1c2UgdGhpcyBmaWVsZC4gKi8KQEAgLTExNjEsOCArMTE2NSw3IEBACiAgKgogICogdUNvZGUgaGFuZGxlcyByZXRyeWluZyBUeCB3aGVuIGFuIEFDSyBpcyBleHBlY3RlZCBidXQgbm90IHJlY2VpdmVkLgogICogVGhpcyBpbmNsdWRlcyB0cnlpbmcgbG93ZXIgZGF0YSByYXRlcyB0aGFuIHRoZSBvbmUgcmVxdWVzdGVkIGluIHRoZSBUeAotICogY29tbWFuZCwgYXMgc2V0IHVwIGJ5IHRoZSBSRVBMWV9SQVRFX1NDQUxFIChmb3IgMzk0NSkgb3IKLSAqIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQgKGFnbikuCisgKiBjb21tYW5kLCBhcyBzZXQgdXAgYnkgdGhlIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQgKGFnbikuCiAgKgogICogRHJpdmVyIHNldHMgdXAgdHJhbnNtaXQgcG93ZXIgZm9yIHZhcmlvdXMgcmF0ZXMgdmlhIFJFUExZX1RYX1BXUl9UQUJMRV9DTUQuCiAgKiBUaGlzIGNvbW1hbmQgbXVzdCBiZSBleGVjdXRlZCBhZnRlciBldmVyeSBSWE9OIGNvbW1hbmQsIGJlZm9yZSBUeCBjYW4gb2NjdXIuCkBAIC0xMTc0LDI1ICsxMTc3LDkgQEAKICAqIDE6IFVzZSBSVFMvQ1RTIHByb3RvY29sIG9yIENUUy10by1zZWxmIGlmIHNwZWMgYWxsb3dzIGl0CiAgKiBiZWZvcmUgdGhpcyBmcmFtZS4gaWYgQ1RTLXRvLXNlbGYgcmVxdWlyZWQgY2hlY2sKICAqIFJYT05fRkxHX1NFTEZfQ1RTX0VOIHN0YXR1cy4KLSAqIHVudXNlZCBpbiAzOTQ1LzQ5NjUsIHVzZWQgaW4gNTAwMCBzZXJpZXMgYW5kIGFmdGVyCiAgKi8KICNkZWZpbmUgVFhfQ01EX0ZMR19QUk9UX1JFUVVJUkVfTVNLIGNwdV90b19sZTMyKDEgPDwgMCkKIAotLyoKLSAqIDE6IFVzZSBSZXF1ZXN0LVRvLVNlbmQgcHJvdG9jb2wgYmVmb3JlIHRoaXMgZnJhbWUuCi0gKiBNdXR1YWxseSBleGNsdXNpdmUgdnMuIFRYX0NNRF9GTEdfQ1RTX01TSy4KLSAqIHVzZWQgaW4gMzk0NS80OTY1LCB1bnVzZWQgaW4gNTAwMCBzZXJpZXMgYW5kIGFmdGVyCi0gKi8KLSNkZWZpbmUgVFhfQ01EX0ZMR19SVFNfTVNLIGNwdV90b19sZTMyKDEgPDwgMSkKLQotLyoKLSAqIDE6IFRyYW5zbWl0IENsZWFyLVRvLVNlbmQgdG8gc2VsZiBiZWZvcmUgdGhpcyBmcmFtZS4KLSAqIERyaXZlciBzaG91bGQgc2V0IHRoaXMgZm9yIEFVVEgvREVBVVRIL0FTU09DLVJFUS9SRUFTU09DIG1nbW50IGZyYW1lcy4KLSAqIE11dHVhbGx5IGV4Y2x1c2l2ZSB2cy4gVFhfQ01EX0ZMR19SVFNfTVNLLgotICogdXNlZCBpbiAzOTQ1LzQ5NjUsIHVudXNlZCBpbiA1MDAwIHNlcmllcyBhbmQgYWZ0ZXIKLSAqLwotI2RlZmluZSBUWF9DTURfRkxHX0NUU19NU0sgY3B1X3RvX2xlMzIoMSA8PCAyKQotCiAvKiAxOiBFeHBlY3QgQUNLIGZyb20gcmVjZWl2aW5nIHN0YXRpb24KICAqIDA6IERvbid0IGV4cGVjdCBBQ0sgKE1BQyBoZWFkZXIncyBkdXJhdGlvbiBmaWVsZCBzL2IgMCkKICAqIFNldCB0aGlzIGZvciB1bmljYXN0IGZyYW1lcywgYnV0IG5vdCBicm9hZGNhc3QvbXVsdGljYXN0LiAqLwpAQCAtMTIxMCwxOCArMTE5Nyw4IEBACiAgKiBTZXQgd2hlbiBUeGluZyBhIGJsb2NrLWFjayByZXF1ZXN0IGZyYW1lLiAgQWxzbyBzZXQgVFhfQ01EX0ZMR19BQ0tfTVNLLiAqLwogI2RlZmluZSBUWF9DTURfRkxHX0lNTV9CQV9SU1BfTUFTSyAgY3B1X3RvX2xlMzIoMSA8PCA2KQogCi0vKgotICogMTogRnJhbWUgcmVxdWlyZXMgZnVsbCBUeC1PcCBwcm90ZWN0aW9uLgotICogU2V0IHRoaXMgaWYgZWl0aGVyIFJUUyBvciBDVFMgVHggRmxhZyBnZXRzIHNldC4KLSAqIHVzZWQgaW4gMzk0NS80OTY1LCB1bnVzZWQgaW4gNTAwMCBzZXJpZXMgYW5kIGFmdGVyCi0gKi8KLSNkZWZpbmUgVFhfQ01EX0ZMR19GVUxMX1RYT1BfUFJPVF9NU0sgY3B1X3RvX2xlMzIoMSA8PCA3KQotCi0vKiBUeCBhbnRlbm5hIHNlbGVjdGlvbiBmaWVsZDsgdXNlZCBvbmx5IGZvciAzOTQ1LCByZXNlcnZlZCAoMCkgZm9yIGFnbiBkZXZpY2VzLgotICogU2V0IGZpZWxkIHRvICIwIiB0byBhbGxvdyAzOTQ1IHVDb2RlIHRvIHNlbGVjdCBhbnRlbm5hIChub3JtYWwgdXNhZ2UpLiAqLworLyogVHggYW50ZW5uYSBzZWxlY3Rpb24gZmllbGQ7IHJlc2VydmVkICgwKSBmb3IgYWduIGRldmljZXMuICovCiAjZGVmaW5lIFRYX0NNRF9GTEdfQU5UX1NFTF9NU0sgY3B1X3RvX2xlMzIoMHhmMDApCi0jZGVmaW5lIFRYX0NNRF9GTEdfQU5UX0FfTVNLIGNwdV90b19sZTMyKDEgPDwgOCkKLSNkZWZpbmUgVFhfQ01EX0ZMR19BTlRfQl9NU0sgY3B1X3RvX2xlMzIoMSA8PCA5KQogCiAvKiAxOiBJZ25vcmUgQmx1ZXRvb3RoIHByaW9yaXR5IGZvciB0aGlzIGZyYW1lLgogICogMDogRGVsYXkgVHggdW50aWwgQmx1ZXRvb3RoIGRldmljZSBpcyBkb25lIChub3JtYWwgdXNhZ2UpLiAqLwpAQCAtMTU2Nyw3ICsxNTQ0LDYgQEAKIAlfX2xlNjQgYml0bWFwOwogCV9fbGUxNiBzY2RfZmxvdzsKIAlfX2xlMTYgc2NkX3NzbjsKLQkvKiBmb2xsb3dpbmcgb25seSBmb3IgNTAwMCBzZXJpZXMgYW5kIHVwICovCiAJdTggdHhlZDsJLyogbnVtYmVyIG9mIGZyYW1lcyBzZW50ICovCiAJdTggdHhlZF8yX2RvbmU7IC8qIG51bWJlciBvZiBmcmFtZXMgYWNrZWQgKi8KIH0gX19wYWNrZWQ7CkBAIC0xNjY5LDcgKzE2NDUsNyBAQAogLyoKICAqIFJFUExZX1RYX0xJTktfUVVBTElUWV9DTUQgPSAweDRlIChjb21tYW5kLCBoYXMgc2ltcGxlIGdlbmVyaWMgcmVzcG9uc2UpCiAgKgotICogRm9yIGFnbiBkZXZpY2VzIG9ubHk7IDM5NDUgdXNlcyBSRVBMWV9SQVRFX1NDQUxFLgorICogRm9yIGFnbiBkZXZpY2VzCiAgKgogICogRWFjaCBzdGF0aW9uIGluIHRoZSBhZ24gZGV2aWNlJ3MgaW50ZXJuYWwgc3RhdGlvbiB0YWJsZSBoYXMgaXRzIG93biB0YWJsZQogICogb2YgMTYKQEAgLTE5MTgsNyArMTg5NCw3IEBACiAvKgogICogUkVQTFlfQlRfQ09ORklHID0gMHg5YiAoY29tbWFuZCwgaGFzIHNpbXBsZSBnZW5lcmljIHJlc3BvbnNlKQogICoKLSAqIDM5NDUgYW5kIGFnbiBkZXZpY2VzIHN1cHBvcnQgaGFyZHdhcmUgaGFuZHNoYWtlIHdpdGggQmx1ZXRvb3RoIGRldmljZSBvbgorICogYWduIGRldmljZXMgc3VwcG9ydCBoYXJkd2FyZSBoYW5kc2hha2Ugd2l0aCBCbHVldG9vdGggZGV2aWNlIG9uCiAgKiBzYW1lIHBsYXRmb3JtLiAgQmx1ZXRvb3RoIGRldmljZSBhbGVydHMgd2lyZWxlc3MgZGV2aWNlIHdoZW4gaXQgd2lsbCBUeDsKICAqIHdpcmVsZXNzIGRldmljZSBjYW4gZGVsYXkgb3Iga2lsbCBpdHMgb3duIFR4IHRvIGFjY29tbW9kYXRlLgogICovCkBAIC0yMjAyLDggKzIxNzgsOCBAQAogCiBzdHJ1Y3QgaXdsX3Bvd2VydGFibGVfY21kIHsKIAlfX2xlMTYgZmxhZ3M7Ci0JdTgga2VlcF9hbGl2ZV9zZWNvbmRzOwkJLyogMzk0NSByZXNlcnZlZCAqLwotCXU4IGRlYnVnX2ZsYWdzOwkJCS8qIDM5NDUgcmVzZXJ2ZWQgKi8KKwl1OCBrZWVwX2FsaXZlX3NlY29uZHM7CisJdTggZGVidWdfZmxhZ3M7CiAJX19sZTMyIHJ4X2RhdGFfdGltZW91dDsKIAlfX2xlMzIgdHhfZGF0YV90aW1lb3V0OwogCV9fbGUzMiBzbGVlcF9pbnRlcnZhbFtJV0xfUE9XRVJfVkVDX1NJWkVdOwpAQCAtMjMyNCw5ICsyMzAwLDkgQEAKIC8qKgogICogc3RydWN0IGl3bF9zc2lkX2llIC0gZGlyZWN0ZWQgc2NhbiBuZXR3b3JrIGluZm9ybWF0aW9uIGVsZW1lbnQKICAqCi0gKiBVcCB0byAyMCBvZiB0aGVzZSBtYXkgYXBwZWFyIGluIFJFUExZX1NDQU5fQ01EIChOb3RlOiBPbmx5IDQgYXJlIGluCi0gKiAzOTQ1IFNDQU4gYXBpKSwgc2VsZWN0ZWQgYnkgInR5cGUiIGJpdCBmaWVsZCBpbiBzdHJ1Y3QgaXdsX3NjYW5fY2hhbm5lbDsKLSAqIGVhY2ggY2hhbm5lbCBtYXkgc2VsZWN0IGRpZmZlcmVudCBzc2lkcyBmcm9tIGFtb25nIHRoZSAyMCAoNCkgZW50cmllcy4KKyAqIFVwIHRvIDIwIG9mIHRoZXNlIG1heSBhcHBlYXIgaW4gUkVQTFlfU0NBTl9DTUQsCisgKiBzZWxlY3RlZCBieSAidHlwZSIgYml0IGZpZWxkIGluIHN0cnVjdCBpd2xfc2Nhbl9jaGFubmVsOworICogZWFjaCBjaGFubmVsIG1heSBzZWxlY3QgZGlmZmVyZW50IHNzaWRzIGZyb20gYW1vbmcgdGhlIDIwIGVudHJpZXMuCiAgKiBTU0lEIElFcyBnZXQgdHJhbnNtaXR0ZWQgaW4gcmV2ZXJzZSBvcmRlciBvZiBlbnRyeS4KICAqLwogc3RydWN0IGl3bF9zc2lkX2llIHsKQEAgLTIzMzUsNyArMjMxMSw2IEBACiAJdTggc3NpZFszMl07CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIFBST0JFX09QVElPTl9NQVhfMzk0NQkJNAogI2RlZmluZSBQUk9CRV9PUFRJT05fTUFYCQkyMAogI2RlZmluZSBUWF9DTURfTElGRV9USU1FX0lORklOSVRFCWNwdV90b19sZTMyKDB4RkZGRkZGRkYpCiAjZGVmaW5lIElXTF9HT09EX0NSQ19USF9ESVNBQkxFRAkwCkBAIC0yNDE2LDggKzIzOTEsNiBAQAogCQkJCSAqIGNoYW5uZWwgKi8KIAlfX2xlMzIgc3VzcGVuZF90aW1lOwkvKiBwYXVzZSBzY2FuIHRoaXMgbG9uZyAoaW4gImV4dGVuZGVkIGJlYWNvbgogCQkJCSAqIGZvcm1hdCIpIHdoZW4gcmV0dXJuaW5nIHRvIHNlcnZpY2UgY2hubDoKLQkJCQkgKiAzOTQ1OyAzMToyNCAjIGJlYWNvbnMsIDE5OjAgYWRkaXRpb25hbCB1c2VjLAotCQkJCSAqIDQ5NjU7IDMxOjIyICMgYmVhY29ucywgMjE6MCBhZGRpdGlvbmFsIHVzZWMuCiAJCQkJICovCiAJX19sZTMyIGZsYWdzOwkJLyogUlhPTl9GTEdfKiAqLwogCV9fbGUzMiBmaWx0ZXJfZmxhZ3M7CS8qIFJYT05fRklMVEVSXyogKi8KQEAgLTI3MzMsNyArMjcwNiw3IEBACiAKIHN0cnVjdCBzdGF0aXN0aWNzX2dlbmVyYWxfY29tbW9uIHsKIAlfX2xlMzIgdGVtcGVyYXR1cmU7ICAgLyogcmFkaW8gdGVtcGVyYXR1cmUgKi8KLQlfX2xlMzIgdGVtcGVyYXR1cmVfbTsgLyogZm9yIDUwMDAgYW5kIHVwLCB0aGlzIGlzIHJhZGlvIHZvbHRhZ2UgKi8KKwlfX2xlMzIgdGVtcGVyYXR1cmVfbTsgLyogcmFkaW8gdm9sdGFnZSAqLwogCXN0cnVjdCBzdGF0aXN0aWNzX2RiZyBkYmc7CiAJX19sZTMyIHNsZWVwX3RpbWU7CiAJX19sZTMyIHNsb3RzX291dDsKQEAgLTM4MDEsNiArMzc3NCwxOSBAQAogfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKIAogLyoKKyAqIFJFUExZX0QzX0NPTkZJRworICovCitlbnVtIGl3bGFnbl9kM193YWtldXBfZmlsdGVycyB7CisJSVdMQUdOX0QzX1dBS0VVUF9SRktJTEwJCT0gQklUKDApLAorCUlXTEFHTl9EM19XQUtFVVBfU1lTQVNTRVJUCT0gQklUKDEpLAorfTsKKworc3RydWN0IGl3bGFnbl9kM19jb25maWdfY21kIHsKKwlfX2xlMzIgbWluX3NsZWVwX3RpbWU7CisJX19sZTMyIHdha2V1cF9mbGFnczsKK30gX19wYWNrZWQ7CisKKy8qCiAgKiBSRVBMWV9XT1dMQU5fUEFUVEVSTlMKICAqLwogI2RlZmluZSBJV0xBR05fV09XTEFOX01JTl9QQVRURVJOX0xFTgkxNgpAQCAtMzgzMCwxOSArMzgxNiwxNiBAQAogCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0JFQUNPTl9NSVNTCT0gQklUKDIpLAogCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0xJTktfQ0hBTkdFCT0gQklUKDMpLAogCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0dUS19SRUtFWV9GQUlMCT0gQklUKDQpLAotCUlXTEFHTl9XT1dMQU5fV0FLRVVQX1JGS0lMTAkJPSBCSVQoNSksCi0JSVdMQUdOX1dPV0xBTl9XQUtFVVBfVUNPREVfRVJST1IJPSBCSVQoNiksCi0JSVdMQUdOX1dPV0xBTl9XQUtFVVBfRUFQX0lERU5UX1JFUQk9IEJJVCg3KSwKLQlJV0xBR05fV09XTEFOX1dBS0VVUF80V0FZX0hBTkRTSEFLRQk9IEJJVCg4KSwKLQlJV0xBR05fV09XTEFOX1dBS0VVUF9BTFdBWVMJCT0gQklUKDkpLAotCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0VOQUJMRV9ORVRfREVURUNUCT0gQklUKDEwKSwKKwlJV0xBR05fV09XTEFOX1dBS0VVUF9FQVBfSURFTlRfUkVRCT0gQklUKDUpLAorCUlXTEFHTl9XT1dMQU5fV0FLRVVQXzRXQVlfSEFORFNIQUtFCT0gQklUKDYpLAorCUlXTEFHTl9XT1dMQU5fV0FLRVVQX0FMV0FZUwkJPSBCSVQoNyksCisJSVdMQUdOX1dPV0xBTl9XQUtFVVBfRU5BQkxFX05FVF9ERVRFQ1QJPSBCSVQoOCksCiB9OwogCiBzdHJ1Y3QgaXdsYWduX3dvd2xhbl93YWtldXBfZmlsdGVyX2NtZCB7CiAJX19sZTMyIGVuYWJsZWQ7CiAJX19sZTE2IG5vbl9xb3Nfc2VxOwotCXU4IG1pbl9zbGVlcF9zZWNvbmRzOwotCXU4IHJlc2VydmVkOworCV9fbGUxNiByZXNlcnZlZDsKIAlfX2xlMTYgcW9zX3NlcVs4XTsKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNvcmUuYwppbmRleCAwMDFmZGYxLi43YmNmYTc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5jCkBAIC02MCw4ICs2MCw4IEBACiAKIAlodF9pbmZvLT5odF9zdXBwb3J0ZWQgPSB0cnVlOwogCi0JaWYgKHByaXYtPmNmZy0+aHRfcGFyYW1zICYmCi0JICAgIHByaXYtPmNmZy0+aHRfcGFyYW1zLT5odF9ncmVlbmZpZWxkX3N1cHBvcnQpCisJaWYgKGNmZyhwcml2KS0+aHRfcGFyYW1zICYmCisJICAgIGNmZyhwcml2KS0+aHRfcGFyYW1zLT5odF9ncmVlbmZpZWxkX3N1cHBvcnQpCiAJCWh0X2luZm8tPmNhcCB8PSBJRUVFODAyMTFfSFRfQ0FQX0dSTl9GTEQ7CiAJaHRfaW5mby0+Y2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzIwOwogCW1heF9iaXRfcmF0ZSA9IE1BWF9CSVRfUkFURV8yMF9NSFo7CkBAIC03NiwxMSArNzYsNyBAQAogCQlodF9pbmZvLT5jYXAgfD0gSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFU7CiAKIAlodF9pbmZvLT5hbXBkdV9mYWN0b3IgPSBDRkdfSFRfUlhfQU1QRFVfRkFDVE9SX0RFRjsKLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFtcGR1X2ZhY3RvcikKLQkJaHRfaW5mby0+YW1wZHVfZmFjdG9yID0gcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFtcGR1X2ZhY3RvcjsKIAlodF9pbmZvLT5hbXBkdV9kZW5zaXR5ID0gQ0ZHX0hUX01QRFVfREVOU0lUWV9ERUY7Ci0JaWYgKHByaXYtPmNmZy0+YnRfcGFyYW1zICYmIHByaXYtPmNmZy0+YnRfcGFyYW1zLT5hbXBkdV9kZW5zaXR5KQotCQlodF9pbmZvLT5hbXBkdV9kZW5zaXR5ID0gcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFtcGR1X2RlbnNpdHk7CiAKIAlodF9pbmZvLT5tY3MucnhfbWFza1swXSA9IDB4RkY7CiAJaWYgKHJ4X2NoYWluc19udW0gPj0gMikKQEAgLTE0MSw3ICsxMzcsNyBAQAogCXNiYW5kLT5iaXRyYXRlcyA9ICZyYXRlc1tJV0xfRklSU1RfT0ZETV9SQVRFXTsKIAlzYmFuZC0+bl9iaXRyYXRlcyA9IElXTF9SQVRFX0NPVU5UX0xFR0FDWSAtIElXTF9GSVJTVF9PRkRNX1JBVEU7CiAKLQlpZiAocHJpdi0+Y2ZnLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFKQorCWlmIChjZmcocHJpdiktPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUpCiAJCWl3bF9pbml0X2h0X2h3X2NhcGFiKHByaXYsICZzYmFuZC0+aHRfY2FwLAogCQkJCQkgSUVFRTgwMjExX0JBTkRfNUdIWik7CiAKQEAgLTE1MSw3ICsxNDcsNyBAQAogCXNiYW5kLT5iaXRyYXRlcyA9IHJhdGVzOwogCXNiYW5kLT5uX2JpdHJhdGVzID0gSVdMX1JBVEVfQ09VTlRfTEVHQUNZOwogCi0JaWYgKHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfMTFOX0VOQUJMRSkKKwlpZiAoY2ZnKHByaXYpLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFKQogCQlpd2xfaW5pdF9odF9od19jYXBhYihwcml2LCAmc2JhbmQtPmh0X2NhcCwKIAkJCQkJIElFRUU4MDIxMV9CQU5EXzJHSFopOwogCkBAIC0yMDYsMTIgKzIwMiwxMiBAQAogCXByaXYtPnR4X3Bvd2VyX25leHQgPSBtYXhfdHhfcG93ZXI7CiAKIAlpZiAoKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fY2hhbm5lbHMgPT0gMCkgJiYKLQkgICAgIHByaXYtPmNmZy0+c2t1ICYgRUVQUk9NX1NLVV9DQVBfQkFORF81MkdIWikgeworCSAgICAgY2ZnKHByaXYpLT5za3UgJiBFRVBST01fU0tVX0NBUF9CQU5EXzUyR0haKSB7CiAJCWNoYXIgYnVmWzMyXTsKLQkJYnVzX2dldF9od19pZChidXMocHJpdiksIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCQlidXNfZ2V0X2h3X2lkX3N0cmluZyhidXMocHJpdiksIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwogCQlJV0xfSU5GTyhwcml2LCAiSW5jb3JyZWN0bHkgZGV0ZWN0ZWQgQkcgY2FyZCBhcyBBQkcuICIKIAkJCSJQbGVhc2Ugc2VuZCB5b3VyICVzIHRvIG1haW50YWluZXIuXG4iLCBidWYpOwotCQlwcml2LT5jZmctPnNrdSAmPSB+RUVQUk9NX1NLVV9DQVBfQkFORF81MkdIWjsKKwkJY2ZnKHByaXYpLT5za3UgJj0gfkVFUFJPTV9TS1VfQ0FQX0JBTkRfNTJHSFo7CiAJfQogCiAJSVdMX0lORk8ocHJpdiwgIlR1bmFibGUgY2hhbm5lbHM6ICVkIDgwMi4xMWJnLCAlZCA4MDIuMTFhIGNoYW5uZWxzXG4iLApAQCAtODM2LDE5ICs4MzIsNiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIGl3bGFnbl9hYm9ydF9ub3RpZmljYXRpb25fd2FpdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0Jc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqd2FpdF9lbnRyeTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZwcml2LT5ub3RpZl93YWl0X2xvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdhaXRfZW50cnksICZwcml2LT5ub3RpZl93YWl0cywgbGlzdCkKLQkJd2FpdF9lbnRyeS0+YWJvcnRlZCA9IHRydWU7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+bm90aWZfd2FpdF9sb2NrLCBmbGFncyk7Ci0KLQl3YWtlX3VwX2FsbCgmcHJpdi0+bm90aWZfd2FpdHEpOwotfQotCiB2b2lkIGl3bGFnbl9md19lcnJvcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgb25kZW1hbmQpCiB7CiAJdW5zaWduZWQgaW50IHJlbG9hZF9tc2VjOwpAQCAtODYwLDcgKzg0Myw3IEBACiAJLyogQ2FuY2VsIGN1cnJlbnRseSBxdWV1ZWQgY29tbWFuZC4gKi8KIAljbGVhcl9iaXQoU1RBVFVTX0hDTURfQUNUSVZFLCAmcHJpdi0+c2hyZC0+c3RhdHVzKTsKIAotCWl3bGFnbl9hYm9ydF9ub3RpZmljYXRpb25fd2FpdHMocHJpdik7CisJaXdsX2Fib3J0X25vdGlmaWNhdGlvbl93YWl0cyhwcml2LT5zaHJkKTsKIAogCS8qIEtlZXAgdGhlIHJlc3RhcnQgcHJvY2VzcyBmcm9tIHRyeWluZyB0byBzZW5kIGhvc3QKIAkgKiBjb21tYW5kcyBieSBjbGVhcmluZyB0aGUgcmVhZHkgYml0ICovCkBAIC05NzksOSArOTYyLDkgQEAKIAlidXNfYXBtX2NvbmZpZyhidXMocHJpdikpOwogCiAJLyogQ29uZmlndXJlIGFuYWxvZyBwaGFzZS1sb2NrLWxvb3AgYmVmb3JlIGFjdGl2YXRpbmcgdG8gRDBBICovCi0JaWYgKHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKQorCWlmIChjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5wbGxfY2ZnX3ZhbCkKIAkJaXdsX3NldF9iaXQoYnVzKHByaXYpLCBDU1JfQU5BX1BMTF9DRkcsCi0JCQkgICAgcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+cGxsX2NmZ192YWwpOworCQkJICAgIGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPnBsbF9jZmdfdmFsKTsKIAogCS8qCiAJICogU2V0ICJpbml0aWFsaXphdGlvbiBjb21wbGV0ZSIgYml0IHRvIG1vdmUgYWRhcHRlciBmcm9tCkBAIC0xMTIwLDIyOSArMTEwMyw4IEBACiAJCQkJCSZzdGF0aXN0aWNzX2NtZCk7CiB9CiAKLWludCBpd2xhZ25fbWFjX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1MTYgcXVldWUsCi0JCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgcTsKIAotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOwogCi0JaWYgKCFpd2xfaXNfcmVhZHlfcmYocHJpdi0+c2hyZCkpIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIFJGIG5vdCByZWFkeVxuIik7Ci0JCXJldHVybiAtRUlPOwotCX0KLQotCWlmIChxdWV1ZSA+PSBBQ19OVU0pIHsKLQkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZSAtIHF1ZXVlID49IEFDX05VTSAlZFxuIiwgcXVldWUpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlxID0gQUNfTlVNIC0gMSAtIHF1ZXVlOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNocmQtPmxvY2ssIGZsYWdzKTsKLQotCS8qCi0JICogTVVMVEktRklYTUUKLQkgKiBUaGlzIG1heSBuZWVkIHRvIGJlIGRvbmUgcGVyIGludGVyZmFjZSBpbiBubDgwMjExL2NmZzgwMjExL21hYzgwMjExLgotCSAqLwotCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7Ci0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmN3X21pbiA9Ci0JCQljcHVfdG9fbGUxNihwYXJhbXMtPmN3X21pbik7Ci0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmN3X21heCA9Ci0JCQljcHVfdG9fbGUxNihwYXJhbXMtPmN3X21heCk7Ci0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmFpZnNuID0gcGFyYW1zLT5haWZzOwotCQljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5lZGNhX3R4b3AgPQotCQkJCWNwdV90b19sZTE2KChwYXJhbXMtPnR4b3AgKiAzMikpOwotCi0JCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLnJlc2VydmVkMSA9IDA7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+bG9jaywgZmxhZ3MpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLWludCBpd2xhZ25fbWFjX3R4X2xhc3RfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCi0JcmV0dXJuIHByaXYtPmlic3NfbWFuYWdlciA9PSBJV0xfSUJTU19NQU5BR0VSOwotfQotCi1zdGF0aWMgaW50IGl3bF9zZXRfbW9kZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0JaXdsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcocHJpdiwgY3R4KTsKLQotCWl3bGFnbl9zZXRfcnhvbl9jaGFpbihwcml2LCBjdHgpOwotCi0JcmV0dXJuIGl3bGFnbl9jb21taXRfcnhvbihwcml2LCBjdHgpOwotfQotCi1zdGF0aWMgaW50IGl3bF9zZXR1cF9pbnRlcmZhY2Uoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGN0eC0+dmlmOwotCWludCBlcnI7Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQkvKgotCSAqIFRoaXMgdmFyaWFibGUgd2lsbCBiZSBjb3JyZWN0IG9ubHkgd2hlbiB0aGVyZSdzIGp1c3QKLQkgKiBhIHNpbmdsZSBjb250ZXh0LCBidXQgYWxsIGNvZGUgdXNpbmcgaXQgaXMgZm9yIGhhcmR3YXJlCi0JICogdGhhdCBzdXBwb3J0cyBvbmx5IG9uZSBjb250ZXh0LgotCSAqLwotCXByaXYtPml3X21vZGUgPSB2aWYtPnR5cGU7Ci0KLQljdHgtPmlzX2FjdGl2ZSA9IHRydWU7Ci0KLQllcnIgPSBpd2xfc2V0X21vZGUocHJpdiwgY3R4KTsKLQlpZiAoZXJyKSB7Ci0JCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQotCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlpZiAocHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QgJiYKLQkgICAgdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7Ci0JCS8qCi0JCSAqIHByZXRlbmQgdG8gaGF2ZSBoaWdoIEJUIHRyYWZmaWMgYXMgbG9uZyBhcyB3ZQotCQkgKiBhcmUgb3BlcmF0aW5nIGluIElCU1MgbW9kZSwgYXMgdGhpcyB3aWxsIGNhdXNlCi0JCSAqIHRoZSByYXRlIHNjYWxpbmcgZXRjLiB0byBiZWhhdmUgYXMgaW50ZW5kZWQuCi0JCSAqLwotCQlwcml2LT5idF90cmFmZmljX2xvYWQgPSBJV0xfQlRfQ09FWF9UUkFGRklDX0xPQURfSElHSDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGl3bGFnbl9tYWNfYWRkX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wLCAqY3R4ID0gTlVMTDsKLQlpbnQgZXJyOwotCWVudW0gbmw4MDIxMV9pZnR5cGUgdmlmdHlwZSA9IGllZWU4MDIxMV92aWZfdHlwZV9wMnAodmlmKTsKLQotCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXI6IHR5cGUgJWQsIGFkZHIgJXBNXG4iLAotCQkJICAgdmlmdHlwZSwgdmlmLT5hZGRyKTsKLQotCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcHJpdi0+aHdfcm9jX2Rpc2FibGVfd29yayk7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7Ci0KLQlpZiAoIWl3bF9pc19yZWFkeV9yZihwcml2LT5zaHJkKSkgewotCQlJV0xfV0FSTihwcml2LCAiVHJ5IHRvIGFkZCBpbnRlcmZhY2Ugd2hlbiBkZXZpY2Ugbm90IHJlYWR5XG4iKTsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JZm9yX2VhY2hfY29udGV4dChwcml2LCB0bXApIHsKLQkJdTMyIHBvc3NpYmxlX21vZGVzID0KLQkJCXRtcC0+aW50ZXJmYWNlX21vZGVzIHwgdG1wLT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzOwotCi0JCWlmICh0bXAtPnZpZikgewotCQkJLyogY2hlY2sgaWYgdGhpcyBidXN5IGNvbnRleHQgaXMgZXhjbHVzaXZlICovCi0JCQlpZiAodG1wLT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYKLQkJCQkJCUJJVCh0bXAtPnZpZi0+dHlwZSkpIHsKLQkJCQllcnIgPSAtRUlOVkFMOwotCQkJCWdvdG8gb3V0OwotCQkJfQotCQkJY29udGludWU7Ci0JCX0KLQotCQlpZiAoIShwb3NzaWJsZV9tb2RlcyAmIEJJVCh2aWZ0eXBlKSkpCi0JCQljb250aW51ZTsKLQotCQkvKiBoYXZlIG1heWJlIHVzYWJsZSBjb250ZXh0IHcvbyBpbnRlcmZhY2UgKi8KLQkJY3R4ID0gdG1wOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoIWN0eCkgewotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBvdXQ7Ci0JfQotCi0JdmlmX3ByaXYtPmN0eCA9IGN0eDsKLQljdHgtPnZpZiA9IHZpZjsKLQotCWVyciA9IGl3bF9zZXR1cF9pbnRlcmZhY2UocHJpdiwgY3R4KTsKLQlpZiAoIWVycikKLQkJZ290byBvdXQ7Ci0KLQljdHgtPnZpZiA9IE5VTEw7Ci0JcHJpdi0+aXdfbW9kZSA9IE5MODAyMTFfSUZUWVBFX1NUQVRJT047Ci0gb3V0OgotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Ci0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIHZvaWQgaXdsX3RlYXJkb3duX2ludGVyZmFjZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQkgICBib29sIG1vZGVfY2hhbmdlKQotewotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmIChwcml2LT5zY2FuX3ZpZiA9PSB2aWYpIHsKLQkJaXdsX3NjYW5fY2FuY2VsX3RpbWVvdXQocHJpdiwgMjAwKTsKLQkJaXdsX2ZvcmNlX3NjYW5fZW5kKHByaXYpOwotCX0KLQotCWlmICghbW9kZV9jaGFuZ2UpIHsKLQkJaXdsX3NldF9tb2RlKHByaXYsIGN0eCk7Ci0JCWlmICghY3R4LT5hbHdheXNfYWN0aXZlKQotCQkJY3R4LT5pc19hY3RpdmUgPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIFdoZW4gcmVtb3ZpbmcgdGhlIElCU1MgaW50ZXJmYWNlLCBvdmVyd3JpdGUgdGhlCi0JICogQlQgdHJhZmZpYyBsb2FkIHdpdGggdGhlIHN0b3JlZCBvbmUgZnJvbSB0aGUgbGFzdAotCSAqIG5vdGlmaWNhdGlvbiwgaWYgYW55LiBJZiB0aGlzIGlzIGEgZGV2aWNlIHRoYXQKLQkgKiBkb2Vzbid0IGltcGxlbWVudCB0aGlzLCB0aGlzIGhhcyBubyBlZmZlY3Qgc2luY2UKLQkgKiBib3RoIHZhbHVlcyBhcmUgdGhlIHNhbWUgYW5kIHplcm8uCi0JICovCi0JaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKLQkJcHJpdi0+YnRfdHJhZmZpY19sb2FkID0gcHJpdi0+bGFzdF9idF90cmFmZmljX2xvYWQ7Ci19Ci0KLXZvaWQgaXdsYWduX21hY19yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAotCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKLXsKLQlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmIChXQVJOX09OKGN0eC0+dmlmICE9IHZpZikpIHsKLQkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKnRtcDsKLQkJSVdMX0VSUihwcml2LCAiY3R4LT52aWYgPSAlcCwgdmlmID0gJXBcbiIsIGN0eC0+dmlmLCB2aWYpOwotCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkKLQkJCUlXTF9FUlIocHJpdiwgIlx0SUQgPSAlZDpcdGN0eCA9ICVwXHRjdHgtPnZpZiA9ICVwXG4iLAotCQkJCXRtcC0+Y3R4aWQsIHRtcCwgdG1wLT52aWYpOwotCX0KLQljdHgtPnZpZiA9IE5VTEw7Ci0KLQlpd2xfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgZmFsc2UpOwotCi0JbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotfQogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogCkBAIC0xNjQ5LDk3ICsxNDExLDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpd2xhZ25fbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKLQkJCQllbnVtIG5sODAyMTFfaWZ0eXBlIG5ld3R5cGUsIGJvb2wgbmV3cDJwKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSBpd2xfcnhvbl9jdHhfZnJvbV92aWYodmlmKTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqYnNzX2N0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKLQlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqdG1wOwotCWVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dmlmdHlwZSA9IG5ld3R5cGU7Ci0JdTMyIGludGVyZmFjZV9tb2RlczsKLQlpbnQgZXJyOwotCi0JSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7Ci0KLQluZXd0eXBlID0gaWVlZTgwMjExX2lmdHlwZV9wMnAobmV3dHlwZSwgbmV3cDJwKTsKLQotCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQotCWlmICghY3R4LT52aWYgfHwgIWl3bF9pc19yZWFkeV9yZihwcml2LT5zaHJkKSkgewotCQkvKgotCQkgKiBIdWg/IEJ1dCB3YWl0IC4uLiB0aGlzIGNhbiBtYXliZSBoYXBwZW4gd2hlbgotCQkgKiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgZmlybXdhcmUgcmVzdGFydCEKLQkJICovCi0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JaW50ZXJmYWNlX21vZGVzID0gY3R4LT5pbnRlcmZhY2VfbW9kZXMgfCBjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7Ci0KLQlpZiAoIShpbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpKSB7Ci0JCWVyciA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBSZWZ1c2UgYSBjaGFuZ2UgdGhhdCBzaG91bGQgYmUgZG9uZSBieSBtb3ZpbmcgZnJvbSB0aGUgUEFOCi0JICogY29udGV4dCB0byB0aGUgQlNTIGNvbnRleHQgaW5zdGVhZCwgaWYgdGhlIEJTUyBjb250ZXh0IGlzCi0JICogYXZhaWxhYmxlIGFuZCBjYW4gc3VwcG9ydCB0aGUgbmV3IGludGVyZmFjZSB0eXBlLgotCSAqLwotCWlmIChjdHgtPmN0eGlkID09IElXTF9SWE9OX0NUWF9QQU4gJiYgIWJzc19jdHgtPnZpZiAmJgotCSAgICAoYnNzX2N0eC0+aW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpIHx8Ci0JICAgICBic3NfY3R4LT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpKSkgewotCQlCVUlMRF9CVUdfT04oTlVNX0lXTF9SWE9OX0NUWCAhPSAyKTsKLQkJZXJyID0gLUVCVVNZOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlpZiAoY3R4LT5leGNsdXNpdmVfaW50ZXJmYWNlX21vZGVzICYgQklUKG5ld3R5cGUpKSB7Ci0JCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgdG1wKSB7Ci0JCQlpZiAoY3R4ID09IHRtcCkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKCF0bXAtPnZpZikKLQkJCQljb250aW51ZTsKLQotCQkJLyoKLQkJCSAqIFRoZSBjdXJyZW50IG1vZGUgc3dpdGNoIHdvdWxkIGJlIGV4Y2x1c2l2ZSwgYnV0Ci0JCQkgKiBhbm90aGVyIGNvbnRleHQgaXMgYWN0aXZlIC4uLiByZWZ1c2UgdGhlIHN3aXRjaC4KLQkJCSAqLwotCQkJZXJyID0gLUVCVVNZOwotCQkJZ290byBvdXQ7Ci0JCX0KLQl9Ci0KLQkvKiBzdWNjZXNzICovCi0JaXdsX3RlYXJkb3duX2ludGVyZmFjZShwcml2LCB2aWYsIHRydWUpOwotCXZpZi0+dHlwZSA9IG5ld3ZpZnR5cGU7Ci0JdmlmLT5wMnAgPSBuZXdwMnA7Ci0JZXJyID0gaXdsX3NldHVwX2ludGVyZmFjZShwcml2LCBjdHgpOwotCVdBUk5fT04oZXJyKTsKLQkvKgotCSAqIFdlJ3ZlIHN3aXRjaGVkIGludGVybmFsbHksIGJ1dCBzdWJtaXR0aW5nIHRvIHRoZQotCSAqIGRldmljZSBtYXkgaGF2ZSBmYWlsZWQgZm9yIHNvbWUgcmVhc29uLiBNYXNrIHRoaXMKLQkgKiBlcnJvciwgYmVjYXVzZSBvdGhlcndpc2UgbWFjODAyMTEgd2lsbCBub3Qgc3dpdGNoCi0JICogKGFuZCBzZXQgdGhlIGludGVyZmFjZSB0eXBlIGJhY2spIGFuZCB3ZSdsbCBiZQotCSAqIG91dCBvZiBzeW5jIHdpdGggaXQuCi0JICovCi0JZXJyID0gMDsKLQotIG91dDoKLQltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCXJldHVybiBlcnI7Ci19CiAKIGludCBpd2xfY21kX2VjaG9fdGVzdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgaXdsX2hvc3RfY21kIGNtZCA9IHsKIAkJLmlkID0gUkVQTFlfRUNITywKKwkJLmxlbiA9IHsgMCB9LAogCQkuZmxhZ3MgPSBDTURfU1lOQywKIAl9OwogCkBAIC0xNzgzLDcgKzE0NjEsNyBAQAogCWlmIChpd2xfaXNfcmZraWxsKHByaXYtPnNocmQpKQogCQlyZXR1cm47CiAKLQl0aW1lb3V0ID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dDsKKwl0aW1lb3V0ID0gY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dDsKIAlpZiAodGltZW91dCA9PSAwKQogCQlyZXR1cm47CiAKQEAgLTE4MDgsMTMgKzE0ODYsMjUgQEAKIAogdm9pZCBpd2xfc2V0dXBfd2F0Y2hkb2coc3RydWN0IGl3bF9wcml2ICpwcml2KQogewotCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+d2RfdGltZW91dDsKKwl1bnNpZ25lZCBpbnQgdGltZW91dCA9IGNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPndkX3RpbWVvdXQ7CiAKLQlpZiAodGltZW91dCAmJiAhaXdsYWduX21vZF9wYXJhbXMud2RfZGlzYWJsZSkKLQkJbW9kX3RpbWVyKCZwcml2LT53YXRjaGRvZywKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoSVdMX1dEX1RJQ0sodGltZW91dCkpKTsKLQllbHNlCi0JCWRlbF90aW1lcigmcHJpdi0+d2F0Y2hkb2cpOworCWlmICghaXdsYWduX21vZF9wYXJhbXMud2RfZGlzYWJsZSkgeworCQkvKiB1c2Ugc3lzdGVtIGRlZmF1bHQgKi8KKwkJaWYgKHRpbWVvdXQgJiYgIWNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPndkX2Rpc2FibGUpCisJCQltb2RfdGltZXIoJnByaXYtPndhdGNoZG9nLAorCQkJCWppZmZpZXMgKworCQkJCW1zZWNzX3RvX2ppZmZpZXMoSVdMX1dEX1RJQ0sodGltZW91dCkpKTsKKwkJZWxzZQorCQkJZGVsX3RpbWVyKCZwcml2LT53YXRjaGRvZyk7CisJfSBlbHNlIHsKKwkJLyogbW9kdWxlIHBhcmFtZXRlciBvdmVyd3JpdGUgZGVmYXVsdCBjb25maWd1cmF0aW9uICovCisJCWlmICh0aW1lb3V0ICYmIGl3bGFnbl9tb2RfcGFyYW1zLndkX2Rpc2FibGUgPT0gMikKKwkJCW1vZF90aW1lcigmcHJpdi0+d2F0Y2hkb2csCisJCQkJamlmZmllcyArCisJCQkJbXNlY3NfdG9famlmZmllcyhJV0xfV0RfVElDSyh0aW1lb3V0KSkpOworCQllbHNlCisJCQlkZWxfdGltZXIoJnByaXYtPndhdGNoZG9nKTsKKwl9CiB9CiAKIC8qKgpAQCAtMTg5MCwzNCArMTU4MCw2IEBACiAJcmV0dXJuIGNwdV90b19sZTMyKHJlcyk7CiB9CiAKLXZvaWQgaXdsX3N0YXJ0X3R4X2JhX3RyYW5zX3JlYWR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQkgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwKLQkJCQkgdTggc3RhX2lkLCB1OCB0aWQpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKLQl1OCAqYWRkciA9IHByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnN0YS5hZGRyOwotCi0JaWYgKGN0eCA9PSBOVU1fSVdMX1JYT05fQ1RYKQotCQljdHggPSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLmN0eGlkOwotCXZpZiA9IHByaXYtPmNvbnRleHRzW2N0eF0udmlmOwotCi0JaWVlZTgwMjExX3N0YXJ0X3R4X2JhX2NiX2lycXNhZmUodmlmLCBhZGRyLCB0aWQpOwotfQotCi12b2lkIGl3bF9zdG9wX3R4X2JhX3RyYW5zX3JlYWR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKLQkJCQllbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LAotCQkJCXU4IHN0YV9pZCwgdTggdGlkKQotewotCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7Ci0JdTggKmFkZHIgPSBwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEuYWRkcjsKLQotCWlmIChjdHggPT0gTlVNX0lXTF9SWE9OX0NUWCkKLQkJY3R4ID0gcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5jdHhpZDsKLQl2aWYgPSBwcml2LT5jb250ZXh0c1tjdHhdLnZpZjsKLQotCWllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUodmlmLCBhZGRyLCB0aWQpOwotfQotCiB2b2lkIGl3bF9zZXRfaHdfcmZraWxsX3N0YXRlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgYm9vbCBzdGF0ZSkKIHsKIAl3aXBoeV9yZmtpbGxfc2V0X2h3X3N0YXRlKHByaXYtPmh3LT53aXBoeSwgc3RhdGUpOwpAQCAtMTkyNSw4ICsxNTg3LDcgQEAKIAogdm9pZCBpd2xfbmljX2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JcHJpdi0+Y2ZnLT5saWItPm5pY19jb25maWcocHJpdik7Ci0KKwljZmcocHJpdiktPmxpYi0+bmljX2NvbmZpZyhwcml2KTsKIH0KIAogdm9pZCBpd2xfZnJlZV9za2Ioc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCmluZGV4IDEzN2RhMzMuLjdiZjc2YWI5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jb3JlLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtY29yZS5oCkBAIC0xMTMsNiArMTEzLDcgQEAKICAqIEBzaGFkb3dfcmVnX2VuYWJsZTogSFcgc2hhZGhvdyByZWdpc3RlciBiaXQKICAqIEBub19pZGxlX3N1cHBvcnQ6IGRvIG5vdCBzdXBwb3J0IGlkbGUgbW9kZQogICogQGhkX3YyOiB2MiBvZiBlbmhhbmNlZCBzZW5zaXRpdml0eSB2YWx1ZSwgdXNlZCBmb3IgMjAwMCBzZXJpZXMgYW5kIHVwCisgKiB3ZF9kaXNhYmxlOiBkaXNhYmxlIHdhdGNoZG9nIHRpbWVyCiAgKi8KIHN0cnVjdCBpd2xfYmFzZV9wYXJhbXMgewogCWludCBlZXByb21fc2l6ZTsKQEAgLTEzNCwxNCArMTM1LDEzIEBACiAJY29uc3QgYm9vbCBzaGFkb3dfcmVnX2VuYWJsZTsKIAljb25zdCBib29sIG5vX2lkbGVfc3VwcG9ydDsKIAljb25zdCBib29sIGhkX3YyOworCWNvbnN0IGJvb2wgd2RfZGlzYWJsZTsKIH07CiAvKgogICogQGFkdmFuY2VkX2J0X2NvZXhpc3Q6IHN1cHBvcnQgYWR2YW5jZWQgYnQgY29leGlzdAogICogQGJ0X2luaXRfdHJhZmZpY19sb2FkOiBzcGVjaWZ5IGluaXRpYWwgYnQgdHJhZmZpYyBsb2FkCiAgKiBAYnRfcHJpb19ib29zdDogZGVmYXVsdCBidCBwcmlvcml0eSBib29zdCB2YWx1ZQogICogQGFnZ190aW1lX2xpbWl0OiBtYXhpbXVtIG51bWJlciBvZiB1U2VjIGluIGFnZ3JlZ2F0aW9uCi0gKiBAYW1wZHVfZmFjdG9yOiBNYXhpbXVtIEEtTVBEVSBsZW5ndGggZmFjdG9yCi0gKiBAYW1wZHVfZGVuc2l0eTogTWluaW11bSBBLU1QRFUgc3BhY2luZwogICogQGJ0X3Njb19kaXNhYmxlOiB1Q29kZSBzaG91bGQgbm90IHJlc3BvbnNlIHRvIEJUIGluIFNDTy9FU0NPIG1vZGUKICAqLwogc3RydWN0IGl3bF9idF9wYXJhbXMgewpAQCAtMTQ5LDggKzE0OSw2IEBACiAJdTggYnRfaW5pdF90cmFmZmljX2xvYWQ7CiAJdTggYnRfcHJpb19ib29zdDsKIAl1MTYgYWdnX3RpbWVfbGltaXQ7Ci0JdTggYW1wZHVfZmFjdG9yOwotCXU4IGFtcGR1X2RlbnNpdHk7CiAJYm9vbCBidF9zY29fZGlzYWJsZTsKIAlib29sIGJ0X3Nlc3Npb25fMjsKIH07CkBAIC0xNjMsODQgKzE2MSwxMCBAQAogCWVudW0gaWVlZTgwMjExX3NtcHNfbW9kZSBzbXBzX21vZGU7CiB9OwogCi0vKioKLSAqIHN0cnVjdCBpd2xfY2ZnCi0gKiBAbmFtZTogT2ZmaWNhbCBuYW1lIG9mIHRoZSBkZXZpY2UKLSAqIEBmd19uYW1lX3ByZTogRmlybXdhcmUgZmlsZW5hbWUgcHJlZml4LiBUaGUgYXBpIHZlcnNpb24gYW5kIGV4dGVuc2lvbgotICoJKC51Y29kZSkgd2lsbCBiZSBhZGRlZCB0byBmaWxlbmFtZSBiZWZvcmUgbG9hZGluZyBmcm9tIGRpc2suIFRoZQotICoJZmlsZW5hbWUgaXMgY29uc3RydWN0ZWQgYXMgZndfbmFtZV9wcmU8YXBpPi51Y29kZS4KLSAqIEB1Y29kZV9hcGlfbWF4OiBIaWdoZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCi0gKiBAdWNvZGVfYXBpX29rOiBvbGRlc3QgdmVyc2lvbiBvZiB0aGUgdUNvZGUgQVBJIHRoYXQgaXMgT0sgdG8gbG9hZAotICoJd2l0aG91dCBhIHdhcm5pbmcsIGZvciB1c2UgaW4gdHJhbnNpdGlvbnMKLSAqIEB1Y29kZV9hcGlfbWluOiBMb3dlc3QgdmVyc2lvbiBvZiB1Q29kZSBBUEkgc3VwcG9ydGVkIGJ5IGRyaXZlci4KLSAqIEB2YWxpZF90eF9hbnQ6IHZhbGlkIHRyYW5zbWl0IGFudGVubmEKLSAqIEB2YWxpZF9yeF9hbnQ6IHZhbGlkIHJlY2VpdmUgYW50ZW5uYQotICogQHNrdTogc2t1IGluZm9ybWF0aW9uIGZyb20gRUVQUk9NCi0gKiBAZWVwcm9tX3ZlcjogRUVQUk9NIHZlcnNpb24KLSAqIEBlZXByb21fY2FsaWJfdmVyOiBFRVBST00gY2FsaWJyYXRpb24gdmVyc2lvbgotICogQGxpYjogcG9pbnRlciB0byB0aGUgbGliIG9wcwotICogQGFkZGl0aW9uYWxfbmljX2NvbmZpZzogYWRkaXRpb25hbCBuaWMgY29uZmlndXJhdGlvbgotICogQGJhc2VfcGFyYW1zOiBwb2ludGVyIHRvIGJhc2ljIHBhcmFtZXRlcnMKLSAqIEBodF9wYXJhbXM6IHBvaW50IHRvIGh0IHBhdGFtZXRlcnMKLSAqIEBidF9wYXJhbXM6IHBvaW50ZXIgdG8gYnQgcGFyYW1ldGVycwotICogQHBhX3R5cGU6IHVzZWQgYnkgNjAwMCBzZXJpZXMgb25seSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBQb3dlciBBbXBsaWZpZXIKLSAqIEBuZWVkX2RjX2NhbGliOiBuZWVkIHRvIHBlcmZvcm0gaW5pdCBkYyBjYWxpYnJhdGlvbgotICogQG5lZWRfdGVtcF9vZmZzZXRfY2FsaWI6IG5lZWQgdG8gcGVyZm9ybSB0ZW1wZXJhdHVyZSBvZmZzZXQgY2FsaWJyYXRpb24KLSAqIEBzY2FuX2FudGVubmFzOiBhdmFpbGFibGUgYW50ZW5uYSBmb3Igc2NhbiBvcGVyYXRpb24KLSAqIEBsZWRfbW9kZTogMD1ibGlua2luZywgMT1PbihSRiBPbikvT2ZmKFJGIE9mZikKLSAqIEBhZHZfcG06IGFkdmFuY2UgcG93ZXIgbWFuYWdlbWVudAotICogQHJ4X3dpdGhfc2lzb19kaXZlcnNpdHk6IDF4MSBkZXZpY2Ugd2l0aCByeCBhbnRlbm5hIGRpdmVyc2l0eQotICogQGludGVybmFsX3dpbWF4X2NvZXg6IGludGVybmFsIHdpZmkvd2ltYXggY29tYm8gZGV2aWNlCi0gKiBAaXFfaW52ZXJ0OiBJL1EgaW52ZXJzaW9uCi0gKiBAdGVtcF9vZmZzZXRfdjI6IHN1cHBvcnQgdjIgb2YgdGVtcGVyYXR1cmUgb2Zmc2V0IGNhbGlicmF0aW9uCi0gKgotICogV2UgZW5hYmxlIHRoZSBkcml2ZXIgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3cnQgQVBJIHZlcnNpb24uIFRoZQotICogZHJpdmVyIHNwZWNpZmllcyB3aGljaCBBUElzIGl0IHN1cHBvcnRzICh3aXRoIEB1Y29kZV9hcGlfbWF4IGJlaW5nIHRoZQotICogaGlnaGVzdCBhbmQgQHVjb2RlX2FwaV9taW4gdGhlIGxvd2VzdCkuIEZpcm13YXJlIHdpbGwgb25seSBiZSBsb2FkZWQgaWYKLSAqIGl0IGhhcyBhIHN1cHBvcnRlZCBBUEkgdmVyc2lvbi4KLSAqCi0gKiBUaGUgaWRlYWwgdXNhZ2Ugb2YgdGhpcyBpbmZyYXN0cnVjdHVyZSBpcyB0byB0cmVhdCBhIG5ldyB1Y29kZSBBUEkKLSAqIHJlbGVhc2UgYXMgYSBuZXcgaGFyZHdhcmUgcmV2aXNpb24uCi0gKi8KLXN0cnVjdCBpd2xfY2ZnIHsKLQkvKiBwYXJhbXMgc3BlY2lmaWMgdG8gYW4gaW5kaXZpZHVhbCBkZXZpY2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JY29uc3QgY2hhciAqZndfbmFtZV9wcmU7Ci0JY29uc3QgdW5zaWduZWQgaW50IHVjb2RlX2FwaV9tYXg7Ci0JY29uc3QgdW5zaWduZWQgaW50IHVjb2RlX2FwaV9vazsKLQljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21pbjsKLQl1OCAgIHZhbGlkX3R4X2FudDsKLQl1OCAgIHZhbGlkX3J4X2FudDsKLQl1MTYgIHNrdTsKLQl1MTYgIGVlcHJvbV92ZXI7Ci0JdTE2ICBlZXByb21fY2FsaWJfdmVyOwotCWNvbnN0IHN0cnVjdCBpd2xfbGliX29wcyAqbGliOwotCXZvaWQgKCphZGRpdGlvbmFsX25pY19jb25maWcpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci0JLyogcGFyYW1zIG5vdCBsaWtlbHkgdG8gY2hhbmdlIHdpdGhpbiBhIGRldmljZSBmYW1pbHkgKi8KLQlzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zICpiYXNlX3BhcmFtczsKLQkvKiBwYXJhbXMgbGlrZWx5IHRvIGNoYW5nZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCi0Jc3RydWN0IGl3bF9odF9wYXJhbXMgKmh0X3BhcmFtczsKLQlzdHJ1Y3QgaXdsX2J0X3BhcmFtcyAqYnRfcGFyYW1zOwotCWVudW0gaXdsX3BhX3R5cGUgcGFfdHlwZTsJICAvKiBpZiB1c2VkIHNldCB0byBJV0xfUEFfU1lTVEVNICovCi0JY29uc3QgYm9vbCBuZWVkX2RjX2NhbGliOwkgIC8qIGlmIHVzZWQgc2V0IHRvIHRydWUgKi8KLQljb25zdCBib29sIG5lZWRfdGVtcF9vZmZzZXRfY2FsaWI7IC8qIGlmIHVzZWQgc2V0IHRvIHRydWUgKi8KLQl1OCBzY2FuX3J4X2FudGVubmFzW0lFRUU4MDIxMV9OVU1fQkFORFNdOwotCWVudW0gaXdsX2xlZF9tb2RlIGxlZF9tb2RlOwotCWNvbnN0IGJvb2wgYWR2X3BtOwotCWNvbnN0IGJvb2wgcnhfd2l0aF9zaXNvX2RpdmVyc2l0eTsKLQljb25zdCBib29sIGludGVybmFsX3dpbWF4X2NvZXg7Ci0JY29uc3QgYm9vbCBpcV9pbnZlcnQ7Ci0JY29uc3QgYm9vbCB0ZW1wX29mZnNldF92MjsKLX07Ci0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgTCBpIGIgICAgICAgICAgICAgICAgICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLWludCBpd2xhZ25fbWFjX2NvbmZfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1MTYgcXVldWUsCi0JCSAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKTsKLWludCBpd2xhZ25fbWFjX3R4X2xhc3RfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKIHZvaWQgaXdsX3NldF9yeG9uX2h3Y3J5cHRvKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCwKIAkJCSAgIGludCBod19kZWNyeXB0KTsKIGludCBpd2xfY2hlY2tfcnhvbl9jbWQoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KTsKQEAgLTI2MCwxMyArMTg0LDYgQEAKIHZvaWQgaXdsX2Nvbm5lY3Rpb25faW5pdF9yeF9jb25maWcoc3RydWN0IGl3bF9wcml2ICpwcml2LAogCQkJCSAgIHN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHgpOwogdm9pZCBpd2xfc2V0X3JhdGUoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWludCBpd2xhZ25fbWFjX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOwotdm9pZCBpd2xhZ25fbWFjX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKLWludCBpd2xhZ25fbWFjX2NoYW5nZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCQkgICAgIGVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dHlwZSwgYm9vbCBuZXdwMnApOwogaW50IGl3bF9jbWRfZWNob190ZXN0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUdGUwogaW50IGl3bF9hbGxvY190cmFmZmljX21lbShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwpAQCAtMzIzLDkgKzI0MCw2IEBACiBpbnQgaXdsX3NjYW5fY2FuY2VsKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdW5zaWduZWQgbG9uZyBtcyk7CiB2b2lkIGl3bF9mb3JjZV9zY2FuX2VuZChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwotaW50IGl3bGFnbl9tYWNfaHdfc2NhbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKLQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCi0JCSAgICBzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEpOwogdm9pZCBpd2xfaW50ZXJuYWxfc2hvcnRfaHdfc2NhbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogaW50IGl3bF9mb3JjZV9yZXNldChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGludCBtb2RlLCBib29sIGV4dGVybmFsKTsKIHUxNiBpd2xfZmlsbF9wcm9iZV9yZXEoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKmZyYW1lLApAQCAtMzc5LDggKzI5Myw4IEBACiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBpd2xfYWR2YW5jZWRfYnRfY29leGlzdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7Ci0JcmV0dXJuIHByaXYtPmNmZy0+YnRfcGFyYW1zICYmCi0JICAgICAgIHByaXYtPmNmZy0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0OworCXJldHVybiBjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCSAgICAgICBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdDsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGl3bF9lbmFibGVfcmZraWxsX2ludChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1jc3IuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNzci5oCmluZGV4IGI5ZjMyNjcuLmZiYzMwOTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNzci5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWNzci5oCkBAIC0yODQsOCArMjg0LDggQEAKICNkZWZpbmUgQ1NSX0hXX1JFVl9UWVBFXzZ4MzUJICAgICAgIENTUl9IV19SRVZfVFlQRV82eDA1CiAjZGVmaW5lIENTUl9IV19SRVZfVFlQRV8yeDMwCSAgICAgICAoMHgwMDAwMEMwKQogI2RlZmluZSBDU1JfSFdfUkVWX1RZUEVfMngwMAkgICAgICAgKDB4MDAwMDEwMCkKLSNkZWZpbmUgQ1NSX0hXX1JFVl9UWVBFXzIwMAkgICAgICAgKDB4MDAwMDExMCkKLSNkZWZpbmUgQ1NSX0hXX1JFVl9UWVBFXzIzMAkgICAgICAgKDB4MDAwMDEyMCkKKyNkZWZpbmUgQ1NSX0hXX1JFVl9UWVBFXzEwNQkgICAgICAgKDB4MDAwMDExMCkKKyNkZWZpbmUgQ1NSX0hXX1JFVl9UWVBFXzEzNQkgICAgICAgKDB4MDAwMDEyMCkKICNkZWZpbmUgQ1NSX0hXX1JFVl9UWVBFX05PTkUgICAgICAgICAgICgweDAwMDAxRjApCiAKIC8qIEVFUFJPTSBSRUcgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Zy5oCmluZGV4IDY5YTc3ZTIuLmY4ZmMyMzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWcuaApAQCAtNDcsMjAgKzQ3LDIxIEBACiB9IHdoaWxlICgwKQogCiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKLSNkZWZpbmUgSVdMX0RFQlVHKG0sIGxldmVsLCBmbXQsIGFyZ3MuLi4pCQkJCVwKKyNkZWZpbmUgSVdMX0RFQlVHKG0sIGxldmVsLCBmbXQsIC4uLikJCQkJCVwKIGRvIHsJCQkJCQkJCQlcCiAJaWYgKGl3bF9nZXRfZGVidWdfbGV2ZWwoKG0pLT5zaHJkKSAmIChsZXZlbCkpCQkJXAotCQlkZXZfcHJpbnRrKEtFUk5fRVJSLCBidXMobSktPmRldiwJCQlcCi0JCQkgIiVjICVzICIgZm10LCBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywJXAotCQkJX19mdW5jX18gLCAjIyBhcmdzKTsJCQkJXAorCQlkZXZfZXJyKGJ1cyhtKS0+ZGV2LCAiJWMgJXMgIiBmbXQsCQkJXAorCQkJaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fZnVuY19fLAkJXAorCQkJIyNfX1ZBX0FSR1NfXyk7CQkJCQlcCiB9IHdoaWxlICgwKQogCi0jZGVmaW5lIElXTF9ERUJVR19MSU1JVChtLCBsZXZlbCwgZm10LCBhcmdzLi4uKQkJCQlcCisjZGVmaW5lIElXTF9ERUJVR19MSU1JVChtLCBsZXZlbCwgZm10LCAuLi4pCQkJCVwKIGRvIHsJCQkJCQkJCQlcCi0JaWYgKGl3bF9nZXRfZGVidWdfbGV2ZWwoKG0pLT5zaHJkKSAmIChsZXZlbCkgJiYgbmV0X3JhdGVsaW1pdCgpKVwKLQkJZGV2X3ByaW50ayhLRVJOX0VSUiwgYnVzKG0pLT5kZXYsCQkJXAotCQkJIiVjICVzICIgZm10LCBpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywJXAotCQkJIF9fZnVuY19fICwgIyMgYXJncyk7CQkJCVwKKwlpZiAoaXdsX2dldF9kZWJ1Z19sZXZlbCgobSktPnNocmQpICYgKGxldmVsKSAmJgkJCVwKKwkgICAgbmV0X3JhdGVsaW1pdCgpKQkJCQkJCVwKKwkJZGV2X2VycihidXMobSktPmRldiwgIiVjICVzICIgZm10LAkJCVwKKwkJCWluX2ludGVycnVwdCgpID8gJ0knIDogJ1UnLCBfX2Z1bmNfXywJCVwKKwkJCSMjX19WQV9BUkdTX18pOwkJCQkJXAogfSB3aGlsZSAoMCkKIAogI2RlZmluZSBpd2xfcHJpbnRfaGV4X2R1bXAobSwgbGV2ZWwsIHAsIGxlbikJCQkJXApAQCAtNzAsMTAgKzcxLDI5IEBACiAJCQkgICAgICAgRFVNUF9QUkVGSVhfT0ZGU0VULCAxNiwgMSwgcCwgbGVuLCAxKTsJXAogfSB3aGlsZSAoMCkKIAorI2RlZmluZSBJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHAsIGZtdCwgLi4uKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCWlmICghaXdsX2lzX3Jma2lsbChwLT5zaHJkKSkJCQkJCVwKKwkJZGV2X2VycihidXMocCktPmRldiwgIiVzJWMgJXMgIiBmbXQsCQkJXAorCQkJIiIsCQkJCQkJXAorCQkJaW5faW50ZXJydXB0KCkgPyAnSScgOiAnVScsIF9fZnVuY19fLAkJXAorCQkJIyNfX1ZBX0FSR1NfXyk7CQkJCQlcCisJZWxzZSBpZgkoaXdsX2dldF9kZWJ1Z19sZXZlbChwLT5zaHJkKSAmIElXTF9ETF9SQURJTykJCVwKKwkJZGV2X2VycihidXMocCktPmRldiwgIiVzJWMgJXMgIiBmbXQsCQkJXAorCQkJIihSRktJTEwpICIsCQkJCQlcCisJCQlpbl9pbnRlcnJ1cHQoKSA/ICdJJyA6ICdVJywgX19mdW5jX18sCQlcCisJCQkjI19fVkFfQVJHU19fKTsJCQkJCVwKK30gd2hpbGUgKDApCisKICNlbHNlCiAjZGVmaW5lIElXTF9ERUJVRyhtLCBsZXZlbCwgZm10LCBhcmdzLi4uKQogI2RlZmluZSBJV0xfREVCVUdfTElNSVQobSwgbGV2ZWwsIGZtdCwgYXJncy4uLikKICNkZWZpbmUgaXdsX3ByaW50X2hleF9kdW1wKG0sIGxldmVsLCBwLCBsZW4pCisjZGVmaW5lIElXTF9ERUJVR19RVUlFVF9SRktJTEwocCwgZm10LCBhcmdzLi4uKQlcCitkbyB7CQkJCQkJCVwKKwlpZiAoIWl3bF9pc19yZmtpbGwocC0+c2hyZCkpCQkJXAorCQlJV0xfRVJSKHAsIGZtdCwgIyNhcmdzKTsJCVwKK30gd2hpbGUgKDApCiAjZW5kaWYJCQkJLyogQ09ORklHX0lXTFdJRklfREVCVUcgKi8KIAogI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFQlVHRlMKQEAgLTExNCw0OCArMTM0LDQzIEBACiAgKi8KIAogLyogMHgwMDAwMDAwRiAtIDB4MDAwMDAwMDEgKi8KLSNkZWZpbmUgSVdMX0RMX0lORk8JCSgxIDw8IDApCi0jZGVmaW5lIElXTF9ETF9NQUM4MDIxMQkJKDEgPDwgMSkKLSNkZWZpbmUgSVdMX0RMX0hDTUQJCSgxIDw8IDIpCi0jZGVmaW5lIElXTF9ETF9TVEFURQkJKDEgPDwgMykKKyNkZWZpbmUgSVdMX0RMX0lORk8JCTB4MDAwMDAwMDEKKyNkZWZpbmUgSVdMX0RMX01BQzgwMjExCQkweDAwMDAwMDAyCisjZGVmaW5lIElXTF9ETF9IQ01ECQkweDAwMDAwMDA0CisjZGVmaW5lIElXTF9ETF9TVEFURQkJMHgwMDAwMDAwOAogLyogMHgwMDAwMDBGMCAtIDB4MDAwMDAwMTAgKi8KLSNkZWZpbmUgSVdMX0RMX01BQ0RVTVAJCSgxIDw8IDQpCi0jZGVmaW5lIElXTF9ETF9IQ01EX0RVTVAJKDEgPDwgNSkKLSNkZWZpbmUgSVdMX0RMX0VFUFJPTQkJKDEgPDwgNikKLSNkZWZpbmUgSVdMX0RMX1JBRElPCQkoMSA8PCA3KQorI2RlZmluZSBJV0xfRExfRUVQUk9NCQkweDAwMDAwMDQwCisjZGVmaW5lIElXTF9ETF9SQURJTwkJMHgwMDAwMDA4MAogLyogMHgwMDAwMEYwMCAtIDB4MDAwMDAxMDAgKi8KLSNkZWZpbmUgSVdMX0RMX1BPV0VSCQkoMSA8PCA4KQotI2RlZmluZSBJV0xfRExfVEVNUAkJKDEgPDwgOSkKLS8qIHJlc2VydmVkICgxIDw8IDEwKSAqLwotI2RlZmluZSBJV0xfRExfU0NBTgkJKDEgPDwgMTEpCisjZGVmaW5lIElXTF9ETF9QT1dFUgkJMHgwMDAwMDEwMAorI2RlZmluZSBJV0xfRExfVEVNUAkJMHgwMDAwMDIwMAorI2RlZmluZSBJV0xfRExfU0NBTgkJMHgwMDAwMDgwMAogLyogMHgwMDAwRjAwMCAtIDB4MDAwMDEwMDAgKi8KLSNkZWZpbmUgSVdMX0RMX0FTU09DCQkoMSA8PCAxMikKLSNkZWZpbmUgSVdMX0RMX0RST1AJCSgxIDw8IDEzKQotLyogcmVzZXJ2ZWQgKDEgPDwgMTQpICovCi0jZGVmaW5lIElXTF9ETF9DT0VYCQkoMSA8PCAxNSkKKyNkZWZpbmUgSVdMX0RMX0FTU09DCQkweDAwMDAxMDAwCisjZGVmaW5lIElXTF9ETF9EUk9QCQkweDAwMDAyMDAwCisjZGVmaW5lIElXTF9ETF9DT0VYCQkweDAwMDA4MDAwCiAvKiAweDAwMEYwMDAwIC0gMHgwMDAxMDAwMCAqLwotI2RlZmluZSBJV0xfRExfRlcJCSgxIDw8IDE2KQotI2RlZmluZSBJV0xfRExfUkZfS0lMTAkJKDEgPDwgMTcpCi0jZGVmaW5lIElXTF9ETF9GV19FUlJPUlMJKDEgPDwgMTgpCi0jZGVmaW5lIElXTF9ETF9MRUQJCSgxIDw8IDE5KQorI2RlZmluZSBJV0xfRExfRlcJCTB4MDAwMTAwMDAKKyNkZWZpbmUgSVdMX0RMX1JGX0tJTEwJCTB4MDAwMjAwMDAKKyNkZWZpbmUgSVdMX0RMX0ZXX0VSUk9SUwkweDAwMDQwMDAwCisjZGVmaW5lIElXTF9ETF9MRUQJCTB4MDAwODAwMDAKIC8qIDB4MDBGMDAwMDAgLSAweDAwMTAwMDAwICovCi0jZGVmaW5lIElXTF9ETF9SQVRFCQkoMSA8PCAyMCkKLSNkZWZpbmUgSVdMX0RMX0NBTElCCQkoMSA8PCAyMSkKLSNkZWZpbmUgSVdMX0RMX1dFUAkJKDEgPDwgMjIpCi0jZGVmaW5lIElXTF9ETF9UWAkJKDEgPDwgMjMpCisjZGVmaW5lIElXTF9ETF9SQVRFCQkweDAwMTAwMDAwCisjZGVmaW5lIElXTF9ETF9DQUxJQgkJMHgwMDIwMDAwMAorI2RlZmluZSBJV0xfRExfV0VQCQkweDAwNDAwMDAwCisjZGVmaW5lIElXTF9ETF9UWAkJMHgwMDgwMDAwMAogLyogMHgwRjAwMDAwMCAtIDB4MDEwMDAwMDAgKi8KLSNkZWZpbmUgSVdMX0RMX1JYCQkoMSA8PCAyNCkKLSNkZWZpbmUgSVdMX0RMX0lTUgkJKDEgPDwgMjUpCi0jZGVmaW5lIElXTF9ETF9IVAkJKDEgPDwgMjYpCisjZGVmaW5lIElXTF9ETF9SWAkJMHgwMTAwMDAwMAorI2RlZmluZSBJV0xfRExfSVNSCQkweDAyMDAwMDAwCisjZGVmaW5lIElXTF9ETF9IVAkJMHgwNDAwMDAwMAogLyogMHhGMDAwMDAwMCAtIDB4MTAwMDAwMDAgKi8KLSNkZWZpbmUgSVdMX0RMXzExSAkJKDEgPDwgMjgpCi0jZGVmaW5lIElXTF9ETF9TVEFUUwkJKDEgPDwgMjkpCi0jZGVmaW5lIElXTF9ETF9UWF9SRVBMWQkJKDEgPDwgMzApCi0jZGVmaW5lIElXTF9ETF9RT1MJCSgxIDw8IDMxKQorI2RlZmluZSBJV0xfRExfMTFICQkweDEwMDAwMDAwCisjZGVmaW5lIElXTF9ETF9TVEFUUwkJMHgyMDAwMDAwMAorI2RlZmluZSBJV0xfRExfVFhfUkVQTFkJCTB4NDAwMDAwMDAKKyNkZWZpbmUgSVdMX0RMX1RYX1FVRVVFUwkweDgwMDAwMDAwCiAKICNkZWZpbmUgSVdMX0RFQlVHX0lORk8ocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9JTkZPLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfTUFDODAyMTEocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9NQUM4MDIxMSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX01BQ0RVTVAocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9NQUNEVU1QLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfVEVNUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1RFTVAsIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19TQ0FOKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfU0NBTiwgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX1JYKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfUlgsIGYsICMjIGEpCkBAIC0xNjQsNyArMTc5LDYgQEAKICNkZWZpbmUgSVdMX0RFQlVHX0xFRChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0xFRCwgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX1dFUChwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1dFUCwgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX0hDKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfSENNRCwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX0hDX0RVTVAocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9IQ01EX0RVTVAsIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19FRVBST00ocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9FRVBST00sIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19DQUxJQihwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX0NBTElCLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfRlcocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9GVywgZiwgIyMgYSkKQEAgLTE4Niw5ICsyMDAsNyBAQAogI2RlZmluZSBJV0xfREVCVUdfU1RBVFNfTElNSVQocCwgZiwgYS4uLikJXAogCQlJV0xfREVCVUdfTElNSVQocCwgSVdMX0RMX1NUQVRTLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfVFhfUkVQTFkocCwgZiwgYS4uLikJSVdMX0RFQlVHKHAsIElXTF9ETF9UWF9SRVBMWSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1RYX1JFUExZX0xJTUlUKHAsIGYsIGEuLi4pIFwKLQkJSVdMX0RFQlVHX0xJTUlUKHAsIElXTF9ETF9UWF9SRVBMWSwgZiwgIyMgYSkKLSNkZWZpbmUgSVdMX0RFQlVHX1FPUyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1FPUywgZiwgIyMgYSkKKyNkZWZpbmUgSVdMX0RFQlVHX1RYX1FVRVVFUyhwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1RYX1FVRVVFUywgZiwgIyMgYSkKICNkZWZpbmUgSVdMX0RFQlVHX1JBRElPKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfUkFESU8sIGYsICMjIGEpCiAjZGVmaW5lIElXTF9ERUJVR19QT1dFUihwLCBmLCBhLi4uKQlJV0xfREVCVUcocCwgSVdMX0RMX1BPV0VSLCBmLCAjIyBhKQogI2RlZmluZSBJV0xfREVCVUdfMTFIKHAsIGYsIGEuLi4pCUlXTF9ERUJVRyhwLCBJV0xfRExfMTFILCBmLCAjIyBhKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWdmcy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGVidWdmcy5jCmluZGV4IGExNjcwZTMuLjA0YTMzNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRlYnVnZnMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZWJ1Z2ZzLmMKQEAgLTIzNCwxMSArMjM0LDEyIEBACiAKIAkvKiBkZWZhdWx0IGlzIHRvIGR1bXAgdGhlIGVudGlyZSBkYXRhIHNlZ21lbnQgKi8KIAlpZiAoIXByaXYtPmRiZ2ZzX3NyYW1fb2Zmc2V0ICYmICFwcml2LT5kYmdmc19zcmFtX2xlbikgeworCQlzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyA9IHRyYW5zKHByaXYpOwogCQlwcml2LT5kYmdmc19zcmFtX29mZnNldCA9IDB4ODAwMDAwOwotCQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkKLQkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuID0gcHJpdi0+dWNvZGVfaW5pdC5kYXRhLmxlbjsKKwkJaWYgKHRyYW5zLT5zaHJkLT51Y29kZV90eXBlID09IElXTF9VQ09ERV9JTklUKQorCQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4gPSB0cmFucy0+dWNvZGVfaW5pdC5kYXRhLmxlbjsKIAkJZWxzZQotCQkJcHJpdi0+ZGJnZnNfc3JhbV9sZW4gPSBwcml2LT51Y29kZV9ydC5kYXRhLmxlbjsKKwkJCXByaXYtPmRiZ2ZzX3NyYW1fbGVuID0gdHJhbnMtPnVjb2RlX3J0LmRhdGEubGVuOwogCX0KIAlsZW4gPSBwcml2LT5kYmdmc19zcmFtX2xlbjsKIApAQCAtMzQxLDcgKzM0Miw3IEBACiAKIAlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLAogCQkJCSAgICAgICBwcml2LT53b3dsYW5fc3JhbSwKLQkJCQkgICAgICAgcHJpdi0+dWNvZGVfd293bGFuLmRhdGEubGVuKTsKKwkJCQkgICAgICAgdHJhbnMocHJpdiktPnVjb2RlX3dvd2xhbi5kYXRhLmxlbik7CiB9CiBzdGF0aWMgc3NpemVfdCBpd2xfZGJnZnNfc3RhdGlvbnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAogCQkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKQEAgLTM3MSwxNSArMzcyLDEzIEBACiAJCQkJIGksIHN0YXRpb24tPnN0YS5zdGEuYWRkciwKIAkJCQkgc3RhdGlvbi0+c3RhLnN0YXRpb25fZmxhZ3NfbXNrKTsKIAkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSJUSURcdHNlcV9udW1cdHR4cV9pZFx0dGZkc1x0cmF0ZV9uX2ZsYWdzXG4iKTsKKwkJCQkiVElEXHRzZXFfbnVtXHRyYXRlX25fZmxhZ3NcbiIpOwogCiAJCWZvciAoaiA9IDA7IGogPCBJV0xfTUFYX1RJRF9DT1VOVDsgaisrKSB7Ci0JCQl0aWRfZGF0YSA9ICZwcml2LT5zaHJkLT50aWRfZGF0YVtpXVtqXTsKKwkJCXRpZF9kYXRhID0gJnByaXYtPnRpZF9kYXRhW2ldW2pdOwogCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAotCQkJCSIlZDpcdCUjeFx0JSN4XHQldVx0JSN4IiwKKwkJCQkiJWQ6XHQlI3hcdCUjeCIsCiAJCQkJaiwgdGlkX2RhdGEtPnNlcV9udW1iZXIsCi0JCQkJdGlkX2RhdGEtPmFnZy50eHFfaWQsCi0JCQkJdGlkX2RhdGEtPnRmZHNfaW5fcXVldWUsCiAJCQkJdGlkX2RhdGEtPmFnZy5yYXRlX25fZmxhZ3MpOwogCiAJCQlpZiAodGlkX2RhdGEtPmFnZy53YWl0X2Zvcl9iYSkKQEAgLTQwNyw3ICs0MDYsNyBAQAogCWNvbnN0IHU4ICpwdHI7CiAJY2hhciAqYnVmOwogCXUxNiBlZXByb21fdmVyOwotCXNpemVfdCBlZXByb21fbGVuID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemU7CisJc2l6ZV90IGVlcHJvbV9sZW4gPSBjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZTsKIAlidWZfc2l6ZSA9IDQgKiBlZXByb21fbGVuICsgMjU2OwogCiAJaWYgKGVlcHJvbV9sZW4gJSAxNikgewpAQCAtNDE1LDcgKzQxNCw3IEBACiAJCXJldHVybiAtRU5PREFUQTsKIAl9CiAKLQlwdHIgPSBwcml2LT5lZXByb207CisJcHRyID0gcHJpdi0+c2hyZC0+ZWVwcm9tOwogCWlmICghcHRyKSB7CiAJCUlXTF9FUlIocHJpdiwgIkludmFsaWQgRUVQUk9NL09UUCBtZW1vcnlcbiIpOwogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTQyNywxMCArNDI2LDEwIEBACiAJCUlXTF9FUlIocHJpdiwgIkNhbiBub3QgYWxsb2NhdGUgQnVmZmVyXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQotCWVlcHJvbV92ZXIgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1ZFUlNJT04pOworCWVlcHJvbV92ZXIgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdi0+c2hyZCwgRUVQUk9NX1ZFUlNJT04pOwogCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZfc2l6ZSAtIHBvcywgIk5WTSBUeXBlOiAlcywgIgogCQkJInZlcnNpb246IDB4JXhcbiIsCi0JCQkocHJpdi0+bnZtX2RldmljZV90eXBlID09IE5WTV9ERVZJQ0VfVFlQRV9PVFApCisJCQkodHJhbnMocHJpdiktPm52bV9kZXZpY2VfdHlwZSA9PSBOVk1fREVWSUNFX1RZUEVfT1RQKQogCQkJID8gIk9UUCIgOiAiRUVQUk9NIiwgZWVwcm9tX3Zlcik7CiAJZm9yIChvZnMgPSAwIDsgb2ZzIDwgZWVwcm9tX2xlbiA7IG9mcyArPSAxNikgewogCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmX3NpemUgLSBwb3MsICIweCUuNHggIiwgb2ZzKTsKQEAgLTE1NDEsMTUgKzE1NDAsMTUgQEAKIAlpZiAodHgtPnR4X3Bvd2VyLmFudF9hIHx8IHR4LT50eF9wb3dlci5hbnRfYiB8fCB0eC0+dHhfcG93ZXIuYW50X2MpIHsKIAkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAogCQkJInR4IHBvd2VyOiAoMS8yIGRCIHN0ZXApXG4iKTsKLQkJaWYgKChwcml2LT5jZmctPnZhbGlkX3R4X2FudCAmIEFOVF9BKSAmJiB0eC0+dHhfcG93ZXIuYW50X2EpCisJCWlmICgoY2ZnKHByaXYpLT52YWxpZF90eF9hbnQgJiBBTlRfQSkgJiYgdHgtPnR4X3Bvd2VyLmFudF9hKQogCQkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAogCQkJCQlmbXRfaGV4LCAiYW50ZW5uYSBBOiIsCiAJCQkJCXR4LT50eF9wb3dlci5hbnRfYSk7Ci0JCWlmICgocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQgJiBBTlRfQikgJiYgdHgtPnR4X3Bvd2VyLmFudF9iKQorCQlpZiAoKGNmZyhwcml2KS0+dmFsaWRfdHhfYW50ICYgQU5UX0IpICYmIHR4LT50eF9wb3dlci5hbnRfYikKIAkJCXBvcyArPSBzY25wcmludGYoYnVmICsgcG9zLCBidWZzeiAtIHBvcywKIAkJCQkJZm10X2hleCwgImFudGVubmEgQjoiLAogCQkJCQl0eC0+dHhfcG93ZXIuYW50X2IpOwotCQlpZiAoKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50ICYgQU5UX0MpICYmIHR4LT50eF9wb3dlci5hbnRfYykKKwkJaWYgKChjZmcocHJpdiktPnZhbGlkX3R4X2FudCAmIEFOVF9DKSAmJiB0eC0+dHhfcG93ZXIuYW50X2MpCiAJCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsCiAJCQkJCWZtdF9oZXgsICJhbnRlbm5hIEM6IiwKIAkJCQkJdHgtPnR4X3Bvd2VyLmFudF9jKTsKQEAgLTIyMjAsNyArMjIxOSw3IEBACiAJY29uc3Qgc2l6ZV90IGJ1ZnN6ID0gc2l6ZW9mKGJ1Zik7CiAKIAlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICIldVxuIiwKLQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsY3BfZGVsdGFfdGhyZXNob2xkKTsKKwkJCWNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPnBsY3BfZGVsdGFfdGhyZXNob2xkKTsKIAogCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsIGJ1ZiwgcG9zKTsKIH0KQEAgLTIyNDIsMTAgKzIyNDEsMTAgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKChwbGNwIDwgSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfTUlOKSB8fAogCQkocGxjcCA+IElXTF9NQVhfUExDUF9FUlJfVEhSRVNIT0xEX01BWCkpCi0JCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsY3BfZGVsdGFfdGhyZXNob2xkID0KKwkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+cGxjcF9kZWx0YV90aHJlc2hvbGQgPQogCQkJSVdMX01BWF9QTENQX0VSUl9USFJFU0hPTERfRElTQUJMRTsKIAllbHNlCi0JCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPnBsY3BfZGVsdGFfdGhyZXNob2xkID0gcGxjcDsKKwkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+cGxjcF9kZWx0YV90aHJlc2hvbGQgPSBwbGNwOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMjM0Nyw3ICsyMzQ2LDcgQEAKIAlpZiAodGltZW91dCA8IDAgfHwgdGltZW91dCA+IElXTF9NQVhfV0RfVElNRU9VVCkKIAkJdGltZW91dCA9IElXTF9ERUZfV0RfVElNRU9VVDsKIAotCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPndkX3RpbWVvdXQgPSB0aW1lb3V0OworCWNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPndkX3RpbWVvdXQgPSB0aW1lb3V0OwogCWl3bF9zZXR1cF93YXRjaGRvZyhwcml2KTsKIAlyZXR1cm4gY291bnQ7CiB9CkBAIC0yNDA3LDEwICsyNDA2LDEwIEBACiAJY2hhciBidWZbNDBdOwogCWNvbnN0IHNpemVfdCBidWZzeiA9IHNpemVvZihidWYpOwogCi0JaWYgKHByaXYtPmNmZy0+aHRfcGFyYW1zKQorCWlmIChjZmcocHJpdiktPmh0X3BhcmFtcykKIAkJcG9zICs9IHNjbnByaW50ZihidWYgKyBwb3MsIGJ1ZnN6IC0gcG9zLAogCQkJICJ1c2UgJXMgZm9yIGFnZ3JlZ2F0aW9uXG4iLAotCQkJIChwcml2LT5jZmctPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24pID8KKwkJCSAoY2ZnKHByaXYpLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uKSA/CiAJCQkJInJ0cy9jdHMiIDogImN0cy10by1zZWxmIik7CiAJZWxzZQogCQlwb3MgKz0gc2NucHJpbnRmKGJ1ZiArIHBvcywgYnVmc3ogLSBwb3MsICJOL0EiKTsKQEAgLTI0MjcsNyArMjQyNiw3IEBACiAJaW50IGJ1Zl9zaXplOwogCWludCBydHM7CiAKLQlpZiAoIXByaXYtPmNmZy0+aHRfcGFyYW1zKQorCWlmICghY2ZnKHByaXYpLT5odF9wYXJhbXMpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJbWVtc2V0KGJ1ZiwgMCwgc2l6ZW9mKGJ1ZikpOwpAQCAtMjQzNyw5ICsyNDM2LDkgQEAKIAlpZiAoc3NjYW5mKGJ1ZiwgIiVkIiwgJnJ0cykgIT0gMSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKHJ0cykKLQkJcHJpdi0+Y2ZnLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uID0gdHJ1ZTsKKwkJY2ZnKHByaXYpLT5odF9wYXJhbXMtPnVzZV9ydHNfZm9yX2FnZ3JlZ2F0aW9uID0gdHJ1ZTsKIAllbHNlCi0JCXByaXYtPmNmZy0+aHRfcGFyYW1zLT51c2VfcnRzX2Zvcl9hZ2dyZWdhdGlvbiA9IGZhbHNlOworCQljZmcocHJpdiktPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24gPSBmYWxzZTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKaW5kZXggNmMwMGE0NC4uZTU0YTRkMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2LmgKQEAgLTYwLDExICs2MCwxMCBAQAogCiAvKiBEZWZhdWx0IG5vaXNlIGxldmVsIHRvIHJlcG9ydCB3aGVuIG5vaXNlIG1lYXN1cmVtZW50IGlzIG5vdCBhdmFpbGFibGUuCiAgKiAgIFRoaXMgbWF5IGJlIGJlY2F1c2Ugd2UncmU6Ci0gKiAgIDEpICBOb3QgYXNzb2NpYXRlZCAoNDk2NSwgbm8gYmVhY29uIHN0YXRpc3RpY3MgYmVpbmcgc2VudCB0byBkcml2ZXIpCisgKiAgIDEpICBOb3QgYXNzb2NpYXRlZCAgbm8gYmVhY29uIHN0YXRpc3RpY3MgYmVpbmcgc2VudCB0byBkcml2ZXIpCiAgKiAgIDIpICBTY2FubmluZyAobm9pc2UgbWVhc3VyZW1lbnQgZG9lcyBub3QgYXBwbHkgdG8gYXNzb2NpYXRlZCBjaGFubmVsKQotICogICAzKSAgUmVjZWl2aW5nIENDSyAoMzk0NSBkZWxpdmVycyBub2lzZSBpbmZvIG9ubHkgZm9yIE9GRE0gZnJhbWVzKQogICogVXNlIGRlZmF1bHQgbm9pc2UgdmFsdWUgb2YgLTEyNyAuLi4gdGhpcyBpcyBiZWxvdyB0aGUgcmFuZ2Ugb2YgbWVhc3VyYWJsZQotICogICBSeCBkQm0gZm9yIGVpdGhlciAzOTQ1IG9yIDQ5NjUsIHNvIGl0IGNhbiBpbmRpY2F0ZSAidW5tZWFzdXJhYmxlIiB0byB1c2VyLgorICogICBSeCBkQm0gZm9yIGFsbCBhZ24gZGV2aWNlcywgc28gaXQgY2FuIGluZGljYXRlICJ1bm1lYXN1cmFibGUiIHRvIHVzZXIuCiAgKiAgIEFsc28sIC0xMjcgd29ya3MgYmV0dGVyIHRoYW4gMCB3aGVuIGF2ZXJhZ2luZyBmcmFtZXMgd2l0aC93aXRob3V0CiAgKiAgIG5vaXNlIGluZm8gKGUuZy4gYXZlcmFnaW5nIG1pZ2h0IGJlIGRvbmUgaW4gYXBwKTsgbWVhc3VyZWQgZEJtIHZhbHVlcyBhcmUKICAqICAgYWx3YXlzIG5lZ2F0aXZlIC4uLiB1c2luZyBhIG5lZ2F0aXZlIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGtlZXBzIGFsbApAQCAtMTkwLDYgKzE4OSw2OSBAQAogCXN0cnVjdCBpd2xfcW9zcGFyYW1fY21kIGRlZl9xb3NfcGFybTsKIH07CiAKKy8qKgorICogZW51bSBpd2xfYWdnX3N0YXRlCisgKgorICogVGhlIHN0YXRlIG1hY2hpbmUgb2YgdGhlIEJBIGFncmVlbWVudCBlc3RhYmxpc2htZW50IC8gdGVhciBkb3duLgorICogVGhlc2Ugc3RhdGVzIHJlbGF0ZSB0byBhIHNwZWNpZmljIFJBIC8gVElELgorICoKKyAqIEBJV0xfQUdHX09GRjogYWdncmVnYXRpb24gaXMgbm90IHVzZWQKKyAqIEBJV0xfQUdHX09OOiBhZ2dyZWdhdGlvbiBzZXNzaW9uIGlzIHVwCisgKiBASVdMX0VNUFRZSU5HX0hXX1FVRVVFX0FEREJBOiBlc3RhYmxpc2hpbmcgYSBCQSBzZXNzaW9uIC0gd2FpdGluZyBmb3IgdGhlCisgKglIVyBxdWV1ZSB0byBiZSBlbXB0eSBmcm9tIHBhY2tldHMgZm9yIHRoaXMgUkEgL1RJRC4KKyAqIEBJV0xfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkE6IHRlYXJpbmcgZG93biBhIEJBIHNlc3Npb24gLSB3YWl0aW5nIGZvciB0aGUKKyAqCUhXIHF1ZXVlIHRvIGJlIGVtcHR5IGZyb20gcGFja2V0cyBmb3IgdGhpcyBSQSAvVElELgorICovCitlbnVtIGl3bF9hZ2dfc3RhdGUgeworCUlXTF9BR0dfT0ZGID0gMCwKKwlJV0xfQUdHX09OLAorCUlXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQSwKKwlJV0xfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkEsCit9OworCisvKioKKyAqIHN0cnVjdCBpd2xfaHRfYWdnIC0gYWdncmVnYXRpb24gc3RhdGUgbWFjaGluZQorCisgKiBUaGlzIHN0cnVjdHMgaG9sZHMgdGhlIHN0YXRlcyBmb3IgdGhlIEJBIGFncmVlbWVudCBlc3RhYmxpc2htZW50IGFuZCB0ZWFyCisgKiBkb3duLiBJdCBhbHNvIGhvbGRzIHRoZSBzdGF0ZSBkdXJpbmcgdGhlIEJBIHNlc3Npb24gaXRzZWxmLiBUaGlzIHN0cnVjdCBpcworICogZHVwbGljYXRlZCBmb3IgZWFjaCBSQSAvIFRJRC4KKworICogQHJhdGVfbl9mbGFnczogUmF0ZSBhdCB3aGljaCBUeCB3YXMgYXR0ZW1wdGVkLiBIb2xkcyB0aGUgZGF0YSBiZXR3ZWVuIHRoZQorICoJVHggcmVzcG9uc2UgKFJFUExZX1RYKSwgYW5kIHRoZSBibG9jayBhY2sgbm90aWZpY2F0aW9uCisgKgkoUkVQTFlfQ09NUFJFU1NFRF9CQSkuCisgKiBAc3RhdGU6IHN0YXRlIG9mIHRoZSBCQSBhZ3JlZW1lbnQgZXN0YWJsaXNobWVudCAvIHRlYXIgZG93bi4KKyAqIEB0eHFfaWQ6IFR4IHF1ZXVlIHVzZWQgYnkgdGhlIEJBIHNlc3Npb24gLSB1c2VkIGJ5IHRoZSB0cmFuc3BvcnQgbGF5ZXIuCisgKglOZWVkZWQgYnkgdGhlIHVwcGVyIGxheWVyIGZvciBkZWJ1Z2ZzIG9ubHkuCisgKiBAc3NuOiB0aGUgZmlyc3QgcGFja2V0IHRvIGJlIHNlbnQgaW4gQUdHIEhXIHF1ZXVlIGluIFR4IEFHRyBzdGFydCBmbG93LCBvcgorICoJdGhlIGZpcnN0IHBhY2tldCB0byBiZSBzZW50IGluIGxlZ2FjeSBIVyBxdWV1ZSBpbiBUeCBBR0cgc3RvcCBmbG93LgorICoJQmFzaWNhbGx5IHdoZW4gbmV4dF9yZWNsYWltZWQgcmVhY2hlcyBzc24sIHdlIGNhbiB0ZWxsIG1hYzgwMjExIHRoYXQKKyAqCXdlIGFyZSByZWFkeSB0byBmaW5pc2ggdGhlIFR4IEFHRyBzdG9wIC8gc3RhcnQgZmxvdy4KKyAqIEB3YWl0X2Zvcl9iYTogRXhwZWN0IGJsb2NrLWFjayBiZWZvcmUgbmV4dCBUeCByZXBseQorICovCitzdHJ1Y3QgaXdsX2h0X2FnZyB7CisJdTMyIHJhdGVfbl9mbGFnczsKKwllbnVtIGl3bF9hZ2dfc3RhdGUgc3RhdGU7CisJdTE2IHR4cV9pZDsKKwl1MTYgc3NuOworCWJvb2wgd2FpdF9mb3JfYmE7Cit9OworCisvKioKKyAqIHN0cnVjdCBpd2xfdGlkX2RhdGEgLSBvbmUgZm9yIGVhY2ggUkEgLyBUSUQKKworICogVGhpcyBzdHJ1Y3RzIGhvbGRzIHRoZSBzdGF0ZXMgZm9yIGVhY2ggUkEgLyBUSUQuCisKKyAqIEBzZXFfbnVtYmVyOiB0aGUgbmV4dCBXaUZpIHNlcXVlbmNlIG51bWJlciB0byB1c2UKKyAqIEBuZXh0X3JlY2xhaW1lZDogdGhlIFdpRmkgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBuZXh0IHBhY2tldCB0byBiZSBhY2tlZC4KKyAqCVRoaXMgaXMgYmFzaWNhbGx5IChsYXN0IGFja2VkIHBhY2tldCsrKS4KKyAqIEBhZ2c6IGFnZ3JlZ2F0aW9uIHN0YXRlIG1hY2hpbmUKKyAqLworc3RydWN0IGl3bF90aWRfZGF0YSB7CisJdTE2IHNlcV9udW1iZXI7CisJdTE2IG5leHRfcmVjbGFpbWVkOworCXN0cnVjdCBpd2xfaHRfYWdnIGFnZzsKK307CisKIC8qCiAgKiBTdHJ1Y3R1cmUgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggc3RhX2xvY2sgaGVsZC4gV2hlbiBzdGF0aW9uIGFkZGl0aW9uCiAgKiBpcyBpbiBwcm9ncmVzcyAoSVdMX1NUQV9VQ09ERV9JTlBST0dSRVNTKSBpdCBpcyBwb3NzaWJsZSB0byBhY2Nlc3Mgb25seQpAQCAtMjMwLDE3ICsyOTIsNiBAQAogCXU4IGlic3NfYnNzaWRfc3RhX2lkOwogfTsKIAotLyogb25lIGZvciBlYWNoIHVDb2RlIGltYWdlIChpbnN0L2RhdGEsIGJvb3QvaW5pdC9ydW50aW1lKSAqLwotc3RydWN0IGZ3X2Rlc2MgewotCXZvaWQgKnZfYWRkcjsJCS8qIGFjY2VzcyBieSBkcml2ZXIgKi8KLQlkbWFfYWRkcl90IHBfYWRkcjsJLyogYWNjZXNzIGJ5IGNhcmQncyBidXNtYXN0ZXIgRE1BICovCi0JdTMyIGxlbjsJCS8qIGJ5dGVzICovCi19OwotCi1zdHJ1Y3QgZndfaW1nIHsKLQlzdHJ1Y3QgZndfZGVzYyBjb2RlLCBkYXRhOwotfTsKLQogLyogdjEvdjIgdUNvZGUgZmlsZSBsYXlvdXQgKi8KIHN0cnVjdCBpd2xfdWNvZGVfaGVhZGVyIHsKIAlfX2xlMzIgdmVyOwkvKiBtYWpvci9taW5vci9BUEkvc2VyaWFsICovCkBAIC00NTIsMjkgKzUwMyw2IEBACiAJSVdMX0NIQUlOX05PSVNFX0RPTkUsCiB9OwogCi0KLS8qCi0gKiBlbnVtIGl3bF9jYWxpYgotICogZGVmaW5lcyB0aGUgb3JkZXIgaW4gd2hpY2ggcmVzdWx0cyBvZiBpbml0aWFsIGNhbGlicmF0aW9ucwotICogc2hvdWxkIGJlIHNlbnQgdG8gdGhlIHJ1bnRpbWUgdUNvZGUKLSAqLwotZW51bSBpd2xfY2FsaWIgewotCUlXTF9DQUxJQl9YVEFMLAotCUlXTF9DQUxJQl9EQywKLQlJV0xfQ0FMSUJfTE8sCi0JSVdMX0NBTElCX1RYX0lRLAotCUlXTF9DQUxJQl9UWF9JUV9QRVJELAotCUlXTF9DQUxJQl9CQVNFX0JBTkQsCi0JSVdMX0NBTElCX1RFTVBfT0ZGU0VULAotCUlXTF9DQUxJQl9NQVgKLX07Ci0KLS8qIE9wYXF1ZSBjYWxpYnJhdGlvbiByZXN1bHRzICovCi1zdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCB7Ci0Jdm9pZCAqYnVmOwotCXNpemVfdCBidWZfbGVuOwotfTsKLQogLyogU2Vuc2l0aXZpdHkgY2FsaWIgZGF0YSAqLwogc3RydWN0IGl3bF9zZW5zaXRpdml0eV9kYXRhIHsKIAl1MzIgYXV0b19jb3JyX29mZG07CkBAIC01NDcsMTYgKzU3NSw2IEBACiAJSVdMX09UUF9BQ0NFU1NfUkVMQVRJVkUsCiB9OwogCi0vKioKLSAqIGVudW0gaXdsX3BhX3R5cGUgLSBQb3dlciBBbXBsaWZpZXIgdHlwZQotICogQElXTF9QQV9TWVNURU06ICBiYXNlZCBvbiB1Q29kZSBjb25maWd1cmF0aW9uCi0gKiBASVdMX1BBX0lOVEVSTkFMOiB1c2UgSW50ZXJuYWwgb25seQotICovCi1lbnVtIGl3bF9wYV90eXBlIHsKLQlJV0xfUEFfU1lTVEVNID0gMCwKLQlJV0xfUEFfSU5URVJOQUwgPSAxLAotfTsKLQogLyogcmVwbHlfdHhfc3RhdGlzdGljcyAoZm9yIF9hZ24gZGV2aWNlcykgKi8KIHN0cnVjdCByZXBseV90eF9lcnJvcl9zdGF0aXN0aWNzIHsKIAl1MzIgcHBfZGVsYXk7CkBAIC03MTQsMzUgKzczMiw2IEBACiAgKi8KICNkZWZpbmUgSVdMQUdOX0VYVF9CRUFDT05fVElNRV9QT1MJMjIKIAotLyoqCi0gKiBzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0IC0gbm90aWZpY2F0aW9uIHdhaXQgZW50cnkKLSAqIEBsaXN0OiBsaXN0IGhlYWQgZm9yIGdsb2JhbCBsaXN0Ci0gKiBAZm46IGZ1bmN0aW9uIGNhbGxlZCB3aXRoIHRoZSBub3RpZmljYXRpb24KLSAqIEBjbWQ6IGNvbW1hbmQgSUQKLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSBpcyBub3QgdXNlZCBkaXJlY3RseSwgdG8gd2FpdCBmb3IgYQotICogbm90aWZpY2F0aW9uIGRlY2xhcmUgaXQgb24gdGhlIHN0YWNrLCBhbmQgY2FsbAotICogaXdsYWduX2luaXRfbm90aWZpY2F0aW9uX3dhaXQoKSB3aXRoIGFwcHJvcHJpYXRlCi0gKiBwYXJhbWV0ZXJzLiBUaGVuIGRvIHdoYXRldmVyIHdpbGwgY2F1c2UgdGhlIHVjb2RlCi0gKiB0byBub3RpZnkgdGhlIGRyaXZlciwgYW5kIHRvIHdhaXQgZm9yIHRoYXQgdGhlbgotICogY2FsbCBpd2xhZ25fd2FpdF9ub3RpZmljYXRpb24oKS4KLSAqCi0gKiBFYWNoIG5vdGlmaWNhdGlvbiBpcyBvbmUtc2hvdC4gSWYgYXQgc29tZSBwb2ludCB3ZQotICogbmVlZCB0byBzdXBwb3J0IG11bHRpLXNob3Qgbm90aWZpY2F0aW9ucyAod2hpY2gKLSAqIGNhbid0IGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2spIHdlIG5lZWQgdG8gbW9kaWZ5Ci0gKiB0aGUgY29kZSBmb3IgdGhlbS4KLSAqLwotc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCi0Jdm9pZCAoKmZuKShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QsCi0JCSAgIHZvaWQgKmRhdGEpOwotCXZvaWQgKmZuX2RhdGE7Ci0KLQl1OCBjbWQ7Ci0JYm9vbCB0cmlnZ2VyZWQsIGFib3J0ZWQ7Ci19OwotCiBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCB7CiAJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKIApAQCAtODA1LDE0ICs3OTQsNyBAQAogCUlXTF9TQ0FOX1JPQywKIH07CiAKLWVudW0gaXdsYWduX3Vjb2RlX3R5cGUgewotCUlXTF9VQ09ERV9OT05FLAotCUlXTF9VQ09ERV9SRUdVTEFSLAotCUlXTF9VQ09ERV9JTklULAotCUlXTF9VQ09ERV9XT1dMQU4sCi19OwotCi0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1NWVE9PTAorI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9URVNUTU9ERQogc3RydWN0IGl3bF90ZXN0bW9kZV90cmFjZSB7CiAJdTMyIGJ1ZmZfc2l6ZTsKIAl1MzIgdG90YWxfc2l6ZTsKQEAgLTgyMiw4ICs4MDQsMjAgQEAKIAlkbWFfYWRkcl90IGRtYV9hZGRyOwogCWJvb2wgdHJhY2VfZW5hYmxlZDsKIH07CitzdHJ1Y3QgaXdsX3Rlc3Rtb2RlX3NyYW0geworCXUzMiBidWZmX3NpemU7CisJdTMyIG51bV9jaHVua3M7CisJdTggKmJ1ZmZfYWRkcjsKKwlib29sIHNyYW1fcmVhZGVkOworfTsKICNlbmRpZgogCitzdHJ1Y3QgaXdsX3dpcGFuX25vYV9kYXRhIHsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1X2hlYWQ7CisJdTMyIGxlbmd0aDsKKwl1OCBkYXRhW107Cit9OworCiBzdHJ1Y3QgaXdsX3ByaXYgewogCiAJLypkYXRhIHNoYXJlZCBhbW9uZyBhbGwgdGhlIGRyaXZlcidzIGxheWVycyAqLwpAQCAtODM1LDcgKzgyOSw2IEBACiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICppZWVlX2NoYW5uZWxzOwogCXN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqaWVlZV9yYXRlczsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqdHhfY21kX3Bvb2w7Ci0Jc3RydWN0IGl3bF9jZmcgKmNmZzsKIAogCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKIApAQCAtODgwLDggKzg3Myw3IEBACiAJczMyIHRlbXBlcmF0dXJlOwkvKiBDZWxzaXVzICovCiAJczMyIGxhc3RfdGVtcGVyYXR1cmU7CiAKLQkvKiBpbml0IGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KLQlzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCBjYWxpYl9yZXN1bHRzW0lXTF9DQUxJQl9NQVhdOworCXN0cnVjdCBpd2xfd2lwYW5fbm9hX2RhdGEgX19yY3UgKm5vYV9kYXRhOwogCiAJLyogU2NhbiByZWxhdGVkIHZhcmlhYmxlcyAqLwogCXVuc2lnbmVkIGxvbmcgc2Nhbl9zdGFydDsKQEAgLTkwNywyMyArODk5LDEyIEBACiAJdTMyIHVjb2RlX3ZlcjsJCQkvKiB2ZXJzaW9uIG9mIHVjb2RlLCBjb3B5IG9mCiAJCQkJCSAgIGl3bF91Y29kZS52ZXIgKi8KIAotCXN0cnVjdCBmd19pbWcgdWNvZGVfcnQ7Ci0Jc3RydWN0IGZ3X2ltZyB1Y29kZV9pbml0OwotCXN0cnVjdCBmd19pbWcgdWNvZGVfd293bGFuOwotCi0JZW51bSBpd2xhZ25fdWNvZGVfdHlwZSB1Y29kZV90eXBlOwotCXU4IHVjb2RlX3dyaXRlX2NvbXBsZXRlOwkvKiB0aGUgaW1hZ2Ugd3JpdGUgaXMgY29tcGxldGUgKi8KIAljaGFyIGZpcm13YXJlX25hbWVbMjVdOwogCiAJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgY29udGV4dHNbTlVNX0lXTF9SWE9OX0NUWF07CiAKIAlfX2xlMTYgc3dpdGNoX2NoYW5uZWw7CiAKLQlzdHJ1Y3QgewotCQl1MzIgZXJyb3JfZXZlbnRfdGFibGU7Ci0JCXUzMiBsb2dfZXZlbnRfdGFibGU7Ci0JfSBkZXZpY2VfcG9pbnRlcnM7Ci0KIAl1MTYgYWN0aXZlX3JhdGU7CiAKIAl1OCBzdGFydF9jYWxpYjsKQEAgLTk1MSwxNyArOTMyLDEzIEBACiAJaW50IG51bV9zdGF0aW9uczsKIAlzdHJ1Y3QgaXdsX3N0YXRpb25fZW50cnkgc3RhdGlvbnNbSVdMQUdOX1NUQVRJT05fQ09VTlRdOwogCXVuc2lnbmVkIGxvbmcgdWNvZGVfa2V5X3RhYmxlOworCXN0cnVjdCBpd2xfdGlkX2RhdGEgdGlkX2RhdGFbSVdMQUdOX1NUQVRJT05fQ09VTlRdW0lXTF9NQVhfVElEX0NPVU5UXTsKIAogCXU4IG1hYzgwMjExX3JlZ2lzdGVyZWQ7CiAKIAkvKiBJbmRpY2F0aW9uIGlmIGllZWU4MDIxMV9vcHMtPm9wZW4gaGFzIGJlZW4gY2FsbGVkICovCiAJdTggaXNfb3BlbjsKIAotCS8qIGVlcHJvbSAtLSB0aGlzIGlzIGluIHRoZSBjYXJkJ3MgbGl0dGxlIGVuZGlhbiBieXRlIG9yZGVyICovCi0JdTggKmVlcHJvbTsKLQlpbnQgICAgbnZtX2RldmljZV90eXBlOwotCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2luZm8gKmNhbGliX2luZm87Ci0KIAllbnVtIG5sODAyMTFfaWZ0eXBlIGl3X21vZGU7CiAKIAkvKiBMYXN0IFJ4J2QgYmVhY29uIHRpbWVzdGFtcCAqLwpAQCAtMTAxNywxMCArOTk0LDYgQEAKIAkvKiBjb3VudHMgcmVwbHlfdHggZXJyb3IgKi8KIAlzdHJ1Y3QgcmVwbHlfdHhfZXJyb3Jfc3RhdGlzdGljcyByZXBseV90eF9zdGF0czsKIAlzdHJ1Y3QgcmVwbHlfYWdnX3R4X2Vycm9yX3N0YXRpc3RpY3MgcmVwbHlfYWdnX3R4X3N0YXRzOwotCS8qIG5vdGlmaWNhdGlvbiB3YWl0IHN1cHBvcnQgKi8KLQlzdHJ1Y3QgbGlzdF9oZWFkIG5vdGlmX3dhaXRzOwotCXNwaW5sb2NrX3Qgbm90aWZfd2FpdF9sb2NrOwotCXdhaXRfcXVldWVfaGVhZF90IG5vdGlmX3dhaXRxOwogCiAJLyogcmVtYWluLW9uLWNoYW5uZWwgb2ZmbG9hZCBzdXBwb3J0ICovCiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpod19yb2NfY2hhbm5lbDsKQEAgLTEwOTgsOCArMTA3MSw5IEBACiAJc3RydWN0IGxlZF9jbGFzc2RldiBsZWQ7CiAJdW5zaWduZWQgbG9uZyBibGlua19vbiwgYmxpbmtfb2ZmOwogCWJvb2wgbGVkX3JlZ2lzdGVyZWQ7Ci0jaWZkZWYgQ09ORklHX0lXTFdJRklfREVWSUNFX1NWVE9PTAorI2lmZGVmIENPTkZJR19JV0xXSUZJX0RFVklDRV9URVNUTU9ERQogCXN0cnVjdCBpd2xfdGVzdG1vZGVfdHJhY2UgdGVzdG1vZGVfdHJhY2U7CisJc3RydWN0IGl3bF90ZXN0bW9kZV9zcmFtIHRlc3Rtb2RlX3NyYW07CiAJdTMyIHRtX2ZpeGVkX3JhdGU7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldnRyYWNlLmMKaW5kZXggYTYzNWE3ZS4uMmEyYzhkZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS5jCkBAIC0yOCw3ICsyOCw3IEBACiAKIC8qIHNwYXJzZSBkb2Vzbid0IGxpa2UgdHJhY2Vwb2ludCBtYWNyb3MgKi8KICNpZm5kZWYgX19DSEVDS0VSX18KLSNpbmNsdWRlICJpd2wtZGV2LmgiCisjaW5jbHVkZSAiaXdsLXRyYW5zLmgiCiAKICNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUwogI2luY2x1ZGUgIml3bC1kZXZ0cmFjZS5oIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWRldnRyYWNlLmgKaW5kZXggOGE1MWM1Yy4uOWIyMTJhOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZGV2dHJhY2UuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1kZXZ0cmFjZS5oCkBAIC0yOSw3ICsyOSw2IEBACiAKICNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CiAKLXN0cnVjdCBpd2xfcHJpdjsKIAogI2lmICFkZWZpbmVkKENPTkZJR19JV0xXSUZJX0RFVklDRV9UUkFDSU5HKSB8fCBkZWZpbmVkKF9fQ0hFQ0tFUl9fKQogI3VuZGVmIFRSQUNFX0VWRU5UCkBAIC0zNywxNCArMzYsMTQgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCB0cmFjZV8gIyMgbmFtZShwcm90bykge30KICNlbmRpZgogCi0jZGVmaW5lIFBSSVZfRU5UUlkJX19maWVsZChzdHJ1Y3QgaXdsX3ByaXYgKiwgcHJpdikKKyNkZWZpbmUgUFJJVl9FTlRSWQlfX2ZpZWxkKHZvaWQgKiwgcHJpdikKICNkZWZpbmUgUFJJVl9BU1NJR04JX19lbnRyeS0+cHJpdiA9IHByaXYKIAogI3VuZGVmIFRSQUNFX1NZU1RFTQogI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaV9pbwogCiBUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9pb3JlYWQzMiwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKKwlUUF9QUk9UTyh2b2lkICpwcml2LCB1MzIgb2ZmcywgdTMyIHZhbCksCiAJVFBfQVJHUyhwcml2LCBvZmZzLCB2YWwpLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCVBSSVZfRU5UUlkKQEAgLTYwLDcgKzU5LDcgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X2lvd3JpdGU4LAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIG9mZnMsIHU4IHZhbCksCisJVFBfUFJPVE8odm9pZCAqcHJpdiwgdTMyIG9mZnMsIHU4IHZhbCksCiAJVFBfQVJHUyhwcml2LCBvZmZzLCB2YWwpLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCVBSSVZfRU5UUlkKQEAgLTc2LDcgKzc1LDcgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X2lvd3JpdGUzMiwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBvZmZzLCB1MzIgdmFsKSwKKwlUUF9QUk9UTyh2b2lkICpwcml2LCB1MzIgb2ZmcywgdTMyIHZhbCksCiAJVFBfQVJHUyhwcml2LCBvZmZzLCB2YWwpLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCVBSSVZfRU5UUlkKQEAgLTkxLDExICs5MCw0MCBAQAogCVRQX3ByaW50aygiWyVwXSB3cml0ZSBpb1slI3hdID0gJSN4KSIsIF9fZW50cnktPnByaXYsIF9fZW50cnktPm9mZnMsIF9fZW50cnktPnZhbCkKICk7CiAKK1RSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X2lycSwKKwlUUF9QUk9UTyh2b2lkICpwcml2KSwKKwlUUF9BUkdTKHByaXYpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCVBSSVZfRU5UUlkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlQUklWX0FTU0lHTjsKKwkpLAorCS8qIFRQX3ByaW50aygiIikgZG9lc24ndCBjb21waWxlICovCisJVFBfcHJpbnRrKCIlZCIsIDApCispOworCitUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9pY3RfcmVhZCwKKwlUUF9QUk9UTyh2b2lkICpwcml2LCB1MzIgaW5kZXgsIHUzMiB2YWx1ZSksCisJVFBfQVJHUyhwcml2LCBpbmRleCwgdmFsdWUpLAorCVRQX1NUUlVDVF9fZW50cnkoCisJCVBSSVZfRU5UUlkKKwkJX19maWVsZCh1MzIsIGluZGV4KQorCQlfX2ZpZWxkKHUzMiwgdmFsdWUpCisJKSwKKwlUUF9mYXN0X2Fzc2lnbigKKwkJUFJJVl9BU1NJR047CisJCV9fZW50cnktPmluZGV4ID0gaW5kZXg7CisJCV9fZW50cnktPnZhbHVlID0gdmFsdWU7CisJKSwKKwlUUF9wcmludGsoInJlYWQgaWN0WyVkXSA9ICUjLjh4IiwgX19lbnRyeS0+aW5kZXgsIF9fZW50cnktPnZhbHVlKQorKTsKKwogI3VuZGVmIFRSQUNFX1NZU1RFTQogI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaV91Y29kZQogCiBUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl91Y29kZV9jb250X2V2ZW50LAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIHRpbWUsIHUzMiBkYXRhLCB1MzIgZXYpLAorCVRQX1BST1RPKHZvaWQgKnByaXYsIHUzMiB0aW1lLCB1MzIgZGF0YSwgdTMyIGV2KSwKIAlUUF9BUkdTKHByaXYsIHRpbWUsIGRhdGEsIGV2KSwKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlQUklWX0VOVFJZCkBAIC0xMTUsNyArMTQzLDcgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X3Vjb2RlX3dyYXBfZXZlbnQsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgd3JhcHMsIHUzMiBuX2VudHJ5LCB1MzIgcF9lbnRyeSksCisJVFBfUFJPVE8odm9pZCAqcHJpdiwgdTMyIHdyYXBzLCB1MzIgbl9lbnRyeSwgdTMyIHBfZW50cnkpLAogCVRQX0FSR1MocHJpdiwgd3JhcHMsIG5fZW50cnksIHBfZW50cnkpLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCVBSSVZfRU5UUlkKQEAgLTEzOSw3ICsxNjcsNyBAQAogI2RlZmluZSBUUkFDRV9TWVNURU0gaXdsd2lmaQogCiBUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl9oY21kLAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGZsYWdzLAorCVRQX1BST1RPKHZvaWQgKnByaXYsIHUzMiBmbGFncywKIAkJIGNvbnN0IHZvaWQgKmhjbWQwLCBzaXplX3QgbGVuMCwKIAkJIGNvbnN0IHZvaWQgKmhjbWQxLCBzaXplX3QgbGVuMSwKIAkJIGNvbnN0IHZvaWQgKmhjbWQyLCBzaXplX3QgbGVuMiksCkBAIC0xNjQsNyArMTkyLDcgQEAKICk7CiAKIFRSQUNFX0VWRU5UKGl3bHdpZmlfZGV2X3J4LAotCVRQX1BST1RPKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdm9pZCAqcnhidWYsIHNpemVfdCBsZW4pLAorCVRQX1BST1RPKHZvaWQgKnByaXYsIHZvaWQgKnJ4YnVmLCBzaXplX3QgbGVuKSwKIAlUUF9BUkdTKHByaXYsIHJ4YnVmLCBsZW4pLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCVBSSVZfRU5UUlkKQEAgLTE3OSw3ICsyMDcsNyBAQAogKTsKIAogVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfdHgsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB2b2lkICp0ZmQsIHNpemVfdCB0ZmRsZW4sCisJVFBfUFJPVE8odm9pZCAqcHJpdiwgdm9pZCAqdGZkLCBzaXplX3QgdGZkbGVuLAogCQkgdm9pZCAqYnVmMCwgc2l6ZV90IGJ1ZjBfbGVuLAogCQkgdm9pZCAqYnVmMSwgc2l6ZV90IGJ1ZjFfbGVuKSwKIAlUUF9BUkdTKHByaXYsIHRmZCwgdGZkbGVuLCBidWYwLCBidWYwX2xlbiwgYnVmMSwgYnVmMV9sZW4pLApAQCAtMjExLDcgKzIzOSw3IEBACiApOwogCiBUUkFDRV9FVkVOVChpd2x3aWZpX2Rldl91Y29kZV9lcnJvciwKLQlUUF9QUk9UTyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBkZXNjLCB1MzIgdHNmX2xvdywKKwlUUF9QUk9UTyh2b2lkICpwcml2LCB1MzIgZGVzYywgdTMyIHRzZl9sb3csCiAJCSB1MzIgZGF0YTEsIHUzMiBkYXRhMiwgdTMyIGxpbmUsIHUzMiBibGluazEsCiAJCSB1MzIgYmxpbmsyLCB1MzIgaWxpbmsxLCB1MzIgaWxpbmsyLCB1MzIgYmNvbl90aW1lLAogCQkgdTMyIGdwMSwgdTMyIGdwMiwgdTMyIGdwMywgdTMyIHVjb2RlX3ZlciwgdTMyIGh3X3ZlciwKQEAgLTI3MSw3ICsyOTksNyBAQAogKTsKIAogVFJBQ0VfRVZFTlQoaXdsd2lmaV9kZXZfdWNvZGVfZXZlbnQsCi0JVFBfUFJPVE8oc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MzIgdGltZSwgdTMyIGRhdGEsIHUzMiBldiksCisJVFBfUFJPVE8odm9pZCAqcHJpdiwgdTMyIHRpbWUsIHUzMiBkYXRhLCB1MzIgZXYpLAogCVRQX0FSR1MocHJpdiwgdGltZSwgZGF0YSwgZXYpLAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCVBSSVZfRU5UUlkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmMKaW5kZXggYTRlNDNiZC4uYzFlZGE5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmMKQEAgLTE0OSwyMyArMTQ5LDIzIEBACiAgKiBFRVBST00gY2hpcCwgbm90IGEgc2luZ2xlIGV2ZW50LCBzbyBldmVuIHJlYWRzIGNvdWxkIGNvbmZsaWN0IGlmIHRoZXkKICAqIHdlcmVuJ3QgYXJiaXRyYXRlZCBieSB0aGUgc2VtYXBob3JlLgogICovCi1zdGF0aWMgaW50IGl3bF9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9wcml2ICpwcml2KQorc3RhdGljIGludCBpd2xfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHN0cnVjdCBpd2xfYnVzICpidXMpCiB7CiAJdTE2IGNvdW50OwogCWludCByZXQ7CiAKIAlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBFRVBST01fU0VNX1JFVFJZX0xJTUlUOyBjb3VudCsrKSB7CiAJCS8qIFJlcXVlc3Qgc2VtYXBob3JlICovCi0JCWl3bF9zZXRfYml0KGJ1cyhwcml2KSwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJCWl3bF9zZXRfYml0KGJ1cywgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCiAJCQkgICAgQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNKTsKIAogCQkvKiBTZWUgaWYgd2UgZ290IGl0ICovCi0JCXJldCA9IGl3bF9wb2xsX2JpdChidXMocHJpdiksIENTUl9IV19JRl9DT05GSUdfUkVHLAorCQlyZXQgPSBpd2xfcG9sbF9iaXQoYnVzLCBDU1JfSFdfSUZfQ09ORklHX1JFRywKIAkJCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfRUVQUk9NX09XTl9TRU0sCiAJCQkJQ1NSX0hXX0lGX0NPTkZJR19SRUdfQklUX0VFUFJPTV9PV05fU0VNLAogCQkJCUVFUFJPTV9TRU1fVElNRU9VVCk7CiAJCWlmIChyZXQgPj0gMCkgewotCQkJSVdMX0RFQlVHX0VFUFJPTShwcml2LAorCQkJSVdMX0RFQlVHX0VFUFJPTShidXMsCiAJCQkJIkFjcXVpcmVkIHNlbWFwaG9yZSBhZnRlciAlZCB0cmllcy5cbiIsCiAJCQkJY291bnQrMSk7CiAJCQlyZXR1cm4gcmV0OwpAQCAtMTc1LDM5ICsxNzUsMzkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBpd2xfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyB2b2lkIGl3bF9lZXByb21fcmVsZWFzZV9zZW1hcGhvcmUoc3RydWN0IGl3bF9idXMgKmJ1cykKIHsKLQlpd2xfY2xlYXJfYml0KGJ1cyhwcml2KSwgQ1NSX0hXX0lGX0NPTkZJR19SRUcsCisJaXdsX2NsZWFyX2JpdChidXMsIENTUl9IV19JRl9DT05GSUdfUkVHLAogCQlDU1JfSFdfSUZfQ09ORklHX1JFR19CSVRfRUVQUk9NX09XTl9TRU0pOwogCiB9CiAKLXN0YXRpYyBpbnQgaXdsX2VlcHJvbV92ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgaXdsX2VlcHJvbV92ZXJpZnlfc2lnbmF0dXJlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQogewotCXUzMiBncCA9IGl3bF9yZWFkMzIoYnVzKHByaXYpLCBDU1JfRUVQUk9NX0dQKSAmIENTUl9FRVBST01fR1BfVkFMSURfTVNLOworCXUzMiBncCA9IGl3bF9yZWFkMzIoYnVzKHRyYW5zKSwgQ1NSX0VFUFJPTV9HUCkgJiBDU1JfRUVQUk9NX0dQX1ZBTElEX01TSzsKIAlpbnQgcmV0ID0gMDsKIAotCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIkVFUFJPTSBzaWduYXR1cmU9MHglMDh4XG4iLCBncCk7CisJSVdMX0RFQlVHX0VFUFJPTSh0cmFucywgIkVFUFJPTSBzaWduYXR1cmU9MHglMDh4XG4iLCBncCk7CiAJc3dpdGNoIChncCkgewogCWNhc2UgQ1NSX0VFUFJPTV9HUF9CQURfU0lHX0VFUF9HT09EX1NJR19PVFA6Ci0JCWlmIChwcml2LT5udm1fZGV2aWNlX3R5cGUgIT0gTlZNX0RFVklDRV9UWVBFX09UUCkgewotCQkJSVdMX0VSUihwcml2LCAiRUVQUk9NIHdpdGggYmFkIHNpZ25hdHVyZTogMHglMDh4XG4iLAorCQlpZiAodHJhbnMtPm52bV9kZXZpY2VfdHlwZSAhPSBOVk1fREVWSUNFX1RZUEVfT1RQKSB7CisJCQlJV0xfRVJSKHRyYW5zLCAiRUVQUk9NIHdpdGggYmFkIHNpZ25hdHVyZTogMHglMDh4XG4iLAogCQkJCWdwKTsKIAkJCXJldCA9IC1FTk9FTlQ7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9MRVNTX1RIQU5fNEs6CiAJY2FzZSBDU1JfRUVQUk9NX0dQX0dPT0RfU0lHX0VFUF9NT1JFX1RIQU5fNEs6Ci0JCWlmIChwcml2LT5udm1fZGV2aWNlX3R5cGUgIT0gTlZNX0RFVklDRV9UWVBFX0VFUFJPTSkgewotCQkJSVdMX0VSUihwcml2LCAiT1RQIHdpdGggYmFkIHNpZ25hdHVyZTogMHglMDh4XG4iLCBncCk7CisJCWlmICh0cmFucy0+bnZtX2RldmljZV90eXBlICE9IE5WTV9ERVZJQ0VfVFlQRV9FRVBST00pIHsKKwkJCUlXTF9FUlIodHJhbnMsICJPVFAgd2l0aCBiYWQgc2lnbmF0dXJlOiAweCUwOHhcbiIsIGdwKTsKIAkJCXJldCA9IC1FTk9FTlQ7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBDU1JfRUVQUk9NX0dQX0JBRF9TSUdOQVRVUkVfQk9USF9FRVBfQU5EX09UUDoKIAlkZWZhdWx0OgotCQlJV0xfRVJSKHByaXYsICJiYWQgRUVQUk9NL09UUCBzaWduYXR1cmUsIHR5cGU9JXMsICIKKwkJSVdMX0VSUih0cmFucywgImJhZCBFRVBST00vT1RQIHNpZ25hdHVyZSwgdHlwZT0lcywgIgogCQkJIkVFUFJPTV9HUD0weCUwOHhcbiIsCi0JCQkocHJpdi0+bnZtX2RldmljZV90eXBlID09IE5WTV9ERVZJQ0VfVFlQRV9PVFApCisJCQkodHJhbnMtPm52bV9kZXZpY2VfdHlwZSA9PSBOVk1fREVWSUNFX1RZUEVfT1RQKQogCQkJPyAiT1RQIiA6ICJFRVBST00iLCBncCk7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWJyZWFrOwpAQCAtMjE1LDExICsyMTUsMTEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi11MTYgaXdsX2VlcHJvbV9xdWVyeTE2KGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgc2l6ZV90IG9mZnNldCkKK3UxNiBpd2xfZWVwcm9tX3F1ZXJ5MTYoY29uc3Qgc3RydWN0IGl3bF9zaGFyZWQgKnNocmQsIHNpemVfdCBvZmZzZXQpCiB7Ci0JaWYgKCFwcml2LT5lZXByb20pCisJaWYgKCFzaHJkLT5lZXByb20pCiAJCXJldHVybiAwOwotCXJldHVybiAodTE2KXByaXYtPmVlcHJvbVtvZmZzZXRdIHwgKCh1MTYpcHJpdi0+ZWVwcm9tW29mZnNldCArIDFdIDw8IDgpOworCXJldHVybiAodTE2KXNocmQtPmVlcHJvbVtvZmZzZXRdIHwgKCh1MTYpc2hyZC0+ZWVwcm9tW29mZnNldCArIDFdIDw8IDgpOwogfQogCiBpbnQgaXdsX2VlcHJvbV9jaGVja192ZXJzaW9uKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKQEAgLTIyNywxMSArMjI3LDExIEBACiAJdTE2IGVlcHJvbV92ZXI7CiAJdTE2IGNhbGliX3ZlcjsKIAotCWVlcHJvbV92ZXIgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1ZFUlNJT04pOwotCWNhbGliX3ZlciA9IGl3bGFnbl9lZXByb21fY2FsaWJfdmVyc2lvbihwcml2KTsKKwllZXByb21fdmVyID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYtPnNocmQsIEVFUFJPTV9WRVJTSU9OKTsKKwljYWxpYl92ZXIgPSBpd2xfZWVwcm9tX2NhbGliX3ZlcnNpb24ocHJpdi0+c2hyZCk7CiAKLQlpZiAoZWVwcm9tX3ZlciA8IHByaXYtPmNmZy0+ZWVwcm9tX3ZlciB8fAotCSAgICBjYWxpYl92ZXIgPCBwcml2LT5jZmctPmVlcHJvbV9jYWxpYl92ZXIpCisJaWYgKGVlcHJvbV92ZXIgPCBjZmcocHJpdiktPmVlcHJvbV92ZXIgfHwKKwkgICAgY2FsaWJfdmVyIDwgY2ZnKHByaXYpLT5lZXByb21fY2FsaWJfdmVyKQogCQlnb3RvIGVycjsKIAogCUlXTF9JTkZPKHByaXYsICJkZXZpY2UgRUVQUk9NIFZFUj0weCV4LCBDQUxJQj0weCV4XG4iLApAQCAtMjQxLDQ1ICsyNDEsNDYgQEAKIGVycjoKIAlJV0xfRVJSKHByaXYsICJVbnN1cHBvcnRlZCAodG9vIG9sZCkgRUVQUk9NIFZFUj0weCV4IDwgMHgleCAiCiAJCSAgIkNBTElCPTB4JXggPCAweCV4XG4iLAotCQkgIGVlcHJvbV92ZXIsIHByaXYtPmNmZy0+ZWVwcm9tX3ZlciwKLQkJICBjYWxpYl92ZXIsICBwcml2LT5jZmctPmVlcHJvbV9jYWxpYl92ZXIpOworCQkgIGVlcHJvbV92ZXIsIGNmZyhwcml2KS0+ZWVwcm9tX3ZlciwKKwkJICBjYWxpYl92ZXIsICBjZmcocHJpdiktPmVlcHJvbV9jYWxpYl92ZXIpOwogCXJldHVybiAtRUlOVkFMOwogCiB9CiAKIGludCBpd2xfZWVwcm9tX2NoZWNrX3NrdShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCiB7CisJc3RydWN0IGl3bF9zaGFyZWQgKnNocmQgPSBwcml2LT5zaHJkOwogCXUxNiByYWRpb19jZmc7CiAKLQlpZiAoIXByaXYtPmNmZy0+c2t1KSB7CisJaWYgKCFjZmcocHJpdiktPnNrdSkgewogCQkvKiBub3QgdXNpbmcgc2t1IG92ZXJ3cml0ZSAqLwotCQlwcml2LT5jZmctPnNrdSA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LCBFRVBST01fU0tVX0NBUCk7Ci0JCWlmIChwcml2LT5jZmctPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUgJiYKLQkJICAgICFwcml2LT5jZmctPmh0X3BhcmFtcykgeworCQljZmcocHJpdiktPnNrdSA9IGl3bF9lZXByb21fcXVlcnkxNihzaHJkLCBFRVBST01fU0tVX0NBUCk7CisJCWlmIChjZmcocHJpdiktPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUgJiYKKwkJICAgICFjZmcocHJpdiktPmh0X3BhcmFtcykgewogCQkJSVdMX0VSUihwcml2LCAiSW52YWxpZCAxMW4gY29uZmlndXJhdGlvblxuIik7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCX0KLQlpZiAoIXByaXYtPmNmZy0+c2t1KSB7CisJaWYgKCFjZmcocHJpdiktPnNrdSkgewogCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIGRldmljZSBza3VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlJV0xfSU5GTyhwcml2LCAiRGV2aWNlIFNLVTogMFgleFxuIiwgcHJpdi0+Y2ZnLT5za3UpOworCUlXTF9JTkZPKHByaXYsICJEZXZpY2UgU0tVOiAweCVYXG4iLCBjZmcocHJpdiktPnNrdSk7CiAKLQlpZiAoIXByaXYtPmNmZy0+dmFsaWRfdHhfYW50ICYmICFwcml2LT5jZmctPnZhbGlkX3J4X2FudCkgeworCWlmICghY2ZnKHByaXYpLT52YWxpZF90eF9hbnQgJiYgIWNmZyhwcml2KS0+dmFsaWRfcnhfYW50KSB7CiAJCS8qIG5vdCB1c2luZyAuY2ZnIG92ZXJ3cml0ZSAqLwotCQlyYWRpb19jZmcgPSBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1JBRElPX0NPTkZJRyk7Ci0JCXByaXYtPmNmZy0+dmFsaWRfdHhfYW50ID0gRUVQUk9NX1JGX0NGR19UWF9BTlRfTVNLKHJhZGlvX2NmZyk7Ci0JCXByaXYtPmNmZy0+dmFsaWRfcnhfYW50ID0gRUVQUk9NX1JGX0NGR19SWF9BTlRfTVNLKHJhZGlvX2NmZyk7Ci0JCWlmICghcHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQgfHwgIXByaXYtPmNmZy0+dmFsaWRfcnhfYW50KSB7Ci0JCQlJV0xfRVJSKHByaXYsICJJbnZhbGlkIGNoYWluICgwWCV4LCAwWCV4KVxuIiwKLQkJCQlwcml2LT5jZmctPnZhbGlkX3R4X2FudCwKLQkJCQlwcml2LT5jZmctPnZhbGlkX3J4X2FudCk7CisJCXJhZGlvX2NmZyA9IGl3bF9lZXByb21fcXVlcnkxNihzaHJkLCBFRVBST01fUkFESU9fQ09ORklHKTsKKwkJY2ZnKHByaXYpLT52YWxpZF90eF9hbnQgPSBFRVBST01fUkZfQ0ZHX1RYX0FOVF9NU0socmFkaW9fY2ZnKTsKKwkJY2ZnKHByaXYpLT52YWxpZF9yeF9hbnQgPSBFRVBST01fUkZfQ0ZHX1JYX0FOVF9NU0socmFkaW9fY2ZnKTsKKwkJaWYgKCFjZmcocHJpdiktPnZhbGlkX3R4X2FudCB8fCAhY2ZnKHByaXYpLT52YWxpZF9yeF9hbnQpIHsKKwkJCUlXTF9FUlIocHJpdiwgIkludmFsaWQgY2hhaW4gKDB4JVgsIDB4JVgpXG4iLAorCQkJCWNmZyhwcml2KS0+dmFsaWRfdHhfYW50LAorCQkJCWNmZyhwcml2KS0+dmFsaWRfcnhfYW50KTsKIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCUlXTF9JTkZPKHByaXYsICJWYWxpZCBUeCBhbnQ6IDBYJXgsIFZhbGlkIFJ4IGFudDogMFgleFxuIiwKLQkJCSBwcml2LT5jZmctPnZhbGlkX3R4X2FudCwgcHJpdi0+Y2ZnLT52YWxpZF9yeF9hbnQpOworCQlJV0xfSU5GTyhwcml2LCAiVmFsaWQgVHggYW50OiAweCVYLCBWYWxpZCBSeCBhbnQ6IDB4JVhcbiIsCisJCQkgY2ZnKHByaXYpLT52YWxpZF90eF9hbnQsIGNmZyhwcml2KS0+dmFsaWRfcnhfYW50KTsKIAl9CiAJLyoKIAkgKiBmb3Igc29tZSBzcGVjaWFsIGNhc2VzLApAQCAtMjg5LDkgKzI5MCw5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaXdsX2VlcHJvbV9nZXRfbWFjKGNvbnN0IHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggKm1hYykKK3ZvaWQgaXdsX2VlcHJvbV9nZXRfbWFjKGNvbnN0IHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkLCB1OCAqbWFjKQogewotCWNvbnN0IHU4ICphZGRyID0gaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsCisJY29uc3QgdTggKmFkZHIgPSBpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoc2hyZCwKIAkJCQkJRUVQUk9NX01BQ19BRERSRVNTKTsKIAltZW1jcHkobWFjLCBhZGRyLCBFVEhfQUxFTik7CiB9CkBAIC0zMDIsMTkgKzMwMywxOSBAQAogICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIHZvaWQgaXdsX3NldF9vdHBfYWNjZXNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgZW51bSBpd2xfYWNjZXNzX21vZGUgbW9kZSkKK3N0YXRpYyB2b2lkIGl3bF9zZXRfb3RwX2FjY2VzcyhzdHJ1Y3QgaXdsX2J1cyAqYnVzLCBlbnVtIGl3bF9hY2Nlc3NfbW9kZSBtb2RlKQogewotCWl3bF9yZWFkMzIoYnVzKHByaXYpLCBDU1JfT1RQX0dQX1JFRyk7CisJaXdsX3JlYWQzMihidXMsIENTUl9PVFBfR1BfUkVHKTsKIAogCWlmIChtb2RlID09IElXTF9PVFBfQUNDRVNTX0FCU09MVVRFKQotCQlpd2xfY2xlYXJfYml0KGJ1cyhwcml2KSwgQ1NSX09UUF9HUF9SRUcsCisJCWl3bF9jbGVhcl9iaXQoYnVzLCBDU1JfT1RQX0dQX1JFRywKIAkJCSAgICAgIENTUl9PVFBfR1BfUkVHX09UUF9BQ0NFU1NfTU9ERSk7CiAJZWxzZQotCQlpd2xfc2V0X2JpdChidXMocHJpdiksIENTUl9PVFBfR1BfUkVHLAorCQlpd2xfc2V0X2JpdChidXMsIENTUl9PVFBfR1BfUkVHLAogCQkJICAgIENTUl9PVFBfR1BfUkVHX09UUF9BQ0NFU1NfTU9ERSk7CiB9CiAKLXN0YXRpYyBpbnQgaXdsX2dldF9udm1fdHlwZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBod19yZXYpCitzdGF0aWMgaW50IGl3bF9nZXRfbnZtX3R5cGUoc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIGh3X3JldikKIHsKIAl1MzIgb3RwZ3A7CiAJaW50IG52bV90eXBlOwpAQCAtMzIyLDcgKzMyMyw3IEBACiAJLyogT1RQIG9ubHkgdmFsaWQgZm9yIENQL1BQIGFuZCBhZnRlciAqLwogCXN3aXRjaCAoaHdfcmV2ICYgQ1NSX0hXX1JFVl9UWVBFX01TSykgewogCWNhc2UgQ1NSX0hXX1JFVl9UWVBFX05PTkU6Ci0JCUlXTF9FUlIocHJpdiwgIlVua25vd24gaGFyZHdhcmUgdHlwZVxuIik7CisJCUlXTF9FUlIoYnVzLCAiVW5rbm93biBoYXJkd2FyZSB0eXBlXG4iKTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJY2FzZSBDU1JfSFdfUkVWX1RZUEVfNTMwMDoKIAljYXNlIENTUl9IV19SRVZfVFlQRV81MzUwOgpAQCAtMzMxLDcgKzMzMiw3IEBACiAJCW52bV90eXBlID0gTlZNX0RFVklDRV9UWVBFX0VFUFJPTTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJb3RwZ3AgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgQ1NSX09UUF9HUF9SRUcpOworCQlvdHBncCA9IGl3bF9yZWFkMzIoYnVzLCBDU1JfT1RQX0dQX1JFRyk7CiAJCWlmIChvdHBncCAmIENTUl9PVFBfR1BfUkVHX0RFVklDRV9TRUxFQ1QpCiAJCQludm1fdHlwZSA9IE5WTV9ERVZJQ0VfVFlQRV9PVFA7CiAJCWVsc2UKQEAgLTM0MSw3MyArMzQyLDczIEBACiAJcmV0dXJuICBudm1fdHlwZTsKIH0KIAotc3RhdGljIGludCBpd2xfaW5pdF9vdHBfYWNjZXNzKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3N0YXRpYyBpbnQgaXdsX2luaXRfb3RwX2FjY2VzcyhzdHJ1Y3QgaXdsX2J1cyAqYnVzKQogewogCWludCByZXQ7CiAKIAkvKiBFbmFibGUgNDBNSHogcmFkaW8gY2xvY2sgKi8KLQlpd2xfd3JpdGUzMihidXMocHJpdiksIENTUl9HUF9DTlRSTCwKLQkJICAgIGl3bF9yZWFkMzIoYnVzKHByaXYpLCBDU1JfR1BfQ05UUkwpIHwKKwlpd2xfd3JpdGUzMihidXMsIENTUl9HUF9DTlRSTCwKKwkJICAgIGl3bF9yZWFkMzIoYnVzLCBDU1JfR1BfQ05UUkwpIHwKIAkJICAgIENTUl9HUF9DTlRSTF9SRUdfRkxBR19JTklUX0RPTkUpOwogCiAJLyogd2FpdCBmb3IgY2xvY2sgdG8gYmUgcmVhZHkgKi8KLQlyZXQgPSBpd2xfcG9sbF9iaXQoYnVzKHByaXYpLCBDU1JfR1BfQ05UUkwsCisJcmV0ID0gaXdsX3BvbGxfYml0KGJ1cywgQ1NSX0dQX0NOVFJMLAogCQkJCSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZLAogCQkJCSBDU1JfR1BfQ05UUkxfUkVHX0ZMQUdfTUFDX0NMT0NLX1JFQURZLAogCQkJCSAyNTAwMCk7CiAJaWYgKHJldCA8IDApCi0JCUlXTF9FUlIocHJpdiwgIlRpbWUgb3V0IGFjY2VzcyBPVFBcbiIpOworCQlJV0xfRVJSKGJ1cywgIlRpbWUgb3V0IGFjY2VzcyBPVFBcbiIpOwogCWVsc2UgewotCQlpd2xfc2V0X2JpdHNfcHJwaChidXMocHJpdiksIEFQTUdfUFNfQ1RSTF9SRUcsCisJCWl3bF9zZXRfYml0c19wcnBoKGJ1cywgQVBNR19QU19DVFJMX1JFRywKIAkJCQkgIEFQTUdfUFNfQ1RSTF9WQUxfUkVTRVRfUkVRKTsKIAkJdWRlbGF5KDUpOwotCQlpd2xfY2xlYXJfYml0c19wcnBoKGJ1cyhwcml2KSwgQVBNR19QU19DVFJMX1JFRywKKwkJaXdsX2NsZWFyX2JpdHNfcHJwaChidXMsIEFQTUdfUFNfQ1RSTF9SRUcsCiAJCQkJICAgIEFQTUdfUFNfQ1RSTF9WQUxfUkVTRVRfUkVRKTsKIAogCQkvKgogCQkgKiBDU1IgYXV0byBjbG9jayBnYXRlIGRpc2FibGUgYml0IC0KIAkJICogdGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIEhXIHdpdGggT1RQIHNoYWRvdyBSQU0KIAkJICovCi0JCWlmIChwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5zaGFkb3dfcmFtX3N1cHBvcnQpCi0JCQlpd2xfc2V0X2JpdChidXMocHJpdiksIENTUl9EQkdfTElOS19QV1JfTUdNVF9SRUcsCisJCWlmIChjZmcoYnVzKS0+YmFzZV9wYXJhbXMtPnNoYWRvd19yYW1fc3VwcG9ydCkKKwkJCWl3bF9zZXRfYml0KGJ1cywgQ1NSX0RCR19MSU5LX1BXUl9NR01UX1JFRywKIAkJCQlDU1JfUkVTRVRfTElOS19QV1JfTUdNVF9ESVNBQkxFRCk7CiAJfQogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaXdsX3JlYWRfb3RwX3dvcmQoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1MTYgYWRkciwgX19sZTE2ICplZXByb21fZGF0YSkKK3N0YXRpYyBpbnQgaXdsX3JlYWRfb3RwX3dvcmQoc3RydWN0IGl3bF9idXMgKmJ1cywgdTE2IGFkZHIsIF9fbGUxNiAqZWVwcm9tX2RhdGEpCiB7CiAJaW50IHJldCA9IDA7CiAJdTMyIHI7CiAJdTMyIG90cGdwOwogCi0JaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfRUVQUk9NX1JFRywKKwlpd2xfd3JpdGUzMihidXMsIENTUl9FRVBST01fUkVHLAogCQkgICAgQ1NSX0VFUFJPTV9SRUdfTVNLX0FERFIgJiAoYWRkciA8PCAxKSk7Ci0JcmV0ID0gaXdsX3BvbGxfYml0KGJ1cyhwcml2KSwgQ1NSX0VFUFJPTV9SRUcsCisJcmV0ID0gaXdsX3BvbGxfYml0KGJ1cywgQ1NSX0VFUFJPTV9SRUcsCiAJCQkJIENTUl9FRVBST01fUkVHX1JFQURfVkFMSURfTVNLLAogCQkJCSBDU1JfRUVQUk9NX1JFR19SRUFEX1ZBTElEX01TSywKIAkJCQkgSVdMX0VFUFJPTV9BQ0NFU1NfVElNRU9VVCk7CiAJaWYgKHJldCA8IDApIHsKLQkJSVdMX0VSUihwcml2LCAiVGltZSBvdXQgcmVhZGluZyBPVFBbJWRdXG4iLCBhZGRyKTsKKwkJSVdMX0VSUihidXMsICJUaW1lIG91dCByZWFkaW5nIE9UUFslZF1cbiIsIGFkZHIpOwogCQlyZXR1cm4gcmV0OwogCX0KLQlyID0gaXdsX3JlYWQzMihidXMocHJpdiksIENTUl9FRVBST01fUkVHKTsKKwlyID0gaXdsX3JlYWQzMihidXMsIENTUl9FRVBST01fUkVHKTsKIAkvKiBjaGVjayBmb3IgRUNDIGVycm9yczogKi8KLQlvdHBncCA9IGl3bF9yZWFkMzIoYnVzKHByaXYpLCBDU1JfT1RQX0dQX1JFRyk7CisJb3RwZ3AgPSBpd2xfcmVhZDMyKGJ1cywgQ1NSX09UUF9HUF9SRUcpOwogCWlmIChvdHBncCAmIENTUl9PVFBfR1BfUkVHX0VDQ19VTkNPUlJfU1RBVFVTX01TSykgewogCQkvKiBzdG9wIGluIHRoaXMgY2FzZSAqLwogCQkvKiBzZXQgdGhlIHVuY29ycmVjdGFibGUgT1RQIEVDQyBiaXQgZm9yIGFja25vd2xlZGdlbWVudCAqLwotCQlpd2xfc2V0X2JpdChidXMocHJpdiksIENTUl9PVFBfR1BfUkVHLAorCQlpd2xfc2V0X2JpdChidXMsIENTUl9PVFBfR1BfUkVHLAogCQkJQ1NSX09UUF9HUF9SRUdfRUNDX1VOQ09SUl9TVEFUVVNfTVNLKTsKLQkJSVdMX0VSUihwcml2LCAiVW5jb3JyZWN0YWJsZSBPVFAgRUNDIGVycm9yLCBhYm9ydCBPVFAgcmVhZFxuIik7CisJCUlXTF9FUlIoYnVzLCAiVW5jb3JyZWN0YWJsZSBPVFAgRUNDIGVycm9yLCBhYm9ydCBPVFAgcmVhZFxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAob3RwZ3AgJiBDU1JfT1RQX0dQX1JFR19FQ0NfQ09SUl9TVEFUVVNfTVNLKSB7CiAJCS8qIGNvbnRpbnVlIGluIHRoaXMgY2FzZSAqLwogCQkvKiBzZXQgdGhlIGNvcnJlY3RhYmxlIE9UUCBFQ0MgYml0IGZvciBhY2tub3dsZWRnZW1lbnQgKi8KLQkJaXdsX3NldF9iaXQoYnVzKHByaXYpLCBDU1JfT1RQX0dQX1JFRywKKwkJaXdsX3NldF9iaXQoYnVzLCBDU1JfT1RQX0dQX1JFRywKIAkJCQlDU1JfT1RQX0dQX1JFR19FQ0NfQ09SUl9TVEFUVVNfTVNLKTsKLQkJSVdMX0VSUihwcml2LCAiQ29ycmVjdGFibGUgT1RQIEVDQyBlcnJvciwgY29udGludWUgcmVhZFxuIik7CisJCUlXTF9FUlIoYnVzLCAiQ29ycmVjdGFibGUgT1RQIEVDQyBlcnJvciwgY29udGludWUgcmVhZFxuIik7CiAJfQogCSplZXByb21fZGF0YSA9IGNwdV90b19sZTE2KHIgPj4gMTYpOwogCXJldHVybiAwOwpAQCAtNDE2LDIwICs0MTcsMjAgQEAKIC8qCiAgKiBpd2xfaXNfb3RwX2VtcHR5OiBjaGVjayBmb3IgZW1wdHkgT1RQCiAgKi8KLXN0YXRpYyBib29sIGl3bF9pc19vdHBfZW1wdHkoc3RydWN0IGl3bF9wcml2ICpwcml2KQorc3RhdGljIGJvb2wgaXdsX2lzX290cF9lbXB0eShzdHJ1Y3QgaXdsX2J1cyAqYnVzKQogewogCXUxNiBuZXh0X2xpbmtfYWRkciA9IDA7CiAJX19sZTE2IGxpbmtfdmFsdWU7CiAJYm9vbCBpc19lbXB0eSA9IGZhbHNlOwogCiAJLyogbG9jYXRlIHRoZSBiZWdpbm5pbmcgb2YgT1RQIGxpbmsgbGlzdCAqLwotCWlmICghaXdsX3JlYWRfb3RwX3dvcmQocHJpdiwgbmV4dF9saW5rX2FkZHIsICZsaW5rX3ZhbHVlKSkgeworCWlmICghaXdsX3JlYWRfb3RwX3dvcmQoYnVzLCBuZXh0X2xpbmtfYWRkciwgJmxpbmtfdmFsdWUpKSB7CiAJCWlmICghbGlua192YWx1ZSkgewotCQkJSVdMX0VSUihwcml2LCAiT1RQIGlzIGVtcHR5XG4iKTsKKwkJCUlXTF9FUlIoYnVzLCAiT1RQIGlzIGVtcHR5XG4iKTsKIAkJCWlzX2VtcHR5ID0gdHJ1ZTsKIAkJfQogCX0gZWxzZSB7Ci0JCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byByZWFkIGZpcnN0IGJsb2NrIG9mIE9UUCBsaXN0LlxuIik7CisJCUlXTF9FUlIoYnVzLCAiVW5hYmxlIHRvIHJlYWQgZmlyc3QgYmxvY2sgb2YgT1RQIGxpc3QuXG4iKTsKIAkJaXNfZW1wdHkgPSB0cnVlOwogCX0KIApAQCAtNDQ2LDcgKzQ0Nyw3IEBACiAgKiAgIHdlIHNob3VsZCByZWFkIGFuZCB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgZGV2aWNlLgogICogICBvbmx5IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gaWYgc2hhZG93IFJBTSBpcyBkaXNhYmxlZAogICovCi1zdGF0aWMgaW50IGl3bF9maW5kX290cF9pbWFnZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCitzdGF0aWMgaW50IGl3bF9maW5kX290cF9pbWFnZShzdHJ1Y3QgaXdsX2J1cyAqYnVzLAogCQkJCQl1MTYgKnZhbGlkYmxvY2thZGRyKQogewogCXUxNiBuZXh0X2xpbmtfYWRkciA9IDAsIHZhbGlkX2FkZHI7CkBAIC00NTQsMTAgKzQ1NSwxMCBAQAogCWludCB1c2VkYmxvY2tzID0gMDsKIAogCS8qIHNldCBhZGRyZXNzaW5nIG1vZGUgdG8gYWJzb2x1dGUgdG8gdHJhdmVyc2UgdGhlIGxpbmsgbGlzdCAqLwotCWl3bF9zZXRfb3RwX2FjY2Vzcyhwcml2LCBJV0xfT1RQX0FDQ0VTU19BQlNPTFVURSk7CisJaXdsX3NldF9vdHBfYWNjZXNzKGJ1cywgSVdMX09UUF9BQ0NFU1NfQUJTT0xVVEUpOwogCiAJLyogY2hlY2tpbmcgZm9yIGVtcHR5IE9UUCBvciBlcnJvciAqLwotCWlmIChpd2xfaXNfb3RwX2VtcHR5KHByaXYpKQorCWlmIChpd2xfaXNfb3RwX2VtcHR5KGJ1cykpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJLyoKQEAgLTQ3MSw5ICs0NzIsOSBAQAogCQkgKi8KIAkJdmFsaWRfYWRkciA9IG5leHRfbGlua19hZGRyOwogCQluZXh0X2xpbmtfYWRkciA9IGxlMTZfdG9fY3B1KGxpbmtfdmFsdWUpICogc2l6ZW9mKHUxNik7Ci0JCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIk9UUCBibG9ja3MgJWQgYWRkciAweCV4XG4iLAorCQlJV0xfREVCVUdfRUVQUk9NKGJ1cywgIk9UUCBibG9ja3MgJWQgYWRkciAweCV4XG4iLAogCQkJICAgICAgIHVzZWRibG9ja3MsIG5leHRfbGlua19hZGRyKTsKLQkJaWYgKGl3bF9yZWFkX290cF93b3JkKHByaXYsIG5leHRfbGlua19hZGRyLCAmbGlua192YWx1ZSkpCisJCWlmIChpd2xfcmVhZF9vdHBfd29yZChidXMsIG5leHRfbGlua19hZGRyLCAmbGlua192YWx1ZSkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKCFsaW5rX3ZhbHVlKSB7CiAJCQkvKgpAQCAtNDg4LDEwICs0ODksMTAgQEAKIAkJfQogCQkvKiBtb3JlIGluIHRoZSBsaW5rIGxpc3QsIGNvbnRpbnVlICovCiAJCXVzZWRibG9ja3MrKzsKLQl9IHdoaWxlICh1c2VkYmxvY2tzIDw9IHByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm1heF9sbF9pdGVtcyk7CisJfSB3aGlsZSAodXNlZGJsb2NrcyA8PSBjZmcoYnVzKS0+YmFzZV9wYXJhbXMtPm1heF9sbF9pdGVtcyk7CiAKIAkvKiBPVFAgaGFzIG5vIHZhbGlkIGJsb2NrcyAqLwotCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIk9UUCBoYXMgbm8gdmFsaWQgYmxvY2tzXG4iKTsKKwlJV0xfREVCVUdfRUVQUk9NKGJ1cywgIk9UUCBoYXMgbm8gdmFsaWQgYmxvY2tzXG4iKTsKIAlyZXR1cm4gLUVJTlZBTDsKIH0KIApAQCAtNTA0LDI4ICs1MDUsMjggQEAKICAqIGl3bF9nZXRfbWF4X3R4cG93ZXJfYXZnIC0gZ2V0IHRoZSBoaWdoZXN0IHR4IHBvd2VyIGZyb20gYWxsIGNoYWlucy4KICAqICAgICBmaW5kIHRoZSBoaWdoZXN0IHR4IHBvd2VyIGZyb20gYWxsIGNoYWlucyBmb3IgdGhlIGNoYW5uZWwKICAqLwotc3RhdGljIHM4IGl3bF9nZXRfbWF4X3R4cG93ZXJfYXZnKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKK3N0YXRpYyBzOCBpd2xfZ2V0X21heF90eHBvd2VyX2F2ZyhzdHJ1Y3QgaXdsX2NmZyAqY2ZnLAogCQlzdHJ1Y3QgaXdsX2VlcHJvbV9lbmhhbmNlZF90eHB3ciAqZW5oYW5jZWRfdHhwb3dlciwKIAkJaW50IGVsZW1lbnQsIHM4ICptYXhfdHhwb3dlcl9pbl9oYWxmX2RibSkKIHsKIAlzOCBtYXhfdHhwb3dlcl9hdmcgPSAwOyAvKiAoZEJtKSAqLwogCiAJLyogVGFrZSB0aGUgaGlnaGVzdCB0eCBwb3dlciBmcm9tIGFueSB2YWxpZCBjaGFpbnMgKi8KLQlpZiAoKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50ICYgQU5UX0EpICYmCisJaWYgKChjZmctPnZhbGlkX3R4X2FudCAmIEFOVF9BKSAmJgogCSAgICAoZW5oYW5jZWRfdHhwb3dlcltlbGVtZW50XS5jaGFpbl9hX21heCA+IG1heF90eHBvd2VyX2F2ZykpCiAJCW1heF90eHBvd2VyX2F2ZyA9IGVuaGFuY2VkX3R4cG93ZXJbZWxlbWVudF0uY2hhaW5fYV9tYXg7Ci0JaWYgKChwcml2LT5jZmctPnZhbGlkX3R4X2FudCAmIEFOVF9CKSAmJgorCWlmICgoY2ZnLT52YWxpZF90eF9hbnQgJiBBTlRfQikgJiYKIAkgICAgKGVuaGFuY2VkX3R4cG93ZXJbZWxlbWVudF0uY2hhaW5fYl9tYXggPiBtYXhfdHhwb3dlcl9hdmcpKQogCQltYXhfdHhwb3dlcl9hdmcgPSBlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLmNoYWluX2JfbWF4OwotCWlmICgocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQgJiBBTlRfQykgJiYKKwlpZiAoKGNmZy0+dmFsaWRfdHhfYW50ICYgQU5UX0MpICYmCiAJICAgIChlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLmNoYWluX2NfbWF4ID4gbWF4X3R4cG93ZXJfYXZnKSkKIAkJbWF4X3R4cG93ZXJfYXZnID0gZW5oYW5jZWRfdHhwb3dlcltlbGVtZW50XS5jaGFpbl9jX21heDsKLQlpZiAoKChwcml2LT5jZmctPnZhbGlkX3R4X2FudCA9PSBBTlRfQUIpIHwKLQkgICAgKHByaXYtPmNmZy0+dmFsaWRfdHhfYW50ID09IEFOVF9CQykgfAotCSAgICAocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQgPT0gQU5UX0FDKSkgJiYKKwlpZiAoKChjZmctPnZhbGlkX3R4X2FudCA9PSBBTlRfQUIpIHwKKwkgICAgKGNmZy0+dmFsaWRfdHhfYW50ID09IEFOVF9CQykgfAorCSAgICAoY2ZnLT52YWxpZF90eF9hbnQgPT0gQU5UX0FDKSkgJiYKIAkgICAgKGVuaGFuY2VkX3R4cG93ZXJbZWxlbWVudF0ubWltbzJfbWF4ID4gbWF4X3R4cG93ZXJfYXZnKSkKIAkJbWF4X3R4cG93ZXJfYXZnID0gIGVuaGFuY2VkX3R4cG93ZXJbZWxlbWVudF0ubWltbzJfbWF4OwotCWlmICgocHJpdi0+Y2ZnLT52YWxpZF90eF9hbnQgPT0gQU5UX0FCQykgJiYKKwlpZiAoKGNmZy0+dmFsaWRfdHhfYW50ID09IEFOVF9BQkMpICYmCiAJICAgIChlbmhhbmNlZF90eHBvd2VyW2VsZW1lbnRdLm1pbW8zX21heCA+IG1heF90eHBvd2VyX2F2ZykpCiAJCW1heF90eHBvd2VyX2F2ZyA9IGVuaGFuY2VkX3R4cG93ZXJbZWxlbWVudF0ubWltbzNfbWF4OwogCkBAIC01ODIsNiArNTgzLDcgQEAKIAogdm9pZCBpd2xfZWVwcm9tX2VuaGFuY2VkX3R4cG93ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KQogeworCXN0cnVjdCBpd2xfc2hhcmVkICpzaHJkID0gcHJpdi0+c2hyZDsKIAlzdHJ1Y3QgaXdsX2VlcHJvbV9lbmhhbmNlZF90eHB3ciAqdHhwX2FycmF5LCAqdHhwOwogCWludCBpZHgsIGVudHJpZXM7CiAJX19sZTE2ICp0eHBfbGVuOwpAQCAtNTkwLDEwICs1OTIsMTAgQEAKIAlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCBpd2xfZWVwcm9tX2VuaGFuY2VkX3R4cHdyKSAhPSA4KTsKIAogCS8qIHRoZSBsZW5ndGggaXMgaW4gMTYtYml0IHdvcmRzLCBidXQgd2Ugd2FudCBlbnRyaWVzICovCi0JdHhwX2xlbiA9IChfX2xlMTYgKikgaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIEVFUFJPTV9UWFBfU1pfT0ZGUyk7CisJdHhwX2xlbiA9IChfX2xlMTYgKikgaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHNocmQsIEVFUFJPTV9UWFBfU1pfT0ZGUyk7CiAJZW50cmllcyA9IGxlMTZfdG9fY3B1cCh0eHBfbGVuKSAqIDIgLyBFRVBST01fVFhQX0VOVFJZX0xFTjsKIAotCXR4cF9hcnJheSA9ICh2b2lkICopIGl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBFRVBST01fVFhQX09GRlMpOworCXR4cF9hcnJheSA9ICh2b2lkICopIGl3bF9lZXByb21fcXVlcnlfYWRkcihzaHJkLCBFRVBST01fVFhQX09GRlMpOwogCiAJZm9yIChpZHggPSAwOyBpZHggPCBlbnRyaWVzOyBpZHgrKykgewogCQl0eHAgPSAmdHhwX2FycmF5W2lkeF07CkBAIC02MjcsNyArNjI5LDcgQEAKIAkJCQkgKCh0eHAtPmRlbHRhXzIwX2luXzQwICYgMHhmMCkgPj4gNCksCiAJCQkJICh0eHAtPmRlbHRhXzIwX2luXzQwICYgMHgwZikpOwogCi0JCW1heF90eHBfYXZnID0gaXdsX2dldF9tYXhfdHhwb3dlcl9hdmcocHJpdiwgdHhwX2FycmF5LCBpZHgsCisJCW1heF90eHBfYXZnID0gaXdsX2dldF9tYXhfdHhwb3dlcl9hdmcoY2ZnKHByaXYpLCB0eHBfYXJyYXksIGlkeCwKIAkJCQkJCSAgICAgICZtYXhfdHhwX2F2Z19oYWxmZGJtKTsKIAogCQkvKgpAQCAtNjQ2LDEyICs2NDgsMTMgQEAKIC8qKgogICogaXdsX2VlcHJvbV9pbml0IC0gcmVhZCBFRVBST00gY29udGVudHMKICAqCi0gKiBMb2FkIHRoZSBFRVBST00gY29udGVudHMgZnJvbSBhZGFwdGVyIGludG8gcHJpdi0+ZWVwcm9tCisgKiBMb2FkIHRoZSBFRVBST00gY29udGVudHMgZnJvbSBhZGFwdGVyIGludG8gc2hyZC0+ZWVwcm9tCiAgKgogICogTk9URTogIFRoaXMgcm91dGluZSB1c2VzIHRoZSBub24tZGVidWcgSU8gYWNjZXNzIGZ1bmN0aW9ucy4KICAqLwogaW50IGl3bF9lZXByb21faW5pdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHUzMiBod19yZXYpCiB7CisJc3RydWN0IGl3bF9zaGFyZWQgKnNocmQgPSBwcml2LT5zaHJkOwogCV9fbGUxNiAqZTsKIAl1MzIgZ3AgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgQ1NSX0VFUFJPTV9HUCk7CiAJaW50IHN6OwpAQCAtNjYwLDIyICs2NjMsMjIgQEAKIAl1MTYgdmFsaWRibG9ja2FkZHIgPSAwOwogCXUxNiBjYWNoZV9hZGRyID0gMDsKIAotCXByaXYtPm52bV9kZXZpY2VfdHlwZSA9IGl3bF9nZXRfbnZtX3R5cGUocHJpdiwgaHdfcmV2KTsKLQlpZiAocHJpdi0+bnZtX2RldmljZV90eXBlID09IC1FTk9FTlQpCisJdHJhbnMocHJpdiktPm52bV9kZXZpY2VfdHlwZSA9IGl3bF9nZXRfbnZtX3R5cGUoYnVzKHByaXYpLCBod19yZXYpOworCWlmICh0cmFucyhwcml2KS0+bnZtX2RldmljZV90eXBlID09IC1FTk9FTlQpCiAJCXJldHVybiAtRU5PRU5UOwogCS8qIGFsbG9jYXRlIGVlcHJvbSAqLwotCXN6ID0gcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemU7CisJc3ogPSBjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5lZXByb21fc2l6ZTsKIAlJV0xfREVCVUdfRUVQUk9NKHByaXYsICJOVk0gc2l6ZSA9ICVkXG4iLCBzeik7Ci0JcHJpdi0+ZWVwcm9tID0ga3phbGxvYyhzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcml2LT5lZXByb20pIHsKKwlzaHJkLT5lZXByb20gPSBremFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNocmQtPmVlcHJvbSkgewogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIGFsbG9jX2VycjsKIAl9Ci0JZSA9IChfX2xlMTYgKilwcml2LT5lZXByb207CisJZSA9IChfX2xlMTYgKilzaHJkLT5lZXByb207CiAKIAlpd2xfYXBtX2luaXQocHJpdik7CiAKLQlyZXQgPSBpd2xfZWVwcm9tX3ZlcmlmeV9zaWduYXR1cmUocHJpdik7CisJcmV0ID0gaXdsX2VlcHJvbV92ZXJpZnlfc2lnbmF0dXJlKHRyYW5zKHByaXYpKTsKIAlpZiAocmV0IDwgMCkgewogCQlJV0xfRVJSKHByaXYsICJFRVBST00gbm90IGZvdW5kLCBFRVBST01fR1A9MHglMDh4XG4iLCBncCk7CiAJCXJldCA9IC1FTk9FTlQ7CkBAIC02ODMsMTYgKzY4NiwxNiBAQAogCX0KIAogCS8qIE1ha2Ugc3VyZSBkcml2ZXIgKGluc3RlYWQgb2YgdUNvZGUpIGlzIGFsbG93ZWQgdG8gcmVhZCBFRVBST00gKi8KLQlyZXQgPSBpd2xfZWVwcm9tX2FjcXVpcmVfc2VtYXBob3JlKHByaXYpOworCXJldCA9IGl3bF9lZXByb21fYWNxdWlyZV9zZW1hcGhvcmUoYnVzKHByaXYpKTsKIAlpZiAocmV0IDwgMCkgewogCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gYWNxdWlyZSBFRVBST00gc2VtYXBob3JlLlxuIik7CiAJCXJldCA9IC1FTk9FTlQ7CiAJCWdvdG8gZXJyOwogCX0KIAotCWlmIChwcml2LT5udm1fZGV2aWNlX3R5cGUgPT0gTlZNX0RFVklDRV9UWVBFX09UUCkgeworCWlmICh0cmFucyhwcml2KS0+bnZtX2RldmljZV90eXBlID09IE5WTV9ERVZJQ0VfVFlQRV9PVFApIHsKIAotCQlyZXQgPSBpd2xfaW5pdF9vdHBfYWNjZXNzKHByaXYpOworCQlyZXQgPSBpd2xfaW5pdF9vdHBfYWNjZXNzKGJ1cyhwcml2KSk7CiAJCWlmIChyZXQpIHsKIAkJCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byBpbml0aWFsaXplIE9UUCBhY2Nlc3MuXG4iKTsKIAkJCXJldCA9IC1FTk9FTlQ7CkBAIC03MDYsOCArNzA5LDggQEAKIAkJCSAgICAgQ1NSX09UUF9HUF9SRUdfRUNDX0NPUlJfU1RBVFVTX01TSyB8CiAJCQkgICAgIENTUl9PVFBfR1BfUkVHX0VDQ19VTkNPUlJfU1RBVFVTX01TSyk7CiAJCS8qIHRyYXZlcnNpbmcgdGhlIGxpbmtlZCBsaXN0IGlmIG5vIHNoYWRvdyByYW0gc3VwcG9ydGVkICovCi0JCWlmICghcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+c2hhZG93X3JhbV9zdXBwb3J0KSB7Ci0JCQlpZiAoaXdsX2ZpbmRfb3RwX2ltYWdlKHByaXYsICZ2YWxpZGJsb2NrYWRkcikpIHsKKwkJaWYgKCFjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5zaGFkb3dfcmFtX3N1cHBvcnQpIHsKKwkJCWlmIChpd2xfZmluZF9vdHBfaW1hZ2UoYnVzKHByaXYpLCAmdmFsaWRibG9ja2FkZHIpKSB7CiAJCQkJcmV0ID0gLUVOT0VOVDsKIAkJCQlnb3RvIGRvbmU7CiAJCQl9CkBAIC03MTYsNyArNzE5LDcgQEAKIAkJICAgICBhZGRyICs9IHNpemVvZih1MTYpKSB7CiAJCQlfX2xlMTYgZWVwcm9tX2RhdGE7CiAKLQkJCXJldCA9IGl3bF9yZWFkX290cF93b3JkKHByaXYsIGFkZHIsICZlZXByb21fZGF0YSk7CisJCQlyZXQgPSBpd2xfcmVhZF9vdHBfd29yZChidXMocHJpdiksIGFkZHIsICZlZXByb21fZGF0YSk7CiAJCQlpZiAocmV0KQogCQkJCWdvdG8gZG9uZTsKIAkJCWVbY2FjaGVfYWRkciAvIDJdID0gZWVwcm9tX2RhdGE7CkBAIC03NDQsMjcgKzc0NywyNyBAQAogCX0KIAogCUlXTF9ERUJVR19FRVBST00ocHJpdiwgIk5WTSBUeXBlOiAlcywgdmVyc2lvbjogMHgleFxuIiwKLQkJICAgICAgIChwcml2LT5udm1fZGV2aWNlX3R5cGUgPT0gTlZNX0RFVklDRV9UWVBFX09UUCkKKwkJICAgICAgICh0cmFucyhwcml2KS0+bnZtX2RldmljZV90eXBlID09IE5WTV9ERVZJQ0VfVFlQRV9PVFApCiAJCSAgICAgICA/ICJPVFAiIDogIkVFUFJPTSIsCi0JCSAgICAgICBpd2xfZWVwcm9tX3F1ZXJ5MTYocHJpdiwgRUVQUk9NX1ZFUlNJT04pKTsKKwkJICAgICAgIGl3bF9lZXByb21fcXVlcnkxNihzaHJkLCBFRVBST01fVkVSU0lPTikpOwogCiAJcmV0ID0gMDsKIGRvbmU6Ci0JaXdsX2VlcHJvbV9yZWxlYXNlX3NlbWFwaG9yZShwcml2KTsKKwlpd2xfZWVwcm9tX3JlbGVhc2Vfc2VtYXBob3JlKGJ1cyhwcml2KSk7CiAKIGVycjoKIAlpZiAocmV0KQotCQlpd2xfZWVwcm9tX2ZyZWUocHJpdik7CisJCWl3bF9lZXByb21fZnJlZShwcml2LT5zaHJkKTsKIAkvKiBSZXNldCBjaGlwIHRvIHNhdmUgcG93ZXIgdW50aWwgd2UgbG9hZCB1Q29kZSBkdXJpbmcgInVwIi4gKi8KIAlpd2xfYXBtX3N0b3AocHJpdik7CiBhbGxvY19lcnI6CiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCBpd2xfZWVwcm9tX2ZyZWUoc3RydWN0IGl3bF9wcml2ICpwcml2KQordm9pZCBpd2xfZWVwcm9tX2ZyZWUoc3RydWN0IGl3bF9zaGFyZWQgKnNocmQpCiB7Ci0Ja2ZyZWUocHJpdi0+ZWVwcm9tKTsKLQlwcml2LT5lZXByb20gPSBOVUxMOworCWtmcmVlKHNocmQtPmVlcHJvbSk7CisJc2hyZC0+ZWVwcm9tID0gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgaXdsX2luaXRfYmFuZF9yZWZlcmVuY2UoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LApAQCAtNzcyLDQ5ICs3NzUsNTAgQEAKIAkJCWNvbnN0IHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKiplZXByb21fY2hfaW5mbywKIAkJCWNvbnN0IHU4ICoqZWVwcm9tX2NoX2luZGV4KQogewotCXUzMiBvZmZzZXQgPSBwcml2LT5jZmctPmxpYi0+CisJc3RydWN0IGl3bF9zaGFyZWQgKnNocmQgPSBwcml2LT5zaHJkOworCXUzMiBvZmZzZXQgPSBjZmcocHJpdiktPmxpYi0+CiAJCQllZXByb21fb3BzLnJlZ3VsYXRvcnlfYmFuZHNbZWVwX2JhbmQgLSAxXTsKIAlzd2l0Y2ggKGVlcF9iYW5kKSB7CiAJY2FzZSAxOgkJLyogMi40R0h6IGJhbmQgKi8KIAkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsX2VlcHJvbV9iYW5kXzEpOwogCQkqZWVwcm9tX2NoX2luZm8gPSAoc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCAqKQotCQkJCWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOworCQkJCWl3bF9lZXByb21fcXVlcnlfYWRkcihzaHJkLCBvZmZzZXQpOwogCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsX2VlcHJvbV9iYW5kXzE7CiAJCWJyZWFrOwogCWNhc2UgMjoJCS8qIDQuOUdIeiBiYW5kICovCiAJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGl3bF9lZXByb21fYmFuZF8yKTsKIAkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgb2Zmc2V0KTsKKwkJCQlpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoc2hyZCwgb2Zmc2V0KTsKIAkJKmVlcHJvbV9jaF9pbmRleCA9IGl3bF9lZXByb21fYmFuZF8yOwogCQlicmVhazsKIAljYXNlIDM6CQkvKiA1LjJHSHogYmFuZCAqLwogCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xfZWVwcm9tX2JhbmRfMyk7CiAJCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7CisJCQkJaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHNocmQsIG9mZnNldCk7CiAJCSplZXByb21fY2hfaW5kZXggPSBpd2xfZWVwcm9tX2JhbmRfMzsKIAkJYnJlYWs7CiAJY2FzZSA0OgkJLyogNS41R0h6IGJhbmQgKi8KIAkJKmVlcHJvbV9jaF9jb3VudCA9IEFSUkFZX1NJWkUoaXdsX2VlcHJvbV9iYW5kXzQpOwogCQkqZWVwcm9tX2NoX2luZm8gPSAoc3RydWN0IGl3bF9lZXByb21fY2hhbm5lbCAqKQotCQkJCWl3bF9lZXByb21fcXVlcnlfYWRkcihwcml2LCBvZmZzZXQpOworCQkJCWl3bF9lZXByb21fcXVlcnlfYWRkcihzaHJkLCBvZmZzZXQpOwogCQkqZWVwcm9tX2NoX2luZGV4ID0gaXdsX2VlcHJvbV9iYW5kXzQ7CiAJCWJyZWFrOwogCWNhc2UgNToJCS8qIDUuN0dIeiBiYW5kICovCiAJCSplZXByb21fY2hfY291bnQgPSBBUlJBWV9TSVpFKGl3bF9lZXByb21fYmFuZF81KTsKIAkJKmVlcHJvbV9jaF9pbmZvID0gKHN0cnVjdCBpd2xfZWVwcm9tX2NoYW5uZWwgKikKLQkJCQlpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIocHJpdiwgb2Zmc2V0KTsKKwkJCQlpd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoc2hyZCwgb2Zmc2V0KTsKIAkJKmVlcHJvbV9jaF9pbmRleCA9IGl3bF9lZXByb21fYmFuZF81OwogCQlicmVhazsKIAljYXNlIDY6CQkvKiAyLjRHSHogaHQ0MCBjaGFubmVscyAqLwogCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xfZWVwcm9tX2JhbmRfNik7CiAJCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7CisJCQkJaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHNocmQsIG9mZnNldCk7CiAJCSplZXByb21fY2hfaW5kZXggPSBpd2xfZWVwcm9tX2JhbmRfNjsKIAkJYnJlYWs7CiAJY2FzZSA3OgkJLyogNSBHSHogaHQ0MCBjaGFubmVscyAqLwogCQkqZWVwcm9tX2NoX2NvdW50ID0gQVJSQVlfU0laRShpd2xfZWVwcm9tX2JhbmRfNyk7CiAJCSplZXByb21fY2hfaW5mbyA9IChzdHJ1Y3QgaXdsX2VlcHJvbV9jaGFubmVsICopCi0JCQkJaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHByaXYsIG9mZnNldCk7CisJCQkJaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHNocmQsIG9mZnNldCk7CiAJCSplZXByb21fY2hfaW5kZXggPSBpd2xfZWVwcm9tX2JhbmRfNzsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKQEAgLTk3OSw5ICs5ODMsOSBAQAogCX0KIAogCS8qIENoZWNrIGlmIHdlIGRvIGhhdmUgSFQ0MCBjaGFubmVscyAqLwotCWlmIChwcml2LT5jZmctPmxpYi0+ZWVwcm9tX29wcy5yZWd1bGF0b3J5X2JhbmRzWzVdID09CisJaWYgKGNmZyhwcml2KS0+bGliLT5lZXByb21fb3BzLnJlZ3VsYXRvcnlfYmFuZHNbNV0gPT0KIAkgICAgRUVQUk9NX1JFR1VMQVRPUllfQkFORF9OT19IVDQwICYmCi0JICAgIHByaXYtPmNmZy0+bGliLT5lZXByb21fb3BzLnJlZ3VsYXRvcnlfYmFuZHNbNl0gPT0KKwkgICAgY2ZnKHByaXYpLT5saWItPmVlcHJvbV9vcHMucmVndWxhdG9yeV9iYW5kc1s2XSA9PQogCSAgICBFRVBST01fUkVHVUxBVE9SWV9CQU5EX05PX0hUNDApCiAJCXJldHVybiAwOwogCkBAIC0xMDE3LDggKzEwMjEsOCBAQAogCSAqIGRyaXZlciBuZWVkIHRvIHByb2Nlc3MgYWRkaXRpb24gaW5mb3JtYXRpb24KIAkgKiB0byBkZXRlcm1pbmUgdGhlIG1heCBjaGFubmVsIHR4IHBvd2VyIGxpbWl0cwogCSAqLwotCWlmIChwcml2LT5jZmctPmxpYi0+ZWVwcm9tX29wcy51cGRhdGVfZW5oYW5jZWRfdHhwb3dlcikKLQkJcHJpdi0+Y2ZnLT5saWItPmVlcHJvbV9vcHMudXBkYXRlX2VuaGFuY2VkX3R4cG93ZXIocHJpdik7CisJaWYgKGNmZyhwcml2KS0+bGliLT5lZXByb21fb3BzLnVwZGF0ZV9lbmhhbmNlZF90eHBvd2VyKQorCQljZmcocHJpdiktPmxpYi0+ZWVwcm9tX29wcy51cGRhdGVfZW5oYW5jZWRfdHhwb3dlcihwcml2KTsKIAogCXJldHVybiAwOwogfQpAQCAtMTA2NCw3ICsxMDY4LDcgQEAKIHsKIAl1MTYgcmFkaW9fY2ZnOwogCi0JcmFkaW9fY2ZnID0gaXdsX2VlcHJvbV9xdWVyeTE2KHByaXYsIEVFUFJPTV9SQURJT19DT05GSUcpOworCXJhZGlvX2NmZyA9IGl3bF9lZXByb21fcXVlcnkxNihwcml2LT5zaHJkLCBFRVBST01fUkFESU9fQ09ORklHKTsKIAogCS8qIHdyaXRlIHJhZGlvIGNvbmZpZyB2YWx1ZXMgdG8gcmVnaXN0ZXIgKi8KIAlpZiAoRUVQUk9NX1JGX0NGR19UWVBFX01TSyhyYWRpb19jZmcpIDw9IEVFUFJPTV9SRl9DT05GSUdfVFlQRV9NQVgpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWVlcHJvbS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmgKaW5kZXggYzk0NzQ3ZS4uOWZhOTM3ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtZWVwcm9tLmgKQEAgLTY2LDYgKzY2LDcgQEAKICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KIAogc3RydWN0IGl3bF9wcml2Oworc3RydWN0IGl3bF9zaGFyZWQ7CiAKIC8qCiAgKiBFRVBST00gYWNjZXNzIHRpbWUgdmFsdWVzOgpAQCAtMzA1LDExICszMDYsMTEgQEAKIAogCiBpbnQgaXdsX2VlcHJvbV9pbml0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTMyIGh3X3Jldik7Ci12b2lkIGl3bF9lZXByb21fZnJlZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwordm9pZCBpd2xfZWVwcm9tX2ZyZWUoc3RydWN0IGl3bF9zaGFyZWQgKnNocmQpOwogaW50ICBpd2xfZWVwcm9tX2NoZWNrX3ZlcnNpb24oc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGludCAgaXdsX2VlcHJvbV9jaGVja19za3Uoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLWNvbnN0IHU4ICppd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCBzaXplX3Qgb2Zmc2V0KTsKLXUxNiBpd2xfZWVwcm9tX3F1ZXJ5MTYoY29uc3Qgc3RydWN0IGl3bF9wcml2ICpwcml2LCBzaXplX3Qgb2Zmc2V0KTsKK2NvbnN0IHU4ICppd2xfZWVwcm9tX3F1ZXJ5X2FkZHIoY29uc3Qgc3RydWN0IGl3bF9zaGFyZWQgKnNocmQsIHNpemVfdCBvZmZzZXQpOwordTE2IGl3bF9lZXByb21fcXVlcnkxNihjb25zdCBzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCwgc2l6ZV90IG9mZnNldCk7CiBpbnQgaXdsX2luaXRfY2hhbm5lbF9tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsX2ZyZWVfY2hhbm5lbF9tYXAoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIGNvbnN0IHN0cnVjdCBpd2xfY2hhbm5lbF9pbmZvICppd2xfZ2V0X2NoYW5uZWxfaW5mbygKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5jCmluZGV4IDNmZmE4ZTYuLmQ1N2VhNjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYnVzLT5yZWdfbG9jaywgZmxhZ3MpOwogCWl3bF9ncmFiX25pY19hY2Nlc3MoYnVzKTsKLQl2YWx1ZSA9IGl3bF9yZWFkMzIoYnVzKGJ1cyksIHJlZyk7CisJdmFsdWUgPSBpd2xfcmVhZDMyKGJ1cywgcmVnKTsKIAlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKGJ1cyk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVzLT5yZWdfbG9jaywgZmxhZ3MpOwogCkBAIC0yODMsMTYgKzI4MywyOSBAQAogCXJldHVybiB2YWx1ZTsKIH0KIAotdm9pZCBpd2xfd3JpdGVfdGFyZ19tZW0oc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIGFkZHIsIHUzMiB2YWwpCitpbnQgX2l3bF93cml0ZV90YXJnX21lbV93b3JkcyhzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgYWRkciwKKwkJCQl2b2lkICpidWYsIGludCB3b3JkcykKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvZmZzLCByZXN1bHQgPSAwOworCXUzMiAqdmFscyA9IGJ1ZjsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZidXMtPnJlZ19sb2NrLCBmbGFncyk7CiAJaWYgKCFpd2xfZ3JhYl9uaWNfYWNjZXNzKGJ1cykpIHsKIAkJaXdsX3dyaXRlMzIoYnVzLCBIQlVTX1RBUkdfTUVNX1dBRERSLCBhZGRyKTsKIAkJd21iKCk7Ci0JCWl3bF93cml0ZTMyKGJ1cywgSEJVU19UQVJHX01FTV9XREFULCB2YWwpOworCisJCWZvciAob2ZmcyA9IDA7IG9mZnMgPCB3b3Jkczsgb2ZmcysrKQorCQkJaXdsX3dyaXRlMzIoYnVzLCBIQlVTX1RBUkdfTUVNX1dEQVQsIHZhbHNbb2Zmc10pOwogCQlpd2xfcmVsZWFzZV9uaWNfYWNjZXNzKGJ1cyk7Ci0JfQorCX0gZWxzZQorCQlyZXN1bHQgPSAtRUJVU1k7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVzLT5yZWdfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGl3bF93cml0ZV90YXJnX21lbShzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgYWRkciwgdTMyIHZhbCkKK3sKKwlyZXR1cm4gX2l3bF93cml0ZV90YXJnX21lbV93b3JkcyhidXMsIGFkZHIsICZ2YWwsIDEpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWlvLmgKaW5kZXggY2VkMmNiZS4uYWFlMmVlYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtaW8uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1pby5oCkBAIC04NSw2ICs4NSw5IEBACiAJCQkJCSAoYnVmc2l6ZSkgLyBzaXplb2YodTMyKSk7XAogCX0gd2hpbGUgKDApCiAKK2ludCBfaXdsX3dyaXRlX3RhcmdfbWVtX3dvcmRzKHN0cnVjdCBpd2xfYnVzICpidXMsIHUzMiBhZGRyLAorCQkJICAgICAgdm9pZCAqYnVmLCBpbnQgd29yZHMpOworCiB1MzIgaXdsX3JlYWRfdGFyZ19tZW0oc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIGFkZHIpOwotdm9pZCBpd2xfd3JpdGVfdGFyZ19tZW0oc3RydWN0IGl3bF9idXMgKmJ1cywgdTMyIGFkZHIsIHUzMiB2YWwpOworaW50IGl3bF93cml0ZV90YXJnX21lbShzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgYWRkciwgdTMyIHZhbCk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWxlZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbGVkLmMKaW5kZXggZWI1NDE3My4uMTRkY2JmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbGVkLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbGVkLmMKQEAgLTEzNywxMSArMTM3LDExIEBACiAJfQogCiAJSVdMX0RFQlVHX0xFRChwcml2LCAiTGVkIGJsaW5rIHRpbWUgY29tcGVuc2F0aW9uPSV1XG4iLAotCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+bGVkX2NvbXBlbnNhdGlvbik7CisJCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKIAlsZWRfY21kLm9uID0gaXdsX2JsaW5rX2NvbXBlbnNhdGlvbihwcml2LCBvbiwKLQkJCQlwcml2LT5jZmctPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKKwkJCQljZmcocHJpdiktPmJhc2VfcGFyYW1zLT5sZWRfY29tcGVuc2F0aW9uKTsKIAlsZWRfY21kLm9mZiA9IGl3bF9ibGlua19jb21wZW5zYXRpb24ocHJpdiwgb2ZmLAotCQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmxlZF9jb21wZW5zYXRpb24pOworCQkJCWNmZyhwcml2KS0+YmFzZV9wYXJhbXMtPmxlZF9jb21wZW5zYXRpb24pOwogCiAJcmV0ID0gaXdsX3NlbmRfbGVkX2NtZChwcml2LCAmbGVkX2NtZCk7CiAJaWYgKCFyZXQpIHsKQEAgLTE3OCw3ICsxNzgsNyBAQAogCWludCByZXQ7CiAKIAlpZiAobW9kZSA9PSBJV0xfTEVEX0RFRkFVTFQpCi0JCW1vZGUgPSBwcml2LT5jZmctPmxlZF9tb2RlOworCQltb2RlID0gY2ZnKHByaXYpLT5sZWRfbW9kZTsKIAogCXByaXYtPmxlZC5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIlcy1sZWQiLAogCQkJCSAgIHdpcGh5X25hbWUocHJpdi0+aHctPndpcGh5KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1sZWQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWxlZC5oCmluZGV4IDFjOTNkZmUuLjI1NTBiM2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWxlZC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLWxlZC5oCkBAIC0zNiwyMCArMzYsNiBAQAogI2RlZmluZSBJV0xfTEVEX0FDVElWSVRZICAgICAgICgwPDwxKQogI2RlZmluZSBJV0xfTEVEX0xJTksgICAgICAgICAgICgxPDwxKQogCi0vKgotICogTEVEIG1vZGUKLSAqICAgIElXTF9MRURfREVGQVVMVDogIHVzZSBkZXZpY2UgZGVmYXVsdAotICogICAgSVdMX0xFRF9SRl9TVEFURTogdHVybiBMRUQgb24vb2ZmIGJhc2VkIG9uIFJGIHN0YXRlCi0gKgkJCUxFRCBPTiAgPSBSRiBPTgotICoJCQlMRUQgT0ZGID0gUkYgT0ZGCi0gKiAgICBJV0xfTEVEX0JMSU5LOiAgICBhZGp1c3QgbGVkIGJsaW5rIHJhdGUgYmFzZWQgb24gYmxpbmsgdGFibGUKLSAqLwotZW51bSBpd2xfbGVkX21vZGUgewotCUlXTF9MRURfREVGQVVMVCwKLQlJV0xfTEVEX1JGX1NUQVRFLAotCUlXTF9MRURfQkxJTkssCi19OwotCiB2b2lkIGl3bGFnbl9sZWRfZW5hYmxlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CiB2b2lkIGl3bF9sZWRzX2luaXQoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKIHZvaWQgaXdsX2xlZHNfZXhpdChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtbWFjODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW1hYzgwMjExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4MGU1NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLW1hYzgwMjExLmMKQEAgLTAsMCArMSwxNjAxIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0KGMpIDIwMDMgLSAyMDExIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpcHczOTQ1IHByb2plY3QsIGFzIHdlbGwKKyAqIGFzIHBvcnRpb25zIG9mIHRoZSBpZWVlODAyMTEgc3Vic3lzdGVtIGhlYWRlciBmaWxlcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLCBVU0EKKyAqCisgKiBUaGUgZnVsbCBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcyBpbmNsdWRlZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAqIGZpbGUgY2FsbGVkIExJQ0VOU0UuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisKKyNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KKworI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgorCisjaW5jbHVkZSAiaXdsLWVlcHJvbS5oIgorI2luY2x1ZGUgIml3bC13aWZpLmgiCisjaW5jbHVkZSAiaXdsLWRldi5oIgorI2luY2x1ZGUgIml3bC1jb3JlLmgiCisjaW5jbHVkZSAiaXdsLWlvLmgiCisjaW5jbHVkZSAiaXdsLWFnbi1jYWxpYi5oIgorI2luY2x1ZGUgIml3bC1hZ24uaCIKKyNpbmNsdWRlICJpd2wtc2hhcmVkLmgiCisjaW5jbHVkZSAiaXdsLWJ1cy5oIgorI2luY2x1ZGUgIml3bC10cmFucy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbnMKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2xpbWl0IGl3bGFnbl9zdGFfYXBfbGltaXRzW10gPSB7CisJeworCQkubWF4ID0gMSwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAorCX0sCisJeworCQkubWF4ID0gMSwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX0FQKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQgaXdsYWduXzJzdGFfbGltaXRzW10gPSB7CisJeworCQkubWF4ID0gMiwKKwkJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX1NUQVRJT04pLAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9pZmFjZV9saW1pdCBpd2xhZ25fcDJwX3N0YV9nb19saW1pdHNbXSA9IHsKKwl7CisJCS5tYXggPSAxLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfU1RBVElPTiksCisJfSwKKwl7CisJCS5tYXggPSAxLAorCQkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVfUDJQX0dPKSB8CisJCQkgQklUKE5MODAyMTFfSUZUWVBFX0FQKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfbGltaXQgaXdsYWduX3AycF8yc3RhX2xpbWl0c1tdID0geworCXsKKwkJLm1heCA9IDIsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSwKKwl9LAorCXsKKwkJLm1heCA9IDEsCisJCS50eXBlcyA9IEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSwKKwl9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaWZhY2VfY29tYmluYXRpb24KK2l3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfZHVhbG1vZGVbXSA9IHsKKwl7IC5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMSwKKwkgIC5tYXhfaW50ZXJmYWNlcyA9IDIsCisJICAuYmVhY29uX2ludF9pbmZyYV9tYXRjaCA9IHRydWUsCisJICAubGltaXRzID0gaXdsYWduX3N0YV9hcF9saW1pdHMsCisJICAubl9saW1pdHMgPSBBUlJBWV9TSVpFKGl3bGFnbl9zdGFfYXBfbGltaXRzKSwKKwl9LAorCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAorCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKKwkgIC5saW1pdHMgPSBpd2xhZ25fMnN0YV9saW1pdHMsCisJICAubl9saW1pdHMgPSBBUlJBWV9TSVpFKGl3bGFnbl8yc3RhX2xpbWl0cyksCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2lmYWNlX2NvbWJpbmF0aW9uCitpd2xhZ25faWZhY2VfY29tYmluYXRpb25zX3AycFtdID0geworCXsgLm51bV9kaWZmZXJlbnRfY2hhbm5lbHMgPSAxLAorCSAgLm1heF9pbnRlcmZhY2VzID0gMiwKKwkgIC5iZWFjb25faW50X2luZnJhX21hdGNoID0gdHJ1ZSwKKwkgIC5saW1pdHMgPSBpd2xhZ25fcDJwX3N0YV9nb19saW1pdHMsCisJICAubl9saW1pdHMgPSBBUlJBWV9TSVpFKGl3bGFnbl9wMnBfc3RhX2dvX2xpbWl0cyksCisJfSwKKwl7IC5udW1fZGlmZmVyZW50X2NoYW5uZWxzID0gMSwKKwkgIC5tYXhfaW50ZXJmYWNlcyA9IDIsCisJICAubGltaXRzID0gaXdsYWduX3AycF8yc3RhX2xpbWl0cywKKwkgIC5uX2xpbWl0cyA9IEFSUkFZX1NJWkUoaXdsYWduX3AycF8yc3RhX2xpbWl0cyksCisJfSwKK307CisKKy8qCisgKiBOb3QgYSBtYWM4MDIxMSBlbnRyeSBwb2ludCBmdW5jdGlvbiwgYnV0IGl0IGZpdHMgaW4gd2l0aCBhbGwgdGhlCisgKiBvdGhlciBtYWM4MDIxMSBmdW5jdGlvbnMgZ3JvdXBlZCBoZXJlLgorICovCitpbnQgaXdsYWduX21hY19zZXR1cF9yZWdpc3RlcihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCisJCQkJICBzdHJ1Y3QgaXdsYWduX3Vjb2RlX2NhcGFiaWxpdGllcyAqY2FwYSkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKKworCWh3LT5yYXRlX2NvbnRyb2xfYWxnb3JpdGhtID0gIml3bC1hZ24tcnMiOworCisJLyogVGVsbCBtYWM4MDIxMSBvdXIgY2hhcmFjdGVyaXN0aWNzICovCisJaHctPmZsYWdzID0gSUVFRTgwMjExX0hXX1NJR05BTF9EQk0gfAorCQkgICAgSUVFRTgwMjExX0hXX0FNUERVX0FHR1JFR0FUSU9OIHwKKwkJICAgIElFRUU4MDIxMV9IV19ORUVEX0RUSU1fUEVSSU9EIHwKKwkJICAgIElFRUU4MDIxMV9IV19TUEVDVFJVTV9NR01UIHwKKwkJICAgIElFRUU4MDIxMV9IV19SRVBPUlRTX1RYX0FDS19TVEFUVVM7CisKKwkvKgorCSAqIEluY2x1ZGluZyB0aGUgZm9sbG93aW5nIGxpbmUgd2lsbCBjcmFzaCBzb21lIEFQJ3MuICBUaGlzCisJICogd29ya2Fyb3VuZCByZW1vdmVzIHRoZSBzdGltdWx1cyB3aGljaCBjYXVzZXMgdGhlIGNyYXNoIHVudGlsCisJICogdGhlIEFQIHNvZnR3YXJlIGNhbiBiZSBmaXhlZC4KKwlody0+bWF4X3R4X2FnZ3JlZ2F0aW9uX3N1YmZyYW1lcyA9IExJTktfUVVBTF9BR0dfRlJBTUVfTElNSVRfREVGOworCSAqLworCisJaHctPmZsYWdzIHw9IElFRUU4MDIxMV9IV19TVVBQT1JUU19QUyB8CisJCSAgICAgSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfUFM7CisKKwlpZiAoY2ZnKHByaXYpLT5za3UgJiBFRVBST01fU0tVX0NBUF8xMU5fRU5BQkxFKQorCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX1NVUFBPUlRTX0RZTkFNSUNfU01QUyB8CisJCQkgICAgIElFRUU4MDIxMV9IV19TVVBQT1JUU19TVEFUSUNfU01QUzsKKworCWlmIChjYXBhLT5mbGFncyAmIElXTF9VQ09ERV9UTFZfRkxBR1NfTUZQKQorCQlody0+ZmxhZ3MgfD0gSUVFRTgwMjExX0hXX01GUF9DQVBBQkxFOworCisJaHctPnN0YV9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYpOworCWh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBpd2xfdmlmX3ByaXYpOworCisJZm9yX2VhY2hfY29udGV4dChwcml2LCBjdHgpIHsKKwkJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgfD0gY3R4LT5pbnRlcmZhY2VfbW9kZXM7CisJCWh3LT53aXBoeS0+aW50ZXJmYWNlX21vZGVzIHw9IGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKKwl9CisKKwlCVUlMRF9CVUdfT04oTlVNX0lXTF9SWE9OX0NUWCAhPSAyKTsKKworCWlmIChody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSkgeworCQlody0+d2lwaHktPmlmYWNlX2NvbWJpbmF0aW9ucyA9IGl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfcDJwOworCQlody0+d2lwaHktPm5faWZhY2VfY29tYmluYXRpb25zID0KKwkJCUFSUkFZX1NJWkUoaXdsYWduX2lmYWNlX2NvbWJpbmF0aW9uc19wMnApOworCX0gZWxzZSBpZiAoaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQoTkw4MDIxMV9JRlRZUEVfQVApKSB7CisJCWh3LT53aXBoeS0+aWZhY2VfY29tYmluYXRpb25zID0KKwkJCWl3bGFnbl9pZmFjZV9jb21iaW5hdGlvbnNfZHVhbG1vZGU7CisJCWh3LT53aXBoeS0+bl9pZmFjZV9jb21iaW5hdGlvbnMgPQorCQkJQVJSQVlfU0laRShpd2xhZ25faWZhY2VfY29tYmluYXRpb25zX2R1YWxtb2RlKTsKKwl9CisKKwlody0+d2lwaHktPm1heF9yZW1haW5fb25fY2hhbm5lbF9kdXJhdGlvbiA9IDEwMDA7CisKKwlody0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkgfAorCQkJICAgIFdJUEhZX0ZMQUdfRElTQUJMRV9CRUFDT05fSElOVFMgfAorCQkJICAgIFdJUEhZX0ZMQUdfSUJTU19SU047CisKKwlpZiAodHJhbnMocHJpdiktPnVjb2RlX3dvd2xhbi5jb2RlLmxlbiAmJgorCSAgICBkZXZpY2VfY2FuX3dha2V1cChidXMocHJpdiktPmRldikpIHsKKwkJaHctPndpcGh5LT53b3dsYW4uZmxhZ3MgPSBXSVBIWV9XT1dMQU5fTUFHSUNfUEtUIHwKKwkJCQkJICBXSVBIWV9XT1dMQU5fRElTQ09OTkVDVCB8CisJCQkJCSAgV0lQSFlfV09XTEFOX0VBUF9JREVOVElUWV9SRVEgfAorCQkJCQkgIFdJUEhZX1dPV0xBTl9SRktJTExfUkVMRUFTRTsKKwkJaWYgKCFpd2xhZ25fbW9kX3BhcmFtcy5zd19jcnlwdG8pCisJCQlody0+d2lwaHktPndvd2xhbi5mbGFncyB8PQorCQkJCVdJUEhZX1dPV0xBTl9TVVBQT1JUU19HVEtfUkVLRVkgfAorCQkJCVdJUEhZX1dPV0xBTl9HVEtfUkVLRVlfRkFJTFVSRTsKKworCQlody0+d2lwaHktPndvd2xhbi5uX3BhdHRlcm5zID0gSVdMQUdOX1dPV0xBTl9NQVhfUEFUVEVSTlM7CisJCWh3LT53aXBoeS0+d293bGFuLnBhdHRlcm5fbWluX2xlbiA9CisJCQkJCUlXTEFHTl9XT1dMQU5fTUlOX1BBVFRFUk5fTEVOOworCQlody0+d2lwaHktPndvd2xhbi5wYXR0ZXJuX21heF9sZW4gPQorCQkJCQlJV0xBR05fV09XTEFOX01BWF9QQVRURVJOX0xFTjsKKwl9CisKKwlpZiAoaXdsYWduX21vZF9wYXJhbXMucG93ZXJfc2F2ZSkKKwkJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7CisJZWxzZQorCQlody0+d2lwaHktPmZsYWdzICY9IH5XSVBIWV9GTEFHX1BTX09OX0JZX0RFRkFVTFQ7CisKKwlody0+d2lwaHktPm1heF9zY2FuX3NzaWRzID0gUFJPQkVfT1BUSU9OX01BWDsKKwkvKiB3ZSBjcmVhdGUgdGhlIDgwMi4xMSBoZWFkZXIgYW5kIGEgemVyby1sZW5ndGggU1NJRCBlbGVtZW50ICovCisJaHctPndpcGh5LT5tYXhfc2Nhbl9pZV9sZW4gPSBjYXBhLT5tYXhfcHJvYmVfbGVuZ3RoIC0gMjQgLSAyOworCisJLyogRGVmYXVsdCB2YWx1ZTsgNCBFRENBIFFPUyBwcmlvcml0aWVzICovCisJaHctPnF1ZXVlcyA9IDQ7CisKKwlody0+bWF4X2xpc3Rlbl9pbnRlcnZhbCA9IElXTF9DT05OX01BWF9MSVNURU5fSU5URVJWQUw7CisKKwlpZiAocHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl0ubl9jaGFubmVscykKKwkJcHJpdi0+aHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFfQkFORF8yR0haXSA9CisJCQkmcHJpdi0+YmFuZHNbSUVFRTgwMjExX0JBTkRfMkdIWl07CisJaWYgKHByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdLm5fY2hhbm5lbHMpCisJCXByaXYtPmh3LT53aXBoeS0+YmFuZHNbSUVFRTgwMjExX0JBTkRfNUdIWl0gPQorCQkJJnByaXYtPmJhbmRzW0lFRUU4MDIxMV9CQU5EXzVHSFpdOworCisJaHctPndpcGh5LT5od192ZXJzaW9uID0gYnVzX2dldF9od19pZChidXMocHJpdikpOworCisJaXdsX2xlZHNfaW5pdChwcml2KTsKKworCXJldCA9IGllZWU4MDIxMV9yZWdpc3Rlcl9odyhwcml2LT5odyk7CisJaWYgKHJldCkgeworCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gcmVnaXN0ZXIgaHcgKGVycm9yICVkKVxuIiwgcmV0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBpd2xhZ25fbWFjX3VucmVnaXN0ZXIoc3RydWN0IGl3bF9wcml2ICpwcml2KQoreworCWlmICghcHJpdi0+bWFjODAyMTFfcmVnaXN0ZXJlZCkKKwkJcmV0dXJuOworCWl3bF9sZWRzX2V4aXQocHJpdik7CisJaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcocHJpdi0+aHcpOworCXByaXYtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSAwOworfQorCitzdGF0aWMgaW50IF9faXdsX3VwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4OworCWludCByZXQ7CisKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpIHsKKwkJSVdMX1dBUk4ocHJpdiwgIkV4aXQgcGVuZGluZzsgd2lsbCBub3QgYnJpbmcgdGhlIE5JQyB1cFxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KSB7CisJCXJldCA9IGl3bGFnbl9hbGxvY19iY2FzdF9zdGF0aW9uKHByaXYsIGN0eCk7CisJCWlmIChyZXQpIHsKKwkJCWl3bF9kZWFsbG9jX2JjYXN0X3N0YXRpb25zKHByaXYpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCXJldCA9IGl3bF9ydW5faW5pdF91Y29kZSh0cmFucyhwcml2KSk7CisJaWYgKHJldCkgeworCQlJV0xfRVJSKHByaXYsICJGYWlsZWQgdG8gcnVuIElOSVQgdWNvZGU6ICVkXG4iLCByZXQpOworCQlnb3RvIGVycm9yOworCX0KKworCXJldCA9IGl3bF9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUodHJhbnMocHJpdiksIElXTF9VQ09ERV9SRUdVTEFSKTsKKwlpZiAocmV0KSB7CisJCUlXTF9FUlIocHJpdiwgIkZhaWxlZCB0byBzdGFydCBSVCB1Y29kZTogJWRcbiIsIHJldCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0ID0gaXdsX2FsaXZlX3N0YXJ0KHByaXYpOworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisJcmV0dXJuIDA7CisKKyBlcnJvcjoKKwlzZXRfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpOworCV9faXdsX2Rvd24ocHJpdik7CisJY2xlYXJfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZwcml2LT5zaHJkLT5zdGF0dXMpOworCisJSVdMX0VSUihwcml2LCAiVW5hYmxlIHRvIGluaXRpYWxpemUgZGV2aWNlLlxuIik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCByZXQ7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKworCS8qIHdlIHNob3VsZCBiZSB2ZXJpZnlpbmcgdGhlIGRldmljZSBpcyByZWFkeSB0byBiZSBvcGVuZWQgKi8KKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJcmV0ID0gX19pd2xfdXAocHJpdik7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCUlXTF9ERUJVR19JTkZPKHByaXYsICJTdGFydCBVUCB3b3JrIGRvbmUuXG4iKTsKKworCS8qIE5vdyB3ZSBzaG91bGQgYmUgZG9uZSwgYW5kIHRoZSBSRUFEWSBiaXQgc2hvdWxkIGJlIHNldC4gKi8KKwlpZiAoV0FSTl9PTighdGVzdF9iaXQoU1RBVFVTX1JFQURZLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkpCisJCXJldCA9IC1FSU87CisKKwlpd2xhZ25fbGVkX2VuYWJsZShwcml2KTsKKworCXByaXYtPmlzX29wZW4gPSAxOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKworCWlmICghcHJpdi0+aXNfb3BlbikKKwkJcmV0dXJuOworCisJcHJpdi0+aXNfb3BlbiA9IDA7CisKKwlpd2xfZG93bihwcml2KTsKKworCWZsdXNoX3dvcmtxdWV1ZShwcml2LT5zaHJkLT53b3JrcXVldWUpOworCisJLyogVXNlciBzcGFjZSBzb2Z0d2FyZSBtYXkgZXhwZWN0IGdldHRpbmcgcmZraWxsIGNoYW5nZXMKKwkgKiBldmVuIGlmIGludGVyZmFjZSBpcyBkb3duICovCisJaXdsX3dyaXRlMzIoYnVzKHByaXYpLCBDU1JfSU5ULCAweEZGRkZGRkZGKTsKKwlpd2xfZW5hYmxlX3Jma2lsbF9pbnQocHJpdik7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX21hY19zZXRfcmVrZXlfZGF0YShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9ndGtfcmVrZXlfZGF0YSAqZGF0YSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5zd19jcnlwdG8pCisJCXJldHVybjsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCWlmIChwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS52aWYgIT0gdmlmKQorCQlnb3RvIG91dDsKKworCW1lbWNweShwcml2LT5rZWssIGRhdGEtPmtlaywgTkw4MDIxMV9LRUtfTEVOKTsKKwltZW1jcHkocHJpdi0+a2NrLCBkYXRhLT5rY2ssIE5MODAyMTFfS0NLX0xFTik7CisJcHJpdi0+cmVwbGF5X2N0ciA9CisJCWNwdV90b19sZTY0KGJlNjRfdG9fY3B1cCgoX19iZTY0ICopJmRhdGEtPnJlcGxheV9jdHIpKTsKKwlwcml2LT5oYXZlX3Jla2V5X2RhdGEgPSB0cnVlOworCisgb3V0OgorCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworfQorCisjaWZkZWYgQ09ORklHX1BNX1NMRUVQCisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgc3RydWN0IGNmZzgwMjExX3dvd2xhbiAqd293bGFuKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CisJaW50IHJldDsKKworCWlmIChXQVJOX09OKCF3b3dsYW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCS8qIERvbid0IGF0dGVtcHQgV29XTEFOIHdoZW4gbm90IGFzc29jaWF0ZWQsIHRlYXIgZG93biBpbnN0ZWFkLiAqLworCWlmICghY3R4LT52aWYgfHwgY3R4LT52aWYtPnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiB8fAorCSAgICAhaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpIHsKKwkJcmV0ID0gMTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gaXdsYWduX3N1c3BlbmQocHJpdiwgaHcsIHdvd2xhbik7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCWRldmljZV9zZXRfd2FrZXVwX2VuYWJsZShidXMocHJpdiktPmRldiwgdHJ1ZSk7CisKKwkvKiBOb3cgbGV0IHRoZSB1Y29kZSBvcGVyYXRlIG9uIGl0cyBvd24gKi8KKwlpd2xfd3JpdGUzMihidXMocHJpdiksIENTUl9VQ09ERV9EUlZfR1AxX1NFVCwKKwkJCSAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0QzX0NGR19DT01QTEVURSk7CisKKwlnb3RvIG91dDsKKworIGVycm9yOgorCXByaXYtPnNocmQtPndvd2xhbiA9IGZhbHNlOworCWl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQocHJpdik7CisJaWVlZTgwMjExX3Jlc3RhcnRfaHcocHJpdi0+aHcpOworIG91dDoKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9ICZwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGJhc2UsIHN0YXR1cyA9IDB4ZmZmZmZmZmY7CisJaW50IHJldCA9IC1FSU87CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpd2xfd3JpdGUzMihidXMocHJpdiksIENTUl9VQ09ERV9EUlZfR1AxX0NMUiwKKwkJCSAgQ1NSX1VDT0RFX0RSVl9HUDFfQklUX0QzX0NGR19DT01QTEVURSk7CisKKwliYXNlID0gcHJpdi0+c2hyZC0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlOworCWlmIChpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkcihiYXNlKSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYnVzKHByaXYpLT5yZWdfbG9jaywgZmxhZ3MpOworCQlyZXQgPSBpd2xfZ3JhYl9uaWNfYWNjZXNzX3NpbGVudChidXMocHJpdikpOworCQlpZiAocmV0ID09IDApIHsKKwkJCWl3bF93cml0ZTMyKGJ1cyhwcml2KSwgSEJVU19UQVJHX01FTV9SQUREUiwgYmFzZSk7CisJCQlzdGF0dXMgPSBpd2xfcmVhZDMyKGJ1cyhwcml2KSwgSEJVU19UQVJHX01FTV9SREFUKTsKKwkJCWl3bF9yZWxlYXNlX25pY19hY2Nlc3MoYnVzKHByaXYpKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZidXMocHJpdiktPnJlZ19sb2NrLCBmbGFncyk7CisKKyNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCisJCWlmIChyZXQgPT0gMCkgeworCQkJc3RydWN0IGl3bF90cmFucyAqdHJhbnMgPSB0cmFucyhwcml2KTsKKwkJCWlmICghcHJpdi0+d293bGFuX3NyYW0pCisJCQkJcHJpdi0+d293bGFuX3NyYW0gPQorCQkJCQlremFsbG9jKHRyYW5zLT51Y29kZV93b3dsYW4uZGF0YS5sZW4sCisJCQkJCQlHRlBfS0VSTkVMKTsKKworCQkJaWYgKHByaXYtPndvd2xhbl9zcmFtKQorCQkJCV9pd2xfcmVhZF90YXJnX21lbV93b3JkcygKKwkJCQkJYnVzKHByaXYpLCAweDgwMDAwMCwgcHJpdi0+d293bGFuX3NyYW0sCisJCQkJCXRyYW5zLT51Y29kZV93b3dsYW4uZGF0YS5sZW4gLyA0KTsKKwkJfQorI2VuZGlmCisJfQorCisJLyogd2UnbGwgY2xlYXIgY3R4LT52aWYgZHVyaW5nIGl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQoKSAqLworCXZpZiA9IGN0eC0+dmlmOworCisJcHJpdi0+c2hyZC0+d293bGFuID0gZmFsc2U7CisKKwlkZXZpY2Vfc2V0X3dha2V1cF9lbmFibGUoYnVzKHByaXYpLT5kZXYsIGZhbHNlKTsKKworCWl3bGFnbl9wcmVwYXJlX3Jlc3RhcnQocHJpdik7CisKKwltZW1zZXQoKHZvaWQgKikmY3R4LT5hY3RpdmUsIDAsIHNpemVvZihjdHgtPmFjdGl2ZSkpOworCWl3bF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHByaXYsIGN0eCk7CisJaXdsYWduX3NldF9yeG9uX2NoYWluKHByaXYsIGN0eCk7CisKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCWllZWU4MDIxMV9yZXN1bWVfZGlzY29ubmVjdCh2aWYpOworCisJcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpd2xhZ25fbWFjX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCisJSVdMX0RFQlVHX1RYKHByaXYsICJkZXYtPnhtaXQoJWQgYnl0ZXMpIGF0IHJhdGUgMHglMDJ4XG4iLCBza2ItPmxlbiwKKwkJICAgICBpZWVlODAyMTFfZ2V0X3R4X3JhdGUoaHcsIElFRUU4MDIxMV9TS0JfQ0Ioc2tiKSktPmJpdHJhdGUpOworCisJaWYgKGl3bGFnbl90eF9za2IocHJpdiwgc2tiKSkKKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX21hY191cGRhdGVfdGtpcF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleWNvbmYsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsCisJCQkJICAgICAgIHUzMiBpdjMyLCB1MTYgKnBoYXNlMWtleSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCWl3bF91cGRhdGVfdGtpcF9rZXkocHJpdiwgdmlmLCBrZXljb25mLCBzdGEsIGl2MzIsIHBoYXNlMWtleSk7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19zZXRfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBlbnVtIHNldF9rZXlfY21kIGNtZCwKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa2V5KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSB2aWZfcHJpdi0+Y3R4OworCWludCByZXQ7CisJYm9vbCBpc19kZWZhdWx0X3dlcF9rZXkgPSBmYWxzZTsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCisJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLnN3X2NyeXB0bykgeworCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gaHdjcnlwdG8gZGlzYWJsZWRcbiIpOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJfQorCisJc3dpdGNoIChrZXktPmNpcGhlcikgeworCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoKKwkJa2V5LT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQzsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOgorCQlrZXktPmZsYWdzIHw9IElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJLyoKKwkgKiBXZSBjb3VsZCBwcm9ncmFtIHRoZXNlIGtleXMgaW50byB0aGUgaGFyZHdhcmUgYXMgd2VsbCwgYnV0IHdlCisJICogZG9uJ3QgZXhwZWN0IG11Y2ggbXVsdGljYXN0IHRyYWZmaWMgaW4gSUJTUyBhbmQgaGF2aW5nIGtleXMKKwkgKiBmb3IgbW9yZSBzdGF0aW9ucyBpcyBwcm9iYWJseSBtb3JlIHVzZWZ1bC4KKwkgKgorCSAqIE1hcmsga2V5IFRYLW9ubHkgYW5kIHJldHVybiAwLgorCSAqLworCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKKwkgICAgIShrZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BBSVJXSVNFKSkgeworCQlrZXktPmh3X2tleV9pZHggPSBXRVBfSU5WQUxJRF9PRkZTRVQ7CisJCXJldHVybiAwOworCX0KKworCS8qIElmIHRoZXkga2V5IHdhcyBUWC1vbmx5LCBhY2NlcHQgZGVsZXRpb24gKi8KKwlpZiAoY21kID09IERJU0FCTEVfS0VZICYmIGtleS0+aHdfa2V5X2lkeCA9PSBXRVBfSU5WQUxJRF9PRkZTRVQpCisJCXJldHVybiAwOworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCWl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDEwMCk7CisKKwlCVUlMRF9CVUdfT04oV0VQX0lOVkFMSURfT0ZGU0VUID09IElXTEFHTl9IV19LRVlfREVGQVVMVCk7CisKKwkvKgorCSAqIElmIHdlIGFyZSBnZXR0aW5nIFdFUCBncm91cCBrZXkgYW5kIHdlIGRpZG4ndCByZWNlaXZlIGFueSBrZXkgbWFwcGluZworCSAqIHNvIGZhciwgd2UgYXJlIGluIGxlZ2FjeSB3ZXAgbW9kZSAoZ3JvdXAga2V5IG9ubHkpLCBvdGhlcndpc2Ugd2UgYXJlCisJICogaW4gMVggbW9kZS4KKwkgKiBJbiBsZWdhY3kgd2VwIG1vZGUsIHdlIHVzZSBhbm90aGVyIGhvc3QgY29tbWFuZCB0byB0aGUgdUNvZGUuCisJICovCisJaWYgKChrZXktPmNpcGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fAorCSAgICAga2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KSAmJiAhc3RhKSB7CisJCWlmIChjbWQgPT0gU0VUX0tFWSkKKwkJCWlzX2RlZmF1bHRfd2VwX2tleSA9ICFjdHgtPmtleV9tYXBwaW5nX2tleXM7CisJCWVsc2UKKwkJCWlzX2RlZmF1bHRfd2VwX2tleSA9CisJCQkJa2V5LT5od19rZXlfaWR4ID09IElXTEFHTl9IV19LRVlfREVGQVVMVDsKKwl9CisKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTRVRfS0VZOgorCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KSB7CisJCQlyZXQgPSBpd2xfc2V0X2RlZmF1bHRfd2VwX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LCBrZXkpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0ID0gaXdsX3NldF9keW5hbWljX2tleShwcml2LCB2aWZfcHJpdi0+Y3R4LCBrZXksIHN0YSk7CisJCWlmIChyZXQpIHsKKwkJCS8qCisJCQkgKiBjYW4ndCBhZGQga2V5IGZvciBSWCwgYnV0IHdlIGRvbid0IG5lZWQgaXQKKwkJCSAqIGluIHRoZSBkZXZpY2UgZm9yIFRYIHNvIHN0aWxsIHJldHVybiAwCisJCQkgKi8KKwkJCXJldCA9IDA7CisJCQlrZXktPmh3X2tleV9pZHggPSBXRVBfSU5WQUxJRF9PRkZTRVQ7CisJCX0KKworCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVuYWJsZSBod2NyeXB0byBrZXlcbiIpOworCQlicmVhazsKKwljYXNlIERJU0FCTEVfS0VZOgorCQlpZiAoaXNfZGVmYXVsdF93ZXBfa2V5KQorCQkJcmV0ID0gaXdsX3JlbW92ZV9kZWZhdWx0X3dlcF9rZXkocHJpdiwgY3R4LCBrZXkpOworCQllbHNlCisJCQlyZXQgPSBpd2xfcmVtb3ZlX2R5bmFtaWNfa2V5KHByaXYsIGN0eCwga2V5LCBzdGEpOworCisJCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZGlzYWJsZSBod2NyeXB0byBrZXlcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCX0KKworCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLCB1MTYgdGlkLCB1MTYgKnNzbiwKKwkJCQkgICB1OCBidWZfc2l6ZSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKSBzdGEtPmRydl9wcml2OworCisJSVdMX0RFQlVHX0hUKHByaXYsICJBLU1QRFUgYWN0aW9uIG9uIGFkZHIgJXBNIHRpZCAlZFxuIiwKKwkJICAgICBzdGEtPmFkZHIsIHRpZCk7CisKKwlpZiAoIShjZmcocHJpdiktPnNrdSAmIEVFUFJPTV9TS1VfQ0FQXzExTl9FTkFCTEUpKQorCQlyZXR1cm4gLUVBQ0NFUzsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6CisJCWlmIChpd2xhZ25fbW9kX3BhcmFtcy5kaXNhYmxlXzExbiAmIElXTF9ESVNBQkxFX0hUX1JYQUdHKQorCQkJYnJlYWs7CisJCUlXTF9ERUJVR19IVChwcml2LCAic3RhcnQgUnhcbiIpOworCQlyZXQgPSBpd2xfc3RhX3J4X2FnZ19zdGFydChwcml2LCBzdGEsIHRpZCwgKnNzbik7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6CisJCUlXTF9ERUJVR19IVChwcml2LCAic3RvcCBSeFxuIik7CisJCXJldCA9IGl3bF9zdGFfcnhfYWdnX3N0b3AocHJpdiwgc3RhLCB0aWQpOworCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCisJCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVDoKKwkJaWYgKGl3bGFnbl9tb2RfcGFyYW1zLmRpc2FibGVfMTFuICYgSVdMX0RJU0FCTEVfSFRfVFhBR0cpCisJCQlicmVhazsKKwkJSVdMX0RFQlVHX0hUKHByaXYsICJzdGFydCBUeFxuIik7CisJCXJldCA9IGl3bGFnbl90eF9hZ2dfc3RhcnQocHJpdiwgdmlmLCBzdGEsIHRpZCwgc3NuKTsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RPUDoKKwkJSVdMX0RFQlVHX0hUKHByaXYsICJzdG9wIFR4XG4iKTsKKwkJcmV0ID0gaXdsYWduX3R4X2FnZ19zdG9wKHByaXYsIHZpZiwgc3RhLCB0aWQpOworCQlpZiAoKHJldCA9PSAwKSAmJiAocHJpdi0+YWdnX3RpZHNfY291bnQgPiAwKSkgeworCQkJcHJpdi0+YWdnX3RpZHNfY291bnQtLTsKKwkJCUlXTF9ERUJVR19IVChwcml2LCAicHJpdi0+YWdnX3RpZHNfY291bnQgPSAldVxuIiwKKwkJCQkgICAgIHByaXYtPmFnZ190aWRzX2NvdW50KTsKKwkJfQorCQlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCisJCQlyZXQgPSAwOworCQlpZiAoIXByaXYtPmFnZ190aWRzX2NvdW50ICYmIGNmZyhwcml2KS0+aHRfcGFyYW1zICYmCisJCSAgICBjZmcocHJpdiktPmh0X3BhcmFtcy0+dXNlX3J0c19mb3JfYWdncmVnYXRpb24pIHsKKwkJCS8qCisJCQkgKiBzd2l0Y2ggb2ZmIFJUUy9DVFMgaWYgaXQgd2FzIHByZXZpb3VzbHkgZW5hYmxlZAorCQkJICovCisJCQlzdGFfcHJpdi0+bHFfc3RhLmxxLmdlbmVyYWxfcGFyYW1zLmZsYWdzICY9CisJCQkJfkxJTktfUVVBTF9GTEFHU19TRVRfU1RBX1RMQ19SVFNfTVNLOworCQkJaXdsX3NlbmRfbHFfY21kKHByaXYsIGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpLAorCQkJCQkmc3RhX3ByaXYtPmxxX3N0YS5scSwgQ01EX0FTWU5DLCBmYWxzZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUw6CisJCXJldCA9IGl3bGFnbl90eF9hZ2dfb3Blcihwcml2LCB2aWYsIHN0YSwgdGlkLCBidWZfc2l6ZSk7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfc3RhX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfc3RhdGlvbl9wcml2ICpzdGFfcHJpdiA9ICh2b2lkICopc3RhLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlib29sIGlzX2FwID0gdmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT047CisJaW50IHJldCA9IDA7CisJdTggc3RhX2lkOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJyZWNlaXZlZCByZXF1ZXN0IHRvIGFkZCBzdGF0aW9uICVwTVxuIiwKKwkJCXN0YS0+YWRkcik7CisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19JTkZPKHByaXYsICJwcm9jZWVkaW5nIHRvIGFkZCBzdGF0aW9uICVwTVxuIiwKKwkJCXN0YS0+YWRkcik7CisJc3RhX3ByaXYtPnN0YV9pZCA9IElXTF9JTlZBTElEX1NUQVRJT047CisKKwlhdG9taWNfc2V0KCZzdGFfcHJpdi0+cGVuZGluZ19mcmFtZXMsIDApOworCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCXN0YV9wcml2LT5jbGllbnQgPSB0cnVlOworCisJcmV0ID0gaXdsX2FkZF9zdGF0aW9uX2NvbW1vbihwcml2LCB2aWZfcHJpdi0+Y3R4LCBzdGEtPmFkZHIsCisJCQkJICAgICBpc19hcCwgc3RhLCAmc3RhX2lkKTsKKwlpZiAocmV0KSB7CisJCUlXTF9FUlIocHJpdiwgIlVuYWJsZSB0byBhZGQgc3RhdGlvbiAlcE0gKCVkKVxuIiwKKwkJCXN0YS0+YWRkciwgcmV0KTsKKwkJLyogU2hvdWxkIHdlIHJldHVybiBzdWNjZXNzIGlmIHJldHVybiBjb2RlIGlzIEVFWElTVCA/ICovCisJCWdvdG8gb3V0OworCX0KKworCXN0YV9wcml2LT5zdGFfaWQgPSBzdGFfaWQ7CisKKwkvKiBJbml0aWFsaXplIHJhdGUgc2NhbGluZyAqLworCUlXTF9ERUJVR19JTkZPKHByaXYsICJJbml0aWFsaXppbmcgcmF0ZSBzY2FsaW5nIGZvciBzdGF0aW9uICVwTVxuIiwKKwkJICAgICAgIHN0YS0+YWRkcik7CisJaXdsX3JzX3JhdGVfaW5pdChwcml2LCBzdGEsIHN0YV9pZCk7Cisgb3V0OgorCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX21hY19jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWxfc3dpdGNoICpjaF9zd2l0Y2gpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJY29uc3Qgc3RydWN0IGl3bF9jaGFubmVsX2luZm8gKmNoX2luZm87CisJc3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mID0gJmh3LT5jb25mOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGNoX3N3aXRjaC0+Y2hhbm5lbDsKKwlzdHJ1Y3QgaXdsX2h0X2NvbmZpZyAqaHRfY29uZiA9ICZwcml2LT5jdXJyZW50X2h0X2NvbmZpZzsKKwkvKgorCSAqIE1VTFRJLUZJWE1FCisJICogV2hlbiB3ZSBhZGQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW50ZXJmYWNlcywgd2UgbmVlZCB0bworCSAqIHJldmlzaXQgdGhpcy4gVGhlIGNoYW5uZWwgc3dpdGNoIGNvbW1hbmQgaW4gdGhlIGRldmljZQorCSAqIG9ubHkgYWZmZWN0cyB0aGUgQlNTIGNvbnRleHQsIGJ1dCB3aGF0IGRvZXMgdGhhdCByZWFsbHkKKwkgKiBtZWFuPyBBbmQgd2hhdCBpZiB3ZSBnZXQgYSBDU0Egb24gdGhlIHNlY29uZCBpbnRlcmZhY2U/CisJICogVGhpcyBuZWVkcyBhIGxvdCBvZiB3b3JrLgorCSAqLworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHggPSAmcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU107CisJdTE2IGNoOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAoaXdsX2lzX3Jma2lsbChwcml2LT5zaHJkKSkKKwkJZ290byBvdXQ7CisKKwlpZiAodGVzdF9iaXQoU1RBVFVTX0VYSVRfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykgfHwKKwkgICAgdGVzdF9iaXQoU1RBVFVTX1NDQU5OSU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSB8fAorCSAgICB0ZXN0X2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cykpCisJCWdvdG8gb3V0OworCisJaWYgKCFpd2xfaXNfYXNzb2NpYXRlZF9jdHgoY3R4KSkKKwkJZ290byBvdXQ7CisKKwlpZiAoIWNmZyhwcml2KS0+bGliLT5zZXRfY2hhbm5lbF9zd2l0Y2gpCisJCWdvdG8gb3V0OworCisJY2ggPSBjaGFubmVsLT5od192YWx1ZTsKKwlpZiAobGUxNl90b19jcHUoY3R4LT5hY3RpdmUuY2hhbm5lbCkgPT0gY2gpCisJCWdvdG8gb3V0OworCisJY2hfaW5mbyA9IGl3bF9nZXRfY2hhbm5lbF9pbmZvKHByaXYsIGNoYW5uZWwtPmJhbmQsIGNoKTsKKwlpZiAoIWlzX2NoYW5uZWxfdmFsaWQoY2hfaW5mbykpIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJpbnZhbGlkIGNoYW5uZWxcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZwcml2LT5zaHJkLT5sb2NrKTsKKworCXByaXYtPmN1cnJlbnRfaHRfY29uZmlnLnNtcHMgPSBjb25mLT5zbXBzX21vZGU7CisKKwkvKiBDb25maWd1cmUgSFQ0MCBjaGFubmVscyAqLworCWN0eC0+aHQuZW5hYmxlZCA9IGNvbmZfaXNfaHQoY29uZik7CisJaWYgKGN0eC0+aHQuZW5hYmxlZCkKKwkJaXdsYWduX2NvbmZpZ19odDQwKGNvbmYsIGN0eCk7CisJZWxzZQorCQljdHgtPmh0LmlzXzQwbWh6ID0gZmFsc2U7CisKKwlpZiAoKGxlMTZfdG9fY3B1KGN0eC0+c3RhZ2luZy5jaGFubmVsKSAhPSBjaCkpCisJCWN0eC0+c3RhZ2luZy5mbGFncyA9IDA7CisKKwlpd2xfc2V0X3J4b25fY2hhbm5lbChwcml2LCBjaGFubmVsLCBjdHgpOworCWl3bF9zZXRfcnhvbl9odChwcml2LCBodF9jb25mKTsKKwlpd2xfc2V0X2ZsYWdzX2Zvcl9iYW5kKHByaXYsIGN0eCwgY2hhbm5lbC0+YmFuZCwgY3R4LT52aWYpOworCisJc3Bpbl91bmxvY2tfaXJxKCZwcml2LT5zaHJkLT5sb2NrKTsKKworCWl3bF9zZXRfcmF0ZShwcml2KTsKKwkvKgorCSAqIGF0IHRoaXMgcG9pbnQsIHN0YWdpbmdfcnhvbiBoYXMgdGhlCisJICogY29uZmlndXJhdGlvbiBmb3IgY2hhbm5lbCBzd2l0Y2gKKwkgKi8KKwlzZXRfYml0KFNUQVRVU19DSEFOTkVMX1NXSVRDSF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKTsKKwlwcml2LT5zd2l0Y2hfY2hhbm5lbCA9IGNwdV90b19sZTE2KGNoKTsKKwlpZiAoY2ZnKHByaXYpLT5saWItPnNldF9jaGFubmVsX3N3aXRjaChwcml2LCBjaF9zd2l0Y2gpKSB7CisJCWNsZWFyX2JpdChTVEFUVVNfQ0hBTk5FTF9TV0lUQ0hfUEVORElORywgJnByaXYtPnNocmQtPnN0YXR1cyk7CisJCXByaXYtPnN3aXRjaF9jaGFubmVsID0gMDsKKwkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUoY3R4LT52aWYsIGZhbHNlKTsKKwl9CisKK291dDoKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX2NvbmZpZ3VyZV9maWx0ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdzLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLAorCQkJCSAgICB1NjQgbXVsdGljYXN0KQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCV9fbGUzMiBmaWx0ZXJfb3IgPSAwLCBmaWx0ZXJfbmFuZCA9IDA7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eDsKKworI2RlZmluZSBDSEsodGVzdCwgZmxhZykJZG8geyBcCisJaWYgKCp0b3RhbF9mbGFncyAmICh0ZXN0KSkJCVwKKwkJZmlsdGVyX29yIHw9IChmbGFnKTsJCVwKKwllbHNlCQkJCQlcCisJCWZpbHRlcl9uYW5kIHw9IChmbGFnKTsJCVwKKwl9IHdoaWxlICgwKQorCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJFbnRlcjogY2hhbmdlZDogMHgleCwgdG90YWw6IDB4JXhcbiIsCisJCQljaGFuZ2VkX2ZsYWdzLCAqdG90YWxfZmxhZ3MpOworCisJQ0hLKEZJRl9PVEhFUl9CU1MgfCBGSUZfUFJPTUlTQ19JTl9CU1MsIFJYT05fRklMVEVSX1BST01JU0NfTVNLKTsKKwkvKiBTZXR0aW5nIF9qdXN0XyBSWE9OX0ZJTFRFUl9DVEwySE9TVF9NU0sgY2F1c2VzIEZIIGVycm9ycyAqLworCUNISyhGSUZfQ09OVFJPTCwgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLIHwgUlhPTl9GSUxURVJfUFJPTUlTQ19NU0spOworCUNISyhGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQywgUlhPTl9GSUxURVJfQkNPTl9BV0FSRV9NU0spOworCisjdW5kZWYgQ0hLCisKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlmb3JfZWFjaF9jb250ZXh0KHByaXYsIGN0eCkgeworCQljdHgtPnN0YWdpbmcuZmlsdGVyX2ZsYWdzICY9IH5maWx0ZXJfbmFuZDsKKwkJY3R4LT5zdGFnaW5nLmZpbHRlcl9mbGFncyB8PSBmaWx0ZXJfb3I7CisKKwkJLyoKKwkJICogTm90IGNvbW1pdHRpbmcgZGlyZWN0bHkgYmVjYXVzZSBoYXJkd2FyZSBjYW4gcGVyZm9ybSBhIHNjYW4sCisJCSAqIGJ1dCB3ZSdsbCBldmVudHVhbGx5IGNvbW1pdCB0aGUgZmlsdGVyIGZsYWdzIGNoYW5nZSBhbnl3YXkuCisJCSAqLworCX0KKworCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJLyoKKwkgKiBSZWNlaXZpbmcgYWxsIG11bHRpY2FzdCBmcmFtZXMgaXMgYWx3YXlzIGVuYWJsZWQgYnkgdGhlCisJICogZGVmYXVsdCBmbGFncyBzZXR1cCBpbiBpd2xfY29ubmVjdGlvbl9pbml0X3J4X2NvbmZpZygpCisJICogc2luY2Ugd2UgY3VycmVudGx5IGRvIG5vdCBzdXBwb3J0IHByb2dyYW1taW5nIG11bHRpY2FzdAorCSAqIGZpbHRlcnMgaW50byB0aGUgZGV2aWNlLgorCSAqLworCSp0b3RhbF9mbGFncyAmPSBGSUZfT1RIRVJfQlNTIHwgRklGX0FMTE1VTFRJIHwgRklGX1BST01JU0NfSU5fQlNTIHwKKwkJCUZJRl9CQ05fUFJCUkVTUF9QUk9NSVNDIHwgRklGX0NPTlRST0w7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfZmx1c2goc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgZHJvcCkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKworCWlmICh0ZXN0X2JpdChTVEFUVVNfRVhJVF9QRU5ESU5HLCAmcHJpdi0+c2hyZC0+c3RhdHVzKSkgeworCQlJV0xfREVCVUdfVFgocHJpdiwgIkFib3J0aW5nIGZsdXNoIGR1ZSB0byBkZXZpY2Ugc2h1dGRvd25cbiIpOworCQlnb3RvIGRvbmU7CisJfQorCWlmIChpd2xfaXNfcmZraWxsKHByaXYtPnNocmQpKSB7CisJCUlXTF9ERUJVR19UWChwcml2LCAiQWJvcnRpbmcgZmx1c2ggZHVlIHRvIFJGIEtpbGxcbiIpOworCQlnb3RvIGRvbmU7CisJfQorCisJLyoKKwkgKiBtYWM4MDIxMSB3aWxsIG5vdCBwdXNoIGFueSBtb3JlIGZyYW1lcyBmb3IgdHJhbnNtaXQKKwkgKiB1bnRpbCB0aGUgZmx1c2ggaXMgY29tcGxldGVkCisJICovCisJaWYgKGRyb3ApIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJzZW5kIGZsdXNoIGNvbW1hbmRcbiIpOworCQlpZiAoaXdsYWduX3R4Zmlmb19mbHVzaChwcml2LCBJV0xfRFJPUF9BTEwpKSB7CisJCQlJV0xfRVJSKHByaXYsICJmbHVzaCByZXF1ZXN0IGZhaWxcbiIpOworCQkJZ290byBkb25lOworCQl9CisJfQorCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAid2FpdCB0cmFuc21pdC9mbHVzaCBhbGwgZnJhbWVzXG4iKTsKKwlpd2xfdHJhbnNfd2FpdF90eF9xdWV1ZV9lbXB0eSh0cmFucyhwcml2KSk7Citkb25lOgorCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfcmVtYWluX29uX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKKwkJCQkgICAgIGludCBkdXJhdGlvbikKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9QQU5dOworCWludCBlcnIgPSAwOworCisJaWYgKCEocHJpdi0+c2hyZC0+dmFsaWRfY29udGV4dHMgJiBCSVQoSVdMX1JYT05fQ1RYX1BBTikpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIShjdHgtPmludGVyZmFjZV9tb2RlcyAmIEJJVChOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCWlmICh0ZXN0X2JpdChTVEFUVVNfU0NBTl9IVywgJnByaXYtPnNocmQtPnN0YXR1cykpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlwcml2LT5od19yb2NfY2hhbm5lbCA9IGNoYW5uZWw7CisJcHJpdi0+aHdfcm9jX2NoYW50eXBlID0gY2hhbm5lbF90eXBlOworCS8qIGNvbnZlcnQgZnJvbSBtcyB0byBUVSAqLworCXByaXYtPmh3X3JvY19kdXJhdGlvbiA9IERJVl9ST1VORF9VUCgxMDAwICogZHVyYXRpb24sIDEwMjQpOworCXByaXYtPmh3X3JvY19zdGFydF9ub3RpZmllZCA9IGZhbHNlOworCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPmh3X3JvY19kaXNhYmxlX3dvcmspOworCisJaWYgKCFjdHgtPmlzX2FjdGl2ZSkgeworCQlzdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9xb3NfaW5mbyBkZWZhdWx0X3Fvc19kYXRhID0geworCQkJLmRlZl9xb3NfcGFybSA9IHsKKwkJCQkuYWNbMF0gPSB7CisJCQkJCS5jd19taW4gPSBjcHVfdG9fbGUxNigzKSwKKwkJCQkJLmN3X21heCA9IGNwdV90b19sZTE2KDcpLAorCQkJCQkuYWlmc24gPSAyLAorCQkJCQkuZWRjYV90eG9wID0gY3B1X3RvX2xlMTYoMTUwNCksCisJCQkJfSwKKwkJCQkuYWNbMV0gPSB7CisJCQkJCS5jd19taW4gPSBjcHVfdG9fbGUxNig3KSwKKwkJCQkJLmN3X21heCA9IGNwdV90b19sZTE2KDE1KSwKKwkJCQkJLmFpZnNuID0gMiwKKwkJCQkJLmVkY2FfdHhvcCA9IGNwdV90b19sZTE2KDMwMDgpLAorCQkJCX0sCisJCQkJLmFjWzJdID0geworCQkJCQkuY3dfbWluID0gY3B1X3RvX2xlMTYoMTUpLAorCQkJCQkuY3dfbWF4ID0gY3B1X3RvX2xlMTYoMTAyMyksCisJCQkJCS5haWZzbiA9IDMsCisJCQkJfSwKKwkJCQkuYWNbM10gPSB7CisJCQkJCS5jd19taW4gPSBjcHVfdG9fbGUxNigxNSksCisJCQkJCS5jd19tYXggPSBjcHVfdG9fbGUxNigxMDIzKSwKKwkJCQkJLmFpZnNuID0gNywKKwkJCQl9LAorCQkJfSwKKwkJfTsKKworCQljdHgtPmlzX2FjdGl2ZSA9IHRydWU7CisJCWN0eC0+cW9zX2RhdGEgPSBkZWZhdWx0X3Fvc19kYXRhOworCQljdHgtPnN0YWdpbmcuZGV2X3R5cGUgPSBSWE9OX0RFVl9UWVBFX1AyUDsKKwkJbWVtY3B5KGN0eC0+c3RhZ2luZy5ub2RlX2FkZHIsCisJCSAgICAgICBwcml2LT5jb250ZXh0c1tJV0xfUlhPTl9DVFhfQlNTXS5zdGFnaW5nLm5vZGVfYWRkciwKKwkJICAgICAgIEVUSF9BTEVOKTsKKwkJbWVtY3B5KGN0eC0+c3RhZ2luZy5ic3NpZF9hZGRyLAorCQkgICAgICAgcHJpdi0+Y29udGV4dHNbSVdMX1JYT05fQ1RYX0JTU10uc3RhZ2luZy5ub2RlX2FkZHIsCisJCSAgICAgICBFVEhfQUxFTik7CisJCWVyciA9IGl3bGFnbl9jb21taXRfcnhvbihwcml2LCBjdHgpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXQ7CisJCWN0eC0+c3RhZ2luZy5maWx0ZXJfZmxhZ3MgfD0gUlhPTl9GSUxURVJfQVNTT0NfTVNLIHwKKwkJCQkJICAgICBSWE9OX0ZJTFRFUl9QUk9NSVNDX01TSyB8CisJCQkJCSAgICAgUlhPTl9GSUxURVJfQ1RMMkhPU1RfTVNLOworCisJCWVyciA9IGl3bGFnbl9jb21taXRfcnhvbihwcml2LCBjdHgpOworCQlpZiAoZXJyKSB7CisJCQlpd2xhZ25fZGlzYWJsZV9yb2MocHJpdik7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwcml2LT5od19yb2Nfc2V0dXAgPSB0cnVlOworCX0KKworCWVyciA9IGl3bF9zY2FuX2luaXRpYXRlKHByaXYsIGN0eC0+dmlmLCBJV0xfU0NBTl9ST0MsIGNoYW5uZWwtPmJhbmQpOworCWlmIChlcnIpCisJCWl3bGFnbl9kaXNhYmxlX3JvYyhwcml2KTsKKworIG91dDoKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlpZiAoIShwcml2LT5zaHJkLT52YWxpZF9jb250ZXh0cyAmIEJJVChJV0xfUlhPTl9DVFhfUEFOKSkpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCBwcml2LT5od19yb2NfZHVyYXRpb24pOworCWl3bGFnbl9kaXNhYmxlX3JvYyhwcml2KTsKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfdHhfc3luYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICBjb25zdCB1OCAqYnNzaWQsCisJCQkgICAgICBlbnVtIGllZWU4MDIxMV90eF9zeW5jX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKKwlpbnQgcmV0OworCXU4IHN0YV9pZDsKKworCWlmIChjdHgtPmN0eGlkICE9IElXTF9SWE9OX0NUWF9QQU4pCisJCXJldHVybiAwOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKGl3bF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKSB7CisJCXJldCA9IDA7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjdHgtPnByZWF1dGhfYnNzaWQgfHwgdGVzdF9iaXQoU1RBVFVTX1NDQU5fSFcsCisJICAgICZwcml2LT5zaHJkLT5zdGF0dXMpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gaXdsX2FkZF9zdGF0aW9uX2NvbW1vbihwcml2LCBjdHgsIGJzc2lkLCB0cnVlLCBOVUxMLCAmc3RhX2lkKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCWlmIChXQVJOX09OKHN0YV9pZCAhPSBjdHgtPmFwX3N0YV9pZCkpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBvdXRfcmVtb3ZlX3N0YTsKKwl9CisKKwltZW1jcHkoY3R4LT5ic3NpZCwgYnNzaWQsIEVUSF9BTEVOKTsKKwljdHgtPnByZWF1dGhfYnNzaWQgPSB0cnVlOworCisJcmV0ID0gaXdsYWduX2NvbW1pdF9yeG9uKHByaXYsIGN0eCk7CisKKwlpZiAocmV0ID09IDApCisJCWdvdG8gb3V0OworCisgb3V0X3JlbW92ZV9zdGE6CisJaXdsX3JlbW92ZV9zdGF0aW9uKHByaXYsIHN0YV9pZCwgYnNzaWQpOworIG91dDoKKwltdXRleF91bmxvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfZmluaXNoX3R4X3N5bmMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQkgICBjb25zdCB1OCAqYnNzaWQsCisJCQkJICAgZW51bSBpZWVlODAyMTFfdHhfc3luY190eXBlIHR5cGUpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF92aWZfcHJpdiAqdmlmX3ByaXYgPSAodm9pZCAqKXZpZi0+ZHJ2X3ByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IHZpZl9wcml2LT5jdHg7CisKKwlpZiAoY3R4LT5jdHhpZCAhPSBJV0xfUlhPTl9DVFhfUEFOKQorCQlyZXR1cm47CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlpZiAoaXdsX2lzX2Fzc29jaWF0ZWRfY3R4KGN0eCkpCisJCWdvdG8gb3V0OworCisJaXdsX3JlbW92ZV9zdGF0aW9uKHByaXYsIGN0eC0+YXBfc3RhX2lkLCBic3NpZCk7CisJY3R4LT5wcmVhdXRoX2Jzc2lkID0gZmFsc2U7CisJLyogbm8gbmVlZCB0byBjb21taXQgKi8KKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfcnNzaV9jYWxsYmFjayhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgIGVudW0gaWVlZTgwMjExX3Jzc2lfZXZlbnQgcnNzaV9ldmVudCkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXJcbiIpOworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCQkJY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKKwkJaWYgKHJzc2lfZXZlbnQgPT0gUlNTSV9FVkVOVF9MT1cpCisJCQlwcml2LT5idF9lbmFibGVfcHNwb2xsID0gdHJ1ZTsKKwkJZWxzZSBpZiAocnNzaV9ldmVudCA9PSBSU1NJX0VWRU5UX0hJR0gpCisJCQlwcml2LT5idF9lbmFibGVfcHNwb2xsID0gZmFsc2U7CisKKwkJaXdsYWduX3NlbmRfYWR2YW5jZV9idF9jb25maWcocHJpdik7CisJfSBlbHNlIHsKKwkJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJBZHZhbmNlZCBCVCBjb2V4IGRpc2FibGVkLCIKKwkJCQkiaWdub3JpbmcgUlNTSSBjYWxsYmFja1xuIik7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19zZXRfdGltKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgYm9vbCBzZXQpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisKKwlxdWV1ZV93b3JrKHByaXYtPnNocmQtPndvcmtxdWV1ZSwgJnByaXYtPmJlYWNvbl91cGRhdGUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19jb25mX3R4KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTE2IHF1ZXVlLAorCQkgICAgY29uc3Qgc3RydWN0IGllZWU4MDIxMV90eF9xdWV1ZV9wYXJhbXMgKnBhcmFtcykKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3ZpZl9wcml2ICp2aWZfcHJpdiA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gdmlmX3ByaXYtPmN0eDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBxOworCisJaWYgKFdBUk5fT04oIWN0eCkpCisJCXJldHVybiAtRUlOVkFMOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlclxuIik7CisKKwlpZiAoIWl3bF9pc19yZWFkeV9yZihwcml2LT5zaHJkKSkgeworCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gUkYgbm90IHJlYWR5XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHF1ZXVlID49IEFDX05VTSkgeworCQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlIC0gcXVldWUgPj0gQUNfTlVNICVkXG4iLCBxdWV1ZSk7CisJCXJldHVybiAwOworCX0KKworCXEgPSBBQ19OVU0gLSAxIC0gcXVldWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+c2hyZC0+bG9jaywgZmxhZ3MpOworCisJY3R4LT5xb3NfZGF0YS5kZWZfcW9zX3Bhcm0uYWNbcV0uY3dfbWluID0KKwkJY3B1X3RvX2xlMTYocGFyYW1zLT5jd19taW4pOworCWN0eC0+cW9zX2RhdGEuZGVmX3Fvc19wYXJtLmFjW3FdLmN3X21heCA9CisJCWNwdV90b19sZTE2KHBhcmFtcy0+Y3dfbWF4KTsKKwljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5haWZzbiA9IHBhcmFtcy0+YWlmczsKKwljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5lZGNhX3R4b3AgPQorCQkJY3B1X3RvX2xlMTYoKHBhcmFtcy0+dHhvcCAqIDMyKSk7CisKKwljdHgtPnFvc19kYXRhLmRlZl9xb3NfcGFybS5hY1txXS5yZXNlcnZlZDEgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+c2hyZC0+bG9jaywgZmxhZ3MpOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY190eF9sYXN0X2JlYWNvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKworCXJldHVybiBwcml2LT5pYnNzX21hbmFnZXIgPT0gSVdMX0lCU1NfTUFOQUdFUjsKK30KKworc3RhdGljIGludCBpd2xfc2V0X21vZGUoc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQoreworCWl3bF9jb25uZWN0aW9uX2luaXRfcnhfY29uZmlnKHByaXYsIGN0eCk7CisKKwlpd2xhZ25fc2V0X3J4b25fY2hhaW4ocHJpdiwgY3R4KTsKKworCXJldHVybiBpd2xhZ25fY29tbWl0X3J4b24ocHJpdiwgY3R4KTsKK30KKworc3RhdGljIGludCBpd2xfc2V0dXBfaW50ZXJmYWNlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCSAgICAgICBzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSBjdHgtPnZpZjsKKwlpbnQgZXJyOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJLyoKKwkgKiBUaGlzIHZhcmlhYmxlIHdpbGwgYmUgY29ycmVjdCBvbmx5IHdoZW4gdGhlcmUncyBqdXN0CisJICogYSBzaW5nbGUgY29udGV4dCwgYnV0IGFsbCBjb2RlIHVzaW5nIGl0IGlzIGZvciBoYXJkd2FyZQorCSAqIHRoYXQgc3VwcG9ydHMgb25seSBvbmUgY29udGV4dC4KKwkgKi8KKwlwcml2LT5pd19tb2RlID0gdmlmLT50eXBlOworCisJY3R4LT5pc19hY3RpdmUgPSB0cnVlOworCisJZXJyID0gaXdsX3NldF9tb2RlKHByaXYsIGN0eCk7CisJaWYgKGVycikgeworCQlpZiAoIWN0eC0+YWx3YXlzX2FjdGl2ZSkKKwkJCWN0eC0+aXNfYWN0aXZlID0gZmFsc2U7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKGNmZyhwcml2KS0+YnRfcGFyYW1zICYmIGNmZyhwcml2KS0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0ICYmCisJICAgIHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCQkvKgorCQkgKiBwcmV0ZW5kIHRvIGhhdmUgaGlnaCBCVCB0cmFmZmljIGFzIGxvbmcgYXMgd2UKKwkJICogYXJlIG9wZXJhdGluZyBpbiBJQlNTIG1vZGUsIGFzIHRoaXMgd2lsbCBjYXVzZQorCQkgKiB0aGUgcmF0ZSBzY2FsaW5nIGV0Yy4gdG8gYmVoYXZlIGFzIGludGVuZGVkLgorCQkgKi8KKwkJcHJpdi0+YnRfdHJhZmZpY19sb2FkID0gSVdMX0JUX0NPRVhfVFJBRkZJQ19MT0FEX0hJR0g7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdsYWduX21hY19hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfdmlmX3ByaXYgKnZpZl9wcml2ID0gKHZvaWQgKil2aWYtPmRydl9wcml2OworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICp0bXAsICpjdHggPSBOVUxMOworCWludCBlcnI7CisJZW51bSBubDgwMjExX2lmdHlwZSB2aWZ0eXBlID0gaWVlZTgwMjExX3ZpZl90eXBlX3AycCh2aWYpOworCisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJlbnRlcjogdHlwZSAlZCwgYWRkciAlcE1cbiIsCisJCQkgICB2aWZ0eXBlLCB2aWYtPmFkZHIpOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2LT5od19yb2NfZGlzYWJsZV93b3JrKTsKKworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCWl3bGFnbl9kaXNhYmxlX3JvYyhwcml2KTsKKworCWlmICghaXdsX2lzX3JlYWR5X3JmKHByaXYtPnNocmQpKSB7CisJCUlXTF9XQVJOKHByaXYsICJUcnkgdG8gYWRkIGludGVyZmFjZSB3aGVuIGRldmljZSBub3QgcmVhZHlcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkgeworCQl1MzIgcG9zc2libGVfbW9kZXMgPQorCQkJdG1wLT5pbnRlcmZhY2VfbW9kZXMgfCB0bXAtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXM7CisKKwkJaWYgKHRtcC0+dmlmKSB7CisJCQkvKiBjaGVjayBpZiB0aGlzIGJ1c3kgY29udGV4dCBpcyBleGNsdXNpdmUgKi8KKwkJCWlmICh0bXAtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgJgorCQkJCQkJQklUKHRtcC0+dmlmLT50eXBlKSkgeworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICghKHBvc3NpYmxlX21vZGVzICYgQklUKHZpZnR5cGUpKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIGhhdmUgbWF5YmUgdXNhYmxlIGNvbnRleHQgdy9vIGludGVyZmFjZSAqLworCQljdHggPSB0bXA7CisJCWJyZWFrOworCX0KKworCWlmICghY3R4KSB7CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlnb3RvIG91dDsKKwl9CisKKwl2aWZfcHJpdi0+Y3R4ID0gY3R4OworCWN0eC0+dmlmID0gdmlmOworCisJZXJyID0gaXdsX3NldHVwX2ludGVyZmFjZShwcml2LCBjdHgpOworCWlmICghZXJyKQorCQlnb3RvIG91dDsKKworCWN0eC0+dmlmID0gTlVMTDsKKwlwcml2LT5pd19tb2RlID0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTjsKKyBvdXQ6CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBpd2xfdGVhcmRvd25faW50ZXJmYWNlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCSAgIGJvb2wgbW9kZV9jaGFuZ2UpCit7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKHByaXYtPnNjYW5fdmlmID09IHZpZikgeworCQlpd2xfc2Nhbl9jYW5jZWxfdGltZW91dChwcml2LCAyMDApOworCQlpd2xfZm9yY2Vfc2Nhbl9lbmQocHJpdik7CisJfQorCisJaWYgKCFtb2RlX2NoYW5nZSkgeworCQlpd2xfc2V0X21vZGUocHJpdiwgY3R4KTsKKwkJaWYgKCFjdHgtPmFsd2F5c19hY3RpdmUpCisJCQljdHgtPmlzX2FjdGl2ZSA9IGZhbHNlOworCX0KKworCS8qCisJICogV2hlbiByZW1vdmluZyB0aGUgSUJTUyBpbnRlcmZhY2UsIG92ZXJ3cml0ZSB0aGUKKwkgKiBCVCB0cmFmZmljIGxvYWQgd2l0aCB0aGUgc3RvcmVkIG9uZSBmcm9tIHRoZSBsYXN0CisJICogbm90aWZpY2F0aW9uLCBpZiBhbnkuIElmIHRoaXMgaXMgYSBkZXZpY2UgdGhhdAorCSAqIGRvZXNuJ3QgaW1wbGVtZW50IHRoaXMsIHRoaXMgaGFzIG5vIGVmZmVjdCBzaW5jZQorCSAqIGJvdGggdmFsdWVzIGFyZSB0aGUgc2FtZSBhbmQgemVyby4KKwkgKi8KKwlpZiAodmlmLT50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQorCQlwcml2LT5idF90cmFmZmljX2xvYWQgPSBwcml2LT5sYXN0X2J0X3RyYWZmaWNfbG9hZDsKK30KKworc3RhdGljIHZvaWQgaXdsYWduX21hY19yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3J4b25fY29udGV4dCAqY3R4ID0gaXdsX3J4b25fY3R4X2Zyb21fdmlmKHZpZik7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKworCW11dGV4X2xvY2soJnByaXYtPnNocmQtPm11dGV4KTsKKworCWlmIChXQVJOX09OKGN0eC0+dmlmICE9IHZpZikpIHsKKwkJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKnRtcDsKKwkJSVdMX0VSUihwcml2LCAiY3R4LT52aWYgPSAlcCwgdmlmID0gJXBcbiIsIGN0eC0+dmlmLCB2aWYpOworCQlmb3JfZWFjaF9jb250ZXh0KHByaXYsIHRtcCkKKwkJCUlXTF9FUlIocHJpdiwgIlx0SUQgPSAlZDpcdGN0eCA9ICVwXHRjdHgtPnZpZiA9ICVwXG4iLAorCQkJCXRtcC0+Y3R4aWQsIHRtcCwgdG1wLT52aWYpOworCX0KKwljdHgtPnZpZiA9IE5VTEw7CisKKwlpd2xfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgZmFsc2UpOworCisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworfQorCitzdGF0aWMgaW50IGl3bGFnbl9tYWNfY2hhbmdlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCWVudW0gbmw4MDIxMV9pZnR5cGUgbmV3dHlwZSwgYm9vbCBuZXdwMnApCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF9yeG9uX2NvbnRleHQgKmN0eCA9IGl3bF9yeG9uX2N0eF9mcm9tX3ZpZih2aWYpOworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpic3NfY3R4ID0gJnByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdOworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICp0bXA7CisJZW51bSBubDgwMjExX2lmdHlwZSBuZXd2aWZ0eXBlID0gbmV3dHlwZTsKKwl1MzIgaW50ZXJmYWNlX21vZGVzOworCWludCBlcnI7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKworCW5ld3R5cGUgPSBpZWVlODAyMTFfaWZ0eXBlX3AycChuZXd0eXBlLCBuZXdwMnApOworCisJbXV0ZXhfbG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJaWYgKCFjdHgtPnZpZiB8fCAhaXdsX2lzX3JlYWR5X3JmKHByaXYtPnNocmQpKSB7CisJCS8qCisJCSAqIEh1aD8gQnV0IHdhaXQgLi4uIHRoaXMgY2FuIG1heWJlIGhhcHBlbiB3aGVuCisJCSAqIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgYSBmaXJtd2FyZSByZXN0YXJ0IQorCQkgKi8KKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlpbnRlcmZhY2VfbW9kZXMgPSBjdHgtPmludGVyZmFjZV9tb2RlcyB8IGN0eC0+ZXhjbHVzaXZlX2ludGVyZmFjZV9tb2RlczsKKworCWlmICghKGludGVyZmFjZV9tb2RlcyAmIEJJVChuZXd0eXBlKSkpIHsKKwkJZXJyID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIFJlZnVzZSBhIGNoYW5nZSB0aGF0IHNob3VsZCBiZSBkb25lIGJ5IG1vdmluZyBmcm9tIHRoZSBQQU4KKwkgKiBjb250ZXh0IHRvIHRoZSBCU1MgY29udGV4dCBpbnN0ZWFkLCBpZiB0aGUgQlNTIGNvbnRleHQgaXMKKwkgKiBhdmFpbGFibGUgYW5kIGNhbiBzdXBwb3J0IHRoZSBuZXcgaW50ZXJmYWNlIHR5cGUuCisJICovCisJaWYgKGN0eC0+Y3R4aWQgPT0gSVdMX1JYT05fQ1RYX1BBTiAmJiAhYnNzX2N0eC0+dmlmICYmCisJICAgIChic3NfY3R4LT5pbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkgfHwKKwkgICAgIGJzc19jdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpKSB7CisJCUJVSUxEX0JVR19PTihOVU1fSVdMX1JYT05fQ1RYICE9IDIpOworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChjdHgtPmV4Y2x1c2l2ZV9pbnRlcmZhY2VfbW9kZXMgJiBCSVQobmV3dHlwZSkpIHsKKwkJZm9yX2VhY2hfY29udGV4dChwcml2LCB0bXApIHsKKwkJCWlmIChjdHggPT0gdG1wKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoIXRtcC0+dmlmKQorCQkJCWNvbnRpbnVlOworCisJCQkvKgorCQkJICogVGhlIGN1cnJlbnQgbW9kZSBzd2l0Y2ggd291bGQgYmUgZXhjbHVzaXZlLCBidXQKKwkJCSAqIGFub3RoZXIgY29udGV4dCBpcyBhY3RpdmUgLi4uIHJlZnVzZSB0aGUgc3dpdGNoLgorCQkJICovCisJCQllcnIgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCS8qIHN1Y2Nlc3MgKi8KKwlpd2xfdGVhcmRvd25faW50ZXJmYWNlKHByaXYsIHZpZiwgdHJ1ZSk7CisJdmlmLT50eXBlID0gbmV3dmlmdHlwZTsKKwl2aWYtPnAycCA9IG5ld3AycDsKKwllcnIgPSBpd2xfc2V0dXBfaW50ZXJmYWNlKHByaXYsIGN0eCk7CisJV0FSTl9PTihlcnIpOworCS8qCisJICogV2UndmUgc3dpdGNoZWQgaW50ZXJuYWxseSwgYnV0IHN1Ym1pdHRpbmcgdG8gdGhlCisJICogZGV2aWNlIG1heSBoYXZlIGZhaWxlZCBmb3Igc29tZSByZWFzb24uIE1hc2sgdGhpcworCSAqIGVycm9yLCBiZWNhdXNlIG90aGVyd2lzZSBtYWM4MDIxMSB3aWxsIG5vdCBzd2l0Y2gKKwkgKiAoYW5kIHNldCB0aGUgaW50ZXJmYWNlIHR5cGUgYmFjaykgYW5kIHdlJ2xsIGJlCisJICogb3V0IG9mIHN5bmMgd2l0aCBpdC4KKwkgKi8KKwllcnIgPSAwOworCisgb3V0OgorCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCWludCByZXQ7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKworCWlmIChyZXEtPm5fY2hhbm5lbHMgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisKKwkvKgorCSAqIElmIGFuIGludGVybmFsIHNjYW4gaXMgaW4gcHJvZ3Jlc3MsIGp1c3Qgc2V0CisJICogdXAgdGhlIHNjYW5fcmVxdWVzdCBhcyBwZXIgYWJvdmUuCisJICovCisJaWYgKHByaXYtPnNjYW5fdHlwZSAhPSBJV0xfU0NBTl9OT1JNQUwpIHsKKwkJSVdMX0RFQlVHX1NDQU4ocHJpdiwKKwkJCSAgICAgICAiU0NBTiByZXF1ZXN0IGR1cmluZyBpbnRlcm5hbCBzY2FuIC0gZGVmZXJcbiIpOworCQlwcml2LT5zY2FuX3JlcXVlc3QgPSByZXE7CisJCXByaXYtPnNjYW5fdmlmID0gdmlmOworCQlyZXQgPSAwOworCX0gZWxzZSB7CisJCXByaXYtPnNjYW5fcmVxdWVzdCA9IHJlcTsKKwkJcHJpdi0+c2Nhbl92aWYgPSB2aWY7CisJCS8qCisJCSAqIG1hYzgwMjExIHdpbGwgb25seSBhc2sgZm9yIG9uZSBiYW5kIGF0IGEgdGltZQorCQkgKiBzbyB1c2luZyBjaGFubmVsc1swXSBoZXJlIGlzIG9rCisJCSAqLworCQlyZXQgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2LCB2aWYsIElXTF9TQ0FOX05PUk1BTCwKKwkJCQkJcmVxLT5jaGFubmVsc1swXS0+YmFuZCk7CisJCWlmIChyZXQpIHsKKwkJCXByaXYtPnNjYW5fcmVxdWVzdCA9IE5VTEw7CisJCQlwcml2LT5zY2FuX3ZpZiA9IE5VTEw7CisJCX0KKwl9CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKKworCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpd2xhZ25fbWFjX3N0YV9yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKK3sKKwlzdHJ1Y3QgaXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaXdsX3N0YXRpb25fcHJpdiAqc3RhX3ByaXYgPSAodm9pZCAqKXN0YS0+ZHJ2X3ByaXY7CisJaW50IHJldDsKKworCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAiZW50ZXI6IHJlY2VpdmVkIHJlcXVlc3QgdG8gcmVtb3ZlICIKKwkJCSAgICJzdGF0aW9uICVwTVxuIiwgc3RhLT5hZGRyKTsKKwltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX0lORk8ocHJpdiwgInByb2NlZWRpbmcgdG8gcmVtb3ZlIHN0YXRpb24gJXBNXG4iLAorCQkJc3RhLT5hZGRyKTsKKwlyZXQgPSBpd2xfcmVtb3ZlX3N0YXRpb24ocHJpdiwgc3RhX3ByaXYtPnN0YV9pZCwgc3RhLT5hZGRyKTsKKwlpZiAocmV0KQorCQlJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHByaXYsICJFcnJvciByZW1vdmluZyBzdGF0aW9uICVwTVxuIiwKKwkJCXN0YS0+YWRkcik7CisJbXV0ZXhfdW5sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7CisJSVdMX0RFQlVHX01BQzgwMjExKHByaXYsICJsZWF2ZVxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBpd2xfc3RhX21vZGlmeV9wc193YWtlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgaW50IHN0YV9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnByaXYtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7CisJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFncyAmPSB+U1RBX0ZMR19QV1JfU0FWRV9NU0s7CisJcHJpdi0+c3RhdGlvbnNbc3RhX2lkXS5zdGEuc3RhdGlvbl9mbGFnc19tc2sgPSBTVEFfRkxHX1BXUl9TQVZFX01TSzsKKwlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5zdGEubW9kaWZ5X21hc2sgPSAwOworCXByaXYtPnN0YXRpb25zW3N0YV9pZF0uc3RhLnNsZWVwX3R4X2NvdW50ID0gMDsKKwlwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YS5tb2RlID0gU1RBX0NPTlRST0xfTU9ESUZZX01TSzsKKwlpd2xfc2VuZF9hZGRfc3RhKHByaXYsICZwcml2LT5zdGF0aW9uc1tzdGFfaWRdLnN0YSwgQ01EX0FTWU5DKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcml2LT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOworCit9CisKK3N0YXRpYyB2b2lkIGl3bGFnbl9tYWNfc3RhX25vdGlmeShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICBlbnVtIHN0YV9ub3RpZnlfY21kIGNtZCwKKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IGl3bF9zdGF0aW9uX3ByaXYgKnN0YV9wcml2ID0gKHZvaWQgKilzdGEtPmRydl9wcml2OworCWludCBzdGFfaWQ7CisKKwlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTVEFfTk9USUZZX1NMRUVQOgorCQlXQVJOX09OKCFzdGFfcHJpdi0+Y2xpZW50KTsKKwkJc3RhX3ByaXYtPmFzbGVlcCA9IHRydWU7CisJCWlmIChhdG9taWNfcmVhZCgmc3RhX3ByaXYtPnBlbmRpbmdfZnJhbWVzKSA+IDApCisJCQlpZWVlODAyMTFfc3RhX2Jsb2NrX2F3YWtlKGh3LCBzdGEsIHRydWUpOworCQlicmVhazsKKwljYXNlIFNUQV9OT1RJRllfQVdBS0U6CisJCVdBUk5fT04oIXN0YV9wcml2LT5jbGllbnQpOworCQlpZiAoIXN0YV9wcml2LT5hc2xlZXApCisJCQlicmVhazsKKwkJc3RhX3ByaXYtPmFzbGVlcCA9IGZhbHNlOworCQlzdGFfaWQgPSBpd2xfc3RhX2lkKHN0YSk7CisJCWlmIChzdGFfaWQgIT0gSVdMX0lOVkFMSURfU1RBVElPTikKKwkJCWl3bF9zdGFfbW9kaWZ5X3BzX3dha2UocHJpdiwgc3RhX2lkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCUlXTF9ERUJVR19NQUM4MDIxMShwcml2LCAibGVhdmVcbiIpOworfQorCitzdHJ1Y3QgaWVlZTgwMjExX29wcyBpd2xhZ25faHdfb3BzID0geworCS50eCA9IGl3bGFnbl9tYWNfdHgsCisJLnN0YXJ0ID0gaXdsYWduX21hY19zdGFydCwKKwkuc3RvcCA9IGl3bGFnbl9tYWNfc3RvcCwKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKKwkuc3VzcGVuZCA9IGl3bGFnbl9tYWNfc3VzcGVuZCwKKwkucmVzdW1lID0gaXdsYWduX21hY19yZXN1bWUsCisjZW5kaWYKKwkuYWRkX2ludGVyZmFjZSA9IGl3bGFnbl9tYWNfYWRkX2ludGVyZmFjZSwKKwkucmVtb3ZlX2ludGVyZmFjZSA9IGl3bGFnbl9tYWNfcmVtb3ZlX2ludGVyZmFjZSwKKwkuY2hhbmdlX2ludGVyZmFjZSA9IGl3bGFnbl9tYWNfY2hhbmdlX2ludGVyZmFjZSwKKwkuY29uZmlnID0gaXdsYWduX21hY19jb25maWcsCisJLmNvbmZpZ3VyZV9maWx0ZXIgPSBpd2xhZ25fY29uZmlndXJlX2ZpbHRlciwKKwkuc2V0X2tleSA9IGl3bGFnbl9tYWNfc2V0X2tleSwKKwkudXBkYXRlX3RraXBfa2V5ID0gaXdsYWduX21hY191cGRhdGVfdGtpcF9rZXksCisJLnNldF9yZWtleV9kYXRhID0gaXdsYWduX21hY19zZXRfcmVrZXlfZGF0YSwKKwkuY29uZl90eCA9IGl3bGFnbl9tYWNfY29uZl90eCwKKwkuYnNzX2luZm9fY2hhbmdlZCA9IGl3bGFnbl9ic3NfaW5mb19jaGFuZ2VkLAorCS5hbXBkdV9hY3Rpb24gPSBpd2xhZ25fbWFjX2FtcGR1X2FjdGlvbiwKKwkuaHdfc2NhbiA9IGl3bGFnbl9tYWNfaHdfc2NhbiwKKwkuc3RhX25vdGlmeSA9IGl3bGFnbl9tYWNfc3RhX25vdGlmeSwKKwkuc3RhX2FkZCA9IGl3bGFnbl9tYWNfc3RhX2FkZCwKKwkuc3RhX3JlbW92ZSA9IGl3bGFnbl9tYWNfc3RhX3JlbW92ZSwKKwkuY2hhbm5lbF9zd2l0Y2ggPSBpd2xhZ25fbWFjX2NoYW5uZWxfc3dpdGNoLAorCS5mbHVzaCA9IGl3bGFnbl9tYWNfZmx1c2gsCisJLnR4X2xhc3RfYmVhY29uID0gaXdsYWduX21hY190eF9sYXN0X2JlYWNvbiwKKwkucmVtYWluX29uX2NoYW5uZWwgPSBpd2xhZ25fbWFjX3JlbWFpbl9vbl9jaGFubmVsLAorCS5jYW5jZWxfcmVtYWluX29uX2NoYW5uZWwgPSBpd2xhZ25fbWFjX2NhbmNlbF9yZW1haW5fb25fY2hhbm5lbCwKKwkucnNzaV9jYWxsYmFjayA9IGl3bGFnbl9tYWNfcnNzaV9jYWxsYmFjaywKKwlDRkc4MDIxMV9URVNUTU9ERV9DTUQoaXdsYWduX21hY190ZXN0bW9kZV9jbWQpCisJQ0ZHODAyMTFfVEVTVE1PREVfRFVNUChpd2xhZ25fbWFjX3Rlc3Rtb2RlX2R1bXApCisJLnR4X3N5bmMgPSBpd2xhZ25fbWFjX3R4X3N5bmMsCisJLmZpbmlzaF90eF9zeW5jID0gaXdsYWduX21hY19maW5pc2hfdHhfc3luYywKKwkuc2V0X3RpbSA9IGl3bGFnbl9tYWNfc2V0X3RpbSwKK307CisKKy8qIFRoaXMgZnVuY3Rpb24gYm90aCBhbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIGh3IGFuZCBwcml2LiAqLworc3RydWN0IGllZWU4MDIxMV9odyAqaXdsX2FsbG9jX2FsbCh2b2lkKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKKwkvKiBtYWM4MDIxMSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB0aGlzIGRldmljZSBpbnN0YW5jZSwgaW5jbHVkaW5nCisJICogICBzcGFjZSBmb3IgdGhpcyBkcml2ZXIncyBwcml2YXRlIHN0cnVjdHVyZSAqLworCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OworCisJaHcgPSBpZWVlODAyMTFfYWxsb2NfaHcoc2l6ZW9mKHN0cnVjdCBpd2xfcHJpdiksICZpd2xhZ25faHdfb3BzKTsKKwlpZiAoIWh3KQorCQlnb3RvIG91dDsKKworCXByaXYgPSBody0+cHJpdjsKKwlwcml2LT5odyA9IGh3OworCitvdXQ6CisJcmV0dXJuIGh3OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wY2kuYwppbmRleCAxODAwMDI5Li5mYjMwZWE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wY2kuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wY2kuYwpAQCAtMTM1LDcgKzEzNSw3IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBpd2xfcGNpX2dldF9od19pZChzdHJ1Y3QgaXdsX2J1cyAqYnVzLCBjaGFyIGJ1ZltdLAorc3RhdGljIHZvaWQgaXdsX3BjaV9nZXRfaHdfaWRfc3RyaW5nKHN0cnVjdCBpd2xfYnVzICpidXMsIGNoYXIgYnVmW10sCiAJCQkgICAgICBpbnQgYnVmX2xlbikKIHsKIAlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IElXTF9CVVNfR0VUX1BDSV9ERVYoYnVzKTsKQEAgLTE0NCw2ICsxNDQsMTMgQEAKIAkJIHBjaV9kZXYtPnN1YnN5c3RlbV9kZXZpY2UpOwogfQogCitzdGF0aWMgdTMyIGl3bF9wY2lfZ2V0X2h3X2lkKHN0cnVjdCBpd2xfYnVzICpidXMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBJV0xfQlVTX0dFVF9QQ0lfREVWKGJ1cyk7CisKKwlyZXR1cm4gKHBjaV9kZXYtPmRldmljZSA8PCAxNikgKyBwY2lfZGV2LT5zdWJzeXN0ZW1fZGV2aWNlOworfQorCiBzdGF0aWMgdm9pZCBpd2xfcGNpX3dyaXRlOChzdHJ1Y3QgaXdsX2J1cyAqYnVzLCB1MzIgb2ZzLCB1OCB2YWwpCiB7CiAJaW93cml0ZTgodmFsLCBJV0xfQlVTX0dFVF9QQ0lfQlVTKGJ1cyktPmh3X2Jhc2UgKyBvZnMpOwpAQCAtMTYzLDYgKzE3MCw3IEBACiBzdGF0aWMgY29uc3Qgc3RydWN0IGl3bF9idXNfb3BzIGJ1c19vcHNfcGNpID0gewogCS5nZXRfcG1fc3VwcG9ydCA9IGl3bF9wY2lfaXNfcG1fc3VwcG9ydGVkLAogCS5hcG1fY29uZmlnID0gaXdsX3BjaV9hcG1fY29uZmlnLAorCS5nZXRfaHdfaWRfc3RyaW5nID0gaXdsX3BjaV9nZXRfaHdfaWRfc3RyaW5nLAogCS5nZXRfaHdfaWQgPSBpd2xfcGNpX2dldF9od19pZCwKIAkud3JpdGU4ID0gaXdsX3BjaV93cml0ZTgsCiAJLndyaXRlMzIgPSBpd2xfcGNpX3dyaXRlMzIsCkBAIC0yNTYsNiArMjY0LDggQEAKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwMDgyLCAweEMwMjAsIGl3bDYwMDVfMmFnbl9zZmZfY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDA4NSwgMHhDMjIwLCBpd2w2MDA1XzJhZ25fc2ZmX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDAwODIsIDB4MTM0MSwgaXdsNjAwNV8yYWduX2RfY2ZnKX0sCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzA0LCBpd2w2MDA1XzJhZ25fY2ZnKX0sLyogbG93IDVHSHogYWN0aXZlICovCisJe0lXTF9QQ0lfREVWSUNFKDB4MDA4MiwgMHgxMzA1LCBpd2w2MDA1XzJhZ25fY2ZnKX0sLyogaGlnaCA1R0h6IGFjdGl2ZSAqLwogCiAvKiA2eDMwIFNlcmllcyAqLwogCXtJV0xfUENJX0RFVklDRSgweDAwOEEsIDB4NTMwNSwgaXdsMTAzMF9iZ25fY2ZnKX0sCkBAIC0zMjUsNDYgKzMzNSwyOCBAQAogCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDAyMiwgaXdsMjAwMF8yYmduX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4OTEsIDB4NDIyMiwgaXdsMjAwMF8yYmduX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDQyMiwgaXdsMjAwMF8yYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDAyNiwgaXdsMjAwMF8yYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg5MSwgMHg0MjI2LCBpd2wyMDAwXzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODkwLCAweDQ0MjYsIGl3bDIwMDBfMmJnX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4OTAsIDB4NDgyMiwgaXdsMjAwMF8yYmduX2RfY2ZnKX0sCiAKIC8qIDJ4MzAgU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NywgMHg0MDYyLCBpd2wyMDMwXzJiZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4OCwgMHg0MjYyLCBpd2wyMDMwXzJiZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4NywgMHg0NDYyLCBpd2wyMDMwXzJiZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4NywgMHg0MDY2LCBpd2wyMDMwXzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODg4LCAweDQyNjYsIGl3bDIwMzBfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4ODcsIDB4NDQ2NiwgaXdsMjAzMF8yYmdfY2ZnKX0sCiAKIC8qIDZ4MzUgU2VyaWVzICovCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0MDYwLCBpd2w2MDM1XzJhZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4RiwgMHg0MjYwLCBpd2w2MDM1XzJhZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0NDYwLCBpd2w2MDM1XzJhZ25fY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0MDY0LCBpd2w2MDM1XzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RiwgMHg0MjY0LCBpd2w2MDM1XzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0NDY0LCBpd2w2MDM1XzJhYmdfY2ZnKX0sCi0Je0lXTF9QQ0lfREVWSUNFKDB4MDg4RSwgMHg0MDY2LCBpd2w2MDM1XzJiZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODhGLCAweDQyNjYsIGl3bDYwMzVfMmJnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OEUsIDB4NDQ2NiwgaXdsNjAzNV8yYmdfY2ZnKX0sCiAKIC8qIDEwNSBTZXJpZXMgKi8KIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDAwMjIsIGl3bDEwNV9iZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg5NSwgMHgwMjIyLCBpd2wxMDVfYmduX2NmZyl9LAogCXtJV0xfUENJX0RFVklDRSgweDA4OTQsIDB4MDQyMiwgaXdsMTA1X2Jnbl9jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDAwMjYsIGl3bDEwNV9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk1LCAweDAyMjYsIGl3bDEwNV9iZ19jZmcpfSwKLQl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDA0MjYsIGl3bDEwNV9iZ19jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODk0LCAweDA4MjIsIGl3bDEwNV9iZ25fZF9jZmcpfSwKIAogLyogMTM1IFNlcmllcyAqLwogCXtJV0xfUENJX0RFVklDRSgweDA4OTIsIDB4MDA2MiwgaXdsMTM1X2Jnbl9jZmcpfSwKIAl7SVdMX1BDSV9ERVZJQ0UoMHgwODkzLCAweDAyNjIsIGl3bDEzNV9iZ25fY2ZnKX0sCiAJe0lXTF9QQ0lfREVWSUNFKDB4MDg5MiwgMHgwNDYyLCBpd2wxMzVfYmduX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTIsIDB4MDA2NiwgaXdsMTM1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTMsIDB4MDI2NiwgaXdsMTM1X2JnX2NmZyl9LAotCXtJV0xfUENJX0RFVklDRSgweDA4OTIsIDB4MDQ2NiwgaXdsMTM1X2JnX2NmZyl9LAogCiAJezB9CiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXBvd2VyLmMKaW5kZXggNGVhYWIyMC4uMmIxODhhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtcG93ZXIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1wb3dlci5jCkBAIC0xNjcsNyArMTY3LDcgQEAKIAl1OCBza2lwOwogCXUzMiBzbHBfaXRydmw7CiAKLQlpZiAocHJpdi0+Y2ZnLT5hZHZfcG0pIHsKKwlpZiAoY2ZnKHByaXYpLT5hZHZfcG0pIHsKIAkJdGFibGUgPSBhcG1fcmFuZ2VfMjsKIAkJaWYgKHBlcmlvZCA8PSBJV0xfRFRJTV9SQU5HRV8xX01BWCkKIAkJCXRhYmxlID0gYXBtX3JhbmdlXzE7CkBAIC0yMjEsNyArMjIxLDcgQEAKIAkJY21kLT5mbGFncyAmPSB+SVdMX1BPV0VSX1NIQURPV19SRUdfRU5BOwogCiAJaWYgKGl3bF9hZHZhbmNlZF9idF9jb2V4aXN0KHByaXYpKSB7Ci0JCWlmICghcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmJ0X3Njb19kaXNhYmxlKQorCQlpZiAoIWNmZyhwcml2KS0+YnRfcGFyYW1zLT5idF9zY29fZGlzYWJsZSkKIAkJCWNtZC0+ZmxhZ3MgfD0gSVdMX1BPV0VSX0JUX1NDT19FTkE7CiAJCWVsc2UKIAkJCWNtZC0+ZmxhZ3MgJj0gfklXTF9QT1dFUl9CVF9TQ09fRU5BOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJCWNtZC0+ZmxhZ3MgJj0gfklXTF9QT1dFUl9TSEFET1dfUkVHX0VOQTsKIAogCWlmIChpd2xfYWR2YW5jZWRfYnRfY29leGlzdChwcml2KSkgewotCQlpZiAoIXByaXYtPmNmZy0+YnRfcGFyYW1zLT5idF9zY29fZGlzYWJsZSkKKwkJaWYgKCFjZmcocHJpdiktPmJ0X3BhcmFtcy0+YnRfc2NvX2Rpc2FibGUpCiAJCQljbWQtPmZsYWdzIHw9IElXTF9QT1dFUl9CVF9TQ09fRU5BOwogCQllbHNlCiAJCQljbWQtPmZsYWdzICY9IH5JV0xfUE9XRVJfQlRfU0NPX0VOQTsKQEAgLTM1MCw3ICszNTAsNyBAQAogCiAJaWYgKHByaXYtPnNocmQtPndvd2xhbikKIAkJaXdsX3N0YXRpY19zbGVlcF9jbWQocHJpdiwgY21kLCBJV0xfUE9XRVJfSU5ERVhfNSwgZHRpbXBlcik7Ci0JZWxzZSBpZiAoIXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPm5vX2lkbGVfc3VwcG9ydCAmJgorCWVsc2UgaWYgKCFjZmcocHJpdiktPmJhc2VfcGFyYW1zLT5ub19pZGxlX3N1cHBvcnQgJiYKIAkJIHByaXYtPmh3LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0NPTkZfSURMRSkKIAkJaXdsX3N0YXRpY19zbGVlcF9jbWQocHJpdiwgY21kLCBJV0xfUE9XRVJfSU5ERVhfNSwgMjApOwogCWVsc2UgaWYgKGl3bF90dF9pc19sb3dfcG93ZXJfc3RhdGUocHJpdikpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNjYW4uYwppbmRleCBlNWQ3MjdmLi4wODRhYTJjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC1zY2FuLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2Nhbi5jCkBAIC00MTYsNiArNDE2LDggQEAKIAogCQlpZiAoIWl3bF9pc19hc3NvY2lhdGVkX2N0eChjdHgpKQogCQkJY29udGludWU7CisJCWlmIChjdHgtPnN0YWdpbmcuZGV2X3R5cGUgPT0gUlhPTl9ERVZfVFlQRV9QMlApCisJCQljb250aW51ZTsKIAkJdmFsdWUgPSBjdHgtPmJlYWNvbl9pbnQ7CiAJCWlmICghdmFsdWUpCiAJCQl2YWx1ZSA9IElXTF9QQVNTSVZFX0RXRUxMX0JBU0U7CkBAIC02NzgsNyArNjgwLDggQEAKIAkJCXByaXYtPmNvbnRleHRzW0lXTF9SWE9OX0NUWF9CU1NdLmFjdGl2ZS5mbGFncyAmCiAJCQkJCQlSWE9OX0ZMR19DSEFOTkVMX01PREVfTVNLKQogCQkJCSAgICAgICA+PiBSWE9OX0ZMR19DSEFOTkVMX01PREVfUE9TOwotCQlpZiAoY2hhbl9tb2QgPT0gQ0hBTk5FTF9NT0RFX1BVUkVfNDApIHsKKwkJaWYgKChwcml2LT5zY2FuX3JlcXVlc3QgJiYgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5ub19jY2spIHx8CisJCSAgICBjaGFuX21vZCA9PSBDSEFOTkVMX01PREVfUFVSRV80MCkgewogCQkJcmF0ZSA9IElXTF9SQVRFXzZNX1BMQ1A7CiAJCX0gZWxzZSB7CiAJCQlyYXRlID0gSVdMX1JBVEVfMU1fUExDUDsKQEAgLTY4OCw4ICs2OTEsOCBAQAogCQkgKiBJbnRlcm5hbCBzY2FucyBhcmUgcGFzc2l2ZSwgc28gd2UgY2FuIGluZGlzY3JpbWluYXRlbHkgc2V0CiAJCSAqIHRoZSBCVCBpZ25vcmUgZmxhZyBvbiAyLjQgR0h6IHNpbmNlIGl0IGFwcGxpZXMgdG8gVFggb25seS4KIAkJICovCi0JCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpCisJCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCQkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpCiAJCQlzY2FuLT50eF9jbWQudHhfZmxhZ3MgfD0gVFhfQ01EX0ZMR19JR05PUkVfQlQ7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0JBTkRfNUdIWjoKQEAgLTczMCwxMiArNzMzLDEyIEBACiAKIAliYW5kID0gcHJpdi0+c2Nhbl9iYW5kOwogCi0JaWYgKHByaXYtPmNmZy0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXSkKLQkJcnhfYW50ID0gcHJpdi0+Y2ZnLT5zY2FuX3J4X2FudGVubmFzW2JhbmRdOworCWlmIChjZmcocHJpdiktPnNjYW5fcnhfYW50ZW5uYXNbYmFuZF0pCisJCXJ4X2FudCA9IGNmZyhwcml2KS0+c2Nhbl9yeF9hbnRlbm5hc1tiYW5kXTsKIAogCWlmIChiYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFogJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMgJiYKLQkgICAgcHJpdi0+Y2ZnLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMgJiYKKwkgICAgY2ZnKHByaXYpLT5idF9wYXJhbXMtPmFkdmFuY2VkX2J0X2NvZXhpc3QpIHsKIAkJLyogdHJhbnNtaXQgMi40IEdIeiBwcm9iZXMgb25seSBvbiBmaXJzdCBhbnRlbm5hICovCiAJCXNjYW5fdHhfYW50ZW5uYXMgPSBmaXJzdF9hbnRlbm5hKHNjYW5fdHhfYW50ZW5uYXMpOwogCX0KQEAgLTc1OSw4ICs3NjIsOCBAQAogCiAJCXJ4X2FudCA9IGZpcnN0X2FudGVubmEoYWN0aXZlX2NoYWlucyk7CiAJfQotCWlmIChwcml2LT5jZmctPmJ0X3BhcmFtcyAmJgotCSAgICBwcml2LT5jZmctPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgorCWlmIChjZmcocHJpdiktPmJ0X3BhcmFtcyAmJgorCSAgICBjZmcocHJpdiktPmJ0X3BhcmFtcy0+YWR2YW5jZWRfYnRfY29leGlzdCAmJgogCSAgICBwcml2LT5idF9mdWxsX2NvbmN1cnJlbnQpIHsKIAkJLyogb3BlcmF0ZWQgYXMgMXgxIGluIGZ1bGwgY29uY3VycmVuY3kgbW9kZSAqLwogCQlyeF9hbnQgPSBmaXJzdF9hbnRlbm5hKHJ4X2FudCk7CkBAIC05MzgsNTEgKzk0MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBpd2xhZ25fbWFjX2h3X3NjYW4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAotCQkgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKQotewotCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwotCWludCByZXQ7Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImVudGVyXG4iKTsKLQotCWlmIChyZXEtPm5fY2hhbm5lbHMgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQltdXRleF9sb2NrKCZwcml2LT5zaHJkLT5tdXRleCk7Ci0KLQkvKgotCSAqIElmIGFuIGludGVybmFsIHNjYW4gaXMgaW4gcHJvZ3Jlc3MsIGp1c3Qgc2V0Ci0JICogdXAgdGhlIHNjYW5fcmVxdWVzdCBhcyBwZXIgYWJvdmUuCi0JICovCi0JaWYgKHByaXYtPnNjYW5fdHlwZSAhPSBJV0xfU0NBTl9OT1JNQUwpIHsKLQkJSVdMX0RFQlVHX1NDQU4ocHJpdiwKLQkJCSAgICAgICAiU0NBTiByZXF1ZXN0IGR1cmluZyBpbnRlcm5hbCBzY2FuIC0gZGVmZXJcbiIpOwotCQlwcml2LT5zY2FuX3JlcXVlc3QgPSByZXE7Ci0JCXByaXYtPnNjYW5fdmlmID0gdmlmOwotCQlyZXQgPSAwOwotCX0gZWxzZSB7Ci0JCXByaXYtPnNjYW5fcmVxdWVzdCA9IHJlcTsKLQkJcHJpdi0+c2Nhbl92aWYgPSB2aWY7Ci0JCS8qCi0JCSAqIG1hYzgwMjExIHdpbGwgb25seSBhc2sgZm9yIG9uZSBiYW5kIGF0IGEgdGltZQotCQkgKiBzbyB1c2luZyBjaGFubmVsc1swXSBoZXJlIGlzIG9rCi0JCSAqLwotCQlyZXQgPSBpd2xfc2Nhbl9pbml0aWF0ZShwcml2LCB2aWYsIElXTF9TQ0FOX05PUk1BTCwKLQkJCQkJcmVxLT5jaGFubmVsc1swXS0+YmFuZCk7Ci0JCWlmIChyZXQpIHsKLQkJCXByaXYtPnNjYW5fcmVxdWVzdCA9IE5VTEw7Ci0JCQlwcml2LT5zY2FuX3ZpZiA9IE5VTEw7Ci0JCX0KLQl9Ci0KLQlJV0xfREVCVUdfTUFDODAyMTEocHJpdiwgImxlYXZlXG4iKTsKLQotCW11dGV4X3VubG9jaygmcHJpdi0+c2hyZC0+bXV0ZXgpOwotCi0JcmV0dXJuIHJldDsKLX0KIAogLyoKICAqIGludGVybmFsIHNob3J0IHNjYW4sIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmVlbiBjYWxsZWQgd2hpbGUgYXNzb2NpYXRlZC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXNoYXJlZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2hhcmVkLmgKaW5kZXggMWY3YTkzYy4uZGM1NWNjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2hhcmVkLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc2hhcmVkLmgKQEAgLTk0LDkgKzk0LDkgQEAKICAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaXdsLXBjaS5jCiAgKi8KIAotc3RydWN0IGl3bF9jZmc7CiBzdHJ1Y3QgaXdsX2J1czsKIHN0cnVjdCBpd2xfcHJpdjsKK3N0cnVjdCBpd2xfdHJhbnM7CiBzdHJ1Y3QgaXdsX3NlbnNpdGl2aXR5X3JhbmdlczsKIHN0cnVjdCBpd2xfdHJhbnNfb3BzOwogCkBAIC0xMDcsNiArMTA3LDEwIEBACiAKIGV4dGVybiBzdHJ1Y3QgaXdsX21vZF9wYXJhbXMgaXdsYWduX21vZF9wYXJhbXM7CiAKKyNkZWZpbmUgSVdMX0RJU0FCTEVfSFRfQUxMCUJJVCgwKQorI2RlZmluZSBJV0xfRElTQUJMRV9IVF9UWEFHRwlCSVQoMSkKKyNkZWZpbmUgSVdMX0RJU0FCTEVfSFRfUlhBR0cJQklUKDIpCisKIC8qKgogICogc3RydWN0IGl3bF9tb2RfcGFyYW1zCiAgKgpAQCAtMTE0LDEzICsxMTgsMTQgQEAKICAqCiAgKiBAc3dfY3J5cHRvOiB1c2luZyBoYXJkd2FyZSBlbmNyeXB0aW9uLCBkZWZhdWx0ID0gMAogICogQG51bV9vZl9xdWV1ZXM6IG51bWJlciBvZiB0eCBxdWV1ZSwgSFcgZGVwZW5kZW50Ci0gKiBAZGlzYWJsZV8xMW46IDExbiBjYXBhYmlsaXRpZXMgZW5hYmxlZCwgZGVmYXVsdCA9IDAKKyAqIEBkaXNhYmxlXzExbjogZGlzYWJsZSAxMW4gY2FwYWJpbGl0aWVzLCBkZWZhdWx0ID0gMCwKKyAqCXVzZSBJV0xfRElTQUJMRV9IVF8qIGNvbnN0YW50cwogICogQGFtc2R1X3NpemVfOEs6IGVuYWJsZSA4SyBhbXNkdSBzaXplLCBkZWZhdWx0ID0gMQogICogQGFudGVubmE6IGJvdGggYW50ZW5uYXMgKHVzZSBkaXZlcnNpdHkpLCBkZWZhdWx0ID0gMAogICogQHJlc3RhcnRfZnc6IHJlc3RhcnQgZmlybXdhcmUsIGRlZmF1bHQgPSAxCiAgKiBAcGxjcF9jaGVjazogZW5hYmxlIHBsY3AgaGVhbHRoIGNoZWNrLCBkZWZhdWx0ID0gdHJ1ZQogICogQGFja19jaGVjazogZGlzYWJsZSBhY2sgaGVhbHRoIGNoZWNrLCBkZWZhdWx0ID0gZmFsc2UKLSAqIEB3ZF9kaXNhYmxlOiBlbmFibGUgc3R1Y2sgcXVldWUgY2hlY2ssIGRlZmF1bHQgPSBmYWxzZQorICogQHdkX2Rpc2FibGU6IGVuYWJsZSBzdHVjayBxdWV1ZSBjaGVjaywgZGVmYXVsdCA9IDAKICAqIEBidF9jb2V4X2FjdGl2ZTogZW5hYmxlIGJ0IGNvZXgsIGRlZmF1bHQgPSB0cnVlCiAgKiBAbGVkX21vZGU6IHN5c3RlbSBkZWZhdWx0LCBkZWZhdWx0ID0gMAogICogQG5vX3NsZWVwX2F1dG9hZGp1c3Q6IGRpc2FibGUgYXV0b2FkanVzdCwgZGVmYXVsdCA9IHRydWUKQEAgLTEzNSwxMyArMTQwLDEzIEBACiBzdHJ1Y3QgaXdsX21vZF9wYXJhbXMgewogCWludCBzd19jcnlwdG87CiAJaW50IG51bV9vZl9xdWV1ZXM7Ci0JaW50IGRpc2FibGVfMTFuOworCXVuc2lnbmVkIGludCBkaXNhYmxlXzExbjsKIAlpbnQgYW1zZHVfc2l6ZV84SzsKIAlpbnQgYW50ZW5uYTsKIAlpbnQgcmVzdGFydF9mdzsKIAlib29sIHBsY3BfY2hlY2s7CiAJYm9vbCBhY2tfY2hlY2s7Ci0JYm9vbCB3ZF9kaXNhYmxlOworCWludCAgd2RfZGlzYWJsZTsKIAlib29sIGJ0X2NvZXhfYWN0aXZlOwogCWludCBsZWRfbW9kZTsKIAlib29sIG5vX3NsZWVwX2F1dG9hZGp1c3Q7CkBAIC0xNzQsOCArMTc5LDYgQEAKICAqIEBjdF9raWxsX2V4aXRfdGhyZXNob2xkOiB3aGVuIHRvIHJlZWFibGUgdGhlIGRldmljZSAtIGluIGh3IGRlcGVuZGVudCB1bml0CiAgKglyZWxldmFudCBmb3IgMTAwMCwgNjAwMCBhbmQgdXAKICAqIEB3ZF90aW1lb3V0OiBUWCBxdWV1ZXMgd2F0Y2hkb2cgdGltZW91dAotICogQGNhbGliX2luaXRfY2ZnOiBzZXR1cCBpbml0aWFsIGNhbGlicmF0aW9ucyBmb3IgdGhlIGh3Ci0gKiBAY2FsaWJfcnRfY2ZnOiBzZXR1cCBydW50aW1lIGNhbGlicmF0aW9ucyBmb3IgdGhlIGh3CiAgKiBAc3RydWN0IGl3bF9zZW5zaXRpdml0eV9yYW5nZXM6IHJhbmdlIG9mIHNlbnNpdGl2aXR5IHZhbHVlcwogICovCiBzdHJ1Y3QgaXdsX2h3X3BhcmFtcyB7CkBAIC0xOTUsNjcgKzE5OCwxNDggQEAKIAl1MzIgY3Rfa2lsbF9leGl0X3RocmVzaG9sZDsKIAl1bnNpZ25lZCBpbnQgd2RfdGltZW91dDsKIAotCXUzMiBjYWxpYl9pbml0X2NmZzsKLQl1MzIgY2FsaWJfcnRfY2ZnOwogCWNvbnN0IHN0cnVjdCBpd2xfc2Vuc2l0aXZpdHlfcmFuZ2VzICpzZW5zOwogfTsKIAogLyoqCi0gKiBlbnVtIGl3bF9hZ2dfc3RhdGUKKyAqIGVudW0gaXdsX3Vjb2RlX3R5cGUKICAqCi0gKiBUaGUgc3RhdGUgbWFjaGluZSBvZiB0aGUgQkEgYWdyZWVtZW50IGVzdGFibGlzaG1lbnQgLyB0ZWFyIGRvd24uCi0gKiBUaGVzZSBzdGF0ZXMgcmVsYXRlIHRvIGEgc3BlY2lmaWMgUkEgLyBUSUQuCisgKiBUaGUgdHlwZSBvZiB1Y29kZSBjdXJyZW50bHkgbG9hZGVkIG9uIHRoZSBoYXJkd2FyZS4KICAqCi0gKiBASVdMX0FHR19PRkY6IGFnZ3JlZ2F0aW9uIGlzIG5vdCB1c2VkCi0gKiBASVdMX0FHR19PTjogYWdncmVnYXRpb24gc2Vzc2lvbiBpcyB1cAotICogQElXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQTogZXN0YWJsaXNoaW5nIGEgQkEgc2Vzc2lvbiAtIHdhaXRpbmcgZm9yIHRoZQotICoJSFcgcXVldWUgdG8gYmUgZW1wdHkgZnJvbSBwYWNrZXRzIGZvciB0aGlzIFJBIC9USUQuCi0gKiBASVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOiB0ZWFyaW5nIGRvd24gYSBCQSBzZXNzaW9uIC0gd2FpdGluZyBmb3IgdGhlCi0gKglIVyBxdWV1ZSB0byBiZSBlbXB0eSBmcm9tIHBhY2tldHMgZm9yIHRoaXMgUkEgL1RJRC4KKyAqIEBJV0xfVUNPREVfTk9ORTogTm8gdWNvZGUgbG9hZGVkCisgKiBASVdMX1VDT0RFX1JFR1VMQVI6IE5vcm1hbCBydW50aW1lIHVjb2RlCisgKiBASVdMX1VDT0RFX0lOSVQ6IEluaXRpYWwgdWNvZGUKKyAqIEBJV0xfVUNPREVfV09XTEFOOiBXYWtlIG9uIFdpcmVsZXNzIGVuYWJsZWQgdWNvZGUKICAqLwotZW51bSBpd2xfYWdnX3N0YXRlIHsKLQlJV0xfQUdHX09GRiA9IDAsCi0JSVdMX0FHR19PTiwKLQlJV0xfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkEsCi0JSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBLAorZW51bSBpd2xfdWNvZGVfdHlwZSB7CisJSVdMX1VDT0RFX05PTkUsCisJSVdMX1VDT0RFX1JFR1VMQVIsCisJSVdMX1VDT0RFX0lOSVQsCisJSVdMX1VDT0RFX1dPV0xBTiwKIH07CiAKIC8qKgotICogc3RydWN0IGl3bF9odF9hZ2cgLSBhZ2dyZWdhdGlvbiBzdGF0ZSBtYWNoaW5lCi0KLSAqIFRoaXMgc3RydWN0cyBob2xkcyB0aGUgc3RhdGVzIGZvciB0aGUgQkEgYWdyZWVtZW50IGVzdGFibGlzaG1lbnQgYW5kIHRlYXIKLSAqIGRvd24uIEl0IGFsc28gaG9sZHMgdGhlIHN0YXRlIGR1cmluZyB0aGUgQkEgc2Vzc2lvbiBpdHNlbGYuIFRoaXMgc3RydWN0IGlzCi0gKiBkdXBsaWNhdGVkIGZvciBlYWNoIFJBIC8gVElELgotCi0gKiBAcmF0ZV9uX2ZsYWdzOiBSYXRlIGF0IHdoaWNoIFR4IHdhcyBhdHRlbXB0ZWQuIEhvbGRzIHRoZSBkYXRhIGJldHdlZW4gdGhlCi0gKglUeCByZXNwb25zZSAoUkVQTFlfVFgpLCBhbmQgdGhlIGJsb2NrIGFjayBub3RpZmljYXRpb24KLSAqCShSRVBMWV9DT01QUkVTU0VEX0JBKS4KLSAqIEBzdGF0ZTogc3RhdGUgb2YgdGhlIEJBIGFncmVlbWVudCBlc3RhYmxpc2htZW50IC8gdGVhciBkb3duLgotICogQHR4cV9pZDogVHggcXVldWUgdXNlZCBieSB0aGUgQkEgc2Vzc2lvbiAtIHVzZWQgYnkgdGhlIHRyYW5zcG9ydCBsYXllci4KLSAqCU5lZWRlZCBieSB0aGUgdXBwZXIgbGF5ZXIgZm9yIGRlYnVnZnMgb25seS4KLSAqIEB3YWl0X2Zvcl9iYTogRXhwZWN0IGJsb2NrLWFjayBiZWZvcmUgbmV4dCBUeCByZXBseQorICogc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAtIG5vdGlmaWNhdGlvbiB3YWl0IGVudHJ5CisgKiBAbGlzdDogbGlzdCBoZWFkIGZvciBnbG9iYWwgbGlzdAorICogQGZuOiBmdW5jdGlvbiBjYWxsZWQgd2l0aCB0aGUgbm90aWZpY2F0aW9uCisgKiBAY21kOiBjb21tYW5kIElECisgKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgbm90IHVzZWQgZGlyZWN0bHksIHRvIHdhaXQgZm9yIGEKKyAqIG5vdGlmaWNhdGlvbiBkZWNsYXJlIGl0IG9uIHRoZSBzdGFjaywgYW5kIGNhbGwKKyAqIGl3bGFnbl9pbml0X25vdGlmaWNhdGlvbl93YWl0KCkgd2l0aCBhcHByb3ByaWF0ZQorICogcGFyYW1ldGVycy4gVGhlbiBkbyB3aGF0ZXZlciB3aWxsIGNhdXNlIHRoZSB1Y29kZQorICogdG8gbm90aWZ5IHRoZSBkcml2ZXIsIGFuZCB0byB3YWl0IGZvciB0aGF0IHRoZW4KKyAqIGNhbGwgaXdsYWduX3dhaXRfbm90aWZpY2F0aW9uKCkuCisgKgorICogRWFjaCBub3RpZmljYXRpb24gaXMgb25lLXNob3QuIElmIGF0IHNvbWUgcG9pbnQgd2UKKyAqIG5lZWQgdG8gc3VwcG9ydCBtdWx0aS1zaG90IG5vdGlmaWNhdGlvbnMgKHdoaWNoCisgKiBjYW4ndCBiZSBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrKSB3ZSBuZWVkIHRvIG1vZGlmeQorICogdGhlIGNvZGUgZm9yIHRoZW0uCiAgKi8KLXN0cnVjdCBpd2xfaHRfYWdnIHsKLQl1MzIgcmF0ZV9uX2ZsYWdzOwotCWVudW0gaXdsX2FnZ19zdGF0ZSBzdGF0ZTsKLQl1MTYgdHhxX2lkOwotCWJvb2wgd2FpdF9mb3JfYmE7CitzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwl2b2lkICgqZm4pKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0LAorCQkgICB2b2lkICpkYXRhKTsKKwl2b2lkICpmbl9kYXRhOworCisJdTggY21kOworCWJvb2wgdHJpZ2dlcmVkLCBhYm9ydGVkOwogfTsKIAogLyoqCi0gKiBzdHJ1Y3QgaXdsX3RpZF9kYXRhIC0gb25lIGZvciBlYWNoIFJBIC8gVElECi0KLSAqIFRoaXMgc3RydWN0cyBob2xkcyB0aGUgc3RhdGVzIGZvciBlYWNoIFJBIC8gVElELgotCi0gKiBAc2VxX251bWJlcjogdGhlIG5leHQgV2lGaSBzZXF1ZW5jZSBudW1iZXIgdG8gdXNlCi0gKiBAdGZkc19pbl9xdWV1ZTogbnVtYmVyIG9mIHBhY2tldHMgc2VudCB0byB0aGUgSFcgcXVldWVzLgotICoJRXhwb3J0ZWQgZm9yIGRlYnVnZnMgb25seQotICogQGFnZzogYWdncmVnYXRpb24gc3RhdGUgbWFjaGluZQorICogZW51bSBpd2xfcGFfdHlwZSAtIFBvd2VyIEFtcGxpZmllciB0eXBlCisgKiBASVdMX1BBX1NZU1RFTTogIGJhc2VkIG9uIHVDb2RlIGNvbmZpZ3VyYXRpb24KKyAqIEBJV0xfUEFfSU5URVJOQUw6IHVzZSBJbnRlcm5hbCBvbmx5CiAgKi8KLXN0cnVjdCBpd2xfdGlkX2RhdGEgewotCXUxNiBzZXFfbnVtYmVyOwotCXUxNiB0ZmRzX2luX3F1ZXVlOwotCXN0cnVjdCBpd2xfaHRfYWdnIGFnZzsKK2VudW0gaXdsX3BhX3R5cGUgeworCUlXTF9QQV9TWVNURU0gPSAwLAorCUlXTF9QQV9JTlRFUk5BTCA9IDEsCit9OworCisvKgorICogTEVEIG1vZGUKKyAqICAgIElXTF9MRURfREVGQVVMVDogIHVzZSBkZXZpY2UgZGVmYXVsdAorICogICAgSVdMX0xFRF9SRl9TVEFURTogdHVybiBMRUQgb24vb2ZmIGJhc2VkIG9uIFJGIHN0YXRlCisgKgkJCUxFRCBPTiAgPSBSRiBPTgorICoJCQlMRUQgT0ZGID0gUkYgT0ZGCisgKiAgICBJV0xfTEVEX0JMSU5LOiAgICBhZGp1c3QgbGVkIGJsaW5rIHJhdGUgYmFzZWQgb24gYmxpbmsgdGFibGUKKyAqLworZW51bSBpd2xfbGVkX21vZGUgeworCUlXTF9MRURfREVGQVVMVCwKKwlJV0xfTEVEX1JGX1NUQVRFLAorCUlXTF9MRURfQkxJTkssCit9OworCisvKioKKyAqIHN0cnVjdCBpd2xfY2ZnCisgKiBAbmFtZTogT2ZmaWNhbCBuYW1lIG9mIHRoZSBkZXZpY2UKKyAqIEBmd19uYW1lX3ByZTogRmlybXdhcmUgZmlsZW5hbWUgcHJlZml4LiBUaGUgYXBpIHZlcnNpb24gYW5kIGV4dGVuc2lvbgorICoJKC51Y29kZSkgd2lsbCBiZSBhZGRlZCB0byBmaWxlbmFtZSBiZWZvcmUgbG9hZGluZyBmcm9tIGRpc2suIFRoZQorICoJZmlsZW5hbWUgaXMgY29uc3RydWN0ZWQgYXMgZndfbmFtZV9wcmU8YXBpPi51Y29kZS4KKyAqIEB1Y29kZV9hcGlfbWF4OiBIaWdoZXN0IHZlcnNpb24gb2YgdUNvZGUgQVBJIHN1cHBvcnRlZCBieSBkcml2ZXIuCisgKiBAdWNvZGVfYXBpX29rOiBvbGRlc3QgdmVyc2lvbiBvZiB0aGUgdUNvZGUgQVBJIHRoYXQgaXMgT0sgdG8gbG9hZAorICoJd2l0aG91dCBhIHdhcm5pbmcsIGZvciB1c2UgaW4gdHJhbnNpdGlvbnMKKyAqIEB1Y29kZV9hcGlfbWluOiBMb3dlc3QgdmVyc2lvbiBvZiB1Q29kZSBBUEkgc3VwcG9ydGVkIGJ5IGRyaXZlci4KKyAqIEB2YWxpZF90eF9hbnQ6IHZhbGlkIHRyYW5zbWl0IGFudGVubmEKKyAqIEB2YWxpZF9yeF9hbnQ6IHZhbGlkIHJlY2VpdmUgYW50ZW5uYQorICogQHNrdTogc2t1IGluZm9ybWF0aW9uIGZyb20gRUVQUk9NCisgKiBAZWVwcm9tX3ZlcjogRUVQUk9NIHZlcnNpb24KKyAqIEBlZXByb21fY2FsaWJfdmVyOiBFRVBST00gY2FsaWJyYXRpb24gdmVyc2lvbgorICogQGxpYjogcG9pbnRlciB0byB0aGUgbGliIG9wcworICogQGFkZGl0aW9uYWxfbmljX2NvbmZpZzogYWRkaXRpb25hbCBuaWMgY29uZmlndXJhdGlvbgorICogQGJhc2VfcGFyYW1zOiBwb2ludGVyIHRvIGJhc2ljIHBhcmFtZXRlcnMKKyAqIEBodF9wYXJhbXM6IHBvaW50IHRvIGh0IHBhdGFtZXRlcnMKKyAqIEBidF9wYXJhbXM6IHBvaW50ZXIgdG8gYnQgcGFyYW1ldGVycworICogQHBhX3R5cGU6IHVzZWQgYnkgNjAwMCBzZXJpZXMgb25seSB0byBpZGVudGlmeSB0aGUgdHlwZSBvZiBQb3dlciBBbXBsaWZpZXIKKyAqIEBuZWVkX3RlbXBfb2Zmc2V0X2NhbGliOiBuZWVkIHRvIHBlcmZvcm0gdGVtcGVyYXR1cmUgb2Zmc2V0IGNhbGlicmF0aW9uCisgKiBAbm9feHRhbF9jYWxpYjogc29tZSBkZXZpY2VzIGRvIG5vdCBuZWVkIGNyeXN0YWwgY2FsaWJyYXRpb24gZGF0YSwKKyAqCWRvbid0IHNlbmQgaXQgdG8gdGhvc2UKKyAqIEBzY2FuX3J4X2FudGVubmFzOiBhdmFpbGFibGUgYW50ZW5uYSBmb3Igc2NhbiBvcGVyYXRpb24KKyAqIEBsZWRfbW9kZTogMD1ibGlua2luZywgMT1PbihSRiBPbikvT2ZmKFJGIE9mZikKKyAqIEBhZHZfcG06IGFkdmFuY2UgcG93ZXIgbWFuYWdlbWVudAorICogQHJ4X3dpdGhfc2lzb19kaXZlcnNpdHk6IDF4MSBkZXZpY2Ugd2l0aCByeCBhbnRlbm5hIGRpdmVyc2l0eQorICogQGludGVybmFsX3dpbWF4X2NvZXg6IGludGVybmFsIHdpZmkvd2ltYXggY29tYm8gZGV2aWNlCisgKiBAaXFfaW52ZXJ0OiBJL1EgaW52ZXJzaW9uCisgKiBAdGVtcF9vZmZzZXRfdjI6IHN1cHBvcnQgdjIgb2YgdGVtcGVyYXR1cmUgb2Zmc2V0IGNhbGlicmF0aW9uCisgKgorICogV2UgZW5hYmxlIHRoZSBkcml2ZXIgdG8gYmUgYmFja3dhcmQgY29tcGF0aWJsZSB3cnQgQVBJIHZlcnNpb24uIFRoZQorICogZHJpdmVyIHNwZWNpZmllcyB3aGljaCBBUElzIGl0IHN1cHBvcnRzICh3aXRoIEB1Y29kZV9hcGlfbWF4IGJlaW5nIHRoZQorICogaGlnaGVzdCBhbmQgQHVjb2RlX2FwaV9taW4gdGhlIGxvd2VzdCkuIEZpcm13YXJlIHdpbGwgb25seSBiZSBsb2FkZWQgaWYKKyAqIGl0IGhhcyBhIHN1cHBvcnRlZCBBUEkgdmVyc2lvbi4KKyAqCisgKiBUaGUgaWRlYWwgdXNhZ2Ugb2YgdGhpcyBpbmZyYXN0cnVjdHVyZSBpcyB0byB0cmVhdCBhIG5ldyB1Y29kZSBBUEkKKyAqIHJlbGVhc2UgYXMgYSBuZXcgaGFyZHdhcmUgcmV2aXNpb24uCisgKi8KK3N0cnVjdCBpd2xfY2ZnIHsKKwkvKiBwYXJhbXMgc3BlY2lmaWMgdG8gYW4gaW5kaXZpZHVhbCBkZXZpY2Ugd2l0aGluIGEgZGV2aWNlIGZhbWlseSAqLworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqZndfbmFtZV9wcmU7CisJY29uc3QgdW5zaWduZWQgaW50IHVjb2RlX2FwaV9tYXg7CisJY29uc3QgdW5zaWduZWQgaW50IHVjb2RlX2FwaV9vazsKKwljb25zdCB1bnNpZ25lZCBpbnQgdWNvZGVfYXBpX21pbjsKKwl1OCAgIHZhbGlkX3R4X2FudDsKKwl1OCAgIHZhbGlkX3J4X2FudDsKKwl1MTYgIHNrdTsKKwl1MTYgIGVlcHJvbV92ZXI7CisJdTE2ICBlZXByb21fY2FsaWJfdmVyOworCWNvbnN0IHN0cnVjdCBpd2xfbGliX29wcyAqbGliOworCXZvaWQgKCphZGRpdGlvbmFsX25pY19jb25maWcpKHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7CisJLyogcGFyYW1zIG5vdCBsaWtlbHkgdG8gY2hhbmdlIHdpdGhpbiBhIGRldmljZSBmYW1pbHkgKi8KKwlzdHJ1Y3QgaXdsX2Jhc2VfcGFyYW1zICpiYXNlX3BhcmFtczsKKwkvKiBwYXJhbXMgbGlrZWx5IHRvIGNoYW5nZSB3aXRoaW4gYSBkZXZpY2UgZmFtaWx5ICovCisJc3RydWN0IGl3bF9odF9wYXJhbXMgKmh0X3BhcmFtczsKKwlzdHJ1Y3QgaXdsX2J0X3BhcmFtcyAqYnRfcGFyYW1zOworCWVudW0gaXdsX3BhX3R5cGUgcGFfdHlwZTsJICAvKiBpZiB1c2VkIHNldCB0byBJV0xfUEFfU1lTVEVNICovCisJY29uc3QgYm9vbCBuZWVkX3RlbXBfb2Zmc2V0X2NhbGliOyAvKiBpZiB1c2VkIHNldCB0byB0cnVlICovCisJY29uc3QgYm9vbCBub194dGFsX2NhbGliOworCXU4IHNjYW5fcnhfYW50ZW5uYXNbSUVFRTgwMjExX05VTV9CQU5EU107CisJZW51bSBpd2xfbGVkX21vZGUgbGVkX21vZGU7CisJY29uc3QgYm9vbCBhZHZfcG07CisJY29uc3QgYm9vbCByeF93aXRoX3Npc29fZGl2ZXJzaXR5OworCWNvbnN0IGJvb2wgaW50ZXJuYWxfd2ltYXhfY29leDsKKwljb25zdCBib29sIGlxX2ludmVydDsKKwljb25zdCBib29sIHRlbXBfb2Zmc2V0X3YyOwogfTsKIAogLyoqCkBAIC0yNjYsMTUgKzM1MCwyNSBAQAogICogQHVjb2RlX293bmVyOiBJV0xfT1dORVJTSElQXyoKICAqIEBjbWRfcXVldWU6IGNvbW1hbmQgcXVldWUgbnVtYmVyCiAgKiBAc3RhdHVzOiBTVEFUVVNfKgorICogQHdvd2xhbjogYXJlIHdlIHJ1bm5pbmcgd293bGFuIHVDb2RlCiAgKiBAdmFsaWRfY29udGV4dHM6IG1pY3JvY29kZS9kZXZpY2Ugc3VwcG9ydHMgbXVsdGlwbGUgY29udGV4dHMKICAqIEBidXM6IHBvaW50ZXIgdG8gdGhlIGJ1cyBsYXllciBkYXRhCisgKiBAY2ZnOiBzZWUgc3RydWN0IGl3bF9jZmcKICAqIEBwcml2OiBwb2ludGVyIHRvIHRoZSB1cHBlciBsYXllciBkYXRhCisgKiBAdHJhbnM6IHBvaW50ZXIgdG8gdGhlIHRyYW5zcG9ydCBsYXllciBkYXRhCiAgKiBAaHdfcGFyYW1zOiBzZWUgc3RydWN0IGl3bF9od19wYXJhbXMKICAqIEB3b3JrcXVldWU6IHRoZSB3b3JrcXVldWUgdXNlZCBieSBhbGwgdGhlIGxheWVycyBvZiB0aGUgZHJpdmVyCiAgKiBAbG9jazogcHJvdGVjdCBnZW5lcmFsIHNoYXJlZCBkYXRhCiAgKiBAc3RhX2xvY2s6IHByb3RlY3RzIHRoZSBzdGF0aW9uIHRhYmxlLgogICoJSWYgbG9jayBhbmQgc3RhX2xvY2sgYXJlIG5lZWRlZCwgbG9jayBtdXN0IGJlIGFjcXVpcmVkIGZpcnN0LgogICogQG11dGV4OgorICogQHdhaXRfY29tbWFuZF9xdWV1ZTogdGhlIHdhaXRfcXVldWUgZm9yIFNZTkMgaG9zdCBjb21tYW5kIG5hZCB1Q29kZSBsb2FkCisgKiBAZWVwcm9tOiBwb2ludGVyIHRvIHRoZSBlZXByb20vT1RQIGltYWdlCisgKiBAdWNvZGVfdHlwZTogaW5kaWNhdG9yIG9mIGxvYWRlZCB1Y29kZSBpbWFnZQorICogQG5vdGlmX3dhaXRzOiB0aGluZ3Mgd2FpdGluZyBmb3Igbm90aWZpY2F0aW9uCisgKiBAbm90aWZfd2FpdF9sb2NrOiBsb2NrIHByb3RlY3Rpbmcgbm90aWZpY2F0aW9uCisgKiBAbm90aWZfd2FpdHE6IGhlYWQgb2Ygbm90aWZpY2F0aW9uIHdhaXQgcXVldWUKKyAqIEBkZXZpY2VfcG9pbnRlcnM6IHBvaW50ZXJzIHRvIHVjb2RlIGV2ZW50IHRhYmxlcwogICovCiBzdHJ1Y3QgaXdsX3NoYXJlZCB7CiAjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKQEAgLTI5MCw2ICszODQsNyBAQAogCXU4IHZhbGlkX2NvbnRleHRzOwogCiAJc3RydWN0IGl3bF9idXMgKmJ1czsKKwlzdHJ1Y3QgaXdsX2NmZyAqY2ZnOwogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdjsKIAlzdHJ1Y3QgaXdsX3RyYW5zICp0cmFuczsKIAlzdHJ1Y3QgaXdsX2h3X3BhcmFtcyBod19wYXJhbXM7CkBAIC0yOTksMTMgKzM5NCwyOSBAQAogCXNwaW5sb2NrX3Qgc3RhX2xvY2s7CiAJc3RydWN0IG11dGV4IG11dGV4OwogCi0Jc3RydWN0IGl3bF90aWRfZGF0YSB0aWRfZGF0YVtJV0xBR05fU1RBVElPTl9DT1VOVF1bSVdMX01BWF9USURfQ09VTlRdOwotCiAJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdF9jb21tYW5kX3F1ZXVlOworCisJLyogZWVwcm9tIC0tIHRoaXMgaXMgaW4gdGhlIGNhcmQncyBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgKi8KKwl1OCAqZWVwcm9tOworCisJLyogdWNvZGUgcmVsYXRlZCB2YXJpYWJsZXMgKi8KKwllbnVtIGl3bF91Y29kZV90eXBlIHVjb2RlX3R5cGU7CisKKwkvKiBub3RpZmljYXRpb24gd2FpdCBzdXBwb3J0ICovCisJc3RydWN0IGxpc3RfaGVhZCBub3RpZl93YWl0czsKKwlzcGlubG9ja190IG5vdGlmX3dhaXRfbG9jazsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBub3RpZl93YWl0cTsKKworCXN0cnVjdCB7CisJCXUzMiBlcnJvcl9ldmVudF90YWJsZTsKKwkJdTMyIGxvZ19ldmVudF90YWJsZTsKKwl9IGRldmljZV9wb2ludGVyczsKKwogfTsKIAogLypXaGF0ZXZlciBfbSBpcyAoaXdsX3RyYW5zLCBpd2xfcHJpdiwgaXdsX2J1cywgdGhlc2UgbWFjcm9zIHdpbGwgd29yayAqLwogI2RlZmluZSBwcml2KF9tKQkoKF9tKS0+c2hyZC0+cHJpdikKKyNkZWZpbmUgY2ZnKF9tKQkJKChfbSktPnNocmQtPmNmZykKICNkZWZpbmUgYnVzKF9tKQkJKChfbSktPnNocmQtPmJ1cykKICNkZWZpbmUgdHJhbnMoX20pCSgoX20pLT5zaHJkLT50cmFucykKICNkZWZpbmUgaHdfcGFyYW1zKF9tKQkoKF9tKS0+c2hyZC0+aHdfcGFyYW1zKQpAQCAtNDI3LDEyICs1MzgsNiBAQAogCQkJCSBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCk7CiAKIGludCBpd2xhZ25faHdfdmFsaWRfcnRjX2RhdGFfYWRkcih1MzIgYWRkcik7Ci12b2lkIGl3bF9zdGFydF90eF9iYV90cmFuc19yZWFkeShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsCi0JCQkJIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCi0JCQkJIHU4IHN0YV9pZCwgdTggdGlkKTsKLXZvaWQgaXdsX3N0b3BfdHhfYmFfdHJhbnNfcmVhZHkoc3RydWN0IGl3bF9wcml2ICpwcml2LAotCQkJCWVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCi0JCQkJdTggc3RhX2lkLCB1OCB0aWQpOwogdm9pZCBpd2xfc2V0X2h3X3Jma2lsbF9zdGF0ZShzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIGJvb2wgc3RhdGUpOwogdm9pZCBpd2xfbmljX2NvbmZpZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogdm9pZCBpd2xfZnJlZV9za2Ioc3RydWN0IGl3bF9wcml2ICpwcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTQ0NSw2ICs1NTAsMjQgQEAKIHZvaWQgaXdsX3N0b3Bfc3dfcXVldWUoc3RydWN0IGl3bF9wcml2ICpwcml2LCB1OCBhYyk7CiB2b2lkIGl3bF93YWtlX3N3X3F1ZXVlKHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwgdTggYWMpOwogCisvKiBub3RpZmljYXRpb24gd2FpdCBzdXBwb3J0ICovCit2b2lkIGl3bF9hYm9ydF9ub3RpZmljYXRpb25fd2FpdHMoc3RydWN0IGl3bF9zaGFyZWQgKnNocmQpOwordm9pZCBfX2FjcXVpcmVzKHdhaXRfZW50cnkpCitpd2xfaW5pdF9ub3RpZmljYXRpb25fd2FpdChzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCwKKwkJCSAgICAgIHN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgKndhaXRfZW50cnksCisJCQkgICAgICB1OCBjbWQsCisJCQkgICAgICB2b2lkICgqZm4pKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCQkgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCwKKwkJCQkJIHZvaWQgKmRhdGEpLAorCQkJICAgICAgdm9pZCAqZm5fZGF0YSk7CitpbnQgX19tdXN0X2NoZWNrIF9fcmVsZWFzZXMod2FpdF9lbnRyeSkKK2l3bF93YWl0X25vdGlmaWNhdGlvbihzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZCwKKwkJCSBzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5LAorCQkJIHVuc2lnbmVkIGxvbmcgdGltZW91dCk7Cit2b2lkIF9fcmVsZWFzZXMod2FpdF9lbnRyeSkKK2l3bF9yZW1vdmVfbm90aWZpY2F0aW9uKHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkLAorCQkJICAgc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqd2FpdF9lbnRyeSk7CisKICNpZmRlZiBDT05GSUdfSVdMV0lGSV9ERUJVR0ZTCiB2b2lkIGl3bF9yZXNldF90cmFmZmljX2xvZyhzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpOwogI2VuZGlmIC8qIENPTkZJR19JV0xXSUZJX0RFQlVHRlMgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN2LW9wZW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRlc3Rtb2RlLmMKc2ltaWxhcml0eSBpbmRleCA3NCUKcmVuYW1lIGZyb20gZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtc3Ytb3Blbi5jCnJlbmFtZSB0byBkcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10ZXN0bW9kZS5jCmluZGV4IDVlNTBkODguLjRhNWNkZGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXN2LW9wZW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10ZXN0bW9kZS5jCkBAIC03MCw2ICs3MCw3IEBACiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSA8bmV0L25ldGxpbmsuaD4KIAorI2luY2x1ZGUgIml3bC13aWZpLmgiCiAjaW5jbHVkZSAiaXdsLWRldi5oIgogI2luY2x1ZGUgIml3bC1jb3JlLmgiCiAjaW5jbHVkZSAiaXdsLWRlYnVnLmgiCkBAIC03Nyw2ICs3OCw3IEBACiAjaW5jbHVkZSAiaXdsLWFnbi5oIgogI2luY2x1ZGUgIml3bC10ZXN0bW9kZS5oIgogI2luY2x1ZGUgIml3bC10cmFucy5oIgorI2luY2x1ZGUgIml3bC1idXMuaCIKIAogLyogVGhlIFRMVnMgdXNlZCBpbiB0aGUgZ25sIG1lc3NhZ2UgcG9saWN5IGJldHdlZW4gdGhlIGtlcm5lbCBtb2R1bGUgYW5kCiAgKiB1c2VyIHNwYWNlIGFwcGxpY2F0aW9uLiBpd2xfdGVzdG1vZGVfZ25sX21zZ19wb2xpY3kgaXMgdG8gYmUgY2FycmllZApAQCAtMTA2LDYgKzEwOCwxMyBAQAogCVtJV0xfVE1fQVRUUl9GSVhSQVRFXSA9IHsgLnR5cGUgPSBOTEFfVTMyLCB9LAogCiAJW0lXTF9UTV9BVFRSX1VDT0RFX09XTkVSXSA9IHsgLnR5cGUgPSBOTEFfVTgsIH0sCisKKwlbSVdMX1RNX0FUVFJfU1JBTV9BRERSXSA9IHsgLnR5cGUgPSBOTEFfVTMyLCB9LAorCVtJV0xfVE1fQVRUUl9TUkFNX1NJWkVdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCisJW0lXTF9UTV9BVFRSX1NSQU1fRFVNUF0gPSB7IC50eXBlID0gTkxBX1VOU1BFQywgfSwKKworCVtJV0xfVE1fQVRUUl9GV19WRVJTSU9OXSA9IHsgLnR5cGUgPSBOTEFfVTMyLCB9LAorCVtJV0xfVE1fQVRUUl9ERVZJQ0VfSURdID0geyAudHlwZSA9IE5MQV9VMzIsIH0sCiB9OwogCiAvKgpAQCAtMTc3LDYgKzE4NiwxOCBAQAogewogCXByaXYtPnByZV9yeF9oYW5kbGVyID0gaXdsX3Rlc3Rtb2RlX3Vjb2RlX3J4X3BrdDsKIAlwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9lbmFibGVkID0gZmFsc2U7CisJcHJpdi0+dGVzdG1vZGVfc3JhbS5zcmFtX3JlYWRlZCA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCBpd2xfc3JhbV9jbGVhbnVwKHN0cnVjdCBpd2xfcHJpdiAqcHJpdikKK3sKKwlpZiAocHJpdi0+dGVzdG1vZGVfc3JhbS5zcmFtX3JlYWRlZCkgeworCQlrZnJlZShwcml2LT50ZXN0bW9kZV9zcmFtLmJ1ZmZfYWRkcik7CisJCXByaXYtPnRlc3Rtb2RlX3NyYW0uYnVmZl9hZGRyID0gTlVMTDsKKwkJcHJpdi0+dGVzdG1vZGVfc3JhbS5idWZmX3NpemUgPSAwOworCQlwcml2LT50ZXN0bW9kZV9zcmFtLm51bV9jaHVua3MgPSAwOworCQlwcml2LT50ZXN0bW9kZV9zcmFtLnNyYW1fcmVhZGVkID0gZmFsc2U7CisJfQogfQogCiBzdGF0aWMgdm9pZCBpd2xfdHJhY2VfY2xlYW51cChzdHJ1Y3QgaXdsX3ByaXYgKnByaXYpCkBAIC0yMDEsNiArMjIyLDcgQEAKIHZvaWQgaXdsX3Rlc3Rtb2RlX2NsZWFudXAoc3RydWN0IGl3bF9wcml2ICpwcml2KQogewogCWl3bF90cmFjZV9jbGVhbnVwKHByaXYpOworCWl3bF9zcmFtX2NsZWFudXAocHJpdik7CiB9CiAKIC8qCkBAIC0yNzYsNyArMjk4LDcgQEAKIAlJV0xfSU5GTyhwcml2LCAidGVzdG1vZGUgcmVnaXN0ZXIgYWNjZXNzIGNvbW1hbmQgb2Zmc2V0IDB4JXhcbiIsIG9mcyk7CiAKIAlzd2l0Y2ggKG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX0NPTU1BTkRdKSkgewotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFR19SRUFEMzI6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19SRUFEMzI6CiAJCXZhbDMyID0gaXdsX3JlYWQzMihidXMocHJpdiksIG9mcyk7CiAJCUlXTF9JTkZPKHByaXYsICIzMmJpdCB2YWx1ZSB0byByZWFkIDB4JXhcbiIsIHZhbDMyKTsKIApAQCAtMjkxLDcgKzMxMyw3IEBACiAJCQlJV0xfREVCVUdfSU5GTyhwcml2LAogCQkJCSAgICAgICAiRXJyb3Igc2VuZGluZyBtc2cgOiAlZFxuIiwgc3RhdHVzKTsKIAkJYnJlYWs7Ci0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1dSSVRFMzI6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19XUklURTMyOgogCQlpZiAoIXRiW0lXTF9UTV9BVFRSX1JFR19WQUxVRTMyXSkgewogCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKIAkJCQkgICAgICAgIkVycm9yIGZpbmRpbmcgdmFsdWUgdG8gd3JpdGVcbiIpOwpAQCAtMzAyLDcgKzMyNCw3IEBACiAJCQlpd2xfd3JpdGUzMihidXMocHJpdiksIG9mcywgdmFsMzIpOwogCQl9CiAJCWJyZWFrOwotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTg6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19XUklURTg6CiAJCWlmICghdGJbSVdMX1RNX0FUVFJfUkVHX1ZBTFVFOF0pIHsKIAkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJFcnJvciBmaW5kaW5nIHZhbHVlIHRvIHdyaXRlXG4iKTsKIAkJCXJldHVybiAtRU5PTVNHOwpAQCAtMzEyLDYgKzMzNCwzMiBAQAogCQkJaXdsX3dyaXRlOChidXMocHJpdiksIG9mcywgdmFsOCk7CiAJCX0KIAkJYnJlYWs7CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1JFQUQzMjoKKwkJdmFsMzIgPSBpd2xfcmVhZF9wcnBoKGJ1cyhwcml2KSwgb2ZzKTsKKwkJSVdMX0lORk8ocHJpdiwgIjMyYml0IHZhbHVlIHRvIHJlYWQgMHgleFxuIiwgdmFsMzIpOworCisJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksIDIwKTsKKwkJaWYgKCFza2IpIHsKKwkJCUlXTF9ERUJVR19JTkZPKHByaXYsICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeVxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQlOTEFfUFVUX1UzMihza2IsIElXTF9UTV9BVFRSX1JFR19WQUxVRTMyLCB2YWwzMik7CisJCXN0YXR1cyA9IGNmZzgwMjExX3Rlc3Rtb2RlX3JlcGx5KHNrYik7CisJCWlmIChzdGF0dXMgPCAwKQorCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCQkJIkVycm9yIHNlbmRpbmcgbXNnIDogJWRcbiIsIHN0YXR1cyk7CisJCWJyZWFrOworCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0lORElSRUNUX1JFR19XUklURTMyOgorCQlpZiAoIXRiW0lXTF9UTV9BVFRSX1JFR19WQUxVRTMyXSkgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKKwkJCQkJIkVycm9yIGZpbmRpbmcgdmFsdWUgdG8gd3JpdGVcbiIpOworCQkJcmV0dXJuIC1FTk9NU0c7CisJCX0gZWxzZSB7CisJCQl2YWwzMiA9IG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX1JFR19WQUxVRTMyXSk7CisJCQlJV0xfSU5GTyhwcml2LCAiMzJiaXQgdmFsdWUgdG8gd3JpdGUgMHgleFxuIiwgdmFsMzIpOworCQkJaXdsX3dyaXRlX3BycGgoYnVzKHByaXYpLCBvZnMsIHZhbDMyKTsKKwkJfQorCQlicmVhazsKIAlkZWZhdWx0OgogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVW5rbm93biB0ZXN0bW9kZSByZWdpc3RlciBjb21tYW5kIElEXG4iKTsKIAkJcmV0dXJuIC1FTk9TWVM7CkBAIC0zMzAsMjQgKzM3OCwyNCBAQAogCXN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgY2FsaWJfd2FpdDsKIAlpbnQgcmV0OwogCi0JaXdsYWduX2luaXRfbm90aWZpY2F0aW9uX3dhaXQocHJpdiwgJmNhbGliX3dhaXQsCisJaXdsX2luaXRfbm90aWZpY2F0aW9uX3dhaXQocHJpdi0+c2hyZCwgJmNhbGliX3dhaXQsCiAJCQkJICAgICAgQ0FMSUJSQVRJT05fQ09NUExFVEVfTk9USUZJQ0FUSU9OLAogCQkJCSAgICAgIE5VTEwsIE5VTEwpOwotCXJldCA9IGl3bGFnbl9pbml0X2FsaXZlX3N0YXJ0KHByaXYpOworCXJldCA9IGl3bF9pbml0X2FsaXZlX3N0YXJ0KHRyYW5zKHByaXYpKTsKIAlpZiAocmV0KSB7CiAJCUlXTF9ERUJVR19JTkZPKHByaXYsCiAJCQkiRXJyb3IgY29uZmlndXJpbmcgaW5pdCBjYWxpYnJhdGlvbjogJWRcbiIsIHJldCk7CiAJCWdvdG8gY2ZnX2luaXRfY2FsaWJfZXJyb3I7CiAJfQogCi0JcmV0ID0gaXdsYWduX3dhaXRfbm90aWZpY2F0aW9uKHByaXYsICZjYWxpYl93YWl0LCAyICogSFopOworCXJldCA9IGl3bF93YWl0X25vdGlmaWNhdGlvbihwcml2LT5zaHJkLCAmY2FsaWJfd2FpdCwgMiAqIEhaKTsKIAlpZiAocmV0KQogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRXJyb3IgZGV0ZWN0aW5nIgogCQkJIiBDQUxJQlJBVElPTl9DT01QTEVURV9OT1RJRklDQVRJT046ICVkXG4iLCByZXQpOwogCXJldHVybiByZXQ7CiAKIGNmZ19pbml0X2NhbGliX2Vycm9yOgotCWl3bGFnbl9yZW1vdmVfbm90aWZpY2F0aW9uKHByaXYsICZjYWxpYl93YWl0KTsKKwlpd2xfcmVtb3ZlX25vdGlmaWNhdGlvbihwcml2LT5zaHJkLCAmY2FsaWJfd2FpdCk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMzcwLDE0ICs0MTgsMTYgQEAKIHN0YXRpYyBpbnQgaXdsX3Rlc3Rtb2RlX2RyaXZlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IG5sYXR0ciAqKnRiKQogewogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zID0gdHJhbnMocHJpdik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBjaGFyICpyc3BfZGF0YV9wdHIgPSBOVUxMOwogCWludCBzdGF0dXMgPSAwLCByc3BfZGF0YV9sZW4gPSAwOworCXUzMiBkZXZpZDsKIAogCXN3aXRjaCAobmxhX2dldF91MzIodGJbSVdMX1RNX0FUVFJfQ09NTUFORF0pKSB7CiAJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0RFVklDRU5BTUU6Ci0JCXJzcF9kYXRhX3B0ciA9ICh1bnNpZ25lZCBjaGFyICopcHJpdi0+Y2ZnLT5uYW1lOwotCQlyc3BfZGF0YV9sZW4gPSBzdHJsZW4ocHJpdi0+Y2ZnLT5uYW1lKTsKKwkJcnNwX2RhdGFfcHRyID0gKHVuc2lnbmVkIGNoYXIgKiljZmcocHJpdiktPm5hbWU7CisJCXJzcF9kYXRhX2xlbiA9IHN0cmxlbihjZmcocHJpdiktPm5hbWUpOwogCQlza2IgPSBjZmc4MDIxMV90ZXN0bW9kZV9hbGxvY19yZXBseV9za2IoaHctPndpcGh5LAogCQkJCQkJCXJzcF9kYXRhX2xlbiArIDIwKTsKIAkJaWYgKCFza2IpIHsKQEAgLTM5Niw4ICs0NDYsNyBAQAogCQlicmVhazsKIAogCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0xPQURfSU5JVF9GVzoKLQkJc3RhdHVzID0gaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShwcml2LCAmcHJpdi0+dWNvZGVfaW5pdCwKLQkJCQkJCSAgICAgIElXTF9VQ09ERV9JTklUKTsKKwkJc3RhdHVzID0gaXdsX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZSh0cmFucywgSVdMX1VDT0RFX0lOSVQpOwogCQlpZiAoc3RhdHVzKQogCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwKIAkJCQkiRXJyb3IgbG9hZGluZyBpbml0IHVjb2RlOiAlZFxuIiwgc3RhdHVzKTsKQEAgLTQwNSwxMyArNDU0LDExIEBACiAKIAljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9DRkdfSU5JVF9DQUxJQjoKIAkJaXdsX3Rlc3Rtb2RlX2NmZ19pbml0X2NhbGliKHByaXYpOwotCQlpd2xfdHJhbnNfc3RvcF9kZXZpY2UodHJhbnMocHJpdikpOworCQlpd2xfdHJhbnNfc3RvcF9kZXZpY2UodHJhbnMpOwogCQlicmVhazsKIAogCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0xPQURfUlVOVElNRV9GVzoKLQkJc3RhdHVzID0gaXdsYWduX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShwcml2LAotCQkJCQkgICAmcHJpdi0+dWNvZGVfcnQsCi0JCQkJCSAgIElXTF9VQ09ERV9SRUdVTEFSKTsKKwkJc3RhdHVzID0gaXdsX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZSh0cmFucywgSVdMX1VDT0RFX1JFR1VMQVIpOwogCQlpZiAoc3RhdHVzKSB7CiAJCQlJV0xfREVCVUdfSU5GTyhwcml2LAogCQkJCSJFcnJvciBsb2FkaW5nIHJ1bnRpbWUgdWNvZGU6ICVkXG4iLCBzdGF0dXMpOwpAQCAtNDIzLDEwICs0NzAsMjUgQEAKIAkJCQkiRXJyb3Igc3RhcnRpbmcgdGhlIGRldmljZTogJWRcbiIsIHN0YXR1cyk7CiAJCWJyZWFrOwogCisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9XT1dMQU5fRlc6CisJCWl3bF9zY2FuX2NhbmNlbF90aW1lb3V0KHByaXYsIDIwMCk7CisJCWl3bF90cmFuc19zdG9wX2RldmljZSh0cmFucyk7CisJCXN0YXR1cyA9IGl3bF9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUodHJhbnMsIElXTF9VQ09ERV9XT1dMQU4pOworCQlpZiAoc3RhdHVzKSB7CisJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJCSJFcnJvciBsb2FkaW5nIFdPV0xBTiB1Y29kZTogJWRcbiIsIHN0YXR1cyk7CisJCQlicmVhazsKKwkJfQorCQlzdGF0dXMgPSBpd2xfYWxpdmVfc3RhcnQocHJpdik7CisJCWlmIChzdGF0dXMpCisJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJCSJFcnJvciBzdGFydGluZyB0aGUgZGV2aWNlOiAlZFxuIiwgc3RhdHVzKTsKKwkJYnJlYWs7CisKIAljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9HRVRfRUVQUk9NOgotCQlpZiAocHJpdi0+ZWVwcm9tKSB7CisJCWlmIChwcml2LT5zaHJkLT5lZXByb20pIHsKIAkJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYihody0+d2lwaHksCi0JCQkJcHJpdi0+Y2ZnLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemUgKyAyMCk7CisJCQkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemUgKyAyMCk7CiAJCQlpZiAoIXNrYikgewogCQkJCUlXTF9ERUJVR19JTkZPKHByaXYsCiAJCQkJICAgICAgICJFcnJvciBhbGxvY2F0aW5nIG1lbW9yeVxuIik7CkBAIC00MzUsOCArNDk3LDggQEAKIAkJCU5MQV9QVVRfVTMyKHNrYiwgSVdMX1RNX0FUVFJfQ09NTUFORCwKIAkJCQlJV0xfVE1fQ01EX0RFVjJBUFBfRUVQUk9NX1JTUCk7CiAJCQlOTEFfUFVUKHNrYiwgSVdMX1RNX0FUVFJfRUVQUk9NLAotCQkJCXByaXYtPmNmZy0+YmFzZV9wYXJhbXMtPmVlcHJvbV9zaXplLAotCQkJCXByaXYtPmVlcHJvbSk7CisJCQkJY2ZnKHByaXYpLT5iYXNlX3BhcmFtcy0+ZWVwcm9tX3NpemUsCisJCQkJcHJpdi0+c2hyZC0+ZWVwcm9tKTsKIAkJCXN0YXR1cyA9IGNmZzgwMjExX3Rlc3Rtb2RlX3JlcGx5KHNrYik7CiAJCQlpZiAoc3RhdHVzIDwgMCkKIAkJCQlJV0xfREVCVUdfSU5GTyhwcml2LApAQCAtNDU1LDYgKzUxNywzNyBAQAogCQlwcml2LT50bV9maXhlZF9yYXRlID0gbmxhX2dldF91MzIodGJbSVdMX1RNX0FUVFJfRklYUkFURV0pOwogCQlicmVhazsKIAorCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9GV19WRVJTSU9OOgorCQlJV0xfSU5GTyhwcml2LCAidUNvZGUgdmVyc2lvbiByYXc6IDB4JXhcbiIsIHByaXYtPnVjb2RlX3Zlcik7CisKKwkJc2tiID0gY2ZnODAyMTFfdGVzdG1vZGVfYWxsb2NfcmVwbHlfc2tiKGh3LT53aXBoeSwgMjApOworCQlpZiAoIXNrYikgeworCQkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCU5MQV9QVVRfVTMyKHNrYiwgSVdMX1RNX0FUVFJfRldfVkVSU0lPTiwgcHJpdi0+dWNvZGVfdmVyKTsKKwkJc3RhdHVzID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJCQkiRXJyb3Igc2VuZGluZyBtc2cgOiAlZFxuIiwgc3RhdHVzKTsKKwkJYnJlYWs7CisKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9HRVRfREVWSUNFX0lEOgorCQlkZXZpZCA9IGJ1c19nZXRfaHdfaWQoYnVzKHByaXYpKTsKKwkJSVdMX0lORk8ocHJpdiwgImh3IHZlcnNpb246IDB4JXhcbiIsIGRldmlkKTsKKworCQlza2IgPSBjZmc4MDIxMV90ZXN0bW9kZV9hbGxvY19yZXBseV9za2IoaHctPndpcGh5LCAyMCk7CisJCWlmICghc2tiKSB7CisJCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJTkxBX1BVVF9VMzIoc2tiLCBJV0xfVE1fQVRUUl9ERVZJQ0VfSUQsIGRldmlkKTsKKwkJc3RhdHVzID0gY2ZnODAyMTFfdGVzdG1vZGVfcmVwbHkoc2tiKTsKKwkJaWYgKHN0YXR1cyA8IDApCisJCQlJV0xfREVCVUdfSU5GTyhwcml2LAorCQkJCQkiRXJyb3Igc2VuZGluZyBtc2cgOiAlZFxuIiwgc3RhdHVzKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiVW5rbm93biB0ZXN0bW9kZSBkcml2ZXIgY29tbWFuZCBJRFxuIik7CiAJCXJldHVybiAtRU5PU1lTOwpAQCAtNTM1LDcgKzYyOCw3IEBACiAJCX0KIAkJcHJpdi0+dGVzdG1vZGVfdHJhY2UubnVtX2NodW5rcyA9CiAJCQlESVZfUk9VTkRfVVAocHJpdi0+dGVzdG1vZGVfdHJhY2UuYnVmZl9zaXplLAotCQkJCSAgICAgVFJBQ0VfQ0hVTktfU0laRSk7CisJCQkJICAgICBEVU1QX0NIVU5LX1NJWkUpOwogCQlicmVhazsKIAogCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX0VORF9UUkFDRToKQEAgLTU2NywxNSArNjYwLDE1IEBACiAJCWlkeCA9IGNiLT5hcmdzWzRdOwogCQlpZiAoaWR4ID49IHByaXYtPnRlc3Rtb2RlX3RyYWNlLm51bV9jaHVua3MpCiAJCQlyZXR1cm4gLUVOT0VOVDsKLQkJbGVuZ3RoID0gVFJBQ0VfQ0hVTktfU0laRTsKKwkJbGVuZ3RoID0gRFVNUF9DSFVOS19TSVpFOwogCQlpZiAoKChpZHggKyAxKSA9PSBwcml2LT50ZXN0bW9kZV90cmFjZS5udW1fY2h1bmtzKSAmJgotCQkgICAgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSAlIFRSQUNFX0NIVU5LX1NJWkUpKQorCQkgICAgKHByaXYtPnRlc3Rtb2RlX3RyYWNlLmJ1ZmZfc2l6ZSAlIERVTVBfQ0hVTktfU0laRSkpCiAJCQlsZW5ndGggPSBwcml2LT50ZXN0bW9kZV90cmFjZS5idWZmX3NpemUgJQotCQkJCVRSQUNFX0NIVU5LX1NJWkU7CisJCQkJRFVNUF9DSFVOS19TSVpFOwogCiAJCU5MQV9QVVQoc2tiLCBJV0xfVE1fQVRUUl9UUkFDRV9EVU1QLCBsZW5ndGgsCiAJCQlwcml2LT50ZXN0bW9kZV90cmFjZS50cmFjZV9hZGRyICsKLQkJCShUUkFDRV9DSFVOS19TSVpFICogaWR4KSk7CisJCQkoRFVNUF9DSFVOS19TSVpFICogaWR4KSk7CiAJCWlkeCsrOwogCQljYi0+YXJnc1s0XSA9IGlkeDsKIAkJcmV0dXJuIDA7CkBAIC02MjEsNiArNzE0LDExMCBAQAogCXJldHVybiAwOwogfQogCisvKgorICogVGhpcyBmdW5jdGlvbiBoYW5kbGVzIHRoZSB1c2VyIGFwcGxpY2F0aW9uIGNvbW1hbmRzIGZvciBTUkFNIGRhdGEgZHVtcAorICoKKyAqIEl0IHJldHJpZXZlcyB0aGUgbWFuZGF0b3J5IGZpZWxkcyBJV0xfVE1fQVRUUl9TUkFNX0FERFIgYW5kCisgKiBJV0xfVE1fQVRUUl9TUkFNX1NJWkUgdG8gZGVjaWRlIHRoZSBtZW1vcnkgYXJlYSBmb3IgU1JBTSBkYXRhIHJlYWRpbmcKKyAqCisgKiBTZXZlcmFsIGVycm9yIHdpbGwgYmUgcmV0dXJlZCwgLUVCVVNZIGlmIHRoZSBTUkFNIGRhdGEgcmV0cmlldmVkIGJ5CisgKiBwcmV2aW91cyBjb21tYW5kIGhhcyBub3QgYmVlbiBkZWxpdmVyZWQgdG8gdXNlcnNwYWNlLCBvciAtRU5PTVNHIGlmCisgKiB0aGUgbWFuZGF0b3J5IGZpZWxkcyAoSVdMX1RNX0FUVFJfU1JBTV9BRERSLElXTF9UTV9BVFRSX1NSQU1fU0laRSkKKyAqIGFyZSBtaXNzaW5nLCBvciAtRU5PTUVNIGlmIHRoZSBidWZmZXIgYWxsb2NhdGlvbiBmYWlscy4KKyAqCisgKiBPdGhlcndpc2UgMCBpcyByZXBsaWVkIGluZGljYXRpbmcgdGhlIHN1Y2Nlc3Mgb2YgdGhlIFNSQU0gcmVhZGluZy4KKyAqCisgKiBAaHc6IGllZWU4MDIxMV9odyBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBkZXZpY2UKKyAqIEB0YjogZ25sIG1lc3NhZ2UgZmllbGRzIGZyb20gdGhlIHVzZXIgc3BhY2UKKyAqLworc3RhdGljIGludCBpd2xfdGVzdG1vZGVfc3JhbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgc3RydWN0IG5sYXR0ciAqKnRiKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2OworCXUzMiBiYXNlLCBvZnMsIHNpemUsIG1heHNpemU7CisKKwlpZiAocHJpdi0+dGVzdG1vZGVfc3JhbS5zcmFtX3JlYWRlZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghdGJbSVdMX1RNX0FUVFJfU1JBTV9BRERSXSkgeworCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRXJyb3IgZmluZGluZyBTUkFNIG9mZnNldCBhZGRyZXNzXG4iKTsKKwkJcmV0dXJuIC1FTk9NU0c7CisJfQorCW9mcyA9IG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX1NSQU1fQUREUl0pOworCWlmICghdGJbSVdMX1RNX0FUVFJfU1JBTV9TSVpFXSkgeworCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRXJyb3IgZmluZGluZyBzaXplIGZvciBTUkFNIHJlYWRpbmdcbiIpOworCQlyZXR1cm4gLUVOT01TRzsKKwl9CisJc2l6ZSA9IG5sYV9nZXRfdTMyKHRiW0lXTF9UTV9BVFRSX1NSQU1fU0laRV0pOworCXN3aXRjaCAocHJpdi0+c2hyZC0+dWNvZGVfdHlwZSkgeworCWNhc2UgSVdMX1VDT0RFX1JFR1VMQVI6CisJCW1heHNpemUgPSB0cmFucyhwcml2KS0+dWNvZGVfcnQuZGF0YS5sZW47CisJCWJyZWFrOworCWNhc2UgSVdMX1VDT0RFX0lOSVQ6CisJCW1heHNpemUgPSB0cmFucyhwcml2KS0+dWNvZGVfaW5pdC5kYXRhLmxlbjsKKwkJYnJlYWs7CisJY2FzZSBJV0xfVUNPREVfV09XTEFOOgorCQltYXhzaXplID0gdHJhbnMocHJpdiktPnVjb2RlX3dvd2xhbi5kYXRhLmxlbjsKKwkJYnJlYWs7CisJY2FzZSBJV0xfVUNPREVfTk9ORToKKwkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIkVycm9yLCB1Q29kZSBkb2VzIG5vdCBiZWVuIGxvYWRlZFxuIik7CisJCXJldHVybiAtRU5PU1lTOworCWRlZmF1bHQ6CisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJFcnJvciwgdW5zdXBwb3J0ZWQgdUNvZGUgdHlwZVxuIik7CisJCXJldHVybiAtRU5PU1lTOworCX0KKwlpZiAoKG9mcyArIHNpemUpID4gbWF4c2l6ZSkgeworCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiSW52YWxpZCBvZmZzZXQvc2l6ZTogb3V0IG9mIHJhbmdlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXByaXYtPnRlc3Rtb2RlX3NyYW0uYnVmZl9zaXplID0gKHNpemUgLyA0KSAqIDQ7CisJcHJpdi0+dGVzdG1vZGVfc3JhbS5idWZmX2FkZHIgPQorCQlrbWFsbG9jKHByaXYtPnRlc3Rtb2RlX3NyYW0uYnVmZl9zaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAocHJpdi0+dGVzdG1vZGVfc3JhbS5idWZmX2FkZHIgPT0gTlVMTCkgeworCQlJV0xfREVCVUdfSU5GTyhwcml2LCAiRXJyb3IgYWxsb2NhdGluZyBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJYmFzZSA9IDB4ODAwMDAwOworCV9pd2xfcmVhZF90YXJnX21lbV93b3JkcyhidXMocHJpdiksIGJhc2UgKyBvZnMsCisJCQkJCXByaXYtPnRlc3Rtb2RlX3NyYW0uYnVmZl9hZGRyLAorCQkJCQlwcml2LT50ZXN0bW9kZV9zcmFtLmJ1ZmZfc2l6ZSAvIDQpOworCXByaXYtPnRlc3Rtb2RlX3NyYW0ubnVtX2NodW5rcyA9CisJCURJVl9ST1VORF9VUChwcml2LT50ZXN0bW9kZV9zcmFtLmJ1ZmZfc2l6ZSwgRFVNUF9DSFVOS19TSVpFKTsKKwlwcml2LT50ZXN0bW9kZV9zcmFtLnNyYW1fcmVhZGVkID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpd2xfdGVzdG1vZGVfc3JhbV9kdW1wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgbmxhdHRyICoqdGIsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gaHctPnByaXY7CisJaW50IGlkeCwgbGVuZ3RoOworCisJaWYgKHByaXYtPnRlc3Rtb2RlX3NyYW0uc3JhbV9yZWFkZWQpIHsKKwkJaWR4ID0gY2ItPmFyZ3NbNF07CisJCWlmIChpZHggPj0gcHJpdi0+dGVzdG1vZGVfc3JhbS5udW1fY2h1bmtzKSB7CisJCQlpd2xfc3JhbV9jbGVhbnVwKHByaXYpOworCQkJcmV0dXJuIC1FTk9FTlQ7CisJCX0KKwkJbGVuZ3RoID0gRFVNUF9DSFVOS19TSVpFOworCQlpZiAoKChpZHggKyAxKSA9PSBwcml2LT50ZXN0bW9kZV9zcmFtLm51bV9jaHVua3MpICYmCisJCSAgICAocHJpdi0+dGVzdG1vZGVfc3JhbS5idWZmX3NpemUgJSBEVU1QX0NIVU5LX1NJWkUpKQorCQkJbGVuZ3RoID0gcHJpdi0+dGVzdG1vZGVfc3JhbS5idWZmX3NpemUgJQorCQkJCURVTVBfQ0hVTktfU0laRTsKKworCQlOTEFfUFVUKHNrYiwgSVdMX1RNX0FUVFJfU1JBTV9EVU1QLCBsZW5ndGgsCisJCQlwcml2LT50ZXN0bW9kZV9zcmFtLmJ1ZmZfYWRkciArCisJCQkoRFVNUF9DSFVOS19TSVpFICogaWR4KSk7CisJCWlkeCsrOworCQljYi0+YXJnc1s0XSA9IGlkeDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAtRUZBVUxUOworCisgbmxhX3B1dF9mYWlsdXJlOgorCXJldHVybiAtRU5PQlVGUzsKK30KKwogCiAvKiBUaGUgdGVzdG1vZGUgZ25sIG1lc3NhZ2UgaGFuZGxlciB0aGF0IHRha2VzIHRoZSBnbmwgbWVzc2FnZSBmcm9tIHRoZQogICogdXNlciBzcGFjZSBhbmQgcGFyc2VzIGl0IHBlciB0aGUgcG9saWN5IGl3bF90ZXN0bW9kZV9nbmxfbXNnX3BvbGljeSwgdGhlbgpAQCAtNjY4LDkgKzg2NSwxMSBAQAogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidGVzdG1vZGUgY21kIHRvIHVDb2RlXG4iKTsKIAkJcmVzdWx0ID0gaXdsX3Rlc3Rtb2RlX3Vjb2RlKGh3LCB0Yik7CiAJCWJyZWFrOwotCWNhc2UgSVdMX1RNX0NNRF9BUFAyREVWX1JFR19SRUFEMzI6Ci0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1dSSVRFMzI6Ci0JY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1dSSVRFODoKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1JFQUQzMjoKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFMzI6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19XUklURTg6CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1JFQUQzMjoKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9JTkRJUkVDVF9SRUdfV1JJVEUzMjoKIAkJSVdMX0RFQlVHX0lORk8ocHJpdiwgInRlc3Rtb2RlIGNtZCB0byByZWdpc3RlclxuIik7CiAJCXJlc3VsdCA9IGl3bF90ZXN0bW9kZV9yZWcoaHcsIHRiKTsKIAkJYnJlYWs7CkBAIC02ODAsNiArODc5LDkgQEAKIAljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9MT0FEX1JVTlRJTUVfRlc6CiAJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0VFUFJPTToKIAljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9GSVhSQVRFX1JFUToKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9MT0FEX1dPV0xBTl9GVzoKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9HRVRfRldfVkVSU0lPTjoKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9HRVRfREVWSUNFX0lEOgogCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidGVzdG1vZGUgY21kIHRvIGRyaXZlclxuIik7CiAJCXJlc3VsdCA9IGl3bF90ZXN0bW9kZV9kcml2ZXIoaHcsIHRiKTsKIAkJYnJlYWs7CkBAIC02OTYsNiArODk4LDExIEBACiAJCXJlc3VsdCA9IGl3bF90ZXN0bW9kZV9vd25lcnNoaXAoaHcsIHRiKTsKIAkJYnJlYWs7CiAKKwljYXNlIElXTF9UTV9DTURfQVBQMkRFVl9SRUFEX1NSQU06CisJCUlXTF9ERUJVR19JTkZPKHByaXYsICJ0ZXN0bW9kZSBzcmFtIHJlYWQgY21kIHRvIGRyaXZlclxuIik7CisJCXJlc3VsdCA9IGl3bF90ZXN0bW9kZV9zcmFtKGh3LCB0Yik7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJSVdMX0RFQlVHX0lORk8ocHJpdiwgIlVua25vd24gdGVzdG1vZGUgY29tbWFuZFxuIik7CiAJCXJlc3VsdCA9IC1FTk9TWVM7CkBAIC03NDQsNiArOTUxLDEwIEBACiAJCUlXTF9ERUJVR19JTkZPKHByaXYsICJ1Q29kZSB0cmFjZSBjbWQgdG8gZHJpdmVyXG4iKTsKIAkJcmVzdWx0ID0gaXdsX3Rlc3Rtb2RlX3RyYWNlX2R1bXAoaHcsIHRiLCBza2IsIGNiKTsKIAkJYnJlYWs7CisJY2FzZSBJV0xfVE1fQ01EX0FQUDJERVZfRFVNUF9TUkFNOgorCQlJV0xfREVCVUdfSU5GTyhwcml2LCAidGVzdG1vZGUgc3JhbSBkdW1wIGNtZCB0byBkcml2ZXJcbiIpOworCQlyZXN1bHQgPSBpd2xfdGVzdG1vZGVfc3JhbV9kdW1wKGh3LCB0Yiwgc2tiLCBjYik7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJlc3VsdCA9IC1FSU5WQUw7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdGVzdG1vZGUuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRlc3Rtb2RlLmgKaW5kZXggYjk4MGJkYS4uMjYxMzhmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdGVzdG1vZGUuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10ZXN0bW9kZS5oCkBAIC03Niw5ICs3Niw5IEBACiAgKgl0aGUgYWN0dWFsIHVDb2RlIGhvc3QgY29tbWFuZCBJRCBpcyBjYXJyaWVkIHdpdGgKICAqCUlXTF9UTV9BVFRSX1VDT0RFX0NNRF9JRAogICoKLSAqIEBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1JFQUQzMjoKLSAqIEBJV0xfVE1fQ01EX0FQUDJERVZfUkVHX1dSSVRFMzI6Ci0gKiBASVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTg6CisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0RJUkVDVF9SRUdfUkVBRDMyOgorICogQElXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFMzI6CisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0RJUkVDVF9SRUdfV1JJVEU4OgogICoJY29tbWFuZHMgZnJvbSB1c2VyIGFwcGxpY2FpdG9uIHRvIGFjY2VzcyByZWdpc3RlcgogICoKICAqIEBJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0RFVklDRU5BTUU6IHJldHJpZXZlIGRldmljZSBuYW1lCkBAIC0xMDMsMTYgKzEwMywzMCBAQAogICogQElXTF9UTV9DTURfREVWMkFQUF9FRVBST01fUlNQOgogICoJY29tbWFuZHMgZnJvbSBrZXJuZWwgc3BhY2UgdG8gY2FycnkgdGhlIGVlcHJvbSByZXNwb25zZQogICoJdG8gdXNlciBhcHBsaWNhdGlvbgorICoKICAqIEBJV0xfVE1fQ01EX0FQUDJERVZfT1dORVJTSElQOgogICoJY29tbWFuZHMgZnJvbSB1c2VyIGFwcGxpY2F0aW9uIHRvIG93biBjaGFuZ2UgdGhlIG93bmVyc2hpcCBvZiB0aGUgdUNvZGUKICAqCWlmIGFwcGxpY2F0aW9uIGhhcyB0aGUgb3duZXJzaGlwLCB0aGUgb25seSBob3N0IGNvbW1hbmQgZnJvbQogICoJdGVzdG1vZGUgd2lsbCBkZWxpdmVyIHRvIHVDb2RlLiBEZWZhdWx0IG93bmVyIGlzIGRyaXZlcgorICoKKyAqIEBJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1JFQUQzMjoKKyAqIEBJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1dSSVRFMzI6CisgKgljb21tYW5kcyBmcm9tIHVzZXIgYXBwbGljYWl0b24gdG8gaW5kaXJlY3RseSBhY2Nlc3MgcGVyaXBoZXJhbCByZWdpc3RlcgorICoKKyAqIEBJV0xfVE1fQ01EX0FQUDJERVZfUkVBRF9TUkFNOgorICogQElXTF9UTV9DTURfQVBQMkRFVl9EVU1QX1NSQU06CisgKgljb21tYW5kcyBmcm9tIHVzZXIgYXBwbGljYWl0b24gdG8gcmVhZCBkYXRhIGluIHNyYW0KKyAqCisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0xPQURfV09XTEFOX0ZXOiBsb2FkIFdlYWsgT24gV2lyZWxlc3MgTEFOIHVDb2RlIGltYWdlCisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0dFVF9GV19WRVJTSU9OOiByZXRyaWV2ZSB1Q29kZSB2ZXJzaW9uCisgKiBASVdMX1RNX0NNRF9BUFAyREVWX0dFVF9ERVZJQ0VfSUQ6IHJldHJpZXZlIElEIGluZm9ybWF0aW9uIGluIGRldmljZQorICoKICAqLwogZW51bSBpd2xfdG1fY21kX3QgewogCUlXTF9UTV9DTURfQVBQMkRFVl9VQ09ERQkJPSAxLAotCUlXTF9UTV9DTURfQVBQMkRFVl9SRUdfUkVBRDMyCQk9IDIsCi0JSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTMyCQk9IDMsCi0JSVdMX1RNX0NNRF9BUFAyREVWX1JFR19XUklURTgJCT0gNCwKKwlJV0xfVE1fQ01EX0FQUDJERVZfRElSRUNUX1JFR19SRUFEMzIJPSAyLAorCUlXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFMzIJPSAzLAorCUlXTF9UTV9DTURfQVBQMkRFVl9ESVJFQ1RfUkVHX1dSSVRFOAk9IDQsCiAJSVdMX1RNX0NNRF9BUFAyREVWX0dFVF9ERVZJQ0VOQU1FCT0gNSwKIAlJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9JTklUX0ZXCQk9IDYsCiAJSVdMX1RNX0NNRF9BUFAyREVWX0NGR19JTklUX0NBTElCCT0gNywKQEAgLTEyNiw3ICsxNDAsMTQgQEAKIAlJV0xfVE1fQ01EX0RFVjJBUFBfVUNPREVfUlhfUEtUCQk9IDE1LAogCUlXTF9UTV9DTURfREVWMkFQUF9FRVBST01fUlNQCQk9IDE2LAogCUlXTF9UTV9DTURfQVBQMkRFVl9PV05FUlNISVAJCT0gMTcsCi0JSVdMX1RNX0NNRF9NQVgJCQkJPSAxOCwKKwlJV0xfVE1fQ01EX0FQUDJERVZfSU5ESVJFQ1RfUkVHX1JFQUQzMgk9IDE4LAorCUlXTF9UTV9DTURfQVBQMkRFVl9JTkRJUkVDVF9SRUdfV1JJVEUzMgk9IDE5LAorCUlXTF9UTV9DTURfQVBQMkRFVl9SRUFEX1NSQU0JCT0gMjAsCisJSVdMX1RNX0NNRF9BUFAyREVWX0RVTVBfU1JBTQkJPSAyMSwKKwlJV0xfVE1fQ01EX0FQUDJERVZfTE9BRF9XT1dMQU5fRlcJPSAyMiwKKwlJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0ZXX1ZFUlNJT04JPSAyMywKKwlJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0RFVklDRV9JRAk9IDI0LAorCUlXTF9UTV9DTURfTUFYCQkJCT0gMjUsCiB9OwogCiAvKgpAQCAtMTk2LDYgKzIxNywyNiBAQAogICoJV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfQVBQMkRFVl9PV05FUlNISVAsCiAgKglUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6CiAgKglJV0xfVE1fQVRUUl9VQ09ERV9PV05FUiBmb3IgdGhlIG5ldyBvd25lcgorICoKKyAqIEBJV0xfVE1fQVRUUl9TUkFNX0FERFI6CisgKiBASVdMX1RNX0FUVFJfU1JBTV9TSVpFOgorICoJV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfQVBQMkRFVl9SRUFEX1NSQU0sCisgKglUaGUgbWFuZGF0b3J5IGZpZWxkcyBhcmU6CisgKglJV0xfVE1fQVRUUl9TUkFNX0FERFIgZm9yIHRoZSBhZGRyZXNzIGluIHNyYW0KKyAqCUlXTF9UTV9BVFRSX1NSQU1fU0laRSBmb3IgdGhlIGJ1ZmZlciBzaXplIG9mIGRhdGEgcmVhZGluZworICoKKyAqIEBJV0xfVE1fQVRUUl9TUkFNX0RVTVA6CisgKglXaGVuIElXTF9UTV9BVFRSX0NPTU1BTkQgaXMgSVdMX1RNX0NNRF9BUFAyREVWX0RVTVBfU1JBTSwKKyAqCUlXTF9UTV9BVFRSX1NSQU1fRFVNUCBmb3IgdGhlIGRhdGEgaW4gc3JhbQorICoKKyAqIEBJV0xfVE1fQVRUUl9GV19WRVJTSU9OOgorICoJV2hlbiBJV0xfVE1fQVRUUl9DT01NQU5EIGlzIElXTF9UTV9DTURfQVBQMkRFVl9HRVRfRldfVkVSU0lPTiwKKyAqCUlXTF9UTV9BVFRSX0ZXX1ZFUlNJT04gZm9yIHRoZSB1Q29kZSB2ZXJzaW9uCisgKgorICogQElXTF9UTV9BVFRSX0RFVklDRV9JRDoKKyAqCVdoZW4gSVdMX1RNX0FUVFJfQ09NTUFORCBpcyBJV0xfVE1fQ01EX0FQUDJERVZfR0VUX0RFVklDRV9JRCwKKyAqCUlXTF9UTV9BVFRSX0RFVklDRV9JRCBmb3IgdGhlIGRldmljZSBJRCBpbmZvcm1hdGlvbgorICoKICAqLwogZW51bSBpd2xfdG1fYXR0cl90IHsKIAlJV0xfVE1fQVRUUl9OT1RfQVBQTElDQUJMRQkJPSAwLApAQCAtMjEzLDcgKzI1NCwxMiBAQAogCUlXTF9UTV9BVFRSX1RSQUNFX0RVTVAJCQk9IDEyLAogCUlXTF9UTV9BVFRSX0ZJWFJBVEUJCQk9IDEzLAogCUlXTF9UTV9BVFRSX1VDT0RFX09XTkVSCQkJPSAxNCwKLQlJV0xfVE1fQVRUUl9NQVgJCQkJPSAxNSwKKwlJV0xfVE1fQVRUUl9TUkFNX0FERFIJCQk9IDE1LAorCUlXTF9UTV9BVFRSX1NSQU1fU0laRQkJCT0gMTYsCisJSVdMX1RNX0FUVFJfU1JBTV9EVU1QCQkJPSAxNywKKwlJV0xfVE1fQVRUUl9GV19WRVJTSU9OCQkJPSAxOCwKKwlJV0xfVE1fQVRUUl9ERVZJQ0VfSUQJCQk9IDE5LAorCUlXTF9UTV9BVFRSX01BWAkJCQk9IDIwLAogfTsKIAogLyogdUNvZGUgdHJhY2UgYnVmZmVyICovCkBAIC0yMjEsNiArMjY3LDggQEAKICNkZWZpbmUgVFJBQ0VfQlVGRl9TSVpFX01JTgkweDIwMDAwCiAjZGVmaW5lIFRSQUNFX0JVRkZfU0laRV9ERUYJVFJBQ0VfQlVGRl9TSVpFX01JTgogI2RlZmluZSBUUkFDRV9CVUZGX1BBREQJCTB4MjAwMAotI2RlZmluZSBUUkFDRV9DSFVOS19TSVpFCShQQUdFX1NJWkUgLSAxMDI0KQorCisvKiBNYXhpbXVtIGRhdGEgc2l6ZSBvZiBlYWNoIGR1bXAgaXQgcGFja2V0ICovCisjZGVmaW5lIERVTVBfQ0hVTktfU0laRQkJKFBBR0VfU0laRSAtIDEwMjQpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS1pbnQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtaW50LmgKaW5kZXggMmI2NzU2ZS4uZjZkZWJmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS1pbnQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLWludC5oCkBAIC0yMTksOSArMjE5LDcgQEAKIAogCS8qIElOVCBJQ1QgVGFibGUgKi8KIAlfX2xlMzIgKmljdF90Ymw7Ci0Jdm9pZCAqaWN0X3RibF92aXI7CiAJZG1hX2FkZHJfdCBpY3RfdGJsX2RtYTsKLQlkbWFfYWRkcl90IGFsaWduZWRfaWN0X3RibF9kbWE7CiAJaW50IGljdF9pbmRleDsKIAl1MzIgaW50YTsKIAlib29sIHVzZV9pY3Q7CkBAIC0yMzYsNiArMjM0LDcgQEAKIAljb25zdCB1OCAqYWNfdG9fZmlmb1tOVU1fSVdMX1JYT05fQ1RYXTsKIAljb25zdCB1OCAqYWNfdG9fcXVldWVbTlVNX0lXTF9SWE9OX0NUWF07CiAJdTggbWNhc3RfcXVldWVbTlVNX0lXTF9SWE9OX0NUWF07CisJdTggYWdnX3R4cVtJV0xBR05fU1RBVElPTl9DT1VOVF1bSVdMX01BWF9USURfQ09VTlRdOwogCiAJc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxOwogCXVuc2lnbmVkIGxvbmcgdHhxX2N0eF9hY3RpdmVfbXNrOwpAQCAtMjgwLDIwICsyNzksMTYgQEAKIHZvaWQgaXdsX3RyYW5zX3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAogCQkJCQkgICBzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEsCiAJCQkJCSAgIHUxNiBieXRlX2NudCk7Ci12b2lkIGl3bF90cmFuc19wY2llX3R4cV9hZ2dfZGlzYWJsZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHR4cV9pZCk7CiBpbnQgaXdsX3RyYW5zX3BjaWVfdHhfYWdnX2Rpc2FibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkJICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LCBpbnQgc3RhX2lkLAotCQkJCSAgaW50IHRpZCk7CisJCQkJICBpbnQgc3RhX2lkLCBpbnQgdGlkKTsKIHZvaWQgaXdsX3RyYW5zX3NldF93cl9wdHJzKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgdHhxX2lkLCB1MzIgaW5kZXgpOwogdm9pZCBpd2xfdHJhbnNfdHhfcXVldWVfc2V0X3N0YXR1cyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCSAgICAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAogCQkJICAgICBpbnQgdHhfZmlmb19pZCwgaW50IHNjZF9yZXRyeSk7Ci1pbnQgaXdsX3RyYW5zX3BjaWVfdHhfYWdnX2FsbG9jKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCWVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsIGludCBzdGFfaWQsCi0JCQkJaW50IHRpZCwgdTE2ICpzc24pOworaW50IGl3bF90cmFuc19wY2llX3R4X2FnZ19hbGxvYyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHN0YV9pZCwgaW50IHRpZCk7CiB2b2lkIGl3bF90cmFuc19wY2llX3R4X2FnZ19zZXR1cChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKIAkJCQkgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwKLQkJCQkgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyYW1lX2xpbWl0KTsKKwkJCQkgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyYW1lX2xpbWl0LCB1MTYgc3NuKTsKIHZvaWQgaXdsYWduX3R4cV9mcmVlX3RmZChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLAogCWludCBpbmRleCwgZW51bSBkbWFfZGF0YV9kaXJlY3Rpb24gZG1hX2Rpcik7CiBpbnQgaXdsX3R4X3F1ZXVlX3JlY2xhaW0oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHFfaWQsIGludCBpbmRleCwKQEAgLTM1NCw4ICszNDksMTMgQEAKIAl0eHEtPnN3cV9pZCA9IChod3EgPDwgMikgfCBhYzsKIH0KIAorc3RhdGljIGlubGluZSB1OCBpd2xfZ2V0X3F1ZXVlX2FjKHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKK3sKKwlyZXR1cm4gdHhxLT5zd3FfaWQgJiAweDM7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfd2FrZV9xdWV1ZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCQkgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSkKKwkJCQkgIHN0cnVjdCBpd2xfdHhfcXVldWUgKnR4cSwgY29uc3QgY2hhciAqbXNnKQogewogCXU4IHF1ZXVlID0gdHhxLT5zd3FfaWQ7CiAJdTggYWMgPSBxdWV1ZSAmIDM7CkBAIC0zNjMsMTMgKzM2MywyMiBAQAogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9CiAJCUlXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KGh3cSwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpCi0JCWlmIChhdG9taWNfZGVjX3JldHVybigmdHJhbnNfcGNpZS0+cXVldWVfc3RvcF9jb3VudFthY10pIDw9IDApCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChod3EsIHRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BwZWQpKSB7CisJCWlmIChhdG9taWNfZGVjX3JldHVybigmdHJhbnNfcGNpZS0+cXVldWVfc3RvcF9jb3VudFthY10pIDw9IDApIHsKIAkJCWl3bF93YWtlX3N3X3F1ZXVlKHByaXYodHJhbnMpLCBhYyk7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiV2FrZSBod3EgJWQgYWMgJWQuICVzIiwKKwkJCQkJICAgIGh3cSwgYWMsIG1zZyk7CisJCX0gZWxzZSB7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiRG9uJ3Qgd2FrZSBod3EgJWQgYWMgJWQiCisJCQkJCSAgICAiIHN0b3AgY291bnQgJWQuICVzIiwKKwkJCQkJICAgIGh3cSwgYWMsIGF0b21pY19yZWFkKCZ0cmFuc19wY2llLT4KKwkJCQkJICAgIHF1ZXVlX3N0b3BfY291bnRbYWNdKSwgbXNnKTsKKwkJfQorCX0KIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGl3bF9zdG9wX3F1ZXVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCSAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxKQorCQkJCSAgc3RydWN0IGl3bF90eF9xdWV1ZSAqdHhxLCBjb25zdCBjaGFyICptc2cpCiB7CiAJdTggcXVldWUgPSB0eHEtPnN3cV9pZDsKIAl1OCBhYyA9IHF1ZXVlICYgMzsKQEAgLTM3Nyw5ICszODYsMjMgQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPQogCQlJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KGh3cSwgdHJhbnNfcGNpZS0+cXVldWVfc3RvcHBlZCkpCi0JCWlmIChhdG9taWNfaW5jX3JldHVybigmdHJhbnNfcGNpZS0+cXVldWVfc3RvcF9jb3VudFthY10pID4gMCkKKwlpZiAoIXRlc3RfYW5kX3NldF9iaXQoaHdxLCB0cmFuc19wY2llLT5xdWV1ZV9zdG9wcGVkKSkgeworCQlpZiAoYXRvbWljX2luY19yZXR1cm4oJnRyYW5zX3BjaWUtPnF1ZXVlX3N0b3BfY291bnRbYWNdKSA+IDApIHsKIAkJCWl3bF9zdG9wX3N3X3F1ZXVlKHByaXYodHJhbnMpLCBhYyk7CisJCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiU3RvcCBod3EgJWQgYWMgJWQiCisJCQkJCSAgICAiIHN0b3AgY291bnQgJWQuICVzIiwKKwkJCQkJICAgIGh3cSwgYWMsIGF0b21pY19yZWFkKCZ0cmFuc19wY2llLT4KKwkJCQkJICAgIHF1ZXVlX3N0b3BfY291bnRbYWNdKSwgbXNnKTsKKwkJfSBlbHNlIHsKKwkJCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJEb24ndCBzdG9wIGh3cSAlZCBhYyAlZCIKKwkJCQkJICAgICIgc3RvcCBjb3VudCAlZC4gJXMiLAorCQkJCQkgICAgaHdxLCBhYywgYXRvbWljX3JlYWQoJnRyYW5zX3BjaWUtPgorCQkJCQkgICAgcXVldWVfc3RvcF9jb3VudFthY10pLCBtc2cpOworCQl9CisJfSBlbHNlIHsKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgInN0b3AgaHdxICVkLCBidXQgaXQgaXMgc3RvcHBlZC8gJXMiLAorCQkJCSAgICBod3EsIG1zZyk7CisJfQogfQogCiAjaWZkZWYgaWVlZTgwMjExX3N0b3BfcXVldWUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtcnguYwppbmRleCAzNzRjNjhjLi43NTI0OTNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLXJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS1yeC5jCkBAIC01OTQsOCArNTk0LDggQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPQogCQlJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCi0JYmFzZSA9IHByaXYtPmRldmljZV9wb2ludGVycy5lcnJvcl9ldmVudF90YWJsZTsKLQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkgeworCWJhc2UgPSB0cmFucy0+c2hyZC0+ZGV2aWNlX3BvaW50ZXJzLmVycm9yX2V2ZW50X3RhYmxlOworCWlmICh0cmFucy0+c2hyZC0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkgewogCQlpZiAoIWJhc2UpCiAJCQliYXNlID0gcHJpdi0+aW5pdF9lcnJsb2dfcHRyOwogCX0gZWxzZSB7CkBAIC02MDcsNyArNjA3LDcgQEAKIAkJSVdMX0VSUih0cmFucywKIAkJCSJOb3QgdmFsaWQgZXJyb3IgbG9nIHBvaW50ZXIgMHglMDhYIGZvciAlcyB1Q29kZVxuIiwKIAkJCWJhc2UsCi0JCQkocHJpdi0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkKKwkJCSh0cmFucy0+c2hyZC0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkKIAkJCQkJPyAiSW5pdCIgOiAiUlQiKTsKIAkJcmV0dXJuOwogCX0KQEAgLTY0OCw2ICs2NDgsMjEgQEAKIAlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgaHcgdmVyc2lvblxuIiwgdGFibGUuaHdfdmVyKTsKIAlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgYm9hcmQgdmVyc2lvblxuIiwgdGFibGUuYnJkX3Zlcik7CiAJSVdMX0VSUih0cmFucywgIjB4JTA4WCB8IGhjbWRcbiIsIHRhYmxlLmhjbWQpOworCisJSVdMX0VSUih0cmFucywgIjB4JTA4WCB8IGlzcjBcbiIsIHRhYmxlLmlzcjApOworCUlXTF9FUlIodHJhbnMsICIweCUwOFggfCBpc3IxXG4iLCB0YWJsZS5pc3IxKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgaXNyMlxuIiwgdGFibGUuaXNyMik7CisJSVdMX0VSUih0cmFucywgIjB4JTA4WCB8IGlzcjNcbiIsIHRhYmxlLmlzcjMpOworCUlXTF9FUlIodHJhbnMsICIweCUwOFggfCBpc3I0XG4iLCB0YWJsZS5pc3I0KTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgaXNyX3ByZWZcbiIsIHRhYmxlLmlzcl9wcmVmKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgd2FpdF9ldmVudFxuIiwgdGFibGUud2FpdF9ldmVudCk7CisJSVdMX0VSUih0cmFucywgIjB4JTA4WCB8IGwycF9jb250cm9sXG4iLCB0YWJsZS5sMnBfY29udHJvbCk7CisJSVdMX0VSUih0cmFucywgIjB4JTA4WCB8IGwycF9kdXJhdGlvblxuIiwgdGFibGUubDJwX2R1cmF0aW9uKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgbDJwX21odmFsaWRcbiIsIHRhYmxlLmwycF9taHZhbGlkKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgbDJwX2FkZHJfbWF0Y2hcbiIsIHRhYmxlLmwycF9hZGRyX21hdGNoKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgbG1wbV9wbWdfc2VsXG4iLCB0YWJsZS5sbXBtX3BtZ19zZWwpOworCUlXTF9FUlIodHJhbnMsICIweCUwOFggfCB0aW1lc3RhbXBcbiIsIHRhYmxlLnVfdGltZXN0YW1wKTsKKwlJV0xfRVJSKHRyYW5zLCAiMHglMDhYIHwgZmxvd19oYW5kbGVyXG4iLCB0YWJsZS5mbG93X2hhbmRsZXIpOwogfQogCiAvKioKQEAgLTY1Nyw3ICs2NzIsNyBAQAogewogCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHByaXYodHJhbnMpOwogCS8qIFcvQSBmb3IgV2lGaS9XaU1BWCBjb2V4IGFuZCBXaU1BWCBvd24gdGhlIFJGICovCi0JaWYgKHByaXYtPmNmZy0+aW50ZXJuYWxfd2ltYXhfY29leCAmJgorCWlmIChjZmcocHJpdiktPmludGVybmFsX3dpbWF4X2NvZXggJiYKIAkgICAgKCEoaXdsX3JlYWRfcHJwaChidXModHJhbnMpLCBBUE1HX0NMS19DVFJMX1JFRykgJgogCQkJQVBNU19DTEtfVkFMX01SQl9GVU5DX01PREUpIHx8CiAJICAgICAoaXdsX3JlYWRfcHJwaChidXModHJhbnMpLCBBUE1HX1BTX0NUUkxfUkVHKSAmCkBAIC03MDksOCArNzI0LDggQEAKIAlpZiAobnVtX2V2ZW50cyA9PSAwKQogCQlyZXR1cm4gcG9zOwogCi0JYmFzZSA9IHByaXYtPmRldmljZV9wb2ludGVycy5sb2dfZXZlbnRfdGFibGU7Ci0JaWYgKHByaXYtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpIHsKKwliYXNlID0gdHJhbnMtPnNocmQtPmRldmljZV9wb2ludGVycy5sb2dfZXZlbnRfdGFibGU7CisJaWYgKHRyYW5zLT5zaHJkLT51Y29kZV90eXBlID09IElXTF9VQ09ERV9JTklUKSB7CiAJCWlmICghYmFzZSkKIAkJCWJhc2UgPSBwcml2LT5pbml0X2V2dGxvZ19wdHI7CiAJfSBlbHNlIHsKQEAgLTgyMyw4ICs4MzgsOCBAQAogCXNpemVfdCBidWZzeiA9IDA7CiAJc3RydWN0IGl3bF9wcml2ICpwcml2ID0gcHJpdih0cmFucyk7CiAKLQliYXNlID0gcHJpdi0+ZGV2aWNlX3BvaW50ZXJzLmxvZ19ldmVudF90YWJsZTsKLQlpZiAocHJpdi0+dWNvZGVfdHlwZSA9PSBJV0xfVUNPREVfSU5JVCkgeworCWJhc2UgPSB0cmFucy0+c2hyZC0+ZGV2aWNlX3BvaW50ZXJzLmxvZ19ldmVudF90YWJsZTsKKwlpZiAodHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpIHsKIAkJbG9nc2l6ZSA9IHByaXYtPmluaXRfZXZ0bG9nX3NpemU7CiAJCWlmICghYmFzZSkKIAkJCWJhc2UgPSBwcml2LT5pbml0X2V2dGxvZ19wdHI7CkBAIC04MzgsNyArODUzLDcgQEAKIAkJSVdMX0VSUih0cmFucywKIAkJCSJJbnZhbGlkIGV2ZW50IGxvZyBwb2ludGVyIDB4JTA4WCBmb3IgJXMgdUNvZGVcbiIsCiAJCQliYXNlLAotCQkJKHByaXYtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpCisJCQkodHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPT0gSVdMX1VDT0RFX0lOSVQpCiAJCQkJCT8gIkluaXQiIDogIlJUIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTExMDgsNyArMTEyMyw3IEBACiAJCWlzcl9zdGF0cy0+dHgrKzsKIAkJaGFuZGxlZCB8PSBDU1JfSU5UX0JJVF9GSF9UWDsKIAkJLyogV2FrZSB1cCB1Q29kZSBsb2FkIHJvdXRpbmUsIG5vdyB0aGF0IGxvYWQgaXMgY29tcGxldGUgKi8KLQkJcHJpdih0cmFucyktPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMTsKKwkJdHJhbnMtPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMTsKIAkJd2FrZV91cCgmdHJhbnMtPnNocmQtPndhaXRfY29tbWFuZF9xdWV1ZSk7CiAJfQogCkBAIC0xMTM2LDcgKzExNTEsMTEgQEAKICAqIElDVCBmdW5jdGlvbnMKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2RlZmluZSBJQ1RfQ09VTlQgKFBBR0VfU0laRS9zaXplb2YodTMyKSkKKworLyogYSBkZXZpY2UgKFBDSS1FKSBwYWdlIGlzIDQwOTYgYnl0ZXMgbG9uZyAqLworI2RlZmluZSBJQ1RfU0hJRlQJMTIKKyNkZWZpbmUgSUNUX1NJWkUJKDEgPDwgSUNUX1NISUZUKQorI2RlZmluZSBJQ1RfQ09VTlQJKElDVF9TSVpFIC8gc2l6ZW9mKHUzMikpCiAKIC8qIEZyZWUgZHJhbSB0YWJsZSAqLwogdm9pZCBpd2xfZnJlZV9pc3JfaWN0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQpAQCAtMTE0NCwyMSArMTE2MywxOSBAQAogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9CiAJCUlXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKLQlpZiAodHJhbnNfcGNpZS0+aWN0X3RibF92aXIpIHsKLQkJZG1hX2ZyZWVfY29oZXJlbnQoYnVzKHRyYW5zKS0+ZGV2LAotCQkJCSAgKHNpemVvZih1MzIpICogSUNUX0NPVU5UKSArIFBBR0VfU0laRSwKLQkJCQkgIHRyYW5zX3BjaWUtPmljdF90YmxfdmlyLAorCWlmICh0cmFuc19wY2llLT5pY3RfdGJsKSB7CisJCWRtYV9mcmVlX2NvaGVyZW50KGJ1cyh0cmFucyktPmRldiwgSUNUX1NJWkUsCisJCQkJICB0cmFuc19wY2llLT5pY3RfdGJsLAogCQkJCSAgdHJhbnNfcGNpZS0+aWN0X3RibF9kbWEpOwotCQl0cmFuc19wY2llLT5pY3RfdGJsX3ZpciA9IE5VTEw7Ci0JCW1lbXNldCgmdHJhbnNfcGNpZS0+aWN0X3RibF9kbWEsIDAsCi0JCQlzaXplb2YodHJhbnNfcGNpZS0+aWN0X3RibF9kbWEpKTsKLQkJbWVtc2V0KCZ0cmFuc19wY2llLT5hbGlnbmVkX2ljdF90YmxfZG1hLCAwLAotCQkJc2l6ZW9mKHRyYW5zX3BjaWUtPmFsaWduZWRfaWN0X3RibF9kbWEpKTsKKwkJdHJhbnNfcGNpZS0+aWN0X3RibCA9IE5VTEw7CisJCXRyYW5zX3BjaWUtPmljdF90YmxfZG1hID0gMDsKIAl9CiB9CiAKIAotLyogYWxsb2NhdGUgZHJhbSBzaGFyZWQgdGFibGUgaXQgaXMgYSBQQUdFX1NJWkUgYWxpZ25lZAorLyoKKyAqIGFsbG9jYXRlIGRyYW0gc2hhcmVkIHRhYmxlLCBpdCBpcyBhbiBhbGlnbmVkIG1lbW9yeQorICogYmxvY2sgb2YgSUNUX1NJWkUuCiAgKiBhbHNvIHJlc2V0IGFsbCBkYXRhIHJlbGF0ZWQgdG8gSUNUIHRhYmxlIGludGVycnVwdC4KICAqLwogaW50IGl3bF9hbGxvY19pc3JfaWN0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQpAQCAtMTE2NiwzNiArMTE4MywyNiBAQAogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9CiAJCUlXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKLQkvKiBhbGxvY2F0ZSBzaHJhcmVkIGRhdGEgdGFibGUgKi8KLQl0cmFuc19wY2llLT5pY3RfdGJsX3ZpciA9Ci0JCWRtYV9hbGxvY19jb2hlcmVudChidXModHJhbnMpLT5kZXYsCi0JCQkJICAgKHNpemVvZih1MzIpICogSUNUX0NPVU5UKSArIFBBR0VfU0laRSwKLQkJCQkgICAmdHJhbnNfcGNpZS0+aWN0X3RibF9kbWEsIEdGUF9LRVJORUwpOwotCWlmICghdHJhbnNfcGNpZS0+aWN0X3RibF92aXIpCisJdHJhbnNfcGNpZS0+aWN0X3RibCA9CisJCWRtYV9hbGxvY19jb2hlcmVudChidXModHJhbnMpLT5kZXYsIElDVF9TSVpFLAorCQkJCSAgICZ0cmFuc19wY2llLT5pY3RfdGJsX2RtYSwKKwkJCQkgICBHRlBfS0VSTkVMKTsKKwlpZiAoIXRyYW5zX3BjaWUtPmljdF90YmwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JLyogYWxpZ24gdGFibGUgdG8gUEFHRV9TSVpFIGJvdW5kYXJ5ICovCi0JdHJhbnNfcGNpZS0+YWxpZ25lZF9pY3RfdGJsX2RtYSA9Ci0JCUFMSUdOKHRyYW5zX3BjaWUtPmljdF90YmxfZG1hLCBQQUdFX1NJWkUpOworCS8qIGp1c3QgYW4gQVBJIHNhbml0eSBjaGVjayAuLi4gaXQgaXMgZ3VhcmFudGVlZCB0byBiZSBhbGlnbmVkICovCisJaWYgKFdBUk5fT04odHJhbnNfcGNpZS0+aWN0X3RibF9kbWEgJiAoSUNUX1NJWkUgLSAxKSkpIHsKKwkJaXdsX2ZyZWVfaXNyX2ljdCh0cmFucyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAotCUlXTF9ERUJVR19JU1IodHJhbnMsICJpY3QgZG1hIGFkZHIgJUx4IGRtYSBhbGlnbmVkICVMeCBkaWZmICVkXG4iLAotCQkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0cmFuc19wY2llLT5pY3RfdGJsX2RtYSwKLQkJCSAgICh1bnNpZ25lZCBsb25nIGxvbmcpdHJhbnNfcGNpZS0+YWxpZ25lZF9pY3RfdGJsX2RtYSwKLQkJCSAgIChpbnQpKHRyYW5zX3BjaWUtPmFsaWduZWRfaWN0X3RibF9kbWEgLQotCQkJICAgdHJhbnNfcGNpZS0+aWN0X3RibF9kbWEpKTsKKwlJV0xfREVCVUdfSVNSKHRyYW5zLCAiaWN0IGRtYSBhZGRyICVMeFxuIiwKKwkJICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl0cmFuc19wY2llLT5pY3RfdGJsX2RtYSk7CiAKLQl0cmFuc19wY2llLT5pY3RfdGJsID0gIHRyYW5zX3BjaWUtPmljdF90YmxfdmlyICsKLQkJCSAgKHRyYW5zX3BjaWUtPmFsaWduZWRfaWN0X3RibF9kbWEgLQotCQkJICB0cmFuc19wY2llLT5pY3RfdGJsX2RtYSk7Ci0KLQlJV0xfREVCVUdfSVNSKHRyYW5zLCAiaWN0IHZpciBhZGRyICVwIHZpciBhbGlnbmVkICVwIGRpZmYgJWRcbiIsCi0JCQkgICAgIHRyYW5zX3BjaWUtPmljdF90YmwsIHRyYW5zX3BjaWUtPmljdF90YmxfdmlyLAotCQkJKGludCkodHJhbnNfcGNpZS0+YWxpZ25lZF9pY3RfdGJsX2RtYSAtCi0JCQkgICAgdHJhbnNfcGNpZS0+aWN0X3RibF9kbWEpKTsKKwlJV0xfREVCVUdfSVNSKHRyYW5zLCAiaWN0IHZpciBhZGRyICVwXG4iLCB0cmFuc19wY2llLT5pY3RfdGJsKTsKIAogCS8qIHJlc2V0IHRhYmxlIGFuZCBpbmRleCB0byBhbGwgMCAqLwotCW1lbXNldCh0cmFuc19wY2llLT5pY3RfdGJsX3ZpciwgMCwKLQkJKHNpemVvZih1MzIpICogSUNUX0NPVU5UKSArIFBBR0VfU0laRSk7CisJbWVtc2V0KHRyYW5zX3BjaWUtPmljdF90YmwsIDAsIElDVF9TSVpFKTsKIAl0cmFuc19wY2llLT5pY3RfaW5kZXggPSAwOwogCiAJLyogYWRkIHBlcmlvZGljIFJYIGludGVycnVwdCAqLwpAQCAtMTIxMywyMyArMTIyMCwyMCBAQAogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9CiAJCUlXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7CiAKLQlpZiAoIXRyYW5zX3BjaWUtPmljdF90YmxfdmlyKQorCWlmICghdHJhbnNfcGNpZS0+aWN0X3RibCkKIAkJcmV0dXJuIDA7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdHJhbnMtPnNocmQtPmxvY2ssIGZsYWdzKTsKIAlpd2xfZGlzYWJsZV9pbnRlcnJ1cHRzKHRyYW5zKTsKIAotCW1lbXNldCgmdHJhbnNfcGNpZS0+aWN0X3RibFswXSwgMCwgc2l6ZW9mKHUzMikgKiBJQ1RfQ09VTlQpOworCW1lbXNldCh0cmFuc19wY2llLT5pY3RfdGJsLCAwLCBJQ1RfU0laRSk7CiAKLQl2YWwgPSB0cmFuc19wY2llLT5hbGlnbmVkX2ljdF90YmxfZG1hID4+IFBBR0VfU0hJRlQ7CisJdmFsID0gdHJhbnNfcGNpZS0+aWN0X3RibF9kbWEgPj4gSUNUX1NISUZUOwogCiAJdmFsIHw9IENTUl9EUkFNX0lOVF9UQkxfRU5BQkxFOwogCXZhbCB8PSBDU1JfRFJBTV9JTklUX1RCTF9XUkFQX0NIRUNLOwogCi0JSVdMX0RFQlVHX0lTUih0cmFucywgIkNTUl9EUkFNX0lOVF9UQkxfUkVHID0weCVYICIKLQkJCSJhbGlnbmVkIGRtYSBhZGRyZXNzICVMeFxuIiwKLQkJCXZhbCwKLQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpdHJhbnNfcGNpZS0+YWxpZ25lZF9pY3RfdGJsX2RtYSk7CisJSVdMX0RFQlVHX0lTUih0cmFucywgIkNTUl9EUkFNX0lOVF9UQkxfUkVHID0weCV4XG4iLCB2YWwpOwogCiAJaXdsX3dyaXRlMzIoYnVzKHRyYW5zKSwgQ1NSX0RSQU1fSU5UX1RCTF9SRUcsIHZhbCk7CiAJdHJhbnNfcGNpZS0+dXNlX2ljdCA9IHRydWU7CkBAIC0xMjY2LDYgKzEyNzAsOCBAQAogCWlmICghdHJhbnMpCiAJCXJldHVybiBJUlFfTk9ORTsKIAorCXRyYWNlX2l3bHdpZmlfZGV2X2lycShwcml2KHRyYW5zKSk7CisKIAl0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmFucy0+c2hyZC0+bG9jaywgZmxhZ3MpOwpAQCAtMTM0MCw2ICsxMzQ2LDcgQEAKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWU7CiAJdTMyIGludGEsIGludGFfbWFzazsKIAl1MzIgdmFsID0gMDsKKwl1MzIgcmVhZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaWYgKCF0cmFucykKQEAgLTEzNTMsNiArMTM2MCw4IEBACiAJaWYgKCF0cmFuc19wY2llLT51c2VfaWN0KQogCQlyZXR1cm4gaXdsX2lzcihpcnEsIGRhdGEpOwogCisJdHJhY2VfaXdsd2lmaV9kZXZfaXJxKHByaXYodHJhbnMpKTsKKwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmFucy0+c2hyZC0+bG9jaywgZmxhZ3MpOwogCiAJLyogRGlzYWJsZSAoYnV0IGRvbid0IGNsZWFyISkgaW50ZXJydXB0cyBoZXJlIHRvIGF2b2lkCkBAIC0xMzY3LDI0ICsxMzc2LDI5IEBACiAJLyogSWdub3JlIGludGVycnVwdCBpZiB0aGVyZSdzIG5vdGhpbmcgaW4gTklDIHRvIHNlcnZpY2UuCiAJICogVGhpcyBtYXkgYmUgZHVlIHRvIElSUSBzaGFyZWQgd2l0aCBhbm90aGVyIGRldmljZSwKIAkgKiBvciBkdWUgdG8gc3BvcmFkaWMgaW50ZXJydXB0cyB0aHJvd24gZnJvbSBvdXIgTklDLiAqLwotCWlmICghdHJhbnNfcGNpZS0+aWN0X3RibFt0cmFuc19wY2llLT5pY3RfaW5kZXhdKSB7CisJcmVhZCA9IGxlMzJfdG9fY3B1KHRyYW5zX3BjaWUtPmljdF90YmxbdHJhbnNfcGNpZS0+aWN0X2luZGV4XSk7CisJdHJhY2VfaXdsd2lmaV9kZXZfaWN0X3JlYWQocHJpdih0cmFucyksIHRyYW5zX3BjaWUtPmljdF9pbmRleCwgcmVhZCk7CisJaWYgKCFyZWFkKSB7CiAJCUlXTF9ERUJVR19JU1IodHJhbnMsICJJZ25vcmUgaW50ZXJydXB0LCBpbnRhID09IDBcbiIpOwogCQlnb3RvIG5vbmU7CiAJfQogCi0JLyogcmVhZCBhbGwgZW50cmllcyB0aGF0IG5vdCAwIHN0YXJ0IHdpdGggaWN0X2luZGV4ICovCi0Jd2hpbGUgKHRyYW5zX3BjaWUtPmljdF90YmxbdHJhbnNfcGNpZS0+aWN0X2luZGV4XSkgewotCi0JCXZhbCB8PSBsZTMyX3RvX2NwdSh0cmFuc19wY2llLT5pY3RfdGJsW3RyYW5zX3BjaWUtPmljdF9pbmRleF0pOworCS8qCisJICogQ29sbGVjdCBhbGwgZW50cmllcyB1cCB0byB0aGUgZmlyc3QgMCwgc3RhcnRpbmcgZnJvbSBpY3RfaW5kZXg7CisJICogbm90ZSB3ZSBhbHJlYWR5IHJlYWQgYXQgaWN0X2luZGV4LgorCSAqLworCWRvIHsKKwkJdmFsIHw9IHJlYWQ7CiAJCUlXTF9ERUJVR19JU1IodHJhbnMsICJJQ1QgaW5kZXggJWQgdmFsdWUgMHglMDhYXG4iLAotCQkJCXRyYW5zX3BjaWUtPmljdF9pbmRleCwKLQkJCQlsZTMyX3RvX2NwdSgKLQkJCQkgIHRyYW5zX3BjaWUtPmljdF90YmxbdHJhbnNfcGNpZS0+aWN0X2luZGV4XSkpOworCQkJCXRyYW5zX3BjaWUtPmljdF9pbmRleCwgcmVhZCk7CiAJCXRyYW5zX3BjaWUtPmljdF90YmxbdHJhbnNfcGNpZS0+aWN0X2luZGV4XSA9IDA7CiAJCXRyYW5zX3BjaWUtPmljdF9pbmRleCA9CiAJCQlpd2xfcXVldWVfaW5jX3dyYXAodHJhbnNfcGNpZS0+aWN0X2luZGV4LCBJQ1RfQ09VTlQpOwogCi0JfQorCQlyZWFkID0gbGUzMl90b19jcHUodHJhbnNfcGNpZS0+aWN0X3RibFt0cmFuc19wY2llLT5pY3RfaW5kZXhdKTsKKwkJdHJhY2VfaXdsd2lmaV9kZXZfaWN0X3JlYWQocHJpdih0cmFucyksIHRyYW5zX3BjaWUtPmljdF9pbmRleCwKKwkJCQkJICAgcmVhZCk7CisJfSB3aGlsZSAocmVhZCk7CiAKIAkvKiBXZSBzaG91bGQgbm90IGdldCB0aGlzIHZhbHVlLCBqdXN0IGlnbm9yZSBpdC4gKi8KIAlpZiAodmFsID09IDB4ZmZmZmZmZmYpCkBAIC0xNDExLDcgKzE0MjUsNyBAQAogCWlmIChsaWtlbHkoaW50YSkpCiAJCXRhc2tsZXRfc2NoZWR1bGUoJnRyYW5zX3BjaWUtPmlycV90YXNrbGV0KTsKIAllbHNlIGlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZ0cmFucy0+c2hyZC0+c3RhdHVzKSAmJgotCQkJIXRyYW5zX3BjaWUtPmludGEpIHsKKwkJICF0cmFuc19wY2llLT5pbnRhKSB7CiAJCS8qIEFsbG93IGludGVycnVwdCBpZiB3YXMgZGlzYWJsZWQgYnkgdGhpcyBoYW5kbGVyIGFuZAogCQkgKiBubyB0YXNrbGV0IHdhcyBzY2hlZHVsZXMsIFdlIHNob3VsZCBub3QgZW5hYmxlIGludGVycnVwdCwKIAkJICogdGFza2xldCB3aWxsIGVuYWJsZSBpdC4KQEAgLTE0MjcsNyArMTQ0MSw3IEBACiAJICogb25seSBSZS1lbmFibGUgaWYgZGlzYWJsZWQgYnkgaXJxLgogCSAqLwogCWlmICh0ZXN0X2JpdChTVEFUVVNfSU5UX0VOQUJMRUQsICZ0cmFucy0+c2hyZC0+c3RhdHVzKSAmJgotCQkhdHJhbnNfcGNpZS0+aW50YSkKKwkgICAgIXRyYW5zX3BjaWUtPmludGEpCiAJCWl3bF9lbmFibGVfaW50ZXJydXB0cyh0cmFucyk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFucy0+c2hyZC0+bG9jaywgZmxhZ3MpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS10eC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS10eC5jCmluZGV4IDRhMGM5NTMuLmJkMjk1NjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUtdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLXR4LmMKQEAgLTQwOCw2ICs0MDgsNyBAQAogdm9pZCBpd2xfdHJhbnNfc2V0X3dyX3B0cnMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCiAJCQkJaW50IHR4cV9pZCwgdTMyIGluZGV4KQogeworCUlXTF9ERUJVR19UWF9RVUVVRVModHJhbnMsICJRICVkICBXclB0cjogJWQiLCB0eHFfaWQsIGluZGV4ICYgMHhmZik7CiAJaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cyh0cmFucyksIEhCVVNfVEFSR19XUlBUUiwKIAkJCShpbmRleCAmIDB4ZmYpIHwgKHR4cV9pZCA8PCA4KSk7CiAJaXdsX3dyaXRlX3BycGgoYnVzKHRyYW5zKSwgU0NEX1FVRVVFX1JEUFRSKHR4cV9pZCksIGluZGV4KTsKQEAgLTQzMCw3ICs0MzEsNyBAQAogCiAJdHhxLT5zY2hlZF9yZXRyeSA9IHNjZF9yZXRyeTsKIAotCUlXTF9ERUJVR19JTkZPKHRyYW5zLCAiJXMgJXMgUXVldWUgJWQgb24gRklGTyAlZFxuIiwKKwlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiJXMgJXMgUXVldWUgJWQgb24gRklGTyAlZFxuIiwKIAkJICAgICAgIGFjdGl2ZSA/ICJBY3RpdmF0ZSIgOiAiRGVhY3RpdmF0ZSIsCiAJCSAgICAgICBzY2RfcmV0cnkgPyAiQkEiIDogIkFDL0NNRCIsIHR4cV9pZCwgdHhfZmlmb19pZCk7CiB9CkBAIC00NDYsMTQgKzQ0NywyMSBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfYWdnX3R4cWlkX3ZhbGlkKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgdHhxX2lkKQoreworCWlmICh0eHFfaWQgPCBJV0xBR05fRklSU1RfQU1QRFVfUVVFVUUpCisJCXJldHVybiBmYWxzZTsKKwlyZXR1cm4gdHhxX2lkIDwgKElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSArCisJCWh3X3BhcmFtcyh0cmFucykubnVtX2FtcGR1X3F1ZXVlcyk7Cit9CisKIHZvaWQgaXdsX3RyYW5zX3BjaWVfdHhfYWdnX3NldHVwKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAogCQkJCSBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LCBpbnQgc3RhX2lkLAotCQkJCSBpbnQgdGlkLCBpbnQgZnJhbWVfbGltaXQpCisJCQkJIGludCB0aWQsIGludCBmcmFtZV9saW1pdCwgdTE2IHNzbikKIHsKLQlpbnQgdHhfZmlmbywgdHhxX2lkLCBzc25faWR4OworCWludCB0eF9maWZvLCB0eHFfaWQ7CiAJdTE2IHJhX3RpZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhOwogCiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0KIAkJSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKQEAgLTQ2OSwxMSArNDc3LDE1IEBACiAJCXJldHVybjsKIAl9CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmdHJhbnMtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7Ci0JdGlkX2RhdGEgPSAmdHJhbnMtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXTsKLQlzc25faWR4ID0gU0VRX1RPX1NOKHRpZF9kYXRhLT5zZXFfbnVtYmVyKTsKLQl0eHFfaWQgPSB0aWRfZGF0YS0+YWdnLnR4cV9pZDsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFucy0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKKwl0eHFfaWQgPSB0cmFuc19wY2llLT5hZ2dfdHhxW3N0YV9pZF1bdGlkXTsKKwlpZiAoV0FSTl9PTl9PTkNFKGlzX2FnZ190eHFpZF92YWxpZCh0cmFucywgdHhxX2lkKSA9PSBmYWxzZSkpIHsKKwkJSVdMX0VSUih0cmFucywKKwkJCSJxdWV1ZSBudW1iZXIgb3V0IG9mIHJhbmdlOiAlZCwgbXVzdCBiZSAlZCB0byAlZFxuIiwKKwkJCXR4cV9pZCwgSVdMQUdOX0ZJUlNUX0FNUERVX1FVRVVFLAorCQkJSVdMQUdOX0ZJUlNUX0FNUERVX1FVRVVFICsKKwkJCWh3X3BhcmFtcyh0cmFucykubnVtX2FtcGR1X3F1ZXVlcyAtIDEpOworCQlyZXR1cm47CisJfQogCiAJcmFfdGlkID0gQlVJTERfUkF4VElEKHN0YV9pZCwgdGlkKTsKIApAQCAtNDkzLDkgKzUwNSw5IEBACiAKIAkvKiBQbGFjZSBmaXJzdCBURkQgYXQgaW5kZXggY29ycmVzcG9uZGluZyB0byBzdGFydCBzZXF1ZW5jZSBudW1iZXIuCiAJICogQXNzdW1lcyB0aGF0IHNzbl9pZHggaXMgdmFsaWQgKCE9IDB4RkZGKSAqLwotCXRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHIgPSAoc3NuX2lkeCAmIDB4ZmYpOwotCXRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLnEud3JpdGVfcHRyID0gKHNzbl9pZHggJiAweGZmKTsKLQlpd2xfdHJhbnNfc2V0X3dyX3B0cnModHJhbnMsIHR4cV9pZCwgc3NuX2lkeCk7CisJdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0ucS5yZWFkX3B0ciA9IChzc24gJiAweGZmKTsKKwl0cmFuc19wY2llLT50eHFbdHhxX2lkXS5xLndyaXRlX3B0ciA9IChzc24gJiAweGZmKTsKKwlpd2xfdHJhbnNfc2V0X3dyX3B0cnModHJhbnMsIHR4cV9pZCwgc3NuKTsKIAogCS8qIFNldCB1cCBUeCB3aW5kb3cgc2l6ZSBhbmQgZnJhbWUgbGltaXQgZm9yIHRoaXMgcXVldWUgKi8KIAlpd2xfd3JpdGVfdGFyZ19tZW0oYnVzKHRyYW5zKSwgdHJhbnNfcGNpZS0+c2NkX2Jhc2VfYWRkciArCkBAIC01MzksMTIgKzU1MSw5IEBACiB9CiAKIGludCBpd2xfdHJhbnNfcGNpZV90eF9hZ2dfYWxsb2Moc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkJZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwgaW50IHN0YV9pZCwKLQkJCQlpbnQgdGlkLCB1MTYgKnNzbikKKwkJCQlpbnQgc3RhX2lkLCBpbnQgdGlkKQogewogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7Ci0Jc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgdHhxX2lkOwogCiAJdHhxX2lkID0gaXdsYWduX3R4cV9jdHhfYWN0aXZhdGVfZnJlZSh0cmFucyk7CkBAIC01NTMsMzQgKzU2MiwzMSBAQAogCQlyZXR1cm4gLUVOWElPOwogCX0KIAotCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmFucy0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKLQl0aWRfZGF0YSA9ICZ0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdOwotCSpzc24gPSBTRVFfVE9fU04odGlkX2RhdGEtPnNlcV9udW1iZXIpOwotCXRpZF9kYXRhLT5hZ2cudHhxX2lkID0gdHhxX2lkOworCXRyYW5zX3BjaWUtPmFnZ190eHFbc3RhX2lkXVt0aWRdID0gdHhxX2lkOwogCWl3bF9zZXRfc3dxX2lkKCZ0cmFuc19wY2llLT50eHFbdHhxX2lkXSwgZ2V0X2FjX2Zyb21fdGlkKHRpZCksIHR4cV9pZCk7CiAKLQl0aWRfZGF0YSA9ICZ0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdOwotCWlmICh0aWRfZGF0YS0+dGZkc19pbl9xdWV1ZSA9PSAwKSB7Ci0JCUlXTF9ERUJVR19IVCh0cmFucywgIkhXIHF1ZXVlIGlzIGVtcHR5XG4iKTsKLQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfT047Ci0JCWl3bF9zdGFydF90eF9iYV90cmFuc19yZWFkeShwcml2KHRyYW5zKSwgY3R4LCBzdGFfaWQsIHRpZCk7Ci0JfSBlbHNlIHsKLQkJSVdMX0RFQlVHX0hUKHRyYW5zLCAiSFcgcXVldWUgaXMgTk9UIGVtcHR5OiAlZCBwYWNrZXRzIGluIEhXIgotCQkJICAgICAicXVldWVcbiIsIHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlKTsKLQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJhbnMtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7Ci0KIAlyZXR1cm4gMDsKIH0KIAotdm9pZCBpd2xfdHJhbnNfcGNpZV90eHFfYWdnX2Rpc2FibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHFfaWQpCitpbnQgaXdsX3RyYW5zX3BjaWVfdHhfYWdnX2Rpc2FibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBzdGFfaWQsIGludCB0aWQpCiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKKwl1OCB0eHFfaWQgPSB0cmFuc19wY2llLT5hZ2dfdHhxW3N0YV9pZF1bdGlkXTsKKworCWlmIChXQVJOX09OX09OQ0UoaXNfYWdnX3R4cWlkX3ZhbGlkKHRyYW5zLCB0eHFfaWQpID09IGZhbHNlKSkgeworCQlJV0xfRVJSKHRyYW5zLAorCQkJInF1ZXVlIG51bWJlciBvdXQgb2YgcmFuZ2U6ICVkLCBtdXN0IGJlICVkIHRvICVkXG4iLAorCQkJdHhxX2lkLCBJV0xBR05fRklSU1RfQU1QRFVfUVVFVUUsCisJCQlJV0xBR05fRklSU1RfQU1QRFVfUVVFVUUgKworCQkJaHdfcGFyYW1zKHRyYW5zKS5udW1fYW1wZHVfcXVldWVzIC0gMSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWl3bGFnbl90eF9xdWV1ZV9zdG9wX3NjaGVkdWxlcih0cmFucywgdHhxX2lkKTsKIAogCWl3bF9jbGVhcl9iaXRzX3BycGgoYnVzKHRyYW5zKSwgU0NEX0FHR1JfU0VMLCAoMSA8PCB0eHFfaWQpKTsKIAorCXRyYW5zX3BjaWUtPmFnZ190eHFbc3RhX2lkXVt0aWRdID0gMDsKIAl0cmFuc19wY2llLT50eHFbdHhxX2lkXS5xLnJlYWRfcHRyID0gMDsKIAl0cmFuc19wY2llLT50eHFbdHhxX2lkXS5xLndyaXRlX3B0ciA9IDA7CiAJLyogc3VwcG9zZXMgdGhhdCBzc25faWR4IGlzIHZhbGlkICghPSAweEZGRikgKi8KQEAgLTU4OSw4MSArNTk1LDYgQEAKIAlpd2xfY2xlYXJfYml0c19wcnBoKGJ1cyh0cmFucyksIFNDRF9JTlRFUlJVUFRfTUFTSywgKDEgPDwgdHhxX2lkKSk7CiAJaXdsX3R4cV9jdHhfZGVhY3RpdmF0ZSh0cmFuc19wY2llLCB0eHFfaWQpOwogCWl3bF90cmFuc190eF9xdWV1ZV9zZXRfc3RhdHVzKHRyYW5zLCAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0sIDAsIDApOwotfQotCi1pbnQgaXdsX3RyYW5zX3BjaWVfdHhfYWdnX2Rpc2FibGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkJICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LCBpbnQgc3RhX2lkLAotCQkJCSAgaW50IHRpZCkKLXsKLQlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IHJlYWRfcHRyLCB3cml0ZV9wdHI7Ci0Jc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGE7Ci0JaW50IHR4cV9pZDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZ0cmFucy0+c2hyZC0+c3RhX2xvY2ssIGZsYWdzKTsKLQotCXRpZF9kYXRhID0gJnRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF07Ci0JdHhxX2lkID0gdGlkX2RhdGEtPmFnZy50eHFfaWQ7Ci0KLQlpZiAoKElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSA+IHR4cV9pZCkgfHwKLQkgICAgKElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSArCi0JCWh3X3BhcmFtcyh0cmFucykubnVtX2FtcGR1X3F1ZXVlcyA8PSB0eHFfaWQpKSB7Ci0JCUlXTF9FUlIodHJhbnMsCi0JCQkicXVldWUgbnVtYmVyIG91dCBvZiByYW5nZTogJWQsIG11c3QgYmUgJWQgdG8gJWRcbiIsCi0JCQl0eHFfaWQsIElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSwKLQkJCUlXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSArCi0JCQlod19wYXJhbXModHJhbnMpLm51bV9hbXBkdV9xdWV1ZXMgLSAxKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHJhbnMtPnNocmQtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAodHJhbnMtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS5hZ2cuc3RhdGUpIHsKLQljYXNlIElXTF9FTVBUWUlOR19IV19RVUVVRV9BRERCQToKLQkJLyoKLQkJKiBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHBlZXIgc3RvcHMgYWdncmVnYXRpb24KLQkJKiBhZ2FpbiBiZWZvcmUgd2UndmUgaGFkIGEgY2hhbmNlIHRvIGRyYWluIHRoZQotCQkqIHF1ZXVlIHdlIHNlbGVjdGVkIHByZXZpb3VzbHksIGkuZS4gYmVmb3JlIHRoZQotCQkqIHNlc3Npb24gd2FzIHJlYWxseSBzdGFydGVkIGNvbXBsZXRlbHkuCi0JCSovCi0JCUlXTF9ERUJVR19IVCh0cmFucywgIkFHRyBzdG9wIGJlZm9yZSBzZXR1cCBkb25lXG4iKTsKLQkJZ290byB0dXJuX29mZjsKLQljYXNlIElXTF9BR0dfT046Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCUlXTF9XQVJOKHRyYW5zLCAiU3RvcHBpbmcgQUdHIHdoaWxlIHN0YXRlIG5vdCBPTiAiCi0JCQkgIm9yIHN0YXJ0aW5nIGZvciAlZCBvbiAlZCAoJWQpXG4iLCBzdGFfaWQsIHRpZCwKLQkJCSB0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZy5zdGF0ZSk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyYW5zLT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQl3cml0ZV9wdHIgPSB0cmFuc19wY2llLT50eHFbdHhxX2lkXS5xLndyaXRlX3B0cjsKLQlyZWFkX3B0ciA9IHRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLnEucmVhZF9wdHI7Ci0KLQkvKiBUaGUgcXVldWUgaXMgbm90IGVtcHR5ICovCi0JaWYgKHdyaXRlX3B0ciAhPSByZWFkX3B0cikgewotCQlJV0xfREVCVUdfSFQodHJhbnMsICJTdG9wcGluZyBhIG5vbiBlbXB0eSBBR0cgSFcgUVVFVUVcbiIpOwotCQl0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZy5zdGF0ZSA9Ci0JCQlJV0xfRU1QVFlJTkdfSFdfUVVFVUVfREVMQkE7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRyYW5zLT5zaHJkLT5zdGFfbG9jaywgZmxhZ3MpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlJV0xfREVCVUdfSFQodHJhbnMsICJIVyBxdWV1ZSBpcyBlbXB0eVxuIik7Ci10dXJuX29mZjoKLQl0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZy5zdGF0ZSA9IElXTF9BR0dfT0ZGOwotCi0JLyogZG8gbm90IHJlc3RvcmUvc2F2ZSBpcnFzICovCi0Jc3Bpbl91bmxvY2soJnRyYW5zLT5zaHJkLT5zdGFfbG9jayk7Ci0Jc3Bpbl9sb2NrKCZ0cmFucy0+c2hyZC0+bG9jayk7Ci0KLQlpd2xfdHJhbnNfcGNpZV90eHFfYWdnX2Rpc2FibGUodHJhbnMsIHR4cV9pZCk7Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0cmFucy0+c2hyZC0+bG9jaywgZmxhZ3MpOwotCi0JaXdsX3N0b3BfdHhfYmFfdHJhbnNfcmVhZHkocHJpdih0cmFucyksIGN0eCwgc3RhX2lkLCB0aWQpOwotCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk4Miw3ICs5MTMsOCBAQAogCiAJcmV0ID0gaXdsX2VucXVldWVfaGNtZCh0cmFucywgY21kKTsKIAlpZiAocmV0IDwgMCkgewotCQlJV0xfRVJSKHRyYW5zLCAiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCisJCUlXTF9ERUJVR19RVUlFVF9SRktJTEwodHJhbnMsCisJCQkiRXJyb3Igc2VuZGluZyAlczogZW5xdWV1ZV9oY21kIGZhaWxlZDogJWRcbiIsCiAJCQkgIGdldF9jbWRfc3RyaW5nKGNtZC0+aWQpLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KQEAgLTEwMDAsNiArOTMyLDIwIEBACiAJSVdMX0RFQlVHX0lORk8odHJhbnMsICJBdHRlbXB0aW5nIHRvIHNlbmQgc3luYyBjb21tYW5kICVzXG4iLAogCQkJZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwogCisJaWYgKHRlc3RfYml0KFNUQVRVU19FWElUX1BFTkRJTkcsICZ0cmFucy0+c2hyZC0+c3RhdHVzKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCisJaWYgKHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmdHJhbnMtPnNocmQtPnN0YXR1cykpIHsKKwkJSVdMX0VSUih0cmFucywgIkNvbW1hbmQgJXMgYWJvcnRlZDogUkYgS0lMTCBTd2l0Y2hcbiIsCisJCQkgICAgICAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOworCQlyZXR1cm4gLUVDQU5DRUxFRDsKKwl9CisJaWYgKHRlc3RfYml0KFNUQVRVU19GV19FUlJPUiwgJnRyYW5zLT5zaHJkLT5zdGF0dXMpKSB7CisJCUlXTF9FUlIodHJhbnMsICJDb21tYW5kICVzIGZhaWxlZDogRlcgRXJyb3JcbiIsCisJCQkgICAgICAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOworCQlyZXR1cm4gLUVJTzsKKwl9CiAJc2V0X2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZ0cmFucy0+c2hyZC0+c3RhdHVzKTsKIAlJV0xfREVCVUdfSU5GTyh0cmFucywgIlNldHRpbmcgSENNRF9BQ1RJVkUgZm9yIGNvbW1hbmQgJXNcbiIsCiAJCQlnZXRfY21kX3N0cmluZyhjbWQtPmlkKSk7CkBAIC0xMDA4LDcgKzk1NCw4IEBACiAJaWYgKGNtZF9pZHggPCAwKSB7CiAJCXJldCA9IGNtZF9pZHg7CiAJCWNsZWFyX2JpdChTVEFUVVNfSENNRF9BQ1RJVkUsICZ0cmFucy0+c2hyZC0+c3RhdHVzKTsKLQkJSVdMX0VSUih0cmFucywgIkVycm9yIHNlbmRpbmcgJXM6IGVucXVldWVfaGNtZCBmYWlsZWQ6ICVkXG4iLAorCQlJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHRyYW5zLAorCQkJIkVycm9yIHNlbmRpbmcgJXM6IGVucXVldWVfaGNtZCBmYWlsZWQ6ICVkXG4iLAogCQkJICBnZXRfY21kX3N0cmluZyhjbWQtPmlkKSwgcmV0KTsKIAkJcmV0dXJuIHJldDsKIAl9CkBAIC0xMDIyLDEyICs5NjksMTIgQEAKIAkJCQkmdHJhbnNfcGNpZS0+dHhxW3RyYW5zLT5zaHJkLT5jbWRfcXVldWVdOwogCQkJc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0eHEtPnE7CiAKLQkJCUlXTF9FUlIodHJhbnMsCisJCQlJV0xfREVCVUdfUVVJRVRfUkZLSUxMKHRyYW5zLAogCQkJCSJFcnJvciBzZW5kaW5nICVzOiB0aW1lIG91dCBhZnRlciAlZG1zLlxuIiwKIAkJCQlnZXRfY21kX3N0cmluZyhjbWQtPmlkKSwKIAkJCQlqaWZmaWVzX3RvX21zZWNzKEhPU1RfQ09NUExFVEVfVElNRU9VVCkpOwogCi0JCQlJV0xfRVJSKHRyYW5zLAorCQkJSVdMX0RFQlVHX1FVSUVUX1JGS0lMTCh0cmFucywKIAkJCQkiQ3VycmVudCBDTUQgcXVldWUgcmVhZF9wdHIgJWQgd3JpdGVfcHRyICVkXG4iLAogCQkJCXEtPnJlYWRfcHRyLCBxLT53cml0ZV9wdHIpOwogCkBAIC0xMDM5LDE4ICs5ODYsNiBAQAogCQl9CiAJfQogCi0JaWYgKHRlc3RfYml0KFNUQVRVU19SRl9LSUxMX0hXLCAmdHJhbnMtPnNocmQtPnN0YXR1cykpIHsKLQkJSVdMX0VSUih0cmFucywgIkNvbW1hbmQgJXMgYWJvcnRlZDogUkYgS0lMTCBTd2l0Y2hcbiIsCi0JCQkgICAgICAgZ2V0X2NtZF9zdHJpbmcoY21kLT5pZCkpOwotCQlyZXQgPSAtRUNBTkNFTEVEOwotCQlnb3RvIGZhaWw7Ci0JfQotCWlmICh0ZXN0X2JpdChTVEFUVVNfRldfRVJST1IsICZ0cmFucy0+c2hyZC0+c3RhdHVzKSkgewotCQlJV0xfRVJSKHRyYW5zLCAiQ29tbWFuZCAlcyBmYWlsZWQ6IEZXIEVycm9yXG4iLAotCQkJICAgICAgIGdldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKLQkJcmV0ID0gLUVJTzsKLQkJZ290byBmYWlsOwotCX0KIAlpZiAoKGNtZC0+ZmxhZ3MgJiBDTURfV0FOVF9TS0IpICYmICFjbWQtPnJlcGx5X3BhZ2UpIHsKIAkJSVdMX0VSUih0cmFucywgIkVycm9yOiBSZXNwb25zZSBOVUxMIGluICclcydcbiIsCiAJCQkgIGdldF9jbWRfc3RyaW5nKGNtZC0+aWQpKTsKQEAgLTEwNzEsNyArMTAwNiw3IEBACiAJCXRyYW5zX3BjaWUtPnR4cVt0cmFucy0+c2hyZC0+Y21kX3F1ZXVlXS5tZXRhW2NtZF9pZHhdLmZsYWdzICY9CiAJCQkJCQkJfkNNRF9XQU5UX1NLQjsKIAl9Ci1mYWlsOgorCiAJaWYgKGNtZC0+cmVwbHlfcGFnZSkgewogCQlpd2xfZnJlZV9wYWdlcyh0cmFucy0+c2hyZCwgY21kLT5yZXBseV9wYWdlKTsKIAkJY21kLT5yZXBseV9wYWdlID0gMDsKQEAgLTExMTUsOSArMTA1MCw2IEBACiAJCXJldHVybiAwOwogCX0KIAotCUlXTF9ERUJVR19UWF9SRVBMWSh0cmFucywgInJlY2xhaW06IFslZCwgJWQsICVkXVxuIiwgdHhxX2lkLAotCQkJICAgcS0+cmVhZF9wdHIsIGluZGV4KTsKLQogCWlmIChXQVJOX09OKCFza2JfcXVldWVfZW1wdHkoc2ticykpKQogCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMtcGNpZS5jCmluZGV4IGNlOTE4OTguLjY3ZDZlMzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLXBjaWUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy1wY2llLmMKQEAgLTg4LDE4ICs4OCwxNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCS8qIEFsbG9jYXRlIHRoZSBjaXJjdWxhciBidWZmZXIgb2YgUmVhZCBCdWZmZXIgRGVzY3JpcHRvcnMgKFJCRHMpICovCi0JcnhxLT5iZCA9IGRtYV9hbGxvY19jb2hlcmVudChkZXYsIHNpemVvZihfX2xlMzIpICogUlhfUVVFVUVfU0laRSwKLQkJCQkgICAgICZyeHEtPmJkX2RtYSwgR0ZQX0tFUk5FTCk7CisJcnhxLT5iZCA9IGRtYV96YWxsb2NfY29oZXJlbnQoZGV2LCBzaXplb2YoX19sZTMyKSAqIFJYX1FVRVVFX1NJWkUsCisJCQkJICAgICAgJnJ4cS0+YmRfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJ4cS0+YmQpCiAJCWdvdG8gZXJyX2JkOwotCW1lbXNldChyeHEtPmJkLCAwLCBzaXplb2YoX19sZTMyKSAqIFJYX1FVRVVFX1NJWkUpOwogCiAJLypBbGxvY2F0ZSB0aGUgZHJpdmVyJ3MgcG9pbnRlciB0byByZWNlaXZlIGJ1ZmZlciBzdGF0dXMgKi8KLQlyeHEtPnJiX3N0dHMgPSBkbWFfYWxsb2NfY29oZXJlbnQoZGV2LCBzaXplb2YoKnJ4cS0+cmJfc3R0cyksCi0JCQkJCSAgJnJ4cS0+cmJfc3R0c19kbWEsIEdGUF9LRVJORUwpOworCXJ4cS0+cmJfc3R0cyA9IGRtYV96YWxsb2NfY29oZXJlbnQoZGV2LCBzaXplb2YoKnJ4cS0+cmJfc3R0cyksCisJCQkJCSAgICZyeHEtPnJiX3N0dHNfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJ4cS0+cmJfc3R0cykKIAkJZ290byBlcnJfcmJfc3R0czsKLQltZW1zZXQocnhxLT5yYl9zdHRzLCAwLCBzaXplb2YoKnJ4cS0+cmJfc3R0cykpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTEwNDQsNyArMTA0Miw3IEBACiAKIHN0YXRpYyBpbnQgaXdsX3RyYW5zX3BjaWVfdHgoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBza19idWZmICpza2IsCiAJCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqZGV2X2NtZCwgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwKLQkJdTggc3RhX2lkKQorCQl1OCBzdGFfaWQsIHU4IHRpZCkKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CkBAIC0xMDU4LDEzICsxMDU2LDEyIEBACiAJZG1hX2FkZHJfdCB0eGNtZF9waHlzOwogCWRtYV9hZGRyX3Qgc2NyYXRjaF9waHlzOwogCXUxNiBsZW4sIGZpcnN0bGVuLCBzZWNvbmRsZW47Ci0JdTE2IHNlcV9udW1iZXIgPSAwOwogCXU4IHdhaXRfd3JpdGVfcHRyID0gMDsKIAl1OCB0eHFfaWQ7Ci0JdTggdGlkID0gMDsKIAlib29sIGlzX2FnZyA9IGZhbHNlOwogCV9fbGUxNiBmYyA9IGhkci0+ZnJhbWVfY29udHJvbDsKIAl1OCBoZHJfbGVuID0gaWVlZTgwMjExX2hkcmxlbihmYyk7CisJdTE2IF9fbWF5YmVfdW51c2VkIHdpZmlfc2VxOwogCiAJLyoKIAkgKiBTZW5kIHRoaXMgZnJhbWUgYWZ0ZXIgRFRJTSAtLSB0aGVyZSdzIGEgc3BlY2lhbCBxdWV1ZQpAQCAtMTA4NSwzNiArMTA4MiwyOCBAQAogCQl0eHFfaWQgPQogCQkgICAgdHJhbnNfcGNpZS0+YWNfdG9fcXVldWVbY3R4XVtza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKV07CiAKLQlpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKGZjKSAmJiAhaWVlZTgwMjExX2lzX3Fvc19udWxsZnVuYyhmYykpIHsKLQkJdTggKnFjID0gTlVMTDsKLQkJc3RydWN0IGl3bF90aWRfZGF0YSAqdGlkX2RhdGE7Ci0JCXFjID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0JCXRpZCA9IHFjWzBdICYgSUVFRTgwMjExX1FPU19DVExfVElEX01BU0s7Ci0JCXRpZF9kYXRhID0gJnRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF07Ci0KLQkJaWYgKFdBUk5fT05fT05DRSh0aWQgPj0gSVdMX01BWF9USURfQ09VTlQpKQotCQkJcmV0dXJuIC0xOwotCi0JCXNlcV9udW1iZXIgPSB0aWRfZGF0YS0+c2VxX251bWJlcjsKLQkJc2VxX251bWJlciAmPSBJRUVFODAyMTFfU0NUTF9TRVE7Ci0JCWhkci0+c2VxX2N0cmwgPSBoZHItPnNlcV9jdHJsICYKLQkJCQljcHVfdG9fbGUxNihJRUVFODAyMTFfU0NUTF9GUkFHKTsKLQkJaGRyLT5zZXFfY3RybCB8PSBjcHVfdG9fbGUxNihzZXFfbnVtYmVyKTsKLQkJc2VxX251bWJlciArPSAweDEwOwotCQkvKiBhZ2dyZWdhdGlvbiBpcyBvbiBmb3IgdGhpcyA8c3RhLHRpZD4gKi8KLQkJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkgewotCQkJV0FSTl9PTl9PTkNFKHRpZF9kYXRhLT5hZ2cuc3RhdGUgIT0gSVdMX0FHR19PTik7Ci0JCQl0eHFfaWQgPSB0aWRfZGF0YS0+YWdnLnR4cV9pZDsKLQkJCWlzX2FnZyA9IHRydWU7Ci0JCX0KKwkvKiBhZ2dyZWdhdGlvbiBpcyBvbiBmb3IgdGhpcyA8c3RhLHRpZD4gKi8KKwlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0FNUERVKSB7CisJCVdBUk5fT04odGlkID49IElXTF9NQVhfVElEX0NPVU5UKTsKKwkJdHhxX2lkID0gdHJhbnNfcGNpZS0+YWdnX3R4cVtzdGFfaWRdW3RpZF07CisJCWlzX2FnZyA9IHRydWU7CiAJfQogCi0JLyogQ29weSBNQUMgaGVhZGVyIGZyb20gc2tiIGludG8gY29tbWFuZCBidWZmZXIgKi8KLQltZW1jcHkodHhfY21kLT5oZHIsIGhkciwgaGRyX2xlbik7Ci0KIAl0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07CiAJcSA9ICZ0eHEtPnE7CiAKKwkvKiBJbiBBR0cgbW9kZSwgdGhlIGluZGV4IGluIHRoZSByaW5nIG11c3QgY29ycmVzcG9uZCB0byB0aGUgV2lGaQorCSAqIHNlcXVlbmNlIG51bWJlci4gVGhpcyBpcyBhIEhXIHJlcXVpcmVtZW50cyB0byBoZWxwIHRoZSBTQ0QgdG8gcGFyc2UKKwkgKiB0aGUgQkEuCisJICogQ2hlY2sgaGVyZSB0aGF0IHRoZSBwYWNrZXRzIGFyZSBpbiB0aGUgcmlnaHQgcGxhY2Ugb24gdGhlIHJpbmcuCisJICovCisjaWZkZWYgQ09ORklHX0lXTFdJRklfREVCVUcKKwl3aWZpX3NlcSA9IFNFUV9UT19TTihsZTE2X3RvX2NwdShoZHItPnNlcV9jdHJsKSk7CisJV0FSTl9PTkNFKGlzX2FnZyAmJiAoKHdpZmlfc2VxICYgMHhmZikgIT0gcS0+d3JpdGVfcHRyKSwKKwkJICAiUTogJWQgV2lGaSBTZXEgJWQgdGZkTnVtICVkIiwKKwkJICB0eHFfaWQsIHdpZmlfc2VxLCBxLT53cml0ZV9wdHIpOworI2VuZGlmCisKIAkvKiBTZXQgdXAgZHJpdmVyIGRhdGEgZm9yIHRoaXMgVEZEICovCiAJdHhxLT5za2JzW3EtPndyaXRlX3B0cl0gPSBza2I7CiAJdHhxLT5jbWRbcS0+d3JpdGVfcHRyXSA9IGRldl9jbWQ7CkBAIC0xMTk3LDkgKzExODYsNyBAQAogCWl3bF9wcmludF9oZXhfZHVtcCh0cmFucywgSVdMX0RMX1RYLCAodTggKil0eF9jbWQtPmhkciwgaGRyX2xlbik7CiAKIAkvKiBTZXQgdXAgZW50cnkgZm9yIHRoaXMgVEZEIGluIFR4IGJ5dGUtY291bnQgYXJyYXkgKi8KLQlpZiAoaXNfYWdnKQotCQlpd2xfdHJhbnNfdHhxX3VwZGF0ZV9ieXRlX2NudF90YmwodHJhbnMsIHR4cSwKLQkJCQkJICAgICAgIGxlMTZfdG9fY3B1KHR4X2NtZC0+bGVuKSk7CisJaXdsX3RyYW5zX3R4cV91cGRhdGVfYnl0ZV9jbnRfdGJsKHRyYW5zLCB0eHEsIGxlMTZfdG9fY3B1KHR4X2NtZC0+bGVuKSk7CiAKIAlkbWFfc3luY19zaW5nbGVfZm9yX2RldmljZShidXModHJhbnMpLT5kZXYsIHR4Y21kX3BoeXMsIGZpcnN0bGVuLAogCQkJRE1BX0JJRElSRUNUSU9OQUwpOwpAQCAtMTIxNCwxMyArMTIwMSw2IEBACiAJcS0+d3JpdGVfcHRyID0gaXdsX3F1ZXVlX2luY193cmFwKHEtPndyaXRlX3B0ciwgcS0+bl9iZCk7CiAJaXdsX3R4cV91cGRhdGVfd3JpdGVfcHRyKHRyYW5zLCB0eHEpOwogCi0JaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhmYykgJiYgIWllZWU4MDIxMV9pc19xb3NfbnVsbGZ1bmMoZmMpKSB7Ci0JCXRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF0udGZkc19pbl9xdWV1ZSsrOwotCQlpZiAoIWllZWU4MDIxMV9oYXNfbW9yZWZyYWdzKGZjKSkKLQkJCXRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF0uc2VxX251bWJlciA9Ci0JCQkJc2VxX251bWJlcjsKLQl9Ci0KIAkvKgogCSAqIEF0IHRoaXMgcG9pbnQgdGhlIGZyYW1lIGlzICJ0cmFuc21pdHRlZCIgc3VjY2Vzc2Z1bGx5CiAJICogYW5kIHdlIHdpbGwgZ2V0IGEgVFggc3RhdHVzIG5vdGlmaWNhdGlvbiBldmVudHVhbGx5LApAQCAtMTIzMiw3ICsxMjEyLDcgQEAKIAkJCXR4cS0+bmVlZF91cGRhdGUgPSAxOwogCQkJaXdsX3R4cV91cGRhdGVfd3JpdGVfcHRyKHRyYW5zLCB0eHEpOwogCQl9IGVsc2UgewotCQkJaXdsX3N0b3BfcXVldWUodHJhbnMsIHR4cSk7CisJCQlpd2xfc3RvcF9xdWV1ZSh0cmFucywgdHhxLCAiUXVldWUgaXMgZnVsbCIpOwogCQl9CiAJfQogCXJldHVybiAwOwpAQCAtMTI2OSwxMDEgKzEyNDksNDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBpd2xhZ25fdHhxX2NoZWNrX2VtcHR5KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJICAgaW50IHN0YV9pZCwgdTggdGlkLCBpbnQgdHhxX2lkKQotewotCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9IElXTF9UUkFOU19HRVRfUENJRV9UUkFOUyh0cmFucyk7Ci0Jc3RydWN0IGl3bF9xdWV1ZSAqcSA9ICZ0cmFuc19wY2llLT50eHFbdHhxX2lkXS5xOwotCXN0cnVjdCBpd2xfdGlkX2RhdGEgKnRpZF9kYXRhID0gJnRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF07Ci0KLQlsb2NrZGVwX2Fzc2VydF9oZWxkKCZ0cmFucy0+c2hyZC0+c3RhX2xvY2spOwotCi0Jc3dpdGNoICh0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLmFnZy5zdGF0ZSkgewotCWNhc2UgSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBOgotCQkvKiBXZSBhcmUgcmVjbGFpbWluZyB0aGUgbGFzdCBwYWNrZXQgb2YgdGhlICovCi0JCS8qIGFnZ3JlZ2F0ZWQgSFcgcXVldWUgKi8KLQkJaWYgKCh0eHFfaWQgID09IHRpZF9kYXRhLT5hZ2cudHhxX2lkKSAmJgotCQkgICAgKHEtPnJlYWRfcHRyID09IHEtPndyaXRlX3B0cikpIHsKLQkJCUlXTF9ERUJVR19IVCh0cmFucywKLQkJCQkiSFcgcXVldWUgZW1wdHk6IGNvbnRpbnVlIERFTEJBIGZsb3dcbiIpOwotCQkJaXdsX3RyYW5zX3BjaWVfdHhxX2FnZ19kaXNhYmxlKHRyYW5zLCB0eHFfaWQpOwotCQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfT0ZGOwotCQkJaXdsX3N0b3BfdHhfYmFfdHJhbnNfcmVhZHkocHJpdih0cmFucyksCi0JCQkJCQkgICBOVU1fSVdMX1JYT05fQ1RYLAotCQkJCQkJICAgc3RhX2lkLCB0aWQpOwotCQkJaXdsX3dha2VfcXVldWUodHJhbnMsICZ0cmFuc19wY2llLT50eHFbdHhxX2lkXSk7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBJV0xfRU1QVFlJTkdfSFdfUVVFVUVfQUREQkE6Ci0JCS8qIFdlIGFyZSByZWNsYWltaW5nIHRoZSBsYXN0IHBhY2tldCBvZiB0aGUgcXVldWUgKi8KLQkJaWYgKHRpZF9kYXRhLT50ZmRzX2luX3F1ZXVlID09IDApIHsKLQkJCUlXTF9ERUJVR19IVCh0cmFucywKLQkJCQkiSFcgcXVldWUgZW1wdHk6IGNvbnRpbnVlIEFEREJBIGZsb3dcbiIpOwotCQkJdGlkX2RhdGEtPmFnZy5zdGF0ZSA9IElXTF9BR0dfT047Ci0JCQlpd2xfc3RhcnRfdHhfYmFfdHJhbnNfcmVhZHkocHJpdih0cmFucyksCi0JCQkJCQkgICAgTlVNX0lXTF9SWE9OX0NUWCwKLQkJCQkJCSAgICBzdGFfaWQsIHRpZCk7Ci0JCX0KLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF9mcmVlX3RmZHNfaW5fcXVldWUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkgICAgaW50IHN0YV9pZCwgaW50IHRpZCwgaW50IGZyZWVkKQotewotCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnRyYW5zLT5zaHJkLT5zdGFfbG9jayk7Ci0KLQlpZiAodHJhbnMtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS50ZmRzX2luX3F1ZXVlID49IGZyZWVkKQotCQl0cmFucy0+c2hyZC0+dGlkX2RhdGFbc3RhX2lkXVt0aWRdLnRmZHNfaW5fcXVldWUgLT0gZnJlZWQ7Ci0JZWxzZSB7Ci0JCUlXTF9ERUJVR19UWCh0cmFucywgImZyZWUgbW9yZSB0aGFuIHRmZHNfaW5fcXVldWUgKCV1OiVkKVxuIiwKLQkJCXRyYW5zLT5zaHJkLT50aWRfZGF0YVtzdGFfaWRdW3RpZF0udGZkc19pbl9xdWV1ZSwKLQkJCWZyZWVkKTsKLQkJdHJhbnMtPnNocmQtPnRpZF9kYXRhW3N0YV9pZF1bdGlkXS50ZmRzX2luX3F1ZXVlID0gMDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGl3bF90cmFuc19wY2llX3JlY2xhaW0oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBzdGFfaWQsIGludCB0aWQsCitzdGF0aWMgaW50IGl3bF90cmFuc19wY2llX3JlY2xhaW0oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBzdGFfaWQsIGludCB0aWQsCiAJCSAgICAgIGludCB0eHFfaWQsIGludCBzc24sIHUzMiBzdGF0dXMsCiAJCSAgICAgIHN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMpCiB7CiAJc3RydWN0IGl3bF90cmFuc19wY2llICp0cmFuc19wY2llID0gSVdMX1RSQU5TX0dFVF9QQ0lFX1RSQU5TKHRyYW5zKTsKIAlzdHJ1Y3QgaXdsX3R4X3F1ZXVlICp0eHEgPSAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF07Ci0JZW51bSBpd2xfYWdnX3N0YXRlIGFnZ19zdGF0ZTsKIAkvKiBuX2JkIGlzIHVzdWFsbHkgMjU2ID0+IG5fYmQgLSAxID0gMHhmZiAqLwogCWludCB0ZmRfbnVtID0gc3NuICYgKHR4cS0+cS5uX2JkIC0gMSk7CiAJaW50IGZyZWVkID0gMDsKLQlib29sIGNvbmQ7CiAKIAl0eHEtPnRpbWVfc3RhbXAgPSBqaWZmaWVzOwogCi0JaWYgKHR4cS0+c2NoZWRfcmV0cnkpIHsKLQkJYWdnX3N0YXRlID0KLQkJCXRyYW5zLT5zaHJkLT50aWRfZGF0YVt0eHEtPnN0YV9pZF1bdHhxLT50aWRdLmFnZy5zdGF0ZTsKLQkJY29uZCA9IChhZ2dfc3RhdGUgIT0gSVdMX0VNUFRZSU5HX0hXX1FVRVVFX0RFTEJBKTsKLQl9IGVsc2UgewotCQljb25kID0gKHN0YXR1cyAhPSBUWF9TVEFUVVNfRkFJTF9QQVNTSVZFX05PX1JYKTsKKwlpZiAodW5saWtlbHkodHhxX2lkID49IElXTEFHTl9GSVJTVF9BTVBEVV9RVUVVRSAmJgorCQkgICAgIHR4cV9pZCAhPSB0cmFuc19wY2llLT5hZ2dfdHhxW3N0YV9pZF1bdGlkXSkpIHsKKwkJLyoKKwkJICogRklYTUU6IHRoaXMgaXMgYSB1Q29kZSBidWcgd2hpY2ggbmVlZCB0byBiZSBhZGRyZXNzZWQsCisJCSAqIGxvZyB0aGUgaW5mb3JtYXRpb24gYW5kIHJldHVybiBmb3Igbm93LgorCQkgKiBTaW5jZSBpdCBpcyBjYW4gcG9zc2libHkgaGFwcGVuIHZlcnkgb2Z0ZW4gYW5kIGluIG9yZGVyCisJCSAqIG5vdCB0byBmaWxsIHRoZSBzeXNsb2csIGRvbid0IHVzZSBJV0xfRVJSIG9yIElXTF9XQVJOCisJCSAqLworCQlJV0xfREVCVUdfVFhfUVVFVUVTKHRyYW5zLCAiQmFkIHF1ZXVlIG1hcHBpbmcgdHhxX2lkICVkLCAiCisJCQkiYWdnX3R4cVtzdGFfaWRbdGlkXSAlZCIsIHR4cV9pZCwKKwkJCXRyYW5zX3BjaWUtPmFnZ190eHFbc3RhX2lkXVt0aWRdKTsKKwkJcmV0dXJuIDE7CiAJfQogCiAJaWYgKHR4cS0+cS5yZWFkX3B0ciAhPSB0ZmRfbnVtKSB7Ci0JCUlXTF9ERUJVR19UWF9SRVBMWSh0cmFucywgIlJldHJ5IHNjaGVkdWxlciByZWNsYWltICIKLQkJCQkic2NkX3Nzbj0lZCBpZHg9JWQgdHhxPSVkIHN3cT0lZFxuIiwKLQkJCQlzc24gLCB0ZmRfbnVtLCB0eHFfaWQsIHR4cS0+c3dxX2lkKTsKKwkJSVdMX0RFQlVHX1RYX1JFUExZKHRyYW5zLCAiW1EgJWQgfCBBQyAlZF0gJWQgLT4gJWQgKCVkKVxuIiwKKwkJCQl0eHFfaWQsIGl3bF9nZXRfcXVldWVfYWModHhxKSwgdHhxLT5xLnJlYWRfcHRyLAorCQkJCXRmZF9udW0sIHNzbik7CiAJCWZyZWVkID0gaXdsX3R4X3F1ZXVlX3JlY2xhaW0odHJhbnMsIHR4cV9pZCwgdGZkX251bSwgc2ticyk7Ci0JCWlmIChpd2xfcXVldWVfc3BhY2UoJnR4cS0+cSkgPiB0eHEtPnEubG93X21hcmsgJiYgY29uZCkKLQkJCWl3bF93YWtlX3F1ZXVlKHRyYW5zLCB0eHEpOworCQlpZiAoaXdsX3F1ZXVlX3NwYWNlKCZ0eHEtPnEpID4gdHhxLT5xLmxvd19tYXJrICYmCisJCSAgICghdHhxLT5zY2hlZF9yZXRyeSB8fAorCQkgICBzdGF0dXMgIT0gVFhfU1RBVFVTX0ZBSUxfUEFTU0lWRV9OT19SWCkpCisJCQlpd2xfd2FrZV9xdWV1ZSh0cmFucywgdHhxLCAiUGFja2V0cyByZWNsYWltZWQiKTsKIAl9Ci0KLQlpd2xfZnJlZV90ZmRzX2luX3F1ZXVlKHRyYW5zLCBzdGFfaWQsIHRpZCwgZnJlZWQpOwotCWl3bGFnbl90eHFfY2hlY2tfZW1wdHkodHJhbnMsIHN0YV9pZCwgdGlkLCB0eHFfaWQpOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBpd2xfdHJhbnNfcGNpZV9mcmVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQogeworCWl3bF9jYWxpYl9mcmVlX3Jlc3VsdHModHJhbnMpOwogCWl3bF90cmFuc19wY2llX3R4X2ZyZWUodHJhbnMpOwogCWl3bF90cmFuc19wY2llX3J4X2ZyZWUodHJhbnMpOwogCWZyZWVfaXJxKGJ1cyh0cmFucyktPmlycSwgdHJhbnMpOwpAQCAtMTQxOSw3ICsxMzQ2LDggQEAKICNlbmRpZiAvKiBDT05GSUdfUE1fU0xFRVAgKi8KIAogc3RhdGljIHZvaWQgaXdsX3RyYW5zX3BjaWVfd2FrZV9hbnlfcXVldWUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkJCSAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCkKKwkJCQkJICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LAorCQkJCQkgIGNvbnN0IGNoYXIgKm1zZykKIHsKIAl1OCBhYywgdHhxX2lkOwogCXN0cnVjdCBpd2xfdHJhbnNfcGNpZSAqdHJhbnNfcGNpZSA9CkBAIC0xNDI3LDExICsxMzU1LDExIEBACiAKIAlmb3IgKGFjID0gMDsgYWMgPCBBQ19OVU07IGFjKyspIHsKIAkJdHhxX2lkID0gdHJhbnNfcGNpZS0+YWNfdG9fcXVldWVbY3R4XVthY107Ci0JCUlXTF9ERUJVR19JTkZPKHRyYW5zLCAiUXVldWUgU3RhdHVzOiBRWyVkXSAlc1xuIiwKKwkJSVdMX0RFQlVHX1RYX1FVRVVFUyh0cmFucywgIlF1ZXVlIFN0YXR1czogUVslZF0gJXNcbiIsCiAJCQlhYywKIAkJCShhdG9taWNfcmVhZCgmdHJhbnNfcGNpZS0+cXVldWVfc3RvcF9jb3VudFthY10pID4gMCkKIAkJCSAgICAgID8gInN0b3BwZWQiIDogImF3YWtlIik7Ci0JCWl3bF93YWtlX3F1ZXVlKHRyYW5zLCAmdHJhbnNfcGNpZS0+dHhxW3R4cV9pZF0pOworCQlpd2xfd2FrZV9xdWV1ZSh0cmFucywgJnRyYW5zX3BjaWUtPnR4cVt0eHFfaWRdLCBtc2cpOwogCX0KIH0KIApAQCAtMTQ1NCwxMSArMTM4MiwxMiBAQAogCXJldHVybiBpd2xfdHJhbnM7CiB9CiAKLXN0YXRpYyB2b2lkIGl3bF90cmFuc19wY2llX3N0b3BfcXVldWUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCB0eHFfaWQpCitzdGF0aWMgdm9pZCBpd2xfdHJhbnNfcGNpZV9zdG9wX3F1ZXVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgdHhxX2lkLAorCQkJCSAgICAgIGNvbnN0IGNoYXIgKm1zZykKIHsKIAlzdHJ1Y3QgaXdsX3RyYW5zX3BjaWUgKnRyYW5zX3BjaWUgPSBJV0xfVFJBTlNfR0VUX1BDSUVfVFJBTlModHJhbnMpOwogCi0JaXdsX3N0b3BfcXVldWUodHJhbnMsICZ0cmFuc19wY2llLT50eHFbdHhxX2lkXSk7CisJaXdsX3N0b3BfcXVldWUodHJhbnMsICZ0cmFuc19wY2llLT50eHFbdHhxX2lkXSwgbXNnKTsKIH0KIAogI2RlZmluZSBJV0xfRkxVU0hfV0FJVF9NUwkyMDAwCkBAIC0xNTEzLDggKzE0NDIsMTIgQEAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkgewogCQlJV0xfRVJSKHRyYW5zLCAiUXVldWUgJWQgc3R1Y2sgZm9yICV1IG1zLlxuIiwgcS0+aWQsCiAJCQlod19wYXJhbXModHJhbnMpLndkX3RpbWVvdXQpOwotCQlJV0xfRVJSKHRyYW5zLCAiQ3VycmVudCByZWFkX3B0ciAlZCB3cml0ZV9wdHIgJWRcbiIsCisJCUlXTF9FUlIodHJhbnMsICJDdXJyZW50IFNXIHJlYWRfcHRyICVkIHdyaXRlX3B0ciAlZFxuIiwKIAkJCXEtPnJlYWRfcHRyLCBxLT53cml0ZV9wdHIpOworCQlJV0xfRVJSKHRyYW5zLCAiQ3VycmVudCBIVyByZWFkX3B0ciAlZCB3cml0ZV9wdHIgJWRcbiIsCisJCQlpd2xfcmVhZF9wcnBoKGJ1cyh0cmFucyksIFNDRF9RVUVVRV9SRFBUUihjbnQpKQorCQkJCSYgKFRGRF9RVUVVRV9TSVpFX01BWCAtIDEpLAorCQkJaXdsX3JlYWRfcHJwaChidXModHJhbnMpLCBTQ0RfUVVFVUVfV1JQVFIoY250KSkpOwogCQlyZXR1cm4gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC10cmFucy5oCmluZGV4IGM1OTIzMTIuLmU2YmYzZjUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXRyYW5zLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdHJhbnMuaApAQCAtMTcxLDMyICsxNzEsMzEgQEAKIAl2b2lkICgqdHhfc3RhcnQpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKIAogCXZvaWQgKCp3YWtlX2FueV9xdWV1ZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkgICAgICAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCk7CisJCQkgICAgICAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwKKwkJCSAgICAgICBjb25zdCBjaGFyICptc2cpOwogCiAJaW50ICgqc2VuZF9jbWQpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgaXdsX2hvc3RfY21kICpjbWQpOwogCiAJaW50ICgqdHgpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQlzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmRldl9jbWQsIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCi0JCXU4IHN0YV9pZCk7Ci0Jdm9pZCAoKnJlY2xhaW0pKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgc3RhX2lkLCBpbnQgdGlkLAorCQl1OCBzdGFfaWQsIHU4IHRpZCk7CisJaW50ICgqcmVjbGFpbSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBzdGFfaWQsIGludCB0aWQsCiAJCQlpbnQgdHhxX2lkLCBpbnQgc3NuLCB1MzIgc3RhdHVzLAogCQkJc3RydWN0IHNrX2J1ZmZfaGVhZCAqc2ticyk7CiAKIAlpbnQgKCp0eF9hZ2dfZGlzYWJsZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCi0JCQkgICAgICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LCBpbnQgc3RhX2lkLAotCQkJICAgICAgaW50IHRpZCk7CisJCQkgICAgICBpbnQgc3RhX2lkLCBpbnQgdGlkKTsKIAlpbnQgKCp0eF9hZ2dfYWxsb2MpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJICAgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsIGludCBzdGFfaWQsIGludCB0aWQsCi0JCQkgICAgdTE2ICpzc24pOworCQkJICAgIGludCBzdGFfaWQsIGludCB0aWQpOwogCXZvaWQgKCp0eF9hZ2dfc2V0dXApKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAogCQkJICAgICBlbnVtIGl3bF9yeG9uX2NvbnRleHRfaWQgY3R4LCBpbnQgc3RhX2lkLCBpbnQgdGlkLAotCQkJICAgICBpbnQgZnJhbWVfbGltaXQpOworCQkJICAgICBpbnQgZnJhbWVfbGltaXQsIHUxNiBzc24pOwogCiAJdm9pZCAoKmtpY2tfbmljKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucyk7CiAKIAl2b2lkICgqZnJlZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOwogCi0Jdm9pZCAoKnN0b3BfcXVldWUpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgcSk7CisJdm9pZCAoKnN0b3BfcXVldWUpKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgcSwgY29uc3QgY2hhciAqbXNnKTsKIAogCWludCAoKmRiZ2ZzX3JlZ2lzdGVyKShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgc3RydWN0IGRlbnRyeSogZGlyKTsKIAlpbnQgKCpjaGVja19zdHVja19xdWV1ZSkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBxKTsKQEAgLTIwNywxNyArMjA2LDU0IEBACiAjZW5kaWYKIH07CiAKKy8qIG9uZSBmb3IgZWFjaCB1Q29kZSBpbWFnZSAoaW5zdC9kYXRhLCBib290L2luaXQvcnVudGltZSkgKi8KK3N0cnVjdCBmd19kZXNjIHsKKwlkbWFfYWRkcl90IHBfYWRkcjsJLyogaGFyZHdhcmUgYWRkcmVzcyAqLworCXZvaWQgKnZfYWRkcjsJCS8qIHNvZnR3YXJlIGFkZHJlc3MgKi8KKwl1MzIgbGVuOwkJLyogc2l6ZSBpbiBieXRlcyAqLworfTsKKworc3RydWN0IGZ3X2ltZyB7CisJc3RydWN0IGZ3X2Rlc2MgY29kZTsJLyogZmlybXdhcmUgY29kZSBpbWFnZSAqLworCXN0cnVjdCBmd19kZXNjIGRhdGE7CS8qIGZpcm13YXJlIGRhdGEgaW1hZ2UgKi8KK307CisKKy8qIE9wYXF1ZSBjYWxpYnJhdGlvbiByZXN1bHRzICovCitzdHJ1Y3QgaXdsX2NhbGliX3Jlc3VsdCB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCXNpemVfdCBjbWRfbGVuOworCXN0cnVjdCBpd2xfY2FsaWJfaGRyIGhkcjsKKwkvKiBkYXRhIGZvbGxvd3MgKi8KK307CisKIC8qKgogICogc3RydWN0IGl3bF90cmFucyAtIHRyYW5zcG9ydCBjb21tb24gZGF0YQogICogQG9wcyAtIHBvaW50ZXIgdG8gaXdsX3RyYW5zX29wcwogICogQHNocmQgLSBwb2ludGVyIHRvIGl3bF9zaGFyZWQgd2hpY2ggaG9sZHMgc2hhcmVkIGRhdGEgZnJvbSB0aGUgdXBwZXIgbGF5ZXIKICAqIEBoY21kX2xvY2s6IHByb3RlY3RzIEhDTUQKKyAqIEB1Y29kZV93cml0ZV9jb21wbGV0ZTogaW5kaWNhdGVzIHRoYXQgdGhlIHVjb2RlIGhhcyBiZWVuIGNvcGllZC4KKyAqIEB1Y29kZV9ydDogcnVuIHRpbWUgdWNvZGUgaW1hZ2UKKyAqIEB1Y29kZV9pbml0OiBpbml0IHVjb2RlIGltYWdlCisgKiBAdWNvZGVfd293bGFuOiB3YWtlIG9uIHdpcmVsZXNzIHVjb2RlIGltYWdlIChvcHRpb25hbCkKKyAqIEBudm1fZGV2aWNlX3R5cGU6IGluZGljYXRlcyBPVFAgb3IgZWVwcm9tCisgKiBAY2FsaWJfcmVzdWx0czogbGlzdCBoZWFkIGZvciBpbml0IGNhbGlicmF0aW9uIHJlc3VsdHMKICAqLwogc3RydWN0IGl3bF90cmFucyB7CiAJY29uc3Qgc3RydWN0IGl3bF90cmFuc19vcHMgKm9wczsKIAlzdHJ1Y3QgaXdsX3NoYXJlZCAqc2hyZDsKIAlzcGlubG9ja190IGhjbWRfbG9jazsKIAorCXU4IHVjb2RlX3dyaXRlX2NvbXBsZXRlOwkvKiB0aGUgaW1hZ2Ugd3JpdGUgaXMgY29tcGxldGUgKi8KKwlzdHJ1Y3QgZndfaW1nIHVjb2RlX3J0OworCXN0cnVjdCBmd19pbWcgdWNvZGVfaW5pdDsKKwlzdHJ1Y3QgZndfaW1nIHVjb2RlX3dvd2xhbjsKKworCS8qIGVlcHJvbSByZWxhdGVkIHZhcmlhYmxlcyAqLworCWludCAgICBudm1fZGV2aWNlX3R5cGU7CisKKwkvKiBpbml0IGNhbGlicmF0aW9uIHJlc3VsdHMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGNhbGliX3Jlc3VsdHM7CisKIAkvKiBwb2ludGVyIHRvIHRyYW5zIHNwZWNpZmljIHN0cnVjdCAqLwogCS8qRW5zdXJlIHRoYXQgdGhpcyBwb2ludGVyIHdpbGwgYWx3YXlzIGJlIGFsaWduZWQgdG8gc2l6ZW9mIHBvaW50ZXIgKi8KIAljaGFyIHRyYW5zX3NwZWNpZmljWzBdIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKHNpemVvZih2b2lkICopKSkpOwpAQCAtMjQ5LDkgKzI4NSwxMCBAQAogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3RyYW5zX3dha2VfYW55X3F1ZXVlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCQkgICAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCkKKwkJCQkJICAgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCisJCQkJCSAgICBjb25zdCBjaGFyICptc2cpCiB7Ci0JdHJhbnMtPm9wcy0+d2FrZV9hbnlfcXVldWUodHJhbnMsIGN0eCk7CisJdHJhbnMtPm9wcy0+d2FrZV9hbnlfcXVldWUodHJhbnMsIGN0eCwgbXNnKTsKIH0KIAogCkBAIC0yNjYsMzkgKzMwMywzOCBAQAogCiBzdGF0aWMgaW5saW5lIGludCBpd2xfdHJhbnNfdHgoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHN0cnVjdCBza19idWZmICpza2IsCiAJCXN0cnVjdCBpd2xfZGV2aWNlX2NtZCAqZGV2X2NtZCwgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwKLQkJdTggc3RhX2lkKQorCQl1OCBzdGFfaWQsIHU4IHRpZCkKIHsKLQlyZXR1cm4gdHJhbnMtPm9wcy0+dHgodHJhbnMsIHNrYiwgZGV2X2NtZCwgY3R4LCBzdGFfaWQpOworCXJldHVybiB0cmFucy0+b3BzLT50eCh0cmFucywgc2tiLCBkZXZfY21kLCBjdHgsIHN0YV9pZCwgdGlkKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGl3bF90cmFuc19yZWNsYWltKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLCBpbnQgc3RhX2lkLAorc3RhdGljIGlubGluZSBpbnQgaXdsX3RyYW5zX3JlY2xhaW0oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBzdGFfaWQsCiAJCQkJIGludCB0aWQsIGludCB0eHFfaWQsIGludCBzc24sIHUzMiBzdGF0dXMsCiAJCQkJIHN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMpCiB7Ci0JdHJhbnMtPm9wcy0+cmVjbGFpbSh0cmFucywgc3RhX2lkLCB0aWQsIHR4cV9pZCwgc3NuLCBzdGF0dXMsIHNrYnMpOworCXJldHVybiB0cmFucy0+b3BzLT5yZWNsYWltKHRyYW5zLCBzdGFfaWQsIHRpZCwgdHhxX2lkLCBzc24sCisJCQkJICAgc3RhdHVzLCBza2JzKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXdsX3RyYW5zX3R4X2FnZ19kaXNhYmxlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAotCQkJCQkgICAgZW51bSBpd2xfcnhvbl9jb250ZXh0X2lkIGN0eCwKIAkJCQkJICAgIGludCBzdGFfaWQsIGludCB0aWQpCiB7Ci0JcmV0dXJuIHRyYW5zLT5vcHMtPnR4X2FnZ19kaXNhYmxlKHRyYW5zLCBjdHgsIHN0YV9pZCwgdGlkKTsKKwlyZXR1cm4gdHJhbnMtPm9wcy0+dHhfYWdnX2Rpc2FibGUodHJhbnMsIHN0YV9pZCwgdGlkKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXdsX3RyYW5zX3R4X2FnZ19hbGxvYyhzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKLQkJCQkJIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCi0JCQkJCSBpbnQgc3RhX2lkLCBpbnQgdGlkLCB1MTYgKnNzbikKKwkJCQkJIGludCBzdGFfaWQsIGludCB0aWQpCiB7Ci0JcmV0dXJuIHRyYW5zLT5vcHMtPnR4X2FnZ19hbGxvYyh0cmFucywgY3R4LCBzdGFfaWQsIHRpZCwgc3NuKTsKKwlyZXR1cm4gdHJhbnMtPm9wcy0+dHhfYWdnX2FsbG9jKHRyYW5zLCBzdGFfaWQsIHRpZCk7CiB9CiAKIAogc3RhdGljIGlubGluZSB2b2lkIGl3bF90cmFuc190eF9hZ2dfc2V0dXAoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCiAJCQkJCSAgIGVudW0gaXdsX3J4b25fY29udGV4dF9pZCBjdHgsCiAJCQkJCSAgIGludCBzdGFfaWQsIGludCB0aWQsCi0JCQkJCSAgIGludCBmcmFtZV9saW1pdCkKKwkJCQkJICAgaW50IGZyYW1lX2xpbWl0LCB1MTYgc3NuKQogewotCXRyYW5zLT5vcHMtPnR4X2FnZ19zZXR1cCh0cmFucywgY3R4LCBzdGFfaWQsIHRpZCwgZnJhbWVfbGltaXQpOworCXRyYW5zLT5vcHMtPnR4X2FnZ19zZXR1cCh0cmFucywgY3R4LCBzdGFfaWQsIHRpZCwgZnJhbWVfbGltaXQsIHNzbik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfdHJhbnNfa2lja19uaWMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCkBAIC0zMTEsOSArMzQ3LDEwIEBACiAJdHJhbnMtPm9wcy0+ZnJlZSh0cmFucyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpd2xfdHJhbnNfc3RvcF9xdWV1ZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgaW50IHEpCitzdGF0aWMgaW5saW5lIHZvaWQgaXdsX3RyYW5zX3N0b3BfcXVldWUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGludCBxLAorCQkJCQljb25zdCBjaGFyICptc2cpCiB7Ci0JdHJhbnMtPm9wcy0+c3RvcF9xdWV1ZSh0cmFucywgcSk7CisJdHJhbnMtPm9wcy0+c3RvcF9xdWV1ZSh0cmFucywgcSwgbXNnKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgaXdsX3RyYW5zX3dhaXRfdHhfcXVldWVfZW1wdHkoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCkBAIC0zNDgsNCArMzg1LDEzIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBleHRlcm4gY29uc3Qgc3RydWN0IGl3bF90cmFuc19vcHMgdHJhbnNfb3BzX3BjaWU7CiAKK2ludCBpd2xfYWxsb2NfZndfZGVzYyhzdHJ1Y3QgaXdsX2J1cyAqYnVzLCBzdHJ1Y3QgZndfZGVzYyAqZGVzYywKKwkJICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7Cit2b2lkIGl3bF9kZWFsbG9jX3Vjb2RlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKKworaW50IGl3bF9zZW5kX2NhbGliX3Jlc3VsdHMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOworaW50IGl3bF9jYWxpYl9zZXQoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCSAgY29uc3Qgc3RydWN0IGl3bF9jYWxpYl9oZHIgKmNtZCwgaW50IGxlbik7Cit2b2lkIGl3bF9jYWxpYl9mcmVlX3Jlc3VsdHMoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOworCiAjZW5kaWYgLyogX19pd2xfdHJhbnNfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC11Y29kZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdWNvZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmExYjViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsd2lmaS9pd2wtdWNvZGUuYwpAQCAtMCwwICsxLDc1OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEdQTCBMSUNFTlNFIFNVTU1BUlkKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAwOCAtIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMCwKKyAqIFVTQQorICoKKyAqIFRoZSBmdWxsIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uCisgKiBpbiB0aGUgZmlsZSBjYWxsZWQgTElDRU5TRS5HUEwuCisgKgorICogQ29udGFjdCBJbmZvcm1hdGlvbjoKKyAqICBJbnRlbCBMaW51eCBXaXJlbGVzcyA8aWx3QGxpbnV4LmludGVsLmNvbT4KKyAqIEludGVsIENvcnBvcmF0aW9uLCA1MjAwIE4uRS4gRWxhbSBZb3VuZyBQYXJrd2F5LCBIaWxsc2Jvcm8sIE9SIDk3MTI0LTY0OTcKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAiaXdsLXdpZmkuaCIKKyNpbmNsdWRlICJpd2wtZGV2LmgiCisjaW5jbHVkZSAiaXdsLWNvcmUuaCIKKyNpbmNsdWRlICJpd2wtaW8uaCIKKyNpbmNsdWRlICJpd2wtYWduLWh3LmgiCisjaW5jbHVkZSAiaXdsLWFnbi5oIgorI2luY2x1ZGUgIml3bC1hZ24tY2FsaWIuaCIKKyNpbmNsdWRlICJpd2wtdHJhbnMuaCIKKyNpbmNsdWRlICJpd2wtZmguaCIKKworc3RhdGljIHN0cnVjdCBpd2xfd2ltYXhfY29leF9ldmVudF9lbnRyeSBjdV9wcmlvcml0aWVzW0NPRVhfTlVNX09GX0VWRU5UU10gPSB7CisJe0NPRVhfQ1VfVU5BU1NPQ19JRExFX1JQLCBDT0VYX0NVX1VOQVNTT0NfSURMRV9XUCwKKwkgMCwgQ09FWF9VTkFTU09DX0lETEVfRkxBR1N9LAorCXtDT0VYX0NVX1VOQVNTT0NfTUFOVUFMX1NDQU5fUlAsIENPRVhfQ1VfVU5BU1NPQ19NQU5VQUxfU0NBTl9XUCwKKwkgMCwgQ09FWF9VTkFTU09DX01BTlVBTF9TQ0FOX0ZMQUdTfSwKKwl7Q09FWF9DVV9VTkFTU09DX0FVVE9fU0NBTl9SUCwgQ09FWF9DVV9VTkFTU09DX0FVVE9fU0NBTl9XUCwKKwkgMCwgQ09FWF9VTkFTU09DX0FVVE9fU0NBTl9GTEFHU30sCisJe0NPRVhfQ1VfQ0FMSUJSQVRJT05fUlAsIENPRVhfQ1VfQ0FMSUJSQVRJT05fV1AsCisJIDAsIENPRVhfQ0FMSUJSQVRJT05fRkxBR1N9LAorCXtDT0VYX0NVX1BFUklPRElDX0NBTElCUkFUSU9OX1JQLCBDT0VYX0NVX1BFUklPRElDX0NBTElCUkFUSU9OX1dQLAorCSAwLCBDT0VYX1BFUklPRElDX0NBTElCUkFUSU9OX0ZMQUdTfSwKKwl7Q09FWF9DVV9DT05ORUNUSU9OX0VTVEFCX1JQLCBDT0VYX0NVX0NPTk5FQ1RJT05fRVNUQUJfV1AsCisJIDAsIENPRVhfQ09OTkVDVElPTl9FU1RBQl9GTEFHU30sCisJe0NPRVhfQ1VfQVNTT0NJQVRFRF9JRExFX1JQLCBDT0VYX0NVX0FTU09DSUFURURfSURMRV9XUCwKKwkgMCwgQ09FWF9BU1NPQ0lBVEVEX0lETEVfRkxBR1N9LAorCXtDT0VYX0NVX0FTU09DX01BTlVBTF9TQ0FOX1JQLCBDT0VYX0NVX0FTU09DX01BTlVBTF9TQ0FOX1dQLAorCSAwLCBDT0VYX0FTU09DX01BTlVBTF9TQ0FOX0ZMQUdTfSwKKwl7Q09FWF9DVV9BU1NPQ19BVVRPX1NDQU5fUlAsIENPRVhfQ1VfQVNTT0NfQVVUT19TQ0FOX1dQLAorCSAwLCBDT0VYX0FTU09DX0FVVE9fU0NBTl9GTEFHU30sCisJe0NPRVhfQ1VfQVNTT0NfQUNUSVZFX0xFVkVMX1JQLCBDT0VYX0NVX0FTU09DX0FDVElWRV9MRVZFTF9XUCwKKwkgMCwgQ09FWF9BU1NPQ19BQ1RJVkVfTEVWRUxfRkxBR1N9LAorCXtDT0VYX0NVX1JGX09OX1JQLCBDT0VYX0NVX1JGX09OX1dQLCAwLCBDT0VYX0NVX1JGX09OX0ZMQUdTfSwKKwl7Q09FWF9DVV9SRl9PRkZfUlAsIENPRVhfQ1VfUkZfT0ZGX1dQLCAwLCBDT0VYX1JGX09GRl9GTEFHU30sCisJe0NPRVhfQ1VfU1RBTkRfQUxPTkVfREVCVUdfUlAsIENPRVhfQ1VfU1RBTkRfQUxPTkVfREVCVUdfV1AsCisJIDAsIENPRVhfU1RBTkRfQUxPTkVfREVCVUdfRkxBR1N9LAorCXtDT0VYX0NVX0lQQU5fQVNTT0NfTEVWRUxfUlAsIENPRVhfQ1VfSVBBTl9BU1NPQ19MRVZFTF9XUCwKKwkgMCwgQ09FWF9JUEFOX0FTU09DX0xFVkVMX0ZMQUdTfSwKKwl7Q09FWF9DVV9SU1JWRDFfUlAsIENPRVhfQ1VfUlNSVkQxX1dQLCAwLCBDT0VYX1JTUlZEMV9GTEFHU30sCisJe0NPRVhfQ1VfUlNSVkQyX1JQLCBDT0VYX0NVX1JTUlZEMl9XUCwgMCwgQ09FWF9SU1JWRDJfRkxBR1N9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogdUNvZGUgZG93bmxvYWQgZnVuY3Rpb25zCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgaXdsX2ZyZWVfZndfZGVzYyhzdHJ1Y3QgaXdsX2J1cyAqYnVzLCBzdHJ1Y3QgZndfZGVzYyAqZGVzYykKK3sKKwlpZiAoZGVzYy0+dl9hZGRyKQorCQlkbWFfZnJlZV9jb2hlcmVudChidXMtPmRldiwgZGVzYy0+bGVuLAorCQkJCSAgZGVzYy0+dl9hZGRyLCBkZXNjLT5wX2FkZHIpOworCWRlc2MtPnZfYWRkciA9IE5VTEw7CisJZGVzYy0+bGVuID0gMDsKK30KKworc3RhdGljIHZvaWQgaXdsX2ZyZWVfZndfaW1nKHN0cnVjdCBpd2xfYnVzICpidXMsIHN0cnVjdCBmd19pbWcgKmltZykKK3sKKwlpd2xfZnJlZV9md19kZXNjKGJ1cywgJmltZy0+Y29kZSk7CisJaXdsX2ZyZWVfZndfZGVzYyhidXMsICZpbWctPmRhdGEpOworfQorCit2b2lkIGl3bF9kZWFsbG9jX3Vjb2RlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCWl3bF9mcmVlX2Z3X2ltZyhidXModHJhbnMpLCAmdHJhbnMtPnVjb2RlX3J0KTsKKwlpd2xfZnJlZV9md19pbWcoYnVzKHRyYW5zKSwgJnRyYW5zLT51Y29kZV9pbml0KTsKKwlpd2xfZnJlZV9md19pbWcoYnVzKHRyYW5zKSwgJnRyYW5zLT51Y29kZV93b3dsYW4pOworfQorCitpbnQgaXdsX2FsbG9jX2Z3X2Rlc2Moc3RydWN0IGl3bF9idXMgKmJ1cywgc3RydWN0IGZ3X2Rlc2MgKmRlc2MsCisJCSAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJaWYgKCFsZW4pIHsKKwkJZGVzYy0+dl9hZGRyID0gTlVMTDsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGVzYy0+dl9hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KGJ1cy0+ZGV2LCBsZW4sCisJCQkJCSAgJmRlc2MtPnBfYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXNjLT52X2FkZHIpCisJCXJldHVybiAtRU5PTUVNOworCisJZGVzYy0+bGVuID0gbGVuOworCW1lbWNweShkZXNjLT52X2FkZHIsIGRhdGEsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiB1Y29kZQorICovCitzdGF0aWMgaW50IGl3bF9sb2FkX3NlY3Rpb24oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJc3RydWN0IGZ3X2Rlc2MgKmltYWdlLCB1MzIgZHN0X2FkZHIpCit7CisJc3RydWN0IGl3bF9idXMgKmJ1cyA9IGJ1cyh0cmFucyk7CisJZG1hX2FkZHJfdCBwaHlfYWRkciA9IGltYWdlLT5wX2FkZHI7CisJdTMyIGJ5dGVfY250ID0gaW1hZ2UtPmxlbjsKKwlpbnQgcmV0OworCisJdHJhbnMtPnVjb2RlX3dyaXRlX2NvbXBsZXRlID0gMDsKKworCWl3bF93cml0ZV9kaXJlY3QzMihidXMsCisJCUZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKEZIX1NSVkNfQ0hOTCksCisJCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfUEFVU0UpOworCisJaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cywKKwkJRkhfU1JWQ19DSE5MX1NSQU1fQUREUl9SRUcoRkhfU1JWQ19DSE5MKSwgZHN0X2FkZHIpOworCisJaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cywKKwkJRkhfVEZESUJfQ1RSTDBfUkVHKEZIX1NSVkNfQ0hOTCksCisJCXBoeV9hZGRyICYgRkhfTUVNX1RGRElCX0RSQU1fQUREUl9MU0JfTVNLKTsKKworCWl3bF93cml0ZV9kaXJlY3QzMihidXMsCisJCUZIX1RGRElCX0NUUkwxX1JFRyhGSF9TUlZDX0NITkwpLAorCQkoaXdsX2dldF9kbWFfaGlfYWRkcihwaHlfYWRkcikKKwkJCTw8IEZIX01FTV9URkRJQl9SRUcxX0FERFJfQklUU0hJRlQpIHwgYnl0ZV9jbnQpOworCisJaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cywKKwkJRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHKEZIX1NSVkNfQ0hOTCksCisJCTEgPDwgRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1BPU19UQl9OVU0gfAorCQkxIDw8IEZIX1RDU1JfQ0hOTF9UWF9CVUZfU1RTX1JFR19QT1NfVEJfSURYIHwKKwkJRkhfVENTUl9DSE5MX1RYX0JVRl9TVFNfUkVHX1ZBTF9URkRCX1ZBTElEKTsKKworCWl3bF93cml0ZV9kaXJlY3QzMihidXMsCisJCUZIX1RDU1JfQ0hOTF9UWF9DT05GSUdfUkVHKEZIX1NSVkNfQ0hOTCksCisJCUZIX1RDU1JfVFhfQ09ORklHX1JFR19WQUxfRE1BX0NITkxfRU5BQkxFCXwKKwkJRkhfVENTUl9UWF9DT05GSUdfUkVHX1ZBTF9ETUFfQ1JFRElUX0RJU0FCTEUJfAorCQlGSF9UQ1NSX1RYX0NPTkZJR19SRUdfVkFMX0NJUlFfSE9TVF9FTkRURkQpOworCisJSVdMX0RFQlVHX0ZXKGJ1cywgIiVzIHVDb2RlIHNlY3Rpb24gYmVpbmcgbG9hZGVkLi4uXG4iLCBuYW1lKTsKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQodHJhbnMtPnNocmQtPndhaXRfY29tbWFuZF9xdWV1ZSwKKwkJCQkgdHJhbnMtPnVjb2RlX3dyaXRlX2NvbXBsZXRlLCA1ICogSFopOworCWlmICghcmV0KSB7CisJCUlXTF9FUlIodHJhbnMsICJDb3VsZCBub3QgbG9hZCB0aGUgJXMgdUNvZGUgc2VjdGlvblxuIiwKKwkJCW5hbWUpOworCQlyZXR1cm4gLUVUSU1FRE9VVDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgZndfaW1nICppd2xfZ2V0X3Vjb2RlX2ltYWdlKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zLAorCQkJCQllbnVtIGl3bF91Y29kZV90eXBlIHVjb2RlX3R5cGUpCit7CisJc3dpdGNoICh1Y29kZV90eXBlKSB7CisJY2FzZSBJV0xfVUNPREVfSU5JVDoKKwkJcmV0dXJuICZ0cmFucy0+dWNvZGVfaW5pdDsKKwljYXNlIElXTF9VQ09ERV9XT1dMQU46CisJCXJldHVybiAmdHJhbnMtPnVjb2RlX3dvd2xhbjsKKwljYXNlIElXTF9VQ09ERV9SRUdVTEFSOgorCQlyZXR1cm4gJnRyYW5zLT51Y29kZV9ydDsKKwljYXNlIElXTF9VQ09ERV9OT05FOgorCQlicmVhazsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaXdsX2xvYWRfZ2l2ZW5fdWNvZGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJICAgZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBmd19pbWcgKmltYWdlID0gaXdsX2dldF91Y29kZV9pbWFnZSh0cmFucywgdWNvZGVfdHlwZSk7CisKKworCWlmICghaW1hZ2UpIHsKKwkJSVdMX0VSUih0cmFucywgIkludmFsaWQgdWNvZGUgcmVxdWVzdGVkICglZClcbiIsCisJCQl1Y29kZV90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0ID0gaXdsX2xvYWRfc2VjdGlvbih0cmFucywgIklOU1QiLCAmaW1hZ2UtPmNvZGUsCisJCQkJICAgSVdMQUdOX1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIGl3bF9sb2FkX3NlY3Rpb24odHJhbnMsICJEQVRBIiwgJmltYWdlLT5kYXRhLAorCQkJCSAgICBJV0xBR05fUlRDX0RBVEFfTE9XRVJfQk9VTkQpOworfQorCisvKgorICogIENhbGlicmF0aW9uCisgKi8KK3N0YXRpYyBpbnQgaXdsX3NldF9YdGFsX2NhbGliKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBpd2xfY2FsaWJfeHRhbF9mcmVxX2NtZCBjbWQ7CisJX19sZTE2ICp4dGFsX2NhbGliID0KKwkJKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcih0cmFucy0+c2hyZCwgRUVQUk9NX1hUQUwpOworCisJaXdsX3NldF9jYWxpYl9oZHIoJmNtZC5oZHIsIElXTF9QSFlfQ0FMSUJSQVRFX0NSWVNUQUxfRlJRX0NNRCk7CisJY21kLmNhcF9waW4xID0gbGUxNl90b19jcHUoeHRhbF9jYWxpYlswXSk7CisJY21kLmNhcF9waW4yID0gbGUxNl90b19jcHUoeHRhbF9jYWxpYlsxXSk7CisJcmV0dXJuIGl3bF9jYWxpYl9zZXQodHJhbnMsICh2b2lkICopJmNtZCwgc2l6ZW9mKGNtZCkpOworfQorCitzdGF0aWMgaW50IGl3bF9zZXRfdGVtcGVyYXR1cmVfb2Zmc2V0X2NhbGliKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBpd2xfY2FsaWJfdGVtcGVyYXR1cmVfb2Zmc2V0X2NtZCBjbWQ7CisJX19sZTE2ICpvZmZzZXRfY2FsaWIgPQorCQkoX19sZTE2ICopaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHRyYW5zLT5zaHJkLAorCQkJCQkJRUVQUk9NX1JBV19URU1QRVJBVFVSRSk7CisKKwltZW1zZXQoJmNtZCwgMCwgc2l6ZW9mKGNtZCkpOworCWl3bF9zZXRfY2FsaWJfaGRyKCZjbWQuaGRyLCBJV0xfUEhZX0NBTElCUkFURV9URU1QX09GRlNFVF9DTUQpOworCW1lbWNweSgmY21kLnJhZGlvX3NlbnNvcl9vZmZzZXQsIG9mZnNldF9jYWxpYiwgc2l6ZW9mKCpvZmZzZXRfY2FsaWIpKTsKKwlpZiAoIShjbWQucmFkaW9fc2Vuc29yX29mZnNldCkpCisJCWNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0ID0gREVGQVVMVF9SQURJT19TRU5TT1JfT0ZGU0VUOworCisJSVdMX0RFQlVHX0NBTElCKHRyYW5zLCAiUmFkaW8gc2Vuc29yIG9mZnNldDogJWRcbiIsCisJCQlsZTE2X3RvX2NwdShjbWQucmFkaW9fc2Vuc29yX29mZnNldCkpOworCXJldHVybiBpd2xfY2FsaWJfc2V0KHRyYW5zLCAodm9pZCAqKSZjbWQsIHNpemVvZihjbWQpKTsKK30KKworc3RhdGljIGludCBpd2xfc2V0X3RlbXBlcmF0dXJlX29mZnNldF9jYWxpYl92MihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgaXdsX2NhbGliX3RlbXBlcmF0dXJlX29mZnNldF92Ml9jbWQgY21kOworCV9fbGUxNiAqb2Zmc2V0X2NhbGliX2hpZ2ggPSAoX19sZTE2ICopaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHRyYW5zLT5zaHJkLAorCQkJCSAgICAgRUVQUk9NX0tFTFZJTl9URU1QRVJBVFVSRSk7CisJX19sZTE2ICpvZmZzZXRfY2FsaWJfbG93ID0KKwkJKF9fbGUxNiAqKWl3bF9lZXByb21fcXVlcnlfYWRkcih0cmFucy0+c2hyZCwKKwkJCQkJCUVFUFJPTV9SQVdfVEVNUEVSQVRVUkUpOworCXN0cnVjdCBpd2xfZWVwcm9tX2NhbGliX2hkciAqaGRyOworCisJbWVtc2V0KCZjbWQsIDAsIHNpemVvZihjbWQpKTsKKwlpd2xfc2V0X2NhbGliX2hkcigmY21kLmhkciwgSVdMX1BIWV9DQUxJQlJBVEVfVEVNUF9PRkZTRVRfQ01EKTsKKwloZHIgPSAoc3RydWN0IGl3bF9lZXByb21fY2FsaWJfaGRyICopaXdsX2VlcHJvbV9xdWVyeV9hZGRyKHRyYW5zLT5zaHJkLAorCQkJCQkJCUVFUFJPTV9DQUxJQl9BTEwpOworCW1lbWNweSgmY21kLnJhZGlvX3NlbnNvcl9vZmZzZXRfaGlnaCwgb2Zmc2V0X2NhbGliX2hpZ2gsCisJCXNpemVvZigqb2Zmc2V0X2NhbGliX2hpZ2gpKTsKKwltZW1jcHkoJmNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0X2xvdywgb2Zmc2V0X2NhbGliX2xvdywKKwkJc2l6ZW9mKCpvZmZzZXRfY2FsaWJfbG93KSk7CisJaWYgKCEoY21kLnJhZGlvX3NlbnNvcl9vZmZzZXRfbG93KSkgeworCQlJV0xfREVCVUdfQ0FMSUIodHJhbnMsICJubyBpbmZvIGluIEVFUFJPTSwgdXNlIGRlZmF1bHRcbiIpOworCQljbWQucmFkaW9fc2Vuc29yX29mZnNldF9sb3cgPSBERUZBVUxUX1JBRElPX1NFTlNPUl9PRkZTRVQ7CisJCWNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0X2hpZ2ggPSBERUZBVUxUX1JBRElPX1NFTlNPUl9PRkZTRVQ7CisJfQorCW1lbWNweSgmY21kLmJ1cm50Vm9sdGFnZVJlZiwgJmhkci0+dm9sdGFnZSwKKwkJc2l6ZW9mKGhkci0+dm9sdGFnZSkpOworCisJSVdMX0RFQlVHX0NBTElCKHRyYW5zLCAiUmFkaW8gc2Vuc29yIG9mZnNldCBoaWdoOiAlZFxuIiwKKwkJCWxlMTZfdG9fY3B1KGNtZC5yYWRpb19zZW5zb3Jfb2Zmc2V0X2hpZ2gpKTsKKwlJV0xfREVCVUdfQ0FMSUIodHJhbnMsICJSYWRpbyBzZW5zb3Igb2Zmc2V0IGxvdzogJWRcbiIsCisJCQlsZTE2X3RvX2NwdShjbWQucmFkaW9fc2Vuc29yX29mZnNldF9sb3cpKTsKKwlJV0xfREVCVUdfQ0FMSUIodHJhbnMsICJWb2x0YWdlIFJlZjogJWRcbiIsCisJCQlsZTE2X3RvX2NwdShjbWQuYnVybnRWb2x0YWdlUmVmKSk7CisKKwlyZXR1cm4gaXdsX2NhbGliX3NldCh0cmFucywgKHZvaWQgKikmY21kLCBzaXplb2YoY21kKSk7Cit9CisKK3N0YXRpYyBpbnQgaXdsX3NlbmRfY2FsaWJfY2ZnKHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBpd2xfY2FsaWJfY2ZnX2NtZCBjYWxpYl9jZmdfY21kOworCXN0cnVjdCBpd2xfaG9zdF9jbWQgY21kID0geworCQkuaWQgPSBDQUxJQlJBVElPTl9DRkdfQ01ELAorCQkubGVuID0geyBzaXplb2Yoc3RydWN0IGl3bF9jYWxpYl9jZmdfY21kKSwgfSwKKwkJLmRhdGEgPSB7ICZjYWxpYl9jZmdfY21kLCB9LAorCX07CisKKwltZW1zZXQoJmNhbGliX2NmZ19jbWQsIDAsIHNpemVvZihjYWxpYl9jZmdfY21kKSk7CisJY2FsaWJfY2ZnX2NtZC51Y2RfY2FsaWJfY2ZnLm9uY2UuaXNfZW5hYmxlID0gSVdMX0NBTElCX0lOSVRfQ0ZHX0FMTDsKKwljYWxpYl9jZmdfY21kLnVjZF9jYWxpYl9jZmcub25jZS5zdGFydCA9IElXTF9DQUxJQl9JTklUX0NGR19BTEw7CisJY2FsaWJfY2ZnX2NtZC51Y2RfY2FsaWJfY2ZnLm9uY2Uuc2VuZF9yZXMgPSBJV0xfQ0FMSUJfSU5JVF9DRkdfQUxMOworCWNhbGliX2NmZ19jbWQudWNkX2NhbGliX2NmZy5mbGFncyA9CisJCUlXTF9DQUxJQl9DRkdfRkxBR19TRU5EX0NPTVBMRVRFX05URllfTVNLOworCisJcmV0dXJuIGl3bF90cmFuc19zZW5kX2NtZCh0cmFucywgJmNtZCk7Cit9CisKK2ludCBpd2xhZ25fcnhfY2FsaWJfcmVzdWx0KHN0cnVjdCBpd2xfcHJpdiAqcHJpdiwKKwkJCSAgICBzdHJ1Y3QgaXdsX3J4X21lbV9idWZmZXIgKnJ4YiwKKwkJCSAgICBzdHJ1Y3QgaXdsX2RldmljZV9jbWQgKmNtZCkKK3sKKwlzdHJ1Y3QgaXdsX3J4X3BhY2tldCAqcGt0ID0gcnhiX2FkZHIocnhiKTsKKwlzdHJ1Y3QgaXdsX2NhbGliX2hkciAqaGRyID0gKHN0cnVjdCBpd2xfY2FsaWJfaGRyICopcGt0LT51LnJhdzsKKwlpbnQgbGVuID0gbGUzMl90b19jcHUocGt0LT5sZW5fbl9mbGFncykgJiBGSF9SU0NTUl9GUkFNRV9TSVpFX01TSzsKKworCS8qIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgbGVuZ3RoIGZpZWxkIGl0c2VsZiAqLworCWxlbiAtPSA0OworCisJaWYgKGl3bF9jYWxpYl9zZXQodHJhbnMocHJpdiksIGhkciwgbGVuKSkKKwkJSVdMX0VSUihwcml2LCAiRmFpbGVkIHRvIHJlY29yZCBjYWxpYnJhdGlvbiBkYXRhICVkXG4iLAorCQkJaGRyLT5vcF9jb2RlKTsKKworCXJldHVybiAwOworfQorCitpbnQgaXdsX2luaXRfYWxpdmVfc3RhcnQoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJaW50IHJldDsKKworCWlmIChjZmcodHJhbnMpLT5idF9wYXJhbXMgJiYKKwkgICAgY2ZnKHRyYW5zKS0+YnRfcGFyYW1zLT5hZHZhbmNlZF9idF9jb2V4aXN0KSB7CisJCS8qCisJCSAqIFRlbGwgdUNvZGUgd2UgYXJlIHJlYWR5IHRvIHBlcmZvcm0gY2FsaWJyYXRpb24KKwkJICogbmVlZCB0byBwZXJmb3JtIHRoaXMgYmVmb3JlIGFueSBjYWxpYnJhdGlvbgorCQkgKiBubyBuZWVkIHRvIGNsb3NlIHRoZSBlbnZsb3BlIHNpbmNlIHdlIGFyZSBnb2luZworCQkgKiB0byBsb2FkIHRoZSBydW50aW1lIHVDb2RlIGxhdGVyLgorCQkgKi8KKwkJcmV0ID0gaXdsX3NlbmRfYnRfZW52KHRyYW5zLCBJV0xfQlRfQ09FWF9FTlZfT1BFTiwKKwkJCUJUX0NPRVhfUFJJT19UQkxfRVZUX0lOSVRfQ0FMSUIyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwl9CisKKwlyZXQgPSBpd2xfc2VuZF9jYWxpYl9jZmcodHJhbnMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKioKKwkgKiB0ZW1wZXJhdHVyZSBvZmZzZXQgY2FsaWJyYXRpb24gaXMgb25seSBuZWVkZWQgZm9yIHJ1bnRpbWUgdWNvZGUsCisJICogc28gcHJlcGFyZSB0aGUgdmFsdWUgbm93LgorCSAqLworCWlmIChjZmcodHJhbnMpLT5uZWVkX3RlbXBfb2Zmc2V0X2NhbGliKSB7CisJCWlmIChjZmcodHJhbnMpLT50ZW1wX29mZnNldF92MikKKwkJCXJldHVybiBpd2xfc2V0X3RlbXBlcmF0dXJlX29mZnNldF9jYWxpYl92Mih0cmFucyk7CisJCWVsc2UKKwkJCXJldHVybiBpd2xfc2V0X3RlbXBlcmF0dXJlX29mZnNldF9jYWxpYih0cmFucyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXdsX3NlbmRfd2ltYXhfY29leChzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgaXdsX3dpbWF4X2NvZXhfY21kIGNvZXhfY21kOworCisJaWYgKGNmZyh0cmFucyktPmJhc2VfcGFyYW1zLT5zdXBwb3J0X3dpbWF4X2NvZXhpc3QpIHsKKwkJLyogVW5NYXNrIHdha2UgdXAgc3JjIGF0IGFzc29jaWF0ZWQgc2xlZXAgKi8KKwkJY29leF9jbWQuZmxhZ3MgPSBDT0VYX0ZMQUdTX0FTU09DX1dBX1VOTUFTS19NU0s7CisKKwkJLyogVW5NYXNrIHdha2UgdXAgc3JjIGF0IHVuYXNzb2NpYXRlZCBzbGVlcCAqLworCQljb2V4X2NtZC5mbGFncyB8PSBDT0VYX0ZMQUdTX1VOQVNTT0NfV0FfVU5NQVNLX01TSzsKKwkJbWVtY3B5KGNvZXhfY21kLnN0YV9wcmlvLCBjdV9wcmlvcml0aWVzLAorCQkJc2l6ZW9mKHN0cnVjdCBpd2xfd2ltYXhfY29leF9ldmVudF9lbnRyeSkgKgorCQkJIENPRVhfTlVNX09GX0VWRU5UUyk7CisKKwkJLyogZW5hYmxpbmcgdGhlIGNvZXhpc3RlbmNlIGZlYXR1cmUgKi8KKwkJY29leF9jbWQuZmxhZ3MgfD0gQ09FWF9GTEFHU19DT0VYX0VOQUJMRV9NU0s7CisKKwkJLyogZW5hYmxpbmcgdGhlIHByaW9yaXRpZXMgdGFibGVzICovCisJCWNvZXhfY21kLmZsYWdzIHw9IENPRVhfRkxBR1NfU1RBX1RBQkxFX1ZBTElEX01TSzsKKwl9IGVsc2UgeworCQkvKiBjb2V4aXN0ZW5jZSBpcyBkaXNhYmxlZCAqLworCQltZW1zZXQoJmNvZXhfY21kLCAwLCBzaXplb2YoY29leF9jbWQpKTsKKwl9CisJcmV0dXJuIGl3bF90cmFuc19zZW5kX2NtZF9wZHUodHJhbnMsCisJCQkJQ09FWF9QUklPUklUWV9UQUJMRV9DTUQsIENNRF9TWU5DLAorCQkJCXNpemVvZihjb2V4X2NtZCksICZjb2V4X2NtZCk7Cit9CisKK3N0YXRpYyBjb25zdCB1OCBpd2xfYnRfcHJpb190YmxbQlRfQ09FWF9QUklPX1RCTF9FVlRfTUFYXSA9IHsKKwkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19CWVBBU1MgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKKwkJKDAgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCisJKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fQllQQVNTIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1BSSU9fUE9TKSB8CisJCSgxIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1NIQVJFRF9BTlRFTk5BX1BPUykpLAorCSgoQlRfQ09FWF9QUklPX1RCTF9QUklPX0xPVyA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAorCQkoMCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKKwkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19MT1cgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfUFJJT19QT1MpIHwKKwkJKDEgPDwgSVdMX0JUX0NPRVhfUFJJT19UQkxfU0hBUkVEX0FOVEVOTkFfUE9TKSksCisJKChCVF9DT0VYX1BSSU9fVEJMX1BSSU9fSElHSCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAorCQkoMCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKKwkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19ISUdIIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1BSSU9fUE9TKSB8CisJCSgxIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1NIQVJFRF9BTlRFTk5BX1BPUykpLAorCSgoQlRfQ09FWF9QUklPX1RCTF9QUklPX0JZUEFTUyA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAorCQkoMCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKKwkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19DT0VYX09GRiA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9QUklPX1BPUykgfAorCQkoMCA8PCBJV0xfQlRfQ09FWF9QUklPX1RCTF9TSEFSRURfQU5URU5OQV9QT1MpKSwKKwkoKEJUX0NPRVhfUFJJT19UQkxfUFJJT19DT0VYX09OIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1BSSU9fUE9TKSB8CisJCSgwIDw8IElXTF9CVF9DT0VYX1BSSU9fVEJMX1NIQVJFRF9BTlRFTk5BX1BPUykpLAorCTAsIDAsIDAsIDAsIDAsIDAsIDAKK307CisKK3ZvaWQgaXdsX3NlbmRfcHJpb190Ymwoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGl3bF9idF9jb2V4X3ByaW9fdGFibGVfY21kIHByaW9fdGJsX2NtZDsKKworCW1lbWNweShwcmlvX3RibF9jbWQucHJpb190YmwsIGl3bF9idF9wcmlvX3RibCwKKwkJc2l6ZW9mKGl3bF9idF9wcmlvX3RibCkpOworCWlmIChpd2xfdHJhbnNfc2VuZF9jbWRfcGR1KHRyYW5zLAorCQkJCVJFUExZX0JUX0NPRVhfUFJJT19UQUJMRSwgQ01EX1NZTkMsCisJCQkJc2l6ZW9mKHByaW9fdGJsX2NtZCksICZwcmlvX3RibF9jbWQpKQorCQlJV0xfRVJSKHRyYW5zLCAiZmFpbGVkIHRvIHNlbmQgQlQgcHJpbyB0YmwgY29tbWFuZFxuIik7Cit9CisKK2ludCBpd2xfc2VuZF9idF9lbnYoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsIHU4IGFjdGlvbiwgdTggdHlwZSkKK3sKKwlzdHJ1Y3QgaXdsX2J0X2NvZXhfcHJvdF9lbnZfY21kIGVudl9jbWQ7CisJaW50IHJldDsKKworCWVudl9jbWQuYWN0aW9uID0gYWN0aW9uOworCWVudl9jbWQudHlwZSA9IHR5cGU7CisJcmV0ID0gaXdsX3RyYW5zX3NlbmRfY21kX3BkdSh0cmFucywKKwkJCSAgICAgICBSRVBMWV9CVF9DT0VYX1BST1RfRU5WLCBDTURfU1lOQywKKwkJCSAgICAgICBzaXplb2YoZW52X2NtZCksICZlbnZfY21kKTsKKwlpZiAocmV0KQorCQlJV0xfRVJSKHRyYW5zLCAiZmFpbGVkIHRvIHNlbmQgQlQgZW52IGNvbW1hbmRcbiIpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIGludCBpd2xfYWxpdmVfbm90aWZ5KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBpd2xfcHJpdiAqcHJpdiA9IHByaXYodHJhbnMpOworCXN0cnVjdCBpd2xfcnhvbl9jb250ZXh0ICpjdHg7CisJaW50IHJldDsKKworCWlmICghcHJpdi0+dHhfY21kX3Bvb2wpCisJCXByaXYtPnR4X2NtZF9wb29sID0KKwkJCWttZW1fY2FjaGVfY3JlYXRlKCJpd2xfZGV2X2NtZCIsCisJCQkJCSAgc2l6ZW9mKHN0cnVjdCBpd2xfZGV2aWNlX2NtZCksCisJCQkJCSAgc2l6ZW9mKHZvaWQgKiksIDAsIE5VTEwpOworCisJaWYgKCFwcml2LT50eF9jbWRfcG9vbCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpd2xfdHJhbnNfdHhfc3RhcnQodHJhbnMpOworCWZvcl9lYWNoX2NvbnRleHQocHJpdiwgY3R4KQorCQljdHgtPmxhc3RfdHhfcmVqZWN0ZWQgPSBmYWxzZTsKKworCXJldCA9IGl3bF9zZW5kX3dpbWF4X2NvZXgodHJhbnMpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIWNmZyhwcml2KS0+bm9feHRhbF9jYWxpYikgeworCQlyZXQgPSBpd2xfc2V0X1h0YWxfY2FsaWIodHJhbnMpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gaXdsX3NlbmRfY2FsaWJfcmVzdWx0cyh0cmFucyk7Cit9CisKKworLyoqCisgKiBpd2xfdmVyaWZ5X2luc3Rfc3BhcnNlIC0gdmVyaWZ5IHJ1bnRpbWUgdUNvZGUgaW1hZ2UgaW4gY2FyZCB2cy4gaG9zdCwKKyAqICAgdXNpbmcgc2FtcGxlIGRhdGEgMTAwIGJ5dGVzIGFwYXJ0LiAgSWYgdGhlc2Ugc2FtcGxlIHBvaW50cyBhcmUgZ29vZCwKKyAqICAgaXQncyBhIHByZXR0eSBnb29kIGJldCB0aGF0IGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGVtIGlzIGdvb2QsIHRvby4KKyAqLworc3RhdGljIGludCBpd2xfdmVyaWZ5X2luc3Rfc3BhcnNlKHN0cnVjdCBpd2xfYnVzICpidXMsCisJCQkJICAgICAgc3RydWN0IGZ3X2Rlc2MgKmZ3X2Rlc2MpCit7CisJX19sZTMyICppbWFnZSA9IChfX2xlMzIgKilmd19kZXNjLT52X2FkZHI7CisJdTMyIGxlbiA9IGZ3X2Rlc2MtPmxlbjsKKwl1MzIgdmFsOworCXUzMiBpOworCisJSVdMX0RFQlVHX0ZXKGJ1cywgInVjb2RlIGluc3QgaW1hZ2Ugc2l6ZSBpcyAldVxuIiwgbGVuKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMTAwLCBpbWFnZSArPSAxMDAvc2l6ZW9mKHUzMikpIHsKKwkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCisJCS8qIE5PVEU6IFVzZSB0aGUgZGVidWdsZXNzIHJlYWQgc28gd2UgZG9uJ3QgZmxvb2Qga2VybmVsIGxvZworCQkgKiBpZiBJV0xfRExfSU8gaXMgc2V0ICovCisJCWl3bF93cml0ZV9kaXJlY3QzMihidXMsIEhCVVNfVEFSR19NRU1fUkFERFIsCisJCQlpICsgSVdMQUdOX1JUQ19JTlNUX0xPV0VSX0JPVU5EKTsKKwkJdmFsID0gaXdsX3JlYWQzMihidXMsIEhCVVNfVEFSR19NRU1fUkRBVCk7CisJCWlmICh2YWwgIT0gbGUzMl90b19jcHUoKmltYWdlKSkKKwkJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpd2xfcHJpbnRfbWlzbWF0Y2hfaW5zdChzdHJ1Y3QgaXdsX2J1cyAqYnVzLAorCQkJCSAgICBzdHJ1Y3QgZndfZGVzYyAqZndfZGVzYykKK3sKKwlfX2xlMzIgKmltYWdlID0gKF9fbGUzMiAqKWZ3X2Rlc2MtPnZfYWRkcjsKKwl1MzIgbGVuID0gZndfZGVzYy0+bGVuOworCXUzMiB2YWw7CisJdTMyIG9mZnM7CisJaW50IGVycm9ycyA9IDA7CisKKwlJV0xfREVCVUdfRlcoYnVzLCAidWNvZGUgaW5zdCBpbWFnZSBzaXplIGlzICV1XG4iLCBsZW4pOworCisJaXdsX3dyaXRlX2RpcmVjdDMyKGJ1cywgSEJVU19UQVJHX01FTV9SQUREUiwKKwkJCSAgIElXTEFHTl9SVENfSU5TVF9MT1dFUl9CT1VORCk7CisKKwlmb3IgKG9mZnMgPSAwOworCSAgICAgb2ZmcyA8IGxlbiAmJiBlcnJvcnMgPCAyMDsKKwkgICAgIG9mZnMgKz0gc2l6ZW9mKHUzMiksIGltYWdlKyspIHsKKwkJLyogcmVhZCBkYXRhIGNvbWVzIHRocm91Z2ggc2luZ2xlIHBvcnQsIGF1dG8taW5jciBhZGRyICovCisJCXZhbCA9IGl3bF9yZWFkMzIoYnVzLCBIQlVTX1RBUkdfTUVNX1JEQVQpOworCQlpZiAodmFsICE9IGxlMzJfdG9fY3B1KCppbWFnZSkpIHsKKwkJCUlXTF9FUlIoYnVzLCAidUNvZGUgSU5TVCBzZWN0aW9uIGF0ICIKKwkJCQkib2Zmc2V0IDB4JXgsIGlzIDB4JXgsIHMvYiAweCV4XG4iLAorCQkJCW9mZnMsIHZhbCwgbGUzMl90b19jcHUoKmltYWdlKSk7CisJCQllcnJvcnMrKzsKKwkJfQorCX0KK30KKworLyoqCisgKiBpd2xfdmVyaWZ5X3Vjb2RlIC0gZGV0ZXJtaW5lIHdoaWNoIGluc3RydWN0aW9uIGltYWdlIGlzIGluIFNSQU0sCisgKiAgICBhbmQgdmVyaWZ5IGl0cyBjb250ZW50cworICovCitzdGF0aWMgaW50IGl3bF92ZXJpZnlfdWNvZGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkgICAgZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKQoreworCXN0cnVjdCBmd19pbWcgKmltZyA9IGl3bF9nZXRfdWNvZGVfaW1hZ2UodHJhbnMsIHVjb2RlX3R5cGUpOworCisJaWYgKCFpbWcpIHsKKwkJSVdMX0VSUih0cmFucywgIkludmFsaWQgdWNvZGUgcmVxdWVzdGVkICglZClcbiIsIHVjb2RlX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWl3bF92ZXJpZnlfaW5zdF9zcGFyc2UoYnVzKHRyYW5zKSwgJmltZy0+Y29kZSkpIHsKKwkJSVdMX0RFQlVHX0ZXKHRyYW5zLCAidUNvZGUgaXMgZ29vZCBpbiBpbnN0IFNSQU1cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlJV0xfRVJSKHRyYW5zLCAiVUNPREUgSU1BR0UgSU4gSU5TVFJVQ1RJT04gU1JBTSBOT1QgVkFMSUQhIVxuIik7CisKKwlpd2xfcHJpbnRfbWlzbWF0Y2hfaW5zdChidXModHJhbnMpLCAmaW1nLT5jb2RlKTsKKwlyZXR1cm4gLUVJTzsKK30KKworc3RydWN0IGl3bF9hbGl2ZV9kYXRhIHsKKwlib29sIHZhbGlkOworCXU4IHN1YnR5cGU7Cit9OworCitzdGF0aWMgdm9pZCBpd2xfYWxpdmVfZm4oc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkgICAgc3RydWN0IGl3bF9yeF9wYWNrZXQgKnBrdCwKKwkJCSAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpd2xfYWxpdmVfZGF0YSAqYWxpdmVfZGF0YSA9IGRhdGE7CisJc3RydWN0IGl3bF9hbGl2ZV9yZXNwICpwYWxpdmU7CisKKwlwYWxpdmUgPSAmcGt0LT51LmFsaXZlX2ZyYW1lOworCisJSVdMX0RFQlVHX0ZXKHRyYW5zLCAiQWxpdmUgdWNvZGUgc3RhdHVzIDB4JTA4WCByZXZpc2lvbiAiCisJCSAgICAgICAiMHglMDFYIDB4JTAxWFxuIiwKKwkJICAgICAgIHBhbGl2ZS0+aXNfdmFsaWQsIHBhbGl2ZS0+dmVyX3R5cGUsCisJCSAgICAgICBwYWxpdmUtPnZlcl9zdWJ0eXBlKTsKKworCXRyYW5zLT5zaHJkLT5kZXZpY2VfcG9pbnRlcnMuZXJyb3JfZXZlbnRfdGFibGUgPQorCQlsZTMyX3RvX2NwdShwYWxpdmUtPmVycm9yX2V2ZW50X3RhYmxlX3B0cik7CisJdHJhbnMtPnNocmQtPmRldmljZV9wb2ludGVycy5sb2dfZXZlbnRfdGFibGUgPQorCQlsZTMyX3RvX2NwdShwYWxpdmUtPmxvZ19ldmVudF90YWJsZV9wdHIpOworCisJYWxpdmVfZGF0YS0+c3VidHlwZSA9IHBhbGl2ZS0+dmVyX3N1YnR5cGU7CisJYWxpdmVfZGF0YS0+dmFsaWQgPSBwYWxpdmUtPmlzX3ZhbGlkID09IFVDT0RFX1ZBTElEX09LOworfQorCisvKiBub3RpZmljYXRpb24gd2FpdCBzdXBwb3J0ICovCit2b2lkIGl3bF9pbml0X25vdGlmaWNhdGlvbl93YWl0KHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkLAorCQkJCSAgIHN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgKndhaXRfZW50cnksCisJCQkJICAgdTggY21kLAorCQkJCSAgIHZvaWQgKCpmbikoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJCSAgICAgIHN0cnVjdCBpd2xfcnhfcGFja2V0ICpwa3QsCisJCQkJCSAgICAgIHZvaWQgKmRhdGEpLAorCQkJCSAgIHZvaWQgKmZuX2RhdGEpCit7CisJd2FpdF9lbnRyeS0+Zm4gPSBmbjsKKwl3YWl0X2VudHJ5LT5mbl9kYXRhID0gZm5fZGF0YTsKKwl3YWl0X2VudHJ5LT5jbWQgPSBjbWQ7CisJd2FpdF9lbnRyeS0+dHJpZ2dlcmVkID0gZmFsc2U7CisJd2FpdF9lbnRyeS0+YWJvcnRlZCA9IGZhbHNlOworCisJc3Bpbl9sb2NrX2JoKCZzaHJkLT5ub3RpZl93YWl0X2xvY2spOworCWxpc3RfYWRkKCZ3YWl0X2VudHJ5LT5saXN0LCAmc2hyZC0+bm90aWZfd2FpdHMpOworCXNwaW5fdW5sb2NrX2JoKCZzaHJkLT5ub3RpZl93YWl0X2xvY2spOworfQorCitpbnQgaXdsX3dhaXRfbm90aWZpY2F0aW9uKHN0cnVjdCBpd2xfc2hhcmVkICpzaHJkLAorCQkJICAgICBzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5LAorCQkJICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJaW50IHJldDsKKworCXJldCA9IHdhaXRfZXZlbnRfdGltZW91dChzaHJkLT5ub3RpZl93YWl0cSwKKwkJCQkgd2FpdF9lbnRyeS0+dHJpZ2dlcmVkIHx8IHdhaXRfZW50cnktPmFib3J0ZWQsCisJCQkJIHRpbWVvdXQpOworCisJc3Bpbl9sb2NrX2JoKCZzaHJkLT5ub3RpZl93YWl0X2xvY2spOworCWxpc3RfZGVsKCZ3YWl0X2VudHJ5LT5saXN0KTsKKwlzcGluX3VubG9ja19iaCgmc2hyZC0+bm90aWZfd2FpdF9sb2NrKTsKKworCWlmICh3YWl0X2VudHJ5LT5hYm9ydGVkKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIHJldHVybiB2YWx1ZSBpcyBhbHdheXMgPj0gMCAqLworCWlmIChyZXQgPD0gMCkKKwkJcmV0dXJuIC1FVElNRURPVVQ7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgaXdsX3JlbW92ZV9ub3RpZmljYXRpb24oc3RydWN0IGl3bF9zaGFyZWQgKnNocmQsCisJCQkJc3RydWN0IGl3bF9ub3RpZmljYXRpb25fd2FpdCAqd2FpdF9lbnRyeSkKK3sKKwlzcGluX2xvY2tfYmgoJnNocmQtPm5vdGlmX3dhaXRfbG9jayk7CisJbGlzdF9kZWwoJndhaXRfZW50cnktPmxpc3QpOworCXNwaW5fdW5sb2NrX2JoKCZzaHJkLT5ub3RpZl93YWl0X2xvY2spOworfQorCit2b2lkIGl3bF9hYm9ydF9ub3RpZmljYXRpb25fd2FpdHMoc3RydWN0IGl3bF9zaGFyZWQgKnNocmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0ICp3YWl0X2VudHJ5OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnNocmQtPm5vdGlmX3dhaXRfbG9jaywgZmxhZ3MpOworCWxpc3RfZm9yX2VhY2hfZW50cnkod2FpdF9lbnRyeSwgJnNocmQtPm5vdGlmX3dhaXRzLCBsaXN0KQorCQl3YWl0X2VudHJ5LT5hYm9ydGVkID0gdHJ1ZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzaHJkLT5ub3RpZl93YWl0X2xvY2ssIGZsYWdzKTsKKworCXdha2VfdXBfYWxsKCZzaHJkLT5ub3RpZl93YWl0cSk7Cit9CisKKyNkZWZpbmUgVUNPREVfQUxJVkVfVElNRU9VVAlIWgorI2RlZmluZSBVQ09ERV9DQUxJQl9USU1FT1VUCSgyKkhaKQorCitpbnQgaXdsX2xvYWRfdWNvZGVfd2FpdF9hbGl2ZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywKKwkJCQkgZW51bSBpd2xfdWNvZGVfdHlwZSB1Y29kZV90eXBlKQoreworCXN0cnVjdCBpd2xfbm90aWZpY2F0aW9uX3dhaXQgYWxpdmVfd2FpdDsKKwlzdHJ1Y3QgaXdsX2FsaXZlX2RhdGEgYWxpdmVfZGF0YTsKKwlpbnQgcmV0OworCWVudW0gaXdsX3Vjb2RlX3R5cGUgb2xkX3R5cGU7CisKKwlyZXQgPSBpd2xfdHJhbnNfc3RhcnRfZGV2aWNlKHRyYW5zKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJaXdsX2luaXRfbm90aWZpY2F0aW9uX3dhaXQodHJhbnMtPnNocmQsICZhbGl2ZV93YWl0LCBSRVBMWV9BTElWRSwKKwkJCQkgICAgICBpd2xfYWxpdmVfZm4sICZhbGl2ZV9kYXRhKTsKKworCW9sZF90eXBlID0gdHJhbnMtPnNocmQtPnVjb2RlX3R5cGU7CisJdHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPSB1Y29kZV90eXBlOworCisJcmV0ID0gaXdsX2xvYWRfZ2l2ZW5fdWNvZGUodHJhbnMsIHVjb2RlX3R5cGUpOworCWlmIChyZXQpIHsKKwkJdHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPSBvbGRfdHlwZTsKKwkJaXdsX3JlbW92ZV9ub3RpZmljYXRpb24odHJhbnMtPnNocmQsICZhbGl2ZV93YWl0KTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpd2xfdHJhbnNfa2lja19uaWModHJhbnMpOworCisJLyoKKwkgKiBTb21lIHRoaW5ncyBtYXkgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIG5vdywgYnV0IHdlCisJICoganVzdCB3YWl0IGZvciB0aGUgQUxJVkUgbm90aWZpY2F0aW9uIGhlcmUuCisJICovCisJcmV0ID0gaXdsX3dhaXRfbm90aWZpY2F0aW9uKHRyYW5zLT5zaHJkLCAmYWxpdmVfd2FpdCwKKwkJCQkJVUNPREVfQUxJVkVfVElNRU9VVCk7CisJaWYgKHJldCkgeworCQl0cmFucy0+c2hyZC0+dWNvZGVfdHlwZSA9IG9sZF90eXBlOworCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghYWxpdmVfZGF0YS52YWxpZCkgeworCQlJV0xfRVJSKHRyYW5zLCAiTG9hZGVkIHVjb2RlIGlzIG5vdCB2YWxpZCFcbiIpOworCQl0cmFucy0+c2hyZC0+dWNvZGVfdHlwZSA9IG9sZF90eXBlOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqIFRoaXMgc3RlcCB0YWtlcyBhIGxvbmcgdGltZSAoNjAtODBtcyEhKSBhbmQKKwkgKiBXb1dMQU4gaW1hZ2Ugc2hvdWxkIGJlIGxvYWRlZCBxdWlja2x5LCBzbworCSAqIHNraXAgaXQgZm9yIFdvV0xBTi4KKwkgKi8KKwlpZiAodWNvZGVfdHlwZSAhPSBJV0xfVUNPREVfV09XTEFOKSB7CisJCXJldCA9IGl3bF92ZXJpZnlfdWNvZGUodHJhbnMsIHVjb2RlX3R5cGUpOworCQlpZiAocmV0KSB7CisJCQl0cmFucy0+c2hyZC0+dWNvZGVfdHlwZSA9IG9sZF90eXBlOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCS8qIGRlbGF5IGEgYml0IHRvIGdpdmUgcmZraWxsIHRpbWUgdG8gcnVuICovCisJCW1zbGVlcCg1KTsKKwl9CisKKwlyZXQgPSBpd2xfYWxpdmVfbm90aWZ5KHRyYW5zKTsKKwlpZiAocmV0KSB7CisJCUlXTF9XQVJOKHRyYW5zLAorCQkJIkNvdWxkIG5vdCBjb21wbGV0ZSBBTElWRSB0cmFuc2l0aW9uOiAlZFxuIiwgcmV0KTsKKwkJdHJhbnMtPnNocmQtPnVjb2RlX3R5cGUgPSBvbGRfdHlwZTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGl3bF9ydW5faW5pdF91Y29kZShzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucykKK3sKKwlzdHJ1Y3QgaXdsX25vdGlmaWNhdGlvbl93YWl0IGNhbGliX3dhaXQ7CisJaW50IHJldDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnRyYW5zLT5zaHJkLT5tdXRleCk7CisKKwkvKiBObyBpbml0IHVjb2RlIHJlcXVpcmVkPyBDdXJpb3VzLCBidXQgbWF5YmUgb2sgKi8KKwlpZiAoIXRyYW5zLT51Y29kZV9pbml0LmNvZGUubGVuKQorCQlyZXR1cm4gMDsKKworCWlmICh0cmFucy0+c2hyZC0+dWNvZGVfdHlwZSAhPSBJV0xfVUNPREVfTk9ORSkKKwkJcmV0dXJuIDA7CisKKwlpd2xfaW5pdF9ub3RpZmljYXRpb25fd2FpdCh0cmFucy0+c2hyZCwgJmNhbGliX3dhaXQsCisJCQkJICAgICAgQ0FMSUJSQVRJT05fQ09NUExFVEVfTk9USUZJQ0FUSU9OLAorCQkJCSAgICAgIE5VTEwsIE5VTEwpOworCisJLyogV2lsbCBhbHNvIHN0YXJ0IHRoZSBkZXZpY2UgKi8KKwlyZXQgPSBpd2xfbG9hZF91Y29kZV93YWl0X2FsaXZlKHRyYW5zLCBJV0xfVUNPREVfSU5JVCk7CisJaWYgKHJldCkKKwkJZ290byBlcnJvcjsKKworCXJldCA9IGl3bF9pbml0X2FsaXZlX3N0YXJ0KHRyYW5zKTsKKwlpZiAocmV0KQorCQlnb3RvIGVycm9yOworCisJLyoKKwkgKiBTb21lIHRoaW5ncyBtYXkgcnVuIGluIHRoZSBiYWNrZ3JvdW5kIG5vdywgYnV0IHdlCisJICoganVzdCB3YWl0IGZvciB0aGUgY2FsaWJyYXRpb24gY29tcGxldGUgbm90aWZpY2F0aW9uLgorCSAqLworCXJldCA9IGl3bF93YWl0X25vdGlmaWNhdGlvbih0cmFucy0+c2hyZCwgJmNhbGliX3dhaXQsCisJCQkJCVVDT0RFX0NBTElCX1RJTUVPVVQpOworCisJZ290byBvdXQ7CisKKyBlcnJvcjoKKwlpd2xfcmVtb3ZlX25vdGlmaWNhdGlvbih0cmFucy0+c2hyZCwgJmNhbGliX3dhaXQpOworIG91dDoKKwkvKiBXaGF0ZXZlciBoYXBwZW5lZCwgc3RvcCB0aGUgZGV2aWNlICovCisJaXdsX3RyYW5zX3N0b3BfZGV2aWNlKHRyYW5zKTsKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtY2FsaWIuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bHdpZmkvaXdsLXdpZmkuaApzaW1pbGFyaXR5IGluZGV4IDg1JQpyZW5hbWUgZnJvbSBkcml2ZXJzL25ldC93aXJlbGVzcy9pd2xlZ2FjeS9pd2wtNDk2NS1jYWxpYi5oCnJlbmFtZSB0byBkcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC13aWZpLmgKaW5kZXggZjQ2YzgwZS4uMTg1MDExMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdsZWdhY3kvaXdsLTQ5NjUtY2FsaWIuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd2x3aWZpL2l3bC13aWZpLmgKQEAgLTU5LDE3ICs1OSwxNiBAQAogICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBfX2l3bF80OTY1X2NhbGliX2hfXwotI2RlZmluZSBfX2l3bF80OTY1X2NhbGliX2hfXwogCi0jaW5jbHVkZSAiaXdsLWRldi5oIgotI2luY2x1ZGUgIml3bC1jb3JlLmgiCi0jaW5jbHVkZSAiaXdsLWNvbW1hbmRzLmgiCisjaWZuZGVmIF9faXdsX3dpZmlfaF9fCisjZGVmaW5lIF9faXdsX3dpZmlfaF9fCiAKLXZvaWQgaXdsNDk2NV9jaGFpbl9ub2lzZV9jYWxpYnJhdGlvbihzdHJ1Y3QgaXdsX3ByaXYgKnByaXYsIHZvaWQgKnN0YXRfcmVzcCk7Ci12b2lkIGl3bDQ5NjVfc2Vuc2l0aXZpdHlfY2FsaWJyYXRpb24oc3RydWN0IGl3bF9wcml2ICpwcml2LCB2b2lkICpyZXNwKTsKLXZvaWQgaXdsNDk2NV9pbml0X3NlbnNpdGl2aXR5KHN0cnVjdCBpd2xfcHJpdiAqcHJpdik7Ci12b2lkIGl3bDQ5NjVfcmVzZXRfcnVuX3RpbWVfY2FsaWIoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKLXZvaWQgaXdsNDk2NV9jYWxpYl9mcmVlX3Jlc3VsdHMoc3RydWN0IGl3bF9wcml2ICpwcml2KTsKKyNpbmNsdWRlICJpd2wtc2hhcmVkLmgiCiAKLSNlbmRpZiAvKiBfX2l3bF80OTY1X2NhbGliX2hfXyAqLworaW50IGl3bF9zZW5kX2J0X2VudihzdHJ1Y3QgaXdsX3RyYW5zICp0cmFucywgdTggYWN0aW9uLCB1OCB0eXBlKTsKK3ZvaWQgaXdsX3NlbmRfcHJpb190Ymwoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOworaW50IGl3bF9pbml0X2FsaXZlX3N0YXJ0KHN0cnVjdCBpd2xfdHJhbnMgKnRyYW5zKTsKK2ludCBpd2xfcnVuX2luaXRfdWNvZGUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMpOworaW50IGl3bF9sb2FkX3Vjb2RlX3dhaXRfYWxpdmUoc3RydWN0IGl3bF90cmFucyAqdHJhbnMsCisJCQkJIGVudW0gaXdsX3Vjb2RlX3R5cGUgdWNvZGVfdHlwZSk7CisjZW5kaWYgIC8qIF9faXdsX3dpZmlfaF9fICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvY2ZnODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jZmc4MDIxMS5jCmluZGV4IGM0MmJlODEuLjQ4ZTgyMTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jZmc4MDIxMS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9jZmc4MDIxMS5jCkBAIC0xNjUsMTEgKzE2NSwxNSBAQAogCQkJCXN0cnVjdCBrZXlfcGFyYW1zICpwYXJhbXMpCiB7CiAJc3RydWN0IGl3bV9wcml2ICppd20gPSBuZGV2X3RvX2l3bShuZGV2KTsKLQlzdHJ1Y3QgaXdtX2tleSAqa2V5ID0gJml3bS0+a2V5c1trZXlfaW5kZXhdOworCXN0cnVjdCBpd21fa2V5ICprZXk7CiAJaW50IHJldDsKIAogCUlXTV9EQkdfV0VYVChpd20sIERCRywgIkFkZGluZyBrZXkgZm9yICVwTVxuIiwgbWFjX2FkZHIpOwogCisJaWYgKGtleV9pbmRleCA+PSBJV01fTlVNX0tFWVMpCisJCXJldHVybiAtRU5PRU5UOworCisJa2V5ID0gJml3bS0+a2V5c1trZXlfaW5kZXhdOwogCW1lbXNldChrZXksIDAsIHNpemVvZihzdHJ1Y3QgaXdtX2tleSkpOwogCXJldCA9IGl3bV9rZXlfaW5pdChrZXksIGtleV9pbmRleCwgbWFjX2FkZHIsIHBhcmFtcyk7CiAJaWYgKHJldCA8IDApIHsKQEAgLTIxNCw4ICsyMTgsMTIgQEAKIAkJCQl1OCBrZXlfaW5kZXgsIGJvb2wgcGFpcndpc2UsIGNvbnN0IHU4ICptYWNfYWRkcikKIHsKIAlzdHJ1Y3QgaXdtX3ByaXYgKml3bSA9IG5kZXZfdG9faXdtKG5kZXYpOwotCXN0cnVjdCBpd21fa2V5ICprZXkgPSAmaXdtLT5rZXlzW2tleV9pbmRleF07CisJc3RydWN0IGl3bV9rZXkgKmtleTsKIAorCWlmIChrZXlfaW5kZXggPj0gSVdNX05VTV9LRVlTKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWtleSA9ICZpd20tPmtleXNba2V5X2luZGV4XTsKIAlpZiAoIWl3bS0+a2V5c1trZXlfaW5kZXhdLmtleV9sZW4pIHsKIAkJSVdNX0RCR19XRVhUKGl3bSwgREJHLCAiS2V5ICVkIG5vdCB1c2VkXG4iLCBrZXlfaW5kZXgpOwogCQlyZXR1cm4gMDsKQEAgLTIzNiw2ICsyNDQsOSBAQAogCiAJSVdNX0RCR19XRVhUKGl3bSwgREJHLCAiRGVmYXVsdCBrZXkgaW5kZXggaXM6ICVkXG4iLCBrZXlfaW5kZXgpOwogCisJaWYgKGtleV9pbmRleCA+PSBJV01fTlVNX0tFWVMpCisJCXJldHVybiAtRU5PRU5UOworCiAJaWYgKCFpd20tPmtleXNba2V5X2luZGV4XS5rZXlfbGVuKSB7CiAJCUlXTV9FUlIoaXdtLCAiS2V5ICVkIG5vdCB1c2VkXG4iLCBrZXlfaW5kZXgpOwogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9pd21jMzIwMHdpZmkvbWFpbi5jCmluZGV4IDk4YTE3OWYuLjFmODY4YjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL21haW4uYwpAQCAtOTEsMTEgKzkxLDExIEBACiAJLm1hY19hZGRyCQk9IHsweDAwLCAweDAyLCAweGIzLCAweDAxLCAweDAyLCAweDAzfSwKIH07CiAKLXN0YXRpYyBpbnQgbW9kcGFyYW1fcmVzZXQ7CitzdGF0aWMgYm9vbCBtb2RwYXJhbV9yZXNldDsKIG1vZHVsZV9wYXJhbV9uYW1lZChyZXNldCwgbW9kcGFyYW1fcmVzZXQsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhyZXNldCwgInJlc2V0IG9uIGZpcm13YXJlIGVycm9ycyAoZGVmYXVsdCAwIFtub3QgcmVzZXRdKSIpOwogCi1zdGF0aWMgaW50IG1vZHBhcmFtX3dpbWF4X2VuYWJsZSA9IDE7CitzdGF0aWMgYm9vbCBtb2RwYXJhbV93aW1heF9lbmFibGUgPSB0cnVlOwogbW9kdWxlX3BhcmFtX25hbWVkKHdpbWF4X2VuYWJsZSwgbW9kcGFyYW1fd2ltYXhfZW5hYmxlLCBib29sLCAwNjQ0KTsKIE1PRFVMRV9QQVJNX0RFU0Mod2ltYXhfZW5hYmxlLCAiRW5hYmxlIHdpbWF4IGNvcmUgKGRlZmF1bHQgMSBbd2ltYXggZW5hYmxlZF0pIik7CiAKQEAgLTEzMCw3ICsxMzAsNyBAQAogCQlpd21faW52YWxpZGF0ZV9tbG1lX3Byb2ZpbGUoaXdtKTsKIAogCWNsZWFyX2JpdChJV01fU1RBVFVTX0FTU09DSUFURUQsICZpd20tPnN0YXR1cyk7Ci0JaXdtLT51bWFjX3Byb2ZpbGVfYWN0aXZlID0gMDsKKwlpd20tPnVtYWNfcHJvZmlsZV9hY3RpdmUgPSBmYWxzZTsKIAltZW1zZXQoaXdtLT5ic3NpZCwgMCwgRVRIX0FMRU4pOwogCWl3bS0+Y2hhbm5lbCA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2l3bWMzMjAwd2lmaS9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3J4LmMKaW5kZXggYTQxNDc2OC4uN2Q3MDhmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3J4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvaXdtYzMyMDB3aWZpL3J4LmMKQEAgLTY2MCw3ICs2NjAsNyBAQAogCWNsZWFyX2JpdChJV01fU1RBVFVTX1NNRV9DT05ORUNUSU5HLCAmaXdtLT5zdGF0dXMpOwogCWNsZWFyX2JpdChJV01fU1RBVFVTX0FTU09DSUFURUQsICZpd20tPnN0YXR1cyk7CiAKLQlpd20tPnVtYWNfcHJvZmlsZV9hY3RpdmUgPSAwOworCWl3bS0+dW1hY19wcm9maWxlX2FjdGl2ZSA9IGZhbHNlOwogCW1lbXNldChpd20tPmJzc2lkLCAwLCBFVEhfQUxFTik7CiAJaXdtLT5jaGFubmVsID0gMDsKIApAQCAtNzM1LDcgKzczNSw3IEBACiAJCQkgICAgIHVtYWNfc3RhLT5tYWNfYWRkciwKIAkJCSAgICAgdW1hY19zdGEtPmZsYWdzICYgVU1BQ19TVEFfRkxBR19RT1MpOwogCi0JCXN0YS0+dmFsaWQgPSAxOworCQlzdGEtPnZhbGlkID0gdHJ1ZTsKIAkJc3RhLT5xb3MgPSB1bWFjX3N0YS0+ZmxhZ3MgJiBVTUFDX1NUQV9GTEFHX1FPUzsKIAkJc3RhLT5jb2xvciA9IEdFVF9WQUw4KHVtYWNfc3RhLT5zdGFfaWQsIExNQUNfU1RBX0NPTE9SKTsKIAkJbWVtY3B5KHN0YS0+YWRkciwgdW1hY19zdGEtPm1hY19hZGRyLCBFVEhfQUxFTik7CkBAIC03NTAsMTIgKzc1MCwxMiBAQAogCQlzdGEgPSAmaXdtLT5zdGFfdGFibGVbR0VUX1ZBTDgodW1hY19zdGEtPnN0YV9pZCwgTE1BQ19TVEFfSUQpXTsKIAogCQlpZiAoIW1lbWNtcChzdGEtPmFkZHIsIHVtYWNfc3RhLT5tYWNfYWRkciwgRVRIX0FMRU4pKQotCQkJc3RhLT52YWxpZCA9IDA7CisJCQlzdGEtPnZhbGlkID0gZmFsc2U7CiAKIAkJYnJlYWs7CiAJY2FzZSBVTUFDX09QQ09ERV9DTEVBUl9BTEw6CiAJCWZvciAoaSA9IDA7IGkgPCBJV01fU1RBX1RBQkxFX05VTTsgaSsrKQotCQkJaXdtLT5zdGFfdGFibGVbaV0udmFsaWQgPSAwOworCQkJaXdtLT5zdGFfdGFibGVbaV0udmFsaWQgPSBmYWxzZTsKIAogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTIwMyw3ICsxMjAzLDcgQEAKIAogCXN3aXRjaCAoaGRyLT5vaWQpIHsKIAljYXNlIFVNQUNfV0lGSV9JRl9DTURfU0VUX1BST0ZJTEU6Ci0JCWl3bS0+dW1hY19wcm9maWxlX2FjdGl2ZSA9IDE7CisJCWl3bS0+dW1hY19wcm9maWxlX2FjdGl2ZSA9IHRydWU7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtMTM2Myw3ICsxMzYzLDcgQEAKIAkgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNtZCwgJml3bS0+bm9ud2lmaV9wZW5kaW5nX2NtZCwgcGVuZGluZykKIAkJaWYgKGNtZC0+c2VxX251bSA9PSBzZXFfbnVtKSB7Ci0JCQljbWQtPnJlc3BfcmVjZWl2ZWQgPSAxOworCQkJY21kLT5yZXNwX3JlY2VpdmVkID0gdHJ1ZTsKIAkJCWNtZC0+YnVmLmxlbiA9IGJ1Zl9zaXplOwogCQkJbWVtY3B5KGNtZC0+YnVmLmhkciwgYnVmLCBidWZfc2l6ZSk7CiAJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJml3bS0+bm9ud2lmaV9xdWV1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9jZmcuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jCmluZGV4IGE3ZjFhYjIuLmE3Y2QzMTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2NmZy5jCkBAIC00ODUsNiArNDg1LDcgQEAKIHN0YXRpYyBpbnQgbGJzX3JldF9zY2FuKHN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiwgdW5zaWduZWQgbG9uZyBkdW1teSwKIAlzdHJ1Y3QgY21kX2hlYWRlciAqcmVzcCkKIHsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CiAJc3RydWN0IGNtZF9kc184MDJfMTFfc2Nhbl9yc3AgKnNjYW5yZXNwID0gKHZvaWQgKilyZXNwOwogCWludCBic3NzaXplOwogCWNvbnN0IHU4ICpwb3M7CkBAIC02MzIsMTIgKzYzMywxNCBAQAogCQkJCSAgICAgTEJTX1NDQU5fUlNTSV9UT19NQk0ocnNzaSkvMTAwKTsKIAogCQkJaWYgKGNoYW5uZWwgJiYKLQkJCSAgICAhKGNoYW5uZWwtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpKQotCQkJCWNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIGNoYW5uZWwsCisJCQkgICAgIShjaGFubmVsLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKSkgeworCQkJCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIGNoYW5uZWwsCiAJCQkJCWJzc2lkLCBnZXRfdW5hbGlnbmVkX2xlNjQodHNmZGVzYyksCiAJCQkJCWNhcGEsIGludHZsLCBpZSwgaWVsZW4sCiAJCQkJCUxCU19TQ0FOX1JTU0lfVE9fTUJNKHJzc2kpLAogCQkJCQlHRlBfS0VSTkVMKTsKKwkJCQljZmc4MDIxMV9wdXRfYnNzKGJzcyk7CisJCQl9CiAJCX0gZWxzZQogCQkJbGJzX2RlYl9zY2FuKCJzY2FuIHJlc3BvbnNlOiBtaXNzaW5nIEJTUyBjaGFubmVsIElFXG4iKTsKIApAQCAtNzI4LDkgKzczMSwxMSBAQAogCQlsZTE2X3RvX2NwdShzY2FuX2NtZC0+aGRyLnNpemUpLAogCQlsYnNfcmV0X3NjYW4sIDApOwogCi0JaWYgKHByaXYtPnNjYW5fY2hhbm5lbCA+PSBwcml2LT5zY2FuX3JlcS0+bl9jaGFubmVscykKKwlpZiAocHJpdi0+c2Nhbl9jaGFubmVsID49IHByaXYtPnNjYW5fcmVxLT5uX2NoYW5uZWxzKSB7CiAJCS8qIE1hcmsgc2NhbiBkb25lICovCisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnByaXYtPnNjYW5fd29yayk7CiAJCWxic19zY2FuX2RvbmUocHJpdik7CisJfQogCiAJLyogUmVzdGFydCBuZXR3b3JrICovCiAJaWYgKGNhcnJpZXIpCkBAIC03NTksMTIgKzc2NCwxMiBAQAogCQlyZXF1ZXN0LT5uX3NzaWRzLCByZXF1ZXN0LT5uX2NoYW5uZWxzLCByZXF1ZXN0LT5pZV9sZW4pOwogCiAJcHJpdi0+c2Nhbl9jaGFubmVsID0gMDsKLQlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya190aHJlYWQsICZwcml2LT5zY2FuX3dvcmssCi0JCW1zZWNzX3RvX2ppZmZpZXMoNTApKTsKLQogCXByaXYtPnNjYW5fcmVxID0gcmVxdWVzdDsKIAlwcml2LT5pbnRlcm5hbF9zY2FuID0gaW50ZXJuYWw7CiAKKwlxdWV1ZV9kZWxheWVkX3dvcmsocHJpdi0+d29ya190aHJlYWQsICZwcml2LT5zY2FuX3dvcmssCisJCW1zZWNzX3RvX2ppZmZpZXMoNTApKTsKKwogCWxic19kZWJfbGVhdmUoTEJTX0RFQl9DRkc4MDIxMSk7CiB9CiAKQEAgLTE3MjAsNiArMTcyNSw3IEBACiAJCSAgIDIgKyAyICsgICAgICAgICAgICAgICAgICAgICAgLyogYXRpbSAqLwogCQkgICAyICsgOF07ICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dGVuZGVkIHJhdGVzICovCiAJdTggKmZha2UgPSBmYWtlX2llOworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKIAogCWxic19kZWJfZW50ZXIoTEJTX0RFQl9DRkc4MDIxMSk7CiAKQEAgLTE3NjMsMTQgKzE3NjksMTUgQEAKIAkqZmFrZSsrID0gMHg2YzsKIAlsYnNfZGViX2hleChMQlNfREVCX0NGRzgwMjExLCAiSUUiLCBmYWtlX2llLCBmYWtlIC0gZmFrZV9pZSk7CiAKLQljZmc4MDIxMV9pbmZvcm1fYnNzKHByaXYtPndkZXYtPndpcGh5LAotCQkJICAgIHBhcmFtcy0+Y2hhbm5lbCwKLQkJCSAgICBic3NpZCwKLQkJCSAgICAwLAotCQkJICAgIGNhcGFiaWxpdHksCi0JCQkgICAgcGFyYW1zLT5iZWFjb25faW50ZXJ2YWwsCi0JCQkgICAgZmFrZV9pZSwgZmFrZSAtIGZha2VfaWUsCi0JCQkgICAgMCwgR0ZQX0tFUk5FTCk7CisJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyhwcml2LT53ZGV2LT53aXBoeSwKKwkJCQkgIHBhcmFtcy0+Y2hhbm5lbCwKKwkJCQkgIGJzc2lkLAorCQkJCSAgMCwKKwkJCQkgIGNhcGFiaWxpdHksCisJCQkJICBwYXJhbXMtPmJlYWNvbl9pbnRlcnZhbCwKKwkJCQkgIGZha2VfaWUsIGZha2UgLSBmYWtlX2llLAorCQkJCSAgMCwgR0ZQX0tFUk5FTCk7CisJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOwogCiAJbWVtY3B5KHByaXYtPndkZXYtPnNzaWQsIHBhcmFtcy0+c3NpZCwgcGFyYW1zLT5zc2lkX2xlbik7CiAJcHJpdi0+d2Rldi0+c3NpZF9sZW4gPSBwYXJhbXMtPnNzaWRfbGVuOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZXRodG9vbC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvZXRodG9vbC5jCmluZGV4IDg4NWRkYzEuLmY5NTViMmQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2V0aHRvb2wuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9ldGh0b29sLmMKQEAgLTEzLDEzICsxMywxNCBAQAogewogCXN0cnVjdCBsYnNfcHJpdmF0ZSAqcHJpdiA9IGRldi0+bWxfcHJpdjsKIAotCXNucHJpbnRmKGluZm8tPmZ3X3ZlcnNpb24sIDMyLCAiJXUuJXUuJXUucCV1IiwKKwlzbnByaW50ZihpbmZvLT5md192ZXJzaW9uLCBzaXplb2YoaW5mby0+ZndfdmVyc2lvbiksCisJCSIldS4ldS4ldS5wJXUiLAogCQlwcml2LT5md3JlbGVhc2UgPj4gMjQgJiAweGZmLAogCQlwcml2LT5md3JlbGVhc2UgPj4gMTYgJiAweGZmLAogCQlwcml2LT5md3JlbGVhc2UgPj4gIDggJiAweGZmLAogCQlwcml2LT5md3JlbGVhc2UgICAgICAgJiAweGZmKTsKLQlzdHJjcHkoaW5mby0+ZHJpdmVyLCAibGliZXJ0YXMiKTsKLQlzdHJjcHkoaW5mby0+dmVyc2lvbiwgbGJzX2RyaXZlcl92ZXJzaW9uKTsKKwlzdHJsY3B5KGluZm8tPmRyaXZlciwgImxpYmVydGFzIiwgc2l6ZW9mKGluZm8tPmRyaXZlcikpOworCXN0cmxjcHkoaW5mby0+dmVyc2lvbiwgbGJzX2RyaXZlcl92ZXJzaW9uLCBzaXplb2YoaW5mby0+dmVyc2lvbikpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfY3MuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX2NzLmMKaW5kZXggZTI2OTM1MS4uM2Y3YmY0ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXMvaWZfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9jcy5jCkBAIC04NTksNyArODU5LDcgQEAKIAkgKiBNb3N0IG9mIHRoZSBsaWJlcnRhcyBjYXJkcyBjYW4gZG8gdW5hbGlnbmVkIHJlZ2lzdGVyIGFjY2VzcywgYnV0IHNvbWUKIAkgKiB3ZWlyZCBvbmVzIGNhbm5vdC4gVGhhdCdzIGVzcGVjaWFsbHkgdHJ1ZSBmb3IgdGhlIENGODMwNSBjYXJkLgogCSAqLwotCWNhcmQtPmFsaWduX3JlZ3MgPSAwOworCWNhcmQtPmFsaWduX3JlZ3MgPSBmYWxzZTsKIAogCWNhcmQtPm1vZGVsID0gZ2V0X21vZGVsKHBfZGV2LT5tYW5mX2lkLCBwX2Rldi0+Y2FyZF9pZCk7CiAJaWYgKGNhcmQtPm1vZGVsID09IE1PREVMX1VOS05PV04pIHsKQEAgLTg3MSw3ICs4NzEsNyBAQAogCS8qIENoZWNrIGlmIHdlIGhhdmUgYSBjdXJyZW50IHNpbGljb24gKi8KIAlwcm9kX2lkID0gaWZfY3NfcmVhZDgoY2FyZCwgSUZfQ1NfUFJPRFVDVF9JRCk7CiAJaWYgKGNhcmQtPm1vZGVsID09IE1PREVMXzgzMDUpIHsKLQkJY2FyZC0+YWxpZ25fcmVncyA9IDE7CisJCWNhcmQtPmFsaWduX3JlZ3MgPSB0cnVlOwogCQlpZiAocHJvZF9pZCA8IElGX0NTX0NGODMwNV9CMV9SRVYpIHsKIAkJCXByX2VycigiODMwNSByZXYgQjAgYW5kIG9sZGVyIGFyZSBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJCXJldCA9IC1FTk9ERVY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhcy9pZl9zcGkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NwaS5jCmluZGV4IDcyOGJhYTQuLjUwYjFlZTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NwaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzL2lmX3NwaS5jCkBAIC0xMjkxLDcgKzEyOTEsNiBAQAogCS5yZW1vdmUgPSBfX2RldmV4aXRfcChsaWJlcnRhc19zcGlfcmVtb3ZlKSwKIAkuZHJpdmVyID0gewogCQkubmFtZQk9ICJsaWJlcnRhc19zcGkiLAotCQkuYnVzCT0gJnNwaV9idXNfdHlwZSwKIAkJLm93bmVyCT0gVEhJU19NT0RVTEUsCiAJCS5wbQk9ICZpZl9zcGlfcG1fb3BzLAogCX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9saWJlcnRhc190Zi9tYWluLmMKaW5kZXggY2ViNTFiNi4uYTAzNDU3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbGliZXJ0YXNfdGYvbWFpbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL2xpYmVydGFzX3RmL21haW4uYwpAQCAtNzE5LDExICs3MTksMTEgQEAKIAkJcmV0dXJuOwogCiAJaWYgKHNrYl9xdWV1ZV9lbXB0eSgmcHJpdi0+YmNfcHNfYnVmKSkgewotCQlib29sIHR4X2J1ZmZfYmMgPSAwOworCQlib29sIHR4X2J1ZmZfYmMgPSBmYWxzZTsKIAogCQl3aGlsZSAoKHNrYiA9IGllZWU4MDIxMV9nZXRfYnVmZmVyZWRfYmMocHJpdi0+aHcsIHByaXYtPnZpZikpKSB7CiAJCQlza2JfcXVldWVfdGFpbCgmcHJpdi0+YmNfcHNfYnVmLCBza2IpOwotCQkJdHhfYnVmZl9iYyA9IDE7CisJCQl0eF9idWZmX2JjID0gdHJ1ZTsKIAkJfQogCQlpZiAodHhfYnVmZl9iYykgewogCQkJaWVlZTgwMjExX3N0b3BfcXVldWVzKHByaXYtPmh3KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYWM4MDIxMV9od3NpbS5jCmluZGV4IDUyM2FkNTUuLjRiOWU3MzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hYzgwMjExX2h3c2ltLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFjODAyMTFfaHdzaW0uYwpAQCAtMzcsNyArMzcsOCBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJTb2Z0d2FyZSBzaW11bGF0b3Igb2YgODAyLjExIHJhZGlvKHMpIGZvciBtYWM4MDIxMSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi1pbnQgd21lZGl1bWRfcGlkOworc3RhdGljIHUzMiB3bWVkaXVtZF9waWQ7CisKIHN0YXRpYyBpbnQgcmFkaW9zID0gMjsKIG1vZHVsZV9wYXJhbShyYWRpb3MsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHJhZGlvcywgIk51bWJlciBvZiBzaW11bGF0ZWQgcmFkaW9zIik7CkBAIC02NjUsNyArNjY2LDcgQEAKIHsKIAlib29sIGFjazsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4aTsKLQlpbnQgX3BpZDsKKwl1MzIgX3BpZDsKIAogCW1hYzgwMjExX2h3c2ltX21vbml0b3JfcngoaHcsIHNrYik7CiAKQEAgLTY3Niw3ICs2NzcsNyBAQAogCX0KIAogCS8qIHdtZWRpdW1kIG1vZGUgY2hlY2sgKi8KLQlfcGlkID0gd21lZGl1bWRfcGlkOworCV9waWQgPSBBQ0NFU1NfT05DRSh3bWVkaXVtZF9waWQpOwogCiAJaWYgKF9waWQpCiAJCXJldHVybiBtYWM4MDIxMV9od3NpbV90eF9mcmFtZV9ubChodywgc2tiLCBfcGlkKTsKQEAgLTcwNyw3ICs3MDgsNyBAQAogewogCXN0cnVjdCBtYWM4MDIxMV9od3NpbV9kYXRhICpkYXRhID0gaHctPnByaXY7CiAJd2lwaHlfZGVidWcoaHctPndpcGh5LCAiJXNcbiIsIF9fZnVuY19fKTsKLQlkYXRhLT5zdGFydGVkID0gMTsKKwlkYXRhLT5zdGFydGVkID0gdHJ1ZTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNzE1LDcgKzcxNiw3IEBACiBzdGF0aWMgdm9pZCBtYWM4MDIxMV9od3NpbV9zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewogCXN0cnVjdCBtYWM4MDIxMV9od3NpbV9kYXRhICpkYXRhID0gaHctPnByaXY7Ci0JZGF0YS0+c3RhcnRlZCA9IDA7CisJZGF0YS0+c3RhcnRlZCA9IGZhbHNlOwogCWRlbF90aW1lcigmZGF0YS0+YmVhY29uX3RpbWVyKTsKIAl3aXBoeV9kZWJ1Zyhody0+d2lwaHksICIlc1xuIiwgX19mdW5jX18pOwogfQpAQCAtNzY0LDcgKzc2NSw3IEBACiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBhcmc7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87Ci0JaW50IF9waWQ7CisJdTMyIF9waWQ7CiAKIAlod3NpbV9jaGVja19tYWdpYyh2aWYpOwogCkBAIC03ODEsNyArNzgyLDcgQEAKIAltYWM4MDIxMV9od3NpbV9tb25pdG9yX3J4KGh3LCBza2IpOwogCiAJLyogd21lZGl1bWQgbW9kZSBjaGVjayAqLwotCV9waWQgPSB3bWVkaXVtZF9waWQ7CisJX3BpZCA9IEFDQ0VTU19PTkNFKHdtZWRpdW1kX3BpZCk7CiAKIAlpZiAoX3BpZCkKIAkJcmV0dXJuIG1hYzgwMjExX2h3c2ltX3R4X2ZyYW1lX25sKGh3LCBza2IsIF9waWQpOwpAQCAtMTI1NCw3ICsxMjU1LDcgQEAKIAlzdHJ1Y3QgaHdzaW1fdmlmX3ByaXYgKnZwID0gKHZvaWQgKil2aWYtPmRydl9wcml2OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9wc3BvbGwgKnBzcG9sbDsKLQlpbnQgX3BpZDsKKwl1MzIgX3BpZDsKIAogCWlmICghdnAtPmFzc29jKQogCQlyZXR1cm47CkBAIC0xMjc1LDcgKzEyNzYsNyBAQAogCW1lbWNweShwc3BvbGwtPnRhLCBtYWMsIEVUSF9BTEVOKTsKIAogCS8qIHdtZWRpdW1kIG1vZGUgY2hlY2sgKi8KLQlfcGlkID0gd21lZGl1bWRfcGlkOworCV9waWQgPSBBQ0NFU1NfT05DRSh3bWVkaXVtZF9waWQpOwogCiAJaWYgKF9waWQpCiAJCXJldHVybiBtYWM4MDIxMV9od3NpbV90eF9mcmFtZV9ubChkYXRhLT5odywgc2tiLCBfcGlkKTsKQEAgLTEyOTIsNyArMTI5Myw3IEBACiAJc3RydWN0IGh3c2ltX3ZpZl9wcml2ICp2cCA9ICh2b2lkICopdmlmLT5kcnZfcHJpdjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7Ci0JaW50IF9waWQ7CisJdTMyIF9waWQ7CiAKIAlpZiAoIXZwLT5hc3NvYykKIAkJcmV0dXJuOwpAQCAtMTMxNCw3ICsxMzE1LDcgQEAKIAltZW1jcHkoaGRyLT5hZGRyMywgdnAtPmJzc2lkLCBFVEhfQUxFTik7CiAKIAkvKiB3bWVkaXVtZCBtb2RlIGNoZWNrICovCi0JX3BpZCA9IHdtZWRpdW1kX3BpZDsKKwlfcGlkID0gQUNDRVNTX09OQ0Uod21lZGl1bWRfcGlkKTsKIAogCWlmIChfcGlkKQogCQlyZXR1cm4gbWFjODAyMTFfaHdzaW1fdHhfZnJhbWVfbmwoZGF0YS0+aHcsIHNrYiwgX3BpZCk7CkBAIC0xNjM0LDggKzE2MzUsNiBAQAogCWludCByYzsKIAlwcmludGsoS0VSTl9JTkZPICJtYWM4MDIxMV9od3NpbTogaW5pdGlhbGl6aW5nIG5ldGxpbmtcbiIpOwogCi0Jd21lZGl1bWRfcGlkID0gMDsKLQogCXJjID0gZ2VubF9yZWdpc3Rlcl9mYW1pbHlfd2l0aF9vcHMoJmh3c2ltX2dlbmxfZmFtaWx5LAogCQlod3NpbV9vcHMsIEFSUkFZX1NJWkUoaHdzaW1fb3BzKSk7CiAJaWYgKHJjKQpAQCAtMTc0OCw2ICsxNzQ3LDggQEAKIAkJCSAgICBJRUVFODAyMTFfSFdfU1VQUE9SVFNfRFlOQU1JQ19TTVBTIHwKIAkJCSAgICBJRUVFODAyMTFfSFdfQU1QRFVfQUdHUkVHQVRJT047CiAKKwkJaHctPndpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFM7CisKIAkJLyogYXNrIG1hYzgwMjExIHRvIHJlc2VydmUgc3BhY2UgZm9yIG1hZ2ljICovCiAJCWh3LT52aWZfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBod3NpbV92aWZfcHJpdik7CiAJCWh3LT5zdGFfZGF0YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBod3NpbV9zdGFfcHJpdik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4LzExbl9yeHJlb3JkZXIuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCmluZGV4IDdhYTlhYTAuLjY4MWQzZjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvMTFuX3J4cmVvcmRlci5jCkBAIC0zMyw3ICszMyw3IEBACiAgKiBTaW5jZSB0aGUgYnVmZmVyIGlzIGxpbmVhciwgdGhlIGZ1bmN0aW9uIHVzZXMgcm90YXRpb24gdG8gc2ltdWxhdGUKICAqIGNpcmN1bGFyIGJ1ZmZlci4KICAqLwotc3RhdGljIGludAorc3RhdGljIHZvaWQKIG13aWZpZXhfMTFuX2Rpc3BhdGNoX3BrdF91bnRpbF9zdGFydF93aW4oc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKIAkJCQkJIHN0cnVjdCBtd2lmaWV4X3J4X3Jlb3JkZXJfdGJsCiAJCQkJCSAqcnhfcmVvcl90YmxfcHRyLCBpbnQgc3RhcnRfd2luKQpAQCAtNzEsOCArNzEsNiBAQAogCiAJcnhfcmVvcl90YmxfcHRyLT5zdGFydF93aW4gPSBzdGFydF93aW47CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfcGt0X2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiAwOwogfQogCiAvKgpAQCAtODMsNyArODEsNyBAQAogICogU2luY2UgdGhlIGJ1ZmZlciBpcyBsaW5lYXIsIHRoZSBmdW5jdGlvbiB1c2VzIHJvdGF0aW9uIHRvIHNpbXVsYXRlCiAgKiBjaXJjdWxhciBidWZmZXIuCiAgKi8KLXN0YXRpYyBpbnQKK3N0YXRpYyB2b2lkCiBtd2lmaWV4XzExbl9zY2FuX2FuZF9kaXNwYXRjaChzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJICAgICAgc3RydWN0IG13aWZpZXhfcnhfcmVvcmRlcl90YmwgKnJ4X3Jlb3JfdGJsX3B0cikKIHsKQEAgLTExOSw3ICsxMTcsNiBAQAogCXJ4X3Jlb3JfdGJsX3B0ci0+c3RhcnRfd2luID0gKHJ4X3Jlb3JfdGJsX3B0ci0+c3RhcnRfd2luICsgaSkKIAkJJihNQVhfVElEX1ZBTFVFIC0gMSk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcHJpdi0+cnhfcGt0X2xvY2ssIGZsYWdzKTsKLQlyZXR1cm4gMDsKIH0KIAogLyoKQEAgLTQwNSw3ICs0MDIsNyBAQAogCQkJCXU4ICp0YSwgdTggcGt0X3R5cGUsIHZvaWQgKnBheWxvYWQpCiB7CiAJc3RydWN0IG13aWZpZXhfcnhfcmVvcmRlcl90YmwgKnJ4X3Jlb3JfdGJsX3B0cjsKLQlpbnQgc3RhcnRfd2luLCBlbmRfd2luLCB3aW5fc2l6ZSwgcmV0OworCWludCBzdGFydF93aW4sIGVuZF93aW4sIHdpbl9zaXplOwogCXUxNiBwa3RfaW5kZXg7CiAKIAlyeF9yZW9yX3RibF9wdHIgPQpAQCAtNDUyLDExICs0NDksOCBAQAogCQkJc3RhcnRfd2luID0gKGVuZF93aW4gLSB3aW5fc2l6ZSkgKyAxOwogCQllbHNlCiAJCQlzdGFydF93aW4gPSAoTUFYX1RJRF9WQUxVRSAtICh3aW5fc2l6ZSAtIHNlcV9udW0pKSArIDE7Ci0JCXJldCA9IG13aWZpZXhfMTFuX2Rpc3BhdGNoX3BrdF91bnRpbF9zdGFydF93aW4ocHJpdiwKKwkJbXdpZmlleF8xMW5fZGlzcGF0Y2hfcGt0X3VudGlsX3N0YXJ0X3dpbihwcml2LAogCQkJCQkJcnhfcmVvcl90YmxfcHRyLCBzdGFydF93aW4pOwotCi0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwogCX0KIAogCWlmIChwa3RfdHlwZSAhPSBQS1RfVFlQRV9CQVIpIHsKQEAgLTQ3NSw5ICs0NjksOSBAQAogCSAqIERpc3BhdGNoIGFsbCBwYWNrZXRzIHNlcXVlbnRpYWxseSBmcm9tIHN0YXJ0X3dpbiB1bnRpbCBhCiAJICogaG9sZSBpcyBmb3VuZCBhbmQgYWRqdXN0IHRoZSBzdGFydF93aW4gYXBwcm9wcmlhdGVseQogCSAqLwotCXJldCA9IG13aWZpZXhfMTFuX3NjYW5fYW5kX2Rpc3BhdGNoKHByaXYsIHJ4X3Jlb3JfdGJsX3B0cik7CisJbXdpZmlleF8xMW5fc2Nhbl9hbmRfZGlzcGF0Y2gocHJpdiwgcnhfcmVvcl90YmxfcHRyKTsKIAotCXJldHVybiByZXQ7CisJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L0tjb25maWcKaW5kZXggOGYyNzk3YS4uMmEwNzhjZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9LY29uZmlnCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvS2NvbmZpZwpAQCAtMTAsMTIgKzEwLDEyIEBACiAJICBtd2lmaWV4LgogCiBjb25maWcgTVdJRklFWF9TRElPCi0JdHJpc3RhdGUgIk1hcnZlbGwgV2lGaS1FeCBEcml2ZXIgZm9yIFNEODc4NyIKKwl0cmlzdGF0ZSAiTWFydmVsbCBXaUZpLUV4IERyaXZlciBmb3IgU0Q4Nzg3L1NEODc5NyIKIAlkZXBlbmRzIG9uIE1XSUZJRVggJiYgTU1DCiAJc2VsZWN0IEZXX0xPQURFUgogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciB3aXJlbGVzcyBhZGFwdGVycyBiYXNlZCBvbiBNYXJ2ZWxsCi0JICA4Nzg3IGNoaXBzZXQgd2l0aCBTRElPIGludGVyZmFjZS4KKwkgIDg3ODcvODc5NyBjaGlwc2V0cyB3aXRoIFNESU8gaW50ZXJmYWNlLgogCiAJICBJZiB5b3UgY2hvb3NlIHRvIGJ1aWxkIGl0IGFzIGEgbW9kdWxlLCBpdCB3aWxsIGJlIGNhbGxlZAogCSAgbXdpZmlleF9zZGlvLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5jCmluZGV4IDQ2MmM3MTAuLmMzYjZjNDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmMKQEAgLTI0LDUwICsyNCwyNiBAQAogICogVGhpcyBmdW5jdGlvbiBtYXBzIHRoZSBubDgwMi4xMSBjaGFubmVsIHR5cGUgaW50byBkcml2ZXIgY2hhbm5lbCB0eXBlLgogICoKICAqIFRoZSBtYXBwaW5nIGlzIGFzIGZvbGxvd3MgLQotICogICAgICBOTDgwMjExX0NIQU5fTk9fSFQgICAgIC0+IE5PX1NFQ19DSEFOTkVMCi0gKiAgICAgIE5MODAyMTFfQ0hBTl9IVDIwICAgICAgLT4gTk9fU0VDX0NIQU5ORUwKLSAqICAgICAgTkw4MDIxMV9DSEFOX0hUNDBQTFVTICAtPiBTRUNfQ0hBTk5FTF9BQk9WRQotICogICAgICBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTIC0+IFNFQ19DSEFOTkVMX0JFTE9XCi0gKiAgICAgIE90aGVycyAgICAgICAgICAgICAgICAgLT4gTk9fU0VDX0NIQU5ORUwKKyAqICAgICAgTkw4MDIxMV9DSEFOX05PX0hUICAgICAtPiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FCisgKiAgICAgIE5MODAyMTFfQ0hBTl9IVDIwICAgICAgLT4gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORQorICogICAgICBOTDgwMjExX0NIQU5fSFQ0MFBMVVMgIC0+IElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFCisgKiAgICAgIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVMgLT4gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1cKKyAqICAgICAgT3RoZXJzICAgICAgICAgICAgICAgICAtPiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FCiAgKi8KLXN0YXRpYyBpbnQKLW13aWZpZXhfY2ZnODAyMTFfY2hhbm5lbF90eXBlX3RvX213aWZpZXhfY2hhbm5lbHMoZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZQotCQkJCQkJICBjaGFubmVsX3R5cGUpCitzdGF0aWMgdTgKK213aWZpZXhfY2ZnODAyMTFfY2hhbm5lbF90eXBlX3RvX3NlY19jaGFuX29mZnNldChlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlCisJCQkJCQkgY2hhbm5lbF90eXBlKQogewogCXN3aXRjaCAoY2hhbm5lbF90eXBlKSB7CiAJY2FzZSBOTDgwMjExX0NIQU5fTk9fSFQ6CiAJY2FzZSBOTDgwMjExX0NIQU5fSFQyMDoKLQkJcmV0dXJuIE5PX1NFQ19DSEFOTkVMOworCQlyZXR1cm4gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKIAljYXNlIE5MODAyMTFfQ0hBTl9IVDQwUExVUzoKLQkJcmV0dXJuIFNFQ19DSEFOTkVMX0FCT1ZFOworCQlyZXR1cm4gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU7CiAJY2FzZSBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTOgotCQlyZXR1cm4gU0VDX0NIQU5ORUxfQkVMT1c7CisJCXJldHVybiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19CRUxPVzsKIAlkZWZhdWx0OgotCQlyZXR1cm4gTk9fU0VDX0NIQU5ORUw7Ci0JfQotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBtYXBzIHRoZSBkcml2ZXIgY2hhbm5lbCB0eXBlIGludG8gbmw4MDIuMTEgY2hhbm5lbCB0eXBlLgotICoKLSAqIFRoZSBtYXBwaW5nIGlzIGFzIGZvbGxvd3MgLQotICogICAgICBOT19TRUNfQ0hBTk5FTCAgICAgIC0+IE5MODAyMTFfQ0hBTl9IVDIwCi0gKiAgICAgIFNFQ19DSEFOTkVMX0FCT1ZFICAgLT4gTkw4MDIxMV9DSEFOX0hUNDBQTFVTCi0gKiAgICAgIFNFQ19DSEFOTkVMX0JFTE9XICAgLT4gTkw4MDIxMV9DSEFOX0hUNDBNSU5VUwotICogICAgICBPdGhlcnMgICAgICAgICAgICAgIC0+IE5MODAyMTFfQ0hBTl9IVDIwCi0gKi8KLXN0YXRpYyBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlCi1td2lmaWV4X2NoYW5uZWxzX3RvX2NmZzgwMjExX2NoYW5uZWxfdHlwZShpbnQgY2hhbm5lbF90eXBlKQotewotCXN3aXRjaCAoY2hhbm5lbF90eXBlKSB7Ci0JY2FzZSBOT19TRUNfQ0hBTk5FTDoKLQkJcmV0dXJuIE5MODAyMTFfQ0hBTl9IVDIwOwotCWNhc2UgU0VDX0NIQU5ORUxfQUJPVkU6Ci0JCXJldHVybiBOTDgwMjExX0NIQU5fSFQ0MFBMVVM7Ci0JY2FzZSBTRUNfQ0hBTk5FTF9CRUxPVzoKLQkJcmV0dXJuIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVM7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5MODAyMTFfQ0hBTl9IVDIwOworCQlyZXR1cm4gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKIAl9CiB9CiAKQEAgLTEyMCwxMCArOTYsMTEgQEAKIHN0YXRpYyBpbnQKIG13aWZpZXhfY2ZnODAyMTFfc2V0X3R4X3Bvd2VyKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkgICAgICBlbnVtIG5sODAyMTFfdHhfcG93ZXJfc2V0dGluZyB0eXBlLAotCQkJICAgICAgaW50IGRibSkKKwkJCSAgICAgIGludCBtYm0pCiB7CiAJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfY2ZnODAyMTFfZ2V0X3ByaXYod2lwaHkpOwogCXN0cnVjdCBtd2lmaWV4X3Bvd2VyX2NmZyBwb3dlcl9jZmc7CisJaW50IGRibSA9IE1CTV9UT19EQk0obWJtKTsKIAogCWlmICh0eXBlID09IE5MODAyMTFfVFhfUE9XRVJfRklYRUQpIHsKIAkJcG93ZXJfY2ZnLmlzX3Bvd2VyX2F1dG8gPSAwOwpAQCAtMzMwLDM3ICszMDcsNTEgQEAKIAkJICAgICAgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlKQogewogCXN0cnVjdCBtd2lmaWV4X2NoYW5fZnJlcV9wb3dlciBjZnA7Ci0Jc3RydWN0IG13aWZpZXhfZHNfYmFuZF9jZmcgYmFuZF9jZmc7CiAJdTMyIGNvbmZpZ19iYW5kcyA9IDA7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHByaXYtPndkZXYtPndpcGh5OworCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwogCiAJaWYgKGNoYW4pIHsKLQkJbWVtc2V0KCZiYW5kX2NmZywgMCwgc2l6ZW9mKGJhbmRfY2ZnKSk7CiAJCS8qIFNldCBhcHByb3ByaWF0ZSBiYW5kcyAqLwotCQlpZiAoY2hhbi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQotCQkJY29uZmlnX2JhbmRzID0gQkFORF9CIHwgQkFORF9HIHwgQkFORF9HTjsKLQkJZWxzZQotCQkJY29uZmlnX2JhbmRzID0gQkFORF9BTiB8IEJBTkRfQTsKLQkJaWYgKHByaXYtPmJzc19tb2RlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04KLQkJICAgIHx8IHByaXYtPmJzc19tb2RlID09IE5MODAyMTFfSUZUWVBFX1VOU1BFQ0lGSUVEKSB7Ci0JCQliYW5kX2NmZy5jb25maWdfYmFuZHMgPSBjb25maWdfYmFuZHM7Ci0JCX0gZWxzZSBpZiAocHJpdi0+YnNzX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKLQkJCWJhbmRfY2ZnLmNvbmZpZ19iYW5kcyA9IGNvbmZpZ19iYW5kczsKLQkJCWJhbmRfY2ZnLmFkaG9jX3N0YXJ0X2JhbmQgPSBjb25maWdfYmFuZHM7CisJCWlmIChjaGFuLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJCWlmIChjaGFubmVsX3R5cGUgPT0gTkw4MDIxMV9DSEFOX05PX0hUKQorCQkJCWlmIChwcml2LT5hZGFwdGVyLT5jb25maWdfYmFuZHMgPT0gQkFORF9CIHx8CisJCQkJCSAgcHJpdi0+YWRhcHRlci0+Y29uZmlnX2JhbmRzID09IEJBTkRfRykKKwkJCQkJY29uZmlnX2JhbmRzID0KKwkJCQkJCXByaXYtPmFkYXB0ZXItPmNvbmZpZ19iYW5kczsKKwkJCQllbHNlCisJCQkJCWNvbmZpZ19iYW5kcyA9IEJBTkRfQiB8IEJBTkRfRzsKKwkJCWVsc2UKKwkJCQljb25maWdfYmFuZHMgPSBCQU5EX0IgfCBCQU5EX0cgfCBCQU5EX0dOOworCQl9IGVsc2UgeworCQkJaWYgKGNoYW5uZWxfdHlwZSA9PSBOTDgwMjExX0NIQU5fTk9fSFQpCisJCQkJY29uZmlnX2JhbmRzID0gQkFORF9BOworCQkJZWxzZQorCQkJCWNvbmZpZ19iYW5kcyA9IEJBTkRfQU4gfCBCQU5EX0E7CiAJCX0KIAotCQliYW5kX2NmZy5zZWNfY2hhbl9vZmZzZXQgPQotCQkJbXdpZmlleF9jZmc4MDIxMV9jaGFubmVsX3R5cGVfdG9fbXdpZmlleF9jaGFubmVscworCQlpZiAoISgoY29uZmlnX2JhbmRzIHwgYWRhcHRlci0+ZndfYmFuZHMpICYKKwkJCQkJCX5hZGFwdGVyLT5md19iYW5kcykpIHsKKwkJCWFkYXB0ZXItPmNvbmZpZ19iYW5kcyA9IGNvbmZpZ19iYW5kczsKKwkJCWlmIChwcml2LT5ic3NfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykgeworCQkJCWFkYXB0ZXItPmFkaG9jX3N0YXJ0X2JhbmQgPSBjb25maWdfYmFuZHM7CisJCQkJaWYgKChjb25maWdfYmFuZHMgJiBCQU5EX0dOKSB8fAorCQkJCQkJKGNvbmZpZ19iYW5kcyAmIEJBTkRfQU4pKQorCQkJCQlhZGFwdGVyLT5hZGhvY18xMW5fZW5hYmxlZCA9IHRydWU7CisJCQkJZWxzZQorCQkJCQlhZGFwdGVyLT5hZGhvY18xMW5fZW5hYmxlZCA9IGZhbHNlOworCQkJfQorCQl9CisJCWFkYXB0ZXItPnNlY19jaGFuX29mZnNldCA9CisJCQltd2lmaWV4X2NmZzgwMjExX2NoYW5uZWxfdHlwZV90b19zZWNfY2hhbl9vZmZzZXQKIAkJCShjaGFubmVsX3R5cGUpOwotCi0JCWlmIChtd2lmaWV4X3NldF9yYWRpb19iYW5kX2NmZyhwcml2LCAmYmFuZF9jZmcpKQotCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWFkYXB0ZXItPmNoYW5uZWxfdHlwZSA9IGNoYW5uZWxfdHlwZTsKIAogCQltd2lmaWV4X3NlbmRfZG9tYWluX2luZm9fY21kX2Z3KHdpcGh5KTsKIAl9CiAKIAl3aXBoeV9kYmcod2lwaHksICJpbmZvOiBzZXR0aW5nIGJhbmQgJWQsIGNoYW5uZWwgb2Zmc2V0ICVkIGFuZCAiCi0JCSJtb2RlICVkXG4iLCBjb25maWdfYmFuZHMsIGJhbmRfY2ZnLnNlY19jaGFuX29mZnNldCwKKwkJIm1vZGUgJWRcbiIsIGNvbmZpZ19iYW5kcywgYWRhcHRlci0+c2VjX2NoYW5fb2Zmc2V0LAogCQlwcml2LT5ic3NfbW9kZSk7CiAJaWYgKCFjaGFuKQogCQlyZXR1cm4gMDsKQEAgLTY5Niw5ICs2ODcsOSBAQAogCQkJCWNvbnN0IHU4ICpwZWVyLAogCQkJCWNvbnN0IHN0cnVjdCBjZmc4MDIxMV9iaXRyYXRlX21hc2sgKm1hc2spCiB7Ci0Jc3RydWN0IG13aWZpZXhfZHNfYmFuZF9jZmcgYmFuZF9jZmc7CiAJc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiA9IG13aWZpZXhfbmV0ZGV2X2dldF9wcml2KGRldik7CiAJaW50IGluZGV4ID0gMCwgbW9kZSA9IDAsIGk7CisJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7CiAKIAkvKiBDdXJyZW50bHkgb25seSAyLjRHSHogaXMgc3VwcG9ydGVkICovCiAJZm9yIChpID0gMDsgaSA8IG13aWZpZXhfYmFuZF8yZ2h6Lm5fYml0cmF0ZXM7IGkrKykgewpAQCAtNzIwLDE2ICs3MTEsMTUgQEAKIAkJCW1vZGUgfD0gIEJBTkRfQjsKIAl9CiAKLQltZW1zZXQoJmJhbmRfY2ZnLCAwLCBzaXplb2YoYmFuZF9jZmcpKTsKLQliYW5kX2NmZy5jb25maWdfYmFuZHMgPSBtb2RlOwotCi0JaWYgKHByaXYtPmJzc19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQotCQliYW5kX2NmZy5hZGhvY19zdGFydF9iYW5kID0gbW9kZTsKLQotCWJhbmRfY2ZnLnNlY19jaGFuX29mZnNldCA9IE5PX1NFQ19DSEFOTkVMOwotCi0JaWYgKG13aWZpZXhfc2V0X3JhZGlvX2JhbmRfY2ZnKHByaXYsICZiYW5kX2NmZykpCi0JCXJldHVybiAtRUZBVUxUOworCWlmICghKChtb2RlIHwgYWRhcHRlci0+ZndfYmFuZHMpICYgfmFkYXB0ZXItPmZ3X2JhbmRzKSkgeworCQlhZGFwdGVyLT5jb25maWdfYmFuZHMgPSBtb2RlOworCQlpZiAocHJpdi0+YnNzX21vZGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MpIHsKKwkJCWFkYXB0ZXItPmFkaG9jX3N0YXJ0X2JhbmQgPSBtb2RlOworCQkJYWRhcHRlci0+YWRob2NfMTFuX2VuYWJsZWQgPSBmYWxzZTsKKwkJfQorCX0KKwlhZGFwdGVyLT5zZWNfY2hhbl9vZmZzZXQgPSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOworCWFkYXB0ZXItPmNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9OT19IVDsKIAogCXdpcGh5X2RlYnVnKHdpcGh5LCAiaW5mbzogZGV2aWNlIGNvbmZpZ3VyZWQgaW4gODAyLjExJXMlcyBtb2RlXG4iLAogCQkJCShtb2RlICYgQkFORF9CKSA/ICJiIiA6ICIiLApAQCAtNzUwLDE3ICs3NDAsMTMgQEAKIHsKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gbXdpZmlleF9uZXRkZXZfZ2V0X3ByaXYoZGV2KTsKIAotCWlmIChwcml2LT5kaXNjb25uZWN0KQotCQlyZXR1cm4gLUVCVVNZOwotCi0JcHJpdi0+ZGlzY29ubmVjdCA9IDE7CiAJaWYgKG13aWZpZXhfZGVhdXRoZW50aWNhdGUocHJpdiwgTlVMTCkpCiAJCXJldHVybiAtRUZBVUxUOwogCiAJd2lwaHlfZGJnKHdpcGh5LCAiaW5mbzogc3VjY2Vzc2Z1bGx5IGRpc2Nvbm5lY3RlZCBmcm9tICVwTToiCiAJCSIgcmVhc29uIGNvZGUgJWRcbiIsIHByaXYtPmNmZ19ic3NpZCwgcmVhc29uX2NvZGUpOwogCi0JcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5jZmdfd29ya3F1ZXVlKTsKKwltZW1zZXQocHJpdi0+Y2ZnX2Jzc2lkLCAwLCBFVEhfQUxFTik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTc4MCw2ICs3NjYsNyBAQAogewogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbjsKIAlzdHJ1Y3QgbXdpZmlleF9ic3NfaW5mbyBic3NfaW5mbzsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CiAJaW50IGllX2xlbjsKIAl1OCBpZV9idWZbSUVFRTgwMjExX01BWF9TU0lEX0xFTiArIHNpemVvZihzdHJ1Y3QgaWVlZV90eXBlc19oZWFkZXIpXTsKIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CkBAIC04MDAsOSArNzg3LDEwIEBACiAJCQlpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koYnNzX2luZm8uYnNzX2NoYW4sCiAJCQkJCQkgICAgICAgYmFuZCkpOwogCi0JY2ZnODAyMTFfaW5mb3JtX2Jzcyhwcml2LT53ZGV2LT53aXBoeSwgY2hhbiwKKwlic3MgPSBjZmc4MDIxMV9pbmZvcm1fYnNzKHByaXYtPndkZXYtPndpcGh5LCBjaGFuLAogCQlic3NfaW5mby5ic3NpZCwgMCwgV0xBTl9DQVBBQklMSVRZX0lCU1MsCiAJCTAsIGllX2J1ZiwgaWVfbGVuLCAwLCBHRlBfS0VSTkVMKTsKKwljZmc4MDIxMV9wdXRfYnNzKGJzcyk7CiAJbWVtY3B5KHByaXYtPmNmZ19ic3NpZCwgYnNzX2luZm8uYnNzaWQsIEVUSF9BTEVOKTsKIAogCXJldHVybiAwOwpAQCAtODUxLDggKzgzOSw3IEBACiAKIAlpZiAoY2hhbm5lbCkKIAkJcmV0ID0gbXdpZmlleF9zZXRfcmZfY2hhbm5lbChwcml2LCBjaGFubmVsLAotCQkJCW13aWZpZXhfY2hhbm5lbHNfdG9fY2ZnODAyMTFfY2hhbm5lbF90eXBlCi0JCQkJKHByaXYtPmFkYXB0ZXItPmNoYW5fb2Zmc2V0KSk7CisJCQkJCQlwcml2LT5hZGFwdGVyLT5jaGFubmVsX3R5cGUpOwogCiAJcmV0ID0gbXdpZmlleF9zZXRfZW5jb2RlKHByaXYsIE5VTEwsIDAsIDAsIDEpOwkvKiBEaXNhYmxlIGtleXMgKi8KIApAQCAtOTc4LDI3ICs5NjUsMzIgQEAKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gbXdpZmlleF9uZXRkZXZfZ2V0X3ByaXYoZGV2KTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChwcml2LT5hc3NvY19yZXF1ZXN0KQotCQlyZXR1cm4gLUVCVVNZOwotCiAJaWYgKHByaXYtPmJzc19tb2RlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7CiAJCXdpcGh5X2Vycih3aXBoeSwgInJlY2VpdmVkIGluZnJhIGFzc29jIHJlcXVlc3QgIgogCQkJCSJ3aGVuIHN0YXRpb24gaXMgaW4gaWJzcyBtb2RlXG4iKTsKIAkJZ290byBkb25lOwogCX0KIAotCXByaXYtPmFzc29jX3JlcXVlc3QgPSAtRUlOUFJPR1JFU1M7Ci0KIAl3aXBoeV9kYmcod2lwaHksICJpbmZvOiBUcnlpbmcgdG8gYXNzb2NpYXRlIHRvICVzIGFuZCBic3NpZCAlcE1cbiIsCiAJICAgICAgIChjaGFyICopIHNtZS0+c3NpZCwgc21lLT5ic3NpZCk7CiAKIAlyZXQgPSBtd2lmaWV4X2NmZzgwMjExX2Fzc29jKHByaXYsIHNtZS0+c3NpZF9sZW4sIHNtZS0+c3NpZCwgc21lLT5ic3NpZCwKIAkJCQkgICAgIHByaXYtPmJzc19tb2RlLCBzbWUtPmNoYW5uZWwsIHNtZSwgMCk7Ci0KLQlwcml2LT5hc3NvY19yZXF1ZXN0ID0gMTsKIGRvbmU6Ci0JcHJpdi0+YXNzb2NfcmVzdWx0ID0gcmV0OwotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+Y2ZnX3dvcmtxdWV1ZSk7CisJaWYgKCFyZXQpIHsKKwkJY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQocHJpdi0+bmV0ZGV2LCBwcml2LT5jZmdfYnNzaWQsIE5VTEwsIDAsCisJCQkJCU5VTEwsIDAsIFdMQU5fU1RBVFVTX1NVQ0NFU1MsCisJCQkJCUdGUF9LRVJORUwpOworCQlkZXZfZGJnKHByaXYtPmFkYXB0ZXItPmRldiwKKwkJCSJpbmZvOiBhc3NvY2lhdGVkIHRvIGJzc2lkICVwTSBzdWNjZXNzZnVsbHlcbiIsCisJCQlwcml2LT5jZmdfYnNzaWQpOworCX0gZWxzZSB7CisJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LAorCQkJImluZm86IGFzc29jaWF0aW9uIHRvIGJzc2lkICVwTSBmYWlsZWRcbiIsCisJCQlwcml2LT5jZmdfYnNzaWQpOworCQltZW1zZXQocHJpdi0+Y2ZnX2Jzc2lkLCAwLCBFVEhfQUxFTik7CisJfQorCiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMTAxNSwyOCArMTAwNywyOSBAQAogCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPSBtd2lmaWV4X2NmZzgwMjExX2dldF9wcml2KHdpcGh5KTsKIAlpbnQgcmV0ID0gMDsKIAotCWlmIChwcml2LT5pYnNzX2pvaW5fcmVxdWVzdCkKLQkJcmV0dXJuIC1FQlVTWTsKLQogCWlmIChwcml2LT5ic3NfbW9kZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykgewogCQl3aXBoeV9lcnIod2lwaHksICJyZXF1ZXN0IHRvIGpvaW4gaWJzcyByZWNlaXZlZCAiCiAJCQkJIndoZW4gc3RhdGlvbiBpcyBub3QgaW4gaWJzcyBtb2RlXG4iKTsKIAkJZ290byBkb25lOwogCX0KIAotCXByaXYtPmlic3Nfam9pbl9yZXF1ZXN0ID0gLUVJTlBST0dSRVNTOwotCiAJd2lwaHlfZGJnKHdpcGh5LCAiaW5mbzogdHJ5aW5nIHRvIGpvaW4gdG8gJXMgYW5kIGJzc2lkICVwTVxuIiwKIAkgICAgICAgKGNoYXIgKikgcGFyYW1zLT5zc2lkLCBwYXJhbXMtPmJzc2lkKTsKIAogCXJldCA9IG13aWZpZXhfY2ZnODAyMTFfYXNzb2MocHJpdiwgcGFyYW1zLT5zc2lkX2xlbiwgcGFyYW1zLT5zc2lkLAogCQkJCXBhcmFtcy0+YnNzaWQsIHByaXYtPmJzc19tb2RlLAogCQkJCXBhcmFtcy0+Y2hhbm5lbCwgTlVMTCwgcGFyYW1zLT5wcml2YWN5KTsKLQotCXByaXYtPmlic3Nfam9pbl9yZXF1ZXN0ID0gMTsKIGRvbmU6Ci0JcHJpdi0+aWJzc19qb2luX3Jlc3VsdCA9IHJldDsKLQlxdWV1ZV93b3JrKHByaXYtPndvcmtxdWV1ZSwgJnByaXYtPmNmZ193b3JrcXVldWUpOworCWlmICghcmV0KSB7CisJCWNmZzgwMjExX2lic3Nfam9pbmVkKHByaXYtPm5ldGRldiwgcHJpdi0+Y2ZnX2Jzc2lkLCBHRlBfS0VSTkVMKTsKKwkJZGV2X2RiZyhwcml2LT5hZGFwdGVyLT5kZXYsCisJCQkiaW5mbzogam9pbmVkL2NyZWF0ZWQgYWRob2MgbmV0d29yayB3aXRoIGJzc2lkIgorCQkJIiAlcE0gc3VjY2Vzc2Z1bGx5XG4iLCBwcml2LT5jZmdfYnNzaWQpOworCX0gZWxzZSB7CisJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LAorCQkJImluZm86IGZhaWxlZCBjcmVhdGluZy9qb2luaW5nIGFkaG9jIG5ldHdvcmtcbiIpOworCX0KKwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEwNTEsMTcgKzEwNDQsMTIgQEAKIHsKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gbXdpZmlleF9jZmc4MDIxMV9nZXRfcHJpdih3aXBoeSk7CiAKLQlpZiAocHJpdi0+ZGlzY29ubmVjdCkKLQkJcmV0dXJuIC1FQlVTWTsKLQotCXByaXYtPmRpc2Nvbm5lY3QgPSAxOwotCiAJd2lwaHlfZGJnKHdpcGh5LCAiaW5mbzogZGlzY29ubmVjdGluZyBmcm9tIGVzc2lkICVwTVxuIiwKIAkJCXByaXYtPmNmZ19ic3NpZCk7CiAJaWYgKG13aWZpZXhfZGVhdXRoZW50aWNhdGUocHJpdiwgTlVMTCkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5jZmdfd29ya3F1ZXVlKTsKKwltZW1zZXQocHJpdi0+Y2ZnX2Jzc2lkLCAwLCBFVEhfQUxFTik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTEwNzgsMTUgKzEwNjYsNDIgQEAKIAkJICAgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxdWVzdCkKIHsKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gbXdpZmlleF9uZXRkZXZfZ2V0X3ByaXYoZGV2KTsKKwlpbnQgaTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW47CiAKIAl3aXBoeV9kYmcod2lwaHksICJpbmZvOiByZWNlaXZlZCBzY2FuIHJlcXVlc3Qgb24gJXNcbiIsIGRldi0+bmFtZSk7CiAKLQlpZiAocHJpdi0+c2Nhbl9yZXF1ZXN0ICYmIHByaXYtPnNjYW5fcmVxdWVzdCAhPSByZXF1ZXN0KQotCQlyZXR1cm4gLUVCVVNZOwotCiAJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gcmVxdWVzdDsKIAotCXF1ZXVlX3dvcmsocHJpdi0+d29ya3F1ZXVlLCAmcHJpdi0+Y2ZnX3dvcmtxdWV1ZSk7CisJcHJpdi0+dXNlcl9zY2FuX2NmZyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X3VzZXJfc2Nhbl9jZmcpLAorCQkJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXByaXYtPnVzZXJfc2Nhbl9jZmcpIHsKKwkJZGV2X2Vycihwcml2LT5hZGFwdGVyLT5kZXYsICJmYWlsZWQgdG8gYWxsb2Mgc2Nhbl9yZXFcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZm9yIChpID0gMDsgaSA8IHJlcXVlc3QtPm5fc3NpZHM7IGkrKykgeworCQltZW1jcHkocHJpdi0+dXNlcl9zY2FuX2NmZy0+c3NpZF9saXN0W2ldLnNzaWQsCisJCQlyZXF1ZXN0LT5zc2lkc1tpXS5zc2lkLCByZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbik7CisJCXByaXYtPnVzZXJfc2Nhbl9jZmctPnNzaWRfbGlzdFtpXS5tYXhfbGVuID0KKwkJCXJlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgcmVxdWVzdC0+bl9jaGFubmVsczsgaSsrKSB7CisJCWNoYW4gPSByZXF1ZXN0LT5jaGFubmVsc1tpXTsKKwkJcHJpdi0+dXNlcl9zY2FuX2NmZy0+Y2hhbl9saXN0W2ldLmNoYW5fbnVtYmVyID0gY2hhbi0+aHdfdmFsdWU7CisJCXByaXYtPnVzZXJfc2Nhbl9jZmctPmNoYW5fbGlzdFtpXS5yYWRpb190eXBlID0gY2hhbi0+YmFuZDsKKworCQlpZiAoY2hhbi0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9QQVNTSVZFX1NDQU4pCisJCQlwcml2LT51c2VyX3NjYW5fY2ZnLT5jaGFuX2xpc3RbaV0uc2Nhbl90eXBlID0KKwkJCQlNV0lGSUVYX1NDQU5fVFlQRV9QQVNTSVZFOworCQllbHNlCisJCQlwcml2LT51c2VyX3NjYW5fY2ZnLT5jaGFuX2xpc3RbaV0uc2Nhbl90eXBlID0KKwkJCQlNV0lGSUVYX1NDQU5fVFlQRV9BQ1RJVkU7CisKKwkJcHJpdi0+dXNlcl9zY2FuX2NmZy0+Y2hhbl9saXN0W2ldLnNjYW5fdGltZSA9IDA7CisJfQorCWlmIChtd2lmaWV4X3NldF91c2VyX3NjYW5faW9jdGwocHJpdiwgcHJpdi0+dXNlcl9zY2FuX2NmZykpCisJCXJldHVybiAtRUZBVUxUOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTEyOTIsMTAgKzEzMDcsNiBAQAogCiAJcHJpdi0+bWVkaWFfY29ubmVjdGVkID0gZmFsc2U7CiAKLQljYW5jZWxfd29ya19zeW5jKCZwcml2LT5jZmdfd29ya3F1ZXVlKTsKLQlmbHVzaF93b3JrcXVldWUocHJpdi0+d29ya3F1ZXVlKTsKLQlkZXN0cm95X3dvcmtxdWV1ZShwcml2LT53b3JrcXVldWUpOwotCiAJcHJpdi0+YnNzX21vZGUgPSBOTDgwMjExX0lGVFlQRV9VTlNQRUNJRklFRDsKIAogCXJldHVybiAwOwpAQCAtMTM3Myw5ICsxMzg0LDYgQEAKIAltZW1jcHkod2Rldi0+d2lwaHktPnBlcm1fYWRkciwgcHJpdi0+Y3Vycl9hZGRyLCBFVEhfQUxFTik7CiAJd2Rldi0+d2lwaHktPnNpZ25hbF90eXBlID0gQ0ZHODAyMTFfU0lHTkFMX1RZUEVfTUJNOwogCi0JLyogV2UgYXJlIHVzaW5nIGN1c3RvbSBkb21haW5zICovCi0Jd2Rldi0+d2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlk7Ci0KIAkvKiBSZXNlcnZlIHNwYWNlIGZvciBic3MgYmFuZCBpbmZvcm1hdGlvbiAqLwogCXdkZXYtPndpcGh5LT5ic3NfcHJpdl9zaXplID0gc2l6ZW9mKHU4KTsKIApAQCAtMTQwNCwxMDAgKzE0MTIsMyBAQAogCiAJcmV0dXJuIHJldDsKIH0KLQotLyoKLSAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgcmVzdWx0IG9mIGRpZmZlcmVudCBwZW5kaW5nIG5ldHdvcmsgb3BlcmF0aW9ucy4KLSAqCi0gKiBUaGUgZm9sbG93aW5nIG9wZXJhdGlvbnMgYXJlIGhhbmRsZWQgYW5kIENGRzgwMi4xMSBzdWJzeXN0ZW0gaXMKLSAqIG5vdGlmaWVkIGFjY29yZGluZ2x5IC0KLSAqICAgICAgLSBTY2FuIHJlcXVlc3QgY29tcGxldGlvbgotICogICAgICAtIEFzc29jaWF0aW9uIHJlcXVlc3QgY29tcGxldGlvbgotICogICAgICAtIElCU1Mgam9pbiByZXF1ZXN0IGNvbXBsZXRpb24KLSAqICAgICAgLSBEaXNjb25uZWN0IHJlcXVlc3QgY29tcGxldGlvbgotICovCi12b2lkCi1td2lmaWV4X2NmZzgwMjExX3Jlc3VsdHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBtd2lmaWV4X3ByaXZhdGUgKnByaXYgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG13aWZpZXhfcHJpdmF0ZSwgY2ZnX3dvcmtxdWV1ZSk7Ci0Jc3RydWN0IG13aWZpZXhfdXNlcl9zY2FuX2NmZyAqc2Nhbl9yZXE7Ci0JaW50IHJldCA9IDAsIGk7Ci0Jc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOwotCi0JaWYgKHByaXYtPnNjYW5fcmVxdWVzdCkgewotCQlzY2FuX3JlcSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X3VzZXJfc2Nhbl9jZmcpLAotCQkJCSAgIEdGUF9LRVJORUwpOwotCQlpZiAoIXNjYW5fcmVxKSB7Ci0JCQlkZXZfZXJyKHByaXYtPmFkYXB0ZXItPmRldiwgImZhaWxlZCB0byBhbGxvYyAiCi0JCQkJCQkgICAgInNjYW5fcmVxXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGkgPSAwOyBpIDwgcHJpdi0+c2Nhbl9yZXF1ZXN0LT5uX3NzaWRzOyBpKyspIHsKLQkJCW1lbWNweShzY2FuX3JlcS0+c3NpZF9saXN0W2ldLnNzaWQsCi0JCQkJCXByaXYtPnNjYW5fcmVxdWVzdC0+c3NpZHNbaV0uc3NpZCwKLQkJCQkJcHJpdi0+c2Nhbl9yZXF1ZXN0LT5zc2lkc1tpXS5zc2lkX2xlbik7Ci0JCQlzY2FuX3JlcS0+c3NpZF9saXN0W2ldLm1heF9sZW4gPQotCQkJCQlwcml2LT5zY2FuX3JlcXVlc3QtPnNzaWRzW2ldLnNzaWRfbGVuOwotCQl9Ci0JCWZvciAoaSA9IDA7IGkgPCBwcml2LT5zY2FuX3JlcXVlc3QtPm5fY2hhbm5lbHM7IGkrKykgewotCQkJY2hhbiA9IHByaXYtPnNjYW5fcmVxdWVzdC0+Y2hhbm5lbHNbaV07Ci0JCQlzY2FuX3JlcS0+Y2hhbl9saXN0W2ldLmNoYW5fbnVtYmVyID0gY2hhbi0+aHdfdmFsdWU7Ci0JCQlzY2FuX3JlcS0+Y2hhbl9saXN0W2ldLnJhZGlvX3R5cGUgPSBjaGFuLT5iYW5kOwotCQkJaWYgKGNoYW4tPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fRElTQUJMRUQpCi0JCQkJc2Nhbl9yZXEtPmNoYW5fbGlzdFtpXS5zY2FuX3R5cGUgPQotCQkJCQlNV0lGSUVYX1NDQU5fVFlQRV9QQVNTSVZFOwotCQkJZWxzZQotCQkJCXNjYW5fcmVxLT5jaGFuX2xpc3RbaV0uc2Nhbl90eXBlID0KLQkJCQkJTVdJRklFWF9TQ0FOX1RZUEVfQUNUSVZFOwotCQkJc2Nhbl9yZXEtPmNoYW5fbGlzdFtpXS5zY2FuX3RpbWUgPSAwOwotCQl9Ci0JCWlmIChtd2lmaWV4X3NldF91c2VyX3NjYW5faW9jdGwocHJpdiwgc2Nhbl9yZXEpKQotCQkJcmV0ID0gLUVGQVVMVDsKLQkJcHJpdi0+c2Nhbl9yZXN1bHRfc3RhdHVzID0gcmV0OwotCQlkZXZfZGJnKHByaXYtPmFkYXB0ZXItPmRldiwgImluZm86ICVzOiBzZW5kaW5nIHNjYW4gcmVzdWx0c1xuIiwKLQkJCQkJCQlfX2Z1bmNfXyk7Ci0JCWNmZzgwMjExX3NjYW5fZG9uZShwcml2LT5zY2FuX3JlcXVlc3QsCi0JCQkJKHByaXYtPnNjYW5fcmVzdWx0X3N0YXR1cyA8IDApKTsKLQkJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKLQkJa2ZyZWUoc2Nhbl9yZXEpOwotCX0KLQotCWlmIChwcml2LT5hc3NvY19yZXF1ZXN0ID09IDEpIHsKLQkJaWYgKCFwcml2LT5hc3NvY19yZXN1bHQpIHsKLQkJCWNmZzgwMjExX2Nvbm5lY3RfcmVzdWx0KHByaXYtPm5ldGRldiwgcHJpdi0+Y2ZnX2Jzc2lkLAotCQkJCQkJTlVMTCwgMCwgTlVMTCwgMCwKLQkJCQkJCVdMQU5fU1RBVFVTX1NVQ0NFU1MsCi0JCQkJCQlHRlBfS0VSTkVMKTsKLQkJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LAotCQkJCSJpbmZvOiBhc3NvY2lhdGVkIHRvIGJzc2lkICVwTSBzdWNjZXNzZnVsbHlcbiIsCi0JCQkgICAgICAgcHJpdi0+Y2ZnX2Jzc2lkKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LAotCQkJCSJpbmZvOiBhc3NvY2lhdGlvbiB0byBic3NpZCAlcE0gZmFpbGVkXG4iLAotCQkJICAgICAgIHByaXYtPmNmZ19ic3NpZCk7Ci0JCQltZW1zZXQocHJpdi0+Y2ZnX2Jzc2lkLCAwLCBFVEhfQUxFTik7Ci0JCX0KLQkJcHJpdi0+YXNzb2NfcmVxdWVzdCA9IDA7Ci0JCXByaXYtPmFzc29jX3Jlc3VsdCA9IDA7Ci0JfQotCi0JaWYgKHByaXYtPmlic3Nfam9pbl9yZXF1ZXN0ID09IDEpIHsKLQkJaWYgKCFwcml2LT5pYnNzX2pvaW5fcmVzdWx0KSB7Ci0JCQljZmc4MDIxMV9pYnNzX2pvaW5lZChwcml2LT5uZXRkZXYsIHByaXYtPmNmZ19ic3NpZCwKLQkJCQkJICAgICBHRlBfS0VSTkVMKTsKLQkJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LAotCQkJCSJpbmZvOiBqb2luZWQvY3JlYXRlZCBhZGhvYyBuZXR3b3JrIHdpdGggYnNzaWQiCi0JCQkJCSIgJXBNIHN1Y2Nlc3NmdWxseVxuIiwgcHJpdi0+Y2ZnX2Jzc2lkKTsKLQkJfSBlbHNlIHsKLQkJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LAotCQkJCSJpbmZvOiBmYWlsZWQgY3JlYXRpbmcvam9pbmluZyBhZGhvYyBuZXR3b3JrXG4iKTsKLQkJfQotCQlwcml2LT5pYnNzX2pvaW5fcmVxdWVzdCA9IDA7Ci0JCXByaXYtPmlic3Nfam9pbl9yZXN1bHQgPSAwOwotCX0KLQotCWlmIChwcml2LT5kaXNjb25uZWN0KSB7Ci0JCW1lbXNldChwcml2LT5jZmdfYnNzaWQsIDAsIEVUSF9BTEVOKTsKLQkJcHJpdi0+ZGlzY29ubmVjdCA9IDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZmc4MDIxMS5oCmluZGV4IDhkMDEwZjIuLjc2Yzc2YzYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZnODAyMTEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmZzgwMjExLmgKQEAgLTI2LDUgKzI2LDQgQEAKIAogaW50IG13aWZpZXhfcmVnaXN0ZXJfY2ZnODAyMTEoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqKTsKIAotdm9pZCBtd2lmaWV4X2NmZzgwMjExX3Jlc3VsdHMoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZnAuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY2ZwLmMKaW5kZXggZjJlNmRlMC4uMTc4MmE3NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jZnAuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NmcC5jCkBAIC03NSwxOCArNzUsMzIgQEAKICAqIFRoaXMgZnVuY3Rpb24gbWFwcyBhbiBpbmRleCBpbiBzdXBwb3J0ZWQgcmF0ZXMgdGFibGUgaW50bwogICogdGhlIGNvcnJlc3BvbmRpbmcgZGF0YSByYXRlLgogICovCi11MzIgbXdpZmlleF9pbmRleF90b19kYXRhX3JhdGUodTggaW5kZXgsIHU4IGh0X2luZm8pCit1MzIgbXdpZmlleF9pbmRleF90b19kYXRhX3JhdGUoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwgdTggaW5kZXgsCisJCQkJCQkJdTggaHRfaW5mbykKIHsKLQl1MTYgbWNzX3JhdGVbNF1bOF0gPSB7Ci0JCXsweDFiLCAweDM2LCAweDUxLCAweDZjLCAweGEyLCAweGQ4LCAweGYzLCAweDEwZX0KLQksCQkJLyogTEcgNDBNICovCi0JezB4MWUsIDB4M2MsIDB4NWEsIDB4NzgsIDB4YjQsIDB4ZjAsIDB4MTBlLCAweDEyY30KLQksCQkJLyogU0cgNDBNICovCi0JezB4MGQsIDB4MWEsIDB4MjcsIDB4MzQsIDB4NGUsIDB4NjgsIDB4NzUsIDB4ODJ9Ci0JLAkJCS8qIExHIDIwTSAqLwotCXsweDBlLCAweDFjLCAweDJiLCAweDM5LCAweDU2LCAweDczLCAweDgyLCAweDkwfQotCX07CQkJLyogU0cgMjBNICovCisJLyoKKwkgKiBGb3IgZXZlcnkgbWNzX3JhdGUgbGluZSwgdGhlIGZpcnN0IDggYnl0ZXMgYXJlIGZvciBzdHJlYW0gMXgxLAorCSAqIGFuZCBhbGwgMTYgYnl0ZXMgYXJlIGZvciBzdHJlYW0gMngyLgorCSAqLworCXUxNiAgbWNzX3JhdGVbNF1bMTZdID0geworCQkvKiBMR0kgNDBNICovCisJCXsgMHgxYiwgMHgzNiwgMHg1MSwgMHg2YywgMHhhMiwgMHhkOCwgMHhmMywgMHgxMGUsCisJCSAgMHgzNiwgMHg2YywgMHhhMiwgMHhkOCwgMHgxNDQsIDB4MWIwLCAweDFlNiwgMHgyMWMgfSwKIAorCQkvKiBTR0kgNDBNICovCisJCXsgMHgxZSwgMHgzYywgMHg1YSwgMHg3OCwgMHhiNCwgMHhmMCwgMHgxMGUsIDB4MTJjLAorCQkgIDB4M2MsIDB4NzgsIDB4YjQsIDB4ZjAsIDB4MTY4LCAweDFlMCwgMHgyMWMsIDB4MjU4IH0sCisKKwkJLyogTEdJIDIwTSAqLworCQl7IDB4MGQsIDB4MWEsIDB4MjcsIDB4MzQsIDB4NGUsIDB4NjgsIDB4NzUsIDB4ODIsCisJCSAgMHgxYSwgMHgzNCwgMHg0ZSwgMHg2OCwgMHg5YywgMHhkMCwgMHhlYSwgMHgxMDQgfSwKKworCQkvKiBTR0kgMjBNICovCisJCXsgMHgwZSwgMHgxYywgMHgyYiwgMHgzOSwgMHg1NiwgMHg3MywgMHg4MiwgMHg5MCwKKwkJICAweDFjLCAweDM5LCAweDU2LCAweDczLCAweGFkLCAweGU3LCAweDEwNCwgMHgxMjAgfQorCX07CisJdTMyIG1jc19udW1fc3VwcCA9CisJCShwcml2LT5hZGFwdGVyLT5od19kZXZfbWNzX3N1cHBvcnQgPT0gSFRfU1RSRUFNXzJYMikgPyAxNiA6IDg7CiAJdTMyIHJhdGU7CiAKIAlpZiAoaHRfaW5mbyAmIEJJVCgwKSkgewpAQCAtOTUsNyArMTA5LDcgQEAKIAkJCQlyYXRlID0gMHgwRDsJLyogTUNTIDMyIFNHSSByYXRlICovCiAJCQllbHNlCiAJCQkJcmF0ZSA9IDB4MEM7CS8qIE1DUyAzMiBMR0kgcmF0ZSAqLwotCQl9IGVsc2UgaWYgKGluZGV4IDwgOCkgeworCQl9IGVsc2UgaWYgKGluZGV4IDwgbWNzX251bV9zdXBwKSB7CiAJCQlpZiAoaHRfaW5mbyAmIEJJVCgxKSkgewogCQkJCWlmIChodF9pbmZvICYgQklUKDIpKQogCQkJCQkvKiBTR0ksIDQwTSAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jbWRldnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvY21kZXZ0LmMKaW5kZXggYWMyNzgxNS4uNmUwYTNlYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9jbWRldnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2NtZGV2dC5jCkBAIC05MzksNyArOTM5LDYgQEAKIHsKIAlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kX25vZGUgPSBOVUxMLCAqdG1wX25vZGUgPSBOVUxMOwogCXVuc2lnbmVkIGxvbmcgY21kX2ZsYWdzOwotCXVuc2lnbmVkIGxvbmcgY21kX3BlbmRpbmdfcV9mbGFnczsKIAl1bnNpZ25lZCBsb25nIHNjYW5fcGVuZGluZ19xX2ZsYWdzOwogCXVpbnQxNl90IGNhbmNlbF9zY2FuX2NtZCA9IGZhbHNlOwogCkBAIC05NDksMTIgKzk0OCw5IEBACiAJCWNtZF9ub2RlID0gYWRhcHRlci0+Y3Vycl9jbWQ7CiAJCWNtZF9ub2RlLT53YWl0X3FfZW5hYmxlZCA9IGZhbHNlOwogCQljbWRfbm9kZS0+Y21kX2ZsYWcgfD0gQ01EX0ZfQ0FOQ0VMRUQ7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5jbWRfcGVuZGluZ19xX2xvY2ssCi0JCQkJICBjbWRfcGVuZGluZ19xX2ZsYWdzKTsKLQkJbGlzdF9kZWwoJmNtZF9ub2RlLT5saXN0KTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+Y21kX3BlbmRpbmdfcV9sb2NrLAotCQkJCSAgICAgICBjbWRfcGVuZGluZ19xX2ZsYWdzKTsKIAkJbXdpZmlleF9pbnNlcnRfY21kX3RvX2ZyZWVfcShhZGFwdGVyLCBjbWRfbm9kZSk7CisJCW13aWZpZXhfY29tcGxldGVfY21kKGFkYXB0ZXIsIGFkYXB0ZXItPmN1cnJfY21kKTsKKwkJYWRhcHRlci0+Y3Vycl9jbWQgPSBOVUxMOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGFwdGVyLT5td2lmaWV4X2NtZF9sb2NrLCBjbWRfZmxhZ3MpOwogCX0KIApAQCAtOTgxLDcgKzk3Nyw2IEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPm13aWZpZXhfY21kX2xvY2ssIGNtZF9mbGFncyk7CiAJfQogCWFkYXB0ZXItPmNtZF93YWl0X3Euc3RhdHVzID0gLTE7Ci0JbXdpZmlleF9jb21wbGV0ZV9jbWQoYWRhcHRlciwgYWRhcHRlci0+Y3Vycl9jbWQpOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9mdy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9mdy5oCmluZGV4IDBjYzVkNzMuLjUxYzU0MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvZncuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2Z3LmgKQEAgLTE2NSw2ICsxNjUsNyBAQAogCiAjZGVmaW5lIEdFVF9SWE1DU1NVUFAoRGV2TUNTU3VwcG9ydGVkKSAoRGV2TUNTU3VwcG9ydGVkICYgMHgwZikKICNkZWZpbmUgU0VUSFRfTUNTMzIoeCkgKHhbNF0gfD0gMSkKKyNkZWZpbmUgSFRfU1RSRUFNXzJYMgkweDIyCiAKICNkZWZpbmUgU0VUX1NFQ09OREFSWUNIQU4oUmFkaW9UeXBlLCBTRUNDSEFOKSAoUmFkaW9UeXBlIHw9IChTRUNDSEFOIDw8IDQpKQogCkBAIC0zNzUsOCArMzc2LDYgQEAKIAlNV0lGSUVYX0RJU0FCTEVfQ0hBTl9GSUxUID0gQklUKDEpLAogfTsKIAotI2RlZmluZSBTRUNPTkRfQ0hBTk5FTF9CRUxPVyAgICAweDMwCi0jZGVmaW5lIFNFQ09ORF9DSEFOTkVMX0FCT1ZFICAgIDB4MTAKIHN0cnVjdCBtd2lmaWV4X2NoYW5fc2Nhbl9wYXJhbV9zZXQgewogCXU4IHJhZGlvX3R5cGU7CiAJdTggY2hhbl9udW1iZXI7CkBAIC02NzMsNyArNjcyLDcgQEAKIAl1bmlvbiBpZWVlX3R5cGVzX3BoeV9wYXJhbV9zZXQgcGh5X3BhcmFtX3NldDsKIAl1MTYgcmVzZXJ2ZWQxOwogCV9fbGUxNiBjYXBfaW5mb19iaXRtYXA7Ci0JdTggRGF0YVJhdGVbSE9TVENNRF9TVVBQT1JURURfUkFURVNdOworCXU4IGRhdGFfcmF0ZVtIT1NUQ01EX1NVUFBPUlRFRF9SQVRFU107CiB9IF9fcGFja2VkOwogCiBzdHJ1Y3QgaG9zdF9jbWRfZHNfODAyXzExX2FkX2hvY19yZXN1bHQgewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pbml0LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2luaXQuYwppbmRleCBkNzkyYjNmLi5lMDViNDE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2luaXQuYwpAQCAtMTg3LDggKzE4Nyw2IEBACiAJc3RydWN0IG13aWZpZXhfb3B0X3NsZWVwX2NvbmZpcm0gKnNsZWVwX2NmbV9idWYgPSBOVUxMOwogCiAJc2tiX3B1dChhZGFwdGVyLT5zbGVlcF9jZm0sIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9vcHRfc2xlZXBfY29uZmlybSkpOwotCXNsZWVwX2NmbV9idWYgPSAoc3RydWN0IG13aWZpZXhfb3B0X3NsZWVwX2NvbmZpcm0gKikKLQkJCQkJCShhZGFwdGVyLT5zbGVlcF9jZm0tPmRhdGEpOwogCiAJYWRhcHRlci0+Y21kX3NlbnQgPSBmYWxzZTsKIApAQCAtMjQ4LDEyICsyNDYsMTQgQEAKIAltZW1zZXQoYWRhcHRlci0+ZXZlbnRfYm9keSwgMCwgc2l6ZW9mKGFkYXB0ZXItPmV2ZW50X2JvZHkpKTsKIAlhZGFwdGVyLT5od19kb3RfMTFuX2Rldl9jYXAgPSAwOwogCWFkYXB0ZXItPmh3X2Rldl9tY3Nfc3VwcG9ydCA9IDA7Ci0JYWRhcHRlci0+Y2hhbl9vZmZzZXQgPSAwOworCWFkYXB0ZXItPnNlY19jaGFuX29mZnNldCA9IDA7CiAJYWRhcHRlci0+YWRob2NfMTFuX2VuYWJsZWQgPSBmYWxzZTsKIAogCW13aWZpZXhfd21tX2luaXQoYWRhcHRlcik7CiAKIAlpZiAoYWRhcHRlci0+c2xlZXBfY2ZtKSB7CisJCXNsZWVwX2NmbV9idWYgPSAoc3RydWN0IG13aWZpZXhfb3B0X3NsZWVwX2NvbmZpcm0gKikKKwkJCQkJCWFkYXB0ZXItPnNsZWVwX2NmbS0+ZGF0YTsKIAkJbWVtc2V0KHNsZWVwX2NmbV9idWYsIDAsIGFkYXB0ZXItPnNsZWVwX2NmbS0+bGVuKTsKIAkJc2xlZXBfY2ZtX2J1Zi0+Y29tbWFuZCA9CiAJCQkJY3B1X3RvX2xlMTYoSG9zdENtZF9DTURfODAyXzExX1BTX01PREVfRU5IKTsKQEAgLTI4Myw2ICsyODMsNDUgQEAKIH0KIAogLyoKKyAqIFRoaXMgZnVuY3Rpb24gc2V0cyB0cmFuc19zdGFydCBwZXIgdHhfcXVldWUKKyAqLwordm9pZCBtd2lmaWV4X3NldF90cmFuc19zdGFydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGRldi0+bnVtX3R4X3F1ZXVlczsgaSsrKQorCQluZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgaSktPnRyYW5zX3N0YXJ0ID0gamlmZmllczsKKworCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiB3YWtlcyB1cCBhbGwgcXVldWVzIGluIG5ldF9kZXZpY2UKKyAqLwordm9pZCBtd2lmaWV4X3dha2VfdXBfbmV0X2Rldl9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LAorCQkJCQlzdHJ1Y3QgbXdpZmlleF9hZGFwdGVyICphZGFwdGVyKQoreworCXVuc2lnbmVkIGxvbmcgZGV2X3F1ZXVlX2ZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYXB0ZXItPnF1ZXVlX2xvY2ssIGRldl9xdWV1ZV9mbGFncyk7CisJbmV0aWZfdHhfd2FrZV9hbGxfcXVldWVzKG5ldGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRhcHRlci0+cXVldWVfbG9jaywgZGV2X3F1ZXVlX2ZsYWdzKTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gc3RvcHMgYWxsIHF1ZXVlcyBpbiBuZXRfZGV2aWNlCisgKi8KK3ZvaWQgbXdpZmlleF9zdG9wX25ldF9kZXZfcXVldWUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkJc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlcikKK3sKKwl1bnNpZ25lZCBsb25nIGRldl9xdWV1ZV9mbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZhZGFwdGVyLT5xdWV1ZV9sb2NrLCBkZXZfcXVldWVfZmxhZ3MpOworCW5ldGlmX3R4X3N0b3BfYWxsX3F1ZXVlcyhuZXRkZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkYXB0ZXItPnF1ZXVlX2xvY2ssIGRldl9xdWV1ZV9mbGFncyk7Cit9CisKKy8qCiAgKiAgVGhpcyBmdW5jdGlvbiByZWxlYXNlcyB0aGUgbG9jayB2YXJpYWJsZXMgYW5kIGZyZWVzIHRoZSBsb2NrcyBhbmQKICAqICBhc3NvY2lhdGVkIGxvY2tzLgogICovCkBAIC0zNTksNiArMzk4LDcgQEAKIAlzcGluX2xvY2tfaW5pdCgmYWRhcHRlci0+aW50X2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5tYWluX3Byb2NfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmFkYXB0ZXItPm13aWZpZXhfY21kX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZhZGFwdGVyLT5xdWV1ZV9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgYWRhcHRlci0+cHJpdl9udW07IGkrKykgewogCQlpZiAoYWRhcHRlci0+cHJpdltpXSkgewogCQkJcHJpdiA9IGFkYXB0ZXItPnByaXZbaV07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2lvY3RsLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2lvY3RsLmgKaW5kZXggZTBiNjhlNy4uZDVkODFmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9pb2N0bC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvaW9jdGwuaApAQCAtNjIsMTcgKzYyLDYgQEAKIAlCQU5EX0FOID0gMTYsCiB9OwogCi0jZGVmaW5lIE5PX1NFQ19DSEFOTkVMICAgICAgICAgICAgICAgMAotI2RlZmluZSBTRUNfQ0hBTk5FTF9BQk9WRSAgICAgICAgICAgIDEKLSNkZWZpbmUgU0VDX0NIQU5ORUxfQkVMT1cgICAgICAgICAgICAzCi0KLXN0cnVjdCBtd2lmaWV4X2RzX2JhbmRfY2ZnIHsKLQl1MzIgY29uZmlnX2JhbmRzOwotCXUzMiBhZGhvY19zdGFydF9iYW5kOwotCXUzMiBhZGhvY19jaGFubmVsOwotCXUzMiBzZWNfY2hhbl9vZmZzZXQ7Ci19OwotCiBlbnVtIHsKIAlBREhPQ19JRExFLAogCUFESE9DX1NUQVJURUQsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L2pvaW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvam9pbi5jCmluZGV4IDYyYjRjMjkuLjBiMGViNWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvam9pbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvam9pbi5jCkBAIC03MjQsOCArNzI0LDggQEAKIAl1MzIgY21kX2FwcGVuZF9zaXplID0gMDsKIAl1MzIgaTsKIAl1MTYgdG1wX2NhcDsKLQl1aW50MTZfdCBodF9jYXBfaW5mbzsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19jaGFuX2xpc3RfcGFyYW1fc2V0ICpjaGFuX3RsdjsKKwl1OCByYWRpb190eXBlOwogCiAJc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXAgKmh0X2NhcDsKIAlzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8gKmh0X2luZm87CkBAIC04MzcsOCArODM3LDggQEAKIAkJYnNzX2Rlc2MtPnByaXZhY3kgPSBNV0lGSUVYXzgwMl8xMV9QUklWX0ZJTFRFUl9BQ0NFUFRfQUxMOwogCX0KIAotCW1lbXNldChhZGhvY19zdGFydC0+RGF0YVJhdGUsIDAsIHNpemVvZihhZGhvY19zdGFydC0+RGF0YVJhdGUpKTsKLQltd2lmaWV4X2dldF9hY3RpdmVfZGF0YV9yYXRlcyhwcml2LCBhZGhvY19zdGFydC0+RGF0YVJhdGUpOworCW1lbXNldChhZGhvY19zdGFydC0+ZGF0YV9yYXRlLCAwLCBzaXplb2YoYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZSkpOworCW13aWZpZXhfZ2V0X2FjdGl2ZV9kYXRhX3JhdGVzKHByaXYsIGFkaG9jX3N0YXJ0LT5kYXRhX3JhdGUpOwogCWlmICgoYWRhcHRlci0+YWRob2Nfc3RhcnRfYmFuZCAmIEJBTkRfRykgJiYKIAkgICAgKHByaXYtPmN1cnJfcGt0X2ZpbHRlciAmIEhvc3RDbWRfQUNUX01BQ19BREhPQ19HX1BST1RFQ1RJT05fT04pKSB7CiAJCWlmIChtd2lmaWV4X3NlbmRfY21kX2FzeW5jKHByaXYsIEhvc3RDbWRfQ01EX01BQ19DT05UUk9MLApAQCAtODUwLDIwICs4NTAsMTkgQEAKIAkJfQogCX0KIAkvKiBGaW5kIHRoZSBsYXN0IG5vbiB6ZXJvICovCi0JZm9yIChpID0gMDsgaSA8IHNpemVvZihhZGhvY19zdGFydC0+RGF0YVJhdGUpICYmCi0JCQlhZGhvY19zdGFydC0+RGF0YVJhdGVbaV07Ci0JCQlpKyspCi0JCQk7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihhZGhvY19zdGFydC0+ZGF0YV9yYXRlKTsgaSsrKQorCQlpZiAoIWFkaG9jX3N0YXJ0LT5kYXRhX3JhdGVbaV0pCisJCQlicmVhazsKIAogCXByaXYtPmN1cnJfYnNzX3BhcmFtcy5udW1fb2ZfcmF0ZXMgPSBpOwogCiAJLyogQ29weSB0aGUgYWQtaG9jIGNyZWF0aW5nIHJhdGVzIGludG8gQ3VycmVudCBCU1MgcmF0ZSBzdHJ1Y3R1cmUgKi8KIAltZW1jcHkoJnByaXYtPmN1cnJfYnNzX3BhcmFtcy5kYXRhX3JhdGVzLAotCSAgICAgICAmYWRob2Nfc3RhcnQtPkRhdGFSYXRlLCBwcml2LT5jdXJyX2Jzc19wYXJhbXMubnVtX29mX3JhdGVzKTsKKwkgICAgICAgJmFkaG9jX3N0YXJ0LT5kYXRhX3JhdGUsIHByaXYtPmN1cnJfYnNzX3BhcmFtcy5udW1fb2ZfcmF0ZXMpOwogCiAJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJpbmZvOiBBREhPQ19TX0NNRDogcmF0ZXM9JTAyeCAlMDJ4ICUwMnggJTAyeFxuIiwKLQkgICAgICAgYWRob2Nfc3RhcnQtPkRhdGFSYXRlWzBdLCBhZGhvY19zdGFydC0+RGF0YVJhdGVbMV0sCi0JICAgICAgIGFkaG9jX3N0YXJ0LT5EYXRhUmF0ZVsyXSwgYWRob2Nfc3RhcnQtPkRhdGFSYXRlWzNdKTsKKwkgICAgICAgYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZVswXSwgYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZVsxXSwKKwkgICAgICAgYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZVsyXSwgYWRob2Nfc3RhcnQtPmRhdGFfcmF0ZVszXSk7CiAKIAlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImluZm86IEFESE9DX1NfQ01EOiBBRC1IT0MgU3RhcnQgY29tbWFuZCBpcyByZWFkeVxuIik7CiAKQEAgLTg4NiwxMiArODg1LDE0IEBACiAJCSAgICAgICA9IG13aWZpZXhfYmFuZF90b19yYWRpb190eXBlKHByaXYtPmN1cnJfYnNzX3BhcmFtcy5iYW5kKTsKIAkJaWYgKGFkYXB0ZXItPmFkaG9jX3N0YXJ0X2JhbmQgJiBCQU5EX0dOCiAJCSAgICB8fCBhZGFwdGVyLT5hZGhvY19zdGFydF9iYW5kICYgQkFORF9BTikgewotCQkJaWYgKGFkYXB0ZXItPmNoYW5fb2Zmc2V0ID09IFNFQ19DSEFOTkVMX0FCT1ZFKQorCQkJaWYgKGFkYXB0ZXItPnNlY19jaGFuX29mZnNldCA9PQorCQkJCQkgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkUpCiAJCQkJY2hhbl90bHYtPmNoYW5fc2Nhbl9wYXJhbVswXS5yYWRpb190eXBlIHw9Ci0JCQkJCVNFQ09ORF9DSEFOTkVMX0FCT1ZFOwotCQkJZWxzZSBpZiAoYWRhcHRlci0+Y2hhbl9vZmZzZXQgPT0gU0VDX0NIQU5ORUxfQkVMT1cpCisJCQkJCShJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRSA8PCA0KTsKKwkJCWVsc2UgaWYgKGFkYXB0ZXItPnNlY19jaGFuX29mZnNldCA9PQorCQkJCQkgICAgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkUpCiAJCQkJY2hhbl90bHYtPmNoYW5fc2Nhbl9wYXJhbVswXS5yYWRpb190eXBlIHw9Ci0JCQkJCVNFQ09ORF9DSEFOTkVMX0JFTE9XOworCQkJCQkoSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1cgPDwgNCk7CiAJCX0KIAkJZGV2X2RiZyhhZGFwdGVyLT5kZXYsICJpbmZvOiBBREhPQ19TX0NNRDogVExWIEJhbmQgPSAlZFxuIiwKIAkJICAgICAgIGNoYW5fdGx2LT5jaGFuX3NjYW5fcGFyYW1bMF0ucmFkaW9fdHlwZSk7CkBAIC05MTQsNTUgKzkxNSw0MCBAQAogCX0KIAogCWlmIChhZGFwdGVyLT5hZGhvY18xMW5fZW5hYmxlZCkgewotCQl7Ci0JCQlodF9jYXAgPSAoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXAgKikgcG9zOwotCQkJbWVtc2V0KGh0X2NhcCwgMCwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXApKTsKLQkJCWh0X2NhcC0+aGVhZGVyLnR5cGUgPQotCQkJCWNwdV90b19sZTE2KFdMQU5fRUlEX0hUX0NBUEFCSUxJVFkpOwotCQkJaHRfY2FwLT5oZWFkZXIubGVuID0KLQkJCSAgICAgICBjcHVfdG9fbGUxNihzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKLQkJCWh0X2NhcF9pbmZvID0gbGUxNl90b19jcHUoaHRfY2FwLT5odF9jYXAuY2FwX2luZm8pOworCQkvKiBGaWxsIEhUIENBUEFCSUxJVFkgKi8KKwkJaHRfY2FwID0gKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0Y2FwICopIHBvczsKKwkJbWVtc2V0KGh0X2NhcCwgMCwgc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0Y2FwKSk7CisJCWh0X2NhcC0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihXTEFOX0VJRF9IVF9DQVBBQklMSVRZKTsKKwkJaHRfY2FwLT5oZWFkZXIubGVuID0KKwkJICAgICAgIGNwdV90b19sZTE2KHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpOworCQlyYWRpb190eXBlID0gbXdpZmlleF9iYW5kX3RvX3JhZGlvX3R5cGUoCisJCQkJCXByaXYtPmFkYXB0ZXItPmNvbmZpZ19iYW5kcyk7CisJCW13aWZpZXhfZmlsbF9jYXBfaW5mbyhwcml2LCByYWRpb190eXBlLCBodF9jYXApOwogCi0JCQlodF9jYXBfaW5mbyB8PSBJRUVFODAyMTFfSFRfQ0FQX1NHSV8yMDsKLQkJCWlmIChhZGFwdGVyLT5jaGFuX29mZnNldCkgewotCQkJCWh0X2NhcF9pbmZvIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwOwotCQkJCWh0X2NhcF9pbmZvIHw9IElFRUU4MDIxMV9IVF9DQVBfRFNTU0NDSzQwOwotCQkJCWh0X2NhcF9pbmZvIHw9IElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwOwotCQkJCVNFVEhUX01DUzMyKGh0X2NhcC0+aHRfY2FwLm1jcy5yeF9tYXNrKTsKLQkJCX0KKwkJcG9zICs9IHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGNhcCk7CisJCWNtZF9hcHBlbmRfc2l6ZSArPQorCQkJc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0Y2FwKTsKIAotCQkJaHRfY2FwLT5odF9jYXAuYW1wZHVfcGFyYW1zX2luZm8KLQkJCQkJPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SzsKLQkJCWh0X2NhcC0+aHRfY2FwLm1jcy5yeF9tYXNrWzBdID0gMHhmZjsKLQkJCXBvcyArPSBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRjYXApOwotCQkJY21kX2FwcGVuZF9zaXplICs9Ci0JCQkJc2l6ZW9mKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0Y2FwKTsKLQkJfQotCQl7Ci0JCQlodF9pbmZvID0gKHN0cnVjdCBtd2lmaWV4X2llX3R5cGVzX2h0aW5mbyAqKSBwb3M7Ci0JCQltZW1zZXQoaHRfaW5mbywgMCwKLQkJCSAgICAgICBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRpbmZvKSk7Ci0JCQlodF9pbmZvLT5oZWFkZXIudHlwZSA9Ci0JCQkJY3B1X3RvX2xlMTYoV0xBTl9FSURfSFRfSU5GT1JNQVRJT04pOwotCQkJaHRfaW5mby0+aGVhZGVyLmxlbiA9Ci0JCQkJY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpOwotCQkJaHRfaW5mby0+aHRfaW5mby5jb250cm9sX2NoYW4gPQotCQkJCSh1OCkgcHJpdi0+Y3Vycl9ic3NfcGFyYW1zLmJzc19kZXNjcmlwdG9yLgotCQkJCWNoYW5uZWw7Ci0JCQlpZiAoYWRhcHRlci0+Y2hhbl9vZmZzZXQpIHsKLQkJCQlodF9pbmZvLT5odF9pbmZvLmh0X3BhcmFtID0KLQkJCQkJYWRhcHRlci0+Y2hhbl9vZmZzZXQ7Ci0JCQkJaHRfaW5mby0+aHRfaW5mby5odF9wYXJhbSB8PQorCQkvKiBGaWxsIEhUIElORk9STUFUSU9OICovCisJCWh0X2luZm8gPSAoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRpbmZvICopIHBvczsKKwkJbWVtc2V0KGh0X2luZm8sIDAsIHNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8pKTsKKwkJaHRfaW5mby0+aGVhZGVyLnR5cGUgPSBjcHVfdG9fbGUxNihXTEFOX0VJRF9IVF9JTkZPUk1BVElPTik7CisJCWh0X2luZm8tPmhlYWRlci5sZW4gPQorCQkJY3B1X3RvX2xlMTYoc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpOworCisJCWh0X2luZm8tPmh0X2luZm8uY29udHJvbF9jaGFuID0KKwkJCSh1OCkgcHJpdi0+Y3Vycl9ic3NfcGFyYW1zLmJzc19kZXNjcmlwdG9yLmNoYW5uZWw7CisJCWlmIChhZGFwdGVyLT5zZWNfY2hhbl9vZmZzZXQpIHsKKwkJCWh0X2luZm8tPmh0X2luZm8uaHRfcGFyYW0gPSBhZGFwdGVyLT5zZWNfY2hhbl9vZmZzZXQ7CisJCQlodF9pbmZvLT5odF9pbmZvLmh0X3BhcmFtIHw9CiAJCQkJCUlFRUU4MDIxMV9IVF9QQVJBTV9DSEFOX1dJRFRIX0FOWTsKLQkJCX0KLQkJCWh0X2luZm8tPmh0X2luZm8ub3BlcmF0aW9uX21vZGUgPQotCQkJICAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfT1BfTU9ERV9OT05fR0ZfU1RBX1BSU05UKTsKLQkJCWh0X2luZm8tPmh0X2luZm8uYmFzaWNfc2V0WzBdID0gMHhmZjsKLQkJCXBvcyArPSBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRpbmZvKTsKLQkJCWNtZF9hcHBlbmRfc2l6ZSArPQotCQkJCXNpemVvZihzdHJ1Y3QgbXdpZmlleF9pZV90eXBlc19odGluZm8pOwogCQl9CisJCWh0X2luZm8tPmh0X2luZm8ub3BlcmF0aW9uX21vZGUgPQorCQkgICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9PUF9NT0RFX05PTl9HRl9TVEFfUFJTTlQpOworCQlodF9pbmZvLT5odF9pbmZvLmJhc2ljX3NldFswXSA9IDB4ZmY7CisJCXBvcyArPSBzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRpbmZvKTsKKwkJY21kX2FwcGVuZF9zaXplICs9CisJCQlzaXplb2Yoc3RydWN0IG13aWZpZXhfaWVfdHlwZXNfaHRpbmZvKTsKIAl9CiAKIAljbWQtPnNpemUgPSBjcHVfdG9fbGUxNigodTE2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uYwppbmRleCA2N2U2ZGI3Li44NGJlMTk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uYwpAQCAtNDAxLDcgKzQwMSw3IEBACiBzdGF0aWMgaW50CiBtd2lmaWV4X29wZW4oc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQluZXRpZl9zdGFydF9xdWV1ZShkZXYpOworCW5ldGlmX3R4X3N0YXJ0X2FsbF9xdWV1ZXMoZGV2KTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDY1LDggKzQ2NSw4IEBACiAJYXRvbWljX2luYygmcHJpdi0+YWRhcHRlci0+dHhfcGVuZGluZyk7CiAKIAlpZiAoYXRvbWljX3JlYWQoJnByaXYtPmFkYXB0ZXItPnR4X3BlbmRpbmcpID49IE1BWF9UWF9QRU5ESU5HKSB7Ci0JCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKLQkJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJCW13aWZpZXhfc2V0X3RyYW5zX3N0YXJ0KGRldik7CisJCW13aWZpZXhfc3RvcF9uZXRfZGV2X3F1ZXVlKHByaXYtPm5ldGRldiwgcHJpdi0+YWRhcHRlcik7CiAJfQogCiAJcXVldWVfd29yayhwcml2LT5hZGFwdGVyLT53b3JrcXVldWUsICZwcml2LT5hZGFwdGVyLT5tYWluX3dvcmspOwpAQCAtNTMzLDcgKzUzMyw3IEBACiAKIAlkZXZfZXJyKHByaXYtPmFkYXB0ZXItPmRldiwgIiVsdSA6IFR4IHRpbWVvdXQsIGJzc19pbmRleD0lZFxuIiwKIAkJCQlqaWZmaWVzLCBwcml2LT5ic3NfaW5kZXgpOwotCWRldi0+dHJhbnNfc3RhcnQgPSBqaWZmaWVzOworCW13aWZpZXhfc2V0X3RyYW5zX3N0YXJ0KGRldik7CiAJcHJpdi0+bnVtX3R4X3RpbWVvdXQrKzsKIH0KIApAQCAtNTg2LDggKzU4Niw2IEBACiAJcHJpdi0+bWVkaWFfY29ubmVjdGVkID0gZmFsc2U7CiAJbWVtc2V0KCZwcml2LT5uaWNrX25hbWUsIDAsIHNpemVvZihwcml2LT5uaWNrX25hbWUpKTsKIAlwcml2LT5udW1fdHhfdGltZW91dCA9IDA7Ci0JcHJpdi0+d29ya3F1ZXVlID0gY3JlYXRlX3NpbmdsZXRocmVhZF93b3JrcXVldWUoImNmZzgwMjExX3dxIik7Ci0JSU5JVF9XT1JLKCZwcml2LT5jZmdfd29ya3F1ZXVlLCBtd2lmaWV4X2NmZzgwMjExX3Jlc3VsdHMpOwogCW1lbWNweShkZXYtPmRldl9hZGRyLCBwcml2LT5jdXJyX2FkZHIsIEVUSF9BTEVOKTsKIH0KIApAQCAtNzkzLDcgKzc5MSw4IEBACiAJCXByaXYgPSBhZGFwdGVyLT5wcml2W2ldOwogCQlpZiAocHJpdiAmJiBwcml2LT5uZXRkZXYpIHsKIAkJCWlmICghbmV0aWZfcXVldWVfc3RvcHBlZChwcml2LT5uZXRkZXYpKQotCQkJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKKwkJCQltd2lmaWV4X3N0b3BfbmV0X2Rldl9xdWV1ZShwcml2LT5uZXRkZXYsCisJCQkJCQkJCWFkYXB0ZXIpOwogCQkJaWYgKG5ldGlmX2NhcnJpZXJfb2socHJpdi0+bmV0ZGV2KSkKIAkJCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L21haW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCmluZGV4IDMwZjEzOGIuLjMxODZhYTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvbWFpbi5oCkBAIC00NTMsMTUgKzQ1Myw4IEBACiAJdTggc2Nhbl9wZW5kaW5nX29uX2Jsb2NrOwogCXU4IHJlcG9ydF9zY2FuX3Jlc3VsdDsKIAlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpzY2FuX3JlcXVlc3Q7Ci0JaW50IHNjYW5fcmVzdWx0X3N0YXR1czsKLQlpbnQgYXNzb2NfcmVxdWVzdDsKLQl1MTYgYXNzb2NfcmVzdWx0OwotCWludCBpYnNzX2pvaW5fcmVxdWVzdDsKLQl1MTYgaWJzc19qb2luX3Jlc3VsdDsKLQlib29sIGRpc2Nvbm5lY3Q7CisJc3RydWN0IG13aWZpZXhfdXNlcl9zY2FuX2NmZyAqdXNlcl9zY2FuX2NmZzsKIAl1OCBjZmdfYnNzaWRbNl07Ci0Jc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKndvcmtxdWV1ZTsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2ZnX3dvcmtxdWV1ZTsKIAl1OCBjb3VudHJ5X2NvZGVbSUVFRTgwMjExX0NPVU5UUllfU1RSSU5HX0xFTl07CiAJc3RydWN0IHdwcyB3cHM7CiAJdTggc2Nhbl9ibG9jazsKQEAgLTY0Nyw3ICs2NDAsOCBAQAogCXUzMiBod19kb3RfMTFuX2Rldl9jYXA7CiAJdTggaHdfZGV2X21jc19zdXBwb3J0OwogCXU4IGFkaG9jXzExbl9lbmFibGVkOwotCXU4IGNoYW5fb2Zmc2V0OworCXU4IHNlY19jaGFuX29mZnNldDsKKwllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZTsKIAlzdHJ1Y3QgbXdpZmlleF9kYmcgZGJnOwogCXU4IGFycF9maWx0ZXJbQVJQX0ZJTFRFUl9NQVhfQlVGX1NJWkVdOwogCXUzMiBhcnBfZmlsdGVyX3NpemU7CkBAIC02NTUsMTAgKzY0OSwxOSBAQAogCXN0cnVjdCBtd2lmaWV4X3dhaXRfcXVldWUgY21kX3dhaXRfcTsKIAl1OCBzY2FuX3dhaXRfcV93b2tlbjsKIAlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kX3F1ZXVlZDsKKwlzcGlubG9ja190IHF1ZXVlX2xvY2s7CQkvKiBsb2NrIGZvciB0eCBxdWV1ZXMgKi8KIH07CiAKIGludCBtd2lmaWV4X2luaXRfbG9ja19saXN0KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogCit2b2lkIG13aWZpZXhfc2V0X3RyYW5zX3N0YXJ0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworCit2b2lkIG13aWZpZXhfc3RvcF9uZXRfZGV2X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpOworCit2b2lkIG13aWZpZXhfd2FrZV91cF9uZXRfZGV2X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsCisJCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpOworCiBpbnQgbXdpZmlleF9pbml0X2Z3KHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpOwogCiBpbnQgbXdpZmlleF9pbml0X2Z3X2NvbXBsZXRlKHN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIpOwpAQCAtNzc1LDcgKzc3OCw4IEBACiBzdHJ1Y3QgbXdpZmlleF9jaGFuX2ZyZXFfcG93ZXIgKm13aWZpZXhfZ2V0X2NmcF9ieV9iYW5kX2FuZF9mcmVxX2Zyb21fY2ZnODAyMTEoCiAJCQkJCQlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAogCQkJCQkJdTggYmFuZCwgdTMyIGZyZXEpOwotdTMyIG13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHU4IGluZGV4LCB1OCBodF9pbmZvKTsKK3UzMiBtd2lmaWV4X2luZGV4X3RvX2RhdGFfcmF0ZShzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1OCBpbmRleCwKKwkJCQkJCQl1OCBodF9pbmZvKTsKIHUzMiBtd2lmaWV4X2ZpbmRfZnJlcV9mcm9tX2JhbmRfY2hhbih1OCwgdTgpOwogaW50IG13aWZpZXhfY21kX2FwcGVuZF92c2llX3RsdihzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LCB1MTYgdnNpZV9tYXNrLAogCQkJCXU4ICoqYnVmZmVyKTsKQEAgLTk1MSw4ICs5NTUsNiBAQAogCiBpbnQgbXdpZmlleF9ic3Nfc2V0X2NoYW5uZWwoc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqLAogCQkJICAgIHN0cnVjdCBtd2lmaWV4X2NoYW5fZnJlcV9wb3dlciAqY2ZwKTsKLWludCBtd2lmaWV4X3NldF9yYWRpb19iYW5kX2NmZyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICosCi0JCQkgc3RydWN0IG13aWZpZXhfZHNfYmFuZF9jZmcgKik7CiBpbnQgbXdpZmlleF9nZXRfYnNzX2luZm8oc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqLAogCQkJIHN0cnVjdCBtd2lmaWV4X2Jzc19pbmZvICopOwogaW50IG13aWZpZXhfZmlsbF9uZXdfYnNzX2Rlc2Moc3RydWN0IG13aWZpZXhfcHJpdmF0ZSAqcHJpdiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvcGNpZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmMKaW5kZXggZDM0YWNmMC4uNDA1MzUwOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9wY2llLmMKQEAgLTM4Niw4ICszODYsNyBAQAogCWNhcmQtPnR4YmRfcmluZ192YmFzZSA9IGt6YWxsb2MoY2FyZC0+dHhiZF9yaW5nX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghY2FyZC0+dHhiZF9yaW5nX3ZiYXNlKSB7CiAJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAiVW5hYmxlIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgdHhiZCByaW5nLlxuIik7Ci0JCWtmcmVlKGNhcmQtPnR4YmRfcmluZ192YmFzZSk7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWNhcmQtPnR4YmRfcmluZ19wYmFzZSA9IHZpcnRfdG9fcGh5cyhjYXJkLT50eGJkX3JpbmdfdmJhc2UpOwogCkBAIC00NzcsNyArNDc2LDcgQEAKIAlpZiAoIWNhcmQtPnJ4YmRfcmluZ192YmFzZSkgewogCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yICIKIAkJCQkicnhiZF9yaW5nLlxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCWNhcmQtPnJ4YmRfcmluZ19wYmFzZSA9IHZpcnRfdG9fcGh5cyhjYXJkLT5yeGJkX3JpbmdfdmJhc2UpOwogCkBAIC01NzAsNyArNTY5LDcgQEAKIAlpZiAoIWNhcmQtPmV2dGJkX3JpbmdfdmJhc2UpIHsKIAkJZGV2X2VycihhZGFwdGVyLT5kZXYsICJVbmFibGUgdG8gYWxsb2NhdGUgYnVmZmVyLiAiCiAJCQkJIlRlcm1pbmF0aW5nIGRvd25sb2FkXG4iKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJY2FyZC0+ZXZ0YmRfcmluZ19wYmFzZSA9IHZpcnRfdG9fcGh5cyhjYXJkLT5ldnRiZF9yaW5nX3ZiYXNlKTsKIApAQCAtMTIyOSwxNSArMTIyOCwxNiBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gMDsKIAotCWlmIChyZHB0ciA+PSBNV0lGSUVYX01BWF9FVlRfQkQpCisJaWYgKHJkcHRyID49IE1XSUZJRVhfTUFYX0VWVF9CRCkgewogCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgImV2ZW50X2NvbXBsZXRlOiBJbnZhbGlkIHJkcHRyIDB4JXhcbiIsCiAJCQkJCXJkcHRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJLyogUmVhZCB0aGUgZXZlbnQgcmluZyB3cml0ZSBwb2ludGVyIHNldCBieSBmaXJtd2FyZSAqLwogCWlmIChtd2lmaWV4X3JlYWRfcmVnKGFkYXB0ZXIsIFJFR19FVlRCRF9XUlBUUiwgJndycHRyKSkgewogCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgImV2ZW50X2NvbXBsZXRlOiBmYWlsZWQgdG8gcmVhZCBSRUdfRVZUQkRfV1JQVFJcbiIpOwotCQlyZXQgPSAtMTsKLQkJZ290byBkb25lOworCQlyZXR1cm4gLTE7CiAJfQogCiAJaWYgKCFjYXJkLT5ldnRfYnVmX2xpc3RbcmRwdHJdKSB7CkBAIC0xMjY2LDE1ICsxMjY2LDkgQEAKIAkvKiBXcml0ZSB0aGUgZXZlbnQgcmluZyByZWFkIHBvaW50ZXIgaW4gdG8gUkVHX0VWVEJEX1JEUFRSICovCiAJaWYgKG13aWZpZXhfd3JpdGVfcmVnKGFkYXB0ZXIsIFJFR19FVlRCRF9SRFBUUiwgY2FyZC0+ZXZ0YmRfcmRwdHIpKSB7CiAJCWRldl9lcnIoYWRhcHRlci0+ZGV2LCAiZXZlbnRfY29tcGxldGU6IGZhaWxlZCB0byByZWFkIFJFR19FVlRCRF9SRFBUUlxuIik7Ci0JCXJldCA9IC0xOwotCQlnb3RvIGRvbmU7CisJCXJldHVybiAtMTsKIAl9CiAKLWRvbmU6Ci0JLyogRnJlZSB0aGUgYnVmZmVyIGZvciBmYWlsdXJlIGNhc2UgKi8KLQlpZiAocmV0ICYmIHNrYikKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKLQogCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogQ2hlY2sgRXZlbnRzIEFnYWluXG4iKTsKIAlyZXQgPSBtd2lmaWV4X3BjaWVfcHJvY2Vzc19ldmVudF9yZWFkeShhZGFwdGVyKTsKIApAQCAtMTY3Miw5ICsxNjY2LDggQEAKIAkJCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJICAgICBzdHJ1Y3QgbXdpZmlleF90eF9wYXJhbSAqdHhfcGFyYW0pCiB7Ci0JaWYgKCFhZGFwdGVyIHx8ICFza2IpIHsKLQkJZGV2X2VycihhZGFwdGVyLT5kZXYsICJJbnZhbGlkIHBhcmFtZXRlciBpbiAlcyA8JXAsICVwPlxuIiwKLQkJCQlfX2Z1bmNfXywgYWRhcHRlciwgc2tiKTsKKwlpZiAoIXNrYikgeworCQlkZXZfZXJyKGFkYXB0ZXItPmRldiwgIlBhc3NlZCBOVUxMIHNrYiB0byAlc1xuIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLTE7CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Nhbi5jCmluZGV4IDhkM2FiMzcuLjYzOTZkMzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Nhbi5jCkBAIC01MDAsNyArNTAwLDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoOwogCXN0cnVjdCBtd2lmaWV4X2FkYXB0ZXIgKmFkYXB0ZXIgPSBwcml2LT5hZGFwdGVyOwogCWludCBjaGFuX2lkeCA9IDAsIGk7Ci0JdTggc2Nhbl90eXBlOwogCiAJZm9yIChiYW5kID0gMDsgKGJhbmQgPCBJRUVFODAyMTFfTlVNX0JBTkRTKSA7IGJhbmQrKykgewogCkBAIC01MTQsMTkgKzUxMywyMCBAQAogCQkJaWYgKGNoLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX0RJU0FCTEVEKQogCQkJCWNvbnRpbnVlOwogCQkJc2Nhbl9jaGFuX2xpc3RbY2hhbl9pZHhdLnJhZGlvX3R5cGUgPSBiYW5kOwotCQkJc2Nhbl90eXBlID0gY2gtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOOworCiAJCQlpZiAodXNlcl9zY2FuX2luICYmCiAJCQkJdXNlcl9zY2FuX2luLT5jaGFuX2xpc3RbMF0uc2Nhbl90aW1lKQogCQkJCXNjYW5fY2hhbl9saXN0W2NoYW5faWR4XS5tYXhfc2Nhbl90aW1lID0KIAkJCQkJY3B1X3RvX2xlMTYoKHUxNikgdXNlcl9zY2FuX2luLT4KIAkJCQkJY2hhbl9saXN0WzBdLnNjYW5fdGltZSk7Ci0JCQllbHNlIGlmIChzY2FuX3R5cGUgPT0gTVdJRklFWF9TQ0FOX1RZUEVfUEFTU0lWRSkKKwkJCWVsc2UgaWYgKGNoLT5mbGFncyAmIElFRUU4MDIxMV9DSEFOX1BBU1NJVkVfU0NBTikKIAkJCQlzY2FuX2NoYW5fbGlzdFtjaGFuX2lkeF0ubWF4X3NjYW5fdGltZSA9CiAJCQkJCWNwdV90b19sZTE2KGFkYXB0ZXItPnBhc3NpdmVfc2Nhbl90aW1lKTsKIAkJCWVsc2UKIAkJCQlzY2FuX2NoYW5fbGlzdFtjaGFuX2lkeF0ubWF4X3NjYW5fdGltZSA9CiAJCQkJCWNwdV90b19sZTE2KGFkYXB0ZXItPmFjdGl2ZV9zY2FuX3RpbWUpOwotCQkJaWYgKHNjYW5fdHlwZSA9PSBNV0lGSUVYX1NDQU5fVFlQRV9QQVNTSVZFKQorCisJCQlpZiAoY2gtPmZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKQogCQkJCXNjYW5fY2hhbl9saXN0W2NoYW5faWR4XS5jaGFuX3NjYW5fbW9kZV9iaXRtYXAKIAkJCQkJfD0gTVdJRklFWF9QQVNTSVZFX1NDQU47CiAJCQllbHNlCkBAIC0xMzkxLDExICsxMzkxLDggQEAKIHsKIAlpbnQgc3RhdHVzOwogCi0JcHJpdi0+YWRhcHRlci0+c2Nhbl93YWl0X3Ffd29rZW4gPSBmYWxzZTsKLQogCXN0YXR1cyA9IG13aWZpZXhfc2Nhbl9uZXR3b3Jrcyhwcml2LCBzY2FuX3JlcSk7Ci0JaWYgKCFzdGF0dXMpCi0JCXN0YXR1cyA9IG13aWZpZXhfd2FpdF9xdWV1ZV9jb21wbGV0ZShwcml2LT5hZGFwdGVyKTsKKwlxdWV1ZV93b3JrKHByaXYtPmFkYXB0ZXItPndvcmtxdWV1ZSwgJnByaXYtPmFkYXB0ZXItPm1haW5fd29yayk7CiAKIAlyZXR1cm4gc3RhdHVzOwogfQpAQCAtMTUzNywxMSArMTUzNCw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG13aWZpZXhfZnJlZV9ic3NfcHJpdihzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MpCi17Ci0Ja2ZyZWUoYnNzLT5wcml2KTsKLX0KLQogLyoKICAqIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyB0aGUgY29tbWFuZCByZXNwb25zZSBvZiBzY2FuLgogICoKQEAgLTE3NjcsNyArMTc1OSw3IEBACiAJCQkJCSAgICAgIGNhcF9pbmZvX2JpdG1hcCwgYmVhY29uX3BlcmlvZCwKIAkJCQkJICAgICAgaWVfYnVmLCBpZV9sZW4sIHJzc2ksIEdGUF9LRVJORUwpOwogCQkJCSoodTggKilic3MtPnByaXYgPSBiYW5kOwotCQkJCWJzcy0+ZnJlZV9wcml2ID0gbXdpZmlleF9mcmVlX2Jzc19wcml2OworCQkJCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKIAogCQkJCWlmIChwcml2LT5tZWRpYV9jb25uZWN0ZWQgJiYgIW1lbWNtcChic3NpZCwKIAkJCQkJcHJpdi0+Y3Vycl9ic3NfcGFyYW1zLmJzc19kZXNjcmlwdG9yCkBAIC0xODAxLDYgKzE3OTMsMTQgQEAKIAkJCXVwKCZwcml2LT5hc3luY19zZW0pOwogCQl9CiAKKwkJaWYgKHByaXYtPnVzZXJfc2Nhbl9jZmcpIHsKKwkJCWRldl9kYmcocHJpdi0+YWRhcHRlci0+ZGV2LCAiaW5mbzogJXM6IHNlbmRpbmcgc2NhbiAiCisJCQkJCQkJInJlc3VsdHNcbiIsIF9fZnVuY19fKTsKKwkJCWNmZzgwMjExX3NjYW5fZG9uZShwcml2LT5zY2FuX3JlcXVlc3QsIDApOworCQkJcHJpdi0+c2Nhbl9yZXF1ZXN0ID0gTlVMTDsKKwkJCWtmcmVlKHByaXYtPnVzZXJfc2Nhbl9jZmcpOworCQkJcHJpdi0+dXNlcl9zY2FuX2NmZyA9IE5VTEw7CisJCX0KIAl9IGVsc2UgewogCQkvKiBHZXQgc2NhbiBjb21tYW5kIGZyb20gc2Nhbl9wZW5kaW5nX3EgYW5kIHB1dCB0bwogCQkgICBjbWRfcGVuZGluZ19xICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3NkaW8uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5jCmluZGV4IDI4MzE3MWIuLmQzOWQ4NDUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5jCkBAIC0yNTYsMTAgKzI1NiwxMyBAQAogCiAvKiBEZXZpY2UgSUQgZm9yIFNEODc4NyAqLwogI2RlZmluZSBTRElPX0RFVklDRV9JRF9NQVJWRUxMXzg3ODcgICAoMHg5MTE5KQorLyogRGV2aWNlIElEIGZvciBTRDg3OTcgKi8KKyNkZWZpbmUgU0RJT19ERVZJQ0VfSURfTUFSVkVMTF84Nzk3ICAgKDB4OTEyOSkKIAogLyogV0xBTiBJRHMgKi8KIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgbXdpZmlleF9pZHNbXSA9IHsKIAl7U0RJT19ERVZJQ0UoU0RJT19WRU5ET1JfSURfTUFSVkVMTCwgU0RJT19ERVZJQ0VfSURfTUFSVkVMTF84Nzg3KX0sCisJe1NESU9fREVWSUNFKFNESU9fVkVORE9SX0lEX01BUlZFTEwsIFNESU9fREVWSUNFX0lEX01BUlZFTExfODc5Nyl9LAogCXt9LAogfTsKIApAQCAtMTA4NCw3ICsxMDg3LDcgQEAKIAkJCQkJICAgKGFkYXB0ZXItPmlvcG9ydCB8IDB4MTAwMCB8CiAJCQkJCSAgICAoY2FyZC0+bXBhX3J4LnBvcnRzIDw8IDQpKSArCiAJCQkJCSAgIGNhcmQtPm1wYV9yeC5zdGFydF9wb3J0LCAxKSkKLQkJCXJldHVybiAtMTsKKwkJCWdvdG8gZXJyb3I7CiAKIAkJY3Vycl9wdHIgPSBjYXJkLT5tcGFfcnguYnVmOwogCkBAIC0xMTI3LDEyICsxMTMwLDI5IEBACiAJCWlmIChtd2lmaWV4X3NkaW9fY2FyZF90b19ob3N0KGFkYXB0ZXIsICZwa3RfdHlwZSwKIAkJCQkJICAgICAgc2tiLT5kYXRhLCBza2ItPmxlbiwKIAkJCQkJICAgICAgYWRhcHRlci0+aW9wb3J0ICsgcG9ydCkpCi0JCQlyZXR1cm4gLTE7CisJCQlnb3RvIGVycm9yOwogCiAJCW13aWZpZXhfZGVjb2RlX3J4X3BhY2tldChhZGFwdGVyLCBza2IsIHBrdF90eXBlKTsKIAl9CiAKIAlyZXR1cm4gMDsKKworZXJyb3I6CisJaWYgKE1QX1JYX0FHR1JfSU5fUFJPR1JFU1MoY2FyZCkpIHsKKwkJLyogTXVsdGlwb3J0LWFnZ3JlZ2F0aW9uIHRyYW5zZmVyIGZhaWxlZCAtIGNsZWFudXAgKi8KKwkJZm9yIChwaW5kID0gMDsgcGluZCA8IGNhcmQtPm1wYV9yeC5wa3RfY250OyBwaW5kKyspIHsKKwkJCS8qIGNvcHkgcGt0IHRvIGRlYWdnciBidWYgKi8KKwkJCXNrYl9kZWFnZ3IgPSBjYXJkLT5tcGFfcnguc2tiX2FycltwaW5kXTsKKwkJCWRldl9rZnJlZV9za2JfYW55KHNrYl9kZWFnZ3IpOworCQl9CisJCU1QX1JYX0FHR1JfQlVGX1JFU0VUKGNhcmQpOworCX0KKworCWlmIChmX2RvX3J4X2N1cikKKwkJLyogU2luZ2xlIHRyYW5zZmVyIHBlbmRpbmcuIEZyZWUgY3VyciBidWZmIGFsc28gKi8KKwkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKworCXJldHVybiAtMTsKIH0KIAogLyoKQEAgLTEyNjgsNyArMTI4OCw2IEBACiAKIAkJCQlkZXZfZGJnKGFkYXB0ZXItPmRldiwKIAkJCQkJCSJpbmZvOiBDRkcgcmVnIHZhbCA9JXhcbiIsIGNyKTsKLQkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwogCQkJCXJldHVybiAtMTsKIAkJCX0KIAkJfQpAQCAtMTU3Myw3ICsxNTkyLDE2IEBACiAJc2Rpb19zZXRfZHJ2ZGF0YShmdW5jLCBjYXJkKTsKIAogCWFkYXB0ZXItPmRldiA9ICZmdW5jLT5kZXY7Ci0Jc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIFNEODc4N19ERUZBVUxUX0ZXX05BTUUpOworCisJc3dpdGNoIChmdW5jLT5kZXZpY2UpIHsKKwljYXNlIFNESU9fREVWSUNFX0lEX01BUlZFTExfODc5NzoKKwkJc3RyY3B5KGFkYXB0ZXItPmZ3X25hbWUsIFNEODc5N19ERUZBVUxUX0ZXX05BTUUpOworCQlicmVhazsKKwljYXNlIFNESU9fREVWSUNFX0lEX01BUlZFTExfODc4NzoKKwlkZWZhdWx0OgorCQlzdHJjcHkoYWRhcHRlci0+ZndfbmFtZSwgU0Q4Nzg3X0RFRkFVTFRfRldfTkFNRSk7CisJCWJyZWFrOworCX0KIAogCXJldHVybiAwOwogCkBAIC0xNjMwLDE0ICsxNjU4LDE0IEBACiAJY2FyZC0+bXBhX3R4LnBrdF9jbnQgPSAwOwogCWNhcmQtPm1wYV90eC5zdGFydF9wb3J0ID0gMDsKIAotCWNhcmQtPm1wYV90eC5lbmFibGVkID0gMDsKKwljYXJkLT5tcGFfdHguZW5hYmxlZCA9IDE7CiAJY2FyZC0+bXBhX3R4LnBrdF9hZ2dyX2xpbWl0ID0gU0RJT19NUF9BR0dSX0RFRl9QS1RfTElNSVQ7CiAKIAljYXJkLT5tcGFfcnguYnVmX2xlbiA9IDA7CiAJY2FyZC0+bXBhX3J4LnBrdF9jbnQgPSAwOwogCWNhcmQtPm1wYV9yeC5zdGFydF9wb3J0ID0gMDsKIAotCWNhcmQtPm1wYV9yeC5lbmFibGVkID0gMDsKKwljYXJkLT5tcGFfcnguZW5hYmxlZCA9IDE7CiAJY2FyZC0+bXBhX3J4LnBrdF9hZ2dyX2xpbWl0ID0gU0RJT19NUF9BR0dSX0RFRl9QS1RfTElNSVQ7CiAKIAkvKiBBbGxvY2F0ZSBidWZmZXJzIGZvciBTRElPIE1QLUEgKi8KQEAgLTE3NzQsNCArMTgwMiw1IEBACiBNT0RVTEVfREVTQ1JJUFRJT04oIk1hcnZlbGwgV2lGaS1FeCBTRElPIERyaXZlciB2ZXJzaW9uICIgU0RJT19WRVJTSU9OKTsKIE1PRFVMRV9WRVJTSU9OKFNESU9fVkVSU0lPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Ci1NT0RVTEVfRklSTVdBUkUoIm1ydmwvc2Q4Nzg3X3VhcHN0YS5iaW4iKTsKK01PRFVMRV9GSVJNV0FSRShTRDg3ODdfREVGQVVMVF9GV19OQU1FKTsKK01PRFVMRV9GSVJNV0FSRShTRDg3OTdfREVGQVVMVF9GV19OQU1FKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc2Rpby5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKaW5kZXggM2Y3MTE4MC4uYTNmYjMyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zZGlvLmgKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlICJtYWluLmgiCiAKICNkZWZpbmUgU0Q4Nzg3X0RFRkFVTFRfRldfTkFNRSAibXJ2bC9zZDg3ODdfdWFwc3RhLmJpbiIKKyNkZWZpbmUgU0Q4Nzk3X0RFRkFVTFRfRldfTkFNRSAibXJ2bC9zZDg3OTdfdWFwc3RhLmJpbiIKIAogI2RlZmluZSBCTE9DS19NT0RFCTEKICNkZWZpbmUgQllURV9NT0RFCTAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kLmMKaW5kZXggZWE2NTE4ZC4uNmU0NDNmZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kLmMKQEAgLTc0OCw3ICs3NDgsNyBAQAogCQkJCWNwdV90b19sZTE2KEhvc3RDbWRfU0NBTl9SQURJT19UWVBFX0EpOwogCiAJCXJmX3R5cGUgPSBsZTE2X3RvX2NwdShyZl9jaGFuLT5yZl90eXBlKTsKLQkJU0VUX1NFQ09OREFSWUNIQU4ocmZfdHlwZSwgcHJpdi0+YWRhcHRlci0+Y2hhbl9vZmZzZXQpOworCQlTRVRfU0VDT05EQVJZQ0hBTihyZl90eXBlLCBwcml2LT5hZGFwdGVyLT5zZWNfY2hhbl9vZmZzZXQpOwogCQlyZl9jaGFuLT5jdXJyZW50X2NoYW5uZWwgPSBjcHVfdG9fbGUxNigqY2hhbm5lbCk7CiAJfQogCXJmX2NoYW4tPmFjdGlvbiA9IGNwdV90b19sZTE2KGNtZF9hY3Rpb24pOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kcmVzcC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfY21kcmVzcC5jCmluZGV4IDdhMTZiMGMuLmU4MTJkYjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2NtZHJlc3AuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9jbWRyZXNwLmMKQEAgLTUwOCw3ICs1MDgsNyBAQAogCXByaXYtPnR4X2h0aW5mbyA9IHJlc3AtPnBhcmFtcy50eF9yYXRlLmh0X2luZm87CiAJaWYgKCFwcml2LT5pc19kYXRhX3JhdGVfYXV0bykKIAkJcHJpdi0+ZGF0YV9yYXRlID0KLQkJCW13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHByaXYtPnR4X3JhdGUsCisJCQltd2lmaWV4X2luZGV4X3RvX2RhdGFfcmF0ZShwcml2LCBwcml2LT50eF9yYXRlLAogCQkJCQkJICAgcHJpdi0+dHhfaHRpbmZvKTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfZXZlbnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2V2ZW50LmMKaW5kZXggZjIwNDgxMC4uZDdhYTIxZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfZXZlbnQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9ldmVudC5jCkBAIC0xMTUsMTggKzExNSwxNyBAQAogCWlmIChhZGFwdGVyLT5udW1fY21kX3RpbWVvdXQgJiYgYWRhcHRlci0+Y3Vycl9jbWQpCiAJCXJldHVybjsKIAlwcml2LT5tZWRpYV9jb25uZWN0ZWQgPSBmYWxzZTsKLQlpZiAoIXByaXYtPmRpc2Nvbm5lY3QpIHsKLQkJcHJpdi0+ZGlzY29ubmVjdCA9IDE7Ci0JCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiaW5mbzogc3VjY2Vzc2Z1bGx5IGRpc2Nvbm5lY3RlZCBmcm9tIgotCQkJCSIgJXBNOiByZWFzb24gY29kZSAlZFxuIiwgcHJpdi0+Y2ZnX2Jzc2lkLAotCQkJCVdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKLQkJY2ZnODAyMTFfZGlzY29ubmVjdGVkKHByaXYtPm5ldGRldiwKLQkJCQlXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORywgTlVMTCwgMCwKLQkJCQlHRlBfS0VSTkVMKTsKLQkJcXVldWVfd29yayhwcml2LT53b3JrcXVldWUsICZwcml2LT5jZmdfd29ya3F1ZXVlKTsKKwlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImluZm86IHN1Y2Nlc3NmdWxseSBkaXNjb25uZWN0ZWQgZnJvbSIKKwkJCSIgJXBNOiByZWFzb24gY29kZSAlZFxuIiwgcHJpdi0+Y2ZnX2Jzc2lkLAorCQkJV0xBTl9SRUFTT05fREVBVVRIX0xFQVZJTkcpOworCWlmIChwcml2LT5ic3NfbW9kZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7CisJCWNmZzgwMjExX2Rpc2Nvbm5lY3RlZChwcml2LT5uZXRkZXYsIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HLAorCQkJCSAgICAgIE5VTEwsIDAsIEdGUF9LRVJORUwpOwogCX0KKwltZW1zZXQocHJpdi0+Y2ZnX2Jzc2lkLCAwLCBFVEhfQUxFTik7CisKIAlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQocHJpdi0+bmV0ZGV2KSkKLQkJbmV0aWZfc3RvcF9xdWV1ZShwcml2LT5uZXRkZXYpOworCQltd2lmaWV4X3N0b3BfbmV0X2Rldl9xdWV1ZShwcml2LT5uZXRkZXYsIGFkYXB0ZXIpOwogCWlmIChuZXRpZl9jYXJyaWVyX29rKHByaXYtPm5ldGRldikpCiAJCW5ldGlmX2NhcnJpZXJfb2ZmKHByaXYtPm5ldGRldik7CiAJLyogUmVzZXQgd2lyZWxlc3Mgc3RhdHMgc2lnbmFsIGluZm8gKi8KQEAgLTIwMSw3ICsyMDAsNyBAQAogCQlpZiAoIW5ldGlmX2NhcnJpZXJfb2socHJpdi0+bmV0ZGV2KSkKIAkJCW5ldGlmX2NhcnJpZXJfb24ocHJpdi0+bmV0ZGV2KTsKIAkJaWYgKG5ldGlmX3F1ZXVlX3N0b3BwZWQocHJpdi0+bmV0ZGV2KSkKLQkJCW5ldGlmX3dha2VfcXVldWUocHJpdi0+bmV0ZGV2KTsKKwkJCW13aWZpZXhfd2FrZV91cF9uZXRfZGV2X3F1ZXVlKHByaXYtPm5ldGRldiwgYWRhcHRlcik7CiAJCWJyZWFrOwogCiAJY2FzZSBFVkVOVF9ERUFVVEhFTlRJQ0FURUQ6CkBAIC0yOTIsNyArMjkxLDcgQEAKIAkJcHJpdi0+YWRob2NfaXNfbGlua19zZW5zZWQgPSBmYWxzZTsKIAkJbXdpZmlleF9jbGVhbl90eHJ4KHByaXYpOwogCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQocHJpdi0+bmV0ZGV2KSkKLQkJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKKwkJCW13aWZpZXhfc3RvcF9uZXRfZGV2X3F1ZXVlKHByaXYtPm5ldGRldiwgYWRhcHRlcik7CiAJCWlmIChuZXRpZl9jYXJyaWVyX29rKHByaXYtPm5ldGRldikpCiAJCQluZXRpZl9jYXJyaWVyX29mZihwcml2LT5uZXRkZXYpOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2lvY3RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9pb2N0bC5jCmluZGV4IGVhNGEyOWIuLjQ3MGNhNzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX2lvY3RsLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfaW9jdGwuYwpAQCAtNTUsOSArNTUsMTQgQEAKIHsKIAlib29sIGNhbmNlbF9mbGFnID0gZmFsc2U7CiAJaW50IHN0YXR1cyA9IGFkYXB0ZXItPmNtZF93YWl0X3Euc3RhdHVzOwotCXN0cnVjdCBjbWRfY3RybF9ub2RlICpjbWRfcXVldWVkID0gYWRhcHRlci0+Y21kX3F1ZXVlZDsKKwlzdHJ1Y3QgY21kX2N0cmxfbm9kZSAqY21kX3F1ZXVlZDsKIAorCWlmICghYWRhcHRlci0+Y21kX3F1ZXVlZCkKKwkJcmV0dXJuIDA7CisKKwljbWRfcXVldWVkID0gYWRhcHRlci0+Y21kX3F1ZXVlZDsKIAlhZGFwdGVyLT5jbWRfcXVldWVkID0gTlVMTDsKKwogCWRldl9kYmcoYWRhcHRlci0+ZGV2LCAiY21kIHBlbmRpbmdcbiIpOwogCWF0b21pY19pbmMoJmFkYXB0ZXItPmNtZF9wZW5kaW5nKTsKIApAQCAtMjM0LDcgKzIzOSw3IEBACiAJCQkJICAgICAgImFzc29jaWF0aW5nLi4uXG4iKTsKIAogCQlpZiAoIW5ldGlmX3F1ZXVlX3N0b3BwZWQocHJpdi0+bmV0ZGV2KSkKLQkJCW5ldGlmX3N0b3BfcXVldWUocHJpdi0+bmV0ZGV2KTsKKwkJCW13aWZpZXhfc3RvcF9uZXRfZGV2X3F1ZXVlKHByaXYtPm5ldGRldiwgYWRhcHRlcik7CiAKIAkJLyogQ2xlYXIgYW55IHBhc3QgYXNzb2NpYXRpb24gcmVzcG9uc2Ugc3RvcmVkIGZvcgogCQkgKiBhcHBsaWNhdGlvbiByZXRyaWV2YWwgKi8KQEAgLTI2NSw3ICsyNzAsNyBAQAogCQlyZXQgPSBtd2lmaWV4X2NoZWNrX25ldHdvcmtfY29tcGF0aWJpbGl0eShwcml2LCBic3NfZGVzYyk7CiAKIAkJaWYgKCFuZXRpZl9xdWV1ZV9zdG9wcGVkKHByaXYtPm5ldGRldikpCi0JCQluZXRpZl9zdG9wX3F1ZXVlKHByaXYtPm5ldGRldik7CisJCQltd2lmaWV4X3N0b3BfbmV0X2Rldl9xdWV1ZShwcml2LT5uZXRkZXYsIGFkYXB0ZXIpOwogCiAJCWlmICghcmV0KSB7CiAJCQlkZXZfZGJnKGFkYXB0ZXItPmRldiwgImluZm86IG5ldHdvcmsgZm91bmQgaW4gc2NhbiIKQEAgLTQ3Miw2NyArNDc3LDYgQEAKIH0KIAogLyoKLSAqIFRoZSBmdW5jdGlvbiBzZXRzIGJhbmQgY29uZmlndXJhdGlvbnMuCi0gKgotICogaXQgcGVyZm9ybXMgZXh0cmEgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgQWQtSG9jCi0gKiBiYW5kIGFuZCBjaGFubmVsIGFyZSBjb21wYXRpYmxlLiBPdGhlcndpc2UgaXQgcmV0dXJucyBhbiBlcnJvci4KLSAqCi0gKi8KLWludCBtd2lmaWV4X3NldF9yYWRpb19iYW5kX2NmZyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2LAotCQkJICAgICAgIHN0cnVjdCBtd2lmaWV4X2RzX2JhbmRfY2ZnICpyYWRpb19jZmcpCi17Ci0Jc3RydWN0IG13aWZpZXhfYWRhcHRlciAqYWRhcHRlciA9IHByaXYtPmFkYXB0ZXI7Ci0JdTggaW5mcmFfYmFuZCwgYWRob2NfYmFuZDsKLQl1MzIgYWRob2NfY2hhbm5lbDsKLQotCWluZnJhX2JhbmQgPSAodTgpIHJhZGlvX2NmZy0+Y29uZmlnX2JhbmRzOwotCWFkaG9jX2JhbmQgPSAodTgpIHJhZGlvX2NmZy0+YWRob2Nfc3RhcnRfYmFuZDsKLQlhZGhvY19jaGFubmVsID0gcmFkaW9fY2ZnLT5hZGhvY19jaGFubmVsOwotCi0JLyogU0VUIEluZnJhIGJhbmQgKi8KLQlpZiAoKGluZnJhX2JhbmQgfCBhZGFwdGVyLT5md19iYW5kcykgJiB+YWRhcHRlci0+ZndfYmFuZHMpCi0JCXJldHVybiAtMTsKLQotCWFkYXB0ZXItPmNvbmZpZ19iYW5kcyA9IGluZnJhX2JhbmQ7Ci0KLQkvKiBTRVQgQWQtaG9jIEJhbmQgKi8KLQlpZiAoKGFkaG9jX2JhbmQgfCBhZGFwdGVyLT5md19iYW5kcykgJiB+YWRhcHRlci0+ZndfYmFuZHMpCi0JCXJldHVybiAtMTsKLQotCWlmIChhZGhvY19iYW5kKQotCQlhZGFwdGVyLT5hZGhvY19zdGFydF9iYW5kID0gYWRob2NfYmFuZDsKLQlhZGFwdGVyLT5jaGFuX29mZnNldCA9ICh1OCkgcmFkaW9fY2ZnLT5zZWNfY2hhbl9vZmZzZXQ7Ci0JLyoKLQkgKiBJZiBubyBhZGhvY19jaGFubmVsIGlzIHN1cHBsaWVkIHZlcmlmeSBpZiB0aGUgZXhpc3RpbmcgYWRob2MKLQkgKiBjaGFubmVsIGNvbXBpbGVzIHdpdGggbmV3IGFkaG9jX2JhbmQKLQkgKi8KLQlpZiAoIWFkaG9jX2NoYW5uZWwpIHsKLQkJaWYgKCFtd2lmaWV4X2dldF9jZnBfYnlfYmFuZF9hbmRfY2hhbm5lbF9mcm9tX2NmZzgwMjExCi0JCSAgICAgKHByaXYsIGFkYXB0ZXItPmFkaG9jX3N0YXJ0X2JhbmQsCi0JCSAgICAgcHJpdi0+YWRob2NfY2hhbm5lbCkpIHsKLQkJCS8qIFBhc3MgYmFjayB0aGUgZGVmYXVsdCBjaGFubmVsICovCi0JCQlyYWRpb19jZmctPmFkaG9jX2NoYW5uZWwgPSBERUZBVUxUX0FEX0hPQ19DSEFOTkVMOwotCQkJaWYgKChhZGFwdGVyLT5hZGhvY19zdGFydF9iYW5kICYgQkFORF9BKQotCQkJICAgIHx8IChhZGFwdGVyLT5hZGhvY19zdGFydF9iYW5kICYgQkFORF9BTikpCi0JCQkJcmFkaW9fY2ZnLT5hZGhvY19jaGFubmVsID0KLQkJCQkJREVGQVVMVF9BRF9IT0NfQ0hBTk5FTF9BOwotCQl9Ci0JfSBlbHNlIHsJLyogUmV0cnVybiBlcnJvciBpZiBhZGhvY19iYW5kIGFuZAotCQkJICAgYWRob2NfY2hhbm5lbCBjb21iaW5hdGlvbiBpcyBpbnZhbGlkICovCi0JCWlmICghbXdpZmlleF9nZXRfY2ZwX2J5X2JhbmRfYW5kX2NoYW5uZWxfZnJvbV9jZmc4MDIxMQotCQkgICAgKHByaXYsIGFkYXB0ZXItPmFkaG9jX3N0YXJ0X2JhbmQsICh1MTYpIGFkaG9jX2NoYW5uZWwpKQotCQkJcmV0dXJuIC0xOwotCQlwcml2LT5hZGhvY19jaGFubmVsID0gKHU4KSBhZGhvY19jaGFubmVsOwotCX0KLQlpZiAoKGFkaG9jX2JhbmQgJiBCQU5EX0dOKSB8fCAoYWRob2NfYmFuZCAmIEJBTkRfQU4pKQotCQlhZGFwdGVyLT5hZGhvY18xMW5fZW5hYmxlZCA9IHRydWU7Ci0JZWxzZQotCQlhZGFwdGVyLT5hZGhvY18xMW5fZW5hYmxlZCA9IGZhbHNlOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCiAgKiBUaGUgZnVuY3Rpb24gZGlzYWJsZXMgYXV0byBkZWVwIHNsZWVwIG1vZGUuCiAgKi8KIGludCBtd2lmaWV4X2Rpc2FibGVfYXV0b19kcyhzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2KQpAQCAtODMyLDggKzc3Niw4IEBACiAKIAlpZiAoIXJldCkgewogCQlpZiAocmF0ZS0+aXNfcmF0ZV9hdXRvKQotCQkJcmF0ZS0+cmF0ZSA9IG13aWZpZXhfaW5kZXhfdG9fZGF0YV9yYXRlKHByaXYtPnR4X3JhdGUsCi0JCQkJCQkJcHJpdi0+dHhfaHRpbmZvKTsKKwkJCXJhdGUtPnJhdGUgPSBtd2lmaWV4X2luZGV4X3RvX2RhdGFfcmF0ZShwcml2LAorCQkJCQlwcml2LT50eF9yYXRlLCBwcml2LT50eF9odGluZm8pOwogCQllbHNlCiAJCQlyYXRlLT5yYXRlID0gcHJpdi0+ZGF0YV9yYXRlOwogCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9yeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC9zdGFfcnguYwppbmRleCAyNzQzMDUxLi41ZTFlZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9td2lmaWV4L3N0YV9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvc3RhX3J4LmMKQEAgLTEyNiw2ICsxMjYsOSBAQAogCXUxNiByeF9wa3RfdHlwZTsKIAlzdHJ1Y3QgbXdpZmlleF9wcml2YXRlICpwcml2ID0gYWRhcHRlci0+cHJpdltyeF9pbmZvLT5ic3NfaW5kZXhdOwogCisJaWYgKCFwcml2KQorCQlyZXR1cm4gLTE7CisKIAlsb2NhbF9yeF9wZCA9IChzdHJ1Y3QgcnhwZCAqKSAoc2tiLT5kYXRhKTsKIAlyeF9wa3RfdHlwZSA9IGxvY2FsX3J4X3BkLT5yeF9wa3RfdHlwZTsKIApAQCAtMTg5LDEyICsxOTIsMTEgQEAKIAkJCQkJICAgICAodTgpIGxvY2FsX3J4X3BkLT5yeF9wa3RfdHlwZSwKIAkJCQkJICAgICBza2IpOwogCi0JaWYgKHJldCB8fCAocnhfcGt0X3R5cGUgPT0gUEtUX1RZUEVfQkFSKSkgewotCQlpZiAocHJpdiAmJiAocmV0ID09IC0xKSkKLQkJCXByaXYtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKLQorCWlmIChyZXQgfHwgKHJ4X3BrdF90eXBlID09IFBLVF9UWVBFX0JBUikpCiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7Ci0JfQorCisJaWYgKHJldCkKKwkJcHJpdi0+c3RhdHMucnhfZHJvcHBlZCsrOwogCiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvdHhyeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC90eHJ4LmMKaW5kZXggYTIwNmY0MS4uZDkyNzRhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC90eHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdpZmlleC90eHJ4LmMKQEAgLTEzNCw3ICsxMzQsNyBAQAogCWlmICghcHJpdikKIAkJZ290byBkb25lOwogCi0JcHJpdi0+bmV0ZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisJbXdpZmlleF9zZXRfdHJhbnNfc3RhcnQocHJpdi0+bmV0ZGV2KTsKIAlpZiAoIXN0YXR1cykgewogCQlwcml2LT5zdGF0cy50eF9wYWNrZXRzKys7CiAJCXByaXYtPnN0YXRzLnR4X2J5dGVzICs9IHNrYi0+bGVuOwpAQCAtMTUyLDcgKzE1Miw4IEBACiAJCWlmICgoR0VUX0JTU19ST0xFKHRwcml2KSA9PSBNV0lGSUVYX0JTU19ST0xFX1NUQSkKIAkJCQkmJiAodHByaXYtPm1lZGlhX2Nvbm5lY3RlZCkpIHsKIAkJCWlmIChuZXRpZl9xdWV1ZV9zdG9wcGVkKHRwcml2LT5uZXRkZXYpKQotCQkJCW5ldGlmX3dha2VfcXVldWUodHByaXYtPm5ldGRldik7CisJCQkJbXdpZmlleF93YWtlX3VwX25ldF9kZXZfcXVldWUodHByaXYtPm5ldGRldiwKKwkJCQkJCQkJYWRhcHRlcik7CiAJCX0KIAl9CiBkb25lOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL213bDhrLmMKaW5kZXggOTk1Njk1Yy4uN2JlY2VhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9td2w4ay5jCkBAIC0yOCwxMCArMjgsMTAgQEAKIAogI2RlZmluZSBNV0w4S19ERVNDCSJNYXJ2ZWxsIFRPUERPRyhSKSA4MDIuMTEgV2lyZWxlc3MgTmV0d29yayBEcml2ZXIiCiAjZGVmaW5lIE1XTDhLX05BTUUJS0JVSUxEX01PRE5BTUUKLSNkZWZpbmUgTVdMOEtfVkVSU0lPTgkiMC4xMiIKKyNkZWZpbmUgTVdMOEtfVkVSU0lPTgkiMC4xMyIKIAogLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyB1bnNpZ25lZCBhcF9tb2RlX2RlZmF1bHQ7CitzdGF0aWMgYm9vbCBhcF9tb2RlX2RlZmF1bHQ7CiBtb2R1bGVfcGFyYW0oYXBfbW9kZV9kZWZhdWx0LCBib29sLCAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoYXBfbW9kZV9kZWZhdWx0LAogCQkgIlNldCB0byAxIHRvIG1ha2UgYXAgbW9kZSB0aGUgZGVmYXVsdCBpbnN0ZWFkIG9mIHN0YSBtb2RlIik7CkBAIC0xOTgsNiArMTk4LDcgQEAKIAkvKiBmaXJtd2FyZSBhY2Nlc3MgKi8KIAlzdHJ1Y3QgbXV0ZXggZndfbXV0ZXg7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpmd19tdXRleF9vd25lcjsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmh3X3Jlc3RhcnRfb3duZXI7CiAJaW50IGZ3X211dGV4X2RlcHRoOwogCXN0cnVjdCBjb21wbGV0aW9uICpob3N0Y21kX3dhaXQ7CiAKQEAgLTI2Miw2ICsyNjMsMTAgQEAKIAkgKi8KIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyB3bW1fcGFyYW1zW01XTDhLX1RYX1dNTV9RVUVVRVNdOwogCisJLyogVG8gcGVyZm9ybSB0aGUgdGFzayBvZiByZWxvYWRpbmcgdGhlIGZpcm13YXJlICovCisJc3RydWN0IHdvcmtfc3RydWN0IGZ3X3JlbG9hZDsKKwlib29sIGh3X3Jlc3RhcnRfaW5fcHJvZ3Jlc3M7CisKIAkvKiBhc3luYyBmaXJtd2FyZSBsb2FkaW5nIHN0YXRlICovCiAJdW5zaWduZWQgZndfc3RhdGU7CiAJY2hhciAqZndfcHJlZjsKQEAgLTczOCwxMCArNzQzLDEwIEBACiAKIAkJcmVhZHlfY29kZSA9IGlvcmVhZDMyKHByaXYtPnJlZ3MgKyBNV0w4S19ISVVfSU5UX0NPREUpOwogCQlpZiAocmVhZHlfY29kZSA9PSBNV0w4S19GV0FQX1JFQURZKSB7Ci0JCQlwcml2LT5hcF9mdyA9IDE7CisJCQlwcml2LT5hcF9mdyA9IHRydWU7CiAJCQlicmVhazsKIAkJfSBlbHNlIGlmIChyZWFkeV9jb2RlID09IE1XTDhLX0ZXU1RBX1JFQURZKSB7Ci0JCQlwcml2LT5hcF9mdyA9IDA7CisJCQlwcml2LT5hcF9mdyA9IGZhbHNlOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtMTQ5OCw2ICsxNTAzLDE4IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJLyogU2luY2UgZncgcmVzdGFydCBpcyBpbiBwcm9ncmVzcywgYWxsb3cgb25seSB0aGUgZmlybXdhcmUKKwkgKiBjb21tYW5kcyBmcm9tIHRoZSByZXN0YXJ0IGNvZGUgYW5kIGJsb2NrIHRoZSBvdGhlcgorCSAqIGNvbW1hbmRzIHNpbmNlIHRoZXkgYXJlIGdvaW5nIHRvIGZhaWwgaW4gYW55IGNhc2Ugc2luY2UKKwkgKiB0aGUgZmlybXdhcmUgaGFzIGNyYXNoZWQKKwkgKi8KKwlpZiAocHJpdi0+aHdfcmVzdGFydF9pbl9wcm9ncmVzcykgeworCQlpZiAocHJpdi0+aHdfcmVzdGFydF9vd25lciA9PSBjdXJyZW50KQorCQkJcmV0dXJuIDA7CisJCWVsc2UKKwkJCXJldHVybiAtRUJVU1k7CisJfQorCiAJLyoKIAkgKiBUaGUgVFggcXVldWVzIGFyZSBzdG9wcGVkIGF0IHRoaXMgcG9pbnQsIHNvIHRoaXMgdGVzdAogCSAqIGRvZXNuJ3QgbmVlZCB0byB0YWtlIC0+dHhfbG9jay4KQEAgLTE1NDEsNiArMTU1OCw4IEBACiAJCXdpcGh5X2Vycihody0+d2lwaHksICJ0eCByaW5ncyBzdHVjayBmb3IgJWQgbXNcbiIsCiAJCQkgIE1XTDhLX1RYX1dBSVRfVElNRU9VVF9NUyk7CiAJCW13bDhrX2R1bXBfdHhfcmluZ3MoaHcpOworCQlwcml2LT5od19yZXN0YXJ0X2luX3Byb2dyZXNzID0gdHJ1ZTsKKwkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoaHcsICZwcml2LT5md19yZWxvYWQpOwogCiAJCXJjID0gLUVUSU1FRE9VVDsKIAl9CkBAIC0yMDU4LDcgKzIwNzcsOSBAQAogCiAJCXJjID0gbXdsOGtfdHhfd2FpdF9lbXB0eShodyk7CiAJCWlmIChyYykgewotCQkJaWVlZTgwMjExX3dha2VfcXVldWVzKGh3KTsKKwkJCWlmICghcHJpdi0+aHdfcmVzdGFydF9pbl9wcm9ncmVzcykKKwkJCQlpZWVlODAyMTFfd2FrZV9xdWV1ZXMoaHcpOworCiAJCQltdXRleF91bmxvY2soJnByaXYtPmZ3X211dGV4KTsKIAogCQkJcmV0dXJuIHJjOwpAQCAtMjA3Nyw3ICsyMDk4LDkgQEAKIAlzdHJ1Y3QgbXdsOGtfcHJpdiAqcHJpdiA9IGh3LT5wcml2OwogCiAJaWYgKCEtLXByaXYtPmZ3X211dGV4X2RlcHRoKSB7Ci0JCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7CisJCWlmICghcHJpdi0+aHdfcmVzdGFydF9pbl9wcm9ncmVzcykKKwkJCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7CisKIAkJcHJpdi0+ZndfbXV0ZXhfb3duZXIgPSBOVUxMOwogCQltdXRleF91bmxvY2soJnByaXYtPmZ3X211dGV4KTsKIAl9CkBAIC00Mzk4LDcgKzQ0MjEsOCBAQAogCXN0cnVjdCBtd2w4a19wcml2ICpwcml2ID0gaHctPnByaXY7CiAJaW50IGk7CiAKLQltd2w4a19jbWRfcmFkaW9fZGlzYWJsZShodyk7CisJaWYgKCFwcml2LT5od19yZXN0YXJ0X2luX3Byb2dyZXNzKQorCQltd2w4a19jbWRfcmFkaW9fZGlzYWJsZShodyk7CiAKIAlpZWVlODAyMTFfc3RvcF9xdWV1ZXMoaHcpOwogCkBAIC00NDk5LDYgKzQ1MjMsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgbXdsOGtfcmVtb3ZlX3ZpZihzdHJ1Y3QgbXdsOGtfcHJpdiAqcHJpdiwgc3RydWN0IG13bDhrX3ZpZiAqdmlmKQoreworCS8qIEhhcyBpZWVlODAyMTFfcmVzdGFydF9odyByZS1hZGRlZCB0aGUgcmVtb3ZlZCBpbnRlcmZhY2VzPyAqLworCWlmICghcHJpdi0+bWFjaWRzX3VzZWQpCisJCXJldHVybjsKKworCXByaXYtPm1hY2lkc191c2VkICY9IH4oMSA8PCB2aWYtPm1hY2lkKTsKKwlsaXN0X2RlbCgmdmlmLT5saXN0KTsKK30KKwogc3RhdGljIHZvaWQgbXdsOGtfcmVtb3ZlX2ludGVyZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewpAQCAtNDUxMCw4ICs0NTQ0LDU0IEBACiAKIAltd2w4a19jbWRfc2V0X21hY19hZGRyKGh3LCB2aWYsICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiKTsKIAotCXByaXYtPm1hY2lkc191c2VkICY9IH4oMSA8PCBtd2w4a192aWYtPm1hY2lkKTsKLQlsaXN0X2RlbCgmbXdsOGtfdmlmLT5saXN0KTsKKwltd2w4a19yZW1vdmVfdmlmKHByaXYsIG13bDhrX3ZpZik7Cit9CisKK3N0YXRpYyB2b2lkIG13bDhrX2h3X3Jlc3RhcnRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG13bDhrX3ByaXYgKnByaXYgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IG13bDhrX3ByaXYsIGZ3X3JlbG9hZCk7CisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBwcml2LT5odzsKKwlzdHJ1Y3QgbXdsOGtfZGV2aWNlX2luZm8gKmRpOworCWludCByYzsKKworCS8qIElmIHNvbWUgY29tbWFuZCBpcyB3YWl0aW5nIGZvciBhIHJlc3BvbnNlLCBjbGVhciBpdCAqLworCWlmIChwcml2LT5ob3N0Y21kX3dhaXQgIT0gTlVMTCkgeworCQljb21wbGV0ZShwcml2LT5ob3N0Y21kX3dhaXQpOworCQlwcml2LT5ob3N0Y21kX3dhaXQgPSBOVUxMOworCX0KKworCXByaXYtPmh3X3Jlc3RhcnRfb3duZXIgPSBjdXJyZW50OworCWRpID0gcHJpdi0+ZGV2aWNlX2luZm87CisJbXdsOGtfZndfbG9jayhodyk7CisKKwlpZiAocHJpdi0+YXBfZncpCisJCXJjID0gbXdsOGtfcmVsb2FkX2Zpcm13YXJlKGh3LCBkaS0+ZndfaW1hZ2VfYXApOworCWVsc2UKKwkJcmMgPSBtd2w4a19yZWxvYWRfZmlybXdhcmUoaHcsIGRpLT5md19pbWFnZV9zdGEpOworCisJaWYgKHJjKQorCQlnb3RvIGZhaWw7CisKKwlwcml2LT5od19yZXN0YXJ0X293bmVyID0gTlVMTDsKKwlwcml2LT5od19yZXN0YXJ0X2luX3Byb2dyZXNzID0gZmFsc2U7CisKKwkvKgorCSAqIFRoaXMgdW5sb2NrIHdpbGwgd2FrZSB1cCB0aGUgcXVldWVzIGFuZAorCSAqIGFsc28gb3BlbnMgdGhlIGNvbW1hbmQgcGF0aCBmb3Igb3RoZXIKKwkgKiBjb21tYW5kcworCSAqLworCW13bDhrX2Z3X3VubG9jayhodyk7CisKKwlpZWVlODAyMTFfcmVzdGFydF9odyhodyk7CisKKwl3aXBoeV9lcnIoaHctPndpcGh5LCAiRmlybXdhcmUgcmVzdGFydGVkIHN1Y2Nlc3NmdWxseVxuIik7CisKKwlyZXR1cm47CitmYWlsOgorCW13bDhrX2Z3X3VubG9jayhodyk7CisKKwl3aXBoeV9lcnIoaHctPndpcGh5LCAiRmlybXdhcmUgcmVzdGFydCBmYWlsZWRcbiIpOwogfQogCiBzdGF0aWMgaW50IG13bDhrX2NvbmZpZyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTMyIGNoYW5nZWQpCkBAIC01MDI0LDcgKzUxMDQsMTEgQEAKIAkJZm9yIChpID0gMDsgaSA8IE1BWF9BTVBEVV9BVFRFTVBUUzsgaSsrKSB7CiAJCQlyYyA9IG13bDhrX2NoZWNrX2JhKGh3LCBzdHJlYW0pOwogCi0JCQlpZiAoIXJjKQorCQkJLyogSWYgSFcgcmVzdGFydCBpcyBpbiBwcm9ncmVzcyBtd2w4a19wb3N0X2NtZCB3aWxsCisJCQkgKiByZXR1cm4gLUVCVVNZLiBBdm9pZCByZXRyeWluZyBtd2w4a19jaGVja19iYSBpbgorCQkJICogc3VjaCBjYXNlcworCQkJICovCisJCQlpZiAoIXJjIHx8IHJjID09IC1FQlVTWSkKIAkJCQlicmVhazsKIAkJCS8qCiAJCQkgKiBIVyBxdWV1ZXMgdGFrZSB0aW1lIHRvIGJlIGZsdXNoZWQsIGdpdmUgdGhlbQpAQCAtNTA0NCwxNCArNTEyOCwxNCBAQAogCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIGFkZHIsIHRpZCk7CiAJCWJyZWFrOwogCWNhc2UgSUVFRTgwMjExX0FNUERVX1RYX1NUT1A6Ci0JCWlmIChzdHJlYW0gPT0gTlVMTCkKLQkJCWJyZWFrOwotCQlpZiAoc3RyZWFtLT5zdGF0ZSA9PSBBTVBEVV9TVFJFQU1fQUNUSVZFKSB7Ci0JCQlzcGluX3VubG9jaygmcHJpdi0+c3RyZWFtX2xvY2spOwotCQkJbXdsOGtfZGVzdHJveV9iYShodywgc3RyZWFtKTsKLQkJCXNwaW5fbG9jaygmcHJpdi0+c3RyZWFtX2xvY2spOworCQlpZiAoc3RyZWFtKSB7CisJCQlpZiAoc3RyZWFtLT5zdGF0ZSA9PSBBTVBEVV9TVFJFQU1fQUNUSVZFKSB7CisJCQkJc3Bpbl91bmxvY2soJnByaXYtPnN0cmVhbV9sb2NrKTsKKwkJCQltd2w4a19kZXN0cm95X2JhKGh3LCBzdHJlYW0pOworCQkJCXNwaW5fbG9jaygmcHJpdi0+c3RyZWFtX2xvY2spOworCQkJfQorCQkJbXdsOGtfcmVtb3ZlX3N0cmVhbShodywgc3RyZWFtKTsKIAkJfQotCQltd2w4a19yZW1vdmVfc3RyZWFtKGh3LCBzdHJlYW0pOwogCQlpZWVlODAyMTFfc3RvcF90eF9iYV9jYl9pcnFzYWZlKHZpZiwgYWRkciwgdGlkKTsKIAkJYnJlYWs7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfT1BFUkFUSU9OQUw6CkBAIC01MjYzLDEyICs1MzQ3LDE1IEBACiAJbXdsOGtfcmVsZWFzZV9maXJtd2FyZShwcml2KTsKIH0KIAorI2RlZmluZSBNQVhfUkVTVEFSVF9BVFRFTVBUUyAxCiBzdGF0aWMgaW50IG13bDhrX2luaXRfZmlybXdhcmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNoYXIgKmZ3X2ltYWdlLAogCQkJICAgICAgIGJvb2wgbm93YWl0KQogewogCXN0cnVjdCBtd2w4a19wcml2ICpwcml2ID0gaHctPnByaXY7CiAJaW50IHJjOworCWludCBjb3VudCA9IE1BWF9SRVNUQVJUX0FUVEVNUFRTOwogCityZXRyeToKIAkvKiBSZXNldCBmaXJtd2FyZSBhbmQgaGFyZHdhcmUgKi8KIAltd2w4a19od19yZXNldChwcml2KTsKIApAQCAtNTI5MCw2ICs1Mzc3LDE2IEBACiAJLyogUmVjbGFpbSBtZW1vcnkgb25jZSBmaXJtd2FyZSBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkICovCiAJbXdsOGtfcmVsZWFzZV9maXJtd2FyZShwcml2KTsKIAorCWlmIChyYyAmJiBjb3VudCkgeworCQkvKiBGVyBkaWQgbm90IHN0YXJ0IHN1Y2Nlc3NmdWxseTsKKwkJICogbGV0cyB0cnkgb25lIG1vcmUgdGltZQorCQkgKi8KKwkJY291bnQtLTsKKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgIlRyeWluZyB0byByZWxvYWQgdGhlIGZpcm13YXJlIGFnYWluXG4iKTsKKwkJbXNsZWVwKDIwKTsKKwkJZ290byByZXRyeTsKKwl9CisKIAlyZXR1cm4gcmM7CiB9CiAKQEAgLTUzNjUsNyArNTQ2MiwxNCBAQAogCQlnb3RvIGVycl9mcmVlX3F1ZXVlczsKIAl9CiAKLQltZW1zZXQocHJpdi0+YW1wZHUsIDAsIHNpemVvZihwcml2LT5hbXBkdSkpOworCS8qCisJICogV2hlbiBodyByZXN0YXJ0IGlzIHJlcXVlc3RlZCwKKwkgKiBtYWM4MDIxMSB3aWxsIHRha2UgY2FyZSBvZiBjbGVhcmluZworCSAqIHRoZSBhbXBkdSBzdHJlYW1zLCBzbyBkbyBub3QgY2xlYXIKKwkgKiB0aGUgYW1wZHUgc3RhdGUgaGVyZQorCSAqLworCWlmICghcHJpdi0+aHdfcmVzdGFydF9pbl9wcm9ncmVzcykKKwkJbWVtc2V0KHByaXYtPmFtcGR1LCAwLCBzaXplb2YocHJpdi0+YW1wZHUpKTsKIAogCS8qCiAJICogVGVtcG9yYXJpbHkgZW5hYmxlIGludGVycnVwdHMuICBJbml0aWFsIGZpcm13YXJlIGhvc3QKQEAgLTU0MzksMTAgKzU1NDMsMjAgQEAKIHsKIAlpbnQgaSwgcmMgPSAwOwogCXN0cnVjdCBtd2w4a19wcml2ICpwcml2ID0gaHctPnByaXY7CisJc3RydWN0IG13bDhrX3ZpZiAqdmlmLCAqdG1wX3ZpZjsKIAogCW13bDhrX3N0b3AoaHcpOwogCW13bDhrX3J4cV9kZWluaXQoaHcsIDApOwogCisJLyoKKwkgKiBBbGwgdGhlIGV4aXN0aW5nIGludGVyZmFjZXMgYXJlIHJlLWFkZGVkIGJ5IHRoZSBpZWVlODAyMTFfcmVjb25maWc7CisJICogd2hpY2ggbWVhbnMgZHJpdmVyIHNob3VsZCByZW1vdmUgZXhpc3RpbmcgaW50ZXJmYWNlcyBiZWZvcmUgY2FsbGluZworCSAqIGllZWU4MDIxMV9yZXN0YXJ0X2h3CisJICovCisJaWYgKHByaXYtPmh3X3Jlc3RhcnRfaW5fcHJvZ3Jlc3MpCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2aWYsIHRtcF92aWYsICZwcml2LT52aWZfbGlzdCwgbGlzdCkKKwkJCW13bDhrX3JlbW92ZV92aWYocHJpdiwgdmlmKTsKKwogCWZvciAoaSA9IDA7IGkgPCBtd2w4a190eF9xdWV1ZXMocHJpdik7IGkrKykKIAkJbXdsOGtfdHhxX2RlaW5pdChodywgaSk7CiAKQEAgLTU0NTQsNiArNTU2OCw5IEBACiAJaWYgKHJjKQogCQlnb3RvIGZhaWw7CiAKKwlpZiAocHJpdi0+aHdfcmVzdGFydF9pbl9wcm9ncmVzcykKKwkJcmV0dXJuIHJjOworCiAJcmMgPSBtd2w4a19zdGFydChodyk7CiAJaWYgKHJjKQogCQlnb3RvIGZhaWw7CkBAIC01NTE3LDEzICs1NjM0LDE1IEBACiAJSU5JVF9MSVNUX0hFQUQoJnByaXYtPnZpZl9saXN0KTsKIAogCS8qIFNldCBkZWZhdWx0IHJhZGlvIHN0YXRlIGFuZCBwcmVhbWJsZSAqLwotCXByaXYtPnJhZGlvX29uID0gMDsKLQlwcml2LT5yYWRpb19zaG9ydF9wcmVhbWJsZSA9IDA7CisJcHJpdi0+cmFkaW9fb24gPSBmYWxzZTsKKwlwcml2LT5yYWRpb19zaG9ydF9wcmVhbWJsZSA9IGZhbHNlOwogCiAJLyogRmluYWxpemUgam9pbiB3b3JrZXIgKi8KIAlJTklUX1dPUksoJnByaXYtPmZpbmFsaXplX2pvaW5fd29ya2VyLCBtd2w4a19maW5hbGl6ZV9qb2luX3dvcmtlcik7CiAJLyogSGFuZGxlIHdhdGNoZG9nIGJhIGV2ZW50cyAqLwogCUlOSVRfV09SSygmcHJpdi0+d2F0Y2hkb2dfYmFfaGFuZGxlLCBtd2w4a193YXRjaGRvZ19iYV9ldmVudHMpOworCS8qIFRvIHJlbG9hZCB0aGUgZmlybXdhcmUgaWYgaXQgY3Jhc2hlcyAqLworCUlOSVRfV09SSygmcHJpdi0+ZndfcmVsb2FkLCBtd2w4a19od19yZXN0YXJ0X3dvcmspOwogCiAJLyogVFggcmVjbGFpbSBhbmQgUlggdGFza2xldHMuICAqLwogCXRhc2tsZXRfaW5pdCgmcHJpdi0+cG9sbF90eF90YXNrLCBtd2w4a190eF9wb2xsLCAodW5zaWduZWQgbG9uZylodyk7CkBAIC01NjY3LDYgKzU3ODYsOSBAQAogCXJjID0gbXdsOGtfaW5pdF9maXJtd2FyZShodywgcHJpdi0+ZndfcHJlZiwgdHJ1ZSk7CiAJaWYgKHJjKQogCQlnb3RvIGVycl9zdG9wX2Zpcm13YXJlOworCisJcHJpdi0+aHdfcmVzdGFydF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCiAJcmV0dXJuIHJjOwogCiBlcnJfc3RvcF9maXJtd2FyZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vbWFpbi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9tYWluLmMKaW5kZXggYjUyYWNjNC4uOWZiNzdkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvb3Jpbm9jby9tYWluLmMKQEAgLTEyMSw3ICsxMjEsNyBAQAogTU9EVUxFX1BBUk1fREVTQyhvcmlub2NvX2RlYnVnLCAiRGVidWcgbGV2ZWwiKTsKICNlbmRpZgogCi1zdGF0aWMgaW50IHN1cHByZXNzX2xpbmtzdGF0dXM7IC8qID0gMCAqLworc3RhdGljIGJvb2wgc3VwcHJlc3NfbGlua3N0YXR1czsgLyogPSAwICovCiBtb2R1bGVfcGFyYW0oc3VwcHJlc3NfbGlua3N0YXR1cywgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHN1cHByZXNzX2xpbmtzdGF0dXMsICJEb24ndCBsb2cgbGluayBzdGF0dXMgY2hhbmdlcyIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9vcmlub2NvL3NjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vc2Nhbi5jCmluZGV4IGU5OWNhMWMuLjk2ZTM5ZWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vc2Nhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL29yaW5vY28vc2Nhbi5jCkBAIC03Niw2ICs3Niw3IEBACiB7CiAJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHByaXZfdG9fd2lwaHkocHJpdik7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmNic3M7CiAJdTggKmllOwogCXU4IGllX2J1Zls0Nl07CiAJdTY0IHRpbWVzdGFtcDsKQEAgLTEyMSw5ICsxMjIsMTAgQEAKIAliZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShic3MtPmEuYmVhY29uX2ludGVydik7CiAJc2lnbmFsID0gU0lHTkFMX1RPX01CTShsZTE2X3RvX2NwdShic3MtPmEubGV2ZWwpKTsKIAotCWNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIGNoYW5uZWwsIGJzcy0+YS5ic3NpZCwgdGltZXN0YW1wLAotCQkJICAgIGNhcGFiaWxpdHksIGJlYWNvbl9pbnRlcnZhbCwgaWVfYnVmLCBpZV9sZW4sCi0JCQkgICAgc2lnbmFsLCBHRlBfS0VSTkVMKTsKKwljYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwgY2hhbm5lbCwgYnNzLT5hLmJzc2lkLCB0aW1lc3RhbXAsCisJCQkJICAgY2FwYWJpbGl0eSwgYmVhY29uX2ludGVydmFsLCBpZV9idWYsIGllX2xlbiwKKwkJCQkgICBzaWduYWwsIEdGUF9LRVJORUwpOworCWNmZzgwMjExX3B1dF9ic3MoY2Jzcyk7CiB9CiAKIHZvaWQgb3Jpbm9jb19hZGRfZXh0c2Nhbl9yZXN1bHQoc3RydWN0IG9yaW5vY29fcHJpdmF0ZSAqcHJpdiwKQEAgLTEzMiw2ICsxMzQsNyBAQAogewogCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSBwcml2X3RvX3dpcGh5KHByaXYpOwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbDsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpjYnNzOwogCWNvbnN0IHU4ICppZTsKIAl1NjQgdGltZXN0YW1wOwogCXMzMiBzaWduYWw7CkBAIC0xNTIsOSArMTU1LDEwIEBACiAJaWUgPSBic3MtPmRhdGE7CiAJc2lnbmFsID0gU0lHTkFMX1RPX01CTShic3MtPmxldmVsKTsKIAotCWNmZzgwMjExX2luZm9ybV9ic3Mod2lwaHksIGNoYW5uZWwsIGJzcy0+YnNzaWQsIHRpbWVzdGFtcCwKLQkJCSAgICBjYXBhYmlsaXR5LCBiZWFjb25faW50ZXJ2YWwsIGllLCBpZV9sZW4sCi0JCQkgICAgc2lnbmFsLCBHRlBfS0VSTkVMKTsKKwljYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyh3aXBoeSwgY2hhbm5lbCwgYnNzLT5ic3NpZCwgdGltZXN0YW1wLAorCQkJCSAgIGNhcGFiaWxpdHksIGJlYWNvbl9pbnRlcnZhbCwgaWUsIGllX2xlbiwKKwkJCQkgICBzaWduYWwsIEdGUF9LRVJORUwpOworCWNmZzgwMjExX3B1dF9ic3MoY2Jzcyk7CiB9CiAKIHZvaWQgb3Jpbm9jb19hZGRfaG9zdHNjYW5fcmVzdWx0cyhzdHJ1Y3Qgb3Jpbm9jb19wcml2YXRlICpwcml2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L21haW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9tYWluLmMKaW5kZXggZGI0ZDlhMC4uYWYyY2ExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L21haW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvbWFpbi5jCkBAIC0yNyw3ICsyNyw3IEBACiAjaW5jbHVkZSAicDU0LmgiCiAjaW5jbHVkZSAibG1hYy5oIgogCi1zdGF0aWMgaW50IG1vZHBhcmFtX25vaHdjcnlwdDsKK3N0YXRpYyBib29sIG1vZHBhcmFtX25vaHdjcnlwdDsKIG1vZHVsZV9wYXJhbV9uYW1lZChub2h3Y3J5cHQsIG1vZHBhcmFtX25vaHdjcnlwdCwgYm9vbCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vaHdjcnlwdCwgIkRpc2FibGUgaGFyZHdhcmUgZW5jcnlwdGlvbi4iKTsKIE1PRFVMRV9BVVRIT1IoIk1pY2hhZWwgV3UgPGZsYW1pbmdpY2VAc291cm1pbGsubmV0PiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHNwaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3A1NHNwaS5jCmluZGV4IGYxOGRmODIuLjdmYWVkNjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC9wNTRzcGkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvcDU0c3BpLmMKQEAgLTU4MSwxNSArNTgxLDkgQEAKIAlzdHJ1Y3QgcDU0c19wcml2ICpwcml2ID0gZGV2LT5wcml2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAobXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZwcml2LT5tdXRleCkpIHsKLQkJLyogRklYTUU6IGhvdyB0byBoYW5kbGUgdGhpcyBlcnJvcj8gKi8KLQkJcmV0dXJuOwotCX0KLQorCW11dGV4X2xvY2soJnByaXYtPm11dGV4KTsKIAlXQVJOX09OKHByaXYtPmZ3X3N0YXRlICE9IEZXX1NUQVRFX1JFQURZKTsKIAotCWNhbmNlbF93b3JrX3N5bmMoJnByaXYtPndvcmspOwotCiAJcDU0c3BpX3Bvd2VyX29mZihwcml2KTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpdi0+dHhfbG9jaywgZmxhZ3MpOwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT50eF9wZW5kaW5nKTsKQEAgLTU5Nyw2ICs1OTEsOCBAQAogCiAJcHJpdi0+Zndfc3RhdGUgPSBGV19TVEFURV9PRkY7CiAJbXV0ZXhfdW5sb2NrKCZwcml2LT5tdXRleCk7CisKKwljYW5jZWxfd29ya19zeW5jKCZwcml2LT53b3JrKTsKIH0KIAogc3RhdGljIGludCBfX2RldmluaXQgcDU0c3BpX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCkBAIC02NTYsNiArNjUyLDcgQEAKIAlpbml0X2NvbXBsZXRpb24oJnByaXYtPmZ3X2NvbXApOwogCUlOSVRfTElTVF9IRUFEKCZwcml2LT50eF9wZW5kaW5nKTsKIAltdXRleF9pbml0KCZwcml2LT5tdXRleCk7CisJc3Bpbl9sb2NrX2luaXQoJnByaXYtPnR4X2xvY2spOwogCVNFVF9JRUVFODAyMTFfREVWKGh3LCAmc3BpLT5kZXYpOwogCXByaXYtPmNvbW1vbi5vcGVuID0gcDU0c3BpX29wX3N0YXJ0OwogCXByaXYtPmNvbW1vbi5zdG9wID0gcDU0c3BpX29wX3N0b3A7CkBAIC03MDMsNyArNzAwLDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciBwNTRzcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCQk9ICJwNTRzcGkiLAotCQkuYnVzCQk9ICZzcGlfYnVzX3R5cGUsCiAJCS5vd25lcgkJPSBUSElTX01PRFVMRSwKIAl9LAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvdHhyeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcDU0L3R4cnguYwppbmRleCA2ZWQ5YzMyLi40MmI5N2JjIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wNTQvdHhyeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3A1NC90eHJ4LmMKQEAgLTI0Miw3ICsyNDIsNyBAQAogCiAJc2tiX3VubGluayhza2IsICZwcml2LT50eF9xdWV1ZSk7CiAJcDU0X3R4X3Fvc19hY2NvdW50aW5nX2ZyZWUocHJpdiwgc2tiKTsKLQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWllZWU4MDIxMV9mcmVlX3R4c2tiKGRldiwgc2tiKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHA1NF9mcmVlX3NrYik7CiAKQEAgLTc4OCw3ICs3ODgsNyBAQAogCQkJICAgICZoZHJfZmxhZ3MsICZhaWQsICZidXJzdF9hbGxvd2VkKTsKIAogCWlmIChwNTRfdHhfcW9zX2FjY291bnRpbmdfYWxsb2MocHJpdiwgc2tiLCBxdWV1ZSkpIHsKLQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsKKwkJaWVlZTgwMjExX2ZyZWVfdHhza2IoZGV2LCBza2IpOwogCQlyZXR1cm47CiAJfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuYwppbmRleCBkOTdhMmNhLi40ZTQ0YjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmMKQEAgLTc3OCw3ICs3NzgsNyBAQAogCQlkd3JxLT5mbGFncyA9IDA7CiAJCWR3cnEtPmxlbmd0aCA9IDA7CiAJfQotCWVzc2lkLT5vY3RldHNbZXNzaWQtPmxlbmd0aF0gPSAnXDAnOworCWVzc2lkLT5vY3RldHNbZHdycS0+bGVuZ3RoXSA9ICdcMCc7CiAJbWVtY3B5KGV4dHJhLCBlc3NpZC0+b2N0ZXRzLCBkd3JxLT5sZW5ndGgpOwogCWtmcmVlKGVzc2lkKTsKIApAQCAtMjQ5MywzMjMgKzI0OTMsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qIE5vdGU6IGN1cnJlbnRseSwgdXNlIGhvc3RhcGQgaW9jdGwgZnJvbSB0aGUgSG9zdCBBUCBkcml2ZXIgZm9yIFdQQQotICogc3VwcG9ydC4gVGhpcyBpcyB0byBiZSByZXBsYWNlZCB3aXRoIExpbnV4IHdpcmVsZXNzIGV4dGVuc2lvbnMgb25jZSB0aGV5Ci0gKiBnZXQgV1BBIHN1cHBvcnQuICovCi0KLS8qIE5vdGUgSUk6IHBsZWFzZSBsZWF2ZSBhbGwgdGhpcyB0b2dldGhlciBhcyBpdCB3aWxsIGJlIGVhc2llciB0byByZW1vdmUgbGF0ZXIsCi0gKiBvbmNlIHdpcmVsZXNzIGV4dGVuc2lvbnMgYWRkIFdQQSBzdXBwb3J0IC1tY2dyb2YgKi8KLQotLyogUFJJU001NF9IT1NUQVBEIGlvY3RsKCkgY21kOiAqLwotZW51bSB7Ci0JUFJJU00yX1NFVF9FTkNSWVBUSU9OID0gNiwKLQlQUklTTTJfSE9TVEFQRF9TRVRfR0VORVJJQ19FTEVNRU5UID0gMTIsCi0JUFJJU00yX0hPU1RBUERfTUxNRSA9IDEzLAotCVBSSVNNMl9IT1NUQVBEX1NDQU5fUkVRID0gMTQsCi19OwotCiAjZGVmaW5lIFBSSVNNNTRfU0VUX1dQQQkJCVNJT0NJV0ZJUlNUUFJJVisxMgotI2RlZmluZSBQUklTTTU0X0hPU1RBUEQJCQlTSU9DSVdGSVJTVFBSSVYrMjUKLSNkZWZpbmUgUFJJU001NF9EUk9QX1VORU5DUllQVEVECVNJT0NJV0ZJUlNUUFJJVisyNgotCi0jZGVmaW5lIFBSSVNNMl9IT1NUQVBEX01BWF9CVUZfU0laRSAxMDI0Ci0jZGVmaW5lIFBSSVNNMl9IT1NUQVBEX0dFTkVSSUNfRUxFTUVOVF9IRFJfTEVOIFwKLQlvZmZzZXRvZihzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0sIHUuZ2VuZXJpY19lbGVtLmRhdGEpCi0KLS8qIE1heGltdW0gbGVuZ3RoIGZvciBhbGdvcml0aG0gbmFtZXMgKC0xIGZvciBudWwgdGVybWluYXRpb24pCi0gKiB1c2VkIGluIGlvY3RsKCkgKi8KLSNkZWZpbmUgSE9TVEFQX0NSWVBUX0FMR19OQU1FX0xFTiAxNgotCi1zdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gewotCXUzMiBjbWQ7Ci0JdTggc3RhX2FkZHJbRVRIX0FMRU5dOwotCXVuaW9uIHsKLQkgICAgICAgc3RydWN0IHsKLQkJICAgICAgIHU4IGFsZ1tIT1NUQVBfQ1JZUFRfQUxHX05BTUVfTEVOXTsKLQkJICAgICAgIHUzMiBmbGFnczsKLQkJICAgICAgIHUzMiBlcnI7Ci0JCSAgICAgICB1OCBpZHg7Ci0JCSAgICAgICB1OCBzZXFbOF07IC8qIHNlcXVlbmNlIGNvdW50ZXIgKHNldDogUlgsIGdldDogVFgpICovCi0JCSAgICAgICB1MTYga2V5X2xlbjsKLQkJICAgICAgIHU4IGtleVswXTsKLQkJICAgICAgIH0gY3J5cHQ7Ci0gICAgICAgICAgICAgICBzdHJ1Y3QgewotICAgICAgICAgICAgICAgICAgICAgICB1OCBsZW47Ci0gICAgICAgICAgICAgICAgICAgICAgIHU4IGRhdGFbMF07Ci0gICAgICAgICAgICAgICB9IGdlbmVyaWNfZWxlbTsKLSAgICAgICAgICAgICAgIHN0cnVjdCB7Ci0jZGVmaW5lIE1MTUVfU1RBX0RFQVVUSCAwCi0jZGVmaW5lIE1MTUVfU1RBX0RJU0FTU09DIDEKLSAgICAgICAgICAgICAgICAgICAgICAgdTE2IGNtZDsKLSAgICAgICAgICAgICAgICAgICAgICAgdTE2IHJlYXNvbl9jb2RlOwotICAgICAgICAgICAgICAgfSBtbG1lOwotICAgICAgICAgICAgICAgc3RydWN0IHsKLSAgICAgICAgICAgICAgICAgICAgICAgdTggc3NpZF9sZW47Ci0gICAgICAgICAgICAgICAgICAgICAgIHU4IHNzaWRbMzJdOwotICAgICAgICAgICAgICAgfSBzY2FuX3JlcTsKLSAgICAgICB9IHU7Ci19OwotCi0KLXN0YXRpYyBpbnQKLXByaXNtMl9pb2N0bF9zZXRfZW5jcnlwdGlvbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCXN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0sCi0JaW50IHBhcmFtX2xlbikKLXsKLQlpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KGRldik7Ci0JaW50IHJ2YWx1ZSA9IDAsIGZvcmNlID0gMDsKLQlpbnQgYXV0aGVuID0gRE9UMTFfQVVUSF9PUywgaW52b2tlID0gMCwgZXh1bmVuY3J5cHQgPSAwOwotCXVuaW9uIG9pZF9yZXNfdCByOwotCi0JLyogd2l0aCB0aGUgbmV3IEFQSSwgaXQncyBpbXBvc3NpYmxlIHRvIGdldCBhIE5VTEwgcG9pbnRlci4KLQkgKiBOZXcgdmVyc2lvbiBvZiBpd2NvbmZpZyBzZXQgdGhlIElXX0VOQ09ERV9OT0tFWSBmbGFnCi0JICogd2hlbiBubyBrZXkgaXMgZ2l2ZW4sIGJ1dCBvbGRlciB2ZXJzaW9ucyBkb24ndC4gKi8KLQotCWlmIChwYXJhbS0+dS5jcnlwdC5rZXlfbGVuID4gMCkgewotCQkvKiB3ZSBoYXZlIGEga2V5IHRvIHNldCAqLwotCQlpbnQgaW5kZXggPSBwYXJhbS0+dS5jcnlwdC5pZHg7Ci0JCWludCBjdXJyZW50X2luZGV4OwotCQlzdHJ1Y3Qgb2JqX2tleSBrZXkgPSB7IERPVDExX1BSSVZfVEtJUCwgMCwgIiIgfTsKLQotCQkvKiBnZXQgdGhlIGN1cnJlbnQga2V5IGluZGV4ICovCi0JCXJ2YWx1ZSA9IG1ndF9nZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZSUQsIDAsIE5VTEwsICZyKTsKLQkJY3VycmVudF9pbmRleCA9IHIudTsKLQkJLyogVmVyaWZ5IHRoYXQgdGhlIGtleSBpcyBub3QgbWFya2VkIGFzIGludmFsaWQgKi8KLQkJaWYgKCEocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfTk9LRVkpKSB7Ci0JCQlrZXkubGVuZ3RoID0gcGFyYW0tPnUuY3J5cHQua2V5X2xlbiA+IHNpemVvZiAocGFyYW0tPnUuY3J5cHQua2V5KSA/Ci0JCQkgICAgc2l6ZW9mIChwYXJhbS0+dS5jcnlwdC5rZXkpIDogcGFyYW0tPnUuY3J5cHQua2V5X2xlbjsKLQkJCW1lbWNweShrZXkua2V5LCBwYXJhbS0+dS5jcnlwdC5rZXksIGtleS5sZW5ndGgpOwotCQkJaWYgKGtleS5sZW5ndGggPT0gMzIpCi0JCQkJLyogd2Ugd2FudCBXUEEtUFNLICovCi0JCQkJa2V5LnR5cGUgPSBET1QxMV9QUklWX1RLSVA7Ci0JCQlpZiAoKGluZGV4IDwgMCkgfHwgKGluZGV4ID4gMykpCi0JCQkJLyogbm8gaW5kZXggcHJvdmlkZWQgdXNlIHRoZSBjdXJyZW50IG9uZSAqLwotCQkJCWluZGV4ID0gY3VycmVudF9pbmRleDsKLQotCQkJLyogbm93IHNlbmQgdGhlIGtleSB0byB0aGUgY2FyZCAgKi8KLQkJCXJ2YWx1ZSB8PQotCQkJICAgIG1ndF9zZXRfcmVxdWVzdChwcml2LCBET1QxMV9PSURfREVGS0VZWCwgaW5kZXgsCi0JCQkJCSAgICAma2V5KTsKLQkJfQotCQkvKgotCQkgKiBJZiBhIHZhbGlkIGtleSBpcyBzZXQsIGVuY3J5cHRpb24gc2hvdWxkIGJlIGVuYWJsZWQKLQkJICogKHVzZXIgbWF5IHR1cm4gaXQgb2ZmIGxhdGVyKS4KLQkJICogVGhpcyBpcyBhbHNvIGhvdyAiaXdjb25maWcgZXRoWCBrZXkgb24iIHdvcmtzCi0JCSAqLwotCQlpZiAoKGluZGV4ID09IGN1cnJlbnRfaW5kZXgpICYmIChrZXkubGVuZ3RoID4gMCkpCi0JCQlmb3JjZSA9IDE7Ci0JfSBlbHNlIHsKLQkJaW50IGluZGV4ID0gKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX0lOREVYKSAtIDE7Ci0JCWlmICgoaW5kZXggPj0gMCkgJiYgKGluZGV4IDw9IDMpKSB7Ci0JCQkvKiB3ZSB3YW50IHRvIHNldCB0aGUga2V5IGluZGV4ICovCi0JCQlydmFsdWUgfD0KLQkJCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0RFRktFWUlELCAwLAotCQkJCQkgICAgJmluZGV4KTsKLQkJfSBlbHNlIHsKLQkJCWlmICghKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX01PREUpKSB7Ci0JCQkJLyogd2UgY2Fubm90IGRvIGFueXRoaW5nLiBDb21wbGFpbi4gKi8KLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCX0KLQkJfQotCX0KLQkvKiBub3cgcmVhZCB0aGUgZmxhZ3MgKi8KLQlpZiAocGFyYW0tPnUuY3J5cHQuZmxhZ3MgJiBJV19FTkNPREVfRElTQUJMRUQpIHsKLQkJLyogRW5jb2RpbmcgZGlzYWJsZWQsCi0JCSAqIGF1dGhlbiA9IERPVDExX0FVVEhfT1M7Ci0JCSAqIGludm9rZSA9IDA7Ci0JCSAqIGV4dW5lbmNyeXB0ID0gMDsgKi8KLQl9Ci0JaWYgKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX09QRU4pCi0JCS8qIEVuY29kZSBidXQgYWNjZXB0IG5vbi1lbmNvZGVkIHBhY2tldHMuIE5vIGF1dGggKi8KLQkJaW52b2tlID0gMTsKLQlpZiAoKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX1JFU1RSSUNURUQpIHx8IGZvcmNlKSB7Ci0JCS8qIFJlZnVzZSBub24tZW5jb2RlZCBwYWNrZXRzLiBBdXRoICovCi0JCWF1dGhlbiA9IERPVDExX0FVVEhfQk9USDsKLQkJaW52b2tlID0gMTsKLQkJZXh1bmVuY3J5cHQgPSAxOwotCX0KLQkvKiBkbyB0aGUgY2hhbmdlIGlmIHJlcXVlc3RlZCAgKi8KLQlpZiAoKHBhcmFtLT51LmNyeXB0LmZsYWdzICYgSVdfRU5DT0RFX01PREUpIHx8IGZvcmNlKSB7Ci0JCXJ2YWx1ZSB8PQotCQkgICAgbWd0X3NldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9BVVRIRU5BQkxFLCAwLCAmYXV0aGVuKTsKLQkJcnZhbHVlIHw9Ci0JCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX1BSSVZBQ1lJTlZPS0VELCAwLCAmaW52b2tlKTsKLQkJcnZhbHVlIHw9Ci0JCSAgICBtZ3Rfc2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsIDAsCi0JCQkJICAgICZleHVuZW5jcnlwdCk7Ci0JfQotCXJldHVybiBydmFsdWU7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaXNtMl9pb2N0bF9zZXRfZ2VuZXJpY19lbGVtZW50KHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LAotCXN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0sCi0JaW50IHBhcmFtX2xlbikKLXsKLSAgICAgICBpc2xwY2lfcHJpdmF0ZSAqcHJpdiA9IG5ldGRldl9wcml2KG5kZXYpOwotICAgICAgIGludCBtYXhfbGVuLCBsZW4sIGFsZW4sIHJldD0wOwotICAgICAgIHN0cnVjdCBvYmpfYXR0YWNobWVudCAqYXR0YWNoOwotCi0gICAgICAgbGVuID0gcGFyYW0tPnUuZ2VuZXJpY19lbGVtLmxlbjsKLSAgICAgICBtYXhfbGVuID0gcGFyYW1fbGVuIC0gUFJJU00yX0hPU1RBUERfR0VORVJJQ19FTEVNRU5UX0hEUl9MRU47Ci0gICAgICAgaWYgKG1heF9sZW4gPCAwIHx8IG1heF9sZW4gPCBsZW4pCi0gICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLQotICAgICAgIGFsZW4gPSBzaXplb2YoKmF0dGFjaCkgKyBsZW47Ci0gICAgICAgYXR0YWNoID0ga3phbGxvYyhhbGVuLCBHRlBfS0VSTkVMKTsKLSAgICAgICBpZiAoYXR0YWNoID09IE5VTEwpCi0gICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKLQotI2RlZmluZSBXTEFOX0ZDX1RZUEVfTUdNVCAwCi0jZGVmaW5lIFdMQU5fRkNfU1RZUEVfQVNTT0NfUkVRIDAKLSNkZWZpbmUgV0xBTl9GQ19TVFlQRV9SRUFTU09DX1JFUSAyCi0KLSAgICAgICAvKiBOb3RlOiBlbmRpYW5uZXNzIGlzIGNvdmVyZWQgYnkgbWd0X3NldF92YXJsZW4gKi8KLQotICAgICAgIGF0dGFjaC0+dHlwZSA9IChXTEFOX0ZDX1RZUEVfTUdNVCA8PCAyKSB8Ci0gICAgICAgICAgICAgICAoV0xBTl9GQ19TVFlQRV9BU1NPQ19SRVEgPDwgNCk7Ci0gICAgICAgYXR0YWNoLT5pZCA9IC0xOwotICAgICAgIGF0dGFjaC0+c2l6ZSA9IGxlbjsKLSAgICAgICBtZW1jcHkoYXR0YWNoLT5kYXRhLCBwYXJhbS0+dS5nZW5lcmljX2VsZW0uZGF0YSwgbGVuKTsKLQotICAgICAgIHJldCA9IG1ndF9zZXRfdmFybGVuKHByaXYsIERPVDExX09JRF9BVFRBQ0hNRU5ULCBhdHRhY2gsIGxlbik7Ci0KLSAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgICAgIGF0dGFjaC0+dHlwZSA9IChXTEFOX0ZDX1RZUEVfTUdNVCA8PCAyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgIChXTEFOX0ZDX1NUWVBFX1JFQVNTT0NfUkVRIDw8IDQpOwotCi0JICAgICAgIHJldCA9IG1ndF9zZXRfdmFybGVuKHByaXYsIERPVDExX09JRF9BVFRBQ0hNRU5ULCBhdHRhY2gsIGxlbik7Ci0KLQkgICAgICAgaWYgKHJldCA9PSAwKQotCQkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBXUEEgSUUgQXR0YWNobWVudCB3YXMgc2V0XG4iLAotCQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLSAgICAgICB9Ci0KLSAgICAgICBrZnJlZShhdHRhY2gpOwotICAgICAgIHJldHVybiByZXQ7Ci0KLX0KLQotc3RhdGljIGludAotcHJpc20yX2lvY3RsX21sbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IHByaXNtMl9ob3N0YXBkX3BhcmFtICpwYXJhbSkKLXsKLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19Ci0KLXN0YXRpYyBpbnQKLXByaXNtMl9pb2N0bF9zY2FuX3JlcShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSAqcGFyYW0pCi17Ci0JaXNscGNpX3ByaXZhdGUgKnByaXYgPSBuZXRkZXZfcHJpdihuZGV2KTsKLQlzdHJ1Y3QgaXdfcmVxdWVzdF9pbmZvIGluZm87Ci0JaW50IGksIHJ2YWx1ZTsKLQlzdHJ1Y3Qgb2JqX2Jzc2xpc3QgKmJzc2xpc3Q7Ci0JdTMyIG5vaXNlID0gMDsKLQljaGFyICpleHRyYSA9ICIiOwotCWNoYXIgKmN1cnJlbnRfZXYgPSAiZm9vIjsKLQl1bmlvbiBvaWRfcmVzX3QgcjsKLQotCWlmIChpc2xwY2lfZ2V0X3N0YXRlKHByaXYpIDwgUFJWX1NUQVRFX0lOSVQpIHsKLQkJLyogZGV2aWNlIGlzIG5vdCByZWFkeSwgZmFpbCBnZW50bHkgKi8KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyogZmlyc3QgZ2V0IHRoZSBub2lzZSB2YWx1ZS4gV2Ugd2lsbCB1c2UgaXQgdG8gcmVwb3J0IHRoZSBsaW5rIHF1YWxpdHkgKi8KLQlydmFsdWUgPSBtZ3RfZ2V0X3JlcXVlc3QocHJpdiwgRE9UMTFfT0lEX05PSVNFRkxPT1IsIDAsIE5VTEwsICZyKTsKLQlub2lzZSA9IHIudTsKLQotCS8qIEFzayB0aGUgZGV2aWNlIGZvciBhIGxpc3Qgb2Yga25vd24gYnNzLiBXZSBjYW4gcmVwb3J0IGF0IG1vc3QKLQkgKiBJV19NQVhfQVA9NjQgdG8gdGhlIHJhbmdlIHN0cnVjdC4gQnV0IHRoZSBkZXZpY2Ugd29uJ3QgcmVwcG9ydCBhbnl0aGluZwotCSAqIGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlIG9mIElXTUFYX0JTUz0yNC4KLQkgKi8KLQlydmFsdWUgfD0gbWd0X2dldF9yZXF1ZXN0KHByaXYsIERPVDExX09JRF9CU1NMSVNULCAwLCBOVUxMLCAmcik7Ci0JYnNzbGlzdCA9IHIucHRyOwotCi0JaW5mby5jbWQgPSBQUklTTTU0X0hPU1RBUEQ7Ci0JaW5mby5mbGFncyA9IDA7Ci0KLQkvKiBvayBub3csIHNjYW4gdGhlIGxpc3QgYW5kIHRyYW5zbGF0ZSBpdHMgaW5mbyAqLwotCWZvciAoaSA9IDA7IGkgPCBtaW4oSVdfTUFYX0FQLCAoaW50KSBic3NsaXN0LT5ucik7IGkrKykKLQkJY3VycmVudF9ldiA9IHByaXNtNTRfdHJhbnNsYXRlX2JzcyhuZGV2LCAmaW5mbywgY3VycmVudF9ldiwKLQkJCQkJCSAgIGV4dHJhICsgSVdfU0NBTl9NQVhfREFUQSwKLQkJCQkJCSAgICYoYnNzbGlzdC0+YnNzbGlzdFtpXSksCi0JCQkJCQkgICBub2lzZSk7Ci0Ja2ZyZWUoYnNzbGlzdCk7Ci0KLQlyZXR1cm4gcnZhbHVlOwotfQotCi1zdGF0aWMgaW50Ci1wcmlzbTU0X2hvc3RhcGQoc3RydWN0IG5ldF9kZXZpY2UgKm5kZXYsIHN0cnVjdCBpd19wb2ludCAqcCkKLXsKLSAgICAgICBzdHJ1Y3QgcHJpc20yX2hvc3RhcGRfcGFyYW0gKnBhcmFtOwotICAgICAgIGludCByZXQgPSAwOwotICAgICAgIHUzMiB1d3JxOwotCi0gICAgICAgcHJpbnRrKEtFUk5fREVCVUcgInByaXNtNTRfaG9zdGFwZCAtIGxlbj0lZFxuIiwgcC0+bGVuZ3RoKTsKLSAgICAgICBpZiAocC0+bGVuZ3RoIDwgc2l6ZW9mKHN0cnVjdCBwcmlzbTJfaG9zdGFwZF9wYXJhbSkgfHwKLSAgICAgICAgICAgcC0+bGVuZ3RoID4gUFJJU00yX0hPU1RBUERfTUFYX0JVRl9TSVpFIHx8ICFwLT5wb2ludGVyKQotICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0KLQlwYXJhbSA9IG1lbWR1cF91c2VyKHAtPnBvaW50ZXIsIHAtPmxlbmd0aCk7Ci0JaWYgKElTX0VSUihwYXJhbSkpCi0JCXJldHVybiBQVFJfRVJSKHBhcmFtKTsKLQotICAgICAgIHN3aXRjaCAocGFyYW0tPmNtZCkgewotICAgICAgIGNhc2UgUFJJU00yX1NFVF9FTkNSWVBUSU9OOgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBzZXQgZW5jcnlwdGlvbiByZXF1ZXN0XG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUpOwotICAgICAgICAgICAgICAgcmV0ID0gcHJpc20yX2lvY3RsX3NldF9lbmNyeXB0aW9uKG5kZXYsIHBhcmFtLCBwLT5sZW5ndGgpOwotICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSBQUklTTTJfSE9TVEFQRF9TRVRfR0VORVJJQ19FTEVNRU5UOgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgc3VwcGxpY2FudCBzZXQgV1BBIElFIHJlcXVlc3RcbiIsCi0JCQkgICAgICAgbmRldi0+bmFtZSk7Ci0gICAgICAgICAgICAgICByZXQgPSBwcmlzbTJfaW9jdGxfc2V0X2dlbmVyaWNfZWxlbWVudChuZGV2LCBwYXJhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAtPmxlbmd0aCk7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICBjYXNlIFBSSVNNMl9IT1NUQVBEX01MTUU6Ci0JICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogQ2F1Z2h0IFdQQSBzdXBwbGljYW50IE1MTUUgcmVxdWVzdFxuIiwKLQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLSAgICAgICAgICAgICAgIHJldCA9IHByaXNtMl9pb2N0bF9tbG1lKG5kZXYsIHBhcmFtKTsKLSAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgIGNhc2UgUFJJU00yX0hPU1RBUERfU0NBTl9SRVE6Ci0JICAgICAgIHByaW50ayhLRVJOX0RFQlVHICIlczogQ2F1Z2h0IFdQQSBzdXBwbGljYW50IHNjYW4gcmVxdWVzdFxuIiwKLQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLSAgICAgICAgICAgICAgIHJldCA9IHByaXNtMl9pb2N0bF9zY2FuX3JlcShuZGV2LCBwYXJhbSk7Ci0gICAgICAgICAgICAgICBicmVhazsKLQljYXNlIFBSSVNNNTRfU0VUX1dQQToKLQkgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBDYXVnaHQgV1BBIHN1cHBsaWNhbnQgd3BhIGluaXQgcmVxdWVzdFxuIiwKLQkJCSAgICAgICBuZGV2LT5uYW1lKTsKLQkgICAgICAgdXdycSA9IDE7Ci0JICAgICAgIHJldCA9IHByaXNtNTRfc2V0X3dwYShuZGV2LCBOVUxMLCAmdXdycSwgTlVMTCk7Ci0JICAgICAgIGJyZWFrOwotCWNhc2UgUFJJU001NF9EUk9QX1VORU5DUllQVEVEOgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBXUEEgZHJvcCB1bmVuY3J5cHRlZCByZXF1ZXN0XG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUpOwotI2lmIDAKLQkgICAgICAgdXdycSA9IDB4MDE7Ci0JICAgICAgIG1ndF9zZXQocHJpdiwgRE9UMTFfT0lEX0VYVU5FTkNSWVBURUQsICZ1d3JxKTsKLQkgICAgICAgZG93bl93cml0ZSgmcHJpdi0+bWliX3NlbSk7Ci0JICAgICAgIG1ndF9jb21taXQocHJpdik7Ci0JICAgICAgIHVwX3dyaXRlKCZwcml2LT5taWJfc2VtKTsKLSNlbmRpZgotCSAgICAgICAvKiBOb3QgbmVjZXNzYXJ5LCBhcyBzZXRfd3BhIGRvZXMgaXQsIHNob3VsZCB3ZSBqdXN0IGRvIGl0IGhlcmUgdGhvdWdoPyAqLwotCSAgICAgICByZXQgPSAwOwotCSAgICAgICBicmVhazsKLSAgICAgICBkZWZhdWx0OgotCSAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiJXM6IENhdWdodCBhIFdQQSBzdXBwbGljYW50IHJlcXVlc3QgdGhhdCBpcyBub3Qgc3VwcG9ydGVkXG4iLAotCQkJICAgICAgIG5kZXYtPm5hbWUpOwotICAgICAgICAgICAgICAgcmV0ID0gLUVPUE5PVFNVUFA7Ci0gICAgICAgICAgICAgICBicmVhazsKLSAgICAgICB9Ci0KLSAgICAgICBpZiAocmV0ID09IDAgJiYgY29weV90b191c2VyKHAtPnBvaW50ZXIsIHBhcmFtLCBwLT5sZW5ndGgpKQotICAgICAgICAgICAgICAgcmV0ID0gLUVGQVVMVDsKLQotICAgICAgIGtmcmVlKHBhcmFtKTsKLQotICAgICAgIHJldHVybiByZXQ7Ci19CiAKIHN0YXRpYyBpbnQKIHByaXNtNTRfc2V0X3dwYShzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiwgc3RydWN0IGl3X3JlcXVlc3RfaW5mbyAqaW5mbywKQEAgLTMyMjMsMjAgKzI5MDcsMyBAQAogCS5wcml2YXRlX2FyZ3MgPSAoc3RydWN0IGl3X3ByaXZfYXJncyAqKSBwcmlzbTU0X3ByaXZhdGVfYXJncywKIAkuZ2V0X3dpcmVsZXNzX3N0YXRzID0gcHJpc201NF9nZXRfd2lyZWxlc3Nfc3RhdHMsCiB9OwotCi0vKiBGb3Igd3BhX3N1cHBsaWNhbnQgKi8KLQotaW50Ci1wcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICpuZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQotewotCXN0cnVjdCBpd3JlcSAqd3JxID0gKHN0cnVjdCBpd3JlcSAqKSBycTsKLQlpbnQgcmV0ID0gLTE7Ci0Jc3dpdGNoIChjbWQpIHsKLQkJY2FzZSBQUklTTTU0X0hPU1RBUEQ6Ci0JCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKLQkJCXJldHVybiAtRVBFUk07Ci0JCXJldCA9IHByaXNtNTRfaG9zdGFwZChuZGV2LCAmd3JxLT51LmRhdGEpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xfaW9jdGwuaAppbmRleCBiY2ZiZmI5Li5hMzRiY2ViIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9wcmlzbTU0L2lzbF9pb2N0bC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNsX2lvY3RsLmgKQEAgLTQzLDggKzQzLDYgQEAKIAogaW50IHByaXNtNTRfc2V0X21hY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICosIHZvaWQgKik7CiAKLWludCBwcmlzbTU0X2lvY3RsKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBpZnJlcSAqLCBpbnQpOwotCiBleHRlcm4gY29uc3Qgc3RydWN0IGl3X2hhbmRsZXJfZGVmIHByaXNtNTRfaGFuZGxlcl9kZWY7CiAKICNlbmRpZgkJCQkvKiBfSVNMX0lPQ1RMX0ggKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3ByaXNtNTQvaXNscGNpX2Rldi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKaW5kZXggNWQwZjYxNS4uNTk3MGZmNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcHJpc201NC9pc2xwY2lfZGV2LmMKQEAgLTc5Myw4ICs3OTMsOCBAQAogc3RhdGljIHZvaWQgaXNscGNpX2V0aHRvb2xfZ2V0X2RydmluZm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX2RydmluZm8gKmluZm8pCiB7Ci0Jc3RyY3B5KGluZm8tPmRyaXZlciwgRFJWX05BTUUpOwotCXN0cmNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTik7CisJc3RybGNweShpbmZvLT5kcml2ZXIsIERSVl9OQU1FLCBzaXplb2YoaW5mby0+ZHJpdmVyKSk7CisJc3RybGNweShpbmZvLT52ZXJzaW9uLCBEUlZfVkVSU0lPTiwgc2l6ZW9mKGluZm8tPnZlcnNpb24pKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBpc2xwY2lfZXRodG9vbF9vcHMgPSB7CkBAIC04MDQsNyArODA0LDYgQEAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaXNscGNpX25ldGRldl9vcHMgPSB7CiAJLm5kb19vcGVuIAkJPSBpc2xwY2lfb3BlbiwKIAkubmRvX3N0b3AJCT0gaXNscGNpX2Nsb3NlLAotCS5uZG9fZG9faW9jdGwJCT0gcHJpc201NF9pb2N0bCwKIAkubmRvX3N0YXJ0X3htaXQJCT0gaXNscGNpX2V0aF90cmFuc21pdCwKIAkubmRvX3R4X3RpbWVvdXQJCT0gaXNscGNpX2V0aF90eF90aW1lb3V0LAogCS5uZG9fc2V0X21hY19hZGRyZXNzIAk9IHByaXNtNTRfc2V0X21hY19hZGRyZXNzLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcmF5X2NzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwppbmRleCAwMDIxZTQ5Li4wNGZlYzFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXlfY3MuYwpAQCAtMjQyNiw3ICsyNDI2LDcgQEAKIAkJCSAgICB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIGludCByeF9sZW4pCiB7CiAJVUNIQVIgYnVmZlsyNTZdOwotCXN0cnVjdCByeF9tc2cgKm1zZyA9IChzdHJ1Y3QgcnhfbXNnICopYnVmZjsKKwlzdHJ1Y3QgcmF5X3J4X21zZyAqbXNnID0gKHN0cnVjdCByYXlfcnhfbXNnICopIGJ1ZmY7CiAKIAlkZWxfdGltZXIoJmxvY2FsLT50aW1lcik7CiAKQEAgLTI1MTMsNyArMjUxMyw3IEBACiAJCQkgICAgICB1bnNpZ25lZCBpbnQgcGt0X2FkZHIsIGludCByeF9sZW4pCiB7CiAvKiAgVUNIQVIgYnVmZlsyNTZdOwotICAgIHN0cnVjdCByeF9tc2cgKm1zZyA9IChzdHJ1Y3QgcnhfbXNnICopYnVmZjsKKyAgICBzdHJ1Y3QgcmF5X3J4X21zZyAqbXNnID0gKHN0cnVjdCByYXlfcnhfbXNnICopIGJ1ZmY7CiAqLwogCXByX2RlYnVnKCJEZWF1dGhlbnRpY2F0aW9uIGZyYW1lIHJlY2VpdmVkXG4iKTsKIAlsb2NhbC0+YXV0aGVudGljYXRpb25fc3RhdGUgPSBVTkFVVEhFTlRJQ0FURUQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9yYXljdGwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheWN0bC5oCmluZGV4IGQ3NjQ2ZjIuLjNjM2I5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheWN0bC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JheWN0bC5oCkBAIC01NjYsOSArNTY2LDkgQEAKICAgICBVQ0hBUiBoZHJfMzsKICAgICBVQ0hBUiBoZHJfNDsKIH07Ci1zdHJ1Y3QgcnhfbXNnIHsKK3N0cnVjdCByYXlfcnhfbXNnIHsKICAgICBzdHJ1Y3QgbWFjX2hlYWRlciBtYWM7Ci0gICAgVUNIQVIgIHZhclsxXTsKKyAgICBVQ0hBUiAgdmFyWzBdOwogfTsKIAogc3RydWN0IHR4X21zZyB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ybmRpc193bGFuLmMKaW5kZXggMGMxMzg0MC4uMzgwMmMzMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvcm5kaXNfd2xhbi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3JuZGlzX3dsYW4uYwpAQCAtMjQ0LDYgKzI0NCwxMCBAQAogCU5ESVNfODAyMTFfUE9XRVJfTU9ERV9GQVNUX1BTUCwKIH07CiAKK2VudW0gbmRpc184MDIxMV9wbWtpZF9jYW5kX2xpc3RfZmxhZ19iaXRzIHsKKwlORElTXzgwMjExX1BNS0lEX0NBTkRfUFJFQVVUSCA9IGNwdV90b19sZTMyKDEgPDwgMCkKK307CisKIHN0cnVjdCBuZGlzXzgwMjExX2F1dGhfcmVxdWVzdCB7CiAJX19sZTMyIGxlbmd0aDsKIAl1OCBic3NpZFs2XTsKQEAgLTM4NywxOSArMzkxLDE3IEBACiBzdHJ1Y3QgbmRpc184MDIxMV9ic3NpZF9pbmZvIHsKIAl1OCBic3NpZFs2XTsKIAl1OCBwbWtpZFsxNl07Ci19OworfSBfX3BhY2tlZDsKIAogc3RydWN0IG5kaXNfODAyMTFfcG1raWQgewogCV9fbGUzMiBsZW5ndGg7CiAJX19sZTMyIGJzc2lkX2luZm9fY291bnQ7CiAJc3RydWN0IG5kaXNfODAyMTFfYnNzaWRfaW5mbyBic3NpZF9pbmZvWzBdOwotfTsKK30gX19wYWNrZWQ7CiAKIC8qCiAgKiAgcHJpdmF0ZSBkYXRhCiAgKi8KLSNkZWZpbmUgTkVUX1RZUEVfMTFGQgkwCi0KICNkZWZpbmUgQ0FQX01PREVfODAyMTFBCQkxCiAjZGVmaW5lIENBUF9NT0RFXzgwMjExQgkJMgogI2RlZmluZSBDQVBfTU9ERV84MDIxMUcJCTQKQEAgLTQxNCw2ICs0MTYsNyBAQAogI2RlZmluZSBSTkRJU19XTEFOX0FMR19US0lQCSgxPDwxKQogI2RlZmluZSBSTkRJU19XTEFOX0FMR19DQ01QCSgxPDwyKQogCisjZGVmaW5lIFJORElTX1dMQU5fTlVNX0tFWVMJCTQKICNkZWZpbmUgUk5ESVNfV0xBTl9LRVlfTUdNVF9OT05FCTAKICNkZWZpbmUgUk5ESVNfV0xBTl9LRVlfTUdNVF84MDJfMVgJKDE8PDApCiAjZGVmaW5lIFJORElTX1dMQU5fS0VZX01HTVRfUFNLCQkoMTw8MSkKQEAgLTUxNiw3ICs1MTksNyBAQAogCiAJLyogZW5jcnlwdGlvbiBzdHVmZiAqLwogCWludCAgZW5jcl90eF9rZXlfaW5kZXg7Ci0Jc3RydWN0IHJuZGlzX3dsYW5fZW5jcl9rZXkgZW5jcl9rZXlzWzRdOworCXN0cnVjdCBybmRpc193bGFuX2VuY3Jfa2V5IGVuY3Jfa2V5c1tSTkRJU19XTEFOX05VTV9LRVlTXTsKIAlpbnQgIHdwYV92ZXJzaW9uOwogCiAJdTggY29tbWFuZF9idWZmZXJbQ09NTUFORF9CVUZGRVJfU0laRV07CkBAIC0xMzQ2LDYgKzEzNDksMzIgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpnZXRfY3VycmVudF9jaGFubmVsKHN0cnVjdCB1c2JuZXQgKnVzYmRldiwKKwkJCQkJCSAgICAgdTE2ICpiZWFjb25faW50ZXJ2YWwpCit7CisJc3RydWN0IHJuZGlzX3dsYW5fcHJpdmF0ZSAqcHJpdiA9IGdldF9ybmRpc193bGFuX3ByaXYodXNiZGV2KTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7CisJc3RydWN0IG5kaXNfODAyMTFfY29uZiBjb25maWc7CisJaW50IGxlbiwgcmV0OworCisJLyogR2V0IGNoYW5uZWwgYW5kIGJlYWNvbiBpbnRlcnZhbCAqLworCWxlbiA9IHNpemVvZihjb25maWcpOworCXJldCA9IHJuZGlzX3F1ZXJ5X29pZCh1c2JkZXYsIE9JRF84MDJfMTFfQ09ORklHVVJBVElPTiwgJmNvbmZpZywgJmxlbik7CisJbmV0ZGV2X2RiZyh1c2JkZXYtPm5ldCwgIiVzKCk6IE9JRF84MDJfMTFfQ09ORklHVVJBVElPTiAtPiAlZFxuIiwKKwkJCQlfX2Z1bmNfXywgcmV0KTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwljaGFubmVsID0gaWVlZTgwMjExX2dldF9jaGFubmVsKHByaXYtPndkZXYud2lwaHksCisJCQkJS0haX1RPX01IWihsZTMyX3RvX2NwdShjb25maWcuZHNfY29uZmlnKSkpOworCWlmICghY2hhbm5lbCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoYmVhY29uX2ludGVydmFsKQorCQkqYmVhY29uX2ludGVydmFsID0gbGUxNl90b19jcHUoY29uZmlnLmJlYWNvbl9wZXJpb2QpOworCXJldHVybiBjaGFubmVsOworfQorCiAvKiBpbmRleCBtdXN0IGJlIDAgLSBOLCBhcyBwZXIgTkRJUyAgKi8KIHN0YXRpYyBpbnQgYWRkX3dlcF9rZXkoc3RydWN0IHVzYm5ldCAqdXNiZGV2LCBjb25zdCB1OCAqa2V5LCBpbnQga2V5X2xlbiwKIAkJCQkJCQkJaW50IGluZGV4KQpAQCAtMTUzNSw2ICsxNTY0LDkgQEAKIAlib29sIGlzX3dwYTsKIAlpbnQgcmV0OwogCisJaWYgKGluZGV4ID49IFJORElTX1dMQU5fTlVNX0tFWVMpCisJCXJldHVybiAtRU5PRU5UOworCiAJaWYgKHByaXYtPmVuY3Jfa2V5c1tpbmRleF0ubGVuID09IDApCiAJCXJldHVybiAwOwogCkBAIC0xOTcyLDExICsyMDA0LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9ic3MgKnJuZGlzX2Jzc19pbmZvX3VwZGF0ZShzdHJ1Y3QgdXNibmV0ICp1c2JkZXYsCi0JCQkJCXN0cnVjdCBuZGlzXzgwMjExX2Jzc2lkX2V4ICpic3NpZCkKK3N0YXRpYyBib29sIHJuZGlzX2Jzc19pbmZvX3VwZGF0ZShzdHJ1Y3QgdXNibmV0ICp1c2JkZXYsCisJCQkJICBzdHJ1Y3QgbmRpc184MDIxMV9ic3NpZF9leCAqYnNzaWQpCiB7CiAJc3RydWN0IHJuZGlzX3dsYW5fcHJpdmF0ZSAqcHJpdiA9IGdldF9ybmRpc193bGFuX3ByaXYodXNiZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7CisJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwogCXMzMiBzaWduYWw7CiAJdTY0IHRpbWVzdGFtcDsKIAl1MTYgY2FwYWJpbGl0eTsKQEAgLTIwMTUsOSArMjA0OCwxMiBAQAogCWNhcGFiaWxpdHkgPSBsZTE2X3RvX2NwdShmaXhlZC0+Y2FwYWJpbGl0aWVzKTsKIAliZWFjb25faW50ZXJ2YWwgPSBsZTE2X3RvX2NwdShmaXhlZC0+YmVhY29uX2ludGVydmFsKTsKIAotCXJldHVybiBjZmc4MDIxMV9pbmZvcm1fYnNzKHByaXYtPndkZXYud2lwaHksIGNoYW5uZWwsIGJzc2lkLT5tYWMsCisJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyhwcml2LT53ZGV2LndpcGh5LCBjaGFubmVsLCBic3NpZC0+bWFjLAogCQl0aW1lc3RhbXAsIGNhcGFiaWxpdHksIGJlYWNvbl9pbnRlcnZhbCwgaWUsIGllX2xlbiwgc2lnbmFsLAogCQlHRlBfS0VSTkVMKTsKKwljZmc4MDIxMV9wdXRfYnNzKGJzcyk7CisKKwlyZXR1cm4gKGJzcyAhPSBOVUxMKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZGlzXzgwMjExX2Jzc2lkX2V4ICpuZXh0X2Jzc2lkX2xpc3RfaXRlbSgKQEAgLTI0NTEsNiArMjQ4Nyw5IEBACiAKIAluZXRkZXZfZGJnKHVzYmRldi0+bmV0LCAiJXMoJWkpXG4iLCBfX2Z1bmNfXywga2V5X2luZGV4KTsKIAorCWlmIChrZXlfaW5kZXggPj0gUk5ESVNfV0xBTl9OVU1fS0VZUykKKwkJcmV0dXJuIC1FTk9FTlQ7CisKIAlwcml2LT5lbmNyX3R4X2tleV9pbmRleCA9IGtleV9pbmRleDsKIAogCWlmIChpc193cGFfa2V5KHByaXYsIGtleV9pbmRleCkpCkBAIC0yNjM5LDEyICsyNjc4LDEyIEBACiB7CiAJc3RydWN0IHJuZGlzX3dsYW5fcHJpdmF0ZSAqcHJpdiA9IGdldF9ybmRpc193bGFuX3ByaXYodXNiZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWw7Ci0Jc3RydWN0IG5kaXNfODAyMTFfY29uZiBjb25maWc7CiAJc3RydWN0IG5kaXNfODAyMTFfc3NpZCBzc2lkOworCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKIAlzMzIgc2lnbmFsOwogCXU2NCB0aW1lc3RhbXA7CiAJdTE2IGNhcGFiaWxpdHk7Ci0JdTE2IGJlYWNvbl9pbnRlcnZhbDsKKwl1MTYgYmVhY29uX2ludGVydmFsID0gMDsKIAlfX2xlMzIgcnNzaTsKIAl1OCBpZV9idWZbMzRdOwogCWludCBsZW4sIHJldCwgaWVfbGVuOwpAQCAtMjY2OSwyMiArMjcwOCwxMCBAQAogCX0KIAogCS8qIEdldCBjaGFubmVsIGFuZCBiZWFjb24gaW50ZXJ2YWwgKi8KLQlsZW4gPSBzaXplb2YoY29uZmlnKTsKLQlyZXQgPSBybmRpc19xdWVyeV9vaWQodXNiZGV2LCBPSURfODAyXzExX0NPTkZJR1VSQVRJT04sICZjb25maWcsICZsZW4pOwotCW5ldGRldl9kYmcodXNiZGV2LT5uZXQsICIlcygpOiBPSURfODAyXzExX0NPTkZJR1VSQVRJT04gLT4gJWRcbiIsCi0JCQkJX19mdW5jX18sIHJldCk7Ci0JaWYgKHJldCA+PSAwKSB7Ci0JCWJlYWNvbl9pbnRlcnZhbCA9IGxlMTZfdG9fY3B1KGNvbmZpZy5iZWFjb25fcGVyaW9kKTsKLQkJY2hhbm5lbCA9IGllZWU4MDIxMV9nZXRfY2hhbm5lbChwcml2LT53ZGV2LndpcGh5LAotCQkJCUtIWl9UT19NSFoobGUzMl90b19jcHUoY29uZmlnLmRzX2NvbmZpZykpKTsKLQkJaWYgKCFjaGFubmVsKSB7Ci0JCQluZXRkZXZfd2Fybih1c2JkZXYtPm5ldCwgIiVzKCk6IGNvdWxkIG5vdCBnZXQgY2hhbm5lbC4iCi0JCQkJCQkgIlxuIiwgX19mdW5jX18pOwotCQkJcmV0dXJuOwotCQl9Ci0JfSBlbHNlIHsKLQkJbmV0ZGV2X3dhcm4odXNiZGV2LT5uZXQsICIlcygpOiBjb3VsZCBub3QgZ2V0IGNvbmZpZ3VyYXRpb24uXG4iLAotCQkJCQkgX19mdW5jX18pOworCWNoYW5uZWwgPSBnZXRfY3VycmVudF9jaGFubmVsKHVzYmRldiwgJmJlYWNvbl9pbnRlcnZhbCk7CisJaWYgKCFjaGFubmVsKSB7CisJCW5ldGRldl93YXJuKHVzYmRldi0+bmV0LCAiJXMoKTogY291bGQgbm90IGdldCBjaGFubmVsLlxuIiwKKwkJCQkJX19mdW5jX18pOwogCQlyZXR1cm47CiAJfQogCkBAIC0yNzE0LDkgKzI3NDEsMTAgQEAKIAkJYnNzaWQsICh1MzIpdGltZXN0YW1wLCBjYXBhYmlsaXR5LCBiZWFjb25faW50ZXJ2YWwsIGllX2xlbiwKIAkJc3NpZC5lc3NpZCwgc2lnbmFsKTsKIAotCWNmZzgwMjExX2luZm9ybV9ic3MocHJpdi0+d2Rldi53aXBoeSwgY2hhbm5lbCwgYnNzaWQsCisJYnNzID0gY2ZnODAyMTFfaW5mb3JtX2Jzcyhwcml2LT53ZGV2LndpcGh5LCBjaGFubmVsLCBic3NpZCwKIAkJdGltZXN0YW1wLCBjYXBhYmlsaXR5LCBiZWFjb25faW50ZXJ2YWwsIGllX2J1ZiwgaWVfbGVuLAogCQlzaWduYWwsIEdGUF9LRVJORUwpOworCWNmZzgwMjExX3B1dF9ic3MoYnNzKTsKIH0KIAogLyoKQEAgLTI4MjgsOCArMjg1Niw5IEBACiAJCQkJCQlyZXFfaWVfbGVuLCByZXNwX2llLAogCQkJCQkJcmVzcF9pZV9sZW4sIDAsIEdGUF9LRVJORUwpOwogCQllbHNlCi0JCQljZmc4MDIxMV9yb2FtZWQodXNiZGV2LT5uZXQsIE5VTEwsIGJzc2lkLAotCQkJCQlyZXFfaWUsIHJlcV9pZV9sZW4sCisJCQljZmc4MDIxMV9yb2FtZWQodXNiZGV2LT5uZXQsCisJCQkJCWdldF9jdXJyZW50X2NoYW5uZWwodXNiZGV2LCBOVUxMKSwKKwkJCQkJYnNzaWQsIHJlcV9pZSwgcmVxX2llX2xlbiwKIAkJCQkJcmVzcF9pZSwgcmVzcF9pZV9sZW4sIEdGUF9LRVJORUwpOwogCX0gZWxzZSBpZiAocHJpdi0+aW5mcmFfbW9kZSA9PSBORElTXzgwMjExX0lORlJBX0FESE9DKQogCQljZmc4MDIxMV9pYnNzX2pvaW5lZCh1c2JkZXYtPm5ldCwgYnNzaWQsIEdGUF9LRVJORUwpOwpAQCAtMjk5NSwyNSArMzAyNCwxMyBAQAogCWZvciAoaSA9IDA7IGkgPCBsZTMyX3RvX2NwdShjYW5kX2xpc3QtPm51bV9jYW5kaWRhdGVzKTsgaSsrKSB7CiAJCXN0cnVjdCBuZGlzXzgwMjExX3Bta2lkX2NhbmRpZGF0ZSAqY2FuZCA9CiAJCQkJCQkmY2FuZF9saXN0LT5jYW5kaWRhdGVfbGlzdFtpXTsKKwkJYm9vbCBwcmVhdXRoID0gISEoY2FuZC0+ZmxhZ3MgJiBORElTXzgwMjExX1BNS0lEX0NBTkRfUFJFQVVUSCk7CiAKLQkJbmV0ZGV2X2RiZyh1c2JkZXYtPm5ldCwgImNhbmRbJWldOiBmbGFnczogMHglMDh4LCBic3NpZDogJXBNXG4iLAotCQkJICAgaSwgbGUzMl90b19jcHUoY2FuZC0+ZmxhZ3MpLCBjYW5kLT5ic3NpZCk7CisJCW5ldGRldl9kYmcodXNiZGV2LT5uZXQsICJjYW5kWyVpXTogZmxhZ3M6IDB4JTA4eCwgcHJlYXV0aDogJWQsIGJzc2lkOiAlcE1cbiIsCisJCQkgICBpLCBsZTMyX3RvX2NwdShjYW5kLT5mbGFncyksIHByZWF1dGgsIGNhbmQtPmJzc2lkKTsKIAotI2lmIDAKLQkJc3RydWN0IGl3X3Bta2lkX2NhbmQgcGNhbmQ7Ci0JCXVuaW9uIGl3cmVxX2RhdGEgd3JxdTsKLQotCQltZW1zZXQoJnBjYW5kLCAwLCBzaXplb2YocGNhbmQpKTsKLQkJaWYgKGxlMzJfdG9fY3B1KGNhbmQtPmZsYWdzKSAmIDB4MDEpCi0JCQlwY2FuZC5mbGFncyB8PSBJV19QTUtJRF9DQU5EX1BSRUFVVEg7Ci0JCXBjYW5kLmluZGV4ID0gaTsKLQkJbWVtY3B5KHBjYW5kLmJzc2lkLnNhX2RhdGEsIGNhbmQtPmJzc2lkLCBFVEhfQUxFTik7Ci0KLQkJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwotCQl3cnF1LmRhdGEubGVuZ3RoID0gc2l6ZW9mKHBjYW5kKTsKLQkJd2lyZWxlc3Nfc2VuZF9ldmVudCh1c2JkZXYtPm5ldCwgSVdFVlBNS0lEQ0FORCwgJndycXUsCi0JCQkJCQkJCSh1OCAqKSZwY2FuZCk7Ci0jZW5kaWYKKwkJY2ZnODAyMTFfcG1rc2FfY2FuZGlkYXRlX25vdGlmeSh1c2JkZXYtPm5ldCwgaSwgY2FuZC0+YnNzaWQsCisJCQkJCQlwcmVhdXRoLCBHRlBfQVRPTUlDKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDB1c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI1MDB1c2IuYwppbmRleCA1M2M1Zjg3Li5kZTdkNDFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyNTAwdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjUwMHVzYi5jCkBAIC0zOSw3ICszOSw3IEBACiAvKgogICogQWxsb3cgaGFyZHdhcmUgZW5jcnlwdGlvbiB0byBiZSBkaXNhYmxlZC4KICAqLwotc3RhdGljIGludCBtb2RwYXJhbV9ub2h3Y3J5cHQ7CitzdGF0aWMgYm9vbCBtb2RwYXJhbV9ub2h3Y3J5cHQ7CiBtb2R1bGVfcGFyYW1fbmFtZWQobm9od2NyeXB0LCBtb2RwYXJhbV9ub2h3Y3J5cHQsIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhub2h3Y3J5cHQsICJEaXNhYmxlIGhhcmR3YXJlIGVuY3J5cHRpb24uIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDAuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDAuaAppbmRleCA0Nzc4NjIwLi4yNTcxYTJmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMC5oCkBAIC01MCw3ICs1MCw3IEBACiAgKiBSRjI4NTMgMi40Ry81RyAzVDNSCiAgKiBSRjMzMjAgMi40RyAxVDFSKFJUMzM1MC9SVDMzNzAvUlQzMzkwKQogICogUkYzMzIyIDIuNEcgMlQyUihSVDMzNTIvUlQzMzcxL1JUMzM3Mi9SVDMzOTEvUlQzMzkyKQotICogUkYzODUzIDIuNEcvNUcgM1QzUihSVDM4ODMvUlQzNTYzL1JUMzU3My9SVDM1OTMvUlQzNjYyKQorICogUkYzMDUzIDIuNEcvNUcgM1QzUihSVDM4ODMvUlQzNTYzL1JUMzU3My9SVDM1OTMvUlQzNjYyKQogICogUkY1MzcwIDIuNEcgMVQxUgogICogUkY1MzkwIDIuNEcgMVQxUgogICovCkBAIC02Niw3ICs2Niw3IEBACiAjZGVmaW5lIFJGMjg1MwkJCQkweDAwMGEKICNkZWZpbmUgUkYzMzIwCQkJCTB4MDAwYgogI2RlZmluZSBSRjMzMjIJCQkJMHgwMDBjCi0jZGVmaW5lIFJGMzg1MwkJCQkweDAwMGQKKyNkZWZpbmUgUkYzMDUzCQkJCTB4MDAwZAogI2RlZmluZSBSRjUzNzAJCQkJMHg1MzcwCiAjZGVmaW5lIFJGNTM5MAkJCQkweDUzOTAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMGxpYi5jCmluZGV4IDNmMTgzYTEuLjIyYTFhOGYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBsaWIuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwbGliLmMKQEAgLTEyMDMsOCArMTIwMywxMCBAQAogCQkJICAgIShmaWx0ZXJfZmxhZ3MgJiBGSUZfQ09OVFJPTCkpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBSWF9GSUxURVJfQ0ZHX0RST1BfUFNQT0xMLAogCQkJICAgIShmaWx0ZXJfZmxhZ3MgJiBGSUZfUFNQT0xMKSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFJYX0ZJTFRFUl9DRkdfRFJPUF9CQSwgMSk7Ci0JcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFJYX0ZJTFRFUl9DRkdfRFJPUF9CQVIsIDApOworCXJ0MngwMF9zZXRfZmllbGQzMigmcmVnLCBSWF9GSUxURVJfQ0ZHX0RST1BfQkEsCisJCQkgICAhKGZpbHRlcl9mbGFncyAmIEZJRl9DT05UUk9MKSk7CisJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFJYX0ZJTFRFUl9DRkdfRFJPUF9CQVIsCisJCQkgICAhKGZpbHRlcl9mbGFncyAmIEZJRl9DT05UUk9MKSk7CiAJcnQyeDAwX3NldF9maWVsZDMyKCZyZWcsIFJYX0ZJTFRFUl9DRkdfRFJPUF9DTlRMLAogCQkJICAgIShmaWx0ZXJfZmxhZ3MgJiBGSUZfQ09OVFJPTCkpOwogCXJ0MjgwMF9yZWdpc3Rlcl93cml0ZShydDJ4MDBkZXYsIFJYX0ZJTFRFUl9DRkcsIHJlZyk7CkBAIC0xOTQyLDE5ICsxOTQ0LDI0IEBACiAJCWluZm8tPmRlZmF1bHRfcG93ZXIyID0gVFhQT1dFUl9BX1RPX0RFVihpbmZvLT5kZWZhdWx0X3Bvd2VyMik7CiAJfQogCi0JaWYgKHJ0MngwMF9yZihydDJ4MDBkZXYsIFJGMjAyMCkgfHwKLQkgICAgcnQyeDAwX3JmKHJ0MngwMGRldiwgUkYzMDIwKSB8fAotCSAgICBydDJ4MDBfcmYocnQyeDAwZGV2LCBSRjMwMjEpIHx8Ci0JICAgIHJ0MngwMF9yZihydDJ4MDBkZXYsIFJGMzAyMikgfHwKLQkgICAgcnQyeDAwX3JmKHJ0MngwMGRldiwgUkYzMzIwKSkKKwlzd2l0Y2ggKHJ0MngwMGRldi0+Y2hpcC5yZikgeworCWNhc2UgUkYyMDIwOgorCWNhc2UgUkYzMDIwOgorCWNhc2UgUkYzMDIxOgorCWNhc2UgUkYzMDIyOgorCWNhc2UgUkYzMzIwOgogCQlydDI4MDBfY29uZmlnX2NoYW5uZWxfcmYzeHh4KHJ0MngwMGRldiwgY29uZiwgcmYsIGluZm8pOwotCWVsc2UgaWYgKHJ0MngwMF9yZihydDJ4MDBkZXYsIFJGMzA1MikpCisJCWJyZWFrOworCWNhc2UgUkYzMDUyOgogCQlydDI4MDBfY29uZmlnX2NoYW5uZWxfcmYzMDUyKHJ0MngwMGRldiwgY29uZiwgcmYsIGluZm8pOwotCWVsc2UgaWYgKHJ0MngwMF9yZihydDJ4MDBkZXYsIFJGNTM3MCkgfHwKLQkJIHJ0MngwMF9yZihydDJ4MDBkZXYsIFJGNTM5MCkpCisJCWJyZWFrOworCWNhc2UgUkY1MzcwOgorCWNhc2UgUkY1MzkwOgogCQlydDI4MDBfY29uZmlnX2NoYW5uZWxfcmY1M3h4KHJ0MngwMGRldiwgY29uZiwgcmYsIGluZm8pOwotCWVsc2UKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJcnQyODAwX2NvbmZpZ19jaGFubmVsX3JmMnh4eChydDJ4MDBkZXYsIGNvbmYsIHJmLCBpbmZvKTsKKwl9CiAKIAkvKgogCSAqIENoYW5nZSBCQlAgc2V0dGluZ3MKQEAgLTM3NzEsNyArMzc3OCw3IEBACiAJLyogQXBwYXJlbnRseSB0aGUgZGF0YSBpcyByZWFkIGZyb20gZW5kIHRvIHN0YXJ0ICovCiAJcnQyODAwX3JlZ2lzdGVyX3JlYWRfbG9jayhydDJ4MDBkZXYsIEVGVVNFX0RBVEEzLCAmcmVnKTsKIAkvKiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgaW4gQ1BVIG9yZGVyLCBidXQgZWVwcm9tIGlzIGxlICovCi0JcnQyeDAwZGV2LT5lZXByb21baV0gPSBjcHVfdG9fbGUzMihyZWcpOworCSoodTMyICopJnJ0MngwMGRldi0+ZWVwcm9tW2ldID0gY3B1X3RvX2xlMzIocmVnKTsKIAlydDI4MDBfcmVnaXN0ZXJfcmVhZF9sb2NrKHJ0MngwMGRldiwgRUZVU0VfREFUQTIsICZyZWcpOwogCSoodTMyICopJnJ0MngwMGRldi0+ZWVwcm9tW2kgKyAyXSA9IGNwdV90b19sZTMyKHJlZyk7CiAJcnQyODAwX3JlZ2lzdGVyX3JlYWRfbG9jayhydDJ4MDBkZXYsIEVGVVNFX0RBVEExLCAmcmVnKTsKQEAgLTM5MzAsMTUgKzM5MzcsMTggQEAKIAlydDJ4MDBfc2V0X2NoaXAocnQyeDAwZGV2LCBydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBNQUNfQ1NSMF9DSElQU0VUKSwKIAkJCXZhbHVlLCBydDJ4MDBfZ2V0X2ZpZWxkMzIocmVnLCBNQUNfQ1NSMF9SRVZJU0lPTikpOwogCi0JaWYgKCFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDI4NjApICYmCi0JICAgICFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDI4NzIpICYmCi0JICAgICFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDI4ODMpICYmCi0JICAgICFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDMwNzApICYmCi0JICAgICFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDMwNzEpICYmCi0JICAgICFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDMwOTApICYmCi0JICAgICFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDMzOTApICYmCi0JICAgICFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDM1NzIpICYmCi0JICAgICFydDJ4MDBfcnQocnQyeDAwZGV2LCBSVDUzOTApKSB7CisJc3dpdGNoIChydDJ4MDBkZXYtPmNoaXAucnQpIHsKKwljYXNlIFJUMjg2MDoKKwljYXNlIFJUMjg3MjoKKwljYXNlIFJUMjg4MzoKKwljYXNlIFJUMzA3MDoKKwljYXNlIFJUMzA3MToKKwljYXNlIFJUMzA5MDoKKwljYXNlIFJUMzM5MDoKKwljYXNlIFJUMzU3MjoKKwljYXNlIFJUNTM5MDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKIAkJRVJST1IocnQyeDAwZGV2LCAiSW52YWxpZCBSVCBjaGlwc2V0IGRldGVjdGVkLlxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KQEAgLTQ1NTIsNiArNDU2Miw5IEBACiAJCXN1cnZleS0+Y2hhbm5lbF90aW1lX2V4dF9idXN5ID0gYnVzeV9leHQgLyAxMDAwOwogCX0KIAorCWlmICghKGh3LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0NPTkZfT0ZGQ0hBTk5FTCkpCisJCXN1cnZleS0+ZmlsbGVkIHw9IFNVUlZFWV9JTkZPX0lOX1VTRTsKKwogCXJldHVybiAwOwogCiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwcGNpLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwcGNpLmMKaW5kZXggZGE0OGM4YS4uNDk0MWExYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHBjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDBwY2kuYwpAQCAtNTAsNyArNTAsNyBAQAogLyoKICAqIEFsbG93IGhhcmR3YXJlIGVuY3J5cHRpb24gdG8gYmUgZGlzYWJsZWQuCiAgKi8KLXN0YXRpYyBpbnQgbW9kcGFyYW1fbm9od2NyeXB0ID0gMDsKK3N0YXRpYyBib29sIG1vZHBhcmFtX25vaHdjcnlwdCA9IGZhbHNlOwogbW9kdWxlX3BhcmFtX25hbWVkKG5vaHdjcnlwdCwgbW9kcGFyYW1fbm9od2NyeXB0LCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Mobm9od2NyeXB0LCAiRGlzYWJsZSBoYXJkd2FyZSBlbmNyeXB0aW9uLiIpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyODAwdXNiLmMKaW5kZXggMzc3ODc2My4uZjhlYjQ5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MjgwMHVzYi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDI4MDB1c2IuYwpAQCAtNDUsNyArNDUsNyBAQAogLyoKICAqIEFsbG93IGhhcmR3YXJlIGVuY3J5cHRpb24gdG8gYmUgZGlzYWJsZWQuCiAgKi8KLXN0YXRpYyBpbnQgbW9kcGFyYW1fbm9od2NyeXB0Oworc3RhdGljIGJvb2wgbW9kcGFyYW1fbm9od2NyeXB0OwogbW9kdWxlX3BhcmFtX25hbWVkKG5vaHdjcnlwdCwgbW9kcGFyYW1fbm9od2NyeXB0LCBib29sLCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0Mobm9od2NyeXB0LCAiRGlzYWJsZSBoYXJkd2FyZSBlbmNyeXB0aW9uLiIpOwogCkBAIC00MDAsMTAgKzQwMCwxMCBAQAogCS8qCiAJICogVGhlIHNpemUgb2YgVFhJTkZPX1cwX1VTQl9ETUFfVFhfUEtUX0xFTiBpcwogCSAqIFRYV0kgKyA4MDIuMTEgaGVhZGVyICsgTDIgcGFkICsgcGF5bG9hZCArIHBhZCwKLQkgKiBzbyBuZWVkIHRvIGRlY3JlYXNlIHNpemUgb2YgVFhJTkZPIGFuZCBVU0IgZW5kIHBhZC4KKwkgKiBzbyBuZWVkIHRvIGRlY3JlYXNlIHNpemUgb2YgVFhJTkZPLgogCSAqLwogCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhJTkZPX1cwX1VTQl9ETUFfVFhfUEtUX0xFTiwKLQkJCSAgIGVudHJ5LT5za2ItPmxlbiAtIFRYSU5GT19ERVNDX1NJWkUgLSA0KTsKKwkJCSAgIHJvdW5kdXAoZW50cnktPnNrYi0+bGVuLCA0KSAtIFRYSU5GT19ERVNDX1NJWkUpOwogCXJ0MngwMF9zZXRfZmllbGQzMigmd29yZCwgVFhJTkZPX1cwX1dJViwKIAkJCSAgICF0ZXN0X2JpdChFTlRSWV9UWERfRU5DUllQVF9JViwgJnR4ZGVzYy0+ZmxhZ3MpKTsKIAlydDJ4MDBfc2V0X2ZpZWxkMzIoJndvcmQsIFRYSU5GT19XMF9RU0VMLCAyKTsKQEAgLTQyMSwzNyArNDIxLDIwIEBACiAJc2tiZGVzYy0+ZGVzY19sZW4gPSBUWElORk9fREVTQ19TSVpFICsgVFhXSV9ERVNDX1NJWkU7CiB9CiAKLXN0YXRpYyB2b2lkIHJ0MjgwMHVzYl93cml0ZV90eF9kYXRhKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnksCi0JCQkJCXN0cnVjdCB0eGVudHJ5X2Rlc2MgKnR4ZGVzYykKLXsKLQl1bnNpZ25lZCBpbnQgbGVuOwotCWludCBlcnI7Ci0KLQlydDI4MDBfd3JpdGVfdHhfZGF0YShlbnRyeSwgdHhkZXNjKTsKLQotCS8qCi0JICogcGFkKDF+MyBieXRlcykgaXMgYWRkZWQgYWZ0ZXIgZWFjaCA4MDIuMTEgcGF5bG9hZC4KLQkgKiBVU0IgZW5kIHBhZCg0IGJ5dGVzKSBpcyBhZGRlZCBhdCBlYWNoIFVTQiBidWxrIG91dCBwYWNrZXQgZW5kLgotCSAqIFRYIGZyYW1lIGZvcm1hdCBpcyA6Ci0JICogfCBUWElORk8gfCBUWFdJIHwgODAyLjExIGhlYWRlciB8IEwyIHBhZCB8IHBheWxvYWQgfCBwYWQgfCBVU0IgZW5kIHBhZCB8Ci0JICogICAgICAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0tLSB0eF9wa3RfbGVuIC0tLS0tLS0tLS0tLS0+fAotCSAqLwotCWxlbiA9IHJvdW5kdXAoZW50cnktPnNrYi0+bGVuLCA0KSArIDQ7Ci0JZXJyID0gc2tiX3BhZHRvKGVudHJ5LT5za2IsIGxlbik7Ci0JaWYgKHVubGlrZWx5KGVycikpIHsKLQkJV0FSTklORyhlbnRyeS0+cXVldWUtPnJ0MngwMGRldiwgIlRYIFNLQiBwYWRkaW5nIGVycm9yLCBvdXQgb2YgbWVtb3J5XG4iKTsKLQkJcmV0dXJuOwotCX0KLQotCWVudHJ5LT5za2ItPmxlbiA9IGxlbjsKLX0KLQogLyoKICAqIFRYIGRhdGEgaW5pdGlhbGl6YXRpb24KICAqLwogc3RhdGljIGludCBydDI4MDB1c2JfZ2V0X3R4X2RhdGFfbGVuKHN0cnVjdCBxdWV1ZV9lbnRyeSAqZW50cnkpCiB7Ci0JcmV0dXJuIGVudHJ5LT5za2ItPmxlbjsKKwkvKgorCSAqIHBhZCgxfjMgYnl0ZXMpIGlzIG5lZWRlZCBhZnRlciBlYWNoIDgwMi4xMSBwYXlsb2FkLgorCSAqIFVTQiBlbmQgcGFkKDQgYnl0ZXMpIGlzIG5lZWRlZCBhdCBlYWNoIFVTQiBidWxrIG91dCBwYWNrZXQgZW5kLgorCSAqIFRYIGZyYW1lIGZvcm1hdCBpcyA6CisJICogfCBUWElORk8gfCBUWFdJIHwgODAyLjExIGhlYWRlciB8IEwyIHBhZCB8IHBheWxvYWQgfCBwYWQgfCBVU0IgZW5kIHBhZCB8CisJICogICAgICAgICAgICAgICAgIHw8LS0tLS0tLS0tLS0tLSB0eF9wa3RfbGVuIC0tLS0tLS0tLS0tLS0+fAorCSAqLworCisJcmV0dXJuIHJvdW5kdXAoZW50cnktPnNrYi0+bGVuLCA0KSArIDQ7CiB9CiAKIC8qCkBAIC04MDcsNyArNzkwLDcgQEAKIAkuZmx1c2hfcXVldWUJCT0gcnQyeDAwdXNiX2ZsdXNoX3F1ZXVlLAogCS50eF9kbWFfZG9uZQkJPSBydDI4MDB1c2JfdHhfZG1hX2RvbmUsCiAJLndyaXRlX3R4X2Rlc2MJCT0gcnQyODAwdXNiX3dyaXRlX3R4X2Rlc2MsCi0JLndyaXRlX3R4X2RhdGEJCT0gcnQyODAwdXNiX3dyaXRlX3R4X2RhdGEsCisJLndyaXRlX3R4X2RhdGEJCT0gcnQyODAwX3dyaXRlX3R4X2RhdGEsCiAJLndyaXRlX2JlYWNvbgkJPSBydDI4MDBfd3JpdGVfYmVhY29uLAogCS5jbGVhcl9iZWFjb24JCT0gcnQyODAwX2NsZWFyX2JlYWNvbiwKIAkuZ2V0X3R4X2RhdGFfbGVuCT0gcnQyODAwdXNiX2dldF90eF9kYXRhX2xlbiwKQEAgLTkxNCwxMiArODk3LDE0IEBACiAJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHg4MDUzKSB9LAogCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4ODA1YykgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwNTBkLCAweDgxNWMpIH0sCisJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHg4MjVhKSB9LAogCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4ODI1YikgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwNTBkLCAweDkzNWEpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHg5MzViKSB9LAogCS8qIEJ1ZmZhbG8gKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNDExLCAweDAwZTgpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQxMSwgMHgwMTU4KSB9LAorCXsgVVNCX0RFVklDRSgweDA0MTEsIDB4MDE1ZCkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwNDExLCAweDAxNmYpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDQxMSwgMHgwMWEyKSB9LAogCS8qIENvcmVnYSAqLwpAQCAtOTM0LDYgKzkxOSw4IEBACiAJeyBVU0JfREVWSUNFKDB4MDdkMSwgMHgzYzBlKSB9LAogCXsgVVNCX0RFVklDRSgweDA3ZDEsIDB4M2MwZikgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwN2QxLCAweDNjMTEpIH0sCisJeyBVU0JfREVWSUNFKDB4MDdkMSwgMHgzYzEzKSB9LAorCXsgVVNCX0RFVklDRSgweDA3ZDEsIDB4M2MxNSkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwN2QxLCAweDNjMTYpIH0sCiAJLyogRHJheXRlayAqLwogCXsgVVNCX0RFVklDRSgweDA3ZmEsIDB4NzcxMikgfSwKQEAgLTk0Myw2ICs5MzAsNyBAQAogCXsgVVNCX0RFVklDRSgweDczOTIsIDB4NzcxMSkgfSwKIAl7IFVTQl9ERVZJQ0UoMHg3MzkyLCAweDc3MTcpIH0sCiAJeyBVU0JfREVWSUNFKDB4NzM5MiwgMHg3NzE4KSB9LAorCXsgVVNCX0RFVklDRSgweDczOTIsIDB4NzcyMikgfSwKIAkvKiBFbmNvcmUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgyMDNkLCAweDE0ODApIH0sCiAJeyBVU0JfREVWSUNFKDB4MjAzZCwgMHgxNGE5KSB9LApAQCAtOTc2LDYgKzk2NCw4IEBACiAJeyBVU0JfREVWSUNFKDB4MTNiMSwgMHgwMDMxKSB9LAogCXsgVVNCX0RFVklDRSgweDE3MzcsIDB4MDA3MCkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgxNzM3LCAweDAwNzEpIH0sCisJeyBVU0JfREVWSUNFKDB4MTczNywgMHgwMDc3KSB9LAorCXsgVVNCX0RFVklDRSgweDE3MzcsIDB4MDA3OCkgfSwKIAkvKiBMb2dpdGVjICovCiAJeyBVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTYyKSB9LAogCXsgVVNCX0RFVklDRSgweDA3ODksIDB4MDE2MykgfSwKQEAgLTk5OSw5ICs5ODksMTMgQEAKIAl7IFVTQl9ERVZJQ0UoMHgwZGIwLCAweDg3MWIpIH0sCiAJeyBVU0JfREVWSUNFKDB4MGRiMCwgMHg4NzFjKSB9LAogCXsgVVNCX0RFVklDRSgweDBkYjAsIDB4ODk5YSkgfSwKKwkvKiBPdmlzbGluayAqLworCXsgVVNCX0RFVklDRSgweDFiNzUsIDB4MzA3MSkgfSwKKwl7IFVTQl9ERVZJQ0UoMHgxYjc1LCAweDMwNzIpIH0sCiAJLyogUGFyYSAqLwogCXsgVVNCX0RFVklDRSgweDIwYjgsIDB4ODg4OCkgfSwKIAkvKiBQZWdhdHJvbiAqLworCXsgVVNCX0RFVklDRSgweDFkNGQsIDB4MDAwMikgfSwKIAl7IFVTQl9ERVZJQ0UoMHgxZDRkLCAweDAwMGMpIH0sCiAJeyBVU0JfREVWSUNFKDB4MWQ0ZCwgMHgwMDBlKSB9LAogCXsgVVNCX0RFVklDRSgweDFkNGQsIDB4MDAxMSkgfSwKQEAgLTEwNTQsNyArMTA0OCw5IEBACiAJLyogU3BhcmtsYW4gKi8KIAl7IFVTQl9ERVZJQ0UoMHgxNWE5LCAweDAwMDYpIH0sCiAJLyogU3dlZXggKi8KKwl7IFVTQl9ERVZJQ0UoMHgxNzdmLCAweDAxNTMpIH0sCiAJeyBVU0JfREVWSUNFKDB4MTc3ZiwgMHgwMzAyKSB9LAorCXsgVVNCX0RFVklDRSgweDE3N2YsIDB4MDMxMykgfSwKIAkvKiBVLU1lZGlhICovCiAJeyBVU0JfREVWSUNFKDB4MTU3ZSwgMHgzMDBlKSB9LAogCXsgVVNCX0RFVklDRSgweDE1N2UsIDB4MzAxMykgfSwKQEAgLTExMzgsMjcgKzExMzQsMjQgQEAKIAl7IFVTQl9ERVZJQ0UoMHgxM2QzLCAweDMzMjIpIH0sCiAJLyogQmVsa2luICovCiAJeyBVU0JfREVWSUNFKDB4MDUwZCwgMHgxMDAzKSB9LAotCXsgVVNCX0RFVklDRSgweDA1MGQsIDB4ODI1YSkgfSwKIAkvKiBCdWZmYWxvICovCiAJeyBVU0JfREVWSUNFKDB4MDQxMSwgMHgwMTJlKSB9LAogCXsgVVNCX0RFVklDRSgweDA0MTEsIDB4MDE0OCkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwNDExLCAweDAxNTApIH0sCi0JeyBVU0JfREVWSUNFKDB4MDQxMSwgMHgwMTVkKSB9LAogCS8qIENvcmVnYSAqLwogCXsgVVNCX0RFVklDRSgweDA3YWEsIDB4MDA0MSkgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwN2FhLCAweDAwNDIpIH0sCiAJeyBVU0JfREVWSUNFKDB4MThjNSwgMHgwMDA4KSB9LAogCS8qIEQtTGluayAqLwogCXsgVVNCX0RFVklDRSgweDA3ZDEsIDB4M2MwYikgfSwKLQl7IFVTQl9ERVZJQ0UoMHgwN2QxLCAweDNjMTMpIH0sCi0JeyBVU0JfREVWSUNFKDB4MDdkMSwgMHgzYzE1KSB9LAogCXsgVVNCX0RFVklDRSgweDA3ZDEsIDB4M2MxNykgfSwKIAl7IFVTQl9ERVZJQ0UoMHgyMDAxLCAweDNjMTcpIH0sCiAJLyogRWRpbWF4ICovCiAJeyBVU0JfREVWSUNFKDB4NzM5MiwgMHg0MDg1KSB9LAotCXsgVVNCX0RFVklDRSgweDczOTIsIDB4NzcyMikgfSwKIAkvKiBFbmNvcmUgKi8KIAl7IFVTQl9ERVZJQ0UoMHgyMDNkLCAweDE0YTEpIH0sCisJLyogRnVqaXRzdSBTdHlsaXN0aWMgNTUwICovCisJeyBVU0JfREVWSUNFKDB4MTY5MCwgMHgwNzYxKSB9LAogCS8qIEdlbXRlayAqLwogCXsgVVNCX0RFVklDRSgweDE1YTksIDB4MDAxMCkgfSwKIAkvKiBHaWdhYnl0ZSAqLwpAQCAtMTE3MCwyMCArMTE2MywxMyBAQAogCS8qIExldmVsT25lICovCiAJeyBVU0JfREVWSUNFKDB4MTc0MCwgMHgwNjA1KSB9LAogCXsgVVNCX0RFVklDRSgweDE3NDAsIDB4MDYxNSkgfSwKLQkvKiBMaW5rc3lzICovCi0JeyBVU0JfREVWSUNFKDB4MTczNywgMHgwMDc3KSB9LAotCXsgVVNCX0RFVklDRSgweDE3MzcsIDB4MDA3OCkgfSwKIAkvKiBMb2dpdGVjICovCiAJeyBVU0JfREVWSUNFKDB4MDc4OSwgMHgwMTY4KSB9LAogCXsgVVNCX0RFVklDRSgweDA3ODksIDB4MDE2OSkgfSwKIAkvKiBNb3Rvcm9sYSAqLwogCXsgVVNCX0RFVklDRSgweDEwMGQsIDB4OTAzMikgfSwKLQkvKiBPdmlzbGluayAqLwotCXsgVVNCX0RFVklDRSgweDFiNzUsIDB4MzA3MSkgfSwKLQl7IFVTQl9ERVZJQ0UoMHgxYjc1LCAweDMwNzIpIH0sCiAJLyogUGVnYXRyb24gKi8KIAl7IFVTQl9ERVZJQ0UoMHgwNWE2LCAweDAxMDEpIH0sCi0JeyBVU0JfREVWSUNFKDB4MWQ0ZCwgMHgwMDAyKSB9LAogCXsgVVNCX0RFVklDRSgweDFkNGQsIDB4MDAxMCkgfSwKIAkvKiBQbGFuZXggKi8KIAl7IFVTQl9ERVZJQ0UoMHgyMDE5LCAweDUyMDEpIH0sCkBAIC0xMjAyLDkgKzExODgsNiBAQAogCXsgVVNCX0RFVklDRSgweDA4M2EsIDB4YzUyMikgfSwKIAl7IFVTQl9ERVZJQ0UoMHgwODNhLCAweGQ1MjIpIH0sCiAJeyBVU0JfREVWSUNFKDB4MDgzYSwgMHhmNTExKSB9LAotCS8qIFN3ZWV4ICovCi0JeyBVU0JfREVWSUNFKDB4MTc3ZiwgMHgwMTUzKSB9LAotCXsgVVNCX0RFVklDRSgweDE3N2YsIDB4MDMxMykgfSwKIAkvKiBaeXhlbCAqLwogCXsgVVNCX0RFVklDRSgweDA1ODYsIDB4MzQxYSkgfSwKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMC5oCmluZGV4IDk5ZmYxMmQuLmIwM2IyMmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDAuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwLmgKQEAgLTE4OSw5ICsxODksOSBAQAogI2RlZmluZSBSVDMwOTAJCTB4MzA5MAkvKiAyLjRHSHogUENJZSAqLwogI2RlZmluZSBSVDMzOTAJCTB4MzM5MAogI2RlZmluZSBSVDM1NzIJCTB4MzU3MgotI2RlZmluZSBSVDM1OTMJCTB4MzU5MwkvKiBQQ0llICovCisjZGVmaW5lIFJUMzU5MwkJMHgzNTkzCiAjZGVmaW5lIFJUMzg4MwkJMHgzODgzCS8qIFdTT0MgKi8KLSNkZWZpbmUgUlQ1MzkwICAgICAgICAgMHg1MzkwICAvKiAyLjRHSHogKi8KKyNkZWZpbmUgUlQ1MzkwCQkweDUzOTAgIC8qIDIuNEdIeiAqLwogCiAJdTE2IHJmOwogCXUxNiByZXY7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwZGV2LmMKaW5kZXggZWRkMzE3Zi4uYzNlMWFhNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMGRldi5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBkZXYuYwpAQCAtODMxLDExICs4MzEsMTEgQEAKIAlpZiAoc3BlYy0+c3VwcG9ydGVkX3JhdGVzICYgU1VQUE9SVF9SQVRFX09GRE0pCiAJCW51bV9yYXRlcyArPSA4OwogCi0JY2hhbm5lbHMgPSBremFsbG9jKHNpemVvZigqY2hhbm5lbHMpICogc3BlYy0+bnVtX2NoYW5uZWxzLCBHRlBfS0VSTkVMKTsKKwljaGFubmVscyA9IGtjYWxsb2Moc3BlYy0+bnVtX2NoYW5uZWxzLCBzaXplb2YoKmNoYW5uZWxzKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjaGFubmVscykKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlyYXRlcyA9IGt6YWxsb2Moc2l6ZW9mKCpyYXRlcykgKiBudW1fcmF0ZXMsIEdGUF9LRVJORUwpOworCXJhdGVzID0ga2NhbGxvYyhudW1fcmF0ZXMsIHNpemVvZigqcmF0ZXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXJhdGVzKQogCQlnb3RvIGV4aXRfZnJlZV9jaGFubmVsczsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMG1hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMG1hYy5jCmluZGV4IGJmMGFjZmYuLmVkZTNjNTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDBtYWMuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwbWFjLmMKQEAgLTE2MCw3ICsxNjAsNyBAQAogIGV4aXRfZmFpbDoKIAlydDJ4MDBxdWV1ZV9wYXVzZV9xdWV1ZShxdWV1ZSk7CiAgZXhpdF9mcmVlX3NrYjoKLQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworCWllZWU4MDIxMV9mcmVlX3R4c2tiKGh3LCBza2IpOwogfQogRVhQT1JUX1NZTUJPTF9HUEwocnQyeDAwbWFjX3R4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0MngwMHVzYi5jCmluZGV4IDFlMzEwNTAuLjJlZWEzODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDJ4MDB1c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQyeDAwdXNiLmMKQEAgLTI5OCwxMiArMjk4LDIyIEBACiAJCXJldHVybiBmYWxzZTsKIAogCS8qCi0JICogVVNCIGRldmljZXMgY2Fubm90IGJsaW5kbHkgcGFzcyB0aGUgc2tiLT5sZW4gYXMgdGhlCi0JICogbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIHVzYl9maWxsX2J1bGtfdXJiLiBQYXNzIHRoZSBza2IKLQkgKiB0byB0aGUgZHJpdmVyIHRvIGRldGVybWluZSB3aGF0IHRoZSBsZW5ndGggc2hvdWxkIGJlLgorCSAqIFVTQiBkZXZpY2VzIHJlcXVpcmUgY2VydGFpbiBwYWRkaW5nIGF0IHRoZSBlbmQgb2YgZWFjaCBmcmFtZQorCSAqIGFuZCB1cmIuIFRob3NlIHBhZGRpbmdzIGFyZSBub3QgaW5jbHVkZWQgaW4gc2ticy4gUGFzcyBlbnRyeQorCSAqIHRvIHRoZSBkcml2ZXIgdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIG92ZXJhbGwgbGVuZ3RoIHNob3VsZCBiZS4KIAkgKi8KIAlsZW5ndGggPSBydDJ4MDBkZXYtPm9wcy0+bGliLT5nZXRfdHhfZGF0YV9sZW4oZW50cnkpOwogCisJc3RhdHVzID0gc2tiX3BhZHRvKGVudHJ5LT5za2IsIGxlbmd0aCk7CisJaWYgKHVubGlrZWx5KHN0YXR1cykpIHsKKwkJLyogVE9ETzogcmVwb3J0IHNvbWV0aGluZyBtb3JlIGFwcHJvcHJpYXRlIHRoYW4gSU9fRkFJTEVELiAqLworCQlXQVJOSU5HKHJ0MngwMGRldiwgIlRYIFNLQiBwYWRkaW5nIGVycm9yLCBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJc2V0X2JpdChFTlRSWV9EQVRBX0lPX0ZBSUxFRCwgJmVudHJ5LT5mbGFncyk7CisJCXJ0MngwMGxpYl9kbWFkb25lKGVudHJ5KTsKKworCQlyZXR1cm4gZmFsc2U7CisJfQorCiAJdXNiX2ZpbGxfYnVsa191cmIoZW50cnlfcHJpdi0+dXJiLCB1c2JfZGV2LAogCQkJICB1c2Jfc25kYnVsa3BpcGUodXNiX2RldiwgZW50cnktPnF1ZXVlLT51c2JfZW5kcG9pbnQpLAogCQkJICBlbnRyeS0+c2tiLT5kYXRhLCBsZW5ndGgsCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NjFwY2kuYwppbmRleCBiZjU1YjRhLi5lMGM2ZDExIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ2MXBjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDYxcGNpLmMKQEAgLTQxLDcgKzQxLDcgQEAKIC8qCiAgKiBBbGxvdyBoYXJkd2FyZSBlbmNyeXB0aW9uIHRvIGJlIGRpc2FibGVkLgogICovCi1zdGF0aWMgaW50IG1vZHBhcmFtX25vaHdjcnlwdCA9IDA7CitzdGF0aWMgYm9vbCBtb2RwYXJhbV9ub2h3Y3J5cHQgPSBmYWxzZTsKIG1vZHVsZV9wYXJhbV9uYW1lZChub2h3Y3J5cHQsIG1vZHBhcmFtX25vaHdjcnlwdCwgYm9vbCwgU19JUlVHTyk7CiBNT0RVTEVfUEFSTV9ERVNDKG5vaHdjcnlwdCwgIkRpc2FibGUgaGFyZHdhcmUgZW5jcnlwdGlvbi4iKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0MngwMC9ydDczdXNiLmMKaW5kZXggY2ZiMTlkYi4uMWM2OWM3MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnQyeDAwL3J0NzN1c2IuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydDJ4MDAvcnQ3M3VzYi5jCkBAIC00MCw3ICs0MCw3IEBACiAvKgogICogQWxsb3cgaGFyZHdhcmUgZW5jcnlwdGlvbiB0byBiZSBkaXNhYmxlZC4KICAqLwotc3RhdGljIGludCBtb2RwYXJhbV9ub2h3Y3J5cHQ7CitzdGF0aWMgYm9vbCBtb2RwYXJhbV9ub2h3Y3J5cHQ7CiBtb2R1bGVfcGFyYW1fbmFtZWQobm9od2NyeXB0LCBtb2RwYXJhbV9ub2h3Y3J5cHQsIGJvb2wsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhub2h3Y3J5cHQsICJEaXNhYmxlIGhhcmR3YXJlIGVuY3J5cHRpb24uIik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvYmFzZS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9iYXNlLmMKaW5kZXggYjRjZTkzNC4uOGQ2ZWIwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9iYXNlLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9iYXNlLmMKQEAgLTM0NSw5ICszNDUsOSBAQAogCWlmIChpc192YWxpZF9ldGhlcl9hZGRyKHJ0bGVmdXNlLT5kZXZfYWRkcikpIHsKIAkJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaHcsIHJ0bGVmdXNlLT5kZXZfYWRkcik7CiAJfSBlbHNlIHsKLQkJdTggcnRsbWFjW10gPSB7IDB4MDAsIDB4ZTAsIDB4NGMsIDB4ODEsIDB4OTIsIDB4MDAgfTsKLQkJZ2V0X3JhbmRvbV9ieXRlcygocnRsbWFjICsgKEVUSF9BTEVOIC0gMSkpLCAxKTsKLQkJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaHcsIHJ0bG1hYyk7CisJCXU4IHJ0bG1hYzFbXSA9IHsgMHgwMCwgMHhlMCwgMHg0YywgMHg4MSwgMHg5MiwgMHgwMCB9OworCQlnZXRfcmFuZG9tX2J5dGVzKChydGxtYWMxICsgKEVUSF9BTEVOIC0gMSkpLCAxKTsKKwkJU0VUX0lFRUU4MDIxMV9QRVJNX0FERFIoaHcsIHJ0bG1hYzEpOwogCX0KIAogfQpAQCAtMzk2LDcgKzM5Niw3IEBACiAJdTggdmFsaWQgPSAwOwogCiAJLypzZXQgaW5pdCBzdGF0ZSB0byBvbiAqLwotCXJ0bHByaXYtPnJma2lsbC5yZmtpbGxfc3RhdGUgPSAxOworCXJ0bHByaXYtPnJma2lsbC5yZmtpbGxfc3RhdGUgPSB0cnVlOwogCXdpcGh5X3Jma2lsbF9zZXRfaHdfc3RhdGUoaHctPndpcGh5LCAwKTsKIAogCXJhZGlvX3N0YXRlID0gcnRscHJpdi0+Y2ZnLT5vcHMtPnJhZGlvX29ub2ZmX2NoZWNraW5nKGh3LCAmdmFsaWQpOwpAQCAtNDQ4LDEyICs0NDgsMTIgQEAKIAogCS8qIDw0PiBsb2NrcyAqLwogCW11dGV4X2luaXQoJnJ0bHByaXYtPmxvY2tzLmNvbmZfbXV0ZXgpOworCW11dGV4X2luaXQoJnJ0bHByaXYtPmxvY2tzLnBzX211dGV4KTsKIAlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MuaXBzX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnJ0bHByaXYtPmxvY2tzLmgyY19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmcnRscHJpdi0+bG9ja3MucmZfcHNfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnJ0bHByaXYtPmxvY2tzLnJmX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJnJ0bHByaXYtPmxvY2tzLndhaXRxX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZydGxwcml2LT5sb2Nrcy5jY2tfYW5kX3J3X3BhZ2VhX2xvY2spOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL2Jhc2UuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvYmFzZS5oCmluZGV4IDRhZTkwNTkuLmY2NmI1NzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvYmFzZS5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvYmFzZS5oCkBAIC03Niw3ICs3Niw3IEBACiAJU0VUX0JJVFNfVE9fTEVfMkJZVEUoX2hkciwgOCwgMSwgX3ZhbCkKIAogI2RlZmluZSBTRVRfODAyMTFfUFNfUE9MTF9BSUQoX2hkciwgX3ZhbCkJCVwKLQkoKih1MTYgKikoKHU4ICopKF9oZHIpICsgMikgPSBsZTE2X3RvX2NwdShfdmFsKSkKKwkoKih1MTYgKikoKHU4ICopKF9oZHIpICsgMikgPSBfdmFsKQogI2RlZmluZSBTRVRfODAyMTFfUFNfUE9MTF9CU1NJRChfaGRyLCBfdmFsKQkJXAogCW1lbWNweSgoKHU4ICopKF9oZHIpKSArIDQsICh1OCAqKShfdmFsKSwgRVRIX0FMRU4pCiAjZGVmaW5lIFNFVF84MDIxMV9QU19QT0xMX1RBKF9oZHIsIF92YWwpCQlcCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wY2kuYwppbmRleCBlYjYxMDYxLi4zOWUwOTA3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BjaS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcGNpLmMKQEAgLTc4LDcgKzc4LDcgQEAKIAl1OCBpbml0X2FzcG07CiAKIAlwcHNjLT5yZWdfcmZwc19sZXZlbCA9IDA7Ci0JcHBzYy0+c3VwcG9ydF9hc3BtID0gMDsKKwlwcHNjLT5zdXBwb3J0X2FzcG0gPSBmYWxzZTsKIAogCS8qVXBkYXRlIFBDSSBBU1BNIHNldHRpbmcgKi8KIAlwcHNjLT5jb25zdF9hbWRwY2lfYXNwbSA9IHJ0bHBjaS0+Y29uc3RfYW1kcGNpX2FzcG07CkBAIC01NzAsOSArNTcwLDkgQEAKIAkJaWYgKGllZWU4MDIxMV9pc19udWxsZnVuYyhmYykpIHsKIAkJCWlmIChpZWVlODAyMTFfaGFzX3BtKGZjKSkgewogCQkJCXJ0bHByaXYtPm1hYzgwMjExLm9mZmNoYW5fZGVsYXkgPSB0cnVlOwotCQkJCXJ0bHByaXYtPnBzYy5zdGF0ZV9pbmFwID0gMTsKKwkJCQlydGxwcml2LT5wc2Muc3RhdGVfaW5hcCA9IHRydWU7CiAJCQl9IGVsc2UgewotCQkJCXJ0bHByaXYtPnBzYy5zdGF0ZV9pbmFwID0gMDsKKwkJCQlydGxwcml2LT5wc2Muc3RhdGVfaW5hcCA9IGZhbHNlOwogCQkJfQogCQl9CiAKQEAgLTYxMCw3ICs2MTAsNyBAQAogCWlmICgoKHJ0bHByaXYtPmxpbmtfaW5mby5udW1fcnhfaW5wZXJpb2QgKwogCQlydGxwcml2LT5saW5rX2luZm8ubnVtX3R4X2lucGVyaW9kKSA+IDgpIHx8CiAJCShydGxwcml2LT5saW5rX2luZm8ubnVtX3J4X2lucGVyaW9kID4gMikpIHsKLQkJdGFza2xldF9zY2hlZHVsZSgmcnRscHJpdi0+d29ya3MuaXBzX2xlYXZlX3Rhc2tsZXQpOworCQlzY2hlZHVsZV93b3JrKCZydGxwcml2LT53b3Jrcy5scHNfbGVhdmVfd29yayk7CiAJfQogfQogCkBAIC03MzYsNyArNzM2LDcgQEAKIAkJaWYgKCgocnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCArCiAJCQlydGxwcml2LT5saW5rX2luZm8ubnVtX3R4X2lucGVyaW9kKSA+IDgpIHx8CiAJCQkocnRscHJpdi0+bGlua19pbmZvLm51bV9yeF9pbnBlcmlvZCA+IDIpKSB7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZydGxwcml2LT53b3Jrcy5pcHNfbGVhdmVfdGFza2xldCk7CisJCQlzY2hlZHVsZV93b3JrKCZydGxwcml2LT53b3Jrcy5scHNfbGVhdmVfd29yayk7CiAJCX0KIAogCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOwpAQCAtNzgwLDYgKzc4MCw3IEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgaW50YSA9IDA7CiAJdTMyIGludGIgPSAwOworCWlycXJldHVybl90IHJldCA9IElSUV9IQU5ETEVEOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLmlycV90aF9sb2NrLCBmbGFncyk7CiAKQEAgLTc4Nyw4ICs3ODgsMTAgQEAKIAlydGxwcml2LT5jZmctPm9wcy0+aW50ZXJydXB0X3JlY29nbml6ZWQoaHcsICZpbnRhLCAmaW50Yik7CiAKIAkvKlNoYXJlZCBJUlEgb3IgSFcgZGlzYXBwYXJlZCAqLwotCWlmICghaW50YSB8fCBpbnRhID09IDB4ZmZmZikKKwlpZiAoIWludGEgfHwgaW50YSA9PSAweGZmZmYpIHsKKwkJcmV0ID0gSVJRX05PTkU7CiAJCWdvdG8gZG9uZTsKKwl9CiAKIAkvKjwxPiBiZWFjb24gcmVsYXRlZCAqLwogCWlmIChpbnRhICYgcnRscHJpdi0+Y2ZnLT5tYXBzW1JUTF9JTVJfVEJET0tdKSB7CkBAIC04OTAsMTIgKzg5Myw5IEBACiAJaWYgKHJ0bHByaXYtPnJ0bGhhbC5lYXJseW1vZGVfZW5hYmxlKQogCQl0YXNrbGV0X3NjaGVkdWxlKCZydGxwcml2LT53b3Jrcy5pcnFfdGFza2xldCk7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfSEFORExFRDsKLQogZG9uZToKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZydGxwcml2LT5sb2Nrcy5pcnFfdGhfbG9jaywgZmxhZ3MpOwotCXJldHVybiBJUlFfSEFORExFRDsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfcnRsX3BjaV9pcnFfdGFza2xldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKQEAgLTkwMywxMSArOTAzLDYgQEAKIAlfcnRsX3BjaV90eF9jaGtfd2FpdHEoaHcpOwogfQogCi1zdGF0aWMgdm9pZCBfcnRsX3BjaV9pcHNfbGVhdmVfdGFza2xldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKLXsKLQlydGxfbHBzX2xlYXZlKGh3KTsKLX0KLQogc3RhdGljIHZvaWQgX3J0bF9wY2lfcHJlcGFyZV9iY25fdGFza2xldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYgPSBydGxfcHJpdihodyk7CkBAIC05NDUsNiArOTQwLDE1IEBACiAJcmV0dXJuOwogfQogCitzdGF0aWMgdm9pZCBydGxfbHBzX2xlYXZlX3dvcmtfY2FsbGJhY2soc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBydGxfd29ya3MgKnJ0bHdvcmtzID0KKwkgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBydGxfd29ya3MsIGxwc19sZWF2ZV93b3JrKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9IHJ0bHdvcmtzLT5odzsKKworCXJ0bF9scHNfbGVhdmUoaHcpOworfQorCiBzdGF0aWMgdm9pZCBfcnRsX3BjaV9pbml0X3RyeF92YXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJc3RydWN0IHJ0bF9wY2kgKnJ0bHBjaSA9IHJ0bF9wY2lkZXYocnRsX3BjaXByaXYoaHcpKTsKQEAgLTEwMDYsOSArMTAxMCw3IEBACiAJdGFza2xldF9pbml0KCZydGxwcml2LT53b3Jrcy5pcnFfcHJlcGFyZV9iY25fdGFza2xldCwKIAkJICAgICAodm9pZCAoKikodW5zaWduZWQgbG9uZykpX3J0bF9wY2lfcHJlcGFyZV9iY25fdGFza2xldCwKIAkJICAgICAodW5zaWduZWQgbG9uZylodyk7Ci0JdGFza2xldF9pbml0KCZydGxwcml2LT53b3Jrcy5pcHNfbGVhdmVfdGFza2xldCwKLQkJICAgICAodm9pZCAoKikodW5zaWduZWQgbG9uZykpX3J0bF9wY2lfaXBzX2xlYXZlX3Rhc2tsZXQsCi0JCSAgICAgKHVuc2lnbmVkIGxvbmcpaHcpOworCUlOSVRfV09SSygmcnRscHJpdi0+d29ya3MubHBzX2xlYXZlX3dvcmssIHJ0bF9scHNfbGVhdmVfd29ya19jYWxsYmFjayk7CiB9CiAKIHN0YXRpYyBpbnQgX3J0bF9wY2lfaW5pdF90eF9yaW5nKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LApAQCAtMTQ3OCw3ICsxNDgwLDcgQEAKIAogCXN5bmNocm9uaXplX2lycShydGxwY2ktPnBkZXYtPmlycSk7CiAJdGFza2xldF9raWxsKCZydGxwcml2LT53b3Jrcy5pcnFfdGFza2xldCk7Ci0JdGFza2xldF9raWxsKCZydGxwcml2LT53b3Jrcy5pcHNfbGVhdmVfdGFza2xldCk7CisJY2FuY2VsX3dvcmtfc3luYygmcnRscHJpdi0+d29ya3MubHBzX2xlYXZlX3dvcmspOwogCiAJZmx1c2hfd29ya3F1ZXVlKHJ0bHByaXYtPndvcmtzLnJ0bF93cSk7CiAJZGVzdHJveV93b3JrcXVldWUocnRscHJpdi0+d29ya3MucnRsX3dxKTsKQEAgLTE1NTMsNyArMTU1NSw3IEBACiAJc2V0X2hhbF9zdG9wKHJ0bGhhbCk7CiAKIAlydGxwcml2LT5jZmctPm9wcy0+ZGlzYWJsZV9pbnRlcnJ1cHQoaHcpOwotCXRhc2tsZXRfa2lsbCgmcnRscHJpdi0+d29ya3MuaXBzX2xlYXZlX3Rhc2tsZXQpOworCWNhbmNlbF93b3JrX3N5bmMoJnJ0bHByaXYtPndvcmtzLmxwc19sZWF2ZV93b3JrKTsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZydGxwcml2LT5sb2Nrcy5yZl9wc19sb2NrLCBmbGFncyk7CiAJd2hpbGUgKHBwc2MtPnJmY2hhbmdlX2lucHJvZ3Jlc3MpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcHMuYwppbmRleCBkYjUyNjI4Li4xMzBmZGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3BzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9wcy5jCkBAIC0yMzcsMTEgKzIzNywxMiBAQAogCXN0cnVjdCBydGxfbWFjICptYWMgPSBydGxfbWFjKHJ0bF9wcml2KGh3KSk7CiAJc3RydWN0IHJ0bF9wc19jdGwgKnBwc2MgPSBydGxfcHNjKHJ0bF9wcml2KGh3KSk7CiAJZW51bSByZl9wd3JzdGF0ZSBydHN0YXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAobWFjLT5vcG1vZGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikKIAkJcmV0dXJuOwogCi0Jc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5pcHNfbG9jayk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnJ0bHByaXYtPmxvY2tzLmlwc19sb2NrLCBmbGFncyk7CiAKIAlpZiAocHBzYy0+aW5hY3RpdmVwcykgewogCQlydHN0YXRlID0gcHBzYy0+cmZwd3Jfc3RhdGU7CkBAIC0yNTcsNyArMjU4LDcgQEAKIAkJfQogCX0KIAotCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5pcHNfbG9jayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnRscHJpdi0+bG9ja3MuaXBzX2xvY2ssIGZsYWdzKTsKIH0KIAogLypmb3IgRlcgTFBTKi8KQEAgLTM5NSw3ICszOTYsNyBAQAogCWlmIChtYWMtPmxpbmtfc3RhdGUgIT0gTUFDODAyMTFfTElOS0VEKQogCQlyZXR1cm47CiAKLQlzcGluX2xvY2soJnJ0bHByaXYtPmxvY2tzLmxwc19sb2NrKTsKKwltdXRleF9sb2NrKCZydGxwcml2LT5sb2Nrcy5wc19tdXRleCk7CiAKIAkvKiBJZGxlIGZvciBhIHdoaWxlIGlmIHdlIGNvbm5lY3QgdG8gQVAgYSB3aGlsZSBhZ28uICovCiAJaWYgKG1hYy0+Y250X2FmdGVyX2xpbmtlZCA+PSAyKSB7CkBAIC00MDcsNyArNDA4LDcgQEAKIAkJfQogCX0KIAotCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5wc19tdXRleCk7CiB9CiAKIC8qTGVhdmUgdGhlIGxlaXN1cmUgcG93ZXIgc2F2ZSBtb2RlLiovCkBAIC00MTcsNyArNDE4LDcgQEAKIAlzdHJ1Y3QgcnRsX3BzX2N0bCAqcHBzYyA9IHJ0bF9wc2MocnRsX3ByaXYoaHcpKTsKIAlzdHJ1Y3QgcnRsX2hhbCAqcnRsaGFsID0gcnRsX2hhbChydGxfcHJpdihodykpOwogCi0Jc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CisJbXV0ZXhfbG9jaygmcnRscHJpdi0+bG9ja3MucHNfbXV0ZXgpOwogCiAJaWYgKHBwc2MtPmZ3Y3RybF9scHMpIHsKIAkJaWYgKHBwc2MtPmRvdDExX3BzbW9kZSAhPSBFQUNUSVZFKSB7CkBAIC00MzgsNyArNDM5LDcgQEAKIAkJCXJ0bF9scHNfc2V0X3BzbW9kZShodywgRUFDVElWRSk7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJnJ0bHByaXYtPmxvY2tzLmxwc19sb2NrKTsKKwltdXRleF91bmxvY2soJnJ0bHByaXYtPmxvY2tzLnBzX211dGV4KTsKIH0KIAogLyogRm9yIHN3IExQUyovCkBAIC01MzksOSArNTQwLDkgQEAKIAkJUlRfQ0xFQVJfUFNfTEVWRUwocHBzYywgUlRfUFNfTEVWRUxfQVNQTSk7CiAJfQogCi0Jc3Bpbl9sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CisJbXV0ZXhfbG9jaygmcnRscHJpdi0+bG9ja3MucHNfbXV0ZXgpOwogCXJ0bF9wc19zZXRfcmZfc3RhdGUoaHcsIEVSRk9OLCBSRl9DSEFOR0VfQllfUFMpOwotCXNwaW5fdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5scHNfbG9jayk7CisJbXV0ZXhfdW5sb2NrKCZydGxwcml2LT5sb2Nrcy5wc19tdXRleCk7CiB9CiAKIHZvaWQgcnRsX3N3bHBzX3Jmb25fd3FfY2FsbGJhY2sodm9pZCAqZGF0YSkKQEAgLTU3NCw5ICs1NzUsOSBAQAogCWlmIChydGxwcml2LT5saW5rX2luZm8uYnVzeXRyYWZmaWMpCiAJCXJldHVybjsKIAotCXNwaW5fbG9jaygmcnRscHJpdi0+bG9ja3MubHBzX2xvY2spOworCW11dGV4X2xvY2soJnJ0bHByaXYtPmxvY2tzLnBzX211dGV4KTsKIAlydGxfcHNfc2V0X3JmX3N0YXRlKGh3LCBFUkZTTEVFUCwgUkZfQ0hBTkdFX0JZX1BTKTsKLQlzcGluX3VubG9jaygmcnRscHJpdi0+bG9ja3MubHBzX2xvY2spOworCW11dGV4X3VubG9jaygmcnRscHJpdi0+bG9ja3MucHNfbXV0ZXgpOwogCiAJaWYgKHBwc2MtPnJlZ19yZnBzX2xldmVsICYgUlRfUkZfT0ZGX0xFVkxfQVNQTSAmJgogCQkhUlRfSU5fUFNfTEVWRUwocHBzYywgUlRfUFNfTEVWRUxfQVNQTSkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5jCmluZGV4IDk1MGM2NWEuLjkzMWQ5NzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uYwpAQCAtNzMsNiArNzMsMzQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHJ0bF9ibG9ja19md193cml0ZU4oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGNvbnN0IHU4ICpidWZmZXIsCisJCQkJdTMyIHNpemUpCit7CisJc3RydWN0IHJ0bF9wcml2ICpydGxwcml2ID0gcnRsX3ByaXYoaHcpOworCXUzMiBibG9ja1NpemUgPSBSRUFMVEVLX1VTQl9WRU5RVF9NQVhfQlVGX1NJWkUgLSAyMDsKKwl1OCAqYnVmZmVyUHRyID0gKHU4ICopIGJ1ZmZlcjsKKwl1MzIgaSwgb2Zmc2V0LCBibG9ja0NvdW50LCByZW1haW5TaXplOworCisJYmxvY2tDb3VudCA9IHNpemUgLyBibG9ja1NpemU7CisJcmVtYWluU2l6ZSA9IHNpemUgJSBibG9ja1NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgYmxvY2tDb3VudDsgaSsrKSB7CisJCW9mZnNldCA9IGkgKiBibG9ja1NpemU7CisJCXJ0bHByaXYtPmlvLndyaXRlTl9zeW5jKHJ0bHByaXYsCisJCQkJCShGV184MTkyQ19TVEFSVF9BRERSRVNTICsgb2Zmc2V0KSwKKwkJCQkJKHZvaWQgKikoYnVmZmVyUHRyICsgb2Zmc2V0KSwKKwkJCQkJYmxvY2tTaXplKTsKKwl9CisKKwlpZiAocmVtYWluU2l6ZSkgeworCQlvZmZzZXQgPSBibG9ja0NvdW50ICogYmxvY2tTaXplOworCQlydGxwcml2LT5pby53cml0ZU5fc3luYyhydGxwcml2LAorCQkJCQkoRldfODE5MkNfU1RBUlRfQUREUkVTUyArIG9mZnNldCksCisJCQkJCSh2b2lkICopKGJ1ZmZlclB0ciArIG9mZnNldCksCisJCQkJCXJlbWFpblNpemUpOworCX0KK30KKwogc3RhdGljIHZvaWQgX3J0bDkyY19md19ibG9ja193cml0ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkgICBjb25zdCB1OCAqYnVmZmVyLCB1MzIgc2l6ZSkKIHsKQEAgLTgxLDIzICsxMDksMzAgQEAKIAl1OCAqYnVmZmVyUHRyID0gKHU4ICopIGJ1ZmZlcjsKIAl1MzIgKnB1NEJ5dGVQdHIgPSAodTMyICopIGJ1ZmZlcjsKIAl1MzIgaSwgb2Zmc2V0LCBibG9ja0NvdW50LCByZW1haW5TaXplOworCXUzMiBkYXRhOwogCisJaWYgKHJ0bHByaXYtPmlvLndyaXRlTl9zeW5jKSB7CisJCXJ0bF9ibG9ja19md193cml0ZU4oaHcsIGJ1ZmZlciwgc2l6ZSk7CisJCXJldHVybjsKKwl9CiAJYmxvY2tDb3VudCA9IHNpemUgLyBibG9ja1NpemU7CiAJcmVtYWluU2l6ZSA9IHNpemUgJSBibG9ja1NpemU7CisJaWYgKHJlbWFpblNpemUpIHsKKwkJLyogdGhlIGxhc3Qgd29yZCBpcyA8IDQgYnl0ZXMgLSBwYWQgaXQgd2l0aCB6ZXJvcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgNCAtIHJlbWFpblNpemU7IGkrKykKKwkJCSooYnVmZmVyUHRyICsgc2l6ZSArIGkpID0gMDsKKwkJYmxvY2tDb3VudCsrOworCX0KIAogCWZvciAoaSA9IDA7IGkgPCBibG9ja0NvdW50OyBpKyspIHsKIAkJb2Zmc2V0ID0gaSAqIGJsb2NrU2l6ZTsKKwkJLyogZm9yIGJpZy1lbmRpYW4gcGxhdGZvcm1zLCB0aGUgZmlybXdhcmUgZGF0YSBuZWVkIHRvIGJlIGJ5dGUKKwkJICogc3dhcHBlZCBhcyBpdCB3YXMgcmVhZCBhcyBhIGJ5dGUgc3RyaW5nIGFuZCB3aWxsIGJlIHdyaXR0ZW4KKwkJICogYXMgMzItYml0IGR3b3JkcyBhbmQgYnl0ZSBzd2FwcGVkIHdoZW4gd3JpdHRlbgorCQkgKi8KKwkJZGF0YSA9IGxlMzJfdG9fY3B1KCooX19sZTMyICopKHB1NEJ5dGVQdHIgKyBpKSk7CiAJCXJ0bF93cml0ZV9kd29yZChydGxwcml2LCAoRldfODE5MkNfU1RBUlRfQUREUkVTUyArIG9mZnNldCksCi0JCQkJKihwdTRCeXRlUHRyICsgaSkpOwotCX0KLQotCWlmIChyZW1haW5TaXplKSB7Ci0JCW9mZnNldCA9IGJsb2NrQ291bnQgKiBibG9ja1NpemU7Ci0JCWJ1ZmZlclB0ciArPSBvZmZzZXQ7Ci0JCWZvciAoaSA9IDA7IGkgPCByZW1haW5TaXplOyBpKyspIHsKLQkJCXJ0bF93cml0ZV9ieXRlKHJ0bHByaXYsIChGV184MTkyQ19TVEFSVF9BRERSRVNTICsKLQkJCQkJCSBvZmZzZXQgKyBpKSwgKihidWZmZXJQdHIgKyBpKSk7Ci0JCX0KKwkJCQlkYXRhKTsKIAl9CiB9CiAKQEAgLTIyNywxMCArMjYyLDEwIEBACiAJdTMyIGZ3c2l6ZTsKIAllbnVtIHZlcnNpb25fODE5MmMgdmVyc2lvbiA9IHJ0bGhhbC0+dmVyc2lvbjsKIAotCXByX2luZm8oIkxvYWRpbmcgZmlybXdhcmUgZmlsZSAlc1xuIiwgcnRscHJpdi0+Y2ZnLT5md19uYW1lKTsKIAlpZiAoIXJ0bGhhbC0+cGZpcm13YXJlKQogCQlyZXR1cm4gMTsKIAorCXByX2luZm8oIkxvYWRpbmcgZmlybXdhcmUgZmlsZSAlc1xuIiwgcnRscHJpdi0+Y2ZnLT5md19uYW1lKTsKIAlwZndoZWFkZXIgPSAoc3RydWN0IHJ0bDkyY19maXJtd2FyZV9oZWFkZXIgKilydGxoYWwtPnBmaXJtd2FyZTsKIAlwZndkYXRhID0gKHU4ICopIHJ0bGhhbC0+cGZpcm13YXJlOwogCWZ3c2l6ZSA9IHJ0bGhhbC0+ZndzaXplOwpAQCAtMjM4LDggKzI3Myw5IEBACiAJaWYgKElTX0ZXX0hFQURFUl9FWElTVChwZndoZWFkZXIpKSB7CiAJCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfRlcsIERCR19ETUVTRywKIAkJCSAoIkZpcm13YXJlIFZlcnNpb24oJWQpLCBTaWduYXR1cmUoJSN4KSxTaXplKCVkKVxuIiwKLQkJCSAgcGZ3aGVhZGVyLT52ZXJzaW9uLCBwZndoZWFkZXItPnNpZ25hdHVyZSwKLQkJCSAgKHVpbnQpc2l6ZW9mKHN0cnVjdCBydGw5MmNfZmlybXdhcmVfaGVhZGVyKSkpOworCQkJIGxlMTZfdG9fY3B1KHBmd2hlYWRlci0+dmVyc2lvbiksCisJCQkgbGUxNl90b19jcHUocGZ3aGVhZGVyLT5zaWduYXR1cmUpLAorCQkJICh1aW50KXNpemVvZihzdHJ1Y3QgcnRsOTJjX2Zpcm13YXJlX2hlYWRlcikpKTsKIAogCQlwZndkYXRhID0gcGZ3ZGF0YSArIHNpemVvZihzdHJ1Y3QgcnRsOTJjX2Zpcm13YXJlX2hlYWRlcik7CiAJCWZ3c2l6ZSA9IGZ3c2l6ZSAtIHNpemVvZihzdHJ1Y3QgcnRsOTJjX2Zpcm13YXJlX2hlYWRlcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyYy9md19jb21tb24uaAppbmRleCAzZDU4MjNjLi5jZWM1YTNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjL2Z3X2NvbW1vbi5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmMvZndfY29tbW9uLmgKQEAgLTMyLDMyICszMiwzMiBAQAogCiAjZGVmaW5lIEZXXzgxOTJDX1NJWkUJCQkJMHgzMDAwCiAjZGVmaW5lIEZXXzgxOTJDX1NUQVJUX0FERFJFU1MJCQkweDEwMDAKLSNkZWZpbmUgRldfODE5MkNfRU5EX0FERFJFU1MJCQkweDNGRkYKKyNkZWZpbmUgRldfODE5MkNfRU5EX0FERFJFU1MJCQkweDFGRkYKICNkZWZpbmUgRldfODE5MkNfUEFHRV9TSVpFCQkJNDA5NgogI2RlZmluZSBGV184MTkyQ19QT0xMSU5HX0RFTEFZCQkJNQogI2RlZmluZSBGV184MTkyQ19QT0xMSU5HX1RJTUVPVVRfQ09VTlQJCTEwMAogCiAjZGVmaW5lIElTX0ZXX0hFQURFUl9FWElTVChfcGZ3aGRyKQlcCi0JKChfcGZ3aGRyLT5zaWduYXR1cmUmMHhGRkYwKSA9PSAweDkyQzAgfHxcCi0JKF9wZndoZHItPnNpZ25hdHVyZSYweEZGRjApID09IDB4ODhDMCkKKwkoKGxlMTZfdG9fY3B1KF9wZndoZHItPnNpZ25hdHVyZSkmMHhGRkYwKSA9PSAweDkyQzAgfHxcCisJKGxlMTZfdG9fY3B1KF9wZndoZHItPnNpZ25hdHVyZSkmMHhGRkYwKSA9PSAweDg4QzApCiAKIHN0cnVjdCBydGw5MmNfZmlybXdhcmVfaGVhZGVyIHsKLQl1MTYgc2lnbmF0dXJlOworCV9fbGUxNiBzaWduYXR1cmU7CiAJdTggY2F0ZWdvcnk7CiAJdTggZnVuY3Rpb247Ci0JdTE2IHZlcnNpb247CisJX19sZTE2IHZlcnNpb247CiAJdTggc3VidmVyc2lvbjsKIAl1OCByc3ZkMTsKIAl1OCBtb250aDsKIAl1OCBkYXRlOwogCXU4IGhvdXI7CiAJdTggbWludXRlOwotCXUxNiByYW1jb2RlU2l6ZTsKLQl1MTYgcnN2ZDI7Ci0JdTMyIHN2bmluZGV4OwotCXUzMiByc3ZkMzsKLQl1MzIgcnN2ZDQ7Ci0JdTMyIHJzdmQ1OworCV9fbGUxNiByYW1jb2RlU2l6ZTsKKwlfX2xlMTYgcnN2ZDI7CisJX19sZTMyIHN2bmluZGV4OworCV9fbGUzMiByc3ZkMzsKKwlfX2xlMzIgcnN2ZDQ7CisJX19sZTMyIHJzdmQ1OwogfTsKIAogZW51bSBydGw4MTkyY19oMmNfY21kIHsKQEAgLTk0LDUgKzk0LDYgQEAKIHZvaWQgcnRsOTJjX3NldF9md19wd3Jtb2RlX2NtZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggbW9kZSk7CiB2b2lkIHJ0bDkyY19zZXRfZndfcnN2ZHBhZ2Vwa3Qoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJvb2wgYl9kbF9maW5pc2hlZCk7CiB2b2lkIHJ0bDkyY19zZXRfZndfam9pbmJzc19yZXBvcnRfY21kKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1OCBtc3RhdHVzKTsKK3ZvaWQgdXNiX3dyaXRlTl9hc3luYyhzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB2b2lkICpkYXRhLCB1MTYgbGVuKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9waHkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3BoeS5jCmluZGV4IDU5MmExMGEuLjNiNTg1YWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3BoeS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3BoeS5jCkBAIC01NjksNyArNTY5LDcgQEAKIAkJfQogCWNhc2UgRVJGU0xFRVA6ewogCQkJaWYgKHBwc2MtPnJmcHdyX3N0YXRlID09IEVSRk9GRikKLQkJCQlicmVhazsKKwkJCQlyZXR1cm4gZmFsc2U7CiAJCQlmb3IgKHF1ZXVlX2lkID0gMCwgaSA9IDA7CiAJCQkgICAgIHF1ZXVlX2lkIDwgUlRMX1BDSV9NQVhfVFhfUVVFVUVfQ09VTlQ7KSB7CiAJCQkJcmluZyA9ICZwY2lwcml2LT5kZXYudHhfcmluZ1txdWV1ZV9pZF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY2Uvc3cuYwppbmRleCBmMmFhMzNkLi44OWVmNjk4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmNlL3N3LmMKQEAgLTk4LDkgKzk4LDkgQEAKIAogCXJ0bDgxOTJjZV9idF9yZWdfaW5pdChodyk7CiAKLQlydGxwcml2LT5kbS5kbV9pbml0aWFsZ2Fpbl9lbmFibGUgPSAxOworCXJ0bHByaXYtPmRtLmRtX2luaXRpYWxnYWluX2VuYWJsZSA9IHRydWU7CiAJcnRscHJpdi0+ZG0uZG1fZmxhZyA9IDA7Ci0JcnRscHJpdi0+ZG0uZGlzYWJsZV9mcmFtZWJ1cnN0aW5nID0gMDsKKwlydGxwcml2LT5kbS5kaXNhYmxlX2ZyYW1lYnVyc3RpbmcgPSBmYWxzZTsKIAlydGxwcml2LT5kbS50aGVybWFsdmFsdWUgPSAwOwogCXJ0bHBjaS0+dHJhbnNtaXRfY29uZmlnID0gQ0ZFTkRGT1JNIHwgQklUKDEyKSB8IEJJVCgxMyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9ody5jCmluZGV4IDgxNGMwNWQuLjEyNGNmNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L2h3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvaHcuYwpAQCAtNDk4LDcgKzQ5OCw3IEBACiAJfQogCVJUX1BSSU5UX0RBVEEocnRscHJpdiwgQ09NUF9JTklULCBEQkdfTE9VRCwgKCJNQVBcbiIpLAogCQkgICAgICBod2luZm8sIEhXU0VUX01BWF9TSVpFKTsKLQllZXByb21faWQgPSAqKCh1MTYgKikmaHdpbmZvWzBdKTsKKwllZXByb21faWQgPSBsZTE2X3RvX2NwdSgqKChfX2xlMTYgKikmaHdpbmZvWzBdKSk7CiAJaWYgKGVlcHJvbV9pZCAhPSBSVEw4MTkwX0VFUFJPTV9JRCkgewogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0VSUiwgREJHX0VNRVJHLAogCQkJICgiRUVQUk9NIElEKCUjeCkgaXMgaW52YWxpZCEhXG4iLCBlZXByb21faWQpKTsKQEAgLTUxNiwxMyArNTE2LDE0IEBACiAJcHJfaW5mbygiTUFDIGFkZHJlc3M6ICVwTVxuIiwgcnRsZWZ1c2UtPmRldl9hZGRyKTsKIAlfcnRsOTJjdV9yZWFkX3R4cG93ZXJfaW5mb19mcm9tX2h3cGcoaHcsCiAJCQkJCSAgIHJ0bGVmdXNlLT5hdXRvbG9hZF9mYWlsZmxhZywgaHdpbmZvKTsKLQlydGxlZnVzZS0+ZWVwcm9tX3ZpZCA9ICoodTE2ICopJmh3aW5mb1tFRVBST01fVklEXTsKLQlydGxlZnVzZS0+ZWVwcm9tX2RpZCA9ICoodTE2ICopJmh3aW5mb1tFRVBST01fRElEXTsKKwlydGxlZnVzZS0+ZWVwcm9tX3ZpZCA9IGxlMTZfdG9fY3B1KCooX19sZTE2ICopJmh3aW5mb1tFRVBST01fVklEXSk7CisJcnRsZWZ1c2UtPmVlcHJvbV9kaWQgPSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSZod2luZm9bRUVQUk9NX0RJRF0pOwogCVJUX1RSQUNFKHJ0bHByaXYsIENPTVBfSU5JVCwgREJHX0RNRVNHLAogCQkgKCIgVklEID0gMHglMDJ4IFBJRCA9IDB4JTAyeFxuIiwKIAkJIHJ0bGVmdXNlLT5lZXByb21fdmlkLCBydGxlZnVzZS0+ZWVwcm9tX2RpZCkpOwogCXJ0bGVmdXNlLT5lZXByb21fY2hhbm5lbHBsYW4gPSAqKHU4ICopJmh3aW5mb1tFRVBST01fQ0hBTk5FTFBMQU5dOwotCXJ0bGVmdXNlLT5lZXByb21fdmVyc2lvbiA9ICoodTE2ICopJmh3aW5mb1tFRVBST01fVkVSU0lPTl07CisJcnRsZWZ1c2UtPmVlcHJvbV92ZXJzaW9uID0KKwkJCSBsZTE2X3RvX2NwdSgqKF9fbGUxNiAqKSZod2luZm9bRUVQUk9NX1ZFUlNJT05dKTsKIAlydGxlZnVzZS0+dHhwd3JfZnJvbWVwcm9tID0gdHJ1ZTsKIAlydGxlZnVzZS0+ZWVwcm9tX29lbWlkID0gKih1OCAqKSZod2luZm9bRUVQUk9NX0NVU1RPTUVSX0lEXTsKIAlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19MT1VELApAQCAtMjQzNSw3ICsyNDM2LDcgQEAKIAkJCSAiJXhcbiIsIHBwc2MtPmh3cmFkaW9vZmYsIGVfcmZwb3dlcnN0YXRlX3Rvc2V0KSk7CiAJfQogCWlmIChhY3R1YWxseXNldCkgewotCQlwcHNjLT5od3JhZGlvb2ZmID0gMTsKKwkJcHBzYy0+aHdyYWRpb29mZiA9IHRydWU7CiAJCWlmIChlX3JmcG93ZXJzdGF0ZV90b3NldCA9PSBFUkZPTikgewogCQkJaWYgKChwcHNjLT5yZWdfcmZwc19sZXZlbCAgJiBSVF9SRl9PRkZfTEVWTF9BU1BNKSAmJgogCQkJICAgICBSVF9JTl9QU19MRVZFTChwcHNjLCBSVF9SRl9PRkZfTEVWTF9BU1BNKSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L21hYy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbWFjLmMKaW5kZXggMDYwYTA2Zi4uOWUwYzhmYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbWFjLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvbWFjLmMKQEAgLTg0LDYgKzg0LDcgQEAKIAkJfQogCX0KIAlydGxoYWwtPnZlcnNpb24gID0gKGVudW0gdmVyc2lvbl84MTkyYyljaGlwX3ZlcnNpb247CisJcHJfaW5mbygicnRsODE5MmN1OiBDaGlwIHZlcnNpb24gMHgleFxuIiwgY2hpcF92ZXJzaW9uKTsKIAlzd2l0Y2ggKHJ0bGhhbC0+dmVyc2lvbikgewogCWNhc2UgVkVSU0lPTl9OT1JNQUxfVFNNQ19DSElQXzkyQ18xVDJSOgogCQlSVF9UUkFDRShydGxwcml2LCBDT01QX0lOSVQsIERCR19UUkFDRSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMKaW5kZXggNzI4NTI5MC4uZTQ5Y2YyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvcGh5LmMKQEAgLTU0OCw3ICs1NDgsNyBAQAogCQlicmVhazsKIAljYXNlIEVSRlNMRUVQOgogCQlpZiAocHBzYy0+cmZwd3Jfc3RhdGUgPT0gRVJGT0ZGKQotCQkJYnJlYWs7CisJCQlyZXR1cm4gZmFsc2U7CiAJCWZvciAocXVldWVfaWQgPSAwLCBpID0gMDsKIAkJICAgICBxdWV1ZV9pZCA8IFJUTF9QQ0lfTUFYX1RYX1FVRVVFX0NPVU5UOykgewogCQkJcmluZyA9ICZwY2lwcml2LT5kZXYudHhfcmluZ1txdWV1ZV9pZF07CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3Uvc3cuYwppbmRleCBjMjQ0ZjJmLi4zNTI3Yzc5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJjdS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3N3LmMKQEAgLTU3LDkgKzU3LDkgQEAKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOwogCWludCBlcnI7CiAKLQlydGxwcml2LT5kbS5kbV9pbml0aWFsZ2Fpbl9lbmFibGUgPSAxOworCXJ0bHByaXYtPmRtLmRtX2luaXRpYWxnYWluX2VuYWJsZSA9IHRydWU7CiAJcnRscHJpdi0+ZG0uZG1fZmxhZyA9IDA7Ci0JcnRscHJpdi0+ZG0uZGlzYWJsZV9mcmFtZWJ1cnN0aW5nID0gMDsKKwlydGxwcml2LT5kbS5kaXNhYmxlX2ZyYW1lYnVyc3RpbmcgPSBmYWxzZTsKIAlydGxwcml2LT5kbS50aGVybWFsdmFsdWUgPSAwOwogCXJ0bHByaXYtPmRiZy5nbG9iYWxfZGVidWdsZXZlbCA9IHJ0bHByaXYtPmNmZy0+bW9kX3BhcmFtcy0+ZGVidWc7CiAJcnRscHJpdi0+cnRsaGFsLnBmaXJtd2FyZSA9IHZtYWxsb2MoMHg0MDAwKTsKQEAgLTI3NSw2ICsyNzUsOCBAQAogCXtSVExfVVNCX0RFVklDRShVU0JfVkVOREVSX0lEX1JFQUxURUssIDB4ODE5MSwgcnRsOTJjdV9oYWxfY2ZnKX0sCiAKIAkvKioqKioqIDgxODhDVSAqKioqKioqKi8KKwkvKiBSVEw4MTg4Q1RWICovCisJe1JUTF9VU0JfREVWSUNFKFVTQl9WRU5ERVJfSURfUkVBTFRFSywgMHgwMThhLCBydGw5MmN1X2hhbF9jZmcpfSwKIAkvKiA4MTg4Q0UtVkFVIFVTQiBtaW5DYXJkICovCiAJe1JUTF9VU0JfREVWSUNFKFVTQl9WRU5ERVJfSURfUkVBTFRFSywgMHg4MTcwLCBydGw5MmN1X2hhbF9jZmcpfSwKIAkvKiA4MTg4Y3UgMSoxIGRvbmdsZSAqLwpAQCAtMjkxLDE0ICsyOTMsMTQgQEAKIAl7UlRMX1VTQl9ERVZJQ0UoVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDgxN2UsIHJ0bDkyY3VfaGFsX2NmZyl9LAogCS8qIDgxODhSVSBpbiBBbGZhIEFXVVMwMzZOSFIgKi8KIAl7UlRMX1VTQl9ERVZJQ0UoVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDgxN2YsIHJ0bDkyY3VfaGFsX2NmZyl9LAorCS8qIFJUTDgxODhDVVMtVkwgKi8KKwl7UlRMX1VTQl9ERVZJQ0UoVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDgxOGEsIHJ0bDkyY3VfaGFsX2NmZyl9LAogCS8qIDgxODggQ29tYm8gZm9yIEJDNCAqLwogCXtSVExfVVNCX0RFVklDRShVU0JfVkVOREVSX0lEX1JFQUxURUssIDB4ODc1NCwgcnRsOTJjdV9oYWxfY2ZnKX0sCiAKIAkvKioqKioqIDgxOTJDVSAqKioqKioqKi8KLQkvKiA4MTkxY3UgMSoyICovCi0Je1JUTF9VU0JfREVWSUNFKFVTQl9WRU5ERVJfSURfUkVBTFRFSywgMHg4MTc3LCBydGw5MmN1X2hhbF9jZmcpfSwKIAkvKiA4MTkyY3UgMioyICovCi0Je1JUTF9VU0JfREVWSUNFKFVTQl9WRU5ERVJfSURfUkVBTFRFSywgMHg4MTdiLCBydGw5MmN1X2hhbF9jZmcpfSwKKwl7UlRMX1VTQl9ERVZJQ0UoVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDgxNzgsIHJ0bDkyY3VfaGFsX2NmZyl9LAogCS8qIDgxOTJDRS1WQVUgVVNCIG1pbkNhcmQgKi8KIAl7UlRMX1VTQl9ERVZJQ0UoVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDgxN2MsIHJ0bDkyY3VfaGFsX2NmZyl9LAogCkBAIC0zMDksMTMgKzMxMSwxNyBAQAogCXtSVExfVVNCX0RFVklDRSgweDA3YjgsIDB4ODE4OCwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qQWJvY29tIC0gQWJvY29tKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwN2I4LCAweDgxODksIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkZ1bmFpIC0gQWJvY29tKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwODQ2LCAweDkwNDEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKk5ldEdlYXIgV05BMTAwME0qLwotCXtSVExfVVNCX0RFVklDRSgweDBEZjYsIDB4MDA1MiwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qU2l0ZWNvbSAtIEVkaW1heCovCisJe1JUTF9VU0JfREVWSUNFKDB4MGRmNiwgMHgwMDUyLCBydGw5MmN1X2hhbF9jZmcpfSwgLypTaXRlY29tIC0gRWRpbWF4Ki8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwZGY2LCAweDAwNWMsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlNpdGVjb20gLSBFZGltYXgqLwogCXtSVExfVVNCX0RFVklDRSgweDBlYjAsIDB4OTA3MSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qTk8gQnJhbmQgLSBFdG9wKi8KIAkvKiBIUCAtIExpdGUtT24gLDgxODhDVVMgU2xpbSBDb21ibyAqLwogCXtSVExfVVNCX0RFVklDRSgweDEwM2MsIDB4MTYyOSwgcnRsOTJjdV9oYWxfY2ZnKX0sCiAJe1JUTF9VU0JfREVWSUNFKDB4MTNkMywgMHgzMzU3LCBydGw5MmN1X2hhbF9jZmcpfSwgLyogQXp1cmVXYXZlICovCiAJe1JUTF9VU0JfREVWSUNFKDB4MjAwMSwgMHgzMzA4LCBydGw5MmN1X2hhbF9jZmcpfSwgLypELUxpbmsgLSBBbHBoYSovCisJe1JUTF9VU0JfREVWSUNFKDB4MjAxOSwgMHg0OTAyLCBydGw5MmN1X2hhbF9jZmcpfSwgLypQbGFuZXggLSBFdG9wKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgyMDE5LCAweGFiMmEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlBsYW5leCAtIEFib2NvbSovCisJLypTVy1XRjAyLUFEMTUgLUFib2NvbSovCisJe1JUTF9VU0JfREVWSUNFKDB4MjAxOSwgMHhhYjJlLCBydGw5MmN1X2hhbF9jZmcpfSwKIAl7UlRMX1VTQl9ERVZJQ0UoMHgyMDE5LCAweGVkMTcsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlBDSSAtIEVkaW1heCovCiAJe1JUTF9VU0JfREVWSUNFKDB4MjBmNCwgMHg2NDhiLCBydGw5MmN1X2hhbF9jZmcpfSwgLypUUkVORG5ldCAtIENhbWVvKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHg3MzkyLCAweDc4MTEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkVkaW1heCAtIEVkaW1heCovCkBAIC0zMjYsMTQgKzMzMiwzNiBAQAogCXtSVExfVVNCX0RFVklDRSgweDQ4NTUsIDB4MDA5MSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qIE5ldHdlZU4tRmVpeHVuICovCiAJe1JUTF9VU0JfREVWSUNFKDB4OTg0NiwgMHg5MDQxLCBydGw5MmN1X2hhbF9jZmcpfSwgLyogTmV0Z2VhciBDYW1lbyAqLwogCisJLyoqKioqKiA4MTg4IFJVICoqKioqKioqLworCS8qIE5ldGNvcmUgKi8KKwl7UlRMX1VTQl9ERVZJQ0UoVVNCX1ZFTkRFUl9JRF9SRUFMVEVLLCAweDMxN2YsIHJ0bDkyY3VfaGFsX2NmZyl9LAorCisJLyoqKioqKiA4MTg4Q1VTIFNsaW0gU29sbyoqKioqKioqLworCXtSVExfVVNCX0RFVklDRSgweDA0ZjIsIDB4YWZmNywgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qWGF2aSovCisJe1JUTF9VU0JfREVWSUNFKDB4MDRmMiwgMHhhZmY5LCBydGw5MmN1X2hhbF9jZmcpfSwgLypYYXZpKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwNGYyLCAweGFmZmEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlhhdmkqLworCisJLyoqKioqKiA4MTg4Q1VTIFNsaW0gQ29tYm8gKioqKioqKiovCisJe1JUTF9VU0JfREVWSUNFKDB4MDRmMiwgMHhhZmY4LCBydGw5MmN1X2hhbF9jZmcpfSwgLypYYXZpKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwNGYyLCAweGFmZmIsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlhhdmkqLworCXtSVExfVVNCX0RFVklDRSgweDA0ZjIsIDB4YWZmYywgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qWGF2aSovCisJe1JUTF9VU0JfREVWSUNFKDB4MjAxOSwgMHgxMjAxLCBydGw5MmN1X2hhbF9jZmcpfSwgLypQbGFuZXgtVmVuY2VyKi8KKwogCS8qKioqKiogODE5MkNVICoqKioqKioqLworCXtSVExfVVNCX0RFVklDRSgweDA1MGQsIDB4MjEwMiwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qQmVsY29tLVNlcmNvbW0qLworCXtSVExfVVNCX0RFVklDRSgweDA1MGQsIDB4MjEwMywgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qQmVsY29tLUVkaW1heCovCiAJe1JUTF9VU0JfREVWSUNFKDB4MDU4NiwgMHgzNDFmLCBydGw5MmN1X2hhbF9jZmcpfSwgLypaeXhlbCAtQWJvY29tKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwN2FhLCAweDAwNTYsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkFUS0stR2VtdGVrKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgwN2I4LCAweDgxNzgsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkZ1bmFpIC1BYm9jb20qLworCXtSVExfVVNCX0RFVklDRSgweDA4NDYsIDB4OTAyMSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qTmV0Z2Vhci1TZXJjb21tKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwYjA1LCAweDE3YWIsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkFTVVMtRWRpbWF4Ki8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwZGY2LCAweDAwNjEsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlNpdGVjb20tRWRpbWF4Ki8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgwZTY2LCAweDAwMTksIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkhhd2tpbmctRWRpbWF4Ki8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgyMDAxLCAweDMzMDcsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkQtTGluay1DYW1lbyovCiAJe1JUTF9VU0JfREVWSUNFKDB4MjAwMSwgMHgzMzA5LCBydGw5MmN1X2hhbF9jZmcpfSwgLypELUxpbmstQWxwaGEqLwogCXtSVExfVVNCX0RFVklDRSgweDIwMDEsIDB4MzMwYSwgcnRsOTJjdV9oYWxfY2ZnKX0sIC8qRC1MaW5rLUFscGhhKi8KIAl7UlRMX1VTQl9ERVZJQ0UoMHgyMDE5LCAweGFiMmIsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlBsYW5leCAtQWJvY29tKi8KKwl7UlRMX1VTQl9ERVZJQ0UoMHgyMGY0LCAweDYyNGQsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKlRSRU5ETmV0Ki8KIAl7UlRMX1VTQl9ERVZJQ0UoMHg3MzkyLCAweDc4MjIsIHJ0bDkyY3VfaGFsX2NmZyl9LCAvKkVkaW1heCAtRWRpbWF4Ki8KIAl7fQogfTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmN1L3RyeC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvdHJ4LmMKaW5kZXggYmMzM2IxNC4uYjNjYzdiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvdHJ4LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyY3UvdHJ4LmMKQEAgLTQ5MSw3ICs0OTEsNyBAQAogCVNFVF9UWF9ERVNDX1RYX0RFU0NfQ0hFQ0tTVU0odHhkZXNjLCAwKTsKIAlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCAxNjsgaW5kZXgrKykKIAkJY2hlY2tzdW0gPSBjaGVja3N1bSBeICgqKHB0ciArIGluZGV4KSk7Ci0JU0VUX1RYX0RFU0NfVFhfREVTQ19DSEVDS1NVTSh0eGRlc2MsIGNoZWNrc3VtKTsKKwlTRVRfVFhfREVTQ19UWF9ERVNDX0NIRUNLU1VNKHR4ZGVzYywgY3B1X3RvX2xlMTYoY2hlY2tzdW0pKTsKIH0KIAogdm9pZCBydGw5MmN1X3R4X2ZpbGxfZGVzYyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvcGh5LmMKaW5kZXggM2FjN2FmMS4uMDg4MzM0OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvcGh5LmMKQEAgLTMzNzQsNyArMzM3NCw3IEBACiAJCWJyZWFrOwogCWNhc2UgRVJGU0xFRVA6CiAJCWlmIChwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPRkYpCi0JCQlicmVhazsKKwkJCXJldHVybiBmYWxzZTsKIAogCQlmb3IgKHF1ZXVlX2lkID0gMCwgaSA9IDA7CiAJCSAgICAgcXVldWVfaWQgPCBSVExfUENJX01BWF9UWF9RVUVVRV9DT1VOVDspIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3N3LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJkZS9zdy5jCmluZGV4IDE0OTQ5M2YuLjc5MTFjOWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MmRlL3N3LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyZGUvc3cuYwpAQCAtOTksOSArOTksOSBAQAogCiAJcnRscHJpdi0+ZG0uZG1faW5pdGlhbGdhaW5fZW5hYmxlID0gdHJ1ZTsKIAlydGxwcml2LT5kbS5kbV9mbGFnID0gMDsKLQlydGxwcml2LT5kbS5kaXNhYmxlX2ZyYW1lYnVyc3RpbmcgPSAwOworCXJ0bHByaXYtPmRtLmRpc2FibGVfZnJhbWVidXJzdGluZyA9IGZhbHNlOwogCXJ0bHByaXYtPmRtLnRoZXJtYWx2YWx1ZSA9IDA7Ci0JcnRscHJpdi0+ZG0udXNlcmFtYXNrID0gMTsKKwlydGxwcml2LT5kbS51c2VyYW1hc2sgPSB0cnVlOwogCiAJLyogZHVhbCBtYWMgKi8KIAlpZiAocnRscHJpdi0+cnRsaGFsLmN1cnJlbnRfYmFuZHR5cGUgPT0gQkFORF9PTl81RykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3BoeS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMKaW5kZXggZjI3MTcxYS4uZjEwYWMxYSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2UvcGh5LmMKQEAgLTYwMiw3ICs2MDIsNyBAQAogCQl9CiAJY2FzZSBFUkZTTEVFUDoKIAkJCWlmIChwcHNjLT5yZnB3cl9zdGF0ZSA9PSBFUkZPRkYpCi0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIGZhbHNlOwogCiAJCQlmb3IgKHF1ZXVlX2lkID0gMCwgaSA9IDA7CiAJCQkgICAgIHF1ZXVlX2lkIDwgUlRMX1BDSV9NQVhfVFhfUVVFVUVfQ09VTlQ7KSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9zdy5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS9ydGw4MTkyc2Uvc3cuYwppbmRleCA5MmY0OWQ1Li43ODcyM2NmIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3J0bDgxOTJzZS9zdy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvcnRsODE5MnNlL3N3LmMKQEAgLTk4LDkgKzk4LDkgQEAKIAlpbnQgZXJyID0gMDsKIAl1MTYgZWFybHlyeHRocmVzaG9sZCA9IDc7CiAKLQlydGxwcml2LT5kbS5kbV9pbml0aWFsZ2Fpbl9lbmFibGUgPSAxOworCXJ0bHByaXYtPmRtLmRtX2luaXRpYWxnYWluX2VuYWJsZSA9IHRydWU7CiAJcnRscHJpdi0+ZG0uZG1fZmxhZyA9IDA7Ci0JcnRscHJpdi0+ZG0uZGlzYWJsZV9mcmFtZWJ1cnN0aW5nID0gMDsKKwlydGxwcml2LT5kbS5kaXNhYmxlX2ZyYW1lYnVyc3RpbmcgPSBmYWxzZTsKIAlydGxwcml2LT5kbS50aGVybWFsdmFsdWUgPSAwOwogCXJ0bHByaXYtPmRtLnVzZXJhbWFzayA9IHRydWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvdXNiLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3VzYi5jCmluZGV4IDU0Y2I4YTYuLmU5NTZmYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3J0bHdpZmkvdXNiLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS91c2IuYwpAQCAtMzQsMTMgKzM0LDE0IEBACiAjaW5jbHVkZSAidXNiLmgiCiAjaW5jbHVkZSAiYmFzZS5oIgogI2luY2x1ZGUgInBzLmgiCisjaW5jbHVkZSAicnRsODE5MmMvZndfY29tbW9uLmgiCiAKICNkZWZpbmUJUkVBTFRFS19VU0JfVkVOUVRfUkVBRAkJCTB4QzAKICNkZWZpbmUJUkVBTFRFS19VU0JfVkVOUVRfV1JJVEUJCQkweDQwCiAjZGVmaW5lIFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVEJCTB4MDUKICNkZWZpbmUJUkVBTFRFS19VU0JfVkVOUVRfQ01EX0lEWAkJMHgwMAogCi0jZGVmaW5lIFJFQUxURUtfVVNCX1ZFTlFUX01BWF9CVUZfU0laRQkJMjU0CisjZGVmaW5lIE1BWF9VU0JDVFJMX1ZFTkRPUlJFUV9USU1FUwkJMTAKIAogc3RhdGljIHZvaWQgdXNiY3RybF9hc3luY19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCiB7CkBAIC04Miw2ICs4Myw3IEBACiAJZHItPndWYWx1ZSA9IGNwdV90b19sZTE2KHZhbHVlKTsKIAlkci0+d0luZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOwogCWRyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYobGVuKTsKKwkvKiBkYXRhIGFyZSBhbHJlYWR5IGluIGxpdHRsZS1lbmRpYW4gb3JkZXIgKi8KIAltZW1jcHkoYnVmLCBwZGF0YSwgbGVuKTsKIAl1c2JfZmlsbF9jb250cm9sX3VyYih1cmIsIHVkZXYsIHBpcGUsCiAJCQkgICAgICh1bnNpZ25lZCBjaGFyICopZHIsIGJ1ZiwgbGVuLApAQCAtMTAwLDE2ICsxMDIsMjggQEAKIAl1bnNpZ25lZCBpbnQgcGlwZTsKIAlpbnQgc3RhdHVzOwogCXU4IHJlcXR5cGU7CisJaW50IHZlbmRvcnJlcV90aW1lcyA9IDA7CisJc3RhdGljIGludCBjb3VudDsKIAogCXBpcGUgPSB1c2JfcmN2Y3RybHBpcGUodWRldiwgMCk7IC8qIHJlYWRfaW4gKi8KIAlyZXF0eXBlID0gIFJFQUxURUtfVVNCX1ZFTlFUX1JFQUQ7CiAKLQlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgcGlwZSwgcmVxdWVzdCwgcmVxdHlwZSwgdmFsdWUsIGluZGV4LAotCQkJCSBwZGF0YSwgbGVuLCAwKTsgLyogbWF4LiB0aW1lb3V0ICovCisJZG8geworCQlzdGF0dXMgPSB1c2JfY29udHJvbF9tc2codWRldiwgcGlwZSwgcmVxdWVzdCwgcmVxdHlwZSwgdmFsdWUsCisJCQkJCSBpbmRleCwgcGRhdGEsIGxlbiwgMCk7IC8qbWF4LiB0aW1lb3V0Ki8KKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCS8qIGZpcm13YXJlIGRvd25sb2FkIGlzIGNoZWNrc3VtZWQsIGRvbid0IHJldHJ5ICovCisJCQlpZiAoKHZhbHVlID49IEZXXzgxOTJDX1NUQVJUX0FERFJFU1MgJiYKKwkJCSAgICB2YWx1ZSA8PSBGV184MTkyQ19FTkRfQUREUkVTUykpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCsrdmVuZG9ycmVxX3RpbWVzIDwgTUFYX1VTQkNUUkxfVkVORE9SUkVRX1RJTUVTKTsKIAotCWlmIChzdGF0dXMgPCAwKQorCWlmIChzdGF0dXMgPCAwICYmIGNvdW50KysgPCA0KQogCQlwcl9lcnIoInJlZyAweCV4LCB1c2JjdHJsX3ZlbmRvcnJlcSBUaW1lT3V0ISBzdGF0dXM6MHgleCB2YWx1ZT0weCV4XG4iLAotCQkgICAgICAgdmFsdWUsIHN0YXR1cywgKih1MzIgKilwZGF0YSk7CisJCSAgICAgICB2YWx1ZSwgc3RhdHVzLCBsZTMyX3RvX2NwdSgqKHUzMiAqKXBkYXRhKSk7CiAJcmV0dXJuIHN0YXR1czsKIH0KIApAQCAtMTI5LDcgKzE0Myw3IEBACiAKIAl3dmFsdWUgPSAodTE2KWFkZHI7CiAJX3VzYmN0cmxfdmVuZG9ycmVxX3N5bmNfcmVhZCh1ZGV2LCByZXF1ZXN0LCB3dmFsdWUsIGluZGV4LCBkYXRhLCBsZW4pOwotCXJldCA9ICpkYXRhOworCXJldCA9IGxlMzJfdG9fY3B1KCpkYXRhKTsKIAlrZnJlZShkYXRhKTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtMTYxLDEyICsxNzUsMTIgQEAKIAl1OCByZXF1ZXN0OwogCXUxNiB3dmFsdWU7CiAJdTE2IGluZGV4OwotCXUzMiBkYXRhOworCV9fbGUzMiBkYXRhOwogCiAJcmVxdWVzdCA9IFJFQUxURUtfVVNCX1ZFTlFUX0NNRF9SRVE7CiAJaW5kZXggPSBSRUFMVEVLX1VTQl9WRU5RVF9DTURfSURYOyAvKiBuL2EgKi8KIAl3dmFsdWUgPSAodTE2KShhZGRyJjB4MDAwMGZmZmYpOwotCWRhdGEgPSB2YWw7CisJZGF0YSA9IGNwdV90b19sZTMyKHZhbCk7CiAJX3VzYmN0cmxfdmVuZG9ycmVxX2FzeW5jX3dyaXRlKHVkZXYsIHJlcXVlc3QsIHd2YWx1ZSwgaW5kZXgsICZkYXRhLAogCQkJCSAgICAgICBsZW4pOwogfQpAQCAtMTkyLDYgKzIwNiwzMCBAQAogCV91c2Jfd3JpdGVfYXN5bmModG9fdXNiX2RldmljZShkZXYpLCBhZGRyLCB2YWwsIDQpOwogfQogCitzdGF0aWMgdm9pZCBfdXNiX3dyaXRlTl9zeW5jKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIHZvaWQgKmRhdGEsCisJCQkgICAgIHUxNiBsZW4pCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gcnRscHJpdi0+aW8uZGV2OworCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2ID0gdG9fdXNiX2RldmljZShkZXYpOworCXU4IHJlcXVlc3QgPSBSRUFMVEVLX1VTQl9WRU5RVF9DTURfUkVROworCXU4IHJlcXR5cGUgPSAgUkVBTFRFS19VU0JfVkVOUVRfV1JJVEU7CisJdTE2IHd2YWx1ZTsKKwl1MTYgaW5kZXggPSBSRUFMVEVLX1VTQl9WRU5RVF9DTURfSURYOworCWludCBwaXBlID0gdXNiX3NuZGN0cmxwaXBlKHVkZXYsIDApOyAvKiB3cml0ZV9vdXQgKi8KKwl1OCAqYnVmZmVyOworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisKKwl3dmFsdWUgPSAodTE2KShhZGRyJjB4MDAwMGZmZmYpOworCWJ1ZmZlciA9IHVzYl9hbGxvY19jb2hlcmVudCh1ZGV2LCAoc2l6ZV90KWxlbiwgR0ZQX0FUT01JQywgJmRtYV9hZGRyKTsKKwlpZiAoIWJ1ZmZlcikKKwkJcmV0dXJuOworCW1lbWNweShidWZmZXIsIGRhdGEsIGxlbik7CisJdXNiX2NvbnRyb2xfbXNnKHVkZXYsIHBpcGUsIHJlcXVlc3QsIHJlcXR5cGUsIHd2YWx1ZSwKKwkJCWluZGV4LCBidWZmZXIsIGxlbiwgNTApOworCisJdXNiX2ZyZWVfY29oZXJlbnQodWRldiwgKHNpemVfdClsZW4sIGJ1ZmZlciwgZG1hX2FkZHIpOworfQorCiBzdGF0aWMgdm9pZCBfcnRsX3VzYl9pb19oYW5kbGVyX2luaXQoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CkBAIC0yMDUsNiArMjQzLDcgQEAKIAlydGxwcml2LT5pby5yZWFkOF9zeW5jCQk9IF91c2JfcmVhZDhfc3luYzsKIAlydGxwcml2LT5pby5yZWFkMTZfc3luYwkJPSBfdXNiX3JlYWQxNl9zeW5jOwogCXJ0bHByaXYtPmlvLnJlYWQzMl9zeW5jCQk9IF91c2JfcmVhZDMyX3N5bmM7CisJcnRscHJpdi0+aW8ud3JpdGVOX3N5bmMJCT0gX3VzYl93cml0ZU5fc3luYzsKIH0KIAogc3RhdGljIHZvaWQgX3J0bF91c2JfaW9faGFuZGxlcl9yZWxlYXNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvcnRsd2lmaS93aWZpLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3dpZmkuaAppbmRleCA3MTNjN2RkLi5jZGFmMTQyIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3dpZmkuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9ydGx3aWZpL3dpZmkuaApAQCAtNjMsNiArNjMsNyBAQAogI2RlZmluZSBBQ19NQVgJCQkJCTQKICNkZWZpbmUgUU9TX1FVRVVFX05VTQkJCQk0CiAjZGVmaW5lIFJUTF9NQUM4MDIxMV9OVU1fUVVFVUUJCQk1CisjZGVmaW5lIFJFQUxURUtfVVNCX1ZFTlFUX01BWF9CVUZfU0laRQkJMjU0CiAKICNkZWZpbmUgUUJTU19MT0FEX1NJWkUJCQkJNQogI2RlZmluZSBNQVhfV01NRUxFX0xFTkdUSAkJCTY0CkBAIC05NDMsOCArOTQ0LDEwIEBACiAJdW5zaWduZWQgbG9uZyBwY2lfYmFzZV9hZGRyOwkvKmRldmljZSBJL08gYWRkcmVzcyAqLwogCiAJdm9pZCAoKndyaXRlOF9hc3luYykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIHU4IHZhbCk7Ci0Jdm9pZCAoKndyaXRlMTZfYXN5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCBfX2xlMTYgdmFsKTsKLQl2b2lkICgqd3JpdGUzMl9hc3luYykgKHN0cnVjdCBydGxfcHJpdiAqcnRscHJpdiwgdTMyIGFkZHIsIF9fbGUzMiB2YWwpOworCXZvaWQgKCp3cml0ZTE2X2FzeW5jKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkciwgdTE2IHZhbCk7CisJdm9pZCAoKndyaXRlMzJfYXN5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB1MzIgdmFsKTsKKwl2b2lkICgqd3JpdGVOX3N5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyLCB2b2lkICpidWYsCisJCQkgICAgIHUxNiBsZW4pOwogCiAJdTgoKnJlYWQ4X3N5bmMpIChzdHJ1Y3QgcnRsX3ByaXYgKnJ0bHByaXYsIHUzMiBhZGRyKTsKIAl1MTYoKnJlYWQxNl9zeW5jKSAoc3RydWN0IHJ0bF9wcml2ICpydGxwcml2LCB1MzIgYWRkcik7CkBAIC0xNDg1LDcgKzE0ODgsNyBAQAogCiBzdHJ1Y3QgcnRsX21vZF9wYXJhbXMgewogCS8qIGRlZmF1bHQ6IDAgPSB1c2luZyBoYXJkd2FyZSBlbmNyeXB0aW9uICovCi0JaW50IHN3X2NyeXB0bzsKKwlib29sIHN3X2NyeXB0bzsKIAogCS8qIGRlZmF1bHQ6IDAgPSBEQkdfRU1FUkcgKDApKi8KIAlpbnQgZGVidWc7CkBAIC0xNTQxLDYgKzE1NDQsNyBAQAogc3RydWN0IHJ0bF9sb2NrcyB7CiAJLyogbXV0ZXggKi8KIAlzdHJ1Y3QgbXV0ZXggY29uZl9tdXRleDsKKwlzdHJ1Y3QgbXV0ZXggcHNfbXV0ZXg7CiAKIAkvKnNwaW4gbG9jayAqLwogCXNwaW5sb2NrX3QgaXBzX2xvY2s7CkBAIC0xNTQ4LDcgKzE1NTIsNiBAQAogCXNwaW5sb2NrX3QgaDJjX2xvY2s7CiAJc3BpbmxvY2tfdCByZl9wc19sb2NrOwogCXNwaW5sb2NrX3QgcmZfbG9jazsKLQlzcGlubG9ja190IGxwc19sb2NrOwogCXNwaW5sb2NrX3Qgd2FpdHFfbG9jazsKIAogCS8qRHVhbCBtYWMqLwpAQCAtMTU3Myw3ICsxNTc2LDggQEAKIAkvKiBGb3IgU1cgTFBTICovCiAJc3RydWN0IGRlbGF5ZWRfd29yayBwc193b3JrOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgcHNfcmZvbl93cTsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgaXBzX2xlYXZlX3Rhc2tsZXQ7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgbHBzX2xlYXZlX3dvcms7CiB9OwogCiBzdHJ1Y3QgcnRsX2RlYnVnIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9zcGkuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTI1MS9zcGkuYwppbmRleCBlYWE1Zjk1Li42MjQ4YzM1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyNTEvc3BpLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMjUxL3NwaS5jCkBAIC0zMTksNyArMzE5LDYgQEAKIHN0YXRpYyBzdHJ1Y3Qgc3BpX2RyaXZlciB3bDEyNTFfc3BpX2RyaXZlciA9IHsKIAkuZHJpdmVyID0gewogCQkubmFtZQkJPSBEUklWRVJfTkFNRSwKLQkJLmJ1cwkJPSAmc3BpX2J1c190eXBlLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L0tjb25maWcgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvS2NvbmZpZwppbmRleCAzZmUzODhiLi5hZjA4Yzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvS2NvbmZpZworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvS2NvbmZpZwpAQCAtNDIsMTYgKzQyLDYgQEAKIAkgIElmIHlvdSBjaG9vc2UgdG8gYnVpbGQgYSBtb2R1bGUsIGl0J2xsIGJlIGNhbGxlZCB3bDEyeHhfc2Rpby4KIAkgIFNheSBOIGlmIHVuc3VyZS4KIAotY29uZmlnIFdMMTJYWF9TRElPX1RFU1QKLQl0cmlzdGF0ZSAiVEkgd2wxMnh4IFNESU8gdGVzdGluZyBzdXBwb3J0IgotCWRlcGVuZHMgb24gV0wxMlhYICYmIE1NQyAmJiBXTDEyWFhfU0RJTwotCWRlZmF1bHQgbgotCS0tLWhlbHAtLS0KLQkgIFRoaXMgbW9kdWxlIGFkZHMgc3VwcG9ydCBmb3IgdGhlIFNESU8gYnVzIHRlc3Rpbmcgd2l0aCB0aGUKLQkgIFRJIHdsMTJ4eCBjaGlwc2V0cy4gIFlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRoaXMgdW5sZXNzIHlvdSBhcmUKLQkgIHRlc3RpbmcgYSBuZXcgaGFyZHdhcmUgcGxhdGZvcm0uICBTZWxlY3QgdGhpcyBpZiB5b3Ugd2FudCB0byB0ZXN0IHRoZQotCSAgU0RJTyBidXMgd2hpY2ggaXMgY29ubmVjdGVkIHRvIHRoZSB3bDEyeHggY2hpcC4KLQogY29uZmlnIFdMMTJYWF9QTEFURk9STV9EQVRBCiAJYm9vbAogCWRlcGVuZHMgb24gV0wxMlhYX1NESU8gIT0gbiB8fCBXTDEyNTFfU0RJTyAhPSBuCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvTWFrZWZpbGUKaW5kZXggNjIxYjM0OC4uZmU2NzI2MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9NYWtlZmlsZQpAQCAtMywxNCArMywxMSBAQAogCiB3bDEyeHhfc3BpLW9ianMgCT0gc3BpLm8KIHdsMTJ4eF9zZGlvLW9ianMJPSBzZGlvLm8KLXdsMTJ4eF9zZGlvX3Rlc3Qtb2Jqcwk9IHNkaW9fdGVzdC5vCiAKIHdsMTJ4eC0kKENPTkZJR19OTDgwMjExX1RFU1RNT0RFKQkrPSB0ZXN0bW9kZS5vCiBvYmotJChDT05GSUdfV0wxMlhYKQkJCSs9IHdsMTJ4eC5vCiBvYmotJChDT05GSUdfV0wxMlhYX1NQSSkJCSs9IHdsMTJ4eF9zcGkubwogb2JqLSQoQ09ORklHX1dMMTJYWF9TRElPKQkJKz0gd2wxMnh4X3NkaW8ubwogCi1vYmotJChDT05GSUdfV0wxMlhYX1NESU9fVEVTVCkJCSs9IHdsMTJ4eF9zZGlvX3Rlc3QubwotCiAjIHNtYWxsIGJ1aWx0aW4gZHJpdmVyIGJpdAogb2JqLSQoQ09ORklHX1dMMTJYWF9QTEFURk9STV9EQVRBKQkrPSB3bDEyeHhfcGxhdGZvcm1fZGF0YS5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYWN4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYWN4LmMKaW5kZXggY2EwNDRhNy4uNzUzN2M0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2FjeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9hY3guYwpAQCAtMjksMTEgKzI5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCiAjaW5jbHVkZSAid2wxMnh4LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJ3bDEyeHhfODAyMTEuaCIKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJwcy5oIgogCi1pbnQgd2wxMjcxX2FjeF93YWtlX3VwX2NvbmRpdGlvbnMoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FjeF93YWtlX3VwX2NvbmRpdGlvbnMoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3QgYWN4X3dha2VfdXBfY29uZGl0aW9uICp3YWtlX3VwOwogCWludCByZXQ7CkBAIC00Niw3ICs0Nyw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdha2VfdXAtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwl3YWtlX3VwLT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJd2FrZV91cC0+d2FrZV91cF9ldmVudCA9IHdsLT5jb25mLmNvbm4ud2FrZV91cF9ldmVudDsKIAl3YWtlX3VwLT5saXN0ZW5faW50ZXJ2YWwgPSB3bC0+Y29uZi5jb25uLmxpc3Rlbl9pbnRlcnZhbDsKIApAQCAtODQsNyArODUsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X3R4X3Bvd2VyKHN0cnVjdCB3bDEyNzEgKndsLCBpbnQgcG93ZXIpCitpbnQgd2wxMjcxX2FjeF90eF9wb3dlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJaW50IHBvd2VyKQogewogCXN0cnVjdCBhY3hfY3VycmVudF90eF9wb3dlciAqYWN4OwogCWludCByZXQ7CkBAIC0xMDAsNyArMTAyLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5jdXJyZW50X3R4X3Bvd2VyID0gcG93ZXIgKiAxMDsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBET1QxMV9DVVJfVFhfUFdSLCBhY3gsIHNpemVvZigqYWN4KSk7CkBAIC0xMTQsNyArMTE2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9mZWF0dXJlX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyNzFfYWN4X2ZlYXR1cmVfY2ZnKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IGFjeF9mZWF0dXJlX2NvbmZpZyAqZmVhdHVyZTsKIAlpbnQgcmV0OwpAQCAtMTI4LDcgKzEzMCw3IEBACiAJfQogCiAJLyogREZfRU5DUllQVElPTl9ESVNBQkxFIGFuZCBERl9TTklGRl9NT0RFX0VOQUJMRSBhcmUgZGlzYWJsZWQgKi8KLQlmZWF0dXJlLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJZmVhdHVyZS0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWZlYXR1cmUtPmRhdGFfZmxvd19vcHRpb25zID0gMDsKIAlmZWF0dXJlLT5vcHRpb25zID0gMDsKIApAQCAtMTg0LDMzICsxODYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X3BkX3RocmVzaG9sZChzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlzdHJ1Y3QgYWN4X3BhY2tldF9kZXRlY3Rpb24gKnBkOwotCWludCByZXQ7Ci0KLQl3bDEyNzFfZGVidWcoREVCVUdfQUNYLCAiYWN4IGRhdGEgcGQgdGhyZXNob2xkIik7Ci0KLQlwZCA9IGt6YWxsb2Moc2l6ZW9mKCpwZCksIEdGUF9LRVJORUwpOwotCWlmICghcGQpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JcGQtPnRocmVzaG9sZCA9IGNwdV90b19sZTMyKHdsLT5jb25mLnJ4LnBhY2tldF9kZXRlY3Rpb25fdGhyZXNob2xkKTsKLQotCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfUERfVEhSRVNIT0xELCBwZCwgc2l6ZW9mKCpwZCkpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV93YXJuaW5nKCJmYWlsZWQgdG8gc2V0IHBkIHRocmVzaG9sZDogJWQiLCByZXQpOwotCQlnb3RvIG91dDsKLQl9Ci0KLW91dDoKLQlrZnJlZShwZCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotaW50IHdsMTI3MV9hY3hfc2xvdChzdHJ1Y3Qgd2wxMjcxICp3bCwgZW51bSBhY3hfc2xvdF90eXBlIHNsb3RfdGltZSkKK2ludCB3bDEyNzFfYWN4X3Nsb3Qoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgIGVudW0gYWN4X3Nsb3RfdHlwZSBzbG90X3RpbWUpCiB7CiAJc3RydWN0IGFjeF9zbG90ICpzbG90OwogCWludCByZXQ7CkBAIC0yMjMsNyArMjAwLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jc2xvdC0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCXNsb3QtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlzbG90LT53b25lX2luZGV4ID0gU1RBVElPTl9XT05FX0lOREVYOwogCXNsb3QtPnNsb3RfdGltZSA9IHNsb3RfdGltZTsKIApAQCAtMjM4LDggKzIxNSw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfZ3JvdXBfYWRkcmVzc190Ymwoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlLAotCQkJCSB2b2lkICptY19saXN0LCB1MzIgbWNfbGlzdF9sZW4pCitpbnQgd2wxMjcxX2FjeF9ncm91cF9hZGRyZXNzX3RibChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSBib29sIGVuYWJsZSwgdm9pZCAqbWNfbGlzdCwgdTMyIG1jX2xpc3RfbGVuKQogewogCXN0cnVjdCBhY3hfZG90MTFfZ3JwX2FkZHJfdGJsICphY3g7CiAJaW50IHJldDsKQEAgLTI1Myw3ICsyMzAsNyBAQAogCX0KIAogCS8qIE1BQyBmaWx0ZXJpbmcgKi8KLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPmVuYWJsZWQgPSBlbmFibGU7CiAJYWN4LT5udW1fZ3JvdXBzID0gbWNfbGlzdF9sZW47CiAJbWVtY3B5KGFjeC0+bWFjX3RhYmxlLCBtY19saXN0LCBtY19saXN0X2xlbiAqIEVUSF9BTEVOKTsKQEAgLTI3MCw3ICsyNDcsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X3NlcnZpY2VfcGVyaW9kX3RpbWVvdXQoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FjeF9zZXJ2aWNlX3BlcmlvZF90aW1lb3V0KHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3QgYWN4X3J4X3RpbWVvdXQgKnJ4X3RpbWVvdXQ7CiAJaW50IHJldDsKQEAgLTI4Myw3ICsyNjEsNyBAQAogCiAJd2wxMjcxX2RlYnVnKERFQlVHX0FDWCwgImFjeCBzZXJ2aWNlIHBlcmlvZCB0aW1lb3V0Iik7CiAKLQlyeF90aW1lb3V0LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJcnhfdGltZW91dC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCXJ4X3RpbWVvdXQtPnBzX3BvbGxfdGltZW91dCA9IGNwdV90b19sZTE2KHdsLT5jb25mLnJ4LnBzX3BvbGxfdGltZW91dCk7CiAJcnhfdGltZW91dC0+dXBzZF90aW1lb3V0ID0gY3B1X3RvX2xlMTYod2wtPmNvbmYucngudXBzZF90aW1lb3V0KTsKIApAQCAtMzAwLDcgKzI3OCw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfcnRzX3RocmVzaG9sZChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIHJ0c190aHJlc2hvbGQpCitpbnQgd2wxMjcxX2FjeF9ydHNfdGhyZXNob2xkKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgIHUzMiBydHNfdGhyZXNob2xkKQogewogCXN0cnVjdCBhY3hfcnRzX3RocmVzaG9sZCAqcnRzOwogCWludCByZXQ7CkBAIC0zMjAsNyArMjk5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcnRzLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJcnRzLT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJcnRzLT50aHJlc2hvbGQgPSBjcHVfdG9fbGUxNigodTE2KXJ0c190aHJlc2hvbGQpOwogCiAJcmV0ID0gd2wxMjcxX2NtZF9jb25maWd1cmUod2wsIERPVDExX1JUU19USFJFU0hPTEQsIHJ0cywgc2l6ZW9mKCpydHMpKTsKQEAgLTM2Myw3ICszNDIsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZV9maWx0ZXIpCitpbnQgd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSBib29sIGVuYWJsZV9maWx0ZXIpCiB7CiAJc3RydWN0IGFjeF9iZWFjb25fZmlsdGVyX29wdGlvbiAqYmVhY29uX2ZpbHRlciA9IE5VTEw7CiAJaW50IHJldCA9IDA7CkBAIC0zODAsNyArMzYwLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYmVhY29uX2ZpbHRlci0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWJlYWNvbl9maWx0ZXItPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAliZWFjb25fZmlsdGVyLT5lbmFibGUgPSBlbmFibGVfZmlsdGVyOwogCiAJLyoKQEAgLTQwMSw3ICszODEsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfdGFibGUoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX3RhYmxlKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3QgYWN4X2JlYWNvbl9maWx0ZXJfaWVfdGFibGUgKmllX3RhYmxlOwogCWludCBpLCBpZHggPSAwOwpAQCAtNDE3LDcgKzM5OCw3IEBACiAJfQogCiAJLyogY29uZmlndXJlIGRlZmF1bHQgYmVhY29uIHBhc3MtdGhyb3VnaCBydWxlcyAqLwotCWllX3RhYmxlLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJaWVfdGFibGUtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlpZV90YWJsZS0+bnVtX2llID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgd2wtPmNvbmYuY29ubi5iY25fZmlsdF9pZV9jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCBjb25mX2Jjbl9maWx0X3J1bGUgKnIgPSAmKHdsLT5jb25mLmNvbm4uYmNuX2ZpbHRfaWVbaV0pOwpAQCAtNDU4LDcgKzQzOSw4IEBACiAKICNkZWZpbmUgQUNYX0NPTk5fTU9OSVRfRElTQUJMRV9WQUxVRSAgMHhmZmZmZmZmZgogCi1pbnQgd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpCitpbnQgd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSBib29sIGVuYWJsZSkKIHsKIAlzdHJ1Y3QgYWN4X2Nvbm5fbW9uaXRfcGFyYW1zICphY3g7CiAJdTMyIHRocmVzaG9sZCA9IEFDWF9DT05OX01PTklUX0RJU0FCTEVfVkFMVUU7CkBAIC00NzksNyArNDYxLDcgQEAKIAkJdGltZW91dCA9IHdsLT5jb25mLmNvbm4uYnNzX2xvc2VfdGltZW91dDsKIAl9CiAKLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPnN5bmNoX2ZhaWxfdGhvbGQgPSBjcHVfdG9fbGUzMih0aHJlc2hvbGQpOwogCWFjeC0+YnNzX2xvc2VfdGltZW91dCA9IGNwdV90b19sZTMyKHRpbWVvdXQpOwogCkBAIC01ODIsNyArNTY0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9iY25fZHRpbV9vcHRpb25zKHN0cnVjdCB3bDEyNzEgKndsKQoraW50IHdsMTI3MV9hY3hfYmNuX2R0aW1fb3B0aW9ucyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCXN0cnVjdCBhY3hfYmVhY29uX2Jyb2FkY2FzdCAqYmI7CiAJaW50IHJldDsKQEAgLTU5NSw3ICs1NzcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQliYi0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWJiLT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYmItPmJlYWNvbl9yeF90aW1lb3V0ID0gY3B1X3RvX2xlMTYod2wtPmNvbmYuY29ubi5iZWFjb25fcnhfdGltZW91dCk7CiAJYmItPmJyb2FkY2FzdF90aW1lb3V0ID0gY3B1X3RvX2xlMTYod2wtPmNvbmYuY29ubi5icm9hZGNhc3RfdGltZW91dCk7CiAJYmItPnJ4X2Jyb2FkY2FzdF9pbl9wcyA9IHdsLT5jb25mLmNvbm4ucnhfYnJvYWRjYXN0X2luX3BzOwpAQCAtNjEyLDcgKzU5NCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfYWlkKHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgYWlkKQoraW50IHdsMTI3MV9hY3hfYWlkKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHUxNiBhaWQpCiB7CiAJc3RydWN0IGFjeF9haWQgKmFjeF9haWQ7CiAJaW50IHJldDsKQEAgLTYyNSw3ICs2MDcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhY3hfYWlkLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4X2FpZC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWFjeF9haWQtPmFpZCA9IGNwdV90b19sZTE2KGFpZCk7CiAKIAlyZXQgPSB3bDEyNzFfY21kX2NvbmZpZ3VyZSh3bCwgQUNYX0FJRCwgYWN4X2FpZCwgc2l6ZW9mKCphY3hfYWlkKSk7CkBAIC02NjgsNyArNjUwLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9zZXRfcHJlYW1ibGUoc3RydWN0IHdsMTI3MSAqd2wsIGVudW0gYWN4X3ByZWFtYmxlX3R5cGUgcHJlYW1ibGUpCitpbnQgd2wxMjcxX2FjeF9zZXRfcHJlYW1ibGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICBlbnVtIGFjeF9wcmVhbWJsZV90eXBlIHByZWFtYmxlKQogewogCXN0cnVjdCBhY3hfcHJlYW1ibGUgKmFjeDsKIAlpbnQgcmV0OwpAQCAtNjgxLDcgKzY2NCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWFjeC0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWFjeC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWFjeC0+cHJlYW1ibGUgPSBwcmVhbWJsZTsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfUFJFQU1CTEVfVFlQRSwgYWN4LCBzaXplb2YoKmFjeCkpOwpAQCAtNjk1LDcgKzY3OCw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfY3RzX3Byb3RlY3Qoc3RydWN0IHdsMTI3MSAqd2wsCitpbnQgd2wxMjcxX2FjeF9jdHNfcHJvdGVjdChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAogCQkJICAgZW51bSBhY3hfY3RzcHJvdGVjdF90eXBlIGN0c3Byb3RlY3QpCiB7CiAJc3RydWN0IGFjeF9jdHNwcm90ZWN0ICphY3g7CkBAIC03MDksNyArNjkyLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5jdHNwcm90ZWN0ID0gY3RzcHJvdGVjdDsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfQ1RTX1BST1RFQ1RJT04sIGFjeCwgc2l6ZW9mKCphY3gpKTsKQEAgLTczOSw3ICs3MjIsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IGFjeF9yYXRlX3BvbGljeSAqYWN4OwogCXN0cnVjdCBjb25mX3R4X3JhdGVfY2xhc3MgKmMgPSAmd2wtPmNvbmYudHguc3RhX3JjX2NvbmY7CkBAIC03NTUsMTEgKzczOCwxMSBAQAogCX0KIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19BQ1gsICJiYXNpY19yYXRlOiAweCV4LCBmdWxsX3JhdGU6IDB4JXgiLAotCQl3bC0+YmFzaWNfcmF0ZSwgd2wtPnJhdGVfc2V0KTsKKwkJd2x2aWYtPmJhc2ljX3JhdGUsIHdsdmlmLT5yYXRlX3NldCk7CiAKIAkvKiBjb25maWd1cmUgb25lIGJhc2ljIHJhdGUgY2xhc3MgKi8KLQlhY3gtPnJhdGVfcG9saWN5X2lkeCA9IGNwdV90b19sZTMyKEFDWF9UWF9CQVNJQ19SQVRFKTsKLQlhY3gtPnJhdGVfcG9saWN5LmVuYWJsZWRfcmF0ZXMgPSBjcHVfdG9fbGUzMih3bC0+YmFzaWNfcmF0ZSk7CisJYWN4LT5yYXRlX3BvbGljeV9pZHggPSBjcHVfdG9fbGUzMih3bHZpZi0+c3RhLmJhc2ljX3JhdGVfaWR4KTsKKwlhY3gtPnJhdGVfcG9saWN5LmVuYWJsZWRfcmF0ZXMgPSBjcHVfdG9fbGUzMih3bHZpZi0+YmFzaWNfcmF0ZSk7CiAJYWN4LT5yYXRlX3BvbGljeS5zaG9ydF9yZXRyeV9saW1pdCA9IGMtPnNob3J0X3JldHJ5X2xpbWl0OwogCWFjeC0+cmF0ZV9wb2xpY3kubG9uZ19yZXRyeV9saW1pdCA9IGMtPmxvbmdfcmV0cnlfbGltaXQ7CiAJYWN4LT5yYXRlX3BvbGljeS5hZmxhZ3MgPSBjLT5hZmxhZ3M7CkBAIC03NzEsOCArNzU0LDggQEAKIAl9CiAKIAkvKiBjb25maWd1cmUgb25lIEFQIHN1cHBvcnRlZCByYXRlIGNsYXNzICovCi0JYWN4LT5yYXRlX3BvbGljeV9pZHggPSBjcHVfdG9fbGUzMihBQ1hfVFhfQVBfRlVMTF9SQVRFKTsKLQlhY3gtPnJhdGVfcG9saWN5LmVuYWJsZWRfcmF0ZXMgPSBjcHVfdG9fbGUzMih3bC0+cmF0ZV9zZXQpOworCWFjeC0+cmF0ZV9wb2xpY3lfaWR4ID0gY3B1X3RvX2xlMzIod2x2aWYtPnN0YS5hcF9yYXRlX2lkeCk7CisJYWN4LT5yYXRlX3BvbGljeS5lbmFibGVkX3JhdGVzID0gY3B1X3RvX2xlMzIod2x2aWYtPnJhdGVfc2V0KTsKIAlhY3gtPnJhdGVfcG9saWN5LnNob3J0X3JldHJ5X2xpbWl0ID0gYy0+c2hvcnRfcmV0cnlfbGltaXQ7CiAJYWN4LT5yYXRlX3BvbGljeS5sb25nX3JldHJ5X2xpbWl0ID0gYy0+bG9uZ19yZXRyeV9saW1pdDsKIAlhY3gtPnJhdGVfcG9saWN5LmFmbGFncyA9IGMtPmFmbGFnczsKQEAgLTc4OCw3ICs3NzEsNyBAQAogCSAqIChwMnAgcGFja2V0cyBzaG91bGQgYWx3YXlzIGdvIG91dCB3aXRoIE9GRE0gcmF0ZXMsIGV2ZW4KIAkgKiBpZiB3ZSBhcmUgY3VycmVudGx5IGNvbm5lY3RlZCB0byAxMWIgQVApCiAJICovCi0JYWN4LT5yYXRlX3BvbGljeV9pZHggPSBjcHVfdG9fbGUzMihBQ1hfVFhfQkFTSUNfUkFURV9QMlApOworCWFjeC0+cmF0ZV9wb2xpY3lfaWR4ID0gY3B1X3RvX2xlMzIod2x2aWYtPnN0YS5wMnBfcmF0ZV9pZHgpOwogCWFjeC0+cmF0ZV9wb2xpY3kuZW5hYmxlZF9yYXRlcyA9CiAJCQkJY3B1X3RvX2xlMzIoQ09ORl9UWF9SQVRFX01BU0tfQkFTSUNfUDJQKTsKIAlhY3gtPnJhdGVfcG9saWN5LnNob3J0X3JldHJ5X2xpbWl0ID0gYy0+c2hvcnRfcmV0cnlfbGltaXQ7CkBAIC04MzksOCArODIyLDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9hY19jZmcoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGFjLCB1OCBjd19taW4sIHUxNiBjd19tYXgsCi0JCSAgICAgIHU4IGFpZnNuLCB1MTYgdHhvcCkKK2ludCB3bDEyNzFfYWN4X2FjX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICB1OCBhYywgdTggY3dfbWluLCB1MTYgY3dfbWF4LCB1OCBhaWZzbiwgdTE2IHR4b3ApCiB7CiAJc3RydWN0IGFjeF9hY19jZmcgKmFjeDsKIAlpbnQgcmV0ID0gMDsKQEAgLTg1NSw3ICs4MzgsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPmFjID0gYWM7CiAJYWN4LT5jd19taW4gPSBjd19taW47CiAJYWN4LT5jd19tYXggPSBjcHVfdG9fbGUxNihjd19tYXgpOwpAQCAtODczLDcgKzg1Niw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfdGlkX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggcXVldWVfaWQsIHU4IGNoYW5uZWxfdHlwZSwKK2ludCB3bDEyNzFfYWN4X3RpZF9jZmcoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgICAgIHU4IHF1ZXVlX2lkLCB1OCBjaGFubmVsX3R5cGUsCiAJCSAgICAgICB1OCB0c2lkLCB1OCBwc19zY2hlbWUsIHU4IGFja19wb2xpY3ksCiAJCSAgICAgICB1MzIgYXBzZF9jb25mMCwgdTMyIGFwc2RfY29uZjEpCiB7CkBAIC04ODksNyArODczLDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5xdWV1ZV9pZCA9IHF1ZXVlX2lkOwogCWFjeC0+Y2hhbm5lbF90eXBlID0gY2hhbm5lbF90eXBlOwogCWFjeC0+dHNpZCA9IHRzaWQ7CkBAIC0xMDk4LDcgKzEwODIsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X2JldF9lbmFibGUoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQoraW50IHdsMTI3MV9hY3hfYmV0X2VuYWJsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICBib29sIGVuYWJsZSkKIHsKIAlzdHJ1Y3Qgd2wxMjcxX2FjeF9iZXRfZW5hYmxlICphY3ggPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtMTExNCw3ICsxMDk5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5lbmFibGUgPSBlbmFibGUgPyBDT05GX0JFVF9NT0RFX0VOQUJMRSA6IENPTkZfQkVUX01PREVfRElTQUJMRTsKIAlhY3gtPm1heF9jb25zZWN1dGl2ZSA9IHdsLT5jb25mLmNvbm4uYmV0X21heF9jb25zZWN1dGl2ZTsKIApAQCAtMTEyOSw3ICsxMTE0LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9hcnBfaXBfZmlsdGVyKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBlbmFibGUsIF9fYmUzMiBhZGRyZXNzKQoraW50IHdsMTI3MV9hY3hfYXJwX2lwX2ZpbHRlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICAgICB1OCBlbmFibGUsIF9fYmUzMiBhZGRyZXNzKQogewogCXN0cnVjdCB3bDEyNzFfYWN4X2FycF9maWx0ZXIgKmFjeDsKIAlpbnQgcmV0OwpAQCAtMTE0Miw3ICsxMTI4LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT52ZXJzaW9uID0gQUNYX0lQVjRfVkVSU0lPTjsKIAlhY3gtPmVuYWJsZSA9IGVuYWJsZTsKIApAQCAtMTE4OSw3ICsxMTc1LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9rZWVwX2FsaXZlX21vZGUoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQoraW50IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgICAgYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlICphY3ggPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtMTIwMiw3ICsxMTg5LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5lbmFibGVkID0gZW5hYmxlOwogCiAJcmV0ID0gd2wxMjcxX2NtZF9jb25maWd1cmUod2wsIEFDWF9LRUVQX0FMSVZFX01PREUsIGFjeCwgc2l6ZW9mKCphY3gpKTsKQEAgLTEyMTYsNyArMTIwMyw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9jb25maWcoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGluZGV4LCB1OCB0cGxfdmFsaWQpCitpbnQgd2wxMjcxX2FjeF9rZWVwX2FsaXZlX2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSB1OCBpbmRleCwgdTggdHBsX3ZhbGlkKQogewogCXN0cnVjdCB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfY29uZmlnICphY3ggPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtMTIyOSw3ICsxMjE3LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JYWN4LT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJYWN4LT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAJYWN4LT5wZXJpb2QgPSBjcHVfdG9fbGUzMih3bC0+Y29uZi5jb25uLmtlZXBfYWxpdmVfaW50ZXJ2YWwpOwogCWFjeC0+aW5kZXggPSBpbmRleDsKIAlhY3gtPnRwbF92YWxpZGF0aW9uID0gdHBsX3ZhbGlkOwpAQCAtMTI0Nyw4ICsxMjM1LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9yc3NpX3Nucl90cmlnZ2VyKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSwKLQkJCQlzMTYgdGhvbGQsIHU4IGh5c3QpCitpbnQgd2wxMjcxX2FjeF9yc3NpX3Nucl90cmlnZ2VyKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJYm9vbCBlbmFibGUsIHMxNiB0aG9sZCwgdTggaHlzdCkKIHsKIAlzdHJ1Y3Qgd2wxMjcxX2FjeF9yc3NpX3Nucl90cmlnZ2VyICphY3ggPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtMTI2MSw5ICsxMjQ5LDkgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jd2wtPmxhc3RfcnNzaV9ldmVudCA9IC0xOworCXdsdmlmLT5sYXN0X3Jzc2lfZXZlbnQgPSAtMTsKIAotCWFjeC0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWFjeC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWFjeC0+cGFjaW5nID0gY3B1X3RvX2xlMTYod2wtPmNvbmYucm9hbV90cmlnZ2VyLnRyaWdnZXJfcGFjaW5nKTsKIAlhY3gtPm1ldHJpYyA9IFdMMTI3MV9BQ1hfVFJJR19NRVRSSUNfUlNTSV9CRUFDT047CiAJYWN4LT50eXBlID0gV0wxMjcxX0FDWF9UUklHX1RZUEVfRURHRTsKQEAgLTEyODgsNyArMTI3Niw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfcnNzaV9zbnJfYXZnX3dlaWdodHMoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FjeF9yc3NpX3Nucl9hdmdfd2VpZ2h0cyhzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCXN0cnVjdCB3bDEyNzFfYWN4X3Jzc2lfc25yX2F2Z193ZWlnaHRzICphY3ggPSBOVUxMOwogCXN0cnVjdCBjb25mX3JvYW1fdHJpZ2dlcl9zZXR0aW5ncyAqYyA9ICZ3bC0+Y29uZi5yb2FtX3RyaWdnZXI7CkBAIC0xMzAyLDcgKzEyOTEsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPnJzc2lfYmVhY29uID0gYy0+YXZnX3dlaWdodF9yc3NpX2JlYWNvbjsKIAlhY3gtPnJzc2lfZGF0YSA9IGMtPmF2Z193ZWlnaHRfcnNzaV9kYXRhOwogCWFjeC0+c25yX2JlYWNvbiA9IGMtPmF2Z193ZWlnaHRfc25yX2JlYWNvbjsKQEAgLTEzNjcsNiArMTM1Niw3IEBACiB9CiAKIGludCB3bDEyNzFfYWN4X3NldF9odF9pbmZvcm1hdGlvbihzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCiAJCQkJICAgdTE2IGh0X29wZXJhdGlvbl9tb2RlKQogewogCXN0cnVjdCB3bDEyNzFfYWN4X2h0X2luZm9ybWF0aW9uICphY3g7CkBAIC0xMzgwLDcgKzEzNzAsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPmh0X3Byb3RlY3Rpb24gPQogCQkodTgpKGh0X29wZXJhdGlvbl9tb2RlICYgSUVFRTgwMjExX0hUX09QX01PREVfUFJPVEVDVElPTik7CiAJYWN4LT5yaWZzX21vZGUgPSAwOwpAQCAtMTQwMiw3ICsxMzkyLDggQEAKIH0KIAogLyogQ29uZmlndXJlIEJBIHNlc3Npb24gaW5pdGlhdG9yL3JlY2VpdmVyIHBhcmFtZXRlcnMgc2V0dGluZyBpbiB0aGUgRlcuICovCi1pbnQgd2wxMnh4X2FjeF9zZXRfYmFfaW5pdGlhdG9yX3BvbGljeShzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyeHhfYWN4X3NldF9iYV9pbml0aWF0b3JfcG9saWN5KHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHdsMTI3MV9hY3hfYmFfaW5pdGlhdG9yX3BvbGljeSAqYWN4OwogCWludCByZXQ7CkBAIC0xNDE2LDcgKzE0MDcsNyBAQAogCX0KIAogCS8qIHNldCBmb3IgdGhlIGN1cnJlbnQgcm9sZSAqLwotCWFjeC0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWFjeC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWFjeC0+dGlkX2JpdG1hcCA9IHdsLT5jb25mLmh0LnR4X2JhX3RpZF9iaXRtYXA7CiAJYWN4LT53aW5fc2l6ZSA9IHdsLT5jb25mLmh0LnR4X2JhX3dpbl9zaXplOwogCWFjeC0+aW5hY3Rpdml0eV90aW1lb3V0ID0gd2wtPmNvbmYuaHQuaW5hY3Rpdml0eV90aW1lb3V0OwpAQCAtMTQ5NCw3ICsxNDg1LDggQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2FjeF9wc19yeF9zdHJlYW1pbmcoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQoraW50IHdsMTI3MV9hY3hfcHNfcnhfc3RyZWFtaW5nKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgICAgYm9vbCBlbmFibGUpCiB7CiAJc3RydWN0IHdsMTI3MV9hY3hfcHNfcnhfc3RyZWFtaW5nICpyeF9zdHJlYW1pbmc7CiAJdTMyIGNvbmZfcXVldWVzLCBlbmFibGVfcXVldWVzOwpAQCAtMTUyMyw3ICsxNTE1LDcgQEAKIAkJaWYgKCEoY29uZl9xdWV1ZXMgJiBCSVQoaSkpKQogCQkJY29udGludWU7CiAKLQkJcnhfc3RyZWFtaW5nLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJCXJ4X3N0cmVhbWluZy0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCQlyeF9zdHJlYW1pbmctPnRpZCA9IGk7CiAJCXJ4X3N0cmVhbWluZy0+ZW5hYmxlID0gZW5hYmxlX3F1ZXVlcyAmIEJJVChpKTsKIAkJcnhfc3RyZWFtaW5nLT5wZXJpb2QgPSB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuaW50ZXJ2YWw7CkBAIC0xNTQyLDcgKzE1MzQsNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfYWN4X2FwX21heF90eF9yZXRyeShzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyNzFfYWN4X2FwX21heF90eF9yZXRyeShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCXN0cnVjdCB3bDEyNzFfYWN4X2FwX21heF90eF9yZXRyeSAqYWN4ID0gTlVMTDsKIAlpbnQgcmV0OwpAQCAtMTU1Myw3ICsxNTQ1LDcgQEAKIAlpZiAoIWFjeCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlhY3gtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlhY3gtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlhY3gtPm1heF90eF9yZXRyeSA9IGNwdV90b19sZTE2KHdsLT5jb25mLnR4Lm1heF90eF9yZXRyaWVzKTsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfTUFYX1RYX0ZBSUxVUkUsIGFjeCwgc2l6ZW9mKCphY3gpKTsKQEAgLTE1NjcsNyArMTU1OSw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9hY3hfY29uZmlnX3BzKHN0cnVjdCB3bDEyNzEgKndsKQoraW50IHdsMTJ4eF9hY3hfY29uZmlnX3BzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHdsMTI3MV9hY3hfY29uZmlnX3BzICpjb25maWdfcHM7CiAJaW50IHJldDsKQEAgLTE1ODIsNyArMTU3NCw3IEBACiAKIAljb25maWdfcHMtPmV4aXRfcmV0cmllcyA9IHdsLT5jb25mLmNvbm4ucHNtX2V4aXRfcmV0cmllczsKIAljb25maWdfcHMtPmVudGVyX3JldHJpZXMgPSB3bC0+Y29uZi5jb25uLnBzbV9lbnRyeV9yZXRyaWVzOwotCWNvbmZpZ19wcy0+bnVsbF9kYXRhX3JhdGUgPSBjcHVfdG9fbGUzMih3bC0+YmFzaWNfcmF0ZSk7CisJY29uZmlnX3BzLT5udWxsX2RhdGFfcmF0ZSA9IGNwdV90b19sZTMyKHdsdmlmLT5iYXNpY19yYXRlKTsKIAogCXJldCA9IHdsMTI3MV9jbWRfY29uZmlndXJlKHdsLCBBQ1hfQ09ORklHX1BTLCBjb25maWdfcHMsCiAJCQkJICAgc2l6ZW9mKCpjb25maWdfcHMpKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9hY3guaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9hY3guaAppbmRleCBlM2Y5M2I0Li42OTg5MmI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYWN4LmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2FjeC5oCkBAIC0xNzEsMTMgKzE3MSw2IEBACiAJX19sZTMyIGxpZmV0aW1lOwogfSBfX3BhY2tlZDsKIAotc3RydWN0IGFjeF9wYWNrZXRfZGV0ZWN0aW9uIHsKLQlzdHJ1Y3QgYWN4X2hlYWRlciBoZWFkZXI7Ci0KLQlfX2xlMzIgdGhyZXNob2xkOwotfSBfX3BhY2tlZDsKLQotCiBlbnVtIGFjeF9zbG90X3R5cGUgewogCVNMT1RfVElNRV9MT05HID0gMCwKIAlTTE9UX1RJTUVfU0hPUlQgPSAxLApAQCAtNjU0LDExICs2NDcsNiBAQAogCXU4IHJlc2VydmVkOwogfTsKIAotI2RlZmluZSBBQ1hfVFhfQkFTSUNfUkFURSAgICAgIDAKLSNkZWZpbmUgQUNYX1RYX0FQX0ZVTExfUkFURSAgICAxCi0jZGVmaW5lIEFDWF9UWF9CQVNJQ19SQVRFX1AyUCAgMgotI2RlZmluZSBBQ1hfVFhfQVBfTU9ERV9NR01UX1JBVEUgNAotI2RlZmluZSBBQ1hfVFhfQVBfTU9ERV9CQ1NUX1JBVEUgNQogc3RydWN0IGFjeF9yYXRlX3BvbGljeSB7CiAJc3RydWN0IGFjeF9oZWFkZXIgaGVhZGVyOwogCkBAIC0xMjM0LDM5ICsxMjIyLDQ4IEBACiB9OwogCiAKLWludCB3bDEyNzFfYWN4X3dha2VfdXBfY29uZGl0aW9ucyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CitpbnQgd2wxMjcxX2FjeF93YWtlX3VwX2NvbmRpdGlvbnMoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOwogaW50IHdsMTI3MV9hY3hfc2xlZXBfYXV0aChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggc2xlZXBfYXV0aCk7Ci1pbnQgd2wxMjcxX2FjeF90eF9wb3dlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IHBvd2VyKTsKLWludCB3bDEyNzFfYWN4X2ZlYXR1cmVfY2ZnKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfYWN4X3R4X3Bvd2VyKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQlpbnQgcG93ZXIpOworaW50IHdsMTI3MV9hY3hfZmVhdHVyZV9jZmcoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiBpbnQgd2wxMjcxX2FjeF9tZW1fbWFwKHN0cnVjdCB3bDEyNzEgKndsLAogCQkgICAgICAgc3RydWN0IGFjeF9oZWFkZXIgKm1lbV9tYXAsIHNpemVfdCBsZW4pOwogaW50IHdsMTI3MV9hY3hfcnhfbXNkdV9saWZlX3RpbWUoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9hY3hfcGRfdGhyZXNob2xkKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfYWN4X3Nsb3Qoc3RydWN0IHdsMTI3MSAqd2wsIGVudW0gYWN4X3Nsb3RfdHlwZSBzbG90X3RpbWUpOwotaW50IHdsMTI3MV9hY3hfZ3JvdXBfYWRkcmVzc190Ymwoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlLAotCQkJCSB2b2lkICptY19saXN0LCB1MzIgbWNfbGlzdF9sZW4pOwotaW50IHdsMTI3MV9hY3hfc2VydmljZV9wZXJpb2RfdGltZW91dChzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2FjeF9ydHNfdGhyZXNob2xkKHN0cnVjdCB3bDEyNzEgKndsLCB1MzIgcnRzX3RocmVzaG9sZCk7CitpbnQgd2wxMjcxX2FjeF9zbG90KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCSAgICBlbnVtIGFjeF9zbG90X3R5cGUgc2xvdF90aW1lKTsKK2ludCB3bDEyNzFfYWN4X2dyb3VwX2FkZHJlc3NfdGJsKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJIGJvb2wgZW5hYmxlLCB2b2lkICptY19saXN0LCB1MzIgbWNfbGlzdF9sZW4pOworaW50IHdsMTI3MV9hY3hfc2VydmljZV9wZXJpb2RfdGltZW91dChzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOworaW50IHdsMTI3MV9hY3hfcnRzX3RocmVzaG9sZChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICAgICB1MzIgcnRzX3RocmVzaG9sZCk7CiBpbnQgd2wxMjcxX2FjeF9kY29faXRyaW1fcGFyYW1zKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZV9maWx0ZXIpOwotaW50IHdsMTI3MV9hY3hfYmVhY29uX2ZpbHRlcl90YWJsZShzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpOworaW50IHdsMTI3MV9hY3hfYmVhY29uX2ZpbHRlcl9vcHQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCQkgYm9vbCBlbmFibGVfZmlsdGVyKTsKK2ludCB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfdGFibGUoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyNzFfYWN4X2Nvbm5fbW9uaXRfcGFyYW1zKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJIGJvb2wgZW5hYmxlKTsKIGludCB3bDEyNzFfYWN4X3NnX2VuYWJsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpOwogaW50IHdsMTJ4eF9hY3hfc2dfY2ZnKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyNzFfYWN4X2NjYV90aHJlc2hvbGQoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9hY3hfYmNuX2R0aW1fb3B0aW9ucyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2FjeF9haWQoc3RydWN0IHdsMTI3MSAqd2wsIHUxNiBhaWQpOworaW50IHdsMTI3MV9hY3hfYmNuX2R0aW1fb3B0aW9ucyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyNzFfYWN4X2FpZChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLCB1MTYgYWlkKTsKIGludCB3bDEyNzFfYWN4X2V2ZW50X21ib3hfbWFzayhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIGV2ZW50X21hc2spOwotaW50IHdsMTI3MV9hY3hfc2V0X3ByZWFtYmxlKHN0cnVjdCB3bDEyNzEgKndsLCBlbnVtIGFjeF9wcmVhbWJsZV90eXBlIHByZWFtYmxlKTsKLWludCB3bDEyNzFfYWN4X2N0c19wcm90ZWN0KHN0cnVjdCB3bDEyNzEgKndsLAoraW50IHdsMTI3MV9hY3hfc2V0X3ByZWFtYmxlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgZW51bSBhY3hfcHJlYW1ibGVfdHlwZSBwcmVhbWJsZSk7CitpbnQgd2wxMjcxX2FjeF9jdHNfcHJvdGVjdChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAogCQkJICAgZW51bSBhY3hfY3RzcHJvdGVjdF90eXBlIGN0c3Byb3RlY3QpOwogaW50IHdsMTI3MV9hY3hfc3RhdGlzdGljcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IGFjeF9zdGF0aXN0aWNzICpzdGF0cyk7Ci1pbnQgd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CitpbnQgd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKIGludCB3bDEyNzFfYWN4X2FwX3JhdGVfcG9saWN5KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgY29uZl90eF9yYXRlX2NsYXNzICpjLAogCQkgICAgICB1OCBpZHgpOwotaW50IHdsMTI3MV9hY3hfYWNfY2ZnKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBhYywgdTggY3dfbWluLCB1MTYgY3dfbWF4LAotCQkgICAgICB1OCBhaWZzbiwgdTE2IHR4b3ApOwotaW50IHdsMTI3MV9hY3hfdGlkX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggcXVldWVfaWQsIHU4IGNoYW5uZWxfdHlwZSwKK2ludCB3bDEyNzFfYWN4X2FjX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICB1OCBhYywgdTggY3dfbWluLCB1MTYgY3dfbWF4LCB1OCBhaWZzbiwgdTE2IHR4b3ApOworaW50IHdsMTI3MV9hY3hfdGlkX2NmZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICAgdTggcXVldWVfaWQsIHU4IGNoYW5uZWxfdHlwZSwKIAkJICAgICAgIHU4IHRzaWQsIHU4IHBzX3NjaGVtZSwgdTggYWNrX3BvbGljeSwKIAkJICAgICAgIHUzMiBhcHNkX2NvbmYwLCB1MzIgYXBzZF9jb25mMSk7CiBpbnQgd2wxMjcxX2FjeF9mcmFnX3RocmVzaG9sZChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIGZyYWdfdGhyZXNob2xkKTsKQEAgLTEyNzYsMjYgKzEyNzMsMzQgQEAKIGludCB3bDEyNzFfYWN4X2hvc3RfaWZfY2ZnX2JpdG1hcChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIGhvc3RfY2ZnX2JpdG1hcCk7CiBpbnQgd2wxMjcxX2FjeF9pbml0X3J4X2ludGVycnVwdChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjcxX2FjeF9zbWFydF9yZWZsZXgoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9hY3hfYmV0X2VuYWJsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpOwotaW50IHdsMTI3MV9hY3hfYXJwX2lwX2ZpbHRlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggZW5hYmxlLCBfX2JlMzIgYWRkcmVzcyk7CitpbnQgd2wxMjcxX2FjeF9iZXRfZW5hYmxlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgIGJvb2wgZW5hYmxlKTsKK2ludCB3bDEyNzFfYWN4X2FycF9pcF9maWx0ZXIoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICAgdTggZW5hYmxlLCBfX2JlMzIgYWRkcmVzcyk7CiBpbnQgd2wxMjcxX2FjeF9wbV9jb25maWcoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSk7Ci1pbnQgd2wxMjcxX2FjeF9rZWVwX2FsaXZlX2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaW5kZXgsIHU4IHRwbF92YWxpZCk7Ci1pbnQgd2wxMjcxX2FjeF9yc3NpX3Nucl90cmlnZ2VyKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSwKLQkJCQlzMTYgdGhvbGQsIHU4IGh5c3QpOwotaW50IHdsMTI3MV9hY3hfcnNzaV9zbnJfYXZnX3dlaWdodHMoc3RydWN0IHdsMTI3MSAqd2wpOworaW50IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqdmlmLAorCQkJICAgICAgIGJvb2wgZW5hYmxlKTsKK2ludCB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJIHU4IGluZGV4LCB1OCB0cGxfdmFsaWQpOworaW50IHdsMTI3MV9hY3hfcnNzaV9zbnJfdHJpZ2dlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCWJvb2wgZW5hYmxlLCBzMTYgdGhvbGQsIHU4IGh5c3QpOworaW50IHdsMTI3MV9hY3hfcnNzaV9zbnJfYXZnX3dlaWdodHMoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiBpbnQgd2wxMjcxX2FjeF9zZXRfaHRfY2FwYWJpbGl0aWVzKHN0cnVjdCB3bDEyNzEgKndsLAogCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCwKIAkJCQkgICAgYm9vbCBhbGxvd19odF9vcGVyYXRpb24sIHU4IGhsaWQpOwogaW50IHdsMTI3MV9hY3hfc2V0X2h0X2luZm9ybWF0aW9uKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKIAkJCQkgICB1MTYgaHRfb3BlcmF0aW9uX21vZGUpOwotaW50IHdsMTJ4eF9hY3hfc2V0X2JhX2luaXRpYXRvcl9wb2xpY3koc3RydWN0IHdsMTI3MSAqd2wpOworaW50IHdsMTJ4eF9hY3hfc2V0X2JhX2luaXRpYXRvcl9wb2xpY3koc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiBpbnQgd2wxMnh4X2FjeF9zZXRfYmFfcmVjZWl2ZXJfc2Vzc2lvbihzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggdGlkX2luZGV4LAogCQkJCSAgICAgICB1MTYgc3NuLCBib29sIGVuYWJsZSwgdTggcGVlcl9obGlkKTsKIGludCB3bDEyNzFfYWN4X3RzZl9pbmZvKHN0cnVjdCB3bDEyNzEgKndsLCB1NjQgKm1hY3RpbWUpOwotaW50IHdsMTI3MV9hY3hfcHNfcnhfc3RyZWFtaW5nKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSk7Ci1pbnQgd2wxMjcxX2FjeF9hcF9tYXhfdHhfcmV0cnkoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9hY3hfY29uZmlnX3BzKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfYWN4X3BzX3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICAgICAgIGJvb2wgZW5hYmxlKTsKK2ludCB3bDEyNzFfYWN4X2FwX21heF90eF9yZXRyeShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyeHhfYWN4X2NvbmZpZ19wcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKIGludCB3bDEyNzFfYWN4X3NldF9pbmNvbm5lY3Rpb25fc3RhKHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqYWRkcik7CiBpbnQgd2wxMjcxX2FjeF9mbV9jb2V4KHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyeHhfYWN4X3NldF9yYXRlX21nbXRfcGFyYW1zKHN0cnVjdCB3bDEyNzEgKndsKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ib290LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvYm9vdC5jCmluZGV4IDY4MTMzNzkuLjhmOWNmNWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ib290LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2Jvb3QuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3dsMTJ4eC5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJhY3guaCIKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJib290LmgiCkBAIC0zNDcsNiArMzQ4LDkgQEAKIAkJbnZzX3B0ciArPSAzOwogCiAJCWZvciAoaSA9IDA7IGkgPCBidXJzdF9sZW47IGkrKykgeworCQkJaWYgKG52c19wdHIgKyAzID49ICh1OCAqKSB3bC0+bnZzICsgbnZzX2xlbikKKwkJCQlnb3RvIG91dF9iYWRudnM7CisKIAkJCXZhbCA9IChudnNfcHRyWzBdIHwgKG52c19wdHJbMV0gPDwgOCkKIAkJCSAgICAgICB8IChudnNfcHRyWzJdIDw8IDE2KSB8IChudnNfcHRyWzNdIDw8IDI0KSk7CiAKQEAgLTM1OCw2ICszNjIsOSBAQAogCQkJbnZzX3B0ciArPSA0OwogCQkJZGVzdF9hZGRyICs9IDQ7CiAJCX0KKworCQlpZiAobnZzX3B0ciA+PSAodTggKikgd2wtPm52cyArIG52c19sZW4pCisJCQlnb3RvIG91dF9iYWRudnM7CiAJfQogCiAJLyoKQEAgLTM2OSw2ICszNzYsMTAgQEAKIAkgKi8KIAludnNfcHRyID0gKHU4ICopd2wtPm52cyArCiAJCQlBTElHTihudnNfcHRyIC0gKHU4ICopd2wtPm52cyArIDcsIDQpOworCisJaWYgKG52c19wdHIgPj0gKHU4ICopIHdsLT5udnMgKyBudnNfbGVuKQorCQlnb3RvIG91dF9iYWRudnM7CisKIAludnNfbGVuIC09IG52c19wdHIgLSAodTggKil3bC0+bnZzOwogCiAJLyogTm93IHdlIG11c3Qgc2V0IHRoZSBwYXJ0aXRpb24gY29ycmVjdGx5ICovCkBAIC0zODQsNiArMzk1LDEwIEBACiAKIAlrZnJlZShudnNfYWxpZ25lZCk7CiAJcmV0dXJuIDA7CisKK291dF9iYWRudnM6CisJd2wxMjcxX2Vycm9yKCJudnMgZGF0YSBpcyBtYWxmb3JtZWQiKTsKKwlyZXR1cm4gLUVJTFNFUTsKIH0KIAogc3RhdGljIHZvaWQgd2wxMjcxX2Jvb3RfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHdsMTI3MSAqd2wpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY21kLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY21kLmMKaW5kZXggYTUyMjk5ZS4uMjU5OTBiZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NtZC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jbWQuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgIndsMTJ4eC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiaW8uaCIKICNpbmNsdWRlICJhY3guaCIKQEAgLTEyMCw2ICsxMjEsMTEgQEAKIAlpZiAoIXdsLT5udnMpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWYgKGdwLT50eF9iaXBfZmVtX21hbnVmYWN0dXJlciA+PSBXTDEyNzFfSU5JX0ZFTV9NT0RVTEVfQ09VTlQpIHsKKwkJd2wxMjcxX3dhcm5pbmcoIkZFTSBpbmRleCBmcm9tIElOSSBvdXQgb2YgYm91bmRzIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWdlbl9wYXJtcyA9IGt6YWxsb2Moc2l6ZW9mKCpnZW5fcGFybXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdlbl9wYXJtcykKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xNDMsNiArMTQ5LDEyIEBACiAJZ3AtPnR4X2JpcF9mZW1fbWFudWZhY3R1cmVyID0KIAkJZ2VuX3Bhcm1zLT5nZW5lcmFsX3BhcmFtcy50eF9iaXBfZmVtX21hbnVmYWN0dXJlcjsKIAorCWlmIChncC0+dHhfYmlwX2ZlbV9tYW51ZmFjdHVyZXIgPj0gV0wxMjcxX0lOSV9GRU1fTU9EVUxFX0NPVU5UKSB7CisJCXdsMTI3MV93YXJuaW5nKCJGRU0gaW5kZXggZnJvbSBGVyBvdXQgb2YgYm91bmRzIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJGRU0gYXV0b2RldGVjdDogJXMsIG1hbnVmYWN0dXJlcjogJWRcbiIsCiAJCSAgICAgYW5zd2VyID8gImF1dG8iIDogIm1hbnVhbCIsIGdwLT50eF9iaXBfZmVtX21hbnVmYWN0dXJlcik7CiAKQEAgLTE2Miw2ICsxNzQsMTEgQEAKIAlpZiAoIXdsLT5udnMpCiAJCXJldHVybiAtRU5PREVWOwogCisJaWYgKGdwLT50eF9iaXBfZmVtX21hbnVmYWN0dXJlciA+PSBXTDEyNzFfSU5JX0ZFTV9NT0RVTEVfQ09VTlQpIHsKKwkJd2wxMjcxX3dhcm5pbmcoIkZFTSBpbmRleCBmcm9tIGluaSBvdXQgb2YgYm91bmRzIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwogCWdlbl9wYXJtcyA9IGt6YWxsb2Moc2l6ZW9mKCpnZW5fcGFybXMpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWdlbl9wYXJtcykKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xODYsNiArMjAzLDEyIEBACiAJZ3AtPnR4X2JpcF9mZW1fbWFudWZhY3R1cmVyID0KIAkJZ2VuX3Bhcm1zLT5nZW5lcmFsX3BhcmFtcy50eF9iaXBfZmVtX21hbnVmYWN0dXJlcjsKIAorCWlmIChncC0+dHhfYmlwX2ZlbV9tYW51ZmFjdHVyZXIgPj0gV0wxMjcxX0lOSV9GRU1fTU9EVUxFX0NPVU5UKSB7CisJCXdsMTI3MV93YXJuaW5nKCJGRU0gaW5kZXggZnJvbSBGVyBvdXQgb2YgYm91bmRzIik7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKwogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJGRU0gYXV0b2RldGVjdDogJXMsIG1hbnVmYWN0dXJlcjogJWRcbiIsCiAJCSAgICAgYW5zd2VyID8gImF1dG8iIDogIm1hbnVhbCIsIGdwLT50eF9iaXBfZmVtX21hbnVmYWN0dXJlcik7CiAKQEAgLTM1OCw3ICszODEsOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgd2wxMnh4X2NtZF9yb2xlX2VuYWJsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggcm9sZV90eXBlLCB1OCAqcm9sZV9pZCkKK2ludCB3bDEyeHhfY21kX3JvbGVfZW5hYmxlKHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqYWRkciwgdTggcm9sZV90eXBlLAorCQkJICAgdTggKnJvbGVfaWQpCiB7CiAJc3RydWN0IHdsMTJ4eF9jbWRfcm9sZV9lbmFibGUgKmNtZDsKIAlpbnQgcmV0OwpAQCAtMzgxLDcgKzQwNSw3IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0JbWVtY3B5KGNtZC0+bWFjX2FkZHJlc3MsIHdsLT5tYWNfYWRkciwgRVRIX0FMRU4pOworCW1lbWNweShjbWQtPm1hY19hZGRyZXNzLCBhZGRyLCBFVEhfQUxFTik7CiAJY21kLT5yb2xlX3R5cGUgPSByb2xlX3R5cGU7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3NlbmQod2wsIENNRF9ST0xFX0VOQUJMRSwgY21kLCBzaXplb2YoKmNtZCksIDApOwpAQCAtNDMzLDM3ICs0NTcsNDEgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdsMTJ4eF9hbGxvY2F0ZV9saW5rKHN0cnVjdCB3bDEyNzEgKndsLCB1OCAqaGxpZCkKK2ludCB3bDEyeHhfYWxsb2NhdGVfbGluayhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLCB1OCAqaGxpZCkKIHsKIAl1OCBsaW5rID0gZmluZF9maXJzdF96ZXJvX2JpdCh3bC0+bGlua3NfbWFwLCBXTDEyWFhfTUFYX0xJTktTKTsKIAlpZiAobGluayA+PSBXTDEyWFhfTUFYX0xJTktTKQogCQlyZXR1cm4gLUVCVVNZOwogCiAJX19zZXRfYml0KGxpbmssIHdsLT5saW5rc19tYXApOworCV9fc2V0X2JpdChsaW5rLCB3bHZpZi0+bGlua3NfbWFwKTsKIAkqaGxpZCA9IGxpbms7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHdsMTJ4eF9mcmVlX2xpbmsoc3RydWN0IHdsMTI3MSAqd2wsIHU4ICpobGlkKQordm9pZCB3bDEyeHhfZnJlZV9saW5rKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHU4ICpobGlkKQogewogCWlmICgqaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKQogCQlyZXR1cm47CiAKIAlfX2NsZWFyX2JpdCgqaGxpZCwgd2wtPmxpbmtzX21hcCk7CisJX19jbGVhcl9iaXQoKmhsaWQsIHdsdmlmLT5saW5rc19tYXApOwogCSpobGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKIH0KIAotc3RhdGljIGludCB3bDEyeHhfZ2V0X25ld19zZXNzaW9uX2lkKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyeHhfZ2V0X25ld19zZXNzaW9uX2lkKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewotCWlmICh3bC0+c2Vzc2lvbl9jb3VudGVyID49IFNFU1NJT05fQ09VTlRFUl9NQVgpCi0JCXdsLT5zZXNzaW9uX2NvdW50ZXIgPSAwOworCWlmICh3bHZpZi0+c2Vzc2lvbl9jb3VudGVyID49IFNFU1NJT05fQ09VTlRFUl9NQVgpCisJCXdsdmlmLT5zZXNzaW9uX2NvdW50ZXIgPSAwOwogCi0Jd2wtPnNlc3Npb25fY291bnRlcisrOworCXdsdmlmLT5zZXNzaW9uX2NvdW50ZXIrKzsKIAotCXJldHVybiB3bC0+c2Vzc2lvbl9jb3VudGVyOworCXJldHVybiB3bHZpZi0+c2Vzc2lvbl9jb3VudGVyOwogfQogCi1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2RldihzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2RldihzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3Qgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0ICpjbWQ7CiAJaW50IHJldDsKQEAgLTQ3NCwyMCArNTAyLDIwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdGFydCBkZXYgJWQiLCB3bC0+ZGV2X3JvbGVfaWQpOworCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdGFydCBkZXYgJWQiLCB3bHZpZi0+ZGV2X3JvbGVfaWQpOwogCi0JY21kLT5yb2xlX2lkID0gd2wtPmRldl9yb2xlX2lkOwotCWlmICh3bC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF81R0haKQorCWNtZC0+cm9sZV9pZCA9IHdsdmlmLT5kZXZfcm9sZV9pZDsKKwlpZiAod2x2aWYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJY21kLT5iYW5kID0gV0wxMlhYX0JBTkRfNUdIWjsKLQljbWQtPmNoYW5uZWwgPSB3bC0+Y2hhbm5lbDsKKwljbWQtPmNoYW5uZWwgPSB3bHZpZi0+Y2hhbm5lbDsKIAotCWlmICh3bC0+ZGV2X2hsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkgewotCQlyZXQgPSB3bDEyeHhfYWxsb2NhdGVfbGluayh3bCwgJndsLT5kZXZfaGxpZCk7CisJaWYgKHdsdmlmLT5kZXZfaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKSB7CisJCXJldCA9IHdsMTJ4eF9hbGxvY2F0ZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5kZXZfaGxpZCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9mcmVlOwogCX0KLQljbWQtPmRldmljZS5obGlkID0gd2wtPmRldl9obGlkOwotCWNtZC0+ZGV2aWNlLnNlc3Npb24gPSB3bC0+c2Vzc2lvbl9jb3VudGVyOworCWNtZC0+ZGV2aWNlLmhsaWQgPSB3bHZpZi0+ZGV2X2hsaWQ7CisJY21kLT5kZXZpY2Uuc2Vzc2lvbiA9IHdsdmlmLT5zZXNzaW9uX2NvdW50ZXI7CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAicm9sZSBzdGFydDogcm9sZWlkPSVkLCBobGlkPSVkLCBzZXNzaW9uPSVkIiwKIAkJICAgICBjbWQtPnJvbGVfaWQsIGNtZC0+ZGV2aWNlLmhsaWQsIGNtZC0+ZGV2aWNlLnNlc3Npb24pOwpAQCAtNTAyLDkgKzUzMCw3IEBACiAKIGVycl9obGlkOgogCS8qIGNsZWFyIGxpbmtzIG9uIGVycm9yICovCi0JX19jbGVhcl9iaXQod2wtPmRldl9obGlkLCB3bC0+bGlua3NfbWFwKTsKLQl3bC0+ZGV2X2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOwotCisJd2wxMnh4X2ZyZWVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+ZGV2X2hsaWQpOwogCiBvdXRfZnJlZToKIAlrZnJlZShjbWQpOwpAQCAtNTEzLDEyICs1MzksMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3BfZGV2KHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyeHhfY21kX3JvbGVfc3RvcF9kZXYoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3Qgd2wxMnh4X2NtZF9yb2xlX3N0b3AgKmNtZDsKIAlpbnQgcmV0OwogCi0JaWYgKFdBUk5fT04od2wtPmRldl9obGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpKQorCWlmIChXQVJOX09OKHdsdmlmLT5kZXZfaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAljbWQgPSBremFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0tFUk5FTCk7CkBAIC01MjksNyArNTU2LDcgQEAKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdG9wIGRldiIpOwogCi0JY21kLT5yb2xlX2lkID0gd2wtPmRldl9yb2xlX2lkOworCWNtZC0+cm9sZV9pZCA9IHdsdmlmLT5kZXZfcm9sZV9pZDsKIAljbWQtPmRpc2NfdHlwZSA9IERJU0NPTk5FQ1RfSU1NRURJQVRFOwogCWNtZC0+cmVhc29uID0gY3B1X3RvX2xlMTYoV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQpOwogCkBAIC01NDUsNyArNTcyLDcgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQl3bDEyeHhfZnJlZV9saW5rKHdsLCAmd2wtPmRldl9obGlkKTsKKwl3bDEyeHhfZnJlZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5kZXZfaGxpZCk7CiAKIG91dF9mcmVlOgogCWtmcmVlKGNtZCk7CkBAIC01NTQsOCArNTgxLDkgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOwogCXN0cnVjdCB3bDEyeHhfY21kX3JvbGVfc3RhcnQgKmNtZDsKIAlpbnQgcmV0OwogCkBAIC01NjUsMzMgKzU5MywzMyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIHJvbGUgc3RhcnQgc3RhICVkIiwgd2wtPnJvbGVfaWQpOworCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdGFydCBzdGEgJWQiLCB3bHZpZi0+cm9sZV9pZCk7CiAKLQljbWQtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKLQlpZiAod2wtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwljbWQtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKKwlpZiAod2x2aWYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJY21kLT5iYW5kID0gV0wxMlhYX0JBTkRfNUdIWjsKLQljbWQtPmNoYW5uZWwgPSB3bC0+Y2hhbm5lbDsKLQljbWQtPnN0YS5iYXNpY19yYXRlX3NldCA9IGNwdV90b19sZTMyKHdsLT5iYXNpY19yYXRlX3NldCk7Ci0JY21kLT5zdGEuYmVhY29uX2ludGVydmFsID0gY3B1X3RvX2xlMTYod2wtPmJlYWNvbl9pbnQpOworCWNtZC0+Y2hhbm5lbCA9IHdsdmlmLT5jaGFubmVsOworCWNtZC0+c3RhLmJhc2ljX3JhdGVfc2V0ID0gY3B1X3RvX2xlMzIod2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKKwljbWQtPnN0YS5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNih3bHZpZi0+YmVhY29uX2ludCk7CiAJY21kLT5zdGEuc3NpZF90eXBlID0gV0wxMlhYX1NTSURfVFlQRV9BTlk7Ci0JY21kLT5zdGEuc3NpZF9sZW4gPSB3bC0+c3NpZF9sZW47Ci0JbWVtY3B5KGNtZC0+c3RhLnNzaWQsIHdsLT5zc2lkLCB3bC0+c3NpZF9sZW4pOwotCW1lbWNweShjbWQtPnN0YS5ic3NpZCwgd2wtPmJzc2lkLCBFVEhfQUxFTik7Ci0JY21kLT5zdGEubG9jYWxfcmF0ZXMgPSBjcHVfdG9fbGUzMih3bC0+cmF0ZV9zZXQpOworCWNtZC0+c3RhLnNzaWRfbGVuID0gd2x2aWYtPnNzaWRfbGVuOworCW1lbWNweShjbWQtPnN0YS5zc2lkLCB3bHZpZi0+c3NpZCwgd2x2aWYtPnNzaWRfbGVuKTsKKwltZW1jcHkoY21kLT5zdGEuYnNzaWQsIHZpZi0+YnNzX2NvbmYuYnNzaWQsIEVUSF9BTEVOKTsKKwljbWQtPnN0YS5sb2NhbF9yYXRlcyA9IGNwdV90b19sZTMyKHdsdmlmLT5yYXRlX3NldCk7CiAKLQlpZiAod2wtPnN0YV9obGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpIHsKLQkJcmV0ID0gd2wxMnh4X2FsbG9jYXRlX2xpbmsod2wsICZ3bC0+c3RhX2hsaWQpOworCWlmICh3bHZpZi0+c3RhLmhsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkgeworCQlyZXQgPSB3bDEyeHhfYWxsb2NhdGVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+c3RhLmhsaWQpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXRfZnJlZTsKIAl9Ci0JY21kLT5zdGEuaGxpZCA9IHdsLT5zdGFfaGxpZDsKLQljbWQtPnN0YS5zZXNzaW9uID0gd2wxMnh4X2dldF9uZXdfc2Vzc2lvbl9pZCh3bCk7Ci0JY21kLT5zdGEucmVtb3RlX3JhdGVzID0gY3B1X3RvX2xlMzIod2wtPnJhdGVfc2V0KTsKKwljbWQtPnN0YS5obGlkID0gd2x2aWYtPnN0YS5obGlkOworCWNtZC0+c3RhLnNlc3Npb24gPSB3bDEyeHhfZ2V0X25ld19zZXNzaW9uX2lkKHdsLCB3bHZpZik7CisJY21kLT5zdGEucmVtb3RlX3JhdGVzID0gY3B1X3RvX2xlMzIod2x2aWYtPnJhdGVfc2V0KTsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJyb2xlIHN0YXJ0OiByb2xlaWQ9JWQsIGhsaWQ9JWQsIHNlc3Npb249JWQgIgogCQkgICAgICJiYXNpY19yYXRlX3NldDogMHgleCwgcmVtb3RlX3JhdGVzOiAweCV4IiwKLQkJICAgICB3bC0+cm9sZV9pZCwgY21kLT5zdGEuaGxpZCwgY21kLT5zdGEuc2Vzc2lvbiwKLQkJICAgICB3bC0+YmFzaWNfcmF0ZV9zZXQsIHdsLT5yYXRlX3NldCk7CisJCSAgICAgd2x2aWYtPnJvbGVfaWQsIGNtZC0+c3RhLmhsaWQsIGNtZC0+c3RhLnNlc3Npb24sCisJCSAgICAgd2x2aWYtPmJhc2ljX3JhdGVfc2V0LCB3bHZpZi0+cmF0ZV9zZXQpOwogCiAJcmV0ID0gd2wxMjcxX2NtZF9zZW5kKHdsLCBDTURfUk9MRV9TVEFSVCwgY21kLCBzaXplb2YoKmNtZCksIDApOwogCWlmIChyZXQgPCAwKSB7CkBAIC02MDMsNyArNjMxLDcgQEAKIAogZXJyX2hsaWQ6CiAJLyogY2xlYXIgbGlua3Mgb24gZXJyb3IuICovCi0Jd2wxMnh4X2ZyZWVfbGluayh3bCwgJndsLT5zdGFfaGxpZCk7CisJd2wxMnh4X2ZyZWVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+c3RhLmhsaWQpOwogCiBvdXRfZnJlZToKIAlrZnJlZShjbWQpOwpAQCAtNjEzLDEyICs2NDEsMTIgQEAKIH0KIAogLyogdXNlIHRoaXMgZnVuY3Rpb24gdG8gc3RvcCBpYnNzIGFzIHdlbGwgKi8KLWludCB3bDEyeHhfY21kX3JvbGVfc3RvcF9zdGEoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3Bfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHdsMTJ4eF9jbWRfcm9sZV9zdG9wICpjbWQ7CiAJaW50IHJldDsKIAotCWlmIChXQVJOX09OKHdsLT5zdGFfaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKSkKKwlpZiAoV0FSTl9PTih3bHZpZi0+c3RhLmhsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOwpAQCAtNjI3LDkgKzY1NSw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdG9wIHN0YSAlZCIsIHdsLT5yb2xlX2lkKTsKKwl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIHJvbGUgc3RvcCBzdGEgJWQiLCB3bHZpZi0+cm9sZV9pZCk7CiAKLQljbWQtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwljbWQtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAljbWQtPmRpc2NfdHlwZSA9IERJU0NPTk5FQ1RfSU1NRURJQVRFOwogCWNtZC0+cmVhc29uID0gY3B1X3RvX2xlMTYoV0xBTl9SRUFTT05fVU5TUEVDSUZJRUQpOwogCkBAIC02MzksNyArNjY3LDcgQEAKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQl3bDEyeHhfZnJlZV9saW5rKHdsLCAmd2wtPnN0YV9obGlkKTsKKwl3bDEyeHhfZnJlZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5zdGEuaGxpZCk7CiAKIG91dF9mcmVlOgogCWtmcmVlKGNtZCk7CkBAIC02NDgsMTYgKzY3NiwxNyBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfYXAoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2FwKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHdsMTJ4eF9jbWRfcm9sZV9zdGFydCAqY21kOwotCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mID0gJndsLT52aWYtPmJzc19jb25mOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiA9ICZ2aWYtPmJzc19jb25mOwogCWludCByZXQ7CiAKLQl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIHJvbGUgc3RhcnQgYXAgJWQiLCB3bC0+cm9sZV9pZCk7CisJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCByb2xlIHN0YXJ0IGFwICVkIiwgd2x2aWYtPnJvbGVfaWQpOwogCiAJLyogdHJ5aW5nIHRvIHVzZSBoaWRkZW4gU1NJRCB3aXRoIGFuIG9sZCBob3N0YXBkIHZlcnNpb24gKi8KLQlpZiAod2wtPnNzaWRfbGVuID09IDAgJiYgIWJzc19jb25mLT5oaWRkZW5fc3NpZCkgeworCWlmICh3bHZpZi0+c3NpZF9sZW4gPT0gMCAmJiAhYnNzX2NvbmYtPmhpZGRlbl9zc2lkKSB7CiAJCXdsMTI3MV9lcnJvcigiZ290IGEgbnVsbCBTU0lEIGZyb20gYmVhY29uL2JzcyIpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKQEAgLTY2OSwzMCArNjk4LDMwIEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXJldCA9IHdsMTJ4eF9hbGxvY2F0ZV9saW5rKHdsLCAmd2wtPmFwX2dsb2JhbF9obGlkKTsKKwlyZXQgPSB3bDEyeHhfYWxsb2NhdGVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+YXAuZ2xvYmFsX2hsaWQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9mcmVlOwogCi0JcmV0ID0gd2wxMnh4X2FsbG9jYXRlX2xpbmsod2wsICZ3bC0+YXBfYmNhc3RfaGxpZCk7CisJcmV0ID0gd2wxMnh4X2FsbG9jYXRlX2xpbmsod2wsIHdsdmlmLCAmd2x2aWYtPmFwLmJjYXN0X2hsaWQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9mcmVlX2dsb2JhbDsKIAotCWNtZC0+cm9sZV9pZCA9IHdsLT5yb2xlX2lkOworCWNtZC0+cm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWNtZC0+YXAuYWdpbmdfcGVyaW9kID0gY3B1X3RvX2xlMTYod2wtPmNvbmYudHguYXBfYWdpbmdfcGVyaW9kKTsKIAljbWQtPmFwLmJzc19pbmRleCA9IFdMMTI3MV9BUF9CU1NfSU5ERVg7Ci0JY21kLT5hcC5nbG9iYWxfaGxpZCA9IHdsLT5hcF9nbG9iYWxfaGxpZDsKLQljbWQtPmFwLmJyb2FkY2FzdF9obGlkID0gd2wtPmFwX2JjYXN0X2hsaWQ7Ci0JY21kLT5hcC5iYXNpY19yYXRlX3NldCA9IGNwdV90b19sZTMyKHdsLT5iYXNpY19yYXRlX3NldCk7Ci0JY21kLT5hcC5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNih3bC0+YmVhY29uX2ludCk7CisJY21kLT5hcC5nbG9iYWxfaGxpZCA9IHdsdmlmLT5hcC5nbG9iYWxfaGxpZDsKKwljbWQtPmFwLmJyb2FkY2FzdF9obGlkID0gd2x2aWYtPmFwLmJjYXN0X2hsaWQ7CisJY21kLT5hcC5iYXNpY19yYXRlX3NldCA9IGNwdV90b19sZTMyKHdsdmlmLT5iYXNpY19yYXRlX3NldCk7CisJY21kLT5hcC5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNih3bHZpZi0+YmVhY29uX2ludCk7CiAJY21kLT5hcC5kdGltX2ludGVydmFsID0gYnNzX2NvbmYtPmR0aW1fcGVyaW9kOwogCWNtZC0+YXAuYmVhY29uX2V4cGlyeSA9IFdMMTI3MV9BUF9ERUZfQkVBQ09OX0VYUDsKLQljbWQtPmNoYW5uZWwgPSB3bC0+Y2hhbm5lbDsKKwljbWQtPmNoYW5uZWwgPSB3bHZpZi0+Y2hhbm5lbDsKIAogCWlmICghYnNzX2NvbmYtPmhpZGRlbl9zc2lkKSB7CiAJCS8qIHRha2UgdGhlIFNTSUQgZnJvbSB0aGUgYmVhY29uIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5ICovCiAJCWNtZC0+YXAuc3NpZF90eXBlID0gV0wxMlhYX1NTSURfVFlQRV9QVUJMSUM7Ci0JCWNtZC0+YXAuc3NpZF9sZW4gPSB3bC0+c3NpZF9sZW47Ci0JCW1lbWNweShjbWQtPmFwLnNzaWQsIHdsLT5zc2lkLCB3bC0+c3NpZF9sZW4pOworCQljbWQtPmFwLnNzaWRfbGVuID0gd2x2aWYtPnNzaWRfbGVuOworCQltZW1jcHkoY21kLT5hcC5zc2lkLCB3bHZpZi0+c3NpZCwgd2x2aWYtPnNzaWRfbGVuKTsKIAl9IGVsc2UgewogCQljbWQtPmFwLnNzaWRfdHlwZSA9IFdMMTJYWF9TU0lEX1RZUEVfSElEREVOOwogCQljbWQtPmFwLnNzaWRfbGVuID0gYnNzX2NvbmYtPnNzaWRfbGVuOwpAQCAtNzAxLDcgKzczMCw3IEBACiAKIAljbWQtPmFwLmxvY2FsX3JhdGVzID0gY3B1X3RvX2xlMzIoMHhmZmZmZmZmZik7CiAKLQlzd2l0Y2ggKHdsLT5iYW5kKSB7CisJc3dpdGNoICh3bHZpZi0+YmFuZCkgewogCWNhc2UgSUVFRTgwMjExX0JBTkRfMkdIWjoKIAkJY21kLT5iYW5kID0gUkFESU9fQkFORF8yXzRHSFo7CiAJCWJyZWFrOwpAQCAtNzA5LDcgKzczOCw3IEBACiAJCWNtZC0+YmFuZCA9IFJBRElPX0JBTkRfNUdIWjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJd2wxMjcxX3dhcm5pbmcoImFwIHN0YXJ0IC0gdW5rbm93biBiYW5kOiAlZCIsIChpbnQpd2wtPmJhbmQpOworCQl3bDEyNzFfd2FybmluZygiYXAgc3RhcnQgLSB1bmtub3duIGJhbmQ6ICVkIiwgKGludCl3bHZpZi0+YmFuZCk7CiAJCWNtZC0+YmFuZCA9IFJBRElPX0JBTkRfMl80R0haOwogCQlicmVhazsKIAl9CkBAIC03MjMsMTAgKzc1MiwxMCBAQAogCWdvdG8gb3V0X2ZyZWU7CiAKIG91dF9mcmVlX2JjYXN0OgotCXdsMTJ4eF9mcmVlX2xpbmsod2wsICZ3bC0+YXBfYmNhc3RfaGxpZCk7CisJd2wxMnh4X2ZyZWVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+YXAuYmNhc3RfaGxpZCk7CiAKIG91dF9mcmVlX2dsb2JhbDoKLQl3bDEyeHhfZnJlZV9saW5rKHdsLCAmd2wtPmFwX2dsb2JhbF9obGlkKTsKKwl3bDEyeHhfZnJlZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5hcC5nbG9iYWxfaGxpZCk7CiAKIG91dF9mcmVlOgogCWtmcmVlKGNtZCk7CkBAIC03MzUsNyArNzY0LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3BfYXAoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3BfYXAoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlzdHJ1Y3Qgd2wxMnh4X2NtZF9yb2xlX3N0b3AgKmNtZDsKIAlpbnQgcmV0OwpAQCAtNzQ2LDkgKzc3NSw5IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdG9wIGFwICVkIiwgd2wtPnJvbGVfaWQpOworCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJjbWQgcm9sZSBzdG9wIGFwICVkIiwgd2x2aWYtPnJvbGVfaWQpOwogCi0JY21kLT5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJY21kLT5yb2xlX2lkID0gd2x2aWYtPnJvbGVfaWQ7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3NlbmQod2wsIENNRF9ST0xFX1NUT1AsIGNtZCwgc2l6ZW9mKCpjbWQpLCAwKTsKIAlpZiAocmV0IDwgMCkgewpAQCAtNzU2LDggKzc4NSw4IEBACiAJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCi0Jd2wxMnh4X2ZyZWVfbGluayh3bCwgJndsLT5hcF9iY2FzdF9obGlkKTsKLQl3bDEyeHhfZnJlZV9saW5rKHdsLCAmd2wtPmFwX2dsb2JhbF9obGlkKTsKKwl3bDEyeHhfZnJlZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5hcC5iY2FzdF9obGlkKTsKKwl3bDEyeHhfZnJlZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5hcC5nbG9iYWxfaGxpZCk7CiAKIG91dF9mcmVlOgogCWtmcmVlKGNtZCk7CkBAIC03NjYsMTAgKzc5NSwxMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfaWJzcyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfaWJzcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogeworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKIAlzdHJ1Y3Qgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0ICpjbWQ7Ci0Jc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmd2wtPnZpZi0+YnNzX2NvbmY7CisJc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmdmlmLT5ic3NfY29uZjsKIAlpbnQgcmV0OwogCiAJY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOwpAQCAtNzc4LDM1ICs4MDgsMzYgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0Jd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCByb2xlIHN0YXJ0IGlic3MgJWQiLCB3bC0+cm9sZV9pZCk7CisJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCByb2xlIHN0YXJ0IGlic3MgJWQiLCB3bHZpZi0+cm9sZV9pZCk7CiAKLQljbWQtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKLQlpZiAod2wtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKKwljbWQtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKKwlpZiAod2x2aWYtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikKIAkJY21kLT5iYW5kID0gV0wxMlhYX0JBTkRfNUdIWjsKLQljbWQtPmNoYW5uZWwgPSB3bC0+Y2hhbm5lbDsKLQljbWQtPmlic3MuYmFzaWNfcmF0ZV9zZXQgPSBjcHVfdG9fbGUzMih3bC0+YmFzaWNfcmF0ZV9zZXQpOwotCWNtZC0+aWJzcy5iZWFjb25faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNih3bC0+YmVhY29uX2ludCk7CisJY21kLT5jaGFubmVsID0gd2x2aWYtPmNoYW5uZWw7CisJY21kLT5pYnNzLmJhc2ljX3JhdGVfc2V0ID0gY3B1X3RvX2xlMzIod2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKKwljbWQtPmlic3MuYmVhY29uX2ludGVydmFsID0gY3B1X3RvX2xlMTYod2x2aWYtPmJlYWNvbl9pbnQpOwogCWNtZC0+aWJzcy5kdGltX2ludGVydmFsID0gYnNzX2NvbmYtPmR0aW1fcGVyaW9kOwogCWNtZC0+aWJzcy5zc2lkX3R5cGUgPSBXTDEyWFhfU1NJRF9UWVBFX0FOWTsKLQljbWQtPmlic3Muc3NpZF9sZW4gPSB3bC0+c3NpZF9sZW47Ci0JbWVtY3B5KGNtZC0+aWJzcy5zc2lkLCB3bC0+c3NpZCwgd2wtPnNzaWRfbGVuKTsKLQltZW1jcHkoY21kLT5pYnNzLmJzc2lkLCB3bC0+YnNzaWQsIEVUSF9BTEVOKTsKLQljbWQtPnN0YS5sb2NhbF9yYXRlcyA9IGNwdV90b19sZTMyKHdsLT5yYXRlX3NldCk7CisJY21kLT5pYnNzLnNzaWRfbGVuID0gd2x2aWYtPnNzaWRfbGVuOworCW1lbWNweShjbWQtPmlic3Muc3NpZCwgd2x2aWYtPnNzaWQsIHdsdmlmLT5zc2lkX2xlbik7CisJbWVtY3B5KGNtZC0+aWJzcy5ic3NpZCwgdmlmLT5ic3NfY29uZi5ic3NpZCwgRVRIX0FMRU4pOworCWNtZC0+c3RhLmxvY2FsX3JhdGVzID0gY3B1X3RvX2xlMzIod2x2aWYtPnJhdGVfc2V0KTsKIAotCWlmICh3bC0+c3RhX2hsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkgewotCQlyZXQgPSB3bDEyeHhfYWxsb2NhdGVfbGluayh3bCwgJndsLT5zdGFfaGxpZCk7CisJaWYgKHdsdmlmLT5zdGEuaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKSB7CisJCXJldCA9IHdsMTJ4eF9hbGxvY2F0ZV9saW5rKHdsLCB3bHZpZiwgJndsdmlmLT5zdGEuaGxpZCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dF9mcmVlOwogCX0KLQljbWQtPmlic3MuaGxpZCA9IHdsLT5zdGFfaGxpZDsKLQljbWQtPmlic3MucmVtb3RlX3JhdGVzID0gY3B1X3RvX2xlMzIod2wtPnJhdGVfc2V0KTsKKwljbWQtPmlic3MuaGxpZCA9IHdsdmlmLT5zdGEuaGxpZDsKKwljbWQtPmlic3MucmVtb3RlX3JhdGVzID0gY3B1X3RvX2xlMzIod2x2aWYtPnJhdGVfc2V0KTsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19DTUQsICJyb2xlIHN0YXJ0OiByb2xlaWQ9JWQsIGhsaWQ9JWQsIHNlc3Npb249JWQgIgogCQkgICAgICJiYXNpY19yYXRlX3NldDogMHgleCwgcmVtb3RlX3JhdGVzOiAweCV4IiwKLQkJICAgICB3bC0+cm9sZV9pZCwgY21kLT5zdGEuaGxpZCwgY21kLT5zdGEuc2Vzc2lvbiwKLQkJICAgICB3bC0+YmFzaWNfcmF0ZV9zZXQsIHdsLT5yYXRlX3NldCk7CisJCSAgICAgd2x2aWYtPnJvbGVfaWQsIGNtZC0+c3RhLmhsaWQsIGNtZC0+c3RhLnNlc3Npb24sCisJCSAgICAgd2x2aWYtPmJhc2ljX3JhdGVfc2V0LCB3bHZpZi0+cmF0ZV9zZXQpOwogCi0Jd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgIndsLT5ic3NpZCA9ICVwTSIsIHdsLT5ic3NpZCk7CisJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgInZpZi0+YnNzX2NvbmYuYnNzaWQgPSAlcE0iLAorCQkgICAgIHZpZi0+YnNzX2NvbmYuYnNzaWQpOwogCiAJcmV0ID0gd2wxMjcxX2NtZF9zZW5kKHdsLCBDTURfUk9MRV9TVEFSVCwgY21kLCBzaXplb2YoKmNtZCksIDApOwogCWlmIChyZXQgPCAwKSB7CkBAIC04MTgsNyArODQ5LDcgQEAKIAogZXJyX2hsaWQ6CiAJLyogY2xlYXIgbGlua3Mgb24gZXJyb3IuICovCi0Jd2wxMnh4X2ZyZWVfbGluayh3bCwgJndsLT5zdGFfaGxpZCk7CisJd2wxMnh4X2ZyZWVfbGluayh3bCwgd2x2aWYsICZ3bHZpZi0+c3RhLmhsaWQpOwogCiBvdXRfZnJlZToKIAlrZnJlZShjbWQpOwpAQCAtOTYyLDcgKzk5Myw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9jbWRfcHNfbW9kZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggcHNfbW9kZSkKK2ludCB3bDEyNzFfY21kX3BzX21vZGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgICAgIHU4IHBzX21vZGUpCiB7CiAJc3RydWN0IHdsMTI3MV9jbWRfcHNfcGFyYW1zICpwc19wYXJhbXMgPSBOVUxMOwogCWludCByZXQgPSAwOwpAQCAtOTc1LDcgKzEwMDcsNyBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlwc19wYXJhbXMtPnJvbGVfaWQgPSB3bC0+cm9sZV9pZDsKKwlwc19wYXJhbXMtPnJvbGVfaWQgPSB3bHZpZi0+cm9sZV9pZDsKIAlwc19wYXJhbXMtPnBzX21vZGUgPSBwc19tb2RlOwogCiAJcmV0ID0gd2wxMjcxX2NtZF9zZW5kKHdsLCBDTURfU0VUX1BTX01PREUsIHBzX3BhcmFtcywKQEAgLTEwMzAsNyArMTA2Miw3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9jbWRfYnVpbGRfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsKQoraW50IHdsMTJ4eF9jbWRfYnVpbGRfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IE5VTEw7CiAJaW50IHNpemU7CkBAIC0xMDM4LDExICsxMDcwLDEyIEBACiAJaW50IHJldCA9IC1FTk9NRU07CiAKIAotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUykgeworCWlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUykgewogCQlzaXplID0gc2l6ZW9mKHN0cnVjdCB3bDEyeHhfbnVsbF9kYXRhX3RlbXBsYXRlKTsKIAkJcHRyID0gTlVMTDsKIAl9IGVsc2UgewotCQlza2IgPSBpZWVlODAyMTFfbnVsbGZ1bmNfZ2V0KHdsLT5odywgd2wtPnZpZik7CisJCXNrYiA9IGllZWU4MDIxMV9udWxsZnVuY19nZXQod2wtPmh3LAorCQkJCQkgICAgIHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpKTsKIAkJaWYgKCFza2IpCiAJCQlnb3RvIG91dDsKIAkJc2l6ZSA9IHNrYi0+bGVuOwpAQCAtMTA1MCw3ICsxMDgzLDcgQEAKIAl9CiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX05VTExfREFUQSwgcHRyLCBzaXplLCAwLAotCQkJCSAgICAgIHdsLT5iYXNpY19yYXRlKTsKKwkJCQkgICAgICB3bHZpZi0+YmFzaWNfcmF0ZSk7CiAKIG91dDoKIAlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC0xMDYxLDE5ICsxMDk0LDIxIEBACiAKIH0KIAotaW50IHdsMTI3MV9jbWRfYnVpbGRfa2x2X251bGxfZGF0YShzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyeHhfY21kX2J1aWxkX2tsdl9udWxsX2RhdGEoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogeworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAlpbnQgcmV0ID0gLUVOT01FTTsKIAotCXNrYiA9IGllZWU4MDIxMV9udWxsZnVuY19nZXQod2wtPmh3LCB3bC0+dmlmKTsKKwlza2IgPSBpZWVlODAyMTFfbnVsbGZ1bmNfZ2V0KHdsLT5odywgdmlmKTsKIAlpZiAoIXNrYikKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX0tMViwKIAkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuLAogCQkJCSAgICAgIENNRF9URU1QTF9LTFZfSURYX05VTExfREFUQSwKLQkJCQkgICAgICB3bC0+YmFzaWNfcmF0ZSk7CisJCQkJICAgICAgd2x2aWYtPmJhc2ljX3JhdGUpOwogCiBvdXQ6CiAJZGV2X2tmcmVlX3NrYihza2IpOwpAQCAtMTA4NCwzMiArMTExOSwzNSBAQAogCiB9CiAKLWludCB3bDEyNzFfY21kX2J1aWxkX3BzX3BvbGwoc3RydWN0IHdsMTI3MSAqd2wsIHUxNiBhaWQpCitpbnQgd2wxMjcxX2NtZF9idWlsZF9wc19wb2xsKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgIHUxNiBhaWQpCiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHJldCA9IDA7CiAKLQlza2IgPSBpZWVlODAyMTFfcHNwb2xsX2dldCh3bC0+aHcsIHdsLT52aWYpOworCXNrYiA9IGllZWU4MDIxMV9wc3BvbGxfZ2V0KHdsLT5odywgdmlmKTsKIAlpZiAoIXNrYikKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX1BTX1BPTEwsIHNrYi0+ZGF0YSwKLQkJCQkgICAgICBza2ItPmxlbiwgMCwgd2wtPmJhc2ljX3JhdGVfc2V0KTsKKwkJCQkgICAgICBza2ItPmxlbiwgMCwgd2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKIAogb3V0OgogCWRldl9rZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMjcxX2NtZF9idWlsZF9wcm9iZV9yZXEoc3RydWN0IHdsMTI3MSAqd2wsCitpbnQgd2wxMjcxX2NtZF9idWlsZF9wcm9iZV9yZXEoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKIAkJCSAgICAgICBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAogCQkJICAgICAgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbiwgdTggYmFuZCkKIHsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgcmV0OwogCXUzMiByYXRlOwogCi0Jc2tiID0gaWVlZTgwMjExX3Byb2JlcmVxX2dldCh3bC0+aHcsIHdsLT52aWYsIHNzaWQsIHNzaWRfbGVuLAorCXNrYiA9IGllZWU4MDIxMV9wcm9iZXJlcV9nZXQod2wtPmh3LCB2aWYsIHNzaWQsIHNzaWRfbGVuLAogCQkJCSAgICAgaWUsIGllX2xlbik7CiAJaWYgKCFza2IpIHsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTExMTgsNyArMTE1Niw3IEBACiAKIAl3bDEyNzFfZHVtcChERUJVR19TQ0FOLCAiUFJPQkUgUkVROiAiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAotCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+Yml0cmF0ZV9tYXNrc1tiYW5kXSk7CisJcmF0ZSA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsdmlmLT5iaXRyYXRlX21hc2tzW2JhbmRdKTsKIAlpZiAoYmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQogCQlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX0NGR19QUk9CRV9SRVFfMl80LAogCQkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuLCAwLCByYXRlKTsKQEAgLTExMzIsMjAgKzExNzAsMjIgQEAKIH0KIAogc3RydWN0IHNrX2J1ZmYgKndsMTI3MV9jbWRfYnVpbGRfYXBfcHJvYmVfcmVxKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCiAJCQkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOwogCWludCByZXQ7CiAJdTMyIHJhdGU7CiAKIAlpZiAoIXNrYikKLQkJc2tiID0gaWVlZTgwMjExX2FwX3Byb2JlcmVxX2dldCh3bC0+aHcsIHdsLT52aWYpOworCQlza2IgPSBpZWVlODAyMTFfYXBfcHJvYmVyZXFfZ2V0KHdsLT5odywgdmlmKTsKIAlpZiAoIXNrYikKIAkJZ290byBvdXQ7CiAKIAl3bDEyNzFfZHVtcChERUJVR19TQ0FOLCAiQVAgUFJPQkUgUkVROiAiLCBza2ItPmRhdGEsIHNrYi0+bGVuKTsKIAotCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+Yml0cmF0ZV9tYXNrc1t3bC0+YmFuZF0pOwotCWlmICh3bC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQorCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bHZpZi0+Yml0cmF0ZV9tYXNrc1t3bHZpZi0+YmFuZF0pOworCWlmICh3bHZpZi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQogCQlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX0NGR19QUk9CRV9SRVFfMl80LAogCQkJCQkgICAgICBza2ItPmRhdGEsIHNrYi0+bGVuLCAwLCByYXRlKTsKIAllbHNlCkBAIC0xMTU5LDkgKzExOTksMTEgQEAKIAlyZXR1cm4gc2tiOwogfQogCi1pbnQgd2wxMjcxX2NtZF9idWlsZF9hcnBfcnNwKHN0cnVjdCB3bDEyNzEgKndsLCBfX2JlMzIgaXBfYWRkcikKK2ludCB3bDEyNzFfY21kX2J1aWxkX2FycF9yc3Aoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICAgX19iZTMyIGlwX2FkZHIpCiB7CiAJaW50IHJldDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CiAJc3RydWN0IHdsMTJ4eF9hcnBfcnNwX3RlbXBsYXRlIHRtcGw7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKmhkcjsKIAlzdHJ1Y3QgYXJwaGRyICphcnBfaGRyOwpAQCAtMTE3Myw4ICsxMjE1LDggQEAKIAloZHItPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8CiAJCQkJCSBJRUVFODAyMTFfU1RZUEVfREFUQSB8CiAJCQkJCSBJRUVFODAyMTFfRkNUTF9UT0RTKTsKLQltZW1jcHkoaGRyLT5hZGRyMSwgd2wtPnZpZi0+YnNzX2NvbmYuYnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkoaGRyLT5hZGRyMiwgd2wtPnZpZi0+YWRkciwgRVRIX0FMRU4pOworCW1lbWNweShoZHItPmFkZHIxLCB2aWYtPmJzc19jb25mLmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KGhkci0+YWRkcjIsIHZpZi0+YWRkciwgRVRIX0FMRU4pOwogCW1lbXNldChoZHItPmFkZHIzLCAweGZmLCBFVEhfQUxFTik7CiAKIAkvKiBsbGMgbGF5ZXIgKi8KQEAgLTExOTAsMjUgKzEyMzIsMjYgQEAKIAlhcnBfaGRyLT5hcl9vcCA9IGNwdV90b19iZTE2KEFSUE9QX1JFUExZKTsKIAogCS8qIGFycCBwYXlsb2FkICovCi0JbWVtY3B5KHRtcGwuc2VuZGVyX2h3LCB3bC0+dmlmLT5hZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KHRtcGwuc2VuZGVyX2h3LCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKIAl0bXBsLnNlbmRlcl9pcCA9IGlwX2FkZHI7CiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX0FSUF9SU1AsCiAJCQkJICAgICAgJnRtcGwsIHNpemVvZih0bXBsKSwgMCwKLQkJCQkgICAgICB3bC0+YmFzaWNfcmF0ZSk7CisJCQkJICAgICAgd2x2aWYtPmJhc2ljX3JhdGUpOwogCiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9idWlsZF9xb3NfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsKQoraW50IHdsMTI3MV9idWlsZF9xb3NfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogeworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOwogCXN0cnVjdCBpZWVlODAyMTFfcW9zX2hkciB0ZW1wbGF0ZTsKIAogCW1lbXNldCgmdGVtcGxhdGUsIDAsIHNpemVvZih0ZW1wbGF0ZSkpOwogCi0JbWVtY3B5KHRlbXBsYXRlLmFkZHIxLCB3bC0+YnNzaWQsIEVUSF9BTEVOKTsKLQltZW1jcHkodGVtcGxhdGUuYWRkcjIsIHdsLT5tYWNfYWRkciwgRVRIX0FMRU4pOwotCW1lbWNweSh0ZW1wbGF0ZS5hZGRyMywgd2wtPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KHRlbXBsYXRlLmFkZHIxLCB2aWYtPmJzc19jb25mLmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KHRlbXBsYXRlLmFkZHIyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkodGVtcGxhdGUuYWRkcjMsIHZpZi0+YnNzX2NvbmYuYnNzaWQsIEVUSF9BTEVOKTsKIAogCXRlbXBsYXRlLmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8CiAJCQkJCSAgICAgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMRlVOQyB8CkBAIC0xMjE5LDcgKzEyNjIsNyBAQAogCiAJcmV0dXJuIHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfVEVNUExfUU9TX05VTExfREFUQSwgJnRlbXBsYXRlLAogCQkJCSAgICAgICBzaXplb2YodGVtcGxhdGUpLCAwLAotCQkJCSAgICAgICB3bC0+YmFzaWNfcmF0ZSk7CisJCQkJICAgICAgIHdsdmlmLT5iYXNpY19yYXRlKTsKIH0KIAogaW50IHdsMTJ4eF9jbWRfc2V0X2RlZmF1bHRfd2VwX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaWQsIHU4IGhsaWQpCkBAIC0xMjUzLDcgKzEyOTYsOCBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCB3bDEyNzFfY21kX3NldF9zdGFfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgYWN0aW9uLCB1OCBpZCwgdTgga2V5X3R5cGUsCitpbnQgd2wxMjcxX2NtZF9zZXRfc3RhX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICAgdTE2IGFjdGlvbiwgdTggaWQsIHU4IGtleV90eXBlLAogCQkgICAgICAgdTgga2V5X3NpemUsIGNvbnN0IHU4ICprZXksIGNvbnN0IHU4ICphZGRyLAogCQkgICAgICAgdTMyIHR4X3NlcV8zMiwgdTE2IHR4X3NlcV8xNikKIHsKQEAgLTEyNjEsNyArMTMwNSw3IEBACiAJaW50IHJldCA9IDA7CiAKIAkvKiBobGlkIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGRlbGV0ZWQgKi8KLQlpZiAod2wtPnN0YV9obGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpCisJaWYgKHdsdmlmLT5zdGEuaGxpZCA9PSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEKQogCQlyZXR1cm4gMDsKIAogCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKQEAgLTEyNzAsNyArMTMxNCw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWNtZC0+aGxpZCA9IHdsLT5zdGFfaGxpZDsKKwljbWQtPmhsaWQgPSB3bHZpZi0+c3RhLmhsaWQ7CiAKIAlpZiAoa2V5X3R5cGUgPT0gS0VZX1dFUCkKIAkJY21kLT5saWRfa2V5X3R5cGUgPSBXRVBfREVGQVVMVF9MSURfVFlQRTsKQEAgLTEzMjEsOSArMTM2NSwxMCBAQAogICogVE9ETzogbWVyZ2Ugd2l0aCBzdGEvaWJzcyBpbnRvIDEgc2V0X2tleSBmdW5jdGlvbi4KICAqIG5vdGUgdGhlcmUgYXJlIHNsaWdodCBkaWZmcwogICovCi1pbnQgd2wxMjcxX2NtZF9zZXRfYXBfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgYWN0aW9uLCB1OCBpZCwgdTgga2V5X3R5cGUsCi0JCQl1OCBrZXlfc2l6ZSwgY29uc3QgdTggKmtleSwgdTggaGxpZCwgdTMyIHR4X3NlcV8zMiwKLQkJCXUxNiB0eF9zZXFfMTYpCitpbnQgd2wxMjcxX2NtZF9zZXRfYXBfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgIHUxNiBhY3Rpb24sIHU4IGlkLCB1OCBrZXlfdHlwZSwKKwkJCSAgdTgga2V5X3NpemUsIGNvbnN0IHU4ICprZXksIHU4IGhsaWQsIHUzMiB0eF9zZXFfMzIsCisJCQkgIHUxNiB0eF9zZXFfMTYpCiB7CiAJc3RydWN0IHdsMTI3MV9jbWRfc2V0X2tleXMgKmNtZDsKIAlpbnQgcmV0ID0gMDsKQEAgLTEzMzMsNyArMTM3OCw3IEBACiAJaWYgKCFjbWQpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKGhsaWQgPT0gd2wtPmFwX2JjYXN0X2hsaWQpIHsKKwlpZiAoaGxpZCA9PSB3bHZpZi0+YXAuYmNhc3RfaGxpZCkgewogCQlpZiAoa2V5X3R5cGUgPT0gS0VZX1dFUCkKIAkJCWxpZF90eXBlID0gV0VQX0RFRkFVTFRfTElEX1RZUEU7CiAJCWVsc2UKQEAgLTE0MTEsNyArMTQ1Niw4IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTJ4eF9jbWRfYWRkX3BlZXIoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IGhsaWQpCitpbnQgd2wxMnh4X2NtZF9hZGRfcGVlcihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggaGxpZCkKIHsKIAlzdHJ1Y3Qgd2wxMnh4X2NtZF9hZGRfcGVlciAqY21kOwogCWludCBpLCByZXQ7CkBAIC0xNDM4LDEzICsxNDg0LDEzIEBACiAJCWVsc2UKIAkJCWNtZC0+cHNkX3R5cGVbaV0gPSBXTDEyNzFfUFNEX0xFR0FDWTsKIAotCXN0YV9yYXRlcyA9IHN0YS0+c3VwcF9yYXRlc1t3bC0+YmFuZF07CisJc3RhX3JhdGVzID0gc3RhLT5zdXBwX3JhdGVzW3dsdmlmLT5iYW5kXTsKIAlpZiAoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKQogCQlzdGFfcmF0ZXMgfD0gc3RhLT5odF9jYXAubWNzLnJ4X21hc2tbMF0gPDwgSFdfSFRfUkFURVNfT0ZGU0VUOwogCiAJY21kLT5zdXBwb3J0ZWRfcmF0ZXMgPQogCQljcHVfdG9fbGUzMih3bDEyNzFfdHhfZW5hYmxlZF9yYXRlc19nZXQod2wsIHN0YV9yYXRlcywKLQkJCQkJCQl3bC0+YmFuZCkpOworCQkJCQkJCXdsdmlmLT5iYW5kKSk7CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAibmV3IHBlZXIgcmF0ZXM9MHgleCBxdWV1ZXM9MHgleCIsCiAJCSAgICAgY21kLT5zdXBwb3J0ZWRfcmF0ZXMsIHN0YS0+dWFwc2RfcXVldWVzKTsKQEAgLTE1ODQsMTIgKzE2MzAsMTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdsMTJ4eF9jbWRfcm9jKHN0cnVjdCB3bDEyNzEgKndsLCB1OCByb2xlX2lkKQorc3RhdGljIGludCB3bDEyeHhfY21kX3JvYyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICB1OCByb2xlX2lkKQogewogCXN0cnVjdCB3bDEyeHhfY21kX3JvYyAqY21kOwogCWludCByZXQgPSAwOwogCi0Jd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCByb2MgJWQgKCVkKSIsIHdsLT5jaGFubmVsLCByb2xlX2lkKTsKKwl3bDEyNzFfZGVidWcoREVCVUdfQ01ELCAiY21kIHJvYyAlZCAoJWQpIiwgd2x2aWYtPmNoYW5uZWwsIHJvbGVfaWQpOwogCiAJaWYgKFdBUk5fT04ocm9sZV9pZCA9PSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEKSkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNjAxLDggKzE2NDgsOCBAQAogCX0KIAogCWNtZC0+cm9sZV9pZCA9IHJvbGVfaWQ7Ci0JY21kLT5jaGFubmVsID0gd2wtPmNoYW5uZWw7Ci0Jc3dpdGNoICh3bC0+YmFuZCkgeworCWNtZC0+Y2hhbm5lbCA9IHdsdmlmLT5jaGFubmVsOworCXN3aXRjaCAod2x2aWYtPmJhbmQpIHsKIAljYXNlIElFRUU4MDIxMV9CQU5EXzJHSFo6CiAJCWNtZC0+YmFuZCA9IFJBRElPX0JBTkRfMl80R0haOwogCQlicmVhazsKQEAgLTE2MTAsNyArMTY1Nyw3IEBACiAJCWNtZC0+YmFuZCA9IFJBRElPX0JBTkRfNUdIWjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJd2wxMjcxX2Vycm9yKCJyb2MgLSB1bmtub3duIGJhbmQ6ICVkIiwgKGludCl3bC0+YmFuZCk7CisJCXdsMTI3MV9lcnJvcigicm9jIC0gdW5rbm93biBiYW5kOiAlZCIsIChpbnQpd2x2aWYtPmJhbmQpOwogCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dF9mcmVlOwogCX0KQEAgLTE2NTcsMTQgKzE3MDQsMTQgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1pbnQgd2wxMnh4X3JvYyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggcm9sZV9pZCkKK2ludCB3bDEyeHhfcm9jKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHU4IHJvbGVfaWQpCiB7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoV0FSTl9PTih0ZXN0X2JpdChyb2xlX2lkLCB3bC0+cm9jX21hcCkpKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHdsMTJ4eF9jbWRfcm9jKHdsLCByb2xlX2lkKTsKKwlyZXQgPSB3bDEyeHhfY21kX3JvYyh3bCwgd2x2aWYsIHJvbGVfaWQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIApAQCAtMTc1MywzICsxODAwLDUzIEBACiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KKworLyogc3RhcnQgZGV2IHJvbGUgYW5kIHJvYyBvbiBpdHMgY2hhbm5lbCAqLworaW50IHdsMTJ4eF9zdGFydF9kZXYoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKK3sKKwlpbnQgcmV0OworCisJaWYgKFdBUk5fT04oISh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUyB8fAorCQkgICAgICB3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUykpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9kZXYod2wsIHdsdmlmKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSB3bDEyeHhfcm9jKHdsLCB3bHZpZiwgd2x2aWYtPmRldl9yb2xlX2lkKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfc3RvcDsKKworCXJldHVybiAwOworCitvdXRfc3RvcDoKKwl3bDEyeHhfY21kX3JvbGVfc3RvcF9kZXYod2wsIHdsdmlmKTsKK291dDoKKwlyZXR1cm4gcmV0OworfQorCisvKiBjcm9jIGRldiBobGlkLCBhbmQgc3RvcCB0aGUgcm9sZSAqLworaW50IHdsMTJ4eF9zdG9wX2RldihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQoreworCWludCByZXQ7CisKKwlpZiAoV0FSTl9PTighKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTIHx8CisJCSAgICAgIHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9JQlNTKSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZmx1c2ggYWxsIHBlbmRpbmcgcGFja2V0cyAqLworCXdsMTI3MV90eF93b3JrX2xvY2tlZCh3bCk7CisKKwlpZiAodGVzdF9iaXQod2x2aWYtPmRldl9yb2xlX2lkLCB3bC0+cm9jX21hcCkpIHsKKwkJcmV0ID0gd2wxMnh4X2Nyb2Mod2wsIHdsdmlmLT5kZXZfcm9sZV9pZCk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0b3BfZGV2KHdsLCB3bHZpZik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0Oworb3V0OgorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY21kLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY21kLmgKaW5kZXggYjdiZDQyNy4uM2Y3ZDBiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NtZC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jbWQuaApAQCAtMzYsNDUgKzM2LDU0IEBACiBpbnQgd2wxMjcxX2NtZF9yYWRpb19wYXJtcyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjh4X2NtZF9yYWRpb19wYXJtcyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjcxX2NtZF9leHRfcmFkaW9fcGFybXMoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTJ4eF9jbWRfcm9sZV9lbmFibGUoc3RydWN0IHdsMTI3MSAqd2wsIHU4IHJvbGVfdHlwZSwgdTggKnJvbGVfaWQpOworaW50IHdsMTJ4eF9jbWRfcm9sZV9lbmFibGUoc3RydWN0IHdsMTI3MSAqd2wsIHU4ICphZGRyLCB1OCByb2xlX3R5cGUsCisJCQkgICB1OCAqcm9sZV9pZCk7CiBpbnQgd2wxMnh4X2NtZF9yb2xlX2Rpc2FibGUoc3RydWN0IHdsMTI3MSAqd2wsIHU4ICpyb2xlX2lkKTsKLWludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfZGV2KHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyeHhfY21kX3JvbGVfc3RvcF9kZXYoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9zdGEoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTJ4eF9jbWRfcm9sZV9zdG9wX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2FwKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyeHhfY21kX3JvbGVfc3RvcF9hcChzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2lic3Moc3RydWN0IHdsMTI3MSAqd2wpOworaW50IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9zdGEoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CitpbnQgd2wxMnh4X2NtZF9yb2xlX3N0b3Bfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOworaW50IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9hcChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyeHhfY21kX3JvbGVfc3RvcF9hcChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyeHhfY21kX3JvbGVfc3RhcnRfaWJzcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKK2ludCB3bDEyeHhfc3RhcnRfZGV2KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOworaW50IHdsMTJ4eF9zdG9wX2RldihzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKIGludCB3bDEyNzFfY21kX3Rlc3Qoc3RydWN0IHdsMTI3MSAqd2wsIHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1Zl9sZW4sIHU4IGFuc3dlcik7CiBpbnQgd2wxMjcxX2NtZF9pbnRlcnJvZ2F0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTE2IGlkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pOwogaW50IHdsMTI3MV9jbWRfY29uZmlndXJlKHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgaWQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CiBpbnQgd2wxMjcxX2NtZF9kYXRhX3BhdGgoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKTsKLWludCB3bDEyNzFfY21kX3BzX21vZGUoc3RydWN0IHdsMTI3MSAqd2wsIHU4IHBzX21vZGUpOworaW50IHdsMTI3MV9jbWRfcHNfbW9kZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICAgdTggcHNfbW9kZSk7CiBpbnQgd2wxMjcxX2NtZF9yZWFkX21lbW9yeShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIGFkZHIsIHZvaWQgKmFuc3dlciwKIAkJCSAgIHNpemVfdCBsZW4pOwogaW50IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgdGVtcGxhdGVfaWQsCiAJCQkgICAgdm9pZCAqYnVmLCBzaXplX3QgYnVmX2xlbiwgaW50IGluZGV4LCB1MzIgcmF0ZXMpOwotaW50IHdsMTI3MV9jbWRfYnVpbGRfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfY21kX2J1aWxkX3BzX3BvbGwoc3RydWN0IHdsMTI3MSAqd2wsIHUxNiBhaWQpOwotaW50IHdsMTI3MV9jbWRfYnVpbGRfcHJvYmVfcmVxKHN0cnVjdCB3bDEyNzEgKndsLAoraW50IHdsMTJ4eF9jbWRfYnVpbGRfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOworaW50IHdsMTI3MV9jbWRfYnVpbGRfcHNfcG9sbChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICAgICB1MTYgYWlkKTsKK2ludCB3bDEyNzFfY21kX2J1aWxkX3Byb2JlX3JlcShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAogCQkJICAgICAgIGNvbnN0IHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4sCiAJCQkgICAgICAgY29uc3QgdTggKmllLCBzaXplX3QgaWVfbGVuLCB1OCBiYW5kKTsKIHN0cnVjdCBza19idWZmICp3bDEyNzFfY21kX2J1aWxkX2FwX3Byb2JlX3JlcShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJICAgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAogCQkJCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKLWludCB3bDEyNzFfY21kX2J1aWxkX2FycF9yc3Aoc3RydWN0IHdsMTI3MSAqd2wsIF9fYmUzMiBpcF9hZGRyKTsKLWludCB3bDEyNzFfYnVpbGRfcW9zX251bGxfZGF0YShzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2NtZF9idWlsZF9rbHZfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfY21kX2J1aWxkX2FycF9yc3Aoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgICAgX19iZTMyIGlwX2FkZHIpOworaW50IHdsMTI3MV9idWlsZF9xb3NfbnVsbF9kYXRhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKK2ludCB3bDEyeHhfY21kX2J1aWxkX2tsdl9udWxsX2RhdGEoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKIGludCB3bDEyeHhfY21kX3NldF9kZWZhdWx0X3dlcF9rZXkoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGlkLCB1OCBobGlkKTsKLWludCB3bDEyNzFfY21kX3NldF9zdGFfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgYWN0aW9uLCB1OCBpZCwgdTgga2V5X3R5cGUsCitpbnQgd2wxMjcxX2NtZF9zZXRfc3RhX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICAgdTE2IGFjdGlvbiwgdTggaWQsIHU4IGtleV90eXBlLAogCQkJICAgdTgga2V5X3NpemUsIGNvbnN0IHU4ICprZXksIGNvbnN0IHU4ICphZGRyLAogCQkJICAgdTMyIHR4X3NlcV8zMiwgdTE2IHR4X3NlcV8xNik7Ci1pbnQgd2wxMjcxX2NtZF9zZXRfYXBfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCB1MTYgYWN0aW9uLCB1OCBpZCwgdTgga2V5X3R5cGUsCitpbnQgd2wxMjcxX2NtZF9zZXRfYXBfa2V5KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgIHUxNiBhY3Rpb24sIHU4IGlkLCB1OCBrZXlfdHlwZSwKIAkJCSAgdTgga2V5X3NpemUsIGNvbnN0IHU4ICprZXksIHU4IGhsaWQsIHUzMiB0eF9zZXFfMzIsCiAJCQkgIHUxNiB0eF9zZXFfMTYpOwogaW50IHdsMTJ4eF9jbWRfc2V0X3BlZXJfc3RhdGUoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGhsaWQpOwotaW50IHdsMTJ4eF9yb2Moc3RydWN0IHdsMTI3MSAqd2wsIHU4IHJvbGVfaWQpOworaW50IHdsMTJ4eF9yb2Moc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwgdTggcm9sZV9pZCk7CiBpbnQgd2wxMnh4X2Nyb2Moc3RydWN0IHdsMTI3MSAqd2wsIHU4IHJvbGVfaWQpOwotaW50IHdsMTJ4eF9jbWRfYWRkX3BlZXIoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IGhsaWQpOworaW50IHdsMTJ4eF9jbWRfYWRkX3BlZXIoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IGhsaWQpOwogaW50IHdsMTJ4eF9jbWRfcmVtb3ZlX3BlZXIoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGhsaWQpOwogaW50IHdsMTJ4eF9jbWRfY29uZmlnX2Z3bG9nKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyeHhfY21kX3N0YXJ0X2Z3bG9nKHN0cnVjdCB3bDEyNzEgKndsKTsKQEAgLTgyLDYgKzkxLDkgQEAKIGludCB3bDEyeHhfY21kX2NoYW5uZWxfc3dpdGNoKHN0cnVjdCB3bDEyNzEgKndsLAogCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsX3N3aXRjaCAqY2hfc3dpdGNoKTsKIGludCB3bDEyeHhfY21kX3N0b3BfY2hhbm5lbF9zd2l0Y2goc3RydWN0IHdsMTI3MSAqd2wpOworaW50IHdsMTJ4eF9hbGxvY2F0ZV9saW5rKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgdTggKmhsaWQpOwordm9pZCB3bDEyeHhfZnJlZV9saW5rKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHU4ICpobGlkKTsKIAogZW51bSB3bDEyNzFfY29tbWFuZHMgewogCUNNRF9JTlRFUlJPR0FURSAgICAgPSAxLCAgICAvKnVzZSB0aGlzIHRvIHJlYWQgaW5mb3JtYXRpb24gZWxlbWVudHMqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NvbmYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9jb25mLmgKaW5kZXggMDRiYjhmYi4uMWJjZmIwMSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2NvbmYuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvY29uZi5oCkBAIC00NDAsNiArNDQwLDEwIEBACiAJQ09ORl9IV19CSVRfUkFURV8zNk1CUFMgfCBDT05GX0hXX0JJVF9SQVRFXzQ4TUJQUyB8ICAgICAgXAogCUNPTkZfSFdfQklUX1JBVEVfNTRNQlBTKQogCisjZGVmaW5lIENPTkZfVFhfQ0NLX1JBVEVTICAoQ09ORl9IV19CSVRfUkFURV8xTUJQUyB8CQlcCisJQ09ORl9IV19CSVRfUkFURV8yTUJQUyB8IENPTkZfSFdfQklUX1JBVEVfNV81TUJQUyB8CVwKKwlDT05GX0hXX0JJVF9SQVRFXzExTUJQUykKKwogI2RlZmluZSBDT05GX1RYX09GRE1fUkFURVMgKENPTkZfSFdfQklUX1JBVEVfNk1CUFMgfCAgICAgICAgICAgICBcCiAJQ09ORl9IV19CSVRfUkFURV8xMk1CUFMgfCBDT05GX0hXX0JJVF9SQVRFXzI0TUJQUyB8ICAgICAgXAogCUNPTkZfSFdfQklUX1JBVEVfMzZNQlBTIHwgQ09ORl9IV19CSVRfUkFURV80OE1CUFMgfCAgICAgIFwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9kZWJ1Zy5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1ZmQ4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZGVidWcuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHdsMTJ4eAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUZXhhcyBJbnN0cnVtZW50cy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IE5va2lhIENvcnBvcmF0aW9uCisgKgorICogQ29udGFjdDogTHVjaWFubyBDb2VsaG8gPGNvZWxob0B0aS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxIFVTQQorICoKKyAqLworCisjaWZuZGVmIF9fREVCVUdfSF9fCisjZGVmaW5lIF9fREVCVUdfSF9fCisKKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KKworI2RlZmluZSBEUklWRVJfTkFNRSAid2wxMnh4IgorI2RlZmluZSBEUklWRVJfUFJFRklYIERSSVZFUl9OQU1FICI6ICIKKworZW51bSB7CisJREVCVUdfTk9ORQk9IDAsCisJREVCVUdfSVJRCT0gQklUKDApLAorCURFQlVHX1NQSQk9IEJJVCgxKSwKKwlERUJVR19CT09UCT0gQklUKDIpLAorCURFQlVHX01BSUxCT1gJPSBCSVQoMyksCisJREVCVUdfVEVTVE1PREUJPSBCSVQoNCksCisJREVCVUdfRVZFTlQJPSBCSVQoNSksCisJREVCVUdfVFgJPSBCSVQoNiksCisJREVCVUdfUlgJPSBCSVQoNyksCisJREVCVUdfU0NBTgk9IEJJVCg4KSwKKwlERUJVR19DUllQVAk9IEJJVCg5KSwKKwlERUJVR19QU00JPSBCSVQoMTApLAorCURFQlVHX01BQzgwMjExCT0gQklUKDExKSwKKwlERUJVR19DTUQJPSBCSVQoMTIpLAorCURFQlVHX0FDWAk9IEJJVCgxMyksCisJREVCVUdfU0RJTwk9IEJJVCgxNCksCisJREVCVUdfRklMVEVSUyAgID0gQklUKDE1KSwKKwlERUJVR19BREhPQyAgICAgPSBCSVQoMTYpLAorCURFQlVHX0FQCT0gQklUKDE3KSwKKwlERUJVR19NQVNURVIJPSAoREVCVUdfQURIT0MgfCBERUJVR19BUCksCisJREVCVUdfQUxMCT0gfjAsCit9OworCitleHRlcm4gdTMyIHdsMTJ4eF9kZWJ1Z19sZXZlbDsKKworI2RlZmluZSBERUJVR19EVU1QX0xJTUlUIDEwMjQKKworI2RlZmluZSB3bDEyNzFfZXJyb3IoZm10LCBhcmcuLi4pIFwKKwlwcl9lcnIoRFJJVkVSX1BSRUZJWCAiRVJST1IgIiBmbXQgIlxuIiwgIyNhcmcpCisKKyNkZWZpbmUgd2wxMjcxX3dhcm5pbmcoZm10LCBhcmcuLi4pIFwKKwlwcl93YXJuaW5nKERSSVZFUl9QUkVGSVggIldBUk5JTkcgIiBmbXQgIlxuIiwgIyNhcmcpCisKKyNkZWZpbmUgd2wxMjcxX25vdGljZShmbXQsIGFyZy4uLikgXAorCXByX2luZm8oRFJJVkVSX1BSRUZJWCBmbXQgIlxuIiwgIyNhcmcpCisKKyNkZWZpbmUgd2wxMjcxX2luZm8oZm10LCBhcmcuLi4pIFwKKwlwcl9pbmZvKERSSVZFUl9QUkVGSVggZm10ICJcbiIsICMjYXJnKQorCisjZGVmaW5lIHdsMTI3MV9kZWJ1ZyhsZXZlbCwgZm10LCBhcmcuLi4pIFwKKwlkbyB7IFwKKwkJaWYgKGxldmVsICYgd2wxMnh4X2RlYnVnX2xldmVsKSBcCisJCQlwcl9kZWJ1ZyhEUklWRVJfUFJFRklYIGZtdCAiXG4iLCAjI2FyZyk7IFwKKwl9IHdoaWxlICgwKQorCisvKiBUT0RPOiB1c2UgcHJfZGVidWdfaGV4X2R1bXAgd2hlbiBpdCBiZWNvbWVzIGF2YWlsYWJsZSAqLworI2RlZmluZSB3bDEyNzFfZHVtcChsZXZlbCwgcHJlZml4LCBidWYsIGxlbikJXAorCWRvIHsgXAorCQlpZiAobGV2ZWwgJiB3bDEyeHhfZGVidWdfbGV2ZWwpIFwKKwkJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsIERSSVZFUl9QUkVGSVggcHJlZml4LCBcCisJCQkJICAgICAgIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsCVwKKwkJCQkgICAgICAgYnVmLAkJCQlcCisJCQkJICAgICAgIG1pbl90KHNpemVfdCwgbGVuLCBERUJVR19EVU1QX0xJTUlUKSwgXAorCQkJCSAgICAgICAwKTsJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgd2wxMjcxX2R1bXBfYXNjaWkobGV2ZWwsIHByZWZpeCwgYnVmLCBsZW4pCVwKKwlkbyB7IFwKKwkJaWYgKGxldmVsICYgd2wxMnh4X2RlYnVnX2xldmVsKSBcCisJCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCBEUklWRVJfUFJFRklYIHByZWZpeCwgXAorCQkJCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLAlcCisJCQkJICAgICAgIGJ1ZiwJCQkJXAorCQkJCSAgICAgICBtaW5fdChzaXplX3QsIGxlbiwgREVCVUdfRFVNUF9MSU1JVCksIFwKKwkJCQkgICAgICAgdHJ1ZSk7CQkJCVwKKwl9IHdoaWxlICgwKQorCisjZW5kaWYgLyogX19ERUJVR19IX18gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZGVidWdmcy5jCmluZGV4IDM5OTlmZDUuLjE1ZWIzYTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9kZWJ1Z2ZzLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2RlYnVnZnMuYwpAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgIndsMTJ4eC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiYWN4LmgiCiAjaW5jbHVkZSAicHMuaCIKICNpbmNsdWRlICJpby5oIgpAQCAtMzE2LDEyICszMTcsMTkgQEAKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKIAlpbnQgcmVzID0gMDsKLQljaGFyIGJ1ZlsxMDI0XTsKKwlzc2l6ZV90IHJldDsKKwljaGFyICpidWY7CisKKyNkZWZpbmUgRFJJVkVSX1NUQVRFX0JVRl9MRU4gMTAyNAorCisJYnVmID0ga21hbGxvYyhEUklWRVJfU1RBVEVfQlVGX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAogI2RlZmluZSBEUklWRVJfU1RBVEVfUFJJTlQoeCwgZm10KSAgIFwKLQkocmVzICs9IHNjbnByaW50ZihidWYgKyByZXMsIHNpemVvZihidWYpIC0gcmVzLFwKKwkocmVzICs9IHNjbnByaW50ZihidWYgKyByZXMsIERSSVZFUl9TVEFURV9CVUZfTEVOIC0gcmVzLFwKIAkJCSAgI3ggIiA9ICIgZm10ICJcbiIsIHdsLT54KSkKIAogI2RlZmluZSBEUklWRVJfU1RBVEVfUFJJTlRfTE9ORyh4KSBEUklWRVJfU1RBVEVfUFJJTlQoeCwgIiVsZCIpCkBAIC0zNDYsMjkgKzM1NCwxNCBAQAogCURSSVZFUl9TVEFURV9QUklOVF9JTlQodHhfcmVzdWx0c19jb3VudCk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0xIRVgoZmxhZ3MpOwogCURSSVZFUl9TVEFURV9QUklOVF9JTlQodHhfYmxvY2tzX2ZyZWVkKTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYik7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChyeF9jb3VudGVyKTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHNlc3Npb25fY291bnRlcik7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChzdGF0ZSk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChic3NfdHlwZSk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChjaGFubmVsKTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSEVYKHJhdGVfc2V0KTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSEVYKGJhc2ljX3JhdGVfc2V0KTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSEVYKGJhc2ljX3JhdGUpOwogCURSSVZFUl9TVEFURV9QUklOVF9JTlQoYmFuZCk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChiZWFjb25faW50KTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHBzbV9lbnRyeV9yZXRyeSk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChwc19wb2xsX2ZhaWx1cmVzKTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHBvd2VyX2xldmVsKTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHJzc2lfdGhvbGQpOwotCURSSVZFUl9TVEFURV9QUklOVF9JTlQobGFzdF9yc3NpX2V2ZW50KTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKHNnX2VuYWJsZWQpOwogCURSSVZFUl9TVEFURV9QUklOVF9JTlQoZW5hYmxlXzExYSk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0lOVChub2lzZSk7Ci0JRFJJVkVSX1NUQVRFX1BSSU5UX0xIRVgoYXBfaGxpZF9tYXBbMF0pOwotCURSSVZFUl9TVEFURV9QUklOVF9JTlQobGFzdF90eF9obGlkKTsKLQlEUklWRVJfU1RBVEVfUFJJTlRfSU5UKGJhX3N1cHBvcnQpOwotCURSSVZFUl9TVEFURV9QUklOVF9IRVgoYmFfcnhfYml0bWFwKTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSEVYKGFwX2Z3X3BzX21hcCk7CiAJRFJJVkVSX1NUQVRFX1BSSU5UX0xIRVgoYXBfcHNfbWFwKTsKIAlEUklWRVJfU1RBVEVfUFJJTlRfSEVYKHF1aXJrcyk7CkBAIC0zODcsMTAgKzM4MCwxMyBAQAogI3VuZGVmIERSSVZFUl9TVEFURV9QUklOVF9MSEVYCiAjdW5kZWYgRFJJVkVSX1NUQVRFX1BSSU5UX1NUUgogI3VuZGVmIERSSVZFUl9TVEFURV9QUklOVAorI3VuZGVmIERSSVZFUl9TVEFURV9CVUZfTEVOCiAKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiAKLQlyZXR1cm4gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHJlcyk7CisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodXNlcl9idWYsIGNvdW50LCBwcG9zLCBidWYsIHJlcyk7CisJa2ZyZWUoYnVmKTsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkcml2ZXJfc3RhdGVfb3BzID0gewpAQCAtMzk5LDYgKzM5NSwxMTUgQEAKIAkubGxzZWVrID0gZGVmYXVsdF9sbHNlZWssCiB9OwogCitzdGF0aWMgc3NpemVfdCB2aWZzX3N0YXRlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOworCWludCByZXQsIHJlcyA9IDA7CisJY29uc3QgaW50IGJ1Zl9zaXplID0gNDA5NjsKKwljaGFyICpidWY7CisJY2hhciB0bXBfYnVmWzY0XTsKKworCWJ1ZiA9IGt6YWxsb2MoYnVmX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2xvY2soJndsLT5tdXRleCk7CisKKyNkZWZpbmUgVklGX1NUQVRFX1BSSU5UKHgsIGZtdCkJCQkJXAorCShyZXMgKz0gc2NucHJpbnRmKGJ1ZiArIHJlcywgYnVmX3NpemUgLSByZXMsCVwKKwkJCSAgI3ggIiA9ICIgZm10ICJcbiIsIHdsdmlmLT54KSkKKworI2RlZmluZSBWSUZfU1RBVEVfUFJJTlRfTE9ORyh4KSAgVklGX1NUQVRFX1BSSU5UKHgsICIlbGQiKQorI2RlZmluZSBWSUZfU1RBVEVfUFJJTlRfSU5UKHgpICAgVklGX1NUQVRFX1BSSU5UKHgsICIlZCIpCisjZGVmaW5lIFZJRl9TVEFURV9QUklOVF9TVFIoeCkgICBWSUZfU1RBVEVfUFJJTlQoeCwgIiVzIikKKyNkZWZpbmUgVklGX1NUQVRFX1BSSU5UX0xIRVgoeCkgIFZJRl9TVEFURV9QUklOVCh4LCAiMHglbHgiKQorI2RlZmluZSBWSUZfU1RBVEVfUFJJTlRfTExIRVgoeCkgVklGX1NUQVRFX1BSSU5UKHgsICIweCVsbHgiKQorI2RlZmluZSBWSUZfU1RBVEVfUFJJTlRfSEVYKHgpICAgVklGX1NUQVRFX1BSSU5UKHgsICIweCV4IikKKworI2RlZmluZSBWSUZfU1RBVEVfUFJJTlRfTlNUUih4LCBsZW4pCQkJCVwKKwlkbyB7CQkJCQkJCVwKKwkJbWVtc2V0KHRtcF9idWYsIDAsIHNpemVvZih0bXBfYnVmKSk7CQlcCisJCW1lbWNweSh0bXBfYnVmLCB3bHZpZi0+eCwJCQlcCisJCSAgICAgICBtaW5fdCh1OCwgbGVuLCBzaXplb2YodG1wX2J1ZikgLSAxKSk7CVwKKwkJcmVzICs9IHNjbnByaW50ZihidWYgKyByZXMsIGJ1Zl9zaXplIC0gcmVzLAlcCisJCQkJICN4ICIgPSAlc1xuIiwgdG1wX2J1Zik7CVwKKwl9IHdoaWxlICgwKQorCisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgeworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHJvbGVfaWQpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGJzc190eXBlKTsKKwkJVklGX1NUQVRFX1BSSU5UX0xIRVgoZmxhZ3MpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHAycCk7CisJCVZJRl9TVEFURV9QUklOVF9JTlQoZGV2X3JvbGVfaWQpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGRldl9obGlkKTsKKworCQlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MgfHwKKwkJICAgIHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9JQlNTKSB7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHN0YS5obGlkKTsKKwkJCVZJRl9TVEFURV9QUklOVF9JTlQoc3RhLmJhX3J4X2JpdG1hcCk7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHN0YS5iYXNpY19yYXRlX2lkeCk7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHN0YS5hcF9yYXRlX2lkeCk7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHN0YS5wMnBfcmF0ZV9pZHgpOworCQl9IGVsc2UgeworCQkJVklGX1NUQVRFX1BSSU5UX0lOVChhcC5nbG9iYWxfaGxpZCk7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGFwLmJjYXN0X2hsaWQpOworCQkJVklGX1NUQVRFX1BSSU5UX0xIRVgoYXAuc3RhX2hsaWRfbWFwWzBdKTsKKwkJCVZJRl9TVEFURV9QUklOVF9JTlQoYXAubWdtdF9yYXRlX2lkeCk7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGFwLmJjYXN0X3JhdGVfaWR4KTsKKwkJCVZJRl9TVEFURV9QUklOVF9JTlQoYXAudWNhc3RfcmF0ZV9pZHhbMF0pOworCQkJVklGX1NUQVRFX1BSSU5UX0lOVChhcC51Y2FzdF9yYXRlX2lkeFsxXSk7CisJCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGFwLnVjYXN0X3JhdGVfaWR4WzJdKTsKKwkJCVZJRl9TVEFURV9QUklOVF9JTlQoYXAudWNhc3RfcmF0ZV9pZHhbM10pOworCQl9CisJCVZJRl9TVEFURV9QUklOVF9JTlQobGFzdF90eF9obGlkKTsKKwkJVklGX1NUQVRFX1BSSU5UX0xIRVgobGlua3NfbWFwWzBdKTsKKwkJVklGX1NUQVRFX1BSSU5UX05TVFIoc3NpZCwgd2x2aWYtPnNzaWRfbGVuKTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChiYW5kKTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChjaGFubmVsKTsKKwkJVklGX1NUQVRFX1BSSU5UX0hFWChiaXRyYXRlX21hc2tzWzBdKTsKKwkJVklGX1NUQVRFX1BSSU5UX0hFWChiaXRyYXRlX21hc2tzWzFdKTsKKwkJVklGX1NUQVRFX1BSSU5UX0hFWChiYXNpY19yYXRlX3NldCk7CisJCVZJRl9TVEFURV9QUklOVF9IRVgoYmFzaWNfcmF0ZSk7CisJCVZJRl9TVEFURV9QUklOVF9IRVgocmF0ZV9zZXQpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGJlYWNvbl9pbnQpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKGRlZmF1bHRfa2V5KTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChhaWQpOworCQlWSUZfU1RBVEVfUFJJTlRfSU5UKHNlc3Npb25fY291bnRlcik7CisJCVZJRl9TVEFURV9QUklOVF9JTlQocHNfcG9sbF9mYWlsdXJlcyk7CisJCVZJRl9TVEFURV9QUklOVF9JTlQocHNtX2VudHJ5X3JldHJ5KTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChwb3dlcl9sZXZlbCk7CisJCVZJRl9TVEFURV9QUklOVF9JTlQocnNzaV90aG9sZCk7CisJCVZJRl9TVEFURV9QUklOVF9JTlQobGFzdF9yc3NpX2V2ZW50KTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChiYV9zdXBwb3J0KTsKKwkJVklGX1NUQVRFX1BSSU5UX0lOVChiYV9hbGxvd2VkKTsKKwkJVklGX1NUQVRFX1BSSU5UX0xMSEVYKHR4X3NlY3VyaXR5X3NlcSk7CisJCVZJRl9TVEFURV9QUklOVF9JTlQodHhfc2VjdXJpdHlfbGFzdF9zZXFfbHNiKTsKKwl9CisKKyN1bmRlZiBWSUZfU1RBVEVfUFJJTlRfSU5UCisjdW5kZWYgVklGX1NUQVRFX1BSSU5UX0xPTkcKKyN1bmRlZiBWSUZfU1RBVEVfUFJJTlRfSEVYCisjdW5kZWYgVklGX1NUQVRFX1BSSU5UX0xIRVgKKyN1bmRlZiBWSUZfU1RBVEVfUFJJTlRfTExIRVgKKyN1bmRlZiBWSUZfU1RBVEVfUFJJTlRfU1RSCisjdW5kZWYgVklGX1NUQVRFX1BSSU5UX05TVFIKKyN1bmRlZiBWSUZfU1RBVEVfUFJJTlQKKworCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCByZXMpOworCWtmcmVlKGJ1Zik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdmlmc19zdGF0ZV9vcHMgPSB7CisJLnJlYWQgPSB2aWZzX3N0YXRlX3JlYWQsCisJLm9wZW4gPSB3bDEyNzFfb3Blbl9maWxlX2dlbmVyaWMsCisJLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAorfTsKKwogc3RhdGljIHNzaXplX3QgZHRpbV9pbnRlcnZhbF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCiAJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKIHsKQEAgLTUyMCw2ICs2MjUsNyBAQAogCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CiAJaW50IHJldDsKIApAQCAtNTQzLDcgKzY0OSw5IEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0Jd2wxMjcxX3JlY2FsY19yeF9zdHJlYW1pbmcod2wpOworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9zdGEod2wsIHdsdmlmKSB7CisJCXdsMTI3MV9yZWNhbGNfcnhfc3RyZWFtaW5nKHdsLCB3bHZpZik7CisJfQogCiAJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CiBvdXQ6CkBAIC01NzIsNiArNjgwLDcgQEAKIAkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAl1bnNpZ25lZCBsb25nIHZhbHVlOwogCWludCByZXQ7CiAKQEAgLTU5NSw3ICs3MDQsOSBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXdsMTI3MV9yZWNhbGNfcnhfc3RyZWFtaW5nKHdsKTsKKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikgeworCQl3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyh3bCwgd2x2aWYpOworCX0KIAogCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOwogb3V0OgpAQCAtNjI0LDYgKzczNSw3IEBACiAJCQkJICAgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOwogCWNoYXIgYnVmWzEwXTsKIAlzaXplX3QgbGVuOwogCXVuc2lnbmVkIGxvbmcgdmFsdWU7CkBAIC02NDYsNyArNzU4LDkgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCAhIXZhbHVlKTsKKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWYod2wsIHdsdmlmKSB7CisJCXJldCA9IHdsMTI3MV9hY3hfYmVhY29uX2ZpbHRlcl9vcHQod2wsIHdsdmlmLCAhIXZhbHVlKTsKKwl9CiAKIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKIG91dDoKQEAgLTc3MCw2ICs4ODQsNyBAQAogCURFQlVHRlNfQUREKGdwaW9fcG93ZXIsIHJvb3RkaXIpOwogCURFQlVHRlNfQUREKHN0YXJ0X3JlY292ZXJ5LCByb290ZGlyKTsKIAlERUJVR0ZTX0FERChkcml2ZXJfc3RhdGUsIHJvb3RkaXIpOworCURFQlVHRlNfQUREKHZpZnNfc3RhdGUsIHJvb3RkaXIpOwogCURFQlVHRlNfQUREKGR0aW1faW50ZXJ2YWwsIHJvb3RkaXIpOwogCURFQlVHRlNfQUREKGJlYWNvbl9pbnRlcnZhbCwgcm9vdGRpcik7CiAJREVCVUdGU19BREQoYmVhY29uX2ZpbHRlcmluZywgcm9vdGRpcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZXZlbnQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ldmVudC5jCmluZGV4IDY3NGFkMmEuLmQzMjgwZGY2OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2V2ZW50LmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2V2ZW50LmMKQEAgLTIyLDYgKzIyLDcgQEAKICAqLwogCiAjaW5jbHVkZSAid2wxMnh4LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJpby5oIgogI2luY2x1ZGUgImV2ZW50LmgiCkBAIC0zMSwxMiArMzIsMTYgQEAKIAogdm9pZCB3bDEyNzFfcHNwb2xsX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOwogCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrOwogCXN0cnVjdCB3bDEyNzEgKndsOwogCWludCByZXQ7CiAKIAlkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKLQl3bCA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHdsMTI3MSwgcHNwb2xsX3dvcmspOworCXdsdmlmID0gY29udGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiwgcHNwb2xsX3dvcmspOworCXZpZiA9IGNvbnRhaW5lcl9vZigodm9pZCAqKXdsdmlmLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiwgZHJ2X3ByaXYpOworCXdsID0gd2x2aWYtPndsOwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAicHNwb2xsIHdvcmsiKTsKIApAQCAtNDUsMTAgKzUwLDEwIEBACiAJaWYgKHVubGlrZWx5KHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGKSkKIAkJZ290byBvdXQ7CiAKLQlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChXTDEyNzFfRkxBR19QU1BPTExfRkFJTFVSRSwgJndsLT5mbGFncykpCisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoV0xWSUZfRkxBR19QU1BPTExfRkFJTFVSRSwgJndsdmlmLT5mbGFncykpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKSkKIAkJZ290byBvdXQ7CiAKIAkvKgpAQCAtNjAsMzEgKzY1LDMzIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0Jd2wxMjcxX3BzX3NldF9tb2RlKHdsLCBTVEFUSU9OX1BPV0VSX1NBVkVfTU9ERSwgd2wtPmJhc2ljX3JhdGUsIHRydWUpOworCXdsMTI3MV9wc19zZXRfbW9kZSh3bCwgd2x2aWYsIFNUQVRJT05fUE9XRVJfU0FWRV9NT0RFLAorCQkJICAgd2x2aWYtPmJhc2ljX3JhdGUsIHRydWUpOwogCiAJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogfTsKIAotc3RhdGljIHZvaWQgd2wxMjcxX2V2ZW50X3BzcG9sbF9kZWxpdmVyeV9mYWlsKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIHZvaWQgd2wxMjcxX2V2ZW50X3BzcG9sbF9kZWxpdmVyeV9mYWlsKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJaW50IGRlbGF5ID0gd2wtPmNvbmYuY29ubi5wc19wb2xsX3JlY292ZXJ5X3BlcmlvZDsKIAlpbnQgcmV0OwogCi0Jd2wtPnBzX3BvbGxfZmFpbHVyZXMrKzsKLQlpZiAod2wtPnBzX3BvbGxfZmFpbHVyZXMgPT0gMSkKKwl3bHZpZi0+cHNfcG9sbF9mYWlsdXJlcysrOworCWlmICh3bHZpZi0+cHNfcG9sbF9mYWlsdXJlcyA9PSAxKQogCQl3bDEyNzFfaW5mbygiQVAgd2l0aCBkeXNmdW5jdGlvbmFsIHBzLXBvbGwsICIKIAkJCSAgICAidHJ5aW5nIHRvIHdvcmsgYXJvdW5kIGl0LiIpOwogCiAJLyogZm9yY2UgYWN0aXZlIG1vZGUgcmVjZWl2ZSBkYXRhIGZyb20gdGhlIEFQICovCi0JaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTSwgJndsLT5mbGFncykpIHsKLQkJcmV0ID0gd2wxMjcxX3BzX3NldF9tb2RlKHdsLCBTVEFUSU9OX0FDVElWRV9NT0RFLAotCQkJCQkgd2wtPmJhc2ljX3JhdGUsIHRydWUpOworCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX1BTTSwgJndsdmlmLT5mbGFncykpIHsKKwkJcmV0ID0gd2wxMjcxX3BzX3NldF9tb2RlKHdsLCB3bHZpZiwgU1RBVElPTl9BQ1RJVkVfTU9ERSwKKwkJCQkJIHdsdmlmLT5iYXNpY19yYXRlLCB0cnVlKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm47Ci0JCXNldF9iaXQoV0wxMjcxX0ZMQUdfUFNQT0xMX0ZBSUxVUkUsICZ3bC0+ZmxhZ3MpOwotCQlpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKHdsLT5odywgJndsLT5wc3BvbGxfd29yaywKKwkJc2V0X2JpdChXTFZJRl9GTEFHX1BTUE9MTF9GQUlMVVJFLCAmd2x2aWYtPmZsYWdzKTsKKwkJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayh3bC0+aHcsICZ3bHZpZi0+cHNwb2xsX3dvcmssCiAJCQkJCSAgICAgbXNlY3NfdG9famlmZmllcyhkZWxheSkpOwogCX0KIApAQCAtOTcsNiArMTA0LDcgQEAKIH0KIAogc3RhdGljIGludCB3bDEyNzFfZXZlbnRfcHNfcmVwb3J0KHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAogCQkJCSAgc3RydWN0IGV2ZW50X21haWxib3ggKm1ib3gsCiAJCQkJICBib29sICpiZWFjb25fbG9zcykKIHsKQEAgLTEwOSw0MSArMTE3LDM3IEBACiAJY2FzZSBFVkVOVF9FTlRFUl9QT1dFUl9TQVZFX0ZBSUw6CiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19QU00sICJQU00gZW50cnkgZmFpbGVkIik7CiAKLQkJaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19QU00sICZ3bC0+ZmxhZ3MpKSB7CisJCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19QU00sICZ3bHZpZi0+ZmxhZ3MpKSB7CiAJCQkvKiByZW1haW4gaW4gYWN0aXZlIG1vZGUgKi8KLQkJCXdsLT5wc21fZW50cnlfcmV0cnkgPSAwOworCQkJd2x2aWYtPnBzbV9lbnRyeV9yZXRyeSA9IDA7CiAJCQlicmVhazsKIAkJfQogCi0JCWlmICh3bC0+cHNtX2VudHJ5X3JldHJ5IDwgdG90YWxfcmV0cmllcykgewotCQkJd2wtPnBzbV9lbnRyeV9yZXRyeSsrOwotCQkJcmV0ID0gd2wxMjcxX3BzX3NldF9tb2RlKHdsLCBTVEFUSU9OX1BPV0VSX1NBVkVfTU9ERSwKLQkJCQkJCSB3bC0+YmFzaWNfcmF0ZSwgdHJ1ZSk7CisJCWlmICh3bHZpZi0+cHNtX2VudHJ5X3JldHJ5IDwgdG90YWxfcmV0cmllcykgeworCQkJd2x2aWYtPnBzbV9lbnRyeV9yZXRyeSsrOworCQkJcmV0ID0gd2wxMjcxX3BzX3NldF9tb2RlKHdsLCB3bHZpZiwKKwkJCQkJCSBTVEFUSU9OX1BPV0VSX1NBVkVfTU9ERSwKKwkJCQkJCSB3bHZpZi0+YmFzaWNfcmF0ZSwgdHJ1ZSk7CiAJCX0gZWxzZSB7CiAJCQl3bDEyNzFfaW5mbygiTm8gYWNrIHRvIG51bGxmdW5jIGZyb20gQVAuIik7Ci0JCQl3bC0+cHNtX2VudHJ5X3JldHJ5ID0gMDsKKwkJCXdsdmlmLT5wc21fZW50cnlfcmV0cnkgPSAwOwogCQkJKmJlYWNvbl9sb3NzID0gdHJ1ZTsKIAkJfQogCQlicmVhazsKIAljYXNlIEVWRU5UX0VOVEVSX1BPV0VSX1NBVkVfU1VDQ0VTUzoKLQkJd2wtPnBzbV9lbnRyeV9yZXRyeSA9IDA7Ci0KLQkJLyogZW5hYmxlIGJlYWNvbiBmaWx0ZXJpbmcgKi8KLQkJcmV0ID0gd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdCh3bCwgdHJ1ZSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJYnJlYWs7CisJCXdsdmlmLT5wc21fZW50cnlfcmV0cnkgPSAwOwogCiAJCS8qCiAJCSAqIEJFVCBoYXMgb25seSBhIG1pbm9yIGVmZmVjdCBpbiA1R0h6IGFuZCBtYXNrcwogCQkgKiBjaGFubmVsIHN3aXRjaCBJRXMsIHNvIHdlIG9ubHkgZW5hYmxlIEJFVCBvbiAyLjRHSHoKIAkJKi8KLQkJaWYgKHdsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopCisJCWlmICh3bHZpZi0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQogCQkJLyogZW5hYmxlIGJlYWNvbiBlYXJseSB0ZXJtaW5hdGlvbiAqLwotCQkJcmV0ID0gd2wxMjcxX2FjeF9iZXRfZW5hYmxlKHdsLCB0cnVlKTsKKwkJCXJldCA9IHdsMTI3MV9hY3hfYmV0X2VuYWJsZSh3bCwgd2x2aWYsIHRydWUpOwogCi0JCWlmICh3bC0+cHNfY29tcGwpIHsKLQkJCWNvbXBsZXRlKHdsLT5wc19jb21wbCk7Ci0JCQl3bC0+cHNfY29tcGwgPSBOVUxMOworCQlpZiAod2x2aWYtPnBzX2NvbXBsKSB7CisJCQljb21wbGV0ZSh3bHZpZi0+cHNfY29tcGwpOworCQkJd2x2aWYtPnBzX2NvbXBsID0gTlVMTDsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMTU0LDM5ICsxNTgsNDQgQEAKIH0KIAogc3RhdGljIHZvaWQgd2wxMjcxX2V2ZW50X3Jzc2lfdHJpZ2dlcihzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCiAJCQkJICAgICAgc3RydWN0IGV2ZW50X21haWxib3ggKm1ib3gpCiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOwogCWVudW0gbmw4MDIxMV9jcW1fcnNzaV90aHJlc2hvbGRfZXZlbnQgZXZlbnQ7CiAJczggbWV0cmljID0gbWJveC0+cnNzaV9zbnJfdHJpZ2dlcl9tZXRyaWNbMF07CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJSU1NJIHRyaWdnZXIgbWV0cmljOiAlZCIsIG1ldHJpYyk7CiAKLQlpZiAobWV0cmljIDw9IHdsLT5yc3NpX3Rob2xkKQorCWlmIChtZXRyaWMgPD0gd2x2aWYtPnJzc2lfdGhvbGQpCiAJCWV2ZW50ID0gTkw4MDIxMV9DUU1fUlNTSV9USFJFU0hPTERfRVZFTlRfTE9XOwogCWVsc2UKIAkJZXZlbnQgPSBOTDgwMjExX0NRTV9SU1NJX1RIUkVTSE9MRF9FVkVOVF9ISUdIOwogCi0JaWYgKGV2ZW50ICE9IHdsLT5sYXN0X3Jzc2lfZXZlbnQpCi0JCWllZWU4MDIxMV9jcW1fcnNzaV9ub3RpZnkod2wtPnZpZiwgZXZlbnQsIEdGUF9LRVJORUwpOwotCXdsLT5sYXN0X3Jzc2lfZXZlbnQgPSBldmVudDsKKwlpZiAoZXZlbnQgIT0gd2x2aWYtPmxhc3RfcnNzaV9ldmVudCkKKwkJaWVlZTgwMjExX2NxbV9yc3NpX25vdGlmeSh2aWYsIGV2ZW50LCBHRlBfS0VSTkVMKTsKKwl3bHZpZi0+bGFzdF9yc3NpX2V2ZW50ID0gZXZlbnQ7CiB9CiAKLXN0YXRpYyB2b2lkIHdsMTI3MV9zdG9wX2JhX2V2ZW50KHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIHZvaWQgd2wxMjcxX3N0b3BfYmFfZXZlbnQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKLQlpZiAod2wtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUykgewotCQlpZiAoIXdsLT5iYV9yeF9iaXRtYXApCisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOworCisJaWYgKHdsdmlmLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9BUF9CU1MpIHsKKwkJaWYgKCF3bHZpZi0+c3RhLmJhX3J4X2JpdG1hcCkKIAkJCXJldHVybjsKLQkJaWVlZTgwMjExX3N0b3BfcnhfYmFfc2Vzc2lvbih3bC0+dmlmLCB3bC0+YmFfcnhfYml0bWFwLAotCQkJCQkgICAgIHdsLT5ic3NpZCk7CisJCWllZWU4MDIxMV9zdG9wX3J4X2JhX3Nlc3Npb24odmlmLCB3bHZpZi0+c3RhLmJhX3J4X2JpdG1hcCwKKwkJCQkJICAgICB2aWYtPmJzc19jb25mLmJzc2lkKTsKIAl9IGVsc2UgewotCQlpbnQgaTsKKwkJdTggaGxpZDsKIAkJc3RydWN0IHdsMTI3MV9saW5rICpsbms7Ci0JCWZvciAoaSA9IFdMMTI3MV9BUF9TVEFfSExJRF9TVEFSVDsgaSA8IEFQX01BWF9MSU5LUzsgaSsrKSB7Ci0JCQlsbmsgPSAmd2wtPmxpbmtzW2ldOwotCQkJaWYgKCF3bDEyNzFfaXNfYWN0aXZlX3N0YSh3bCwgaSkgfHwgIWxuay0+YmFfYml0bWFwKQorCQlmb3JfZWFjaF9zZXRfYml0KGhsaWQsIHdsdmlmLT5hcC5zdGFfaGxpZF9tYXAsCisJCQkJIFdMMTJYWF9NQVhfTElOS1MpIHsKKwkJCWxuayA9ICZ3bC0+bGlua3NbaGxpZF07CisJCQlpZiAoIWxuay0+YmFfYml0bWFwKQogCQkJCWNvbnRpbnVlOwogCi0JCQlpZWVlODAyMTFfc3RvcF9yeF9iYV9zZXNzaW9uKHdsLT52aWYsCisJCQlpZWVlODAyMTFfc3RvcF9yeF9iYV9zZXNzaW9uKHZpZiwKIAkJCQkJCSAgICAgbG5rLT5iYV9iaXRtYXAsCiAJCQkJCQkgICAgIGxuay0+YWRkcik7CiAJCX0KQEAgLTE5NiwxNCArMjA1LDIzIEBACiBzdGF0aWMgdm9pZCB3bDEyeHhfZXZlbnRfc29mdF9nZW1pbmlfc2Vuc2Uoc3RydWN0IHdsMTI3MSAqd2wsCiAJCQkJCSAgICAgICB1OCBlbmFibGUpCiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CisKIAlpZiAoZW5hYmxlKSB7CiAJCS8qIGRpc2FibGUgZHluYW1pYyBQUyB3aGVuIHJlcXVlc3RlZCBieSB0aGUgZmlybXdhcmUgKi8KLQkJaWVlZTgwMjExX2Rpc2FibGVfZHluX3BzKHdsLT52aWYpOworCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikgeworCQkJdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CisJCQlpZWVlODAyMTFfZGlzYWJsZV9keW5fcHModmlmKTsKKwkJfQogCQlzZXRfYml0KFdMMTI3MV9GTEFHX1NPRlRfR0VNSU5JLCAmd2wtPmZsYWdzKTsKIAl9IGVsc2UgewotCQlpZWVlODAyMTFfZW5hYmxlX2R5bl9wcyh3bC0+dmlmKTsKIAkJY2xlYXJfYml0KFdMMTI3MV9GTEFHX1NPRlRfR0VNSU5JLCAmd2wtPmZsYWdzKTsKLQkJd2wxMjcxX3JlY2FsY19yeF9zdHJlYW1pbmcod2wpOworCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikgeworCQkJdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CisJCQlpZWVlODAyMTFfZW5hYmxlX2R5bl9wcyh2aWYpOworCQkJd2wxMjcxX3JlY2FsY19yeF9zdHJlYW1pbmcod2wsIHdsdmlmKTsKKwkJfQogCX0KIAogfQpAQCAtMjE3LDEwICsyMzUsMTEgQEAKIAogc3RhdGljIGludCB3bDEyNzFfZXZlbnRfcHJvY2VzcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IGV2ZW50X21haWxib3ggKm1ib3gpCiB7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CiAJaW50IHJldDsKIAl1MzIgdmVjdG9yOwogCWJvb2wgYmVhY29uX2xvc3MgPSBmYWxzZTsKLQlib29sIGlzX2FwID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpOwogCWJvb2wgZGlzY29ubmVjdF9zdGEgPSBmYWxzZTsKIAl1bnNpZ25lZCBsb25nIHN0YV9iaXRtYXAgPSAwOwogCkBAIC0yMzQsNyArMjUzLDcgQEAKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAic3RhdHVzOiAweCV4IiwKIAkJCSAgICAgbWJveC0+c2NoZWR1bGVkX3NjYW5fc3RhdHVzKTsKIAotCQl3bDEyNzFfc2Nhbl9zdG0od2wpOworCQl3bDEyNzFfc2Nhbl9zdG0od2wsIHdsLT5zY2FuX3ZpZik7CiAJfQogCiAJaWYgKHZlY3RvciAmIFBFUklPRElDX1NDQU5fUkVQT1JUX0VWRU5UX0lEKSB7CkBAIC0yNDgsMTMgKzI2NywxMiBAQAogCQl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJQRVJJT0RJQ19TQ0FOX0NPTVBMRVRFX0VWRU5UICIKIAkJCSAgICAgIihzdGF0dXMgMHglMHgpIiwgbWJveC0+c2NoZWR1bGVkX3NjYW5fc3RhdHVzKTsKIAkJaWYgKHdsLT5zY2hlZF9zY2FubmluZykgewotCQkJd2wxMjcxX3NjYW5fc2NoZWRfc2Nhbl9zdG9wKHdsKTsKIAkJCWllZWU4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWQod2wtPmh3KTsKKwkJCXdsLT5zY2hlZF9zY2FubmluZyA9IGZhbHNlOwogCQl9CiAJfQogCi0JaWYgKHZlY3RvciAmIFNPRlRfR0VNSU5JX1NFTlNFX0VWRU5UX0lEICYmCi0JICAgIHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKQorCWlmICh2ZWN0b3IgJiBTT0ZUX0dFTUlOSV9TRU5TRV9FVkVOVF9JRCkKIAkJd2wxMnh4X2V2ZW50X3NvZnRfZ2VtaW5pX3NlbnNlKHdsLAogCQkJCQkgICAgICAgbWJveC0+c29mdF9nZW1pbmlfc2Vuc2VfaW5mbyk7CiAKQEAgLTI2Nyw0MCArMjg1LDU0IEBACiAJICogQlNTX0xPU0VfRVZFTlQsIGJlYWNvbiBsb3NzIGhhcyB0byBiZSByZXBvcnRlZCB0byB0aGUgc3RhY2suCiAJICoKIAkgKi8KLQlpZiAoKHZlY3RvciAmIEJTU19MT1NFX0VWRU5UX0lEKSAmJiAhaXNfYXApIHsKKwlpZiAodmVjdG9yICYgQlNTX0xPU0VfRVZFTlRfSUQpIHsKKwkJLyogVE9ETzogY2hlY2sgZm9yIG11bHRpLXJvbGUgKi8KIAkJd2wxMjcxX2luZm8oIkJlYWNvbiBsb3NzIGRldGVjdGVkLiIpOwogCiAJCS8qIGluZGljYXRlIHRvIHRoZSBzdGFjaywgdGhhdCBiZWFjb25zIGhhdmUgYmVlbiBsb3N0ICovCiAJCWJlYWNvbl9sb3NzID0gdHJ1ZTsKIAl9CiAKLQlpZiAoKHZlY3RvciAmIFBTX1JFUE9SVF9FVkVOVF9JRCkgJiYgIWlzX2FwKSB7CisJaWYgKHZlY3RvciAmIFBTX1JFUE9SVF9FVkVOVF9JRCkgewogCQl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJQU19SRVBPUlRfRVZFTlQiKTsKLQkJcmV0ID0gd2wxMjcxX2V2ZW50X3BzX3JlcG9ydCh3bCwgbWJveCwgJmJlYWNvbl9sb3NzKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikgeworCQkJcmV0ID0gd2wxMjcxX2V2ZW50X3BzX3JlcG9ydCh3bCwgd2x2aWYsCisJCQkJCQkgICAgIG1ib3gsICZiZWFjb25fbG9zcyk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CiAJfQogCi0JaWYgKCh2ZWN0b3IgJiBQU1BPTExfREVMSVZFUllfRkFJTFVSRV9FVkVOVF9JRCkgJiYgIWlzX2FwKQotCQl3bDEyNzFfZXZlbnRfcHNwb2xsX2RlbGl2ZXJ5X2ZhaWwod2wpOworCWlmICh2ZWN0b3IgJiBQU1BPTExfREVMSVZFUllfRkFJTFVSRV9FVkVOVF9JRCkKKwkJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX3N0YSh3bCwgd2x2aWYpIHsKKwkJCXdsMTI3MV9ldmVudF9wc3BvbGxfZGVsaXZlcnlfZmFpbCh3bCwgd2x2aWYpOworCQl9CiAKIAlpZiAodmVjdG9yICYgUlNTSV9TTlJfVFJJR0dFUl8wX0VWRU5UX0lEKSB7CisJCS8qIFRPRE86IGNoZWNrIGFjdHVhbCBtdWx0aS1yb2xlIHN1cHBvcnQgKi8KIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiUlNTSV9TTlJfVFJJR0dFUl8wX0VWRU5UIik7Ci0JCWlmICh3bC0+dmlmKQotCQkJd2wxMjcxX2V2ZW50X3Jzc2lfdHJpZ2dlcih3bCwgbWJveCk7CisJCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9zdGEod2wsIHdsdmlmKSB7CisJCQl3bDEyNzFfZXZlbnRfcnNzaV90cmlnZ2VyKHdsLCB3bHZpZiwgbWJveCk7CisJCX0KIAl9CiAKLQlpZiAoKHZlY3RvciAmIEJBX1NFU1NJT05fUlhfQ09OU1RSQUlOVF9FVkVOVF9JRCkpIHsKKwlpZiAodmVjdG9yICYgQkFfU0VTU0lPTl9SWF9DT05TVFJBSU5UX0VWRU5UX0lEKSB7CisJCXU4IHJvbGVfaWQgPSBtYm94LT5yb2xlX2lkOwogCQl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJCQV9TRVNTSU9OX1JYX0NPTlNUUkFJTlRfRVZFTlRfSUQuICIKLQkJCSAgICAgImJhX2FsbG93ZWQgPSAweCV4IiwgbWJveC0+cnhfYmFfYWxsb3dlZCk7CisJCQkgICAgICJiYV9hbGxvd2VkID0gMHgleCwgcm9sZV9pZD0lZCIsCisJCQkgICAgIG1ib3gtPnJ4X2JhX2FsbG93ZWQsIHJvbGVfaWQpOwogCi0JCXdsLT5iYV9hbGxvd2VkID0gISFtYm94LT5yeF9iYV9hbGxvd2VkOworCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWYod2wsIHdsdmlmKSB7CisJCQlpZiAocm9sZV9pZCAhPSAweGZmICYmIHJvbGVfaWQgIT0gd2x2aWYtPnJvbGVfaWQpCisJCQkJY29udGludWU7CiAKLQkJaWYgKHdsLT52aWYgJiYgIXdsLT5iYV9hbGxvd2VkKQotCQkJd2wxMjcxX3N0b3BfYmFfZXZlbnQod2wpOworCQkJd2x2aWYtPmJhX2FsbG93ZWQgPSAhIW1ib3gtPnJ4X2JhX2FsbG93ZWQ7CisJCQlpZiAoIXdsdmlmLT5iYV9hbGxvd2VkKQorCQkJCXdsMTI3MV9zdG9wX2JhX2V2ZW50KHdsLCB3bHZpZik7CisJCX0KIAl9CiAKLQlpZiAoKHZlY3RvciAmIENIQU5ORUxfU1dJVENIX0NPTVBMRVRFX0VWRU5UX0lEKSAmJiAhaXNfYXApIHsKKwlpZiAodmVjdG9yICYgQ0hBTk5FTF9TV0lUQ0hfQ09NUExFVEVfRVZFTlRfSUQpIHsKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiQ0hBTk5FTF9TV0lUQ0hfQ09NUExFVEVfRVZFTlRfSUQuICIKIAkJCQkJICAic3RhdHVzID0gMHgleCIsCiAJCQkJCSAgbWJveC0+Y2hhbm5lbF9zd2l0Y2hfc3RhdHVzKTsKQEAgLTMwOSw1MCArMzQxLDY1IEBACiAJCSAqIDEpIGNoYW5uZWwgc3dpdGNoIGNvbXBsZXRlIHdpdGggc3RhdHVzPTAKIAkJICogMikgY2hhbm5lbCBzd2l0Y2ggZmFpbGVkIHN0YXR1cz0xCiAJCSAqLwotCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdMMTI3MV9GTEFHX0NTX1BST0dSRVNTLCAmd2wtPmZsYWdzKSAmJgotCQkgICAgKHdsLT52aWYpKQotCQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUod2wtPnZpZiwKLQkJCQltYm94LT5jaGFubmVsX3N3aXRjaF9zdGF0dXMgPyBmYWxzZSA6IHRydWUpOworCisJCS8qIFRPRE86IGNvbmZpZ3VyZSBvbmx5IHRoZSByZWxldmFudCB2aWYgKi8KKwkJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX3N0YSh3bCwgd2x2aWYpIHsKKwkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwkJCWJvb2wgc3VjY2VzczsKKworCQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoV0xWSUZfRkxBR19DU19QUk9HUkVTUywKKwkJCQkJCSZ3bC0+ZmxhZ3MpKQorCQkJCWNvbnRpbnVlOworCisJCQlzdWNjZXNzID0gbWJveC0+Y2hhbm5lbF9zd2l0Y2hfc3RhdHVzID8gZmFsc2UgOiB0cnVlOworCQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUodmlmLCBzdWNjZXNzKTsKKwkJfQogCX0KIAogCWlmICgodmVjdG9yICYgRFVNTVlfUEFDS0VUX0VWRU5UX0lEKSkgewogCQl3bDEyNzFfZGVidWcoREVCVUdfRVZFTlQsICJEVU1NWV9QQUNLRVRfSURfRVZFTlRfSUQiKTsKLQkJaWYgKHdsLT52aWYpCi0JCQl3bDEyNzFfdHhfZHVtbXlfcGFja2V0KHdsKTsKKwkJd2wxMjcxX3R4X2R1bW15X3BhY2tldCh3bCk7CiAJfQogCiAJLyoKIAkgKiAiVFggcmV0cmllcyBleGNlZWRlZCIgaGFzIGEgZGlmZmVyZW50IG1lYW5pbmcgYWNjb3JkaW5nIHRvIG1vZGUuCiAJICogSW4gQVAgbW9kZSB0aGUgb2ZmZW5kaW5nIHN0YXRpb24gaXMgZGlzY29ubmVjdGVkLgogCSAqLwotCWlmICgodmVjdG9yICYgTUFYX1RYX1JFVFJZX0VWRU5UX0lEKSAmJiBpc19hcCkgeworCWlmICh2ZWN0b3IgJiBNQVhfVFhfUkVUUllfRVZFTlRfSUQpIHsKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiTUFYX1RYX1JFVFJZX0VWRU5UX0lEIik7CiAJCXN0YV9iaXRtYXAgfD0gbGUxNl90b19jcHUobWJveC0+c3RhX3R4X3JldHJ5X2V4Y2VlZGVkKTsKIAkJZGlzY29ubmVjdF9zdGEgPSB0cnVlOwogCX0KIAotCWlmICgodmVjdG9yICYgSU5BQ1RJVkVfU1RBX0VWRU5UX0lEKSAmJiBpc19hcCkgeworCWlmICh2ZWN0b3IgJiBJTkFDVElWRV9TVEFfRVZFTlRfSUQpIHsKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0VWRU5ULCAiSU5BQ1RJVkVfU1RBX0VWRU5UX0lEIik7CiAJCXN0YV9iaXRtYXAgfD0gbGUxNl90b19jcHUobWJveC0+c3RhX2FnaW5nX3N0YXR1cyk7CiAJCWRpc2Nvbm5lY3Rfc3RhID0gdHJ1ZTsKIAl9CiAKLQlpZiAoaXNfYXAgJiYgZGlzY29ubmVjdF9zdGEpIHsKKwlpZiAoZGlzY29ubmVjdF9zdGEpIHsKIAkJdTMyIG51bV9wYWNrZXRzID0gd2wtPmNvbmYudHgubWF4X3R4X3JldHJpZXM7CiAJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CiAJCWNvbnN0IHU4ICphZGRyOwogCQlpbnQgaDsKIAotCQlmb3IgKGggPSBmaW5kX2ZpcnN0X2JpdCgmc3RhX2JpdG1hcCwgQVBfTUFYX0xJTktTKTsKLQkJICAgICBoIDwgQVBfTUFYX0xJTktTOwotCQkgICAgIGggPSBmaW5kX25leHRfYml0KCZzdGFfYml0bWFwLCBBUF9NQVhfTElOS1MsIGgrMSkpIHsKLQkJCWlmICghd2wxMjcxX2lzX2FjdGl2ZV9zdGEod2wsIGgpKQorCQlmb3JfZWFjaF9zZXRfYml0KGgsICZzdGFfYml0bWFwLCBXTDEyWFhfTUFYX0xJTktTKSB7CisJCQlib29sIGZvdW5kID0gZmFsc2U7CisJCQkvKiBmaW5kIHRoZSBhcCB2aWYgY29ubmVjdGVkIHRvIHRoaXMgc3RhICovCisJCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfYXAod2wsIHdsdmlmKSB7CisJCQkJaWYgKCF0ZXN0X2JpdChoLCB3bHZpZi0+YXAuc3RhX2hsaWRfbWFwKSkKKwkJCQkJY29udGludWU7CisJCQkJZm91bmQgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFmb3VuZCkKIAkJCQljb250aW51ZTsKIAorCQkJdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CiAJCQlhZGRyID0gd2wtPmxpbmtzW2hdLmFkZHI7CiAKIAkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh3bC0+dmlmLCBhZGRyKTsKKwkJCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh2aWYsIGFkZHIpOwogCQkJaWYgKHN0YSkgewogCQkJCXdsMTI3MV9kZWJ1ZyhERUJVR19FVkVOVCwgInJlbW92ZSBzdGEgJWQiLCBoKTsKIAkJCQlpZWVlODAyMTFfcmVwb3J0X2xvd19hY2soc3RhLCBudW1fcGFja2V0cyk7CkBAIC0zNjEsOCArNDA4LDExIEBACiAJCX0KIAl9CiAKLQlpZiAod2wtPnZpZiAmJiBiZWFjb25fbG9zcykKLQkJaWVlZTgwMjExX2Nvbm5lY3Rpb25fbG9zcyh3bC0+dmlmKTsKKwlpZiAoYmVhY29uX2xvc3MpCisJCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9zdGEod2wsIHdsdmlmKSB7CisJCQl2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwkJCWllZWU4MDIxMV9jb25uZWN0aW9uX2xvc3ModmlmKTsKKwkJfQogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvZXZlbnQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ldmVudC5oCmluZGV4IDQ5YzFhMGUuLjFkODc4YmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ldmVudC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9ldmVudC5oCkBAIC0xMzIsNyArMTMyLDQgQEAKIGludCB3bDEyNzFfZXZlbnRfaGFuZGxlKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBtYm94KTsKIHZvaWQgd2wxMjcxX3BzcG9sbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKLS8qIEZ1bmN0aW9ucyBmcm9tIG1haW4uYyAqLwotYm9vbCB3bDEyNzFfaXNfYWN0aXZlX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCk7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2luaXQuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pbml0LmMKaW5kZXggMDRkYjY0Yy4uY2E3ZWU1OSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2luaXQuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW5pdC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogCisjaW5jbHVkZSAiZGVidWcuaCIKICNpbmNsdWRlICJpbml0LmgiCiAjaW5jbHVkZSAid2wxMnh4XzgwMjExLmgiCiAjaW5jbHVkZSAiYWN4LmgiCkBAIC0zMyw3ICszNCw3IEBACiAjaW5jbHVkZSAidHguaCIKICNpbmNsdWRlICJpby5oIgogCi1pbnQgd2wxMjcxX3N0YV9pbml0X3RlbXBsYXRlc19jb25maWcoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2luaXRfdGVtcGxhdGVzX2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAlpbnQgcmV0LCBpOwogCkBAIC02NCw3ICs2NSw3IEBACiAKIAlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX1FPU19OVUxMX0RBVEEsIE5VTEwsCiAJCQkJICAgICAgc2l6ZW9mCi0JCQkJICAgICAgKHN0cnVjdCB3bDEyeHhfcW9zX251bGxfZGF0YV90ZW1wbGF0ZSksCisJCQkJICAgICAgKHN0cnVjdCBpZWVlODAyMTFfcW9zX2hkciksCiAJCQkJICAgICAgMCwgV0wxMjcxX1JBVEVfQVVUT01BVElDKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKQEAgLTg4LDEwNSArODksNiBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JZm9yIChpID0gMDsgaSA8IENNRF9URU1QTF9LTFZfSURYX01BWDsgaSsrKSB7Ci0JCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfVEVNUExfS0xWLCBOVUxMLAotCQkJCQkgICAgICBXTDEyNzFfQ01EX1RFTVBMX0RGTFRfU0laRSwgaSwKLQkJCQkJICAgICAgV0wxMjcxX1JBVEVfQVVUT01BVElDKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHdsMTI3MV9hcF9pbml0X2RlYXV0aF90ZW1wbGF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlzdHJ1Y3Qgd2wxMnh4X2Rpc2Nvbm5fdGVtcGxhdGUgKnRtcGw7Ci0JaW50IHJldDsKLQl1MzIgcmF0ZTsKLQotCXRtcGwgPSBremFsbG9jKHNpemVvZigqdG1wbCksIEdGUF9LRVJORUwpOwotCWlmICghdG1wbCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQl0bXBsLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAotCQkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOwotCi0JcmF0ZSA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsLT5iYXNpY19yYXRlX3NldCk7Ci0JcmV0ID0gd2wxMjcxX2NtZF90ZW1wbGF0ZV9zZXQod2wsIENNRF9URU1QTF9ERUFVVEhfQVAsCi0JCQkJICAgICAgdG1wbCwgc2l6ZW9mKCp0bXBsKSwgMCwgcmF0ZSk7Ci0KLW91dDoKLQlrZnJlZSh0bXBsKTsKLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IHdsMTI3MV9hcF9pbml0X251bGxfdGVtcGxhdGUoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm51bGxmdW5jOwotCWludCByZXQ7Ci0JdTMyIHJhdGU7Ci0KLQludWxsZnVuYyA9IGt6YWxsb2Moc2l6ZW9mKCpudWxsZnVuYyksIEdGUF9LRVJORUwpOwotCWlmICghbnVsbGZ1bmMpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JbnVsbGZ1bmMtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8Ci0JCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQyB8Ci0JCQkJCSAgICAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0KLQkvKiBudWxsZnVuYy0+YWRkcjEgaXMgZmlsbGVkIGJ5IEZXICovCi0KLQltZW1jcHkobnVsbGZ1bmMtPmFkZHIyLCB3bC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKLQltZW1jcHkobnVsbGZ1bmMtPmFkZHIzLCB3bC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKLQotCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOwotCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfVEVNUExfTlVMTF9EQVRBLCBudWxsZnVuYywKLQkJCQkgICAgICBzaXplb2YoKm51bGxmdW5jKSwgMCwgcmF0ZSk7Ci0KLW91dDoKLQlrZnJlZShudWxsZnVuYyk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCB3bDEyNzFfYXBfaW5pdF9xb3NfbnVsbF90ZW1wbGF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIgKnFvc251bGw7Ci0JaW50IHJldDsKLQl1MzIgcmF0ZTsKLQotCXFvc251bGwgPSBremFsbG9jKHNpemVvZigqcW9zbnVsbCksIEdGUF9LRVJORUwpOwotCWlmICghcW9zbnVsbCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlxb3NudWxsLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX0RBVEEgfAotCQkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9RT1NfTlVMTEZVTkMgfAotCQkJCQkgICAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7Ci0KLQkvKiBxb3NudWxsLT5hZGRyMSBpcyBmaWxsZWQgYnkgRlcgKi8KLQotCW1lbWNweShxb3NudWxsLT5hZGRyMiwgd2wtPm1hY19hZGRyLCBFVEhfQUxFTik7Ci0JbWVtY3B5KHFvc251bGwtPmFkZHIzLCB3bC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKLQotCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOwotCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfVEVNUExfUU9TX05VTExfREFUQSwgcW9zbnVsbCwKLQkJCQkgICAgICBzaXplb2YoKnFvc251bGwpLCAwLCByYXRlKTsKLQotb3V0OgotCWtmcmVlKHFvc251bGwpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2wxMjcxX2FwX2luaXRfdGVtcGxhdGVzX2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlpbnQgcmV0OwotCiAJLyoKIAkgKiBQdXQgdmVyeSBsYXJnZSBlbXB0eSBwbGFjZWhvbGRlcnMgZm9yIGFsbCB0ZW1wbGF0ZXMuIFRoZXNlCiAJICogcmVzZXJ2ZSBtZW1vcnkgZm9yIGxhdGVyLgpAQCAtMjEwLDIyICsxMTIsMTA2IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX05VTExfREFUQSwgTlVMTCwKLQkJCQkgICAgICBzaXplb2Yoc3RydWN0IHdsMTJ4eF9udWxsX2RhdGFfdGVtcGxhdGUpLAotCQkJCSAgICAgIDAsIFdMMTI3MV9SQVRFX0FVVE9NQVRJQyk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX1FPU19OVUxMX0RBVEEsIE5VTEwsCi0JCQkJICAgICAgc2l6ZW9mCi0JCQkJICAgICAgKHN0cnVjdCB3bDEyeHhfcW9zX251bGxfZGF0YV90ZW1wbGF0ZSksCi0JCQkJICAgICAgMCwgV0wxMjcxX1JBVEVfQVVUT01BVElDKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKKwlmb3IgKGkgPSAwOyBpIDwgQ01EX1RFTVBMX0tMVl9JRFhfTUFYOyBpKyspIHsKKwkJcmV0ID0gd2wxMjcxX2NtZF90ZW1wbGF0ZV9zZXQod2wsIENNRF9URU1QTF9LTFYsIE5VTEwsCisJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Fvc19oZHIpLAorCQkJCQkgICAgICBpLCBXTDEyNzFfUkFURV9BVVRPTUFUSUMpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgd2wxMjcxX2FwX2luaXRfZGVhdXRoX3RlbXBsYXRlKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKK3sKKwlzdHJ1Y3Qgd2wxMnh4X2Rpc2Nvbm5fdGVtcGxhdGUgKnRtcGw7CisJaW50IHJldDsKKwl1MzIgcmF0ZTsKKworCXRtcGwgPSBremFsbG9jKHNpemVvZigqdG1wbCksIEdGUF9LRVJORUwpOworCWlmICghdG1wbCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwl0bXBsLT5oZWFkZXIuZnJhbWVfY3RsID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAorCQkJCQkgICAgIElFRUU4MDIxMV9TVFlQRV9ERUFVVEgpOworCisJcmF0ZSA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsdmlmLT5iYXNpY19yYXRlX3NldCk7CisJcmV0ID0gd2wxMjcxX2NtZF90ZW1wbGF0ZV9zZXQod2wsIENNRF9URU1QTF9ERUFVVEhfQVAsCisJCQkJICAgICAgdG1wbCwgc2l6ZW9mKCp0bXBsKSwgMCwgcmF0ZSk7CisKK291dDoKKwlrZnJlZSh0bXBsKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsMTI3MV9hcF9pbml0X251bGxfdGVtcGxhdGUoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgKm51bGxmdW5jOworCWludCByZXQ7CisJdTMyIHJhdGU7CisKKwludWxsZnVuYyA9IGt6YWxsb2Moc2l6ZW9mKCpudWxsZnVuYyksIEdGUF9LRVJORUwpOworCWlmICghbnVsbGZ1bmMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJbnVsbGZ1bmMtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfREFUQSB8CisJCQkJCSAgICAgIElFRUU4MDIxMV9TVFlQRV9OVUxMRlVOQyB8CisJCQkJCSAgICAgIElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7CisKKwkvKiBudWxsZnVuYy0+YWRkcjEgaXMgZmlsbGVkIGJ5IEZXICovCisKKwltZW1jcHkobnVsbGZ1bmMtPmFkZHIyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobnVsbGZ1bmMtPmFkZHIzLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKKworCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOworCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCBDTURfVEVNUExfTlVMTF9EQVRBLCBudWxsZnVuYywKKwkJCQkgICAgICBzaXplb2YoKm51bGxmdW5jKSwgMCwgcmF0ZSk7CisKK291dDoKKwlrZnJlZShudWxsZnVuYyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB3bDEyNzFfYXBfaW5pdF9xb3NfbnVsbF90ZW1wbGF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICpxb3NudWxsOworCWludCByZXQ7CisJdTMyIHJhdGU7CisKKwlxb3NudWxsID0ga3phbGxvYyhzaXplb2YoKnFvc251bGwpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXFvc251bGwpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXQ7CisJfQorCisJcW9zbnVsbC0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJCQkJICAgICBJRUVFODAyMTFfU1RZUEVfUU9TX05VTExGVU5DIHwKKwkJCQkJICAgICBJRUVFODAyMTFfRkNUTF9GUk9NRFMpOworCisJLyogcW9zbnVsbC0+YWRkcjEgaXMgZmlsbGVkIGJ5IEZXICovCisKKwltZW1jcHkocW9zbnVsbC0+YWRkcjIsIHZpZi0+YWRkciwgRVRIX0FMRU4pOworCW1lbWNweShxb3NudWxsLT5hZGRyMywgdmlmLT5hZGRyLCBFVEhfQUxFTik7CisKKwlyYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKKwlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwgQ01EX1RFTVBMX1FPU19OVUxMX0RBVEEsIHFvc251bGwsCisJCQkJICAgICAgc2l6ZW9mKCpxb3NudWxsKSwgMCwgcmF0ZSk7CisKK291dDoKKwlrZnJlZShxb3NudWxsKTsKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHdsMTJ4eF9pbml0X3J4X2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAlpbnQgcmV0OwpAQCAtMjM3LDM5ICsyMjMsMzcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHdsMTI3MV9pbml0X3BoeV9jb25maWcoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTJ4eF9pbml0X3BoeV92aWZfY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfYWN4X3BkX3RocmVzaG9sZCh3bCk7CisJcmV0ID0gd2wxMjcxX2FjeF9zbG90KHdsLCB3bHZpZiwgREVGQVVMVF9TTE9UX1RJTUUpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gd2wxMjcxX2FjeF9zbG90KHdsLCBERUZBVUxUX1NMT1RfVElNRSk7CisJcmV0ID0gd2wxMjcxX2FjeF9zZXJ2aWNlX3BlcmlvZF90aW1lb3V0KHdsLCB3bHZpZik7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfYWN4X3NlcnZpY2VfcGVyaW9kX3RpbWVvdXQod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gd2wxMjcxX2FjeF9ydHNfdGhyZXNob2xkKHdsLCB3bC0+aHctPndpcGh5LT5ydHNfdGhyZXNob2xkKTsKKwlyZXQgPSB3bDEyNzFfYWN4X3J0c190aHJlc2hvbGQod2wsIHdsdmlmLCB3bC0+aHctPndpcGh5LT5ydHNfdGhyZXNob2xkKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9pbml0X2JlYWNvbl9maWx0ZXIoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTI3MV9pbml0X3N0YV9iZWFjb25fZmlsdGVyKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCByZXQ7CiAKLQkvKiBkaXNhYmxlIGJlYWNvbiBmaWx0ZXJpbmcgYXQgdGhpcyBzdGFnZSAqLwotCXJldCA9IHdsMTI3MV9hY3hfYmVhY29uX2ZpbHRlcl9vcHQod2wsIGZhbHNlKTsKKwlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfdGFibGUod2wsIHdsdmlmKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHdsMTI3MV9hY3hfYmVhY29uX2ZpbHRlcl90YWJsZSh3bCk7CisJLyogZW5hYmxlIGJlYWNvbiBmaWx0ZXJpbmcgKi8KKwlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCB3bHZpZiwgdHJ1ZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTMwMiwxMSArMjg2LDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2luaXRfYmVhY29uX2Jyb2FkY2FzdChzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMjcxX2luaXRfYmVhY29uX2Jyb2FkY2FzdChzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfYWN4X2Jjbl9kdGltX29wdGlvbnMod2wpOworCXJldCA9IHdsMTI3MV9hY3hfYmNuX2R0aW1fb3B0aW9ucyh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zMjcsMzYgKzMxMiwxMyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9zdGFfaHdfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCkKKy8qIGdlbmVyaWMgc3RhIGluaXRpYWxpemF0aW9uIChub24gdmlmLXNwZWNpZmljKSAqLworc3RhdGljIGludCB3bDEyNzFfc3RhX2h3X2luaXQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlpbnQgcmV0OwogCi0JaWYgKHdsLT5jaGlwLmlkICE9IENISVBfSURfMTI4M19QRzIwKSB7Ci0JCXJldCA9IHdsMTI3MV9jbWRfZXh0X3JhZGlvX3Bhcm1zKHdsKTsKLQkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OwotCX0KLQogCS8qIFBTIGNvbmZpZyAqLwotCXJldCA9IHdsMTI3MV9hY3hfY29uZmlnX3BzKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTI3MV9zdGFfaW5pdF90ZW1wbGF0ZXNfY29uZmlnKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTI3MV9hY3hfZ3JvdXBfYWRkcmVzc190Ymwod2wsIHRydWUsIE5VTEwsIDApOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogSW5pdGlhbGl6ZSBjb25uZWN0aW9uIG1vbml0b3JpbmcgdGhyZXNob2xkcyAqLwotCXJldCA9IHdsMTI3MV9hY3hfY29ubl9tb25pdF9wYXJhbXMod2wsIGZhbHNlKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIEJlYWNvbiBmaWx0ZXJpbmcgKi8KLQlyZXQgPSB3bDEyNzFfaW5pdF9iZWFjb25fZmlsdGVyKHdsKTsKKwlyZXQgPSB3bDEyeHhfYWN4X2NvbmZpZ19wcyh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC0zNjUsMTAzICszMjcsNjEgQEAKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCS8qIEJlYWNvbnMgYW5kIGJyb2FkY2FzdCBzZXR0aW5ncyAqLwotCXJldCA9IHdsMTI3MV9pbml0X2JlYWNvbl9icm9hZGNhc3Qod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogQ29uZmlndXJlIGZvciBFTFAgcG93ZXIgc2F2aW5nICovCi0JcmV0ID0gd2wxMjcxX2FjeF9zbGVlcF9hdXRoKHdsLCBXTDEyNzFfUFNNX0VMUCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBDb25maWd1cmUgcnNzaS9zbnIgYXZlcmFnaW5nIHdlaWdodHMgKi8KLQlyZXQgPSB3bDEyNzFfYWN4X3Jzc2lfc25yX2F2Z193ZWlnaHRzKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTI3MV9hY3hfc3RhX3JhdGVfcG9saWNpZXMod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gd2wxMnh4X2FjeF9tZW1fY2ZnKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIENvbmZpZ3VyZSB0aGUgRlcgbG9nZ2VyICovCi0JcmV0ID0gd2wxMnh4X2luaXRfZndsb2cod2wpOworCXJldCA9IHdsMTI3MV9hY3hfc3RhX3JhdGVfcG9saWNpZXMod2wsIHdsdmlmKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9zdGFfaHdfaW5pdF9wb3N0X21lbShzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMjcxX3N0YV9od19pbml0X3Bvc3RfbWVtKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogeworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOwogCWludCByZXQsIGk7CiAKIAkvKiBkaXNhYmxlIGFsbCBrZWVwLWFsaXZlIHRlbXBsYXRlcyAqLwogCWZvciAoaSA9IDA7IGkgPCBDTURfVEVNUExfS0xWX0lEWF9NQVg7IGkrKykgewotCQlyZXQgPSB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfY29uZmlnKHdsLCBpLAorCQlyZXQgPSB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfY29uZmlnKHdsLCB3bHZpZiwgaSwKIAkJCQkJCSAgIEFDWF9LRUVQX0FMSVZFX1RQTF9JTlZBTElEKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KIAogCS8qIGRpc2FibGUgdGhlIGtlZXAtYWxpdmUgZmVhdHVyZSAqLwotCXJldCA9IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHdsLCBmYWxzZSk7CisJcmV0ID0gd2wxMjcxX2FjeF9rZWVwX2FsaXZlX21vZGUod2wsIHdsdmlmLCBmYWxzZSk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfYXBfaHdfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCkKKy8qIGdlbmVyaWMgYXAgaW5pdGlhbGl6YXRpb24gKG5vbiB2aWYtc3BlY2lmaWMpICovCitzdGF0aWMgaW50IHdsMTI3MV9hcF9od19pbml0KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJaW50IHJldDsKIAotCXJldCA9IHdsMTI3MV9hcF9pbml0X3RlbXBsYXRlc19jb25maWcod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OwotCi0JLyogQ29uZmlndXJlIGZvciBwb3dlciBhbHdheXMgb24gKi8KLQlyZXQgPSB3bDEyNzFfYWN4X3NsZWVwX2F1dGgod2wsIFdMMTI3MV9QU01fQ0FNKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTI3MV9pbml0X2FwX3JhdGVzKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTI3MV9hY3hfYXBfbWF4X3R4X3JldHJ5KHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IHdsMTJ4eF9hY3hfbWVtX2NmZyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KLQkvKiBpbml0aWFsaXplIFR4IHBvd2VyICovCi0JcmV0ID0gd2wxMjcxX2FjeF90eF9wb3dlcih3bCwgd2wtPnBvd2VyX2xldmVsKTsKKwlyZXQgPSB3bDEyNzFfaW5pdF9hcF9yYXRlcyh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCB3bDEyNzFfYXBfaW5pdF90ZW1wbGF0ZXMoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX2FwX2luaXRfdGVtcGxhdGVzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogeworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOwogCWludCByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfYXBfaW5pdF9kZWF1dGhfdGVtcGxhdGUod2wpOworCXJldCA9IHdsMTI3MV9hcF9pbml0X2RlYXV0aF90ZW1wbGF0ZSh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gd2wxMjcxX2FwX2luaXRfbnVsbF90ZW1wbGF0ZSh3bCk7CisJcmV0ID0gd2wxMjcxX2FwX2luaXRfbnVsbF90ZW1wbGF0ZSh3bCwgdmlmKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXJldCA9IHdsMTI3MV9hcF9pbml0X3Fvc19udWxsX3RlbXBsYXRlKHdsKTsKKwlyZXQgPSB3bDEyNzFfYXBfaW5pdF9xb3NfbnVsbF90ZW1wbGF0ZSh3bCwgdmlmKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIApAQCAtNDY5LDQzICszODksNDUgQEAKIAkgKiB3aGVuIG9wZXJhdGluZyBhcyBBUCB3ZSB3YW50IHRvIHJlY2VpdmUgZXh0ZXJuYWwgYmVhY29ucyBmb3IKIAkgKiBjb25maWd1cmluZyBFUlAgcHJvdGVjdGlvbi4KIAkgKi8KLQlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCBmYWxzZSk7CisJcmV0ID0gd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdCh3bCwgd2x2aWYsIGZhbHNlKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9hcF9od19pbml0X3Bvc3RfbWVtKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfYXBfaHdfaW5pdF9wb3N0X21lbShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewotCXJldHVybiB3bDEyNzFfYXBfaW5pdF90ZW1wbGF0ZXMod2wpOworCXJldHVybiB3bDEyNzFfYXBfaW5pdF90ZW1wbGF0ZXMod2wsIHZpZik7CiB9CiAKLWludCB3bDEyNzFfaW5pdF9hcF9yYXRlcyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK2ludCB3bDEyNzFfaW5pdF9hcF9yYXRlcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCBpLCByZXQ7CiAJc3RydWN0IGNvbmZfdHhfcmF0ZV9jbGFzcyByYzsKIAl1MzIgc3VwcG9ydGVkX3JhdGVzOwogCi0Jd2wxMjcxX2RlYnVnKERFQlVHX0FQLCAiQVAgYmFzaWMgcmF0ZSBzZXQ6IDB4JXgiLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOworCXdsMTI3MV9kZWJ1ZyhERUJVR19BUCwgIkFQIGJhc2ljIHJhdGUgc2V0OiAweCV4IiwKKwkJICAgICB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOwogCi0JaWYgKHdsLT5iYXNpY19yYXRlX3NldCA9PSAwKQorCWlmICh3bHZpZi0+YmFzaWNfcmF0ZV9zZXQgPT0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyYy5lbmFibGVkX3JhdGVzID0gd2wtPmJhc2ljX3JhdGVfc2V0OworCXJjLmVuYWJsZWRfcmF0ZXMgPSB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQ7CiAJcmMubG9uZ19yZXRyeV9saW1pdCA9IDEwOwogCXJjLnNob3J0X3JldHJ5X2xpbWl0ID0gMTA7CiAJcmMuYWZsYWdzID0gMDsKLQlyZXQgPSB3bDEyNzFfYWN4X2FwX3JhdGVfcG9saWN5KHdsLCAmcmMsIEFDWF9UWF9BUF9NT0RFX01HTVRfUkFURSk7CisJcmV0ID0gd2wxMjcxX2FjeF9hcF9yYXRlX3BvbGljeSh3bCwgJnJjLCB3bHZpZi0+YXAubWdtdF9yYXRlX2lkeCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKIAkvKiB1c2UgdGhlIG1pbiBiYXNpYyByYXRlIGZvciBBUCBicm9hZGNhc3QvbXVsdGljYXN0ICovCi0JcmMuZW5hYmxlZF9yYXRlcyA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsLT5iYXNpY19yYXRlX3NldCk7CisJcmMuZW5hYmxlZF9yYXRlcyA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsdmlmLT5iYXNpY19yYXRlX3NldCk7CiAJcmMuc2hvcnRfcmV0cnlfbGltaXQgPSAxMDsKIAlyYy5sb25nX3JldHJ5X2xpbWl0ID0gMTA7CiAJcmMuYWZsYWdzID0gMDsKLQlyZXQgPSB3bDEyNzFfYWN4X2FwX3JhdGVfcG9saWN5KHdsLCAmcmMsIEFDWF9UWF9BUF9NT0RFX0JDU1RfUkFURSk7CisJcmV0ID0gd2wxMjcxX2FjeF9hcF9yYXRlX3BvbGljeSh3bCwgJnJjLCB3bHZpZi0+YXAuYmNhc3RfcmF0ZV9pZHgpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCkBAIC01MTMsNyArNDM1LDcgQEAKIAkgKiBJZiB0aGUgYmFzaWMgcmF0ZXMgY29udGFpbiBPRkRNIHJhdGVzLCB1c2UgT0ZETSBvbmx5CiAJICogcmF0ZXMgZm9yIHVuaWNhc3QgVFggYXMgd2VsbC4gRWxzZSB1c2UgYWxsIHN1cHBvcnRlZCByYXRlcy4KIAkgKi8KLQlpZiAoKHdsLT5iYXNpY19yYXRlX3NldCAmIENPTkZfVFhfT0ZETV9SQVRFUykpCisJaWYgKCh3bHZpZi0+YmFzaWNfcmF0ZV9zZXQgJiBDT05GX1RYX09GRE1fUkFURVMpKQogCQlzdXBwb3J0ZWRfcmF0ZXMgPSBDT05GX1RYX09GRE1fUkFURVM7CiAJZWxzZQogCQlzdXBwb3J0ZWRfcmF0ZXMgPSBDT05GX1RYX0FQX0VOQUJMRURfUkFURVM7CkBAIC01MjcsNyArNDQ5LDggQEAKIAkJcmMuc2hvcnRfcmV0cnlfbGltaXQgPSAxMDsKIAkJcmMubG9uZ19yZXRyeV9saW1pdCA9IDEwOwogCQlyYy5hZmxhZ3MgPSAwOwotCQlyZXQgPSB3bDEyNzFfYWN4X2FwX3JhdGVfcG9saWN5KHdsLCAmcmMsIGkpOworCQlyZXQgPSB3bDEyNzFfYWN4X2FwX3JhdGVfcG9saWN5KHdsLCAmcmMsCisJCQkJCQl3bHZpZi0+YXAudWNhc3RfcmF0ZV9pZHhbaV0pOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJfQpAQCAtNTM1LDI0ICs0NTgsMjMgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfc2V0X2JhX3BvbGljaWVzKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfc2V0X2JhX3BvbGljaWVzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJLyogUmVzZXQgdGhlIEJBIFJYIGluZGljYXRvcnMgKi8KLQl3bC0+YmFfcnhfYml0bWFwID0gMDsKLQl3bC0+YmFfYWxsb3dlZCA9IHRydWU7CisJd2x2aWYtPmJhX2FsbG93ZWQgPSB0cnVlOwogCXdsLT5iYV9yeF9zZXNzaW9uX2NvdW50ID0gMDsKIAogCS8qIEJBIGlzIHN1cHBvcnRlZCBpbiBTVEEvQVAgbW9kZXMgKi8KLQlpZiAod2wtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUyAmJgotCSAgICB3bC0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfU1RBX0JTUykgewotCQl3bC0+YmFfc3VwcG9ydCA9IGZhbHNlOworCWlmICh3bHZpZi0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfQVBfQlNTICYmCisJICAgIHdsdmlmLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9TVEFfQlNTKSB7CisJCXdsdmlmLT5iYV9zdXBwb3J0ID0gZmFsc2U7CiAJCXJldHVybiAwOwogCX0KIAotCXdsLT5iYV9zdXBwb3J0ID0gdHJ1ZTsKKwl3bHZpZi0+YmFfc3VwcG9ydCA9IHRydWU7CiAKIAkvKiA4MDIuMTFuIGluaXRpYXRvciBCQSBzZXNzaW9uIHNldHRpbmcgKi8KLQlyZXR1cm4gd2wxMnh4X2FjeF9zZXRfYmFfaW5pdGlhdG9yX3BvbGljeSh3bCk7CisJcmV0dXJuIHdsMTJ4eF9hY3hfc2V0X2JhX2luaXRpYXRvcl9wb2xpY3kod2wsIHdsdmlmKTsKIH0KIAogaW50IHdsMTI3MV9jaGlwX3NwZWNpZmljX2luaXQoc3RydWN0IHdsMTI3MSAqd2wpCkBAIC01NjIsNyArNDg0LDcgQEAKIAlpZiAod2wtPmNoaXAuaWQgPT0gQ0hJUF9JRF8xMjgzX1BHMjApIHsKIAkJdTMyIGhvc3RfY2ZnX2JpdG1hcCA9IEhPU1RfSUZfQ0ZHX1JYX0ZJRk9fRU5BQkxFOwogCi0JCWlmICh3bC0+cXVpcmtzICYgV0wxMlhYX1FVSVJLX0JMT0NLU0laRV9BTElHTk1FTlQpCisJCWlmICghKHdsLT5xdWlya3MgJiBXTDEyWFhfUVVJUktfTk9fQkxPQ0tTSVpFX0FMSUdOTUVOVCkpCiAJCQkvKiBFbmFibGUgU0RJTyBwYWRkaW5nICovCiAJCQlob3N0X2NmZ19iaXRtYXAgfD0gSE9TVF9JRl9DRkdfVFhfUEFEX1RPX1NESU9fQkxLOwogCkBAIC01NzUsMzkgKzQ5NywxODYgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKiB2aWYtc3BlY2lmYyBpbml0aWFsaXphdGlvbiAqLworc3RhdGljIGludCB3bDEyeHhfaW5pdF9zdGFfcm9sZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQoreworCWludCByZXQ7CisKKwlyZXQgPSB3bDEyNzFfYWN4X2dyb3VwX2FkZHJlc3NfdGJsKHdsLCB3bHZpZiwgdHJ1ZSwgTlVMTCwgMCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBJbml0aWFsaXplIGNvbm5lY3Rpb24gbW9uaXRvcmluZyB0aHJlc2hvbGRzICovCisJcmV0ID0gd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyh3bCwgd2x2aWYsIGZhbHNlKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIEJlYWNvbiBmaWx0ZXJpbmcgKi8KKwlyZXQgPSB3bDEyNzFfaW5pdF9zdGFfYmVhY29uX2ZpbHRlcih3bCwgd2x2aWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQmVhY29ucyBhbmQgYnJvYWRjYXN0IHNldHRpbmdzICovCisJcmV0ID0gd2wxMjcxX2luaXRfYmVhY29uX2Jyb2FkY2FzdCh3bCwgd2x2aWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQ29uZmlndXJlIHJzc2kvc25yIGF2ZXJhZ2luZyB3ZWlnaHRzICovCisJcmV0ID0gd2wxMjcxX2FjeF9yc3NpX3Nucl9hdmdfd2VpZ2h0cyh3bCwgd2x2aWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKKy8qIHZpZi1zcGVjaWZpYyBpbnRpYWxpemF0aW9uICovCitzdGF0aWMgaW50IHdsMTJ4eF9pbml0X2FwX3JvbGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gd2wxMjcxX2FjeF9hcF9tYXhfdHhfcmV0cnkod2wsIHdsdmlmKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIGluaXRpYWxpemUgVHggcG93ZXIgKi8KKwlyZXQgPSB3bDEyNzFfYWN4X3R4X3Bvd2VyKHdsLCB3bHZpZiwgd2x2aWYtPnBvd2VyX2xldmVsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAwOworfQorCitpbnQgd2wxMjcxX2luaXRfdmlmX3NwZWNpZmljKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQoreworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOworCXN0cnVjdCBjb25mX3R4X2FjX2NhdGVnb3J5ICpjb25mX2FjOworCXN0cnVjdCBjb25mX3R4X3RpZCAqY29uZl90aWQ7CisJYm9vbCBpc19hcCA9ICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKKwlpbnQgcmV0LCBpOworCisJLyoKKwkgKiBjb25zaWRlciBhbGwgZXhpc3Rpbmcgcm9sZXMgYmVmb3JlIGNvbmZpZ3VyaW5nIHBzbS4KKwkgKiBUT0RPOiByZWNvbmZpZ3VyZSBvbiBpbnRlcmZhY2UgcmVtb3ZhbC4KKwkgKi8KKwlpZiAoIXdsLT5hcF9jb3VudCkgeworCQlpZiAoaXNfYXApIHsKKwkJCS8qIENvbmZpZ3VyZSBmb3IgcG93ZXIgYWx3YXlzIG9uICovCisJCQlyZXQgPSB3bDEyNzFfYWN4X3NsZWVwX2F1dGgod2wsIFdMMTI3MV9QU01fQ0FNKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCX0gZWxzZSBpZiAoIXdsLT5zdGFfY291bnQpIHsKKwkJCS8qIENvbmZpZ3VyZSBmb3IgRUxQIHBvd2VyIHNhdmluZyAqLworCQkJcmV0ID0gd2wxMjcxX2FjeF9zbGVlcF9hdXRoKHdsLCBXTDEyNzFfUFNNX0VMUCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJLyogTW9kZSBzcGVjaWZpYyBpbml0ICovCisJaWYgKGlzX2FwKSB7CisJCXJldCA9IHdsMTI3MV9hcF9od19pbml0KHdsLCB3bHZpZik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlyZXQgPSB3bDEyeHhfaW5pdF9hcF9yb2xlKHdsLCB3bHZpZik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlyZXQgPSB3bDEyNzFfc3RhX2h3X2luaXQod2wsIHdsdmlmKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHdsMTJ4eF9pbml0X3N0YV9yb2xlKHdsLCB3bHZpZik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwl3bDEyeHhfaW5pdF9waHlfdmlmX2NvbmZpZyh3bCwgd2x2aWYpOworCisJLyogRGVmYXVsdCBUSUQvQUMgY29uZmlndXJhdGlvbiAqLworCUJVR19PTih3bC0+Y29uZi50eC50aWRfY29uZl9jb3VudCAhPSB3bC0+Y29uZi50eC5hY19jb25mX2NvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgd2wtPmNvbmYudHgudGlkX2NvbmZfY291bnQ7IGkrKykgeworCQljb25mX2FjID0gJndsLT5jb25mLnR4LmFjX2NvbmZbaV07CisJCXJldCA9IHdsMTI3MV9hY3hfYWNfY2ZnKHdsLCB3bHZpZiwgY29uZl9hYy0+YWMsCisJCQkJCWNvbmZfYWMtPmN3X21pbiwgY29uZl9hYy0+Y3dfbWF4LAorCQkJCQljb25mX2FjLT5haWZzbiwgY29uZl9hYy0+dHhfb3BfbGltaXQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJY29uZl90aWQgPSAmd2wtPmNvbmYudHgudGlkX2NvbmZbaV07CisJCXJldCA9IHdsMTI3MV9hY3hfdGlkX2NmZyh3bCwgd2x2aWYsCisJCQkJCSBjb25mX3RpZC0+cXVldWVfaWQsCisJCQkJCSBjb25mX3RpZC0+Y2hhbm5lbF90eXBlLAorCQkJCQkgY29uZl90aWQtPnRzaWQsCisJCQkJCSBjb25mX3RpZC0+cHNfc2NoZW1lLAorCQkJCQkgY29uZl90aWQtPmFja19wb2xpY3ksCisJCQkJCSBjb25mX3RpZC0+YXBzZF9jb25mWzBdLAorCQkJCQkgY29uZl90aWQtPmFwc2RfY29uZlsxXSk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBDb25maWd1cmUgSFcgZW5jcnlwdGlvbiAqLworCXJldCA9IHdsMTI3MV9hY3hfZmVhdHVyZV9jZmcod2wsIHdsdmlmKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIE1vZGUgc3BlY2lmaWMgaW5pdCAtIHBvc3QgbWVtIGluaXQgKi8KKwlpZiAoaXNfYXApCisJCXJldCA9IHdsMTI3MV9hcF9od19pbml0X3Bvc3RfbWVtKHdsLCB2aWYpOworCWVsc2UKKwkJcmV0ID0gd2wxMjcxX3N0YV9od19pbml0X3Bvc3RfbWVtKHdsLCB2aWYpOworCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwkvKiBDb25maWd1cmUgaW5pdGlhdG9yIEJBIHNlc3Npb25zIHBvbGljaWVzICovCisJcmV0ID0gd2wxMjcxX3NldF9iYV9wb2xpY2llcyh3bCwgd2x2aWYpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CiAKIGludCB3bDEyNzFfaHdfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKLQlzdHJ1Y3QgY29uZl90eF9hY19jYXRlZ29yeSAqY29uZl9hYzsKLQlzdHJ1Y3QgY29uZl90eF90aWQgKmNvbmZfdGlkOwotCWludCByZXQsIGk7Ci0JYm9vbCBpc19hcCA9ICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKKwlpbnQgcmV0OwogCi0JaWYgKHdsLT5jaGlwLmlkID09IENISVBfSURfMTI4M19QRzIwKQorCWlmICh3bC0+Y2hpcC5pZCA9PSBDSElQX0lEXzEyODNfUEcyMCkgewogCQlyZXQgPSB3bDEyOHhfY21kX2dlbmVyYWxfcGFybXMod2wpOwotCWVsc2UKLQkJcmV0ID0gd2wxMjcxX2NtZF9nZW5lcmFsX3Bhcm1zKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJcmV0dXJuIHJldDsKLQotCWlmICh3bC0+Y2hpcC5pZCA9PSBDSElQX0lEXzEyODNfUEcyMCkKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OwogCQlyZXQgPSB3bDEyOHhfY21kX3JhZGlvX3Bhcm1zKHdsKTsKLQllbHNlCisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9IGVsc2UgeworCQlyZXQgPSB3bDEyNzFfY21kX2dlbmVyYWxfcGFybXMod2wpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CiAJCXJldCA9IHdsMTI3MV9jbWRfcmFkaW9fcGFybXMod2wpOwotCWlmIChyZXQgPCAwKQotCQlyZXR1cm4gcmV0OworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCXJldCA9IHdsMTI3MV9jbWRfZXh0X3JhZGlvX3Bhcm1zKHdsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCX0KIAogCS8qIENoaXAtc3BlY2lmaWMgaW5pdCAqLwogCXJldCA9IHdsMTI3MV9jaGlwX3NwZWNpZmljX2luaXQod2wpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JLyogTW9kZSBzcGVjaWZpYyBpbml0ICovCi0JaWYgKGlzX2FwKQotCQlyZXQgPSB3bDEyNzFfYXBfaHdfaW5pdCh3bCk7Ci0JZWxzZQotCQlyZXQgPSB3bDEyNzFfc3RhX2h3X2luaXQod2wpOworCS8qIEluaXQgdGVtcGxhdGVzICovCisJcmV0ID0gd2wxMjcxX2luaXRfdGVtcGxhdGVzX2NvbmZpZyh3bCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CiAKKwlyZXQgPSB3bDEyeHhfYWN4X21lbV9jZmcod2wpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogQ29uZmlndXJlIHRoZSBGVyBsb2dnZXIgKi8KKwlyZXQgPSB3bDEyeHhfaW5pdF9md2xvZyh3bCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKQEAgLTYyNiwxMSArNjk1LDYgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfZnJlZV9tZW1tYXA7CiAKLQkvKiBQSFkgbGF5ZXIgY29uZmlnICovCi0JcmV0ID0gd2wxMjcxX2luaXRfcGh5X2NvbmZpZyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCiAJcmV0ID0gd2wxMjcxX2FjeF9kY29faXRyaW1fcGFyYW1zKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfZnJlZV9tZW1tYXA7CkBAIC02NTUsNjEgKzcxOSwyMCBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKIAotCS8qIERlZmF1bHQgVElEL0FDIGNvbmZpZ3VyYXRpb24gKi8KLQlCVUdfT04od2wtPmNvbmYudHgudGlkX2NvbmZfY291bnQgIT0gd2wtPmNvbmYudHguYWNfY29uZl9jb3VudCk7Ci0JZm9yIChpID0gMDsgaSA8IHdsLT5jb25mLnR4LnRpZF9jb25mX2NvdW50OyBpKyspIHsKLQkJY29uZl9hYyA9ICZ3bC0+Y29uZi50eC5hY19jb25mW2ldOwotCQlyZXQgPSB3bDEyNzFfYWN4X2FjX2NmZyh3bCwgY29uZl9hYy0+YWMsIGNvbmZfYWMtPmN3X21pbiwKLQkJCQkJY29uZl9hYy0+Y3dfbWF4LCBjb25mX2FjLT5haWZzbiwKLQkJCQkJY29uZl9hYy0+dHhfb3BfbGltaXQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCi0JCWNvbmZfdGlkID0gJndsLT5jb25mLnR4LnRpZF9jb25mW2ldOwotCQlyZXQgPSB3bDEyNzFfYWN4X3RpZF9jZmcod2wsIGNvbmZfdGlkLT5xdWV1ZV9pZCwKLQkJCQkJIGNvbmZfdGlkLT5jaGFubmVsX3R5cGUsCi0JCQkJCSBjb25mX3RpZC0+dHNpZCwKLQkJCQkJIGNvbmZfdGlkLT5wc19zY2hlbWUsCi0JCQkJCSBjb25mX3RpZC0+YWNrX3BvbGljeSwKLQkJCQkJIGNvbmZfdGlkLT5hcHNkX2NvbmZbMF0sCi0JCQkJCSBjb25mX3RpZC0+YXBzZF9jb25mWzFdKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKLQl9Ci0KIAkvKiBFbmFibGUgZGF0YSBwYXRoICovCiAJcmV0ID0gd2wxMjcxX2NtZF9kYXRhX3BhdGgod2wsIDEpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKIAotCS8qIENvbmZpZ3VyZSBIVyBlbmNyeXB0aW9uICovCi0JcmV0ID0gd2wxMjcxX2FjeF9mZWF0dXJlX2NmZyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCiAJLyogY29uZmlndXJlIFBNICovCiAJcmV0ID0gd2wxMjcxX2FjeF9wbV9jb25maWcod2wpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKIAotCS8qIE1vZGUgc3BlY2lmaWMgaW5pdCAtIHBvc3QgbWVtIGluaXQgKi8KLQlpZiAoaXNfYXApCi0JCXJldCA9IHdsMTI3MV9hcF9od19pbml0X3Bvc3RfbWVtKHdsKTsKLQllbHNlCi0JCXJldCA9IHdsMTI3MV9zdGFfaHdfaW5pdF9wb3N0X21lbSh3bCk7Ci0KLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZnJlZV9tZW1tYXA7Ci0KIAlyZXQgPSB3bDEyeHhfYWN4X3NldF9yYXRlX21nbXRfcGFyYW1zKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfZnJlZV9tZW1tYXA7CiAKLQkvKiBDb25maWd1cmUgaW5pdGlhdG9yIEJBIHNlc3Npb25zIHBvbGljaWVzICovCi0JcmV0ID0gd2wxMjcxX3NldF9iYV9wb2xpY2llcyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCiAJLyogY29uZmlndXJlIGhhbmdvdmVyICovCiAJcmV0ID0gd2wxMnh4X2FjeF9jb25maWdfaGFuZ292ZXIod2wpOwogCWlmIChyZXQgPCAwKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2luaXQuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pbml0LmgKaW5kZXggM2EzYzIzMC4uMmRhMGY0MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2luaXQuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW5pdC5oCkBAIC0yNywxMyArMjcsMTMgQEAKICNpbmNsdWRlICJ3bDEyeHguaCIKIAogaW50IHdsMTI3MV9od19pbml0X3Bvd2VyX2F1dGgoc3RydWN0IHdsMTI3MSAqd2wpOwotaW50IHdsMTI3MV9zdGFfaW5pdF90ZW1wbGF0ZXNfY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfaW5pdF9waHlfY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfaW5pdF90ZW1wbGF0ZXNfY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsKTsKIGludCB3bDEyNzFfaW5pdF9wdGEoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV9pbml0X2VuZXJneV9kZXRlY3Rpb24oc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV9jaGlwX3NwZWNpZmljX2luaXQoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV9od19pbml0KHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfaW5pdF9hcF9yYXRlcyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2FwX2luaXRfdGVtcGxhdGVzKHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfaW5pdF92aWZfc3BlY2lmaWMoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOworaW50IHdsMTI3MV9pbml0X2FwX3JhdGVzKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOworaW50IHdsMTI3MV9hcF9pbml0X3RlbXBsYXRlcyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L2lvLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW8uYwppbmRleCBjMmRhNjZmLi4wNzlhZDM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW8uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW8uYwpAQCAtMjQsOCArMjQsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zcGkvc3BpLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAKICNpbmNsdWRlICJ3bDEyeHguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgIndsMTJ4eF84MDIxMS5oIgogI2luY2x1ZGUgImlvLmgiCiAjaW5jbHVkZSAidHguaCIKQEAgLTQ2LDcgKzQ4LDcgQEAKIGJvb2wgd2wxMjcxX3NldF9ibG9ja19zaXplKHN0cnVjdCB3bDEyNzEgKndsKQogewogCWlmICh3bC0+aWZfb3BzLT5zZXRfYmxvY2tfc2l6ZSkgewotCQl3bC0+aWZfb3BzLT5zZXRfYmxvY2tfc2l6ZSh3bCwgV0wxMlhYX0JVU19CTE9DS19TSVpFKTsKKwkJd2wtPmlmX29wcy0+c2V0X2Jsb2NrX3NpemUod2wtPmRldiwgV0wxMlhYX0JVU19CTE9DS19TSVpFKTsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC01NSwxMiArNTcsMTIgQEAKIAogdm9pZCB3bDEyNzFfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCB3bDEyNzEgKndsKQogewotCXdsLT5pZl9vcHMtPmRpc2FibGVfaXJxKHdsKTsKKwlkaXNhYmxlX2lycSh3bC0+aXJxKTsKIH0KIAogdm9pZCB3bDEyNzFfZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHdsMTI3MSAqd2wpCiB7Ci0Jd2wtPmlmX29wcy0+ZW5hYmxlX2lycSh3bCk7CisJZW5hYmxlX2lycSh3bC0+aXJxKTsKIH0KIAogLyogU2V0IHRoZSBTUEkgcGFydGl0aW9ucyB0byBhY2Nlc3MgdGhlIGNoaXAgYWRkcmVzc2VzCkBAIC0xMjgsMTMgKzEzMCwxMyBAQAogdm9pZCB3bDEyNzFfaW9fcmVzZXQoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJaWYgKHdsLT5pZl9vcHMtPnJlc2V0KQotCQl3bC0+aWZfb3BzLT5yZXNldCh3bCk7CisJCXdsLT5pZl9vcHMtPnJlc2V0KHdsLT5kZXYpOwogfQogCiB2b2lkIHdsMTI3MV9pb19pbml0KHN0cnVjdCB3bDEyNzEgKndsKQogewogCWlmICh3bC0+aWZfb3BzLT5pbml0KQotCQl3bC0+aWZfb3BzLT5pbml0KHdsKTsKKwkJd2wtPmlmX29wcy0+aW5pdCh3bC0+ZGV2KTsKIH0KIAogdm9pZCB3bDEyNzFfdG9wX3JlZ193cml0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHUxNiB2YWwpCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvaW8uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pby5oCmluZGV4IGU4MzkzNDEuLmQzOThjYmMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pby5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9pby5oCkBAIC01MSwyMyArNTEsMTcgQEAKIHZvaWQgd2wxMjcxX2lvX3Jlc2V0KHN0cnVjdCB3bDEyNzEgKndsKTsKIHZvaWQgd2wxMjcxX2lvX2luaXQoc3RydWN0IHdsMTI3MSAqd2wpOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBkZXZpY2UgKndsMTI3MV93bF90b19kZXYoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JcmV0dXJuIHdsLT5pZl9vcHMtPmRldih3bCk7Ci19Ci0KLQogLyogUmF3IHRhcmdldCBJTywgYWRkcmVzcyBpcyBub3QgdHJhbnNsYXRlZCAqLwogc3RhdGljIGlubGluZSB2b2lkIHdsMTI3MV9yYXdfd3JpdGUoc3RydWN0IHdsMTI3MSAqd2wsIGludCBhZGRyLCB2b2lkICpidWYsCiAJCQkJICAgIHNpemVfdCBsZW4sIGJvb2wgZml4ZWQpCiB7Ci0Jd2wtPmlmX29wcy0+d3JpdGUod2wsIGFkZHIsIGJ1ZiwgbGVuLCBmaXhlZCk7CisJd2wtPmlmX29wcy0+d3JpdGUod2wtPmRldiwgYWRkciwgYnVmLCBsZW4sIGZpeGVkKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIHdsMTI3MV9yYXdfcmVhZChzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKIAkJCQkgICBzaXplX3QgbGVuLCBib29sIGZpeGVkKQogewotCXdsLT5pZl9vcHMtPnJlYWQod2wsIGFkZHIsIGJ1ZiwgbGVuLCBmaXhlZCk7CisJd2wtPmlmX29wcy0+cmVhZCh3bC0+ZGV2LCBhZGRyLCBidWYsIGxlbiwgZml4ZWQpOwogfQogCiBzdGF0aWMgaW5saW5lIHUzMiB3bDEyNzFfcmF3X3JlYWQzMihzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIpCkBAIC0xNTUsMTMgKzE0OSwxMyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgd2wxMjcxX3Bvd2VyX29mZihzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKLQl3bC0+aWZfb3BzLT5wb3dlcih3bCwgZmFsc2UpOworCXdsLT5pZl9vcHMtPnBvd2VyKHdsLT5kZXYsIGZhbHNlKTsKIAljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfR1BJT19QT1dFUiwgJndsLT5mbGFncyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHdsMTI3MV9wb3dlcl9vbihzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKLQlpbnQgcmV0ID0gd2wtPmlmX29wcy0+cG93ZXIod2wsIHRydWUpOworCWludCByZXQgPSB3bC0+aWZfb3BzLT5wb3dlcih3bC0+ZGV2LCB0cnVlKTsKIAlpZiAocmV0ID09IDApCiAJCXNldF9iaXQoV0wxMjcxX0ZMQUdfR1BJT19QT1dFUiwgJndsLT5mbGFncyk7CiAKQEAgLTE3NiwxNSArMTcwLDEwIEBACiBpbnQgd2wxMjcxX3NldF9wYXJ0aXRpb24oc3RydWN0IHdsMTI3MSAqd2wsCiAJCQkgc3RydWN0IHdsMTI3MV9wYXJ0aXRpb25fc2V0ICpwKTsKIAorYm9vbCB3bDEyNzFfc2V0X2Jsb2NrX3NpemUoc3RydWN0IHdsMTI3MSAqd2wpOworCiAvKiBGdW5jdGlvbnMgZnJvbSB3bDEyNzFfbWFpbi5jICovCiAKLWludCB3bDEyNzFfcmVnaXN0ZXJfaHcoc3RydWN0IHdsMTI3MSAqd2wpOwotdm9pZCB3bDEyNzFfdW5yZWdpc3Rlcl9odyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pbnQgd2wxMjcxX2luaXRfaWVlZTgwMjExKHN0cnVjdCB3bDEyNzEgKndsKTsKLXN0cnVjdCBpZWVlODAyMTFfaHcgKndsMTI3MV9hbGxvY19odyh2b2lkKTsKLWludCB3bDEyNzFfZnJlZV9odyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci1pcnFyZXR1cm5fdCB3bDEyNzFfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpOwotYm9vbCB3bDEyNzFfc2V0X2Jsb2NrX3NpemUoc3RydWN0IHdsMTI3MSAqd2wpOwogaW50IHdsMTI3MV90eF9kdW1teV9wYWNrZXQoc3RydWN0IHdsMTI3MSAqd2wpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvbWFpbi5jCmluZGV4IDg4NGY4MmIuLmQ1ZjU1YTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9tYWluLmMKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L21haW4uYwpAQCAtMzIsOCArMzIsMTAgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvd2wxMnh4Lmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KIAogI2luY2x1ZGUgIndsMTJ4eC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAid2wxMnh4XzgwMjExLmgiCiAjaW5jbHVkZSAicmVnLmgiCiAjaW5jbHVkZSAiaW8uaCIKQEAgLTM3Nyw0MiArMzc5LDMwIEBACiBzdGF0aWMgYm9vbCBidWdfb25fcmVjb3Zlcnk7CiAKIHN0YXRpYyB2b2lkIF9fd2wxMjcxX29wX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCQkgYm9vbCByZXNldF90eF9xdWV1ZXMpOwotc3RhdGljIHZvaWQgd2wxMjcxX2ZyZWVfYXBfa2V5cyhzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci0KLQotc3RhdGljIHZvaWQgd2wxMjcxX2RldmljZV9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldikKLXsKLQotfQotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSB3bDEyNzFfZGV2aWNlID0gewotCS5uYW1lICAgICAgICAgICA9ICJ3bDEyNzEiLAotCS5pZCAgICAgICAgICAgICA9IC0xLAotCi0JLyogZGV2aWNlIG1vZGVsIGluc2lzdHMgdG8gaGF2ZSBhIHJlbGVhc2UgZnVuY3Rpb24gKi8KLQkuZGV2ICAgICAgICAgICAgPSB7Ci0JCS5yZWxlYXNlID0gd2wxMjcxX2RldmljZV9yZWxlYXNlLAotCX0sCi19Oworc3RhdGljIHZvaWQgd2wxMjcxX29wX3N0b3Aoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOworc3RhdGljIHZvaWQgd2wxMjcxX2ZyZWVfYXBfa2V5cyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKTsKIAogc3RhdGljIERFRklORV9NVVRFWCh3bF9saXN0X211dGV4KTsKIHN0YXRpYyBMSVNUX0hFQUQod2xfbGlzdCk7CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2NoZWNrX29wZXJzdGF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgdW5zaWduZWQgY2hhciBvcGVyc3RhdGUpCitzdGF0aWMgaW50IHdsMTI3MV9jaGVja19vcGVyc3RhdGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCQkgIHVuc2lnbmVkIGNoYXIgb3BlcnN0YXRlKQogewogCWludCByZXQ7CisKIAlpZiAob3BlcnN0YXRlICE9IElGX09QRVJfVVApCiAJCXJldHVybiAwOwogCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoV0wxMjcxX0ZMQUdfU1RBX1NUQVRFX1NFTlQsICZ3bC0+ZmxhZ3MpKQorCWlmICh0ZXN0X2FuZF9zZXRfYml0KFdMVklGX0ZMQUdfU1RBX1NUQVRFX1NFTlQsICZ3bHZpZi0+ZmxhZ3MpKQogCQlyZXR1cm4gMDsKIAotCXJldCA9IHdsMTJ4eF9jbWRfc2V0X3BlZXJfc3RhdGUod2wsIHdsLT5zdGFfaGxpZCk7CisJcmV0ID0gd2wxMnh4X2NtZF9zZXRfcGVlcl9zdGF0ZSh3bCwgd2x2aWYtPnN0YS5obGlkKTsKIAlpZiAocmV0IDwgMCkKIAkJcmV0dXJuIHJldDsKIAotCXdsMTJ4eF9jcm9jKHdsLCB3bC0+cm9sZV9pZCk7CisJd2wxMnh4X2Nyb2Mod2wsIHdsdmlmLT5yb2xlX2lkKTsKIAogCXdsMTI3MV9pbmZvKCJBc3NvY2lhdGlvbiBjb21wbGV0ZWQuIik7CiAJcmV0dXJuIDA7CkBAIC00MjYsNiArNDE2LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKIAlzdHJ1Y3Qgd2wxMjcxICp3bDsKIAlzdHJ1Y3Qgd2wxMjcxICp3bF90ZW1wOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlpbnQgcmV0ID0gMDsKIAogCS8qIENoZWNrIHRoYXQgdGhpcyBub3RpZmljYXRpb24gaXMgZm9yIHVzLiAqLwpAQCAtNDU5LDE3ICs0NTAsMjggQEAKIAlpZiAod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpCiAJCWdvdG8gb3V0OwogCi0JaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykpCisJaWYgKGRldi0+b3BlcnN0YXRlICE9IElGX09QRVJfVVApCiAJCWdvdG8gb3V0OworCS8qCisJICogVGhlIGNvcnJlY3QgYmVoYXZpb3Igc2hvdWxkIGJlIGp1c3QgZ2V0dGluZyB0aGUgYXBwcm9wcmlhdGUgd2x2aWYKKwkgKiBmcm9tIHRoZSBnaXZlbiBkZXYsIGJ1dCBjdXJyZW50bHkgd2UgZG9uJ3QgaGF2ZSBhIG1hYzgwMjExCisJICogaW50ZXJmYWNlIGZvciBpdC4KKwkgKi8KKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikgeworCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmID0gd2wxMnh4X3dsdmlmX3RvX3ZpZih3bHZpZik7CiAKLQlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OworCQlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpKQorCQkJY29udGludWU7CiAKLQl3bDEyNzFfY2hlY2tfb3BlcnN0YXRlKHdsLCBkZXYtPm9wZXJzdGF0ZSk7CisJCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKIAotCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOworCQl3bDEyNzFfY2hlY2tfb3BlcnN0YXRlKHdsLCB3bHZpZiwKKwkJCQkgICAgICAgaWVlZTgwMjExX2dldF9vcGVyc3RhdGUodmlmKSk7CiAKKwkJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CisJfQogb3V0OgogCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIApAQCAtNDk4LDE5ICs1MDAsMjAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBlbmFibGUpCitzdGF0aWMgaW50IHdsMTI3MV9zZXRfcnhfc3RyZWFtaW5nKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJICAgYm9vbCBlbmFibGUpCiB7CiAJaW50IHJldCA9IDA7CiAKIAkvKiB3ZSBzaG91bGQgaG9sZCB3bC0+bXV0ZXggKi8KLQlyZXQgPSB3bDEyNzFfYWN4X3BzX3J4X3N0cmVhbWluZyh3bCwgZW5hYmxlKTsKKwlyZXQgPSB3bDEyNzFfYWN4X3BzX3J4X3N0cmVhbWluZyh3bCwgd2x2aWYsIGVuYWJsZSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCiAJaWYgKGVuYWJsZSkKLQkJc2V0X2JpdChXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsLT5mbGFncyk7CisJCXNldF9iaXQoV0xWSUZfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsdmlmLT5mbGFncyk7CiAJZWxzZQotCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfUlhfU1RSRUFNSU5HX1NUQVJURUQsICZ3bC0+ZmxhZ3MpOworCQljbGVhcl9iaXQoV0xWSUZfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsdmlmLT5mbGFncyk7CiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KQEAgLTUxOSwyNSArNTIyLDI1IEBACiAgKiB0aGlzIGZ1bmN0aW9uIGlzIGJlaW5nIGNhbGxlZCB3aGVuIHRoZSByeF9zdHJlYW1pbmcgaW50ZXJ2YWwKICAqIGhhcyBiZWVkIGNoYW5nZWQgb3Igcnhfc3RyZWFtaW5nIHNob3VsZCBiZSBkaXNhYmxlZAogICovCi1pbnQgd2wxMjcxX3JlY2FsY19yeF9zdHJlYW1pbmcoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX3JlY2FsY19yeF9zdHJlYW1pbmcoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlpbnQgcmV0ID0gMDsKIAlpbnQgcGVyaW9kID0gd2wtPmNvbmYucnhfc3RyZWFtaW5nLmludGVydmFsOwogCiAJLyogZG9uJ3QgcmVjb25maWd1cmUgaWYgcnhfc3RyZWFtaW5nIGlzIGRpc2FibGVkICovCi0JaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsLT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX1JYX1NUUkVBTUlOR19TVEFSVEVELCAmd2x2aWYtPmZsYWdzKSkKIAkJZ290byBvdXQ7CiAKIAkvKiByZWNvbmZpZ3VyZS9kaXNhYmxlIGFjY29yZGluZyB0byBuZXcgc3RyZWFtaW5nX3BlcmlvZCAqLwogCWlmIChwZXJpb2QgJiYKLQkgICAgdGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpICYmCisJICAgIHRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpICYmCiAJICAgICh3bC0+Y29uZi5yeF9zdHJlYW1pbmcuYWx3YXlzIHx8CiAJICAgICB0ZXN0X2JpdChXTDEyNzFfRkxBR19TT0ZUX0dFTUlOSSwgJndsLT5mbGFncykpKQotCQlyZXQgPSB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyh3bCwgdHJ1ZSk7CisJCXJldCA9IHdsMTI3MV9zZXRfcnhfc3RyZWFtaW5nKHdsLCB3bHZpZiwgdHJ1ZSk7CiAJZWxzZSB7Ci0JCXJldCA9IHdsMTI3MV9zZXRfcnhfc3RyZWFtaW5nKHdsLCBmYWxzZSk7CisJCXJldCA9IHdsMTI3MV9zZXRfcnhfc3RyZWFtaW5nKHdsLCB3bHZpZiwgZmFsc2UpOwogCQkvKiBkb24ndCBjYW5jZWxfd29ya19zeW5jIHNpbmNlIHdlIG1pZ2h0IGRlYWRsb2NrICovCi0JCWRlbF90aW1lcl9zeW5jKCZ3bC0+cnhfc3RyZWFtaW5nX3RpbWVyKTsKKwkJZGVsX3RpbWVyX3N5bmMoJndsdmlmLT5yeF9zdHJlYW1pbmdfdGltZXIpOwogCX0KIG91dDoKIAlyZXR1cm4gcmV0OwpAQCAtNTQ2LDEzICs1NDksMTQgQEAKIHN0YXRpYyB2b2lkIHdsMTI3MV9yeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCByZXQ7Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHdsMTI3MSwgcnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrKTsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHdsMTJ4eF92aWYsCisJCQkJCQlyeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmspOworCXN0cnVjdCB3bDEyNzEgKndsID0gd2x2aWYtPndsOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAotCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsLT5mbGFncykgfHwKLQkgICAgIXRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSB8fAorCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX1JYX1NUUkVBTUlOR19TVEFSVEVELCAmd2x2aWYtPmZsYWdzKSB8fAorCSAgICAhdGVzdF9iaXQoV0xWSUZfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsdmlmLT5mbGFncykgfHwKIAkgICAgKCF3bC0+Y29uZi5yeF9zdHJlYW1pbmcuYWx3YXlzICYmCiAJICAgICAhdGVzdF9iaXQoV0wxMjcxX0ZMQUdfU09GVF9HRU1JTkksICZ3bC0+ZmxhZ3MpKSkKIAkJZ290byBvdXQ7CkBAIC01NjQsMTIgKzU2OCwxMiBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXJldCA9IHdsMTI3MV9zZXRfcnhfc3RyZWFtaW5nKHdsLCB0cnVlKTsKKwlyZXQgPSB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyh3bCwgd2x2aWYsIHRydWUpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9zbGVlcDsKIAogCS8qIHN0b3AgaXQgYWZ0ZXIgc29tZSB0aW1lIG9mIGluYWN0aXZpdHkgKi8KLQltb2RfdGltZXIoJndsLT5yeF9zdHJlYW1pbmdfdGltZXIsCisJbW9kX3RpbWVyKCZ3bHZpZi0+cnhfc3RyZWFtaW5nX3RpbWVyLAogCQkgIGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKHdsLT5jb25mLnJ4X3N0cmVhbWluZy5kdXJhdGlvbikpOwogCiBvdXRfc2xlZXA6CkBAIC01ODEsMTkgKzU4NSwyMCBAQAogc3RhdGljIHZvaWQgd2wxMjcxX3J4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCByZXQ7Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPQotCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHdsMTI3MSwgcnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yayk7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3bDEyeHhfdmlmLAorCQkJCQkJcnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yayk7CisJc3RydWN0IHdsMTI3MSAqd2wgPSB3bHZpZi0+d2w7CiAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwogCi0JaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsLT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX1JYX1NUUkVBTUlOR19TVEFSVEVELCAmd2x2aWYtPmZsYWdzKSkKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gd2wxMjcxX3NldF9yeF9zdHJlYW1pbmcod2wsIGZhbHNlKTsKKwlyZXQgPSB3bDEyNzFfc2V0X3J4X3N0cmVhbWluZyh3bCwgd2x2aWYsIGZhbHNlKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9zbGVlcDsKIApAQCAtNjA1LDggKzYxMCw5IEBACiAKIHN0YXRpYyB2b2lkIHdsMTI3MV9yeF9zdHJlYW1pbmdfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewotCXN0cnVjdCB3bDEyNzEgKndsID0gKHN0cnVjdCB3bDEyNzEgKilkYXRhOwotCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywgJndsLT5yeF9zdHJlYW1pbmdfZGlzYWJsZV93b3JrKTsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSAoc3RydWN0IHdsMTJ4eF92aWYgKilkYXRhOworCXN0cnVjdCB3bDEyNzEgKndsID0gd2x2aWYtPndsOworCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywgJndsdmlmLT5yeF9zdHJlYW1pbmdfZGlzYWJsZV93b3JrKTsKIH0KIAogc3RhdGljIHZvaWQgd2wxMjcxX2NvbmZfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCkKQEAgLTY0NSw5ICs2NTEsNyBAQAogCiBzdGF0aWMgaW50IHdsMTI3MV9wbHRfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKLQlzdHJ1Y3QgY29uZl90eF9hY19jYXRlZ29yeSAqY29uZl9hYzsKLQlzdHJ1Y3QgY29uZl90eF90aWQgKmNvbmZfdGlkOwotCWludCByZXQsIGk7CisJaW50IHJldDsKIAogCWlmICh3bC0+Y2hpcC5pZCA9PSBDSElQX0lEXzEyODNfUEcyMCkKIAkJcmV0ID0gd2wxMjh4X2NtZF9nZW5lcmFsX3Bhcm1zKHdsKTsKQEAgLTY3Niw3NCArNjgwLDE0IEBACiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQlyZXQgPSB3bDEyNzFfc3RhX2luaXRfdGVtcGxhdGVzX2NvbmZpZyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiByZXQ7Ci0KIAlyZXQgPSB3bDEyNzFfYWN4X2luaXRfbWVtX2NvbmZpZyh3bCk7CiAJaWYgKHJldCA8IDApCiAJCXJldHVybiByZXQ7CiAKLQkvKiBQSFkgbGF5ZXIgY29uZmlnICovCi0JcmV0ID0gd2wxMjcxX2luaXRfcGh5X2NvbmZpZyh3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCi0JcmV0ID0gd2wxMjcxX2FjeF9kY29faXRyaW1fcGFyYW1zKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZnJlZV9tZW1tYXA7Ci0KLQkvKiBJbml0aWFsaXplIGNvbm5lY3Rpb24gbW9uaXRvcmluZyB0aHJlc2hvbGRzICovCi0JcmV0ID0gd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyh3bCwgZmFsc2UpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKLQotCS8qIEJsdWV0b290aCBXTEFOIGNvZXhpc3RlbmNlICovCi0JcmV0ID0gd2wxMjcxX2luaXRfcHRhKHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZnJlZV9tZW1tYXA7Ci0KLQkvKiBGTSBXTEFOIGNvZXhpc3RlbmNlICovCi0JcmV0ID0gd2wxMjcxX2FjeF9mbV9jb2V4KHdsKTsKLQlpZiAocmV0IDwgMCkKLQkJZ290byBvdXRfZnJlZV9tZW1tYXA7Ci0KLQkvKiBFbmVyZ3kgZGV0ZWN0aW9uICovCi0JcmV0ID0gd2wxMjcxX2luaXRfZW5lcmd5X2RldGVjdGlvbih3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCiAJcmV0ID0gd2wxMnh4X2FjeF9tZW1fY2ZnKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfZnJlZV9tZW1tYXA7CiAKLQkvKiBEZWZhdWx0IGZyYWdtZW50YXRpb24gdGhyZXNob2xkICovCi0JcmV0ID0gd2wxMjcxX2FjeF9mcmFnX3RocmVzaG9sZCh3bCwgd2wtPmNvbmYudHguZnJhZ190aHJlc2hvbGQpOwotCWlmIChyZXQgPCAwKQotCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKLQotCS8qIERlZmF1bHQgVElEL0FDIGNvbmZpZ3VyYXRpb24gKi8KLQlCVUdfT04od2wtPmNvbmYudHgudGlkX2NvbmZfY291bnQgIT0gd2wtPmNvbmYudHguYWNfY29uZl9jb3VudCk7Ci0JZm9yIChpID0gMDsgaSA8IHdsLT5jb25mLnR4LnRpZF9jb25mX2NvdW50OyBpKyspIHsKLQkJY29uZl9hYyA9ICZ3bC0+Y29uZi50eC5hY19jb25mW2ldOwotCQlyZXQgPSB3bDEyNzFfYWN4X2FjX2NmZyh3bCwgY29uZl9hYy0+YWMsIGNvbmZfYWMtPmN3X21pbiwKLQkJCQkJY29uZl9hYy0+Y3dfbWF4LCBjb25mX2FjLT5haWZzbiwKLQkJCQkJY29uZl9hYy0+dHhfb3BfbGltaXQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0X2ZyZWVfbWVtbWFwOwotCi0JCWNvbmZfdGlkID0gJndsLT5jb25mLnR4LnRpZF9jb25mW2ldOwotCQlyZXQgPSB3bDEyNzFfYWN4X3RpZF9jZmcod2wsIGNvbmZfdGlkLT5xdWV1ZV9pZCwKLQkJCQkJIGNvbmZfdGlkLT5jaGFubmVsX3R5cGUsCi0JCQkJCSBjb25mX3RpZC0+dHNpZCwKLQkJCQkJIGNvbmZfdGlkLT5wc19zY2hlbWUsCi0JCQkJCSBjb25mX3RpZC0+YWNrX3BvbGljeSwKLQkJCQkJIGNvbmZfdGlkLT5hcHNkX2NvbmZbMF0sCi0JCQkJCSBjb25mX3RpZC0+YXBzZF9jb25mWzFdKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF9mcmVlX21lbW1hcDsKLQl9Ci0KIAkvKiBFbmFibGUgZGF0YSBwYXRoICovCiAJcmV0ID0gd2wxMjcxX2NtZF9kYXRhX3BhdGgod2wsIDEpOwogCWlmIChyZXQgPCAwKQpAQCAtNzY4LDE0ICs3MTIsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB3bDEyeHhfaXJxX3BzX3JlZ3VsYXRlX2xpbmsoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGhsaWQsIHU4IHR4X3BrdHMpCitzdGF0aWMgdm9pZCB3bDEyeHhfaXJxX3BzX3JlZ3VsYXRlX2xpbmsoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCQkJdTggaGxpZCwgdTggdHhfcGt0cykKIHsKIAlib29sIGZ3X3BzLCBzaW5nbGVfc3RhOwogCi0JLyogb25seSByZWd1bGF0ZSBzdGF0aW9uIGxpbmtzICovCi0JaWYgKGhsaWQgPCBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQpCi0JCXJldHVybjsKLQogCWZ3X3BzID0gdGVzdF9iaXQoaGxpZCwgKHVuc2lnbmVkIGxvbmcgKikmd2wtPmFwX2Z3X3BzX21hcCk7CiAJc2luZ2xlX3N0YSA9ICh3bC0+YWN0aXZlX3N0YV9jb3VudCA9PSAxKTsKIApAQCAtNzg0LDcgKzcyNiw3IEBACiAJICogcGFja2V0cyBpbiBGVyBvciBpZiB0aGUgU1RBIGlzIGF3YWtlLgogCSAqLwogCWlmICghZndfcHMgfHwgdHhfcGt0cyA8IFdMMTI3MV9QU19TVEFfTUFYX1BBQ0tFVFMpCi0JCXdsMTI3MV9wc19saW5rX2VuZCh3bCwgaGxpZCk7CisJCXdsMTJ4eF9wc19saW5rX2VuZCh3bCwgd2x2aWYsIGhsaWQpOwogCiAJLyoKIAkgKiBTdGFydCBoaWdoLWxldmVsIFBTIGlmIHRoZSBTVEEgaXMgYXNsZWVwIHdpdGggZW5vdWdoIGJsb2NrcyBpbiBGVy4KQEAgLTc5MiwyNCArNzM0LDE0IEBACiAJICogY2FzZSBGVy1tZW1vcnkgY29uZ2VzdGlvbiBpcyBub3QgYSBwcm9ibGVtLgogCSAqLwogCWVsc2UgaWYgKCFzaW5nbGVfc3RhICYmIGZ3X3BzICYmIHR4X3BrdHMgPj0gV0wxMjcxX1BTX1NUQV9NQVhfUEFDS0VUUykKLQkJd2wxMjcxX3BzX2xpbmtfc3RhcnQod2wsIGhsaWQsIHRydWUpOwotfQotCi1ib29sIHdsMTI3MV9pc19hY3RpdmVfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkKQotewotCWludCBpZDsKLQotCS8qIGdsb2JhbC9icm9hZGNhc3QgInN0YXRpb25zIiBhcmUgYWx3YXlzIGFjdGl2ZSAqLwotCWlmIChobGlkIDwgV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUKQotCQlyZXR1cm4gdHJ1ZTsKLQotCWlkID0gaGxpZCAtIFdMMTI3MV9BUF9TVEFfSExJRF9TVEFSVDsKLQlyZXR1cm4gdGVzdF9iaXQoaWQsIHdsLT5hcF9obGlkX21hcCk7CisJCXdsMTJ4eF9wc19saW5rX3N0YXJ0KHdsLCB3bHZpZiwgaGxpZCwgdHJ1ZSk7CiB9CiAKIHN0YXRpYyB2b2lkIHdsMTJ4eF9pcnFfdXBkYXRlX2xpbmtzX3N0YXR1cyhzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAogCQkJCQkgICBzdHJ1Y3Qgd2wxMnh4X2Z3X3N0YXR1cyAqc3RhdHVzKQogeworCXN0cnVjdCB3bDEyNzFfbGluayAqbG5rOwogCXUzMiBjdXJfZndfcHNfbWFwOwogCXU4IGhsaWQsIGNudDsKIApAQCAtODI1LDI1ICs3NTcsMjIgQEAKIAkJd2wtPmFwX2Z3X3BzX21hcCA9IGN1cl9md19wc19tYXA7CiAJfQogCi0JZm9yIChobGlkID0gV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUOyBobGlkIDwgQVBfTUFYX0xJTktTOyBobGlkKyspIHsKLQkJaWYgKCF3bDEyNzFfaXNfYWN0aXZlX3N0YSh3bCwgaGxpZCkpCi0JCQljb250aW51ZTsKKwlmb3JfZWFjaF9zZXRfYml0KGhsaWQsIHdsdmlmLT5hcC5zdGFfaGxpZF9tYXAsIFdMMTJYWF9NQVhfTElOS1MpIHsKKwkJbG5rID0gJndsLT5saW5rc1tobGlkXTsKKwkJY250ID0gc3RhdHVzLT50eF9sbmtfZnJlZV9wa3RzW2hsaWRdIC0gbG5rLT5wcmV2X2ZyZWVkX3BrdHM7CiAKLQkJY250ID0gc3RhdHVzLT50eF9sbmtfZnJlZV9wa3RzW2hsaWRdIC0KLQkJICAgICAgd2wtPmxpbmtzW2hsaWRdLnByZXZfZnJlZWRfcGt0czsKKwkJbG5rLT5wcmV2X2ZyZWVkX3BrdHMgPSBzdGF0dXMtPnR4X2xua19mcmVlX3BrdHNbaGxpZF07CisJCWxuay0+YWxsb2NhdGVkX3BrdHMgLT0gY250OwogCi0JCXdsLT5saW5rc1tobGlkXS5wcmV2X2ZyZWVkX3BrdHMgPQotCQkJc3RhdHVzLT50eF9sbmtfZnJlZV9wa3RzW2hsaWRdOwotCQl3bC0+bGlua3NbaGxpZF0uYWxsb2NhdGVkX3BrdHMgLT0gY250OwotCi0JCXdsMTJ4eF9pcnFfcHNfcmVndWxhdGVfbGluayh3bCwgaGxpZCwKLQkJCQkJICAgIHdsLT5saW5rc1tobGlkXS5hbGxvY2F0ZWRfcGt0cyk7CisJCXdsMTJ4eF9pcnFfcHNfcmVndWxhdGVfbGluayh3bCwgd2x2aWYsIGhsaWQsCisJCQkJCSAgICBsbmstPmFsbG9jYXRlZF9wa3RzKTsKIAl9CiB9CiAKIHN0YXRpYyB2b2lkIHdsMTJ4eF9md19zdGF0dXMoc3RydWN0IHdsMTI3MSAqd2wsCiAJCQkgICAgIHN0cnVjdCB3bDEyeHhfZndfc3RhdHVzICpzdGF0dXMpCiB7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOwogCXN0cnVjdCB0aW1lc3BlYyB0czsKIAl1MzIgb2xkX3R4X2Jsa19jb3VudCA9IHdsLT50eF9ibG9ja3NfYXZhaWxhYmxlOwogCWludCBhdmFpbCwgZnJlZWRfYmxvY2tzOwpAQCAtODk4LDggKzgyNyw5IEBACiAJCWNsZWFyX2JpdChXTDEyNzFfRkxBR19GV19UWF9CVVNZLCAmd2wtPmZsYWdzKTsKIAogCS8qIGZvciBBUCB1cGRhdGUgbnVtIG9mIGFsbG9jYXRlZCBUWCBibG9ja3MgcGVyIGxpbmsgYW5kIHBzIHN0YXR1cyAqLwotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKQotCQl3bDEyeHhfaXJxX3VwZGF0ZV9saW5rc19zdGF0dXMod2wsIHN0YXR1cyk7CisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX2FwKHdsLCB3bHZpZikgeworCQl3bDEyeHhfaXJxX3VwZGF0ZV9saW5rc19zdGF0dXMod2wsIHdsdmlmLCBzdGF0dXMpOworCX0KIAogCS8qIHVwZGF0ZSB0aGUgaG9zdC1jaGlwc2V0IHRpbWUgb2Zmc2V0ICovCiAJZ2V0bnN0aW1lb2ZkYXkoJnRzKTsKQEAgLTkzMiw3ICs4NjIsNyBAQAogCiAjZGVmaW5lIFdMMTI3MV9JUlFfTUFYX0xPT1BTIDI1NgogCi1pcnFyZXR1cm5fdCB3bDEyNzFfaXJxKGludCBpcnEsIHZvaWQgKmNvb2tpZSkKK3N0YXRpYyBpcnFyZXR1cm5fdCB3bDEyNzFfaXJxKGludCBpcnEsIHZvaWQgKmNvb2tpZSkKIHsKIAlpbnQgcmV0OwogCXUzMiBpbnRyOwpAQCAtMTA1NCw3ICs5ODQsNiBAQAogCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQotRVhQT1JUX1NZTUJPTF9HUEwod2wxMjcxX2lycSk7CiAKIHN0YXRpYyBpbnQgd2wxMjcxX2ZldGNoX2Zpcm13YXJlKHN0cnVjdCB3bDEyNzEgKndsKQogewpAQCAtMTA2OSwxMCArOTk4LDEwIEBACiAKIAl3bDEyNzFfZGVidWcoREVCVUdfQk9PVCwgImJvb3RpbmcgZmlybXdhcmUgJXMiLCBmd19uYW1lKTsKIAotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBmd19uYW1lLCB3bDEyNzFfd2xfdG9fZGV2KHdsKSk7CisJcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZncsIGZ3X25hbWUsIHdsLT5kZXYpOwogCiAJaWYgKHJldCA8IDApIHsKLQkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgZ2V0IGZpcm13YXJlOiAlZCIsIHJldCk7CisJCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGdldCBmaXJtd2FyZSAlczogJWQiLCBmd19uYW1lLCByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTEwNywxMCArMTAzNiwxMSBAQAogCWNvbnN0IHN0cnVjdCBmaXJtd2FyZSAqZnc7CiAJaW50IHJldDsKIAotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBXTDEyWFhfTlZTX05BTUUsIHdsMTI3MV93bF90b19kZXYod2wpKTsKKwlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgV0wxMlhYX05WU19OQU1FLCB3bC0+ZGV2KTsKIAogCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGdldCBudnMgZmlsZTogJWQiLCByZXQpOworCQl3bDEyNzFfZXJyb3IoImNvdWxkIG5vdCBnZXQgbnZzIGZpbGUgJXM6ICVkIiwgV0wxMlhYX05WU19OQU1FLAorCQkJICAgICByZXQpOwogCQlyZXR1cm4gcmV0OwogCX0KIApAQCAtMTIxNywxMSArMTE0NywxMyBAQAogewogCXN0cnVjdCB3bDEyNzEgKndsID0KIAkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3bDEyNzEsIHJlY292ZXJ5X3dvcmspOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOwogCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKIAogCWlmICh3bC0+c3RhdGUgIT0gV0wxMjcxX1NUQVRFX09OKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfdW5sb2NrOwogCiAJLyogQXZvaWQgYSByZWN1cnNpdmUgcmVjb3ZlcnkgKi8KIAlzZXRfYml0KFdMMTI3MV9GTEFHX1JFQ09WRVJZX0lOX1BST0dSRVNTLCAmd2wtPmZsYWdzKTsKQEAgLTEyMzgsOSArMTE3MCwxMiBAQAogCSAqIGluIHRoZSBmaXJtd2FyZSBkdXJpbmcgcmVjb3ZlcnkuIFRoaXMgZG9lbnMndCBodXJ0IGlmIHRoZSBuZXR3b3JrIGlzCiAJICogbm90IGVuY3J5cHRlZC4KIAkgKi8KLQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpIHx8Ci0JICAgIHRlc3RfYml0KFdMMTI3MV9GTEFHX0FQX1NUQVJURUQsICZ3bC0+ZmxhZ3MpKQotCQl3bC0+dHhfc2VjdXJpdHlfc2VxICs9IFdMMTI3MV9UWF9TUU5fUE9TVF9SRUNPVkVSWV9QQURESU5HOworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZih3bCwgd2x2aWYpIHsKKwkJaWYgKHRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpIHx8CisJCSAgICB0ZXN0X2JpdChXTFZJRl9GTEFHX0FQX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpKQorCQkJd2x2aWYtPnR4X3NlY3VyaXR5X3NlcSArPQorCQkJCVdMMTI3MV9UWF9TUU5fUE9TVF9SRUNPVkVSWV9QQURESU5HOworCX0KIAogCS8qIFByZXZlbnQgc3B1cmlvdXMgVFggZHVyaW5nIEZXIHJlc3RhcnQgKi8KIAlpZWVlODAyMTFfc3RvcF9xdWV1ZXMod2wtPmh3KTsKQEAgLTEyNTEsNyArMTE4NiwxNCBAQAogCX0KIAogCS8qIHJlYm9vdCB0aGUgY2hpcHNldCAqLwotCV9fd2wxMjcxX29wX3JlbW92ZV9pbnRlcmZhY2Uod2wsIGZhbHNlKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJndsLT53bHZpZl9saXN0KSkgeworCQl3bHZpZiA9IGxpc3RfZmlyc3RfZW50cnkoJndsLT53bHZpZl9saXN0LAorCQkJCSAgICAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiwgbGlzdCk7CisJCXZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOworCQlfX3dsMTI3MV9vcF9yZW1vdmVfaW50ZXJmYWNlKHdsLCB2aWYsIGZhbHNlKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOworCXdsMTI3MV9vcF9zdG9wKHdsLT5odyk7CiAKIAljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfUkVDT1ZFUllfSU5fUFJPR1JFU1MsICZ3bC0+ZmxhZ3MpOwogCkBAIC0xMjYyLDggKzEyMDQsOCBAQAogCSAqIHRvIHJlc3RhcnQgdGhlIEhXLgogCSAqLwogCWllZWU4MDIxMV93YWtlX3F1ZXVlcyh3bC0+aHcpOwotCi1vdXQ6CisJcmV0dXJuOworb3V0X3VubG9jazoKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiB9CiAKQEAgLTEzMTgsNyArMTI2MCwxNiBAQAogCS8qIDAuIHJlYWQgY2hpcCBpZCBmcm9tIENISVBfSUQgKi8KIAl3bC0+Y2hpcC5pZCA9IHdsMTI3MV9yZWFkMzIod2wsIENISVBfSURfQik7CiAKLQkvKiAxLiBjaGVjayBpZiBjaGlwIGlkIGlzIHZhbGlkICovCisJLyoKKwkgKiBGb3Igd2wxMjd4IGJhc2VkIGRldmljZXMgd2UgY291bGQgdXNlIHRoZSBkZWZhdWx0IGJsb2NrCisJICogc2l6ZSAoNTEyIGJ5dGVzKSwgYnV0IGR1ZSB0byBhIGJ1ZyBpbiB0aGUgc2RpbyBkcml2ZXIsIHdlCisJICogbmVlZCB0byBzZXQgaXQgZXhwbGljaXRseSBhZnRlciB0aGUgY2hpcCBpcyBwb3dlcmVkIG9uLiAgVG8KKwkgKiBzaW1wbGlmeSB0aGUgY29kZSBhbmQgc2luY2UgdGhlIHBlcmZvcm1hbmNlIGltcGFjdCBpcworCSAqIG5lZ2xpZ2libGUsIHdlIHVzZSB0aGUgc2FtZSBibG9jayBzaXplIGZvciBhbGwgZGlmZmVyZW50CisJICogY2hpcCB0eXBlcy4KKwkgKi8KKwlpZiAoIXdsMTI3MV9zZXRfYmxvY2tfc2l6ZSh3bCkpCisJCXdsLT5xdWlya3MgfD0gV0wxMlhYX1FVSVJLX05PX0JMT0NLU0laRV9BTElHTk1FTlQ7CiAKIAlzd2l0Y2ggKHdsLT5jaGlwLmlkKSB7CiAJY2FzZSBDSElQX0lEXzEyNzFfUEcxMDoKQEAgLTEzMjgsNyArMTI3OSw5IEBACiAJCXJldCA9IHdsMTI3MV9zZXR1cCh3bCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CisJCXdsLT5xdWlya3MgfD0gV0wxMlhYX1FVSVJLX05PX0JMT0NLU0laRV9BTElHTk1FTlQ7CiAJCWJyZWFrOworCiAJY2FzZSBDSElQX0lEXzEyNzFfUEcyMDoKIAkJd2wxMjcxX2RlYnVnKERFQlVHX0JPT1QsICJjaGlwIGlkIDB4JXggKDEyNzEgUEcyMCkiLAogCQkJICAgICB3bC0+Y2hpcC5pZCk7CkBAIC0xMzM2LDcgKzEyODksOSBAQAogCQlyZXQgPSB3bDEyNzFfc2V0dXAod2wpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gb3V0OworCQl3bC0+cXVpcmtzIHw9IFdMMTJYWF9RVUlSS19OT19CTE9DS1NJWkVfQUxJR05NRU5UOwogCQlicmVhazsKKwogCWNhc2UgQ0hJUF9JRF8xMjgzX1BHMjA6CiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19CT09ULCAiY2hpcCBpZCAweCV4ICgxMjgzIFBHMjApIiwKIAkJCSAgICAgd2wtPmNoaXAuaWQpOwpAQCAtMTM0NCw5ICsxMjk5LDYgQEAKIAkJcmV0ID0gd2wxMjcxX3NldHVwKHdsKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKLQotCQlpZiAod2wxMjcxX3NldF9ibG9ja19zaXplKHdsKSkKLQkJCXdsLT5xdWlya3MgfD0gV0wxMlhYX1FVSVJLX0JMT0NLU0laRV9BTElHTk1FTlQ7CiAJCWJyZWFrOwogCWNhc2UgQ0hJUF9JRF8xMjgzX1BHMTA6CiAJZGVmYXVsdDoKQEAgLTEzODksOCArMTM0MSw2IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXdsLT5ic3NfdHlwZSA9IEJTU19UWVBFX1NUQV9CU1M7Ci0KIAl3aGlsZSAocmV0cmllcykgewogCQlyZXRyaWVzLS07CiAJCXJldCA9IHdsMTI3MV9jaGlwX3dha2V1cCh3bCk7CkBAIC0xNDgyLDMzICsxNDMyLDM0IEBACiBzdGF0aWMgdm9pZCB3bDEyNzFfb3BfdHgoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IGluZm8tPmNvbnRyb2wudmlmOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IE5VTEw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcSwgbWFwcGluZzsKLQl1OCBobGlkID0gMDsKKwl1OCBobGlkOworCisJaWYgKHZpZikKKwkJd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAogCW1hcHBpbmcgPSBza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKTsKIAlxID0gd2wxMjcxX3R4X2dldF9xdWV1ZShtYXBwaW5nKTsKIAotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKQotCQlobGlkID0gd2wxMnh4X3R4X2dldF9obGlkX2FwKHdsLCBza2IpOworCWhsaWQgPSB3bDEyeHhfdHhfZ2V0X2hsaWQod2wsIHdsdmlmLCBza2IpOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndsLT53bF9sb2NrLCBmbGFncyk7CiAKIAkvKiBxdWV1ZSB0aGUgcGFja2V0ICovCi0JaWYgKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpIHsKLQkJaWYgKCF3bDEyNzFfaXNfYWN0aXZlX3N0YSh3bCwgaGxpZCkpIHsKLQkJCXdsMTI3MV9kZWJ1ZyhERUJVR19UWCwgIkRST1Agc2tiIGhsaWQgJWQgcSAlZCIsCi0JCQkJICAgICBobGlkLCBxKTsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJd2wxMjcxX2RlYnVnKERFQlVHX1RYLCAicXVldWUgc2tiIGhsaWQgJWQgcSAlZCIsIGhsaWQsIHEpOwotCQlza2JfcXVldWVfdGFpbCgmd2wtPmxpbmtzW2hsaWRdLnR4X3F1ZXVlW3FdLCBza2IpOwotCX0gZWxzZSB7Ci0JCXNrYl9xdWV1ZV90YWlsKCZ3bC0+dHhfcXVldWVbcV0sIHNrYik7CisJaWYgKGhsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCB8fAorCSAgICAod2x2aWYgJiYgIXRlc3RfYml0KGhsaWQsIHdsdmlmLT5saW5rc19tYXApKSkgeworCQl3bDEyNzFfZGVidWcoREVCVUdfVFgsICJEUk9QIHNrYiBobGlkICVkIHEgJWQiLCBobGlkLCBxKTsKKwkJaWVlZTgwMjExX2ZyZWVfdHhza2IoaHcsIHNrYik7CisJCWdvdG8gb3V0OwogCX0KIAorCXdsMTI3MV9kZWJ1ZyhERUJVR19UWCwgInF1ZXVlIHNrYiBobGlkICVkIHEgJWQiLCBobGlkLCBxKTsKKwlza2JfcXVldWVfdGFpbCgmd2wtPmxpbmtzW2hsaWRdLnR4X3F1ZXVlW3FdLCBza2IpOworCiAJd2wtPnR4X3F1ZXVlX2NvdW50W3FdKys7CiAKIAkvKgpAQCAtMTYwOSwxMyArMTU2MCwxNCBAQAogfTsKIAogI2lmZGVmIENPTkZJR19QTQotc3RhdGljIGludCB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmRfc3RhKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmRfc3RhKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwogCi0JaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKSkKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wpOwpAQCAtMTYyMywxMiArMTU3NSwxMiBAQAogCQlnb3RvIG91dF91bmxvY2s7CiAKIAkvKiBlbnRlciBwc20gaWYgbmVlZGVkKi8KLQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTSwgJndsLT5mbGFncykpIHsKKwlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfUFNNLCAmd2x2aWYtPmZsYWdzKSkgewogCQlERUNMQVJFX0NPTVBMRVRJT05fT05TVEFDSyhjb21wbCk7CiAKLQkJd2wtPnBzX2NvbXBsID0gJmNvbXBsOwotCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIFNUQVRJT05fUE9XRVJfU0FWRV9NT0RFLAotCQkJCSAgIHdsLT5iYXNpY19yYXRlLCB0cnVlKTsKKwkJd2x2aWYtPnBzX2NvbXBsID0gJmNvbXBsOworCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIHdsdmlmLCBTVEFUSU9OX1BPV0VSX1NBVkVfTU9ERSwKKwkJCQkgICB3bHZpZi0+YmFzaWNfcmF0ZSwgdHJ1ZSk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXRfc2xlZXA7CiAKQEAgLTE2MzgsNDIgKzE1OTAsNDMgQEAKIAogCQlyZXQgPSB3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoCiAJCQkmY29tcGwsIG1zZWNzX3RvX2ppZmZpZXMoV0wxMjcxX1BTX0NPTVBMRVRFX1RJTUVPVVQpKTsKKworCQltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwogCQlpZiAocmV0IDw9IDApIHsKIAkJCXdsMTI3MV93YXJuaW5nKCJjb3VsZG4ndCBlbnRlciBwcyBtb2RlISIpOwogCQkJcmV0ID0gLUVCVVNZOwotCQkJZ290byBvdXQ7CisJCQlnb3RvIG91dF9jbGVhbnVwOwogCQl9CiAKLQkJLyogdGFrZSBtdXRleCBhZ2FpbiwgYW5kIHdha2V1cCAqLwotCQltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwotCiAJCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKIAkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dF91bmxvY2s7CisJCQlnb3RvIG91dF9jbGVhbnVwOwogCX0KIG91dF9zbGVlcDoKIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKK291dF9jbGVhbnVwOgorCXdsdmlmLT5wc19jb21wbCA9IE5VTEw7CiBvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKLW91dDoKIAlyZXR1cm4gcmV0OwogCiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kX2FwKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmRfYXAoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAKLQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX0FQX1NUQVJURUQsICZ3bC0+ZmxhZ3MpKQorCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19BUF9TVEFSVEVELCAmd2x2aWYtPmZsYWdzKSkKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF91bmxvY2s7CiAKLQlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCB0cnVlKTsKKwlyZXQgPSB3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCB3bHZpZiwgdHJ1ZSk7CiAKIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKIG91dF91bmxvY2s6CkBAIC0xNjgyLDIwICsxNjM1LDIyIEBACiAKIH0KIAotc3RhdGljIGludCB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmQoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTI3MV9jb25maWd1cmVfc3VzcGVuZChzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUykKLQkJcmV0dXJuIHdsMTI3MV9jb25maWd1cmVfc3VzcGVuZF9zdGEod2wpOwotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKQotCQlyZXR1cm4gd2wxMjcxX2NvbmZpZ3VyZV9zdXNwZW5kX2FwKHdsKTsKKwlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MpCisJCXJldHVybiB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmRfc3RhKHdsLCB3bHZpZik7CisJaWYgKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpCisJCXJldHVybiB3bDEyNzFfY29uZmlndXJlX3N1c3BlbmRfYXAod2wsIHdsdmlmKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgd2wxMjcxX2NvbmZpZ3VyZV9yZXN1bWUoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgdm9pZCB3bDEyNzFfY29uZmlndXJlX3Jlc3VtZShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCByZXQ7Ci0JYm9vbCBpc19zdGEgPSB3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUzsKLQlib29sIGlzX2FwID0gd2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUzsKKwlib29sIGlzX3N0YSA9IHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTOworCWJvb2wgaXNfYXAgPSB3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTOwogCiAJaWYgKCFpc19zdGEgJiYgIWlzX2FwKQogCQlyZXR1cm47CkBAIC0xNzA3LDExICsxNjYyLDExIEBACiAKIAlpZiAoaXNfc3RhKSB7CiAJCS8qIGV4aXQgcHNtIGlmIGl0IHdhc24ndCBjb25maWd1cmVkICovCi0JCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfUFNNX1JFUVVFU1RFRCwgJndsLT5mbGFncykpCi0JCQl3bDEyNzFfcHNfc2V0X21vZGUod2wsIFNUQVRJT05fQUNUSVZFX01PREUsCi0JCQkJCSAgIHdsLT5iYXNpY19yYXRlLCB0cnVlKTsKKwkJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bHZpZi0+ZmxhZ3MpKQorCQkJd2wxMjcxX3BzX3NldF9tb2RlKHdsLCB3bHZpZiwgU1RBVElPTl9BQ1RJVkVfTU9ERSwKKwkJCQkJICAgd2x2aWYtPmJhc2ljX3JhdGUsIHRydWUpOwogCX0gZWxzZSBpZiAoaXNfYXApIHsKLQkJd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdCh3bCwgZmFsc2UpOworCQl3bDEyNzFfYWN4X2JlYWNvbl9maWx0ZXJfb3B0KHdsLCB3bHZpZiwgZmFsc2UpOwogCX0KIAogCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOwpAQCAtMTcyMywxNiArMTY3OCwxOSBAQAogCQkJICAgIHN0cnVjdCBjZmc4MDIxMV93b3dsYW4gKndvdykKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlpbnQgcmV0OwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAibWFjODAyMTEgc3VzcGVuZCB3b3c9JWQiLCAhIXdvdyk7CiAJV0FSTl9PTighd293IHx8ICF3b3ctPmFueSk7CiAKIAl3bC0+d293X2VuYWJsZWQgPSB0cnVlOwotCXJldCA9IHdsMTI3MV9jb25maWd1cmVfc3VzcGVuZCh3bCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJd2wxMjcxX3dhcm5pbmcoImNvdWxkbid0IHByZXBhcmUgZGV2aWNlIHRvIHN1c3BlbmQiKTsKLQkJcmV0dXJuIHJldDsKKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWYod2wsIHdsdmlmKSB7CisJCXJldCA9IHdsMTI3MV9jb25maWd1cmVfc3VzcGVuZCh3bCwgd2x2aWYpOworCQlpZiAocmV0IDwgMCkgeworCQkJd2wxMjcxX3dhcm5pbmcoImNvdWxkbid0IHByZXBhcmUgZGV2aWNlIHRvIHN1c3BlbmQiKTsKKwkJCXJldHVybiByZXQ7CisJCX0KIAl9CiAJLyogZmx1c2ggYW55IHJlbWFpbmluZyB3b3JrICovCiAJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAiZmx1c2hpbmcgcmVtYWluaW5nIHdvcmtzIik7CkBAIC0xNzUxLDcgKzE3MDksOSBAQAogCiAJd2wxMjcxX2VuYWJsZV9pbnRlcnJ1cHRzKHdsKTsKIAlmbHVzaF93b3JrKCZ3bC0+dHhfd29yayk7Ci0JZmx1c2hfZGVsYXllZF93b3JrKCZ3bC0+cHNwb2xsX3dvcmspOworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZih3bCwgd2x2aWYpIHsKKwkJZmx1c2hfZGVsYXllZF93b3JrKCZ3bHZpZi0+cHNwb2xsX3dvcmspOworCX0KIAlmbHVzaF9kZWxheWVkX3dvcmsoJndsLT5lbHBfd29yayk7CiAKIAlyZXR1cm4gMDsKQEAgLTE3NjAsNiArMTcyMCw3IEBACiBzdGF0aWMgaW50IHdsMTI3MV9vcF9yZXN1bWUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpCiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlib29sIHJ1bl9pcnFfd29yayA9IGZhbHNlOwogCkBAIC0xNzgzLDcgKzE3NDQsOSBAQAogCQl3bDEyNzFfaXJxKDAsIHdsKTsKIAkJd2wxMjcxX2VuYWJsZV9pbnRlcnJ1cHRzKHdsKTsKIAl9Ci0Jd2wxMjcxX2NvbmZpZ3VyZV9yZXN1bWUod2wpOworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZih3bCwgd2x2aWYpIHsKKwkJd2wxMjcxX2NvbmZpZ3VyZV9yZXN1bWUod2wsIHdsdmlmKTsKKwl9CiAJd2wtPndvd19lbmFibGVkID0gZmFsc2U7CiAKIAlyZXR1cm4gMDsKQEAgLTE4MTAsMjAgKzE3NzMsMTE5IEBACiAKIHN0YXRpYyB2b2lkIHdsMTI3MV9vcF9zdG9wKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogeworCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJaW50IGk7CisKIAl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsICJtYWM4MDIxMSBzdG9wIik7CisKKwltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCWlmICh3bC0+c3RhdGUgPT0gV0wxMjcxX1NUQVRFX09GRikgeworCQltdXRleF91bmxvY2soJndsLT5tdXRleCk7CisJCXJldHVybjsKKwl9CisJLyoKKwkgKiB0aGlzIG11c3QgYmUgYmVmb3JlIHRoZSBjYW5jZWxfd29yayBjYWxscyBiZWxvdywgc28gdGhhdCB0aGUgd29yaworCSAqIGZ1bmN0aW9ucyBkb24ndCBwZXJmb3JtIGZ1cnRoZXIgd29yay4KKwkgKi8KKwl3bC0+c3RhdGUgPSBXTDEyNzFfU1RBVEVfT0ZGOworCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKworCW11dGV4X2xvY2soJndsX2xpc3RfbXV0ZXgpOworCWxpc3RfZGVsKCZ3bC0+bGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZ3bF9saXN0X211dGV4KTsKKworCXdsMTI3MV9kaXNhYmxlX2ludGVycnVwdHMod2wpOworCXdsMTI3MV9mbHVzaF9kZWZlcnJlZF93b3JrKHdsKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndsLT5zY2FuX2NvbXBsZXRlX3dvcmspOworCWNhbmNlbF93b3JrX3N5bmMoJndsLT5uZXRzdGFja193b3JrKTsKKwljYW5jZWxfd29ya19zeW5jKCZ3bC0+dHhfd29yayk7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3bC0+ZWxwX3dvcmspOworCisJLyogbGV0J3Mgbm90aWZ5IE1BQzgwMjExIGFib3V0IHRoZSByZW1haW5pbmcgcGVuZGluZyBUWCBmcmFtZXMgKi8KKwl3bDEyeHhfdHhfcmVzZXQod2wsIHRydWUpOworCW11dGV4X2xvY2soJndsLT5tdXRleCk7CisKKwl3bDEyNzFfcG93ZXJfb2ZmKHdsKTsKKworCXdsLT5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWjsKKworCXdsLT5yeF9jb3VudGVyID0gMDsKKwl3bC0+cG93ZXJfbGV2ZWwgPSBXTDEyNzFfREVGQVVMVF9QT1dFUl9MRVZFTDsKKwl3bC0+dHhfYmxvY2tzX2F2YWlsYWJsZSA9IDA7CisJd2wtPnR4X2FsbG9jYXRlZF9ibG9ja3MgPSAwOworCXdsLT50eF9yZXN1bHRzX2NvdW50ID0gMDsKKwl3bC0+dHhfcGFja2V0c19jb3VudCA9IDA7CisJd2wtPnRpbWVfb2Zmc2V0ID0gMDsKKwl3bC0+dHhfc3BhcmVfYmxvY2tzID0gVFhfSFdfQkxPQ0tfU1BBUkVfREVGQVVMVDsKKwl3bC0+YXBfZndfcHNfbWFwID0gMDsKKwl3bC0+YXBfcHNfbWFwID0gMDsKKwl3bC0+c2NoZWRfc2Nhbm5pbmcgPSBmYWxzZTsKKwltZW1zZXQod2wtPnJvbGVzX21hcCwgMCwgc2l6ZW9mKHdsLT5yb2xlc19tYXApKTsKKwltZW1zZXQod2wtPmxpbmtzX21hcCwgMCwgc2l6ZW9mKHdsLT5saW5rc19tYXApKTsKKwltZW1zZXQod2wtPnJvY19tYXAsIDAsIHNpemVvZih3bC0+cm9jX21hcCkpOworCXdsLT5hY3RpdmVfc3RhX2NvdW50ID0gMDsKKworCS8qIFRoZSBzeXN0ZW0gbGluayBpcyBhbHdheXMgYWxsb2NhdGVkICovCisJX19zZXRfYml0KFdMMTJYWF9TWVNURU1fSExJRCwgd2wtPmxpbmtzX21hcCk7CisKKwkvKgorCSAqIHRoaXMgaXMgcGVyZm9ybWVkIGFmdGVyIHRoZSBjYW5jZWxfd29yayBjYWxscyBhbmQgdGhlIGFzc29jaWF0ZWQKKwkgKiBtdXRleF9sb2NrLCBzbyB0aGF0IHdsMTI3MV9vcF9hZGRfaW50ZXJmYWNlIGRvZXMgbm90IGFjY2lkZW50YWxseQorCSAqIGdldCBleGVjdXRlZCBiZWZvcmUgYWxsIHRoZXNlIHZhcnMgaGF2ZSBiZWVuIHJlc2V0LgorCSAqLworCXdsLT5mbGFncyA9IDA7CisKKwl3bC0+dHhfYmxvY2tzX2ZyZWVkID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fVFhfUVVFVUVTOyBpKyspIHsKKwkJd2wtPnR4X3BrdHNfZnJlZWRbaV0gPSAwOworCQl3bC0+dHhfYWxsb2NhdGVkX3BrdHNbaV0gPSAwOworCX0KKworCXdsMTI3MV9kZWJ1Z2ZzX3Jlc2V0KHdsKTsKKworCWtmcmVlKHdsLT5md19zdGF0dXMpOworCXdsLT5md19zdGF0dXMgPSBOVUxMOworCWtmcmVlKHdsLT50eF9yZXNfaWYpOworCXdsLT50eF9yZXNfaWYgPSBOVUxMOworCWtmcmVlKHdsLT50YXJnZXRfbWVtX21hcCk7CisJd2wtPnRhcmdldF9tZW1fbWFwID0gTlVMTDsKKworCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIH0KIAotc3RhdGljIHU4IHdsMTJ4eF9nZXRfcm9sZV90eXBlKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyeHhfYWxsb2NhdGVfcmF0ZV9wb2xpY3koc3RydWN0IHdsMTI3MSAqd2wsIHU4ICppZHgpCiB7Ci0Jc3dpdGNoICh3bC0+YnNzX3R5cGUpIHsKKwl1OCBwb2xpY3kgPSBmaW5kX2ZpcnN0X3plcm9fYml0KHdsLT5yYXRlX3BvbGljaWVzX21hcCwKKwkJCQkJV0wxMlhYX01BWF9SQVRFX1BPTElDSUVTKTsKKwlpZiAocG9saWN5ID49IFdMMTJYWF9NQVhfUkFURV9QT0xJQ0lFUykKKwkJcmV0dXJuIC1FQlVTWTsKKworCV9fc2V0X2JpdChwb2xpY3ksIHdsLT5yYXRlX3BvbGljaWVzX21hcCk7CisJKmlkeCA9IHBvbGljeTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgd2wxMnh4X2ZyZWVfcmF0ZV9wb2xpY3koc3RydWN0IHdsMTI3MSAqd2wsIHU4ICppZHgpCit7CisJaWYgKFdBUk5fT04oKmlkeCA+PSBXTDEyWFhfTUFYX1JBVEVfUE9MSUNJRVMpKQorCQlyZXR1cm47CisKKwlfX2NsZWFyX2JpdCgqaWR4LCB3bC0+cmF0ZV9wb2xpY2llc19tYXApOworCSppZHggPSBXTDEyWFhfTUFYX1JBVEVfUE9MSUNJRVM7Cit9CisKK3N0YXRpYyB1OCB3bDEyeHhfZ2V0X3JvbGVfdHlwZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQoreworCXN3aXRjaCAod2x2aWYtPmJzc190eXBlKSB7CiAJY2FzZSBCU1NfVFlQRV9BUF9CU1M6Ci0JCWlmICh3bC0+cDJwKQorCQlpZiAod2x2aWYtPnAycCkKIAkJCXJldHVybiBXTDEyNzFfUk9MRV9QMlBfR087CiAJCWVsc2UKIAkJCXJldHVybiBXTDEyNzFfUk9MRV9BUDsKIAogCWNhc2UgQlNTX1RZUEVfU1RBX0JTUzoKLQkJaWYgKHdsLT5wMnApCisJCWlmICh3bHZpZi0+cDJwKQogCQkJcmV0dXJuIFdMMTI3MV9ST0xFX1AyUF9DTDsKIAkJZWxzZQogCQkJcmV0dXJuIFdMMTI3MV9ST0xFX1NUQTsKQEAgLTE4MzIsNzkgKzE4OTQsOTYgQEAKIAkJcmV0dXJuIFdMMTI3MV9ST0xFX0lCU1M7CiAKIAlkZWZhdWx0OgotCQl3bDEyNzFfZXJyb3IoImludmFsaWQgYnNzX3R5cGU6ICVkIiwgd2wtPmJzc190eXBlKTsKKwkJd2wxMjcxX2Vycm9yKCJpbnZhbGlkIGJzc190eXBlOiAlZCIsIHdsdmlmLT5ic3NfdHlwZSk7CiAJfQogCXJldHVybiBXTDEyWFhfSU5WQUxJRF9ST0xFX1RZUEU7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX29wX2FkZF9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCi0JCQkJICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKK3N0YXRpYyBpbnQgd2wxMnh4X2luaXRfdmlmX2RhdGEoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKLQlzdHJ1Y3Qgd2lwaHkgKndpcGh5ID0gaHctPndpcGh5OwotCWludCByZXRyaWVzID0gV0wxMjcxX0JPT1RfUkVUUklFUzsKLQlpbnQgcmV0ID0gMDsKLQl1OCByb2xlX3R5cGU7Ci0JYm9vbCBib290ZWQgPSBmYWxzZTsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKKwlpbnQgaTsKIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIGFkZCBpbnRlcmZhY2UgdHlwZSAlZCBtYWMgJXBNIiwKLQkJICAgICBpZWVlODAyMTFfdmlmX3R5cGVfcDJwKHZpZiksIHZpZi0+YWRkcik7Ci0KLQltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwotCWlmICh3bC0+dmlmKSB7Ci0JCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwKLQkJCSAgICAgIm11bHRpcGxlIHZpZnMgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0Iik7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQotCi0JLyoKLQkgKiBpbiBzb21lIHZlcnkgY29ybmVyIGNhc2UgSFcgcmVjb3Zlcnkgc2NlbmFyaW9zIGl0cyBwb3NzaWJsZSB0bwotCSAqIGdldCBoZXJlIGJlZm9yZSBfX3dsMTI3MV9vcF9yZW1vdmVfaW50ZXJmYWNlIGlzIGNvbXBsZXRlLCBzbwotCSAqIG9wdCBvdXQgaWYgdGhhdCBpcyB0aGUgY2FzZS4KLQkgKi8KLQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfSUZfSU5JVElBTElaRUQsICZ3bC0+ZmxhZ3MpKSB7Ci0JCXJldCA9IC1FQlVTWTsKLQkJZ290byBvdXQ7Ci0JfQorCS8qIGNsZWFyIGV2ZXJ5dGhpbmcgYnV0IHRoZSBwZXJzaXN0ZW50IGRhdGEgKi8KKwltZW1zZXQod2x2aWYsIDAsIG9mZnNldG9mKHN0cnVjdCB3bDEyeHhfdmlmLCBwZXJzaXN0ZW50KSk7CiAKIAlzd2l0Y2ggKGllZWU4MDIxMV92aWZfdHlwZV9wMnAodmlmKSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0NMSUVOVDoKLQkJd2wtPnAycCA9IDE7CisJCXdsdmlmLT5wMnAgPSAxOwogCQkvKiBmYWxsLXRocm91Z2ggKi8KIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCXdsLT5ic3NfdHlwZSA9IEJTU19UWVBFX1NUQV9CU1M7Ci0JCXdsLT5zZXRfYnNzX3R5cGUgPSBCU1NfVFlQRV9TVEFfQlNTOworCQl3bHZpZi0+YnNzX3R5cGUgPSBCU1NfVFlQRV9TVEFfQlNTOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX0FESE9DOgotCQl3bC0+YnNzX3R5cGUgPSBCU1NfVFlQRV9JQlNTOwotCQl3bC0+c2V0X2Jzc190eXBlID0gQlNTX1RZUEVfU1RBX0JTUzsKKwkJd2x2aWYtPmJzc190eXBlID0gQlNTX1RZUEVfSUJTUzsKIAkJYnJlYWs7CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9QMlBfR086Ci0JCXdsLT5wMnAgPSAxOworCQl3bHZpZi0+cDJwID0gMTsKIAkJLyogZmFsbC10aHJvdWdoICovCiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUDoKLQkJd2wtPmJzc190eXBlID0gQlNTX1RZUEVfQVBfQlNTOworCQl3bHZpZi0+YnNzX3R5cGUgPSBCU1NfVFlQRV9BUF9CU1M7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXJldCA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIG91dDsKKwkJd2x2aWYtPmJzc190eXBlID0gTUFYX0JTU19UWVBFOworCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAJfQogCi0Jcm9sZV90eXBlID0gd2wxMnh4X2dldF9yb2xlX3R5cGUod2wpOwotCWlmIChyb2xlX3R5cGUgPT0gV0wxMlhYX0lOVkFMSURfUk9MRV9UWVBFKSB7Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gb3V0OwotCX0KLQltZW1jcHkod2wtPm1hY19hZGRyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKKwl3bHZpZi0+cm9sZV9pZCA9IFdMMTJYWF9JTlZBTElEX1JPTEVfSUQ7CisJd2x2aWYtPmRldl9yb2xlX2lkID0gV0wxMlhYX0lOVkFMSURfUk9MRV9JRDsKKwl3bHZpZi0+ZGV2X2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOwogCi0JaWYgKHdsLT5zdGF0ZSAhPSBXTDEyNzFfU1RBVEVfT0ZGKSB7Ci0JCXdsMTI3MV9lcnJvcigiY2Fubm90IHN0YXJ0IGJlY2F1c2Ugbm90IGluIG9mZiBzdGF0ZTogJWQiLAotCQkJICAgICB3bC0+c3RhdGUpOwotCQlyZXQgPSAtRUJVU1k7Ci0JCWdvdG8gb3V0OworCWlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUyB8fAorCSAgICB3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUykgeworCQkvKiBpbml0IHN0YS9pYnNzIGRhdGEgKi8KKwkJd2x2aWYtPnN0YS5obGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKKwkJd2wxMnh4X2FsbG9jYXRlX3JhdGVfcG9saWN5KHdsLCAmd2x2aWYtPnN0YS5iYXNpY19yYXRlX2lkeCk7CisJCXdsMTJ4eF9hbGxvY2F0ZV9yYXRlX3BvbGljeSh3bCwgJndsdmlmLT5zdGEuYXBfcmF0ZV9pZHgpOworCQl3bDEyeHhfYWxsb2NhdGVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+c3RhLnAycF9yYXRlX2lkeCk7CisJfSBlbHNlIHsKKwkJLyogaW5pdCBhcCBkYXRhICovCisJCXdsdmlmLT5hcC5iY2FzdF9obGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKKwkJd2x2aWYtPmFwLmdsb2JhbF9obGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKKwkJd2wxMnh4X2FsbG9jYXRlX3JhdGVfcG9saWN5KHdsLCAmd2x2aWYtPmFwLm1nbXRfcmF0ZV9pZHgpOworCQl3bDEyeHhfYWxsb2NhdGVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+YXAuYmNhc3RfcmF0ZV9pZHgpOworCQlmb3IgKGkgPSAwOyBpIDwgQ09ORl9UWF9NQVhfQUNfQ09VTlQ7IGkrKykKKwkJCXdsMTJ4eF9hbGxvY2F0ZV9yYXRlX3BvbGljeSh3bCwKKwkJCQkJCSZ3bHZpZi0+YXAudWNhc3RfcmF0ZV9pZHhbaV0pOwogCX0KIAorCXdsdmlmLT5iaXRyYXRlX21hc2tzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gd2wtPmNvbmYudHguYmFzaWNfcmF0ZTsKKwl3bHZpZi0+Yml0cmF0ZV9tYXNrc1tJRUVFODAyMTFfQkFORF81R0haXSA9IHdsLT5jb25mLnR4LmJhc2ljX3JhdGVfNTsKKwl3bHZpZi0+YmFzaWNfcmF0ZV9zZXQgPSBDT05GX1RYX1JBVEVfTUFTS19CQVNJQzsKKwl3bHZpZi0+YmFzaWNfcmF0ZSA9IENPTkZfVFhfUkFURV9NQVNLX0JBU0lDOworCXdsdmlmLT5yYXRlX3NldCA9IENPTkZfVFhfUkFURV9NQVNLX0JBU0lDOworCXdsdmlmLT5iZWFjb25faW50ID0gV0wxMjcxX0RFRkFVTFRfQkVBQ09OX0lOVDsKKworCS8qCisJICogbWFjODAyMTEgY29uZmlndXJlcyBzb21lIHZhbHVlcyBnbG9iYWxseSwgd2hpbGUgd2UgdHJlYXQgdGhlbQorCSAqIHBlci1pbnRlcmZhY2UuIHRodXMsIG9uIGluaXQsIHdlIGhhdmUgdG8gY29weSB0aGVtIGZyb20gd2wKKwkgKi8KKwl3bHZpZi0+YmFuZCA9IHdsLT5iYW5kOworCXdsdmlmLT5jaGFubmVsID0gd2wtPmNoYW5uZWw7CisJd2x2aWYtPnBvd2VyX2xldmVsID0gd2wtPnBvd2VyX2xldmVsOworCisJSU5JVF9XT1JLKCZ3bHZpZi0+cnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrLAorCQkgIHdsMTI3MV9yeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmspOworCUlOSVRfV09SSygmd2x2aWYtPnJ4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmssCisJCSAgd2wxMjcxX3J4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmspOworCUlOSVRfREVMQVlFRF9XT1JLKCZ3bHZpZi0+cHNwb2xsX3dvcmssIHdsMTI3MV9wc3BvbGxfd29yayk7CisJSU5JVF9MSVNUX0hFQUQoJndsdmlmLT5saXN0KTsKKworCXNldHVwX3RpbWVyKCZ3bHZpZi0+cnhfc3RyZWFtaW5nX3RpbWVyLCB3bDEyNzFfcnhfc3RyZWFtaW5nX3RpbWVyLAorCQkgICAgKHVuc2lnbmVkIGxvbmcpIHdsdmlmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgd2wxMnh4X2luaXRfZncoc3RydWN0IHdsMTI3MSAqd2wpCit7CisJaW50IHJldHJpZXMgPSBXTDEyNzFfQk9PVF9SRVRSSUVTOworCWJvb2wgYm9vdGVkID0gZmFsc2U7CisJc3RydWN0IHdpcGh5ICp3aXBoeSA9IHdsLT5ody0+d2lwaHk7CisJaW50IHJldDsKKwogCXdoaWxlIChyZXRyaWVzKSB7CiAJCXJldHJpZXMtLTsKIAkJcmV0ID0gd2wxMjcxX2NoaXBfd2FrZXVwKHdsKTsKQEAgLTE5MTUsMjUgKzE5OTQsNiBAQAogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gcG93ZXJfb2ZmOwogCi0JCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUyB8fAotCQkgICAgd2wtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpIHsKLQkJCS8qCi0JCQkgKiBUaGUgZGV2aWNlIHJvbGUgaXMgYSBzcGVjaWFsIHJvbGUgdXNlZCBmb3IKLQkJCSAqIHJ4IGFuZCB0eCBmcmFtZXMgcHJpb3IgdG8gYXNzb2NpYXRpb24gKGFzCi0JCQkgKiB0aGUgU1RBIHJvbGUgY2FuIGdldCBwYWNrZXRzIG9ubHkgZnJvbQotCQkJICogaXRzIGFzc29jaWF0ZWQgYnNzaWQpCi0JCQkgKi8KLQkJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9lbmFibGUod2wsCi0JCQkJCQkJIFdMMTI3MV9ST0xFX0RFVklDRSwKLQkJCQkJCQkgJndsLT5kZXZfcm9sZV9pZCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIGlycV9kaXNhYmxlOwotCQl9Ci0KLQkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX2VuYWJsZSh3bCwgcm9sZV90eXBlLCAmd2wtPnJvbGVfaWQpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gaXJxX2Rpc2FibGU7Ci0KIAkJcmV0ID0gd2wxMjcxX2h3X2luaXQod2wpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gaXJxX2Rpc2FibGU7CkBAIC0xOTY0LDkgKzIwMjQsNiBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQl3bC0+dmlmID0gdmlmOwotCXdsLT5zdGF0ZSA9IFdMMTI3MV9TVEFURV9PTjsKLQlzZXRfYml0KFdMMTI3MV9GTEFHX0lGX0lOSVRJQUxJWkVELCAmd2wtPmZsYWdzKTsKIAl3bDEyNzFfaW5mbygiZmlybXdhcmUgYm9vdGVkICglcykiLCB3bC0+Y2hpcC5md192ZXJfc3RyKTsKIAogCS8qIHVwZGF0ZSBody9mdyB2ZXJzaW9uIGluZm8gaW4gd2lwaHkgc3RydWN0ICovCkBAIC0xOTg0LDcgKzIwNDEsMTE1IEBACiAJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAiMTFhIGlzICVzc3VwcG9ydGVkIiwKIAkJICAgICB3bC0+ZW5hYmxlXzExYSA/ICIiIDogIm5vdCAiKTsKIAorCXdsLT5zdGF0ZSA9IFdMMTI3MV9TVEFURV9PTjsKIG91dDoKKwlyZXR1cm4gYm9vdGVkOworfQorCitzdGF0aWMgYm9vbCB3bDEyeHhfZGV2X3JvbGVfc3RhcnRlZChzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCit7CisJcmV0dXJuIHdsdmlmLT5kZXZfaGxpZCAhPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOworfQorCitzdGF0aWMgaW50IHdsMTI3MV9vcF9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKKwlpbnQgcmV0ID0gMDsKKwl1OCByb2xlX3R5cGU7CisJYm9vbCBib290ZWQgPSBmYWxzZTsKKworCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIGFkZCBpbnRlcmZhY2UgdHlwZSAlZCBtYWMgJXBNIiwKKwkJICAgICBpZWVlODAyMTFfdmlmX3R5cGVfcDJwKHZpZiksIHZpZi0+YWRkcik7CisKKwltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKHdsLT52aWYpIHsKKwkJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLAorCQkJICAgICAibXVsdGlwbGUgdmlmcyBhcmUgbm90IHN1cHBvcnRlZCB5ZXQiKTsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIGluIHNvbWUgdmVyeSBjb3JuZXIgY2FzZSBIVyByZWNvdmVyeSBzY2VuYXJpb3MgaXRzIHBvc3NpYmxlIHRvCisJICogZ2V0IGhlcmUgYmVmb3JlIF9fd2wxMjcxX29wX3JlbW92ZV9pbnRlcmZhY2UgaXMgY29tcGxldGUsIHNvCisJICogb3B0IG91dCBpZiB0aGF0IGlzIHRoZSBjYXNlLgorCSAqLworCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19SRUNPVkVSWV9JTl9QUk9HUkVTUywgJndsLT5mbGFncykgfHwKKwkgICAgdGVzdF9iaXQoV0xWSUZfRkxBR19JTklUSUFMSVpFRCwgJndsdmlmLT5mbGFncykpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSB3bDEyeHhfaW5pdF92aWZfZGF0YSh3bCwgdmlmKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwl3bHZpZi0+d2wgPSB3bDsKKwlyb2xlX3R5cGUgPSB3bDEyeHhfZ2V0X3JvbGVfdHlwZSh3bCwgd2x2aWYpOworCWlmIChyb2xlX3R5cGUgPT0gV0wxMlhYX0lOVkFMSURfUk9MRV9UWVBFKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogVE9ETzogYWZ0ZXIgdGhlIG52cyBpc3N1ZSB3aWxsIGJlIHNvbHZlZCwgbW92ZSB0aGlzIGJsb2NrCisJICogdG8gc3RhcnQoKSwgYW5kIG1ha2Ugc3VyZSBoZXJlIHRoZSBkcml2ZXIgaXMgT04uCisJICovCisJaWYgKHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGKSB7CisJCS8qCisJCSAqIHdlIHN0aWxsIG5lZWQgdGhpcyBpbiBvcmRlciB0byBjb25maWd1cmUgdGhlIGZ3CisJCSAqIHdoaWxlIHVwbG9hZGluZyB0aGUgbnZzCisJCSAqLworCQltZW1jcHkod2wtPm1hY19hZGRyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKKworCQlib290ZWQgPSB3bDEyeHhfaW5pdF9mdyh3bCk7CisJCWlmICghYm9vdGVkKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisKKwlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MgfHwKKwkgICAgd2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpIHsKKwkJLyoKKwkJICogVGhlIGRldmljZSByb2xlIGlzIGEgc3BlY2lhbCByb2xlIHVzZWQgZm9yCisJCSAqIHJ4IGFuZCB0eCBmcmFtZXMgcHJpb3IgdG8gYXNzb2NpYXRpb24gKGFzCisJCSAqIHRoZSBTVEEgcm9sZSBjYW4gZ2V0IHBhY2tldHMgb25seSBmcm9tCisJCSAqIGl0cyBhc3NvY2lhdGVkIGJzc2lkKQorCQkgKi8KKwkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX2VuYWJsZSh3bCwgdmlmLT5hZGRyLAorCQkJCQkJIFdMMTI3MV9ST0xFX0RFVklDRSwKKwkJCQkJCSAmd2x2aWYtPmRldl9yb2xlX2lkKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSB3bDEyeHhfY21kX3JvbGVfZW5hYmxlKHdsLCB2aWYtPmFkZHIsCisJCQkJICAgICByb2xlX3R5cGUsICZ3bHZpZi0+cm9sZV9pZCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gd2wxMjcxX2luaXRfdmlmX3NwZWNpZmljKHdsLCB2aWYpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCXdsLT52aWYgPSB2aWY7CisJbGlzdF9hZGQoJndsdmlmLT5saXN0LCAmd2wtPndsdmlmX2xpc3QpOworCXNldF9iaXQoV0xWSUZfRkxBR19JTklUSUFMSVpFRCwgJndsdmlmLT5mbGFncyk7CisKKwlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykKKwkJd2wtPmFwX2NvdW50Kys7CisJZWxzZQorCQl3bC0+c3RhX2NvdW50Kys7CitvdXQ6CisJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CitvdXRfdW5sb2NrOgogCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIAogCW11dGV4X2xvY2soJndsX2xpc3RfbXV0ZXgpOwpAQCAtMTk5NiwyOSArMjE2MSwzNCBAQAogfQogCiBzdGF0aWMgdm9pZCBfX3dsMTI3MV9vcF9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKIAkJCQkJIGJvb2wgcmVzZXRfdHhfcXVldWVzKQogewotCWludCByZXQsIGk7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJaW50IGksIHJldDsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIHJlbW92ZSBpbnRlcmZhY2UiKTsKIAorCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KFdMVklGX0ZMQUdfSU5JVElBTElaRUQsICZ3bHZpZi0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwl3bC0+dmlmID0gTlVMTDsKKwogCS8qIGJlY2F1c2Ugb2YgaGFyZHdhcmUgcmVjb3ZlcnksIHdlIG1heSBnZXQgaGVyZSB0d2ljZSAqLwogCWlmICh3bC0+c3RhdGUgIT0gV0wxMjcxX1NUQVRFX09OKQogCQlyZXR1cm47CiAKIAl3bDEyNzFfaW5mbygiZG93biIpOwogCi0JbXV0ZXhfbG9jaygmd2xfbGlzdF9tdXRleCk7Ci0JbGlzdF9kZWwoJndsLT5saXN0KTsKLQltdXRleF91bmxvY2soJndsX2xpc3RfbXV0ZXgpOwotCiAJLyogZW5hYmxlIGR5biBwcyBqdXN0IGluIGNhc2UgKGlmIGxlZnQgb24gZHVlIHRvIGZ3IGNyYXNoIGV0YykgKi8KLQlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MpCi0JCWllZWU4MDIxMV9lbmFibGVfZHluX3BzKHdsLT52aWYpOworCWlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUykKKwkJaWVlZTgwMjExX2VuYWJsZV9keW5fcHModmlmKTsKIAotCWlmICh3bC0+c2Nhbi5zdGF0ZSAhPSBXTDEyNzFfU0NBTl9TVEFURV9JRExFKSB7CisJaWYgKHdsLT5zY2FuLnN0YXRlICE9IFdMMTI3MV9TQ0FOX1NUQVRFX0lETEUgJiYKKwkgICAgd2wtPnNjYW5fdmlmID09IHZpZikgewogCQl3bC0+c2Nhbi5zdGF0ZSA9IFdMMTI3MV9TQ0FOX1NUQVRFX0lETEU7CiAJCW1lbXNldCh3bC0+c2Nhbi5zY2FubmVkX2NoLCAwLCBzaXplb2Yod2wtPnNjYW4uc2Nhbm5lZF9jaCkpOworCQl3bC0+c2Nhbl92aWYgPSBOVUxMOwogCQl3bC0+c2Nhbi5yZXEgPSBOVUxMOwogCQlpZWVlODAyMTFfc2Nhbl9jb21wbGV0ZWQod2wtPmh3LCB0cnVlKTsKIAl9CkBAIC0yMDI5LDEzICsyMTk5LDE3IEBACiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBkZWluaXQ7CiAKLQkJaWYgKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKSB7Ci0JCQlyZXQgPSB3bDEyeHhfY21kX3JvbGVfZGlzYWJsZSh3bCwgJndsLT5kZXZfcm9sZV9pZCk7CisJCWlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUyB8fAorCQkgICAgd2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpIHsKKwkJCWlmICh3bDEyeHhfZGV2X3JvbGVfc3RhcnRlZCh3bHZpZikpCisJCQkJd2wxMnh4X3N0b3BfZGV2KHdsLCB3bHZpZik7CisKKwkJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9kaXNhYmxlKHdsLCAmd2x2aWYtPmRldl9yb2xlX2lkKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gZGVpbml0OwogCQl9CiAKLQkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX2Rpc2FibGUod2wsICZ3bC0+cm9sZV9pZCk7CisJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9kaXNhYmxlKHdsLCAmd2x2aWYtPnJvbGVfaWQpOwogCQlpZiAocmV0IDwgMCkKIAkJCWdvdG8gZGVpbml0OwogCkBAIC0yMDQzLDEyMCArMjIxNyw5MyBAQAogCX0KIGRlaW5pdDoKIAkvKiBjbGVhciBhbGwgaGxpZHMgKGV4Y2VwdCBzeXN0ZW1faGxpZCkgKi8KLQl3bC0+c3RhX2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOwotCXdsLT5kZXZfaGxpZCA9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQ7Ci0Jd2wtPmFwX2JjYXN0X2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOwotCXdsLT5hcF9nbG9iYWxfaGxpZCA9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQ7CisJd2x2aWYtPmRldl9obGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKIAotCS8qCi0JICogdGhpcyBtdXN0IGJlIGJlZm9yZSB0aGUgY2FuY2VsX3dvcmsgY2FsbHMgYmVsb3csIHNvIHRoYXQgdGhlIHdvcmsKLQkgKiBmdW5jdGlvbnMgZG9uJ3QgcGVyZm9ybSBmdXJ0aGVyIHdvcmsuCi0JICovCi0Jd2wtPnN0YXRlID0gV0wxMjcxX1NUQVRFX09GRjsKLQotCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKLQotCXdsMTI3MV9kaXNhYmxlX2ludGVycnVwdHMod2wpOwotCXdsMTI3MV9mbHVzaF9kZWZlcnJlZF93b3JrKHdsKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndsLT5zY2FuX2NvbXBsZXRlX3dvcmspOwotCWNhbmNlbF93b3JrX3N5bmMoJndsLT5uZXRzdGFja193b3JrKTsKLQljYW5jZWxfd29ya19zeW5jKCZ3bC0+dHhfd29yayk7Ci0JZGVsX3RpbWVyX3N5bmMoJndsLT5yeF9zdHJlYW1pbmdfdGltZXIpOwotCWNhbmNlbF93b3JrX3N5bmMoJndsLT5yeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmspOwotCWNhbmNlbF93b3JrX3N5bmMoJndsLT5yeF9zdHJlYW1pbmdfZGlzYWJsZV93b3JrKTsKLQljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJndsLT5wc3BvbGxfd29yayk7Ci0JY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZ3bC0+ZWxwX3dvcmspOwotCi0JbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKLQotCS8qIGxldCdzIG5vdGlmeSBNQUM4MDIxMSBhYm91dCB0aGUgcmVtYWluaW5nIHBlbmRpbmcgVFggZnJhbWVzICovCi0Jd2wxMjcxX3R4X3Jlc2V0KHdsLCByZXNldF90eF9xdWV1ZXMpOwotCXdsMTI3MV9wb3dlcl9vZmYod2wpOwotCi0JbWVtc2V0KHdsLT5ic3NpZCwgMCwgRVRIX0FMRU4pOwotCW1lbXNldCh3bC0+c3NpZCwgMCwgSUVFRTgwMjExX01BWF9TU0lEX0xFTiArIDEpOwotCXdsLT5zc2lkX2xlbiA9IDA7Ci0Jd2wtPmJzc190eXBlID0gTUFYX0JTU19UWVBFOwotCXdsLT5zZXRfYnNzX3R5cGUgPSBNQVhfQlNTX1RZUEU7Ci0Jd2wtPnAycCA9IDA7Ci0Jd2wtPmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwotCi0Jd2wtPnJ4X2NvdW50ZXIgPSAwOwotCXdsLT5wc21fZW50cnlfcmV0cnkgPSAwOwotCXdsLT5wb3dlcl9sZXZlbCA9IFdMMTI3MV9ERUZBVUxUX1BPV0VSX0xFVkVMOwotCXdsLT50eF9ibG9ja3NfYXZhaWxhYmxlID0gMDsKLQl3bC0+dHhfYWxsb2NhdGVkX2Jsb2NrcyA9IDA7Ci0Jd2wtPnR4X3Jlc3VsdHNfY291bnQgPSAwOwotCXdsLT50eF9wYWNrZXRzX2NvdW50ID0gMDsKLQl3bC0+dGltZV9vZmZzZXQgPSAwOwotCXdsLT5zZXNzaW9uX2NvdW50ZXIgPSAwOwotCXdsLT5yYXRlX3NldCA9IENPTkZfVFhfUkFURV9NQVNLX0JBU0lDOwotCXdsLT5iaXRyYXRlX21hc2tzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gd2wtPmNvbmYudHguYmFzaWNfcmF0ZTsKLQl3bC0+Yml0cmF0ZV9tYXNrc1tJRUVFODAyMTFfQkFORF81R0haXSA9IHdsLT5jb25mLnR4LmJhc2ljX3JhdGVfNTsKLQl3bC0+dmlmID0gTlVMTDsKLQl3bC0+dHhfc3BhcmVfYmxvY2tzID0gVFhfSFdfQkxPQ0tfU1BBUkVfREVGQVVMVDsKLQl3bDEyNzFfZnJlZV9hcF9rZXlzKHdsKTsKLQltZW1zZXQod2wtPmFwX2hsaWRfbWFwLCAwLCBzaXplb2Yod2wtPmFwX2hsaWRfbWFwKSk7Ci0Jd2wtPmFwX2Z3X3BzX21hcCA9IDA7Ci0Jd2wtPmFwX3BzX21hcCA9IDA7Ci0Jd2wtPnNjaGVkX3NjYW5uaW5nID0gZmFsc2U7Ci0Jd2wtPnJvbGVfaWQgPSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEOwotCXdsLT5kZXZfcm9sZV9pZCA9IFdMMTJYWF9JTlZBTElEX1JPTEVfSUQ7Ci0JbWVtc2V0KHdsLT5yb2xlc19tYXAsIDAsIHNpemVvZih3bC0+cm9sZXNfbWFwKSk7Ci0JbWVtc2V0KHdsLT5saW5rc19tYXAsIDAsIHNpemVvZih3bC0+bGlua3NfbWFwKSk7Ci0JbWVtc2V0KHdsLT5yb2NfbWFwLCAwLCBzaXplb2Yod2wtPnJvY19tYXApKTsKLQl3bC0+YWN0aXZlX3N0YV9jb3VudCA9IDA7Ci0KLQkvKiBUaGUgc3lzdGVtIGxpbmsgaXMgYWx3YXlzIGFsbG9jYXRlZCAqLwotCV9fc2V0X2JpdChXTDEyWFhfU1lTVEVNX0hMSUQsIHdsLT5saW5rc19tYXApOwotCi0JLyoKLQkgKiB0aGlzIGlzIHBlcmZvcm1lZCBhZnRlciB0aGUgY2FuY2VsX3dvcmsgY2FsbHMgYW5kIHRoZSBhc3NvY2lhdGVkCi0JICogbXV0ZXhfbG9jaywgc28gdGhhdCB3bDEyNzFfb3BfYWRkX2ludGVyZmFjZSBkb2VzIG5vdCBhY2NpZGVudGFsbHkKLQkgKiBnZXQgZXhlY3V0ZWQgYmVmb3JlIGFsbCB0aGVzZSB2YXJzIGhhdmUgYmVlbiByZXNldC4KLQkgKi8KLQl3bC0+ZmxhZ3MgPSAwOwotCi0Jd2wtPnR4X2Jsb2Nrc19mcmVlZCA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKSB7Ci0JCXdsLT50eF9wa3RzX2ZyZWVkW2ldID0gMDsKLQkJd2wtPnR4X2FsbG9jYXRlZF9wa3RzW2ldID0gMDsKKwlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MgfHwKKwkgICAgd2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpIHsKKwkJd2x2aWYtPnN0YS5obGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKKwkJd2wxMnh4X2ZyZWVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+c3RhLmJhc2ljX3JhdGVfaWR4KTsKKwkJd2wxMnh4X2ZyZWVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+c3RhLmFwX3JhdGVfaWR4KTsKKwkJd2wxMnh4X2ZyZWVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+c3RhLnAycF9yYXRlX2lkeCk7CisJfSBlbHNlIHsKKwkJd2x2aWYtPmFwLmJjYXN0X2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOworCQl3bHZpZi0+YXAuZ2xvYmFsX2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOworCQl3bDEyeHhfZnJlZV9yYXRlX3BvbGljeSh3bCwgJndsdmlmLT5hcC5tZ210X3JhdGVfaWR4KTsKKwkJd2wxMnh4X2ZyZWVfcmF0ZV9wb2xpY3kod2wsICZ3bHZpZi0+YXAuYmNhc3RfcmF0ZV9pZHgpOworCQlmb3IgKGkgPSAwOyBpIDwgQ09ORl9UWF9NQVhfQUNfQ09VTlQ7IGkrKykKKwkJCXdsMTJ4eF9mcmVlX3JhdGVfcG9saWN5KHdsLAorCQkJCQkJJndsdmlmLT5hcC51Y2FzdF9yYXRlX2lkeFtpXSk7CiAJfQogCi0Jd2wxMjcxX2RlYnVnZnNfcmVzZXQod2wpOworCXdsMTJ4eF90eF9yZXNldF93bHZpZih3bCwgd2x2aWYpOworCXdsMTI3MV9mcmVlX2FwX2tleXMod2wsIHdsdmlmKTsKKwlpZiAod2wtPmxhc3Rfd2x2aWYgPT0gd2x2aWYpCisJCXdsLT5sYXN0X3dsdmlmID0gTlVMTDsKKwlsaXN0X2RlbCgmd2x2aWYtPmxpc3QpOworCW1lbXNldCh3bHZpZi0+YXAuc3RhX2hsaWRfbWFwLCAwLCBzaXplb2Yod2x2aWYtPmFwLnN0YV9obGlkX21hcCkpOworCXdsdmlmLT5yb2xlX2lkID0gV0wxMlhYX0lOVkFMSURfUk9MRV9JRDsKKwl3bHZpZi0+ZGV2X3JvbGVfaWQgPSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEOwogCi0Ja2ZyZWUod2wtPmZ3X3N0YXR1cyk7Ci0Jd2wtPmZ3X3N0YXR1cyA9IE5VTEw7Ci0Ja2ZyZWUod2wtPnR4X3Jlc19pZik7Ci0Jd2wtPnR4X3Jlc19pZiA9IE5VTEw7Ci0Ja2ZyZWUod2wtPnRhcmdldF9tZW1fbWFwKTsKLQl3bC0+dGFyZ2V0X21lbV9tYXAgPSBOVUxMOworCWlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKQorCQl3bC0+YXBfY291bnQtLTsKKwllbHNlCisJCXdsLT5zdGFfY291bnQtLTsKKworCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKwlkZWxfdGltZXJfc3luYygmd2x2aWYtPnJ4X3N0cmVhbWluZ190aW1lcik7CisJY2FuY2VsX3dvcmtfc3luYygmd2x2aWYtPnJ4X3N0cmVhbWluZ19lbmFibGVfd29yayk7CisJY2FuY2VsX3dvcmtfc3luYygmd2x2aWYtPnJ4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmspOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmd2x2aWYtPnBzcG9sbF93b3JrKTsKKworCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIHdsMTI3MV9vcF9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAogCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJc3RydWN0IHdsMTJ4eF92aWYgKml0ZXI7CiAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOworCisJaWYgKHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGIHx8CisJICAgICF0ZXN0X2JpdChXTFZJRl9GTEFHX0lOSVRJQUxJWkVELCAmd2x2aWYtPmZsYWdzKSkKKwkJZ290byBvdXQ7CisKIAkvKgogCSAqIHdsLT52aWYgY2FuIGJlIG51bGwgaGVyZSBpZiBzb21lb25lIHNodXRzIGRvd24gdGhlIGludGVyZmFjZQogCSAqIGp1c3Qgd2hlbiBoYXJkd2FyZSByZWNvdmVyeSBoYXMgYmVlbiBzdGFydGVkLgogCSAqLwotCWlmICh3bC0+dmlmKSB7Ci0JCVdBUk5fT04od2wtPnZpZiAhPSB2aWYpOwotCQlfX3dsMTI3MV9vcF9yZW1vdmVfaW50ZXJmYWNlKHdsLCB0cnVlKTsKLQl9CisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCBpdGVyKSB7CisJCWlmIChpdGVyICE9IHdsdmlmKQorCQkJY29udGludWU7CiAKKwkJX193bDEyNzFfb3BfcmVtb3ZlX2ludGVyZmFjZSh3bCwgdmlmLCB0cnVlKTsKKwkJYnJlYWs7CisJfQorCVdBUk5fT04oaXRlciAhPSB3bHZpZik7CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogCWNhbmNlbF93b3JrX3N5bmMoJndsLT5yZWNvdmVyeV93b3JrKTsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfam9pbihzdHJ1Y3Qgd2wxMjcxICp3bCwgYm9vbCBzZXRfYXNzb2MpCitzdGF0aWMgaW50IHdsMTJ4eF9vcF9jaGFuZ2VfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkJICAgICAgZW51bSBubDgwMjExX2lmdHlwZSBuZXdfdHlwZSwgYm9vbCBwMnApCit7CisJd2wxMjcxX29wX3JlbW92ZV9pbnRlcmZhY2UoaHcsIHZpZik7CisKKwl2aWYtPnR5cGUgPSBpZWVlODAyMTFfaWZ0eXBlX3AycChuZXdfdHlwZSwgcDJwKTsKKwl2aWYtPnAycCA9IHAycDsKKwlyZXR1cm4gd2wxMjcxX29wX2FkZF9pbnRlcmZhY2UoaHcsIHZpZik7Cit9CisKK3N0YXRpYyBpbnQgd2wxMjcxX2pvaW4oc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgYm9vbCBzZXRfYXNzb2MpCiB7CiAJaW50IHJldDsKLQlib29sIGlzX2lic3MgPSAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpOworCWJvb2wgaXNfaWJzcyA9ICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfSUJTUyk7CiAKIAkvKgogCSAqIE9uZSBvZiB0aGUgc2lkZSBlZmZlY3RzIG9mIHRoZSBKT0lOIGNvbW1hbmQgaXMgdGhhdCBpcyBjbGVhcnMKQEAgLTIxNjcsMjAgKzIzMTQsMjAgQEAKIAkgKiBLZWVwIHRoZSBiZWxvdyBtZXNzYWdlIGZvciBub3csIHVubGVzcyBpdCBzdGFydHMgYm90aGVyaW5nCiAJICogdXNlcnMgd2hvIHJlYWxseSBsaWtlIHRvIHJvYW0gYSBsb3QgOikKIAkgKi8KLQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpKQorCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKSkKIAkJd2wxMjcxX2luZm8oIkpPSU4gd2hpbGUgYXNzb2NpYXRlZC4iKTsKIAogCWlmIChzZXRfYXNzb2MpCi0JCXNldF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpOworCQlzZXRfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpOwogCiAJaWYgKGlzX2lic3MpCi0JCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9pYnNzKHdsKTsKKwkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2lic3Mod2wsIHdsdmlmKTsKIAllbHNlCi0JCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9zdGEod2wpOworCQlyZXQgPSB3bDEyeHhfY21kX3JvbGVfc3RhcnRfc3RhKHdsLCB3bHZpZik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykpCisJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKSkKIAkJZ290byBvdXQ7CiAKIAkvKgpAQCAtMjE4OSwxOSArMjMzNiwyMCBAQAogCSAqIHRoZSBqb2luLiBUaGUgYWN4X2FpZCBzdGFydHMgdGhlIGtlZXAtYWxpdmUgcHJvY2VzcywgYW5kIHRoZSBvcmRlcgogCSAqIG9mIHRoZSBjb21tYW5kcyBiZWxvdyBpcyByZWxldmFudC4KIAkgKi8KLQlyZXQgPSB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfbW9kZSh3bCwgdHJ1ZSk7CisJcmV0ID0gd2wxMjcxX2FjeF9rZWVwX2FsaXZlX21vZGUod2wsIHdsdmlmLCB0cnVlKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSB3bDEyNzFfYWN4X2FpZCh3bCwgd2wtPmFpZCk7CisJcmV0ID0gd2wxMjcxX2FjeF9haWQod2wsIHdsdmlmLCB3bHZpZi0+YWlkKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX2tsdl9udWxsX2RhdGEod2wpOworCXJldCA9IHdsMTJ4eF9jbWRfYnVpbGRfa2x2X251bGxfZGF0YSh3bCwgd2x2aWYpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXJldCA9IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9jb25maWcod2wsIENNRF9URU1QTF9LTFZfSURYX05VTExfREFUQSwKKwlyZXQgPSB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfY29uZmlnKHdsLCB3bHZpZiwKKwkJCQkJICAgQ01EX1RFTVBMX0tMVl9JRFhfTlVMTF9EQVRBLAogCQkJCQkgICBBQ1hfS0VFUF9BTElWRV9UUExfVkFMSUQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKQEAgLTIyMTAsNzIgKzIzNTgsNjMgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV91bmpvaW4oc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTI3MV91bmpvaW4oc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKIHsKIAlpbnQgcmV0OwogCi0JaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChXTDEyNzFfRkxBR19DU19QUk9HUkVTUywgJndsLT5mbGFncykpIHsKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdMVklGX0ZMQUdfQ1NfUFJPR1JFU1MsICZ3bHZpZi0+ZmxhZ3MpKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKKwogCQl3bDEyeHhfY21kX3N0b3BfY2hhbm5lbF9zd2l0Y2god2wpOwotCQlpZWVlODAyMTFfY2hzd2l0Y2hfZG9uZSh3bC0+dmlmLCBmYWxzZSk7CisJCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKHZpZiwgZmFsc2UpOwogCX0KIAogCS8qIHRvIHN0b3AgbGlzdGVuaW5nIHRvIGEgY2hhbm5lbCwgd2UgZGlzY29ubmVjdCAqLwotCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdG9wX3N0YSh3bCk7CisJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0b3Bfc3RhKHdsLCB3bHZpZik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JbWVtc2V0KHdsLT5ic3NpZCwgMCwgRVRIX0FMRU4pOwotCiAJLyogcmVzZXQgVFggc2VjdXJpdHkgY291bnRlcnMgb24gYSBjbGVhbiBkaXNjb25uZWN0ICovCi0Jd2wtPnR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYiA9IDA7Ci0Jd2wtPnR4X3NlY3VyaXR5X3NlcSA9IDA7CisJd2x2aWYtPnR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYiA9IDA7CisJd2x2aWYtPnR4X3NlY3VyaXR5X3NlcSA9IDA7CiAKIG91dDoKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCB3bDEyNzFfc2V0X2JhbmRfcmF0ZShzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyB2b2lkIHdsMTI3MV9zZXRfYmFuZF9yYXRlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7Ci0Jd2wtPmJhc2ljX3JhdGVfc2V0ID0gd2wtPmJpdHJhdGVfbWFza3Nbd2wtPmJhbmRdOwotCXdsLT5yYXRlX3NldCA9IHdsLT5iYXNpY19yYXRlX3NldDsKKwl3bHZpZi0+YmFzaWNfcmF0ZV9zZXQgPSB3bHZpZi0+Yml0cmF0ZV9tYXNrc1t3bHZpZi0+YmFuZF07CisJd2x2aWYtPnJhdGVfc2V0ID0gd2x2aWYtPmJhc2ljX3JhdGVfc2V0OwogfQogCi1zdGF0aWMgYm9vbCB3bDEyeHhfaXNfcm9jKHN0cnVjdCB3bDEyNzEgKndsKQotewotCXU4IHJvbGVfaWQ7Ci0KLQlyb2xlX2lkID0gZmluZF9maXJzdF9iaXQod2wtPnJvY19tYXAsIFdMMTJYWF9NQVhfUk9MRVMpOwotCWlmIChyb2xlX2lkID49IFdMMTJYWF9NQVhfUk9MRVMpCi0JCXJldHVybiBmYWxzZTsKLQotCXJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgaW50IHdsMTI3MV9zdGFfaGFuZGxlX2lkbGUoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgaWRsZSkKK3N0YXRpYyBpbnQgd2wxMjcxX3N0YV9oYW5kbGVfaWRsZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCSAgYm9vbCBpZGxlKQogewogCWludCByZXQ7CisJYm9vbCBjdXJfaWRsZSA9ICF0ZXN0X2JpdChXTFZJRl9GTEFHX0lOX1VTRSwgJndsdmlmLT5mbGFncyk7CisKKwlpZiAoaWRsZSA9PSBjdXJfaWRsZSkKKwkJcmV0dXJuIDA7CiAKIAlpZiAoaWRsZSkgewogCQkvKiBubyBuZWVkIHRvIGNyb2MgaWYgd2Ugd2VyZW4ndCBidXN5IChlLmcuIGR1cmluZyBib290KSAqLwotCQlpZiAod2wxMnh4X2lzX3JvYyh3bCkpIHsKLQkJCXJldCA9IHdsMTJ4eF9jcm9jKHdsLCB3bC0+ZGV2X3JvbGVfaWQpOwotCQkJaWYgKHJldCA8IDApCi0JCQkJZ290byBvdXQ7Ci0KLQkJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdG9wX2Rldih3bCk7CisJCWlmICh3bDEyeHhfZGV2X3JvbGVfc3RhcnRlZCh3bHZpZikpIHsKKwkJCXJldCA9IHdsMTJ4eF9zdG9wX2Rldih3bCwgd2x2aWYpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CiAJCX0KLQkJd2wtPnJhdGVfc2V0ID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2wtPmJhc2ljX3JhdGVfc2V0KTsKLQkJcmV0ID0gd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyh3bCk7CisJCXdsdmlmLT5yYXRlX3NldCA9CisJCQl3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOworCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsLCB3bHZpZik7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJCXJldCA9IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9jb25maWcoCi0JCQl3bCwgQ01EX1RFTVBMX0tMVl9JRFhfTlVMTF9EQVRBLAorCQkJd2wsIHdsdmlmLCBDTURfVEVNUExfS0xWX0lEWF9OVUxMX0RBVEEsCiAJCQlBQ1hfS0VFUF9BTElWRV9UUExfSU5WQUxJRCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7Ci0JCXNldF9iaXQoV0wxMjcxX0ZMQUdfSURMRSwgJndsLT5mbGFncyk7CisJCWNsZWFyX2JpdChXTFZJRl9GTEFHX0lOX1VTRSwgJndsdmlmLT5mbGFncyk7CiAJfSBlbHNlIHsKIAkJLyogVGhlIGN1cnJlbnQgZmlybXdhcmUgb25seSBzdXBwb3J0cyBzY2hlZF9zY2FuIGluIGlkbGUgKi8KIAkJaWYgKHdsLT5zY2hlZF9zY2FubmluZykgewpAQCAtMjI4MywyNiArMjQyMiwxMzUgQEAKIAkJCWllZWU4MDIxMV9zY2hlZF9zY2FuX3N0b3BwZWQod2wtPmh3KTsKIAkJfQogCi0JCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9kZXYod2wpOworCQlyZXQgPSB3bDEyeHhfc3RhcnRfZGV2KHdsLCB3bHZpZik7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7Ci0KLQkJcmV0ID0gd2wxMnh4X3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLQkJY2xlYXJfYml0KFdMMTI3MV9GTEFHX0lETEUsICZ3bC0+ZmxhZ3MpOworCQlzZXRfYml0KFdMVklGX0ZMQUdfSU5fVVNFLCAmd2x2aWYtPmZsYWdzKTsKIAl9CiAKIG91dDoKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgaW50IHdsMTJ4eF9jb25maWdfdmlmKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwgdTMyIGNoYW5nZWQpCit7CisJYm9vbCBpc19hcCA9ICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKKwlpbnQgY2hhbm5lbCwgcmV0OworCisJY2hhbm5lbCA9IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChjb25mLT5jaGFubmVsLT5jZW50ZXJfZnJlcSk7CisKKwkvKiBpZiB0aGUgY2hhbm5lbCBjaGFuZ2VzIHdoaWxlIGpvaW5lZCwgam9pbiBhZ2FpbiAqLworCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwgJiYKKwkgICAgKCh3bHZpZi0+YmFuZCAhPSBjb25mLT5jaGFubmVsLT5iYW5kKSB8fAorCSAgICAgKHdsdmlmLT5jaGFubmVsICE9IGNoYW5uZWwpKSkgeworCQkvKiBzZW5kIGFsbCBwZW5kaW5nIHBhY2tldHMgKi8KKwkJd2wxMjcxX3R4X3dvcmtfbG9ja2VkKHdsKTsKKwkJd2x2aWYtPmJhbmQgPSBjb25mLT5jaGFubmVsLT5iYW5kOworCQl3bHZpZi0+Y2hhbm5lbCA9IGNoYW5uZWw7CisKKwkJaWYgKCFpc19hcCkgeworCQkJLyoKKwkJCSAqIEZJWE1FOiB0aGUgbWFjODAyMTEgc2hvdWxkIHJlYWxseSBwcm92aWRlIGEgZml4ZWQKKwkJCSAqIHJhdGUgdG8gdXNlIGhlcmUuIGZvciBub3csIGp1c3QgdXNlIHRoZSBzbWFsbGVzdAorCQkJICogcG9zc2libGUgcmF0ZSBmb3IgdGhlIGJhbmQgYXMgYSBmaXhlZCByYXRlIGZvcgorCQkJICogYXNzb2NpYXRpb24gZnJhbWVzIGFuZCBvdGhlciBjb250cm9sIG1lc3NhZ2VzLgorCQkJICovCisJCQlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpKQorCQkJCXdsMTI3MV9zZXRfYmFuZF9yYXRlKHdsLCB3bHZpZik7CisKKwkJCXdsdmlmLT5iYXNpY19yYXRlID0KKwkJCQl3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLAorCQkJCQkJICAgICAgIHdsdmlmLT5iYXNpY19yYXRlX3NldCk7CisJCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsLCB3bHZpZik7CisJCQlpZiAocmV0IDwgMCkKKwkJCQl3bDEyNzFfd2FybmluZygicmF0ZSBwb2xpY3kgZm9yIGNoYW5uZWwgIgorCQkJCQkgICAgICAgImZhaWxlZCAlZCIsIHJldCk7CisKKwkJCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELAorCQkJCSAgICAgJndsdmlmLT5mbGFncykpIHsKKwkJCQlpZiAod2wxMnh4X2Rldl9yb2xlX3N0YXJ0ZWQod2x2aWYpKSB7CisJCQkJCS8qIHJvYW1pbmcgKi8KKwkJCQkJcmV0ID0gd2wxMnh4X2Nyb2Mod2wsCisJCQkJCQkJICB3bHZpZi0+ZGV2X3JvbGVfaWQpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJCXJldCA9IHdsMTI3MV9qb2luKHdsLCB3bHZpZiwgZmFsc2UpOworCQkJCWlmIChyZXQgPCAwKQorCQkJCQl3bDEyNzFfd2FybmluZygiY21kIGpvaW4gb24gY2hhbm5lbCAiCisJCQkJCQkgICAgICAgImZhaWxlZCAlZCIsIHJldCk7CisJCQl9IGVsc2UgeworCQkJCS8qCisJCQkJICogY2hhbmdlIHRoZSBST0MgY2hhbm5lbC4gZG8gaXQgb25seSBpZiB3ZSBhcmUKKwkJCQkgKiBub3QgaWRsZS4gb3RoZXJ3aXNlLCBDUk9DIHdpbGwgYmUgY2FsbGVkCisJCQkJICogYW55d2F5LgorCQkJCSAqLworCQkJCWlmICh3bDEyeHhfZGV2X3JvbGVfc3RhcnRlZCh3bHZpZikgJiYKKwkJCQkgICAgIShjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUpKSB7CisJCQkJCXJldCA9IHdsMTJ4eF9zdG9wX2Rldih3bCwgd2x2aWYpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiByZXQ7CisKKwkJCQkJcmV0ID0gd2wxMnh4X3N0YXJ0X2Rldih3bCwgd2x2aWYpOworCQkJCQlpZiAocmV0IDwgMCkKKwkJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJLyoKKwkgKiBpZiBtYWM4MDIxMSBjaGFuZ2VzIHRoZSBQU00gbW9kZSwgbWFrZSBzdXJlIHRoZSBtb2RlIGlzIG5vdAorCSAqIGluY29ycmVjdGx5IGNoYW5nZWQgYWZ0ZXIgdGhlIHBzcG9sbCBmYWlsdXJlIGFjdGl2ZSB3aW5kb3cuCisJICovCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfUFMpCisJCWNsZWFyX2JpdChXTFZJRl9GTEFHX1BTUE9MTF9GQUlMVVJFLCAmd2x2aWYtPmZsYWdzKTsKKworCWlmIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTICYmCisJICAgICF0ZXN0X2JpdChXTFZJRl9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bHZpZi0+ZmxhZ3MpKSB7CisJCXNldF9iaXQoV0xWSUZfRkxBR19QU01fUkVRVUVTVEVELCAmd2x2aWYtPmZsYWdzKTsKKworCQkvKgorCQkgKiBXZSBlbnRlciBQU00gb25seSBpZiB3ZSdyZSBhbHJlYWR5IGFzc29jaWF0ZWQuCisJCSAqIElmIHdlJ3JlIG5vdCwgd2UnbGwgZW50ZXIgaXQgd2hlbiBqb2luaW5nIGFuIFNTSUQsCisJCSAqIHRocm91Z2ggdGhlIGJzc19pbmZvX2NoYW5nZWQoKSBob29rLgorCQkgKi8KKwkJaWYgKHRlc3RfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bHZpZi0+ZmxhZ3MpKSB7CisJCQl3bDEyNzFfZGVidWcoREVCVUdfUFNNLCAicHNtIGVuYWJsZWQiKTsKKwkJCXJldCA9IHdsMTI3MV9wc19zZXRfbW9kZSh3bCwgd2x2aWYsCisJCQkJCQkgU1RBVElPTl9QT1dFUl9TQVZFX01PREUsCisJCQkJCQkgd2x2aWYtPmJhc2ljX3JhdGUsIHRydWUpOworCQl9CisJfSBlbHNlIGlmICghKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUFMpICYmCisJCSAgIHRlc3RfYml0KFdMVklGX0ZMQUdfUFNNX1JFUVVFU1RFRCwgJndsdmlmLT5mbGFncykpIHsKKwkJd2wxMjcxX2RlYnVnKERFQlVHX1BTTSwgInBzbSBkaXNhYmxlZCIpOworCisJCWNsZWFyX2JpdChXTFZJRl9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bHZpZi0+ZmxhZ3MpOworCisJCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX1BTTSwgJndsdmlmLT5mbGFncykpCisJCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIHdsdmlmLAorCQkJCQkJIFNUQVRJT05fQUNUSVZFX01PREUsCisJCQkJCQkgd2x2aWYtPmJhc2ljX3JhdGUsIHRydWUpOworCX0KKworCWlmIChjb25mLT5wb3dlcl9sZXZlbCAhPSB3bHZpZi0+cG93ZXJfbGV2ZWwpIHsKKwkJcmV0ID0gd2wxMjcxX2FjeF90eF9wb3dlcih3bCwgd2x2aWYsIGNvbmYtPnBvd2VyX2xldmVsKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCXdsdmlmLT5wb3dlcl9sZXZlbCA9IGNvbmYtPnBvd2VyX2xldmVsOworCX0KKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IHdsMTI3MV9vcF9jb25maWcoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBjaGFuZ2VkKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOwogCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsKIAlpbnQgY2hhbm5lbCwgcmV0ID0gMDsKLQlib29sIGlzX2FwOwogCiAJY2hhbm5lbCA9IGllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChjb25mLT5jaGFubmVsLT5jZW50ZXJfZnJlcSk7CiAKQEAgLTIzMjUsMTI4ICsyNTczLDI3IEBACiAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwogCi0JaWYgKHVubGlrZWx5KHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGKSkgewotCQkvKiB3ZSBzdXBwb3J0IGNvbmZpZ3VyaW5nIHRoZSBjaGFubmVsIGFuZCBiYW5kIHdoaWxlIG9mZiAqLwotCQlpZiAoKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkpIHsKLQkJCXdsLT5iYW5kID0gY29uZi0+Y2hhbm5lbC0+YmFuZDsKLQkJCXdsLT5jaGFubmVsID0gY2hhbm5lbDsKLQkJfQotCi0JCWlmICgoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QT1dFUikpCi0JCQl3bC0+cG93ZXJfbGV2ZWwgPSBjb25mLT5wb3dlcl9sZXZlbDsKLQotCQlnb3RvIG91dDsKKwkvKiB3ZSBzdXBwb3J0IGNvbmZpZ3VyaW5nIHRoZSBjaGFubmVsIGFuZCBiYW5kIGV2ZW4gd2hpbGUgb2ZmICovCisJaWYgKGNoYW5nZWQgJiBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCkgeworCQl3bC0+YmFuZCA9IGNvbmYtPmNoYW5uZWwtPmJhbmQ7CisJCXdsLT5jaGFubmVsID0gY2hhbm5lbDsKIAl9CiAKLQlpc19hcCA9ICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QT1dFUikKKwkJd2wtPnBvd2VyX2xldmVsID0gY29uZi0+cG93ZXJfbGV2ZWw7CisKKwlpZiAodW5saWtlbHkod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpKQorCQlnb3RvIG91dDsKIAogCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQkvKiBpZiB0aGUgY2hhbm5lbCBjaGFuZ2VzIHdoaWxlIGpvaW5lZCwgam9pbiBhZ2FpbiAqLwotCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwgJiYKLQkgICAgKCh3bC0+YmFuZCAhPSBjb25mLT5jaGFubmVsLT5iYW5kKSB8fAotCSAgICAgKHdsLT5jaGFubmVsICE9IGNoYW5uZWwpKSkgewotCQkvKiBzZW5kIGFsbCBwZW5kaW5nIHBhY2tldHMgKi8KLQkJd2wxMjcxX3R4X3dvcmtfbG9ja2VkKHdsKTsKLQkJd2wtPmJhbmQgPSBjb25mLT5jaGFubmVsLT5iYW5kOwotCQl3bC0+Y2hhbm5lbCA9IGNoYW5uZWw7Ci0KLQkJaWYgKCFpc19hcCkgewotCQkJLyoKLQkJCSAqIEZJWE1FOiB0aGUgbWFjODAyMTEgc2hvdWxkIHJlYWxseSBwcm92aWRlIGEgZml4ZWQKLQkJCSAqIHJhdGUgdG8gdXNlIGhlcmUuIGZvciBub3csIGp1c3QgdXNlIHRoZSBzbWFsbGVzdAotCQkJICogcG9zc2libGUgcmF0ZSBmb3IgdGhlIGJhbmQgYXMgYSBmaXhlZCByYXRlIGZvcgotCQkJICogYXNzb2NpYXRpb24gZnJhbWVzIGFuZCBvdGhlciBjb250cm9sIG1lc3NhZ2VzLgotCQkJICovCi0JCQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSkKLQkJCQl3bDEyNzFfc2V0X2JhbmRfcmF0ZSh3bCk7Ci0KLQkJCXdsLT5iYXNpY19yYXRlID0KLQkJCQl3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOwotCQkJcmV0ID0gd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyh3bCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQl3bDEyNzFfd2FybmluZygicmF0ZSBwb2xpY3kgZm9yIGNoYW5uZWwgIgotCQkJCQkgICAgICAgImZhaWxlZCAlZCIsIHJldCk7Ci0KLQkJCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsLT5mbGFncykpIHsKLQkJCQlpZiAod2wxMnh4X2lzX3JvYyh3bCkpIHsKLQkJCQkJLyogcm9hbWluZyAqLwotCQkJCQlyZXQgPSB3bDEyeHhfY3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKLQkJCQkJaWYgKHJldCA8IDApCi0JCQkJCQlnb3RvIG91dF9zbGVlcDsKLQkJCQl9Ci0JCQkJcmV0ID0gd2wxMjcxX2pvaW4od2wsIGZhbHNlKTsKLQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJd2wxMjcxX3dhcm5pbmcoImNtZCBqb2luIG9uIGNoYW5uZWwgIgotCQkJCQkJICAgICAgICJmYWlsZWQgJWQiLCByZXQpOwotCQkJfSBlbHNlIHsKLQkJCQkvKgotCQkJCSAqIGNoYW5nZSB0aGUgUk9DIGNoYW5uZWwuIGRvIGl0IG9ubHkgaWYgd2UgYXJlCi0JCQkJICogbm90IGlkbGUuIG90aGVyd2lzZSwgQ1JPQyB3aWxsIGJlIGNhbGxlZAotCQkJCSAqIGFueXdheS4KLQkJCQkgKi8KLQkJCQlpZiAod2wxMnh4X2lzX3JvYyh3bCkgJiYKLQkJCQkgICAgIShjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX0lETEUpKSB7Ci0JCQkJCXJldCA9IHdsMTJ4eF9jcm9jKHdsLCB3bC0+ZGV2X3JvbGVfaWQpOwotCQkJCQlpZiAocmV0IDwgMCkKLQkJCQkJCWdvdG8gb3V0X3NsZWVwOwotCi0JCQkJCXJldCA9IHdsMTJ4eF9yb2Mod2wsIHdsLT5kZXZfcm9sZV9pZCk7Ci0JCQkJCWlmIChyZXQgPCAwKQotCQkJCQkJd2wxMjcxX3dhcm5pbmcoInJvYyBmYWlsZWQgJWQiLAotCQkJCQkJCSAgICAgICByZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCWlmIChjaGFuZ2VkICYgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0lETEUgJiYgIWlzX2FwKSB7Ci0JCXJldCA9IHdsMTI3MV9zdGFfaGFuZGxlX2lkbGUod2wsCi0JCQkJCWNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfSURMRSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJd2wxMjcxX3dhcm5pbmcoImlkbGUgbW9kZSBjaGFuZ2UgZmFpbGVkICVkIiwgcmV0KTsKLQl9Ci0KLQkvKgotCSAqIGlmIG1hYzgwMjExIGNoYW5nZXMgdGhlIFBTTSBtb2RlLCBtYWtlIHN1cmUgdGhlIG1vZGUgaXMgbm90Ci0JICogaW5jb3JyZWN0bHkgY2hhbmdlZCBhZnRlciB0aGUgcHNwb2xsIGZhaWx1cmUgYWN0aXZlIHdpbmRvdy4KLQkgKi8KLQlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9QUykKLQkJY2xlYXJfYml0KFdMMTI3MV9GTEFHX1BTUE9MTF9GQUlMVVJFLCAmd2wtPmZsYWdzKTsKLQotCWlmIChjb25mLT5mbGFncyAmIElFRUU4MDIxMV9DT05GX1BTICYmCi0JICAgICF0ZXN0X2JpdChXTDEyNzFfRkxBR19QU01fUkVRVUVTVEVELCAmd2wtPmZsYWdzKSkgewotCQlzZXRfYml0KFdMMTI3MV9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bC0+ZmxhZ3MpOwotCi0JCS8qCi0JCSAqIFdlIGVudGVyIFBTTSBvbmx5IGlmIHdlJ3JlIGFscmVhZHkgYXNzb2NpYXRlZC4KLQkJICogSWYgd2UncmUgbm90LCB3ZSdsbCBlbnRlciBpdCB3aGVuIGpvaW5pbmcgYW4gU1NJRCwKLQkJICogdGhyb3VnaCB0aGUgYnNzX2luZm9fY2hhbmdlZCgpIGhvb2suCi0JCSAqLwotCQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpKSB7Ci0JCQl3bDEyNzFfZGVidWcoREVCVUdfUFNNLCAicHNtIGVuYWJsZWQiKTsKLQkJCXJldCA9IHdsMTI3MV9wc19zZXRfbW9kZSh3bCwgU1RBVElPTl9QT1dFUl9TQVZFX01PREUsCi0JCQkJCQkgd2wtPmJhc2ljX3JhdGUsIHRydWUpOwotCQl9Ci0JfSBlbHNlIGlmICghKGNvbmYtPmZsYWdzICYgSUVFRTgwMjExX0NPTkZfUFMpICYmCi0JCSAgIHRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTV9SRVFVRVNURUQsICZ3bC0+ZmxhZ3MpKSB7Ci0JCXdsMTI3MV9kZWJ1ZyhERUJVR19QU00sICJwc20gZGlzYWJsZWQiKTsKLQotCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfUFNNX1JFUVVFU1RFRCwgJndsLT5mbGFncyk7Ci0KLQkJaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTSwgJndsLT5mbGFncykpCi0JCQlyZXQgPSB3bDEyNzFfcHNfc2V0X21vZGUod2wsIFNUQVRJT05fQUNUSVZFX01PREUsCi0JCQkJCQkgd2wtPmJhc2ljX3JhdGUsIHRydWUpOwotCX0KLQotCWlmIChjb25mLT5wb3dlcl9sZXZlbCAhPSB3bC0+cG93ZXJfbGV2ZWwpIHsKLQkJcmV0ID0gd2wxMjcxX2FjeF90eF9wb3dlcih3bCwgY29uZi0+cG93ZXJfbGV2ZWwpOworCS8qIGNvbmZpZ3VyZSBlYWNoIGludGVyZmFjZSAqLworCXdsMTJ4eF9mb3JfZWFjaF93bHZpZih3bCwgd2x2aWYpIHsKKwkJcmV0ID0gd2wxMnh4X2NvbmZpZ192aWYod2wsIHdsdmlmLCBjb25mLCBjaGFuZ2VkKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dF9zbGVlcDsKLQotCQl3bC0+cG93ZXJfbGV2ZWwgPSBjb25mLT5wb3dlcl9sZXZlbDsKIAl9CiAKIG91dF9zbGVlcDoKQEAgLTI1MDksNiArMjY1Niw4IEBACiB7CiAJc3RydWN0IHdsMTI3MV9maWx0ZXJfcGFyYW1zICpmcCA9ICh2b2lkICopKHVuc2lnbmVkIGxvbmcpbXVsdGljYXN0OwogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOworCiAJaW50IHJldDsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIGNvbmZpZ3VyZSBmaWx0ZXIgY2hhbmdlZCAleCIKQEAgLTI1MjYsMTUgKzI2NzUsMjAgQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQlpZiAod2wtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUykgewotCQlpZiAoKnRvdGFsICYgRklGX0FMTE1VTFRJKQotCQkJcmV0ID0gd2wxMjcxX2FjeF9ncm91cF9hZGRyZXNzX3RibCh3bCwgZmFsc2UsIE5VTEwsIDApOwotCQllbHNlIGlmIChmcCkKLQkJCXJldCA9IHdsMTI3MV9hY3hfZ3JvdXBfYWRkcmVzc190Ymwod2wsIGZwLT5lbmFibGVkLAotCQkJCQkJCSAgIGZwLT5tY19saXN0LAotCQkJCQkJCSAgIGZwLT5tY19saXN0X2xlbmd0aCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXRfc2xlZXA7CisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgeworCQlpZiAod2x2aWYtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUykgeworCQkJaWYgKCp0b3RhbCAmIEZJRl9BTExNVUxUSSkKKwkJCQlyZXQgPSB3bDEyNzFfYWN4X2dyb3VwX2FkZHJlc3NfdGJsKHdsLCB3bHZpZiwKKwkJCQkJCQkJICAgZmFsc2UsCisJCQkJCQkJCSAgIE5VTEwsIDApOworCQkJZWxzZSBpZiAoZnApCisJCQkJcmV0ID0gd2wxMjcxX2FjeF9ncm91cF9hZGRyZXNzX3RibCh3bCwgd2x2aWYsCisJCQkJCQkJZnAtPmVuYWJsZWQsCisJCQkJCQkJZnAtPm1jX2xpc3QsCisJCQkJCQkJZnAtPm1jX2xpc3RfbGVuZ3RoKTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCWdvdG8gb3V0X3NsZWVwOworCQl9CiAJfQogCiAJLyoKQEAgLTI1NTEsOSArMjcwNSwxMCBAQAogCWtmcmVlKGZwKTsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfcmVjb3JkX2FwX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaWQsIHU4IGtleV90eXBlLAotCQkJdTgga2V5X3NpemUsIGNvbnN0IHU4ICprZXksIHU4IGhsaWQsIHUzMiB0eF9zZXFfMzIsCi0JCQl1MTYgdHhfc2VxXzE2KQorc3RhdGljIGludCB3bDEyNzFfcmVjb3JkX2FwX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJCXU4IGlkLCB1OCBrZXlfdHlwZSwgdTgga2V5X3NpemUsCisJCQkJY29uc3QgdTggKmtleSwgdTggaGxpZCwgdTMyIHR4X3NlcV8zMiwKKwkJCQl1MTYgdHhfc2VxXzE2KQogewogCXN0cnVjdCB3bDEyNzFfYXBfa2V5ICphcF9rZXk7CiAJaW50IGk7CkBAIC0yNTY4LDEwICsyNzIzLDEwIEBACiAJICogYW4gZXhpc3Rpbmcga2V5LgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0tFWVM7IGkrKykgewotCQlpZiAod2wtPnJlY29yZGVkX2FwX2tleXNbaV0gPT0gTlVMTCkKKwkJaWYgKHdsdmlmLT5hcC5yZWNvcmRlZF9rZXlzW2ldID09IE5VTEwpCiAJCQlicmVhazsKIAotCQlpZiAod2wtPnJlY29yZGVkX2FwX2tleXNbaV0tPmlkID09IGlkKSB7CisJCWlmICh3bHZpZi0+YXAucmVjb3JkZWRfa2V5c1tpXS0+aWQgPT0gaWQpIHsKIAkJCXdsMTI3MV93YXJuaW5nKCJ0cnlpbmcgdG8gcmVjb3JkIGtleSByZXBsYWNlbWVudCIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KQEAgLTI1OTIsMjEgKzI3NDcsMjEgQEAKIAlhcF9rZXktPnR4X3NlcV8zMiA9IHR4X3NlcV8zMjsKIAlhcF9rZXktPnR4X3NlcV8xNiA9IHR4X3NlcV8xNjsKIAotCXdsLT5yZWNvcmRlZF9hcF9rZXlzW2ldID0gYXBfa2V5OworCXdsdmlmLT5hcC5yZWNvcmRlZF9rZXlzW2ldID0gYXBfa2V5OwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB3bDEyNzFfZnJlZV9hcF9rZXlzKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIHZvaWQgd2wxMjcxX2ZyZWVfYXBfa2V5cyhzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9OVU1fS0VZUzsgaSsrKSB7Ci0JCWtmcmVlKHdsLT5yZWNvcmRlZF9hcF9rZXlzW2ldKTsKLQkJd2wtPnJlY29yZGVkX2FwX2tleXNbaV0gPSBOVUxMOworCQlrZnJlZSh3bHZpZi0+YXAucmVjb3JkZWRfa2V5c1tpXSk7CisJCXdsdmlmLT5hcC5yZWNvcmRlZF9rZXlzW2ldID0gTlVMTDsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2FwX2luaXRfaHdlbmMoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTI3MV9hcF9pbml0X2h3ZW5jKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpCiB7CiAJaW50IGksIHJldCA9IDA7CiAJc3RydWN0IHdsMTI3MV9hcF9rZXkgKmtleTsKQEAgLTI2MTQsMTUgKzI3NjksMTUgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNX0tFWVM7IGkrKykgewogCQl1OCBobGlkOwotCQlpZiAod2wtPnJlY29yZGVkX2FwX2tleXNbaV0gPT0gTlVMTCkKKwkJaWYgKHdsdmlmLT5hcC5yZWNvcmRlZF9rZXlzW2ldID09IE5VTEwpCiAJCQlicmVhazsKIAotCQlrZXkgPSB3bC0+cmVjb3JkZWRfYXBfa2V5c1tpXTsKKwkJa2V5ID0gd2x2aWYtPmFwLnJlY29yZGVkX2tleXNbaV07CiAJCWhsaWQgPSBrZXktPmhsaWQ7CiAJCWlmIChobGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpCi0JCQlobGlkID0gd2wtPmFwX2JjYXN0X2hsaWQ7CisJCQlobGlkID0gd2x2aWYtPmFwLmJjYXN0X2hsaWQ7CiAKLQkJcmV0ID0gd2wxMjcxX2NtZF9zZXRfYXBfa2V5KHdsLCBLRVlfQUREX09SX1JFUExBQ0UsCisJCXJldCA9IHdsMTI3MV9jbWRfc2V0X2FwX2tleSh3bCwgd2x2aWYsIEtFWV9BRERfT1JfUkVQTEFDRSwKIAkJCQkJICAgIGtleS0+aWQsIGtleS0+a2V5X3R5cGUsCiAJCQkJCSAgICBrZXktPmtleV9zaXplLCBrZXktPmtleSwKIAkJCQkJICAgIGhsaWQsIGtleS0+dHhfc2VxXzMyLApAQCAtMjYzNSwyMyArMjc5MCwyNCBAQAogCX0KIAogCWlmICh3ZXBfa2V5X2FkZGVkKSB7Ci0JCXJldCA9IHdsMTJ4eF9jbWRfc2V0X2RlZmF1bHRfd2VwX2tleSh3bCwgd2wtPmRlZmF1bHRfa2V5LAotCQkJCQkJICAgICB3bC0+YXBfYmNhc3RfaGxpZCk7CisJCXJldCA9IHdsMTJ4eF9jbWRfc2V0X2RlZmF1bHRfd2VwX2tleSh3bCwgd2x2aWYtPmRlZmF1bHRfa2V5LAorCQkJCQkJICAgICB3bHZpZi0+YXAuYmNhc3RfaGxpZCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfQogCiBvdXQ6Ci0Jd2wxMjcxX2ZyZWVfYXBfa2V5cyh3bCk7CisJd2wxMjcxX2ZyZWVfYXBfa2V5cyh3bCwgd2x2aWYpOwogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX3NldF9rZXkoc3RydWN0IHdsMTI3MSAqd2wsIHUxNiBhY3Rpb24sIHU4IGlkLCB1OCBrZXlfdHlwZSwKK3N0YXRpYyBpbnQgd2wxMjcxX3NldF9rZXkoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgICAgIHUxNiBhY3Rpb24sIHU4IGlkLCB1OCBrZXlfdHlwZSwKIAkJICAgICAgIHU4IGtleV9zaXplLCBjb25zdCB1OCAqa2V5LCB1MzIgdHhfc2VxXzMyLAogCQkgICAgICAgdTE2IHR4X3NlcV8xNiwgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKIAlpbnQgcmV0OwotCWJvb2wgaXNfYXAgPSAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7CisJYm9vbCBpc19hcCA9ICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKIAogCWlmIChpc19hcCkgewogCQlzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKndsX3N0YTsKQEAgLTI2NjEsMTAgKzI4MTcsMTAgQEAKIAkJCXdsX3N0YSA9IChzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKilzdGEtPmRydl9wcml2OwogCQkJaGxpZCA9IHdsX3N0YS0+aGxpZDsKIAkJfSBlbHNlIHsKLQkJCWhsaWQgPSB3bC0+YXBfYmNhc3RfaGxpZDsKKwkJCWhsaWQgPSB3bHZpZi0+YXAuYmNhc3RfaGxpZDsKIAkJfQogCi0JCWlmICghdGVzdF9iaXQoV0wxMjcxX0ZMQUdfQVBfU1RBUlRFRCwgJndsLT5mbGFncykpIHsKKwkJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX0FQX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpKSB7CiAJCQkvKgogCQkJICogV2UgZG8gbm90IHN1cHBvcnQgcmVtb3Zpbmcga2V5cyBhZnRlciBBUCBzaHV0ZG93bi4KIAkJCSAqIFByZXRlbmQgd2UgZG8gdG8gbWFrZSBtYWM4MDIxMSBoYXBweS4KQEAgLTI2NzIsMTIgKzI4MjgsMTIgQEAKIAkJCWlmIChhY3Rpb24gIT0gS0VZX0FERF9PUl9SRVBMQUNFKQogCQkJCXJldHVybiAwOwogCi0JCQlyZXQgPSB3bDEyNzFfcmVjb3JkX2FwX2tleSh3bCwgaWQsCisJCQlyZXQgPSB3bDEyNzFfcmVjb3JkX2FwX2tleSh3bCwgd2x2aWYsIGlkLAogCQkJCQkgICAgIGtleV90eXBlLCBrZXlfc2l6ZSwKIAkJCQkJICAgICBrZXksIGhsaWQsIHR4X3NlcV8zMiwKIAkJCQkJICAgICB0eF9zZXFfMTYpOwogCQl9IGVsc2UgewotCQkJcmV0ID0gd2wxMjcxX2NtZF9zZXRfYXBfa2V5KHdsLCBhY3Rpb24sCisJCQlyZXQgPSB3bDEyNzFfY21kX3NldF9hcF9rZXkod2wsIHdsdmlmLCBhY3Rpb24sCiAJCQkJCSAgICAgaWQsIGtleV90eXBlLCBrZXlfc2l6ZSwKIAkJCQkJICAgICBrZXksIGhsaWQsIHR4X3NlcV8zMiwKIAkJCQkJICAgICB0eF9zZXFfMTYpOwpAQCAtMjcxOCwxMCArMjg3NCwxMCBAQAogCiAJCS8qIGRvbid0IHJlbW92ZSBrZXkgaWYgaGxpZCB3YXMgYWxyZWFkeSBkZWxldGVkICovCiAJCWlmIChhY3Rpb24gPT0gS0VZX1JFTU9WRSAmJgotCQkgICAgd2wtPnN0YV9obGlkID09IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpCisJCSAgICB3bHZpZi0+c3RhLmhsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkKIAkJCXJldHVybiAwOwogCi0JCXJldCA9IHdsMTI3MV9jbWRfc2V0X3N0YV9rZXkod2wsIGFjdGlvbiwKKwkJcmV0ID0gd2wxMjcxX2NtZF9zZXRfc3RhX2tleSh3bCwgd2x2aWYsIGFjdGlvbiwKIAkJCQkJICAgICBpZCwga2V5X3R5cGUsIGtleV9zaXplLAogCQkJCQkgICAgIGtleSwgYWRkciwgdHhfc2VxXzMyLAogCQkJCQkgICAgIHR4X3NlcV8xNik7CkBAIC0yNzMxLDggKzI4ODcsOCBAQAogCQkvKiB0aGUgZGVmYXVsdCBXRVAga2V5IG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgYXQgbGVhc3Qgb25jZSAqLwogCQlpZiAoa2V5X3R5cGUgPT0gS0VZX1dFUCkgewogCQkJcmV0ID0gd2wxMnh4X2NtZF9zZXRfZGVmYXVsdF93ZXBfa2V5KHdsLAotCQkJCQkJCSAgICAgd2wtPmRlZmF1bHRfa2V5LAotCQkJCQkJCSAgICAgd2wtPnN0YV9obGlkKTsKKwkJCQkJCQl3bHZpZi0+ZGVmYXVsdF9rZXksCisJCQkJCQkJd2x2aWYtPnN0YS5obGlkKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0KQEAgLTI3NDcsNiArMjkwMyw3IEBACiAJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleV9jb25mKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CiAJaW50IHJldDsKIAl1MzIgdHhfc2VxXzMyID0gMDsKIAl1MTYgdHhfc2VxXzE2ID0gMDsKQEAgLTI3ODIsMjAgKzI5MzksMjAgQEAKIAkJa2V5X3R5cGUgPSBLRVlfVEtJUDsKIAogCQlrZXlfY29uZi0+aHdfa2V5X2lkeCA9IGtleV9jb25mLT5rZXlpZHg7Ci0JCXR4X3NlcV8zMiA9IFdMMTI3MV9UWF9TRUNVUklUWV9ISTMyKHdsLT50eF9zZWN1cml0eV9zZXEpOwotCQl0eF9zZXFfMTYgPSBXTDEyNzFfVFhfU0VDVVJJVFlfTE8xNih3bC0+dHhfc2VjdXJpdHlfc2VxKTsKKwkJdHhfc2VxXzMyID0gV0wxMjcxX1RYX1NFQ1VSSVRZX0hJMzIod2x2aWYtPnR4X3NlY3VyaXR5X3NlcSk7CisJCXR4X3NlcV8xNiA9IFdMMTI3MV9UWF9TRUNVUklUWV9MTzE2KHdsdmlmLT50eF9zZWN1cml0eV9zZXEpOwogCQlicmVhazsKIAljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6CiAJCWtleV90eXBlID0gS0VZX0FFUzsKIAotCQlrZXlfY29uZi0+ZmxhZ3MgfD0gSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWOwotCQl0eF9zZXFfMzIgPSBXTDEyNzFfVFhfU0VDVVJJVFlfSEkzMih3bC0+dHhfc2VjdXJpdHlfc2VxKTsKLQkJdHhfc2VxXzE2ID0gV0wxMjcxX1RYX1NFQ1VSSVRZX0xPMTYod2wtPnR4X3NlY3VyaXR5X3NlcSk7CisJCWtleV9jb25mLT5mbGFncyB8PSBJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFOworCQl0eF9zZXFfMzIgPSBXTDEyNzFfVFhfU0VDVVJJVFlfSEkzMih3bHZpZi0+dHhfc2VjdXJpdHlfc2VxKTsKKwkJdHhfc2VxXzE2ID0gV0wxMjcxX1RYX1NFQ1VSSVRZX0xPMTYod2x2aWYtPnR4X3NlY3VyaXR5X3NlcSk7CiAJCWJyZWFrOwogCWNhc2UgV0wxMjcxX0NJUEhFUl9TVUlURV9HRU06CiAJCWtleV90eXBlID0gS0VZX0dFTTsKLQkJdHhfc2VxXzMyID0gV0wxMjcxX1RYX1NFQ1VSSVRZX0hJMzIod2wtPnR4X3NlY3VyaXR5X3NlcSk7Ci0JCXR4X3NlcV8xNiA9IFdMMTI3MV9UWF9TRUNVUklUWV9MTzE2KHdsLT50eF9zZWN1cml0eV9zZXEpOworCQl0eF9zZXFfMzIgPSBXTDEyNzFfVFhfU0VDVVJJVFlfSEkzMih3bHZpZi0+dHhfc2VjdXJpdHlfc2VxKTsKKwkJdHhfc2VxXzE2ID0gV0wxMjcxX1RYX1NFQ1VSSVRZX0xPMTYod2x2aWYtPnR4X3NlY3VyaXR5X3NlcSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXdsMTI3MV9lcnJvcigiVW5rbm93biBrZXkgYWxnbyAweCV4Iiwga2V5X2NvbmYtPmNpcGhlcik7CkBAIC0yODA2LDcgKzI5NjMsNyBAQAogCiAJc3dpdGNoIChjbWQpIHsKIAljYXNlIFNFVF9LRVk6Ci0JCXJldCA9IHdsMTI3MV9zZXRfa2V5KHdsLCBLRVlfQUREX09SX1JFUExBQ0UsCisJCXJldCA9IHdsMTI3MV9zZXRfa2V5KHdsLCB3bHZpZiwgS0VZX0FERF9PUl9SRVBMQUNFLAogCQkJCSBrZXlfY29uZi0+a2V5aWR4LCBrZXlfdHlwZSwKIAkJCQkga2V5X2NvbmYtPmtleWxlbiwga2V5X2NvbmYtPmtleSwKIAkJCQkgdHhfc2VxXzMyLCB0eF9zZXFfMTYsIHN0YSk7CkBAIC0yODE3LDcgKzI5NzQsNyBAQAogCQlicmVhazsKIAogCWNhc2UgRElTQUJMRV9LRVk6Ci0JCXJldCA9IHdsMTI3MV9zZXRfa2V5KHdsLCBLRVlfUkVNT1ZFLAorCQlyZXQgPSB3bDEyNzFfc2V0X2tleSh3bCwgd2x2aWYsIEtFWV9SRU1PVkUsCiAJCQkJICAgICBrZXlfY29uZi0+a2V5aWR4LCBrZXlfdHlwZSwKIAkJCQkgICAgIGtleV9jb25mLT5rZXlsZW4sIGtleV9jb25mLT5rZXksCiAJCQkJICAgICAwLCAwLCBzdGEpOwpAQCAtMjg0Nyw2ICszMDA0LDggQEAKIAkJCSAgICAgc3RydWN0IGNmZzgwMjExX3NjYW5fcmVxdWVzdCAqcmVxKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisKIAlpbnQgcmV0OwogCXU4ICpzc2lkID0gTlVMTDsKIAlzaXplX3QgbGVuID0gMDsKQEAgLTI4NzQsMTggKzMwMzMsMTggQEAKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKLQkvKiBjYW5jZWwgUk9DIGJlZm9yZSBzY2FubmluZyAqLwotCWlmICh3bDEyeHhfaXNfcm9jKHdsKSkgewotCQlpZiAodGVzdF9iaXQoV0wxMjcxX0ZMQUdfU1RBX0FTU09DSUFURUQsICZ3bC0+ZmxhZ3MpKSB7Ci0JCQkvKiBkb24ndCBhbGxvdyBzY2FubmluZyByaWdodCBub3cgKi8KLQkJCXJldCA9IC1FQlVTWTsKLQkJCWdvdG8gb3V0X3NsZWVwOwotCQl9Ci0JCXdsMTJ4eF9jcm9jKHdsLCB3bC0+ZGV2X3JvbGVfaWQpOwotCQl3bDEyeHhfY21kX3JvbGVfc3RvcF9kZXYod2wpOworCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKSAmJgorCSAgICB0ZXN0X2JpdCh3bHZpZi0+cm9sZV9pZCwgd2wtPnJvY19tYXApKSB7CisJCS8qIGRvbid0IGFsbG93IHNjYW5uaW5nIHJpZ2h0IG5vdyAqLworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0X3NsZWVwOwogCX0KIAotCXJldCA9IHdsMTI3MV9zY2FuKGh3LT5wcml2LCBzc2lkLCBsZW4sIHJlcSk7CisJLyogY2FuY2VsIFJPQyBiZWZvcmUgc2Nhbm5pbmcgKi8KKwlpZiAod2wxMnh4X2Rldl9yb2xlX3N0YXJ0ZWQod2x2aWYpKQorCQl3bDEyeHhfc3RvcF9kZXYod2wsIHdsdmlmKTsKKworCXJldCA9IHdsMTI3MV9zY2FuKGh3LT5wcml2LCB2aWYsIHNzaWQsIGxlbiwgcmVxKTsKIG91dF9zbGVlcDoKIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKIG91dDoKQEAgLTI5MjEsNiArMzA4MCw3IEBACiAJfQogCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfSURMRTsKIAltZW1zZXQod2wtPnNjYW4uc2Nhbm5lZF9jaCwgMCwgc2l6ZW9mKHdsLT5zY2FuLnNjYW5uZWRfY2gpKTsKKwl3bC0+c2Nhbl92aWYgPSBOVUxMOwogCXdsLT5zY2FuLnJlcSA9IE5VTEw7CiAJaWVlZTgwMjExX3NjYW5fY29tcGxldGVkKHdsLT5odywgdHJ1ZSk7CiAKQEAgLTI5MzgsNiArMzA5OCw3IEBACiAJCQkJICAgICAgc3RydWN0IGllZWU4MDIxMV9zY2hlZF9zY2FuX2llcyAqaWVzKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CiAJaW50IHJldDsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIndsMTI3MV9vcF9zY2hlZF9zY2FuX3N0YXJ0Iik7CkBAIC0yOTQ4LDExICszMTA5LDExIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gd2wxMjcxX3NjYW5fc2NoZWRfc2Nhbl9jb25maWcod2wsIHJlcSwgaWVzKTsKKwlyZXQgPSB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX2NvbmZpZyh3bCwgd2x2aWYsIHJlcSwgaWVzKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfc2xlZXA7CiAKLQlyZXQgPSB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX3N0YXJ0KHdsKTsKKwlyZXQgPSB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX3N0YXJ0KHdsLCB3bHZpZik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3NsZWVwOwogCkBAIC0zMDE3LDYgKzMxNzgsNyBAQAogc3RhdGljIGludCB3bDEyNzFfb3Bfc2V0X3J0c190aHJlc2hvbGQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB2YWx1ZSkKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlpbnQgcmV0ID0gMDsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CkBAIC0zMDMwLDEwICszMTkyLDExIEBACiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gd2wxMjcxX2FjeF9ydHNfdGhyZXNob2xkKHdsLCB2YWx1ZSk7Ci0JaWYgKHJldCA8IDApCi0JCXdsMTI3MV93YXJuaW5nKCJ3bDEyNzFfb3Bfc2V0X3J0c190aHJlc2hvbGQgZmFpbGVkOiAlZCIsIHJldCk7Ci0KKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWYod2wsIHdsdmlmKSB7CisJCXJldCA9IHdsMTI3MV9hY3hfcnRzX3RocmVzaG9sZCh3bCwgd2x2aWYsIHZhbHVlKTsKKwkJaWYgKHJldCA8IDApCisJCQl3bDEyNzFfd2FybmluZygic2V0IHJ0cyB0aHJlc2hvbGQgZmFpbGVkOiAlZCIsIHJldCk7CisJfQogCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOwogCiBvdXQ6CkBAIC0zMDQyLDkgKzMyMDUsMTAgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdsMTI3MV9zc2lkX3NldChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKK3N0YXRpYyBpbnQgd2wxMjcxX3NzaWRfc2V0KHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBza19idWZmICpza2IsCiAJCQkgICAgaW50IG9mZnNldCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAl1OCBzc2lkX2xlbjsKIAljb25zdCB1OCAqcHRyID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TU0lELCBza2ItPmRhdGEgKyBvZmZzZXQsCiAJCQkJCSBza2ItPmxlbiAtIG9mZnNldCk7CkBAIC0zMDYwLDggKzMyMjQsOCBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQl3bC0+c3NpZF9sZW4gPSBzc2lkX2xlbjsKLQltZW1jcHkod2wtPnNzaWQsIHB0cisyLCBzc2lkX2xlbik7CisJd2x2aWYtPnNzaWRfbGVuID0gc3NpZF9sZW47CisJbWVtY3B5KHdsdmlmLT5zc2lkLCBwdHIrMiwgc3NpZF9sZW4pOwogCXJldHVybiAwOwogfQogCkBAIC0zMDk2LDE4ICszMjYwLDQwIEBACiAJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIGxlbik7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX2FwX3NldF9wcm9iZV9yZXNwX3RtcGwoc3RydWN0IHdsMTI3MSAqd2wsCi0JCQkJCSB1OCAqcHJvYmVfcnNwX2RhdGEsCi0JCQkJCSBzaXplX3QgcHJvYmVfcnNwX2xlbiwKLQkJCQkJIHUzMiByYXRlcykKK3N0YXRpYyBpbnQgd2wxMjcxX2FwX3NldF9wcm9iZV9yZXNwX3RtcGwoc3RydWN0IHdsMTI3MSAqd2wsIHUzMiByYXRlcywKKwkJCQkJIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmd2wtPnZpZi0+YnNzX2NvbmY7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcmV0OworCisJc2tiID0gaWVlZTgwMjExX3Byb2JlcmVzcF9nZXQod2wtPmh3LCB2aWYpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlyZXQgPSB3bDEyNzFfY21kX3RlbXBsYXRlX3NldCh3bCwKKwkJCQkgICAgICBDTURfVEVNUExfQVBfUFJPQkVfUkVTUE9OU0UsCisJCQkJICAgICAgc2tiLT5kYXRhLAorCQkJCSAgICAgIHNrYi0+bGVuLCAwLAorCQkJCSAgICAgIHJhdGVzKTsKKworCWRldl9rZnJlZV9za2Ioc2tiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHdsMTI3MV9hcF9zZXRfcHJvYmVfcmVzcF90bXBsX2xlZ2FjeShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJCQkgICAgIHU4ICpwcm9iZV9yc3BfZGF0YSwKKwkJCQkJICAgICBzaXplX3QgcHJvYmVfcnNwX2xlbiwKKwkJCQkJICAgICB1MzIgcmF0ZXMpCit7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqYnNzX2NvbmYgPSAmdmlmLT5ic3NfY29uZjsKIAl1OCBwcm9iZV9yc3BfdGVtcGxbV0wxMjcxX0NNRF9URU1QTF9NQVhfU0laRV07CiAJaW50IHNzaWRfaWVfb2Zmc2V0LCBpZV9vZmZzZXQsIHRlbXBsX2xlbjsKIAljb25zdCB1OCAqcHRyOwogCiAJLyogbm8gbmVlZCB0byBjaGFuZ2UgcHJvYmUgcmVzcG9uc2UgaWYgdGhlIFNTSUQgaXMgc2V0IGNvcnJlY3RseSAqLwotCWlmICh3bC0+c3NpZF9sZW4gPiAwKQorCWlmICh3bHZpZi0+c3NpZF9sZW4gPiAwKQogCQlyZXR1cm4gd2wxMjcxX2NtZF90ZW1wbGF0ZV9zZXQod2wsCiAJCQkJCSAgICAgICBDTURfVEVNUExfQVBfUFJPQkVfUkVTUE9OU0UsCiAJCQkJCSAgICAgICBwcm9iZV9yc3BfZGF0YSwKQEAgLTMxNTMsMTYgKzMzMzksMTggQEAKIH0KIAogc3RhdGljIGludCB3bDEyNzFfYnNzX2VycF9pbmZvX2NoYW5nZWQoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCiAJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAogCQkJCSAgICAgICB1MzIgY2hhbmdlZCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX1NMT1QpIHsKIAkJaWYgKGJzc19jb25mLT51c2Vfc2hvcnRfc2xvdCkKLQkJCXJldCA9IHdsMTI3MV9hY3hfc2xvdCh3bCwgU0xPVF9USU1FX1NIT1JUKTsKKwkJCXJldCA9IHdsMTI3MV9hY3hfc2xvdCh3bCwgd2x2aWYsIFNMT1RfVElNRV9TSE9SVCk7CiAJCWVsc2UKLQkJCXJldCA9IHdsMTI3MV9hY3hfc2xvdCh3bCwgU0xPVF9USU1FX0xPTkcpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9zbG90KHdsLCB3bHZpZiwgU0xPVF9USU1FX0xPTkcpOwogCQlpZiAocmV0IDwgMCkgewogCQkJd2wxMjcxX3dhcm5pbmcoIlNldCBzbG90IHRpbWUgZmFpbGVkICVkIiwgcmV0KTsKIAkJCWdvdG8gb3V0OwpAQCAtMzE3MSwxNiArMzM1OSwxOCBAQAogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9FUlBfUFJFQU1CTEUpIHsKIAkJaWYgKGJzc19jb25mLT51c2Vfc2hvcnRfcHJlYW1ibGUpCi0JCQl3bDEyNzFfYWN4X3NldF9wcmVhbWJsZSh3bCwgQUNYX1BSRUFNQkxFX1NIT1JUKTsKKwkJCXdsMTI3MV9hY3hfc2V0X3ByZWFtYmxlKHdsLCB3bHZpZiwgQUNYX1BSRUFNQkxFX1NIT1JUKTsKIAkJZWxzZQotCQkJd2wxMjcxX2FjeF9zZXRfcHJlYW1ibGUod2wsIEFDWF9QUkVBTUJMRV9MT05HKTsKKwkJCXdsMTI3MV9hY3hfc2V0X3ByZWFtYmxlKHdsLCB3bHZpZiwgQUNYX1BSRUFNQkxFX0xPTkcpOwogCX0KIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQX0NUU19QUk9UKSB7CiAJCWlmIChic3NfY29uZi0+dXNlX2N0c19wcm90KQotCQkJcmV0ID0gd2wxMjcxX2FjeF9jdHNfcHJvdGVjdCh3bCwgQ1RTUFJPVEVDVF9FTkFCTEUpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9jdHNfcHJvdGVjdCh3bCwgd2x2aWYsCisJCQkJCQkgICAgIENUU1BST1RFQ1RfRU5BQkxFKTsKIAkJZWxzZQotCQkJcmV0ID0gd2wxMjcxX2FjeF9jdHNfcHJvdGVjdCh3bCwgQ1RTUFJPVEVDVF9ESVNBQkxFKTsKKwkJCXJldCA9IHdsMTI3MV9hY3hfY3RzX3Byb3RlY3Qod2wsIHdsdmlmLAorCQkJCQkJICAgICBDVFNQUk9URUNUX0RJU0FCTEUpOwogCQlpZiAocmV0IDwgMCkgewogCQkJd2wxMjcxX3dhcm5pbmcoIlNldCBjdHNwcm90ZWN0IGZhaWxlZCAlZCIsIHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTMxOTYsMTQgKzMzODYsMjMgQEAKIAkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiwKIAkJCQkJICB1MzIgY2hhbmdlZCkKIHsKLQlib29sIGlzX2FwID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOworCWJvb2wgaXNfYXAgPSAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7CiAJaW50IHJldCA9IDA7CiAKIAlpZiAoKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT05fSU5UKSkgewogCQl3bDEyNzFfZGVidWcoREVCVUdfTUFTVEVSLCAiYmVhY29uIGludGVydmFsIHVwZGF0ZWQ6ICVkIiwKIAkJCWJzc19jb25mLT5iZWFjb25faW50KTsKIAotCQl3bC0+YmVhY29uX2ludCA9IGJzc19jb25mLT5iZWFjb25faW50OworCQl3bHZpZi0+YmVhY29uX2ludCA9IGJzc19jb25mLT5iZWFjb25faW50OworCX0KKworCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0FQX1BST0JFX1JFU1ApICYmIGlzX2FwKSB7CisJCXUzMiByYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2x2aWYtPmJhc2ljX3JhdGVfc2V0KTsKKwkJaWYgKCF3bDEyNzFfYXBfc2V0X3Byb2JlX3Jlc3BfdG1wbCh3bCwgcmF0ZSwgdmlmKSkgeworCQkJd2wxMjcxX2RlYnVnKERFQlVHX0FQLCAicHJvYmUgcmVzcG9uc2UgdXBkYXRlZCIpOworCQkJc2V0X2JpdChXTFZJRl9GTEFHX0FQX1BST0JFX1JFU1BfU0VULCAmd2x2aWYtPmZsYWdzKTsKKwkJfQogCX0KIAogCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JFQUNPTikpIHsKQEAgLTMyMTQsMTcgKzM0MTMsMTkgQEAKIAkJc3RydWN0IHNrX2J1ZmYgKmJlYWNvbiA9IGllZWU4MDIxMV9iZWFjb25fZ2V0KHdsLT5odywgdmlmKTsKIAkJdTE2IHRtcGxfaWQ7CiAKLQkJaWYgKCFiZWFjb24pCisJCWlmICghYmVhY29uKSB7CisJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CisJCX0KIAogCQl3bDEyNzFfZGVidWcoREVCVUdfTUFTVEVSLCAiYmVhY29uIHVwZGF0ZWQiKTsKIAotCQlyZXQgPSB3bDEyNzFfc3NpZF9zZXQod2wsIGJlYWNvbiwgaWVvZmZzZXQpOworCQlyZXQgPSB3bDEyNzFfc3NpZF9zZXQodmlmLCBiZWFjb24sIGllb2Zmc2V0KTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCWRldl9rZnJlZV9za2IoYmVhY29uKTsKIAkJCWdvdG8gb3V0OwogCQl9Ci0JCW1pbl9yYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2wtPmJhc2ljX3JhdGVfc2V0KTsKKwkJbWluX3JhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOwogCQl0bXBsX2lkID0gaXNfYXAgPyBDTURfVEVNUExfQVBfQkVBQ09OIDoKIAkJCQkgIENNRF9URU1QTF9CRUFDT047CiAJCXJldCA9IHdsMTI3MV9jbWRfdGVtcGxhdGVfc2V0KHdsLCB0bXBsX2lkLApAQCAtMzIzNiw2ICszNDM3LDEzIEBACiAJCQlnb3RvIG91dDsKIAkJfQogCisJCS8qCisJCSAqIEluIGNhc2Ugd2UgYWxyZWFkeSBoYXZlIGEgcHJvYmUtcmVzcCBiZWFjb24gc2V0IGV4cGxpY2l0bHkKKwkJICogYnkgdXNlcm1vZGUsIGRvbid0IHVzZSB0aGUgYmVhY29uIGRhdGEuCisJCSAqLworCQlpZiAodGVzdF9iaXQoV0xWSUZfRkxBR19BUF9QUk9CRV9SRVNQX1NFVCwgJndsdmlmLT5mbGFncykpCisJCQlnb3RvIGVuZF9iY247CisKIAkJLyogcmVtb3ZlIFRJTSBpZSBmcm9tIHByb2JlIHJlc3BvbnNlICovCiAJCXdsMTJ4eF9yZW1vdmVfaWUoYmVhY29uLCBXTEFOX0VJRF9USU0sIGllb2Zmc2V0KTsKIApAQCAtMzI1NCw3ICszNDYyLDcgQEAKIAkJaGRyLT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAogCQkJCQkJIElFRUU4MDIxMV9TVFlQRV9QUk9CRV9SRVNQKTsKIAkJaWYgKGlzX2FwKQotCQkJcmV0ID0gd2wxMjcxX2FwX3NldF9wcm9iZV9yZXNwX3RtcGwod2wsCisJCQlyZXQgPSB3bDEyNzFfYXBfc2V0X3Byb2JlX3Jlc3BfdG1wbF9sZWdhY3kod2wsIHZpZiwKIAkJCQkJCWJlYWNvbi0+ZGF0YSwKIAkJCQkJCWJlYWNvbi0+bGVuLAogCQkJCQkJbWluX3JhdGUpOwpAQCAtMzI2NCwxMiArMzQ3MiwxNSBAQAogCQkJCQkJYmVhY29uLT5kYXRhLAogCQkJCQkJYmVhY29uLT5sZW4sIDAsCiAJCQkJCQltaW5fcmF0ZSk7CitlbmRfYmNuOgogCQlkZXZfa2ZyZWVfc2tiKGJlYWNvbik7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7CiAJfQogCiBvdXQ6CisJaWYgKHJldCAhPSAwKQorCQl3bDEyNzFfZXJyb3IoImJlYWNvbiBpbmZvIGNoYW5nZSBmYWlsZWQ6ICVkIiwgcmV0KTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zMjc5LDIzICszNDkwLDI0IEBACiAJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAogCQkJCSAgICAgICB1MzIgY2hhbmdlZCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAlpbnQgcmV0ID0gMDsKIAogCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VEX0JBU0lDX1JBVEVTKSkgewogCQl1MzIgcmF0ZXMgPSBic3NfY29uZi0+YmFzaWNfcmF0ZXM7CiAKLQkJd2wtPmJhc2ljX3JhdGVfc2V0ID0gd2wxMjcxX3R4X2VuYWJsZWRfcmF0ZXNfZ2V0KHdsLCByYXRlcywKLQkJCQkJCQkJIHdsLT5iYW5kKTsKLQkJd2wtPmJhc2ljX3JhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLAotCQkJCQkJCXdsLT5iYXNpY19yYXRlX3NldCk7CisJCXdsdmlmLT5iYXNpY19yYXRlX3NldCA9IHdsMTI3MV90eF9lbmFibGVkX3JhdGVzX2dldCh3bCwgcmF0ZXMsCisJCQkJCQkJCSB3bHZpZi0+YmFuZCk7CisJCXdsdmlmLT5iYXNpY19yYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwKKwkJCQkJCQl3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOwogCi0JCXJldCA9IHdsMTI3MV9pbml0X2FwX3JhdGVzKHdsKTsKKwkJcmV0ID0gd2wxMjcxX2luaXRfYXBfcmF0ZXMod2wsIHdsdmlmKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXdsMTI3MV9lcnJvcigiQVAgcmF0ZSBwb2xpY3kgY2hhbmdlIGZhaWxlZCAlZCIsIHJldCk7CiAJCQlnb3RvIG91dDsKIAkJfQogCi0JCXJldCA9IHdsMTI3MV9hcF9pbml0X3RlbXBsYXRlcyh3bCk7CisJCXJldCA9IHdsMTI3MV9hcF9pbml0X3RlbXBsYXRlcyh3bCwgdmlmKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAl9CkBAIC0zMzA2LDM4ICszNTE4LDQwIEBACiAKIAlpZiAoKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCkpIHsKIAkJaWYgKGJzc19jb25mLT5lbmFibGVfYmVhY29uKSB7Ci0JCQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX0FQX1NUQVJURUQsICZ3bC0+ZmxhZ3MpKSB7Ci0JCQkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2FwKHdsKTsKKwkJCWlmICghdGVzdF9iaXQoV0xWSUZfRkxBR19BUF9TVEFSVEVELCAmd2x2aWYtPmZsYWdzKSkgeworCQkJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdGFydF9hcCh3bCwgd2x2aWYpOwogCQkJCWlmIChyZXQgPCAwKQogCQkJCQlnb3RvIG91dDsKIAotCQkJCXJldCA9IHdsMTI3MV9hcF9pbml0X2h3ZW5jKHdsKTsKKwkJCQlyZXQgPSB3bDEyNzFfYXBfaW5pdF9od2VuYyh3bCwgd2x2aWYpOwogCQkJCWlmIChyZXQgPCAwKQogCQkJCQlnb3RvIG91dDsKIAotCQkJCXNldF9iaXQoV0wxMjcxX0ZMQUdfQVBfU1RBUlRFRCwgJndsLT5mbGFncyk7CisJCQkJc2V0X2JpdChXTFZJRl9GTEFHX0FQX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpOwogCQkJCXdsMTI3MV9kZWJ1ZyhERUJVR19BUCwgInN0YXJ0ZWQgQVAiKTsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19BUF9TVEFSVEVELCAmd2wtPmZsYWdzKSkgewotCQkJCXJldCA9IHdsMTJ4eF9jbWRfcm9sZV9zdG9wX2FwKHdsKTsKKwkJCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX0FQX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpKSB7CisJCQkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0b3BfYXAod2wsIHdsdmlmKTsKIAkJCQlpZiAocmV0IDwgMCkKIAkJCQkJZ290byBvdXQ7CiAKLQkJCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfQVBfU1RBUlRFRCwgJndsLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KFdMVklGX0ZMQUdfQVBfU1RBUlRFRCwgJndsdmlmLT5mbGFncyk7CisJCQkJY2xlYXJfYml0KFdMVklGX0ZMQUdfQVBfUFJPQkVfUkVTUF9TRVQsCisJCQkJCSAgJndsdmlmLT5mbGFncyk7CiAJCQkJd2wxMjcxX2RlYnVnKERFQlVHX0FQLCAic3RvcHBlZCBBUCIpOwogCQkJfQogCQl9CiAJfQogCi0JcmV0ID0gd2wxMjcxX2Jzc19lcnBfaW5mb19jaGFuZ2VkKHdsLCBic3NfY29uZiwgY2hhbmdlZCk7CisJcmV0ID0gd2wxMjcxX2Jzc19lcnBfaW5mb19jaGFuZ2VkKHdsLCB2aWYsIGJzc19jb25mLCBjaGFuZ2VkKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CiAKIAkvKiBIYW5kbGUgSFQgaW5mb3JtYXRpb24gY2hhbmdlICovCiAJaWYgKChjaGFuZ2VkICYgQlNTX0NIQU5HRURfSFQpICYmCiAJICAgIChic3NfY29uZi0+Y2hhbm5lbF90eXBlICE9IE5MODAyMTFfQ0hBTl9OT19IVCkpIHsKLQkJcmV0ID0gd2wxMjcxX2FjeF9zZXRfaHRfaW5mb3JtYXRpb24od2wsCisJCXJldCA9IHdsMTI3MV9hY3hfc2V0X2h0X2luZm9ybWF0aW9uKHdsLCB3bHZpZiwKIAkJCQkJYnNzX2NvbmYtPmh0X29wZXJhdGlvbl9tb2RlKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXdsMTI3MV93YXJuaW5nKCJTZXQgaHQgaW5mb3JtYXRpb24gZmFpbGVkICVkIiwgcmV0KTsKQEAgLTMzNTUsOCArMzU2OSw5IEBACiAJCQkJCXN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mLAogCQkJCQl1MzIgY2hhbmdlZCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAlib29sIGRvX2pvaW4gPSBmYWxzZSwgc2V0X2Fzc29jID0gZmFsc2U7Ci0JYm9vbCBpc19pYnNzID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9JQlNTKTsKKwlib29sIGlzX2lic3MgPSAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpOwogCWJvb2wgaWJzc19qb2luZWQgPSBmYWxzZTsKIAl1MzIgc3RhX3JhdGVfc2V0ID0gMDsKIAlpbnQgcmV0OwpAQCAtMzM3MywxNCArMzU4OCwxMyBAQAogCiAJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9JQlNTKSB7CiAJCWlmIChic3NfY29uZi0+aWJzc19qb2luZWQpIHsKLQkJCXNldF9iaXQoV0wxMjcxX0ZMQUdfSUJTU19KT0lORUQsICZ3bC0+ZmxhZ3MpOworCQkJc2V0X2JpdChXTFZJRl9GTEFHX0lCU1NfSk9JTkVELCAmd2x2aWYtPmZsYWdzKTsKIAkJCWlic3Nfam9pbmVkID0gdHJ1ZTsKIAkJfSBlbHNlIHsKLQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoV0wxMjcxX0ZMQUdfSUJTU19KT0lORUQsCi0JCQkJCSAgICAgICAmd2wtPmZsYWdzKSkgewotCQkJCXdsMTI3MV91bmpvaW4od2wpOwotCQkJCXdsMTJ4eF9jbWRfcm9sZV9zdGFydF9kZXYod2wpOwotCQkJCXdsMTJ4eF9yb2Mod2wsIHdsLT5kZXZfcm9sZV9pZCk7CisJCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KFdMVklGX0ZMQUdfSUJTU19KT0lORUQsCisJCQkJCSAgICAgICAmd2x2aWYtPmZsYWdzKSkgeworCQkJCXdsMTI3MV91bmpvaW4od2wsIHdsdmlmKTsKKwkJCQl3bDEyeHhfc3RhcnRfZGV2KHdsLCB3bHZpZik7CiAJCQl9CiAJCX0KIAl9CkBAIC0zMzk2LDQ2ICszNjEwLDQwIEBACiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19BREhPQywgImFkLWhvYyBiZWFjb25pbmc6ICVzIiwKIAkJCSAgICAgYnNzX2NvbmYtPmVuYWJsZV9iZWFjb24gPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKIAotCQlpZiAoYnNzX2NvbmYtPmVuYWJsZV9iZWFjb24pCi0JCQl3bC0+c2V0X2Jzc190eXBlID0gQlNTX1RZUEVfSUJTUzsKLQkJZWxzZQotCQkJd2wtPnNldF9ic3NfdHlwZSA9IEJTU19UWVBFX1NUQV9CU1M7CiAJCWRvX2pvaW4gPSB0cnVlOwogCX0KIAorCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfSURMRSkgeworCQlyZXQgPSB3bDEyNzFfc3RhX2hhbmRsZV9pZGxlKHdsLCB3bHZpZiwgYnNzX2NvbmYtPmlkbGUpOworCQlpZiAocmV0IDwgMCkKKwkJCXdsMTI3MV93YXJuaW5nKCJpZGxlIG1vZGUgY2hhbmdlIGZhaWxlZCAlZCIsIHJldCk7CisJfQorCiAJaWYgKChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQ1FNKSkgewogCQlib29sIGVuYWJsZSA9IGZhbHNlOwogCQlpZiAoYnNzX2NvbmYtPmNxbV9yc3NpX3Rob2xkKQogCQkJZW5hYmxlID0gdHJ1ZTsKLQkJcmV0ID0gd2wxMjcxX2FjeF9yc3NpX3Nucl90cmlnZ2VyKHdsLCBlbmFibGUsCisJCXJldCA9IHdsMTI3MV9hY3hfcnNzaV9zbnJfdHJpZ2dlcih3bCwgd2x2aWYsIGVuYWJsZSwKIAkJCQkJCSAgYnNzX2NvbmYtPmNxbV9yc3NpX3Rob2xkLAogCQkJCQkJICBic3NfY29uZi0+Y3FtX3Jzc2lfaHlzdCk7CiAJCWlmIChyZXQgPCAwKQogCQkJZ290byBvdXQ7Ci0JCXdsLT5yc3NpX3Rob2xkID0gYnNzX2NvbmYtPmNxbV9yc3NpX3Rob2xkOworCQl3bHZpZi0+cnNzaV90aG9sZCA9IGJzc19jb25mLT5jcW1fcnNzaV90aG9sZDsKIAl9CiAKLQlpZiAoKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CU1NJRCkgJiYKLQkgICAgLyoKLQkgICAgICogTm93IHdlIGtub3cgdGhlIGNvcnJlY3QgYnNzaWQsIHNvIHdlIHNlbmQgYSBuZXcgam9pbiBjb21tYW5kCi0JICAgICAqIGFuZCBlbmFibGUgdGhlIEJTU0lEIGZpbHRlcgotCSAgICAgKi8KLQkgICAgbWVtY21wKHdsLT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTikpIHsKLQkJbWVtY3B5KHdsLT5ic3NpZCwgYnNzX2NvbmYtPmJzc2lkLCBFVEhfQUxFTik7Ci0KLQkJaWYgKCFpc196ZXJvX2V0aGVyX2FkZHIod2wtPmJzc2lkKSkgewotCQkJcmV0ID0gd2wxMjcxX2NtZF9idWlsZF9udWxsX2RhdGEod2wpOworCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQlNTSUQpCisJCWlmICghaXNfemVyb19ldGhlcl9hZGRyKGJzc19jb25mLT5ic3NpZCkpIHsKKwkJCXJldCA9IHdsMTJ4eF9jbWRfYnVpbGRfbnVsbF9kYXRhKHdsLCB3bHZpZik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIAotCQkJcmV0ID0gd2wxMjcxX2J1aWxkX3Fvc19udWxsX2RhdGEod2wpOworCQkJcmV0ID0gd2wxMjcxX2J1aWxkX3Fvc19udWxsX2RhdGEod2wsIHZpZik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIAogCQkJLyogTmVlZCB0byB1cGRhdGUgdGhlIEJTU0lEIChmb3IgZmlsdGVyaW5nIGV0YykgKi8KIAkJCWRvX2pvaW4gPSB0cnVlOwogCQl9Ci0JfQogCiAJaWYgKGNoYW5nZWQgJiAoQlNTX0NIQU5HRURfQVNTT0MgfCBCU1NfQ0hBTkdFRF9IVCkpIHsKIAkJcmN1X3JlYWRfbG9jaygpOwpAQCAtMzQ1OSwyNiArMzY2NywyOCBAQAogCQlpZiAoYnNzX2NvbmYtPmFzc29jKSB7CiAJCQl1MzIgcmF0ZXM7CiAJCQlpbnQgaWVvZmZzZXQ7Ci0JCQl3bC0+YWlkID0gYnNzX2NvbmYtPmFpZDsKKwkJCXdsdmlmLT5haWQgPSBic3NfY29uZi0+YWlkOwogCQkJc2V0X2Fzc29jID0gdHJ1ZTsKIAotCQkJd2wtPnBzX3BvbGxfZmFpbHVyZXMgPSAwOworCQkJd2x2aWYtPnBzX3BvbGxfZmFpbHVyZXMgPSAwOwogCiAJCQkvKgogCQkJICogdXNlIGJhc2ljIHJhdGVzIGZyb20gQVAsIGFuZCBkZXRlcm1pbmUgbG93ZXN0IHJhdGUKIAkJCSAqIHRvIHVzZSB3aXRoIGNvbnRyb2wgZnJhbWVzLgogCQkJICovCiAJCQlyYXRlcyA9IGJzc19jb25mLT5iYXNpY19yYXRlczsKLQkJCXdsLT5iYXNpY19yYXRlX3NldCA9CisJCQl3bHZpZi0+YmFzaWNfcmF0ZV9zZXQgPQogCQkJCXdsMTI3MV90eF9lbmFibGVkX3JhdGVzX2dldCh3bCwgcmF0ZXMsCi0JCQkJCQkJICAgIHdsLT5iYW5kKTsKLQkJCXdsLT5iYXNpY19yYXRlID0KLQkJCQl3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOworCQkJCQkJCSAgICB3bHZpZi0+YmFuZCk7CisJCQl3bHZpZi0+YmFzaWNfcmF0ZSA9CisJCQkJd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwKKwkJCQkJCSAgICAgICB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOwogCQkJaWYgKHN0YV9yYXRlX3NldCkKLQkJCQl3bC0+cmF0ZV9zZXQgPSB3bDEyNzFfdHhfZW5hYmxlZF9yYXRlc19nZXQod2wsCisJCQkJd2x2aWYtPnJhdGVfc2V0ID0KKwkJCQkJd2wxMjcxX3R4X2VuYWJsZWRfcmF0ZXNfZ2V0KHdsLAogCQkJCQkJCQlzdGFfcmF0ZV9zZXQsCi0JCQkJCQkJCXdsLT5iYW5kKTsKLQkJCXJldCA9IHdsMTI3MV9hY3hfc3RhX3JhdGVfcG9saWNpZXMod2wpOworCQkJCQkJCQl3bHZpZi0+YmFuZCk7CisJCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsLCB3bHZpZik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIApAQCAtMzQ4OCw1MyArMzY5OCw1NiBAQAogCQkJICogdXBkYXRlcyBpdCBieSBpdHNlbGYgd2hlbiB0aGUgZmlyc3QgYmVhY29uIGlzCiAJCQkgKiByZWNlaXZlZCBhZnRlciBhIGpvaW4uCiAJCQkgKi8KLQkJCXJldCA9IHdsMTI3MV9jbWRfYnVpbGRfcHNfcG9sbCh3bCwgd2wtPmFpZCk7CisJCQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX3BzX3BvbGwod2wsIHdsdmlmLCB3bHZpZi0+YWlkKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gb3V0OwogCiAJCQkvKgogCQkJICogR2V0IGEgdGVtcGxhdGUgZm9yIGhhcmR3YXJlIGNvbm5lY3Rpb24gbWFpbnRlbmFuY2UKIAkJCSAqLwotCQkJZGV2X2tmcmVlX3NrYih3bC0+cHJvYmVyZXEpOwotCQkJd2wtPnByb2JlcmVxID0gd2wxMjcxX2NtZF9idWlsZF9hcF9wcm9iZV9yZXEod2wsIE5VTEwpOworCQkJZGV2X2tmcmVlX3NrYih3bHZpZi0+cHJvYmVyZXEpOworCQkJd2x2aWYtPnByb2JlcmVxID0gd2wxMjcxX2NtZF9idWlsZF9hcF9wcm9iZV9yZXEod2wsCisJCQkJCQkJCQl3bHZpZiwKKwkJCQkJCQkJCU5VTEwpOwogCQkJaWVvZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsCiAJCQkJCSAgICB1LnByb2JlX3JlcS52YXJpYWJsZSk7Ci0JCQl3bDEyNzFfc3NpZF9zZXQod2wsIHdsLT5wcm9iZXJlcSwgaWVvZmZzZXQpOworCQkJd2wxMjcxX3NzaWRfc2V0KHZpZiwgd2x2aWYtPnByb2JlcmVxLCBpZW9mZnNldCk7CiAKIAkJCS8qIGVuYWJsZSB0aGUgY29ubmVjdGlvbiBtb25pdG9yaW5nIGZlYXR1cmUgKi8KLQkJCXJldCA9IHdsMTI3MV9hY3hfY29ubl9tb25pdF9wYXJhbXMod2wsIHRydWUpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9jb25uX21vbml0X3BhcmFtcyh3bCwgd2x2aWYsIHRydWUpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CiAJCX0gZWxzZSB7CiAJCQkvKiB1c2UgZGVmYXVsdHMgd2hlbiBub3QgYXNzb2NpYXRlZCAqLwogCQkJYm9vbCB3YXNfYXNzb2MgPQotCQkJICAgICEhdGVzdF9hbmRfY2xlYXJfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELAotCQkJCQkJICZ3bC0+ZmxhZ3MpOworCQkJICAgICEhdGVzdF9hbmRfY2xlYXJfYml0KFdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsCisJCQkJCQkgJndsdmlmLT5mbGFncyk7CiAJCQlib29sIHdhc19pZnVwID0KLQkJCSAgICAhIXRlc3RfYW5kX2NsZWFyX2JpdChXTDEyNzFfRkxBR19TVEFfU1RBVEVfU0VOVCwKLQkJCQkJCSAmd2wtPmZsYWdzKTsKLQkJCXdsLT5haWQgPSAwOworCQkJICAgICEhdGVzdF9hbmRfY2xlYXJfYml0KFdMVklGX0ZMQUdfU1RBX1NUQVRFX1NFTlQsCisJCQkJCQkgJndsdmlmLT5mbGFncyk7CisJCQl3bHZpZi0+YWlkID0gMDsKIAogCQkJLyogZnJlZSBwcm9iZS1yZXF1ZXN0IHRlbXBsYXRlICovCi0JCQlkZXZfa2ZyZWVfc2tiKHdsLT5wcm9iZXJlcSk7Ci0JCQl3bC0+cHJvYmVyZXEgPSBOVUxMOworCQkJZGV2X2tmcmVlX3NrYih3bHZpZi0+cHJvYmVyZXEpOworCQkJd2x2aWYtPnByb2JlcmVxID0gTlVMTDsKIAogCQkJLyogcmUtZW5hYmxlIGR5bmFtaWMgcHMgLSBqdXN0IGluIGNhc2UgKi8KLQkJCWllZWU4MDIxMV9lbmFibGVfZHluX3BzKHdsLT52aWYpOworCQkJaWVlZTgwMjExX2VuYWJsZV9keW5fcHModmlmKTsKIAogCQkJLyogcmV2ZXJ0IGJhY2sgdG8gbWluaW11bSByYXRlcyBmb3IgdGhlIGN1cnJlbnQgYmFuZCAqLwotCQkJd2wxMjcxX3NldF9iYW5kX3JhdGUod2wpOwotCQkJd2wtPmJhc2ljX3JhdGUgPQotCQkJCXdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsLT5iYXNpY19yYXRlX3NldCk7Ci0JCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsKTsKKwkJCXdsMTI3MV9zZXRfYmFuZF9yYXRlKHdsLCB3bHZpZik7CisJCQl3bHZpZi0+YmFzaWNfcmF0ZSA9CisJCQkJd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwKKwkJCQkJCSAgICAgICB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyh3bCwgd2x2aWYpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CiAKIAkJCS8qIGRpc2FibGUgY29ubmVjdGlvbiBtb25pdG9yIGZlYXR1cmVzICovCi0JCQlyZXQgPSB3bDEyNzFfYWN4X2Nvbm5fbW9uaXRfcGFyYW1zKHdsLCBmYWxzZSk7CisJCQlyZXQgPSB3bDEyNzFfYWN4X2Nvbm5fbW9uaXRfcGFyYW1zKHdsLCB3bHZpZiwgZmFsc2UpOwogCiAJCQkvKiBEaXNhYmxlIHRoZSBrZWVwLWFsaXZlIGZlYXR1cmUgKi8KLQkJCXJldCA9IHdsMTI3MV9hY3hfa2VlcF9hbGl2ZV9tb2RlKHdsLCBmYWxzZSk7CisJCQlyZXQgPSB3bDEyNzFfYWN4X2tlZXBfYWxpdmVfbW9kZSh3bCwgd2x2aWYsIGZhbHNlKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCWdvdG8gb3V0OwogCkBAIC0zNTQ2LDcgKzM3NTksNyBAQAogCQkJCSAqIG5vIElGX09QRVJfVVAgbm90aWZpY2F0aW9uLgogCQkJCSAqLwogCQkJCWlmICghd2FzX2lmdXApIHsKLQkJCQkJcmV0ID0gd2wxMnh4X2Nyb2Mod2wsIHdsLT5yb2xlX2lkKTsKKwkJCQkJcmV0ID0gd2wxMnh4X2Nyb2Mod2wsIHdsdmlmLT5yb2xlX2lkKTsKIAkJCQkJaWYgKHJldCA8IDApCiAJCQkJCQlnb3RvIG91dDsKIAkJCQl9CkBAIC0zNTU1LDE3ICszNzY4LDE2IEBACiAJCQkJICogcm9hbWluZyBvbiB0aGUgc2FtZSBjaGFubmVsLiB1bnRpbCB3ZSB3aWxsCiAJCQkJICogaGF2ZSBhIGJldHRlciBmbG93Li4uKQogCQkJCSAqLwotCQkJCWlmICh0ZXN0X2JpdCh3bC0+ZGV2X3JvbGVfaWQsIHdsLT5yb2NfbWFwKSkgewotCQkJCQlyZXQgPSB3bDEyeHhfY3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKKwkJCQlpZiAodGVzdF9iaXQod2x2aWYtPmRldl9yb2xlX2lkLCB3bC0+cm9jX21hcCkpIHsKKwkJCQkJcmV0ID0gd2wxMnh4X2Nyb2Mod2wsCisJCQkJCQkJICB3bHZpZi0+ZGV2X3JvbGVfaWQpOwogCQkJCQlpZiAocmV0IDwgMCkKIAkJCQkJCWdvdG8gb3V0OwogCQkJCX0KIAotCQkJCXdsMTI3MV91bmpvaW4od2wpOwotCQkJCWlmICghKGNvbmZfZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9JRExFKSkgewotCQkJCQl3bDEyeHhfY21kX3JvbGVfc3RhcnRfZGV2KHdsKTsKLQkJCQkJd2wxMnh4X3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKLQkJCQl9CisJCQkJd2wxMjcxX3Vuam9pbih3bCwgd2x2aWYpOworCQkJCWlmICghKGNvbmZfZmxhZ3MgJiBJRUVFODAyMTFfQ09ORl9JRExFKSkKKwkJCQkJd2wxMnh4X3N0YXJ0X2Rldih3bCwgd2x2aWYpOwogCQkJfQogCQl9CiAJfQpAQCAtMzU3NiwyNyArMzc4OCwyOCBAQAogCiAJCWlmIChic3NfY29uZi0+aWJzc19qb2luZWQpIHsKIAkJCXUzMiByYXRlcyA9IGJzc19jb25mLT5iYXNpY19yYXRlczsKLQkJCXdsLT5iYXNpY19yYXRlX3NldCA9CisJCQl3bHZpZi0+YmFzaWNfcmF0ZV9zZXQgPQogCQkJCXdsMTI3MV90eF9lbmFibGVkX3JhdGVzX2dldCh3bCwgcmF0ZXMsCi0JCQkJCQkJICAgIHdsLT5iYW5kKTsKLQkJCXdsLT5iYXNpY19yYXRlID0KLQkJCQl3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+YmFzaWNfcmF0ZV9zZXQpOworCQkJCQkJCSAgICB3bHZpZi0+YmFuZCk7CisJCQl3bHZpZi0+YmFzaWNfcmF0ZSA9CisJCQkJd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwKKwkJCQkJCSAgICAgICB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOwogCiAJCQkvKiBieSBkZWZhdWx0LCB1c2UgMTFiICsgT0ZETSByYXRlcyAqLwotCQkJd2wtPnJhdGVfc2V0ID0gQ09ORl9UWF9JQlNTX0RFRkFVTFRfUkFURVM7Ci0JCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsKTsKKwkJCXdsdmlmLT5yYXRlX3NldCA9IENPTkZfVFhfSUJTU19ERUZBVUxUX1JBVEVTOworCQkJcmV0ID0gd2wxMjcxX2FjeF9zdGFfcmF0ZV9wb2xpY2llcyh3bCwgd2x2aWYpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CiAJCX0KIAl9CiAKLQlyZXQgPSB3bDEyNzFfYnNzX2VycF9pbmZvX2NoYW5nZWQod2wsIGJzc19jb25mLCBjaGFuZ2VkKTsKKwlyZXQgPSB3bDEyNzFfYnNzX2VycF9pbmZvX2NoYW5nZWQod2wsIHZpZiwgYnNzX2NvbmYsIGNoYW5nZWQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAogCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfQVJQX0ZJTFRFUikgewogCQlfX2JlMzIgYWRkciA9IGJzc19jb25mLT5hcnBfYWRkcl9saXN0WzBdOwotCQlXQVJOX09OKHdsLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9TVEFfQlNTKTsKKwkJV0FSTl9PTih3bHZpZi0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfU1RBX0JTUyk7CiAKIAkJaWYgKGJzc19jb25mLT5hcnBfYWRkcl9jbnQgPT0gMSAmJgogCQkgICAgYnNzX2NvbmYtPmFycF9maWx0ZXJfZW5hYmxlZCkgewpAQCAtMzYwNiwyNCArMzgxOSwyNCBAQAogCQkJICogaXNuJ3QgYmVpbmcgc2V0ICh3aGVuIHNlbmRpbmcpLCBzbyB3ZSBoYXZlIHRvCiAJCQkgKiByZWNvbmZpZ3VyZSB0aGUgdGVtcGxhdGUgdXBvbiBldmVyeSBpcCBjaGFuZ2UuCiAJCQkgKi8KLQkJCXJldCA9IHdsMTI3MV9jbWRfYnVpbGRfYXJwX3JzcCh3bCwgYWRkcik7CisJCQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX2FycF9yc3Aod2wsIHdsdmlmLCBhZGRyKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJd2wxMjcxX3dhcm5pbmcoImJ1aWxkIGFycCByc3AgZmFpbGVkOiAlZCIsIHJldCk7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAKLQkJCXJldCA9IHdsMTI3MV9hY3hfYXJwX2lwX2ZpbHRlcih3bCwKKwkJCXJldCA9IHdsMTI3MV9hY3hfYXJwX2lwX2ZpbHRlcih3bCwgd2x2aWYsCiAJCQkJQUNYX0FSUF9GSUxURVJfQVJQX0ZJTFRFUklORywKIAkJCQlhZGRyKTsKIAkJfSBlbHNlCi0JCQlyZXQgPSB3bDEyNzFfYWN4X2FycF9pcF9maWx0ZXIod2wsIDAsIGFkZHIpOworCQkJcmV0ID0gd2wxMjcxX2FjeF9hcnBfaXBfZmlsdGVyKHdsLCB3bHZpZiwgMCwgYWRkcik7CiAKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAoZG9fam9pbikgewotCQlyZXQgPSB3bDEyNzFfam9pbih3bCwgc2V0X2Fzc29jKTsKKwkJcmV0ID0gd2wxMjcxX2pvaW4od2wsIHdsdmlmLCBzZXRfYXNzb2MpOwogCQlpZiAocmV0IDwgMCkgewogCQkJd2wxMjcxX3dhcm5pbmcoImNtZCBqb2luIGZhaWxlZCAlZCIsIHJldCk7CiAJCQlnb3RvIG91dDsKQEAgLTM2MzEsMzUgKzM4NDQsMzEgQEAKIAogCQkvKiBST0MgdW50aWwgY29ubmVjdGVkIChhZnRlciBFQVBPTCBleGNoYW5nZSkgKi8KIAkJaWYgKCFpc19pYnNzKSB7Ci0JCQlyZXQgPSB3bDEyeHhfcm9jKHdsLCB3bC0+cm9sZV9pZCk7CisJCQlyZXQgPSB3bDEyeHhfcm9jKHdsLCB3bHZpZiwgd2x2aWYtPnJvbGVfaWQpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CiAKLQkJCXdsMTI3MV9jaGVja19vcGVyc3RhdGUod2wsCisJCQl3bDEyNzFfY2hlY2tfb3BlcnN0YXRlKHdsLCB3bHZpZiwKIAkJCQkJICAgICAgIGllZWU4MDIxMV9nZXRfb3BlcnN0YXRlKHZpZikpOwogCQl9CiAJCS8qCiAJCSAqIHN0b3AgZGV2aWNlIHJvbGUgaWYgc3RhcnRlZCAod2UgbWlnaHQgYWxyZWFkeSBiZSBpbgotCQkgKiBTVEEgcm9sZSkuIFRPRE86IG1ha2UgaXQgYmV0dGVyLgorCQkgKiBTVEEvSUJTUyByb2xlKS4KIAkJICovCi0JCWlmICh3bC0+ZGV2X3JvbGVfaWQgIT0gV0wxMlhYX0lOVkFMSURfUk9MRV9JRCkgewotCQkJcmV0ID0gd2wxMnh4X2Nyb2Mod2wsIHdsLT5kZXZfcm9sZV9pZCk7Ci0JCQlpZiAocmV0IDwgMCkKLQkJCQlnb3RvIG91dDsKLQotCQkJcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0b3BfZGV2KHdsKTsKKwkJaWYgKHdsMTJ4eF9kZXZfcm9sZV9zdGFydGVkKHdsdmlmKSkgeworCQkJcmV0ID0gd2wxMnh4X3N0b3BfZGV2KHdsLCB3bHZpZik7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKIAkJfQogCiAJCS8qIElmIHdlIHdhbnQgdG8gZ28gaW4gUFNNIGJ1dCB3ZSdyZSBub3QgdGhlcmUgeWV0ICovCi0JCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19QU01fUkVRVUVTVEVELCAmd2wtPmZsYWdzKSAmJgotCQkgICAgIXRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTSwgJndsLT5mbGFncykpIHsKKwkJaWYgKHRlc3RfYml0KFdMVklGX0ZMQUdfUFNNX1JFUVVFU1RFRCwgJndsdmlmLT5mbGFncykgJiYKKwkJICAgICF0ZXN0X2JpdChXTFZJRl9GTEFHX1BTTSwgJndsdmlmLT5mbGFncykpIHsKIAkJCWVudW0gd2wxMjcxX2NtZF9wc19tb2RlIG1vZGU7CiAKIAkJCW1vZGUgPSBTVEFUSU9OX1BPV0VSX1NBVkVfTU9ERTsKLQkJCXJldCA9IHdsMTI3MV9wc19zZXRfbW9kZSh3bCwgbW9kZSwKLQkJCQkJCSB3bC0+YmFzaWNfcmF0ZSwKKwkJCXJldCA9IHdsMTI3MV9wc19zZXRfbW9kZSh3bCwgd2x2aWYsIG1vZGUsCisJCQkJCQkgd2x2aWYtPmJhc2ljX3JhdGUsCiAJCQkJCQkgdHJ1ZSk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlnb3RvIG91dDsKQEAgLTM2NzMsNyArMzg4Miw3IEBACiAJCQlyZXQgPSB3bDEyNzFfYWN4X3NldF9odF9jYXBhYmlsaXRpZXMod2wsCiAJCQkJCQkJICAgICAmc3RhX2h0X2NhcCwKIAkJCQkJCQkgICAgIHRydWUsCi0JCQkJCQkJICAgICB3bC0+c3RhX2hsaWQpOworCQkJCQkJCSAgICAgd2x2aWYtPnN0YS5obGlkKTsKIAkJCWlmIChyZXQgPCAwKSB7CiAJCQkJd2wxMjcxX3dhcm5pbmcoIlNldCBodCBjYXAgdHJ1ZSBmYWlsZWQgJWQiLAogCQkJCQkgICAgICAgcmV0KTsKQEAgLTM2ODUsNyArMzg5NCw3IEBACiAJCQlyZXQgPSB3bDEyNzFfYWN4X3NldF9odF9jYXBhYmlsaXRpZXMod2wsCiAJCQkJCQkJICAgICAmc3RhX2h0X2NhcCwKIAkJCQkJCQkgICAgIGZhbHNlLAotCQkJCQkJCSAgICAgd2wtPnN0YV9obGlkKTsKKwkJCQkJCQkgICAgIHdsdmlmLT5zdGEuaGxpZCk7CiAJCQlpZiAocmV0IDwgMCkgewogCQkJCXdsMTI3MV93YXJuaW5nKCJTZXQgaHQgY2FwIGZhbHNlIGZhaWxlZCAlZCIsCiAJCQkJCSAgICAgICByZXQpOwpAQCAtMzY5Nyw3ICszOTA2LDcgQEAKIAkvKiBIYW5kbGUgSFQgaW5mb3JtYXRpb24gY2hhbmdlLiBEb25lIGFmdGVyIGpvaW4uICovCiAJaWYgKChjaGFuZ2VkICYgQlNTX0NIQU5HRURfSFQpICYmCiAJICAgIChic3NfY29uZi0+Y2hhbm5lbF90eXBlICE9IE5MODAyMTFfQ0hBTl9OT19IVCkpIHsKLQkJcmV0ID0gd2wxMjcxX2FjeF9zZXRfaHRfaW5mb3JtYXRpb24od2wsCisJCXJldCA9IHdsMTI3MV9hY3hfc2V0X2h0X2luZm9ybWF0aW9uKHdsLCB3bHZpZiwKIAkJCQkJYnNzX2NvbmYtPmh0X29wZXJhdGlvbl9tb2RlKTsKIAkJaWYgKHJldCA8IDApIHsKIAkJCXdsMTI3MV93YXJuaW5nKCJTZXQgaHQgaW5mb3JtYXRpb24gZmFpbGVkICVkIiwgcmV0KTsKQEAgLTM3MTUsNyArMzkyNCw4IEBACiAJCQkJICAgICAgIHUzMiBjaGFuZ2VkKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7Ci0JYm9vbCBpc19hcCA9ICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKTsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKKwlib29sIGlzX2FwID0gKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpOwogCWludCByZXQ7CiAKIAl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsICJtYWM4MDIxMSBic3MgaW5mbyBjaGFuZ2VkIDB4JXgiLApAQCAtMzcyNiw2ICszOTM2LDkgQEAKIAlpZiAodW5saWtlbHkod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpKQogCQlnb3RvIG91dDsKIAorCWlmICh1bmxpa2VseSghdGVzdF9iaXQoV0xWSUZfRkxBR19JTklUSUFMSVpFRCwgJndsdmlmLT5mbGFncykpKQorCQlnb3RvIG91dDsKKwogCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXQ7CkBAIC0zNzQ2LDYgKzM5NTksNyBAQAogCQkJICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1ZXVlX3BhcmFtcyAqcGFyYW1zKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CiAJdTggcHNfc2NoZW1lOwogCWludCByZXQgPSAwOwogCkBAIC0zNzU4LDMxICszOTcyLDggQEAKIAllbHNlCiAJCXBzX3NjaGVtZSA9IENPTkZfUFNfU0NIRU1FX0xFR0FDWTsKIAotCWlmICh3bC0+c3RhdGUgPT0gV0wxMjcxX1NUQVRFX09GRikgewotCQkvKgotCQkgKiBJZiB0aGUgc3RhdGUgaXMgb2ZmLCB0aGUgcGFyYW1ldGVycyB3aWxsIGJlIHJlY29yZGVkIGFuZAotCQkgKiBjb25maWd1cmVkIG9uIGluaXQuIFRoaXMgaGFwcGVucyBpbiBBUC1tb2RlLgotCQkgKi8KLQkJc3RydWN0IGNvbmZfdHhfYWNfY2F0ZWdvcnkgKmNvbmZfYWMgPQotCQkJJndsLT5jb25mLnR4LmFjX2NvbmZbd2wxMjcxX3R4X2dldF9xdWV1ZShxdWV1ZSldOwotCQlzdHJ1Y3QgY29uZl90eF90aWQgKmNvbmZfdGlkID0KLQkJCSZ3bC0+Y29uZi50eC50aWRfY29uZlt3bDEyNzFfdHhfZ2V0X3F1ZXVlKHF1ZXVlKV07Ci0KLQkJY29uZl9hYy0+YWMgPSB3bDEyNzFfdHhfZ2V0X3F1ZXVlKHF1ZXVlKTsKLQkJY29uZl9hYy0+Y3dfbWluID0gKHU4KXBhcmFtcy0+Y3dfbWluOwotCQljb25mX2FjLT5jd19tYXggPSBwYXJhbXMtPmN3X21heDsKLQkJY29uZl9hYy0+YWlmc24gPSBwYXJhbXMtPmFpZnM7Ci0JCWNvbmZfYWMtPnR4X29wX2xpbWl0ID0gcGFyYW1zLT50eG9wIDw8IDU7Ci0KLQkJY29uZl90aWQtPnF1ZXVlX2lkID0gd2wxMjcxX3R4X2dldF9xdWV1ZShxdWV1ZSk7Ci0JCWNvbmZfdGlkLT5jaGFubmVsX3R5cGUgPSBDT05GX0NIQU5ORUxfVFlQRV9FRENGOwotCQljb25mX3RpZC0+dHNpZCA9IHdsMTI3MV90eF9nZXRfcXVldWUocXVldWUpOwotCQljb25mX3RpZC0+cHNfc2NoZW1lID0gcHNfc2NoZW1lOwotCQljb25mX3RpZC0+YWNrX3BvbGljeSA9IENPTkZfQUNLX1BPTElDWV9MRUdBQ1k7Ci0JCWNvbmZfdGlkLT5hcHNkX2NvbmZbMF0gPSAwOwotCQljb25mX3RpZC0+YXBzZF9jb25mWzFdID0gMDsKKwlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfSU5JVElBTElaRUQsICZ3bHZpZi0+ZmxhZ3MpKQogCQlnb3RvIG91dDsKLQl9CiAKIAlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CiAJaWYgKHJldCA8IDApCkBAIC0zNzkyLDEzICszOTgzLDEzIEBACiAJICogdGhlIHR4b3AgaXMgY29uZmVkIGluIHVuaXRzIG9mIDMydXMgYnkgdGhlIG1hYzgwMjExLAogCSAqIHdlIG5lZWQgdXMKIAkgKi8KLQlyZXQgPSB3bDEyNzFfYWN4X2FjX2NmZyh3bCwgd2wxMjcxX3R4X2dldF9xdWV1ZShxdWV1ZSksCisJcmV0ID0gd2wxMjcxX2FjeF9hY19jZmcod2wsIHdsdmlmLCB3bDEyNzFfdHhfZ2V0X3F1ZXVlKHF1ZXVlKSwKIAkJCQlwYXJhbXMtPmN3X21pbiwgcGFyYW1zLT5jd19tYXgsCiAJCQkJcGFyYW1zLT5haWZzLCBwYXJhbXMtPnR4b3AgPDwgNSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0X3NsZWVwOwogCi0JcmV0ID0gd2wxMjcxX2FjeF90aWRfY2ZnKHdsLCB3bDEyNzFfdHhfZ2V0X3F1ZXVlKHF1ZXVlKSwKKwlyZXQgPSB3bDEyNzFfYWN4X3RpZF9jZmcod2wsIHdsdmlmLCB3bDEyNzFfdHhfZ2V0X3F1ZXVlKHF1ZXVlKSwKIAkJCQkgQ09ORl9DSEFOTkVMX1RZUEVfRURDRiwKIAkJCQkgd2wxMjcxX3R4X2dldF9xdWV1ZShxdWV1ZSksCiAJCQkJIHBzX3NjaGVtZSwgQ09ORl9BQ0tfUE9MSUNZX0xFR0FDWSwKQEAgLTM4NjEsNDMgKzQwNTIsNDMgQEAKIH0KIAogc3RhdGljIGludCB3bDEyNzFfYWxsb2NhdGVfc3RhKHN0cnVjdCB3bDEyNzEgKndsLAotCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAotCQkJICAgICB1OCAqaGxpZCkKKwkJCSAgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewogCXN0cnVjdCB3bDEyNzFfc3RhdGlvbiAqd2xfc3RhOwotCWludCBpZDsKKwlpbnQgcmV0OwogCi0JaWQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KHdsLT5hcF9obGlkX21hcCwgQVBfTUFYX1NUQVRJT05TKTsKLQlpZiAoaWQgPj0gQVBfTUFYX1NUQVRJT05TKSB7CisKKwlpZiAod2wtPmFjdGl2ZV9zdGFfY291bnQgPj0gQVBfTUFYX1NUQVRJT05TKSB7CiAJCXdsMTI3MV93YXJuaW5nKCJjb3VsZCBub3QgYWxsb2NhdGUgSExJRCAtIHRvbyBtdWNoIHN0YXRpb25zIik7CiAJCXJldHVybiAtRUJVU1k7CiAJfQogCiAJd2xfc3RhID0gKHN0cnVjdCB3bDEyNzFfc3RhdGlvbiAqKXN0YS0+ZHJ2X3ByaXY7Ci0Jc2V0X2JpdChpZCwgd2wtPmFwX2hsaWRfbWFwKTsKLQl3bF9zdGEtPmhsaWQgPSBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQgKyBpZDsKLQkqaGxpZCA9IHdsX3N0YS0+aGxpZDsKKwlyZXQgPSB3bDEyeHhfYWxsb2NhdGVfbGluayh3bCwgd2x2aWYsICZ3bF9zdGEtPmhsaWQpOworCWlmIChyZXQgPCAwKSB7CisJCXdsMTI3MV93YXJuaW5nKCJjb3VsZCBub3QgYWxsb2NhdGUgSExJRCAtIHRvbyBtYW55IGxpbmtzIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJc2V0X2JpdCh3bF9zdGEtPmhsaWQsIHdsdmlmLT5hcC5zdGFfaGxpZF9tYXApOwogCW1lbWNweSh3bC0+bGlua3Nbd2xfc3RhLT5obGlkXS5hZGRyLCBzdGEtPmFkZHIsIEVUSF9BTEVOKTsKIAl3bC0+YWN0aXZlX3N0YV9jb3VudCsrOwogCXJldHVybiAwOwogfQogCi12b2lkIHdsMTI3MV9mcmVlX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCkKK3ZvaWQgd2wxMjcxX2ZyZWVfc3RhKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsIHU4IGhsaWQpCiB7Ci0JaW50IGlkID0gaGxpZCAtIFdMMTI3MV9BUF9TVEFfSExJRF9TVEFSVDsKLQotCWlmIChobGlkIDwgV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUKQorCWlmICghdGVzdF9iaXQoaGxpZCwgd2x2aWYtPmFwLnN0YV9obGlkX21hcCkpCiAJCXJldHVybjsKIAotCWlmICghdGVzdF9iaXQoaWQsIHdsLT5hcF9obGlkX21hcCkpCi0JCXJldHVybjsKLQotCWNsZWFyX2JpdChpZCwgd2wtPmFwX2hsaWRfbWFwKTsKKwljbGVhcl9iaXQoaGxpZCwgd2x2aWYtPmFwLnN0YV9obGlkX21hcCk7CiAJbWVtc2V0KHdsLT5saW5rc1tobGlkXS5hZGRyLCAwLCBFVEhfQUxFTik7CiAJd2wtPmxpbmtzW2hsaWRdLmJhX2JpdG1hcCA9IDA7CiAJd2wxMjcxX3R4X3Jlc2V0X2xpbmtfcXVldWVzKHdsLCBobGlkKTsKIAlfX2NsZWFyX2JpdChobGlkLCAmd2wtPmFwX3BzX21hcCk7CiAJX19jbGVhcl9iaXQoaGxpZCwgKHVuc2lnbmVkIGxvbmcgKikmd2wtPmFwX2Z3X3BzX21hcCk7CisJd2wxMnh4X2ZyZWVfbGluayh3bCwgd2x2aWYsICZobGlkKTsKIAl3bC0+YWN0aXZlX3N0YV9jb3VudC0tOwogfQogCkBAIC0zOTA2LDYgKzQwOTcsOCBAQAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogewogCXN0cnVjdCB3bDEyNzEgKndsID0gaHctPnByaXY7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CisJc3RydWN0IHdsMTI3MV9zdGF0aW9uICp3bF9zdGE7CiAJaW50IHJldCA9IDA7CiAJdTggaGxpZDsKIApAQCAtMzkxNCwyMCArNDEwNywyMyBAQAogCWlmICh1bmxpa2VseSh3bC0+c3RhdGUgPT0gV0wxMjcxX1NUQVRFX09GRikpCiAJCWdvdG8gb3V0OwogCi0JaWYgKHdsLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9BUF9CU1MpCisJaWYgKHdsdmlmLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9BUF9CU1MpCiAJCWdvdG8gb3V0OwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAibWFjODAyMTEgYWRkIHN0YSAlZCIsIChpbnQpc3RhLT5haWQpOwogCi0JcmV0ID0gd2wxMjcxX2FsbG9jYXRlX3N0YSh3bCwgc3RhLCAmaGxpZCk7CisJcmV0ID0gd2wxMjcxX2FsbG9jYXRlX3N0YSh3bCwgd2x2aWYsIHN0YSk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCisJd2xfc3RhID0gKHN0cnVjdCB3bDEyNzFfc3RhdGlvbiAqKXN0YS0+ZHJ2X3ByaXY7CisJaGxpZCA9IHdsX3N0YS0+aGxpZDsKKwogCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKIAlpZiAocmV0IDwgMCkKIAkJZ290byBvdXRfZnJlZV9zdGE7CiAKLQlyZXQgPSB3bDEyeHhfY21kX2FkZF9wZWVyKHdsLCBzdGEsIGhsaWQpOworCXJldCA9IHdsMTJ4eF9jbWRfYWRkX3BlZXIod2wsIHdsdmlmLCBzdGEsIGhsaWQpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9zbGVlcDsKIApAQCAtMzk0NCw3ICs0MTQwLDcgQEAKIAogb3V0X2ZyZWVfc3RhOgogCWlmIChyZXQgPCAwKQotCQl3bDEyNzFfZnJlZV9zdGEod2wsIGhsaWQpOworCQl3bDEyNzFfZnJlZV9zdGEod2wsIHdsdmlmLCBobGlkKTsKIAogb3V0OgogCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKQEAgLTM5NTYsNiArNDE1Miw3IEBACiAJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOwogCXN0cnVjdCB3bDEyNzFfc3RhdGlvbiAqd2xfc3RhOwogCWludCByZXQgPSAwLCBpZDsKIApAQCAtMzk2NCwxNCArNDE2MSwxNCBAQAogCWlmICh1bmxpa2VseSh3bC0+c3RhdGUgPT0gV0wxMjcxX1NUQVRFX09GRikpCiAJCWdvdG8gb3V0OwogCi0JaWYgKHdsLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9BUF9CU1MpCisJaWYgKHdsdmlmLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9BUF9CU1MpCiAJCWdvdG8gb3V0OwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAibWFjODAyMTEgcmVtb3ZlIHN0YSAlZCIsIChpbnQpc3RhLT5haWQpOwogCiAJd2xfc3RhID0gKHN0cnVjdCB3bDEyNzFfc3RhdGlvbiAqKXN0YS0+ZHJ2X3ByaXY7Ci0JaWQgPSB3bF9zdGEtPmhsaWQgLSBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQ7Ci0JaWYgKFdBUk5fT04oIXRlc3RfYml0KGlkLCB3bC0+YXBfaGxpZF9tYXApKSkKKwlpZCA9IHdsX3N0YS0+aGxpZDsKKwlpZiAoV0FSTl9PTighdGVzdF9iaXQoaWQsIHdsdmlmLT5hcC5zdGFfaGxpZF9tYXApKSkKIAkJZ290byBvdXQ7CiAKIAlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CkBAIC0zOTgyLDcgKzQxNzksNyBAQAogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dF9zbGVlcDsKIAotCXdsMTI3MV9mcmVlX3N0YSh3bCwgd2xfc3RhLT5obGlkKTsKKwl3bDEyNzFfZnJlZV9zdGEod2wsIHdsdmlmLCB3bF9zdGEtPmhsaWQpOwogCiBvdXRfc2xlZXA6CiAJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CkBAIC0zOTk5LDYgKzQxOTYsNyBAQAogCQkJCSAgdTggYnVmX3NpemUpCiB7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAlpbnQgcmV0OwogCXU4IGhsaWQsICpiYV9iaXRtYXA7CiAKQEAgLTQwMTYsMTAgKzQyMTQsMTAgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKSB7Ci0JCWhsaWQgPSB3bC0+c3RhX2hsaWQ7Ci0JCWJhX2JpdG1hcCA9ICZ3bC0+YmFfcnhfYml0bWFwOwotCX0gZWxzZSBpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykgeworCWlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfU1RBX0JTUykgeworCQlobGlkID0gd2x2aWYtPnN0YS5obGlkOworCQliYV9iaXRtYXAgPSAmd2x2aWYtPnN0YS5iYV9yeF9iaXRtYXA7CisJfSBlbHNlIGlmICh3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKSB7CiAJCXN0cnVjdCB3bDEyNzFfc3RhdGlvbiAqd2xfc3RhOwogCiAJCXdsX3N0YSA9IChzdHJ1Y3Qgd2wxMjcxX3N0YXRpb24gKilzdGEtPmRydl9wcml2OwpAQCAtNDAzOSw3ICs0MjM3LDcgQEAKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6Ci0JCWlmICghd2wtPmJhX3N1cHBvcnQgfHwgIXdsLT5iYV9hbGxvd2VkKSB7CisJCWlmICghd2x2aWYtPmJhX3N1cHBvcnQgfHwgIXdsdmlmLT5iYV9hbGxvd2VkKSB7CiAJCQlyZXQgPSAtRU5PVFNVUFA7CiAJCQlicmVhazsKIAkJfQpAQCAtNDEwOCw4ICs0MzA2LDkgQEAKIAkJCQkgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAogCQkJCSAgIGNvbnN0IHN0cnVjdCBjZmc4MDIxMV9iaXRyYXRlX21hc2sgKm1hc2spCiB7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKHZpZik7CiAJc3RydWN0IHdsMTI3MSAqd2wgPSBody0+cHJpdjsKLQlpbnQgaTsKKwlpbnQgaSwgcmV0ID0gMDsKIAogCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIm1hYzgwMjExIHNldF9iaXRyYXRlX21hc2sgMHgleCAweCV4IiwKIAkJbWFzay0+Y29udHJvbFtOTDgwMjExX0JBTkRfMkdIWl0ubGVnYWN5LApAQCAtNDExOCwxOSArNDMxNywzOSBAQAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgaSsrKQotCQl3bC0+Yml0cmF0ZV9tYXNrc1tpXSA9CisJCXdsdmlmLT5iaXRyYXRlX21hc2tzW2ldID0KIAkJCXdsMTI3MV90eF9lbmFibGVkX3JhdGVzX2dldCh3bCwKIAkJCQkJCSAgICBtYXNrLT5jb250cm9sW2ldLmxlZ2FjeSwKIAkJCQkJCSAgICBpKTsKKworCWlmICh1bmxpa2VseSh3bC0+c3RhdGUgPT0gV0wxMjcxX1NUQVRFX09GRikpCisJCWdvdG8gb3V0OworCisJaWYgKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTICYmCisJICAgICF0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKSkgeworCisJCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dDsKKworCQl3bDEyNzFfc2V0X2JhbmRfcmF0ZSh3bCwgd2x2aWYpOworCQl3bHZpZi0+YmFzaWNfcmF0ZSA9CisJCQl3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bHZpZi0+YmFzaWNfcmF0ZV9zZXQpOworCQlyZXQgPSB3bDEyNzFfYWN4X3N0YV9yYXRlX3BvbGljaWVzKHdsLCB3bHZpZik7CisKKwkJd2wxMjcxX3BzX2VscF9zbGVlcCh3bCk7CisJfQorb3V0OgogCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyB2b2lkIHdsMTJ4eF9vcF9jaGFubmVsX3N3aXRjaChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbF9zd2l0Y2ggKmNoX3N3aXRjaCkKIHsKIAlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGh3LT5wcml2OworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlpbnQgcmV0OwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX01BQzgwMjExLCAibWFjODAyMTEgY2hhbm5lbCBzd2l0Y2giKTsKQEAgLTQxMzgsMTkgKzQzNTcsMjQgQEAKIAltdXRleF9sb2NrKCZ3bC0+bXV0ZXgpOwogCiAJaWYgKHVubGlrZWx5KHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGKSkgewotCQltdXRleF91bmxvY2soJndsLT5tdXRleCk7Ci0JCWllZWU4MDIxMV9jaHN3aXRjaF9kb25lKHdsLT52aWYsIGZhbHNlKTsKLQkJcmV0dXJuOworCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikgeworCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOworCQkJaWVlZTgwMjExX2Noc3dpdGNoX2RvbmUodmlmLCBmYWxzZSk7CisJCX0KKwkJZ290byBvdXQ7CiAJfQogCiAJcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wpOwogCWlmIChyZXQgPCAwKQogCQlnb3RvIG91dDsKIAotCXJldCA9IHdsMTJ4eF9jbWRfY2hhbm5lbF9zd2l0Y2god2wsIGNoX3N3aXRjaCk7CisJLyogVE9ETzogY2hhbmdlIG1hYzgwMjExIHRvIHBhc3MgdmlmIGFzIHBhcmFtICovCisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX3N0YSh3bCwgd2x2aWYpIHsKKwkJcmV0ID0gd2wxMnh4X2NtZF9jaGFubmVsX3N3aXRjaCh3bCwgY2hfc3dpdGNoKTsKIAotCWlmICghcmV0KQotCQlzZXRfYml0KFdMMTI3MV9GTEFHX0NTX1BST0dSRVNTLCAmd2wtPmZsYWdzKTsKKwkJaWYgKCFyZXQpCisJCQlzZXRfYml0KFdMVklGX0ZMQUdfQ1NfUFJPR1JFU1MsICZ3bHZpZi0+ZmxhZ3MpOworCX0KIAogCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOwogCkBAIC00MTcwLDEwICs0Mzk0LDYgQEAKIAogCS8qIHBhY2tldHMgYXJlIGNvbnNpZGVyZWQgcGVuZGluZyBpZiBpbiB0aGUgVFggcXVldWUgb3IgdGhlIEZXICovCiAJcmV0ID0gKHdsMTI3MV90eF90b3RhbF9xdWV1ZV9jb3VudCh3bCkgPiAwKSB8fCAod2wtPnR4X2ZyYW1lc19jbnQgPiAwKTsKLQotCS8qIHRoZSBhYm92ZSBpcyBhcHByb3ByaWF0ZSBmb3IgU1RBIG1vZGUgZm9yIFBTIHB1cnBvc2VzICovCi0JV0FSTl9PTih3bC0+YnNzX3R5cGUgIT0gQlNTX1RZUEVfU1RBX0JTUyk7Ci0KIG91dDoKIAltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiAKQEAgLTQ0MTAsNiArNDYzMCw3IEBACiAJLnN0b3AgPSB3bDEyNzFfb3Bfc3RvcCwKIAkuYWRkX2ludGVyZmFjZSA9IHdsMTI3MV9vcF9hZGRfaW50ZXJmYWNlLAogCS5yZW1vdmVfaW50ZXJmYWNlID0gd2wxMjcxX29wX3JlbW92ZV9pbnRlcmZhY2UsCisJLmNoYW5nZV9pbnRlcmZhY2UgPSB3bDEyeHhfb3BfY2hhbmdlX2ludGVyZmFjZSwKICNpZmRlZiBDT05GSUdfUE0KIAkuc3VzcGVuZCA9IHdsMTI3MV9vcF9zdXNwZW5kLAogCS5yZXN1bWUgPSB3bDEyNzFfb3BfcmVzdW1lLApAQCAtNDYwNCw3ICs0ODI1LDcgQEAKIAkucmVhZCA9IHdsMTI3MV9zeXNmc19yZWFkX2Z3bG9nLAogfTsKIAotaW50IHdsMTI3MV9yZWdpc3Rlcl9odyhzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBpbnQgd2wxMjcxX3JlZ2lzdGVyX2h3KHN0cnVjdCB3bDEyNzEgKndsKQogewogCWludCByZXQ7CiAKQEAgLTQ2NDUsOSArNDg2Niw4IEBACiAKIAlyZXR1cm4gMDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHdsMTI3MV9yZWdpc3Rlcl9odyk7CiAKLXZvaWQgd2wxMjcxX3VucmVnaXN0ZXJfaHcoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgdm9pZCB3bDEyNzFfdW5yZWdpc3Rlcl9odyhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAlpZiAod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9QTFQpCiAJCV9fd2wxMjcxX3BsdF9zdG9wKHdsKTsKQEAgLTQ2NTcsOSArNDg3Nyw4IEBACiAJd2wtPm1hYzgwMjExX3JlZ2lzdGVyZWQgPSBmYWxzZTsKIAogfQotRVhQT1JUX1NZTUJPTF9HUEwod2wxMjcxX3VucmVnaXN0ZXJfaHcpOwogCi1pbnQgd2wxMjcxX2luaXRfaWVlZTgwMjExKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfaW5pdF9pZWVlODAyMTEoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJc3RhdGljIGNvbnN0IHUzMiBjaXBoZXJfc3VpdGVzW10gPSB7CiAJCVdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwLApAQCAtNDczNiwyNyArNDk1NSwzMyBAQAogCiAJd2wtPmh3LT53aXBoeS0+cmVnX25vdGlmaWVyID0gd2wxMjcxX3JlZ19ub3RpZnk7CiAKLQlTRVRfSUVFRTgwMjExX0RFVih3bC0+aHcsIHdsMTI3MV93bF90b19kZXYod2wpKTsKKwkvKiB0aGUgRlcgYW5zd2VycyBwcm9iZS1yZXF1ZXN0cyBpbiBBUC1tb2RlICovCisJd2wtPmh3LT53aXBoeS0+ZmxhZ3MgfD0gV0lQSFlfRkxBR19BUF9QUk9CRV9SRVNQX09GRkxPQUQ7CisJd2wtPmh3LT53aXBoeS0+cHJvYmVfcmVzcF9vZmZsb2FkID0KKwkJTkw4MDIxMV9QUk9CRV9SRVNQX09GRkxPQURfU1VQUE9SVF9XUFMgfAorCQlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1dQUzIgfAorCQlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1AyUDsKKworCVNFVF9JRUVFODAyMTFfREVWKHdsLT5odywgd2wtPmRldik7CiAKIAl3bC0+aHctPnN0YV9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHdsMTI3MV9zdGF0aW9uKTsKKwl3bC0+aHctPnZpZl9kYXRhX3NpemUgPSBzaXplb2Yoc3RydWN0IHdsMTJ4eF92aWYpOwogCiAJd2wtPmh3LT5tYXhfcnhfYWdncmVnYXRpb25fc3ViZnJhbWVzID0gODsKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwod2wxMjcxX2luaXRfaWVlZTgwMjExKTsKIAogI2RlZmluZSBXTDEyNzFfREVGQVVMVF9DSEFOTkVMIDAKIAotc3RydWN0IGllZWU4MDIxMV9odyAqd2wxMjcxX2FsbG9jX2h3KHZvaWQpCitzdGF0aWMgc3RydWN0IGllZWU4MDIxMV9odyAqd2wxMjcxX2FsbG9jX2h3KHZvaWQpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9kZXYgPSBOVUxMOwogCXN0cnVjdCB3bDEyNzEgKndsOwogCWludCBpLCBqLCByZXQ7CiAJdW5zaWduZWQgaW50IG9yZGVyOwogCi0JQlVJTERfQlVHX09OKEFQX01BWF9MSU5LUyA+IFdMMTJYWF9NQVhfTElOS1MpOworCUJVSUxEX0JVR19PTihBUF9NQVhfU1RBVElPTlMgPiBXTDEyWFhfTUFYX0xJTktTKTsKIAogCWh3ID0gaWVlZTgwMjExX2FsbG9jX2h3KHNpemVvZigqd2wpLCAmd2wxMjcxX29wcyk7CiAJaWYgKCFodykgewpAQCAtNDc2NSw0MSArNDk5MCwyNiBAQAogCQlnb3RvIGVycl9od19hbGxvYzsKIAl9CiAKLQlwbGF0X2RldiA9IGttZW1kdXAoJndsMTI3MV9kZXZpY2UsIHNpemVvZih3bDEyNzFfZGV2aWNlKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwbGF0X2RldikgewotCQl3bDEyNzFfZXJyb3IoImNvdWxkIG5vdCBhbGxvY2F0ZSBwbGF0Zm9ybV9kZXZpY2UiKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfcGxhdF9hbGxvYzsKLQl9Ci0KIAl3bCA9IGh3LT5wcml2OwogCW1lbXNldCh3bCwgMCwgc2l6ZW9mKCp3bCkpOwogCiAJSU5JVF9MSVNUX0hFQUQoJndsLT5saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmd2wtPndsdmlmX2xpc3QpOwogCiAJd2wtPmh3ID0gaHc7Ci0Jd2wtPnBsYXRfZGV2ID0gcGxhdF9kZXY7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKQotCQlza2JfcXVldWVfaGVhZF9pbml0KCZ3bC0+dHhfcXVldWVbaV0pOwotCi0JZm9yIChpID0gMDsgaSA8IE5VTV9UWF9RVUVVRVM7IGkrKykKLQkJZm9yIChqID0gMDsgaiA8IEFQX01BWF9MSU5LUzsgaisrKQorCQlmb3IgKGogPSAwOyBqIDwgV0wxMlhYX01BWF9MSU5LUzsgaisrKQogCQkJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmd2wtPmxpbmtzW2pdLnR4X3F1ZXVlW2ldKTsKIAogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJndsLT5kZWZlcnJlZF9yeF9xdWV1ZSk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmd2wtPmRlZmVycmVkX3R4X3F1ZXVlKTsKIAogCUlOSVRfREVMQVlFRF9XT1JLKCZ3bC0+ZWxwX3dvcmssIHdsMTI3MV9lbHBfd29yayk7Ci0JSU5JVF9ERUxBWUVEX1dPUksoJndsLT5wc3BvbGxfd29yaywgd2wxMjcxX3BzcG9sbF93b3JrKTsKIAlJTklUX1dPUksoJndsLT5uZXRzdGFja193b3JrLCB3bDEyNzFfbmV0c3RhY2tfd29yayk7CiAJSU5JVF9XT1JLKCZ3bC0+dHhfd29yaywgd2wxMjcxX3R4X3dvcmspOwogCUlOSVRfV09SSygmd2wtPnJlY292ZXJ5X3dvcmssIHdsMTI3MV9yZWNvdmVyeV93b3JrKTsKIAlJTklUX0RFTEFZRURfV09SSygmd2wtPnNjYW5fY29tcGxldGVfd29yaywgd2wxMjcxX3NjYW5fY29tcGxldGVfd29yayk7Ci0JSU5JVF9XT1JLKCZ3bC0+cnhfc3RyZWFtaW5nX2VuYWJsZV93b3JrLAotCQkgIHdsMTI3MV9yeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmspOwotCUlOSVRfV09SSygmd2wtPnJ4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmssCi0JCSAgd2wxMjcxX3J4X3N0cmVhbWluZ19kaXNhYmxlX3dvcmspOwogCiAJd2wtPmZyZWV6YWJsZV93cSA9IGNyZWF0ZV9mcmVlemFibGVfd29ya3F1ZXVlKCJ3bDEyeHhfd3EiKTsKIAlpZiAoIXdsLT5mcmVlemFibGVfd3EpIHsKQEAgLTQ4MDgsNDEgKzUwMTgsMjEgQEAKIAl9CiAKIAl3bC0+Y2hhbm5lbCA9IFdMMTI3MV9ERUZBVUxUX0NIQU5ORUw7Ci0Jd2wtPmJlYWNvbl9pbnQgPSBXTDEyNzFfREVGQVVMVF9CRUFDT05fSU5UOwotCXdsLT5kZWZhdWx0X2tleSA9IDA7CiAJd2wtPnJ4X2NvdW50ZXIgPSAwOwotCXdsLT5wc21fZW50cnlfcmV0cnkgPSAwOwogCXdsLT5wb3dlcl9sZXZlbCA9IFdMMTI3MV9ERUZBVUxUX1BPV0VSX0xFVkVMOwotCXdsLT5iYXNpY19yYXRlX3NldCA9IENPTkZfVFhfUkFURV9NQVNLX0JBU0lDOwotCXdsLT5iYXNpY19yYXRlID0gQ09ORl9UWF9SQVRFX01BU0tfQkFTSUM7Ci0Jd2wtPnJhdGVfc2V0ID0gQ09ORl9UWF9SQVRFX01BU0tfQkFTSUM7CiAJd2wtPmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwogCXdsLT52aWYgPSBOVUxMOwogCXdsLT5mbGFncyA9IDA7CiAJd2wtPnNnX2VuYWJsZWQgPSB0cnVlOwogCXdsLT5od19wZ192ZXIgPSAtMTsKLQl3bC0+YnNzX3R5cGUgPSBNQVhfQlNTX1RZUEU7Ci0Jd2wtPnNldF9ic3NfdHlwZSA9IE1BWF9CU1NfVFlQRTsKLQl3bC0+bGFzdF90eF9obGlkID0gMDsKIAl3bC0+YXBfcHNfbWFwID0gMDsKIAl3bC0+YXBfZndfcHNfbWFwID0gMDsKIAl3bC0+cXVpcmtzID0gMDsKIAl3bC0+cGxhdGZvcm1fcXVpcmtzID0gMDsKIAl3bC0+c2NoZWRfc2Nhbm5pbmcgPSBmYWxzZTsKLQl3bC0+dHhfc2VjdXJpdHlfc2VxID0gMDsKLQl3bC0+dHhfc2VjdXJpdHlfbGFzdF9zZXFfbHNiID0gMDsKIAl3bC0+dHhfc3BhcmVfYmxvY2tzID0gVFhfSFdfQkxPQ0tfU1BBUkVfREVGQVVMVDsKLQl3bC0+cm9sZV9pZCA9IFdMMTJYWF9JTlZBTElEX1JPTEVfSUQ7CiAJd2wtPnN5c3RlbV9obGlkID0gV0wxMlhYX1NZU1RFTV9ITElEOwotCXdsLT5zdGFfaGxpZCA9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQ7Ci0Jd2wtPmRldl9yb2xlX2lkID0gV0wxMlhYX0lOVkFMSURfUk9MRV9JRDsKLQl3bC0+ZGV2X2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOwotCXdsLT5zZXNzaW9uX2NvdW50ZXIgPSAwOwotCXdsLT5hcF9iY2FzdF9obGlkID0gV0wxMlhYX0lOVkFMSURfTElOS19JRDsKLQl3bC0+YXBfZ2xvYmFsX2hsaWQgPSBXTDEyWFhfSU5WQUxJRF9MSU5LX0lEOwogCXdsLT5hY3RpdmVfc3RhX2NvdW50ID0gMDsKLQlzZXR1cF90aW1lcigmd2wtPnJ4X3N0cmVhbWluZ190aW1lciwgd2wxMjcxX3J4X3N0cmVhbWluZ190aW1lciwKLQkJICAgICh1bnNpZ25lZCBsb25nKSB3bCk7CiAJd2wtPmZ3bG9nX3NpemUgPSAwOwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJndsLT5md2xvZ193YWl0cSk7CiAKQEAgLTQ4NjAsOCArNTA1MCw2IEBACiAKIAkvKiBBcHBseSBkZWZhdWx0IGRyaXZlciBjb25maWd1cmF0aW9uLiAqLwogCXdsMTI3MV9jb25mX2luaXQod2wpOwotCXdsLT5iaXRyYXRlX21hc2tzW0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gd2wtPmNvbmYudHguYmFzaWNfcmF0ZTsKLQl3bC0+Yml0cmF0ZV9tYXNrc1tJRUVFODAyMTFfQkFORF81R0haXSA9IHdsLT5jb25mLnR4LmJhc2ljX3JhdGVfNTsKIAogCW9yZGVyID0gZ2V0X29yZGVyKFdMMTI3MV9BR0dSX0JVRkZFUl9TSVpFKTsKIAl3bC0+YWdncl9idWYgPSAodTggKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwsIG9yZGVyKTsKQEAgLTQ4ODMsNDkgKzUwNzEsOCBAQAogCQlnb3RvIGVycl9kdW1teV9wYWNrZXQ7CiAJfQogCi0JLyogUmVnaXN0ZXIgcGxhdGZvcm0gZGV2aWNlICovCi0JcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHdsLT5wbGF0X2Rldik7Ci0JaWYgKHJldCkgewotCQl3bDEyNzFfZXJyb3IoImNvdWxkbid0IHJlZ2lzdGVyIHBsYXRmb3JtIGRldmljZSIpOwotCQlnb3RvIGVycl9md2xvZzsKLQl9Ci0JZGV2X3NldF9kcnZkYXRhKCZ3bC0+cGxhdF9kZXYtPmRldiwgd2wpOwotCi0JLyogQ3JlYXRlIHN5c2ZzIGZpbGUgdG8gY29udHJvbCBidCBjb2V4IHN0YXRlICovCi0JcmV0ID0gZGV2aWNlX2NyZWF0ZV9maWxlKCZ3bC0+cGxhdF9kZXYtPmRldiwgJmRldl9hdHRyX2J0X2NvZXhfc3RhdGUpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigiZmFpbGVkIHRvIGNyZWF0ZSBzeXNmcyBmaWxlIGJ0X2NvZXhfc3RhdGUiKTsKLQkJZ290byBlcnJfcGxhdGZvcm07Ci0JfQotCi0JLyogQ3JlYXRlIHN5c2ZzIGZpbGUgdG8gZ2V0IEhXIFBHIHZlcnNpb24gKi8KLQlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZGV2X2F0dHJfaHdfcGdfdmVyKTsKLQlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZSBod19wZ192ZXIiKTsKLQkJZ290byBlcnJfYnRfY29leF9zdGF0ZTsKLQl9Ci0KLQkvKiBDcmVhdGUgc3lzZnMgZmlsZSBmb3IgdGhlIEZXIGxvZyAqLwotCXJldCA9IGRldmljZV9jcmVhdGVfYmluX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZndsb2dfYXR0cik7Ci0JaWYgKHJldCA8IDApIHsKLQkJd2wxMjcxX2Vycm9yKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGUgZndsb2ciKTsKLQkJZ290byBlcnJfaHdfcGdfdmVyOwotCX0KLQogCXJldHVybiBodzsKIAotZXJyX2h3X3BnX3ZlcjoKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZGV2X2F0dHJfaHdfcGdfdmVyKTsKLQotZXJyX2J0X2NvZXhfc3RhdGU6Ci0JZGV2aWNlX3JlbW92ZV9maWxlKCZ3bC0+cGxhdF9kZXYtPmRldiwgJmRldl9hdHRyX2J0X2NvZXhfc3RhdGUpOwotCi1lcnJfcGxhdGZvcm06Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod2wtPnBsYXRfZGV2KTsKLQotZXJyX2Z3bG9nOgotCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl3bC0+Zndsb2cpOwotCiBlcnJfZHVtbXlfcGFja2V0OgogCWRldl9rZnJlZV9za2Iod2wtPmR1bW15X3BhY2tldCk7CiAKQEAgLTQ5MzcsMTggKzUwODQsMTQgQEAKIAogZXJyX2h3OgogCXdsMTI3MV9kZWJ1Z2ZzX2V4aXQod2wpOwotCWtmcmVlKHBsYXRfZGV2KTsKLQotZXJyX3BsYXRfYWxsb2M6CiAJaWVlZTgwMjExX2ZyZWVfaHcoaHcpOwogCiBlcnJfaHdfYWxsb2M6CiAKIAlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQotRVhQT1JUX1NZTUJPTF9HUEwod2wxMjcxX2FsbG9jX2h3KTsKIAotaW50IHdsMTI3MV9mcmVlX2h3KHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyNzFfZnJlZV9odyhzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKIAkvKiBVbmJsb2NrIGFueSBmd2xvZyByZWFkZXJzICovCiAJbXV0ZXhfbG9jaygmd2wtPm11dGV4KTsKQEAgLTQ5NTYsMTcgKzUwOTksMTUgQEAKIAl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCZ3bC0+Zndsb2dfd2FpdHEpOwogCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKIAotCWRldmljZV9yZW1vdmVfYmluX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZndsb2dfYXR0cik7CisJZGV2aWNlX3JlbW92ZV9iaW5fZmlsZSh3bC0+ZGV2LCAmZndsb2dfYXR0cik7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZGV2X2F0dHJfaHdfcGdfdmVyKTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUod2wtPmRldiwgJmRldl9hdHRyX2h3X3BnX3Zlcik7CiAKLQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJndsLT5wbGF0X2Rldi0+ZGV2LCAmZGV2X2F0dHJfYnRfY29leF9zdGF0ZSk7Ci0JcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIod2wtPnBsYXRfZGV2KTsKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUod2wtPmRldiwgJmRldl9hdHRyX2J0X2NvZXhfc3RhdGUpOwogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZyl3bC0+Zndsb2cpOwogCWRldl9rZnJlZV9za2Iod2wtPmR1bW15X3BhY2tldCk7CiAJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyl3bC0+YWdncl9idWYsCiAJCQlnZXRfb3JkZXIoV0wxMjcxX0FHR1JfQlVGRkVSX1NJWkUpKTsKLQlrZnJlZSh3bC0+cGxhdF9kZXYpOwogCiAJd2wxMjcxX2RlYnVnZnNfZXhpdCh3bCk7CiAKQEAgLTQ5ODMsNyArNTEyNCwxNzQgQEAKIAogCXJldHVybiAwOwogfQotRVhQT1JUX1NZTUJPTF9HUEwod2wxMjcxX2ZyZWVfaHcpOworCitzdGF0aWMgaXJxcmV0dXJuX3Qgd2wxMnh4X2hhcmRpcnEoaW50IGlycSwgdm9pZCAqY29va2llKQoreworCXN0cnVjdCB3bDEyNzEgKndsID0gY29va2llOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3bDEyNzFfZGVidWcoREVCVUdfSVJRLCAiSVJRIik7CisKKwkvKiBjb21wbGV0ZSB0aGUgRUxQIGNvbXBsZXRpb24gKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKKwlzZXRfYml0KFdMMTI3MV9GTEFHX0lSUV9SVU5OSU5HLCAmd2wtPmZsYWdzKTsKKwlpZiAod2wtPmVscF9jb21wbCkgeworCQljb21wbGV0ZSh3bC0+ZWxwX2NvbXBsKTsKKwkJd2wtPmVscF9jb21wbCA9IE5VTEw7CisJfQorCisJaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX1NVU1BFTkRFRCwgJndsLT5mbGFncykpIHsKKwkJLyogZG9uJ3QgZW5xdWV1ZSBhIHdvcmsgcmlnaHQgbm93LiBtYXJrIGl0IGFzIHBlbmRpbmcgKi8KKwkJc2V0X2JpdChXTDEyNzFfRkxBR19QRU5ESU5HX1dPUkssICZ3bC0+ZmxhZ3MpOworCQl3bDEyNzFfZGVidWcoREVCVUdfSVJRLCAic2hvdWxkIG5vdCBlbnF1ZXVlIHdvcmsiKTsKKwkJZGlzYWJsZV9pcnFfbm9zeW5jKHdsLT5pcnEpOworCQlwbV93YWtldXBfZXZlbnQod2wtPmRldiwgMCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT53bF9sb2NrLCBmbGFncyk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHdsMTJ4eF9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSAqcGRhdGEgPSBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsKKwlzdHJ1Y3Qgd2wxMjcxICp3bDsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCWludCByZXQgPSAtRU5PREVWOworCisJaHcgPSB3bDEyNzFfYWxsb2NfaHcoKTsKKwlpZiAoSVNfRVJSKGh3KSkgeworCQl3bDEyNzFfZXJyb3IoImNhbid0IGFsbG9jYXRlIGh3Iik7CisJCXJldCA9IFBUUl9FUlIoaHcpOworCQlnb3RvIG91dDsKKwl9CisKKwl3bCA9IGh3LT5wcml2OworCXdsLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCXdsLT5yZWZfY2xvY2sgPSBwZGF0YS0+Ym9hcmRfcmVmX2Nsb2NrOworCXdsLT50Y3hvX2Nsb2NrID0gcGRhdGEtPmJvYXJkX3RjeG9fY2xvY2s7CisJd2wtPnBsYXRmb3JtX3F1aXJrcyA9IHBkYXRhLT5wbGF0Zm9ybV9xdWlya3M7CisJd2wtPnNldF9wb3dlciA9IHBkYXRhLT5zZXRfcG93ZXI7CisJd2wtPmRldiA9ICZwZGV2LT5kZXY7CisJd2wtPmlmX29wcyA9IHBkYXRhLT5vcHM7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB3bCk7CisKKwlpZiAod2wtPnBsYXRmb3JtX3F1aXJrcyAmIFdMMTJYWF9QTEFURk9STV9RVUlSS19FREdFX0lSUSkKKwkJaXJxZmxhZ3MgPSBJUlFGX1RSSUdHRVJfUklTSU5HOworCWVsc2UKKwkJaXJxZmxhZ3MgPSBJUlFGX1RSSUdHRVJfSElHSCB8IElSUUZfT05FU0hPVDsKKworCXJldCA9IHJlcXVlc3RfdGhyZWFkZWRfaXJxKHdsLT5pcnEsIHdsMTJ4eF9oYXJkaXJxLCB3bDEyNzFfaXJxLAorCQkJCSAgIGlycWZsYWdzLAorCQkJCSAgIHBkZXYtPm5hbWUsIHdsKTsKKwlpZiAocmV0IDwgMCkgeworCQl3bDEyNzFfZXJyb3IoInJlcXVlc3RfaXJxKCkgZmFpbGVkOiAlZCIsIHJldCk7CisJCWdvdG8gb3V0X2ZyZWVfaHc7CisJfQorCisJcmV0ID0gZW5hYmxlX2lycV93YWtlKHdsLT5pcnEpOworCWlmICghcmV0KSB7CisJCXdsLT5pcnFfd2FrZV9lbmFibGVkID0gdHJ1ZTsKKwkJZGV2aWNlX2luaXRfd2FrZXVwKHdsLT5kZXYsIDEpOworCQlpZiAocGRhdGEtPnB3cl9pbl9zdXNwZW5kKQorCQkJaHctPndpcGh5LT53b3dsYW4uZmxhZ3MgPSBXSVBIWV9XT1dMQU5fQU5ZOworCisJfQorCWRpc2FibGVfaXJxKHdsLT5pcnEpOworCisJcmV0ID0gd2wxMjcxX2luaXRfaWVlZTgwMjExKHdsKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9pcnE7CisKKwlyZXQgPSB3bDEyNzFfcmVnaXN0ZXJfaHcod2wpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X2lycTsKKworCS8qIENyZWF0ZSBzeXNmcyBmaWxlIHRvIGNvbnRyb2wgYnQgY29leCBzdGF0ZSAqLworCXJldCA9IGRldmljZV9jcmVhdGVfZmlsZSh3bC0+ZGV2LCAmZGV2X2F0dHJfYnRfY29leF9zdGF0ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJd2wxMjcxX2Vycm9yKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGUgYnRfY29leF9zdGF0ZSIpOworCQlnb3RvIG91dF9pcnE7CisJfQorCisJLyogQ3JlYXRlIHN5c2ZzIGZpbGUgdG8gZ2V0IEhXIFBHIHZlcnNpb24gKi8KKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2ZpbGUod2wtPmRldiwgJmRldl9hdHRyX2h3X3BnX3Zlcik7CisJaWYgKHJldCA8IDApIHsKKwkJd2wxMjcxX2Vycm9yKCJmYWlsZWQgdG8gY3JlYXRlIHN5c2ZzIGZpbGUgaHdfcGdfdmVyIik7CisJCWdvdG8gb3V0X2J0X2NvZXhfc3RhdGU7CisJfQorCisJLyogQ3JlYXRlIHN5c2ZzIGZpbGUgZm9yIHRoZSBGVyBsb2cgKi8KKwlyZXQgPSBkZXZpY2VfY3JlYXRlX2Jpbl9maWxlKHdsLT5kZXYsICZmd2xvZ19hdHRyKTsKKwlpZiAocmV0IDwgMCkgeworCQl3bDEyNzFfZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZmlsZSBmd2xvZyIpOworCQlnb3RvIG91dF9od19wZ192ZXI7CisJfQorCisJcmV0dXJuIDA7CisKK291dF9od19wZ192ZXI6CisJZGV2aWNlX3JlbW92ZV9maWxlKHdsLT5kZXYsICZkZXZfYXR0cl9od19wZ192ZXIpOworCitvdXRfYnRfY29leF9zdGF0ZToKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUod2wtPmRldiwgJmRldl9hdHRyX2J0X2NvZXhfc3RhdGUpOworCitvdXRfaXJxOgorCWZyZWVfaXJxKHdsLT5pcnEsIHdsKTsKKworb3V0X2ZyZWVfaHc6CisJd2wxMjcxX2ZyZWVfaHcod2wpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfX2RldmV4aXQgd2wxMnh4X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB3bDEyNzEgKndsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlpZiAod2wtPmlycV93YWtlX2VuYWJsZWQpIHsKKwkJZGV2aWNlX2luaXRfd2FrZXVwKHdsLT5kZXYsIDApOworCQlkaXNhYmxlX2lycV93YWtlKHdsLT5pcnEpOworCX0KKwl3bDEyNzFfdW5yZWdpc3Rlcl9odyh3bCk7CisJZnJlZV9pcnEod2wtPmlycSwgd2wpOworCXdsMTI3MV9mcmVlX2h3KHdsKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBsYXRmb3JtX2RldmljZV9pZCB3bDEyeHhfaWRfdGFibGVbXSBfX2RldmluaXRjb25zdCA9IHsKKwl7ICJ3bDEyeHgiLCAwIH0sCisJeyAgfSAvKiBUZXJtaW5hdGluZyBFbnRyeSAqLworfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGxhdGZvcm0sIHdsMTJ4eF9pZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHdsMTJ4eF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IHdsMTJ4eF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHdsMTJ4eF9yZW1vdmUpLAorCS5pZF90YWJsZQk9IHdsMTJ4eF9pZF90YWJsZSwKKwkuZHJpdmVyID0geworCQkubmFtZQk9ICJ3bDEyeHhfZHJpdmVyIiwKKwkJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJfQorfTsKKworc3RhdGljIGludCBfX2luaXQgd2wxMnh4X2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZ3bDEyeHhfZHJpdmVyKTsKK30KK21vZHVsZV9pbml0KHdsMTJ4eF9pbml0KTsKKworc3RhdGljIHZvaWQgX19leGl0IHdsMTJ4eF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJndsMTJ4eF9kcml2ZXIpOworfQorbW9kdWxlX2V4aXQod2wxMnh4X2V4aXQpOwogCiB1MzIgd2wxMnh4X2RlYnVnX2xldmVsID0gREVCVUdfTk9ORTsKIEVYUE9SVF9TWU1CT0xfR1BMKHdsMTJ4eF9kZWJ1Z19sZXZlbCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcHMuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9wcy5jCmluZGV4IGMxNWViZjIuLmEyYmRhY2QgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9wcy5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9wcy5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAicHMuaCIKICNpbmNsdWRlICJpby5oIgogI2luY2x1ZGUgInR4LmgiCisjaW5jbHVkZSAiZGVidWcuaCIKIAogI2RlZmluZSBXTDEyNzFfV0FLRVVQX1RJTUVPVVQgNTAwCiAKQEAgLTMyLDYgKzMzLDcgQEAKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKIAlzdHJ1Y3Qgd2wxMjcxICp3bDsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CiAKIAlkd29yayA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgZGVsYXllZF93b3JrLCB3b3JrKTsKIAl3bCA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHdsMTI3MSwgZWxwX3dvcmspOwpAQCAtNDcsMTEgKzQ5LDE4IEBACiAJaWYgKHVubGlrZWx5KCF0ZXN0X2JpdChXTDEyNzFfRkxBR19FTFBfUkVRVUVTVEVELCAmd2wtPmZsYWdzKSkpCiAJCWdvdG8gb3V0OwogCi0JaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX0lOX0VMUCwgJndsLT5mbGFncykgfHwKLQkgICAgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19QU00sICZ3bC0+ZmxhZ3MpICYmCi0JICAgICAhdGVzdF9iaXQoV0wxMjcxX0ZMQUdfSURMRSwgJndsLT5mbGFncykpKQorCWlmICh0ZXN0X2JpdChXTDEyNzFfRkxBR19JTl9FTFAsICZ3bC0+ZmxhZ3MpKQogCQlnb3RvIG91dDsKIAorCXdsMTJ4eF9mb3JfZWFjaF93bHZpZih3bCwgd2x2aWYpIHsKKwkJaWYgKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpCisJCQlnb3RvIG91dDsKKworCQlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfUFNNLCAmd2x2aWYtPmZsYWdzKSAmJgorCQkgICAgdGVzdF9iaXQoV0xWSUZfRkxBR19JTl9VU0UsICZ3bHZpZi0+ZmxhZ3MpKQorCQkJZ290byBvdXQ7CisJfQorCiAJd2wxMjcxX2RlYnVnKERFQlVHX1BTTSwgImNoaXAgdG8gZWxwIik7CiAJd2wxMjcxX3Jhd193cml0ZTMyKHdsLCBIV19BQ0NFU1NfRUxQX0NUUkxfUkVHX0FERFIsIEVMUENUUkxfU0xFRVApOwogCXNldF9iaXQoV0wxMjcxX0ZMQUdfSU5fRUxQLCAmd2wtPmZsYWdzKTsKQEAgLTY1LDEzICs3NCwyMCBAQAogLyogUm91dGluZXMgdG8gdG9nZ2xlIHNsZWVwIG1vZGUgd2hpbGUgaW4gRUxQICovCiB2b2lkIHdsMTI3MV9wc19lbHBfc2xlZXAoc3RydWN0IHdsMTI3MSAqd2wpCiB7CisJc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmOworCiAJLyogd2Ugc2hvdWxkbid0IGdldCBjb25zZWN1dGl2ZSBzbGVlcCByZXF1ZXN0cyAqLwogCWlmIChXQVJOX09OKHRlc3RfYW5kX3NldF9iaXQoV0wxMjcxX0ZMQUdfRUxQX1JFUVVFU1RFRCwgJndsLT5mbGFncykpKQogCQlyZXR1cm47CiAKLQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1BTTSwgJndsLT5mbGFncykgJiYKLQkgICAgIXRlc3RfYml0KFdMMTI3MV9GTEFHX0lETEUsICZ3bC0+ZmxhZ3MpKQotCQlyZXR1cm47CisJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgeworCQlpZiAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykKKwkJCXJldHVybjsKKworCQlpZiAoIXRlc3RfYml0KFdMVklGX0ZMQUdfUFNNLCAmd2x2aWYtPmZsYWdzKSAmJgorCQkgICAgdGVzdF9iaXQoV0xWSUZfRkxBR19JTl9VU0UsICZ3bHZpZi0+ZmxhZ3MpKQorCQkJcmV0dXJuOworCX0KIAogCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsod2wtPmh3LCAmd2wtPmVscF93b3JrLAogCQkJCSAgICAgbXNlY3NfdG9famlmZmllcyhFTFBfRU5UUllfREVMQVkpKTsKQEAgLTE0Myw4ICsxNTksOCBAQAogCXJldHVybiAwOwogfQogCi1pbnQgd2wxMjcxX3BzX3NldF9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBlbnVtIHdsMTI3MV9jbWRfcHNfbW9kZSBtb2RlLAotCQkgICAgICAgdTMyIHJhdGVzLCBib29sIHNlbmQpCitpbnQgd2wxMjcxX3BzX3NldF9tb2RlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCSAgICAgICBlbnVtIHdsMTI3MV9jbWRfcHNfbW9kZSBtb2RlLCB1MzIgcmF0ZXMsIGJvb2wgc2VuZCkKIHsKIAlpbnQgcmV0OwogCkBAIC0xNTIsMzkgKzE2OCwzNCBAQAogCWNhc2UgU1RBVElPTl9QT1dFUl9TQVZFX01PREU6CiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19QU00sICJlbnRlcmluZyBwc20iKTsKIAotCQlyZXQgPSB3bDEyNzFfYWN4X3dha2VfdXBfY29uZGl0aW9ucyh3bCk7CisJCXJldCA9IHdsMTI3MV9hY3hfd2FrZV91cF9jb25kaXRpb25zKHdsLCB3bHZpZik7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQl3bDEyNzFfZXJyb3IoImNvdWxkbid0IHNldCB3YWtlIHVwIGNvbmRpdGlvbnMiKTsKIAkJCXJldHVybiByZXQ7CiAJCX0KIAotCQlyZXQgPSB3bDEyNzFfY21kX3BzX21vZGUod2wsIFNUQVRJT05fUE9XRVJfU0FWRV9NT0RFKTsKKwkJcmV0ID0gd2wxMjcxX2NtZF9wc19tb2RlKHdsLCB3bHZpZiwgU1RBVElPTl9QT1dFUl9TQVZFX01PREUpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAKLQkJc2V0X2JpdChXTDEyNzFfRkxBR19QU00sICZ3bC0+ZmxhZ3MpOworCQlzZXRfYml0KFdMVklGX0ZMQUdfUFNNLCAmd2x2aWYtPmZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSBTVEFUSU9OX0FDVElWRV9NT0RFOgogCWRlZmF1bHQ6CiAJCXdsMTI3MV9kZWJ1ZyhERUJVR19QU00sICJsZWF2aW5nIHBzbSIpOwogCiAJCS8qIGRpc2FibGUgYmVhY29uIGVhcmx5IHRlcm1pbmF0aW9uICovCi0JCWlmICh3bC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKSB7Ci0JCQlyZXQgPSB3bDEyNzFfYWN4X2JldF9lbmFibGUod2wsIGZhbHNlKTsKKwkJaWYgKHdsdmlmLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsKKwkJCXJldCA9IHdsMTI3MV9hY3hfYmV0X2VuYWJsZSh3bCwgd2x2aWYsIGZhbHNlKTsKIAkJCWlmIChyZXQgPCAwKQogCQkJCXJldHVybiByZXQ7CiAJCX0KIAotCQkvKiBkaXNhYmxlIGJlYWNvbiBmaWx0ZXJpbmcgKi8KLQkJcmV0ID0gd2wxMjcxX2FjeF9iZWFjb25fZmlsdGVyX29wdCh3bCwgZmFsc2UpOworCQlyZXQgPSB3bDEyNzFfY21kX3BzX21vZGUod2wsIHdsdmlmLCBTVEFUSU9OX0FDVElWRV9NT0RFKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCi0JCXJldCA9IHdsMTI3MV9jbWRfcHNfbW9kZSh3bCwgU1RBVElPTl9BQ1RJVkVfTU9ERSk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKLQotCQljbGVhcl9iaXQoV0wxMjcxX0ZMQUdfUFNNLCAmd2wtPmZsYWdzKTsKKwkJY2xlYXJfYml0KFdMVklGX0ZMQUdfUFNNLCAmd2x2aWYtPmZsYWdzKTsKIAkJYnJlYWs7CiAJfQogCkBAIC0yMjMsOSArMjM0LDExIEBACiAJd2wxMjcxX2hhbmRsZV90eF9sb3dfd2F0ZXJtYXJrKHdsKTsKIH0KIAotdm9pZCB3bDEyNzFfcHNfbGlua19zdGFydChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCwgYm9vbCBjbGVhbl9xdWV1ZXMpCit2b2lkIHdsMTJ4eF9wc19saW5rX3N0YXJ0KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgIHU4IGhsaWQsIGJvb2wgY2xlYW5fcXVldWVzKQogewogCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiA9IHdsMTJ4eF93bHZpZl90b192aWYod2x2aWYpOwogCiAJaWYgKHRlc3RfYml0KGhsaWQsICZ3bC0+YXBfcHNfbWFwKSkKIAkJcmV0dXJuOwpAQCAtMjM1LDcgKzI0OCw3IEBACiAJCSAgICAgY2xlYW5fcXVldWVzKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEod2wtPnZpZiwgd2wtPmxpbmtzW2hsaWRdLmFkZHIpOworCXN0YSA9IGllZWU4MDIxMV9maW5kX3N0YSh2aWYsIHdsLT5saW5rc1tobGlkXS5hZGRyKTsKIAlpZiAoIXN0YSkgewogCQl3bDEyNzFfZXJyb3IoImNvdWxkIG5vdCBmaW5kIHN0YSAlcE0gZm9yIHN0YXJ0aW5nIHBzIiwKIAkJCSAgICAgd2wtPmxpbmtzW2hsaWRdLmFkZHIpOwpAQCAtMjUzLDkgKzI2NiwxMCBAQAogCV9fc2V0X2JpdChobGlkLCAmd2wtPmFwX3BzX21hcCk7CiB9CiAKLXZvaWQgd2wxMjcxX3BzX2xpbmtfZW5kKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkKQordm9pZCB3bDEyeHhfcHNfbGlua19lbmQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwgdTggaGxpZCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOworCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYgPSB3bDEyeHhfd2x2aWZfdG9fdmlmKHdsdmlmKTsKIAogCWlmICghdGVzdF9iaXQoaGxpZCwgJndsLT5hcF9wc19tYXApKQogCQlyZXR1cm47CkBAIC0yNjUsNyArMjc5LDcgQEAKIAlfX2NsZWFyX2JpdChobGlkLCAmd2wtPmFwX3BzX21hcCk7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0Jc3RhID0gaWVlZTgwMjExX2ZpbmRfc3RhKHdsLT52aWYsIHdsLT5saW5rc1tobGlkXS5hZGRyKTsKKwlzdGEgPSBpZWVlODAyMTFfZmluZF9zdGEodmlmLCB3bC0+bGlua3NbaGxpZF0uYWRkcik7CiAJaWYgKCFzdGEpIHsKIAkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgZmluZCBzdGEgJXBNIGZvciBlbmRpbmcgcHMiLAogCQkJICAgICB3bC0+bGlua3NbaGxpZF0uYWRkcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcHMuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9wcy5oCmluZGV4IDI1ZWI5YmMuLmExMjA1MmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9wcy5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9wcy5oCkBAIC0yNywxMyArMjcsMTQgQEAKICNpbmNsdWRlICJ3bDEyeHguaCIKICNpbmNsdWRlICJhY3guaCIKIAotaW50IHdsMTI3MV9wc19zZXRfbW9kZShzdHJ1Y3Qgd2wxMjcxICp3bCwgZW51bSB3bDEyNzFfY21kX3BzX21vZGUgbW9kZSwKLQkJICAgICAgIHUzMiByYXRlcywgYm9vbCBzZW5kKTsKK2ludCB3bDEyNzFfcHNfc2V0X21vZGUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgICAgIGVudW0gd2wxMjcxX2NtZF9wc19tb2RlIG1vZGUsIHUzMiByYXRlcywgYm9vbCBzZW5kKTsKIHZvaWQgd2wxMjcxX3BzX2VscF9zbGVlcChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjcxX3BzX2VscF93YWtldXAoc3RydWN0IHdsMTI3MSAqd2wpOwogdm9pZCB3bDEyNzFfZWxwX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKLXZvaWQgd2wxMjcxX3BzX2xpbmtfc3RhcnQoc3RydWN0IHdsMTI3MSAqd2wsIHU4IGhsaWQsIGJvb2wgY2xlYW5fcXVldWVzKTsKLXZvaWQgd2wxMjcxX3BzX2xpbmtfZW5kKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkKTsKK3ZvaWQgd2wxMnh4X3BzX2xpbmtfc3RhcnQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSAgdTggaGxpZCwgYm9vbCBjbGVhbl9xdWV1ZXMpOwordm9pZCB3bDEyeHhfcHNfbGlua19lbmQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwgdTggaGxpZCk7CiAKICNkZWZpbmUgV0wxMjcxX1BTX0NPTVBMRVRFX1RJTUVPVVQgNTAwCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9yZWcuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9yZWcuaAppbmRleCAzZjU3MGYzLi5kZjM0ZDU5IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcmVnLmgKKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3JlZy5oCkBAIC00MDgsNyArNDA4LDcgQEAKIAogCiAvKiBGaXJtd2FyZSBpbWFnZSBsb2FkIGNodW5rIHNpemUgKi8KLSNkZWZpbmUgQ0hVTktfU0laRSAgICAgICAgICA1MTIKKyNkZWZpbmUgQ0hVTktfU0laRQkxNjM4NAogCiAvKiBGaXJtd2FyZSBpbWFnZSBoZWFkZXIgc2l6ZSAqLwogI2RlZmluZSBGV19IRFJfU0laRSA4CmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvcnguYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9yeC5jCmluZGV4IGRlZTRjZmUuLjRmYmQyYTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9yeC5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9yeC5jCkBAIC0yNSw5ICsyNSwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAKICNpbmNsdWRlICJ3bDEyeHguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImFjeC5oIgogI2luY2x1ZGUgInJlZy5oIgogI2luY2x1ZGUgInJ4LmgiCisjaW5jbHVkZSAidHguaCIKICNpbmNsdWRlICJpby5oIgogCiBzdGF0aWMgdTggd2wxMnh4X3J4X2dldF9tZW1fYmxvY2soc3RydWN0IHdsMTJ4eF9md19zdGF0dXMgKnN0YXR1cywKQEAgLTk2LDcgKzk4LDcgQEAKIH0KIAogc3RhdGljIGludCB3bDEyNzFfcnhfaGFuZGxlX2RhdGEoc3RydWN0IHdsMTI3MSAqd2wsIHU4ICpkYXRhLCB1MzIgbGVuZ3RoLAotCQkJCSBib29sIHVuYWxpZ25lZCkKKwkJCQkgYm9vbCB1bmFsaWduZWQsIHU4ICpobGlkKQogewogCXN0cnVjdCB3bDEyNzFfcnhfZGVzY3JpcHRvciAqZGVzYzsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwpAQCAtMTU5LDYgKzE2MSw3IEBACiAJICogcGF5bG9hZCBhbGlnbmVkIHRvIDQgYnl0ZXMuCiAJICovCiAJbWVtY3B5KGJ1ZiwgZGF0YSArIHNpemVvZigqZGVzYyksIGxlbmd0aCAtIHNpemVvZigqZGVzYykpOworCSpobGlkID0gZGVzYy0+aGxpZDsKIAogCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAlpZiAoaWVlZTgwMjExX2lzX2JlYWNvbihoZHItPmZyYW1lX2NvbnRyb2wpKQpAQCAtMTY5LDEwICsxNzIsMTAgQEAKIAl3bDEyNzFfcnhfc3RhdHVzKHdsLCBkZXNjLCBJRUVFODAyMTFfU0tCX1JYQ0Ioc2tiKSwgYmVhY29uKTsKIAogCXNlcV9udW0gPSAobGUxNl90b19jcHUoaGRyLT5zZXFfY3RybCkgJiBJRUVFODAyMTFfU0NUTF9TRVEpID4+IDQ7Ci0Jd2wxMjcxX2RlYnVnKERFQlVHX1JYLCAicnggc2tiIDB4JXA6ICVkIEIgJXMgc2VxICVkIiwgc2tiLAorCXdsMTI3MV9kZWJ1ZyhERUJVR19SWCwgInJ4IHNrYiAweCVwOiAlZCBCICVzIHNlcSAlZCBobGlkICVkIiwgc2tiLAogCQkgICAgIHNrYi0+bGVuIC0gZGVzYy0+cGFkX2xlbiwKIAkJICAgICBiZWFjb24gPyAiYmVhY29uIiA6ICIiLAotCQkgICAgIHNlcV9udW0pOworCQkgICAgIHNlcV9udW0sICpobGlkKTsKIAogCXNrYl90cmltKHNrYiwgc2tiLT5sZW4gLSBkZXNjLT5wYWRfbGVuKTsKIApAQCAtMTg1LDYgKzE4OCw3IEBACiB2b2lkIHdsMTJ4eF9yeChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF9md19zdGF0dXMgKnN0YXR1cykKIHsKIAlzdHJ1Y3Qgd2wxMjcxX2FjeF9tZW1fbWFwICp3bF9tZW1fbWFwID0gd2wtPnRhcmdldF9tZW1fbWFwOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX2hsaWRzW0JJVFNfVE9fTE9OR1MoV0wxMlhYX01BWF9MSU5LUyldID0gezB9OwogCXUzMiBidWZfc2l6ZTsKIAl1MzIgZndfcnhfY291bnRlciAgPSBzdGF0dXMtPmZ3X3J4X2NvdW50ZXIgJiBOVU1fUlhfUEtUX0RFU0NfTU9EX01BU0s7CiAJdTMyIGRydl9yeF9jb3VudGVyID0gd2wtPnJ4X2NvdW50ZXIgJiBOVU1fUlhfUEtUX0RFU0NfTU9EX01BU0s7CkBAIC0xOTIsOCArMTk2LDcgQEAKIAl1MzIgbWVtX2Jsb2NrOwogCXUzMiBwa3RfbGVuZ3RoOwogCXUzMiBwa3Rfb2Zmc2V0OwotCWJvb2wgaXNfYXAgPSAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7Ci0JYm9vbCBoYWRfZGF0YSA9IGZhbHNlOworCXU4IGhsaWQ7CiAJYm9vbCB1bmFsaWduZWQgPSBmYWxzZTsKIAogCXdoaWxlIChkcnZfcnhfY291bnRlciAhPSBmd19yeF9jb3VudGVyKSB7CkBAIC0yNTMsOCArMjU2LDE1IEBACiAJCQkgKi8KIAkJCWlmICh3bDEyNzFfcnhfaGFuZGxlX2RhdGEod2wsCiAJCQkJCQkgIHdsLT5hZ2dyX2J1ZiArIHBrdF9vZmZzZXQsCi0JCQkJCQkgIHBrdF9sZW5ndGgsIHVuYWxpZ25lZCkgPT0gMSkKLQkJCQloYWRfZGF0YSA9IHRydWU7CisJCQkJCQkgIHBrdF9sZW5ndGgsIHVuYWxpZ25lZCwKKwkJCQkJCSAgJmhsaWQpID09IDEpIHsKKwkJCQlpZiAoaGxpZCA8IFdMMTJYWF9NQVhfTElOS1MpCisJCQkJCV9fc2V0X2JpdChobGlkLCBhY3RpdmVfaGxpZHMpOworCQkJCWVsc2UKKwkJCQkJV0FSTigxLAorCQkJCQkgICAgICJobGlkIGV4Y2VlZGVkIFdMMTJYWF9NQVhfTElOS1MgIgorCQkJCQkgICAgICIoJWQpXG4iLCBobGlkKTsKKwkJCX0KIAogCQkJd2wtPnJ4X2NvdW50ZXIrKzsKIAkJCWRydl9yeF9jb3VudGVyKys7CkBAIC0yNzAsMTcgKzI4MCw1IEBACiAJaWYgKHdsLT5xdWlya3MgJiBXTDEyWFhfUVVJUktfRU5EX09GX1RSQU5TQUNUSU9OKQogCQl3bDEyNzFfd3JpdGUzMih3bCwgUlhfRFJJVkVSX0NPVU5URVJfQUREUkVTUywgd2wtPnJ4X2NvdW50ZXIpOwogCi0JaWYgKCFpc19hcCAmJiB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuaW50ZXJ2YWwgJiYgaGFkX2RhdGEgJiYKLQkgICAgKHdsLT5jb25mLnJ4X3N0cmVhbWluZy5hbHdheXMgfHwKLQkgICAgIHRlc3RfYml0KFdMMTI3MV9GTEFHX1NPRlRfR0VNSU5JLCAmd2wtPmZsYWdzKSkpIHsKLQkJdTMyIHRpbWVvdXQgPSB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuZHVyYXRpb247Ci0KLQkJLyogcmVzdGFydCByeCBzdHJlYW1pbmcgKi8KLQkJaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwgJndsLT5mbGFncykpCi0JCQlpZWVlODAyMTFfcXVldWVfd29yayh3bC0+aHcsCi0JCQkJCSAgICAgJndsLT5yeF9zdHJlYW1pbmdfZW5hYmxlX3dvcmspOwotCi0JCW1vZF90aW1lcigmd2wtPnJ4X3N0cmVhbWluZ190aW1lciwKLQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpOwotCX0KKwl3bDEyeHhfcmVhcm1fcnhfc3RyZWFtaW5nKHdsLCBhY3RpdmVfaGxpZHMpOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmMKaW5kZXggZmMyOWM2Ny4uZTI0MTExZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5jCkBAIC0yNCw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvaWVlZTgwMjExLmg+CiAKICNpbmNsdWRlICJ3bDEyeHguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImNtZC5oIgogI2luY2x1ZGUgInNjYW4uaCIKICNpbmNsdWRlICJhY3guaCIKQEAgLTM0LDYgKzM1LDggQEAKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yazsKIAlzdHJ1Y3Qgd2wxMjcxICp3bDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCXN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZjsKIAlpbnQgcmV0OwogCWJvb2wgaXNfc3RhLCBpc19pYnNzOwogCkBAIC01MCwyOCArNTMsMzEgQEAKIAlpZiAod2wtPnNjYW4uc3RhdGUgPT0gV0wxMjcxX1NDQU5fU1RBVEVfSURMRSkKIAkJZ290byBvdXQ7CiAKKwl2aWYgPSB3bC0+c2Nhbl92aWY7CisJd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKKwogCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfSURMRTsKIAltZW1zZXQod2wtPnNjYW4uc2Nhbm5lZF9jaCwgMCwgc2l6ZW9mKHdsLT5zY2FuLnNjYW5uZWRfY2gpKTsKIAl3bC0+c2Nhbi5yZXEgPSBOVUxMOworCXdsLT5zY2FuX3ZpZiA9IE5VTEw7CiAKIAlyZXQgPSB3bDEyNzFfcHNfZWxwX3dha2V1cCh3bCk7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0OwogCi0JaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSkgeworCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2x2aWYtPmZsYWdzKSkgewogCQkvKiByZXN0b3JlIGhhcmR3YXJlIGNvbm5lY3Rpb24gbW9uaXRvcmluZyB0ZW1wbGF0ZSAqLwotCQl3bDEyNzFfY21kX2J1aWxkX2FwX3Byb2JlX3JlcSh3bCwgd2wtPnByb2JlcmVxKTsKKwkJd2wxMjcxX2NtZF9idWlsZF9hcF9wcm9iZV9yZXEod2wsIHdsdmlmLCB3bHZpZi0+cHJvYmVyZXEpOwogCX0KIAogCS8qIHJldHVybiB0byBST0MgaWYgbmVlZGVkICovCi0JaXNfc3RhID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9TVEFfQlNTKTsKLQlpc19pYnNzID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9JQlNTKTsKLQlpZiAoKChpc19zdGEgJiYgIXRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSkgfHwKLQkgICAgIChpc19pYnNzICYmICF0ZXN0X2JpdChXTDEyNzFfRkxBR19JQlNTX0pPSU5FRCwgJndsLT5mbGFncykpKSAmJgotCSAgICAhdGVzdF9iaXQod2wtPmRldl9yb2xlX2lkLCB3bC0+cm9jX21hcCkpIHsKKwlpc19zdGEgPSAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX1NUQV9CU1MpOworCWlzX2lic3MgPSAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0lCU1MpOworCWlmICgoKGlzX3N0YSAmJiAhdGVzdF9iaXQoV0xWSUZfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsdmlmLT5mbGFncykpIHx8CisJICAgICAoaXNfaWJzcyAmJiAhdGVzdF9iaXQoV0xWSUZfRkxBR19JQlNTX0pPSU5FRCwgJndsdmlmLT5mbGFncykpKSAmJgorCSAgICAhdGVzdF9iaXQod2x2aWYtPmRldl9yb2xlX2lkLCB3bC0+cm9jX21hcCkpIHsKIAkJLyogcmVzdG9yZSByZW1haW4gb24gY2hhbm5lbCAqLwotCQl3bDEyeHhfY21kX3JvbGVfc3RhcnRfZGV2KHdsKTsKLQkJd2wxMnh4X3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKKwkJd2wxMnh4X3N0YXJ0X2Rldih3bCwgd2x2aWYpOwogCX0KIAl3bDEyNzFfcHNfZWxwX3NsZWVwKHdsKTsKIApAQCAtMTU1LDkgKzE2MSwxMSBAQAogCiAjZGVmaW5lIFdMMTI3MV9OT1RISU5HX1RPX1NDQU4gMQogCi1zdGF0aWMgaW50IHdsMTI3MV9zY2FuX3NlbmQoc3RydWN0IHdsMTI3MSAqd2wsIGVudW0gaWVlZTgwMjExX2JhbmQgYmFuZCwKLQkJCSAgICAgYm9vbCBwYXNzaXZlLCB1MzIgYmFzaWNfcmF0ZSkKK3N0YXRpYyBpbnQgd2wxMjcxX3NjYW5fc2VuZChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCSAgICBlbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQsCisJCQkgICAgYm9vbCBwYXNzaXZlLCB1MzIgYmFzaWNfcmF0ZSkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAlzdHJ1Y3Qgd2wxMjcxX2NtZF9zY2FuICpjbWQ7CiAJc3RydWN0IHdsMTI3MV9jbWRfdHJpZ2dlcl9zY2FuX3RvICp0cmlnZ2VyOwogCWludCByZXQ7CkBAIC0xNzcsMTEgKzE4NSwxMSBAQAogCWlmIChwYXNzaXZlKQogCQlzY2FuX29wdGlvbnMgfD0gV0wxMjcxX1NDQU5fT1BUX1BBU1NJVkU7CiAKLQlpZiAoV0FSTl9PTih3bC0+cm9sZV9pZCA9PSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEKSkgeworCWlmIChXQVJOX09OKHdsdmlmLT5yb2xlX2lkID09IFdMMTJYWF9JTlZBTElEX1JPTEVfSUQpKSB7CiAJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KLQljbWQtPnBhcmFtcy5yb2xlX2lkID0gd2wtPnJvbGVfaWQ7CisJY21kLT5wYXJhbXMucm9sZV9pZCA9IHdsdmlmLT5yb2xlX2lkOwogCWNtZC0+cGFyYW1zLnNjYW5fb3B0aW9ucyA9IGNwdV90b19sZTE2KHNjYW5fb3B0aW9ucyk7CiAKIAljbWQtPnBhcmFtcy5uX2NoID0gd2wxMjcxX2dldF9zY2FuX2NoYW5uZWxzKHdsLCB3bC0+c2Nhbi5yZXEsCkBAIC0xOTQsNyArMjAyLDYgQEAKIAogCWNtZC0+cGFyYW1zLnR4X3JhdGUgPSBjcHVfdG9fbGUzMihiYXNpY19yYXRlKTsKIAljbWQtPnBhcmFtcy5uX3Byb2JlX3JlcXMgPSB3bC0+Y29uZi5zY2FuLm51bV9wcm9iZV9yZXFzOwotCWNtZC0+cGFyYW1zLnR4X3JhdGUgPSBjcHVfdG9fbGUzMihiYXNpY19yYXRlKTsKIAljbWQtPnBhcmFtcy50aWRfdHJpZ2dlciA9IDA7CiAJY21kLT5wYXJhbXMuc2Nhbl90YWcgPSBXTDEyNzFfU0NBTl9ERUZBVUxUX1RBRzsKIApAQCAtMjA4LDExICsyMTUsMTEgQEAKIAkJbWVtY3B5KGNtZC0+cGFyYW1zLnNzaWQsIHdsLT5zY2FuLnNzaWQsIHdsLT5zY2FuLnNzaWRfbGVuKTsKIAl9CiAKLQltZW1jcHkoY21kLT5hZGRyLCB3bC0+bWFjX2FkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkoY21kLT5hZGRyLCB2aWYtPmFkZHIsIEVUSF9BTEVOKTsKIAotCXJldCA9IHdsMTI3MV9jbWRfYnVpbGRfcHJvYmVfcmVxKHdsLCB3bC0+c2Nhbi5zc2lkLCB3bC0+c2Nhbi5zc2lkX2xlbiwKLQkJCQkJIHdsLT5zY2FuLnJlcS0+aWUsIHdsLT5zY2FuLnJlcS0+aWVfbGVuLAotCQkJCQkgYmFuZCk7CisJcmV0ID0gd2wxMjcxX2NtZF9idWlsZF9wcm9iZV9yZXEod2wsIHdsdmlmLCB3bC0+c2Nhbi5zc2lkLAorCQkJCQkgd2wtPnNjYW4uc3NpZF9sZW4sIHdsLT5zY2FuLnJlcS0+aWUsCisJCQkJCSB3bC0+c2Nhbi5yZXEtPmllX2xlbiwgYmFuZCk7CiAJaWYgKHJldCA8IDApIHsKIAkJd2wxMjcxX2Vycm9yKCJQUk9CRSByZXF1ZXN0IHRlbXBsYXRlIGZhaWxlZCIpOwogCQlnb3RvIG91dDsKQEAgLTI0MSwxMSArMjQ4LDEyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotdm9pZCB3bDEyNzFfc2Nhbl9zdG0oc3RydWN0IHdsMTI3MSAqd2wpCit2b2lkIHdsMTI3MV9zY2FuX3N0bShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bDEyeHhfdmlmX3RvX2RhdGEodmlmKTsKIAlpbnQgcmV0ID0gMDsKIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7Ci0JdTMyIHJhdGU7CisJdTMyIHJhdGUsIG1hc2s7CiAKIAlzd2l0Y2ggKHdsLT5zY2FuLnN0YXRlKSB7CiAJY2FzZSBXTDEyNzFfU0NBTl9TVEFURV9JRExFOgpAQCAtMjUzLDQ3ICsyNjEsNTkgQEAKIAogCWNhc2UgV0wxMjcxX1NDQU5fU1RBVEVfMkdIWl9BQ1RJVkU6CiAJCWJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haOwotCQlyYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2wtPmJpdHJhdGVfbWFza3NbYmFuZF0pOwotCQlyZXQgPSB3bDEyNzFfc2Nhbl9zZW5kKHdsLCBiYW5kLCBmYWxzZSwgcmF0ZSk7CisJCW1hc2sgPSB3bHZpZi0+Yml0cmF0ZV9tYXNrc1tiYW5kXTsKKwkJaWYgKHdsLT5zY2FuLnJlcS0+bm9fY2NrKSB7CisJCQltYXNrICY9IH5DT05GX1RYX0NDS19SQVRFUzsKKwkJCWlmICghbWFzaykKKwkJCQltYXNrID0gQ09ORl9UWF9SQVRFX01BU0tfQkFTSUNfUDJQOworCQl9CisJCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCBtYXNrKTsKKwkJcmV0ID0gd2wxMjcxX3NjYW5fc2VuZCh3bCwgdmlmLCBiYW5kLCBmYWxzZSwgcmF0ZSk7CiAJCWlmIChyZXQgPT0gV0wxMjcxX05PVEhJTkdfVE9fU0NBTikgewogCQkJd2wtPnNjYW4uc3RhdGUgPSBXTDEyNzFfU0NBTl9TVEFURV8yR0haX1BBU1NJVkU7Ci0JCQl3bDEyNzFfc2Nhbl9zdG0od2wpOworCQkJd2wxMjcxX3NjYW5fc3RtKHdsLCB2aWYpOwogCQl9CiAKIAkJYnJlYWs7CiAKIAljYXNlIFdMMTI3MV9TQ0FOX1NUQVRFXzJHSFpfUEFTU0lWRToKIAkJYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFo7Ci0JCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+Yml0cmF0ZV9tYXNrc1tiYW5kXSk7Ci0JCXJldCA9IHdsMTI3MV9zY2FuX3NlbmQod2wsIGJhbmQsIHRydWUsIHJhdGUpOworCQltYXNrID0gd2x2aWYtPmJpdHJhdGVfbWFza3NbYmFuZF07CisJCWlmICh3bC0+c2Nhbi5yZXEtPm5vX2NjaykgeworCQkJbWFzayAmPSB+Q09ORl9UWF9DQ0tfUkFURVM7CisJCQlpZiAoIW1hc2spCisJCQkJbWFzayA9IENPTkZfVFhfUkFURV9NQVNLX0JBU0lDX1AyUDsKKwkJfQorCQlyYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgbWFzayk7CisJCXJldCA9IHdsMTI3MV9zY2FuX3NlbmQod2wsIHZpZiwgYmFuZCwgdHJ1ZSwgcmF0ZSk7CiAJCWlmIChyZXQgPT0gV0wxMjcxX05PVEhJTkdfVE9fU0NBTikgewogCQkJaWYgKHdsLT5lbmFibGVfMTFhKQogCQkJCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfNUdIWl9BQ1RJVkU7CiAJCQllbHNlCiAJCQkJd2wtPnNjYW4uc3RhdGUgPSBXTDEyNzFfU0NBTl9TVEFURV9ET05FOwotCQkJd2wxMjcxX3NjYW5fc3RtKHdsKTsKKwkJCXdsMTI3MV9zY2FuX3N0bSh3bCwgdmlmKTsKIAkJfQogCiAJCWJyZWFrOwogCiAJY2FzZSBXTDEyNzFfU0NBTl9TVEFURV81R0haX0FDVElWRToKIAkJYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci0JCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+Yml0cmF0ZV9tYXNrc1tiYW5kXSk7Ci0JCXJldCA9IHdsMTI3MV9zY2FuX3NlbmQod2wsIGJhbmQsIGZhbHNlLCByYXRlKTsKKwkJcmF0ZSA9IHdsMTI3MV90eF9taW5fcmF0ZV9nZXQod2wsIHdsdmlmLT5iaXRyYXRlX21hc2tzW2JhbmRdKTsKKwkJcmV0ID0gd2wxMjcxX3NjYW5fc2VuZCh3bCwgdmlmLCBiYW5kLCBmYWxzZSwgcmF0ZSk7CiAJCWlmIChyZXQgPT0gV0wxMjcxX05PVEhJTkdfVE9fU0NBTikgewogCQkJd2wtPnNjYW4uc3RhdGUgPSBXTDEyNzFfU0NBTl9TVEFURV81R0haX1BBU1NJVkU7Ci0JCQl3bDEyNzFfc2Nhbl9zdG0od2wpOworCQkJd2wxMjcxX3NjYW5fc3RtKHdsLCB2aWYpOwogCQl9CiAKIAkJYnJlYWs7CiAKIAljYXNlIFdMMTI3MV9TQ0FOX1NUQVRFXzVHSFpfUEFTU0lWRToKIAkJYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFo7Ci0JCXJhdGUgPSB3bDEyNzFfdHhfbWluX3JhdGVfZ2V0KHdsLCB3bC0+Yml0cmF0ZV9tYXNrc1tiYW5kXSk7Ci0JCXJldCA9IHdsMTI3MV9zY2FuX3NlbmQod2wsIGJhbmQsIHRydWUsIHJhdGUpOworCQlyYXRlID0gd2wxMjcxX3R4X21pbl9yYXRlX2dldCh3bCwgd2x2aWYtPmJpdHJhdGVfbWFza3NbYmFuZF0pOworCQlyZXQgPSB3bDEyNzFfc2Nhbl9zZW5kKHdsLCB2aWYsIGJhbmQsIHRydWUsIHJhdGUpOwogCQlpZiAocmV0ID09IFdMMTI3MV9OT1RISU5HX1RPX1NDQU4pIHsKIAkJCXdsLT5zY2FuLnN0YXRlID0gV0wxMjcxX1NDQU5fU1RBVEVfRE9ORTsKLQkJCXdsMTI3MV9zY2FuX3N0bSh3bCk7CisJCQl3bDEyNzFfc2Nhbl9zdG0od2wsIHZpZik7CiAJCX0KIAogCQlicmVhazsKQEAgLTMxNyw3ICszMzcsOCBAQAogCX0KIH0KIAotaW50IHdsMTI3MV9zY2FuKHN0cnVjdCB3bDEyNzEgKndsLCBjb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAoraW50IHdsMTI3MV9zY2FuKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQljb25zdCB1OCAqc3NpZCwgc2l6ZV90IHNzaWRfbGVuLAogCQlzdHJ1Y3QgY2ZnODAyMTFfc2Nhbl9yZXF1ZXN0ICpyZXEpCiB7CiAJLyoKQEAgLTMzOCw2ICszNTksNyBAQAogCQl3bC0+c2Nhbi5zc2lkX2xlbiA9IDA7CiAJfQogCisJd2wtPnNjYW5fdmlmID0gdmlmOwogCXdsLT5zY2FuLnJlcSA9IHJlcTsKIAltZW1zZXQod2wtPnNjYW4uc2Nhbm5lZF9jaCwgMCwgc2l6ZW9mKHdsLT5zY2FuLnNjYW5uZWRfY2gpKTsKIApAQCAtMzQ2LDcgKzM2OCw3IEBACiAJaWVlZTgwMjExX3F1ZXVlX2RlbGF5ZWRfd29yayh3bC0+aHcsICZ3bC0+c2Nhbl9jb21wbGV0ZV93b3JrLAogCQkJCSAgICAgbXNlY3NfdG9famlmZmllcyhXTDEyNzFfU0NBTl9USU1FT1VUKSk7CiAKLQl3bDEyNzFfc2Nhbl9zdG0od2wpOworCXdsMTI3MV9zY2FuX3N0bSh3bCwgdmlmKTsKIAogCXJldHVybiAwOwogfQpAQCAtNDE1LDE4ICs0MzcsMTkgQEAKIAogCQkJaWYgKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUkFEQVIpIHsKIAkJCQljaGFubmVsc1tqXS5mbGFncyB8PSBTQ0FOX0NIQU5ORUxfRkxBR1NfREZTOworCiAJCQkJY2hhbm5lbHNbal0ucGFzc2l2ZV9kdXJhdGlvbiA9CiAJCQkJCWNwdV90b19sZTE2KGMtPmR3ZWxsX3RpbWVfZGZzKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZsYWdzICYgSUVFRTgwMjExX0NIQU5fUEFTU0lWRV9TQ0FOKSB7CisJCQl9IGVsc2UgewogCQkJCWNoYW5uZWxzW2pdLnBhc3NpdmVfZHVyYXRpb24gPQogCQkJCQljcHVfdG9fbGUxNihjLT5kd2VsbF90aW1lX3Bhc3NpdmUpOwotCQkJfSBlbHNlIHsKLQkJCQljaGFubmVsc1tqXS5taW5fZHVyYXRpb24gPQotCQkJCQljcHVfdG9fbGUxNihjLT5taW5fZHdlbGxfdGltZV9hY3RpdmUpOwotCQkJCWNoYW5uZWxzW2pdLm1heF9kdXJhdGlvbiA9Ci0JCQkJCWNwdV90b19sZTE2KGMtPm1heF9kd2VsbF90aW1lX2FjdGl2ZSk7CiAJCQl9CisKKwkJCWNoYW5uZWxzW2pdLm1pbl9kdXJhdGlvbiA9CisJCQkJY3B1X3RvX2xlMTYoYy0+bWluX2R3ZWxsX3RpbWVfYWN0aXZlKTsKKwkJCWNoYW5uZWxzW2pdLm1heF9kdXJhdGlvbiA9CisJCQkJY3B1X3RvX2xlMTYoYy0+bWF4X2R3ZWxsX3RpbWVfYWN0aXZlKTsKKwogCQkJY2hhbm5lbHNbal0udHhfcG93ZXJfYXR0ID0gcmVxLT5jaGFubmVsc1tpXS0+bWF4X3Bvd2VyOwogCQkJY2hhbm5lbHNbal0uY2hhbm5lbCA9IHJlcS0+Y2hhbm5lbHNbaV0tPmh3X3ZhbHVlOwogCkBAIC01NTAsNiArNTczLDkgQEAKIAkJCSAqIHNvIHRoZXkncmUgdXNlZCBpbiBwcm9iZSByZXF1ZXN0cy4KIAkJCSAqLwogCQkJZm9yIChpID0gMDsgaSA8IHJlcS0+bl9zc2lkczsgaSsrKSB7CisJCQkJaWYgKCFyZXEtPnNzaWRzW2ldLnNzaWRfbGVuKQorCQkJCQljb250aW51ZTsKKwogCQkJCWZvciAoaiA9IDA7IGogPCBjbWQtPm5fc3NpZHM7IGorKykKIAkJCQkJaWYgKCFtZW1jbXAocmVxLT5zc2lkc1tpXS5zc2lkLAogCQkJCQkJICAgY21kLT5zc2lkc1tqXS5zc2lkLApAQCAtNTg1LDYgKzYxMSw3IEBACiB9CiAKIGludCB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX2NvbmZpZyhzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKIAkJCQkgIHN0cnVjdCBjZmc4MDIxMV9zY2hlZF9zY2FuX3JlcXVlc3QgKnJlcSwKIAkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc2NoZWRfc2Nhbl9pZXMgKmllcykKIHsKQEAgLTYzMSw3ICs2NTgsNyBAQAogCX0KIAogCWlmICghZm9yY2VfcGFzc2l2ZSAmJiBjZmctPmFjdGl2ZVswXSkgewotCQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX3Byb2JlX3JlcSh3bCwgcmVxLT5zc2lkc1swXS5zc2lkLAorCQlyZXQgPSB3bDEyNzFfY21kX2J1aWxkX3Byb2JlX3JlcSh3bCwgd2x2aWYsIHJlcS0+c3NpZHNbMF0uc3NpZCwKIAkJCQkJCSByZXEtPnNzaWRzWzBdLnNzaWRfbGVuLAogCQkJCQkJIGllcy0+aWVbSUVFRTgwMjExX0JBTkRfMkdIWl0sCiAJCQkJCQkgaWVzLT5sZW5bSUVFRTgwMjExX0JBTkRfMkdIWl0sCkBAIC02NDMsNyArNjcwLDcgQEAKIAl9CiAKIAlpZiAoIWZvcmNlX3Bhc3NpdmUgJiYgY2ZnLT5hY3RpdmVbMV0pIHsKLQkJcmV0ID0gd2wxMjcxX2NtZF9idWlsZF9wcm9iZV9yZXEod2wsICByZXEtPnNzaWRzWzBdLnNzaWQsCisJCXJldCA9IHdsMTI3MV9jbWRfYnVpbGRfcHJvYmVfcmVxKHdsLCB3bHZpZiwgcmVxLT5zc2lkc1swXS5zc2lkLAogCQkJCQkJIHJlcS0+c3NpZHNbMF0uc3NpZF9sZW4sCiAJCQkJCQkgaWVzLT5pZVtJRUVFODAyMTFfQkFORF81R0haXSwKIAkJCQkJCSBpZXMtPmxlbltJRUVFODAyMTFfQkFORF81R0haXSwKQEAgLTY2NywxNyArNjk0LDE3IEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IHdsMTI3MV9zY2FuX3NjaGVkX3NjYW5fc3RhcnQoc3RydWN0IHdsMTI3MSAqd2wpCitpbnQgd2wxMjcxX3NjYW5fc2NoZWRfc2Nhbl9zdGFydChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCXN0cnVjdCB3bDEyNzFfY21kX3NjaGVkX3NjYW5fc3RhcnQgKnN0YXJ0OwogCWludCByZXQgPSAwOwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgImNtZCBwZXJpb2RpYyBzY2FuIHN0YXJ0Iik7CiAKLQlpZiAod2wtPmJzc190eXBlICE9IEJTU19UWVBFX1NUQV9CU1MpCisJaWYgKHdsdmlmLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9TVEFfQlNTKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX0lETEUsICZ3bC0+ZmxhZ3MpKQorCWlmICh0ZXN0X2JpdChXTFZJRl9GTEFHX0lOX1VTRSwgJndsdmlmLT5mbGFncykpCiAJCXJldHVybiAtRUJVU1k7CiAKIAlzdGFydCA9IGt6YWxsb2Moc2l6ZW9mKCpzdGFydCksIEdGUF9LRVJORUwpOwpAQCAtNzI3LDcgKzc1NCw2IEBACiAJCXdsMTI3MV9lcnJvcigiZmFpbGVkIHRvIHNlbmQgc2NoZWQgc2NhbiBzdG9wIGNvbW1hbmQiKTsKIAkJZ290byBvdXRfZnJlZTsKIAl9Ci0Jd2wtPnNjaGVkX3NjYW5uaW5nID0gZmFsc2U7CiAKIG91dF9mcmVlOgogCWtmcmVlKHN0b3ApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zY2FuLmgKaW5kZXggOTIxMTUxNS4uYTdlZDQzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NjYW4uaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Nhbi5oCkBAIC0yNiwxOCArMjYsMjAgQEAKIAogI2luY2x1ZGUgIndsMTJ4eC5oIgogCi1pbnQgd2wxMjcxX3NjYW4oc3RydWN0IHdsMTI3MSAqd2wsIGNvbnN0IHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4sCitpbnQgd2wxMjcxX3NjYW4oc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCWNvbnN0IHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4sCiAJCXN0cnVjdCBjZmc4MDIxMV9zY2FuX3JlcXVlc3QgKnJlcSk7CiBpbnQgd2wxMjcxX3NjYW5fc3RvcChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjcxX3NjYW5fYnVpbGRfcHJvYmVfcmVxKHN0cnVjdCB3bDEyNzEgKndsLAogCQkJCWNvbnN0IHU4ICpzc2lkLCBzaXplX3Qgc3NpZF9sZW4sCiAJCQkJY29uc3QgdTggKmllLCBzaXplX3QgaWVfbGVuLCB1OCBiYW5kKTsKLXZvaWQgd2wxMjcxX3NjYW5fc3RtKHN0cnVjdCB3bDEyNzEgKndsKTsKK3ZvaWQgd2wxMjcxX3NjYW5fc3RtKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKIHZvaWQgd2wxMjcxX3NjYW5fY29tcGxldGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogaW50IHdsMTI3MV9zY2FuX3NjaGVkX3NjYW5fY29uZmlnKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAogCQkJCSAgICAgc3RydWN0IGNmZzgwMjExX3NjaGVkX3NjYW5fcmVxdWVzdCAqcmVxLAogCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zY2hlZF9zY2FuX2llcyAqaWVzKTsKLWludCB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX3N0YXJ0KHN0cnVjdCB3bDEyNzEgKndsKTsKK2ludCB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX3N0YXJ0KHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOwogdm9pZCB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX3N0b3Aoc3RydWN0IHdsMTI3MSAqd2wpOwogdm9pZCB3bDEyNzFfc2Nhbl9zY2hlZF9zY2FuX3Jlc3VsdHMoc3RydWN0IHdsMTI3MSAqd2wpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Rpby5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NkaW8uYwppbmRleCA1MTZhODk4Li40NjhhNTA1IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Rpby5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zZGlvLmMKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbW1jL3NkaW9fZnVuYy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9zZGlvX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tYy9jYXJkLmg+CkBAIC00NCwxMDcgKzQ1LDY3IEBACiAjZGVmaW5lIFNESU9fREVWSUNFX0lEX1RJX1dMMTI3MQkweDQwNzYKICNlbmRpZgogCitzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvcmU7Cit9OworCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkIHdsMTI3MV9kZXZpY2VzW10gX19kZXZpbml0Y29uc3QgPSB7CiAJeyBTRElPX0RFVklDRShTRElPX1ZFTkRPUl9JRF9USSwgU0RJT19ERVZJQ0VfSURfVElfV0wxMjcxKSB9LAogCXt9CiB9OwogTU9EVUxFX0RFVklDRV9UQUJMRShzZGlvLCB3bDEyNzFfZGV2aWNlcyk7CiAKLXN0YXRpYyB2b2lkIHdsMTI3MV9zZGlvX3NldF9ibG9ja19zaXplKHN0cnVjdCB3bDEyNzEgKndsLCB1bnNpZ25lZCBpbnQgYmxrc3opCitzdGF0aWMgdm9pZCB3bDEyNzFfc2Rpb19zZXRfYmxvY2tfc2l6ZShzdHJ1Y3QgZGV2aWNlICpjaGlsZCwKKwkJCQkgICAgICAgdW5zaWduZWQgaW50IGJsa3N6KQogewotCXNkaW9fY2xhaW1faG9zdCh3bC0+aWZfcHJpdik7Ci0Jc2Rpb19zZXRfYmxvY2tfc2l6ZSh3bC0+aWZfcHJpdiwgYmxrc3opOwotCXNkaW9fcmVsZWFzZV9ob3N0KHdsLT5pZl9wcml2KTsKKwlzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShjaGlsZC0+cGFyZW50KTsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gZGV2X3RvX3NkaW9fZnVuYyhnbHVlLT5kZXYpOworCisJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOworCXNkaW9fc2V0X2Jsb2NrX3NpemUoZnVuYywgYmxrc3opOworCXNkaW9fcmVsZWFzZV9ob3N0KGZ1bmMpOwogfQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzZGlvX2Z1bmMgKndsX3RvX2Z1bmMoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JcmV0dXJuIHdsLT5pZl9wcml2OwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZSAqd2wxMjcxX3NkaW9fd2xfdG9fZGV2KHN0cnVjdCB3bDEyNzEgKndsKQotewotCXJldHVybiAmKHdsX3RvX2Z1bmMod2wpLT5kZXYpOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgd2wxMjcxX2hhcmRpcnEoaW50IGlycSwgdm9pZCAqY29va2llKQotewotCXN0cnVjdCB3bDEyNzEgKndsID0gY29va2llOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl3bDEyNzFfZGVidWcoREVCVUdfSVJRLCAiSVJRIik7Ci0KLQkvKiBjb21wbGV0ZSB0aGUgRUxQIGNvbXBsZXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQlzZXRfYml0KFdMMTI3MV9GTEFHX0lSUV9SVU5OSU5HLCAmd2wtPmZsYWdzKTsKLQlpZiAod2wtPmVscF9jb21wbCkgewotCQljb21wbGV0ZSh3bC0+ZWxwX2NvbXBsKTsKLQkJd2wtPmVscF9jb21wbCA9IE5VTEw7Ci0JfQotCi0JaWYgKHRlc3RfYml0KFdMMTI3MV9GTEFHX1NVU1BFTkRFRCwgJndsLT5mbGFncykpIHsKLQkJLyogZG9uJ3QgZW5xdWV1ZSBhIHdvcmsgcmlnaHQgbm93LiBtYXJrIGl0IGFzIHBlbmRpbmcgKi8KLQkJc2V0X2JpdChXTDEyNzFfRkxBR19QRU5ESU5HX1dPUkssICZ3bC0+ZmxhZ3MpOwotCQl3bDEyNzFfZGVidWcoREVCVUdfSVJRLCAic2hvdWxkIG5vdCBlbnF1ZXVlIHdvcmsiKTsKLQkJZGlzYWJsZV9pcnFfbm9zeW5jKHdsLT5pcnEpOwotCQlwbV93YWtldXBfZXZlbnQod2wxMjcxX3NkaW9fd2xfdG9fZGV2KHdsKSwgMCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT53bF9sb2NrLCBmbGFncyk7Ci0JCXJldHVybiBJUlFfSEFORExFRDsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBJUlFfV0FLRV9USFJFQUQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsMTI3MV9zZGlvX2Rpc2FibGVfaW50ZXJydXB0cyhzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQlkaXNhYmxlX2lycSh3bC0+aXJxKTsKLX0KLQotc3RhdGljIHZvaWQgd2wxMjcxX3NkaW9fZW5hYmxlX2ludGVycnVwdHMoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JZW5hYmxlX2lycSh3bC0+aXJxKTsKLX0KLQotc3RhdGljIHZvaWQgd2wxMjcxX3NkaW9fcmF3X3JlYWQoc3RydWN0IHdsMTI3MSAqd2wsIGludCBhZGRyLCB2b2lkICpidWYsCitzdGF0aWMgdm9pZCB3bDEyeHhfc2Rpb19yYXdfcmVhZChzdHJ1Y3QgZGV2aWNlICpjaGlsZCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKIAkJCQkgc2l6ZV90IGxlbiwgYm9vbCBmaXhlZCkKIHsKIAlpbnQgcmV0OwotCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSB3bF90b19mdW5jKHdsKTsKKwlzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShjaGlsZC0+cGFyZW50KTsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gZGV2X3RvX3NkaW9fZnVuYyhnbHVlLT5kZXYpOwogCiAJaWYgKHVubGlrZWx5KGFkZHIgPT0gSFdfQUNDRVNTX0VMUF9DVFJMX1JFR19BRERSKSkgewogCQkoKHU4ICopYnVmKVswXSA9IHNkaW9fZjBfcmVhZGIoZnVuYywgYWRkciwgJnJldCk7Ci0JCXdsMTI3MV9kZWJ1ZyhERUJVR19TRElPLCAic2RpbyByZWFkIDUyIGFkZHIgMHgleCwgYnl0ZSAweCUwMngiLAotCQkJICAgICBhZGRyLCAoKHU4ICopYnVmKVswXSk7CisJCWRldl9kYmcoY2hpbGQtPnBhcmVudCwgInNkaW8gcmVhZCA1MiBhZGRyIDB4JXgsIGJ5dGUgMHglMDJ4XG4iLAorCQkJYWRkciwgKCh1OCAqKWJ1ZilbMF0pOwogCX0gZWxzZSB7CiAJCWlmIChmaXhlZCkKIAkJCXJldCA9IHNkaW9fcmVhZHNiKGZ1bmMsIGJ1ZiwgYWRkciwgbGVuKTsKIAkJZWxzZQogCQkJcmV0ID0gc2Rpb19tZW1jcHlfZnJvbWlvKGZ1bmMsIGJ1ZiwgYWRkciwgbGVuKTsKIAotCQl3bDEyNzFfZGVidWcoREVCVUdfU0RJTywgInNkaW8gcmVhZCA1MyBhZGRyIDB4JXgsICV6dSBieXRlcyIsCi0JCQkgICAgIGFkZHIsIGxlbik7Ci0JCXdsMTI3MV9kdW1wX2FzY2lpKERFQlVHX1NESU8sICJkYXRhOiAiLCBidWYsIGxlbik7CisJCWRldl9kYmcoY2hpbGQtPnBhcmVudCwgInNkaW8gcmVhZCA1MyBhZGRyIDB4JXgsICV6dSBieXRlc1xuIiwKKwkJCWFkZHIsIGxlbik7CiAJfQogCiAJaWYgKHJldCkKLQkJd2wxMjcxX2Vycm9yKCJzZGlvIHJlYWQgZmFpbGVkICglZCkiLCByZXQpOworCQlkZXZfZXJyKGNoaWxkLT5wYXJlbnQsICJzZGlvIHJlYWQgZmFpbGVkICglZClcbiIsIHJldCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsMTI3MV9zZGlvX3Jhd193cml0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKK3N0YXRpYyB2b2lkIHdsMTJ4eF9zZGlvX3Jhd193cml0ZShzdHJ1Y3QgZGV2aWNlICpjaGlsZCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKIAkJCQkgIHNpemVfdCBsZW4sIGJvb2wgZml4ZWQpCiB7CiAJaW50IHJldDsKLQlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gd2xfdG9fZnVuYyh3bCk7CisJc3RydWN0IHdsMTJ4eF9zZGlvX2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEoY2hpbGQtPnBhcmVudCk7CisJc3RydWN0IHNkaW9fZnVuYyAqZnVuYyA9IGRldl90b19zZGlvX2Z1bmMoZ2x1ZS0+ZGV2KTsKIAogCWlmICh1bmxpa2VseShhZGRyID09IEhXX0FDQ0VTU19FTFBfQ1RSTF9SRUdfQUREUikpIHsKIAkJc2Rpb19mMF93cml0ZWIoZnVuYywgKCh1OCAqKWJ1ZilbMF0sIGFkZHIsICZyZXQpOwotCQl3bDEyNzFfZGVidWcoREVCVUdfU0RJTywgInNkaW8gd3JpdGUgNTIgYWRkciAweCV4LCBieXRlIDB4JTAyeCIsCi0JCQkgICAgIGFkZHIsICgodTggKilidWYpWzBdKTsKKwkJZGV2X2RiZyhjaGlsZC0+cGFyZW50LCAic2RpbyB3cml0ZSA1MiBhZGRyIDB4JXgsIGJ5dGUgMHglMDJ4XG4iLAorCQkJYWRkciwgKCh1OCAqKWJ1ZilbMF0pOwogCX0gZWxzZSB7Ci0JCXdsMTI3MV9kZWJ1ZyhERUJVR19TRElPLCAic2RpbyB3cml0ZSA1MyBhZGRyIDB4JXgsICV6dSBieXRlcyIsCi0JCQkgICAgIGFkZHIsIGxlbik7Ci0JCXdsMTI3MV9kdW1wX2FzY2lpKERFQlVHX1NESU8sICJkYXRhOiAiLCBidWYsIGxlbik7CisJCWRldl9kYmcoY2hpbGQtPnBhcmVudCwgInNkaW8gd3JpdGUgNTMgYWRkciAweCV4LCAlenUgYnl0ZXNcbiIsCisJCQlhZGRyLCBsZW4pOwogCiAJCWlmIChmaXhlZCkKIAkJCXJldCA9IHNkaW9fd3JpdGVzYihmdW5jLCBhZGRyLCBidWYsIGxlbik7CkBAIC0xNTMsMTMgKzExNCwxMyBAQAogCX0KIAogCWlmIChyZXQpCi0JCXdsMTI3MV9lcnJvcigic2RpbyB3cml0ZSBmYWlsZWQgKCVkKSIsIHJldCk7CisJCWRldl9lcnIoY2hpbGQtPnBhcmVudCwgInNkaW8gd3JpdGUgZmFpbGVkICglZClcbiIsIHJldCk7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX3NkaW9fcG93ZXJfb24oc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTJ4eF9zZGlvX3Bvd2VyX29uKHN0cnVjdCB3bDEyeHhfc2Rpb19nbHVlICpnbHVlKQogewotCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSB3bF90b19mdW5jKHdsKTsKIAlpbnQgcmV0OworCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSBkZXZfdG9fc2Rpb19mdW5jKGdsdWUtPmRldik7CiAKIAkvKiBJZiBlbmFibGVkLCB0ZWxsIHJ1bnRpbWUgUE0gbm90IHRvIHBvd2VyIG9mZiB0aGUgY2FyZCAqLwogCWlmIChwbV9ydW50aW1lX2VuYWJsZWQoJmZ1bmMtPmRldikpIHsKQEAgLTE4MCwxMCArMTQxLDEwIEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGludCB3bDEyNzFfc2Rpb19wb3dlcl9vZmYoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgaW50IHdsMTJ4eF9zZGlvX3Bvd2VyX29mZihzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSAqZ2x1ZSkKIHsKLQlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gd2xfdG9fZnVuYyh3bCk7CiAJaW50IHJldDsKKwlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gZGV2X3RvX3NkaW9fZnVuYyhnbHVlLT5kZXYpOwogCiAJc2Rpb19kaXNhYmxlX2Z1bmMoZnVuYyk7CiAJc2Rpb19yZWxlYXNlX2hvc3QoZnVuYyk7CkBAIC0yMDAsNDYgKzE2MSw0MyBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX3NkaW9fc2V0X3Bvd2VyKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSkKK3N0YXRpYyBpbnQgd2wxMnh4X3NkaW9fc2V0X3Bvd2VyKHN0cnVjdCBkZXZpY2UgKmNoaWxkLCBib29sIGVuYWJsZSkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShjaGlsZC0+cGFyZW50KTsKKwogCWlmIChlbmFibGUpCi0JCXJldHVybiB3bDEyNzFfc2Rpb19wb3dlcl9vbih3bCk7CisJCXJldHVybiB3bDEyeHhfc2Rpb19wb3dlcl9vbihnbHVlKTsKIAllbHNlCi0JCXJldHVybiB3bDEyNzFfc2Rpb19wb3dlcl9vZmYod2wpOworCQlyZXR1cm4gd2wxMnh4X3NkaW9fcG93ZXJfb2ZmKGdsdWUpOwogfQogCiBzdGF0aWMgc3RydWN0IHdsMTI3MV9pZl9vcGVyYXRpb25zIHNkaW9fb3BzID0gewotCS5yZWFkCQk9IHdsMTI3MV9zZGlvX3Jhd19yZWFkLAotCS53cml0ZQkJPSB3bDEyNzFfc2Rpb19yYXdfd3JpdGUsCi0JLnBvd2VyCQk9IHdsMTI3MV9zZGlvX3NldF9wb3dlciwKLQkuZGV2CQk9IHdsMTI3MV9zZGlvX3dsX3RvX2RldiwKLQkuZW5hYmxlX2lycQk9IHdsMTI3MV9zZGlvX2VuYWJsZV9pbnRlcnJ1cHRzLAotCS5kaXNhYmxlX2lycQk9IHdsMTI3MV9zZGlvX2Rpc2FibGVfaW50ZXJydXB0cywKKwkucmVhZAkJPSB3bDEyeHhfc2Rpb19yYXdfcmVhZCwKKwkud3JpdGUJCT0gd2wxMnh4X3NkaW9fcmF3X3dyaXRlLAorCS5wb3dlcgkJPSB3bDEyeHhfc2Rpb19zZXRfcG93ZXIsCiAJLnNldF9ibG9ja19zaXplID0gd2wxMjcxX3NkaW9fc2V0X2Jsb2NrX3NpemUsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCB3bDEyNzFfcHJvYmUoc3RydWN0IHNkaW9fZnVuYyAqZnVuYywKIAkJCQkgIGNvbnN0IHN0cnVjdCBzZGlvX2RldmljZV9pZCAqaWQpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9odyAqaHc7Ci0JY29uc3Qgc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhICp3bGFuX2RhdGE7Ci0Jc3RydWN0IHdsMTI3MSAqd2w7Ci0JdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwlzdHJ1Y3Qgd2wxMnh4X3BsYXRmb3JtX2RhdGEgKndsYW5fZGF0YTsKKwlzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSAqZ2x1ZTsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzWzFdOwogCW1tY19wbV9mbGFnX3QgbW1jZmxhZ3M7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gLUVOT01FTTsKIAogCS8qIFdlIGFyZSBvbmx5IGFibGUgdG8gaGFuZGxlIHRoZSB3bGFuIGZ1bmN0aW9uICovCiAJaWYgKGZ1bmMtPm51bSAhPSAweDAyKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWh3ID0gd2wxMjcxX2FsbG9jX2h3KCk7Ci0JaWYgKElTX0VSUihodykpCi0JCXJldHVybiBQVFJfRVJSKGh3KTsKKwlnbHVlID0ga3phbGxvYyhzaXplb2YoKmdsdWUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWdsdWUpIHsKKwkJZGV2X2VycigmZnVuYy0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgZ2x1ZVxuIik7CisJCWdvdG8gb3V0OworCX0KIAotCXdsID0gaHctPnByaXY7Ci0KLQl3bC0+aWZfcHJpdiA9IGZ1bmM7Ci0Jd2wtPmlmX29wcyA9ICZzZGlvX29wczsKKwlnbHVlLT5kZXYgPSAmZnVuYy0+ZGV2OwogCiAJLyogR3JhYiBhY2Nlc3MgdG8gRk4wIGZvciBFTFAgcmVnLiAqLwogCWZ1bmMtPmNhcmQtPnF1aXJrcyB8PSBNTUNfUVVJUktfTEVOSUVOVF9GTjA7CkBAIC0yNTAsODAgKzIwOCw3OSBAQAogCXdsYW5fZGF0YSA9IHdsMTJ4eF9nZXRfcGxhdGZvcm1fZGF0YSgpOwogCWlmIChJU19FUlIod2xhbl9kYXRhKSkgewogCQlyZXQgPSBQVFJfRVJSKHdsYW5fZGF0YSk7Ci0JCXdsMTI3MV9lcnJvcigibWlzc2luZyB3bGFuIHBsYXRmb3JtIGRhdGE6ICVkIiwgcmV0KTsKLQkJZ290byBvdXRfZnJlZTsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJtaXNzaW5nIHdsYW4gcGxhdGZvcm0gZGF0YTogJWRcbiIsIHJldCk7CisJCWdvdG8gb3V0X2ZyZWVfZ2x1ZTsKIAl9CiAKLQl3bC0+aXJxID0gd2xhbl9kYXRhLT5pcnE7Ci0Jd2wtPnJlZl9jbG9jayA9IHdsYW5fZGF0YS0+Ym9hcmRfcmVmX2Nsb2NrOwotCXdsLT50Y3hvX2Nsb2NrID0gd2xhbl9kYXRhLT5ib2FyZF90Y3hvX2Nsb2NrOwotCXdsLT5wbGF0Zm9ybV9xdWlya3MgPSB3bGFuX2RhdGEtPnBsYXRmb3JtX3F1aXJrczsKKwkvKiBpZiBzZGlvIGNhbiBrZWVwIHBvd2VyIHdoaWxlIGhvc3QgaXMgc3VzcGVuZGVkLCBlbmFibGUgd293ICovCisJbW1jZmxhZ3MgPSBzZGlvX2dldF9ob3N0X3BtX2NhcHMoZnVuYyk7CisJZGV2X2RiZyhnbHVlLT5kZXYsICJzZGlvIFBNIGNhcHMgPSAweCV4XG4iLCBtbWNmbGFncyk7CiAKLQlpZiAod2wtPnBsYXRmb3JtX3F1aXJrcyAmIFdMMTJYWF9QTEFURk9STV9RVUlSS19FREdFX0lSUSkKLQkJaXJxZmxhZ3MgPSBJUlFGX1RSSUdHRVJfUklTSU5HOwotCWVsc2UKLQkJaXJxZmxhZ3MgPSBJUlFGX1RSSUdHRVJfSElHSCB8IElSUUZfT05FU0hPVDsKKwlpZiAobW1jZmxhZ3MgJiBNTUNfUE1fS0VFUF9QT1dFUikKKwkJd2xhbl9kYXRhLT5wd3JfaW5fc3VzcGVuZCA9IHRydWU7CiAKLQlyZXQgPSByZXF1ZXN0X3RocmVhZGVkX2lycSh3bC0+aXJxLCB3bDEyNzFfaGFyZGlycSwgd2wxMjcxX2lycSwKLQkJCQkgICBpcnFmbGFncywKLQkJCQkgICBEUklWRVJfTkFNRSwgd2wpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXdsMTI3MV9lcnJvcigicmVxdWVzdF9pcnEoKSBmYWlsZWQ6ICVkIiwgcmV0KTsKLQkJZ290byBvdXRfZnJlZTsKLQl9CisJd2xhbl9kYXRhLT5vcHMgPSAmc2Rpb19vcHM7CiAKLQlyZXQgPSBlbmFibGVfaXJxX3dha2Uod2wtPmlycSk7Ci0JaWYgKCFyZXQpIHsKLQkJd2wtPmlycV93YWtlX2VuYWJsZWQgPSB0cnVlOwotCQlkZXZpY2VfaW5pdF93YWtldXAod2wxMjcxX3NkaW9fd2xfdG9fZGV2KHdsKSwgMSk7Ci0KLQkJLyogaWYgc2RpbyBjYW4ga2VlcCBwb3dlciB3aGlsZSBob3N0IGlzIHN1c3BlbmRlZCwgZW5hYmxlIHdvdyAqLwotCQltbWNmbGFncyA9IHNkaW9fZ2V0X2hvc3RfcG1fY2FwcyhmdW5jKTsKLQkJd2wxMjcxX2RlYnVnKERFQlVHX1NESU8sICJzZGlvIFBNIGNhcHMgPSAweCV4IiwgbW1jZmxhZ3MpOwotCi0JCWlmIChtbWNmbGFncyAmIE1NQ19QTV9LRUVQX1BPV0VSKQotCQkJaHctPndpcGh5LT53b3dsYW4uZmxhZ3MgPSBXSVBIWV9XT1dMQU5fQU5ZOwotCX0KLQlkaXNhYmxlX2lycSh3bC0+aXJxKTsKLQotCXJldCA9IHdsMTI3MV9pbml0X2llZWU4MDIxMSh3bCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfaXJxOwotCi0JcmV0ID0gd2wxMjcxX3JlZ2lzdGVyX2h3KHdsKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9pcnE7Ci0KLQlzZGlvX3NldF9kcnZkYXRhKGZ1bmMsIHdsKTsKKwlzZGlvX3NldF9kcnZkYXRhKGZ1bmMsIGdsdWUpOwogCiAJLyogVGVsbCBQTSBjb3JlIHRoYXQgd2UgZG9uJ3QgbmVlZCB0aGUgY2FyZCB0byBiZSBwb3dlcmVkIG5vdyAqLwogCXBtX3J1bnRpbWVfcHV0X25vaWRsZSgmZnVuYy0+ZGV2KTsKIAorCWdsdWUtPmNvcmUgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoIndsMTJ4eCIsIC0xKTsKKwlpZiAoIWdsdWUtPmNvcmUpIHsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJjYW4ndCBhbGxvY2F0ZSBwbGF0Zm9ybV9kZXZpY2UiKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9nbHVlOworCX0KKworCWdsdWUtPmNvcmUtPmRldi5wYXJlbnQgPSAmZnVuYy0+ZGV2OworCisJbWVtc2V0KHJlcywgMHgwMCwgc2l6ZW9mKHJlcykpOworCisJcmVzWzBdLnN0YXJ0ID0gd2xhbl9kYXRhLT5pcnE7CisJcmVzWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJcmVzWzBdLm5hbWUgPSAiaXJxIjsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKGdsdWUtPmNvcmUsIHJlcywgQVJSQVlfU0laRShyZXMpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWRkIHJlc291cmNlc1xuIik7CisJCWdvdG8gb3V0X2Rldl9wdXQ7CisJfQorCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGdsdWUtPmNvcmUsIHdsYW5fZGF0YSwKKwkJCQkgICAgICAgc2l6ZW9mKCp3bGFuX2RhdGEpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWRkIHBsYXRmb3JtIGRhdGFcbiIpOworCQlnb3RvIG91dF9kZXZfcHV0OworCX0KKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGQoZ2x1ZS0+Y29yZSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdsdWUtPmRldiwgImNhbid0IGFkZCBwbGF0Zm9ybSBkZXZpY2VcbiIpOworCQlnb3RvIG91dF9kZXZfcHV0OworCX0KIAlyZXR1cm4gMDsKIAotIG91dF9pcnE6Ci0JZnJlZV9pcnEod2wtPmlycSwgd2wpOworb3V0X2Rldl9wdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChnbHVlLT5jb3JlKTsKIAotIG91dF9mcmVlOgotCXdsMTI3MV9mcmVlX2h3KHdsKTsKK291dF9mcmVlX2dsdWU6CisJa2ZyZWUoZ2x1ZSk7CiAKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBfX2RldmV4aXQgd2wxMjcxX3JlbW92ZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jKQogewotCXN0cnVjdCB3bDEyNzEgKndsID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKwlzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSAqZ2x1ZSA9IHNkaW9fZ2V0X2RydmRhdGEoZnVuYyk7CiAKIAkvKiBVbmRvIGRlY3JlbWVudCBkb25lIGFib3ZlIGluIHdsMTI3MV9wcm9iZSAqLwogCXBtX3J1bnRpbWVfZ2V0X25vcmVzdW1lKCZmdW5jLT5kZXYpOwogCi0Jd2wxMjcxX3VucmVnaXN0ZXJfaHcod2wpOwotCWlmICh3bC0+aXJxX3dha2VfZW5hYmxlZCkgewotCQlkZXZpY2VfaW5pdF93YWtldXAod2wxMjcxX3NkaW9fd2xfdG9fZGV2KHdsKSwgMCk7Ci0JCWRpc2FibGVfaXJxX3dha2Uod2wtPmlycSk7Ci0JfQotCWZyZWVfaXJxKHdsLT5pcnEsIHdsKTsKLQl3bDEyNzFfZnJlZV9odyh3bCk7CisJcGxhdGZvcm1fZGV2aWNlX2RlbChnbHVlLT5jb3JlKTsKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KGdsdWUtPmNvcmUpOworCWtmcmVlKGdsdWUpOwogfQogCiAjaWZkZWYgQ09ORklHX1BNCkBAIC0zMzIsMjAgKzI4OSwyMSBAQAogCS8qIFRlbGwgTU1DL1NESU8gY29yZSBpdCdzIE9LIHRvIHBvd2VyIGRvd24gdGhlIGNhcmQKIAkgKiAoaWYgaXQgaXNuJ3QgYWxyZWFkeSksIGJ1dCBub3QgdG8gcmVtb3ZlIGl0IGNvbXBsZXRlbHkgKi8KIAlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gZGV2X3RvX3NkaW9fZnVuYyhkZXYpOwotCXN0cnVjdCB3bDEyNzEgKndsID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKwlzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSAqZ2x1ZSA9IHNkaW9fZ2V0X2RydmRhdGEoZnVuYyk7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShnbHVlLT5jb3JlKTsKIAltbWNfcG1fZmxhZ190IHNkaW9fZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKLQl3bDEyNzFfZGVidWcoREVCVUdfTUFDODAyMTEsICJ3bDEyNzEgc3VzcGVuZC4gd293X2VuYWJsZWQ6ICVkIiwKLQkJICAgICB3bC0+d293X2VuYWJsZWQpOworCWRldl9kYmcoZGV2LCAid2wxMjcxIHN1c3BlbmQuIHdvd19lbmFibGVkOiAlZFxuIiwKKwkJd2wtPndvd19lbmFibGVkKTsKIAogCS8qIGNoZWNrIHdoZXRoZXIgc2RpbyBzaG91bGQga2VlcCBwb3dlciAqLwogCWlmICh3bC0+d293X2VuYWJsZWQpIHsKIAkJc2Rpb19mbGFncyA9IHNkaW9fZ2V0X2hvc3RfcG1fY2FwcyhmdW5jKTsKIAogCQlpZiAoIShzZGlvX2ZsYWdzICYgTU1DX1BNX0tFRVBfUE9XRVIpKSB7Ci0JCQl3bDEyNzFfZXJyb3IoImNhbid0IGtlZXAgcG93ZXIgd2hpbGUgaG9zdCAiCi0JCQkJICAgICAiaXMgc3VzcGVuZGVkIik7CisJCQlkZXZfZXJyKGRldiwgImNhbid0IGtlZXAgcG93ZXIgd2hpbGUgaG9zdCAiCisJCQkJICAgICAiaXMgc3VzcGVuZGVkXG4iKTsKIAkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQpAQCAtMzUzLDcgKzMxMSw3IEBACiAJCS8qIGtlZXAgcG93ZXIgd2hpbGUgaG9zdCBzdXNwZW5kZWQgKi8KIAkJcmV0ID0gc2Rpb19zZXRfaG9zdF9wbV9mbGFncyhmdW5jLCBNTUNfUE1fS0VFUF9QT1dFUik7CiAJCWlmIChyZXQpIHsKLQkJCXdsMTI3MV9lcnJvcigiZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGtlZXAgcG93ZXIiKTsKKwkJCWRldl9lcnIoZGV2LCAiZXJyb3Igd2hpbGUgdHJ5aW5nIHRvIGtlZXAgcG93ZXJcbiIpOwogCQkJZ290byBvdXQ7CiAJCX0KIApAQCAtMzY3LDkgKzMyNSwxMCBAQAogc3RhdGljIGludCB3bDEyNzFfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gZGV2X3RvX3NkaW9fZnVuYyhkZXYpOwotCXN0cnVjdCB3bDEyNzEgKndsID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKKwlzdHJ1Y3Qgd2wxMnh4X3NkaW9fZ2x1ZSAqZ2x1ZSA9IHNkaW9fZ2V0X2RydmRhdGEoZnVuYyk7CisJc3RydWN0IHdsMTI3MSAqd2wgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShnbHVlLT5jb3JlKTsKIAotCXdsMTI3MV9kZWJ1ZyhERUJVR19NQUM4MDIxMSwgIndsMTI3MSByZXN1bWUiKTsKKwlkZXZfZGJnKGRldiwgIndsMTI3MSByZXN1bWVcbiIpOwogCWlmICh3bC0+d293X2VuYWJsZWQpIHsKIAkJLyogY2xhaW0gYmFjayBob3N0ICovCiAJCXNkaW9fY2xhaW1faG9zdChmdW5jKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zZGlvX3Rlc3QuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zZGlvX3Rlc3QuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI1ZDVkOS4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc2Rpb190ZXN0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NDMgKzAsMCBAQAotLyoKLSAqIFNESU8gdGVzdGluZyBkcml2ZXIgZm9yIHdsMTJ4eAotICoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBOb2tpYSBDb3Jwb3JhdGlvbgotICoKLSAqIENvbnRhY3Q6IFJvZ2VyIFF1YWRyb3MgPHJvZ2VyLnF1YWRyb3NAbm9raWEuY29tPgotICoKLSAqIHdsMTJ4eCByZWFkL3dyaXRlIHJvdXRpbmVzIHRha2VuIGZyb20gdGhlIG1haW4gbW9kdWxlCi0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgotICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKLSAqIHZlcnNpb24gMiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0Ci0gKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgotICoKLSAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCi0gKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQotICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCi0gKiAwMjExMC0xMzAxIFVTQQotICoKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvY3JjNy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvc2Rpb19mdW5jLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL3NkaW9faWRzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW1jL2NhcmQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWMvaG9zdC5oPgotI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KLSNpbmNsdWRlIDxsaW51eC93bDEyeHguaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KLSNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+Ci0KLSNpbmNsdWRlICJ3bDEyeHguaCIKLSNpbmNsdWRlICJpby5oIgotI2luY2x1ZGUgImJvb3QuaCIKLQotI2lmbmRlZiBTRElPX1ZFTkRPUl9JRF9USQotI2RlZmluZSBTRElPX1ZFTkRPUl9JRF9USQkJMHgwMDk3Ci0jZW5kaWYKLQotI2lmbmRlZiBTRElPX0RFVklDRV9JRF9USV9XTDEyNzEKLSNkZWZpbmUgU0RJT19ERVZJQ0VfSURfVElfV0wxMjcxCTB4NDA3NgotI2VuZGlmCi0KLXN0YXRpYyBib29sIHJ4LCB0eDsKLQotbW9kdWxlX3BhcmFtKHJ4LCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7Ci1NT0RVTEVfUEFSTV9ERVNDKHJ4LCAiUGVyZm9ybSByeCB0ZXN0LiBEZWZhdWx0ICgwKS4gIgotCSJUaGlzIHRlc3QgY29udGludW91c2x5IHJlYWRzIGRhdGEgZnJvbSB0aGUgU0RJTyBkZXZpY2UuXG4iKTsKLQotbW9kdWxlX3BhcmFtKHR4LCBib29sLCBTX0lSVUdPIHwgU19JV1VTUik7Ci1NT0RVTEVfUEFSTV9ERVNDKHR4LCAiUGVyZm9ybSB0eCB0ZXN0LiBEZWZhdWx0ICgwKS4gIgotCSJUaGlzIHRlc3QgY29udGludW91c2x5IHdyaXRlcyBkYXRhIHRvIHRoZSBTRElPIGRldmljZS5cbiIpOwotCi1zdHJ1Y3Qgd2wxMjcxX3Rlc3QgewotCXN0cnVjdCB3bDEyNzEgd2w7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0ZXN0X3Rhc2s7Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNkaW9fZGV2aWNlX2lkIHdsMTI3MV9kZXZpY2VzW10gPSB7Ci0JeyBTRElPX0RFVklDRShTRElPX1ZFTkRPUl9JRF9USSwgU0RJT19ERVZJQ0VfSURfVElfV0wxMjcxKSB9LAotCXt9Ci19OwotCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzZGlvX2Z1bmMgKndsX3RvX2Z1bmMoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JcmV0dXJuIHdsLT5pZl9wcml2OwotfQotCi1zdGF0aWMgc3RydWN0IGRldmljZSAqd2wxMjcxX3NkaW9fd2xfdG9fZGV2KHN0cnVjdCB3bDEyNzEgKndsKQotewotCXJldHVybiAmKHdsX3RvX2Z1bmMod2wpLT5kZXYpOwotfQotCi1zdGF0aWMgdm9pZCB3bDEyNzFfc2Rpb19yYXdfcmVhZChzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKLQkJc2l6ZV90IGxlbiwgYm9vbCBmaXhlZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gd2xfdG9fZnVuYyh3bCk7Ci0KLQlpZiAodW5saWtlbHkoYWRkciA9PSBIV19BQ0NFU1NfRUxQX0NUUkxfUkVHX0FERFIpKSB7Ci0JCSgodTggKilidWYpWzBdID0gc2Rpb19mMF9yZWFkYihmdW5jLCBhZGRyLCAmcmV0KTsKLQkJd2wxMjcxX2RlYnVnKERFQlVHX1NESU8sICJzZGlvIHJlYWQgNTIgYWRkciAweCV4LCBieXRlIDB4JTAyeCIsCi0JCQkJYWRkciwgKCh1OCAqKWJ1ZilbMF0pOwotCX0gZWxzZSB7Ci0JCWlmIChmaXhlZCkKLQkJCXJldCA9IHNkaW9fcmVhZHNiKGZ1bmMsIGJ1ZiwgYWRkciwgbGVuKTsKLQkJZWxzZQotCQkJcmV0ID0gc2Rpb19tZW1jcHlfZnJvbWlvKGZ1bmMsIGJ1ZiwgYWRkciwgbGVuKTsKLQotCQl3bDEyNzFfZGVidWcoREVCVUdfU0RJTywgInNkaW8gcmVhZCA1MyBhZGRyIDB4JXgsICV6dSBieXRlcyIsCi0JCQkJYWRkciwgbGVuKTsKLQkJd2wxMjcxX2R1bXBfYXNjaWkoREVCVUdfU0RJTywgImRhdGE6ICIsIGJ1ZiwgbGVuKTsKLQl9Ci0KLQlpZiAocmV0KQotCQl3bDEyNzFfZXJyb3IoInNkaW8gcmVhZCBmYWlsZWQgKCVkKSIsIHJldCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsMTI3MV9zZGlvX3Jhd193cml0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKLQkJc2l6ZV90IGxlbiwgYm9vbCBmaXhlZCkKLXsKLQlpbnQgcmV0ID0gMDsKLQlzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jID0gd2xfdG9fZnVuYyh3bCk7Ci0KLQlpZiAodW5saWtlbHkoYWRkciA9PSBIV19BQ0NFU1NfRUxQX0NUUkxfUkVHX0FERFIpKSB7Ci0JCXNkaW9fZjBfd3JpdGViKGZ1bmMsICgodTggKilidWYpWzBdLCBhZGRyLCAmcmV0KTsKLQkJd2wxMjcxX2RlYnVnKERFQlVHX1NESU8sICJzZGlvIHdyaXRlIDUyIGFkZHIgMHgleCwgYnl0ZSAweCUwMngiLAotCQkJCWFkZHIsICgodTggKilidWYpWzBdKTsKLQl9IGVsc2UgewotCQl3bDEyNzFfZGVidWcoREVCVUdfU0RJTywgInNkaW8gd3JpdGUgNTMgYWRkciAweCV4LCAlenUgYnl0ZXMiLAotCQkJCWFkZHIsIGxlbik7Ci0JCXdsMTI3MV9kdW1wX2FzY2lpKERFQlVHX1NESU8sICJkYXRhOiAiLCBidWYsIGxlbik7Ci0KLQkJaWYgKGZpeGVkKQotCQkJcmV0ID0gc2Rpb193cml0ZXNiKGZ1bmMsIGFkZHIsIGJ1ZiwgbGVuKTsKLQkJZWxzZQotCQkJcmV0ID0gc2Rpb19tZW1jcHlfdG9pbyhmdW5jLCBhZGRyLCBidWYsIGxlbik7Ci0JfQotCWlmIChyZXQpCi0JCXdsMTI3MV9lcnJvcigic2RpbyB3cml0ZSBmYWlsZWQgKCVkKSIsIHJldCk7Ci0KLX0KLQotc3RhdGljIGludCB3bDEyNzFfc2Rpb19zZXRfcG93ZXIoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSB3bF90b19mdW5jKHdsKTsKLQlpbnQgcmV0OwotCi0JLyogTGV0IHRoZSBTRElPIHN0YWNrIGhhbmRsZSB3bGFuX2VuYWJsZSBjb250cm9sLCBzbyB3ZQotCSAqIGtlZXAgaG9zdCBjbGFpbWVkIHdoaWxlIHdsYW4gaXMgaW4gdXNlIHRvIGtlZXAgd2wxMjcxCi0JICogYWxpdmUuCi0JICovCi0JaWYgKGVuYWJsZSkgewotCQkvKiBQb3dlciB1cCB0aGUgY2FyZCAqLwotCQlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5jKCZmdW5jLT5kZXYpOwotCQlpZiAocmV0IDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCS8qIFJ1bnRpbWUgUE0gbWlnaHQgYmUgZGlzYWJsZWQsIHBvd2VyIHVwIHRoZSBjYXJkIG1hbnVhbGx5ICovCi0JCXJldCA9IG1tY19wb3dlcl9yZXN0b3JlX2hvc3QoZnVuYy0+Y2FyZC0+aG9zdCk7Ci0JCWlmIChyZXQgPCAwKQotCQkJZ290byBvdXQ7Ci0KLQkJc2Rpb19jbGFpbV9ob3N0KGZ1bmMpOwotCQlzZGlvX2VuYWJsZV9mdW5jKGZ1bmMpOwotCX0gZWxzZSB7Ci0JCXNkaW9fZGlzYWJsZV9mdW5jKGZ1bmMpOwotCQlzZGlvX3JlbGVhc2VfaG9zdChmdW5jKTsKLQotCQkvKiBSdW50aW1lIFBNIG1pZ2h0IGJlIGRpc2FibGVkLCBwb3dlciBvZmYgdGhlIGNhcmQgbWFudWFsbHkgKi8KLQkJcmV0ID0gbW1jX3Bvd2VyX3NhdmVfaG9zdChmdW5jLT5jYXJkLT5ob3N0KTsKLQkJaWYgKHJldCA8IDApCi0JCQlnb3RvIG91dDsKLQotCQkvKiBQb3dlciBkb3duIHRoZSBjYXJkICovCi0JCXJldCA9IHBtX3J1bnRpbWVfcHV0X3N5bmMoJmZ1bmMtPmRldik7Ci0JfQotCi1vdXQ6Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgd2wxMjcxX3NkaW9fZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCB3bDEyNzEgKndsKQotewotfQotCi1zdGF0aWMgdm9pZCB3bDEyNzFfc2Rpb19lbmFibGVfaW50ZXJydXB0cyhzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLX0KLQotCi1zdGF0aWMgc3RydWN0IHdsMTI3MV9pZl9vcGVyYXRpb25zIHNkaW9fb3BzID0gewotCS5yZWFkCQk9IHdsMTI3MV9zZGlvX3Jhd19yZWFkLAotCS53cml0ZQkJPSB3bDEyNzFfc2Rpb19yYXdfd3JpdGUsCi0JLnBvd2VyCQk9IHdsMTI3MV9zZGlvX3NldF9wb3dlciwKLQkuZGV2CQk9IHdsMTI3MV9zZGlvX3dsX3RvX2RldiwKLQkuZW5hYmxlX2lycQk9IHdsMTI3MV9zZGlvX2VuYWJsZV9pbnRlcnJ1cHRzLAotCS5kaXNhYmxlX2lycQk9IHdsMTI3MV9zZGlvX2Rpc2FibGVfaW50ZXJydXB0cywKLX07Ci0KLXN0YXRpYyB2b2lkIHdsMTI3MV9md193YWtldXAoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JdTMyIGVscF9yZWc7Ci0KLQllbHBfcmVnID0gRUxQQ1RSTF9XQUtFX1VQOwotCXdsMTI3MV9yYXdfd3JpdGUzMih3bCwgSFdfQUNDRVNTX0VMUF9DVFJMX1JFR19BRERSLCBlbHBfcmVnKTsKLX0KLQotc3RhdGljIGludCB3bDEyNzFfZmV0Y2hfZmlybXdhcmUoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JY29uc3Qgc3RydWN0IGZpcm13YXJlICpmdzsKLQlpbnQgcmV0OwotCi0JaWYgKHdsLT5jaGlwLmlkID09IENISVBfSURfMTI4M19QRzIwKQotCQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgV0wxMjhYX0ZXX05BTUUsCi0JCQkJICAgICAgIHdsMTI3MV93bF90b19kZXYod2wpKTsKLQllbHNlCi0JCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZ3LCBXTDEyN1hfRldfTkFNRSwKLQkJCQkgICAgICAgd2wxMjcxX3dsX3RvX2Rldih3bCkpOwotCi0JaWYgKHJldCA8IDApIHsKLQkJd2wxMjcxX2Vycm9yKCJjb3VsZCBub3QgZ2V0IGZpcm13YXJlOiAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKGZ3LT5zaXplICUgNCkgewotCQl3bDEyNzFfZXJyb3IoImZpcm13YXJlIHNpemUgaXMgbm90IG11bHRpcGxlIG9mIDMyIGJpdHM6ICV6dSIsCi0JCQkJZnctPnNpemUpOwotCQlyZXQgPSAtRUlMU0VROwotCQlnb3RvIG91dDsKLQl9Ci0KLQl3bC0+ZndfbGVuID0gZnctPnNpemU7Ci0Jd2wtPmZ3ID0gdm1hbGxvYyh3bC0+ZndfbGVuKTsKLQotCWlmICghd2wtPmZ3KSB7Ci0JCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGZpcm13YXJlIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCW1lbWNweSh3bC0+ZncsIGZ3LT5kYXRhLCB3bC0+ZndfbGVuKTsKLQotCXJldCA9IDA7Ci0KLW91dDoKLQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2wxMjcxX2ZldGNoX252cyhzdHJ1Y3Qgd2wxMjcxICp3bCkKLXsKLQljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZ3OwotCWludCByZXQ7Ci0KLQlyZXQgPSByZXF1ZXN0X2Zpcm13YXJlKCZmdywgV0wxMlhYX05WU19OQU1FLCB3bDEyNzFfd2xfdG9fZGV2KHdsKSk7Ci0KLQlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfZXJyb3IoImNvdWxkIG5vdCBnZXQgbnZzIGZpbGU6ICVkIiwgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQl3bC0+bnZzID0ga21lbWR1cChmdy0+ZGF0YSwgZnctPnNpemUsIEdGUF9LRVJORUwpOwotCi0JaWYgKCF3bC0+bnZzKSB7Ci0JCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIG52cyBmaWxlIik7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCXdsLT5udnNfbGVuID0gZnctPnNpemU7Ci0KLW91dDoKLQlyZWxlYXNlX2Zpcm13YXJlKGZ3KTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgd2wxMjcxX2NoaXBfd2FrZXVwKHN0cnVjdCB3bDEyNzEgKndsKQotewotCXN0cnVjdCB3bDEyNzFfcGFydGl0aW9uX3NldCBwYXJ0aXRpb247Ci0JaW50IHJldDsKLQotCW1zbGVlcChXTDEyNzFfUFJFX1BPV0VSX09OX1NMRUVQKTsKLQlyZXQgPSB3bDEyNzFfcG93ZXJfb24od2wpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQltc2xlZXAoV0wxMjcxX1BPV0VSX09OX1NMRUVQKTsKLQotCS8qIFdlIGRvbid0IG5lZWQgYSByZWFsIG1lbW9yeSBwYXJ0aXRpb24gaGVyZSwgYmVjYXVzZSB3ZSBvbmx5IHdhbnQKLQkgKiB0byB1c2UgdGhlIHJlZ2lzdGVycyBhdCB0aGlzIHBvaW50LiAqLwotCW1lbXNldCgmcGFydGl0aW9uLCAwLCBzaXplb2YocGFydGl0aW9uKSk7Ci0JcGFydGl0aW9uLnJlZy5zdGFydCA9IFJFR0lTVEVSU19CQVNFOwotCXBhcnRpdGlvbi5yZWcuc2l6ZSA9IFJFR0lTVEVSU19ET1dOX1NJWkU7Ci0Jd2wxMjcxX3NldF9wYXJ0aXRpb24od2wsICZwYXJ0aXRpb24pOwotCi0JLyogRUxQIG1vZHVsZSB3YWtlIHVwICovCi0Jd2wxMjcxX2Z3X3dha2V1cCh3bCk7Ci0KLQkvKiB3aGFsX0Z3Q3RybF9Cb290U20oKSAqLwotCi0JLyogMC4gcmVhZCBjaGlwIGlkIGZyb20gQ0hJUF9JRCAqLwotCXdsLT5jaGlwLmlkID0gd2wxMjcxX3JlYWQzMih3bCwgQ0hJUF9JRF9CKTsKLQotCS8qIDEuIGNoZWNrIGlmIGNoaXAgaWQgaXMgdmFsaWQgKi8KLQotCXN3aXRjaCAod2wtPmNoaXAuaWQpIHsKLQljYXNlIENISVBfSURfMTI3MV9QRzEwOgotCQl3bDEyNzFfd2FybmluZygiY2hpcCBpZCAweCV4ICgxMjcxIFBHMTApIHN1cHBvcnQgaXMgb2Jzb2xldGUiLAotCQkJCXdsLT5jaGlwLmlkKTsKLQkJYnJlYWs7Ci0JY2FzZSBDSElQX0lEXzEyNzFfUEcyMDoKLQkJd2wxMjcxX25vdGljZSgiY2hpcCBpZCAweCV4ICgxMjcxIFBHMjApIiwKLQkJCQl3bC0+Y2hpcC5pZCk7Ci0JCWJyZWFrOwotCWNhc2UgQ0hJUF9JRF8xMjgzX1BHMjA6Ci0JCXdsMTI3MV9ub3RpY2UoImNoaXAgaWQgMHgleCAoMTI4MyBQRzIwKSIsCi0JCQkJd2wtPmNoaXAuaWQpOwotCQlicmVhazsKLQljYXNlIENISVBfSURfMTI4M19QRzEwOgotCWRlZmF1bHQ6Ci0JCXdsMTI3MV93YXJuaW5nKCJ1bnN1cHBvcnRlZCBjaGlwIGlkOiAweCV4Iiwgd2wtPmNoaXAuaWQpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgc3RydWN0IHdsMTI3MV9wYXJ0aXRpb25fc2V0IHBhcnRfZG93biA9IHsKLQkubWVtID0gewotCQkuc3RhcnQgPSAweDAwMDAwMDAwLAotCQkuc2l6ZSAgPSAweDAwMDE3N2MwCi0JfSwKLQkucmVnID0gewotCQkuc3RhcnQgPSBSRUdJU1RFUlNfQkFTRSwKLQkJLnNpemUgID0gMHgwMDAwODgwMAotCX0sCi0JLm1lbTIgPSB7Ci0JCS5zdGFydCA9IDB4MDAwMDAwMDAsCi0JCS5zaXplICA9IDB4MDAwMDAwMDAKLQl9LAotCS5tZW0zID0gewotCQkuc3RhcnQgPSAweDAwMDAwMDAwLAotCQkuc2l6ZSAgPSAweDAwMDAwMDAwCi0JfSwKLX07Ci0KLXN0YXRpYyBpbnQgdGVzdGVyKHZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPSBkYXRhOwotCXN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMgPSB3bF90b19mdW5jKHdsKTsKLQlzdHJ1Y3QgZGV2aWNlICpwZGV2ID0gJmZ1bmMtPmRldjsKLQlpbnQgcmV0ID0gMDsKLQlib29sIHJ4X3N0YXJ0ZWQgPSAwOwotCWJvb2wgdHhfc3RhcnRlZCA9IDA7Ci0JdWludDhfdCAqdHhfYnVmLCAqcnhfYnVmOwotCWludCB0ZXN0X3NpemUgPSBQQUdFX1NJWkU7Ci0JdTMyIGFkZHIgPSAwOwotCXN0cnVjdCB3bDEyNzFfcGFydGl0aW9uX3NldCBwYXJ0aXRpb247Ci0KLQkvKiBXZSBhc3N1bWUgY2hpcCBpcyBwb3dlcmVkIHVwIGFuZCBmaXJtd2FyZSBmZXRjaGVkICovCi0KLQltZW1jcHkoJnBhcnRpdGlvbiwgJnBhcnRfZG93biwgc2l6ZW9mKHBhcnRpdGlvbikpOwotCXBhcnRpdGlvbi5tZW0uc3RhcnQgPSBhZGRyOwotCXdsMTI3MV9zZXRfcGFydGl0aW9uKHdsLCAmcGFydGl0aW9uKTsKLQotCXR4X2J1ZiA9IGttYWxsb2ModGVzdF9zaXplLCBHRlBfS0VSTkVMKTsKLQlyeF9idWYgPSBrbWFsbG9jKHRlc3Rfc2l6ZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0eF9idWYgfHwgIXJ4X2J1ZikgewotCQlkZXZfZXJyKHBkZXYsCi0JCQkiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeS4gVGVzdCB3aWxsIG5vdCBydW4uXG4iKTsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBmcmVlOwotCX0KLQotCW1lbXNldCh0eF9idWYsIDB4NWEsIHRlc3Rfc2l6ZSk7Ci0KLQkvKiB3cml0ZSBzb21ldGhpbmcgaW4gZGF0YSBhcmVhIHNvIHdlIGNhbiByZWFkIGl0IGJhY2sgKi8KLQl3bDEyNzFfd3JpdGUod2wsIGFkZHIsIHR4X2J1ZiwgdGVzdF9zaXplLCBmYWxzZSk7Ci0KLQl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlpZiAocnggJiYgIXJ4X3N0YXJ0ZWQpIHsKLQkJCWRldl9pbmZvKHBkZXYsICJzdGFydGluZyByeCB0ZXN0XG4iKTsKLQkJCXJ4X3N0YXJ0ZWQgPSAxOwotCQl9IGVsc2UgaWYgKCFyeCAmJiByeF9zdGFydGVkKSB7Ci0JCQlkZXZfaW5mbyhwZGV2LCAic3RvcHBpbmcgcnggdGVzdFxuIik7Ci0JCQlyeF9zdGFydGVkID0gMDsKLQkJfQotCi0JCWlmICh0eCAmJiAhdHhfc3RhcnRlZCkgewotCQkJZGV2X2luZm8ocGRldiwgInN0YXJ0aW5nIHR4IHRlc3RcbiIpOwotCQkJdHhfc3RhcnRlZCA9IDE7Ci0JCX0gZWxzZSBpZiAoIXR4ICYmIHR4X3N0YXJ0ZWQpIHsKLQkJCWRldl9pbmZvKHBkZXYsICJzdG9wcGluZyB0eCB0ZXN0XG4iKTsKLQkJCXR4X3N0YXJ0ZWQgPSAwOwotCQl9Ci0KLQkJaWYgKHJ4X3N0YXJ0ZWQpCi0JCQl3bDEyNzFfcmVhZCh3bCwgYWRkciwgcnhfYnVmLCB0ZXN0X3NpemUsIGZhbHNlKTsKLQotCQlpZiAodHhfc3RhcnRlZCkKLQkJCXdsMTI3MV93cml0ZSh3bCwgYWRkciwgdHhfYnVmLCB0ZXN0X3NpemUsIGZhbHNlKTsKLQotCQlpZiAoIXJ4X3N0YXJ0ZWQgJiYgIXR4X3N0YXJ0ZWQpCi0JCQltc2xlZXAoMTAwKTsKLQl9Ci0KLWZyZWU6Ci0Ja2ZyZWUodHhfYnVmKTsKLQlrZnJlZShyeF9idWYpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgX19kZXZpbml0IHdsMTI3MV9wcm9iZShzdHJ1Y3Qgc2Rpb19mdW5jICpmdW5jLAotCQljb25zdCBzdHJ1Y3Qgc2Rpb19kZXZpY2VfaWQgKmlkKQotewotCWNvbnN0IHN0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSAqd2xhbl9kYXRhOwotCXN0cnVjdCB3bDEyNzEgKndsOwotCXN0cnVjdCB3bDEyNzFfdGVzdCAqd2xfdGVzdDsKLQlpbnQgcmV0ID0gMDsKLQotCS8qIHdsMTI3MSBoYXMgMiBzZGlvIGZ1bmN0aW9ucyB3ZSBoYW5kbGUganVzdCB0aGUgd2xhbiBwYXJ0ICovCi0JaWYgKGZ1bmMtPm51bSAhPSAweDAyKQotCQlyZXR1cm4gLUVOT0RFVjsKLQotCXdsX3Rlc3QgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgd2wxMjcxX3Rlc3QpLCBHRlBfS0VSTkVMKTsKLQlpZiAoIXdsX3Rlc3QpIHsKLQkJZGV2X2VycigmZnVuYy0+ZGV2LCAiQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXdsID0gJndsX3Rlc3QtPndsOwotCi0Jd2wtPmlmX3ByaXYgPSBmdW5jOwotCXdsLT5pZl9vcHMgPSAmc2Rpb19vcHM7Ci0KLQkvKiBHcmFiIGFjY2VzcyB0byBGTjAgZm9yIEVMUCByZWcuICovCi0JZnVuYy0+Y2FyZC0+cXVpcmtzIHw9IE1NQ19RVUlSS19MRU5JRU5UX0ZOMDsKLQotCS8qIFVzZSBibG9jayBtb2RlIGZvciB0cmFuc2ZlcnJpbmcgb3ZlciBvbmUgYmxvY2sgc2l6ZSBvZiBkYXRhICovCi0JZnVuYy0+Y2FyZC0+cXVpcmtzIHw9IE1NQ19RVUlSS19CTEtTWl9GT1JfQllURV9NT0RFOwotCi0Jd2xhbl9kYXRhID0gd2wxMnh4X2dldF9wbGF0Zm9ybV9kYXRhKCk7Ci0JaWYgKElTX0VSUih3bGFuX2RhdGEpKSB7Ci0JCXJldCA9IFBUUl9FUlIod2xhbl9kYXRhKTsKLQkJZGV2X2VycigmZnVuYy0+ZGV2LCAibWlzc2luZyB3bGFuIHBsYXRmb3JtIGRhdGE6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCXdsLT5pcnEgPSB3bGFuX2RhdGEtPmlycTsKLQl3bC0+cmVmX2Nsb2NrID0gd2xhbl9kYXRhLT5ib2FyZF9yZWZfY2xvY2s7Ci0Jd2wtPnRjeG9fY2xvY2sgPSB3bGFuX2RhdGEtPmJvYXJkX3RjeG9fY2xvY2s7Ci0KLQlzZGlvX3NldF9kcnZkYXRhKGZ1bmMsIHdsX3Rlc3QpOwotCi0JLyogcG93ZXIgdXAgdGhlIGRldmljZSAqLwotCXJldCA9IHdsMTI3MV9jaGlwX3dha2V1cCh3bCk7Ci0JaWYgKHJldCkgewotCQlkZXZfZXJyKCZmdW5jLT5kZXYsICJjb3VsZCBub3Qgd2FrZSB1cCBjaGlwXG4iKTsKLQkJZ290byBvdXRfZnJlZTsKLQl9Ci0KLQlpZiAod2wtPmZ3ID09IE5VTEwpIHsKLQkJcmV0ID0gd2wxMjcxX2ZldGNoX2Zpcm13YXJlKHdsKTsKLQkJaWYgKHJldCA8IDApIHsKLQkJCWRldl9lcnIoJmZ1bmMtPmRldiwgImZpcm13YXJlIGZldGNoIGVycm9yXG4iKTsKLQkJCWdvdG8gb3V0X29mZjsKLQkJfQotCX0KLQotCS8qIGZldGNoIE5WUyAqLwotCWlmICh3bC0+bnZzID09IE5VTEwpIHsKLQkJcmV0ID0gd2wxMjcxX2ZldGNoX252cyh3bCk7Ci0JCWlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfZXJyKCZmdW5jLT5kZXYsICJOVlMgZmV0Y2ggZXJyb3JcbiIpOwotCQkJZ290byBvdXRfb2ZmOwotCQl9Ci0JfQotCi0JcmV0ID0gd2wxMjcxX2xvYWRfZmlybXdhcmUod2wpOwotCWlmIChyZXQgPCAwKSB7Ci0JCWRldl9lcnIoJmZ1bmMtPmRldiwgImZpcm13YXJlIGxvYWQgZXJyb3I6ICVkXG4iLCByZXQpOwotCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCWRldl9pbmZvKCZmdW5jLT5kZXYsICJpbml0aWFsaXplZFxuIik7Ci0KLQkvKiBJL08gdGVzdGluZyB3aWxsIGJlIGRvbmUgaW4gdGhlIHRlc3RlciB0aHJlYWQgKi8KLQotCXdsX3Rlc3QtPnRlc3RfdGFzayA9IGt0aHJlYWRfcnVuKHRlc3Rlciwgd2wsICJzZGlvX3Rlc3RlciIpOwotCWlmIChJU19FUlIod2xfdGVzdC0+dGVzdF90YXNrKSkgewotCQlkZXZfZXJyKCZmdW5jLT5kZXYsICJ1bmFibGUgdG8gY3JlYXRlIGtlcm5lbCB0aHJlYWRcbiIpOwotCQlyZXQgPSBQVFJfRVJSKHdsX3Rlc3QtPnRlc3RfdGFzayk7Ci0JCWdvdG8gb3V0X2ZyZWU7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLW91dF9vZmY6Ci0JLyogcG93ZXIgb2ZmIHRoZSBjaGlwICovCi0Jd2wxMjcxX3Bvd2VyX29mZih3bCk7Ci0KLW91dF9mcmVlOgotCWtmcmVlKHdsX3Rlc3QpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZGV2ZXhpdCB3bDEyNzFfcmVtb3ZlKHN0cnVjdCBzZGlvX2Z1bmMgKmZ1bmMpCi17Ci0Jc3RydWN0IHdsMTI3MV90ZXN0ICp3bF90ZXN0ID0gc2Rpb19nZXRfZHJ2ZGF0YShmdW5jKTsKLQotCS8qIHN0b3AgdGhlIEkvTyB0ZXN0IHRocmVhZCAqLwotCWt0aHJlYWRfc3RvcCh3bF90ZXN0LT50ZXN0X3Rhc2spOwotCi0JLyogcG93ZXIgb2ZmIHRoZSBjaGlwICovCi0Jd2wxMjcxX3Bvd2VyX29mZigmd2xfdGVzdC0+d2wpOwotCi0JdmZyZWUod2xfdGVzdC0+d2wuZncpOwotCXdsX3Rlc3QtPndsLmZ3ID0gTlVMTDsKLQlrZnJlZSh3bF90ZXN0LT53bC5udnMpOwotCXdsX3Rlc3QtPndsLm52cyA9IE5VTEw7Ci0KLQlrZnJlZSh3bF90ZXN0KTsKLX0KLQotc3RhdGljIHN0cnVjdCBzZGlvX2RyaXZlciB3bDEyNzFfc2Rpb19kcml2ZXIgPSB7Ci0JLm5hbWUJCT0gIndsMTJ4eF9zZGlvX3Rlc3QiLAotCS5pZF90YWJsZQk9IHdsMTI3MV9kZXZpY2VzLAotCS5wcm9iZQkJPSB3bDEyNzFfcHJvYmUsCi0JLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh3bDEyNzFfcmVtb3ZlKSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHdsMTI3MV9pbml0KHZvaWQpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IHNkaW9fcmVnaXN0ZXJfZHJpdmVyKCZ3bDEyNzFfc2Rpb19kcml2ZXIpOwotCWlmIChyZXQgPCAwKQotCQlwcl9lcnIoImZhaWxlZCB0byByZWdpc3RlciBzZGlvIGRyaXZlcjogJWRcbiIsIHJldCk7Ci0KLQlyZXR1cm4gcmV0OwotfQotbW9kdWxlX2luaXQod2wxMjcxX2luaXQpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgd2wxMjcxX2V4aXQodm9pZCkKLXsKLQlzZGlvX3VucmVnaXN0ZXJfZHJpdmVyKCZ3bDEyNzFfc2Rpb19kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQod2wxMjcxX2V4aXQpOwotCi1NT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQVVUSE9SKCJSb2dlciBRdWFkcm9zIDxyb2dlci5xdWFkcm9zQG5va2lhLmNvbT4iKTsKLQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NwaS5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3NwaS5jCmluZGV4IDBmOTcxODYuLjkyY2FhN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC9zcGkuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvc3BpLmMKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jcmM3Lmg+CiAjaW5jbHVkZSA8bGludXgvc3BpL3NwaS5oPgogI2luY2x1ZGUgPGxpbnV4L3dsMTJ4eC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAogI2luY2x1ZGUgIndsMTJ4eC5oIgpAQCAtNjksMzUgKzcwLDIyIEBACiAKICNkZWZpbmUgV1NQSV9NQVhfTlVNX09GX0NIVU5LUyAoV0wxMjcxX0FHR1JfQlVGRkVSX1NJWkUgLyBXU1BJX01BWF9DSFVOS19TSVpFKQogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBzcGlfZGV2aWNlICp3bF90b19zcGkoc3RydWN0IHdsMTI3MSAqd2wpCi17Ci0JcmV0dXJuIHdsLT5pZl9wcml2OwotfQorc3RydWN0IHdsMTJ4eF9zcGlfZ2x1ZSB7CisJc3RydWN0IGRldmljZSAqZGV2OworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKmNvcmU7Cit9OwogCi1zdGF0aWMgc3RydWN0IGRldmljZSAqd2wxMjcxX3NwaV93bF90b19kZXYoc3RydWN0IHdsMTI3MSAqd2wpCitzdGF0aWMgdm9pZCB3bDEyeHhfc3BpX3Jlc2V0KHN0cnVjdCBkZXZpY2UgKmNoaWxkKQogewotCXJldHVybiAmKHdsX3RvX3NwaSh3bCktPmRldik7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsMTI3MV9zcGlfZGlzYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCB3bDEyNzEgKndsKQotewotCWRpc2FibGVfaXJxKHdsLT5pcnEpOwotfQotCi1zdGF0aWMgdm9pZCB3bDEyNzFfc3BpX2VuYWJsZV9pbnRlcnJ1cHRzKHN0cnVjdCB3bDEyNzEgKndsKQotewotCWVuYWJsZV9pcnEod2wtPmlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHdsMTI3MV9zcGlfcmVzZXQoc3RydWN0IHdsMTI3MSAqd2wpCi17CisJc3RydWN0IHdsMTJ4eF9zcGlfZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShjaGlsZC0+cGFyZW50KTsKIAl1OCAqY21kOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgdDsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAogCWNtZCA9IGt6YWxsb2MoV1NQSV9JTklUX0NNRF9MRU4sIEdGUF9LRVJORUwpOwogCWlmICghY21kKSB7Ci0JCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGFsbG9jYXRlIGNtZCBmb3Igc3BpIHJlc2V0Iik7CisJCWRldl9lcnIoY2hpbGQtPnBhcmVudCwKKwkJCSJjb3VsZCBub3QgYWxsb2NhdGUgY21kIGZvciBzcGkgcmVzZXRcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xMTAsMjEgKzk4LDIyIEBACiAJdC5sZW4gPSBXU1BJX0lOSVRfQ01EX0xFTjsKIAlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdCwgJm0pOwogCi0Jc3BpX3N5bmMod2xfdG9fc3BpKHdsKSwgJm0pOworCXNwaV9zeW5jKHRvX3NwaV9kZXZpY2UoZ2x1ZS0+ZGV2KSwgJm0pOwogCi0Jd2wxMjcxX2R1bXAoREVCVUdfU1BJLCAic3BpIHJlc2V0IC0+ICIsIGNtZCwgV1NQSV9JTklUX0NNRF9MRU4pOwogCWtmcmVlKGNtZCk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsMTI3MV9zcGlfaW5pdChzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyB2b2lkIHdsMTJ4eF9zcGlfaW5pdChzdHJ1Y3QgZGV2aWNlICpjaGlsZCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3NwaV9nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkLT5wYXJlbnQpOwogCXU4IGNyY1tXU1BJX0lOSVRfQ01EX0NSQ19MRU5dLCAqY21kOwogCXN0cnVjdCBzcGlfdHJhbnNmZXIgdDsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAogCWNtZCA9IGt6YWxsb2MoV1NQSV9JTklUX0NNRF9MRU4sIEdGUF9LRVJORUwpOwogCWlmICghY21kKSB7Ci0JCXdsMTI3MV9lcnJvcigiY291bGQgbm90IGFsbG9jYXRlIGNtZCBmb3Igc3BpIGluaXQiKTsKKwkJZGV2X2VycihjaGlsZC0+cGFyZW50LAorCQkJImNvdWxkIG5vdCBhbGxvY2F0ZSBjbWQgZm9yIHNwaSBpbml0XG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTY1LDE1ICsxNTQsMTYgQEAKIAl0LmxlbiA9IFdTUElfSU5JVF9DTURfTEVOOwogCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0LCAmbSk7CiAKLQlzcGlfc3luYyh3bF90b19zcGkod2wpLCAmbSk7Ci0Jd2wxMjcxX2R1bXAoREVCVUdfU1BJLCAic3BpIGluaXQgLT4gIiwgY21kLCBXU1BJX0lOSVRfQ01EX0xFTik7CisJc3BpX3N5bmModG9fc3BpX2RldmljZShnbHVlLT5kZXYpLCAmbSk7CiAJa2ZyZWUoY21kKTsKIH0KIAogI2RlZmluZSBXTDEyNzFfQlVTWV9XT1JEX1RJTUVPVVQgMTAwMAogCi1zdGF0aWMgaW50IHdsMTI3MV9zcGlfcmVhZF9idXN5KHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIGludCB3bDEyeHhfc3BpX3JlYWRfYnVzeShzdHJ1Y3QgZGV2aWNlICpjaGlsZCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3NwaV9nbHVlICpnbHVlID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkLT5wYXJlbnQpOworCXN0cnVjdCB3bDEyNzEgKndsID0gZGV2X2dldF9kcnZkYXRhKGNoaWxkKTsKIAlzdHJ1Y3Qgc3BpX3RyYW5zZmVyIHRbMV07CiAJc3RydWN0IHNwaV9tZXNzYWdlIG07CiAJdTMyICpidXN5X2J1ZjsKQEAgLTE5NCwyMCArMTg0LDIyIEBACiAJCXRbMF0ubGVuID0gc2l6ZW9mKHUzMik7CiAJCXRbMF0uY3NfY2hhbmdlID0gdHJ1ZTsKIAkJc3BpX21lc3NhZ2VfYWRkX3RhaWwoJnRbMF0sICZtKTsKLQkJc3BpX3N5bmMod2xfdG9fc3BpKHdsKSwgJm0pOworCQlzcGlfc3luYyh0b19zcGlfZGV2aWNlKGdsdWUtPmRldiksICZtKTsKIAogCQlpZiAoKmJ1c3lfYnVmICYgMHgxKQogCQkJcmV0dXJuIDA7CiAJfQogCiAJLyogVGhlIFNQSSBidXMgaXMgdW5yZXNwb25zaXZlLCB0aGUgcmVhZCBmYWlsZWQuICovCi0Jd2wxMjcxX2Vycm9yKCJTUEkgcmVhZCBidXN5LXdvcmQgdGltZW91dCFcbiIpOworCWRldl9lcnIoY2hpbGQtPnBhcmVudCwgIlNQSSByZWFkIGJ1c3ktd29yZCB0aW1lb3V0IVxuIik7CiAJcmV0dXJuIC1FVElNRURPVVQ7CiB9CiAKLXN0YXRpYyB2b2lkIHdsMTI3MV9zcGlfcmF3X3JlYWQoc3RydWN0IHdsMTI3MSAqd2wsIGludCBhZGRyLCB2b2lkICpidWYsCitzdGF0aWMgdm9pZCB3bDEyeHhfc3BpX3Jhd19yZWFkKHN0cnVjdCBkZXZpY2UgKmNoaWxkLCBpbnQgYWRkciwgdm9pZCAqYnVmLAogCQkJCXNpemVfdCBsZW4sIGJvb2wgZml4ZWQpCiB7CisJc3RydWN0IHdsMTJ4eF9zcGlfZ2x1ZSAqZ2x1ZSA9IGRldl9nZXRfZHJ2ZGF0YShjaGlsZC0+cGFyZW50KTsKKwlzdHJ1Y3Qgd2wxMjcxICp3bCA9IGRldl9nZXRfZHJ2ZGF0YShjaGlsZCk7CiAJc3RydWN0IHNwaV90cmFuc2ZlciB0WzJdOwogCXN0cnVjdCBzcGlfbWVzc2FnZSBtOwogCXUzMiAqYnVzeV9idWY7CkBAIC0yNDMsMTAgKzIzNSwxMCBAQAogCQl0WzFdLmNzX2NoYW5nZSA9IHRydWU7CiAJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0WzFdLCAmbSk7CiAKLQkJc3BpX3N5bmMod2xfdG9fc3BpKHdsKSwgJm0pOworCQlzcGlfc3luYyh0b19zcGlfZGV2aWNlKGdsdWUtPmRldiksICZtKTsKIAogCQlpZiAoIShidXN5X2J1ZltXTDEyNzFfQlVTWV9XT1JEX0NOVCAtIDFdICYgMHgxKSAmJgotCQkgICAgd2wxMjcxX3NwaV9yZWFkX2J1c3kod2wpKSB7CisJCSAgICB3bDEyeHhfc3BpX3JlYWRfYnVzeShjaGlsZCkpIHsKIAkJCW1lbXNldChidWYsIDAsIGNodW5rX2xlbik7CiAJCQlyZXR1cm47CiAJCX0KQEAgLTI1OSwxMCArMjUxLDcgQEAKIAkJdFswXS5jc19jaGFuZ2UgPSB0cnVlOwogCQlzcGlfbWVzc2FnZV9hZGRfdGFpbCgmdFswXSwgJm0pOwogCi0JCXNwaV9zeW5jKHdsX3RvX3NwaSh3bCksICZtKTsKLQotCQl3bDEyNzFfZHVtcChERUJVR19TUEksICJzcGlfcmVhZCBjbWQgLT4gIiwgY21kLCBzaXplb2YoKmNtZCkpOwotCQl3bDEyNzFfZHVtcChERUJVR19TUEksICJzcGlfcmVhZCBidWYgPC0gIiwgYnVmLCBjaHVua19sZW4pOworCQlzcGlfc3luYyh0b19zcGlfZGV2aWNlKGdsdWUtPmRldiksICZtKTsKIAogCQlpZiAoIWZpeGVkKQogCQkJYWRkciArPSBjaHVua19sZW47CkBAIC0yNzEsOSArMjYwLDEwIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCB3bDEyNzFfc3BpX3Jhd193cml0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1ZiwKLQkJCSAgc2l6ZV90IGxlbiwgYm9vbCBmaXhlZCkKK3N0YXRpYyB2b2lkIHdsMTJ4eF9zcGlfcmF3X3dyaXRlKHN0cnVjdCBkZXZpY2UgKmNoaWxkLCBpbnQgYWRkciwgdm9pZCAqYnVmLAorCQkJCSBzaXplX3QgbGVuLCBib29sIGZpeGVkKQogeworCXN0cnVjdCB3bDEyeHhfc3BpX2dsdWUgKmdsdWUgPSBkZXZfZ2V0X2RydmRhdGEoY2hpbGQtPnBhcmVudCk7CiAJc3RydWN0IHNwaV90cmFuc2ZlciB0WzIgKiBXU1BJX01BWF9OVU1fT0ZfQ0hVTktTXTsKIAlzdHJ1Y3Qgc3BpX21lc3NhZ2UgbTsKIAl1MzIgY29tbWFuZHNbV1NQSV9NQVhfTlVNX09GX0NIVU5LU107CkBAIC0zMDgsOSArMjk4LDYgQEAKIAkJdFtpXS5sZW4gPSBjaHVua19sZW47CiAJCXNwaV9tZXNzYWdlX2FkZF90YWlsKCZ0W2krK10sICZtKTsKIAotCQl3bDEyNzFfZHVtcChERUJVR19TUEksICJzcGlfd3JpdGUgY21kIC0+ICIsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKLQkJd2wxMjcxX2R1bXAoREVCVUdfU1BJLCAic3BpX3dyaXRlIGJ1ZiAtPiAiLCBidWYsIGNodW5rX2xlbik7Ci0KIAkJaWYgKCFmaXhlZCkKIAkJCWFkZHIgKz0gY2h1bmtfbGVuOwogCQlidWYgKz0gY2h1bmtfbGVuOwpAQCAtMzE4LDcyICszMDUsNDEgQEAKIAkJY21kKys7CiAJfQogCi0Jc3BpX3N5bmMod2xfdG9fc3BpKHdsKSwgJm0pOwotfQotCi1zdGF0aWMgaXJxcmV0dXJuX3Qgd2wxMjcxX2hhcmRpcnEoaW50IGlycSwgdm9pZCAqY29va2llKQotewotCXN0cnVjdCB3bDEyNzEgKndsID0gY29va2llOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQl3bDEyNzFfZGVidWcoREVCVUdfSVJRLCAiSVJRIik7Ci0KLQkvKiBjb21wbGV0ZSB0aGUgRUxQIGNvbXBsZXRpb24gKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQlzZXRfYml0KFdMMTI3MV9GTEFHX0lSUV9SVU5OSU5HLCAmd2wtPmZsYWdzKTsKLQlpZiAod2wtPmVscF9jb21wbCkgewotCQljb21wbGV0ZSh3bC0+ZWxwX2NvbXBsKTsKLQkJd2wtPmVscF9jb21wbCA9IE5VTEw7Ci0JfQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT53bF9sb2NrLCBmbGFncyk7Ci0KLQlyZXR1cm4gSVJRX1dBS0VfVEhSRUFEOwotfQotCi1zdGF0aWMgaW50IHdsMTI3MV9zcGlfc2V0X3Bvd2VyKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSkKLXsKLQlpZiAod2wtPnNldF9wb3dlcikKLQkJd2wtPnNldF9wb3dlcihlbmFibGUpOwotCi0JcmV0dXJuIDA7CisJc3BpX3N5bmModG9fc3BpX2RldmljZShnbHVlLT5kZXYpLCAmbSk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgd2wxMjcxX2lmX29wZXJhdGlvbnMgc3BpX29wcyA9IHsKLQkucmVhZAkJPSB3bDEyNzFfc3BpX3Jhd19yZWFkLAotCS53cml0ZQkJPSB3bDEyNzFfc3BpX3Jhd193cml0ZSwKLQkucmVzZXQJCT0gd2wxMjcxX3NwaV9yZXNldCwKLQkuaW5pdAkJPSB3bDEyNzFfc3BpX2luaXQsCi0JLnBvd2VyCQk9IHdsMTI3MV9zcGlfc2V0X3Bvd2VyLAotCS5kZXYJCT0gd2wxMjcxX3NwaV93bF90b19kZXYsCi0JLmVuYWJsZV9pcnEJPSB3bDEyNzFfc3BpX2VuYWJsZV9pbnRlcnJ1cHRzLAotCS5kaXNhYmxlX2lycQk9IHdsMTI3MV9zcGlfZGlzYWJsZV9pbnRlcnJ1cHRzLAorCS5yZWFkCQk9IHdsMTJ4eF9zcGlfcmF3X3JlYWQsCisJLndyaXRlCQk9IHdsMTJ4eF9zcGlfcmF3X3dyaXRlLAorCS5yZXNldAkJPSB3bDEyeHhfc3BpX3Jlc2V0LAorCS5pbml0CQk9IHdsMTJ4eF9zcGlfaW5pdCwKIAkuc2V0X2Jsb2NrX3NpemUgPSBOVUxMLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgd2wxMjcxX3Byb2JlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7CisJc3RydWN0IHdsMTJ4eF9zcGlfZ2x1ZSAqZ2x1ZTsKIAlzdHJ1Y3Qgd2wxMnh4X3BsYXRmb3JtX2RhdGEgKnBkYXRhOwotCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3OwotCXN0cnVjdCB3bDEyNzEgKndsOwotCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7Ci0JaW50IHJldDsKKwlzdHJ1Y3QgcmVzb3VyY2UgcmVzWzFdOworCWludCByZXQgPSAtRU5PTUVNOwogCiAJcGRhdGEgPSBzcGktPmRldi5wbGF0Zm9ybV9kYXRhOwogCWlmICghcGRhdGEpIHsKLQkJd2wxMjcxX2Vycm9yKCJubyBwbGF0Zm9ybSBkYXRhIik7CisJCWRldl9lcnIoJnNwaS0+ZGV2LCAibm8gcGxhdGZvcm0gZGF0YVxuIik7CiAJCXJldHVybiAtRU5PREVWOwogCX0KIAotCWh3ID0gd2wxMjcxX2FsbG9jX2h3KCk7Ci0JaWYgKElTX0VSUihodykpCi0JCXJldHVybiBQVFJfRVJSKGh3KTsKKwlwZGF0YS0+b3BzID0gJnNwaV9vcHM7CiAKLQl3bCA9IGh3LT5wcml2OworCWdsdWUgPSBremFsbG9jKHNpemVvZigqZ2x1ZSksIEdGUF9LRVJORUwpOworCWlmICghZ2x1ZSkgeworCQlkZXZfZXJyKCZzcGktPmRldiwgImNhbid0IGFsbG9jYXRlIGdsdWVcbiIpOworCQlnb3RvIG91dDsKKwl9CiAKLQlkZXZfc2V0X2RydmRhdGEoJnNwaS0+ZGV2LCB3bCk7Ci0Jd2wtPmlmX3ByaXYgPSBzcGk7CisJZ2x1ZS0+ZGV2ID0gJnNwaS0+ZGV2OwogCi0Jd2wtPmlmX29wcyA9ICZzcGlfb3BzOworCXNwaV9zZXRfZHJ2ZGF0YShzcGksIGdsdWUpOwogCiAJLyogVGhpcyBpcyB0aGUgb25seSBTUEkgdmFsdWUgdGhhdCB3ZSBuZWVkIHRvIHNldCBoZXJlLCB0aGUgcmVzdAogCSAqIGNvbWVzIGZyb20gdGhlIGJvYXJkLXBlcmlwaGVyYWxzIGZpbGUgKi8KQEAgLTM5MSw2OSArMzQ3LDYxIEBACiAKIAlyZXQgPSBzcGlfc2V0dXAoc3BpKTsKIAlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfZXJyb3IoInNwaV9zZXR1cCBmYWlsZWQiKTsKLQkJZ290byBvdXRfZnJlZTsKKwkJZGV2X2VycihnbHVlLT5kZXYsICJzcGlfc2V0dXAgZmFpbGVkXG4iKTsKKwkJZ290byBvdXRfZnJlZV9nbHVlOwogCX0KIAotCXdsLT5zZXRfcG93ZXIgPSBwZGF0YS0+c2V0X3Bvd2VyOwotCWlmICghd2wtPnNldF9wb3dlcikgewotCQl3bDEyNzFfZXJyb3IoInNldCBwb3dlciBmdW5jdGlvbiBtaXNzaW5nIGluIHBsYXRmb3JtIGRhdGEiKTsKLQkJcmV0ID0gLUVOT0RFVjsKLQkJZ290byBvdXRfZnJlZTsKKwlnbHVlLT5jb3JlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJ3bDEyeHgiLCAtMSk7CisJaWYgKCFnbHVlLT5jb3JlKSB7CisJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWxsb2NhdGUgcGxhdGZvcm1fZGV2aWNlXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZnJlZV9nbHVlOwogCX0KIAotCXdsLT5yZWZfY2xvY2sgPSBwZGF0YS0+Ym9hcmRfcmVmX2Nsb2NrOwotCXdsLT50Y3hvX2Nsb2NrID0gcGRhdGEtPmJvYXJkX3RjeG9fY2xvY2s7Ci0Jd2wtPnBsYXRmb3JtX3F1aXJrcyA9IHBkYXRhLT5wbGF0Zm9ybV9xdWlya3M7CisJZ2x1ZS0+Y29yZS0+ZGV2LnBhcmVudCA9ICZzcGktPmRldjsKIAotCWlmICh3bC0+cGxhdGZvcm1fcXVpcmtzICYgV0wxMlhYX1BMQVRGT1JNX1FVSVJLX0VER0VfSVJRKQotCQlpcnFmbGFncyA9IElSUUZfVFJJR0dFUl9SSVNJTkc7Ci0JZWxzZQotCQlpcnFmbGFncyA9IElSUUZfVFJJR0dFUl9ISUdIIHwgSVJRRl9PTkVTSE9UOworCW1lbXNldChyZXMsIDB4MDAsIHNpemVvZihyZXMpKTsKIAotCXdsLT5pcnEgPSBzcGktPmlycTsKLQlpZiAod2wtPmlycSA8IDApIHsKLQkJd2wxMjcxX2Vycm9yKCJpcnEgbWlzc2luZyBpbiBwbGF0Zm9ybSBkYXRhIik7Ci0JCXJldCA9IC1FTk9ERVY7Ci0JCWdvdG8gb3V0X2ZyZWU7CisJcmVzWzBdLnN0YXJ0ID0gc3BpLT5pcnE7CisJcmVzWzBdLmZsYWdzID0gSU9SRVNPVVJDRV9JUlE7CisJcmVzWzBdLm5hbWUgPSAiaXJxIjsKKworCXJldCA9IHBsYXRmb3JtX2RldmljZV9hZGRfcmVzb3VyY2VzKGdsdWUtPmNvcmUsIHJlcywgQVJSQVlfU0laRShyZXMpKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgYWRkIHJlc291cmNlc1xuIik7CisJCWdvdG8gb3V0X2Rldl9wdXQ7CiAJfQogCi0JcmV0ID0gcmVxdWVzdF90aHJlYWRlZF9pcnEod2wtPmlycSwgd2wxMjcxX2hhcmRpcnEsIHdsMTI3MV9pcnEsCi0JCQkJICAgaXJxZmxhZ3MsCi0JCQkJICAgRFJJVkVSX05BTUUsIHdsKTsKLQlpZiAocmV0IDwgMCkgewotCQl3bDEyNzFfZXJyb3IoInJlcXVlc3RfaXJxKCkgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCWdvdG8gb3V0X2ZyZWU7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZF9kYXRhKGdsdWUtPmNvcmUsIHBkYXRhLCBzaXplb2YoKnBkYXRhKSk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGdsdWUtPmRldiwgImNhbid0IGFkZCBwbGF0Zm9ybSBkYXRhXG4iKTsKKwkJZ290byBvdXRfZGV2X3B1dDsKIAl9CiAKLQlkaXNhYmxlX2lycSh3bC0+aXJxKTsKLQotCXJldCA9IHdsMTI3MV9pbml0X2llZWU4MDIxMSh3bCk7Ci0JaWYgKHJldCkKLQkJZ290byBvdXRfaXJxOwotCi0JcmV0ID0gd2wxMjcxX3JlZ2lzdGVyX2h3KHdsKTsKLQlpZiAocmV0KQotCQlnb3RvIG91dF9pcnE7CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChnbHVlLT5jb3JlKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZ2x1ZS0+ZGV2LCAiY2FuJ3QgcmVnaXN0ZXIgcGxhdGZvcm0gZGV2aWNlXG4iKTsKKwkJZ290byBvdXRfZGV2X3B1dDsKKwl9CiAKIAlyZXR1cm4gMDsKIAotIG91dF9pcnE6Ci0JZnJlZV9pcnEod2wtPmlycSwgd2wpOworb3V0X2Rldl9wdXQ6CisJcGxhdGZvcm1fZGV2aWNlX3B1dChnbHVlLT5jb3JlKTsKIAotIG91dF9mcmVlOgotCXdsMTI3MV9mcmVlX2h3KHdsKTsKLQorb3V0X2ZyZWVfZ2x1ZToKKwlrZnJlZShnbHVlKTsKK291dDoKIAlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IF9fZGV2ZXhpdCB3bDEyNzFfcmVtb3ZlKHN0cnVjdCBzcGlfZGV2aWNlICpzcGkpCiB7Ci0Jc3RydWN0IHdsMTI3MSAqd2wgPSBkZXZfZ2V0X2RydmRhdGEoJnNwaS0+ZGV2KTsKKwlzdHJ1Y3Qgd2wxMnh4X3NwaV9nbHVlICpnbHVlID0gc3BpX2dldF9kcnZkYXRhKHNwaSk7CiAKLQl3bDEyNzFfdW5yZWdpc3Rlcl9odyh3bCk7Ci0JZnJlZV9pcnEod2wtPmlycSwgd2wpOwotCXdsMTI3MV9mcmVlX2h3KHdsKTsKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKGdsdWUtPmNvcmUpOworCXBsYXRmb3JtX2RldmljZV9wdXQoZ2x1ZS0+Y29yZSk7CisJa2ZyZWUoZ2x1ZSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ2Miw3ICs0MTAsNiBAQAogc3RhdGljIHN0cnVjdCBzcGlfZHJpdmVyIHdsMTI3MV9zcGlfZHJpdmVyID0gewogCS5kcml2ZXIgPSB7CiAJCS5uYW1lCQk9ICJ3bDEyNzFfc3BpIiwKLQkJLmJ1cwkJPSAmc3BpX2J1c190eXBlLAogCQkub3duZXIJCT0gVEhJU19NT0RVTEUsCiAJfSwKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3Rlc3Rtb2RlLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdGVzdG1vZGUuYwppbmRleCA0YWU4ZWZmLi4yNTA5M2MwIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdGVzdG1vZGUuYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdGVzdG1vZGUuYwpAQCAtMjYsOCArMjYsMTAgQEAKICNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CiAKICNpbmNsdWRlICJ3bDEyeHguaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgImFjeC5oIgogI2luY2x1ZGUgInJlZy5oIgorI2luY2x1ZGUgInBzLmgiCiAKICNkZWZpbmUgV0wxMjcxX1RNX01BWF9EQVRBX0xFTkdUSCAxMDI0CiAKQEAgLTM2LDYgKzM4LDcgQEAKIAlXTDEyNzFfVE1fQ01EX1RFU1QsCiAJV0wxMjcxX1RNX0NNRF9JTlRFUlJPR0FURSwKIAlXTDEyNzFfVE1fQ01EX0NPTkZJR1VSRSwKKwlXTDEyNzFfVE1fQ01EX05WU19QVVNILAkJLyogTm90IGluIHVzZS4gS2VlcCB0byBub3QgYnJlYWsgQUJJICovCiAJV0wxMjcxX1RNX0NNRF9TRVRfUExUX01PREUsCiAJV0wxMjcxX1RNX0NNRF9SRUNPVkVSLAogCkBAIC04NywzMSArOTAsNDcgQEAKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAogCW11dGV4X2xvY2soJndsLT5tdXRleCk7Ci0JcmV0ID0gd2wxMjcxX2NtZF90ZXN0KHdsLCBidWYsIGJ1Zl9sZW4sIGFuc3dlcik7Ci0JbXV0ZXhfdW5sb2NrKCZ3bC0+bXV0ZXgpOwogCisJaWYgKHdsLT5zdGF0ZSA9PSBXTDEyNzFfU1RBVEVfT0ZGKSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXJldCA9IHdsMTI3MV9wc19lbHBfd2FrZXVwKHdsKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXQ7CisKKwlyZXQgPSB3bDEyNzFfY21kX3Rlc3Qod2wsIGJ1ZiwgYnVmX2xlbiwgYW5zd2VyKTsKIAlpZiAocmV0IDwgMCkgewogCQl3bDEyNzFfd2FybmluZygidGVzdG1vZGUgY21kIHRlc3QgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X3NsZWVwOwogCX0KIAogCWlmIChhbnN3ZXIpIHsKIAkJbGVuID0gbmxhX3RvdGFsX3NpemUoYnVmX2xlbik7CiAJCXNrYiA9IGNmZzgwMjExX3Rlc3Rtb2RlX2FsbG9jX3JlcGx5X3NrYih3bC0+aHctPndpcGh5LCBsZW4pOwotCQlpZiAoIXNrYikKLQkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoIXNrYikgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X3NsZWVwOworCQl9CiAKIAkJTkxBX1BVVChza2IsIFdMMTI3MV9UTV9BVFRSX0RBVEEsIGJ1Zl9sZW4sIGJ1Zik7CiAJCXJldCA9IGNmZzgwMjExX3Rlc3Rtb2RlX3JlcGx5KHNrYik7CiAJCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIHJldDsKKwkJCWdvdG8gb3V0X3NsZWVwOwogCX0KIAotCXJldHVybiAwOworb3V0X3NsZWVwOgorCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOworb3V0OgorCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKworCXJldHVybiByZXQ7CiAKIG5sYV9wdXRfZmFpbHVyZToKIAlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gLUVNU0dTSVpFOworCXJldCA9IC1FTVNHU0laRTsKKwlnb3RvIG91dF9zbGVlcDsKIH0KIAogc3RhdGljIGludCB3bDEyNzFfdG1fY21kX2ludGVycm9nYXRlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgbmxhdHRyICp0YltdKQpAQCAtMTI4LDMzICsxNDcsNTMgQEAKIAogCWllX2lkID0gbmxhX2dldF91OCh0YltXTDEyNzFfVE1fQVRUUl9JRV9JRF0pOwogCi0JY21kID0ga3phbGxvYyhzaXplb2YoKmNtZCksIEdGUF9LRVJORUwpOwotCWlmICghY21kKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCW11dGV4X2xvY2soJndsLT5tdXRleCk7Ci0JcmV0ID0gd2wxMjcxX2NtZF9pbnRlcnJvZ2F0ZSh3bCwgaWVfaWQsIGNtZCwgc2l6ZW9mKCpjbWQpKTsKLQltdXRleF91bmxvY2soJndsLT5tdXRleCk7CiAKKwlpZiAod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJcmV0ID0gd2wxMjcxX3BzX2VscF93YWtldXAod2wpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKKworCWNtZCA9IGt6YWxsb2Moc2l6ZW9mKCpjbWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNtZCkgeworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9zbGVlcDsKKwl9CisKKwlyZXQgPSB3bDEyNzFfY21kX2ludGVycm9nYXRlKHdsLCBpZV9pZCwgY21kLCBzaXplb2YoKmNtZCkpOwogCWlmIChyZXQgPCAwKSB7CiAJCXdsMTI3MV93YXJuaW5nKCJ0ZXN0bW9kZSBjbWQgaW50ZXJyb2dhdGUgZmFpbGVkOiAlZCIsIHJldCk7Ci0JCWtmcmVlKGNtZCk7Ci0JCXJldHVybiByZXQ7CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJc2tiID0gY2ZnODAyMTFfdGVzdG1vZGVfYWxsb2NfcmVwbHlfc2tiKHdsLT5ody0+d2lwaHksIHNpemVvZigqY21kKSk7CiAJaWYgKCFza2IpIHsKLQkJa2ZyZWUoY21kKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWU7CiAJfQogCiAJTkxBX1BVVChza2IsIFdMMTI3MV9UTV9BVFRSX0RBVEEsIHNpemVvZigqY21kKSwgY21kKTsKKwlyZXQgPSBjZmc4MDIxMV90ZXN0bW9kZV9yZXBseShza2IpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dF9mcmVlOwogCi0JcmV0dXJuIDA7CitvdXRfZnJlZToKKwlrZnJlZShjbWQpOworb3V0X3NsZWVwOgorCXdsMTI3MV9wc19lbHBfc2xlZXAod2wpOworb3V0OgorCW11dGV4X3VubG9jaygmd2wtPm11dGV4KTsKKworCXJldHVybiByZXQ7CiAKIG5sYV9wdXRfZmFpbHVyZToKIAlrZnJlZV9za2Ioc2tiKTsKLQlyZXR1cm4gLUVNU0dTSVpFOworCXJldCA9IC1FTVNHU0laRTsKKwlnb3RvIG91dF9mcmVlOwogfQogCiBzdGF0aWMgaW50IHdsMTI3MV90bV9jbWRfY29uZmlndXJlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3QgbmxhdHRyICp0YltdKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3R4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdHguYwppbmRleCBiYWQ5ZTI5Li40NTA4Y2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdHguYworKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdHguYwpAQCAtMjYsMjIgKzI2LDI0IEBACiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KIAogI2luY2x1ZGUgIndsMTJ4eC5oIgorI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAiaW8uaCIKICNpbmNsdWRlICJyZWcuaCIKICNpbmNsdWRlICJwcy5oIgogI2luY2x1ZGUgInR4LmgiCiAjaW5jbHVkZSAiZXZlbnQuaCIKIAotc3RhdGljIGludCB3bDEyNzFfc2V0X2RlZmF1bHRfd2VwX2tleShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaWQpCitzdGF0aWMgaW50IHdsMTI3MV9zZXRfZGVmYXVsdF93ZXBfa2V5KHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCSAgICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwgdTggaWQpCiB7CiAJaW50IHJldDsKLQlib29sIGlzX2FwID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpOworCWJvb2wgaXNfYXAgPSAod2x2aWYtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyk7CiAKIAlpZiAoaXNfYXApCiAJCXJldCA9IHdsMTJ4eF9jbWRfc2V0X2RlZmF1bHRfd2VwX2tleSh3bCwgaWQsCi0JCQkJCQkgICAgIHdsLT5hcF9iY2FzdF9obGlkKTsKKwkJCQkJCSAgICAgd2x2aWYtPmFwLmJjYXN0X2hsaWQpOwogCWVsc2UKLQkJcmV0ID0gd2wxMnh4X2NtZF9zZXRfZGVmYXVsdF93ZXBfa2V5KHdsLCBpZCwgd2wtPnN0YV9obGlkKTsKKwkJcmV0ID0gd2wxMnh4X2NtZF9zZXRfZGVmYXVsdF93ZXBfa2V5KHdsLCBpZCwgd2x2aWYtPnN0YS5obGlkKTsKIAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpAQCAtNzYsNyArNzgsOCBAQAogfQogCiBzdGF0aWMgaW50IHdsMTI3MV90eF91cGRhdGVfZmlsdGVycyhzdHJ1Y3Qgd2wxMjcxICp3bCwKLQkJCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorCQkJCSAgICBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAlpbnQgcmV0OwpAQCAtOTIsMTUgKzk1LDExIEBACiAJaWYgKCFpZWVlODAyMTFfaXNfYXV0aChoZHItPmZyYW1lX2NvbnRyb2wpKQogCQlyZXR1cm4gMDsKIAotCWlmICh3bC0+ZGV2X2hsaWQgIT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkKKwlpZiAod2x2aWYtPmRldl9obGlkICE9IFdMMTJYWF9JTlZBTElEX0xJTktfSUQpCiAJCWdvdG8gb3V0OwogCiAJd2wxMjcxX2RlYnVnKERFQlVHX0NNRCwgInN0YXJ0aW5nIGRldmljZSByb2xlIGZvciByb2FtaW5nIik7Ci0JcmV0ID0gd2wxMnh4X2NtZF9yb2xlX3N0YXJ0X2Rldih3bCk7Ci0JaWYgKHJldCA8IDApCi0JCWdvdG8gb3V0OwotCi0JcmV0ID0gd2wxMnh4X3JvYyh3bCwgd2wtPmRldl9yb2xlX2lkKTsKKwlyZXQgPSB3bDEyeHhfc3RhcnRfZGV2KHdsLCB3bHZpZik7CiAJaWYgKHJldCA8IDApCiAJCWdvdG8gb3V0Owogb3V0OgpAQCAtMTIzLDE4ICsxMjIsMTYgQEAKIAkJd2wxMjcxX2FjeF9zZXRfaW5jb25uZWN0aW9uX3N0YSh3bCwgaGRyLT5hZGRyMSk7CiB9CiAKLXN0YXRpYyB2b2lkIHdsMTI3MV90eF9yZWd1bGF0ZV9saW5rKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkKQorc3RhdGljIHZvaWQgd2wxMjcxX3R4X3JlZ3VsYXRlX2xpbmsoc3RydWN0IHdsMTI3MSAqd2wsCisJCQkJICAgIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCQkgICAgdTggaGxpZCkKIHsKIAlib29sIGZ3X3BzLCBzaW5nbGVfc3RhOwogCXU4IHR4X3BrdHM7CiAKLQkvKiBvbmx5IHJlZ3VsYXRlIHN0YXRpb24gbGlua3MgKi8KLQlpZiAoaGxpZCA8IFdMMTI3MV9BUF9TVEFfSExJRF9TVEFSVCkKKwlpZiAoV0FSTl9PTighdGVzdF9iaXQoaGxpZCwgd2x2aWYtPmxpbmtzX21hcCkpKQogCQlyZXR1cm47CiAKLQlpZiAoV0FSTl9PTighd2wxMjcxX2lzX2FjdGl2ZV9zdGEod2wsIGhsaWQpKSkKLQkgICAgcmV0dXJuOwotCiAJZndfcHMgPSB0ZXN0X2JpdChobGlkLCAodW5zaWduZWQgbG9uZyAqKSZ3bC0+YXBfZndfcHNfbWFwKTsKIAl0eF9wa3RzID0gd2wtPmxpbmtzW2hsaWRdLmFsbG9jYXRlZF9wa3RzOwogCXNpbmdsZV9zdGEgPSAod2wtPmFjdGl2ZV9zdGFfY291bnQgPT0gMSk7CkBAIC0xNDYsNyArMTQzLDcgQEAKIAkgKiBjYXNlIEZXLW1lbW9yeSBjb25nZXN0aW9uIGlzIG5vdCBhIHByb2JsZW0uCiAJICovCiAJaWYgKCFzaW5nbGVfc3RhICYmIGZ3X3BzICYmIHR4X3BrdHMgPj0gV0wxMjcxX1BTX1NUQV9NQVhfUEFDS0VUUykKLQkJd2wxMjcxX3BzX2xpbmtfc3RhcnQod2wsIGhsaWQsIHRydWUpOworCQl3bDEyeHhfcHNfbGlua19zdGFydCh3bCwgd2x2aWYsIGhsaWQsIHRydWUpOwogfQogCiBib29sIHdsMTJ4eF9pc19kdW1teV9wYWNrZXQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xNTQsNyArMTUxLDggQEAKIAlyZXR1cm4gd2wtPmR1bW15X3BhY2tldCA9PSBza2I7CiB9CiAKLXU4IHdsMTJ4eF90eF9nZXRfaGxpZF9hcChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3U4IHdsMTJ4eF90eF9nZXRfaGxpZF9hcChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICpjb250cm9sID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCkBAIC0xNjcsNDkgKzE2NSw1MSBAQAogCX0gZWxzZSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CiAKLQkJaWYgKCF0ZXN0X2JpdChXTDEyNzFfRkxBR19BUF9TVEFSVEVELCAmd2wtPmZsYWdzKSkKKwkJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX0FQX1NUQVJURUQsICZ3bHZpZi0+ZmxhZ3MpKQogCQkJcmV0dXJuIHdsLT5zeXN0ZW1faGxpZDsKIAogCQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7CiAJCWlmIChpZWVlODAyMTFfaXNfbWdtdChoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJcmV0dXJuIHdsLT5hcF9nbG9iYWxfaGxpZDsKKwkJCXJldHVybiB3bHZpZi0+YXAuZ2xvYmFsX2hsaWQ7CiAJCWVsc2UKLQkJCXJldHVybiB3bC0+YXBfYmNhc3RfaGxpZDsKKwkJCXJldHVybiB3bHZpZi0+YXAuYmNhc3RfaGxpZDsKIAl9CiB9CiAKLXN0YXRpYyB1OCB3bDEyNzFfdHhfZ2V0X2hsaWQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBza19idWZmICpza2IpCit1OCB3bDEyeHhfdHhfZ2V0X2hsaWQoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOwogCi0JaWYgKHdsMTJ4eF9pc19kdW1teV9wYWNrZXQod2wsIHNrYikpCisJaWYgKCF3bHZpZiB8fCB3bDEyeHhfaXNfZHVtbXlfcGFja2V0KHdsLCBza2IpKQogCQlyZXR1cm4gd2wtPnN5c3RlbV9obGlkOwogCi0JaWYgKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpCi0JCXJldHVybiB3bDEyeHhfdHhfZ2V0X2hsaWRfYXAod2wsIHNrYik7CisJaWYgKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpCisJCXJldHVybiB3bDEyeHhfdHhfZ2V0X2hsaWRfYXAod2wsIHdsdmlmLCBza2IpOwogCi0Jd2wxMjcxX3R4X3VwZGF0ZV9maWx0ZXJzKHdsLCBza2IpOworCXdsMTI3MV90eF91cGRhdGVfZmlsdGVycyh3bCwgd2x2aWYsIHNrYik7CiAKLQlpZiAoKHRlc3RfYml0KFdMMTI3MV9GTEFHX1NUQV9BU1NPQ0lBVEVELCAmd2wtPmZsYWdzKSB8fAotCSAgICAgdGVzdF9iaXQoV0wxMjcxX0ZMQUdfSUJTU19KT0lORUQsICZ3bC0+ZmxhZ3MpKSAmJgorCWlmICgodGVzdF9iaXQoV0xWSUZfRkxBR19TVEFfQVNTT0NJQVRFRCwgJndsdmlmLT5mbGFncykgfHwKKwkgICAgIHRlc3RfYml0KFdMVklGX0ZMQUdfSUJTU19KT0lORUQsICZ3bHZpZi0+ZmxhZ3MpKSAmJgogCSAgICAhaWVlZTgwMjExX2lzX2F1dGgoaGRyLT5mcmFtZV9jb250cm9sKSAmJgogCSAgICAhaWVlZTgwMjExX2lzX2Fzc29jX3JlcShoZHItPmZyYW1lX2NvbnRyb2wpKQotCQlyZXR1cm4gd2wtPnN0YV9obGlkOworCQlyZXR1cm4gd2x2aWYtPnN0YS5obGlkOwogCWVsc2UKLQkJcmV0dXJuIHdsLT5kZXZfaGxpZDsKKwkJcmV0dXJuIHdsdmlmLT5kZXZfaGxpZDsKIH0KIAogc3RhdGljIHVuc2lnbmVkIGludCB3bDEyeHhfY2FsY19wYWNrZXRfYWxpZ25tZW50KHN0cnVjdCB3bDEyNzEgKndsLAogCQkJCQkJdW5zaWduZWQgaW50IHBhY2tldF9sZW5ndGgpCiB7Ci0JaWYgKHdsLT5xdWlya3MgJiBXTDEyWFhfUVVJUktfQkxPQ0tTSVpFX0FMSUdOTUVOVCkKLQkJcmV0dXJuIEFMSUdOKHBhY2tldF9sZW5ndGgsIFdMMTJYWF9CVVNfQkxPQ0tfU0laRSk7Ci0JZWxzZQorCWlmICh3bC0+cXVpcmtzICYgV0wxMlhYX1FVSVJLX05PX0JMT0NLU0laRV9BTElHTk1FTlQpCiAJCXJldHVybiBBTElHTihwYWNrZXRfbGVuZ3RoLCBXTDEyNzFfVFhfQUxJR05fVE8pOworCWVsc2UKKwkJcmV0dXJuIEFMSUdOKHBhY2tldF9sZW5ndGgsIFdMMTJYWF9CVVNfQkxPQ0tfU0laRSk7CiB9CiAKLXN0YXRpYyBpbnQgd2wxMjcxX3R4X2FsbG9jYXRlKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZXh0cmEsCi0JCQkJdTMyIGJ1Zl9vZmZzZXQsIHU4IGhsaWQpCitzdGF0aWMgaW50IHdsMTI3MV90eF9hbGxvY2F0ZShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGV4dHJhLCB1MzIgYnVmX29mZnNldCwKKwkJCSAgICAgIHU4IGhsaWQpCiB7CiAJc3RydWN0IHdsMTI3MV90eF9od19kZXNjciAqZGVzYzsKIAl1MzIgdG90YWxfbGVuID0gc2tiLT5sZW4gKyBzaXplb2Yoc3RydWN0IHdsMTI3MV90eF9od19kZXNjcikgKyBleHRyYTsKQEAgLTIxNyw2ICsyMTcsNyBAQAogCXUzMiB0b3RhbF9ibG9ja3M7CiAJaW50IGlkLCByZXQgPSAtRUJVU1ksIGFjOwogCXUzMiBzcGFyZV9ibG9ja3MgPSB3bC0+dHhfc3BhcmVfYmxvY2tzOworCWJvb2wgaXNfZHVtbXkgPSBmYWxzZTsKIAogCWlmIChidWZfb2Zmc2V0ICsgdG90YWxfbGVuID4gV0wxMjcxX0FHR1JfQlVGRkVSX1NJWkUpCiAJCXJldHVybiAtRUFHQUlOOwpAQCAtMjMxLDggKzIzMiwxMCBAQAogCWxlbiA9IHdsMTJ4eF9jYWxjX3BhY2tldF9hbGlnbm1lbnQod2wsIHRvdGFsX2xlbik7CiAKIAkvKiBpbiBjYXNlIG9mIGEgZHVtbXkgcGFja2V0LCB1c2UgZGVmYXVsdCBhbW91bnQgb2Ygc3BhcmUgbWVtIGJsb2NrcyAqLwotCWlmICh1bmxpa2VseSh3bDEyeHhfaXNfZHVtbXlfcGFja2V0KHdsLCBza2IpKSkKKwlpZiAodW5saWtlbHkod2wxMnh4X2lzX2R1bW15X3BhY2tldCh3bCwgc2tiKSkpIHsKKwkJaXNfZHVtbXkgPSB0cnVlOwogCQlzcGFyZV9ibG9ja3MgPSBUWF9IV19CTE9DS19TUEFSRV9ERUZBVUxUOworCX0KIAogCXRvdGFsX2Jsb2NrcyA9IChsZW4gKyBUWF9IV19CTE9DS19TSVpFIC0gMSkgLyBUWF9IV19CTE9DS19TSVpFICsKIAkJc3BhcmVfYmxvY2tzOwpAQCAtMjU3LDggKzI2MCw5IEBACiAJCWFjID0gd2wxMjcxX3R4X2dldF9xdWV1ZShza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CiAJCXdsLT50eF9hbGxvY2F0ZWRfcGt0c1thY10rKzsKIAotCQlpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUyAmJgotCQkgICAgaGxpZCA+PSBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQpCisJCWlmICghaXNfZHVtbXkgJiYgd2x2aWYgJiYKKwkJICAgIHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MgJiYKKwkJICAgIHRlc3RfYml0KGhsaWQsIHdsdmlmLT5hcC5zdGFfaGxpZF9tYXApKQogCQkJd2wtPmxpbmtzW2hsaWRdLmFsbG9jYXRlZF9wa3RzKys7CiAKIAkJcmV0ID0gMDsKQEAgLTI3MywxNSArMjc3LDE2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIHZvaWQgd2wxMjcxX3R4X2ZpbGxfaGRyKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgdTMyIGV4dHJhLCBzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmNvbnRyb2wsCi0JCQkgICAgICB1OCBobGlkKQorc3RhdGljIHZvaWQgd2wxMjcxX3R4X2ZpbGxfaGRyKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGV4dHJhLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqY29udHJvbCwgdTggaGxpZCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgdHM7CiAJc3RydWN0IHdsMTI3MV90eF9od19kZXNjciAqZGVzYzsKIAlpbnQgYWxpZ25lZF9sZW4sIGFjLCByYXRlX2lkeDsKIAlzNjQgaG9zdHRpbWU7Ci0JdTE2IHR4X2F0dHI7CisJdTE2IHR4X2F0dHIgPSAwOworCWJvb2wgaXNfZHVtbXk7CiAKIAlkZXNjID0gKHN0cnVjdCB3bDEyNzFfdHhfaHdfZGVzY3IgKikgc2tiLT5kYXRhOwogCkBAIC0yOTgsNyArMzAzLDggQEAKIAlob3N0dGltZSA9ICh0aW1lc3BlY190b19ucygmdHMpID4+IDEwKTsKIAlkZXNjLT5zdGFydF90aW1lID0gY3B1X3RvX2xlMzIoaG9zdHRpbWUgLSB3bC0+dGltZV9vZmZzZXQpOwogCi0JaWYgKHdsLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9BUF9CU1MpCisJaXNfZHVtbXkgPSB3bDEyeHhfaXNfZHVtbXlfcGFja2V0KHdsLCBza2IpOworCWlmIChpc19kdW1teSB8fCAhd2x2aWYgfHwgd2x2aWYtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUykKIAkJZGVzYy0+bGlmZV90aW1lID0gY3B1X3RvX2xlMTYoVFhfSFdfTUdNVF9QS1RfTElGRVRJTUVfVFUpOwogCWVsc2UKIAkJZGVzYy0+bGlmZV90aW1lID0gY3B1X3RvX2xlMTYoVFhfSFdfQVBfTU9ERV9QS1RfTElGRVRJTUVfVFUpOwpAQCAtMzA3LDM5ICszMTMsNDIgQEAKIAlhYyA9IHdsMTI3MV90eF9nZXRfcXVldWUoc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOwogCWRlc2MtPnRpZCA9IHNrYi0+cHJpb3JpdHk7CiAKLQlpZiAod2wxMnh4X2lzX2R1bW15X3BhY2tldCh3bCwgc2tiKSkgeworCWlmIChpc19kdW1teSkgewogCQkvKgogCQkgKiBGVyBleHBlY3RzIHRoZSBkdW1teSBwYWNrZXQgdG8gaGF2ZSBhbiBpbnZhbGlkIHNlc3Npb24gaWQgLQogCQkgKiBhbnkgc2Vzc2lvbiBpZCB0aGF0IGlzIGRpZmZlcmVudCB0aGFuIHRoZSBvbmUgc2V0IGluIHRoZSBqb2luCiAJCSAqLwotCQl0eF9hdHRyID0gKCh+d2wtPnNlc3Npb25fY291bnRlcikgPDwKKwkJdHhfYXR0ciA9IChTRVNTSU9OX0NPVU5URVJfSU5WQUxJRCA8PAogCQkJICAgVFhfSFdfQVRUUl9PRlNUX1NFU1NJT05fQ09VTlRFUikgJgogCQkJICAgVFhfSFdfQVRUUl9TRVNTSU9OX0NPVU5URVI7CiAKIAkJdHhfYXR0ciB8PSBUWF9IV19BVFRSX1RYX0RVTU1ZX1JFUTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAod2x2aWYpIHsKIAkJLyogY29uZmlndXJlIHRoZSB0eCBhdHRyaWJ1dGVzICovCi0JCXR4X2F0dHIgPQotCQkJd2wtPnNlc3Npb25fY291bnRlciA8PCBUWF9IV19BVFRSX09GU1RfU0VTU0lPTl9DT1VOVEVSOworCQl0eF9hdHRyID0gd2x2aWYtPnNlc3Npb25fY291bnRlciA8PAorCQkJICBUWF9IV19BVFRSX09GU1RfU0VTU0lPTl9DT1VOVEVSOwogCX0KIAogCWRlc2MtPmhsaWQgPSBobGlkOwotCi0JaWYgKHdsLT5ic3NfdHlwZSAhPSBCU1NfVFlQRV9BUF9CU1MpIHsKKwlpZiAoaXNfZHVtbXkgfHwgIXdsdmlmKQorCQlyYXRlX2lkeCA9IDA7CisJZWxzZSBpZiAod2x2aWYtPmJzc190eXBlICE9IEJTU19UWVBFX0FQX0JTUykgewogCQkvKiBpZiB0aGUgcGFja2V0cyBhcmUgZGVzdGluZWQgZm9yIEFQIChoYXZlIGEgU1RBIGVudHJ5KQogCQkgICBzZW5kIHRoZW0gd2l0aCBBUCByYXRlIHBvbGljaWVzLCBvdGhlcndpc2UgdXNlIGRlZmF1bHQKIAkJICAgYmFzaWMgcmF0ZXMgKi8KLQkJaWYgKGNvbnRyb2wtPmNvbnRyb2wuc3RhKQotCQkJcmF0ZV9pZHggPSBBQ1hfVFhfQVBfRlVMTF9SQVRFOworCQlpZiAoY29udHJvbC0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX05PX0NDS19SQVRFKQorCQkJcmF0ZV9pZHggPSB3bHZpZi0+c3RhLnAycF9yYXRlX2lkeDsKKwkJZWxzZSBpZiAoY29udHJvbC0+Y29udHJvbC5zdGEpCisJCQlyYXRlX2lkeCA9IHdsdmlmLT5zdGEuYXBfcmF0ZV9pZHg7CiAJCWVsc2UKLQkJCXJhdGVfaWR4ID0gQUNYX1RYX0JBU0lDX1JBVEU7CisJCQlyYXRlX2lkeCA9IHdsdmlmLT5zdGEuYmFzaWNfcmF0ZV9pZHg7CiAJfSBlbHNlIHsKLQkJaWYgKGhsaWQgPT0gd2wtPmFwX2dsb2JhbF9obGlkKQotCQkJcmF0ZV9pZHggPSBBQ1hfVFhfQVBfTU9ERV9NR01UX1JBVEU7Ci0JCWVsc2UgaWYgKGhsaWQgPT0gd2wtPmFwX2JjYXN0X2hsaWQpCi0JCQlyYXRlX2lkeCA9IEFDWF9UWF9BUF9NT0RFX0JDU1RfUkFURTsKKwkJaWYgKGhsaWQgPT0gd2x2aWYtPmFwLmdsb2JhbF9obGlkKQorCQkJcmF0ZV9pZHggPSB3bHZpZi0+YXAubWdtdF9yYXRlX2lkeDsKKwkJZWxzZSBpZiAoaGxpZCA9PSB3bHZpZi0+YXAuYmNhc3RfaGxpZCkKKwkJCXJhdGVfaWR4ID0gd2x2aWYtPmFwLmJjYXN0X3JhdGVfaWR4OwogCQllbHNlCi0JCQlyYXRlX2lkeCA9IGFjOworCQkJcmF0ZV9pZHggPSB3bHZpZi0+YXAudWNhc3RfcmF0ZV9pZHhbYWNdOwogCX0KIAogCXR4X2F0dHIgfD0gcmF0ZV9pZHggPDwgVFhfSFdfQVRUUl9PRlNUX1JBVEVfUE9MSUNZOwpAQCAtMzc5LDIwICszODgsMjQgQEAKIH0KIAogLyogY2FsbGVyIG11c3QgaG9sZCB3bC0+bXV0ZXggKi8KLXN0YXRpYyBpbnQgd2wxMjcxX3ByZXBhcmVfdHhfZnJhbWUoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkJdTMyIGJ1Zl9vZmZzZXQpCitzdGF0aWMgaW50IHdsMTI3MV9wcmVwYXJlX3R4X2ZyYW1lKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGJ1Zl9vZmZzZXQpCiB7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCXUzMiBleHRyYSA9IDA7CiAJaW50IHJldCA9IDA7CiAJdTMyIHRvdGFsX2xlbjsKIAl1OCBobGlkOworCWJvb2wgaXNfZHVtbXk7CiAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCisJLyogVE9ETzogaGFuZGxlIGR1bW15IHBhY2tldHMgb24gbXVsdGktdmlmcyAqLworCWlzX2R1bW15ID0gd2wxMnh4X2lzX2R1bW15X3BhY2tldCh3bCwgc2tiKTsKKwogCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSAmJgogCSAgICBpbmZvLT5jb250cm9sLmh3X2tleS0+Y2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVApCiAJCWV4dHJhID0gV0wxMjcxX1RLSVBfSVZfU1BBQ0U7CkBAIC00MDUsMjkgKzQxOCwyOCBAQAogCQlpc193ZXAgPSAoY2lwaGVyID09IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwKSB8fAogCQkJIChjaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KTsKIAotCQlpZiAodW5saWtlbHkoaXNfd2VwICYmIHdsLT5kZWZhdWx0X2tleSAhPSBpZHgpKSB7Ci0JCQlyZXQgPSB3bDEyNzFfc2V0X2RlZmF1bHRfd2VwX2tleSh3bCwgaWR4KTsKKwkJaWYgKHVubGlrZWx5KGlzX3dlcCAmJiB3bHZpZi0+ZGVmYXVsdF9rZXkgIT0gaWR4KSkgeworCQkJcmV0ID0gd2wxMjcxX3NldF9kZWZhdWx0X3dlcF9rZXkod2wsIHdsdmlmLCBpZHgpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJcmV0dXJuIHJldDsKLQkJCXdsLT5kZWZhdWx0X2tleSA9IGlkeDsKKwkJCXdsdmlmLT5kZWZhdWx0X2tleSA9IGlkeDsKIAkJfQogCX0KLQotCWhsaWQgPSB3bDEyNzFfdHhfZ2V0X2hsaWQod2wsIHNrYik7CisJaGxpZCA9IHdsMTJ4eF90eF9nZXRfaGxpZCh3bCwgd2x2aWYsIHNrYik7CiAJaWYgKGhsaWQgPT0gV0wxMlhYX0lOVkFMSURfTElOS19JRCkgewogCQl3bDEyNzFfZXJyb3IoImludmFsaWQgaGxpZC4gZHJvcHBpbmcgc2tiIDB4JXAiLCBza2IpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlyZXQgPSB3bDEyNzFfdHhfYWxsb2NhdGUod2wsIHNrYiwgZXh0cmEsIGJ1Zl9vZmZzZXQsIGhsaWQpOworCXJldCA9IHdsMTI3MV90eF9hbGxvY2F0ZSh3bCwgd2x2aWYsIHNrYiwgZXh0cmEsIGJ1Zl9vZmZzZXQsIGhsaWQpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0Jd2wxMjcxX3R4X2ZpbGxfaGRyKHdsLCBza2IsIGV4dHJhLCBpbmZvLCBobGlkKTsKKwl3bDEyNzFfdHhfZmlsbF9oZHIod2wsIHdsdmlmLCBza2IsIGV4dHJhLCBpbmZvLCBobGlkKTsKIAotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKSB7CisJaWYgKCFpc19kdW1teSAmJiB3bHZpZiAmJiB3bHZpZi0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKSB7CiAJCXdsMTI3MV90eF9hcF91cGRhdGVfaW5jb25uZWN0aW9uX3N0YSh3bCwgc2tiKTsKLQkJd2wxMjcxX3R4X3JlZ3VsYXRlX2xpbmsod2wsIGhsaWQpOworCQl3bDEyNzFfdHhfcmVndWxhdGVfbGluayh3bCwgd2x2aWYsIGhsaWQpOwogCX0KIAogCS8qCkBAIC00NDQsNyArNDU2LDcgQEAKIAltZW1zZXQod2wtPmFnZ3JfYnVmICsgYnVmX29mZnNldCArIHNrYi0+bGVuLCAwLCB0b3RhbF9sZW4gLSBza2ItPmxlbik7CiAKIAkvKiBSZXZlcnQgc2lkZSBlZmZlY3RzIGluIHRoZSBkdW1teSBwYWNrZXQgc2tiLCBzbyBpdCBjYW4gYmUgcmV1c2VkICovCi0JaWYgKHdsMTJ4eF9pc19kdW1teV9wYWNrZXQod2wsIHNrYikpCisJaWYgKGlzX2R1bW15KQogCQlza2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3Qgd2wxMjcxX3R4X2h3X2Rlc2NyKSk7CiAKIAlyZXR1cm4gdG90YWxfbGVuOwpAQCAtNTIyLDE5ICs1MzQsMTggQEAKIAlyZXR1cm4gJnF1ZXVlc1txXTsKIH0KIAotc3RhdGljIHN0cnVjdCBza19idWZmICp3bDEyNzFfc3RhX3NrYl9kZXF1ZXVlKHN0cnVjdCB3bDEyNzEgKndsKQorc3RhdGljIHN0cnVjdCBza19idWZmICp3bDEyeHhfbG5rX3NrYl9kZXF1ZXVlKHN0cnVjdCB3bDEyNzEgKndsLAorCQkJCQkgICAgICBzdHJ1Y3Qgd2wxMjcxX2xpbmsgKmxuaykKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWU7CiAKLQlxdWV1ZSA9IHdsMTI3MV9zZWxlY3RfcXVldWUod2wsIHdsLT50eF9xdWV1ZSk7CisJcXVldWUgPSB3bDEyNzFfc2VsZWN0X3F1ZXVlKHdsLCBsbmstPnR4X3F1ZXVlKTsKIAlpZiAoIXF1ZXVlKQotCQlnb3RvIG91dDsKKwkJcmV0dXJuIE5VTEw7CiAKIAlza2IgPSBza2JfZGVxdWV1ZShxdWV1ZSk7Ci0KLW91dDoKIAlpZiAoc2tiKSB7CiAJCWludCBxID0gd2wxMjcxX3R4X2dldF9xdWV1ZShza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7CiAJCXNwaW5fbG9ja19pcnFzYXZlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwpAQCAtNTQ1LDQzICs1NTYsMzMgQEAKIAlyZXR1cm4gc2tiOwogfQogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKndsMTI3MV9hcF9za2JfZGVxdWV1ZShzdHJ1Y3Qgd2wxMjcxICp3bCkKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqd2wxMnh4X3ZpZl9za2JfZGVxdWV1ZShzdHJ1Y3Qgd2wxMjcxICp3bCwKKwkJCQkJICAgICAgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmKQogewogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGksIGgsIHN0YXJ0X2hsaWQ7Ci0Jc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWU7CiAKIAkvKiBzdGFydCBmcm9tIHRoZSBsaW5rIGFmdGVyIHRoZSBsYXN0IG9uZSAqLwotCXN0YXJ0X2hsaWQgPSAod2wtPmxhc3RfdHhfaGxpZCArIDEpICUgQVBfTUFYX0xJTktTOworCXN0YXJ0X2hsaWQgPSAod2x2aWYtPmxhc3RfdHhfaGxpZCArIDEpICUgV0wxMlhYX01BWF9MSU5LUzsKIAogCS8qIGRlcXVldWUgYWNjb3JkaW5nIHRvIEFDLCByb3VuZCByb2JpbiBvbiBlYWNoIGxpbmsgKi8KLQlmb3IgKGkgPSAwOyBpIDwgQVBfTUFYX0xJTktTOyBpKyspIHsKLQkJaCA9IChzdGFydF9obGlkICsgaSkgJSBBUF9NQVhfTElOS1M7CisJZm9yIChpID0gMDsgaSA8IFdMMTJYWF9NQVhfTElOS1M7IGkrKykgeworCQloID0gKHN0YXJ0X2hsaWQgKyBpKSAlIFdMMTJYWF9NQVhfTElOS1M7CiAKIAkJLyogb25seSBjb25zaWRlciBjb25uZWN0ZWQgc3RhdGlvbnMgKi8KLQkJaWYgKGggPj0gV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUICYmCi0JCSAgICAhdGVzdF9iaXQoaCAtIFdMMTI3MV9BUF9TVEFfSExJRF9TVEFSVCwgd2wtPmFwX2hsaWRfbWFwKSkKKwkJaWYgKCF0ZXN0X2JpdChoLCB3bHZpZi0+bGlua3NfbWFwKSkKIAkJCWNvbnRpbnVlOwogCi0JCXF1ZXVlID0gd2wxMjcxX3NlbGVjdF9xdWV1ZSh3bCwgd2wtPmxpbmtzW2hdLnR4X3F1ZXVlKTsKLQkJaWYgKCFxdWV1ZSkKKwkJc2tiID0gd2wxMnh4X2xua19za2JfZGVxdWV1ZSh3bCwgJndsLT5saW5rc1toXSk7CisJCWlmICghc2tiKQogCQkJY29udGludWU7CiAKLQkJc2tiID0gc2tiX2RlcXVldWUocXVldWUpOwotCQlpZiAoc2tiKQotCQkJYnJlYWs7CisJCXdsdmlmLT5sYXN0X3R4X2hsaWQgPSBoOworCQlicmVhazsKIAl9CiAKLQlpZiAoc2tiKSB7Ci0JCWludCBxID0gd2wxMjcxX3R4X2dldF9xdWV1ZShza2JfZ2V0X3F1ZXVlX21hcHBpbmcoc2tiKSk7Ci0JCXdsLT5sYXN0X3R4X2hsaWQgPSBoOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2wtPndsX2xvY2ssIGZsYWdzKTsKLQkJd2wtPnR4X3F1ZXVlX2NvdW50W3FdLS07Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndsLT53bF9sb2NrLCBmbGFncyk7Ci0JfSBlbHNlIHsKLQkJd2wtPmxhc3RfdHhfaGxpZCA9IDA7Ci0JfQorCWlmICghc2tiKQorCQl3bHZpZi0+bGFzdF90eF9obGlkID0gMDsKIAogCXJldHVybiBza2I7CiB9CkBAIC01ODksMTIgKzU5MCwzMiBAQAogc3RhdGljIHN0cnVjdCBza19idWZmICp3bDEyNzFfc2tiX2RlcXVldWUoc3RydWN0IHdsMTI3MSAqd2wpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYgPSB3bC0+bGFzdF93bHZpZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKQotCQlza2IgPSB3bDEyNzFfYXBfc2tiX2RlcXVldWUod2wpOwotCWVsc2UKLQkJc2tiID0gd2wxMjcxX3N0YV9za2JfZGVxdWV1ZSh3bCk7CisJaWYgKHdsdmlmKSB7CisJCXdsMTJ4eF9mb3JfZWFjaF93bHZpZl9jb250aW51ZSh3bCwgd2x2aWYpIHsKKwkJCXNrYiA9IHdsMTJ4eF92aWZfc2tiX2RlcXVldWUod2wsIHdsdmlmKTsKKwkJCWlmIChza2IpIHsKKwkJCQl3bC0+bGFzdF93bHZpZiA9IHdsdmlmOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLyogZG8gYW5vdGhlciBwYXNzICovCisJaWYgKCFza2IpIHsKKwkJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgeworCQkJc2tiID0gd2wxMnh4X3ZpZl9za2JfZGVxdWV1ZSh3bCwgd2x2aWYpOworCQkJaWYgKHNrYikgeworCQkJCXdsLT5sYXN0X3dsdmlmID0gd2x2aWY7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIXNrYikKKwkJc2tiID0gd2wxMnh4X2xua19za2JfZGVxdWV1ZSh3bCwgJndsLT5saW5rc1t3bC0+c3lzdGVtX2hsaWRdKTsKIAogCWlmICghc2tiICYmCiAJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChXTDEyNzFfRkxBR19EVU1NWV9QQUNLRVRfUEVORElORywgJndsLT5mbGFncykpIHsKQEAgLTYxMCwyMSArNjMxLDIxIEBACiAJcmV0dXJuIHNrYjsKIH0KIAotc3RhdGljIHZvaWQgd2wxMjcxX3NrYl9xdWV1ZV9oZWFkKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgd2wxMjcxX3NrYl9xdWV1ZV9oZWFkKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYsCisJCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHEgPSB3bDEyNzFfdHhfZ2V0X3F1ZXVlKHNrYl9nZXRfcXVldWVfbWFwcGluZyhza2IpKTsKIAogCWlmICh3bDEyeHhfaXNfZHVtbXlfcGFja2V0KHdsLCBza2IpKSB7CiAJCXNldF9iaXQoV0wxMjcxX0ZMQUdfRFVNTVlfUEFDS0VUX1BFTkRJTkcsICZ3bC0+ZmxhZ3MpOwotCX0gZWxzZSBpZiAod2wtPmJzc190eXBlID09IEJTU19UWVBFX0FQX0JTUykgewotCQl1OCBobGlkID0gd2wxMjcxX3R4X2dldF9obGlkKHdsLCBza2IpOworCX0gZWxzZSB7CisJCXU4IGhsaWQgPSB3bDEyeHhfdHhfZ2V0X2hsaWQod2wsIHdsdmlmLCBza2IpOwogCQlza2JfcXVldWVfaGVhZCgmd2wtPmxpbmtzW2hsaWRdLnR4X3F1ZXVlW3FdLCBza2IpOwogCiAJCS8qIG1ha2Ugc3VyZSB3ZSBkZXF1ZXVlIHRoZSBzYW1lIHBhY2tldCBuZXh0IHRpbWUgKi8KLQkJd2wtPmxhc3RfdHhfaGxpZCA9IChobGlkICsgQVBfTUFYX0xJTktTIC0gMSkgJSBBUF9NQVhfTElOS1M7Ci0JfSBlbHNlIHsKLQkJc2tiX3F1ZXVlX2hlYWQoJndsLT50eF9xdWV1ZVtxXSwgc2tiKTsKKwkJd2x2aWYtPmxhc3RfdHhfaGxpZCA9IChobGlkICsgV0wxMlhYX01BWF9MSU5LUyAtIDEpICUKKwkJCQkgICAgICBXTDEyWFhfTUFYX0xJTktTOwogCX0KIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ3bC0+d2xfbG9jaywgZmxhZ3MpOwpAQCAtNjM5LDI5ICs2NjAsNzEgQEAKIAlyZXR1cm4gaWVlZTgwMjExX2lzX2RhdGFfcHJlc2VudChoZHItPmZyYW1lX2NvbnRyb2wpOwogfQogCit2b2lkIHdsMTJ4eF9yZWFybV9yeF9zdHJlYW1pbmcoc3RydWN0IHdsMTI3MSAqd2wsIHVuc2lnbmVkIGxvbmcgKmFjdGl2ZV9obGlkcykKK3sKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CisJdTMyIHRpbWVvdXQ7CisJdTggaGxpZDsKKworCWlmICghd2wtPmNvbmYucnhfc3RyZWFtaW5nLmludGVydmFsKQorCQlyZXR1cm47CisKKwlpZiAoIXdsLT5jb25mLnJ4X3N0cmVhbWluZy5hbHdheXMgJiYKKwkgICAgIXRlc3RfYml0KFdMMTI3MV9GTEFHX1NPRlRfR0VNSU5JLCAmd2wtPmZsYWdzKSkKKwkJcmV0dXJuOworCisJdGltZW91dCA9IHdsLT5jb25mLnJ4X3N0cmVhbWluZy5kdXJhdGlvbjsKKwl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikgeworCQlib29sIGZvdW5kID0gZmFsc2U7CisJCWZvcl9lYWNoX3NldF9iaXQoaGxpZCwgYWN0aXZlX2hsaWRzLCBXTDEyWFhfTUFYX0xJTktTKSB7CisJCQlpZiAodGVzdF9iaXQoaGxpZCwgd2x2aWYtPmxpbmtzX21hcCkpIHsKKwkJCQlmb3VuZCAgPSB0cnVlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKCFmb3VuZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGVuYWJsZSByeCBzdHJlYW1pbmcgKi8KKwkJaWYgKCF0ZXN0X2JpdChXTFZJRl9GTEFHX1JYX1NUUkVBTUlOR19TVEFSVEVELCAmd2x2aWYtPmZsYWdzKSkKKwkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywKKwkJCQkJICAgICAmd2x2aWYtPnJ4X3N0cmVhbWluZ19lbmFibGVfd29yayk7CisKKwkJbW9kX3RpbWVyKCZ3bHZpZi0+cnhfc3RyZWFtaW5nX3RpbWVyLAorCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7CisJfQorfQorCiB2b2lkIHdsMTI3MV90eF93b3JrX2xvY2tlZChzdHJ1Y3Qgd2wxMjcxICp3bCkKIHsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3Qgd2wxMjcxX3R4X2h3X2Rlc2NyICpkZXNjOwogCXUzMiBidWZfb2Zmc2V0ID0gMDsKIAlib29sIHNlbnRfcGFja2V0cyA9IGZhbHNlOwotCWJvb2wgaGFkX2RhdGEgPSBmYWxzZTsKLQlib29sIGlzX2FwID0gKHdsLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpOworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX2hsaWRzW0JJVFNfVE9fTE9OR1MoV0wxMlhYX01BWF9MSU5LUyldID0gezB9OwogCWludCByZXQ7CiAKIAlpZiAodW5saWtlbHkod2wtPnN0YXRlID09IFdMMTI3MV9TVEFURV9PRkYpKQogCQlyZXR1cm47CiAKIAl3aGlsZSAoKHNrYiA9IHdsMTI3MV9za2JfZGVxdWV1ZSh3bCkpKSB7Ci0JCWlmICh3bDEyNzFfdHhfaXNfZGF0YV9wcmVzZW50KHNrYikpCi0JCQloYWRfZGF0YSA9IHRydWU7CisJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwkJYm9vbCBoYXNfZGF0YSA9IGZhbHNlOwogCi0JCXJldCA9IHdsMTI3MV9wcmVwYXJlX3R4X2ZyYW1lKHdsLCBza2IsIGJ1Zl9vZmZzZXQpOworCQl3bHZpZiA9IE5VTEw7CisJCWlmICghd2wxMnh4X2lzX2R1bW15X3BhY2tldCh3bCwgc2tiKSAmJiBpbmZvLT5jb250cm9sLnZpZikKKwkJCXdsdmlmID0gd2wxMnh4X3ZpZl90b19kYXRhKGluZm8tPmNvbnRyb2wudmlmKTsKKworCQloYXNfZGF0YSA9IHdsdmlmICYmIHdsMTI3MV90eF9pc19kYXRhX3ByZXNlbnQoc2tiKTsKKwkJcmV0ID0gd2wxMjcxX3ByZXBhcmVfdHhfZnJhbWUod2wsIHdsdmlmLCBza2IsIGJ1Zl9vZmZzZXQpOwogCQlpZiAocmV0ID09IC1FQUdBSU4pIHsKIAkJCS8qCiAJCQkgKiBBZ2dyZWdhdGlvbiBidWZmZXIgaXMgZnVsbC4KIAkJCSAqIEZsdXNoIGJ1ZmZlciBhbmQgdHJ5IGFnYWluLgogCQkJICovCi0JCQl3bDEyNzFfc2tiX3F1ZXVlX2hlYWQod2wsIHNrYik7CisJCQl3bDEyNzFfc2tiX3F1ZXVlX2hlYWQod2wsIHdsdmlmLCBza2IpOwogCQkJd2wxMjcxX3dyaXRlKHdsLCBXTDEyNzFfU0xWX01FTV9EQVRBLCB3bC0+YWdncl9idWYsCiAJCQkJICAgICBidWZfb2Zmc2V0LCB0cnVlKTsKIAkJCXNlbnRfcGFja2V0cyA9IHRydWU7CkBAIC02NzIsMTYgKzczNSwyNyBAQAogCQkJICogRmlybXdhcmUgYnVmZmVyIGlzIGZ1bGwuCiAJCQkgKiBRdWV1ZSBiYWNrIGxhc3Qgc2tiLCBhbmQgc3RvcCBhZ2dyZWdhdGluZy4KIAkJCSAqLwotCQkJd2wxMjcxX3NrYl9xdWV1ZV9oZWFkKHdsLCBza2IpOworCQkJd2wxMjcxX3NrYl9xdWV1ZV9oZWFkKHdsLCB3bHZpZiwgc2tiKTsKIAkJCS8qIE5vIHdvcmsgbGVmdCwgYXZvaWQgc2NoZWR1bGluZyByZWR1bmRhbnQgdHggd29yayAqLwogCQkJc2V0X2JpdChXTDEyNzFfRkxBR19GV19UWF9CVVNZLCAmd2wtPmZsYWdzKTsKIAkJCWdvdG8gb3V0X2FjazsKIAkJfSBlbHNlIGlmIChyZXQgPCAwKSB7Ci0JCQlkZXZfa2ZyZWVfc2tiKHNrYik7CisJCQlpZiAod2wxMnh4X2lzX2R1bW15X3BhY2tldCh3bCwgc2tiKSkKKwkJCQkvKgorCQkJCSAqIGZ3IHN0aWxsIGV4cGVjdHMgZHVtbXkgcGFja2V0LAorCQkJCSAqIHNvIHJlLWVucXVldWUgaXQKKwkJCQkgKi8KKwkJCQl3bDEyNzFfc2tiX3F1ZXVlX2hlYWQod2wsIHdsdmlmLCBza2IpOworCQkJZWxzZQorCQkJCWllZWU4MDIxMV9mcmVlX3R4c2tiKHdsLT5odywgc2tiKTsKIAkJCWdvdG8gb3V0X2FjazsKIAkJfQogCQlidWZfb2Zmc2V0ICs9IHJldDsKIAkJd2wtPnR4X3BhY2tldHNfY291bnQrKzsKKwkJaWYgKGhhc19kYXRhKSB7CisJCQlkZXNjID0gKHN0cnVjdCB3bDEyNzFfdHhfaHdfZGVzY3IgKikgc2tiLT5kYXRhOworCQkJX19zZXRfYml0KGRlc2MtPmhsaWQsIGFjdGl2ZV9obGlkcyk7CisJCX0KIAl9CiAKIG91dF9hY2s6CkBAIC03MDEsMTkgKzc3NSw3IEBACiAKIAkJd2wxMjcxX2hhbmRsZV90eF9sb3dfd2F0ZXJtYXJrKHdsKTsKIAl9Ci0JaWYgKCFpc19hcCAmJiB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuaW50ZXJ2YWwgJiYgaGFkX2RhdGEgJiYKLQkgICAgKHdsLT5jb25mLnJ4X3N0cmVhbWluZy5hbHdheXMgfHwKLQkgICAgIHRlc3RfYml0KFdMMTI3MV9GTEFHX1NPRlRfR0VNSU5JLCAmd2wtPmZsYWdzKSkpIHsKLQkJdTMyIHRpbWVvdXQgPSB3bC0+Y29uZi5yeF9zdHJlYW1pbmcuZHVyYXRpb247Ci0KLQkJLyogZW5hYmxlIHJ4IHN0cmVhbWluZyAqLwotCQlpZiAoIXRlc3RfYml0KFdMMTI3MV9GTEFHX1JYX1NUUkVBTUlOR19TVEFSVEVELCAmd2wtPmZsYWdzKSkKLQkJCWllZWU4MDIxMV9xdWV1ZV93b3JrKHdsLT5odywKLQkJCQkJICAgICAmd2wtPnJ4X3N0cmVhbWluZ19lbmFibGVfd29yayk7Ci0KLQkJbW9kX3RpbWVyKCZ3bC0+cnhfc3RyZWFtaW5nX3RpbWVyLAotCQkJICBqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyh0aW1lb3V0KSk7Ci0JfQorCXdsMTJ4eF9yZWFybV9yeF9zdHJlYW1pbmcod2wsIGFjdGl2ZV9obGlkcyk7CiB9CiAKIHZvaWQgd2wxMjcxX3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNzM3LDYgKzc5OSw4IEBACiAJCQkJICAgICAgc3RydWN0IHdsMTI3MV90eF9od19yZXNfZGVzY3IgKnJlc3VsdCkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZjsKKwlzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWY7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlpbnQgaWQgPSByZXN1bHQtPmlkOwogCWludCByYXRlID0gLTE7CkBAIC03NTYsMTEgKzgyMCwxNiBAQAogCQlyZXR1cm47CiAJfQogCisJLyogaW5mby0+Y29udHJvbCBpcyB2YWxpZCBhcyBsb25nIGFzIHdlIGRvbid0IHVwZGF0ZSBpbmZvLT5zdGF0dXMgKi8KKwl2aWYgPSBpbmZvLT5jb250cm9sLnZpZjsKKwl3bHZpZiA9IHdsMTJ4eF92aWZfdG9fZGF0YSh2aWYpOworCiAJLyogdXBkYXRlIHRoZSBUWCBzdGF0dXMgaW5mbyAqLwogCWlmIChyZXN1bHQtPnN0YXR1cyA9PSBUWF9TVUNDRVNTKSB7CiAJCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0spKQogCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOwotCQlyYXRlID0gd2wxMjcxX3JhdGVfdG9faWR4KHJlc3VsdC0+cmF0ZV9jbGFzc19pbmRleCwgd2wtPmJhbmQpOworCQlyYXRlID0gd2wxMjcxX3JhdGVfdG9faWR4KHJlc3VsdC0+cmF0ZV9jbGFzc19pbmRleCwKKwkJCQkJICB3bHZpZi0+YmFuZCk7CiAJCXJldHJpZXMgPSByZXN1bHQtPmFja19mYWlsdXJlczsKIAl9IGVsc2UgaWYgKHJlc3VsdC0+c3RhdHVzID09IFRYX1JFVFJZX0VYQ0VFREVEKSB7CiAJCXdsLT5zdGF0cy5leGNlc3NpdmVfcmV0cmllcysrOwpAQCAtNzgzLDE0ICs4NTIsMTQgQEAKIAkgICAgIGluZm8tPmNvbnRyb2wuaHdfa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCB8fAogCSAgICAgaW5mby0+Y29udHJvbC5od19rZXktPmNpcGhlciA9PSBXTDEyNzFfQ0lQSEVSX1NVSVRFX0dFTSkpIHsKIAkJdTggZndfbHNiID0gcmVzdWx0LT50eF9zZWN1cml0eV9zZXF1ZW5jZV9udW1iZXJfbHNiOwotCQl1OCBjdXJfbHNiID0gd2wtPnR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYjsKKwkJdTggY3VyX2xzYiA9IHdsdmlmLT50eF9zZWN1cml0eV9sYXN0X3NlcV9sc2I7CiAKIAkJLyoKIAkJICogdXBkYXRlIHNlY3VyaXR5IHNlcXVlbmNlIG51bWJlciwgdGFraW5nIGNhcmUgb2YgcG90ZW50aWFsCiAJCSAqIHdyYXAtYXJvdW5kCiAJCSAqLwotCQl3bC0+dHhfc2VjdXJpdHlfc2VxICs9IChmd19sc2IgLSBjdXJfbHNiICsgMjU2KSAlIDI1NjsKLQkJd2wtPnR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYiA9IGZ3X2xzYjsKKwkJd2x2aWYtPnR4X3NlY3VyaXR5X3NlcSArPSAoZndfbHNiIC0gY3VyX2xzYikgJiAweGZmOworCQl3bHZpZi0+dHhfc2VjdXJpdHlfbGFzdF9zZXFfbHNiID0gZndfbHNiOwogCX0KIAogCS8qIHJlbW92ZSBwcml2YXRlIGhlYWRlciBmcm9tIHBhY2tldCAqLwpAQCAtODg2LDQwICs5NTUsMzEgQEAKIH0KIAogLyogY2FsbGVyIG11c3QgaG9sZCB3bC0+bXV0ZXggYW5kIFRYIG11c3QgYmUgc3RvcHBlZCAqLwotdm9pZCB3bDEyNzFfdHhfcmVzZXQoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgcmVzZXRfdHhfcXVldWVzKQordm9pZCB3bDEyeHhfdHhfcmVzZXRfd2x2aWYoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKK3sKKwlpbnQgaTsKKworCS8qIFRYIGZhaWx1cmUgKi8KKwlmb3JfZWFjaF9zZXRfYml0KGksIHdsdmlmLT5saW5rc19tYXAsIFdMMTJYWF9NQVhfTElOS1MpIHsKKwkJaWYgKHdsdmlmLT5ic3NfdHlwZSA9PSBCU1NfVFlQRV9BUF9CU1MpCisJCQl3bDEyNzFfZnJlZV9zdGEod2wsIHdsdmlmLCBpKTsKKwkJZWxzZQorCQkJd2x2aWYtPnN0YS5iYV9yeF9iaXRtYXAgPSAwOworCisJCXdsMTI3MV90eF9yZXNldF9saW5rX3F1ZXVlcyh3bCwgaSk7CisJCXdsLT5saW5rc1tpXS5hbGxvY2F0ZWRfcGt0cyA9IDA7CisJCXdsLT5saW5rc1tpXS5wcmV2X2ZyZWVkX3BrdHMgPSAwOworCX0KKwl3bHZpZi0+bGFzdF90eF9obGlkID0gMDsKKworfQorLyogY2FsbGVyIG11c3QgaG9sZCB3bC0+bXV0ZXggYW5kIFRYIG11c3QgYmUgc3RvcHBlZCAqLwordm9pZCB3bDEyeHhfdHhfcmVzZXQoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgcmVzZXRfdHhfcXVldWVzKQogewogCWludCBpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCi0JLyogVFggZmFpbHVyZSAqLwotCWlmICh3bC0+YnNzX3R5cGUgPT0gQlNTX1RZUEVfQVBfQlNTKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBBUF9NQVhfTElOS1M7IGkrKykgewotCQkJd2wxMjcxX2ZyZWVfc3RhKHdsLCBpKTsKLQkJCXdsMTI3MV90eF9yZXNldF9saW5rX3F1ZXVlcyh3bCwgaSk7Ci0JCQl3bC0+bGlua3NbaV0uYWxsb2NhdGVkX3BrdHMgPSAwOwotCQkJd2wtPmxpbmtzW2ldLnByZXZfZnJlZWRfcGt0cyA9IDA7Ci0JCX0KLQotCQl3bC0+bGFzdF90eF9obGlkID0gMDsKLQl9IGVsc2UgewotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKSB7Ci0JCQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZ3bC0+dHhfcXVldWVbaV0pKSkgewotCQkJCXdsMTI3MV9kZWJ1ZyhERUJVR19UWCwgImZyZWVpbmcgc2tiIDB4JXAiLAotCQkJCQkgICAgIHNrYik7Ci0KLQkJCQlpZiAoIXdsMTJ4eF9pc19kdW1teV9wYWNrZXQod2wsIHNrYikpIHsKLQkJCQkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQkJCQkJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeCA9IC0xOwotCQkJCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSAwOwotCQkJCQlpZWVlODAyMTFfdHhfc3RhdHVzX25pKHdsLT5odywgc2tiKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQl3bC0+YmFfcnhfYml0bWFwID0gMDsKLQl9Ci0KIAlmb3IgKGkgPSAwOyBpIDwgTlVNX1RYX1FVRVVFUzsgaSsrKQogCQl3bC0+dHhfcXVldWVfY291bnRbaV0gPSAwOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvdHguaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90eC5oCmluZGV4IGRjNGYwOWEuLjJkYmIyNGUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90eC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC90eC5oCkBAIC0yMDYsMTggKzIwNiwyMyBAQAogdm9pZCB3bDEyNzFfdHhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogdm9pZCB3bDEyNzFfdHhfd29ya19sb2NrZWQoc3RydWN0IHdsMTI3MSAqd2wpOwogdm9pZCB3bDEyNzFfdHhfY29tcGxldGUoc3RydWN0IHdsMTI3MSAqd2wpOwotdm9pZCB3bDEyNzFfdHhfcmVzZXQoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgcmVzZXRfdHhfcXVldWVzKTsKK3ZvaWQgd2wxMnh4X3R4X3Jlc2V0X3dsdmlmKHN0cnVjdCB3bDEyNzEgKndsLCBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2x2aWYpOwordm9pZCB3bDEyeHhfdHhfcmVzZXQoc3RydWN0IHdsMTI3MSAqd2wsIGJvb2wgcmVzZXRfdHhfcXVldWVzKTsKIHZvaWQgd2wxMjcxX3R4X2ZsdXNoKHN0cnVjdCB3bDEyNzEgKndsKTsKIHU4IHdsMTI3MV9yYXRlX3RvX2lkeChpbnQgcmF0ZSwgZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kKTsKIHUzMiB3bDEyNzFfdHhfZW5hYmxlZF9yYXRlc19nZXQoc3RydWN0IHdsMTI3MSAqd2wsIHUzMiByYXRlX3NldCwKIAkJCQllbnVtIGllZWU4MDIxMV9iYW5kIHJhdGVfYmFuZCk7CiB1MzIgd2wxMjcxX3R4X21pbl9yYXRlX2dldChzdHJ1Y3Qgd2wxMjcxICp3bCwgdTMyIHJhdGVfc2V0KTsKLXU4IHdsMTJ4eF90eF9nZXRfaGxpZF9hcChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit1OCB3bDEyeHhfdHhfZ2V0X2hsaWRfYXAoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZiwKKwkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK3U4IHdsMTJ4eF90eF9nZXRfaGxpZChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLAorCQkgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIHZvaWQgd2wxMjcxX3R4X3Jlc2V0X2xpbmtfcXVldWVzKHN0cnVjdCB3bDEyNzEgKndsLCB1OCBobGlkKTsKIHZvaWQgd2wxMjcxX2hhbmRsZV90eF9sb3dfd2F0ZXJtYXJrKHN0cnVjdCB3bDEyNzEgKndsKTsKIGJvb2wgd2wxMnh4X2lzX2R1bW15X3BhY2tldChzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cit2b2lkIHdsMTJ4eF9yZWFybV9yeF9zdHJlYW1pbmcoc3RydWN0IHdsMTI3MSAqd2wsIHVuc2lnbmVkIGxvbmcgKmFjdGl2ZV9obGlkcyk7CiAKIC8qIGZyb20gbWFpbi5jICovCi12b2lkIHdsMTI3MV9mcmVlX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggaGxpZCk7Cit2b2lkIHdsMTI3MV9mcmVlX3N0YShzdHJ1Y3Qgd2wxMjcxICp3bCwgc3RydWN0IHdsMTJ4eF92aWYgKndsdmlmLCB1OCBobGlkKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4LmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4LmgKaW5kZXggMWVjOTBmYy4uYjJiMDljZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTJ4eC5oCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHguaApAQCAtMzUsODMgKzM1LDYgQEAKICNpbmNsdWRlICJjb25mLmgiCiAjaW5jbHVkZSAiaW5pLmgiCiAKLSNkZWZpbmUgRFJJVkVSX05BTUUgIndsMTI3MSIKLSNkZWZpbmUgRFJJVkVSX1BSRUZJWCBEUklWRVJfTkFNRSAiOiAiCi0KLS8qCi0gKiBGVyB2ZXJzaW9ucyBzdXBwb3J0IEJBIDExbgotICogdmVyc2lvbnMgbWFya3MgeC54LnguNTAtNjAueAotICovCi0jZGVmaW5lIFdMMTJYWF9CQV9TVVBQT1JUX0ZXX0NPU1RfVkVSMl9TVEFSVCAgICA1MAotI2RlZmluZSBXTDEyWFhfQkFfU1VQUE9SVF9GV19DT1NUX1ZFUjJfRU5EICAgICAgNjAKLQotZW51bSB7Ci0JREVCVUdfTk9ORQk9IDAsCi0JREVCVUdfSVJRCT0gQklUKDApLAotCURFQlVHX1NQSQk9IEJJVCgxKSwKLQlERUJVR19CT09UCT0gQklUKDIpLAotCURFQlVHX01BSUxCT1gJPSBCSVQoMyksCi0JREVCVUdfVEVTVE1PREUJPSBCSVQoNCksCi0JREVCVUdfRVZFTlQJPSBCSVQoNSksCi0JREVCVUdfVFgJPSBCSVQoNiksCi0JREVCVUdfUlgJPSBCSVQoNyksCi0JREVCVUdfU0NBTgk9IEJJVCg4KSwKLQlERUJVR19DUllQVAk9IEJJVCg5KSwKLQlERUJVR19QU00JPSBCSVQoMTApLAotCURFQlVHX01BQzgwMjExCT0gQklUKDExKSwKLQlERUJVR19DTUQJPSBCSVQoMTIpLAotCURFQlVHX0FDWAk9IEJJVCgxMyksCi0JREVCVUdfU0RJTwk9IEJJVCgxNCksCi0JREVCVUdfRklMVEVSUyAgID0gQklUKDE1KSwKLQlERUJVR19BREhPQyAgICAgPSBCSVQoMTYpLAotCURFQlVHX0FQCT0gQklUKDE3KSwKLQlERUJVR19NQVNURVIJPSAoREVCVUdfQURIT0MgfCBERUJVR19BUCksCi0JREVCVUdfQUxMCT0gfjAsCi19OwotCi1leHRlcm4gdTMyIHdsMTJ4eF9kZWJ1Z19sZXZlbDsKLQotI2RlZmluZSBERUJVR19EVU1QX0xJTUlUIDEwMjQKLQotI2RlZmluZSB3bDEyNzFfZXJyb3IoZm10LCBhcmcuLi4pIFwKLQlwcl9lcnIoRFJJVkVSX1BSRUZJWCAiRVJST1IgIiBmbXQgIlxuIiwgIyNhcmcpCi0KLSNkZWZpbmUgd2wxMjcxX3dhcm5pbmcoZm10LCBhcmcuLi4pIFwKLQlwcl93YXJuaW5nKERSSVZFUl9QUkVGSVggIldBUk5JTkcgIiBmbXQgIlxuIiwgIyNhcmcpCi0KLSNkZWZpbmUgd2wxMjcxX25vdGljZShmbXQsIGFyZy4uLikgXAotCXByX2luZm8oRFJJVkVSX1BSRUZJWCBmbXQgIlxuIiwgIyNhcmcpCi0KLSNkZWZpbmUgd2wxMjcxX2luZm8oZm10LCBhcmcuLi4pIFwKLQlwcl9pbmZvKERSSVZFUl9QUkVGSVggZm10ICJcbiIsICMjYXJnKQotCi0jZGVmaW5lIHdsMTI3MV9kZWJ1ZyhsZXZlbCwgZm10LCBhcmcuLi4pIFwKLQlkbyB7IFwKLQkJaWYgKGxldmVsICYgd2wxMnh4X2RlYnVnX2xldmVsKSBcCi0JCQlwcl9kZWJ1ZyhEUklWRVJfUFJFRklYIGZtdCAiXG4iLCAjI2FyZyk7IFwKLQl9IHdoaWxlICgwKQotCi0vKiBUT0RPOiB1c2UgcHJfZGVidWdfaGV4X2R1bXAgd2hlbiBpdCB3aWxsIGJlIGF2YWlsYWJsZSAqLwotI2RlZmluZSB3bDEyNzFfZHVtcChsZXZlbCwgcHJlZml4LCBidWYsIGxlbikJXAotCWRvIHsgXAotCQlpZiAobGV2ZWwgJiB3bDEyeHhfZGVidWdfbGV2ZWwpIFwKLQkJCXByaW50X2hleF9kdW1wKEtFUk5fREVCVUcsIERSSVZFUl9QUkVGSVggcHJlZml4LCBcCi0JCQkJICAgICAgIERVTVBfUFJFRklYX09GRlNFVCwgMTYsIDEsCVwKLQkJCQkgICAgICAgYnVmLAkJCQlcCi0JCQkJICAgICAgIG1pbl90KHNpemVfdCwgbGVuLCBERUJVR19EVU1QX0xJTUlUKSwgXAotCQkJCSAgICAgICAwKTsJCQkJXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgd2wxMjcxX2R1bXBfYXNjaWkobGV2ZWwsIHByZWZpeCwgYnVmLCBsZW4pCVwKLQlkbyB7IFwKLQkJaWYgKGxldmVsICYgd2wxMnh4X2RlYnVnX2xldmVsKSBcCi0JCQlwcmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCBEUklWRVJfUFJFRklYIHByZWZpeCwgXAotCQkJCSAgICAgICBEVU1QX1BSRUZJWF9PRkZTRVQsIDE2LCAxLAlcCi0JCQkJICAgICAgIGJ1ZiwJCQkJXAotCQkJCSAgICAgICBtaW5fdChzaXplX3QsIGxlbiwgREVCVUdfRFVNUF9MSU1JVCksIFwKLQkJCQkgICAgICAgdHJ1ZSk7CQkJCVwKLQl9IHdoaWxlICgwKQotCiAjZGVmaW5lIFdMMTI3WF9GV19OQU1FICJ0aS1jb25uZWN0aXZpdHkvd2wxMjd4LWZ3LTMuYmluIgogI2RlZmluZSBXTDEyOFhfRldfTkFNRSAidGktY29ubmVjdGl2aXR5L3dsMTI4eC1mdy0zLmJpbiIKIApAQCAtMTQyLDE2ICs2NSwxMiBAQAogI2RlZmluZSBXTDEyWFhfSU5WQUxJRF9ST0xFX0lEICAgICAweGZmCiAjZGVmaW5lIFdMMTJYWF9JTlZBTElEX0xJTktfSUQgICAgIDB4ZmYKIAorI2RlZmluZSBXTDEyWFhfTUFYX1JBVEVfUE9MSUNJRVMgMTYKKwogLyogRGVmaW5lZCBieSBGVyBhcyAwLiBXaWxsIG5vdCBiZSBmcmVlZCBvciBhbGxvY2F0ZWQuICovCiAjZGVmaW5lIFdMMTJYWF9TWVNURU1fSExJRCAgICAgICAgIDAKIAogLyoKLSAqIFRPRE86IHdlIGN1cnJlbnRseSBkb24ndCBzdXBwb3J0IG11bHRpcm9sZS4gcmVtb3ZlCi0gKiB0aGlzIGNvbnN0YW50IGZyb20gdGhlIGNvZGUgd2hlbiB3ZSBkby4KLSAqLwotI2RlZmluZSBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQgICAzCi0KLS8qCiAgKiBXaGVuIGluIEFQLW1vZGUsIHdlIGFsbG93IChhdCBsZWFzdCkgdGhpcyBudW1iZXIgb2YgcGFja2V0cwogICogdG8gYmUgdHJhbnNtaXR0ZWQgdG8gRlcgZm9yIGEgU1RBIGluIFBTLW1vZGUuIE9ubHkgd2hlbiBwYWNrZXRzIGFyZQogICogcHJlc2VudCBpbiB0aGUgRlcgYnVmZmVycyBpdCB3aWxsIHdha2UgdGhlIHNsZWVwaW5nIFNUQS4gV2Ugd2FudCB0byBwdXQKQEAgLTIzNiwxMyArMTU1LDYgQEAKIAogI2RlZmluZSBBUF9NQVhfU1RBVElPTlMgICAgICAgICAgICA4CiAKLS8qIEJyb2FkY2FzdCBhbmQgR2xvYmFsIGxpbmtzICsgc3lzdGVtIGxpbmsgKyBsaW5rcyB0byBzdGF0aW9ucyAqLwotLyoKLSAqIFRPRE86IHdoZW4gV0wxMjcxX0FQX1NUQV9ITElEX1NUQVJUIGlzIG5vIGxvbmdlciBjb25zdGFudCwgY2hhbmdlIGFsbAotICogdGhlIHBsYWNlcyB0aGF0IHVzZSB0aGlzLgotICovCi0jZGVmaW5lIEFQX01BWF9MSU5LUyAgICAgICAgICAgICAgIChBUF9NQVhfU1RBVElPTlMgKyBXTDEyNzFfQVBfU1RBX0hMSURfU1RBUlQpCi0KIC8qIEZXIHN0YXR1cyByZWdpc3RlcnMgKi8KIHN0cnVjdCB3bDEyeHhfZndfc3RhdHVzIHsKIAlfX2xlMzIgaW50cjsKQEAgLTI5OSwxNyArMjExLDE0IEBACiB9OwogCiBzdHJ1Y3Qgd2wxMjcxX2lmX29wZXJhdGlvbnMgewotCXZvaWQgKCpyZWFkKShzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwKKwl2b2lkICgqcmVhZCkoc3RydWN0IGRldmljZSAqY2hpbGQsIGludCBhZGRyLCB2b2lkICpidWYsIHNpemVfdCBsZW4sCiAJCSAgICAgYm9vbCBmaXhlZCk7Ci0Jdm9pZCAoKndyaXRlKShzdHJ1Y3Qgd2wxMjcxICp3bCwgaW50IGFkZHIsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwKKwl2b2lkICgqd3JpdGUpKHN0cnVjdCBkZXZpY2UgKmNoaWxkLCBpbnQgYWRkciwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLAogCQkgICAgIGJvb2wgZml4ZWQpOwotCXZvaWQgKCpyZXNldCkoc3RydWN0IHdsMTI3MSAqd2wpOwotCXZvaWQgKCppbml0KShzdHJ1Y3Qgd2wxMjcxICp3bCk7Ci0JaW50ICgqcG93ZXIpKHN0cnVjdCB3bDEyNzEgKndsLCBib29sIGVuYWJsZSk7Ci0Jc3RydWN0IGRldmljZSogKCpkZXYpKHN0cnVjdCB3bDEyNzEgKndsKTsKLQl2b2lkICgqZW5hYmxlX2lycSkoc3RydWN0IHdsMTI3MSAqd2wpOwotCXZvaWQgKCpkaXNhYmxlX2lycSkoc3RydWN0IHdsMTI3MSAqd2wpOwotCXZvaWQgKCpzZXRfYmxvY2tfc2l6ZSkgKHN0cnVjdCB3bDEyNzEgKndsLCB1bnNpZ25lZCBpbnQgYmxrc3opOworCXZvaWQgKCpyZXNldCkoc3RydWN0IGRldmljZSAqY2hpbGQpOworCXZvaWQgKCppbml0KShzdHJ1Y3QgZGV2aWNlICpjaGlsZCk7CisJaW50ICgqcG93ZXIpKHN0cnVjdCBkZXZpY2UgKmNoaWxkLCBib29sIGVuYWJsZSk7CisJdm9pZCAoKnNldF9ibG9ja19zaXplKSAoc3RydWN0IGRldmljZSAqY2hpbGQsIHVuc2lnbmVkIGludCBibGtzeik7CiB9OwogCiAjZGVmaW5lIE1BWF9OVU1fS0VZUyAxNApAQCAtMzI2LDI5ICsyMzUsMzMgQEAKIH07CiAKIGVudW0gd2wxMnh4X2ZsYWdzIHsKLQlXTDEyNzFfRkxBR19TVEFfQVNTT0NJQVRFRCwKLQlXTDEyNzFfRkxBR19JQlNTX0pPSU5FRCwKIAlXTDEyNzFfRkxBR19HUElPX1BPV0VSLAogCVdMMTI3MV9GTEFHX1RYX1FVRVVFX1NUT1BQRUQsCiAJV0wxMjcxX0ZMQUdfVFhfUEVORElORywKIAlXTDEyNzFfRkxBR19JTl9FTFAsCiAJV0wxMjcxX0ZMQUdfRUxQX1JFUVVFU1RFRCwKLQlXTDEyNzFfRkxBR19QU00sCi0JV0wxMjcxX0ZMQUdfUFNNX1JFUVVFU1RFRCwKIAlXTDEyNzFfRkxBR19JUlFfUlVOTklORywKLQlXTDEyNzFfRkxBR19JRExFLAotCVdMMTI3MV9GTEFHX1BTUE9MTF9GQUlMVVJFLAotCVdMMTI3MV9GTEFHX1NUQV9TVEFURV9TRU5ULAogCVdMMTI3MV9GTEFHX0ZXX1RYX0JVU1ksCi0JV0wxMjcxX0ZMQUdfQVBfU1RBUlRFRCwKLQlXTDEyNzFfRkxBR19JRl9JTklUSUFMSVpFRCwKIAlXTDEyNzFfRkxBR19EVU1NWV9QQUNLRVRfUEVORElORywKIAlXTDEyNzFfRkxBR19TVVNQRU5ERUQsCiAJV0wxMjcxX0ZMQUdfUEVORElOR19XT1JLLAogCVdMMTI3MV9GTEFHX1NPRlRfR0VNSU5JLAotCVdMMTI3MV9GTEFHX1JYX1NUUkVBTUlOR19TVEFSVEVELAogCVdMMTI3MV9GTEFHX1JFQ09WRVJZX0lOX1BST0dSRVNTLAotCVdMMTI3MV9GTEFHX0NTX1BST0dSRVNTLAorfTsKKworZW51bSB3bDEyeHhfdmlmX2ZsYWdzIHsKKwlXTFZJRl9GTEFHX0lOSVRJQUxJWkVELAorCVdMVklGX0ZMQUdfU1RBX0FTU09DSUFURUQsCisJV0xWSUZfRkxBR19JQlNTX0pPSU5FRCwKKwlXTFZJRl9GTEFHX0FQX1NUQVJURUQsCisJV0xWSUZfRkxBR19QU00sCisJV0xWSUZfRkxBR19QU01fUkVRVUVTVEVELAorCVdMVklGX0ZMQUdfU1RBX1NUQVRFX1NFTlQsCisJV0xWSUZfRkxBR19SWF9TVFJFQU1JTkdfU1RBUlRFRCwKKwlXTFZJRl9GTEFHX1BTUE9MTF9GQUlMVVJFLAorCVdMVklGX0ZMQUdfQ1NfUFJPR1JFU1MsCisJV0xWSUZfRkxBR19BUF9QUk9CRV9SRVNQX1NFVCwKKwlXTFZJRl9GTEFHX0lOX1VTRSwKIH07CiAKIHN0cnVjdCB3bDEyNzFfbGluayB7CkBAIC0zNjYsMTAgKzI3OSwxMSBAQAogfTsKIAogc3RydWN0IHdsMTI3MSB7Ci0Jc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxhdF9kZXY7CiAJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7CiAJYm9vbCBtYWM4MDIxMV9yZWdpc3RlcmVkOwogCisJc3RydWN0IGRldmljZSAqZGV2OworCiAJdm9pZCAqaWZfcHJpdjsKIAogCXN0cnVjdCB3bDEyNzFfaWZfb3BlcmF0aW9ucyAqaWZfb3BzOwpAQCAtMzk5LDI1ICszMTMsMjAgQEAKIAogCXM4IGh3X3BnX3ZlcjsKIAotCXU4IGJzc2lkW0VUSF9BTEVOXTsKIAl1OCBtYWNfYWRkcltFVEhfQUxFTl07Ci0JdTggYnNzX3R5cGU7Ci0JdTggc2V0X2Jzc190eXBlOwotCXU4IHAycDsgLyogd2UgYXJlIHVzaW5nIHAycCByb2xlICovCi0JdTggc3NpZFtJRUVFODAyMTFfTUFYX1NTSURfTEVOICsgMV07Ci0JdTggc3NpZF9sZW47CiAJaW50IGNoYW5uZWw7Ci0JdTggcm9sZV9pZDsKLQl1OCBkZXZfcm9sZV9pZDsKIAl1OCBzeXN0ZW1faGxpZDsKLQl1OCBzdGFfaGxpZDsKLQl1OCBkZXZfaGxpZDsKLQl1OCBhcF9nbG9iYWxfaGxpZDsKLQl1OCBhcF9iY2FzdF9obGlkOwogCiAJdW5zaWduZWQgbG9uZyBsaW5rc19tYXBbQklUU19UT19MT05HUyhXTDEyWFhfTUFYX0xJTktTKV07CiAJdW5zaWduZWQgbG9uZyByb2xlc19tYXBbQklUU19UT19MT05HUyhXTDEyWFhfTUFYX1JPTEVTKV07CiAJdW5zaWduZWQgbG9uZyByb2NfbWFwW0JJVFNfVE9fTE9OR1MoV0wxMlhYX01BWF9ST0xFUyldOworCXVuc2lnbmVkIGxvbmcgcmF0ZV9wb2xpY2llc19tYXBbCisJCQlCSVRTX1RPX0xPTkdTKFdMMTJYWF9NQVhfUkFURV9QT0xJQ0lFUyldOworCisJc3RydWN0IGxpc3RfaGVhZCB3bHZpZl9saXN0OworCisJdTggc3RhX2NvdW50OworCXU4IGFwX2NvdW50OwogCiAJc3RydWN0IHdsMTI3MV9hY3hfbWVtX21hcCAqdGFyZ2V0X21lbV9tYXA7CiAKQEAgLTQ0MCwxMSArMzQ5LDcgQEAKIAkvKiBUaW1lLW9mZnNldCBiZXR3ZWVuIGhvc3QgYW5kIGNoaXBzZXQgY2xvY2tzICovCiAJczY0IHRpbWVfb2Zmc2V0OwogCi0JLyogU2Vzc2lvbiBjb3VudGVyIGZvciB0aGUgY2hpcHNldCAqLwotCWludCBzZXNzaW9uX2NvdW50ZXI7Ci0KIAkvKiBGcmFtZXMgc2NoZWR1bGVkIGZvciB0cmFuc21pc3Npb24sIG5vdCBoYW5kbGVkIHlldCAqLwotCXN0cnVjdCBza19idWZmX2hlYWQgdHhfcXVldWVbTlVNX1RYX1FVRVVFU107CiAJaW50IHR4X3F1ZXVlX2NvdW50W05VTV9UWF9RVUVVRVNdOwogCWxvbmcgc3RvcHBlZF9xdWV1ZXNfbWFwOwogCkBAIC00NjIsMTcgKzM2Nyw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKnR4X2ZyYW1lc1tBQ1hfVFhfREVTQ1JJUFRPUlNdOwogCWludCB0eF9mcmFtZXNfY250OwogCi0JLyoKLQkgKiBTZWN1cml0eSBzZXF1ZW5jZSBudW1iZXIKLQkgKiAgICAgYml0cyAwLTE1OiBsb3dlciAxNiBiaXRzIHBhcnQgb2Ygc2VxdWVuY2UgbnVtYmVyCi0JICogICAgIGJpdHMgMTYtNDc6IGhpZ2hlciAzMiBiaXRzIHBhcnQgb2Ygc2VxdWVuY2UgbnVtYmVyCi0JICogICAgIGJpdHMgNDgtNjM6IG5vdCBpbiB1c2UKLQkgKi8KLQl1NjQgdHhfc2VjdXJpdHlfc2VxOwotCi0JLyogOCBiaXRzIG9mIHRoZSBsYXN0IHNlcXVlbmNlIG51bWJlciBpbiB1c2UgKi8KLQl1OCB0eF9zZWN1cml0eV9sYXN0X3NlcV9sc2I7Ci0KIAkvKiBGVyBSeCBjb3VudGVyICovCiAJdTMyIHJ4X2NvdW50ZXI7CiAKQEAgLTUwNyw1OSArNDAxLDIxIEBACiAJdTMyIG1ib3hfcHRyWzJdOwogCiAJLyogQXJlIHdlIGN1cnJlbnRseSBzY2FubmluZyAqLworCXN0cnVjdCBpZWVlODAyMTFfdmlmICpzY2FuX3ZpZjsKIAlzdHJ1Y3Qgd2wxMjcxX3NjYW4gc2NhbjsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHNjYW5fY29tcGxldGVfd29yazsKIAogCWJvb2wgc2NoZWRfc2Nhbm5pbmc7CiAKLQkvKiBwcm9iZS1yZXEgdGVtcGxhdGUgZm9yIHRoZSBjdXJyZW50IEFQICovCi0Jc3RydWN0IHNrX2J1ZmYgKnByb2JlcmVxOwotCi0JLyogT3VyIGFzc29jaWF0aW9uIElEICovCi0JdTE2IGFpZDsKLQotCS8qCi0JICogY3VycmVudGx5IGNvbmZpZ3VyZWQgcmF0ZSBzZXQ6Ci0JICoJYml0cyAgMC0xNSAtIDgwMi4xMWFiZyByYXRlcwotCSAqCWJpdHMgMTYtMjMgLSA4MDIuMTFuICAgTUNTIGluZGV4IG1hc2sKLQkgKiBzdXBwb3J0IG9ubHkgMSBzdHJlYW0sIHRodXMgb25seSA4IGJpdHMgZm9yIHRoZSBNQ1MgcmF0ZXMgKDAtNykuCi0JICovCi0JdTMyIGJhc2ljX3JhdGVfc2V0OwotCXUzMiBiYXNpY19yYXRlOwotCXUzMiByYXRlX3NldDsKLQl1MzIgYml0cmF0ZV9tYXNrc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKLQogCS8qIFRoZSBjdXJyZW50IGJhbmQgKi8KIAllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CiAKLQkvKiBCZWFjb25pbmcgaW50ZXJ2YWwgKG5lZWRlZCBmb3IgYWQtaG9jKSAqLwotCXUzMiBiZWFjb25faW50OwotCi0JLyogRGVmYXVsdCBrZXkgKGZvciBXRVApICovCi0JdTMyIGRlZmF1bHRfa2V5OwotCi0JLyogUnggU3RyZWFtaW5nICovCi0Jc3RydWN0IHdvcmtfc3RydWN0IHJ4X3N0cmVhbWluZ19lbmFibGVfd29yazsKLQlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgcnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yazsKLQlzdHJ1Y3QgdGltZXJfbGlzdCByeF9zdHJlYW1pbmdfdGltZXI7Ci0KIAlzdHJ1Y3QgY29tcGxldGlvbiAqZWxwX2NvbXBsOwotCXN0cnVjdCBjb21wbGV0aW9uICpwc19jb21wbDsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrIGVscF93b3JrOwotCXN0cnVjdCBkZWxheWVkX3dvcmsgcHNwb2xsX3dvcms7Ci0KLQkvKiBjb3VudGVyIGZvciBwcy1wb2xsIGRlbGl2ZXJ5IGZhaWx1cmVzICovCi0JaW50IHBzX3BvbGxfZmFpbHVyZXM7Ci0KLQkvKiByZXRyeSBjb3VudGVyIGZvciBQU00gZW50cmllcyAqLwotCXU4IHBzbV9lbnRyeV9yZXRyeTsKIAogCS8qIGluIGRCbSAqLwogCWludCBwb3dlcl9sZXZlbDsKIAotCWludCByc3NpX3Rob2xkOwotCWludCBsYXN0X3Jzc2lfZXZlbnQ7Ci0KIAlzdHJ1Y3Qgd2wxMjcxX3N0YXRzIHN0YXRzOwogCiAJX19sZTMyIGJ1ZmZlcl8zMjsKQEAgLTU4MywyMCArNDM5LDkgQEAKIAkvKiBNb3N0IHJlY2VudGx5IHJlcG9ydGVkIG5vaXNlIGluIGRCbSAqLwogCXM4IG5vaXNlOwogCi0JLyogbWFwIGZvciBITElEcyBvZiBhc3NvY2lhdGVkIHN0YXRpb25zIC0gd2hlbiBvcGVyYXRpbmcgaW4gQVAgbW9kZSAqLwotCXVuc2lnbmVkIGxvbmcgYXBfaGxpZF9tYXBbQklUU19UT19MT05HUyhBUF9NQVhfU1RBVElPTlMpXTsKLQotCS8qIHJlY29yZWRlZCBrZXlzIGZvciBBUC1tb2RlIC0gc2V0IGhlcmUgYmVmb3JlIEFQIHN0YXJ0dXAgKi8KLQlzdHJ1Y3Qgd2wxMjcxX2FwX2tleSAqcmVjb3JkZWRfYXBfa2V5c1tNQVhfTlVNX0tFWVNdOwotCiAJLyogYmFuZHMgc3VwcG9ydGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2Ygd2wxMnh4ICovCiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCBiYW5kc1tJRUVFODAyMTFfTlVNX0JBTkRTXTsKIAotCS8qIFJYIEJBIGNvbnN0cmFpbnQgdmFsdWUgKi8KLQlib29sIGJhX3N1cHBvcnQ7Ci0JdTggYmFfcnhfYml0bWFwOwotCWJvb2wgYmFfYWxsb3dlZDsKLQogCWludCB0Y3hvX2Nsb2NrOwogCiAJLyoKQEAgLTYxMCwxMCArNDU1LDcgQEAKIAkgKiBBUC1tb2RlIC0gbGlua3MgaW5kZXhlZCBieSBITElELiBUaGUgZ2xvYmFsIGFuZCBicm9hZGNhc3QgbGlua3MKIAkgKiBhcmUgYWx3YXlzIGFjdGl2ZS4KIAkgKi8KLQlzdHJ1Y3Qgd2wxMjcxX2xpbmsgbGlua3NbQVBfTUFYX0xJTktTXTsKLQotCS8qIHRoZSBobGlkIG9mIHRoZSBsaW5rIHdoZXJlIHRoZSBsYXN0IHRyYW5zbWl0dGVkIHNrYiBjYW1lIGZyb20gKi8KLQlpbnQgbGFzdF90eF9obGlkOworCXN0cnVjdCB3bDEyNzFfbGluayBsaW5rc1tXTDEyWFhfTUFYX0xJTktTXTsKIAogCS8qIEFQLW1vZGUgLSBhIGJpdG1hcCBvZiBsaW5rcyBjdXJyZW50bHkgaW4gUFMgbW9kZSBhY2NvcmRpbmcgdG8gRlcgKi8KIAl1MzIgYXBfZndfcHNfbWFwOwpAQCAtNjMyLDIxICs0NzQsMTczIEBACiAKIAkvKiBBUC1tb2RlIC0gbnVtYmVyIG9mIGN1cnJlbnRseSBjb25uZWN0ZWQgc3RhdGlvbnMgKi8KIAlpbnQgYWN0aXZlX3N0YV9jb3VudDsKKworCS8qIGxhc3Qgd2x2aWYgd2UgdHJhbnNtaXR0ZWQgZnJvbSAqLworCXN0cnVjdCB3bDEyeHhfdmlmICpsYXN0X3dsdmlmOwogfTsKIAogc3RydWN0IHdsMTI3MV9zdGF0aW9uIHsKIAl1OCBobGlkOwogfTsKIAorc3RydWN0IHdsMTJ4eF92aWYgeworCXN0cnVjdCB3bDEyNzEgKndsOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXU4IGJzc190eXBlOworCXU4IHAycDsgLyogd2UgYXJlIHVzaW5nIHAycCByb2xlICovCisJdTggcm9sZV9pZDsKKworCS8qIHN0YS9pYnNzIHNwZWNpZmljICovCisJdTggZGV2X3JvbGVfaWQ7CisJdTggZGV2X2hsaWQ7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1OCBobGlkOworCQkJdTggYmFfcnhfYml0bWFwOworCisJCQl1OCBiYXNpY19yYXRlX2lkeDsKKwkJCXU4IGFwX3JhdGVfaWR4OworCQkJdTggcDJwX3JhdGVfaWR4OworCQl9IHN0YTsKKwkJc3RydWN0IHsKKwkJCXU4IGdsb2JhbF9obGlkOworCQkJdTggYmNhc3RfaGxpZDsKKworCQkJLyogSExJRHMgYml0bWFwIG9mIGFzc29jaWF0ZWQgc3RhdGlvbnMgKi8KKwkJCXVuc2lnbmVkIGxvbmcgc3RhX2hsaWRfbWFwW0JJVFNfVE9fTE9OR1MoCisJCQkJCQkJV0wxMlhYX01BWF9MSU5LUyldOworCisJCQkvKiByZWNvcmVkZWQga2V5cyAtIHNldCBoZXJlIGJlZm9yZSBBUCBzdGFydHVwICovCisJCQlzdHJ1Y3Qgd2wxMjcxX2FwX2tleSAqcmVjb3JkZWRfa2V5c1tNQVhfTlVNX0tFWVNdOworCisJCQl1OCBtZ210X3JhdGVfaWR4OworCQkJdTggYmNhc3RfcmF0ZV9pZHg7CisJCQl1OCB1Y2FzdF9yYXRlX2lkeFtDT05GX1RYX01BWF9BQ19DT1VOVF07CisJCX0gYXA7CisJfTsKKworCS8qIHRoZSBobGlkIG9mIHRoZSBsYXN0IHRyYW5zbWl0dGVkIHNrYiAqLworCWludCBsYXN0X3R4X2hsaWQ7CisKKwl1bnNpZ25lZCBsb25nIGxpbmtzX21hcFtCSVRTX1RPX0xPTkdTKFdMMTJYWF9NQVhfTElOS1MpXTsKKworCXU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTiArIDFdOworCXU4IHNzaWRfbGVuOworCisJLyogVGhlIGN1cnJlbnQgYmFuZCAqLworCWVudW0gaWVlZTgwMjExX2JhbmQgYmFuZDsKKwlpbnQgY2hhbm5lbDsKKworCXUzMiBiaXRyYXRlX21hc2tzW0lFRUU4MDIxMV9OVU1fQkFORFNdOworCXUzMiBiYXNpY19yYXRlX3NldDsKKworCS8qCisJICogY3VycmVudGx5IGNvbmZpZ3VyZWQgcmF0ZSBzZXQ6CisJICoJYml0cyAgMC0xNSAtIDgwMi4xMWFiZyByYXRlcworCSAqCWJpdHMgMTYtMjMgLSA4MDIuMTFuICAgTUNTIGluZGV4IG1hc2sKKwkgKiBzdXBwb3J0IG9ubHkgMSBzdHJlYW0sIHRodXMgb25seSA4IGJpdHMgZm9yIHRoZSBNQ1MgcmF0ZXMgKDAtNykuCisJICovCisJdTMyIGJhc2ljX3JhdGU7CisJdTMyIHJhdGVfc2V0OworCisJLyogcHJvYmUtcmVxIHRlbXBsYXRlIGZvciB0aGUgY3VycmVudCBBUCAqLworCXN0cnVjdCBza19idWZmICpwcm9iZXJlcTsKKworCS8qIEJlYWNvbmluZyBpbnRlcnZhbCAobmVlZGVkIGZvciBhZC1ob2MpICovCisJdTMyIGJlYWNvbl9pbnQ7CisKKwkvKiBEZWZhdWx0IGtleSAoZm9yIFdFUCkgKi8KKwl1MzIgZGVmYXVsdF9rZXk7CisKKwkvKiBPdXIgYXNzb2NpYXRpb24gSUQgKi8KKwl1MTYgYWlkOworCisJLyogU2Vzc2lvbiBjb3VudGVyIGZvciB0aGUgY2hpcHNldCAqLworCWludCBzZXNzaW9uX2NvdW50ZXI7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiAqcHNfY29tcGw7CisJc3RydWN0IGRlbGF5ZWRfd29yayBwc3BvbGxfd29yazsKKworCS8qIGNvdW50ZXIgZm9yIHBzLXBvbGwgZGVsaXZlcnkgZmFpbHVyZXMgKi8KKwlpbnQgcHNfcG9sbF9mYWlsdXJlczsKKworCS8qIHJldHJ5IGNvdW50ZXIgZm9yIFBTTSBlbnRyaWVzICovCisJdTggcHNtX2VudHJ5X3JldHJ5OworCisJLyogaW4gZEJtICovCisJaW50IHBvd2VyX2xldmVsOworCisJaW50IHJzc2lfdGhvbGQ7CisJaW50IGxhc3RfcnNzaV9ldmVudDsKKworCS8qIFJYIEJBIGNvbnN0cmFpbnQgdmFsdWUgKi8KKwlib29sIGJhX3N1cHBvcnQ7CisJYm9vbCBiYV9hbGxvd2VkOworCisJLyogUnggU3RyZWFtaW5nICovCisJc3RydWN0IHdvcmtfc3RydWN0IHJ4X3N0cmVhbWluZ19lbmFibGVfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgcnhfc3RyZWFtaW5nX2Rpc2FibGVfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdCByeF9zdHJlYW1pbmdfdGltZXI7CisKKwkvKgorCSAqIFRoaXMgc3RydWN0IG11c3QgYmUgbGFzdCEKKwkgKiBkYXRhIHRoYXQgaGFzIHRvIGJlIHNhdmVkIGFjcm9zc2VkIHJlY29uZmlncyAoZS5nLiByZWNvdmVyeSkKKwkgKiBzaG91bGQgYmUgZGVjbGFyZWQgaW4gdGhpcyBzdHJ1Y3QuCisJICovCisJc3RydWN0IHsKKwkJdTggcGVyc2lzdGVudFswXTsKKwkJLyoKKwkJICogU2VjdXJpdHkgc2VxdWVuY2UgbnVtYmVyCisJCSAqICAgICBiaXRzIDAtMTU6IGxvd2VyIDE2IGJpdHMgcGFydCBvZiBzZXF1ZW5jZSBudW1iZXIKKwkJICogICAgIGJpdHMgMTYtNDc6IGhpZ2hlciAzMiBiaXRzIHBhcnQgb2Ygc2VxdWVuY2UgbnVtYmVyCisJCSAqICAgICBiaXRzIDQ4LTYzOiBub3QgaW4gdXNlCisJCSAqLworCQl1NjQgdHhfc2VjdXJpdHlfc2VxOworCisJCS8qIDggYml0cyBvZiB0aGUgbGFzdCBzZXF1ZW5jZSBudW1iZXIgaW4gdXNlICovCisJCXU4IHR4X3NlY3VyaXR5X2xhc3Rfc2VxX2xzYjsKKwl9OworfTsKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgd2wxMnh4X3ZpZiAqd2wxMnh4X3ZpZl90b19kYXRhKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJcmV0dXJuIChzdHJ1Y3Qgd2wxMnh4X3ZpZiAqKXZpZi0+ZHJ2X3ByaXY7Cit9CisKK3N0YXRpYyBpbmxpbmUKK3N0cnVjdCBpZWVlODAyMTFfdmlmICp3bDEyeHhfd2x2aWZfdG9fdmlmKHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZikKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKCh2b2lkICopd2x2aWYsIHN0cnVjdCBpZWVlODAyMTFfdmlmLCBkcnZfcHJpdik7Cit9CisKKyNkZWZpbmUgd2wxMnh4X2Zvcl9lYWNoX3dsdmlmKHdsLCB3bHZpZikgXAorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHdsdmlmLCAmd2wtPndsdmlmX2xpc3QsIGxpc3QpCisKKyNkZWZpbmUgd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX2NvbnRpbnVlKHdsLCB3bHZpZikgXAorCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHdsdmlmLCAmd2wtPndsdmlmX2xpc3QsIGxpc3QpCisKKyNkZWZpbmUgd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX2Jzc190eXBlKHdsLCB3bHZpZiwgX2Jzc190eXBlKQlcCisJCXdsMTJ4eF9mb3JfZWFjaF93bHZpZih3bCwgd2x2aWYpCQlcCisJCQlpZiAod2x2aWYtPmJzc190eXBlID09IF9ic3NfdHlwZSkKKworI2RlZmluZSB3bDEyeHhfZm9yX2VhY2hfd2x2aWZfc3RhKHdsLCB3bHZpZikJXAorCQl3bDEyeHhfZm9yX2VhY2hfd2x2aWZfYnNzX3R5cGUod2wsIHdsdmlmLCBCU1NfVFlQRV9TVEFfQlNTKQorCisjZGVmaW5lIHdsMTJ4eF9mb3JfZWFjaF93bHZpZl9hcCh3bCwgd2x2aWYpCVwKKwkJd2wxMnh4X2Zvcl9lYWNoX3dsdmlmX2Jzc190eXBlKHdsLCB3bHZpZiwgQlNTX1RZUEVfQVBfQlNTKQorCiBpbnQgd2wxMjcxX3BsdF9zdGFydChzdHJ1Y3Qgd2wxMjcxICp3bCk7CiBpbnQgd2wxMjcxX3BsdF9zdG9wKHN0cnVjdCB3bDEyNzEgKndsKTsKLWludCB3bDEyNzFfcmVjYWxjX3J4X3N0cmVhbWluZyhzdHJ1Y3Qgd2wxMjcxICp3bCk7CitpbnQgd2wxMjcxX3JlY2FsY19yeF9zdHJlYW1pbmcoc3RydWN0IHdsMTI3MSAqd2wsIHN0cnVjdCB3bDEyeHhfdmlmICp3bHZpZik7CiB2b2lkIHdsMTJ4eF9xdWV1ZV9yZWNvdmVyeV93b3JrKHN0cnVjdCB3bDEyNzEgKndsKTsKIHNpemVfdCB3bDEyeHhfY29weV9md2xvZyhzdHJ1Y3Qgd2wxMjcxICp3bCwgdTggKm1lbWJsb2NrLCBzaXplX3QgbWF4bGVuKTsKIAogI2RlZmluZSBKT0lOX1RJTUVPVVQgNTAwMCAvKiA1MDAwIG1pbGxpc2Vjb25kcyB0byBqb2luICovCiAKLSNkZWZpbmUgU0VTU0lPTl9DT1VOVEVSX01BWCA3IC8qIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzZXNzaW9uIGNvdW50ZXIgKi8KKyNkZWZpbmUgU0VTU0lPTl9DT1VOVEVSX01BWCA2IC8qIG1heGltdW0gdmFsdWUgZm9yIHRoZSBzZXNzaW9uIGNvdW50ZXIgKi8KKyNkZWZpbmUgU0VTU0lPTl9DT1VOVEVSX0lOVkFMSUQgNyAvKiB1c2VkIHdpdGggZHVtbXlfcGFja2V0ICovCiAKICNkZWZpbmUgV0wxMjcxX0RFRkFVTFRfUE9XRVJfTEVWRUwgMAogCkBAIC02NjksOCArNjYzLDggQEAKIC8qIEVhY2ggUlgvVFggdHJhbnNhY3Rpb24gcmVxdWlyZXMgYW4gZW5kLW9mLXRyYW5zYWN0aW9uIHRyYW5zZmVyICovCiAjZGVmaW5lIFdMMTJYWF9RVUlSS19FTkRfT0ZfVFJBTlNBQ1RJT04JCUJJVCgwKQogCi0vKiBXTDEyOFggcmVxdWlyZXMgYWdncmVnYXRlZCBwYWNrZXRzIHRvIGJlIGFsaWduZWQgdG8gdGhlIFNESU8gYmxvY2sgc2l6ZSAqLwotI2RlZmluZSBXTDEyWFhfUVVJUktfQkxPQ0tTSVpFX0FMSUdOTUVOVAlCSVQoMikKKy8qIHdsMTI3eCBhbmQgU1BJIGRvbid0IHN1cHBvcnQgU0RJTyBibG9jayBzaXplIGFsaWdubWVudCAqLworI2RlZmluZSBXTDEyWFhfUVVJUktfTk9fQkxPQ0tTSVpFX0FMSUdOTUVOVAlCSVQoMikKIAogLyogT2xkZXIgZmlybXdhcmVzIGRpZCBub3QgaW1wbGVtZW50IHRoZSBGVyBsb2dnZXIgb3ZlciBidXMgZmVhdHVyZSAqLwogI2RlZmluZSBXTDEyWFhfUVVJUktfRldMT0dfTk9UX0lNUExFTUVOVEVECUJJVCg0KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTJ4eF84MDIxMS5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3Mvd2wxMnh4L3dsMTJ4eF84MDIxMS5oCmluZGV4IGY3OTcxZDMuLjhmMGZmYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHhfODAyMTEuaAorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4XzgwMjExLmgKQEAgLTExNiwxMSArMTE2LDYgQEAKIAl1OCB0YVtFVEhfQUxFTl07CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3Qgd2wxMnh4X3Fvc19udWxsX2RhdGFfdGVtcGxhdGUgewotCXN0cnVjdCBpZWVlODAyMTFfaGVhZGVyIGhlYWRlcjsKLQlfX2xlMTYgcW9zX2N0bDsKLX0gX19wYWNrZWQ7Ci0KIHN0cnVjdCB3bDEyeHhfYXJwX3JzcF90ZW1wbGF0ZSB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHJfM2FkZHIgaGRyOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy93bDEyeHgvd2wxMnh4X3BsYXRmb3JtX2RhdGEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHhfcGxhdGZvcm1fZGF0YS5jCmluZGV4IDk3M2IxMTAuLjk5OGU5NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHhfcGxhdGZvcm1fZGF0YS5jCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL3dsMTJ4eC93bDEyeHhfcGxhdGZvcm1fZGF0YS5jCkBAIC0xLDggKzEsMjkgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB3bDEyeHgKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAtMjAxMSBUZXhhcyBJbnN0cnVtZW50cywgSW5jLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiB2ZXJzaW9uIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSBVU0EKKyAqCisgKi8KKwogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L3dsMTJ4eC5oPgogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhICpwbGF0Zm9ybV9kYXRhOworc3RhdGljIHN0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSAqcGxhdGZvcm1fZGF0YTsKIAogaW50IF9faW5pdCB3bDEyeHhfc2V0X3BsYXRmb3JtX2RhdGEoY29uc3Qgc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhICpkYXRhKQogewpAQCAtMTgsNyArMzksNyBAQAogCXJldHVybiAwOwogfQogCi1jb25zdCBzdHJ1Y3Qgd2wxMnh4X3BsYXRmb3JtX2RhdGEgKndsMTJ4eF9nZXRfcGxhdGZvcm1fZGF0YSh2b2lkKQorc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhICp3bDEyeHhfZ2V0X3BsYXRmb3JtX2RhdGEodm9pZCkKIHsKIAlpZiAoIXBsYXRmb3JtX2RhdGEpCiAJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svaW50ZXJmYWNlLmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9pbnRlcmZhY2UuYwppbmRleCAxODI1NjI5Li5iN2Q0MWY4IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9pbnRlcmZhY2UuYwpAQCAtMTY1LDcgKzE2NSw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgeGVudmlmX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgeGVudmlmX2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCB4ZW52aWYgKnZpZiA9IG5ldGRldl9wcml2KGRldik7CiAKQEAgLTIyMiw3ICsyMjMsNyBAQAogCX0KIH0KIAotc3RhdGljIHN0cnVjdCBldGh0b29sX29wcyB4ZW52aWZfZXRodG9vbF9vcHMgPSB7CitzdGF0aWMgY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzIHhlbnZpZl9ldGh0b29sX29wcyA9IHsKIAkuZ2V0X2xpbmsJPSBldGh0b29sX29wX2dldF9saW5rLAogCiAJLmdldF9zc2V0X2NvdW50ID0geGVudmlmX2dldF9zc2V0X2NvdW50LApAQCAtMjMwLDcgKzIzMSw3IEBACiAJLmdldF9zdHJpbmdzID0geGVudmlmX2dldF9zdHJpbmdzLAogfTsKIAotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlX29wcyB4ZW52aWZfbmV0ZGV2X29wcyA9IHsKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgeGVudmlmX25ldGRldl9vcHMgPSB7CiAJLm5kb19zdGFydF94bWl0CT0geGVudmlmX3N0YXJ0X3htaXQsCiAJLm5kb19nZXRfc3RhdHMJPSB4ZW52aWZfZ2V0X3N0YXRzLAogCS5uZG9fb3Blbgk9IHhlbnZpZl9vcGVuLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jIGIvZHJpdmVycy9uZXQveGVuLW5ldGJhY2svbmV0YmFjay5jCmluZGV4IDBjYjU5NGMuLjYzOWNmOGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbmV0L3hlbi1uZXRiYWNrL25ldGJhY2suYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0YmFjay9uZXRiYWNrLmMKQEAgLTM5NSw3ICszOTUsNyBAQAogCXN0cnVjdCBnbnR0YWJfY29weSAqY29weV9nb3A7CiAJc3RydWN0IG5ldGJrX3J4X21ldGEgKm1ldGE7CiAJLyoKLQkgKiBUaGVzZSB2YXJpYWJsZXMgYSB1c2VkIGlmZiBnZXRfcGFnZV9leHQgcmV0dXJucyB0cnVlLAorCSAqIFRoZXNlIHZhcmlhYmxlcyBhcmUgdXNlZCBpZmYgZ2V0X3BhZ2VfZXh0IHJldHVybnMgdHJ1ZSwKIAkgKiBpbiB3aGljaCBjYXNlIHRoZXkgYXJlIGd1YXJhbnRlZWQgdG8gYmUgaW5pdGlhbGl6ZWQuCiAJICovCiAJdW5zaWduZWQgaW50IHVuaW5pdGlhbGl6ZWRfdmFyKGdyb3VwKSwgdW5pbml0aWFsaXplZF92YXIoaWR4KTsKQEAgLTk0MCw4ICs5NDAsNiBAQAogCQlpZiAoIXBhZ2UpCiAJCQlyZXR1cm4gTlVMTDsKIAotCQluZXRiay0+bW1hcF9wYWdlc1twZW5kaW5nX2lkeF0gPSBwYWdlOwotCiAJCWdvcC0+c291cmNlLnUucmVmID0gdHhwLT5ncmVmOwogCQlnb3AtPnNvdXJjZS5kb21pZCA9IHZpZi0+ZG9taWQ7CiAJCWdvcC0+c291cmNlLm9mZnNldCA9IHR4cC0+b2Zmc2V0OwpAQCAtMTAyMSw3ICsxMDE5LDcgQEAKIAkJcGVuZGluZ19pZHggPSAqKCh1MTYgKilza2ItPmRhdGEpOwogCQl4ZW5fbmV0YmtfaWR4X3JlbGVhc2UobmV0YmssIHBlbmRpbmdfaWR4KTsKIAkJZm9yIChqID0gc3RhcnQ7IGogPCBpOyBqKyspIHsKLQkJCXBlbmRpbmdfaWR4ID0gZnJhZ19nZXRfcGVuZGluZ19pZHgoJnNoaW5mby0+ZnJhZ3NbaV0pOworCQkJcGVuZGluZ19pZHggPSBmcmFnX2dldF9wZW5kaW5nX2lkeCgmc2hpbmZvLT5mcmFnc1tqXSk7CiAJCQl4ZW5fbmV0YmtfaWR4X3JlbGVhc2UobmV0YmssIHBlbmRpbmdfaWR4KTsKIAkJfQogCkBAIC0xMzM2LDggKzEzMzQsNiBAQAogCQkJY29udGludWU7CiAJCX0KIAotCQluZXRiay0+bW1hcF9wYWdlc1twZW5kaW5nX2lkeF0gPSBwYWdlOwotCiAJCWdvcC0+c291cmNlLnUucmVmID0gdHhyZXEuZ3JlZjsKIAkJZ29wLT5zb3VyY2UuZG9taWQgPSB2aWYtPmRvbWlkOwogCQlnb3AtPnNvdXJjZS5vZmZzZXQgPSB0eHJlcS5vZmZzZXQ7CkBAIC0xNjY4LDcgKzE2NjQsNyBAQAogCQkJCQkgICAgICJuZXRiYWNrLyV1IiwgZ3JvdXApOwogCiAJCWlmIChJU19FUlIobmV0YmstPnRhc2spKSB7Ci0JCQlwcmludGsoS0VSTl9BTEVSVCAia3RocmVhZF9ydW4oKSBmYWlscyBhdCBuZXRiYWNrXG4iKTsKKwkJCXByaW50ayhLRVJOX0FMRVJUICJrdGhyZWFkX2NyZWF0ZSgpIGZhaWxzIGF0IG5ldGJhY2tcbiIpOwogCQkJZGVsX3RpbWVyKCZuZXRiay0+bmV0X3RpbWVyKTsKIAkJCXJjID0gUFRSX0VSUihuZXRiay0+dGFzayk7CiAJCQlnb3RvIGZhaWxlZF9pbml0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQveGVuLW5ldGZyb250LmMgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwppbmRleCAyMjZmYWFiLi4wYTU5YzU3IDEwMDY0NAotLS0gYS9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYworKysgYi9kcml2ZXJzL25ldC94ZW4tbmV0ZnJvbnQuYwpAQCAtMjAxLDcgKzIwMSw3IEBACiAjZGVmaW5lIHhlbm5ldF9zeXNmc19kZWxpZihkZXYpIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi1zdGF0aWMgaW50IHhlbm5ldF9jYW5fc2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBib29sIHhlbm5ldF9jYW5fc2coc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfU0c7CiB9CkBAIC0xMTkwLDcgKzExOTAsOCBAQAogCWdudHRhYl9mcmVlX2dyYW50X3JlZmVyZW5jZXMobnAtPmdyZWZfcnhfaGVhZCk7CiB9CiAKLXN0YXRpYyB1MzIgeGVubmV0X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgbmV0ZGV2X2ZlYXR1cmVzX3QgeGVubmV0X2ZpeF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBuZXRmcm9udF9pbmZvICpucCA9IG5ldGRldl9wcml2KGRldik7CiAJaW50IHZhbDsKQEAgLTEyMTYsNyArMTIxNyw4IEBACiAJcmV0dXJuIGZlYXR1cmVzOwogfQogCi1zdGF0aWMgaW50IHhlbm5ldF9zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIGludCB4ZW5uZXRfc2V0X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJaWYgKCEoZmVhdHVyZXMgJiBORVRJRl9GX1NHKSAmJiBkZXYtPm10dSA+IEVUSF9EQVRBX0xFTikgewogCQluZXRkZXZfaW5mbyhkZXYsICJSZWR1Y2luZyBNVFUgYmVjYXVzZSBubyBTRyBvZmZsb2FkIik7CkBAIC0xNzA3LDcgKzE3MDksNiBAQAogCWNhc2UgWGVuYnVzU3RhdGVJbml0aWFsaXNlZDoKIAljYXNlIFhlbmJ1c1N0YXRlUmVjb25maWd1cmluZzoKIAljYXNlIFhlbmJ1c1N0YXRlUmVjb25maWd1cmVkOgotCWNhc2UgWGVuYnVzU3RhdGVDb25uZWN0ZWQ6CiAJY2FzZSBYZW5idXNTdGF0ZVVua25vd246CiAJY2FzZSBYZW5idXNTdGF0ZUNsb3NlZDoKIAkJYnJlYWs7CkBAIC0xNzE4LDYgKzE3MTksOSBAQAogCQlpZiAoeGVubmV0X2Nvbm5lY3QobmV0ZGV2KSAhPSAwKQogCQkJYnJlYWs7CiAJCXhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBYZW5idXNTdGF0ZUNvbm5lY3RlZCk7CisJCWJyZWFrOworCisJY2FzZSBYZW5idXNTdGF0ZUNvbm5lY3RlZDoKIAkJbmV0aWZfbm90aWZ5X3BlZXJzKG5ldGRldik7CiAJCWJyZWFrOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL25mYy9wbjUzMy5jIGIvZHJpdmVycy9uZmMvcG41MzMuYwppbmRleCA3YmNiMWZlLi5iOGI2YzJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL25mYy9wbjUzMy5jCisrKyBiL2RyaXZlcnMvbmZjL3BuNTMzLmMKQEAgLTcyLDYgKzcyLDcgQEAKICNkZWZpbmUgUE41MzNfQ01EX0lOX0xJU1RfUEFTU0lWRV9UQVJHRVQgMHg0QQogI2RlZmluZSBQTjUzM19DTURfSU5fQVRSIDB4NTAKICNkZWZpbmUgUE41MzNfQ01EX0lOX1JFTEVBU0UgMHg1MgorI2RlZmluZSBQTjUzM19DTURfSU5fSlVNUF9GT1JfREVQIDB4NTYKIAogI2RlZmluZSBQTjUzM19DTURfUkVTUE9OU0UoY21kKSAoY21kICsgMSkKIApAQCAtMjMxLDYgKzIzMiwyNiBAQAogCXU4IGd0W107CiB9IF9fcGFja2VkOwogCisvKiBQTjUzM19DTURfSU5fSlVNUF9GT1JfREVQICovCitzdHJ1Y3QgcG41MzNfY21kX2p1bXBfZGVwIHsKKwl1OCBhY3RpdmU7CisJdTggYmF1ZDsKKwl1OCBuZXh0OworCXU4IGd0W107Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgcG41MzNfY21kX2p1bXBfZGVwX3Jlc3BvbnNlIHsKKwl1OCBzdGF0dXM7CisJdTggdGc7CisJdTggbmZjaWQzdFsxMF07CisJdTggZGlkdDsKKwl1OCBic3Q7CisJdTggYnJ0OworCXU4IHRvOworCXU4IHBwdDsKKwkvKiBvcHRpb25hbCAqLworCXU4IGd0W107Cit9IF9fcGFja2VkOwogCiBzdHJ1Y3QgcG41MzMgewogCXN0cnVjdCB1c2JfZGV2aWNlICp1ZGV2OwpAQCAtMTEyMSw2ICsxMTQyLDcgQEAKIHsKIAlzdHJ1Y3QgcG41MzNfY21kX2FjdGl2YXRlX3BhcmFtIHBhcmFtOwogCXN0cnVjdCBwbjUzM19jbWRfYWN0aXZhdGVfcmVzcG9uc2UgKnJlc3A7CisJdTE2IGd0X2xlbjsKIAlpbnQgcmM7CiAKIAluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIiVzIiwgX19mdW5jX18pOwpAQCAtMTE0Niw3ICsxMTY4LDExIEBACiAJaWYgKHJjICE9IFBONTMzX0NNRF9SRVRfU1VDQ0VTUykKIAkJcmV0dXJuIC1FSU87CiAKLQlyZXR1cm4gMDsKKwkvKiBBVFJfUkVTIGdlbmVyYWwgYnl0ZXMgYXJlIGxvY2F0ZWQgYXQgb2Zmc2V0IDE2ICovCisJZ3RfbGVuID0gUE41MzNfRlJBTUVfQ01EX1BBUkFNU19MRU4oZGV2LT5pbl9mcmFtZSkgLSAxNjsKKwlyYyA9IG5mY19zZXRfcmVtb3RlX2dlbmVyYWxfYnl0ZXMoZGV2LT5uZmNfZGV2LCByZXNwLT5ndCwgZ3RfbGVuKTsKKworCXJldHVybiByYzsKIH0KIAogc3RhdGljIGludCBwbjUzM19hY3RpdmF0ZV90YXJnZXQoc3RydWN0IG5mY19kZXYgKm5mY19kZXYsIHUzMiB0YXJnZXRfaWR4LApAQCAtMTIzOSw2ICsxMjY1LDE0MiBAQAogCXJldHVybjsKIH0KIAorCitzdGF0aWMgaW50IHBuNTMzX2luX2RlcF9saW5rX3VwX2NvbXBsZXRlKHN0cnVjdCBwbjUzMyAqZGV2LCB2b2lkICphcmcsCisJCQkJCQl1OCAqcGFyYW1zLCBpbnQgcGFyYW1zX2xlbikKK3sKKwlzdHJ1Y3QgcG41MzNfY21kX2p1bXBfZGVwICpjbWQ7CisJc3RydWN0IHBuNTMzX2NtZF9qdW1wX2RlcF9yZXNwb25zZSAqcmVzcDsKKwlzdHJ1Y3QgbmZjX3RhcmdldCBuZmNfdGFyZ2V0OworCXU4IHRhcmdldF9ndF9sZW47CisJaW50IHJjOworCisJaWYgKHBhcmFtc19sZW4gPT0gLUVOT0VOVCkgeworCQluZmNfZGV2X2RiZygmZGV2LT5pbnRlcmZhY2UtPmRldiwgIiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocGFyYW1zX2xlbiA8IDApIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJIkVycm9yICVkIHdoZW4gYnJpbmdpbmcgREVQIGxpbmsgdXAiLAorCQkJCQkJCQlwYXJhbXNfbGVuKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRldi0+dGd0X2F2YWlsYWJsZV9wcm90cyAmJgorCSAgICAhKGRldi0+dGd0X2F2YWlsYWJsZV9wcm90cyAmICgxIDw8IE5GQ19QUk9UT19ORkNfREVQKSkpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsCisJCQkiVGhlIHRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IERFUCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXNwID0gKHN0cnVjdCBwbjUzM19jbWRfanVtcF9kZXBfcmVzcG9uc2UgKikgcGFyYW1zOworCWNtZCA9IChzdHJ1Y3QgcG41MzNfY21kX2p1bXBfZGVwICopIGFyZzsKKwlyYyA9IHJlc3AtPnN0YXR1cyAmIFBONTMzX0NNRF9SRVRfTUFTSzsKKwlpZiAocmMgIT0gUE41MzNfQ01EX1JFVF9TVUNDRVNTKSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LAorCQkJCSJCcmluZ2luZyBERVAgbGluayB1cCBmYWlsZWQgJWQiLCByYyk7CisJCXJldHVybiAwOworCX0KKworCWlmICghZGV2LT50Z3RfYXZhaWxhYmxlX3Byb3RzKSB7CisJCW5mY19kZXZfZGJnKCZkZXYtPmludGVyZmFjZS0+ZGV2LCAiQ3JlYXRpbmcgbmV3IHRhcmdldCIpOworCisJCW5mY190YXJnZXQuc3VwcG9ydGVkX3Byb3RvY29scyA9IE5GQ19QUk9UT19ORkNfREVQX01BU0s7CisJCXJjID0gbmZjX3RhcmdldHNfZm91bmQoZGV2LT5uZmNfZGV2LCAmbmZjX3RhcmdldCwgMSk7CisJCWlmIChyYykKKwkJCXJldHVybiAwOworCisJCWRldi0+dGd0X2F2YWlsYWJsZV9wcm90cyA9IDA7CisJfQorCisJZGV2LT50Z3RfYWN0aXZlX3Byb3QgPSBORkNfUFJPVE9fTkZDX0RFUDsKKworCS8qIEFUUl9SRVMgZ2VuZXJhbCBieXRlcyBhcmUgbG9jYXRlZCBhdCBvZmZzZXQgMTcgKi8KKwl0YXJnZXRfZ3RfbGVuID0gUE41MzNfRlJBTUVfQ01EX1BBUkFNU19MRU4oZGV2LT5pbl9mcmFtZSkgLSAxNzsKKwlyYyA9IG5mY19zZXRfcmVtb3RlX2dlbmVyYWxfYnl0ZXMoZGV2LT5uZmNfZGV2LAorCQkJCQkJcmVzcC0+Z3QsIHRhcmdldF9ndF9sZW4pOworCWlmIChyYyA9PSAwKQorCQlyYyA9IG5mY19kZXBfbGlua19pc191cChkZXYtPm5mY19kZXYsCisJCQkJCQlkZXYtPm5mY19kZXYtPnRhcmdldHNbMF0uaWR4LAorCQkJCQkJIWNtZC0+YWN0aXZlLCBORkNfUkZfSU5JVElBVE9SKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBuNTMzX2RlcF9saW5rX3VwKHN0cnVjdCBuZmNfZGV2ICpuZmNfZGV2LCBpbnQgdGFyZ2V0X2lkeCwKKwkJCQkJCXU4IGNvbW1fbW9kZSwgdTggcmZfbW9kZSkKK3sKKwlzdHJ1Y3QgcG41MzMgKmRldiA9IG5mY19nZXRfZHJ2ZGF0YShuZmNfZGV2KTsKKwlzdHJ1Y3QgcG41MzNfY21kX2p1bXBfZGVwICpjbWQ7CisJdTggY21kX2xlbiwgbG9jYWxfZ3RfbGVuLCAqbG9jYWxfZ3Q7CisJaW50IHJjOworCisJbmZjX2Rldl9kYmcoJmRldi0+aW50ZXJmYWNlLT5kZXYsICIlcyIsIF9fZnVuY19fKTsKKworCWlmIChyZl9tb2RlID09IE5GQ19SRl9UQVJHRVQpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsICJUYXJnZXQgbW9kZSBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKworCWlmIChkZXYtPnBvbGxfbW9kX2NvdW50KSB7CisJCW5mY19kZXZfZXJyKCZkZXYtPmludGVyZmFjZS0+ZGV2LAorCQkJCSJDYW5ub3QgYnJpbmcgdGhlIERFUCBsaW5rIHVwIHdoaWxlIHBvbGxpbmciKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoZGV2LT50Z3RfYWN0aXZlX3Byb3QpIHsKKwkJbmZjX2Rldl9lcnIoJmRldi0+aW50ZXJmYWNlLT5kZXYsCisJCQkJIlRoZXJlIGlzIGFscmVhZHkgYW4gYWN0aXZlIHRhcmdldCIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWxvY2FsX2d0ID0gbmZjX2dldF9sb2NhbF9nZW5lcmFsX2J5dGVzKGRldi0+bmZjX2RldiwgJmxvY2FsX2d0X2xlbik7CisJaWYgKGxvY2FsX2d0X2xlbiA+IE5GQ19NQVhfR1RfTEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNtZF9sZW4gPSBzaXplb2Yoc3RydWN0IHBuNTMzX2NtZF9qdW1wX2RlcCkgKyBsb2NhbF9ndF9sZW47CisJY21kID0ga3phbGxvYyhjbWRfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoY21kID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcG41MzNfdHhfZnJhbWVfaW5pdChkZXYtPm91dF9mcmFtZSwgUE41MzNfQ01EX0lOX0pVTVBfRk9SX0RFUCk7CisKKwljbWQtPmFjdGl2ZSA9ICFjb21tX21vZGU7CisJY21kLT5iYXVkID0gMDsKKwlpZiAobG9jYWxfZ3QgIT0gTlVMTCkgeworCQljbWQtPm5leHQgPSA0OyAvKiBXZSBoYXZlIHNvbWUgR2kgKi8KKwkJbWVtY3B5KGNtZC0+Z3QsIGxvY2FsX2d0LCBsb2NhbF9ndF9sZW4pOworCX0gZWxzZSB7CisJCWNtZC0+bmV4dCA9IDA7CisJfQorCisJbWVtY3B5KFBONTMzX0ZSQU1FX0NNRF9QQVJBTVNfUFRSKGRldi0+b3V0X2ZyYW1lKSwgY21kLCBjbWRfbGVuKTsKKwlkZXYtPm91dF9mcmFtZS0+ZGF0YWxlbiArPSBjbWRfbGVuOworCisJcG41MzNfdHhfZnJhbWVfZmluaXNoKGRldi0+b3V0X2ZyYW1lKTsKKworCXJjID0gcG41MzNfc2VuZF9jbWRfZnJhbWVfYXN5bmMoZGV2LCBkZXYtPm91dF9mcmFtZSwgZGV2LT5pbl9mcmFtZSwKKwkJCQlkZXYtPmluX21heGxlbiwJcG41MzNfaW5fZGVwX2xpbmtfdXBfY29tcGxldGUsCisJCQkJY21kLCBHRlBfS0VSTkVMKTsKKwlpZiAocmMpCisJCWdvdG8gb3V0OworCisKK291dDoKKwlrZnJlZShjbWQpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBuNTMzX2RlcF9saW5rX2Rvd24oc3RydWN0IG5mY19kZXYgKm5mY19kZXYpCit7CisJcG41MzNfZGVhY3RpdmF0ZV90YXJnZXQobmZjX2RldiwgMCk7CisKKwlyZXR1cm4gMDsKK30KKwogI2RlZmluZSBQTjUzM19DTURfREFUQUVYQ0hfSEVBRF9MRU4gKHNpemVvZihzdHJ1Y3QgcG41MzNfZnJhbWUpICsgMykKICNkZWZpbmUgUE41MzNfQ01EX0RBVEFFWENIX0RBVEFfTUFYTEVOIDI2MgogCkBAIC0xMzM5LDcgKzE1MDEsNyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcG41MzNfZGF0YV9leGNoYW5nZShzdHJ1Y3QgbmZjX2RldiAqbmZjX2RldiwgdTMyIHRhcmdldF9pZHgsCitzdGF0aWMgaW50IHBuNTMzX2RhdGFfZXhjaGFuZ2Uoc3RydWN0IG5mY19kZXYgKm5mY19kZXYsIHUzMiB0YXJnZXRfaWR4LAogCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJCWRhdGFfZXhjaGFuZ2VfY2JfdCBjYiwKIAkJCQkJCXZvaWQgKmNiX2NvbnRleHQpCkBAIC0xMzY4LDcgKzE1MzAsNyBAQAogCQkJUE41MzNfQ01EX0RBVEFFWENIX0RBVEFfTUFYTEVOICsKIAkJCVBONTMzX0ZSQU1FX1RBSUxfU0laRTsKIAotCXNrYl9yZXNwID0gbmZjX2FsbG9jX3NrYihza2JfcmVzcF9sZW4sIEdGUF9LRVJORUwpOworCXNrYl9yZXNwID0gbmZjX2FsbG9jX3JlY3Zfc2tiKHNrYl9yZXNwX2xlbiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2JfcmVzcCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWdvdG8gZXJyb3I7CkBAIC0xNDM0LDYgKzE1OTYsOCBAQAogc3RydWN0IG5mY19vcHMgcG41MzNfbmZjX29wcyA9IHsKIAkuZGV2X3VwID0gTlVMTCwKIAkuZGV2X2Rvd24gPSBOVUxMLAorCS5kZXBfbGlua191cCA9IHBuNTMzX2RlcF9saW5rX3VwLAorCS5kZXBfbGlua19kb3duID0gcG41MzNfZGVwX2xpbmtfZG93biwKIAkuc3RhcnRfcG9sbCA9IHBuNTMzX3N0YXJ0X3BvbGwsCiAJLnN0b3BfcG9sbCA9IHBuNTMzX3N0b3BfcG9sbCwKIAkuYWN0aXZhdGVfdGFyZ2V0ID0gcG41MzNfYWN0aXZhdGVfdGFyZ2V0LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9vZi9pcnEuYyBiL2RyaXZlcnMvb2YvaXJxLmMKaW5kZXggMTljMDExNS4uMGYwY2ZhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9pcnEuYworKysgYi9kcml2ZXJzL29mL2lycS5jCkBAIC0yNiwxMSArMjYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KIAotLyogRm9yIGFyY2hzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBOT19JUlEgKHN1Y2ggYXMgeDg2KSwgcHJvdmlkZSBhIGR1bW15IHZhbHVlICovCi0jaWZuZGVmIE5PX0lSUQotI2RlZmluZSBOT19JUlEgMAotI2VuZGlmCi0KIC8qKgogICogaXJxX29mX3BhcnNlX2FuZF9tYXAgLSBQYXJzZSBhbmQgbWFwIGFuIGludGVycnVwdCBpbnRvIGxpbnV4IHZpcnEgc3BhY2UKICAqIEBkZXZpY2U6IERldmljZSBub2RlIG9mIHRoZSBkZXZpY2Ugd2hvc2UgaW50ZXJydXB0IGlzIHRvIGJlIG1hcHBlZApAQCAtNDQsNyArMzksNyBAQAogCXN0cnVjdCBvZl9pcnEgb2lycTsKIAogCWlmIChvZl9pcnFfbWFwX29uZShkZXYsIGluZGV4LCAmb2lycSkpCi0JCXJldHVybiBOT19JUlE7CisJCXJldHVybiAwOwogCiAJcmV0dXJuIGlycV9jcmVhdGVfb2ZfbWFwcGluZyhvaXJxLmNvbnRyb2xsZXIsIG9pcnEuc3BlY2lmaWVyLAogCQkJCSAgICAgb2lycS5zaXplKTsKQEAgLTM0NSw3ICszNDAsNyBAQAogCiAJLyogT25seSBkZXJlZmVyZW5jZSB0aGUgcmVzb3VyY2UgaWYgYm90aCB0aGUKIAkgKiByZXNvdXJjZSBhbmQgdGhlIGlycSBhcmUgdmFsaWQuICovCi0JaWYgKHIgJiYgaXJxICE9IE5PX0lSUSkgeworCWlmIChyICYmIGlycSkgewogCQlyLT5zdGFydCA9IHItPmVuZCA9IGlycTsKIAkJci0+ZmxhZ3MgPSBJT1JFU09VUkNFX0lSUTsKIAkJci0+bmFtZSA9IGRldi0+ZnVsbF9uYW1lOwpAQCAtMzYzLDcgKzM1OCw3IEBACiB7CiAJaW50IG5yID0gMDsKIAotCXdoaWxlIChvZl9pcnFfdG9fcmVzb3VyY2UoZGV2LCBuciwgTlVMTCkgIT0gTk9fSVJRKQorCXdoaWxlIChvZl9pcnFfdG9fcmVzb3VyY2UoZGV2LCBuciwgTlVMTCkpCiAJCW5yKys7CiAKIAlyZXR1cm4gbnI7CkBAIC0zODMsNyArMzc4LDcgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDA7IGkgPCBucl9pcnFzOyBpKyssIHJlcysrKQotCQlpZiAob2ZfaXJxX3RvX3Jlc291cmNlKGRldiwgaSwgcmVzKSA9PSBOT19JUlEpCisJCWlmICghb2ZfaXJxX3RvX3Jlc291cmNlKGRldiwgaSwgcmVzKSkKIAkJCWJyZWFrOwogCiAJcmV0dXJuIGk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29mL3BsYXRmb3JtLmMgYi9kcml2ZXJzL29mL3BsYXRmb3JtLmMKaW5kZXggY2JkNWQ3MC4uNjNiM2VjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9vZi9wbGF0Zm9ybS5jCisrKyBiL2RyaXZlcnMvb2YvcGxhdGZvcm0uYwpAQCAtMzE0LDcgKzMxNCw3IEBACiAJaWYgKCFsb29rdXApCiAJCXJldHVybiBOVUxMOwogCi0JZm9yKDsgbG9va3VwLT5uYW1lICE9IE5VTEw7IGxvb2t1cCsrKSB7CisJZm9yKDsgbG9va3VwLT5jb21wYXRpYmxlICE9IE5VTEw7IGxvb2t1cCsrKSB7CiAJCWlmICghb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsIGxvb2t1cC0+Y29tcGF0aWJsZSkpCiAJCQljb250aW51ZTsKIAkJaWYgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIDAsICZyZXMpKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMgYi9kcml2ZXJzL29wcm9maWxlL25taV90aW1lcl9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmYxYzkzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9ubWlfdGltZXJfaW50LmMKQEAgLTAsMCArMSwxNzMgQEAKKy8qKgorICogQGZpbGUgbm1pX3RpbWVyX2ludC5jCisgKgorICogQHJlbWFyayBDb3B5cmlnaHQgMjAxMSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgorICogQGF1dGhvciBSb2JlcnQgUmljaHRlciA8cm9iZXJ0LnJpY2h0ZXJAYW1kLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisKKyNpZmRlZiBDT05GSUdfT1BST0ZJTEVfTk1JX1RJTUVSCisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyZl9ldmVudCAqLCBubWlfdGltZXJfZXZlbnRzKTsKK3N0YXRpYyBpbnQgY3RyX3J1bm5pbmc7CisKK3N0YXRpYyBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyIG5taV90aW1lcl9hdHRyID0geworCS50eXBlICAgICAgICAgICA9IFBFUkZfVFlQRV9IQVJEV0FSRSwKKwkuY29uZmlnICAgICAgICAgPSBQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVMsCisJLnNpemUgICAgICAgICAgID0gc2l6ZW9mKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIpLAorCS5waW5uZWQgICAgICAgICA9IDEsCisJLmRpc2FibGVkICAgICAgID0gMSwKK307CisKK3N0YXRpYyB2b2lkIG5taV90aW1lcl9jYWxsYmFjayhzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgICAgICAgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEsCisJCQkgICAgICAgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJZXZlbnQtPmh3LmludGVycnVwdHMgPSAwOyAgICAgICAvKiBkb24ndCB0aHJvdHRsZSBpbnRlcnJ1cHRzICovCisJb3Byb2ZpbGVfYWRkX3NhbXBsZShyZWdzLCAwKTsKK30KKworc3RhdGljIGludCBubWlfdGltZXJfc3RhcnRfY3B1KGludCBjcHUpCit7CisJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gcGVyX2NwdShubWlfdGltZXJfZXZlbnRzLCBjcHUpOworCisJaWYgKCFldmVudCkgeworCQlldmVudCA9IHBlcmZfZXZlbnRfY3JlYXRlX2tlcm5lbF9jb3VudGVyKCZubWlfdGltZXJfYXR0ciwgY3B1LCBOVUxMLAorCQkJCQkJCSBubWlfdGltZXJfY2FsbGJhY2ssIE5VTEwpOworCQlpZiAoSVNfRVJSKGV2ZW50KSkKKwkJCXJldHVybiBQVFJfRVJSKGV2ZW50KTsKKwkJcGVyX2NwdShubWlfdGltZXJfZXZlbnRzLCBjcHUpID0gZXZlbnQ7CisJfQorCisJaWYgKGV2ZW50ICYmIGN0cl9ydW5uaW5nKQorCQlwZXJmX2V2ZW50X2VuYWJsZShldmVudCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbm1pX3RpbWVyX3N0b3BfY3B1KGludCBjcHUpCit7CisJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50ID0gcGVyX2NwdShubWlfdGltZXJfZXZlbnRzLCBjcHUpOworCisJaWYgKGV2ZW50ICYmIGN0cl9ydW5uaW5nKQorCQlwZXJmX2V2ZW50X2Rpc2FibGUoZXZlbnQpOworfQorCitzdGF0aWMgaW50IG5taV90aW1lcl9jcHVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpiLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwKKwkJCQkgIHZvaWQgKmRhdGEpCit7CisJaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJc3dpdGNoIChhY3Rpb24pIHsKKwljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwljYXNlIENQVV9PTkxJTkU6CisJCW5taV90aW1lcl9zdGFydF9jcHUoY3B1KTsKKwkJYnJlYWs7CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgorCQlubWlfdGltZXJfc3RvcF9jcHUoY3B1KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBubWlfdGltZXJfY3B1X25iID0geworCS5ub3RpZmllcl9jYWxsID0gbm1pX3RpbWVyX2NwdV9ub3RpZmllcgorfTsKKworc3RhdGljIGludCBubWlfdGltZXJfc3RhcnQodm9pZCkKK3sKKwlpbnQgY3B1OworCisJZ2V0X29ubGluZV9jcHVzKCk7CisJY3RyX3J1bm5pbmcgPSAxOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlubWlfdGltZXJfc3RhcnRfY3B1KGNwdSk7CisJcHV0X29ubGluZV9jcHVzKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbm1pX3RpbWVyX3N0b3Aodm9pZCkKK3sKKwlpbnQgY3B1OworCisJZ2V0X29ubGluZV9jcHVzKCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCW5taV90aW1lcl9zdG9wX2NwdShjcHUpOworCWN0cl9ydW5uaW5nID0gMDsKKwlwdXRfb25saW5lX2NwdXMoKTsKK30KKworc3RhdGljIHZvaWQgbm1pX3RpbWVyX3NodXRkb3duKHZvaWQpCit7CisJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50OworCWludCBjcHU7CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKwl1bnJlZ2lzdGVyX2NwdV9ub3RpZmllcigmbm1pX3RpbWVyX2NwdV9uYik7CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlldmVudCA9IHBlcl9jcHUobm1pX3RpbWVyX2V2ZW50cywgY3B1KTsKKwkJaWYgKCFldmVudCkKKwkJCWNvbnRpbnVlOworCQlwZXJmX2V2ZW50X2Rpc2FibGUoZXZlbnQpOworCQlwZXJfY3B1KG5taV90aW1lcl9ldmVudHMsIGNwdSkgPSBOVUxMOworCQlwZXJmX2V2ZW50X3JlbGVhc2Vfa2VybmVsKGV2ZW50KTsKKwl9CisKKwlwdXRfb25saW5lX2NwdXMoKTsKK30KKworc3RhdGljIGludCBubWlfdGltZXJfc2V0dXAodm9pZCkKK3sKKwlpbnQgY3B1LCBlcnI7CisJdTY0IHBlcmlvZDsKKworCS8qIGNsb2NrIGN5Y2xlcyBwZXIgdGljazogKi8KKwlwZXJpb2QgPSAodTY0KWNwdV9raHogKiAxMDAwOworCWRvX2RpdihwZXJpb2QsIEhaKTsKKwlubWlfdGltZXJfYXR0ci5zYW1wbGVfcGVyaW9kID0gcGVyaW9kOworCisJZ2V0X29ubGluZV9jcHVzKCk7CisJZXJyID0gcmVnaXN0ZXJfY3B1X25vdGlmaWVyKCZubWlfdGltZXJfY3B1X25iKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwkvKiBjYW4ndCBhdHRhY2ggZXZlbnRzIHRvIG9mZmxpbmUgY3B1czogKi8KKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQllcnIgPSBubWlfdGltZXJfc3RhcnRfY3B1KGNwdSk7CisJCWlmIChlcnIpCisJCQlicmVhazsKKwl9CisJaWYgKGVycikKKwkJbm1pX3RpbWVyX3NodXRkb3duKCk7CitvdXQ6CisJcHV0X29ubGluZV9jcHVzKCk7CisJcmV0dXJuIGVycjsKK30KKworaW50IF9faW5pdCBvcF9ubWlfdGltZXJfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQoreworCWludCBlcnIgPSAwOworCisJZXJyID0gbm1pX3RpbWVyX3NldHVwKCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlubWlfdGltZXJfc2h1dGRvd24oKTsJCS8qIG9ubHkgY2hlY2ssIGRvbid0IGFsbG9jICovCisKKwlvcHMtPmNyZWF0ZV9maWxlcwk9IE5VTEw7CisJb3BzLT5zZXR1cAkJPSBubWlfdGltZXJfc2V0dXA7CisJb3BzLT5zaHV0ZG93bgkJPSBubWlfdGltZXJfc2h1dGRvd247CisJb3BzLT5zdGFydAkJPSBubWlfdGltZXJfc3RhcnQ7CisJb3BzLT5zdG9wCQk9IG5taV90aW1lcl9zdG9wOworCW9wcy0+Y3B1X3R5cGUJCT0gInRpbWVyIjsKKworCXByaW50ayhLRVJOX0lORk8gIm9wcm9maWxlOiB1c2luZyBOTUkgdGltZXIgaW50ZXJydXB0LlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL29wcm9mLmMgYi9kcml2ZXJzL29wcm9maWxlL29wcm9mLmMKaW5kZXggZGNjZDg2My4uZWQyYzNlYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9vcHJvZi5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2YuYwpAQCAtMjM5LDI2ICsyMzksMzkgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IHRpbWVyX21vZGU7CisKIHN0YXRpYyBpbnQgX19pbml0IG9wcm9maWxlX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwogCisJLyogYWx3YXlzIGluaXQgYXJjaGl0ZWN0dXJlIHRvIHNldHVwIGJhY2t0cmFjZSBzdXBwb3J0ICovCisJdGltZXJfbW9kZSA9IDA7CiAJZXJyID0gb3Byb2ZpbGVfYXJjaF9pbml0KCZvcHJvZmlsZV9vcHMpOwotCWlmIChlcnIgPCAwIHx8IHRpbWVyKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gIm9wcm9maWxlOiB1c2luZyB0aW1lciBpbnRlcnJ1cHQuXG4iKTsKKwlpZiAoIWVycikgeworCQlpZiAoIXRpbWVyICYmICFvcHJvZmlsZWZzX3JlZ2lzdGVyKCkpCisJCQlyZXR1cm4gMDsKKwkJb3Byb2ZpbGVfYXJjaF9leGl0KCk7CisJfQorCisJLyogc2V0dXAgdGltZXIgbW9kZTogKi8KKwl0aW1lcl9tb2RlID0gMTsKKwkvKiBubyBubWkgdGltZXIgbW9kZSBpZiBvcHJvZmlsZS50aW1lciBpcyBzZXQgKi8KKwlpZiAodGltZXIgfHwgb3Bfbm1pX3RpbWVyX2luaXQoJm9wcm9maWxlX29wcykpIHsKIAkJZXJyID0gb3Byb2ZpbGVfdGltZXJfaW5pdCgmb3Byb2ZpbGVfb3BzKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfQorCiAJcmV0dXJuIG9wcm9maWxlZnNfcmVnaXN0ZXIoKTsKIH0KIAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgb3Byb2ZpbGVfZXhpdCh2b2lkKQogewotCW9wcm9maWxlX3RpbWVyX2V4aXQoKTsKIAlvcHJvZmlsZWZzX3VucmVnaXN0ZXIoKTsKLQlvcHJvZmlsZV9hcmNoX2V4aXQoKTsKKwlpZiAoIXRpbWVyX21vZGUpCisJCW9wcm9maWxlX2FyY2hfZXhpdCgpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2YuaCBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2YuaAppbmRleCAxNzdiNzNkLi5kMzJlZjgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL29wcm9mLmgKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZi5oCkBAIC0zNSw3ICszNSwxNSBAQAogCiB2b2lkIG9wcm9maWxlX2NyZWF0ZV9maWxlcyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzdHJ1Y3QgZGVudHJ5ICpyb290KTsKIGludCBvcHJvZmlsZV90aW1lcl9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpOwotdm9pZCBvcHJvZmlsZV90aW1lcl9leGl0KHZvaWQpOworI2lmZGVmIENPTkZJR19PUFJPRklMRV9OTUlfVElNRVIKK2ludCBvcF9ubWlfdGltZXJfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBvcF9ubWlfdGltZXJfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQoreworCXJldHVybiAtRU5PREVWOworfQorI2VuZGlmCisKIAogaW50IG9wcm9maWxlX3NldF91bG9uZyh1bnNpZ25lZCBsb25nICphZGRyLCB1bnNpZ25lZCBsb25nIHZhbCk7CiBpbnQgb3Byb2ZpbGVfc2V0X3RpbWVvdXQodW5zaWduZWQgbG9uZyB0aW1lKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVfZmlsZXMuYyBiL2RyaXZlcnMvb3Byb2ZpbGUvb3Byb2ZpbGVfZmlsZXMuYwppbmRleCA4OWY2MzQ1Li44NGEyMDhkIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlX2ZpbGVzLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZV9maWxlcy5jCkBAIC00NSw3ICs0NSw3IEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dmFsID0gb3Byb2ZpbGVmc191bG9uZ19mcm9tX3VzZXIoJnZhbCwgYnVmLCBjb3VudCk7Ci0JaWYgKHJldHZhbCkKKwlpZiAocmV0dmFsIDw9IDApCiAJCXJldHVybiByZXR2YWw7CiAKIAlyZXR2YWwgPSBvcHJvZmlsZV9zZXRfdGltZW91dCh2YWwpOwpAQCAtODQsNyArODQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHZhbCA9IG9wcm9maWxlZnNfdWxvbmdfZnJvbV91c2VyKCZ2YWwsIGJ1ZiwgY291bnQpOwotCWlmIChyZXR2YWwpCisJaWYgKHJldHZhbCA8PSAwKQogCQlyZXR1cm4gcmV0dmFsOwogCiAJcmV0dmFsID0gb3Byb2ZpbGVfc2V0X3Vsb25nKCZvcHJvZmlsZV9iYWNrdHJhY2VfZGVwdGgsIHZhbCk7CkBAIC0xNDEsOSArMTQxLDEwIEBACiAJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0dmFsID0gb3Byb2ZpbGVmc191bG9uZ19mcm9tX3VzZXIoJnZhbCwgYnVmLCBjb3VudCk7Ci0JaWYgKHJldHZhbCkKKwlpZiAocmV0dmFsIDw9IDApCiAJCXJldHVybiByZXR2YWw7CiAKKwlyZXR2YWwgPSAwOwogCWlmICh2YWwpCiAJCXJldHZhbCA9IG9wcm9maWxlX3N0YXJ0KCk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9vcHJvZmlsZS9vcHJvZmlsZWZzLmMgYi9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlZnMuYwppbmRleCBkMGRlNmNjLi4yZjBhYTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlZnMuYworKysgYi9kcml2ZXJzL29wcm9maWxlL29wcm9maWxlZnMuYwpAQCAtNjAsNiArNjAsMTMgQEAKIH0KIAogCisvKgorICogTm90ZTogSWYgb3Byb2ZpbGVmc191bG9uZ19mcm9tX3VzZXIoKSByZXR1cm5zIDAsIHRoZW4gKnZhbCByZW1haW5zCisgKiB1bmNoYW5nZWQgYW5kIG1pZ2h0IGJlIHVuaW5pdGlhbGl6ZWQuIFRoaXMgZm9sbG93cyB3cml0ZSBzeXNjYWxsCisgKiBpbXBsZW1lbnRhdGlvbiB3aGVuIGNvdW50IGlzIHplcm86ICJJZiBjb3VudCBpcyB6ZXJvIC4uLiBbYW5kIGlmXQorICogbm8gZXJyb3JzIGFyZSBkZXRlY3RlZCwgMCB3aWxsIGJlIHJldHVybmVkIHdpdGhvdXQgY2F1c2luZyBhbnkKKyAqIG90aGVyIGVmZmVjdC4iIChtYW4gMiB3cml0ZSkKKyAqLwogaW50IG9wcm9maWxlZnNfdWxvbmdfZnJvbV91c2VyKHVuc2lnbmVkIGxvbmcgKnZhbCwgY2hhciBjb25zdCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQogewogCWNoYXIgdG1wYnVmW1RNUEJVRlNJWkVdOwpAQCAtNzksNyArODYsNyBAQAogCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmb3Byb2ZpbGVmc19sb2NrLCBmbGFncyk7CiAJKnZhbCA9IHNpbXBsZV9zdHJ0b3VsKHRtcGJ1ZiwgTlVMTCwgMCk7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wcm9maWxlZnNfbG9jaywgZmxhZ3MpOwotCXJldHVybiAwOworCXJldHVybiBjb3VudDsKIH0KIAogCkBAIC05OSw3ICsxMDYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXJldHZhbCA9IG9wcm9maWxlZnNfdWxvbmdfZnJvbV91c2VyKCZ2YWx1ZSwgYnVmLCBjb3VudCk7Ci0JaWYgKHJldHZhbCkKKwlpZiAocmV0dmFsIDw9IDApCiAJCXJldHVybiByZXR2YWw7CiAKIAlyZXR2YWwgPSBvcHJvZmlsZV9zZXRfdWxvbmcoZmlsZS0+cHJpdmF0ZV9kYXRhLCB2YWx1ZSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL29wcm9maWxlL3RpbWVyX2ludC5jIGIvZHJpdmVycy9vcHJvZmlsZS90aW1lcl9pbnQuYwppbmRleCAzZWY0NDYyLi45MzQwNGY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL29wcm9maWxlL3RpbWVyX2ludC5jCisrKyBiL2RyaXZlcnMvb3Byb2ZpbGUvdGltZXJfaW50LmMKQEAgLTk3LDIzICs5NywyNCBAQAogCS5ub3RpZmllcl9jYWxsID0gb3Byb2ZpbGVfY3B1X25vdGlmeSwKIH07CiAKLWludCBvcHJvZmlsZV90aW1lcl9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICpvcHMpCitzdGF0aWMgaW50IG9wcm9maWxlX2hydGltZXJfc2V0dXAodm9pZCkKIHsKLQlpbnQgcmM7Ci0KLQlyYyA9IHJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmb3Byb2ZpbGVfY3B1X25vdGlmaWVyKTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsKLQlvcHMtPmNyZWF0ZV9maWxlcyA9IE5VTEw7Ci0Jb3BzLT5zZXR1cCA9IE5VTEw7Ci0Jb3BzLT5zaHV0ZG93biA9IE5VTEw7Ci0Jb3BzLT5zdGFydCA9IG9wcm9maWxlX2hydGltZXJfc3RhcnQ7Ci0Jb3BzLT5zdG9wID0gb3Byb2ZpbGVfaHJ0aW1lcl9zdG9wOwotCW9wcy0+Y3B1X3R5cGUgPSAidGltZXIiOwotCXJldHVybiAwOworCXJldHVybiByZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm9wcm9maWxlX2NwdV9ub3RpZmllcik7CiB9CiAKLXZvaWQgb3Byb2ZpbGVfdGltZXJfZXhpdCh2b2lkKQorc3RhdGljIHZvaWQgb3Byb2ZpbGVfaHJ0aW1lcl9zaHV0ZG93bih2b2lkKQogewogCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZvcHJvZmlsZV9jcHVfbm90aWZpZXIpOwogfQorCitpbnQgb3Byb2ZpbGVfdGltZXJfaW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKQoreworCW9wcy0+Y3JlYXRlX2ZpbGVzCT0gTlVMTDsKKwlvcHMtPnNldHVwCQk9IG9wcm9maWxlX2hydGltZXJfc2V0dXA7CisJb3BzLT5zaHV0ZG93bgkJPSBvcHJvZmlsZV9ocnRpbWVyX3NodXRkb3duOworCW9wcy0+c3RhcnQJCT0gb3Byb2ZpbGVfaHJ0aW1lcl9zdGFydDsKKwlvcHMtPnN0b3AJCT0gb3Byb2ZpbGVfaHJ0aW1lcl9zdG9wOworCW9wcy0+Y3B1X3R5cGUJCT0gInRpbWVyIjsKKwlwcmludGsoS0VSTl9JTkZPICJvcHJvZmlsZTogdXNpbmcgdGltZXIgaW50ZXJydXB0LlxuIik7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9LY29uZmlnIGIvZHJpdmVycy9wY2kvS2NvbmZpZwppbmRleCBmMDJiNTIzLi4zNzg1NmY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9LY29uZmlnCisrKyBiL2RyaXZlcnMvcGNpL0tjb25maWcKQEAgLTk4LDExICs5OCwxMSBAQAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KIAogY29uZmlnIFBDSV9JT0FQSUMKLQlib29sCisJdHJpc3RhdGUgIlBDSSBJTy1BUElDIGhvdHBsdWcgc3VwcG9ydCIgaWYgWDg2CiAJZGVwZW5kcyBvbiBQQ0kKIAlkZXBlbmRzIG9uIEFDUEkKIAlkZXBlbmRzIG9uIEhPVFBMVUcKLQlkZWZhdWx0IHkKKwlkZWZhdWx0ICFYODYKIAogY29uZmlnIFBDSV9MQUJFTAogCWRlZl9ib29sIHkgaWYgKERNSSB8fCBBQ1BJKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvYXRzLmMgYi9kcml2ZXJzL3BjaS9hdHMuYwppbmRleCA3ZWM1NmZiLi5iMGRkMDhlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9hdHMuYworKysgYi9kcml2ZXJzL3BjaS9hdHMuYwpAQCAtMTMsNiArMTMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS1hdHMuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKICNpbmNsdWRlICJwY2kuaCIKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYyBiL2RyaXZlcnMvcGNpL2hvdHBsdWcvYWNwaXBocF9nbHVlLmMKaW5kZXggZmNlMWM1NC4uOWRkZjY5ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaG90cGx1Zy9hY3BpcGhwX2dsdWUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2FjcGlwaHBfZ2x1ZS5jCkBAIC0xMzIsNiArMTMyLDE4IEBACiAJaWYgKCFhY3BpX3BjaV9jaGVja19lamVjdGFibGUocGJ1cywgaGFuZGxlKSAmJiAhaXNfZG9ja19kZXZpY2UoaGFuZGxlKSkKIAkJcmV0dXJuIEFFX09LOwogCisJcGRldiA9IHBidXMtPnNlbGY7CisJaWYgKHBkZXYgJiYgcGNpX2lzX3BjaWUocGRldikpIHsKKwkJdG1wID0gYWNwaV9maW5kX3Jvb3RfYnJpZGdlX2hhbmRsZShwZGV2KTsKKwkJaWYgKHRtcCkgeworCQkJc3RydWN0IGFjcGlfcGNpX3Jvb3QgKnJvb3QgPSBhY3BpX3BjaV9maW5kX3Jvb3QodG1wKTsKKworCQkJaWYgKHJvb3QgJiYgKHJvb3QtPm9zY19jb250cm9sX3NldCAmCisJCQkJCU9TQ19QQ0lfRVhQUkVTU19OQVRJVkVfSFBfQ09OVFJPTCkpCisJCQkJcmV0dXJuIEFFX09LOworCQl9CisJfQorCiAJYWNwaV9ldmFsdWF0ZV9pbnRlZ2VyKGhhbmRsZSwgIl9BRFIiLCBOVUxMLCAmYWRyKTsKIAlkZXZpY2UgPSAoYWRyID4+IDE2KSAmIDB4ZmZmZjsKIAlmdW5jdGlvbiA9IGFkciAmIDB4ZmZmZjsKQEAgLTIxMyw3ICsyMjUsNiBAQAogCiAJcGRldiA9IHBjaV9nZXRfc2xvdChwYnVzLCBQQ0lfREVWRk4oZGV2aWNlLCBmdW5jdGlvbikpOwogCWlmIChwZGV2KSB7Ci0JCXBkZXYtPmN1cnJlbnRfc3RhdGUgPSBQQ0lfRDA7CiAJCXNsb3QtPmZsYWdzIHw9IChTTE9UX0VOQUJMRUQgfCBTTE9UX1BPV0VSRURPTik7CiAJCXBjaV9kZXZfcHV0KHBkZXYpOwogCX0KQEAgLTQ1OSwxNyArNDcwLDggQEAKIHsKIAlhY3BpX3N0YXR1cyBzdGF0dXM7CiAJdW5zaWduZWQgbG9uZyBsb25nIHRtcDsKLQlzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdDsKIAlhY3BpX2hhbmRsZSBkdW1teV9oYW5kbGU7CiAKLQkvKgotCSAqIFdlIHNob3VsZG4ndCB1c2UgdGhpcyBicmlkZ2UgaWYgUENJZSBuYXRpdmUgaG90cGx1ZyBjb250cm9sIGhhcyBiZWVuCi0JICogZ3JhbnRlZCBieSB0aGUgQklPUyBmb3IgaXQuCi0JICovCi0Jcm9vdCA9IGFjcGlfcGNpX2ZpbmRfcm9vdChoYW5kbGUpOwotCWlmIChyb290ICYmIChyb290LT5vc2NfY29udHJvbF9zZXQgJiBPU0NfUENJX0VYUFJFU1NfTkFUSVZFX0hQX0NPTlRST0wpKQotCQlyZXR1cm4gLUVOT0RFVjsKLQogCS8qIGlmIHRoZSBicmlkZ2UgZG9lc24ndCBoYXZlIF9TVEEsIHdlIGFzc3VtZSBpdCBpcyBhbHdheXMgdGhlcmUgKi8KIAlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoaGFuZGxlLCAiX1NUQSIsICZkdW1teV9oYW5kbGUpOwogCWlmIChBQ1BJX1NVQ0NFU1Moc3RhdHVzKSkgewpAQCAtMTM4NSwxOSArMTM4NywxMSBAQAogc3RhdGljIGFjcGlfc3RhdHVzCiBmaW5kX3Jvb3RfYnJpZGdlcyhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsdmwsIHZvaWQgKmNvbnRleHQsIHZvaWQgKipydikKIHsKLQlzdHJ1Y3QgYWNwaV9wY2lfcm9vdCAqcm9vdDsKIAlpbnQgKmNvdW50ID0gKGludCAqKWNvbnRleHQ7CiAKIAlpZiAoIWFjcGlfaXNfcm9vdF9icmlkZ2UoaGFuZGxlKSkKIAkJcmV0dXJuIEFFX09LOwogCi0Jcm9vdCA9IGFjcGlfcGNpX2ZpbmRfcm9vdChoYW5kbGUpOwotCWlmICghcm9vdCkKLQkJcmV0dXJuIEFFX09LOwotCi0JaWYgKHJvb3QtPm9zY19jb250cm9sX3NldCAmIE9TQ19QQ0lfRVhQUkVTU19OQVRJVkVfSFBfQ09OVFJPTCkKLQkJcmV0dXJuIEFFX09LOwotCiAJKCpjb3VudCkrKzsKIAlhY3BpX2luc3RhbGxfbm90aWZ5X2hhbmRsZXIoaGFuZGxlLCBBQ1BJX1NZU1RFTV9OT1RJRlksCiAJCQkJICAgIGhhbmRsZV9ob3RwbHVnX2V2ZW50X2JyaWRnZSwgTlVMTCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pb2FwaWMuYyBiL2RyaXZlcnMvcGNpL2lvYXBpYy5jCmluZGV4IDU3NzU2MzguLjIwNWFmOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2lvYXBpYy5jCisrKyBiL2RyaXZlcnMvcGNpL2lvYXBpYy5jCkBAIC0xNyw3ICsxNyw3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgpAQCAtMjcsNyArMjcsNyBAQAogCXUzMgkJZ3NpX2Jhc2U7CiB9OwogCi1zdGF0aWMgaW50IGlvYXBpY19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQorc3RhdGljIGludCBfX2RldmluaXQgaW9hcGljX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCiB7CiAJYWNwaV9oYW5kbGUgaGFuZGxlOwogCWFjcGlfc3RhdHVzIHN0YXR1czsKQEAgLTg4LDcgKzg4LDcgQEAKIAlyZXR1cm4gLUVOT0RFVjsKIH0KIAotc3RhdGljIHZvaWQgaW9hcGljX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQorc3RhdGljIHZvaWQgX19kZXZleGl0IGlvYXBpY19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKIHsKIAlzdHJ1Y3QgaW9hcGljICppb2FwaWMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKIApAQCAtOTksMTMgKzk5LDEyIEBACiB9CiAKIAotc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlvYXBpY19kZXZpY2VzW10gPSB7Ci0JeyBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAotCSAgUENJX0NMQVNTX1NZU1RFTV9QSUNfSU9BUElDIDw8IDgsIDB4ZmZmZjAwLCB9LAotCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKLQkgIFBDSV9DTEFTU19TWVNURU1fUElDX0lPWEFQSUMgPDwgOCwgMHhmZmZmMDAsIH0sCitzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoaW9hcGljX2RldmljZXMpID0geworCXsgUENJX0RFVklDRV9DTEFTUyhQQ0lfQ0xBU1NfU1lTVEVNX1BJQ19JT0FQSUMsIH4wKSB9LAorCXsgUENJX0RFVklDRV9DTEFTUyhQQ0lfQ0xBU1NfU1lTVEVNX1BJQ19JT1hBUElDLCB+MCkgfSwKIAl7IH0KIH07CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaW9hcGljX2RldmljZXMpOwogCiBzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaW9hcGljX2RyaXZlciA9IHsKIAkubmFtZQkJPSAiaW9hcGljIiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2lvdi5jIGIvZHJpdmVycy9wY2kvaW92LmMKaW5kZXggYjgyYzE1NS4uMTk2OWEzZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaW92LmMKKysrIGIvZHJpdmVycy9wY2kvaW92LmMKQEAgLTI4Myw2ICsyODMsNyBAQAogCXN0cnVjdCByZXNvdXJjZSAqcmVzOwogCXN0cnVjdCBwY2lfZGV2ICpwZGV2OwogCXN0cnVjdCBwY2lfc3Jpb3YgKmlvdiA9IGRldi0+c3Jpb3Y7CisJaW50IGJhcnMgPSAwOwogCiAJaWYgKCFucl92aXJ0Zm4pCiAJCXJldHVybiAwOwpAQCAtMzA3LDYgKzMwOCw3IEBACiAKIAlucmVzID0gMDsKIAlmb3IgKGkgPSAwOyBpIDwgUENJX1NSSU9WX05VTV9CQVJTOyBpKyspIHsKKwkJYmFycyB8PSAoMSA8PCAoaSArIFBDSV9JT1ZfUkVTT1VSQ0VTKSk7CiAJCXJlcyA9IGRldi0+cmVzb3VyY2UgKyBQQ0lfSU9WX1JFU09VUkNFUyArIGk7CiAJCWlmIChyZXMtPnBhcmVudCkKIAkJCW5yZXMrKzsKQEAgLTMyNCw2ICszMjYsMTEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJaWYgKHBjaV9lbmFibGVfcmVzb3VyY2VzKGRldiwgYmFycykpIHsKKwkJZGV2X2VycigmZGV2LT5kZXYsICJTUi1JT1Y6IElPViBCQVJTIG5vdCBhbGxvY2F0ZWRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKIAlpZiAoaW92LT5saW5rICE9IGRldi0+ZGV2Zm4pIHsKIAkJcGRldiA9IHBjaV9nZXRfc2xvdChkZXYtPmJ1cywgaW92LT5saW5rKTsKIAkJaWYgKCFwZGV2KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvcGNpLmMgYi9kcml2ZXJzL3BjaS9wY2kuYwppbmRleCA2ZjQ1YTczLi42ZDRhNTMxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wY2kuYworKysgYi9kcml2ZXJzL3BjaS9wY2kuYwpAQCAtNjY0LDYgKzY2NCw5IEBACiAJCWVycm9yID0gcGxhdGZvcm1fcGNpX3NldF9wb3dlcl9zdGF0ZShkZXYsIHN0YXRlKTsKIAkJaWYgKCFlcnJvcikKIAkJCXBjaV91cGRhdGVfY3VycmVudF9zdGF0ZShkZXYsIHN0YXRlKTsKKwkJLyogRmFsbCBiYWNrIHRvIFBDSV9EMCBpZiBuYXRpdmUgUE0gaXMgbm90IHN1cHBvcnRlZCAqLworCQlpZiAoIWRldi0+cG1fY2FwKQorCQkJZGV2LT5jdXJyZW50X3N0YXRlID0gUENJX0QwOwogCX0gZWxzZSB7CiAJCWVycm9yID0gLUVOT0RFVjsKIAkJLyogRmFsbCBiYWNrIHRvIFBDSV9EMCBpZiBuYXRpdmUgUE0gaXMgbm90IHN1cHBvcnRlZCAqLwpAQCAtMTEyNiw3ICsxMTI5LDExIEBACiAJaWYgKGF0b21pY19hZGRfcmV0dXJuKDEsICZkZXYtPmVuYWJsZV9jbnQpID4gMSkKIAkJcmV0dXJuIDA7CQkvKiBhbHJlYWR5IGVuYWJsZWQgKi8KIAotCWZvciAoaSA9IDA7IGkgPCBERVZJQ0VfQ09VTlRfUkVTT1VSQ0U7IGkrKykKKwkvKiBvbmx5IHNraXAgc3Jpb3YgcmVsYXRlZCAqLworCWZvciAoaSA9IDA7IGkgPD0gUENJX1JPTV9SRVNPVVJDRTsgaSsrKQorCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIGZsYWdzKQorCQkJYmFycyB8PSAoMSA8PCBpKTsKKwlmb3IgKGkgPSBQQ0lfQlJJREdFX1JFU09VUkNFUzsgaSA8IERFVklDRV9DT1VOVF9SRVNPVVJDRTsgaSsrKQogCQlpZiAoZGV2LT5yZXNvdXJjZVtpXS5mbGFncyAmIGZsYWdzKQogCQkJYmFycyB8PSAoMSA8PCBpKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wbGF0Zm9ybS94ODYvdG9zaGliYV9hY3BpLmMgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYwppbmRleCAxM2VmOGMzLi5kY2RjMWY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYworKysgYi9kcml2ZXJzL3BsYXRmb3JtL3g4Ni90b3NoaWJhX2FjcGkuYwpAQCAtMTIxLDYgKzEyMSw3IEBACiAJaW50IGlsbHVtaW5hdGlvbl9zdXBwb3J0ZWQ6MTsKIAlpbnQgdmlkZW9fc3VwcG9ydGVkOjE7CiAJaW50IGZhbl9zdXBwb3J0ZWQ6MTsKKwlpbnQgc3lzdGVtX2V2ZW50X3N1cHBvcnRlZDoxOwogCiAJc3RydWN0IG11dGV4IG11dGV4OwogfTsKQEAgLTcyNCw3ICs3MjUsNyBAQAogCXUzMiBoY2lfcmVzdWx0OwogCXUzMiB2YWx1ZTsKIAotCWlmICghZGV2LT5rZXlfZXZlbnRfdmFsaWQpIHsKKwlpZiAoIWRldi0+a2V5X2V2ZW50X3ZhbGlkICYmIGRldi0+c3lzdGVtX2V2ZW50X3N1cHBvcnRlZCkgewogCQloY2lfcmVhZDEoZGV2LCBIQ0lfU1lTVEVNX0VWRU5ULCAmdmFsdWUsICZoY2lfcmVzdWx0KTsKIAkJaWYgKGhjaV9yZXN1bHQgPT0gSENJX1NVQ0NFU1MpIHsKIAkJCWRldi0+a2V5X2V2ZW50X3ZhbGlkID0gMTsKQEAgLTk2NCw2ICs5NjUsOCBAQAogCiAJLyogZW5hYmxlIGV2ZW50IGZpZm8gKi8KIAloY2lfd3JpdGUxKGRldiwgSENJX1NZU1RFTV9FVkVOVCwgMSwgJmhjaV9yZXN1bHQpOworCWlmIChoY2lfcmVzdWx0ID09IEhDSV9TVUNDRVNTKQorCQlkZXYtPnN5c3RlbV9ldmVudF9zdXBwb3J0ZWQgPSAxOwogCiAJcHJvcHMudHlwZSA9IEJBQ0tMSUdIVF9QTEFURk9STTsKIAlwcm9wcy5tYXhfYnJpZ2h0bmVzcyA9IEhDSV9MQ0RfQlJJR0hUTkVTU19MRVZFTFMgLSAxOwpAQCAtMTAzMiwxMiArMTAzNSwxNSBAQAogewogCXN0cnVjdCB0b3NoaWJhX2FjcGlfZGV2ICpkZXYgPSBhY3BpX2RyaXZlcl9kYXRhKGFjcGlfZGV2KTsKIAl1MzIgaGNpX3Jlc3VsdCwgdmFsdWU7CisJaW50IHJldHJpZXMgPSAzOwogCi0JaWYgKGV2ZW50ICE9IDB4ODApCisJaWYgKCFkZXYtPnN5c3RlbV9ldmVudF9zdXBwb3J0ZWQgfHwgZXZlbnQgIT0gMHg4MCkKIAkJcmV0dXJuOworCiAJZG8gewogCQloY2lfcmVhZDEoZGV2LCBIQ0lfU1lTVEVNX0VWRU5ULCAmdmFsdWUsICZoY2lfcmVzdWx0KTsKLQkJaWYgKGhjaV9yZXN1bHQgPT0gSENJX1NVQ0NFU1MpIHsKKwkJc3dpdGNoIChoY2lfcmVzdWx0KSB7CisJCWNhc2UgSENJX1NVQ0NFU1M6CiAJCQlpZiAodmFsdWUgPT0gMHgxMDApCiAJCQkJY29udGludWU7CiAJCQkvKiBhY3Qgb24ga2V5IHByZXNzOyBpZ25vcmUga2V5IHJlbGVhc2UgKi8KQEAgLTEwNDksMTQgKzEwNTUsMTkgQEAKIAkJCQlwcl9pbmZvKCJVbmtub3duIGtleSAleFxuIiwKIAkJCQkgICAgICAgdmFsdWUpOwogCQkJfQotCQl9IGVsc2UgaWYgKGhjaV9yZXN1bHQgPT0gSENJX05PVF9TVVBQT1JURUQpIHsKKwkJCWJyZWFrOworCQljYXNlIEhDSV9OT1RfU1VQUE9SVEVEOgogCQkJLyogVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGFuIHVucmVzb2x2ZWQgaXNzdWUgb24KIAkJCSAqIHNvbWUgbWFjaGluZXMgd2hlcmUgc3lzdGVtIGV2ZW50cyBzcG9yYWRpY2FsbHkKIAkJCSAqIGJlY29tZSBkaXNhYmxlZC4gKi8KIAkJCWhjaV93cml0ZTEoZGV2LCBIQ0lfU1lTVEVNX0VWRU5ULCAxLCAmaGNpX3Jlc3VsdCk7CiAJCQlwcl9ub3RpY2UoIlJlLWVuYWJsZWQgaG90a2V5c1xuIik7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCXJldHJpZXMtLTsKKwkJCWJyZWFrOwogCQl9Ci0JfSB3aGlsZSAoaGNpX3Jlc3VsdCAhPSBIQ0lfRU1QVFkpOworCX0gd2hpbGUgKHJldHJpZXMgJiYgaGNpX3Jlc3VsdCAhPSBIQ0lfRU1QVFkpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG93ZXIvaW50ZWxfbWlkX2JhdHRlcnkuYyBiL2RyaXZlcnMvcG93ZXIvaW50ZWxfbWlkX2JhdHRlcnkuYwppbmRleCBjZmZjYjdjLi4wMWZhNjcxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bvd2VyL2ludGVsX21pZF9iYXR0ZXJ5LmMKKysrIGIvZHJpdmVycy9wb3dlci9pbnRlbF9taWRfYmF0dGVyeS5jCkBAIC02MSw3ICs2MSw4IEBACiAjZGVmaW5lIFBNSUNfQkFUVF9DSFJfU0JBVERFVF9NQVNLCSgxIDw8IDUpCiAjZGVmaW5lIFBNSUNfQkFUVF9DSFJfU0RDTE1UX01BU0sJKDEgPDwgNikKICNkZWZpbmUgUE1JQ19CQVRUX0NIUl9TVVNCT1ZQX01BU0sJKDEgPDwgNykKLSNkZWZpbmUgUE1JQ19CQVRUX0NIUl9FWENQVF9NQVNLCTB4QzYKKyNkZWZpbmUgUE1JQ19CQVRUX0NIUl9FWENQVF9NQVNLCTB4ODYKKwogI2RlZmluZSBQTUlDX0JBVFRfQURDX0FDQ0NIUkdfTUFTSwkoMSA8PCAzMSkKICNkZWZpbmUgUE1JQ19CQVRUX0FEQ19BQ0NDSFJHVkFMX01BU0sJMHg3RkZGRkZGRgogCkBAIC0zMDQsMTEgKzMwNSw2IEBACiAJCQlwYmktPmJhdHRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CiAJCQlwbWljX2JhdHRlcnlfbG9nX2V2ZW50KEJBVFRfRVZFTlRfQkFUT1ZQX0VYQ1BUKTsKIAkJCWJhdHRfZXhjZXB0aW9uID0gMTsKLQkJfSBlbHNlIGlmIChyOCAmIFBNSUNfQkFUVF9DSFJfU0RDTE1UX01BU0spIHsKLQkJCXBiaS0+YmF0dF9oZWFsdGggPSBQT1dFUl9TVVBQTFlfSEVBTFRIX09WRVJWT0xUQUdFOwotCQkJcGJpLT5iYXR0X3N0YXR1cyA9IFBPV0VSX1NVUFBMWV9TVEFUVVNfTk9UX0NIQVJHSU5HOwotCQkJcG1pY19iYXR0ZXJ5X2xvZ19ldmVudChCQVRUX0VWRU5UX0RDTE1UX0VYQ1BUKTsKLQkJCWJhdHRfZXhjZXB0aW9uID0gMTsKIAkJfSBlbHNlIGlmIChyOCAmIFBNSUNfQkFUVF9DSFJfU1RFTVBfTUFTSykgewogCQkJcGJpLT5iYXR0X2hlYWx0aCA9IFBPV0VSX1NVUFBMWV9IRUFMVEhfT1ZFUkhFQVQ7CiAJCQlwYmktPmJhdHRfc3RhdHVzID0gUE9XRVJfU1VQUExZX1NUQVRVU19OT1RfQ0hBUkdJTkc7CkBAIC0zMTYsNiArMzEyLDEwIEBACiAJCQliYXR0X2V4Y2VwdGlvbiA9IDE7CiAJCX0gZWxzZSB7CiAJCQlwYmktPmJhdHRfaGVhbHRoID0gUE9XRVJfU1VQUExZX0hFQUxUSF9HT09EOworCQkJaWYgKHI4ICYgUE1JQ19CQVRUX0NIUl9TRENMTVRfTUFTSykgeworCQkJCS8qIFBNSUMgd2lsbCBjaGFuZ2UgY2hhcmdpbmcgY3VycmVudCBhdXRvbWF0aWNhbGx5ICovCisJCQkJcG1pY19iYXR0ZXJ5X2xvZ19ldmVudChCQVRUX0VWRU5UX0RDTE1UX0VYQ1BUKTsKKwkJCX0KIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wdHAvcHRwX2Nsb2NrLmMgYi9kcml2ZXJzL3B0cC9wdHBfY2xvY2suYwppbmRleCBjZjNmOTk5Li4xMDQ1MWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3B0cC9wdHBfY2xvY2suYworKysgYi9kcml2ZXJzL3B0cC9wdHBfY2xvY2suYwpAQCAtMTAxLDcgKzEwMSw5IEBACiAKIHN0YXRpYyBpbnQgcHRwX2Nsb2NrX2dldHJlcyhzdHJ1Y3QgcG9zaXhfY2xvY2sgKnBjLCBzdHJ1Y3QgdGltZXNwZWMgKnRwKQogewotCXJldHVybiAxOyAvKiBhbHdheXMgcm91bmQgdGltZXIgZnVuY3Rpb25zIHRvIG9uZSBuYW5vc2Vjb25kICovCisJdHAtPnR2X3NlYyA9IDA7CisJdHAtPnR2X25zZWMgPSAxOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IHB0cF9jbG9ja19zZXR0aW1lKHN0cnVjdCBwb3NpeF9jbG9jayAqcGMsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdHApCmRpZmYgLS1naXQgYS9kcml2ZXJzL3JhcGlkaW8vZGV2aWNlcy90c2k3MjEuYyBiL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5jCmluZGV4IDUyMjU5MzAuLjY5MWIxYWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5jCisrKyBiL2RyaXZlcnMvcmFwaWRpby9kZXZpY2VzL3RzaTcyMS5jCkBAIC04NTEsMTQgKzg1MSwxMiBAQAogCUlOSVRfV09SSygmcHJpdi0+aWRiX3dvcmssIHRzaTcyMV9kYl9kcGMpOwogCiAJLyogQWxsb2NhdGUgYnVmZmVyIGZvciBpbmJvdW5kIGRvb3JiZWxscyBxdWV1ZSAqLwotCXByaXYtPmlkYl9iYXNlID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCisJcHJpdi0+aWRiX2Jhc2UgPSBkbWFfemFsbG9jX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCiAJCQkJSURCX1FTSVpFICogVFNJNzIxX0lEQl9FTlRSWV9TSVpFLAogCQkJCSZwcml2LT5pZGJfZG1hLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXByaXYtPmlkYl9iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCW1lbXNldChwcml2LT5pZGJfYmFzZSwgMCwgSURCX1FTSVpFICogVFNJNzIxX0lEQl9FTlRSWV9TSVpFKTsKLQogCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwgIkFsbG9jYXRlZCBJREIgYnVmZmVyIEAgJXAgKHBoeXMgPSAlbGx4KVxuIiwKIAkJcHJpdi0+aWRiX2Jhc2UsICh1bnNpZ25lZCBsb25nIGxvbmcpcHJpdi0+aWRiX2RtYSk7CiAKQEAgLTkwNCw3ICs5MDIsNyBAQAogCSAqLwogCiAJLyogQWxsb2NhdGUgc3BhY2UgZm9yIERNQSBkZXNjcmlwdG9ycyAqLwotCWJkX3B0ciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCWJkX3B0ciA9IGRtYV96YWxsb2NfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKIAkJCQkJYmRfbnVtICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfZG1hX2Rlc2MpLAogCQkJCQkmYmRfcGh5cywgR0ZQX0tFUk5FTCk7CiAJaWYgKCFiZF9wdHIpCkBAIC05MTMsOCArOTExLDYgQEAKIAlwcml2LT5iZG1hW2NobnVtXS5iZF9waHlzID0gYmRfcGh5czsKIAlwcml2LT5iZG1hW2NobnVtXS5iZF9iYXNlID0gYmRfcHRyOwogCi0JbWVtc2V0KGJkX3B0ciwgMCwgYmRfbnVtICogc2l6ZW9mKHN0cnVjdCB0c2k3MjFfZG1hX2Rlc2MpKTsKLQogCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwgIkRNQSBkZXNjcmlwdG9ycyBAICVwIChwaHlzID0gJWxseClcbiIsCiAJCWJkX3B0ciwgKHVuc2lnbmVkIGxvbmcgbG9uZyliZF9waHlzKTsKIApAQCAtOTIyLDcgKzkxOCw3IEBACiAJc3RzX3NpemUgPSAoYmRfbnVtID49IFRTSTcyMV9ETUFfTUlOU1RTU1opID8KIAkJCQkJYmRfbnVtIDogVFNJNzIxX0RNQV9NSU5TVFNTWjsKIAlzdHNfc2l6ZSA9IHJvdW5kdXBfcG93X29mX3R3byhzdHNfc2l6ZSk7Ci0Jc3RzX3B0ciA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJpdi0+cGRldi0+ZGV2LAorCXN0c19wdHIgPSBkbWFfemFsbG9jX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCiAJCQkJICAgICBzdHNfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX2RtYV9zdHMpLAogCQkJCSAgICAgJnN0c19waHlzLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXN0c19wdHIpIHsKQEAgLTkzOCw4ICs5MzQsNiBAQAogCXByaXYtPmJkbWFbY2hudW1dLnN0c19iYXNlID0gc3RzX3B0cjsKIAlwcml2LT5iZG1hW2NobnVtXS5zdHNfc2l6ZSA9IHN0c19zaXplOwogCi0JbWVtc2V0KHN0c19wdHIsIDAsIHN0c19zaXplKTsKLQogCWRldl9kYmcoJnByaXYtPnBkZXYtPmRldiwKIAkJImRlc2Mgc3RhdHVzIEZJRk8gQCAlcCAocGh5cyA9ICVsbHgpIHNpemU9MHgleFxuIiwKIAkJc3RzX3B0ciwgKHVuc2lnbmVkIGxvbmcgbG9uZylzdHNfcGh5cywgc3RzX3NpemUpOwpAQCAtMTQwMCw3ICsxMzk0LDcgQEAKIAogCS8qIE91dGJvdW5kIG1lc3NhZ2UgZGVzY3JpcHRvciBzdGF0dXMgRklGTyBhbGxvY2F0aW9uICovCiAJcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19zaXplID0gcm91bmR1cF9wb3dfb2ZfdHdvKGVudHJpZXMgKyAxKTsKLQlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX2Jhc2UgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwKKwlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX2Jhc2UgPSBkbWFfemFsbG9jX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsCiAJCQlwcml2LT5vbXNnX3JpbmdbbWJveF0uc3RzX3NpemUgKgogCQkJCQkJc2l6ZW9mKHN0cnVjdCB0c2k3MjFfZG1hX3N0cyksCiAJCQkmcHJpdi0+b21zZ19yaW5nW21ib3hdLnN0c19waHlzLCBHRlBfS0VSTkVMKTsKQEAgLTE0MTIsOSArMTQwNiw2IEBACiAJCWdvdG8gb3V0X2Rlc2M7CiAJfQogCi0JbWVtc2V0KHByaXYtPm9tc2dfcmluZ1ttYm94XS5zdHNfYmFzZSwgMCwKLQkJZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdHNpNzIxX2RtYV9zdHMpKTsKLQogCS8qCiAJICogQ29uZmlndXJlIE91dGJvdW5kIE1lc3NhZ2luZyBFbmdpbmUKIAkgKi8KQEAgLTIxMTYsOCArMjEwNyw4IEBACiAJSU5JVF9MSVNUX0hFQUQoJm1wb3J0LT5kYmVsbHMpOwogCiAJcmlvX2luaXRfZGJlbGxfcmVzKCZtcG9ydC0+cmlvcmVzW1JJT19ET09SQkVMTF9SRVNPVVJDRV0sIDAsIDB4ZmZmZik7Ci0JcmlvX2luaXRfbWJveF9yZXMoJm1wb3J0LT5yaW9yZXNbUklPX0lOQl9NQk9YX1JFU09VUkNFXSwgMCwgMCk7Ci0JcmlvX2luaXRfbWJveF9yZXMoJm1wb3J0LT5yaW9yZXNbUklPX09VVEJfTUJPWF9SRVNPVVJDRV0sIDAsIDApOworCXJpb19pbml0X21ib3hfcmVzKCZtcG9ydC0+cmlvcmVzW1JJT19JTkJfTUJPWF9SRVNPVVJDRV0sIDAsIDMpOworCXJpb19pbml0X21ib3hfcmVzKCZtcG9ydC0+cmlvcmVzW1JJT19PVVRCX01CT1hfUkVTT1VSQ0VdLCAwLCAzKTsKIAlzdHJjcHkobXBvcnQtPm5hbWUsICJUc2k3MjEgbXBvcnQiKTsKIAogCS8qIEhvb2sgdXAgaW50ZXJydXB0IGhhbmRsZXIgKi8KQEAgLTIxNjMsNyArMjE1NCw3IEBACiAJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCiB7CiAJc3RydWN0IHRzaTcyMV9kZXZpY2UgKnByaXY7Ci0JaW50IGk7CisJaW50IGksIGNhcDsKIAlpbnQgZXJyOwogCXUzMiByZWd2YWw7CiAKQEAgLTIyNzEsMTAgKzIyNjIsMjAgQEAKIAkJCWRldl9pbmZvKCZwZGV2LT5kZXYsICJVbmFibGUgdG8gc2V0IGNvbnNpc3RlbnQgRE1BIG1hc2tcbiIpOwogCX0KIAotCS8qIENsZWFyICJubyBzbm9vcCIgYW5kICJyZWxheGVkIG9yZGVyaW5nIiBiaXRzLiAqLwotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCAweDQwICsgUENJX0VYUF9ERVZDVEwsICZyZWd2YWwpOwotCXJlZ3ZhbCAmPSB+KFBDSV9FWFBfREVWQ1RMX1JFTEFYX0VOIHwgUENJX0VYUF9ERVZDVExfTk9TTk9PUF9FTik7Ci0JcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwZGV2LCAweDQwICsgUENJX0VYUF9ERVZDVEwsIHJlZ3ZhbCk7CisJY2FwID0gcGNpX3BjaWVfY2FwKHBkZXYpOworCUJVR19PTihjYXAgPT0gMCk7CisKKwkvKiBDbGVhciAibm8gc25vb3AiIGFuZCAicmVsYXhlZCBvcmRlcmluZyIgYml0cywgdXNlIGRlZmF1bHQgTVJSUy4gKi8KKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgY2FwICsgUENJX0VYUF9ERVZDVEwsICZyZWd2YWwpOworCXJlZ3ZhbCAmPSB+KFBDSV9FWFBfREVWQ1RMX1JFQURSUSB8IFBDSV9FWFBfREVWQ1RMX1JFTEFYX0VOIHwKKwkJICAgIFBDSV9FWFBfREVWQ1RMX05PU05PT1BfRU4pOworCXJlZ3ZhbCB8PSAweDIgPDwgTUFYX1JFQURfUkVRVUVTVF9TWl9TSElGVDsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBkZXYsIGNhcCArIFBDSV9FWFBfREVWQ1RMLCByZWd2YWwpOworCisJLyogQWRqdXN0IFBDSWUgY29tcGxldGlvbiB0aW1lb3V0LiAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBjYXAgKyBQQ0lfRVhQX0RFVkNUTDIsICZyZWd2YWwpOworCXJlZ3ZhbCAmPSB+KDB4MGYpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGRldiwgY2FwICsgUENJX0VYUF9ERVZDVEwyLCByZWd2YWwgfCAweDIpOwogCiAJLyoKIAkgKiBGSVhVUDogY29ycmVjdCBvZmZzZXRzIG9mIE1TSS1YIHRhYmxlcyBpbiB0aGUgTVNJLVggQ2FwYWJpbGl0eSBCbG9jawpkaWZmIC0tZ2l0IGEvZHJpdmVycy9yYXBpZGlvL2RldmljZXMvdHNpNzIxLmggYi9kcml2ZXJzL3JhcGlkaW8vZGV2aWNlcy90c2k3MjEuaAppbmRleCA1OGJlNGRlLi44MjJlNTRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3JhcGlkaW8vZGV2aWNlcy90c2k3MjEuaAorKysgYi9kcml2ZXJzL3JhcGlkaW8vZGV2aWNlcy90c2k3MjEuaApAQCAtNzIsNiArNzIsOCBAQAogI2RlZmluZSBUU0k3MjFfTVNJWFBCQV9PRkZTRVQJMHgyYTAwMAogI2RlZmluZSBUU0k3MjFfUENJRUNGR19FUENUTAkweDQwMAogCisjZGVmaW5lIE1BWF9SRUFEX1JFUVVFU1RfU1pfU0hJRlQJMTIKKwogLyoKICAqIEV2ZW50IE1hbmFnZW1lbnQgUmVnaXN0ZXJzCiAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL2NsYXNzLmMgYi9kcml2ZXJzL3J0Yy9jbGFzcy5jCmluZGV4IGU4MzI2ZjIuLmRjNGMyNzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL2NsYXNzLmMKKysrIGIvZHJpdmVycy9ydGMvY2xhc3MuYwpAQCAtNjMsNyArNjMsNyBAQAogCSAqLwogCWRlbHRhID0gdGltZXNwZWNfc3ViKG9sZF9zeXN0ZW0sIG9sZF9ydGMpOwogCWRlbHRhX2RlbHRhID0gdGltZXNwZWNfc3ViKGRlbHRhLCBvbGRfZGVsdGEpOwotCWlmIChhYnMoZGVsdGFfZGVsdGEudHZfc2VjKSAgPj0gMikgeworCWlmIChkZWx0YV9kZWx0YS50dl9zZWMgPCAtMiB8fCBkZWx0YV9kZWx0YS50dl9zZWMgPj0gMikgewogCQkvKgogCQkgKiBpZiBkZWx0YV9kZWx0YSBpcyB0b28gbGFyZ2UsIGFzc3VtZSB0aW1lIGNvcnJlY3Rpb24KIAkJICogaGFzIG9jY3VyZWQgYW5kIHNldCBvbGRfZGVsdGEgdG8gdGhlIGN1cnJlbnQgZGVsdGEuCkBAIC05Nyw5ICs5Nyw4IEBACiAJcnRjX3RtX3RvX3RpbWUoJnRtLCAmbmV3X3J0Yy50dl9zZWMpOwogCW5ld19ydGMudHZfbnNlYyA9IDA7CiAKLQlpZiAobmV3X3J0Yy50dl9zZWMgPD0gb2xkX3J0Yy50dl9zZWMpIHsKLQkJaWYgKG5ld19ydGMudHZfc2VjIDwgb2xkX3J0Yy50dl9zZWMpCi0JCQlwcl9kZWJ1ZygiJXM6ICB0aW1lIHRyYXZlbCFcbiIsIGRldl9uYW1lKCZydGMtPmRldikpOworCWlmIChuZXdfcnRjLnR2X3NlYyA8IG9sZF9ydGMudHZfc2VjKSB7CisJCXByX2RlYnVnKCIlczogIHRpbWUgdHJhdmVsIVxuIiwgZGV2X25hbWUoJnJ0Yy0+ZGV2KSk7CiAJCXJldHVybiAwOwogCX0KIApAQCAtMTE2LDcgKzExNSw4IEBACiAJc2xlZXBfdGltZSA9IHRpbWVzcGVjX3N1YihzbGVlcF90aW1lLAogCQkJdGltZXNwZWNfc3ViKG5ld19zeXN0ZW0sIG9sZF9zeXN0ZW0pKTsKIAotCXRpbWVrZWVwaW5nX2luamVjdF9zbGVlcHRpbWUoJnNsZWVwX3RpbWUpOworCWlmIChzbGVlcF90aW1lLnR2X3NlYyA+PSAwKQorCQl0aW1la2VlcGluZ19pbmplY3Rfc2xlZXB0aW1lKCZzbGVlcF90aW1lKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ydGMvcnRjLW00MXQ4MC5jIGIvZHJpdmVycy9ydGMvcnRjLW00MXQ4MC5jCmluZGV4IGVkYTEyOGYuLjY0YWVkZDggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1tNDF0ODAuYworKysgYi9kcml2ZXJzL3J0Yy9ydGMtbTQxdDgwLmMKQEAgLTM1NywxMCArMzU3LDE5IEBACiBzdGF0aWMgc3RydWN0IHJ0Y19jbGFzc19vcHMgbTQxdDgwX3J0Y19vcHMgPSB7CiAJLnJlYWRfdGltZSA9IG00MXQ4MF9ydGNfcmVhZF90aW1lLAogCS5zZXRfdGltZSA9IG00MXQ4MF9ydGNfc2V0X3RpbWUsCisJLyoKKwkgKiBYWFggLSBtNDF0ODAgYWxhcm0gZnVuY3Rpb25hbGl0eSBpcyByZXBvcnRlZCBicm9rZW4uCisJICogdW50aWwgaXQgaXMgZml4ZWQsIGRvbid0IHJlZ2lzdGVyIGFsYXJtIGZ1bmN0aW9ucy4KKwkgKgogCS5yZWFkX2FsYXJtID0gbTQxdDgwX3J0Y19yZWFkX2FsYXJtLAogCS5zZXRfYWxhcm0gPSBtNDF0ODBfcnRjX3NldF9hbGFybSwKKwkqLwogCS5wcm9jID0gbTQxdDgwX3J0Y19wcm9jLAorCS8qCisJICogU2VlIGFib3ZlIGNvbW1lbnQgb24gYnJva2VuIGFsYXJtCisJICoKIAkuYWxhcm1faXJxX2VuYWJsZSA9IG00MXQ4MF9ydGNfYWxhcm1faXJxX2VuYWJsZSwKKwkqLwogfTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1JUQ19JTlRGX1NZU0ZTKSB8fCBkZWZpbmVkKENPTkZJR19SVENfSU5URl9TWVNGU19NT0RVTEUpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3J0Yy9ydGMtczNjLmMgYi9kcml2ZXJzL3J0Yy9ydGMtczNjLmMKaW5kZXggNzYzOWFiOS4uNWI5NzlkOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ydGMvcnRjLXMzYy5jCisrKyBiL2RyaXZlcnMvcnRjL3J0Yy1zM2MuYwpAQCAtMjAyLDcgKzIwMiw2IEBACiAJdm9pZCBfX2lvbWVtICpiYXNlID0gczNjX3J0Y19iYXNlOwogCWludCB5ZWFyID0gdG0tPnRtX3llYXIgLSAxMDA7CiAKLQljbGtfZW5hYmxlKHJ0Y19jbGspOwogCXByX2RlYnVnKCJzZXQgdGltZSAlMDRkLiUwMmQuJTAyZCAlMDJkOiUwMmQ6JTAyZFxuIiwKIAkJIDE5MDAgKyB0bS0+dG1feWVhciwgdG0tPnRtX21vbiwgdG0tPnRtX21kYXksCiAJCSB0bS0+dG1faG91ciwgdG0tPnRtX21pbiwgdG0tPnRtX3NlYyk7CkBAIC0yMTQsNiArMjEzLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCisJY2xrX2VuYWJsZShydGNfY2xrKTsKIAl3cml0ZWIoYmluMmJjZCh0bS0+dG1fc2VjKSwgIGJhc2UgKyBTM0MyNDEwX1JUQ1NFQyk7CiAJd3JpdGViKGJpbjJiY2QodG0tPnRtX21pbiksICBiYXNlICsgUzNDMjQxMF9SVENNSU4pOwogCXdyaXRlYihiaW4yYmNkKHRtLT50bV9ob3VyKSwgYmFzZSArIFMzQzI0MTBfUlRDSE9VUik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Noc2MuYyBiL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jCmluZGV4IDc1YzNmMWYuLmE4NDYzMWEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY2hzYy5jCkBAIC01MjksMTAgKzUyOSw3IEBACiBpbnQgY2hzY19jaHBfdmFyeShzdHJ1Y3QgY2hwX2lkIGNocGlkLCBpbnQgb24pCiB7CiAJc3RydWN0IGNoYW5uZWxfcGF0aCAqY2hwID0gY2hwaWRfdG9fY2hwKGNocGlkKTsKLQlzdHJ1Y3QgY2hwX2xpbmsgbGluazsKIAotCW1lbXNldCgmbGluaywgMCwgc2l6ZW9mKHN0cnVjdCBjaHBfbGluaykpOwotCWxpbmsuY2hwaWQgPSBjaHBpZDsKIAkvKiBXYWl0IHVudGlsIHByZXZpb3VzIGFjdGlvbnMgaGF2ZSBzZXR0bGVkLiAqLwogCWNzc193YWl0X2Zvcl9zbG93X3BhdGgoKTsKIAkvKgpAQCAtNTQyLDEwICs1MzksMTAgQEAKIAkJLyogVHJ5IHRvIHVwZGF0ZSB0aGUgY2hhbm5lbCBwYXRoIGRlc2NyaXRvci4gKi8KIAkJY2hzY19kZXRlcm1pbmVfYmFzZV9jaGFubmVsX3BhdGhfZGVzYyhjaHBpZCwgJmNocC0+ZGVzYyk7CiAJCWZvcl9lYWNoX3N1YmNoYW5uZWxfc3RhZ2VkKHMzOTBfc3ViY2hhbm5lbF92YXJ5X2NocGlkX29uLAotCQkJCQkgICBfX3MzOTBfdmFyeV9jaHBpZF9vbiwgJmxpbmspOworCQkJCQkgICBfX3MzOTBfdmFyeV9jaHBpZF9vbiwgJmNocGlkKTsKIAl9IGVsc2UKIAkJZm9yX2VhY2hfc3ViY2hhbm5lbF9zdGFnZWQoczM5MF9zdWJjaGFubmVsX3ZhcnlfY2hwaWRfb2ZmLAotCQkJCQkgICBOVUxMLCAmbGluayk7CisJCQkJCSAgIE5VTEwsICZjaHBpZCk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmggYi9kcml2ZXJzL3MzOTAvY2lvL2Npby5oCmluZGV4IDE1NWE4MmIuLjRhMWZmNWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vY2lvLmgKKysrIGIvZHJpdmVycy9zMzkwL2Npby9jaW8uaApAQCAtNjgsOCArNjgsMTMgQEAKIAlfX3U4IG1kYVs0XTsJCSAvKiBtb2RlbCBkZXBlbmRlbnQgYXJlYSAqLwogfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkLGFsaWduZWQoNCkpKTsKIAorLyoKKyAqIFdoZW4gcmVzY2hlZHVsZWQsIHRvZG8ncyB3aXRoIGhpZ2hlciB2YWx1ZXMgd2lsbCBvdmVyd3JpdGUgdGhvc2UKKyAqIHdpdGggbG93ZXIgdmFsdWVzLgorICovCiBlbnVtIHNjaF90b2RvIHsKIAlTQ0hfVE9ET19OT1RISU5HLAorCVNDSF9UT0RPX0VWQUwsCiAJU0NIX1RPRE9fVU5SRUcsCiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jIGIvZHJpdmVycy9zMzkwL2Npby9jc3MuYwppbmRleCA5MmQ3MzI0Li4yMTkwOGU2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2Nzcy5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vY3NzLmMKQEAgLTE5NSw1MSArMTk1LDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNzc19zY2hfZGV2aWNlX3VucmVnaXN0ZXIpOwogCi1zdGF0aWMgdm9pZCBjc3Nfc2NoX3RvZG8oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7Ci0JZW51bSBzY2hfdG9kbyB0b2RvOwotCi0Jc2NoID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBzdWJjaGFubmVsLCB0b2RvX3dvcmspOwotCS8qIEZpbmQgb3V0IHRvZG8uICovCi0Jc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOwotCXRvZG8gPSBzY2gtPnRvZG87Ci0JQ0lPX01TR19FVkVOVCg0LCAic2NoX3RvZG86IHNjaD0wLiV4LiUwNHgsIHRvZG89JWRcbiIsIHNjaC0+c2NoaWQuc3NpZCwKLQkJICAgICAgc2NoLT5zY2hpZC5zY2hfbm8sIHRvZG8pOwotCXNjaC0+dG9kbyA9IFNDSF9UT0RPX05PVEhJTkc7Ci0Jc3Bpbl91bmxvY2tfaXJxKHNjaC0+bG9jayk7Ci0JLyogUGVyZm9ybSB0b2RvLiAqLwotCWlmICh0b2RvID09IFNDSF9UT0RPX1VOUkVHKQotCQljc3Nfc2NoX2RldmljZV91bnJlZ2lzdGVyKHNjaCk7Ci0JLyogUmVsZWFzZSB3b3JrcXVldWUgcmVmLiAqLwotCXB1dF9kZXZpY2UoJnNjaC0+ZGV2KTsKLX0KLQotLyoqCi0gKiBjc3Nfc2NoZWRfc2NoX3RvZG8gLSBzY2hlZHVsZSBhIHN1YmNoYW5uZWwgb3BlcmF0aW9uCi0gKiBAc2NoOiBzdWJjaGFubmVsCi0gKiBAdG9kbzogdG9kbwotICoKLSAqIFNjaGVkdWxlIHRoZSBvcGVyYXRpb24gaWRlbnRpZmllZCBieSBAdG9kbyB0byBiZSBwZXJmb3JtZWQgb24gdGhlIHNsb3cgcGF0aAotICogd29ya3F1ZXVlLiBEbyBub3RoaW5nIGlmIGFub3RoZXIgb3BlcmF0aW9uIHdpdGggaGlnaGVyIHByaW9yaXR5IGlzIGFscmVhZHkKLSAqIHNjaGVkdWxlZC4gTmVlZHMgdG8gYmUgY2FsbGVkIHdpdGggc3ViY2hhbm5lbCBsb2NrIGhlbGQuCi0gKi8KLXZvaWQgY3NzX3NjaGVkX3NjaF90b2RvKHN0cnVjdCBzdWJjaGFubmVsICpzY2gsIGVudW0gc2NoX3RvZG8gdG9kbykKLXsKLQlDSU9fTVNHX0VWRU5UKDQsICJzY2hfdG9kbzogc2NoZWQgc2NoPTAuJXguJTA0eCB0b2RvPSVkXG4iLAotCQkgICAgICBzY2gtPnNjaGlkLnNzaWQsIHNjaC0+c2NoaWQuc2NoX25vLCB0b2RvKTsKLQlpZiAoc2NoLT50b2RvID49IHRvZG8pCi0JCXJldHVybjsKLQkvKiBHZXQgd29ya3F1ZXVlIHJlZi4gKi8KLQlpZiAoIWdldF9kZXZpY2UoJnNjaC0+ZGV2KSkKLQkJcmV0dXJuOwotCXNjaC0+dG9kbyA9IHRvZG87Ci0JaWYgKCFxdWV1ZV93b3JrKGNpb193b3JrX3EsICZzY2gtPnRvZG9fd29yaykpIHsKLQkJLyogQWxyZWFkeSBxdWV1ZWQsIHJlbGVhc2Ugd29ya3F1ZXVlIHJlZi4gKi8KLQkJcHV0X2RldmljZSgmc2NoLT5kZXYpOwotCX0KLX0KLQogc3RhdGljIHZvaWQgc3NkX2Zyb21fcG1jdyhzdHJ1Y3QgY2hzY19zc2RfaW5mbyAqc3NkLCBzdHJ1Y3QgcG1jdyAqcG1jdykKIHsKIAlpbnQgaTsKQEAgLTQ2Niw2ICs0MjEsNjUgQEAKIAkJY3NzX3NjaGVkdWxlX2V2YWwoc2NoaWQpOwogfQogCisvKioKKyAqIGNzc19zY2hlZF9zY2hfdG9kbyAtIHNjaGVkdWxlIGEgc3ViY2hhbm5lbCBvcGVyYXRpb24KKyAqIEBzY2g6IHN1YmNoYW5uZWwKKyAqIEB0b2RvOiB0b2RvCisgKgorICogU2NoZWR1bGUgdGhlIG9wZXJhdGlvbiBpZGVudGlmaWVkIGJ5IEB0b2RvIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgc2xvdyBwYXRoCisgKiB3b3JrcXVldWUuIERvIG5vdGhpbmcgaWYgYW5vdGhlciBvcGVyYXRpb24gd2l0aCBoaWdoZXIgcHJpb3JpdHkgaXMgYWxyZWFkeQorICogc2NoZWR1bGVkLiBOZWVkcyB0byBiZSBjYWxsZWQgd2l0aCBzdWJjaGFubmVsIGxvY2sgaGVsZC4KKyAqLwordm9pZCBjc3Nfc2NoZWRfc2NoX3RvZG8oc3RydWN0IHN1YmNoYW5uZWwgKnNjaCwgZW51bSBzY2hfdG9kbyB0b2RvKQoreworCUNJT19NU0dfRVZFTlQoNCwgInNjaF90b2RvOiBzY2hlZCBzY2g9MC4leC4lMDR4IHRvZG89JWRcbiIsCisJCSAgICAgIHNjaC0+c2NoaWQuc3NpZCwgc2NoLT5zY2hpZC5zY2hfbm8sIHRvZG8pOworCWlmIChzY2gtPnRvZG8gPj0gdG9kbykKKwkJcmV0dXJuOworCS8qIEdldCB3b3JrcXVldWUgcmVmLiAqLworCWlmICghZ2V0X2RldmljZSgmc2NoLT5kZXYpKQorCQlyZXR1cm47CisJc2NoLT50b2RvID0gdG9kbzsKKwlpZiAoIXF1ZXVlX3dvcmsoY2lvX3dvcmtfcSwgJnNjaC0+dG9kb193b3JrKSkgeworCQkvKiBBbHJlYWR5IHF1ZXVlZCwgcmVsZWFzZSB3b3JrcXVldWUgcmVmLiAqLworCQlwdXRfZGV2aWNlKCZzY2gtPmRldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBjc3Nfc2NoX3RvZG8oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CisJZW51bSBzY2hfdG9kbyB0b2RvOworCWludCByZXQ7CisKKwlzY2ggPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHN1YmNoYW5uZWwsIHRvZG9fd29yayk7CisJLyogRmluZCBvdXQgdG9kby4gKi8KKwlzcGluX2xvY2tfaXJxKHNjaC0+bG9jayk7CisJdG9kbyA9IHNjaC0+dG9kbzsKKwlDSU9fTVNHX0VWRU5UKDQsICJzY2hfdG9kbzogc2NoPTAuJXguJTA0eCwgdG9kbz0lZFxuIiwgc2NoLT5zY2hpZC5zc2lkLAorCQkgICAgICBzY2gtPnNjaGlkLnNjaF9ubywgdG9kbyk7CisJc2NoLT50b2RvID0gU0NIX1RPRE9fTk9USElORzsKKwlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKKwkvKiBQZXJmb3JtIHRvZG8uICovCisJc3dpdGNoICh0b2RvKSB7CisJY2FzZSBTQ0hfVE9ET19OT1RISU5HOgorCQlicmVhazsKKwljYXNlIFNDSF9UT0RPX0VWQUw6CisJCXJldCA9IGNzc19ldmFsdWF0ZV9rbm93bl9zdWJjaGFubmVsKHNjaCwgMSk7CisJCWlmIChyZXQgPT0gLUVBR0FJTikgeworCQkJc3Bpbl9sb2NrX2lycShzY2gtPmxvY2spOworCQkJY3NzX3NjaGVkX3NjaF90b2RvKHNjaCwgdG9kbyk7CisJCQlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNDSF9UT0RPX1VOUkVHOgorCQljc3Nfc2NoX2RldmljZV91bnJlZ2lzdGVyKHNjaCk7CisJCWJyZWFrOworCX0KKwkvKiBSZWxlYXNlIHdvcmtxdWV1ZSByZWYuICovCisJcHV0X2RldmljZSgmc2NoLT5kZXYpOworfQorCiBzdGF0aWMgc3RydWN0IGlkc2V0ICpzbG93X3N1YmNoYW5uZWxfc2V0Owogc3RhdGljIHNwaW5sb2NrX3Qgc2xvd19zdWJjaGFubmVsX2xvY2s7CiBzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgY3NzX2V2YWxfd3E7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jIGIvZHJpdmVycy9zMzkwL2Npby9kZXZpY2UuYwppbmRleCBkNzM0ZjRhLi40NzI2OTg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlLmMKQEAgLTE4NjgsOSArMTg2OCw5IEBACiAJICovCiAJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MucmVzdW1pbmcgPSAxOwogCWNkZXYtPnByaXZhdGUtPnBhdGhfbmV3X21hc2sgPSBMUE1fQU5ZUEFUSDsKLQljc3Nfc2NoZWR1bGVfZXZhbChzY2gtPnNjaGlkKTsKKwljc3Nfc2NoZWRfc2NoX3RvZG8oc2NoLCBTQ0hfVE9ET19FVkFMKTsKIAlzcGluX3VubG9ja19pcnEoc2NoLT5sb2NrKTsKLQljc3NfY29tcGxldGVfd29yaygpOworCWNzc193YWl0X2Zvcl9zbG93X3BhdGgoKTsKIAogCS8qIGNkZXYgbWF5IGhhdmUgYmVlbiBtb3ZlZCB0byBhIGRpZmZlcmVudCBzdWJjaGFubmVsLiAqLwogCXNjaCA9IHRvX3N1YmNoYW5uZWwoY2Rldi0+ZGV2LnBhcmVudCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9mc20uYyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCmluZGV4IDUyYzIzM2YuLjFiODUzNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vZGV2aWNlX2ZzbS5jCkBAIC00OTYsOCArNDk2LDI2IEBACiAJY2Rldi0+cHJpdmF0ZS0+cGdpZF9yZXNldF9tYXNrID0gMDsKIH0KIAotdm9pZAotY2N3X2RldmljZV92ZXJpZnlfZG9uZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IGVycikKK3N0YXRpYyB2b2lkIGNyZWF0ZV9mYWtlX2lyYihzdHJ1Y3QgaXJiICppcmIsIGludCB0eXBlKQoreworCW1lbXNldChpcmIsIDAsIHNpemVvZigqaXJiKSk7CisJaWYgKHR5cGUgPT0gRkFLRV9DTURfSVJCKSB7CisJCXN0cnVjdCBjbWRfc2NzdyAqc2NzdyA9ICZpcmItPnNjc3cuY21kOworCQlzY3N3LT5jYyA9IDE7CisJCXNjc3ctPmZjdGwgPSBTQ1NXX0ZDVExfU1RBUlRfRlVOQzsKKwkJc2Nzdy0+YWN0bCA9IFNDU1dfQUNUTF9TVEFSVF9QRU5EOworCQlzY3N3LT5zdGN0bCA9IFNDU1dfU1RDVExfU1RBVFVTX1BFTkQ7CisJfSBlbHNlIGlmICh0eXBlID09IEZBS0VfVE1fSVJCKSB7CisJCXN0cnVjdCB0bV9zY3N3ICpzY3N3ID0gJmlyYi0+c2Nzdy50bTsKKwkJc2Nzdy0+eCA9IDE7CisJCXNjc3ctPmNjID0gMTsKKwkJc2Nzdy0+ZmN0bCA9IFNDU1dfRkNUTF9TVEFSVF9GVU5DOworCQlzY3N3LT5hY3RsID0gU0NTV19BQ1RMX1NUQVJUX1BFTkQ7CisJCXNjc3ctPnN0Y3RsID0gU0NTV19TVENUTF9TVEFUVVNfUEVORDsKKwl9Cit9CisKK3ZvaWQgY2N3X2RldmljZV92ZXJpZnlfZG9uZShzdHJ1Y3QgY2N3X2RldmljZSAqY2RldiwgaW50IGVycikKIHsKIAlzdHJ1Y3Qgc3ViY2hhbm5lbCAqc2NoOwogCkBAIC01MjAsMTIgKzUzOCw4IEBACiAJCWNjd19kZXZpY2VfZG9uZShjZGV2LCBERVZfU1RBVEVfT05MSU5FKTsKIAkJLyogRGVsaXZlciBmYWtlIGlyYiB0byBkZXZpY2UgZHJpdmVyLCBpZiBuZWVkZWQuICovCiAJCWlmIChjZGV2LT5wcml2YXRlLT5mbGFncy5mYWtlX2lyYikgewotCQkJbWVtc2V0KCZjZGV2LT5wcml2YXRlLT5pcmIsIDAsIHNpemVvZihzdHJ1Y3QgaXJiKSk7Ci0JCQljZGV2LT5wcml2YXRlLT5pcmIuc2Nzdy5jbWQuY2MgPSAxOwotCQkJY2Rldi0+cHJpdmF0ZS0+aXJiLnNjc3cuY21kLmZjdGwgPSBTQ1NXX0ZDVExfU1RBUlRfRlVOQzsKLQkJCWNkZXYtPnByaXZhdGUtPmlyYi5zY3N3LmNtZC5hY3RsID0gU0NTV19BQ1RMX1NUQVJUX1BFTkQ7Ci0JCQljZGV2LT5wcml2YXRlLT5pcmIuc2Nzdy5jbWQuc3RjdGwgPQotCQkJCVNDU1dfU1RDVExfU1RBVFVTX1BFTkQ7CisJCQljcmVhdGVfZmFrZV9pcmIoJmNkZXYtPnByaXZhdGUtPmlyYiwKKwkJCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZmFrZV9pcmIpOwogCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZmFrZV9pcmIgPSAwOwogCQkJaWYgKGNkZXYtPmhhbmRsZXIpCiAJCQkJY2Rldi0+aGFuZGxlcihjZGV2LCBjZGV2LT5wcml2YXRlLT5pbnRwYXJtLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL2Npby9kZXZpY2Vfb3BzLmMgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9vcHMuYwppbmRleCBmOTg2OThkLi5lYzdmYjZkIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9vcHMuYworKysgYi9kcml2ZXJzL3MzOTAvY2lvL2RldmljZV9vcHMuYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAJaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9WRVJJRlkpIHsKIAkJLyogUmVtZW1iZXIgdG8gZmFrZSBpcmIgd2hlbiBmaW5pc2hlZC4gKi8KIAkJaWYgKCFjZGV2LT5wcml2YXRlLT5mbGFncy5mYWtlX2lyYikgewotCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZmFrZV9pcmIgPSAxOworCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZmFrZV9pcmIgPSBGQUtFX0NNRF9JUkI7CiAJCQljZGV2LT5wcml2YXRlLT5pbnRwYXJtID0gaW50cGFybTsKIAkJCXJldHVybiAwOwogCQl9IGVsc2UKQEAgLTIxMyw5ICsyMTMsOSBAQAogCXJldCA9IGNpb19zZXRfb3B0aW9ucyAoc2NoLCBmbGFncyk7CiAJaWYgKHJldCkKIAkJcmV0dXJuIHJldDsKLQkvKiBBZGp1c3QgcmVxdWVzdGVkIHBhdGggbWFzayB0byBleGNsdWRlZCB2YXJpZWQgb2ZmIHBhdGhzLiAqLworCS8qIEFkanVzdCByZXF1ZXN0ZWQgcGF0aCBtYXNrIHRvIGV4Y2x1ZGUgdW51c2FibGUgcGF0aHMuICovCiAJaWYgKGxwbSkgewotCQlscG0gJj0gc2NoLT5vcG07CisJCWxwbSAmPSBzY2gtPmxwbTsKIAkJaWYgKGxwbSA9PSAwKQogCQkJcmV0dXJuIC1FQUNDRVM7CiAJfQpAQCAtNjA1LDExICs2MDUsMjEgQEAKIAlzY2ggPSB0b19zdWJjaGFubmVsKGNkZXYtPmRldi5wYXJlbnQpOwogCWlmICghc2NoLT5zY2hpYi5wbWN3LmVuYSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlID09IERFVl9TVEFURV9WRVJJRlkpIHsKKwkJLyogUmVtZW1iZXIgdG8gZmFrZSBpcmIgd2hlbiBmaW5pc2hlZC4gKi8KKwkJaWYgKCFjZGV2LT5wcml2YXRlLT5mbGFncy5mYWtlX2lyYikgeworCQkJY2Rldi0+cHJpdmF0ZS0+ZmxhZ3MuZmFrZV9pcmIgPSBGQUtFX1RNX0lSQjsKKwkJCWNkZXYtPnByaXZhdGUtPmludHBhcm0gPSBpbnRwYXJtOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZQorCQkJLyogVGhlcmUncyBhbHJlYWR5IGEgZmFrZSBJL08gYXJvdW5kLiAqLworCQkJcmV0dXJuIC1FQlVTWTsKKwl9CiAJaWYgKGNkZXYtPnByaXZhdGUtPnN0YXRlICE9IERFVl9TVEFURV9PTkxJTkUpCiAJCXJldHVybiAtRUlPOwotCS8qIEFkanVzdCByZXF1ZXN0ZWQgcGF0aCBtYXNrIHRvIGV4Y2x1ZGVkIHZhcmllZCBvZmYgcGF0aHMuICovCisJLyogQWRqdXN0IHJlcXVlc3RlZCBwYXRoIG1hc2sgdG8gZXhjbHVkZSB1bnVzYWJsZSBwYXRocy4gKi8KIAlpZiAobHBtKSB7Ci0JCWxwbSAmPSBzY2gtPm9wbTsKKwkJbHBtICY9IHNjaC0+bHBtOwogCQlpZiAobHBtID09IDApCiAJCQlyZXR1cm4gLUVBQ0NFUzsKIAl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvY2lvL2lvX3NjaC5oIGIvZHJpdmVycy9zMzkwL2Npby9pb19zY2guaAppbmRleCAyZWJiNDkyLi43NjI1M2RmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvY2lvL2lvX3NjaC5oCisrKyBiL2RyaXZlcnMvczM5MC9jaW8vaW9fc2NoLmgKQEAgLTExMSw2ICsxMTEsOSBAQAogCUNERVZfVE9ET19VTlJFR19FVkFMLAogfTsKIAorI2RlZmluZSBGQUtFX0NNRF9JUkIJMQorI2RlZmluZSBGQUtFX1RNX0lSQgkyCisKIHN0cnVjdCBjY3dfZGV2aWNlX3ByaXZhdGUgewogCXN0cnVjdCBjY3dfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBzdWJjaGFubmVsICpzY2g7CkBAIC0xMzgsNyArMTQxLDcgQEAKIAkJdW5zaWduZWQgaW50IGRvdmVyaWZ5OjE7ICAgIC8qIGRlbGF5ZWQgcGF0aCB2ZXJpZmljYXRpb24gKi8KIAkJdW5zaWduZWQgaW50IGRvbm90aWZ5OjE7ICAgIC8qIGNhbGwgbm90aWZ5IGZ1bmN0aW9uICovCiAJCXVuc2lnbmVkIGludCByZWNvZ19kb25lOjE7ICAvKiBkZXYuIHJlY29nLiBjb21wbGV0ZSAqLwotCQl1bnNpZ25lZCBpbnQgZmFrZV9pcmI6MTsgICAgLyogZGVsaXZlciBmYWtlZCBpcmIgKi8KKwkJdW5zaWduZWQgaW50IGZha2VfaXJiOjI7ICAgIC8qIGRlbGl2ZXIgZmFrZWQgaXJiICovCiAJCXVuc2lnbmVkIGludCByZXN1bWluZzoxOyAgICAvKiByZWNvZ25pdGlvbiB3aGlsZSByZXN1bWUgKi8KIAkJdW5zaWduZWQgaW50IHBncm91cDoxOwkgICAgLyogcGF0aGdyb3VwIGlzIHNldCB1cCAqLwogCQl1bnNpZ25lZCBpbnQgbXBhdGg6MTsJICAgIC8qIG11bHRpcGF0aGluZyBpcyBzZXQgdXAgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMgYi9kcml2ZXJzL3MzOTAvY3J5cHRvL2FwX2J1cy5jCmluZGV4IGVjOTRmMDQuLjk2YmJlOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9jcnlwdG8vYXBfYnVzLmMKKysrIGIvZHJpdmVycy9zMzkwL2NyeXB0by9hcF9idXMuYwpAQCAtMTU1Miw2ICsxNTUyLDggQEAKIAlyYyA9IGFwX2luaXRfcXVldWUoYXBfZGV2LT5xaWQpOwogCWlmIChyYyA9PSAtRU5PREVWKQogCQlhcF9kZXYtPnVucmVnaXN0ZXJlZCA9IDE7CisJZWxzZQorCQlfX2FwX3NjaGVkdWxlX3BvbGxfdGltZXIoKTsKIH0KIAogc3RhdGljIGludCBfX2FwX3BvbGxfZGV2aWNlKHN0cnVjdCBhcF9kZXZpY2UgKmFwX2RldiwgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAva3ZtL2t2bV92aXJ0aW8uYyBiL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCmluZGV4IDk0ZjQ5ZmYuLjhhZjg2OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCisrKyBiL2RyaXZlcnMvczM5MC9rdm0va3ZtX3ZpcnRpby5jCkBAIC0yNjMsNiArMjYzLDExIEBACiAJcmV0dXJuIFBUUl9FUlIodnFzW2ldKTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmt2bV9idXNfbmFtZShzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKK3sKKwlyZXR1cm4gIiI7Cit9CisKIC8qCiAgKiBUaGUgY29uZmlnIG9wcyBzdHJ1Y3R1cmUgYXMgZGVmaW5lZCBieSB2aXJ0aW8gY29uZmlnCiAgKi8KQEAgLTI3Niw2ICsyODEsNyBAQAogCS5yZXNldCA9IGt2bV9yZXNldCwKIAkuZmluZF92cXMgPSBrdm1fZmluZF92cXMsCiAJLmRlbF92cXMgPSBrdm1fZGVsX3ZxcywKKwkuYnVzX25hbWUgPSBrdm1fYnVzX25hbWUsCiB9OwogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9uZXRpdWN2LmMgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwppbmRleCBiNmE2MzU2Li44MTYwNTkxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L25ldGl1Y3YuYwpAQCAtNjMsNiArNjMsNyBAQAogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZWJjZGljLmg+CiAKICNpbmNsdWRlIDxuZXQvaXVjdi9pdWN2Lmg+CiAjaW5jbHVkZSAiZnNtLmgiCkBAIC03NSw3ICs3Niw3IEBACiAgKiBEZWJ1ZyBGYWNpbGl0eSBzdHVmZgogICovCiAjZGVmaW5lIElVQ1ZfREJGX1NFVFVQX05BTUUgIml1Y3Zfc2V0dXAiCi0jZGVmaW5lIElVQ1ZfREJGX1NFVFVQX0xFTiAzMgorI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9MRU4gNjQKICNkZWZpbmUgSVVDVl9EQkZfU0VUVVBfUEFHRVMgMgogI2RlZmluZSBJVUNWX0RCRl9TRVRVUF9OUl9BUkVBUyAxCiAjZGVmaW5lIElVQ1ZfREJGX1NFVFVQX0xFVkVMIDMKQEAgLTIyNiw2ICsyMjcsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICAgICAgICAgKm5ldGRldjsKIAlzdHJ1Y3QgY29ubmVjdGlvbl9wcm9maWxlIHByb2Y7CiAJY2hhciAgICAgICAgICAgICAgICAgICAgICB1c2VyaWRbOV07CisJY2hhcgkJCSAgdXNlcmRhdGFbMTddOwogfTsKIAogLyoqCkBAIC0yNjMsNyArMjY1LDcgQEAKIH07CiAKICNkZWZpbmUgTkVUSVVDVl9IRFJMRU4JCSAoc2l6ZW9mKHN0cnVjdCBsbF9oZWFkZXIpKQotI2RlZmluZSBORVRJVUNWX0JVRlNJWkVfTUFYICAgICAgMzI3NjgKKyNkZWZpbmUgTkVUSVVDVl9CVUZTSVpFX01BWAkgNjU1MzcKICNkZWZpbmUgTkVUSVVDVl9CVUZTSVpFX0RFRkFVTFQgIE5FVElVQ1ZfQlVGU0laRV9NQVgKICNkZWZpbmUgTkVUSVVDVl9NVFVfTUFYICAgICAgICAgIChORVRJVUNWX0JVRlNJWkVfTUFYIC0gTkVUSVVDVl9IRFJMRU4pCiAjZGVmaW5lIE5FVElVQ1ZfTVRVX0RFRkFVTFQgICAgICA5MjE2CkBAIC0yODgsNyArMjkwLDEyIEBACiAJcmV0dXJuIHRlc3RfYW5kX3NldF9iaXQoMCwgJnByaXYtPnRidXN5KTsKIH0KIAotc3RhdGljIHU4IGl1Y3ZNYWdpY1sxNl0gPSB7CitzdGF0aWMgdTggaXVjdk1hZ2ljX2FzY2lpWzE2XSA9IHsKKwkweDMwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLCAweDIwLAorCTB4MzAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAsIDB4MjAKK307CisKK3N0YXRpYyB1OCBpdWN2TWFnaWNfZWJjZGljWzE2XSA9IHsKIAkweEYwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLCAweDQwLAogCTB4RjAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAsIDB4NDAKIH07CkBAIC0zMDEsMTggKzMwOCwzOCBAQAogICoKICAqIEByZXR1cm5zIFRoZSBwcmludGFibGUgc3RyaW5nIChzdGF0aWMgZGF0YSEhKQogICovCi1zdGF0aWMgY2hhciAqbmV0aXVjdl9wcmludG5hbWUoY2hhciAqbmFtZSkKK3N0YXRpYyBjaGFyICpuZXRpdWN2X3ByaW50bmFtZShjaGFyICpuYW1lLCBpbnQgbGVuKQogewotCXN0YXRpYyBjaGFyIHRtcFs5XTsKKwlzdGF0aWMgY2hhciB0bXBbMTddOwogCWNoYXIgKnAgPSB0bXA7Ci0JbWVtY3B5KHRtcCwgbmFtZSwgOCk7Ci0JdG1wWzhdID0gJ1wwJzsKLQl3aGlsZSAoKnAgJiYgKCFpc3NwYWNlKCpwKSkpCisJbWVtY3B5KHRtcCwgbmFtZSwgbGVuKTsKKwl0bXBbbGVuXSA9ICdcMCc7CisJd2hpbGUgKCpwICYmICgocCAtIHRtcCkgPCBsZW4pICYmICghaXNzcGFjZSgqcCkpKQogCQlwKys7CiAJKnAgPSAnXDAnOwogCXJldHVybiB0bXA7CiB9CiAKK3N0YXRpYyBjaGFyICpuZXRpdWN2X3ByaW50dXNlcihzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uKQoreworCXN0YXRpYyBjaGFyIHRtcF91aWRbOV07CisJc3RhdGljIGNoYXIgdG1wX3VkYXRbMTddOworCXN0YXRpYyBjaGFyIGJ1ZlsxMDBdOworCisJaWYgKG1lbWNtcChjb25uLT51c2VyZGF0YSwgaXVjdk1hZ2ljX2ViY2RpYywgMTYpKSB7CisJCXRtcF91aWRbOF0gPSAnXDAnOworCQl0bXBfdWRhdFsxNl0gPSAnXDAnOworCQltZW1jcHkodG1wX3VpZCwgY29ubi0+dXNlcmlkLCA4KTsKKwkJbWVtY3B5KHRtcF91aWQsIG5ldGl1Y3ZfcHJpbnRuYW1lKHRtcF91aWQsIDgpLCA4KTsKKwkJbWVtY3B5KHRtcF91ZGF0LCBjb25uLT51c2VyZGF0YSwgMTYpOworCQlFQkNBU0ModG1wX3VkYXQsIDE2KTsKKwkJbWVtY3B5KHRtcF91ZGF0LCBuZXRpdWN2X3ByaW50bmFtZSh0bXBfdWRhdCwgMTYpLCAxNik7CisJCXNwcmludGYoYnVmLCAiJXMuJXMiLCB0bXBfdWlkLCB0bXBfdWRhdCk7CisJCXJldHVybiBidWY7CisJfSBlbHNlCisJCXJldHVybiBuZXRpdWN2X3ByaW50bmFtZShjb25uLT51c2VyaWQsIDgpOworfQorCiAvKioKICAqIFN0YXRlcyBvZiB0aGUgaW50ZXJmYWNlIHN0YXRlbWFjaGluZS4KICAqLwpAQCAtNTYzLDE1ICs1OTAsMTggQEAKIHsKIAlzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uID0gcGF0aC0+cHJpdmF0ZTsKIAlzdHJ1Y3QgaXVjdl9ldmVudCBldjsKKwlzdGF0aWMgY2hhciB0bXBfdXNlcls5XTsKKwlzdGF0aWMgY2hhciB0bXBfdWRhdFsxN107CiAJaW50IHJjOwogCi0JaWYgKG1lbWNtcChpdWN2TWFnaWMsIGlwdXNlciwgMTYpKQotCQkvKiBpcHVzZXIgbXVzdCBtYXRjaCBpdWN2TWFnaWMuICovCi0JCXJldHVybiAtRUlOVkFMOwogCXJjID0gLUVJTlZBTDsKKwltZW1jcHkodG1wX3VzZXIsIG5ldGl1Y3ZfcHJpbnRuYW1lKGlwdm1pZCwgOCksIDgpOworCW1lbWNweSh0bXBfdWRhdCwgaXB1c2VyLCAxNik7CisJRUJDQVNDKHRtcF91ZGF0LCAxNik7CiAJcmVhZF9sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZpdWN2X2Nvbm5lY3Rpb25fbGlzdCwgbGlzdCkgewotCQlpZiAoc3RybmNtcChpcHZtaWQsIGNvbm4tPnVzZXJpZCwgOCkpCisJCWlmIChzdHJuY21wKGlwdm1pZCwgY29ubi0+dXNlcmlkLCA4KSB8fAorCQkgICAgc3RybmNtcChpcHVzZXIsIGNvbm4tPnVzZXJkYXRhLCAxNikpCiAJCQljb250aW51ZTsKIAkJLyogRm91bmQgYSBtYXRjaGluZyBjb25uZWN0aW9uIGZvciB0aGlzIHBhdGguICovCiAJCWNvbm4tPnBhdGggPSBwYXRoOwpAQCAtNTgwLDYgKzYxMCw4IEBACiAJCWZzbV9ldmVudChjb25uLT5mc20sIENPTk5fRVZFTlRfQ09OTl9SRVEsICZldik7CiAJCXJjID0gMDsKIAl9CisJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsICJDb25uZWN0aW9uIHJlcXVlc3RlZCBmb3IgJXMuJXNcbiIsCisJCSAgICAgICB0bXBfdXNlciwgbmV0aXVjdl9wcmludG5hbWUodG1wX3VkYXQsIDE2KSk7CiAJcmVhZF91bmxvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOwogCXJldHVybiByYzsKIH0KQEAgLTgxNiw3ICs4NDgsNyBAQAogCWNvbm4tPnBhdGggPSBwYXRoOwogCXBhdGgtPm1zZ2xpbSA9IE5FVElVQ1ZfUVVFVUVMRU5fREVGQVVMVDsKIAlwYXRoLT5mbGFncyA9IDA7Ci0JcmMgPSBpdWN2X3BhdGhfYWNjZXB0KHBhdGgsICZuZXRpdWN2X2hhbmRsZXIsIE5VTEwsIGNvbm4pOworCXJjID0gaXVjdl9wYXRoX2FjY2VwdChwYXRoLCAmbmV0aXVjdl9oYW5kbGVyLCBjb25uLT51c2VyZGF0YSAsIGNvbm4pOwogCWlmIChyYykgewogCQlJVUNWX0RCRl9URVhUXyhzZXR1cCwgMiwgInJjICVkIGZyb20gaXVjdl9hY2NlcHQiLCByYyk7CiAJCXJldHVybjsKQEAgLTg1NCw3ICs4ODYsNyBAQAogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19mdW5jX18pOwogCWZzbV9kZWx0aW1lcigmY29ubi0+dGltZXIpOwotCWl1Y3ZfcGF0aF9zZXZlcihjb25uLT5wYXRoLCBOVUxMKTsKKwlpdWN2X3BhdGhfc2V2ZXIoY29ubi0+cGF0aCwgY29ubi0+dXNlcmRhdGEpOwogCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9TVEFSVFdBSVQpOwogfQogCkBAIC04NjcsOSArODk5LDkgQEAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX2Z1bmNfXyk7CiAKIAlmc21fZGVsdGltZXIoJmNvbm4tPnRpbWVyKTsKLQlpdWN2X3BhdGhfc2V2ZXIoY29ubi0+cGF0aCwgTlVMTCk7Ci0JZGV2X2luZm8ocHJpdnB0ci0+ZGV2LCAiVGhlIHBlZXIgaW50ZXJmYWNlIG9mIHRoZSBJVUNWIGRldmljZSIKLQkJIiBoYXMgY2xvc2VkIHRoZSBjb25uZWN0aW9uXG4iKTsKKwlpdWN2X3BhdGhfc2V2ZXIoY29ubi0+cGF0aCwgY29ubi0+dXNlcmRhdGEpOworCWRldl9pbmZvKHByaXZwdHItPmRldiwgIlRoZSBwZWVyIHovVk0gZ3Vlc3QgJXMgaGFzIGNsb3NlZCB0aGUgIgorCQkJICAgICAgICJjb25uZWN0aW9uXG4iLCBuZXRpdWN2X3ByaW50dXNlcihjb25uKSk7CiAJSVVDVl9EQkZfVEVYVChkYXRhLCAyLAogCQkgICAgICAiY29ubl9hY3Rpb25fY29ubnNldmVyOiBSZW1vdGUgZHJvcHBlZCBjb25uZWN0aW9uXG4iKTsKIAlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfU1RBUlRXQUlUKTsKQEAgLTg4Niw4ICs5MTgsNiBAQAogCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDMsIF9fZnVuY19fKTsKIAogCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9TVEFSVFdBSVQpOwotCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLCAiJXMoJyVzJyk6IGNvbm5lY3RpbmcgLi4uXG4iLAotCQluZXRkZXYtPm5hbWUsIGNvbm4tPnVzZXJpZCk7CiAKIAkvKgogCSAqIFdlIG11c3Qgc2V0IHRoZSBzdGF0ZSBiZWZvcmUgY2FsbGluZyBpdWN2X2Nvbm5lY3QgYmVjYXVzZSB0aGUKQEAgLTg5Nyw4ICs5MjcsMTEgQEAKIAogCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9TRVRVUFdBSVQpOwogCWNvbm4tPnBhdGggPSBpdWN2X3BhdGhfYWxsb2MoTkVUSVVDVl9RVUVVRUxFTl9ERUZBVUxULCAwLCBHRlBfS0VSTkVMKTsKKwlJVUNWX0RCRl9URVhUXyhzZXR1cCwgMiwgIiVzOiBjb25uZWN0aW5nIHRvICVzIC4uLlxuIiwKKwkJbmV0ZGV2LT5uYW1lLCBuZXRpdWN2X3ByaW50dXNlcihjb25uKSk7CisKIAlyYyA9IGl1Y3ZfcGF0aF9jb25uZWN0KGNvbm4tPnBhdGgsICZuZXRpdWN2X2hhbmRsZXIsIGNvbm4tPnVzZXJpZCwKLQkJCSAgICAgICBOVUxMLCBpdWN2TWFnaWMsIGNvbm4pOworCQkJICAgICAgIE5VTEwsIGNvbm4tPnVzZXJkYXRhLCBjb25uKTsKIAlzd2l0Y2ggKHJjKSB7CiAJY2FzZSAwOgogCQluZXRkZXYtPnR4X3F1ZXVlX2xlbiA9IGNvbm4tPnBhdGgtPm1zZ2xpbTsKQEAgLTkwOCwxMyArOTQxLDEzIEBACiAJY2FzZSAxMToKIAkJZGV2X3dhcm4ocHJpdnB0ci0+ZGV2LAogCQkJIlRoZSBJVUNWIGRldmljZSBmYWlsZWQgdG8gY29ubmVjdCB0byB6L1ZNIGd1ZXN0ICVzXG4iLAotCQkJbmV0aXVjdl9wcmludG5hbWUoY29ubi0+dXNlcmlkKSk7CisJCQluZXRpdWN2X3ByaW50bmFtZShjb25uLT51c2VyaWQsIDgpKTsKIAkJZnNtX25ld3N0YXRlKGZpLCBDT05OX1NUQVRFX1NUQVJUV0FJVCk7CiAJCWJyZWFrOwogCWNhc2UgMTI6CiAJCWRldl93YXJuKHByaXZwdHItPmRldiwKIAkJCSJUaGUgSVVDViBkZXZpY2UgZmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHBlZXIgb24gei9WTSIKLQkJCSIgZ3Vlc3QgJXNcbiIsIG5ldGl1Y3ZfcHJpbnRuYW1lKGNvbm4tPnVzZXJpZCkpOworCQkJIiBndWVzdCAlc1xuIiwgbmV0aXVjdl9wcmludG5hbWUoY29ubi0+dXNlcmlkLCA4KSk7CiAJCWZzbV9uZXdzdGF0ZShmaSwgQ09OTl9TVEFURV9TVEFSVFdBSVQpOwogCQlicmVhazsKIAljYXNlIDEzOgpAQCAtOTI3LDcgKzk2MCw3IEBACiAJCWRldl9lcnIocHJpdnB0ci0+ZGV2LAogCQkJInovVk0gZ3Vlc3QgJXMgaGFzIHRvbyBtYW55IElVQ1YgY29ubmVjdGlvbnMiCiAJCQkiIHRvIGNvbm5lY3Qgd2l0aCB0aGUgSVVDViBkZXZpY2VcbiIsCi0JCQluZXRpdWN2X3ByaW50bmFtZShjb25uLT51c2VyaWQpKTsKKwkJCW5ldGl1Y3ZfcHJpbnRuYW1lKGNvbm4tPnVzZXJpZCwgOCkpOwogCQlmc21fbmV3c3RhdGUoZmksIENPTk5fU1RBVEVfQ09OTkVSUik7CiAJCWJyZWFrOwogCWNhc2UgMTU6CkBAIC05NzIsNyArMTAwNSw3IEBACiAJbmV0aXVjdl9wdXJnZV9za2JfcXVldWUoJmNvbm4tPmNvbGxlY3RfcXVldWUpOwogCWlmIChjb25uLT5wYXRoKSB7CiAJCUlVQ1ZfREJGX1RFWFQodHJhY2UsIDUsICJjYWxsaW5nIGl1Y3ZfcGF0aF9zZXZlclxuIik7Ci0JCWl1Y3ZfcGF0aF9zZXZlcihjb25uLT5wYXRoLCBpdWN2TWFnaWMpOworCQlpdWN2X3BhdGhfc2V2ZXIoY29ubi0+cGF0aCwgY29ubi0+dXNlcmRhdGEpOwogCQlrZnJlZShjb25uLT5wYXRoKTsKIAkJY29ubi0+cGF0aCA9IE5VTEw7CiAJfQpAQCAtMTA5MCw3ICsxMTIzLDggQEAKIAkJCWZzbV9uZXdzdGF0ZShmaSwgREVWX1NUQVRFX1JVTk5JTkcpOwogCQkJZGV2X2luZm8ocHJpdnB0ci0+ZGV2LAogCQkJCSJUaGUgSVVDViBkZXZpY2UgaGFzIGJlZW4gY29ubmVjdGVkIgotCQkJCSIgc3VjY2Vzc2Z1bGx5IHRvICVzXG4iLCBwcml2cHRyLT5jb25uLT51c2VyaWQpOworCQkJCSIgc3VjY2Vzc2Z1bGx5IHRvICVzXG4iLAorCQkJCW5ldGl1Y3ZfcHJpbnR1c2VyKHByaXZwdHItPmNvbm4pKTsKIAkJCUlVQ1ZfREJGX1RFWFQoc2V0dXAsIDMsCiAJCQkJImNvbm5lY3Rpb24gaXMgdXAgYW5kIHJ1bm5pbmdcbiIpOwogCQkJYnJlYWs7CkBAIC0xNDUyLDcgKzE0ODYsNTUgQEAKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2ID0gZGV2X2dldF9kcnZkYXRhKGRldik7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCA1LCBfX2Z1bmNfXyk7Ci0JcmV0dXJuIHNwcmludGYoYnVmLCAiJXNcbiIsIG5ldGl1Y3ZfcHJpbnRuYW1lKHByaXYtPmNvbm4tPnVzZXJpZCkpOworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVzXG4iLCBuZXRpdWN2X3ByaW50dXNlcihwcml2LT5jb25uKSk7Cit9CisKK3N0YXRpYyBpbnQgbmV0aXVjdl9jaGVja191c2VyKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBjaGFyICp1c2VybmFtZSwKKwkJCSAgICAgIGNoYXIgKnVzZXJkYXRhKQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IGk7CisKKwlwID0gc3RyY2hyKGJ1ZiwgJy4nKTsKKwlpZiAoKHAgJiYgKChjb3VudCA+IDI2KSB8fAorCQkgICAoKHAgLSBidWYpID4gOCkgfHwKKwkJICAgKGJ1ZiArIGNvdW50IC0gcCA+IDE4KSkpIHx8CisJICAgICghcCAmJiAoY291bnQgPiA5KSkpIHsKKwkJSVVDVl9EQkZfVEVYVChzZXR1cCwgMiwgImNvbm5fd3JpdGU6IHRvbyBsb25nXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMCwgcCA9IGJ1ZjsgaSA8IDggJiYgKnAgJiYgKnAgIT0gJy4nOyBpKyssIHArKykgeworCQlpZiAoaXNhbG51bSgqcCkgfHwgKnAgPT0gJyQnKSB7CisJCQl1c2VybmFtZVtpXSA9IHRvdXBwZXIoKnApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCpwID09ICdcbicpCisJCQkvKiB0cmFpbGluZyBsZiwgZ3JyICovCisJCQlicmVhazsKKwkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsCisJCQkgICAgICAgImNvbm5fd3JpdGU6IGludmFsaWQgY2hhcmFjdGVyICUwMnhcbiIsICpwKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXdoaWxlIChpIDwgOCkKKwkJdXNlcm5hbWVbaSsrXSA9ICcgJzsKKwl1c2VybmFtZVs4XSA9ICdcMCc7CisKKwlpZiAoKnAgPT0gJy4nKSB7CisJCXArKzsKKwkJZm9yIChpID0gMDsgaSA8IDE2ICYmICpwOyBpKyssIHArKykgeworCQkJaWYgKCpwID09ICdcbicpCisJCQkJYnJlYWs7CisJCQl1c2VyZGF0YVtpXSA9IHRvdXBwZXIoKnApOworCQl9CisJCXdoaWxlIChpID4gMCAmJiBpIDwgMTYpCisJCQl1c2VyZGF0YVtpKytdID0gJyAnOworCX0gZWxzZQorCQltZW1jcHkodXNlcmRhdGEsIGl1Y3ZNYWdpY19hc2NpaSwgMTYpOworCXVzZXJkYXRhWzE2XSA9ICdcMCc7CisJQVNDRUJDKHVzZXJkYXRhLCAxNik7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHNzaXplX3QgdXNlcl93cml0ZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLApAQCAtMTQ2MCwzNiArMTU0MiwxNSBAQAogewogCXN0cnVjdCBuZXRpdWN2X3ByaXYgKnByaXYgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldiA9IHByaXYtPmNvbm4tPm5ldGRldjsKLQljaGFyICAgICpwOwotCWNoYXIgICAgKnRtcDsKLQljaGFyIAl1c2VybmFtZVs5XTsKLQlpbnQgCWk7CisJY2hhcgl1c2VybmFtZVs5XTsKKwljaGFyCXVzZXJkYXRhWzE3XTsKKwlpbnQJcmM7CiAJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY3A7CiAKIAlJVUNWX0RCRl9URVhUKHRyYWNlLCAzLCBfX2Z1bmNfXyk7Ci0JaWYgKGNvdW50ID4gOSkgewotCQlJVUNWX0RCRl9URVhUXyhzZXR1cCwgMiwKLQkJCSAgICAgICAiJWQgaXMgbGVuZ3RoIG9mIHVzZXJuYW1lXG4iLCAoaW50KSBjb3VudCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXRtcCA9IHN0cnNlcCgoY2hhciAqKikgJmJ1ZiwgIlxuIik7Ci0JZm9yIChpID0gMCwgcCA9IHRtcDsgaSA8IDggJiYgKnA7IGkrKywgcCsrKSB7Ci0JCWlmIChpc2FsbnVtKCpwKSB8fCAoKnAgPT0gJyQnKSkgewotCQkJdXNlcm5hbWVbaV09IHRvdXBwZXIoKnApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCpwID09ICdcbicpIHsKLQkJCS8qIHRyYWlsaW5nIGxmLCBncnIgKi8KLQkJCWJyZWFrOwotCQl9Ci0JCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLAotCQkJICAgICAgICJ1c2VybmFtZTogaW52YWxpZCBjaGFyYWN0ZXIgJWNcbiIsICpwKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCXdoaWxlIChpIDwgOCkKLQkJdXNlcm5hbWVbaSsrXSA9ICcgJzsKLQl1c2VybmFtZVs4XSA9ICdcMCc7CisJcmMgPSBuZXRpdWN2X2NoZWNrX3VzZXIoYnVmLCBjb3VudCwgdXNlcm5hbWUsIHVzZXJkYXRhKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKIAogCWlmIChtZW1jbXAodXNlcm5hbWUsIHByaXYtPmNvbm4tPnVzZXJpZCwgOSkgJiYKIAkgICAgKG5kZXYtPmZsYWdzICYgKElGRl9VUCB8IElGRl9SVU5OSU5HKSkpIHsKQEAgLTE0OTksMTUgKzE1NjAsMTcgQEAKIAl9CiAJcmVhZF9sb2NrX2JoKCZpdWN2X2Nvbm5lY3Rpb25fcndsb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNwLCAmaXVjdl9jb25uZWN0aW9uX2xpc3QsIGxpc3QpIHsKLQkJaWYgKCFzdHJuY21wKHVzZXJuYW1lLCBjcC0+dXNlcmlkLCA5KSAmJiBjcC0+bmV0ZGV2ICE9IG5kZXYpIHsKKwkJaWYgKCFzdHJuY21wKHVzZXJuYW1lLCBjcC0+dXNlcmlkLCA5KSAmJgorCQkgICAhc3RybmNtcCh1c2VyZGF0YSwgY3AtPnVzZXJkYXRhLCAxNykgJiYgY3AtPm5ldGRldiAhPSBuZGV2KSB7CiAJCQlyZWFkX3VubG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7Ci0JCQlJVUNWX0RCRl9URVhUXyhzZXR1cCwgMiwgInVzZXJfd3JpdGU6IENvbm5lY3Rpb24gIgotCQkJCSJ0byAlcyBhbHJlYWR5IGV4aXN0c1xuIiwgdXNlcm5hbWUpOworCQkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsICJ1c2VyX3dyaXRlOiBDb25uZWN0aW9uIHRvICVzICIKKwkJCQkiYWxyZWFkeSBleGlzdHNcbiIsIG5ldGl1Y3ZfcHJpbnR1c2VyKGNwKSk7CiAJCQlyZXR1cm4gLUVFWElTVDsKIAkJfQogCX0KIAlyZWFkX3VubG9ja19iaCgmaXVjdl9jb25uZWN0aW9uX3J3bG9jayk7CiAJbWVtY3B5KHByaXYtPmNvbm4tPnVzZXJpZCwgdXNlcm5hbWUsIDkpOworCW1lbWNweShwcml2LT5jb25uLT51c2VyZGF0YSwgdXNlcmRhdGEsIDE3KTsKIAlyZXR1cm4gY291bnQ7CiB9CiAKQEAgLTE1MzcsNyArMTYwMCw4IEBACiAJYnMxID0gc2ltcGxlX3N0cnRvdWwoYnVmLCAmZSwgMCk7CiAKIAlpZiAoZSAmJiAoIWlzc3BhY2UoKmUpKSkgewotCQlJVUNWX0RCRl9URVhUXyhzZXR1cCwgMiwgImJ1ZmZlcl93cml0ZTogaW52YWxpZCBjaGFyICVjXG4iLCAqZSk7CisJCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLCAiYnVmZmVyX3dyaXRlOiBpbnZhbGlkIGNoYXIgJTAyeFxuIiwKKwkJCSplKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChiczEgPiBORVRJVUNWX0JVRlNJWkVfTUFYKSB7CkBAIC0xODY0LDcgKzE5MjgsOCBAQAogICogQWRkIGl0IHRvIHRoZSBsaXN0IG9mIG5ldGl1Y3YgY29ubmVjdGlvbnM7CiAgKi8KIHN0YXRpYyBzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpuZXRpdWN2X25ld19jb25uZWN0aW9uKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkJCQkgICAgICBjaGFyICp1c2VybmFtZSkKKwkJCQkJCSAgICAgIGNoYXIgKnVzZXJuYW1lLAorCQkJCQkJICAgICAgY2hhciAqdXNlcmRhdGEpCiB7CiAJc3RydWN0IGl1Y3ZfY29ubmVjdGlvbiAqY29ubjsKIApAQCAtMTg5Myw2ICsxOTU4LDggQEAKIAlmc21fc2V0dGltZXIoY29ubi0+ZnNtLCAmY29ubi0+dGltZXIpOwogCWZzbV9uZXdzdGF0ZShjb25uLT5mc20sIENPTk5fU1RBVEVfSU5WQUxJRCk7CiAKKwlpZiAodXNlcmRhdGEpCisJCW1lbWNweShjb25uLT51c2VyZGF0YSwgdXNlcmRhdGEsIDE3KTsKIAlpZiAodXNlcm5hbWUpIHsKIAkJbWVtY3B5KGNvbm4tPnVzZXJpZCwgdXNlcm5hbWUsIDkpOwogCQlmc21fbmV3c3RhdGUoY29ubi0+ZnNtLCBDT05OX1NUQVRFX1NUT1BQRUQpOwpAQCAtMTkxOSw2ICsxOTg2LDcgQEAKICAqLwogc3RhdGljIHZvaWQgbmV0aXVjdl9yZW1vdmVfY29ubmVjdGlvbihzdHJ1Y3QgaXVjdl9jb25uZWN0aW9uICpjb25uKQogeworCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19mdW5jX18pOwogCXdyaXRlX2xvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOwogCWxpc3RfZGVsX2luaXQoJmNvbm4tPmxpc3QpOwpAQCAtMTkyNiw3ICsxOTk0LDcgQEAKIAlmc21fZGVsdGltZXIoJmNvbm4tPnRpbWVyKTsKIAluZXRpdWN2X3B1cmdlX3NrYl9xdWV1ZSgmY29ubi0+Y29sbGVjdF9xdWV1ZSk7CiAJaWYgKGNvbm4tPnBhdGgpIHsKLQkJaXVjdl9wYXRoX3NldmVyKGNvbm4tPnBhdGgsIGl1Y3ZNYWdpYyk7CisJCWl1Y3ZfcGF0aF9zZXZlcihjb25uLT5wYXRoLCBjb25uLT51c2VyZGF0YSk7CiAJCWtmcmVlKGNvbm4tPnBhdGgpOwogCQljb25uLT5wYXRoID0gTlVMTDsKIAl9CkBAIC0xOTg1LDcgKzIwNTMsNyBAQAogLyoqCiAgKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBldmVyeXRoaW5nIG9mIGEgbmV0IGRldmljZS4KICAqLwotc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRpdWN2X2luaXRfbmV0ZGV2aWNlKGNoYXIgKnVzZXJuYW1lKQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRpdWN2X2luaXRfbmV0ZGV2aWNlKGNoYXIgKnVzZXJuYW1lLCBjaGFyICp1c2VyZGF0YSkKIHsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2cHRyOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CkBAIC0yMDA0LDcgKzIwNzIsNyBAQAogCWlmICghcHJpdnB0ci0+ZnNtKQogCQlnb3RvIG91dF9uZXRkZXY7CiAKLQlwcml2cHRyLT5jb25uID0gbmV0aXVjdl9uZXdfY29ubmVjdGlvbihkZXYsIHVzZXJuYW1lKTsKKwlwcml2cHRyLT5jb25uID0gbmV0aXVjdl9uZXdfY29ubmVjdGlvbihkZXYsIHVzZXJuYW1lLCB1c2VyZGF0YSk7CiAJaWYgKCFwcml2cHRyLT5jb25uKSB7CiAJCUlVQ1ZfREJGX1RFWFQoc2V0dXAsIDIsICJOVUxMIGZyb20gbmV0aXVjdl9uZXdfY29ubmVjdGlvblxuIik7CiAJCWdvdG8gb3V0X2ZzbTsKQEAgLTIwMjIsNDcgKzIwOTAsMzEgQEAKIHN0YXRpYyBzc2l6ZV90IGNvbm5fd3JpdGUoc3RydWN0IGRldmljZV9kcml2ZXIgKmRydiwKIAkJCSAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCiB7Ci0JY29uc3QgY2hhciAqcDsKIAljaGFyIHVzZXJuYW1lWzldOwotCWludCBpLCByYzsKKwljaGFyIHVzZXJkYXRhWzE3XTsKKwlpbnQgcmM7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgbmV0aXVjdl9wcml2ICpwcml2OwogCXN0cnVjdCBpdWN2X2Nvbm5lY3Rpb24gKmNwOwogCiAJSVVDVl9EQkZfVEVYVCh0cmFjZSwgMywgX19mdW5jX18pOwotCWlmIChjb3VudD45KSB7Ci0JCUlVQ1ZfREJGX1RFWFQoc2V0dXAsIDIsICJjb25uX3dyaXRlOiB0b28gbG9uZ1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWZvciAoaSA9IDAsIHAgPSBidWY7IGkgPCA4ICYmICpwOyBpKyssIHArKykgewotCQlpZiAoaXNhbG51bSgqcCkgfHwgKnAgPT0gJyQnKSB7Ci0JCQl1c2VybmFtZVtpXSA9IHRvdXBwZXIoKnApOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCpwID09ICdcbicpCi0JCQkvKiB0cmFpbGluZyBsZiwgZ3JyICovCi0JCQlicmVhazsKLQkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsCi0JCQkgICAgICAgImNvbm5fd3JpdGU6IGludmFsaWQgY2hhcmFjdGVyICVjXG4iLCAqcCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQl3aGlsZSAoaSA8IDgpCi0JCXVzZXJuYW1lW2krK10gPSAnICc7Ci0JdXNlcm5hbWVbOF0gPSAnXDAnOworCXJjID0gbmV0aXVjdl9jaGVja191c2VyKGJ1ZiwgY291bnQsIHVzZXJuYW1lLCB1c2VyZGF0YSk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CiAKIAlyZWFkX2xvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY3AsICZpdWN2X2Nvbm5lY3Rpb25fbGlzdCwgbGlzdCkgewotCQlpZiAoIXN0cm5jbXAodXNlcm5hbWUsIGNwLT51c2VyaWQsIDkpKSB7CisJCWlmICghc3RybmNtcCh1c2VybmFtZSwgY3AtPnVzZXJpZCwgOSkgJiYKKwkJICAgICFzdHJuY21wKHVzZXJkYXRhLCBjcC0+dXNlcmRhdGEsIDE3KSkgewogCQkJcmVhZF91bmxvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOwotCQkJSVVDVl9EQkZfVEVYVF8oc2V0dXAsIDIsICJjb25uX3dyaXRlOiBDb25uZWN0aW9uICIKLQkJCQkidG8gJXMgYWxyZWFkeSBleGlzdHNcbiIsIHVzZXJuYW1lKTsKKwkJCUlVQ1ZfREJGX1RFWFRfKHNldHVwLCAyLCAiY29ubl93cml0ZTogQ29ubmVjdGlvbiB0byAlcyAiCisJCQkJImFscmVhZHkgZXhpc3RzXG4iLCBuZXRpdWN2X3ByaW50dXNlcihjcCkpOwogCQkJcmV0dXJuIC1FRVhJU1Q7CiAJCX0KIAl9CiAJcmVhZF91bmxvY2tfYmgoJml1Y3ZfY29ubmVjdGlvbl9yd2xvY2spOwogCi0JZGV2ID0gbmV0aXVjdl9pbml0X25ldGRldmljZSh1c2VybmFtZSk7CisJZGV2ID0gbmV0aXVjdl9pbml0X25ldGRldmljZSh1c2VybmFtZSwgdXNlcmRhdGEpOwogCWlmICghZGV2KSB7CiAJCUlVQ1ZfREJGX1RFWFQoc2V0dXAsIDIsICJOVUxMIGZyb20gbmV0aXVjdl9pbml0X25ldGRldmljZVxuIik7CiAJCXJldHVybiAtRU5PREVWOwpAQCAtMjA4Myw4ICsyMTM1LDkgQEAKIAlpZiAocmMpCiAJCWdvdG8gb3V0X3VucmVnOwogCi0JZGV2X2luZm8ocHJpdi0+ZGV2LCAiVGhlIElVQ1YgaW50ZXJmYWNlIHRvICVzIGhhcyBiZWVuIgotCQkiIGVzdGFibGlzaGVkIHN1Y2Nlc3NmdWxseVxuIiwgbmV0aXVjdl9wcmludG5hbWUodXNlcm5hbWUpKTsKKwlkZXZfaW5mbyhwcml2LT5kZXYsICJUaGUgSVVDViBpbnRlcmZhY2UgdG8gJXMgaGFzIGJlZW4gZXN0YWJsaXNoZWQgIgorCQkJICAgICJzdWNjZXNzZnVsbHlcbiIsCisJCW5ldGl1Y3ZfcHJpbnR1c2VyKHByaXYtPmNvbm4pKTsKIAogCXJldHVybiBjb3VudDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jIGIvZHJpdmVycy9zMzkwL25ldC9xZXRoX2NvcmVfbWFpbi5jCmluZGV4IGZmZjU3ZGUuLjRmYWUxZGMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9jb3JlX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfY29yZV9tYWluLmMKQEAgLTY2LDcgKzY2LDcgQEAKIHN0YXRpYyB2b2lkIHFldGhfY2xlYXJfb3V0cHV0X2J1ZmZlcihzdHJ1Y3QgcWV0aF9xZGlvX291dF9xICpxdWV1ZSwKIAkJc3RydWN0IHFldGhfcWRpb19vdXRfYnVmZmVyICpidWYsCiAJCWVudW0gcWV0aF9xZGlvX2J1ZmZlcl9zdGF0ZXMgbmV3YnVmc3RhdGUpOwotCitzdGF0aWMgaW50IHFldGhfaW5pdF9xZGlvX291dF9idWYoc3RydWN0IHFldGhfcWRpb19vdXRfcSAqLCBpbnQpOwogCiBzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnFldGhfZ2V0X2NhcmRuYW1lKHN0cnVjdCBxZXRoX2NhcmQgKmNhcmQpCiB7CkBAIC0zNjMsNiArMzYzLDkgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBxZXRoX2NsZWFudXBfaGFuZGxlZF9wZW5kaW5nKHN0cnVjdCBxZXRoX3FkaW9fb3V0X3EgKnEsCiAJaW50IGJpZHgsIGludCBmb3JjZWRfY2xlYW51cCkKIHsKKwlpZiAocS0+Y2FyZC0+b3B0aW9ucy5jcSAhPSBRRVRIX0NRX0VOQUJMRUQpCisJCXJldHVybjsKKwogCWlmIChxLT5idWZzW2JpZHhdLT5uZXh0X3BlbmRpbmcgIT0gTlVMTCkgewogCQlzdHJ1Y3QgcWV0aF9xZGlvX291dF9idWZmZXIgKmhlYWQgPSBxLT5idWZzW2JpZHhdOwogCQlzdHJ1Y3QgcWV0aF9xZGlvX291dF9idWZmZXIgKmMgPSBxLT5idWZzW2JpZHhdLT5uZXh0X3BlbmRpbmc7CkBAIC0zOTAsNiArMzkzLDEzIEBACiAKIAkJfQogCX0KKwlpZiAoZm9yY2VkX2NsZWFudXAgJiYgKGF0b21pY19yZWFkKCYocS0+YnVmc1tiaWR4XS0+c3RhdGUpKSA9PQorCQkJCQlRRVRIX1FESU9fQlVGX0hBTkRMRURfREVMQVlFRCkpIHsKKwkJLyogZm9yIHJlY292ZXJ5IHNpdHVhdGlvbnMgKi8KKwkJcS0+YnVmc1tiaWR4XS0+YW9iID0gcS0+YnVmc3RhdGVzW2JpZHhdLmFvYjsKKwkJcWV0aF9pbml0X3FkaW9fb3V0X2J1ZihxLCBiaWR4KTsKKwkJUUVUSF9DQVJEX1RFWFQocS0+Y2FyZCwgMiwgImNscHJlY292Iik7CisJfQogfQogCiAKQEAgLTQxMiw3ICs0MjIsNiBAQAogCQlub3RpZmljYXRpb24gPSBUWF9OT1RJRllfT0s7CiAJfSBlbHNlIHsKIAkJQlVHX09OKGF0b21pY19yZWFkKCZidWZmZXItPnN0YXRlKSAhPSBRRVRIX1FESU9fQlVGX1BFTkRJTkcpOwotCiAJCWF0b21pY19zZXQoJmJ1ZmZlci0+c3RhdGUsIFFFVEhfUURJT19CVUZfSU5fQ1EpOwogCQlub3RpZmljYXRpb24gPSBUWF9OT1RJRllfREVMQVlFRF9PSzsKIAl9CkBAIC00MjUsNyArNDM0LDggQEAKIAogCWJ1ZmZlci0+YW9iID0gTlVMTDsKIAlxZXRoX2NsZWFyX291dHB1dF9idWZmZXIoYnVmZmVyLT5xLCBidWZmZXIsCi0JCQkJUUVUSF9RRElPX0JVRl9IQU5ETEVEX0RFTEFZRUQpOworCQkJCSBRRVRIX1FESU9fQlVGX0hBTkRMRURfREVMQVlFRCk7CisKIAkvKiBmcm9tIGhlcmUgb246IGRvIG5vdCB0b3VjaCBidWZmZXIgYW55bW9yZSAqLwogCXFkaW9fcmVsZWFzZV9hb2IoYW9iKTsKIH0KQEAgLTExMTMsMTEgKzExMjMsMjUgQEAKIHN0YXRpYyB2b2lkIHFldGhfcmVsZWFzZV9za2JzKHN0cnVjdCBxZXRoX3FkaW9fb3V0X2J1ZmZlciAqYnVmKQogewogCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGl1Y3Zfc29jayAqaXVjdjsKKwlpbnQgbm90aWZ5X2dlbmVyYWxfZXJyb3IgPSAwOworCisJaWYgKGF0b21pY19yZWFkKCZidWYtPnN0YXRlKSA9PSBRRVRIX1FESU9fQlVGX1BFTkRJTkcpCisJCW5vdGlmeV9nZW5lcmFsX2Vycm9yID0gMTsKKworCS8qIHJlbGVhc2UgbWF5IG5ldmVyIGhhcHBlbiBmcm9tIHdpdGhpbiBDUSB0YXNrbGV0IHNjb3BlICovCisJQlVHX09OKGF0b21pY19yZWFkKCZidWYtPnN0YXRlKSA9PSBRRVRIX1FESU9fQlVGX0lOX0NRKTsKIAogCXNrYiA9IHNrYl9kZXF1ZXVlKCZidWYtPnNrYl9saXN0KTsKIAl3aGlsZSAoc2tiKSB7CiAJCVFFVEhfQ0FSRF9URVhUKGJ1Zi0+cS0+Y2FyZCwgNSwgInNrYnIiKTsKIAkJUUVUSF9DQVJEX1RFWFRfKGJ1Zi0+cS0+Y2FyZCwgNSwgIiVseCIsIChsb25nKSBza2IpOworCQlpZiAobm90aWZ5X2dlbmVyYWxfZXJyb3IgJiYgc2tiLT5wcm90b2NvbCA9PSBFVEhfUF9BRl9JVUNWKSB7CisJCQlpZiAoc2tiLT5zaykgeworCQkJCWl1Y3YgPSBpdWN2X3NrKHNrYi0+c2spOworCQkJCWl1Y3YtPnNrX3R4bm90aWZ5KHNrYiwgVFhfTk9USUZZX0dFTkVSQUxFUlJPUik7CisJCQl9CisJCX0KIAkJYXRvbWljX2RlYygmc2tiLT51c2Vycyk7CiAJCWRldl9rZnJlZV9za2JfYW55KHNrYik7CiAJCXNrYiA9IHNrYl9kZXF1ZXVlKCZidWYtPnNrYl9saXN0KTsKQEAgLTExNjAsNyArMTE4NCw3IEBACiAJZm9yIChqID0gMDsgaiA8IFFESU9fTUFYX0JVRkZFUlNfUEVSX1E7ICsraikgewogCQlpZiAoIXEtPmJ1ZnNbal0pCiAJCQljb250aW51ZTsKLQkJcWV0aF9jbGVhbnVwX2hhbmRsZWRfcGVuZGluZyhxLCBqLCBmcmVlKTsKKwkJcWV0aF9jbGVhbnVwX2hhbmRsZWRfcGVuZGluZyhxLCBqLCAxKTsKIAkJcWV0aF9jbGVhcl9vdXRwdXRfYnVmZmVyKHEsIHEtPmJ1ZnNbal0sIFFFVEhfUURJT19CVUZfRU1QVFkpOwogCQlpZiAoZnJlZSkgewogCQkJa21lbV9jYWNoZV9mcmVlKHFldGhfcWRpb19vdXRidWZfY2FjaGUsIHEtPmJ1ZnNbal0pOwpAQCAtMTIwNyw3ICsxMjMxLDcgQEAKIAlxZXRoX2ZyZWVfY3EoY2FyZCk7CiAJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjYXJkLT5idWZmZXJfcmVjbGFpbV93b3JrKTsKIAlmb3IgKGogPSAwOyBqIDwgUURJT19NQVhfQlVGRkVSU19QRVJfUTsgKytqKQotCQlrZnJlZV9za2IoY2FyZC0+cWRpby5pbl9xLT5idWZzW2pdLnJ4X3NrYik7CisJCWRldl9rZnJlZV9za2JfYW55KGNhcmQtPnFkaW8uaW5fcS0+YnVmc1tqXS5yeF9za2IpOwogCWtmcmVlKGNhcmQtPnFkaW8uaW5fcSk7CiAJY2FyZC0+cWRpby5pbl9xID0gTlVMTDsKIAkvKiBpbmJvdW5kIGJ1ZmZlciBwb29sICovCkBAIC0xMzI5LDYgKzEzNTMsNyBAQAogCiBzdGF0aWMgdm9pZCBxZXRoX3N0YXJ0X2tlcm5lbF90aHJlYWQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHM7CiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcWV0aF9jYXJkLAogCQkJCQlrZXJuZWxfdGhyZWFkX3N0YXJ0ZXIpOwogCVFFVEhfQ0FSRF9URVhUKGNhcmQgLCAyLCAic3RydGhyZCIpOwpAQCAtMTMzNiw5ICsxMzYxLDE1IEBACiAJaWYgKGNhcmQtPnJlYWQuc3RhdGUgIT0gQ0hfU1RBVEVfVVAgJiYKIAkgICAgY2FyZC0+d3JpdGUuc3RhdGUgIT0gQ0hfU1RBVEVfVVApCiAJCXJldHVybjsKLQlpZiAocWV0aF9kb19zdGFydF90aHJlYWQoY2FyZCwgUUVUSF9SRUNPVkVSX1RIUkVBRCkpCi0JCWt0aHJlYWRfcnVuKGNhcmQtPmRpc2NpcGxpbmUucmVjb3ZlciwgKHZvaWQgKikgY2FyZCwKKwlpZiAocWV0aF9kb19zdGFydF90aHJlYWQoY2FyZCwgUUVUSF9SRUNPVkVSX1RIUkVBRCkpIHsKKwkJdHMgPSBrdGhyZWFkX3J1bihjYXJkLT5kaXNjaXBsaW5lLnJlY292ZXIsICh2b2lkICopY2FyZCwKIAkJCQkicWV0aF9yZWNvdmVyIik7CisJCWlmIChJU19FUlIodHMpKSB7CisJCQlxZXRoX2NsZWFyX3RocmVhZF9zdGFydF9iaXQoY2FyZCwgUUVUSF9SRUNPVkVSX1RIUkVBRCk7CisJCQlxZXRoX2NsZWFyX3RocmVhZF9ydW5uaW5nX2JpdChjYXJkLAorCQkJCVFFVEhfUkVDT1ZFUl9USFJFQUQpOworCQl9CisJfQogfQogCiBzdGF0aWMgaW50IHFldGhfc2V0dXBfY2FyZChzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sMl9tYWluLmMKaW5kZXggYTIxYWUzZC4uYzEyOTY3MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wyX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDJfbWFpbi5jCkBAIC0zMDEsMjEgKzMwMSwyMSBAQAogCXNwaW5fdW5sb2NrX2JoKCZjYXJkLT52bGFubG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHFldGhfbDJfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3N0YXRpYyBpbnQgcWV0aF9sMl92bGFuX3J4X2FkZF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQogewogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXYtPm1sX3ByaXY7CiAJc3RydWN0IHFldGhfdmxhbl92aWQgKmlkOwogCiAJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJhaWQ6JWQiLCB2aWQpOwogCWlmICghdmlkKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCWlmIChjYXJkLT5pbmZvLnR5cGUgPT0gUUVUSF9DQVJEX1RZUEVfT1NNKSB7CiAJCVFFVEhfQ0FSRF9URVhUKGNhcmQsIDMsICJhaWRPU00iKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gMDsKIAl9CiAJaWYgKHFldGhfd2FpdF9mb3JfdGhyZWFkcyhjYXJkLCBRRVRIX1JFQ09WRVJfVEhSRUFEKSkgewogCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAiYWlkUkVDIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCWlkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHFldGhfdmxhbl92aWQpLCBHRlBfQVRPTUlDKTsKIAlpZiAoaWQpIHsKQEAgLTMyNCwxMCArMzI0LDEzIEBACiAJCXNwaW5fbG9ja19iaCgmY2FyZC0+dmxhbmxvY2spOwogCQlsaXN0X2FkZF90YWlsKCZpZC0+bGlzdCwgJmNhcmQtPnZpZF9saXN0KTsKIAkJc3Bpbl91bmxvY2tfYmgoJmNhcmQtPnZsYW5sb2NrKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gLUVOT01FTTsKIAl9CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHFldGhfbDJfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCitzdGF0aWMgaW50IHFldGhfbDJfdmxhbl9yeF9raWxsX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCiB7CiAJc3RydWN0IHFldGhfdmxhbl92aWQgKmlkLCAqdG1waWQgPSBOVUxMOwogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXYtPm1sX3ByaXY7CkBAIC0zMzUsMTEgKzMzOCwxMSBAQAogCVFFVEhfQ0FSRF9URVhUXyhjYXJkLCA0LCAia2lkOiVkIiwgdmlkKTsKIAlpZiAoY2FyZC0+aW5mby50eXBlID09IFFFVEhfQ0FSRF9UWVBFX09TTSkgewogCQlRRVRIX0NBUkRfVEVYVChjYXJkLCAzLCAia2lkT1NNIik7Ci0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAJfQogCWlmIChxZXRoX3dhaXRfZm9yX3RocmVhZHMoY2FyZCwgUUVUSF9SRUNPVkVSX1RIUkVBRCkpIHsKIAkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgImtpZFJFQyIpOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAlzcGluX2xvY2tfYmgoJmNhcmQtPnZsYW5sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlkLCAmY2FyZC0+dmlkX2xpc3QsIGxpc3QpIHsKQEAgLTM1NSw2ICszNTgsNyBAQAogCQlrZnJlZSh0bXBpZCk7CiAJfQogCXFldGhfbDJfc2V0X211bHRpY2FzdF9saXN0KGNhcmQtPmRldik7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgcWV0aF9sMl9zdG9wX2NhcmQoc3RydWN0IHFldGhfY2FyZCAqY2FyZCwgaW50IHJlY292ZXJ5X21vZGUpCkBAIC0xMTY5LDYgKzExNzMsNyBAQAogc3RhdGljIHZvaWQgcWV0aF9sMl9zaHV0ZG93bihzdHJ1Y3QgY2N3Z3JvdXBfZGV2aWNlICpnZGV2KQogewogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoJmdkZXYtPmRldik7CisJcWV0aF9zZXRfYWxsb3dlZF90aHJlYWRzKGNhcmQsIDAsIDEpOwogCWlmICgoZ2Rldi0+c3RhdGUgPT0gQ0NXR1JPVVBfT05MSU5FKSAmJiBjYXJkLT5pbmZvLmh3dHJhcCkKIAkJcWV0aF9od190cmFwKGNhcmQsIFFFVEhfRElBR1NfVFJBUF9ESVNBUk0pOwogCXFldGhfcWRpb19jbGVhcl9jYXJkKGNhcmQsIDApOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYyBiL2RyaXZlcnMvczM5MC9uZXQvcWV0aF9sM19tYWluLmMKaW5kZXggNGQ1MzA3ZC4uOTY0OGU0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zMzkwL25ldC9xZXRoX2wzX21haW4uYworKysgYi9kcml2ZXJzL3MzOTAvbmV0L3FldGhfbDNfbWFpbi5jCkBAIC0xODY5LDE1ICsxODY5LDE1IEBACiAJcWV0aF9sM19mcmVlX3ZsYW5fYWRkcmVzc2VzNihjYXJkLCB2aWQpOwogfQogCi1zdGF0aWMgdm9pZCBxZXRoX2wzX3ZsYW5fcnhfYWRkX3ZpZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCitzdGF0aWMgaW50IHFldGhfbDNfdmxhbl9yeF9hZGRfdmlkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKIHsKIAlzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkID0gZGV2LT5tbF9wcml2OwogCiAJc2V0X2JpdCh2aWQsIGNhcmQtPmFjdGl2ZV92bGFucyk7Ci0JcmV0dXJuOworCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCBxZXRoX2wzX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQorc3RhdGljIGludCBxZXRoX2wzX3ZsYW5fcnhfa2lsbF92aWQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQogewogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXYtPm1sX3ByaXY7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTE4ODUsNyArMTg4NSw3IEBACiAJUUVUSF9DQVJEX1RFWFRfKGNhcmQsIDQsICJraWQ6JWQiLCB2aWQpOwogCWlmIChxZXRoX3dhaXRfZm9yX3RocmVhZHMoY2FyZCwgUUVUSF9SRUNPVkVSX1RIUkVBRCkpIHsKIAkJUUVUSF9DQVJEX1RFWFQoY2FyZCwgMywgImtpZFJFQyIpOwotCQlyZXR1cm47CisJCXJldHVybiAwOwogCX0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dmxhbmxvY2ssIGZsYWdzKTsKIAkvKiB1bnJlZ2lzdGVyIElQIGFkZHJlc3NlcyBvZiB2bGFuIGRldmljZSAqLwpAQCAtMTg5Myw2ICsxODkzLDcgQEAKIAljbGVhcl9iaXQodmlkLCBjYXJkLT5hY3RpdmVfdmxhbnMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnZsYW5sb2NrLCBmbGFncyk7CiAJcWV0aF9sM19zZXRfbXVsdGljYXN0X2xpc3QoY2FyZC0+ZGV2KTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgcWV0aF9sM19yZWJ1aWxkX3NrYihzdHJ1Y3QgcWV0aF9jYXJkICpjYXJkLApAQCAtMjc1OSw3ICsyNzYwLDcgQEAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZHN0ID0gc2tiX2RzdChza2IpOwogCWlmIChkc3QpCi0JCW4gPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOworCQluID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoZHN0KTsKIAlpZiAobikgewogCQljYXN0X3R5cGUgPSBuLT50eXBlOwogCQlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTI4NTUsNyArMjg1Niw3IEBACiAJcmN1X3JlYWRfbG9jaygpOwogCWRzdCA9IHNrYl9kc3Qoc2tiKTsKIAlpZiAoZHN0KQotCQluID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwkJbiA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKGRzdCk7CiAJaWYgKGlwdiA9PSA0KSB7CiAJCS8qIElQdjQgKi8KIAkJaGRyLT5oZHIubDMuZmxhZ3MgPSBxZXRoX2wzX2dldF9xZXRoX2hkcl9mbGFnczQoY2FzdF90eXBlKTsKQEAgLTMyMDksNyArMzIxMCw4IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgcWV0aF9sM19maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IHFldGhfbDNfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZCA9IGRldi0+bWxfcHJpdjsKIApAQCAtMzIyMyw3ICszMjI1LDggQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLXN0YXRpYyBpbnQgcWV0aF9sM19zZXRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIGludCBxZXRoX2wzX3NldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBxZXRoX2NhcmQgKmNhcmQgPSBkZXYtPm1sX3ByaXY7CiAJdTMyIGNoYW5nZWQgPSBkZXYtPmZlYXR1cmVzIF4gZmVhdHVyZXM7CkBAIC0zNDg5LDE0ICszNDkyLDEzIEBACiAJZWxzZQogCQluZXRpZl9jYXJyaWVyX29mZihjYXJkLT5kZXYpOwogCWlmIChyZWNvdmVyX2ZsYWcgPT0gQ0FSRF9TVEFURV9SRUNPVkVSKSB7CisJCXJ0bmxfbG9jaygpOwogCQlpZiAocmVjb3ZlcnlfbW9kZSkKIAkJCV9fcWV0aF9sM19vcGVuKGNhcmQtPmRldik7Ci0JCWVsc2UgewotCQkJcnRubF9sb2NrKCk7CisJCWVsc2UKIAkJCWRldl9vcGVuKGNhcmQtPmRldik7Ci0JCQlydG5sX3VubG9jaygpOwotCQl9CiAJCXFldGhfbDNfc2V0X211bHRpY2FzdF9saXN0KGNhcmQtPmRldik7CisJCXJ0bmxfdW5sb2NrKCk7CiAJfQogCS8qIGxldCB1c2VyX3NwYWNlIGtub3cgdGhhdCBkZXZpY2UgaXMgb25saW5lICovCiAJa29iamVjdF91ZXZlbnQoJmdkZXYtPmRldi5rb2JqLCBLT0JKX0NIQU5HRSk7CkBAIC0zNTQyLDYgKzM1NDQsMTEgQEAKIAkJY2FyZC0+aW5mby5od3RyYXAgPSAxOwogCX0KIAlxZXRoX2wzX3N0b3BfY2FyZChjYXJkLCByZWNvdmVyeV9tb2RlKTsKKwlpZiAoKGNhcmQtPm9wdGlvbnMuY3EgPT0gUUVUSF9DUV9FTkFCTEVEKSAmJiBjYXJkLT5kZXYpIHsKKwkJcnRubF9sb2NrKCk7CisJCWNhbGxfbmV0ZGV2aWNlX25vdGlmaWVycyhORVRERVZfUkVCT09ULCBjYXJkLT5kZXYpOworCQlydG5sX3VubG9jaygpOworCX0KIAlyYyAgPSBjY3dfZGV2aWNlX3NldF9vZmZsaW5lKENBUkRfRERFVihjYXJkKSk7CiAJcmMyID0gY2N3X2RldmljZV9zZXRfb2ZmbGluZShDQVJEX1dERVYoY2FyZCkpOwogCXJjMyA9IGNjd19kZXZpY2Vfc2V0X29mZmxpbmUoQ0FSRF9SREVWKGNhcmQpKTsKQEAgLTM1OTYsNiArMzYwMyw3IEBACiBzdGF0aWMgdm9pZCBxZXRoX2wzX3NodXRkb3duKHN0cnVjdCBjY3dncm91cF9kZXZpY2UgKmdkZXYpCiB7CiAJc3RydWN0IHFldGhfY2FyZCAqY2FyZCA9IGRldl9nZXRfZHJ2ZGF0YSgmZ2Rldi0+ZGV2KTsKKwlxZXRoX3NldF9hbGxvd2VkX3RocmVhZHMoY2FyZCwgMCwgMSk7CiAJaWYgKChnZGV2LT5zdGF0ZSA9PSBDQ1dHUk9VUF9PTkxJTkUpICYmIGNhcmQtPmluZm8uaHd0cmFwKQogCQlxZXRoX2h3X3RyYXAoY2FyZCwgUUVUSF9ESUFHU19UUkFQX0RJU0FSTSk7CiAJcWV0aF9xZGlvX2NsZWFyX2NhcmQoY2FyZCwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3MzOTAvc2NzaS96ZmNwX3Njc2kuYyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCmluZGV4IDExZjA3ZjguLmI3OTU3NmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCisrKyBiL2RyaXZlcnMvczM5MC9zY3NpL3pmY3Bfc2NzaS5jCkBAIC01NSw2ICs1NSwxMCBAQAogewogCXN0cnVjdCB6ZmNwX3Njc2lfZGV2ICp6ZmNwX3NkZXYgPSBzZGV2X3RvX3pmY3Aoc2Rldik7CiAKKwkvKiBpZiBwcmV2aW91cyBzbGF2ZV9hbGxvYyByZXR1cm5lZCBlYXJseSwgdGhlcmUgaXMgbm90aGluZyB0byBkbyAqLworCWlmICghemZjcF9zZGV2LT5wb3J0KQorCQlyZXR1cm47CisKIAl6ZmNwX2VycF9sdW5fc2h1dGRvd25fd2FpdChzZGV2LCAic2Nzc2RfMSIpOwogCXB1dF9kZXZpY2UoJnpmY3Bfc2Rldi0+cG9ydC0+ZGV2KTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19pMmMuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2JiY19pMmMuYwppbmRleCA1Zjk0ZDIyLi41NDI2NjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9iYmNfaTJjLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvYmJjX2kyYy5jCkBAIC0yMzMsMTMgKzIzMyw5IEBACiAJaW50IHJldCA9IDA7CiAKIAl3aGlsZSAobGVuID4gMCkgewotCQlpbnQgZXJyID0gYmJjX2kyY193cml0ZWIoY2xpZW50LCAqYnVmLCBvZmYpOwotCi0JCWlmIChlcnIgPCAwKSB7Ci0JCQlyZXQgPSBlcnI7CisJCXJldCA9IGJiY19pMmNfd3JpdGViKGNsaWVudCwgKmJ1Ziwgb2ZmKTsKKwkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKLQkJfQotCiAJCWxlbi0tOwogCQlidWYrKzsKIAkJb2ZmKys7CkBAIC0yNTMsMTEgKzI0OSw5IEBACiAJaW50IHJldCA9IDA7CiAKIAl3aGlsZSAobGVuID4gMCkgewotCQlpbnQgZXJyID0gYmJjX2kyY19yZWFkYihjbGllbnQsIGJ1Ziwgb2ZmKTsKLQkJaWYgKGVyciA8IDApIHsKLQkJCXJldCA9IGVycjsKKwkJcmV0ID0gYmJjX2kyY19yZWFkYihjbGllbnQsIGJ1Ziwgb2ZmKTsKKwkJaWYgKHJldCA8IDApCiAJCQlicmVhazsKLQkJfQogCQlsZW4tLTsKIAkJYnVmKys7CiAJCW9mZisrOwpAQCAtNDIyLDE3ICs0MTYsNiBAQAogCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYmJjX2kyY19yZW1vdmUpLAogfTsKIAotc3RhdGljIGludCBfX2luaXQgYmJjX2kyY19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmYmJjX2kyY19kcml2ZXIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgYmJjX2kyY19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmJiY19pMmNfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoYmJjX2kyY19pbml0KTsKLW1vZHVsZV9leGl0KGJiY19pMmNfZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGJiY19pMmNfZHJpdmVyKTsKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2Rpc3BsYXk3c2VnLmMKaW5kZXggOTY1YTFmYy4uNGI5OTM5NyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zYnVzL2NoYXIvZGlzcGxheTdzZWcuYworKysgYi9kcml2ZXJzL3NidXMvY2hhci9kaXNwbGF5N3NlZy5jCkBAIC0yNzUsMTUgKzI3NSw0IEBACiAJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChkN3NfcmVtb3ZlKSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGQ3c19pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZDdzX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBkN3NfZXhpdCh2b2lkKQotewotCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZkN3NfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZDdzX2luaXQpOwotbW9kdWxlX2V4aXQoZDdzX2V4aXQpOworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihkN3NfZHJpdmVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYyBiL2RyaXZlcnMvc2J1cy9jaGFyL2VudmN0cmwuYwppbmRleCBiZTdiNGU1Li4zMzlmZDZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9lbnZjdHJsLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvZW52Y3RybC5jCkBAIC0xMTM4LDE2ICsxMTM4LDYgQEAKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGVudmN0cmxfcmVtb3ZlKSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IGVudmN0cmxfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmVudmN0cmxfZHJpdmVyKTsKLX0KK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZW52Y3RybF9kcml2ZXIpOwogCi1zdGF0aWMgdm9pZCBfX2V4aXQgZW52Y3RybF9leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmVudmN0cmxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZW52Y3RybF9pbml0KTsKLW1vZHVsZV9leGl0KGVudmN0cmxfZXhpdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jIGIvZHJpdmVycy9zYnVzL2NoYXIvZmxhc2guYwppbmRleCA3M2RkNGU3Li44MjYxNTdmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3NidXMvY2hhci9mbGFzaC5jCisrKyBiL2RyaXZlcnMvc2J1cy9jaGFyL2ZsYXNoLmMKQEAgLTIxNiwxNiArMjE2LDYgQEAKIAkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGZsYXNoX3JlbW92ZSksCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBmbGFzaF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZmxhc2hfZHJpdmVyKTsKLX0KK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIoZmxhc2hfZHJpdmVyKTsKIAotc3RhdGljIHZvaWQgX19leGl0IGZsYXNoX2NsZWFudXAodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZmxhc2hfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQoZmxhc2hfaW5pdCk7Ci1tb2R1bGVfZXhpdChmbGFzaF9jbGVhbnVwKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2J1cy9jaGFyL3VjdHJsLmMgYi9kcml2ZXJzL3NidXMvY2hhci91Y3RybC5jCmluZGV4IGViY2U5NjMuLjBiMzE2NTggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2J1cy9jaGFyL3VjdHJsLmMKKysrIGIvZHJpdmVycy9zYnVzL2NoYXIvdWN0cmwuYwpAQCAtNDM1LDE2ICs0MzUsNiBAQAogfTsKIAogCi1zdGF0aWMgaW50IF9faW5pdCB1Y3RybF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmdWN0cmxfZHJpdmVyKTsKLX0KK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodWN0cmxfZHJpdmVyKTsKIAotc3RhdGljIHZvaWQgX19leGl0IHVjdHJsX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmdWN0cmxfZHJpdmVyKTsKLX0KLQotbW9kdWxlX2luaXQodWN0cmxfaW5pdCk7Ci1tb2R1bGVfZXhpdCh1Y3RybF9leGl0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYyBiL2RyaXZlcnMvc2NzaS9ibngyaS9ibngyaV9od2kuYwppbmRleCBkYmE3MmE0Li4xYWQwYjgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvYm54MmkvYm54MmlfaHdpLmMKKysrIGIvZHJpdmVycy9zY3NpL2JueDJpL2JueDJpX2h3aS5jCkBAIC0xOTA2LDE4ICsxOTA2LDE5IEBACiAJc3Bpbl9sb2NrKCZzZXNzaW9uLT5sb2NrKTsKIAl0YXNrID0gaXNjc2lfaXR0X3RvX3Rhc2soYm54MmlfY29ubi0+Y2xzX2Nvbm4tPmRkX2RhdGEsCiAJCQkJIGNxZS0+aXR0ICYgSVNDU0lfQ01EX1JFU1BPTlNFX0lOREVYKTsKLQlpZiAoIXRhc2spIHsKKwlpZiAoIXRhc2sgfHwgIXRhc2stPnNjKSB7CiAJCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCXNjID0gdGFzay0+c2M7Ci0Jc3Bpbl91bmxvY2soJnNlc3Npb24tPmxvY2spOwogCiAJaWYgKCFibGtfcnFfY3B1X3ZhbGlkKHNjLT5yZXF1ZXN0KSkKIAkJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWVsc2UKIAkJY3B1ID0gc2MtPnJlcXVlc3QtPmNwdTsKIAorCXNwaW5fdW5sb2NrKCZzZXNzaW9uLT5sb2NrKTsKKwogCXAgPSAmcGVyX2NwdShibngyaV9wZXJjcHUsIGNwdSk7CiAJc3Bpbl9sb2NrKCZwLT5wX3dvcmtfbG9jayk7CiAJaWYgKHVubGlrZWx5KCFwLT5pb3RocmVhZCkpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiM2kvY3hnYjNpLmMgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjNpL2N4Z2IzaS5jCmluZGV4IDAwMDI5NGEuLjM2NzM5ZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiM2kvY3hnYjNpLmMKKysrIGIvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2IzaS9jeGdiM2kuYwpAQCAtOTY2LDcgKzk2Niw3IEBACiAJCWNzay0+c2FkZHIuc2luX2FkZHIuc19hZGRyID0gY2hiYS0+aXB2NGFkZHI7CiAKIAljc2stPnJzc19xaWQgPSAwOwotCWNzay0+bDJ0ID0gdDNfbDJ0X2dldCh0M2RldiwgZHN0X2dldF9uZWlnaGJvdXIoZHN0KSwgbmRldik7CisJY3NrLT5sMnQgPSB0M19sMnRfZ2V0KHQzZGV2LCBkc3QsIG5kZXYpOwogCWlmICghY3NrLT5sMnQpIHsKIAkJcHJfZXJyKCJOTyBsMnQgYXZhaWxhYmxlLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9jeGdiNGkvY3hnYjRpLmMKaW5kZXggYWM3YTliMS4uNWE0YTNiZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2N4Z2JpL2N4Z2I0aS9jeGdiNGkuYworKysgYi9kcml2ZXJzL3Njc2kvY3hnYmkvY3hnYjRpL2N4Z2I0aS5jCkBAIC0xMTI3LDYgKzExMjcsNyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZGV2ID0gY2Rldi0+cG9ydHNbY3NrLT5wb3J0X2lkXTsKIAlzdHJ1Y3QgcG9ydF9pbmZvICpwaSA9IG5ldGRldl9wcml2KG5kZXYpOwogCXN0cnVjdCBza19idWZmICpza2IgPSBOVUxMOworCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAJdW5zaWduZWQgaW50IHN0ZXA7CiAKIAlsb2dfZGVidWcoMSA8PCBDWEdCSV9EQkdfVE9FIHwgMSA8PCBDWEdCSV9EQkdfU09DSywKQEAgLTExNDEsNyArMTE0MiwxMiBAQAogCWN4Z2JpX3NvY2tfc2V0X2ZsYWcoY3NrLCBDVFBGX0hBU19BVElEKTsKIAljeGdiaV9zb2NrX2dldChjc2spOwogCi0JY3NrLT5sMnQgPSBjeGdiNF9sMnRfZ2V0KGxsZGktPmwydCwgZHN0X2dldF9uZWlnaGJvdXIoY3NrLT5kc3QpLCBuZGV2LCAwKTsKKwluID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoY3NrLT5kc3QpOworCWlmICghbikgeworCQlwcl9lcnIoIiVzLCBjYW4ndCBnZXQgbmVpZ2hib3VyIG9mIGNzay0+ZHN0LlxuIiwgbmRldi0+bmFtZSk7CisJCWdvdG8gcmVsX3Jlc291cmNlOworCX0KKwljc2stPmwydCA9IGN4Z2I0X2wydF9nZXQobGxkaS0+bDJ0LCBuLCBuZGV2LCAwKTsKIAlpZiAoIWNzay0+bDJ0KSB7CiAJCXByX2VycigiJXMsIGNhbm5vdCBhbGxvYyBsMnQuXG4iLCBuZGV2LT5uYW1lKTsKIAkJZ290byByZWxfcmVzb3VyY2U7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvY3hnYmkvbGliY3hnYmkuYyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5jCmluZGV4IGMxMGY3NGEuLjFkMjVhODcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5jCisrKyBiL2RyaXZlcnMvc2NzaS9jeGdiaS9saWJjeGdiaS5jCkBAIC00NzIsNiArNDcyLDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbmRldjsKIAlzdHJ1Y3QgY3hnYmlfZGV2aWNlICpjZGV2OwogCXN0cnVjdCBydGFibGUgKnJ0ID0gTlVMTDsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuOwogCXN0cnVjdCBmbG93aTQgZmw0OwogCXN0cnVjdCBjeGdiaV9zb2NrICpjc2sgPSBOVUxMOwogCXVuc2lnbmVkIGludCBtdHUgPSAwOwpAQCAtNDkzLDcgKzQ5NCwxMiBAQAogCQlnb3RvIGVycl9vdXQ7CiAJfQogCWRzdCA9ICZydC0+ZHN0OwotCW5kZXYgPSBkc3RfZ2V0X25laWdoYm91cihkc3QpLT5kZXY7CisJbiA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKGRzdCk7CisJaWYgKCFuKSB7CisJCWVyciA9IC1FTk9ERVY7CisJCWdvdG8gcmVsX3J0OworCX0KKwluZGV2ID0gbi0+ZGV2OwogCiAJaWYgKHJ0LT5ydF9mbGFncyAmIChSVENGX01VTFRJQ0FTVCB8IFJUQ0ZfQlJPQURDQVNUKSkgewogCQlwcl9pbmZvKCJtdWx0aS1jYXN0IHJvdXRlICVwSTQsIHBvcnQgJXUsIGRldiAlcy5cbiIsCkBAIC01MDcsNyArNTEzLDcgQEAKIAkJbmRldiA9IGlwX2Rldl9maW5kKCZpbml0X25ldCwgZGFkZHItPnNpbl9hZGRyLnNfYWRkcik7CiAJCW10dSA9IG5kZXYtPm10dTsKIAkJcHJfaW5mbygicnQgZGV2ICVzLCBsb29wYmFjayAtPiAlcywgbXR1ICV1LlxuIiwKLQkJCWRzdF9nZXRfbmVpZ2hib3VyKGRzdCktPmRldi0+bmFtZSwgbmRldi0+bmFtZSwgbXR1KTsKKwkJCW4tPmRldi0+bmFtZSwgbmRldi0+bmFtZSwgbXR1KTsKIAl9CiAKIAljZGV2ID0gY3hnYmlfZGV2aWNlX2ZpbmRfYnlfbmV0ZGV2KG5kZXYsICZwb3J0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYyBiL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2UuYwppbmRleCBjZWZiZTQ0Li44ZDY3NDY3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvZmNvZS9mY29lLmMKKysrIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZS5jCkBAIC0zMSw2ICszMSw4IEBACiAjaW5jbHVkZSA8bGludXgvc3lzZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPG5ldC9kY2JubC5oPgorI2luY2x1ZGUgPG5ldC9kY2JldmVudC5oPgogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KICNpbmNsdWRlIDxzY3NpL3Njc2lfdHJhbnNwb3J0Lmg+CkBAIC0xMDEsNiArMTAzLDggQEAKIHN0YXRpYyBpbnQgZmNvZV9kZHBfdGFyZ2V0KHN0cnVjdCBmY19scG9ydCAqLCB1MTYsIHN0cnVjdCBzY2F0dGVybGlzdCAqLAogCQkJICAgdW5zaWduZWQgaW50KTsKIHN0YXRpYyBpbnQgZmNvZV9jcHVfY2FsbGJhY2soc3RydWN0IG5vdGlmaWVyX2Jsb2NrICosIHVuc2lnbmVkIGxvbmcsIHZvaWQgKik7CitzdGF0aWMgaW50IGZjb2VfZGNiX2FwcF9ub3RpZmljYXRpb24oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllciwKKwkJCQkgICAgIHVsb25nIGV2ZW50LCB2b2lkICpwdHIpOwogCiBzdGF0aWMgYm9vbCBmY29lX21hdGNoKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpOwogc3RhdGljIGludCBmY29lX2NyZWF0ZShzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCBlbnVtIGZpcF9zdGF0ZSBmaXBfbW9kZSk7CkBAIC0xMjksNiArMTMzLDExIEBACiAJLm5vdGlmaWVyX2NhbGwgPSBmY29lX2NwdV9jYWxsYmFjaywKIH07CiAKKy8qIG5vdGlmaWNhdGlvbiBmdW5jdGlvbiBmb3IgRENCIGV2ZW50cyAqLworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBkY2Jfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBmY29lX2RjYl9hcHBfbm90aWZpY2F0aW9uLAorfTsKKwogc3RhdGljIHN0cnVjdCBzY3NpX3RyYW5zcG9ydF90ZW1wbGF0ZSAqZmNvZV9ucG9ydF9zY3NpX3RyYW5zcG9ydDsKIHN0YXRpYyBzdHJ1Y3Qgc2NzaV90cmFuc3BvcnRfdGVtcGxhdGUgKmZjb2VfdnBvcnRfc2NzaV90cmFuc3BvcnQ7CiAKQEAgLTE1MjIsNiArMTUzMSw4IEBACiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJc2tiLT5tYWNfbGVuID0gZWxlbjsKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfRkNPRSk7CisJc2tiLT5wcmlvcml0eSA9IHBvcnQtPnByaW9yaXR5OworCiAJaWYgKGZjb2UtPm5ldGRldi0+cHJpdl9mbGFncyAmIElGRl84MDJfMVFfVkxBTiAmJgogCSAgICBmY29lLT5yZWFsZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9UWCkgewogCQlza2ItPnZsYW5fdGNpID0gVkxBTl9UQUdfUFJFU0VOVCB8CkBAIC0xNjI0LDYgKzE2MzUsNyBAQAogCXN0YXRzLT5JbnZhbGlkQ1JDQ291bnQrKzsKIAlpZiAoc3RhdHMtPkludmFsaWRDUkNDb3VudCA8IDUpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcgImZjb2U6IGRyb3BwaW5nIGZyYW1lIHdpdGggQ1JDIGVycm9yXG4iKTsKKwlwdXRfY3B1KCk7CiAJcmV0dXJuIC1FSU5WQUw7CiB9CiAKQEAgLTE3NDYsNiArMTc1OCw3IEBACiAgKi8KIHN0YXRpYyB2b2lkIGZjb2VfZGV2X3NldHVwKHZvaWQpCiB7CisJcmVnaXN0ZXJfZGNiZXZlbnRfbm90aWZpZXIoJmRjYl9ub3RpZmllcik7CiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZmY29lX25vdGlmaWVyKTsKIH0KIApAQCAtMTc1NCw5ICsxNzY3LDY5IEBACiAgKi8KIHN0YXRpYyB2b2lkIGZjb2VfZGV2X2NsZWFudXAodm9pZCkKIHsKKwl1bnJlZ2lzdGVyX2RjYmV2ZW50X25vdGlmaWVyKCZkY2Jfbm90aWZpZXIpOwogCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZmY29lX25vdGlmaWVyKTsKIH0KIAorc3RhdGljIHN0cnVjdCBmY29lX2ludGVyZmFjZSAqCitmY29lX2hvc3RsaXN0X2xvb2t1cF9yZWFsZGV2X3BvcnQoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2U7CisJc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShmY29lLCAmZmNvZV9ob3N0bGlzdCwgbGlzdCkgeworCQlpZiAoZmNvZS0+bmV0ZGV2LT5wcml2X2ZsYWdzICYgSUZGXzgwMl8xUV9WTEFOKQorCQkJcmVhbF9kZXYgPSB2bGFuX2Rldl9yZWFsX2RldihmY29lLT5uZXRkZXYpOworCQllbHNlCisJCQlyZWFsX2RldiA9IGZjb2UtPm5ldGRldjsKKworCQlpZiAobmV0ZGV2ID09IHJlYWxfZGV2KQorCQkJcmV0dXJuIGZjb2U7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW50IGZjb2VfZGNiX2FwcF9ub3RpZmljYXRpb24oc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpub3RpZmllciwKKwkJCQkgICAgIHVsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IGRjYl9hcHBfdHlwZSAqZW50cnkgPSBwdHI7CisJc3RydWN0IGZjb2VfaW50ZXJmYWNlICpmY29lOworCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXY7CisJc3RydWN0IGZjb2VfcG9ydCAqcG9ydDsKKwlpbnQgcHJpbzsKKworCWlmIChlbnRyeS0+YXBwLnNlbGVjdG9yICE9IERDQl9BUFBfSURUWVBFX0VUSFRZUEUpCisJCXJldHVybiBOT1RJRllfT0s7CisKKwluZXRkZXYgPSBkZXZfZ2V0X2J5X2luZGV4KCZpbml0X25ldCwgZW50cnktPmlmaW5kZXgpOworCWlmICghbmV0ZGV2KQorCQlyZXR1cm4gTk9USUZZX09LOworCisJZmNvZSA9IGZjb2VfaG9zdGxpc3RfbG9va3VwX3JlYWxkZXZfcG9ydChuZXRkZXYpOworCWRldl9wdXQobmV0ZGV2KTsKKwlpZiAoIWZjb2UpCisJCXJldHVybiBOT1RJRllfT0s7CisKKwlpZiAoZW50cnktPmRjYnggJiBEQ0JfQ0FQX0RDQlhfVkVSX0NFRSkKKwkJcHJpbyA9IGZmcyhlbnRyeS0+YXBwLnByaW9yaXR5KSAtIDE7CisJZWxzZQorCQlwcmlvID0gZW50cnktPmFwcC5wcmlvcml0eTsKKworCWlmIChwcmlvIDwgMCkKKwkJcmV0dXJuIE5PVElGWV9PSzsKKworCWlmIChlbnRyeS0+YXBwLnByb3RvY29sID09IEVUSF9QX0ZJUCB8fAorCSAgICBlbnRyeS0+YXBwLnByb3RvY29sID09IEVUSF9QX0ZDT0UpCisJCWZjb2UtPmN0bHIucHJpb3JpdHkgPSBwcmlvOworCisJaWYgKGVudHJ5LT5hcHAucHJvdG9jb2wgPT0gRVRIX1BfRkNPRSkgeworCQlwb3J0ID0gbHBvcnRfcHJpdihmY29lLT5jdGxyLmxwKTsKKwkJcG9ydC0+cHJpb3JpdHkgPSBwcmlvOworCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKIC8qKgogICogZmNvZV9kZXZpY2Vfbm90aWZpY2F0aW9uKCkgLSBIYW5kbGVyIGZvciBuZXQgZGV2aWNlIGV2ZW50cwogICogQG5vdGlmaWVyOiBUaGUgY29udGV4dCBvZiB0aGUgbm90aWZpY2F0aW9uCkBAIC0xOTY1LDYgKzIwMzgsNDYgQEAKIH0KIAogLyoqCisgKiBmY29lX2RjYl9jcmVhdGUoKSAtIEluaXRpYWxpemUgRENCIGF0dHJpYnV0ZXMgYW5kIGhvb2tzCisgKiBAbmV0ZGV2OiBUaGUgbmV0X2RldmljZSBvYmplY3Qgb2YgdGhlIEwyIGxpbmsgdGhhdCBzaG91bGQgYmUgcXVlcmllZAorICogQHBvcnQ6IFRoZSBmY29lX3BvcnQgdG8gYmluZCBGQ29FIEFQUCBwcmlvcml0eSB3aXRoCisgKiBACisgKi8KK3N0YXRpYyB2b2lkIGZjb2VfZGNiX2NyZWF0ZShzdHJ1Y3QgZmNvZV9pbnRlcmZhY2UgKmZjb2UpCit7CisjaWZkZWYgQ09ORklHX0RDQgorCWludCBkY2J4OworCXU4IGZ1cCwgdXA7CisJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiA9IGZjb2UtPnJlYWxkZXY7CisJc3RydWN0IGZjb2VfcG9ydCAqcG9ydCA9IGxwb3J0X3ByaXYoZmNvZS0+Y3Rsci5scCk7CisJc3RydWN0IGRjYl9hcHAgYXBwID0geworCQkJCS5wcmlvcml0eSA9IDAsCisJCQkJLnByb3RvY29sID0gRVRIX1BfRkNPRQorCQkJICAgICB9OworCisJLyogc2V0dXAgRENCIHByaW9yaXR5IGF0dHJpYnV0ZXMuICovCisJaWYgKG5ldGRldiAmJiBuZXRkZXYtPmRjYm5sX29wcyAmJiBuZXRkZXYtPmRjYm5sX29wcy0+Z2V0ZGNieCkgeworCQlkY2J4ID0gbmV0ZGV2LT5kY2JubF9vcHMtPmdldGRjYngobmV0ZGV2KTsKKworCQlpZiAoZGNieCAmIERDQl9DQVBfRENCWF9WRVJfSUVFRSkgeworCQkJYXBwLnNlbGVjdG9yID0gSUVFRV84MDIxUUFaX0FQUF9TRUxfRVRIRVJUWVBFOworCQkJdXAgPSBkY2JfaWVlZV9nZXRhcHBfbWFzayhuZXRkZXYsICZhcHApOworCQkJYXBwLnByb3RvY29sID0gRVRIX1BfRklQOworCQkJZnVwID0gZGNiX2llZWVfZ2V0YXBwX21hc2sobmV0ZGV2LCAmYXBwKTsKKwkJfSBlbHNlIHsKKwkJCWFwcC5zZWxlY3RvciA9IERDQl9BUFBfSURUWVBFX0VUSFRZUEU7CisJCQl1cCA9IGRjYl9nZXRhcHAobmV0ZGV2LCAmYXBwKTsKKwkJCWFwcC5wcm90b2NvbCA9IEVUSF9QX0ZJUDsKKwkJCWZ1cCA9IGRjYl9nZXRhcHAobmV0ZGV2LCAmYXBwKTsKKwkJfQorCisJCXBvcnQtPnByaW9yaXR5ID0gZmZzKHVwKSA/IGZmcyh1cCkgLSAxIDogMDsKKwkJZmNvZS0+Y3Rsci5wcmlvcml0eSA9IGZmcyhmdXApID8gZmZzKGZ1cCkgLSAxIDogcG9ydC0+cHJpb3JpdHk7CisJfQorI2VuZGlmCit9CisKKy8qKgogICogZmNvZV9jcmVhdGUoKSAtIENyZWF0ZSBhIGZjb2UgaW50ZXJmYWNlCiAgKiBAbmV0ZGV2ICA6IFRoZSBuZXRfZGV2aWNlIG9iamVjdCB0aGUgRXRoZXJuZXQgaW50ZXJmYWNlIHRvIGNyZWF0ZSBvbgogICogQGZpcF9tb2RlOiBUaGUgRklQIG1vZGUgZm9yIHRoaXMgY3JlYXRpb24KQEAgLTIwMDcsNiArMjEyMCw5IEBACiAJLyogTWFrZSB0aGlzIHRoZSAibWFzdGVyIiBOX1BvcnQgKi8KIAlmY29lLT5jdGxyLmxwID0gbHBvcnQ7CiAKKwkvKiBzZXR1cCBEQ0IgcHJpb3JpdHkgYXR0cmlidXRlcy4gKi8KKwlmY29lX2RjYl9jcmVhdGUoZmNvZSk7CisKIAkvKiBhZGQgdG8gbHBvcnRzIGxpc3QgKi8KIAlmY29lX2hvc3RsaXN0X2FkZChscG9ydCk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9mY29lL2Zjb2VfY3Rsci5jIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV9jdGxyLmMKaW5kZXggYzc0YzRiOC4uZTc1MjJkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV9jdGxyLmMKKysrIGIvZHJpdmVycy9zY3NpL2Zjb2UvZmNvZV9jdGxyLmMKQEAgLTMyMCw2ICszMjAsNyBAQAogCiAJc2tiX3B1dChza2IsIHNpemVvZigqc29sKSk7CiAJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0ZJUCk7CisJc2tiLT5wcmlvcml0eSA9IGZpcC0+cHJpb3JpdHk7CiAJc2tiX3Jlc2V0X21hY19oZWFkZXIoc2tiKTsKIAlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAlmaXAtPnNlbmQoZmlwLCBza2IpOwpAQCAtNDc0LDYgKzQ3NSw3IEBACiAJfQogCXNrYl9wdXQoc2tiLCBsZW4pOwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9GSVApOworCXNrYi0+cHJpb3JpdHkgPSBmaXAtPnByaW9yaXR5OwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJZmlwLT5zZW5kKGZpcCwgc2tiKTsKQEAgLTU2Niw2ICs1NjgsNyBAQAogCWNhcC0+ZmlwLmZpcF9kbF9sZW4gPSBodG9ucyhkbGVuIC8gRklQX0JQVyk7CiAKIAlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfRklQKTsKKwlza2ItPnByaW9yaXR5ID0gZmlwLT5wcmlvcml0eTsKIAlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOwogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCXJldHVybiAwOwpAQCAtMTkxMSw2ICsxOTE0LDcgQEAKIAogCXNrYl9wdXQoc2tiLCBsZW4pOwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9GSVApOworCXNrYi0+cHJpb3JpdHkgPSBmaXAtPnByaW9yaXR5OwogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYyBiL2RyaXZlcnMvc2NzaS9tcHQyc2FzL21wdDJzYXNfc2NzaWguYwppbmRleCA0ZTA0MWY2Li5kNTcwNTczIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvbXB0MnNhcy9tcHQyc2FzX3Njc2loLmMKKysrIGIvZHJpdmVycy9zY3NpL21wdDJzYXMvbXB0MnNhc19zY3NpaC5jCkBAIC00MzM1LDcgKzQzMzUsNyBAQAogCS8qIGluc2VydCBpbnRvIGV2ZW50IGxvZyAqLwogCXN6ID0gb2Zmc2V0b2YoTXBpMkV2ZW50Tm90aWZpY2F0aW9uUmVwbHlfdCwgRXZlbnREYXRhKSArCiAJICAgICBzaXplb2YoTXBpMkV2ZW50RGF0YVNhc0RldmljZVN0YXR1c0NoYW5nZV90KTsKLQlldmVudF9yZXBseSA9IGt6YWxsb2Moc3osIEdGUF9LRVJORUwpOworCWV2ZW50X3JlcGx5ID0ga3phbGxvYyhzeiwgR0ZQX0FUT01JQyk7CiAJaWYgKCFldmVudF9yZXBseSkgewogCQlwcmludGsoTVBUMlNBU19FUlJfRk1UICJmYWlsdXJlIGF0ICVzOiVkLyVzKCkhXG4iLAogCQkgICAgaW9jLT5uYW1lLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfYXR0ci5jCmluZGV4IGFjMzI2YzQuLjY0NjVkYWUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9hdHRyLmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2F0dHIuYwpAQCAtMTc2MiwxMiArMTc2MiwzMSBAQAogCXNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc2hvc3RfcHJpdihzaG9zdCk7CiAJc3RydWN0IHNjc2lfcWxhX2hvc3QgKmJhc2VfdmhhID0gcGNpX2dldF9kcnZkYXRhKHZoYS0+aHctPnBkZXYpOwogCi0JaWYgKCFiYXNlX3ZoYS0+ZmxhZ3Mub25saW5lKQorCWlmICghYmFzZV92aGEtPmZsYWdzLm9ubGluZSkgewogCQlmY19ob3N0X3BvcnRfc3RhdGUoc2hvc3QpID0gRkNfUE9SVFNUQVRFX09GRkxJTkU7Ci0JZWxzZSBpZiAoYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSA9PSBMT09QX1RJTUVPVVQpCi0JCWZjX2hvc3RfcG9ydF9zdGF0ZShzaG9zdCkgPSBGQ19QT1JUU1RBVEVfVU5LTk9XTjsKLQllbHNlCisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9zdGF0ZSkpIHsKKwljYXNlIExPT1BfVVBEQVRFOgorCQlmY19ob3N0X3BvcnRfc3RhdGUoc2hvc3QpID0gRkNfUE9SVFNUQVRFX0RJQUdOT1NUSUNTOworCQlicmVhazsKKwljYXNlIExPT1BfRE9XTjoKKwkJaWYgKHRlc3RfYml0KExPT1BfUkVTWU5DX05FRURFRCwgJmJhc2VfdmhhLT5kcGNfZmxhZ3MpKQorCQkJZmNfaG9zdF9wb3J0X3N0YXRlKHNob3N0KSA9IEZDX1BPUlRTVEFURV9ESUFHTk9TVElDUzsKKwkJZWxzZQorCQkJZmNfaG9zdF9wb3J0X3N0YXRlKHNob3N0KSA9IEZDX1BPUlRTVEFURV9MSU5LRE9XTjsKKwkJYnJlYWs7CisJY2FzZSBMT09QX0RFQUQ6CisJCWZjX2hvc3RfcG9ydF9zdGF0ZShzaG9zdCkgPSBGQ19QT1JUU1RBVEVfTElOS0RPV047CisJCWJyZWFrOworCWNhc2UgTE9PUF9SRUFEWToKIAkJZmNfaG9zdF9wb3J0X3N0YXRlKHNob3N0KSA9IEZDX1BPUlRTVEFURV9PTkxJTkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZjX2hvc3RfcG9ydF9zdGF0ZShzaG9zdCkgPSBGQ19QT1JUU1RBVEVfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQogfQogCiBzdGF0aWMgaW50CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZGJnLmMKaW5kZXggOWRmNDc4Ny4uZjNjZGRkNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2RiZy5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9kYmcuYwpAQCAtMTIsMTcgKzEyLDE3IEBACiAgKiB8ICAgICAgICAgICAgIExldmVsICAgICAgICAgICAgfCAgIExhc3QgVmFsdWUgVXNlZCAgfCAgICAgSG9sZXMJfAogICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogfCBNb2R1bGUgSW5pdCBhbmQgUHJvYmUgICAgICAgIHwgICAgICAgMHgwMTE2ICAgICAgIHwgIAkJfAotICogfCBNYWlsYm94IGNvbW1hbmRzICAgICAgICAgICAgIHwgICAgICAgMHgxMTI5ICAgICAgIHwJCXwKKyAqIHwgTWFpbGJveCBjb21tYW5kcyAgICAgICAgICAgICB8ICAgICAgIDB4MTEyYiAgICAgICB8CQl8CiAgKiB8IERldmljZSBEaXNjb3ZlcnkgICAgICAgICAgICAgfCAgICAgICAweDIwODMgICAgICAgfAkJfAogICogfCBRdWV1ZSBDb21tYW5kIGFuZCBJTyB0cmFjaW5nIHwgICAgICAgMHgzMDJlICAgICAgIHwgICAgIDB4MzAwOCAgICAgfAogICogfCBEUEMgVGhyZWFkICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHg0MDFjICAgICAgIHwJCXwKICAqIHwgQXN5bmMgRXZlbnRzICAgICAgICAgICAgICAgICB8ICAgICAgIDB4NTA1OSAgICAgICB8CQl8Ci0gKiB8IFRpbWVyIFJvdXRpbmVzICAgICAgICAgICAgICAgfCAgICAgICAweDYwMGQgICAgICAgfAkJfAorICogfCBUaW1lciBSb3V0aW5lcyAgICAgICAgICAgICAgIHwgICAgICAgMHg2MDEwICAgICAgIHwgMHg2MDBlLDB4NjAwZiAgfAogICogfCBVc2VyIFNwYWNlIEludGVyYWN0aW9ucyAgICAgIHwgICAgICAgMHg3MDlkICAgICAgIHwJCXwKLSAqIHwgVGFzayBNYW5hZ2VtZW50ICAgICAgICAgICAgICB8ICAgICAgIDB4ODA0MSAgICAgICB8ICAgIAkJfAorICogfCBUYXNrIE1hbmFnZW1lbnQgICAgICAgICAgICAgIHwgICAgICAgMHg4MDQxICAgICAgIHwgMHg4MDBiICAgICAgICAgfAogICogfCBBRVIvRUVIICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHg5MDBmICAgICAgIHwJCXwKICAqIHwgVmlydHVhbCBQb3J0ICAgICAgICAgICAgICAgICB8ICAgICAgIDB4YTAwNyAgICAgICB8CQl8Ci0gKiB8IElTUDgyWFggU3BlY2lmaWMgICAgICAgICAgICAgfCAgICAgICAweGIwNTEgICAgICAgfCAgICAJCXwKKyAqIHwgSVNQODJYWCBTcGVjaWZpYyAgICAgICAgICAgICB8ICAgICAgIDB4YjA1MiAgICAgICB8ICAgIAkJfAogICogfCBNdWx0aVEgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgMHhjMDBiICAgICAgIHwJCXwKICAqIHwgTWlzYyAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIDB4ZDAwYiAgICAgICB8CQl8CiAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmggYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfZ2JsLmgKaW5kZXggY2UzMmQ4MS4uYzBjMTFhZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2dibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9nYmwuaApAQCAtNTc4LDYgKzU3OCw3IEBACiBleHRlcm4gdm9pZCBxbGE4Mnh4X2NoaXBfcmVzZXRfY2xlYW51cChzY3NpX3FsYV9ob3N0X3QgKik7CiBleHRlcm4gaW50IHFsYTgyeHhfbWJ4X2JlYWNvbl9jdGwoc2NzaV9xbGFfaG9zdF90ICosIGludCk7CiBleHRlcm4gY2hhciAqcWRldl9zdGF0ZSh1aW50MzJfdCk7CitleHRlcm4gdm9pZCBxbGE4Mnh4X2NsZWFyX3BlbmRpbmdfbWJ4KHNjc2lfcWxhX2hvc3RfdCAqKTsKIAogLyogQlNHIHJlbGF0ZWQgZnVuY3Rpb25zICovCiBleHRlcm4gaW50IHFsYTI0eHhfYnNnX3JlcXVlc3Qoc3RydWN0IGZjX2JzZ19qb2IgKik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYwppbmRleCBmMDNlOTE1Zi4uNTRlYTY4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2luaXQuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW5pdC5jCkBAIC0xNTA5LDcgKzE1MDksOCBAQAogCQkJCSAgICAmaGEtPmZ3X3hjYl9jb3VudCwgTlVMTCwgTlVMTCwKIAkJCQkgICAgJmhhLT5tYXhfbnBpdl92cG9ydHMsIE5VTEwpOwogCi0JCQkJaWYgKCFmd19tYWpvcl92ZXJzaW9uICYmIHFsMnhhbGxvY2Z3ZHVtcCkKKwkJCQlpZiAoIWZ3X21ham9yX3ZlcnNpb24gJiYgcWwyeGFsbG9jZndkdW1wCisJCQkJICAgICYmICFJU19RTEE4MlhYKGhhKSkKIAkJCQkJcWxhMngwMF9hbGxvY19md19kdW1wKHZoYSk7CiAJCQl9CiAJCX0gZWxzZSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lvY2IuYwppbmRleCBkYmVjODk2Li5hNGIyNjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaW9jYi5jCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pb2NiLmMKQEAgLTEyMCwxMSArMTIwLDEwIEBACiAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgY29udGludWF0aW9uIHR5cGUgMSBJT0NCIHBhY2tldC4KICAqLwogc3RhdGljIGlubGluZSBjb250X2E2NF9lbnRyeV90ICoKLXFsYTJ4MDBfcHJlcF9jb250X3R5cGUxX2lvY2Ioc2NzaV9xbGFfaG9zdF90ICp2aGEpCitxbGEyeDAwX3ByZXBfY29udF90eXBlMV9pb2NiKHNjc2lfcWxhX2hvc3RfdCAqdmhhLCBzdHJ1Y3QgcmVxX3F1ZSAqcmVxKQogewogCWNvbnRfYTY0X2VudHJ5X3QgKmNvbnRfcGt0OwogCi0Jc3RydWN0IHJlcV9xdWUgKnJlcSA9IHZoYS0+cmVxOwogCS8qIEFkanVzdCByaW5nIGluZGV4LiAqLwogCXJlcS0+cmluZ19pbmRleCsrOwogCWlmIChyZXEtPnJpbmdfaW5kZXggPT0gcmVxLT5sZW5ndGgpIHsKQEAgLTI5Miw3ICsyOTEsNyBAQAogCQkJICogRml2ZSBEU0RzIGFyZSBhdmFpbGFibGUgaW4gdGhlIENvbnRpbnVhdGlvbgogCQkJICogVHlwZSAxIElPQ0IuCiAJCQkgKi8KLQkJCWNvbnRfcGt0ID0gcWxhMngwMF9wcmVwX2NvbnRfdHlwZTFfaW9jYih2aGEpOworCQkJY29udF9wa3QgPSBxbGEyeDAwX3ByZXBfY29udF90eXBlMV9pb2NiKHZoYSwgdmhhLT5yZXEpOwogCQkJY3VyX2RzZCA9ICh1aW50MzJfdCAqKWNvbnRfcGt0LT5kc2VnXzBfYWRkcmVzczsKIAkJCWF2YWlsX2RzZHMgPSA1OwogCQl9CkBAIC02ODQsNyArNjgzLDcgQEAKIAkJCSAqIEZpdmUgRFNEcyBhcmUgYXZhaWxhYmxlIGluIHRoZSBDb250aW51YXRpb24KIAkJCSAqIFR5cGUgMSBJT0NCLgogCQkJICovCi0JCQljb250X3BrdCA9IHFsYTJ4MDBfcHJlcF9jb250X3R5cGUxX2lvY2IodmhhKTsKKwkJCWNvbnRfcGt0ID0gcWxhMngwMF9wcmVwX2NvbnRfdHlwZTFfaW9jYih2aGEsIHZoYS0+cmVxKTsKIAkJCWN1cl9kc2QgPSAodWludDMyX3QgKiljb250X3BrdC0+ZHNlZ18wX2FkZHJlc3M7CiAJCQlhdmFpbF9kc2RzID0gNTsKIAkJfQpAQCAtMjA3MCw3ICsyMDY5LDggQEAKIAkJCSogRml2ZSBEU0RzIGFyZSBhdmFpbGFibGUgaW4gdGhlIENvbnQuCiAJCQkqIFR5cGUgMSBJT0NCLgogCQkJICAgICAgICovCi0JCQljb250X3BrdCA9IHFsYTJ4MDBfcHJlcF9jb250X3R5cGUxX2lvY2IodmhhKTsKKwkJCWNvbnRfcGt0ID0gcWxhMngwMF9wcmVwX2NvbnRfdHlwZTFfaW9jYih2aGEsCisJCQkgICAgdmhhLT5ody0+cmVxX3FfbWFwWzBdKTsKIAkJCWN1cl9kc2QgPSAodWludDMyX3QgKikgY29udF9wa3QtPmRzZWdfMF9hZGRyZXNzOwogCQkJYXZhaWxfZHNkcyA9IDU7CiAJCQljb250X2lvY2JfcHJzbnQgPSAxOwpAQCAtMjA5Niw2ICsyMDk2LDcgQEAKIAlpbnQgaW5kZXg7CiAJdWludDE2X3QgdG90X2RzZHM7CiAgICAgICAgIHNjc2lfcWxhX2hvc3RfdCAqdmhhID0gc3AtPmZjcG9ydC0+dmhhOworCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwogCXN0cnVjdCBmY19ic2dfam9iICpic2dfam9iID0gKChzdHJ1Y3Qgc3JiX2N0eCAqKXNwLT5jdHgpLT51LmJzZ19qb2I7CiAJaW50IGxvb3BfaXRlcmFydGlvbiA9IDA7CiAJaW50IGNvbnRfaW9jYl9wcnNudCA9IDA7CkBAIC0yMTQxLDcgKzIxNDIsOCBAQAogCQkJKiBGaXZlIERTRHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgQ29udC4KIAkJCSogVHlwZSAxIElPQ0IuCiAJCQkgICAgICAgKi8KLQkJCWNvbnRfcGt0ID0gcWxhMngwMF9wcmVwX2NvbnRfdHlwZTFfaW9jYih2aGEpOworCQkJY29udF9wa3QgPSBxbGEyeDAwX3ByZXBfY29udF90eXBlMV9pb2NiKHZoYSwKKwkJCSAgICBoYS0+cmVxX3FfbWFwWzBdKTsKIAkJCWN1cl9kc2QgPSAodWludDMyX3QgKikgY29udF9wa3QtPmRzZWdfMF9hZGRyZXNzOwogCQkJYXZhaWxfZHNkcyA9IDU7CiAJCQljb250X2lvY2JfcHJzbnQgPSAxOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX2lzci5jCmluZGV4IDI1MTZhZGYuLjdiOTFiMjkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9pc3IuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfaXNyLmMKQEAgLTE3NDEsNyArMTc0MSw3IEBACiAJCQkJICAgIHJlc2lkLCBzY3NpX2J1ZmZsZW4oY3ApKTsKIAogCQkJCWNwLT5yZXN1bHQgPSBESURfRVJST1IgPDwgMTYgfCBsc2NzaV9zdGF0dXM7Ci0JCQkJYnJlYWs7CisJCQkJZ290byBjaGVja19zY3NpX3N0YXR1czsKIAkJCX0KIAogCQkJaWYgKCFsc2NzaV9zdGF0dXMgJiYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9tYnguYwppbmRleCAzYjNjZWM5Li44MmEzMzUzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX21ieC5jCkBAIC03OSw4ICs3OSw3IEBACiAJCW1jcC0+bWJbMF0gPSBNQlNfTElOS19ET1dOX0VSUk9SOwogCQlxbF9sb2cocWxfbG9nX3dhcm4sIGJhc2VfdmhhLCAweDEwMDQsCiAJCSAgICAiRlcgaHVuZyA9ICVkLlxuIiwgaGEtPmZsYWdzLmlzcDgyeHhfZndfaHVuZyk7Ci0JCXJ2YWwgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCQlnb3RvIHByZW1hdHVyZV9leGl0OworCQlyZXR1cm4gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CiAJfQogCiAJLyoKQEAgLTE2Myw2ICsxNjIsNyBAQAogCQkJCUhJTlRfTUJYX0lOVF9QRU5ESU5HKSB7CiAJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGEtPmhhcmR3YXJlX2xvY2ssCiAJCQkJCWZsYWdzKTsKKwkJCQloYS0+ZmxhZ3MubWJveF9idXN5ID0gMDsKIAkJCQlxbF9kYmcocWxfZGJnX21ieCwgYmFzZV92aGEsIDB4MTAxMCwKIAkJCQkgICAgIlBlbmRpbmcgbWFpbGJveCB0aW1lb3V0LCBleGl0aW5nLlxuIik7CiAJCQkJcnZhbCA9IFFMQV9GVU5DVElPTl9USU1FT1VUOwpAQCAtMTg4LDYgKzE4OCw3IEBACiAJCQkJSElOVF9NQlhfSU5UX1BFTkRJTkcpIHsKIAkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYS0+aGFyZHdhcmVfbG9jaywKIAkJCQkJZmxhZ3MpOworCQkJCWhhLT5mbGFncy5tYm94X2J1c3kgPSAwOwogCQkJCXFsX2RiZyhxbF9kYmdfbWJ4LCBiYXNlX3ZoYSwgMHgxMDEyLAogCQkJCSAgICAiUGVuZGluZyBtYWlsYm94IHRpbWVvdXQsIGV4aXRpbmcuXG4iKTsKIAkJCQlydmFsID0gUUxBX0ZVTkNUSU9OX1RJTUVPVVQ7CkBAIC0zMDIsNyArMzAzLDE1IEBACiAJCQlpZiAoIXRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSAmJgogCQkJICAgICF0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpIHsKLQorCQkJCWlmIChJU19RTEE4MlhYKGhhKSkgeworCQkJCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMmEsCisJCQkJCSAgICAiZGlzYWJsaW5nIHBhdXNlIHRyYW5zbWl0IG9uIHBvcnQgIgorCQkJCQkgICAgIjAgJiAxLlxuIik7CisJCQkJCXFsYTgyeHhfd3JfMzIoaGEsCisJCQkJCSAgICBRTEE4MlhYX0NSQl9OSVUgKyAweDk4LAorCQkJCQkgICAgQ1JCX05JVV9YR19QQVVTRV9DVExfUDB8CisJCQkJCSAgICBDUkJfTklVX1hHX1BBVVNFX0NUTF9QMSk7CisJCQkJfQogCQkJCXFsX2xvZyhxbF9sb2dfaW5mbywgYmFzZV92aGEsIDB4MTAxYywKIAkJCQkgICAgIk1haWxib3ggY21kIHRpbWVvdXQgb2NjdXJlZC4gIgogCQkJCSAgICAiU2NoZWR1bGluZyBJU1AgYWJvcnQgZWVoX2J1c3k9MHgleC5cbiIsCkBAIC0zMTgsNyArMzI3LDE1IEBACiAJCQlpZiAoIXRlc3RfYml0KElTUF9BQk9SVF9ORUVERUQsICZ2aGEtPmRwY19mbGFncykgJiYKIAkJCSAgICAhdGVzdF9iaXQoQUJPUlRfSVNQX0FDVElWRSwgJnZoYS0+ZHBjX2ZsYWdzKSAmJgogCQkJICAgICF0ZXN0X2JpdChJU1BfQUJPUlRfUkVUUlksICZ2aGEtPmRwY19mbGFncykpIHsKLQorCQkJCWlmIChJU19RTEE4MlhYKGhhKSkgeworCQkJCQlxbF9kYmcocWxfZGJnX21ieCwgdmhhLCAweDExMmIsCisJCQkJCSAgICAiZGlzYWJsaW5nIHBhdXNlIHRyYW5zbWl0IG9uIHBvcnQgIgorCQkJCQkgICAgIjAgJiAxLlxuIik7CisJCQkJCXFsYTgyeHhfd3JfMzIoaGEsCisJCQkJCSAgICBRTEE4MlhYX0NSQl9OSVUgKyAweDk4LAorCQkJCQkgICAgQ1JCX05JVV9YR19QQVVTRV9DVExfUDB8CisJCQkJCSAgICBDUkJfTklVX1hHX1BBVVNFX0NUTF9QMSk7CisJCQkJfQogCQkJCXFsX2xvZyhxbF9sb2dfaW5mbywgYmFzZV92aGEsIDB4MTAxZSwKIAkJCQkgICAgIk1haWxib3ggY21kIHRpbWVvdXQgb2NjdXJlZC4gIgogCQkJCSAgICAiU2NoZWR1bGluZyBJU1AgYWJvcnQuXG4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5jIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKaW5kZXggOTRiZGVkNS4uMDM1NTQ5MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX254LmMKQEAgLTM4MTcsNiArMzgxNywyMCBAQAogCXJldHVybiBydmFsOwogfQogCit2b2lkIHFsYTgyeHhfY2xlYXJfcGVuZGluZ19tYngoc2NzaV9xbGFfaG9zdF90ICp2aGEpCit7CisJc3RydWN0IHFsYV9od19kYXRhICpoYSA9IHZoYS0+aHc7CisKKwlpZiAoaGEtPmZsYWdzLm1ib3hfYnVzeSkgeworCQloYS0+ZmxhZ3MubWJveF9pbnQgPSAxOworCQloYS0+ZmxhZ3MubWJveF9idXN5ID0gMDsKKwkJcWxfbG9nKHFsX2xvZ193YXJuLCB2aGEsIDB4NjAxMCwKKwkJICAgICJEb2luZyBwcmVtYXR1cmUgY29tcGxldGlvbiBvZiBtYnggY29tbWFuZC5cbiIpOworCQlpZiAodGVzdF9iaXQoTUJYX0lOVFJfV0FJVCwgJmhhLT5tYnhfY21kX2ZsYWdzKSkKKwkJCWNvbXBsZXRlKCZoYS0+bWJ4X2ludHJfY29tcCk7CisJfQorfQorCiB2b2lkIHFsYTgyeHhfd2F0Y2hkb2coc2NzaV9xbGFfaG9zdF90ICp2aGEpCiB7CiAJdWludDMyX3QgZGV2X3N0YXRlLCBoYWx0X3N0YXR1czsKQEAgLTM4MzksOSArMzg1MywxMyBAQAogCQkJcWxhMnh4eF93YWtlX2RwYyh2aGEpOwogCQl9IGVsc2UgewogCQkJaWYgKHFsYTgyeHhfY2hlY2tfZndfYWxpdmUodmhhKSkgeworCQkJCXFsX2RiZyhxbF9kYmdfdGltZXIsIHZoYSwgMHg2MDExLAorCQkJCSAgICAiZGlzYWJsaW5nIHBhdXNlIHRyYW5zbWl0IG9uIHBvcnQgMCAmIDEuXG4iKTsKKwkJCQlxbGE4Mnh4X3dyXzMyKGhhLCBRTEE4MlhYX0NSQl9OSVUgKyAweDk4LAorCQkJCSAgICBDUkJfTklVX1hHX1BBVVNFX0NUTF9QMHxDUkJfTklVX1hHX1BBVVNFX0NUTF9QMSk7CiAJCQkJaGFsdF9zdGF0dXMgPSBxbGE4Mnh4X3JkXzMyKGhhLAogCQkJCSAgICBRTEE4MlhYX1BFR19IQUxUX1NUQVRVUzEpOwotCQkJCXFsX2RiZyhxbF9kYmdfdGltZXIsIHZoYSwgMHg2MDA1LAorCQkJCXFsX2xvZyhxbF9sb2dfaW5mbywgdmhhLCAweDYwMDUsCiAJCQkJICAgICJkdW1waW5nIGh3L2Z3IHJlZ2lzdGVyczouXG4gIgogCQkJCSAgICAiIFBFR19IQUxUX1NUQVRVUzE6IDB4JXgsIFBFR19IQUxUX1NUQVRVUzI6IDB4JXgsLlxuICIKIAkJCQkgICAgIiBQRUdfTkVUXzBfUEM6IDB4JXgsIFBFR19ORVRfMV9QQzogMHgleCwuXG4gIgpAQCAtMzg1OCw2ICszODc2LDExIEBACiAJCQkJCSAgICBRTEE4MlhYX0NSQl9QRUdfTkVUXzMgKyAweDNjKSwKIAkJCQkgICAgcWxhODJ4eF9yZF8zMihoYSwKIAkJCQkJICAgIFFMQTgyWFhfQ1JCX1BFR19ORVRfNCArIDB4M2MpKTsKKwkJCQlpZiAoTFNXKE1TQihoYWx0X3N0YXR1cykpID09IDB4NjcpCisJCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweGIwNTIsCisJCQkJCSAgICAiRmlybXdhcmUgYWJvcnRlZCB3aXRoICIKKwkJCQkJICAgICJlcnJvciBjb2RlIDB4MDAwMDY3MDAuIERldmljZSBpcyAiCisJCQkJCSAgICAiYmVpbmcgcmVzZXQuXG4iKTsKIAkJCQlpZiAoaGFsdF9zdGF0dXMgJiBIQUxUX1NUQVRVU19VTlJFQ09WRVJBQkxFKSB7CiAJCQkJCXNldF9iaXQoSVNQX1VOUkVDT1ZFUkFCTEUsCiAJCQkJCSAgICAmdmhhLT5kcGNfZmxhZ3MpOwpAQCAtMzg2OSwxNiArMzg5Miw4IEBACiAJCQkJfQogCQkJCXFsYTJ4eHhfd2FrZV9kcGModmhhKTsKIAkJCQloYS0+ZmxhZ3MuaXNwODJ4eF9md19odW5nID0gMTsKLQkJCQlpZiAoaGEtPmZsYWdzLm1ib3hfYnVzeSkgewotCQkJCQloYS0+ZmxhZ3MubWJveF9pbnQgPSAxOwotCQkJCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg2MDA3LAotCQkJCQkgICAgIkR1ZSB0byBGVyBodW5nLCBkb2luZyAiCi0JCQkJCSAgICAicHJlbWF0dXJlIGNvbXBsZXRpb24gb2YgbWJ4ICIKLQkJCQkJICAgICJjb21tYW5kLlxuIik7Ci0JCQkJCWlmICh0ZXN0X2JpdChNQlhfSU5UUl9XQUlULAotCQkJCQkgICAgJmhhLT5tYnhfY21kX2ZsYWdzKSkKLQkJCQkJCWNvbXBsZXRlKCZoYS0+bWJ4X2ludHJfY29tcCk7Ci0JCQkJfQorCQkJCXFsX2xvZyhxbF9sb2dfd2FybiwgdmhhLCAweDYwMDcsICJGaXJtd2FyZSBodW5nLlxuIik7CisJCQkJcWxhODJ4eF9jbGVhcl9wZW5kaW5nX21ieCh2aGEpOwogCQkJfQogCQl9CiAJfQpAQCAtNDA3MywxMCArNDA4OCw3IEBACiAJCQltc2xlZXAoMTAwMCk7CiAJCQlpZiAocWxhODJ4eF9jaGVja19md19hbGl2ZSh2aGEpKSB7CiAJCQkJaGEtPmZsYWdzLmlzcDgyeHhfZndfaHVuZyA9IDE7Ci0JCQkJaWYgKGhhLT5mbGFncy5tYm94X2J1c3kpIHsKLQkJCQkJaGEtPmZsYWdzLm1ib3hfaW50ID0gMTsKLQkJCQkJY29tcGxldGUoJmhhLT5tYnhfaW50cl9jb21wKTsKLQkJCQl9CisJCQkJcWxhODJ4eF9jbGVhcl9wZW5kaW5nX21ieCh2aGEpOwogCQkJCWJyZWFrOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfbnguaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5oCmluZGV4IDU3ODIwYzEuLjU3YTIyNmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV9ueC5oCkBAIC0xMTczLDQgKzExNzMsOCBAQAogCiBzdGF0aWMgY29uc3QgaW50IE1EX01JVV9URVNUX0FHVF9SRERBVEFbXSA9IHsgMHg0MTAwMDBBOCwgMHg0MTAwMDBBQywKIAkweDQxMDAwMEI4LCAweDQxMDAwMEJDIH07CisKKyNkZWZpbmUgQ1JCX05JVV9YR19QQVVTRV9DVExfUDAgICAgICAgIDB4MQorI2RlZmluZSBDUkJfTklVX1hHX1BBVVNFX0NUTF9QMSAgICAgICAgMHg4CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwppbmRleCBmZDE0YzdiLi5mOWU1Yjg1IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfb3MuYwpAQCAtMjAxLDEyICsyMDEsMTIgQEAKIAkJIlNldCB0aGUgTWluaWR1bXAgZHJpdmVyIGNhcHR1cmUgbWFzayBsZXZlbC4gIgogCQkiRGVmYXVsdCBpcyAweDdGIC0gQ2FuIGJlIHNldCB0byAweDMsIDB4NywgMHhGLCAweDFGLCAweDdGLiIpOwogCi1pbnQgcWwyeG1kZW5hYmxlOworaW50IHFsMnhtZGVuYWJsZSA9IDE7CiBtb2R1bGVfcGFyYW0ocWwyeG1kZW5hYmxlLCBpbnQsIFNfSVJVR08pOwogTU9EVUxFX1BBUk1fREVTQyhxbDJ4bWRlbmFibGUsCiAJCSJFbmFibGUvZGlzYWJsZSBNaW5pRHVtcC4gIgotCQkiMCAoRGVmYXVsdCkgLSBNaW5pRHVtcCBkaXNhYmxlZC4gIgotCQkiMSAtIE1pbmlEdW1wIGVuYWJsZWQuIik7CisJCSIwIC0gTWluaUR1bXAgZGlzYWJsZWQuICIKKwkJIjEgKERlZmF1bHQpIC0gTWluaUR1bXAgZW5hYmxlZC4iKTsKIAogLyoKICAqIFNDU0kgaG9zdCB0ZW1wbGF0ZSBlbnRyeSBwb2ludHMKQEAgLTQyMyw2ICs0MjMsNyBAQAogCXFsYTI1eHhfZGVsZXRlX3F1ZXVlcyh2aGEpOwogCWRlc3Ryb3lfd29ya3F1ZXVlKGhhLT53cSk7CiAJaGEtPndxID0gTlVMTDsKKwl2aGEtPnJlcSA9IGhhLT5yZXFfcV9tYXBbMF07CiBmYWlsOgogCWhhLT5tcWVuYWJsZSA9IDA7CiAJa2ZyZWUoaGEtPnJlcV9xX21hcCk7CkBAIC04MTQsNDkgKzgxNSw2IEBACiAJcmV0dXJuIHJldHVybl9zdGF0dXM7CiB9CiAKLS8qCi0gKiBxbGEyeDAwX3dhaXRfZm9yX2xvb3BfcmVhZHkKLSAqICAgIFdhaXQgZm9yIE1BWF9MT09QX1RJTUVPVVQoNSBtaW4pIHZhbHVlIGZvciBsb29wCi0gKiAgICB0byBiZSBpbiBMT09QX1JFQURZIHN0YXRlLgotICogSW5wdXQ6Ci0gKiAgICAgaGEgLSBwb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUKLSAqCi0gKiBOb3RlOgotICogICAgRG9lcyBjb250ZXh0IHN3aXRjaGluZy1SZWxlYXNlIFNQSU5fTE9DSwotICogICAgKGlmIGFueSkgYmVmb3JlIGNhbGxpbmcgdGhpcyByb3V0aW5lLgotICoKLSAqCi0gKiBSZXR1cm46Ci0gKiAgICBTdWNjZXNzIChMT09QX1JFQURZKSA6IDAKLSAqICAgIEZhaWxlZCAgKExPT1BfTk9UX1JFQURZKSA6IDEKLSAqLwotc3RhdGljIGlubGluZSBpbnQKLXFsYTJ4MDBfd2FpdF9mb3JfbG9vcF9yZWFkeShzY3NpX3FsYV9ob3N0X3QgKnZoYSkKLXsKLQlpbnQgCSByZXR1cm5fc3RhdHVzID0gUUxBX1NVQ0NFU1M7Ci0JdW5zaWduZWQgbG9uZyBsb29wX3RpbWVvdXQgOwotCXN0cnVjdCBxbGFfaHdfZGF0YSAqaGEgPSB2aGEtPmh3OwotCXNjc2lfcWxhX2hvc3RfdCAqYmFzZV92aGEgPSBwY2lfZ2V0X2RydmRhdGEoaGEtPnBkZXYpOwotCi0JLyogd2FpdCBmb3IgNSBtaW4gYXQgdGhlIG1heCBmb3IgbG9vcCB0byBiZSByZWFkeSAqLwotCWxvb3BfdGltZW91dCA9IGppZmZpZXMgKyAoTUFYX0xPT1BfVElNRU9VVCAqIEhaKTsKLQotCXdoaWxlICgoIWF0b21pY19yZWFkKCZiYXNlX3ZoYS0+bG9vcF9kb3duX3RpbWVyKSAmJgotCSAgICBhdG9taWNfcmVhZCgmYmFzZV92aGEtPmxvb3Bfc3RhdGUpID09IExPT1BfRE9XTikgfHwKLQkgICAgYXRvbWljX3JlYWQoJmJhc2VfdmhhLT5sb29wX3N0YXRlKSAhPSBMT09QX1JFQURZKSB7Ci0JCWlmIChhdG9taWNfcmVhZCgmYmFzZV92aGEtPmxvb3Bfc3RhdGUpID09IExPT1BfREVBRCkgewotCQkJcmV0dXJuX3N0YXR1cyA9IFFMQV9GVU5DVElPTl9GQUlMRUQ7Ci0JCQlicmVhazsKLQkJfQotCQltc2xlZXAoMTAwMCk7Ci0JCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGxvb3BfdGltZW91dCkpIHsKLQkJCXJldHVybl9zdGF0dXMgPSBRTEFfRlVOQ1RJT05fRkFJTEVEOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0JcmV0dXJuIChyZXR1cm5fc3RhdHVzKTsKLX0KLQogc3RhdGljIHZvaWQKIHNwX2dldChzdHJ1Y3Qgc3JiICpzcCkKIHsKQEAgLTEwMzUsMTIgKzk5Myw2IEBACiAJCSAgICAiV2FpdCBmb3IgaGJhIG9ubGluZSBmYWlsZWQgZm9yIGNtZD0lcC5cbiIsIGNtZCk7CiAJCWdvdG8gZWhfcmVzZXRfZmFpbGVkOwogCX0KLQllcnIgPSAxOwotCWlmIChxbGEyeDAwX3dhaXRfZm9yX2xvb3BfcmVhZHkodmhhKSAhPSBRTEFfU1VDQ0VTUykgewotCQlxbF9sb2cocWxfbG9nX3dhcm4sIHZoYSwgMHg4MDBiLAotCQkgICAgIldhaXQgZm9yIGxvb3AgcmVhZHkgZmFpbGVkIGZvciBjbWQ9JXAuXG4iLCBjbWQpOwotCQlnb3RvIGVoX3Jlc2V0X2ZhaWxlZDsKLQl9CiAJZXJyID0gMjsKIAlpZiAoZG9fcmVzZXQoZmNwb3J0LCBjbWQtPmRldmljZS0+bHVuLCBjbWQtPnJlcXVlc3QtPmNwdSArIDEpCiAJCSE9IFFMQV9TVUNDRVNTKSB7CkBAIC0xMTM3LDEwICsxMDg5LDkgQEAKIAkJZ290byBlaF9idXNfcmVzZXRfZG9uZTsKIAl9CiAKLQlpZiAocWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KHZoYSkgPT0gUUxBX1NVQ0NFU1MpIHsKLQkJaWYgKHFsYTJ4MDBfbG9vcF9yZXNldCh2aGEpID09IFFMQV9TVUNDRVNTKQotCQkJcmV0ID0gU1VDQ0VTUzsKLQl9CisJaWYgKHFsYTJ4MDBfbG9vcF9yZXNldCh2aGEpID09IFFMQV9TVUNDRVNTKQorCQlyZXQgPSBTVUNDRVNTOworCiAJaWYgKHJldCA9PSBGQUlMRUQpCiAJCWdvdG8gZWhfYnVzX3Jlc2V0X2RvbmU7CiAKQEAgLTEyMDYsMTUgKzExNTcsNiBAQAogCWlmIChxbGEyeDAwX3dhaXRfZm9yX3Jlc2V0X3JlYWR5KHZoYSkgIT0gUUxBX1NVQ0NFU1MpCiAJCWdvdG8gZWhfaG9zdF9yZXNldF9sb2NrOwogCi0JLyoKLQkgKiBGaXhtZS1tYXkgYmUgZHBjIHRocmVhZCBpcyBhY3RpdmUgYW5kIHByb2Nlc3NpbmcKLQkgKiBsb29wX3Jlc3luYyxzbyB3YWl0IGEgd2hpbGUgZm9yIGl0IHRvCi0JICogYmUgY29tcGxldGVkIGFuZCB0aGVuIGlzc3VlIGJpZyBoYW1tZXIuT3RoZXJ3aXNlCi0JICogaXQgbWF5IGNhdXNlIEkvTyBmYWlsdXJlIGFzIGJpZyBoYW1tZXIgbWFya3MgdGhlCi0JICogZGV2aWNlcyBhcyBsb3N0IGtpY2tpbmcgb2YgdGhlIHBvcnRfZG93bl90aW1lcgotCSAqIHdoaWxlIGRwYyBpcyBzdHVjayBmb3IgdGhlIG1haWxib3ggdG8gY29tcGxldGUuCi0JICovCi0JcWxhMngwMF93YWl0X2Zvcl9sb29wX3JlYWR5KHZoYSk7CiAJaWYgKHZoYSAhPSBiYXNlX3ZoYSkgewogCQlpZiAocWxhMngwMF92cF9hYm9ydF9pc3AodmhhKSkKIAkJCWdvdG8gZWhfaG9zdF9yZXNldF9sb2NrOwpAQCAtMTI5NywxNiArMTIzOSwxMyBAQAogCQlhdG9taWNfc2V0KCZ2aGEtPmxvb3Bfc3RhdGUsIExPT1BfRE9XTik7CiAJCWF0b21pY19zZXQoJnZoYS0+bG9vcF9kb3duX3RpbWVyLCBMT09QX0RPV05fVElNRSk7CiAJCXFsYTJ4MDBfbWFya19hbGxfZGV2aWNlc19sb3N0KHZoYSwgMCk7Ci0JCXFsYTJ4MDBfd2FpdF9mb3JfbG9vcF9yZWFkeSh2aGEpOwogCX0KIAogCWlmIChoYS0+ZmxhZ3MuZW5hYmxlX2xpcF9yZXNldCkgewogCQlyZXQgPSBxbGEyeDAwX2xpcF9yZXNldCh2aGEpOwotCQlpZiAocmV0ICE9IFFMQV9TVUNDRVNTKSB7CisJCWlmIChyZXQgIT0gUUxBX1NVQ0NFU1MpCiAJCQlxbF9kYmcocWxfZGJnX3Rhc2ttLCB2aGEsIDB4ODAyZSwKIAkJCSAgICAibGlwX3Jlc2V0IGZhaWxlZCAoJWQpLlxuIiwgcmV0KTsKLQkJfSBlbHNlCi0JCQlxbGEyeDAwX3dhaXRfZm9yX2xvb3BfcmVhZHkodmhhKTsKIAl9CiAKIAkvKiBJc3N1ZSBtYXJrZXIgY29tbWFuZCBvbmx5IHdoZW4gd2UgYXJlIGdvaW5nIHRvIHN0YXJ0IHRoZSBJL08gKi8KQEAgLTQwNzAsMTMgKzQwMDksOCBAQAogCQkvKiBGb3IgSVNQODJYWCBjb21wbGV0ZSBhbnkgcGVuZGluZyBtYWlsYm94IGNtZCAqLwogCQlpZiAoSVNfUUxBODJYWChoYSkpIHsKIAkJCWhhLT5mbGFncy5pc3A4Mnh4X2Z3X2h1bmcgPSAxOwotCQkJaWYgKGhhLT5mbGFncy5tYm94X2J1c3kpIHsKLQkJCQloYS0+ZmxhZ3MubWJveF9pbnQgPSAxOwotCQkJCXFsX2RiZyhxbF9kYmdfYWVyLCB2aGEsIDB4OTAwMSwKLQkJCQkgICAgIkR1ZSB0byBwY2kgY2hhbm5lbCBpbyBmcm96ZW4sIGRvaW5nIHByZW1hdHVyZSAiCi0JCQkJICAgICJjb21wbGV0aW9uIG9mIG1ieCBjb21tYW5kLlxuIik7Ci0JCQkJY29tcGxldGUoJmhhLT5tYnhfaW50cl9jb21wKTsKLQkJCX0KKwkJCXFsX2RiZyhxbF9kYmdfYWVyLCB2aGEsIDB4OTAwMSwgIlBjaSBjaGFubmVsIGlvIGZyb3plblxuIik7CisJCQlxbGE4Mnh4X2NsZWFyX3BlbmRpbmdfbWJ4KHZoYSk7CiAJCX0KIAkJcWxhMngwMF9mcmVlX2lycXModmhhKTsKIAkJcGNpX2Rpc2FibGVfZGV2aWNlKHBkZXYpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaCBiL2RyaXZlcnMvc2NzaS9xbGEyeHh4L3FsYV92ZXJzaW9uLmgKaW5kZXggMTNiNjM1Ny4uMjNmMzNhNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTJ4eHgvcWxhX3ZlcnNpb24uaAorKysgYi9kcml2ZXJzL3Njc2kvcWxhMnh4eC9xbGFfdmVyc2lvbi5oCkBAIC03LDcgKzcsNyBAQAogLyoKICAqIERyaXZlciB2ZXJzaW9uCiAgKi8KLSNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDMuMDcuMDctayIKKyNkZWZpbmUgUUxBMlhYWF9WRVJTSU9OICAgICAgIjguMDMuMDcuMTItayIKIAogI2RlZmluZSBRTEFfRFJJVkVSX01BSk9SX1ZFUgk4CiAjZGVmaW5lIFFMQV9EUklWRVJfTUlOT1JfVkVSCTMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaCBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9kZWYuaAppbmRleCBhY2U2MzdiLi5mZDVlZGM2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZGVmLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2RlZi5oCkBAIC0xNDcsNyArMTQ3LDcgQEAKICNkZWZpbmUgSVNDU0lfQUxJQVNfU0laRQkJMzIJLyogSVNDU0kgQWxpYXMgbmFtZSBzaXplICovCiAjZGVmaW5lIElTQ1NJX05BTUVfU0laRQkJCTB4RTAJLyogSVNDU0kgTmFtZSBzaXplICovCiAKLSNkZWZpbmUgUUw0X1NFU1NfUkVDT1ZFUllfVE1PCQkzMAkvKiBpU0NTSSBzZXNzaW9uICovCisjZGVmaW5lIFFMNF9TRVNTX1JFQ09WRVJZX1RNTwkJMTIwCS8qIGlTQ1NJIHNlc3Npb24gKi8KIAkJCQkJCS8qIHJlY292ZXJ5IHRpbWVvdXQgKi8KIAogI2RlZmluZSBMU0RXKHgpICgodTMyKSgodTY0KSh4KSkpCkBAIC0xNzMsNiArMTczLDggQEAKICNkZWZpbmUgSVNOU19ERVJFR19UT1YJCQk1CiAjZGVmaW5lIEhCQV9PTkxJTkVfVE9WCQkJMzAKICNkZWZpbmUgRElTQUJMRV9BQ0JfVE9WCQkJMzAKKyNkZWZpbmUgSVBfQ09ORklHX1RPVgkJCTMwCisjZGVmaW5lIExPR0lOX1RPVgkJCTEyCiAKICNkZWZpbmUgTUFYX1JFU0VUX0hBX1JFVFJJRVMJCTIKIApAQCAtMjQwLDYgKzI0Miw0NSBAQAogCiAJdWludDE2X3QgZndfZGRiX2luZGV4OwkvKiBEREIgZmlybXdhcmUgaW5kZXggKi8KIAl1aW50MzJfdCBmd19kZGJfZGV2aWNlX3N0YXRlOyAvKiBGL1cgRGV2aWNlIFN0YXRlICAtLSBzZWUgcWw0X2Z3LmggKi8KKwl1aW50MTZfdCBkZGJfdHlwZTsKKyNkZWZpbmUgRkxBU0hfRERCIDB4MDEKKworCXN0cnVjdCBkZXZfZGJfZW50cnkgZndfZGRiX2VudHJ5OworCWludCAoKnVuYmxvY2tfc2Vzcykoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbik7CisJaW50ICgqZGRiX2NoYW5nZSkoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBmd19kZGJfaW5kZXgsCisJCQkgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgdWludDMyX3Qgc3RhdGUpOworCisJLyogRHJpdmVyIFJlLWxvZ2luICAqLworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CQkgIC8qIEREQiBGbGFncyAqLworCXVpbnQxNl90IGRlZmF1bHRfcmVsb2dpbl90aW1lb3V0OyAvKiAgTWF4IHRpbWUgdG8gd2FpdCBmb3IKKwkJCQkJICAgKiAgcmVsb2dpbiB0byBjb21wbGV0ZSAqLworCWF0b21pY190IHJldHJ5X3JlbG9naW5fdGltZXI7CSAgLyogTWluIFRpbWUgYmV0d2VlbiByZWxvZ2lucworCQkJCQkgICAqICg0MDAwIG9ubHkpICovCisJYXRvbWljX3QgcmVsb2dpbl90aW1lcjsJCSAgLyogTWF4IFRpbWUgdG8gd2FpdCBmb3IKKwkJCQkJICAgKiByZWxvZ2luIHRvIGNvbXBsZXRlICovCisJYXRvbWljX3QgcmVsb2dpbl9yZXRyeV9jb3VudDsJICAvKiBOdW0gb2YgdGltZXMgcmVsb2dpbiBoYXMgYmVlbgorCQkJCQkgICAqIHJldHJpZWQgKi8KKwl1aW50MzJfdCBkZWZhdWx0X3RpbWUyd2FpdDsJICAvKiBEZWZhdWx0IE1pbiB0aW1lIGJldHdlZW4KKwkJCQkJICAgKiByZWxvZ2lucyAoK2FlbnMpICovCisKK307CisKK3N0cnVjdCBxbGFfZGRiX2luZGV4IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJdWludDE2X3QgZndfZGRiX2lkeDsKKwlzdHJ1Y3QgZGV2X2RiX2VudHJ5IGZ3X2RkYjsKK307CisKKyNkZWZpbmUgRERCX0lQQUREUl9MRU4gNjQKKworc3RydWN0IHFsNF90dXBsZV9kZGIgeworCWludCBwb3J0OworCWludCB0cGd0OworCWNoYXIgaXBfYWRkcltEREJfSVBBRERSX0xFTl07CisJY2hhciBpc2NzaV9uYW1lW0lTQ1NJX05BTUVfU0laRV07CisJdWludDE2X3Qgb3B0aW9uczsKKyNkZWZpbmUgRERCX09QVF9JUFY2IDB4MGUwZQorI2RlZmluZSBEREJfT1BUX0lQVjQgMHgwZjBmCiB9OwogCiAvKgpAQCAtNDExLDcgKzQ1Miw3IEBACiAjZGVmaW5lIEFGX0ZXX1JFQ09WRVJZCQkJMTkgLyogMHgwMDA4MDAwMCAqLwogI2RlZmluZSBBRl9FRUhfQlVTWQkJCTIwIC8qIDB4MDAxMDAwMDAgKi8KICNkZWZpbmUgQUZfUENJX0NIQU5ORUxfSU9fUEVSTV9GQUlMVVJFCTIxIC8qIDB4MDAyMDAwMDAgKi8KLQorI2RlZmluZSBBRl9CVUlMRF9EREJfTElTVAkJMjIgLyogMHgwMDQwMDAwMCAqLwogCXVuc2lnbmVkIGxvbmcgZHBjX2ZsYWdzOwogCiAjZGVmaW5lIERQQ19SRVNFVF9IQQkJCTEgLyogMHgwMDAwMDAwMiAqLwpAQCAtNjA0LDYgKzY0NSw3IEBACiAJdWludDE2X3QgYm9vdGxvYWRfbWlub3I7CiAJdWludDE2X3QgYm9vdGxvYWRfcGF0Y2g7CiAJdWludDE2X3QgYm9vdGxvYWRfYnVpbGQ7CisJdWludDE2X3QgZGVmX3RpbWVvdXQ7IC8qIERlZmF1bHQgbG9naW4gdGltZW91dCAqLwogCiAJdWludDMyX3QgZmxhc2hfc3RhdGU7CiAjZGVmaW5lCVFMRkxBU0hfV0FJVElORwkJMApAQCAtNjIzLDYgKzY2NSwxMSBAQAogCXVpbnQxNl90IGlzY3NpX3BjaV9mdW5jX2NudDsKIAl1aW50OF90IG1vZGVsX25hbWVbMTZdOwogCXN0cnVjdCBjb21wbGV0aW9uIGRpc2FibGVfYWNiX2NvbXA7CisJc3RydWN0IGRtYV9wb29sICpmd19kZGJfZG1hX3Bvb2w7CisjZGVmaW5lIEREQl9ETUFfQkxPQ0tfU0laRSA1MTIKKwl1aW50MTZfdCBwcmlfZGRiX2lkeDsKKwl1aW50MTZfdCBzZWNfZGRiX2lkeDsKKwlpbnQgaXNfcmVzZXQ7CiB9OwogCiBzdHJ1Y3QgcWw0X3Rhc2tfZGF0YSB7CkBAIC04MzUsNiArODgyLDEwIEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKIC8qIERlZmluZXMgZm9yIHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKCkgYW5kIHFsYTR4eHhfcmVjb3Zlcl9hZGFwdGVyKCkgKi8KKworI2RlZmluZSBJTklUX0FEQVBURVIgICAgMAorI2RlZmluZSBSRVNFVF9BREFQVEVSICAgMQorCiAjZGVmaW5lIFBSRVNFUlZFX0REQl9MSVNUCTAKICNkZWZpbmUgUkVCVUlMRF9EREJfTElTVAkxCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9mdy5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKaW5kZXggY2JkNWEyMC4uNGFjMDdmOCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2Z3LmgKQEAgLTEyLDYgKzEyLDcgQEAKICNkZWZpbmUgTUFYX1BSU1RfREVWX0RCX0VOVFJJRVMJCTY0CiAjZGVmaW5lIE1JTl9ESVNDX0RFVl9EQl9FTlRSWQkJTUFYX1BSU1RfREVWX0RCX0VOVFJJRVMKICNkZWZpbmUgTUFYX0RFVl9EQl9FTlRSSUVTCQk1MTIKKyNkZWZpbmUgTUFYX0RFVl9EQl9FTlRSSUVTXzQwWFgJCTI1NgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTYwNCw2ICs2MDUsMTMgQEAKIAl1aW50OF90IHJlczE0WzE0MF07CS8qIDI3NC0yRkYgKi8KIH07CiAKKyNkZWZpbmUgSVBfQUREUl9DT1VOVAk0IC8qIFRvdGFsIDQgSVAgYWRkcmVzcyBzdXBwb3J0ZWQgaW4gb25lIGludGVyZmFjZQorCQkJICAgKiBPbmUgSVB2NCwgb25lIElQdjYgbGluayBsb2NhbCBhbmQgMiBJUHY2CisJCQkgICAqLworCisjZGVmaW5lIElQX1NUQVRFX01BU0sJMHgwRjAwMDAwMAorI2RlZmluZSBJUF9TVEFURV9TSElGVAkyNAorCiBzdHJ1Y3QgaW5pdF9md19jdHJsX2JsayB7CiAJc3RydWN0IGFkZHJfY3RybF9ibGsgcHJpOwogLyoJc3RydWN0IGFkZHJfY3RybF9ibGsgc2VjOyovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2dsYmwuaAppbmRleCAxNjBkYjlkLi5kMGRkNGIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfZ2xibC5oCisrKyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9nbGJsLmgKQEAgLTEzLDcgKzEzLDcgQEAKIGludCBxbGE0eHh4X2h3X3Jlc2V0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CiBpbnQgcWw0eHh4X2xvY2tfZHJ2cl93YWl0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICphKTsKIGludCBxbGE0eHh4X3NlbmRfY29tbWFuZF90b19pc3Aoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBzdHJ1Y3Qgc3JiICpzcmIpOwotaW50IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSk7CitpbnQgcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgaXNfcmVzZXQpOwogaW50IHFsYTR4eHhfc29mdF9yZXNldChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogaXJxcmV0dXJuX3QgcWxhNHh4eF9pbnRyX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIApAQCAtMTUzLDEwICsxNTMsMTMgQEAKIAkJCSAgdWludDMyX3QgKm1ieF9zdHMpOwogaW50IHFsYTR4eHhfY2xlYXJfZGRiX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgZndfZGRiX2luZGV4KTsKIGludCBxbGE0eHh4X3NlbmRfcGFzc3RocnUwKHN0cnVjdCBpc2NzaV90YXNrICp0YXNrKTsKK3ZvaWQgcWxhNHh4eF9mcmVlX2RkYl9pbmRleChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpOwogaW50IHFsYTR4eHhfZ2V0X21nbXRfZGF0YShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQxNl90IGZ3X2RkYl9pbmRleCwKIAkJCSAgdWludDE2X3Qgc3RhdHNfc2l6ZSwgZG1hX2FkZHJfdCBzdGF0c19kbWEpOwogdm9pZCBxbGE0eHh4X3VwZGF0ZV9zZXNzaW9uX2Nvbm5fcGFyYW0oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAogCQkJCSAgICAgICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpOwordm9pZCBxbGE0eHh4X3VwZGF0ZV9zZXNzaW9uX2Nvbm5fZndkZGJfcGFyYW0oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJCQkgICAgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSk7CiBpbnQgcWxhNHh4eF9ib290ZGJfYnlfaW5kZXgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAogCQkJICAgIHN0cnVjdCBkZXZfZGJfZW50cnkgKmZ3X2RkYl9lbnRyeSwKIAkJCSAgICBkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWEsIHVpbnQxNl90IGRkYl9pbmRleCk7CkBAIC0xNjksMTEgKzE3MiwyMiBAQAogaW50IHFsYTR4eHhfcmVzdG9yZV9mYWN0b3J5X2RlZmF1bHRzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKIAkJCQkgICAgIHVpbnQzMl90IHJlZ2lvbiwgdWludDMyX3QgZmllbGQwLAogCQkJCSAgICAgdWludDMyX3QgZmllbGQxKTsKK2ludCBxbGE0eHh4X2dldF9kZGJfaW5kZXgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MTZfdCAqZGRiX2luZGV4KTsKK3ZvaWQgcWxhNHh4eF9sb2dpbl9mbGFzaF9kZGIoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2Vzc2lvbik7CitpbnQgcWxhNHh4eF91bmJsb2NrX2RkYihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKTsKK2ludCBxbGE0eHh4X3VuYmxvY2tfZmxhc2hfZGRiKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pOworaW50IHFsYTR4eHhfZmxhc2hfZGRiX2NoYW5nZShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsIHVpbnQzMl90IGZ3X2RkYl9pbmRleCwKKwkJCSAgICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LCB1aW50MzJfdCBzdGF0ZSk7CitpbnQgcWxhNHh4eF9kZGJfY2hhbmdlKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDMyX3QgZndfZGRiX2luZGV4LAorCQkgICAgICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LCB1aW50MzJfdCBzdGF0ZSk7Cit2b2lkIHFsYTR4eHhfYnVpbGRfZGRiX2xpc3Qoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCBpbnQgaXNfcmVzZXQpOwogCiAvKiBCU0cgRnVuY3Rpb25zICovCiBpbnQgcWxhNHh4eF9ic2dfcmVxdWVzdChzdHJ1Y3QgYnNnX2pvYiAqYnNnX2pvYik7CiBpbnQgcWxhNHh4eF9wcm9jZXNzX3ZlbmRvcl9zcGVjaWZpYyhzdHJ1Y3QgYnNnX2pvYiAqYnNnX2pvYik7CiAKK3ZvaWQgcWxhNHh4eF9hcm1fcmVsb2dpbl90aW1lcihzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpOworCiBleHRlcm4gaW50IHFsNHhleHRlbmRlZF9lcnJvcl9sb2dnaW5nOwogZXh0ZXJuIGludCBxbDR4ZG9udHJlc2V0aGJhOwogZXh0ZXJuIGludCBxbDR4ZW5hYmxlbXNpeDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfaW5pdC5jCmluZGV4IDMwNzVmYmEuLjFiZGZhODEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9pbml0LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X2luaXQuYwpAQCAtNzczLDIyICs3NzMsMjQgQEAKICAqIGJlIGZyZWVkIHNvIHRoYXQgd2hlbiBsb2dpbiBoYXBwZW5zIGZyb20gdXNlciBzcGFjZSB0aGVyZSBhcmUgZnJlZSBEREIKICAqIGluZGljZXMgYXZhaWxhYmxlLgogICoqLwotc3RhdGljIHZvaWQgcWxhNHh4eF9mcmVlX2RkYl9pbmRleChzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit2b2lkIHFsYTR4eHhfZnJlZV9kZGJfaW5kZXgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQogewogCWludCBtYXhfZGRiczsKIAlpbnQgcmV0OwogCXVpbnQzMl90IGlkeCA9IDAsIG5leHRfaWR4ID0gMDsKIAl1aW50MzJfdCBzdGF0ZSA9IDAsIGNvbm5fZXJyID0gMDsKIAotCW1heF9kZGJzID0gIGlzX3FsYTQwWFgoaGEpID8gTUFYX1BSU1RfREVWX0RCX0VOVFJJRVMgOgorCW1heF9kZGJzID0gIGlzX3FsYTQwWFgoaGEpID8gTUFYX0RFVl9EQl9FTlRSSUVTXzQwWFggOgogCQkJCSAgICAgTUFYX0RFVl9EQl9FTlRSSUVTOwogCiAJZm9yIChpZHggPSAwOyBpZHggPCBtYXhfZGRiczsgaWR4ID0gbmV4dF9pZHgpIHsKIAkJcmV0ID0gcWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGlkeCwgTlVMTCwgMCwgTlVMTCwKIAkJCQkJICAgICAgJm5leHRfaWR4LCAmc3RhdGUsICZjb25uX2VyciwKIAkJCQkJCU5VTEwsIE5VTEwpOwotCQlpZiAocmV0ID09IFFMQV9FUlJPUikKKwkJaWYgKHJldCA9PSBRTEFfRVJST1IpIHsKKwkJCW5leHRfaWR4Kys7CiAJCQljb250aW51ZTsKKwkJfQogCQlpZiAoc3RhdGUgPT0gRERCX0RTX05PX0NPTk5FQ1RJT05fQUNUSVZFIHx8CiAJCSAgICBzdGF0ZSA9PSBEREJfRFNfU0VTU0lPTl9GQUlMRUQpIHsKIAkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCkBAIC04MDQsNyArODA2LDYgQEAKIAl9CiB9CiAKLQogLyoqCiAgKiBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlciAtIGluaXRpYWlsaXplcyBoYmEKICAqIEBoYTogUG9pbnRlciB0byBob3N0IGFkYXB0ZXIgc3RydWN0dXJlLgpAQCAtODEyLDcgKzgxMyw3IEBACiAgKiBUaGlzIHJvdXRpbmUgcGFyZm9ybXMgYWxsIG9mIHRoZSBzdGVwcyBuZWNlc3NhcnkgdG8gaW5pdGlhbGl6ZSB0aGUgYWRhcHRlci4KICAqCiAgKiovCi1pbnQgcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKQoraW50IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgaW50IGlzX3Jlc2V0KQogewogCWludCBzdGF0dXMgPSBRTEFfRVJST1I7CiAKQEAgLTg0MCw3ICs4NDEsOCBAQAogCWlmIChzdGF0dXMgPT0gUUxBX0VSUk9SKQogCQlnb3RvIGV4aXRfaW5pdF9oYmE7CiAKLQlxbGE0eHh4X2ZyZWVfZGRiX2luZGV4KGhhKTsKKwlpZiAoaXNfcmVzZXQgPT0gUkVTRVRfQURBUFRFUikKKwkJcWxhNHh4eF9idWlsZF9kZGJfbGlzdChoYSwgaXNfcmVzZXQpOwogCiAJc2V0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpOwogZXhpdF9pbml0X2hiYToKQEAgLTg1NSwzOCArODU3LDEyIEBACiAJcmV0dXJuIHN0YXR1czsKIH0KIAotLyoqCi0gKiBxbGE0eHh4X3Byb2Nlc3NfZGRiX2NoYW5nZWQgLSBwcm9jZXNzIGRkYiBzdGF0ZSBjaGFuZ2UKLSAqIEBoYSAtIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KLSAqIEBmd19kZGJfaW5kZXggLSBGaXJtd2FyZSdzIGRldmljZSBkYXRhYmFzZSBpbmRleAotICogQHN0YXRlIC0gRGV2aWNlIHN0YXRlCi0gKgotICogVGhpcyByb3V0aW5lIHByb2Nlc3NlcyBhIERlY2l2ZSBEYXRhYmFzZSBDaGFuZ2VkIEFFTiBFdmVudC4KLSAqKi8KLWludCBxbGE0eHh4X3Byb2Nlc3NfZGRiX2NoYW5nZWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBmd19kZGJfaW5kZXgsCi0JCXVpbnQzMl90IHN0YXRlLCB1aW50MzJfdCBjb25uX2VycikKK2ludCBxbGE0eHh4X2RkYl9jaGFuZ2Uoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBmd19kZGJfaW5kZXgsCisJCSAgICAgICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksIHVpbnQzMl90IHN0YXRlKQogewotCXN0cnVjdCBkZGJfZW50cnkgKiBkZGJfZW50cnk7CiAJdWludDMyX3Qgb2xkX2Z3X2RkYl9kZXZpY2Vfc3RhdGU7CiAJaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKIAotCS8qIGNoZWNrIGZvciBvdXQgb2YgcmFuZ2UgaW5kZXggKi8KLQlpZiAoZndfZGRiX2luZGV4ID49IE1BWF9EREJfRU5UUklFUykKLQkJZ290byBleGl0X2RkYl9ldmVudDsKLQotCS8qIEdldCB0aGUgY29ycmVzcG9uZ2luZyBkZGIgZW50cnkgKi8KLQlkZGJfZW50cnkgPSBxbGE0eHh4X2xvb2t1cF9kZGJfYnlfZndfaW5kZXgoaGEsIGZ3X2RkYl9pbmRleCk7Ci0JLyogRGV2aWNlIGRvZXMgbm90IGN1cnJlbnRseSBleGlzdCBpbiBvdXIgZGF0YWJhc2UuICovCi0JaWYgKGRkYl9lbnRyeSA9PSBOVUxMKSB7Ci0JCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiJXM6IE5vIGRkYl9lbnRyeSBhdCBGVyBpbmRleCBbJWRdXG4iLAotCQkJICAgX19mdW5jX18sIGZ3X2RkYl9pbmRleCk7Ci0KLQkJaWYgKHN0YXRlID09IEREQl9EU19OT19DT05ORUNUSU9OX0FDVElWRSkKLQkJCWNsZWFyX2JpdChmd19kZGJfaW5kZXgsIGhhLT5kZGJfaWR4X21hcCk7Ci0KLQkJZ290byBleGl0X2RkYl9ldmVudDsKLQl9Ci0KIAlvbGRfZndfZGRiX2RldmljZV9zdGF0ZSA9IGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZTsKIAlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAogCQkJICAiJXM6IEREQiAtIG9sZCBzdGF0ZSA9IDB4JXgsIG5ldyBzdGF0ZSA9IDB4JXggZm9yICIKQEAgLTkwMCw5ICs4NzYsNyBAQAogCQlzd2l0Y2ggKHN0YXRlKSB7CiAJCWNhc2UgRERCX0RTX1NFU1NJT05fQUNUSVZFOgogCQljYXNlIEREQl9EU19ESVNDT1ZFUlk6Ci0JCQlpc2NzaV9jb25uX3N0YXJ0KGRkYl9lbnRyeS0+Y29ubik7Ci0JCQlpc2NzaV9jb25uX2xvZ2luX2V2ZW50KGRkYl9lbnRyeS0+Y29ubiwKLQkJCQkJICAgICAgIElTQ1NJX0NPTk5fU1RBVEVfTE9HR0VEX0lOKTsKKwkJCWRkYl9lbnRyeS0+dW5ibG9ja19zZXNzKGRkYl9lbnRyeS0+c2Vzcyk7CiAJCQlxbGE0eHh4X3VwZGF0ZV9zZXNzaW9uX2Nvbm5fcGFyYW0oaGEsIGRkYl9lbnRyeSk7CiAJCQlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKIAkJCWJyZWFrOwpAQCAtOTM2LDkgKzkxMCw3IEBACiAJCXN3aXRjaCAoc3RhdGUpIHsKIAkJY2FzZSBEREJfRFNfU0VTU0lPTl9BQ1RJVkU6CiAJCWNhc2UgRERCX0RTX0RJU0NPVkVSWToKLQkJCWlzY3NpX2Nvbm5fc3RhcnQoZGRiX2VudHJ5LT5jb25uKTsKLQkJCWlzY3NpX2Nvbm5fbG9naW5fZXZlbnQoZGRiX2VudHJ5LT5jb25uLAotCQkJCQkgICAgICAgSVNDU0lfQ09OTl9TVEFURV9MT0dHRURfSU4pOworCQkJZGRiX2VudHJ5LT51bmJsb2NrX3Nlc3MoZGRiX2VudHJ5LT5zZXNzKTsKIAkJCXFsYTR4eHhfdXBkYXRlX3Nlc3Npb25fY29ubl9wYXJhbShoYSwgZGRiX2VudHJ5KTsKIAkJCXN0YXR1cyA9IFFMQV9TVUNDRVNTOwogCQkJYnJlYWs7CkBAIC05NTQsNyArOTI2LDE5OCBAQAogCQkJCV9fZnVuY19fKSk7CiAJCWJyZWFrOwogCX0KKwlyZXR1cm4gc3RhdHVzOworfQorCit2b2lkIHFsYTR4eHhfYXJtX3JlbG9naW5fdGltZXIoc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KQoreworCS8qCisJICogVGhpcyB0cmlnZ2VycyBhIHJlbG9naW4uICBBZnRlciB0aGUgcmVsb2dpbl90aW1lcgorCSAqIGV4cGlyZXMsIHRoZSByZWxvZ2luIGdldHMgc2NoZWR1bGVkLiAgV2UgbXVzdCB3YWl0IGEKKwkgKiBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIHNpbmNlIHJlY2VpdmluZyBhbiAweDgwMTQgQUVOCisJICogd2l0aCBmYWlsZWQgZGV2aWNlX3N0YXRlIG9yIGEgbG9nb3V0IHJlc3BvbnNlIGJlZm9yZQorCSAqIHdlIGNhbiBpc3N1ZSBhbm90aGVyIHJlbG9naW4uCisJICoKKwkgKiBGaXJtd2FyZSBwYWRzIHRoaXMgdGltZW91dDogKHRpbWUyd2FpdCArMSkuCisJICogRHJpdmVyIHJldHJ5IHRvIGxvZ2luIHNob3VsZCBiZSBsb25nZXIgdGhhbiBGL1cuCisJICogT3RoZXJ3aXNlIEYvVyB3aWxsIGZhaWwKKwkgKiBzZXRfZGRiKCkgbWJ4IGNtZCB3aXRoIDB4NDAwNSBzaW5jZSBpdCBzdGlsbAorCSAqIGNvdW50aW5nIGRvd24gaXRzIHRpbWUyd2FpdC4KKwkgKi8KKwlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJlbG9naW5fdGltZXIsIDApOworCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+cmV0cnlfcmVsb2dpbl90aW1lciwKKwkJICAgZGRiX2VudHJ5LT5kZWZhdWx0X3RpbWUyd2FpdCArIDQpOworCit9CisKK2ludCBxbGE0eHh4X2ZsYXNoX2RkYl9jaGFuZ2Uoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MzJfdCBmd19kZGJfaW5kZXgsCisJCQkgICAgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSwgdWludDMyX3Qgc3RhdGUpCit7CisJdWludDMyX3Qgb2xkX2Z3X2RkYl9kZXZpY2Vfc3RhdGU7CisJaW50IHN0YXR1cyA9IFFMQV9FUlJPUjsKKworCW9sZF9md19kZGJfZGV2aWNlX3N0YXRlID0gZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlOworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICIlczogRERCIC0gb2xkIHN0YXRlID0gMHgleCwgbmV3IHN0YXRlID0gMHgleCBmb3IgIgorCQkJICAiaW5kZXggWyVkXVxuIiwgX19mdW5jX18sCisJCQkgIGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSwgc3RhdGUsIGZ3X2RkYl9pbmRleCkpOworCisJZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlID0gc3RhdGU7CisKKwlzd2l0Y2ggKG9sZF9md19kZGJfZGV2aWNlX3N0YXRlKSB7CisJY2FzZSBEREJfRFNfTE9HSU5fSU5fUFJPQ0VTUzoKKwljYXNlIEREQl9EU19OT19DT05ORUNUSU9OX0FDVElWRToKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIEREQl9EU19TRVNTSU9OX0FDVElWRToKKwkJCWRkYl9lbnRyeS0+dW5ibG9ja19zZXNzKGRkYl9lbnRyeS0+c2Vzcyk7CisJCQlxbGE0eHh4X3VwZGF0ZV9zZXNzaW9uX2Nvbm5fZndkZGJfcGFyYW0oaGEsIGRkYl9lbnRyeSk7CisJCQlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQljYXNlIEREQl9EU19TRVNTSU9OX0ZBSUxFRDoKKwkJCWlzY3NpX2Jsb2NrX3Nlc3Npb24oZGRiX2VudHJ5LT5zZXNzKTsKKwkJCWlmICghdGVzdF9iaXQoREZfUkVMT0dJTiwgJmRkYl9lbnRyeS0+ZmxhZ3MpKQorCQkJCXFsYTR4eHhfYXJtX3JlbG9naW5fdGltZXIoZGRiX2VudHJ5KTsKKwkJCXN0YXR1cyA9IFFMQV9TVUNDRVNTOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBEREJfRFNfU0VTU0lPTl9BQ1RJVkU6CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBEREJfRFNfU0VTU0lPTl9GQUlMRUQ6CisJCQlpc2NzaV9ibG9ja19zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7CisJCQlpZiAoIXRlc3RfYml0KERGX1JFTE9HSU4sICZkZGJfZW50cnktPmZsYWdzKSkKKwkJCQlxbGE0eHh4X2FybV9yZWxvZ2luX3RpbWVyKGRkYl9lbnRyeSk7CisJCQlzdGF0dXMgPSBRTEFfU1VDQ0VTUzsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRERCX0RTX1NFU1NJT05fRkFJTEVEOgorCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgRERCX0RTX1NFU1NJT05fQUNUSVZFOgorCQkJZGRiX2VudHJ5LT51bmJsb2NrX3Nlc3MoZGRiX2VudHJ5LT5zZXNzKTsKKwkJCXFsYTR4eHhfdXBkYXRlX3Nlc3Npb25fY29ubl9md2RkYl9wYXJhbShoYSwgZGRiX2VudHJ5KTsKKwkJCXN0YXR1cyA9IFFMQV9TVUNDRVNTOworCQkJYnJlYWs7CisJCWNhc2UgRERCX0RTX1NFU1NJT05fRkFJTEVEOgorCQkJaWYgKCF0ZXN0X2JpdChERl9SRUxPR0lOLCAmZGRiX2VudHJ5LT5mbGFncykpCisJCQkJcWxhNHh4eF9hcm1fcmVsb2dpbl90aW1lcihkZGJfZW50cnkpOworCQkJc3RhdHVzID0gUUxBX1NVQ0NFU1M7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAiJXM6IFVua25vd24gRXZlbnRcbiIsCisJCQkJICBfX2Z1bmNfXykpOworCQlicmVhazsKKwl9CisJcmV0dXJuIHN0YXR1czsKK30KKworLyoqCisgKiBxbGE0eHh4X3Byb2Nlc3NfZGRiX2NoYW5nZWQgLSBwcm9jZXNzIGRkYiBzdGF0ZSBjaGFuZ2UKKyAqIEBoYSAtIFBvaW50ZXIgdG8gaG9zdCBhZGFwdGVyIHN0cnVjdHVyZS4KKyAqIEBmd19kZGJfaW5kZXggLSBGaXJtd2FyZSdzIGRldmljZSBkYXRhYmFzZSBpbmRleAorICogQHN0YXRlIC0gRGV2aWNlIHN0YXRlCisgKgorICogVGhpcyByb3V0aW5lIHByb2Nlc3NlcyBhIERlY2l2ZSBEYXRhYmFzZSBDaGFuZ2VkIEFFTiBFdmVudC4KKyAqKi8KK2ludCBxbGE0eHh4X3Byb2Nlc3NfZGRiX2NoYW5nZWQoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJCXVpbnQzMl90IGZ3X2RkYl9pbmRleCwKKwkJCQl1aW50MzJfdCBzdGF0ZSwgdWludDMyX3QgY29ubl9lcnIpCit7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCWludCBzdGF0dXMgPSBRTEFfRVJST1I7CisKKwkvKiBjaGVjayBmb3Igb3V0IG9mIHJhbmdlIGluZGV4ICovCisJaWYgKGZ3X2RkYl9pbmRleCA+PSBNQVhfRERCX0VOVFJJRVMpCisJCWdvdG8gZXhpdF9kZGJfZXZlbnQ7CisKKwkvKiBHZXQgdGhlIGNvcnJlc3BvbmdpbmcgZGRiIGVudHJ5ICovCisJZGRiX2VudHJ5ID0gcWxhNHh4eF9sb29rdXBfZGRiX2J5X2Z3X2luZGV4KGhhLCBmd19kZGJfaW5kZXgpOworCS8qIERldmljZSBkb2VzIG5vdCBjdXJyZW50bHkgZXhpc3QgaW4gb3VyIGRhdGFiYXNlLiAqLworCWlmIChkZGJfZW50cnkgPT0gTlVMTCkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIiVzOiBObyBkZGJfZW50cnkgYXQgRlcgaW5kZXggWyVkXVxuIiwKKwkJCSAgIF9fZnVuY19fLCBmd19kZGJfaW5kZXgpOworCisJCWlmIChzdGF0ZSA9PSBEREJfRFNfTk9fQ09OTkVDVElPTl9BQ1RJVkUpCisJCQljbGVhcl9iaXQoZndfZGRiX2luZGV4LCBoYS0+ZGRiX2lkeF9tYXApOworCisJCWdvdG8gZXhpdF9kZGJfZXZlbnQ7CisJfQorCisJZGRiX2VudHJ5LT5kZGJfY2hhbmdlKGhhLCBmd19kZGJfaW5kZXgsIGRkYl9lbnRyeSwgc3RhdGUpOwogCiBleGl0X2RkYl9ldmVudDoKIAlyZXR1cm4gc3RhdHVzOwogfQorCisvKioKKyAqIHFsYTR4eHhfbG9naW5fZmxhc2hfZGRiIC0gTG9naW4gdG8gdGFyZ2V0IChEREIpCisgKiBAY2xzX3Nlc3Npb246IFBvaW50ZXIgdG8gdGhlIHNlc3Npb24gdG8gbG9naW4KKyAqCisgKiBUaGlzIHJvdXRpbmUgbG9naW5zIHRvIHRoZSB0YXJnZXQuCisgKiBJc3N1ZXMgc2V0ZGRiIGFuZCBjb25uIG9wZW4gbWJ4CisgKiovCit2b2lkIHFsYTR4eHhfbG9naW5fZmxhc2hfZGRiKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pCit7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKwlzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnkgPSBOVUxMOworCWRtYV9hZGRyX3QgZndfZGRiX2RtYTsKKwl1aW50MzJfdCBtYnhfc3RzID0gMDsKKwlpbnQgcmV0OworCisJc2VzcyA9IGNsc19zZXNzaW9uLT5kZF9kYXRhOworCWRkYl9lbnRyeSA9IHNlc3MtPmRkX2RhdGE7CisJaGEgPSAgZGRiX2VudHJ5LT5oYTsKKworCWlmICghdGVzdF9iaXQoQUZfTElOS19VUCwgJmhhLT5mbGFncykpCisJCXJldHVybjsKKworCWlmIChkZGJfZW50cnktPmRkYl90eXBlICE9IEZMQVNIX0REQikgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgIlNraXBwaW5nIGxvZ2luIHRvIG5vbiBGTEFTSCBEQiIpKTsKKwkJZ290byBleGl0X2xvZ2luOworCX0KKworCWZ3X2RkYl9lbnRyeSA9IGRtYV9wb29sX2FsbG9jKGhhLT5md19kZGJfZG1hX3Bvb2wsIEdGUF9LRVJORUwsCisJCQkJICAgICAgJmZ3X2RkYl9kbWEpOworCWlmIChmd19kZGJfZW50cnkgPT0gTlVMTCkgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJPdXQgb2YgbWVtb3J5XG4iKSk7CisJCWdvdG8gZXhpdF9sb2dpbjsKKwl9CisKKwlpZiAoZGRiX2VudHJ5LT5md19kZGJfaW5kZXggPT0gSU5WQUxJRF9FTlRSWSkgeworCQlyZXQgPSBxbGE0eHh4X2dldF9kZGJfaW5kZXgoaGEsICZkZGJfZW50cnktPmZ3X2RkYl9pbmRleCk7CisJCWlmIChyZXQgPT0gUUxBX0VSUk9SKQorCQkJZ290byBleGl0X2xvZ2luOworCisJCWhhLT5md19kZGJfaW5kZXhfbWFwW2RkYl9lbnRyeS0+ZndfZGRiX2luZGV4XSA9IGRkYl9lbnRyeTsKKwkJaGEtPnRvdF9kZGJzKys7CisJfQorCisJbWVtY3B5KGZ3X2RkYl9lbnRyeSwgJmRkYl9lbnRyeS0+ZndfZGRiX2VudHJ5LAorCSAgICAgICBzaXplb2Yoc3RydWN0IGRldl9kYl9lbnRyeSkpOworCWRkYl9lbnRyeS0+c2Vzcy0+dGFyZ2V0X2lkID0gZGRiX2VudHJ5LT5md19kZGJfaW5kZXg7CisKKwlyZXQgPSBxbGE0eHh4X3NldF9kZGJfZW50cnkoaGEsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LAorCQkJCSAgICBmd19kZGJfZG1hLCAmbWJ4X3N0cyk7CisJaWYgKHJldCA9PSBRTEFfRVJST1IpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9FUlIsIGhhLCAiU2V0IEREQiBmYWlsZWRcbiIpKTsKKwkJZ290byBleGl0X2xvZ2luOworCX0KKworCWRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9IEREQl9EU19MT0dJTl9JTl9QUk9DRVNTOworCXJldCA9IHFsYTR4eHhfY29ubl9vcGVuKGhhLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCk7CisJaWYgKHJldCA9PSBRTEFfRVJST1IpIHsKKwkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogTG9naW4gZmFpbGVkOiAlc1xuIiwgX19mdW5jX18sCisJCQkgICBzZXNzLT50YXJnZXRuYW1lKTsKKwkJZ290byBleGl0X2xvZ2luOworCX0KKworZXhpdF9sb2dpbjoKKwlpZiAoZndfZGRiX2VudHJ5KQorCQlkbWFfcG9vbF9mcmVlKGhhLT5md19kZGJfZG1hX3Bvb2wsIGZ3X2RkYl9lbnRyeSwgZndfZGRiX2RtYSk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYyBiL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF9tYnguYwppbmRleCA0YzJiODQ4Li5jMjU5Mzc4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfbWJ4LmMKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X21ieC5jCkBAIC00MSw2ICs0MSwxNiBAQAogCQlyZXR1cm4gc3RhdHVzOwogCX0KIAorCWlmIChpc19xbGE0MFhYKGhhKSkgeworCQlpZiAodGVzdF9iaXQoQUZfSEFfUkVNT1ZBTCwgJmhhLT5mbGFncykpIHsKKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpJWxkOiAlczogIgorCQkJCQkgICJwcmVtYXR1cmVseSBjb21wbGV0aW5nIG1ieCBjbWQgYXMgIgorCQkJCQkgICJhZGFwdGVyIHJlbW92YWwgZGV0ZWN0ZWRcbiIsCisJCQkJCSAgaGEtPmhvc3Rfbm8sIF9fZnVuY19fKSk7CisJCQlyZXR1cm4gc3RhdHVzOworCQl9CisJfQorCiAJaWYgKGlzX3FsYTgwMjIoaGEpKSB7CiAJCWlmICh0ZXN0X2JpdChBRl9GV19SRUNPVkVSWSwgJmhhLT5mbGFncykpIHsKIAkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsICJzY3NpJWxkOiAlczogIgpAQCAtNDEzLDYgKzQyMyw3IEBACiAJbWVtY3B5KGhhLT5uYW1lX3N0cmluZywgaW5pdF9md19jYi0+aXNjc2lfbmFtZSwKIAkJbWluKHNpemVvZihoYS0+bmFtZV9zdHJpbmcpLAogCQlzaXplb2YoaW5pdF9md19jYi0+aXNjc2lfbmFtZSkpKTsKKwloYS0+ZGVmX3RpbWVvdXQgPSBsZTE2X3RvX2NwdShpbml0X2Z3X2NiLT5kZWZfdGltZW91dCk7CiAJLyptZW1jcHkoaGEtPmFsaWFzLCBpbml0X2Z3X2NiLT5BbGlhcywKIAkgICAgICAgbWluKHNpemVvZihoYS0+YWxpYXMpLCBzaXplb2YoaW5pdF9md19jYi0+QWxpYXMpKSk7Ki8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X29zLmMgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYwppbmRleCAzMGYzMWIxLi40MTY5YzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYworKysgYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfb3MuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvaXNjc2lfYm9vdF9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KIAogI2luY2x1ZGUgPHNjc2kvc2NzaV90Y3EuaD4KICNpbmNsdWRlIDxzY3NpL3Njc2ljYW0uaD4KQEAgLTMxLDYgKzMyLDEzIEBACiAvKgogICogTW9kdWxlIHBhcmFtZXRlciBpbmZvcm1hdGlvbiBhbmQgdmFyaWFibGVzCiAgKi8KK2ludCBxbDR4ZGlzYWJsZXN5c2ZzYm9vdCA9IDE7Cittb2R1bGVfcGFyYW0ocWw0eGRpc2FibGVzeXNmc2Jvb3QsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworTU9EVUxFX1BBUk1fREVTQyhxbDR4ZGlzYWJsZXN5c2ZzYm9vdCwKKwkJIlNldCB0byBkaXNhYmxlIGV4cG9ydGluZyBib290IHRhcmdldHMgdG8gc3lzZnNcbiIKKwkJIiAwIC0gRXhwb3J0IGJvb3QgdGFyZ2V0c1xuIgorCQkiIDEgLSBEbyBub3QgZXhwb3J0IGJvb3QgdGFyZ2V0cyAoRGVmYXVsdCkiKTsKKwogaW50IHFsNHhkb250cmVzZXRoYmEgPSAwOwogbW9kdWxlX3BhcmFtKHFsNHhkb250cmVzZXRoYmEsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOwogTU9EVUxFX1BBUk1fREVTQyhxbDR4ZG9udHJlc2V0aGJhLApAQCAtNjMsNyArNzEsNyBAQAogbW9kdWxlX3BhcmFtKHFsNHhzZXNzX3JlY292ZXJ5X3RtbywgaW50LCBTX0lSVUdPKTsKIE1PRFVMRV9QQVJNX0RFU0MocWw0eHNlc3NfcmVjb3ZlcnlfdG1vLAogCQkiVGFyZ2V0IFNlc3Npb24gUmVjb3ZlcnkgVGltZW91dC5cbiIKLQkJIiBEZWZhdWx0OiAzMCBzZWMuIik7CisJCSIgRGVmYXVsdDogMTIwIHNlYy4iKTsKIAogc3RhdGljIGludCBxbGE0eHh4X3dhaXRfZm9yX2hiYV9vbmxpbmUoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhKTsKIC8qCkBAIC00MTUsNyArNDIzLDcgQEAKIAlxbGFfZXAgPSBlcC0+ZGRfZGF0YTsKIAloYSA9IHRvX3FsYV9ob3N0KHFsYV9lcC0+aG9zdCk7CiAKLQlpZiAoYWRhcHRlcl91cChoYSkpCisJaWYgKGFkYXB0ZXJfdXAoaGEpICYmICF0ZXN0X2JpdChBRl9CVUlMRF9EREJfTElTVCwgJmhhLT5mbGFncykpCiAJCXJldCA9IDE7CiAKIAlyZXR1cm4gcmV0OwpAQCAtOTc1LDYgKzk4MywxNTAgQEAKIAogfQogCitpbnQgcWxhNHh4eF9nZXRfZGRiX2luZGV4KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgdWludDE2X3QgKmRkYl9pbmRleCkKK3sKKwl1aW50MzJfdCBtYnhfc3RzID0gMDsKKwl1aW50MTZfdCB0bXBfZGRiX2luZGV4OworCWludCByZXQ7CisKK2dldF9kZGJfaW5kZXg6CisJdG1wX2RkYl9pbmRleCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaGEtPmRkYl9pZHhfbWFwLCBNQVhfRERCX0VOVFJJRVMpOworCisJaWYgKHRtcF9kZGJfaW5kZXggPj0gTUFYX0REQl9FTlRSSUVTKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAiRnJlZSBEREIgaW5kZXggbm90IGF2YWlsYWJsZVxuIikpOworCQlyZXQgPSBRTEFfRVJST1I7CisJCWdvdG8gZXhpdF9nZXRfZGRiX2luZGV4OworCX0KKworCWlmICh0ZXN0X2FuZF9zZXRfYml0KHRtcF9kZGJfaW5kZXgsIGhhLT5kZGJfaWR4X21hcCkpCisJCWdvdG8gZ2V0X2RkYl9pbmRleDsKKworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICJGb3VuZCBhIGZyZWUgRERCIGluZGV4IGF0ICVkXG4iLCB0bXBfZGRiX2luZGV4KSk7CisJcmV0ID0gcWxhNHh4eF9yZXFfZGRiX2VudHJ5KGhhLCB0bXBfZGRiX2luZGV4LCAmbWJ4X3N0cyk7CisJaWYgKHJldCA9PSBRTEFfRVJST1IpIHsKKwkJaWYgKG1ieF9zdHMgPT0gTUJPWF9TVFNfQ09NTUFORF9FUlJPUikgeworCQkJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgICJEREIgaW5kZXggPSAlZCBub3QgYXZhaWxhYmxlIHRyeWluZyBuZXh0XG4iLAorCQkJCSAgIHRtcF9kZGJfaW5kZXgpOworCQkJZ290byBnZXRfZGRiX2luZGV4OworCQl9CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAiRnJlZSBGVyBEREIgbm90IGF2YWlsYWJsZVxuIikpOworCX0KKworCSpkZGJfaW5kZXggPSB0bXBfZGRiX2luZGV4OworCitleGl0X2dldF9kZGJfaW5kZXg6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxbGE0eHh4X21hdGNoX2lwYWRkcmVzcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5LAorCQkJCSAgIGNoYXIgKmV4aXN0aW5nX2lwYWRkciwKKwkJCQkgICBjaGFyICp1c2VyX2lwYWRkcikKK3sKKwl1aW50OF90IGRzdF9pcGFkZHJbSVB2Nl9BRERSX0xFTl07CisJY2hhciBmb3JtYXR0ZWRfaXBhZGRyW0REQl9JUEFERFJfTEVOXTsKKwlpbnQgc3RhdHVzID0gUUxBX1NVQ0NFU1MsIHJldCA9IDA7CisKKwlpZiAoZGRiX2VudHJ5LT5md19kZGJfZW50cnkub3B0aW9ucyAmIEREQl9PUFRfSVBWNl9ERVZJQ0UpIHsKKwkJcmV0ID0gaW42X3B0b24odXNlcl9pcGFkZHIsIHN0cmxlbih1c2VyX2lwYWRkciksIGRzdF9pcGFkZHIsCisJCQkgICAgICAgJ1wwJywgTlVMTCk7CisJCWlmIChyZXQgPT0gMCkgeworCQkJc3RhdHVzID0gUUxBX0VSUk9SOworCQkJZ290byBvdXRfbWF0Y2g7CisJCX0KKwkJcmV0ID0gc3ByaW50Zihmb3JtYXR0ZWRfaXBhZGRyLCAiJXBJNiIsIGRzdF9pcGFkZHIpOworCX0gZWxzZSB7CisJCXJldCA9IGluNF9wdG9uKHVzZXJfaXBhZGRyLCBzdHJsZW4odXNlcl9pcGFkZHIpLCBkc3RfaXBhZGRyLAorCQkJICAgICAgICdcMCcsIE5VTEwpOworCQlpZiAocmV0ID09IDApIHsKKwkJCXN0YXR1cyA9IFFMQV9FUlJPUjsKKwkJCWdvdG8gb3V0X21hdGNoOworCQl9CisJCXJldCA9IHNwcmludGYoZm9ybWF0dGVkX2lwYWRkciwgIiVwSTQiLCBkc3RfaXBhZGRyKTsKKwl9CisKKwlpZiAoc3RyY21wKGV4aXN0aW5nX2lwYWRkciwgZm9ybWF0dGVkX2lwYWRkcikpCisJCXN0YXR1cyA9IFFMQV9FUlJPUjsKKworb3V0X21hdGNoOgorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgcWxhNHh4eF9tYXRjaF9md2RiX3Nlc3Npb24oc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJCSAgICAgIHN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm4pCit7CisJaW50IGlkeCA9IDAsIG1heF9kZGJzLCBydmFsOworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3MgPSBpc2NzaV9jb25uX3RvX3Nlc3Npb24oY2xzX2Nvbm4pOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzLCAqZXhpc3Rpbmdfc2VzczsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubiwgKmV4aXN0aW5nX2Nvbm47CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCisJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOworCWNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKKworCWlmIChzZXNzLT50YXJnZXRuYW1lID09IE5VTEwgfHwKKwkgICAgY29ubi0+cGVyc2lzdGVudF9hZGRyZXNzID09IE5VTEwgfHwKKwkgICAgY29ubi0+cGVyc2lzdGVudF9wb3J0ID09IDApCisJCXJldHVybiBRTEFfRVJST1I7CisKKwltYXhfZGRicyA9ICBpc19xbGE0MFhYKGhhKSA/IE1BWF9ERVZfREJfRU5UUklFU180MFhYIDoKKwkJCQkgICAgIE1BWF9ERVZfREJfRU5UUklFUzsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgbWF4X2RkYnM7IGlkeCsrKSB7CisJCWRkYl9lbnRyeSA9IHFsYTR4eHhfbG9va3VwX2RkYl9ieV9md19pbmRleChoYSwgaWR4KTsKKwkJaWYgKGRkYl9lbnRyeSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaWYgKGRkYl9lbnRyeS0+ZGRiX3R5cGUgIT0gRkxBU0hfRERCKQorCQkJY29udGludWU7CisKKwkJZXhpc3Rpbmdfc2VzcyA9IGRkYl9lbnRyeS0+c2Vzcy0+ZGRfZGF0YTsKKwkJZXhpc3RpbmdfY29ubiA9IGRkYl9lbnRyeS0+Y29ubi0+ZGRfZGF0YTsKKworCQlpZiAoZXhpc3Rpbmdfc2Vzcy0+dGFyZ2V0bmFtZSA9PSBOVUxMIHx8CisJCSAgICBleGlzdGluZ19jb25uLT5wZXJzaXN0ZW50X2FkZHJlc3MgPT0gTlVMTCB8fAorCQkgICAgZXhpc3RpbmdfY29ubi0+cGVyc2lzdGVudF9wb3J0ID09IDApCisJCQljb250aW51ZTsKKworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgIklRTiA9ICVzIFVzZXIgSVFOID0gJXNcbiIsCisJCQkJICBleGlzdGluZ19zZXNzLT50YXJnZXRuYW1lLAorCQkJCSAgc2Vzcy0+dGFyZ2V0bmFtZSkpOworCisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAiSVAgPSAlcyBVc2VyIElQID0gJXNcbiIsCisJCQkJICBleGlzdGluZ19jb25uLT5wZXJzaXN0ZW50X2FkZHJlc3MsCisJCQkJICBjb25uLT5wZXJzaXN0ZW50X2FkZHJlc3MpKTsKKworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCSAgIlBvcnQgPSAlZCBVc2VyIFBvcnQgPSAlZFxuIiwKKwkJCQkgIGV4aXN0aW5nX2Nvbm4tPnBlcnNpc3RlbnRfcG9ydCwKKwkJCQkgIGNvbm4tPnBlcnNpc3RlbnRfcG9ydCkpOworCisJCWlmIChzdHJjbXAoZXhpc3Rpbmdfc2Vzcy0+dGFyZ2V0bmFtZSwgc2Vzcy0+dGFyZ2V0bmFtZSkpCisJCQljb250aW51ZTsKKwkJcnZhbCA9IHFsYTR4eHhfbWF0Y2hfaXBhZGRyZXNzKGhhLCBkZGJfZW50cnksCisJCQkJCWV4aXN0aW5nX2Nvbm4tPnBlcnNpc3RlbnRfYWRkcmVzcywKKwkJCQkJY29ubi0+cGVyc2lzdGVudF9hZGRyZXNzKTsKKwkJaWYgKHJ2YWwgPT0gUUxBX0VSUk9SKQorCQkJY29udGludWU7CisJCWlmIChleGlzdGluZ19jb25uLT5wZXJzaXN0ZW50X3BvcnQgIT0gY29ubi0+cGVyc2lzdGVudF9wb3J0KQorCQkJY29udGludWU7CisJCWJyZWFrOworCX0KKworCWlmIChpZHggPT0gbWF4X2RkYnMpCisJCXJldHVybiBRTEFfRVJST1I7CisKKwlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJICAiTWF0Y2ggZm91bmQgaW4gZndkYiBzZXNzaW9uc1xuIikpOworCXJldHVybiBRTEFfU1VDQ0VTUzsKK30KKwogc3RhdGljIHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqCiBxbGE0eHh4X3Nlc3Npb25fY3JlYXRlKHN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXAsCiAJCQl1aW50MTZfdCBjbWRzX21heCwgdWludDE2X3QgcWRlcHRoLApAQCAtOTg0LDggKzExMzYsNyBAQAogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKIAlzdHJ1Y3QgcWxhX2VuZHBvaW50ICpxbGFfZXA7CiAJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OwotCXVpbnQzMl90IGRkYl9pbmRleDsKLQl1aW50MzJfdCBtYnhfc3RzID0gMDsKKwl1aW50MTZfdCBkZGJfaW5kZXg7CiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CiAJc3RydWN0IHNvY2thZGRyICpkc3RfYWRkcjsKIAlpbnQgcmV0OwpAQCAtMTAwMCwzMiArMTE1MSw5IEBACiAJZHN0X2FkZHIgPSAoc3RydWN0IHNvY2thZGRyICopJnFsYV9lcC0+ZHN0X2FkZHI7CiAJaGEgPSB0b19xbGFfaG9zdChxbGFfZXAtPmhvc3QpOwogCi1nZXRfZGRiX2luZGV4OgotCWRkYl9pbmRleCA9IGZpbmRfZmlyc3RfemVyb19iaXQoaGEtPmRkYl9pZHhfbWFwLCBNQVhfRERCX0VOVFJJRVMpOwotCi0JaWYgKGRkYl9pbmRleCA+PSBNQVhfRERCX0VOVFJJRVMpIHsKLQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKLQkJCQkgICJGcmVlIEREQiBpbmRleCBub3QgYXZhaWxhYmxlXG4iKSk7CisJcmV0ID0gcWxhNHh4eF9nZXRfZGRiX2luZGV4KGhhLCAmZGRiX2luZGV4KTsKKwlpZiAocmV0ID09IFFMQV9FUlJPUikKIAkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKHRlc3RfYW5kX3NldF9iaXQoZGRiX2luZGV4LCBoYS0+ZGRiX2lkeF9tYXApKQotCQlnb3RvIGdldF9kZGJfaW5kZXg7Ci0KLQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJICAiRm91bmQgYSBmcmVlIEREQiBpbmRleCBhdCAlZFxuIiwgZGRiX2luZGV4KSk7Ci0JcmV0ID0gcWxhNHh4eF9yZXFfZGRiX2VudHJ5KGhhLCBkZGJfaW5kZXgsICZtYnhfc3RzKTsKLQlpZiAocmV0ID09IFFMQV9FUlJPUikgewotCQlpZiAobWJ4X3N0cyA9PSBNQk9YX1NUU19DT01NQU5EX0VSUk9SKSB7Ci0JCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCi0JCQkJICAgIkREQiBpbmRleCA9ICVkIG5vdCBhdmFpbGFibGUgdHJ5aW5nIG5leHRcbiIsCi0JCQkJICAgZGRiX2luZGV4KTsKLQkJCWdvdG8gZ2V0X2RkYl9pbmRleDsKLQkJfQotCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAotCQkJCSAgIkZyZWUgRlcgRERCIG5vdCBhdmFpbGFibGVcbiIpKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQogCiAJY2xzX3Nlc3MgPSBpc2NzaV9zZXNzaW9uX3NldHVwKCZxbGE0eHh4X2lzY3NpX3RyYW5zcG9ydCwgcWxhX2VwLT5ob3N0LAogCQkJCSAgICAgICBjbWRzX21heCwgc2l6ZW9mKHN0cnVjdCBkZGJfZW50cnkpLApAQCAtMTA0MCw2ICsxMTY4LDggQEAKIAlkZGJfZW50cnktPmZ3X2RkYl9kZXZpY2Vfc3RhdGUgPSBEREJfRFNfTk9fQ09OTkVDVElPTl9BQ1RJVkU7CiAJZGRiX2VudHJ5LT5oYSA9IGhhOwogCWRkYl9lbnRyeS0+c2VzcyA9IGNsc19zZXNzOworCWRkYl9lbnRyeS0+dW5ibG9ja19zZXNzID0gcWxhNHh4eF91bmJsb2NrX2RkYjsKKwlkZGJfZW50cnktPmRkYl9jaGFuZ2UgPSBxbGE0eHh4X2RkYl9jaGFuZ2U7CiAJY2xzX3Nlc3MtPnJlY292ZXJ5X3RtbyA9IHFsNHhzZXNzX3JlY292ZXJ5X3RtbzsKIAloYS0+ZndfZGRiX2luZGV4X21hcFtkZGJfZW50cnktPmZ3X2RkYl9pbmRleF0gPSBkZGJfZW50cnk7CiAJaGEtPnRvdF9kZGJzKys7CkBAIC0xMDc3LDYgKzEyMDcsOSBAQAogCURFQlVHMihwcmludGsoS0VSTl9JTkZPICJGdW5jOiAlc1xuIiwgX19mdW5jX18pKTsKIAljbHNfY29ubiA9IGlzY3NpX2Nvbm5fc2V0dXAoY2xzX3Nlc3MsIHNpemVvZihzdHJ1Y3QgcWxhX2Nvbm4pLAogCQkJCSAgICBjb25uX2lkeCk7CisJaWYgKCFjbHNfY29ubikKKwkJcmV0dXJuIE5VTEw7CisKIAlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CiAJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKIAlkZGJfZW50cnktPmNvbm4gPSBjbHNfY29ubjsKQEAgLTExMDksNyArMTI0Miw3IEBACiAJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CiAJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OwogCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKLQlzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnk7CisJc3RydWN0IGRldl9kYl9lbnRyeSAqZndfZGRiX2VudHJ5ID0gTlVMTDsKIAlkbWFfYWRkcl90IGZ3X2RkYl9lbnRyeV9kbWE7CiAJdWludDMyX3QgbWJ4X3N0cyA9IDA7CiAJaW50IHJldCA9IDA7CkBAIC0xMTIwLDEyICsxMjUzLDI1IEBACiAJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKIAloYSA9IGRkYl9lbnRyeS0+aGE7CiAKKwkvKiBDaGVjayBpZiB3ZSBoYXZlICBtYXRjaGluZyBGVyBEREIsIGlmIHllcyB0aGVuIGRvIG5vdAorCSAqIGxvZ2luIHRvIHRoaXMgdGFyZ2V0LiBUaGlzIGNvdWxkIGNhdXNlIHRhcmdldCB0byBsb2dvdXQgcHJldmlvdXMKKwkgKiBjb25uZWN0aW9uCisJICovCisJcmV0ID0gcWxhNHh4eF9tYXRjaF9md2RiX3Nlc3Npb24oaGEsIGNsc19jb25uKTsKKwlpZiAocmV0ID09IFFMQV9TVUNDRVNTKSB7CisJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgICJTZXNzaW9uIGFscmVhZHkgZXhpc3QgaW4gRlcuXG4iKTsKKwkJcmV0ID0gLUVFWElTVDsKKwkJZ290byBleGl0X2Nvbm5fc3RhcnQ7CisJfQorCiAJZndfZGRiX2VudHJ5ID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCiAJCQkJCSAgJmZ3X2RkYl9lbnRyeV9kbWEsIEdGUF9LRVJORUwpOwogCWlmICghZndfZGRiX2VudHJ5KSB7CiAJCXFsNF9wcmludGsoS0VSTl9FUlIsIGhhLAogCQkJICAgIiVzOiBVbmFibGUgdG8gYWxsb2NhdGUgZG1hIGJ1ZmZlclxuIiwgX19mdW5jX18pOwotCQlyZXR1cm4gLUVOT01FTTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBleGl0X2Nvbm5fc3RhcnQ7CiAJfQogCiAJcmV0ID0gcWxhNHh4eF9zZXRfcGFyYW1fZGRiZW50cnkoaGEsIGRkYl9lbnRyeSwgY2xzX2Nvbm4sICZtYnhfc3RzKTsKQEAgLTExMzgsOSArMTI4NCw3IEBACiAJCWlmIChtYnhfc3RzKQogCQkJaWYgKGRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9PQogCQkJCQkJRERCX0RTX1NFU1NJT05fQUNUSVZFKSB7Ci0JCQkJaXNjc2lfY29ubl9zdGFydChkZGJfZW50cnktPmNvbm4pOwotCQkJCWlzY3NpX2Nvbm5fbG9naW5fZXZlbnQoZGRiX2VudHJ5LT5jb25uLAotCQkJCQkJSVNDU0lfQ09OTl9TVEFURV9MT0dHRURfSU4pOworCQkJCWRkYl9lbnRyeS0+dW5ibG9ja19zZXNzKGRkYl9lbnRyeS0+c2Vzcyk7CiAJCQkJZ290byBleGl0X3NldF9wYXJhbTsKIAkJCX0KIApAQCAtMTE2Nyw4ICsxMzExLDkgQEAKIAlyZXQgPSAwOwogCiBleGl0X2Nvbm5fc3RhcnQ6Ci0JZG1hX2ZyZWVfY29oZXJlbnQoJmhhLT5wZGV2LT5kZXYsIHNpemVvZigqZndfZGRiX2VudHJ5KSwKLQkJCSAgZndfZGRiX2VudHJ5LCBmd19kZGJfZW50cnlfZG1hKTsKKwlpZiAoZndfZGRiX2VudHJ5KQorCQlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLAorCQkJCSAgZndfZGRiX2VudHJ5LCBmd19kZGJfZW50cnlfZG1hKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzQ0LDYgKzE0ODksMTAxIEBACiAJcmV0dXJuIC1FTk9TWVM7CiB9CiAKK3N0YXRpYyB2b2lkIHFsYTR4eHhfY29weV9md2RkYl9wYXJhbShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICAgICBzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnksCisJCQkJICAgICBzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzLAorCQkJCSAgICAgc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubikKK3sKKwlpbnQgYnVmbGVuID0gMDsKKwlzdHJ1Y3QgaXNjc2lfc2Vzc2lvbiAqc2VzczsKKwlzdHJ1Y3QgaXNjc2lfY29ubiAqY29ubjsKKwljaGFyIGlwX2FkZHJbRERCX0lQQUREUl9MRU5dOworCXVpbnQxNl90IG9wdGlvbnMgPSAwOworCisJc2VzcyA9IGNsc19zZXNzLT5kZF9kYXRhOworCWNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKKworCWNvbm4tPm1heF9yZWN2X2RsZW5ndGggPSBCWVRFX1VOSVRTICoKKwkJCSAgbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9tYXhfcmN2X2RhdGFfc2VnX2xlbik7CisKKwljb25uLT5tYXhfeG1pdF9kbGVuZ3RoID0gQllURV9VTklUUyAqCisJCQkgIGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfbWF4X3NuZF9kYXRhX3NlZ19sZW4pOworCisJc2Vzcy0+aW5pdGlhbF9yMnRfZW4gPQorCQkJICAgIChCSVRfMTAgJiBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmlzY3NpX29wdGlvbnMpKTsKKworCXNlc3MtPm1heF9yMnQgPSBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmlzY3NpX21heF9vdXRzbmRfcjJ0KTsKKworCXNlc3MtPmltbV9kYXRhX2VuID0gKEJJVF8xMSAmIGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfb3B0aW9ucykpOworCisJc2Vzcy0+Zmlyc3RfYnVyc3QgPSBCWVRFX1VOSVRTICoKKwkJCSAgICAgICBsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmlzY3NpX2ZpcnN0X2J1cnN0X2xlbik7CisKKwlzZXNzLT5tYXhfYnVyc3QgPSBCWVRFX1VOSVRTICoKKwkJCQkgbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9tYXhfYnVyc3RfbGVuKTsKKworCXNlc3MtPnRpbWUyd2FpdCA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfZGVmX3RpbWUyd2FpdCk7CisKKwlzZXNzLT50aW1lMnJldGFpbiA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+aXNjc2lfZGVmX3RpbWUycmV0YWluKTsKKworCWNvbm4tPnBlcnNpc3RlbnRfcG9ydCA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+cG9ydCk7CisKKwlzZXNzLT50cGd0ID0gbGUzMl90b19jcHUoZndfZGRiX2VudHJ5LT50Z3RfcG9ydGFsX2dycCk7CisKKwlvcHRpb25zID0gbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5vcHRpb25zKTsKKwlpZiAob3B0aW9ucyAmIEREQl9PUFRfSVBWNl9ERVZJQ0UpCisJCXNwcmludGYoaXBfYWRkciwgIiVwSTYiLCBmd19kZGJfZW50cnktPmlwX2FkZHIpOworCWVsc2UKKwkJc3ByaW50ZihpcF9hZGRyLCAiJXBJNCIsIGZ3X2RkYl9lbnRyeS0+aXBfYWRkcik7CisKKwlpc2NzaV9zZXRfcGFyYW0oY2xzX2Nvbm4sIElTQ1NJX1BBUkFNX1RBUkdFVF9OQU1FLAorCQkJKGNoYXIgKilmd19kZGJfZW50cnktPmlzY3NpX25hbWUsIGJ1Zmxlbik7CisJaXNjc2lfc2V0X3BhcmFtKGNsc19jb25uLCBJU0NTSV9QQVJBTV9JTklUSUFUT1JfTkFNRSwKKwkJCShjaGFyICopaGEtPm5hbWVfc3RyaW5nLCBidWZsZW4pOworCWlzY3NpX3NldF9wYXJhbShjbHNfY29ubiwgSVNDU0lfUEFSQU1fUEVSU0lTVEVOVF9BRERSRVNTLAorCQkJKGNoYXIgKilpcF9hZGRyLCBidWZsZW4pOworfQorCit2b2lkIHFsYTR4eHhfdXBkYXRlX3Nlc3Npb25fY29ubl9md2RkYl9wYXJhbShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJCSAgICAgc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5KQoreworCXN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3M7CisJc3RydWN0IGlzY3NpX2Nsc19jb25uICpjbHNfY29ubjsKKwl1aW50MzJfdCBkZGJfc3RhdGU7CisJZG1hX2FkZHJfdCBmd19kZGJfZW50cnlfZG1hOworCXN0cnVjdCBkZXZfZGJfZW50cnkgKmZ3X2RkYl9lbnRyeTsKKworCWZ3X2RkYl9lbnRyeSA9IGRtYV9hbGxvY19jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZW9mKCpmd19kZGJfZW50cnkpLAorCQkJCQkgICZmd19kZGJfZW50cnlfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZ3X2RkYl9lbnRyeSkgeworCQlxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCSAgICIlczogVW5hYmxlIHRvIGFsbG9jYXRlIGRtYSBidWZmZXJcbiIsIF9fZnVuY19fKTsKKwkJZ290byBleGl0X3Nlc3Npb25fY29ubl9md2RkYl9wYXJhbTsKKwl9CisKKwlpZiAocWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LCBmd19kZGJfZW50cnksCisJCQkJICAgIGZ3X2RkYl9lbnRyeV9kbWEsIE5VTEwsIE5VTEwsICZkZGJfc3RhdGUsCisJCQkJICAgIE5VTEwsIE5VTEwsIE5VTEwpID09IFFMQV9FUlJPUikgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICJzY3NpJWxkOiAlczogZmFpbGVkICIKKwkJCQkgICJnZXRfZGRiX2VudHJ5IGZvciBmd19kZGJfaW5kZXggJWRcbiIsCisJCQkJICBoYS0+aG9zdF9ubywgX19mdW5jX18sCisJCQkJICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCkpOworCQlnb3RvIGV4aXRfc2Vzc2lvbl9jb25uX2Z3ZGRiX3BhcmFtOworCX0KKworCWNsc19zZXNzID0gZGRiX2VudHJ5LT5zZXNzOworCisJY2xzX2Nvbm4gPSBkZGJfZW50cnktPmNvbm47CisKKwkvKiBVcGRhdGUgcGFyYW1zICovCisJcWxhNHh4eF9jb3B5X2Z3ZGRiX3BhcmFtKGhhLCBmd19kZGJfZW50cnksIGNsc19zZXNzLCBjbHNfY29ubik7CisKK2V4aXRfc2Vzc2lvbl9jb25uX2Z3ZGRiX3BhcmFtOgorCWlmIChmd19kZGJfZW50cnkpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCisJCQkJICBmd19kZGJfZW50cnksIGZ3X2RkYl9lbnRyeV9kbWEpOworfQorCiB2b2lkIHFsYTR4eHhfdXBkYXRlX3Nlc3Npb25fY29ubl9wYXJhbShzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCiAJCQkJICAgICAgIHN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeSkKIHsKQEAgLTEzNjAsNyArMTYwMCw3IEBACiAJaWYgKCFmd19kZGJfZW50cnkpIHsKIAkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsCiAJCQkgICAiJXM6IFVuYWJsZSB0byBhbGxvY2F0ZSBkbWEgYnVmZmVyXG4iLCBfX2Z1bmNfXyk7Ci0JCXJldHVybjsKKwkJZ290byBleGl0X3Nlc3Npb25fY29ubl9wYXJhbTsKIAl9CiAKIAlpZiAocWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4LCBmd19kZGJfZW50cnksCkBAIC0xMzcwLDcgKzE2MTAsNyBAQAogCQkJCSAgImdldF9kZGJfZW50cnkgZm9yIGZ3X2RkYl9pbmRleCAlZFxuIiwKIAkJCQkgIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKIAkJCQkgIGRkYl9lbnRyeS0+ZndfZGRiX2luZGV4KSk7Ci0JCXJldHVybjsKKwkJZ290byBleGl0X3Nlc3Npb25fY29ubl9wYXJhbTsKIAl9CiAKIAljbHNfc2VzcyA9IGRkYl9lbnRyeS0+c2VzczsKQEAgLTEzNzksNiArMTYxOSwxMiBAQAogCWNsc19jb25uID0gZGRiX2VudHJ5LT5jb25uOwogCWNvbm4gPSBjbHNfY29ubi0+ZGRfZGF0YTsKIAorCS8qIFVwZGF0ZSB0aW1lcnMgYWZ0ZXIgbG9naW4gKi8KKwlkZGJfZW50cnktPmRlZmF1bHRfcmVsb2dpbl90aW1lb3V0ID0KKwkJCQlsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmRlZl90aW1lb3V0KTsKKwlkZGJfZW50cnktPmRlZmF1bHRfdGltZTJ3YWl0ID0KKwkJCQlsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPmlzY3NpX2RlZl90aW1lMndhaXQpOworCiAJLyogVXBkYXRlIHBhcmFtcyAqLwogCWNvbm4tPm1heF9yZWN2X2RsZW5ndGggPSBCWVRFX1VOSVRTICoKIAkJCSAgbGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5pc2NzaV9tYXhfcmN2X2RhdGFfc2VnX2xlbik7CkBAIC0xNDA3LDYgKzE2NTMsMTEgQEAKIAogCW1lbWNweShzZXNzLT5pbml0aWF0b3JuYW1lLCBoYS0+bmFtZV9zdHJpbmcsCiAJICAgICAgIG1pbihzaXplb2YoaGEtPm5hbWVfc3RyaW5nKSwgc2l6ZW9mKHNlc3MtPmluaXRpYXRvcm5hbWUpKSk7CisKK2V4aXRfc2Vzc2lvbl9jb25uX3BhcmFtOgorCWlmIChmd19kZGJfZW50cnkpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBzaXplb2YoKmZ3X2RkYl9lbnRyeSksCisJCQkJICBmd19kZGJfZW50cnksIGZ3X2RkYl9lbnRyeV9kbWEpOwogfQogCiAvKgpAQCAtMTYwNyw2ICsxODU4LDkgQEAKIAkJdmZyZWUoaGEtPmNoYXBfbGlzdCk7CiAJaGEtPmNoYXBfbGlzdCA9IE5VTEw7CiAKKwlpZiAoaGEtPmZ3X2RkYl9kbWFfcG9vbCkKKwkJZG1hX3Bvb2xfZGVzdHJveShoYS0+ZndfZGRiX2RtYV9wb29sKTsKKwogCS8qIHJlbGVhc2UgaW8gc3BhY2UgcmVnaXN0ZXJzICAqLwogCWlmIChpc19xbGE4MDIyKGhhKSkgewogCQlpZiAoaGEtPm54X3BjaWJhc2UpCkBAIC0xNjg5LDYgKzE5NDMsMTYgQEAKIAkJZ290byBtZW1fYWxsb2NfZXJyb3JfZXhpdDsKIAl9CiAKKwloYS0+ZndfZGRiX2RtYV9wb29sID0gZG1hX3Bvb2xfY3JlYXRlKCJxbDRfZndfZGRiIiwgJmhhLT5wZGV2LT5kZXYsCisJCQkJCSAgICAgIEREQl9ETUFfQkxPQ0tfU0laRSwgOCwgMCk7CisKKwlpZiAoaGEtPmZ3X2RkYl9kbWFfcG9vbCA9PSBOVUxMKSB7CisJCXFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCSAgICIlczogZndfZGRiX2RtYV9wb29sIGFsbG9jYXRpb24gZmFpbGVkLi5cbiIsCisJCQkgICBfX2Z1bmNfXyk7CisJCWdvdG8gbWVtX2FsbG9jX2Vycm9yX2V4aXQ7CisJfQorCiAJcmV0dXJuIFFMQV9TVUNDRVNTOwogCiBtZW1fYWxsb2NfZXJyb3JfZXhpdDoKQEAgLTE4MDAsNiArMjA2NCw2MCBAQAogCX0KIH0KIAordm9pZCBxbGE0eHh4X2NoZWNrX3JlbG9naW5fZmxhc2hfZGRiKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3MpCit7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKworCXNlc3MgPSBjbHNfc2Vzcy0+ZGRfZGF0YTsKKwlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCWhhID0gZGRiX2VudHJ5LT5oYTsKKworCWlmICghKGRkYl9lbnRyeS0+ZGRiX3R5cGUgPT0gRkxBU0hfRERCKSkKKwkJcmV0dXJuOworCisJaWYgKGFkYXB0ZXJfdXAoaGEpICYmICF0ZXN0X2JpdChERl9SRUxPR0lOLCAmZGRiX2VudHJ5LT5mbGFncykgJiYKKwkgICAgIWlzY3NpX2lzX3Nlc3Npb25fb25saW5lKGNsc19zZXNzKSkgeworCQlpZiAoYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+cmV0cnlfcmVsb2dpbl90aW1lcikgIT0KKwkJICAgIElOVkFMSURfRU5UUlkpIHsKKwkJCWlmIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5yZXRyeV9yZWxvZ2luX3RpbWVyKSA9PQorCQkJCQkwKSB7CisJCQkJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5yZXRyeV9yZWxvZ2luX3RpbWVyLAorCQkJCQkgICBJTlZBTElEX0VOVFJZKTsKKwkJCQlzZXRfYml0KERQQ19SRUxPR0lOX0RFVklDRSwgJmhhLT5kcGNfZmxhZ3MpOworCQkJCXNldF9iaXQoREZfUkVMT0dJTiwgJmRkYl9lbnRyeS0+ZmxhZ3MpOworCQkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJICAgICAgICIlczogaW5kZXggWyVkXSBsb2dpbiBkZXZpY2VcbiIsCisJCQkJCV9fZnVuY19fLCBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCkpOworCQkJfSBlbHNlCisJCQkJYXRvbWljX2RlYygmZGRiX2VudHJ5LT5yZXRyeV9yZWxvZ2luX3RpbWVyKTsKKwkJfQorCX0KKworCS8qIFdhaXQgZm9yIHJlbG9naW4gdG8gdGltZW91dCAqLworCWlmIChhdG9taWNfcmVhZCgmZGRiX2VudHJ5LT5yZWxvZ2luX3RpbWVyKSAmJgorCSAgICAoYXRvbWljX2RlY19hbmRfdGVzdCgmZGRiX2VudHJ5LT5yZWxvZ2luX3RpbWVyKSAhPSAwKSkgeworCQkvKgorCQkgKiBJZiB0aGUgcmVsb2dpbiB0aW1lcyBvdXQgYW5kIHRoZSBkZXZpY2UgaXMKKwkJICogc3RpbGwgTk9UIE9OTElORSB0aGVuIHRyeSBhbmQgcmVsb2dpbiBhZ2Fpbi4KKwkJICovCisJCWlmICghaXNjc2lfaXNfc2Vzc2lvbl9vbmxpbmUoY2xzX3Nlc3MpKSB7CisJCQkvKiBSZXNldCByZXRyeSByZWxvZ2luIHRpbWVyICovCisJCQlhdG9taWNfaW5jKCZkZGJfZW50cnktPnJlbG9naW5fcmV0cnlfY291bnQpOworCQkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkiJXM6IGluZGV4WyVkXSByZWxvZ2luIHRpbWVkIG91dC1yZXRyeWluZyIKKwkJCQkiIHJlbG9naW4gKCVkKSwgcmV0cnkgKCVkKVxuIiwgX19mdW5jX18sCisJCQkJZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsCisJCQkJYXRvbWljX3JlYWQoJmRkYl9lbnRyeS0+cmVsb2dpbl9yZXRyeV9jb3VudCksCisJCQkJZGRiX2VudHJ5LT5kZWZhdWx0X3RpbWUyd2FpdCArIDQpKTsKKwkJCXNldF9iaXQoRFBDX1JFTE9HSU5fREVWSUNFLCAmaGEtPmRwY19mbGFncyk7CisJCQlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJldHJ5X3JlbG9naW5fdGltZXIsCisJCQkJICAgZGRiX2VudHJ5LT5kZWZhdWx0X3RpbWUyd2FpdCArIDQpOworCQl9CisJfQorfQorCiAvKioKICAqIHFsYTR4eHhfdGltZXIgLSBjaGVja3MgZXZlcnkgc2Vjb25kIGZvciB3b3JrIHRvIGRvLgogICogQGhhOiBQb2ludGVyIHRvIGhvc3QgYWRhcHRlciBzdHJ1Y3R1cmUuCkBAIC0xODA5LDYgKzIxMjcsOCBAQAogCWludCBzdGFydF9kcGMgPSAwOwogCXVpbnQxNl90IHc7CiAKKwlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24oaGEtPmhvc3QsIHFsYTR4eHhfY2hlY2tfcmVsb2dpbl9mbGFzaF9kZGIpOworCiAJLyogSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgQUVSL0VFSCBwcm9jZXNzaW5nCiAJICogc2tpcCBhbnkgcHJvY2Vzc2luZyBhbmQgcmVzY2hlZHVsZSB0aGUgdGltZXIKIAkgKi8KQEAgLTIwNzgsNyArMjM5OCwxMiBAQAogCXNlc3MgPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKIAlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOwogCWRkYl9lbnRyeS0+ZndfZGRiX2RldmljZV9zdGF0ZSA9IEREQl9EU19TRVNTSU9OX0ZBSUxFRDsKLQlpc2NzaV9zZXNzaW9uX2ZhaWx1cmUoY2xzX3Nlc3Npb24tPmRkX2RhdGEsIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CisKKwlpZiAoZGRiX2VudHJ5LT5kZGJfdHlwZSA9PSBGTEFTSF9EREIpCisJCWlzY3NpX2Jsb2NrX3Nlc3Npb24oZGRiX2VudHJ5LT5zZXNzKTsKKwllbHNlCisJCWlzY3NpX3Nlc3Npb25fZmFpbHVyZShjbHNfc2Vzc2lvbi0+ZGRfZGF0YSwKKwkJCQkgICAgICBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOwogfQogCiAvKioKQEAgLTIxNjMsNyArMjQ4OCw3IEBACiAKIAkJLyogTk9URTogQUZfT05MSU5FIGZsYWcgc2V0IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uIG9mCiAJCSAqICAgICAgIHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyICovCi0JCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhKTsKKwkJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEsIFJFU0VUX0FEQVBURVIpOwogCX0KIAogCS8qIFJldHJ5IGZhaWxlZCBhZGFwdGVyIGluaXRpYWxpemF0aW9uLCBpZiBuZWNlc3NhcnkKQEAgLTIyNDUsMTcgKzI1NzAsMTA4IEBACiAJCQlpc2NzaV91bmJsb2NrX3Nlc3Npb24oZGRiX2VudHJ5LT5zZXNzKTsKIAkJfSBlbHNlIHsKIAkJCS8qIFRyaWdnZXIgcmVsb2dpbiAqLwotCQkJaXNjc2lfc2Vzc2lvbl9mYWlsdXJlKGNsc19zZXNzaW9uLT5kZF9kYXRhLAotCQkJCQkgICAgICBJU0NTSV9FUlJfQ09OTl9GQUlMRUQpOworCQkJaWYgKGRkYl9lbnRyeS0+ZGRiX3R5cGUgPT0gRkxBU0hfRERCKSB7CisJCQkJaWYgKCF0ZXN0X2JpdChERl9SRUxPR0lOLCAmZGRiX2VudHJ5LT5mbGFncykpCisJCQkJCXFsYTR4eHhfYXJtX3JlbG9naW5fdGltZXIoZGRiX2VudHJ5KTsKKwkJCX0gZWxzZQorCQkJCWlzY3NpX3Nlc3Npb25fZmFpbHVyZShjbHNfc2Vzc2lvbi0+ZGRfZGF0YSwKKwkJCQkJCSAgICAgIElTQ1NJX0VSUl9DT05OX0ZBSUxFRCk7CiAJCX0KIAl9CiB9CiAKK2ludCBxbGE0eHh4X3VuYmxvY2tfZmxhc2hfZGRiKHN0cnVjdCBpc2NzaV9jbHNfc2Vzc2lvbiAqY2xzX3Nlc3Npb24pCit7CisJc3RydWN0IGlzY3NpX3Nlc3Npb24gKnNlc3M7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCXN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYTsKKworCXNlc3MgPSBjbHNfc2Vzc2lvbi0+ZGRfZGF0YTsKKwlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCWhhID0gZGRiX2VudHJ5LT5oYTsKKwlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsICJzY3NpJWxkOiAlczogZGRiWyVkXSIKKwkJICAgIiB1bmJsb2NrIHNlc3Npb25cbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKKwkJICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOworCisJaXNjc2lfdW5ibG9ja19zZXNzaW9uKGRkYl9lbnRyeS0+c2Vzcyk7CisKKwkvKiBTdGFydCBzY2FuIHRhcmdldCAqLworCWlmICh0ZXN0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpKSB7CisJCXFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwgInNjc2klbGQ6ICVzOiBkZGJbJWRdIgorCQkJICAgIiBzdGFydCBzY2FuXG4iLCBoYS0+aG9zdF9ubywgX19mdW5jX18sCisJCQkgICBkZGJfZW50cnktPmZ3X2RkYl9pbmRleCk7CisJCXNjc2lfcXVldWVfd29yayhoYS0+aG9zdCwgJmRkYl9lbnRyeS0+c2Vzcy0+c2Nhbl93b3JrKTsKKwl9CisJcmV0dXJuIFFMQV9TVUNDRVNTOworfQorCitpbnQgcWxhNHh4eF91bmJsb2NrX2RkYihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzaW9uKQoreworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisKKwlzZXNzID0gY2xzX3Nlc3Npb24tPmRkX2RhdGE7CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisJcWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLCAic2NzaSVsZDogJXM6IGRkYlslZF0iCisJCSAgICIgdW5ibG9jayB1c2VyIHNwYWNlIHNlc3Npb25cbiIsIGhhLT5ob3N0X25vLCBfX2Z1bmNfXywKKwkJICAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOworCWlzY3NpX2Nvbm5fc3RhcnQoZGRiX2VudHJ5LT5jb25uKTsKKwlpc2NzaV9jb25uX2xvZ2luX2V2ZW50KGRkYl9lbnRyeS0+Y29ubiwKKwkJCSAgICAgICBJU0NTSV9DT05OX1NUQVRFX0xPR0dFRF9JTik7CisKKwlyZXR1cm4gUUxBX1NVQ0NFU1M7Cit9CisKIHN0YXRpYyB2b2lkIHFsYTR4eHhfcmVsb2dpbl9hbGxfZGV2aWNlcyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJaXNjc2lfaG9zdF9mb3JfZWFjaF9zZXNzaW9uKGhhLT5ob3N0LCBxbGE0eHh4X3JlbG9naW5fZGV2aWNlcyk7CiB9CiAKK3N0YXRpYyB2b2lkIHFsYTR4eHhfcmVsb2dpbl9mbGFzaF9kZGIoc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2VzcykKK3sKKwl1aW50MTZfdCByZWxvZ2luX3RpbWVyOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisKKwlyZWxvZ2luX3RpbWVyID0gbWF4KGRkYl9lbnRyeS0+ZGVmYXVsdF9yZWxvZ2luX3RpbWVvdXQsCisJCQkgICAgKHVpbnQxNl90KVJFTE9HSU5fVE9WKTsKKwlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJlbG9naW5fdGltZXIsIHJlbG9naW5fdGltZXIpOworCisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgInNjc2klbGQ6IFJlbG9naW4gaW5kZXggWyVkXS4gVE9WPSVkXG4iLCBoYS0+aG9zdF9ubywKKwkJCSAgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgsIHJlbG9naW5fdGltZXIpKTsKKworCXFsYTR4eHhfbG9naW5fZmxhc2hfZGRiKGNsc19zZXNzKTsKK30KKworc3RhdGljIHZvaWQgcWxhNHh4eF9kcGNfcmVsb2dpbihzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzKQoreworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBkZGJfZW50cnkgKmRkYl9lbnRyeTsKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisJZGRiX2VudHJ5ID0gc2Vzcy0+ZGRfZGF0YTsKKwloYSA9IGRkYl9lbnRyeS0+aGE7CisKKwlpZiAoIShkZGJfZW50cnktPmRkYl90eXBlID09IEZMQVNIX0REQikpCisJCXJldHVybjsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoREZfUkVMT0dJTiwgJmRkYl9lbnRyeS0+ZmxhZ3MpICYmCisJICAgICFpc2NzaV9pc19zZXNzaW9uX29ubGluZShjbHNfc2VzcykpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCQkgICJyZWxvZ2luIGlzc3VlZFxuIikpOworCQlxbGE0eHh4X3JlbG9naW5fZmxhc2hfZGRiKGNsc19zZXNzKTsKKwl9Cit9CisKIHZvaWQgcWxhNHh4eF93YWtlX2RwYyhzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCiB7CiAJaWYgKGhhLT5kcGNfdGhyZWFkKQpAQCAtMjM1Niw2ICsyNzcyLDEyIEBACiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChEUENfR0VUX0RIQ1BfSVBfQUREUiwgJmhhLT5kcGNfZmxhZ3MpKQogCQlxbGE0eHh4X2dldF9kaGNwX2lwX2FkZHJlc3MoaGEpOwogCisJLyogLS0tLSByZWxvZ2luIGRldmljZT8gLS0tICovCisJaWYgKGFkYXB0ZXJfdXAoaGEpICYmCisJICAgIHRlc3RfYW5kX2NsZWFyX2JpdChEUENfUkVMT0dJTl9ERVZJQ0UsICZoYS0+ZHBjX2ZsYWdzKSkgeworCQlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24oaGEtPmhvc3QsIHFsYTR4eHhfZHBjX3JlbG9naW4pOworCX0KKwogCS8qIC0tLS0gbGluayBjaGFuZ2U/IC0tLSAqLwogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRFBDX0xJTktfQ0hBTkdFRCwgJmhhLT5kcGNfZmxhZ3MpKSB7CiAJCWlmICghdGVzdF9iaXQoQUZfTElOS19VUCwgJmhhLT5mbGFncykpIHsKQEAgLTIzNjgsOCArMjc5MCwxMiBAQAogCQkJICogZmF0YWwgZXJyb3IgcmVjb3ZlcnkuICBUaGVyZWZvcmUsIHRoZSBkcml2ZXIgbXVzdAogCQkJICogbWFudWFsbHkgcmVsb2dpbiB0byBkZXZpY2VzIHdoZW4gcmVjb3ZlcmluZyBmcm9tCiAJCQkgKiBjb25uZWN0aW9uIGZhaWx1cmVzLCBsb2dvdXRzLCBleHBpcmVkIEtBVE8sIGV0Yy4gKi8KLQotCQkJcWxhNHh4eF9yZWxvZ2luX2FsbF9kZXZpY2VzKGhhKTsKKwkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQUZfQlVJTERfRERCX0xJU1QsICZoYS0+ZmxhZ3MpKSB7CisJCQkJcWxhNHh4eF9idWlsZF9kZGJfbGlzdChoYSwgaGEtPmlzX3Jlc2V0KTsKKwkJCQlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24oaGEtPmhvc3QsCisJCQkJCQlxbGE0eHh4X2xvZ2luX2ZsYXNoX2RkYik7CisJCQl9IGVsc2UKKwkJCQlxbGE0eHh4X3JlbG9naW5fYWxsX2RldmljZXMoaGEpOwogCQl9CiAJfQogfQpAQCAtMjg2Nyw2ICszMjkzLDkgQEAKIAkJCSAgIiB0YXJnZXQgSUQgJWRcbiIsIF9fZnVuY19fLCBkZGJfaW5kZXhbMF0sCiAJCQkgIGRkYl9pbmRleFsxXSkpOwogCisJaGEtPnByaV9kZGJfaWR4ID0gZGRiX2luZGV4WzBdOworCWhhLT5zZWNfZGRiX2lkeCA9IGRkYl9pbmRleFsxXTsKKwogZXhpdF9ib290X2luZm9fZnJlZToKIAlkbWFfZnJlZV9jb2hlcmVudCgmaGEtPnBkZXYtPmRldiwgc2l6ZSwgYnVmLCBidWZfZG1hKTsKIGV4aXRfYm9vdF9pbmZvOgpAQCAtMzAzNCw2ICszNDYzLDkgQEAKIAkJcmV0dXJuIHJldDsKIAl9CiAKKwlpZiAocWw0eGRpc2FibGVzeXNmc2Jvb3QpCisJCXJldHVybiBRTEFfU1VDQ0VTUzsKKwogCWlmIChkZGJfaW5kZXhbMF0gPT0gMHhmZmZmKQogCQlnb3RvIHNlY190YXJnZXQ7CiAKQEAgLTMwNjYsNyArMzQ5OCwxNSBAQAogCXN0cnVjdCBpc2NzaV9ib290X2tvYmogKmJvb3Rfa29iajsKIAogCWlmIChxbGE0eHh4X2dldF9ib290X2luZm8oaGEpICE9IFFMQV9TVUNDRVNTKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIFFMQV9FUlJPUjsKKworCWlmIChxbDR4ZGlzYWJsZXN5c2ZzYm9vdCkgeworCQlxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICAiJXM6IHN5ZnNib290IGRpc2FibGVkIC0gZHJpdmVyIHdpbGwgdHJpZ2dlciBsb2dpbiIKKwkJCSAgICJhbmQgcHVibGlzaCBzZXNzaW9uIGZvciBkaXNjb3ZlcnkgLlxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CisJfQorCiAKIAloYS0+Ym9vdF9rc2V0ID0gaXNjc2lfYm9vdF9jcmVhdGVfaG9zdF9rc2V0KGhhLT5ob3N0LT5ob3N0X25vKTsKIAlpZiAoIWhhLT5ib290X2tzZXQpCkBAIC0zMTA4LDcgKzM1NDgsNyBAQAogCWlmICghYm9vdF9rb2JqKQogCQlnb3RvIHB1dF9ob3N0OwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIFFMQV9TVUNDRVNTOwogCiBwdXRfaG9zdDoKIAlzY3NpX2hvc3RfcHV0KGhhLT5ob3N0KTsKQEAgLTMxNzQsOSArMzYxNCw1MDcgQEAKIGV4aXRfY2hhcF9saXN0OgogCWRtYV9mcmVlX2NvaGVyZW50KCZoYS0+cGRldi0+ZGV2LCBjaGFwX3NpemUsCiAJCQljaGFwX2ZsYXNoX2RhdGEsIGNoYXBfZG1hKTsKLQlyZXR1cm47CiB9CiAKK3N0YXRpYyB2b2lkIHFsYTR4eHhfZ2V0X3BhcmFtX2RkYihzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnksCisJCQkJICBzdHJ1Y3QgcWw0X3R1cGxlX2RkYiAqdGRkYikKK3sKKwlzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGE7CisJc3RydWN0IGlzY3NpX2Nsc19zZXNzaW9uICpjbHNfc2VzczsKKwlzdHJ1Y3QgaXNjc2lfY2xzX2Nvbm4gKmNsc19jb25uOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBpc2NzaV9jb25uICpjb25uOworCisJREVCVUcyKHByaW50ayhLRVJOX0lORk8gIkZ1bmM6ICVzXG4iLCBfX2Z1bmNfXykpOworCWhhID0gZGRiX2VudHJ5LT5oYTsKKwljbHNfc2VzcyA9IGRkYl9lbnRyeS0+c2VzczsKKwlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisJY2xzX2Nvbm4gPSBkZGJfZW50cnktPmNvbm47CisJY29ubiA9IGNsc19jb25uLT5kZF9kYXRhOworCisJdGRkYi0+dHBndCA9IHNlc3MtPnRwZ3Q7CisJdGRkYi0+cG9ydCA9IGNvbm4tPnBlcnNpc3RlbnRfcG9ydDsKKwlzdHJuY3B5KHRkZGItPmlzY3NpX25hbWUsIHNlc3MtPnRhcmdldG5hbWUsIElTQ1NJX05BTUVfU0laRSk7CisJc3RybmNweSh0ZGRiLT5pcF9hZGRyLCBjb25uLT5wZXJzaXN0ZW50X2FkZHJlc3MsIEREQl9JUEFERFJfTEVOKTsKK30KKworc3RhdGljIHZvaWQgcWxhNHh4eF9jb252ZXJ0X3BhcmFtX2RkYihzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnksCisJCQkJICAgICAgc3RydWN0IHFsNF90dXBsZV9kZGIgKnRkZGIpCit7CisJdWludDE2X3Qgb3B0aW9ucyA9IDA7CisKKwl0ZGRiLT50cGd0ID0gbGUzMl90b19jcHUoZndfZGRiX2VudHJ5LT50Z3RfcG9ydGFsX2dycCk7CisJbWVtY3B5KCZ0ZGRiLT5pc2NzaV9uYW1lWzBdLCAmZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lWzBdLAorCSAgICAgICBtaW4oc2l6ZW9mKHRkZGItPmlzY3NpX25hbWUpLCBzaXplb2YoZndfZGRiX2VudHJ5LT5pc2NzaV9uYW1lKSkpOworCisJb3B0aW9ucyA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+b3B0aW9ucyk7CisJaWYgKG9wdGlvbnMgJiBEREJfT1BUX0lQVjZfREVWSUNFKQorCQlzcHJpbnRmKHRkZGItPmlwX2FkZHIsICIlcEk2IiwgZndfZGRiX2VudHJ5LT5pcF9hZGRyKTsKKwllbHNlCisJCXNwcmludGYodGRkYi0+aXBfYWRkciwgIiVwSTQiLCBmd19kZGJfZW50cnktPmlwX2FkZHIpOworCisJdGRkYi0+cG9ydCA9IGxlMTZfdG9fY3B1KGZ3X2RkYl9lbnRyeS0+cG9ydCk7Cit9CisKK3N0YXRpYyBpbnQgcWxhNHh4eF9jb21wYXJlX3R1cGxlX2RkYihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEsCisJCQkJICAgICBzdHJ1Y3QgcWw0X3R1cGxlX2RkYiAqb2xkX3RkZGIsCisJCQkJICAgICBzdHJ1Y3QgcWw0X3R1cGxlX2RkYiAqbmV3X3RkZGIpCit7CisJaWYgKHN0cmNtcChvbGRfdGRkYi0+aXNjc2lfbmFtZSwgbmV3X3RkZGItPmlzY3NpX25hbWUpKQorCQlyZXR1cm4gUUxBX0VSUk9SOworCisJaWYgKHN0cmNtcChvbGRfdGRkYi0+aXBfYWRkciwgbmV3X3RkZGItPmlwX2FkZHIpKQorCQlyZXR1cm4gUUxBX0VSUk9SOworCisJaWYgKG9sZF90ZGRiLT5wb3J0ICE9IG5ld190ZGRiLT5wb3J0KQorCQlyZXR1cm4gUUxBX0VSUk9SOworCisJREVCVUcyKHFsNF9wcmludGsoS0VSTl9JTkZPLCBoYSwKKwkJCSAgIk1hdGNoIEZvdW5kLCBmd1slZCwlZCwlcywlc10sIFslZCwlZCwlcywlc10iLAorCQkJICBvbGRfdGRkYi0+cG9ydCwgb2xkX3RkZGItPnRwZ3QsIG9sZF90ZGRiLT5pcF9hZGRyLAorCQkJICBvbGRfdGRkYi0+aXNjc2lfbmFtZSwgbmV3X3RkZGItPnBvcnQsIG5ld190ZGRiLT50cGd0LAorCQkJICBuZXdfdGRkYi0+aXBfYWRkciwgbmV3X3RkZGItPmlzY3NpX25hbWUpKTsKKworCXJldHVybiBRTEFfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBxbGE0eHh4X2lzX3Nlc3Npb25fZXhpc3RzKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCQkgICAgIHN0cnVjdCBkZXZfZGJfZW50cnkgKmZ3X2RkYl9lbnRyeSkKK3sKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnk7CisJc3RydWN0IHFsNF90dXBsZV9kZGIgKmZ3X3RkZGIgPSBOVUxMOworCXN0cnVjdCBxbDRfdHVwbGVfZGRiICp0bXBfdGRkYiA9IE5VTEw7CisJaW50IGlkeDsKKwlpbnQgcmV0ID0gUUxBX0VSUk9SOworCisJZndfdGRkYiA9IHZ6YWxsb2Moc2l6ZW9mKCpmd190ZGRiKSk7CisJaWYgKCFmd190ZGRiKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fV0FSTklORywgaGEsCisJCQkJICAiTWVtb3J5IEFsbG9jYXRpb24gZmFpbGVkLlxuIikpOworCQlyZXQgPSBRTEFfU1VDQ0VTUzsKKwkJZ290byBleGl0X2NoZWNrOworCX0KKworCXRtcF90ZGRiID0gdnphbGxvYyhzaXplb2YoKnRtcF90ZGRiKSk7CisJaWYgKCF0bXBfdGRkYikgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZC5cbiIpKTsKKwkJcmV0ID0gUUxBX1NVQ0NFU1M7CisJCWdvdG8gZXhpdF9jaGVjazsKKwl9CisKKwlxbGE0eHh4X2NvbnZlcnRfcGFyYW1fZGRiKGZ3X2RkYl9lbnRyeSwgZndfdGRkYik7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9EREJfRU5UUklFUzsgaWR4KyspIHsKKwkJZGRiX2VudHJ5ID0gcWxhNHh4eF9sb29rdXBfZGRiX2J5X2Z3X2luZGV4KGhhLCBpZHgpOworCQlpZiAoZGRiX2VudHJ5ID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQlxbGE0eHh4X2dldF9wYXJhbV9kZGIoZGRiX2VudHJ5LCB0bXBfdGRkYik7CisJCWlmICghcWxhNHh4eF9jb21wYXJlX3R1cGxlX2RkYihoYSwgZndfdGRkYiwgdG1wX3RkZGIpKSB7CisJCQlyZXQgPSBRTEFfU1VDQ0VTUzsgLyogZm91bmQgKi8KKwkJCWdvdG8gZXhpdF9jaGVjazsKKwkJfQorCX0KKworZXhpdF9jaGVjazoKKwlpZiAoZndfdGRkYikKKwkJdmZyZWUoZndfdGRkYik7CisJaWYgKHRtcF90ZGRiKQorCQl2ZnJlZSh0bXBfdGRkYik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBxbGE0eHh4X2lzX2ZsYXNoX2RkYl9leGlzdHMoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLAorCQkJCSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0X250LAorCQkJCSAgICAgICBzdHJ1Y3QgZGV2X2RiX2VudHJ5ICpmd19kZGJfZW50cnkpCit7CisJc3RydWN0IHFsYV9kZGJfaW5kZXggICpudF9kZGJfaWR4LCAqbnRfZGRiX2lkeF90bXA7CisJc3RydWN0IHFsNF90dXBsZV9kZGIgKmZ3X3RkZGIgPSBOVUxMOworCXN0cnVjdCBxbDRfdHVwbGVfZGRiICp0bXBfdGRkYiA9IE5VTEw7CisJaW50IHJldCA9IFFMQV9FUlJPUjsKKworCWZ3X3RkZGIgPSB2emFsbG9jKHNpemVvZigqZndfdGRkYikpOworCWlmICghZndfdGRkYikgeworCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX1dBUk5JTkcsIGhhLAorCQkJCSAgIk1lbW9yeSBBbGxvY2F0aW9uIGZhaWxlZC5cbiIpKTsKKwkJcmV0ID0gUUxBX1NVQ0NFU1M7CisJCWdvdG8gZXhpdF9jaGVjazsKKwl9CisKKwl0bXBfdGRkYiA9IHZ6YWxsb2Moc2l6ZW9mKCp0bXBfdGRkYikpOworCWlmICghdG1wX3RkZGIpIHsKKwkJREVCVUcyKHFsNF9wcmludGsoS0VSTl9XQVJOSU5HLCBoYSwKKwkJCQkgICJNZW1vcnkgQWxsb2NhdGlvbiBmYWlsZWQuXG4iKSk7CisJCXJldCA9IFFMQV9TVUNDRVNTOworCQlnb3RvIGV4aXRfY2hlY2s7CisJfQorCisJcWxhNHh4eF9jb252ZXJ0X3BhcmFtX2RkYihmd19kZGJfZW50cnksIGZ3X3RkZGIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG50X2RkYl9pZHgsIG50X2RkYl9pZHhfdG1wLCBsaXN0X250LCBsaXN0KSB7CisJCXFsYTR4eHhfY29udmVydF9wYXJhbV9kZGIoJm50X2RkYl9pZHgtPmZ3X2RkYiwgdG1wX3RkZGIpOworCQlpZiAoIXFsYTR4eHhfY29tcGFyZV90dXBsZV9kZGIoaGEsIGZ3X3RkZGIsIHRtcF90ZGRiKSkgeworCQkJcmV0ID0gUUxBX1NVQ0NFU1M7IC8qIGZvdW5kICovCisJCQlnb3RvIGV4aXRfY2hlY2s7CisJCX0KKwl9CisKK2V4aXRfY2hlY2s6CisJaWYgKGZ3X3RkZGIpCisJCXZmcmVlKGZ3X3RkZGIpOworCWlmICh0bXBfdGRkYikKKwkJdmZyZWUodG1wX3RkZGIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHFsYTR4eHhfZnJlZV9udF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKmxpc3RfbnQpCit7CisJc3RydWN0IHFsYV9kZGJfaW5kZXggICpudF9kZGJfaWR4LCAqbnRfZGRiX2lkeF90bXA7CisKKwkvKiBGcmVlIHVwIHRoZSBub3JtYWx0YXJnZXRzIGxpc3QgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobnRfZGRiX2lkeCwgbnRfZGRiX2lkeF90bXAsIGxpc3RfbnQsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmbnRfZGRiX2lkeC0+bGlzdCk7CisJCXZmcmVlKG50X2RkYl9pZHgpOworCX0KKworfQorCitzdGF0aWMgc3RydWN0IGlzY3NpX2VuZHBvaW50ICpxbGE0eHh4X2dldF9lcF9md2RiKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCQkJc3RydWN0IGRldl9kYl9lbnRyeSAqZndfZGRiX2VudHJ5KQoreworCXN0cnVjdCBpc2NzaV9lbmRwb2ludCAqZXA7CisJc3RydWN0IHNvY2thZGRyX2luICphZGRyOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmFkZHI2OworCXN0cnVjdCBzb2NrYWRkciAqZHN0X2FkZHI7CisJY2hhciAqaXA7CisKKwkvKiBUT0RPOiBuZWVkIHRvIGRlc3Ryb3kgb24gdW5sb2FkIGlzY3NpX2VuZHBvaW50Ki8KKwlkc3RfYWRkciA9IHZtYWxsb2Moc2l6ZW9mKCpkc3RfYWRkcikpOworCWlmICghZHN0X2FkZHIpCisJCXJldHVybiBOVUxMOworCisJaWYgKGZ3X2RkYl9lbnRyeS0+b3B0aW9ucyAmIEREQl9PUFRfSVBWNl9ERVZJQ0UpIHsKKwkJZHN0X2FkZHItPnNhX2ZhbWlseSA9IEFGX0lORVQ2OworCQlhZGRyNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopZHN0X2FkZHI7CisJCWlwID0gKGNoYXIgKikmYWRkcjYtPnNpbjZfYWRkcjsKKwkJbWVtY3B5KGlwLCBmd19kZGJfZW50cnktPmlwX2FkZHIsIElQdjZfQUREUl9MRU4pOworCQlhZGRyNi0+c2luNl9wb3J0ID0gaHRvbnMobGUxNl90b19jcHUoZndfZGRiX2VudHJ5LT5wb3J0KSk7CisKKwl9IGVsc2UgeworCQlkc3RfYWRkci0+c2FfZmFtaWx5ID0gQUZfSU5FVDsKKwkJYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfaW4gKilkc3RfYWRkcjsKKwkJaXAgPSAoY2hhciAqKSZhZGRyLT5zaW5fYWRkcjsKKwkJbWVtY3B5KGlwLCBmd19kZGJfZW50cnktPmlwX2FkZHIsIElQX0FERFJfTEVOKTsKKwkJYWRkci0+c2luX3BvcnQgPSBodG9ucyhsZTE2X3RvX2NwdShmd19kZGJfZW50cnktPnBvcnQpKTsKKwl9CisKKwllcCA9IHFsYTR4eHhfZXBfY29ubmVjdChoYS0+aG9zdCwgZHN0X2FkZHIsIDApOworCXZmcmVlKGRzdF9hZGRyKTsKKwlyZXR1cm4gZXA7Cit9CisKK3N0YXRpYyBpbnQgcWxhNHh4eF92ZXJpZnlfYm9vdF9pZHgoc3RydWN0IHNjc2lfcWxhX2hvc3QgKmhhLCB1aW50MTZfdCBpZHgpCit7CisJaWYgKHFsNHhkaXNhYmxlc3lzZnNib290KQorCQlyZXR1cm4gUUxBX1NVQ0NFU1M7CisJaWYgKGlkeCA9PSBoYS0+cHJpX2RkYl9pZHggfHwgaWR4ID09IGhhLT5zZWNfZGRiX2lkeCkKKwkJcmV0dXJuIFFMQV9FUlJPUjsKKwlyZXR1cm4gUUxBX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHFsYTR4eHhfc2V0dXBfZmxhc2hfZGRiX2VudHJ5KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwKKwkJCQkJICBzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkpCit7CisJZGRiX2VudHJ5LT5kZGJfdHlwZSA9IEZMQVNIX0REQjsKKwlkZGJfZW50cnktPmZ3X2RkYl9pbmRleCA9IElOVkFMSURfRU5UUlk7CisJZGRiX2VudHJ5LT5md19kZGJfZGV2aWNlX3N0YXRlID0gRERCX0RTX05PX0NPTk5FQ1RJT05fQUNUSVZFOworCWRkYl9lbnRyeS0+aGEgPSBoYTsKKwlkZGJfZW50cnktPnVuYmxvY2tfc2VzcyA9IHFsYTR4eHhfdW5ibG9ja19mbGFzaF9kZGI7CisJZGRiX2VudHJ5LT5kZGJfY2hhbmdlID0gcWxhNHh4eF9mbGFzaF9kZGJfY2hhbmdlOworCisJYXRvbWljX3NldCgmZGRiX2VudHJ5LT5yZXRyeV9yZWxvZ2luX3RpbWVyLCBJTlZBTElEX0VOVFJZKTsKKwlhdG9taWNfc2V0KCZkZGJfZW50cnktPnJlbG9naW5fdGltZXIsIDApOworCWF0b21pY19zZXQoJmRkYl9lbnRyeS0+cmVsb2dpbl9yZXRyeV9jb3VudCwgMCk7CisKKwlkZGJfZW50cnktPmRlZmF1bHRfcmVsb2dpbl90aW1lb3V0ID0KKwkJbGUxNl90b19jcHUoZGRiX2VudHJ5LT5md19kZGJfZW50cnkuZGVmX3RpbWVvdXQpOworCWRkYl9lbnRyeS0+ZGVmYXVsdF90aW1lMndhaXQgPQorCQlsZTE2X3RvX2NwdShkZGJfZW50cnktPmZ3X2RkYl9lbnRyeS5pc2NzaV9kZWZfdGltZTJ3YWl0KTsKK30KKworc3RhdGljIHZvaWQgcWxhNHh4eF93YWl0X2Zvcl9pcF9jb25maWd1cmF0aW9uKHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSkKK3sKKwl1aW50MzJfdCBpZHggPSAwOworCXVpbnQzMl90IGlwX2lkeFtJUF9BRERSX0NPVU5UXSA9IHswLCAxLCAyLCAzfTsgLyogNCBJUCBpbnRlcmZhY2VzICovCisJdWludDMyX3Qgc3RzW01CT1hfUkVHX0NPVU5UXTsKKwl1aW50MzJfdCBpcF9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nIHd0aW1lOworCWludCByZXQ7CisKKwl3dGltZSA9IGppZmZpZXMgKyAoSFogKiBJUF9DT05GSUdfVE9WKTsKKwlkbyB7CisJCWZvciAoaWR4ID0gMDsgaWR4IDwgSVBfQUREUl9DT1VOVDsgaWR4KyspIHsKKwkJCWlmIChpcF9pZHhbaWR4XSA9PSAtMSkKKwkJCQljb250aW51ZTsKKworCQkJcmV0ID0gcWxhNHh4eF9nZXRfaXBfc3RhdGUoaGEsIDAsIGlwX2lkeFtpZHhdLCBzdHMpOworCisJCQlpZiAocmV0ID09IFFMQV9FUlJPUikgeworCQkJCWlwX2lkeFtpZHhdID0gLTE7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlwX3N0YXRlID0gKHN0c1sxXSAmIElQX1NUQVRFX01BU0spID4+IElQX1NUQVRFX1NISUZUOworCisJCQlERUJVRzIocWw0X3ByaW50ayhLRVJOX0lORk8sIGhhLAorCQkJCQkgICJXYWl0aW5nIGZvciBJUCBzdGF0ZSBmb3IgaWR4ID0gJWQsIHN0YXRlID0gMHgleFxuIiwKKwkJCQkJICBpcF9pZHhbaWR4XSwgaXBfc3RhdGUpKTsKKwkJCWlmIChpcF9zdGF0ZSA9PSBJUF9BRERSU1RBVEVfVU5DT05GSUdVUkVEIHx8CisJCQkgICAgaXBfc3RhdGUgPT0gSVBfQUREUlNUQVRFX0lOVkFMSUQgfHwKKwkJCSAgICBpcF9zdGF0ZSA9PSBJUF9BRERSU1RBVEVfUFJFRkVSUkVEIHx8CisJCQkgICAgaXBfc3RhdGUgPT0gSVBfQUREUlNUQVRFX0RFUFJJQ0FURUQgfHwKKwkJCSAgICBpcF9zdGF0ZSA9PSBJUF9BRERSU1RBVEVfRElTQUJMSU5HKQorCQkJCWlwX2lkeFtpZHhdID0gLTE7CisKKwkJfQorCisJCS8qIEJyZWFrIGlmIGFsbCBJUCBzdGF0ZXMgY2hlY2tlZCAqLworCQlpZiAoKGlwX2lkeFswXSA9PSAtMSkgJiYKKwkJICAgIChpcF9pZHhbMV0gPT0gLTEpICYmCisJCSAgICAoaXBfaWR4WzJdID09IC0xKSAmJgorCQkgICAgKGlwX2lkeFszXSA9PSAtMSkpCisJCQlicmVhazsKKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFopOworCX0gd2hpbGUgKHRpbWVfYWZ0ZXIod3RpbWUsIGppZmZpZXMpKTsKK30KKwordm9pZCBxbGE0eHh4X2J1aWxkX2RkYl9saXN0KHN0cnVjdCBzY3NpX3FsYV9ob3N0ICpoYSwgaW50IGlzX3Jlc2V0KQoreworCWludCBtYXhfZGRiczsKKwlpbnQgcmV0OworCXVpbnQzMl90IGlkeCA9IDAsIG5leHRfaWR4ID0gMDsKKwl1aW50MzJfdCBzdGF0ZSA9IDAsIGNvbm5fZXJyID0gMDsKKwl1aW50MTZfdCBjb25uX2lkOworCXN0cnVjdCBkZXZfZGJfZW50cnkgKmZ3X2RkYl9lbnRyeTsKKwlzdHJ1Y3QgZGRiX2VudHJ5ICpkZGJfZW50cnkgPSBOVUxMOworCWRtYV9hZGRyX3QgZndfZGRiX2RtYTsKKwlzdHJ1Y3QgaXNjc2lfY2xzX3Nlc3Npb24gKmNsc19zZXNzOworCXN0cnVjdCBpc2NzaV9zZXNzaW9uICpzZXNzOworCXN0cnVjdCBpc2NzaV9jbHNfY29ubiAqY2xzX2Nvbm47CisJc3RydWN0IGlzY3NpX2VuZHBvaW50ICplcDsKKwl1aW50MTZfdCBjbWRzX21heCA9IDMyLCB0bW8gPSAwOworCXVpbnQzMl90IGluaXRpYWxfY21kc24gPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdF9zdCwgbGlzdF9udDsgLyogTGlzdCBvZiBzZW5kdGFyZ2V0cyAqLworCXN0cnVjdCBxbGFfZGRiX2luZGV4ICAqc3RfZGRiX2lkeCwgKnN0X2RkYl9pZHhfdG1wOworCWludCBmd19pZHhfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIHd0aW1lOworCXN0cnVjdCBxbGFfZGRiX2luZGV4ICAqbnRfZGRiX2lkeDsKKworCWlmICghdGVzdF9iaXQoQUZfTElOS19VUCwgJmhhLT5mbGFncykpIHsKKwkJc2V0X2JpdChBRl9CVUlMRF9EREJfTElTVCwgJmhhLT5mbGFncyk7CisJCWhhLT5pc19yZXNldCA9IGlzX3Jlc2V0OworCQlyZXR1cm47CisJfQorCW1heF9kZGJzID0gIGlzX3FsYTQwWFgoaGEpID8gTUFYX0RFVl9EQl9FTlRSSUVTXzQwWFggOgorCQkJCSAgICAgTUFYX0RFVl9EQl9FTlRSSUVTOworCisJZndfZGRiX2VudHJ5ID0gZG1hX3Bvb2xfYWxsb2MoaGEtPmZ3X2RkYl9kbWFfcG9vbCwgR0ZQX0tFUk5FTCwKKwkJCQkgICAgICAmZndfZGRiX2RtYSk7CisJaWYgKGZ3X2RkYl9lbnRyeSA9PSBOVUxMKSB7CisJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwgIk91dCBvZiBtZW1vcnlcbiIpKTsKKwkJZ290byBleGl0X2RkYl9saXN0OworCX0KKworCUlOSVRfTElTVF9IRUFEKCZsaXN0X3N0KTsKKwlJTklUX0xJU1RfSEVBRCgmbGlzdF9udCk7CisJZndfaWR4X3NpemUgPSBzaXplb2Yoc3RydWN0IHFsYV9kZGJfaW5kZXgpOworCisJZm9yIChpZHggPSAwOyBpZHggPCBtYXhfZGRiczsgaWR4ID0gbmV4dF9pZHgpIHsKKwkJcmV0ID0gcWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsIGlkeCwgZndfZGRiX2VudHJ5LAorCQkJCQkgICAgICBmd19kZGJfZG1hLCBOVUxMLAorCQkJCQkgICAgICAmbmV4dF9pZHgsICZzdGF0ZSwgJmNvbm5fZXJyLAorCQkJCQkgICAgICBOVUxMLCAmY29ubl9pZCk7CisJCWlmIChyZXQgPT0gUUxBX0VSUk9SKQorCQkJYnJlYWs7CisKKwkJaWYgKHFsYTR4eHhfdmVyaWZ5X2Jvb3RfaWR4KGhhLCBpZHgpICE9IFFMQV9TVUNDRVNTKQorCQkJZ290byBjb250aW51ZV9uZXh0X3N0OworCisJCS8qIENoZWNrIGlmIFNULCBhZGQgdG8gdGhlIGxpc3Rfc3QgKi8KKwkJaWYgKHN0cmxlbigoY2hhciAqKSBmd19kZGJfZW50cnktPmlzY3NpX25hbWUpICE9IDApCisJCQlnb3RvIGNvbnRpbnVlX25leHRfc3Q7CisKKwkJc3RfZGRiX2lkeCA9IHZ6YWxsb2MoZndfaWR4X3NpemUpOworCQlpZiAoIXN0X2RkYl9pZHgpCisJCQlicmVhazsKKworCQlzdF9kZGJfaWR4LT5md19kZGJfaWR4ID0gaWR4OworCisJCWxpc3RfYWRkX3RhaWwoJnN0X2RkYl9pZHgtPmxpc3QsICZsaXN0X3N0KTsKK2NvbnRpbnVlX25leHRfc3Q6CisJCWlmIChuZXh0X2lkeCA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJLyogQmVmb3JlIGlzc3VpbmcgY29ubiBvcGVuIG1ib3gsIGVuc3VyZSBhbGwgSVBzIHN0YXRlcyBhcmUgY29uZmlndXJlZAorCSAqIE5vdGUsIGNvbm4gb3BlbiBmYWlscyBpZiBJUHMgYXJlIG5vdCBjb25maWd1cmVkCisJICovCisJcWxhNHh4eF93YWl0X2Zvcl9pcF9jb25maWd1cmF0aW9uKGhhKTsKKworCS8qIEdvIHRocnUgdGhlIFNUcyBhbmQgZmlyZSB0aGUgc2VuZHRhcmdldHMgYnkgaXNzdWluZyBjb25uIG9wZW4gbWJ4ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHN0X2RkYl9pZHgsIHN0X2RkYl9pZHhfdG1wLCAmbGlzdF9zdCwgbGlzdCkgeworCQlxbGE0eHh4X2Nvbm5fb3BlbihoYSwgc3RfZGRiX2lkeC0+ZndfZGRiX2lkeCk7CisJfQorCisJLyogV2FpdCB0byBlbnN1cmUgYWxsIHNlbmR0YXJnZXRzIGFyZSBkb25lIGZvciBtaW4gMTIgc2VjIHdhaXQgKi8KKwl0bW8gPSAoKGhhLT5kZWZfdGltZW91dCA8IExPR0lOX1RPVikgPyBMT0dJTl9UT1YgOiBoYS0+ZGVmX3RpbWVvdXQpOworCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkgICJEZWZhdWx0IHRpbWUgdG8gd2FpdCBmb3IgYnVpbGQgZGRiICVkXG4iLCB0bW8pKTsKKworCXd0aW1lID0gamlmZmllcyArIChIWiAqIHRtbyk7CisJZG8geworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3RfZGRiX2lkeCwgc3RfZGRiX2lkeF90bXAsICZsaXN0X3N0LAorCQkJCQkgbGlzdCkgeworCQkJcmV0ID0gcWxhNHh4eF9nZXRfZndkZGJfZW50cnkoaGEsCisJCQkJCQkgICAgICBzdF9kZGJfaWR4LT5md19kZGJfaWR4LAorCQkJCQkJICAgICAgTlVMTCwgMCwgTlVMTCwgJm5leHRfaWR4LAorCQkJCQkJICAgICAgJnN0YXRlLCAmY29ubl9lcnIsIE5VTEwsCisJCQkJCQkgICAgICBOVUxMKTsKKwkJCWlmIChyZXQgPT0gUUxBX0VSUk9SKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc3RhdGUgPT0gRERCX0RTX05PX0NPTk5FQ1RJT05fQUNUSVZFIHx8CisJCQkgICAgc3RhdGUgPT0gRERCX0RTX1NFU1NJT05fRkFJTEVEKSB7CisJCQkJbGlzdF9kZWxfaW5pdCgmc3RfZGRiX2lkeC0+bGlzdCk7CisJCQkJdmZyZWUoc3RfZGRiX2lkeCk7CisJCQl9CisJCX0KKwkJc2NoZWR1bGVfdGltZW91dF91bmludGVycnVwdGlibGUoSFogLyAxMCk7CisJfSB3aGlsZSAodGltZV9hZnRlcih3dGltZSwgamlmZmllcykpOworCisJLyogRnJlZSB1cCB0aGUgc2VuZHRhcmdldHMgbGlzdCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdF9kZGJfaWR4LCBzdF9kZGJfaWR4X3RtcCwgJmxpc3Rfc3QsIGxpc3QpIHsKKwkJbGlzdF9kZWxfaW5pdCgmc3RfZGRiX2lkeC0+bGlzdCk7CisJCXZmcmVlKHN0X2RkYl9pZHgpOworCX0KKworCWZvciAoaWR4ID0gMDsgaWR4IDwgbWF4X2RkYnM7IGlkeCA9IG5leHRfaWR4KSB7CisJCXJldCA9IHFsYTR4eHhfZ2V0X2Z3ZGRiX2VudHJ5KGhhLCBpZHgsIGZ3X2RkYl9lbnRyeSwKKwkJCQkJICAgICAgZndfZGRiX2RtYSwgTlVMTCwKKwkJCQkJICAgICAgJm5leHRfaWR4LCAmc3RhdGUsICZjb25uX2VyciwKKwkJCQkJICAgICAgTlVMTCwgJmNvbm5faWQpOworCQlpZiAocmV0ID09IFFMQV9FUlJPUikKKwkJCWJyZWFrOworCisJCWlmIChxbGE0eHh4X3ZlcmlmeV9ib290X2lkeChoYSwgaWR4KSAhPSBRTEFfU1VDQ0VTUykKKwkJCWdvdG8gY29udGludWVfbmV4dF9udDsKKworCQkvKiBDaGVjayBpZiBOVCwgdGhlbiBhZGQgdG8gbGlzdCBpdCAqLworCQlpZiAoc3RybGVuKChjaGFyICopIGZ3X2RkYl9lbnRyeS0+aXNjc2lfbmFtZSkgPT0gMCkKKwkJCWdvdG8gY29udGludWVfbmV4dF9udDsKKworCQlpZiAoc3RhdGUgPT0gRERCX0RTX05PX0NPTk5FQ1RJT05fQUNUSVZFIHx8CisJCSAgICBzdGF0ZSA9PSBEREJfRFNfU0VTU0lPTl9GQUlMRUQpIHsKKwkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fSU5GTywgaGEsCisJCQkJCSAgIkFkZGluZyAgRERCIHRvIHNlc3Npb24gPSAweCV4XG4iLAorCQkJCQkgIGlkeCkpOworCQkJaWYgKGlzX3Jlc2V0ID09IElOSVRfQURBUFRFUikgeworCQkJCW50X2RkYl9pZHggPSB2bWFsbG9jKGZ3X2lkeF9zaXplKTsKKwkJCQlpZiAoIW50X2RkYl9pZHgpCisJCQkJCWJyZWFrOworCisJCQkJbnRfZGRiX2lkeC0+ZndfZGRiX2lkeCA9IGlkeDsKKworCQkJCW1lbWNweSgmbnRfZGRiX2lkeC0+ZndfZGRiLCBmd19kZGJfZW50cnksCisJCQkJICAgICAgIHNpemVvZihzdHJ1Y3QgZGV2X2RiX2VudHJ5KSk7CisKKwkJCQlpZiAocWxhNHh4eF9pc19mbGFzaF9kZGJfZXhpc3RzKGhhLCAmbGlzdF9udCwKKwkJCQkJCWZ3X2RkYl9lbnRyeSkgPT0gUUxBX1NVQ0NFU1MpIHsKKwkJCQkJdmZyZWUobnRfZGRiX2lkeCk7CisJCQkJCWdvdG8gY29udGludWVfbmV4dF9udDsKKwkJCQl9CisJCQkJbGlzdF9hZGRfdGFpbCgmbnRfZGRiX2lkeC0+bGlzdCwgJmxpc3RfbnQpOworCQkJfSBlbHNlIGlmIChpc19yZXNldCA9PSBSRVNFVF9BREFQVEVSKSB7CisJCQkJaWYgKHFsYTR4eHhfaXNfc2Vzc2lvbl9leGlzdHMoaGEsCisJCQkJCQkgICBmd19kZGJfZW50cnkpID09IFFMQV9TVUNDRVNTKQorCQkJCQlnb3RvIGNvbnRpbnVlX25leHRfbnQ7CisJCQl9CisKKwkJCS8qIENyZWF0ZSBzZXNzaW9uIG9iamVjdCwgd2l0aCBJTlZBTElEX0VOVFJZLAorCQkJICogdGhlIHRhcmdlcl9pZCB3b3VsZCBnZXQgc2V0IHdoZW4gd2UgaXNzdWUgdGhlIGxvZ2luCisJCQkgKi8KKwkJCWNsc19zZXNzID0gaXNjc2lfc2Vzc2lvbl9zZXR1cCgmcWxhNHh4eF9pc2NzaV90cmFuc3BvcnQsCisJCQkJCQloYS0+aG9zdCwgY21kc19tYXgsCisJCQkJCQlzaXplb2Yoc3RydWN0IGRkYl9lbnRyeSksCisJCQkJCQlzaXplb2Yoc3RydWN0IHFsNF90YXNrX2RhdGEpLAorCQkJCQkJaW5pdGlhbF9jbWRzbiwgSU5WQUxJRF9FTlRSWSk7CisJCQlpZiAoIWNsc19zZXNzKQorCQkJCWdvdG8gZXhpdF9kZGJfbGlzdDsKKworCQkJLyoKKwkJCSAqIGlzY3NpX3Nlc3Npb25fc2V0dXAgaW5jcmVtZW50cyB0aGUgZHJpdmVyIHJlZmVyZW5jZQorCQkJICogY291bnQgd2hpY2ggd291bGRuJ3QgbGV0IHRoZSBkcml2ZXIgdG8gYmUgdW5sb2FkZWQuCisJCQkgKiBzbyBjYWxsaW5nIG1vZHVsZV9wdXQgZnVuY3Rpb24gdG8gZGVjcmVtZW50IHRoZQorCQkJICogcmVmZXJlbmNlIGNvdW50LgorCQkJICoqLworCQkJbW9kdWxlX3B1dChxbGE0eHh4X2lzY3NpX3RyYW5zcG9ydC5vd25lcik7CisJCQlzZXNzID0gY2xzX3Nlc3MtPmRkX2RhdGE7CisJCQlkZGJfZW50cnkgPSBzZXNzLT5kZF9kYXRhOworCQkJZGRiX2VudHJ5LT5zZXNzID0gY2xzX3Nlc3M7CisKKwkJCWNsc19zZXNzLT5yZWNvdmVyeV90bW8gPSBxbDR4c2Vzc19yZWNvdmVyeV90bW87CisJCQltZW1jcHkoJmRkYl9lbnRyeS0+ZndfZGRiX2VudHJ5LCBmd19kZGJfZW50cnksCisJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBkZXZfZGJfZW50cnkpKTsKKworCQkJcWxhNHh4eF9zZXR1cF9mbGFzaF9kZGJfZW50cnkoaGEsIGRkYl9lbnRyeSk7CisKKwkJCWNsc19jb25uID0gaXNjc2lfY29ubl9zZXR1cChjbHNfc2VzcywKKwkJCQkJCSAgICBzaXplb2Yoc3RydWN0IHFsYV9jb25uKSwKKwkJCQkJCSAgICBjb25uX2lkKTsKKwkJCWlmICghY2xzX2Nvbm4pCisJCQkJZ290byBleGl0X2RkYl9saXN0OworCisJCQlkZGJfZW50cnktPmNvbm4gPSBjbHNfY29ubjsKKworCQkJLyogU2V0dXAgZXAsIGZvciBkaXNwbGF5aW5nIGF0dHJpYnV0ZXMgaW4gc3lzZnMgKi8KKwkJCWVwID0gcWxhNHh4eF9nZXRfZXBfZndkYihoYSwgZndfZGRiX2VudHJ5KTsKKwkJCWlmIChlcCkgeworCQkJCWVwLT5jb25uID0gY2xzX2Nvbm47CisJCQkJY2xzX2Nvbm4tPmVwID0gZXA7CisJCQl9IGVsc2UgeworCQkJCURFQlVHMihxbDRfcHJpbnRrKEtFUk5fRVJSLCBoYSwKKwkJCQkJCSAgIlVuYWJsZSB0byBnZXQgZXBcbiIpKTsKKwkJCX0KKworCQkJLyogVXBkYXRlIHNlc3MvY29ubiBwYXJhbXMgKi8KKwkJCXFsYTR4eHhfY29weV9md2RkYl9wYXJhbShoYSwgZndfZGRiX2VudHJ5LCBjbHNfc2VzcywKKwkJCQkJCSBjbHNfY29ubik7CisKKwkJCWlmIChpc19yZXNldCA9PSBSRVNFVF9BREFQVEVSKSB7CisJCQkJaXNjc2lfYmxvY2tfc2Vzc2lvbihjbHNfc2Vzcyk7CisJCQkJLyogVXNlIHRoZSByZWxvZ2luIHBhdGggdG8gZGlzY292ZXIgbmV3IGRldmljZXMKKwkJCQkgKiAgYnkgc2hvcnQtY2lyY3V0aW5nIHRoZSBsb2dpYyBvZiBzZXR0aW5nCisJCQkJICogIHRpbWVyIHRvIHJlbG9naW4gLSBpbnN0ZWFkIHNldCB0aGUgZmxhZ3MKKwkJCQkgKiAgdG8gaW5pdGlhdGUgbG9naW4gcmlnaHQgYXdheS4KKwkJCQkgKi8KKwkJCQlzZXRfYml0KERQQ19SRUxPR0lOX0RFVklDRSwgJmhhLT5kcGNfZmxhZ3MpOworCQkJCXNldF9iaXQoREZfUkVMT0dJTiwgJmRkYl9lbnRyeS0+ZmxhZ3MpOworCQkJfQorCQl9Citjb250aW51ZV9uZXh0X250OgorCQlpZiAobmV4dF9pZHggPT0gMCkKKwkJCWJyZWFrOworCX0KK2V4aXRfZGRiX2xpc3Q6CisJcWxhNHh4eF9mcmVlX250X2xpc3QoJmxpc3RfbnQpOworCWlmIChmd19kZGJfZW50cnkpCisJCWRtYV9wb29sX2ZyZWUoaGEtPmZ3X2RkYl9kbWFfcG9vbCwgZndfZGRiX2VudHJ5LCBmd19kZGJfZG1hKTsKKworCXFsYTR4eHhfZnJlZV9kZGJfaW5kZXgoaGEpOworfQorCisKIC8qKgogICogcWxhNHh4eF9wcm9iZV9hZGFwdGVyIC0gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvYmUgSEJBCiAgKiBAcGRldjogcG9pbnRlciB0byBwY2lfZGV2IHN0cnVjdHVyZQpAQCAtMzI5OCw3ICs0MjM2LDcgQEAKIAkgKiBmaXJtd2FyZQogCSAqIE5PVEU6IGludGVycnVwdHMgZW5hYmxlZCB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbgogCSAqLwotCXN0YXR1cyA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhKTsKKwlzdGF0dXMgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSwgSU5JVF9BREFQVEVSKTsKIAl3aGlsZSAoKCF0ZXN0X2JpdChBRl9PTkxJTkUsICZoYS0+ZmxhZ3MpKSAmJgogCSAgICBpbml0X3JldHJ5X2NvdW50KysgPCBNQVhfSU5JVF9SRVRSSUVTKSB7CiAKQEAgLTMzMTksNyArNDI1Nyw3IEBACiAJCWlmIChoYS0+aXNwX29wcy0+cmVzZXRfY2hpcChoYSkgPT0gUUxBX0VSUk9SKQogCQkJY29udGludWU7CiAKLQkJc3RhdHVzID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEpOworCQlzdGF0dXMgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSwgSU5JVF9BREFQVEVSKTsKIAl9CiAKIAlpZiAoIXRlc3RfYml0KEFGX09OTElORSwgJmhhLT5mbGFncykpIHsKQEAgLTMzODYsMTIgKzQzMjQsMTYgQEAKIAkgICAgICAgaGEtPmhvc3Rfbm8sIGhhLT5maXJtd2FyZV92ZXJzaW9uWzBdLCBoYS0+ZmlybXdhcmVfdmVyc2lvblsxXSwKIAkgICAgICAgaGEtPnBhdGNoX251bWJlciwgaGEtPmJ1aWxkX251bWJlcik7CiAKLQlxbGE0eHh4X2NyZWF0ZV9jaGFwX2xpc3QoaGEpOwotCiAJaWYgKHFsYTR4eHhfc2V0dXBfYm9vdF9pbmZvKGhhKSkKIAkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczpJU0NTSSBib290IGluZm8gc2V0dXAgZmFpbGVkXG4iLAogCQkJICAgX19mdW5jX18pOwogCisJCS8qIFBlcmZvcm0gdGhlIGJ1aWxkIGRkYiBsaXN0IGFuZCBsb2dpbiB0byBlYWNoICovCisJcWxhNHh4eF9idWlsZF9kZGJfbGlzdChoYSwgSU5JVF9BREFQVEVSKTsKKwlpc2NzaV9ob3N0X2Zvcl9lYWNoX3Nlc3Npb24oaGEtPmhvc3QsIHFsYTR4eHhfbG9naW5fZmxhc2hfZGRiKTsKKworCXFsYTR4eHhfY3JlYXRlX2NoYXBfbGlzdChoYSk7CisKIAlxbGE0eHh4X2NyZWF0ZV9pZmFjZXMoaGEpOwogCXJldHVybiAwOwogCkBAIC0zNDQ5LDYgKzQzOTEsMzggQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHFsYTR4eHhfZGVzdHJveV9md19kZGJfc2Vzc2lvbihzdHJ1Y3Qgc2NzaV9xbGFfaG9zdCAqaGEpCit7CisJc3RydWN0IGRkYl9lbnRyeSAqZGRiX2VudHJ5OworCWludCBvcHRpb25zOworCWludCBpZHg7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IE1BWF9EREJfRU5UUklFUzsgaWR4KyspIHsKKworCQlkZGJfZW50cnkgPSBxbGE0eHh4X2xvb2t1cF9kZGJfYnlfZndfaW5kZXgoaGEsIGlkeCk7CisJCWlmICgoZGRiX2VudHJ5ICE9IE5VTEwpICYmCisJCSAgICAoZGRiX2VudHJ5LT5kZGJfdHlwZSA9PSBGTEFTSF9EREIpKSB7CisKKwkJCW9wdGlvbnMgPSBMT0dPVVRfT1BUSU9OX0NMT1NFX1NFU1NJT047CisJCQlpZiAocWxhNHh4eF9zZXNzaW9uX2xvZ291dF9kZGIoaGEsIGRkYl9lbnRyeSwgb3B0aW9ucykKKwkJCSAgICA9PSBRTEFfRVJST1IpCisJCQkJcWw0X3ByaW50ayhLRVJOX0VSUiwgaGEsICIlczogTG9nb3V0IGZhaWxlZFxuIiwKKwkJCQkJICAgX19mdW5jX18pOworCisJCQlxbGE0eHh4X2NsZWFyX2RkYl9lbnRyeShoYSwgZGRiX2VudHJ5LT5md19kZGJfaW5kZXgpOworCQkJLyoKKwkJCSAqIHdlIGhhdmUgZGVjcmVtZW50ZWQgdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgZHJpdmVyCisJCQkgKiB3aGVuIHdlIHNldHVwIHRoZSBzZXNzaW9uIHRvIGhhdmUgdGhlIGRyaXZlciB1bmxvYWQKKwkJCSAqIHRvIGJlIHNlYW1sZXNzIHdpdGhvdXQgYWN0dWFsbHkgZGVzdHJveWluZyB0aGUKKwkJCSAqIHNlc3Npb24KKwkJCSAqKi8KKwkJCXRyeV9tb2R1bGVfZ2V0KHFsYTR4eHhfaXNjc2lfdHJhbnNwb3J0Lm93bmVyKTsKKwkJCWlzY3NpX2Rlc3Ryb3lfZW5kcG9pbnQoZGRiX2VudHJ5LT5jb25uLT5lcCk7CisJCQlxbGE0eHh4X2ZyZWVfZGRiKGhhLCBkZGJfZW50cnkpOworCQkJaXNjc2lfc2Vzc2lvbl90ZWFyZG93bihkZGJfZW50cnktPnNlc3MpOworCQl9CisJfQorfQogLyoqCiAgKiBxbGE0eHh4X3JlbW92ZV9hZGFwdGVyIC0gY2FsYmFjayBmdW5jdGlvbiB0byByZW1vdmUgYWRhcHRlci4KICAqIEBwY2lfZGV2OiBQQ0kgZGV2aWNlIHBvaW50ZXIKQEAgLTM0NjUsOSArNDQzOSwxMSBAQAogCS8qIGRlc3Ryb3kgaWZhY2UgZnJvbSBzeXNmcyAqLwogCXFsYTR4eHhfZGVzdHJveV9pZmFjZXMoaGEpOwogCi0JaWYgKGhhLT5ib290X2tzZXQpCisJaWYgKCghcWw0eGRpc2FibGVzeXNmc2Jvb3QpICYmIGhhLT5ib290X2tzZXQpCiAJCWlzY3NpX2Jvb3RfZGVzdHJveV9rc2V0KGhhLT5ib290X2tzZXQpOwogCisJcWxhNHh4eF9kZXN0cm95X2Z3X2RkYl9zZXNzaW9uKGhhKTsKKwogCXNjc2lfcmVtb3ZlX2hvc3QoaGEtPmhvc3QpOwogCiAJcWxhNHh4eF9mcmVlX2FkYXB0ZXIoaGEpOwpAQCAtNDExNSw3ICs1MDkxLDcgQEAKIAogCQlxbGE0Xzh4eHhfaWRjX3VubG9jayhoYSk7CiAJCWNsZWFyX2JpdChBRl9GV19SRUNPVkVSWSwgJmhhLT5mbGFncyk7Ci0JCXJ2YWwgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSk7CisJCXJ2YWwgPSBxbGE0eHh4X2luaXRpYWxpemVfYWRhcHRlcihoYSwgUkVTRVRfQURBUFRFUik7CiAJCXFsYTRfOHh4eF9pZGNfbG9jayhoYSk7CiAKIAkJaWYgKHJ2YWwgIT0gUUxBX1NVQ0NFU1MpIHsKQEAgLTQxNTEsNyArNTEyNyw3IEBACiAJCWlmICgocWxhNF84eHh4X3JkXzMyKGhhLCBRTEE4MlhYX0NSQl9ERVZfU1RBVEUpID09CiAJCSAgICBRTEE4MlhYX0RFVl9SRUFEWSkpIHsKIAkJCWNsZWFyX2JpdChBRl9GV19SRUNPVkVSWSwgJmhhLT5mbGFncyk7Ci0JCQlydmFsID0gcWxhNHh4eF9pbml0aWFsaXplX2FkYXB0ZXIoaGEpOworCQkJcnZhbCA9IHFsYTR4eHhfaW5pdGlhbGl6ZV9hZGFwdGVyKGhhLCBSRVNFVF9BREFQVEVSKTsKIAkJCWlmIChydmFsID09IFFMQV9TVUNDRVNTKSB7CiAJCQkJcmV0ID0gcWxhNHh4eF9yZXF1ZXN0X2lycXMoaGEpOwogCQkJCWlmIChyZXQpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmggYi9kcml2ZXJzL3Njc2kvcWxhNHh4eC9xbDRfdmVyc2lvbi5oCmluZGV4IGMxNTM0N2QuLjUyNTRlNTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc2NzaS9xbGE0eHh4L3FsNF92ZXJzaW9uLmgKKysrIGIvZHJpdmVycy9zY3NpL3FsYTR4eHgvcWw0X3ZlcnNpb24uaApAQCAtNSw0ICs1LDQgQEAKICAqIFNlZSBMSUNFTlNFLnFsYTR4eHggZm9yIGNvcHlyaWdodCBhbmQgbGljZW5zaW5nIGRldGFpbHMuCiAgKi8KIAotI2RlZmluZSBRTEE0WFhYX0RSSVZFUl9WRVJTSU9OCSI1LjAyLjAwLWs4IgorI2RlZmluZSBRTEE0WFhYX0RSSVZFUl9WRVJTSU9OCSI1LjAyLjAwLWs5IgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvS2NvbmZpZyBiL2RyaXZlcnMvc3BpL0tjb25maWcKaW5kZXggYTFmZDczZC4uOGJhNDUxMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvS2NvbmZpZworKysgYi9kcml2ZXJzL3NwaS9LY29uZmlnCkBAIC0xOTksNyArMTk5LDcgQEAKIAlkZXBlbmRzIG9uIEZTTF9TT0MKIAogY29uZmlnIFNQSV9GU0xfU1BJCi0JdHJpc3RhdGUgIkZyZWVzY2FsZSBTUEkgY29udHJvbGxlciIKKwlib29sICJGcmVlc2NhbGUgU1BJIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBGU0xfU09DCiAJc2VsZWN0IFNQSV9GU0xfTElCCiAJaGVscApAQCAtMjA4LDcgKzIwOCw3IEBACiAJICBNUEM4NTY5IHVzZXMgdGhlIGNvbnRyb2xsZXIgaW4gUUUgbW9kZSwgTVBDODYxMCBpbiBjcHUgbW9kZS4KIAogY29uZmlnIFNQSV9GU0xfRVNQSQotCXRyaXN0YXRlICJGcmVlc2NhbGUgZVNQSSBjb250cm9sbGVyIgorCWJvb2wgIkZyZWVzY2FsZSBlU1BJIGNvbnRyb2xsZXIiCiAJZGVwZW5kcyBvbiBGU0xfU09DCiAJc2VsZWN0IFNQSV9GU0xfTElCCiAJaGVscApkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWF0aDc5LmMgYi9kcml2ZXJzL3NwaS9zcGktYXRoNzkuYwppbmRleCAwMjRiNDhhLi5hY2M4OGI0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktYXRoNzkuYworKysgYi9kcml2ZXJzL3NwaS9zcGktYXRoNzkuYwpAQCAtMTMsNiArMTMsNyBAQAogICovCiAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zcGkvc3BpLWdwaW8uYyBiL2RyaXZlcnMvc3BpL3NwaS1ncGlvLmMKaW5kZXggZTA5M2QzZS4uMDA5NGM2NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9zcGkvc3BpLWdwaW8uYworKysgYi9kcml2ZXJzL3NwaS9zcGktZ3Bpby5jCkBAIC0yNTYsNyArMjU2LDcgQEAKIAlzcGlfYml0YmFuZ19jbGVhbnVwKHNwaSk7CiB9CiAKLXN0YXRpYyBpbnQgX19pbml0IHNwaV9ncGlvX2FsbG9jKHVuc2lnbmVkIHBpbiwgY29uc3QgY2hhciAqbGFiZWwsIGJvb2wgaXNfaW4pCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzcGlfZ3Bpb19hbGxvYyh1bnNpZ25lZCBwaW4sIGNvbnN0IGNoYXIgKmxhYmVsLCBib29sIGlzX2luKQogewogCWludCB2YWx1ZTsKIApAQCAtMjcwLDcgKzI3MCw3IEBACiAJcmV0dXJuIHZhbHVlOwogfQogCi1zdGF0aWMgaW50IF9faW5pdAorc3RhdGljIGludCBfX2RldmluaXQKIHNwaV9ncGlvX3JlcXVlc3Qoc3RydWN0IHNwaV9ncGlvX3BsYXRmb3JtX2RhdGEgKnBkYXRhLCBjb25zdCBjaGFyICpsYWJlbCwKIAl1MTYgKnJlc19mbGFncykKIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc3BpL3NwaS1udWM5MDAuYyBiL2RyaXZlcnMvc3BpL3NwaS1udWM5MDAuYwppbmRleCAyMWM3MGIyLi4xODJlOWM4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NwaS9zcGktbnVjOTAwLmMKKysrIGIvZHJpdmVycy9zcGkvc3BpLW51YzkwMC5jCkBAIC04LDYgKzgsNyBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NzYi9kcml2ZXJfcGNpY29yZS5jIGIvZHJpdmVycy9zc2IvZHJpdmVyX3BjaWNvcmUuYwppbmRleCA4NGM5MzRjLi41MjBlODI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3NzYi9kcml2ZXJfcGNpY29yZS5jCisrKyBiL2RyaXZlcnMvc3NiL2RyaXZlcl9wY2ljb3JlLmMKQEAgLTUxNywxMCArNTE3LDE0IEBACiAKIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBzc2JfcGNpY29yZV9pbml0X2NsaWVudG1vZGUoc3RydWN0IHNzYl9wY2ljb3JlICpwYykKIHsKLQlzc2JfcGNpY29yZV9maXhfc3Byb21fY29yZV9pbmRleChwYyk7CisJc3RydWN0IHNzYl9kZXZpY2UgKnBkZXYgPSBwYy0+ZGV2OworCXN0cnVjdCBzc2JfYnVzICpidXMgPSBwZGV2LT5idXM7CisKKwlpZiAoYnVzLT5idXN0eXBlID09IFNTQl9CVVNUWVBFX1BDSSkKKwkJc3NiX3BjaWNvcmVfZml4X3Nwcm9tX2NvcmVfaW5kZXgocGMpOwogCiAJLyogRGlzYWJsZSBQQ0kgaW50ZXJydXB0cy4gKi8KLQlzc2Jfd3JpdGUzMihwYy0+ZGV2LCBTU0JfSU5UVkVDLCAwKTsKKwlzc2Jfd3JpdGUzMihwZGV2LCBTU0JfSU5UVkVDLCAwKTsKIAogCS8qIEFkZGl0aW9uYWwgUENJZSBhbHdheXMgb25jZS1leGVjdXRlZCB3b3JrYXJvdW5kcyAqLwogCWlmIChwYy0+ZGV2LT5pZC5jb3JlaWQgPT0gU1NCX0RFVl9QQ0lFKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3NzYi9wY2kuYyBiL2RyaXZlcnMvc3NiL3BjaS5jCmluZGV4IDM0YzNiYWIuLjk3MzIyM2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3NiL3BjaS5jCisrKyBiL2RyaXZlcnMvc3NiL3BjaS5jCkBAIC02MDcsNiArNjA3LDI5IEBACiAJbWVtY3B5KCZvdXQtPmFudGVubmFfZ2Fpbi5naHo1LCAmb3V0LT5hbnRlbm5hX2dhaW4uZ2h6MjQsCiAJICAgICAgIHNpemVvZihvdXQtPmFudGVubmFfZ2Fpbi5naHo1KSk7CiAKKwkvKiBFeHRyYWN0IEZFTSBpbmZvICovCisJU1BFWChmZW0uZ2h6Mi50c3NpcG9zLCBTU0JfU1BST004X0ZFTTJHLAorCQlTU0JfU1JPTThfRkVNX1RTU0lQT1MsIFNTQl9TUk9NOF9GRU1fVFNTSVBPU19TSElGVCk7CisJU1BFWChmZW0uZ2h6Mi5leHRwYV9nYWluLCBTU0JfU1BST004X0ZFTTJHLAorCQlTU0JfU1JPTThfRkVNX0VYVFBBX0dBSU4sIFNTQl9TUk9NOF9GRU1fRVhUUEFfR0FJTl9TSElGVCk7CisJU1BFWChmZW0uZ2h6Mi5wZGV0X3JhbmdlLCBTU0JfU1BST004X0ZFTTJHLAorCQlTU0JfU1JPTThfRkVNX1BERVRfUkFOR0UsIFNTQl9TUk9NOF9GRU1fUERFVF9SQU5HRV9TSElGVCk7CisJU1BFWChmZW0uZ2h6Mi50cl9pc28sIFNTQl9TUFJPTThfRkVNMkcsCisJCVNTQl9TUk9NOF9GRU1fVFJfSVNPLCBTU0JfU1JPTThfRkVNX1RSX0lTT19TSElGVCk7CisJU1BFWChmZW0uZ2h6Mi5hbnRzd2x1dCwgU1NCX1NQUk9NOF9GRU0yRywKKwkJU1NCX1NST004X0ZFTV9BTlRTV0xVVCwgU1NCX1NST004X0ZFTV9BTlRTV0xVVF9TSElGVCk7CisKKwlTUEVYKGZlbS5naHo1LnRzc2lwb3MsIFNTQl9TUFJPTThfRkVNNUcsCisJCVNTQl9TUk9NOF9GRU1fVFNTSVBPUywgU1NCX1NST004X0ZFTV9UU1NJUE9TX1NISUZUKTsKKwlTUEVYKGZlbS5naHo1LmV4dHBhX2dhaW4sIFNTQl9TUFJPTThfRkVNNUcsCisJCVNTQl9TUk9NOF9GRU1fRVhUUEFfR0FJTiwgU1NCX1NST004X0ZFTV9FWFRQQV9HQUlOX1NISUZUKTsKKwlTUEVYKGZlbS5naHo1LnBkZXRfcmFuZ2UsIFNTQl9TUFJPTThfRkVNNUcsCisJCVNTQl9TUk9NOF9GRU1fUERFVF9SQU5HRSwgU1NCX1NST004X0ZFTV9QREVUX1JBTkdFX1NISUZUKTsKKwlTUEVYKGZlbS5naHo1LnRyX2lzbywgU1NCX1NQUk9NOF9GRU01RywKKwkJU1NCX1NST004X0ZFTV9UUl9JU08sIFNTQl9TUk9NOF9GRU1fVFJfSVNPX1NISUZUKTsKKwlTUEVYKGZlbS5naHo1LmFudHN3bHV0LCBTU0JfU1BST004X0ZFTTVHLAorCQlTU0JfU1JPTThfRkVNX0FOVFNXTFVULCBTU0JfU1JPTThfRkVNX0FOVFNXTFVUX1NISUZUKTsKKwogCXNwcm9tX2V4dHJhY3RfcjQ1OChvdXQsIGluKTsKIAogCS8qIFRPRE8gLSBnZXQgcmVtYWluaW5nIHJldiA4IHN0dWZmIG5lZWRlZCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jIGIvZHJpdmVycy9zdGFnaW5nL2NvbWVkaS9jb21lZGlfZm9wcy5jCmluZGV4IDIxZDhjMWMuLjVlNzhjNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvY29tZWRpX2ZvcHMuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2NvbWVkaV9mb3BzLmMKQEAgLTY3MSw3ICs2NzEsNyBAQAogCX0KIAogCWluc25zID0KLQkgICAga21hbGxvYyhzaXplb2Yoc3RydWN0IGNvbWVkaV9pbnNuKSAqIGluc25saXN0Lm5faW5zbnMsIEdGUF9LRVJORUwpOworCSAgICBrY2FsbG9jKGluc25saXN0Lm5faW5zbnMsIHNpemVvZihzdHJ1Y3QgY29tZWRpX2luc24pLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWluc25zKSB7CiAJCURQUklOVEsoImttYWxsb2MgZmFpbGVkXG4iKTsKIAkJcmV0ID0gLUVOT01FTTsKQEAgLTE0MzIsNyArMTQzMiwyMSBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbWVkaV91bm1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKmFyZWEpCisKK3N0YXRpYyB2b2lkIGNvbWVkaV92bV9vcGVuKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqYXJlYSkKK3sKKwlzdHJ1Y3QgY29tZWRpX2FzeW5jICphc3luYzsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2OworCisJYXN5bmMgPSBhcmVhLT52bV9wcml2YXRlX2RhdGE7CisJZGV2ID0gYXN5bmMtPnN1YmRldmljZS0+ZGV2aWNlOworCisJbXV0ZXhfbG9jaygmZGV2LT5tdXRleCk7CisJYXN5bmMtPm1tYXBfY291bnQrKzsKKwltdXRleF91bmxvY2soJmRldi0+bXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBjb21lZGlfdm1fY2xvc2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICphcmVhKQogewogCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jOwogCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXY7CkBAIC0xNDQ2LDE1ICsxNDYwLDEzIEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgY29tZWRpX3ZtX29wcyA9IHsKLQkuY2xvc2UgPSBjb21lZGlfdW5tYXAsCisJLm9wZW4gPSBjb21lZGlfdm1fb3BlbiwKKwkuY2xvc2UgPSBjb21lZGlfdm1fY2xvc2UsCiB9OwogCiBzdGF0aWMgaW50IGNvbWVkaV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKIHsKIAljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KLQkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOwogCXN0cnVjdCBjb21lZGlfYXN5bmMgKmFzeW5jID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gdm1hLT52bV9zdGFydDsKIAl1bnNpZ25lZCBsb25nIHNpemU7CkBAIC0xNDYyLDYgKzE0NzQsMTUgQEAKIAlpbnQgaTsKIAlpbnQgcmV0dmFsOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpzOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2OworCisJZGV2X2ZpbGVfaW5mbyA9IGNvbWVkaV9nZXRfZGV2aWNlX2ZpbGVfaW5mbyhtaW5vcik7CisJaWYgKGRldl9maWxlX2luZm8gPT0gTlVMTCkKKwkgICAgICAgIHJldHVybiAtRU5PREVWOworCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKwlpZiAoZGV2ID09IE5VTEwpCisJICAgICAgICByZXR1cm4gLUVOT0RFVjsKIAogCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCWlmICghZGV2LT5hdHRhY2hlZCkgewpAQCAtMTUyOCwxMSArMTU0OSwxNyBAQAogewogCXVuc2lnbmVkIGludCBtYXNrID0gMDsKIAljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KLQkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOwogCXN0cnVjdCBjb21lZGlfc3ViZGV2aWNlICpyZWFkX3N1YmRldjsKIAlzdHJ1Y3QgY29tZWRpX3N1YmRldmljZSAqd3JpdGVfc3ViZGV2OworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2OworCWRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCisJaWYgKGRldl9maWxlX2luZm8gPT0gTlVMTCkKKwkgICAgICAgIHJldHVybiAtRU5PREVWOworCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKwlpZiAoZGV2ID09IE5VTEwpCisJICAgICAgICByZXR1cm4gLUVOT0RFVjsKIAogCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCWlmICghZGV2LT5hdHRhY2hlZCkgewpAQCAtMTU3OCw5ICsxNjA1LDE1IEBACiAJaW50IG4sIG0sIGNvdW50ID0gMCwgcmV0dmFsID0gMDsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KLQkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2OworCWRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCisJaWYgKGRldl9maWxlX2luZm8gPT0gTlVMTCkKKwkgICAgICAgIHJldHVybiAtRU5PREVWOworCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKwlpZiAoZGV2ID09IE5VTEwpCisJICAgICAgICByZXR1cm4gLUVOT0RFVjsKIAogCWlmICghZGV2LT5hdHRhY2hlZCkgewogCQlEUFJJTlRLKCJubyBkcml2ZXIgY29uZmlndXJlZCBvbiBjb21lZGklaVxuIiwgZGV2LT5taW5vcik7CkBAIC0xNjQwLDExICsxNjczLDExIEBACiAJCQkJcmV0dmFsID0gLUVBR0FJTjsKIAkJCQlicmVhazsKIAkJCX0KKwkJCXNjaGVkdWxlKCk7CiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlzY2hlZHVsZSgpOwogCQkJaWYgKCFzLT5idXN5KQogCQkJCWJyZWFrOwogCQkJaWYgKHMtPmJ1c3kgIT0gZmlsZSkgewpAQCAtMTY4Myw5ICsxNzE2LDE1IEBACiAJaW50IG4sIG0sIGNvdW50ID0gMCwgcmV0dmFsID0gMDsKIAlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKIAljb25zdCB1bnNpZ25lZCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7Ci0Jc3RydWN0IGNvbWVkaV9kZXZpY2VfZmlsZV9pbmZvICpkZXZfZmlsZV9pbmZvID0KLQkgICAgY29tZWRpX2dldF9kZXZpY2VfZmlsZV9pbmZvKG1pbm9yKTsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2OworCWRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCisJaWYgKGRldl9maWxlX2luZm8gPT0gTlVMTCkKKwkgICAgICAgIHJldHVybiAtRU5PREVWOworCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKwlpZiAoZGV2ID09IE5VTEwpCisJICAgICAgICByZXR1cm4gLUVOT0RFVjsKIAogCWlmICghZGV2LT5hdHRhY2hlZCkgewogCQlEUFJJTlRLKCJubyBkcml2ZXIgY29uZmlndXJlZCBvbiBjb21lZGklaVxuIiwgZGV2LT5taW5vcik7CkBAIC0xNzQxLDExICsxNzgwLDExIEBACiAJCQkJcmV0dmFsID0gLUVBR0FJTjsKIAkJCQlicmVhazsKIAkJCX0KKwkJCXNjaGVkdWxlKCk7CiAJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKIAkJCQlyZXR2YWwgPSAtRVJFU1RBUlRTWVM7CiAJCQkJYnJlYWs7CiAJCQl9Ci0JCQlzY2hlZHVsZSgpOwogCQkJaWYgKCFzLT5idXN5KSB7CiAJCQkJcmV0dmFsID0gMDsKIAkJCQlicmVhazsKQEAgLTE4ODUsMTEgKzE5MjQsMTcgQEAKIHN0YXRpYyBpbnQgY29tZWRpX2Nsb3NlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewogCWNvbnN0IHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGlub2RlKTsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPQotCSAgICBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOwotCXN0cnVjdCBjb21lZGlfZGV2aWNlICpkZXYgPSBkZXZfZmlsZV9pbmZvLT5kZXZpY2U7CiAJc3RydWN0IGNvbWVkaV9zdWJkZXZpY2UgKnMgPSBOVUxMOwogCWludCBpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2OworCWRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCisJaWYgKGRldl9maWxlX2luZm8gPT0gTlVMTCkKKwkgICAgICAgIHJldHVybiAtRU5PREVWOworCWRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKwlpZiAoZGV2ID09IE5VTEwpCisJICAgICAgICByZXR1cm4gLUVOT0RFVjsKIAogCW11dGV4X2xvY2soJmRldi0+bXV0ZXgpOwogCkBAIC0xOTIzLDEwICsxOTY4LDE1IEBACiBzdGF0aWMgaW50IGNvbWVkaV9mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IG9uKQogewogCWNvbnN0IHVuc2lnbmVkIG1pbm9yID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKLQlzdHJ1Y3QgY29tZWRpX2RldmljZV9maWxlX2luZm8gKmRldl9maWxlX2luZm8gPQotCSAgICBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOworCXN0cnVjdCBjb21lZGlfZGV2aWNlX2ZpbGVfaW5mbyAqZGV2X2ZpbGVfaW5mbzsKKwlzdHJ1Y3QgY29tZWRpX2RldmljZSAqZGV2OworCWRldl9maWxlX2luZm8gPSBjb21lZGlfZ2V0X2RldmljZV9maWxlX2luZm8obWlub3IpOwogCi0Jc3RydWN0IGNvbWVkaV9kZXZpY2UgKmRldiA9IGRldl9maWxlX2luZm8tPmRldmljZTsKKwlpZiAoZGV2X2ZpbGVfaW5mbyA9PSBOVUxMKQorCSAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisJZGV2ID0gZGV2X2ZpbGVfaW5mby0+ZGV2aWNlOworCWlmIChkZXYgPT0gTlVMTCkKKwkgICAgICAgIHJldHVybiAtRU5PREVWOwogCiAJcmV0dXJuIGZhc3luY19oZWxwZXIoZmQsIGZpbGUsIG9uLCAmZGV2LT5hc3luY19xdWV1ZSk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvY29tZWRpL2RyaXZlcnMvdXNiZHV4c2lnbWEuYyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jCmluZGV4IGE4ZmVhOWEuLjYxNDRhZmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9jb21lZGkvZHJpdmVycy91c2JkdXhzaWdtYS5jCkBAIC0xLDQgKzEsNCBAQAotI2RlZmluZSBEUklWRVJfVkVSU0lPTiAidjAuNSIKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gInYwLjYiCiAjZGVmaW5lIERSSVZFUl9BVVRIT1IgIkJlcm5kIFBvcnIsIEJlcm5kUG9yckBmMnMuY29tIgogI2RlZmluZSBEUklWRVJfREVTQyAiU3RpcmxpbmcvSVRMIFVTQi1EVVggU0lHTUEgLS0gQmVybmQuUG9yckBmMnMuY29tIgogLyoKQEAgLTI1LDcgKzI1LDcgQEAKIERlc2NyaXB0aW9uOiBVbml2ZXJzaXR5IG9mIFN0aXJsaW5nIFVTQiBEQVEgJiBJTkNJVEUgVGVjaG5vbG9neSBMaW1pdGVkCiBEZXZpY2VzOiBbSVRMXSBVU0ItRFVYICh1c2JkdXhzaWdtYS5vKQogQXV0aG9yOiBCZXJuZCBQb3JyIDxCZXJuZFBvcnJAZjJzLmNvbT4KLVVwZGF0ZWQ6IDIxIEp1bCAyMDExCitVcGRhdGVkOiA4IE5vdiAyMDExCiBTdGF0dXM6IHRlc3RpbmcKICovCiAvKgpAQCAtNDQsNiArNDQsNyBAQAogICogICAwLjM6IHByb3BlciB2ZW5kb3IgSUQgYW5kIGRyaXZlciBuYW1lCiAgKiAgIDAuNDogZml4ZWQgRC9BIHZvbHRhZ2UgcmFuZ2UKICAqICAgMC41OiB2YXJpb3VzIGJ1ZyBmaXhlcywgaGVhbHRoIGNoZWNrIGF0IHN0YXJ0dXAKKyAqICAgMC42OiBjb3JyZWN0ZWQgd3JvbmcgaW5wdXQgcmFuZ2UKICAqLwogCiAvKiBnZW5lcmF0ZXMgbG9hZHMgb2YgZGVidWcgaW5mbyAqLwpAQCAtMTc1LDcgKzE3Niw3IEBACiAvKiBjb21lZGkgY29uc3RhbnRzICovCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNvbWVkaV9scmFuZ2UgcmFuZ2VfdXNiZHV4X2FpX3JhbmdlID0geyAxLCB7CiAJCQkJCQkJCUJJUF9SQU5HRQotCQkJCQkJCQkoMi42NSkKKwkJCQkJCQkJKDIuNjUvMi4wKQogCQkJCQkJCQl9CiB9OwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jIGIvZHJpdmVycy9zdGFnaW5nL3J0bDg3MTIvdXNiX2ludGYuYwppbmRleCBmYjJlODljLi41Mzg1ZGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvcnRsODcxMi91c2JfaW50Zi5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydGw4NzEyL3VzYl9pbnRmLmMKQEAgLTg5LDYgKzg5LDcgQEAKIAl7VVNCX0RFVklDRSgweDBERjYsIDB4MDA0NSl9LAogCXtVU0JfREVWSUNFKDB4MERGNiwgMHgwMDU5KX0sIC8qIDExbiBtb2RlIGRpc2FibGUgKi8KIAl7VVNCX0RFVklDRSgweDBERjYsIDB4MDA0Qil9LAorCXtVU0JfREVWSUNFKDB4MERGNiwgMHgwMDVEKX0sCiAJe1VTQl9ERVZJQ0UoMHgwREY2LCAweDAwNjMpfSwKIAkvKiBTd2VleCAqLwogCXtVU0JfREVWSUNFKDB4MTc3RiwgMHgwMTU0KX0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3N0YWdpbmcvcnRzX3BzdG9yL3J0c3guYyBiL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3IvcnRzeC5jCmluZGV4IDQ4MGIwZWQuLjExNTYzNWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3IvcnRzeC5jCisrKyBiL2RyaXZlcnMvc3RhZ2luZy9ydHNfcHN0b3IvcnRzeC5jCkBAIC0xMDIxLDYgKzEwMjEsNyBAQAogCXRoID0ga3RocmVhZF9jcmVhdGUocnRzeF9zY2FuX3RocmVhZCwgZGV2LCAicnRzeC1zY2FuIik7CiAJaWYgKElTX0VSUih0aCkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gc3RhcnQgdGhlIGRldmljZS1zY2FubmluZyB0aHJlYWRcbiIpOworCQljb21wbGV0ZSgmZGV2LT5zY2FubmluZ19kb25lKTsKIAkJcXVpZXNjZV9hbmRfcmVtb3ZlX2hvc3QoZGV2KTsKIAkJZXJyID0gUFRSX0VSUih0aCk7CiAJCWdvdG8gZXJyb3V0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL2NvcmUvZHNwLWNsb2NrLmMgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9kc3AtY2xvY2suYwppbmRleCAzZDEyNzljLi43ZWI1NjE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9kc3AtY2xvY2suYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2UvY29yZS9kc3AtY2xvY2suYwpAQCAtNTQsNiArNTQsNyBAQAogCiAvKiBCcmlkZ2UgR1BUIGlkICgxIC0gNCksIERNIFRpbWVyIGlkICg1IC0gOCkgKi8KICNkZWZpbmUgRE1UX0lEKGlkKSAoKGlkKSArIDQpCisjZGVmaW5lIERNX1RJTUVSX0NMT0NLUwkJNAogCiAvKiBCcmlkZ2UgTUNCU1AgaWQgKDYgLSAxMCksIE9NQVAgTWNic3AgaWQgKDAgLSA0KSAqLwogI2RlZmluZSBNQ0JTUF9JRChpZCkgKChpZCkgLSA2KQpAQCAtMTE0LDggKzExNSwxMyBAQAogICovCiB2b2lkIGRzcF9jbGtfZXhpdCh2b2lkKQogeworCWludCBpOworCiAJZHNwX2Nsb2NrX2Rpc2FibGVfYWxsKGRzcF9jbG9ja3MpOwogCisJZm9yIChpID0gMDsgaSA8IERNX1RJTUVSX0NMT0NLUzsgaSsrKQorCQlvbWFwX2RtX3RpbWVyX2ZyZWUodGltZXJbaV0pOworCiAJY2xrX3B1dChpdmEyX2Nsayk7CiAJY2xrX3B1dChzc2kuc3N0X2Zjayk7CiAJY2xrX3B1dChzc2kuc3NyX2Zjayk7CkBAIC0xMzAsOSArMTM2LDEzIEBACiB2b2lkIGRzcF9jbGtfaW5pdCh2b2lkKQogewogCXN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGRzcGJyaWRnZV9kZXZpY2U7CisJaW50IGksIGlkOwogCiAJZHNwYnJpZGdlX2RldmljZS5kZXYuYnVzID0gJnBsYXRmb3JtX2J1c190eXBlOwogCisJZm9yIChpID0gMCwgaWQgPSA1OyBpIDwgRE1fVElNRVJfQ0xPQ0tTOyBpKyssIGlkKyspCisJCXRpbWVyW2ldID0gb21hcF9kbV90aW1lcl9yZXF1ZXN0X3NwZWNpZmljKGlkKTsKKwogCWl2YTJfY2xrID0gY2xrX2dldCgmZHNwYnJpZGdlX2RldmljZS5kZXYsICJpdmEyX2NrIik7CiAJaWYgKElTX0VSUihpdmEyX2NsaykpCiAJCWRldl9lcnIoYnJpZGdlLCAiZmFpbGVkIHRvIGdldCBpdmEyIGNsb2NrICVwXG4iLCBpdmEyX2Nsayk7CkBAIC0yMDQsOCArMjE0LDcgQEAKIAkJY2xrX2VuYWJsZShpdmEyX2Nsayk7CiAJCWJyZWFrOwogCWNhc2UgR1BUX0NMSzoKLQkJdGltZXJbY2xrX2lkIC0gMV0gPQotCQkJCW9tYXBfZG1fdGltZXJfcmVxdWVzdF9zcGVjaWZpYyhETVRfSUQoY2xrX2lkKSk7CisJCXN0YXR1cyA9IG9tYXBfZG1fdGltZXJfc3RhcnQodGltZXJbY2xrX2lkIC0gMV0pOwogCQlicmVhazsKICNpZmRlZiBDT05GSUdfT01BUF9NQ0JTUAogCWNhc2UgTUNCU1BfQ0xLOgpAQCAtMjgxLDcgKzI5MCw3IEBACiAJCWNsa19kaXNhYmxlKGl2YTJfY2xrKTsKIAkJYnJlYWs7CiAJY2FzZSBHUFRfQ0xLOgotCQlvbWFwX2RtX3RpbWVyX2ZyZWUodGltZXJbY2xrX2lkIC0gMV0pOworCQlzdGF0dXMgPSBvbWFwX2RtX3RpbWVyX3N0b3AodGltZXJbY2xrX2lkIC0gMV0pOwogCQlicmVhazsKICNpZmRlZiBDT05GSUdfT01BUF9NQ0JTUAogCWNhc2UgTUNCU1BfQ0xLOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvZHJ2X2ludGVyZmFjZS5jIGIvZHJpdmVycy9zdGFnaW5nL3RpZHNwYnJpZGdlL3JtZ3IvZHJ2X2ludGVyZmFjZS5jCmluZGV4IGM0M2M3ZTMuLjc2Y2ZjNmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvc3RhZ2luZy90aWRzcGJyaWRnZS9ybWdyL2Rydl9pbnRlcmZhY2UuYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdGlkc3BicmlkZ2Uvcm1nci9kcnZfaW50ZXJmYWNlLmMKQEAgLTI0LDExICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wbS5oPgotCi0jaWZkZWYgTU9EVUxFCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfcnguYyBiL2RyaXZlcnMvc3RhZ2luZy91c2JpcC92aGNpX3J4LmMKaW5kZXggMDljNDRhYi4uMzg3MmI4YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9zdGFnaW5nL3VzYmlwL3ZoY2lfcnguYworKysgYi9kcml2ZXJzL3N0YWdpbmcvdXNiaXAvdmhjaV9yeC5jCkBAIC02OCw2ICs2OCw3IEBACiB7CiAJc3RydWN0IHVzYmlwX2RldmljZSAqdWQgPSAmdmRldi0+dWQ7CiAJc3RydWN0IHVyYiAqdXJiOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2soJnZkZXYtPnByaXZfbG9jayk7CiAJdXJiID0gcGlja3VwX3VyYl9hbmRfZnJlZV9wcml2KHZkZXYsIHBkdS0+YmFzZS5zZXFudW0pOwpAQCAtMTAxLDkgKzEwMiw5IEBACiAKIAl1c2JpcF9kYmdfdmhjaV9yeCgibm93IGdpdmViYWNrIHVyYiAlcFxuIiwgdXJiKTsKIAotCXNwaW5fbG9jaygmdGhlX2NvbnRyb2xsZXItPmxvY2spOworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aGVfY29udHJvbGxlci0+bG9jaywgZmxhZ3MpOwogCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSwgdXJiKTsKLQlzcGluX3VubG9jaygmdGhlX2NvbnRyb2xsZXItPmxvY2spOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CiAKIAl1c2JfaGNkX2dpdmViYWNrX3VyYih2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlciksIHVyYiwgdXJiLT5zdGF0dXMpOwogCkBAIC0xNDEsNiArMTQyLDcgQEAKIHsKIAlzdHJ1Y3QgdmhjaV91bmxpbmsgKnVubGluazsKIAlzdHJ1Y3QgdXJiICp1cmI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCXVzYmlwX2R1bXBfaGVhZGVyKHBkdSk7CiAKQEAgLTE3MCw5ICsxNzIsOSBAQAogCQl1cmItPnN0YXR1cyA9IHBkdS0+dS5yZXRfdW5saW5rLnN0YXR1czsKIAkJcHJfaW5mbygidXJiLT5zdGF0dXMgJWRcbiIsIHVyYi0+c3RhdHVzKTsKIAotCQlzcGluX2xvY2soJnRoZV9jb250cm9sbGVyLT5sb2NrKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnRoZV9jb250cm9sbGVyLT5sb2NrLCBmbGFncyk7CiAJCXVzYl9oY2RfdW5saW5rX3VyYl9mcm9tX2VwKHZoY2lfdG9faGNkKHRoZV9jb250cm9sbGVyKSwgdXJiKTsKLQkJc3Bpbl91bmxvY2soJnRoZV9jb250cm9sbGVyLT5sb2NrKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGhlX2NvbnRyb2xsZXItPmxvY2ssIGZsYWdzKTsKIAogCQl1c2JfaGNkX2dpdmViYWNrX3VyYih2aGNpX3RvX2hjZCh0aGVfY29udHJvbGxlciksIHVyYiwKIAkJCQkgICAgIHVyYi0+c3RhdHVzKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldC5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0LmMKaW5kZXggMGZkOTZjMS4uODU5OTU0NSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0LmMKKysrIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0LmMKQEAgLTYxNCwxMyArNjE0LDEyIEBACiAJaGRyCT0gKHN0cnVjdCBpc2NzaV9yZWplY3QgKikgY21kLT5wZHU7CiAJaGRyLT5yZWFzb24gPSByZWFzb247CiAKLQljbWQtPmJ1Zl9wdHIgPSBremFsbG9jKElTQ1NJX0hEUl9MRU4sIEdGUF9LRVJORUwpOworCWNtZC0+YnVmX3B0ciA9IGttZW1kdXAoYnVmLCBJU0NTSV9IRFJfTEVOLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNtZC0+YnVmX3B0cikgewogCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIGNtZC0+YnVmX3B0clxuIik7CiAJCWlzY3NpdF9yZWxlYXNlX2NtZChjbWQpOwogCQlyZXR1cm4gLTE7CiAJfQotCW1lbWNweShjbWQtPmJ1Zl9wdHIsIGJ1ZiwgSVNDU0lfSERSX0xFTik7CiAKIAlzcGluX2xvY2tfYmgoJmNvbm4tPmNtZF9sb2NrKTsKIAlsaXN0X2FkZF90YWlsKCZjbWQtPmlfbGlzdCwgJmNvbm4tPmNvbm5fY21kX2xpc3QpOwpAQCAtNjYxLDEzICs2NjAsMTIgQEAKIAloZHIJPSAoc3RydWN0IGlzY3NpX3JlamVjdCAqKSBjbWQtPnBkdTsKIAloZHItPnJlYXNvbiA9IHJlYXNvbjsKIAotCWNtZC0+YnVmX3B0ciA9IGt6YWxsb2MoSVNDU0lfSERSX0xFTiwgR0ZQX0tFUk5FTCk7CisJY21kLT5idWZfcHRyID0ga21lbWR1cChidWYsIElTQ1NJX0hEUl9MRU4sIEdGUF9LRVJORUwpOwogCWlmICghY21kLT5idWZfcHRyKSB7CiAJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgY21kLT5idWZfcHRyXG4iKTsKIAkJaXNjc2l0X3JlbGVhc2VfY21kKGNtZCk7CiAJCXJldHVybiAtMTsKIAl9Ci0JbWVtY3B5KGNtZC0+YnVmX3B0ciwgYnVmLCBJU0NTSV9IRFJfTEVOKTsKIAogCWlmIChhZGRfdG9fY29ubikgewogCQlzcGluX2xvY2tfYmgoJmNvbm4tPmNtZF9sb2NrKTsKQEAgLTEwMTcsMTEgKzEwMTUsNiBAQAogCQkJCSIgbm9uLWV4aXN0ZW50IG9yIG5vbi1leHBvcnRlZCBpU0NTSSBMVU46IgogCQkJCSIgMHglMDE2THhcbiIsIGdldF91bmFsaWduZWRfbGU2NCgmaGRyLT5sdW4pKTsKIAkJfQotCQlpZiAocmV0ID09IFBZWF9UUkFOU1BPUlRfT1VUX09GX01FTU9SWV9SRVNPVVJDRVMpCi0JCQlyZXR1cm4gaXNjc2l0X2FkZF9yZWplY3RfZnJvbV9jbWQoCi0JCQkJCUlTQ1NJX1JFQVNPTl9CT09LTUFSS19OT19SRVNPVVJDRVMsCi0JCQkJCTEsIDEsIGJ1ZiwgY21kKTsKLQogCQlzZW5kX2NoZWNrX2NvbmRpdGlvbiA9IDE7CiAJCWdvdG8gYXR0YWNoX2NtZDsKIAl9CkBAIC0xMDQ0LDYgKzEwMzcsOCBAQAogCQkgKi8KIAkJc2VuZF9jaGVja19jb25kaXRpb24gPSAxOwogCX0gZWxzZSB7CisJCWNtZC0+ZGF0YV9sZW5ndGggPSBjbWQtPnNlX2NtZC5kYXRhX2xlbmd0aDsKKwogCQlpZiAoaXNjc2l0X2RlY2lkZV9saXN0X3RvX2J1aWxkKGNtZCwgcGF5bG9hZF9sZW5ndGgpIDwgMCkKIAkJCXJldHVybiBpc2NzaXRfYWRkX3JlamVjdF9mcm9tX2NtZCgKIAkJCQlJU0NTSV9SRUFTT05fQk9PS01BUktfTk9fUkVTT1VSQ0VTLApAQCAtMTEyMyw3ICsxMTE4LDcgQEAKIAkgKiB0aGUgYmFja2VuZCBtZW1vcnkgYWxsb2NhdGlvbi4KIAkgKi8KIAlyZXQgPSB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKCZjbWQtPnNlX2NtZCk7Ci0JaWYgKChyZXQgPCAwKSB8fCAoY21kLT5zZV9jbWQuc2VfY21kX2ZsYWdzICYgU0NGX1NFX0NNRF9GQUlMRUQpKSB7CisJaWYgKHJldCA8IDApIHsKIAkJaW1tZWRfcmV0ID0gSU1NRURJQVRFX0RBVEFfTk9STUFMX09QRVJBVElPTjsKIAkJZHVtcF9pbW1lZGlhdGVfZGF0YSA9IDE7CiAJCWdvdG8gYWZ0ZXJfaW1tZWRpYXRlX2RhdGE7CkBAIC0xMzQxLDcgKzEzMzYsNyBAQAogCiAJCXNwaW5fbG9ja19pcnFzYXZlKCZzZV9jbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCQlpZiAoIShzZV9jbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TVVBQT1JURURfU0FNX09QQ09ERSkgfHwKLQkJICAgICAoc2VfY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0VfQ01EX0ZBSUxFRCkpCisJCSAgICAgKHNlX2NtZC0+c2VfY21kX2ZsYWdzICYgU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTikpCiAJCQlkdW1wX3Vuc29saWNpdGVkX2RhdGEgPSAxOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9jbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCkBAIC0yNTEzLDEwICsyNTA4LDEwIEBACiAJaWYgKGhkci0+ZmxhZ3MgJiBJU0NTSV9GTEFHX0RBVEFfU1RBVFVTKSB7CiAJCWlmIChjbWQtPnNlX2NtZC5zZV9jbWRfZmxhZ3MgJiBTQ0ZfT1ZFUkZMT1dfQklUKSB7CiAJCQloZHItPmZsYWdzIHw9IElTQ1NJX0ZMQUdfREFUQV9PVkVSRkxPVzsKLQkJCWhkci0+cmVzaWR1YWxfY291bnQgPSBjcHVfdG9fYmUzMihjbWQtPnJlc2lkdWFsX2NvdW50KTsKKwkJCWhkci0+cmVzaWR1YWxfY291bnQgPSBjcHVfdG9fYmUzMihjbWQtPnNlX2NtZC5yZXNpZHVhbF9jb3VudCk7CiAJCX0gZWxzZSBpZiAoY21kLT5zZV9jbWQuc2VfY21kX2ZsYWdzICYgU0NGX1VOREVSRkxPV19CSVQpIHsKIAkJCWhkci0+ZmxhZ3MgfD0gSVNDU0lfRkxBR19EQVRBX1VOREVSRkxPVzsKLQkJCWhkci0+cmVzaWR1YWxfY291bnQgPSBjcHVfdG9fYmUzMihjbWQtPnJlc2lkdWFsX2NvdW50KTsKKwkJCWhkci0+cmVzaWR1YWxfY291bnQgPSBjcHVfdG9fYmUzMihjbWQtPnNlX2NtZC5yZXNpZHVhbF9jb3VudCk7CiAJCX0KIAl9CiAJaHRvbjI0KGhkci0+ZGxlbmd0aCwgZGF0YWluLmxlbmd0aCk7CkBAIC0zMDE4LDEwICszMDEzLDEwIEBACiAJaGRyLT5mbGFncwkJfD0gSVNDU0lfRkxBR19DTURfRklOQUw7CiAJaWYgKGNtZC0+c2VfY21kLnNlX2NtZF9mbGFncyAmIFNDRl9PVkVSRkxPV19CSVQpIHsKIAkJaGRyLT5mbGFncyB8PSBJU0NTSV9GTEFHX0NNRF9PVkVSRkxPVzsKLQkJaGRyLT5yZXNpZHVhbF9jb3VudCA9IGNwdV90b19iZTMyKGNtZC0+cmVzaWR1YWxfY291bnQpOworCQloZHItPnJlc2lkdWFsX2NvdW50ID0gY3B1X3RvX2JlMzIoY21kLT5zZV9jbWQucmVzaWR1YWxfY291bnQpOwogCX0gZWxzZSBpZiAoY21kLT5zZV9jbWQuc2VfY21kX2ZsYWdzICYgU0NGX1VOREVSRkxPV19CSVQpIHsKIAkJaGRyLT5mbGFncyB8PSBJU0NTSV9GTEFHX0NNRF9VTkRFUkZMT1c7Ci0JCWhkci0+cmVzaWR1YWxfY291bnQgPSBjcHVfdG9fYmUzMihjbWQtPnJlc2lkdWFsX2NvdW50KTsKKwkJaGRyLT5yZXNpZHVhbF9jb3VudCA9IGNwdV90b19iZTMyKGNtZC0+c2VfY21kLnJlc2lkdWFsX2NvdW50KTsKIAl9CiAJaGRyLT5yZXNwb25zZQkJPSBjbWQtPmlzY3NpX3Jlc3BvbnNlOwogCWhkci0+Y21kX3N0YXR1cwkJPSBjbWQtPnNlX2NtZC5zY3NpX3N0YXR1czsKQEAgLTMxMzMsNiArMzEyOCw3IEBACiAJaGRyCQkJPSAoc3RydWN0IGlzY3NpX3RtX3JzcCAqKSBjbWQtPnBkdTsKIAltZW1zZXQoaGRyLCAwLCBJU0NTSV9IRFJfTEVOKTsKIAloZHItPm9wY29kZQkJPSBJU0NTSV9PUF9TQ1NJX1RNRlVOQ19SU1A7CisJaGRyLT5mbGFncwkJPSBJU0NTSV9GTEFHX0NNRF9GSU5BTDsKIAloZHItPnJlc3BvbnNlCQk9IGlzY3NpdF9jb252ZXJ0X3RjbV90bXJfcnNwKHNlX3Rtcik7CiAJaGRyLT5pdHQJCT0gY3B1X3RvX2JlMzIoY21kLT5pbml0X3Rhc2tfdGFnKTsKIAljbWQtPnN0YXRfc24JCT0gY29ubi0+c3RhdF9zbisrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2F1dGguYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9hdXRoLmMKaW5kZXggYmViMzk0Ni4uMWNkNmNlMyAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2F1dGguYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfYXV0aC5jCkBAIC0zMCw5ICszMCwxMSBAQAogCiBzdGF0aWMgaW50IGNoYXBfc3RyaW5nX3RvX2hleCh1bnNpZ25lZCBjaGFyICpkc3QsIHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IGxlbikKIHsKLQlpbnQgaiA9IERJVl9ST1VORF9VUChsZW4sIDIpOworCWludCBqID0gRElWX1JPVU5EX1VQKGxlbiwgMiksIHJjOwogCi0JaGV4MmJpbihkc3QsIHNyYywgaik7CisJcmMgPSBoZXgyYmluKGRzdCwgc3JjLCBqKTsKKwlpZiAocmMgPCAwKQorCQlwcl9kZWJ1ZygiQ0hBUCBzdHJpbmcgY29udGFpbnMgbm9uIGhleCBkaWdpdCBzeW1ib2xzXG4iKTsKIAogCWRzdFtqXSA9ICdcMCc7CiAJcmV0dXJuIGo7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29yZS5oIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2NvcmUuaAppbmRleCAzNzIzZDkwLi5mMWEwMmRhIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfY29yZS5oCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9jb3JlLmgKQEAgLTM5OCw3ICszOTgsNiBAQAogCXUzMgkJCXBkdV9zZW5kX29yZGVyOwogCS8qIEN1cnJlbnQgc3RydWN0IGlzY3NpX3BkdSBpbiBzdHJ1Y3QgaXNjc2lfY21kLT5wZHVfbGlzdCAqLwogCXUzMgkJCXBkdV9zdGFydDsKLQl1MzIJCQlyZXNpZHVhbF9jb3VudDsKIAkvKiBOZXh0IHN0cnVjdCBpc2NzaV9zZXEgdG8gc2VuZCBpbiBzdHJ1Y3QgaXNjc2lfY21kLT5zZXFfbGlzdCAqLwogCXUzMgkJCXNlcV9zZW5kX29yZGVyOwogCS8qIE51bWJlciBvZiBzdHJ1Y3QgaXNjc2lfc2VxIGluIHN0cnVjdCBpc2NzaV9jbWQtPnNlcV9saXN0ICovCkBAIC01MzUsNyArNTM0LDYgQEAKIAlhdG9taWNfdAkJY29ubmVjdGlvbl9leGl0OwogCWF0b21pY190CQljb25uZWN0aW9uX3JlY292ZXJ5OwogCWF0b21pY190CQljb25uZWN0aW9uX3JlaW5zdGF0ZW1lbnQ7Ci0JYXRvbWljX3QJCWNvbm5lY3Rpb25fd2FpdDsKIAlhdG9taWNfdAkJY29ubmVjdGlvbl93YWl0X3JjZnI7CiAJYXRvbWljX3QJCXNsZWVwX29uX2Nvbm5fd2FpdF9jb21wOwogCWF0b21pY190CQl0cmFuc3BvcnRfZmFpbGVkOwpAQCAtNjQzLDcgKzY0MSw2IEBACiAJYXRvbWljX3QJCXNlc3Npb25fcmVpbnN0YXRlbWVudDsKIAlhdG9taWNfdAkJc2Vzc2lvbl9zdG9wX2FjdGl2ZTsKIAlhdG9taWNfdAkJc2xlZXBfb25fc2Vzc193YWl0X2NvbXA7Ci0JYXRvbWljX3QJCXRyYW5zcG9ydF93YWl0X2NtZHM7CiAJLyogY29ubmVjdGlvbiBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZAlzZXNzX2Nvbm5fbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWNyX2FjdGl2ZV9saXN0OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2VybDEuYyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9lcmwxLmMKaW5kZXggYzRjNjhkYS4uMTAxYjFiZSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2VybDEuYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfZXJsMS5jCkBAIC05MzgsOCArOTM4LDcgQEAKIAkJICogaGFuZGxlIHRoZSBTQ0ZfU0NTSV9SRVNFUlZBVElPTl9DT05GTElDVCBjYXNlIGhlcmUgYXMgd2VsbC4KIAkJICovCiAJCWlmIChzZV9jbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TQ1NJX0NEQl9FWENFUFRJT04pIHsKLQkJCWlmIChzZV9jbWQtPnNlX2NtZF9mbGFncyAmCi0JCQkJCVNDRl9TQ1NJX1JFU0VSVkFUSU9OX0NPTkZMSUNUKSB7CisJCQlpZiAoc2VfY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9PSBUQ01fUkVTRVJWQVRJT05fQ09ORkxJQ1QpIHsKIAkJCQljbWQtPmlfc3RhdGUgPSBJU1RBVEVfU0VORF9TVEFUVVM7CiAJCQkJc3Bpbl91bmxvY2tfYmgoJmNtZC0+aXN0YXRlX2xvY2spOwogCQkJCWlzY3NpdF9hZGRfY21kX3RvX3Jlc3BvbnNlX3F1ZXVlKGNtZCwgY21kLT5jb25uLApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X2xvZ2luLmMgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbG9naW4uYwppbmRleCBkYWFkMzYyLi5kNzM0YmRlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbG9naW4uYworKysgYi9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbG9naW4uYwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJCWlzY3NpdF90eF9sb2dpbl9yc3AoY29ubiwgSVNDU0lfU1RBVFVTX0NMU19UQVJHRVRfRVJSLAogCQkJCUlTQ1NJX0xPR0lOX1NUQVRVU19OT19SRVNPVVJDRVMpOwogCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNlc3Npb25cbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCWlzY3NpX2xvZ2luX3NldF9jb25uX3ZhbHVlcyhzZXNzLCBjb25uLCBwZHUtPmNpZCk7CkBAIC0yNTAsNyArMjUwLDggQEAKIAkJcHJfZXJyKCJpZHJfcHJlX2dldCgpIGZvciBzZXNzX2lkciBmYWlsZWRcbiIpOwogCQlpc2NzaXRfdHhfbG9naW5fcnNwKGNvbm4sIElTQ1NJX1NUQVRVU19DTFNfVEFSR0VUX0VSUiwKIAkJCQlJU0NTSV9MT0dJTl9TVEFUVVNfTk9fUkVTT1VSQ0VTKTsKLQkJcmV0dXJuIC0xOworCQlrZnJlZShzZXNzKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCXNwaW5fbG9jaygmc2Vzc19pZHJfbG9jayk7CiAJaWRyX2dldF9uZXcoJnNlc3NfaWRyLCBOVUxMLCAmc2Vzcy0+c2Vzc2lvbl9pbmRleCk7CkBAIC0yNzAsMTQgKzI3MSwxNiBAQAogCQkJCUlTQ1NJX0xPR0lOX1NUQVRVU19OT19SRVNPVVJDRVMpOwogCQlwcl9lcnIoIlVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIgogCQkJCSIgc3RydWN0IGlzY3NpX3Nlc3Nfb3BzLlxuIik7Ci0JCXJldHVybiAtMTsKKwkJa2ZyZWUoc2Vzcyk7CisJCXJldHVybiAtRU5PTUVNOwogCX0KIAogCXNlc3MtPnNlX3Nlc3MgPSB0cmFuc3BvcnRfaW5pdF9zZXNzaW9uKCk7Ci0JaWYgKCFzZXNzLT5zZV9zZXNzKSB7CisJaWYgKElTX0VSUihzZXNzLT5zZV9zZXNzKSkgewogCQlpc2NzaXRfdHhfbG9naW5fcnNwKGNvbm4sIElTQ1NJX1NUQVRVU19DTFNfVEFSR0VUX0VSUiwKIAkJCQlJU0NTSV9MT0dJTl9TVEFUVVNfTk9fUkVTT1VSQ0VTKTsKLQkJcmV0dXJuIC0xOworCQlrZnJlZShzZXNzKTsKKwkJcmV0dXJuIC1FTk9NRU07CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbmVnby5jIGIvZHJpdmVycy90YXJnZXQvaXNjc2kvaXNjc2lfdGFyZ2V0X25lZ28uYwppbmRleCA0MjZjZDRiLi45ODkzNmNiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC9pc2NzaS9pc2NzaV90YXJnZXRfbmVnby5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L2lzY3NpL2lzY3NpX3RhcmdldF9uZWdvLmMKQEAgLTk4MSwxNCArOTgxLDEzIEBACiAJCXJldHVybiBOVUxMOwogCX0KIAotCWxvZ2luLT5yZXEgPSBremFsbG9jKElTQ1NJX0hEUl9MRU4sIEdGUF9LRVJORUwpOworCWxvZ2luLT5yZXEgPSBrbWVtZHVwKGxvZ2luX3BkdSwgSVNDU0lfSERSX0xFTiwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFsb2dpbi0+cmVxKSB7CiAJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgTG9naW4gUmVxdWVzdC5cbiIpOwogCQlpc2NzaXRfdHhfbG9naW5fcnNwKGNvbm4sIElTQ1NJX1NUQVRVU19DTFNfVEFSR0VUX0VSUiwKIAkJCQlJU0NTSV9MT0dJTl9TVEFUVVNfTk9fUkVTT1VSQ0VTKTsKIAkJZ290byBvdXQ7CiAJfQotCW1lbWNweShsb2dpbi0+cmVxLCBsb2dpbl9wZHUsIElTQ1NJX0hEUl9MRU4pOwogCiAJbG9naW4tPnJlcV9idWYgPSBremFsbG9jKE1BWF9LRVlfVkFMVUVfUEFJUlMsIEdGUF9LRVJORUwpOwogCWlmICghbG9naW4tPnJlcV9idWYpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMgYi9kcml2ZXJzL3RhcmdldC9sb29wYmFjay90Y21fbG9vcC5jCmluZGV4IDNkZjFjOWIuLjgxZDU4MzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L2xvb3BiYWNrL3RjbV9sb29wLmMKKysrIGIvZHJpdmVycy90YXJnZXQvbG9vcGJhY2svdGNtX2xvb3AuYwpAQCAtMTEzLDExICsxMTMsOSBAQAogCQkJc2NzaV9idWZmbGVuKHNjKSwgc2MtPnNjX2RhdGFfZGlyZWN0aW9uLCBzYW1fdGFza19hdHRyLAogCQkJJnRsX2NtZC0+dGxfc2Vuc2VfYnVmWzBdKTsKIAotCS8qCi0JICogU2lnbmFsIEJJREkgdXNhZ2Ugd2l0aCBUX1RBU0soY21kKS0+dF90YXNrc19iaWRpCi0JICovCiAJaWYgKHNjc2lfYmlkaV9jbW5kKHNjKSkKLQkJc2VfY21kLT50X3Rhc2tzX2JpZGkgPSAxOworCQlzZV9jbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfQklESTsKKwogCS8qCiAJICogTG9jYXRlIHRoZSBzdHJ1Y3Qgc2VfbHVuIHBvaW50ZXIgYW5kIGF0dGFjaCBpdCB0byBzdHJ1Y3Qgc2VfY21kCiAJICovCkBAIC0xNDgsMjcgKzE0NiwxMyBAQAogCSAqIEFsbG9jYXRlIHRoZSBuZWNlc3NhcnkgdGFza3MgdG8gY29tcGxldGUgdGhlIHJlY2VpdmVkIENEQitkYXRhCiAJICovCiAJcmV0ID0gdHJhbnNwb3J0X2dlbmVyaWNfYWxsb2NhdGVfdGFza3Moc2VfY21kLCBzYy0+Y21uZCk7Ci0JaWYgKHJldCA9PSAtRU5PTUVNKSB7Ci0JCS8qIE91dCBvZiBSZXNvdXJjZXMgKi8KLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOwotCX0gZWxzZSBpZiAocmV0ID09IC1FSU5WQUwpIHsKLQkJLyoKLQkJICogSGFuZGxlIGNhc2UgZm9yIFNBTV9TVEFUX1JFU0VSVkFUSU9OX0NPTkZMSUNUCi0JCSAqLwotCQlpZiAoc2VfY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9SRVNFUlZBVElPTl9DT05GTElDVCkKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOwotCQkvKgotCQkgKiBPdGhlcndpc2UsIHJldHVybiBTQU1fU1RBVF9DSEVDS19DT05ESVRJT04gYW5kIHJldHVybgotCQkgKiBzZW5zZSBkYXRhLgotCQkgKi8KLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVVNFX1NFTlNFX1JFQVNPTjsKLQl9Ci0KKwlpZiAocmV0ICE9IDApCisJCXJldHVybiByZXQ7CiAJLyoKIAkgKiBGb3IgQklESSBjb21tYW5kcywgcGFzcyBpbiB0aGUgZXh0cmEgUkVBRCBidWZmZXIKIAkgKiB0byB0cmFuc3BvcnRfZ2VuZXJpY19tYXBfbWVtX3RvX2NtZCgpIGJlbG93Li4KIAkgKi8KLQlpZiAoc2VfY21kLT50X3Rhc2tzX2JpZGkpIHsKKwlpZiAoc2VfY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfQklESSkgewogCQlzdHJ1Y3Qgc2NzaV9kYXRhX2J1ZmZlciAqc2RiID0gc2NzaV9pbihzYyk7CiAKIAkJc2dsX2JpZGkgPSBzZGItPnRhYmxlLnNnbDsKQEAgLTE5NCwxMiArMTc4LDggQEAKIAl9CiAKIAkvKiBUZWxsIHRoZSBjb3JlIGFib3V0IG91ciBwcmVhbGxvY2F0ZWQgbWVtb3J5ICovCi0JcmV0ID0gdHJhbnNwb3J0X2dlbmVyaWNfbWFwX21lbV90b19jbWQoc2VfY21kLCBzY3NpX3NnbGlzdChzYyksCisJcmV0dXJuIHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kKHNlX2NtZCwgc2NzaV9zZ2xpc3Qoc2MpLAogCQkJc2NzaV9zZ19jb3VudChzYyksIHNnbF9iaWRpLCBzZ2xfYmlkaV9jb3VudCk7Ci0JaWYgKHJldCA8IDApCi0JCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKLQotCXJldHVybiAwOwogfQogCiAvKgpAQCAtMTM2MCwxNyArMTM0MCwxNiBAQAogewogCXN0cnVjdCB0Y21fbG9vcF9oYmEgKnRsX2hiYSA9IGNvbnRhaW5lcl9vZih3d24sCiAJCQkJc3RydWN0IHRjbV9sb29wX2hiYSwgdGxfaGJhX3d3bik7Ci0JaW50IGhvc3Rfbm8gPSB0bF9oYmEtPnNoLT5ob3N0X25vOworCisJcHJfZGVidWcoIlRDTV9Mb29wX0NvbmZpZ0ZTOiBEZWFsbG9jYXRpbmcgZW11bGF0ZWQgVGFyZ2V0IgorCQkiIFNBUyBBZGRyZXNzOiAlcyBhdCBMaW51eC9TQ1NJIEhvc3QgSUQ6ICVkXG4iLAorCQl0bF9oYmEtPnRsX3d3bl9hZGRyZXNzLCB0bF9oYmEtPnNoLT5ob3N0X25vKTsKIAkvKgogCSAqIENhbGwgZGV2aWNlX3VucmVnaXN0ZXIoKSBvbiB0aGUgb3JpZ2luYWwgdGxfaGJhLT5kZXYuCiAJICogdGNtX2xvb3BfZmFicmljX3Njc2kuYzp0Y21fbG9vcF9yZWxlYXNlX2FkYXB0ZXIoKSB3aWxsCiAJICogcmVsZWFzZSAqdGxfaGJhOwogCSAqLwogCWRldmljZV91bnJlZ2lzdGVyKCZ0bF9oYmEtPmRldik7Ci0KLQlwcl9kZWJ1ZygiVENNX0xvb3BfQ29uZmlnRlM6IERlYWxsb2NhdGVkIGVtdWxhdGVkIFRhcmdldCIKLQkJIiBTQVMgQWRkcmVzczogJXMgYXQgTGludXgvU0NTSSBIb3N0IElEOiAlZFxuIiwKLQkJY29uZmlnX2l0ZW1fbmFtZSgmd3duLT53d25fZ3JvdXAuY2dfaXRlbSksIGhvc3Rfbm8pOwogfQogCiAvKiBTdGFydCBpdGVtcyBmb3IgdGNtX2xvb3BfY2l0ICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9hbHVhLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9hbHVhLmMKaW5kZXggODhmMmFkNC4uMWRjYmVmNCAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfYWx1YS5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2FsdWEuYwpAQCAtMTkxLDkgKzE5MSwxMCBAQAogCWludCBhbHVhX2FjY2Vzc19zdGF0ZSwgcHJpbWFyeSA9IDAsIHJjOwogCXUxNiB0Z19wdF9pZCwgcnRwaTsKIAotCWlmICghbF9wb3J0KQotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7Ci0KKwlpZiAoIWxfcG9ydCkgeworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAlidWYgPSB0cmFuc3BvcnRfa21hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKIAogCS8qCkBAIC0yMDMsNyArMjA0LDggQEAKIAlsX3RnX3B0X2dwX21lbSA9IGxfcG9ydC0+c2VwX2FsdWFfdGdfcHRfZ3BfbWVtOwogCWlmICghbF90Z19wdF9ncF9tZW0pIHsKIAkJcHJfZXJyKCJVbmFibGUgdG8gYWNjZXNzIGxfcG9ydC0+c2VwX2FsdWFfdGdfcHRfZ3BfbWVtXG4iKTsKLQkJcmMgPSBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9VTlNVUFBPUlRFRF9TQ1NJX09QQ09ERTsKKwkJcmMgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAJc3Bpbl9sb2NrKCZsX3RnX3B0X2dwX21lbS0+dGdfcHRfZ3BfbWVtX2xvY2spOwpAQCAtMjExLDcgKzIxMyw4IEBACiAJaWYgKCFsX3RnX3B0X2dwKSB7CiAJCXNwaW5fdW5sb2NrKCZsX3RnX3B0X2dwX21lbS0+dGdfcHRfZ3BfbWVtX2xvY2spOwogCQlwcl9lcnIoIlVuYWJsZSB0byBhY2Nlc3MgKmxfdGdfcHRfZ3BfbWVtLT50Z19wdF9ncFxuIik7Ci0JCXJjID0gUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREU7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fVU5TVVBQT1JURURfU0NTSV9PUENPREU7CisJCXJjID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCXJjID0gKGxfdGdfcHRfZ3AtPnRnX3B0X2dwX2FsdWFfYWNjZXNzX3R5cGUgJiBUUEdTX0VYUExJQ1RfQUxVQSk7CkBAIC0yMjAsNyArMjIzLDggQEAKIAlpZiAoIXJjKSB7CiAJCXByX2RlYnVnKCJVbmFibGUgdG8gcHJvY2VzcyBTRVRfVEFSR0VUX1BPUlRfR1JPVVBTIgogCQkJCSIgd2hpbGUgVFBHU19FWFBMSUNUX0FMVUEgaXMgZGlzYWJsZWRcbiIpOwotCQlyYyA9IFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1VOU1VQUE9SVEVEX1NDU0lfT1BDT0RFOworCQlyYyA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMjQ1LDcgKzI0OSw4IEBACiAJCQkgKiBSRVFVRVNULCBhbmQgdGhlIGFkZGl0aW9uYWwgc2Vuc2UgY29kZSBzZXQgdG8gSU5WQUxJRAogCQkJICogRklFTEQgSU4gUEFSQU1FVEVSIExJU1QuCiAJCQkgKi8KLQkJCXJjID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJcmMgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KIAkJcmMgPSAtMTsKQEAgLTI5OCw3ICszMDMsOCBAQAogCQkJICogdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggQVNDUTogSU5WQUxJRF9QQVJBTUVURVJfTElTVAogCQkJICovCiAJCQlpZiAocmMgIT0gMCkgewotCQkJCXJjID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJCQlyYyA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCX0gZWxzZSB7CkBAIC0zMzUsNyArMzQxLDggQEAKIAkJCSAqIElOVkFMSURfUEFSQU1FVEVSX0xJU1QKIAkJCSAqLwogCQkJaWYgKHJjICE9IDApIHsKLQkJCQlyYyA9IFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCQkJcmMgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCQl9CkBAIC0xMTg0LDcgKzExOTEsNiBAQAogCSAqIHN0cnVjdCB0MTBfYWx1YV9sdV9ncC4KIAkgKi8KIAlzcGluX2xvY2soJmx1X2dwc19sb2NrKTsKLQlhdG9taWNfc2V0KCZsdV9ncC0+bHVfZ3Bfc2h1dGRvd24sIDEpOwogCWxpc3RfZGVsKCZsdV9ncC0+bHVfZ3Bfbm9kZSk7CiAJYWx1YV9sdV9ncHNfY291bnQtLTsKIAlzcGluX3VubG9jaygmbHVfZ3BzX2xvY2spOwpAQCAtMTQzOCw3ICsxNDQ0LDYgQEAKIAogCXRnX3B0X2dwX21lbS0+dGdfcHQgPSBwb3J0OwogCXBvcnQtPnNlcF9hbHVhX3RnX3B0X2dwX21lbSA9IHRnX3B0X2dwX21lbTsKLQlhdG9taWNfc2V0KCZwb3J0LT5zZXBfdGdfcHRfZ3BfYWN0aXZlLCAxKTsKIAogCXJldHVybiB0Z19wdF9ncF9tZW07CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jZGIuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NkYi5jCmluZGV4IDY4M2JhMDIuLjgzMTQ2OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NkYi5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NkYi5jCkBAIC00NzgsNyArNDc4LDcgQEAKIAlpZiAoY21kLT5kYXRhX2xlbmd0aCA8IDYwKQogCQlyZXR1cm4gMDsKIAotCWJ1ZlsyXSA9IDB4M2M7CisJYnVmWzNdID0gMHgzYzsKIAkvKiBTZXQgSEVBRFNVUCwgT1JEU1VQLCBTSU1QU1VQICovCiAJYnVmWzVdID0gMHgwNzsKIApAQCAtNzAzLDYgKzcwMyw3IEBACiAJaWYgKGNtZC0+ZGF0YV9sZW5ndGggPCA0KSB7CiAJCXByX2VycigiU0NTSSBJbnF1aXJ5IHBheWxvYWQgbGVuZ3RoOiAldSIKIAkJCSIgdG9vIHNtYWxsIGZvciBFVlBEPTFcbiIsIGNtZC0+ZGF0YV9sZW5ndGgpOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfQ0RCX0ZJRUxEOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTcxOSw2ICs3MjAsNyBAQAogCX0KIAogCXByX2VycigiVW5rbm93biBWUEQgQ29kZTogMHglMDJ4XG4iLCBjZGJbMl0pOworCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fVU5TVVBQT1JURURfU0NTSV9PUENPREU7CiAJcmV0ID0gLUVJTlZBTDsKIAogb3V0X3VubWFwOgpAQCAtOTY5LDcgKzk3MSw4IEBACiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJNT0RFIFNFTlNFOiB1bmltcGxlbWVudGVkIHBhZ2Uvc3VicGFnZTogMHglMDJ4LzB4JTAyeFxuIiwKIAkJICAgICAgIGNkYlsyXSAmIDB4M2YsIGNkYlszXSk7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fTU9ERV9QQUdFOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1VOS05PV05fTU9ERV9QQUdFOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJb2Zmc2V0ICs9IGxlbmd0aDsKIApAQCAtMTAyNyw3ICsxMDMwLDggQEAKIAlpZiAoY2RiWzFdICYgMHgwMSkgewogCQlwcl9lcnIoIlJFUVVFU1RfU0VOU0UgZGVzY3JpcHRpb24gZW11bGF0aW9uIG5vdCIKIAkJCSIgc3VwcG9ydGVkXG4iKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9DREJfRklFTEQ7CisJCXJldHVybiAtRU5PU1lTOwogCX0KIAogCWJ1ZiA9IHRyYW5zcG9ydF9rbWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwpAQCAtMTEwMCw3ICsxMTA0LDggQEAKIAlpZiAoIWRldi0+dHJhbnNwb3J0LT5kb19kaXNjYXJkKSB7CiAJCXByX2VycigiVU5NQVAgZW11bGF0aW9uIG5vdCBzdXBwb3J0ZWQgZm9yOiAlc1xuIiwKIAkJCQlkZXYtPnRyYW5zcG9ydC0+bmFtZSk7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1VOS05PV05fU0FNX09QQ09ERTsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9VTlNVUFBPUlRFRF9TQ1NJX09QQ09ERTsKKwkJcmV0dXJuIC1FTk9TWVM7CiAJfQogCiAJLyogRmlyc3QgVU5NQVAgYmxvY2sgZGVzY3JpcHRvciBzdGFydHMgYXQgOCBieXRlIG9mZnNldCAqLwpAQCAtMTE1Nyw3ICsxMTYyLDggQEAKIAlpZiAoIWRldi0+dHJhbnNwb3J0LT5kb19kaXNjYXJkKSB7CiAJCXByX2VycigiV1JJVEVfU0FNRSBlbXVsYXRpb24gbm90IHN1cHBvcnRlZCIKIAkJCQkiIGZvcjogJXNcbiIsIGRldi0+dHJhbnNwb3J0LT5uYW1lKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1VOU1VQUE9SVEVEX1NDU0lfT1BDT0RFOworCQlyZXR1cm4gLUVOT1NZUzsKIAl9CiAKIAlpZiAoY21kLT50X3Rhc2tfY2RiWzBdID09IFdSSVRFX1NBTUUpCkBAIC0xMTkzLDExICsxMTk5LDEzIEBACiBpbnQgdGFyZ2V0X2VtdWxhdGVfc3luY2hyb25pemVfY2FjaGUoc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7CiAJc3RydWN0IHNlX2RldmljZSAqZGV2ID0gdGFzay0+dGFza19zZV9jbWQtPnNlX2RldjsKKwlzdHJ1Y3Qgc2VfY21kICpjbWQgPSB0YXNrLT50YXNrX3NlX2NtZDsKIAogCWlmICghZGV2LT50cmFuc3BvcnQtPmRvX3N5bmNfY2FjaGUpIHsKIAkJcHJfZXJyKCJTWU5DSFJPTklaRV9DQUNIRSBlbXVsYXRpb24gbm90IHN1cHBvcnRlZCIKIAkJCSIgZm9yOiAlc1xuIiwgZGV2LT50cmFuc3BvcnQtPm5hbWUpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREU7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fVU5TVVBQT1JURURfU0NTSV9PUENPREU7CisJCXJldHVybiAtRU5PU1lTOwogCX0KIAogCWRldi0+dHJhbnNwb3J0LT5kb19zeW5jX2NhY2hlKHRhc2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY29uZmlnZnMuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2NvbmZpZ2ZzLmMKaW5kZXggZTBjMWU4YS4uOTNkNGY2YSAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfY29uZmlnZnMuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9jb25maWdmcy5jCkBAIC02Nyw5ICs2Nyw2IEBACiBzdGF0aWMgc3RydWN0IGNvbmZpZ19ncm91cCBhbHVhX2dyb3VwOwogc3RhdGljIHN0cnVjdCBjb25maWdfZ3JvdXAgYWx1YV9sdV9ncHNfZ3JvdXA7CiAKLXN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2VfZGV2aWNlX2xvY2spOwotc3RhdGljIExJU1RfSEVBRChzZV9kZXZfbGlzdCk7Ci0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IHNlX2hiYSAqCiBpdGVtX3RvX2hiYShzdHJ1Y3QgY29uZmlnX2l0ZW0gKml0ZW0pCiB7CkBAIC0yNzQxLDcgKzI3MzgsNiBAQAogCQkJCSIgc3RydWN0IHNlX3N1YnN5c3RlbV9kZXZcbiIpOwogCQlnb3RvIHVubG9jazsKIAl9Ci0JSU5JVF9MSVNUX0hFQUQoJnNlX2Rldi0+c2VfZGV2X25vZGUpOwogCUlOSVRfTElTVF9IRUFEKCZzZV9kZXYtPnQxMF93d24udDEwX3ZwZF9saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmc2VfZGV2LT50MTBfd3duLnQxMF92cGRfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnNlX2Rldi0+dDEwX3ByLnJlZ2lzdHJhdGlvbl9saXN0KTsKQEAgLTI3NzcsOSArMjc3Myw2IEBACiAJCQkiIGZyb20gYWxsb2NhdGVfdmlydGRldmljZSgpXG4iKTsKIAkJZ290byBvdXQ7CiAJfQotCXNwaW5fbG9jaygmc2VfZGV2aWNlX2xvY2spOwotCWxpc3RfYWRkX3RhaWwoJnNlX2Rldi0+c2VfZGV2X25vZGUsICZzZV9kZXZfbGlzdCk7Ci0Jc3Bpbl91bmxvY2soJnNlX2RldmljZV9sb2NrKTsKIAogCWNvbmZpZ19ncm91cF9pbml0X3R5cGVfbmFtZSgmc2VfZGV2LT5zZV9kZXZfZ3JvdXAsIG5hbWUsCiAJCQkmdGFyZ2V0X2NvcmVfZGV2X2NpdCk7CkBAIC0yODc0LDEwICsyODY3LDYgQEAKIAltdXRleF9sb2NrKCZoYmEtPmhiYV9hY2Nlc3NfbXV0ZXgpOwogCXQgPSBoYmEtPnRyYW5zcG9ydDsKIAotCXNwaW5fbG9jaygmc2VfZGV2aWNlX2xvY2spOwotCWxpc3RfZGVsKCZzZV9kZXYtPnNlX2Rldl9ub2RlKTsKLQlzcGluX3VubG9jaygmc2VfZGV2aWNlX2xvY2spOwotCiAJZGV2X3N0YXRfZ3JwID0gJnNlX2Rldi0+ZGV2X3N0YXRfZ3Jwcy5zdGF0X2dyb3VwOwogCWZvciAoaSA9IDA7IGRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHNbaV07IGkrKykgewogCQlkZl9pdGVtID0gJmRldl9zdGF0X2dycC0+ZGVmYXVsdF9ncm91cHNbaV0tPmNnX2l0ZW07CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9kZXZpY2UuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jCmluZGV4IGJhNWVkZWMuLjliODYzOTQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2RldmljZS5jCkBAIC0xMDQsNyArMTA0LDYgQEAKIAkJc2VfY21kLT5zZV9sdW4gPSBkZXZlLT5zZV9sdW47CiAJCXNlX2NtZC0+cHJfcmVzX2tleSA9IGRldmUtPnByX3Jlc19rZXk7CiAJCXNlX2NtZC0+b3JpZ19mZV9sdW4gPSB1bnBhY2tlZF9sdW47Ci0JCXNlX2NtZC0+c2Vfb3JpZ19vYmpfcHRyID0gc2VfY21kLT5zZV9sdW4tPmx1bl9zZV9kZXY7CiAJCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TRV9MVU5fQ01EOwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzZV9zZXNzLT5zZV9ub2RlX2FjbC0+ZGV2aWNlX2xpc3RfbG9jaywgZmxhZ3MpOwpAQCAtMTM3LDcgKzEzNiw2IEBACiAJCXNlX2x1biA9ICZzZV9zZXNzLT5zZV90cGctPnRwZ192aXJ0X2x1bjA7CiAJCXNlX2NtZC0+c2VfbHVuID0gJnNlX3Nlc3MtPnNlX3RwZy0+dHBnX3ZpcnRfbHVuMDsKIAkJc2VfY21kLT5vcmlnX2ZlX2x1biA9IDA7Ci0JCXNlX2NtZC0+c2Vfb3JpZ19vYmpfcHRyID0gc2VfY21kLT5zZV9sdW4tPmx1bl9zZV9kZXY7CiAJCXNlX2NtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TRV9MVU5fQ01EOwogCX0KIAkvKgpAQCAtMjAwLDcgKzE5OCw2IEBACiAJCXNlX2x1biA9IGRldmUtPnNlX2x1bjsKIAkJc2VfY21kLT5wcl9yZXNfa2V5ID0gZGV2ZS0+cHJfcmVzX2tleTsKIAkJc2VfY21kLT5vcmlnX2ZlX2x1biA9IHVucGFja2VkX2x1bjsKLQkJc2VfY21kLT5zZV9vcmlnX29ial9wdHIgPSBzZV9jbWQtPnNlX2RldjsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wtPmRldmljZV9saXN0X2xvY2ssIGZsYWdzKTsKIApAQCAtNzA4LDcgKzcwNSw3IEBACiAKIAlzZV90YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKIAl0cmFuc3BvcnRfY29tcGxldGVfdGFzayhzZV90YXNrLCAxKTsKLQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9TRU5UX1RPX1RSQU5TUE9SVDsKKwlyZXR1cm4gMDsKIH0KIAogLyoJc2VfcmVsZWFzZV9kZXZpY2VfZm9yX2hiYSgpOgpAQCAtOTU3LDggKzk1NCwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcl9lcnIoImRwb19lbXVsYXRlZCBub3Qgc3VwcG9ydGVkXG4iKTsKLQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZmxhZykgeworCQlwcl9lcnIoImRwb19lbXVsYXRlZCBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7CiB9CiAKIGludCBzZV9kZXZfc2V0X2VtdWxhdGVfZnVhX3dyaXRlKHN0cnVjdCBzZV9kZXZpY2UgKmRldiwgaW50IGZsYWcpCkBAIC05NjgsNyArOTY5LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGRldi0+dHJhbnNwb3J0LT5mdWFfd3JpdGVfZW11bGF0ZWQgPT0gMCkgeworCWlmIChmbGFnICYmIGRldi0+dHJhbnNwb3J0LT5mdWFfd3JpdGVfZW11bGF0ZWQgPT0gMCkgewogCQlwcl9lcnIoImZ1YV93cml0ZV9lbXVsYXRlZCBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtOTg1LDggKzk4NiwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQlwcl9lcnIoInVhIHJlYWQgZW11bGF0ZWQgbm90IHN1cHBvcnRlZFxuIik7Ci0JcmV0dXJuIC1FSU5WQUw7CisJaWYgKGZsYWcpIHsKKwkJcHJfZXJyKCJ1YSByZWFkIGVtdWxhdGVkIG5vdCBzdXBwb3J0ZWRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogaW50IHNlX2Rldl9zZXRfZW11bGF0ZV93cml0ZV9jYWNoZShzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYsIGludCBmbGFnKQpAQCAtOTk1LDcgKzEwMDAsNyBAQAogCQlwcl9lcnIoIklsbGVnYWwgdmFsdWUgJWRcbiIsIGZsYWcpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKGRldi0+dHJhbnNwb3J0LT53cml0ZV9jYWNoZV9lbXVsYXRlZCA9PSAwKSB7CisJaWYgKGZsYWcgJiYgZGV2LT50cmFuc3BvcnQtPndyaXRlX2NhY2hlX2VtdWxhdGVkID09IDApIHsKIAkJcHJfZXJyKCJ3cml0ZV9jYWNoZV9lbXVsYXRlZCBub3Qgc3VwcG9ydGVkXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQpAQCAtMTA1Niw3ICsxMDYxLDcgQEAKIAkgKiBXZSBleHBlY3QgdGhpcyB2YWx1ZSB0byBiZSBub24temVybyB3aGVuIGdlbmVyaWMgQmxvY2sgTGF5ZXIKIAkgKiBEaXNjYXJkIHN1cHBvcnRlZCBpcyBkZXRlY3RlZCBpYmxvY2tfY3JlYXRlX3ZpcnRkZXZpY2UoKS4KIAkgKi8KLQlpZiAoIWRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5tYXhfdW5tYXBfYmxvY2tfZGVzY19jb3VudCkgeworCWlmIChmbGFnICYmICFkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIubWF4X3VubWFwX2Jsb2NrX2Rlc2NfY291bnQpIHsKIAkJcHJfZXJyKCJHZW5lcmljIEJsb2NrIERpc2NhcmQgbm90IHN1cHBvcnRlZFxuIik7CiAJCXJldHVybiAtRU5PU1lTOwogCX0KQEAgLTEwNzcsNyArMTA4Miw3IEBACiAJICogV2UgZXhwZWN0IHRoaXMgdmFsdWUgdG8gYmUgbm9uLXplcm8gd2hlbiBnZW5lcmljIEJsb2NrIExheWVyCiAJICogRGlzY2FyZCBzdXBwb3J0ZWQgaXMgZGV0ZWN0ZWQgaWJsb2NrX2NyZWF0ZV92aXJ0ZGV2aWNlKCkuCiAJICovCi0JaWYgKCFkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIubWF4X3VubWFwX2Jsb2NrX2Rlc2NfY291bnQpIHsKKwlpZiAoZmxhZyAmJiAhZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLm1heF91bm1hcF9ibG9ja19kZXNjX2NvdW50KSB7CiAJCXByX2VycigiR2VuZXJpYyBCbG9jayBEaXNjYXJkIG5vdCBzdXBwb3J0ZWRcbiIpOwogCQlyZXR1cm4gLUVOT1NZUzsKIAl9CkBAIC0xNTg3LDcgKzE1OTIsNiBAQAogCQlyZXQgPSAtRU5PTUVNOwogCQlnb3RvIG91dDsKIAl9Ci0JSU5JVF9MSVNUX0hFQUQoJnNlX2Rldi0+c2VfZGV2X25vZGUpOwogCUlOSVRfTElTVF9IRUFEKCZzZV9kZXYtPnQxMF93d24udDEwX3ZwZF9saXN0KTsKIAlzcGluX2xvY2tfaW5pdCgmc2VfZGV2LT50MTBfd3duLnQxMF92cGRfbG9jayk7CiAJSU5JVF9MSVNUX0hFQUQoJnNlX2Rldi0+dDEwX3ByLnJlZ2lzdHJhdGlvbl9saXN0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYwppbmRleCA2N2NkNmZlLi5iNDg2NGZiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jCkBAIC0yODksOSArMjg5LDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IHRhc2stPnRhc2tfc2dfbmVudHM7IGkrKykgewotCQlpb3ZbaV0uaW92X2xlbiA9IHNnW2ldLmxlbmd0aDsKLQkJaW92W2ldLmlvdl9iYXNlID0gc2dfdmlydCgmc2dbaV0pOworCWZvcl9lYWNoX3NnKHRhc2stPnRhc2tfc2csIHNnLCB0YXNrLT50YXNrX3NnX25lbnRzLCBpKSB7CisJCWlvdltpXS5pb3ZfbGVuID0gc2ctPmxlbmd0aDsKKwkJaW92W2ldLmlvdl9iYXNlID0gc2dfdmlydChzZyk7CiAJfQogCiAJb2xkX2ZzID0gZ2V0X2ZzKCk7CkBAIC0zNDIsOSArMzQyLDkgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IHRhc2stPnRhc2tfc2dfbmVudHM7IGkrKykgewotCQlpb3ZbaV0uaW92X2xlbiA9IHNnW2ldLmxlbmd0aDsKLQkJaW92W2ldLmlvdl9iYXNlID0gc2dfdmlydCgmc2dbaV0pOworCWZvcl9lYWNoX3NnKHRhc2stPnRhc2tfc2csIHNnLCB0YXNrLT50YXNrX3NnX25lbnRzLCBpKSB7CisJCWlvdltpXS5pb3ZfbGVuID0gc2ctPmxlbmd0aDsKKwkJaW92W2ldLmlvdl9iYXNlID0gc2dfdmlydChzZyk7CiAJfQogCiAJb2xkX2ZzID0gZ2V0X2ZzKCk7CkBAIC00MzgsNyArNDM4LDcgQEAKIAkJaWYgKHJldCA+IDAgJiYKIAkJICAgIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3dyaXRlX2NhY2hlID4gMCAmJgogCQkgICAgZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmVtdWxhdGVfZnVhX3dyaXRlID4gMCAmJgotCQkgICAgY21kLT50X3Rhc2tzX2Z1YSkgeworCQkgICAgKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX0ZVQSkpIHsKIAkJCS8qCiAJCQkgKiBXZSBtaWdodCBuZWVkIHRvIGJlIGEgYml0IHNtYXJ0ZXIgaGVyZQogCQkJICogYW5kIHJldHVybiBzb21lIHNlbnNlIGRhdGEgdG8gbGV0IHRoZSBpbml0aWF0b3IKQEAgLTQ0OSwxMyArNDQ5LDE1IEBACiAKIAl9CiAKLQlpZiAocmV0IDwgMCkKKwlpZiAocmV0IDwgMCkgeworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CiAJCXJldHVybiByZXQ7CisJfQogCWlmIChyZXQpIHsKIAkJdGFzay0+dGFza19zY3NpX3N0YXR1cyA9IEdPT0Q7CiAJCXRyYW5zcG9ydF9jb21wbGV0ZV90YXNrKHRhc2ssIDEpOwogCX0KLQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9TRU5UX1RPX1RSQU5TUE9SVDsKKwlyZXR1cm4gMDsKIH0KIAogLyoJZmRfZnJlZV90YXNrKCk6IChQYXJ0IG9mIHNlX3N1YnN5c3RlbV9hcGlfdCB0ZW1wbGF0ZSkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKaW5kZXggNzY5OGVmZS4uNGFhOTkyMiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKQEAgLTUzMSw3ICs1MzEsNyBAQAogCQkgKi8KIAkJaWYgKGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5lbXVsYXRlX3dyaXRlX2NhY2hlID09IDAgfHwKIAkJICAgIChkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV9mdWFfd3JpdGUgPiAwICYmCi0JCSAgICAgdGFzay0+dGFza19zZV9jbWQtPnRfdGFza3NfZnVhKSkKKwkJICAgICAoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfRlVBKSkpCiAJCQlydyA9IFdSSVRFX0ZVQTsKIAkJZWxzZQogCQkJcncgPSBXUklURTsKQEAgLTU1NCwxMiArNTU0LDE1IEBACiAJZWxzZSB7CiAJCXByX2VycigiVW5zdXBwb3J0ZWQgU0NTSSAtPiBCTE9DSyBMQkEgY29udmVyc2lvbjoiCiAJCQkJIiAldVxuIiwgZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemUpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwkJcmV0dXJuIC1FTk9TWVM7CiAJfQogCiAJYmlvID0gaWJsb2NrX2dldF9iaW8odGFzaywgYmxvY2tfbGJhLCBzZ19udW0pOwotCWlmICghYmlvKQotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9PVVRfT0ZfTUVNT1JZX1JFU09VUkNFUzsKKwlpZiAoIWJpbykgeworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CisJCXJldHVybiAtRU5PTUVNOworCX0KIAogCWJpb19saXN0X2luaXQoJmxpc3QpOwogCWJpb19saXN0X2FkZCgmbGlzdCwgYmlvKTsKQEAgLTU4OCwxMiArNTkxLDEzIEBACiAJCXN1Ym1pdF9iaW8ocncsIGJpbyk7CiAJYmxrX2ZpbmlzaF9wbHVnKCZwbHVnKTsKIAotCXJldHVybiBQWVhfVFJBTlNQT1JUX1NFTlRfVE9fVFJBTlNQT1JUOworCXJldHVybiAwOwogCiBmYWlsOgogCXdoaWxlICgoYmlvID0gYmlvX2xpc3RfcG9wKCZsaXN0KSkpCiAJCWJpb19wdXQoYmlvKTsKLQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9PVVRfT0ZfTUVNT1JZX1JFU09VUkNFUzsKKwljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CisJcmV0dXJuIC1FTk9NRU07CiB9CiAKIHN0YXRpYyB1MzIgaWJsb2NrX2dldF9kZXZpY2VfcmV2KHN0cnVjdCBzZV9kZXZpY2UgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wci5jCmluZGV4IDVhNGViZmMuLjk1ZGVlNzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3ByLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHIuYwpAQCAtMTkxLDcgKzE5MSw3IEBACiAJCXByX2VycigiUmVjZWl2ZWQgbGVnYWN5IFNQQy0yIFJFU0VSVkUvUkVMRUFTRSIKIAkJCSIgd2hpbGUgYWN0aXZlIFNQQy0zIHJlZ2lzdHJhdGlvbnMgZXhpc3QsIgogCQkJIiByZXR1cm5pbmcgUkVTRVJWQVRJT05fQ09ORkxJQ1RcbiIpOwotCQkqcmV0ID0gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9SRVNFUlZBVElPTl9DT05GTElDVDsKIAkJcmV0dXJuIHRydWU7CiAJfQogCkBAIC0yNTIsNyArMjUyLDggQEAKIAkgICAgKGNtZC0+dF90YXNrX2NkYlsxXSAmIDB4MDIpKSB7CiAJCXByX2VycigiTG9uZ0lPIGFuZCBPYnNlbGV0ZSBCaXRzIHNldCwgcmV0dXJuaW5nIgogCQkJCSIgSUxMRUdBTF9SRVFVRVNUXG4iKTsKLQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTExFR0FMX1JFUVVFU1Q7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fVU5TVVBQT1JURURfU0NTSV9PUENPREU7CisJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAkvKgpAQCAtMjc3LDcgKzI3OCw4IEBACiAJCQkiIGZyb20gJXMgXG4iLCBjbWQtPnNlX2x1bi0+dW5wYWNrZWRfbHVuLAogCQkJY21kLT5zZV9kZXZlLT5tYXBwZWRfbHVuLAogCQkJc2Vzcy0+c2Vfbm9kZV9hY2wtPmluaXRpYXRvcm5hbWUpOwotCQlyZXQgPSBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dF91bmxvY2s7CiAJfQogCkBAIC0xNTEwLDcgKzE1MTIsOCBAQAogCXRpZGhfbmV3ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHByX3RyYW5zcG9ydF9pZF9ob2xkZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRpZGhfbmV3KSB7CiAJCXByX2VycigiVW5hYmxlIHRvIGFsbG9jYXRlIHRpZGhfbmV3XG4iKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlJTklUX0xJU1RfSEVBRCgmdGlkaF9uZXctPmRlc3RfbGlzdCk7CiAJdGlkaF9uZXctPmRlc3RfdHBnID0gdHBnOwpAQCAtMTUyMiw3ICsxNTI1LDggQEAKIAkJCQlzYV9yZXNfa2V5LCBhbGxfdGdfcHQsIGFwdHBsKTsKIAlpZiAoIWxvY2FsX3ByX3JlZykgewogCQlrZnJlZSh0aWRoX25ldyk7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAJdGlkaF9uZXctPmRlc3RfcHJfcmVnID0gbG9jYWxfcHJfcmVnOwogCS8qCkBAIC0xNTQ4LDcgKzE1NTIsOCBAQAogCQlwcl9lcnIoIlNQQy0zIFBSOiBJbGxlZ2FsIHRwZGw6ICV1ICsgMjggYnl0ZSBoZWFkZXIiCiAJCQkiIGRvZXMgbm90IGVxdWFsIENEQiBkYXRhX2xlbmd0aDogJXVcbiIsIHRwZGwsCiAJCQljbWQtPmRhdGFfbGVuZ3RoKTsKLQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAkvKgpAQCAtMTU5OCw3ICsxNjAzLDkgQEAKIAkJCQkJIiBmb3IgdG1wX3RwZ1xuIik7CiAJCQkJYXRvbWljX2RlYygmdG1wX3RwZy0+dHBnX3ByX3JlZl9jb3VudCk7CiAJCQkJc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCk7Ci0JCQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CisJCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9CisJCQkJCVRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQkJCXJldCA9IC1FSU5WQUw7CiAJCQkJZ290byBvdXQ7CiAJCQl9CiAJCQkvKgpAQCAtMTYyOCw3ICsxNjM1LDkgQEAKIAkJCQlhdG9taWNfZGVjKCZkZXN0X25vZGVfYWNsLT5hY2xfcHJfcmVmX2NvdW50KTsKIAkJCQlzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKTsKIAkJCQljb3JlX3Njc2kzX3RwZ191bmRlcGVuZF9pdGVtKHRtcF90cGcpOwotCQkJCXJldCA9IFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOworCQkJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPQorCQkJCQlUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwkJCQlyZXQgPSAtRUlOVkFMOwogCQkJCWdvdG8gb3V0OwogCQkJfQogCkBAIC0xNjQ2LDcgKzE2NTUsOCBAQAogCQlpZiAoIWRlc3RfdHBnKSB7CiAJCQlwcl9lcnIoIlNQQy0zIFBSIFNQRUNfSV9QVDogVW5hYmxlIHRvIGxvY2F0ZSIKIAkJCQkJIiBkZXN0X3RwZ1xuIik7Ci0JCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCQlyZXQgPSAtRUlOVkFMOwogCQkJZ290byBvdXQ7CiAJCX0KICNpZiAwCkBAIC0xNjYwLDcgKzE2NzAsOCBAQAogCQkJCSIgJXUgZm9yIFRyYW5zcG9ydCBJRDogJXNcbiIsIHRpZF9sZW4sIHB0cik7CiAJCQljb3JlX3Njc2kzX25vZGVhY2xfdW5kZXBlbmRfaXRlbShkZXN0X25vZGVfYWNsKTsKIAkJCWNvcmVfc2NzaTNfdHBnX3VuZGVwZW5kX2l0ZW0oZGVzdF90cGcpOwotCQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCS8qCkBAIC0xNjc4LDcgKzE2ODksOCBAQAogCiAJCQljb3JlX3Njc2kzX25vZGVhY2xfdW5kZXBlbmRfaXRlbShkZXN0X25vZGVfYWNsKTsKIAkJCWNvcmVfc2NzaTNfdHBnX3VuZGVwZW5kX2l0ZW0oZGVzdF90cGcpOwotCQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9CiAKQEAgLTE2OTAsNyArMTcwMiw5IEBACiAJCQlzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKTsKIAkJCWNvcmVfc2NzaTNfbm9kZWFjbF91bmRlcGVuZF9pdGVtKGRlc3Rfbm9kZV9hY2wpOwogCQkJY29yZV9zY3NpM190cGdfdW5kZXBlbmRfaXRlbShkZXN0X3RwZyk7Ci0JCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKKwkJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPQorCQkJCVRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9CiAjaWYgMApAQCAtMTcyNyw3ICsxNzQxLDkgQEAKIAkJCWNvcmVfc2NzaTNfbHVuYWNsX3VuZGVwZW5kX2l0ZW0oZGVzdF9zZV9kZXZlKTsKIAkJCWNvcmVfc2NzaTNfbm9kZWFjbF91bmRlcGVuZF9pdGVtKGRlc3Rfbm9kZV9hY2wpOwogCQkJY29yZV9zY3NpM190cGdfdW5kZXBlbmRfaXRlbShkZXN0X3RwZyk7Ci0JCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKKwkJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPQorCQkJCVRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQkJcmV0ID0gLUVOT01FTTsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCUlOSVRfTElTVF9IRUFEKCZ0aWRoX25ldy0+ZGVzdF9saXN0KTsKQEAgLTE3NTksNyArMTc3NSw4IEBACiAJCQljb3JlX3Njc2kzX25vZGVhY2xfdW5kZXBlbmRfaXRlbShkZXN0X25vZGVfYWNsKTsKIAkJCWNvcmVfc2NzaTNfdHBnX3VuZGVwZW5kX2l0ZW0oZGVzdF90cGcpOwogCQkJa2ZyZWUodGlkaF9uZXcpOwotCQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJcmV0ID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwogCQl9CiAJCXRpZGhfbmV3LT5kZXN0X3ByX3JlZyA9IGRlc3RfcHJfcmVnOwpAQCAtMjA5OCw3ICsyMTE1LDggQEAKIAogCWlmICghc2Vfc2VzcyB8fCAhc2VfbHVuKSB7CiAJCXByX2VycigiU1BDLTMgUFI6IHNlX3Nlc3MgfHwgc3RydWN0IHNlX2x1biBpcyBOVUxMIVxuIik7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc2VfdHBnID0gc2Vfc2Vzcy0+c2VfdHBnOwogCXNlX2RldmUgPSAmc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wtPmRldmljZV9saXN0W2NtZC0+b3JpZ19mZV9sdW5dOwpAQCAtMjExNywxMyArMjEzNSwxNCBAQAogCQlpZiAocmVzX2tleSkgewogCQkJcHJfd2FybigiU1BDLTMgUFI6IFJlc2VydmF0aW9uIEtleSBub24temVybyIKIAkJCQkiIGZvciBTQSBSRUdJU1RFUiwgcmV0dXJuaW5nIENPTkZMSUNUXG4iKTsKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8qCiAJCSAqIERvIG5vdGhpbmcgYnV0IHJldHVybiBHT09EIHN0YXR1cy4KIAkJICovCiAJCWlmICghc2FfcmVzX2tleSkKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1NFTlRfVE9fVFJBTlNQT1JUOworCQkJcmV0dXJuIDA7CiAKIAkJaWYgKCFzcGVjX2lfcHQpIHsKIAkJCS8qCkBAIC0yMTM4LDcgKzIxNTcsOCBAQAogCQkJaWYgKHJldCAhPSAwKSB7CiAJCQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUiCiAJCQkJCSIgc3RydWN0IHQxMF9wcl9yZWdpc3RyYXRpb25cbiIpOwotCQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9IGVsc2UgewogCQkJLyoKQEAgLTIxOTcsMTQgKzIyMTcsMTYgQEAKIAkJCQkJIiAweCUwMTZMeFxuIiwgcmVzX2tleSwKIAkJCQkJcHJfcmVnLT5wcl9yZXNfa2V5KTsKIAkJCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CiAJCWlmIChzcGVjX2lfcHQpIHsKIAkJCXByX2VycigiU1BDLTMgUFIgVU5SRUdJU1RFUjogU1BFQ19JX1BUIgogCQkJCSIgc2V0IHdoaWxlIHNhX3Jlc19rZXk9MFxuIik7CiAJCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQkvKgogCQkgKiBBbiBleGlzdGluZyBBTExfVEdfUFQ9MSByZWdpc3RyYXRpb24gYmVpbmcgcmVsZWFzZWQKQEAgLTIyMTUsNyArMjIzNyw4IEBACiAJCQkJIiByZWdpc3RyYXRpb24gZXhpc3RzLCBidXQgQUxMX1RHX1BUPTEgYml0IG5vdCIKIAkJCQkiIHByZXNlbnQgaW4gcmVjZWl2ZWQgUFJPVVRcbiIpOwogCQkJY29yZV9zY3NpM19wdXRfcHJfcmVnKHByX3JlZyk7Ci0JCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKKwkJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9DREJfRklFTEQ7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCQkvKgogCQkgKiBBbGxvY2F0ZSBBUFRQTCBtZXRhZGF0YSBidWZmZXIgdXNlZCBmb3IgVU5SRUdJU1RFUiBvcHMKQEAgLTIyMjcsNyArMjI1MCw5IEBACiAJCQkJcHJfZXJyKCJVbmFibGUgdG8gYWxsb2NhdGUiCiAJCQkJCSIgcHJfYXB0cGxfYnVmXG4iKTsKIAkJCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CisJCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9CisJCQkJCVRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCQl9CiAJCS8qCkBAIC0yMjQxLDcgKzIyNjYsOCBAQAogCQkJaWYgKHByX2hvbGRlciA8IDApIHsKIAkJCQlrZnJlZShwcl9hcHRwbF9idWYpOwogCQkJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwotCQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQkJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CisJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CiAKIAkJCXNwaW5fbG9jaygmcHJfdG1wbC0+cmVnaXN0cmF0aW9uX2xvY2spOwpAQCAtMjQwNSw3ICsyNDMxLDggQEAKIAogCWlmICghc2Vfc2VzcyB8fCAhc2VfbHVuKSB7CiAJCXByX2VycigiU1BDLTMgUFI6IHNlX3Nlc3MgfHwgc3RydWN0IHNlX2x1biBpcyBOVUxMIVxuIik7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc2VfdHBnID0gc2Vfc2Vzcy0+c2VfdHBnOwogCXNlX2RldmUgPSAmc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wtPmRldmljZV9saXN0W2NtZC0+b3JpZ19mZV9sdW5dOwpAQCAtMjQxNyw3ICsyNDQ0LDggQEAKIAlpZiAoIXByX3JlZykgewogCQlwcl9lcnIoIlNQQy0zIFBSOiBVbmFibGUgdG8gbG9jYXRlIgogCQkJIiBQUl9SRUdJU1RFUkVEICpwcl9yZWcgZm9yIFJFU0VSVkVcbiIpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qCiAJICogRnJvbSBzcGM0cjE3IFNlY3Rpb24gNS43Ljk6IFJlc2VydmluZzoKQEAgLTI0MzMsNyArMjQ2MSw4IEBACiAJCQkiIGRvZXMgbm90IG1hdGNoIGV4aXN0aW5nIFNBIFJFR0lTVEVSIHJlc19rZXk6IgogCQkJIiAweCUwMTZMeFxuIiwgcmVzX2tleSwgcHJfcmVnLT5wcl9yZXNfa2V5KTsKIAkJY29yZV9zY3NpM19wdXRfcHJfcmVnKHByX3JlZyk7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyoKIAkgKiBGcm9tIHNwYzRyMTcgU2VjdGlvbiA1LjcuOTogUmVzZXJ2aW5nOgpAQCAtMjQ0OCw3ICsyNDc3LDggQEAKIAlpZiAoc2NvcGUgIT0gUFJfU0NPUEVfTFVfU0NPUEUpIHsKIAkJcHJfZXJyKCJTUEMtMyBQUjogSWxsZWdhbCBTQ09QRTogMHglMDJ4XG4iLCBzY29wZSk7CiAJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKgogCSAqIFNlZSBpZiB3ZSBoYXZlIGFuIGV4aXN0aW5nIFBSIHJlc2VydmF0aW9uIGhvbGRlciBwb2ludGVyIGF0CkBAIC0yNDgwLDcgKzI1MTAsOCBAQAogCiAJCQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAJCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8qCiAJCSAqIEZyb20gc3BjNHIxNyBTZWN0aW9uIDUuNy45OiBSZXNlcnZpbmc6CkBAIC0yNTAzLDcgKzI1MzQsOCBAQAogCiAJCQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAJCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8qCiAJCSAqIEZyb20gc3BjNHIxNyBTZWN0aW9uIDUuNy45OiBSZXNlcnZpbmc6CkBAIC0yNTE3LDcgKzI1NDksNyBAQAogCQkgKi8KIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfU0VOVF9UT19UUkFOU1BPUlQ7CisJCXJldHVybiAwOwogCX0KIAkvKgogCSAqIE90aGVyd2lzZSwgb3VyICpwcl9yZWcgYmVjb21lcyB0aGUgUFIgcmVzZXJ2YXRpb24gaG9sZGVyIGZvciBzYWlkCkBAIC0yNTc0LDcgKzI2MDYsOCBAQAogCWRlZmF1bHQ6CiAJCXByX2VycigiU1BDLTMgUFI6IFVua25vd24gU2VydmljZSBBY3Rpb24gUkVTRVJWRSBUeXBlOiIKIAkJCSIgMHglMDJ4XG4iLCB0eXBlKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9DREJfRklFTEQ7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCXJldHVybiByZXQ7CkBAIC0yNjMwLDcgKzI2NjMsOCBAQAogCiAJaWYgKCFzZV9zZXNzIHx8ICFzZV9sdW4pIHsKIAkJcHJfZXJyKCJTUEMtMyBQUjogc2Vfc2VzcyB8fCBzdHJ1Y3Qgc2VfbHVuIGlzIE5VTEwhXG4iKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKgogCSAqIExvY2F0ZSB0aGUgZXhpc3RpbmcgKnByX3JlZyB2aWEgc3RydWN0IHNlX25vZGVfYWNsIHBvaW50ZXJzCkBAIC0yNjM5LDcgKzI2NzMsOCBAQAogCWlmICghcHJfcmVnKSB7CiAJCXByX2VycigiU1BDLTMgUFI6IFVuYWJsZSB0byBsb2NhdGUiCiAJCQkiIFBSX1JFR0lTVEVSRUQgKnByX3JlZyBmb3IgUkVMRUFTRVxuIik7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyoKIAkgKiBGcm9tIHNwYzRyMTcgU2VjdGlvbiA1LjcuMTEuMiBSZWxlYXNpbmc6CkBAIC0yNjYxLDcgKzI2OTYsNyBAQAogCQkgKi8KIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfU0VOVF9UT19UUkFOU1BPUlQ7CisJCXJldHVybiAwOwogCX0KIAlpZiAoKHByX3Jlc19ob2xkZXItPnByX3Jlc190eXBlID09IFBSX1RZUEVfV1JJVEVfRVhDTFVTSVZFX0FMTFJFRykgfHwKIAkgICAgKHByX3Jlc19ob2xkZXItPnByX3Jlc190eXBlID09IFBSX1RZUEVfRVhDTFVTSVZFX0FDQ0VTU19BTExSRUcpKQpAQCAtMjY3NSw3ICsyNzEwLDcgQEAKIAkJICovCiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAkJY29yZV9zY3NpM19wdXRfcHJfcmVnKHByX3JlZyk7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1NFTlRfVE9fVFJBTlNQT1JUOworCQlyZXR1cm4gMDsKIAl9CiAJLyoKIAkgKiBGcm9tIHNwYzRyMTcgU2VjdGlvbiA1LjcuMTEuMiBSZWxlYXNpbmc6CkBAIC0yNjk3LDcgKzI3MzIsOCBAQAogCQkJIiAweCUwMTZMeFxuIiwgcmVzX2tleSwgcHJfcmVnLT5wcl9yZXNfa2V5KTsKIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKgogCSAqIEZyb20gc3BjNHIxNyBTZWN0aW9uIDUuNy4xMS4yIFJlbGVhc2luZyBhbmQgYWJvdmU6CkBAIC0yNzE5LDcgKzI3NTUsOCBAQAogCiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAkJY29yZV9zY3NpM19wdXRfcHJfcmVnKHByX3JlZyk7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyoKIAkgKiBJbiByZXNwb25zZSB0byBhIHBlcnNpc3RlbnQgcmVzZXJ2YXRpb24gcmVsZWFzZSByZXF1ZXN0IGZyb20gdGhlCkBAIC0yODAyLDcgKzI4MzksOCBAQAogCWlmICghcHJfcmVnX24pIHsKIAkJcHJfZXJyKCJTUEMtMyBQUjogVW5hYmxlIHRvIGxvY2F0ZSIKIAkJCSIgUFJfUkVHSVNURVJFRCAqcHJfcmVnIGZvciBDTEVBUlxuIik7Ci0JCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qCiAJICogRnJvbSBzcGM0cjE3IHNlY3Rpb24gNS43LjExLjYsIENsZWFyaW5nOgpAQCAtMjgyMSw3ICsyODU5LDggQEAKIAkJCSIgZXhpc3RpbmcgU0EgUkVHSVNURVIgcmVzX2tleToiCiAJCQkiIDB4JTAxNkx4XG4iLCByZXNfa2V5LCBwcl9yZWdfbi0+cHJfcmVzX2tleSk7CiAJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWdfbik7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyoKIAkgKiBhKSBSZWxlYXNlIHRoZSBwZXJzaXN0ZW50IHJlc2VydmF0aW9uLCBpZiBhbnk7CkBAIC0yOTc5LDggKzMwMTgsMTAgQEAKIAlpbnQgYWxsX3JlZyA9IDAsIGNhbGxpbmdfaXRfbmV4dXMgPSAwLCByZWxlYXNlZF9yZWdzID0gMDsKIAlpbnQgcHJoX3R5cGUgPSAwLCBwcmhfc2NvcGUgPSAwLCByZXQ7CiAKLQlpZiAoIXNlX3Nlc3MpCi0JCXJldHVybiBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKKwlpZiAoIXNlX3Nlc3MpIHsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlzZV9kZXZlID0gJnNlX3Nlc3MtPnNlX25vZGVfYWNsLT5kZXZpY2VfbGlzdFtjbWQtPm9yaWdfZmVfbHVuXTsKIAlwcl9yZWdfbiA9IGNvcmVfc2NzaTNfbG9jYXRlX3ByX3JlZyhjbWQtPnNlX2Rldiwgc2Vfc2Vzcy0+c2Vfbm9kZV9hY2wsCkBAIC0yOTg5LDE2ICszMDMwLDE5IEBACiAJCXByX2VycigiU1BDLTMgUFI6IFVuYWJsZSB0byBsb2NhdGUiCiAJCQkiIFBSX1JFR0lTVEVSRUQgKnByX3JlZyBmb3IgUFJFRU1QVCVzXG4iLAogCQkJKGFib3J0KSA/ICJfQU5EX0FCT1JUIiA6ICIiKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAlpZiAocHJfcmVnX24tPnByX3Jlc19rZXkgIT0gcmVzX2tleSkgewogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnX24pOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWlmIChzY29wZSAhPSBQUl9TQ09QRV9MVV9TQ09QRSkgewogCQlwcl9lcnIoIlNQQy0zIFBSOiBJbGxlZ2FsIFNDT1BFOiAweCUwMnhcbiIsIHNjb3BlKTsKIAkJY29yZV9zY3NpM19wdXRfcHJfcmVnKHByX3JlZ19uKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJSU5JVF9MSVNUX0hFQUQoJnByZWVtcHRfYW5kX2Fib3J0X2xpc3QpOwogCkBAIC0zMDEyLDcgKzMwNTYsOCBAQAogCWlmICghYWxsX3JlZyAmJiAhc2FfcmVzX2tleSkgewogCQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7CiAJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWdfbik7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qCiAJICogRnJvbSBzcGM0cjE3LCBzZWN0aW9uIDUuNy4xMS40LjQgUmVtb3ZpbmcgUmVnaXN0cmF0aW9uczoKQEAgLTMxMDYsNyArMzE1MSw4IEBACiAJCWlmICghcmVsZWFzZWRfcmVncykgewogCQkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwogCQkJY29yZV9zY3NpM19wdXRfcHJfcmVnKHByX3JlZ19uKTsKLQkJCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJCXJldHVybiAtRUlOVkFMOwogCQl9CiAJCS8qCiAJCSAqIEZvciBhbiBleGlzdGluZyBhbGwgcmVnaXN0cmFudHMgdHlwZSByZXNlcnZhdGlvbgpAQCAtMzI5Nyw3ICszMzQzLDggQEAKIAlkZWZhdWx0OgogCQlwcl9lcnIoIlNQQy0zIFBSOiBVbmtub3duIFNlcnZpY2UgQWN0aW9uIFBSRUVNUFQlcyIKIAkJCSIgVHlwZTogMHglMDJ4XG4iLCAoYWJvcnQpID8gIl9BTkRfQUJPUlQiIDogIiIsIHR5cGUpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX0NEQl9GSUVMRDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJcmV0dXJuIHJldDsKQEAgLTMzMzEsNyArMzM3OCw4IEBACiAKIAlpZiAoIXNlX3Nlc3MgfHwgIXNlX2x1bikgewogCQlwcl9lcnIoIlNQQy0zIFBSOiBzZV9zZXNzIHx8IHN0cnVjdCBzZV9sdW4gaXMgTlVMTCFcbiIpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCW1lbXNldChkZXN0X2lwb3J0LCAwLCA2NCk7CiAJbWVtc2V0KGlfYnVmLCAwLCBQUl9SRUdfSVNJRF9JRF9MRU4pOwpAQCAtMzM0OSw3ICszMzk3LDggQEAKIAlpZiAoIXByX3JlZykgewogCQlwcl9lcnIoIlNQQy0zIFBSOiBVbmFibGUgdG8gbG9jYXRlIFBSX1JFR0lTVEVSRUQiCiAJCQkiICpwcl9yZWcgZm9yIFJFR0lTVEVSX0FORF9NT1ZFXG4iKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAkvKgogCSAqIFRoZSBwcm92aWRlZCByZXNlcnZhdGlvbiBrZXkgbXVjaCBtYXRjaCB0aGUgZXhpc3RpbmcgcmVzZXJ2YXRpb24ga2V5CkBAIC0zMzYwLDcgKzM0MDksOCBAQAogCQkJIiByZXNfa2V5OiAweCUwMTZMeCBkb2VzIG5vdCBtYXRjaCBleGlzdGluZyBTQSBSRUdJU1RFUiIKIAkJCSIgcmVzX2tleTogMHglMDE2THhcbiIsIHJlc19rZXksIHByX3JlZy0+cHJfcmVzX2tleSk7CiAJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9SRVNFUlZBVElPTl9DT05GTElDVDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCS8qCiAJICogVGhlIHNlcnZpY2UgYWN0aXZlIHJlc2VydmF0aW9uIGtleSBuZWVkcyB0byBiZSBub24gemVybwpAQCAtMzM2OSw3ICszNDE5LDggQEAKIAkJcHJfd2FybigiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IFJlY2VpdmVkIHplcm8iCiAJCQkiIHNhX3Jlc19rZXlcbiIpOwogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAkvKgpAQCAtMzM5Miw3ICszNDQzLDggQEAKIAkJCSIgZG9lcyBub3QgZXF1YWwgQ0RCIGRhdGFfbGVuZ3RoOiAldVxuIiwgdGlkX2xlbiwKIAkJCWNtZC0+ZGF0YV9sZW5ndGgpOwogCQljb3JlX3Njc2kzX3B1dF9wcl9yZWcocHJfcmVnKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzcGluX2xvY2soJmRldi0+c2VfcG9ydF9sb2NrKTsKQEAgLTM0MTcsNyArMzQ2OSw4IEBACiAJCQlhdG9taWNfZGVjKCZkZXN0X3NlX3RwZy0+dHBnX3ByX3JlZl9jb3VudCk7CiAJCQlzbXBfbWJfX2FmdGVyX2F0b21pY19kZWMoKTsKIAkJCWNvcmVfc2NzaTNfcHV0X3ByX3JlZyhwcl9yZWcpOwotCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAogCQlzcGluX2xvY2soJmRldi0+c2VfcG9ydF9sb2NrKTsKQEAgLTM0MzAsNyArMzQ4Myw4IEBACiAJCQkiIGZhYnJpYyBvcHMgZnJvbSBSZWxhdGl2ZSBUYXJnZXQgUG9ydCBJZGVudGlmaWVyOiIKIAkJCSIgJWh1XG4iLCBydHBpKTsKIAkJY29yZV9zY3NpM19wdXRfcHJfcmVnKHByX3JlZyk7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CkBAIC0zNDQ1LDE0ICszNDk5LDE2IEBACiAJCQkiIGZyb20gZmFicmljOiAlc1xuIiwgcHJvdG9faWRlbnQsCiAJCQlkZXN0X3RmX29wcy0+Z2V0X2ZhYnJpY19wcm90b19pZGVudChkZXN0X3NlX3RwZyksCiAJCQlkZXN0X3RmX29wcy0+Z2V0X2ZhYnJpY19uYW1lKCkpOwotCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCWlmIChkZXN0X3RmX29wcy0+dHBnX3BhcnNlX3ByX291dF90cmFuc3BvcnRfaWQgPT0gTlVMTCkgewogCQlwcl9lcnIoIlNQQy0zIFBSIFJFR0lTVEVSX0FORF9NT1ZFOiBGYWJyaWMgZG9lcyBub3QiCiAJCQkiIGNvbnRhaW5nIGEgdmFsaWQgdHBnX3BhcnNlX3ByX291dF90cmFuc3BvcnRfaWQiCiAJCQkiIGZ1bmN0aW9uIHBvaW50ZXJcbiIpOwotCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAJaW5pdGlhdG9yX3N0ciA9IGRlc3RfdGZfb3BzLT50cGdfcGFyc2VfcHJfb3V0X3RyYW5zcG9ydF9pZChkZXN0X3NlX3RwZywKQEAgLTM0NjAsNyArMzUxNiw4IEBACiAJaWYgKCFpbml0aWF0b3Jfc3RyKSB7CiAJCXByX2VycigiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IFVuYWJsZSB0byBsb2NhdGUiCiAJCQkiIGluaXRpYXRvcl9zdHIgZnJvbSBUcmFuc3BvcnQgSURcbiIpOwotCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0zNDg5LDcgKzM1NDYsOCBAQAogCQlwcl9lcnIoIlNQQy0zIFBSIFJFR0lTVEVSX0FORF9NT1ZFOiBUcmFuc3BvcnRJRDogJXMiCiAJCQkiIG1hdGNoZXM6ICVzIG9uIHJlY2VpdmVkIElfVCBOZXh1c1xuIiwgaW5pdGlhdG9yX3N0ciwKIAkJCXByX3JlZ19uYWNsLT5pbml0aWF0b3JuYW1lKTsKLQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAlpZiAoIXN0cmNtcChpcG9ydF9wdHIsIHByX3JlZy0+cHJfcmVnX2lzaWQpKSB7CkBAIC0zNDk3LDcgKzM1NTUsOCBAQAogCQkJIiBtYXRjaGVzOiAlcyAlcyBvbiByZWNlaXZlZCBJX1QgTmV4dXNcbiIsCiAJCQlpbml0aWF0b3Jfc3RyLCBpcG9ydF9wdHIsIHByX3JlZ19uYWNsLT5pbml0aWF0b3JuYW1lLAogCQkJcHJfcmVnLT5wcl9yZWdfaXNpZCk7Ci0JCXJldCA9IFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiBhZnRlcl9pcG9ydF9jaGVjazoKQEAgLTM1MTcsNyArMzU3Niw4IEBACiAJCXByX2VycigiVW5hYmxlIHRvIGxvY2F0ZSAlcyBkZXN0X25vZGVfYWNsIGZvciIKIAkJCSIgVHJhbnNwb3J0SUQlc1xuIiwgZGVzdF90Zl9vcHMtPmdldF9mYWJyaWNfbmFtZSgpLAogCQkJaW5pdGlhdG9yX3N0cik7Ci0JCXJldCA9IFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAJcmV0ID0gY29yZV9zY3NpM19ub2RlYWNsX2RlcGVuZF9pdGVtKGRlc3Rfbm9kZV9hY2wpOwpAQCAtMzUyNyw3ICszNTg3LDggQEAKIAkJYXRvbWljX2RlYygmZGVzdF9ub2RlX2FjbC0+YWNsX3ByX3JlZl9jb3VudCk7CiAJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpOwogCQlkZXN0X25vZGVfYWNsID0gTlVMTDsKLQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogI2lmIDAKQEAgLTM1NDMsNyArMzYwNCw4IEBACiAJaWYgKCFkZXN0X3NlX2RldmUpIHsKIAkJcHJfZXJyKCJVbmFibGUgdG8gbG9jYXRlICVzIGRlc3Rfc2VfZGV2ZSBmcm9tIFJUUEk6IgogCQkJIiAlaHVcbiIsICBkZXN0X3RmX29wcy0+Z2V0X2ZhYnJpY19uYW1lKCksIHJ0cGkpOwotCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0zNTUzLDcgKzM2MTUsOCBAQAogCQlhdG9taWNfZGVjKCZkZXN0X3NlX2RldmUtPnByX3JlZl9jb3VudCk7CiAJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpOwogCQlkZXN0X3NlX2RldmUgPSBOVUxMOwotCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAjaWYgMApAQCAtMzU3Miw3ICszNjM1LDggQEAKIAkJcHJfd2FybigiU1BDLTMgUFIgUkVHSVNURVJfQU5EX01PVkU6IE5vIHJlc2VydmF0aW9uIgogCQkJIiBjdXJyZW50bHkgaGVsZFxuIik7CiAJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKLQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX0NEQl9GSUVMRDsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCS8qCkBAIC0zNTg1LDcgKzM2NDksOCBAQAogCQlwcl93YXJuKCJTUEMtMyBQUiBSRUdJU1RFUl9BTkRfTU9WRTogQ2FsbGluZyBJX1QiCiAJCQkiIE5leHVzIGlzIG5vdCByZXNlcnZhdGlvbiBob2xkZXJcbiIpOwogCQlzcGluX3VubG9jaygmZGV2LT5kZXZfcmVzZXJ2YXRpb25fbG9jayk7Ci0JCXJldCA9IFBZWF9UUkFOU1BPUlRfUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CisJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIAkvKgpAQCAtMzYwMyw3ICszNjY4LDggQEAKIAkJCSIgcmVzZXJ2YXRpb24gZm9yIHR5cGU6ICVzXG4iLAogCQkJY29yZV9zY3NpM19wcl9kdW1wX3R5cGUocHJfcmVzX2hvbGRlci0+cHJfcmVzX3R5cGUpKTsKIAkJc3Bpbl91bmxvY2soJmRldi0+ZGV2X3Jlc2VydmF0aW9uX2xvY2spOwotCQlyZXQgPSBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAJcHJfcmVzX25hY2wgPSBwcl9yZXNfaG9sZGVyLT5wcl9yZWdfbmFjbDsKQEAgLTM2NDAsNyArMzcwNiw4IEBACiAJCQkJc2FfcmVzX2tleSwgMCwgYXB0cGwsIDIsIDEpOwogCQlpZiAocmV0ICE9IDApIHsKIAkJCXNwaW5fdW5sb2NrKCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKLQkJCXJldCA9IFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJCXJldCA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQogCQlkZXN0X3ByX3JlZyA9IF9fY29yZV9zY3NpM19sb2NhdGVfcHJfcmVnKGRldiwgZGVzdF9ub2RlX2FjbCwKQEAgLTM3NzEsNyArMzgzOCw4IEBACiAJCXByX2VycigiUmVjZWl2ZWQgUEVSU0lTVEVOVF9SRVNFUlZFIENEQiB3aGlsZSBsZWdhY3kiCiAJCQkiIFNQQy0yIHJlc2VydmF0aW9uIGlzIGhlbGQsIHJldHVybmluZyIKIAkJCSIgUkVTRVJWQVRJT05fQ09ORkxJQ1RcbiIpOwotCQlyZXQgPSBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQlyZXQgPSBFSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzc3OSwxMyArMzg0NywxNiBAQAogCSAqIEZJWE1FOiBBIE5VTEwgc3RydWN0IHNlX3Nlc3Npb24gcG9pbnRlciBtZWFucyBhbiB0aGlzIGlzIG5vdCBjb21pbmcgZnJvbQogCSAqIGEgJEZBQlJJQ19NT0QncyBuZXh1cywgYnV0IGZyb20gaW50ZXJuYWwgcGFzc3Rocm91Z2ggb3BzLgogCSAqLwotCWlmICghY21kLT5zZV9zZXNzKQotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CisJaWYgKCFjbWQtPnNlX3Nlc3MpIHsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIAlpZiAoY21kLT5kYXRhX2xlbmd0aCA8IDI0KSB7CiAJCXByX3dhcm4oIlNQQy1QUjogUmVjZWl2ZWQgUFIgT1VUIHBhcmFtZXRlciBsaXN0IgogCQkJIiBsZW5ndGggdG9vIHNtYWxsOiAldVxuIiwgY21kLT5kYXRhX2xlbmd0aCk7Ci0JCXJldCA9IFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQlyZXQgPSAtRUlOVkFMOwogCQlnb3RvIG91dDsKIAl9CiAJLyoKQEAgLTM4MjAsNyArMzg5MSw4IEBACiAJICogU1BFQ19JX1BUPTEgaXMgb25seSB2YWxpZCBmb3IgU2VydmljZSBhY3Rpb246IFJFR0lTVEVSCiAJICovCiAJaWYgKHNwZWNfaV9wdCAmJiAoKGNkYlsxXSAmIDB4MWYpICE9IFBST19SRUdJU1RFUikpIHsKLQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCXJldCA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0OwogCX0KIApAQCAtMzgzNyw3ICszOTA5LDggQEAKIAkgICAgKGNtZC0+ZGF0YV9sZW5ndGggIT0gMjQpKSB7CiAJCXByX3dhcm4oIlNQQy1QUjogUmVjZWl2ZWQgUFIgT1VUIGlsbGVnYWwgcGFyYW1ldGVyIgogCQkJIiBsaXN0IGxlbmd0aDogJXVcbiIsIGNtZC0+ZGF0YV9sZW5ndGgpOwotCQlyZXQgPSBQWVhfVFJBTlNQT1JUX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9QQVJBTUVURVJfTElTVDsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJZ290byBvdXQ7CiAJfQogCS8qCkBAIC0zODc4LDcgKzM5NTEsOCBAQAogCWRlZmF1bHQ6CiAJCXByX2VycigiVW5rbm93biBQRVJTSVNURU5UX1JFU0VSVkVfT1VUIHNlcnZpY2UiCiAJCQkiIGFjdGlvbjogMHglMDJ4XG4iLCBjZGJbMV0gJiAweDFmKTsKLQkJcmV0ID0gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX0NEQl9GSUVMRDsKKwkJcmV0ID0gLUVJTlZBTDsKIAkJYnJlYWs7CiAJfQogCkBAIC0zOTA2LDcgKzM5ODAsOCBAQAogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgOCkgewogCQlwcl9lcnIoIlBSSU4gU0EgUkVBRF9LRVlTIFNDU0kgRGF0YSBMZW5ndGg6ICV1IgogCQkJIiB0b28gc21hbGxcbiIsIGNtZC0+ZGF0YV9sZW5ndGgpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX0NEQl9GSUVMRDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CkBAIC0zOTY1LDcgKzQwNDAsOCBAQAogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgOCkgewogCQlwcl9lcnIoIlBSSU4gU0EgUkVBRF9SRVNFUlZBVElPTlMgU0NTSSBEYXRhIExlbmd0aDogJXUiCiAJCQkiIHRvbyBzbWFsbFxuIiwgY21kLT5kYXRhX2xlbmd0aCk7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX0lOVkFMSURfQ0RCX0ZJRUxEOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfQ0RCX0ZJRUxEOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlidWYgPSB0cmFuc3BvcnRfa21hcF9maXJzdF9kYXRhX3BhZ2UoY21kKTsKQEAgLTQwNDcsNyArNDEyMyw4IEBACiAJaWYgKGNtZC0+ZGF0YV9sZW5ndGggPCA2KSB7CiAJCXByX2VycigiUFJJTiBTQSBSRVBPUlRfQ0FQQUJJTElUSUVTIFNDU0kgRGF0YSBMZW5ndGg6IgogCQkJIiAldSB0b28gc21hbGxcbiIsIGNtZC0+ZGF0YV9sZW5ndGgpOwotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9JTlZBTElEX0NEQl9GSUVMRDsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9JTlZBTElEX0NEQl9GSUVMRDsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJYnVmID0gdHJhbnNwb3J0X2ttYXBfZmlyc3RfZGF0YV9wYWdlKGNtZCk7CkBAIC00MTA4LDcgKzQxODUsOCBAQAogCWlmIChjbWQtPmRhdGFfbGVuZ3RoIDwgOCkgewogCQlwcl9lcnIoIlBSSU4gU0EgUkVBRF9GVUxMX1NUQVRVUyBTQ1NJIERhdGEgTGVuZ3RoOiAldSIKIAkJCSIgdG9vIHNtYWxsXG4iLCBjbWQtPmRhdGFfbGVuZ3RoKTsKLQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9DREJfRklFTEQ7CisJCXJldHVybiAtRUlOVkFMOwogCX0KIAogCWJ1ZiA9IHRyYW5zcG9ydF9rbWFwX2ZpcnN0X2RhdGFfcGFnZShjbWQpOwpAQCAtNDI1NSw3ICs0MzMzLDggQEAKIAkJcHJfZXJyKCJSZWNlaXZlZCBQRVJTSVNURU5UX1JFU0VSVkUgQ0RCIHdoaWxlIGxlZ2FjeSIKIAkJCSIgU1BDLTIgcmVzZXJ2YXRpb24gaXMgaGVsZCwgcmV0dXJuaW5nIgogCQkJIiBSRVNFUlZBVElPTl9DT05GTElDVFxuIik7Ci0JCXJldHVybiBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKIAlzd2l0Y2ggKGNtZC0+dF90YXNrX2NkYlsxXSAmIDB4MWYpIHsKQEAgLTQyNzQsNyArNDM1Myw4IEBACiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJVbmtub3duIFBFUlNJU1RFTlRfUkVTRVJWRV9JTiBzZXJ2aWNlIgogCQkJIiBhY3Rpb246IDB4JTAyeFxuIiwgY21kLT50X3Rhc2tfY2RiWzFdICYgMHgxZik7Ci0JCXJldCA9IFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ7CisJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9DREJfRklFTEQ7CisJCXJldCA9IC1FSU5WQUw7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHNjc2kuYyBiL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3BzY3NpLmMKaW5kZXggZWQzMmUxZS4uOGIxNWU1NiAxMDA2NDQKLS0tIGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcHNjc2kuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9wc2NzaS5jCkBAIC05NjMsNiArOTYzLDcgQEAKIHN0YXRpYyBpbnQgcHNjc2lfbWFwX3NnKHN0cnVjdCBzZV90YXNrICp0YXNrLCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnRhc2tfc2csCiAJCXN0cnVjdCBiaW8gKipoYmlvKQogeworCXN0cnVjdCBzZV9jbWQgKmNtZCA9IHRhc2stPnRhc2tfc2VfY21kOwogCXN0cnVjdCBwc2NzaV9kZXZfdmlydCAqcGR2ID0gdGFzay0+dGFza19zZV9jbWQtPnNlX2Rldi0+ZGV2X3B0cjsKIAl1MzIgdGFza19zZ19udW0gPSB0YXNrLT50YXNrX3NnX25lbnRzOwogCXN0cnVjdCBiaW8gKmJpbyA9IE5VTEwsICp0YmlvID0gTlVMTDsKQEAgLTk3MSw3ICs5NzIsNyBAQAogCXUzMiBkYXRhX2xlbiA9IHRhc2stPnRhc2tfc2l6ZSwgaSwgbGVuLCBieXRlcywgb2ZmOwogCWludCBucl9wYWdlcyA9ICh0YXNrLT50YXNrX3NpemUgKyB0YXNrX3NnWzBdLm9mZnNldCArCiAJCQlQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwotCWludCBucl92ZWNzID0gMCwgcmMsIHJldCA9IFBZWF9UUkFOU1BPUlRfT1VUX09GX01FTU9SWV9SRVNPVVJDRVM7CisJaW50IG5yX3ZlY3MgPSAwLCByYzsKIAlpbnQgcncgPSAodGFzay0+dGFza19kYXRhX2RpcmVjdGlvbiA9PSBETUFfVE9fREVWSUNFKTsKIAogCSpoYmlvID0gTlVMTDsKQEAgLTEwNTgsMTEgKzEwNTksMTMgQEAKIAkJYmlvLT5iaV9uZXh0ID0gTlVMTDsKIAkJYmlvX2VuZGlvKGJpbywgMCk7CS8qIFhYWDogc2hvdWxkIGJlIGVycm9yICovCiAJfQotCXJldHVybiByZXQ7CisJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCXJldHVybiAtRU5PTUVNOwogfQogCiBzdGF0aWMgaW50IHBzY3NpX2RvX3Rhc2soc3RydWN0IHNlX3Rhc2sgKnRhc2spCiB7CisJc3RydWN0IHNlX2NtZCAqY21kID0gdGFzay0+dGFza19zZV9jbWQ7CiAJc3RydWN0IHBzY3NpX2Rldl92aXJ0ICpwZHYgPSB0YXNrLT50YXNrX3NlX2NtZC0+c2VfZGV2LT5kZXZfcHRyOwogCXN0cnVjdCBwc2NzaV9wbHVnaW5fdGFzayAqcHQgPSBQU0NTSV9UQVNLKHRhc2spOwogCXN0cnVjdCByZXF1ZXN0ICpyZXE7CkBAIC0xMDc4LDcgKzEwODEsOSBAQAogCQlpZiAoIXJlcSB8fCBJU19FUlIocmVxKSkgewogCQkJcHJfZXJyKCJQU0NTSTogYmxrX2dldF9yZXF1ZXN0KCkgZmFpbGVkOiAlbGRcbiIsCiAJCQkJCXJlcSA/IElTX0VSUihyZXEpIDogLUVOT01FTSk7Ci0JCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7CisJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0KKwkJCQlUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwkJCXJldHVybiAtRU5PREVWOwogCQl9CiAJfSBlbHNlIHsKIAkJQlVHX09OKCF0YXNrLT50YXNrX3NpemUpOwpAQCAtMTA4Nyw4ICsxMDkyLDExIEBACiAJCSAqIFNldHVwIHRoZSBtYWluIHN0cnVjdCByZXF1ZXN0IGZvciB0aGUgdGFzay0+dGFza19zZ1tdIHBheWxvYWQKIAkJICovCiAJCXJldCA9IHBzY3NpX21hcF9zZyh0YXNrLCB0YXNrLT50YXNrX3NnLCAmaGJpbyk7Ci0JCWlmIChyZXQgPCAwKQotCQkJcmV0dXJuIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOworCQlpZiAocmV0IDwgMCkgeworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9CisJCQkJVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CisJCQlyZXR1cm4gcmV0OworCQl9CiAKIAkJcmVxID0gYmxrX21ha2VfcmVxdWVzdChwZHYtPnBkdl9zZC0+cmVxdWVzdF9xdWV1ZSwgaGJpbywKIAkJCQkgICAgICAgR0ZQX0tFUk5FTCk7CkBAIC0xMTE1LDcgKzExMjMsNyBAQAogCQkJKHRhc2stPnRhc2tfc2VfY21kLT5zYW1fdGFza19hdHRyID09IE1TR19IRUFEX1RBRyksCiAJCQlwc2NzaV9yZXFfZG9uZSk7CiAKLQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9TRU5UX1RPX1RSQU5TUE9SVDsKKwlyZXR1cm4gMDsKIAogZmFpbDoKIAl3aGlsZSAoaGJpbykgewpAQCAtMTEyNCw3ICsxMTMyLDggQEAKIAkJYmlvLT5iaV9uZXh0ID0gTlVMTDsKIAkJYmlvX2VuZGlvKGJpbywgMCk7CS8qIFhYWDogc2hvdWxkIGJlIGVycm9yICovCiAJfQotCXJldHVybiBQWVhfVFJBTlNQT1JUX09VVF9PRl9NRU1PUllfUkVTT1VSQ0VTOworCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKKwlyZXR1cm4gLUVOT01FTTsKIH0KIAogLyoJcHNjc2lfZ2V0X3NlbnNlX2J1ZmZlcigpOgpAQCAtMTE5OCw5ICsxMjA3LDggQEAKIAkJCSIgMHglMDJ4IFJlc3VsdDogMHglMDh4XG4iLCB0YXNrLCBwdC0+cHNjc2lfY2RiWzBdLAogCQkJcHQtPnBzY3NpX3Jlc3VsdCk7CiAJCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047Ci0JCXRhc2stPnRhc2tfZXJyb3Jfc3RhdHVzID0gUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREU7Ci0JCXRhc2stPnRhc2tfc2VfY21kLT50cmFuc3BvcnRfZXJyb3Jfc3RhdHVzID0KLQkJCQkJUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREU7CisJCXRhc2stPnRhc2tfc2VfY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9CisJCQkJCVRDTV9VTlNVUFBPUlRFRF9TQ1NJX09QQ09ERTsKIAkJdHJhbnNwb3J0X2NvbXBsZXRlX3Rhc2sodGFzaywgMCk7CiAJCWJyZWFrOwogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3JkLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9yZC5jCmluZGV4IDUxNThkMzguLjAyZTUxZmEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX3JkLmMKKysrIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfcmQuYwpAQCAtMzQzLDIzNSArMzQzLDc0IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLS8qCXJkX01FTUNQWV9yZWFkKCk6Ci0gKgotICoKLSAqLwotc3RhdGljIGludCByZF9NRU1DUFlfcmVhZChzdHJ1Y3QgcmRfcmVxdWVzdCAqcmVxKQorc3RhdGljIGludCByZF9NRU1DUFkoc3RydWN0IHJkX3JlcXVlc3QgKnJlcSwgdTMyIHJlYWRfcmQpCiB7CiAJc3RydWN0IHNlX3Rhc2sgKnRhc2sgPSAmcmVxLT5yZF90YXNrOwogCXN0cnVjdCByZF9kZXYgKmRldiA9IHJlcS0+cmRfdGFzay50YXNrX3NlX2NtZC0+c2VfZGV2LT5kZXZfcHRyOwogCXN0cnVjdCByZF9kZXZfc2dfdGFibGUgKnRhYmxlOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfZCwgKnNnX3M7Ci0Jdm9pZCAqZHN0LCAqc3JjOwotCXUzMiBpID0gMCwgaiA9IDAsIGRzdF9vZmZzZXQgPSAwLCBzcmNfb2Zmc2V0ID0gMDsKLQl1MzIgbGVuZ3RoLCBwYWdlX2VuZCA9IDAsIHRhYmxlX3NnX2VuZDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnJkX3NnOworCXN0cnVjdCBzZ19tYXBwaW5nX2l0ZXIgbTsKIAl1MzIgcmRfb2Zmc2V0ID0gcmVxLT5yZF9vZmZzZXQ7CisJdTMyIHNyY19sZW47CiAKIAl0YWJsZSA9IHJkX2dldF9zZ190YWJsZShkZXYsIHJlcS0+cmRfcGFnZSk7CiAJaWYgKCF0YWJsZSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQl0YWJsZV9zZ19lbmQgPSAodGFibGUtPnBhZ2VfZW5kX29mZnNldCAtIHJlcS0+cmRfcGFnZSk7Ci0Jc2dfZCA9IHRhc2stPnRhc2tfc2c7Ci0Jc2dfcyA9ICZ0YWJsZS0+c2dfdGFibGVbcmVxLT5yZF9wYWdlIC0gdGFibGUtPnBhZ2Vfc3RhcnRfb2Zmc2V0XTsKKwlyZF9zZyA9ICZ0YWJsZS0+c2dfdGFibGVbcmVxLT5yZF9wYWdlIC0gdGFibGUtPnBhZ2Vfc3RhcnRfb2Zmc2V0XTsKIAotCXByX2RlYnVnKCJSRFsldV06IFJlYWQgTEJBOiAlbGx1LCBTaXplOiAldSBQYWdlOiAldSwgT2Zmc2V0OiIKLQkJIiAldVxuIiwgZGV2LT5yZF9kZXZfaWQsIHRhc2stPnRhc2tfbGJhLCByZXEtPnJkX3NpemUsCi0JCXJlcS0+cmRfcGFnZSwgcmVxLT5yZF9vZmZzZXQpOworCXByX2RlYnVnKCJSRFsldV06ICVzIExCQTogJWxsdSwgU2l6ZTogJXUgUGFnZTogJXUsIE9mZnNldDogJXVcbiIsCisJCQlkZXYtPnJkX2Rldl9pZCwgcmVhZF9yZCA/ICJSZWFkIiA6ICJXcml0ZSIsCisJCQl0YXNrLT50YXNrX2xiYSwgcmVxLT5yZF9zaXplLCByZXEtPnJkX3BhZ2UsCisJCQlyZF9vZmZzZXQpOwogCi0Jc3JjX29mZnNldCA9IHJkX29mZnNldDsKLQorCXNyY19sZW4gPSBQQUdFX1NJWkUgLSByZF9vZmZzZXQ7CisJc2dfbWl0ZXJfc3RhcnQoJm0sIHRhc2stPnRhc2tfc2csIHRhc2stPnRhc2tfc2dfbmVudHMsCisJCQlyZWFkX3JkID8gU0dfTUlURVJfVE9fU0cgOiBTR19NSVRFUl9GUk9NX1NHKTsKIAl3aGlsZSAocmVxLT5yZF9zaXplKSB7Ci0JCWlmICgoc2dfZFtpXS5sZW5ndGggLSBkc3Rfb2Zmc2V0KSA8Ci0JCSAgICAoc2dfc1tqXS5sZW5ndGggLSBzcmNfb2Zmc2V0KSkgewotCQkJbGVuZ3RoID0gKHNnX2RbaV0ubGVuZ3RoIC0gZHN0X29mZnNldCk7CisJCXUzMiBsZW47CisJCXZvaWQgKnJkX2FkZHI7CiAKLQkJCXByX2RlYnVnKCJTdGVwIDEgLSBzZ19kWyVkXTogJXAgbGVuZ3RoOiAlZCIKLQkJCQkiIG9mZnNldDogJXUgc2dfc1slZF0ubGVuZ3RoOiAldVxuIiwgaSwKLQkJCQkmc2dfZFtpXSwgc2dfZFtpXS5sZW5ndGgsIHNnX2RbaV0ub2Zmc2V0LCBqLAotCQkJCXNnX3Nbal0ubGVuZ3RoKTsKLQkJCXByX2RlYnVnKCJTdGVwIDEgLSBsZW5ndGg6ICV1IGRzdF9vZmZzZXQ6ICV1IgotCQkJCSIgc3JjX29mZnNldDogJXVcbiIsIGxlbmd0aCwgZHN0X29mZnNldCwKLQkJCQlzcmNfb2Zmc2V0KTsKKwkJc2dfbWl0ZXJfbmV4dCgmbSk7CisJCWxlbiA9IG1pbigodTMyKW0ubGVuZ3RoLCBzcmNfbGVuKTsKKwkJbS5jb25zdW1lZCA9IGxlbjsKIAotCQkJaWYgKGxlbmd0aCA+IHJlcS0+cmRfc2l6ZSkKLQkJCQlsZW5ndGggPSByZXEtPnJkX3NpemU7CisJCXJkX2FkZHIgPSBzZ192aXJ0KHJkX3NnKSArIHJkX29mZnNldDsKIAotCQkJZHN0ID0gc2dfdmlydCgmc2dfZFtpKytdKSArIGRzdF9vZmZzZXQ7Ci0JCQlCVUdfT04oIWRzdCk7CisJCWlmIChyZWFkX3JkKQorCQkJbWVtY3B5KG0uYWRkciwgcmRfYWRkciwgbGVuKTsKKwkJZWxzZQorCQkJbWVtY3B5KHJkX2FkZHIsIG0uYWRkciwgbGVuKTsKIAotCQkJc3JjID0gc2dfdmlydCgmc2dfc1tqXSkgKyBzcmNfb2Zmc2V0OwotCQkJQlVHX09OKCFzcmMpOwotCi0JCQlkc3Rfb2Zmc2V0ID0gMDsKLQkJCXNyY19vZmZzZXQgPSBsZW5ndGg7Ci0JCQlwYWdlX2VuZCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQlsZW5ndGggPSAoc2dfc1tqXS5sZW5ndGggLSBzcmNfb2Zmc2V0KTsKLQotCQkJcHJfZGVidWcoIlN0ZXAgMiAtIHNnX2RbJWRdOiAlcCBsZW5ndGg6ICVkIgotCQkJCSIgb2Zmc2V0OiAldSBzZ19zWyVkXS5sZW5ndGg6ICV1XG4iLCBpLAotCQkJCSZzZ19kW2ldLCBzZ19kW2ldLmxlbmd0aCwgc2dfZFtpXS5vZmZzZXQsCi0JCQkJaiwgc2dfc1tqXS5sZW5ndGgpOwotCQkJcHJfZGVidWcoIlN0ZXAgMiAtIGxlbmd0aDogJXUgZHN0X29mZnNldDogJXUiCi0JCQkJIiBzcmNfb2Zmc2V0OiAldVxuIiwgbGVuZ3RoLCBkc3Rfb2Zmc2V0LAotCQkJCXNyY19vZmZzZXQpOwotCi0JCQlpZiAobGVuZ3RoID4gcmVxLT5yZF9zaXplKQotCQkJCWxlbmd0aCA9IHJlcS0+cmRfc2l6ZTsKLQotCQkJZHN0ID0gc2dfdmlydCgmc2dfZFtpXSkgKyBkc3Rfb2Zmc2V0OwotCQkJQlVHX09OKCFkc3QpOwotCi0JCQlpZiAoc2dfZFtpXS5sZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQkJaSsrOwotCQkJCWRzdF9vZmZzZXQgPSAwOwotCQkJfSBlbHNlCi0JCQkJZHN0X29mZnNldCA9IGxlbmd0aDsKLQotCQkJc3JjID0gc2dfdmlydCgmc2dfc1tqKytdKSArIHNyY19vZmZzZXQ7Ci0JCQlCVUdfT04oIXNyYyk7Ci0KLQkJCXNyY19vZmZzZXQgPSAwOwotCQkJcGFnZV9lbmQgPSAxOwotCQl9Ci0KLQkJbWVtY3B5KGRzdCwgc3JjLCBsZW5ndGgpOwotCi0JCXByX2RlYnVnKCJwYWdlOiAldSwgcmVtYWluaW5nIHNpemU6ICV1LCBsZW5ndGg6ICV1LCIKLQkJCSIgaTogJXUsIGo6ICV1XG4iLCByZXEtPnJkX3BhZ2UsCi0JCQkocmVxLT5yZF9zaXplIC0gbGVuZ3RoKSwgbGVuZ3RoLCBpLCBqKTsKLQotCQlyZXEtPnJkX3NpemUgLT0gbGVuZ3RoOworCQlyZXEtPnJkX3NpemUgLT0gbGVuOwogCQlpZiAoIXJlcS0+cmRfc2l6ZSkKLQkJCXJldHVybiAwOwotCi0JCWlmICghcGFnZV9lbmQpCiAJCQljb250aW51ZTsKIAotCQlpZiAoKytyZXEtPnJkX3BhZ2UgPD0gdGFibGUtPnBhZ2VfZW5kX29mZnNldCkgewotCQkJcHJfZGVidWcoInBhZ2U6ICV1IGluIHNhbWUgcGFnZSB0YWJsZVxuIiwKLQkJCQlyZXEtPnJkX3BhZ2UpOworCQlzcmNfbGVuIC09IGxlbjsKKwkJaWYgKHNyY19sZW4pIHsKKwkJCXJkX29mZnNldCArPSBsZW47CiAJCQljb250aW51ZTsKIAkJfQogCi0JCXByX2RlYnVnKCJnZXR0aW5nIG5ldyBwYWdlIHRhYmxlIGZvciBwYWdlOiAldVxuIiwKLQkJCQlyZXEtPnJkX3BhZ2UpOworCQkvKiByZCBwYWdlIGNvbXBsZXRlZCwgbmV4dCBvbmUgcGxlYXNlICovCisJCXJlcS0+cmRfcGFnZSsrOworCQlyZF9vZmZzZXQgPSAwOworCQlzcmNfbGVuID0gUEFHRV9TSVpFOworCQlpZiAocmVxLT5yZF9wYWdlIDw9IHRhYmxlLT5wYWdlX2VuZF9vZmZzZXQpIHsKKwkJCXJkX3NnKys7CisJCQljb250aW51ZTsKKwkJfQogCiAJCXRhYmxlID0gcmRfZ2V0X3NnX3RhYmxlKGRldiwgcmVxLT5yZF9wYWdlKTsKLQkJaWYgKCF0YWJsZSkKKwkJaWYgKCF0YWJsZSkgeworCQkJc2dfbWl0ZXJfc3RvcCgmbSk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlzZ19zID0gJnRhYmxlLT5zZ190YWJsZVtqID0gMF07Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qCXJkX01FTUNQWV93cml0ZSgpOgotICoKLSAqCi0gKi8KLXN0YXRpYyBpbnQgcmRfTUVNQ1BZX3dyaXRlKHN0cnVjdCByZF9yZXF1ZXN0ICpyZXEpCi17Ci0Jc3RydWN0IHNlX3Rhc2sgKnRhc2sgPSAmcmVxLT5yZF90YXNrOwotCXN0cnVjdCByZF9kZXYgKmRldiA9IHJlcS0+cmRfdGFzay50YXNrX3NlX2NtZC0+c2VfZGV2LT5kZXZfcHRyOwotCXN0cnVjdCByZF9kZXZfc2dfdGFibGUgKnRhYmxlOwotCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dfZCwgKnNnX3M7Ci0Jdm9pZCAqZHN0LCAqc3JjOwotCXUzMiBpID0gMCwgaiA9IDAsIGRzdF9vZmZzZXQgPSAwLCBzcmNfb2Zmc2V0ID0gMDsKLQl1MzIgbGVuZ3RoLCBwYWdlX2VuZCA9IDAsIHRhYmxlX3NnX2VuZDsKLQl1MzIgcmRfb2Zmc2V0ID0gcmVxLT5yZF9vZmZzZXQ7Ci0KLQl0YWJsZSA9IHJkX2dldF9zZ190YWJsZShkZXYsIHJlcS0+cmRfcGFnZSk7Ci0JaWYgKCF0YWJsZSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl0YWJsZV9zZ19lbmQgPSAodGFibGUtPnBhZ2VfZW5kX29mZnNldCAtIHJlcS0+cmRfcGFnZSk7Ci0Jc2dfZCA9ICZ0YWJsZS0+c2dfdGFibGVbcmVxLT5yZF9wYWdlIC0gdGFibGUtPnBhZ2Vfc3RhcnRfb2Zmc2V0XTsKLQlzZ19zID0gdGFzay0+dGFza19zZzsKLQotCXByX2RlYnVnKCJSRFslZF0gV3JpdGUgTEJBOiAlbGx1LCBTaXplOiAldSwgUGFnZTogJXUsIgotCQkiIE9mZnNldDogJXVcbiIsIGRldi0+cmRfZGV2X2lkLCB0YXNrLT50YXNrX2xiYSwgcmVxLT5yZF9zaXplLAotCQlyZXEtPnJkX3BhZ2UsIHJlcS0+cmRfb2Zmc2V0KTsKLQotCWRzdF9vZmZzZXQgPSByZF9vZmZzZXQ7Ci0KLQl3aGlsZSAocmVxLT5yZF9zaXplKSB7Ci0JCWlmICgoc2dfc1tpXS5sZW5ndGggLSBzcmNfb2Zmc2V0KSA8Ci0JCSAgICAoc2dfZFtqXS5sZW5ndGggLSBkc3Rfb2Zmc2V0KSkgewotCQkJbGVuZ3RoID0gKHNnX3NbaV0ubGVuZ3RoIC0gc3JjX29mZnNldCk7Ci0KLQkJCXByX2RlYnVnKCJTdGVwIDEgLSBzZ19zWyVkXTogJXAgbGVuZ3RoOiAlZCIKLQkJCQkiIG9mZnNldDogJWQgc2dfZFslZF0ubGVuZ3RoOiAldVxuIiwgaSwKLQkJCQkmc2dfc1tpXSwgc2dfc1tpXS5sZW5ndGgsIHNnX3NbaV0ub2Zmc2V0LAotCQkJCWosIHNnX2Rbal0ubGVuZ3RoKTsKLQkJCXByX2RlYnVnKCJTdGVwIDEgLSBsZW5ndGg6ICV1IHNyY19vZmZzZXQ6ICV1IgotCQkJCSIgZHN0X29mZnNldDogJXVcbiIsIGxlbmd0aCwgc3JjX29mZnNldCwKLQkJCQlkc3Rfb2Zmc2V0KTsKLQotCQkJaWYgKGxlbmd0aCA+IHJlcS0+cmRfc2l6ZSkKLQkJCQlsZW5ndGggPSByZXEtPnJkX3NpemU7Ci0KLQkJCXNyYyA9IHNnX3ZpcnQoJnNnX3NbaSsrXSkgKyBzcmNfb2Zmc2V0OwotCQkJQlVHX09OKCFzcmMpOwotCi0JCQlkc3QgPSBzZ192aXJ0KCZzZ19kW2pdKSArIGRzdF9vZmZzZXQ7Ci0JCQlCVUdfT04oIWRzdCk7Ci0KLQkJCXNyY19vZmZzZXQgPSAwOwotCQkJZHN0X29mZnNldCA9IGxlbmd0aDsKLQkJCXBhZ2VfZW5kID0gMDsKLQkJfSBlbHNlIHsKLQkJCWxlbmd0aCA9IChzZ19kW2pdLmxlbmd0aCAtIGRzdF9vZmZzZXQpOwotCi0JCQlwcl9kZWJ1ZygiU3RlcCAyIC0gc2dfc1slZF06ICVwIGxlbmd0aDogJWQiCi0JCQkJIiBvZmZzZXQ6ICVkIHNnX2RbJWRdLmxlbmd0aDogJXVcbiIsIGksCi0JCQkJJnNnX3NbaV0sIHNnX3NbaV0ubGVuZ3RoLCBzZ19zW2ldLm9mZnNldCwKLQkJCQlqLCBzZ19kW2pdLmxlbmd0aCk7Ci0JCQlwcl9kZWJ1ZygiU3RlcCAyIC0gbGVuZ3RoOiAldSBzcmNfb2Zmc2V0OiAldSIKLQkJCQkiIGRzdF9vZmZzZXQ6ICV1XG4iLCBsZW5ndGgsIHNyY19vZmZzZXQsCi0JCQkJZHN0X29mZnNldCk7Ci0KLQkJCWlmIChsZW5ndGggPiByZXEtPnJkX3NpemUpCi0JCQkJbGVuZ3RoID0gcmVxLT5yZF9zaXplOwotCi0JCQlzcmMgPSBzZ192aXJ0KCZzZ19zW2ldKSArIHNyY19vZmZzZXQ7Ci0JCQlCVUdfT04oIXNyYyk7Ci0KLQkJCWlmIChzZ19zW2ldLmxlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCQlpKys7Ci0JCQkJc3JjX29mZnNldCA9IDA7Ci0JCQl9IGVsc2UKLQkJCQlzcmNfb2Zmc2V0ID0gbGVuZ3RoOwotCi0JCQlkc3QgPSBzZ192aXJ0KCZzZ19kW2orK10pICsgZHN0X29mZnNldDsKLQkJCUJVR19PTighZHN0KTsKLQotCQkJZHN0X29mZnNldCA9IDA7Ci0JCQlwYWdlX2VuZCA9IDE7CiAJCX0KIAotCQltZW1jcHkoZHN0LCBzcmMsIGxlbmd0aCk7Ci0KLQkJcHJfZGVidWcoInBhZ2U6ICV1LCByZW1haW5pbmcgc2l6ZTogJXUsIGxlbmd0aDogJXUsIgotCQkJIiBpOiAldSwgajogJXVcbiIsIHJlcS0+cmRfcGFnZSwKLQkJCShyZXEtPnJkX3NpemUgLSBsZW5ndGgpLCBsZW5ndGgsIGksIGopOwotCi0JCXJlcS0+cmRfc2l6ZSAtPSBsZW5ndGg7Ci0JCWlmICghcmVxLT5yZF9zaXplKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKCFwYWdlX2VuZCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmICgrK3JlcS0+cmRfcGFnZSA8PSB0YWJsZS0+cGFnZV9lbmRfb2Zmc2V0KSB7Ci0JCQlwcl9kZWJ1ZygicGFnZTogJXUgaW4gc2FtZSBwYWdlIHRhYmxlXG4iLAotCQkJCXJlcS0+cmRfcGFnZSk7Ci0JCQljb250aW51ZTsKLQkJfQotCi0JCXByX2RlYnVnKCJnZXR0aW5nIG5ldyBwYWdlIHRhYmxlIGZvciBwYWdlOiAldVxuIiwKLQkJCQlyZXEtPnJkX3BhZ2UpOwotCi0JCXRhYmxlID0gcmRfZ2V0X3NnX3RhYmxlKGRldiwgcmVxLT5yZF9wYWdlKTsKLQkJaWYgKCF0YWJsZSkKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXNnX2QgPSAmdGFibGUtPnNnX3RhYmxlW2ogPSAwXTsKKwkJLyogc2luY2Ugd2UgaW5jcmVtZW50LCB0aGUgZmlyc3Qgc2cgZW50cnkgaXMgY29ycmVjdCAqLworCQlyZF9zZyA9IHRhYmxlLT5zZ190YWJsZTsKIAl9Ci0KKwlzZ19taXRlcl9zdG9wKCZtKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTgzLDI4ICs0MjIsMjEgQEAKIHsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSB0YXNrLT50YXNrX3NlX2NtZC0+c2VfZGV2OwogCXN0cnVjdCByZF9yZXF1ZXN0ICpyZXEgPSBSRF9SRVEodGFzayk7Ci0JdW5zaWduZWQgbG9uZyBsb25nIGxiYTsKKwl1NjQgdG1wOwogCWludCByZXQ7CiAKLQlyZXEtPnJkX3BhZ2UgPSAodGFzay0+dGFza19sYmEgKiBkZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuYmxvY2tfc2l6ZSkgLyBQQUdFX1NJWkU7Ci0JbGJhID0gdGFzay0+dGFza19sYmE7Ci0JcmVxLT5yZF9vZmZzZXQgPSAoZG9fZGl2KGxiYSwKLQkJCSAgKFBBR0VfU0laRSAvIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5ibG9ja19zaXplKSkpICoKLQkJCSAgIGRldi0+c2Vfc3ViX2Rldi0+c2VfZGV2X2F0dHJpYi5ibG9ja19zaXplOworCXRtcCA9IHRhc2stPnRhc2tfbGJhICogZGV2LT5zZV9zdWJfZGV2LT5zZV9kZXZfYXR0cmliLmJsb2NrX3NpemU7CisJcmVxLT5yZF9vZmZzZXQgPSBkb19kaXYodG1wLCBQQUdFX1NJWkUpOworCXJlcS0+cmRfcGFnZSA9IHRtcDsKIAlyZXEtPnJkX3NpemUgPSB0YXNrLT50YXNrX3NpemU7CiAKLQlpZiAodGFzay0+dGFza19kYXRhX2RpcmVjdGlvbiA9PSBETUFfRlJPTV9ERVZJQ0UpCi0JCXJldCA9IHJkX01FTUNQWV9yZWFkKHJlcSk7Ci0JZWxzZQotCQlyZXQgPSByZF9NRU1DUFlfd3JpdGUocmVxKTsKLQorCXJldCA9IHJkX01FTUNQWShyZXEsIHRhc2stPnRhc2tfZGF0YV9kaXJlY3Rpb24gPT0gRE1BX0ZST01fREVWSUNFKTsKIAlpZiAocmV0ICE9IDApCiAJCXJldHVybiByZXQ7CiAKIAl0YXNrLT50YXNrX3Njc2lfc3RhdHVzID0gR09PRDsKIAl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCAxKTsKLQotCXJldHVybiBQWVhfVFJBTlNQT1JUX1NFTlRfVE9fVFJBTlNQT1JUOworCXJldHVybiAwOwogfQogCiAvKglyZF9mcmVlX3Rhc2soKTogKFBhcnQgb2Ygc2Vfc3Vic3lzdGVtX2FwaV90IHRlbXBsYXRlKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdG1yLmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90bXIuYwppbmRleCAyMTdlMjlkLi42ODQ1MjI4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90bXIuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90bXIuYwpAQCAtMzQ1LDEwICszNDUsNiBAQAogCQkJIiAlZCB0X2ZlX2NvdW50OiAlZFxuIiwgKHByZWVtcHRfYW5kX2Fib3J0X2xpc3QpID8KIAkJCSJQcmVlbXB0IiA6ICIiLCBjbWQsIGNtZC0+dF9zdGF0ZSwKIAkJCWF0b21pY19yZWFkKCZjbWQtPnRfZmVfY291bnQpKTsKLQkJLyoKLQkJICogU2lnbmFsIHRoYXQgdGhlIGNvbW1hbmQgaGFzIGZhaWxlZCB2aWEgY21kLT5zZV9jbWRfZmxhZ3MsCi0JCSAqLwotCQl0cmFuc3BvcnRfbmV3X2NtZF9mYWlsdXJlKGNtZCk7CiAKIAkJY29yZV90bXJfaGFuZGxlX3Rhc19hYm9ydCh0bXJfbmFjbCwgY21kLCB0YXMsCiAJCQkJYXRvbWljX3JlYWQoJmNtZC0+dF9mZV9jb3VudCkpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmMgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwppbmRleCAzNDAwYWU2Li4wMjU3NjU4IDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYworKysgYi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV90cmFuc3BvcnQuYwpAQCAtNjEsNyArNjEsNiBAQAogc3RhdGljIGludCBzdWJfYXBpX2luaXRpYWxpemVkOwogCiBzdGF0aWMgc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QgKnRhcmdldF9jb21wbGV0aW9uX3dxOwotc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpzZV9jbWRfY2FjaGU7CiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNlX3Nlc3NfY2FjaGU7CiBzdHJ1Y3Qga21lbV9jYWNoZSAqc2VfdG1yX3JlcV9jYWNoZTsKIHN0cnVjdCBrbWVtX2NhY2hlICpzZV91YV9jYWNoZTsKQEAgLTgyLDI0ICs4MSwxOCBAQAogc3RhdGljIHZvaWQgdHJhbnNwb3J0X3B1dF9jbWQoc3RydWN0IHNlX2NtZCAqY21kKTsKIHN0YXRpYyB2b2lkIHRyYW5zcG9ydF9yZW1vdmVfY21kX2Zyb21fcXVldWUoc3RydWN0IHNlX2NtZCAqY21kKTsKIHN0YXRpYyBpbnQgdHJhbnNwb3J0X3NldF9zZW5zZV9jb2RlcyhzdHJ1Y3Qgc2VfY21kICpjbWQsIHU4IGFzYywgdTggYXNjcSk7Ci1zdGF0aWMgdm9pZCB0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoc3RydWN0IHNlX2NtZCAqLCBpbnQsIGludCk7CitzdGF0aWMgdm9pZCB0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoc3RydWN0IHNlX2NtZCAqKTsKIHN0YXRpYyB2b2lkIHRhcmdldF9jb21wbGV0ZV9va193b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIGludCBpbml0X3NlX2ttZW1fY2FjaGVzKHZvaWQpCiB7Ci0Jc2VfY21kX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInNlX2NtZF9jYWNoZSIsCi0JCQlzaXplb2Yoc3RydWN0IHNlX2NtZCksIF9fYWxpZ25vZl9fKHN0cnVjdCBzZV9jbWQpLCAwLCBOVUxMKTsKLQlpZiAoIXNlX2NtZF9jYWNoZSkgewotCQlwcl9lcnIoImttZW1fY2FjaGVfY3JlYXRlIGZvciBzdHJ1Y3Qgc2VfY21kIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0OwotCX0KIAlzZV90bXJfcmVxX2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInNlX3Rtcl9jYWNoZSIsCiAJCQlzaXplb2Yoc3RydWN0IHNlX3Rtcl9yZXEpLCBfX2FsaWdub2ZfXyhzdHJ1Y3Qgc2VfdG1yX3JlcSksCiAJCQkwLCBOVUxMKTsKIAlpZiAoIXNlX3Rtcl9yZXFfY2FjaGUpIHsKIAkJcHJfZXJyKCJrbWVtX2NhY2hlX2NyZWF0ZSgpIGZvciBzdHJ1Y3Qgc2VfdG1yX3JlcSIKIAkJCQkiIGZhaWxlZFxuIik7Ci0JCWdvdG8gb3V0X2ZyZWVfY21kX2NhY2hlOworCQlnb3RvIG91dDsKIAl9CiAJc2Vfc2Vzc19jYWNoZSA9IGttZW1fY2FjaGVfY3JlYXRlKCJzZV9zZXNzX2NhY2hlIiwKIAkJCXNpemVvZihzdHJ1Y3Qgc2Vfc2Vzc2lvbiksIF9fYWxpZ25vZl9fKHN0cnVjdCBzZV9zZXNzaW9uKSwKQEAgLTE4Miw4ICsxNzUsNiBAQAogCWttZW1fY2FjaGVfZGVzdHJveShzZV9zZXNzX2NhY2hlKTsKIG91dF9mcmVlX3Rtcl9yZXFfY2FjaGU6CiAJa21lbV9jYWNoZV9kZXN0cm95KHNlX3Rtcl9yZXFfY2FjaGUpOwotb3V0X2ZyZWVfY21kX2NhY2hlOgotCWttZW1fY2FjaGVfZGVzdHJveShzZV9jbWRfY2FjaGUpOwogb3V0OgogCXJldHVybiAtRU5PTUVNOwogfQpAQCAtMTkxLDcgKzE4Miw2IEBACiB2b2lkIHJlbGVhc2Vfc2Vfa21lbV9jYWNoZXModm9pZCkKIHsKIAlkZXN0cm95X3dvcmtxdWV1ZSh0YXJnZXRfY29tcGxldGlvbl93cSk7Ci0Ja21lbV9jYWNoZV9kZXN0cm95KHNlX2NtZF9jYWNoZSk7CiAJa21lbV9jYWNoZV9kZXN0cm95KHNlX3Rtcl9yZXFfY2FjaGUpOwogCWttZW1fY2FjaGVfZGVzdHJveShzZV9zZXNzX2NhY2hlKTsKIAlrbWVtX2NhY2hlX2Rlc3Ryb3koc2VfdWFfY2FjaGUpOwpAQCAtNjgwLDkgKzY3MCw5IEBACiAJCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBHT09EOwogCX0gZWxzZSB7CiAJCXRhc2stPnRhc2tfc2NzaV9zdGF0dXMgPSBTQU1fU1RBVF9DSEVDS19DT05ESVRJT047Ci0JCXRhc2stPnRhc2tfZXJyb3Jfc3RhdHVzID0gUFlYX1RSQU5TUE9SVF9JTExFR0FMX1JFUVVFU1Q7Ci0JCXRhc2stPnRhc2tfc2VfY21kLT50cmFuc3BvcnRfZXJyb3Jfc3RhdHVzID0KLQkJCQkJUFlYX1RSQU5TUE9SVF9JTExFR0FMX1JFUVVFU1Q7CisJCXRhc2stPnRhc2tfc2VfY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9CisJCQkJVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CisKIAl9CiAKIAl0cmFuc3BvcnRfY29tcGxldGVfdGFzayh0YXNrLCBnb29kKTsKQEAgLTY5Myw3ICs2ODMsNyBAQAogewogCXN0cnVjdCBzZV9jbWQgKmNtZCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc2VfY21kLCB3b3JrKTsKIAotCXRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShjbWQsIDEsIDEpOworCXRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShjbWQpOwogfQogCiAvKgl0cmFuc3BvcnRfY29tcGxldGVfdGFzaygpOgpAQCAtNzU1LDEwICs3NDUsMTEgQEAKIAlpZiAoY21kLT50X3Rhc2tzX2ZhaWxlZCkgewogCQlpZiAoIXRhc2stPnRhc2tfZXJyb3Jfc3RhdHVzKSB7CiAJCQl0YXNrLT50YXNrX2Vycm9yX3N0YXR1cyA9Ci0JCQkJUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREU7Ci0JCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPQotCQkJCVBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOworCQkJCVRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9CisJCQkJVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CiAJCX0KKwogCQlJTklUX1dPUksoJmNtZC0+d29yaywgdGFyZ2V0X2NvbXBsZXRlX2ZhaWx1cmVfd29yayk7CiAJfSBlbHNlIHsKIAkJYXRvbWljX3NldCgmY21kLT50X3RyYW5zcG9ydF9jb21wbGV0ZSwgMSk7CkBAIC0xMzM1LDIzICsxMzI2LDE3IEBACiAJZGV2LT5zZV9oYmEJCT0gaGJhOwogCWRldi0+c2Vfc3ViX2RldgkJPSBzZV9kZXY7CiAJZGV2LT50cmFuc3BvcnQJCT0gdHJhbnNwb3J0OwotCWF0b21pY19zZXQoJmRldi0+YWN0aXZlX2NtZHMsIDApOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmRldl9saXN0KTsKIAlJTklUX0xJU1RfSEVBRCgmZGV2LT5kZXZfc2VwX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmRldl90bXJfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+ZXhlY3V0ZV90YXNrX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPmRlbGF5ZWRfY21kX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZkZXYtPm9yZGVyZWRfY21kX2xpc3QpOwogCUlOSVRfTElTVF9IRUFEKCZkZXYtPnN0YXRlX3Rhc2tfbGlzdCk7CiAJSU5JVF9MSVNUX0hFQUQoJmRldi0+cWZfY21kX2xpc3QpOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPmV4ZWN1dGVfdGFza19sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5kZWxheWVkX2NtZF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmZGV2LT5vcmRlcmVkX2NtZF9sb2NrKTsKLQlzcGluX2xvY2tfaW5pdCgmZGV2LT5zdGF0ZV90YXNrX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZkZXYtPmRldl9hbHVhX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPmRldl9yZXNlcnZhdGlvbl9sb2NrKTsKIAlzcGluX2xvY2tfaW5pdCgmZGV2LT5kZXZfc3RhdHVzX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZkZXYtPmRldl9zdGF0dXNfdGhyX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnNlX3BvcnRfbG9jayk7CiAJc3Bpbl9sb2NrX2luaXQoJmRldi0+c2VfdG1yX2xvY2spOwogCXNwaW5fbG9ja19pbml0KCZkZXYtPnFmX2NtZF9sb2NrKTsKQEAgLTE1MDcsNyArMTQ5Miw2IEBACiB7CiAJSU5JVF9MSVNUX0hFQUQoJmNtZC0+c2VfbHVuX25vZGUpOwogCUlOSVRfTElTVF9IRUFEKCZjbWQtPnNlX2RlbGF5ZWRfbm9kZSk7Ci0JSU5JVF9MSVNUX0hFQUQoJmNtZC0+c2Vfb3JkZXJlZF9ub2RlKTsKIAlJTklUX0xJU1RfSEVBRCgmY21kLT5zZV9xZl9ub2RlKTsKIAlJTklUX0xJU1RfSEVBRCgmY21kLT5zZV9xdWV1ZV9ub2RlKTsKIAlJTklUX0xJU1RfSEVBRCgmY21kLT5zZV9jbWRfbGlzdCk7CkBAIC0xNTczLDYgKzE1NTcsOCBAQAogCQlwcl9lcnIoIlJlY2VpdmVkIFNDU0kgQ0RCIHdpdGggY29tbWFuZF9zaXplOiAlZCB0aGF0IgogCQkJIiBleGNlZWRzIFNDU0lfTUFYX1ZBUkxFTl9DREJfU0laRTogJWRcbiIsCiAJCQlzY3NpX2NvbW1hbmRfc2l6ZShjZGIpLCBTQ1NJX01BWF9WQVJMRU5fQ0RCX1NJWkUpOworCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DREJfRVhDRVBUSU9OOworCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfQ0RCX0ZJRUxEOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJLyoKQEAgLTE1ODgsNiArMTU3NCw5IEBACiAJCQkJIiAldSA+IHNpemVvZihjbWQtPl9fdF90YXNrX2NkYik6ICVsdSBvcHNcbiIsCiAJCQkJc2NzaV9jb21tYW5kX3NpemUoY2RiKSwKIAkJCQkodW5zaWduZWQgbG9uZylzaXplb2YoY21kLT5fX3RfdGFza19jZGIpKTsKKwkJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047CisJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0KKwkJCQkJVENNX0xPR0lDQUxfVU5JVF9DT01NVU5JQ0FUSU9OX0ZBSUxVUkU7CiAJCQlyZXR1cm4gLUVOT01FTTsKIAkJfQogCX0gZWxzZQpAQCAtMTY1OCwxMSArMTY0Nyw5IEBACiAJICogYW5kIGNhbGwgdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKCkgaWYgbmVjZXNzYXJ5Li4KIAkgKi8KIAlyZXQgPSB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKGNtZCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJY21kLT50cmFuc3BvcnRfZXJyb3Jfc3RhdHVzID0gcmV0OwotCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kLCAwLAotCQkJCShjbWQtPmRhdGFfZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpKTsKLQl9CisJaWYgKHJldCA8IDApCisJCXRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShjbWQpOworCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKHRyYW5zcG9ydF9oYW5kbGVfY2RiX2RpcmVjdCk7CkBAIC0xNzk4LDIwICsxNzg1LDE2IEBACiAvKgogICogSGFuZGxlIFNBTS1lc3F1ZSBlbXVsYXRpb24gZm9yIGdlbmVyaWMgdHJhbnNwb3J0IHJlcXVlc3QgZmFpbHVyZXMuCiAgKi8KLXN0YXRpYyB2b2lkIHRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZSgKLQlzdHJ1Y3Qgc2VfY21kICpjbWQsCi0JaW50IGNvbXBsZXRlLAotCWludCBzYykKK3N0YXRpYyB2b2lkIHRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShzdHJ1Y3Qgc2VfY21kICpjbWQpCiB7CiAJaW50IHJldCA9IDA7CiAKIAlwcl9kZWJ1ZygiLS0tLS1bIFN0b3JhZ2UgRW5naW5lIEV4Y2VwdGlvbiBmb3IgY21kOiAlcCBJVFQ6IDB4JTA4eCIKIAkJIiBDREI6IDB4JTAyeFxuIiwgY21kLCBjbWQtPnNlX3Rmby0+Z2V0X3Rhc2tfdGFnKGNtZCksCiAJCWNtZC0+dF90YXNrX2NkYlswXSk7Ci0JcHJfZGVidWcoIi0tLS0tWyBpX3N0YXRlOiAlZCB0X3N0YXRlOiAlZCB0cmFuc3BvcnRfZXJyb3Jfc3RhdHVzOiAlZFxuIiwKKwlwcl9kZWJ1ZygiLS0tLS1bIGlfc3RhdGU6ICVkIHRfc3RhdGU6ICVkIHNjc2lfc2Vuc2VfcmVhc29uOiAlZFxuIiwKIAkJY21kLT5zZV90Zm8tPmdldF9jbWRfc3RhdGUoY21kKSwKLQkJY21kLT50X3N0YXRlLAotCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMpOworCQljbWQtPnRfc3RhdGUsIGNtZC0+c2NzaV9zZW5zZV9yZWFzb24pOwogCXByX2RlYnVnKCItLS0tLVsgdF90YXNrczogJWQgdF90YXNrX2NkYnNfbGVmdDogJWQiCiAJCSIgdF90YXNrX2NkYnNfc2VudDogJWQgdF90YXNrX2NkYnNfZXhfbGVmdDogJWQgLS0iCiAJCSIgdF90cmFuc3BvcnRfYWN0aXZlOiAlZCB0X3RyYW5zcG9ydF9zdG9wOiAlZCIKQEAgLTE4MjksNDYgKzE4MTIsMTkgQEAKIAlpZiAoY21kLT5zZV9kZXYtPmRldl90YXNrX2F0dHJfdHlwZSA9PSBTQU1fVEFTS19BVFRSX0VNVUxBVEVEKQogCQl0cmFuc3BvcnRfY29tcGxldGVfdGFza19hdHRyKGNtZCk7CiAKLQlpZiAoY29tcGxldGUpIHsKLQkJY21kLT50cmFuc3BvcnRfZXJyb3Jfc3RhdHVzID0gUFlYX1RSQU5TUE9SVF9MVV9DT01NX0ZBSUxVUkU7Ci0JfQotCi0Jc3dpdGNoIChjbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMpIHsKLQljYXNlIFBZWF9UUkFOU1BPUlRfVU5LTk9XTl9TQU1fT1BDT0RFOgotCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1VOU1VQUE9SVEVEX1NDU0lfT1BDT0RFOworCXN3aXRjaCAoY21kLT5zY3NpX3NlbnNlX3JlYXNvbikgeworCWNhc2UgVENNX05PTl9FWElTVEVOVF9MVU46CisJY2FzZSBUQ01fVU5TVVBQT1JURURfU0NTSV9PUENPREU6CisJY2FzZSBUQ01fSU5WQUxJRF9DREJfRklFTEQ6CisJY2FzZSBUQ01fSU5WQUxJRF9QQVJBTUVURVJfTElTVDoKKwljYXNlIFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOgorCWNhc2UgVENNX1VOS05PV05fTU9ERV9QQUdFOgorCWNhc2UgVENNX1dSSVRFX1BST1RFQ1RFRDoKKwljYXNlIFRDTV9DSEVDS19DT05ESVRJT05fQUJPUlRfQ01EOgorCWNhc2UgVENNX0NIRUNLX0NPTkRJVElPTl9VTklUX0FUVEVOVElPTjoKKwljYXNlIFRDTV9DSEVDS19DT05ESVRJT05fTk9UX1JFQURZOgogCQlicmVhazsKLQljYXNlIFBZWF9UUkFOU1BPUlRfUkVRX1RPT19NQU5ZX1NFQ1RPUlM6Ci0JCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fU0VDVE9SX0NPVU5UX1RPT19NQU5ZOwotCQlicmVhazsKLQljYXNlIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQ6Ci0JCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fSU5WQUxJRF9DREJfRklFTEQ7Ci0JCWJyZWFrOwotCWNhc2UgUFlYX1RSQU5TUE9SVF9JTlZBTElEX1BBUkFNRVRFUl9MSVNUOgotCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfUEFSQU1FVEVSX0xJU1Q7Ci0JCWJyZWFrOwotCWNhc2UgUFlYX1RSQU5TUE9SVF9PVVRfT0ZfTUVNT1JZX1JFU09VUkNFUzoKLQkJaWYgKCFzYykKLQkJCXRyYW5zcG9ydF9uZXdfY21kX2ZhaWx1cmUoY21kKTsKLQkJLyoKLQkJICogQ3VycmVudGx5IGZvciBQWVhfVFJBTlNQT1JUX09VVF9PRl9NRU1PUllfUkVTT1VSQ0VTLAotCQkgKiB3ZSBmb3JjZSB0aGlzIHNlc3Npb24gdG8gZmFsbCBiYWNrIHRvIHNlc3Npb24KLQkJICogcmVjb3ZlcnkuCi0JCSAqLwotCQljbWQtPnNlX3Rmby0+ZmFsbF9iYWNrX3RvX2VybDAoY21kLT5zZV9zZXNzKTsKLQkJY21kLT5zZV90Zm8tPnN0b3Bfc2Vzc2lvbihjbWQtPnNlX3Nlc3MsIDAsIDApOwotCi0JCWdvdG8gY2hlY2tfc3RvcDsKLQljYXNlIFBZWF9UUkFOU1BPUlRfTFVfQ09NTV9GQUlMVVJFOgotCWNhc2UgUFlYX1RSQU5TUE9SVF9JTExFR0FMX1JFUVVFU1Q6Ci0JCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24gPSBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVSRTsKLQkJYnJlYWs7Ci0JY2FzZSBQWVhfVFJBTlNQT1JUX1VOS05PV05fTU9ERV9QQUdFOgotCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1VOS05PV05fTU9ERV9QQUdFOwotCQlicmVhazsKLQljYXNlIFBZWF9UUkFOU1BPUlRfV1JJVEVfUFJPVEVDVEVEOgotCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1dSSVRFX1BST1RFQ1RFRDsKLQkJYnJlYWs7Ci0JY2FzZSBQWVhfVFJBTlNQT1JUX1JFU0VSVkFUSU9OX0NPTkZMSUNUOgorCWNhc2UgVENNX1JFU0VSVkFUSU9OX0NPTkZMSUNUOgogCQkvKgogCQkgKiBObyBTRU5TRSBEYXRhIHBheWxvYWQgZm9yIHRoaXMgY2FzZSwgc2V0IFNDU0kgU3RhdHVzCiAJCSAqIGFuZCBxdWV1ZSB0aGUgcmVzcG9uc2UgdG8gJEZBQlJJQ19NT0QuCkBAIC0xODkzLDE1ICsxODQ5LDkgQEAKIAkJaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRU5PTUVNKQogCQkJZ290byBxdWV1ZV9mdWxsOwogCQlnb3RvIGNoZWNrX3N0b3A7Ci0JY2FzZSBQWVhfVFJBTlNQT1JUX1VTRV9TRU5TRV9SRUFTT046Ci0JCS8qCi0JCSAqIHN0cnVjdCBzZV9jbWQtPnNjc2lfc2Vuc2VfcmVhc29uIGFscmVhZHkgc2V0Ci0JCSAqLwotCQlicmVhazsKIAlkZWZhdWx0OgogCQlwcl9lcnIoIlVua25vd24gdHJhbnNwb3J0IGVycm9yIGZvciBDREIgMHglMDJ4OiAlZFxuIiwKLQkJCWNtZC0+dF90YXNrX2NkYlswXSwKLQkJCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyk7CisJCQljbWQtPnRfdGFza19jZGJbMF0sIGNtZC0+c2NzaV9zZW5zZV9yZWFzb24pOwogCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1VOU1VQUE9SVEVEX1NDU0lfT1BDT0RFOwogCQlicmVhazsKIAl9CkBAIC0xOTEyLDE0ICsxODYyLDEwIEBACiAJICogdHJhbnNwb3J0X3NlbmRfY2hlY2tfY29uZGl0aW9uX2FuZF9zZW5zZSgpIGFmdGVyIGhhbmRsaW5nCiAJICogcG9zc2libGUgdW5zb2xpdGljaWVkIHdyaXRlIGRhdGEgcGF5bG9hZHMuCiAJICovCi0JaWYgKCFzYyAmJiAhY21kLT5zZV90Zm8tPm5ld19jbWRfbWFwKQotCQl0cmFuc3BvcnRfbmV3X2NtZF9mYWlsdXJlKGNtZCk7Ci0JZWxzZSB7Ci0JCXJldCA9IHRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vuc2UoY21kLAotCQkJCWNtZC0+c2NzaV9zZW5zZV9yZWFzb24sIDApOwotCQlpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FTk9NRU0pCi0JCQlnb3RvIHF1ZXVlX2Z1bGw7Ci0JfQorCXJldCA9IHRyYW5zcG9ydF9zZW5kX2NoZWNrX2NvbmRpdGlvbl9hbmRfc2Vuc2UoY21kLAorCQkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiwgMCk7CisJaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRU5PTUVNKQorCQlnb3RvIHF1ZXVlX2Z1bGw7CiAKIGNoZWNrX3N0b3A6CiAJdHJhbnNwb3J0X2x1bl9yZW1vdmVfY21kKGNtZCk7CkBAIC0yMDAyLDE5ICsxOTQ4LDEyIEBACiAJICogdG8gYWxsb3cgdGhlIHBhc3NlZCBzdHJ1Y3Qgc2VfY21kIGxpc3Qgb2YgdGFza3MgdG8gdGhlIGZyb250IG9mIHRoZSBsaXN0LgogCSAqLwogCSBpZiAoY21kLT5zYW1fdGFza19hdHRyID09IE1TR19IRUFEX1RBRykgewotCQlhdG9taWNfaW5jKCZjbWQtPnNlX2Rldi0+ZGV2X2hvcV9jb3VudCk7Ci0JCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOwogCQlwcl9kZWJ1ZygiQWRkZWQgSEVBRF9PRl9RVUVVRSBmb3IgQ0RCOiIKIAkJCSIgMHglMDJ4LCBzZV9vcmRlcmVkX2lkOiAldVxuIiwKIAkJCWNtZC0+dF90YXNrX2NkYlswXSwKIAkJCWNtZC0+c2Vfb3JkZXJlZF9pZCk7CiAJCXJldHVybiAxOwogCX0gZWxzZSBpZiAoY21kLT5zYW1fdGFza19hdHRyID09IE1TR19PUkRFUkVEX1RBRykgewotCQlzcGluX2xvY2soJmNtZC0+c2VfZGV2LT5vcmRlcmVkX2NtZF9sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmY21kLT5zZV9vcmRlcmVkX25vZGUsCi0JCQkJJmNtZC0+c2VfZGV2LT5vcmRlcmVkX2NtZF9saXN0KTsKLQkJc3Bpbl91bmxvY2soJmNtZC0+c2VfZGV2LT5vcmRlcmVkX2NtZF9sb2NrKTsKLQogCQlhdG9taWNfaW5jKCZjbWQtPnNlX2Rldi0+ZGV2X29yZGVyZWRfc3luYyk7CiAJCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2luYygpOwogCkBAIC0yMDc2LDkgKzIwMTUsOSBAQAogewogCWludCBhZGRfdGFza3M7CiAKLQlpZiAoc2VfZGV2X2NoZWNrX29ubGluZShjbWQtPnNlX29yaWdfb2JqX3B0cikgIT0gMCkgewotCQljbWQtPnRyYW5zcG9ydF9lcnJvcl9zdGF0dXMgPSBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRTsKLQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKGNtZCwgMCwgMSk7CisJaWYgKHNlX2Rldl9jaGVja19vbmxpbmUoY21kLT5zZV9kZXYpICE9IDApIHsKKwkJY21kLT5zY3NpX3NlbnNlX3JlYXNvbiA9IFRDTV9MT0dJQ0FMX1VOSVRfQ09NTVVOSUNBVElPTl9GQUlMVVJFOworCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yMTYzLDE0ICsyMTAyLDEzIEBACiAJZWxzZQogCQllcnJvciA9IGRldi0+dHJhbnNwb3J0LT5kb190YXNrKHRhc2spOwogCWlmIChlcnJvciAhPSAwKSB7Ci0JCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyA9IGVycm9yOwogCQlzcGluX2xvY2tfaXJxc2F2ZSgmY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKIAkJdGFzay0+dGFza19mbGFncyAmPSB+VEZfQUNUSVZFOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbWQtPnRfc3RhdGVfbG9jaywgZmxhZ3MpOwogCQlhdG9taWNfc2V0KCZjbWQtPnRfdHJhbnNwb3J0X3NlbnQsIDApOwogCQl0cmFuc3BvcnRfc3RvcF90YXNrc19mb3JfY21kKGNtZCk7CiAJCWF0b21pY19pbmMoJmRldi0+ZGVwdGhfbGVmdCk7Ci0JCXRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShjbWQsIDAsIDEpOworCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kKTsKIAl9CiAKIAlnb3RvIGNoZWNrX2RlcHRoOwpAQCAtMjE3OCwxOSArMjExNiw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgdHJhbnNwb3J0X25ld19jbWRfZmFpbHVyZShzdHJ1Y3Qgc2VfY21kICpzZV9jbWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQkvKgotCSAqIEFueSB1bnNvbGljaXRlZCBkYXRhIHdpbGwgZ2V0IGR1bXBlZCBmb3IgZmFpbGVkIGNvbW1hbmQgaW5zaWRlIG9mCi0JICogdGhlIGZhYnJpYyBwbHVnaW4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmc2VfY21kLT50X3N0YXRlX2xvY2ssIGZsYWdzKTsKLQlzZV9jbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0VfQ01EX0ZBSUxFRDsKLQlzZV9jbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DREJfRVhDRVBUSU9OOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnNlX2NtZC0+dF9zdGF0ZV9sb2NrLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdTMyIHRyYW5zcG9ydF9nZXRfc2VjdG9yc182KAogCXVuc2lnbmVkIGNoYXIgKmNkYiwKIAlzdHJ1Y3Qgc2VfY21kICpjbWQsCkBAIC0yMjEzLDEwICsyMTM4LDE1IEBACiAKIAkvKgogCSAqIEV2ZXJ5dGhpbmcgZWxzZSBhc3N1bWUgVFlQRV9ESVNLIFNlY3RvciBDREIgbG9jYXRpb24uCi0JICogVXNlIDgtYml0IHNlY3RvciB2YWx1ZS4KKwkgKiBVc2UgOC1iaXQgc2VjdG9yIHZhbHVlLiAgU0JDLTMgc2F5czoKKwkgKgorCSAqICAgQSBUUkFOU0ZFUiBMRU5HVEggZmllbGQgc2V0IHRvIHplcm8gc3BlY2lmaWVzIHRoYXQgMjU2CisJICogICBsb2dpY2FsIGJsb2NrcyBzaGFsbCBiZSB3cml0dGVuLiAgQW55IG90aGVyIHZhbHVlCisJICogICBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBsb2dpY2FsIGJsb2NrcyB0aGF0IHNoYWxsIGJlCisJICogICB3cml0dGVuLgogCSAqLwogdHlwZV9kaXNrOgotCXJldHVybiAodTMyKWNkYls0XTsKKwlyZXR1cm4gY2RiWzRdID8gOiAyNTY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdTMyIHRyYW5zcG9ydF9nZXRfc2VjdG9yc18xMCgKQEAgLTI0NjAsMjcgKzIzOTAsNiBAQAogCXJldHVybiAtMTsKIH0KIAotc3RhdGljIGludAotdHJhbnNwb3J0X2hhbmRsZV9yZXNlcnZhdGlvbl9jb25mbGljdChzdHJ1Y3Qgc2VfY21kICpjbWQpCi17Ci0JY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfQ0RCX0VYQ0VQVElPTjsKLQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9SRVNFUlZBVElPTl9DT05GTElDVDsKLQljbWQtPnNjc2lfc3RhdHVzID0gU0FNX1NUQVRfUkVTRVJWQVRJT05fQ09ORkxJQ1Q7Ci0JLyoKLQkgKiBGb3IgVUEgSW50ZXJsb2NrIENvZGUgMTFiLCBhIFJFU0VSVkFUSU9OIENPTkZMSUNUIHdpbGwKLQkgKiBlc3RhYmxpc2ggYSBVTklUIEFUVEVOVElPTiB3aXRoIFBSRVZJT1VTIFJFU0VSVkFUSU9OCi0JICogQ09ORkxJQ1QgU1RBVFVTLgotCSAqCi0JICogU2VlIHNwYzRyMTcsIHNlY3Rpb24gNy40LjYgQ29udHJvbCBNb2RlIFBhZ2UsIFRhYmxlIDM0OQotCSAqLwotCWlmIChjbWQtPnNlX3Nlc3MgJiYKLQkgICAgY21kLT5zZV9kZXYtPnNlX3N1Yl9kZXYtPnNlX2Rldl9hdHRyaWIuZW11bGF0ZV91YV9pbnRsY2tfY3RybCA9PSAyKQotCQljb3JlX3Njc2kzX3VhX2FsbG9jYXRlKGNtZC0+c2Vfc2Vzcy0+c2Vfbm9kZV9hY2wsCi0JCQljbWQtPm9yaWdfZmVfbHVuLCAweDJDLAotCQkJQVNDUV8yQ0hfUFJFVklPVVNfUkVTRVJWQVRJT05fQ09ORkxJQ1RfU1RBVFVTKTsKLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQogc3RhdGljIGlubGluZSBsb25nIGxvbmcgdHJhbnNwb3J0X2Rldl9lbmRfbGJhKHN0cnVjdCBzZV9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gZGV2LT50cmFuc3BvcnQtPmdldF9ibG9ja3MoZGV2KSArIDE7CkBAIC0yNTk1LDggKzI1MDQsMTIgQEAKIAkgKi8KIAlpZiAoc3VfZGV2LT50MTBfcHIucHJfb3BzLnQxMF9yZXNlcnZhdGlvbl9jaGVjayhjbWQsICZwcl9yZWdfdHlwZSkgIT0gMCkgewogCQlpZiAoc3VfZGV2LT50MTBfcHIucHJfb3BzLnQxMF9zZXFfbm9uX2hvbGRlcigKLQkJCQkJY21kLCBjZGIsIHByX3JlZ190eXBlKSAhPSAwKQotCQkJcmV0dXJuIHRyYW5zcG9ydF9oYW5kbGVfcmVzZXJ2YXRpb25fY29uZmxpY3QoY21kKTsKKwkJCQkJY21kLCBjZGIsIHByX3JlZ190eXBlKSAhPSAwKSB7CisJCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9DREJfRVhDRVBUSU9OOworCQkJY21kLT5zZV9jbWRfZmxhZ3MgfD0gU0NGX1NDU0lfUkVTRVJWQVRJT05fQ09ORkxJQ1Q7CisJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX1JFU0VSVkFUSU9OX0NPTkZMSUNUOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQogCQkvKgogCQkgKiBUaGlzIG1lYW5zIHRoZSBDREIgaXMgYWxsb3dlZCBmb3IgdGhlIFNDU0kgSW5pdGlhdG9yIHBvcnQKIAkJICogd2hlbiBzYWlkIHBvcnQgaXMgKk5PVCogaG9sZGluZyB0aGUgbGVnYWN5IFNQQy0yIG9yCkBAIC0yNjU4LDcgKzI1NzEsOCBAQAogCQkJZ290byBvdXRfdW5zdXBwb3J0ZWRfY2RiOwogCQlzaXplID0gdHJhbnNwb3J0X2dldF9zaXplKHNlY3RvcnMsIGNkYiwgY21kKTsKIAkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV8zMihjZGIpOwotCQljbWQtPnRfdGFza3NfZnVhID0gKGNkYlsxXSAmIDB4OCk7CisJCWlmIChjZGJbMV0gJiAweDgpCisJCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfRlVBOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBXUklURV8xMjoKQEAgLTI2NjcsNyArMjU4MSw4IEBACiAJCQlnb3RvIG91dF91bnN1cHBvcnRlZF9jZGI7CiAJCXNpemUgPSB0cmFuc3BvcnRfZ2V0X3NpemUoc2VjdG9ycywgY2RiLCBjbWQpOwogCQljbWQtPnRfdGFza19sYmEgPSB0cmFuc3BvcnRfbGJhXzMyKGNkYik7Ci0JCWNtZC0+dF90YXNrc19mdWEgPSAoY2RiWzFdICYgMHg4KTsKKwkJaWYgKGNkYlsxXSAmIDB4OCkKKwkJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9GVUE7CiAJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCOwogCQlicmVhazsKIAljYXNlIFdSSVRFXzE2OgpAQCAtMjY3NiwxMiArMjU5MSwxMyBAQAogCQkJZ290byBvdXRfdW5zdXBwb3J0ZWRfY2RiOwogCQlzaXplID0gdHJhbnNwb3J0X2dldF9zaXplKHNlY3RvcnMsIGNkYiwgY21kKTsKIAkJY21kLT50X3Rhc2tfbGJhID0gdHJhbnNwb3J0X2xiYV82NChjZGIpOwotCQljbWQtPnRfdGFza3NfZnVhID0gKGNkYlsxXSAmIDB4OCk7CisJCWlmIChjZGJbMV0gJiAweDgpCisJCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfRlVBOwogCQljbWQtPnNlX2NtZF9mbGFncyB8PSBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQjsKIAkJYnJlYWs7CiAJY2FzZSBYRFdSSVRFUkVBRF8xMDoKIAkJaWYgKChjbWQtPmRhdGFfZGlyZWN0aW9uICE9IERNQV9UT19ERVZJQ0UpIHx8Ci0JCSAgICAhKGNtZC0+dF90YXNrc19iaWRpKSkKKwkJICAgICEoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfQklESSkpCiAJCQlnb3RvIG91dF9pbnZhbGlkX2NkYl9maWVsZDsKIAkJc2VjdG9ycyA9IHRyYW5zcG9ydF9nZXRfc2VjdG9yc18xMChjZGIsIGNtZCwgJnNlY3Rvcl9yZXQpOwogCQlpZiAoc2VjdG9yX3JldCkKQEAgLTI3MDAsNyArMjYxNiw4IEBACiAJCSAqIFNldHVwIEJJREkgWE9SIGNhbGxiYWNrIHRvIGJlIHJ1biBhZnRlciBJL08gY29tcGxldGlvbi4KIAkJICovCiAJCWNtZC0+dHJhbnNwb3J0X2NvbXBsZXRlX2NhbGxiYWNrID0gJnRyYW5zcG9ydF94b3JfY2FsbGJhY2s7Ci0JCWNtZC0+dF90YXNrc19mdWEgPSAoY2RiWzFdICYgMHg4KTsKKwkJaWYgKGNkYlsxXSAmIDB4OCkKKwkJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9GVUE7CiAJCWJyZWFrOwogCWNhc2UgVkFSSUFCTEVfTEVOR1RIX0NNRDoKIAkJc2VydmljZV9hY3Rpb24gPSBnZXRfdW5hbGlnbmVkX2JlMTYoJmNkYls4XSk7CkBAIC0yNzI4LDcgKzI2NDUsOCBAQAogCQkJICogY29tcGxldGlvbi4KIAkJCSAqLwogCQkJY21kLT50cmFuc3BvcnRfY29tcGxldGVfY2FsbGJhY2sgPSAmdHJhbnNwb3J0X3hvcl9jYWxsYmFjazsKLQkJCWNtZC0+dF90YXNrc19mdWEgPSAoY2RiWzEwXSAmIDB4OCk7CisJCQlpZiAoY2RiWzFdICYgMHg4KQorCQkJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9GVUE7CiAJCQlicmVhazsKIAkJY2FzZSBXUklURV9TQU1FXzMyOgogCQkJc2VjdG9ycyA9IHRyYW5zcG9ydF9nZXRfc2VjdG9yc18zMihjZGIsIGNtZCwgJnNlY3Rvcl9yZXQpOwpAQCAtMzE3MSwxOCArMzA4OSwxMyBAQAogCQkJIiBTSU1QTEU6ICV1XG4iLCBkZXYtPmRldl9jdXJfb3JkZXJlZF9pZCwKIAkJCWNtZC0+c2Vfb3JkZXJlZF9pZCk7CiAJfSBlbHNlIGlmIChjbWQtPnNhbV90YXNrX2F0dHIgPT0gTVNHX0hFQURfVEFHKSB7Ci0JCWF0b21pY19kZWMoJmRldi0+ZGV2X2hvcV9jb3VudCk7Ci0JCXNtcF9tYl9fYWZ0ZXJfYXRvbWljX2RlYygpOwogCQlkZXYtPmRldl9jdXJfb3JkZXJlZF9pZCsrOwogCQlwcl9kZWJ1ZygiSW5jcmVtZW50ZWQgZGV2X2N1cl9vcmRlcmVkX2lkOiAldSBmb3IiCiAJCQkiIEhFQURfT0ZfUVVFVUU6ICV1XG4iLCBkZXYtPmRldl9jdXJfb3JkZXJlZF9pZCwKIAkJCWNtZC0+c2Vfb3JkZXJlZF9pZCk7CiAJfSBlbHNlIGlmIChjbWQtPnNhbV90YXNrX2F0dHIgPT0gTVNHX09SREVSRURfVEFHKSB7Ci0JCXNwaW5fbG9jaygmZGV2LT5vcmRlcmVkX2NtZF9sb2NrKTsKLQkJbGlzdF9kZWwoJmNtZC0+c2Vfb3JkZXJlZF9ub2RlKTsKIAkJYXRvbWljX2RlYygmZGV2LT5kZXZfb3JkZXJlZF9zeW5jKTsKIAkJc21wX21iX19hZnRlcl9hdG9taWNfZGVjKCk7Ci0JCXNwaW5fdW5sb2NrKCZkZXYtPm9yZGVyZWRfY21kX2xvY2spOwogCiAJCWRldi0+ZGV2X2N1cl9vcmRlcmVkX2lkKys7CiAJCXByX2RlYnVnKCJJbmNyZW1lbnRlZCBkZXZfY3VyX29yZGVyZWRfaWQ6ICV1IGZvciBPUkRFUkVEOiIKQEAgLTM0OTUsNiArMzQwOCwxOCBAQAogCiAJaWYgKChjbWQtPnNlX2NtZF9mbGFncyAmIFNDRl9TQ1NJX0RBVEFfU0dfSU9fQ0RCKSB8fAogCSAgICAoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9DT05UUk9MX1NHX0lPX0NEQikpIHsKKwkJLyoKKwkJICogUmVqZWN0IFNDU0kgZGF0YSBvdmVyZmxvdyB3aXRoIG1hcF9tZW1fdG9fY21kKCkgYXMgaW5jb21pbmcKKwkJICogc2NhdHRlcmxpc3RzIGFscmVhZHkgaGF2ZSBiZWVuIHNldCB0byBmb2xsb3cgd2hhdCB0aGUgZmFicmljCisJCSAqIHBhc3NlcyBmb3IgdGhlIG9yaWdpbmFsIGV4cGVjdGVkIGRhdGEgdHJhbnNmZXIgbGVuZ3RoLgorCQkgKi8KKwkJaWYgKGNtZC0+c2VfY21kX2ZsYWdzICYgU0NGX09WRVJGTE9XX0JJVCkgeworCQkJcHJfd2FybigiUmVqZWN0aW5nIFNDU0kgREFUQSBvdmVyZmxvdyBmb3IgZmFicmljIHVzaW5nIgorCQkJCSIgU0NGX1BBU1NUSFJPVUdIX1NHX1RPX01FTV9OT0FMTE9DXG4iKTsKKwkJCWNtZC0+c2VfY21kX2ZsYWdzIHw9IFNDRl9TQ1NJX0NEQl9FWENFUFRJT047CisJCQljbWQtPnNjc2lfc2Vuc2VfcmVhc29uID0gVENNX0lOVkFMSURfQ0RCX0ZJRUxEOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KIAogCQljbWQtPnRfZGF0YV9zZyA9IHNnbDsKIAkJY21kLT50X2RhdGFfbmVudHMgPSBzZ2xfY291bnQ7CkBAIC0zODEzLDcgKzM3MzgsNyBAQAogCSAgICBjbWQtPmRhdGFfbGVuZ3RoKSB7CiAJCXJldCA9IHRyYW5zcG9ydF9nZW5lcmljX2dldF9tZW0oY21kKTsKIAkJaWYgKHJldCA8IDApCi0JCQlyZXR1cm4gcmV0OworCQkJZ290byBvdXRfZmFpbDsKIAl9CiAKIAkvKgpAQCAtMzg0Miw4ICszNzY3LDE1IEBACiAJCXRhc2tfY2RicyA9IHRyYW5zcG9ydF9hbGxvY2F0ZV9jb250cm9sX3Rhc2soY21kKTsKIAl9CiAKLQlpZiAodGFza19jZGJzIDw9IDApCisJaWYgKHRhc2tfY2RicyA8IDApCiAJCWdvdG8gb3V0X2ZhaWw7CisJZWxzZSBpZiAoIXRhc2tfY2RicyAmJiAoY21kLT5zZV9jbWRfZmxhZ3MgJiBTQ0ZfU0NTSV9EQVRBX1NHX0lPX0NEQikpIHsKKwkJY21kLT50X3N0YXRlID0gVFJBTlNQT1JUX0NPTVBMRVRFOworCQlhdG9taWNfc2V0KCZjbWQtPnRfdHJhbnNwb3J0X2FjdGl2ZSwgMSk7CisJCUlOSVRfV09SSygmY21kLT53b3JrLCB0YXJnZXRfY29tcGxldGVfb2tfd29yayk7CisJCXF1ZXVlX3dvcmsodGFyZ2V0X2NvbXBsZXRpb25fd3EsICZjbWQtPndvcmspOworCQlyZXR1cm4gMDsKKwl9CiAKIAlpZiAoc2V0X2NvdW50cykgewogCQlhdG9taWNfaW5jKCZjbWQtPnRfZmVfY291bnQpOwpAQCAtMzkyOSw3ICszODYxLDcgQEAKIAllbHNlIGlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0dXJuIFBZWF9UUkFOU1BPUlRfV1JJVEVfUEVORElORzsKKwlyZXR1cm4gMTsKIAogcXVldWVfZnVsbDoKIAlwcl9kZWJ1ZygiSGFuZGxpbmcgd3JpdGVfcGVuZGluZyBRVUVVRV9fRlVMTDogc2VfY21kOiAlcFxuIiwgY21kKTsKQEAgLTQ2MDIsOSArNDUzNCw2IEBACiAJCWlmIChjbWQtPnNlX3Rmby0+d3JpdGVfcGVuZGluZ19zdGF0dXMoY21kKSAhPSAwKSB7CiAJCQlhdG9taWNfaW5jKCZjbWQtPnRfdHJhbnNwb3J0X2Fib3J0ZWQpOwogCQkJc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCk7Ci0JCQljbWQtPnNjc2lfc3RhdHVzID0gU0FNX1NUQVRfVEFTS19BQk9SVEVEOwotCQkJdHJhbnNwb3J0X25ld19jbWRfZmFpbHVyZShjbWQpOwotCQkJcmV0dXJuOwogCQl9CiAJfQogCWNtZC0+c2NzaV9zdGF0dXMgPSBTQU1fU1RBVF9UQVNLX0FCT1JURUQ7CkBAIC00NjcwLDggKzQ1OTksNiBAQAogCXN0cnVjdCBzZV9jbWQgKmNtZDsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICpkZXYgPSAoc3RydWN0IHNlX2RldmljZSAqKSBwYXJhbTsKIAotCXNldF91c2VyX25pY2UoY3VycmVudCwgLTIwKTsKLQogCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CiAJCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShkZXYtPmRldl9xdWV1ZV9vYmoudGhyZWFkX3dxLAogCQkJCWF0b21pY19yZWFkKCZkZXYtPmRldl9xdWV1ZV9vYmoucXVldWVfY250KSB8fApAQCAtNDY5OCwxOCArNDYyNSwxMyBAQAogCQkJfQogCQkJcmV0ID0gY21kLT5zZV90Zm8tPm5ld19jbWRfbWFwKGNtZCk7CiAJCQlpZiAocmV0IDwgMCkgewotCQkJCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyA9IHJldDsKLQkJCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kLAotCQkJCQkJMCwgKGNtZC0+ZGF0YV9kaXJlY3Rpb24gIT0KLQkJCQkJCSAgICBETUFfVE9fREVWSUNFKSk7CisJCQkJdHJhbnNwb3J0X2dlbmVyaWNfcmVxdWVzdF9mYWlsdXJlKGNtZCk7CiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlyZXQgPSB0cmFuc3BvcnRfZ2VuZXJpY19uZXdfY21kKGNtZCk7CiAJCQlpZiAocmV0IDwgMCkgewotCQkJCWNtZC0+dHJhbnNwb3J0X2Vycm9yX3N0YXR1cyA9IHJldDsKLQkJCQl0cmFuc3BvcnRfZ2VuZXJpY19yZXF1ZXN0X2ZhaWx1cmUoY21kLAotCQkJCQkwLCAoY21kLT5kYXRhX2RpcmVjdGlvbiAhPQotCQkJCQkgRE1BX1RPX0RFVklDRSkpOworCQkJCXRyYW5zcG9ydF9nZW5lcmljX3JlcXVlc3RfZmFpbHVyZShjbWQpOworCQkJCWJyZWFrOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgVFJBTlNQT1JUX1BST0NFU1NfV1JJVEU6CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jIGIvZHJpdmVycy90YXJnZXQvdGNtX2ZjL3RmY19jbWQuYwppbmRleCA0ZmFjMzdjLi43MWZjOWNlIDEwMDY0NAotLS0gYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NtZC5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY21kLmMKQEAgLTIwMCw3ICsyMDAsNyBAQAogCWxwb3J0ID0gZXAtPmxwOwogCWZwID0gZmNfZnJhbWVfYWxsb2MobHBvcnQsIHNpemVvZigqdHhyZHkpKTsKIAlpZiAoIWZwKQotCQlyZXR1cm4gUFlYX1RSQU5TUE9SVF9PVVRfT0ZfTUVNT1JZX1JFU09VUkNFUzsKKwkJcmV0dXJuIC1FTk9NRU07IC8qIFNpZ25hbCBRVUVVRV9GVUxMICovCiAKIAl0eHJkeSA9IGZjX2ZyYW1lX3BheWxvYWRfZ2V0KGZwLCBzaXplb2YoKnR4cmR5KSk7CiAJbWVtc2V0KHR4cmR5LCAwLCBzaXplb2YoKnR4cmR5KSk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3RhcmdldC90Y21fZmMvdGZjX2NvbmYuYyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY29uZi5jCmluZGV4IDVmNzcwNDEuLjk0MDJiNzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY29uZi5jCisrKyBiL2RyaXZlcnMvdGFyZ2V0L3RjbV9mYy90ZmNfY29uZi5jCkBAIC00MzYsOCArNDM2LDcgQEAKIAlzdHJ1Y3QgZnRfbHBvcnRfYWNsICpsYWNsID0gY29udGFpbmVyX29mKHd3biwKIAkJCQlzdHJ1Y3QgZnRfbHBvcnRfYWNsLCBmY19scG9ydF93d24pOwogCi0JcHJfZGVidWcoImRlbCBscG9ydCAlc1xuIiwKLQkJCWNvbmZpZ19pdGVtX25hbWUoJnd3bi0+d3duX2dyb3VwLmNnX2l0ZW0pKTsKKwlwcl9kZWJ1ZygiZGVsIGxwb3J0ICVzXG4iLCBsYWNsLT5uYW1lKTsKIAltdXRleF9sb2NrKCZmdF9scG9ydF9sb2NrKTsKIAlsaXN0X2RlbCgmbGFjbC0+bGlzdCk7CiAJbXV0ZXhfdW5sb2NrKCZmdF9scG9ydF9sb2NrKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdHR5L3NlcmlhbC9wbWFjX3ppbG9nLmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcG1hY196aWxvZy5jCmluZGV4IDVhY2QyNGEuLmU5YzJkZmU0IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvcG1hY196aWxvZy5jCisrKyBiL2RyaXZlcnMvdHR5L3NlcmlhbC9wbWFjX3ppbG9nLmMKQEAgLTk5LDYgKzk5LDkgQEAKICNkZWZpbmUgUE1BQ1pJTE9HX05BTUUJCSJ0dHlQWiIKICNlbmRpZgogCisjZGVmaW5lIHBtel9kZWJ1ZyhmbXQsIGFyZy4uLikJcHJfZGVidWcoInR0eVBaJWQ6ICIgZm10LCB1YXAtPnBvcnQubGluZSwgIyMgYXJnKQorI2RlZmluZSBwbXpfZXJyb3IoZm10LCBhcmcuLi4pCXByX2VycigidHR5UFolZDogIiBmbXQsIHVhcC0+cG9ydC5saW5lLCAjIyBhcmcpCisjZGVmaW5lIHBtel9pbmZvKGZtdCwgYXJnLi4uKQlwcl9pbmZvKCJ0dHlQWiVkOiAiIGZtdCwgdWFwLT5wb3J0LmxpbmUsICMjIGFyZykKIAogLyoKICAqIEZvciB0aGUgc2FrZSBvZiBlYXJseSBzZXJpYWwgY29uc29sZSwgd2UgY2FuIGRvIGEgcHJlLXByb2JlCkBAIC0xMDYsNyArMTA5LDYgQEAKICAqLwogc3RhdGljIHN0cnVjdCB1YXJ0X3BtYWNfcG9ydAlwbXpfcG9ydHNbTUFYX1pTX1BPUlRTXTsKIHN0YXRpYyBpbnQJCQlwbXpfcG9ydHNfY291bnQ7Ci1zdGF0aWMgREVGSU5FX01VVEVYKHBtel9pcnFfbXV0ZXgpOwogCiBzdGF0aWMgc3RydWN0IHVhcnRfZHJpdmVyIHBtel91YXJ0X3JlZyA9IHsKIAkub3duZXIJCT0JVEhJU19NT0RVTEUsCkBAIC0xMjYsOSArMTI4LDYgQEAKIHsKIAlpbnQgaTsKIAotCWlmIChaU19JU19BU0xFRVAodWFwKSkKLQkJcmV0dXJuOwotCiAJLyogTGV0IHBlbmRpbmcgdHJhbnNtaXRzIGZpbmlzaC4gICovCiAJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgewogCQl1bnNpZ25lZCBjaGFyIHN0YXQgPSByZWFkX3pzcmVnKHVhcCwgUjEpOwpAQCAtMjE2LDMyICsyMTUsMjQgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHBtel9pbnRlcnJ1cHRfY29udHJvbChzdHJ1Y3QgdWFydF9wbWFjX3BvcnQgKnVhcCwgaW50IGVuYWJsZSkKK3sKKwlpZiAoZW5hYmxlKSB7CisJCXVhcC0+Y3VycmVnc1sxXSB8PSBJTlRfQUxMX1J4IHwgVHhJTlRfRU5BQjsKKwkJaWYgKCFaU19JU19FWFRDTEsodWFwKSkKKwkJCXVhcC0+Y3VycmVnc1sxXSB8PSBFWFRfSU5UX0VOQUI7CisJfSBlbHNlIHsKKwkJdWFwLT5jdXJyZWdzWzFdICY9IH4oRVhUX0lOVF9FTkFCIHwgVHhJTlRfRU5BQiB8IFJ4SU5UX01BU0spOworCX0KKwl3cml0ZV96c3JlZyh1YXAsIFIxLCB1YXAtPmN1cnJlZ3NbMV0pOworfQorCiBzdGF0aWMgc3RydWN0IHR0eV9zdHJ1Y3QgKnBtel9yZWNlaXZlX2NoYXJzKHN0cnVjdCB1YXJ0X3BtYWNfcG9ydCAqdWFwKQogewogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBOVUxMOwogCXVuc2lnbmVkIGNoYXIgY2gsIHIxLCBkcm9wLCBlcnJvciwgZmxhZzsKIAlpbnQgbG9vcHMgPSAwOwogCi0JLyogVGhlIGludGVycnVwdCBjYW4gYmUgZW5hYmxlZCB3aGVuIHRoZSBwb3J0IGlzbid0IG9wZW4sIHR5cGljYWxseQotCSAqIHRoYXQgaGFwcGVucyB3aGVuIHVzaW5nIG9uZSBwb3J0IGlzIG9wZW4gYW5kIHRoZSBvdGhlciBjbG9zZWQgKHN0YWxlCi0JICogaW50ZXJydXB0KSBvciB3aGVuIG9uZSBwb3J0IGlzIHVzZWQgYXMgYSBjb25zb2xlLgotCSAqLwotCWlmICghWlNfSVNfT1BFTih1YXApKSB7Ci0JCXBtel9kZWJ1ZygicG16OiBkcmFpbmluZyBpbnB1dFxuIik7Ci0JCS8qIFBvcnQgaXMgY2xvc2VkLCBkcmFpbiBpbnB1dCBkYXRhICovCi0JCWZvciAoOzspIHsKLQkJCWlmICgoKytsb29wcykgPiAxMDAwKQotCQkJCWdvdG8gZmxvb2Q7Ci0JCQkodm9pZClyZWFkX3pzcmVnKHVhcCwgUjEpOwotCQkJd3JpdGVfenNyZWcodWFwLCBSMCwgRVJSX1JFUyk7Ci0JCQkodm9pZClyZWFkX3pzZGF0YSh1YXApOwotCQkJY2ggPSByZWFkX3pzcmVnKHVhcCwgUjApOwotCQkJaWYgKCEoY2ggJiBSeF9DSF9BVikpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIE5VTEw7Ci0JfQotCiAJLyogU2FuaXR5IGNoZWNrLCBtYWtlIHN1cmUgdGhlIG9sZCBidWcgaXMgbm8gbG9uZ2VyIGhhcHBlbmluZyAqLwogCWlmICh1YXAtPnBvcnQuc3RhdGUgPT0gTlVMTCB8fCB1YXAtPnBvcnQuc3RhdGUtPnBvcnQudHR5ID09IE5VTEwpIHsKIAkJV0FSTl9PTigxKTsKQEAgLTMzOSw5ICszMzAsNyBAQAogCiAJcmV0dXJuIHR0eTsKICBmbG9vZDoKLQl1YXAtPmN1cnJlZ3NbUjFdICY9IH4oRVhUX0lOVF9FTkFCIHwgVHhJTlRfRU5BQiB8IFJ4SU5UX01BU0spOwotCXdyaXRlX3pzcmVnKHVhcCwgUjEsIHVhcC0+Y3VycmVnc1tSMV0pOwotCXpzc3luYyh1YXApOworCXBtel9pbnRlcnJ1cHRfY29udHJvbCh1YXAsIDApOwogCXBtel9lcnJvcigicG16OiByeCBpcnEgZmxvb2QgIVxuIik7CiAJcmV0dXJuIHR0eTsKIH0KQEAgLTM4Myw4ICszNzIsNiBAQAogewogCXN0cnVjdCBjaXJjX2J1ZiAqeG1pdDsKIAotCWlmIChaU19JU19BU0xFRVAodWFwKSkKLQkJcmV0dXJuOwogCWlmIChaU19JU19DT05TKHVhcCkpIHsKIAkJdW5zaWduZWQgY2hhciBzdGF0dXMgPSByZWFkX3pzcmVnKHVhcCwgUjApOwogCkBAIC00ODEsNiArNDY4LDEwIEBACiAJLyogQ2hhbm5lbCBBICovCiAJdHR5ID0gTlVMTDsKIAlpZiAocjMgJiAoQ0hBRVhUIHwgQ0hBVHhJUCB8IENIQVJ4SVApKSB7CisJCWlmICghWlNfSVNfT1BFTih1YXBfYSkpIHsKKwkJCXBtel9kZWJ1ZygiQ2hhbkEgaW50ZXJydXB0IHdoaWxlIG9wZW4gIVxuIik7CisJCQlnb3RvIHNraXBfYTsKKwkJfQogCQl3cml0ZV96c3JlZyh1YXBfYSwgUjAsIFJFU19IX0lVUyk7CiAJCXpzc3luYyh1YXBfYSk7CQkKIAkJaWYgKHIzICYgQ0hBRVhUKQpAQCAtNDkxLDE2ICs0ODIsMjEgQEAKIAkJCXBtel90cmFuc21pdF9jaGFycyh1YXBfYSk7CiAJCXJjID0gSVJRX0hBTkRMRUQ7CiAJfQorIHNraXBfYToKIAlzcGluX3VubG9jaygmdWFwX2EtPnBvcnQubG9jayk7CiAJaWYgKHR0eSAhPSBOVUxMKQogCQl0dHlfZmxpcF9idWZmZXJfcHVzaCh0dHkpOwogCi0JaWYgKHVhcF9iLT5ub2RlID09IE5VTEwpCisJaWYgKCF1YXBfYikKIAkJZ290byBvdXQ7CiAKIAlzcGluX2xvY2soJnVhcF9iLT5wb3J0LmxvY2spOwogCXR0eSA9IE5VTEw7CiAJaWYgKHIzICYgKENIQkVYVCB8IENIQlR4SVAgfCBDSEJSeElQKSkgeworCQlpZiAoIVpTX0lTX09QRU4odWFwX2EpKSB7CisJCQlwbXpfZGVidWcoIkNoYW5CIGludGVycnVwdCB3aGlsZSBvcGVuICFcbiIpOworCQkJZ290byBza2lwX2I7CisJCX0KIAkJd3JpdGVfenNyZWcodWFwX2IsIFIwLCBSRVNfSF9JVVMpOwogCQl6c3N5bmModWFwX2IpOwogCQlpZiAocjMgJiBDSEJFWFQpCkBAIC01MTEsMTQgKzUwNywxMiBAQAogCQkJcG16X3RyYW5zbWl0X2NoYXJzKHVhcF9iKTsKIAkJcmMgPSBJUlFfSEFORExFRDsKIAl9Cisgc2tpcF9iOgogCXNwaW5fdW5sb2NrKCZ1YXBfYi0+cG9ydC5sb2NrKTsKIAlpZiAodHR5ICE9IE5VTEwpCiAJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKHR0eSk7CiAKICBvdXQ6Ci0jaWZkZWYgREVCVUdfSEFSRAotCXBtel9kZWJ1ZygiaXJxIGRvbmUuXG4iKTsKLSNlbmRpZgogCXJldHVybiByYzsKIH0KIApAQCAtNTQzLDEyICs1MzcsOCBAQAogICovCiBzdGF0aWMgdW5zaWduZWQgaW50IHBtel90eF9lbXB0eShzdHJ1Y3QgdWFydF9wb3J0ICpwb3J0KQogewotCXN0cnVjdCB1YXJ0X3BtYWNfcG9ydCAqdWFwID0gdG9fcG16KHBvcnQpOwogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCi0JaWYgKFpTX0lTX0FTTEVFUCh1YXApIHx8IHVhcC0+bm9kZSA9PSBOVUxMKQotCQlyZXR1cm4gVElPQ1NFUl9URU1UOwotCiAJc3RhdHVzID0gcG16X3BlZWtfc3RhdHVzKHRvX3Bteihwb3J0KSk7CiAJaWYgKHN0YXR1cyAmIFR4X0JVRl9FTVApCiAJCXJldHVybiBUSU9DU0VSX1RFTVQ7CkBAIC01NzAsOCArNTYwLDcgQEAKIAlpZiAoWlNfSVNfSVJEQSh1YXApKQogCQlyZXR1cm47CiAJLyogV2UgZ2V0IGNhbGxlZCBkdXJpbmcgYm9vdCB3aXRoIGEgcG9ydCBub3QgdXAgeWV0ICovCi0JaWYgKFpTX0lTX0FTTEVFUCh1YXApIHx8Ci0JICAgICEoWlNfSVNfT1BFTih1YXApIHx8IFpTX0lTX0NPTlModWFwKSkpCisJaWYgKCEoWlNfSVNfT1BFTih1YXApIHx8IFpTX0lTX0NPTlModWFwKSkpCiAJCXJldHVybjsKIAogCXNldF9iaXRzID0gY2xlYXJfYml0cyA9IDA7CkBAIC01OTAsOCArNTc5LDcgQEAKIAkvKiBOT1RFOiBOb3Qgc3ViamVjdCB0byAndHJhbnNtaXR0ZXIgYWN0aXZlJyBydWxlLiAgKi8gCiAJdWFwLT5jdXJyZWdzW1I1XSB8PSBzZXRfYml0czsKIAl1YXAtPmN1cnJlZ3NbUjVdICY9IH5jbGVhcl9iaXRzOwotCWlmIChaU19JU19BU0xFRVAodWFwKSkKLQkJcmV0dXJuOworCiAJd3JpdGVfenNyZWcodWFwLCBSNSwgdWFwLT5jdXJyZWdzW1I1XSk7CiAJcG16X2RlYnVnKCJwbXpfc2V0X21jdHJsOiBzZXQgYml0czogJXgsIGNsZWFyIGJpdHM6ICV4IC0+ICV4XG4iLAogCQkgIHNldF9iaXRzLCBjbGVhcl9iaXRzLCB1YXAtPmN1cnJlZ3NbUjVdKTsKQEAgLTYwOSw5ICs1OTcsNiBAQAogCXVuc2lnbmVkIGNoYXIgc3RhdHVzOwogCXVuc2lnbmVkIGludCByZXQ7CiAKLQlpZiAoWlNfSVNfQVNMRUVQKHVhcCkgfHwgdWFwLT5ub2RlID09IE5VTEwpCi0JCXJldHVybiAwOwotCiAJc3RhdHVzID0gcmVhZF96c3JlZyh1YXAsIFIwKTsKIAogCXJldCA9IDA7CkBAIC02NDksOSArNjM0LDYgQEAKIAl1YXAtPmZsYWdzIHw9IFBNQUNaSUxPR19GTEFHX1RYX0FDVElWRTsKIAl1YXAtPmZsYWdzICY9IH5QTUFDWklMT0dfRkxBR19UWF9TVE9QUEVEOwogCi0JaWYgKFpTX0lTX0FTTEVFUCh1YXApIHx8IHVhcC0+bm9kZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KIAlzdGF0dXMgPSByZWFkX3pzcmVnKHVhcCwgUjApOwogCiAJLyogVFggYnVzeT8gIEp1c3Qgd2FpdCBmb3IgdGhlIFRYIGRvbmUgaW50ZXJydXB0LiAgKi8KQEAgLTY5MCw5ICs2NzIsNiBAQAogewogCXN0cnVjdCB1YXJ0X3BtYWNfcG9ydCAqdWFwID0gdG9fcG16KHBvcnQpOwogCi0JaWYgKFpTX0lTX0FTTEVFUCh1YXApIHx8IHVhcC0+bm9kZSA9PSBOVUxMKQotCQlyZXR1cm47Ci0KIAlwbXpfZGVidWcoInBtejogc3RvcF9yeCgpKClcbiIpOwogCiAJLyogRGlzYWJsZSBhbGwgUlggaW50ZXJydXB0cy4gICovCkBAIC03MTEsMTQgKzY5MCwxMiBAQAogCXN0cnVjdCB1YXJ0X3BtYWNfcG9ydCAqdWFwID0gdG9fcG16KHBvcnQpOwogCXVuc2lnbmVkIGNoYXIgbmV3X3JlZzsKIAotCWlmIChaU19JU19JUkRBKHVhcCkgfHwgdWFwLT5ub2RlID09IE5VTEwpCisJaWYgKFpTX0lTX0lSREEodWFwKSkKIAkJcmV0dXJuOwogCW5ld19yZWcgPSB1YXAtPmN1cnJlZ3NbUjE1XSB8IChEQ0RJRSB8IFNZTkNJRSB8IENUU0lFKTsKIAlpZiAobmV3X3JlZyAhPSB1YXAtPmN1cnJlZ3NbUjE1XSkgewogCQl1YXAtPmN1cnJlZ3NbUjE1XSA9IG5ld19yZWc7CiAKLQkJaWYgKFpTX0lTX0FTTEVFUCh1YXApKQotCQkJcmV0dXJuOwogCQkvKiBOT1RFOiBOb3Qgc3ViamVjdCB0byAndHJhbnNtaXR0ZXIgYWN0aXZlJyBydWxlLiAqLwogCQl3cml0ZV96c3JlZyh1YXAsIFIxNSwgdWFwLT5jdXJyZWdzW1IxNV0pOwogCX0KQEAgLTczNCw4ICs3MTEsNiBAQAogCXVuc2lnbmVkIGNoYXIgc2V0X2JpdHMsIGNsZWFyX2JpdHMsIG5ld19yZWc7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCWlmICh1YXAtPm5vZGUgPT0gTlVMTCkKLQkJcmV0dXJuOwogCXNldF9iaXRzID0gY2xlYXJfYml0cyA9IDA7CiAKIAlpZiAoYnJlYWtfc3RhdGUpCkBAIC03NDgsMTIgKzcyMyw2IEBACiAJbmV3X3JlZyA9ICh1YXAtPmN1cnJlZ3NbUjVdIHwgc2V0X2JpdHMpICYgfmNsZWFyX2JpdHM7CiAJaWYgKG5ld19yZWcgIT0gdWFwLT5jdXJyZWdzW1I1XSkgewogCQl1YXAtPmN1cnJlZ3NbUjVdID0gbmV3X3JlZzsKLQotCQkvKiBOT1RFOiBOb3Qgc3ViamVjdCB0byAndHJhbnNtaXR0ZXIgYWN0aXZlJyBydWxlLiAqLwotCQlpZiAoWlNfSVNfQVNMRUVQKHVhcCkpIHsKLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJCXJldHVybjsKLQkJfQogCQl3cml0ZV96c3JlZyh1YXAsIFI1LCB1YXAtPmN1cnJlZ3NbUjVdKTsKIAl9CiAKQEAgLTkyNywxNCArODk2LDIxIEBACiAKIHN0YXRpYyB2b2lkIHBtel9pcmRhX3Jlc2V0KHN0cnVjdCB1YXJ0X3BtYWNfcG9ydCAqdWFwKQogeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWFwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAl1YXAtPmN1cnJlZ3NbUjVdIHw9IERUUjsKIAl3cml0ZV96c3JlZyh1YXAsIFI1LCB1YXAtPmN1cnJlZ3NbUjVdKTsKIAl6c3N5bmModWFwKTsKLQltZGVsYXkoMTEwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1YXAtPnBvcnQubG9jaywgZmxhZ3MpOworCW1zbGVlcCgxMTApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVhcC0+cG9ydC5sb2NrLCBmbGFncyk7CiAJdWFwLT5jdXJyZWdzW1I1XSAmPSB+RFRSOwogCXdyaXRlX3pzcmVnKHVhcCwgUjUsIHVhcC0+Y3VycmVnc1tSNV0pOwogCXpzc3luYyh1YXApOwotCW1kZWxheSgxMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWFwLT5wb3J0LmxvY2ssIGZsYWdzKTsKKwltc2xlZXAoMTApOwogfQogCiAvKgpAQCAtOTQ5LDEzICs5MjUsNiBAQAogCiAJcG16X2RlYnVnKCJwbXo6IHN0YXJ0dXAoKVxuIik7CiAKLQlpZiAoWlNfSVNfQVNMRUVQKHVhcCkpCi0JCXJldHVybiAtRUFHQUlOOwotCWlmICh1YXAtPm5vZGUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9ERVY7Ci0KLQltdXRleF9sb2NrKCZwbXpfaXJxX211dGV4KTsKLQogCXVhcC0+ZmxhZ3MgfD0gUE1BQ1pJTE9HX0ZMQUdfSVNfT1BFTjsKIAogCS8qIEEgY29uc29sZSBpcyBuZXZlciBwb3dlcmVkIGRvd24uIEVsc2UsIHBvd2VyIHVwIGFuZApAQCAtOTY2LDE4ICs5MzUsMTQgQEAKIAkJcHdyX2RlbGF5ID0gX19wbXpfc3RhcnR1cCh1YXApOwogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAJfQkKLQotCXBtel9nZXRfcG9ydF9BKHVhcCktPmZsYWdzIHw9IFBNQUNaSUxPR19GTEFHX0lTX0lSUV9PTjsKKwlzcHJpbnRmKHVhcC0+aXJxX25hbWUsIFBNQUNaSUxPR19OQU1FIiVkIiwgdWFwLT5wb3J0LmxpbmUpOwogCWlmIChyZXF1ZXN0X2lycSh1YXAtPnBvcnQuaXJxLCBwbXpfaW50ZXJydXB0LCBJUlFGX1NIQVJFRCwKLQkJCSJTQ0MiLCB1YXApKSB7CisJCQl1YXAtPmlycV9uYW1lLCB1YXApKSB7CiAJCXBtel9lcnJvcigiVW5hYmxlIHRvIHJlZ2lzdGVyIHpzIGludGVycnVwdCBoYW5kbGVyLlxuIik7CiAJCXBtel9zZXRfc2NjX3Bvd2VyKHVhcCwgMCk7Ci0JCW11dGV4X3VubG9jaygmcG16X2lycV9tdXRleCk7CiAJCXJldHVybiAtRU5YSU87CiAJfQogCi0JbXV0ZXhfdW5sb2NrKCZwbXpfaXJxX211dGV4KTsKLQogCS8qIFJpZ2h0IG5vdywgd2UgZGVhbCB3aXRoIGRlbGF5IGJ5IGJsb2NraW5nIGhlcmUsIEknbGwgYmUKIAkgKiBzbWFydGVyIGxhdGVyIG9uCiAJICovCkBAIC05OTAsMTIgKzk1NSw5IEBACiAJaWYgKFpTX0lTX0lSREEodWFwKSkKIAkJcG16X2lyZGFfcmVzZXQodWFwKTsKIAotCS8qIEVuYWJsZSBpbnRlcnJ1cHRzIGVtaXNzaW9uIGZyb20gdGhlIGNoaXAgKi8KKwkvKiBFbmFibGUgaW50ZXJydXB0IHJlcXVlc3RzIGZvciB0aGUgY2hhbm5lbCAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7Ci0JdWFwLT5jdXJyZWdzW1IxXSB8PSBJTlRfQUxMX1J4IHwgVHhJTlRfRU5BQjsKLQlpZiAoIVpTX0lTX0VYVENMSyh1YXApKQotCQl1YXAtPmN1cnJlZ3NbUjFdIHw9IEVYVF9JTlRfRU5BQjsKLQl3cml0ZV96c3JlZyh1YXAsIFIxLCB1YXAtPmN1cnJlZ3NbUjFdKTsKKwlwbXpfaW50ZXJydXB0X2NvbnRyb2wodWFwLCAxKTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAKIAlwbXpfZGVidWcoInBtejogc3RhcnR1cCgpIGRvbmUuXG4iKTsKQEAgLTEwMTAsMTAgKzk3MiwyMiBAQAogCiAJcG16X2RlYnVnKCJwbXo6IHNodXRkb3duKClcbiIpOwogCi0JaWYgKHVhcC0+bm9kZSA9PSBOVUxMKQotCQlyZXR1cm47CisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAotCW11dGV4X2xvY2soJnBtel9pcnFfbXV0ZXgpOworCS8qIERpc2FibGUgaW50ZXJydXB0IHJlcXVlc3RzIGZvciB0aGUgY2hhbm5lbCAqLworCXBtel9pbnRlcnJ1cHRfY29udHJvbCh1YXAsIDApOworCisJaWYgKCFaU19JU19DT05TKHVhcCkpIHsKKwkJLyogRGlzYWJsZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgKi8KKwkJdWFwLT5jdXJyZWdzW1IzXSAmPSB+UnhFTkFCTEU7CisJCXVhcC0+Y3VycmVnc1tSNV0gJj0gflR4RU5BQkxFOworCisJCS8qIERpc2FibGUgYnJlYWsgYXNzZXJ0aW9uICovCisJCXVhcC0+Y3VycmVnc1tSNV0gJj0gflNORF9CUks7CisJCXBtel9tYXliZV91cGRhdGVfcmVncyh1YXApOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAogCS8qIFJlbGVhc2UgaW50ZXJydXB0IGhhbmRsZXIgKi8KIAlmcmVlX2lycSh1YXAtPnBvcnQuaXJxLCB1YXApOwpAQCAtMTAyMiwzNyArOTk2LDExIEBACiAKIAl1YXAtPmZsYWdzICY9IH5QTUFDWklMT0dfRkxBR19JU19PUEVOOwogCi0JaWYgKCFaU19JU19PUEVOKHVhcC0+bWF0ZSkpCi0JCXBtel9nZXRfcG9ydF9BKHVhcCktPmZsYWdzICY9IH5QTUFDWklMT0dfRkxBR19JU19JUlFfT047Ci0KLQkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8KLQlpZiAoIVpTX0lTX0FTTEVFUCh1YXApKSB7Ci0JCXVhcC0+Y3VycmVnc1tSMV0gJj0gfihFWFRfSU5UX0VOQUIgfCBUeElOVF9FTkFCIHwgUnhJTlRfTUFTSyk7Ci0JCXdyaXRlX3pzcmVnKHVhcCwgUjEsIHVhcC0+Y3VycmVnc1tSMV0pOwotCQl6c3N5bmModWFwKTsKLQl9Ci0KLQlpZiAoWlNfSVNfQ09OUyh1YXApIHx8IFpTX0lTX0FTTEVFUCh1YXApKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKLQkJbXV0ZXhfdW5sb2NrKCZwbXpfaXJxX211dGV4KTsKLQkJcmV0dXJuOwotCX0KLQotCS8qIERpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLiAgKi8KLQl1YXAtPmN1cnJlZ3NbUjNdICY9IH5SeEVOQUJMRTsKLQl1YXAtPmN1cnJlZ3NbUjVdICY9IH5UeEVOQUJMRTsKLQotCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgYW5kIEJSSyBhc3NlcnRpb24uICAqLwotCXVhcC0+Y3VycmVnc1tSNV0gJj0gflNORF9CUks7Ci0JcG16X21heWJlX3VwZGF0ZV9yZWdzKHVhcCk7Ci0KLQkvKiBTaHV0IHRoZSBjaGlwIGRvd24gKi8KLQlwbXpfc2V0X3NjY19wb3dlcih1YXAsIDApOworCWlmICghWlNfSVNfQ09OUyh1YXApKQorCQlwbXpfc2V0X3NjY19wb3dlcih1YXAsIDApOwkvKiBTaHV0IHRoZSBjaGlwIGRvd24gKi8KIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKIAotCW11dGV4X3VubG9jaygmcG16X2lycV9tdXRleCk7Ci0KIAlwbXpfZGVidWcoInBtejogc2h1dGRvd24oKSBkb25lLlxuIik7CiB9CiAKQEAgLTEzMDAsOSArMTI0OCw2IEBACiAKIAlwbXpfZGVidWcoInBtejogc2V0X3Rlcm1pb3MoKVxuIik7CiAKLQlpZiAoWlNfSVNfQVNMRUVQKHVhcCkpCi0JCXJldHVybjsKLQogCW1lbWNweSgmdWFwLT50ZXJtaW9zX2NhY2hlLCB0ZXJtaW9zLCBzaXplb2Yoc3RydWN0IGt0ZXJtaW9zKSk7CiAKIAkvKiBYWFggQ2hlY2sgd2hpY2ggcmV2cyBvZiBtYWNoaW5lcyBhY3R1YWxseSBhbGxvdyAxIGFuZCA0TWIgc3BlZWRzCkBAIC0xMzUyLDE5ICsxMjk3LDE1IEBACiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsJCiAKIAkvKiBEaXNhYmxlIElSUXMgb24gdGhlIHBvcnQgKi8KLQl1YXAtPmN1cnJlZ3NbUjFdICY9IH4oRVhUX0lOVF9FTkFCIHwgVHhJTlRfRU5BQiB8IFJ4SU5UX01BU0spOwotCXdyaXRlX3pzcmVnKHVhcCwgUjEsIHVhcC0+Y3VycmVnc1tSMV0pOworCXBtel9pbnRlcnJ1cHRfY29udHJvbCh1YXAsIDApOwogCiAJLyogU2V0dXAgbmV3IHBvcnQgY29uZmlndXJhdGlvbiAqLwogCV9fcG16X3NldF90ZXJtaW9zKHBvcnQsIHRlcm1pb3MsIG9sZCk7CiAKIAkvKiBSZS1lbmFibGUgSVJRcyBvbiB0aGUgcG9ydCAqLwotCWlmIChaU19JU19PUEVOKHVhcCkpIHsKLQkJdWFwLT5jdXJyZWdzW1IxXSB8PSBJTlRfQUxMX1J4IHwgVHhJTlRfRU5BQjsKLQkJaWYgKCFaU19JU19FWFRDTEsodWFwKSkKLQkJCXVhcC0+Y3VycmVnc1tSMV0gfD0gRVhUX0lOVF9FTkFCOwotCQl3cml0ZV96c3JlZyh1YXAsIFIxLCB1YXAtPmN1cnJlZ3NbUjFdKTsKLQl9CisJaWYgKFpTX0lTX09QRU4odWFwKSkKKwkJcG16X2ludGVycnVwdF9jb250cm9sKHVhcCwgMSk7CisKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTE2MDQsMjUgKzE1NDUsMzQgQEAKICAqLwogc3RhdGljIGludCBwbXpfYXR0YWNoKHN0cnVjdCBtYWNpb19kZXYgKm1kZXYsIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoKQogeworCXN0cnVjdCB1YXJ0X3BtYWNfcG9ydCAqdWFwOwogCWludCBpOwogCQogCS8qIEl0ZXJhdGUgdGhlIHBtel9wb3J0cyBhcnJheSB0byBmaW5kIGEgbWF0Y2hpbmcgZW50cnkKIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgTUFYX1pTX1BPUlRTOyBpKyspCi0JCWlmIChwbXpfcG9ydHNbaV0ubm9kZSA9PSBtZGV2LT5vZmRldi5kZXYub2Zfbm9kZSkgewotCQkJc3RydWN0IHVhcnRfcG1hY19wb3J0ICp1YXAgPSAmcG16X3BvcnRzW2ldOworCQlpZiAocG16X3BvcnRzW2ldLm5vZGUgPT0gbWRldi0+b2ZkZXYuZGV2Lm9mX25vZGUpCisJCQlicmVhazsKKwlpZiAoaSA+PSBNQVhfWlNfUE9SVFMpCisJCXJldHVybiAtRU5PREVWOwogCi0JCQl1YXAtPmRldiA9IG1kZXY7Ci0JCQlkZXZfc2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldiwgdWFwKTsKLQkJCWlmIChtYWNpb19yZXF1ZXN0X3Jlc291cmNlcyh1YXAtPmRldiwgInBtYWNfemlsb2ciKSkKLQkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRmFpbGVkIHRvIHJlcXVlc3QgcmVzb3VyY2UiCi0JCQkJICAgICAgICIsIHBvcnQgc3RpbGwgYWN0aXZlXG4iLAotCQkJCSAgICAgICB1YXAtPm5vZGUtPm5hbWUpOwotCQkJZWxzZQotCQkJCXVhcC0+ZmxhZ3MgfD0gUE1BQ1pJTE9HX0ZMQUdfUlNSQ19SRVFVRVNURUQ7CQkJCQotCQkJcmV0dXJuIDA7Ci0JCX0KLQlyZXR1cm4gLUVOT0RFVjsKKworCXVhcCA9ICZwbXpfcG9ydHNbaV07CisJdWFwLT5kZXYgPSBtZGV2OworCXVhcC0+cG9ydC5kZXYgPSAmbWRldi0+b2ZkZXYuZGV2OworCWRldl9zZXRfZHJ2ZGF0YSgmbWRldi0+b2ZkZXYuZGV2LCB1YXApOworCisJLyogV2Ugc3RpbGwgYWN0aXZhdGUgdGhlIHBvcnQgZXZlbiB3aGVuIGZhaWxpbmcgdG8gcmVxdWVzdCByZXNvdXJjZXMKKwkgKiB0byB3b3JrIGFyb3VuZCBidWdzIGluIGFuY2llbnQgQXBwbGUgZGV2aWNlLXRyZWVzCisJICovCisJaWYgKG1hY2lvX3JlcXVlc3RfcmVzb3VyY2VzKHVhcC0+ZGV2LCAicG1hY196aWxvZyIpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogRmFpbGVkIHRvIHJlcXVlc3QgcmVzb3VyY2UiCisJCSAgICAgICAiLCBwb3J0IHN0aWxsIGFjdGl2ZVxuIiwKKwkJICAgICAgIHVhcC0+bm9kZS0+bmFtZSk7CisJZWxzZQorCQl1YXAtPmZsYWdzIHw9IFBNQUNaSUxPR19GTEFHX1JTUkNfUkVRVUVTVEVEOworCisJcmV0dXJuIHVhcnRfYWRkX29uZV9wb3J0KCZwbXpfdWFydF9yZWcsICZ1YXAtPnBvcnQpOwogfQogCiAvKgpAQCAtMTYzNiwxMiArMTU4NiwxNSBAQAogCWlmICghdWFwKQogCQlyZXR1cm4gLUVOT0RFVjsKIAorCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZwbXpfdWFydF9yZWcsICZ1YXAtPnBvcnQpOworCiAJaWYgKHVhcC0+ZmxhZ3MgJiBQTUFDWklMT0dfRkxBR19SU1JDX1JFUVVFU1RFRCkgewogCQltYWNpb19yZWxlYXNlX3Jlc291cmNlcyh1YXAtPmRldik7CiAJCXVhcC0+ZmxhZ3MgJj0gflBNQUNaSUxPR19GTEFHX1JTUkNfUkVRVUVTVEVEOwogCX0KIAlkZXZfc2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldiwgTlVMTCk7CiAJdWFwLT5kZXYgPSBOVUxMOworCXVhcC0+cG9ydC5kZXYgPSBOVUxMOwogCQogCXJldHVybiAwOwogfQpAQCAtMTY1MCw1OSArMTYwMywxMyBAQAogc3RhdGljIGludCBwbXpfc3VzcGVuZChzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2LCBwbV9tZXNzYWdlX3QgcG1fc3RhdGUpCiB7CiAJc3RydWN0IHVhcnRfcG1hY19wb3J0ICp1YXAgPSBkZXZfZ2V0X2RydmRhdGEoJm1kZXYtPm9mZGV2LmRldik7Ci0Jc3RydWN0IHVhcnRfc3RhdGUgKnN0YXRlOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAodWFwID09IE5VTEwpIHsKIAkJcHJpbnRrKCJIUk0uLi4gcG16X3N1c3BlbmQgd2l0aCBOVUxMIHVhcFxuIik7CiAJCXJldHVybiAwOwogCX0KIAotCWlmIChwbV9zdGF0ZS5ldmVudCA9PSBtZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpCi0JCXJldHVybiAwOwotCi0JcG16X2RlYnVnKCJzdXNwZW5kLCBzd2l0Y2hpbmcgdG8gc3RhdGUgJWRcbiIsIHBtX3N0YXRlLmV2ZW50KTsKLQotCXN0YXRlID0gcG16X3VhcnRfcmVnLnN0YXRlICsgdWFwLT5wb3J0LmxpbmU7Ci0KLQltdXRleF9sb2NrKCZwbXpfaXJxX211dGV4KTsKLQltdXRleF9sb2NrKCZzdGF0ZS0+cG9ydC5tdXRleCk7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmdWFwLT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCWlmIChaU19JU19PUEVOKHVhcCkgfHwgWlNfSVNfQ09OUyh1YXApKSB7Ci0JCS8qIERpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLiAgKi8KLQkJdWFwLT5jdXJyZWdzW1IzXSAmPSB+UnhFTkFCTEU7Ci0JCXVhcC0+Y3VycmVnc1tSNV0gJj0gflR4RU5BQkxFOwotCi0JCS8qIERpc2FibGUgYWxsIGludGVycnVwdHMgYW5kIEJSSyBhc3NlcnRpb24uICAqLwotCQl1YXAtPmN1cnJlZ3NbUjFdICY9IH4oRVhUX0lOVF9FTkFCIHwgVHhJTlRfRU5BQiB8IFJ4SU5UX01BU0spOwotCQl1YXAtPmN1cnJlZ3NbUjVdICY9IH5TTkRfQlJLOwotCQlwbXpfbG9hZF96c3JlZ3ModWFwLCB1YXAtPmN1cnJlZ3MpOwotCQl1YXAtPmZsYWdzIHw9IFBNQUNaSUxPR19GTEFHX0lTX0FTTEVFUDsKLQkJbWIoKTsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1YXAtPnBvcnQubG9jaywgZmxhZ3MpOwotCi0JaWYgKFpTX0lTX09QRU4odWFwKSB8fCBaU19JU19PUEVOKHVhcC0+bWF0ZSkpCi0JCWlmIChaU19JU19BU0xFRVAodWFwLT5tYXRlKSAmJiBaU19JU19JUlFfT04ocG16X2dldF9wb3J0X0EodWFwKSkpIHsKLQkJCXBtel9nZXRfcG9ydF9BKHVhcCktPmZsYWdzICY9IH5QTUFDWklMT0dfRkxBR19JU19JUlFfT047Ci0JCQlkaXNhYmxlX2lycSh1YXAtPnBvcnQuaXJxKTsKLQkJfQotCi0JaWYgKFpTX0lTX0NPTlModWFwKSkKLQkJdWFwLT5wb3J0LmNvbnMtPmZsYWdzICY9IH5DT05fRU5BQkxFRDsKLQotCS8qIFNodXQgdGhlIGNoaXAgZG93biAqLwotCXBtel9zZXRfc2NjX3Bvd2VyKHVhcCwgMCk7Ci0KLQltdXRleF91bmxvY2soJnN0YXRlLT5wb3J0Lm11dGV4KTsKLQltdXRleF91bmxvY2soJnBtel9pcnFfbXV0ZXgpOwotCi0JcG16X2RlYnVnKCJzdXNwZW5kLCBzd2l0Y2hpbmcgY29tcGxldGVcbiIpOwotCi0JbWRldi0+b2ZkZXYuZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gcG1fc3RhdGU7CisJdWFydF9zdXNwZW5kX3BvcnQoJnBtel91YXJ0X3JlZywgJnVhcC0+cG9ydCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE3MTEsNzYgKzE2MTgsMjAgQEAKIHN0YXRpYyBpbnQgcG16X3Jlc3VtZShzdHJ1Y3QgbWFjaW9fZGV2ICptZGV2KQogewogCXN0cnVjdCB1YXJ0X3BtYWNfcG9ydCAqdWFwID0gZGV2X2dldF9kcnZkYXRhKCZtZGV2LT5vZmRldi5kZXYpOwotCXN0cnVjdCB1YXJ0X3N0YXRlICpzdGF0ZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBwd3JfZGVsYXkgPSAwOwogCiAJaWYgKHVhcCA9PSBOVUxMKQogCQlyZXR1cm4gMDsKIAotCWlmIChtZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pCi0JCXJldHVybiAwOwotCQotCXBtel9kZWJ1ZygicmVzdW1lLCBzd2l0Y2hpbmcgdG8gc3RhdGUgMFxuIik7Ci0KLQlzdGF0ZSA9IHBtel91YXJ0X3JlZy5zdGF0ZSArIHVhcC0+cG9ydC5saW5lOwotCi0JbXV0ZXhfbG9jaygmcG16X2lycV9tdXRleCk7Ci0JbXV0ZXhfbG9jaygmc3RhdGUtPnBvcnQubXV0ZXgpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnVhcC0+cG9ydC5sb2NrLCBmbGFncyk7Ci0JaWYgKCFaU19JU19PUEVOKHVhcCkgJiYgIVpTX0lTX0NPTlModWFwKSkgewotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1YXAtPnBvcnQubG9jaywgZmxhZ3MpOwotCQlnb3RvIGJhaWw7Ci0JfQotCXB3cl9kZWxheSA9IF9fcG16X3N0YXJ0dXAodWFwKTsKLQotCS8qIFRha2UgY2FyZSBvZiBjb25maWcgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VkIHdoaWxlIGFzbGVlcCAqLwotCV9fcG16X3NldF90ZXJtaW9zKCZ1YXAtPnBvcnQsICZ1YXAtPnRlcm1pb3NfY2FjaGUsIE5VTEwpOwotCi0JaWYgKFpTX0lTX09QRU4odWFwKSkgewotCQkvKiBFbmFibGUgaW50ZXJydXB0cyAqLwkJCi0JCXVhcC0+Y3VycmVnc1tSMV0gfD0gSU5UX0FMTF9SeCB8IFR4SU5UX0VOQUI7Ci0JCWlmICghWlNfSVNfRVhUQ0xLKHVhcCkpCi0JCQl1YXAtPmN1cnJlZ3NbUjFdIHw9IEVYVF9JTlRfRU5BQjsKLQkJd3JpdGVfenNyZWcodWFwLCBSMSwgdWFwLT5jdXJyZWdzW1IxXSk7Ci0JfQotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWFwLT5wb3J0LmxvY2ssIGZsYWdzKTsKLQotCWlmIChaU19JU19DT05TKHVhcCkpCi0JCXVhcC0+cG9ydC5jb25zLT5mbGFncyB8PSBDT05fRU5BQkxFRDsKLQotCS8qIFJlLWVuYWJsZSBJUlEgb24gdGhlIGNvbnRyb2xsZXIgKi8KLQlpZiAoWlNfSVNfT1BFTih1YXApICYmICFaU19JU19JUlFfT04ocG16X2dldF9wb3J0X0EodWFwKSkpIHsKLQkJcG16X2dldF9wb3J0X0EodWFwKS0+ZmxhZ3MgfD0gUE1BQ1pJTE9HX0ZMQUdfSVNfSVJRX09OOwotCQllbmFibGVfaXJxKHVhcC0+cG9ydC5pcnEpOwotCX0KLQotIGJhaWw6Ci0JbXV0ZXhfdW5sb2NrKCZzdGF0ZS0+cG9ydC5tdXRleCk7Ci0JbXV0ZXhfdW5sb2NrKCZwbXpfaXJxX211dGV4KTsKLQotCS8qIFJpZ2h0IG5vdywgd2UgZGVhbCB3aXRoIGRlbGF5IGJ5IGJsb2NraW5nIGhlcmUsIEknbGwgYmUKLQkgKiBzbWFydGVyIGxhdGVyIG9uCi0JICovCi0JaWYgKHB3cl9kZWxheSAhPSAwKSB7Ci0JCXBtel9kZWJ1ZygicG16OiBkZWxheWluZyAlZCBtc1xuIiwgcHdyX2RlbGF5KTsKLQkJbXNsZWVwKHB3cl9kZWxheSk7Ci0JfQotCi0JcG16X2RlYnVnKCJyZXN1bWUsIHN3aXRjaGluZyBjb21wbGV0ZVxuIik7Ci0KLQltZGV2LT5vZmRldi5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPSBQTV9FVkVOVF9PTjsKKwl1YXJ0X3Jlc3VtZV9wb3J0KCZwbXpfdWFydF9yZWcsICZ1YXAtPnBvcnQpOwogCiAJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBQcm9iZSBhbGwgcG9ydHMgaW4gdGhlIHN5c3RlbSBhbmQgYnVpbGQgdGhlIHBvcnRzIGFycmF5LCB3ZSByZWdpc3RlcgotICogd2l0aCB0aGUgc2VyaWFsIGxheWVyIGF0IHRoaXMgcG9pbnQsIHRoZSBtYWNpby10eXBlIHByb2JpbmcgaXMgb25seQotICogdXNlZCBsYXRlciB0byAiYXR0YWNoIiB0byB0aGUgc3lzZnMgdHJlZSBzbyB3ZSBnZXQgcG93ZXIgbWFuYWdlbWVudAotICogZXZlbnRzCisgKiB3aXRoIHRoZSBzZXJpYWwgbGF5ZXIgbGF0ZXIsIHNvIHdlIGdldCBhIHByb3BlciBzdHJ1Y3QgZGV2aWNlIHdoaWNoCisgKiBhbGxvd3MgdGhlIHR0eSB0byBhdHRhY2ggcHJvcGVybHkuIFRoaXMgaXMgbGF0ZXIgdGhhbiBpdCB1c2VkIHRvIGJlCisgKiBidXQgdGhlIHR0eSBsYXllciByZWFsbHkgd2FudHMgaXQgdGhhdCB3YXkuCiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHBtel9wcm9iZSh2b2lkKQogewpAQCAtMTgxNiw4ICsxNjY3LDEwIEBACiAJCS8qCiAJCSAqIEZpbGwgYmFzaWMgZmllbGRzIGluIHRoZSBwb3J0IHN0cnVjdHVyZXMKIAkJICovCi0JCXBtel9wb3J0c1tjb3VudF0ubWF0ZQkJPSAmcG16X3BvcnRzW2NvdW50KzFdOwotCQlwbXpfcG9ydHNbY291bnQrMV0ubWF0ZQkJPSAmcG16X3BvcnRzW2NvdW50XTsKKwkJaWYgKG5vZGVfYiAhPSBOVUxMKSB7CisJCQlwbXpfcG9ydHNbY291bnRdLm1hdGUJCT0gJnBtel9wb3J0c1tjb3VudCsxXTsKKwkJCXBtel9wb3J0c1tjb3VudCsxXS5tYXRlCQk9ICZwbXpfcG9ydHNbY291bnRdOworCQl9CiAJCXBtel9wb3J0c1tjb3VudF0uZmxhZ3MJCT0gUE1BQ1pJTE9HX0ZMQUdfSVNfQ0hBTk5FTF9BOwogCQlwbXpfcG9ydHNbY291bnRdLm5vZGUJCT0gbm9kZV9hOwogCQlwbXpfcG9ydHNbY291bnQrMV0ubm9kZQkJPSBub2RlX2I7CkBAIC0xODU1LDggKzE3MDgsOCBAQAogCXN0cnVjdCByZXNvdXJjZSAqcl9wb3J0czsKIAlpbnQgaXJxOwogCi0Jcl9wb3J0cyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZSh1YXAtPm5vZGUsIElPUkVTT1VSQ0VfTUVNLCAwKTsKLQlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHVhcC0+bm9kZSwgMCk7CisJcl9wb3J0cyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZSh1YXAtPnBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwlpcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHVhcC0+cGRldiwgMCk7CiAJaWYgKCFyX3BvcnRzIHx8ICFpcnEpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC0xODg1LDE5ICsxNzM4LDE5IEBACiAKIAlwbXpfcG9ydHNfY291bnQgPSAwOwogCi0JcG16X3BvcnRzWzBdLm1hdGUgICAgICA9ICZwbXpfcG9ydHNbMV07CiAJcG16X3BvcnRzWzBdLnBvcnQubGluZSA9IDA7CiAJcG16X3BvcnRzWzBdLmZsYWdzICAgICA9IFBNQUNaSUxPR19GTEFHX0lTX0NIQU5ORUxfQTsKLQlwbXpfcG9ydHNbMF0ubm9kZSAgICAgID0gJnNjY19hX3BkZXY7CisJcG16X3BvcnRzWzBdLnBkZXYgICAgICA9ICZzY2NfYV9wZGV2OwogCWVyciA9IHBtel9pbml0X3BvcnQoJnBtel9wb3J0c1swXSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAlwbXpfcG9ydHNfY291bnQrKzsKIAorCXBtel9wb3J0c1swXS5tYXRlICAgICAgPSAmcG16X3BvcnRzWzFdOwogCXBtel9wb3J0c1sxXS5tYXRlICAgICAgPSAmcG16X3BvcnRzWzBdOwogCXBtel9wb3J0c1sxXS5wb3J0LmxpbmUgPSAxOwogCXBtel9wb3J0c1sxXS5mbGFncyAgICAgPSAwOwotCXBtel9wb3J0c1sxXS5ub2RlICAgICAgPSAmc2NjX2JfcGRldjsKKwlwbXpfcG9ydHNbMV0ucGRldiAgICAgID0gJnNjY19iX3BkZXY7CiAJZXJyID0gcG16X2luaXRfcG9ydCgmcG16X3BvcnRzWzFdKTsKIAlpZiAoZXJyKQogCQlyZXR1cm4gZXJyOwpAQCAtMTkxMywxNiArMTc2NiwzNSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBwbXpfYXR0YWNoKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CisJc3RydWN0IHVhcnRfcG1hY19wb3J0ICp1YXA7CiAJaW50IGk7CiAKKwkvKiBJdGVyYXRlIHRoZSBwbXpfcG9ydHMgYXJyYXkgdG8gZmluZCBhIG1hdGNoaW5nIGVudHJ5ICovCiAJZm9yIChpID0gMDsgaSA8IHBtel9wb3J0c19jb3VudDsgaSsrKQotCQlpZiAocG16X3BvcnRzW2ldLm5vZGUgPT0gcGRldikKLQkJCXJldHVybiAwOwotCXJldHVybiAtRU5PREVWOworCQlpZiAocG16X3BvcnRzW2ldLnBkZXYgPT0gcGRldikKKwkJCWJyZWFrOworCWlmIChpID49IHBtel9wb3J0c19jb3VudCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl1YXAgPSAmcG16X3BvcnRzW2ldOworCXVhcC0+cG9ydC5kZXYgPSAmcGRldi0+ZGV2OworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHVhcCk7CisKKwlyZXR1cm4gdWFydF9hZGRfb25lX3BvcnQoJnBtel91YXJ0X3JlZywgJnVhcC0+cG9ydCk7CiB9CiAKIHN0YXRpYyBpbnQgX19leGl0IHBtel9kZXRhY2goc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKIHsKKwlzdHJ1Y3QgdWFydF9wbWFjX3BvcnQgKnVhcCA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJaWYgKCF1YXApCisJCXJldHVybiAtRU5PREVWOworCisJdWFydF9yZW1vdmVfb25lX3BvcnQoJnBtel91YXJ0X3JlZywgJnVhcC0+cG9ydCk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCBOVUxMKTsKKwl1YXAtPnBvcnQuZGV2ID0gTlVMTDsKKwogCXJldHVybiAwOwogfQogCkBAIC0xOTU0LDM4ICsxODI2LDEzIEBACiAgKi8KIHN0YXRpYyBpbnQgX19pbml0IHBtel9yZWdpc3Rlcih2b2lkKQogewotCWludCBpLCByYzsKLQkKIAlwbXpfdWFydF9yZWcubnIgPSBwbXpfcG9ydHNfY291bnQ7CiAJcG16X3VhcnRfcmVnLmNvbnMgPSBQTUFDWklMT0dfQ09OU09MRTsKIAogCS8qCiAJICogUmVnaXN0ZXIgdGhpcyBkcml2ZXIgd2l0aCB0aGUgc2VyaWFsIGNvcmUKIAkgKi8KLQlyYyA9IHVhcnRfcmVnaXN0ZXJfZHJpdmVyKCZwbXpfdWFydF9yZWcpOwotCWlmIChyYykKLQkJcmV0dXJuIHJjOwotCi0JLyoKLQkgKiBSZWdpc3RlciBlYWNoIHBvcnQgd2l0aCB0aGUgc2VyaWFsIGNvcmUKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgcG16X3BvcnRzX2NvdW50OyBpKyspIHsKLQkJc3RydWN0IHVhcnRfcG1hY19wb3J0ICp1cG9ydCA9ICZwbXpfcG9ydHNbaV07Ci0JCS8qIE5VTEwgbm9kZSBtYXkgaGFwcGVuIG9uIHdhbGxzdHJlZXQgKi8KLQkJaWYgKHVwb3J0LT5ub2RlICE9IE5VTEwpCi0JCQlyYyA9IHVhcnRfYWRkX29uZV9wb3J0KCZwbXpfdWFydF9yZWcsICZ1cG9ydC0+cG9ydCk7Ci0JCWlmIChyYykKLQkJCWdvdG8gZXJyX291dDsKLQl9Ci0KLQlyZXR1cm4gMDsKLWVycl9vdXQ6Ci0Jd2hpbGUgKGktLSA+IDApIHsKLQkJc3RydWN0IHVhcnRfcG1hY19wb3J0ICp1cG9ydCA9ICZwbXpfcG9ydHNbaV07Ci0JCXVhcnRfcmVtb3ZlX29uZV9wb3J0KCZwbXpfdWFydF9yZWcsICZ1cG9ydC0+cG9ydCk7Ci0JfQotCXVhcnRfdW5yZWdpc3Rlcl9kcml2ZXIoJnBtel91YXJ0X3JlZyk7Ci0JcmV0dXJuIHJjOworCXJldHVybiB1YXJ0X3JlZ2lzdGVyX2RyaXZlcigmcG16X3VhcnRfcmVnKTsKIH0KIAogI2lmZGVmIENPTkZJR19QUENfUE1BQwpAQCAtMjA4NCwxMCArMTkzMSwxMyBAQAogCiAJZm9yIChpID0gMDsgaSA8IHBtel9wb3J0c19jb3VudDsgaSsrKSB7CiAJCXN0cnVjdCB1YXJ0X3BtYWNfcG9ydCAqdXBvcnQgPSAmcG16X3BvcnRzW2ldOwotCQlpZiAodXBvcnQtPm5vZGUgIT0gTlVMTCkgewotCQkJdWFydF9yZW1vdmVfb25lX3BvcnQoJnBtel91YXJ0X3JlZywgJnVwb3J0LT5wb3J0KTsKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKKwkJaWYgKHVwb3J0LT5ub2RlICE9IE5VTEwpCiAJCQlwbXpfZGlzcG9zZV9wb3J0KHVwb3J0KTsKLQkJfQorI2Vsc2UKKwkJaWYgKHVwb3J0LT5wZGV2ICE9IE5VTEwpCisJCQlwbXpfZGlzcG9zZV9wb3J0KHVwb3J0KTsKKyNlbmRpZgogCX0KIAkvKiBVbnJlZ2lzdGVyIFVBUlQgZHJpdmVyICovCiAJdWFydF91bnJlZ2lzdGVyX2RyaXZlcigmcG16X3VhcnRfcmVnKTsKQEAgLTIxMTQsOCArMTk2NCw2IEBACiAJc3RydWN0IHVhcnRfcG1hY19wb3J0ICp1YXAgPSAmcG16X3BvcnRzW2Nvbi0+aW5kZXhdOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKLQlpZiAoWlNfSVNfQVNMRUVQKHVhcCkpCi0JCXJldHVybjsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdWFwLT5wb3J0LmxvY2ssIGZsYWdzKTsKIAogCS8qIFR1cm4gb2YgaW50ZXJydXB0cyBhbmQgZW5hYmxlIHRoZSB0cmFuc21pdHRlci4gKi8KQEAgLTIxNjAsOCArMjAwOCwxMyBAQAogCWlmIChjby0+aW5kZXggPj0gcG16X3BvcnRzX2NvdW50KQogCQljby0+aW5kZXggPSAwOwogCXVhcCA9ICZwbXpfcG9ydHNbY28tPmluZGV4XTsKKyNpZmRlZiBDT05GSUdfUFBDX1BNQUMKIAlpZiAodWFwLT5ub2RlID09IE5VTEwpCiAJCXJldHVybiAtRU5PREVWOworI2Vsc2UKKwlpZiAodWFwLT5wZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworI2VuZGlmCiAJcG9ydCA9ICZ1YXAtPnBvcnQ7CiAKIAkvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3BtYWNfemlsb2cuaCBiL2RyaXZlcnMvdHR5L3NlcmlhbC9wbWFjX3ppbG9nLmgKaW5kZXggY2JjMzRmYi4uMzQ4MzI0MiAxMDA2NDQKLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL3BtYWNfemlsb2cuaAorKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvcG1hY196aWxvZy5oCkBAIC0xLDE2ICsxLDYgQEAKICNpZm5kZWYgX19QTUFDX1pJTE9HX0hfXwogI2RlZmluZSBfX1BNQUNfWklMT0dfSF9fCiAKLSNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLSNkZWZpbmUgcG16X2RlYnVnKGZtdCwgYXJnLi4uKQlkZXZfZGJnKCZ1YXAtPmRldi0+b2ZkZXYuZGV2LCBmbXQsICMjIGFyZykKLSNkZWZpbmUgcG16X2Vycm9yKGZtdCwgYXJnLi4uKQlkZXZfZXJyKCZ1YXAtPmRldi0+b2ZkZXYuZGV2LCBmbXQsICMjIGFyZykKLSNkZWZpbmUgcG16X2luZm8oZm10LCBhcmcuLi4pCWRldl9pbmZvKCZ1YXAtPmRldi0+b2ZkZXYuZGV2LCBmbXQsICMjIGFyZykKLSNlbHNlCi0jZGVmaW5lIHBtel9kZWJ1ZyhmbXQsIGFyZy4uLikJZGV2X2RiZygmdWFwLT5ub2RlLT5kZXYsIGZtdCwgIyMgYXJnKQotI2RlZmluZSBwbXpfZXJyb3IoZm10LCBhcmcuLi4pCWRldl9lcnIoJnVhcC0+bm9kZS0+ZGV2LCBmbXQsICMjIGFyZykKLSNkZWZpbmUgcG16X2luZm8oZm10LCBhcmcuLi4pCWRldl9pbmZvKCZ1YXAtPm5vZGUtPmRldiwgZm10LCAjIyBhcmcpCi0jZW5kaWYKLQogLyoKICAqIEF0IG1vc3QgMiBFU0NDcyB3aXRoIDIgcG9ydHMgZWFjaAogICovCkBAIC0zNSw3ICsyNSw3IEBACiAJICovCiAJc3RydWN0IGRldmljZV9ub2RlCQkqbm9kZTsKICNlbHNlCi0Jc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKm5vZGU7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7CiAjZW5kaWYKIAogCS8qIFBvcnQgdHlwZSBhcyBvYnRhaW5lZCBmcm9tIGRldmljZSB0cmVlIChJUkRBLCBtb2RlbSwgLi4uKSAqLwpAQCAtNTAsMTQgKzQwLDExIEBACiAjZGVmaW5lIFBNQUNaSUxPR19GTEFHX1JFR1NfSEVMRAkweDAwMDAwMDEwCiAjZGVmaW5lIFBNQUNaSUxPR19GTEFHX1RYX1NUT1BQRUQJMHgwMDAwMDAyMAogI2RlZmluZSBQTUFDWklMT0dfRkxBR19UWF9BQ1RJVkUJMHgwMDAwMDA0MAotI2RlZmluZSBQTUFDWklMT0dfRkxBR19FTkFCTEVEICAgICAgICAgIDB4MDAwMDAwODAKICNkZWZpbmUgUE1BQ1pJTE9HX0ZMQUdfSVNfSVJEQQkJMHgwMDAwMDEwMAogI2RlZmluZSBQTUFDWklMT0dfRkxBR19JU19JTlRNT0RFTQkweDAwMDAwMjAwCiAjZGVmaW5lIFBNQUNaSUxPR19GTEFHX0hBU19ETUEJCTB4MDAwMDA0MDAKICNkZWZpbmUgUE1BQ1pJTE9HX0ZMQUdfUlNSQ19SRVFVRVNURUQJMHgwMDAwMDgwMAotI2RlZmluZSBQTUFDWklMT0dfRkxBR19JU19BU0xFRVAJMHgwMDAwMTAwMAogI2RlZmluZSBQTUFDWklMT0dfRkxBR19JU19PUEVOCQkweDAwMDAyMDAwCi0jZGVmaW5lIFBNQUNaSUxPR19GTEFHX0lTX0lSUV9PTgkweDAwMDA0MDAwCiAjZGVmaW5lIFBNQUNaSUxPR19GTEFHX0lTX0VYVENMSwkweDAwMDA4MDAwCiAjZGVmaW5lIFBNQUNaSUxPR19GTEFHX0JSRUFLCQkweDAwMDEwMDAwCiAKQEAgLTc0LDYgKzYxLDggQEAKIAl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfcmVncwlfX2lvbWVtICpyeF9kbWFfcmVnczsKICNlbmRpZgogCisJdW5zaWduZWQgY2hhcgkJCWlycV9uYW1lWzhdOworCiAJc3RydWN0IGt0ZXJtaW9zCQkJdGVybWlvc19jYWNoZTsKIH07CiAKQEAgLTM4OCw5ICszNzcsNyBAQAogI2RlZmluZSBaU19JU19JUkRBKFVQKQkJCSgoVVApLT5mbGFncyAmIFBNQUNaSUxPR19GTEFHX0lTX0lSREEpCiAjZGVmaW5lIFpTX0lTX0lOVE1PREVNKFVQKQkJKChVUCktPmZsYWdzICYgUE1BQ1pJTE9HX0ZMQUdfSVNfSU5UTU9ERU0pCiAjZGVmaW5lIFpTX0hBU19ETUEoVVApCQkJKChVUCktPmZsYWdzICYgUE1BQ1pJTE9HX0ZMQUdfSEFTX0RNQSkKLSNkZWZpbmUgWlNfSVNfQVNMRUVQKFVQKQkJKChVUCktPmZsYWdzICYgUE1BQ1pJTE9HX0ZMQUdfSVNfQVNMRUVQKQogI2RlZmluZSBaU19JU19PUEVOKFVQKQkJCSgoVVApLT5mbGFncyAmIFBNQUNaSUxPR19GTEFHX0lTX09QRU4pCi0jZGVmaW5lIFpTX0lTX0lSUV9PTihVUCkJCSgoVVApLT5mbGFncyAmIFBNQUNaSUxPR19GTEFHX0lTX0lSUV9PTikKICNkZWZpbmUgWlNfSVNfRVhUQ0xLKFVQKQkJKChVUCktPmZsYWdzICYgUE1BQ1pJTE9HX0ZMQUdfSVNfRVhUQ0xLKQogCiAjZW5kaWYgLyogX19QTUFDX1pJTE9HX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL3VjY191YXJ0LmMgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdWNjX3VhcnQuYwppbmRleCBjZWE4OTE4Li4yZWJlNjA2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwvdWNjX3VhcnQuYworKysgYi9kcml2ZXJzL3R0eS9zZXJpYWwvdWNjX3VhcnQuYwpAQCAtOTYzLDYgKzk2Myw5IEBACiAJLyogRG8gd2UgcmVhbGx5IG5lZWQgYSBzcGlubG9jayBoZXJlPyAqLwogCXNwaW5fbG9ja19pcnFzYXZlKCZwb3J0LT5sb2NrLCBmbGFncyk7CiAKKwkvKiBVcGRhdGUgdGhlIHBlci1wb3J0IHRpbWVvdXQuICovCisJdWFydF91cGRhdGVfdGltZW91dChwb3J0LCB0ZXJtaW9zLT5jX2NmbGFnLCBiYXVkKTsKKwogCW91dF9iZTE2KCZ1Y2NwLT51cHNtciwgdXBzbXIpOwogCWlmIChzb2Z0X3VhcnQpIHsKIAkJb3V0X2JlMTYoJnVjY3VwLT5zdXBzbXIsIHN1cHNtcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMgYi9kcml2ZXJzL3VzYi9jbGFzcy9jZGMtYWNtLmMKaW5kZXggZThjNTY0YS4uYTgwNzhkMCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvY2xhc3MvY2RjLWFjbS5jCisrKyBiL2RyaXZlcnMvdXNiL2NsYXNzL2NkYy1hY20uYwpAQCAtMTQ1OCw2ICsxNDU4LDE2IEBACiAJfSwKIAl7IFVTQl9ERVZJQ0UoMHgyMmI4LCAweDY0MjUpLCAvKiBNb3Rvcm9sYSBNT1RPTUFHWCBwaG9uZXMgKi8KIAl9LAorCS8qIE1vdG9yb2xhIEgyNCBIU1BBIG1vZHVsZTogKi8KKwl7IFVTQl9ERVZJQ0UoMHgyMmI4LCAweDJkOTEpIH0sIC8qIG1vZGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCXsgVVNCX0RFVklDRSgweDIyYjgsIDB4MmQ5MikgfSwgLyogbW9kZW0gICAgICAgICAgICsgZGlhZ25vc3RpY3MgICAgICAgICovCisJeyBVU0JfREVWSUNFKDB4MjJiOCwgMHgyZDkzKSB9LCAvKiBtb2RlbSArIEFUIHBvcnQgICAgICAgICAgICAgICAgICAgICAgKi8KKwl7IFVTQl9ERVZJQ0UoMHgyMmI4LCAweDJkOTUpIH0sIC8qIG1vZGVtICsgQVQgcG9ydCArIGRpYWdub3N0aWNzICAgICAgICAqLworCXsgVVNCX0RFVklDRSgweDIyYjgsIDB4MmQ5NikgfSwgLyogbW9kZW0gICAgICAgICAgICAgICAgICAgICAgICAgKyBOTUVBICovCisJeyBVU0JfREVWSUNFKDB4MjJiOCwgMHgyZDk3KSB9LCAvKiBtb2RlbSAgICAgICAgICAgKyBkaWFnbm9zdGljcyArIE5NRUEgKi8KKwl7IFVTQl9ERVZJQ0UoMHgyMmI4LCAweDJkOTkpIH0sIC8qIG1vZGVtICsgQVQgcG9ydCAgICAgICAgICAgICAgICsgTk1FQSAqLworCXsgVVNCX0RFVklDRSgweDIyYjgsIDB4MmQ5YSkgfSwgLyogbW9kZW0gKyBBVCBwb3J0ICsgZGlhZ25vc3RpY3MgKyBOTUVBICovCisKIAl7IFVTQl9ERVZJQ0UoMHgwNTcyLCAweDEzMjkpLCAvKiBIdW1taW5nYmlyZCBodWM1NnMgKENvbmV4YW50KSAqLwogCS5kcml2ZXJfaW5mbyA9IE5PX1VOSU9OX05PUk1BTCwgLyogdW5pb24gZGVzY3JpcHRvciBtaXNwbGFjZWQgb24KIAkJCQkJICAgZGF0YSBpbnRlcmZhY2UgaW5zdGVhZCBvZgpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZHdjMy9jb3JlLmMgYi9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYwppbmRleCA3MTdlYmM5Li42MDBkODIzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYworKysgYi9kcml2ZXJzL3VzYi9kd2MzL2NvcmUuYwpAQCAtMjY0LDcgKzI2NCw3IEBACiAJCXJldCA9IC1FTk9ERVY7CiAJCWdvdG8gZXJyMDsKIAl9Ci0JZHdjLT5yZXZpc2lvbiA9IHJlZyAmIERXQzNfR1NOUFNSRVZfTUFTSzsKKwlkd2MtPnJldmlzaW9uID0gcmVnOwogCiAJZHdjM19jb3JlX3NvZnRfcmVzZXQoZHdjKTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2FtZDU1MzZ1ZGMuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9hbWQ1NTM2dWRjLmMKaW5kZXggNDczMDAxNi4uNDVmNDIyYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2FtZDU1MzZ1ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvYW1kNTUzNnVkYy5jCkBAIC0xOTU5LDcgKzE5NTksNyBAQAogCXUzMiB0bXA7CiAKIAlpZiAoIWRyaXZlciB8fCAhYmluZCB8fCAhZHJpdmVyLT5zZXR1cAotCQkJfHwgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfSElHSCkKKwkJCXx8IGRyaXZlci0+c3BlZWQgPCBVU0JfU1BFRURfSElHSCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCFkZXYpCiAJCXJldHVybiAtRU5PREVWOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9lcGF1dG9jb25mLmMKaW5kZXggNTk2YTBiNC4uNGRmZjgzZCAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2VwYXV0b2NvbmYuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZXBhdXRvY29uZi5jCkBAIC0xMzAsOSArMTMwLDYgQEAKIAkJCW51bV9yZXFfc3RyZWFtcyA9IGVwX2NvbXAtPmJtQXR0cmlidXRlcyAmIDB4MWY7CiAJCQlpZiAobnVtX3JlcV9zdHJlYW1zID4gZXAtPm1heF9zdHJlYW1zKQogCQkJCXJldHVybiAwOwotCQkJLyogVXBkYXRlIHRoZSBlcF9jb21wIGRlc2NyaXB0b3IgaWYgbmVlZGVkICovCi0JCQlpZiAobnVtX3JlcV9zdHJlYW1zICE9IGVwLT5tYXhfc3RyZWFtcykKLQkJCQllcF9jb21wLT5ibUF0dHJpYnV0ZXMgPSBlcC0+bWF4X3N0cmVhbXM7CiAJCX0KIAogCX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX21hc3Nfc3RvcmFnZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWFzc19zdG9yYWdlLmMKaW5kZXggYzM5ZDU4OC4uMWE2ZjQxNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWFzc19zdG9yYWdlLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZfbWFzc19zdG9yYWdlLmMKQEAgLTI5NzUsNiArMjk3NSw3IEBACiAJZnNnX2NvbW1vbl9wdXQoY29tbW9uKTsKIAl1c2JfZnJlZV9kZXNjcmlwdG9ycyhmc2ctPmZ1bmN0aW9uLmRlc2NyaXB0b3JzKTsKIAl1c2JfZnJlZV9kZXNjcmlwdG9ycyhmc2ctPmZ1bmN0aW9uLmhzX2Rlc2NyaXB0b3JzKTsKKwl1c2JfZnJlZV9kZXNjcmlwdG9ycyhmc2ctPmZ1bmN0aW9uLnNzX2Rlc2NyaXB0b3JzKTsKIAlrZnJlZShmc2cpOwogfQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9waG9uZXQuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCmluZGV4IDE2YTUwOWEuLjdjZGNiNjMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3Bob25ldC5jCkBAIC0yOTgsMTEgKzI5OCwxMCBAQAogc3RhdGljIGludAogcG5fcnhfc3VibWl0KHN0cnVjdCBmX3Bob25ldCAqZnAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxLCBnZnBfdCBnZnBfZmxhZ3MpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGZwLT5kZXY7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJaW50IGVycjsKIAotCXBhZ2UgPSBfX25ldGRldl9hbGxvY19wYWdlKGRldiwgZ2ZwX2ZsYWdzKTsKKwlwYWdlID0gYWxsb2NfcGFnZShnZnBfZmxhZ3MpOwogCWlmICghcGFnZSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKQEAgLTMxMiw3ICszMTEsNyBAQAogCiAJZXJyID0gdXNiX2VwX3F1ZXVlKGZwLT5vdXRfZXAsIHJlcSwgZ2ZwX2ZsYWdzKTsKIAlpZiAodW5saWtlbHkoZXJyKSkKLQkJbmV0ZGV2X2ZyZWVfcGFnZShkZXYsIHBhZ2UpOworCQlwdXRfcGFnZShwYWdlKTsKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zNzQsOSArMzczLDkgQEAKIAl9CiAKIAlpZiAocGFnZSkKLQkJbmV0ZGV2X2ZyZWVfcGFnZShkZXYsIHBhZ2UpOworCQlwdXRfcGFnZShwYWdlKTsKIAlpZiAocmVxKQotCQlwbl9yeF9zdWJtaXQoZnAsIHJlcSwgR0ZQX0FUT01JQyk7CisJCXBuX3J4X3N1Ym1pdChmcCwgcmVxLCBHRlBfQVRPTUlDIHwgX19HRlBfQ09MRCk7CiB9CiAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC00MzYsNyArNDM1LDcgQEAKIAogCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOwogCQkJZm9yIChpID0gMDsgaSA8IHBob25ldF9yeHFfc2l6ZTsgaSsrKQotCQkJCXBuX3J4X3N1Ym1pdChmcCwgZnAtPm91dF9yZXF2W2ldLCBHRlBfQVRPTUlDKTsKKwkJCQlwbl9yeF9zdWJtaXQoZnAsIGZwLT5vdXRfcmVxdltpXSwgR0ZQX0FUT01JQyB8IF9fR0ZQX0NPTEQpOwogCQl9CiAJCXNwaW5fdW5sb2NrKCZwb3J0LT5sb2NrKTsKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZl9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3NlcmlhbC5jCmluZGV4IDkxZmRmNzkuLmNmMzNhOGQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mX3NlcmlhbC5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mX3NlcmlhbC5jCkBAIC0xMzEsOCArMTMxLDggQEAKIAl9CiAJaWYgKCFnc2VyLT5wb3J0LmluLT5kZXNjIHx8ICFnc2VyLT5wb3J0Lm91dC0+ZGVzYykgewogCQlEQkcoY2RldiwgImFjdGl2YXRlIGdlbmVyaWMgdHR5R1MlZFxuIiwgZ3Nlci0+cG9ydF9udW0pOwotCQlpZiAoIWNvbmZpZ19lcF9ieV9zcGVlZChjZGV2LT5nYWRnZXQsIGYsIGdzZXItPnBvcnQuaW4pIHx8Ci0JCSAgICAhY29uZmlnX2VwX2J5X3NwZWVkKGNkZXYtPmdhZGdldCwgZiwgZ3Nlci0+cG9ydC5vdXQpKSB7CisJCWlmIChjb25maWdfZXBfYnlfc3BlZWQoY2Rldi0+Z2FkZ2V0LCBmLCBnc2VyLT5wb3J0LmluKSB8fAorCQkgICAgY29uZmlnX2VwX2J5X3NwZWVkKGNkZXYtPmdhZGdldCwgZiwgZ3Nlci0+cG9ydC5vdXQpKSB7CiAJCQlnc2VyLT5wb3J0LmluLT5kZXNjID0gTlVMTDsKIAkJCWdzZXItPnBvcnQub3V0LT5kZXNjID0gTlVMTDsKIAkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9teGNfdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX214Y191ZGMuYwppbmRleCA0M2E0OWVjLi5kY2JjMGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX214Y191ZGMuYworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX214Y191ZGMuYwpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzbF9kZXZpY2VzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPG1hY2gvaGFyZHdhcmUuaD4KIApAQCAtODgsNyArODksNiBAQAogdm9pZCBmc2xfdWRjX2Nsa19maW5hbGl6ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQogewogCXN0cnVjdCBmc2xfdXNiMl9wbGF0Zm9ybV9kYXRhICpwZGF0YSA9IHBkZXYtPmRldi5wbGF0Zm9ybV9kYXRhOwotI2lmIGRlZmluZWQoQ09ORklHX1NPQ19JTVgzNSkKIAlpZiAoY3B1X2lzX214MzUoKSkgewogCQl1bnNpZ25lZCBpbnQgdjsKIApAQCAtMTAxLDcgKzEwMSw2IEBACiAJCQkJCVVTQlBIWUNUUkxfT1RHQkFTRV9PRkZTRVQpKTsKIAkJfQogCX0KLSNlbmRpZgogCiAJLyogVUxQSSB0cmFuc2NlaXZlcnMgZG9uJ3QgbmVlZCB1c2JwbGwgKi8KIAlpZiAocGRhdGEtPnBoeV9tb2RlID09IEZTTF9VU0IyX1BIWV9VTFBJKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF9xZV91ZGMuYwppbmRleCAyYTAzZTRkLi5lMDBjZjkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3FlX3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfcWVfdWRjLmMKQEAgLTIzMzYsOCArMjMzNiw3IEBACiAJaWYgKCF1ZGNfY29udHJvbGxlcikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoIWRyaXZlciB8fCAoZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfRlVMTAotCQkJJiYgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfSElHSCkKKwlpZiAoIWRyaXZlciB8fCBkcml2ZXItPnNwZWVkIDwgVVNCX1NQRUVEX0ZVTEwKIAkJCXx8ICFiaW5kIHx8ICFkcml2ZXItPmRpc2Nvbm5lY3QgfHwgIWRyaXZlci0+c2V0dXApCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VkY19jb3JlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VkY19jb3JlLmMKaW5kZXggYjNiM2Q4My4uZGQyOGVmMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91ZGNfY29yZS5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdWRjX2NvcmUuYwpAQCAtNjk2LDEyICs2OTYsMzEgQEAKIAkJa2ZyZWUocmVxKTsKIH0KIAotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEFjdHVhbGx5IGFkZCBhIGRURCBjaGFpbiB0byBhbiBlbXB0eSBkUUggYW5kIGxldCBnbyAqLworc3RhdGljIHZvaWQgZnNsX3ByaW1lX2VwKHN0cnVjdCBmc2xfZXAgKmVwLCBzdHJ1Y3QgZXBfdGRfc3RydWN0ICp0ZCkKK3sKKwlzdHJ1Y3QgZXBfcXVldWVfaGVhZCAqcWggPSBnZXRfcWhfYnlfZXAoZXApOworCisJLyogV3JpdGUgZFFIIG5leHQgcG9pbnRlciBhbmQgdGVybWluYXRlIGJpdCB0byAwICovCisJcWgtPm5leHRfZHRkX3B0ciA9IGNwdV90b19oYzMyKHRkLT50ZF9kbWEKKwkJCSYgRVBfUVVFVUVfSEVBRF9ORVhUX1BPSU5URVJfTUFTSyk7CisKKwkvKiBDbGVhciBhY3RpdmUgYW5kIGhhbHQgYml0ICovCisJcWgtPnNpemVfaW9jX2ludF9zdHMgJj0gY3B1X3RvX2hjMzIofihFUF9RVUVVRV9IRUFEX1NUQVRVU19BQ1RJVkUKKwkJCQkJfCBFUF9RVUVVRV9IRUFEX1NUQVRVU19IQUxUKSk7CisKKwkvKiBFbnN1cmUgdGhhdCB1cGRhdGVzIHRvIHRoZSBRSCB3aWxsIG9jY3VyIGJlZm9yZSBwcmltaW5nLiAqLworCXdtYigpOworCisJLyogUHJpbWUgZW5kcG9pbnQgYnkgd3JpdGluZyBjb3JyZWN0IGJpdCB0byBFTkRQVFBSSU1FICovCisJZnNsX3dyaXRlbChlcF9pc19pbihlcCkgPyAoMSA8PCAoZXBfaW5kZXgoZXApICsgMTYpKQorCQkJOiAoMSA8PCAoZXBfaW5kZXgoZXApKSksICZkcl9yZWdzLT5lbmRwb2ludHByaW1lKTsKK30KKworLyogQWRkIGRURCBjaGFpbiB0byB0aGUgZFFIIG9mIGFuIEVQICovCiBzdGF0aWMgdm9pZCBmc2xfcXVldWVfdGQoc3RydWN0IGZzbF9lcCAqZXAsIHN0cnVjdCBmc2xfcmVxICpyZXEpCiB7Ci0JaW50IGkgPSBlcF9pbmRleChlcCkgKiAyICsgZXBfaXNfaW4oZXApOwogCXUzMiB0ZW1wLCBiaXRtYXNrLCB0bXBfc3RhdDsKLQlzdHJ1Y3QgZXBfcXVldWVfaGVhZCAqZFFIID0gJmVwLT51ZGMtPmVwX3FoW2ldOwogCiAJLyogVkRCRygiUUggYWRkciBSZWdpc3RlciAweCU4eCIsIGRyX3JlZ3MtPmVuZHBvaW50bGlzdGFkZHIpOwogCVZEQkcoImVwX3FoWyVkXSBhZGRyIGlzIDB4JTh4IiwgaSwgKHUzMikmKGVwLT51ZGMtPmVwX3FoW2ldKSk7ICovCkBAIC03MTksNyArNzM4LDcgQEAKIAkJCWNwdV90b19oYzMyKHJlcS0+aGVhZC0+dGRfZG1hICYgRFREX0FERFJfTUFTSyk7CiAJCS8qIFJlYWQgcHJpbWUgYml0LCBpZiAxIGdvdG8gZG9uZSAqLwogCQlpZiAoZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwb2ludHByaW1lKSAmIGJpdG1hc2spCi0JCQlnb3RvIG91dDsKKwkJCXJldHVybjsKIAogCQlkbyB7CiAJCQkvKiBTZXQgQVREVFcgYml0IGluIFVTQkNNRCAqLwpAQCAtNzM2LDI4ICs3NTUsMTAgQEAKIAkJZnNsX3dyaXRlbCh0ZW1wICYgflVTQl9DTURfQVREVFcsICZkcl9yZWdzLT51c2JjbWQpOwogCiAJCWlmICh0bXBfc3RhdCkKLQkJCWdvdG8gb3V0OworCQkJcmV0dXJuOwogCX0KIAotCS8qIFdyaXRlIGRRSCBuZXh0IHBvaW50ZXIgYW5kIHRlcm1pbmF0ZSBiaXQgdG8gMCAqLwotCXRlbXAgPSByZXEtPmhlYWQtPnRkX2RtYSAmIEVQX1FVRVVFX0hFQURfTkVYVF9QT0lOVEVSX01BU0s7Ci0JZFFILT5uZXh0X2R0ZF9wdHIgPSBjcHVfdG9faGMzMih0ZW1wKTsKLQotCS8qIENsZWFyIGFjdGl2ZSBhbmQgaGFsdCBiaXQgKi8KLQl0ZW1wID0gY3B1X3RvX2hjMzIofihFUF9RVUVVRV9IRUFEX1NUQVRVU19BQ1RJVkUKLQkJCXwgRVBfUVVFVUVfSEVBRF9TVEFUVVNfSEFMVCkpOwotCWRRSC0+c2l6ZV9pb2NfaW50X3N0cyAmPSB0ZW1wOwotCi0JLyogRW5zdXJlIHRoYXQgdXBkYXRlcyB0byB0aGUgUUggd2lsbCBvY2N1ciBiZWZvcmUgcHJpbWluZy4gKi8KLQl3bWIoKTsKLQotCS8qIFByaW1lIGVuZHBvaW50IGJ5IHdyaXRpbmcgMSB0byBFTkRQVFBSSU1FICovCi0JdGVtcCA9IGVwX2lzX2luKGVwKQotCQk/ICgxIDw8IChlcF9pbmRleChlcCkgKyAxNikpCi0JCTogKDEgPDwgKGVwX2luZGV4KGVwKSkpOwotCWZzbF93cml0ZWwodGVtcCwgJmRyX3JlZ3MtPmVuZHBvaW50cHJpbWUpOwotb3V0OgotCXJldHVybjsKKwlmc2xfcHJpbWVfZXAoZXAsIHJlcS0+aGVhZCk7CiB9CiAKIC8qIEZpbGwgaW4gdGhlIGRURCBzdHJ1Y3R1cmUKQEAgLTg3Nyw3ICs4NzgsNyBAQAogCQlWREJHKCIlcywgYmFkIGVwIiwgX19mdW5jX18pOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9Ci0JaWYgKGVwLT5kZXNjLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVwLT5kZXNjKSkgewogCQlpZiAocmVxLT5yZXEubGVuZ3RoID4gZXAtPmVwLm1heHBhY2tldCkKIAkJCXJldHVybiAtRU1TR1NJWkU7CiAJfQpAQCAtOTczLDI1ICs5NzQsMjAgQEAKIAogCQkvKiBUaGUgcmVxdWVzdCBpc24ndCB0aGUgbGFzdCByZXF1ZXN0IGluIHRoaXMgZXAgcXVldWUgKi8KIAkJaWYgKHJlcS0+cXVldWUubmV4dCAhPSAmZXAtPnF1ZXVlKSB7Ci0JCQlzdHJ1Y3QgZXBfcXVldWVfaGVhZCAqcWg7CiAJCQlzdHJ1Y3QgZnNsX3JlcSAqbmV4dF9yZXE7CiAKLQkJCXFoID0gZXAtPnFoOwogCQkJbmV4dF9yZXEgPSBsaXN0X2VudHJ5KHJlcS0+cXVldWUubmV4dCwgc3RydWN0IGZzbF9yZXEsCiAJCQkJCXF1ZXVlKTsKIAotCQkJLyogUG9pbnQgdGhlIFFIIHRvIHRoZSBmaXJzdCBURCBvZiBuZXh0IHJlcXVlc3QgKi8KLQkJCWZzbF93cml0ZWwoKHUzMikgbmV4dF9yZXEtPmhlYWQsICZxaC0+Y3Vycl9kdGRfcHRyKTsKKwkJCS8qIHByaW1lIHdpdGggZFREIG9mIG5leHQgcmVxdWVzdCAqLworCQkJZnNsX3ByaW1lX2VwKGVwLCBuZXh0X3JlcS0+aGVhZCk7CiAJCX0KLQotCQkvKiBUaGUgcmVxdWVzdCBoYXNuJ3QgYmVlbiBwcm9jZXNzZWQsIHBhdGNoIHVwIHRoZSBURCBjaGFpbiAqLworCS8qIFRoZSByZXF1ZXN0IGhhc24ndCBiZWVuIHByb2Nlc3NlZCwgcGF0Y2ggdXAgdGhlIFREIGNoYWluICovCiAJfSBlbHNlIHsKIAkJc3RydWN0IGZzbF9yZXEgKnByZXZfcmVxOwogCiAJCXByZXZfcmVxID0gbGlzdF9lbnRyeShyZXEtPnF1ZXVlLnByZXYsIHN0cnVjdCBmc2xfcmVxLCBxdWV1ZSk7Ci0JCWZzbF93cml0ZWwoZnNsX3JlYWRsKCZyZXEtPnRhaWwtPm5leHRfdGRfcHRyKSwKLQkJCQkmcHJldl9yZXEtPnRhaWwtPm5leHRfdGRfcHRyKTsKLQorCQlwcmV2X3JlcS0+dGFpbC0+bmV4dF90ZF9wdHIgPSByZXEtPnRhaWwtPm5leHRfdGRfcHRyOwogCX0KIAogCWRvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQpOwpAQCAtMTAzMiw3ICsxMDI4LDcgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JaWYgKGVwLT5kZXNjLT5ibUF0dHJpYnV0ZXMgPT0gVVNCX0VORFBPSU5UX1hGRVJfSVNPQykgeworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGVwLT5kZXNjKSkgewogCQlzdGF0dXMgPSAtRU9QTk9UU1VQUDsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMTA2OCw3ICsxMDY0LDcgQEAKIAlzdHJ1Y3QgZnNsX3VkYyAqdWRjOwogCWludCBzaXplID0gMDsKIAl1MzIgYml0bWFzazsKLQlzdHJ1Y3QgZXBfcXVldWVfaGVhZCAqZF9xaDsKKwlzdHJ1Y3QgZXBfcXVldWVfaGVhZCAqcWg7CiAKIAllcCA9IGNvbnRhaW5lcl9vZihfZXAsIHN0cnVjdCBmc2xfZXAsIGVwKTsKIAlpZiAoIV9lcCB8fCAoIWVwLT5kZXNjICYmIGVwX2luZGV4KGVwKSAhPSAwKSkKQEAgLTEwNzksMTMgKzEwNzUsMTMgQEAKIAlpZiAoIXVkYy0+ZHJpdmVyIHx8IHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQogCQlyZXR1cm4gLUVTSFVURE9XTjsKIAotCWRfcWggPSAmZXAtPnVkYy0+ZXBfcWhbZXBfaW5kZXgoZXApICogMiArIGVwX2lzX2luKGVwKV07CisJcWggPSBnZXRfcWhfYnlfZXAoZXApOwogCiAJYml0bWFzayA9IChlcF9pc19pbihlcCkpID8gKDEgPDwgKGVwX2luZGV4KGVwKSArIDE2KSkgOgogCSAgICAoMSA8PCAoZXBfaW5kZXgoZXApKSk7CiAKIAlpZiAoZnNsX3JlYWRsKCZkcl9yZWdzLT5lbmRwdHN0YXR1cykgJiBiaXRtYXNrKQotCQlzaXplID0gKGRfcWgtPnNpemVfaW9jX2ludF9zdHMgJiBEVERfUEFDS0VUX1NJWkUpCisJCXNpemUgPSAocWgtPnNpemVfaW9jX2ludF9zdHMgJiBEVERfUEFDS0VUX1NJWkUpCiAJCSAgICA+PiBEVERfTEVOR1RIX0JJVF9QT1M7CiAKIAlwcl9kZWJ1ZygiJXMgJXVcbiIsIF9fZnVuY19fLCBzaXplKTsKQEAgLTE5MzgsOCArMTkzNCw3IEBACiAJaWYgKCF1ZGNfY29udHJvbGxlcikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoIWRyaXZlciB8fCAoZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfRlVMTAotCQkJCSYmIGRyaXZlci0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gpCisJaWYgKCFkcml2ZXIgfHwgZHJpdmVyLT5zcGVlZCA8IFVTQl9TUEVFRF9GVUxMCiAJCQl8fCAhYmluZCB8fCAhZHJpdmVyLT5kaXNjb25uZWN0IHx8ICFkcml2ZXItPnNldHVwKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0L2ZzbF91c2IyX3VkYy5oCmluZGV4IDFkNTFiZTguLmY3ODFmNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9mc2xfdXNiMl91ZGMuaAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvZnNsX3VzYjJfdWRjLmgKQEAgLTU2OSw2ICs1NjksMTYgQEAKIAkJCQkJKiAyICsgKCh3aW5kZXggJiBVU0JfRElSX0lOKSA/IDEgOiAwKSkKICNkZWZpbmUgZ2V0X3BpcGVfYnlfZXAoRVApCShlcF9pbmRleChFUCkgKiAyICsgZXBfaXNfaW4oRVApKQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBlcF9xdWV1ZV9oZWFkICpnZXRfcWhfYnlfZXAoc3RydWN0IGZzbF9lcCAqZXApCit7CisJLyogd2Ugb25seSBoYXZlIG9uZSBlcDAgc3RydWN0dXJlIGJ1dCB0d28gcXVldWUgaGVhZHMgKi8KKwlpZiAoZXBfaW5kZXgoZXApICE9IDApCisJCXJldHVybiBlcC0+cWg7CisJZWxzZQorCQlyZXR1cm4gJmVwLT51ZGMtPmVwX3FoWyhlcC0+dWRjLT5lcDBfZGlyID09CisJCQkJVVNCX0RJUl9JTikgPyAxIDogMF07Cit9CisKIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2U7CiAjaWZkZWYgQ09ORklHX0FSQ0hfTVhDCiBpbnQgZnNsX3VkY19jbGtfaW5pdChzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbTY2NTkyLXVkYy5jCmluZGV4IDkxZDBhZjIuLjlhYTFjYmIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9tNjY1OTItdWRjLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L202NjU5Mi11ZGMuYwpAQCAtMTQ3Miw3ICsxNDcyLDcgQEAKIAlpbnQgcmV0dmFsOwogCiAJaWYgKCFkcml2ZXIKLQkJCXx8IGRyaXZlci0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gKKwkJCXx8IGRyaXZlci0+c3BlZWQgPCBVU0JfU1BFRURfSElHSAogCQkJfHwgIWJpbmQKIAkJCXx8ICFkcml2ZXItPnNldHVwKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvbmV0MjI4MC5jCmluZGV4IDdmMWJjOWEuLmRhMmI5ZDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC9uZXQyMjgwLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L25ldDIyODAuYwpAQCAtMTg4MSw3ICsxODgxLDcgQEAKIAkgKiAoZGV2LT51c2ItPnhjdnJkaWFnICYgRk9SQ0VfRlVMTF9TUEVFRF9NT0RFKQogCSAqICJtdXN0IG5vdCBiZSB1c2VkIGluIG5vcm1hbCBvcGVyYXRpb24iCiAJICovCi0JaWYgKCFkcml2ZXIgfHwgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfSElHSAorCWlmICghZHJpdmVyIHx8IGRyaXZlci0+c3BlZWQgPCBVU0JfU1BFRURfSElHSAogCQkJfHwgIWRyaXZlci0+c2V0dXApCiAJCXJldHVybiAtRUlOVkFMOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvcjhhNjY1OTctdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvcjhhNjY1OTctdWRjLmMKaW5kZXggMjRmODRiMi4uZmM3MTlhMyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3I4YTY2NTk3LXVkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9yOGE2NjU5Ny11ZGMuYwpAQCAtMTc0Niw3ICsxNzQ2LDcgQEAKIAlzdHJ1Y3QgcjhhNjY1OTcgKnI4YTY2NTk3ID0gZ2FkZ2V0X3RvX3I4YTY2NTk3KGdhZGdldCk7CiAKIAlpZiAoIWRyaXZlcgotCQkJfHwgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfSElHSAorCQkJfHwgZHJpdmVyLT5zcGVlZCA8IFVTQl9TUEVFRF9ISUdICiAJCQl8fCAhZHJpdmVyLT5zZXR1cCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAJaWYgKCFyOGE2NjU5NykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHNvdGcuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHNvdGcuYwppbmRleCBhNTUyNDUzLi5iMzE0NDgyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzb3RnLmMKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc290Zy5jCkBAIC0yNTg2LDEwICsyNTg2LDggQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaWYgKGRyaXZlci0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0ggJiYKLQkgICAgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfRlVMTCkgeworCWlmIChkcml2ZXItPnNwZWVkIDwgVVNCX1NQRUVEX0ZVTEwpCiAJCWRldl9lcnIoaHNvdGctPmRldiwgIiVzOiBiYWQgc3BlZWRcbiIsIF9fZnVuY19fKTsKLQl9CiAKIAlpZiAoIWJpbmQgfHwgIWRyaXZlci0+c2V0dXApIHsKIAkJZGV2X2Vycihoc290Zy0+ZGV2LCAiJXM6IG1pc3NpbmcgZW50cnkgcG9pbnRzXG4iLCBfX2Z1bmNfXyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzdWRjLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvczNjLWhzdWRjLmMKaW5kZXggOGQ1NGY4OS4uMjBhNTUzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3MzYy1oc3VkYy5jCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC9zM2MtaHN1ZGMuYwpAQCAtMTE0Miw4ICsxMTQyLDcgQEAKIAlpbnQgcmV0OwogCiAJaWYgKCFkcml2ZXIKLQkJfHwgKGRyaXZlci0+c3BlZWQgIT0gVVNCX1NQRUVEX0ZVTEwgJiYKLQkJCWRyaXZlci0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gpCisJCXx8IGRyaXZlci0+c3BlZWQgPCBVU0JfU1BFRURfRlVMTAogCQl8fCAhYmluZAogCQl8fCAhZHJpdmVyLT51bmJpbmQgfHwgIWRyaXZlci0+ZGlzY29ubmVjdCB8fCAhZHJpdmVyLT5zZXR1cCkKIAkJcmV0dXJuIC1FSU5WQUw7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2VoY2ktc2NoZWQuYyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCmluZGV4IDU2YTMyMDMuLmE2MDY3OWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvZWhjaS1zY2hlZC5jCkBAIC0xNDc1LDYgKzE0NzUsNyBAQAogCSAqIGp1bXAgdW50aWwgYWZ0ZXIgdGhlIHF1ZXVlIGlzIHByaW1lZC4KIAkgKi8KIAllbHNlIHsKKwkJaW50IGRvbmUgPSAwOwogCQlzdGFydCA9IFNDSEVEVUxFX1NMT1AgKyAobm93ICYgfjB4MDcpOwogCiAJCS8qIE5PVEU6ICBhc3N1bWVzIFVSQl9JU09fQVNBUCwgdG8gbGltaXQgY29tcGxleGl0eS9idWdzICovCkBAIC0xNDkyLDE4ICsxNDkzLDE4IEBACiAJCQlpZiAoc3RyZWFtLT5oaWdoc3BlZWQpIHsKIAkJCQlpZiAoaXRkX3Nsb3Rfb2soZWhjaSwgbW9kLCBzdGFydCwKIAkJCQkJCXN0cmVhbS0+dXNlY3MsIHBlcmlvZCkpCi0JCQkJCWJyZWFrOworCQkJCQlkb25lID0gMTsKIAkJCX0gZWxzZSB7CiAJCQkJaWYgKChzdGFydCAlIDgpID49IDYpCiAJCQkJCWNvbnRpbnVlOwogCQkJCWlmIChzaXRkX3Nsb3Rfb2soZWhjaSwgbW9kLCBzdHJlYW0sCiAJCQkJCQlzdGFydCwgc2NoZWQsIHBlcmlvZCkpCi0JCQkJCWJyZWFrOworCQkJCQlkb25lID0gMTsKIAkJCX0KLQkJfSB3aGlsZSAoc3RhcnQgPiBuZXh0KTsKKwkJfSB3aGlsZSAoc3RhcnQgPiBuZXh0ICYmICFkb25lKTsKIAogCQkvKiBubyByb29tIGluIHRoZSBzY2hlZHVsZSAqLwotCQlpZiAoc3RhcnQgPT0gbmV4dCkgeworCQlpZiAoIWRvbmUpIHsKIAkJCWVoY2lfZGJnKGVoY2ksICJpc28gcmVzY2hlZCBmdWxsICVwIChub3cgJWQgbWF4ICVkKVxuIiwKIAkJCQl1cmIsIG5vdywgbm93ICsgbW9kKTsKIAkJCXN0YXR1cyA9IC1FTk9TUEM7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L2lzcDE3NjAtaWYuYyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jCmluZGV4IGE3ZGMxZTEuLjJhYzRhYzIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QvaXNwMTc2MC1pZi5jCkBAIC0xOCw3ICsxOCw3IEBACiAKICNpbmNsdWRlICJpc3AxNzYwLWhjZC5oIgogCi0jaWZkZWYgQ09ORklHX09GCisjaWYgZGVmaW5lZChDT05GSUdfT0YpICYmIGRlZmluZWQoQ09ORklHX09GX0lSUSkKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvb2YuaD4KICNpbmNsdWRlIDxsaW51eC9vZl9wbGF0Zm9ybS5oPgpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfT0YKKyNpZiBkZWZpbmVkKENPTkZJR19PRikgJiYgZGVmaW5lZChDT05GSUdfT0ZfSVJRKQogc3RydWN0IGlzcDE3NjAgewogCXN0cnVjdCB1c2JfaGNkICpoY2Q7CiAJaW50IHJzdF9ncGlvOwpAQCAtNDM3LDcgKzQzNyw3IEBACiAJcmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZpc3AxNzYwX3BsYXRfZHJpdmVyKTsKIAlpZiAoIXJldCkKIAkJYW55X3JldCA9IDA7Ci0jaWZkZWYgQ09ORklHX09GCisjaWYgZGVmaW5lZChDT05GSUdfT0YpICYmIGRlZmluZWQoQ09ORklHX09GX0lSUSkKIAlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmlzcDE3NjBfb2ZfZHJpdmVyKTsKIAlpZiAoIXJldCkKIAkJYW55X3JldCA9IDA7CkBAIC00NTcsNyArNDU3LDcgQEAKIHN0YXRpYyB2b2lkIF9fZXhpdCBpc3AxNzYwX2V4aXQodm9pZCkKIHsKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaXNwMTc2MF9wbGF0X2RyaXZlcik7Ci0jaWZkZWYgQ09ORklHX09GCisjaWYgZGVmaW5lZChDT05GSUdfT0YpICYmIGRlZmluZWQoQ09ORklHX09GX0lSUSkKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmaXNwMTc2MF9vZl9kcml2ZXIpOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX1BDSQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvaG9zdC93aGNpL3FzZXQuYyBiL2RyaXZlcnMvdXNiL2hvc3Qvd2hjaS9xc2V0LmMKaW5kZXggZDZlMTc1NC4uYTQwM2I1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvaG9zdC93aGNpL3FzZXQuYworKysgYi9kcml2ZXJzL3VzYi9ob3N0L3doY2kvcXNldC5jCkBAIC0xMjQsNyArMTI0LDcgQEAKIHsKIAlxc2V0LT50ZF9zdGFydCA9IHFzZXQtPnRkX2VuZCA9IHFzZXQtPm50ZHMgPSAwOwogCi0JcXNldC0+cWgubGluayA9IGNwdV90b19sZTMyKFFIX0xJTktfTlREUyg4KSB8IFFIX0xJTktfVCk7CisJcXNldC0+cWgubGluayA9IGNwdV90b19sZTY0KFFIX0xJTktfTlREUyg4KSB8IFFIX0xJTktfVCk7CiAJcXNldC0+cWguc3RhdHVzID0gcXNldC0+cWguc3RhdHVzICYgUUhfU1RBVFVTX1NFUV9NQVNLOwogCXFzZXQtPnFoLmVycl9jb3VudCA9IDA7CiAJcXNldC0+cWguc2NyYXRjaFswXSA9IDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9ob3N0L3hoY2kuYyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCmluZGV4IGFhOTRjMDEuLmExYWZiN2MgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCisrKyBiL2RyaXZlcnMvdXNiL2hvc3QveGhjaS5jCkBAIC03MTEsNyArNzExLDEwIEBACiAJcmluZyA9IHhoY2ktPmNtZF9yaW5nOwogCXNlZyA9IHJpbmctPmRlcV9zZWc7CiAJZG8gewotCQltZW1zZXQoc2VnLT50cmJzLCAwLCBTRUdNRU5UX1NJWkUpOworCQltZW1zZXQoc2VnLT50cmJzLCAwLAorCQkJc2l6ZW9mKHVuaW9uIHhoY2lfdHJiKSAqIChUUkJTX1BFUl9TRUdNRU5UIC0gMSkpOworCQlzZWctPnRyYnNbVFJCU19QRVJfU0VHTUVOVCAtIDFdLmxpbmsuY29udHJvbCAmPQorCQkJY3B1X3RvX2xlMzIoflRSQl9DWUNMRSk7CiAJCXNlZyA9IHNlZy0+bmV4dDsKIAl9IHdoaWxlIChzZWcgIT0gcmluZy0+ZGVxX3NlZyk7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfY29yZS5jCmluZGV4IGMxZmExMmUuLmI2M2FiMTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9jb3JlLmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2NvcmUuYwpAQCAtMjMwMSwxOCArMjMwMSwxMiBAQAogCQkgKi8KIAl9CiAKLQltdXNiX3NhdmVfY29udGV4dChtdXNiKTsKLQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm11c2ItPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBtdXNiX3Jlc3VtZV9ub2lycShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG11c2IJKm11c2IgPSBkZXZfdG9fbXVzYihkZXYpOwotCi0JbXVzYl9yZXN0b3JlX2NvbnRleHQobXVzYik7Ci0KIAkvKiBmb3Igc3RhdGljIGNtb3MgbGlrZSBEYVZpbmNpLCByZWdpc3RlciB2YWx1ZXMgd2VyZSBwcmVzZXJ2ZWQKIAkgKiB1bmxlc3MgZm9yIHNvbWUgcmVhc29uIHRoZSB3aG9sZSBzb2MgcG93ZXJlZCBkb3duIG9yIHRoZSBVU0IKIAkgKiBtb2R1bGUgZ290IHJlc2V0IHRocm91Z2ggdGhlIFBTQyAodnMganVzdCBiZWluZyBkaXNhYmxlZCkuCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfZ2FkZ2V0LmMKaW5kZXggZDUxMDQzYS4uOTIyMTQ4ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvbXVzYi9tdXNiX2dhZGdldC5jCisrKyBiL2RyaXZlcnMvdXNiL211c2IvbXVzYl9nYWRnZXQuYwpAQCAtMTkwMyw3ICsxOTAzLDcgQEAKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKIAlpbnQJCQlyZXR2YWwgPSAtRUlOVkFMOwogCi0JaWYgKGRyaXZlci0+c3BlZWQgIT0gVVNCX1NQRUVEX0hJR0gpCisJaWYgKGRyaXZlci0+c3BlZWQgPCBVU0JfU1BFRURfSElHSCkKIAkJZ290byBlcnIwOwogCiAJcG1fcnVudGltZV9nZXRfc3luYyhtdXNiLT5jb250cm9sbGVyKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMgYi9kcml2ZXJzL3VzYi9tdXNiL211c2JfaG9zdC5jCmluZGV4IDYwZGRiYTguLjc5Y2IwYWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL211c2IvbXVzYl9ob3N0LmMKKysrIGIvZHJpdmVycy91c2IvbXVzYi9tdXNiX2hvc3QuYwpAQCAtNzc0LDYgKzc3NCwxMCBAQAogCQkJaWYgKG11c2ItPmRvdWJsZV9idWZmZXJfbm90X29rKQogCQkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhNQVhQLAogCQkJCQkJaHdfZXAtPm1heF9wYWNrZXRfc3pfdHgpOworCQkJZWxzZSBpZiAoY2FuX2J1bGtfc3BsaXQobXVzYiwgcWgtPnR5cGUpKQorCQkJCW11c2Jfd3JpdGV3KGVwaW8sIE1VU0JfVFhNQVhQLCBwYWNrZXRfc3oKKwkJCQkJfCAoKGh3X2VwLT5tYXhfcGFja2V0X3N6X3R4IC8KKwkJCQkJCXBhY2tldF9zeikgLSAxKSA8PCAxMSk7CiAJCQllbHNlCiAJCQkJbXVzYl93cml0ZXcoZXBpbywgTVVTQl9UWE1BWFAsCiAJCQkJCQlxaC0+bWF4cGFja2V0IHwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kLmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZC5jCmluZGV4IDA1M2Y4NmQuLmFkOTZhMzggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kLmMKKysrIGIvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2QuYwpAQCAtMzQ5LDcgKzM0OSw3IEBACiAJCWlmIChtb2QtPmlycV9hdHRjaCkKIAkJCWludGVuYjEgfD0gQVRUQ0hFOwogCi0JCWlmIChtb2QtPmlycV9hdHRjaCkKKwkJaWYgKG1vZC0+aXJxX2R0Y2gpCiAJCQlpbnRlbmIxIHw9IERUQ0hFOwogCiAJCWlmIChtb2QtPmlycV9zaWduKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfZ2FkZ2V0LmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYwppbmRleCBkOTcxN2UwLi43ZjRlODAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYworKysgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9nYWRnZXQuYwpAQCAtNzUxLDUzICs3NTEsMzIgQEAKIAkJc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCiB7CiAJc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfZ2FkZ2V0X3RvX2dwcml2KGdhZGdldCk7Ci0Jc3RydWN0IHVzYmhzX3ByaXYgKnByaXY7Ci0Jc3RydWN0IGRldmljZSAqZGV2OwotCWludCByZXQ7CisJc3RydWN0IHVzYmhzX3ByaXYgKnByaXYgPSB1c2Joc2dfZ3ByaXZfdG9fcHJpdihncHJpdik7CiAKIAlpZiAoIWRyaXZlcgkJfHwKIAkgICAgIWRyaXZlci0+c2V0dXAJfHwKLQkgICAgZHJpdmVyLT5zcGVlZCAhPSBVU0JfU1BFRURfSElHSCkKKwkgICAgZHJpdmVyLT5zcGVlZCA8IFVTQl9TUEVFRF9GVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWRldiAgPSB1c2Joc2dfZ3ByaXZfdG9fZGV2KGdwcml2KTsKLQlwcml2ID0gdXNiaHNnX2dwcml2X3RvX3ByaXYoZ3ByaXYpOwotCiAJLyogZmlyc3QgaG9vayB1cCB0aGUgZHJpdmVyIC4uLiAqLwogCWdwcml2LT5kcml2ZXIgPSBkcml2ZXI7CiAJZ3ByaXYtPmdhZGdldC5kZXYuZHJpdmVyID0gJmRyaXZlci0+ZHJpdmVyOwogCi0JcmV0ID0gZGV2aWNlX2FkZCgmZ3ByaXYtPmdhZGdldC5kZXYpOwotCWlmIChyZXQpIHsKLQkJZGV2X2VycihkZXYsICJkZXZpY2VfYWRkIGVycm9yICVkXG4iLCByZXQpOwotCQlnb3RvIGFkZF9mYWlsOwotCX0KLQogCXJldHVybiB1c2Joc2dfdHJ5X3N0YXJ0KHByaXYsIFVTQkhTR19TVEFUVVNfUkVHSVNURVJEKTsKLQotYWRkX2ZhaWw6Ci0JZ3ByaXYtPmRyaXZlciA9IE5VTEw7Ci0JZ3ByaXYtPmdhZGdldC5kZXYuZHJpdmVyID0gTlVMTDsKLQotCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgdXNiaHNnX2dhZGdldF9zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsCiAJCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQogewogCXN0cnVjdCB1c2Joc2dfZ3ByaXYgKmdwcml2ID0gdXNiaHNnX2dhZGdldF90b19ncHJpdihnYWRnZXQpOwotCXN0cnVjdCB1c2Joc19wcml2ICpwcml2OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgdXNiaHNfcHJpdiAqcHJpdiA9IHVzYmhzZ19ncHJpdl90b19wcml2KGdwcml2KTsKIAogCWlmICghZHJpdmVyCQl8fAogCSAgICAhZHJpdmVyLT51bmJpbmQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JZGV2ICA9IHVzYmhzZ19ncHJpdl90b19kZXYoZ3ByaXYpOwotCXByaXYgPSB1c2Joc2dfZ3ByaXZfdG9fcHJpdihncHJpdik7Ci0KIAl1c2Joc2dfdHJ5X3N0b3AocHJpdiwgVVNCSFNHX1NUQVRVU19SRUdJU1RFUkQpOwotCWRldmljZV9kZWwoJmdwcml2LT5nYWRnZXQuZGV2KTsKKwlncHJpdi0+Z2FkZ2V0LmRldi5kcml2ZXIgPSBOVUxMOwogCWdwcml2LT5kcml2ZXIgPSBOVUxMOwogCiAJcmV0dXJuIDA7CkBAIC04MjcsNiArODA2LDEzIEBACiAKIHN0YXRpYyBpbnQgdXNiaHNnX3N0b3Aoc3RydWN0IHVzYmhzX3ByaXYgKnByaXYpCiB7CisJc3RydWN0IHVzYmhzZ19ncHJpdiAqZ3ByaXYgPSB1c2Joc2dfcHJpdl90b19ncHJpdihwcml2KTsKKworCS8qIGNhYmxlIGRpc2Nvbm5lY3QgKi8KKwlpZiAoZ3ByaXYtPmRyaXZlciAmJgorCSAgICBncHJpdi0+ZHJpdmVyLT5kaXNjb25uZWN0KQorCQlncHJpdi0+ZHJpdmVyLT5kaXNjb25uZWN0KCZncHJpdi0+Z2FkZ2V0KTsKKwogCXJldHVybiB1c2Joc2dfdHJ5X3N0b3AocHJpdiwgVVNCSFNHX1NUQVRVU19TVEFSVEVEKTsKIH0KIApAQCAtODc2LDEyICs4NjIsMTQgQEAKIAkvKgogCSAqIGluaXQgZ2FkZ2V0CiAJICovCi0JZGV2aWNlX2luaXRpYWxpemUoJmdwcml2LT5nYWRnZXQuZGV2KTsKIAlkZXZfc2V0X25hbWUoJmdwcml2LT5nYWRnZXQuZGV2LCAiZ2FkZ2V0Iik7CiAJZ3ByaXYtPmdhZGdldC5kZXYucGFyZW50CT0gZGV2OwogCWdwcml2LT5nYWRnZXQubmFtZQkJPSAicmVuZXNhc191c2Joc191ZGMiOwogCWdwcml2LT5nYWRnZXQub3BzCQk9ICZ1c2Joc2dfZ2FkZ2V0X29wczsKIAlncHJpdi0+Z2FkZ2V0LmlzX2R1YWxzcGVlZAk9IDE7CisJcmV0ID0gZGV2aWNlX3JlZ2lzdGVyKCZncHJpdi0+Z2FkZ2V0LmRldik7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX2FkZF91ZGM7CiAKIAlJTklUX0xJU1RfSEVBRCgmZ3ByaXYtPmdhZGdldC5lcF9saXN0KTsKIApAQCAtOTEyLDEyICs5MDAsMTUgQEAKIAogCXJldCA9IHVzYl9hZGRfZ2FkZ2V0X3VkYyhkZXYsICZncHJpdi0+Z2FkZ2V0KTsKIAlpZiAocmV0KQotCQlnb3RvIGVycl9hZGRfdWRjOworCQlnb3RvIGVycl9yZWdpc3RlcjsKIAogCiAJZGV2X2luZm8oZGV2LCAiZ2FkZ2V0IHByb2JlZFxuIik7CiAKIAlyZXR1cm4gMDsKKworZXJyX3JlZ2lzdGVyOgorCWRldmljZV91bnJlZ2lzdGVyKCZncHJpdi0+Z2FkZ2V0LmRldik7CiBlcnJfYWRkX3VkYzoKIAlrZnJlZShncHJpdi0+dWVwKTsKIApAQCAtOTMzLDYgKzkyNCw4IEBACiAKIAl1c2JfZGVsX2dhZGdldF91ZGMoJmdwcml2LT5nYWRnZXQpOwogCisJZGV2aWNlX3VucmVnaXN0ZXIoJmdwcml2LT5nYWRnZXQuZGV2KTsKKwogCXVzYmhzZ19jb250cm9sbGVyX3VucmVnaXN0ZXIoZ3ByaXYpOwogCiAJa2ZyZWUoZ3ByaXYtPnVlcCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9ob3N0LmMgYi9kcml2ZXJzL3VzYi9yZW5lc2FzX3VzYmhzL21vZF9ob3N0LmMKaW5kZXggYmFkZTc2MS4uNzk1NWRlNSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvcmVuZXNhc191c2Jocy9tb2RfaG9zdC5jCisrKyBiL2RyaXZlcnMvdXNiL3JlbmVzYXNfdXNiaHMvbW9kX2hvc3QuYwpAQCAtMTI2Nyw2ICsxMjY3LDcgQEAKIAkJZGV2X2VycihkZXYsICJGYWlsZWQgdG8gY3JlYXRlIGhjZFxuIik7CiAJCXJldHVybiAtRU5PTUVNOwogCX0KKwloY2QtPmhhc190dCA9IDE7IC8qIGZvciBsb3cvZnVsbCBzcGVlZCAqLwogCiAJcGlwZV9pbmZvID0ga3phbGxvYyhzaXplb2YoKnBpcGVfaW5mbykgKiBwaXBlX3NpemUsIEdGUF9LRVJORUwpOwogCWlmICghcGlwZV9pbmZvKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW8uYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCmluZGV4IGJkNDI5OGIuLmZmM2RiNWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npby5jCkBAIC03MzYsNiArNzM2LDcgQEAKIAl7IFVTQl9ERVZJQ0UoVE1MX1ZJRCwgVE1MX1VTQl9TRVJJQUxfUElEKSB9LAogCXsgVVNCX0RFVklDRShGVERJX1ZJRCwgRlRESV9FTFNURVJfVU5JQ09NX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfUFJPUE9YX0pUQUdDQUJMRUlJX1BJRCkgfSwKKwl7IFVTQl9ERVZJQ0UoRlRESV9WSUQsIEZURElfUFJPUE9YX0lTUENBQkxFSUlJX1BJRCkgfSwKIAl7IFVTQl9ERVZJQ0UoT0xJTUVYX1ZJRCwgT0xJTUVYX0FSTV9VU0JfT0NEX1BJRCksCiAJCS5kcml2ZXJfaW5mbyA9IChrZXJuZWxfdWxvbmdfdCkmZnRkaV9qdGFnX3F1aXJrIH0sCiAJeyBVU0JfREVWSUNFKE9MSU1FWF9WSUQsIE9MSU1FWF9BUk1fVVNCX09DRF9IX1BJRCksCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmggYi9kcml2ZXJzL3VzYi9zZXJpYWwvZnRkaV9zaW9faWRzLmgKaW5kZXggNTcxZmE5Ni4uMDU1YjY0ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL2Z0ZGlfc2lvX2lkcy5oCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9mdGRpX3Npb19pZHMuaApAQCAtMTEyLDYgKzExMiw3IEBACiAKIC8qIFByb3BveCBkZXZpY2VzICovCiAjZGVmaW5lIEZURElfUFJPUE9YX0pUQUdDQUJMRUlJX1BJRAkweEQ3MzgKKyNkZWZpbmUgRlRESV9QUk9QT1hfSVNQQ0FCTEVJSUlfUElECTB4RDczOQogCiAvKiBMZW56IExJLVVTQiBDb21wdXRlciBJbnRlcmZhY2UuICovCiAjZGVmaW5lIEZURElfTEVOWl9MSVVTQl9QSUQJMHhENzgwCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMgYi9kcml2ZXJzL3VzYi9zZXJpYWwvb3B0aW9uLmMKaW5kZXggZDg2NTg3OC4uNmRkNjQ1MyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Ivc2VyaWFsL29wdGlvbi5jCisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC9vcHRpb24uYwpAQCAtNjYxLDYgKzY2MSwxNCBAQAogCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oSFVBV0VJX1ZFTkRPUl9JRCwgSFVBV0VJX1BST0RVQ1RfSzQ1MTEsIDB4ZmYsIDB4MDEsIDB4MzEpIH0sCiAJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhIVUFXRUlfVkVORE9SX0lELCBIVUFXRUlfUFJPRFVDVF9LNDUxMSwgMHhmZiwgMHgwMSwgMHgzMikgfSwKIAl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKEhVQVdFSV9WRU5ET1JfSUQsIEhVQVdFSV9QUk9EVUNUX0UzNTMsIDB4ZmYsIDB4MDEsIDB4MDEpIH0sCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhIVUFXRUlfVkVORE9SX0lELCBIVUFXRUlfUFJPRFVDVF9FMzUzLCAweGZmLCAweDAxLCAweDAyKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oSFVBV0VJX1ZFTkRPUl9JRCwgSFVBV0VJX1BST0RVQ1RfRTM1MywgMHhmZiwgMHgwMSwgMHgwMykgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKEhVQVdFSV9WRU5ET1JfSUQsIEhVQVdFSV9QUk9EVUNUX0UzNTMsIDB4ZmYsIDB4MDEsIDB4MTApIH0sCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhIVUFXRUlfVkVORE9SX0lELCBIVUFXRUlfUFJPRFVDVF9FMzUzLCAweGZmLCAweDAxLCAweDEyKSB9LAorCXsgVVNCX0RFVklDRV9BTkRfSU5URVJGQUNFX0lORk8oSFVBV0VJX1ZFTkRPUl9JRCwgSFVBV0VJX1BST0RVQ1RfRTM1MywgMHhmZiwgMHgwMSwgMHgxMykgfSwKKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKEhVQVdFSV9WRU5ET1JfSUQsIEhVQVdFSV9QUk9EVUNUX0UzNTMsIDB4ZmYsIDB4MDIsIDB4MDEpIH0sICAvKiBFMzk4IDNHIE1vZGVtICovCisJeyBVU0JfREVWSUNFX0FORF9JTlRFUkZBQ0VfSU5GTyhIVUFXRUlfVkVORE9SX0lELCBIVUFXRUlfUFJPRFVDVF9FMzUzLCAweGZmLCAweDAyLCAweDAyKSB9LCAgLyogRTM5OCAzRyBQQyBVSSBJbnRlcmZhY2UgKi8KKwl7IFVTQl9ERVZJQ0VfQU5EX0lOVEVSRkFDRV9JTkZPKEhVQVdFSV9WRU5ET1JfSUQsIEhVQVdFSV9QUk9EVUNUX0UzNTMsIDB4ZmYsIDB4MDIsIDB4MDMpIH0sICAvKiBFMzk4IDNHIEFwcGxpY2F0aW9uIEludGVyZmFjZSAqLwogCXsgVVNCX0RFVklDRShOT1ZBVEVMV0lSRUxFU1NfVkVORE9SX0lELCBOT1ZBVEVMV0lSRUxFU1NfUFJPRFVDVF9WNjQwKSB9LAogCXsgVVNCX0RFVklDRShOT1ZBVEVMV0lSRUxFU1NfVkVORE9SX0lELCBOT1ZBVEVMV0lSRUxFU1NfUFJPRFVDVF9WNjIwKSB9LAogCXsgVVNCX0RFVklDRShOT1ZBVEVMV0lSRUxFU1NfVkVORE9SX0lELCBOT1ZBVEVMV0lSRUxFU1NfUFJPRFVDVF9WNzQwKSB9LApAQCAtNzQ3LDYgKzc1NSw3IEBACiAJeyBVU0JfREVWSUNFKEtZT0NFUkFfVkVORE9SX0lELCBLWU9DRVJBX1BST0RVQ1RfS1BDNjgwKSB9LAogCXsgVVNCX0RFVklDRShRVUFMQ09NTV9WRU5ET1JfSUQsIDB4NjAwMCl9LCAvKiBaVEUgQUM4NzAwICovCiAJeyBVU0JfREVWSUNFKFFVQUxDT01NX1ZFTkRPUl9JRCwgMHg2NjEzKX0sIC8qIE9uZGEgSDYwMC9aVEUgTUYzMzAgKi8KKwl7IFVTQl9ERVZJQ0UoUVVBTENPTU1fVkVORE9SX0lELCAweDkwMDApfSwgLyogU0lNQ29tIFNJTTUyMTggKi8KIAl7IFVTQl9ERVZJQ0UoQ01PVEVDSF9WRU5ET1JfSUQsIENNT1RFQ0hfUFJPRFVDVF82MjgwKSB9LCAvKiBCUDMtVVNCICYgQlAzLUVYVCBIU0RQQSAqLwogCXsgVVNCX0RFVklDRShDTU9URUNIX1ZFTkRPUl9JRCwgQ01PVEVDSF9QUk9EVUNUXzYwMDgpIH0sCiAJeyBVU0JfREVWSUNFKFRFTElUX1ZFTkRPUl9JRCwgVEVMSVRfUFJPRFVDVF9VQzg2NEUpIH0sCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oIGIvZHJpdmVycy91c2Ivc3RvcmFnZS91bnVzdWFsX2RldnMuaAppbmRleCAzMDQxYTk3Li4yNGNhYmE3IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9zdG9yYWdlL3VudXN1YWxfZGV2cy5oCisrKyBiL2RyaXZlcnMvdXNiL3N0b3JhZ2UvdW51c3VhbF9kZXZzLmgKQEAgLTE4NTQsNiArMTg1NCwxMyBAQAogCQlVU0JfU0NfREVWSUNFLCBVU0JfUFJfREVWSUNFLCBOVUxMLAogCQlVU19GTF9JR05PUkVfUkVTSURVRSApLAogCisvKiBSZXBvcnRlZCBieSBRaW5nbGluIFllIDx5ZXN0eWxlQGdtYWlsLmNvbT4gKi8KK1VOVVNVQUxfREVWKCAgMHgxM2ZlLCAweDM2MDAsIDB4MDEwMCwgMHgwMTAwLAorCQkiS2luZ3N0b24iLAorCQkiRFQgMTAxIEcyIiwKKwkJVVNCX1NDX0RFVklDRSwgVVNCX1BSX0RFVklDRSwgTlVMTCwKKwkJVVNfRkxfQlVMS19JR05PUkVfVEFHICksCisKIC8qIFJlcG9ydGVkIGJ5IEZyYW5jZXNjbyBGb3Jlc3RpIDxmcmFmb3JlQHRpc2NhbGkuaXQ+ICovCiBVTlVTVUFMX0RFViggIDB4MTRjZCwgMHg2NjAwLCAweDAyMDEsIDB4MDIwMSwKIAkJIlN1cGVyIFRvcCIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL29mZmIuYyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCmluZGV4IGNiMTYzYTUuLjBjNGYzNDMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCisrKyBiL2RyaXZlcnMvdmlkZW8vb2ZmYi5jCkBAIC00MSwxMyArNDEsMTQgQEAKIC8qIFN1cHBvcnRlZCBwYWxldHRlIGhhY2tzICovCiBlbnVtIHsKIAljbWFwX3Vua25vd24sCi0JY21hcF9tNjQsCQkvKiBBVEkgTWFjaDY0ICovCisJY21hcF9zaW1wbGUsCQkvKiBBVEkgTWFjaDY0ICovCiAJY21hcF9yMTI4LAkJLyogQVRJIFJhZ2UxMjggKi8KIAljbWFwX00zQSwJCS8qIEFUSSBSYWdlIE1vYmlsaXR5IE0zIEhlYWQgQSAqLwogCWNtYXBfTTNCLAkJLyogQVRJIFJhZ2UgTW9iaWxpdHkgTTMgSGVhZCBCICovCiAJY21hcF9yYWRlb24sCQkvKiBBVEkgUmFkZW9uICovCiAJY21hcF9neHQyMDAwLAkJLyogSUJNIEdYVDIwMDAgKi8KIAljbWFwX2F2aXZvLAkJLyogQVRJIFI1eHggKi8KKwljbWFwX3FlbXUsCQkvKiBxZW11IHZnYSAqLwogfTsKIAogc3RydWN0IG9mZmJfcGFyIHsKQEAgLTEwMCwzNiArMTAxLDMyIEBACiAJCQkgIHVfaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IG9mZmJfcGFyICpwYXIgPSAoc3RydWN0IG9mZmJfcGFyICopIGluZm8tPnBhcjsKLQlpbnQgaSwgZGVwdGg7Ci0JdTMyICpwYWwgPSBpbmZvLT5wc2V1ZG9fcGFsZXR0ZTsKIAotCWRlcHRoID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwotCWlmIChkZXB0aCA9PSAxNikKLQkJZGVwdGggPSAoaW5mby0+dmFyLmdyZWVuLmxlbmd0aCA9PSA1KSA/IDE1IDogMTY7CisJaWYgKGluZm8tPmZpeC52aXN1YWwgPT0gRkJfVklTVUFMX1RSVUVDT0xPUikgeworCQl1MzIgKnBhbCA9IGluZm8tPnBzZXVkb19wYWxldHRlOworCQl1MzIgY3IgPSByZWQgPj4gKDE2IC0gaW5mby0+dmFyLnJlZC5sZW5ndGgpOworCQl1MzIgY2cgPSBncmVlbiA+PiAoMTYgLSBpbmZvLT52YXIuZ3JlZW4ubGVuZ3RoKTsKKwkJdTMyIGNiID0gYmx1ZSA+PiAoMTYgLSBpbmZvLT52YXIuYmx1ZS5sZW5ndGgpOworCQl1MzIgdmFsdWU7CiAKLQlpZiAocmVnbm8gPiAyNTUgfHwKLQkgICAgKGRlcHRoID09IDE2ICYmIHJlZ25vID4gNjMpIHx8Ci0JICAgIChkZXB0aCA9PSAxNSAmJiByZWdubyA+IDMxKSkKLQkJcmV0dXJuIDE7CisJCWlmIChyZWdubyA+PSAxNikKKwkJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKHJlZ25vIDwgMTYpIHsKLQkJc3dpdGNoIChkZXB0aCkgewotCQljYXNlIDE1OgotCQkJcGFsW3JlZ25vXSA9IChyZWdubyA8PCAxMCkgfCAocmVnbm8gPDwgNSkgfCByZWdubzsKLQkJCWJyZWFrOwotCQljYXNlIDE2OgotCQkJcGFsW3JlZ25vXSA9IChyZWdubyA8PCAxMSkgfCAocmVnbm8gPDwgNSkgfCByZWdubzsKLQkJCWJyZWFrOwotCQljYXNlIDI0OgotCQkJcGFsW3JlZ25vXSA9IChyZWdubyA8PCAxNikgfCAocmVnbm8gPDwgOCkgfCByZWdubzsKLQkJCWJyZWFrOwotCQljYXNlIDMyOgotCQkJaSA9IChyZWdubyA8PCA4KSB8IHJlZ25vOwotCQkJcGFsW3JlZ25vXSA9IChpIDw8IDE2KSB8IGk7Ci0JCQlicmVhazsKKwkJdmFsdWUgPSAoY3IgPDwgaW5mby0+dmFyLnJlZC5vZmZzZXQpIHwKKwkJCShjZyA8PCBpbmZvLT52YXIuZ3JlZW4ub2Zmc2V0KSB8CisJCQkoY2IgPDwgaW5mby0+dmFyLmJsdWUub2Zmc2V0KTsKKwkJaWYgKGluZm8tPnZhci50cmFuc3AubGVuZ3RoID4gMCkgeworCQkJdTMyIG1hc2sgPSAoMSA8PCBpbmZvLT52YXIudHJhbnNwLmxlbmd0aCkgLSAxOworCQkJbWFzayA8PD0gaW5mby0+dmFyLnRyYW5zcC5vZmZzZXQ7CisJCQl2YWx1ZSB8PSBtYXNrOwogCQl9CisJCXBhbFtyZWdub10gPSB2YWx1ZTsKKwkJcmV0dXJuIDA7CiAJfQogCisJaWYgKHJlZ25vID4gMjU1KQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCXJlZCA+Pj0gODsKIAlncmVlbiA+Pj0gODsKIAlibHVlID4+PSA4OwpAQCAtMTM4LDcgKzEzNSw3IEBACiAJCXJldHVybiAwOwogCiAJc3dpdGNoIChwYXItPmNtYXBfdHlwZSkgewotCWNhc2UgY21hcF9tNjQ6CisJY2FzZSBjbWFwX3NpbXBsZToKIAkJd3JpdGViKHJlZ25vLCBwYXItPmNtYXBfYWRyKTsKIAkJd3JpdGViKHJlZCwgcGFyLT5jbWFwX2RhdGEpOwogCQl3cml0ZWIoZ3JlZW4sIHBhci0+Y21hcF9kYXRhKTsKQEAgLTIwOCw3ICsyMDUsNyBAQAogCWlmIChibGFuaykKIAkJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CiAJCQlzd2l0Y2ggKHBhci0+Y21hcF90eXBlKSB7Ci0JCQljYXNlIGNtYXBfbTY0OgorCQkJY2FzZSBjbWFwX3NpbXBsZToKIAkJCQl3cml0ZWIoaSwgcGFyLT5jbWFwX2Fkcik7CiAJCQkJZm9yIChqID0gMDsgaiA8IDM7IGorKykKIAkJCQkJd3JpdGViKDAsIHBhci0+Y21hcF9kYXRhKTsKQEAgLTM1MCw3ICszNDcsNyBAQAogCQlwYXItPmNtYXBfYWRyID0KIAkJCWlvcmVtYXAoYmFzZSArIDB4N2ZmMDAwLCAweDEwMDApICsgMHhjYzA7CiAJCXBhci0+Y21hcF9kYXRhID0gcGFyLT5jbWFwX2FkciArIDE7Ci0JCXBhci0+Y21hcF90eXBlID0gY21hcF9tNjQ7CisJCXBhci0+Y21hcF90eXBlID0gY21hcF9zaW1wbGU7CiAJfSBlbHNlIGlmIChkcCAmJiAob2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZHAsICJwY2kxMDE0LGI3IikgfHwKIAkJCSAgb2ZfZGV2aWNlX2lzX2NvbXBhdGlibGUoZHAsICJwY2kxMDE0LDIxYyIpKSkgewogCQlwYXItPmNtYXBfYWRyID0gb2ZmYl9tYXBfcmVnKGRwLCAwLCAweDYwMDAsIDB4MTAwMCk7CkBAIC0zNzEsNiArMzY4LDE2IEBACiAJCQkJcGFyLT5jbWFwX3R5cGUgPSBjbWFwX2F2aXZvOwogCQl9CiAJCW9mX25vZGVfcHV0KHBjaXBhcmVudCk7CisJfSBlbHNlIGlmIChkcCAmJiBvZl9kZXZpY2VfaXNfY29tcGF0aWJsZShkcCwgInFlbXUsc3RkLXZnYSIpKSB7CisJCWNvbnN0IHUzMiBpb19vZl9hZGRyWzNdID0geyAweDAxMDAwMDAwLCAweDAsIDB4MCB9OworCQl1NjQgaW9fYWRkciA9IG9mX3RyYW5zbGF0ZV9hZGRyZXNzKGRwLCBpb19vZl9hZGRyKTsKKwkJaWYgKGlvX2FkZHIgIT0gT0ZfQkFEX0FERFIpIHsKKwkJCXBhci0+Y21hcF9hZHIgPSBpb3JlbWFwKGlvX2FkZHIgKyAweDNjOCwgMik7CisJCQlpZiAocGFyLT5jbWFwX2FkcikgeworCQkJCXBhci0+Y21hcF90eXBlID0gY21hcF9zaW1wbGU7CisJCQkJcGFyLT5jbWFwX2RhdGEgPSBwYXItPmNtYXBfYWRyICsgMTsKKwkJCX0KKwkJfQogCX0KIAlpbmZvLT5maXgudmlzdWFsID0gKHBhci0+Y21hcF90eXBlICE9IGNtYXBfdW5rbm93bikgPwogCQlGQl9WSVNVQUxfUFNFVURPQ09MT1IgOiBGQl9WSVNVQUxfU1RBVElDX1BTRVVET0NPTE9SOwpAQCAtMzgxLDcgKzM4OCw3IEBACiAJCQkJaW50IHBpdGNoLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCQkJaW50IGZvcmVpZ25fZW5kaWFuLCBzdHJ1Y3QgZGV2aWNlX25vZGUgKmRwKQogewotCXVuc2lnbmVkIGxvbmcgcmVzX3NpemUgPSBwaXRjaCAqIGhlaWdodCAqIChkZXB0aCArIDcpIC8gODsKKwl1bnNpZ25lZCBsb25nIHJlc19zaXplID0gcGl0Y2ggKiBoZWlnaHQ7CiAJc3RydWN0IG9mZmJfcGFyICpwYXIgPSAmZGVmYXVsdF9wYXI7CiAJdW5zaWduZWQgbG9uZyByZXNfc3RhcnQgPSBhZGRyZXNzOwogCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyAqZml4OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX21taW8uYyBiL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19tbWlvLmMKaW5kZXggNzMxN2RjMi4uMDI2OTcxNyAxMDA2NDQKLS0tIGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX21taW8uYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fbW1pby5jCkBAIC0zNjEsNyArMzYxLDEyIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICp2bV9idXNfbmFtZShzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgdmlydGlvX21taW9fZGV2aWNlICp2bV9kZXYgPSB0b192aXJ0aW9fbW1pb19kZXZpY2UodmRldik7CiAKKwlyZXR1cm4gdm1fZGV2LT5wZGV2LT5uYW1lOworfQogCiBzdGF0aWMgc3RydWN0IHZpcnRpb19jb25maWdfb3BzIHZpcnRpb19tbWlvX2NvbmZpZ19vcHMgPSB7CiAJLmdldAkJPSB2bV9nZXQsCkBAIC0zNzMsNiArMzc4LDcgQEAKIAkuZGVsX3Zxcwk9IHZtX2RlbF92cXMsCiAJLmdldF9mZWF0dXJlcwk9IHZtX2dldF9mZWF0dXJlcywKIAkuZmluYWxpemVfZmVhdHVyZXMgPSB2bV9maW5hbGl6ZV9mZWF0dXJlcywKKwkuYnVzX25hbWUJPSB2bV9idXNfbmFtZSwKIH07CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jIGIvZHJpdmVycy92aXJ0aW8vdmlydGlvX3BjaS5jCmluZGV4IDAzZDE5ODQuLmJhYWJiNzkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlydGlvL3ZpcnRpb19wY2kuYworKysgYi9kcml2ZXJzL3ZpcnRpby92aXJ0aW9fcGNpLmMKQEAgLTU5OCw2ICs1OTgsMTMgQEAKIAkJCQkgIGZhbHNlLCBmYWxzZSk7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICp2cF9idXNfbmFtZShzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldikKK3sKKwlzdHJ1Y3QgdmlydGlvX3BjaV9kZXZpY2UgKnZwX2RldiA9IHRvX3ZwX2RldmljZSh2ZGV2KTsKKworCXJldHVybiBwY2lfbmFtZSh2cF9kZXYtPnBjaV9kZXYpOworfQorCiBzdGF0aWMgc3RydWN0IHZpcnRpb19jb25maWdfb3BzIHZpcnRpb19wY2lfY29uZmlnX29wcyA9IHsKIAkuZ2V0CQk9IHZwX2dldCwKIAkuc2V0CQk9IHZwX3NldCwKQEAgLTYwOCw2ICs2MTUsNyBAQAogCS5kZWxfdnFzCT0gdnBfZGVsX3ZxcywKIAkuZ2V0X2ZlYXR1cmVzCT0gdnBfZ2V0X2ZlYXR1cmVzLAogCS5maW5hbGl6ZV9mZWF0dXJlcyA9IHZwX2ZpbmFsaXplX2ZlYXR1cmVzLAorCS5idXNfbmFtZQk9IHZwX2J1c19uYW1lLAogfTsKIAogc3RhdGljIHZvaWQgdmlydGlvX3BjaV9yZWxlYXNlX2RldihzdHJ1Y3QgZGV2aWNlICpfZCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvY29oOTAxMzI3X3dkdC5jIGIvZHJpdmVycy93YXRjaGRvZy9jb2g5MDEzMjdfd2R0LmMKaW5kZXggMDNmNDQ5YS4uNWI4OWY3ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9jb2g5MDEzMjdfd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9jb2g5MDEzMjdfd2R0LmMKQEAgLTc2LDggKzc2LDYgQEAKIHN0YXRpYyB2b2lkIF9faW9tZW0gKnZpcnRiYXNlOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgY29oOTAxMzI3X3VzZXJzOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgYm9vdF9zdGF0dXM7Ci1zdGF0aWMgdTE2IHdkb2dlbmFibGVzdG9yZTsKLXN0YXRpYyB1MTYgaXJxbWFza3N0b3JlOwogc3RhdGljIHN0cnVjdCBkZXZpY2UgKnBhcmVudDsKIAogLyoKQEAgLTQ2MSw2ICs0NTksMTAgQEAKIH0KIAogI2lmZGVmIENPTkZJR19QTQorCitzdGF0aWMgdTE2IHdkb2dlbmFibGVzdG9yZTsKK3N0YXRpYyB1MTYgaXJxbWFza3N0b3JlOworCiBzdGF0aWMgaW50IGNvaDkwMTMyN19zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpcnFtYXNrc3RvcmUgPSByZWFkdyh2aXJ0YmFzZSArIFUzMDBfV0RPR19JTVIpICYgMHgwMDAxVTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvaHB3ZHQuYwppbmRleCAzNzc0YzliLi44NDY0ZWExIDEwMDY0NAotLS0gYS9kcml2ZXJzL3dhdGNoZG9nL2hwd2R0LmMKKysrIGIvZHJpdmVycy93YXRjaGRvZy9ocHdkdC5jCkBAIC0yMzEsNiArMjMxLDcgQEAKIAogCWNtbl9yZWdzLnUxLnJlYXggPSBDUlVfQklPU19TSUdOQVRVUkVfVkFMVUU7CiAKKwlzZXRfbWVtb3J5X3goKHVuc2lnbmVkIGxvbmcpYmlvczMyX2VudHJ5cG9pbnQsICgyICogUEFHRV9TSVpFKSk7CiAJYXNtaW5saW5lX2NhbGwoJmNtbl9yZWdzLCBiaW9zMzJfZW50cnlwb2ludCk7CiAKIAlpZiAoY21uX3JlZ3MudTEucmFsICE9IDApIHsKQEAgLTI0OCw4ICsyNDksMTAgQEAKIAkJaWYgKChwaHlzaWNhbF9iaW9zX2Jhc2UgKyBwaHlzaWNhbF9iaW9zX29mZnNldCkpIHsKIAkJCWNydV9yb21fYWRkciA9CiAJCQkJaW9yZW1hcChjcnVfcGh5c2ljYWxfYWRkcmVzcywgY3J1X2xlbmd0aCk7Ci0JCQlpZiAoY3J1X3JvbV9hZGRyKQorCQkJaWYgKGNydV9yb21fYWRkcikgeworCQkJCXNldF9tZW1vcnlfeCgodW5zaWduZWQgbG9uZyljcnVfcm9tX2FkZHIsIGNydV9sZW5ndGgpOwogCQkJCXJldHZhbCA9IDA7CisJCQl9CiAJCX0KIAogCQlwcmludGsoS0VSTl9ERUJVRyAiaHB3ZHQ6IENSVSBCYXNlIEFkZHJlc3M6ICAgMHglbHhcbiIsCmRpZmYgLS1naXQgYS9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMgYi9kcml2ZXJzL3dhdGNoZG9nL2lUQ09fd2R0LmMKaW5kZXggYmE2YWQ2Ni4uOTk3OTZjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9pVENPX3dkdC5jCisrKyBiL2RyaXZlcnMvd2F0Y2hkb2cvaVRDT193ZHQuYwpAQCAtMzg0LDEwICszODQsMTAgQEAKIAkiV2F0Y2hkb2cgY2Fubm90IGJlIHN0b3BwZWQgb25jZSBzdGFydGVkIChkZWZhdWx0PSIKIAkJCQlfX01PRFVMRV9TVFJJTkcoV0FUQ0hET0dfTk9XQVlPVVQpICIpIik7CiAKLXN0YXRpYyBpbnQgdHVybl9TTUlfd2F0Y2hkb2dfY2xlYXJfb2ZmID0gMDsKK3N0YXRpYyBpbnQgdHVybl9TTUlfd2F0Y2hkb2dfY2xlYXJfb2ZmID0gMTsKIG1vZHVsZV9wYXJhbSh0dXJuX1NNSV93YXRjaGRvZ19jbGVhcl9vZmYsIGludCwgMCk7CiBNT0RVTEVfUEFSTV9ERVNDKHR1cm5fU01JX3dhdGNoZG9nX2NsZWFyX29mZiwKLQkiVHVybiBvZmYgU01JIGNsZWFyaW5nIHdhdGNoZG9nIChkZWZhdWx0PTApIik7CisJIlR1cm4gb2ZmIFNNSSBjbGVhcmluZyB3YXRjaGRvZyAoZGVwZW5kcyBvbiBUQ08tdmVyc2lvbikoZGVmYXVsdD0xKSIpOwogCiAvKgogICogU29tZSBUQ08gc3BlY2lmaWMgZnVuY3Rpb25zCkBAIC04MTMsNyArODEzLDcgQEAKIAkJcmV0ID0gLUVJTzsKIAkJZ290byBvdXRfdW5tYXA7CiAJfQotCWlmICh0dXJuX1NNSV93YXRjaGRvZ19jbGVhcl9vZmYpIHsKKwlpZiAodHVybl9TTUlfd2F0Y2hkb2dfY2xlYXJfb2ZmID49IGlUQ09fd2R0X3ByaXZhdGUuaVRDT192ZXJzaW9uKSB7CiAJCS8qIEJpdCAxMzogVENPX0VOIC0+IDAgPSBEaXNhYmxlcyBUQ08gbG9naWMgZ2VuZXJhdGluZyBhbiBTTUkjICovCiAJCXZhbDMyID0gaW5sKFNNSV9FTik7CiAJCXZhbDMyICY9IDB4ZmZmZmRmZmY7CS8qIFR1cm4gb2ZmIFNNSSBjbGVhcmluZyB3YXRjaGRvZyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy93YXRjaGRvZy9zcDgwNV93ZHQuYyBiL2RyaXZlcnMvd2F0Y2hkb2cvc3A4MDVfd2R0LmMKaW5kZXggY2MyY2ZiZS4uYmZhZjliYiAxMDA2NDQKLS0tIGEvZHJpdmVycy93YXRjaGRvZy9zcDgwNV93ZHQuYworKysgYi9kcml2ZXJzL3dhdGNoZG9nL3NwODA1X3dkdC5jCkBAIC0zNTEsNyArMzUxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBhbWJhX2lkIHNwODA1X3dkdF9pZHNbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCBhbWJhX2lkIHNwODA1X3dkdF9pZHNbXSA9IHsKIAl7CiAJCS5pZAk9IDB4MDAxNDE4MDUsCiAJCS5tYXNrCT0gMHgwMGZmZmZmZiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3N3aW90bGIteGVuLmMgYi9kcml2ZXJzL3hlbi9zd2lvdGxiLXhlbi5jCmluZGV4IDhlOTY0YjkuLjI4NDc5OGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL3N3aW90bGIteGVuLmMKKysrIGIvZHJpdmVycy94ZW4vc3dpb3RsYi14ZW4uYwpAQCAtMTY2LDcgKzE2Niw3IEBACiAJLyoKIAkgKiBHZXQgSU8gVExCIG1lbW9yeSBmcm9tIGFueSBsb2NhdGlvbi4KIAkgKi8KLQl4ZW5faW9fdGxiX3N0YXJ0ID0gYWxsb2NfYm9vdG1lbShieXRlcyk7CisJeGVuX2lvX3RsYl9zdGFydCA9IGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9BTElHTihieXRlcykpOwogCWlmICgheGVuX2lvX3RsYl9zdGFydCkgewogCQltID0gIkNhbm5vdCBhbGxvY2F0ZSBYZW4tU1dJT1RMQiBidWZmZXIhXG4iOwogCQlnb3RvIGVycm9yOwpAQCAtMTc5LDcgKzE3OSw3IEBACiAJCQkgICAgICAgYnl0ZXMsCiAJCQkgICAgICAgeGVuX2lvX3RsYl9uc2xhYnMpOwogCWlmIChyYykgewotCQlmcmVlX2Jvb3RtZW0oX19wYSh4ZW5faW9fdGxiX3N0YXJ0KSwgYnl0ZXMpOworCQlmcmVlX2Jvb3RtZW0oX19wYSh4ZW5faW9fdGxiX3N0YXJ0KSwgUEFHRV9BTElHTihieXRlcykpOwogCQltID0gIkZhaWxlZCB0byBnZXQgY29udGlndW91cyBtZW1vcnkgZm9yIERNQSBmcm9tIFhlbiFcbiJcCiAJCSAgICAiWW91IGVpdGhlcjogZG9uJ3QgaGF2ZSB0aGUgcGVybWlzc2lvbnMsIGRvIG5vdCBoYXZlIlwKIAkJICAgICIgZW5vdWdoIGZyZWUgbWVtb3J5IHVuZGVyIDRHQiwgb3IgdGhlIGh5cGVydmlzb3IgbWVtb3J5IlwKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYwppbmRleCBiM2I4ZjJmLi5lZGU4NjBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3hzLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jCkBAIC02MjEsMTUgKzYyMSw2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXRpYyB2b2lkIHhzX3Jlc2V0X3dhdGNoZXModm9pZCkKLXsKLQlpbnQgZXJyOwotCi0JZXJyID0geHNfZXJyb3IoeHNfc2luZ2xlKFhCVF9OSUwsIFhTX1JFU0VUX1dBVENIRVMsICIiLCBOVUxMKSk7Ci0JaWYgKGVyciAmJiBlcnIgIT0gLUVFWElTVCkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAieHNfcmVzZXRfd2F0Y2hlcyBmYWlsZWQ6ICVkXG4iLCBlcnIpOwotfQotCiAvKiBSZWdpc3RlciBjYWxsYmFjayB0byB3YXRjaCB0aGlzIG5vZGUuICovCiBpbnQgcmVnaXN0ZXJfeGVuYnVzX3dhdGNoKHN0cnVjdCB4ZW5idXNfd2F0Y2ggKndhdGNoKQogewpAQCAtOTA2LDkgKzg5Nyw1IEBACiAJaWYgKElTX0VSUih0YXNrKSkKIAkJcmV0dXJuIFBUUl9FUlIodGFzayk7CiAKLQkvKiBzaHV0ZG93biB3YXRjaGVzIGZvciBrZXhlYyBib290ICovCi0JaWYgKHhlbl9odm1fZG9tYWluKCkpCi0JCXhzX3Jlc2V0X3dhdGNoZXMoKTsKLQogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZmlybXdhcmUvUkVBRE1FLkFkZGluZ0Zpcm13YXJlIGIvZmlybXdhcmUvUkVBRE1FLkFkZGluZ0Zpcm13YXJlCmluZGV4IGUyNGNkODkuLmVhNzhjM2EgMTAwNjQ0Ci0tLSBhL2Zpcm13YXJlL1JFQURNRS5BZGRpbmdGaXJtd2FyZQorKysgYi9maXJtd2FyZS9SRUFETUUuQWRkaW5nRmlybXdhcmUKQEAgLTEyLDcgKzEyLDcgQEAKIFRoaXMgZGlyZWN0b3J5IGlzIF9OT1RfIGZvciBhZGRpbmcgYXJiaXRyYXJ5IG5ldyBmaXJtd2FyZSBpbWFnZXMuIFRoZQogcGxhY2UgdG8gYWRkIHRob3NlIGlzIHRoZSBzZXBhcmF0ZSBsaW51eC1maXJtd2FyZSByZXBvc2l0b3J5OgogCi0gICAgZ2l0Oi8vZ2l0Lmtlcm5lbC5vcmcvcHViL3NjbS9saW51eC9rZXJuZWwvZ2l0L2R3bXcyL2xpbnV4LWZpcm13YXJlLmdpdAorICAgIGdpdDovL2dpdC5rZXJuZWwub3JnL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC9maXJtd2FyZS9saW51eC1maXJtd2FyZS5naXQKIAogVGhhdCByZXBvc2l0b3J5IGNvbnRhaW5zIGFsbCB0aGVzZSBmaXJtd2FyZSBpbWFnZXMgd2hpY2ggaGF2ZSBiZWVuCiBleHRyYWN0ZWQgZnJvbSBvbGRlciBkcml2ZXJzLCBhcyB3ZWxsIHZhcmlvdXMgbmV3IGZpcm13YXJlIGltYWdlcyB3aGljaApAQCAtMjIsNiArMjIsNyBAQAogVG8gc3VibWl0IGZpcm13YXJlIHRvIHRoYXQgcmVwb3NpdG9yeSwgcGxlYXNlIHNlbmQgZWl0aGVyIGEgZ2l0IGJpbmFyeQogZGlmZiBvciBwcmVmZXJhYmx5IGEgZ2l0IHB1bGwgcmVxdWVzdCB0bzoKICAgICAgIERhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4KKyAgICAgIEJlbiBIdXRjaGluZ3MgPGJlbkBkZWNhZGVudC5vcmcudWs+CiAKIFlvdXIgY29tbWl0IHNob3VsZCBpbmNsdWRlIGFuIHVwZGF0ZSB0byB0aGUgV0hFTkNFIGZpbGUgY2xlYXJseQogaWRlbnRpZnlpbmcgdGhlIGxpY2VuY2UgdW5kZXIgd2hpY2ggdGhlIGZpcm13YXJlIGlzIGF2YWlsYWJsZSwgYW5kCmRpZmYgLS1naXQgYS9mcy9idHJmcy9hc3luYy10aHJlYWQuYyBiL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5jCmluZGV4IDdlYzE0MDkuLjBiMzk0NTggMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5jCisrKyBiL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5jCkBAIC02NCw2ICs2NCw4IEBACiAJaW50IGlkbGU7CiB9OwogCitzdGF0aWMgaW50IF9fYnRyZnNfc3RhcnRfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2Vycyk7CisKIC8qCiAgKiBidHJmc19zdGFydF93b3JrZXJzIHVzZXMga3RocmVhZF9ydW4sIHdoaWNoIGNhbiBibG9jayB3YWl0aW5nIGZvciBtZW1vcnkKICAqIGZvciBhIHZlcnkgbG9uZyB0aW1lLiAgSXQgd2lsbCBhY3R1YWxseSB0aHJvdHRsZSBvbiBwYWdlIHdyaXRlYmFjaywKQEAgLTg4LDI3ICs5MCwxMCBAQAogewogCXN0cnVjdCB3b3JrZXJfc3RhcnQgKnN0YXJ0OwogCXN0YXJ0ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB3b3JrZXJfc3RhcnQsIHdvcmspOwotCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoc3RhcnQtPnF1ZXVlLCAxKTsKKwlfX2J0cmZzX3N0YXJ0X3dvcmtlcnMoc3RhcnQtPnF1ZXVlKTsKIAlrZnJlZShzdGFydCk7CiB9CiAKLXN0YXRpYyBpbnQgc3RhcnRfbmV3X3dvcmtlcihzdHJ1Y3QgYnRyZnNfd29ya2VycyAqcXVldWUpCi17Ci0Jc3RydWN0IHdvcmtlcl9zdGFydCAqc3RhcnQ7Ci0JaW50IHJldDsKLQotCXN0YXJ0ID0ga3phbGxvYyhzaXplb2YoKnN0YXJ0KSwgR0ZQX05PRlMpOwotCWlmICghc3RhcnQpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc3RhcnQtPndvcmsuZnVuYyA9IHN0YXJ0X25ld193b3JrZXJfZnVuYzsKLQlzdGFydC0+cXVldWUgPSBxdWV1ZTsKLQlyZXQgPSBidHJmc19xdWV1ZV93b3JrZXIocXVldWUtPmF0b21pY193b3JrZXJfc3RhcnQsICZzdGFydC0+d29yayk7Ci0JaWYgKHJldCkKLQkJa2ZyZWUoc3RhcnQpOwotCXJldHVybiByZXQ7Ci19Ci0KIC8qCiAgKiBoZWxwZXIgZnVuY3Rpb24gdG8gbW92ZSBhIHRocmVhZCBvbnRvIHRoZSBpZGxlIGxpc3QgYWZ0ZXIgaXQKICAqIGhhcyBmaW5pc2hlZCBzb21lIHJlcXVlc3RzLgpAQCAtMTUzLDEyICsxMzgsMjAgQEAKIHN0YXRpYyB2b2lkIGNoZWNrX3BlbmRpbmdfd29ya2VyX2NyZWF0ZXMoc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQgKndvcmtlcikKIHsKIAlzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2VycyA9IHdvcmtlci0+d29ya2VyczsKKwlzdHJ1Y3Qgd29ya2VyX3N0YXJ0ICpzdGFydDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJcm1iKCk7CiAJaWYgKCF3b3JrZXJzLT5hdG9taWNfc3RhcnRfcGVuZGluZykKIAkJcmV0dXJuOwogCisJc3RhcnQgPSBremFsbG9jKHNpemVvZigqc3RhcnQpLCBHRlBfTk9GUyk7CisJaWYgKCFzdGFydCkKKwkJcmV0dXJuOworCisJc3RhcnQtPndvcmsuZnVuYyA9IHN0YXJ0X25ld193b3JrZXJfZnVuYzsKKwlzdGFydC0+cXVldWUgPSB3b3JrZXJzOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKIAlpZiAoIXdvcmtlcnMtPmF0b21pY19zdGFydF9wZW5kaW5nKQogCQlnb3RvIG91dDsKQEAgLTE3MCwxMCArMTYzLDExIEBACiAKIAl3b3JrZXJzLT5udW1fd29ya2Vyc19zdGFydGluZyArPSAxOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKLQlzdGFydF9uZXdfd29ya2VyKHdvcmtlcnMpOworCWJ0cmZzX3F1ZXVlX3dvcmtlcih3b3JrZXJzLT5hdG9taWNfd29ya2VyX3N0YXJ0LCAmc3RhcnQtPndvcmspOwogCXJldHVybjsKIAogb3V0OgorCWtmcmVlKHN0YXJ0KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CiB9CiAKQEAgLTMzMSw3ICszMjUsNyBAQAogCQkJcnVuX29yZGVyZWRfY29tcGxldGlvbnMod29ya2VyLT53b3JrZXJzLCB3b3JrKTsKIAogCQkJY2hlY2tfcGVuZGluZ193b3JrZXJfY3JlYXRlcyh3b3JrZXIpOwotCisJCQljb25kX3Jlc2NoZWQoKTsKIAkJfQogCiAJCXNwaW5fbG9ja19pcnEoJndvcmtlci0+bG9jayk7CkBAIC00NjIsNTYgKzQ1Niw1NSBAQAogICogc3RhcnRzIG5ldyB3b3JrZXIgdGhyZWFkcy4gIFRoaXMgZG9lcyBub3QgZW5mb3JjZSB0aGUgbWF4IHdvcmtlcgogICogY291bnQgaW4gY2FzZSB5b3UgbmVlZCB0byB0ZW1wb3JhcmlseSBnbyBwYXN0IGl0LgogICovCi1zdGF0aWMgaW50IF9fYnRyZnNfc3RhcnRfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2VycywKLQkJCQkgaW50IG51bV93b3JrZXJzKQorc3RhdGljIGludCBfX2J0cmZzX3N0YXJ0X3dvcmtlcnMoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMpCiB7CiAJc3RydWN0IGJ0cmZzX3dvcmtlcl90aHJlYWQgKndvcmtlcjsKIAlpbnQgcmV0ID0gMDsKLQlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBudW1fd29ya2VyczsgaSsrKSB7Ci0JCXdvcmtlciA9IGt6YWxsb2Moc2l6ZW9mKCp3b3JrZXIpLCBHRlBfTk9GUyk7Ci0JCWlmICghd29ya2VyKSB7Ci0JCQlyZXQgPSAtRU5PTUVNOwotCQkJZ290byBmYWlsOwotCQl9Ci0KLQkJSU5JVF9MSVNUX0hFQUQoJndvcmtlci0+cGVuZGluZyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZ3b3JrZXItPnByaW9fcGVuZGluZyk7Ci0JCUlOSVRfTElTVF9IRUFEKCZ3b3JrZXItPndvcmtlcl9saXN0KTsKLQkJc3Bpbl9sb2NrX2luaXQoJndvcmtlci0+bG9jayk7Ci0KLQkJYXRvbWljX3NldCgmd29ya2VyLT5udW1fcGVuZGluZywgMCk7Ci0JCWF0b21pY19zZXQoJndvcmtlci0+cmVmcywgMSk7Ci0JCXdvcmtlci0+d29ya2VycyA9IHdvcmtlcnM7Ci0JCXdvcmtlci0+dGFzayA9IGt0aHJlYWRfcnVuKHdvcmtlcl9sb29wLCB3b3JrZXIsCi0JCQkJCSAgICJidHJmcy0lcy0lZCIsIHdvcmtlcnMtPm5hbWUsCi0JCQkJCSAgIHdvcmtlcnMtPm51bV93b3JrZXJzICsgaSk7Ci0JCWlmIChJU19FUlIod29ya2VyLT50YXNrKSkgewotCQkJcmV0ID0gUFRSX0VSUih3b3JrZXItPnRhc2spOwotCQkJa2ZyZWUod29ya2VyKTsKLQkJCWdvdG8gZmFpbDsKLQkJfQotCQlzcGluX2xvY2tfaXJxKCZ3b3JrZXJzLT5sb2NrKTsKLQkJbGlzdF9hZGRfdGFpbCgmd29ya2VyLT53b3JrZXJfbGlzdCwgJndvcmtlcnMtPmlkbGVfbGlzdCk7Ci0JCXdvcmtlci0+aWRsZSA9IDE7Ci0JCXdvcmtlcnMtPm51bV93b3JrZXJzKys7Ci0JCXdvcmtlcnMtPm51bV93b3JrZXJzX3N0YXJ0aW5nLS07Ci0JCVdBUk5fT04od29ya2Vycy0+bnVtX3dvcmtlcnNfc3RhcnRpbmcgPCAwKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZ3b3JrZXJzLT5sb2NrKTsKKwl3b3JrZXIgPSBremFsbG9jKHNpemVvZigqd29ya2VyKSwgR0ZQX05PRlMpOworCWlmICghd29ya2VyKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDsKIAl9CisKKwlJTklUX0xJU1RfSEVBRCgmd29ya2VyLT5wZW5kaW5nKTsKKwlJTklUX0xJU1RfSEVBRCgmd29ya2VyLT5wcmlvX3BlbmRpbmcpOworCUlOSVRfTElTVF9IRUFEKCZ3b3JrZXItPndvcmtlcl9saXN0KTsKKwlzcGluX2xvY2tfaW5pdCgmd29ya2VyLT5sb2NrKTsKKworCWF0b21pY19zZXQoJndvcmtlci0+bnVtX3BlbmRpbmcsIDApOworCWF0b21pY19zZXQoJndvcmtlci0+cmVmcywgMSk7CisJd29ya2VyLT53b3JrZXJzID0gd29ya2VyczsKKwl3b3JrZXItPnRhc2sgPSBrdGhyZWFkX3J1bih3b3JrZXJfbG9vcCwgd29ya2VyLAorCQkJCSAgICJidHJmcy0lcy0lZCIsIHdvcmtlcnMtPm5hbWUsCisJCQkJICAgd29ya2Vycy0+bnVtX3dvcmtlcnMgKyAxKTsKKwlpZiAoSVNfRVJSKHdvcmtlci0+dGFzaykpIHsKKwkJcmV0ID0gUFRSX0VSUih3b3JrZXItPnRhc2spOworCQlrZnJlZSh3b3JrZXIpOworCQlnb3RvIGZhaWw7CisJfQorCXNwaW5fbG9ja19pcnEoJndvcmtlcnMtPmxvY2spOworCWxpc3RfYWRkX3RhaWwoJndvcmtlci0+d29ya2VyX2xpc3QsICZ3b3JrZXJzLT5pZGxlX2xpc3QpOworCXdvcmtlci0+aWRsZSA9IDE7CisJd29ya2Vycy0+bnVtX3dvcmtlcnMrKzsKKwl3b3JrZXJzLT5udW1fd29ya2Vyc19zdGFydGluZy0tOworCVdBUk5fT04od29ya2Vycy0+bnVtX3dvcmtlcnNfc3RhcnRpbmcgPCAwKTsKKwlzcGluX3VubG9ja19pcnEoJndvcmtlcnMtPmxvY2spOworCiAJcmV0dXJuIDA7CiBmYWlsOgotCWJ0cmZzX3N0b3Bfd29ya2Vycyh3b3JrZXJzKTsKKwlzcGluX2xvY2tfaXJxKCZ3b3JrZXJzLT5sb2NrKTsKKwl3b3JrZXJzLT5udW1fd29ya2Vyc19zdGFydGluZy0tOworCXNwaW5fdW5sb2NrX2lycSgmd29ya2Vycy0+bG9jayk7CiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGJ0cmZzX3N0YXJ0X3dvcmtlcnMoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMsIGludCBudW1fd29ya2VycykKK2ludCBidHJmc19zdGFydF93b3JrZXJzKHN0cnVjdCBidHJmc193b3JrZXJzICp3b3JrZXJzKQogewogCXNwaW5fbG9ja19pcnEoJndvcmtlcnMtPmxvY2spOwotCXdvcmtlcnMtPm51bV93b3JrZXJzX3N0YXJ0aW5nICs9IG51bV93b3JrZXJzOworCXdvcmtlcnMtPm51bV93b3JrZXJzX3N0YXJ0aW5nKys7CiAJc3Bpbl91bmxvY2tfaXJxKCZ3b3JrZXJzLT5sb2NrKTsKLQlyZXR1cm4gX19idHJmc19zdGFydF93b3JrZXJzKHdvcmtlcnMsIG51bV93b3JrZXJzKTsKKwlyZXR1cm4gX19idHJmc19zdGFydF93b3JrZXJzKHdvcmtlcnMpOwogfQogCiAvKgpAQCAtNTY4LDkgKzU2MSwxMCBAQAogCXN0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkICp3b3JrZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpmYWxsYmFjazsKKwlpbnQgcmV0OwogCi1hZ2FpbjoKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd29ya2Vycy0+bG9jaywgZmxhZ3MpOworYWdhaW46CiAJd29ya2VyID0gbmV4dF93b3JrZXIod29ya2Vycyk7CiAKIAlpZiAoIXdvcmtlcikgewpAQCAtNTg0LDcgKzU3OCwxMCBAQAogCQkJd29ya2Vycy0+bnVtX3dvcmtlcnNfc3RhcnRpbmcrKzsKIAkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlcnMtPmxvY2ssIGZsYWdzKTsKIAkJCS8qIHdlJ3JlIGJlbG93IHRoZSBsaW1pdCwgc3RhcnQgYW5vdGhlciB3b3JrZXIgKi8KLQkJCV9fYnRyZnNfc3RhcnRfd29ya2Vycyh3b3JrZXJzLCAxKTsKKwkJCXJldCA9IF9fYnRyZnNfc3RhcnRfd29ya2Vycyh3b3JrZXJzKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b3JrZXJzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZmFsbGJhY2s7CiAJCQlnb3RvIGFnYWluOwogCQl9CiAJfQpAQCAtNjY1LDcgKzY2Miw3IEBACiAvKgogICogcGxhY2VzIGEgc3RydWN0IGJ0cmZzX3dvcmsgaW50byB0aGUgcGVuZGluZyBxdWV1ZSBvZiBvbmUgb2YgdGhlIGt0aHJlYWRzCiAgKi8KLWludCBidHJmc19xdWV1ZV93b3JrZXIoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMsIHN0cnVjdCBidHJmc193b3JrICp3b3JrKQordm9pZCBidHJmc19xdWV1ZV93b3JrZXIoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMsIHN0cnVjdCBidHJmc193b3JrICp3b3JrKQogewogCXN0cnVjdCBidHJmc193b3JrZXJfdGhyZWFkICp3b3JrZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTY3Myw3ICs2NzAsNyBAQAogCiAJLyogZG9uJ3QgcmVxdWV1ZSBzb21ldGhpbmcgYWxyZWFkeSBvbiBhIGxpc3QgKi8KIAlpZiAodGVzdF9hbmRfc2V0X2JpdChXT1JLX1FVRVVFRF9CSVQsICZ3b3JrLT5mbGFncykpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKIAl3b3JrZXIgPSBmaW5kX3dvcmtlcih3b3JrZXJzKTsKIAlpZiAod29ya2Vycy0+b3JkZXJlZCkgewpAQCAtNzEyLDcgKzcwOSw0IEBACiAJaWYgKHdha2UpCiAJCXdha2VfdXBfcHJvY2Vzcyh3b3JrZXItPnRhc2spOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtlci0+bG9jaywgZmxhZ3MpOwotCi1vdXQ6Ci0JcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9mcy9idHJmcy9hc3luYy10aHJlYWQuaCBiL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5oCmluZGV4IDUwNzc3NDYuLmYzNGNjMzEgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5oCisrKyBiL2ZzL2J0cmZzL2FzeW5jLXRocmVhZC5oCkBAIC0xMDksOCArMTA5LDggQEAKIAljaGFyICpuYW1lOwogfTsKIAotaW50IGJ0cmZzX3F1ZXVlX3dvcmtlcihzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2Vycywgc3RydWN0IGJ0cmZzX3dvcmsgKndvcmspOwotaW50IGJ0cmZzX3N0YXJ0X3dvcmtlcnMoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMsIGludCBudW1fd29ya2Vycyk7Cit2b2lkIGJ0cmZzX3F1ZXVlX3dvcmtlcihzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2Vycywgc3RydWN0IGJ0cmZzX3dvcmsgKndvcmspOworaW50IGJ0cmZzX3N0YXJ0X3dvcmtlcnMoc3RydWN0IGJ0cmZzX3dvcmtlcnMgKndvcmtlcnMpOwogaW50IGJ0cmZzX3N0b3Bfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2Vycyk7CiB2b2lkIGJ0cmZzX2luaXRfd29ya2VycyhzdHJ1Y3QgYnRyZnNfd29ya2VycyAqd29ya2VycywgY2hhciAqbmFtZSwgaW50IG1heCwKIAkJCXN0cnVjdCBidHJmc193b3JrZXJzICphc3luY19zdGFydGVyKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2N0cmVlLmggYi9mcy9idHJmcy9jdHJlZS5oCmluZGV4IDUwNjM0YWJlLi42NzM4NTAzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9jdHJlZS5oCisrKyBiL2ZzL2J0cmZzL2N0cmVlLmgKQEAgLTI2OTIsNyArMjY5Miw4IEBACiBpbnQgYnRyZnNfcmVhZHBhZ2Uoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwYWdlICpwYWdlKTsKIHZvaWQgYnRyZnNfZXZpY3RfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgYnRyZnNfd3JpdGVfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IHdyaXRlYmFja19jb250cm9sICp3YmMpOwotdm9pZCBidHJmc19kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpOworaW50IGJ0cmZzX2RpcnR5X2lub2RlKHN0cnVjdCBpbm9kZSAqaW5vZGUpOworaW50IGJ0cmZzX3VwZGF0ZV90aW1lKHN0cnVjdCBmaWxlICpmaWxlKTsKIHN0cnVjdCBpbm9kZSAqYnRyZnNfYWxsb2NfaW5vZGUoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7CiB2b2lkIGJ0cmZzX2Rlc3Ryb3lfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSk7CiBpbnQgYnRyZnNfZHJvcF9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYyBiL2ZzL2J0cmZzL2RlbGF5ZWQtaW5vZGUuYwppbmRleCA1YjE2MzU3Li45YzFlY2NjIDEwMDY0NAotLS0gYS9mcy9idHJmcy9kZWxheWVkLWlub2RlLmMKKysrIGIvZnMvYnRyZnMvZGVsYXllZC1pbm9kZS5jCkBAIC02NDAsOCArNjQwLDggQEAKIAkgKiBOb3cgaWYgc3JjX3JzdiA9PSBkZWxhbGxvY19ibG9ja19yc3Ygd2UnbGwgbGV0IGl0IGp1c3Qgc3RlYWwgc2luY2UKIAkgKiB3ZSdyZSBhY2NvdW50ZWQgZm9yLgogCSAqLwotCWlmICghdHJhbnMtPmJ5dGVzX3Jlc2VydmVkICYmCi0JICAgIHNyY19yc3YgIT0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdikgeworCWlmICghc3JjX3JzdiB8fCAoIXRyYW5zLT5ieXRlc19yZXNlcnZlZCAmJgorCSAgICBzcmNfcnN2ICE9ICZyb290LT5mc19pbmZvLT5kZWxhbGxvY19ibG9ja19yc3YpKSB7CiAJCXJldCA9IGJ0cmZzX2Jsb2NrX3Jzdl9hZGRfbm9mbHVzaChyb290LCBkc3RfcnN2LCBudW1fYnl0ZXMpOwogCQkvKgogCQkgKiBTaW5jZSB3ZSdyZSB1bmRlciBhIHRyYW5zYWN0aW9uIHJlc2VydmVfbWV0YWRhdGFfYnl0ZXMgY291bGQKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2Rpc2staW8uYyBiL2ZzL2J0cmZzL2Rpc2staW8uYwppbmRleCA2MzJmOGYzLi5mNDRiMzkyIDEwMDY0NAotLS0gYS9mcy9idHJmcy9kaXNrLWlvLmMKKysrIGIvZnMvYnRyZnMvZGlzay1pby5jCkBAIC0yMTk0LDE5ICsyMTk0LDI3IEBACiAJZnNfaW5mby0+ZW5kaW9fbWV0YV93cml0ZV93b3JrZXJzLmlkbGVfdGhyZXNoID0gMjsKIAlmc19pbmZvLT5yZWFkYWhlYWRfd29ya2Vycy5pZGxlX3RocmVzaCA9IDI7CiAKLQlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT53b3JrZXJzLCAxKTsKLQlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5nZW5lcmljX3dvcmtlciwgMSk7Ci0JYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+c3VibWl0X3dvcmtlcnMsIDEpOwotCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmRlbGFsbG9jX3dvcmtlcnMsIDEpOwotCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmZpeHVwX3dvcmtlcnMsIDEpOwotCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX3dvcmtlcnMsIDEpOwotCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX21ldGFfd29ya2VycywgMSk7Ci0JYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fbWV0YV93cml0ZV93b3JrZXJzLCAxKTsKLQlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb193cml0ZV93b3JrZXJzLCAxKTsKLQlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19mcmVlc3BhY2Vfd29ya2VyLCAxKTsKLQlidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5kZWxheWVkX3dvcmtlcnMsIDEpOwotCWJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmNhY2hpbmdfd29ya2VycywgMSk7Ci0JYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+cmVhZGFoZWFkX3dvcmtlcnMsIDEpOworCS8qCisJICogYnRyZnNfc3RhcnRfd29ya2VycyBjYW4gcmVhbGx5IG9ubHkgZmFpbCBiZWNhdXNlIG9mIEVOT01FTSBzbyBqdXN0CisJICogcmV0dXJuIC1FTk9NRU0gaWYgYW55IG9mIHRoZXNlIGZhaWwuCisJICovCisJcmV0ID0gYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+d29ya2Vycyk7CisJcmV0IHw9IGJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmdlbmVyaWNfd29ya2VyKTsKKwlyZXQgfD0gYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+c3VibWl0X3dvcmtlcnMpOworCXJldCB8PSBidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5kZWxhbGxvY193b3JrZXJzKTsKKwlyZXQgfD0gYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+Zml4dXBfd29ya2Vycyk7CisJcmV0IHw9IGJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmVuZGlvX3dvcmtlcnMpOworCXJldCB8PSBidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19tZXRhX3dvcmtlcnMpOworCXJldCB8PSBidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb19tZXRhX3dyaXRlX3dvcmtlcnMpOworCXJldCB8PSBidHJmc19zdGFydF93b3JrZXJzKCZmc19pbmZvLT5lbmRpb193cml0ZV93b3JrZXJzKTsKKwlyZXQgfD0gYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+ZW5kaW9fZnJlZXNwYWNlX3dvcmtlcik7CisJcmV0IHw9IGJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmRlbGF5ZWRfd29ya2Vycyk7CisJcmV0IHw9IGJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPmNhY2hpbmdfd29ya2Vycyk7CisJcmV0IHw9IGJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPnJlYWRhaGVhZF93b3JrZXJzKTsKKwlpZiAocmV0KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9zYl9idWZmZXI7CisJfQogCiAJZnNfaW5mby0+YmRpLnJhX3BhZ2VzICo9IGJ0cmZzX3N1cGVyX251bV9kZXZpY2VzKGRpc2tfc3VwZXIpOwogCWZzX2luZm8tPmJkaS5yYV9wYWdlcyA9IG1heChmc19pbmZvLT5iZGkucmFfcGFnZXMsCmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnQtdHJlZS5jIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwppbmRleCBmMGQ1NzE4Li5mNWZiZTU3IDEwMDY0NAotLS0gYS9mcy9idHJmcy9leHRlbnQtdHJlZS5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMKQEAgLTI4MjIsNyArMjgyMiw3IEBACiAJYnRyZnNfcmVsZWFzZV9wYXRoKHBhdGgpOwogb3V0OgogCXNwaW5fbG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOwotCWlmICghcmV0KQorCWlmICghcmV0ICYmIGRjcyA9PSBCVFJGU19EQ19TRVRVUCkKIAkJYmxvY2tfZ3JvdXAtPmNhY2hlX2dlbmVyYXRpb24gPSB0cmFucy0+dHJhbnNpZDsKIAlibG9ja19ncm91cC0+ZGlza19jYWNoZV9zdGF0ZSA9IGRjczsKIAlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmxvY2spOwpAQCAtNDIwNCwxMiArNDIwNCwxNyBAQAogCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CiAJc3RydWN0IGJ0cmZzX2Jsb2NrX3JzdiAqYmxvY2tfcnN2ID0gJnJvb3QtPmZzX2luZm8tPmRlbGFsbG9jX2Jsb2NrX3JzdjsKIAl1NjQgdG9fcmVzZXJ2ZSA9IDA7CisJdTY0IGNzdW1fYnl0ZXM7CiAJdW5zaWduZWQgbnJfZXh0ZW50cyA9IDA7CisJaW50IGV4dHJhX3Jlc2VydmUgPSAwOwogCWludCBmbHVzaCA9IDE7CiAJaW50IHJldDsKIAorCS8qIE5lZWQgdG8gYmUgaG9sZGluZyB0aGUgaV9tdXRleCBoZXJlIGlmIHdlIGFyZW4ndCBmcmVlIHNwYWNlIGNhY2hlICovCiAJaWYgKGJ0cmZzX2lzX2ZyZWVfc3BhY2VfaW5vZGUocm9vdCwgaW5vZGUpKQogCQlmbHVzaCA9IDA7CisJZWxzZQorCQlXQVJOX09OKCFtdXRleF9pc19sb2NrZWQoJmlub2RlLT5pX211dGV4KSk7CiAKIAlpZiAoZmx1c2ggJiYgYnRyZnNfdHJhbnNhY3Rpb25faW5fY29tbWl0KHJvb3QtPmZzX2luZm8pKQogCQlzY2hlZHVsZV90aW1lb3V0KDEpOwpAQCAtNDIyMCwxMSArNDIyNSw5IEBACiAJQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMrKzsKIAogCWlmIChCVFJGU19JKGlub2RlKS0+b3V0c3RhbmRpbmdfZXh0ZW50cyA+Ci0JICAgIEJUUkZTX0koaW5vZGUpLT5yZXNlcnZlZF9leHRlbnRzKSB7CisJICAgIEJUUkZTX0koaW5vZGUpLT5yZXNlcnZlZF9leHRlbnRzKQogCQlucl9leHRlbnRzID0gQlRSRlNfSShpbm9kZSktPm91dHN0YW5kaW5nX2V4dGVudHMgLQogCQkJQlRSRlNfSShpbm9kZSktPnJlc2VydmVkX2V4dGVudHM7Ci0JCUJUUkZTX0koaW5vZGUpLT5yZXNlcnZlZF9leHRlbnRzICs9IG5yX2V4dGVudHM7Ci0JfQogCiAJLyoKIAkgKiBBZGQgYW4gaXRlbSB0byByZXNlcnZlIGZvciB1cGRhdGluZyB0aGUgaW5vZGUgd2hlbiB3ZSBjb21wbGV0ZSB0aGUKQEAgLTQyMzIsMTEgKzQyMzUsMTIgQEAKIAkgKi8KIAlpZiAoIUJUUkZTX0koaW5vZGUpLT5kZWxhbGxvY19tZXRhX3Jlc2VydmVkKSB7CiAJCW5yX2V4dGVudHMrKzsKLQkJQlRSRlNfSShpbm9kZSktPmRlbGFsbG9jX21ldGFfcmVzZXJ2ZWQgPSAxOworCQlleHRyYV9yZXNlcnZlID0gMTsKIAl9CiAKIAl0b19yZXNlcnZlID0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIG5yX2V4dGVudHMpOwogCXRvX3Jlc2VydmUgKz0gY2FsY19jc3VtX21ldGFkYXRhX3NpemUoaW5vZGUsIG51bV9ieXRlcywgMSk7CisJY3N1bV9ieXRlcyA9IEJUUkZTX0koaW5vZGUpLT5jc3VtX2J5dGVzOwogCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CiAKIAlyZXQgPSByZXNlcnZlX21ldGFkYXRhX2J5dGVzKHJvb3QsIGJsb2NrX3JzdiwgdG9fcmVzZXJ2ZSwgZmx1c2gpOwpAQCAtNDI0NiwyMiArNDI1MCwzNSBAQAogCiAJCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOwogCQlkcm9wcGVkID0gZHJvcF9vdXRzdGFuZGluZ19leHRlbnQoaW5vZGUpOwotCQl0b19mcmVlID0gY2FsY19jc3VtX21ldGFkYXRhX3NpemUoaW5vZGUsIG51bV9ieXRlcywgMCk7Ci0JCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7Ci0JCXRvX2ZyZWUgKz0gYnRyZnNfY2FsY190cmFuc19tZXRhZGF0YV9zaXplKHJvb3QsIGRyb3BwZWQpOwotCiAJCS8qCi0JCSAqIFNvbWVib2R5IGNvdWxkIGhhdmUgY29tZSBpbiBhbmQgdHdpZGRsZWQgd2l0aCB0aGUKLQkJICogcmVzZXJ2YXRpb24sIHNvIGlmIHdlIGhhdmUgdG8gZnJlZSBtb3JlIHRoYW4gd2Ugd291bGQgaGF2ZQotCQkgKiByZXNlcnZlZCBmcm9tIHRoaXMgcmVzZXJ2YXRpb24gZ28gYWhlYWQgYW5kIHJlbGVhc2UgdGhvc2UKLQkJICogYnl0ZXMuCisJCSAqIElmIHRoZSBpbm9kZXMgY3N1bV9ieXRlcyBpcyB0aGUgc2FtZSBhcyB0aGUgb3JpZ2luYWwKKwkJICogY3N1bV9ieXRlcyB0aGVuIHdlIGtub3cgd2UgaGF2ZW4ndCByYWNlZCB3aXRoIGFueSBmcmVlKCllcnMKKwkJICogc28gd2UgY2FuIGp1c3QgcmVkdWNlIG91ciBpbm9kZXMgY3N1bSBieXRlcyBhbmQgY2Fycnkgb24uCisJCSAqIE90aGVyd2lzZSB3ZSBoYXZlIHRvIGRvIHRoZSBub3JtYWwgZnJlZSB0aGluZyB0byBhY2NvdW50IGZvcgorCQkgKiB0aGUgY2FzZSB0aGF0IHRoZSBmcmVlIHNpZGUgZGlkbid0IGZyZWUgdXAgaXRzIHJlc2VydmUKKwkJICogYmVjYXVzZSBvZiB0aGlzIG91dHN0YW5kaW5nIHJlc2VydmF0aW9uLgogCQkgKi8KLQkJdG9fZnJlZSAtPSB0b19yZXNlcnZlOworCQlpZiAoQlRSRlNfSShpbm9kZSktPmNzdW1fYnl0ZXMgPT0gY3N1bV9ieXRlcykKKwkJCWNhbGNfY3N1bV9tZXRhZGF0YV9zaXplKGlub2RlLCBudW1fYnl0ZXMsIDApOworCQllbHNlCisJCQl0b19mcmVlID0gY2FsY19jc3VtX21ldGFkYXRhX3NpemUoaW5vZGUsIG51bV9ieXRlcywgMCk7CisJCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CisJCWlmIChkcm9wcGVkKQorCQkJdG9fZnJlZSArPSBidHJmc19jYWxjX3RyYW5zX21ldGFkYXRhX3NpemUocm9vdCwgZHJvcHBlZCk7CisKIAkJaWYgKHRvX2ZyZWUpCiAJCQlidHJmc19ibG9ja19yc3ZfcmVsZWFzZShyb290LCBibG9ja19yc3YsIHRvX2ZyZWUpOwogCQlyZXR1cm4gcmV0OwogCX0KIAorCXNwaW5fbG9jaygmQlRSRlNfSShpbm9kZSktPmxvY2spOworCWlmIChleHRyYV9yZXNlcnZlKSB7CisJCUJUUkZTX0koaW5vZGUpLT5kZWxhbGxvY19tZXRhX3Jlc2VydmVkID0gMTsKKwkJbnJfZXh0ZW50cy0tOworCX0KKwlCVFJGU19JKGlub2RlKS0+cmVzZXJ2ZWRfZXh0ZW50cyArPSBucl9leHRlbnRzOworCXNwaW5fdW5sb2NrKCZCVFJGU19JKGlub2RlKS0+bG9jayk7CisKIAlibG9ja19yc3ZfYWRkX2J5dGVzKGJsb2NrX3JzdiwgdG9fcmVzZXJ2ZSwgMSk7CiAKIAlyZXR1cm4gMDsKQEAgLTUxMDcsMTEgKzUxMjQsMTEgQEAKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IG9yaWdfcm9vdC0+ZnNfaW5mby0+ZXh0ZW50X3Jvb3Q7CiAJc3RydWN0IGJ0cmZzX2ZyZWVfY2x1c3RlciAqbGFzdF9wdHIgPSBOVUxMOwogCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqYmxvY2tfZ3JvdXAgPSBOVUxMOworCXN0cnVjdCBidHJmc19ibG9ja19ncm91cF9jYWNoZSAqdXNlZF9ibG9ja19ncm91cDsKIAlpbnQgZW1wdHlfY2x1c3RlciA9IDIgKiAxMDI0ICogMTAyNDsKIAlpbnQgYWxsb3dlZF9jaHVua19hbGxvYyA9IDA7CiAJaW50IGRvbmVfY2h1bmtfYWxsb2MgPSAwOwogCXN0cnVjdCBidHJmc19zcGFjZV9pbmZvICpzcGFjZV9pbmZvOwotCWludCBsYXN0X3B0cl9sb29wID0gMDsKIAlpbnQgbG9vcCA9IDA7CiAJaW50IGluZGV4ID0gMDsKIAlpbnQgYWxsb2NfdHlwZSA9IChkYXRhICYgQlRSRlNfQkxPQ0tfR1JPVVBfREFUQSkgPwpAQCAtNTE3Myw2ICs1MTkwLDcgQEAKIGlkZWFsX2NhY2hlOgogCQlibG9ja19ncm91cCA9IGJ0cmZzX2xvb2t1cF9ibG9ja19ncm91cChyb290LT5mc19pbmZvLAogCQkJCQkJICAgICAgIHNlYXJjaF9zdGFydCk7CisJCXVzZWRfYmxvY2tfZ3JvdXAgPSBibG9ja19ncm91cDsKIAkJLyoKIAkJICogd2UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIGJsb2NrIGdyb3VwIGlmIGl0IGRvZXNuJ3QgbWF0Y2ggb3VyCiAJCSAqIGFsbG9jYXRpb24gYml0cywgb3IgaWYgaXRzIG5vdCBjYWNoZWQuCkBAIC01MjEwLDYgKzUyMjgsNyBAQAogCQl1NjQgb2Zmc2V0OwogCQlpbnQgY2FjaGVkOwogCisJCXVzZWRfYmxvY2tfZ3JvdXAgPSBibG9ja19ncm91cDsKIAkJYnRyZnNfZ2V0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKIAkJc2VhcmNoX3N0YXJ0ID0gYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZDsKIApAQCAtNTI4Niw3MSArNTMwNSw2MiBAQAogCQlzcGluX3VubG9jaygmYmxvY2tfZ3JvdXAtPmZyZWVfc3BhY2VfY3RsLT50cmVlX2xvY2spOwogCiAJCS8qCi0JCSAqIE9rIHdlIHdhbnQgdG8gdHJ5IGFuZCB1c2UgdGhlIGNsdXN0ZXIgYWxsb2NhdG9yLCBzbyBsZXRzIGxvb2sKLQkJICogdGhlcmUsIHVubGVzcyB3ZSBhcmUgb24gTE9PUF9OT19FTVBUWV9TSVpFLCBzaW5jZSB3ZSB3aWxsCi0JCSAqIGhhdmUgdHJpZWQgdGhlIGNsdXN0ZXIgYWxsb2NhdG9yIHBsZW50eSBvZiB0aW1lcyBhdCB0aGlzCi0JCSAqIHBvaW50IGFuZCBub3QgaGF2ZSBmb3VuZCBhbnl0aGluZywgc28gd2UgYXJlIGxpa2VseSB3YXkgdG9vCi0JCSAqIGZyYWdtZW50ZWQgZm9yIHRoZSBjbHVzdGVyaW5nIHN0dWZmIHRvIGZpbmQgYW55dGhpbmcsIHNvIGxldHMKLQkJICoganVzdCBza2lwIGl0IGFuZCBsZXQgdGhlIGFsbG9jYXRvciBmaW5kIHdoYXRldmVyIGJsb2NrIGl0IGNhbgotCQkgKiBmaW5kCisJCSAqIE9rIHdlIHdhbnQgdG8gdHJ5IGFuZCB1c2UgdGhlIGNsdXN0ZXIgYWxsb2NhdG9yLCBzbworCQkgKiBsZXRzIGxvb2sgdGhlcmUKIAkJICovCi0JCWlmIChsYXN0X3B0ciAmJiBsb29wIDwgTE9PUF9OT19FTVBUWV9TSVpFKSB7CisJCWlmIChsYXN0X3B0cikgewogCQkJLyoKIAkJCSAqIHRoZSByZWZpbGwgbG9jayBrZWVwcyBvdXQgb3RoZXIKIAkJCSAqIHBlb3BsZSB0cnlpbmcgdG8gc3RhcnQgYSBuZXcgY2x1c3RlcgogCQkJICovCiAJCQlzcGluX2xvY2soJmxhc3RfcHRyLT5yZWZpbGxfbG9jayk7Ci0JCQlpZiAoIWxhc3RfcHRyLT5ibG9ja19ncm91cCB8fAotCQkJICAgIGxhc3RfcHRyLT5ibG9ja19ncm91cC0+cm8gfHwKLQkJCSAgICAhYmxvY2tfZ3JvdXBfYml0cyhsYXN0X3B0ci0+YmxvY2tfZ3JvdXAsIGRhdGEpKQorCQkJdXNlZF9ibG9ja19ncm91cCA9IGxhc3RfcHRyLT5ibG9ja19ncm91cDsKKwkJCWlmICh1c2VkX2Jsb2NrX2dyb3VwICE9IGJsb2NrX2dyb3VwICYmCisJCQkgICAgKCF1c2VkX2Jsb2NrX2dyb3VwIHx8CisJCQkgICAgIHVzZWRfYmxvY2tfZ3JvdXAtPnJvIHx8CisJCQkgICAgICFibG9ja19ncm91cF9iaXRzKHVzZWRfYmxvY2tfZ3JvdXAsIGRhdGEpKSkgeworCQkJCXVzZWRfYmxvY2tfZ3JvdXAgPSBibG9ja19ncm91cDsKIAkJCQlnb3RvIHJlZmlsbF9jbHVzdGVyOworCQkJfQogCi0JCQlvZmZzZXQgPSBidHJmc19hbGxvY19mcm9tX2NsdXN0ZXIoYmxvY2tfZ3JvdXAsIGxhc3RfcHRyLAotCQkJCQkJIG51bV9ieXRlcywgc2VhcmNoX3N0YXJ0KTsKKwkJCWlmICh1c2VkX2Jsb2NrX2dyb3VwICE9IGJsb2NrX2dyb3VwKQorCQkJCWJ0cmZzX2dldF9ibG9ja19ncm91cCh1c2VkX2Jsb2NrX2dyb3VwKTsKKworCQkJb2Zmc2V0ID0gYnRyZnNfYWxsb2NfZnJvbV9jbHVzdGVyKHVzZWRfYmxvY2tfZ3JvdXAsCisJCQkgIGxhc3RfcHRyLCBudW1fYnl0ZXMsIHVzZWRfYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCk7CiAJCQlpZiAob2Zmc2V0KSB7CiAJCQkJLyogd2UgaGF2ZSBhIGJsb2NrLCB3ZSdyZSBkb25lICovCiAJCQkJc3Bpbl91bmxvY2soJmxhc3RfcHRyLT5yZWZpbGxfbG9jayk7CiAJCQkJZ290byBjaGVja3M7CiAJCQl9CiAKLQkJCXNwaW5fbG9jaygmbGFzdF9wdHItPmxvY2spOwotCQkJLyoKLQkJCSAqIHdob29wcywgdGhpcyBjbHVzdGVyIGRvZXNuJ3QgYWN0dWFsbHkgcG9pbnQgdG8KLQkJCSAqIHRoaXMgYmxvY2sgZ3JvdXAuICBHZXQgYSByZWYgb24gdGhlIGJsb2NrCi0JCQkgKiBncm91cCBpcyBkb2VzIHBvaW50IHRvIGFuZCB0cnkgYWdhaW4KLQkJCSAqLwotCQkJaWYgKCFsYXN0X3B0cl9sb29wICYmIGxhc3RfcHRyLT5ibG9ja19ncm91cCAmJgotCQkJICAgIGxhc3RfcHRyLT5ibG9ja19ncm91cCAhPSBibG9ja19ncm91cCAmJgotCQkJICAgIGluZGV4IDw9Ci0JCQkJIGdldF9ibG9ja19ncm91cF9pbmRleChsYXN0X3B0ci0+YmxvY2tfZ3JvdXApKSB7Ci0KLQkJCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwotCQkJCWJsb2NrX2dyb3VwID0gbGFzdF9wdHItPmJsb2NrX2dyb3VwOwotCQkJCWJ0cmZzX2dldF9ibG9ja19ncm91cChibG9ja19ncm91cCk7Ci0JCQkJc3Bpbl91bmxvY2soJmxhc3RfcHRyLT5sb2NrKTsKLQkJCQlzcGluX3VubG9jaygmbGFzdF9wdHItPnJlZmlsbF9sb2NrKTsKLQotCQkJCWxhc3RfcHRyX2xvb3AgPSAxOwotCQkJCXNlYXJjaF9zdGFydCA9IGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQ7Ci0JCQkJLyoKLQkJCQkgKiB3ZSBrbm93IHRoaXMgYmxvY2sgZ3JvdXAgaXMgcHJvcGVybHkKLQkJCQkgKiBpbiB0aGUgbGlzdCBiZWNhdXNlCi0JCQkJICogYnRyZnNfcmVtb3ZlX2Jsb2NrX2dyb3VwLCBkcm9wcyB0aGUKLQkJCQkgKiBjbHVzdGVyIGJlZm9yZSBpdCByZW1vdmVzIHRoZSBibG9jawotCQkJCSAqIGdyb3VwIGZyb20gdGhlIGxpc3QKLQkJCQkgKi8KLQkJCQlnb3RvIGhhdmVfYmxvY2tfZ3JvdXA7CisJCQlXQVJOX09OKGxhc3RfcHRyLT5ibG9ja19ncm91cCAhPSB1c2VkX2Jsb2NrX2dyb3VwKTsKKwkJCWlmICh1c2VkX2Jsb2NrX2dyb3VwICE9IGJsb2NrX2dyb3VwKSB7CisJCQkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKHVzZWRfYmxvY2tfZ3JvdXApOworCQkJCXVzZWRfYmxvY2tfZ3JvdXAgPSBibG9ja19ncm91cDsKIAkJCX0KLQkJCXNwaW5fdW5sb2NrKCZsYXN0X3B0ci0+bG9jayk7CiByZWZpbGxfY2x1c3RlcjoKKwkJCUJVR19PTih1c2VkX2Jsb2NrX2dyb3VwICE9IGJsb2NrX2dyb3VwKTsKKwkJCS8qIElmIHdlIGFyZSBvbiBMT09QX05PX0VNUFRZX1NJWkUsIHdlIGNhbid0CisJCQkgKiBzZXQgdXAgYSBuZXcgY2x1c3RlcnMsIHNvIGxldHMganVzdCBza2lwIGl0CisJCQkgKiBhbmQgbGV0IHRoZSBhbGxvY2F0b3IgZmluZCB3aGF0ZXZlciBibG9jaworCQkJICogaXQgY2FuIGZpbmQuICBJZiB3ZSByZWFjaCB0aGlzIHBvaW50LCB3ZQorCQkJICogd2lsbCBoYXZlIHRyaWVkIHRoZSBjbHVzdGVyIGFsbG9jYXRvcgorCQkJICogcGxlbnR5IG9mIHRpbWVzIGFuZCBub3QgaGF2ZSBmb3VuZAorCQkJICogYW55dGhpbmcsIHNvIHdlIGFyZSBsaWtlbHkgd2F5IHRvbworCQkJICogZnJhZ21lbnRlZCBmb3IgdGhlIGNsdXN0ZXJpbmcgc3R1ZmYgdG8gZmluZAorCQkJICogYW55dGhpbmcuICAqLworCQkJaWYgKGxvb3AgPj0gTE9PUF9OT19FTVBUWV9TSVpFKSB7CisJCQkJc3Bpbl91bmxvY2soJmxhc3RfcHRyLT5yZWZpbGxfbG9jayk7CisJCQkJZ290byB1bmNsdXN0ZXJlZF9hbGxvYzsKKwkJCX0KKwogCQkJLyoKIAkJCSAqIHRoaXMgY2x1c3RlciBkaWRuJ3Qgd29yayBvdXQsIGZyZWUgaXQgYW5kCiAJCQkgKiBzdGFydCBvdmVyCiAJCQkgKi8KIAkJCWJ0cmZzX3JldHVybl9jbHVzdGVyX3RvX2ZyZWVfc3BhY2UoTlVMTCwgbGFzdF9wdHIpOwogCi0JCQlsYXN0X3B0cl9sb29wID0gMDsKLQogCQkJLyogYWxsb2NhdGUgYSBjbHVzdGVyIGluIHRoaXMgYmxvY2sgZ3JvdXAgKi8KIAkJCXJldCA9IGJ0cmZzX2ZpbmRfc3BhY2VfY2x1c3Rlcih0cmFucywgcm9vdCwKIAkJCQkJICAgICAgIGJsb2NrX2dyb3VwLCBsYXN0X3B0ciwKQEAgLTUzOTAsNiArNTQwMCw3IEBACiAJCQlnb3RvIGxvb3A7CiAJCX0KIAordW5jbHVzdGVyZWRfYWxsb2M6CiAJCW9mZnNldCA9IGJ0cmZzX2ZpbmRfc3BhY2VfZm9yX2FsbG9jKGJsb2NrX2dyb3VwLCBzZWFyY2hfc3RhcnQsCiAJCQkJCQkgICAgbnVtX2J5dGVzLCBlbXB0eV9zaXplKTsKIAkJLyoKQEAgLTU0MTYsMTQgKzU0MjcsMTQgQEAKIAkJc2VhcmNoX3N0YXJ0ID0gc3RyaXBlX2FsaWduKHJvb3QsIG9mZnNldCk7CiAJCS8qIG1vdmUgb24gdG8gdGhlIG5leHQgZ3JvdXAgKi8KIAkJaWYgKHNlYXJjaF9zdGFydCArIG51bV9ieXRlcyA+PSBzZWFyY2hfZW5kKSB7Ci0JCQlidHJmc19hZGRfZnJlZV9zcGFjZShibG9ja19ncm91cCwgb2Zmc2V0LCBudW1fYnl0ZXMpOworCQkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UodXNlZF9ibG9ja19ncm91cCwgb2Zmc2V0LCBudW1fYnl0ZXMpOwogCQkJZ290byBsb29wOwogCQl9CiAKIAkJLyogbW92ZSBvbiB0byB0aGUgbmV4dCBncm91cCAqLwogCQlpZiAoc2VhcmNoX3N0YXJ0ICsgbnVtX2J5dGVzID4KLQkJICAgIGJsb2NrX2dyb3VwLT5rZXkub2JqZWN0aWQgKyBibG9ja19ncm91cC0+a2V5Lm9mZnNldCkgewotCQkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UoYmxvY2tfZ3JvdXAsIG9mZnNldCwgbnVtX2J5dGVzKTsKKwkJICAgIHVzZWRfYmxvY2tfZ3JvdXAtPmtleS5vYmplY3RpZCArIHVzZWRfYmxvY2tfZ3JvdXAtPmtleS5vZmZzZXQpIHsKKwkJCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKHVzZWRfYmxvY2tfZ3JvdXAsIG9mZnNldCwgbnVtX2J5dGVzKTsKIAkJCWdvdG8gbG9vcDsKIAkJfQogCkBAIC01NDMxLDE0ICs1NDQyLDE0IEBACiAJCWlucy0+b2Zmc2V0ID0gbnVtX2J5dGVzOwogCiAJCWlmIChvZmZzZXQgPCBzZWFyY2hfc3RhcnQpCi0JCQlidHJmc19hZGRfZnJlZV9zcGFjZShibG9ja19ncm91cCwgb2Zmc2V0LAorCQkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UodXNlZF9ibG9ja19ncm91cCwgb2Zmc2V0LAogCQkJCQkgICAgIHNlYXJjaF9zdGFydCAtIG9mZnNldCk7CiAJCUJVR19PTihvZmZzZXQgPiBzZWFyY2hfc3RhcnQpOwogCi0JCXJldCA9IGJ0cmZzX3VwZGF0ZV9yZXNlcnZlZF9ieXRlcyhibG9ja19ncm91cCwgbnVtX2J5dGVzLAorCQlyZXQgPSBidHJmc191cGRhdGVfcmVzZXJ2ZWRfYnl0ZXModXNlZF9ibG9ja19ncm91cCwgbnVtX2J5dGVzLAogCQkJCQkJICBhbGxvY190eXBlKTsKIAkJaWYgKHJldCA9PSAtRUFHQUlOKSB7Ci0JCQlidHJmc19hZGRfZnJlZV9zcGFjZShibG9ja19ncm91cCwgb2Zmc2V0LCBudW1fYnl0ZXMpOworCQkJYnRyZnNfYWRkX2ZyZWVfc3BhY2UodXNlZF9ibG9ja19ncm91cCwgb2Zmc2V0LCBudW1fYnl0ZXMpOwogCQkJZ290byBsb29wOwogCQl9CiAKQEAgLTU0NDcsMTUgKzU0NTgsMTkgQEAKIAkJaW5zLT5vZmZzZXQgPSBudW1fYnl0ZXM7CiAKIAkJaWYgKG9mZnNldCA8IHNlYXJjaF9zdGFydCkKLQkJCWJ0cmZzX2FkZF9mcmVlX3NwYWNlKGJsb2NrX2dyb3VwLCBvZmZzZXQsCisJCQlidHJmc19hZGRfZnJlZV9zcGFjZSh1c2VkX2Jsb2NrX2dyb3VwLCBvZmZzZXQsCiAJCQkJCSAgICAgc2VhcmNoX3N0YXJ0IC0gb2Zmc2V0KTsKIAkJQlVHX09OKG9mZnNldCA+IHNlYXJjaF9zdGFydCk7CisJCWlmICh1c2VkX2Jsb2NrX2dyb3VwICE9IGJsb2NrX2dyb3VwKQorCQkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKHVzZWRfYmxvY2tfZ3JvdXApOwogCQlidHJmc19wdXRfYmxvY2tfZ3JvdXAoYmxvY2tfZ3JvdXApOwogCQlicmVhazsKIGxvb3A6CiAJCWZhaWxlZF9jbHVzdGVyX3JlZmlsbCA9IGZhbHNlOwogCQlmYWlsZWRfYWxsb2MgPSBmYWxzZTsKIAkJQlVHX09OKGluZGV4ICE9IGdldF9ibG9ja19ncm91cF9pbmRleChibG9ja19ncm91cCkpOworCQlpZiAodXNlZF9ibG9ja19ncm91cCAhPSBibG9ja19ncm91cCkKKwkJCWJ0cmZzX3B1dF9ibG9ja19ncm91cCh1c2VkX2Jsb2NrX2dyb3VwKTsKIAkJYnRyZnNfcHV0X2Jsb2NrX2dyb3VwKGJsb2NrX2dyb3VwKTsKIAl9CiAJdXBfcmVhZCgmc3BhY2VfaW5mby0+Z3JvdXBzX3NlbSk7CmRpZmYgLS1naXQgYS9mcy9idHJmcy9leHRlbnRfaW8uYyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCmluZGV4IGJlMWJmNjIuLjQ5ZjNjOWQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2V4dGVudF9pby5jCisrKyBiL2ZzL2J0cmZzL2V4dGVudF9pby5jCkBAIC05MzUsOCArOTM1LDEwIEBACiAJbm9kZSA9IHRyZWVfc2VhcmNoKHRyZWUsIHN0YXJ0KTsKIAlpZiAoIW5vZGUpIHsKIAkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGVfYXRvbWljKHByZWFsbG9jKTsKLQkJaWYgKCFwcmVhbGxvYykKLQkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoIXByZWFsbG9jKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KIAkJZXJyID0gaW5zZXJ0X3N0YXRlKHRyZWUsIHByZWFsbG9jLCBzdGFydCwgZW5kLCAmYml0cyk7CiAJCXByZWFsbG9jID0gTlVMTDsKIAkJQlVHX09OKGVyciA9PSAtRUVYSVNUKTsKQEAgLTk5Miw4ICs5OTQsMTAgQEAKIAkgKi8KIAlpZiAoc3RhdGUtPnN0YXJ0IDwgc3RhcnQpIHsKIAkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGVfYXRvbWljKHByZWFsbG9jKTsKLQkJaWYgKCFwcmVhbGxvYykKLQkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoIXByZWFsbG9jKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KIAkJZXJyID0gc3BsaXRfc3RhdGUodHJlZSwgc3RhdGUsIHByZWFsbG9jLCBzdGFydCk7CiAJCUJVR19PTihlcnIgPT0gLUVFWElTVCk7CiAJCXByZWFsbG9jID0gTlVMTDsKQEAgLTEwMjQsOCArMTAyOCwxMCBAQAogCQkJdGhpc19lbmQgPSBsYXN0X3N0YXJ0IC0gMTsKIAogCQlwcmVhbGxvYyA9IGFsbG9jX2V4dGVudF9zdGF0ZV9hdG9taWMocHJlYWxsb2MpOwotCQlpZiAoIXByZWFsbG9jKQotCQkJcmV0dXJuIC1FTk9NRU07CisJCWlmICghcHJlYWxsb2MpIHsKKwkJCWVyciA9IC1FTk9NRU07CisJCQlnb3RvIG91dDsKKwkJfQogCiAJCS8qCiAJCSAqIEF2b2lkIHRvIGZyZWUgJ3ByZWFsbG9jJyBpZiBpdCBjYW4gYmUgbWVyZ2VkIHdpdGgKQEAgLTEwNTEsOCArMTA1NywxMCBAQAogCSAqLwogCWlmIChzdGF0ZS0+c3RhcnQgPD0gZW5kICYmIHN0YXRlLT5lbmQgPiBlbmQpIHsKIAkJcHJlYWxsb2MgPSBhbGxvY19leHRlbnRfc3RhdGVfYXRvbWljKHByZWFsbG9jKTsKLQkJaWYgKCFwcmVhbGxvYykKLQkJCXJldHVybiAtRU5PTUVNOworCQlpZiAoIXByZWFsbG9jKSB7CisJCQllcnIgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KIAogCQllcnIgPSBzcGxpdF9zdGF0ZSh0cmVlLCBzdGF0ZSwgcHJlYWxsb2MsIGVuZCArIDEpOwogCQlCVUdfT04oZXJyID09IC1FRVhJU1QpOwpkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvZmlsZS5jIGIvZnMvYnRyZnMvZmlsZS5jCmluZGV4IGRhZmRmYTAuLjk3ZmJlOTMgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2ZpbGUuYworKysgYi9mcy9idHJmcy9maWxlLmMKQEAgLTExNjcsNiArMTE2Nyw4IEBACiAJbnJwdHJzID0gbWluKChpb3ZfaXRlcl9jb3VudChpKSArIFBBR0VfQ0FDSEVfU0laRSAtIDEpIC8KIAkJICAgICBQQUdFX0NBQ0hFX1NJWkUsIFBBR0VfQ0FDSEVfU0laRSAvCiAJCSAgICAgKHNpemVvZihzdHJ1Y3QgcGFnZSAqKSkpOworCW5ycHRycyA9IG1pbihucnB0cnMsIGN1cnJlbnQtPm5yX2RpcnRpZWRfcGF1c2UgLSBjdXJyZW50LT5ucl9kaXJ0aWVkKTsKKwlucnB0cnMgPSBtYXgobnJwdHJzLCA4KTsKIAlwYWdlcyA9IGttYWxsb2MobnJwdHJzICogc2l6ZW9mKHN0cnVjdCBwYWdlICopLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBhZ2VzKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTEzODcsNyArMTM4OSwxMSBAQAogCQlnb3RvIG91dDsKIAl9CiAKLQlmaWxlX3VwZGF0ZV90aW1lKGZpbGUpOworCWVyciA9IGJ0cmZzX3VwZGF0ZV90aW1lKGZpbGUpOworCWlmIChlcnIpIHsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CisJCWdvdG8gb3V0OworCX0KIAlCVFJGU19JKGlub2RlKS0+c2VxdWVuY2UrKzsKIAogCXN0YXJ0X3BvcyA9IHJvdW5kX2Rvd24ocG9zLCByb290LT5zZWN0b3JzaXplKTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2lub2RlLmMgYi9mcy9idHJmcy9pbm9kZS5jCmluZGV4IDJjOTg0ZjcuLmZkMWEwNmQgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL2lub2RlLmMKKysrIGIvZnMvYnRyZnMvaW5vZGUuYwpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZhbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb3VudC5oPgogI2luY2x1ZGUgImNvbXBhdC5oIgogI2luY2x1ZGUgImN0cmVlLmgiCiAjaW5jbHVkZSAiZGlzay1pby5oIgpAQCAtMjAzMSw3ICsyMDMyLDcgQEAKIAkvKiBpbnNlcnQgYW4gb3JwaGFuIGl0ZW0gdG8gdHJhY2sgdGhpcyB1bmxpbmtlZC90cnVuY2F0ZWQgZmlsZSAqLwogCWlmIChpbnNlcnQgPj0gMSkgewogCQlyZXQgPSBidHJmc19pbnNlcnRfb3JwaGFuX2l0ZW0odHJhbnMsIHJvb3QsIGJ0cmZzX2lubyhpbm9kZSkpOwotCQlCVUdfT04ocmV0KTsKKwkJQlVHX09OKHJldCAmJiByZXQgIT0gLUVFWElTVCk7CiAJfQogCiAJLyogaW5zZXJ0IGFuIG9ycGhhbiBpdGVtIHRvIHRyYWNrIHN1YnZvbHVtZSBjb250YWlucyBvcnBoYW4gZmlsZXMgKi8KQEAgLTIxNTgsNiArMjE1OSwzOCBAQAogCQlpZiAocmV0ICYmIHJldCAhPSAtRVNUQUxFKQogCQkJZ290byBvdXQ7CiAKKwkJaWYgKHJldCA9PSAtRVNUQUxFICYmIHJvb3QgPT0gcm9vdC0+ZnNfaW5mby0+dHJlZV9yb290KSB7CisJCQlzdHJ1Y3QgYnRyZnNfcm9vdCAqZGVhZF9yb290OworCQkJc3RydWN0IGJ0cmZzX2ZzX2luZm8gKmZzX2luZm8gPSByb290LT5mc19pbmZvOworCQkJaW50IGlzX2RlYWRfcm9vdCA9IDA7CisKKwkJCS8qCisJCQkgKiB0aGlzIGlzIGFuIG9ycGhhbiBpbiB0aGUgdHJlZSByb290LiBDdXJyZW50bHkgdGhlc2UKKwkJCSAqIGNvdWxkIGNvbWUgZnJvbSAyIHNvdXJjZXM6CisJCQkgKiAgYSkgYSBzbmFwc2hvdCBkZWxldGlvbiBpbiBwcm9ncmVzcworCQkJICogIGIpIGEgZnJlZSBzcGFjZSBjYWNoZSBpbm9kZQorCQkJICogV2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aG9zZSB0d28sIGFzIHRoZSBzbmFwc2hvdAorCQkJICogb3JwaGFuIG11c3Qgbm90IGdldCBkZWxldGVkLgorCQkJICogZmluZF9kZWFkX3Jvb3RzIGFscmVhZHkgcmFuIGJlZm9yZSB1cywgc28gaWYgdGhpcworCQkJICogaXMgYSBzbmFwc2hvdCBkZWxldGlvbiwgd2Ugc2hvdWxkIGZpbmQgdGhlIHJvb3QKKwkJCSAqIGluIHRoZSBkZWFkX3Jvb3RzIGxpc3QKKwkJCSAqLworCQkJc3Bpbl9sb2NrKCZmc19pbmZvLT50cmFuc19sb2NrKTsKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoZGVhZF9yb290LCAmZnNfaW5mby0+ZGVhZF9yb290cywKKwkJCQkJICAgIHJvb3RfbGlzdCkgeworCQkJCWlmIChkZWFkX3Jvb3QtPnJvb3Rfa2V5Lm9iamVjdGlkID09CisJCQkJICAgIGZvdW5kX2tleS5vYmplY3RpZCkgeworCQkJCQlpc19kZWFkX3Jvb3QgPSAxOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlzcGluX3VubG9jaygmZnNfaW5mby0+dHJhbnNfbG9jayk7CisJCQlpZiAoaXNfZGVhZF9yb290KSB7CisJCQkJLyogcHJldmVudCB0aGlzIG9ycGhhbiBmcm9tIGJlaW5nIGZvdW5kIGFnYWluICovCisJCQkJa2V5Lm9mZnNldCA9IGZvdW5kX2tleS5vYmplY3RpZCAtIDE7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KIAkJLyoKIAkJICogSW5vZGUgaXMgYWxyZWFkeSBnb25lIGJ1dCB0aGUgb3JwaGFuIGl0ZW0gaXMgc3RpbGwgdGhlcmUsCiAJCSAqIGtpbGwgdGhlIG9ycGhhbiBpdGVtLgpAQCAtMjE5MSw3ICsyMjI0LDE0IEBACiAJCQkJY29udGludWU7CiAJCQl9CiAJCQlucl90cnVuY2F0ZSsrOworCQkJLyoKKwkJCSAqIE5lZWQgdG8gaG9sZCB0aGUgaW11dGV4IGZvciByZXNlcnZhdGlvbiBwdXJwb3Nlcywgbm90CisJCQkgKiBhIGh1Z2UgZGVhbCBoZXJlIGJ1dCBJIGhhdmUgYSBXQVJOX09OIGluCisJCQkgKiBidHJmc19kZWxhbGxvY19yZXNlcnZlX3NwYWNlIHRvIGNhdGNoIG9mZmVuZGVycy4KKwkJCSAqLworCQkJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCQkJcmV0ID0gYnRyZnNfdHJ1bmNhdGUoaW5vZGUpOworCQkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCX0gZWxzZSB7CiAJCQlucl91bmxpbmsrKzsKIAkJfQpAQCAtMzMyNyw3ICszMzY3LDcgQEAKIAkJCXU2NCBoaW50X2J5dGUgPSAwOwogCQkJaG9sZV9zaXplID0gbGFzdF9ieXRlIC0gY3VyX29mZnNldDsKIAotCQkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAyKTsKKwkJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMyk7CiAJCQlpZiAoSVNfRVJSKHRyYW5zKSkgewogCQkJCWVyciA9IFBUUl9FUlIodHJhbnMpOwogCQkJCWJyZWFrOwpAQCAtMzMzNyw2ICszMzc3LDcgQEAKIAkJCQkJCSBjdXJfb2Zmc2V0ICsgaG9sZV9zaXplLAogCQkJCQkJICZoaW50X2J5dGUsIDEpOwogCQkJaWYgKGVycikgeworCQkJCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwogCQkJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0zMzQ2LDYgKzMzODcsNyBAQAogCQkJCQkwLCBob2xlX3NpemUsIDAsIGhvbGVfc2l6ZSwKIAkJCQkJMCwgMCwgMCk7CiAJCQlpZiAoZXJyKSB7CisJCQkJYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CiAJCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTMzNTMsNiArMzM5NSw3IEBACiAJCQlidHJmc19kcm9wX2V4dGVudF9jYWNoZShpbm9kZSwgaG9sZV9zdGFydCwKIAkJCQkJbGFzdF9ieXRlIC0gMSwgMCk7CiAKKwkJCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwogCQkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAkJfQogCQlmcmVlX2V4dGVudF9tYXAoZW0pOwpAQCAtMzM3MCw2ICszNDEzLDggQEAKIAogc3RhdGljIGludCBidHJmc19zZXRzaXplKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGxvZmZfdCBuZXdzaXplKQogeworCXN0cnVjdCBidHJmc19yb290ICpyb290ID0gQlRSRlNfSShpbm9kZSktPnJvb3Q7CisJc3RydWN0IGJ0cmZzX3RyYW5zX2hhbmRsZSAqdHJhbnM7CiAJbG9mZl90IG9sZHNpemUgPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJaW50IHJldDsKIApAQCAtMzM3NywxNiArMzQyMiwxOSBAQAogCQlyZXR1cm4gMDsKIAogCWlmIChuZXdzaXplID4gb2xkc2l6ZSkgewotCQlpX3NpemVfd3JpdGUoaW5vZGUsIG5ld3NpemUpOwotCQlidHJmc19vcmRlcmVkX3VwZGF0ZV9pX3NpemUoaW5vZGUsIGlfc2l6ZV9yZWFkKGlub2RlKSwgTlVMTCk7CiAJCXRydW5jYXRlX3BhZ2VjYWNoZShpbm9kZSwgb2xkc2l6ZSwgbmV3c2l6ZSk7CiAJCXJldCA9IGJ0cmZzX2NvbnRfZXhwYW5kKGlub2RlLCBvbGRzaXplLCBuZXdzaXplKTsKLQkJaWYgKHJldCkgewotCQkJYnRyZnNfc2V0c2l6ZShpbm9kZSwgb2xkc2l6ZSk7CisJCWlmIChyZXQpCiAJCQlyZXR1cm4gcmV0OwotCQl9CiAKLQkJbWFya19pbm9kZV9kaXJ0eShpbm9kZSk7CisJCXRyYW5zID0gYnRyZnNfc3RhcnRfdHJhbnNhY3Rpb24ocm9vdCwgMSk7CisJCWlmIChJU19FUlIodHJhbnMpKQorCQkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOworCisJCWlfc2l6ZV93cml0ZShpbm9kZSwgbmV3c2l6ZSk7CisJCWJ0cmZzX29yZGVyZWRfdXBkYXRlX2lfc2l6ZShpbm9kZSwgaV9zaXplX3JlYWQoaW5vZGUpLCBOVUxMKTsKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CisJCWJ0cmZzX2VuZF90cmFuc2FjdGlvbl90aHJvdHRsZSh0cmFucywgcm9vdCk7CiAJfSBlbHNlIHsKIAogCQkvKgpAQCAtMzQyNiw5ICszNDc0LDkgQEAKIAogCWlmIChhdHRyLT5pYV92YWxpZCkgewogCQlzZXRhdHRyX2NvcHkoaW5vZGUsIGF0dHIpOwotCQltYXJrX2lub2RlX2RpcnR5KGlub2RlKTsKKwkJZXJyID0gYnRyZnNfZGlydHlfaW5vZGUoaW5vZGUpOwogCi0JCWlmIChhdHRyLT5pYV92YWxpZCAmIEFUVFJfTU9ERSkKKwkJaWYgKCFlcnIgJiYgYXR0ci0+aWFfdmFsaWQgJiBBVFRSX01PREUpCiAJCQllcnIgPSBidHJmc19hY2xfY2htb2QoaW5vZGUpOwogCX0KIApAQCAtNDIwNCw0MiArNDI1Miw4MCBAQAogICogRklYTUUsIG5lZWRzIG1vcmUgYmVuY2htYXJraW5nLi4udGhlcmUgYXJlIG5vIHJlYXNvbnMgb3RoZXIgdGhhbiBwZXJmb3JtYW5jZQogICogdG8ga2VlcCBvciBkcm9wIHRoaXMgY29kZS4KICAqLwotdm9pZCBidHJmc19kaXJ0eV9pbm9kZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBpbnQgZmxhZ3MpCitpbnQgYnRyZnNfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKIAlzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCA9IEJUUkZTX0koaW5vZGUpLT5yb290OwogCXN0cnVjdCBidHJmc190cmFuc19oYW5kbGUgKnRyYW5zOwogCWludCByZXQ7CiAKIAlpZiAoQlRSRlNfSShpbm9kZSktPmR1bW15X2lub2RlKQotCQlyZXR1cm47CisJCXJldHVybiAwOwogCiAJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwotCUJVR19PTihJU19FUlIodHJhbnMpKTsKKwlpZiAoSVNfRVJSKHRyYW5zKSkKKwkJcmV0dXJuIFBUUl9FUlIodHJhbnMpOwogCiAJcmV0ID0gYnRyZnNfdXBkYXRlX2lub2RlKHRyYW5zLCByb290LCBpbm9kZSk7CiAJaWYgKHJldCAmJiByZXQgPT0gLUVOT1NQQykgewogCQkvKiB3aG9vcHMsIGxldHMgdHJ5IGFnYWluIHdpdGggdGhlIGZ1bGwgdHJhbnNhY3Rpb24gKi8KIAkJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKLQkJaWYgKElTX0VSUih0cmFucykpIHsKLQkJCXByaW50a19yYXRlbGltaXRlZChLRVJOX0VSUiAiYnRyZnM6IGZhaWwgdG8gIgotCQkJCSAgICAgICAiZGlydHkgIGlub2RlICVsbHUgZXJyb3IgJWxkXG4iLAotCQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJ0cmZzX2lubyhpbm9kZSksCi0JCQkJICAgICAgIFBUUl9FUlIodHJhbnMpKTsKLQkJCXJldHVybjsKLQkJfQorCQlpZiAoSVNfRVJSKHRyYW5zKSkKKwkJCXJldHVybiBQVFJfRVJSKHRyYW5zKTsKIAogCQlyZXQgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKLQkJaWYgKHJldCkgewotCQkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJidHJmczogZmFpbCB0byAiCi0JCQkJICAgICAgICJkaXJ0eSAgaW5vZGUgJWxsdSBlcnJvciAlZFxuIiwKLQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylidHJmc19pbm8oaW5vZGUpLAotCQkJCSAgICAgICByZXQpOwotCQl9CiAJfQogCWJ0cmZzX2VuZF90cmFuc2FjdGlvbih0cmFucywgcm9vdCk7CiAJaWYgKEJUUkZTX0koaW5vZGUpLT5kZWxheWVkX25vZGUpCiAJCWJ0cmZzX2JhbGFuY2VfZGVsYXllZF9pdGVtcyhyb290KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBUaGlzIGlzIGEgY29weSBvZiBmaWxlX3VwZGF0ZV90aW1lLiAgV2UgbmVlZCB0aGlzIHNvIHdlIGNhbiByZXR1cm4gZXJyb3Igb24KKyAqIEVOT1NQQyBmb3IgdXBkYXRpbmcgdGhlIGlub2RlIGluIHRoZSBjYXNlIG9mIGZpbGUgd3JpdGUgYW5kIG1tYXAgd3JpdGVzLgorICovCitpbnQgYnRyZnNfdXBkYXRlX3RpbWUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbGUtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHRpbWVzcGVjIG5vdzsKKwlpbnQgcmV0OworCWVudW0geyBTX01USU1FID0gMSwgU19DVElNRSA9IDIsIFNfVkVSU0lPTiA9IDQgfSBzeW5jX2l0ID0gMDsKKworCS8qIEZpcnN0IHRyeSB0byBleGhhdXN0IGFsbCBhdmVudWVzIHRvIG5vdCBzeW5jICovCisJaWYgKElTX05PQ01USU1FKGlub2RlKSkKKwkJcmV0dXJuIDA7CisKKwlub3cgPSBjdXJyZW50X2ZzX3RpbWUoaW5vZGUtPmlfc2IpOworCWlmICghdGltZXNwZWNfZXF1YWwoJmlub2RlLT5pX210aW1lLCAmbm93KSkKKwkJc3luY19pdCA9IFNfTVRJTUU7CisKKwlpZiAoIXRpbWVzcGVjX2VxdWFsKCZpbm9kZS0+aV9jdGltZSwgJm5vdykpCisJCXN5bmNfaXQgfD0gU19DVElNRTsKKworCWlmIChJU19JX1ZFUlNJT04oaW5vZGUpKQorCQlzeW5jX2l0IHw9IFNfVkVSU0lPTjsKKworCWlmICghc3luY19pdCkKKwkJcmV0dXJuIDA7CisKKwkvKiBGaW5hbGx5IGFsbG93ZWQgdG8gd3JpdGU/IFRha2VzIGxvY2suICovCisJaWYgKG1udF93YW50X3dyaXRlX2ZpbGUoZmlsZSkpCisJCXJldHVybiAwOworCisJLyogT25seSBjaGFuZ2UgaW5vZGUgaW5zaWRlIHRoZSBsb2NrIHJlZ2lvbiAqLworCWlmIChzeW5jX2l0ICYgU19WRVJTSU9OKQorCQlpbm9kZV9pbmNfaXZlcnNpb24oaW5vZGUpOworCWlmIChzeW5jX2l0ICYgU19DVElNRSkKKwkJaW5vZGUtPmlfY3RpbWUgPSBub3c7CisJaWYgKHN5bmNfaXQgJiBTX01USU1FKQorCQlpbm9kZS0+aV9tdGltZSA9IG5vdzsKKwlyZXQgPSBidHJmc19kaXJ0eV9pbm9kZShpbm9kZSk7CisJaWYgKCFyZXQpCisJCW1hcmtfaW5vZGVfZGlydHlfc3luYyhpbm9kZSk7CisJbW50X2Ryb3Bfd3JpdGUoZmlsZS0+Zl9wYXRoLm1udCk7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTQ1MDQsMTAgKzQ1OTAsNiBAQAogCWludCBlcnIgPSBidHJmc19hZGRfbGluayh0cmFucywgZGlyLCBpbm9kZSwKIAkJCQkgZGVudHJ5LT5kX25hbWUubmFtZSwgZGVudHJ5LT5kX25hbWUubGVuLAogCQkJCSBiYWNrcmVmLCBpbmRleCk7Ci0JaWYgKCFlcnIpIHsKLQkJZF9pbnN0YW50aWF0ZShkZW50cnksIGlub2RlKTsKLQkJcmV0dXJuIDA7Ci0JfQogCWlmIChlcnIgPiAwKQogCQllcnIgPSAtRUVYSVNUOwogCXJldHVybiBlcnI7CkBAIC00NTU1LDEzICs0NjM3LDIxIEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKKwkvKgorCSogSWYgdGhlIGFjdGl2ZSBMU00gd2FudHMgdG8gYWNjZXNzIHRoZSBpbm9kZSBkdXJpbmcKKwkqIGRfaW5zdGFudGlhdGUgaXQgbmVlZHMgdGhlc2UuIFNtYWNrIGNoZWNrcyB0byBzZWUKKwkqIGlmIHRoZSBmaWxlc3lzdGVtIHN1cHBvcnRzIHhhdHRycyBieSBsb29raW5nIGF0IHRoZQorCSogb3BzIHZlY3Rvci4KKwkqLworCisJaW5vZGUtPmlfb3AgPSAmYnRyZnNfc3BlY2lhbF9pbm9kZV9vcGVyYXRpb25zOwogCWVyciA9IGJ0cmZzX2FkZF9ub25kaXIodHJhbnMsIGRpciwgZGVudHJ5LCBpbm9kZSwgMCwgaW5kZXgpOwogCWlmIChlcnIpCiAJCWRyb3BfaW5vZGUgPSAxOwogCWVsc2UgewotCQlpbm9kZS0+aV9vcCA9ICZidHJmc19zcGVjaWFsX2lub2RlX29wZXJhdGlvbnM7CiAJCWluaXRfc3BlY2lhbF9pbm9kZShpbm9kZSwgaW5vZGUtPmlfbW9kZSwgcmRldik7CiAJCWJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCX0KIG91dF91bmxvY2s6CiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CkBAIC00NjEzLDE1ICs0NzAzLDIzIEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAKKwkvKgorCSogSWYgdGhlIGFjdGl2ZSBMU00gd2FudHMgdG8gYWNjZXNzIHRoZSBpbm9kZSBkdXJpbmcKKwkqIGRfaW5zdGFudGlhdGUgaXQgbmVlZHMgdGhlc2UuIFNtYWNrIGNoZWNrcyB0byBzZWUKKwkqIGlmIHRoZSBmaWxlc3lzdGVtIHN1cHBvcnRzIHhhdHRycyBieSBsb29raW5nIGF0IHRoZQorCSogb3BzIHZlY3Rvci4KKwkqLworCWlub2RlLT5pX2ZvcCA9ICZidHJmc19maWxlX29wZXJhdGlvbnM7CisJaW5vZGUtPmlfb3AgPSAmYnRyZnNfZmlsZV9pbm9kZV9vcGVyYXRpb25zOworCiAJZXJyID0gYnRyZnNfYWRkX25vbmRpcih0cmFucywgZGlyLCBkZW50cnksIGlub2RlLCAwLCBpbmRleCk7CiAJaWYgKGVycikKIAkJZHJvcF9pbm9kZSA9IDE7CiAJZWxzZSB7CiAJCWlub2RlLT5pX21hcHBpbmctPmFfb3BzID0gJmJ0cmZzX2FvcHM7CiAJCWlub2RlLT5pX21hcHBpbmctPmJhY2tpbmdfZGV2X2luZm8gPSAmcm9vdC0+ZnNfaW5mby0+YmRpOwotCQlpbm9kZS0+aV9mb3AgPSAmYnRyZnNfZmlsZV9vcGVyYXRpb25zOwotCQlpbm9kZS0+aV9vcCA9ICZidHJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CiAJCUJUUkZTX0koaW5vZGUpLT5pb190cmVlLm9wcyA9ICZidHJmc19leHRlbnRfaW9fb3BzOworCQlkX2luc3RhbnRpYXRlKGRlbnRyeSwgaW5vZGUpOwogCX0KIG91dF91bmxvY2s6CiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CkBAIC00Njc5LDYgKzQ3NzcsNyBAQAogCQlzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQgPSBkZW50cnktPmRfcGFyZW50OwogCQllcnIgPSBidHJmc191cGRhdGVfaW5vZGUodHJhbnMsIHJvb3QsIGlub2RlKTsKIAkJQlVHX09OKGVycik7CisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJCWJ0cmZzX2xvZ19uZXdfbmFtZSh0cmFucywgaW5vZGUsIE5VTEwsIHBhcmVudCk7CiAJfQogCkBAIC02MzAzLDcgKzY0MDIsMTIgQEAKIAl1NjQgcGFnZV9zdGFydDsKIAl1NjQgcGFnZV9lbmQ7CiAKKwkvKiBOZWVkIHRoaXMgdG8ga2VlcCBzcGFjZSByZXNlcnZhdGlvbnMgc2VyaWFsaXplZCAqLworCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAlyZXQgID0gYnRyZnNfZGVsYWxsb2NfcmVzZXJ2ZV9zcGFjZShpbm9kZSwgUEFHRV9DQUNIRV9TSVpFKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gYnRyZnNfdXBkYXRlX3RpbWUodm1hLT52bV9maWxlKTsKIAlpZiAocmV0KSB7CiAJCWlmIChyZXQgPT0gLUVOT01FTSkKIAkJCXJldCA9IFZNX0ZBVUxUX09PTTsKQEAgLTY1MTUsOCArNjYxOSw5IEBACiAJCQkvKiBKdXN0IG5lZWQgdGhlIDEgZm9yIHVwZGF0aW5nIHRoZSBpbm9kZSAqLwogCQkJdHJhbnMgPSBidHJmc19zdGFydF90cmFuc2FjdGlvbihyb290LCAxKTsKIAkJCWlmIChJU19FUlIodHJhbnMpKSB7Ci0JCQkJZXJyID0gUFRSX0VSUih0cmFucyk7Ci0JCQkJZ290byBvdXQ7CisJCQkJcmV0ID0gZXJyID0gUFRSX0VSUih0cmFucyk7CisJCQkJdHJhbnMgPSBOVUxMOworCQkJCWJyZWFrOwogCQkJfQogCQl9CiAKQEAgLTcwNzYsMTQgKzcxODEsMjEgQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KIAorCS8qCisJKiBJZiB0aGUgYWN0aXZlIExTTSB3YW50cyB0byBhY2Nlc3MgdGhlIGlub2RlIGR1cmluZworCSogZF9pbnN0YW50aWF0ZSBpdCBuZWVkcyB0aGVzZS4gU21hY2sgY2hlY2tzIHRvIHNlZQorCSogaWYgdGhlIGZpbGVzeXN0ZW0gc3VwcG9ydHMgeGF0dHJzIGJ5IGxvb2tpbmcgYXQgdGhlCisJKiBvcHMgdmVjdG9yLgorCSovCisJaW5vZGUtPmlfZm9wID0gJmJ0cmZzX2ZpbGVfb3BlcmF0aW9uczsKKwlpbm9kZS0+aV9vcCA9ICZidHJmc19maWxlX2lub2RlX29wZXJhdGlvbnM7CisKIAllcnIgPSBidHJmc19hZGRfbm9uZGlyKHRyYW5zLCBkaXIsIGRlbnRyeSwgaW5vZGUsIDAsIGluZGV4KTsKIAlpZiAoZXJyKQogCQlkcm9wX2lub2RlID0gMTsKIAllbHNlIHsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YV9vcHMgPSAmYnRyZnNfYW9wczsKIAkJaW5vZGUtPmlfbWFwcGluZy0+YmFja2luZ19kZXZfaW5mbyA9ICZyb290LT5mc19pbmZvLT5iZGk7Ci0JCWlub2RlLT5pX2ZvcCA9ICZidHJmc19maWxlX29wZXJhdGlvbnM7Ci0JCWlub2RlLT5pX29wID0gJmJ0cmZzX2ZpbGVfaW5vZGVfb3BlcmF0aW9uczsKIAkJQlRSRlNfSShpbm9kZSktPmlvX3RyZWUub3BzID0gJmJ0cmZzX2V4dGVudF9pb19vcHM7CiAJfQogCWlmIChkcm9wX2lub2RlKQpAQCAtNzEzMiw2ICs3MjQ0LDggQEAKIAkJZHJvcF9pbm9kZSA9IDE7CiAKIG91dF91bmxvY2s6CisJaWYgKCFlcnIpCisJCWRfaW5zdGFudGlhdGUoZGVudHJ5LCBpbm9kZSk7CiAJbnIgPSB0cmFucy0+YmxvY2tzX3VzZWQ7CiAJYnRyZnNfZW5kX3RyYW5zYWN0aW9uX3Rocm90dGxlKHRyYW5zLCByb290KTsKIAlpZiAoZHJvcF9pbm9kZSkgewpAQCAtNzM1Myw2ICs3NDY3LDcgQEAKIAkuZm9sbG93X2xpbmsJPSBwYWdlX2ZvbGxvd19saW5rX2xpZ2h0LAogCS5wdXRfbGluawk9IHBhZ2VfcHV0X2xpbmssCiAJLmdldGF0dHIJPSBidHJmc19nZXRhdHRyLAorCS5zZXRhdHRyCT0gYnRyZnNfc2V0YXR0ciwKIAkucGVybWlzc2lvbgk9IGJ0cmZzX3Blcm1pc3Npb24sCiAJLnNldHhhdHRyCT0gYnRyZnNfc2V0eGF0dHIsCiAJLmdldHhhdHRyCT0gYnRyZnNfZ2V0eGF0dHIsCmRpZmYgLS1naXQgYS9mcy9idHJmcy9pb2N0bC5jIGIvZnMvYnRyZnMvaW9jdGwuYwppbmRleCA3MmQ0NjE2Li5jMDRmMDJjIDEwMDY0NAotLS0gYS9mcy9idHJmcy9pb2N0bC5jCisrKyBiL2ZzL2J0cmZzL2lvY3RsLmMKQEAgLTI1MiwxMSArMjUyLDExIEBACiAJdHJhbnMgPSBidHJmc19qb2luX3RyYW5zYWN0aW9uKHJvb3QpOwogCUJVR19PTihJU19FUlIodHJhbnMpKTsKIAorCWJ0cmZzX3VwZGF0ZV9pZmxhZ3MoaW5vZGUpOworCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwogCXJldCA9IGJ0cmZzX3VwZGF0ZV9pbm9kZSh0cmFucywgcm9vdCwgaW5vZGUpOwogCUJVR19PTihyZXQpOwogCi0JYnRyZnNfdXBkYXRlX2lmbGFncyhpbm9kZSk7Ci0JaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAJYnRyZnNfZW5kX3RyYW5zYWN0aW9uKHRyYW5zLCByb290KTsKIAogCW1udF9kcm9wX3dyaXRlKGZpbGUtPmZfcGF0aC5tbnQpOwpAQCAtODU4LDggKzg1OCwxMCBAQAogCQlyZXR1cm4gMDsKIAlmaWxlX2VuZCA9IChpc2l6ZSAtIDEpID4+IFBBR0VfQ0FDSEVfU0hJRlQ7CiAKKwltdXRleF9sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJcmV0ID0gYnRyZnNfZGVsYWxsb2NfcmVzZXJ2ZV9zcGFjZShpbm9kZSwKIAkJCQkJICAgbnVtX3BhZ2VzIDw8IFBBR0VfQ0FDSEVfU0hJRlQpOworCW11dGV4X3VubG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiBhZ2FpbjoKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3JlbG9jYXRpb24uYyBiL2ZzL2J0cmZzL3JlbG9jYXRpb24uYwppbmRleCBkZmYyOWQ1Li5jZmI1NTQzIDEwMDY0NAotLS0gYS9mcy9idHJmcy9yZWxvY2F0aW9uLmMKKysrIGIvZnMvYnRyZnMvcmVsb2NhdGlvbi5jCkBAIC0yOTQ3LDcgKzI5NDcsOSBAQAogCWluZGV4ID0gKGNsdXN0ZXItPnN0YXJ0IC0gb2Zmc2V0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCWxhc3RfaW5kZXggPSAoY2x1c3Rlci0+ZW5kIC0gb2Zmc2V0KSA+PiBQQUdFX0NBQ0hFX1NISUZUOwogCXdoaWxlIChpbmRleCA8PSBsYXN0X2luZGV4KSB7CisJCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKIAkJcmV0ID0gYnRyZnNfZGVsYWxsb2NfcmVzZXJ2ZV9tZXRhZGF0YShpbm9kZSwgUEFHRV9DQUNIRV9TSVpFKTsKKwkJbXV0ZXhfdW5sb2NrKCZpbm9kZS0+aV9tdXRleCk7CiAJCWlmIChyZXQpCiAJCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvZnMvYnRyZnMvc2NydWIuYyBiL2ZzL2J0cmZzL3NjcnViLmMKaW5kZXggYzI3YmNiNi4uZGRmMmM5MCAxMDA2NDQKLS0tIGEvZnMvYnRyZnMvc2NydWIuYworKysgYi9mcy9idHJmcy9zY3J1Yi5jCkBAIC0xNTM1LDE4ICsxNTM1LDIyIEBACiBzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludCBzY3J1Yl93b3JrZXJzX2dldChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKIHsKIAlzdHJ1Y3QgYnRyZnNfZnNfaW5mbyAqZnNfaW5mbyA9IHJvb3QtPmZzX2luZm87CisJaW50IHJldCA9IDA7CiAKIAltdXRleF9sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKIAlpZiAoZnNfaW5mby0+c2NydWJfd29ya2Vyc19yZWZjbnQgPT0gMCkgewogCQlidHJmc19pbml0X3dvcmtlcnMoJmZzX2luZm8tPnNjcnViX3dvcmtlcnMsICJzY3J1YiIsCiAJCQkgICBmc19pbmZvLT50aHJlYWRfcG9vbF9zaXplLCAmZnNfaW5mby0+Z2VuZXJpY193b3JrZXIpOwogCQlmc19pbmZvLT5zY3J1Yl93b3JrZXJzLmlkbGVfdGhyZXNoID0gNDsKLQkJYnRyZnNfc3RhcnRfd29ya2VycygmZnNfaW5mby0+c2NydWJfd29ya2VycywgMSk7CisJCXJldCA9IGJ0cmZzX3N0YXJ0X3dvcmtlcnMoJmZzX2luZm8tPnNjcnViX3dvcmtlcnMpOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CiAJfQogCSsrZnNfaW5mby0+c2NydWJfd29ya2Vyc19yZWZjbnQ7CitvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZmc19pbmZvLT5zY3J1Yl9sb2NrKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgdm9pZCBzY3J1Yl93b3JrZXJzX3B1dChzdHJ1Y3QgYnRyZnNfcm9vdCAqcm9vdCkKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3N1cGVyLmMgYi9mcy9idHJmcy9zdXBlci5jCmluZGV4IGUyOGFkNGIuLjIwMGY2M2IgMTAwNjQ0Ci0tLSBhL2ZzL2J0cmZzL3N1cGVyLmMKKysrIGIvZnMvYnRyZnMvc3VwZXIuYwpAQCAtNDEsNiArNDEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9jbGVhbmNhY2hlLmg+CiAjaW5jbHVkZSA8bGludXgvbW50X25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3JhdGVsaW1pdC5oPgogI2luY2x1ZGUgImNvbXBhdC5oIgogI2luY2x1ZGUgImRlbGF5ZWQtaW5vZGUuaCIKICNpbmNsdWRlICJjdHJlZS5oIgpAQCAtMTA1Myw3ICsxMDU0LDcgQEAKIAl1NjQgYXZhaWxfc3BhY2U7CiAJdTY0IHVzZWRfc3BhY2U7CiAJdTY0IG1pbl9zdHJpcGVfc2l6ZTsKLQlpbnQgbWluX3N0cmlwZXMgPSAxOworCWludCBtaW5fc3RyaXBlcyA9IDEsIG51bV9zdHJpcGVzID0gMTsKIAlpbnQgaSA9IDAsIG5yX2RldmljZXM7CiAJaW50IHJldDsKIApAQCAtMTA2NywxMiArMTA2OCwxNiBAQAogCiAJLyogY2FsYyBtaW4gc3RyaXBlIG51bWJlciBmb3IgZGF0YSBzcGFjZSBhbGxvY3Rpb24gKi8KIAl0eXBlID0gYnRyZnNfZ2V0X2FsbG9jX3Byb2ZpbGUocm9vdCwgMSk7Ci0JaWYgKHR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMCkKKwlpZiAodHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQwKSB7CiAJCW1pbl9zdHJpcGVzID0gMjsKLQllbHNlIGlmICh0eXBlICYgQlRSRlNfQkxPQ0tfR1JPVVBfUkFJRDEpCisJCW51bV9zdHJpcGVzID0gbnJfZGV2aWNlczsKKwl9IGVsc2UgaWYgKHR5cGUgJiBCVFJGU19CTE9DS19HUk9VUF9SQUlEMSkgewogCQltaW5fc3RyaXBlcyA9IDI7Ci0JZWxzZSBpZiAodHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxMCkKKwkJbnVtX3N0cmlwZXMgPSAyOworCX0gZWxzZSBpZiAodHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX1JBSUQxMCkgewogCQltaW5fc3RyaXBlcyA9IDQ7CisJCW51bV9zdHJpcGVzID0gNDsKKwl9CiAKIAlpZiAodHlwZSAmIEJUUkZTX0JMT0NLX0dST1VQX0RVUCkKIAkJbWluX3N0cmlwZV9zaXplID0gMiAqIEJUUkZTX1NUUklQRV9MRU47CkBAIC0xMTQxLDEzICsxMTQ2LDE2IEBACiAJaSA9IG5yX2RldmljZXMgLSAxOwogCWF2YWlsX3NwYWNlID0gMDsKIAl3aGlsZSAobnJfZGV2aWNlcyA+PSBtaW5fc3RyaXBlcykgeworCQlpZiAobnVtX3N0cmlwZXMgPiBucl9kZXZpY2VzKQorCQkJbnVtX3N0cmlwZXMgPSBucl9kZXZpY2VzOworCiAJCWlmIChkZXZpY2VzX2luZm9baV0ubWF4X2F2YWlsID49IG1pbl9zdHJpcGVfc2l6ZSkgewogCQkJaW50IGo7CiAJCQl1NjQgYWxsb2Nfc2l6ZTsKIAotCQkJYXZhaWxfc3BhY2UgKz0gZGV2aWNlc19pbmZvW2ldLm1heF9hdmFpbCAqIG1pbl9zdHJpcGVzOworCQkJYXZhaWxfc3BhY2UgKz0gZGV2aWNlc19pbmZvW2ldLm1heF9hdmFpbCAqIG51bV9zdHJpcGVzOwogCQkJYWxsb2Nfc2l6ZSA9IGRldmljZXNfaW5mb1tpXS5tYXhfYXZhaWw7Ci0JCQlmb3IgKGogPSBpICsgMSAtIG1pbl9zdHJpcGVzOyBqIDw9IGk7IGorKykKKwkJCWZvciAoaiA9IGkgKyAxIC0gbnVtX3N0cmlwZXM7IGogPD0gaTsgaisrKQogCQkJCWRldmljZXNfaW5mb1tqXS5tYXhfYXZhaWwgLT0gYWxsb2Nfc2l6ZTsKIAkJfQogCQlpLS07CkBAIC0xMjY0LDYgKzEyNzIsMTYgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgYnRyZnNfZnNfZGlydHlfaW5vZGUoc3RydWN0IGlub2RlICppbm9kZSwgaW50IGZsYWdzKQoreworCWludCByZXQ7CisKKwlyZXQgPSBidHJmc19kaXJ0eV9pbm9kZShpbm9kZSk7CisJaWYgKHJldCkKKwkJcHJpbnRrX3JhdGVsaW1pdGVkKEtFUk5fRVJSICJidHJmczogZmFpbCB0byBkaXJ0eSBpbm9kZSAlTHUgIgorCQkJCSAgICJlcnJvciAlZFxuIiwgYnRyZnNfaW5vKGlub2RlKSwgcmV0KTsKK30KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBzdXBlcl9vcGVyYXRpb25zIGJ0cmZzX3N1cGVyX29wcyA9IHsKIAkuZHJvcF9pbm9kZQk9IGJ0cmZzX2Ryb3BfaW5vZGUsCiAJLmV2aWN0X2lub2RlCT0gYnRyZnNfZXZpY3RfaW5vZGUsCkBAIC0xMjcxLDcgKzEyODksNyBAQAogCS5zeW5jX2ZzCT0gYnRyZnNfc3luY19mcywKIAkuc2hvd19vcHRpb25zCT0gYnRyZnNfc2hvd19vcHRpb25zLAogCS53cml0ZV9pbm9kZQk9IGJ0cmZzX3dyaXRlX2lub2RlLAotCS5kaXJ0eV9pbm9kZQk9IGJ0cmZzX2RpcnR5X2lub2RlLAorCS5kaXJ0eV9pbm9kZQk9IGJ0cmZzX2ZzX2RpcnR5X2lub2RlLAogCS5hbGxvY19pbm9kZQk9IGJ0cmZzX2FsbG9jX2lub2RlLAogCS5kZXN0cm95X2lub2RlCT0gYnRyZnNfZGVzdHJveV9pbm9kZSwKIAkuc3RhdGZzCQk9IGJ0cmZzX3N0YXRmcywKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL3ZvbHVtZXMuYyBiL2ZzL2J0cmZzL3ZvbHVtZXMuYwppbmRleCBjMzc0MzNkLi5mNGI4MzlmIDEwMDY0NAotLS0gYS9mcy9idHJmcy92b2x1bWVzLmMKKysrIGIvZnMvYnRyZnMvdm9sdW1lcy5jCkBAIC0yOTUsNiArMjk1LDEyIEBACiAJCQlidHJmc19yZXF1ZXVlX3dvcmsoJmRldmljZS0+d29yayk7CiAJCQlnb3RvIGRvbmU7CiAJCX0KKwkJLyogdW5wbHVnIGV2ZXJ5IDY0IHJlcXVlc3RzIGp1c3QgZm9yIGdvb2QgbWVhc3VyZSAqLworCQlpZiAoYmF0Y2hfcnVuICUgNjQgPT0gMCkgeworCQkJYmxrX2ZpbmlzaF9wbHVnKCZwbHVnKTsKKwkJCWJsa19zdGFydF9wbHVnKCZwbHVnKTsKKwkJCXN5bmNfcGVuZGluZyA9IDA7CisJCX0KIAl9CiAKIAljb25kX3Jlc2NoZWQoKTsKQEAgLTE2MTEsNyArMTYxNyw3IEBACiAJaWYgKChzYi0+c19mbGFncyAmIE1TX1JET05MWSkgJiYgIXJvb3QtPmZzX2luZm8tPmZzX2RldmljZXMtPnNlZWRpbmcpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYmRldiA9IGJsa2Rldl9nZXRfYnlfcGF0aChkZXZpY2VfcGF0aCwgRk1PREVfRVhDTCwKKwliZGV2ID0gYmxrZGV2X2dldF9ieV9wYXRoKGRldmljZV9wYXRoLCBGTU9ERV9XUklURSB8IEZNT0RFX0VYQ0wsCiAJCQkJICByb290LT5mc19pbmZvLT5iZGV2X2hvbGRlcik7CiAJaWYgKElTX0VSUihiZGV2KSkKIAkJcmV0dXJuIFBUUl9FUlIoYmRldik7CkBAIC0zMjU4LDcgKzMyNjQsNyBAQAogCQkgKi8KIAkJaWYgKGF0b21pY19yZWFkKCZiYmlvLT5lcnJvcikgPiBiYmlvLT5tYXhfZXJyb3JzKSB7CiAJCQllcnIgPSAtRUlPOwotCQl9IGVsc2UgaWYgKGVycikgeworCQl9IGVsc2UgewogCQkJLyoKIAkJCSAqIHRoaXMgYmlvIGlzIGFjdHVhbGx5IHVwIHRvIGRhdGUsIHdlIGRpZG4ndAogCQkJICogZ28gb3ZlciB0aGUgbWF4IG51bWJlciBvZiBlcnJvcnMKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvYWRkci5jIGIvZnMvY2VwaC9hZGRyLmMKaW5kZXggNDE0NGNhZi4uMTczYjFkMiAxMDA2NDQKLS0tIGEvZnMvY2VwaC9hZGRyLmMKKysrIGIvZnMvY2VwaC9hZGRyLmMKQEAgLTg3LDcgKzg3LDcgQEAKIAlzbmFwYyA9IGNlcGhfZ2V0X3NuYXBfY29udGV4dChjaS0+aV9zbmFwX3JlYWxtLT5jYWNoZWRfY29udGV4dCk7CiAKIAkvKiBkaXJ0eSB0aGUgaGVhZCAqLwotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWlmIChjaS0+aV9oZWFkX3NuYXBjID09IE5VTEwpCiAJCWNpLT5pX2hlYWRfc25hcGMgPSBjZXBoX2dldF9zbmFwX2NvbnRleHQoc25hcGMpOwogCSsrY2ktPmlfd3JidWZmZXJfcmVmX2hlYWQ7CkBAIC0xMDAsNyArMTAwLDcgQEAKIAkgICAgIGNpLT5pX3dyYnVmZmVyX3JlZi0xLCBjaS0+aV93cmJ1ZmZlcl9yZWZfaGVhZC0xLAogCSAgICAgY2ktPmlfd3JidWZmZXJfcmVmLCBjaS0+aV93cmJ1ZmZlcl9yZWZfaGVhZCwKIAkgICAgIHNuYXBjLCBzbmFwYy0+c2VxLCBzbmFwYy0+bnVtX3NuYXBzKTsKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAKIAkvKiBub3cgYWRqdXN0IHBhZ2UgKi8KIAlzcGluX2xvY2tfaXJxKCZtYXBwaW5nLT50cmVlX2xvY2spOwpAQCAtMzkxLDcgKzM5MSw3IEBACiAJc3RydWN0IGNlcGhfc25hcF9jb250ZXh0ICpzbmFwYyA9IE5VTEw7CiAJc3RydWN0IGNlcGhfY2FwX3NuYXAgKmNhcHNuYXAgPSBOVUxMOwogCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjYXBzbmFwLCAmY2ktPmlfY2FwX3NuYXBzLCBjaV9pdGVtKSB7CiAJCWRvdXQoIiBjYXBfc25hcCAlcCBzbmFwYyAlcCBoYXMgJWQgZGlydHkgcGFnZXNcbiIsIGNhcHNuYXAsCiAJCSAgICAgY2Fwc25hcC0+Y29udGV4dCwgY2Fwc25hcC0+ZGlydHlfcGFnZXMpOwpAQCAtNDA3LDcgKzQwNyw3IEBACiAJCWRvdXQoIiBoZWFkIHNuYXBjICVwIGhhcyAlZCBkaXJ0eSBwYWdlc1xuIiwKIAkJICAgICBzbmFwYywgY2ktPmlfd3JidWZmZXJfcmVmX2hlYWQpOwogCX0KLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJcmV0dXJuIHNuYXBjOwogfQogCmRpZmYgLS1naXQgYS9mcy9jZXBoL2NhcHMuYyBiL2ZzL2NlcGgvY2Fwcy5jCmluZGV4IDBmMzI3YzYuLjhiNTMxOTMgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvY2Fwcy5jCisrKyBiL2ZzL2NlcGgvY2Fwcy5jCkBAIC0zMDksNyArMzA5LDcgQEAKIC8qCiAgKiBGaW5kIGNlcGhfY2FwIGZvciBnaXZlbiBtZHMsIGlmIGFueS4KICAqCi0gKiBDYWxsZWQgd2l0aCBpX2xvY2sgaGVsZC4KKyAqIENhbGxlZCB3aXRoIGlfY2VwaF9sb2NrIGhlbGQuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgY2VwaF9jYXAgKl9fZ2V0X2NhcF9mb3JfbWRzKHN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpLCBpbnQgbWRzKQogewpAQCAtMzMyLDkgKzMzMiw5IEBACiB7CiAJc3RydWN0IGNlcGhfY2FwICpjYXA7CiAKLQlzcGluX2xvY2soJmNpLT52ZnNfaW5vZGUuaV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJY2FwID0gX19nZXRfY2FwX2Zvcl9tZHMoY2ksIG1kcyk7Ci0Jc3Bpbl91bmxvY2soJmNpLT52ZnNfaW5vZGUuaV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlyZXR1cm4gY2FwOwogfQogCkBAIC0zNjEsMTUgKzM2MSwxNiBAQAogCiBpbnQgY2VwaF9nZXRfY2FwX21kcyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQogeworCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7CiAJaW50IG1kczsKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAltZHMgPSBfX2NlcGhfZ2V0X2NhcF9tZHMoY2VwaF9pbm9kZShpbm9kZSkpOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlyZXR1cm4gbWRzOwogfQogCiAvKgotICogQ2FsbGVkIHVuZGVyIGlfbG9jay4KKyAqIENhbGxlZCB1bmRlciBpX2NlcGhfbG9jay4KICAqLwogc3RhdGljIHZvaWQgX19pbnNlcnRfY2FwX25vZGUoc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2ksCiAJCQkgICAgICBzdHJ1Y3QgY2VwaF9jYXAgKm5ldykKQEAgLTQxNSw3ICs0MTYsNyBAQAogICoKICAqIElmIElfRkxVU0ggaXMgc2V0LCBsZWF2ZSB0aGUgaW5vZGUgYXQgdGhlIGZyb250IG9mIHRoZSBsaXN0LgogICoKLSAqIENhbGxlciBob2xkcyBpX2xvY2sKKyAqIENhbGxlciBob2xkcyBpX2NlcGhfbG9jawogICogICAgLT4gd2UgdGFrZSBtZHNjLT5jYXBfZGVsYXlfbG9jawogICovCiBzdGF0aWMgdm9pZCBfX2NhcF9kZWxheV9yZXF1ZXVlKHN0cnVjdCBjZXBoX21kc19jbGllbnQgKm1kc2MsCkBAIC00NTcsNyArNDU4LDcgQEAKIC8qCiAgKiBDYW5jZWwgZGVsYXllZCB3b3JrIG9uIGNhcC4KICAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIGlfbG9jay4KKyAqIENhbGxlciBtdXN0IGhvbGQgaV9jZXBoX2xvY2suCiAgKi8KIHN0YXRpYyB2b2lkIF9fY2FwX2RlbGF5X2NhbmNlbChzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICptZHNjLAogCQkJICAgICAgIHN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpKQpAQCAtNTMyLDE0ICs1MzMsMTQgQEAKIAkJd2FudGVkIHw9IGNlcGhfY2Fwc19mb3JfbW9kZShmbW9kZSk7CiAKIHJldHJ5OgotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWNhcCA9IF9fZ2V0X2NhcF9mb3JfbWRzKGNpLCBtZHMpOwogCWlmICghY2FwKSB7CiAJCWlmIChuZXdfY2FwKSB7CiAJCQljYXAgPSBuZXdfY2FwOwogCQkJbmV3X2NhcCA9IE5VTEw7CiAJCX0gZWxzZSB7Ci0JCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJCW5ld19jYXAgPSBnZXRfY2FwKG1kc2MsIGNhcHNfcmVzZXJ2YXRpb24pOwogCQkJaWYgKG5ld19jYXAgPT0gTlVMTCkKIAkJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTYyNSw3ICs2MjYsNyBAQAogCiAJaWYgKGZtb2RlID49IDApCiAJCV9fY2VwaF9nZXRfZm1vZGUoY2ksIGZtb2RlKTsKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJd2FrZV91cF9hbGwoJmNpLT5pX2NhcF93cSk7CiAJcmV0dXJuIDA7CiB9CkBAIC03OTIsNyArNzkzLDcgQEAKIAlzdHJ1Y3QgcmJfbm9kZSAqcDsKIAlpbnQgcmV0ID0gMDsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWZvciAocCA9IHJiX2ZpcnN0KCZjaS0+aV9jYXBzKTsgcDsgcCA9IHJiX25leHQocCkpIHsKIAkJY2FwID0gcmJfZW50cnkocCwgc3RydWN0IGNlcGhfY2FwLCBjaV9ub2RlKTsKIAkJaWYgKF9fY2FwX2lzX3ZhbGlkKGNhcCkgJiYKQEAgLTgwMSw3ICs4MDIsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWRvdXQoImNlcGhfY2Fwc19yZXZva2luZyAlcCAlcyA9ICVkXG4iLCBpbm9kZSwKIAkgICAgIGNlcGhfY2FwX3N0cmluZyhtYXNrKSwgcmV0KTsKIAlyZXR1cm4gcmV0OwpAQCAtODU1LDcgKzg1Niw3IEBACiB9CiAKIC8qCi0gKiBjYWxsZWQgdW5kZXIgaV9sb2NrCisgKiBjYWxsZWQgdW5kZXIgaV9jZXBoX2xvY2sKICAqLwogc3RhdGljIGludCBfX2NlcGhfaXNfYW55X2NhcHMoc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kpCiB7CkBAIC04NjUsNyArODY2LDcgQEAKIC8qCiAgKiBSZW1vdmUgYSBjYXAuICBUYWtlIHN0ZXBzIHRvIGRlYWwgd2l0aCBhIHJhY2luZyBpdGVyYXRlX3Nlc3Npb25fY2Fwcy4KICAqCi0gKiBjYWxsZXIgc2hvdWxkIGhvbGQgaV9sb2NrLgorICogY2FsbGVyIHNob3VsZCBob2xkIGlfY2VwaF9sb2NrLgogICogY2FsbGVyIHdpbGwgbm90IGhvbGQgc2Vzc2lvbiBzX211dGV4IGlmIGNhbGxlZCBmcm9tIGRlc3Ryb3lfaW5vZGUuCiAgKi8KIHZvaWQgX19jZXBoX3JlbW92ZV9jYXAoc3RydWN0IGNlcGhfY2FwICpjYXApCkBAIC0xMDI4LDcgKzEwMjksNyBAQAogCiAvKgogICogUXVldWUgY2FwIHJlbGVhc2VzIHdoZW4gYW4gaW5vZGUgaXMgZHJvcHBlZCBmcm9tIG91ciBjYWNoZS4gIFNpbmNlCi0gKiBpbm9kZSBpcyBhYm91dCB0byBiZSBkZXN0cm95ZWQsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGlfbG9jay4KKyAqIGlub2RlIGlzIGFib3V0IHRvIGJlIGRlc3Ryb3llZCwgdGhlcmUgaXMgbm8gbmVlZCBmb3IgaV9jZXBoX2xvY2suCiAgKi8KIHZvaWQgY2VwaF9xdWV1ZV9jYXBzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSkKIHsKQEAgLTEwNDksNyArMTA1MCw3IEBACiAKIC8qCiAgKiBTZW5kIGEgY2FwIG1zZyBvbiB0aGUgZ2l2ZW4gaW5vZGUuICBVcGRhdGUgb3VyIGNhcHMgc3RhdGUsIHRoZW4KLSAqIGRyb3AgaV9sb2NrIGFuZCBzZW5kIHRoZSBtZXNzYWdlLgorICogZHJvcCBpX2NlcGhfbG9jayBhbmQgc2VuZCB0aGUgbWVzc2FnZS4KICAqCiAgKiBNYWtlIG5vdGUgb2YgbWF4X3NpemUgcmVwb3J0ZWQvcmVxdWVzdGVkIGZyb20gbWRzLCByZXZva2VkIGNhcHMKICAqIHRoYXQgaGF2ZSBub3cgYmVlbiBpbXBsZW1lbnRlZC4KQEAgLTEwNjEsMTMgKzEwNjIsMTMgQEAKICAqIFJldHVybiBub24temVybyBpZiBkZWxheWVkIHJlbGVhc2UsIG9yIHdlIGV4cGVyaWVuY2VkIGFuIGVycm9yCiAgKiBzdWNoIHRoYXQgdGhlIGNhbGxlciBzaG91bGQgcmVxdWV1ZSArIHJldHJ5IGxhdGVyLgogICoKLSAqIGNhbGxlZCB3aXRoIGlfbG9jaywgdGhlbiBkcm9wcyBpdC4KKyAqIGNhbGxlZCB3aXRoIGlfY2VwaF9sb2NrLCB0aGVuIGRyb3BzIGl0LgogICogY2FsbGVyIHNob3VsZCBob2xkIHNuYXBfcndzZW0gKHJlYWQpLCBzX211dGV4LgogICovCiBzdGF0aWMgaW50IF9fc2VuZF9jYXAoc3RydWN0IGNlcGhfbWRzX2NsaWVudCAqbWRzYywgc3RydWN0IGNlcGhfY2FwICpjYXAsCiAJCSAgICAgIGludCBvcCwgaW50IHVzZWQsIGludCB3YW50LCBpbnQgcmV0YWluLCBpbnQgZmx1c2hpbmcsCiAJCSAgICAgIHVuc2lnbmVkICpwZmx1c2hfdGlkKQotCV9fcmVsZWFzZXMoY2FwLT5jaS0+dmZzX2lub2RlLT5pX2xvY2spCisJX19yZWxlYXNlcyhjYXAtPmNpLT5pX2NlcGhfbG9jaykKIHsKIAlzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSA9IGNhcC0+Y2k7CiAJc3RydWN0IGlub2RlICppbm9kZSA9ICZjaS0+dmZzX2lub2RlOwpAQCAtMTE3MCw3ICsxMTcxLDcgQEAKIAkJeGF0dHJfdmVyc2lvbiA9IGNpLT5pX3hhdHRycy52ZXJzaW9uOwogCX0KIAotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAogCXJldCA9IHNlbmRfY2FwX21zZyhzZXNzaW9uLCBjZXBoX3Zpbm8oaW5vZGUpLmlubywgY2FwX2lkLAogCQlvcCwga2VlcCwgd2FudCwgZmx1c2hpbmcsIHNlcSwgZmx1c2hfdGlkLCBpc3N1ZV9zZXEsIG1zZXEsCkBAIC0xMTk4LDEzICsxMTk5LDEzIEBACiAgKiBVbmxlc3MgQGFnYWluIGlzIHRydWUsIHNraXAgY2FwX3NuYXBzIHRoYXQgd2VyZSBhbHJlYWR5IHNlbnQgdG8KICAqIHRoZSBNRFMgKGkuZS4sIGR1cmluZyB0aGlzIHNlc3Npb24pLgogICoKLSAqIENhbGxlZCB1bmRlciBpX2xvY2suICBUYWtlcyBzX211dGV4IGFzIG5lZWRlZC4KKyAqIENhbGxlZCB1bmRlciBpX2NlcGhfbG9jay4gIFRha2VzIHNfbXV0ZXggYXMgbmVlZGVkLgogICovCiB2b2lkIF9fY2VwaF9mbHVzaF9zbmFwcyhzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSwKIAkJCXN0cnVjdCBjZXBoX21kc19zZXNzaW9uICoqcHNlc3Npb24sCiAJCQlpbnQgYWdhaW4pCi0JCV9fcmVsZWFzZXMoY2ktPnZmc19pbm9kZS0+aV9sb2NrKQotCQlfX2FjcXVpcmVzKGNpLT52ZnNfaW5vZGUtPmlfbG9jaykKKwkJX19yZWxlYXNlcyhjaS0+aV9jZXBoX2xvY2spCisJCV9fYWNxdWlyZXMoY2ktPmlfY2VwaF9sb2NrKQogewogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmY2ktPnZmc19pbm9kZTsKIAlpbnQgbWRzOwpAQCAtMTI2MSw3ICsxMjYyLDcgQEAKIAkJCXNlc3Npb24gPSBOVUxMOwogCQl9CiAJCWlmICghc2Vzc2lvbikgewotCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCQltdXRleF9sb2NrKCZtZHNjLT5tdXRleCk7CiAJCQlzZXNzaW9uID0gX19jZXBoX2xvb2t1cF9tZHNfc2Vzc2lvbihtZHNjLCBtZHMpOwogCQkJbXV0ZXhfdW5sb2NrKCZtZHNjLT5tdXRleCk7CkBAIC0xMjc1LDcgKzEyNzYsNyBAQAogCQkJICogZGVsZXRpb24gb3IgbWlncmF0aW9uLiAgcmV0cnksIGFuZCB3ZSdsbAogCQkJICogZ2V0IGEgYmV0dGVyIEBtZHMgdmFsdWUgbmV4dCB0aW1lLgogCQkJICovCi0JCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQkJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQkJZ290byByZXRyeTsKIAkJfQogCkBAIC0xMjg1LDcgKzEyODYsNyBAQAogCQkJbGlzdF9kZWxfaW5pdCgmY2Fwc25hcC0+Zmx1c2hpbmdfaXRlbSk7CiAJCWxpc3RfYWRkX3RhaWwoJmNhcHNuYXAtPmZsdXNoaW5nX2l0ZW0sCiAJCQkgICAgICAmc2Vzc2lvbi0+c19jYXBfc25hcHNfZmx1c2hpbmcpOwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJCWRvdXQoImZsdXNoX3NuYXBzICVwIGNhcF9zbmFwICVwIGZvbGxvd3MgJWxsZCB0aWQgJWxsdVxuIiwKIAkJICAgICBpbm9kZSwgY2Fwc25hcCwgY2Fwc25hcC0+Zm9sbG93cywgY2Fwc25hcC0+Zmx1c2hfdGlkKTsKQEAgLTEzMDIsNyArMTMwMyw3IEBACiAJCW5leHRfZm9sbG93cyA9IGNhcHNuYXAtPmZvbGxvd3MgKyAxOwogCQljZXBoX3B1dF9jYXBfc25hcChjYXBzbmFwKTsKIAotCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCWdvdG8gcmV0cnk7CiAJfQogCkBAIC0xMzIyLDExICsxMzIzLDkgQEAKIAogc3RhdGljIHZvaWQgY2VwaF9mbHVzaF9zbmFwcyhzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSkKIHsKLQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmNpLT52ZnNfaW5vZGU7Ci0KLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlfX2NlcGhfZmx1c2hfc25hcHMoY2ksIE5VTEwsIDApOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIH0KIAogLyoKQEAgLTEzNzMsNyArMTM3Miw3IEBACiAgKiBBZGQgZGlydHkgaW5vZGUgdG8gdGhlIGZsdXNoaW5nIGxpc3QuICBBc3NpZ25lZCBhIHNlcSBudW1iZXIgc28gd2UKICAqIGNhbiB3YWl0IGZvciBjYXBzIHRvIGZsdXNoIHdpdGhvdXQgc3RhcnZpbmcuCiAgKgotICogQ2FsbGVkIHVuZGVyIGlfbG9jay4KKyAqIENhbGxlZCB1bmRlciBpX2NlcGhfbG9jay4KICAqLwogc3RhdGljIGludCBfX21hcmtfY2Fwc19mbHVzaGluZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLAogCQkJCSBzdHJ1Y3QgY2VwaF9tZHNfc2Vzc2lvbiAqc2Vzc2lvbikKQEAgLTE0MjEsOSArMTQyMCw5IEBACiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAl1MzIgaW52YWxpZGF0aW5nX2dlbiA9IGNpLT5pX3JkY2FjaGVfZ2VuOwogCi0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWludmFsaWRhdGVfbWFwcGluZ19wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCwgLTEpOwotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJaWYgKGlub2RlLT5pX2RhdGEubnJwYWdlcyA9PSAwICYmCiAJICAgIGludmFsaWRhdGluZ19nZW4gPT0gY2ktPmlfcmRjYWNoZV9nZW4pIHsKQEAgLTE0NzAsNyArMTQ2OSw3IEBACiAJaWYgKG1kc2MtPnN0b3BwaW5nKQogCQlpc19kZWxheWVkID0gMTsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJaWYgKGNpLT5pX2NlcGhfZmxhZ3MgJiBDRVBIX0lfRkxVU0gpCiAJCWZsYWdzIHw9IENIRUNLX0NBUFNfRkxVU0g7CkBAIC0xNDgwLDcgKzE0NzksNyBAQAogCQlfX2NlcGhfZmx1c2hfc25hcHMoY2ksICZzZXNzaW9uLCAwKTsKIAlnb3RvIHJldHJ5X2xvY2tlZDsKIHJldHJ5OgotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogcmV0cnlfbG9ja2VkOgogCWZpbGVfd2FudGVkID0gX19jZXBoX2NhcHNfZmlsZV93YW50ZWQoY2kpOwogCXVzZWQgPSBfX2NlcGhfY2Fwc191c2VkKGNpKTsKQEAgLTE2MzQsNyArMTYzMyw3IEBACiAJCQlpZiAobXV0ZXhfdHJ5bG9jaygmc2Vzc2lvbi0+c19tdXRleCkgPT0gMCkgewogCQkJCWRvdXQoImludmVydGluZyBzZXNzaW9uL2lubyBsb2NrcyBvbiAlcFxuIiwKIAkJCQkgICAgIHNlc3Npb24pOwotCQkJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJCQlpZiAodG9va19zbmFwX3J3c2VtKSB7CiAJCQkJCXVwX3JlYWQoJm1kc2MtPnNuYXBfcndzZW0pOwogCQkJCQl0b29rX3NuYXBfcndzZW0gPSAwOwpAQCAtMTY0OCw3ICsxNjQ3LDcgQEAKIAkJCWlmIChkb3duX3JlYWRfdHJ5bG9jaygmbWRzYy0+c25hcF9yd3NlbSkgPT0gMCkgewogCQkJCWRvdXQoImludmVydGluZyBzbmFwL2luIGxvY2tzIG9uICVwXG4iLAogCQkJCSAgICAgaW5vZGUpOwotCQkJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJCQlkb3duX3JlYWQoJm1kc2MtPnNuYXBfcndzZW0pOwogCQkJCXRvb2tfc25hcF9yd3NlbSA9IDE7CiAJCQkJZ290byByZXRyeTsKQEAgLTE2NjQsMTAgKzE2NjMsMTAgQEAKIAkJbWRzID0gY2FwLT5tZHM7ICAvKiByZW1lbWJlciBtZHMsIHNvIHdlIGRvbid0IHJlcGVhdCAqLwogCQlzZW50Kys7CiAKLQkJLyogX19zZW5kX2NhcCBkcm9wcyBpX2xvY2sgKi8KKwkJLyogX19zZW5kX2NhcCBkcm9wcyBpX2NlcGhfbG9jayAqLwogCQlkZWxheWVkICs9IF9fc2VuZF9jYXAobWRzYywgY2FwLCBDRVBIX0NBUF9PUF9VUERBVEUsIHVzZWQsIHdhbnQsCiAJCQkJICAgICAgcmV0YWluLCBmbHVzaGluZywgTlVMTCk7Ci0JCWdvdG8gcmV0cnk7IC8qIHJldGFrZSBpX2xvY2sgYW5kIHJlc3RhcnQgb3VyIGNhcCBzY2FuLiAqLworCQlnb3RvIHJldHJ5OyAvKiByZXRha2UgaV9jZXBoX2xvY2sgYW5kIHJlc3RhcnQgb3VyIGNhcCBzY2FuLiAqLwogCX0KIAogCS8qCkBAIC0xNjgxLDcgKzE2ODAsNyBAQAogCWVsc2UgaWYgKCFpc19kZWxheWVkIHx8IGZvcmNlX3JlcXVldWUpCiAJCV9fY2FwX2RlbGF5X3JlcXVldWUobWRzYywgY2kpOwogCi0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJaWYgKHF1ZXVlX2ludmFsaWRhdGUpCiAJCWNlcGhfcXVldWVfaW52YWxpZGF0ZShpbm9kZSk7CkBAIC0xNzA0LDcgKzE3MDMsNyBAQAogCWludCBmbHVzaGluZyA9IDA7CiAKIHJldHJ5OgotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWlmIChjaS0+aV9jZXBoX2ZsYWdzICYgQ0VQSF9JX05PRkxVU0gpIHsKIAkJZG91dCgidHJ5X2ZsdXNoX2NhcHMgc2tpcHBpbmcgJXAgSV9OT0ZMVVNIIHNldFxuIiwgaW5vZGUpOwogCQlnb3RvIG91dDsKQEAgLTE3MTYsNyArMTcxNSw3IEBACiAJCWludCBkZWxheWVkOwogCiAJCWlmICghc2Vzc2lvbikgewotCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCQlzZXNzaW9uID0gY2FwLT5zZXNzaW9uOwogCQkJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+c19tdXRleCk7CiAJCQlnb3RvIHJldHJ5OwpAQCAtMTcyNywxOCArMTcyNiwxOCBAQAogCiAJCWZsdXNoaW5nID0gX19tYXJrX2NhcHNfZmx1c2hpbmcoaW5vZGUsIHNlc3Npb24pOwogCi0JCS8qIF9fc2VuZF9jYXAgZHJvcHMgaV9sb2NrICovCisJCS8qIF9fc2VuZF9jYXAgZHJvcHMgaV9jZXBoX2xvY2sgKi8KIAkJZGVsYXllZCA9IF9fc2VuZF9jYXAobWRzYywgY2FwLCBDRVBIX0NBUF9PUF9GTFVTSCwgdXNlZCwgd2FudCwKIAkJCQkgICAgIGNhcC0+aXNzdWVkIHwgY2FwLT5pbXBsZW1lbnRlZCwgZmx1c2hpbmcsCiAJCQkJICAgICBmbHVzaF90aWQpOwogCQlpZiAoIWRlbGF5ZWQpCiAJCQlnb3RvIG91dF91bmxvY2tlZDsKIAotCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCV9fY2FwX2RlbGF5X3JlcXVldWUobWRzYywgY2kpOwogCX0KIG91dDoKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiBvdXRfdW5sb2NrZWQ6CiAJaWYgKHNlc3Npb24gJiYgdW5sb2NrX3Nlc3Npb24pCiAJCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+c19tdXRleCk7CkBAIC0xNzUzLDcgKzE3NTIsNyBAQAogCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7CiAJaW50IGksIHJldCA9IDE7CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlmb3IgKGkgPSAwOyBpIDwgQ0VQSF9DQVBfQklUUzsgaSsrKQogCQlpZiAoKGNpLT5pX2ZsdXNoaW5nX2NhcHMgJiAoMSA8PCBpKSkgJiYKIAkJICAgIGNpLT5pX2NhcF9mbHVzaF90aWRbaV0gPD0gdGlkKSB7CkBAIC0xNzYxLDcgKzE3NjAsNyBAQAogCQkJcmV0ID0gMDsKIAkJCWJyZWFrOwogCQl9Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTE4NjgsMTAgKzE4NjcsMTAgQEAKIAkJc3RydWN0IGNlcGhfbWRzX2NsaWVudCAqbWRzYyA9CiAJCQljZXBoX3NiX3RvX2NsaWVudChpbm9kZS0+aV9zYiktPm1kc2M7CiAKLQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQlpZiAoX19jZXBoX2NhcHNfZGlydHkoY2kpKQogCQkJX19jYXBfZGVsYXlfcmVxdWV1ZV9mcm9udChtZHNjLCBjaSk7Ci0JCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJfQogCXJldHVybiBlcnI7CiB9CkBAIC0xODk0LDcgKzE4OTMsNyBAQAogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gJmNpLT52ZnNfaW5vZGU7CiAJCXN0cnVjdCBjZXBoX2NhcCAqY2FwOwogCi0JCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJY2FwID0gY2ktPmlfYXV0aF9jYXA7CiAJCWlmIChjYXAgJiYgY2FwLT5zZXNzaW9uID09IHNlc3Npb24pIHsKIAkJCWRvdXQoImtpY2tfZmx1c2hpbmdfY2FwcyAlcCBjYXAgJXAgY2Fwc25hcCAlcFxuIiwgaW5vZGUsCkBAIC0xOTA0LDcgKzE5MDMsNyBAQAogCQkJcHJfZXJyKCIlcCBhdXRoIGNhcCAlcCBub3QgbWRzJWQgPz8/XG4iLCBpbm9kZSwKIAkJCSAgICAgICBjYXAsIHNlc3Npb24tPnNfbWRzKTsKIAkJfQotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCX0KIH0KIApAQCAtMTkyMSw3ICsxOTIwLDcgQEAKIAkJc3RydWN0IGNlcGhfY2FwICpjYXA7CiAJCWludCBkZWxheWVkID0gMDsKIAotCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCWNhcCA9IGNpLT5pX2F1dGhfY2FwOwogCQlpZiAoY2FwICYmIGNhcC0+c2Vzc2lvbiA9PSBzZXNzaW9uKSB7CiAJCQlkb3V0KCJraWNrX2ZsdXNoaW5nX2NhcHMgJXAgY2FwICVwICVzXG4iLCBpbm9kZSwKQEAgLTE5MzIsMTQgKzE5MzEsMTQgQEAKIAkJCQkJICAgICBjYXAtPmlzc3VlZCB8IGNhcC0+aW1wbGVtZW50ZWQsCiAJCQkJCSAgICAgY2ktPmlfZmx1c2hpbmdfY2FwcywgTlVMTCk7CiAJCQlpZiAoZGVsYXllZCkgewotCQkJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCQkJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQkJCV9fY2FwX2RlbGF5X3JlcXVldWUobWRzYywgY2kpOwotCQkJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCXByX2VycigiJXAgYXV0aCBjYXAgJXAgbm90IG1kcyVkID8/P1xuIiwgaW5vZGUsCiAJCQkgICAgICAgY2FwLCBzZXNzaW9uLT5zX21kcyk7Ci0JCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJfQogCX0KIH0KQEAgLTE5NTIsNyArMTk1MSw3IEBACiAJc3RydWN0IGNlcGhfY2FwICpjYXA7CiAJaW50IGRlbGF5ZWQgPSAwOwogCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJY2FwID0gY2ktPmlfYXV0aF9jYXA7CiAJZG91dCgia2lja19mbHVzaGluZ19pbm9kZV9jYXBzICVwIGZsdXNoaW5nICVzIGZsdXNoX3NlcSAlbGxkXG4iLCBpbm9kZSwKIAkgICAgIGNlcGhfY2FwX3N0cmluZyhjaS0+aV9mbHVzaGluZ19jYXBzKSwgY2ktPmlfY2FwX2ZsdXNoX3NlcSk7CkBAIC0xOTY0LDEyICsxOTYzLDEyIEBACiAJCQkJICAgICBjYXAtPmlzc3VlZCB8IGNhcC0+aW1wbGVtZW50ZWQsCiAJCQkJICAgICBjaS0+aV9mbHVzaGluZ19jYXBzLCBOVUxMKTsKIAkJaWYgKGRlbGF5ZWQpIHsKLQkJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCQlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCQlfX2NhcF9kZWxheV9yZXF1ZXVlKG1kc2MsIGNpKTsKLQkJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQl9CiAJfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAl9CiB9CiAKQEAgLTE5NzgsNyArMTk3Nyw3IEBACiAgKiBUYWtlIHJlZmVyZW5jZXMgdG8gY2FwYWJpbGl0aWVzIHdlIGhvbGQsIHNvIHRoYXQgd2UgZG9uJ3QgcmVsZWFzZQogICogdGhlbSB0byB0aGUgTURTIHByZW1hdHVyZWx5LgogICoKLSAqIFByb3RlY3RlZCBieSBpX2xvY2suCisgKiBQcm90ZWN0ZWQgYnkgaV9jZXBoX2xvY2suCiAgKi8KIHN0YXRpYyB2b2lkIF9fdGFrZV9jYXBfcmVmcyhzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSwgaW50IGdvdCkKIHsKQEAgLTIwMTYsNyArMjAxNSw3IEBACiAKIAlkb3V0KCJnZXRfY2FwX3JlZnMgJXAgbmVlZCAlcyB3YW50ICVzXG4iLCBpbm9kZSwKIAkgICAgIGNlcGhfY2FwX3N0cmluZyhuZWVkKSwgY2VwaF9jYXBfc3RyaW5nKHdhbnQpKTsKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAogCS8qIG1ha2Ugc3VyZSBmaWxlIGlzIGFjdHVhbGx5IG9wZW4gKi8KIAlmaWxlX3dhbnRlZCA9IF9fY2VwaF9jYXBzX2ZpbGVfd2FudGVkKGNpKTsKQEAgLTIwNzcsNyArMjA3Niw3IEBACiAJCSAgICAgY2VwaF9jYXBfc3RyaW5nKGhhdmUpLCBjZXBoX2NhcF9zdHJpbmcobmVlZCkpOwogCX0KIG91dDoKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJZG91dCgiZ2V0X2NhcF9yZWZzICVwIHJldCAlZCBnb3QgJXNcbiIsIGlub2RlLAogCSAgICAgcmV0LCBjZXBoX2NhcF9zdHJpbmcoKmdvdCkpOwogCXJldHVybiByZXQ7CkBAIC0yMDk0LDcgKzIwOTMsNyBAQAogCWludCBjaGVjayA9IDA7CiAKIAkvKiBkbyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgcmVxdWVzdCBhIGxhcmdlciBtYXhfc2l6ZT8gKi8KLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlpZiAoKGVuZG9mZiA+PSBjaS0+aV9tYXhfc2l6ZSB8fAogCSAgICAgZW5kb2ZmID4gKGlub2RlLT5pX3NpemUgPDwgMSkpICYmCiAJICAgIGVuZG9mZiA+IGNpLT5pX3dhbnRlZF9tYXhfc2l6ZSkgewpAQCAtMjEwMyw3ICsyMTAyLDcgQEAKIAkJY2ktPmlfd2FudGVkX21heF9zaXplID0gZW5kb2ZmOwogCQljaGVjayA9IDE7CiAJfQotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlpZiAoY2hlY2spCiAJCWNlcGhfY2hlY2tfY2FwcyhjaSwgQ0hFQ0tfQ0FQU19BVVRIT05MWSwgTlVMTCk7CiB9CkBAIC0yMTQwLDkgKzIxMzksOSBAQAogICovCiB2b2lkIGNlcGhfZ2V0X2NhcF9yZWZzKHN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpLCBpbnQgY2FwcykKIHsKLQlzcGluX2xvY2soJmNpLT52ZnNfaW5vZGUuaV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJX190YWtlX2NhcF9yZWZzKGNpLCBjYXBzKTsKLQlzcGluX3VubG9jaygmY2ktPnZmc19pbm9kZS5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogfQogCiAvKgpAQCAtMjE2MCw3ICsyMTU5LDcgQEAKIAlpbnQgbGFzdCA9IDAsIHB1dCA9IDAsIGZsdXNoc25hcHMgPSAwLCB3YWtlID0gMDsKIAlzdHJ1Y3QgY2VwaF9jYXBfc25hcCAqY2Fwc25hcDsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWlmIChoYWQgJiBDRVBIX0NBUF9QSU4pCiAJCS0tY2ktPmlfcGluX3JlZjsKIAlpZiAoaGFkICYgQ0VQSF9DQVBfRklMRV9SRCkKQEAgLTIxOTMsNyArMjE5Miw3IEBACiAJCQkJfQogCQkJfQogCQl9Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJZG91dCgicHV0X2NhcF9yZWZzICVwIGhhZCAlcyVzJXNcbiIsIGlub2RlLCBjZXBoX2NhcF9zdHJpbmcoaGFkKSwKIAkgICAgIGxhc3QgPyAiIGxhc3QiIDogIiIsIHB1dCA/ICIgcHV0IiA6ICIiKTsKQEAgLTIyMjUsNyArMjIyNCw3IEBACiAJaW50IGZvdW5kID0gMDsKIAlzdHJ1Y3QgY2VwaF9jYXBfc25hcCAqY2Fwc25hcCA9IE5VTEw7CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAljaS0+aV93cmJ1ZmZlcl9yZWYgLT0gbnI7CiAJbGFzdCA9ICFjaS0+aV93cmJ1ZmZlcl9yZWY7CiAKQEAgLTIyNzQsNyArMjI3Myw3IEBACiAJCX0KIAl9CiAKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAKIAlpZiAobGFzdCkgewogCQljZXBoX2NoZWNrX2NhcHMoY2ksIENIRUNLX0NBUFNfQVVUSE9OTFksIE5VTEwpOwpAQCAtMjI5MSw3ICsyMjkwLDcgQEAKICAqIEhhbmRsZSBhIGNhcCBHUkFOVCBtZXNzYWdlIGZyb20gdGhlIE1EUy4gIChOb3RlIHRoYXQgYSBHUkFOVCBtYXkKICAqIGFjdHVhbGx5IGJlIGEgcmV2b2NhdGlvbiBpZiBpdCBzcGVjaWZpZXMgYSBzbWFsbGVyIGNhcCBzZXQuKQogICoKLSAqIGNhbGxlciBob2xkcyBzX211dGV4IGFuZCBpX2xvY2ssIHdlIGRyb3AgYm90aC4KKyAqIGNhbGxlciBob2xkcyBzX211dGV4IGFuZCBpX2NlcGhfbG9jaywgd2UgZHJvcCBib3RoLgogICoKICAqIHJldHVybiB2YWx1ZToKICAqICAwIC0gb2sKQEAgLTIzMDIsNyArMjMwMSw3IEBACiAJCQkgICAgIHN0cnVjdCBjZXBoX21kc19zZXNzaW9uICpzZXNzaW9uLAogCQkJICAgICBzdHJ1Y3QgY2VwaF9jYXAgKmNhcCwKIAkJCSAgICAgc3RydWN0IGNlcGhfYnVmZmVyICp4YXR0cl9idWYpCi0JCV9fcmVsZWFzZXMoaW5vZGUtPmlfbG9jaykKKwkJX19yZWxlYXNlcyhjaS0+aV9jZXBoX2xvY2spCiB7CiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAlpbnQgbWRzID0gc2Vzc2lvbi0+c19tZHM7CkBAIC0yNDUzLDcgKzI0NTIsNyBAQAogCX0KIAlCVUdfT04oY2FwLT5pc3N1ZWQgJiB+Y2FwLT5pbXBsZW1lbnRlZCk7CiAKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJaWYgKHdyaXRlYmFjaykKIAkJLyoKIAkJICogcXVldWUgaW5vZGUgZm9yIHdyaXRlYmFjazogd2UgY2FuJ3QgYWN0dWFsbHkgY2FsbApAQCAtMjQ4Myw3ICsyNDgyLDcgQEAKIAkJCQkgc3RydWN0IGNlcGhfbWRzX2NhcHMgKm0sCiAJCQkJIHN0cnVjdCBjZXBoX21kc19zZXNzaW9uICpzZXNzaW9uLAogCQkJCSBzdHJ1Y3QgY2VwaF9jYXAgKmNhcCkKLQlfX3JlbGVhc2VzKGlub2RlLT5pX2xvY2spCisJX19yZWxlYXNlcyhjaS0+aV9jZXBoX2xvY2spCiB7CiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAlzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICptZHNjID0gY2VwaF9zYl90b19jbGllbnQoaW5vZGUtPmlfc2IpLT5tZHNjOwpAQCAtMjUzOSw3ICsyNTM4LDcgQEAKIAl3YWtlX3VwX2FsbCgmY2ktPmlfY2FwX3dxKTsKIAogb3V0OgotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlpZiAoZHJvcCkKIAkJaXB1dChpbm9kZSk7CiB9CkBAIC0yNTYyLDcgKzI1NjEsNyBAQAogCWRvdXQoImhhbmRsZV9jYXBfZmx1c2hzbmFwX2FjayBpbm9kZSAlcCBjaSAlcCBtZHMlZCBmb2xsb3dzICVsbGRcbiIsCiAJICAgICBpbm9kZSwgY2ksIHNlc3Npb24tPnNfbWRzLCBmb2xsb3dzKTsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2Fwc25hcCwgJmNpLT5pX2NhcF9zbmFwcywgY2lfaXRlbSkgewogCQlpZiAoY2Fwc25hcC0+Zm9sbG93cyA9PSBmb2xsb3dzKSB7CiAJCQlpZiAoY2Fwc25hcC0+Zmx1c2hfdGlkICE9IGZsdXNoX3RpZCkgewpAQCAtMjU4NSw3ICsyNTg0LDcgQEAKIAkJCSAgICAgY2Fwc25hcCwgY2Fwc25hcC0+Zm9sbG93cyk7CiAJCX0KIAl9Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWlmIChkcm9wKQogCQlpcHV0KGlub2RlKTsKIH0KQEAgLTI1OTgsNyArMjU5Nyw3IEBACiBzdGF0aWMgdm9pZCBoYW5kbGVfY2FwX3RydW5jKHN0cnVjdCBpbm9kZSAqaW5vZGUsCiAJCQkgICAgIHN0cnVjdCBjZXBoX21kc19jYXBzICp0cnVuYywKIAkJCSAgICAgc3RydWN0IGNlcGhfbWRzX3Nlc3Npb24gKnNlc3Npb24pCi0JX19yZWxlYXNlcyhpbm9kZS0+aV9sb2NrKQorCV9fcmVsZWFzZXMoY2ktPmlfY2VwaF9sb2NrKQogewogCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7CiAJaW50IG1kcyA9IHNlc3Npb24tPnNfbWRzOwpAQCAtMjYxNyw3ICsyNjE2LDcgQEAKIAkgICAgIGlub2RlLCBtZHMsIHNlcSwgdHJ1bmNhdGVfc2l6ZSwgdHJ1bmNhdGVfc2VxKTsKIAlxdWV1ZV90cnVuYyA9IGNlcGhfZmlsbF9maWxlX3NpemUoaW5vZGUsIGlzc3VlZCwKIAkJCQkJICB0cnVuY2F0ZV9zZXEsIHRydW5jYXRlX3NpemUsIHNpemUpOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAogCWlmIChxdWV1ZV90cnVuYykKIAkJY2VwaF9xdWV1ZV92bXRydW5jYXRlKGlub2RlKTsKQEAgLTI2NDYsNyArMjY0NSw3IEBACiAJZG91dCgiaGFuZGxlX2NhcF9leHBvcnQgaW5vZGUgJXAgY2kgJXAgbWRzJWQgbXNlcSAlZFxuIiwKIAkgICAgIGlub2RlLCBjaSwgbWRzLCBtc2VxKTsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJLyogbWFrZSBzdXJlIHdlIGhhdmVuJ3Qgc2VlbiBhIGhpZ2hlciBtc2VxICovCiAJZm9yIChwID0gcmJfZmlyc3QoJmNpLT5pX2NhcHMpOyBwOyBwID0gcmJfbmV4dChwKSkgewpAQCAtMjY5MCw3ICsyNjg5LDcgQEAKIAl9CiAJLyogZWxzZSwgd2UgYWxyZWFkeSByZWxlYXNlZCBpdCAqLwogCi0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogfQogCiAvKgpAQCAtMjc0NSw5ICsyNzQ0LDkgQEAKIAl1cF9yZWFkKCZtZHNjLT5zbmFwX3J3c2VtKTsKIAogCS8qIG1ha2Ugc3VyZSB3ZSByZS1yZXF1ZXN0IG1heF9zaXplLCBpZiBuZWNlc3NhcnkgKi8KLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAljaS0+aV9yZXF1ZXN0ZWRfbWF4X3NpemUgPSAwOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIH0KIAogLyoKQEAgLTI3NjIsNiArMjc2MSw3IEBACiAJc3RydWN0IGNlcGhfbWRzX2NsaWVudCAqbWRzYyA9IHNlc3Npb24tPnNfbWRzYzsKIAlzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiID0gbWRzYy0+ZnNjLT5zYjsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlOworCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpOwogCXN0cnVjdCBjZXBoX2NhcCAqY2FwOwogCXN0cnVjdCBjZXBoX21kc19jYXBzICpoOwogCWludCBtZHMgPSBzZXNzaW9uLT5zX21kczsKQEAgLTI4MTUsNiArMjgxNSw3IEBACiAKIAkvKiBsb29rdXAgaW5vICovCiAJaW5vZGUgPSBjZXBoX2ZpbmRfaW5vZGUoc2IsIHZpbm8pOworCWNpID0gY2VwaF9pbm9kZShpbm9kZSk7CiAJZG91dCgiIG9wICVzIGlubyAlbGx4LiVsbHggaW5vZGUgJXBcbiIsIGNlcGhfY2FwX29wX25hbWUob3ApLCB2aW5vLmlubywKIAkgICAgIHZpbm8uc25hcCwgaW5vZGUpOwogCWlmICghaW5vZGUpIHsKQEAgLTI4NDQsMTYgKzI4NDUsMTYgQEAKIAl9CiAKIAkvKiB0aGUgcmVzdCByZXF1aXJlIGEgY2FwICovCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJY2FwID0gX19nZXRfY2FwX2Zvcl9tZHMoY2VwaF9pbm9kZShpbm9kZSksIG1kcyk7CiAJaWYgKCFjYXApIHsKIAkJZG91dCgiIG5vIGNhcCBvbiAlcCBpbm8gJWxseC4lbGx4IGZyb20gbWRzJWRcbiIsCiAJCSAgICAgaW5vZGUsIGNlcGhfaW5vKGlub2RlKSwgY2VwaF9zbmFwKGlub2RlKSwgbWRzKTsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJZ290byBmbHVzaF9jYXBfcmVsZWFzZXM7CiAJfQogCi0JLyogbm90ZSB0aGF0IGVhY2ggb2YgdGhlc2UgZHJvcHMgaV9sb2NrIGZvciB1cyAqLworCS8qIG5vdGUgdGhhdCBlYWNoIG9mIHRoZXNlIGRyb3BzIGlfY2VwaF9sb2NrIGZvciB1cyAqLwogCXN3aXRjaCAob3ApIHsKIAljYXNlIENFUEhfQ0FQX09QX1JFVk9LRToKIAljYXNlIENFUEhfQ0FQX09QX0dSQU5UOgpAQCAtMjg2OSw3ICsyODcwLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQlwcl9lcnIoImNlcGhfaGFuZGxlX2NhcHM6IHVua25vd24gY2FwIG9wICVkICVzXG4iLCBvcCwKIAkJICAgICAgIGNlcGhfY2FwX29wX25hbWUob3ApKTsKIAl9CkBAIC0yOTYyLDEzICsyOTYzLDEzIEBACiAJc3RydWN0IGlub2RlICppbm9kZSA9ICZjaS0+dmZzX2lub2RlOwogCWludCBsYXN0ID0gMDsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWRvdXQoInB1dF9mbW9kZSAlcCBmbW9kZSAlZCAlZCAtPiAlZFxuIiwgaW5vZGUsIGZtb2RlLAogCSAgICAgY2ktPmlfbnJfYnlfbW9kZVtmbW9kZV0sIGNpLT5pX25yX2J5X21vZGVbZm1vZGVdLTEpOwogCUJVR19PTihjaS0+aV9ucl9ieV9tb2RlW2Ztb2RlXSA9PSAwKTsKIAlpZiAoLS1jaS0+aV9ucl9ieV9tb2RlW2Ztb2RlXSA9PSAwKQogCQlsYXN0Kys7Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJaWYgKGxhc3QgJiYgY2ktPmlfdmluby5zbmFwID09IENFUEhfTk9TTkFQKQogCQljZXBoX2NoZWNrX2NhcHMoY2ksIDAsIE5VTEwpOwpAQCAtMjk5MSw3ICsyOTkyLDcgQEAKIAlpbnQgdXNlZCwgZGlydHk7CiAJaW50IHJldCA9IDA7CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAl1c2VkID0gX19jZXBoX2NhcHNfdXNlZChjaSk7CiAJZGlydHkgPSBfX2NlcGhfY2Fwc19kaXJ0eShjaSk7CiAKQEAgLTMwNDYsNyArMzA0Nyw3IEBACiAJCQkgICAgIGlub2RlLCBjYXAsIGNlcGhfY2FwX3N0cmluZyhjYXAtPmlzc3VlZCkpOwogCQl9CiAJfQotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0zMDYxLDcgKzMwNjIsNyBAQAogCiAJLyoKIAkgKiBmb3JjZSBhbiByZWNvcmQgZm9yIHRoZSBkaXJlY3RvcnkgY2FwcyBpZiB3ZSBoYXZlIGEgZGVudHJ5IGxlYXNlLgotCSAqIHRoaXMgaXMgcmFjeSAoY2FuJ3QgdGFrZSBpX2xvY2sgYW5kIGRfbG9jayB0b2dldGhlciksIGJ1dCBpdAorCSAqIHRoaXMgaXMgcmFjeSAoY2FuJ3QgdGFrZSBpX2NlcGhfbG9jayBhbmQgZF9sb2NrIHRvZ2V0aGVyKSwgYnV0IGl0CiAJICogZG9lc24ndCBoYXZlIHRvIGJlIHBlcmZlY3Q7IHRoZSBtZHMgd2lsbCByZXZva2UgYW55dGhpbmcgd2UgZG9uJ3QKIAkgKiByZWxlYXNlLgogCSAqLwpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9kaXIuYyBiL2ZzL2NlcGgvZGlyLmMKaW5kZXggYmNhMzk0OC4uOTg5NTQwMCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9kaXIuYworKysgYi9mcy9jZXBoL2Rpci5jCkBAIC0yODEsMTggKzI4MSwxOCBAQAogCX0KIAogCS8qIGNhbiB3ZSB1c2UgdGhlIGRjYWNoZT8gKi8KLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlpZiAoKGZpbHAtPmZfcG9zID09IDIgfHwgZmktPmRlbnRyeSkgJiYKIAkgICAgIWNlcGhfdGVzdF9tb3VudF9vcHQoZnNjLCBOT0FTWU5DUkVBRERJUikgJiYKIAkgICAgY2VwaF9zbmFwKGlub2RlKSAhPSBDRVBIX1NOQVBESVIgJiYKIAkgICAgY2VwaF9kaXJfdGVzdF9jb21wbGV0ZShpbm9kZSkgJiYKIAkgICAgX19jZXBoX2NhcHNfaXNzdWVkX21hc2soY2ksIENFUEhfQ0FQX0ZJTEVfU0hBUkVELCAxKSkgewotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQllcnIgPSBfX2RjYWNoZV9yZWFkZGlyKGZpbHAsIGRpcmVudCwgZmlsbGRpcik7CiAJCWlmIChlcnIgIT0gLUVBR0FJTikKIAkJCXJldHVybiBlcnI7CiAJfSBlbHNlIHsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAl9CiAJaWYgKGZpLT5kZW50cnkpIHsKIAkJZXJyID0gbm90ZV9sYXN0X2RlbnRyeShmaSwgZmktPmRlbnRyeS0+ZF9uYW1lLm5hbWUsCkBAIC00MjgsMTIgKzQyOCwxMiBAQAogCSAqIHdlcmUgcmVsZWFzZWQgZHVyaW5nIHRoZSB3aG9sZSByZWFkZGlyLCBhbmQgd2Ugc2hvdWxkIGhhdmUKIAkgKiB0aGUgY29tcGxldGUgZGlyIGNvbnRlbnRzIGluIG91ciBjYWNoZS4KIAkgKi8KLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlpZiAoY2ktPmlfcmVsZWFzZV9jb3VudCA9PSBmaS0+ZGlyX3JlbGVhc2VfY291bnQpIHsKIAkJY2VwaF9kaXJfc2V0X2NvbXBsZXRlKGlub2RlKTsKIAkJY2ktPmlfbWF4X29mZnNldCA9IGZpbHAtPmZfcG9zOwogCX0KLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAKIAlkb3V0KCJyZWFkZGlyICVwIGZpbHAgJXAgZG9uZS5cbiIsIGlub2RlLCBmaWxwKTsKIAlyZXR1cm4gMDsKQEAgLTYwNyw3ICs2MDcsNyBAQAogCQlzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSA9IGNlcGhfaW5vZGUoZGlyKTsKIAkJc3RydWN0IGNlcGhfZGVudHJ5X2luZm8gKmRpID0gY2VwaF9kZW50cnkoZGVudHJ5KTsKIAotCQlzcGluX2xvY2soJmRpci0+aV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQlkb3V0KCIgZGlyICVwIGZsYWdzIGFyZSAlZFxuIiwgZGlyLCBjaS0+aV9jZXBoX2ZsYWdzKTsKIAkJaWYgKHN0cm5jbXAoZGVudHJ5LT5kX25hbWUubmFtZSwKIAkJCSAgICBmc2MtPm1vdW50X29wdGlvbnMtPnNuYXBkaXJfbmFtZSwKQEAgLTYxNSwxMyArNjE1LDEzIEBACiAJCSAgICAhaXNfcm9vdF9jZXBoX2RlbnRyeShkaXIsIGRlbnRyeSkgJiYKIAkJICAgIGNlcGhfZGlyX3Rlc3RfY29tcGxldGUoZGlyKSAmJgogCQkgICAgKF9fY2VwaF9jYXBzX2lzc3VlZF9tYXNrKGNpLCBDRVBIX0NBUF9GSUxFX1NIQVJFRCwgMSkpKSB7Ci0JCQlzcGluX3VubG9jaygmZGlyLT5pX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCQlkb3V0KCIgZGlyICVwIGNvbXBsZXRlLCAtRU5PRU5UXG4iLCBkaXIpOwogCQkJZF9hZGQoZGVudHJ5LCBOVUxMKTsKIAkJCWRpLT5sZWFzZV9zaGFyZWRfZ2VuID0gY2ktPmlfc2hhcmVkX2dlbjsKIAkJCXJldHVybiBOVUxMOwogCQl9Ci0JCXNwaW5fdW5sb2NrKCZkaXItPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCX0KIAogCW9wID0gY2VwaF9zbmFwKGRpcikgPT0gQ0VQSF9TTkFQRElSID8KQEAgLTg0MSwxMiArODQxLDEyIEBACiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAlpbnQgZHJvcCA9IENFUEhfQ0FQX0xJTktfU0hBUkVEIHwgQ0VQSF9DQVBfTElOS19FWENMOwogCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJaWYgKGlub2RlLT5pX25saW5rID09IDEpIHsKIAkJZHJvcCB8PSB+KF9fY2VwaF9jYXBzX3dhbnRlZChjaSkgfCBDRVBIX0NBUF9QSU4pOwogCQljaS0+aV9jZXBoX2ZsYWdzIHw9IENFUEhfSV9OT0RFTEFZOwogCX0KLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJcmV0dXJuIGRyb3A7CiB9CiAKQEAgLTEwMTUsMTAgKzEwMTUsMTAgQEAKIAlzdHJ1Y3QgY2VwaF9kZW50cnlfaW5mbyAqZGkgPSBjZXBoX2RlbnRyeShkZW50cnkpOwogCWludCB2YWxpZCA9IDA7CiAKLQlzcGluX2xvY2soJmRpci0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJaWYgKGNpLT5pX3NoYXJlZF9nZW4gPT0gZGktPmxlYXNlX3NoYXJlZF9nZW4pCiAJCXZhbGlkID0gX19jZXBoX2NhcHNfaXNzdWVkX21hc2soY2ksIENFUEhfQ0FQX0ZJTEVfU0hBUkVELCAxKTsKLQlzcGluX3VubG9jaygmZGlyLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWRvdXQoImRpcl9sZWFzZV9pc192YWxpZCBkaXIgJXAgdiV1IGRlbnRyeSAlcCB2JXUgPSAlZFxuIiwKIAkgICAgIGRpciwgKHVuc2lnbmVkKWNpLT5pX3NoYXJlZF9nZW4sIGRlbnRyeSwKIAkgICAgICh1bnNpZ25lZClkaS0+bGVhc2Vfc2hhcmVkX2dlbiwgdmFsaWQpOwpAQCAtMTA5NCw0MiArMTA5NCwxOSBAQAogLyoKICAqIFNldC9jbGVhci90ZXN0IGRpciBjb21wbGV0ZSBmbGFnIG9uIHRoZSBkaXIncyBkZW50cnkuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgZGVudHJ5ICogX19kX2ZpbmRfYW55X2FsaWFzKHN0cnVjdCBpbm9kZSAqaW5vZGUpCi17Ci0Jc3RydWN0IGRlbnRyeSAqYWxpYXM7Ci0KLQlpZiAobGlzdF9lbXB0eSgmaW5vZGUtPmlfZGVudHJ5KSkKLQkJcmV0dXJuIE5VTEw7Ci0JYWxpYXMgPSBsaXN0X2ZpcnN0X2VudHJ5KCZpbm9kZS0+aV9kZW50cnksIHN0cnVjdCBkZW50cnksIGRfYWxpYXMpOwotCXJldHVybiBhbGlhczsKLX0KLQogdm9pZCBjZXBoX2Rpcl9zZXRfY29tcGxldGUoc3RydWN0IGlub2RlICppbm9kZSkKIHsKLQlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSBfX2RfZmluZF9hbnlfYWxpYXMoaW5vZGUpOwotCQotCWlmIChkZW50cnkgJiYgY2VwaF9kZW50cnkoZGVudHJ5KSkgewotCQlkb3V0KCIgbWFya2luZyAlcCAoJXApIGNvbXBsZXRlXG4iLCBpbm9kZSwgZGVudHJ5KTsKLQkJc2V0X2JpdChDRVBIX0RfQ09NUExFVEUsICZjZXBoX2RlbnRyeShkZW50cnkpLT5mbGFncyk7Ci0JfQorCS8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KIH0KIAogdm9pZCBjZXBoX2Rpcl9jbGVhcl9jb21wbGV0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IF9fZF9maW5kX2FueV9hbGlhcyhpbm9kZSk7Ci0KLQlpZiAoZGVudHJ5ICYmIGNlcGhfZGVudHJ5KGRlbnRyeSkpIHsKLQkJZG91dCgiIG1hcmtpbmcgJXAgKCVwKSBOT1QgY29tcGxldGVcbiIsIGlub2RlLCBkZW50cnkpOwotCQljbGVhcl9iaXQoQ0VQSF9EX0NPTVBMRVRFLCAmY2VwaF9kZW50cnkoZGVudHJ5KS0+ZmxhZ3MpOwotCX0KKwkvKiBub3QgeWV0IGltcGxlbWVudGVkICovCiB9CiAKIGJvb2wgY2VwaF9kaXJfdGVzdF9jb21wbGV0ZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQogewotCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IF9fZF9maW5kX2FueV9hbGlhcyhpbm9kZSk7Ci0KLQlpZiAoZGVudHJ5ICYmIGNlcGhfZGVudHJ5KGRlbnRyeSkpCi0JCXJldHVybiB0ZXN0X2JpdChDRVBIX0RfQ09NUExFVEUsICZjZXBoX2RlbnRyeShkZW50cnkpLT5mbGFncyk7CisJLyogbm90IHlldCBpbXBsZW1lbnRlZCAqLwogCXJldHVybiBmYWxzZTsKIH0KIApkaWZmIC0tZ2l0IGEvZnMvY2VwaC9maWxlLmMgYi9mcy9jZXBoL2ZpbGUuYwppbmRleCBjZTU0OWQzLi5lZDcyNDI4IDEwMDY0NAotLS0gYS9mcy9jZXBoL2ZpbGUuYworKysgYi9mcy9jZXBoL2ZpbGUuYwpAQCAtMTQ3LDkgKzE0Nyw5IEBACiAKIAkvKiB0cml2aWFsbHkgb3BlbiBzbmFwZGlyICovCiAJaWYgKGNlcGhfc25hcChpbm9kZSkgPT0gQ0VQSF9TTkFQRElSKSB7Ci0JCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJX19jZXBoX2dldF9mbW9kZShjaSwgZm1vZGUpOwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQlyZXR1cm4gY2VwaF9pbml0X2ZpbGUoaW5vZGUsIGZpbGUsIGZtb2RlKTsKIAl9CiAKQEAgLTE1OCw3ICsxNTgsNyBAQAogCSAqIHdyaXRlKSBvciBhbnkgTURTIChmb3IgcmVhZCkuICBVcGRhdGUgd2FudGVkIHNldAogCSAqIGFzeW5jaHJvbm91c2x5LgogCSAqLwotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWlmIChfX2NlcGhfaXNfYW55X3JlYWxfY2FwcyhjaSkgJiYKIAkgICAgKCgoZm1vZGUgJiBDRVBIX0ZJTEVfTU9ERV9XUikgPT0gMCkgfHwgY2ktPmlfYXV0aF9jYXApKSB7CiAJCWludCBtZHNfd2FudGVkID0gX19jZXBoX2NhcHNfbWRzX3dhbnRlZChjaSk7CkBAIC0xNjgsNyArMTY4LDcgQEAKIAkJICAgICBpbm9kZSwgZm1vZGUsIGNlcGhfY2FwX3N0cmluZyh3YW50ZWQpLAogCQkgICAgIGNlcGhfY2FwX3N0cmluZyhpc3N1ZWQpKTsKIAkJX19jZXBoX2dldF9mbW9kZShjaSwgZm1vZGUpOwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJCS8qIGFkanVzdCB3YW50ZWQ/ICovCiAJCWlmICgoaXNzdWVkICYgd2FudGVkKSAhPSB3YW50ZWQgJiYKQEAgLTE4MCwxMCArMTgwLDEwIEBACiAJfSBlbHNlIGlmIChjZXBoX3NuYXAoaW5vZGUpICE9IENFUEhfTk9TTkFQICYmCiAJCSAgIChjaS0+aV9zbmFwX2NhcHMgJiB3YW50ZWQpID09IHdhbnRlZCkgewogCQlfX2NlcGhfZ2V0X2Ztb2RlKGNpLCBmbW9kZSk7Ci0JCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCXJldHVybiBjZXBoX2luaXRfZmlsZShpbm9kZSwgZmlsZSwgZm1vZGUpOwogCX0KLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAKIAlkb3V0KCJvcGVuIGZtb2RlICVkIHdhbnRzICVzXG4iLCBmbW9kZSwgY2VwaF9jYXBfc3RyaW5nKHdhbnRlZCkpOwogCXJlcSA9IHByZXBhcmVfb3Blbl9yZXF1ZXN0KGlub2RlLT5pX3NiLCBmbGFncywgMCk7CkBAIC03NDMsOSArNzQzLDkgQEAKIAkJICovCiAJCWludCBkaXJ0eTsKIAotCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCWRpcnR5ID0gX19jZXBoX21hcmtfZGlydHlfY2FwcyhjaSwgQ0VQSF9DQVBfRklMRV9XUik7Ci0JCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCWNlcGhfcHV0X2NhcF9yZWZzKGNpLCBnb3QpOwogCiAJCXJldCA9IGdlbmVyaWNfZmlsZV9haW9fd3JpdGUoaW9jYiwgaW92LCBucl9zZWdzLCBwb3MpOwpAQCAtNzY0LDkgKzc2NCw5IEBACiAKIAlpZiAocmV0ID49IDApIHsKIAkJaW50IGRpcnR5OwotCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCWRpcnR5ID0gX19jZXBoX21hcmtfZGlydHlfY2FwcyhjaSwgQ0VQSF9DQVBfRklMRV9XUik7Ci0JCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCWlmIChkaXJ0eSkKIAkJCV9fbWFya19pbm9kZV9kaXJ0eShpbm9kZSwgZGlydHkpOwogCX0KQEAgLTc5Nyw3ICs3OTcsOCBAQAogCiAJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOwogCV9fY2VwaF9kb19wZW5kaW5nX3ZtdHJ1bmNhdGUoaW5vZGUpOwotCWlmIChvcmlnaW4gIT0gU0VFS19DVVIgfHwgb3JpZ2luICE9IFNFRUtfU0VUKSB7CisKKwlpZiAob3JpZ2luID09IFNFRUtfRU5EIHx8IG9yaWdpbiA9PSBTRUVLX0RBVEEgfHwgb3JpZ2luID09IFNFRUtfSE9MRSkgewogCQlyZXQgPSBjZXBoX2RvX2dldGF0dHIoaW5vZGUsIENFUEhfU1RBVF9DQVBfU0laRSk7CiAJCWlmIChyZXQgPCAwKSB7CiAJCQlvZmZzZXQgPSByZXQ7CmRpZmYgLS1naXQgYS9mcy9jZXBoL2lub2RlLmMgYi9mcy9jZXBoL2lub2RlLmMKaW5kZXggMTE2ZjM2NS4uODdmYjEzMiAxMDA2NDQKLS0tIGEvZnMvY2VwaC9pbm9kZS5jCisrKyBiL2ZzL2NlcGgvaW5vZGUuYwpAQCAtMjk3LDYgKzI5Nyw4IEBACiAKIAlkb3V0KCJhbGxvY19pbm9kZSAlcFxuIiwgJmNpLT52ZnNfaW5vZGUpOwogCisJc3Bpbl9sb2NrX2luaXQoJmNpLT5pX2NlcGhfbG9jayk7CisKIAljaS0+aV92ZXJzaW9uID0gMDsKIAljaS0+aV90aW1lX3dhcnBfc2VxID0gMDsKIAljaS0+aV9jZXBoX2ZsYWdzID0gMDsKQEAgLTU4Myw3ICs1ODUsNyBAQAogCQkJICAgICAgIGlpbmZvLT54YXR0cl9sZW4pOwogCX0KIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJLyoKIAkgKiBwcm92aWRlZCB2ZXJzaW9uIHdpbGwgYmUgb2RkIGlmIGlub2RlIHZhbHVlIGlzIHByb2plY3RlZCwKQEAgLTY4MCw3ICs2ODIsNyBAQAogCQkJY2hhciAqc3ltOwogCiAJCQlCVUdfT04oc3ltbGVuICE9IGlub2RlLT5pX3NpemUpOwotCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAKIAkJCWVyciA9IC1FTk9NRU07CiAJCQlzeW0gPSBrbWFsbG9jKHN5bWxlbisxLCBHRlBfTk9GUyk7CkBAIC02ODksNyArNjkxLDcgQEAKIAkJCW1lbWNweShzeW0sIGlpbmZvLT5zeW1saW5rLCBzeW1sZW4pOwogCQkJc3ltW3N5bWxlbl0gPSAwOwogCi0JCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQkJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQkJaWYgKCFjaS0+aV9zeW1saW5rKQogCQkJCWNpLT5pX3N5bWxpbmsgPSBzeW07CiAJCQllbHNlCkBAIC03MTUsNyArNzE3LDcgQEAKIAl9CiAKIG5vX2NoYW5nZToKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAKIAkvKiBxdWV1ZSB0cnVuY2F0ZSBpZiB3ZSBzYXcgaV9zaXplIGRlY3JlYXNlICovCiAJaWYgKHF1ZXVlX3RydW5jKQpAQCAtNzUwLDEzICs3NTIsMTMgQEAKIAkJCQkgICAgIGluZm8tPmNhcC5mbGFncywKIAkJCQkgICAgIGNhcHNfcmVzZXJ2YXRpb24pOwogCQl9IGVsc2UgewotCQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJCWRvdXQoIiAlcCBnb3Qgc25hcF9jYXBzICVzXG4iLCBpbm9kZSwKIAkJCSAgICAgY2VwaF9jYXBfc3RyaW5nKGxlMzJfdG9fY3B1KGluZm8tPmNhcC5jYXBzKSkpOwogCQkJY2ktPmlfc25hcF9jYXBzIHw9IGxlMzJfdG9fY3B1KGluZm8tPmNhcC5jYXBzKTsKIAkJCWlmIChjYXBfZm1vZGUgPj0gMCkKIAkJCQlfX2NlcGhfZ2V0X2Ztb2RlKGNpLCBjYXBfZm1vZGUpOwotCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCX0KIAl9IGVsc2UgaWYgKGNhcF9mbW9kZSA+PSAwKSB7CiAJCXByX3dhcm5pbmcoIm1kcyBpc3N1ZWQgbm8gY2FwcyBvbiAlbGx4LiVsbHhcbiIsCkBAIC04NDksMTkgKzg1MSwyMCBAQAogewogCXN0cnVjdCBkZW50cnkgKmRpciA9IGRuLT5kX3BhcmVudDsKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZGlyLT5kX2lub2RlOworCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7CiAJc3RydWN0IGNlcGhfZGVudHJ5X2luZm8gKmRpOwogCiAJQlVHX09OKCFpbm9kZSk7CiAKIAlkaSA9IGNlcGhfZGVudHJ5KGRuKTsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWlmICghY2VwaF9kaXJfdGVzdF9jb21wbGV0ZShpbm9kZSkpIHsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJcmV0dXJuOwogCX0KIAlkaS0+b2Zmc2V0ID0gY2VwaF9pbm9kZShpbm9kZSktPmlfbWF4X29mZnNldCsrOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAogCXNwaW5fbG9jaygmZGlyLT5kX2xvY2spOwogCXNwaW5fbG9ja19uZXN0ZWQoJmRuLT5kX2xvY2ssIERFTlRSWV9EX0xPQ0tfTkVTVEVEKTsKQEAgLTEzMDgsNyArMTMxMSw3IEBACiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAlpbnQgcmV0ID0gMDsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWRvdXQoInNldF9zaXplICVwICVsbHUgLT4gJWxsdVxuIiwgaW5vZGUsIGlub2RlLT5pX3NpemUsIHNpemUpOwogCWlub2RlLT5pX3NpemUgPSBzaXplOwogCWlub2RlLT5pX2Jsb2NrcyA9IChzaXplICsgKDEgPDwgOSkgLSAxKSA+PiA5OwpAQCAtMTMxOCw3ICsxMzIxLDcgQEAKIAkgICAgKGNpLT5pX3JlcG9ydGVkX3NpemUgPDwgMSkgPCBjaS0+aV9tYXhfc2l6ZSkKIAkJcmV0ID0gMTsKIAotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlyZXR1cm4gcmV0OwogfQogCkBAIC0xMzc2LDIwICsxMzc5LDIwIEBACiAJdTMyIG9yaWdfZ2VuOwogCWludCBjaGVjayA9IDA7CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlkb3V0KCJpbnZhbGlkYXRlX3BhZ2VzICVwIGdlbiAlZCByZXZva2luZyAlZFxuIiwgaW5vZGUsCiAJICAgICBjaS0+aV9yZGNhY2hlX2dlbiwgY2ktPmlfcmRjYWNoZV9yZXZva2luZyk7CiAJaWYgKGNpLT5pX3JkY2FjaGVfcmV2b2tpbmcgIT0gY2ktPmlfcmRjYWNoZV9nZW4pIHsKIAkJLyogbmV2ZXJtaW5kISAqLwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQlnb3RvIG91dDsKIAl9CiAJb3JpZ19nZW4gPSBjaS0+aV9yZGNhY2hlX2dlbjsKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAKIAl0cnVuY2F0ZV9pbm9kZV9wYWdlcygmaW5vZGUtPmlfZGF0YSwgMCk7CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlpZiAob3JpZ19nZW4gPT0gY2ktPmlfcmRjYWNoZV9nZW4gJiYKIAkgICAgb3JpZ19nZW4gPT0gY2ktPmlfcmRjYWNoZV9yZXZva2luZykgewogCQlkb3V0KCJpbnZhbGlkYXRlX3BhZ2VzICVwIGdlbiAlZCBzdWNjZXNzZnVsXG4iLCBpbm9kZSwKQEAgLTE0MDEsNyArMTQwNCw3IEBACiAJCSAgICAgaW5vZGUsIG9yaWdfZ2VuLCBjaS0+aV9yZGNhY2hlX2dlbiwKIAkJICAgICBjaS0+aV9yZGNhY2hlX3Jldm9raW5nKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJaWYgKGNoZWNrKQogCQljZXBoX2NoZWNrX2NhcHMoY2ksIDAsIE5VTEwpOwpAQCAtMTQ2MCwxMCArMTQ2MywxMCBAQAogCWludCB3cmJ1ZmZlcl9yZWZzLCB3YWtlID0gMDsKIAogcmV0cnk6Ci0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJaWYgKGNpLT5pX3RydW5jYXRlX3BlbmRpbmcgPT0gMCkgewogCQlkb3V0KCJfX2RvX3BlbmRpbmdfdm10cnVuY2F0ZSAlcCBub25lIHBlbmRpbmdcbiIsIGlub2RlKTsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTQ3NCw3ICsxNDc3LDcgQEAKIAlpZiAoY2ktPmlfd3JidWZmZXJfcmVmX2hlYWQgPCBjaS0+aV93cmJ1ZmZlcl9yZWYpIHsKIAkJZG91dCgiX19kb19wZW5kaW5nX3ZtdHJ1bmNhdGUgJXAgZmx1c2hpbmcgc25hcHMgZmlyc3RcbiIsCiAJCSAgICAgaW5vZGUpOwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQlmaWxlbWFwX3dyaXRlX2FuZF93YWl0X3JhbmdlKCZpbm9kZS0+aV9kYXRhLCAwLAogCQkJCQkgICAgIGlub2RlLT5pX3NiLT5zX21heGJ5dGVzKTsKIAkJZ290byByZXRyeTsKQEAgLTE0ODQsMTUgKzE0ODcsMTUgQEAKIAl3cmJ1ZmZlcl9yZWZzID0gY2ktPmlfd3JidWZmZXJfcmVmOwogCWRvdXQoIl9fZG9fcGVuZGluZ192bXRydW5jYXRlICVwICglZCkgdG8gJWxsZFxuIiwgaW5vZGUsCiAJICAgICBjaS0+aV90cnVuY2F0ZV9wZW5kaW5nLCB0byk7Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJdHJ1bmNhdGVfaW5vZGVfcGFnZXMoaW5vZGUtPmlfbWFwcGluZywgdG8pOwogCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJY2ktPmlfdHJ1bmNhdGVfcGVuZGluZy0tOwogCWlmIChjaS0+aV90cnVuY2F0ZV9wZW5kaW5nID09IDApCiAJCXdha2UgPSAxOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAogCWlmICh3cmJ1ZmZlcl9yZWZzID09IDApCiAJCWNlcGhfY2hlY2tfY2FwcyhjaSwgQ0hFQ0tfQ0FQU19BVVRIT05MWSwgTlVMTCk7CkBAIC0xNTQ3LDcgKzE1NTAsNyBAQAogCWlmIChJU19FUlIocmVxKSkKIAkJcmV0dXJuIFBUUl9FUlIocmVxKTsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWlzc3VlZCA9IF9fY2VwaF9jYXBzX2lzc3VlZChjaSwgTlVMTCk7CiAJZG91dCgic2V0YXR0ciAlcCBpc3N1ZWQgJXNcbiIsIGlub2RlLCBjZXBoX2NhcF9zdHJpbmcoaXNzdWVkKSk7CiAKQEAgLTE2OTUsNyArMTY5OCw3IEBACiAJfQogCiAJcmVsZWFzZSAmPSBpc3N1ZWQ7Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJaWYgKGlub2RlX2RpcnR5X2ZsYWdzKQogCQlfX21hcmtfaW5vZGVfZGlydHkoaW5vZGUsIGlub2RlX2RpcnR5X2ZsYWdzKTsKQEAgLTE3MTcsNyArMTcyMCw3IEBACiAJX19jZXBoX2RvX3BlbmRpbmdfdm10cnVuY2F0ZShpbm9kZSk7CiAJcmV0dXJuIGVycjsKIG91dDoKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJY2VwaF9tZHNjX3B1dF9yZXF1ZXN0KHJlcSk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NlcGgvaW9jdGwuYyBiL2ZzL2NlcGgvaW9jdGwuYwppbmRleCA1YTE0YzI5Li43OTA5MTRhNTkgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvaW9jdGwuYworKysgYi9mcy9jZXBoL2lvY3RsLmMKQEAgLTI0MSwxMSArMjQxLDExIEBACiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAogCWlmICgoZmktPmZtb2RlICYgQ0VQSF9GSUxFX01PREVfTEFaWSkgPT0gMCkgewotCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCWNpLT5pX25yX2J5X21vZGVbZmktPmZtb2RlXS0tOwogCQlmaS0+Zm1vZGUgfD0gQ0VQSF9GSUxFX01PREVfTEFaWTsKIAkJY2ktPmlfbnJfYnlfbW9kZVtmaS0+Zm1vZGVdKys7Ci0JCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCWRvdXQoImlvY3RsX2xheXppbzogZmlsZSAlcCBtYXJrZWQgbGF6eVxuIiwgZmlsZSk7CiAKIAkJY2VwaF9jaGVja19jYXBzKGNpLCAwLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgvbWRzX2NsaWVudC5jIGIvZnMvY2VwaC9tZHNfY2xpZW50LmMKaW5kZXggMjY0YWI3MC4uNjIwM2Q4MCAxMDA2NDQKLS0tIGEvZnMvY2VwaC9tZHNfY2xpZW50LmMKKysrIGIvZnMvY2VwaC9tZHNfY2xpZW50LmMKQEAgLTczMiwyMSArNzMyLDIxIEBACiAJCX0KIAl9CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAljYXAgPSBOVUxMOwogCWlmIChtb2RlID09IFVTRV9BVVRIX01EUykKIAkJY2FwID0gY2ktPmlfYXV0aF9jYXA7CiAJaWYgKCFjYXAgJiYgIVJCX0VNUFRZX1JPT1QoJmNpLT5pX2NhcHMpKQogCQljYXAgPSByYl9lbnRyeShyYl9maXJzdCgmY2ktPmlfY2FwcyksIHN0cnVjdCBjZXBoX2NhcCwgY2lfbm9kZSk7CiAJaWYgKCFjYXApIHsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJZ290byByYW5kb207CiAJfQogCW1kcyA9IGNhcC0+c2Vzc2lvbi0+c19tZHM7CiAJZG91dCgiY2hvb3NlX21kcyAlcCAlbGx4LiVsbHggbWRzJWQgKCVzY2FwICVwKVxuIiwKIAkgICAgIGlub2RlLCBjZXBoX3Zpbm9wKGlub2RlKSwgbWRzLAogCSAgICAgY2FwID09IGNpLT5pX2F1dGhfY2FwID8gImF1dGggIiA6ICIiLCBjYXApOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlyZXR1cm4gbWRzOwogCiByYW5kb206CkBAIC05NTEsNyArOTUxLDcgQEAKIAogCWRvdXQoInJlbW92aW5nIGNhcCAlcCwgY2kgaXMgJXAsIGlub2RlIGlzICVwXG4iLAogCSAgICAgY2FwLCBjaSwgJmNpLT52ZnNfaW5vZGUpOwotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCV9fY2VwaF9yZW1vdmVfY2FwKGNhcCk7CiAJaWYgKCFfX2NlcGhfaXNfYW55X3JlYWxfY2FwcyhjaSkpIHsKIAkJc3RydWN0IGNlcGhfbWRzX2NsaWVudCAqbWRzYyA9CkBAIC05ODQsNyArOTg0LDcgQEAKIAkJfQogCQlzcGluX3VubG9jaygmbWRzYy0+Y2FwX2RpcnR5X2xvY2spOwogCX0KLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJd2hpbGUgKGRyb3AtLSkKIAkJaXB1dChpbm9kZSk7CiAJcmV0dXJuIDA7CkBAIC0xMDE1LDEwICsxMDE1LDEwIEBACiAKIAl3YWtlX3VwX2FsbCgmY2ktPmlfY2FwX3dxKTsKIAlpZiAoYXJnKSB7Ci0JCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJY2ktPmlfd2FudGVkX21heF9zaXplID0gMDsKIAkJY2ktPmlfcmVxdWVzdGVkX21heF9zaXplID0gMDsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0xMTUxLDcgKzExNTEsNyBAQAogCWlmIChzZXNzaW9uLT5zX3RyaW1fY2FwcyA8PSAwKQogCQlyZXR1cm4gLTE7CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAltaW5lID0gY2FwLT5pc3N1ZWQgfCBjYXAtPmltcGxlbWVudGVkOwogCXVzZWQgPSBfX2NlcGhfY2Fwc191c2VkKGNpKTsKIAlvaXNzdWVkID0gX19jZXBoX2NhcHNfaXNzdWVkX290aGVyKGNpLCBjYXApOwpAQCAtMTE3MCw3ICsxMTcwLDcgQEAKIAkJX19jZXBoX3JlbW92ZV9jYXAoY2FwKTsKIAl9IGVsc2UgewogCQkvKiB0cnkgdG8gZHJvcCByZWZlcnJpbmcgZGVudHJpZXMgKi8KLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJZF9wcnVuZV9hbGlhc2VzKGlub2RlKTsKIAkJZG91dCgidHJpbV9jYXBzX2NiICVwIGNhcCAlcCAgcHJ1bmVkLCBjb3VudCBub3cgJWRcbiIsCiAJCSAgICAgaW5vZGUsIGNhcCwgYXRvbWljX3JlYWQoJmlub2RlLT5pX2NvdW50KSk7CkBAIC0xMTc4LDcgKzExNzgsNyBAQAogCX0KIAogb3V0OgotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMTI5Niw3ICsxMjk2LDcgQEAKIAkJCQkJICAgaV9mbHVzaGluZ19pdGVtKTsKIAkJCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmY2ktPnZmc19pbm9kZTsKIAotCQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJCWlmIChjaS0+aV9jYXBfZmx1c2hfc2VxIDw9IHdhbnRfZmx1c2hfc2VxKSB7CiAJCQkJZG91dCgiY2hlY2tfY2FwX2ZsdXNoIHN0aWxsIGZsdXNoaW5nICVwICIKIAkJCQkgICAgICJzZXEgJWxsZCA8PSAlbGxkIHRvIG1kcyVkXG4iLCBpbm9kZSwKQEAgLTEzMDQsNyArMTMwNCw3IEBACiAJCQkJICAgICBzZXNzaW9uLT5zX21kcyk7CiAJCQkJcmV0ID0gMDsKIAkJCX0KLQkJCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQl9CiAJCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+c19tdXRleCk7CiAJCWNlcGhfcHV0X21kc19zZXNzaW9uKHNlc3Npb24pOwpAQCAtMTQ5NSw2ICsxNDk1LDcgQEAKIAkJCSAgICAgcG9zLCB0ZW1wKTsKIAkJfSBlbHNlIGlmIChzdG9wX29uX25vc25hcCAmJiBpbm9kZSAmJgogCQkJICAgY2VwaF9zbmFwKGlub2RlKSA9PSBDRVBIX05PU05BUCkgeworCQkJc3Bpbl91bmxvY2soJnRlbXAtPmRfbG9jayk7CiAJCQlicmVhazsKIAkJfSBlbHNlIHsKIAkJCXBvcyAtPSB0ZW1wLT5kX25hbWUubGVuOwpAQCAtMjAxMSwxMCArMjAxMiwxMCBAQAogCXN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpID0gY2VwaF9pbm9kZShpbm9kZSk7CiAKIAlkb3V0KCJpbnZhbGlkYXRlX2Rpcl9yZXF1ZXN0ICVwIChEX0NPTVBMRVRFLCBsZWFzZShzKSlcbiIsIGlub2RlKTsKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAljZXBoX2Rpcl9jbGVhcl9jb21wbGV0ZShpbm9kZSk7CiAJY2ktPmlfcmVsZWFzZV9jb3VudCsrOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAogCWlmIChyZXEtPnJfZGVudHJ5KQogCQljZXBoX2ludmFsaWRhdGVfZGVudHJ5X2xlYXNlKHJlcS0+cl9kZW50cnkpOwpAQCAtMjQyMiw3ICsyNDIzLDcgQEAKIAlpZiAoZXJyKQogCQlnb3RvIG91dF9mcmVlOwogCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJY2FwLT5zZXEgPSAwOyAgICAgICAgLyogcmVzZXQgY2FwIHNlcSAqLwogCWNhcC0+aXNzdWVfc2VxID0gMDsgIC8qIGFuZCBpc3N1ZV9zZXEgKi8KIApAQCAtMjQ0NSw3ICsyNDQ2LDcgQEAKIAkJcmVjLnYxLnBhdGhiYXNlID0gY3B1X3RvX2xlNjQocGF0aGJhc2UpOwogCQlyZWNsZW4gPSBzaXplb2YocmVjLnYxKTsKIAl9Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJaWYgKHJlY29uX3N0YXRlLT5mbG9jaykgewogCQlpbnQgbnVtX2ZjbnRsX2xvY2tzLCBudW1fZmxvY2tfbG9ja3M7CmRpZmYgLS1naXQgYS9mcy9jZXBoL21kc19jbGllbnQuaCBiL2ZzL2NlcGgvbWRzX2NsaWVudC5oCmluZGV4IDRiYjIzOTkuLmE1MGNhMGUgMTAwNjQ0Ci0tLSBhL2ZzL2NlcGgvbWRzX2NsaWVudC5oCisrKyBiL2ZzL2NlcGgvbWRzX2NsaWVudC5oCkBAIC0yMCw3ICsyMCw3IEBACiAgKgogICogICAgICAgICBtZHNjLT5zbmFwX3J3c2VtCiAgKgotICogICAgICAgICBpbm9kZS0+aV9sb2NrCisgKiAgICAgICAgIGNpLT5pX2NlcGhfbG9jawogICogICAgICAgICAgICAgICAgIG1kc2MtPnNuYXBfZmx1c2hfbG9jawogICogICAgICAgICAgICAgICAgIG1kc2MtPmNhcF9kZWxheV9sb2NrCiAgKgpkaWZmIC0tZ2l0IGEvZnMvY2VwaC9zbmFwLmMgYi9mcy9jZXBoL3NuYXAuYwppbmRleCBlMjY0MzcxLi5hNTU5YzgwIDEwMDY0NAotLS0gYS9mcy9jZXBoL3NuYXAuYworKysgYi9mcy9jZXBoL3NuYXAuYwpAQCAtNDQ2LDcgKzQ0Niw3IEBACiAJCXJldHVybjsKIAl9CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAl1c2VkID0gX19jZXBoX2NhcHNfdXNlZChjaSk7CiAJZGlydHkgPSBfX2NlcGhfY2Fwc19kaXJ0eShjaSk7CiAKQEAgLTUyOCw3ICs1MjgsNyBAQAogCQlrZnJlZShjYXBzbmFwKTsKIAl9CiAKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiB9CiAKIC8qCkBAIC01MzcsNyArNTM3LDcgQEAKICAqCiAgKiBJZiBjYXBzbmFwIGNhbiBub3cgYmUgZmx1c2hlZCwgYWRkIHRvIHNuYXBfZmx1c2ggbGlzdCwgYW5kIHJldHVybiAxLgogICoKLSAqIENhbGxlciBtdXN0IGhvbGQgaV9sb2NrLgorICogQ2FsbGVyIG11c3QgaG9sZCBpX2NlcGhfbG9jay4KICAqLwogaW50IF9fY2VwaF9maW5pc2hfY2FwX3NuYXAoc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2ksCiAJCQkgICAgc3RydWN0IGNlcGhfY2FwX3NuYXAgKmNhcHNuYXApCkBAIC03MzksOSArNzM5LDkgQEAKIAkJaW5vZGUgPSAmY2ktPnZmc19pbm9kZTsKIAkJaWhvbGQoaW5vZGUpOwogCQlzcGluX3VubG9jaygmbWRzYy0+c25hcF9mbHVzaF9sb2NrKTsKLQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQlfX2NlcGhfZmx1c2hfc25hcHMoY2ksICZzZXNzaW9uLCAwKTsKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJaXB1dChpbm9kZSk7CiAJCXNwaW5fbG9jaygmbWRzYy0+c25hcF9mbHVzaF9sb2NrKTsKIAl9CkBAIC04NDcsNyArODQ3LDcgQEAKIAkJCQljb250aW51ZTsKIAkJCWNpID0gY2VwaF9pbm9kZShpbm9kZSk7CiAKLQkJCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJCQlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCQlpZiAoIWNpLT5pX3NuYXBfcmVhbG0pCiAJCQkJZ290byBza2lwX2lub2RlOwogCQkJLyoKQEAgLTg3Niw3ICs4NzYsNyBAQAogCQkJb2xkcmVhbG0gPSBjaS0+aV9zbmFwX3JlYWxtOwogCQkJY2ktPmlfc25hcF9yZWFsbSA9IHJlYWxtOwogCQkJc3Bpbl91bmxvY2soJnJlYWxtLT5pbm9kZXNfd2l0aF9jYXBzX2xvY2spOwotCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAKIAkJCWNlcGhfZ2V0X3NuYXBfcmVhbG0obWRzYywgcmVhbG0pOwogCQkJY2VwaF9wdXRfc25hcF9yZWFsbShtZHNjLCBvbGRyZWFsbSk7CkBAIC04ODUsNyArODg1LDcgQEAKIAkJCWNvbnRpbnVlOwogCiBza2lwX2lub2RlOgotCQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQkJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCQlpcHV0KGlub2RlKTsKIAkJfQogCmRpZmYgLS1naXQgYS9mcy9jZXBoL3N1cGVyLmMgYi9mcy9jZXBoL3N1cGVyLmMKaW5kZXggOGRjNzNhNS4uYjQ4ZjE1ZiAxMDA2NDQKLS0tIGEvZnMvY2VwaC9zdXBlci5jCisrKyBiL2ZzL2NlcGgvc3VwZXIuYwpAQCAtMzgzLDcgKzM4Myw3IEBACiAJaWYgKGZzb3B0LT5yc2l6ZSAhPSBDRVBIX1JTSVpFX0RFRkFVTFQpCiAJCXNlcV9wcmludGYobSwgIixyc2l6ZT0lZCIsIGZzb3B0LT5yc2l6ZSk7CiAJaWYgKGZzb3B0LT5yYXNpemUgIT0gQ0VQSF9SQVNJWkVfREVGQVVMVCkKLQkJc2VxX3ByaW50ZihtLCAiLHJhc2l6ZT0lZCIsIGZzb3B0LT5yc2l6ZSk7CisJCXNlcV9wcmludGYobSwgIixyYXNpemU9JWQiLCBmc29wdC0+cmFzaXplKTsKIAlpZiAoZnNvcHQtPmNvbmdlc3Rpb25fa2IgIT0gZGVmYXVsdF9jb25nZXN0aW9uX2tiKCkpCiAJCXNlcV9wcmludGYobSwgIix3cml0ZV9jb25nZXN0aW9uX2tiPSVkIiwgZnNvcHQtPmNvbmdlc3Rpb25fa2IpOwogCWlmIChmc29wdC0+Y2Fwc193YW50ZWRfZGVsYXlfbWluICE9IENFUEhfQ0FQU19XQU5URURfREVMQVlfTUlOX0RFRkFVTFQpCmRpZmYgLS1naXQgYS9mcy9jZXBoL3N1cGVyLmggYi9mcy9jZXBoL3N1cGVyLmgKaW5kZXggMDFiZjE4OS4uZWRjYmYzNyAxMDA2NDQKLS0tIGEvZnMvY2VwaC9zdXBlci5oCisrKyBiL2ZzL2NlcGgvc3VwZXIuaApAQCAtMjIwLDcgKzIyMCw3IEBACiAgKiBUaGUgbG9ja2luZyBmb3IgRF9DT01QTEVURSBpcyBhIGJpdCBvZGQ6CiAgKiAgLSB3ZSBjYW4gY2xlYXIgaXQgYXQgYWxtb3N0IGFueSB0aW1lIChzZWUgY2VwaF9kX3BydW5lKQogICogIC0gaXQgaXMgb25seSBtZWFuaW5nZnVsIGlmOgotICogICAgLSB3ZSBob2xkIGRpciBpbm9kZSBpX2xvY2sKKyAqICAgIC0gd2UgaG9sZCBkaXIgaW5vZGUgaV9jZXBoX2xvY2sKICAqICAgIC0gd2UgaG9sZCBkaXIgRklMRV9TSEFSRUQgY2FwcwogICogICAgLSB0aGUgZGVudHJ5IERfQ09NUExFVEUgaXMgc2V0CiAgKi8KQEAgLTI1MCw2ICsyNTAsOCBAQAogc3RydWN0IGNlcGhfaW5vZGVfaW5mbyB7CiAJc3RydWN0IGNlcGhfdmlubyBpX3Zpbm87ICAgLyogY2VwaCBpbm8gKyBzbmFwICovCiAKKwlzcGlubG9ja190IGlfY2VwaF9sb2NrOworCiAJdTY0IGlfdmVyc2lvbjsKIAl1MzIgaV90aW1lX3dhcnBfc2VxOwogCkBAIC0yNzEsNyArMjczLDcgQEAKIAogCXN0cnVjdCBjZXBoX2lub2RlX3hhdHRyc19pbmZvIGlfeGF0dHJzOwogCi0JLyogY2FwYWJpbGl0aWVzLiAgcHJvdGVjdGVkIF9ib3RoXyBieSBpX2xvY2sgYW5kIGNhcC0+c2Vzc2lvbidzCisJLyogY2FwYWJpbGl0aWVzLiAgcHJvdGVjdGVkIF9ib3RoXyBieSBpX2NlcGhfbG9jayBhbmQgY2FwLT5zZXNzaW9uJ3MKIAkgKiBzX211dGV4LiAqLwogCXN0cnVjdCByYl9yb290IGlfY2FwczsgICAgICAgICAgIC8qIGNhcCBsaXN0ICovCiAJc3RydWN0IGNlcGhfY2FwICppX2F1dGhfY2FwOyAgICAgLyogYXV0aG9yaXRhdGl2ZSBjYXAsIGlmIGFueSAqLwpAQCAtNDM3LDE4ICs0MzksMTggQEAKIHsKIAlzdHJ1Y3QgY2VwaF9pbm9kZV9pbmZvICpjaSA9IGNlcGhfaW5vZGUoaW5vZGUpOwogCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJY2ktPmlfY2VwaF9mbGFncyAmPSB+bWFzazsKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBjZXBoX2lfc2V0KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHVuc2lnbmVkIG1hc2spCiB7CiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWNpLT5pX2NlcGhfZmxhZ3MgfD0gbWFzazsKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgYm9vbCBjZXBoX2lfdGVzdChzdHJ1Y3QgaW5vZGUgKmlub2RlLCB1bnNpZ25lZCBtYXNrKQpAQCAtNDU2LDkgKzQ1OCw5IEBACiAJc3RydWN0IGNlcGhfaW5vZGVfaW5mbyAqY2kgPSBjZXBoX2lub2RlKGlub2RlKTsKIAlib29sIHI7CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlyID0gKGNpLT5pX2NlcGhfZmxhZ3MgJiBtYXNrKSA9PSBtYXNrOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlyZXR1cm4gcjsKIH0KIApAQCAtNTA4LDkgKzUxMCw5IEBACiBzdGF0aWMgaW5saW5lIGludCBjZXBoX2NhcHNfaXNzdWVkKHN0cnVjdCBjZXBoX2lub2RlX2luZm8gKmNpKQogewogCWludCBpc3N1ZWQ7Ci0Jc3Bpbl9sb2NrKCZjaS0+dmZzX2lub2RlLmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWlzc3VlZCA9IF9fY2VwaF9jYXBzX2lzc3VlZChjaSwgTlVMTCk7Ci0Jc3Bpbl91bmxvY2soJmNpLT52ZnNfaW5vZGUuaV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlyZXR1cm4gaXNzdWVkOwogfQogCkBAIC01MTgsOSArNTIwLDkgQEAKIAkJCQkJaW50IHRvdWNoKQogewogCWludCByOwotCXNwaW5fbG9jaygmY2ktPnZmc19pbm9kZS5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlyID0gX19jZXBoX2NhcHNfaXNzdWVkX21hc2soY2ksIG1hc2ssIHRvdWNoKTsKLQlzcGluX3VubG9jaygmY2ktPnZmc19pbm9kZS5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCXJldHVybiByOwogfQogCkBAIC03NDMsMTAgKzc0NSw5IEBACiBleHRlcm4gdm9pZCBfX2NlcGhfcmVtb3ZlX2NhcChzdHJ1Y3QgY2VwaF9jYXAgKmNhcCk7CiBzdGF0aWMgaW5saW5lIHZvaWQgY2VwaF9yZW1vdmVfY2FwKHN0cnVjdCBjZXBoX2NhcCAqY2FwKQogewotCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSAmY2FwLT5jaS0+dmZzX2lub2RlOwotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjYXAtPmNpLT5pX2NlcGhfbG9jayk7CiAJX19jZXBoX3JlbW92ZV9jYXAoY2FwKTsKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNhcC0+Y2ktPmlfY2VwaF9sb2NrKTsKIH0KIGV4dGVybiB2b2lkIGNlcGhfcHV0X2NhcChzdHJ1Y3QgY2VwaF9tZHNfY2xpZW50ICptZHNjLAogCQkJIHN0cnVjdCBjZXBoX2NhcCAqY2FwKTsKZGlmZiAtLWdpdCBhL2ZzL2NlcGgveGF0dHIuYyBiL2ZzL2NlcGgveGF0dHIuYwppbmRleCA5NmM2NzM5Li5hNWUzNmU0IDEwMDY0NAotLS0gYS9mcy9jZXBoL3hhdHRyLmMKKysrIGIvZnMvY2VwaC94YXR0ci5jCkBAIC0zNDMsOCArMzQzLDggQEAKIH0KIAogc3RhdGljIGludCBfX2J1aWxkX3hhdHRycyhzdHJ1Y3QgaW5vZGUgKmlub2RlKQotCV9fcmVsZWFzZXMoaW5vZGUtPmlfbG9jaykKLQlfX2FjcXVpcmVzKGlub2RlLT5pX2xvY2spCisJX19yZWxlYXNlcyhjaS0+aV9jZXBoX2xvY2spCisJX19hY3F1aXJlcyhjaS0+aV9jZXBoX2xvY2spCiB7CiAJdTMyIG5hbWVsZW47CiAJdTMyIG51bWF0dHIgPSAwOwpAQCAtMzcyLDcgKzM3Miw3IEBACiAJCWVuZCA9IHAgKyBjaS0+aV94YXR0cnMuYmxvYi0+dmVjLmlvdl9sZW47CiAJCWNlcGhfZGVjb2RlXzMyX3NhZmUoJnAsIGVuZCwgbnVtYXR0ciwgYmFkKTsKIAkJeGF0dHJfdmVyc2lvbiA9IGNpLT5pX3hhdHRycy52ZXJzaW9uOwotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCiAJCXhhdHRycyA9IGtjYWxsb2MobnVtYXR0ciwgc2l6ZW9mKHN0cnVjdCBjZXBoX3hhdHRyICopLAogCQkJCSBHRlBfTk9GUyk7CkBAIC0zODcsNyArMzg3LDcgQEAKIAkJCQlnb3RvIGJhZF9sb2NrOwogCQl9CiAKLQkJc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwkJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQlpZiAoY2ktPmlfeGF0dHJzLnZlcnNpb24gIT0geGF0dHJfdmVyc2lvbikgewogCQkJLyogbG9zdCBhIHJhY2UsIHJldHJ5ICovCiAJCQlmb3IgKGkgPSAwOyBpIDwgbnVtYXR0cjsgaSsrKQpAQCAtNDE4LDcgKzQxOCw3IEBACiAKIAlyZXR1cm4gZXJyOwogYmFkX2xvY2s6Ci0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiBiYWQ6CiAJaWYgKHhhdHRycykgewogCQlmb3IgKGkgPSAwOyBpIDwgbnVtYXR0cjsgaSsrKQpAQCAtNTEyLDcgKzUxMiw3IEBACiAJaWYgKHZ4YXR0cnMpCiAJCXZ4YXR0ciA9IGNlcGhfbWF0Y2hfdnhhdHRyKHZ4YXR0cnMsIG5hbWUpOwogCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJZG91dCgiZ2V0eGF0dHIgJXAgdmVyPSVsbGQgaW5kZXhfdmVyPSVsbGRcbiIsIGlub2RlLAogCSAgICAgY2ktPmlfeGF0dHJzLnZlcnNpb24sIGNpLT5pX3hhdHRycy5pbmRleF92ZXJzaW9uKTsKIApAQCAtNTIwLDE0ICs1MjAsMTQgQEAKIAkgICAgKGNpLT5pX3hhdHRycy5pbmRleF92ZXJzaW9uID49IGNpLT5pX3hhdHRycy52ZXJzaW9uKSkgewogCQlnb3RvIGdldF94YXR0cjsKIAl9IGVsc2UgewotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQkvKiBnZXQgeGF0dHJzIGZyb20gbWRzIChpZiB3ZSBkb24ndCBhbHJlYWR5IGhhdmUgdGhlbSkgKi8KIAkJZXJyID0gY2VwaF9kb19nZXRhdHRyKGlub2RlLCBDRVBIX1NUQVRfQ0FQX1hBVFRSKTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfQogCi0Jc3Bpbl9sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAKIAlpZiAodnhhdHRyICYmIHZ4YXR0ci0+cmVhZG9ubHkpIHsKIAkJZXJyID0gdnhhdHRyLT5nZXR4YXR0cl9jYihjaSwgdmFsdWUsIHNpemUpOwpAQCAtNTU4LDcgKzU1OCw3IEBACiAJbWVtY3B5KHZhbHVlLCB4YXR0ci0+dmFsLCB4YXR0ci0+dmFsX2xlbik7CiAKIG91dDoKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNTczLDcgKzU3Myw3IEBACiAJdTMyIGxlbjsKIAlpbnQgaTsKIAotCXNwaW5fbG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl9sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWRvdXQoImxpc3R4YXR0ciAlcCB2ZXI9JWxsZCBpbmRleF92ZXI9JWxsZFxuIiwgaW5vZGUsCiAJICAgICBjaS0+aV94YXR0cnMudmVyc2lvbiwgY2ktPmlfeGF0dHJzLmluZGV4X3ZlcnNpb24pOwogCkBAIC01ODEsMTMgKzU4MSwxMyBAQAogCSAgICAoY2ktPmlfeGF0dHJzLmluZGV4X3ZlcnNpb24gPj0gY2ktPmlfeGF0dHJzLnZlcnNpb24pKSB7CiAJCWdvdG8gbGlzdF94YXR0cjsKIAl9IGVsc2UgewotCQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCQllcnIgPSBjZXBoX2RvX2dldGF0dHIoaW5vZGUsIENFUEhfU1RBVF9DQVBfWEFUVFIpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAogCWVyciA9IF9fYnVpbGRfeGF0dHJzKGlub2RlKTsKIAlpZiAoZXJyIDwgMCkKQEAgLTYxOSw3ICs2MTksNyBAQAogCQl9CiAKIG91dDoKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNzM5LDcgKzczOSw3IEBACiAJaWYgKCF4YXR0cikKIAkJZ290byBvdXQ7CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIHJldHJ5OgogCWlzc3VlZCA9IF9fY2VwaF9jYXBzX2lzc3VlZChjaSwgTlVMTCk7CiAJaWYgKCEoaXNzdWVkICYgQ0VQSF9DQVBfWEFUVFJfRVhDTCkpCkBAIC03NTIsMTIgKzc1MiwxMiBAQAogCSAgICByZXF1aXJlZF9ibG9iX3NpemUgPiBjaS0+aV94YXR0cnMucHJlYWxsb2NfYmxvYi0+YWxsb2NfbGVuKSB7CiAJCXN0cnVjdCBjZXBoX2J1ZmZlciAqYmxvYiA9IE5VTEw7CiAKLQkJc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAkJZG91dCgiIHByZWFhbGxvY2F0aW5nIG5ldyBibG9iIHNpemU9JWRcbiIsIHJlcXVpcmVkX2Jsb2Jfc2l6ZSk7CiAJCWJsb2IgPSBjZXBoX2J1ZmZlcl9uZXcocmVxdWlyZWRfYmxvYl9zaXplLCBHRlBfTk9GUyk7CiAJCWlmICghYmxvYikKIAkJCWdvdG8gb3V0OwotCQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCQlzcGluX2xvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJCWlmIChjaS0+aV94YXR0cnMucHJlYWxsb2NfYmxvYikKIAkJCWNlcGhfYnVmZmVyX3B1dChjaS0+aV94YXR0cnMucHJlYWxsb2NfYmxvYik7CiAJCWNpLT5pX3hhdHRycy5wcmVhbGxvY19ibG9iID0gYmxvYjsKQEAgLTc3MCwxMyArNzcwLDEzIEBACiAJZGlydHkgPSBfX2NlcGhfbWFya19kaXJ0eV9jYXBzKGNpLCBDRVBIX0NBUF9YQVRUUl9FWENMKTsKIAljaS0+aV94YXR0cnMuZGlydHkgPSB0cnVlOwogCWlub2RlLT5pX2N0aW1lID0gQ1VSUkVOVF9USU1FOwotCXNwaW5fdW5sb2NrKCZpbm9kZS0+aV9sb2NrKTsKKwlzcGluX3VubG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlpZiAoZGlydHkpCiAJCV9fbWFya19pbm9kZV9kaXJ0eShpbm9kZSwgZGlydHkpOwogCXJldHVybiBlcnI7CiAKIGRvX3N5bmM6Ci0Jc3Bpbl91bmxvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fdW5sb2NrKCZjaS0+aV9jZXBoX2xvY2spOwogCWVyciA9IGNlcGhfc3luY19zZXR4YXR0cihkZW50cnksIG5hbWUsIHZhbHVlLCBzaXplLCBmbGFncyk7CiBvdXQ6CiAJa2ZyZWUobmV3bmFtZSk7CkBAIC04MzMsNyArODMzLDcgQEAKIAkJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQlzcGluX2xvY2soJmlub2RlLT5pX2xvY2spOworCXNwaW5fbG9jaygmY2ktPmlfY2VwaF9sb2NrKTsKIAlfX2J1aWxkX3hhdHRycyhpbm9kZSk7CiAJaXNzdWVkID0gX19jZXBoX2NhcHNfaXNzdWVkKGNpLCBOVUxMKTsKIAlkb3V0KCJyZW1vdmV4YXR0ciAlcCBpc3N1ZWQgJXNcbiIsIGlub2RlLCBjZXBoX2NhcF9zdHJpbmcoaXNzdWVkKSk7CkBAIC04NDYsMTIgKzg0NiwxMiBAQAogCWNpLT5pX3hhdHRycy5kaXJ0eSA9IHRydWU7CiAJaW5vZGUtPmlfY3RpbWUgPSBDVVJSRU5UX1RJTUU7CiAKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJaWYgKGRpcnR5KQogCQlfX21hcmtfaW5vZGVfZGlydHkoaW5vZGUsIGRpcnR5KTsKIAlyZXR1cm4gZXJyOwogZG9fc3luYzoKLQlzcGluX3VubG9jaygmaW5vZGUtPmlfbG9jayk7CisJc3Bpbl91bmxvY2soJmNpLT5pX2NlcGhfbG9jayk7CiAJZXJyID0gY2VwaF9zZW5kX3JlbW92ZXhhdHRyKGRlbnRyeSwgbmFtZSk7CiAJcmV0dXJuIGVycjsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvY29ubmVjdC5jIGIvZnMvY2lmcy9jb25uZWN0LmMKaW5kZXggZDZhOTcyZC4uZjM2NzBjZiAxMDA2NDQKLS0tIGEvZnMvY2lmcy9jb25uZWN0LmMKKysrIGIvZnMvY2lmcy9jb25uZWN0LmMKQEAgLTI4Miw3ICsyODIsNyBAQAogCWJ5dGVfY291bnQgPSBiZTMyX3RvX2NwdShwVGFyZ2V0U01CLT5zbWJfYnVmX2xlbmd0aCk7CiAJYnl0ZV9jb3VudCArPSB0b3RhbF9pbl9idWYyOwogCS8qIGRvbid0IGFsbG93IGJ1ZmZlciB0byBvdmVyZmxvdyAqLwotCWlmIChieXRlX2NvdW50ID4gQ0lGU01heEJ1ZlNpemUpCisJaWYgKGJ5dGVfY291bnQgPiBDSUZTTWF4QnVmU2l6ZSArIE1BWF9DSUZTX0hEUl9TSVpFIC0gNCkKIAkJcmV0dXJuIC1FTk9CVUZTOwogCXBUYXJnZXRTTUItPnNtYl9idWZfbGVuZ3RoID0gY3B1X3RvX2JlMzIoYnl0ZV9jb3VudCk7CiAKQEAgLTQ0MSw2ICs0NDEsOCBAQAogCXNtYl9tc2cubXNnX2NvbnRyb2xsZW4gPSAwOwogCiAJZm9yICh0b3RhbF9yZWFkID0gMDsgdG9fcmVhZDsgdG90YWxfcmVhZCArPSBsZW5ndGgsIHRvX3JlYWQgLT0gbGVuZ3RoKSB7CisJCXRyeV90b19mcmVlemUoKTsKKwogCQlpZiAoc2VydmVyX3VucmVzcG9uc2l2ZShzZXJ2ZXIpKSB7CiAJCQl0b3RhbF9yZWFkID0gLUVBR0FJTjsKIAkJCWJyZWFrOwpAQCAtMjEyMCw3ICsyMTIyLDcgQEAKIAkJd2FybmVkX29uX250bG0gPSB0cnVlOwogCQljRVJST1IoMSwgImRlZmF1bHQgc2VjdXJpdHkgbWVjaGFuaXNtIHJlcXVlc3RlZC4gIFRoZSBkZWZhdWx0ICIKIAkJCSJzZWN1cml0eSBtZWNoYW5pc20gd2lsbCBiZSB1cGdyYWRlZCBmcm9tIG50bG0gdG8gIgotCQkJIm50bG12MiBpbiBrZXJuZWwgcmVsZWFzZSAzLjIiKTsKKwkJCSJudGxtdjIgaW4ga2VybmVsIHJlbGVhc2UgMy4zIik7CiAJfQogCXNlcy0+b3ZlcnJpZGVTZWNGbGcgPSB2b2x1bWVfaW5mby0+c2VjRmxnOwogCmRpZmYgLS1naXQgYS9mcy9jaWZzL2ZpbGUuYyBiL2ZzL2NpZnMvZmlsZS5jCmluZGV4IGNmMGIxNTMuLjRkZDkyODMgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvZmlsZS5jCisrKyBiL2ZzL2NpZnMvZmlsZS5jCkBAIC03MDIsNiArNzAyLDEzIEBACiAJCQkJCSBsb2NrLT50eXBlLCBsb2NrLT5uZXRmaWQsIGNvbmZfbG9jayk7CiB9CiAKKy8qCisgKiBDaGVjayBpZiB0aGVyZSBpcyBhbm90aGVyIGxvY2sgdGhhdCBwcmV2ZW50cyB1cyB0byBzZXQgdGhlIGxvY2sgKG1hbmRhdG9yeQorICogc3R5bGUpLiBJZiBzdWNoIGEgbG9jayBleGlzdHMsIHVwZGF0ZSB0aGUgZmxvY2sgc3RydWN0dXJlIHdpdGggaXRzCisgKiBwcm9wZXJ0aWVzLiBPdGhlcndpc2UsIHNldCB0aGUgZmxvY2sgdHlwZSB0byBGX1VOTENLIGlmIHdlIGNhbiBjYWNoZSBicmxvY2tzCisgKiBvciBsZWF2ZSBpdCB0aGUgc2FtZSBpZiB3ZSBjYW4ndC4gUmV0dXJucyAwIGlmIHdlIGRvbid0IG5lZWQgdG8gcmVxdWVzdCB0bworICogdGhlIHNlcnZlciBvciAxIG90aGVyd2lzZS4KKyAqLwogc3RhdGljIGludAogY2lmc19sb2NrX3Rlc3Qoc3RydWN0IGNpZnNJbm9kZUluZm8gKmNpbm9kZSwgX191NjQgb2Zmc2V0LCBfX3U2NCBsZW5ndGgsCiAJICAgICAgIF9fdTggdHlwZSwgX191MTYgbmV0ZmlkLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbG9jaykKQEAgLTczOSw2ICs3NDYsMTIgQEAKIAltdXRleF91bmxvY2soJmNpbm9kZS0+bG9ja19tdXRleCk7CiB9CiAKKy8qCisgKiBTZXQgdGhlIGJ5dGUtcmFuZ2UgbG9jayAobWFuZGF0b3J5IHN0eWxlKS4gUmV0dXJuczoKKyAqIDEpIDAsIGlmIHdlIHNldCB0aGUgbG9jayBhbmQgZG9uJ3QgbmVlZCB0byByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXI7CisgKiAyKSAxLCBpZiBubyBsb2NrcyBwcmV2ZW50IHVzIGJ1dCB3ZSBuZWVkIHRvIHJlcXVlc3QgdG8gdGhlIHNlcnZlcjsKKyAqIDMpIC1FQUNDRVNTLCBpZiB0aGVyZSBpcyBhIGxvY2sgdGhhdCBwcmV2ZW50cyB1cyBhbmQgd2FpdCBpcyBmYWxzZS4KKyAqLwogc3RhdGljIGludAogY2lmc19sb2NrX2FkZF9pZihzdHJ1Y3QgY2lmc0lub2RlSW5mbyAqY2lub2RlLCBzdHJ1Y3QgY2lmc0xvY2tJbmZvICpsb2NrLAogCQkgYm9vbCB3YWl0KQpAQCAtNzc4LDYgKzc5MSwxMyBAQAogCXJldHVybiByYzsKIH0KIAorLyoKKyAqIENoZWNrIGlmIHRoZXJlIGlzIGFub3RoZXIgbG9jayB0aGF0IHByZXZlbnRzIHVzIHRvIHNldCB0aGUgbG9jayAocG9zaXgKKyAqIHN0eWxlKS4gSWYgc3VjaCBhIGxvY2sgZXhpc3RzLCB1cGRhdGUgdGhlIGZsb2NrIHN0cnVjdHVyZSB3aXRoIGl0cworICogcHJvcGVydGllcy4gT3RoZXJ3aXNlLCBzZXQgdGhlIGZsb2NrIHR5cGUgdG8gRl9VTkxDSyBpZiB3ZSBjYW4gY2FjaGUgYnJsb2NrcworICogb3IgbGVhdmUgaXQgdGhlIHNhbWUgaWYgd2UgY2FuJ3QuIFJldHVybnMgMCBpZiB3ZSBkb24ndCBuZWVkIHRvIHJlcXVlc3QgdG8KKyAqIHRoZSBzZXJ2ZXIgb3IgMSBvdGhlcndpc2UuCisgKi8KIHN0YXRpYyBpbnQKIGNpZnNfcG9zaXhfbG9ja190ZXN0KHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgZmlsZV9sb2NrICpmbG9jaykKIHsKQEAgLTgwMCw2ICs4MjAsMTIgQEAKIAlyZXR1cm4gcmM7CiB9CiAKKy8qCisgKiBTZXQgdGhlIGJ5dGUtcmFuZ2UgbG9jayAocG9zaXggc3R5bGUpLiBSZXR1cm5zOgorICogMSkgMCwgaWYgd2Ugc2V0IHRoZSBsb2NrIGFuZCBkb24ndCBuZWVkIHRvIHJlcXVlc3QgdG8gdGhlIHNlcnZlcjsKKyAqIDIpIDEsIGlmIHdlIG5lZWQgdG8gcmVxdWVzdCB0byB0aGUgc2VydmVyOworICogMykgPDAsIGlmIHRoZSBlcnJvciBvY2N1cnMgd2hpbGUgc2V0dGluZyB0aGUgbG9jay4KKyAqLwogc3RhdGljIGludAogY2lmc19wb3NpeF9sb2NrX3NldChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IGZpbGVfbG9jayAqZmxvY2spCiB7CmRpZmYgLS1naXQgYS9mcy9jaWZzL3JlYWRkaXIuYyBiL2ZzL2NpZnMvcmVhZGRpci5jCmluZGV4IDVkZTAzZWMuLmEwOTBiYmUgMTAwNjQ0Ci0tLSBhL2ZzL2NpZnMvcmVhZGRpci5jCisrKyBiL2ZzL2NpZnMvcmVhZGRpci5jCkBAIC01NTQsNyArNTU0LDEwIEBACiAJCQkJIHJjKTsKIAkJCXJldHVybiByYzsKIAkJfQotCQljaWZzX3NhdmVfcmVzdW1lX2tleShjaWZzRmlsZS0+c3JjaF9pbmYubGFzdF9lbnRyeSwgY2lmc0ZpbGUpOworCQkvKiBGaW5kRmlyc3QvTmV4dCBzZXQgbGFzdF9lbnRyeSB0byBOVUxMIG9uIG1hbGZvcm1lZCByZXBseSAqLworCQlpZiAoY2lmc0ZpbGUtPnNyY2hfaW5mLmxhc3RfZW50cnkpCisJCQljaWZzX3NhdmVfcmVzdW1lX2tleShjaWZzRmlsZS0+c3JjaF9pbmYubGFzdF9lbnRyeSwKKwkJCQkJCWNpZnNGaWxlKTsKIAl9CiAKIAl3aGlsZSAoKGluZGV4X3RvX2ZpbmQgPj0gY2lmc0ZpbGUtPnNyY2hfaW5mLmluZGV4X29mX2xhc3RfZW50cnkpICYmCkBAIC01NjIsNyArNTY1LDEwIEBACiAJCWNGWUkoMSwgImNhbGxpbmcgZmluZG5leHQyIik7CiAJCXJjID0gQ0lGU0ZpbmROZXh0KHhpZCwgcFRjb24sIGNpZnNGaWxlLT5uZXRmaWQsCiAJCQkJICAmY2lmc0ZpbGUtPnNyY2hfaW5mKTsKLQkJY2lmc19zYXZlX3Jlc3VtZV9rZXkoY2lmc0ZpbGUtPnNyY2hfaW5mLmxhc3RfZW50cnksIGNpZnNGaWxlKTsKKwkJLyogRmluZEZpcnN0L05leHQgc2V0IGxhc3RfZW50cnkgdG8gTlVMTCBvbiBtYWxmb3JtZWQgcmVwbHkgKi8KKwkJaWYgKGNpZnNGaWxlLT5zcmNoX2luZi5sYXN0X2VudHJ5KQorCQkJY2lmc19zYXZlX3Jlc3VtZV9rZXkoY2lmc0ZpbGUtPnNyY2hfaW5mLmxhc3RfZW50cnksCisJCQkJCQljaWZzRmlsZSk7CiAJCWlmIChyYykKIAkJCXJldHVybiAtRU5PRU5UOwogCX0KZGlmZiAtLWdpdCBhL2ZzL2NpZnMvc21iZW5jcnlwdC5jIGIvZnMvY2lmcy9zbWJlbmNyeXB0LmMKaW5kZXggN2NhY2JhMS4uODBkODUwOCAxMDA2NDQKLS0tIGEvZnMvY2lmcy9zbWJlbmNyeXB0LmMKKysrIGIvZnMvY2lmcy9zbWJlbmNyeXB0LmMKQEAgLTIwOSw3ICsyMDksNyBAQAogewogCWludCByYzsKIAlpbnQgbGVuOwotCV9fdTE2IHdwd2RbMTI5XTsKKwlfX2xlMTYgd3B3ZFsxMjldOwogCiAJLyogUGFzc3dvcmQgY2Fubm90IGJlIGxvbmdlciB0aGFuIDEyOCBjaGFyYWN0ZXJzICovCiAJaWYgKHBhc3N3ZCkgLyogUGFzc3dvcmQgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gTlQgdW5pY29kZSAqLwpAQCAtMjE5LDggKzIxOSw4IEBACiAJCSp3cHdkID0gMDsgLyogRW5zdXJlIHN0cmluZyBpcyBudWxsIHRlcm1pbmF0ZWQgKi8KIAl9CiAKLQlyYyA9IG1kZm91cihwMTYsICh1bnNpZ25lZCBjaGFyICopIHdwd2QsIGxlbiAqIHNpemVvZihfX3UxNikpOwotCW1lbXNldCh3cHdkLCAwLCAxMjkgKiBzaXplb2YoX191MTYpKTsKKwlyYyA9IG1kZm91cihwMTYsICh1bnNpZ25lZCBjaGFyICopIHdwd2QsIGxlbiAqIHNpemVvZihfX2xlMTYpKTsKKwltZW1zZXQod3B3ZCwgMCwgMTI5ICogc2l6ZW9mKF9fbGUxNikpOwogCiAJcmV0dXJuIHJjOwogfQpkaWZmIC0tZ2l0IGEvZnMvY29tcGF0X2lvY3RsLmMgYi9mcy9jb21wYXRfaW9jdGwuYwppbmRleCA1MTM1MmRlLi5hMTBlNDI4IDEwMDY0NAotLS0gYS9mcy9jb21wYXRfaW9jdGwuYworKysgYi9mcy9jb21wYXRfaW9jdGwuYwpAQCAtMTUwNiwzNSArMTUwNiw2IEBACiAJcmV0dXJuIC1FTk9JT0NUTENNRDsKIH0KIAotc3RhdGljIHZvaWQgY29tcGF0X2lvY3RsX2Vycm9yKHN0cnVjdCBmaWxlICpmaWxwLCB1bnNpZ25lZCBpbnQgZmQsCi0JCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQotewotCWNoYXIgYnVmWzEwXTsKLQljaGFyICpmbiA9ICI/IjsKLQljaGFyICpwYXRoOwotCi0JLyogZmluZCB0aGUgbmFtZSBvZiB0aGUgZGV2aWNlLiAqLwotCXBhdGggPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAocGF0aCkgewotCQlmbiA9IGRfcGF0aCgmZmlscC0+Zl9wYXRoLCBwYXRoLCBQQUdFX1NJWkUpOwotCQlpZiAoSVNfRVJSKGZuKSkKLQkJCWZuID0gIj8iOwotCX0KLQotCSBzcHJpbnRmKGJ1ZiwiJyVjJyIsIChjbWQ+Pl9JT0NfVFlQRVNISUZUKSAmIF9JT0NfVFlQRU1BU0spOwotCWlmICghaXNwcmludChidWZbMV0pKQotCQlzcHJpbnRmKGJ1ZiwgIiUwMngiLCBidWZbMV0pOwotCWNvbXBhdF9wcmludGsoImlvY3RsMzIoJXM6JWQpOiBVbmtub3duIGNtZCBmZCglZCkgIgotCQkJImNtZCglMDh4KXt0OiVzO3N6OiV1fSBhcmcoJTA4eCkgb24gJXNcbiIsCi0JCQljdXJyZW50LT5jb21tLCBjdXJyZW50LT5waWQsCi0JCQkoaW50KWZkLCAodW5zaWduZWQgaW50KWNtZCwgYnVmLAotCQkJKGNtZCA+PiBfSU9DX1NJWkVTSElGVCkgJiBfSU9DX1NJWkVNQVNLLAotCQkJKHVuc2lnbmVkIGludClhcmcsIGZuKTsKLQotCWlmIChwYXRoKQotCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGF0aCk7Ci19Ci0KIHN0YXRpYyBpbnQgY29tcGF0X2lvY3RsX2NoZWNrX3RhYmxlKHVuc2lnbmVkIGludCB4Y21kKQogewogCWludCBpOwpAQCAtMTYyMSwxMyArMTU5Miw4IEBACiAJCWdvdG8gZm91bmRfaGFuZGxlcjsKIAogCWVycm9yID0gZG9faW9jdGxfdHJhbnMoZmQsIGNtZCwgYXJnLCBmaWxwKTsKLQlpZiAoZXJyb3IgPT0gLUVOT0lPQ1RMQ01EKSB7Ci0JCXN0YXRpYyBpbnQgY291bnQ7Ci0KLQkJaWYgKCsrY291bnQgPD0gNTApCi0JCQljb21wYXRfaW9jdGxfZXJyb3IoZmlscCwgZmQsIGNtZCwgYXJnKTsKLQkJZXJyb3IgPSAtRUlOVkFMOwotCX0KKwlpZiAoZXJyb3IgPT0gLUVOT0lPQ1RMQ01EKQorCQllcnJvciA9IC1FTk9UVFk7CiAKIAlnb3RvIG91dF9mcHV0OwogCmRpZmYgLS1naXQgYS9mcy9jb25maWdmcy9pbm9kZS5jIGIvZnMvY29uZmlnZnMvaW5vZGUuYwppbmRleCBjYTQxOGFhLi45ZDg3MTVjIDEwMDY0NAotLS0gYS9mcy9jb25maWdmcy9pbm9kZS5jCisrKyBiL2ZzL2NvbmZpZ2ZzL2lub2RlLmMKQEAgLTI5Miw3ICsyOTIsNyBAQAogCXJldHVybiBiZGlfaW5pdCgmY29uZmlnZnNfYmFja2luZ19kZXZfaW5mbyk7CiB9CiAKLXZvaWQgX19leGl0IGNvbmZpZ2ZzX2lub2RlX2V4aXQodm9pZCkKK3ZvaWQgY29uZmlnZnNfaW5vZGVfZXhpdCh2b2lkKQogewogCWJkaV9kZXN0cm95KCZjb25maWdmc19iYWNraW5nX2Rldl9pbmZvKTsKIH0KZGlmZiAtLWdpdCBhL2ZzL2NvbmZpZ2ZzL21vdW50LmMgYi9mcy9jb25maWdmcy9tb3VudC5jCmluZGV4IGVjYzYyMTcuLjI3NmUxNWMgMTAwNjQ0Ci0tLSBhL2ZzL2NvbmZpZ2ZzL21vdW50LmMKKysrIGIvZnMvY29uZmlnZnMvbW91bnQuYwpAQCAtMTQzLDI4ICsxNDMsMjYgQEAKIAkJZ290byBvdXQ7CiAKIAljb25maWdfa29iaiA9IGtvYmplY3RfY3JlYXRlX2FuZF9hZGQoImNvbmZpZyIsIGtlcm5lbF9rb2JqKTsKLQlpZiAoIWNvbmZpZ19rb2JqKSB7Ci0JCWttZW1fY2FjaGVfZGVzdHJveShjb25maWdmc19kaXJfY2FjaGVwKTsKLQkJY29uZmlnZnNfZGlyX2NhY2hlcCA9IE5VTEw7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmNvbmZpZ2ZzX2ZzX3R5cGUpOwotCWlmIChlcnIpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJjb25maWdmczogVW5hYmxlIHRvIHJlZ2lzdGVyIGZpbGVzeXN0ZW0hXG4iKTsKLQkJa29iamVjdF9wdXQoY29uZmlnX2tvYmopOwotCQlrbWVtX2NhY2hlX2Rlc3Ryb3koY29uZmlnZnNfZGlyX2NhY2hlcCk7Ci0JCWNvbmZpZ2ZzX2Rpcl9jYWNoZXAgPSBOVUxMOwotCQlnb3RvIG91dDsKLQl9CisJaWYgKCFjb25maWdfa29iaikKKwkJZ290byBvdXQyOwogCiAJZXJyID0gY29uZmlnZnNfaW5vZGVfaW5pdCgpOwotCWlmIChlcnIpIHsKLQkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZjb25maWdmc19mc190eXBlKTsKLQkJa29iamVjdF9wdXQoY29uZmlnX2tvYmopOwotCQlrbWVtX2NhY2hlX2Rlc3Ryb3koY29uZmlnZnNfZGlyX2NhY2hlcCk7Ci0JCWNvbmZpZ2ZzX2Rpcl9jYWNoZXAgPSBOVUxMOwotCX0KKwlpZiAoZXJyKQorCQlnb3RvIG91dDM7CisKKwllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZjb25maWdmc19mc190eXBlKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDQ7CisKKwlyZXR1cm4gMDsKK291dDQ6CisJcHJpbnRrKEtFUk5fRVJSICJjb25maWdmczogVW5hYmxlIHRvIHJlZ2lzdGVyIGZpbGVzeXN0ZW0hXG4iKTsKKwljb25maWdmc19pbm9kZV9leGl0KCk7CitvdXQzOgorCWtvYmplY3RfcHV0KGNvbmZpZ19rb2JqKTsKK291dDI6CisJa21lbV9jYWNoZV9kZXN0cm95KGNvbmZpZ2ZzX2Rpcl9jYWNoZXApOworCWNvbmZpZ2ZzX2Rpcl9jYWNoZXAgPSBOVUxMOwogb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9kY2FjaGUuYyBiL2ZzL2RjYWNoZS5jCmluZGV4IDEwYmE5MmQuLjg5NTA5YjUgMTAwNjQ0Ci0tLSBhL2ZzL2RjYWNoZS5jCisrKyBiL2ZzL2RjYWNoZS5jCkBAIC0yNDM5LDE2ICsyNDM5LDE0IEBACiAvKioKICAqIHByZXBlbmRfcGF0aCAtIFByZXBlbmQgcGF0aCBzdHJpbmcgdG8gYSBidWZmZXIKICAqIEBwYXRoOiB0aGUgZGVudHJ5L3Zmc21vdW50IHRvIHJlcG9ydAotICogQHJvb3Q6IHJvb3QgdmZzbW50L2RlbnRyeSAobWF5IGJlIG1vZGlmaWVkIGJ5IHRoaXMgZnVuY3Rpb24pCisgKiBAcm9vdDogcm9vdCB2ZnNtbnQvZGVudHJ5CiAgKiBAYnVmZmVyOiBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgogICogQGJ1ZmxlbjogcG9pbnRlciB0byBidWZmZXIgbGVuZ3RoCiAgKgogICogQ2FsbGVyIGhvbGRzIHRoZSByZW5hbWVfbG9jay4KLSAqCi0gKiBJZiBwYXRoIGlzIG5vdCByZWFjaGFibGUgZnJvbSB0aGUgc3VwcGxpZWQgcm9vdCwgdGhlbiB0aGUgdmFsdWUgb2YKLSAqIHJvb3QgaXMgY2hhbmdlZCAod2l0aG91dCBtb2RpZnlpbmcgcmVmY291bnRzKS4KICAqLwotc3RhdGljIGludCBwcmVwZW5kX3BhdGgoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBwYXRoICpyb290LAorc3RhdGljIGludCBwcmVwZW5kX3BhdGgoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsCisJCQljb25zdCBzdHJ1Y3QgcGF0aCAqcm9vdCwKIAkJCWNoYXIgKipidWZmZXIsIGludCAqYnVmbGVuKQogewogCXN0cnVjdCBkZW50cnkgKmRlbnRyeSA9IHBhdGgtPmRlbnRyeTsKQEAgLTI0ODMsMTAgKzI0ODEsMTAgQEAKIAkJZGVudHJ5ID0gcGFyZW50OwogCX0KIAotb3V0OgogCWlmICghZXJyb3IgJiYgIXNsYXNoKQogCQllcnJvciA9IHByZXBlbmQoYnVmZmVyLCBidWZsZW4sICIvIiwgMSk7CiAKK291dDoKIAlicl9yZWFkX3VubG9jayh2ZnNtb3VudF9sb2NrKTsKIAlyZXR1cm4gZXJyb3I7CiAKQEAgLTI1MDAsMTUgKzI0OTgsMTcgQEAKIAkJV0FSTigxLCAiUm9vdCBkZW50cnkgaGFzIHdlaXJkIG5hbWUgPCUuKnM+XG4iLAogCQkgICAgIChpbnQpIGRlbnRyeS0+ZF9uYW1lLmxlbiwgZGVudHJ5LT5kX25hbWUubmFtZSk7CiAJfQotCXJvb3QtPm1udCA9IHZmc21udDsKLQlyb290LT5kZW50cnkgPSBkZW50cnk7CisJaWYgKCFzbGFzaCkKKwkJZXJyb3IgPSBwcmVwZW5kKGJ1ZmZlciwgYnVmbGVuLCAiLyIsIDEpOworCWlmICghZXJyb3IpCisJCWVycm9yID0gdmZzbW50LT5tbnRfbnMgPyAxIDogMjsKIAlnb3RvIG91dDsKIH0KIAogLyoqCiAgKiBfX2RfcGF0aCAtIHJldHVybiB0aGUgcGF0aCBvZiBhIGRlbnRyeQogICogQHBhdGg6IHRoZSBkZW50cnkvdmZzbW91bnQgdG8gcmVwb3J0Ci0gKiBAcm9vdDogcm9vdCB2ZnNtbnQvZGVudHJ5IChtYXkgYmUgbW9kaWZpZWQgYnkgdGhpcyBmdW5jdGlvbikKKyAqIEByb290OiByb290IHZmc21udC9kZW50cnkKICAqIEBidWY6IGJ1ZmZlciB0byByZXR1cm4gdmFsdWUgaW4KICAqIEBidWZsZW46IGJ1ZmZlciBsZW5ndGgKICAqCkBAIC0yNTE5LDEwICsyNTE5LDEwIEBACiAgKgogICogImJ1ZmxlbiIgc2hvdWxkIGJlIHBvc2l0aXZlLgogICoKLSAqIElmIHBhdGggaXMgbm90IHJlYWNoYWJsZSBmcm9tIHRoZSBzdXBwbGllZCByb290LCB0aGVuIHRoZSB2YWx1ZSBvZgotICogcm9vdCBpcyBjaGFuZ2VkICh3aXRob3V0IG1vZGlmeWluZyByZWZjb3VudHMpLgorICogSWYgdGhlIHBhdGggaXMgbm90IHJlYWNoYWJsZSBmcm9tIHRoZSBzdXBwbGllZCByb290LCByZXR1cm4gJU5VTEwuCiAgKi8KLWNoYXIgKl9fZF9wYXRoKGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoLCBzdHJ1Y3QgcGF0aCAqcm9vdCwKK2NoYXIgKl9fZF9wYXRoKGNvbnN0IHN0cnVjdCBwYXRoICpwYXRoLAorCSAgICAgICBjb25zdCBzdHJ1Y3QgcGF0aCAqcm9vdCwKIAkgICAgICAgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQogewogCWNoYXIgKnJlcyA9IGJ1ZiArIGJ1ZmxlbjsKQEAgLTI1MzMsNyArMjUzMywyOCBAQAogCWVycm9yID0gcHJlcGVuZF9wYXRoKHBhdGgsIHJvb3QsICZyZXMsICZidWZsZW4pOwogCXdyaXRlX3NlcXVubG9jaygmcmVuYW1lX2xvY2spOwogCi0JaWYgKGVycm9yKQorCWlmIChlcnJvciA8IDApCisJCXJldHVybiBFUlJfUFRSKGVycm9yKTsKKwlpZiAoZXJyb3IgPiAwKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gcmVzOworfQorCitjaGFyICpkX2Fic29sdXRlX3BhdGgoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsCisJICAgICAgIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlzdHJ1Y3QgcGF0aCByb290ID0ge307CisJY2hhciAqcmVzID0gYnVmICsgYnVmbGVuOworCWludCBlcnJvcjsKKworCXByZXBlbmQoJnJlcywgJmJ1ZmxlbiwgIlwwIiwgMSk7CisJd3JpdGVfc2VxbG9jaygmcmVuYW1lX2xvY2spOworCWVycm9yID0gcHJlcGVuZF9wYXRoKHBhdGgsICZyb290LCAmcmVzLCAmYnVmbGVuKTsKKwl3cml0ZV9zZXF1bmxvY2soJnJlbmFtZV9sb2NrKTsKKworCWlmIChlcnJvciA+IDEpCisJCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CiAJcmV0dXJuIHJlczsKIH0KQEAgLTI1NDEsOCArMjU2Miw5IEBACiAvKgogICogc2FtZSBhcyBfX2RfcGF0aCBidXQgYXBwZW5kcyAiKGRlbGV0ZWQpIiBmb3IgdW5saW5rZWQgZmlsZXMuCiAgKi8KLXN0YXRpYyBpbnQgcGF0aF93aXRoX2RlbGV0ZWQoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBwYXRoICpyb290LAotCQkJCSBjaGFyICoqYnVmLCBpbnQgKmJ1ZmxlbikKK3N0YXRpYyBpbnQgcGF0aF93aXRoX2RlbGV0ZWQoY29uc3Qgc3RydWN0IHBhdGggKnBhdGgsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBwYXRoICpyb290LAorCQkJICAgICBjaGFyICoqYnVmLCBpbnQgKmJ1ZmxlbikKIHsKIAlwcmVwZW5kKGJ1ZiwgYnVmbGVuLCAiXDAiLCAxKTsKIAlpZiAoZF91bmxpbmtlZChwYXRoLT5kZW50cnkpKSB7CkBAIC0yNTc5LDcgKzI2MDEsNiBAQAogewogCWNoYXIgKnJlcyA9IGJ1ZiArIGJ1ZmxlbjsKIAlzdHJ1Y3QgcGF0aCByb290OwotCXN0cnVjdCBwYXRoIHRtcDsKIAlpbnQgZXJyb3I7CiAKIAkvKgpAQCAtMjU5NCw5ICsyNjE1LDggQEAKIAogCWdldF9mc19yb290KGN1cnJlbnQtPmZzLCAmcm9vdCk7CiAJd3JpdGVfc2VxbG9jaygmcmVuYW1lX2xvY2spOwotCXRtcCA9IHJvb3Q7Ci0JZXJyb3IgPSBwYXRoX3dpdGhfZGVsZXRlZChwYXRoLCAmdG1wLCAmcmVzLCAmYnVmbGVuKTsKLQlpZiAoZXJyb3IpCisJZXJyb3IgPSBwYXRoX3dpdGhfZGVsZXRlZChwYXRoLCAmcm9vdCwgJnJlcywgJmJ1Zmxlbik7CisJaWYgKGVycm9yIDwgMCkKIAkJcmVzID0gRVJSX1BUUihlcnJvcik7CiAJd3JpdGVfc2VxdW5sb2NrKCZyZW5hbWVfbG9jayk7CiAJcGF0aF9wdXQoJnJvb3QpOwpAQCAtMjYxNyw3ICsyNjM3LDYgQEAKIHsKIAljaGFyICpyZXMgPSBidWYgKyBidWZsZW47CiAJc3RydWN0IHBhdGggcm9vdDsKLQlzdHJ1Y3QgcGF0aCB0bXA7CiAJaW50IGVycm9yOwogCiAJaWYgKHBhdGgtPmRlbnRyeS0+ZF9vcCAmJiBwYXRoLT5kZW50cnktPmRfb3AtPmRfZG5hbWUpCkBAIC0yNjI1LDkgKzI2NDQsOCBAQAogCiAJZ2V0X2ZzX3Jvb3QoY3VycmVudC0+ZnMsICZyb290KTsKIAl3cml0ZV9zZXFsb2NrKCZyZW5hbWVfbG9jayk7Ci0JdG1wID0gcm9vdDsKLQllcnJvciA9IHBhdGhfd2l0aF9kZWxldGVkKHBhdGgsICZ0bXAsICZyZXMsICZidWZsZW4pOwotCWlmICghZXJyb3IgJiYgIXBhdGhfZXF1YWwoJnRtcCwgJnJvb3QpKQorCWVycm9yID0gcGF0aF93aXRoX2RlbGV0ZWQocGF0aCwgJnJvb3QsICZyZXMsICZidWZsZW4pOworCWlmIChlcnJvciA+IDApCiAJCWVycm9yID0gcHJlcGVuZF91bnJlYWNoYWJsZSgmcmVzLCAmYnVmbGVuKTsKIAl3cml0ZV9zZXF1bmxvY2soJnJlbmFtZV9sb2NrKTsKIAlwYXRoX3B1dCgmcm9vdCk7CkBAIC0yNzU4LDE5ICsyNzc2LDE4IEBACiAJd3JpdGVfc2VxbG9jaygmcmVuYW1lX2xvY2spOwogCWlmICghZF91bmxpbmtlZChwd2QuZGVudHJ5KSkgewogCQl1bnNpZ25lZCBsb25nIGxlbjsKLQkJc3RydWN0IHBhdGggdG1wID0gcm9vdDsKIAkJY2hhciAqY3dkID0gcGFnZSArIFBBR0VfU0laRTsKIAkJaW50IGJ1ZmxlbiA9IFBBR0VfU0laRTsKIAogCQlwcmVwZW5kKCZjd2QsICZidWZsZW4sICJcMCIsIDEpOwotCQllcnJvciA9IHByZXBlbmRfcGF0aCgmcHdkLCAmdG1wLCAmY3dkLCAmYnVmbGVuKTsKKwkJZXJyb3IgPSBwcmVwZW5kX3BhdGgoJnB3ZCwgJnJvb3QsICZjd2QsICZidWZsZW4pOwogCQl3cml0ZV9zZXF1bmxvY2soJnJlbmFtZV9sb2NrKTsKIAotCQlpZiAoZXJyb3IpCisJCWlmIChlcnJvciA8IDApCiAJCQlnb3RvIG91dDsKIAogCQkvKiBVbnJlYWNoYWJsZSBmcm9tIGN1cnJlbnQgcm9vdCAqLwotCQlpZiAoIXBhdGhfZXF1YWwoJnRtcCwgJnJvb3QpKSB7CisJCWlmIChlcnJvciA+IDApIHsKIAkJCWVycm9yID0gcHJlcGVuZF91bnJlYWNoYWJsZSgmY3dkLCAmYnVmbGVuKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIG91dDsKZGlmZiAtLWdpdCBhL2ZzL2RsbS9sb3djb21tcy5jIGIvZnMvZGxtL2xvd2NvbW1zLmMKaW5kZXggOTkwNjI2ZS4uMGIzMTA5ZSAxMDA2NDQKLS0tIGEvZnMvZGxtL2xvd2NvbW1zLmMKKysrIGIvZnMvZGxtL2xvd2NvbW1zLmMKQEAgLTI4MSw3ICsyODEsNyBAQAogCX0gZWxzZSB7CiAJCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmluNiAgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmYWRkcjsKIAkJc3RydWN0IHNvY2thZGRyX2luNiAqcmV0NiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHJldGFkZHI7Ci0JCWlwdjZfYWRkcl9jb3B5KCZyZXQ2LT5zaW42X2FkZHIsICZpbjYtPnNpbjZfYWRkcik7CisJCXJldDYtPnNpbjZfYWRkciA9IGluNi0+c2luNl9hZGRyOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzLmMgYi9mcy9leHQ0L2V4dGVudHMuYwppbmRleCA2MWZhOWUxLi42MDdiMTU1IDEwMDY0NAotLS0gYS9mcy9leHQ0L2V4dGVudHMuYworKysgYi9mcy9leHQ0L2V4dGVudHMuYwpAQCAtMTA5NSw3ICsxMDk1LDcgQEAKIAkJICBsZTMyX3RvX2NwdShFWFRfRklSU1RfSU5ERVgobmVoKS0+ZWlfYmxvY2spLAogCQkgIGV4dDRfaWR4X3BibG9jayhFWFRfRklSU1RfSU5ERVgobmVoKSkpOwogCi0JbmVoLT5laF9kZXB0aCA9IGNwdV90b19sZTE2KG5laC0+ZWhfZGVwdGggKyAxKTsKKwluZWgtPmVoX2RlcHRoID0gY3B1X3RvX2xlMTYobGUxNl90b19jcHUobmVoLT5laF9kZXB0aCkgKyAxKTsKIAlleHQ0X21hcmtfaW5vZGVfZGlydHkoaGFuZGxlLCBpbm9kZSk7CiBvdXQ6CiAJYnJlbHNlKGJoKTsKQEAgLTI5NTUsNyArMjk1NSw2IEBACiAJLyogUHJlLWNvbmRpdGlvbnMgKi8KIAlCVUdfT04oIWV4dDRfZXh0X2lzX3VuaW5pdGlhbGl6ZWQoZXgpKTsKIAlCVUdfT04oIWluX3JhbmdlKG1hcC0+bV9sYmxrLCBlZV9ibG9jaywgZWVfbGVuKSk7Ci0JQlVHX09OKG1hcC0+bV9sYmxrICsgbWFwLT5tX2xlbiA+IGVlX2Jsb2NrICsgZWVfbGVuKTsKIAogCS8qCiAJICogQXR0ZW1wdCB0byB0cmFuc2ZlciBuZXdseSBpbml0aWFsaXplZCBibG9ja3MgZnJvbSB0aGUgY3VycmVudGx5CmRpZmYgLS1naXQgYS9mcy9leHQ0L2lub2RlLmMgYi9mcy9leHQ0L2lub2RlLmMKaW5kZXggODQ4ZjQzNi4uOTI2NTVmZCAxMDA2NDQKLS0tIGEvZnMvZXh0NC9pbm9kZS5jCisrKyBiL2ZzL2V4dDQvaW5vZGUuYwpAQCAtMTMzOSw4ICsxMzM5LDExIEBACiAJCQkJCWNsZWFyX2J1ZmZlcl91bndyaXR0ZW4oYmgpOwogCQkJCX0KIAotCQkJCS8qIHNraXAgcGFnZSBpZiBibG9jayBhbGxvY2F0aW9uIHVuZG9uZSAqLwotCQkJCWlmIChidWZmZXJfZGVsYXkoYmgpIHx8IGJ1ZmZlcl91bndyaXR0ZW4oYmgpKQorCQkJCS8qCisJCQkJICogc2tpcCBwYWdlIGlmIGJsb2NrIGFsbG9jYXRpb24gdW5kb25lIGFuZAorCQkJCSAqIGJsb2NrIGlzIGRpcnR5CisJCQkJICovCisJCQkJaWYgKGV4dDRfYmhfZGVsYXlfb3JfdW53cml0dGVuKE5VTEwsIGJoKSkKIAkJCQkJc2tpcF9wYWdlID0gMTsKIAkJCQliaCA9IGJoLT5iX3RoaXNfcGFnZTsKIAkJCQlibG9ja19zdGFydCArPSBiaC0+Yl9zaXplOwpAQCAtMjM4Nyw3ICsyMzkwLDYgQEAKIAlwZ29mZl90IGluZGV4OwogCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBtYXBwaW5nLT5ob3N0OwogCWhhbmRsZV90ICpoYW5kbGU7Ci0JbG9mZl90IHBhZ2VfbGVuOwogCiAJaW5kZXggPSBwb3MgPj4gUEFHRV9DQUNIRV9TSElGVDsKIApAQCAtMjQzNCwxMyArMjQzNiw2IEBACiAJCSAqLwogCQlpZiAocG9zICsgbGVuID4gaW5vZGUtPmlfc2l6ZSkKIAkJCWV4dDRfdHJ1bmNhdGVfZmFpbGVkX3dyaXRlKGlub2RlKTsKLQl9IGVsc2UgewotCQlwYWdlX2xlbiA9IHBvcyAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKTsKLQkJaWYgKHBhZ2VfbGVuID4gMCkgewotCQkJcmV0ID0gZXh0NF9kaXNjYXJkX3BhcnRpYWxfcGFnZV9idWZmZXJzX25vX2xvY2soaGFuZGxlLAotCQkJCWlub2RlLCBwYWdlLCBwb3MgLSBwYWdlX2xlbiwgcGFnZV9sZW4sCi0JCQkJRVhUNF9ESVNDQVJEX1BBUlRJQUxfUEdfWkVST19VTk1BUFBFRCk7Ci0JCX0KIAl9CiAKIAlpZiAocmV0ID09IC1FTk9TUEMgJiYgZXh0NF9zaG91bGRfcmV0cnlfYWxsb2MoaW5vZGUtPmlfc2IsICZyZXRyaWVzKSkKQEAgLTI0ODMsNyArMjQ3OCw2IEBACiAJbG9mZl90IG5ld19pX3NpemU7CiAJdW5zaWduZWQgbG9uZyBzdGFydCwgZW5kOwogCWludCB3cml0ZV9tb2RlID0gKGludCkodW5zaWduZWQgbG9uZylmc2RhdGE7Ci0JbG9mZl90IHBhZ2VfbGVuOwogCiAJaWYgKHdyaXRlX21vZGUgPT0gRkFMTF9CQUNLX1RPX05PTkRFTEFMTE9DKSB7CiAJCWlmIChleHQ0X3Nob3VsZF9vcmRlcl9kYXRhKGlub2RlKSkgewpAQCAtMjUwOCw3ICsyNTAyLDcgQEAKIAkgKi8KIAogCW5ld19pX3NpemUgPSBwb3MgKyBjb3BpZWQ7Ci0JaWYgKG5ld19pX3NpemUgPiBFWFQ0X0koaW5vZGUpLT5pX2Rpc2tzaXplKSB7CisJaWYgKGNvcGllZCAmJiBuZXdfaV9zaXplID4gRVhUNF9JKGlub2RlKS0+aV9kaXNrc2l6ZSkgewogCQlpZiAoZXh0NF9kYV9zaG91bGRfdXBkYXRlX2lfZGlza3NpemUocGFnZSwgZW5kKSkgewogCQkJZG93bl93cml0ZSgmRVhUNF9JKGlub2RlKS0+aV9kYXRhX3NlbSk7CiAJCQlpZiAobmV3X2lfc2l6ZSA+IEVYVDRfSShpbm9kZSktPmlfZGlza3NpemUpIHsKQEAgLTI1MzIsMTYgKzI1MjYsNiBAQAogCX0KIAlyZXQyID0gZ2VuZXJpY193cml0ZV9lbmQoZmlsZSwgbWFwcGluZywgcG9zLCBsZW4sIGNvcGllZCwKIAkJCQkJCQlwYWdlLCBmc2RhdGEpOwotCi0JcGFnZV9sZW4gPSBQQUdFX0NBQ0hFX1NJWkUgLQotCQkJKChwb3MgKyBjb3BpZWQgLSAxKSAmIChQQUdFX0NBQ0hFX1NJWkUgLSAxKSk7Ci0KLQlpZiAocGFnZV9sZW4gPiAwKSB7Ci0JCXJldCA9IGV4dDRfZGlzY2FyZF9wYXJ0aWFsX3BhZ2VfYnVmZmVyc19ub19sb2NrKGhhbmRsZSwKLQkJCWlub2RlLCBwYWdlLCBwb3MgKyBjb3BpZWQgLSAxLCBwYWdlX2xlbiwKLQkJCUVYVDRfRElTQ0FSRF9QQVJUSUFMX1BHX1pFUk9fVU5NQVBQRUQpOwotCX0KLQogCWNvcGllZCA9IHJldDI7CiAJaWYgKHJldDIgPCAwKQogCQlyZXQgPSByZXQyOwpAQCAtMjc4MSwxMCArMjc2NSwxMSBAQAogIAkJICBpb2NiLT5wcml2YXRlLCBpb19lbmQtPmlub2RlLT5pX2lubywgaW9jYiwgb2Zmc2V0LAogCQkgIHNpemUpOwogCisJaW9jYi0+cHJpdmF0ZSA9IE5VTEw7CisKIAkvKiBpZiBub3QgYWlvIGRpbyB3aXRoIHVud3JpdHRlbiBleHRlbnRzLCBqdXN0IGZyZWUgaW8gYW5kIHJldHVybiAqLwogCWlmICghKGlvX2VuZC0+ZmxhZyAmIEVYVDRfSU9fRU5EX1VOV1JJVFRFTikpIHsKIAkJZXh0NF9mcmVlX2lvX2VuZChpb19lbmQpOwotCQlpb2NiLT5wcml2YXRlID0gTlVMTDsKIG91dDoKIAkJaWYgKGlzX2FzeW5jKQogCQkJYWlvX2NvbXBsZXRlKGlvY2IsIHJldCwgMCk7CkBAIC0yODA3LDcgKzI3OTIsNiBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVpLT5pX2NvbXBsZXRlZF9pb19sb2NrLCBmbGFncyk7CiAKIAkvKiBxdWV1ZSB0aGUgd29yayB0byBjb252ZXJ0IHVud3JpdHRlbiBleHRlbnRzIHRvIHdyaXR0ZW4gKi8KLQlpb2NiLT5wcml2YXRlID0gTlVMTDsKIAlxdWV1ZV93b3JrKHdxLCAmaW9fZW5kLT53b3JrKTsKIAogCS8qIFhYWDogcHJvYmFibHkgc2hvdWxkIG1vdmUgaW50byB0aGUgcmVhbCBJL08gY29tcGxldGlvbiBoYW5kbGVyICovCkBAIC0zMjAzLDI2ICszMTg3LDggQEAKIAogCWlibG9jayA9IGluZGV4IDw8IChQQUdFX0NBQ0hFX1NISUZUIC0gaW5vZGUtPmlfc2ItPnNfYmxvY2tzaXplX2JpdHMpOwogCi0JaWYgKCFwYWdlX2hhc19idWZmZXJzKHBhZ2UpKSB7Ci0JCS8qCi0JCSAqIElmIHRoZSByYW5nZSB0byBiZSBkaXNjYXJkZWQgY292ZXJzIGEgcGFydGlhbCBibG9jawotCQkgKiB3ZSBuZWVkIHRvIGdldCB0aGUgcGFnZSBidWZmZXJzLiAgVGhpcyBpcyBiZWNhdXNlCi0JCSAqIHBhcnRpYWwgYmxvY2tzIGNhbm5vdCBiZSByZWxlYXNlZCBhbmQgdGhlIHBhZ2UgbmVlZHMKLQkJICogdG8gYmUgdXBkYXRlZCB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgYmxvY2sgYmVmb3JlCi0JCSAqIHdlIHdyaXRlIHRoZSB6ZXJvcyBvbiB0b3Agb2YgaXQuCi0JCSAqLwotCQlpZiAoKGZyb20gJiAoYmxvY2tzaXplIC0gMSkpIHx8Ci0JCSAgICAoKGZyb20gKyBsZW5ndGgpICYgKGJsb2Nrc2l6ZSAtIDEpKSkgewotCQkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAwKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBJZiB0aGVyZSBhcmUgbm8gcGFydGlhbCBibG9ja3MsCi0JCQkgKiB0aGVyZSBpcyBub3RoaW5nIHRvIHVwZGF0ZSwKLQkJCSAqIHNvIHdlIGNhbiByZXR1cm4gbm93Ci0JCQkgKi8KLQkJCXJldHVybiAwOwotCQl9Ci0JfQorCWlmICghcGFnZV9oYXNfYnVmZmVycyhwYWdlKSkKKwkJY3JlYXRlX2VtcHR5X2J1ZmZlcnMocGFnZSwgYmxvY2tzaXplLCAwKTsKIAogCS8qIEZpbmQgdGhlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zICJvZmZzZXQiICovCiAJYmggPSBwYWdlX2J1ZmZlcnMocGFnZSk7CmRpZmYgLS1naXQgYS9mcy9leHQ0L3BhZ2UtaW8uYyBiL2ZzL2V4dDQvcGFnZS1pby5jCmluZGV4IDdjZTFkMGIuLjdlMTA2YzggMTAwNjQ0Ci0tLSBhL2ZzL2V4dDQvcGFnZS1pby5jCisrKyBiL2ZzL2V4dDQvcGFnZS1pby5jCkBAIC0zODUsNiArMzg1LDE4IEBACiAKIAkJYmxvY2tfZW5kID0gYmxvY2tfc3RhcnQgKyBibG9ja3NpemU7CiAJCWlmIChibG9ja19zdGFydCA+PSBsZW4pIHsKKwkJCS8qCisJCQkgKiBDb21tZW50cyBjb3BpZWQgZnJvbSBibG9ja193cml0ZV9mdWxsX3BhZ2VfZW5kaW86CisJCQkgKgorCQkJICogVGhlIHBhZ2Ugc3RyYWRkbGVzIGlfc2l6ZS4gIEl0IG11c3QgYmUgemVyb2VkIG91dCBvbgorCQkJICogZWFjaCBhbmQgZXZlcnkgd3JpdGVwYWdlIGludm9jYXRpb24gYmVjYXVzZSBpdCBtYXkKKwkJCSAqIGJlIG1tYXBwZWQuICAiQSBmaWxlIGlzIG1hcHBlZCBpbiBtdWx0aXBsZXMgb2YgdGhlCisJCQkgKiBwYWdlIHNpemUuICBGb3IgYSBmaWxlIHRoYXQgaXMgbm90IGEgbXVsdGlwbGUgb2YKKwkJCSAqIHRoZSAgcGFnZSBzaXplLCB0aGUgcmVtYWluaW5nIG1lbW9yeSBpcyB6ZXJvZWQgd2hlbgorCQkJICogbWFwcGVkLCBhbmQgd3JpdGVzIHRvIHRoYXQgcmVnaW9uIGFyZSBub3Qgd3JpdHRlbgorCQkJICogb3V0IHRvIHRoZSBmaWxlLiIKKwkJCSAqLworCQkJemVyb191c2VyX3NlZ21lbnQocGFnZSwgYmxvY2tfc3RhcnQsIGJsb2NrX2VuZCk7CiAJCQljbGVhcl9idWZmZXJfZGlydHkoYmgpOwogCQkJc2V0X2J1ZmZlcl91cHRvZGF0ZShiaCk7CiAJCQljb250aW51ZTsKZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwppbmRleCAzODU4NzY3Li4zZTEzMjllIDEwMDY0NAotLS0gYS9mcy9leHQ0L3N1cGVyLmMKKysrIGIvZnMvZXh0NC9zdXBlci5jCkBAIC0xMTU1LDkgKzExNTUsOSBAQAogCQlzZXFfcHV0cyhzZXEsICIsYmxvY2tfdmFsaWRpdHkiKTsKIAogCWlmICghdGVzdF9vcHQoc2IsIElOSVRfSU5PREVfVEFCTEUpKQotCQlzZXFfcHV0cyhzZXEsICIsbm9pbml0X2lub2RlX3RhYmxlIik7CisJCXNlcV9wdXRzKHNlcSwgIixub2luaXRfaXRhYmxlIik7CiAJZWxzZSBpZiAoc2JpLT5zX2xpX3dhaXRfbXVsdCAhPSBFWFQ0X0RFRl9MSV9XQUlUX01VTFQpCi0JCXNlcV9wcmludGYoc2VxLCAiLGluaXRfaW5vZGVfdGFibGU9JXUiLAorCQlzZXFfcHJpbnRmKHNlcSwgIixpbml0X2l0YWJsZT0ldSIsCiAJCQkgICAodW5zaWduZWQpIHNiaS0+c19saV93YWl0X211bHQpOwogCiAJZXh0NF9zaG93X3F1b3RhX29wdGlvbnMoc2VxLCBzYik7CkBAIC0xMzMzLDggKzEzMzMsNyBAQAogCU9wdF9ub21ibGtfaW9fc3VibWl0LCBPcHRfYmxvY2tfdmFsaWRpdHksIE9wdF9ub2Jsb2NrX3ZhbGlkaXR5LAogCU9wdF9pbm9kZV9yZWFkYWhlYWRfYmxrcywgT3B0X2pvdXJuYWxfaW9wcmlvLAogCU9wdF9kaW9yZWFkX25vbG9jaywgT3B0X2Rpb3JlYWRfbG9jaywKLQlPcHRfZGlzY2FyZCwgT3B0X25vZGlzY2FyZCwKLQlPcHRfaW5pdF9pbm9kZV90YWJsZSwgT3B0X25vaW5pdF9pbm9kZV90YWJsZSwKKwlPcHRfZGlzY2FyZCwgT3B0X25vZGlzY2FyZCwgT3B0X2luaXRfaXRhYmxlLCBPcHRfbm9pbml0X2l0YWJsZSwKIH07CiAKIHN0YXRpYyBjb25zdCBtYXRjaF90YWJsZV90IHRva2VucyA9IHsKQEAgLTE0MDcsOSArMTQwNiw5IEBACiAJe09wdF9kaW9yZWFkX2xvY2ssICJkaW9yZWFkX2xvY2sifSwKIAl7T3B0X2Rpc2NhcmQsICJkaXNjYXJkIn0sCiAJe09wdF9ub2Rpc2NhcmQsICJub2Rpc2NhcmQifSwKLQl7T3B0X2luaXRfaW5vZGVfdGFibGUsICJpbml0X2l0YWJsZT0ldSJ9LAotCXtPcHRfaW5pdF9pbm9kZV90YWJsZSwgImluaXRfaXRhYmxlIn0sCi0Je09wdF9ub2luaXRfaW5vZGVfdGFibGUsICJub2luaXRfaXRhYmxlIn0sCisJe09wdF9pbml0X2l0YWJsZSwgImluaXRfaXRhYmxlPSV1In0sCisJe09wdF9pbml0X2l0YWJsZSwgImluaXRfaXRhYmxlIn0sCisJe09wdF9ub2luaXRfaXRhYmxlLCAibm9pbml0X2l0YWJsZSJ9LAogCXtPcHRfZXJyLCBOVUxMfSwKIH07CiAKQEAgLTE4OTIsNyArMTg5MSw3IEBACiAJCWNhc2UgT3B0X2Rpb3JlYWRfbG9jazoKIAkJCWNsZWFyX29wdChzYiwgRElPUkVBRF9OT0xPQ0spOwogCQkJYnJlYWs7Ci0JCWNhc2UgT3B0X2luaXRfaW5vZGVfdGFibGU6CisJCWNhc2UgT3B0X2luaXRfaXRhYmxlOgogCQkJc2V0X29wdChzYiwgSU5JVF9JTk9ERV9UQUJMRSk7CiAJCQlpZiAoYXJnc1swXS5mcm9tKSB7CiAJCQkJaWYgKG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCkBAIC0xOTAzLDcgKzE5MDIsNyBAQAogCQkJCXJldHVybiAwOwogCQkJc2JpLT5zX2xpX3dhaXRfbXVsdCA9IG9wdGlvbjsKIAkJCWJyZWFrOwotCQljYXNlIE9wdF9ub2luaXRfaW5vZGVfdGFibGU6CisJCWNhc2UgT3B0X25vaW5pdF9pdGFibGU6CiAJCQljbGVhcl9vcHQoc2IsIElOSVRfSU5PREVfVEFCTEUpOwogCQkJYnJlYWs7CiAJCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9mcy9mcy13cml0ZWJhY2suYyBiL2ZzL2ZzLXdyaXRlYmFjay5jCmluZGV4IDczYzM5OTIuLjUxN2YyMTEgMTAwNjQ0Ci0tLSBhL2ZzL2ZzLXdyaXRlYmFjay5jCisrKyBiL2ZzL2ZzLXdyaXRlYmFjay5jCkBAIC00NywxNyArNDcsNiBAQAogCXN0cnVjdCBjb21wbGV0aW9uICpkb25lOwkvKiBzZXQgaWYgdGhlIGNhbGxlciB3YWl0cyAqLwogfTsKIAotY29uc3QgY2hhciAqd2JfcmVhc29uX25hbWVbXSA9IHsKLQlbV0JfUkVBU09OX0JBQ0tHUk9VTkRdCQk9ICJiYWNrZ3JvdW5kIiwKLQlbV0JfUkVBU09OX1RSWV9UT19GUkVFX1BBR0VTXQk9ICJ0cnlfdG9fZnJlZV9wYWdlcyIsCi0JW1dCX1JFQVNPTl9TWU5DXQkJPSAic3luYyIsCi0JW1dCX1JFQVNPTl9QRVJJT0RJQ10JCT0gInBlcmlvZGljIiwKLQlbV0JfUkVBU09OX0xBUFRPUF9USU1FUl0JPSAibGFwdG9wX3RpbWVyIiwKLQlbV0JfUkVBU09OX0ZSRUVfTU9SRV9NRU1dCT0gImZyZWVfbW9yZV9tZW1vcnkiLAotCVtXQl9SRUFTT05fRlNfRlJFRV9TUEFDRV0JPSAiZnNfZnJlZV9zcGFjZSIsCi0JW1dCX1JFQVNPTl9GT1JLRVJfVEhSRUFEXQk9ICJmb3JrZXJfdGhyZWFkIgotfTsKLQogLyoKICAqIEluY2x1ZGUgdGhlIGNyZWF0aW9uIG9mIHRoZSB0cmFjZSBwb2ludHMgYWZ0ZXIgZGVmaW5pbmcgdGhlCiAgKiB3Yl93cml0ZWJhY2tfd29yayBzdHJ1Y3R1cmUgc28gdGhhdCB0aGUgZGVmaW5pdGlvbiByZW1haW5zIGxvY2FsIHRvIHRoaXMKQEAgLTE1Niw2ICsxNDUsNyBAQAogICogYmRpX3N0YXJ0X3dyaXRlYmFjayAtIHN0YXJ0IHdyaXRlYmFjawogICogQGJkaTogdGhlIGJhY2tpbmcgZGV2aWNlIHRvIHdyaXRlIGZyb20KICAqIEBucl9wYWdlczogdGhlIG51bWJlciBvZiBwYWdlcyB0byB3cml0ZQorICogQHJlYXNvbjogcmVhc29uIHdoeSBzb21lIHdyaXRlYmFjayB3b3JrIHdhcyBpbml0aWF0ZWQKICAqCiAgKiBEZXNjcmlwdGlvbjoKICAqICAgVGhpcyBkb2VzIFdCX1NZTkNfTk9ORSBvcHBvcnR1bmlzdGljIHdyaXRlYmFjay4gVGhlIElPIGlzIG9ubHkKQEAgLTEyMjMsNiArMTIxMyw3IEBACiAgKiB3cml0ZWJhY2tfaW5vZGVzX3NiX25yIC0Jd3JpdGViYWNrIGRpcnR5IGlub2RlcyBmcm9tIGdpdmVuIHN1cGVyX2Jsb2NrCiAgKiBAc2I6IHRoZSBzdXBlcmJsb2NrCiAgKiBAbnI6IHRoZSBudW1iZXIgb2YgcGFnZXMgdG8gd3JpdGUKKyAqIEByZWFzb246IHJlYXNvbiB3aHkgc29tZSB3cml0ZWJhY2sgd29yayBpbml0aWF0ZWQKICAqCiAgKiBTdGFydCB3cml0ZWJhY2sgb24gc29tZSBpbm9kZXMgb24gdGhpcyBzdXBlcl9ibG9jay4gTm8gZ3VhcmFudGVlcyBhcmUgbWFkZQogICogb24gaG93IG1hbnkgKGlmIGFueSkgd2lsbCBiZSB3cml0dGVuLCBhbmQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB3YWl0CkBAIC0xMjUxLDYgKzEyNDIsNyBAQAogLyoqCiAgKiB3cml0ZWJhY2tfaW5vZGVzX3NiCS0Jd3JpdGViYWNrIGRpcnR5IGlub2RlcyBmcm9tIGdpdmVuIHN1cGVyX2Jsb2NrCiAgKiBAc2I6IHRoZSBzdXBlcmJsb2NrCisgKiBAcmVhc29uOiByZWFzb24gd2h5IHNvbWUgd3JpdGViYWNrIHdvcmsgd2FzIGluaXRpYXRlZAogICoKICAqIFN0YXJ0IHdyaXRlYmFjayBvbiBzb21lIGlub2RlcyBvbiB0aGlzIHN1cGVyX2Jsb2NrLiBObyBndWFyYW50ZWVzIGFyZSBtYWRlCiAgKiBvbiBob3cgbWFueSAoaWYgYW55KSB3aWxsIGJlIHdyaXR0ZW4sIGFuZCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHdhaXQKQEAgLTEyNjUsNiArMTI1Nyw3IEBACiAvKioKICAqIHdyaXRlYmFja19pbm9kZXNfc2JfaWZfaWRsZQktCXN0YXJ0IHdyaXRlYmFjayBpZiBub25lIHVuZGVyd2F5CiAgKiBAc2I6IHRoZSBzdXBlcmJsb2NrCisgKiBAcmVhc29uOiByZWFzb24gd2h5IHNvbWUgd3JpdGViYWNrIHdvcmsgd2FzIGluaXRpYXRlZAogICoKICAqIEludm9rZSB3cml0ZWJhY2tfaW5vZGVzX3NiIGlmIG5vIHdyaXRlYmFjayBpcyBjdXJyZW50bHkgdW5kZXJ3YXkuCiAgKiBSZXR1cm5zIDEgaWYgd3JpdGViYWNrIHdhcyBzdGFydGVkLCAwIGlmIG5vdC4KQEAgLTEyODUsNiArMTI3OCw3IEBACiAgKiB3cml0ZWJhY2tfaW5vZGVzX3NiX2lmX2lkbGUJLQlzdGFydCB3cml0ZWJhY2sgaWYgbm9uZSB1bmRlcndheQogICogQHNiOiB0aGUgc3VwZXJibG9jawogICogQG5yOiB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRvIHdyaXRlCisgKiBAcmVhc29uOiByZWFzb24gd2h5IHNvbWUgd3JpdGViYWNrIHdvcmsgd2FzIGluaXRpYXRlZAogICoKICAqIEludm9rZSB3cml0ZWJhY2tfaW5vZGVzX3NiIGlmIG5vIHdyaXRlYmFjayBpcyBjdXJyZW50bHkgdW5kZXJ3YXkuCiAgKiBSZXR1cm5zIDEgaWYgd3JpdGViYWNrIHdhcyBzdGFydGVkLCAwIGlmIG5vdC4KZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvZGV2LmMgYi9mcy9mdXNlL2Rldi5jCmluZGV4IDVjYjg2MTQuLjJhYWYzZWEgMTAwNjQ0Ci0tLSBhL2ZzL2Z1c2UvZGV2LmMKKysrIGIvZnMvZnVzZS9kZXYuYwpAQCAtMTUxMiw3ICsxNTEyLDcgQEAKIAllbHNlIGlmIChvdXRhcmctPm9mZnNldCArIG51bSA+IGZpbGVfc2l6ZSkKIAkJbnVtID0gZmlsZV9zaXplIC0gb3V0YXJnLT5vZmZzZXQ7CiAKLQl3aGlsZSAobnVtKSB7CisJd2hpbGUgKG51bSAmJiByZXEtPm51bV9wYWdlcyA8IEZVU0VfTUFYX1BBR0VTX1BFUl9SRVEpIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJCXVuc2lnbmVkIGludCB0aGlzX251bTsKIApAQCAtMTUyNiw2ICsxNTI2LDcgQEAKIAogCQludW0gLT0gdGhpc19udW07CiAJCXRvdGFsX2xlbiArPSB0aGlzX251bTsKKwkJaW5kZXgrKzsKIAl9CiAJcmVxLT5taXNjLnJldHJpZXZlX2luLm9mZnNldCA9IG91dGFyZy0+b2Zmc2V0OwogCXJlcS0+bWlzYy5yZXRyaWV2ZV9pbi5zaXplID0gdG90YWxfbGVuOwpkaWZmIC0tZ2l0IGEvZnMvZnVzZS9maWxlLmMgYi9mcy9mdXNlL2ZpbGUuYwppbmRleCA1OTRmMDdhLi4wYzg0MTAwIDEwMDY0NAotLS0gYS9mcy9mdXNlL2ZpbGUuYworKysgYi9mcy9mdXNlL2ZpbGUuYwpAQCAtMTU1Niw3ICsxNTU2LDcgQEAKIAlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlsZS0+Zl9wYXRoLmRlbnRyeS0+ZF9pbm9kZTsKIAogCW11dGV4X2xvY2soJmlub2RlLT5pX211dGV4KTsKLQlpZiAob3JpZ2luICE9IFNFRUtfQ1VSIHx8IG9yaWdpbiAhPSBTRUVLX1NFVCkgeworCWlmIChvcmlnaW4gIT0gU0VFS19DVVIgJiYgb3JpZ2luICE9IFNFRUtfU0VUKSB7CiAJCXJldHZhbCA9IGZ1c2VfdXBkYXRlX2F0dHJpYnV0ZXMoaW5vZGUsIE5VTEwsIGZpbGUsIE5VTEwpOwogCQlpZiAocmV0dmFsKQogCQkJZ290byBleGl0OwpAQCAtMTU2Nyw2ICsxNTY3LDEwIEBACiAJCW9mZnNldCArPSBpX3NpemVfcmVhZChpbm9kZSk7CiAJCWJyZWFrOwogCWNhc2UgU0VFS19DVVI6CisJCWlmIChvZmZzZXQgPT0gMCkgeworCQkJcmV0dmFsID0gZmlsZS0+Zl9wb3M7CisJCQlnb3RvIGV4aXQ7CisJCX0KIAkJb2Zmc2V0ICs9IGZpbGUtPmZfcG9zOwogCQlicmVhazsKIAljYXNlIFNFRUtfREFUQToKZGlmZiAtLWdpdCBhL2ZzL2Z1c2UvaW5vZGUuYyBiL2ZzL2Z1c2UvaW5vZGUuYwppbmRleCAzZTZkNzI3Li5hYTgzMTA5IDEwMDY0NAotLS0gYS9mcy9mdXNlL2lub2RlLmMKKysrIGIvZnMvZnVzZS9pbm9kZS5jCkBAIC0xMTM4LDI4ICsxMTM4LDI4IEBACiB7CiAJaW50IGVycjsKIAotCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmZ1c2VfZnNfdHlwZSk7Ci0JaWYgKGVycikKLQkJZ290byBvdXQ7Ci0KLQllcnIgPSByZWdpc3Rlcl9mdXNlYmxrKCk7Ci0JaWYgKGVycikKLQkJZ290byBvdXRfdW5yZWc7Ci0KIAlmdXNlX2lub2RlX2NhY2hlcCA9IGttZW1fY2FjaGVfY3JlYXRlKCJmdXNlX2lub2RlIiwKIAkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBmdXNlX2lub2RlKSwKIAkJCQkJICAgICAgMCwgU0xBQl9IV0NBQ0hFX0FMSUdOLAogCQkJCQkgICAgICBmdXNlX2lub2RlX2luaXRfb25jZSk7CiAJZXJyID0gLUVOT01FTTsKIAlpZiAoIWZ1c2VfaW5vZGVfY2FjaGVwKQotCQlnb3RvIG91dF91bnJlZzI7CisJCWdvdG8gb3V0OworCisJZXJyID0gcmVnaXN0ZXJfZnVzZWJsaygpOworCWlmIChlcnIpCisJCWdvdG8gb3V0MjsKKworCWVyciA9IHJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJmZ1c2VfZnNfdHlwZSk7CisJaWYgKGVycikKKwkJZ290byBvdXQzOwogCiAJcmV0dXJuIDA7CiAKLSBvdXRfdW5yZWcyOgorIG91dDM6CiAJdW5yZWdpc3Rlcl9mdXNlYmxrKCk7Ci0gb3V0X3VucmVnOgotCXVucmVnaXN0ZXJfZmlsZXN5c3RlbSgmZnVzZV9mc190eXBlKTsKKyBvdXQyOgorCWttZW1fY2FjaGVfZGVzdHJveShmdXNlX2lub2RlX2NhY2hlcCk7CiAgb3V0OgogCXJldHVybiBlcnI7CiB9CmRpZmYgLS1naXQgYS9mcy9pb2N0bC5jIGIvZnMvaW9jdGwuYwppbmRleCAxZDliOWZjLi4wNjY4MzZlIDEwMDY0NAotLS0gYS9mcy9pb2N0bC5jCisrKyBiL2ZzL2lvY3RsLmMKQEAgLTQyLDcgKzQyLDcgQEAKIAogCWVycm9yID0gZmlscC0+Zl9vcC0+dW5sb2NrZWRfaW9jdGwoZmlscCwgY21kLCBhcmcpOwogCWlmIChlcnJvciA9PSAtRU5PSU9DVExDTUQpCi0JCWVycm9yID0gLUVJTlZBTDsKKwkJZXJyb3IgPSAtRU5PVFRZOwogIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CmRpZmYgLS1naXQgYS9mcy9sb2Nrcy5jIGIvZnMvbG9ja3MuYwppbmRleCAzYjBkMDVkLi42Mzc2OTRiIDEwMDY0NAotLS0gYS9mcy9sb2Nrcy5jCisrKyBiL2ZzL2xvY2tzLmMKQEAgLTEyMDUsNiArMTIwNSw4IEBACiAJaW50IHdhbnRfd3JpdGUgPSAobW9kZSAmIE9fQUNDTU9ERSkgIT0gT19SRE9OTFk7CiAKIAluZXdfZmwgPSBsZWFzZV9hbGxvYyhOVUxMLCB3YW50X3dyaXRlID8gRl9XUkxDSyA6IEZfUkRMQ0spOworCWlmIChJU19FUlIobmV3X2ZsKSkKKwkJcmV0dXJuIFBUUl9FUlIobmV3X2ZsKTsKIAogCWxvY2tfZmxvY2tzKCk7CiAKQEAgLTEyMjEsMTIgKzEyMjMsNiBAQAogCQlpZiAoZmwtPmZsX293bmVyID09IGN1cnJlbnQtPmZpbGVzKQogCQkJaV9oYXZlX3RoaXNfbGVhc2UgPSAxOwogCi0JaWYgKElTX0VSUihuZXdfZmwpICYmICFpX2hhdmVfdGhpc19sZWFzZQotCQkJJiYgKChtb2RlICYgT19OT05CTE9DSykgPT0gMCkpIHsKLQkJZXJyb3IgPSBQVFJfRVJSKG5ld19mbCk7Ci0JCWdvdG8gb3V0OwotCX0KLQogCWJyZWFrX3RpbWUgPSAwOwogCWlmIChsZWFzZV9icmVha190aW1lID4gMCkgewogCQlicmVha190aW1lID0gamlmZmllcyArIGxlYXNlX2JyZWFrX3RpbWUgKiBIWjsKQEAgLTEyODQsOCArMTI4MCw3IEBACiAKIG91dDoKIAl1bmxvY2tfZmxvY2tzKCk7Ci0JaWYgKCFJU19FUlIobmV3X2ZsKSkKLQkJbG9ja3NfZnJlZV9sb2NrKG5ld19mbCk7CisJbG9ja3NfZnJlZV9sb2NrKG5ld19mbCk7CiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9mcy9taW5peC9pbm9kZS5jIGIvZnMvbWluaXgvaW5vZGUuYwppbmRleCAxZDllMzM5Li40ZDQ2YTZhIDEwMDY0NAotLS0gYS9mcy9taW5peC9pbm9kZS5jCisrKyBiL2ZzL21pbml4L2lub2RlLmMKQEAgLTI2MywyMyArMjYzLDYgQEAKIAkJZ290byBvdXRfbm9fcm9vdDsKIAl9CiAKLQlyZXQgPSAtRU5PTUVNOwotCXMtPnNfcm9vdCA9IGRfYWxsb2Nfcm9vdChyb290X2lub2RlKTsKLQlpZiAoIXMtPnNfcm9vdCkKLQkJZ290byBvdXRfaXB1dDsKLQotCWlmICghKHMtPnNfZmxhZ3MgJiBNU19SRE9OTFkpKSB7Ci0JCWlmIChzYmktPnNfdmVyc2lvbiAhPSBNSU5JWF9WMykgLyogc19zdGF0ZSBpcyBub3cgb3V0IGZyb20gVjMgc2IgKi8KLQkJCW1zLT5zX3N0YXRlICY9IH5NSU5JWF9WQUxJRF9GUzsKLQkJbWFya19idWZmZXJfZGlydHkoYmgpOwotCX0KLQlpZiAoIShzYmktPnNfbW91bnRfc3RhdGUgJiBNSU5JWF9WQUxJRF9GUykpCi0JCXByaW50aygiTUlOSVgtZnM6IG1vdW50aW5nIHVuY2hlY2tlZCBmaWxlIHN5c3RlbSwgIgotCQkJInJ1bm5pbmcgZnNjayBpcyByZWNvbW1lbmRlZFxuIik7Ci0gCWVsc2UgaWYgKHNiaS0+c19tb3VudF9zdGF0ZSAmIE1JTklYX0VSUk9SX0ZTKQotCQlwcmludGsoIk1JTklYLWZzOiBtb3VudGluZyBmaWxlIHN5c3RlbSB3aXRoIGVycm9ycywgIgotCQkJInJ1bm5pbmcgZnNjayBpcyByZWNvbW1lbmRlZFxuIik7Ci0KIAkvKiBBcHBhcmVudGx5IG1pbml4IGNhbiBjcmVhdGUgZmlsZXN5c3RlbXMgdGhhdCBhbGxvY2F0ZSBtb3JlIGJsb2NrcyBmb3IKIAkgKiB0aGUgYml0bWFwcyB0aGFuIG5lZWRlZC4gIFdlIHNpbXBseSBpZ25vcmUgdGhhdCwgYnV0IHZlcmlmeSBpdCBkaWRuJ3QKIAkgKiBjcmVhdGUgb25lIHdpdGggbm90IGVub3VnaCBibG9ja3MgYW5kIGJhaWwgb3V0IGlmIHNvLgpAQCAtMzAwLDYgKzI4MywyMyBAQAogCQlnb3RvIG91dF9pcHV0OwogCX0KIAorCXJldCA9IC1FTk9NRU07CisJcy0+c19yb290ID0gZF9hbGxvY19yb290KHJvb3RfaW5vZGUpOworCWlmICghcy0+c19yb290KQorCQlnb3RvIG91dF9pcHV0OworCisJaWYgKCEocy0+c19mbGFncyAmIE1TX1JET05MWSkpIHsKKwkJaWYgKHNiaS0+c192ZXJzaW9uICE9IE1JTklYX1YzKSAvKiBzX3N0YXRlIGlzIG5vdyBvdXQgZnJvbSBWMyBzYiAqLworCQkJbXMtPnNfc3RhdGUgJj0gfk1JTklYX1ZBTElEX0ZTOworCQltYXJrX2J1ZmZlcl9kaXJ0eShiaCk7CisJfQorCWlmICghKHNiaS0+c19tb3VudF9zdGF0ZSAmIE1JTklYX1ZBTElEX0ZTKSkKKwkJcHJpbnRrKCJNSU5JWC1mczogbW91bnRpbmcgdW5jaGVja2VkIGZpbGUgc3lzdGVtLCAiCisJCQkicnVubmluZyBmc2NrIGlzIHJlY29tbWVuZGVkXG4iKTsKKwllbHNlIGlmIChzYmktPnNfbW91bnRfc3RhdGUgJiBNSU5JWF9FUlJPUl9GUykKKwkJcHJpbnRrKCJNSU5JWC1mczogbW91bnRpbmcgZmlsZSBzeXN0ZW0gd2l0aCBlcnJvcnMsICIKKwkJCSJydW5uaW5nIGZzY2sgaXMgcmVjb21tZW5kZWRcbiIpOworCiAJcmV0dXJuIDA7CiAKIG91dF9pcHV0OgpkaWZmIC0tZ2l0IGEvZnMvbmFtZXNwYWNlLmMgYi9mcy9uYW1lc3BhY2UuYwppbmRleCA2ZDNhMTk2Li5jZmM2ZDQ0IDEwMDY0NAotLS0gYS9mcy9uYW1lc3BhY2UuYworKysgYi9mcy9uYW1lc3BhY2UuYwpAQCAtMTA0OCwxNSArMTA0OCwxMiBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0OwogCXNlcV9wdXRjKG0sICcgJyk7Ci0Jc2VxX3BhdGhfcm9vdChtLCAmbW50X3BhdGgsICZyb290LCAiIFx0XG5cXCIpOwotCWlmIChyb290Lm1udCAhPSBwLT5yb290Lm1udCB8fCByb290LmRlbnRyeSAhPSBwLT5yb290LmRlbnRyeSkgewotCQkvKgotCQkgKiBNb3VudHBvaW50IGlzIG91dHNpZGUgcm9vdCwgZGlzY2FyZCB0aGF0IG9uZS4gIFVnbHksCi0JCSAqIGJ1dCBsZXNzIHNvIHRoYW4gdHJ5aW5nIHRvIGRvIHRoYXQgaW4gaXRlcmF0b3IgaW4gYQotCQkgKiByYWNlLWZyZWUgd2F5IChkdWUgdG8gcmVuYW1lcykuCi0JCSAqLwotCQlyZXR1cm4gU0VRX1NLSVA7Ci0JfQorCisJLyogbW91bnRwb2ludHMgb3V0c2lkZSBvZiBjaHJvb3QgamFpbCB3aWxsIGdpdmUgU0VRX1NLSVAgb24gdGhpcyAqLworCWVyciA9IHNlcV9wYXRoX3Jvb3QobSwgJm1udF9wYXRoLCAmcm9vdCwgIiBcdFxuXFwiKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwogCXNlcV9wdXRzKG0sIG1udC0+bW50X2ZsYWdzICYgTU5UX1JFQURPTkxZID8gIiBybyIgOiAiIHJ3Iik7CiAJc2hvd19tbnRfb3B0cyhtLCBtbnQpOwogCkBAIC0yNzc2LDMgKzI3NzMsOCBAQAogCX0KIH0KIEVYUE9SVF9TWU1CT0woa2Vybl91bm1vdW50KTsKKworYm9vbCBvdXJfbW50KHN0cnVjdCB2ZnNtb3VudCAqbW50KQoreworCXJldHVybiBjaGVja19tbnQobW50KTsKK30KZGlmZiAtLWdpdCBhL2ZzL25jcGZzL2lub2RlLmMgYi9mcy9uY3Bmcy9pbm9kZS5jCmluZGV4IDViNWZhMzMuLmNiZDFhNjEgMTAwNjQ0Ci0tLSBhL2ZzL25jcGZzL2lub2RlLmMKKysrIGIvZnMvbmNwZnMvaW5vZGUuYwpAQCAtNTQ4LDcgKzU0OCw3IEBACiAKIAllcnJvciA9IGJkaV9zZXR1cF9hbmRfcmVnaXN0ZXIoJnNlcnZlci0+YmRpLCAibmNwZnMiLCBCRElfQ0FQX01BUF9DT1BZKTsKIAlpZiAoZXJyb3IpCi0JCWdvdG8gb3V0X2JkaTsKKwkJZ290byBvdXRfZnB1dDsKIAogCXNlcnZlci0+bmNwX2ZpbHAgPSBuY3BfZmlscDsKIAlzZXJ2ZXItPm5jcF9zb2NrID0gc29jazsKQEAgLTU1OSw3ICs1NTksNyBAQAogCQllcnJvciA9IC1FQkFERjsKIAkJc2VydmVyLT5pbmZvX2ZpbHAgPSBmZ2V0KGRhdGEuaW5mb19mZCk7CiAJCWlmICghc2VydmVyLT5pbmZvX2ZpbHApCi0JCQlnb3RvIG91dF9mcHV0OworCQkJZ290byBvdXRfYmRpOwogCQllcnJvciA9IC1FTk9UU09DSzsKIAkJc29ja19pbm9kZSA9IHNlcnZlci0+aW5mb19maWxwLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlOwogCQlpZiAoIVNfSVNTT0NLKHNvY2tfaW5vZGUtPmlfbW9kZSkpCkBAIC03NDYsOSArNzQ2LDkgQEAKIG91dF9mcHV0MjoKIAlpZiAoc2VydmVyLT5pbmZvX2ZpbHApCiAJCWZwdXQoc2VydmVyLT5pbmZvX2ZpbHApOwotb3V0X2ZwdXQ6Ci0JYmRpX2Rlc3Ryb3koJnNlcnZlci0+YmRpKTsKIG91dF9iZGk6CisJYmRpX2Rlc3Ryb3koJnNlcnZlci0+YmRpKTsKK291dF9mcHV0OgogCS8qIDIzLzEyLzE5OTggTWFyY2luIERhbGVja2kgPGRhbGVja2lAY3MubmV0LnBsPjoKIAkgKiAKIAkgKiBUaGUgcHJldmlvdXNseSB1c2VkIHB1dF9maWxwKG5jcF9maWxwKTsgd2FzIGJvZ3VzLCBzaW5jZQpkaWZmIC0tZ2l0IGEvZnMvbmZzL2ZpbGUuYyBiL2ZzL25mcy9maWxlLmMKaW5kZXggZWNhNTZkNC4uNjA2ZWYwZiAxMDA2NDQKLS0tIGEvZnMvbmZzL2ZpbGUuYworKysgYi9mcy9uZnMvZmlsZS5jCkBAIC0xNDcsNyArMTQ3LDcgQEAKIAkgKiBvcmlnaW4gPT0gU0VFS19FTkQgfHwgU0VFS19EQVRBIHx8IFNFRUtfSE9MRSA9PiB3ZSBtdXN0IHJldmFsaWRhdGUKIAkgKiB0aGUgY2FjaGVkIGZpbGUgbGVuZ3RoCiAJICovCi0JaWYgKG9yaWdpbiAhPSBTRUVLX1NFVCB8fCBvcmlnaW4gIT0gU0VFS19DVVIpIHsKKwlpZiAob3JpZ2luICE9IFNFRUtfU0VUICYmIG9yaWdpbiAhPSBTRUVLX0NVUikgewogCQlzdHJ1Y3QgaW5vZGUgKmlub2RlID0gZmlscC0+Zl9tYXBwaW5nLT5ob3N0OwogCiAJCWludCByZXR2YWwgPSBuZnNfcmV2YWxpZGF0ZV9maWxlX3NpemUoaW5vZGUsIGZpbHApOwpkaWZmIC0tZ2l0IGEvZnMvbmZzL25mczRwcm9jLmMgYi9mcy9uZnMvbmZzNHByb2MuYwppbmRleCBiZTJiYmFjLi5kOWY0ZDc4IDEwMDY0NAotLS0gYS9mcy9uZnMvbmZzNHByb2MuYworKysgYi9mcy9uZnMvbmZzNHByb2MuYwpAQCAtMzksNiArMzksOCBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9yYXRlbGltaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmludGsuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3VucnBjL2NsbnQuaD4KICNpbmNsdWRlIDxsaW51eC9zdW5ycGMvZ3NzX2FwaS5oPgpAQCAtODk0LDYgKzg5Niw4IEBACiAKIHN0YXRpYyBpbnQgY2FuX29wZW5fZGVsZWdhdGVkKHN0cnVjdCBuZnNfZGVsZWdhdGlvbiAqZGVsZWdhdGlvbiwgZm1vZGVfdCBmbW9kZSkKIHsKKwlpZiAoZGVsZWdhdGlvbiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKIAlpZiAoKGRlbGVnYXRpb24tPnR5cGUgJiBmbW9kZSkgIT0gZm1vZGUpCiAJCXJldHVybiAwOwogCWlmICh0ZXN0X2JpdChORlNfREVMRUdBVElPTl9ORUVEX1JFQ0xBSU0sICZkZWxlZ2F0aW9uLT5mbGFncykpCkBAIC0xMDM2LDggKzEwNDAsNyBAQAogCQl9CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJZGVsZWdhdGlvbiA9IHJjdV9kZXJlZmVyZW5jZShuZnNpLT5kZWxlZ2F0aW9uKTsKLQkJaWYgKGRlbGVnYXRpb24gPT0gTlVMTCB8fAotCQkgICAgIWNhbl9vcGVuX2RlbGVnYXRlZChkZWxlZ2F0aW9uLCBmbW9kZSkpIHsKKwkJaWYgKCFjYW5fb3Blbl9kZWxlZ2F0ZWQoZGVsZWdhdGlvbiwgZm1vZGUpKSB7CiAJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMDkxLDcgKzEwOTQsMTIgQEAKIAkJaWYgKGRlbGVnYXRpb24pCiAJCQlkZWxlZ2F0aW9uX2ZsYWdzID0gZGVsZWdhdGlvbi0+ZmxhZ3M7CiAJCXJjdV9yZWFkX3VubG9jaygpOwotCQlpZiAoKGRlbGVnYXRpb25fZmxhZ3MgJiAxVUw8PE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTSkgPT0gMCkKKwkJaWYgKGRhdGEtPm9fYXJnLmNsYWltID09IE5GUzRfT1BFTl9DTEFJTV9ERUxFR0FURV9DVVIpIHsKKwkJCXByX2Vycl9yYXRlbGltaXRlZCgiTkZTOiBCcm9rZW4gTkZTdjQgc2VydmVyICVzIGlzICIKKwkJCQkJInJldHVybmluZyBhIGRlbGVnYXRpb24gZm9yICIKKwkJCQkJIk9QRU4oQ0xBSU1fREVMRUdBVEVfQ1VSKVxuIiwKKwkJCQkJTkZTX0NMSUVOVChpbm9kZSktPmNsX3NlcnZlcik7CisJCX0gZWxzZSBpZiAoKGRlbGVnYXRpb25fZmxhZ3MgJiAxVUw8PE5GU19ERUxFR0FUSU9OX05FRURfUkVDTEFJTSkgPT0gMCkKIAkJCW5mc19pbm9kZV9zZXRfZGVsZWdhdGlvbihzdGF0ZS0+aW5vZGUsCiAJCQkJCWRhdGEtPm93bmVyLT5zb19jcmVkLAogCQkJCQkmZGF0YS0+b19yZXMpOwpAQCAtMTQyMywxMSArMTQzMSw5IEBACiAJCQlnb3RvIG91dF9ub19hY3Rpb247CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJZGVsZWdhdGlvbiA9IHJjdV9kZXJlZmVyZW5jZShORlNfSShkYXRhLT5zdGF0ZS0+aW5vZGUpLT5kZWxlZ2F0aW9uKTsKLQkJaWYgKGRlbGVnYXRpb24gIT0gTlVMTCAmJgotCQkgICAgdGVzdF9iaXQoTkZTX0RFTEVHQVRJT05fTkVFRF9SRUNMQUlNLCAmZGVsZWdhdGlvbi0+ZmxhZ3MpID09IDApIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOwotCQkJZ290byBvdXRfbm9fYWN0aW9uOwotCQl9CisJCWlmIChkYXRhLT5vX2FyZy5jbGFpbSAhPSBORlM0X09QRU5fQ0xBSU1fREVMRUdBVEVfQ1VSICYmCisJCSAgICBjYW5fb3Blbl9kZWxlZ2F0ZWQoZGVsZWdhdGlvbiwgZGF0YS0+b19hcmcuZm1vZGUpKQorCQkJZ290byB1bmxvY2tfbm9fYWN0aW9uOwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAJLyogVXBkYXRlIHNlcXVlbmNlIGlkLiAqLwpAQCAtMTQ0NCw2ICsxNDUwLDggQEAKIAkJcmV0dXJuOwogCXJwY19jYWxsX3N0YXJ0KHRhc2spOwogCXJldHVybjsKK3VubG9ja19ub19hY3Rpb246CisJcmN1X3JlYWRfdW5sb2NrKCk7CiBvdXRfbm9fYWN0aW9uOgogCXRhc2stPnRrX2FjdGlvbiA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0c3RhdGUuYyBiL2ZzL25mcy9uZnM0c3RhdGUuYwppbmRleCAzOTkxNGJlNC4uNmE3MTA3YSAxMDA2NDQKLS0tIGEvZnMvbmZzL25mczRzdGF0ZS5jCisrKyBiL2ZzL25mcy9uZnM0c3RhdGUuYwpAQCAtMTE1NiwxMSArMTE1NiwxMyBAQAogCQlpZiAoc3RhdHVzID49IDApIHsKIAkJCXN0YXR1cyA9IG5mczRfcmVjbGFpbV9sb2NrcyhzdGF0ZSwgb3BzKTsKIAkJCWlmIChzdGF0dXMgPj0gMCkgeworCQkJCXNwaW5fbG9jaygmc3RhdGUtPnN0YXRlX2xvY2spOwogCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkobG9jaywgJnN0YXRlLT5sb2NrX3N0YXRlcywgbHNfbG9ja3MpIHsKIAkJCQkJaWYgKCEobG9jay0+bHNfZmxhZ3MgJiBORlNfTE9DS19JTklUSUFMSVpFRCkpCiAJCQkJCQlwcmludGsoIiVzOiBMb2NrIHJlY2xhaW0gZmFpbGVkIVxuIiwKIAkJCQkJCQlfX2Z1bmNfXyk7CiAJCQkJfQorCQkJCXNwaW5fdW5sb2NrKCZzdGF0ZS0+c3RhdGVfbG9jayk7CiAJCQkJbmZzNF9wdXRfb3Blbl9zdGF0ZShzdGF0ZSk7CiAJCQkJZ290byByZXN0YXJ0OwogCQkJfQpAQCAtMTIyNCwxMCArMTIyNiwxMiBAQAogCWNsZWFyX2JpdChORlNfT19SRE9OTFlfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOwogCWNsZWFyX2JpdChORlNfT19XUk9OTFlfU1RBVEUsICZzdGF0ZS0+ZmxhZ3MpOwogCWNsZWFyX2JpdChORlNfT19SRFdSX1NUQVRFLCAmc3RhdGUtPmZsYWdzKTsKKwlzcGluX2xvY2soJnN0YXRlLT5zdGF0ZV9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssICZzdGF0ZS0+bG9ja19zdGF0ZXMsIGxzX2xvY2tzKSB7CiAJCWxvY2stPmxzX3NlcWlkLmZsYWdzID0gMDsKIAkJbG9jay0+bHNfZmxhZ3MgJj0gfk5GU19MT0NLX0lOSVRJQUxJWkVEOwogCX0KKwlzcGluX3VubG9jaygmc3RhdGUtPnN0YXRlX2xvY2spOwogfQogCiBzdGF0aWMgdm9pZCBuZnM0X3Jlc2V0X3NlcWlkcyhzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyLApAQCAtMTM1MCwxMiArMTM1NCwxNCBAQAogc3RhdGljIGludCBuZnM0X3JlY292ZXJ5X2hhbmRsZV9lcnJvcihzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLCBpbnQgZXJyb3IpCiB7CiAJc3dpdGNoIChlcnJvcikgeworCQljYXNlIDA6CisJCQlicmVhazsKIAkJY2FzZSAtTkZTNEVSUl9DQl9QQVRIX0RPV046CiAJCQluZnNfaGFuZGxlX2NiX3BhdGhkb3duKGNscCk7Ci0JCQlyZXR1cm4gMDsKKwkJCWJyZWFrOwogCQljYXNlIC1ORlM0RVJSX05PX0dSQUNFOgogCQkJbmZzNF9zdGF0ZV9lbmRfcmVjbGFpbV9yZWJvb3QoY2xwKTsKLQkJCXJldHVybiAwOworCQkJYnJlYWs7CiAJCWNhc2UgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQ6CiAJCWNhc2UgLU5GUzRFUlJfTEVBU0VfTU9WRUQ6CiAJCQlzZXRfYml0KE5GUzRDTE5UX0xFQVNFX0VYUElSRUQsICZjbHAtPmNsX3N0YXRlKTsKQEAgLTEzNzUsMTMgKzEzODEsMTUgQEAKIAkJY2FzZSAtTkZTNEVSUl9TRVFfTUlTT1JERVJFRDoKIAkJCXNldF9iaXQoTkZTNENMTlRfU0VTU0lPTl9SRVNFVCwgJmNscC0+Y2xfc3RhdGUpOwogCQkJLyogWmVybyBzZXNzaW9uIHJlc2V0IGVycm9ycyAqLwotCQkJcmV0dXJuIDA7CisJCQlicmVhazsKIAkJY2FzZSAtRUtFWUVYUElSRUQ6CiAJCQkvKiBOb3RoaW5nIHdlIGNhbiBkbyAqLwogCQkJbmZzNF93YXJuX2tleWV4cGlyZWQoY2xwLT5jbF9ob3N0bmFtZSk7Ci0JCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIGVycm9yOwogCX0KLQlyZXR1cm4gZXJyb3I7CisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgbmZzNF9kb19yZWNsYWltKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIGNvbnN0IHN0cnVjdCBuZnM0X3N0YXRlX3JlY292ZXJ5X29wcyAqb3BzKQpAQCAtMTQyOCw3ICsxNDM2LDcgQEAKIAlzdHJ1Y3QgcnBjX2NyZWQgKmNyZWQ7CiAJY29uc3Qgc3RydWN0IG5mczRfc3RhdGVfbWFpbnRlbmFuY2Vfb3BzICpvcHMgPQogCQljbHAtPmNsX212b3BzLT5zdGF0ZV9yZW5ld2FsX29wczsKLQlpbnQgc3RhdHVzID0gLU5GUzRFUlJfRVhQSVJFRDsKKwlpbnQgc3RhdHVzOwogCiAJLyogSXMgdGhlIGNsaWVudCBhbHJlYWR5IGtub3duIHRvIGhhdmUgYW4gZXhwaXJlZCBsZWFzZT8gKi8KIAlpZiAodGVzdF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpKQpAQCAtMTQzOCw2ICsxNDQ2LDcgQEAKIAlzcGluX3VubG9jaygmY2xwLT5jbF9sb2NrKTsKIAlpZiAoY3JlZCA9PSBOVUxMKSB7CiAJCWNyZWQgPSBuZnM0X2dldF9zZXRjbGllbnRpZF9jcmVkKGNscCk7CisJCXN0YXR1cyA9IC1FTk9LRVk7CiAJCWlmIChjcmVkID09IE5VTEwpCiAJCQlnb3RvIG91dDsKIAl9CkBAIC0xNTI1LDE2ICsxNTM0LDE2IEBACiB7CiAJaWYgKCFmbGFncykKIAkJcmV0dXJuOwotCWVsc2UgaWYgKGZsYWdzICYgU0VRNF9TVEFUVVNfUkVTVEFSVF9SRUNMQUlNX05FRURFRCkKKwlpZiAoZmxhZ3MgJiBTRVE0X1NUQVRVU19SRVNUQVJUX1JFQ0xBSU1fTkVFREVEKQogCQluZnM0MV9oYW5kbGVfc2VydmVyX3JlYm9vdChjbHApOwotCWVsc2UgaWYgKGZsYWdzICYgKFNFUTRfU1RBVFVTX0VYUElSRURfQUxMX1NUQVRFX1JFVk9LRUQgfAorCWlmIChmbGFncyAmIChTRVE0X1NUQVRVU19FWFBJUkVEX0FMTF9TVEFURV9SRVZPS0VEIHwKIAkJCSAgICBTRVE0X1NUQVRVU19FWFBJUkVEX1NPTUVfU1RBVEVfUkVWT0tFRCB8CiAJCQkgICAgU0VRNF9TVEFUVVNfQURNSU5fU1RBVEVfUkVWT0tFRCB8CiAJCQkgICAgU0VRNF9TVEFUVVNfTEVBU0VfTU9WRUQpKQogCQluZnM0MV9oYW5kbGVfc3RhdGVfcmV2b2tlZChjbHApOwotCWVsc2UgaWYgKGZsYWdzICYgU0VRNF9TVEFUVVNfUkVDQUxMQUJMRV9TVEFURV9SRVZPS0VEKQorCWlmIChmbGFncyAmIFNFUTRfU1RBVFVTX1JFQ0FMTEFCTEVfU1RBVEVfUkVWT0tFRCkKIAkJbmZzNDFfaGFuZGxlX3JlY2FsbGFibGVfc3RhdGVfcmV2b2tlZChjbHApOwotCWVsc2UgaWYgKGZsYWdzICYgKFNFUTRfU1RBVFVTX0NCX1BBVEhfRE9XTiB8CisJaWYgKGZsYWdzICYgKFNFUTRfU1RBVFVTX0NCX1BBVEhfRE9XTiB8CiAJCQkgICAgU0VRNF9TVEFUVVNfQkFDS0NIQU5ORUxfRkFVTFQgfAogCQkJICAgIFNFUTRfU1RBVFVTX0NCX1BBVEhfRE9XTl9TRVNTSU9OKSkKIAkJbmZzNDFfaGFuZGxlX2NiX3BhdGhfZG93bihjbHApOwpAQCAtMTY2MiwxMCArMTY3MSwxMCBAQAogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoTkZTNENMTlRfQ0hFQ0tfTEVBU0UsICZjbHAtPmNsX3N0YXRlKSkgewogCQkJc3RhdHVzID0gbmZzNF9jaGVja19sZWFzZShjbHApOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJZ290byBvdXRfZXJyb3I7CiAJCQlpZiAodGVzdF9iaXQoTkZTNENMTlRfTEVBU0VfRVhQSVJFRCwgJmNscC0+Y2xfc3RhdGUpKQogCQkJCWNvbnRpbnVlOwotCQkJaWYgKHN0YXR1cyA8IDAgJiYgc3RhdHVzICE9IC1ORlM0RVJSX0NCX1BBVEhfRE9XTikKLQkJCQlnb3RvIG91dF9lcnJvcjsKIAkJfQogCiAJCS8qIEluaXRpYWxpemUgb3IgcmVzZXQgdGhlIHNlc3Npb24gKi8KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi9pb2N0bC5jIGIvZnMvbmlsZnMyL2lvY3RsLmMKaW5kZXggNDFkNjc0My4uYWMyNThiZSAxMDA2NDQKLS0tIGEvZnMvbmlsZnMyL2lvY3RsLmMKKysrIGIvZnMvbmlsZnMyL2lvY3RsLmMKQEAgLTYyNSw2ICs2MjUsOSBAQAogCQlpZiAoYXJndltuXS52X25tZW1icyA+IG5zZWdzICogbmlsZnMtPm5zX2Jsb2Nrc19wZXJfc2VnbWVudCkKIAkJCWdvdG8gb3V0X2ZyZWU7CiAKKwkJaWYgKGFyZ3Zbbl0udl9ubWVtYnMgPj0gVUlOVF9NQVggLyBhcmd2W25dLnZfc2l6ZSkKKwkJCWdvdG8gb3V0X2ZyZWU7CisKIAkJbGVuID0gYXJndltuXS52X3NpemUgKiBhcmd2W25dLnZfbm1lbWJzOwogCQliYXNlID0gKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpYXJndltuXS52X2Jhc2U7CiAJCWlmIChsZW4gPT0gMCkgewpAQCAtODQyLDYgKzg0NSwxOSBAQAogCWNhc2UgRlNfSU9DMzJfR0VUVkVSU0lPTjoKIAkJY21kID0gRlNfSU9DX0dFVFZFUlNJT047CiAJCWJyZWFrOworCWNhc2UgTklMRlNfSU9DVExfQ0hBTkdFX0NQTU9ERToKKwljYXNlIE5JTEZTX0lPQ1RMX0RFTEVURV9DSEVDS1BPSU5UOgorCWNhc2UgTklMRlNfSU9DVExfR0VUX0NQSU5GTzoKKwljYXNlIE5JTEZTX0lPQ1RMX0dFVF9DUFNUQVQ6CisJY2FzZSBOSUxGU19JT0NUTF9HRVRfU1VJTkZPOgorCWNhc2UgTklMRlNfSU9DVExfR0VUX1NVU1RBVDoKKwljYXNlIE5JTEZTX0lPQ1RMX0dFVF9WSU5GTzoKKwljYXNlIE5JTEZTX0lPQ1RMX0dFVF9CREVTQ1M6CisJY2FzZSBOSUxGU19JT0NUTF9DTEVBTl9TRUdNRU5UUzoKKwljYXNlIE5JTEZTX0lPQ1RMX1NZTkM6CisJY2FzZSBOSUxGU19JT0NUTF9SRVNJWkU6CisJY2FzZSBOSUxGU19JT0NUTF9TRVRfQUxMT0NfUkFOR0U6CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldHVybiAtRU5PSU9DVExDTUQ7CiAJfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9hcnJheS5jIGIvZnMvcHJvYy9hcnJheS5jCmluZGV4IDNhMWRhZmQuLjhjMzQ0ZjAgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvYXJyYXkuYworKysgYi9mcy9wcm9jL2FycmF5LmMKQEAgLTM5NCw4ICszOTQsOCBAQAogCiAJc2lnZW1wdHlzZXQoJnNpZ2lnbik7CiAJc2lnZW1wdHlzZXQoJnNpZ2NhdGNoKTsKLQljdXRpbWUgPSBjc3RpbWUgPSB1dGltZSA9IHN0aW1lID0gY3B1dGltZV96ZXJvOwotCWNndGltZSA9IGd0aW1lID0gY3B1dGltZV96ZXJvOworCWN1dGltZSA9IGNzdGltZSA9IHV0aW1lID0gc3RpbWUgPSAwOworCWNndGltZSA9IGd0aW1lID0gMDsKIAogCWlmIChsb2NrX3Rhc2tfc2lnaGFuZCh0YXNrLCAmZmxhZ3MpKSB7CiAJCXN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcgPSB0YXNrLT5zaWduYWw7CkBAIC00MjMsMTQgKzQyMywxNCBAQAogCQkJZG8gewogCQkJCW1pbl9mbHQgKz0gdC0+bWluX2ZsdDsKIAkJCQltYWpfZmx0ICs9IHQtPm1hal9mbHQ7Ci0JCQkJZ3RpbWUgPSBjcHV0aW1lX2FkZChndGltZSwgdC0+Z3RpbWUpOworCQkJCWd0aW1lICs9IHQtPmd0aW1lOwogCQkJCXQgPSBuZXh0X3RocmVhZCh0KTsKIAkJCX0gd2hpbGUgKHQgIT0gdGFzayk7CiAKIAkJCW1pbl9mbHQgKz0gc2lnLT5taW5fZmx0OwogCQkJbWFqX2ZsdCArPSBzaWctPm1hal9mbHQ7CiAJCQl0aHJlYWRfZ3JvdXBfdGltZXModGFzaywgJnV0aW1lLCAmc3RpbWUpOwotCQkJZ3RpbWUgPSBjcHV0aW1lX2FkZChndGltZSwgc2lnLT5ndGltZSk7CisJCQlndGltZSArPSBzaWctPmd0aW1lOwogCQl9CiAKIAkJc2lkID0gdGFza19zZXNzaW9uX25yX25zKHRhc2ssIG5zKTsKZGlmZiAtLWdpdCBhL2ZzL3Byb2MvbWVtaW5mby5jIGIvZnMvcHJvYy9tZW1pbmZvLmMKaW5kZXggNTg2MTc0MS4uODBlNDY0NSAxMDA2NDQKLS0tIGEvZnMvcHJvYy9tZW1pbmZvLmMKKysrIGIvZnMvcHJvYy9tZW1pbmZvLmMKQEAgLTEzMSwxMiArMTMxLDEzIEBACiAJCUsoaS5mcmVlc3dhcCksCiAJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfRklMRV9ESVJUWSkpLAogCQlLKGdsb2JhbF9wYWdlX3N0YXRlKE5SX1dSSVRFQkFDSykpLAotCQlLKGdsb2JhbF9wYWdlX3N0YXRlKE5SX0FOT05fUEFHRVMpCiAjaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCisJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfQU5PTl9QQUdFUykKIAkJICArIGdsb2JhbF9wYWdlX3N0YXRlKE5SX0FOT05fVFJBTlNQQVJFTlRfSFVHRVBBR0VTKSAqCi0JCSAgSFBBR0VfUE1EX05SCisJCSAgSFBBR0VfUE1EX05SKSwKKyNlbHNlCisJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfQU5PTl9QQUdFUykpLAogI2VuZGlmCi0JCSAgKSwKIAkJSyhnbG9iYWxfcGFnZV9zdGF0ZShOUl9GSUxFX01BUFBFRCkpLAogCQlLKGdsb2JhbF9wYWdlX3N0YXRlKE5SX1NITUVNKSksCiAJCUsoZ2xvYmFsX3BhZ2Vfc3RhdGUoTlJfU0xBQl9SRUNMQUlNQUJMRSkgKwpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9yb290LmMgYi9mcy9wcm9jL3Jvb3QuYwppbmRleCA5YThhMmI3Li4wMzEwMmQ5IDEwMDY0NAotLS0gYS9mcy9wcm9jL3Jvb3QuYworKysgYi9mcy9wcm9jL3Jvb3QuYwpAQCAtOTEsMjAgKzkxLDE4IEBACiAKIHZvaWQgX19pbml0IHByb2Nfcm9vdF9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHZmc21vdW50ICptbnQ7CiAJaW50IGVycjsKIAogCXByb2NfaW5pdF9pbm9kZWNhY2hlKCk7CiAJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmcHJvY19mc190eXBlKTsKIAlpZiAoZXJyKQogCQlyZXR1cm47Ci0JbW50ID0ga2Vybl9tb3VudF9kYXRhKCZwcm9jX2ZzX3R5cGUsICZpbml0X3BpZF9ucyk7Ci0JaWYgKElTX0VSUihtbnQpKSB7CisJZXJyID0gcGlkX25zX3ByZXBhcmVfcHJvYygmaW5pdF9waWRfbnMpOworCWlmIChlcnIpIHsKIAkJdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZwcm9jX2ZzX3R5cGUpOwogCQlyZXR1cm47CiAJfQogCi0JaW5pdF9waWRfbnMucHJvY19tbnQgPSBtbnQ7CiAJcHJvY19zeW1saW5rKCJtb3VudHMiLCBOVUxMLCAic2VsZi9tb3VudHMiKTsKIAogCXByb2NfbmV0X2luaXQoKTsKQEAgLTIwOSw1ICsyMDcsNSBAQAogCiB2b2lkIHBpZF9uc19yZWxlYXNlX3Byb2Moc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKQogewotCW1udHB1dChucy0+cHJvY19tbnQpOworCWtlcm5fdW5tb3VudChucy0+cHJvY19tbnQpOwogfQpkaWZmIC0tZ2l0IGEvZnMvcHJvYy9zdGF0LmMgYi9mcy9wcm9jL3N0YXQuYwppbmRleCA0MmIyNzRkLi5kNzZjYTZhIDEwMDY0NAotLS0gYS9mcy9wcm9jL3N0YXQuYworKysgYi9mcy9wcm9jL3N0YXQuYwpAQCAtMjIsMzEgKzIyLDI5IEBACiAjZGVmaW5lIGFyY2hfaWRsZV90aW1lKGNwdSkgMAogI2VuZGlmCiAKLXN0YXRpYyBjcHV0aW1lNjRfdCBnZXRfaWRsZV90aW1lKGludCBjcHUpCitzdGF0aWMgdTY0IGdldF9pZGxlX3RpbWUoaW50IGNwdSkKIHsKLQl1NjQgaWRsZV90aW1lID0gZ2V0X2NwdV9pZGxlX3RpbWVfdXMoY3B1LCBOVUxMKTsKLQljcHV0aW1lNjRfdCBpZGxlOworCXU2NCBpZGxlLCBpZGxlX3RpbWUgPSBnZXRfY3B1X2lkbGVfdGltZV91cyhjcHUsIE5VTEwpOwogCiAJaWYgKGlkbGVfdGltZSA9PSAtMVVMTCkgewogCQkvKiAhTk9fSFogc28gd2UgY2FuIHJlbHkgb24gY3B1c3RhdC5pZGxlICovCi0JCWlkbGUgPSBrc3RhdF9jcHUoY3B1KS5jcHVzdGF0LmlkbGU7Ci0JCWlkbGUgPSBjcHV0aW1lNjRfYWRkKGlkbGUsIGFyY2hfaWRsZV90aW1lKGNwdSkpOworCQlpZGxlID0ga2NwdXN0YXRfY3B1KGNwdSkuY3B1c3RhdFtDUFVUSU1FX0lETEVdOworCQlpZGxlICs9IGFyY2hfaWRsZV90aW1lKGNwdSk7CiAJfSBlbHNlCi0JCWlkbGUgPSB1c2Vjc190b19jcHV0aW1lKGlkbGVfdGltZSk7CisJCWlkbGUgPSB1c2Vjc190b19jcHV0aW1lNjQoaWRsZV90aW1lKTsKIAogCXJldHVybiBpZGxlOwogfQogCi1zdGF0aWMgY3B1dGltZTY0X3QgZ2V0X2lvd2FpdF90aW1lKGludCBjcHUpCitzdGF0aWMgdTY0IGdldF9pb3dhaXRfdGltZShpbnQgY3B1KQogewotCXU2NCBpb3dhaXRfdGltZSA9IGdldF9jcHVfaW93YWl0X3RpbWVfdXMoY3B1LCBOVUxMKTsKLQljcHV0aW1lNjRfdCBpb3dhaXQ7CisJdTY0IGlvd2FpdCwgaW93YWl0X3RpbWUgPSBnZXRfY3B1X2lvd2FpdF90aW1lX3VzKGNwdSwgTlVMTCk7CiAKIAlpZiAoaW93YWl0X3RpbWUgPT0gLTFVTEwpCiAJCS8qICFOT19IWiBzbyB3ZSBjYW4gcmVseSBvbiBjcHVzdGF0Lmlvd2FpdCAqLwotCQlpb3dhaXQgPSBrc3RhdF9jcHUoY3B1KS5jcHVzdGF0Lmlvd2FpdDsKKwkJaW93YWl0ID0ga2NwdXN0YXRfY3B1KGNwdSkuY3B1c3RhdFtDUFVUSU1FX0lPV0FJVF07CiAJZWxzZQotCQlpb3dhaXQgPSB1c2Vjc190b19jcHV0aW1lKGlvd2FpdF90aW1lKTsKKwkJaW93YWl0ID0gdXNlY3NfdG9fY3B1dGltZTY0KGlvd2FpdF90aW1lKTsKIAogCXJldHVybiBpb3dhaXQ7CiB9CkBAIC01NSwzMyArNTMsMzAgQEAKIHsKIAlpbnQgaSwgajsKIAl1bnNpZ25lZCBsb25nIGppZjsKLQljcHV0aW1lNjRfdCB1c2VyLCBuaWNlLCBzeXN0ZW0sIGlkbGUsIGlvd2FpdCwgaXJxLCBzb2Z0aXJxLCBzdGVhbDsKLQljcHV0aW1lNjRfdCBndWVzdCwgZ3Vlc3RfbmljZTsKKwl1NjQgdXNlciwgbmljZSwgc3lzdGVtLCBpZGxlLCBpb3dhaXQsIGlycSwgc29mdGlycSwgc3RlYWw7CisJdTY0IGd1ZXN0LCBndWVzdF9uaWNlOwogCXU2NCBzdW0gPSAwOwogCXU2NCBzdW1fc29mdGlycSA9IDA7CiAJdW5zaWduZWQgaW50IHBlcl9zb2Z0aXJxX3N1bXNbTlJfU09GVElSUVNdID0gezB9OwogCXN0cnVjdCB0aW1lc3BlYyBib290dGltZTsKIAogCXVzZXIgPSBuaWNlID0gc3lzdGVtID0gaWRsZSA9IGlvd2FpdCA9Ci0JCWlycSA9IHNvZnRpcnEgPSBzdGVhbCA9IGNwdXRpbWU2NF96ZXJvOwotCWd1ZXN0ID0gZ3Vlc3RfbmljZSA9IGNwdXRpbWU2NF96ZXJvOworCQlpcnEgPSBzb2Z0aXJxID0gc3RlYWwgPSAwOworCWd1ZXN0ID0gZ3Vlc3RfbmljZSA9IDA7CiAJZ2V0Ym9vdHRpbWUoJmJvb3R0aW1lKTsKIAlqaWYgPSBib290dGltZS50dl9zZWM7CiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQl1c2VyID0gY3B1dGltZTY0X2FkZCh1c2VyLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC51c2VyKTsKLQkJbmljZSA9IGNwdXRpbWU2NF9hZGQobmljZSwga3N0YXRfY3B1KGkpLmNwdXN0YXQubmljZSk7Ci0JCXN5c3RlbSA9IGNwdXRpbWU2NF9hZGQoc3lzdGVtLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zeXN0ZW0pOwotCQlpZGxlID0gY3B1dGltZTY0X2FkZChpZGxlLCBnZXRfaWRsZV90aW1lKGkpKTsKLQkJaW93YWl0ID0gY3B1dGltZTY0X2FkZChpb3dhaXQsIGdldF9pb3dhaXRfdGltZShpKSk7Ci0JCWlycSA9IGNwdXRpbWU2NF9hZGQoaXJxLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5pcnEpOwotCQlzb2Z0aXJxID0gY3B1dGltZTY0X2FkZChzb2Z0aXJxLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zb2Z0aXJxKTsKLQkJc3RlYWwgPSBjcHV0aW1lNjRfYWRkKHN0ZWFsLCBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zdGVhbCk7Ci0JCWd1ZXN0ID0gY3B1dGltZTY0X2FkZChndWVzdCwga3N0YXRfY3B1KGkpLmNwdXN0YXQuZ3Vlc3QpOwotCQlndWVzdF9uaWNlID0gY3B1dGltZTY0X2FkZChndWVzdF9uaWNlLAotCQkJa3N0YXRfY3B1KGkpLmNwdXN0YXQuZ3Vlc3RfbmljZSk7Ci0JCXN1bSArPSBrc3RhdF9jcHVfaXJxc19zdW0oaSk7Ci0JCXN1bSArPSBhcmNoX2lycV9zdGF0X2NwdShpKTsKKwkJdXNlciArPSBrY3B1c3RhdF9jcHUoaSkuY3B1c3RhdFtDUFVUSU1FX1VTRVJdOworCQluaWNlICs9IGtjcHVzdGF0X2NwdShpKS5jcHVzdGF0W0NQVVRJTUVfTklDRV07CisJCXN5c3RlbSArPSBrY3B1c3RhdF9jcHUoaSkuY3B1c3RhdFtDUFVUSU1FX1NZU1RFTV07CisJCWlkbGUgKz0gZ2V0X2lkbGVfdGltZShpKTsKKwkJaW93YWl0ICs9IGdldF9pb3dhaXRfdGltZShpKTsKKwkJaXJxICs9IGtjcHVzdGF0X2NwdShpKS5jcHVzdGF0W0NQVVRJTUVfSVJRXTsKKwkJc29mdGlycSArPSBrY3B1c3RhdF9jcHUoaSkuY3B1c3RhdFtDUFVUSU1FX1NPRlRJUlFdOworCQlzdGVhbCArPSBrY3B1c3RhdF9jcHUoaSkuY3B1c3RhdFtDUFVUSU1FX1NURUFMXTsKKwkJZ3Vlc3QgKz0ga2NwdXN0YXRfY3B1KGkpLmNwdXN0YXRbQ1BVVElNRV9HVUVTVF07CisJCWd1ZXN0X25pY2UgKz0ga2NwdXN0YXRfY3B1KGkpLmNwdXN0YXRbQ1BVVElNRV9HVUVTVF9OSUNFXTsKIAogCQlmb3IgKGogPSAwOyBqIDwgTlJfU09GVElSUVM7IGorKykgewogCQkJdW5zaWduZWQgaW50IHNvZnRpcnFfc3RhdCA9IGtzdGF0X3NvZnRpcnFzX2NwdShqLCBpKTsKQEAgLTEwNiwxNiArMTAxLDE2IEBACiAJCSh1bnNpZ25lZCBsb25nIGxvbmcpY3B1dGltZTY0X3RvX2Nsb2NrX3QoZ3Vlc3RfbmljZSkpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewogCQkvKiBDb3B5IHZhbHVlcyBoZXJlIHRvIHdvcmsgYXJvdW5kIGdjYy0yLjk1LjMsIGdjYy0yLjk2ICovCi0JCXVzZXIgPSBrc3RhdF9jcHUoaSkuY3B1c3RhdC51c2VyOwotCQluaWNlID0ga3N0YXRfY3B1KGkpLmNwdXN0YXQubmljZTsKLQkJc3lzdGVtID0ga3N0YXRfY3B1KGkpLmNwdXN0YXQuc3lzdGVtOworCQl1c2VyID0ga2NwdXN0YXRfY3B1KGkpLmNwdXN0YXRbQ1BVVElNRV9VU0VSXTsKKwkJbmljZSA9IGtjcHVzdGF0X2NwdShpKS5jcHVzdGF0W0NQVVRJTUVfTklDRV07CisJCXN5c3RlbSA9IGtjcHVzdGF0X2NwdShpKS5jcHVzdGF0W0NQVVRJTUVfU1lTVEVNXTsKIAkJaWRsZSA9IGdldF9pZGxlX3RpbWUoaSk7CiAJCWlvd2FpdCA9IGdldF9pb3dhaXRfdGltZShpKTsKLQkJaXJxID0ga3N0YXRfY3B1KGkpLmNwdXN0YXQuaXJxOwotCQlzb2Z0aXJxID0ga3N0YXRfY3B1KGkpLmNwdXN0YXQuc29mdGlycTsKLQkJc3RlYWwgPSBrc3RhdF9jcHUoaSkuY3B1c3RhdC5zdGVhbDsKLQkJZ3Vlc3QgPSBrc3RhdF9jcHUoaSkuY3B1c3RhdC5ndWVzdDsKLQkJZ3Vlc3RfbmljZSA9IGtzdGF0X2NwdShpKS5jcHVzdGF0Lmd1ZXN0X25pY2U7CisJCWlycSA9IGtjcHVzdGF0X2NwdShpKS5jcHVzdGF0W0NQVVRJTUVfSVJRXTsKKwkJc29mdGlycSA9IGtjcHVzdGF0X2NwdShpKS5jcHVzdGF0W0NQVVRJTUVfU09GVElSUV07CisJCXN0ZWFsID0ga2NwdXN0YXRfY3B1KGkpLmNwdXN0YXRbQ1BVVElNRV9TVEVBTF07CisJCWd1ZXN0ID0ga2NwdXN0YXRfY3B1KGkpLmNwdXN0YXRbQ1BVVElNRV9HVUVTVF07CisJCWd1ZXN0X25pY2UgPSBrY3B1c3RhdF9jcHUoaSkuY3B1c3RhdFtDUFVUSU1FX0dVRVNUX05JQ0VdOwogCQlzZXFfcHJpbnRmKHAsCiAJCQkiY3B1JWQgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgIgogCQkJIiVsbHVcbiIsCmRpZmYgLS1naXQgYS9mcy9wcm9jL3VwdGltZS5jIGIvZnMvcHJvYy91cHRpbWUuYwppbmRleCA3NjZiMWQ0Li45NjEwYWM3IDEwMDY0NAotLS0gYS9mcy9wcm9jL3VwdGltZS5jCisrKyBiL2ZzL3Byb2MvdXB0aW1lLmMKQEAgLTExLDE1ICsxMSwyMCBAQAogewogCXN0cnVjdCB0aW1lc3BlYyB1cHRpbWU7CiAJc3RydWN0IHRpbWVzcGVjIGlkbGU7CisJdTY0IGlkbGV0aW1lOworCXU2NCBuc2VjOworCXUzMiByZW07CiAJaW50IGk7Ci0JY3B1dGltZV90IGlkbGV0aW1lID0gY3B1dGltZV96ZXJvOwogCisJaWRsZXRpbWUgPSAwOwogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKQotCQlpZGxldGltZSA9IGNwdXRpbWU2NF9hZGQoaWRsZXRpbWUsIGtzdGF0X2NwdShpKS5jcHVzdGF0LmlkbGUpOworCQlpZGxldGltZSArPSAoX19mb3JjZSB1NjQpIGtjcHVzdGF0X2NwdShpKS5jcHVzdGF0W0NQVVRJTUVfSURMRV07CiAKIAlkb19wb3NpeF9jbG9ja19tb25vdG9uaWNfZ2V0dGltZSgmdXB0aW1lKTsKIAltb25vdG9uaWNfdG9fYm9vdGJhc2VkKCZ1cHRpbWUpOwotCWNwdXRpbWVfdG9fdGltZXNwZWMoaWRsZXRpbWUsICZpZGxlKTsKKwluc2VjID0gY3B1dGltZTY0X3RvX2ppZmZpZXM2NChpZGxldGltZSkgKiBUSUNLX05TRUM7CisJaWRsZS50dl9zZWMgPSBkaXZfdTY0X3JlbShuc2VjLCBOU0VDX1BFUl9TRUMsICZyZW0pOworCWlkbGUudHZfbnNlYyA9IHJlbTsKIAlzZXFfcHJpbnRmKG0sICIlbHUuJTAybHUgJWx1LiUwMmx1XG4iLAogCQkJKHVuc2lnbmVkIGxvbmcpIHVwdGltZS50dl9zZWMsCiAJCQkodXB0aW1lLnR2X25zZWMgLyAoTlNFQ19QRVJfU0VDIC8gMTAwKSksCmRpZmYgLS1naXQgYS9mcy9zZXFfZmlsZS5jIGIvZnMvc2VxX2ZpbGUuYwppbmRleCAwNWQ2YjBlLi5kYmE0M2MzIDEwMDY0NAotLS0gYS9mcy9zZXFfZmlsZS5jCisrKyBiL2ZzL3NlcV9maWxlLmMKQEAgLTQ0OSw4ICs0NDksNiBAQAogCiAvKgogICogU2FtZSBhcyBzZXFfcGF0aCwgYnV0IHJlbGF0aXZlIHRvIHN1cHBsaWVkIHJvb3QuCi0gKgotICogcm9vdCBtYXkgYmUgY2hhbmdlZCwgc2VlIF9fZF9wYXRoKCkuCiAgKi8KIGludCBzZXFfcGF0aF9yb290KHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHBhdGggKnBhdGgsIHN0cnVjdCBwYXRoICpyb290LAogCQkgIGNoYXIgKmVzYykKQEAgLTQ2Myw2ICs0NjEsOCBAQAogCQljaGFyICpwOwogCiAJCXAgPSBfX2RfcGF0aChwYXRoLCByb290LCBidWYsIHNpemUpOworCQlpZiAoIXApCisJCQlyZXR1cm4gU0VRX1NLSVA7CiAJCXJlcyA9IFBUUl9FUlIocCk7CiAJCWlmICghSVNfRVJSKHApKSB7CiAJCQljaGFyICplbmQgPSBtYW5nbGVfcGF0aChidWYsIHAsIGVzYyk7CkBAIC00NzQsNyArNDc0LDcgQEAKIAl9CiAJc2VxX2NvbW1pdChtLCByZXMpOwogCi0JcmV0dXJuIHJlcyA8IDAgPyByZXMgOiAwOworCXJldHVybiByZXMgPCAwICYmIHJlcyAhPSAtRU5BTUVUT09MT05HID8gcmVzIDogMDsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2ZzL3ViaWZzL3N1cGVyLmMgYi9mcy91Ymlmcy9zdXBlci5jCmluZGV4IDIwNDAzZGMuLmFlMGU3NmIgMTAwNjQ0Ci0tLSBhL2ZzL3ViaWZzL3N1cGVyLmMKKysrIGIvZnMvdWJpZnMvc3VwZXIuYwpAQCAtMjI2NCwxOSArMjI2NCwxMiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKLQllcnIgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZ1Ymlmc19mc190eXBlKTsKLQlpZiAoZXJyKSB7Ci0JCXViaWZzX2VycigiY2Fubm90IHJlZ2lzdGVyIGZpbGUgc3lzdGVtLCBlcnJvciAlZCIsIGVycik7Ci0JCXJldHVybiBlcnI7Ci0JfQotCi0JZXJyID0gLUVOT01FTTsKIAl1Ymlmc19pbm9kZV9zbGFiID0ga21lbV9jYWNoZV9jcmVhdGUoInViaWZzX2lub2RlX3NsYWIiLAogCQkJCXNpemVvZihzdHJ1Y3QgdWJpZnNfaW5vZGUpLCAwLAogCQkJCVNMQUJfTUVNX1NQUkVBRCB8IFNMQUJfUkVDTEFJTV9BQ0NPVU5ULAogCQkJCSZpbm9kZV9zbGFiX2N0b3IpOwogCWlmICghdWJpZnNfaW5vZGVfc2xhYikKLQkJZ290byBvdXRfcmVnOworCQlyZXR1cm4gLUVOT01FTTsKIAogCXJlZ2lzdGVyX3Nocmlua2VyKCZ1Ymlmc19zaHJpbmtlcl9pbmZvKTsKIApAQCAtMjI4OCwxNSArMjI4MSwyMCBAQAogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2NvbXByOwogCisJZXJyID0gcmVnaXN0ZXJfZmlsZXN5c3RlbSgmdWJpZnNfZnNfdHlwZSk7CisJaWYgKGVycikgeworCQl1Ymlmc19lcnIoImNhbm5vdCByZWdpc3RlciBmaWxlIHN5c3RlbSwgZXJyb3IgJWQiLCBlcnIpOworCQlnb3RvIG91dF9kYmc7CisJfQogCXJldHVybiAwOwogCitvdXRfZGJnOgorCWRiZ19kZWJ1Z2ZzX2V4aXQoKTsKIG91dF9jb21wcjoKIAl1Ymlmc19jb21wcmVzc29yc19leGl0KCk7CiBvdXRfc2hyaW5rZXI6CiAJdW5yZWdpc3Rlcl9zaHJpbmtlcigmdWJpZnNfc2hyaW5rZXJfaW5mbyk7CiAJa21lbV9jYWNoZV9kZXN0cm95KHViaWZzX2lub2RlX3NsYWIpOwotb3V0X3JlZzoKLQl1bnJlZ2lzdGVyX2ZpbGVzeXN0ZW0oJnViaWZzX2ZzX3R5cGUpOwogCXJldHVybiBlcnI7CiB9CiAvKiBsYXRlX2luaXRjYWxsIHRvIGxldCBjb21wcmVzc29ycyBpbml0aWFsaXplIGZpcnN0ICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2FjbC5jIGIvZnMveGZzL3hmc19hY2wuYwppbmRleCBiNmM0YjM3Li43NmU0MjY2IDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2FjbC5jCisrKyBiL2ZzL3hmcy94ZnNfYWNsLmMKQEAgLTQyLDYgKzQyLDggQEAKIAlpbnQgY291bnQsIGk7CiAKIAljb3VudCA9IGJlMzJfdG9fY3B1KGFjbHAtPmFjbF9jbnQpOworCWlmIChjb3VudCA+IFhGU19BQ0xfTUFYX0VOVFJJRVMpCisJCXJldHVybiBFUlJfUFRSKC1FRlNDT1JSVVBURUQpOwogCiAJYWNsID0gcG9zaXhfYWNsX2FsbG9jKGNvdW50LCBHRlBfS0VSTkVMKTsKIAlpZiAoIWFjbCkKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMgYi9mcy94ZnMveGZzX2F0dHJfbGVhZi5jCmluZGV4IGQ0OTA2ZTcuLmMxYjU1ZTUgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYXR0cl9sZWFmLmMKKysrIGIvZnMveGZzL3hmc19hdHRyX2xlYWYuYwpAQCAtMTEwLDYgKzExMCw3IEBACiAvKgogICogUXVlcnkgd2hldGhlciB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBhZGRpdGlvbmFsIGJ5dGVzIG9mIGV4dGVuZGVkCiAgKiBhdHRyaWJ1dGUgc3BhY2Ugd2lsbCBiZSBhYmxlIHRvIGZpdCBpbmxpbmUuCisgKgogICogUmV0dXJucyB6ZXJvIGlmIG5vdCwgZWxzZSB0aGUgZGlfZm9ya29mZiBmb3JrIG9mZnNldCB0byBiZSB1c2VkIGluIHRoZQogICogbGl0ZXJhbCBhcmVhIGZvciBhdHRyaWJ1dGUgZGF0YSBvbmNlIHRoZSBuZXcgYnl0ZXMgaGF2ZSBiZWVuIGFkZGVkLgogICoKQEAgLTEyMiw3ICsxMjMsNyBAQAogCWludCBvZmZzZXQ7CiAJaW50IG1pbmZvcmtvZmY7CS8qIGxvd2VyIGxpbWl0IG9uIHZhbGlkIGZvcmtvZmYgbG9jYXRpb25zICovCiAJaW50IG1heGZvcmtvZmY7CS8qIHVwcGVyIGxpbWl0IG9uIHZhbGlkIGZvcmtvZmYgbG9jYXRpb25zICovCi0JaW50IGRzaXplOwkKKwlpbnQgZHNpemU7CiAJeGZzX21vdW50X3QgKm1wID0gZHAtPmlfbW91bnQ7CiAKIAlvZmZzZXQgPSAoWEZTX0xJVElOTyhtcCkgLSBieXRlcykgPj4gMzsgLyogcm91bmRlZCBkb3duICovCkBAIC0xMzYsNDcgKzEzNyw2MCBAQAogCQlyZXR1cm4gKG9mZnNldCA+PSBtaW5mb3Jrb2ZmKSA/IG1pbmZvcmtvZmYgOiAwOwogCX0KIAotCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0FUVFIyKSkgewotCQlpZiAoYnl0ZXMgPD0gWEZTX0lGT1JLX0FTSVpFKGRwKSkKLQkJCXJldHVybiBkcC0+aV9kLmRpX2ZvcmtvZmY7CisJLyoKKwkgKiBJZiB0aGUgcmVxdWVzdGVkIG51bWJlcnMgb2YgYnl0ZXMgaXMgc21hbGxlciBvciBlcXVhbCB0byB0aGUKKwkgKiBjdXJyZW50IGF0dHJpYnV0ZSBmb3JrIHNpemUgd2UgY2FuIGFsd2F5cyBwcm9jZWVkLgorCSAqCisJICogTm90ZSB0aGF0IGlmX2J5dGVzIGluIHRoZSBkYXRhIGZvcmsgbWlnaHQgYWN0dWFsbHkgYmUgbGFyZ2VyIHRoYW4KKwkgKiB0aGUgY3VycmVudCBkYXRhIGZvcmsgc2l6ZSBpcyBkdWUgdG8gZGVsYWxsb2MgZXh0ZW50cy4gSW4gdGhhdAorCSAqIGNhc2UgZWl0aGVyIHRoZSBleHRlbnQgY291bnQgd2lsbCBnbyBkb3duIHdoZW4gdGhleSBhcmUgY29udmVydGVkCisJICogdG8gcmVhbCBleHRlbnRzLCBvciB0aGUgZGVsYWxsb2MgY29udmVyc2lvbiB3aWxsIHRha2UgY2FyZSBvZiB0aGUKKwkgKiBsaXRlcmFsIGFyZWEgcmViYWxhbmNpbmcuCisJICovCisJaWYgKGJ5dGVzIDw9IFhGU19JRk9SS19BU0laRShkcCkpCisJCXJldHVybiBkcC0+aV9kLmRpX2ZvcmtvZmY7CisKKwkvKgorCSAqIEZvciBhdHRyMiB3ZSBjYW4gdHJ5IHRvIG1vdmUgdGhlIGZvcmtvZmYgaWYgdGhlcmUgaXMgc3BhY2UgaW4gdGhlCisJICogbGl0ZXJhbCBhcmVhLCBidXQgZm9yIHRoZSBvbGQgZm9ybWF0IHdlIGFyZSBkb25lIGlmIHRoZXJlIGlzIG5vCisJICogc3BhY2UgaW4gdGhlIGZpeGVkIGF0dHJpYnV0ZSBmb3JrLgorCSAqLworCWlmICghKG1wLT5tX2ZsYWdzICYgWEZTX01PVU5UX0FUVFIyKSkKIAkJcmV0dXJuIDA7Ci0JfQogCiAJZHNpemUgPSBkcC0+aV9kZi5pZl9ieXRlczsKLQkKKwogCXN3aXRjaCAoZHAtPmlfZC5kaV9mb3JtYXQpIHsKIAljYXNlIFhGU19ESU5PREVfRk1UX0VYVEVOVFM6Ci0JCS8qIAorCQkvKgogCQkgKiBJZiB0aGVyZSBpcyBubyBhdHRyIGZvcmsgYW5kIHRoZSBkYXRhIGZvcmsgaXMgZXh0ZW50cywgCi0JCSAqIGRldGVybWluZSBpZiBjcmVhdGluZyB0aGUgZGVmYXVsdCBhdHRyIGZvcmsgd2lsbCByZXN1bHQgCi0JCSAqIGluIHRoZSBleHRlbnRzIGZvcm0gbWlncmF0aW5nIHRvIGJ0cmVlLiBJZiBzbywgdGhlIAotCQkgKiBtaW5pbXVtIG9mZnNldCBvbmx5IG5lZWRzIHRvIGJlIHRoZSBzcGFjZSByZXF1aXJlZCBmb3IgCisJCSAqIGRldGVybWluZSBpZiBjcmVhdGluZyB0aGUgZGVmYXVsdCBhdHRyIGZvcmsgd2lsbCByZXN1bHQKKwkJICogaW4gdGhlIGV4dGVudHMgZm9ybSBtaWdyYXRpbmcgdG8gYnRyZWUuIElmIHNvLCB0aGUKKwkJICogbWluaW11bSBvZmZzZXQgb25seSBuZWVkcyB0byBiZSB0aGUgc3BhY2UgcmVxdWlyZWQgZm9yCiAJCSAqIHRoZSBidHJlZSByb290LgotCQkgKi8gCisJCSAqLwogCQlpZiAoIWRwLT5pX2QuZGlfZm9ya29mZiAmJiBkcC0+aV9kZi5pZl9ieXRlcyA+CiAJCSAgICB4ZnNfZGVmYXVsdF9hdHRyb2Zmc2V0KGRwKSkKIAkJCWRzaXplID0gWEZTX0JNRFJfU1BBQ0VfQ0FMQyhNSU5EQlRQVFJTKTsKIAkJYnJlYWs7Ci0JCQogCWNhc2UgWEZTX0RJTk9ERV9GTVRfQlRSRUU6CiAJCS8qCi0JCSAqIElmIGhhdmUgZGF0YSBidHJlZSB0aGVuIGtlZXAgZm9ya29mZiBpZiB3ZSBoYXZlIG9uZSwKLQkJICogb3RoZXJ3aXNlIHdlIGFyZSBhZGRpbmcgYSBuZXcgYXR0ciwgc28gdGhlbiB3ZSBzZXQgCi0JCSAqIG1pbmZvcmtvZmYgdG8gd2hlcmUgdGhlIGJ0cmVlIHJvb3QgY2FuIGZpbmlzaCBzbyB3ZSBoYXZlIAorCQkgKiBJZiB3ZSBoYXZlIGEgZGF0YSBidHJlZSB0aGVuIGtlZXAgZm9ya29mZiBpZiB3ZSBoYXZlIG9uZSwKKwkJICogb3RoZXJ3aXNlIHdlIGFyZSBhZGRpbmcgYSBuZXcgYXR0ciwgc28gdGhlbiB3ZSBzZXQKKwkJICogbWluZm9ya29mZiB0byB3aGVyZSB0aGUgYnRyZWUgcm9vdCBjYW4gZmluaXNoIHNvIHdlIGhhdmUKIAkJICogcGxlbnR5IG9mIHJvb20gZm9yIGF0dHJzCiAJCSAqLwogCQlpZiAoZHAtPmlfZC5kaV9mb3Jrb2ZmKSB7Ci0JCQlpZiAob2Zmc2V0IDwgZHAtPmlfZC5kaV9mb3Jrb2ZmKSAKKwkJCWlmIChvZmZzZXQgPCBkcC0+aV9kLmRpX2ZvcmtvZmYpCiAJCQkJcmV0dXJuIDA7Ci0JCQllbHNlIAotCQkJCXJldHVybiBkcC0+aV9kLmRpX2ZvcmtvZmY7Ci0JCX0gZWxzZQotCQkJZHNpemUgPSBYRlNfQk1BUF9CUk9PVF9TUEFDRShkcC0+aV9kZi5pZl9icm9vdCk7CisJCQlyZXR1cm4gZHAtPmlfZC5kaV9mb3Jrb2ZmOworCQl9CisJCWRzaXplID0gWEZTX0JNQVBfQlJPT1RfU1BBQ0UoZHAtPmlfZGYuaWZfYnJvb3QpOwogCQlicmVhazsKIAl9Ci0JCi0JLyogCi0JICogQSBkYXRhIGZvcmsgYnRyZWUgcm9vdCBtdXN0IGhhdmUgc3BhY2UgZm9yIGF0IGxlYXN0IAorCisJLyoKKwkgKiBBIGRhdGEgZm9yayBidHJlZSByb290IG11c3QgaGF2ZSBzcGFjZSBmb3IgYXQgbGVhc3QKIAkgKiBNSU5EQlRQVFJTIGtleS9wdHIgcGFpcnMgaWYgdGhlIGRhdGEgZm9yayBpcyBzbWFsbCBvciBlbXB0eS4KIAkgKi8KIAltaW5mb3Jrb2ZmID0gTUFYKGRzaXplLCBYRlNfQk1EUl9TUEFDRV9DQUxDKE1JTkRCVFBUUlMpKTsKQEAgLTE4NiwxMCArMjAwLDEwIEBACiAJbWF4Zm9ya29mZiA9IFhGU19MSVRJTk8obXApIC0gWEZTX0JNRFJfU1BBQ0VfQ0FMQyhNSU5BQlRQVFJTKTsKIAltYXhmb3Jrb2ZmID0gbWF4Zm9ya29mZiA+PiAzOwkvKiByb3VuZGVkIGRvd24gKi8KIAotCWlmIChvZmZzZXQgPj0gbWluZm9ya29mZiAmJiBvZmZzZXQgPCBtYXhmb3Jrb2ZmKQotCQlyZXR1cm4gb2Zmc2V0OwogCWlmIChvZmZzZXQgPj0gbWF4Zm9ya29mZikKIAkJcmV0dXJuIG1heGZvcmtvZmY7CisJaWYgKG9mZnNldCA+PSBtaW5mb3Jrb2ZmKQorCQlyZXR1cm4gb2Zmc2V0OwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2JtYXAuYyBiL2ZzL3hmcy94ZnNfYm1hcC5jCmluZGV4IGM2OGJhZWIuLmQwYWI3ODggMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfYm1hcC5jCisrKyBiL2ZzL3hmcy94ZnNfYm1hcC5jCkBAIC0yMzgzLDYgKzIzODMsOCBAQAogCWludAkJdHJ5YWdhaW47CiAJaW50CQllcnJvcjsKIAorCUFTU0VSVChhcC0+bGVuZ3RoKTsKKwogCW1wID0gYXAtPmlwLT5pX21vdW50OwogCWFsaWduID0gYXAtPnVzZXJkYXRhID8geGZzX2dldF9leHRzel9oaW50KGFwLT5pcCkgOiAwOwogCWlmICh1bmxpa2VseShhbGlnbikpIHsKQEAgLTQ2MjksNiArNDYzMSw4IEBACiAJaW50CQkJZXJyb3I7CiAJaW50CQkJcnQ7CiAKKwlBU1NFUlQoYm1hLT5sZW5ndGggPiAwKTsKKwogCXJ0ID0gKHdoaWNoZm9yayA9PSBYRlNfREFUQV9GT1JLKSAmJiBYRlNfSVNfUkVBTFRJTUVfSU5PREUoYm1hLT5pcCk7CiAKIAkvKgpAQCAtNDg0OSw2ICs0ODUzLDcgQEAKIAlBU1NFUlQoKm5tYXAgPD0gWEZTX0JNQVBfTUFYX05NQVApOwogCUFTU0VSVCghKGZsYWdzICYgWEZTX0JNQVBJX0lHU1RBVEUpKTsKIAlBU1NFUlQodHAgIT0gTlVMTCk7CisJQVNTRVJUKGxlbiA+IDApOwogCiAJd2hpY2hmb3JrID0gKGZsYWdzICYgWEZTX0JNQVBJX0FUVFJGT1JLKSA/CiAJCVhGU19BVFRSX0ZPUksgOiBYRlNfREFUQV9GT1JLOwpAQCAtNDkxOCw5ICs0OTIzLDIyIEBACiAJCQlibWEuZW9mID0gZW9mOwogCQkJYm1hLmNvbnYgPSAhIShmbGFncyAmIFhGU19CTUFQSV9DT05WRVJUKTsKIAkJCWJtYS53YXNkZWwgPSB3YXNkZWxheTsKLQkJCWJtYS5sZW5ndGggPSBsZW47CiAJCQlibWEub2Zmc2V0ID0gYm5vOwogCisJCQkvKgorCQkJICogVGhlcmUncyBhIDMyLzY0IGJpdCB0eXBlIG1pc21hdGNoIGJldHdlZW4gdGhlCisJCQkgKiBhbGxvY2F0aW9uIGxlbmd0aCByZXF1ZXN0ICh3aGljaCBjYW4gYmUgNjQgYml0cyBpbgorCQkJICogbGVuZ3RoKSBhbmQgdGhlIGJtYSBsZW5ndGggcmVxdWVzdCwgd2hpY2ggaXMKKwkJCSAqIHhmc19leHRsZW5fdCBhbmQgdGhlcmVmb3JlIDMyIGJpdHMuIEhlbmNlIHdlIGhhdmUgdG8KKwkJCSAqIGNoZWNrIGZvciAzMi1iaXQgb3ZlcmZsb3dzIGFuZCBoYW5kbGUgdGhlbSBoZXJlLgorCQkJICovCisJCQlpZiAobGVuID4gKHhmc19maWxibGtzX3QpTUFYRVhUTEVOKQorCQkJCWJtYS5sZW5ndGggPSBNQVhFWFRMRU47CisJCQllbHNlCisJCQkJYm1hLmxlbmd0aCA9IGxlbjsKKworCQkJQVNTRVJUKGxlbiA+IDApOworCQkJQVNTRVJUKGJtYS5sZW5ndGggPiAwKTsKIAkJCWVycm9yID0geGZzX2JtYXBpX2FsbG9jYXRlKCZibWEsIGZsYWdzKTsKIAkJCWlmIChlcnJvcikKIAkJCQlnb3RvIGVycm9yMDsKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfZXhwb3J0LmMgYi9mcy94ZnMveGZzX2V4cG9ydC5jCmluZGV4IGRhMTA4OTcuLjU1ODkxMGYgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZXhwb3J0LmMKKysrIGIvZnMveGZzL3hmc19leHBvcnQuYwpAQCAtOTgsMjIgKzk4LDIyIEBACiAJc3dpdGNoIChmaWxlaWRfdHlwZSkgewogCWNhc2UgRklMRUlEX0lOTzMyX0dFTl9QQVJFTlQ6CiAJCXNwaW5fbG9jaygmZGVudHJ5LT5kX2xvY2spOwotCQlmaWQtPmkzMi5wYXJlbnRfaW5vID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9pbm87CisJCWZpZC0+aTMyLnBhcmVudF9pbm8gPSBYRlNfSShkZW50cnktPmRfcGFyZW50LT5kX2lub2RlKS0+aV9pbm87CiAJCWZpZC0+aTMyLnBhcmVudF9nZW4gPSBkZW50cnktPmRfcGFyZW50LT5kX2lub2RlLT5pX2dlbmVyYXRpb247CiAJCXNwaW5fdW5sb2NrKCZkZW50cnktPmRfbG9jayk7CiAJCS8qRkFMTFRIUlUqLwogCWNhc2UgRklMRUlEX0lOTzMyX0dFTjoKLQkJZmlkLT5pMzIuaW5vID0gaW5vZGUtPmlfaW5vOworCQlmaWQtPmkzMi5pbm8gPSBYRlNfSShpbm9kZSktPmlfaW5vOwogCQlmaWQtPmkzMi5nZW4gPSBpbm9kZS0+aV9nZW5lcmF0aW9uOwogCQlicmVhazsKIAljYXNlIEZJTEVJRF9JTk8zMl9HRU5fUEFSRU5UIHwgWEZTX0ZJTEVJRF9UWVBFXzY0RkxBRzoKIAkJc3Bpbl9sb2NrKCZkZW50cnktPmRfbG9jayk7Ci0JCWZpZDY0LT5wYXJlbnRfaW5vID0gZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZS0+aV9pbm87CisJCWZpZDY0LT5wYXJlbnRfaW5vID0gWEZTX0koZGVudHJ5LT5kX3BhcmVudC0+ZF9pbm9kZSktPmlfaW5vOwogCQlmaWQ2NC0+cGFyZW50X2dlbiA9IGRlbnRyeS0+ZF9wYXJlbnQtPmRfaW5vZGUtPmlfZ2VuZXJhdGlvbjsKIAkJc3Bpbl91bmxvY2soJmRlbnRyeS0+ZF9sb2NrKTsKIAkJLypGQUxMVEhSVSovCiAJY2FzZSBGSUxFSURfSU5PMzJfR0VOIHwgWEZTX0ZJTEVJRF9UWVBFXzY0RkxBRzoKLQkJZmlkNjQtPmlubyA9IGlub2RlLT5pX2lubzsKKwkJZmlkNjQtPmlubyA9IFhGU19JKGlub2RlKS0+aV9pbm87CiAJCWZpZDY0LT5nZW4gPSBpbm9kZS0+aV9nZW5lcmF0aW9uOwogCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmMgYi9mcy94ZnMveGZzX2lub2RlLmMKaW5kZXggYzAyMzdjNi4uNzU1ZWU4MSAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5jCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuYwpAQCAtMjgzNSw2ICsyODM1LDI3IEBACiAJcmV0dXJuIFhGU19FUlJPUihFRlNDT1JSVVBURUQpOwogfQogCit2b2lkCit4ZnNfcHJvbW90ZV9pbm9kZSgKKwlzdHJ1Y3QgeGZzX2lub2RlCSppcCkKK3sKKwlzdHJ1Y3QgeGZzX2J1ZgkJKmJwOworCisJQVNTRVJUKHhmc19pc2lsb2NrZWQoaXAsIFhGU19JTE9DS19FWENMfFhGU19JTE9DS19TSEFSRUQpKTsKKworCWJwID0geGZzX2luY29yZShpcC0+aV9tb3VudC0+bV9kZGV2X3RhcmdwLCBpcC0+aV9pbWFwLmltX2Jsa25vLAorCQkJaXAtPmlfaW1hcC5pbV9sZW4sIFhCRl9UUllMT0NLKTsKKwlpZiAoIWJwKQorCQlyZXR1cm47CisKKwlpZiAoWEZTX0JVRl9JU0RFTEFZV1JJVEUoYnApKSB7CisJCXhmc19idWZfZGVsd3JpX3Byb21vdGUoYnApOworCQl3YWtlX3VwX3Byb2Nlc3MoaXAtPmlfbW91bnQtPm1fZGRldl90YXJncC0+YnRfdGFzayk7CisJfQorCisJeGZzX2J1Zl9yZWxzZShicCk7Cit9CisKIC8qCiAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBleHRlbnQgcmVjb3JkIGF0IGZpbGUgaW5kZXggaWR4LgogICovCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2lub2RlLmggYi9mcy94ZnMveGZzX2lub2RlLmgKaW5kZXggNzYwMTQwZC4uYjRjZDQ3MyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19pbm9kZS5oCisrKyBiL2ZzL3hmcy94ZnNfaW5vZGUuaApAQCAtNDk4LDYgKzQ5OCw3IEBACiB2b2lkCQl4ZnNfaWV4dF9yZWFsbG9jKHhmc19pbm9kZV90ICosIGludCwgaW50KTsKIHZvaWQJCXhmc19pdW5waW5fd2FpdCh4ZnNfaW5vZGVfdCAqKTsKIGludAkJeGZzX2lmbHVzaCh4ZnNfaW5vZGVfdCAqLCB1aW50KTsKK3ZvaWQJCXhmc19wcm9tb3RlX2lub2RlKHN0cnVjdCB4ZnNfaW5vZGUgKik7CiB2b2lkCQl4ZnNfbG9ja19pbm9kZXMoeGZzX2lub2RlX3QgKiosIGludCwgdWludCk7CiB2b2lkCQl4ZnNfbG9ja190d29faW5vZGVzKHhmc19pbm9kZV90ICosIHhmc19pbm9kZV90ICosIHVpbnQpOwogCmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZy5jIGIvZnMveGZzL3hmc19sb2cuYwppbmRleCBhMTRjZDg5Li4zNDgxN2FkIDEwMDY0NAotLS0gYS9mcy94ZnMveGZzX2xvZy5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nLmMKQEAgLTE1MCw2ICsxNTAsMTE3IEBACiAJfSB3aGlsZSAoaGVhZF92YWwgIT0gb2xkKTsKIH0KIAorU1RBVElDIGJvb2wKK3hsb2dfcmVzZXJ2ZXFfd2FrZSgKKwlzdHJ1Y3QgbG9nCQkqbG9nLAorCWludAkJCSpmcmVlX2J5dGVzKQoreworCXN0cnVjdCB4bG9nX3RpY2tldAkqdGljOworCWludAkJCW5lZWRfYnl0ZXM7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRpYywgJmxvZy0+bF9yZXNlcnZlcSwgdF9xdWV1ZSkgeworCQlpZiAodGljLT50X2ZsYWdzICYgWExPR19USUNfUEVSTV9SRVNFUlYpCisJCQluZWVkX2J5dGVzID0gdGljLT50X3VuaXRfcmVzICogdGljLT50X2NudDsKKwkJZWxzZQorCQkJbmVlZF9ieXRlcyA9IHRpYy0+dF91bml0X3JlczsKKworCQlpZiAoKmZyZWVfYnl0ZXMgPCBuZWVkX2J5dGVzKQorCQkJcmV0dXJuIGZhbHNlOworCQkqZnJlZV9ieXRlcyAtPSBuZWVkX2J5dGVzOworCisJCXRyYWNlX3hmc19sb2dfZ3JhbnRfd2FrZV91cChsb2csIHRpYyk7CisJCXdha2VfdXAoJnRpYy0+dF93YWl0KTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworU1RBVElDIGJvb2wKK3hsb2dfd3JpdGVxX3dha2UoCisJc3RydWN0IGxvZwkJKmxvZywKKwlpbnQJCQkqZnJlZV9ieXRlcykKK3sKKwlzdHJ1Y3QgeGxvZ190aWNrZXQJKnRpYzsKKwlpbnQJCQluZWVkX2J5dGVzOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh0aWMsICZsb2ctPmxfd3JpdGVxLCB0X3F1ZXVlKSB7CisJCUFTU0VSVCh0aWMtPnRfZmxhZ3MgJiBYTE9HX1RJQ19QRVJNX1JFU0VSVik7CisKKwkJbmVlZF9ieXRlcyA9IHRpYy0+dF91bml0X3JlczsKKworCQlpZiAoKmZyZWVfYnl0ZXMgPCBuZWVkX2J5dGVzKQorCQkJcmV0dXJuIGZhbHNlOworCQkqZnJlZV9ieXRlcyAtPSBuZWVkX2J5dGVzOworCisJCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV93YWtlX3VwKGxvZywgdGljKTsKKwkJd2FrZV91cCgmdGljLT50X3dhaXQpOworCX0KKworCXJldHVybiB0cnVlOworfQorCitTVEFUSUMgaW50Cit4bG9nX3Jlc2VydmVxX3dhaXQoCisJc3RydWN0IGxvZwkJKmxvZywKKwlzdHJ1Y3QgeGxvZ190aWNrZXQJKnRpYywKKwlpbnQJCQluZWVkX2J5dGVzKQoreworCWxpc3RfYWRkX3RhaWwoJnRpYy0+dF9xdWV1ZSwgJmxvZy0+bF9yZXNlcnZlcSk7CisKKwlkbyB7CisJCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQorCQkJZ290byBzaHV0ZG93bjsKKwkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2csIG5lZWRfYnl0ZXMpOworCisJCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOworCQl0cmFjZV94ZnNfbG9nX2dyYW50X3NsZWVwKGxvZywgdGljKTsKKworCQl4bG9nX3dhaXQoJnRpYy0+dF93YWl0LCAmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7CisJCXRyYWNlX3hmc19sb2dfZ3JhbnRfd2FrZShsb2csIHRpYyk7CisKKwkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKKwkJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCisJCQlnb3RvIHNodXRkb3duOworCX0gd2hpbGUgKHhsb2dfc3BhY2VfbGVmdChsb2csICZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9oZWFkKSA8IG5lZWRfYnl0ZXMpOworCisJbGlzdF9kZWxfaW5pdCgmdGljLT50X3F1ZXVlKTsKKwlyZXR1cm4gMDsKK3NodXRkb3duOgorCWxpc3RfZGVsX2luaXQoJnRpYy0+dF9xdWV1ZSk7CisJcmV0dXJuIFhGU19FUlJPUihFSU8pOworfQorCitTVEFUSUMgaW50Cit4bG9nX3dyaXRlcV93YWl0KAorCXN0cnVjdCBsb2cJCSpsb2csCisJc3RydWN0IHhsb2dfdGlja2V0CSp0aWMsCisJaW50CQkJbmVlZF9ieXRlcykKK3sKKwlsaXN0X2FkZF90YWlsKCZ0aWMtPnRfcXVldWUsICZsb2ctPmxfd3JpdGVxKTsKKworCWRvIHsKKwkJaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCisJCQlnb3RvIHNodXRkb3duOworCQl4bG9nX2dyYW50X3B1c2hfYWlsKGxvZywgbmVlZF9ieXRlcyk7CisKKwkJWEZTX1NUQVRTX0lOQyh4c19zbGVlcF9sb2dzcGFjZSk7CisJCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV9zbGVlcChsb2csIHRpYyk7CisKKwkJeGxvZ193YWl0KCZ0aWMtPnRfd2FpdCwgJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKKwkJdHJhY2VfeGZzX2xvZ19yZWdyYW50X3dyaXRlX3dha2UobG9nLCB0aWMpOworCisJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOworCQlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKKwkJCWdvdG8gc2h1dGRvd247CisJfSB3aGlsZSAoeGxvZ19zcGFjZV9sZWZ0KGxvZywgJmxvZy0+bF9ncmFudF93cml0ZV9oZWFkKSA8IG5lZWRfYnl0ZXMpOworCisJbGlzdF9kZWxfaW5pdCgmdGljLT50X3F1ZXVlKTsKKwlyZXR1cm4gMDsKK3NodXRkb3duOgorCWxpc3RfZGVsX2luaXQoJnRpYy0+dF9xdWV1ZSk7CisJcmV0dXJuIFhGU19FUlJPUihFSU8pOworfQorCiBzdGF0aWMgdm9pZAogeGxvZ190aWNfcmVzZXRfcmVzKHhsb2dfdGlja2V0X3QgKnRpYykKIHsKQEAgLTM1MCw4ICs0NjEsMTkgQEAKIAkJcmV0dmFsID0geGxvZ19ncmFudF9sb2dfc3BhY2UobG9nLCBpbnRlcm5hbF90aWNrZXQpOwogCX0KIAorCWlmICh1bmxpa2VseShyZXR2YWwpKSB7CisJCS8qCisJCSAqIElmIHdlIGFyZSBmYWlsaW5nLCBtYWtlIHN1cmUgdGhlIHRpY2tldCBkb2Vzbid0IGhhdmUgYW55CisJCSAqIGN1cnJlbnQgcmVzZXJ2YXRpb25zLiAgV2UgZG9uJ3Qgd2FudCB0byBhZGQgdGhpcyBiYWNrCisJCSAqIHdoZW4gdGhlIHRpY2tldC8gdHJhbnNhY3Rpb24gZ2V0cyBjYW5jZWxsZWQuCisJCSAqLworCQlpbnRlcm5hbF90aWNrZXQtPnRfY3Vycl9yZXMgPSAwOworCQkvKiB1bmdyYW50IHdpbGwgZ2l2ZSBiYWNrIHVuaXRfcmVzICogdF9jbnQuICovCisJCWludGVybmFsX3RpY2tldC0+dF9jbnQgPSAwOworCX0KKwogCXJldHVybiByZXR2YWw7Ci19CS8qIHhmc19sb2dfcmVzZXJ2ZSAqLworfQogCiAKIC8qCkBAIC0yNDgxLDggKzI2MDMsOCBAQAogLyoKICAqIEF0b21pY2FsbHkgZ2V0IHRoZSBsb2cgc3BhY2UgcmVxdWlyZWQgZm9yIGEgbG9nIHRpY2tldC4KICAqCi0gKiBPbmNlIGEgdGlja2V0IGdldHMgcHV0IG9udG8gdGhlIHJlc2VydmVxLCBpdCB3aWxsIG9ubHkgcmV0dXJuIGFmdGVyCi0gKiB0aGUgbmVlZGVkIHJlc2VydmF0aW9uIGlzIHNhdGlzZmllZC4KKyAqIE9uY2UgYSB0aWNrZXQgZ2V0cyBwdXQgb250byB0aGUgcmVzZXJ2ZXEsIGl0IHdpbGwgb25seSByZXR1cm4gYWZ0ZXIgdGhlCisgKiBuZWVkZWQgcmVzZXJ2YXRpb24gaXMgc2F0aXNmaWVkLgogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgc3RydWN0dXJlZCBzbyB0aGF0IGl0IGhhcyBhIGxvY2sgZnJlZSBmYXN0IHBhdGguIFRoaXMgaXMKICAqIG5lY2Vzc2FyeSBiZWNhdXNlIGV2ZXJ5IG5ldyB0cmFuc2FjdGlvbiByZXNlcnZhdGlvbiB3aWxsIGNvbWUgdGhyb3VnaCB0aGlzCkBAIC0yNDkwLDExMyArMjYxMiw1MyBAQAogICogZXZlcnkgcGFzcy4KICAqCiAgKiBBcyB0aWNrZXRzIGFyZSBvbmx5IGV2ZXIgbW92ZWQgb24gYW5kIG9mZiB0aGUgcmVzZXJ2ZXEgdW5kZXIgdGhlCi0gKiBsX2dyYW50X3Jlc2VydmVfbG9jaywgd2Ugb25seSBuZWVkIHRvIHRha2UgdGhhdCBsb2NrIGlmIHdlIGFyZSBnb2luZwotICogdG8gYWRkIHRoZSB0aWNrZXQgdG8gdGhlIHF1ZXVlIGFuZCBzbGVlcC4gV2UgY2FuIGF2b2lkIHRha2luZyB0aGUgbG9jayBpZiB0aGUKLSAqIHRpY2tldCB3YXMgbmV2ZXIgYWRkZWQgdG8gdGhlIHJlc2VydmVxIGJlY2F1c2UgdGhlIHRfcXVldWUgbGlzdCBoZWFkIHdpbGwgYmUKLSAqIGVtcHR5IGFuZCB3ZSBob2xkIHRoZSBvbmx5IHJlZmVyZW5jZSB0byBpdCBzbyBpdCBjYW4gc2FmZWx5IGJlIGNoZWNrZWQKLSAqIHVubG9ja2VkLgorICogbF9ncmFudF9yZXNlcnZlX2xvY2ssIHdlIG9ubHkgbmVlZCB0byB0YWtlIHRoYXQgbG9jayBpZiB3ZSBhcmUgZ29pbmcgdG8gYWRkCisgKiB0aGUgdGlja2V0IHRvIHRoZSBxdWV1ZSBhbmQgc2xlZXAuIFdlIGNhbiBhdm9pZCB0YWtpbmcgdGhlIGxvY2sgaWYgdGhlIHRpY2tldAorICogd2FzIG5ldmVyIGFkZGVkIHRvIHRoZSByZXNlcnZlcSBiZWNhdXNlIHRoZSB0X3F1ZXVlIGxpc3QgaGVhZCB3aWxsIGJlIGVtcHR5CisgKiBhbmQgd2UgaG9sZCB0aGUgb25seSByZWZlcmVuY2UgdG8gaXQgc28gaXQgY2FuIHNhZmVseSBiZSBjaGVja2VkIHVubG9ja2VkLgogICovCiBTVEFUSUMgaW50Ci14bG9nX2dyYW50X2xvZ19zcGFjZSh4bG9nX3QJICAgKmxvZywKLQkJICAgICB4bG9nX3RpY2tldF90ICp0aWMpCit4bG9nX2dyYW50X2xvZ19zcGFjZSgKKwlzdHJ1Y3QgbG9nCQkqbG9nLAorCXN0cnVjdCB4bG9nX3RpY2tldAkqdGljKQogewotCWludAkJIGZyZWVfYnl0ZXM7Ci0JaW50CQkgbmVlZF9ieXRlczsKKwlpbnQJCQlmcmVlX2J5dGVzLCBuZWVkX2J5dGVzOworCWludAkJCWVycm9yID0gMDsKIAotI2lmZGVmIERFQlVHCi0JaWYgKGxvZy0+bF9mbGFncyAmIFhMT0dfQUNUSVZFX1JFQ09WRVJZKQotCQlwYW5pYygiZ3JhbnQgUmVjb3ZlcnkgcHJvYmxlbSIpOwotI2VuZGlmCisJQVNTRVJUKCEobG9nLT5sX2ZsYWdzICYgWExPR19BQ1RJVkVfUkVDT1ZFUlkpKTsKIAogCXRyYWNlX3hmc19sb2dfZ3JhbnRfZW50ZXIobG9nLCB0aWMpOwogCisJLyoKKwkgKiBJZiB0aGVyZSBhcmUgb3RoZXIgd2FpdGVycyBvbiB0aGUgcXVldWUgdGhlbiBnaXZlIHRoZW0gYSBjaGFuY2UgYXQKKwkgKiBsb2dzcGFjZSBiZWZvcmUgdXMuICBXYWtlIHVwIHRoZSBmaXJzdCB3YWl0ZXJzLCBpZiB3ZSBkbyBub3Qgd2FrZQorCSAqIHVwIGFsbCB0aGUgd2FpdGVycyB0aGVuIGdvIHRvIHNsZWVwIHdhaXRpbmcgZm9yIG1vcmUgZnJlZSBzcGFjZSwKKwkgKiBvdGhlcndpc2UgdHJ5IHRvIGdldCBzb21lIHNwYWNlIGZvciB0aGlzIHRyYW5zYWN0aW9uLgorCSAqLwogCW5lZWRfYnl0ZXMgPSB0aWMtPnRfdW5pdF9yZXM7CiAJaWYgKHRpYy0+dF9mbGFncyAmIFhGU19MT0dfUEVSTV9SRVNFUlYpCiAJCW5lZWRfYnl0ZXMgKj0gdGljLT50X29jbnQ7Ci0KLQkvKiBzb21ldGhpbmcgaXMgYWxyZWFkeSBzbGVlcGluZzsgaW5zZXJ0IG5ldyB0cmFuc2FjdGlvbiBhdCBlbmQgKi8KKwlmcmVlX2J5dGVzID0geGxvZ19zcGFjZV9sZWZ0KGxvZywgJmxvZy0+bF9ncmFudF9yZXNlcnZlX2hlYWQpOwogCWlmICghbGlzdF9lbXB0eV9jYXJlZnVsKCZsb2ctPmxfcmVzZXJ2ZXEpKSB7CiAJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7Ci0JCS8qIHJlY2hlY2sgdGhlIHF1ZXVlIG5vdyB3ZSBhcmUgbG9ja2VkICovCi0JCWlmIChsaXN0X2VtcHR5KCZsb2ctPmxfcmVzZXJ2ZXEpKSB7Ci0JCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7Ci0JCQlnb3RvIHJlZG87Ci0JCX0KLQkJbGlzdF9hZGRfdGFpbCgmdGljLT50X3F1ZXVlLCAmbG9nLT5sX3Jlc2VydmVxKTsKLQotCQl0cmFjZV94ZnNfbG9nX2dyYW50X3NsZWVwMShsb2csIHRpYyk7Ci0KLQkJLyoKLQkJICogR290dGEgY2hlY2sgdGhpcyBiZWZvcmUgZ29pbmcgdG8gc2xlZXAsIHdoaWxlIHdlJ3JlCi0JCSAqIGhvbGRpbmcgdGhlIGdyYW50IGxvY2suCi0JCSAqLwotCQlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOwotCQl4bG9nX3dhaXQoJnRpYy0+dF93YWl0LCAmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7Ci0KLQkJLyoKLQkJICogSWYgd2UgZ290IGFuIGVycm9yLCBhbmQgdGhlIGZpbGVzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biwKLQkJICogd2UnbGwgY2F0Y2ggaXQgZG93biBiZWxvdy4gU28ganVzdCBjb250aW51ZS4uLgotCQkgKi8KLQkJdHJhY2VfeGZzX2xvZ19ncmFudF93YWtlMShsb2csIHRpYyk7Ci0JfQotCi1yZWRvOgotCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQotCQlnb3RvIGVycm9yX3JldHVybl91bmxvY2tlZDsKLQotCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCAmbG9nLT5sX2dyYW50X3Jlc2VydmVfaGVhZCk7Ci0JaWYgKGZyZWVfYnl0ZXMgPCBuZWVkX2J5dGVzKSB7CisJCWlmICgheGxvZ19yZXNlcnZlcV93YWtlKGxvZywgJmZyZWVfYnl0ZXMpIHx8CisJCSAgICBmcmVlX2J5dGVzIDwgbmVlZF9ieXRlcykKKwkJCWVycm9yID0geGxvZ19yZXNlcnZlcV93YWl0KGxvZywgdGljLCBuZWVkX2J5dGVzKTsKKwkJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOworCX0gZWxzZSBpZiAoZnJlZV9ieXRlcyA8IG5lZWRfYnl0ZXMpIHsKIAkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9sb2NrKTsKLQkJaWYgKGxpc3RfZW1wdHkoJnRpYy0+dF9xdWV1ZSkpCi0JCQlsaXN0X2FkZF90YWlsKCZ0aWMtPnRfcXVldWUsICZsb2ctPmxfcmVzZXJ2ZXEpOwotCi0JCXRyYWNlX3hmc19sb2dfZ3JhbnRfc2xlZXAyKGxvZywgdGljKTsKLQotCQlpZiAoWExPR19GT1JDRURfU0hVVERPV04obG9nKSkKLQkJCWdvdG8gZXJyb3JfcmV0dXJuOwotCi0JCXhsb2dfZ3JhbnRfcHVzaF9haWwobG9nLCBuZWVkX2J5dGVzKTsKLQotCQlYRlNfU1RBVFNfSU5DKHhzX3NsZWVwX2xvZ3NwYWNlKTsKLQkJeGxvZ193YWl0KCZ0aWMtPnRfd2FpdCwgJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOwotCi0JCXRyYWNlX3hmc19sb2dfZ3JhbnRfd2FrZTIobG9nLCB0aWMpOwotCQlnb3RvIHJlZG87Ci0JfQotCi0JaWYgKCFsaXN0X2VtcHR5KCZ0aWMtPnRfcXVldWUpKSB7Ci0JCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3Jlc2VydmVfbG9jayk7Ci0JCWxpc3RfZGVsX2luaXQoJnRpYy0+dF9xdWV1ZSk7CisJCWVycm9yID0geGxvZ19yZXNlcnZlcV93YWl0KGxvZywgdGljLCBuZWVkX2J5dGVzKTsKIAkJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOwogCX0KKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKIAotCS8qIHdlJ3ZlIGdvdCBlbm91Z2ggc3BhY2UgKi8KIAl4bG9nX2dyYW50X2FkZF9zcGFjZShsb2csICZsb2ctPmxfZ3JhbnRfcmVzZXJ2ZV9oZWFkLCBuZWVkX2J5dGVzKTsKIAl4bG9nX2dyYW50X2FkZF9zcGFjZShsb2csICZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCwgbmVlZF9ieXRlcyk7CiAJdHJhY2VfeGZzX2xvZ19ncmFudF9leGl0KGxvZywgdGljKTsKIAl4bG9nX3ZlcmlmeV9ncmFudF90YWlsKGxvZyk7CiAJcmV0dXJuIDA7Ci0KLWVycm9yX3JldHVybl91bmxvY2tlZDoKLQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOwotZXJyb3JfcmV0dXJuOgotCWxpc3RfZGVsX2luaXQoJnRpYy0+dF9xdWV1ZSk7Ci0Jc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF9yZXNlcnZlX2xvY2spOwotCXRyYWNlX3hmc19sb2dfZ3JhbnRfZXJyb3IobG9nLCB0aWMpOwotCi0JLyoKLQkgKiBJZiB3ZSBhcmUgZmFpbGluZywgbWFrZSBzdXJlIHRoZSB0aWNrZXQgZG9lc24ndCBoYXZlIGFueQotCSAqIGN1cnJlbnQgcmVzZXJ2YXRpb25zLiBXZSBkb24ndCB3YW50IHRvIGFkZCB0aGlzIGJhY2sgd2hlbgotCSAqIHRoZSB0aWNrZXQvdHJhbnNhY3Rpb24gZ2V0cyBjYW5jZWxsZWQuCi0JICovCi0JdGljLT50X2N1cnJfcmVzID0gMDsKLQl0aWMtPnRfY250ID0gMDsgLyogdW5ncmFudCB3aWxsIGdpdmUgYmFjayB1bml0X3JlcyAqIHRfY250LiAqLwotCXJldHVybiBYRlNfRVJST1IoRUlPKTsKLX0JLyogeGxvZ19ncmFudF9sb2dfc3BhY2UgKi8KLQorfQogCiAvKgogICogUmVwbGVuaXNoIHRoZSBieXRlIHJlc2VydmF0aW9uIHJlcXVpcmVkIGJ5IG1vdmluZyB0aGUgZ3JhbnQgd3JpdGUgaGVhZC4KQEAgLTI2MDUsMTAgKzI2NjcsMTIgQEAKICAqIGZyZWUgZmFzdCBwYXRoLgogICovCiBTVEFUSUMgaW50Ci14bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlKHhsb2dfdAkgICAqbG9nLAotCQkJICAgICB4bG9nX3RpY2tldF90ICp0aWMpCit4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlKAorCXN0cnVjdCBsb2cJCSpsb2csCisJc3RydWN0IHhsb2dfdGlja2V0CSp0aWMpCiB7Ci0JaW50CQlmcmVlX2J5dGVzLCBuZWVkX2J5dGVzOworCWludAkJCWZyZWVfYnl0ZXMsIG5lZWRfYnl0ZXM7CisJaW50CQkJZXJyb3IgPSAwOwogCiAJdGljLT50X2N1cnJfcmVzID0gdGljLT50X3VuaXRfcmVzOwogCXhsb2dfdGljX3Jlc2V0X3Jlcyh0aWMpOwpAQCAtMjYxNiwxMDQgKzI2ODAsMzggQEAKIAlpZiAodGljLT50X2NudCA+IDApCiAJCXJldHVybiAwOwogCi0jaWZkZWYgREVCVUcKLQlpZiAobG9nLT5sX2ZsYWdzICYgWExPR19BQ1RJVkVfUkVDT1ZFUlkpCi0JCXBhbmljKCJyZWdyYW50IFJlY292ZXJ5IHByb2JsZW0iKTsKLSNlbmRpZgorCUFTU0VSVCghKGxvZy0+bF9mbGFncyAmIFhMT0dfQUNUSVZFX1JFQ09WRVJZKSk7CiAKIAl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfZW50ZXIobG9nLCB0aWMpOwotCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQotCQlnb3RvIGVycm9yX3JldHVybl91bmxvY2tlZDsKIAotCS8qIElmIHRoZXJlIGFyZSBvdGhlciB3YWl0ZXJzIG9uIHRoZSBxdWV1ZSB0aGVuIGdpdmUgdGhlbSBhCi0JICogY2hhbmNlIGF0IGxvZ3NwYWNlIGJlZm9yZSB1cy4gV2FrZSB1cCB0aGUgZmlyc3Qgd2FpdGVycywKLQkgKiBpZiB3ZSBkbyBub3Qgd2FrZSB1cCBhbGwgdGhlIHdhaXRlcnMgdGhlbiBnbyB0byBzbGVlcCB3YWl0aW5nCi0JICogZm9yIG1vcmUgZnJlZSBzcGFjZSwgb3RoZXJ3aXNlIHRyeSB0byBnZXQgc29tZSBzcGFjZSBmb3IKLQkgKiB0aGlzIHRyYW5zYWN0aW9uLgorCS8qCisJICogSWYgdGhlcmUgYXJlIG90aGVyIHdhaXRlcnMgb24gdGhlIHF1ZXVlIHRoZW4gZ2l2ZSB0aGVtIGEgY2hhbmNlIGF0CisJICogbG9nc3BhY2UgYmVmb3JlIHVzLiAgV2FrZSB1cCB0aGUgZmlyc3Qgd2FpdGVycywgaWYgd2UgZG8gbm90IHdha2UKKwkgKiB1cCBhbGwgdGhlIHdhaXRlcnMgdGhlbiBnbyB0byBzbGVlcCB3YWl0aW5nIGZvciBtb3JlIGZyZWUgc3BhY2UsCisJICogb3RoZXJ3aXNlIHRyeSB0byBnZXQgc29tZSBzcGFjZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4KIAkgKi8KIAluZWVkX2J5dGVzID0gdGljLT50X3VuaXRfcmVzOwotCWlmICghbGlzdF9lbXB0eV9jYXJlZnVsKCZsb2ctPmxfd3JpdGVxKSkgewotCQlzdHJ1Y3QgeGxvZ190aWNrZXQgKm50aWM7Ci0KLQkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7Ci0JCWZyZWVfYnl0ZXMgPSB4bG9nX3NwYWNlX2xlZnQobG9nLCAmbG9nLT5sX2dyYW50X3dyaXRlX2hlYWQpOwotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG50aWMsICZsb2ctPmxfd3JpdGVxLCB0X3F1ZXVlKSB7Ci0JCQlBU1NFUlQobnRpYy0+dF9mbGFncyAmIFhMT0dfVElDX1BFUk1fUkVTRVJWKTsKLQotCQkJaWYgKGZyZWVfYnl0ZXMgPCBudGljLT50X3VuaXRfcmVzKQotCQkJCWJyZWFrOwotCQkJZnJlZV9ieXRlcyAtPSBudGljLT50X3VuaXRfcmVzOwotCQkJd2FrZV91cCgmbnRpYy0+dF93YWl0KTsKLQkJfQotCi0JCWlmIChudGljICE9IGxpc3RfZmlyc3RfZW50cnkoJmxvZy0+bF93cml0ZXEsCi0JCQkJCQlzdHJ1Y3QgeGxvZ190aWNrZXQsIHRfcXVldWUpKSB7Ci0JCQlpZiAobGlzdF9lbXB0eSgmdGljLT50X3F1ZXVlKSkKLQkJCQlsaXN0X2FkZF90YWlsKCZ0aWMtPnRfcXVldWUsICZsb2ctPmxfd3JpdGVxKTsKLQkJCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV9zbGVlcDEobG9nLCB0aWMpOwotCi0JCQl4bG9nX2dyYW50X3B1c2hfYWlsKGxvZywgbmVlZF9ieXRlcyk7Ci0KLQkJCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOwotCQkJeGxvZ193YWl0KCZ0aWMtPnRfd2FpdCwgJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKLQkJCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV93YWtlMShsb2csIHRpYyk7Ci0JCX0gZWxzZQotCQkJc3Bpbl91bmxvY2soJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKLQl9Ci0KLXJlZG86Ci0JaWYgKFhMT0dfRk9SQ0VEX1NIVVRET1dOKGxvZykpCi0JCWdvdG8gZXJyb3JfcmV0dXJuX3VubG9ja2VkOwotCiAJZnJlZV9ieXRlcyA9IHhsb2dfc3BhY2VfbGVmdChsb2csICZsb2ctPmxfZ3JhbnRfd3JpdGVfaGVhZCk7Ci0JaWYgKGZyZWVfYnl0ZXMgPCBuZWVkX2J5dGVzKSB7CisJaWYgKCFsaXN0X2VtcHR5X2NhcmVmdWwoJmxvZy0+bF93cml0ZXEpKSB7CiAJCXNwaW5fbG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOwotCQlpZiAobGlzdF9lbXB0eSgmdGljLT50X3F1ZXVlKSkKLQkJCWxpc3RfYWRkX3RhaWwoJnRpYy0+dF9xdWV1ZSwgJmxvZy0+bF93cml0ZXEpOwotCi0JCWlmIChYTE9HX0ZPUkNFRF9TSFVURE9XTihsb2cpKQotCQkJZ290byBlcnJvcl9yZXR1cm47Ci0KLQkJeGxvZ19ncmFudF9wdXNoX2FpbChsb2csIG5lZWRfYnl0ZXMpOwotCi0JCVhGU19TVEFUU19JTkMoeHNfc2xlZXBfbG9nc3BhY2UpOwotCQl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfc2xlZXAyKGxvZywgdGljKTsKLQkJeGxvZ193YWl0KCZ0aWMtPnRfd2FpdCwgJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKLQotCQl0cmFjZV94ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfd2FrZTIobG9nLCB0aWMpOwotCQlnb3RvIHJlZG87Ci0JfQotCi0JaWYgKCFsaXN0X2VtcHR5KCZ0aWMtPnRfcXVldWUpKSB7CisJCWlmICgheGxvZ193cml0ZXFfd2FrZShsb2csICZmcmVlX2J5dGVzKSB8fAorCQkgICAgZnJlZV9ieXRlcyA8IG5lZWRfYnl0ZXMpCisJCQllcnJvciA9IHhsb2dfd3JpdGVxX3dhaXQobG9nLCB0aWMsIG5lZWRfYnl0ZXMpOworCQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOworCX0gZWxzZSBpZiAoZnJlZV9ieXRlcyA8IG5lZWRfYnl0ZXMpIHsKIAkJc3Bpbl9sb2NrKCZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7Ci0JCWxpc3RfZGVsX2luaXQoJnRpYy0+dF9xdWV1ZSk7CisJCWVycm9yID0geGxvZ193cml0ZXFfd2FpdChsb2csIHRpYywgbmVlZF9ieXRlcyk7CiAJCXNwaW5fdW5sb2NrKCZsb2ctPmxfZ3JhbnRfd3JpdGVfbG9jayk7CiAJfQogCi0JLyogd2UndmUgZ290IGVub3VnaCBzcGFjZSAqLworCWlmIChlcnJvcikKKwkJcmV0dXJuIGVycm9yOworCiAJeGxvZ19ncmFudF9hZGRfc3BhY2UobG9nLCAmbG9nLT5sX2dyYW50X3dyaXRlX2hlYWQsIG5lZWRfYnl0ZXMpOwogCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV9leGl0KGxvZywgdGljKTsKIAl4bG9nX3ZlcmlmeV9ncmFudF90YWlsKGxvZyk7CiAJcmV0dXJuIDA7Ci0KLQotIGVycm9yX3JldHVybl91bmxvY2tlZDoKLQlzcGluX2xvY2soJmxvZy0+bF9ncmFudF93cml0ZV9sb2NrKTsKLSBlcnJvcl9yZXR1cm46Ci0JbGlzdF9kZWxfaW5pdCgmdGljLT50X3F1ZXVlKTsKLQlzcGluX3VubG9jaygmbG9nLT5sX2dyYW50X3dyaXRlX2xvY2spOwotCXRyYWNlX3hmc19sb2dfcmVncmFudF93cml0ZV9lcnJvcihsb2csIHRpYyk7Ci0KLQkvKgotCSAqIElmIHdlIGFyZSBmYWlsaW5nLCBtYWtlIHN1cmUgdGhlIHRpY2tldCBkb2Vzbid0IGhhdmUgYW55Ci0JICogY3VycmVudCByZXNlcnZhdGlvbnMuIFdlIGRvbid0IHdhbnQgdG8gYWRkIHRoaXMgYmFjayB3aGVuCi0JICogdGhlIHRpY2tldC90cmFuc2FjdGlvbiBnZXRzIGNhbmNlbGxlZC4KLQkgKi8KLQl0aWMtPnRfY3Vycl9yZXMgPSAwOwotCXRpYy0+dF9jbnQgPSAwOyAvKiB1bmdyYW50IHdpbGwgZ2l2ZSBiYWNrIHVuaXRfcmVzICogdF9jbnQuICovCi0JcmV0dXJuIFhGU19FUlJPUihFSU8pOwotfQkvKiB4bG9nX3JlZ3JhbnRfd3JpdGVfbG9nX3NwYWNlICovCi0KK30KIAogLyogVGhlIGZpcnN0IGNudC0xIHRpbWVzIHRocm91Z2ggaGVyZSB3ZSBkb24ndCBuZWVkIHRvCiAgKiBtb3ZlIHRoZSBncmFudCB3cml0ZSBoZWFkIGJlY2F1c2UgdGhlIHBlcm1hbmVudApkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19zdXBlci5jIGIvZnMveGZzL3hmc19zdXBlci5jCmluZGV4IDNlY2E1OGYuLjhhODk5NDkgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfc3VwZXIuYworKysgYi9mcy94ZnMveGZzX3N1cGVyLmMKQEAgLTg2OSwyNyArODY5LDYgQEAKIH0KIAogU1RBVElDIGludAoteGZzX2xvZ19pbm9kZSgKLQlzdHJ1Y3QgeGZzX2lub2RlCSppcCkKLXsKLQlzdHJ1Y3QgeGZzX21vdW50CSptcCA9IGlwLT5pX21vdW50OwotCXN0cnVjdCB4ZnNfdHJhbnMJKnRwOwotCWludAkJCWVycm9yOwotCi0JdHAgPSB4ZnNfdHJhbnNfYWxsb2MobXAsIFhGU19UUkFOU19GU1lOQ19UUyk7Ci0JZXJyb3IgPSB4ZnNfdHJhbnNfcmVzZXJ2ZSh0cCwgMCwgWEZTX0ZTWU5DX1RTX0xPR19SRVMobXApLCAwLCAwLCAwKTsKLQlpZiAoZXJyb3IpIHsKLQkJeGZzX3RyYW5zX2NhbmNlbCh0cCwgMCk7Ci0JCXJldHVybiBlcnJvcjsKLQl9Ci0KLQl4ZnNfaWxvY2soaXAsIFhGU19JTE9DS19FWENMKTsKLQl4ZnNfdHJhbnNfaWpvaW4odHAsIGlwLCBYRlNfSUxPQ0tfRVhDTCk7Ci0JeGZzX3RyYW5zX2xvZ19pbm9kZSh0cCwgaXAsIFhGU19JTE9HX0NPUkUpOwotCXJldHVybiB4ZnNfdHJhbnNfY29tbWl0KHRwLCAwKTsKLX0KLQotU1RBVElDIGludAogeGZzX2ZzX3dyaXRlX2lub2RlKAogCXN0cnVjdCBpbm9kZQkJKmlub2RlLAogCXN0cnVjdCB3cml0ZWJhY2tfY29udHJvbCAqd2JjKQpAQCAtOTAyLDEwICs4ODEsOCBAQAogCiAJaWYgKFhGU19GT1JDRURfU0hVVERPV04obXApKQogCQlyZXR1cm4gLVhGU19FUlJPUihFSU8pOwotCWlmICghaXAtPmlfdXBkYXRlX2NvcmUpCi0JCXJldHVybiAwOwogCi0JaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMKSB7CisJaWYgKHdiYy0+c3luY19tb2RlID09IFdCX1NZTkNfQUxMIHx8IHdiYy0+Zm9yX2t1cGRhdGUpIHsKIAkJLyoKIAkJICogTWFrZSBzdXJlIHRoZSBpbm9kZSBoYXMgbWFkZSBpdCBpdCBpbnRvIHRoZSBsb2cuICBJbnN0ZWFkCiAJCSAqIG9mIGZvcmNpbmcgaXQgYWxsIHRoZSB3YXkgdG8gc3RhYmxlIHN0b3JhZ2UgdXNpbmcgYQpAQCAtOTEzLDExICs4OTAsMTQgQEAKIAkJICogLT5zeW5jX2ZzIGNhbGwgZG8gdGhhdCBmb3IgdGh1cywgd2hpY2ggcmVkdWNlcyB0aGUgbnVtYmVyCiAJCSAqIG9mIHN5bmNocm9ub3VzIGxvZyBmb3JjZXMgZHJhbWF0aWNhbGx5LgogCQkgKi8KLQkJZXJyb3IgPSB4ZnNfbG9nX2lub2RlKGlwKTsKKwkJZXJyb3IgPSB4ZnNfbG9nX2RpcnR5X2lub2RlKGlwLCBOVUxMLCAwKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXQ7CiAJCXJldHVybiAwOwogCX0gZWxzZSB7CisJCWlmICghaXAtPmlfdXBkYXRlX2NvcmUpCisJCQlyZXR1cm4gMDsKKwogCQkvKgogCQkgKiBXZSBtYWtlIHRoaXMgbm9uLWJsb2NraW5nIGlmIHRoZSBpbm9kZSBpcyBjb250ZW5kZWQsIHJldHVybgogCQkgKiBFQUdBSU4gdG8gaW5kaWNhdGUgdG8gdGhlIGNhbGxlciB0aGF0IHRoZXkgZGlkIG5vdCBzdWNjZWVkLgpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc19zeW5jLmMgYi9mcy94ZnMveGZzX3N5bmMuYwppbmRleCBhYTNkYzFhLi5mMDk5NGFlZGMgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfc3luYy5jCisrKyBiL2ZzL3hmcy94ZnNfc3luYy5jCkBAIC0zMzYsNiArMzM2LDMyIEBACiAJcmV0dXJuIGVycm9yOwogfQogCitpbnQKK3hmc19sb2dfZGlydHlfaW5vZGUoCisJc3RydWN0IHhmc19pbm9kZQkqaXAsCisJc3RydWN0IHhmc19wZXJhZwkqcGFnLAorCWludAkJCWZsYWdzKQoreworCXN0cnVjdCB4ZnNfbW91bnQJKm1wID0gaXAtPmlfbW91bnQ7CisJc3RydWN0IHhmc190cmFucwkqdHA7CisJaW50CQkJZXJyb3I7CisKKwlpZiAoIWlwLT5pX3VwZGF0ZV9jb3JlKQorCQlyZXR1cm4gMDsKKworCXRwID0geGZzX3RyYW5zX2FsbG9jKG1wLCBYRlNfVFJBTlNfRlNZTkNfVFMpOworCWVycm9yID0geGZzX3RyYW5zX3Jlc2VydmUodHAsIDAsIFhGU19GU1lOQ19UU19MT0dfUkVTKG1wKSwgMCwgMCwgMCk7CisJaWYgKGVycm9yKSB7CisJCXhmc190cmFuc19jYW5jZWwodHAsIDApOworCQlyZXR1cm4gZXJyb3I7CisJfQorCisJeGZzX2lsb2NrKGlwLCBYRlNfSUxPQ0tfRVhDTCk7CisJeGZzX3RyYW5zX2lqb2luKHRwLCBpcCwgWEZTX0lMT0NLX0VYQ0wpOworCXhmc190cmFuc19sb2dfaW5vZGUodHAsIGlwLCBYRlNfSUxPR19DT1JFKTsKKwlyZXR1cm4geGZzX3RyYW5zX2NvbW1pdCh0cCwgMCk7Cit9CisKIC8qCiAgKiBXaGVuIHJlbW91bnRpbmcgYSBmaWxlc3lzdGVtIHJlYWQtb25seSBvciBmcmVlemluZyB0aGUgZmlsZXN5c3RlbSwgd2UgaGF2ZQogICogdHdvIHBoYXNlcyB0byBleGVjdXRlLiBUaGlzIGZpcnN0IHBoYXNlIGlzIHN5bmNpbmcgdGhlIGRhdGEgYmVmb3JlIHdlCkBAIC0zNTksNiArMzg1LDE2IEBACiB7CiAJaW50CQkJZXJyb3IsIGVycm9yMiA9IDA7CiAKKwkvKgorCSAqIExvZyBhbGwgcGVuZGluZyBzaXplIGFuZCB0aW1lc3RhbXAgdXBkYXRlcy4gIFRoZSB2ZnMgd3JpdGViYWNrCisJICogY29kZSBpcyBzdXBwb3NlZCB0byBkbyB0aGlzLCBidXQgZHVlIHRvIGl0cyBvdmVyYWdyZXNzaXZlCisJICogbGl2ZWxvY2sgZGV0ZWN0aW9uIGl0IHdpbGwgc2tpcCBpbm9kZXMgd2hlcmUgYXBwZW5kaW5nIHdyaXRlcworCSAqIHdlcmUgd3JpdHRlbiBvdXQgaW4gdGhlIGZpcnN0IG5vbi1ibG9ja2luZyBzeW5jIHBoYXNlIGlmIHRoZWlyCisJICogY29tcGxldGlvbiB0b29rIGxvbmcgZW5vdWdoIHRoYXQgaXQgaGFwcGVuZWQgYWZ0ZXIgdGFraW5nIHRoZQorCSAqIHRpbWVzdGFtcCBmb3IgdGhlIGN1dC1vZmYgaW4gdGhlIGJsb2NraW5nIHBoYXNlLgorCSAqLworCXhmc19pbm9kZV9hZ19pdGVyYXRvcihtcCwgeGZzX2xvZ19kaXJ0eV9pbm9kZSwgMCk7CisKIAl4ZnNfcW1fc3luYyhtcCwgU1lOQ19UUllMT0NLKTsKIAl4ZnNfcW1fc3luYyhtcCwgU1lOQ19XQUlUKTsKIApAQCAtNzcwLDYgKzgwNiwxNyBAQAogCWlmICgheGZzX2lmbG9ja19ub3dhaXQoaXApKSB7CiAJCWlmICghKHN5bmNfbW9kZSAmIFNZTkNfV0FJVCkpCiAJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBJZiB3ZSBvbmx5IGhhdmUgYSBzaW5nbGUgZGlydHkgaW5vZGUgaW4gYSBjbHVzdGVyIHRoZXJlIGlzCisJCSAqIGEgZmFpciBjaGFuY2UgdGhhdCB0aGUgQUlMIHB1c2ggbWF5IGhhdmUgcHVzaGVkIGl0IGludG8KKwkJICogdGhlIGJ1ZmZlciwgYnV0IHhmc2J1ZmQgd29uJ3QgdG91Y2ggaXQgdW50aWwgMzAgc2Vjb25kcworCQkgKiBmcm9tIG5vdywgYW5kIHRodXMgd2Ugd2lsbCBsb2NrIHVwIGhlcmUuCisJCSAqCisJCSAqIFByb21vdGUgdGhlIGlub2RlIGJ1ZmZlciB0byB0aGUgZnJvbnQgb2YgdGhlIGRlbHdyaSBsaXN0CisJCSAqIGFuZCB3YWtlIHVwIHhmc2J1ZmQgbm93LgorCQkgKi8KKwkJeGZzX3Byb21vdGVfaW5vZGUoaXApOwogCQl4ZnNfaWZsb2NrKGlwKTsKIAl9CiAKZGlmZiAtLWdpdCBhL2ZzL3hmcy94ZnNfc3luYy5oIGIvZnMveGZzL3hmc19zeW5jLmgKaW5kZXggOTQxMjAyZS4uZmE5NjU0NyAxMDA2NDQKLS0tIGEvZnMveGZzL3hmc19zeW5jLmgKKysrIGIvZnMveGZzL3hmc19zeW5jLmgKQEAgLTM0LDYgKzM0LDggQEAKIAogdm9pZCB4ZnNfZmx1c2hfaW5vZGVzKHN0cnVjdCB4ZnNfaW5vZGUgKmlwKTsKIAoraW50IHhmc19sb2dfZGlydHlfaW5vZGUoc3RydWN0IHhmc19pbm9kZSAqaXAsIHN0cnVjdCB4ZnNfcGVyYWcgKnBhZywgaW50IGZsYWdzKTsKKwogaW50IHhmc19yZWNsYWltX2lub2RlcyhzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IG1vZGUpOwogaW50IHhmc19yZWNsYWltX2lub2Rlc19jb3VudChzdHJ1Y3QgeGZzX21vdW50ICptcCk7CiB2b2lkIHhmc19yZWNsYWltX2lub2Rlc19ucihzdHJ1Y3QgeGZzX21vdW50ICptcCwgaW50IG5yX3RvX3NjYW4pOwpkaWZmIC0tZ2l0IGEvZnMveGZzL3hmc190cmFjZS5oIGIvZnMveGZzL3hmc190cmFjZS5oCmluZGV4IGYxZDI4MDIuLjQ5NDAzNTcgMTAwNjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfdHJhY2UuaAorKysgYi9mcy94ZnMveGZzX3RyYWNlLmgKQEAgLTgzNCwxOCArODM0LDE0IEBACiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19ncmFudF9lbnRlcik7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19ncmFudF9leGl0KTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX2dyYW50X2Vycm9yKTsKLURFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX2dyYW50X3NsZWVwMSk7Ci1ERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19ncmFudF93YWtlMSk7Ci1ERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19ncmFudF9zbGVlcDIpOwotREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfZ3JhbnRfd2FrZTIpOworREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfZ3JhbnRfc2xlZXApOworREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfZ3JhbnRfd2FrZSk7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19ncmFudF93YWtlX3VwKTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfZW50ZXIpOwogREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfcmVncmFudF93cml0ZV9leGl0KTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfZXJyb3IpOwotREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfcmVncmFudF93cml0ZV9zbGVlcDEpOwotREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfcmVncmFudF93cml0ZV93YWtlMSk7Ci1ERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3dyaXRlX3NsZWVwMik7Ci1ERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3dyaXRlX3dha2UyKTsKK0RFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfc2xlZXApOworREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfcmVncmFudF93cml0ZV93YWtlKTsKIERFRklORV9MT0dHUkFOVF9FVkVOVCh4ZnNfbG9nX3JlZ3JhbnRfd3JpdGVfd2FrZV91cCk7CiBERUZJTkVfTE9HR1JBTlRfRVZFTlQoeGZzX2xvZ19yZWdyYW50X3Jlc2VydmVfZW50ZXIpOwogREVGSU5FX0xPR0dSQU5UX0VWRU5UKHhmc19sb2dfcmVncmFudF9yZXNlcnZlX2V4aXQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9jcHV0aW1lLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL2NwdXRpbWUuaAppbmRleCA2MmNlNjgyLi45YTYyOTM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2NwdXRpbWUuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL2NwdXRpbWUuaApAQCAtNCw3MCArNCw2NiBAQAogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CiAKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBjcHV0aW1lX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgX19ub2Nhc3QgY3B1dGltZV90OwogCi0jZGVmaW5lIGNwdXRpbWVfemVybwkJCSgwVUwpCiAjZGVmaW5lIGNwdXRpbWVfb25lX2ppZmZ5CQlqaWZmaWVzX3RvX2NwdXRpbWUoMSkKLSNkZWZpbmUgY3B1dGltZV9tYXgJCQkoKH4wVUwgPj4gMSkgLSAxKQotI2RlZmluZSBjcHV0aW1lX2FkZChfX2EsIF9fYikJCSgoX19hKSArICAoX19iKSkKLSNkZWZpbmUgY3B1dGltZV9zdWIoX19hLCBfX2IpCQkoKF9fYSkgLSAgKF9fYikpCi0jZGVmaW5lIGNwdXRpbWVfZGl2KF9fYSwgX19uKQkJKChfX2EpIC8gIChfX24pKQotI2RlZmluZSBjcHV0aW1lX2hhbHZlKF9fYSkJCSgoX19hKSA+PiAxKQotI2RlZmluZSBjcHV0aW1lX2VxKF9fYSwgX19iKQkJKChfX2EpID09IChfX2IpKQotI2RlZmluZSBjcHV0aW1lX2d0KF9fYSwgX19iKQkJKChfX2EpID4gIChfX2IpKQotI2RlZmluZSBjcHV0aW1lX2dlKF9fYSwgX19iKQkJKChfX2EpID49IChfX2IpKQotI2RlZmluZSBjcHV0aW1lX2x0KF9fYSwgX19iKQkJKChfX2EpIDwgIChfX2IpKQotI2RlZmluZSBjcHV0aW1lX2xlKF9fYSwgX19iKQkJKChfX2EpIDw9IChfX2IpKQotI2RlZmluZSBjcHV0aW1lX3RvX2ppZmZpZXMoX19jdCkJKF9fY3QpCisjZGVmaW5lIGNwdXRpbWVfdG9famlmZmllcyhfX2N0KQkoX19mb3JjZSB1bnNpZ25lZCBsb25nKShfX2N0KQogI2RlZmluZSBjcHV0aW1lX3RvX3NjYWxlZChfX2N0KQkJKF9fY3QpCi0jZGVmaW5lIGppZmZpZXNfdG9fY3B1dGltZShfX2h6KQkoX19oeikKKyNkZWZpbmUgamlmZmllc190b19jcHV0aW1lKF9faHopCShfX2ZvcmNlIGNwdXRpbWVfdCkoX19oeikKIAotdHlwZWRlZiB1NjQgY3B1dGltZTY0X3Q7Cit0eXBlZGVmIHU2NCBfX25vY2FzdCBjcHV0aW1lNjRfdDsKIAotI2RlZmluZSBjcHV0aW1lNjRfemVybyAoMFVMTCkKLSNkZWZpbmUgY3B1dGltZTY0X2FkZChfX2EsIF9fYikJCSgoX19hKSArIChfX2IpKQotI2RlZmluZSBjcHV0aW1lNjRfc3ViKF9fYSwgX19iKQkJKChfX2EpIC0gKF9fYikpCi0jZGVmaW5lIGNwdXRpbWU2NF90b19qaWZmaWVzNjQoX19jdCkJKF9fY3QpCi0jZGVmaW5lIGppZmZpZXM2NF90b19jcHV0aW1lNjQoX19qaWYpCShfX2ppZikKLSNkZWZpbmUgY3B1dGltZV90b19jcHV0aW1lNjQoX19jdCkJKCh1NjQpIF9fY3QpCi0jZGVmaW5lIGNwdXRpbWU2NF9ndChfX2EsIF9fYikJCSgoX19hKSA+ICAoX19iKSkKKyNkZWZpbmUgY3B1dGltZTY0X3RvX2ppZmZpZXM2NChfX2N0KQkoX19mb3JjZSB1NjQpKF9fY3QpCisjZGVmaW5lIGppZmZpZXM2NF90b19jcHV0aW1lNjQoX19qaWYpCShfX2ZvcmNlIGNwdXRpbWU2NF90KShfX2ppZikKIAotI2RlZmluZSBuc2Vjc190b19jcHV0aW1lNjQoX19jdCkJbnNlY3NfdG9famlmZmllczY0KF9fY3QpCisjZGVmaW5lIG5zZWNzX3RvX2NwdXRpbWU2NChfX2N0KQlcCisJamlmZmllczY0X3RvX2NwdXRpbWU2NChuc2Vjc190b19qaWZmaWVzNjQoX19jdCkpCiAKIAogLyoKICAqIENvbnZlcnQgY3B1dGltZSB0byBtaWNyb3NlY29uZHMgYW5kIGJhY2suCiAgKi8KLSNkZWZpbmUgY3B1dGltZV90b191c2VjcyhfX2N0KQkJamlmZmllc190b191c2VjcyhfX2N0KQotI2RlZmluZSB1c2Vjc190b19jcHV0aW1lKF9fbXNlY3MpCXVzZWNzX3RvX2ppZmZpZXMoX19tc2VjcykKKyNkZWZpbmUgY3B1dGltZV90b191c2VjcyhfX2N0KQkJXAorCWppZmZpZXNfdG9fdXNlY3MoY3B1dGltZV90b19qaWZmaWVzKF9fY3QpKQorI2RlZmluZSB1c2Vjc190b19jcHV0aW1lKF9fdXNlYykJXAorCWppZmZpZXNfdG9fY3B1dGltZSh1c2Vjc190b19qaWZmaWVzKF9fdXNlYykpCisjZGVmaW5lIHVzZWNzX3RvX2NwdXRpbWU2NChfX3VzZWMpCVwKKwlqaWZmaWVzNjRfdG9fY3B1dGltZTY0KG5zZWNzX3RvX2ppZmZpZXM2NCgoX191c2VjKSAqIDEwMDApKQogCiAvKgogICogQ29udmVydCBjcHV0aW1lIHRvIHNlY29uZHMgYW5kIGJhY2suCiAgKi8KLSNkZWZpbmUgY3B1dGltZV90b19zZWNzKGppZikJCSgoamlmKSAvIEhaKQotI2RlZmluZSBzZWNzX3RvX2NwdXRpbWUoc2VjKQkJKChzZWMpICogSFopCisjZGVmaW5lIGNwdXRpbWVfdG9fc2VjcyhqaWYpCQkoY3B1dGltZV90b19qaWZmaWVzKGppZikgLyBIWikKKyNkZWZpbmUgc2Vjc190b19jcHV0aW1lKHNlYykJCWppZmZpZXNfdG9fY3B1dGltZSgoc2VjKSAqIEhaKQogCiAvKgogICogQ29udmVydCBjcHV0aW1lIHRvIHRpbWVzcGVjIGFuZCBiYWNrLgogICovCi0jZGVmaW5lIHRpbWVzcGVjX3RvX2NwdXRpbWUoX192YWwpCXRpbWVzcGVjX3RvX2ppZmZpZXMoX192YWwpCi0jZGVmaW5lIGNwdXRpbWVfdG9fdGltZXNwZWMoX19jdCxfX3ZhbCkJamlmZmllc190b190aW1lc3BlYyhfX2N0LF9fdmFsKQorI2RlZmluZSB0aW1lc3BlY190b19jcHV0aW1lKF9fdmFsKQlcCisJamlmZmllc190b19jcHV0aW1lKHRpbWVzcGVjX3RvX2ppZmZpZXMoX192YWwpKQorI2RlZmluZSBjcHV0aW1lX3RvX3RpbWVzcGVjKF9fY3QsX192YWwpCVwKKwlqaWZmaWVzX3RvX3RpbWVzcGVjKGNwdXRpbWVfdG9famlmZmllcyhfX2N0KSxfX3ZhbCkKIAogLyoKICAqIENvbnZlcnQgY3B1dGltZSB0byB0aW1ldmFsIGFuZCBiYWNrLgogICovCi0jZGVmaW5lIHRpbWV2YWxfdG9fY3B1dGltZShfX3ZhbCkJdGltZXZhbF90b19qaWZmaWVzKF9fdmFsKQotI2RlZmluZSBjcHV0aW1lX3RvX3RpbWV2YWwoX19jdCxfX3ZhbCkJamlmZmllc190b190aW1ldmFsKF9fY3QsX192YWwpCisjZGVmaW5lIHRpbWV2YWxfdG9fY3B1dGltZShfX3ZhbCkJXAorCWppZmZpZXNfdG9fY3B1dGltZSh0aW1ldmFsX3RvX2ppZmZpZXMoX192YWwpKQorI2RlZmluZSBjcHV0aW1lX3RvX3RpbWV2YWwoX19jdCxfX3ZhbCkJXAorCWppZmZpZXNfdG9fdGltZXZhbChjcHV0aW1lX3RvX2ppZmZpZXMoX19jdCksX192YWwpCiAKIC8qCiAgKiBDb252ZXJ0IGNwdXRpbWUgdG8gY2xvY2sgYW5kIGJhY2suCiAgKi8KLSNkZWZpbmUgY3B1dGltZV90b19jbG9ja190KF9fY3QpCWppZmZpZXNfdG9fY2xvY2tfdChfX2N0KQotI2RlZmluZSBjbG9ja190X3RvX2NwdXRpbWUoX194KQkJY2xvY2tfdF90b19qaWZmaWVzKF9feCkKKyNkZWZpbmUgY3B1dGltZV90b19jbG9ja190KF9fY3QpCVwKKwlqaWZmaWVzX3RvX2Nsb2NrX3QoY3B1dGltZV90b19qaWZmaWVzKF9fY3QpKQorI2RlZmluZSBjbG9ja190X3RvX2NwdXRpbWUoX194KQkJXAorCWppZmZpZXNfdG9fY3B1dGltZShjbG9ja190X3RvX2ppZmZpZXMoX194KSkKIAogLyoKICAqIENvbnZlcnQgY3B1dGltZTY0IHRvIGNsb2NrLgogICovCi0jZGVmaW5lIGNwdXRpbWU2NF90b19jbG9ja190KF9fY3QpCWppZmZpZXNfNjRfdG9fY2xvY2tfdChfX2N0KQorI2RlZmluZSBjcHV0aW1lNjRfdG9fY2xvY2tfdChfX2N0KQlcCisJamlmZmllc182NF90b19jbG9ja190KGNwdXRpbWU2NF90b19qaWZmaWVzNjQoX19jdCkpCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9zb2NrZXQuaCBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvc29ja2V0LmgKaW5kZXggOWE2MTE1ZS4uNDljMTcwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9zb2NrZXQuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3NvY2tldC5oCkBAIC02NCw0ICs2NCw3IEBACiAjZGVmaW5lIFNPX0RPTUFJTgkJMzkKIAogI2RlZmluZSBTT19SWFFfT1ZGTCAgICAgICAgICAgICA0MAorCisjZGVmaW5lIFNPX1dJRklfU1RBVFVTCQk0MQorI2RlZmluZSBTQ01fV0lGSV9TVEFUVVMJU09fV0lGSV9TVEFUVVMKICNlbmRpZiAvKiBfX0FTTV9HRU5FUklDX1NPQ0tFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaAppbmRleCBmNGMzOGQ4Yy4uMjI5MmQxYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy91bmlzdGQuaAorKysgYi9pbmNsdWRlL2FzbS1nZW5lcmljL3VuaXN0ZC5oCkBAIC02ODUsOSArNjg1LDE1IEBACiBfX1NZU0NBTEwoX19OUl9zZXRucywgc3lzX3NldG5zKQogI2RlZmluZSBfX05SX3NlbmRtbXNnIDI2OQogX19TQ19DT01QKF9fTlJfc2VuZG1tc2csIHN5c19zZW5kbW1zZywgY29tcGF0X3N5c19zZW5kbW1zZykKKyNkZWZpbmUgX19OUl9wcm9jZXNzX3ZtX3JlYWR2IDI3MAorX19TQ19DT01QKF9fTlJfcHJvY2Vzc192bV9yZWFkdiwgc3lzX3Byb2Nlc3Nfdm1fcmVhZHYsIFwKKyAgICAgICAgICBjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fcmVhZHYpCisjZGVmaW5lIF9fTlJfcHJvY2Vzc192bV93cml0ZXYgMjcxCitfX1NDX0NPTVAoX19OUl9wcm9jZXNzX3ZtX3dyaXRldiwgc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2LCBcCisgICAgICAgICAgY29tcGF0X3N5c19wcm9jZXNzX3ZtX3dyaXRldikKIAogI3VuZGVmIF9fTlJfc3lzY2FsbHMKLSNkZWZpbmUgX19OUl9zeXNjYWxscyAyNzAKKyNkZWZpbmUgX19OUl9zeXNjYWxscyAyNzIKIAogLyoKICAqIEFsbCBzeXNjYWxscyBiZWxvdyBoZXJlIHNob3VsZCBnbyBhd2F5IHJlYWxseSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaCBiL2luY2x1ZGUvZHJtL2RybV9wY2lpZHMuaAppbmRleCBmODE2NzZmLi4xNGI2Y2QwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fcGNpaWRzLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX3BjaWlkcy5oCkBAIC0xODIsOCArMTgyLDExIEBACiAJezB4MTAwMiwgMHg2NzQ4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc0OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzUxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc1OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NTksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzVCLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njc1RCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NUYsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2NzYwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2NzYxLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCkBAIC0xOTUsOCArMTk4LDE4IEBACiAJezB4MTAwMiwgMHg2NzY3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NjgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc3MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzcyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY3NzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0FJQ09TfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4Njc3OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DQUlDT1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2NzdCLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NBSUNPU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY4NDAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njg0MSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2ODQyLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY4NDMsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njg0OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY4NTAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfVFVSS1N8UkFERU9OX05FV19NRU1NQVB9LCBcCisJezB4MTAwMiwgMHg2ODU4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1RVUktTfFJBREVPTl9ORVdfTUVNTUFQfSwgXAorCXsweDEwMDIsIDB4Njg1OSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9UVVJLU3xSQURFT05fTkVXX01FTU1BUH0sIFwKIAl7MHgxMDAyLCAweDY4ODAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ1lQUkVTU3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODg4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2ODg5LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NZUFJFU1N8UkFERU9OX05FV19NRU1NQVB9LCBcCkBAIC0yMzgsNiArMjUxLDcgQEAKIAl7MHgxMDAyLCAweDY4ZjIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0VEQVJ8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2OGY4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NFREFSfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4NjhmOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9DRURBUnxSQURFT05fTkVXX01FTU1BUH0sIFwKKwl7MHgxMDAyLCAweDY4ZmEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfQ0VEQVJ8UkFERU9OX05FV19NRU1NQVB9LCBcCiAJezB4MTAwMiwgMHg2OGZlLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX0NFREFSfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4NzEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SNTIwfFJBREVPTl9ORVdfTUVNTUFQfSwgXAogCXsweDEwMDIsIDB4NzEwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9SNTIwfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUH0sIFwKQEAgLTQ4MCw2ICs0OTQsOCBAQAogCXsweDEwMDIsIDB4OTY0NywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSxcCiAJezB4MTAwMiwgMHg5NjQ4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU98UkFERU9OX0lTX01PQklMSVRZfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LFwKIAl7MHgxMDAyLCAweDk2NGEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfU1VNT3xSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTY0YiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCisJezB4MTAwMiwgMHg5NjRjLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1NVTU98UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKIAl7MHgxMDAyLCAweDk2NGUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfU1VNT3xSQURFT05fSVNfTU9CSUxJVFl8UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sXAogCXsweDEwMDIsIDB4OTY0ZiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9TVU1PfFJBREVPTl9JU19NT0JJTElUWXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSxcCiAJezB4MTAwMiwgMHg5NzEwLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1JTODgwfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCkBAIC00OTQsNiArNTEwLDggQEAKIAl7MHgxMDAyLCAweDk4MDUsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUEFMTXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAogCXsweDEwMDIsIDB4OTgwNiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9QQUxNfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezB4MTAwMiwgMHg5ODA3LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBDSElQX1BBTE18UkFERU9OX05FV19NRU1NQVB8UkFERU9OX0lTX0lHUH0sIFwKKwl7MHgxMDAyLCAweDk4MDgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENISVBfUEFMTXxSQURFT05fTkVXX01FTU1BUHxSQURFT05fSVNfSUdQfSwgXAorCXsweDEwMDIsIDB4OTgwOSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgQ0hJUF9QQUxNfFJBREVPTl9ORVdfTUVNTUFQfFJBREVPTl9JU19JR1B9LCBcCiAJezAsIDAsIDB9CiAKICNkZWZpbmUgcjEyOF9QQ0lfSURTIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvS2J1aWxkIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKaW5kZXggNjE5YjU2NS4uYzk0ZTcxNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9LYnVpbGQKKysrIGIvaW5jbHVkZS9saW51eC9LYnVpbGQKQEAgLTE4NSw2ICsxODUsNyBAQAogaGVhZGVyLXkgKz0gaWZfcHBwb3guaAogaGVhZGVyLXkgKz0gaWZfc2xpcC5oCiBoZWFkZXIteSArPSBpZl9zdHJpcC5oCitoZWFkZXIteSArPSBpZl90ZWFtLmgKIGhlYWRlci15ICs9IGlmX3RyLmgKIGhlYWRlci15ICs9IGlmX3R1bi5oCiBoZWFkZXIteSArPSBpZl90dW5uZWwuaApAQCAtMTk0LDcgKzE5NSw5IEBACiBoZWFkZXIteSArPSBpbi5oCiBoZWFkZXIteSArPSBpbjYuaAogaGVhZGVyLXkgKz0gaW5fcm91dGUuaAoraGVhZGVyLXkgKz0gc29ja19kaWFnLmgKIGhlYWRlci15ICs9IGluZXRfZGlhZy5oCitoZWFkZXIteSArPSB1bml4X2RpYWcuaAogaGVhZGVyLXkgKz0gaW5vdGlmeS5oCiBoZWFkZXIteSArPSBpbnB1dC5oCiBoZWFkZXIteSArPSBpb2N0bC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2F0bWRldi5oIGIvaW5jbHVkZS9saW51eC9hdG1kZXYuaAppbmRleCA0OWE4M2NhLi5mNGZmODgyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2F0bWRldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYXRtZGV2LmgKQEAgLTQ0NSwxNiArNDQ1LDYgQEAKIAogdm9pZCBhdG1fZGV2X3JlbGVhc2VfdmNjcyhzdHJ1Y3QgYXRtX2RldiAqZGV2KTsKIAotLyoKLSAqIFRoaXMgaXMgYXBwcm94aW1hdGVseSB0aGUgYWxnb3JpdGhtIHVzZWQgYnkgYWxsb2Nfc2tiLgotICoKLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCBhdG1fZ3Vlc3NfcGR1MnRydWVzaXplKGludCBzaXplKQotewotCXJldHVybiBTS0JfREFUQV9BTElHTihzaXplKSArIHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKTsKLX0KLQogCiBzdGF0aWMgaW5saW5lIHZvaWQgYXRtX2ZvcmNlX2NoYXJnZShzdHJ1Y3QgYXRtX3ZjYyAqdmNjLGludCB0cnVlc2l6ZSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmggYi9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYS5oCmluZGV4IDRkNGI1OWQuLmY0YjgzNDYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYmNtYS9iY21hLmgKKysrIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWEuaApAQCAtMjA1LDYxICsyMDUsODIgQEAKIAlzdHJ1Y3Qgc3NiX3Nwcm9tIHNwcm9tOwogfTsKIAotZXh0ZXJuIGlubGluZSB1MzIgYmNtYV9yZWFkOChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHUzMiBiY21hX3JlYWQ4KHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKIHsKIAlyZXR1cm4gY29yZS0+YnVzLT5vcHMtPnJlYWQ4KGNvcmUsIG9mZnNldCk7CiB9Ci1leHRlcm4gaW5saW5lIHUzMiBiY21hX3JlYWQxNihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCitzdGF0aWMgaW5saW5lIHUzMiBiY21hX3JlYWQxNihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCiB7CiAJcmV0dXJuIGNvcmUtPmJ1cy0+b3BzLT5yZWFkMTYoY29yZSwgb2Zmc2V0KTsKIH0KLWV4dGVybiBpbmxpbmUgdTMyIGJjbWFfcmVhZDMyKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTMyIGJjbWFfcmVhZDMyKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKIHsKIAlyZXR1cm4gY29yZS0+YnVzLT5vcHMtPnJlYWQzMihjb3JlLCBvZmZzZXQpOwogfQotZXh0ZXJuIGlubGluZQorc3RhdGljIGlubGluZQogdm9pZCBiY21hX3dyaXRlOChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQsIHUzMiB2YWx1ZSkKIHsKIAljb3JlLT5idXMtPm9wcy0+d3JpdGU4KGNvcmUsIG9mZnNldCwgdmFsdWUpOwogfQotZXh0ZXJuIGlubGluZQorc3RhdGljIGlubGluZQogdm9pZCBiY21hX3dyaXRlMTYoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUpCiB7CiAJY29yZS0+YnVzLT5vcHMtPndyaXRlMTYoY29yZSwgb2Zmc2V0LCB2YWx1ZSk7CiB9Ci1leHRlcm4gaW5saW5lCitzdGF0aWMgaW5saW5lCiB2b2lkIGJjbWFfd3JpdGUzMihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQsIHUzMiB2YWx1ZSkKIHsKIAljb3JlLT5idXMtPm9wcy0+d3JpdGUzMihjb3JlLCBvZmZzZXQsIHZhbHVlKTsKIH0KICNpZmRlZiBDT05GSUdfQkNNQV9CTE9DS0lPCi1leHRlcm4gaW5saW5lIHZvaWQgYmNtYV9ibG9ja19yZWFkKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdm9pZCAqYnVmZmVyLAorc3RhdGljIGlubGluZSB2b2lkIGJjbWFfYmxvY2tfcmVhZChzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHZvaWQgKmJ1ZmZlciwKIAkJCQkgICBzaXplX3QgY291bnQsIHUxNiBvZmZzZXQsIHU4IHJlZ193aWR0aCkKIHsKIAljb3JlLT5idXMtPm9wcy0+YmxvY2tfcmVhZChjb3JlLCBidWZmZXIsIGNvdW50LCBvZmZzZXQsIHJlZ193aWR0aCk7CiB9Ci1leHRlcm4gaW5saW5lIHZvaWQgYmNtYV9ibG9ja193cml0ZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLQkJCQkgICAgc2l6ZV90IGNvdW50LCB1MTYgb2Zmc2V0LCB1OCByZWdfd2lkdGgpCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9ibG9ja193cml0ZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsCisJCQkJICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJCSAgICB1MTYgb2Zmc2V0LCB1OCByZWdfd2lkdGgpCiB7CiAJY29yZS0+YnVzLT5vcHMtPmJsb2NrX3dyaXRlKGNvcmUsIGJ1ZmZlciwgY291bnQsIG9mZnNldCwgcmVnX3dpZHRoKTsKIH0KICNlbmRpZgotZXh0ZXJuIGlubGluZSB1MzIgYmNtYV9hcmVhZDMyKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSwgdTE2IG9mZnNldCkKK3N0YXRpYyBpbmxpbmUgdTMyIGJjbWFfYXJlYWQzMihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUxNiBvZmZzZXQpCiB7CiAJcmV0dXJuIGNvcmUtPmJ1cy0+b3BzLT5hcmVhZDMyKGNvcmUsIG9mZnNldCk7CiB9Ci1leHRlcm4gaW5saW5lCitzdGF0aWMgaW5saW5lCiB2b2lkIGJjbWFfYXdyaXRlMzIoc3RydWN0IGJjbWFfZGV2aWNlICpjb3JlLCB1MTYgb2Zmc2V0LCB1MzIgdmFsdWUpCiB7CiAJY29yZS0+YnVzLT5vcHMtPmF3cml0ZTMyKGNvcmUsIG9mZnNldCwgdmFsdWUpOwogfQogCi0jZGVmaW5lIGJjbWFfbWFzazMyKGNjLCBvZmZzZXQsIG1hc2spIFwKLQliY21hX3dyaXRlMzIoY2MsIG9mZnNldCwgYmNtYV9yZWFkMzIoY2MsIG9mZnNldCkgJiAobWFzaykpCi0jZGVmaW5lIGJjbWFfc2V0MzIoY2MsIG9mZnNldCwgc2V0KSBcCi0JYmNtYV93cml0ZTMyKGNjLCBvZmZzZXQsIGJjbWFfcmVhZDMyKGNjLCBvZmZzZXQpIHwgKHNldCkpCi0jZGVmaW5lIGJjbWFfbWFza3NldDMyKGNjLCBvZmZzZXQsIG1hc2ssIHNldCkgXAotCWJjbWFfd3JpdGUzMihjYywgb2Zmc2V0LCAoYmNtYV9yZWFkMzIoY2MsIG9mZnNldCkgJiAobWFzaykpIHwgKHNldCkpCitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9tYXNrMzIoc3RydWN0IGJjbWFfZGV2aWNlICpjYywgdTE2IG9mZnNldCwgdTMyIG1hc2spCit7CisJYmNtYV93cml0ZTMyKGNjLCBvZmZzZXQsIGJjbWFfcmVhZDMyKGNjLCBvZmZzZXQpICYgbWFzayk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9zZXQzMihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjLCB1MTYgb2Zmc2V0LCB1MzIgc2V0KQoreworCWJjbWFfd3JpdGUzMihjYywgb2Zmc2V0LCBiY21hX3JlYWQzMihjYywgb2Zmc2V0KSB8IHNldCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9tYXNrc2V0MzIoc3RydWN0IGJjbWFfZGV2aWNlICpjYywKKwkJCQkgIHUxNiBvZmZzZXQsIHUzMiBtYXNrLCB1MzIgc2V0KQoreworCWJjbWFfd3JpdGUzMihjYywgb2Zmc2V0LCAoYmNtYV9yZWFkMzIoY2MsIG9mZnNldCkgJiBtYXNrKSB8IHNldCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9tYXNrMTYoc3RydWN0IGJjbWFfZGV2aWNlICpjYywgdTE2IG9mZnNldCwgdTE2IG1hc2spCit7CisJYmNtYV93cml0ZTE2KGNjLCBvZmZzZXQsIGJjbWFfcmVhZDE2KGNjLCBvZmZzZXQpICYgbWFzayk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9zZXQxNihzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNjLCB1MTYgb2Zmc2V0LCB1MTYgc2V0KQoreworCWJjbWFfd3JpdGUxNihjYywgb2Zmc2V0LCBiY21hX3JlYWQxNihjYywgb2Zmc2V0KSB8IHNldCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgYmNtYV9tYXNrc2V0MTYoc3RydWN0IGJjbWFfZGV2aWNlICpjYywKKwkJCQkgIHUxNiBvZmZzZXQsIHUxNiBtYXNrLCB1MTYgc2V0KQoreworCWJjbWFfd3JpdGUxNihjYywgb2Zmc2V0LCAoYmNtYV9yZWFkMTYoY2MsIG9mZnNldCkgJiBtYXNrKSB8IHNldCk7Cit9CiAKIGV4dGVybiBib29sIGJjbWFfY29yZV9pc19lbmFibGVkKHN0cnVjdCBiY21hX2RldmljZSAqY29yZSk7CiBleHRlcm4gdm9pZCBiY21hX2NvcmVfZGlzYWJsZShzdHJ1Y3QgYmNtYV9kZXZpY2UgKmNvcmUsIHUzMiBmbGFncyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfY2hpcGNvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9iY21hL2JjbWFfZHJpdmVyX2NoaXBjb21tb24uaAppbmRleCAxNTI2ZDk2Li5hMzMwODZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2JjbWEvYmNtYV9kcml2ZXJfY2hpcGNvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmNtYS9iY21hX2RyaXZlcl9jaGlwY29tbW9uLmgKQEAgLTIwMyw2ICsyMDMsNyBAQAogI2RlZmluZSBCQ01BX0NDX1BNVV9DVEwJCQkweDA2MDAgLyogUE1VIGNvbnRyb2wgKi8KICNkZWZpbmUgIEJDTUFfQ0NfUE1VX0NUTF9JTFBfRElWCTB4RkZGRjAwMDAgLyogSUxQIGRpdiBtYXNrICovCiAjZGVmaW5lICBCQ01BX0NDX1BNVV9DVExfSUxQX0RJVl9TSElGVAkxNgorI2RlZmluZSAgQkNNQV9DQ19QTVVfQ1RMX1BMTF9VUEQJMHgwMDAwMDQwMAogI2RlZmluZSAgQkNNQV9DQ19QTVVfQ1RMX05PSUxQT05XCTB4MDAwMDAyMDAgLyogTm8gSUxQIG9uIHdhaXQgKi8KICNkZWZpbmUgIEJDTUFfQ0NfUE1VX0NUTF9IVFJFUUVOCTB4MDAwMDAxMDAgLyogSFQgcmVxIGVuYWJsZSAqLwogI2RlZmluZSAgQkNNQV9DQ19QTVVfQ1RMX0FMUFJFUUVOCTB4MDAwMDAwODAgLyogQUxQIHJlcSBlbmFibGUgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYml0b3BzLmggYi9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oCmluZGV4IGEzZWY2NmEuLjNjMTA2M2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYml0b3BzLmgKKysrIGIvaW5jbHVkZS9saW51eC9iaXRvcHMuaApAQCAtMjIsOCArMjIsMTQgQEAKICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAKICNkZWZpbmUgZm9yX2VhY2hfc2V0X2JpdChiaXQsIGFkZHIsIHNpemUpIFwKLQlmb3IgKChiaXQpID0gZmluZF9maXJzdF9iaXQoKGFkZHIpLCAoc2l6ZSkpOyBcCi0JICAgICAoYml0KSA8IChzaXplKTsgXAorCWZvciAoKGJpdCkgPSBmaW5kX2ZpcnN0X2JpdCgoYWRkciksIChzaXplKSk7CQlcCisJICAgICAoYml0KSA8IChzaXplKTsJCQkJCVwKKwkgICAgIChiaXQpID0gZmluZF9uZXh0X2JpdCgoYWRkciksIChzaXplKSwgKGJpdCkgKyAxKSkKKworLyogc2FtZSBhcyBmb3JfZWFjaF9zZXRfYml0KCkgYnV0IHVzZSBiaXQgYXMgdmFsdWUgdG8gc3RhcnQgd2l0aCAqLworI2RlZmluZSBmb3JfZWFjaF9zZXRfYml0X2NvbnQoYml0LCBhZGRyLCBzaXplKSBcCisJZm9yICgoYml0KSA9IGZpbmRfbmV4dF9iaXQoKGFkZHIpLCAoc2l6ZSksIChiaXQpKTsJXAorCSAgICAgKGJpdCkgPCAoc2l6ZSk7CQkJCQlcCiAJICAgICAoYml0KSA9IGZpbmRfbmV4dF9iaXQoKGFkZHIpLCAoc2l6ZSksIChiaXQpICsgMSkpCiAKIHN0YXRpYyBfX2lubGluZV9fIGludCBnZXRfYml0bWFza19vcmRlcih1bnNpZ25lZCBpbnQgY291bnQpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaAppbmRleCBjN2E2ZDNiLi45NGFjZDgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTgwNSw5ICs4MDUsNiBAQAogICovCiBleHRlcm4gc3RydWN0IHJlcXVlc3RfcXVldWUgKmJsa19pbml0X3F1ZXVlX25vZGUocmVxdWVzdF9mbl9wcm9jICpyZm4sCiAJCQkJCXNwaW5sb2NrX3QgKmxvY2ssIGludCBub2RlX2lkKTsKLWV4dGVybiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYmxrX2luaXRfYWxsb2NhdGVkX3F1ZXVlX25vZGUoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwKLQkJCQkJCQkgICByZXF1ZXN0X2ZuX3Byb2MgKiwKLQkJCQkJCQkgICBzcGlubG9ja190ICosIGludCBub2RlX2lkKTsKIGV4dGVybiBzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqYmxrX2luaXRfcXVldWUocmVxdWVzdF9mbl9wcm9jICosIHNwaW5sb2NrX3QgKik7CiBleHRlcm4gc3RydWN0IHJlcXVlc3RfcXVldWUgKmJsa19pbml0X2FsbG9jYXRlZF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqLAogCQkJCQkJICAgICAgcmVxdWVzdF9mbl9wcm9jICosIHNwaW5sb2NrX3QgKik7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jvb3RtZW0uaCBiL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCmluZGV4IGFiMzQ0YTUuLjY2ZDNlOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCisrKyBiL2luY2x1ZGUvbGludXgvYm9vdG1lbS5oCkBAIC00NCw3ICs0NCw3IEBACiAJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kcGZuKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIGluaXRfYm9vdG1lbSh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgbWVtZW5kKTsKIAotdW5zaWduZWQgbG9uZyBmcmVlX2FsbF9tZW1vcnlfY29yZV9lYXJseShpbnQgbm9kZWlkKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGZyZWVfbG93X21lbW9yeV9jb3JlX2Vhcmx5KGludCBub2RlaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZnJlZV9hbGxfYm9vdG1lbV9ub2RlKHBnX2RhdGFfdCAqcGdkYXQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZnJlZV9hbGxfYm9vdG1lbSh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jYW4vcGxhdGZvcm0vY2M3NzAuaCBiL2luY2x1ZGUvbGludXgvY2FuL3BsYXRmb3JtL2NjNzcwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwMjY0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2Nhbi9wbGF0Zm9ybS9jYzc3MC5oCkBAIC0wLDAgKzEsMzMgQEAKKyNpZm5kZWYgX0NBTl9QTEFURk9STV9DQzc3MF9IXworI2RlZmluZSBfQ0FOX1BMQVRGT1JNX0NDNzcwX0hfCisKKy8qIENQVSBJbnRlcmZhY2UgUmVnaXN0ZXIgKDB4MDIpICovCisjZGVmaW5lIENQVUlGX0NFTgkweDAxCS8qIENsb2NrIE91dCBFbmFibGUgKi8KKyNkZWZpbmUgQ1BVSUZfTVVYCTB4MDQJLyogTXVsdGlwbGV4ICovCisjZGVmaW5lIENQVUlGX1NMUAkweDA4CS8qIFNsZWVwICovCisjZGVmaW5lIENQVUlGX1BXRAkweDEwCS8qIFBvd2VyIERvd24gTW9kZSAqLworI2RlZmluZSBDUFVJRl9ETUMJMHgyMAkvKiBEaXZpZGUgTWVtb3J5IENsb2NrICovCisjZGVmaW5lIENQVUlGX0RTQwkweDQwCS8qIERpdmlkZSBTeXN0ZW0gQ2xvY2sgKi8KKyNkZWZpbmUgQ1BVSUZfUlNUCTB4ODAJLyogSGFyZHdhcmUgUmVzZXQgU3RhdHVzICovCisKKy8qIENsb2NrIE91dCBSZWdpc3RlciAoMHgxZikgKi8KKyNkZWZpbmUgQ0xLT1VUX0NEX01BU0sgIDB4MGYJLyogQ2xvY2sgRGl2aWRlciBtYXNrICovCisjZGVmaW5lIENMS09VVF9TTF9NQVNLCTB4MzAJLyogU2xldyBSYXRlIG1hc2sgKi8KKyNkZWZpbmUgQ0xLT1VUX1NMX1NISUZUCTQKKworLyogQnVzIENvbmZpZ3VyYXRpb24gUmVnaXN0ZXIgKDB4MmYpICovCisjZGVmaW5lIEJVU0NGR19EUjAJMHgwMQkvKiBEaXNjb25uZWN0IFJYMCBJbnB1dCAvIFNlbGVjdCBSWCBpbnB1dCAqLworI2RlZmluZSBCVVNDRkdfRFIxCTB4MDIJLyogRGlzY29ubmVjdCBSWDEgSW5wdXQgLyBTaWxlbnQgbW9kZSAqLworI2RlZmluZSBCVVNDRkdfRFQxCTB4MDgJLyogRGlzY29ubmVjdCBUWDEgT3V0cHV0ICovCisjZGVmaW5lIEJVU0NGR19QT0wJMHgyMAkvKiBQb2xhcml0eSBkb21pbmFudCBvciByZWNlc3NpdmUgKi8KKyNkZWZpbmUgQlVTQ0ZHX0NCWQkweDQwCS8qIElucHV0IENvbXBhcmF0b3IgQnlwYXNzICovCisKK3N0cnVjdCBjYzc3MF9wbGF0Zm9ybV9kYXRhIHsKKwl1MzIgb3NjX2ZyZXE7CS8qIENBTiBidXMgb3NjaWxsYXRvciBmcmVxdWVuY3kgaW4gSHogKi8KKworCXU4IGNpcjsJCS8qIENQVSBJbnRlcmZhY2UgUmVnaXN0ZXIgKi8KKwl1OCBjb3I7CQkvKiBDbG9jayBPdXQgUmVnaXN0ZXIgKi8KKwl1OCBiY3I7CQkvKiBCdXMgQ29uZmlndXJhdGlvbiBSZWdpc3RlciAqLworfTsKKworI2VuZGlmCS8qICFfQ0FOX1BMQVRGT1JNX0NDNzcwX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nncm91cF9zdWJzeXMuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwX3N1YnN5cy5oCmluZGV4IGFjNjYzYzEuLjBiZDM5MGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2dyb3VwX3N1YnN5cy5oCisrKyBiL2luY2x1ZGUvbGludXgvY2dyb3VwX3N1YnN5cy5oCkBAIC01OSw4ICs1OSwxNiBAQAogU1VCU1lTKGJsa2lvKQogI2VuZGlmCiAKKy8qICovCisKICNpZmRlZiBDT05GSUdfQ0dST1VQX1BFUkYKIFNVQlNZUyhwZXJmKQogI2VuZGlmCiAKIC8qICovCisKKyNpZmRlZiBDT05GSUdfTkVUUFJJT19DR1JPVVAKK1NVQlNZUyhuZXRfcHJpbykKKyNlbmRpZgorCisvKiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oIGIvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCmluZGV4IGM4NmM5NDAuLjA4MTE0N2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKQEAgLTcxLDcgKzcxLDcgQEAKIAogLyoqCiAgKiBjeWNsZWNvdW50ZXJfY3ljMm5zIC0gY29udmVydHMgY3ljbGUgY291bnRlciBjeWNsZXMgdG8gbmFub3NlY29uZHMKLSAqIEB0YzoJCVBvaW50ZXIgdG8gY3ljbGUgY291bnRlci4KKyAqIEBjYzoJCVBvaW50ZXIgdG8gY3ljbGUgY291bnRlci4KICAqIEBjeWNsZXM6CUN5Y2xlcwogICoKICAqIFhYWCAtIFRoaXMgY291bGQgdXNlIHNvbWUgbXVsdF9seGxfbGwoKSBhc20gb3B0aW1pemF0aW9uLiBTYW1lIGNvZGUKQEAgLTExNCw3ICsxMTQsNyBAQAogICogICAgICAgICAgICAgICAgICAgICAgICB0aW1lIGJhc2UgYXMgdmFsdWVzIHJldHVybmVkIGJ5CiAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVjb3VudGVyX3JlYWQoKQogICogQHRjOgkJUG9pbnRlciB0byB0aW1lIGNvdW50ZXIuCi0gKiBAY3ljbGU6CWEgdmFsdWUgcmV0dXJuZWQgYnkgdGMtPmNjLT5yZWFkKCkKKyAqIEBjeWNsZV90c3RhbXA6CWEgdmFsdWUgcmV0dXJuZWQgYnkgdGMtPmNjLT5yZWFkKCkKICAqCiAgKiBDeWNsZSBjb3VudHMgdGhhdCBhcmUgY29udmVydGVkIGNvcnJlY3RseSBhcyBsb25nIGFzIHRoZXkKICAqIGZhbGwgaW50byB0aGUgaW50ZXJ2YWwgWy0xLzIgbWF4IGN5Y2xlIGNvdW50LCArMS8yIG1heCBjeWNsZSBjb3VudF0sCkBAIC0xNTYsMTEgKzE1NiwxMiBAQAogICogQG11bHQ6CQljeWNsZSB0byBuYW5vc2Vjb25kIG11bHRpcGxpZXIKICAqIEBzaGlmdDoJCWN5Y2xlIHRvIG5hbm9zZWNvbmQgZGl2aXNvciAocG93ZXIgb2YgdHdvKQogICogQG1heF9pZGxlX25zOgltYXggaWRsZSB0aW1lIHBlcm1pdHRlZCBieSB0aGUgY2xvY2tzb3VyY2UgKG5zZWNzKQotICogQG1heGFkagkJbWF4aW11bSBhZGp1c3RtZW50IHZhbHVlIHRvIG11bHQgKH4xMSUpCisgKiBAbWF4YWRqOgkJbWF4aW11bSBhZGp1c3RtZW50IHZhbHVlIHRvIG11bHQgKH4xMSUpCiAgKiBAZmxhZ3M6CQlmbGFncyBkZXNjcmliaW5nIHNwZWNpYWwgcHJvcGVydGllcwogICogQGFyY2hkYXRhOgkJYXJjaC1zcGVjaWZpYyBkYXRhCiAgKiBAc3VzcGVuZDoJCXN1c3BlbmQgZnVuY3Rpb24gZm9yIHRoZSBjbG9ja3NvdXJjZSwgaWYgbmVjZXNzYXJ5CiAgKiBAcmVzdW1lOgkJcmVzdW1lIGZ1bmN0aW9uIGZvciB0aGUgY2xvY2tzb3VyY2UsIGlmIG5lY2Vzc2FyeQorICogQGN5Y2xlX2xhc3Q6CQltb3N0IHJlY2VudCBjeWNsZSBjb3VudGVyIHZhbHVlIHNlZW4gYnkgOjpyZWFkKCkKICAqLwogc3RydWN0IGNsb2Nrc291cmNlIHsKIAkvKgpAQCAtMTg3LDYgKzE4OCw3IEBACiAJdm9pZCAoKnN1c3BlbmQpKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpOwogCXZvaWQgKCpyZXN1bWUpKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpOwogCisJLyogcHJpdmF0ZTogKi8KICNpZmRlZiBDT05GSUdfQ0xPQ0tTT1VSQ0VfV0FUQ0hET0cKIAkvKiBXYXRjaGRvZyByZWxhdGVkIGRhdGEsIHVzZWQgYnkgdGhlIGZyYW1ld29yayAqLwogCXN0cnVjdCBsaXN0X2hlYWQgd2RfbGlzdDsKQEAgLTI2MSw2ICsyNjMsOSBAQAogCiAvKioKICAqIGNsb2Nrc291cmNlX2N5YzJucyAtIGNvbnZlcnRzIGNsb2Nrc291cmNlIGN5Y2xlcyB0byBuYW5vc2Vjb25kcworICogQGN5Y2xlczoJY3ljbGVzCisgKiBAbXVsdDoJY3ljbGUgdG8gbmFub3NlY29uZCBtdWx0aXBsaWVyCisgKiBAc2hpZnQ6CWN5Y2xlIHRvIG5hbm9zZWNvbmQgZGl2aXNvciAocG93ZXIgb2YgdHdvKQogICoKICAqIENvbnZlcnRzIGN5Y2xlcyB0byBuYW5vc2Vjb25kcywgdXNpbmcgdGhlIGdpdmVuIG11bHQgYW5kIHNoaWZ0LgogICoKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGF0LmggYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCmluZGV4IDE1NGJmNTYuLjY2ZWQwNjcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaApAQCAtNTUyLDUgKzU1MiwxNCBAQAogCiBleHRlcm4gdm9pZCBfX3VzZXIgKmNvbXBhdF9hbGxvY191c2VyX3NwYWNlKHVuc2lnbmVkIGxvbmcgbGVuKTsKIAorYXNtbGlua2FnZSBzc2l6ZV90IGNvbXBhdF9zeXNfcHJvY2Vzc192bV9yZWFkdihjb21wYXRfcGlkX3QgcGlkLAorCQljb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqbHZlYywKKwkJdW5zaWduZWQgbG9uZyBsaW92Y250LCBjb25zdCBzdHJ1Y3QgY29tcGF0X2lvdmVjIF9fdXNlciAqcnZlYywKKwkJdW5zaWduZWQgbG9uZyByaW92Y250LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2FzbWxpbmthZ2Ugc3NpemVfdCBjb21wYXRfc3lzX3Byb2Nlc3Nfdm1fd3JpdGV2KGNvbXBhdF9waWRfdCBwaWQsCisJCWNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpsdmVjLAorCQl1bnNpZ25lZCBsb25nIGxpb3ZjbnQsIGNvbnN0IHN0cnVjdCBjb21wYXRfaW92ZWMgX191c2VyICpydmVjLAorCQl1bnNpZ25lZCBsb25nIHJpb3ZjbnQsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCiAjZW5kaWYgLyogQ09ORklHX0NPTVBBVCAqLwogI2VuZGlmIC8qIF9MSU5VWF9DT01QQVRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9jcHUuaCBiL2luY2x1ZGUvbGludXgvY3B1LmgKaW5kZXggNmNiNjBmZC4uMzA1YzI2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2NwdS5oCkBAIC0yNyw2ICsyNyw3IEBACiAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfY3B1KHN0cnVjdCBjcHUgKmNwdSwgaW50IG51bSk7CiBleHRlcm4gc3RydWN0IHN5c19kZXZpY2UgKmdldF9jcHVfc3lzZGV2KHVuc2lnbmVkIGNwdSk7CitleHRlcm4gYm9vbCBjcHVfaXNfaG90cGx1Z2dhYmxlKHVuc2lnbmVkIGNwdSk7CiAKIGV4dGVybiBpbnQgY3B1X2FkZF9zeXNkZXZfYXR0cihzdHJ1Y3Qgc3lzZGV2X2F0dHJpYnV0ZSAqYXR0cik7CiBleHRlcm4gdm9pZCBjcHVfcmVtb3ZlX3N5c2Rldl9hdHRyKHN0cnVjdCBzeXNkZXZfYXR0cmlidXRlICphdHRyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1aWRsZS5oIGIvaW5jbHVkZS9saW51eC9jcHVpZGxlLmgKaW5kZXggNzQwOGFmOC4uMjNmODFkZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVpZGxlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVpZGxlLmgKQEAgLTEzMCw3ICsxMzAsNiBAQAogI2lmZGVmIENPTkZJR19DUFVfSURMRQogZXh0ZXJuIHZvaWQgZGlzYWJsZV9jcHVpZGxlKHZvaWQpOwogZXh0ZXJuIGludCBjcHVpZGxlX2lkbGVfY2FsbCh2b2lkKTsKLQogZXh0ZXJuIGludCBjcHVpZGxlX3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmRydik7CiBzdHJ1Y3QgY3B1aWRsZV9kcml2ZXIgKmNwdWlkbGVfZ2V0X2RyaXZlcih2b2lkKTsKIGV4dGVybiB2b2lkIGNwdWlkbGVfdW5yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYpOwpAQCAtMTQ1LDcgKzE0NCw2IEBACiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfY3B1aWRsZSh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGNwdWlkbGVfaWRsZV9jYWxsKHZvaWQpIHsgcmV0dXJuIC1FTk9ERVY7IH0KLQogc3RhdGljIGlubGluZSBpbnQgY3B1aWRsZV9yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IGNwdWlkbGVfZHJpdmVyICpkcnYpCiB7cmV0dXJuIC1FTk9ERVY7IH0KIHN0YXRpYyBpbmxpbmUgc3RydWN0IGNwdWlkbGVfZHJpdmVyICpjcHVpZGxlX2dldF9kcml2ZXIodm9pZCkge3JldHVybiBOVUxMOyB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oIGIvaW5jbHVkZS9saW51eC9kY2FjaGUuaAppbmRleCA0ZGY5MjYxLi5lZDlmNzRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RjYWNoZS5oCisrKyBiL2luY2x1ZGUvbGludXgvZGNhY2hlLmgKQEAgLTMzOSw3ICszMzksOCBAQAogICovCiBleHRlcm4gY2hhciAqZHluYW1pY19kbmFtZShzdHJ1Y3QgZGVudHJ5ICosIGNoYXIgKiwgaW50LCBjb25zdCBjaGFyICosIC4uLik7CiAKLWV4dGVybiBjaGFyICpfX2RfcGF0aChjb25zdCBzdHJ1Y3QgcGF0aCAqcGF0aCwgc3RydWN0IHBhdGggKnJvb3QsIGNoYXIgKiwgaW50KTsKK2V4dGVybiBjaGFyICpfX2RfcGF0aChjb25zdCBzdHJ1Y3QgcGF0aCAqLCBjb25zdCBzdHJ1Y3QgcGF0aCAqLCBjaGFyICosIGludCk7CitleHRlcm4gY2hhciAqZF9hYnNvbHV0ZV9wYXRoKGNvbnN0IHN0cnVjdCBwYXRoICosIGNoYXIgKiwgaW50KTsKIGV4dGVybiBjaGFyICpkX3BhdGgoY29uc3Qgc3RydWN0IHBhdGggKiwgY2hhciAqLCBpbnQpOwogZXh0ZXJuIGNoYXIgKmRfcGF0aF93aXRoX3VucmVhY2hhYmxlKGNvbnN0IHN0cnVjdCBwYXRoICosIGNoYXIgKiwgaW50KTsKIGV4dGVybiBjaGFyICpkZW50cnlfcGF0aF9yYXcoc3RydWN0IGRlbnRyeSAqLCBjaGFyICosIGludCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RlYnVnb2JqZWN0cy5oIGIvaW5jbHVkZS9saW51eC9kZWJ1Z29iamVjdHMuaAppbmRleCA2NTk3MGI4Li4wZTVmNTc4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RlYnVnb2JqZWN0cy5oCisrKyBiL2luY2x1ZGUvbGludXgvZGVidWdvYmplY3RzLmgKQEAgLTQ2LDYgKzQ2LDggQEAKICAqCQkJZmFpbHMKICAqIEBmaXh1cF9mcmVlOgkJZml4dXAgZnVuY3Rpb24sIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHRoZSBmcmVlIGNoZWNrCiAgKgkJCWZhaWxzCisgKiBAZml4dXBfYXNzZXJ0X2luaXQ6ICBmaXh1cCBmdW5jdGlvbiwgd2hpY2ggaXMgY2FsbGVkIHdoZW4gdGhlIGFzc2VydF9pbml0CisgKgkJCWNoZWNrIGZhaWxzCiAgKi8KIHN0cnVjdCBkZWJ1Z19vYmpfZGVzY3IgewogCWNvbnN0IGNoYXIJCSpuYW1lOwpAQCAtNTQsNiArNTYsNyBAQAogCWludCAoKmZpeHVwX2FjdGl2YXRlKQkodm9pZCAqYWRkciwgZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGUpOwogCWludCAoKmZpeHVwX2Rlc3Ryb3kpCSh2b2lkICphZGRyLCBlbnVtIGRlYnVnX29ial9zdGF0ZSBzdGF0ZSk7CiAJaW50ICgqZml4dXBfZnJlZSkJKHZvaWQgKmFkZHIsIGVudW0gZGVidWdfb2JqX3N0YXRlIHN0YXRlKTsKKwlpbnQgKCpmaXh1cF9hc3NlcnRfaW5pdCkodm9pZCAqYWRkciwgZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGUpOwogfTsKIAogI2lmZGVmIENPTkZJR19ERUJVR19PQkpFQ1RTCkBAIC02NCw2ICs2Nyw3IEBACiBleHRlcm4gdm9pZCBkZWJ1Z19vYmplY3RfZGVhY3RpdmF0ZSh2b2lkICphZGRyLCBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyICpkZXNjcik7CiBleHRlcm4gdm9pZCBkZWJ1Z19vYmplY3RfZGVzdHJveSAgICh2b2lkICphZGRyLCBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyICpkZXNjcik7CiBleHRlcm4gdm9pZCBkZWJ1Z19vYmplY3RfZnJlZSAgICAgICh2b2lkICphZGRyLCBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyICpkZXNjcik7CitleHRlcm4gdm9pZCBkZWJ1Z19vYmplY3RfYXNzZXJ0X2luaXQodm9pZCAqYWRkciwgc3RydWN0IGRlYnVnX29ial9kZXNjciAqZGVzY3IpOwogCiAvKgogICogQWN0aXZlIHN0YXRlOgpAQCAtODksNiArOTMsOCBAQAogZGVidWdfb2JqZWN0X2Rlc3Ryb3kgICAodm9pZCAqYWRkciwgc3RydWN0IGRlYnVnX29ial9kZXNjciAqZGVzY3IpIHsgfQogc3RhdGljIGlubGluZSB2b2lkCiBkZWJ1Z19vYmplY3RfZnJlZSAgICAgICh2b2lkICphZGRyLCBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyICpkZXNjcikgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQKK2RlYnVnX29iamVjdF9hc3NlcnRfaW5pdCh2b2lkICphZGRyLCBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyICpkZXNjcikgeyB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19vYmplY3RzX2Vhcmx5X2luaXQodm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfb2JqZWN0c19tZW1faW5pdCh2b2lkKSB7IH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZG1hX3JlbWFwcGluZy5oIGIvaW5jbHVkZS9saW51eC9kbWFfcmVtYXBwaW5nLmgKaW5kZXggZWY5MGNiZC4uNTdjOWE4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9kbWFfcmVtYXBwaW5nLmgKKysrIGIvaW5jbHVkZS9saW51eC9kbWFfcmVtYXBwaW5nLmgKQEAgLTMxLDYgKzMxLDcgQEAKIGV4dGVybiBpbnQgaW9tbXVfY2FsY3VsYXRlX2FnYXcoc3RydWN0IGludGVsX2lvbW11ICppb21tdSk7CiBleHRlcm4gaW50IGlvbW11X2NhbGN1bGF0ZV9tYXhfc2FnYXcoc3RydWN0IGludGVsX2lvbW11ICppb21tdSk7CiBleHRlcm4gaW50IGRtYXJfZGlzYWJsZWQ7CitleHRlcm4gaW50IGludGVsX2lvbW11X2VuYWJsZWQ7CiAjZWxzZQogc3RhdGljIGlubGluZSBpbnQgaW9tbXVfY2FsY3VsYXRlX2FnYXcoc3RydWN0IGludGVsX2lvbW11ICppb21tdSkKIHsKQEAgLTQ0LDYgKzQ1LDcgQEAKIHsKIH0KICNkZWZpbmUgZG1hcl9kaXNhYmxlZAkoMSkKKyNkZWZpbmUgaW50ZWxfaW9tbXVfZW5hYmxlZCAoMCkKICNlbmRpZgogCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZHluYW1pY19xdWV1ZV9saW1pdHMuaCBiL2luY2x1ZGUvbGludXgvZHluYW1pY19xdWV1ZV9saW1pdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjIxNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9keW5hbWljX3F1ZXVlX2xpbWl0cy5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBEeW5hbWljIHF1ZXVlIGxpbWl0cyAoZHFsKSAtIERlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBUb20gSGVyYmVydCA8dGhlcmJlcnRAZ29vZ2xlLmNvbT4KKyAqCisgKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgZHluYW1pYyBxdWV1ZSBsaW1pdHMgKGRxbCkuCisgKiBkcWwgd291bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGEgcHJvZHVjZXIvY29uc3VtZXIgdHlwZSBxdWV1ZQorICogKHBvc3NpYmx5IGEgSFcgcXVldWUpLiAgU3VjaCBhIHF1ZXVlIHdvdWxkIGhhdmUgdGhlc2UgZ2VuZXJhbCBwcm9wZXJ0aWVzOgorICoKKyAqICAgMSkgT2JqZWN0cyBhcmUgcXVldWVkIHVwIHRvIHNvbWUgbGltaXQgc3BlY2lmaWVkIGFzIG51bWJlciBvZiBvYmplY3RzLgorICogICAyKSBQZXJpb2RpY2FsbHkgYSBjb21wbGV0aW9uIHByb2Nlc3MgZXhlY3V0ZXMgd2hpY2ggcmV0aXJlcyBjb25zdW1lZAorICogICAgICBvYmplY3RzLgorICogICAzKSBTdGFydmF0aW9uIG9jY3VycyB3aGVuIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQsIGFsbCBxdWV1ZWQgZGF0YSBoYXMKKyAqICAgICAgYWN0dWFsbHkgYmVlbiBjb25zdW1lZCwgYnV0IGNvbXBsZXRpb24gcHJvY2Vzc2luZyBoYXMgbm90IHlldCBydW4KKyAqICAgICAgc28gcXVldWluZyBuZXcgZGF0YSBpcyBibG9ja2VkLgorICogICA0KSBNaW5pbWl6aW5nIHRoZSBhbW91bnQgb2YgcXVldWVkIGRhdGEgaXMgZGVzaXJhYmxlLgorICoKKyAqIFRoZSBnb2FsIG9mIGRxbCBpcyB0byBjYWxjdWxhdGUgdGhlIGxpbWl0IGFzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBvYmplY3RzCisgKiBuZWVkZWQgdG8gcHJldmVudCBzdGFydmF0aW9uLgorICoKKyAqIFRoZSBwcmltYXJ5IGZ1bmN0aW9ucyBvZiBkcWwgYXJlOgorICogICAgZHFsX3F1ZXVlZCAtIGNhbGxlZCB3aGVuIG9iamVjdHMgYXJlIGVucXVldWVkIHRvIHJlY29yZCBudW1iZXIgb2Ygb2JqZWN0cworICogICAgZHFsX2F2YWlsIC0gcmV0dXJucyBob3cgbWFueSBvYmplY3RzIGFyZSBhdmFpbGFibGUgdG8gYmUgcXVldWVkIGJhc2VkCisgKiAgICAgIG9uIHRoZSBvYmplY3QgbGltaXQgYW5kIGhvdyBtYW55IG9iamVjdHMgYXJlIGFscmVhZHkgZW5xdWV1ZWQKKyAqICAgIGRxbF9jb21wbGV0ZWQgLSBjYWxsZWQgYXQgY29tcGxldGlvbiB0aW1lIHRvIGluZGljYXRlIGhvdyBtYW55IG9iamVjdHMKKyAqICAgICAgd2VyZSByZXRpcmVkIGZyb20gdGhlIHF1ZXVlCisgKgorICogVGhlIGRxbCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBpbXBsZW1lbnQgYW55IGxvY2tpbmcgZm9yIHRoZSBkcWwgZGF0YQorICogc3RydWN0dXJlcywgdGhlIGhpZ2hlciBsYXllciBzaG91bGQgcHJvdmlkZSB0aGlzLiAgZHFsX3F1ZXVlZCBzaG91bGQKKyAqIGJlIHNlcmlhbGl6ZWQgdG8gcHJldmVudCBjb25jdXJyZW50IGV4ZWN1dGlvbiBvZiB0aGUgZnVuY3Rpb247IHRoaXMKKyAqIGlzIGFsc28gdHJ1ZSBmb3IgIGRxbF9jb21wbGV0ZWQuICBIb3dldmVyLCBkcWxfcXVldWVkIGFuZCBkbHFfY29tcGxldGVkICBjYW4KKyAqIGJlIGV4ZWN1dGVkIGNvbmN1cnJlbnRseSAoaS5lLiB0aGV5IGNhbiBiZSBwcm90ZWN0ZWQgYnkgZGlmZmVyZW50IGxvY2tzKS4KKyAqLworCisjaWZuZGVmIF9MSU5VWF9EUUxfSAorI2RlZmluZSBfTElOVVhfRFFMX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKworc3RydWN0IGRxbCB7CisJLyogRmllbGRzIGFjY2Vzc2VkIGluIGVucXVldWUgcGF0aCAoZHFsX3F1ZXVlZCkgKi8KKwl1bnNpZ25lZCBpbnQJbnVtX3F1ZXVlZDsJCS8qIFRvdGFsIGV2ZXIgcXVldWVkICovCisJdW5zaWduZWQgaW50CWFkal9saW1pdDsJCS8qIGxpbWl0ICsgbnVtX2NvbXBsZXRlZCAqLworCXVuc2lnbmVkIGludAlsYXN0X29ial9jbnQ7CQkvKiBDb3VudCBhdCBsYXN0IHF1ZXVpbmcgKi8KKworCS8qIEZpZWxkcyBhY2Nlc3NlZCBvbmx5IGJ5IGNvbXBsZXRpb24gcGF0aCAoZHFsX2NvbXBsZXRlZCkgKi8KKworCXVuc2lnbmVkIGludAlsaW1pdCBfX19fY2FjaGVsaW5lX2FsaWduZWRfaW5fc21wOyAvKiBDdXJyZW50IGxpbWl0ICovCisJdW5zaWduZWQgaW50CW51bV9jb21wbGV0ZWQ7CQkvKiBUb3RhbCBldmVyIGNvbXBsZXRlZCAqLworCisJdW5zaWduZWQgaW50CXByZXZfb3ZsaW1pdDsJCS8qIFByZXZpb3VzIG92ZXIgbGltaXQgKi8KKwl1bnNpZ25lZCBpbnQJcHJldl9udW1fcXVldWVkOwkvKiBQcmV2aW91cyBxdWV1ZSB0b3RhbCAqLworCXVuc2lnbmVkIGludAlwcmV2X2xhc3Rfb2JqX2NudDsJLyogUHJldmlvdXMgcXVldWluZyBjbnQgKi8KKworCXVuc2lnbmVkIGludAlsb3dlc3Rfc2xhY2s7CQkvKiBMb3dlc3Qgc2xhY2sgZm91bmQgKi8KKwl1bnNpZ25lZCBsb25nCXNsYWNrX3N0YXJ0X3RpbWU7CS8qIFRpbWUgc2xhY2tzIHNlZW4gKi8KKworCS8qIENvbmZpZ3VyYXRpb24gKi8KKwl1bnNpZ25lZCBpbnQJbWF4X2xpbWl0OwkJLyogTWF4IGxpbWl0ICovCisJdW5zaWduZWQgaW50CW1pbl9saW1pdDsJCS8qIE1pbmltdW0gbGltaXQgKi8KKwl1bnNpZ25lZCBpbnQJc2xhY2tfaG9sZF90aW1lOwkvKiBUaW1lIHRvIG1lYXN1cmUgc2xhY2sgKi8KK307CisKKy8qIFNldCBzb21lIHN0YXRpYyBtYXhpbXVtcyAqLworI2RlZmluZSBEUUxfTUFYX09CSkVDVCAoVUlOVF9NQVggLyAxNikKKyNkZWZpbmUgRFFMX01BWF9MSU1JVCAoKFVJTlRfTUFYIC8gMikgLSBEUUxfTUFYX09CSkVDVCkKKworLyoKKyAqIFJlY29yZCBudW1iZXIgb2Ygb2JqZWN0cyBxdWV1ZWQuIEFzc3VtZXMgdGhhdCBjYWxsZXIgaGFzIGFscmVhZHkgY2hlY2tlZAorICogYXZhaWxhYmlsaXR5IGluIHRoZSBxdWV1ZSB3aXRoIGRxbF9hdmFpbC4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGRxbF9xdWV1ZWQoc3RydWN0IGRxbCAqZHFsLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJQlVHX09OKGNvdW50ID4gRFFMX01BWF9PQkpFQ1QpOworCisJZHFsLT5udW1fcXVldWVkICs9IGNvdW50OworCWRxbC0+bGFzdF9vYmpfY250ID0gY291bnQ7Cit9CisKKy8qIFJldHVybnMgaG93IG1hbnkgb2JqZWN0cyBjYW4gYmUgcXVldWVkLCA8IDAgaW5kaWNhdGVzIG92ZXIgbGltaXQuICovCitzdGF0aWMgaW5saW5lIGludCBkcWxfYXZhaWwoY29uc3Qgc3RydWN0IGRxbCAqZHFsKQoreworCXJldHVybiBkcWwtPmFkal9saW1pdCAtIGRxbC0+bnVtX3F1ZXVlZDsKK30KKworLyogUmVjb3JkIG51bWJlciBvZiBjb21wbGV0ZWQgb2JqZWN0cyBhbmQgcmVjYWxjdWxhdGUgdGhlIGxpbWl0LiAqLwordm9pZCBkcWxfY29tcGxldGVkKHN0cnVjdCBkcWwgKmRxbCwgdW5zaWduZWQgaW50IGNvdW50KTsKKworLyogUmVzZXQgZHFsIHN0YXRlICovCit2b2lkIGRxbF9yZXNldChzdHJ1Y3QgZHFsICpkcWwpOworCisvKiBJbml0aWFsaXplIGRxbCBzdGF0ZSAqLworaW50IGRxbF9pbml0KHN0cnVjdCBkcWwgKmRxbCwgdW5zaWduZWQgaG9sZF90aW1lKTsKKworI2VuZGlmIC8qIF9LRVJORUxfICovCisKKyNlbmRpZiAvKiBfTElOVVhfRFFMX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZWVwcm9tXzkzY3g2LmggYi9pbmNsdWRlL2xpbnV4L2VlcHJvbV85M2N4Ni5oCmluZGV4IGM0NjI3Y2IuLmU1MGY5OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZWVwcm9tXzkzY3g2LmgKKysrIGIvaW5jbHVkZS9saW51eC9lZXByb21fOTNjeDYuaApAQCAtMzMsNiArMzMsNyBAQAogI2RlZmluZSBQQ0lfRUVQUk9NX1dJRFRIXzkzQzg2CTgKICNkZWZpbmUgUENJX0VFUFJPTV9XSURUSF9PUENPREUJMwogI2RlZmluZSBQQ0lfRUVQUk9NX1dSSVRFX09QQ09ERQkweDA1CisjZGVmaW5lIFBDSV9FRVBST01fRVJBU0VfT1BDT0RFIDB4MDcKICNkZWZpbmUgUENJX0VFUFJPTV9SRUFEX09QQ09ERQkweDA2CiAjZGVmaW5lIFBDSV9FRVBST01fRVdEU19PUENPREUJMHgxMAogI2RlZmluZSBQQ0lfRUVQUk9NX0VXRU5fT1BDT0RFCTB4MTMKQEAgLTQ2LDYgKzQ3LDcgQEAKICAqIEByZWdpc3Rlcl93cml0ZShzdHJ1Y3QgZWVwcm9tXzkzY3g2ICplZXByb20pOiBoYW5kbGVyIHRvCiAgKiB3cml0ZSB0byB0aGUgZWVwcm9tIHJlZ2lzdGVyIGJ5IHVzaW5nIGFsbCByZWdfKiBmaWVsZHMuCiAgKiBAd2lkdGg6IGVlcHJvbSB3aWR0aCwgc2hvdWxkIGJlIG9uZSBvZiB0aGUgUENJX0VFUFJPTV9XSURUSF8qIGRlZmluZXMKKyAqIEBkcml2ZV9kYXRhOiBTZXQgaWYgd2UncmUgZHJpdmluZyB0aGUgZGF0YSBsaW5lLgogICogQHJlZ19kYXRhX2luOiByZWdpc3RlciBmaWVsZCB0byBpbmRpY2F0ZSBkYXRhIGlucHV0CiAgKiBAcmVnX2RhdGFfb3V0OiByZWdpc3RlciBmaWVsZCB0byBpbmRpY2F0ZSBkYXRhIG91dHB1dAogICogQHJlZ19kYXRhX2Nsb2NrOiByZWdpc3RlciBmaWVsZCB0byBzZXQgdGhlIGRhdGEgY2xvY2sKQEAgLTYyLDYgKzY0LDcgQEAKIAogCWludCB3aWR0aDsKIAorCWNoYXIgZHJpdmVfZGF0YTsKIAljaGFyIHJlZ19kYXRhX2luOwogCWNoYXIgcmVnX2RhdGFfb3V0OwogCWNoYXIgcmVnX2RhdGFfY2xvY2s7CkBAIC03MiwzICs3NSw4IEBACiAJY29uc3QgdTggd29yZCwgdTE2ICpkYXRhKTsKIGV4dGVybiB2b2lkIGVlcHJvbV85M2N4Nl9tdWx0aXJlYWQoc3RydWN0IGVlcHJvbV85M2N4NiAqZWVwcm9tLAogCWNvbnN0IHU4IHdvcmQsIF9fbGUxNiAqZGF0YSwgY29uc3QgdTE2IHdvcmRzKTsKKworZXh0ZXJuIHZvaWQgZWVwcm9tXzkzY3g2X3dyZW4oc3RydWN0IGVlcHJvbV85M2N4NiAqZWVwcm9tLCBib29sIGVuYWJsZSk7CisKK2V4dGVybiB2b2lkIGVlcHJvbV85M2N4Nl93cml0ZShzdHJ1Y3QgZWVwcm9tXzkzY3g2ICplZXByb20sCisJCQkgICAgICAgdTggYWRkciwgdTE2IGRhdGEpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9lcnJxdWV1ZS5oIGIvaW5jbHVkZS9saW51eC9lcnJxdWV1ZS5oCmluZGV4IDAzNDA3MmMuLmZkMDYyOGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXJycXVldWUuaAorKysgYi9pbmNsdWRlL2xpbnV4L2VycnF1ZXVlLmgKQEAgLTE3LDE0ICsxNywxNSBAQAogI2RlZmluZSBTT19FRV9PUklHSU5fTE9DQUwJMQogI2RlZmluZSBTT19FRV9PUklHSU5fSUNNUAkyCiAjZGVmaW5lIFNPX0VFX09SSUdJTl9JQ01QNgkzCi0jZGVmaW5lIFNPX0VFX09SSUdJTl9USU1FU1RBTVBJTkcgNAorI2RlZmluZSBTT19FRV9PUklHSU5fVFhTVEFUVVMJNAorI2RlZmluZSBTT19FRV9PUklHSU5fVElNRVNUQU1QSU5HIFNPX0VFX09SSUdJTl9UWFNUQVRVUwogCiAjZGVmaW5lIFNPX0VFX09GRkVOREVSKGVlKQkoKHN0cnVjdCBzb2NrYWRkciopKChlZSkrMSkpCiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKICNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjZW5kaWYKIApAQCAtMzMsNyArMzQsNyBAQAogc3RydWN0IHNvY2tfZXh0ZXJyX3NrYiB7CiAJdW5pb24gewogCQlzdHJ1Y3QgaW5ldF9za2JfcGFybQloNDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJc3RydWN0IGluZXQ2X3NrYl9wYXJtCWg2OwogI2VuZGlmCiAJfSBoZWFkZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2V0aHRvb2wuaCBiL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCmluZGV4IGRlMzNkZTEuLmRhNWIyZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCisrKyBiL2luY2x1ZGUvbGludXgvZXRodG9vbC5oCkBAIC00ODksNyArNDg5LDEwIEBACiAgKiBvbiByZXR1cm4uCiAgKgogICogRm9yICVFVEhUT09MX0dSWENMU1JMQ05ULCBAcnVsZV9jbnQgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgZGVmaW5lZAotICogcnVsZXMgb24gcmV0dXJuLgorICogcnVsZXMgb24gcmV0dXJuLiAgSWYgQGRhdGEgaXMgbm9uLXplcm8gb24gcmV0dXJuIHRoZW4gaXQgaXMgdGhlCisgKiBzaXplIG9mIHRoZSBydWxlIHRhYmxlLCBwbHVzIHRoZSBmbGFnICVSWF9DTFNfTE9DX1NQRUNJQUwgaWYgdGhlCisgKiBkcml2ZXIgc3VwcG9ydHMgYW55IHNwZWNpYWwgbG9jYXRpb24gdmFsdWVzLiAgSWYgdGhhdCBmbGFnIGlzIG5vdAorICogc2V0IGluIEBkYXRhIHRoZW4gc3BlY2lhbCBsb2NhdGlvbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSB1c2VkLgogICoKICAqIEZvciAlRVRIVE9PTF9HUlhDTFNSVUxFLCBAZnMuQGxvY2F0aW9uIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgYW4KICAqIGV4aXN0aW5nIHJ1bGUgb24gZW50cnkgYW5kIEBmcyBjb250YWlucyB0aGUgcnVsZSBvbiByZXR1cm4uCkBAIC01MDEsMTAgKzUwNCwyMyBAQAogICogbXVzdCB1c2UgdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gZ2V0X3J4bmZjKCkgaW5zdGVhZCBvZiBAcnVsZV9sb2NzLgogICoKICAqIEZvciAlRVRIVE9PTF9TUlhDTFNSTElOUywgQGZzIHNwZWNpZmllcyB0aGUgcnVsZSB0byBhZGQgb3IgdXBkYXRlLgotICogQGZzLkBsb2NhdGlvbiBzcGVjaWZpZXMgdGhlIGxvY2F0aW9uIHRvIHVzZSBhbmQgbXVzdCBub3QgYmUgaWdub3JlZC4KKyAqIEBmcy5AbG9jYXRpb24gZWl0aGVyIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gdG8gdXNlIG9yIGlzIGEgc3BlY2lhbAorICogbG9jYXRpb24gdmFsdWUgd2l0aCAlUlhfQ0xTX0xPQ19TUEVDSUFMIGZsYWcgc2V0LiAgT24gcmV0dXJuLAorICogQGZzLkBsb2NhdGlvbiBpcyB0aGUgYWN0dWFsIHJ1bGUgbG9jYXRpb24uCiAgKgogICogRm9yICVFVEhUT09MX1NSWENMU1JMREVMLCBAZnMuQGxvY2F0aW9uIHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgYW4KICAqIGV4aXN0aW5nIHJ1bGUgb24gZW50cnkuCisgKgorICogQSBkcml2ZXIgc3VwcG9ydGluZyB0aGUgc3BlY2lhbCBsb2NhdGlvbiB2YWx1ZXMgZm9yCisgKiAlRVRIVE9PTF9TUlhDTFNSTElOUyBtYXkgYWRkIHRoZSBydWxlIGF0IGFueSBzdWl0YWJsZSB1bnVzZWQKKyAqIGxvY2F0aW9uLCBhbmQgbWF5IHJlbW92ZSBhIHJ1bGUgYXQgYSBsYXRlciBsb2NhdGlvbiAobG93ZXIKKyAqIHByaW9yaXR5KSB0aGF0IG1hdGNoZXMgZXhhY3RseSB0aGUgc2FtZSBzZXQgb2YgZmxvd3MuICBUaGUgc3BlY2lhbAorICogdmFsdWVzIGFyZTogJVJYX0NMU19MT0NfQU5ZLCBzZWxlY3RpbmcgYW55IGxvY2F0aW9uOworICogJVJYX0NMU19MT0NfRklSU1QsIHNlbGVjdGluZyB0aGUgZmlyc3Qgc3VpdGFibGUgbG9jYXRpb24gKG1heGltdW0KKyAqIHByaW9yaXR5KTsgYW5kICVSWF9DTFNfTE9DX0xBU1QsIHNlbGVjdGluZyB0aGUgbGFzdCBzdWl0YWJsZQorICogbG9jYXRpb24gKG1pbmltdW0gcHJpb3JpdHkpLiAgQWRkaXRpb25hbCBzcGVjaWFsIHZhbHVlcyBtYXkgYmUKKyAqIGRlZmluZWQgaW4gZnV0dXJlIGFuZCBkcml2ZXJzIG11c3QgcmV0dXJuIC0lRUlOVkFMIGZvciBhbnkKKyAqIHVucmVjb2duaXNlZCB2YWx1ZS4KICAqLwogc3RydWN0IGV0aHRvb2xfcnhuZmMgewogCV9fdTMyCQkJCWNtZDsKQEAgLTU0Myw5ICs1NTksMTUgQEAKIC8qKgogICogc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciAtIGNvbW1hbmQgdG8gZ2V0IG9yIHNldCBSWCBmbG93IGhhc2ggaW5kaXJlY3Rpb24KICAqIEBjbWQ6IFNwZWNpZmljIGNvbW1hbmQgbnVtYmVyIC0gJUVUSFRPT0xfR1JYRkhJTkRJUiBvciAlRVRIVE9PTF9TUlhGSElORElSCi0gKiBAc2l6ZTogT24gZW50cnksIHRoZSBhcnJheSBzaXplIG9mIHRoZSB1c2VyIGJ1ZmZlci4gIE9uIHJldHVybiBmcm9tCi0gKgklRVRIVE9PTF9HUlhGSElORElSLCB0aGUgYXJyYXkgc2l6ZSBvZiB0aGUgaGFyZHdhcmUgaW5kaXJlY3Rpb24gdGFibGUuCisgKiBAc2l6ZTogT24gZW50cnksIHRoZSBhcnJheSBzaXplIG9mIHRoZSB1c2VyIGJ1ZmZlciwgd2hpY2ggbWF5IGJlIHplcm8uCisgKglPbiByZXR1cm4gZnJvbSAlRVRIVE9PTF9HUlhGSElORElSLCB0aGUgYXJyYXkgc2l6ZSBvZiB0aGUgaGFyZHdhcmUKKyAqCWluZGlyZWN0aW9uIHRhYmxlLgogICogQHJpbmdfaW5kZXg6IFJYIHJpbmcvcXVldWUgaW5kZXggZm9yIGVhY2ggaGFzaCB2YWx1ZQorICoKKyAqIEZvciAlRVRIVE9PTF9HUlhGSElORElSLCBhIEBzaXplIG9mIHplcm8gbWVhbnMgdGhhdCBvbmx5IHRoZSBzaXplCisgKiBzaG91bGQgYmUgcmV0dXJuZWQuICBGb3IgJUVUSFRPT0xfU1JYRkhJTkRJUiwgYSBAc2l6ZSBvZiB6ZXJvIG1lYW5zCisgKiB0aGUgdGFibGUgc2hvdWxkIGJlIHJlc2V0IHRvIGRlZmF1bHQgdmFsdWVzLiAgVGhpcyBsYXN0IGZlYXR1cmUKKyAqIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9ucy4KICAqLwogc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciB7CiAJX191MzIJY21kOwpAQCAtNzI0LDkgKzc0Niw2IEBACiAKICNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAKLS8qIG5lZWRlZCBieSBkZXZfZGlzYWJsZV9scm8oKSAqLwotZXh0ZXJuIGludCBfX2V0aHRvb2xfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmbGFncyk7Ci0KIGV4dGVybiBpbnQgX19ldGh0b29sX2dldF9zZXR0aW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgc3RydWN0IGV0aHRvb2xfY21kICpjbWQpOwogCkBAIC03NTAsMTkgKzc2OSwxOCBAQAogCiAvKiBTb21lIGdlbmVyaWMgbWV0aG9kcyBkcml2ZXJzIG1heSB1c2UgaW4gdGhlaXIgZXRodG9vbF9vcHMgKi8KIHUzMiBldGh0b29sX29wX2dldF9saW5rKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotdTMyIGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1pbnQgZXRodG9vbF9vcF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSk7Ci1pbnQgZXRodG9vbF9vcF9zZXRfdHhfaHdfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSk7Ci1pbnQgZXRodG9vbF9vcF9zZXRfdHhfaXB2Nl9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKTsKLXUzMiBldGh0b29sX29wX2dldF9zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKLWludCBldGh0b29sX29wX3NldF9zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSk7Ci11MzIgZXRodG9vbF9vcF9nZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IGV0aHRvb2xfb3Bfc2V0X3RzbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSk7Ci11MzIgZXRodG9vbF9vcF9nZXRfdWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwotaW50IGV0aHRvb2xfb3Bfc2V0X3VmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSk7Ci11MzIgZXRodG9vbF9vcF9nZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldik7Ci1pbnQgZXRodG9vbF9vcF9zZXRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEsIHUzMiBzdXBwb3J0ZWQpOwotYm9vbCBldGh0b29sX2ludmFsaWRfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEsIHUzMiBzdXBwb3J0ZWQpOworCisvKioKKyAqIGV0aHRvb2xfcnhmaF9pbmRpcl9kZWZhdWx0IC0gZ2V0IGRlZmF1bHQgdmFsdWUgZm9yIFJYIGZsb3cgaGFzaCBpbmRpcmVjdGlvbgorICogQGluZGV4OiBJbmRleCBpbiBSWCBmbG93IGhhc2ggaW5kaXJlY3Rpb24gdGFibGUKKyAqIEBuX3J4X3JpbmdzOiBOdW1iZXIgb2YgUlggcmluZ3MgdG8gdXNlCisgKgorICogVGhpcyBmdW5jdGlvbiBwcm92aWRlcyB0aGUgZGVmYXVsdCBwb2xpY3kgZm9yIFJYIGZsb3cgaGFzaCBpbmRpcmVjdGlvbi4KKyAqLworc3RhdGljIGlubGluZSB1MzIgZXRodG9vbF9yeGZoX2luZGlyX2RlZmF1bHQodTMyIGluZGV4LCB1MzIgbl9yeF9yaW5ncykKK3sKKwlyZXR1cm4gaW5kZXggJSBuX3J4X3JpbmdzOworfQogCiAvKioKICAqIHN0cnVjdCBldGh0b29sX29wcyAtIG9wdGlvbmFsIG5ldGRldiBvcGVyYXRpb25zCkBAIC04MDcsMjIgKzgyNSw2IEBACiAgKiBAZ2V0X3BhdXNlcGFyYW06IFJlcG9ydCBwYXVzZSBwYXJhbWV0ZXJzCiAgKiBAc2V0X3BhdXNlcGFyYW06IFNldCBwYXVzZSBwYXJhbWV0ZXJzLiAgUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKICAqCW9yIHplcm8uCi0gKiBAZ2V0X3J4X2NzdW06IERlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIHRoZSBuZXRkZXYgZmVhdHVyZSAlTkVUSUZfRl9SWENTVU0uCi0gKglSZXBvcnQgd2hldGhlciByZWNlaXZlIGNoZWNrc3VtcyBhcmUgdHVybmVkIG9uIG9yIG9mZi4KLSAqIEBzZXRfcnhfY3N1bTogRGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZ2VuZXJpYyBuZXRkZXYgZmVhdHVyZXMuICBUdXJuCi0gKglyZWNlaXZlIGNoZWNrc3VtIG9uIG9yIG9mZi4gIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIHplcm8uCi0gKiBAZ2V0X3R4X2NzdW06IERlcHJlY2F0ZWQgYXMgcmVkdW5kYW50LiBSZXBvcnQgd2hldGhlciB0cmFuc21pdCBjaGVja3N1bXMKLSAqCWFyZSB0dXJuZWQgb24gb3Igb2ZmLgotICogQHNldF90eF9jc3VtOiBEZXByZWNhdGVkIGluIGZhdm91ciBvZiBnZW5lcmljIG5ldGRldiBmZWF0dXJlcy4gIFR1cm4KLSAqCXRyYW5zbWl0IGNoZWNrc3VtcyBvbiBvciBvZmYuICBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvciB6ZXJvLgotICogQGdldF9zZzogRGVwcmVjYXRlZCBhcyByZWR1bmRhbnQuICBSZXBvcnQgd2hldGhlciBzY2F0dGVyLWdhdGhlciBpcwotICoJZW5hYmxlZC4gIAotICogQHNldF9zZzogRGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZ2VuZXJpYyBuZXRkZXYgZmVhdHVyZXMuICBUdXJuCi0gKglzY2F0dGVyLWdhdGhlciBvbiBvciBvZmYuIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9yIHplcm8uCi0gKiBAZ2V0X3RzbzogRGVwcmVjYXRlZCBhcyByZWR1bmRhbnQuICBSZXBvcnQgd2hldGhlciBUQ1Agc2VnbWVudGF0aW9uCi0gKglvZmZsb2FkIGlzIGVuYWJsZWQuCi0gKiBAc2V0X3RzbzogRGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgZ2VuZXJpYyBuZXRkZXYgZmVhdHVyZXMuICBUdXJuIFRDUAotICoJc2VnbWVudGF0aW9uIG9mZmxvYWQgb24gb3Igb2ZmLiAgUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVyby4KICAqIEBzZWxmX3Rlc3Q6IFJ1biBzcGVjaWZpZWQgc2VsZi10ZXN0cwogICogQGdldF9zdHJpbmdzOiBSZXR1cm4gYSBzZXQgb2Ygc3RyaW5ncyB0aGF0IGRlc2NyaWJlIHRoZSByZXF1ZXN0ZWQgb2JqZWN0cwogICogQHNldF9waHlzX2lkOiBJZGVudGlmeSB0aGUgcGh5c2ljYWwgZGV2aWNlcywgZS5nLiBieSBmbGFzaGluZyBhbiBMRUQKQEAgLTg0NCwxNSArODQ2LDYgQEAKICAqCW5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVyby4KICAqIEBjb21wbGV0ZTogRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFmdGVyIGFueSBvdGhlciBvcGVyYXRpb24gZXhjZXB0CiAgKglAYmVnaW4uICBXaWxsIGJlIGNhbGxlZCBldmVuIGlmIHRoZSBvdGhlciBvcGVyYXRpb24gZmFpbGVkLgotICogQGdldF91Zm86IERlcHJlY2F0ZWQgYXMgcmVkdW5kYW50LiAgUmVwb3J0IHdoZXRoZXIgVURQIGZyYWdtZW50YXRpb24KLSAqCW9mZmxvYWQgaXMgZW5hYmxlZC4KLSAqIEBzZXRfdWZvOiBEZXByZWNhdGVkIGluIGZhdm91ciBvZiBnZW5lcmljIG5ldGRldiBmZWF0dXJlcy4gIFR1cm4gVURQCi0gKglmcmFnbWVudGF0aW9uIG9mZmxvYWQgb24gb3Igb2ZmLiAgUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVyby4KLSAqIEBnZXRfZmxhZ3M6IERlcHJlY2F0ZWQgYXMgcmVkdW5kYW50LiAgUmVwb3J0IGZlYXR1cmVzIGluY2x1ZGVkIGluCi0gKgkmZW51bSBldGh0b29sX2ZsYWdzIHRoYXQgYXJlIGVuYWJsZWQuICAKLSAqIEBzZXRfZmxhZ3M6IERlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIGdlbmVyaWMgbmV0ZGV2IGZlYXR1cmVzLiAgVHVybgotICoJZmVhdHVyZXMgaW5jbHVkZWQgaW4gJmVudW0gZXRodG9vbF9mbGFncyBvbiBvciBvZmYuICBSZXR1cm5zIGEKLSAqCW5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVyby4KICAqIEBnZXRfcHJpdl9mbGFnczogUmVwb3J0IGRyaXZlci1zcGVjaWZpYyBmZWF0dXJlIGZsYWdzLgogICogQHNldF9wcml2X2ZsYWdzOiBTZXQgZHJpdmVyLXNwZWNpZmljIGZlYXR1cmUgZmxhZ3MuICBSZXR1cm5zIGEgbmVnYXRpdmUKICAqCWVycm9yIGNvZGUgb3IgemVyby4KQEAgLTg2NiwxMSArODU5LDEzIEBACiAgKiBAcmVzZXQ6IFJlc2V0IChwYXJ0IG9mKSB0aGUgZGV2aWNlLCBhcyBzcGVjaWZpZWQgYnkgYSBiaXRtYXNrIG9mCiAgKglmbGFncyBmcm9tICZlbnVtIGV0aHRvb2xfcmVzZXRfZmxhZ3MuICBSZXR1cm5zIGEgbmVnYXRpdmUKICAqCWVycm9yIGNvZGUgb3IgemVyby4KLSAqIEBzZXRfcnhfbnR1cGxlOiBTZXQgYW4gUlggbi10dXBsZSBydWxlLiAgUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUKLSAqCW9yIHplcm8uCisgKiBAZ2V0X3J4ZmhfaW5kaXJfc2l6ZTogR2V0IHRoZSBzaXplIG9mIHRoZSBSWCBmbG93IGhhc2ggaW5kaXJlY3Rpb24gdGFibGUuCisgKglSZXR1cm5zIHplcm8gaWYgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBzcGVjaWZpYyBkZXZpY2UuCiAgKiBAZ2V0X3J4ZmhfaW5kaXI6IEdldCB0aGUgY29udGVudHMgb2YgdGhlIFJYIGZsb3cgaGFzaCBpbmRpcmVjdGlvbiB0YWJsZS4KKyAqCVdpbGwgbm90IGJlIGNhbGxlZCBpZiBAZ2V0X3J4ZmhfaW5kaXJfc2l6ZSByZXR1cm5zIHplcm8uCiAgKglSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvciB6ZXJvLgogICogQHNldF9yeGZoX2luZGlyOiBTZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBSWCBmbG93IGhhc2ggaW5kaXJlY3Rpb24gdGFibGUuCisgKglXaWxsIG5vdCBiZSBjYWxsZWQgaWYgQGdldF9yeGZoX2luZGlyX3NpemUgcmV0dXJucyB6ZXJvLgogICoJUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IgemVyby4KICAqIEBnZXRfY2hhbm5lbHM6IEdldCBudW1iZXIgb2YgY2hhbm5lbHMuCiAgKiBAc2V0X2NoYW5uZWxzOiBTZXQgbnVtYmVyIG9mIGNoYW5uZWxzLiAgUmV0dXJucyBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb3IKQEAgLTkxNywxNCArOTEyLDYgQEAKIAkJCQkgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0qKTsKIAlpbnQJKCpzZXRfcGF1c2VwYXJhbSkoc3RydWN0IG5ldF9kZXZpY2UgKiwKIAkJCQkgIHN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0qKTsKLQl1MzIJKCpnZXRfcnhfY3N1bSkoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci0JaW50CSgqc2V0X3J4X2NzdW0pKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMik7Ci0JdTMyCSgqZ2V0X3R4X2NzdW0pKHN0cnVjdCBuZXRfZGV2aWNlICopOwotCWludAkoKnNldF90eF9jc3VtKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIpOwotCXUzMgkoKmdldF9zZykoc3RydWN0IG5ldF9kZXZpY2UgKik7Ci0JaW50CSgqc2V0X3NnKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIpOwotCXUzMgkoKmdldF90c28pKHN0cnVjdCBuZXRfZGV2aWNlICopOwotCWludAkoKnNldF90c28pKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMik7CiAJdm9pZAkoKnNlbGZfdGVzdCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfdGVzdCAqLCB1NjQgKik7CiAJdm9pZAkoKmdldF9zdHJpbmdzKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIgc3RyaW5nc2V0LCB1OCAqKTsKIAlpbnQJKCpzZXRfcGh5c19pZCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgZW51bSBldGh0b29sX3BoeXNfaWRfc3RhdGUpOwpAQCAtOTMyLDEwICs5MTksNiBAQAogCQkJCSAgICAgc3RydWN0IGV0aHRvb2xfc3RhdHMgKiwgdTY0ICopOwogCWludAkoKmJlZ2luKShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIAl2b2lkCSgqY29tcGxldGUpKHN0cnVjdCBuZXRfZGV2aWNlICopOwotCXUzMgkoKmdldF91Zm8pKHN0cnVjdCBuZXRfZGV2aWNlICopOwotCWludAkoKnNldF91Zm8pKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMik7Ci0JdTMyCSgqZ2V0X2ZsYWdzKShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLQlpbnQJKCpzZXRfZmxhZ3MpKHN0cnVjdCBuZXRfZGV2aWNlICosIHUzMik7CiAJdTMyCSgqZ2V0X3ByaXZfZmxhZ3MpKHN0cnVjdCBuZXRfZGV2aWNlICopOwogCWludAkoKnNldF9wcml2X2ZsYWdzKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIpOwogCWludAkoKmdldF9zc2V0X2NvdW50KShzdHJ1Y3QgbmV0X2RldmljZSAqLCBpbnQpOwpAQCAtOTQ0LDEyICs5MjcsOSBAQAogCWludAkoKnNldF9yeG5mYykoc3RydWN0IG5ldF9kZXZpY2UgKiwgc3RydWN0IGV0aHRvb2xfcnhuZmMgKik7CiAJaW50CSgqZmxhc2hfZGV2aWNlKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZXRodG9vbF9mbGFzaCAqKTsKIAlpbnQJKCpyZXNldCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTMyICopOwotCWludAkoKnNldF9yeF9udHVwbGUpKHN0cnVjdCBuZXRfZGV2aWNlICosCi0JCQkJIHN0cnVjdCBldGh0b29sX3J4X250dXBsZSAqKTsKLQlpbnQJKCpnZXRfcnhmaF9pbmRpcikoc3RydWN0IG5ldF9kZXZpY2UgKiwKLQkJCQkgIHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKik7Ci0JaW50CSgqc2V0X3J4ZmhfaW5kaXIpKHN0cnVjdCBuZXRfZGV2aWNlICosCi0JCQkJICBjb25zdCBzdHJ1Y3QgZXRodG9vbF9yeGZoX2luZGlyICopOworCXUzMgkoKmdldF9yeGZoX2luZGlyX3NpemUpKHN0cnVjdCBuZXRfZGV2aWNlICopOworCWludAkoKmdldF9yeGZoX2luZGlyKShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIgKik7CisJaW50CSgqc2V0X3J4ZmhfaW5kaXIpKHN0cnVjdCBuZXRfZGV2aWNlICosIGNvbnN0IHUzMiAqKTsKIAl2b2lkCSgqZ2V0X2NoYW5uZWxzKShzdHJ1Y3QgbmV0X2RldmljZSAqLCBzdHJ1Y3QgZXRodG9vbF9jaGFubmVscyAqKTsKIAlpbnQJKCpzZXRfY2hhbm5lbHMpKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBldGh0b29sX2NoYW5uZWxzICopOwogCWludAkoKmdldF9kdW1wX2ZsYWcpKHN0cnVjdCBuZXRfZGV2aWNlICosIHN0cnVjdCBldGh0b29sX2R1bXAgKik7CkBAIC0xMTczLDYgKzExNTMsMTIgQEAKIAogI2RlZmluZQlSWF9DTFNfRkxPV19ESVNDCTB4ZmZmZmZmZmZmZmZmZmZmZlVMTAogCisvKiBTcGVjaWFsIFJYIGNsYXNzaWZpY2F0aW9uIHJ1bGUgaW5zZXJ0IGxvY2F0aW9uIHZhbHVlcyAqLworI2RlZmluZSBSWF9DTFNfTE9DX1NQRUNJQUwJMHg4MDAwMDAwMAkvKiBmbGFnICovCisjZGVmaW5lIFJYX0NMU19MT0NfQU5ZCQkweGZmZmZmZmZmCisjZGVmaW5lIFJYX0NMU19MT0NfRklSU1QJMHhmZmZmZmZmZQorI2RlZmluZSBSWF9DTFNfTE9DX0xBU1QJCTB4ZmZmZmZmZmQKKwogLyogUmVzZXQgZmxhZ3MgKi8KIC8qIFRoZSByZXNldCgpIG9wZXJhdGlvbiBtdXN0IGNsZWFyIHRoZSBmbGFncyBmb3IgdGhlIGNvbXBvbmVudHMgd2hpY2gKICAqIHdlcmUgYWN0dWFsbHkgcmVzZXQuICBPbiBzdWNjZXNzZnVsIHJldHVybiwgdGhlIGZsYWdzIGluZGljYXRlIHRoZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mcy5oIGIvaW5jbHVkZS9saW51eC9mcy5oCmluZGV4IGUzMTMwMjIuLmUwYmM0ZmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZnMuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ZzLmgKQEAgLTM5Myw4ICszOTMsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3NlbWFwaG9yZS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3RfYmwuaD4KLSNpbmNsdWRlIDxsaW51eC9zaHJpbmtlci5oPgogI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPGxpbnV4L3Nocmlua2VyLmg+CiAKICNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CiAKQEAgLTE5NDIsNiArMTk0Miw3IEBACiBleHRlcm4gaW50IHN0YXRmc19ieV9kZW50cnkoc3RydWN0IGRlbnRyeSAqLCBzdHJ1Y3Qga3N0YXRmcyAqKTsKIGV4dGVybiBpbnQgZnJlZXplX3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXIpOwogZXh0ZXJuIGludCB0aGF3X3N1cGVyKHN0cnVjdCBzdXBlcl9ibG9jayAqc3VwZXIpOworZXh0ZXJuIGJvb2wgb3VyX21udChzdHJ1Y3QgdmZzbW91bnQgKm1udCk7CiAKIGV4dGVybiBpbnQgY3VycmVudF91bWFzayh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaCBiL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmgKaW5kZXggOTZlZmE2Ny4uYzNkYTQyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdHJhY2VfZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oCkBAIC0xNzIsNiArMTcyLDcgQEAKIAlUUkFDRV9FVkVOVF9GTF9GSUxURVJFRF9CSVQsCiAJVFJBQ0VfRVZFTlRfRkxfUkVDT1JERURfQ01EX0JJVCwKIAlUUkFDRV9FVkVOVF9GTF9DQVBfQU5ZX0JJVCwKKwlUUkFDRV9FVkVOVF9GTF9OT19TRVRfRklMVEVSX0JJVCwKIH07CiAKIGVudW0gewpAQCAtMTc5LDYgKzE4MCw3IEBACiAJVFJBQ0VfRVZFTlRfRkxfRklMVEVSRUQJCT0gKDEgPDwgVFJBQ0VfRVZFTlRfRkxfRklMVEVSRURfQklUKSwKIAlUUkFDRV9FVkVOVF9GTF9SRUNPUkRFRF9DTUQJPSAoMSA8PCBUUkFDRV9FVkVOVF9GTF9SRUNPUkRFRF9DTURfQklUKSwKIAlUUkFDRV9FVkVOVF9GTF9DQVBfQU5ZCQk9ICgxIDw8IFRSQUNFX0VWRU5UX0ZMX0NBUF9BTllfQklUKSwKKwlUUkFDRV9FVkVOVF9GTF9OT19TRVRfRklMVEVSCT0gKDEgPDwgVFJBQ0VfRVZFTlRfRkxfTk9fU0VUX0ZJTFRFUl9CSVQpLAogfTsKIAogc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZ2VuZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L2dlbmV0bGluay5oCmluZGV4IDYxNTQ5YjIuLjczYzI4ZGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvZ2VuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9saW51eC9nZW5ldGxpbmsuaApAQCAtODUsNiArODUsMzAgQEAKIC8qIEFsbCBnZW5lcmljIG5ldGxpbmsgcmVxdWVzdHMgYXJlIHNlcmlhbGl6ZWQgYnkgYSBnbG9iYWwgbG9jay4gICovCiBleHRlcm4gdm9pZCBnZW5sX2xvY2sodm9pZCk7CiBleHRlcm4gdm9pZCBnZW5sX3VubG9jayh2b2lkKTsKKyNpZmRlZiBDT05GSUdfUFJPVkVfTE9DS0lORworZXh0ZXJuIGludCBsb2NrZGVwX2dlbmxfaXNfaGVsZCh2b2lkKTsKKyNlbmRpZgorCisvKioKKyAqIHJjdV9kZXJlZmVyZW5jZV9nZW5sIC0gcmN1X2RlcmVmZXJlbmNlIHdpdGggZGVidWcgY2hlY2tpbmcKKyAqIEBwOiBUaGUgcG9pbnRlciB0byByZWFkLCBwcmlvciB0byBkZXJlZmVyZW5jaW5nCisgKgorICogRG8gYW4gcmN1X2RlcmVmZXJlbmNlKHApLCBidXQgY2hlY2sgY2FsbGVyIGVpdGhlciBob2xkcyByY3VfcmVhZF9sb2NrKCkKKyAqIG9yIGdlbmwgbXV0ZXguIE5vdGUgOiBQbGVhc2UgcHJlZmVyIGdlbmxfZGVyZWZlcmVuY2UoKSBvciByY3VfZGVyZWZlcmVuY2UoKQorICovCisjZGVmaW5lIHJjdV9kZXJlZmVyZW5jZV9nZW5sKHApCQkJCQlcCisJcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHAsIGxvY2tkZXBfZ2VubF9pc19oZWxkKCkpCisKKy8qKgorICogZ2VubF9kZXJlZmVyZW5jZSAtIGZldGNoIFJDVSBwb2ludGVyIHdoZW4gdXBkYXRlcyBhcmUgcHJldmVudGVkIGJ5IGdlbmwgbXV0ZXgKKyAqIEBwOiBUaGUgcG9pbnRlciB0byByZWFkLCBwcmlvciB0byBkZXJlZmVyZW5jaW5nCisgKgorICogUmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIFJDVS1wcm90ZWN0ZWQgcG9pbnRlciwgYnV0IG9taXQKKyAqIGJvdGggdGhlIHNtcF9yZWFkX2JhcnJpZXJfZGVwZW5kcygpIGFuZCB0aGUgQUNDRVNTX09OQ0UoKSwgYmVjYXVzZQorICogY2FsbGVyIGhvbGRzIGdlbmwgbXV0ZXguCisgKi8KKyNkZWZpbmUgZ2VubF9kZXJlZmVyZW5jZShwKQkJCQkJXAorCXJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQocCwgbG9ja2RlcF9nZW5sX2lzX2hlbGQoKSkKIAogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9oYXJkaXJxLmggYi9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaAppbmRleCBmNzQzODgzLi5iYjdmMzA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaApAQCAtMTM5LDIwICsxMzksNyBAQAogZXh0ZXJuIHZvaWQgYWNjb3VudF9zeXN0ZW1fdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19OT19IWikKICNpZiBkZWZpbmVkKENPTkZJR19USU5ZX1JDVSkgfHwgZGVmaW5lZChDT05GSUdfVElOWV9QUkVFTVBUX1JDVSkKLWV4dGVybiB2b2lkIHJjdV9lbnRlcl9ub2h6KHZvaWQpOwotZXh0ZXJuIHZvaWQgcmN1X2V4aXRfbm9oeih2b2lkKTsKLQotc3RhdGljIGlubGluZSB2b2lkIHJjdV9pcnFfZW50ZXIodm9pZCkKLXsKLQlyY3VfZXhpdF9ub2h6KCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCByY3VfaXJxX2V4aXQodm9pZCkKLXsKLQlyY3VfZW50ZXJfbm9oeigpOwotfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgcmN1X25taV9lbnRlcih2b2lkKQogewpAQCAtMTYzLDE3ICsxNTAsOSBAQAogfQogCiAjZWxzZQotZXh0ZXJuIHZvaWQgcmN1X2lycV9lbnRlcih2b2lkKTsKLWV4dGVybiB2b2lkIHJjdV9pcnFfZXhpdCh2b2lkKTsKIGV4dGVybiB2b2lkIHJjdV9ubWlfZW50ZXIodm9pZCk7CiBleHRlcm4gdm9pZCByY3Vfbm1pX2V4aXQodm9pZCk7CiAjZW5kaWYKLSNlbHNlCi0jIGRlZmluZSByY3VfaXJxX2VudGVyKCkgZG8geyB9IHdoaWxlICgwKQotIyBkZWZpbmUgcmN1X2lycV9leGl0KCkgZG8geyB9IHdoaWxlICgwKQotIyBkZWZpbmUgcmN1X25taV9lbnRlcigpIGRvIHsgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIHJjdV9ubWlfZXhpdCgpIGRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZiAvKiAjaWYgZGVmaW5lZChDT05GSUdfTk9fSFopICovCiAKIC8qCiAgKiBJdCBpcyBzYWZlIHRvIGRvIG5vbi1hdG9taWMgb3BzIG9uIC0+aGFyZGlycV9jb250ZXh0LApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaCBiL2luY2x1ZGUvbGludXgvaWVlZTgwMjExLmgKaW5kZXggNDgzNjNjMy4uMjEwZTJjMyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZWVlODAyMTEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2llZWU4MDIxMS5oCkBAIC0xMjgsNiArMTI4LDcgQEAKICNkZWZpbmUgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9OT0FDSwkweDAwMjAKICNkZWZpbmUgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9OT19FWFBMCTB4MDA0MAogI2RlZmluZSBJRUVFODAyMTFfUU9TX0NUTF9BQ0tfUE9MSUNZX0JMT0NLQUNLCTB4MDA2MAorI2RlZmluZSBJRUVFODAyMTFfUU9TX0NUTF9BQ0tfUE9MSUNZX01BU0sJMHgwMDYwCiAvKiBBLU1TRFUgODAyLjExbiAqLwogI2RlZmluZSBJRUVFODAyMTFfUU9TX0NUTF9BX01TRFVfUFJFU0VOVAkweDAwODAKIC8qIE1lc2ggQ29udHJvbCA4MDIuMTFzICovCkBAIC01NDMsNiArNTQ0LDE1IEBACiAJICAgICAgIGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMRlVOQyk7CiB9CiAKKy8qKgorICogaWVlZTgwMjExX2lzX2ZpcnN0X2ZyYWcgLSBjaGVjayBpZiBJRUVFODAyMTFfU0NUTF9GUkFHIGlzIG5vdCBzZXQKKyAqIEBzZXFfY3RybDogZnJhbWUgc2VxdWVuY2UgY29udHJvbCBieXRlcyBpbiBsaXR0bGUtZW5kaWFuIGJ5dGVvcmRlcgorICovCitzdGF0aWMgaW5saW5lIGludCBpZWVlODAyMTFfaXNfZmlyc3RfZnJhZyhfX2xlMTYgc2VxX2N0cmwpCit7CisJcmV0dXJuIChzZXFfY3RybCAmIGNwdV90b19sZTE2KElFRUU4MDIxMV9TQ1RMX0ZSQUcpKSA9PSAwOworfQorCiBzdHJ1Y3QgaWVlZTgwMjExc19oZHIgewogCXU4IGZsYWdzOwogCXU4IHR0bDsKQEAgLTc3MCw2ICs3ODAsOSBAQAogCX0gdTsKIH0gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogCisvKiBTdXBwb3J0ZWQgUmF0ZXMgdmFsdWUgZW5jb2RpbmdzIGluIDgwMi4xMW4tMjAwOSA3LjMuMi4yICovCisjZGVmaW5lIEJTU19NRU1CRVJTSElQX1NFTEVDVE9SX0hUX1BIWQkxMjcKKwogLyogbWdtdCBoZWFkZXIgKyAxIGJ5dGUgY2F0ZWdvcnkgY29kZSAqLwogI2RlZmluZSBJRUVFODAyMTFfTUlOX0FDVElPTl9TSVpFIG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hY3Rpb24udSkKIApAQCAtMTU1Miw2ICsxNTY1LDggQEAKICNkZWZpbmUgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0CTB4MDAwRkFDMDUKICNkZWZpbmUgV0xBTl9DSVBIRVJfU1VJVEVfQUVTX0NNQUMJMHgwMDBGQUMwNgogCisjZGVmaW5lIFdMQU5fQ0lQSEVSX1NVSVRFX1NNUzQJCTB4MDAxNDcyMDEKKwogLyogQUtNIHN1aXRlIHNlbGVjdG9ycyAqLwogI2RlZmluZSBXTEFOX0FLTV9TVUlURV84MDIxWAkJMHgwMDBGQUMwMQogI2RlZmluZSBXTEFOX0FLTV9TVUlURV9QU0sJCTB4MDAwRkFDMDIKQEAgLTE2ODksNiArMTcwNCwyMyBAQAogfQogCiAvKioKKyAqIGllZWU4MDIxMV9pc19wdWJsaWNfYWN0aW9uIC0gY2hlY2sgaWYgZnJhbWUgaXMgYSBwdWJsaWMgYWN0aW9uIGZyYW1lCisgKiBAaGRyOiB0aGUgZnJhbWUKKyAqIEBsZW46IGxlbmd0aCBvZiB0aGUgZnJhbWUKKyAqLworc3RhdGljIGlubGluZSBib29sIGllZWU4MDIxMV9pc19wdWJsaWNfYWN0aW9uKHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIsCisJCQkJCSAgICAgIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210ID0gKHZvaWQgKiloZHI7CisKKwlpZiAobGVuIDwgSUVFRTgwMjExX01JTl9BQ1RJT05fU0laRSkKKwkJcmV0dXJuIGZhbHNlOworCWlmICghaWVlZTgwMjExX2lzX2FjdGlvbihoZHItPmZyYW1lX2NvbnRyb2wpKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuIG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID09IFdMQU5fQ0FURUdPUllfUFVCTElDOworfQorCisvKioKICAqIGllZWU4MDIxMV9maHNzX2NoYW5fdG9fZnJlcSAtIGdldCBjaGFubmVsIGZyZXF1ZW5jeQogICogQGNoYW5uZWw6IHRoZSBGSFNTIGNoYW5uZWwKICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmLmggYi9pbmNsdWRlL2xpbnV4L2lmLmgKaW5kZXggZGIyMGJkNC4uMDZiNmVmNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZi5oCisrKyBiL2luY2x1ZGUvbGludXgvaWYuaApAQCAtNzksNiArNzksNyBAQAogI2RlZmluZSBJRkZfVFhfU0tCX1NIQVJJTkcJMHgxMDAwMAkvKiBUaGUgaW50ZXJmYWNlIHN1cHBvcnRzIHNoYXJpbmcKIAkJCQkJICogc2ticyBvbiB0cmFuc21pdCAqLwogI2RlZmluZSBJRkZfVU5JQ0FTVF9GTFQJMHgyMDAwMAkJLyogU3VwcG9ydHMgdW5pY2FzdCBmaWx0ZXJpbmcJKi8KKyNkZWZpbmUgSUZGX1RFQU1fUE9SVAkweDQwMDAwCQkvKiBkZXZpY2UgdXNlZCBhcyB0ZWFtIHBvcnQgKi8KIAogI2RlZmluZSBJRl9HRVRfSUZBQ0UJMHgwMDAxCQkvKiBmb3IgcXVlcnlpbmcgb25seSAqLwogI2RlZmluZSBJRl9HRVRfUFJPVE8JMHgwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmggYi9pbmNsdWRlL2xpbnV4L2lmX2V0aGVyLmgKaW5kZXggZTQ3MzAwMy4uNTZkOTA3YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pZl9ldGhlci5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfZXRoZXIuaApAQCAtNzksNiArNzksNyBAQAogI2RlZmluZSBFVEhfUF9QQUUJMHg4ODhFCQkvKiBQb3J0IEFjY2VzcyBFbnRpdHkgKElFRUUgODAyLjFYKSAqLwogI2RlZmluZSBFVEhfUF9BT0UJMHg4OEEyCQkvKiBBVEEgb3ZlciBFdGhlcm5ldAkJKi8KICNkZWZpbmUgRVRIX1BfODAyMUFECTB4ODhBOCAgICAgICAgICAvKiA4MDIuMWFkIFNlcnZpY2UgVkxBTgkJKi8KKyNkZWZpbmUgRVRIX1BfODAyX0VYMQkweDg4QjUJCS8qIDgwMi4xIExvY2FsIEV4cGVyaW1lbnRhbCAxLiAgKi8KICNkZWZpbmUgRVRIX1BfVElQQwkweDg4Q0EJCS8qIFRJUEMgCQkJKi8KICNkZWZpbmUgRVRIX1BfODAyMUFICTB4ODhFNyAgICAgICAgICAvKiA4MDIuMWFoIEJhY2tib25lIFNlcnZpY2UgVGFnICovCiAjZGVmaW5lIEVUSF9QXzE1ODgJMHg4OEY3CQkvKiBJRUVFIDE1ODggVGltZXN5bmMgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaWZfdGVhbS5oIGIvaW5jbHVkZS9saW51eC9pZl90ZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4MTgxZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvaWZfdGVhbS5oCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogaW5jbHVkZS9saW51eC9pZl90ZWFtLmggLSBOZXR3b3JrIHRlYW0gZGV2aWNlIGRyaXZlciBoZWFkZXIKKyAqIENvcHlyaWdodCAoYykgMjAxMSBKaXJpIFBpcmtvIDxqcGlya29AcmVkaGF0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0lGX1RFQU1fSF8KKyNkZWZpbmUgX0xJTlVYX0lGX1RFQU1fSF8KKworI2lmZGVmIF9fS0VSTkVMX18KKworc3RydWN0IHRlYW1fcGNwdV9zdGF0cyB7CisJdTY0CQkJcnhfcGFja2V0czsKKwl1NjQJCQlyeF9ieXRlczsKKwl1NjQJCQlyeF9tdWx0aWNhc3Q7CisJdTY0CQkJdHhfcGFja2V0czsKKwl1NjQJCQl0eF9ieXRlczsKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMJc3luY3A7CisJdTMyCQkJcnhfZHJvcHBlZDsKKwl1MzIJCQl0eF9kcm9wcGVkOworfTsKKworc3RydWN0IHRlYW07CisKK3N0cnVjdCB0ZWFtX3BvcnQgeworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IGhsaXN0X25vZGUgaGxpc3Q7IC8qIG5vZGUgaW4gaGFzaCBsaXN0ICovCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAvKiBub2RlIGluIG9yZGluYXJ5IGxpc3QgKi8KKwlzdHJ1Y3QgdGVhbSAqdGVhbTsKKwlpbnQgaW5kZXg7CisKKwkvKgorCSAqIEEgcGxhY2UgZm9yIHN0b3Jpbmcgb3JpZ2luYWwgdmFsdWVzIG9mIHRoZSBkZXZpY2UgYmVmb3JlIGl0CisJICogYmVjb21lIGEgcG9ydC4KKwkgKi8KKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBjaGFyIGRldl9hZGRyW01BWF9BRERSX0xFTl07CisJCXVuc2lnbmVkIGludCBtdHU7CisJfSBvcmlnOworCisJYm9vbCBsaW5rdXA7CisJdTMyIHNwZWVkOworCXU4IGR1cGxleDsKKworCXN0cnVjdCByY3VfaGVhZCByY3U7Cit9OworCitzdHJ1Y3QgdGVhbV9tb2RlX29wcyB7CisJaW50ICgqaW5pdCkoc3RydWN0IHRlYW0gKnRlYW0pOworCXZvaWQgKCpleGl0KShzdHJ1Y3QgdGVhbSAqdGVhbSk7CisJcnhfaGFuZGxlcl9yZXN1bHRfdCAoKnJlY2VpdmUpKHN0cnVjdCB0ZWFtICp0ZWFtLAorCQkJCSAgICAgICBzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0LAorCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwlib29sICgqdHJhbnNtaXQpKHN0cnVjdCB0ZWFtICp0ZWFtLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwlpbnQgKCpwb3J0X2VudGVyKShzdHJ1Y3QgdGVhbSAqdGVhbSwgc3RydWN0IHRlYW1fcG9ydCAqcG9ydCk7CisJdm9pZCAoKnBvcnRfbGVhdmUpKHN0cnVjdCB0ZWFtICp0ZWFtLCBzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0KTsKKwl2b2lkICgqcG9ydF9jaGFuZ2VfbWFjKShzdHJ1Y3QgdGVhbSAqdGVhbSwgc3RydWN0IHRlYW1fcG9ydCAqcG9ydCk7Cit9OworCitlbnVtIHRlYW1fb3B0aW9uX3R5cGUgeworCVRFQU1fT1BUSU9OX1RZUEVfVTMyLAorCVRFQU1fT1BUSU9OX1RZUEVfU1RSSU5HLAorfTsKKworc3RydWN0IHRlYW1fb3B0aW9uIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJY29uc3QgY2hhciAqbmFtZTsKKwllbnVtIHRlYW1fb3B0aW9uX3R5cGUgdHlwZTsKKwlpbnQgKCpnZXR0ZXIpKHN0cnVjdCB0ZWFtICp0ZWFtLCB2b2lkICphcmcpOworCWludCAoKnNldHRlcikoc3RydWN0IHRlYW0gKnRlYW0sIHZvaWQgKmFyZyk7Cit9OworCitzdHJ1Y3QgdGVhbV9tb2RlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJY29uc3QgY2hhciAqa2luZDsKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwlzaXplX3QgcHJpdl9zaXplOworCWNvbnN0IHN0cnVjdCB0ZWFtX21vZGVfb3BzICpvcHM7Cit9OworCisjZGVmaW5lIFRFQU1fUE9SVF9IQVNIQklUUyA0CisjZGVmaW5lIFRFQU1fUE9SVF9IQVNIRU5UUklFUyAoMSA8PCBURUFNX1BPUlRfSEFTSEJJVFMpCisKKyNkZWZpbmUgVEVBTV9NT0RFX1BSSVZfTE9OR1MgNAorI2RlZmluZSBURUFNX01PREVfUFJJVl9TSVpFIChzaXplb2YobG9uZykgKiBURUFNX01PREVfUFJJVl9MT05HUykKKworc3RydWN0IHRlYW0geworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7IC8qIGFzc29jaWF0ZWQgbmV0ZGV2aWNlICovCisJc3RydWN0IHRlYW1fcGNwdV9zdGF0cyBfX3BlcmNwdSAqcGNwdV9zdGF0czsKKworCXN0cnVjdCBtdXRleCBsb2NrOyAvKiB1c2VkIGZvciBvdmVyYWxsIGxvY2tpbmcsIGUuZy4gcG9ydCBsaXN0cyB3cml0ZSAqLworCisJLyoKKwkgKiBwb3J0IGxpc3RzIHdpdGggcG9ydCBjb3VudAorCSAqLworCWludCBwb3J0X2NvdW50OworCXN0cnVjdCBobGlzdF9oZWFkIHBvcnRfaGxpc3RbVEVBTV9QT1JUX0hBU0hFTlRSSUVTXTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBvcnRfbGlzdDsKKworCXN0cnVjdCBsaXN0X2hlYWQgb3B0aW9uX2xpc3Q7CisKKwljb25zdCBzdHJ1Y3QgdGVhbV9tb2RlICptb2RlOworCXN0cnVjdCB0ZWFtX21vZGVfb3BzIG9wczsKKwlsb25nIG1vZGVfcHJpdltURUFNX01PREVfUFJJVl9MT05HU107Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBobGlzdF9oZWFkICp0ZWFtX3BvcnRfaW5kZXhfaGFzaChzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCQkJCSAgICAgIGludCBwb3J0X2luZGV4KQoreworCXJldHVybiAmdGVhbS0+cG9ydF9obGlzdFtwb3J0X2luZGV4ICYgKFRFQU1fUE9SVF9IQVNIRU5UUklFUyAtIDEpXTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGVhbV9wb3J0ICp0ZWFtX2dldF9wb3J0X2J5X2luZGV4KHN0cnVjdCB0ZWFtICp0ZWFtLAorCQkJCQkJICAgICAgIGludCBwb3J0X2luZGV4KQoreworCXN0cnVjdCBobGlzdF9ub2RlICpwOworCXN0cnVjdCB0ZWFtX3BvcnQgKnBvcnQ7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSB0ZWFtX3BvcnRfaW5kZXhfaGFzaCh0ZWFtLCBwb3J0X2luZGV4KTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsIHAsIGhlYWQsIGhsaXN0KQorCQlpZiAocG9ydC0+aW5kZXggPT0gcG9ydF9pbmRleCkKKwkJCXJldHVybiBwb3J0OworCXJldHVybiBOVUxMOworfQorc3RhdGljIGlubGluZSBzdHJ1Y3QgdGVhbV9wb3J0ICp0ZWFtX2dldF9wb3J0X2J5X2luZGV4X3JjdShzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCQkJCQkgICBpbnQgcG9ydF9pbmRleCkKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcDsKKwlzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0OworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkID0gdGVhbV9wb3J0X2luZGV4X2hhc2godGVhbSwgcG9ydF9pbmRleCk7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocG9ydCwgcCwgaGVhZCwgaGxpc3QpCisJCWlmIChwb3J0LT5pbmRleCA9PSBwb3J0X2luZGV4KQorCQkJcmV0dXJuIHBvcnQ7CisJcmV0dXJuIE5VTEw7Cit9CisKK2V4dGVybiBpbnQgdGVhbV9wb3J0X3NldF90ZWFtX21hYyhzdHJ1Y3QgdGVhbV9wb3J0ICpwb3J0KTsKK2V4dGVybiBpbnQgdGVhbV9vcHRpb25zX3JlZ2lzdGVyKHN0cnVjdCB0ZWFtICp0ZWFtLAorCQkJCSBjb25zdCBzdHJ1Y3QgdGVhbV9vcHRpb24gKm9wdGlvbiwKKwkJCQkgc2l6ZV90IG9wdGlvbl9jb3VudCk7CitleHRlcm4gdm9pZCB0ZWFtX29wdGlvbnNfdW5yZWdpc3RlcihzdHJ1Y3QgdGVhbSAqdGVhbSwKKwkJCQkgICAgY29uc3Qgc3RydWN0IHRlYW1fb3B0aW9uICpvcHRpb24sCisJCQkJICAgIHNpemVfdCBvcHRpb25fY291bnQpOworZXh0ZXJuIGludCB0ZWFtX21vZGVfcmVnaXN0ZXIoc3RydWN0IHRlYW1fbW9kZSAqbW9kZSk7CitleHRlcm4gaW50IHRlYW1fbW9kZV91bnJlZ2lzdGVyKHN0cnVjdCB0ZWFtX21vZGUgKm1vZGUpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZGVmaW5lIFRFQU1fU1RSSU5HX01BWF9MRU4gMzIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE5FVExJTktfR0VORVJJQyBuZXRsaW5rIGZhbWlseS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitlbnVtIHsKKwlURUFNX0NNRF9OT09QLAorCVRFQU1fQ01EX09QVElPTlNfU0VULAorCVRFQU1fQ01EX09QVElPTlNfR0VULAorCVRFQU1fQ01EX1BPUlRfTElTVF9HRVQsCisKKwlfX1RFQU1fQ01EX01BWCwKKwlURUFNX0NNRF9NQVggPSAoX19URUFNX0NNRF9NQVggLSAxKSwKK307CisKK2VudW0geworCVRFQU1fQVRUUl9VTlNQRUMsCisJVEVBTV9BVFRSX1RFQU1fSUZJTkRFWCwJCS8qIHUzMiAqLworCVRFQU1fQVRUUl9MSVNUX09QVElPTiwJCS8qIG5lc3QgKi8KKwlURUFNX0FUVFJfTElTVF9QT1JULAkJLyogbmVzdCAqLworCisJX19URUFNX0FUVFJfTUFYLAorCVRFQU1fQVRUUl9NQVggPSBfX1RFQU1fQVRUUl9NQVggLSAxLAorfTsKKworLyogTmVzdGVkIGxheW91dCBvZiBnZXQvc2V0IG1zZzoKKyAqCisgKglbVEVBTV9BVFRSX0xJU1RfT1BUSU9OXQorICoJCVtURUFNX0FUVFJfSVRFTV9PUFRJT05dCisgKgkJCVtURUFNX0FUVFJfT1BUSU9OXypdLCAuLi4KKyAqCQlbVEVBTV9BVFRSX0lURU1fT1BUSU9OXQorICoJCQlbVEVBTV9BVFRSX09QVElPTl8qXSwgLi4uCisgKgkJLi4uCisgKglbVEVBTV9BVFRSX0xJU1RfUE9SVF0KKyAqCQlbVEVBTV9BVFRSX0lURU1fUE9SVF0KKyAqCQkJW1RFQU1fQVRUUl9QT1JUXypdLCAuLi4KKyAqCQlbVEVBTV9BVFRSX0lURU1fUE9SVF0KKyAqCQkJW1RFQU1fQVRUUl9QT1JUXypdLCAuLi4KKyAqCQkuLi4KKyAqLworCitlbnVtIHsKKwlURUFNX0FUVFJfSVRFTV9PUFRJT05fVU5TUEVDLAorCVRFQU1fQVRUUl9JVEVNX09QVElPTiwJCS8qIG5lc3QgKi8KKworCV9fVEVBTV9BVFRSX0lURU1fT1BUSU9OX01BWCwKKwlURUFNX0FUVFJfSVRFTV9PUFRJT05fTUFYID0gX19URUFNX0FUVFJfSVRFTV9PUFRJT05fTUFYIC0gMSwKK307CisKK2VudW0geworCVRFQU1fQVRUUl9PUFRJT05fVU5TUEVDLAorCVRFQU1fQVRUUl9PUFRJT05fTkFNRSwJCS8qIHN0cmluZyAqLworCVRFQU1fQVRUUl9PUFRJT05fQ0hBTkdFRCwJLyogZmxhZyAqLworCVRFQU1fQVRUUl9PUFRJT05fVFlQRSwJCS8qIHU4ICovCisJVEVBTV9BVFRSX09QVElPTl9EQVRBLAkJLyogZHluYW1pYyAqLworCisJX19URUFNX0FUVFJfT1BUSU9OX01BWCwKKwlURUFNX0FUVFJfT1BUSU9OX01BWCA9IF9fVEVBTV9BVFRSX09QVElPTl9NQVggLSAxLAorfTsKKworZW51bSB7CisJVEVBTV9BVFRSX0lURU1fUE9SVF9VTlNQRUMsCisJVEVBTV9BVFRSX0lURU1fUE9SVCwJCS8qIG5lc3QgKi8KKworCV9fVEVBTV9BVFRSX0lURU1fUE9SVF9NQVgsCisJVEVBTV9BVFRSX0lURU1fUE9SVF9NQVggPSBfX1RFQU1fQVRUUl9JVEVNX1BPUlRfTUFYIC0gMSwKK307CisKK2VudW0geworCVRFQU1fQVRUUl9QT1JUX1VOU1BFQywKKwlURUFNX0FUVFJfUE9SVF9JRklOREVYLAkJLyogdTMyICovCisJVEVBTV9BVFRSX1BPUlRfQ0hBTkdFRCwJCS8qIGZsYWcgKi8KKwlURUFNX0FUVFJfUE9SVF9MSU5LVVAsCQkvKiBmbGFnICovCisJVEVBTV9BVFRSX1BPUlRfU1BFRUQsCQkvKiB1MzIgKi8KKwlURUFNX0FUVFJfUE9SVF9EVVBMRVgsCQkvKiB1OCAqLworCisJX19URUFNX0FUVFJfUE9SVF9NQVgsCisJVEVBTV9BVFRSX1BPUlRfTUFYID0gX19URUFNX0FUVFJfUE9SVF9NQVggLSAxLAorfTsKKworLyoKKyAqIE5FVExJTktfR0VORVJJQyByZWxhdGVkIGluZm8KKyAqLworI2RlZmluZSBURUFNX0dFTkxfTkFNRSAidGVhbSIKKyNkZWZpbmUgVEVBTV9HRU5MX1ZFUlNJT04gMHgxCisjZGVmaW5lIFRFQU1fR0VOTF9DSEFOR0VfRVZFTlRfTUNfR1JQX05BTUUgImNoYW5nZV9ldmVudCIKKworI2VuZGlmIC8qIF9MSU5VWF9JRl9URUFNX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lmX3ZsYW4uaCBiL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCmluZGV4IDEyZDU1NDMuLjEzYWZmMWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCisrKyBiL2luY2x1ZGUvbGludXgvaWZfdmxhbi5oCkBAIC03NCwyMiArNzQsNyBAQAogLyogZm91bmQgaW4gc29ja2V0LmMgKi8KIGV4dGVybiB2b2lkIHZsYW5faW9jdGxfc2V0KGludCAoKmhvb2spKHN0cnVjdCBuZXQgKiwgdm9pZCBfX3VzZXIgKikpOwogCi0vKiBpZiB0aGlzIGNoYW5nZXMsIGFsZ29yaXRobSB3aWxsIGhhdmUgdG8gYmUgcmV3b3JrZWQgYmVjYXVzZSB0aGlzCi0gKiBkZXBlbmRzIG9uIGNvbXBsZXRlbHkgZXhoYXVzdGluZyB0aGUgVkxBTiBpZGVudGlmaWVyIHNwYWNlLiAgVGh1cwotICogaXQgZ2l2ZXMgY29uc3RhbnQgdGltZSBsb29rLXVwLCBidXQgaW4gbWFueSBjYXNlcyBpdCB3YXN0ZXMgbWVtb3J5LgotICovCi0jZGVmaW5lIFZMQU5fR1JPVVBfQVJSQVlfU1BMSVRfUEFSVFMgIDgKLSNkZWZpbmUgVkxBTl9HUk9VUF9BUlJBWV9QQVJUX0xFTiAgICAgKFZMQU5fTl9WSUQvVkxBTl9HUk9VUF9BUlJBWV9TUExJVF9QQVJUUykKLQotc3RydWN0IHZsYW5fZ3JvdXAgewotCXN0cnVjdCBuZXRfZGV2aWNlCSpyZWFsX2RldjsgLyogVGhlIGV0aGVybmV0KGxpa2UpIGRldmljZQotCQkJCQkgICAgKiB0aGUgdmxhbiBpcyBhdHRhY2hlZCB0by4KLQkJCQkJICAgICovCi0JdW5zaWduZWQgaW50CQlucl92bGFuczsKLQlzdHJ1Y3QgaGxpc3Rfbm9kZQlobGlzdDsJLyogbGlua2VkIGxpc3QgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZSAqKnZsYW5fZGV2aWNlc19hcnJheXNbVkxBTl9HUk9VUF9BUlJBWV9TUExJVF9QQVJUU107Ci0Jc3RydWN0IHJjdV9oZWFkCQlyY3U7Ci19Oworc3RydWN0IHZsYW5faW5mbzsKIAogc3RhdGljIGlubGluZSBpbnQgaXNfdmxhbl9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTEwOSw2ICs5NCwxMyBAQAogZXh0ZXJuIGJvb2wgdmxhbl9kb19yZWNlaXZlKHN0cnVjdCBza19idWZmICoqc2tiLCBib29sIGxhc3RfaGFuZGxlcik7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnZsYW5fdW50YWcoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKK2V4dGVybiBpbnQgdmxhbl92aWRfYWRkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCk7CitleHRlcm4gdm9pZCB2bGFuX3ZpZF9kZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKTsKKworZXh0ZXJuIGludCB2bGFuX3ZpZHNfYWRkX2J5X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpieV9kZXYpOworZXh0ZXJuIHZvaWQgdmxhbl92aWRzX2RlbF9ieV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmJ5X2Rldik7CiAjZWxzZQogc3RhdGljIGlubGluZSBzdHJ1Y3QgbmV0X2RldmljZSAqCiBfX3ZsYW5fZmluZF9kZXZfZGVlcChzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYsIHUxNiB2bGFuX2lkKQpAQCAtMTM5LDYgKzEzMSwyNiBAQAogewogCXJldHVybiBza2I7CiB9CisKK3N0YXRpYyBpbmxpbmUgaW50IHZsYW5fdmlkX2FkZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2bGFuX3ZpZF9kZWwoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCB2bGFuX3ZpZHNfYWRkX2J5X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqYnlfZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdmxhbl92aWRzX2RlbF9ieV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmJ5X2RldikKK3sKK30KICNlbmRpZgogCiAvKioKQEAgLTMxMCw2ICszMjIsNDAgQEAKIAogCXJldHVybiBwcm90b2NvbDsKIH0KKworc3RhdGljIGlubGluZSB2b2lkIHZsYW5fc2V0X2VuY2FwX3Byb3RvKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXN0cnVjdCB2bGFuX2hkciAqdmhkcikKK3sKKwlfX2JlMTYgcHJvdG87CisJdW5zaWduZWQgY2hhciAqcmF3cDsKKworCS8qCisJICogV2FzIGEgVkxBTiBwYWNrZXQsIGdyYWIgdGhlIGVuY2Fwc3VsYXRlZCBwcm90b2NvbCwgd2hpY2ggdGhlIGxheWVyCisJICogdGhyZWUgcHJvdG9jb2xzIGNhcmUgYWJvdXQuCisJICovCisKKwlwcm90byA9IHZoZHItPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CisJaWYgKG50b2hzKHByb3RvKSA+PSAxNTM2KSB7CisJCXNrYi0+cHJvdG9jb2wgPSBwcm90bzsKKwkJcmV0dXJuOworCX0KKworCXJhd3AgPSBza2ItPmRhdGE7CisJaWYgKCoodW5zaWduZWQgc2hvcnQgKikgcmF3cCA9PSAweEZGRkYpCisJCS8qCisJCSAqIFRoaXMgaXMgYSBtYWdpYyBoYWNrIHRvIHNwb3QgSVBYIHBhY2tldHMuIE9sZGVyIE5vdmVsbAorCQkgKiBicmVha3MgdGhlIHByb3RvY29sIGRlc2lnbiBhbmQgcnVucyBJUFggb3ZlciA4MDIuMyB3aXRob3V0CisJCSAqIGFuIDgwMi4yIExMQyBsYXllci4gV2UgbG9vayBmb3IgRkZGRiB3aGljaCBpc24ndCBhIHVzZWQKKwkJICogODAyLjIgU1NBUC9EU0FQLiBUaGlzIHdvbid0IHdvcmsgZm9yIGZhdWx0IHRvbGVyYW50IG5ldHdhcmUKKwkJICogYnV0IGRvZXMgZm9yIHRoZSByZXN0LgorCQkgKi8KKwkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8zKTsKKwllbHNlCisJCS8qCisJCSAqIFJlYWwgODAyLjIgTExDCisJCSAqLworCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOworfQogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KIAogLyogVkxBTiBJT0NUTHMgYXJlIGZvdW5kIGluIHNvY2tpb3MuaCAqLwpAQCAtMzUyLDcgKzM5OCw3IEBACiAJCXVuc2lnbmVkIGludCBza2JfcHJpb3JpdHk7CiAJCXVuc2lnbmVkIGludCBuYW1lX3R5cGU7CiAJCXVuc2lnbmVkIGludCBiaW5kX3R5cGU7Ci0JCXVuc2lnbmVkIGludCBmbGFnOyAvKiBNYXRjaGVzIHZsYW5fZGV2X2luZm8gZmxhZ3MgKi8KKwkJdW5zaWduZWQgaW50IGZsYWc7IC8qIE1hdGNoZXMgdmxhbl9kZXZfcHJpdiBmbGFncyAqLwogICAgICAgICB9IHU7CiAKIAlzaG9ydCB2bGFuX3FvczsgICAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmggYi9pbmNsdWRlL2xpbnV4L2luZXRfZGlhZy5oCmluZGV4IGFiZjUwMjguLjM0ZThkNTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5ldF9kaWFnLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbmV0X2RpYWcuaApAQCAtMjIsNyArMjIsNyBAQAogCiAvKiBSZXF1ZXN0IHN0cnVjdHVyZSAqLwogCi1zdHJ1Y3QgaW5ldF9kaWFnX3JlcSB7CitzdHJ1Y3QgaW5ldF9kaWFnX3JlcV9jb21wYXQgewogCV9fdTgJaWRpYWdfZmFtaWx5OwkJLyogRmFtaWx5IG9mIGFkZHJlc3Nlcy4gKi8KIAlfX3U4CWlkaWFnX3NyY19sZW47CiAJX191OAlpZGlhZ19kc3RfbGVuOwpAQCAtMzQsNiArMzQsMTUgQEAKIAlfX3UzMglpZGlhZ19kYnM7CQkvKiBUYWJsZXMgdG8gZHVtcCAoTkkpICovCiB9OwogCitzdHJ1Y3QgaW5ldF9kaWFnX3JlcSB7CisJX191OAlzZGlhZ19mYW1pbHk7CisJX191OAlzZGlhZ19wcm90b2NvbDsKKwlfX3U4CWlkaWFnX2V4dDsKKwlfX3U4CXBhZDsKKwlfX3UzMglpZGlhZ19zdGF0ZXM7CisJc3RydWN0IGluZXRfZGlhZ19zb2NraWQgaWQ7Cit9OworCiBlbnVtIHsKIAlJTkVUX0RJQUdfUkVRX05PTkUsCiAJSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSwKQEAgLTk5LDkgKzEwOCwxMCBAQAogCUlORVRfRElBR19DT05HLAogCUlORVRfRElBR19UT1MsCiAJSU5FVF9ESUFHX1RDTEFTUywKKwlJTkVUX0RJQUdfU0tNRU1JTkZPLAogfTsKIAotI2RlZmluZSBJTkVUX0RJQUdfTUFYIElORVRfRElBR19UQ0xBU1MKKyNkZWZpbmUgSU5FVF9ESUFHX01BWCBJTkVUX0RJQUdfU0tNRU1JTkZPCiAKIAogLyogSU5FVF9ESUFHX01FTSAqLwpAQCAtMTI1LDE2ICsxMzUsNDEgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiBzdHJ1Y3Qgc29jazsKIHN0cnVjdCBpbmV0X2hhc2hpbmZvOworc3RydWN0IG5sYXR0cjsKK3N0cnVjdCBubG1zZ2hkcjsKK3N0cnVjdCBza19idWZmOworc3RydWN0IG5ldGxpbmtfY2FsbGJhY2s7CiAKIHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciB7Ci0Jc3RydWN0IGluZXRfaGFzaGluZm8gICAgKmlkaWFnX2hhc2hpbmZvOworCXZvaWQJCQkoKmR1bXApKHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCXN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCQkJc3RydWN0IGluZXRfZGlhZ19yZXEgKnIsCisJCQkJCXN0cnVjdCBubGF0dHIgKmJjKTsKKworCWludAkJCSgqZHVtcF9vbmUpKHN0cnVjdCBza19idWZmICppbl9za2IsCisJCQkJCWNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLAorCQkJCQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqcmVxKTsKKwogCXZvaWQJCQkoKmlkaWFnX2dldF9pbmZvKShzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJCQkgIHN0cnVjdCBpbmV0X2RpYWdfbXNnICpyLAogCQkJCQkJICB2b2lkICppbmZvKTsKLQlfX3UxNiAgICAgICAgICAgICAgICAgICBpZGlhZ19pbmZvX3NpemU7CiAJX191MTYgICAgICAgICAgICAgICAgICAgaWRpYWdfdHlwZTsKIH07CiAKK3N0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jazsKK2ludCBpbmV0X3NrX2RpYWdfZmlsbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzaywKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0X2RpYWdfcmVxICpyZXEsCisJCQkgICAgICB1MzIgcGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCisJCQkgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgpOwordm9pZCBpbmV0X2RpYWdfZHVtcF9pY3NrKHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsIHN0cnVjdCBpbmV0X2RpYWdfcmVxICpyLAorCQlzdHJ1Y3QgbmxhdHRyICpiYyk7CitpbnQgaW5ldF9kaWFnX2R1bXBfb25lX2ljc2soc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLAorCQlzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJc3RydWN0IGluZXRfZGlhZ19yZXEgKnJlcSk7CisKK2ludCBpbmV0X2RpYWdfYmNfc2soY29uc3Qgc3RydWN0IG5sYXR0ciAqX2JjLCBzdHJ1Y3Qgc29jayAqc2spOworCiBleHRlcm4gaW50ICBpbmV0X2RpYWdfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyKTsKIGV4dGVybiB2b2lkIGluZXRfZGlhZ191bnJlZ2lzdGVyKGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciAqaGFuZGxlcik7CiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaCBiL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKaW5kZXggOTRiMWUzNS4uMzI1NzRlZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaAorKysgYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCkBAIC0xMjYsNiArMTI2LDggQEAKICMgZGVmaW5lIElOSVRfUEVSRl9FVkVOVFModHNrKQogI2VuZGlmCiAKKyNkZWZpbmUgSU5JVF9UQVNLX0NPTU0gInN3YXBwZXIiCisKIC8qCiAgKiAgSU5JVF9UQVNLIGlzIHVzZWQgdG8gc2V0IHVwIHRoZSBmaXJzdCB0YXNrIHRhYmxlLCB0b3VjaCBhdAogICogeW91ciBvd24gcmlzayEuIEJhc2U9MCwgbGltaXQ9MHgxZmZmZmYgKD0yTUIpCkBAIC0xNjIsNyArMTY0LDcgQEAKIAkuZ3JvdXBfbGVhZGVyCT0gJnRzaywJCQkJCQlcCiAJUkNVX0lOSVRfUE9JTlRFUigucmVhbF9jcmVkLCAmaW5pdF9jcmVkKSwJCQlcCiAJUkNVX0lOSVRfUE9JTlRFUiguY3JlZCwgJmluaXRfY3JlZCksCQkJCVwKLQkuY29tbQkJPSAic3dhcHBlciIsCQkJCQlcCisJLmNvbW0JCT0gSU5JVF9UQVNLX0NPTU0sCQkJCVwKIAkudGhyZWFkCQk9IElOSVRfVEhSRUFELAkJCQkJXAogCS5mcwkJPSAmaW5pdF9mcywJCQkJCVwKIAkuZmlsZXMJCT0gJmluaXRfZmlsZXMsCQkJCQlcCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2lwdjYuaCBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCmluZGV4IDBjOTk3NzYuLjYzMTgyNjggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXB2Ni5oCisrKyBiL2luY2x1ZGUvbGludXgvaXB2Ni5oCkBAIC00MDQsNyArNDA0LDcgQEAKIAogZXh0ZXJuIGludCBpbmV0Nl9za19yZWJ1aWxkX2hlYWRlcihzdHJ1Y3Qgc29jayAqc2spOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGlwdjZfcGluZm8gKiBpbmV0Nl9zayhjb25zdCBzdHJ1Y3Qgc29jayAqX19zaykKIHsKIAlyZXR1cm4gaW5ldF9zayhfX3NrKS0+cGluZXQ2OwpAQCAtNTE1LDcgKzUxNSw3IEBACiAjZGVmaW5lIGluZXQ2X3Jjdl9zYWRkcihfX3NrKQlOVUxMCiAjZGVmaW5lIHRjcF90d3NrX2lwdjZvbmx5KF9fc2spCQkwCiAjZGVmaW5lIGluZXRfdjZfaXB2Nm9ubHkoX19zaykJCTAKLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkgKi8KKyNlbmRpZiAvKiBJU19FTkFCTEVEKENPTkZJR19JUFY2KSAqLwogCiAjZGVmaW5lIElORVQ2X01BVENIKF9fc2ssIF9fbmV0LCBfX2hhc2gsIF9fc2FkZHIsIF9fZGFkZHIsIF9fcG9ydHMsIF9fZGlmKVwKIAkoKChfX3NrKS0+c2tfaGFzaCA9PSAoX19oYXNoKSkgJiYgc29ja19uZXQoKF9fc2spKSA9PSAoX19uZXQpCSYmIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvanVtcF9sYWJlbC5oIGIvaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsLmgKaW5kZXggMzg4YjBkNC4uNWNlOGIxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsLmgKKysrIGIvaW5jbHVkZS9saW51eC9qdW1wX2xhYmVsLmgKQEAgLTMsNiArMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAKICNpZiBkZWZpbmVkKENDX0hBVkVfQVNNX0dPVE8pICYmIGRlZmluZWQoQ09ORklHX0pVTVBfTEFCRUwpCiAKQEAgLTE0LDYgKzE1LDEyIEBACiAjZW5kaWYKIH07CiAKK3N0cnVjdCBqdW1wX2xhYmVsX2tleV9kZWZlcnJlZCB7CisJc3RydWN0IGp1bXBfbGFiZWxfa2V5IGtleTsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJc3RydWN0IGRlbGF5ZWRfd29yayB3b3JrOworfTsKKwogIyBpbmNsdWRlIDxhc20vanVtcF9sYWJlbC5oPgogIyBkZWZpbmUgSEFWRV9KVU1QX0xBQkVMCiAjZW5kaWYJLyogQ0NfSEFWRV9BU01fR09UTyAmJiBDT05GSUdfSlVNUF9MQUJFTCAqLwpAQCAtNTEsOCArNTgsMTEgQEAKIGV4dGVybiBpbnQganVtcF9sYWJlbF90ZXh0X3Jlc2VydmVkKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpOwogZXh0ZXJuIHZvaWQganVtcF9sYWJlbF9pbmMoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpOwogZXh0ZXJuIHZvaWQganVtcF9sYWJlbF9kZWMoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpOworZXh0ZXJuIHZvaWQganVtcF9sYWJlbF9kZWNfZGVmZXJyZWQoc3RydWN0IGp1bXBfbGFiZWxfa2V5X2RlZmVycmVkICprZXkpOwogZXh0ZXJuIGJvb2wganVtcF9sYWJlbF9lbmFibGVkKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5KTsKIGV4dGVybiB2b2lkIGp1bXBfbGFiZWxfYXBwbHlfbm9wcyhzdHJ1Y3QgbW9kdWxlICptb2QpOworZXh0ZXJuIHZvaWQganVtcF9sYWJlbF9yYXRlX2xpbWl0KHN0cnVjdCBqdW1wX2xhYmVsX2tleV9kZWZlcnJlZCAqa2V5LAorCQl1bnNpZ25lZCBsb25nIHJsKTsKIAogI2Vsc2UgIC8qICFIQVZFX0pVTVBfTEFCRUwgKi8KIApAQCAtNjgsNiArNzgsMTAgQEAKIHsKIH0KIAorc3RydWN0IGp1bXBfbGFiZWxfa2V5X2RlZmVycmVkIHsKKwlzdHJ1Y3QganVtcF9sYWJlbF9rZXkgIGtleTsKK307CisKIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBzdGF0aWNfYnJhbmNoKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5KQogewogCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgma2V5LT5lbmFibGVkKSkpCkBAIC04NSw2ICs5OSwxMSBAQAogCWF0b21pY19kZWMoJmtleS0+ZW5hYmxlZCk7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBqdW1wX2xhYmVsX2RlY19kZWZlcnJlZChzdHJ1Y3QganVtcF9sYWJlbF9rZXlfZGVmZXJyZWQgKmtleSkKK3sKKwlqdW1wX2xhYmVsX2RlYygma2V5LT5rZXkpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBqdW1wX2xhYmVsX3RleHRfcmVzZXJ2ZWQodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCkKIHsKIAlyZXR1cm4gMDsKQEAgLTEwMiw2ICsxMjEsMTQgQEAKIHsKIAlyZXR1cm4gMDsKIH0KKworc3RhdGljIGlubGluZSB2b2lkIGp1bXBfbGFiZWxfcmF0ZV9saW1pdChzdHJ1Y3QganVtcF9sYWJlbF9rZXlfZGVmZXJyZWQgKmtleSwKKwkJdW5zaWduZWQgbG9uZyBybCkKK3sKK30KICNlbmRpZgkvKiBIQVZFX0pVTVBfTEFCRUwgKi8KIAorI2RlZmluZSBqdW1wX2xhYmVsX2tleV9lbmFibGVkCSgoc3RydWN0IGp1bXBfbGFiZWxfa2V5KXsgLmVuYWJsZWQgPSBBVE9NSUNfSU5JVCgxKSwgfSkKKyNkZWZpbmUganVtcF9sYWJlbF9rZXlfZGlzYWJsZWQJKChzdHJ1Y3QganVtcF9sYWJlbF9rZXkpeyAuZW5hYmxlZCA9IEFUT01JQ19JTklUKDApLCB9KQorCiAjZW5kaWYJLyogX0xJTlVYX0pVTVBfTEFCRUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oCmluZGV4IDBjY2UyZGIuLjJmYmQ5MDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsX3N0YXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmgKQEAgLTYsNiArNiw3IEBACiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogI2luY2x1ZGUgPGFzbS9jcHV0aW1lLmg+CiAKQEAgLTE1LDIxICsxNiwyNSBAQAogICogdXNlZCBieSByc3RhdGQvcGVyZm1ldGVyCiAgKi8KIAotc3RydWN0IGNwdV91c2FnZV9zdGF0IHsKLQljcHV0aW1lNjRfdCB1c2VyOwotCWNwdXRpbWU2NF90IG5pY2U7Ci0JY3B1dGltZTY0X3Qgc3lzdGVtOwotCWNwdXRpbWU2NF90IHNvZnRpcnE7Ci0JY3B1dGltZTY0X3QgaXJxOwotCWNwdXRpbWU2NF90IGlkbGU7Ci0JY3B1dGltZTY0X3QgaW93YWl0OwotCWNwdXRpbWU2NF90IHN0ZWFsOwotCWNwdXRpbWU2NF90IGd1ZXN0OwotCWNwdXRpbWU2NF90IGd1ZXN0X25pY2U7CitlbnVtIGNwdV91c2FnZV9zdGF0IHsKKwlDUFVUSU1FX1VTRVIsCisJQ1BVVElNRV9OSUNFLAorCUNQVVRJTUVfU1lTVEVNLAorCUNQVVRJTUVfU09GVElSUSwKKwlDUFVUSU1FX0lSUSwKKwlDUFVUSU1FX0lETEUsCisJQ1BVVElNRV9JT1dBSVQsCisJQ1BVVElNRV9TVEVBTCwKKwlDUFVUSU1FX0dVRVNULAorCUNQVVRJTUVfR1VFU1RfTklDRSwKKwlOUl9TVEFUUywKK307CisKK3N0cnVjdCBrZXJuZWxfY3B1c3RhdCB7CisJdTY0IGNwdXN0YXRbTlJfU1RBVFNdOwogfTsKIAogc3RydWN0IGtlcm5lbF9zdGF0IHsKLQlzdHJ1Y3QgY3B1X3VzYWdlX3N0YXQJY3B1c3RhdDsKICNpZm5kZWYgQ09ORklHX0dFTkVSSUNfSEFSRElSUVMKICAgICAgICB1bnNpZ25lZCBpbnQgaXJxc1tOUl9JUlFTXTsKICNlbmRpZgpAQCAtMzgsMTAgKzQzLDEzIEBACiB9OwogCiBERUNMQVJFX1BFUl9DUFUoc3RydWN0IGtlcm5lbF9zdGF0LCBrc3RhdCk7CitERUNMQVJFX1BFUl9DUFUoc3RydWN0IGtlcm5lbF9jcHVzdGF0LCBrZXJuZWxfY3B1c3RhdCk7CiAKLSNkZWZpbmUga3N0YXRfY3B1KGNwdSkJcGVyX2NwdShrc3RhdCwgY3B1KQogLyogTXVzdCBoYXZlIHByZWVtcHRpb24gZGlzYWJsZWQgZm9yIHRoaXMgdG8gYmUgbWVhbmluZ2Z1bC4gKi8KLSNkZWZpbmUga3N0YXRfdGhpc19jcHUJX19nZXRfY3B1X3Zhcihrc3RhdCkKKyNkZWZpbmUga3N0YXRfdGhpc19jcHUgKCZfX2dldF9jcHVfdmFyKGtzdGF0KSkKKyNkZWZpbmUga2NwdXN0YXRfdGhpc19jcHUgKCZfX2dldF9jcHVfdmFyKGtlcm5lbF9jcHVzdGF0KSkKKyNkZWZpbmUga3N0YXRfY3B1KGNwdSkgcGVyX2NwdShrc3RhdCwgY3B1KQorI2RlZmluZSBrY3B1c3RhdF9jcHUoY3B1KSBwZXJfY3B1KGtlcm5lbF9jcHVzdGF0LCBjcHUpCiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIGxvbmcgbnJfY29udGV4dF9zd2l0Y2hlcyh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rdm0uaCBiL2luY2x1ZGUvbGludXgva3ZtLmgKaW5kZXggYzM4OTJmYy4uNjhlNjdlNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdm0uaAorKysgYi9pbmNsdWRlL2xpbnV4L2t2bS5oCkBAIC01NTcsNiArNTU3LDcgQEAKICNkZWZpbmUgS1ZNX0NBUF9NQVhfVkNQVVMgNjYgICAgICAgLyogcmV0dXJucyBtYXggdmNwdXMgcGVyIHZtICovCiAjZGVmaW5lIEtWTV9DQVBfUFBDX1BBUFIgNjgKICNkZWZpbmUgS1ZNX0NBUF9TMzkwX0dNQVAgNzEKKyNkZWZpbmUgS1ZNX0NBUF9UU0NfREVBRExJTkVfVElNRVIgNzIKIAogI2lmZGVmIEtWTV9DQVBfSVJRX1JPVVRJTkcKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9sYXRlbmN5dG9wLmggYi9pbmNsdWRlL2xpbnV4L2xhdGVuY3l0b3AuaAppbmRleCBiMGU5OTg5Li5lMjMxMjFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xhdGVuY3l0b3AuaAorKysgYi9pbmNsdWRlL2xpbnV4L2xhdGVuY3l0b3AuaApAQCAtMTAsNiArMTAsOCBAQAogI2RlZmluZSBfSU5DTFVERV9HVUFSRF9MQVRFTkNZVE9QX0hfCiAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgorc3RydWN0IHRhc2tfc3RydWN0OworCiAjaWZkZWYgQ09ORklHX0xBVEVOQ1lUT1AKIAogI2RlZmluZSBMVF9TQVZFQ09VTlQJCTMyCkBAIC0yMyw3ICsyNSw2IEBACiB9OwogCiAKLXN0cnVjdCB0YXNrX3N0cnVjdDsKIAogZXh0ZXJuIGludCBsYXRlbmN5dG9wX2VuYWJsZWQ7CiB2b2lkIF9fYWNjb3VudF9zY2hlZHVsZXJfbGF0ZW5jeShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCB1c2VjcywgaW50IGludGVyKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbGdsb2NrLmggYi9pbmNsdWRlL2xpbnV4L2xnbG9jay5oCmluZGV4IGY1NDkwNTYuLjg3ZjQwMmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbGdsb2NrLmgKKysrIGIvaW5jbHVkZS9saW51eC9sZ2xvY2suaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogCiAvKiBjYW4gbWFrZSBiciBsb2NrcyBieSB1c2luZyBsb2NhbCBsb2NrIGZvciByZWFkIHNpZGUsIGdsb2JhbCBsb2NrIGZvciB3cml0ZSAqLwogI2RlZmluZSBicl9sb2NrX2luaXQobmFtZSkJbmFtZSMjX2xvY2tfaW5pdCgpCkBAIC03Miw5ICs3MywzMSBAQAogCiAjZGVmaW5lIERFRklORV9MR0xPQ0sobmFtZSkJCQkJCQlcCiAJCQkJCQkJCQlcCisgREVGSU5FX1NQSU5MT0NLKG5hbWUjI19jcHVfbG9jayk7CQkJCQlcCisgY3B1bWFza190IG5hbWUjI19jcHVzIF9fcmVhZF9tb3N0bHk7CQkJCQlcCiAgREVGSU5FX1BFUl9DUFUoYXJjaF9zcGlubG9ja190LCBuYW1lIyNfbG9jayk7CQkJCVwKICBERUZJTkVfTEdMT0NLX0xPQ0tERVAobmFtZSk7CQkJCQkJXAogCQkJCQkJCQkJXAorIHN0YXRpYyBpbnQJCQkJCQkJCVwKKyBuYW1lIyNfbGdfY3B1X2NhbGxiYWNrKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCQkJXAorCQkJCXVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQlcCisgewkJCQkJCQkJCVwKKwlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7CQkJCVwKKwljYXNlIENQVV9VUF9QUkVQQVJFOgkJCQkJCVwKKwkJc3Bpbl9sb2NrKCZuYW1lIyNfY3B1X2xvY2spOwkJCQlcCisJCWNwdV9zZXQoKHVuc2lnbmVkIGxvbmcpaGNwdSwgbmFtZSMjX2NwdXMpOwkJXAorCQlzcGluX3VubG9jaygmbmFtZSMjX2NwdV9sb2NrKTsJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCWNhc2UgQ1BVX1VQX0NBTkNFTEVEOiBjYXNlIENQVV9ERUFEOgkJCQlcCisJCXNwaW5fbG9jaygmbmFtZSMjX2NwdV9sb2NrKTsJCQkJXAorCQljcHVfY2xlYXIoKHVuc2lnbmVkIGxvbmcpaGNwdSwgbmFtZSMjX2NwdXMpOwkJXAorCQlzcGluX3VubG9jaygmbmFtZSMjX2NwdV9sb2NrKTsJCQkJXAorCX0JCQkJCQkJCVwKKwlyZXR1cm4gTk9USUZZX09LOwkJCQkJCVwKKyB9CQkJCQkJCQkJXAorIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbmFtZSMjX2xnX2NwdV9ub3RpZmllciA9IHsJCVwKKwkubm90aWZpZXJfY2FsbCA9IG5hbWUjI19sZ19jcHVfY2FsbGJhY2ssCQkJXAorIH07CQkJCQkJCQkJXAogIHZvaWQgbmFtZSMjX2xvY2tfaW5pdCh2b2lkKSB7CQkJCQkJXAogCWludCBpOwkJCQkJCQkJXAogCUxPQ0tERVBfSU5JVF9NQVAoJm5hbWUjI19sb2NrX2RlcF9tYXAsICNuYW1lLCAmbmFtZSMjX2xvY2tfa2V5LCAwKTsgXApAQCAtODMsNiArMTA2LDExIEBACiAJCWxvY2sgPSAmcGVyX2NwdShuYW1lIyNfbG9jaywgaSk7CQkJXAogCQkqbG9jayA9IChhcmNoX3NwaW5sb2NrX3QpX19BUkNIX1NQSU5fTE9DS19VTkxPQ0tFRDsJXAogCX0JCQkJCQkJCVwKKwlyZWdpc3Rlcl9ob3RjcHVfbm90aWZpZXIoJm5hbWUjI19sZ19jcHVfbm90aWZpZXIpOwkJXAorCWdldF9vbmxpbmVfY3B1cygpOwkJCQkJCVwKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpCQkJCQkJXAorCQljcHVfc2V0KGksIG5hbWUjI19jcHVzKTsJCQkJXAorCXB1dF9vbmxpbmVfY3B1cygpOwkJCQkJCVwKICB9CQkJCQkJCQkJXAogIEVYUE9SVF9TWU1CT0wobmFtZSMjX2xvY2tfaW5pdCk7CQkJCQlcCiAJCQkJCQkJCQlcCkBAIC0xMjQsOSArMTUyLDkgQEAKIAkJCQkJCQkJCVwKICB2b2lkIG5hbWUjI19nbG9iYWxfbG9ja19vbmxpbmUodm9pZCkgewkJCQkJXAogCWludCBpOwkJCQkJCQkJXAotCXByZWVtcHRfZGlzYWJsZSgpOwkJCQkJCVwKKwlzcGluX2xvY2soJm5hbWUjI19jcHVfbG9jayk7CQkJCQlcCiAJcndsb2NrX2FjcXVpcmUoJm5hbWUjI19sb2NrX2RlcF9tYXAsIDAsIDAsIF9SRVRfSVBfKTsJCVwKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsJCQkJCVwKKwlmb3JfZWFjaF9jcHUoaSwgJm5hbWUjI19jcHVzKSB7CQkJCQlcCiAJCWFyY2hfc3BpbmxvY2tfdCAqbG9jazsJCQkJCVwKIAkJbG9jayA9ICZwZXJfY3B1KG5hbWUjI19sb2NrLCBpKTsJCQlcCiAJCWFyY2hfc3Bpbl9sb2NrKGxvY2spOwkJCQkJXApAQCAtMTM3LDEyICsxNjUsMTIgQEAKICB2b2lkIG5hbWUjI19nbG9iYWxfdW5sb2NrX29ubGluZSh2b2lkKSB7CQkJCVwKIAlpbnQgaTsJCQkJCQkJCVwKIAlyd2xvY2tfcmVsZWFzZSgmbmFtZSMjX2xvY2tfZGVwX21hcCwgMSwgX1JFVF9JUF8pOwkJXAotCWZvcl9lYWNoX29ubGluZV9jcHUoaSkgewkJCQkJXAorCWZvcl9lYWNoX2NwdShpLCAmbmFtZSMjX2NwdXMpIHsJCQkJCVwKIAkJYXJjaF9zcGlubG9ja190ICpsb2NrOwkJCQkJXAogCQlsb2NrID0gJnBlcl9jcHUobmFtZSMjX2xvY2ssIGkpOwkJCVwKIAkJYXJjaF9zcGluX3VubG9jayhsb2NrKTsJCQkJCVwKIAl9CQkJCQkJCQlcCi0JcHJlZW1wdF9lbmFibGUoKTsJCQkJCQlcCisJc3Bpbl91bmxvY2soJm5hbWUjI19jcHVfbG9jayk7CQkJCQlcCiAgfQkJCQkJCQkJCVwKICBFWFBPUlRfU1lNQk9MKG5hbWUjI19nbG9iYWxfdW5sb2NrX29ubGluZSk7CQkJCVwKIAkJCQkJCQkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaCBiL2luY2x1ZGUvbGludXgvbG9ja2QvbG9ja2QuaAppbmRleCBmZjlhYmZmLi45MGIwNjU2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xvY2tkL2xvY2tkLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZC9sb2NrZC5oCkBAIC0zMDEsNyArMzAxLDcgQEAKIAlyZXR1cm4gaXB2NF9pc19sb29wYmFjayhzaW4tPnNpbl9hZGRyLnNfYWRkcik7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIGlubGluZSBpbnQgX19ubG1fcHJpdmlsZWdlZF9yZXF1ZXN0Nihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKIHsKIAljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYXA7CkBAIC0zMTQsMTIgKzMxNCwxMiBAQAogCiAJcmV0dXJuIGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xPT1BCQUNLOwogfQotI2Vsc2UJLyogZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpICovCisjZWxzZQkvKiBJU19FTkFCTEVEKENPTkZJR19JUFY2KSAqLwogc3RhdGljIGlubGluZSBpbnQgX19ubG1fcHJpdmlsZWdlZF9yZXF1ZXN0Nihjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKIHsKIAlyZXR1cm4gMDsKIH0KLSNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkgKi8KKyNlbmRpZgkvKiBJU19FTkFCTEVEKENPTkZJR19JUFY2KSAqLwogCiAvKgogICogRW5zdXJlIGluY29taW5nIHJlcXVlc3RzIGFyZSBmcm9tIGxvY2FsIHByaXZpbGVnZWQgY2FsbGVycy4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbG9ja2RlcC5oIGIvaW5jbHVkZS9saW51eC9sb2NrZGVwLmgKaW5kZXggYjZhNTZlMy4uZDM2NjE5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9sb2NrZGVwLmgKKysrIGIvaW5jbHVkZS9saW51eC9sb2NrZGVwLmgKQEAgLTM0Myw2ICszNDMsOCBAQAogCiAjZGVmaW5lIGxvY2tkZXBfYXNzZXJ0X2hlbGQobCkJV0FSTl9PTihkZWJ1Z19sb2NrcyAmJiAhbG9ja2RlcF9pc19oZWxkKGwpKQogCisjZGVmaW5lIGxvY2tkZXBfcmVjdXJzaW5nKHRzaykJKCh0c2spLT5sb2NrZGVwX3JlY3Vyc2lvbikKKwogI2Vsc2UgLyogIUxPQ0tERVAgKi8KIAogc3RhdGljIGlubGluZSB2b2lkIGxvY2tkZXBfb2ZmKHZvaWQpCkBAIC0zOTIsNiArMzk0LDggQEAKIAogI2RlZmluZSBsb2NrZGVwX2Fzc2VydF9oZWxkKGwpCQkJZG8geyB9IHdoaWxlICgwKQogCisjZGVmaW5lIGxvY2tkZXBfcmVjdXJzaW5nKHRzaykJCQkoMCkKKwogI2VuZGlmIC8qICFMT0NLREVQICovCiAKICNpZmRlZiBDT05GSUdfTE9DS19TVEFUCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xvZzIuaCBiL2luY2x1ZGUvbGludXgvbG9nMi5oCmluZGV4IDI1YjgwODYuLmZkN2ZmM2QgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbG9nMi5oCisrKyBiL2luY2x1ZGUvbGludXgvbG9nMi5oCkBAIC0xODUsNyArMTg1LDYgQEAKICNkZWZpbmUgcm91bmRkb3duX3Bvd19vZl90d28obikJCQlcCiAoCQkJCQkJXAogCV9fYnVpbHRpbl9jb25zdGFudF9wKG4pID8gKAkJXAotCQkobiA9PSAxKSA/IDAgOgkJCVwKIAkJKDFVTCA8PCBpbG9nMihuKSkpIDoJCVwKIAlfX3JvdW5kZG93bl9wb3dfb2ZfdHdvKG4pCQlcCiAgKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZGlvLWJpdGJhbmcuaCBiL2luY2x1ZGUvbGludXgvbWRpby1iaXRiYW5nLmgKaW5kZXggMGZlMDBjZC4uNzZmNTJiYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tZGlvLWJpdGJhbmcuaAorKysgYi9pbmNsdWRlL2xpbnV4L21kaW8tYml0YmFuZy5oCkBAIC0zMiw2ICszMiw4IEBACiAKIHN0cnVjdCBtZGlvYmJfY3RybCB7CiAJY29uc3Qgc3RydWN0IG1kaW9iYl9vcHMgKm9wczsKKwkvKiByZXNldCBjYWxsYmFjayAqLworCWludCAoKnJlc2V0KShzdHJ1Y3QgbWlpX2J1cyAqYnVzKTsKIH07CiAKIC8qIFRoZSByZXR1cm5lZCBidXMgaXMgbm90IHlldCByZWdpc3RlcmVkIHdpdGggdGhlIHBoeSBsYXllci4gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbWRpby1ncGlvLmggYi9pbmNsdWRlL2xpbnV4L21kaW8tZ3Bpby5oCmluZGV4IGU5ZDNmZGYuLjdjOWZlM2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWRpby1ncGlvLmgKKysrIGIvaW5jbHVkZS9saW51eC9tZGlvLWdwaW8uaApAQCAtMjAsNiArMjAsOCBAQAogCiAJdW5zaWduZWQgaW50IHBoeV9tYXNrOwogCWludCBpcnFzW1BIWV9NQVhfQUREUl07CisJLyogcmVzZXQgY2FsbGJhY2sgKi8KKwlpbnQgKCpyZXNldCkoc3RydWN0IG1paV9idXMgKmJ1cyk7CiB9OwogCiAjZW5kaWYgLyogX19MSU5VWF9NRElPX0dQSU9fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oIGIvaW5jbHVkZS9saW51eC9tZW1ibG9jay5oCmluZGV4IGU2Yjg0M2UuLmE2YmIxMDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtYmxvY2suaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbWJsb2NrLmgKQEAgLTIsOCArMiw2IEBACiAjZGVmaW5lIF9MSU5VWF9NRU1CTE9DS19ICiAjaWZkZWYgX19LRVJORUxfXwogCi0jZGVmaW5lIE1FTUJMT0NLX0VSUk9SCTAKLQogI2lmZGVmIENPTkZJR19IQVZFX01FTUJMT0NLCiAvKgogICogTG9naWNhbCBtZW1vcnkgYmxvY2tzLgpAQCAtMTksODEgKzE3LDE2MSBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tbS5oPgogCi0jaW5jbHVkZSA8YXNtL21lbWJsb2NrLmg+Ci0KICNkZWZpbmUgSU5JVF9NRU1CTE9DS19SRUdJT05TCTEyOAogCiBzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uIHsKIAlwaHlzX2FkZHJfdCBiYXNlOwogCXBoeXNfYWRkcl90IHNpemU7CisjaWZkZWYgQ09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVAKKwlpbnQgbmlkOworI2VuZGlmCiB9OwogCiBzdHJ1Y3QgbWVtYmxvY2tfdHlwZSB7CiAJdW5zaWduZWQgbG9uZyBjbnQ7CS8qIG51bWJlciBvZiByZWdpb25zICovCiAJdW5zaWduZWQgbG9uZyBtYXg7CS8qIHNpemUgb2YgdGhlIGFsbG9jYXRlZCBhcnJheSAqLworCXBoeXNfYWRkcl90IHRvdGFsX3NpemU7CS8qIHNpemUgb2YgYWxsIHJlZ2lvbnMgKi8KIAlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyZWdpb25zOwogfTsKIAogc3RydWN0IG1lbWJsb2NrIHsKIAlwaHlzX2FkZHJfdCBjdXJyZW50X2xpbWl0OwotCXBoeXNfYWRkcl90IG1lbW9yeV9zaXplOwkvKiBVcGRhdGVkIGJ5IG1lbWJsb2NrX2FuYWx5emUoKSAqLwogCXN0cnVjdCBtZW1ibG9ja190eXBlIG1lbW9yeTsKIAlzdHJ1Y3QgbWVtYmxvY2tfdHlwZSByZXNlcnZlZDsKIH07CiAKIGV4dGVybiBzdHJ1Y3QgbWVtYmxvY2sgbWVtYmxvY2s7CiBleHRlcm4gaW50IG1lbWJsb2NrX2RlYnVnOwotZXh0ZXJuIGludCBtZW1ibG9ja19jYW5fcmVzaXplOwogCiAjZGVmaW5lIG1lbWJsb2NrX2RiZyhmbXQsIC4uLikgXAogCWlmIChtZW1ibG9ja19kZWJ1ZykgcHJpbnRrKEtFUk5fSU5GTyBwcl9mbXQoZm10KSwgIyNfX1ZBX0FSR1NfXykKIAotdTY0IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2UodTY0IHN0YXJ0LCB1NjQgZW5kLCB1NjQgc2l6ZSwgdTY0IGFsaWduKTsKK3BoeXNfYWRkcl90IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2Vfbm9kZShwaHlzX2FkZHJfdCBzdGFydCwgcGh5c19hZGRyX3QgZW5kLAorCQkJCXBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduLCBpbnQgbmlkKTsKK3BoeXNfYWRkcl90IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2UocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCwKKwkJCQkgICBwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbik7CiBpbnQgbWVtYmxvY2tfZnJlZV9yZXNlcnZlZF9yZWdpb25zKHZvaWQpOwogaW50IG1lbWJsb2NrX3Jlc2VydmVfcmVzZXJ2ZWRfcmVnaW9ucyh2b2lkKTsKIAotZXh0ZXJuIHZvaWQgbWVtYmxvY2tfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIG1lbWJsb2NrX2FuYWx5emUodm9pZCk7Ci1leHRlcm4gbG9uZyBtZW1ibG9ja19hZGQocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSk7Ci1leHRlcm4gbG9uZyBtZW1ibG9ja19yZW1vdmUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSk7Ci1leHRlcm4gbG9uZyBtZW1ibG9ja19mcmVlKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUpOwotZXh0ZXJuIGxvbmcgbWVtYmxvY2tfcmVzZXJ2ZShwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKTsKK3ZvaWQgbWVtYmxvY2tfYWxsb3dfcmVzaXplKHZvaWQpOworaW50IG1lbWJsb2NrX2FkZF9ub2RlKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUsIGludCBuaWQpOworaW50IG1lbWJsb2NrX2FkZChwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKTsKK2ludCBtZW1ibG9ja19yZW1vdmUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSk7CitpbnQgbWVtYmxvY2tfZnJlZShwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKTsKK2ludCBtZW1ibG9ja19yZXNlcnZlKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUpOwogCi0vKiBUaGUgbnVtYSBhd2FyZSBhbGxvY2F0b3IgaXMgb25seSBhdmFpbGFibGUgaWYKLSAqIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCBpcyBzZXQKKyNpZmRlZiBDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RFX01BUAordm9pZCBfX25leHRfbWVtX3Bmbl9yYW5nZShpbnQgKmlkeCwgaW50IG5pZCwgdW5zaWduZWQgbG9uZyAqb3V0X3N0YXJ0X3BmbiwKKwkJCSAgdW5zaWduZWQgbG9uZyAqb3V0X2VuZF9wZm4sIGludCAqb3V0X25pZCk7CisKKy8qKgorICogZm9yX2VhY2hfbWVtX3Bmbl9yYW5nZSAtIGVhcmx5IG1lbW9yeSBwZm4gcmFuZ2UgaXRlcmF0b3IKKyAqIEBpOiBhbiBpbnRlZ2VyIHVzZWQgYXMgbG9vcCB2YXJpYWJsZQorICogQG5pZDogbm9kZSBzZWxlY3RvciwgJU1BWF9OVU1OT0RFUyBmb3IgYWxsIG5vZGVzCisgKiBAcF9zdGFydDogcHRyIHRvIHVsb25nIGZvciBzdGFydCBwZm4gb2YgdGhlIHJhbmdlLCBjYW4gYmUgJU5VTEwKKyAqIEBwX2VuZDogcHRyIHRvIHVsb25nIGZvciBlbmQgcGZuIG9mIHRoZSByYW5nZSwgY2FuIGJlICVOVUxMCisgKiBAcF9uaWQ6IHB0ciB0byBpbnQgZm9yIG5pZCBvZiB0aGUgcmFuZ2UsIGNhbiBiZSAlTlVMTAorICoKKyAqIFdhbGtzIG92ZXIgY29uZmlndXJlZCBtZW1vcnkgcmFuZ2VzLiAgQXZhaWxhYmxlIGFmdGVyIGVhcmx5X25vZGVfbWFwIGlzCisgKiBwb3B1bGF0ZWQuCiAgKi8KLWV4dGVybiBwaHlzX2FkZHJfdCBtZW1ibG9ja19hbGxvY19uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sCi0JCQkJCWludCBuaWQpOwotZXh0ZXJuIHBoeXNfYWRkcl90IG1lbWJsb2NrX2FsbG9jX3RyeV9uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sCi0JCQkJCSAgICBpbnQgbmlkKTsKKyNkZWZpbmUgZm9yX2VhY2hfbWVtX3Bmbl9yYW5nZShpLCBuaWQsIHBfc3RhcnQsIHBfZW5kLCBwX25pZCkJCVwKKwlmb3IgKGkgPSAtMSwgX19uZXh0X21lbV9wZm5fcmFuZ2UoJmksIG5pZCwgcF9zdGFydCwgcF9lbmQsIHBfbmlkKTsgXAorCSAgICAgaSA+PSAwOyBfX25leHRfbWVtX3Bmbl9yYW5nZSgmaSwgbmlkLCBwX3N0YXJ0LCBwX2VuZCwgcF9uaWQpKQorI2VuZGlmIC8qIENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQICovCiAKLWV4dGVybiBwaHlzX2FkZHJfdCBtZW1ibG9ja19hbGxvYyhwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbik7Cit2b2lkIF9fbmV4dF9mcmVlX21lbV9yYW5nZSh1NjQgKmlkeCwgaW50IG5pZCwgcGh5c19hZGRyX3QgKm91dF9zdGFydCwKKwkJCSAgIHBoeXNfYWRkcl90ICpvdXRfZW5kLCBpbnQgKm91dF9uaWQpOworCisvKioKKyAqIGZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlIC0gaXRlcmF0ZSB0aHJvdWdoIGZyZWUgbWVtYmxvY2sgYXJlYXMKKyAqIEBpOiB1NjQgdXNlZCBhcyBsb29wIHZhcmlhYmxlCisgKiBAbmlkOiBub2RlIHNlbGVjdG9yLCAlTUFYX05VTU5PREVTIGZvciBhbGwgbm9kZXMKKyAqIEBwX3N0YXJ0OiBwdHIgdG8gcGh5c19hZGRyX3QgZm9yIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHJhbmdlLCBjYW4gYmUgJU5VTEwKKyAqIEBwX2VuZDogcHRyIHRvIHBoeXNfYWRkcl90IGZvciBlbmQgYWRkcmVzcyBvZiB0aGUgcmFuZ2UsIGNhbiBiZSAlTlVMTAorICogQHBfbmlkOiBwdHIgdG8gaW50IGZvciBuaWQgb2YgdGhlIHJhbmdlLCBjYW4gYmUgJU5VTEwKKyAqCisgKiBXYWxrcyBvdmVyIGZyZWUgKG1lbW9yeSAmJiAhcmVzZXJ2ZWQpIGFyZWFzIG9mIG1lbWJsb2NrLiAgQXZhaWxhYmxlIGFzCisgKiBzb29uIGFzIG1lbWJsb2NrIGlzIGluaXRpYWxpemVkLgorICovCisjZGVmaW5lIGZvcl9lYWNoX2ZyZWVfbWVtX3JhbmdlKGksIG5pZCwgcF9zdGFydCwgcF9lbmQsIHBfbmlkKQkJXAorCWZvciAoaSA9IDAsCQkJCQkJCVwKKwkgICAgIF9fbmV4dF9mcmVlX21lbV9yYW5nZSgmaSwgbmlkLCBwX3N0YXJ0LCBwX2VuZCwgcF9uaWQpOwlcCisJICAgICBpICE9ICh1NjQpVUxMT05HX01BWDsJCQkJCVwKKwkgICAgIF9fbmV4dF9mcmVlX21lbV9yYW5nZSgmaSwgbmlkLCBwX3N0YXJ0LCBwX2VuZCwgcF9uaWQpKQorCit2b2lkIF9fbmV4dF9mcmVlX21lbV9yYW5nZV9yZXYodTY0ICppZHgsIGludCBuaWQsIHBoeXNfYWRkcl90ICpvdXRfc3RhcnQsCisJCQkgICAgICAgcGh5c19hZGRyX3QgKm91dF9lbmQsIGludCAqb3V0X25pZCk7CisKKy8qKgorICogZm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2VfcmV2ZXJzZSAtIHJldi1pdGVyYXRlIHRocm91Z2ggZnJlZSBtZW1ibG9jayBhcmVhcworICogQGk6IHU2NCB1c2VkIGFzIGxvb3AgdmFyaWFibGUKKyAqIEBuaWQ6IG5vZGUgc2VsZWN0b3IsICVNQVhfTlVNTk9ERVMgZm9yIGFsbCBub2RlcworICogQHBfc3RhcnQ6IHB0ciB0byBwaHlzX2FkZHJfdCBmb3Igc3RhcnQgYWRkcmVzcyBvZiB0aGUgcmFuZ2UsIGNhbiBiZSAlTlVMTAorICogQHBfZW5kOiBwdHIgdG8gcGh5c19hZGRyX3QgZm9yIGVuZCBhZGRyZXNzIG9mIHRoZSByYW5nZSwgY2FuIGJlICVOVUxMCisgKiBAcF9uaWQ6IHB0ciB0byBpbnQgZm9yIG5pZCBvZiB0aGUgcmFuZ2UsIGNhbiBiZSAlTlVMTAorICoKKyAqIFdhbGtzIG92ZXIgZnJlZSAobWVtb3J5ICYmICFyZXNlcnZlZCkgYXJlYXMgb2YgbWVtYmxvY2sgaW4gcmV2ZXJzZQorICogb3JkZXIuICBBdmFpbGFibGUgYXMgc29vbiBhcyBtZW1ibG9jayBpcyBpbml0aWFsaXplZC4KKyAqLworI2RlZmluZSBmb3JfZWFjaF9mcmVlX21lbV9yYW5nZV9yZXZlcnNlKGksIG5pZCwgcF9zdGFydCwgcF9lbmQsIHBfbmlkKQlcCisJZm9yIChpID0gKHU2NClVTExPTkdfTUFYLAkJCQkJXAorCSAgICAgX19uZXh0X2ZyZWVfbWVtX3JhbmdlX3JldigmaSwgbmlkLCBwX3N0YXJ0LCBwX2VuZCwgcF9uaWQpOwlcCisJICAgICBpICE9ICh1NjQpVUxMT05HX01BWDsJCQkJCVwKKwkgICAgIF9fbmV4dF9mcmVlX21lbV9yYW5nZV9yZXYoJmksIG5pZCwgcF9zdGFydCwgcF9lbmQsIHBfbmlkKSkKKworI2lmZGVmIENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQCitpbnQgbWVtYmxvY2tfc2V0X25vZGUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSwgaW50IG5pZCk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1ibG9ja19zZXRfcmVnaW9uX25vZGUoc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqciwgaW50IG5pZCkKK3sKKwlyLT5uaWQgPSBuaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1lbWJsb2NrX2dldF9yZWdpb25fbm9kZShjb25zdCBzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyKQoreworCXJldHVybiByLT5uaWQ7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG1lbWJsb2NrX3NldF9yZWdpb25fbm9kZShzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyLCBpbnQgbmlkKQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUoY29uc3Qgc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcikKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RFX01BUCAqLworCitwaHlzX2FkZHJfdCBtZW1ibG9ja19hbGxvY19uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sIGludCBuaWQpOworcGh5c19hZGRyX3QgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZChwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbiwgaW50IG5pZCk7CisKK3BoeXNfYWRkcl90IG1lbWJsb2NrX2FsbG9jKHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduKTsKIAogLyogRmxhZ3MgZm9yIG1lbWJsb2NrX2FsbG9jX2Jhc2UoKSBhbWQgX19tZW1ibG9ja19hbGxvY19iYXNlKCkgKi8KICNkZWZpbmUgTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUJKH4ocGh5c19hZGRyX3QpMCkKICNkZWZpbmUgTUVNQkxPQ0tfQUxMT0NfQUNDRVNTSUJMRQkwCiAKLWV4dGVybiBwaHlzX2FkZHJfdCBtZW1ibG9ja19hbGxvY19iYXNlKHBoeXNfYWRkcl90IHNpemUsCi0JCQkJCSBwaHlzX2FkZHJfdCBhbGlnbiwKLQkJCQkJIHBoeXNfYWRkcl90IG1heF9hZGRyKTsKLWV4dGVybiBwaHlzX2FkZHJfdCBfX21lbWJsb2NrX2FsbG9jX2Jhc2UocGh5c19hZGRyX3Qgc2l6ZSwKLQkJCQkJICAgcGh5c19hZGRyX3QgYWxpZ24sCi0JCQkJCSAgIHBoeXNfYWRkcl90IG1heF9hZGRyKTsKLWV4dGVybiBwaHlzX2FkZHJfdCBtZW1ibG9ja19waHlzX21lbV9zaXplKHZvaWQpOwotZXh0ZXJuIHBoeXNfYWRkcl90IG1lbWJsb2NrX3N0YXJ0X29mX0RSQU0odm9pZCk7Ci1leHRlcm4gcGh5c19hZGRyX3QgbWVtYmxvY2tfZW5kX29mX0RSQU0odm9pZCk7Ci1leHRlcm4gdm9pZCBtZW1ibG9ja19lbmZvcmNlX21lbW9yeV9saW1pdChwaHlzX2FkZHJfdCBtZW1vcnlfbGltaXQpOwotZXh0ZXJuIGludCBtZW1ibG9ja19pc19tZW1vcnkocGh5c19hZGRyX3QgYWRkcik7Ci1leHRlcm4gaW50IG1lbWJsb2NrX2lzX3JlZ2lvbl9tZW1vcnkocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSk7Ci1leHRlcm4gaW50IG1lbWJsb2NrX2lzX3Jlc2VydmVkKHBoeXNfYWRkcl90IGFkZHIpOwotZXh0ZXJuIGludCBtZW1ibG9ja19pc19yZWdpb25fcmVzZXJ2ZWQocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSk7CitwaHlzX2FkZHJfdCBtZW1ibG9ja19hbGxvY19iYXNlKHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduLAorCQkJCXBoeXNfYWRkcl90IG1heF9hZGRyKTsKK3BoeXNfYWRkcl90IF9fbWVtYmxvY2tfYWxsb2NfYmFzZShwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbiwKKwkJCQkgIHBoeXNfYWRkcl90IG1heF9hZGRyKTsKK3BoeXNfYWRkcl90IG1lbWJsb2NrX3BoeXNfbWVtX3NpemUodm9pZCk7CitwaHlzX2FkZHJfdCBtZW1ibG9ja19zdGFydF9vZl9EUkFNKHZvaWQpOworcGh5c19hZGRyX3QgbWVtYmxvY2tfZW5kX29mX0RSQU0odm9pZCk7Cit2b2lkIG1lbWJsb2NrX2VuZm9yY2VfbWVtb3J5X2xpbWl0KHBoeXNfYWRkcl90IG1lbW9yeV9saW1pdCk7CitpbnQgbWVtYmxvY2tfaXNfbWVtb3J5KHBoeXNfYWRkcl90IGFkZHIpOworaW50IG1lbWJsb2NrX2lzX3JlZ2lvbl9tZW1vcnkocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSk7CitpbnQgbWVtYmxvY2tfaXNfcmVzZXJ2ZWQocGh5c19hZGRyX3QgYWRkcik7CitpbnQgbWVtYmxvY2tfaXNfcmVnaW9uX3Jlc2VydmVkKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUpOwogCi1leHRlcm4gdm9pZCBtZW1ibG9ja19kdW1wX2FsbCh2b2lkKTsKK2V4dGVybiB2b2lkIF9fbWVtYmxvY2tfZHVtcF9hbGwodm9pZCk7CiAKLS8qIFByb3ZpZGVkIGJ5IHRoZSBhcmNoaXRlY3R1cmUgKi8KLWV4dGVybiBwaHlzX2FkZHJfdCBtZW1ibG9ja19uaWRfcmFuZ2UocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCwgaW50ICpuaWQpOwotZXh0ZXJuIGludCBtZW1ibG9ja19tZW1vcnlfY2FuX2NvYWxlc2NlKHBoeXNfYWRkcl90IGFkZHIxLCBwaHlzX2FkZHJfdCBzaXplMSwKLQkJCQkgICBwaHlzX2FkZHJfdCBhZGRyMiwgcGh5c19hZGRyX3Qgc2l6ZTIpOworc3RhdGljIGlubGluZSB2b2lkIG1lbWJsb2NrX2R1bXBfYWxsKHZvaWQpCit7CisJaWYgKG1lbWJsb2NrX2RlYnVnKQorCQlfX21lbWJsb2NrX2R1bXBfYWxsKCk7Cit9CiAKIC8qKgogICogbWVtYmxvY2tfc2V0X2N1cnJlbnRfbGltaXQgLSBTZXQgdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiBsaW1pdCB0byBhbGxvdwpAQCAtMTAxLDcgKzE3OSw3IEBACiAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NpYmxlIGR1cmluZyBib290CiAgKiBAbGltaXQ6IE5ldyBsaW1pdCB2YWx1ZSAocGh5c2ljYWwgYWRkcmVzcykKICAqLwotZXh0ZXJuIHZvaWQgbWVtYmxvY2tfc2V0X2N1cnJlbnRfbGltaXQocGh5c19hZGRyX3QgbGltaXQpOwordm9pZCBtZW1ibG9ja19zZXRfY3VycmVudF9saW1pdChwaHlzX2FkZHJfdCBsaW1pdCk7CiAKIAogLyoKQEAgLTE1NCw5ICsyMzIsOSBAQAogCSAgICAgcmVnaW9uKyspCiAKIAotI2lmZGVmIEFSQ0hfRElTQ0FSRF9NRU1CTE9DSwotI2RlZmluZSBfX2luaXRfbWVtYmxvY2sgX19pbml0Ci0jZGVmaW5lIF9faW5pdGRhdGFfbWVtYmxvY2sgX19pbml0ZGF0YQorI2lmZGVmIENPTkZJR19BUkNIX0RJU0NBUkRfTUVNQkxPQ0sKKyNkZWZpbmUgX19pbml0X21lbWJsb2NrIF9fbWVtaW5pdAorI2RlZmluZSBfX2luaXRkYXRhX21lbWJsb2NrIF9fbWVtaW5pdGRhdGEKICNlbHNlCiAjZGVmaW5lIF9faW5pdF9tZW1ibG9jawogI2RlZmluZSBfX2luaXRkYXRhX21lbWJsb2NrCkBAIC0xNjUsNyArMjQzLDcgQEAKICNlbHNlCiBzdGF0aWMgaW5saW5lIHBoeXNfYWRkcl90IG1lbWJsb2NrX2FsbG9jKHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduKQogewotCXJldHVybiBNRU1CTE9DS19FUlJPUjsKKwlyZXR1cm4gMDsKIH0KIAogI2VuZGlmIC8qIENPTkZJR19IQVZFX01FTUJMT0NLICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbWNvbnRyb2wuaCBiL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCmluZGV4IGI4NzA2OGEuLjliMjk2ZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWVtY29udHJvbC5oCkBAIC04NSw2ICs4NSw5IEBACiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXBfZnJvbV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CiBleHRlcm4gc3RydWN0IG1lbV9jZ3JvdXAgKnRyeV9nZXRfbWVtX2Nncm91cF9mcm9tX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKIAorZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICpwYXJlbnRfbWVtX2Nncm91cChzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOworZXh0ZXJuIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2Zyb21fY29udChzdHJ1Y3QgY2dyb3VwICpjb250KTsKKwogc3RhdGljIGlubGluZQogaW50IG1tX21hdGNoX2Nncm91cChjb25zdCBzdHJ1Y3QgbW1fc3RydWN0ICptbSwgY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXAgKmNncm91cCkKIHsKQEAgLTM4MSw1ICszODQsMjUgQEAKIH0KICNlbmRpZgogCitlbnVtIHsKKwlVTkRFUl9MSU1JVCwKKwlTT0ZUX0xJTUlULAorCU9WRVJfTElNSVQsCit9OworCisjaWZkZWYgQ09ORklHX0lORVQKK3N0cnVjdCBzb2NrOworI2lmZGVmIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX0tNRU0KK3ZvaWQgc29ja191cGRhdGVfbWVtY2coc3RydWN0IHNvY2sgKnNrKTsKK3ZvaWQgc29ja19yZWxlYXNlX21lbWNnKHN0cnVjdCBzb2NrICpzayk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNvY2tfdXBkYXRlX21lbWNnKHN0cnVjdCBzb2NrICpzaykKK3sKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzb2NrX3JlbGVhc2VfbWVtY2coc3RydWN0IHNvY2sgKnNrKQoreworfQorI2VuZGlmIC8qIENPTkZJR19DR1JPVVBfTUVNX1JFU19DVExSX0tNRU0gKi8KKyNlbmRpZiAvKiBDT05GSUdfSU5FVCAqLwogI2VuZGlmIC8qIF9MSU5VWF9NRU1DT05UUk9MX0ggKi8KIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9taWkuaCBiL2luY2x1ZGUvbGludXgvbWlpLmgKaW5kZXggMjc3NDgyMy4uMjc4M2VjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9taWkuaAorKysgYi9pbmNsdWRlL2xpbnV4L21paS5oCkBAIC05LDYgKzksNyBAQAogI2RlZmluZSBfX0xJTlVYX01JSV9IX18KIAogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogCiAvKiBHZW5lcmljIE1JSSByZWdpc3RlcnMuICovCiAjZGVmaW5lIE1JSV9CTUNSCQkweDAwCS8qIEJhc2ljIG1vZGUgY29udHJvbCByZWdpc3RlciAqLwpAQCAtMjQwLDYgKzI0MSwyMDUgQEAKIH0KIAogLyoqCisgKiBldGh0b29sX2Fkdl90b19taWlfYWR2X3QKKyAqIEBldGhhZHY6IHRoZSBldGh0b29sIGFkdmVydGlzZW1lbnQgc2V0dGluZ3MKKyAqCisgKiBBIHNtYWxsIGhlbHBlciBmdW5jdGlvbiB0aGF0IHRyYW5zbGF0ZXMgZXRodG9vbCBhZHZlcnRpc2VtZW50CisgKiBzZXR0aW5ncyB0byBwaHkgYXV0b25lZ290aWF0aW9uIGFkdmVydGlzZW1lbnRzIGZvciB0aGUKKyAqIE1JSV9BRFZFUlRJU0UgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIGV0aHRvb2xfYWR2X3RvX21paV9hZHZfdCh1MzIgZXRoYWR2KQoreworCXUzMiByZXN1bHQgPSAwOworCisJaWYgKGV0aGFkdiAmIEFEVkVSVElTRURfMTBiYXNlVF9IYWxmKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFXzEwSEFMRjsKKwlpZiAoZXRoYWR2ICYgQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGwpCisJCXJlc3VsdCB8PSBBRFZFUlRJU0VfMTBGVUxMOworCWlmIChldGhhZHYgJiBBRFZFUlRJU0VEXzEwMGJhc2VUX0hhbGYpCisJCXJlc3VsdCB8PSBBRFZFUlRJU0VfMTAwSEFMRjsKKwlpZiAoZXRoYWR2ICYgQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxsKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFXzEwMEZVTEw7CisJaWYgKGV0aGFkdiAmIEFEVkVSVElTRURfUGF1c2UpCisJCXJlc3VsdCB8PSBBRFZFUlRJU0VfUEFVU0VfQ0FQOworCWlmIChldGhhZHYgJiBBRFZFUlRJU0VEX0FzeW1fUGF1c2UpCisJCXJlc3VsdCB8PSBBRFZFUlRJU0VfUEFVU0VfQVNZTTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogbWlpX2Fkdl90b19ldGh0b29sX2Fkdl90CisgKiBAYWR2OiB2YWx1ZSBvZiB0aGUgTUlJX0FEVkVSVElTRSByZWdpc3RlcgorICoKKyAqIEEgc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRoYXQgdHJhbnNsYXRlcyBNSUlfQURWRVJUSVNFIGJpdHMKKyAqIHRvIGV0aHRvb2wgYWR2ZXJ0aXNlbWVudCBzZXR0aW5ncy4KKyAqLworc3RhdGljIGlubGluZSB1MzIgbWlpX2Fkdl90b19ldGh0b29sX2Fkdl90KHUzMiBhZHYpCit7CisJdTMyIHJlc3VsdCA9IDA7CisKKwlpZiAoYWR2ICYgQURWRVJUSVNFXzEwSEFMRikKKwkJcmVzdWx0IHw9IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOworCWlmIChhZHYgJiBBRFZFUlRJU0VfMTBGVUxMKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGw7CisJaWYgKGFkdiAmIEFEVkVSVElTRV8xMDBIQUxGKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmOworCWlmIChhZHYgJiBBRFZFUlRJU0VfMTAwRlVMTCkKKwkJcmVzdWx0IHw9IEFEVkVSVElTRURfMTAwYmFzZVRfRnVsbDsKKwlpZiAoYWR2ICYgQURWRVJUSVNFX1BBVVNFX0NBUCkKKwkJcmVzdWx0IHw9IEFEVkVSVElTRURfUGF1c2U7CisJaWYgKGFkdiAmIEFEVkVSVElTRV9QQVVTRV9BU1lNKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFRF9Bc3ltX1BhdXNlOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBldGh0b29sX2Fkdl90b19taWlfY3RybDEwMDBfdAorICogQGV0aGFkdjogdGhlIGV0aHRvb2wgYWR2ZXJ0aXNlbWVudCBzZXR0aW5ncworICoKKyAqIEEgc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRoYXQgdHJhbnNsYXRlcyBldGh0b29sIGFkdmVydGlzZW1lbnQKKyAqIHNldHRpbmdzIHRvIHBoeSBhdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudHMgZm9yIHRoZQorICogTUlJX0NUUkwxMDAwIHJlZ2lzdGVyIHdoZW4gaW4gMTAwMFQgbW9kZS4KKyAqLworc3RhdGljIGlubGluZSB1MzIgZXRodG9vbF9hZHZfdG9fbWlpX2N0cmwxMDAwX3QodTMyIGV0aGFkdikKK3sKKwl1MzIgcmVzdWx0ID0gMDsKKworCWlmIChldGhhZHYgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFXzEwMDBIQUxGOworCWlmIChldGhhZHYgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9GdWxsKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFXzEwMDBGVUxMOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBtaWlfY3RybDEwMDBfdG9fZXRodG9vbF9hZHZfdAorICogQGFkdjogdmFsdWUgb2YgdGhlIE1JSV9DVFJMMTAwMCByZWdpc3RlcgorICoKKyAqIEEgc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRoYXQgdHJhbnNsYXRlcyBNSUlfQ1RSTDEwMDAKKyAqIGJpdHMsIHdoZW4gaW4gMTAwMEJhc2UtVCBtb2RlLCB0byBldGh0b29sCisgKiBhZHZlcnRpc2VtZW50IHNldHRpbmdzLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBtaWlfY3RybDEwMDBfdG9fZXRodG9vbF9hZHZfdCh1MzIgYWR2KQoreworCXUzMiByZXN1bHQgPSAwOworCisJaWYgKGFkdiAmIEFEVkVSVElTRV8xMDAwSEFMRikKKwkJcmVzdWx0IHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGY7CisJaWYgKGFkdiAmIEFEVkVSVElTRV8xMDAwRlVMTCkKKwkJcmVzdWx0IHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIG1paV9scGFfdG9fZXRodG9vbF9scGFfdAorICogQGFkdjogdmFsdWUgb2YgdGhlIE1JSV9MUEEgcmVnaXN0ZXIKKyAqCisgKiBBIHNtYWxsIGhlbHBlciBmdW5jdGlvbiB0aGF0IHRyYW5zbGF0ZXMgTUlJX0xQQQorICogYml0cywgd2hlbiBpbiAxMDAwQmFzZS1UIG1vZGUsIHRvIGV0aHRvb2wKKyAqIExQIGFkdmVydGlzZW1lbnQgc2V0dGluZ3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1paV9scGFfdG9fZXRodG9vbF9scGFfdCh1MzIgbHBhKQoreworCXUzMiByZXN1bHQgPSAwOworCisJaWYgKGxwYSAmIExQQV9MUEFDSykKKwkJcmVzdWx0IHw9IEFEVkVSVElTRURfQXV0b25lZzsKKworCXJldHVybiByZXN1bHQgfCBtaWlfYWR2X3RvX2V0aHRvb2xfYWR2X3QobHBhKTsKK30KKworLyoqCisgKiBtaWlfc3RhdDEwMDBfdG9fZXRodG9vbF9scGFfdAorICogQGFkdjogdmFsdWUgb2YgdGhlIE1JSV9TVEFUMTAwMCByZWdpc3RlcgorICoKKyAqIEEgc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRoYXQgdHJhbnNsYXRlcyBNSUlfU1RBVDEwMDAKKyAqIGJpdHMsIHdoZW4gaW4gMTAwMEJhc2UtVCBtb2RlLCB0byBldGh0b29sCisgKiBhZHZlcnRpc2VtZW50IHNldHRpbmdzLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBtaWlfc3RhdDEwMDBfdG9fZXRodG9vbF9scGFfdCh1MzIgbHBhKQoreworCXUzMiByZXN1bHQgPSAwOworCisJaWYgKGxwYSAmIExQQV8xMDAwSEFMRikKKwkJcmVzdWx0IHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0hhbGY7CisJaWYgKGxwYSAmIExQQV8xMDAwRlVMTCkKKwkJcmVzdWx0IHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIGV0aHRvb2xfYWR2X3RvX21paV9hZHZfeAorICogQGV0aGFkdjogdGhlIGV0aHRvb2wgYWR2ZXJ0aXNlbWVudCBzZXR0aW5ncworICoKKyAqIEEgc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRoYXQgdHJhbnNsYXRlcyBldGh0b29sIGFkdmVydGlzZW1lbnQKKyAqIHNldHRpbmdzIHRvIHBoeSBhdXRvbmVnb3RpYXRpb24gYWR2ZXJ0aXNlbWVudHMgZm9yIHRoZQorICogTUlJX0NUUkwxMDAwIHJlZ2lzdGVyIHdoZW4gaW4gMTAwMEJhc2UtWCBtb2RlLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBldGh0b29sX2Fkdl90b19taWlfYWR2X3godTMyIGV0aGFkdikKK3sKKwl1MzIgcmVzdWx0ID0gMDsKKworCWlmIChldGhhZHYgJiBBRFZFUlRJU0VEXzEwMDBiYXNlVF9IYWxmKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFXzEwMDBYSEFMRjsKKwlpZiAoZXRoYWR2ICYgQURWRVJUSVNFRF8xMDAwYmFzZVRfRnVsbCkKKwkJcmVzdWx0IHw9IEFEVkVSVElTRV8xMDAwWEZVTEw7CisJaWYgKGV0aGFkdiAmIEFEVkVSVElTRURfUGF1c2UpCisJCXJlc3VsdCB8PSBBRFZFUlRJU0VfMTAwMFhQQVVTRTsKKwlpZiAoZXRoYWR2ICYgQURWRVJUSVNFRF9Bc3ltX1BhdXNlKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFXzEwMDBYUFNFX0FTWU07CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIG1paV9hZHZfdG9fZXRodG9vbF9hZHZfeAorICogQGFkdjogdmFsdWUgb2YgdGhlIE1JSV9DVFJMMTAwMCByZWdpc3RlcgorICoKKyAqIEEgc21hbGwgaGVscGVyIGZ1bmN0aW9uIHRoYXQgdHJhbnNsYXRlcyBNSUlfQ1RSTDEwMDAKKyAqIGJpdHMsIHdoZW4gaW4gMTAwMEJhc2UtWCBtb2RlLCB0byBldGh0b29sCisgKiBhZHZlcnRpc2VtZW50IHNldHRpbmdzLgorICovCitzdGF0aWMgaW5saW5lIHUzMiBtaWlfYWR2X3RvX2V0aHRvb2xfYWR2X3godTMyIGFkdikKK3sKKwl1MzIgcmVzdWx0ID0gMDsKKworCWlmIChhZHYgJiBBRFZFUlRJU0VfMTAwMFhIQUxGKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFRF8xMDAwYmFzZVRfSGFsZjsKKwlpZiAoYWR2ICYgQURWRVJUSVNFXzEwMDBYRlVMTCkKKwkJcmVzdWx0IHw9IEFEVkVSVElTRURfMTAwMGJhc2VUX0Z1bGw7CisJaWYgKGFkdiAmIEFEVkVSVElTRV8xMDAwWFBBVVNFKQorCQlyZXN1bHQgfD0gQURWRVJUSVNFRF9QYXVzZTsKKwlpZiAoYWR2ICYgQURWRVJUSVNFXzEwMDBYUFNFX0FTWU0pCisJCXJlc3VsdCB8PSBBRFZFUlRJU0VEX0FzeW1fUGF1c2U7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKioKKyAqIG1paV9scGFfdG9fZXRodG9vbF9scGFfeAorICogQGFkdjogdmFsdWUgb2YgdGhlIE1JSV9MUEEgcmVnaXN0ZXIKKyAqCisgKiBBIHNtYWxsIGhlbHBlciBmdW5jdGlvbiB0aGF0IHRyYW5zbGF0ZXMgTUlJX0xQQQorICogYml0cywgd2hlbiBpbiAxMDAwQmFzZS1YIG1vZGUsIHRvIGV0aHRvb2wKKyAqIExQIGFkdmVydGlzZW1lbnQgc2V0dGluZ3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdTMyIG1paV9scGFfdG9fZXRodG9vbF9scGFfeCh1MzIgbHBhKQoreworCXUzMiByZXN1bHQgPSAwOworCisJaWYgKGxwYSAmIExQQV9MUEFDSykKKwkJcmVzdWx0IHw9IEFEVkVSVElTRURfQXV0b25lZzsKKworCXJldHVybiByZXN1bHQgfCBtaWlfYWR2X3RvX2V0aHRvb2xfYWR2X3gobHBhKTsKK30KKworLyoqCiAgKiBtaWlfYWR2ZXJ0aXNlX2Zsb3djdHJsIC0gZ2V0IGZsb3cgY29udHJvbCBhZHZlcnRpc2VtZW50IGZsYWdzCiAgKiBAY2FwOiBGbG93IGNvbnRyb2wgY2FwYWJpbGl0aWVzIChGTE9XX0NUUkxfUlgsIEZMT1dfQ1RSTF9UWCBvciBib3RoKQogICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDQvY21kLmggYi9pbmNsdWRlL2xpbnV4L21seDQvY21kLmgKaW5kZXggYjU2ZTQ1OC4uOTk1OGZmMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L2NtZC5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NC9jbWQuaApAQCAtNTksMTIgKzU5LDE1IEBACiAJTUxYNF9DTURfSFdfSEVBTFRIX0NIRUNLID0gMHg1MCwKIAlNTFg0X0NNRF9TRVRfUE9SVAkgPSAweGMsCiAJTUxYNF9DTURfU0VUX05PREUJID0gMHg1YSwKKwlNTFg0X0NNRF9RVUVSWV9GVU5DCSA9IDB4NTYsCiAJTUxYNF9DTURfQUNDRVNTX0REUgkgPSAweDJlLAogCU1MWDRfQ01EX01BUF9JQ00JID0gMHhmZmEsCiAJTUxYNF9DTURfVU5NQVBfSUNNCSA9IDB4ZmY5LAogCU1MWDRfQ01EX01BUF9JQ01fQVVYCSA9IDB4ZmZjLAogCU1MWDRfQ01EX1VOTUFQX0lDTV9BVVgJID0gMHhmZmIsCiAJTUxYNF9DTURfU0VUX0lDTV9TSVpFCSA9IDB4ZmZkLAorCS8qbWFzdGVyIG5vdGlmeSBmdyBvbiBmaW5pc2ggZm9yIHNsYXZlJ3MgZmxyKi8KKwlNTFg0X0NNRF9JTkZPUk1fRkxSX0RPTkUgPSAweDViLAogCiAJLyogVFBUIGNvbW1hbmRzICovCiAJTUxYNF9DTURfU1cySFdfTVBUCSA9IDB4ZCwKQEAgLTExOSw2ICsxMjIsMjYgQEAKIAkvKiBtaXNjZWxsYW5lb3VzIGNvbW1hbmRzICovCiAJTUxYNF9DTURfRElBR19SUFJUCSA9IDB4MzAsCiAJTUxYNF9DTURfTk9QCQkgPSAweDMxLAorCU1MWDRfQ01EX0FDQ0VTU19NRU0JID0gMHgyZSwKKwlNTFg0X0NNRF9TRVRfVkVQCSA9IDB4NTIsCisKKwkvKiBFdGhlcm5ldCBzcGVjaWZpYyBjb21tYW5kcyAqLworCU1MWDRfQ01EX1NFVF9WTEFOX0ZMVFIJID0gMHg0NywKKwlNTFg0X0NNRF9TRVRfTUNBU1RfRkxUUgkgPSAweDQ4LAorCU1MWDRfQ01EX0RVTVBfRVRIX1NUQVRTCSA9IDB4NDksCisKKwkvKiBDb21tdW5pY2F0aW9uIGNoYW5uZWwgY29tbWFuZHMgKi8KKwlNTFg0X0NNRF9BUk1fQ09NTV9DSEFOTkVMID0gMHg1NywKKwlNTFg0X0NNRF9HRU5fRVFFCSA9IDB4NTgsCisKKwkvKiB2aXJ0dWFsIGNvbW1hbmRzICovCisJTUxYNF9DTURfQUxMT0NfUkVTCSA9IDB4ZjAwLAorCU1MWDRfQ01EX0ZSRUVfUkVTCSA9IDB4ZjAxLAorCU1MWDRfQ01EX01DQVNUX0FUVEFDSAkgPSAweGYwNSwKKwlNTFg0X0NNRF9VQ0FTVF9BVFRBQ0gJID0gMHhmMDYsCisJTUxYNF9DTURfUFJPTUlTQyAgICAgICAgID0gMHhmMDgsCisJTUxYNF9DTURfUVVFUllfRlVOQ19DQVAgID0gMHhmMGEsCisJTUxYNF9DTURfUVBfQVRUQUNICSA9IDB4ZjBiLAogCiAJLyogZGVidWcgY29tbWFuZHMgKi8KIAlNTFg0X0NNRF9RVUVSWV9ERUJVR19NU0cgPSAweDJhLApAQCAtMTI2LDYgKzE0OSw3IEBACiAKIAkvKiBzdGF0aXN0aWNzIGNvbW1hbmRzICovCiAJTUxYNF9DTURfUVVFUllfSUZfU1RBVAkgPSAwWDU0LAorCU1MWDRfQ01EX1NFVF9JRl9TVEFUCSA9IDBYNTUsCiB9OwogCiBlbnVtIHsKQEAgLTEzNSw3ICsxNTksOCBAQAogfTsKIAogZW51bSB7Ci0JTUxYNF9NQUlMQk9YX1NJWkUJPSAgNDA5NgorCU1MWDRfTUFJTEJPWF9TSVpFCT0gNDA5NiwKKwlNTFg0X0FDQ0VTU19NRU1fQUxJR04JPSAyNTYsCiB9OwogCiBlbnVtIHsKQEAgLTE0OCw2ICsxNzMsMTEgQEAKIAlNTFg0X1NFVF9QT1JUX0dJRF9UQUJMRSA9IDB4NSwKIH07CiAKK2VudW0geworCU1MWDRfQ01EX1dSQVBQRUQsCisJTUxYNF9DTURfTkFUSVZFCit9OworCiBzdHJ1Y3QgbWx4NF9kZXY7CiAKIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94IHsKQEAgLTE1NywyMyArMTg3LDI0IEBACiAKIGludCBfX21seDRfY21kKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1NjQgaW5fcGFyYW0sIHU2NCAqb3V0X3BhcmFtLAogCSAgICAgICBpbnQgb3V0X2lzX2ltbSwgdTMyIGluX21vZGlmaWVyLCB1OCBvcF9tb2RpZmllciwKLQkgICAgICAgdTE2IG9wLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpOworCSAgICAgICB1MTYgb3AsIHVuc2lnbmVkIGxvbmcgdGltZW91dCwgaW50IG5hdGl2ZSk7CiAKIC8qIEludm9rZSBhIGNvbW1hbmQgd2l0aCBubyBvdXRwdXQgcGFyYW1ldGVyICovCiBzdGF0aWMgaW5saW5lIGludCBtbHg0X2NtZChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTY0IGluX3BhcmFtLCB1MzIgaW5fbW9kaWZpZXIsCi0JCQkgICB1OCBvcF9tb2RpZmllciwgdTE2IG9wLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCisJCQkgICB1OCBvcF9tb2RpZmllciwgdTE2IG9wLCB1bnNpZ25lZCBsb25nIHRpbWVvdXQsCisJCQkgICBpbnQgbmF0aXZlKQogewogCXJldHVybiBfX21seDRfY21kKGRldiwgaW5fcGFyYW0sIE5VTEwsIDAsIGluX21vZGlmaWVyLAotCQkJICBvcF9tb2RpZmllciwgb3AsIHRpbWVvdXQpOworCQkJICBvcF9tb2RpZmllciwgb3AsIHRpbWVvdXQsIG5hdGl2ZSk7CiB9CiAKIC8qIEludm9rZSBhIGNvbW1hbmQgd2l0aCBhbiBvdXRwdXQgbWFpbGJveCAqLwogc3RhdGljIGlubGluZSBpbnQgbWx4NF9jbWRfYm94KHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1NjQgaW5fcGFyYW0sIHU2NCBvdXRfcGFyYW0sCiAJCQkgICAgICAgdTMyIGluX21vZGlmaWVyLCB1OCBvcF9tb2RpZmllciwgdTE2IG9wLAotCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIHRpbWVvdXQsIGludCBuYXRpdmUpCiB7CiAJcmV0dXJuIF9fbWx4NF9jbWQoZGV2LCBpbl9wYXJhbSwgJm91dF9wYXJhbSwgMCwgaW5fbW9kaWZpZXIsCi0JCQkgIG9wX21vZGlmaWVyLCBvcCwgdGltZW91dCk7CisJCQkgIG9wX21vZGlmaWVyLCBvcCwgdGltZW91dCwgbmF0aXZlKTsKIH0KIAogLyoKQEAgLTE4MywxMyArMjE0LDE3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG1seDRfY21kX2ltbShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTY0IGluX3BhcmFtLCB1NjQgKm91dF9wYXJhbSwKIAkJCSAgICAgICB1MzIgaW5fbW9kaWZpZXIsIHU4IG9wX21vZGlmaWVyLCB1MTYgb3AsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQorCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgdGltZW91dCwgaW50IG5hdGl2ZSkKIHsKIAlyZXR1cm4gX19tbHg0X2NtZChkZXYsIGluX3BhcmFtLCBvdXRfcGFyYW0sIDEsIGluX21vZGlmaWVyLAotCQkJICBvcF9tb2RpZmllciwgb3AsIHRpbWVvdXQpOworCQkJICBvcF9tb2RpZmllciwgb3AsIHRpbWVvdXQsIG5hdGl2ZSk7CiB9CiAKIHN0cnVjdCBtbHg0X2NtZF9tYWlsYm94ICptbHg0X2FsbG9jX2NtZF9tYWlsYm94KHN0cnVjdCBtbHg0X2RldiAqZGV2KTsKIHZvaWQgbWx4NF9mcmVlX2NtZF9tYWlsYm94KHN0cnVjdCBtbHg0X2RldiAqZGV2LCBzdHJ1Y3QgbWx4NF9jbWRfbWFpbGJveCAqbWFpbGJveCk7CiAKK3UzMiBtbHg0X2NvbW1fZ2V0X3ZlcnNpb24odm9pZCk7CisKKyNkZWZpbmUgTUxYNF9DT01NX0dFVF9JRl9SRVYoY21kX2NoYW5fdmVyKSAodTgpKChjbWRfY2hhbl92ZXIpID4+IDgpCisKICNlbmRpZiAvKiBNTFg0X0NNRF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L21seDQvZGV2aWNlLmgKaW5kZXggODRiMGIxOC4uNWM0ZmU4ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbHg0L2RldmljZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbWx4NC9kZXZpY2UuaApAQCAtNDcsNiArNDcsOSBAQAogZW51bSB7CiAJTUxYNF9GTEFHX01TSV9YCQk9IDEgPDwgMCwKIAlNTFg0X0ZMQUdfT0xEX1BPUlRfQ01EUwk9IDEgPDwgMSwKKwlNTFg0X0ZMQUdfTUFTVEVSCT0gMSA8PCAyLAorCU1MWDRfRkxBR19TTEFWRQkJPSAxIDw8IDMsCisJTUxYNF9GTEFHX1NSSU9WCQk9IDEgPDwgNCwKIH07CiAKIGVudW0gewpAQCAtNTgsNiArNjEsMTUgQEAKIH07CiAKIGVudW0geworCU1MWDRfTUFYX05VTV9QRgkJPSAxNiwKKwlNTFg0X01BWF9OVU1fVkYJCT0gNjQsCisJTUxYNF9NRlVOQ19NQVgJCT0gODAsCisJTUxYNF9NRlVOQ19FUV9OVU0JPSA0LAorCU1MWDRfTUZVTkNfTUFYX0VRRVMgICAgID0gOCwKKwlNTFg0X01GVU5DX0VRRV9NQVNLICAgICA9IChNTFg0X01GVU5DX01BWF9FUUVTIC0gMSkKK307CisKK2VudW0gewogCU1MWDRfREVWX0NBUF9GTEFHX1JDCQk9IDFMTCA8PCAgMCwKIAlNTFg0X0RFVl9DQVBfRkxBR19VQwkJPSAxTEwgPDwgIDEsCiAJTUxYNF9ERVZfQ0FQX0ZMQUdfVUQJCT0gMUxMIDw8ICAyLApAQCAtNzcsMTEgKzg5LDEzIEBACiAJTUxYNF9ERVZfQ0FQX0ZMQUdfSUJPRQkJPSAxTEwgPDwgMzAsCiAJTUxYNF9ERVZfQ0FQX0ZMQUdfVUNfTE9PUEJBQ0sJPSAxTEwgPDwgMzIsCiAJTUxYNF9ERVZfQ0FQX0ZMQUdfRkNTX0tFRVAJPSAxTEwgPDwgMzQsCi0JTUxYNF9ERVZfQ0FQX0ZMQUdfV09MCQk9IDFMTCA8PCAzOCwKKwlNTFg0X0RFVl9DQVBfRkxBR19XT0xfUE9SVDEJPSAxTEwgPDwgMzcsCisJTUxYNF9ERVZfQ0FQX0ZMQUdfV09MX1BPUlQyCT0gMUxMIDw8IDM4LAogCU1MWDRfREVWX0NBUF9GTEFHX1VEUF9SU1MJPSAxTEwgPDwgNDAsCiAJTUxYNF9ERVZfQ0FQX0ZMQUdfVkVQX1VDX1NURUVSCT0gMUxMIDw8IDQxLAogCU1MWDRfREVWX0NBUF9GTEFHX1ZFUF9NQ19TVEVFUgk9IDFMTCA8PCA0MiwKLQlNTFg0X0RFVl9DQVBfRkxBR19DT1VOVEVSUwk9IDFMTCA8PCA0OAorCU1MWDRfREVWX0NBUF9GTEFHX0NPVU5URVJTCT0gMUxMIDw8IDQ4LAorCU1MWDRfREVWX0NBUF9GTEFHX1NFTlNFX1NVUFBPUlQJPSAxTEwgPDwgNTUKIH07CiAKICNkZWZpbmUgTUxYNF9BVFRSX0VYVEVOREVEX1BPUlRfSU5GTwljcHVfdG9fYmUxNigweGZmOTApCkBAIC0xMTYsNyArMTMwLDExIEBACiAJTUxYNF9FVkVOVF9UWVBFX1BPUlRfQ0hBTkdFCSAgID0gMHgwOSwKIAlNTFg0X0VWRU5UX1RZUEVfRVFfT1ZFUkZMT1cJICAgPSAweDBmLAogCU1MWDRfRVZFTlRfVFlQRV9FQ0NfREVURUNUCSAgID0gMHgwZSwKLQlNTFg0X0VWRU5UX1RZUEVfQ01ECQkgICA9IDB4MGEKKwlNTFg0X0VWRU5UX1RZUEVfQ01ECQkgICA9IDB4MGEsCisJTUxYNF9FVkVOVF9UWVBFX1ZFUF9VUERBVEUJICAgPSAweDE5LAorCU1MWDRfRVZFTlRfVFlQRV9DT01NX0NIQU5ORUwJICAgPSAweDE4LAorCU1MWDRfRVZFTlRfVFlQRV9GTFJfRVZFTlQJICAgPSAweDFjLAorCU1MWDRfRVZFTlRfVFlQRV9OT05FCQkgICA9IDB4ZmYsCiB9OwogCiBlbnVtIHsKQEAgLTE4Myw2ICsyMDEsNyBAQAogfTsKIAogZW51bSBtbHg0X3BvcnRfdHlwZSB7CisJTUxYNF9QT1JUX1RZUEVfTk9ORQk9IDAsCiAJTUxYNF9QT1JUX1RZUEVfSUIJPSAxLAogCU1MWDRfUE9SVF9UWVBFX0VUSAk9IDIsCiAJTUxYNF9QT1JUX1RZUEVfQVVUTwk9IDMKQEAgLTIxNSw2ICsyMzQsNyBAQAogCiBzdHJ1Y3QgbWx4NF9jYXBzIHsKIAl1NjQJCQlmd192ZXI7CisJdTMyCQkJZnVuY3Rpb247CiAJaW50CQkJbnVtX3BvcnRzOwogCWludAkJCXZsX2NhcFtNTFg0X01BWF9QT1JUUyArIDFdOwogCWludAkJCWliX210dV9jYXBbTUxYNF9NQVhfUE9SVFMgKyAxXTsKQEAgLTIyOSw2ICsyNDksNyBAQAogCXU2NAkJCXRyYW5zX2NvZGVbTUxYNF9NQVhfUE9SVFMgKyAxXTsKIAlpbnQJCQlsb2NhbF9jYV9hY2tfZGVsYXk7CiAJaW50CQkJbnVtX3VhcnM7CisJdTMyCQkJdWFyX3BhZ2Vfc2l6ZTsKIAlpbnQJCQliZl9yZWdfc2l6ZTsKIAlpbnQJCQliZl9yZWdzX3Blcl9wYWdlOwogCWludAkJCW1heF9zcV9zZzsKQEAgLTI1Miw4ICsyNzMsNyBAQAogCWludAkJCW51bV9jb21wX3ZlY3RvcnM7CiAJaW50CQkJY29tcF9wb29sOwogCWludAkJCW51bV9tcHRzOwotCWludAkJCW51bV9tdHRfc2VnczsKLQlpbnQJCQltdHRzX3Blcl9zZWc7CisJaW50CQkJbnVtX210dHM7CiAJaW50CQkJZm1yX3Jlc2VydmVkX210dHM7CiAJaW50CQkJcmVzZXJ2ZWRfbXR0czsKIAlpbnQJCQlyZXNlcnZlZF9tcndzOwpAQCAtMjgzLDcgKzMwMyw5IEBACiAJaW50ICAgICAgICAgICAgICAgICAgICAgbG9nX251bV9wcmlvczsKIAllbnVtIG1seDRfcG9ydF90eXBlCXBvcnRfdHlwZVtNTFg0X01BWF9QT1JUUyArIDFdOwogCXU4CQkJc3VwcG9ydGVkX3R5cGVbTUxYNF9NQVhfUE9SVFMgKyAxXTsKLQl1MzIJCQlwb3J0X21hc2s7CisJdTggICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkX3R5cGVbTUxYNF9NQVhfUE9SVFMgKyAxXTsKKwl1OCAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X3NlbnNlW01MWDRfTUFYX1BPUlRTICsgMV07CisJdTMyCQkJcG9ydF9tYXNrW01MWDRfTUFYX1BPUlRTICsgMV07CiAJZW51bSBtbHg0X3BvcnRfdHlwZQlwb3NzaWJsZV90eXBlW01MWDRfTUFYX1BPUlRTICsgMV07CiAJdTMyCQkJbWF4X2NvdW50ZXJzOwogCXU4CQkJZXh0X3BvcnRfY2FwW01MWDRfTUFYX1BPUlRTICsgMV07CkBAIC0zMDMsNyArMzI1LDcgQEAKIH07CiAKIHN0cnVjdCBtbHg0X210dCB7Ci0JdTMyCQkJZmlyc3Rfc2VnOworCXUzMgkJCW9mZnNldDsKIAlpbnQJCQlvcmRlcjsKIAlpbnQJCQlwYWdlX3NoaWZ0OwogfTsKQEAgLTQ2NSwxMCArNDg3LDEyIEBACiBzdHJ1Y3QgbWx4NF9kZXYgewogCXN0cnVjdCBwY2lfZGV2CSAgICAgICAqcGRldjsKIAl1bnNpZ25lZCBsb25nCQlmbGFnczsKKwl1bnNpZ25lZCBsb25nCQludW1fc2xhdmVzOwogCXN0cnVjdCBtbHg0X2NhcHMJY2FwczsKIAlzdHJ1Y3QgcmFkaXhfdHJlZV9yb290CXFwX3RhYmxlX3RyZWU7CiAJdTgJCQlyZXZfaWQ7CiAJY2hhcgkJCWJvYXJkX2lkW01MWDRfQk9BUkRfSURfTEVOXTsKKwlpbnQJCQludW1fdmZzOwogfTsKIAogc3RydWN0IG1seDRfaW5pdF9wb3J0X3BhcmFtIHsKQEAgLTQ4NywxNCArNTExLDMyIEBACiAKICNkZWZpbmUgbWx4NF9mb3JlYWNoX3BvcnQocG9ydCwgZGV2LCB0eXBlKQkJCQlcCiAJZm9yICgocG9ydCkgPSAxOyAocG9ydCkgPD0gKGRldiktPmNhcHMubnVtX3BvcnRzOyAocG9ydCkrKykJXAotCQlpZiAoKCh0eXBlKSA9PSBNTFg0X1BPUlRfVFlQRV9JQiA/IChkZXYpLT5jYXBzLnBvcnRfbWFzayA6IFwKLQkJICAgICB+KGRldiktPmNhcHMucG9ydF9tYXNrKSAmIDEgPDwgKChwb3J0KSAtIDEpKQorCQlpZiAoKHR5cGUpID09IChkZXYpLT5jYXBzLnBvcnRfbWFza1socG9ydCldKQogCi0jZGVmaW5lIG1seDRfZm9yZWFjaF9pYl90cmFuc3BvcnRfcG9ydChwb3J0LCBkZXYpCQkJXAotCWZvciAoKHBvcnQpID0gMTsgKHBvcnQpIDw9IChkZXYpLT5jYXBzLm51bV9wb3J0czsgKHBvcnQpKyspCVwKLQkJaWYgKCgoZGV2KS0+Y2Fwcy5wb3J0X21hc2sgJiAxIDw8ICgocG9ydCkgLSAxKSkgfHwJXAotCQkgICAgKChkZXYpLT5jYXBzLmZsYWdzICYgTUxYNF9ERVZfQ0FQX0ZMQUdfSUJPRSkpCisjZGVmaW5lIG1seDRfZm9yZWFjaF9pYl90cmFuc3BvcnRfcG9ydChwb3J0LCBkZXYpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwlmb3IgKChwb3J0KSA9IDE7IChwb3J0KSA8PSAoZGV2KS0+Y2Fwcy5udW1fcG9ydHM7IChwb3J0KSsrKQkgIFwKKwkJaWYgKCgoZGV2KS0+Y2Fwcy5wb3J0X21hc2tbcG9ydF0gPT0gTUxYNF9QT1JUX1RZUEVfSUIpIHx8IFwKKwkJCSgoZGV2KS0+Y2Fwcy5mbGFncyAmIE1MWDRfREVWX0NBUF9GTEFHX0lCT0UpKQogCitzdGF0aWMgaW5saW5lIGludCBtbHg0X2lzX21hc3RlcihzdHJ1Y3QgbWx4NF9kZXYgKmRldikKK3sKKwlyZXR1cm4gZGV2LT5mbGFncyAmIE1MWDRfRkxBR19NQVNURVI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1seDRfaXNfcXBfcmVzZXJ2ZWQoc3RydWN0IG1seDRfZGV2ICpkZXYsIHUzMiBxcG4pCit7CisJcmV0dXJuIChxcG4gPCBkZXYtPmNhcHMuc3FwX3N0YXJ0ICsgOCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1seDRfaXNfbWZ1bmMoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJcmV0dXJuIGRldi0+ZmxhZ3MgJiAoTUxYNF9GTEFHX1NMQVZFIHwgTUxYNF9GTEFHX01BU1RFUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG1seDRfaXNfc2xhdmUoc3RydWN0IG1seDRfZGV2ICpkZXYpCit7CisJcmV0dXJuIGRldi0+ZmxhZ3MgJiBNTFg0X0ZMQUdfU0xBVkU7Cit9CiAKIGludCBtbHg0X2J1Zl9hbGxvYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgaW50IHNpemUsIGludCBtYXhfZGlyZWN0LAogCQkgICBzdHJ1Y3QgbWx4NF9idWYgKmJ1Zik7CkBAIC01NjAsNiArNjAyLDEwIEBACiBpbnQgbWx4NF9JTklUX1BPUlQoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0KTsKIGludCBtbHg0X0NMT1NFX1BPUlQoc3RydWN0IG1seDRfZGV2ICpkZXYsIGludCBwb3J0KTsKIAoraW50IG1seDRfdW5pY2FzdF9hdHRhY2goc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3FwICpxcCwgdTggZ2lkWzE2XSwKKwkJCWludCBibG9ja19tY2FzdF9sb29wYmFjaywgZW51bSBtbHg0X3Byb3RvY29sIHByb3QpOworaW50IG1seDRfdW5pY2FzdF9kZXRhY2goc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3FwICpxcCwgdTggZ2lkWzE2XSwKKwkJCWVudW0gbWx4NF9wcm90b2NvbCBwcm90KTsKIGludCBtbHg0X211bHRpY2FzdF9hdHRhY2goc3RydWN0IG1seDRfZGV2ICpkZXYsIHN0cnVjdCBtbHg0X3FwICpxcCwgdTggZ2lkWzE2XSwKIAkJCSAgaW50IGJsb2NrX21jYXN0X2xvb3BiYWNrLCBlbnVtIG1seDRfcHJvdG9jb2wgcHJvdG9jb2wpOwogaW50IG1seDRfbXVsdGljYXN0X2RldGFjaChzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgc3RydWN0IG1seDRfcXAgKnFwLCB1OCBnaWRbMTZdLApAQCAtNTcwLDkgKzYxNiwxMSBAQAogaW50IG1seDRfdW5pY2FzdF9wcm9taXNjX3JlbW92ZShzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTMyIHFwbiwgdTggcG9ydCk7CiBpbnQgbWx4NF9TRVRfTUNBU1RfRkxUUihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTY0IG1hYywgdTY0IGNsZWFyLCB1OCBtb2RlKTsKIAotaW50IG1seDRfcmVnaXN0ZXJfbWFjKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1NjQgbWFjLCBpbnQgKnFwbiwgdTggd3JhcCk7Ci12b2lkIG1seDRfdW5yZWdpc3Rlcl9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBxcG4pOwotaW50IG1seDRfcmVwbGFjZV9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBxcG4sIHU2NCBuZXdfbWFjLCB1OCB3cmFwKTsKK2ludCBtbHg0X3JlZ2lzdGVyX21hYyhzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTY0IG1hYyk7Cit2b2lkIG1seDRfdW5yZWdpc3Rlcl9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU2NCBtYWMpOworaW50IG1seDRfcmVwbGFjZV9tYWMoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIGludCBxcG4sIHU2NCBuZXdfbWFjKTsKK2ludCBtbHg0X2dldF9ldGhfcXAoc3RydWN0IG1seDRfZGV2ICpkZXYsIHU4IHBvcnQsIHU2NCBtYWMsIGludCAqcXBuKTsKK3ZvaWQgbWx4NF9wdXRfZXRoX3FwKHN0cnVjdCBtbHg0X2RldiAqZGV2LCB1OCBwb3J0LCB1NjQgbWFjLCBpbnQgcXBuKTsKIAogaW50IG1seDRfZmluZF9jYWNoZWRfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTE2IHZpZCwgaW50ICppZHgpOwogaW50IG1seDRfcmVnaXN0ZXJfdmxhbihzdHJ1Y3QgbWx4NF9kZXYgKmRldiwgdTggcG9ydCwgdTE2IHZsYW4sIGludCAqaW5kZXgpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbHg0L3FwLmggYi9pbmNsdWRlL2xpbnV4L21seDQvcXAuaAppbmRleCA0OGNjNGNiLi5iZWU4ZmEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21seDQvcXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L21seDQvcXAuaApAQCAtOTcsNiArOTcsMzMgQEAKIAlNTFg0X1FQX0JJVF9SSUMJCQkJPSAxIDw8CTQsCiB9OwogCitlbnVtIHsKKwlNTFg0X1JTU19IQVNIX1hPUgkJCT0gMCwKKwlNTFg0X1JTU19IQVNIX1RPUAkJCT0gMSwKKworCU1MWDRfUlNTX1VEUF9JUFY2CQkJPSAxIDw8IDAsCisJTUxYNF9SU1NfVURQX0lQVjQJCQk9IDEgPDwgMSwKKwlNTFg0X1JTU19UQ1BfSVBWNgkJCT0gMSA8PCAyLAorCU1MWDRfUlNTX0lQVjYJCQkJPSAxIDw8IDMsCisJTUxYNF9SU1NfVENQX0lQVjQJCQk9IDEgPDwgNCwKKwlNTFg0X1JTU19JUFY0CQkJCT0gMSA8PCA1LAorCisJLyogb2Zmc2V0IG9mIG1seDRfcnNzX2NvbnRleHQgd2l0aGluIG1seDRfcXBfY29udGV4dC5wcmlfcGF0aCAqLworCU1MWDRfUlNTX09GRlNFVF9JTl9RUENfUFJJX1BBVEgJCT0gMHgyNCwKKwkvKiBvZmZzZXQgb2YgYmVpbmcgUlNTIGluZGlyZWN0aW9uIFFQIHdpdGhpbiBtbHg0X3FwX2NvbnRleHQuZmxhZ3MgKi8KKwlNTFg0X1JTU19RUENfRkxBR19PRkZTRVQJCT0gMTMsCit9OworCitzdHJ1Y3QgbWx4NF9yc3NfY29udGV4dCB7CisJX19iZTMyCQkJYmFzZV9xcG47CisJX19iZTMyCQkJZGVmYXVsdF9xcG47CisJdTE2CQkJcmVzZXJ2ZWQ7CisJdTgJCQloYXNoX2ZuOworCXU4CQkJZmxhZ3M7CisJX19iZTMyCQkJcnNzX2tleVsxMF07CisJX19iZTMyCQkJYmFzZV9xcG5fdWRwOworfTsKKwogc3RydWN0IG1seDRfcXBfcGF0aCB7CiAJdTgJCQlmbDsKIAl1OAkJCXJlc2VydmVkMVsyXTsKQEAgLTE4Myw2ICsyMTAsNyBAQAogCSAqIFs0XSAgIElQIGNoZWNrc3VtCiAJICogWzM6Ml0gQyAoZ2VuZXJhdGUgY29tcGxldGlvbiBxdWV1ZSBlbnRyeSkKIAkgKiBbMV0gICBTRSAoc29saWNpdGVkIGV2ZW50KQorCSAqIFswXSAgIEZMIChmb3JjZSBsb29wYmFjaykKIAkgKi8KIAlfX2JlMzIJCQlzcmNyYl9mbGFnczsKIAkvKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IDNkYzNhOGMuLjVkOWI0YzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlIDxsaW51eC9tbXpvbmUuaD4KICNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9wcmlvX3RyZWUuaD4KKyNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgogI2luY2x1ZGUgPGxpbnV4L21tX3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZ2UuaD4KQEAgLTEyNTIsNDEgKzEyNTMsMzQgQEAKIGV4dGVybiB2b2lkIGZyZWVfYXJlYV9pbml0KHVuc2lnbmVkIGxvbmcgKiB6b25lc19zaXplKTsKIGV4dGVybiB2b2lkIGZyZWVfYXJlYV9pbml0X25vZGUoaW50IG5pZCwgdW5zaWduZWQgbG9uZyAqIHpvbmVzX3NpemUsCiAJCXVuc2lnbmVkIGxvbmcgem9uZV9zdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgKnpob2xlc19zaXplKTsKLSNpZmRlZiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKKyNpZmRlZiBDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RFX01BUAogLyoKLSAqIFdpdGggQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQIHNldCwgYW4gYXJjaGl0ZWN0dXJlIG1heSBpbml0aWFsaXNlIGl0cworICogV2l0aCBDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RFX01BUCBzZXQsIGFuIGFyY2hpdGVjdHVyZSBtYXkgaW5pdGlhbGlzZSBpdHMKICAqIHpvbmVzLCBhbGxvY2F0ZSB0aGUgYmFja2luZyBtZW1fbWFwIGFuZCBhY2NvdW50IGZvciBtZW1vcnkgaG9sZXMgaW4gYSBtb3JlCiAgKiBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQgbWFubmVyLiBUaGlzIGlzIGEgc3Vic3RpdHV0ZSBmb3IgY3JlYXRpbmcgdGhlCiAgKiB6b25lX3NpemVzW10gYW5kIHpob2xlc19zaXplW10gYXJyYXlzIGFuZCBwYXNzaW5nIHRoZW0gdG8KICAqIGZyZWVfYXJlYV9pbml0X25vZGUoKQogICoKICAqIEFuIGFyY2hpdGVjdHVyZSBpcyBleHBlY3RlZCB0byByZWdpc3RlciByYW5nZSBvZiBwYWdlIGZyYW1lcyBiYWNrZWQgYnkKLSAqIHBoeXNpY2FsIG1lbW9yeSB3aXRoIGFkZF9hY3RpdmVfcmFuZ2UoKSBiZWZvcmUgY2FsbGluZworICogcGh5c2ljYWwgbWVtb3J5IHdpdGggbWVtYmxvY2tfYWRkW19ub2RlXSgpIGJlZm9yZSBjYWxsaW5nCiAgKiBmcmVlX2FyZWFfaW5pdF9ub2RlcygpIHBhc3NpbmcgaW4gdGhlIFBGTiBlYWNoIHpvbmUgZW5kcyBhdC4gQXQgYSBiYXNpYwogICogdXNhZ2UsIGFuIGFyY2hpdGVjdHVyZSBpcyBleHBlY3RlZCB0byBkbyBzb21ldGhpbmcgbGlrZQogICoKICAqIHVuc2lnbmVkIGxvbmcgbWF4X3pvbmVfcGZuc1tNQVhfTlJfWk9ORVNdID0ge21heF9kbWEsIG1heF9ub3JtYWxfcGZuLAogICogCQkJCQkJCSBtYXhfaGlnaG1lbV9wZm59OwogICogZm9yX2VhY2hfdmFsaWRfcGh5c2ljYWxfcGFnZV9yYW5nZSgpCi0gKiAJYWRkX2FjdGl2ZV9yYW5nZShub2RlX2lkLCBzdGFydF9wZm4sIGVuZF9wZm4pCisgKiAJbWVtYmxvY2tfYWRkX25vZGUoYmFzZSwgc2l6ZSwgbmlkKQogICogZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CiAgKgotICogSWYgdGhlIGFyY2hpdGVjdHVyZSBndWFyYW50ZWVzIHRoYXQgdGhlcmUgYXJlIG5vIGhvbGVzIGluIHRoZSByYW5nZXMKLSAqIHJlZ2lzdGVyZWQgd2l0aCBhZGRfYWN0aXZlX3JhbmdlKCksIGZyZWVfYm9vdG1lbV9hY3RpdmVfcmVnaW9ucygpCi0gKiB3aWxsIGNhbGwgZnJlZV9ib290bWVtX25vZGUoKSBmb3IgZWFjaCByZWdpc3RlcmVkIHBoeXNpY2FsIHBhZ2UgcmFuZ2UuCi0gKiBTaW1pbGFybHkgc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMoKSBjYWxscwotICogbWVtb3J5X3ByZXNlbnQoKSBmb3IgZWFjaCByYW5nZSB3aGVuIFNQQVJTRU1FTSBpcyBlbmFibGVkLgorICogZnJlZV9ib290bWVtX3dpdGhfYWN0aXZlX3JlZ2lvbnMoKSBjYWxscyBmcmVlX2Jvb3RtZW1fbm9kZSgpIGZvciBlYWNoCisgKiByZWdpc3RlcmVkIHBoeXNpY2FsIHBhZ2UgcmFuZ2UuICBTaW1pbGFybHkKKyAqIHNwYXJzZV9tZW1vcnlfcHJlc2VudF93aXRoX2FjdGl2ZV9yZWdpb25zKCkgY2FsbHMgbWVtb3J5X3ByZXNlbnQoKSBmb3IKKyAqIGVhY2ggcmFuZ2Ugd2hlbiBTUEFSU0VNRU0gaXMgZW5hYmxlZC4KICAqCiAgKiBTZWUgbW0vcGFnZV9hbGxvYy5jIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGVhY2ggZnVuY3Rpb24gZXhwb3NlZCBieQotICogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQCisgKiBDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RFX01BUC4KICAqLwogZXh0ZXJuIHZvaWQgZnJlZV9hcmVhX2luaXRfbm9kZXModW5zaWduZWQgbG9uZyAqbWF4X3pvbmVfcGZuKTsKLWV4dGVybiB2b2lkIGFkZF9hY3RpdmVfcmFuZ2UodW5zaWduZWQgaW50IG5pZCwgdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sCi0JCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7Ci1leHRlcm4gdm9pZCByZW1vdmVfYWN0aXZlX3JhbmdlKHVuc2lnbmVkIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4pOwotZXh0ZXJuIHZvaWQgcmVtb3ZlX2FsbF9hY3RpdmVfcmFuZ2VzKHZvaWQpOwotdm9pZCBzb3J0X25vZGVfbWFwKHZvaWQpOwogdW5zaWduZWQgbG9uZyBub2RlX21hcF9wZm5fYWxpZ25tZW50KHZvaWQpOwogdW5zaWduZWQgbG9uZyBfX2Fic2VudF9wYWdlc19pbl9yYW5nZShpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3Bmbik7CkBAIC0xMjk5LDE0ICsxMjkzLDExIEBACiAJCQkJCQl1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuKTsKIGludCBhZGRfZnJvbV9lYXJseV9ub2RlX21hcChzdHJ1Y3QgcmFuZ2UgKnJhbmdlLCBpbnQgYXosCiAJCQkJICAgaW50IG5yX3JhbmdlLCBpbnQgbmlkKTsKLXU2NCBfX2luaXQgZmluZF9tZW1vcnlfY29yZV9lYXJseShpbnQgbmlkLCB1NjQgc2l6ZSwgdTY0IGFsaWduLAotCQkJCQl1NjQgZ29hbCwgdTY0IGxpbWl0KTsKLXR5cGVkZWYgaW50ICgqd29ya19mbl90KSh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB2b2lkICopOwotZXh0ZXJuIHZvaWQgd29ya193aXRoX2FjdGl2ZV9yZWdpb25zKGludCBuaWQsIHdvcmtfZm5fdCB3b3JrX2ZuLCB2b2lkICpkYXRhKTsKIGV4dGVybiB2b2lkIHNwYXJzZV9tZW1vcnlfcHJlc2VudF93aXRoX2FjdGl2ZV9yZWdpb25zKGludCBuaWQpOwotI2VuZGlmIC8qIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCAqLwogCi0jaWYgIWRlZmluZWQoQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQKSAmJiBcCisjZW5kaWYgLyogQ09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVAgKi8KKworI2lmICFkZWZpbmVkKENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQKSAmJiBcCiAgICAgIWRlZmluZWQoQ09ORklHX0hBVkVfQVJDSF9FQVJMWV9QRk5fVE9fTklEKQogc3RhdGljIGlubGluZSBpbnQgX19lYXJseV9wZm5fdG9fbmlkKHVuc2lnbmVkIGxvbmcgcGZuKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oIGIvaW5jbHVkZS9saW51eC9tbWMvY2FyZC5oCmluZGV4IDQxNWYyZGIuLmM4ZWY5YmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW1jL2NhcmQuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tYy9jYXJkLmgKQEAgLTIxOCw2ICsyMTgsNyBAQAogI2RlZmluZSBNTUNfUVVJUktfSU5BTkRfQ01EMzgJKDE8PDYpCQkvKiBpTkFORCBkZXZpY2VzIGhhdmUgYnJva2VuIENNRDM4ICovCiAjZGVmaW5lIE1NQ19RVUlSS19CTEtfTk9fQ01EMjMJKDE8PDcpCQkvKiBBdm9pZCBDTUQyMyBmb3IgcmVndWxhciBtdWx0aWJsb2NrICovCiAjZGVmaW5lIE1NQ19RVUlSS19CUk9LRU5fQllURV9NT0RFXzUxMiAoMTw8OCkJLyogQXZvaWQgc2VuZGluZyA1MTIgYnl0ZXMgaW4gKi8KKyNkZWZpbmUgTU1DX1FVSVJLX0xPTkdfUkVBRF9USU1FICgxPDw5KQkJLyogRGF0YSByZWFkIHRpbWUgPiBDU0Qgc2F5cyAqLwogCQkJCQkJLyogYnl0ZSBtb2RlICovCiAJdW5zaWduZWQgaW50ICAgIHBvd2Vyb2ZmX25vdGlmeV9zdGF0ZTsJLyogZU1NQzQuNSBub3RpZnkgZmVhdHVyZSAqLwogI2RlZmluZSBNTUNfTk9fUE9XRVJfTk9USUZJQ0FUSU9OCTAKQEAgLTQzMyw2ICs0MzQsMTEgQEAKIAlyZXR1cm4gYy0+cXVpcmtzICYgTU1DX1FVSVJLX0JST0tFTl9CWVRFX01PREVfNTEyOwogfQogCitzdGF0aWMgaW5saW5lIGludCBtbWNfY2FyZF9sb25nX3JlYWRfdGltZShjb25zdCBzdHJ1Y3QgbW1jX2NhcmQgKmMpCit7CisJcmV0dXJuIGMtPnF1aXJrcyAmIE1NQ19RVUlSS19MT05HX1JFQURfVElNRTsKK30KKwogI2RlZmluZSBtbWNfY2FyZF9uYW1lKGMpCSgoYyktPmNpZC5wcm9kX25hbWUpCiAjZGVmaW5lIG1tY19jYXJkX2lkKGMpCQkoZGV2X25hbWUoJihjKS0+ZGV2KSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgvbW16b25lLmgKaW5kZXggMTg4Y2IyZi4uM2FjMDQwZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21tem9uZS5oCkBAIC01OTgsMTMgKzU5OCwxMyBAQAogI2VuZGlmCiB9OwogCi0jaWZkZWYgQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQCisjaWZkZWYgQ09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVAKIHN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gewogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuOwogCXVuc2lnbmVkIGxvbmcgZW5kX3BmbjsKIAlpbnQgbmlkOwogfTsKLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAgKi8KKyNlbmRpZiAvKiBDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RFX01BUCAqLwogCiAjaWZuZGVmIENPTkZJR19ESVNDT05USUdNRU0KIC8qIFRoZSBhcnJheSBvZiBzdHJ1Y3QgcGFnZXMgLSBmb3IgZGlzY29udGlnbWVtIHVzZSBwZ2RhdC0+bG1lbV9tYXAgKi8KQEAgLTcyMCw3ICs3MjAsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCB6b25lX21vdmFibGVfaXNfaGlnaG1lbSh2b2lkKQogewotI2lmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pICYmIGRlZmluZWQoQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQKQorI2lmIGRlZmluZWQoQ09ORklHX0hJR0hNRU0pICYmIGRlZmluZWQoQ09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERSkKIAlyZXR1cm4gbW92YWJsZV96b25lID09IFpPTkVfSElHSE1FTTsKICNlbHNlCiAJcmV0dXJuIDA7CkBAIC05MzgsNyArOTM4LDcgQEAKICNlbmRpZgogCiAjaWYgIWRlZmluZWQoQ09ORklHX0hBVkVfQVJDSF9FQVJMWV9QRk5fVE9fTklEKSAmJiBcCi0JIWRlZmluZWQoQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQKQorCSFkZWZpbmVkKENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQKQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGVhcmx5X3Bmbl90b19uaWQodW5zaWduZWQgbG9uZyBwZm4pCiB7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25laWdoYm91ci5oIGIvaW5jbHVkZS9saW51eC9uZWlnaGJvdXIuaAppbmRleCBhNzAwM2I3Li5iMTg4ZjY4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25laWdoYm91ci5oCisrKyBiL2luY2x1ZGUvbGludXgvbmVpZ2hib3VyLmgKQEAgLTExNiw2ICsxMTYsNyBAQAogCU5EVFBBX1BST1hZX0RFTEFZLAkJLyogdTY0LCBtc2VjcyAqLwogCU5EVFBBX1BST1hZX1FMRU4sCQkvKiB1MzIgKi8KIAlORFRQQV9MT0NLVElNRSwJCQkvKiB1NjQsIG1zZWNzICovCisJTkRUUEFfUVVFVUVfTEVOQllURVMsCQkvKiB1MzIgKi8KIAlfX05EVFBBX01BWAogfTsKICNkZWZpbmUgTkRUUEFfTUFYIChfX05EVFBBX01BWCAtIDEpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGRldl9mZWF0dXJlcy5oIGIvaW5jbHVkZS9saW51eC9uZXRkZXZfZmVhdHVyZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Y1MjAyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZfZmVhdHVyZXMuaApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIE5ldHdvcmsgZGV2aWNlIGZlYXR1cmVzLgorICoKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaWZuZGVmIF9MSU5VWF9ORVRERVZfRkVBVFVSRVNfSAorI2RlZmluZSBfTElOVVhfTkVUREVWX0ZFQVRVUkVTX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3R5cGVkZWYgdTY0IG5ldGRldl9mZWF0dXJlc190OworCitlbnVtIHsKKwlORVRJRl9GX1NHX0JJVCwJCQkvKiBTY2F0dGVyL2dhdGhlciBJTy4gKi8KKwlORVRJRl9GX0lQX0NTVU1fQklULAkJLyogQ2FuIGNoZWNrc3VtIFRDUC9VRFAgb3ZlciBJUHY0LiAqLworCV9fVU5VU0VEX05FVElGX0ZfMSwKKwlORVRJRl9GX0hXX0NTVU1fQklULAkJLyogQ2FuIGNoZWNrc3VtIGFsbCB0aGUgcGFja2V0cy4gKi8KKwlORVRJRl9GX0lQVjZfQ1NVTV9CSVQsCQkvKiBDYW4gY2hlY2tzdW0gVENQL1VEUCBvdmVyIElQVjYgKi8KKwlORVRJRl9GX0hJR0hETUFfQklULAkJLyogQ2FuIERNQSB0byBoaWdoIG1lbW9yeS4gKi8KKwlORVRJRl9GX0ZSQUdMSVNUX0JJVCwJCS8qIFNjYXR0ZXIvZ2F0aGVyIElPLiAqLworCU5FVElGX0ZfSFdfVkxBTl9UWF9CSVQsCQkvKiBUcmFuc21pdCBWTEFOIGh3IGFjY2VsZXJhdGlvbiAqLworCU5FVElGX0ZfSFdfVkxBTl9SWF9CSVQsCQkvKiBSZWNlaXZlIFZMQU4gaHcgYWNjZWxlcmF0aW9uICovCisJTkVUSUZfRl9IV19WTEFOX0ZJTFRFUl9CSVQsCS8qIFJlY2VpdmUgZmlsdGVyaW5nIG9uIFZMQU4gKi8KKwlORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRF9CSVQsCS8qIERldmljZSBjYW5ub3QgaGFuZGxlIFZMQU4gcGFja2V0cyAqLworCU5FVElGX0ZfR1NPX0JJVCwJCS8qIEVuYWJsZSBzb2Z0d2FyZSBHU08uICovCisJTkVUSUZfRl9MTFRYX0JJVCwJCS8qIExvY2tMZXNzIFRYIC0gZGVwcmVjYXRlZC4gUGxlYXNlICovCisJCQkJCS8qIGRvIG5vdCB1c2UgTExUWCBpbiBuZXcgZHJpdmVycyAqLworCU5FVElGX0ZfTkVUTlNfTE9DQUxfQklULAkvKiBEb2VzIG5vdCBjaGFuZ2UgbmV0d29yayBuYW1lc3BhY2VzICovCisJTkVUSUZfRl9HUk9fQklULAkJLyogR2VuZXJpYyByZWNlaXZlIG9mZmxvYWQgKi8KKwlORVRJRl9GX0xST19CSVQsCQkvKiBsYXJnZSByZWNlaXZlIG9mZmxvYWQgKi8KKworCS8qKi9ORVRJRl9GX0dTT19TSElGVCwJCS8qIGtlZXAgdGhlIG9yZGVyIG9mIFNLQl9HU09fKiBiaXRzICovCisJTkVUSUZfRl9UU09fQklUCQkJLyogLi4uIFRDUHY0IHNlZ21lbnRhdGlvbiAqLworCQk9IE5FVElGX0ZfR1NPX1NISUZULAorCU5FVElGX0ZfVUZPX0JJVCwJCS8qIC4uLiBVRFB2NCBmcmFnbWVudGF0aW9uICovCisJTkVUSUZfRl9HU09fUk9CVVNUX0JJVCwJCS8qIC4uLiAtPlNLQl9HU09fRE9ER1kgKi8KKwlORVRJRl9GX1RTT19FQ05fQklULAkJLyogLi4uIFRDUCBFQ04gc3VwcG9ydCAqLworCU5FVElGX0ZfVFNPNl9CSVQsCQkvKiAuLi4gVENQdjYgc2VnbWVudGF0aW9uICovCisJTkVUSUZfRl9GU09fQklULAkJLyogLi4uIEZDb0Ugc2VnbWVudGF0aW9uICovCisJTkVUSUZfRl9HU09fUkVTRVJWRUQxLAkJLyogLi4uIGZyZWUgKGZpbGwgR1NPX01BU0sgdG8gOCBiaXRzKSAqLworCS8qKi9ORVRJRl9GX0dTT19MQVNULAkJLyogW2Nhbid0IGJlIGxhc3QgYml0LCBzZWUgR1NPX01BU0tdICovCisJTkVUSUZfRl9HU09fUkVTRVJWRUQyCQkvKiAuLi4gZnJlZSAoZmlsbCBHU09fTUFTSyB0byA4IGJpdHMpICovCisJCT0gTkVUSUZfRl9HU09fTEFTVCwKKworCU5FVElGX0ZfRkNPRV9DUkNfQklULAkJLyogRkNvRSBDUkMzMiAqLworCU5FVElGX0ZfU0NUUF9DU1VNX0JJVCwJCS8qIFNDVFAgY2hlY2tzdW0gb2ZmbG9hZCAqLworCU5FVElGX0ZfRkNPRV9NVFVfQklULAkJLyogU3VwcG9ydHMgbWF4IEZDb0UgTVRVLCAyMTU4IGJ5dGVzKi8KKwlORVRJRl9GX05UVVBMRV9CSVQsCQkvKiBOLXR1cGxlIGZpbHRlcnMgc3VwcG9ydGVkICovCisJTkVUSUZfRl9SWEhBU0hfQklULAkJLyogUmVjZWl2ZSBoYXNoaW5nIG9mZmxvYWQgKi8KKwlORVRJRl9GX1JYQ1NVTV9CSVQsCQkvKiBSZWNlaXZlIGNoZWNrc3VtbWluZyBvZmZsb2FkICovCisJTkVUSUZfRl9OT0NBQ0hFX0NPUFlfQklULAkvKiBVc2Ugbm8tY2FjaGUgY29weWZyb211c2VyICovCisJTkVUSUZfRl9MT09QQkFDS19CSVQsCQkvKiBFbmFibGUgbG9vcGJhY2sgKi8KKworCS8qCisJICogQWRkIHlvdXIgZnJlc2ggbmV3IGZlYXR1cmUgYWJvdmUgYW5kIHJlbWVtYmVyIHRvIHVwZGF0ZQorCSAqIG5ldGRldl9mZWF0dXJlc19zdHJpbmdzW10gaW4gbmV0L2NvcmUvZXRodG9vbC5jIGFuZCBtYXliZQorCSAqIHNvbWUgZmVhdHVyZSBtYXNrICNkZWZpbmVzIGJlbG93LiBQbGVhc2UgYWxzbyBkZXNjcmliZSBpdAorCSAqIGluIERvY3VtZW50YXRpb24vbmV0d29ya2luZy9uZXRkZXYtZmVhdHVyZXMudHh0LgorCSAqLworCisJLyoqL05FVERFVl9GRUFUVVJFX0NPVU5UCit9OworCisvKiBjb3B5J24ncGFzdGUgY29tcHJlc3Npb24gOykgKi8KKyNkZWZpbmUgX19ORVRJRl9GX0JJVChiaXQpCSgobmV0ZGV2X2ZlYXR1cmVzX3QpMSA8PCAoYml0KSkKKyNkZWZpbmUgX19ORVRJRl9GKG5hbWUpCQlfX05FVElGX0ZfQklUKE5FVElGX0ZfIyNuYW1lIyNfQklUKQorCisjZGVmaW5lIE5FVElGX0ZfRkNPRV9DUkMJX19ORVRJRl9GKEZDT0VfQ1JDKQorI2RlZmluZSBORVRJRl9GX0ZDT0VfTVRVCV9fTkVUSUZfRihGQ09FX01UVSkKKyNkZWZpbmUgTkVUSUZfRl9GUkFHTElTVAlfX05FVElGX0YoRlJBR0xJU1QpCisjZGVmaW5lIE5FVElGX0ZfRlNPCQlfX05FVElGX0YoRlNPKQorI2RlZmluZSBORVRJRl9GX0dSTwkJX19ORVRJRl9GKEdSTykKKyNkZWZpbmUgTkVUSUZfRl9HU08JCV9fTkVUSUZfRihHU08pCisjZGVmaW5lIE5FVElGX0ZfR1NPX1JPQlVTVAlfX05FVElGX0YoR1NPX1JPQlVTVCkKKyNkZWZpbmUgTkVUSUZfRl9ISUdIRE1BCQlfX05FVElGX0YoSElHSERNQSkKKyNkZWZpbmUgTkVUSUZfRl9IV19DU1VNCQlfX05FVElGX0YoSFdfQ1NVTSkKKyNkZWZpbmUgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUglfX05FVElGX0YoSFdfVkxBTl9GSUxURVIpCisjZGVmaW5lIE5FVElGX0ZfSFdfVkxBTl9SWAlfX05FVElGX0YoSFdfVkxBTl9SWCkKKyNkZWZpbmUgTkVUSUZfRl9IV19WTEFOX1RYCV9fTkVUSUZfRihIV19WTEFOX1RYKQorI2RlZmluZSBORVRJRl9GX0lQX0NTVU0JCV9fTkVUSUZfRihJUF9DU1VNKQorI2RlZmluZSBORVRJRl9GX0lQVjZfQ1NVTQlfX05FVElGX0YoSVBWNl9DU1VNKQorI2RlZmluZSBORVRJRl9GX0xMVFgJCV9fTkVUSUZfRihMTFRYKQorI2RlZmluZSBORVRJRl9GX0xPT1BCQUNLCV9fTkVUSUZfRihMT09QQkFDSykKKyNkZWZpbmUgTkVUSUZfRl9MUk8JCV9fTkVUSUZfRihMUk8pCisjZGVmaW5lIE5FVElGX0ZfTkVUTlNfTE9DQUwJX19ORVRJRl9GKE5FVE5TX0xPQ0FMKQorI2RlZmluZSBORVRJRl9GX05PQ0FDSEVfQ09QWQlfX05FVElGX0YoTk9DQUNIRV9DT1BZKQorI2RlZmluZSBORVRJRl9GX05UVVBMRQkJX19ORVRJRl9GKE5UVVBMRSkKKyNkZWZpbmUgTkVUSUZfRl9SWENTVU0JCV9fTkVUSUZfRihSWENTVU0pCisjZGVmaW5lIE5FVElGX0ZfUlhIQVNICQlfX05FVElGX0YoUlhIQVNIKQorI2RlZmluZSBORVRJRl9GX1NDVFBfQ1NVTQlfX05FVElGX0YoU0NUUF9DU1VNKQorI2RlZmluZSBORVRJRl9GX1NHCQlfX05FVElGX0YoU0cpCisjZGVmaW5lIE5FVElGX0ZfVFNPNgkJX19ORVRJRl9GKFRTTzYpCisjZGVmaW5lIE5FVElGX0ZfVFNPX0VDTgkJX19ORVRJRl9GKFRTT19FQ04pCisjZGVmaW5lIE5FVElGX0ZfVFNPCQlfX05FVElGX0YoVFNPKQorI2RlZmluZSBORVRJRl9GX1VGTwkJX19ORVRJRl9GKFVGTykKKyNkZWZpbmUgTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQJX19ORVRJRl9GKFZMQU5fQ0hBTExFTkdFRCkKKworLyogRmVhdHVyZXMgdmFsaWQgZm9yIGV0aHRvb2wgdG8gY2hhbmdlICovCisvKiA9IGFsbCBkZWZpbmVkIG1pbnVzIGRyaXZlci9kZXZpY2UtY2xhc3MtcmVsYXRlZCAqLworI2RlZmluZSBORVRJRl9GX05FVkVSX0NIQU5HRQkoTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQgfCBcCisJCQkJIE5FVElGX0ZfTExUWCB8IE5FVElGX0ZfTkVUTlNfTE9DQUwpCisKKy8qIHJlbWVtYmVyIHRoYXQgKCh0KTEgPDwgdF9CSVRTKSBpcyB1bmRlZmluZWQgaW4gQzk5ICovCisjZGVmaW5lIE5FVElGX0ZfRVRIVE9PTF9CSVRTCSgoX19ORVRJRl9GX0JJVChORVRERVZfRkVBVFVSRV9DT1VOVCAtIDEpIHwgXAorCQkoX19ORVRJRl9GX0JJVChORVRERVZfRkVBVFVSRV9DT1VOVCAtIDEpIC0gMSkpICYgXAorCQl+TkVUSUZfRl9ORVZFUl9DSEFOR0UpCisKKy8qIFNlZ21lbnRhdGlvbiBvZmZsb2FkIGZlYXR1cmUgbWFzayAqLworI2RlZmluZSBORVRJRl9GX0dTT19NQVNLCShfX05FVElGX0ZfQklUKE5FVElGX0ZfR1NPX0xBU1QgKyAxKSAtIFwKKwkJX19ORVRJRl9GX0JJVChORVRJRl9GX0dTT19TSElGVCkpCisKKy8qIExpc3Qgb2YgZmVhdHVyZXMgd2l0aCBzb2Z0d2FyZSBmYWxsYmFja3MuICovCisjZGVmaW5lIE5FVElGX0ZfR1NPX1NPRlRXQVJFCShORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPX0VDTiB8IFwKKwkJCQkgTkVUSUZfRl9UU082IHwgTkVUSUZfRl9VRk8pCisKKyNkZWZpbmUgTkVUSUZfRl9HRU5fQ1NVTQlORVRJRl9GX0hXX0NTVU0KKyNkZWZpbmUgTkVUSUZfRl9WNF9DU1VNCQkoTkVUSUZfRl9HRU5fQ1NVTSB8IE5FVElGX0ZfSVBfQ1NVTSkKKyNkZWZpbmUgTkVUSUZfRl9WNl9DU1VNCQkoTkVUSUZfRl9HRU5fQ1NVTSB8IE5FVElGX0ZfSVBWNl9DU1VNKQorI2RlZmluZSBORVRJRl9GX0FMTF9DU1VNCShORVRJRl9GX1Y0X0NTVU0gfCBORVRJRl9GX1Y2X0NTVU0pCisKKyNkZWZpbmUgTkVUSUZfRl9BTExfVFNPIAkoTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTTzYgfCBORVRJRl9GX1RTT19FQ04pCisKKyNkZWZpbmUgTkVUSUZfRl9BTExfRkNPRQkoTkVUSUZfRl9GQ09FX0NSQyB8IE5FVElGX0ZfRkNPRV9NVFUgfCBcCisJCQkJIE5FVElGX0ZfRlNPKQorCisvKgorICogSWYgb25lIGRldmljZSBzdXBwb3J0cyBvbmUgb2YgdGhlc2UgZmVhdHVyZXMsIHRoZW4gZW5hYmxlIHRoZW0KKyAqIGZvciBhbGwgaW4gbmV0ZGV2X2luY3JlbWVudF9mZWF0dXJlcy4KKyAqLworI2RlZmluZSBORVRJRl9GX09ORV9GT1JfQUxMCShORVRJRl9GX0dTT19TT0ZUV0FSRSB8IE5FVElGX0ZfR1NPX1JPQlVTVCB8IFwKKwkJCQkgTkVUSUZfRl9TRyB8IE5FVElGX0ZfSElHSERNQSB8CQlcCisJCQkJIE5FVElGX0ZfRlJBR0xJU1QgfCBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRCkKKy8qCisgKiBJZiBvbmUgZGV2aWNlIGRvZXNuJ3Qgc3VwcG9ydCBvbmUgb2YgdGhlc2UgZmVhdHVyZXMsIHRoZW4gZGlzYWJsZSBpdAorICogZm9yIGFsbCBpbiBuZXRkZXZfaW5jcmVtZW50X2ZlYXR1cmVzLgorICovCisjZGVmaW5lIE5FVElGX0ZfQUxMX0ZPUl9BTEwJKE5FVElGX0ZfTk9DQUNIRV9DT1BZIHwgTkVUSUZfRl9GU08pCisKKy8qIGNoYW5nZWFibGUgZmVhdHVyZXMgd2l0aCBubyBzcGVjaWFsIGhhcmR3YXJlIHJlcXVpcmVtZW50cyAqLworI2RlZmluZSBORVRJRl9GX1NPRlRfRkVBVFVSRVMJKE5FVElGX0ZfR1NPIHwgTkVUSUZfRl9HUk8pCisKKyNlbmRpZgkvKiBfTElOVVhfTkVUREVWX0ZFQVRVUkVTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L25ldGRldmljZS5oCmluZGV4IGNiZWI1ODYuLmExZDEwOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaApAQCAtNDMsNiArNDMsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9keW5hbWljX3F1ZXVlX2xpbWl0cy5oPgogCiAjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgogI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CkBAIC01MCw4ICs1MSwxMCBAQAogI2lmZGVmIENPTkZJR19EQ0IKICNpbmNsdWRlIDxuZXQvZGNibmwuaD4KICNlbmRpZgorI2luY2x1ZGUgPG5ldC9uZXRwcmlvX2Nncm91cC5oPgogCi1zdHJ1Y3Qgdmxhbl9ncm91cDsKKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZfZmVhdHVyZXMuaD4KKwogc3RydWN0IG5ldHBvbGxfaW5mbzsKIHN0cnVjdCBwaHlfZGV2aWNlOwogLyogODAyLjExIHNwZWNpZmljICovCkBAIC0xNDEsMjIgKzE0NCwyMCBAQAogICoJdXNlZC4KICAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfV0xBTikgfHwgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisjaWYgZGVmaW5lZChDT05GSUdfV0xBTikgfHwgSVNfRU5BQkxFRChDT05GSUdfQVgyNSkKICMgaWYgZGVmaW5lZChDT05GSUdfTUFDODAyMTFfTUVTSCkKICMgIGRlZmluZSBMTF9NQVhfSEVBREVSIDEyOAogIyBlbHNlCiAjICBkZWZpbmUgTExfTUFYX0hFQURFUiA5NgogIyBlbmRpZgotI2VsaWYgZGVmaW5lZChDT05GSUdfVFIpIHx8IGRlZmluZWQoQ09ORklHX1RSX01PRFVMRSkKKyNlbGlmIElTX0VOQUJMRUQoQ09ORklHX1RSKQogIyBkZWZpbmUgTExfTUFYX0hFQURFUiA0OAogI2Vsc2UKICMgZGVmaW5lIExMX01BWF9IRUFERVIgMzIKICNlbmRpZgogCi0jaWYgIWRlZmluZWQoQ09ORklHX05FVF9JUElQKSAmJiAhZGVmaW5lZChDT05GSUdfTkVUX0lQSVBfTU9EVUxFKSAmJiBcCi0gICAgIWRlZmluZWQoQ09ORklHX05FVF9JUEdSRSkgJiYgICFkZWZpbmVkKENPTkZJR19ORVRfSVBHUkVfTU9EVUxFKSAmJiBcCi0gICAgIWRlZmluZWQoQ09ORklHX0lQVjZfU0lUKSAmJiAhZGVmaW5lZChDT05GSUdfSVBWNl9TSVRfTU9EVUxFKSAmJiBcCi0gICAgIWRlZmluZWQoQ09ORklHX0lQVjZfVFVOTkVMKSAmJiAhZGVmaW5lZChDT05GSUdfSVBWNl9UVU5ORUxfTU9EVUxFKQorI2lmICFJU19FTkFCTEVEKENPTkZJR19ORVRfSVBJUCkgJiYgIUlTX0VOQUJMRUQoQ09ORklHX05FVF9JUEdSRSkgJiYgXAorICAgICFJU19FTkFCTEVEKENPTkZJR19JUFY2X1NJVCkgJiYgIUlTX0VOQUJMRUQoQ09ORklHX0lQVjZfVFVOTkVMKQogI2RlZmluZSBNQVhfSEVBREVSIExMX01BWF9IRUFERVIKICNlbHNlCiAjZGVmaW5lIE1BWF9IRUFERVIgKExMX01BWF9IRUFERVIgKyA0OCkKQEAgLTIxMiw2ICsyMTMsMTEgQEAKICNpbmNsdWRlIDxsaW51eC9jYWNoZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgogCisjaWZkZWYgQ09ORklHX1JQUworI2luY2x1ZGUgPGxpbnV4L2p1bXBfbGFiZWwuaD4KK2V4dGVybiBzdHJ1Y3QganVtcF9sYWJlbF9rZXkgcnBzX25lZWRlZDsKKyNlbmRpZgorCiBzdHJ1Y3QgbmVpZ2hib3VyOwogc3RydWN0IG5laWdoX3Bhcm1zOwogc3RydWN0IHNrX2J1ZmY7CkBAIC0yNzIsMTYgKzI3OCwxMSBAQAogICoKICAqIFdlIGNvdWxkIHVzZSBvdGhlciBhbGlnbm1lbnQgdmFsdWVzLCBidXQgd2UgbXVzdCBtYWludGFpbiB0aGUKICAqIHJlbGF0aW9uc2hpcCBISCBhbGlnbm1lbnQgPD0gTEwgYWxpZ25tZW50LgotICoKLSAqIExMX0FMTE9DQVRFRF9TUEFDRSBhbHNvIHRha2VzIGludG8gYWNjb3VudCB0aGUgdGFpbHJvb20gdGhlIGRldmljZQotICogbWF5IG5lZWQuCiAgKi8KICNkZWZpbmUgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSBcCiAJKCgoKGRldiktPmhhcmRfaGVhZGVyX2xlbisoZGV2KS0+bmVlZGVkX2hlYWRyb29tKSZ+KEhIX0RBVEFfTU9EIC0gMSkpICsgSEhfREFUQV9NT0QpCiAjZGVmaW5lIExMX1JFU0VSVkVEX1NQQUNFX0VYVFJBKGRldixleHRyYSkgXAogCSgoKChkZXYpLT5oYXJkX2hlYWRlcl9sZW4rKGRldiktPm5lZWRlZF9oZWFkcm9vbSsoZXh0cmEpKSZ+KEhIX0RBVEFfTU9EIC0gMSkpICsgSEhfREFUQV9NT0QpCi0jZGVmaW5lIExMX0FMTE9DQVRFRF9TUEFDRShkZXYpIFwKLQkoKCgoZGV2KS0+aGFyZF9oZWFkZXJfbGVuKyhkZXYpLT5uZWVkZWRfaGVhZHJvb20rKGRldiktPm5lZWRlZF90YWlscm9vbSkmfihISF9EQVRBX01PRCAtIDEpKSArIEhIX0RBVEFfTU9EKQogCiBzdHJ1Y3QgaGVhZGVyX29wcyB7CiAJaW50CSgqY3JlYXRlKSAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTUxNiwxMSArNTE3LDIzIEBACiAjZW5kaWYKIAogZW51bSBuZXRkZXZfcXVldWVfc3RhdGVfdCB7Ci0JX19RVUVVRV9TVEFURV9YT0ZGLAorCV9fUVVFVUVfU1RBVEVfRFJWX1hPRkYsCisJX19RVUVVRV9TVEFURV9TVEFDS19YT0ZGLAogCV9fUVVFVUVfU1RBVEVfRlJPWkVOLAotI2RlZmluZSBRVUVVRV9TVEFURV9YT0ZGX09SX0ZST1pFTiAoKDEgPDwgX19RVUVVRV9TVEFURV9YT0ZGKQkJfCBcCi0JCQkJICAgICgxIDw8IF9fUVVFVUVfU1RBVEVfRlJPWkVOKSkKKyNkZWZpbmUgUVVFVUVfU1RBVEVfQU5ZX1hPRkYgKCgxIDw8IF9fUVVFVUVfU1RBVEVfRFJWX1hPRkYpCQl8IFwKKwkJCSAgICAgICgxIDw8IF9fUVVFVUVfU1RBVEVfU1RBQ0tfWE9GRikpCisjZGVmaW5lIFFVRVVFX1NUQVRFX0FOWV9YT0ZGX09SX0ZST1pFTiAoUVVFVUVfU1RBVEVfQU5ZX1hPRkYJCXwgXAorCQkJCQkoMSA8PCBfX1FVRVVFX1NUQVRFX0ZST1pFTikpCiB9OworLyoKKyAqIF9fUVVFVUVfU1RBVEVfRFJWX1hPRkYgaXMgdXNlZCBieSBkcml2ZXJzIHRvIHN0b3AgdGhlIHRyYW5zbWl0IHF1ZXVlLiAgVGhlCisgKiBuZXRpZl90eF8qIGZ1bmN0aW9ucyBiZWxvdyBhcmUgdXNlZCB0byBtYW5pcHVsYXRlIHRoaXMgZmxhZy4gIFRoZQorICogX19RVUVVRV9TVEFURV9TVEFDS19YT0ZGIGZsYWcgaXMgdXNlZCBieSB0aGUgc3RhY2sgdG8gc3RvcCB0aGUgdHJhbnNtaXQKKyAqIHF1ZXVlIGluZGVwZW5kZW50bHkuICBUaGUgbmV0aWZfeG1pdF8qc3RvcHBlZCBmdW5jdGlvbnMgYmVsb3cgYXJlIGNhbGxlZAorICogdG8gY2hlY2sgaWYgdGhlIHF1ZXVlIGhhcyBiZWVuIHN0b3BwZWQgYnkgdGhlIGRyaXZlciBvciBzdGFjayAoZWl0aGVyCisgKiBvZiB0aGUgWE9GRiBiaXRzIGFyZSBzZXQgaW4gdGhlIHN0YXRlKS4gIERyaXZlcnMgc2hvdWxkIG5vdCBuZWVkIHRvIGNhbGwKKyAqIG5ldGlmX3htaXQqc3RvcHBlZCBmdW5jdGlvbnMsIHRoZXkgc2hvdWxkIG9ubHkgYmUgdXNpbmcgbmV0aWZfdHhfKi4KKyAqLwogCiBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlIHsKIC8qCkBAIC01MjgsOSArNTQxLDggQEAKICAqLwogCXN0cnVjdCBuZXRfZGV2aWNlCSpkZXY7CiAJc3RydWN0IFFkaXNjCQkqcWRpc2M7Ci0JdW5zaWduZWQgbG9uZwkJc3RhdGU7CiAJc3RydWN0IFFkaXNjCQkqcWRpc2Nfc2xlZXBpbmc7Ci0jaWYgZGVmaW5lZChDT05GSUdfUlBTKSB8fCBkZWZpbmVkKENPTkZJR19YUFMpCisjaWZkZWYgQ09ORklHX1NZU0ZTCiAJc3RydWN0IGtvYmplY3QJCWtvYmo7CiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19YUFMpICYmIGRlZmluZWQoQ09ORklHX05VTUEpCkBAIC01NDUsNiArNTU3LDE4IEBACiAJICogcGxlYXNlIHVzZSB0aGlzIGZpZWxkIGluc3RlYWQgb2YgZGV2LT50cmFuc19zdGFydAogCSAqLwogCXVuc2lnbmVkIGxvbmcJCXRyYW5zX3N0YXJ0OworCisJLyoKKwkgKiBOdW1iZXIgb2YgVFggdGltZW91dHMgZm9yIHRoaXMgcXVldWUKKwkgKiAoL3N5cy9jbGFzcy9uZXQvREVWL1EvdHJhbnNfdGltZW91dCkKKwkgKi8KKwl1bnNpZ25lZCBsb25nCQl0cmFuc190aW1lb3V0OworCisJdW5zaWduZWQgbG9uZwkJc3RhdGU7CisKKyNpZmRlZiBDT05GSUdfQlFMCisJc3RydWN0IGRxbAkJZHFsOworI2VuZGlmCiB9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CiAKIHN0YXRpYyBpbmxpbmUgaW50IG5ldGRldl9xdWV1ZV9udW1hX25vZGVfcmVhZChjb25zdCBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpxKQpAQCAtNTczLDcgKzU5Nyw3IEBACiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKIAl1MTYgY3B1c1swXTsKIH07Ci0jZGVmaW5lIFJQU19NQVBfU0laRShfbnVtKSAoc2l6ZW9mKHN0cnVjdCBycHNfbWFwKSArIChfbnVtICogc2l6ZW9mKHUxNikpKQorI2RlZmluZSBSUFNfTUFQX1NJWkUoX251bSkgKHNpemVvZihzdHJ1Y3QgcnBzX21hcCkgKyAoKF9udW0pICogc2l6ZW9mKHUxNikpKQogCiAvKgogICogVGhlIHJwc19kZXZfZmxvdyBzdHJ1Y3R1cmUgY29udGFpbnMgdGhlIG1hcHBpbmcgb2YgYSBmbG93IHRvIGEgQ1BVLCB0aGUKQEAgLTU5Nyw3ICs2MjEsNyBAQAogCXN0cnVjdCBycHNfZGV2X2Zsb3cgZmxvd3NbMF07CiB9OwogI2RlZmluZSBSUFNfREVWX0ZMT1dfVEFCTEVfU0laRShfbnVtKSAoc2l6ZW9mKHN0cnVjdCBycHNfZGV2X2Zsb3dfdGFibGUpICsgXAotICAgIChfbnVtICogc2l6ZW9mKHN0cnVjdCBycHNfZGV2X2Zsb3cpKSkKKyAgICAoKF9udW0pICogc2l6ZW9mKHN0cnVjdCBycHNfZGV2X2Zsb3cpKSkKIAogLyoKICAqIFRoZSBycHNfc29ja19mbG93X3RhYmxlIGNvbnRhaW5zIG1hcHBpbmdzIG9mIGZsb3dzIHRvIHRoZSBsYXN0IENQVQpAQCAtNjA4LDcgKzYzMiw3IEBACiAJdTE2IGVudHNbMF07CiB9OwogI2RlZmluZQlSUFNfU09DS19GTE9XX1RBQkxFX1NJWkUoX251bSkgKHNpemVvZihzdHJ1Y3QgcnBzX3NvY2tfZmxvd190YWJsZSkgKyBcCi0gICAgKF9udW0gKiBzaXplb2YodTE2KSkpCisgICAgKChfbnVtKSAqIHNpemVvZih1MTYpKSkKIAogI2RlZmluZSBSUFNfTk9fQ1BVIDB4ZmZmZgogCkBAIC02NjAsNyArNjg0LDcgQEAKIAlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwogCXUxNiBxdWV1ZXNbMF07CiB9OwotI2RlZmluZSBYUFNfTUFQX1NJWkUoX251bSkgKHNpemVvZihzdHJ1Y3QgeHBzX21hcCkgKyAoX251bSAqIHNpemVvZih1MTYpKSkKKyNkZWZpbmUgWFBTX01BUF9TSVpFKF9udW0pIChzaXplb2Yoc3RydWN0IHhwc19tYXApICsgKChfbnVtKSAqIHNpemVvZih1MTYpKSkKICNkZWZpbmUgWFBTX01JTl9NQVBfQUxMT0MgKChMMV9DQUNIRV9CWVRFUyAtIHNpemVvZihzdHJ1Y3QgeHBzX21hcCkpCVwKICAgICAvIHNpemVvZih1MTYpKQogCkBAIC02ODMsNiArNzA3LDIzIEBACiAJdTE2IG9mZnNldDsKIH07CiAKKyNpZiBkZWZpbmVkKENPTkZJR19GQ09FKSB8fCBkZWZpbmVkKENPTkZJR19GQ09FX01PRFVMRSkKKy8qCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB0byBob2xkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UKKyAqIGNvbmZpZ3VyZWQgdG8gcnVuIEZDb0UgcHJvdG9jb2wgc3RhY2suCisgKi8KK3N0cnVjdCBuZXRkZXZfZmNvZV9oYmFpbmZvIHsKKwljaGFyCW1hbnVmYWN0dXJlcls2NF07CisJY2hhcglzZXJpYWxfbnVtYmVyWzY0XTsKKwljaGFyCWhhcmR3YXJlX3ZlcnNpb25bNjRdOworCWNoYXIJZHJpdmVyX3ZlcnNpb25bNjRdOworCWNoYXIJb3B0aW9ucm9tX3ZlcnNpb25bNjRdOworCWNoYXIJZmlybXdhcmVfdmVyc2lvbls2NF07CisJY2hhcgltb2RlbFsyNTZdOworCWNoYXIJbW9kZWxfZGVzY3JpcHRpb25bMjU2XTsKK307CisjZW5kaWYKKwogLyoKICAqIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIG1hbmFnZW1lbnQgaG9va3MgZm9yIG5ldHdvcmsgZGV2aWNlcy4KICAqIFRoZSBmb2xsb3dpbmcgaG9va3MgY2FuIGJlIGRlZmluZWQ7IHVubGVzcyBub3RlZCBvdGhlcndpc2UsIHRoZXkgYXJlCkBAIC03NjcsMTEgKzgwOCwxMSBAQAogICoJMy4gVXBkYXRlIGRldi0+c3RhdHMgYXN5bmNocm9ub3VzbHkgYW5kIGF0b21pY2FsbHksIGFuZCBkZWZpbmUKICAqCSAgIG5laXRoZXIgb3BlcmF0aW9uLgogICoKLSAqIHZvaWQgKCpuZG9fdmxhbl9yeF9hZGRfdmlkKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpOworICogaW50ICgqbmRvX3ZsYW5fcnhfYWRkX3ZpZCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKTsKICAqCUlmIGRldmljZSBzdXBwb3J0IFZMQU4gZmlsdGVyaW5nIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX0ZJTFRFUikKICAqCXRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBWTEFOIGlkIGlzIHJlZ2lzdGVyZWQuCiAgKgotICogdm9pZCAoKm5kb192bGFuX3J4X2tpbGxfdmlkKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBzaG9ydCB2aWQpOworICogaW50ICgqbmRvX3ZsYW5fcnhfa2lsbF92aWQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCk7CiAgKglJZiBkZXZpY2Ugc3VwcG9ydCBWTEFOIGZpbHRlcmluZyAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpCiAgKgl0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgVkxBTiBpZCBpcyB1bnJlZ2lzdGVyZWQuCiAgKgpAQCAtODIzLDYgKzg2NCwxMyBAQAogICoJcGVyZm9ybSBuZWNlc3Nhcnkgc2V0dXAgYW5kIHJldHVybnMgMSB0byBpbmRpY2F0ZSB0aGUgZGV2aWNlIGlzIHNldCB1cAogICoJc3VjY2Vzc2Z1bGx5IHRvIHBlcmZvcm0gRERQIG9uIHRoaXMgSS9PLCBvdGhlcndpc2UgdGhpcyByZXR1cm5zIDAuCiAgKgorICogaW50ICgqbmRvX2Zjb2VfZ2V0X2hiYWluZm8pKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgKgkJCSAgICAgICBzdHJ1Y3QgbmV0ZGV2X2Zjb2VfaGJhaW5mbyAqaGJhaW5mbyk7CisgKglDYWxsZWQgd2hlbiB0aGUgRkNvRSBQcm90b2NvbCBzdGFjayB3YW50cyBpbmZvcm1hdGlvbiBvbiB0aGUgdW5kZXJseWluZworICoJZGV2aWNlLiBUaGlzIGluZm9ybWF0aW9uIGlzIHV0aWxpemVkIGJ5IHRoZSBGQ29FIHByb3RvY29sIHN0YWNrIHRvCisgKglyZWdpc3RlciBhdHRyaWJ1dGVzIHdpdGggRmliZXIgQ2hhbm5lbCBtYW5hZ2VtZW50IHNlcnZpY2UgYXMgcGVyIHRoZQorICoJRkMtR1MgRmFicmljIERldmljZSBNYW5hZ2VtZW50IEluZm9ybWF0aW9uKEZETUkpIHNwZWNpZmljYXRpb24uCisgKgogICogaW50ICgqbmRvX2Zjb2VfZ2V0X3d3bikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTY0ICp3d24sIGludCB0eXBlKTsKICAqCUNhbGxlZCB3aGVuIHRoZSB1bmRlcmx5aW5nIGRldmljZSB3YW50cyB0byBvdmVycmlkZSBkZWZhdWx0IFdvcmxkIFdpZGUKICAqCU5hbWUgKFdXTikgZ2VuZXJhdGlvbiBtZWNoYW5pc20gaW4gRkNvRSBwcm90b2NvbCBzdGFjayB0byBwYXNzIGl0cyBvd24KQEAgLTg0NSwxMiArODkzLDEzIEBACiAgKglDYWxsZWQgdG8gcmVsZWFzZSBwcmV2aW91c2x5IGVuc2xhdmVkIG5ldGRldi4KICAqCiAgKiAgICAgIEZlYXR1cmUvb2ZmbG9hZCBzZXR0aW5nIGZ1bmN0aW9ucy4KLSAqIHUzMiAoKm5kb19maXhfZmVhdHVyZXMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcyk7CisgKiBuZXRkZXZfZmVhdHVyZXNfdCAoKm5kb19maXhfZmVhdHVyZXMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisgKgkJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOwogICoJQWRqdXN0cyB0aGUgcmVxdWVzdGVkIGZlYXR1cmUgZmxhZ3MgYWNjb3JkaW5nIHRvIGRldmljZS1zcGVjaWZpYwogICoJY29uc3RyYWludHMsIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcgZmxhZ3MuIE11c3Qgbm90IG1vZGlmeQogICoJdGhlIGRldmljZSBzdGF0ZS4KICAqCi0gKiBpbnQgKCpuZG9fc2V0X2ZlYXR1cmVzKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZmVhdHVyZXMpOworICogaW50ICgqbmRvX3NldF9mZWF0dXJlcykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOwogICoJQ2FsbGVkIHRvIHVwZGF0ZSBkZXZpY2UgY29uZmlndXJhdGlvbiB0byBuZXcgZmVhdHVyZXMuIFBhc3NlZAogICoJZmVhdHVyZSBzZXQgbWlnaHQgYmUgbGVzcyB0aGFuIHdoYXQgd2FzIHJldHVybmVkIGJ5IG5kb19maXhfZmVhdHVyZXMoKSkuCiAgKglNdXN0IHJldHVybiA+MCBvciAtZXJybm8gaWYgaXQgY2hhbmdlZCBkZXYtPmZlYXR1cmVzIGl0c2VsZi4KQEAgLTg4NSw5ICs5MzQsOSBAQAogCQkJCQkJICAgICBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0b3JhZ2UpOwogCXN0cnVjdCBuZXRfZGV2aWNlX3N0YXRzKiAoKm5kb19nZXRfc3RhdHMpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCi0Jdm9pZAkJCSgqbmRvX3ZsYW5fcnhfYWRkX3ZpZCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlpbnQJCQkoKm5kb192bGFuX3J4X2FkZF92aWQpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCQkgICAgICAgdW5zaWduZWQgc2hvcnQgdmlkKTsKLQl2b2lkCQkJKCpuZG9fdmxhbl9yeF9raWxsX3ZpZCkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwlpbnQJCQkoKm5kb192bGFuX3J4X2tpbGxfdmlkKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJICAgICAgICB1bnNpZ25lZCBzaG9ydCB2aWQpOwogI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCiAJdm9pZCAgICAgICAgICAgICAgICAgICAgKCpuZG9fcG9sbF9jb250cm9sbGVyKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKQEAgLTkxMiw3ICs5NjEsNyBAQAogCWludAkJCSgqbmRvX2dldF92Zl9wb3J0KShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJICAgaW50IHZmLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAlpbnQJCQkoKm5kb19zZXR1cF90Yykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggdGMpOwotI2lmIGRlZmluZWQoQ09ORklHX0ZDT0UpIHx8IGRlZmluZWQoQ09ORklHX0ZDT0VfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0ZDT0UpCiAJaW50CQkJKCpuZG9fZmNvZV9lbmFibGUpKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCWludAkJCSgqbmRvX2Zjb2VfZGlzYWJsZSkoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAJaW50CQkJKCpuZG9fZmNvZV9kZHBfc2V0dXApKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC05MjUsOSArOTc0LDExIEBACiAJCQkJCQkgICAgICAgdTE2IHhpZCwKIAkJCQkJCSAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwKIAkJCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2djKTsKKwlpbnQJCQkoKm5kb19mY29lX2dldF9oYmFpbmZvKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQkJCXN0cnVjdCBuZXRkZXZfZmNvZV9oYmFpbmZvICpoYmFpbmZvKTsKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfTElCRkNPRSkgfHwgZGVmaW5lZChDT05GSUdfTElCRkNPRV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTElCRkNPRSkKICNkZWZpbmUgTkVUREVWX0ZDT0VfV1dOTiAwCiAjZGVmaW5lIE5FVERFVl9GQ09FX1dXUE4gMQogCWludAkJCSgqbmRvX2Zjb2VfZ2V0X3d3bikoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKQEAgLTk0NCwxMCArOTk1LDEyIEBACiAJCQkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKnNsYXZlX2Rldik7CiAJaW50CQkJKCpuZG9fZGVsX3NsYXZlKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJIHN0cnVjdCBuZXRfZGV2aWNlICpzbGF2ZV9kZXYpOwotCXUzMgkJCSgqbmRvX2ZpeF9mZWF0dXJlcykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJCSAgICB1MzIgZmVhdHVyZXMpOworCW5ldGRldl9mZWF0dXJlc190CSgqbmRvX2ZpeF9mZWF0dXJlcykoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJCSAgICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyk7CiAJaW50CQkJKCpuZG9fc2V0X2ZlYXR1cmVzKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJICAgIHUzMiBmZWF0dXJlcyk7CisJCQkJCQkgICAgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOworCWludAkJCSgqbmRvX25laWdoX2NvbnN0cnVjdCkoc3RydWN0IG5laWdoYm91ciAqbik7CisJdm9pZAkJCSgqbmRvX25laWdoX2Rlc3Ryb3kpKHN0cnVjdCBuZWlnaGJvdXIgKm4pOwogfTsKIAogLyoKQEAgLTk5Nyw5MSArMTA1MCwxMyBAQAogCXN0cnVjdCBsaXN0X2hlYWQJdW5yZWdfbGlzdDsKIAogCS8qIGN1cnJlbnRseSBhY3RpdmUgZGV2aWNlIGZlYXR1cmVzICovCi0JdTMyCQkJZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QJZmVhdHVyZXM7CiAJLyogdXNlci1jaGFuZ2VhYmxlIGZlYXR1cmVzICovCi0JdTMyCQkJaHdfZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QJaHdfZmVhdHVyZXM7CiAJLyogdXNlci1yZXF1ZXN0ZWQgZmVhdHVyZXMgKi8KLQl1MzIJCQl3YW50ZWRfZmVhdHVyZXM7CisJbmV0ZGV2X2ZlYXR1cmVzX3QJd2FudGVkX2ZlYXR1cmVzOwogCS8qIG1hc2sgb2YgZmVhdHVyZXMgaW5oZXJpdGFibGUgYnkgVkxBTiBkZXZpY2VzICovCi0JdTMyCQkJdmxhbl9mZWF0dXJlczsKLQotCS8qIE5ldCBkZXZpY2UgZmVhdHVyZSBiaXRzOyBpZiB5b3UgY2hhbmdlIHNvbWV0aGluZywKLQkgKiBhbHNvIHVwZGF0ZSBuZXRkZXZfZmVhdHVyZXNfc3RyaW5nc1tdIGluIGV0aHRvb2wuYyAqLwotCi0jZGVmaW5lIE5FVElGX0ZfU0cJCTEJLyogU2NhdHRlci9nYXRoZXIgSU8uICovCi0jZGVmaW5lIE5FVElGX0ZfSVBfQ1NVTQkJMgkvKiBDYW4gY2hlY2tzdW0gVENQL1VEUCBvdmVyIElQdjQuICovCi0jZGVmaW5lIE5FVElGX0ZfTk9fQ1NVTQkJNAkvKiBEb2VzIG5vdCByZXF1aXJlIGNoZWNrc3VtLiBGLmUuIGxvb3BhY2suICovCi0jZGVmaW5lIE5FVElGX0ZfSFdfQ1NVTQkJOAkvKiBDYW4gY2hlY2tzdW0gYWxsIHRoZSBwYWNrZXRzLiAqLwotI2RlZmluZSBORVRJRl9GX0lQVjZfQ1NVTQkxNgkvKiBDYW4gY2hlY2tzdW0gVENQL1VEUCBvdmVyIElQVjYgKi8KLSNkZWZpbmUgTkVUSUZfRl9ISUdIRE1BCQkzMgkvKiBDYW4gRE1BIHRvIGhpZ2ggbWVtb3J5LiAqLwotI2RlZmluZSBORVRJRl9GX0ZSQUdMSVNUCTY0CS8qIFNjYXR0ZXIvZ2F0aGVyIElPLiAqLwotI2RlZmluZSBORVRJRl9GX0hXX1ZMQU5fVFgJMTI4CS8qIFRyYW5zbWl0IFZMQU4gaHcgYWNjZWxlcmF0aW9uICovCi0jZGVmaW5lIE5FVElGX0ZfSFdfVkxBTl9SWAkyNTYJLyogUmVjZWl2ZSBWTEFOIGh3IGFjY2VsZXJhdGlvbiAqLwotI2RlZmluZSBORVRJRl9GX0hXX1ZMQU5fRklMVEVSCTUxMgkvKiBSZWNlaXZlIGZpbHRlcmluZyBvbiBWTEFOICovCi0jZGVmaW5lIE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VECTEwMjQJLyogRGV2aWNlIGNhbm5vdCBoYW5kbGUgVkxBTiBwYWNrZXRzICovCi0jZGVmaW5lIE5FVElGX0ZfR1NPCQkyMDQ4CS8qIEVuYWJsZSBzb2Z0d2FyZSBHU08uICovCi0jZGVmaW5lIE5FVElGX0ZfTExUWAkJNDA5NgkvKiBMb2NrTGVzcyBUWCAtIGRlcHJlY2F0ZWQuIFBsZWFzZSAqLwotCQkJCQkvKiBkbyBub3QgdXNlIExMVFggaW4gbmV3IGRyaXZlcnMgKi8KLSNkZWZpbmUgTkVUSUZfRl9ORVROU19MT0NBTAk4MTkyCS8qIERvZXMgbm90IGNoYW5nZSBuZXR3b3JrIG5hbWVzcGFjZXMgKi8KLSNkZWZpbmUgTkVUSUZfRl9HUk8JCTE2Mzg0CS8qIEdlbmVyaWMgcmVjZWl2ZSBvZmZsb2FkICovCi0jZGVmaW5lIE5FVElGX0ZfTFJPCQkzMjc2OAkvKiBsYXJnZSByZWNlaXZlIG9mZmxvYWQgKi8KLQotLyogdGhlIEdTT19NQVNLIHJlc2VydmVzIGJpdHMgMTYgdGhyb3VnaCAyMyAqLwotI2RlZmluZSBORVRJRl9GX0ZDT0VfQ1JDCSgxIDw8IDI0KSAvKiBGQ29FIENSQzMyICovCi0jZGVmaW5lIE5FVElGX0ZfU0NUUF9DU1VNCSgxIDw8IDI1KSAvKiBTQ1RQIGNoZWNrc3VtIG9mZmxvYWQgKi8KLSNkZWZpbmUgTkVUSUZfRl9GQ09FX01UVQkoMSA8PCAyNikgLyogU3VwcG9ydHMgbWF4IEZDb0UgTVRVLCAyMTU4IGJ5dGVzKi8KLSNkZWZpbmUgTkVUSUZfRl9OVFVQTEUJCSgxIDw8IDI3KSAvKiBOLXR1cGxlIGZpbHRlcnMgc3VwcG9ydGVkICovCi0jZGVmaW5lIE5FVElGX0ZfUlhIQVNICQkoMSA8PCAyOCkgLyogUmVjZWl2ZSBoYXNoaW5nIG9mZmxvYWQgKi8KLSNkZWZpbmUgTkVUSUZfRl9SWENTVU0JCSgxIDw8IDI5KSAvKiBSZWNlaXZlIGNoZWNrc3VtbWluZyBvZmZsb2FkICovCi0jZGVmaW5lIE5FVElGX0ZfTk9DQUNIRV9DT1BZCSgxIDw8IDMwKSAvKiBVc2Ugbm8tY2FjaGUgY29weWZyb211c2VyICovCi0jZGVmaW5lIE5FVElGX0ZfTE9PUEJBQ0sJKDEgPDwgMzEpIC8qIEVuYWJsZSBsb29wYmFjayAqLwotCi0JLyogU2VnbWVudGF0aW9uIG9mZmxvYWQgZmVhdHVyZXMgKi8KLSNkZWZpbmUgTkVUSUZfRl9HU09fU0hJRlQJMTYKLSNkZWZpbmUgTkVUSUZfRl9HU09fTUFTSwkweDAwZmYwMDAwCi0jZGVmaW5lIE5FVElGX0ZfVFNPCQkoU0tCX0dTT19UQ1BWNCA8PCBORVRJRl9GX0dTT19TSElGVCkKLSNkZWZpbmUgTkVUSUZfRl9VRk8JCShTS0JfR1NPX1VEUCA8PCBORVRJRl9GX0dTT19TSElGVCkKLSNkZWZpbmUgTkVUSUZfRl9HU09fUk9CVVNUCShTS0JfR1NPX0RPREdZIDw8IE5FVElGX0ZfR1NPX1NISUZUKQotI2RlZmluZSBORVRJRl9GX1RTT19FQ04JCShTS0JfR1NPX1RDUF9FQ04gPDwgTkVUSUZfRl9HU09fU0hJRlQpCi0jZGVmaW5lIE5FVElGX0ZfVFNPNgkJKFNLQl9HU09fVENQVjYgPDwgTkVUSUZfRl9HU09fU0hJRlQpCi0jZGVmaW5lIE5FVElGX0ZfRlNPCQkoU0tCX0dTT19GQ09FIDw8IE5FVElGX0ZfR1NPX1NISUZUKQotCi0JLyogRmVhdHVyZXMgdmFsaWQgZm9yIGV0aHRvb2wgdG8gY2hhbmdlICovCi0JLyogPSBhbGwgZGVmaW5lZCBtaW51cyBkcml2ZXIvZGV2aWNlLWNsYXNzLXJlbGF0ZWQgKi8KLSNkZWZpbmUgTkVUSUZfRl9ORVZFUl9DSEFOR0UJKE5FVElGX0ZfVkxBTl9DSEFMTEVOR0VEIHwgXAotCQkJCSAgTkVUSUZfRl9MTFRYIHwgTkVUSUZfRl9ORVROU19MT0NBTCkKLSNkZWZpbmUgTkVUSUZfRl9FVEhUT09MX0JJVFMJKDB4ZmYzZmZmZmYgJiB+TkVUSUZfRl9ORVZFUl9DSEFOR0UpCi0KLQkvKiBMaXN0IG9mIGZlYXR1cmVzIHdpdGggc29mdHdhcmUgZmFsbGJhY2tzLiAqLwotI2RlZmluZSBORVRJRl9GX0dTT19TT0ZUV0FSRQkoTkVUSUZfRl9UU08gfCBORVRJRl9GX1RTT19FQ04gfCBcCi0JCQkJIE5FVElGX0ZfVFNPNiB8IE5FVElGX0ZfVUZPKQotCi0KLSNkZWZpbmUgTkVUSUZfRl9HRU5fQ1NVTQkoTkVUSUZfRl9OT19DU1VNIHwgTkVUSUZfRl9IV19DU1VNKQotI2RlZmluZSBORVRJRl9GX1Y0X0NTVU0JCShORVRJRl9GX0dFTl9DU1VNIHwgTkVUSUZfRl9JUF9DU1VNKQotI2RlZmluZSBORVRJRl9GX1Y2X0NTVU0JCShORVRJRl9GX0dFTl9DU1VNIHwgTkVUSUZfRl9JUFY2X0NTVU0pCi0jZGVmaW5lIE5FVElGX0ZfQUxMX0NTVU0JKE5FVElGX0ZfVjRfQ1NVTSB8IE5FVElGX0ZfVjZfQ1NVTSkKLQotI2RlZmluZSBORVRJRl9GX0FMTF9UU08gCShORVRJRl9GX1RTTyB8IE5FVElGX0ZfVFNPNiB8IE5FVElGX0ZfVFNPX0VDTikKLQotI2RlZmluZSBORVRJRl9GX0FMTF9GQ09FCShORVRJRl9GX0ZDT0VfQ1JDIHwgTkVUSUZfRl9GQ09FX01UVSB8IFwKLQkJCQkgTkVUSUZfRl9GU08pCi0KLQkvKgotCSAqIElmIG9uZSBkZXZpY2Ugc3VwcG9ydHMgb25lIG9mIHRoZXNlIGZlYXR1cmVzLCB0aGVuIGVuYWJsZSB0aGVtCi0JICogZm9yIGFsbCBpbiBuZXRkZXZfaW5jcmVtZW50X2ZlYXR1cmVzLgotCSAqLwotI2RlZmluZSBORVRJRl9GX09ORV9GT1JfQUxMCShORVRJRl9GX0dTT19TT0ZUV0FSRSB8IE5FVElGX0ZfR1NPX1JPQlVTVCB8IFwKLQkJCQkgTkVUSUZfRl9TRyB8IE5FVElGX0ZfSElHSERNQSB8CQlcCi0JCQkJIE5FVElGX0ZfRlJBR0xJU1QgfCBORVRJRl9GX1ZMQU5fQ0hBTExFTkdFRCkKLQkvKgotCSAqIElmIG9uZSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IG9uZSBvZiB0aGVzZSBmZWF0dXJlcywgdGhlbiBkaXNhYmxlIGl0Ci0JICogZm9yIGFsbCBpbiBuZXRkZXZfaW5jcmVtZW50X2ZlYXR1cmVzLgotCSAqLwotI2RlZmluZSBORVRJRl9GX0FMTF9GT1JfQUxMCShORVRJRl9GX05PQ0FDSEVfQ09QWSB8IE5FVElGX0ZfRlNPKQotCi0JLyogY2hhbmdlYWJsZSBmZWF0dXJlcyB3aXRoIG5vIHNwZWNpYWwgaGFyZHdhcmUgcmVxdWlyZW1lbnRzICovCi0jZGVmaW5lIE5FVElGX0ZfU09GVF9GRUFUVVJFUwkoTkVUSUZfRl9HU08gfCBORVRJRl9GX0dSTykKKwluZXRkZXZfZmVhdHVyZXNfdAl2bGFuX2ZlYXR1cmVzOwogCiAJLyogSW50ZXJmYWNlIGluZGV4LiBVbmlxdWUgZGV2aWNlIGlkZW50aWZpZXIJKi8KIAlpbnQJCQlpZmluZGV4OwpAQCAtMTEzMiw2ICsxMTA3LDcgQEAKIAl1bnNpZ25lZCBjaGFyCQlwZXJtX2FkZHJbTUFYX0FERFJfTEVOXTsgLyogcGVybWFuZW50IGh3IGFkZHJlc3MgKi8KIAl1bnNpZ25lZCBjaGFyCQlhZGRyX2Fzc2lnbl90eXBlOyAvKiBodyBhZGRyZXNzIGFzc2lnbm1lbnQgdHlwZSAqLwogCXVuc2lnbmVkIGNoYXIJCWFkZHJfbGVuOwkvKiBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aAkqLworCXVuc2lnbmVkIGNoYXIJCW5laWdoX3ByaXZfbGVuOwogCXVuc2lnbmVkIHNob3J0ICAgICAgICAgIGRldl9pZDsJCS8qIGZvciBzaGFyZWQgbmV0d29yayBjYXJkcyAqLwogCiAJc3BpbmxvY2tfdAkJYWRkcl9saXN0X2xvY2s7CkBAIC0xMTQ0LDExICsxMTIwLDExIEBACiAKIAkvKiBQcm90b2NvbCBzcGVjaWZpYyBwb2ludGVycyAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUSkgfHwgZGVmaW5lZChDT05GSUdfVkxBTl84MDIxUV9NT0RVTEUpCi0Jc3RydWN0IHZsYW5fZ3JvdXAgX19yY3UJKnZsZ3JwOwkJLyogVkxBTiBncm91cCAqLworI2lmIElTX0VOQUJMRUQoQ09ORklHX1ZMQU5fODAyMVEpCisJc3RydWN0IHZsYW5faW5mbyBfX3JjdQkqdmxhbl9pbmZvOwkvKiBWTEFOIGluZm8gKi8KICNlbmRpZgotI2lmZGVmIENPTkZJR19ORVRfRFNBCi0Jdm9pZAkJCSpkc2FfcHRyOwkvKiBkc2Egc3BlY2lmaWMgZGF0YSAqLworI2lmIElTX0VOQUJMRUQoQ09ORklHX05FVF9EU0EpCisJc3RydWN0IGRzYV9zd2l0Y2hfdHJlZQkqZHNhX3B0cjsJLyogZHNhIHNwZWNpZmljIGRhdGEgKi8KICNlbmRpZgogCXZvaWQgCQkJKmF0YWxrX3B0cjsJLyogQXBwbGVUYWxrIGxpbmsgCSovCiAJc3RydWN0IGluX2RldmljZSBfX3JjdQkqaXBfcHRyOwkvKiBJUHY0IHNwZWNpZmljIGRhdGEJKi8KQEAgLTExODQsOSArMTE2MCwxMSBAQAogCiAJdW5zaWduZWQgY2hhcgkJYnJvYWRjYXN0W01BWF9BRERSX0xFTl07CS8qIGh3IGJjYXN0IGFkZAkqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfUlBTKSB8fCBkZWZpbmVkKENPTkZJR19YUFMpCisjaWZkZWYgQ09ORklHX1NZU0ZTCiAJc3RydWN0IGtzZXQJCSpxdWV1ZXNfa3NldDsKKyNlbmRpZgogCisjaWZkZWYgQ09ORklHX1JQUwogCXN0cnVjdCBuZXRkZXZfcnhfcXVldWUJKl9yeDsKIAogCS8qIE51bWJlciBvZiBSWCBxdWV1ZXMgYWxsb2NhdGVkIGF0IHJlZ2lzdGVyX25ldGRldigpIHRpbWUgKi8KQEAgLTEzMDgsMTAgKzEyODYsMTMgQEAKIAlzdHJ1Y3QgbmV0ZGV2X3RjX3R4cSB0Y190b190eHFbVENfTUFYX1FVRVVFXTsKIAl1OCBwcmlvX3RjX21hcFtUQ19CSVRNQVNLICsgMV07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19GQ09FKSB8fCBkZWZpbmVkKENPTkZJR19GQ09FX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19GQ09FKQogCS8qIG1heCBleGNoYW5nZSBpZCBmb3IgRkNvRSBMUk8gYnkgZGRwICovCiAJdW5zaWduZWQgaW50CQlmY29lX2RkcF94aWQ7CiAjZW5kaWYKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRQUklPX0NHUk9VUCkKKwlzdHJ1Y3QgbmV0cHJpb19tYXAgX19yY3UgKnByaW9tYXA7CisjZW5kaWYKIAkvKiBwaHkgZGV2aWNlIG1heSBhdHRhY2ggaXRzZWxmIGZvciBoYXJkd2FyZSB0aW1lc3RhbXBpbmcgKi8KIAlzdHJ1Y3QgcGh5X2RldmljZSAqcGh5ZGV2OwogCkBAIC0xNTE1LDcgKzE0OTYsNyBAQAogCQkJCQkgc3RydWN0IHBhY2tldF90eXBlICosCiAJCQkJCSBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKIAlzdHJ1Y3Qgc2tfYnVmZgkJKigqZ3NvX3NlZ21lbnQpKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQl1MzIgZmVhdHVyZXMpOworCQkJCQkJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOwogCWludAkJCSgqZ3NvX3NlbmRfY2hlY2spKHN0cnVjdCBza19idWZmICpza2IpOwogCXN0cnVjdCBza19idWZmCQkqKigqZ3JvX3JlY2VpdmUpKHN0cnVjdCBza19idWZmICoqaGVhZCwKIAkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwpAQCAtMTc4Myw3ICsxNzY0LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIG5ldGlmX3NjaGVkdWxlX3F1ZXVlKHN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSkKIHsKLQlpZiAoIXRlc3RfYml0KF9fUVVFVUVfU1RBVEVfWE9GRiwgJnR4cS0+c3RhdGUpKQorCWlmICghKHR4cS0+c3RhdGUgJiBRVUVVRV9TVEFURV9BTllfWE9GRikpCiAJCV9fbmV0aWZfc2NoZWR1bGUodHhxLT5xZGlzYyk7CiB9CiAKQEAgLTE3OTcsNyArMTc3OCw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZXRpZl90eF9zdGFydF9xdWV1ZShzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpkZXZfcXVldWUpCiB7Ci0JY2xlYXJfYml0KF9fUVVFVUVfU1RBVEVfWE9GRiwgJmRldl9xdWV1ZS0+c3RhdGUpOworCWNsZWFyX2JpdChfX1FVRVVFX1NUQVRFX0RSVl9YT0ZGLCAmZGV2X3F1ZXVlLT5zdGF0ZSk7CiB9CiAKIC8qKgpAQCAtMTgyOSw3ICsxODEwLDcgQEAKIAkJcmV0dXJuOwogCX0KICNlbmRpZgotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoX19RVUVVRV9TVEFURV9YT0ZGLCAmZGV2X3F1ZXVlLT5zdGF0ZSkpCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChfX1FVRVVFX1NUQVRFX0RSVl9YT0ZGLCAmZGV2X3F1ZXVlLT5zdGF0ZSkpCiAJCV9fbmV0aWZfc2NoZWR1bGUoZGV2X3F1ZXVlLT5xZGlzYyk7CiB9CiAKQEAgLTE4NjEsNyArMTg0Miw3IEBACiAJCXByX2luZm8oIm5ldGlmX3N0b3BfcXVldWUoKSBjYW5ub3QgYmUgY2FsbGVkIGJlZm9yZSByZWdpc3Rlcl9uZXRkZXYoKVxuIik7CiAJCXJldHVybjsKIAl9Ci0Jc2V0X2JpdChfX1FVRVVFX1NUQVRFX1hPRkYsICZkZXZfcXVldWUtPnN0YXRlKTsKKwlzZXRfYml0KF9fUVVFVUVfU1RBVEVfRFJWX1hPRkYsICZkZXZfcXVldWUtPnN0YXRlKTsKIH0KIAogLyoqCkBAIC0xODg4LDcgKzE4NjksNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKGNvbnN0IHN0cnVjdCBuZXRkZXZfcXVldWUgKmRldl9xdWV1ZSkKIHsKLQlyZXR1cm4gdGVzdF9iaXQoX19RVUVVRV9TVEFURV9YT0ZGLCAmZGV2X3F1ZXVlLT5zdGF0ZSk7CisJcmV0dXJuIHRlc3RfYml0KF9fUVVFVUVfU1RBVEVfRFJWX1hPRkYsICZkZXZfcXVldWUtPnN0YXRlKTsKIH0KIAogLyoqCkBAIC0xOTAyLDkgKzE4ODMsNjggQEAKIAlyZXR1cm4gbmV0aWZfdHhfcXVldWVfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgMCkpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBuZXRpZl90eF9xdWV1ZV9mcm96ZW5fb3Jfc3RvcHBlZChjb25zdCBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpkZXZfcXVldWUpCitzdGF0aWMgaW5saW5lIGludCBuZXRpZl94bWl0X3N0b3BwZWQoY29uc3Qgc3RydWN0IG5ldGRldl9xdWV1ZSAqZGV2X3F1ZXVlKQogewotCXJldHVybiBkZXZfcXVldWUtPnN0YXRlICYgUVVFVUVfU1RBVEVfWE9GRl9PUl9GUk9aRU47CisJcmV0dXJuIGRldl9xdWV1ZS0+c3RhdGUgJiBRVUVVRV9TVEFURV9BTllfWE9GRjsKK30KKworc3RhdGljIGlubGluZSBpbnQgbmV0aWZfeG1pdF9mcm96ZW5fb3Jfc3RvcHBlZChjb25zdCBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpkZXZfcXVldWUpCit7CisJcmV0dXJuIGRldl9xdWV1ZS0+c3RhdGUgJiBRVUVVRV9TVEFURV9BTllfWE9GRl9PUl9GUk9aRU47Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRkZXZfdHhfc2VudF9xdWV1ZShzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpkZXZfcXVldWUsCisJCQkJCXVuc2lnbmVkIGludCBieXRlcykKK3sKKyNpZmRlZiBDT05GSUdfQlFMCisJZHFsX3F1ZXVlZCgmZGV2X3F1ZXVlLT5kcWwsIGJ5dGVzKTsKKwlpZiAodW5saWtlbHkoZHFsX2F2YWlsKCZkZXZfcXVldWUtPmRxbCkgPCAwKSkgeworCQlzZXRfYml0KF9fUVVFVUVfU1RBVEVfU1RBQ0tfWE9GRiwgJmRldl9xdWV1ZS0+c3RhdGUpOworCQlpZiAodW5saWtlbHkoZHFsX2F2YWlsKCZkZXZfcXVldWUtPmRxbCkgPj0gMCkpCisJCQljbGVhcl9iaXQoX19RVUVVRV9TVEFURV9TVEFDS19YT0ZGLAorCQkJICAgICZkZXZfcXVldWUtPnN0YXRlKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldGRldl9zZW50X3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBieXRlcykKK3sKKwluZXRkZXZfdHhfc2VudF9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgMCksIGJ5dGVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldGRldl90eF9jb21wbGV0ZWRfcXVldWUoc3RydWN0IG5ldGRldl9xdWV1ZSAqZGV2X3F1ZXVlLAorCQkJCQkgICAgIHVuc2lnbmVkIHBrdHMsIHVuc2lnbmVkIGJ5dGVzKQoreworI2lmZGVmIENPTkZJR19CUUwKKwlpZiAobGlrZWx5KGJ5dGVzKSkgeworCQlkcWxfY29tcGxldGVkKCZkZXZfcXVldWUtPmRxbCwgYnl0ZXMpOworCQlpZiAodW5saWtlbHkodGVzdF9iaXQoX19RVUVVRV9TVEFURV9TVEFDS19YT0ZGLAorCQkgICAgJmRldl9xdWV1ZS0+c3RhdGUpICYmCisJCSAgICBkcWxfYXZhaWwoJmRldl9xdWV1ZS0+ZHFsKSA+PSAwKSkgeworCQkJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChfX1FVRVVFX1NUQVRFX1NUQUNLX1hPRkYsCisJCQkgICAgICZkZXZfcXVldWUtPnN0YXRlKSkKKwkJCQluZXRpZl9zY2hlZHVsZV9xdWV1ZShkZXZfcXVldWUpOworCQl9CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZXRkZXZfY29tcGxldGVkX3F1ZXVlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJCSAgdW5zaWduZWQgcGt0cywgdW5zaWduZWQgYnl0ZXMpCit7CisJbmV0ZGV2X3R4X2NvbXBsZXRlZF9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgMCksIHBrdHMsIGJ5dGVzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldGRldl90eF9yZXNldF9xdWV1ZShzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpxKQoreworI2lmZGVmIENPTkZJR19CUUwKKwlkcWxfcmVzZXQoJnEtPmRxbCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5ldGRldl9yZXNldF9xdWV1ZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X3F1ZXVlKQoreworCW5ldGRldl90eF9yZXNldF9xdWV1ZShuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldl9xdWV1ZSwgMCkpOwogfQogCiAvKioKQEAgLTE5OTEsNyArMjAzMSw3IEBACiAJaWYgKG5ldHBvbGxfdHJhcCgpKQogCQlyZXR1cm47CiAjZW5kaWYKLQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KF9fUVVFVUVfU1RBVEVfWE9GRiwgJnR4cS0+c3RhdGUpKQorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoX19RVUVVRV9TVEFURV9EUlZfWE9GRiwgJnR4cS0+c3RhdGUpKQogCQlfX25ldGlmX3NjaGVkdWxlKHR4cS0+cWRpc2MpOwogfQogCkBAIC0yNTIwLDcgKzI1NjAsOCBAQAogZXh0ZXJuIGludCBuZXRkZXZfc2V0X2JvbmRfbWFzdGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgbmV0X2RldmljZSAqbWFzdGVyKTsKIGV4dGVybiBpbnQgc2tiX2NoZWNrc3VtX2hlbHAoc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gc3RydWN0IHNrX2J1ZmYgKnNrYl9nc29fc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZmVhdHVyZXMpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2JfZ3NvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyk7CiAjaWZkZWYgQ09ORklHX0JVRwogZXh0ZXJuIHZvaWQgbmV0ZGV2X3J4X2NzdW1fZmF1bHQoc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAjZWxzZQpAQCAtMjUzNiw2ICsyNTc3LDggQEAKIGV4dGVybiB2b2lkICpkZXZfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKnBvcyk7CiBleHRlcm4gdm9pZCAqZGV2X3NlcV9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2LCBsb2ZmX3QgKnBvcyk7CiBleHRlcm4gdm9pZCBkZXZfc2VxX3N0b3Aoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpOworZXh0ZXJuIGludCBkZXZfc2VxX29wZW5fb3BzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgIGNvbnN0IHN0cnVjdCBzZXFfb3BlcmF0aW9ucyAqb3BzKTsKICNlbmRpZgogCiBleHRlcm4gaW50IG5ldGRldl9jbGFzc19jcmVhdGVfZmlsZShzdHJ1Y3QgY2xhc3NfYXR0cmlidXRlICpjbGFzc19hdHRyKTsKQEAgLTI1NDcsMTEgKzI1OTAsMTMgQEAKIAogZXh0ZXJuIHZvaWQgbGlua3dhdGNoX3J1bl9xdWV1ZSh2b2lkKTsKIAotc3RhdGljIGlubGluZSB1MzIgbmV0ZGV2X2dldF93YW50ZWRfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgbmV0ZGV2X2ZlYXR1cmVzX3QgbmV0ZGV2X2dldF93YW50ZWRfZmVhdHVyZXMoCisJc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gKGRldi0+ZmVhdHVyZXMgJiB+ZGV2LT5od19mZWF0dXJlcykgfCBkZXYtPndhbnRlZF9mZWF0dXJlczsKIH0KLXUzMiBuZXRkZXZfaW5jcmVtZW50X2ZlYXR1cmVzKHUzMiBhbGwsIHUzMiBvbmUsIHUzMiBtYXNrKTsKK25ldGRldl9mZWF0dXJlc190IG5ldGRldl9pbmNyZW1lbnRfZmVhdHVyZXMobmV0ZGV2X2ZlYXR1cmVzX3QgYWxsLAorCW5ldGRldl9mZWF0dXJlc190IG9uZSwgbmV0ZGV2X2ZlYXR1cmVzX3QgbWFzayk7CiBpbnQgX19uZXRkZXZfdXBkYXRlX2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCBuZXRkZXZfdXBkYXRlX2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogdm9pZCBuZXRkZXZfY2hhbmdlX2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwpAQCAtMjU1OSwyMSArMjYwNCwzMSBAQAogdm9pZCBuZXRpZl9zdGFja2VkX3RyYW5zZmVyX29wZXJzdGF0ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqcm9vdGRldiwKIAkJCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldik7CiAKLXUzMiBuZXRpZl9za2JfZmVhdHVyZXMoc3RydWN0IHNrX2J1ZmYgKnNrYik7CituZXRkZXZfZmVhdHVyZXNfdCBuZXRpZl9za2JfZmVhdHVyZXMoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5ldF9nc29fb2sodTMyIGZlYXR1cmVzLCBpbnQgZ3NvX3R5cGUpCitzdGF0aWMgaW5saW5lIGludCBuZXRfZ3NvX29rKG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzLCBpbnQgZ3NvX3R5cGUpCiB7Ci0JaW50IGZlYXR1cmUgPSBnc29fdHlwZSA8PCBORVRJRl9GX0dTT19TSElGVDsKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlID0gZ3NvX3R5cGUgPDwgTkVUSUZfRl9HU09fU0hJRlQ7CisKKwkvKiBjaGVjayBmbGFncyBjb3JyZXNwb25kZW5jZSAqLworCUJVSUxEX0JVR19PTihTS0JfR1NPX1RDUFY0ICAgIT0gKE5FVElGX0ZfVFNPID4+IE5FVElGX0ZfR1NPX1NISUZUKSk7CisJQlVJTERfQlVHX09OKFNLQl9HU09fVURQICAgICAhPSAoTkVUSUZfRl9VRk8gPj4gTkVUSUZfRl9HU09fU0hJRlQpKTsKKwlCVUlMRF9CVUdfT04oU0tCX0dTT19ET0RHWSAgICE9IChORVRJRl9GX0dTT19ST0JVU1QgPj4gTkVUSUZfRl9HU09fU0hJRlQpKTsKKwlCVUlMRF9CVUdfT04oU0tCX0dTT19UQ1BfRUNOICE9IChORVRJRl9GX1RTT19FQ04gPj4gTkVUSUZfRl9HU09fU0hJRlQpKTsKKwlCVUlMRF9CVUdfT04oU0tCX0dTT19UQ1BWNiAgICE9IChORVRJRl9GX1RTTzYgPj4gTkVUSUZfRl9HU09fU0hJRlQpKTsKKwlCVUlMRF9CVUdfT04oU0tCX0dTT19GQ09FICAgICE9IChORVRJRl9GX0ZTTyA+PiBORVRJRl9GX0dTT19TSElGVCkpOworCiAJcmV0dXJuIChmZWF0dXJlcyAmIGZlYXR1cmUpID09IGZlYXR1cmU7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHNrYl9nc29fb2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGZlYXR1cmVzKQorc3RhdGljIGlubGluZSBpbnQgc2tiX2dzb19vayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlyZXR1cm4gbmV0X2dzb19vayhmZWF0dXJlcywgc2tiX3NoaW5mbyhza2IpLT5nc29fdHlwZSkgJiYKIAkgICAgICAgKCFza2JfaGFzX2ZyYWdfbGlzdChza2IpIHx8IChmZWF0dXJlcyAmIE5FVElGX0ZfRlJBR0xJU1QpKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbmV0aWZfbmVlZHNfZ3NvKHN0cnVjdCBza19idWZmICpza2IsIGludCBmZWF0dXJlcykKK3N0YXRpYyBpbmxpbmUgaW50IG5ldGlmX25lZWRzX2dzbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXJldHVybiBza2JfaXNfZ3NvKHNrYikgJiYgKCFza2JfZ3NvX29rKHNrYiwgZmVhdHVyZXMpIHx8CiAJCXVubGlrZWx5KHNrYi0+aXBfc3VtbWVkICE9IENIRUNLU1VNX1BBUlRJQUwpKTsKQEAgLTI1OTIsMjIgKzI2NDcsNiBAQAogCiBleHRlcm4gc3RydWN0IHBlcm5ldF9vcGVyYXRpb25zIF9fbmV0X2luaXRkYXRhIGxvb3BiYWNrX25ldF9vcHM7CiAKLXN0YXRpYyBpbmxpbmUgdTMyIGRldl9ldGh0b29sX2dldF9yeF9jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1JYQ1NVTSkKLQkJcmV0dXJuIDE7Ci0JaWYgKCFkZXYtPmV0aHRvb2xfb3BzIHx8ICFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcnhfY3N1bSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGRldi0+ZXRodG9vbF9vcHMtPmdldF9yeF9jc3VtKGRldik7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGRldl9ldGh0b29sX2dldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCWlmICghZGV2LT5ldGh0b29sX29wcyB8fCAhZGV2LT5ldGh0b29sX29wcy0+Z2V0X2ZsYWdzKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gZGV2LT5ldGh0b29sX29wcy0+Z2V0X2ZsYWdzKGRldik7Ci19Ci0KIC8qIExvZ2dpbmcsIGRlYnVnZ2luZyBhbmQgdHJvdWJsZXNob290aW5nL2RpYWdub3N0aWMgaGVscGVycy4gKi8KIAogLyogbmV0ZGV2X3ByaW50ayBoZWxwZXJzLCBzaW1pbGFyIHRvIGRldl9wcmludGsgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci5oCmluZGV4IDg1N2Y1MDIuLmI4MDkyNjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIuaApAQCAtMTYyLDYgKzE2MiwyNCBAQAogCiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBuZl9ob29rc1tORlBST1RPX05VTVBST1RPXVtORl9NQVhfSE9PS1NdOwogCisjaWYgZGVmaW5lZChDT05GSUdfSlVNUF9MQUJFTCkKKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CitleHRlcm4gc3RydWN0IGp1bXBfbGFiZWxfa2V5IG5mX2hvb2tzX25lZWRlZFtORlBST1RPX05VTVBST1RPXVtORl9NQVhfSE9PS1NdOworc3RhdGljIGlubGluZSBib29sIG5mX2hvb2tzX2FjdGl2ZSh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2spCit7CisJaWYgKF9fYnVpbHRpbl9jb25zdGFudF9wKHBmKSAmJgorCSAgICBfX2J1aWx0aW5fY29uc3RhbnRfcChob29rKSkKKwkJcmV0dXJuIHN0YXRpY19icmFuY2goJm5mX2hvb2tzX25lZWRlZFtwZl1baG9va10pOworCisJcmV0dXJuICFsaXN0X2VtcHR5KCZuZl9ob29rc1twZl1baG9va10pOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCBuZl9ob29rc19hY3RpdmUodV9pbnQ4X3QgcGYsIHVuc2lnbmVkIGludCBob29rKQoreworCXJldHVybiAhbGlzdF9lbXB0eSgmbmZfaG9va3NbcGZdW2hvb2tdKTsKK30KKyNlbmRpZgorCiBpbnQgbmZfaG9va19zbG93KHVfaW50OF90IHBmLCB1bnNpZ25lZCBpbnQgaG9vaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJIHN0cnVjdCBuZXRfZGV2aWNlICppbmRldiwgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKIAkJIGludCAoKm9rZm4pKHN0cnVjdCBza19idWZmICopLCBpbnQgdGhyZXNoKTsKQEAgLTE3OSwxMSArMTk3LDkgQEAKIAkJCQkgc3RydWN0IG5ldF9kZXZpY2UgKm91dGRldiwKIAkJCQkgaW50ICgqb2tmbikoc3RydWN0IHNrX2J1ZmYgKiksIGludCB0aHJlc2gpCiB7Ci0jaWZuZGVmIENPTkZJR19ORVRGSUxURVJfREVCVUcKLQlpZiAobGlzdF9lbXB0eSgmbmZfaG9va3NbcGZdW2hvb2tdKSkKLQkJcmV0dXJuIDE7Ci0jZW5kaWYKLQlyZXR1cm4gbmZfaG9va19zbG93KHBmLCBob29rLCBza2IsIGluZGV2LCBvdXRkZXYsIG9rZm4sIHRocmVzaCk7CisJaWYgKG5mX2hvb2tzX2FjdGl2ZShwZiwgaG9vaykpCisJCXJldHVybiBuZl9ob29rX3Nsb3cocGYsIGhvb2ssIHNrYiwgaW5kZXYsIG91dGRldiwgb2tmbiwgdGhyZXNoKTsKKwlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgbmZfaG9vayh1X2ludDhfdCBwZiwgdW5zaWduZWQgaW50IGhvb2ssIHN0cnVjdCBza19idWZmICpza2IsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9LYnVpbGQKaW5kZXggYTFiNDEwYy4uZTE0NGY1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvS2J1aWxkCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL0tidWlsZApAQCAtNSw3ICs1LDkgQEAKIGhlYWRlci15ICs9IG5mX2Nvbm50cmFja19zY3RwLmgKIGhlYWRlci15ICs9IG5mX2Nvbm50cmFja190Y3AuaAogaGVhZGVyLXkgKz0gbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oCitoZWFkZXIteSArPSBuZl9uYXQuaAogaGVhZGVyLXkgKz0gbmZuZXRsaW5rLmgKK2hlYWRlci15ICs9IG5mbmV0bGlua19hY2N0LmgKIGhlYWRlci15ICs9IG5mbmV0bGlua19jb21wYXQuaAogaGVhZGVyLXkgKz0gbmZuZXRsaW5rX2Nvbm50cmFjay5oCiBoZWFkZXIteSArPSBuZm5ldGxpbmtfbG9nLmgKQEAgLTIxLDYgKzIzLDcgQEAKIGhlYWRlci15ICs9IHh0X0lETEVUSU1FUi5oCiBoZWFkZXIteSArPSB4dF9MRUQuaAogaGVhZGVyLXkgKz0geHRfTUFSSy5oCitoZWFkZXIteSArPSB4dF9uZmFjY3QuaAogaGVhZGVyLXkgKz0geHRfTkZMT0cuaAogaGVhZGVyLXkgKz0geHRfTkZRVUVVRS5oCiBoZWFkZXIteSArPSB4dF9SQVRFRVNULmgKQEAgLTQwLDYgKzQzLDcgQEAKIGhlYWRlci15ICs9IHh0X2RjY3AuaAogaGVhZGVyLXkgKz0geHRfZGV2Z3JvdXAuaAogaGVhZGVyLXkgKz0geHRfZHNjcC5oCitoZWFkZXIteSArPSB4dF9lY24uaAogaGVhZGVyLXkgKz0geHRfZXNwLmgKIGhlYWRlci15ICs9IHh0X2hhc2hsaW1pdC5oCiBoZWFkZXIteSArPSB4dF9oZWxwZXIuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvbW1vbi5oCmluZGV4IDBkM2RkNjYuLjllM2EyODMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb21tb24uaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29tbW9uLmgKQEAgLTgzLDYgKzgzLDEwIEBACiAJLyogQ29ubnRyYWNrIGlzIGEgZmFrZSB1bnRyYWNrZWQgZW50cnkgKi8KIAlJUFNfVU5UUkFDS0VEX0JJVCA9IDEyLAogCUlQU19VTlRSQUNLRUQgPSAoMSA8PCBJUFNfVU5UUkFDS0VEX0JJVCksCisKKwkvKiBDb25udHJhY2sgaGFzIGEgdXNlcnNwYWNlIGhlbHBlci4gKi8KKwlJUFNfVVNFUlNQQUNFX0hFTFBFUl9CSVQgPSAxMywKKwlJUFNfVVNFUlNQQUNFX0hFTFBFUiA9ICgxIDw8IElQU19VU0VSU1BBQ0VfSEVMUEVSX0JJVCksCiB9OwogCiAvKiBDb25uZWN0aW9uIHRyYWNraW5nIGV2ZW50IHR5cGVzICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGVfY29tbW9uLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGVfY29tbW9uLmgKaW5kZXggMmVhMjJiMC4uMmY2YmJjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlX2NvbW1vbi5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaApAQCAtNyw2ICs3LDMzIEBACiAJSVBfQ1RfRElSX01BWAogfTsKIAorLyogVGhlIHByb3RvY29sLXNwZWNpZmljIG1hbmlwdWxhYmxlIHBhcnRzIG9mIHRoZSB0dXBsZTogYWx3YXlzIGluCisgKiBuZXR3b3JrIG9yZGVyCisgKi8KK3VuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8geworCS8qIEFkZCBvdGhlciBwcm90b2NvbHMgaGVyZS4gKi8KKwlfX2JlMTYgYWxsOworCisJc3RydWN0IHsKKwkJX19iZTE2IHBvcnQ7CisJfSB0Y3A7CisJc3RydWN0IHsKKwkJX19iZTE2IHBvcnQ7CisJfSB1ZHA7CisJc3RydWN0IHsKKwkJX19iZTE2IGlkOworCX0gaWNtcDsKKwlzdHJ1Y3QgeworCQlfX2JlMTYgcG9ydDsKKwl9IGRjY3A7CisJc3RydWN0IHsKKwkJX19iZTE2IHBvcnQ7CisJfSBzY3RwOworCXN0cnVjdCB7CisJCV9fYmUxNiBrZXk7CS8qIEdSRSBrZXkgaXMgMzJiaXQsIFBQdFAgb25seSB1c2VzIDE2Yml0ICovCisJfSBncmU7Cit9OworCiAjZGVmaW5lIENUSU5GTzJESVIoY3RpbmZvKSAoKGN0aW5mbykgPj0gSVBfQ1RfSVNfUkVQTFkgPyBJUF9DVF9ESVJfUkVQTFkgOiBJUF9DVF9ESVJfT1JJR0lOQUwpCiAKICNlbmRpZiAvKiBfTkZfQ09OTlRSQUNLX1RVUExFX0NPTU1PTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9uYXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mX25hdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZjJkMTMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZl9uYXQuaApAQCAtMCwwICsxLDI1IEBACisjaWZuZGVmIF9ORVRGSUxURVJfTkZfTkFUX0gKKyNkZWZpbmUgX05FVEZJTFRFUl9ORl9OQVRfSAorCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZV9jb21tb24uaD4KKworI2RlZmluZSBORl9OQVRfUkFOR0VfTUFQX0lQUwkJMQorI2RlZmluZSBORl9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVECTIKKyNkZWZpbmUgTkZfTkFUX1JBTkdFX1BST1RPX1JBTkRPTQk0CisjZGVmaW5lIE5GX05BVF9SQU5HRV9QRVJTSVNURU5UCQk4CisKK3N0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSB7CisJdW5zaWduZWQgaW50CQkJZmxhZ3M7CisJX19iZTMyCQkJCW1pbl9pcDsKKwlfX2JlMzIJCQkJbWF4X2lwOworCXVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8JbWluOworCXVuaW9uIG5mX2Nvbm50cmFja19tYW5fcHJvdG8JbWF4OworfTsKKworc3RydWN0IG5mX25hdF9pcHY0X211bHRpX3JhbmdlX2NvbXBhdCB7CisJdW5zaWduZWQgaW50CQkJcmFuZ2VzaXplOworCXN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZQlyYW5nZVsxXTsKK307CisKKyNlbmRpZiAvKiBfTkVURklMVEVSX05GX05BVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmsuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCmluZGV4IDc0ZDMzODYuLmI2NDQ1NGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oCkBAIC00OCw3ICs0OCw4IEBACiAjZGVmaW5lIE5GTkxfU1VCU1lTX1VMT0cJCTQKICNkZWZpbmUgTkZOTF9TVUJTWVNfT1NGCQkJNQogI2RlZmluZSBORk5MX1NVQlNZU19JUFNFVAkJNgotI2RlZmluZSBORk5MX1NVQlNZU19DT1VOVAkJNworI2RlZmluZSBORk5MX1NVQlNZU19BQ0NUCQk3CisjZGVmaW5lIE5GTkxfU1VCU1lTX0NPVU5UCQk4CiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDI3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX05GTkxfQUNDVF9IXworI2RlZmluZSBfTkZOTF9BQ0NUX0hfCisKKyNpZm5kZWYgTkZBQ0NUX05BTUVfTUFYCisjZGVmaW5lIE5GQUNDVF9OQU1FX01BWAkJMzIKKyNlbmRpZgorCitlbnVtIG5mbmxfYWNjdF9tc2dfdHlwZXMgeworCU5GTkxfTVNHX0FDQ1RfTkVXLAorCU5GTkxfTVNHX0FDQ1RfR0VULAorCU5GTkxfTVNHX0FDQ1RfR0VUX0NUUlpFUk8sCisJTkZOTF9NU0dfQUNDVF9ERUwsCisJTkZOTF9NU0dfQUNDVF9NQVgKK307CisKK2VudW0gbmZubF9hY2N0X3R5cGUgeworCU5GQUNDVF9VTlNQRUMsCisJTkZBQ0NUX05BTUUsCisJTkZBQ0NUX1BLVFMsCisJTkZBQ0NUX0JZVEVTLAorCU5GQUNDVF9VU0UsCisJX19ORkFDQ1RfTUFYCit9OworI2RlZmluZSBORkFDQ1RfTUFYIChfX05GQUNDVF9NQVggLSAxKQorCisjaWZkZWYgX19LRVJORUxfXworCitzdHJ1Y3QgbmZfYWNjdDsKKworZXh0ZXJuIHN0cnVjdCBuZl9hY2N0ICpuZm5sX2FjY3RfZmluZF9nZXQoY29uc3QgY2hhciAqZmlsdGVyX25hbWUpOworZXh0ZXJuIHZvaWQgbmZubF9hY2N0X3B1dChzdHJ1Y3QgbmZfYWNjdCAqYWNjdCk7CitleHRlcm4gdm9pZCBuZm5sX2FjY3RfdXBkYXRlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9hY2N0ICpuZmFjY3QpOworCisjZW5kaWYgLyogX19LRVJORUxfXyAqLworCisjZW5kaWYgLyogX05GTkxfQUNDVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DVC5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfQ1QuaAppbmRleCBiNTZlNzY4Li42MzkwZjA5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9DVC5oCisrKyBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyL3h0X0NULmgKQEAgLTMsNyArMyw4IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogCi0jZGVmaW5lIFhUX0NUX05PVFJBQ0sJMHgxCisjZGVmaW5lIFhUX0NUX05PVFJBQ0sJCTB4MQorI2RlZmluZSBYVF9DVF9VU0VSU1BBQ0VfSEVMUEVSCTB4MgogCiBzdHJ1Y3QgeHRfY3RfdGFyZ2V0X2luZm8gewogCV9fdTE2IGZsYWdzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZWNuLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9lY24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTU4ZmNhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfZWNuLmgKQEAgLTAsMCArMSwzNSBAQAorLyogaXB0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgRUNOIGhlYWRlciBpbiBJUHY0IGFuZCBUQ1AgaGVhZGVyCisgKgorICogKEMpIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIEdOVSBHUEwgdjIsIDE5OTEKKyAqIAorICogaXB0X2Vjbi5oLHYgMS40IDIwMDIvMDgvMDUgMTk6Mzk6MDAgbGFmb3JnZSBFeHAKKyovCisjaWZuZGVmIF9YVF9FQ05fSAorI2RlZmluZSBfWFRfRUNOX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X2RzY3AuaD4KKworI2RlZmluZSBYVF9FQ05fSVBfTUFTSwkoflhUX0RTQ1BfTUFTSykKKworI2RlZmluZSBYVF9FQ05fT1BfTUFUQ0hfSVAJMHgwMQorI2RlZmluZSBYVF9FQ05fT1BfTUFUQ0hfRUNFCTB4MTAKKyNkZWZpbmUgWFRfRUNOX09QX01BVENIX0NXUgkweDIwCisKKyNkZWZpbmUgWFRfRUNOX09QX01BVENIX01BU0sJMHhjZQorCisvKiBtYXRjaCBpbmZvICovCitzdHJ1Y3QgeHRfZWNuX2luZm8geworCV9fdTggb3BlcmF0aW9uOworCV9fdTggaW52ZXJ0OworCV9fdTggaXBfZWN0OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCV9fdTggZWN0OworCQl9IHRjcDsKKwl9IHByb3RvOworfTsKKworI2VuZGlmIC8qIF9YVF9FQ05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbmZhY2N0LmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9uZmFjY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTE5YzhhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfbmZhY2N0LmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBfWFRfTkZBQ0NUX01BVENIX0gKKyNkZWZpbmUgX1hUX05GQUNDVF9NQVRDSF9ICisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuaD4KKworc3RydWN0IG5mX2FjY3Q7CisKK3N0cnVjdCB4dF9uZmFjY3RfbWF0Y2hfaW5mbyB7CisJY2hhcgkJbmFtZVtORkFDQ1RfTkFNRV9NQVhdOworCXN0cnVjdCBuZl9hY2N0CSpuZmFjY3Q7Cit9OworCisjZW5kaWYgLyogX1hUX05GQUNDVF9NQVRDSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlci94dF9ycGZpbHRlci5oIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcnBmaWx0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzU4ZDRmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXIveHRfcnBmaWx0ZXIuaApAQCAtMCwwICsxLDIzIEBACisjaWZuZGVmIF9YVF9SUEFUSF9ICisjZGVmaW5lIF9YVF9SUEFUSF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitlbnVtIHsKKwlYVF9SUEZJTFRFUl9MT09TRSA9IDEgPDwgMCwKKwlYVF9SUEZJTFRFUl9WQUxJRF9NQVJLID0gMSA8PCAxLAorCVhUX1JQRklMVEVSX0FDQ0VQVF9MT0NBTCA9IDEgPDwgMiwKKwlYVF9SUEZJTFRFUl9JTlZFUlQgPSAxIDw8IDMsCisjaWZkZWYgX19LRVJORUxfXworCVhUX1JQRklMVEVSX09QVElPTl9NQVNLID0gWFRfUlBGSUxURVJfTE9PU0UgfAorCQkJCSAgWFRfUlBGSUxURVJfVkFMSURfTUFSSyB8CisJCQkJICBYVF9SUEZJTFRFUl9BQ0NFUFRfTE9DQUwgfAorCQkJCSAgWFRfUlBGSUxURVJfSU5WRVJULAorI2VuZGlmCit9OworCitzdHJ1Y3QgeHRfcnBmaWx0ZXJfaW5mbyB7CisJX191OCBmbGFnczsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9LYnVpbGQgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L0tidWlsZAppbmRleCBjM2I0NTQ4Li5mOTkzMGM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L0tidWlsZAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L0tidWlsZApAQCAtMTIsNCArMTIsMyBAQAogaGVhZGVyLXkgKz0gaXB0X2Vjbi5oCiBoZWFkZXIteSArPSBpcHRfcmVhbG0uaAogaGVhZGVyLXkgKz0gaXB0X3R0bC5oCi1oZWFkZXIteSArPSBuZl9uYXQuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9pcHRfZWNuLmggYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaAppbmRleCBlYWJmOTVmLi4wZTBjMDYzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaApAQCAtMSwzNSArMSwxNSBAQAotLyogaXB0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgRUNOIGhlYWRlciBpbiBJUHY0IGFuZCBUQ1AgaGVhZGVyCi0gKgotICogKEMpIDIwMDIgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIEdOVSBHUEwgdjIsIDE5OTEKLSAqIAotICogaXB0X2Vjbi5oLHYgMS40IDIwMDIvMDgvMDUgMTk6Mzk6MDAgbGFmb3JnZSBFeHAKLSovCiAjaWZuZGVmIF9JUFRfRUNOX0gKICNkZWZpbmUgX0lQVF9FQ05fSAogCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfZHNjcC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9lY24uaD4KKyNkZWZpbmUgaXB0X2Vjbl9pbmZvIHh0X2Vjbl9pbmZvCiAKLSNkZWZpbmUgSVBUX0VDTl9JUF9NQVNLCSh+WFRfRFNDUF9NQVNLKQotCi0jZGVmaW5lIElQVF9FQ05fT1BfTUFUQ0hfSVAJMHgwMQotI2RlZmluZSBJUFRfRUNOX09QX01BVENIX0VDRQkweDEwCi0jZGVmaW5lIElQVF9FQ05fT1BfTUFUQ0hfQ1dSCTB4MjAKLQotI2RlZmluZSBJUFRfRUNOX09QX01BVENIX01BU0sJMHhjZQotCi0vKiBtYXRjaCBpbmZvICovCi1zdHJ1Y3QgaXB0X2Vjbl9pbmZvIHsKLQlfX3U4IG9wZXJhdGlvbjsKLQlfX3U4IGludmVydDsKLQlfX3U4IGlwX2VjdDsKLQl1bmlvbiB7Ci0JCXN0cnVjdCB7Ci0JCQlfX3U4IGVjdDsKLQkJfSB0Y3A7Ci0JfSBwcm90bzsKK2VudW0geworCUlQVF9FQ05fSVBfTUFTSyAgICAgICA9IFhUX0VDTl9JUF9NQVNLLAorCUlQVF9FQ05fT1BfTUFUQ0hfSVAgICA9IFhUX0VDTl9PUF9NQVRDSF9JUCwKKwlJUFRfRUNOX09QX01BVENIX0VDRSAgPSBYVF9FQ05fT1BfTUFUQ0hfRUNFLAorCUlQVF9FQ05fT1BfTUFUQ0hfQ1dSICA9IFhUX0VDTl9PUF9NQVRDSF9DV1IsCisJSVBUX0VDTl9PUF9NQVRDSF9NQVNLID0gWFRfRUNOX09QX01BVENIX01BU0ssCiB9OwogCi0jZW5kaWYgLyogX0lQVF9FQ05fSCAqLworI2VuZGlmIC8qIElQVF9FQ05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9uZl9uYXQuaCBiL2luY2x1ZGUvbGludXgvbmV0ZmlsdGVyX2lwdjQvbmZfbmF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhODYxZDAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9saW51eC9uZXRmaWx0ZXJfaXB2NC9uZl9uYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSNpZm5kZWYgX0xJTlVYX05GX05BVF9ICi0jZGVmaW5lIF9MSU5VWF9ORl9OQVRfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2RlZmluZSBJUF9OQVRfUkFOR0VfTUFQX0lQUyAxCi0jZGVmaW5lIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQgMgotI2RlZmluZSBJUF9OQVRfUkFOR0VfUFJPVE9fUkFORE9NIDQKLSNkZWZpbmUgSVBfTkFUX1JBTkdFX1BFUlNJU1RFTlQgOAotCi0vKiBUaGUgcHJvdG9jb2wtc3BlY2lmaWMgbWFuaXB1bGFibGUgcGFydHMgb2YgdGhlIHR1cGxlLiAqLwotdW5pb24gbmZfY29ubnRyYWNrX21hbl9wcm90byB7Ci0JLyogQWRkIG90aGVyIHByb3RvY29scyBoZXJlLiAqLwotCV9fYmUxNiBhbGw7Ci0KLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IHRjcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IHVkcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgaWQ7Ci0JfSBpY21wOwotCXN0cnVjdCB7Ci0JCV9fYmUxNiBwb3J0OwotCX0gZGNjcDsKLQlzdHJ1Y3QgewotCQlfX2JlMTYgcG9ydDsKLQl9IHNjdHA7Ci0Jc3RydWN0IHsKLQkJX19iZTE2IGtleTsJLyogR1JFIGtleSBpcyAzMmJpdCwgUFB0UCBvbmx5IHVzZXMgMTZiaXQgKi8KLQl9IGdyZTsKLX07Ci0KLS8qIFNpbmdsZSByYW5nZSBzcGVjaWZpY2F0aW9uLiAqLwotc3RydWN0IG5mX25hdF9yYW5nZSB7Ci0JLyogU2V0IHRvIE9SIG9mIGZsYWdzIGFib3ZlLiAqLwotCXVuc2lnbmVkIGludCBmbGFnczsKLQotCS8qIEluY2x1c2l2ZTogbmV0d29yayBvcmRlci4gKi8KLQlfX2JlMzIgbWluX2lwLCBtYXhfaXA7Ci0KLQkvKiBJbmNsdXNpdmU6IG5ldHdvcmsgb3JkZXIgKi8KLQl1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvIG1pbiwgbWF4OwotfTsKLQotLyogRm9yIGJhY2t3YXJkcyBjb21wYXQ6IGRvbid0IHVzZSBpbiBtb2Rlcm4gY29kZS4gKi8KLXN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0IHsKLQl1bnNpZ25lZCBpbnQgcmFuZ2VzaXplOyAvKiBNdXN0IGJlIDEuICovCi0KLQkvKiBoYW5ncyBvZmYgZW5kLiAqLwotCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2VbMV07Ci19OwotCi0jZGVmaW5lIG5mX25hdF9tdWx0aV9yYW5nZSBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZXRsaW5rLmggYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAppbmRleCA4Mzc0ZDI5Li41MmU0ODk1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaAorKysgYi9pbmNsdWRlL2xpbnV4L25ldGxpbmsuaApAQCAtOCw3ICs4LDcgQEAKICNkZWZpbmUgTkVUTElOS19VTlVTRUQJCTEJLyogVW51c2VkIG51bWJlcgkJCQkqLwogI2RlZmluZSBORVRMSU5LX1VTRVJTT0NLCTIJLyogUmVzZXJ2ZWQgZm9yIHVzZXIgbW9kZSBzb2NrZXQgcHJvdG9jb2xzIAkqLwogI2RlZmluZSBORVRMSU5LX0ZJUkVXQUxMCTMJLyogRmlyZXdhbGxpbmcgaG9vawkJCQkqLwotI2RlZmluZSBORVRMSU5LX0lORVRfRElBRwk0CS8qIElORVQgc29ja2V0IG1vbml0b3JpbmcJCQkqLworI2RlZmluZSBORVRMSU5LX1NPQ0tfRElBRwk0CS8qIHNvY2tldCBtb25pdG9yaW5nCQkJCSovCiAjZGVmaW5lIE5FVExJTktfTkZMT0cJCTUJLyogbmV0ZmlsdGVyL2lwdGFibGVzIFVMT0cgKi8KICNkZWZpbmUgTkVUTElOS19YRlJNCQk2CS8qIGlwc2VjICovCiAjZGVmaW5lIE5FVExJTktfU0VMSU5VWAkJNwkvKiBTRUxpbnV4IGV2ZW50IG5vdGlmaWNhdGlvbnMgKi8KQEAgLTI3LDYgKzI3LDggQEAKICNkZWZpbmUgTkVUTElOS19SRE1BCQkyMAogI2RlZmluZSBORVRMSU5LX0NSWVBUTwkJMjEJLyogQ3J5cHRvIGxheWVyICovCiAKKyNkZWZpbmUgTkVUTElOS19JTkVUX0RJQUcJTkVUTElOS19TT0NLX0RJQUcKKwogI2RlZmluZSBNQVhfTElOS1MgMzIJCQogCiBzdHJ1Y3Qgc29ja2FkZHJfbmwgewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZmMuaCBiL2luY2x1ZGUvbGludXgvbmZjLmgKaW5kZXggMzZjYjk1NS4uMDFkNGU1ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9uZmMuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mYy5oCkBAIC02Miw2ICs2Miw4IEBACiAJTkZDX0NNRF9HRVRfREVWSUNFLAogCU5GQ19DTURfREVWX1VQLAogCU5GQ19DTURfREVWX0RPV04sCisJTkZDX0NNRF9ERVBfTElOS19VUCwKKwlORkNfQ01EX0RFUF9MSU5LX0RPV04sCiAJTkZDX0NNRF9TVEFSVF9QT0xMLAogCU5GQ19DTURfU1RPUF9QT0xMLAogCU5GQ19DTURfR0VUX1RBUkdFVCwKQEAgLTg2LDYgKzg4LDkgQEAKICAqIEBORkNfQVRUUl9UQVJHRVRfU0VOU19SRVM6IE5GQy1BIHRhcmdldHMgZXh0cmEgaW5mb3JtYXRpb24gc3VjaCBhcyBORkNJRAogICogQE5GQ19BVFRSX1RBUkdFVF9TRUxfUkVTOiBORkMtQSB0YXJnZXRzIGV4dHJhIGluZm9ybWF0aW9uICh1c2VmdWwgaWYgdGhlCiAgKgl0YXJnZXQgaXMgbm90IE5GQy1Gb3J1bSBjb21wbGlhbnQpCisgKiBATkZDX0FUVFJfVEFSR0VUX05GQ0lEMTogTkZDLUEgdGFyZ2V0cyBpZGVudGlmaWVyLCBtYXggMTAgYnl0ZXMKKyAqIEBORkNfQVRUUl9DT01NX01PREU6IFBhc3NpdmUgb3IgYWN0aXZlIG1vZGUKKyAqIEBORkNfQVRUUl9SRl9NT0RFOiBJbml0aWF0b3Igb3IgdGFyZ2V0CiAgKi8KIGVudW0gbmZjX2F0dHJzIHsKIAlORkNfQVRUUl9VTlNQRUMsCkBAIC05NSw2ICsxMDAsOSBAQAogCU5GQ19BVFRSX1RBUkdFVF9JTkRFWCwKIAlORkNfQVRUUl9UQVJHRVRfU0VOU19SRVMsCiAJTkZDX0FUVFJfVEFSR0VUX1NFTF9SRVMsCisJTkZDX0FUVFJfVEFSR0VUX05GQ0lEMSwKKwlORkNfQVRUUl9DT01NX01PREUsCisJTkZDX0FUVFJfUkZfTU9ERSwKIC8qIHByaXZhdGU6IGludGVybmFsIHVzZSBvbmx5ICovCiAJX19ORkNfQVRUUl9BRlRFUl9MQVNUCiB9OwpAQCAtMTExLDYgKzExOSwxNCBAQAogCiAjZGVmaW5lIE5GQ19QUk9UT19NQVgJCTYKIAorLyogTkZDIGNvbW11bmljYXRpb24gbW9kZXMgKi8KKyNkZWZpbmUgTkZDX0NPTU1fQUNUSVZFICAwCisjZGVmaW5lIE5GQ19DT01NX1BBU1NJVkUgMQorCisvKiBORkMgUkYgbW9kZXMgKi8KKyNkZWZpbmUgTkZDX1JGX0lOSVRJQVRPUiAwCisjZGVmaW5lIE5GQ19SRl9UQVJHRVQgICAgMQorCiAvKiBORkMgcHJvdG9jb2xzIG1hc2tzIHVzZWQgaW4gYml0c2V0cyAqLwogI2RlZmluZSBORkNfUFJPVE9fSkVXRUxfTUFTSwkoMSA8PCBORkNfUFJPVE9fSkVXRUwpCiAjZGVmaW5lIE5GQ19QUk9UT19NSUZBUkVfTUFTSwkoMSA8PCBORkNfUFJPVE9fTUlGQVJFKQpAQCAtMTI1LDkgKzE0MSwyMiBAQAogCV9fdTMyIG5mY19wcm90b2NvbDsKIH07CiAKKyNkZWZpbmUgTkZDX0xMQ1BfTUFYX1NFUlZJQ0VfTkFNRSA2Mworc3RydWN0IHNvY2thZGRyX25mY19sbGNwIHsKKwlzYV9mYW1pbHlfdCBzYV9mYW1pbHk7CisJX191MzIgZGV2X2lkeDsKKwlfX3UzMiB0YXJnZXRfaWR4OworCV9fdTMyIG5mY19wcm90b2NvbDsKKwlfX3U4IGRzYXA7IC8qIERlc3RpbmF0aW9uIFNBUCwgaWYga25vd24gKi8KKwlfX3U4IHNzYXA7IC8qIFNvdXJjZSBTQVAgdG8gYmUgYm91bmQgdG8gKi8KKwljaGFyIHNlcnZpY2VfbmFtZVtORkNfTExDUF9NQVhfU0VSVklDRV9OQU1FXTsgLyogU2VydmljZSBuYW1lIFVSSSAqLzsKKwlzaXplX3Qgc2VydmljZV9uYW1lX2xlbjsKK307CisKIC8qIE5GQyBzb2NrZXQgcHJvdG9jb2xzICovCiAjZGVmaW5lIE5GQ19TT0NLUFJPVE9fUkFXCTAKLSNkZWZpbmUgTkZDX1NPQ0tQUk9UT19NQVgJMQorI2RlZmluZSBORkNfU09DS1BST1RPX0xMQ1AJMQorI2RlZmluZSBORkNfU09DS1BST1RPX01BWAkyCiAKICNkZWZpbmUgTkZDX0hFQURFUl9TSVpFIDEKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9ubDgwMjExLmggYi9pbmNsdWRlL2xpbnV4L25sODAyMTEuaAppbmRleCA4MDQ5YmY3Li4wZjVmZjM3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25sODAyMTEuaAorKysgYi9pbmNsdWRlL2xpbnV4L25sODAyMTEuaApAQCAtNTA5LDYgKzUwOSwzOCBAQAogICogQE5MODAyMTFfQ01EX1RETFNfT1BFUjogUGVyZm9ybSBhIGhpZ2gtbGV2ZWwgVERMUyBjb21tYW5kIChlLmcuIGxpbmsgc2V0dXApLgogICogQE5MODAyMTFfQ01EX1RETFNfTUdNVDogU2VuZCBhIFRETFMgbWFuYWdlbWVudCBmcmFtZS4KICAqCisgKiBATkw4MDIxMV9DTURfVU5FWFBFQ1RFRF9GUkFNRTogVXNlZCBieSBhbiBhcHBsaWNhdGlvbiBjb250cm9sbGluZyBhbiBBUAorICoJKG9yIEdPKSBpbnRlcmZhY2UgKGkuZS4gaG9zdGFwZCkgdG8gYXNrIGZvciB1bmV4cGVjdGVkIGZyYW1lcyB0bworICoJaW1wbGVtZW50IHNlbmRpbmcgZGVhdXRoIHRvIHN0YXRpb25zIHRoYXQgc2VuZCB1bmV4cGVjdGVkIGNsYXNzIDMKKyAqCWZyYW1lcy4gQWxzbyB1c2VkIGFzIHRoZSBldmVudCBzZW50IGJ5IHRoZSBrZXJuZWwgd2hlbiBzdWNoIGEgZnJhbWUKKyAqCWlzIHJlY2VpdmVkLgorICoJRm9yIHRoZSBldmVudCwgdGhlICVOTDgwMjExX0FUVFJfTUFDIGF0dHJpYnV0ZSBjYXJyaWVzIHRoZSBUQSBhbmQKKyAqCW90aGVyIGF0dHJpYnV0ZXMgbGlrZSB0aGUgaW50ZXJmYWNlIGluZGV4IGFyZSBwcmVzZW50LgorICoJSWYgdXNlZCBhcyB0aGUgY29tbWFuZCBpdCBtdXN0IGhhdmUgYW4gaW50ZXJmYWNlIGluZGV4IGFuZCB5b3UgY2FuCisgKglvbmx5IHVuc3Vic2NyaWJlIGZyb20gdGhlIGV2ZW50IGJ5IGNsb3NpbmcgdGhlIHNvY2tldC4gU3Vic2NyaXB0aW9uCisgKglpcyBhbHNvIGZvciAlTkw4MDIxMV9DTURfVU5FWFBFQ1RFRF80QUREUl9GUkFNRSBldmVudHMuCisgKgorICogQE5MODAyMTFfQ01EX1VORVhQRUNURURfNEFERFJfRlJBTUU6IFNlbnQgYXMgYW4gZXZlbnQgaW5kaWNhdGluZyB0aGF0IHRoZQorICoJYXNzb2NpYXRlZCBzdGF0aW9uIGlkZW50aWZpZWQgYnkgJU5MODAyMTFfQVRUUl9NQUMgc2VudCBhIDRhZGRyIGZyYW1lCisgKglhbmQgd2Fzbid0IGFscmVhZHkgaW4gYSA0LWFkZHIgVkxBTi4gVGhlIGV2ZW50IHdpbGwgYmUgc2VudCBzaW1pbGFybHkKKyAqCXRvIHRoZSAlTkw4MDIxMV9DTURfVU5FWFBFQ1RFRF9GUkFNRSBldmVudCwgdG8gdGhlIHNhbWUgbGlzdGVuZXIuCisgKgorICogQE5MODAyMTFfQ01EX1BST0JFX0NMSUVOVDogUHJvYmUgYW4gYXNzb2NpYXRlZCBzdGF0aW9uIG9uIGFuIEFQIGludGVyZmFjZQorICoJYnkgc2VuZGluZyBhIG51bGwgZGF0YSBmcmFtZSB0byBpdCBhbmQgcmVwb3J0aW5nIHdoZW4gdGhlIGZyYW1lIGlzCisgKglhY2tub3dsZWdlZC4gVGhpcyBpcyB1c2VkIHRvIGFsbG93IHRpbWluZyBvdXQgaW5hY3RpdmUgY2xpZW50cy4gVXNlcworICoJJU5MODAyMTFfQVRUUl9JRklOREVYIGFuZCAlTkw4MDIxMV9BVFRSX01BQy4gVGhlIGNvbW1hbmQgcmV0dXJucyBhCisgKglkaXJlY3QgcmVwbHkgd2l0aCBhbiAlTkw4MDIxMV9BVFRSX0NPT0tJRSB0aGF0IGlzIGxhdGVyIHVzZWQgdG8gbWF0Y2gKKyAqCXVwIHRoZSBldmVudCB3aXRoIHRoZSByZXF1ZXN0LiBUaGUgZXZlbnQgaW5jbHVkZXMgdGhlIHNhbWUgZGF0YSBhbmQKKyAqCWhhcyAlTkw4MDIxMV9BVFRSX0FDSyBzZXQgaWYgdGhlIGZyYW1lIHdhcyBBQ0tlZC4KKyAqCisgKiBATkw4MDIxMV9DTURfUkVHSVNURVJfQkVBQ09OUzogUmVnaXN0ZXIgdGhpcyBzb2NrZXQgdG8gcmVjZWl2ZSBiZWFjb25zIGZyb20KKyAqCW90aGVyIEJTU2VzIHdoZW4gYW55IGludGVyZmFjZXMgYXJlIGluIEFQIG1vZGUuIFRoaXMgaGVscHMgaW1wbGVtZW50CisgKglPTEJDIGhhbmRsaW5nIGluIGhvc3RhcGQuIEJlYWNvbnMgYXJlIHJlcG9ydGVkIGluICVOTDgwMjExX0NNRF9GUkFNRQorICoJbWVzc2FnZXMuIE5vdGUgdGhhdCBwZXIgUEhZIG9ubHkgb25lIGFwcGxpY2F0aW9uIG1heSByZWdpc3Rlci4KKyAqCisgKiBATkw4MDIxMV9DTURfU0VUX05PQUNLX01BUDogc2V0cyBhIGJpdG1hcCBmb3IgdGhlIGluZGl2aWR1YWwgVElEcyB3aGV0aGVyCisgKiAgICAgIE5vIEFja25vd2xlZGdlbWVudCBQb2xpY3kgc2hvdWxkIGJlIGFwcGxpZWQuCisgKgogICogQE5MODAyMTFfQ01EX01BWDogaGlnaGVzdCB1c2VkIGNvbW1hbmQgbnVtYmVyCiAgKiBAX19OTDgwMjExX0NNRF9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKICAqLwpAQCAtNjM4LDYgKzY3MCwxNiBAQAogCU5MODAyMTFfQ01EX1RETFNfT1BFUiwKIAlOTDgwMjExX0NNRF9URExTX01HTVQsCiAKKwlOTDgwMjExX0NNRF9VTkVYUEVDVEVEX0ZSQU1FLAorCisJTkw4MDIxMV9DTURfUFJPQkVfQ0xJRU5ULAorCisJTkw4MDIxMV9DTURfUkVHSVNURVJfQkVBQ09OUywKKworCU5MODAyMTFfQ01EX1VORVhQRUNURURfNEFERFJfRlJBTUUsCisKKwlOTDgwMjExX0NNRF9TRVRfTk9BQ0tfTUFQLAorCiAJLyogYWRkIG5ldyBjb21tYW5kcyBhYm92ZSBoZXJlICovCiAKIAkvKiB1c2VkIHRvIGRlZmluZSBOTDgwMjExX0NNRF9NQVggYmVsb3cgKi8KQEAgLTY1OCw2ICs3MDAsOCBAQAogI2RlZmluZSBOTDgwMjExX0NNRF9ESVNBU1NPQ0lBVEUgTkw4MDIxMV9DTURfRElTQVNTT0NJQVRFCiAjZGVmaW5lIE5MODAyMTFfQ01EX1JFR19CRUFDT05fSElOVCBOTDgwMjExX0NNRF9SRUdfQkVBQ09OX0hJTlQKIAorI2RlZmluZSBOTDgwMjExX0FUVFJfRkVBVFVSRV9GTEFHUyBOTDgwMjExX0FUVFJfRkVBVFVSRV9GTEFHUworCiAvKiBzb3VyY2UtbGV2ZWwgQVBJIGNvbXBhdGliaWxpdHkgKi8KICNkZWZpbmUgTkw4MDIxMV9DTURfR0VUX01FU0hfUEFSQU1TIE5MODAyMTFfQ01EX0dFVF9NRVNIX0NPTkZJRwogI2RlZmluZSBOTDgwMjExX0NNRF9TRVRfTUVTSF9QQVJBTVMgTkw4MDIxMV9DTURfU0VUX01FU0hfQ09ORklHCkBAIC0xMTA5LDYgKzExNTMsNDYgQEAKICAqCSVOTDgwMjExX0NNRF9URExTX01HTVQuIE90aGVyd2lzZSAlTkw4MDIxMV9DTURfVERMU19PUEVSIHNob3VsZCBiZQogICoJdXNlZCBmb3IgYXNraW5nIHRoZSBkcml2ZXIgdG8gcGVyZm9ybSBhIFRETFMgb3BlcmF0aW9uLgogICoKKyAqIEBOTDgwMjExX0FUVFJfREVWSUNFX0FQX1NNRTogVGhpcyB1MzIgYXR0cmlidXRlIG1heSBiZSBsaXN0ZWQgZm9yIGRldmljZXMKKyAqCXRoYXQgaGF2ZSBBUCBzdXBwb3J0IHRvIGluZGljYXRlIHRoYXQgdGhleSBoYXZlIHRoZSBBUCBTTUUgaW50ZWdyYXRlZAorICoJd2l0aCBzdXBwb3J0IGZvciB0aGUgZmVhdHVyZXMgbGlzdGVkIGluIHRoaXMgYXR0cmlidXRlLCBzZWUKKyAqCSZlbnVtIG5sODAyMTFfYXBfc21lX2ZlYXR1cmVzLgorICoKKyAqIEBOTDgwMjExX0FUVFJfRE9OVF9XQUlUX0ZPUl9BQ0s6IFVzZWQgd2l0aCAlTkw4MDIxMV9DTURfRlJBTUUsIHRoaXMgdGVsbHMKKyAqCXRoZSBkcml2ZXIgdG8gbm90IHdhaXQgZm9yIGFuIGFja25vd2xlZGdlbWVudC4gTm90ZSB0aGF0IGR1ZSB0byB0aGlzLAorICoJaXQgd2lsbCBhbHNvIG5vdCBnaXZlIGEgc3RhdHVzIGNhbGxiYWNrIG5vciByZXR1cm4gYSBjb29raWUuIFRoaXMgaXMKKyAqCW1vc3RseSB1c2VmdWwgZm9yIHByb2JlIHJlc3BvbnNlcyB0byBzYXZlIGFpcnRpbWUuCisgKgorICogQE5MODAyMTFfQVRUUl9GRUFUVVJFX0ZMQUdTOiBUaGlzIHUzMiBhdHRyaWJ1dGUgY29udGFpbnMgZmxhZ3MgZnJvbQorICoJJmVudW0gbmw4MDIxMV9mZWF0dXJlX2ZsYWdzIGFuZCBpcyBhZHZlcnRpc2VkIGluIHdpcGh5IGluZm9ybWF0aW9uLgorICogQE5MODAyMTFfQVRUUl9QUk9CRV9SRVNQX09GRkxPQUQ6IEluZGljYXRlcyB0aGF0IHRoZSBIVyByZXNwb25kcyB0byBwcm9iZQorICoKKyAqCXJlcXVlc3RzIHdoaWxlIG9wZXJhdGluZyBpbiBBUC1tb2RlLgorICoJVGhpcyBhdHRyaWJ1dGUgaG9sZHMgYSBiaXRtYXAgb2YgdGhlIHN1cHBvcnRlZCBwcm90b2NvbHMgZm9yCisgKglvZmZsb2FkaW5nIChzZWUgJmVudW0gbmw4MDIxMV9wcm9iZV9yZXNwX29mZmxvYWRfc3VwcG9ydF9hdHRyKS4KKyAqCisgKiBATkw4MDIxMV9BVFRSX1BST0JFX1JFU1A6IFByb2JlIFJlc3BvbnNlIHRlbXBsYXRlIGRhdGEuIENvbnRhaW5zIHRoZSBlbnRpcmUKKyAqCXByb2JlLXJlc3BvbnNlIGZyYW1lLiBUaGUgREEgZmllbGQgaW4gdGhlIDgwMi4xMSBoZWFkZXIgaXMgemVyby1lZCBvdXQsCisgKgl0byBiZSBmaWxsZWQgYnkgdGhlIEZXLgorICogQE5MODAyMTFfQVRUUl9ESVNBQkxFX0hUOiAgRm9yY2UgSFQgY2FwYWJsZSBpbnRlcmZhY2VzIHRvIGRpc2FibGUKKyAqICAgICAgdGhpcyBmZWF0dXJlLiAgQ3VycmVudGx5LCBvbmx5IHN1cHBvcnRlZCBpbiBtYWM4MDIxMSBkcml2ZXJzLgorICogQE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0s6IFNwZWNpZnkgd2hpY2ggYml0cyBvZiB0aGUKKyAqICAgICAgQVRUUl9IVF9DQVBBQklMSVRZIHRvIHdoaWNoIGF0dGVudGlvbiBzaG91bGQgYmUgcGFpZC4KKyAqICAgICAgQ3VycmVudGx5LCBvbmx5IG1hYzgwMjExIE5JQ3Mgc3VwcG9ydCB0aGlzIGZlYXR1cmUuCisgKiAgICAgIFRoZSB2YWx1ZXMgdGhhdCBtYXkgYmUgY29uZmlndXJlZCBhcmU6CisgKiAgICAgICBNQ1MgcmF0ZXMsIE1BWC1BTVNEVSwgSFQtMjAtNDAgYW5kIEhUX0NBUF9TR0lfNDAKKyAqICAgICAgIEFNUERVIGRlbnNpdHkgYW5kIEFNUERVIGZhY3Rvci4KKyAqICAgICAgQWxsIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBzdWdnZXN0aW9ucyBhbmQgbWF5IGJlIGlnbm9yZWQKKyAqICAgICAgYnkgdGhlIGRyaXZlciBhcyByZXF1aXJlZC4gIFRoZSBhY3R1YWwgdmFsdWVzIG1heSBiZSBzZWVuIGluCisgKiAgICAgIHRoZSBzdGF0aW9uIGRlYnVnZnMgaHRfY2FwcyBmaWxlLgorICoKKyAqIEBOTDgwMjExX0FUVFJfREZTX1JFR0lPTjogcmVnaW9uIGZvciByZWd1bGF0b3J5IHJ1bGVzIHdoaWNoIHRoaXMgY291bnRyeQorICogICAgYWJpZGVzIHRvIHdoZW4gaW5pdGlhdGluZyByYWRpYXRpb24gb24gREZTIGNoYW5uZWxzLiBBIGNvdW50cnkgbWFwcworICogICAgdG8gb25lIERGUyByZWdpb24uCisgKgorICogQE5MODAyMTFfQVRUUl9OT0FDS19NQVA6IFRoaXMgdTE2IGJpdG1hcCBjb250YWlucyB0aGUgTm8gQWNrIFBvbGljeSBvZgorICogICAgICB1cCB0byAxNiBUSURzLgorICoKICAqIEBOTDgwMjExX0FUVFJfTUFYOiBoaWdoZXN0IGF0dHJpYnV0ZSBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKICAqIEBfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKICAqLwpAQCAtMTMzNyw2ICsxNDIxLDIzIEBACiAJTkw4MDIxMV9BVFRSX1RETFNfU1VQUE9SVCwKIAlOTDgwMjExX0FUVFJfVERMU19FWFRFUk5BTF9TRVRVUCwKIAorCU5MODAyMTFfQVRUUl9ERVZJQ0VfQVBfU01FLAorCisJTkw4MDIxMV9BVFRSX0RPTlRfV0FJVF9GT1JfQUNLLAorCisJTkw4MDIxMV9BVFRSX0ZFQVRVUkVfRkxBR1MsCisKKwlOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF9PRkZMT0FELAorCisJTkw4MDIxMV9BVFRSX1BST0JFX1JFU1AsCisKKwlOTDgwMjExX0FUVFJfREZTX1JFR0lPTiwKKworCU5MODAyMTFfQVRUUl9ESVNBQkxFX0hULAorCU5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0ssCisKKwlOTDgwMjExX0FUVFJfTk9BQ0tfTUFQLAorCiAJLyogYWRkIGF0dHJpYnV0ZXMgaGVyZSwgdXBkYXRlIHRoZSBwb2xpY3kgaW4gbmw4MDIxMS5jICovCiAKIAlfX05MODAyMTFfQVRUUl9BRlRFUl9MQVNULApAQCAtMTM3MSw2ICsxNDcyLDcgQEAKICNkZWZpbmUgTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMgTkw4MDIxMV9BVFRSX0FLTV9TVUlURVMKICNkZWZpbmUgTkw4MDIxMV9BVFRSX0tFWSBOTDgwMjExX0FUVFJfS0VZCiAjZGVmaW5lIE5MODAyMTFfQVRUUl9LRVlTIE5MODAyMTFfQVRUUl9LRVlTCisjZGVmaW5lIE5MODAyMTFfQVRUUl9GRUFUVVJFX0ZMQUdTIE5MODAyMTFfQVRUUl9GRUFUVVJFX0ZMQUdTCiAKICNkZWZpbmUgTkw4MDIxMV9NQVhfU1VQUF9SQVRFUwkJCTMyCiAjZGVmaW5lIE5MODAyMTFfTUFYX1NVUFBfUkVHX1JVTEVTCQkzMgpAQCAtMTQzNCw3ICsxNTM2LDExIEBACiAgKiBATkw4MDIxMV9TVEFfRkxBR19XTUU6IHN0YXRpb24gaXMgV01FL1FvUyBjYXBhYmxlCiAgKiBATkw4MDIxMV9TVEFfRkxBR19NRlA6IHN0YXRpb24gdXNlcyBtYW5hZ2VtZW50IGZyYW1lIHByb3RlY3Rpb24KICAqIEBOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQ6IHN0YXRpb24gaXMgYXV0aGVudGljYXRlZAotICogQE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSOiBzdGF0aW9uIGlzIGEgVERMUyBwZWVyCisgKiBATkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVI6IHN0YXRpb24gaXMgYSBURExTIHBlZXIgLS0gdGhpcyBmbGFnIHNob3VsZAorICoJb25seSBiZSB1c2VkIGluIG1hbmFnZWQgbW9kZSAoZXZlbiBpbiB0aGUgZmxhZ3MgbWFzaykuIE5vdGUgdGhhdCB0aGUKKyAqCWZsYWcgY2FuJ3QgYmUgY2hhbmdlZCwgaXQgaXMgb25seSB2YWxpZCB3aGlsZSBhZGRpbmcgYSBzdGF0aW9uLCBhbmQKKyAqCWF0dGVtcHRzIHRvIGNoYW5nZSBpdCB3aWxsIHNpbGVudGx5IGJlIGlnbm9yZWQgKHJhdGhlciB0aGFuIHJlamVjdGVkCisgKglhcyBlcnJvcnMuKQogICogQE5MODAyMTFfU1RBX0ZMQUdfTUFYOiBoaWdoZXN0IHN0YXRpb24gZmxhZyBudW1iZXIgY3VycmVudGx5IGRlZmluZWQKICAqIEBfX05MODAyMTFfU1RBX0ZMQUdfQUZURVJfTEFTVDogaW50ZXJuYWwgdXNlCiAgKi8KQEAgLTE1NDksNiArMTY1NSw3IEBACiAgKiAgICAgY29udGFpbmluZyBpbmZvIGFzIHBvc3NpYmxlLCBzZWUgJmVudW0gbmw4MDIxMV9zdGFfYnNzX3BhcmFtCiAgKiBATkw4MDIxMV9TVEFfSU5GT19DT05ORUNURURfVElNRTogdGltZSBzaW5jZSB0aGUgc3RhdGlvbiBpcyBsYXN0IGNvbm5lY3RlZAogICogQE5MODAyMTFfU1RBX0lORk9fU1RBX0ZMQUdTOiBDb250YWlucyBhIHN0cnVjdCBubDgwMjExX3N0YV9mbGFnX3VwZGF0ZS4KKyAqIEBOTDgwMjExX1NUQV9JTkZPX0JFQUNPTl9MT1NTOiBjb3VudCBvZiB0aW1lcyBiZWFjb24gbG9zcyB3YXMgZGV0ZWN0ZWQgKHUzMikKICAqIEBfX05MODAyMTFfU1RBX0lORk9fQUZURVJfTEFTVDogaW50ZXJuYWwKICAqIEBOTDgwMjExX1NUQV9JTkZPX01BWDogaGlnaGVzdCBwb3NzaWJsZSBzdGF0aW9uIGluZm8gYXR0cmlidXRlCiAgKi8KQEAgLTE1NzEsNiArMTY3OCw3IEBACiAJTkw4MDIxMV9TVEFfSU5GT19CU1NfUEFSQU0sCiAJTkw4MDIxMV9TVEFfSU5GT19DT05ORUNURURfVElNRSwKIAlOTDgwMjExX1NUQV9JTkZPX1NUQV9GTEFHUywKKwlOTDgwMjExX1NUQV9JTkZPX0JFQUNPTl9MT1NTLAogCiAJLyoga2VlcCBsYXN0ICovCiAJX19OTDgwMjExX1NUQV9JTkZPX0FGVEVSX0xBU1QsCkBAIC0xODQ1LDYgKzE5NTMsMjEgQEAKIH07CiAKIC8qKgorICogZW51bSBubDgwMjExX2Rmc19yZWdpb25zIC0gcmVndWxhdG9yeSBERlMgcmVnaW9ucworICoKKyAqIEBOTDgwMjExX0RGU19VTlNFVDogQ291bnRyeSBoYXMgbm8gREZTIG1hc3RlciByZWdpb24gc3BlY2lmaWVkCisgKiBATkw4MDIxMV9ERlNfRkNDXzogQ291bnRyeSBmb2xsb3dzIERGUyBtYXN0ZXIgcnVsZXMgZnJvbSBGQ0MKKyAqIEBOTDgwMjExX0RGU19GQ0NfOiBDb3VudHJ5IGZvbGxvd3MgREZTIG1hc3RlciBydWxlcyBmcm9tIEVUU0kKKyAqIEBOTDgwMjExX0RGU19KUF86IENvdW50cnkgZm9sbG93cyBERlMgbWFzdGVyIHJ1bGVzIGZyb20gSlAvTUtLL1RlbGVjCisgKi8KK2VudW0gbmw4MDIxMV9kZnNfcmVnaW9ucyB7CisJTkw4MDIxMV9ERlNfVU5TRVQJPSAwLAorCU5MODAyMTFfREZTX0ZDQwkJPSAxLAorCU5MODAyMTFfREZTX0VUU0kJPSAyLAorCU5MODAyMTFfREZTX0pQCQk9IDMsCit9OworCisvKioKICAqIGVudW0gbmw4MDIxMV9zdXJ2ZXlfaW5mbyAtIHN1cnZleSBpbmZvcm1hdGlvbgogICoKICAqIFRoZXNlIGF0dHJpYnV0ZSB0eXBlcyBhcmUgdXNlZCB3aXRoICVOTDgwMjExX0FUVFJfU1VSVkVZX0lORk8KQEAgLTE5NzcsNiArMjEwMCwxMCBAQAogICogYWNjZXNzIHRvIGEgYnJvYWRlciBuZXR3b3JrIGJleW9uZCB0aGUgTUJTUy4gIFRoaXMgaXMgZG9uZSB2aWEgUm9vdAogICogQW5ub3VuY2VtZW50IGZyYW1lcy4KICAqCisgKiBATkw4MDIxMV9NRVNIQ09ORl9IV01QX1BFUlJfTUlOX0lOVEVSVkFMOiBUaGUgbWluaW11bSBpbnRlcnZhbCBvZiB0aW1lIChpbgorICogVFVzKSBkdXJpbmcgd2hpY2ggYSBtZXNoIFNUQSBjYW4gc2VuZCBvbmx5IG9uZSBBY3Rpb24gZnJhbWUgY29udGFpbmluZyBhCisgKiBQRVJSIGVsZW1lbnQuCisgKgogICogQE5MODAyMTFfTUVTSENPTkZfQVRUUl9NQVg6IGhpZ2hlc3QgcG9zc2libGUgbWVzaCBjb25maWd1cmF0aW9uIGF0dHJpYnV0ZQogICoKICAqIEBfX05MODAyMTFfTUVTSENPTkZfQVRUUl9BRlRFUl9MQVNUOiBpbnRlcm5hbCB1c2UKQEAgLTIwMDAsNiArMjEyNyw3IEBACiAJTkw4MDIxMV9NRVNIQ09ORl9FTEVNRU5UX1RUTCwKIAlOTDgwMjExX01FU0hDT05GX0hXTVBfUkFOTl9JTlRFUlZBTCwKIAlOTDgwMjExX01FU0hDT05GX0dBVEVfQU5OT1VOQ0VNRU5UUywKKwlOTDgwMjExX01FU0hDT05GX0hXTVBfUEVSUl9NSU5fSU5URVJWQUwsCiAKIAkvKiBrZWVwIGxhc3QgKi8KIAlfX05MODAyMTFfTUVTSENPTkZfQVRUUl9BRlRFUl9MQVNULApAQCAtMjY1MCw0ICsyNzc4LDQ1IEBACiAJTkw4MDIxMV9URExTX0RJU0FCTEVfTElOSywKIH07CiAKKy8qCisgKiBlbnVtIG5sODAyMTFfYXBfc21lX2ZlYXR1cmVzIC0gZGV2aWNlLWludGVncmF0ZWQgQVAgZmVhdHVyZXMKKyAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLCBubyBiaXRzIGFyZSBkZWZpbmVkIGluCisgKiBOTDgwMjExX0FUVFJfREVWSUNFX0FQX1NNRSB5ZXQuCitlbnVtIG5sODAyMTFfYXBfc21lX2ZlYXR1cmVzIHsKK307CisgKi8KKworLyoqCisgKiBlbnVtIG5sODAyMTFfZmVhdHVyZV9mbGFncyAtIGRldmljZS9kcml2ZXIgZmVhdHVyZXMKKyAqIEBOTDgwMjExX0ZFQVRVUkVfU0tfVFhfU1RBVFVTOiBUaGlzIGRyaXZlciBzdXBwb3J0cyByZWZsZWN0aW5nIGJhY2sKKyAqCVRYIHN0YXR1cyB0byB0aGUgc29ja2V0IGVycm9yIHF1ZXVlIHdoZW4gcmVxdWVzdGVkIHdpdGggdGhlCisgKglzb2NrZXQgb3B0aW9uLgorICogQE5MODAyMTFfRkVBVFVSRV9IVF9JQlNTOiBUaGlzIGRyaXZlciBzdXBwb3J0cyBJQlNTIHdpdGggSFQgZGF0YXJhdGVzLgorICovCitlbnVtIG5sODAyMTFfZmVhdHVyZV9mbGFncyB7CisJTkw4MDIxMV9GRUFUVVJFX1NLX1RYX1NUQVRVUwk9IDEgPDwgMCwKKwlOTDgwMjExX0ZFQVRVUkVfSFRfSUJTUwkJPSAxIDw8IDEsCit9OworCisvKioKKyAqIGVudW0gbmw4MDIxMV9wcm9iZV9yZXNwX29mZmxvYWRfc3VwcG9ydF9hdHRyIC0gb3B0aW9uYWwgc3VwcG9ydGVkCisgKglwcm90b2NvbHMgZm9yIHByb2JlLXJlc3BvbnNlIG9mZmxvYWRpbmcgYnkgdGhlIGRyaXZlci9GVy4KKyAqCVRvIGJlIHVzZWQgd2l0aCB0aGUgJU5MODAyMTFfQVRUUl9QUk9CRV9SRVNQX09GRkxPQUQgYXR0cmlidXRlLgorICoJRWFjaCBlbnVtIHZhbHVlIHJlcHJlc2VudHMgYSBiaXQgaW4gdGhlIGJpdG1hcCBvZiBzdXBwb3J0ZWQKKyAqCXByb3RvY29scy4gVHlwaWNhbGx5IGEgc3Vic2V0IG9mIHByb2JlLXJlcXVlc3RzIGJlbG9uZ2luZyB0byBhCisgKglzdXBwb3J0ZWQgcHJvdG9jb2wgd2lsbCBiZSBleGNsdWRlZCBmcm9tIG9mZmxvYWQgYW5kIHVwbG9hZGVkCisgKgl0byB0aGUgaG9zdC4KKyAqCisgKiBATkw4MDIxMV9QUk9CRV9SRVNQX09GRkxPQURfU1VQUE9SVF9XUFM6IFN1cHBvcnQgZm9yIFdQUyB2ZXIuIDEKKyAqIEBOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1dQUzI6IFN1cHBvcnQgZm9yIFdQUyB2ZXIuIDIKKyAqIEBOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1AyUDogU3VwcG9ydCBmb3IgUDJQCisgKiBATkw4MDIxMV9QUk9CRV9SRVNQX09GRkxPQURfU1VQUE9SVF84MDIxMVU6IFN1cHBvcnQgZm9yIDgwMi4xMXUKKyAqLworZW51bSBubDgwMjExX3Byb2JlX3Jlc3Bfb2ZmbG9hZF9zdXBwb3J0X2F0dHIgeworCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfV1BTID0JMTw8MCwKKwlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUX1dQUzIgPQkxPDwxLAorCU5MODAyMTFfUFJPQkVfUkVTUF9PRkZMT0FEX1NVUFBPUlRfUDJQID0JMTw8MiwKKwlOTDgwMjExX1BST0JFX1JFU1BfT0ZGTE9BRF9TVVBQT1JUXzgwMjExVSA9CTE8PDMsCit9OworCiAjZW5kaWYgLyogX19MSU5VWF9OTDgwMjExX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvb3BlbnZzd2l0Y2guaCBiL2luY2x1ZGUvbGludXgvb3BlbnZzd2l0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjFlZmE1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9vcGVudnN3aXRjaC5oCkBAIC0wLDAgKzEsNDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTEgTmljaXJhIE5ldHdvcmtzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKi8KKworI2lmbmRlZiBfTElOVVhfT1BFTlZTV0lUQ0hfSAorI2RlZmluZSBfTElOVVhfT1BFTlZTV0lUQ0hfSCAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKioKKyAqIHN0cnVjdCBvdnNfaGVhZGVyIC0gaGVhZGVyIGZvciBPVlMgR2VuZXJpYyBOZXRsaW5rIG1lc3NhZ2VzLgorICogQGRwX2lmaW5kZXg6IGlmaW5kZXggb2YgbG9jYWwgcG9ydCBmb3IgZGF0YXBhdGggKDAgdG8gbWFrZSBhIHJlcXVlc3Qgbm90CisgKiBzcGVjaWZpYyB0byBhIGRhdGFwYXRoKS4KKyAqCisgKiBBdHRyaWJ1dGVzIGZvbGxvd2luZyB0aGUgaGVhZGVyIGFyZSBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgT1ZTIEdlbmVyaWMKKyAqIE5ldGxpbmsgZmFtaWx5LCBidXQgYWxsIG9mIHRoZSBPVlMgZmFtaWxpZXMgdXNlIHRoaXMgaGVhZGVyLgorICovCisKK3N0cnVjdCBvdnNfaGVhZGVyIHsKKwlpbnQgZHBfaWZpbmRleDsKK307CisKKy8qIERhdGFwYXRocy4gKi8KKworI2RlZmluZSBPVlNfREFUQVBBVEhfRkFNSUxZICAib3ZzX2RhdGFwYXRoIgorI2RlZmluZSBPVlNfREFUQVBBVEhfTUNHUk9VUCAib3ZzX2RhdGFwYXRoIgorI2RlZmluZSBPVlNfREFUQVBBVEhfVkVSU0lPTiAweDEKKworZW51bSBvdnNfZGF0YXBhdGhfY21kIHsKKwlPVlNfRFBfQ01EX1VOU1BFQywKKwlPVlNfRFBfQ01EX05FVywKKwlPVlNfRFBfQ01EX0RFTCwKKwlPVlNfRFBfQ01EX0dFVCwKKwlPVlNfRFBfQ01EX1NFVAorfTsKKworLyoqCisgKiBlbnVtIG92c19kYXRhcGF0aF9hdHRyIC0gYXR0cmlidXRlcyBmb3IgJU9WU19EUF8qIGNvbW1hbmRzLgorICogQE9WU19EUF9BVFRSX05BTUU6IE5hbWUgb2YgdGhlIG5ldHdvcmsgZGV2aWNlIHRoYXQgc2VydmVzIGFzIHRoZSAibG9jYWwKKyAqIHBvcnQiLiAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgbmV0d29yayBkZXZpY2Ugd2hvc2UgZHBfaWZpbmRleCBpcyBnaXZlbiBpbgorICogdGhlICZzdHJ1Y3Qgb3ZzX2hlYWRlci4gIEFsd2F5cyBwcmVzZW50IGluIG5vdGlmaWNhdGlvbnMuICBSZXF1aXJlZCBpbgorICogJU9WU19EUF9ORVcgcmVxdWVzdHMuICBNYXkgYmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nCisgKiBkcF9pZmluZGV4IGluIG90aGVyIHJlcXVlc3RzICh3aXRoIGEgZHBfaWZpbmRleCBvZiAwKS4KKyAqIEBPVlNfRFBfQVRUUl9VUENBTExfUElEOiBUaGUgTmV0bGluayBzb2NrZXQgaW4gdXNlcnNwYWNlIHRoYXQgaXMgaW5pdGlhbGx5CisgKiBzZXQgb24gdGhlIGRhdGFwYXRoIHBvcnQgKGZvciBPVlNfQUNUSU9OX0FUVFJfTUlTUykuICBPbmx5IHZhbGlkIG9uCisgKiAlT1ZTX0RQX0NNRF9ORVcgcmVxdWVzdHMuIEEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdCB1cGNhbGxzIHNob3VsZAorICogbm90IGJlIHNlbnQuCisgKiBAT1ZTX0RQX0FUVFJfU1RBVFM6IFN0YXRpc3RpY3MgYWJvdXQgcGFja2V0cyB0aGF0IGhhdmUgcGFzc2VkIHRocm91Z2ggdGhlCisgKiBkYXRhcGF0aC4gIEFsd2F5cyBwcmVzZW50IGluIG5vdGlmaWNhdGlvbnMuCisgKgorICogVGhlc2UgYXR0cmlidXRlcyBmb2xsb3cgdGhlICZzdHJ1Y3Qgb3ZzX2hlYWRlciB3aXRoaW4gdGhlIEdlbmVyaWMgTmV0bGluaworICogcGF5bG9hZCBmb3IgJU9WU19EUF8qIGNvbW1hbmRzLgorICovCitlbnVtIG92c19kYXRhcGF0aF9hdHRyIHsKKwlPVlNfRFBfQVRUUl9VTlNQRUMsCisJT1ZTX0RQX0FUVFJfTkFNRSwgICAgICAgLyogbmFtZSBvZiBkcF9pZmluZGV4IG5ldGRldiAqLworCU9WU19EUF9BVFRSX1VQQ0FMTF9QSUQsIC8qIE5ldGxpbmsgUElEIHRvIHJlY2VpdmUgdXBjYWxscyAqLworCU9WU19EUF9BVFRSX1NUQVRTLCAgICAgIC8qIHN0cnVjdCBvdnNfZHBfc3RhdHMgKi8KKwlfX09WU19EUF9BVFRSX01BWAorfTsKKworI2RlZmluZSBPVlNfRFBfQVRUUl9NQVggKF9fT1ZTX0RQX0FUVFJfTUFYIC0gMSkKKworc3RydWN0IG92c19kcF9zdGF0cyB7CisJX191NjQgbl9oaXQ7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmbG93IHRhYmxlIG1hdGNoZXMuICovCisJX191NjQgbl9taXNzZWQ7ICAgICAgICAgIC8qIE51bWJlciBvZiBmbG93IHRhYmxlIG1pc3Nlcy4gKi8KKwlfX3U2NCBuX2xvc3Q7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIG1pc3NlcyBub3Qgc2VudCB0byB1c2Vyc3BhY2UuICovCisJX191NjQgbl9mbG93czsgICAgICAgICAgIC8qIE51bWJlciBvZiBmbG93cyBwcmVzZW50ICovCit9OworCitzdHJ1Y3Qgb3ZzX3Zwb3J0X3N0YXRzIHsKKwlfX3U2NCAgIHJ4X3BhY2tldHM7CQkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkICAgICAgICovCisJX191NjQgICB0eF9wYWNrZXRzOwkJLyogdG90YWwgcGFja2V0cyB0cmFuc21pdHRlZCAgICAqLworCV9fdTY0ICAgcnhfYnl0ZXM7CQkvKiB0b3RhbCBieXRlcyByZWNlaXZlZCAgICAgICAgICovCisJX191NjQgICB0eF9ieXRlczsJCS8qIHRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkICAgICAgKi8KKwlfX3U2NCAgIHJ4X2Vycm9yczsJCS8qIGJhZCBwYWNrZXRzIHJlY2VpdmVkICAgICAgICAgKi8KKwlfX3U2NCAgIHR4X2Vycm9yczsJCS8qIHBhY2tldCB0cmFuc21pdCBwcm9ibGVtcyAgICAgKi8KKwlfX3U2NCAgIHJ4X2Ryb3BwZWQ7CQkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzICAgICovCisJX191NjQgICB0eF9kcm9wcGVkOwkJLyogbm8gc3BhY2UgYXZhaWxhYmxlIGluIGxpbnV4ICAqLworfTsKKworLyogRml4ZWQgbG9naWNhbCBwb3J0cy4gKi8KKyNkZWZpbmUgT1ZTUF9MT0NBTCAgICAgICgoX191MTYpMCkKKworLyogUGFja2V0IHRyYW5zZmVyLiAqLworCisjZGVmaW5lIE9WU19QQUNLRVRfRkFNSUxZICJvdnNfcGFja2V0IgorI2RlZmluZSBPVlNfUEFDS0VUX1ZFUlNJT04gMHgxCisKK2VudW0gb3ZzX3BhY2tldF9jbWQgeworCU9WU19QQUNLRVRfQ01EX1VOU1BFQywKKworCS8qIEtlcm5lbC10by11c2VyIG5vdGlmaWNhdGlvbnMuICovCisJT1ZTX1BBQ0tFVF9DTURfTUlTUywgICAgLyogRmxvdyB0YWJsZSBtaXNzLiAqLworCU9WU19QQUNLRVRfQ01EX0FDVElPTiwgIC8qIE9WU19BQ1RJT05fQVRUUl9VU0VSU1BBQ0UgYWN0aW9uLiAqLworCisJLyogVXNlcnNwYWNlIGNvbW1hbmRzLiAqLworCU9WU19QQUNLRVRfQ01EX0VYRUNVVEUgIC8qIEFwcGx5IGFjdGlvbnMgdG8gYSBwYWNrZXQuICovCit9OworCisvKioKKyAqIGVudW0gb3ZzX3BhY2tldF9hdHRyIC0gYXR0cmlidXRlcyBmb3IgJU9WU19QQUNLRVRfKiBjb21tYW5kcy4KKyAqIEBPVlNfUEFDS0VUX0FUVFJfUEFDS0VUOiBQcmVzZW50IGZvciBhbGwgbm90aWZpY2F0aW9ucy4gIENvbnRhaW5zIHRoZSBlbnRpcmUKKyAqIHBhY2tldCBhcyByZWNlaXZlZCwgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIEV0aGVybmV0IGhlYWRlciBvbndhcmQuICBGb3IKKyAqICVPVlNfUEFDS0VUX0NNRF9BQ1RJT04sICVPVlNfUEFDS0VUX0FUVFJfUEFDS0VUIHJlZmxlY3RzIGNoYW5nZXMgbWFkZSBieQorICogYWN0aW9ucyBwcmVjZWRpbmcgJU9WU19BQ1RJT05fQVRUUl9VU0VSU1BBQ0UsIGJ1dCAlT1ZTX1BBQ0tFVF9BVFRSX0tFWSBpcworICogdGhlIGZsb3cga2V5IGV4dHJhY3RlZCBmcm9tIHRoZSBwYWNrZXQgYXMgb3JpZ2luYWxseSByZWNlaXZlZC4KKyAqIEBPVlNfUEFDS0VUX0FUVFJfS0VZOiBQcmVzZW50IGZvciBhbGwgbm90aWZpY2F0aW9ucy4gIENvbnRhaW5zIHRoZSBmbG93IGtleQorICogZXh0cmFjdGVkIGZyb20gdGhlIHBhY2tldCBhcyBuZXN0ZWQgJU9WU19LRVlfQVRUUl8qIGF0dHJpYnV0ZXMuICBUaGlzIGFsbG93cworICogdXNlcnNwYWNlIHRvIGFkYXB0IGl0cyBmbG93IHNldHVwIHN0cmF0ZWd5IGJ5IGNvbXBhcmluZyBpdHMgbm90aW9uIG9mIHRoZQorICogZmxvdyBrZXkgYWdhaW5zdCB0aGUga2VybmVsJ3MuCisgKiBAT1ZTX1BBQ0tFVF9BVFRSX0FDVElPTlM6IENvbnRhaW5zIGFjdGlvbnMgZm9yIHRoZSBwYWNrZXQuICBVc2VkCisgKiBmb3IgJU9WU19QQUNLRVRfQ01EX0VYRUNVVEUuICBJdCBoYXMgbmVzdGVkICVPVlNfQUNUSU9OX0FUVFJfKiBhdHRyaWJ1dGVzLgorICogQE9WU19QQUNLRVRfQVRUUl9VU0VSREFUQTogUHJlc2VudCBmb3IgYW4gJU9WU19QQUNLRVRfQ01EX0FDVElPTgorICogbm90aWZpY2F0aW9uIGlmIHRoZSAlT1ZTX0FDVElPTl9BVFRSX1VTRVJTUEFDRSBhY3Rpb24gc3BlY2lmaWVkIGFuCisgKiAlT1ZTX1VTRVJTUEFDRV9BVFRSX1VTRVJEQVRBIGF0dHJpYnV0ZS4KKyAqCisgKiBUaGVzZSBhdHRyaWJ1dGVzIGZvbGxvdyB0aGUgJnN0cnVjdCBvdnNfaGVhZGVyIHdpdGhpbiB0aGUgR2VuZXJpYyBOZXRsaW5rCisgKiBwYXlsb2FkIGZvciAlT1ZTX1BBQ0tFVF8qIGNvbW1hbmRzLgorICovCitlbnVtIG92c19wYWNrZXRfYXR0ciB7CisJT1ZTX1BBQ0tFVF9BVFRSX1VOU1BFQywKKwlPVlNfUEFDS0VUX0FUVFJfUEFDS0VULCAgICAgIC8qIFBhY2tldCBkYXRhLiAqLworCU9WU19QQUNLRVRfQVRUUl9LRVksICAgICAgICAgLyogTmVzdGVkIE9WU19LRVlfQVRUUl8qIGF0dHJpYnV0ZXMuICovCisJT1ZTX1BBQ0tFVF9BVFRSX0FDVElPTlMsICAgICAvKiBOZXN0ZWQgT1ZTX0FDVElPTl9BVFRSXyogYXR0cmlidXRlcy4gKi8KKwlPVlNfUEFDS0VUX0FUVFJfVVNFUkRBVEEsICAgIC8qIHU2NCBPVlNfQUNUSU9OX0FUVFJfVVNFUlNQQUNFIGFyZy4gKi8KKwlfX09WU19QQUNLRVRfQVRUUl9NQVgKK307CisKKyNkZWZpbmUgT1ZTX1BBQ0tFVF9BVFRSX01BWCAoX19PVlNfUEFDS0VUX0FUVFJfTUFYIC0gMSkKKworLyogVmlydHVhbCBwb3J0cy4gKi8KKworI2RlZmluZSBPVlNfVlBPUlRfRkFNSUxZICAib3ZzX3Zwb3J0IgorI2RlZmluZSBPVlNfVlBPUlRfTUNHUk9VUCAib3ZzX3Zwb3J0IgorI2RlZmluZSBPVlNfVlBPUlRfVkVSU0lPTiAweDEKKworZW51bSBvdnNfdnBvcnRfY21kIHsKKwlPVlNfVlBPUlRfQ01EX1VOU1BFQywKKwlPVlNfVlBPUlRfQ01EX05FVywKKwlPVlNfVlBPUlRfQ01EX0RFTCwKKwlPVlNfVlBPUlRfQ01EX0dFVCwKKwlPVlNfVlBPUlRfQ01EX1NFVAorfTsKKworZW51bSBvdnNfdnBvcnRfdHlwZSB7CisJT1ZTX1ZQT1JUX1RZUEVfVU5TUEVDLAorCU9WU19WUE9SVF9UWVBFX05FVERFViwgICAvKiBuZXR3b3JrIGRldmljZSAqLworCU9WU19WUE9SVF9UWVBFX0lOVEVSTkFMLCAvKiBuZXR3b3JrIGRldmljZSBpbXBsZW1lbnRlZCBieSBkYXRhcGF0aCAqLworCV9fT1ZTX1ZQT1JUX1RZUEVfTUFYCit9OworCisjZGVmaW5lIE9WU19WUE9SVF9UWVBFX01BWCAoX19PVlNfVlBPUlRfVFlQRV9NQVggLSAxKQorCisvKioKKyAqIGVudW0gb3ZzX3Zwb3J0X2F0dHIgLSBhdHRyaWJ1dGVzIGZvciAlT1ZTX1ZQT1JUXyogY29tbWFuZHMuCisgKiBAT1ZTX1ZQT1JUX0FUVFJfUE9SVF9OTzogMzItYml0IHBvcnQgbnVtYmVyIHdpdGhpbiBkYXRhcGF0aC4KKyAqIEBPVlNfVlBPUlRfQVRUUl9UWVBFOiAzMi1iaXQgJU9WU19WUE9SVF9UWVBFXyogY29uc3RhbnQgZGVzY3JpYmluZyB0aGUgdHlwZQorICogb2YgdnBvcnQuCisgKiBAT1ZTX1ZQT1JUX0FUVFJfTkFNRTogTmFtZSBvZiB2cG9ydC4gIEZvciBhIHZwb3J0IGJhc2VkIG9uIGEgbmV0d29yayBkZXZpY2UKKyAqIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgZGV2aWNlLiAgTWF4aW11bSBsZW5ndGggJUlGTkFNU0laLTEgYnl0ZXMKKyAqIHBsdXMgYSBudWxsIHRlcm1pbmF0b3IuCisgKiBAT1ZTX1ZQT1JUX0FUVFJfT1BUSU9OUzogVnBvcnQtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4KKyAqIEBPVlNfVlBPUlRfQVRUUl9VUENBTExfUElEOiBUaGUgTmV0bGluayBzb2NrZXQgaW4gdXNlcnNwYWNlIHRoYXQKKyAqIE9WU19QQUNLRVRfQ01EX01JU1MgdXBjYWxscyB3aWxsIGJlIGRpcmVjdGVkIHRvIGZvciBwYWNrZXRzIHJlY2VpdmVkIG9uCisgKiB0aGlzIHBvcnQuICBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdXBjYWxscyBzaG91bGQgbm90IGJlIHNlbnQuCisgKiBAT1ZTX1ZQT1JUX0FUVFJfU1RBVFM6IEEgJnN0cnVjdCBvdnNfdnBvcnRfc3RhdHMgZ2l2aW5nIHN0YXRpc3RpY3MgZm9yCisgKiBwYWNrZXRzIHNlbnQgb3IgcmVjZWl2ZWQgdGhyb3VnaCB0aGUgdnBvcnQuCisgKgorICogVGhlc2UgYXR0cmlidXRlcyBmb2xsb3cgdGhlICZzdHJ1Y3Qgb3ZzX2hlYWRlciB3aXRoaW4gdGhlIEdlbmVyaWMgTmV0bGluaworICogcGF5bG9hZCBmb3IgJU9WU19WUE9SVF8qIGNvbW1hbmRzLgorICoKKyAqIEZvciAlT1ZTX1ZQT1JUX0NNRF9ORVcgcmVxdWVzdHMsIHRoZSAlT1ZTX1ZQT1JUX0FUVFJfVFlQRSBhbmQKKyAqICVPVlNfVlBPUlRfQVRUUl9OQU1FIGF0dHJpYnV0ZXMgYXJlIHJlcXVpcmVkLiAgJU9WU19WUE9SVF9BVFRSX1BPUlRfTk8gaXMKKyAqIG9wdGlvbmFsOyBpZiBub3Qgc3BlY2lmaWVkIGEgZnJlZSBwb3J0IG51bWJlciBpcyBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkLgorICogV2hldGhlciAlT1ZTX1ZQT1JUX0FUVFJfT1BUSU9OUyBpcyByZXF1aXJlZCBvciBvcHRpb25hbCBkZXBlbmRzIG9uIHRoZSB0eXBlCisgKiBvZiB2cG9ydC4KKyAqIGFuZCBvdGhlciBhdHRyaWJ1dGVzIGFyZSBpZ25vcmVkLgorICoKKyAqIEZvciBvdGhlciByZXF1ZXN0cywgaWYgJU9WU19WUE9SVF9BVFRSX05BTUUgaXMgc3BlY2lmaWVkIHRoZW4gaXQgaXMgdXNlZCB0bworICogbG9vayB1cCB0aGUgdnBvcnQgdG8gb3BlcmF0ZSBvbjsgb3RoZXJ3aXNlIGRwX2lkeCBmcm9tIHRoZSAmc3RydWN0CisgKiBvdnNfaGVhZGVyIHBsdXMgJU9WU19WUE9SVF9BVFRSX1BPUlRfTk8gZGV0ZXJtaW5lIHRoZSB2cG9ydC4KKyAqLworZW51bSBvdnNfdnBvcnRfYXR0ciB7CisJT1ZTX1ZQT1JUX0FUVFJfVU5TUEVDLAorCU9WU19WUE9SVF9BVFRSX1BPUlRfTk8sCS8qIHUzMiBwb3J0IG51bWJlciB3aXRoaW4gZGF0YXBhdGggKi8KKwlPVlNfVlBPUlRfQVRUUl9UWVBFLAkvKiB1MzIgT1ZTX1ZQT1JUX1RZUEVfKiBjb25zdGFudC4gKi8KKwlPVlNfVlBPUlRfQVRUUl9OQU1FLAkvKiBzdHJpbmcgbmFtZSwgdXAgdG8gSUZOQU1TSVogYnl0ZXMgbG9uZyAqLworCU9WU19WUE9SVF9BVFRSX09QVElPTlMsIC8qIG5lc3RlZCBhdHRyaWJ1dGVzLCB2YXJpZXMgYnkgdnBvcnQgdHlwZSAqLworCU9WU19WUE9SVF9BVFRSX1VQQ0FMTF9QSUQsIC8qIHUzMiBOZXRsaW5rIFBJRCB0byByZWNlaXZlIHVwY2FsbHMgKi8KKwlPVlNfVlBPUlRfQVRUUl9TVEFUUywJLyogc3RydWN0IG92c192cG9ydF9zdGF0cyAqLworCV9fT1ZTX1ZQT1JUX0FUVFJfTUFYCit9OworCisjZGVmaW5lIE9WU19WUE9SVF9BVFRSX01BWCAoX19PVlNfVlBPUlRfQVRUUl9NQVggLSAxKQorCisvKiBGbG93cy4gKi8KKworI2RlZmluZSBPVlNfRkxPV19GQU1JTFkgICJvdnNfZmxvdyIKKyNkZWZpbmUgT1ZTX0ZMT1dfTUNHUk9VUCAib3ZzX2Zsb3ciCisjZGVmaW5lIE9WU19GTE9XX1ZFUlNJT04gMHgxCisKK2VudW0gb3ZzX2Zsb3dfY21kIHsKKwlPVlNfRkxPV19DTURfVU5TUEVDLAorCU9WU19GTE9XX0NNRF9ORVcsCisJT1ZTX0ZMT1dfQ01EX0RFTCwKKwlPVlNfRkxPV19DTURfR0VULAorCU9WU19GTE9XX0NNRF9TRVQKK307CisKK3N0cnVjdCBvdnNfZmxvd19zdGF0cyB7CisJX191NjQgbl9wYWNrZXRzOyAgICAgICAgIC8qIE51bWJlciBvZiBtYXRjaGVkIHBhY2tldHMuICovCisJX191NjQgbl9ieXRlczsgICAgICAgICAgIC8qIE51bWJlciBvZiBtYXRjaGVkIGJ5dGVzLiAqLworfTsKKworZW51bSBvdnNfa2V5X2F0dHIgeworCU9WU19LRVlfQVRUUl9VTlNQRUMsCisJT1ZTX0tFWV9BVFRSX0VOQ0FQLAkvKiBOZXN0ZWQgc2V0IG9mIGVuY2Fwc3VsYXRlZCBhdHRyaWJ1dGVzLiAqLworCU9WU19LRVlfQVRUUl9QUklPUklUWSwgIC8qIHUzMiBza2ItPnByaW9yaXR5ICovCisJT1ZTX0tFWV9BVFRSX0lOX1BPUlQsICAgLyogdTMyIE9WUyBkcCBwb3J0IG51bWJlciAqLworCU9WU19LRVlfQVRUUl9FVEhFUk5FVCwgIC8qIHN0cnVjdCBvdnNfa2V5X2V0aGVybmV0ICovCisJT1ZTX0tFWV9BVFRSX1ZMQU4sCS8qIGJlMTYgVkxBTiBUQ0kgKi8KKwlPVlNfS0VZX0FUVFJfRVRIRVJUWVBFLAkvKiBiZTE2IEV0aGVybmV0IHR5cGUgKi8KKwlPVlNfS0VZX0FUVFJfSVBWNCwgICAgICAvKiBzdHJ1Y3Qgb3ZzX2tleV9pcHY0ICovCisJT1ZTX0tFWV9BVFRSX0lQVjYsICAgICAgLyogc3RydWN0IG92c19rZXlfaXB2NiAqLworCU9WU19LRVlfQVRUUl9UQ1AsICAgICAgIC8qIHN0cnVjdCBvdnNfa2V5X3RjcCAqLworCU9WU19LRVlfQVRUUl9VRFAsICAgICAgIC8qIHN0cnVjdCBvdnNfa2V5X3VkcCAqLworCU9WU19LRVlfQVRUUl9JQ01QLCAgICAgIC8qIHN0cnVjdCBvdnNfa2V5X2ljbXAgKi8KKwlPVlNfS0VZX0FUVFJfSUNNUFY2LCAgICAvKiBzdHJ1Y3Qgb3ZzX2tleV9pY21wdjYgKi8KKwlPVlNfS0VZX0FUVFJfQVJQLCAgICAgICAvKiBzdHJ1Y3Qgb3ZzX2tleV9hcnAgKi8KKwlPVlNfS0VZX0FUVFJfTkQsICAgICAgICAvKiBzdHJ1Y3Qgb3ZzX2tleV9uZCAqLworCV9fT1ZTX0tFWV9BVFRSX01BWAorfTsKKworI2RlZmluZSBPVlNfS0VZX0FUVFJfTUFYIChfX09WU19LRVlfQVRUUl9NQVggLSAxKQorCisvKioKKyAqIGVudW0gb3ZzX2ZyYWdfdHlwZSAtIElQdjQgYW5kIElQdjYgZnJhZ21lbnQgdHlwZQorICogQE9WU19GUkFHX1RZUEVfTk9ORTogUGFja2V0IGlzIG5vdCBhIGZyYWdtZW50LgorICogQE9WU19GUkFHX1RZUEVfRklSU1Q6IFBhY2tldCBpcyBhIGZyYWdtZW50IHdpdGggb2Zmc2V0IDAuCisgKiBAT1ZTX0ZSQUdfVFlQRV9MQVRFUjogUGFja2V0IGlzIGEgZnJhZ21lbnQgd2l0aCBub256ZXJvIG9mZnNldC4KKyAqCisgKiBVc2VkIGFzIHRoZSBAaXB2NF9mcmFnIGluICZzdHJ1Y3Qgb3ZzX2tleV9pcHY0IGFuZCBhcyBAaXB2Nl9mcmFnICZzdHJ1Y3QKKyAqIG92c19rZXlfaXB2Ni4KKyAqLworZW51bSBvdnNfZnJhZ190eXBlIHsKKwlPVlNfRlJBR19UWVBFX05PTkUsCisJT1ZTX0ZSQUdfVFlQRV9GSVJTVCwKKwlPVlNfRlJBR19UWVBFX0xBVEVSLAorCV9fT1ZTX0ZSQUdfVFlQRV9NQVgKK307CisKKyNkZWZpbmUgT1ZTX0ZSQUdfVFlQRV9NQVggKF9fT1ZTX0ZSQUdfVFlQRV9NQVggLSAxKQorCitzdHJ1Y3Qgb3ZzX2tleV9ldGhlcm5ldCB7CisJX191OAkgZXRoX3NyY1s2XTsKKwlfX3U4CSBldGhfZHN0WzZdOworfTsKKworc3RydWN0IG92c19rZXlfaXB2NCB7CisJX19iZTMyIGlwdjRfc3JjOworCV9fYmUzMiBpcHY0X2RzdDsKKwlfX3U4ICAgaXB2NF9wcm90bzsKKwlfX3U4ICAgaXB2NF90b3M7CisJX191OCAgIGlwdjRfdHRsOworCV9fdTggICBpcHY0X2ZyYWc7CS8qIE9uZSBvZiBPVlNfRlJBR19UWVBFXyouICovCit9OworCitzdHJ1Y3Qgb3ZzX2tleV9pcHY2IHsKKwlfX2JlMzIgaXB2Nl9zcmNbNF07CisJX19iZTMyIGlwdjZfZHN0WzRdOworCV9fYmUzMiBpcHY2X2xhYmVsOwkvKiAyMC1iaXRzIGluIGxlYXN0LXNpZ25pZmljYW50IGJpdHMuICovCisJX191OCAgIGlwdjZfcHJvdG87CisJX191OCAgIGlwdjZfdGNsYXNzOworCV9fdTggICBpcHY2X2hsaW1pdDsKKwlfX3U4ICAgaXB2Nl9mcmFnOwkvKiBPbmUgb2YgT1ZTX0ZSQUdfVFlQRV8qLiAqLworfTsKKworc3RydWN0IG92c19rZXlfdGNwIHsKKwlfX2JlMTYgdGNwX3NyYzsKKwlfX2JlMTYgdGNwX2RzdDsKK307CisKK3N0cnVjdCBvdnNfa2V5X3VkcCB7CisJX19iZTE2IHVkcF9zcmM7CisJX19iZTE2IHVkcF9kc3Q7Cit9OworCitzdHJ1Y3Qgb3ZzX2tleV9pY21wIHsKKwlfX3U4IGljbXBfdHlwZTsKKwlfX3U4IGljbXBfY29kZTsKK307CisKK3N0cnVjdCBvdnNfa2V5X2ljbXB2NiB7CisJX191OCBpY21wdjZfdHlwZTsKKwlfX3U4IGljbXB2Nl9jb2RlOworfTsKKworc3RydWN0IG92c19rZXlfYXJwIHsKKwlfX2JlMzIgYXJwX3NpcDsKKwlfX2JlMzIgYXJwX3RpcDsKKwlfX2JlMTYgYXJwX29wOworCV9fdTggICBhcnBfc2hhWzZdOworCV9fdTggICBhcnBfdGhhWzZdOworfTsKKworc3RydWN0IG92c19rZXlfbmQgeworCV9fdTMyIG5kX3RhcmdldFs0XTsKKwlfX3U4ICBuZF9zbGxbNl07CisJX191OCAgbmRfdGxsWzZdOworfTsKKworLyoqCisgKiBlbnVtIG92c19mbG93X2F0dHIgLSBhdHRyaWJ1dGVzIGZvciAlT1ZTX0ZMT1dfKiBjb21tYW5kcy4KKyAqIEBPVlNfRkxPV19BVFRSX0tFWTogTmVzdGVkICVPVlNfS0VZX0FUVFJfKiBhdHRyaWJ1dGVzIHNwZWNpZnlpbmcgdGhlIGZsb3cKKyAqIGtleS4gIEFsd2F5cyBwcmVzZW50IGluIG5vdGlmaWNhdGlvbnMuICBSZXF1aXJlZCBmb3IgYWxsIHJlcXVlc3RzIChleGNlcHQKKyAqIGR1bXBzKS4KKyAqIEBPVlNfRkxPV19BVFRSX0FDVElPTlM6IE5lc3RlZCAlT1ZTX0FDVElPTl9BVFRSXyogYXR0cmlidXRlcyBzcGVjaWZ5aW5nCisgKiB0aGUgYWN0aW9ucyB0byB0YWtlIGZvciBwYWNrZXRzIHRoYXQgbWF0Y2ggdGhlIGtleS4gIEFsd2F5cyBwcmVzZW50IGluCisgKiBub3RpZmljYXRpb25zLiAgUmVxdWlyZWQgZm9yICVPVlNfRkxPV19DTURfTkVXIHJlcXVlc3RzLCBvcHRpb25hbCBmb3IKKyAqICVPVlNfRkxPV19DTURfU0VUIHJlcXVlc3RzLgorICogQE9WU19GTE9XX0FUVFJfU1RBVFM6ICZzdHJ1Y3Qgb3ZzX2Zsb3dfc3RhdHMgZ2l2aW5nIHN0YXRpc3RpY3MgZm9yIHRoaXMKKyAqIGZsb3cuICBQcmVzZW50IGluIG5vdGlmaWNhdGlvbnMgaWYgdGhlIHN0YXRzIHdvdWxkIGJlIG5vbnplcm8uICBJZ25vcmVkIGluCisgKiByZXF1ZXN0cy4KKyAqIEBPVlNfRkxPV19BVFRSX1RDUF9GTEFHUzogQW4gOC1iaXQgdmFsdWUgZ2l2aW5nIHRoZSBPUidkIHZhbHVlIG9mIGFsbCBvZiB0aGUKKyAqIFRDUCBmbGFncyBzZWVuIG9uIHBhY2tldHMgaW4gdGhpcyBmbG93LiAgT25seSBwcmVzZW50IGluIG5vdGlmaWNhdGlvbnMgZm9yCisgKiBUQ1AgZmxvd3MsIGFuZCBvbmx5IGlmIGl0IHdvdWxkIGJlIG5vbnplcm8uICBJZ25vcmVkIGluIHJlcXVlc3RzLgorICogQE9WU19GTE9XX0FUVFJfVVNFRDogQSA2NC1iaXQgaW50ZWdlciBnaXZpbmcgdGhlIHRpbWUsIGluIG1pbGxpc2Vjb25kcyBvbgorICogdGhlIHN5c3RlbSBtb25vdG9uaWMgY2xvY2ssIGF0IHdoaWNoIGEgcGFja2V0IHdhcyBsYXN0IHByb2Nlc3NlZCBmb3IgdGhpcworICogZmxvdy4gIE9ubHkgcHJlc2VudCBpbiBub3RpZmljYXRpb25zIGlmIGEgcGFja2V0IGhhcyBiZWVuIHByb2Nlc3NlZCBmb3IgdGhpcworICogZmxvdy4gIElnbm9yZWQgaW4gcmVxdWVzdHMuCisgKiBAT1ZTX0ZMT1dfQVRUUl9DTEVBUjogSWYgcHJlc2VudCBpbiBhICVPVlNfRkxPV19DTURfU0VUIHJlcXVlc3QsIGNsZWFycyB0aGUKKyAqIGxhc3QtdXNlZCB0aW1lLCBhY2N1bXVsYXRlZCBUQ1AgZmxhZ3MsIGFuZCBzdGF0aXN0aWNzIGZvciB0aGlzIGZsb3cuCisgKiBPdGhlcndpc2UgaWdub3JlZCBpbiByZXF1ZXN0cy4gIE5ldmVyIHByZXNlbnQgaW4gbm90aWZpY2F0aW9ucy4KKyAqCisgKiBUaGVzZSBhdHRyaWJ1dGVzIGZvbGxvdyB0aGUgJnN0cnVjdCBvdnNfaGVhZGVyIHdpdGhpbiB0aGUgR2VuZXJpYyBOZXRsaW5rCisgKiBwYXlsb2FkIGZvciAlT1ZTX0ZMT1dfKiBjb21tYW5kcy4KKyAqLworZW51bSBvdnNfZmxvd19hdHRyIHsKKwlPVlNfRkxPV19BVFRSX1VOU1BFQywKKwlPVlNfRkxPV19BVFRSX0tFWSwgICAgICAgLyogU2VxdWVuY2Ugb2YgT1ZTX0tFWV9BVFRSXyogYXR0cmlidXRlcy4gKi8KKwlPVlNfRkxPV19BVFRSX0FDVElPTlMsICAgLyogTmVzdGVkIE9WU19BQ1RJT05fQVRUUl8qIGF0dHJpYnV0ZXMuICovCisJT1ZTX0ZMT1dfQVRUUl9TVEFUUywgICAgIC8qIHN0cnVjdCBvdnNfZmxvd19zdGF0cy4gKi8KKwlPVlNfRkxPV19BVFRSX1RDUF9GTEFHUywgLyogOC1iaXQgT1InZCBUQ1AgZmxhZ3MuICovCisJT1ZTX0ZMT1dfQVRUUl9VU0VELCAgICAgIC8qIHU2NCBtc2VjcyBsYXN0IHVzZWQgaW4gbW9ub3RvbmljIHRpbWUuICovCisJT1ZTX0ZMT1dfQVRUUl9DTEVBUiwgICAgIC8qIEZsYWcgdG8gY2xlYXIgc3RhdHMsIHRjcF9mbGFncywgdXNlZC4gKi8KKwlfX09WU19GTE9XX0FUVFJfTUFYCit9OworCisjZGVmaW5lIE9WU19GTE9XX0FUVFJfTUFYIChfX09WU19GTE9XX0FUVFJfTUFYIC0gMSkKKworLyoqCisgKiBlbnVtIG92c19zYW1wbGVfYXR0ciAtIEF0dHJpYnV0ZXMgZm9yICVPVlNfQUNUSU9OX0FUVFJfU0FNUExFIGFjdGlvbi4KKyAqIEBPVlNfU0FNUExFX0FUVFJfUFJPQkFCSUxJVFk6IDMyLWJpdCBmcmFjdGlvbiBvZiBwYWNrZXRzIHRvIHNhbXBsZSB3aXRoCisgKiBAT1ZTX0FDVElPTl9BVFRSX1NBTVBMRS4gIEEgdmFsdWUgb2YgMCBzYW1wbGVzIG5vIHBhY2tldHMsIGEgdmFsdWUgb2YKKyAqICVVSU5UMzJfTUFYIHNhbXBsZXMgYWxsIHBhY2tldHMgYW5kIGludGVybWVkaWF0ZSB2YWx1ZXMgc2FtcGxlIGludGVybWVkaWF0ZQorICogZnJhY3Rpb25zIG9mIHBhY2tldHMuCisgKiBAT1ZTX1NBTVBMRV9BVFRSX0FDVElPTlM6IFNldCBvZiBhY3Rpb25zIHRvIGV4ZWN1dGUgaW4gc2FtcGxpbmcgZXZlbnQuCisgKiBBY3Rpb25zIGFyZSBwYXNzZWQgYXMgbmVzdGVkIGF0dHJpYnV0ZXMuCisgKgorICogRXhlY3V0ZXMgdGhlIHNwZWNpZmllZCBhY3Rpb25zIHdpdGggdGhlIGdpdmVuIHByb2JhYmlsaXR5IG9uIGEgcGVyLXBhY2tldAorICogYmFzaXMuCisgKi8KK2VudW0gb3ZzX3NhbXBsZV9hdHRyIHsKKwlPVlNfU0FNUExFX0FUVFJfVU5TUEVDLAorCU9WU19TQU1QTEVfQVRUUl9QUk9CQUJJTElUWSwgLyogdTMyIG51bWJlciAqLworCU9WU19TQU1QTEVfQVRUUl9BQ1RJT05TLCAgICAgLyogTmVzdGVkIE9WU19BQ1RJT05fQVRUUl8qIGF0dHJpYnV0ZXMuICovCisJX19PVlNfU0FNUExFX0FUVFJfTUFYLAorfTsKKworI2RlZmluZSBPVlNfU0FNUExFX0FUVFJfTUFYIChfX09WU19TQU1QTEVfQVRUUl9NQVggLSAxKQorCisvKioKKyAqIGVudW0gb3ZzX3VzZXJzcGFjZV9hdHRyIC0gQXR0cmlidXRlcyBmb3IgJU9WU19BQ1RJT05fQVRUUl9VU0VSU1BBQ0UgYWN0aW9uLgorICogQE9WU19VU0VSU1BBQ0VfQVRUUl9QSUQ6IHUzMiBOZXRsaW5rIFBJRCB0byB3aGljaCB0aGUgJU9WU19QQUNLRVRfQ01EX0FDVElPTgorICogbWVzc2FnZSBzaG91bGQgYmUgc2VudC4gIFJlcXVpcmVkLgorICogQE9WU19VU0VSU1BBQ0VfQVRUUl9VU0VSREFUQTogSWYgcHJlc2VudCwgaXRzIHU2NCBhcmd1bWVudCBpcyBjb3BpZWQgdG8gdGhlCisgKiAlT1ZTX1BBQ0tFVF9DTURfQUNUSU9OIG1lc3NhZ2UgYXMgJU9WU19QQUNLRVRfQVRUUl9VU0VSREFUQSwKKyAqLworZW51bSBvdnNfdXNlcnNwYWNlX2F0dHIgeworCU9WU19VU0VSU1BBQ0VfQVRUUl9VTlNQRUMsCisJT1ZTX1VTRVJTUEFDRV9BVFRSX1BJRCwJICAgICAgLyogdTMyIE5ldGxpbmsgUElEIHRvIHJlY2VpdmUgdXBjYWxscy4gKi8KKwlPVlNfVVNFUlNQQUNFX0FUVFJfVVNFUkRBVEEsICAvKiB1NjQgb3B0aW9uYWwgdXNlci1zcGVjaWZpZWQgY29va2llLiAqLworCV9fT1ZTX1VTRVJTUEFDRV9BVFRSX01BWAorfTsKKworI2RlZmluZSBPVlNfVVNFUlNQQUNFX0FUVFJfTUFYIChfX09WU19VU0VSU1BBQ0VfQVRUUl9NQVggLSAxKQorCisvKioKKyAqIHN0cnVjdCBvdnNfYWN0aW9uX3B1c2hfdmxhbiAtICVPVlNfQUNUSU9OX0FUVFJfUFVTSF9WTEFOIGFjdGlvbiBhcmd1bWVudC4KKyAqIEB2bGFuX3RwaWQ6IFRhZyBwcm90b2NvbCBpZGVudGlmaWVyIChUUElEKSB0byBwdXNoLgorICogQHZsYW5fdGNpOiBUYWcgY29udHJvbCBpZGVudGlmaWVyIChUQ0kpIHRvIHB1c2guICBUaGUgQ0ZJIGJpdCBtdXN0IGJlIHNldAorICogKGJ1dCBpdCB3aWxsIG5vdCBiZSBzZXQgaW4gdGhlIDgwMi4xUSBoZWFkZXIgdGhhdCBpcyBwdXNoZWQpLgorICoKKyAqIFRoZSBAdmxhbl90cGlkIHZhbHVlIGlzIHR5cGljYWxseSAlRVRIX1BfODAyMVEuICBUaGUgb25seSBhY2NlcHRhYmxlIFRQSUQKKyAqIHZhbHVlcyBhcmUgdGhvc2UgdGhhdCB0aGUga2VybmVsIG1vZHVsZSBhbHNvIHBhcnNlcyBhcyA4MDIuMVEgaGVhZGVycywgdG8KKyAqIHByZXZlbnQgJU9WU19BQ1RJT05fQVRUUl9QVVNIX1ZMQU4gZm9sbG93ZWQgYnkgJU9WU19BQ1RJT05fQVRUUl9QT1BfVkxBTgorICogZnJvbSBoYXZpbmcgc3VycHJpc2luZyByZXN1bHRzLgorICovCitzdHJ1Y3Qgb3ZzX2FjdGlvbl9wdXNoX3ZsYW4geworCV9fYmUxNiB2bGFuX3RwaWQ7CS8qIDgwMi4xUSBUUElELiAqLworCV9fYmUxNiB2bGFuX3RjaTsJLyogODAyLjFRIFRDSSAoVkxBTiBJRCBhbmQgcHJpb3JpdHkpLiAqLworfTsKKworLyoqCisgKiBlbnVtIG92c19hY3Rpb25fYXR0ciAtIEFjdGlvbiB0eXBlcy4KKyAqCisgKiBAT1ZTX0FDVElPTl9BVFRSX09VVFBVVDogT3V0cHV0IHBhY2tldCB0byBwb3J0LgorICogQE9WU19BQ1RJT05fQVRUUl9VU0VSU1BBQ0U6IFNlbmQgcGFja2V0IHRvIHVzZXJzcGFjZSBhY2NvcmRpbmcgdG8gbmVzdGVkCisgKiAlT1ZTX1VTRVJTUEFDRV9BVFRSXyogYXR0cmlidXRlcy4KKyAqIEBPVlNfQUNUSU9OX0FUVFJfU0VUOiBSZXBsYWNlcyB0aGUgY29udGVudHMgb2YgYW4gZXhpc3RpbmcgaGVhZGVyLiAgVGhlCisgKiBzaW5nbGUgbmVzdGVkICVPVlNfS0VZX0FUVFJfKiBhdHRyaWJ1dGUgc3BlY2lmaWVzIGEgaGVhZGVyIHRvIG1vZGlmeSBhbmQgaXRzCisgKiB2YWx1ZS4KKyAqIEBPVlNfQUNUSU9OX0FUVFJfUFVTSF9WTEFOOiBQdXNoIGEgbmV3IG91dGVybW9zdCA4MDIuMVEgaGVhZGVyIG9udG8gdGhlCisgKiBwYWNrZXQuCisgKiBAT1ZTX0FDVElPTl9BVFRSX1BPUF9WTEFOOiBQb3AgdGhlIG91dGVybW9zdCA4MDIuMVEgaGVhZGVyIG9mZiB0aGUgcGFja2V0LgorICogQE9WU19BQ1RJT05fQVRUUl9TQU1QTEU6IFByb2JhYmlsaXRpY2FsbHkgZXhlY3V0ZXMgYWN0aW9ucywgYXMgc3BlY2lmaWVkIGluCisgKiB0aGUgbmVzdGVkICVPVlNfU0FNUExFX0FUVFJfKiBhdHRyaWJ1dGVzLgorICoKKyAqIE9ubHkgYSBzaW5nbGUgaGVhZGVyIGNhbiBiZSBzZXQgd2l0aCBhIHNpbmdsZSAlT1ZTX0FDVElPTl9BVFRSX1NFVC4gIE5vdCBhbGwKKyAqIGZpZWxkcyB3aXRoaW4gYSBoZWFkZXIgYXJlIG1vZGlmaWFibGUsIGUuZy4gdGhlIElQdjQgcHJvdG9jb2wgYW5kIGZyYWdtZW50CisgKiB0eXBlIG1heSBub3QgYmUgY2hhbmdlZC4KKyAqLworCitlbnVtIG92c19hY3Rpb25fYXR0ciB7CisJT1ZTX0FDVElPTl9BVFRSX1VOU1BFQywKKwlPVlNfQUNUSU9OX0FUVFJfT1VUUFVULAkgICAgICAvKiB1MzIgcG9ydCBudW1iZXIuICovCisJT1ZTX0FDVElPTl9BVFRSX1VTRVJTUEFDRSwgICAgLyogTmVzdGVkIE9WU19VU0VSU1BBQ0VfQVRUUl8qLiAqLworCU9WU19BQ1RJT05fQVRUUl9TRVQsICAgICAgICAgIC8qIE9uZSBuZXN0ZWQgT1ZTX0tFWV9BVFRSXyouICovCisJT1ZTX0FDVElPTl9BVFRSX1BVU0hfVkxBTiwgICAgLyogc3RydWN0IG92c19hY3Rpb25fcHVzaF92bGFuLiAqLworCU9WU19BQ1RJT05fQVRUUl9QT1BfVkxBTiwgICAgIC8qIE5vIGFyZ3VtZW50LiAqLworCU9WU19BQ1RJT05fQVRUUl9TQU1QTEUsICAgICAgIC8qIE5lc3RlZCBPVlNfU0FNUExFX0FUVFJfKi4gKi8KKwlfX09WU19BQ1RJT05fQVRUUl9NQVgKK307CisKKyNkZWZpbmUgT1ZTX0FDVElPTl9BVFRSX01BWCAoX19PVlNfQUNUSU9OX0FUVFJfTUFYIC0gMSkKKworI2VuZGlmIC8qIF9MSU5VWF9PUEVOVlNXSVRDSF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BjaV9pZHMuaCBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCmluZGV4IDE3MmJhNzAuLjJhYWVlMGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCisrKyBiL2luY2x1ZGUvbGludXgvcGNpX2lkcy5oCkBAIC01MTcsOCArNTE3LDEyIEBACiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzExSF9OQl9EUkFNCTB4MTMwMgogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xMUhfTkJfTUlTQwkweDEzMDMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTFIX05CX0xJTksJMHgxMzA0CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE1SF9OQl9GMAkweDE2MDAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTVIX05CX0YxCTB4MTYwMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNUhfTkJfRjIJMHgxNjAyCiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EXzE1SF9OQl9GMwkweDE2MDMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfMTVIX05CX0Y0CTB4MTYwNAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF8xNUhfTkJfRjUJMHgxNjA1CiAjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQU1EX0NOQjE3SF9GMwkweDE3MDMKICNkZWZpbmUgUENJX0RFVklDRV9JRF9BTURfTEFOQ0UJCTB4MjAwMAogI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FNRF9MQU5DRV9IT01FCTB4MjAwMQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wZXJmX2V2ZW50LmggYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAppbmRleCAxZTllYmU1Li4wODg1NTYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BlcmZfZXZlbnQuaApAQCAtNTQsNiArNTQsNyBAQAogCVBFUkZfQ09VTlRfSFdfQlVTX0NZQ0xFUwkJPSA2LAogCVBFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfRlJPTlRFTkQJPSA3LAogCVBFUkZfQ09VTlRfSFdfU1RBTExFRF9DWUNMRVNfQkFDS0VORAk9IDgsCisJUEVSRl9DT1VOVF9IV19SRUZfQ1BVX0NZQ0xFUwkJPSA5LAogCiAJUEVSRl9DT1VOVF9IV19NQVgsCQkJLyogbm9uLUFCSSAqLwogfTsKQEAgLTgyMiw2ICs4MjMsNyBAQAogCWludAkJCQltbWFwX2xvY2tlZDsKIAlzdHJ1Y3QgdXNlcl9zdHJ1Y3QJCSptbWFwX3VzZXI7CiAJc3RydWN0IHJpbmdfYnVmZmVyCQkqcmI7CisJc3RydWN0IGxpc3RfaGVhZAkJcmJfZW50cnk7CiAKIAkvKiBwb2xsIHJlbGF0ZWQgKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdAkJd2FpdHE7CkBAIC04ODksNiArODkxLDcgQEAKIAlpbnQJCQkJbnJfYWN0aXZlOwogCWludAkJCQlpc19hY3RpdmU7CiAJaW50CQkJCW5yX3N0YXQ7CisJaW50CQkJCW5yX2ZyZXE7CiAJaW50CQkJCXJvdGF0ZV9kaXNhYmxlOwogCWF0b21pY190CQkJcmVmY291bnQ7CiAJc3RydWN0IHRhc2tfc3RydWN0CQkqdGFzazsKQEAgLTEwNjIsMTIgKzEwNjUsMTIgQEAKIAl9CiB9CiAKLWV4dGVybiBzdHJ1Y3QganVtcF9sYWJlbF9rZXkgcGVyZl9zY2hlZF9ldmVudHM7CitleHRlcm4gc3RydWN0IGp1bXBfbGFiZWxfa2V5X2RlZmVycmVkIHBlcmZfc2NoZWRfZXZlbnRzOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9ldmVudF90YXNrX3NjaGVkX2luKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKIAkJCQkJICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKLQlpZiAoc3RhdGljX2JyYW5jaCgmcGVyZl9zY2hlZF9ldmVudHMpKQorCWlmIChzdGF0aWNfYnJhbmNoKCZwZXJmX3NjaGVkX2V2ZW50cy5rZXkpKQogCQlfX3BlcmZfZXZlbnRfdGFza19zY2hlZF9pbihwcmV2LCB0YXNrKTsKIH0KIApAQCAtMTA3Niw3ICsxMDc5LDcgQEAKIHsKIAlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQ09OVEVYVF9TV0lUQ0hFUywgMSwgTlVMTCwgMCk7CiAKLQlpZiAoc3RhdGljX2JyYW5jaCgmcGVyZl9zY2hlZF9ldmVudHMpKQorCWlmIChzdGF0aWNfYnJhbmNoKCZwZXJmX3NjaGVkX2V2ZW50cy5rZXkpKQogCQlfX3BlcmZfZXZlbnRfdGFza19zY2hlZF9vdXQocHJldiwgbmV4dCk7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcGhvbmV0LmggYi9pbmNsdWRlL2xpbnV4L3Bob25ldC5oCmluZGV4IGY1M2E0MTYuLmY0OGJmYzggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvcGhvbmV0LmgKKysrIGIvaW5jbHVkZS9saW51eC9waG9uZXQuaApAQCAtMzgsNiArMzgsNyBAQAogI2RlZmluZSBQTlBJUEVfRU5DQVAJCTEKICNkZWZpbmUgUE5QSVBFX0lGSU5ERVgJCTIKICNkZWZpbmUgUE5QSVBFX0hBTkRMRQkJMworI2RlZmluZSBQTlBJUEVfSU5JVFNUQVRFCTQKIAogI2RlZmluZSBQTkFERFJfQU5ZCQkwCiAjZGVmaW5lIFBOQUREUl9CUk9BRENBU1QJMHhGQwpAQCAtNDksNiArNTAsNyBAQAogCiAvKiBpb2N0bHMgKi8KICNkZWZpbmUgU0lPQ1BOR0VUT0JKRUNUCQkoU0lPQ1BST1RPUFJJVkFURSArIDApCisjZGVmaW5lIFNJT0NQTkVOQUJMRVBJUEUJKFNJT0NQUk9UT1BSSVZBVEUgKyAxMykKICNkZWZpbmUgU0lPQ1BOQUREUkVTT1VSQ0UJKFNJT0NQUk9UT1BSSVZBVEUgKyAxNCkKICNkZWZpbmUgU0lPQ1BOREVMUkVTT1VSQ0UJKFNJT0NQUk9UT1BSSVZBVEUgKyAxNSkKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmgKaW5kZXggYzUzMzY3MC4uOGYxYjkyOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3BrdF9zY2hlZC5oCkBAIC0zMCw3ICszMCw3IEBACiAgKi8KIAogc3RydWN0IHRjX3N0YXRzIHsKLQlfX3U2NAlieXRlczsJCQkvKiBOVW1iZXIgb2YgZW5xdWV1ZXMgYnl0ZXMgKi8KKwlfX3U2NAlieXRlczsJCQkvKiBOdW1iZXIgb2YgZW5xdWV1ZWQgYnl0ZXMgKi8KIAlfX3UzMglwYWNrZXRzOwkJLyogTnVtYmVyIG9mIGVucXVldWVkIHBhY2tldHMJKi8KIAlfX3UzMglkcm9wczsJCQkvKiBQYWNrZXRzIGRyb3BwZWQgYmVjYXVzZSBvZiBsYWNrIG9mIHJlc291cmNlcyAqLwogCV9fdTMyCW92ZXJsaW1pdHM7CQkvKiBOdW1iZXIgb2YgdGhyb3R0bGUgZXZlbnRzIHdoZW4gdGhpcwpAQCAtMTYyLDI1ICsxNjIsMjQgQEAKIAl1bnNpZ25lZAlmbG93czsJCS8qIE1heGltYWwgbnVtYmVyIG9mIGZsb3dzICAqLwogfTsKIAorc3RydWN0IHRjX3NmcV9xb3B0X3YxIHsKKwlzdHJ1Y3QgdGNfc2ZxX3FvcHQgdjA7CisJdW5zaWduZWQgaW50CWRlcHRoOwkJLyogbWF4IG51bWJlciBvZiBwYWNrZXRzIHBlciBmbG93ICovCisJdW5zaWduZWQgaW50CWhlYWRkcm9wOworfTsKKworCiBzdHJ1Y3QgdGNfc2ZxX3hzdGF0cyB7CiAJX19zMzIJCWFsbG90OwogfTsKIAotLyoKLSAqICBOT1RFOiBsaW1pdCwgZGl2aXNvciBhbmQgZmxvd3MgYXJlIGhhcmR3aXJlZCB0byBjb2RlIGF0IHRoZSBtb21lbnQuCi0gKgotICoJbGltaXQ9Zmxvd3M9MTI4LCBkaXZpc29yPTEwMjQ7Ci0gKgotICoJVGhlIG9ubHkgcmVhc29uIGZvciB0aGlzIGlzIGVmZmljaWVuY3ksIGl0IGlzIHBvc3NpYmxlCi0gKgl0byBjaGFuZ2UgdGhlc2UgcGFyYW1ldGVycyBpbiBjb21waWxlIHRpbWUuCi0gKi8KLQogLyogUkVEIHNlY3Rpb24gKi8KIAogZW51bSB7CiAJVENBX1JFRF9VTlNQRUMsCiAJVENBX1JFRF9QQVJNUywKIAlUQ0FfUkVEX1NUQUIsCisJVENBX1JFRF9NQVhfUCwKIAlfX1RDQV9SRURfTUFYLAogfTsKIApAQCAtMTk0LDggKzE5Myw5IEBACiAJdW5zaWduZWQgY2hhciAgIFBsb2c7CQkvKiBsb2coUF9tYXgvKHF0aF9tYXgtcXRoX21pbikpCSovCiAJdW5zaWduZWQgY2hhciAgIFNjZWxsX2xvZzsJLyogY2VsbCBzaXplIGZvciBpZGxlIGRhbXBpbmcgKi8KIAl1bnNpZ25lZCBjaGFyCWZsYWdzOwotI2RlZmluZSBUQ19SRURfRUNOCTEKLSNkZWZpbmUgVENfUkVEX0hBUkREUk9QCTIKKyNkZWZpbmUgVENfUkVEX0VDTgkJMQorI2RlZmluZSBUQ19SRURfSEFSRERST1AJCTIKKyNkZWZpbmUgVENfUkVEX0FEQVBUQVRJVkUJNAogfTsKIAogc3RydWN0IHRjX3JlZF94c3RhdHMgewpAQCAtMjE0LDYgKzIxNCw3IEBACiAgICAgICAgVENBX0dSRURfUEFSTVMsCiAgICAgICAgVENBX0dSRURfU1RBQiwKICAgICAgICBUQ0FfR1JFRF9EUFMsCisgICAgICAgVENBX0dSRURfTUFYX1AsCiAJICAgX19UQ0FfR1JFRF9NQVgsCiB9OwogCkBAIC0yNTMsNiArMjU0LDcgQEAKIAlUQ0FfQ0hPS0VfVU5TUEVDLAogCVRDQV9DSE9LRV9QQVJNUywKIAlUQ0FfQ0hPS0VfU1RBQiwKKwlUQ0FfQ0hPS0VfTUFYX1AsCiAJX19UQ0FfQ0hPS0VfTUFYLAogfTsKIApAQCAtMjk3LDcgKzI5OSw3IEBACiAJX191MzIgZGVidWc7CQkvKiBkZWJ1ZyBmbGFncyAqLwogCiAJLyogc3RhdHMgKi8KLQlfX3UzMiBkaXJlY3RfcGt0czsgLyogY291bnQgb2Ygbm9uIHNoYXBwZWQgcGFja2V0cyAqLworCV9fdTMyIGRpcmVjdF9wa3RzOyAvKiBjb3VudCBvZiBub24gc2hhcGVkIHBhY2tldHMgKi8KIH07CiBlbnVtIHsKIAlUQ0FfSFRCX1VOU1BFQywKQEAgLTQ2NSw2ICs0NjcsNyBAQAogCVRDQV9ORVRFTV9SRU9SREVSLAogCVRDQV9ORVRFTV9DT1JSVVBULAogCVRDQV9ORVRFTV9MT1NTLAorCVRDQV9ORVRFTV9SQVRFLAogCV9fVENBX05FVEVNX01BWCwKIH07CiAKQEAgLTQ5NSw2ICs0OTgsMTMgQEAKIAlfX3UzMgljb3JyZWxhdGlvbjsKIH07CiAKK3N0cnVjdCB0Y19uZXRlbV9yYXRlIHsKKwlfX3UzMglyYXRlOwkvKiBieXRlL3MgKi8KKwlfX3MzMglwYWNrZXRfb3ZlcmhlYWQ7CisJX191MzIJY2VsbF9zaXplOworCV9fczMyCWNlbGxfb3ZlcmhlYWQ7Cit9OworCiBlbnVtIHsKIAlORVRFTV9MT1NTX1VOU1BFQywKIAlORVRFTV9MT1NTX0dJLAkJLyogR2VuZXJhbCBJbnR1aXRpdmUgLSA0IHN0YXRlIG1vZGVsICovCkBAIC01MDMsNyArNTEzLDcgQEAKIH07CiAjZGVmaW5lIE5FVEVNX0xPU1NfTUFYIChfX05FVEVNX0xPU1NfTUFYIC0gMSkKIAotLyogU3RhdGUgdHJhbnNpdGlvbiBwcm9iYWJsaXRpZXMgZm9yIDQgc3RhdGUgbW9kZWwgKi8KKy8qIFN0YXRlIHRyYW5zaXRpb24gcHJvYmFiaWxpdGllcyBmb3IgNCBzdGF0ZSBtb2RlbCAqLwogc3RydWN0IHRjX25ldGVtX2dpbW9kZWwgewogCV9fdTMyCXAxMzsKIAlfX3UzMglwMzE7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BvaXNvbi5oIGIvaW5jbHVkZS9saW51eC9wb2lzb24uaAppbmRleCA3OTE1OWRlLi4yMTEwYTgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3BvaXNvbi5oCisrKyBiL2luY2x1ZGUvbGludXgvcG9pc29uLmgKQEAgLTQwLDEyICs0MCw2IEBACiAjZGVmaW5lCVJFRF9JTkFDVElWRQkweDA5RjkxMTAyOUQ3NEUzNUJVTEwJLyogd2hlbiBvYmogaXMgaW5hY3RpdmUgKi8KICNkZWZpbmUJUkVEX0FDVElWRQkweEQ4NDE1NkM1NjM1Njg4QzBVTEwJLyogd2hlbiBvYmogaXMgYWN0aXZlICovCiAKLSNpZmRlZiBDT05GSUdfUEhZU19BRERSX1RfNjRCSVQKLSNkZWZpbmUgTUVNQkxPQ0tfSU5BQ1RJVkUJMHgzYTg0ZmIwMTQ0YzllNzFiVUxMCi0jZWxzZQotI2RlZmluZSBNRU1CTE9DS19JTkFDVElWRQkweDQ0YzllNzFiVUwKLSNlbmRpZgotCiAjZGVmaW5lIFNMVUJfUkVEX0lOQUNUSVZFCTB4YmIKICNkZWZpbmUgU0xVQl9SRURfQUNUSVZFCQkweGNjCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaCBiL2luY2x1ZGUvbGludXgvcmN1cGRhdGUuaAppbmRleCAyY2Y0MjI2Li44MWMwNGY0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdXBkYXRlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3VwZGF0ZS5oCkBAIC01MSw2ICs1MSw4IEBACiAjaWYgZGVmaW5lZChDT05GSUdfVFJFRV9SQ1UpIHx8IGRlZmluZWQoQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UpCiBleHRlcm4gdm9pZCByY3V0b3J0dXJlX3JlY29yZF90ZXN0X3RyYW5zaXRpb24odm9pZCk7CiBleHRlcm4gdm9pZCByY3V0b3J0dXJlX3JlY29yZF9wcm9ncmVzcyh1bnNpZ25lZCBsb25nIHZlcm51bSk7CitleHRlcm4gdm9pZCBkb190cmFjZV9yY3VfdG9ydHVyZV9yZWFkKGNoYXIgKnJjdXRvcnR1cmVuYW1lLAorCQkJCSAgICAgIHN0cnVjdCByY3VfaGVhZCAqcmhwKTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgcmN1dG9ydHVyZV9yZWNvcmRfdGVzdF90cmFuc2l0aW9uKHZvaWQpCiB7CkBAIC01OCw2ICs2MCwxMiBAQAogc3RhdGljIGlubGluZSB2b2lkIHJjdXRvcnR1cmVfcmVjb3JkX3Byb2dyZXNzKHVuc2lnbmVkIGxvbmcgdmVybnVtKQogewogfQorI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UKK2V4dGVybiB2b2lkIGRvX3RyYWNlX3JjdV90b3J0dXJlX3JlYWQoY2hhciAqcmN1dG9ydHVyZW5hbWUsCisJCQkJICAgICAgc3RydWN0IHJjdV9oZWFkICpyaHApOworI2Vsc2UKKyNkZWZpbmUgZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChyY3V0b3J0dXJlbmFtZSwgcmhwKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKICNlbmRpZgogCiAjZGVmaW5lIFVJTlRfQ01QX0dFKGEsIGIpCShVSU5UX01BWCAvIDIgPj0gKGEpIC0gKGIpKQpAQCAtMTc3LDIzICsxODUsMTAgQEAKIGV4dGVybiB2b2lkIHJjdV9iaF9xcyhpbnQgY3B1KTsKIGV4dGVybiB2b2lkIHJjdV9jaGVja19jYWxsYmFja3MoaW50IGNwdSwgaW50IHVzZXIpOwogc3RydWN0IG5vdGlmaWVyX2Jsb2NrOwotCi0jaWZkZWYgQ09ORklHX05PX0haCi0KLWV4dGVybiB2b2lkIHJjdV9lbnRlcl9ub2h6KHZvaWQpOwotZXh0ZXJuIHZvaWQgcmN1X2V4aXRfbm9oeih2b2lkKTsKLQotI2Vsc2UgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgcmN1X2VudGVyX25vaHoodm9pZCkKLXsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHJjdV9leGl0X25vaHoodm9pZCkKLXsKLX0KLQotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfTk9fSFogKi8KK2V4dGVybiB2b2lkIHJjdV9pZGxlX2VudGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgcmN1X2lkbGVfZXhpdCh2b2lkKTsKK2V4dGVybiB2b2lkIHJjdV9pcnFfZW50ZXIodm9pZCk7CitleHRlcm4gdm9pZCByY3VfaXJxX2V4aXQodm9pZCk7CiAKIC8qCiAgKiBJbmZyYXN0cnVjdHVyZSB0byBpbXBsZW1lbnQgdGhlIHN5bmNocm9uaXplXygpIHByaW1pdGl2ZXMgaW4KQEAgLTIzMywyMiArMjI4LDMwIEBACiAKICNpZmRlZiBDT05GSUdfREVCVUdfTE9DS19BTExPQwogCisjaWZkZWYgQ09ORklHX1BST1ZFX1JDVQorZXh0ZXJuIGludCByY3VfaXNfY3B1X2lkbGUodm9pZCk7CisjZWxzZSAvKiAhQ09ORklHX1BST1ZFX1JDVSAqLworc3RhdGljIGlubGluZSBpbnQgcmN1X2lzX2NwdV9pZGxlKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogZWxzZSAhQ09ORklHX1BST1ZFX1JDVSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcmN1X2xvY2tfYWNxdWlyZShzdHJ1Y3QgbG9ja2RlcF9tYXAgKm1hcCkKK3sKKwlXQVJOX09OX09OQ0UocmN1X2lzX2NwdV9pZGxlKCkpOworCWxvY2tfYWNxdWlyZShtYXAsIDAsIDAsIDIsIDEsIE5VTEwsIF9USElTX0lQXyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByY3VfbG9ja19yZWxlYXNlKHN0cnVjdCBsb2NrZGVwX21hcCAqbWFwKQoreworCVdBUk5fT05fT05DRShyY3VfaXNfY3B1X2lkbGUoKSk7CisJbG9ja19yZWxlYXNlKG1hcCwgMSwgX1RISVNfSVBfKTsKK30KKwogZXh0ZXJuIHN0cnVjdCBsb2NrZGVwX21hcCByY3VfbG9ja19tYXA7Ci0jIGRlZmluZSByY3VfcmVhZF9hY3F1aXJlKCkgXAotCQlsb2NrX2FjcXVpcmUoJnJjdV9sb2NrX21hcCwgMCwgMCwgMiwgMSwgTlVMTCwgX1RISVNfSVBfKQotIyBkZWZpbmUgcmN1X3JlYWRfcmVsZWFzZSgpCWxvY2tfcmVsZWFzZSgmcmN1X2xvY2tfbWFwLCAxLCBfVEhJU19JUF8pCi0KIGV4dGVybiBzdHJ1Y3QgbG9ja2RlcF9tYXAgcmN1X2JoX2xvY2tfbWFwOwotIyBkZWZpbmUgcmN1X3JlYWRfYWNxdWlyZV9iaCgpIFwKLQkJbG9ja19hY3F1aXJlKCZyY3VfYmhfbG9ja19tYXAsIDAsIDAsIDIsIDEsIE5VTEwsIF9USElTX0lQXykKLSMgZGVmaW5lIHJjdV9yZWFkX3JlbGVhc2VfYmgoKQlsb2NrX3JlbGVhc2UoJnJjdV9iaF9sb2NrX21hcCwgMSwgX1RISVNfSVBfKQotCiBleHRlcm4gc3RydWN0IGxvY2tkZXBfbWFwIHJjdV9zY2hlZF9sb2NrX21hcDsKLSMgZGVmaW5lIHJjdV9yZWFkX2FjcXVpcmVfc2NoZWQoKSBcCi0JCWxvY2tfYWNxdWlyZSgmcmN1X3NjaGVkX2xvY2tfbWFwLCAwLCAwLCAyLCAxLCBOVUxMLCBfVEhJU19JUF8pCi0jIGRlZmluZSByY3VfcmVhZF9yZWxlYXNlX3NjaGVkKCkgXAotCQlsb2NrX3JlbGVhc2UoJnJjdV9zY2hlZF9sb2NrX21hcCwgMSwgX1RISVNfSVBfKQotCiBleHRlcm4gaW50IGRlYnVnX2xvY2tkZXBfcmN1X2VuYWJsZWQodm9pZCk7CiAKIC8qKgpAQCAtMjYyLDExICsyNjUsMTggQEAKICAqCiAgKiBDaGVja3MgZGVidWdfbG9ja2RlcF9yY3VfZW5hYmxlZCgpIHRvIHByZXZlbnQgZmFsc2UgcG9zaXRpdmVzIGR1cmluZyBib290CiAgKiBhbmQgd2hpbGUgbG9ja2RlcCBpcyBkaXNhYmxlZC4KKyAqCisgKiBOb3RlIHRoYXQgcmN1X3JlYWRfbG9jaygpIGFuZCB0aGUgbWF0Y2hpbmcgcmN1X3JlYWRfdW5sb2NrKCkgbXVzdAorICogb2NjdXIgaW4gdGhlIHNhbWUgY29udGV4dCwgZm9yIGV4YW1wbGUsIGl0IGlzIGlsbGVnYWwgdG8gaW52b2tlCisgKiByY3VfcmVhZF91bmxvY2soKSBpbiBwcm9jZXNzIGNvbnRleHQgaWYgdGhlIG1hdGNoaW5nIHJjdV9yZWFkX2xvY2soKQorICogd2FzIGludm9rZWQgZnJvbSB3aXRoaW4gYW4gaXJxIGhhbmRsZXIuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHJjdV9yZWFkX2xvY2tfaGVsZCh2b2lkKQogewogCWlmICghZGVidWdfbG9ja2RlcF9yY3VfZW5hYmxlZCgpKQogCQlyZXR1cm4gMTsKKwlpZiAocmN1X2lzX2NwdV9pZGxlKCkpCisJCXJldHVybiAwOwogCXJldHVybiBsb2NrX2lzX2hlbGQoJnJjdV9sb2NrX21hcCk7CiB9CiAKQEAgLTI5MCw2ICszMDAsMTkgQEAKICAqCiAgKiBDaGVjayBkZWJ1Z19sb2NrZGVwX3JjdV9lbmFibGVkKCkgdG8gcHJldmVudCBmYWxzZSBwb3NpdGl2ZXMgZHVyaW5nIGJvb3QKICAqIGFuZCB3aGlsZSBsb2NrZGVwIGlzIGRpc2FibGVkLgorICoKKyAqIE5vdGUgdGhhdCBpZiB0aGUgQ1BVIGlzIGluIHRoZSBpZGxlIGxvb3AgZnJvbSBhbiBSQ1UgcG9pbnQgb2YKKyAqIHZpZXcgKGllOiB0aGF0IHdlIGFyZSBpbiB0aGUgc2VjdGlvbiBiZXR3ZWVuIHJjdV9pZGxlX2VudGVyKCkgYW5kCisgKiByY3VfaWRsZV9leGl0KCkpIHRoZW4gcmN1X3JlYWRfbG9ja19oZWxkKCkgcmV0dXJucyBmYWxzZSBldmVuIGlmIHRoZSBDUFUKKyAqIGRpZCBhbiByY3VfcmVhZF9sb2NrKCkuICBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgUkNVIGlnbm9yZXMgQ1BVcworICogdGhhdCBhcmUgaW4gc3VjaCBhIHNlY3Rpb24sIGNvbnNpZGVyaW5nIHRoZXNlIGFzIGluIGV4dGVuZGVkIHF1aWVzY2VudAorICogc3RhdGUsIHNvIHN1Y2ggYSBDUFUgaXMgZWZmZWN0aXZlbHkgbmV2ZXIgaW4gYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbAorICogc2VjdGlvbiByZWdhcmRsZXNzIG9mIHdoYXQgUkNVIHByaW1pdGl2ZXMgaXQgaW52b2tlcy4gIFRoaXMgc3RhdGUgb2YKKyAqIGFmZmFpcnMgaXMgcmVxdWlyZWQgLS0tIHdlIG5lZWQgdG8ga2VlcCBhbiBSQ1UtZnJlZSB3aW5kb3cgaW4gaWRsZQorICogd2hlcmUgdGhlIENQVSBtYXkgcG9zc2libHkgZW50ZXIgaW50byBsb3cgcG93ZXIgbW9kZS4gVGhpcyB3YXkgd2UgY2FuCisgKiBub3RpY2UgYW4gZXh0ZW5kZWQgcXVpZXNjZW50IHN0YXRlIHRvIG90aGVyIENQVXMgdGhhdCBzdGFydGVkIGEgZ3JhY2UKKyAqIHBlcmlvZC4gT3RoZXJ3aXNlIHdlIHdvdWxkIGRlbGF5IGFueSBncmFjZSBwZXJpb2QgYXMgbG9uZyBhcyB3ZSBydW4gaW4KKyAqIHRoZSBpZGxlIHRhc2suCiAgKi8KICNpZmRlZiBDT05GSUdfUFJFRU1QVF9DT1VOVAogc3RhdGljIGlubGluZSBpbnQgcmN1X3JlYWRfbG9ja19zY2hlZF9oZWxkKHZvaWQpCkBAIC0yOTgsNiArMzIxLDggQEAKIAogCWlmICghZGVidWdfbG9ja2RlcF9yY3VfZW5hYmxlZCgpKQogCQlyZXR1cm4gMTsKKwlpZiAocmN1X2lzX2NwdV9pZGxlKCkpCisJCXJldHVybiAwOwogCWlmIChkZWJ1Z19sb2NrcykKIAkJbG9ja2RlcF9vcGluaW9uID0gbG9ja19pc19oZWxkKCZyY3Vfc2NoZWRfbG9ja19tYXApOwogCXJldHVybiBsb2NrZGVwX29waW5pb24gfHwgcHJlZW1wdF9jb3VudCgpICE9IDAgfHwgaXJxc19kaXNhYmxlZCgpOwpAQCAtMzExLDEyICszMzYsOCBAQAogCiAjZWxzZSAvKiAjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgKi8KIAotIyBkZWZpbmUgcmN1X3JlYWRfYWNxdWlyZSgpCQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSByY3VfcmVhZF9yZWxlYXNlKCkJCWRvIHsgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIHJjdV9yZWFkX2FjcXVpcmVfYmgoKQkJZG8geyB9IHdoaWxlICgwKQotIyBkZWZpbmUgcmN1X3JlYWRfcmVsZWFzZV9iaCgpCQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSByY3VfcmVhZF9hY3F1aXJlX3NjaGVkKCkJZG8geyB9IHdoaWxlICgwKQotIyBkZWZpbmUgcmN1X3JlYWRfcmVsZWFzZV9zY2hlZCgpCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIHJjdV9sb2NrX2FjcXVpcmUoYSkJCWRvIHsgfSB3aGlsZSAoMCkKKyMgZGVmaW5lIHJjdV9sb2NrX3JlbGVhc2UoYSkJCWRvIHsgfSB3aGlsZSAoMCkKIAogc3RhdGljIGlubGluZSBpbnQgcmN1X3JlYWRfbG9ja19oZWxkKHZvaWQpCiB7CkBAIC02MzcsNyArNjU4LDcgQEAKIHsKIAlfX3JjdV9yZWFkX2xvY2soKTsKIAlfX2FjcXVpcmUoUkNVKTsKLQlyY3VfcmVhZF9hY3F1aXJlKCk7CisJcmN1X2xvY2tfYWNxdWlyZSgmcmN1X2xvY2tfbWFwKTsKIH0KIAogLyoKQEAgLTY1Nyw3ICs2NzgsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgcmN1X3JlYWRfdW5sb2NrKHZvaWQpCiB7Ci0JcmN1X3JlYWRfcmVsZWFzZSgpOworCXJjdV9sb2NrX3JlbGVhc2UoJnJjdV9sb2NrX21hcCk7CiAJX19yZWxlYXNlKFJDVSk7CiAJX19yY3VfcmVhZF91bmxvY2soKTsKIH0KQEAgLTY3MywxMiArNjk0LDE3IEBACiAgKiBjcml0aWNhbCBzZWN0aW9ucyBpbiBpbnRlcnJ1cHQgY29udGV4dCBjYW4gdXNlIGp1c3QgcmN1X3JlYWRfbG9jaygpLAogICogdGhvdWdoIHRoaXMgc2hvdWxkIGF0IGxlYXN0IGJlIGNvbW1lbnRlZCB0byBhdm9pZCBjb25mdXNpbmcgcGVvcGxlCiAgKiByZWFkaW5nIHRoZSBjb2RlLgorICoKKyAqIE5vdGUgdGhhdCByY3VfcmVhZF9sb2NrX2JoKCkgYW5kIHRoZSBtYXRjaGluZyByY3VfcmVhZF91bmxvY2tfYmgoKQorICogbXVzdCBvY2N1ciBpbiB0aGUgc2FtZSBjb250ZXh0LCBmb3IgZXhhbXBsZSwgaXQgaXMgaWxsZWdhbCB0byBpbnZva2UKKyAqIHJjdV9yZWFkX3VubG9ja19iaCgpIGZyb20gb25lIHRhc2sgaWYgdGhlIG1hdGNoaW5nIHJjdV9yZWFkX2xvY2tfYmgoKQorICogd2FzIGludm9rZWQgZnJvbSBzb21lIG90aGVyIHRhc2suCiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCByY3VfcmVhZF9sb2NrX2JoKHZvaWQpCiB7CiAJbG9jYWxfYmhfZGlzYWJsZSgpOwogCV9fYWNxdWlyZShSQ1VfQkgpOwotCXJjdV9yZWFkX2FjcXVpcmVfYmgoKTsKKwlyY3VfbG9ja19hY3F1aXJlKCZyY3VfYmhfbG9ja19tYXApOwogfQogCiAvKgpAQCAtNjg4LDcgKzcxNCw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCByY3VfcmVhZF91bmxvY2tfYmgodm9pZCkKIHsKLQlyY3VfcmVhZF9yZWxlYXNlX2JoKCk7CisJcmN1X2xvY2tfcmVsZWFzZSgmcmN1X2JoX2xvY2tfbWFwKTsKIAlfX3JlbGVhc2UoUkNVX0JIKTsKIAlsb2NhbF9iaF9lbmFibGUoKTsKIH0KQEAgLTcwMCwxMiArNzI2LDE3IEBACiAgKiBhcmUgYmVpbmcgZG9uZSB1c2luZyBjYWxsX3JjdV9zY2hlZCgpIG9yIHN5bmNocm9uaXplX3JjdV9zY2hlZCgpLgogICogUmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIGNhbiBhbHNvIGJlIGludHJvZHVjZWQgYnkgYW55dGhpbmcgdGhhdAogICogZGlzYWJsZXMgcHJlZW1wdGlvbiwgaW5jbHVkaW5nIGxvY2FsX2lycV9kaXNhYmxlKCkgYW5kIGZyaWVuZHMuCisgKgorICogTm90ZSB0aGF0IHJjdV9yZWFkX2xvY2tfc2NoZWQoKSBhbmQgdGhlIG1hdGNoaW5nIHJjdV9yZWFkX3VubG9ja19zY2hlZCgpCisgKiBtdXN0IG9jY3VyIGluIHRoZSBzYW1lIGNvbnRleHQsIGZvciBleGFtcGxlLCBpdCBpcyBpbGxlZ2FsIHRvIGludm9rZQorICogcmN1X3JlYWRfdW5sb2NrX3NjaGVkKCkgZnJvbSBwcm9jZXNzIGNvbnRleHQgaWYgdGhlIG1hdGNoaW5nCisgKiByY3VfcmVhZF9sb2NrX3NjaGVkKCkgd2FzIGludm9rZWQgZnJvbSBhbiBOTUkgaGFuZGxlci4KICAqLwogc3RhdGljIGlubGluZSB2b2lkIHJjdV9yZWFkX2xvY2tfc2NoZWQodm9pZCkKIHsKIAlwcmVlbXB0X2Rpc2FibGUoKTsKIAlfX2FjcXVpcmUoUkNVX1NDSEVEKTsKLQlyY3VfcmVhZF9hY3F1aXJlX3NjaGVkKCk7CisJcmN1X2xvY2tfYWNxdWlyZSgmcmN1X3NjaGVkX2xvY2tfbWFwKTsKIH0KIAogLyogVXNlZCBieSBsb2NrZGVwIGFuZCB0cmFjaW5nOiBjYW5ub3QgYmUgdHJhY2VkLCBjYW5ub3QgY2FsbCBsb2NrZGVwLiAqLwpAQCAtNzIyLDcgKzc1Myw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgdm9pZCByY3VfcmVhZF91bmxvY2tfc2NoZWQodm9pZCkKIHsKLQlyY3VfcmVhZF9yZWxlYXNlX3NjaGVkKCk7CisJcmN1X2xvY2tfcmVsZWFzZSgmcmN1X3NjaGVkX2xvY2tfbWFwKTsKIAlfX3JlbGVhc2UoUkNVX1NDSEVEKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zY2hlZC5oIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCmluZGV4IDFjNGYzZTkuLmNmMGViMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2NoZWQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKQEAgLTI3Myw5ICsyNzMsMTEgQEAKIAogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfTk9fSFopCiBleHRlcm4gdm9pZCBzZWxlY3Rfbm9oel9sb2FkX2JhbGFuY2VyKGludCBzdG9wX3RpY2spOworZXh0ZXJuIHZvaWQgc2V0X2NwdV9zZF9zdGF0ZV9pZGxlKHZvaWQpOwogZXh0ZXJuIGludCBnZXRfbm9oel90aW1lcl90YXJnZXQodm9pZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIHNlbGVjdF9ub2h6X2xvYWRfYmFsYW5jZXIoaW50IHN0b3BfdGljaykgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdV9zZF9zdGF0ZV9pZGxlKHZvaWQpIHsgfQogI2VuZGlmCiAKIC8qCkBAIC00ODMsOCArNDg1LDggQEAKIAogI2RlZmluZSBJTklUX0NQVVRJTUUJXAogCShzdHJ1Y3QgdGFza19jcHV0aW1lKSB7CQkJCQlcCi0JCS51dGltZSA9IGNwdXRpbWVfemVybywJCQkJXAotCQkuc3RpbWUgPSBjcHV0aW1lX3plcm8sCQkJCVwKKwkJLnV0aW1lID0gMCwJCQkJCVwKKwkJLnN0aW1lID0gMCwJCQkJCVwKIAkJLnN1bV9leGVjX3J1bnRpbWUgPSAwLAkJCQlcCiAJfQogCkBAIC05MDEsNiArOTAzLDEwIEBACiAJICogc2luZ2xlIENQVS4KIAkgKi8KIAl1bnNpZ25lZCBpbnQgcG93ZXIsIHBvd2VyX29yaWc7CisJLyoKKwkgKiBOdW1iZXIgb2YgYnVzeSBjcHVzIGluIHRoaXMgZ3JvdXAuCisJICovCisJYXRvbWljX3QgbnJfYnVzeV9jcHVzOwogfTsKIAogc3RydWN0IHNjaGVkX2dyb3VwIHsKQEAgLTkyNSw2ICs5MzEsMTUgQEAKIAlyZXR1cm4gdG9fY3B1bWFzayhzZy0+Y3B1bWFzayk7CiB9CiAKKy8qKgorICogZ3JvdXBfZmlyc3RfY3B1IC0gUmV0dXJucyB0aGUgZmlyc3QgY3B1IGluIHRoZSBjcHVtYXNrIG9mIGEgc2NoZWRfZ3JvdXAuCisgKiBAZ3JvdXA6IFRoZSBncm91cCB3aG9zZSBmaXJzdCBjcHUgaXMgdG8gYmUgcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdyb3VwX2ZpcnN0X2NwdShzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdyb3VwKQoreworCXJldHVybiBjcHVtYXNrX2ZpcnN0KHNjaGVkX2dyb3VwX2NwdXMoZ3JvdXApKTsKK30KKwogc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyIHsKIAlpbnQgcmVsYXhfZG9tYWluX2xldmVsOwogfTsKQEAgLTEzMTUsOCArMTMzMCw4IEBACiAJICogb2xkZXIgc2libGluZywgcmVzcGVjdGl2ZWx5LiAgKHAtPmZhdGhlciBjYW4gYmUgcmVwbGFjZWQgd2l0aCAKIAkgKiBwLT5yZWFsX3BhcmVudC0+cGlkKQogCSAqLwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqcmVhbF9wYXJlbnQ7IC8qIHJlYWwgcGFyZW50IHByb2Nlc3MgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBhcmVudDsgLyogcmVjaXBpZW50IG9mIFNJR0NITEQsIHdhaXQ0KCkgcmVwb3J0cyAqLworCXN0cnVjdCB0YXNrX3N0cnVjdCBfX3JjdSAqcmVhbF9wYXJlbnQ7IC8qIHJlYWwgcGFyZW50IHByb2Nlc3MgKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgX19yY3UgKnBhcmVudDsgLyogcmVjaXBpZW50IG9mIFNJR0NITEQsIHdhaXQ0KCkgcmVwb3J0cyAqLwogCS8qCiAJICogY2hpbGRyZW4vc2libGluZyBmb3JtcyB0aGUgbGlzdCBvZiBteSBuYXR1cmFsIGNoaWxkcmVuCiAJICovCkBAIC0yMDcwLDYgKzIwODUsMTQgQEAKIGV4dGVybiBpbnQgc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2soc3RydWN0IHRhc2tfc3RydWN0ICosIGludCwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CiBleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICppZGxlX3Rhc2soaW50IGNwdSk7CisvKioKKyAqIGlzX2lkbGVfdGFzayAtIGlzIHRoZSBzcGVjaWZpZWQgdGFzayBhbiBpZGxlIHRhc2s/CisgKiBAdHNrOiB0aGUgdGFzayBpbiBxdWVzdGlvbi4KKyAqLworc3RhdGljIGlubGluZSBib29sIGlzX2lkbGVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIHAtPnBpZCA9PSAwOworfQogZXh0ZXJuIHN0cnVjdCB0YXNrX3N0cnVjdCAqY3Vycl90YXNrKGludCBjcHUpOwogZXh0ZXJuIHZvaWQgc2V0X2N1cnJfdGFzayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmggYi9pbmNsdWRlL2xpbnV4L3NlY3VyaXR5LmgKaW5kZXggMTlkOGUwNC4uZThjNjE5ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zZWN1cml0eS5oCisrKyBiL2luY2x1ZGUvbGludXgvc2VjdXJpdHkuaApAQCAtMjA1Niw3ICsyMDU2LDcgQEAKIAkJCQkJCSAgIGNoYXIgKipuYW1lLCB2b2lkICoqdmFsdWUsCiAJCQkJCQkgICBzaXplX3QgKmxlbikKIHsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gLUVPUE5PVFNVUFA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHNlY3VyaXR5X2lub2RlX2NyZWF0ZShzdHJ1Y3QgaW5vZGUgKmRpciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2hyaW5rZXIuaCBiL2luY2x1ZGUvbGludXgvc2hyaW5rZXIuaAppbmRleCBhODM4MzNhLi4wN2NlYjk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3Nocmlua2VyLmgKKysrIGIvaW5jbHVkZS9saW51eC9zaHJpbmtlci5oCkBAIC0zNSw3ICszNSw3IEBACiAKIAkvKiBUaGVzZSBhcmUgZm9yIGludGVybmFsIHVzZSAqLwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlsb25nIG5yOwkvKiBvYmpzIHBlbmRpbmcgZGVsZXRlICovCisJYXRvbWljX2xvbmdfdCBucl9pbl9iYXRjaDsgLyogb2JqcyBwZW5kaW5nIGRlbGV0ZSAqLwogfTsKICNkZWZpbmUgREVGQVVMVF9TRUVLUyAyIC8qIEEgZ29vZCBudW1iZXIgaWYgeW91IGRvbid0IGtub3cgYmV0dGVyLiAqLwogZXh0ZXJuIHZvaWQgcmVnaXN0ZXJfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICopOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zaWdtYS5oIGIvaW5jbHVkZS9saW51eC9zaWdtYS5oCmluZGV4IGUyYWNjYjMuLmQwZGU4ODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2lnbWEuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NpZ21hLmgKQEAgLTI0LDcgKzI0LDcgQEAKIHN0cnVjdCBzaWdtYV9maXJtd2FyZV9oZWFkZXIgewogCXVuc2lnbmVkIGNoYXIgbWFnaWNbN107CiAJdTggdmVyc2lvbjsKLQl1MzIgY3JjOworCV9fbGUzMiBjcmM7CiB9OwogCiBlbnVtIHsKQEAgLTQwLDE5ICs0MCwxNCBAQAogc3RydWN0IHNpZ21hX2FjdGlvbiB7CiAJdTggaW5zdHI7CiAJdTggbGVuX2hpOwotCXUxNiBsZW47Ci0JdTE2IGFkZHI7CisJX19sZTE2IGxlbjsKKwlfX2JlMTYgYWRkcjsKIAl1bnNpZ25lZCBjaGFyIHBheWxvYWRbXTsKIH07CiAKIHN0YXRpYyBpbmxpbmUgdTMyIHNpZ21hX2FjdGlvbl9sZW4oc3RydWN0IHNpZ21hX2FjdGlvbiAqc2EpCiB7Ci0JcmV0dXJuIChzYS0+bGVuX2hpIDw8IDE2KSB8IHNhLT5sZW47Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc2l6ZV90IHNpZ21hX2FjdGlvbl9zaXplKHN0cnVjdCBzaWdtYV9hY3Rpb24gKnNhLCB1MzIgcGF5bG9hZF9sZW4pCi17Ci0JcmV0dXJuIHNpemVvZigqc2EpICsgcGF5bG9hZF9sZW4gKyAocGF5bG9hZF9sZW4gJSAyKTsKKwlyZXR1cm4gKHNhLT5sZW5faGkgPDwgMTYpIHwgbGUxNl90b19jcHUoc2EtPmxlbik7CiB9CiAKIGV4dGVybiBpbnQgcHJvY2Vzc19zaWdtYV9maXJtd2FyZShzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50LCBjb25zdCBjaGFyICpuYW1lKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2tidWZmLmggYi9pbmNsdWRlL2xpbnV4L3NrYnVmZi5oCmluZGV4IGZlODY0ODguLjUwZGI5YjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2tidWZmLmgKKysrIGIvaW5jbHVkZS9saW51eC9za2J1ZmYuaApAQCAtMzAsNiArMzAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RtYWVuZ2luZS5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldl9mZWF0dXJlcy5oPgogCiAvKiBEb24ndCBjaGFuZ2UgdGhpcyB3aXRob3V0IGNoYW5naW5nIHNrYl9jc3VtX3VubmVjZXNzYXJ5ISAqLwogI2RlZmluZSBDSEVDS1NVTV9OT05FIDAKQEAgLTg3LDcgKzg4LDYgQEAKICAqCWF0IGRldmljZSBzZXR1cCB0aW1lLgogICoJTkVUSUZfRl9IV19DU1VNCS0gaXQgaXMgY2xldmVyIGRldmljZSwgaXQgaXMgYWJsZSB0byBjaGVja3N1bQogICoJCQkgIGV2ZXJ5dGhpbmcuCi0gKglORVRJRl9GX05PX0NTVU0gLSBsb29wYmFjayBvciByZWxpYWJsZSBzaW5nbGUgaG9wIG1lZGlhLgogICoJTkVUSUZfRl9JUF9DU1VNIC0gZGV2aWNlIGlzIGR1bWIuIEl0IGlzIGFibGUgdG8gY3N1bSBvbmx5CiAgKgkJCSAgVENQL1VEUCBvdmVyIElQdjQuIFNpZ2guIFZlbmRvcnMgbGlrZSB0aGlzCiAgKgkJCSAgd2F5IGJ5IGFuIHVua25vd24gcmVhc29uLiBUaG91Z2gsIHNlZSBjb21tZW50IGFib3ZlCkBAIC0xMjgsMTMgKzEyOCwxNyBAQAogCiBzdHJ1Y3Qgc2tfYnVmZjsKIAotLyogVG8gYWxsb3cgNjRLIGZyYW1lIHRvIGJlIHBhY2tlZCBhcyBzaW5nbGUgc2tiIHdpdGhvdXQgZnJhZ19saXN0LiBTaW5jZQotICogR1JPIHVzZXMgZnJhZ3Mgd2UgYWxsb2NhdGUgYXQgbGVhc3QgMTYgcmVnYXJkbGVzcyBvZiBwYWdlIHNpemUuCisvKiBUbyBhbGxvdyA2NEsgZnJhbWUgdG8gYmUgcGFja2VkIGFzIHNpbmdsZSBza2Igd2l0aG91dCBmcmFnX2xpc3Qgd2UKKyAqIHJlcXVpcmUgNjRLL1BBR0VfU0laRSBwYWdlcyBwbHVzIDEgYWRkaXRpb25hbCBwYWdlIHRvIGFsbG93IGZvcgorICogYnVmZmVycyB3aGljaCBkbyBub3Qgc3RhcnQgb24gYSBwYWdlIGJvdW5kYXJ5LgorICoKKyAqIFNpbmNlIEdSTyB1c2VzIGZyYWdzIHdlIGFsbG9jYXRlIGF0IGxlYXN0IDE2IHJlZ2FyZGxlc3Mgb2YgcGFnZQorICogc2l6ZS4KICAqLwotI2lmICg2NTUzNi9QQUdFX1NJWkUgKyAyKSA8IDE2CisjaWYgKDY1NTM2L1BBR0VfU0laRSArIDEpIDwgMTYKICNkZWZpbmUgTUFYX1NLQl9GUkFHUyAxNlVMCiAjZWxzZQotI2RlZmluZSBNQVhfU0tCX0ZSQUdTICg2NTUzNi9QQUdFX1NJWkUgKyAyKQorI2RlZmluZSBNQVhfU0tCX0ZSQUdTICg2NTUzNi9QQUdFX1NJWkUgKyAxKQogI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IHNrYl9mcmFnX3N0cnVjdCBza2JfZnJhZ190OwpAQCAtMjE4LDYgKzIyMiw5IEBACiAKIAkvKiBkZXZpY2UgZHJpdmVyIHN1cHBvcnRzIFRYIHplcm8tY29weSBidWZmZXJzICovCiAJU0tCVFhfREVWX1pFUk9DT1BZID0gMSA8PCA0LAorCisJLyogZ2VuZXJhdGUgd2lmaSBzdGF0dXMgaW5mb3JtYXRpb24gKHdoZXJlIHBvc3NpYmxlKSAqLworCVNLQlRYX1dJRklfU1RBVFVTID0gMSA8PCA1LAogfTsKIAogLyoKQEAgLTIzNSwxNSArMjQyLDE1IEBACiAgKiB0aGUgZW5kIG9mIHRoZSBoZWFkZXIgZGF0YSwgaWUuIGF0IHNrYi0+ZW5kLgogICovCiBzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvIHsKLQl1bnNpZ25lZCBzaG9ydAlucl9mcmFnczsKKwl1bnNpZ25lZCBjaGFyCW5yX2ZyYWdzOworCV9fdTgJCXR4X2ZsYWdzOwogCXVuc2lnbmVkIHNob3J0CWdzb19zaXplOwogCS8qIFdhcm5pbmc6IHRoaXMgZmllbGQgaXMgbm90IGFsd2F5cyBmaWxsZWQgaW4gKFVGTykhICovCiAJdW5zaWduZWQgc2hvcnQJZ3NvX3NlZ3M7CiAJdW5zaWduZWQgc2hvcnQgIGdzb190eXBlOwotCV9fYmUzMiAgICAgICAgICBpcDZfZnJhZ19pZDsKLQlfX3U4CQl0eF9mbGFnczsKIAlzdHJ1Y3Qgc2tfYnVmZgkqZnJhZ19saXN0OwogCXN0cnVjdCBza2Jfc2hhcmVkX2h3dHN0YW1wcyBod3RzdGFtcHM7CisJX19iZTMyICAgICAgICAgIGlwNl9mcmFnX2lkOwogCiAJLyoKIAkgKiBXYXJuaW5nIDogYWxsIGZpZWxkcyBiZWZvcmUgZGF0YXJlZiBhcmUgY2xlYXJlZCBpbiBfX2FsbG9jX3NrYigpCkBAIC0zNTIsNiArMzU5LDggQEAKICAqCUBvb29fb2theTogYWxsb3cgdGhlIG1hcHBpbmcgb2YgYSBzb2NrZXQgdG8gYSBxdWV1ZSB0byBiZSBjaGFuZ2VkCiAgKglAbDRfcnhoYXNoOiBpbmRpY2F0ZSByeGhhc2ggaXMgYSBjYW5vbmljYWwgNC10dXBsZSBoYXNoIG92ZXIgdHJhbnNwb3J0CiAgKgkJcG9ydHMuCisgKglAd2lmaV9hY2tlZF92YWxpZDogd2lmaV9hY2tlZCB3YXMgc2V0CisgKglAd2lmaV9hY2tlZDogd2hldGhlciBmcmFtZSB3YXMgYWNrZWQgb24gd2lmaSBvciBub3QKICAqCUBkbWFfY29va2llOiBhIGNvb2tpZSB0byBvbmUgb2Ygc2V2ZXJhbCBwb3NzaWJsZSBETUEgb3BlcmF0aW9ucwogICoJCWRvbmUgYnkgc2tiIERNQSBmdW5jdGlvbnMKICAqCUBzZWNtYXJrOiBzZWN1cml0eSBtYXJraW5nCkBAIC00NDUsMTAgKzQ1NCwxMSBAQAogI2VuZGlmCiAJX191OAkJCW9vb19va2F5OjE7CiAJX191OAkJCWw0X3J4aGFzaDoxOworCV9fdTgJCQl3aWZpX2Fja2VkX3ZhbGlkOjE7CisJX191OAkJCXdpZmlfYWNrZWQ6MTsKKwkvKiAxMC8xMiBiaXQgaG9sZSAoZGVwZW5kaW5nIG9uIG5kaXNjX25vZGV0eXBlIHByZXNlbmNlKSAqLwogCWttZW1jaGVja19iaXRmaWVsZF9lbmQoZmxhZ3MyKTsKIAotCS8qIDAvMTMgYml0IGhvbGUgKi8KLQogI2lmZGVmIENPTkZJR19ORVRfRE1BCiAJZG1hX2Nvb2tpZV90CQlkbWFfY29va2llOwogI2VuZGlmCkBAIC01NDAsNiArNTUwLDcgQEAKIGV4dGVybiB2b2lkCSAgICAgICBfX2tmcmVlX3NrYihzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqX19hbGxvY19za2IodW5zaWduZWQgaW50IHNpemUsCiAJCQkJICAgZ2ZwX3QgcHJpb3JpdHksIGludCBmY2xvbmUsIGludCBub2RlKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqYnVpbGRfc2tiKHZvaWQgKmRhdGEpOwogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqYWxsb2Nfc2tiKHVuc2lnbmVkIGludCBzaXplLAogCQkJCQlnZnBfdCBwcmlvcml0eSkKIHsKQEAgLTU2MSw4ICs1NzIsOSBAQAogCQkJCSBnZnBfdCBwcmlvcml0eSk7CiBleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnNrYl9jb3B5KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCiAJCQkJZ2ZwX3QgcHJpb3JpdHkpOwotZXh0ZXJuIHN0cnVjdCBza19idWZmICpwc2tiX2NvcHkoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkgZ2ZwX3QgZ2ZwX21hc2spOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpfX3Bza2JfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSBpbnQgaGVhZHJvb20sIGdmcF90IGdmcF9tYXNrKTsKKwogZXh0ZXJuIGludAkgICAgICAgcHNrYl9leHBhbmRfaGVhZChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJCQlpbnQgbmhlYWQsIGludCBudGFpbCwKIAkJCQkJZ2ZwX3QgZ2ZwX21hc2spOwpAQCAtMTY2MiwzOCArMTY3NCw2IEBACiB9CiAKIC8qKgotICoJX19uZXRkZXZfYWxsb2NfcGFnZSAtIGFsbG9jYXRlIGEgcGFnZSBmb3IgcHMtcnggb24gYSBzcGVjaWZpYyBkZXZpY2UKLSAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIHJlY2VpdmUgb24KLSAqCUBnZnBfbWFzazogYWxsb2NfcGFnZXNfbm9kZSBtYXNrCi0gKgotICogCUFsbG9jYXRlIGEgbmV3IHBhZ2UuIGRldiBjdXJyZW50bHkgdW51c2VkLgotICoKLSAqIAklTlVMTCBpcyByZXR1cm5lZCBpZiB0aGVyZSBpcyBubyBmcmVlIG1lbW9yeS4KLSAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFnZSAqX19uZXRkZXZfYWxsb2NfcGFnZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBnZnBfdCBnZnBfbWFzaykKLXsKLQlyZXR1cm4gYWxsb2NfcGFnZXNfbm9kZShOVU1BX05PX05PREUsIGdmcF9tYXNrLCAwKTsKLX0KLQotLyoqCi0gKgluZXRkZXZfYWxsb2NfcGFnZSAtIGFsbG9jYXRlIGEgcGFnZSBmb3IgcHMtcnggb24gYSBzcGVjaWZpYyBkZXZpY2UKLSAqCUBkZXY6IG5ldHdvcmsgZGV2aWNlIHRvIHJlY2VpdmUgb24KLSAqCi0gKiAJQWxsb2NhdGUgYSBuZXcgcGFnZS4gZGV2IGN1cnJlbnRseSB1bnVzZWQuCi0gKgotICogCSVOVUxMIGlzIHJldHVybmVkIGlmIHRoZXJlIGlzIG5vIGZyZWUgbWVtb3J5LgotICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICpuZXRkZXZfYWxsb2NfcGFnZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiBfX25ldGRldl9hbGxvY19wYWdlKGRldiwgR0ZQX0FUT01JQyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBuZXRkZXZfZnJlZV9wYWdlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlKQotewotCV9fZnJlZV9wYWdlKHBhZ2UpOwotfQotCi0vKioKICAqIHNrYl9mcmFnX3BhZ2UgLSByZXRyaWV2ZSB0aGUgcGFnZSByZWZlcmVkIHRvIGJ5IGEgcGFnZWQgZnJhZ21lbnQKICAqIEBmcmFnOiB0aGUgcGFnZWQgZnJhZ21lbnQKICAqCkBAIC0xODI0LDYgKzE4MDQsMTIgQEAKIAkJCSAgICBmcmFnLT5wYWdlX29mZnNldCArIG9mZnNldCwgc2l6ZSwgZGlyKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2tfYnVmZiAqcHNrYl9jb3B5KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJCWdmcF90IGdmcF9tYXNrKQoreworCXJldHVybiBfX3Bza2JfY29weShza2IsIHNrYl9oZWFkcm9vbShza2IpLCBnZnBfbWFzayk7Cit9CisKIC8qKgogICoJc2tiX2Nsb25lX3dyaXRhYmxlIC0gaXMgdGhlIGhlYWRlciBvZiBhIGNsb25lIHdyaXRhYmxlCiAgKglAc2tiOiBidWZmZXIgdG8gY2hlY2sKQEAgLTIxMDUsNyArMjA5MSw4IEBACiBleHRlcm4gaW50CSAgICAgICBza2Jfc2hpZnQoc3RydWN0IHNrX2J1ZmYgKnRndCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgaW50IHNoaWZ0bGVuKTsKIAotZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2Jfc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZmVhdHVyZXMpOworZXh0ZXJuIHN0cnVjdCBza19idWZmICpza2Jfc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKTsKIAogc3RhdGljIGlubGluZSB2b2lkICpza2JfaGVhZGVyX3BvaW50ZXIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG9mZnNldCwKIAkJCQkgICAgICAgaW50IGxlbiwgdm9pZCAqYnVmZmVyKQpAQCAtMjI2Myw2ICsyMjUwLDE1IEBACiAJc3dfdHhfdGltZXN0YW1wKHNrYik7CiB9CiAKKy8qKgorICogc2tiX2NvbXBsZXRlX3dpZmlfYWNrIC0gZGVsaXZlciBza2Igd2l0aCB3aWZpIHN0YXR1cworICoKKyAqIEBza2I6IHRoZSBvcmlnaW5hbCBvdXRnb2luZyBwYWNrZXQKKyAqIEBhY2tlZDogYWNrIHN0YXR1cworICoKKyAqLwordm9pZCBza2JfY29tcGxldGVfd2lmaV9hY2soc3RydWN0IHNrX2J1ZmYgKnNrYiwgYm9vbCBhY2tlZCk7CisKIGV4dGVybiBfX3N1bTE2IF9fc2tiX2NoZWNrc3VtX2NvbXBsZXRlX2hlYWQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGxlbik7CiBleHRlcm4gX19zdW0xNiBfX3NrYl9jaGVja3N1bV9jb21wbGV0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbXNjcGh5LmggYi9pbmNsdWRlL2xpbnV4L3Ntc2NwaHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTcxOGNiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9zbXNjcGh5LmgKQEAgLTAsMCArMSwyNSBAQAorI2lmbmRlZiBfX0xJTlVYX1NNU0NQSFlfSF9fCisjZGVmaW5lIF9fTElOVVhfU01TQ1BIWV9IX18KKworI2RlZmluZSBNSUlfTEFOODNDMTg1X0lTRiAyOSAvKiBJbnRlcnJ1cHQgU291cmNlIEZsYWdzICovCisjZGVmaW5lIE1JSV9MQU44M0MxODVfSU0gIDMwIC8qIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIE1JSV9MQU44M0MxODVfQ1RSTF9TVEFUVVMgMTcgLyogTW9kZS9TdGF0dXMgUmVnaXN0ZXIgKi8KKworI2RlZmluZSBNSUlfTEFOODNDMTg1X0lTRl9JTlQxICgxPDwxKSAvKiBBdXRvLU5lZ290aWF0aW9uIFBhZ2UgUmVjZWl2ZWQgKi8KKyNkZWZpbmUgTUlJX0xBTjgzQzE4NV9JU0ZfSU5UMiAoMTw8MikgLyogUGFyYWxsZWwgRGV0ZWN0aW9uIEZhdWx0ICovCisjZGVmaW5lIE1JSV9MQU44M0MxODVfSVNGX0lOVDMgKDE8PDMpIC8qIEF1dG8tTmVnb3RpYXRpb24gTFAgQWNrICovCisjZGVmaW5lIE1JSV9MQU44M0MxODVfSVNGX0lOVDQgKDE8PDQpIC8qIExpbmsgRG93biAqLworI2RlZmluZSBNSUlfTEFOODNDMTg1X0lTRl9JTlQ1ICgxPDw1KSAvKiBSZW1vdGUgRmF1bHQgRGV0ZWN0ZWQgKi8KKyNkZWZpbmUgTUlJX0xBTjgzQzE4NV9JU0ZfSU5UNiAoMTw8NikgLyogQXV0by1OZWdvdGlhdGlvbiBjb21wbGV0ZSAqLworI2RlZmluZSBNSUlfTEFOODNDMTg1X0lTRl9JTlQ3ICgxPDw3KSAvKiBFTkVSR1lPTiAqLworCisjZGVmaW5lIE1JSV9MQU44M0MxODVfSVNGX0lOVF9BTEwgKDB4MGUpCisKKyNkZWZpbmUgTUlJX0xBTjgzQzE4NV9JU0ZfSU5UX1BIWUxJQl9FVkVOVFMgXAorCShNSUlfTEFOODNDMTg1X0lTRl9JTlQ2IHwgTUlJX0xBTjgzQzE4NV9JU0ZfSU5UNCB8IFwKKwkgTUlJX0xBTjgzQzE4NV9JU0ZfSU5UNykKKworI2RlZmluZSBNSUlfTEFOODNDMTg1X0VEUFdSRE9XTiAoMSA8PCAxMykgLyogRURQV1JET1dOICovCisjZGVmaW5lIE1JSV9MQU44M0MxODVfRU5FUkdZT04gICgxIDw8IDEpICAvKiBFTkVSR1lPTiAqLworCisjZW5kaWYgLyogX19MSU5VWF9TTVNDUEhZX0hfXyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zb2NrX2RpYWcuaCBiL2luY2x1ZGUvbGludXgvc29ja19kaWFnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxNzI5YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvc29ja19kaWFnLmgKQEAgLTAsMCArMSw0OCBAQAorI2lmbmRlZiBfX1NPQ0tfRElBR19IX18KKyNkZWZpbmUgX19TT0NLX0RJQUdfSF9fCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisjZGVmaW5lIFNPQ0tfRElBR19CWV9GQU1JTFkgMjAKKworc3RydWN0IHNvY2tfZGlhZ19yZXEgeworCV9fdTgJc2RpYWdfZmFtaWx5OworCV9fdTgJc2RpYWdfcHJvdG9jb2w7Cit9OworCitlbnVtIHsKKwlTS19NRU1JTkZPX1JNRU1fQUxMT0MsCisJU0tfTUVNSU5GT19SQ1ZCVUYsCisJU0tfTUVNSU5GT19XTUVNX0FMTE9DLAorCVNLX01FTUlORk9fU05EQlVGLAorCVNLX01FTUlORk9fRldEX0FMTE9DLAorCVNLX01FTUlORk9fV01FTV9RVUVVRUQsCisJU0tfTUVNSU5GT19PUFRNRU0sCisKKwlTS19NRU1JTkZPX1ZBUlMsCit9OworCisjaWZkZWYgX19LRVJORUxfXworc3RydWN0IHNrX2J1ZmY7CitzdHJ1Y3Qgbmxtc2doZHI7CitzdHJ1Y3Qgc29jazsKKworc3RydWN0IHNvY2tfZGlhZ19oYW5kbGVyIHsKKwlfX3U4IGZhbWlseTsKKwlpbnQgKCpkdW1wKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCk7Cit9OworCitpbnQgc29ja19kaWFnX3JlZ2lzdGVyKHN0cnVjdCBzb2NrX2RpYWdfaGFuZGxlciAqaCk7Cit2b2lkIHNvY2tfZGlhZ191bnJlZ2lzdGVyKHN0cnVjdCBzb2NrX2RpYWdfaGFuZGxlciAqaCk7CisKK3ZvaWQgc29ja19kaWFnX3JlZ2lzdGVyX2luZXRfY29tcGF0KGludCAoKmZuKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkpOwordm9pZCBzb2NrX2RpYWdfdW5yZWdpc3Rlcl9pbmV0X2NvbXBhdChpbnQgKCpmbikoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpKTsKKworaW50IHNvY2tfZGlhZ19jaGVja19jb29raWUodm9pZCAqc2ssIF9fdTMyICpjb29raWUpOwordm9pZCBzb2NrX2RpYWdfc2F2ZV9jb29raWUodm9pZCAqc2ssIF9fdTMyICpjb29raWUpOworCitpbnQgc29ja19kaWFnX3B1dF9tZW1pbmZvKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGF0dHIpOworCitleHRlcm4gc3RydWN0IHNvY2sgKnNvY2tfZGlhZ19ubHNrOworI2VuZGlmIC8qIEtFUk5FTCAqLworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NyY3UuaCBiL2luY2x1ZGUvbGludXgvc3JjdS5oCmluZGV4IDU4OTcxZTguLmUxYjAwNTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3JjdS5oCisrKyBiL2luY2x1ZGUvbGludXgvc3JjdS5oCkBAIC0yOCw2ICsyOCw3IEBACiAjZGVmaW5lIF9MSU5VWF9TUkNVX0gKIAogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KIAogc3RydWN0IHNyY3Vfc3RydWN0X2FycmF5IHsKIAlpbnQgY1syXTsKQEAgLTYwLDE4ICs2MSwxMCBAQAogCV9faW5pdF9zcmN1X3N0cnVjdCgoc3ApLCAjc3AsICZfX3NyY3Vfa2V5KTsgXAogfSkKIAotIyBkZWZpbmUgc3JjdV9yZWFkX2FjcXVpcmUoc3ApIFwKLQkJbG9ja19hY3F1aXJlKCYoc3ApLT5kZXBfbWFwLCAwLCAwLCAyLCAxLCBOVUxMLCBfVEhJU19JUF8pCi0jIGRlZmluZSBzcmN1X3JlYWRfcmVsZWFzZShzcCkgXAotCQlsb2NrX3JlbGVhc2UoJihzcCktPmRlcF9tYXAsIDEsIF9USElTX0lQXykKLQogI2Vsc2UgLyogI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DICovCiAKIGludCBpbml0X3NyY3Vfc3RydWN0KHN0cnVjdCBzcmN1X3N0cnVjdCAqc3ApOwogCi0jIGRlZmluZSBzcmN1X3JlYWRfYWNxdWlyZShzcCkgIGRvIHsgfSB3aGlsZSAoMCkKLSMgZGVmaW5lIHNyY3VfcmVhZF9yZWxlYXNlKHNwKSAgZG8geyB9IHdoaWxlICgwKQotCiAjZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19ERUJVR19MT0NLX0FMTE9DICovCiAKIHZvaWQgY2xlYW51cF9zcmN1X3N0cnVjdChzdHJ1Y3Qgc3JjdV9zdHJ1Y3QgKnNwKTsKQEAgLTkwLDEyICs4MywzMiBAQAogICogcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uICBJbiBhYnNlbmNlIG9mIENPTkZJR19ERUJVR19MT0NLX0FMTE9DLAogICogdGhpcyBhc3N1bWVzIHdlIGFyZSBpbiBhbiBTUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uIHVubGVzcyBpdCBjYW4KICAqIHByb3ZlIG90aGVyd2lzZS4KKyAqCisgKiBDaGVja3MgZGVidWdfbG9ja2RlcF9yY3VfZW5hYmxlZCgpIHRvIHByZXZlbnQgZmFsc2UgcG9zaXRpdmVzIGR1cmluZyBib290CisgKiBhbmQgd2hpbGUgbG9ja2RlcCBpcyBkaXNhYmxlZC4KKyAqCisgKiBOb3RlIHRoYXQgaWYgdGhlIENQVSBpcyBpbiB0aGUgaWRsZSBsb29wIGZyb20gYW4gUkNVIHBvaW50IG9mIHZpZXcKKyAqIChpZTogdGhhdCB3ZSBhcmUgaW4gdGhlIHNlY3Rpb24gYmV0d2VlbiByY3VfaWRsZV9lbnRlcigpIGFuZAorICogcmN1X2lkbGVfZXhpdCgpKSB0aGVuIHNyY3VfcmVhZF9sb2NrX2hlbGQoKSByZXR1cm5zIGZhbHNlIGV2ZW4gaWYKKyAqIHRoZSBDUFUgZGlkIGFuIHNyY3VfcmVhZF9sb2NrKCkuICBUaGUgcmVhc29uIGZvciB0aGlzIGlzIHRoYXQgUkNVCisgKiBpZ25vcmVzIENQVXMgdGhhdCBhcmUgaW4gc3VjaCBhIHNlY3Rpb24sIGNvbnNpZGVyaW5nIHRoZXNlIGFzIGluCisgKiBleHRlbmRlZCBxdWllc2NlbnQgc3RhdGUsIHNvIHN1Y2ggYSBDUFUgaXMgZWZmZWN0aXZlbHkgbmV2ZXIgaW4gYW4KKyAqIFJDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiByZWdhcmRsZXNzIG9mIHdoYXQgUkNVIHByaW1pdGl2ZXMgaXQKKyAqIGludm9rZXMuICBUaGlzIHN0YXRlIG9mIGFmZmFpcnMgaXMgcmVxdWlyZWQgLS0tIHdlIG5lZWQgdG8ga2VlcCBhbgorICogUkNVLWZyZWUgd2luZG93IGluIGlkbGUgd2hlcmUgdGhlIENQVSBtYXkgcG9zc2libHkgZW50ZXIgaW50byBsb3cKKyAqIHBvd2VyIG1vZGUuIFRoaXMgd2F5IHdlIGNhbiBub3RpY2UgYW4gZXh0ZW5kZWQgcXVpZXNjZW50IHN0YXRlIHRvCisgKiBvdGhlciBDUFVzIHRoYXQgc3RhcnRlZCBhIGdyYWNlIHBlcmlvZC4gT3RoZXJ3aXNlIHdlIHdvdWxkIGRlbGF5IGFueQorICogZ3JhY2UgcGVyaW9kIGFzIGxvbmcgYXMgd2UgcnVuIGluIHRoZSBpZGxlIHRhc2suCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHNyY3VfcmVhZF9sb2NrX2hlbGQoc3RydWN0IHNyY3Vfc3RydWN0ICpzcCkKIHsKLQlpZiAoZGVidWdfbG9ja3MpCi0JCXJldHVybiBsb2NrX2lzX2hlbGQoJnNwLT5kZXBfbWFwKTsKLQlyZXR1cm4gMTsKKwlpZiAocmN1X2lzX2NwdV9pZGxlKCkpCisJCXJldHVybiAwOworCisJaWYgKCFkZWJ1Z19sb2NrZGVwX3JjdV9lbmFibGVkKCkpCisJCXJldHVybiAxOworCisJcmV0dXJuIGxvY2tfaXNfaGVsZCgmc3AtPmRlcF9tYXApOwogfQogCiAjZWxzZSAvKiAjaWZkZWYgQ09ORklHX0RFQlVHX0xPQ0tfQUxMT0MgKi8KQEAgLTE0NSwxMiArMTU4LDE3IEBACiAgKiBvbmUgd2F5IHRvIGluZGlyZWN0bHkgd2FpdCBvbiBhbiBTUkNVIGdyYWNlIHBlcmlvZCBpcyB0byBhY3F1aXJlCiAgKiBhIG11dGV4IHRoYXQgaXMgaGVsZCBlbHNld2hlcmUgd2hpbGUgY2FsbGluZyBzeW5jaHJvbml6ZV9zcmN1KCkgb3IKICAqIHN5bmNocm9uaXplX3NyY3VfZXhwZWRpdGVkKCkuCisgKgorICogTm90ZSB0aGF0IHNyY3VfcmVhZF9sb2NrKCkgYW5kIHRoZSBtYXRjaGluZyBzcmN1X3JlYWRfdW5sb2NrKCkgbXVzdAorICogb2NjdXIgaW4gdGhlIHNhbWUgY29udGV4dCwgZm9yIGV4YW1wbGUsIGl0IGlzIGlsbGVnYWwgdG8gaW52b2tlCisgKiBzcmN1X3JlYWRfdW5sb2NrKCkgaW4gYW4gaXJxIGhhbmRsZXIgaWYgdGhlIG1hdGNoaW5nIHNyY3VfcmVhZF9sb2NrKCkKKyAqIHdhcyBpbnZva2VkIGluIHByb2Nlc3MgY29udGV4dC4KICAqLwogc3RhdGljIGlubGluZSBpbnQgc3JjdV9yZWFkX2xvY2soc3RydWN0IHNyY3Vfc3RydWN0ICpzcCkgX19hY3F1aXJlcyhzcCkKIHsKIAlpbnQgcmV0dmFsID0gX19zcmN1X3JlYWRfbG9jayhzcCk7CiAKLQlzcmN1X3JlYWRfYWNxdWlyZShzcCk7CisJcmN1X2xvY2tfYWNxdWlyZSgmKHNwKS0+ZGVwX21hcCk7CiAJcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtMTY0LDggKzE4Miw1MSBAQAogc3RhdGljIGlubGluZSB2b2lkIHNyY3VfcmVhZF91bmxvY2soc3RydWN0IHNyY3Vfc3RydWN0ICpzcCwgaW50IGlkeCkKIAlfX3JlbGVhc2VzKHNwKQogewotCXNyY3VfcmVhZF9yZWxlYXNlKHNwKTsKKwlyY3VfbG9ja19yZWxlYXNlKCYoc3ApLT5kZXBfbWFwKTsKIAlfX3NyY3VfcmVhZF91bmxvY2soc3AsIGlkeCk7CiB9CiAKKy8qKgorICogc3JjdV9yZWFkX2xvY2tfcmF3IC0gcmVnaXN0ZXIgYSBuZXcgcmVhZGVyIGZvciBhbiBTUkNVLXByb3RlY3RlZCBzdHJ1Y3R1cmUuCisgKiBAc3A6IHNyY3Vfc3RydWN0IGluIHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBuZXcgcmVhZGVyLgorICoKKyAqIEVudGVyIGFuIFNSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24uICBTaW1pbGFyIHRvIHNyY3VfcmVhZF9sb2NrKCksCisgKiBidXQgYXZvaWRzIHRoZSBSQ1UtbG9ja2RlcCBjaGVja2luZy4gIFRoaXMgbWVhbnMgdGhhdCBpdCBpcyBsZWdhbCB0bworICogdXNlIHNyY3VfcmVhZF9sb2NrX3JhdygpIGluIG9uZSBjb250ZXh0LCBmb3IgZXhhbXBsZSwgaW4gYW4gZXhjZXB0aW9uCisgKiBoYW5kbGVyLCBhbmQgdGhlbiBoYXZlIHRoZSBtYXRjaGluZyBzcmN1X3JlYWRfdW5sb2NrX3JhdygpIGluIGFub3RoZXIKKyAqIGNvbnRleHQsIGZvciBleGFtcGxlIGluIHRoZSB0YXNrIHRoYXQgdG9vayB0aGUgZXhjZXB0aW9uLgorICoKKyAqIEhvd2V2ZXIsIHRoZSBlbnRpcmUgU1JDVSByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbiBtdXN0IHJlc2lkZSB3aXRoaW4gYQorICogc2luZ2xlIHRhc2suICBGb3IgZXhhbXBsZSwgYmV3YXJlIG9mIHVzaW5nIHNyY3VfcmVhZF9sb2NrX3JhdygpIGluCisgKiBhIGRldmljZSBpbnRlcnJ1cHQgaGFuZGxlciBhbmQgc3JjdV9yZWFkX3VubG9jaygpIGluIHRoZSBpbnRlcnJ1cHRlZAorICogdGFzazogIFRoaXMgd2lsbCBub3Qgd29yayBpZiBpbnRlcnJ1cHRzIGFyZSB0aHJlYWRlZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgc3JjdV9yZWFkX2xvY2tfcmF3KHN0cnVjdCBzcmN1X3N0cnVjdCAqc3ApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXJldCA9ICBfX3NyY3VfcmVhZF9sb2NrKHNwKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzcmN1X3JlYWRfdW5sb2NrX3JhdyAtIHVucmVnaXN0ZXIgcmVhZGVyIGZyb20gYW4gU1JDVS1wcm90ZWN0ZWQgc3RydWN0dXJlLgorICogQHNwOiBzcmN1X3N0cnVjdCBpbiB3aGljaCB0byB1bnJlZ2lzdGVyIHRoZSBvbGQgcmVhZGVyLgorICogQGlkeDogcmV0dXJuIHZhbHVlIGZyb20gY29ycmVzcG9uZGluZyBzcmN1X3JlYWRfbG9ja19yYXcoKS4KKyAqCisgKiBFeGl0IGFuIFNSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24gd2l0aG91dCBsb2NrZGVwLVJDVSBjaGVja2luZy4KKyAqIFNlZSBzcmN1X3JlYWRfbG9ja19yYXcoKSBmb3IgbW9yZSBkZXRhaWxzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3JjdV9yZWFkX3VubG9ja19yYXcoc3RydWN0IHNyY3Vfc3RydWN0ICpzcCwgaW50IGlkeCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9fc3JjdV9yZWFkX3VubG9jayhzcCwgaWR4KTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zc2Ivc3NiLmggYi9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaAppbmRleCAwNjFlNTYwLi5kY2YzNWIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NzYi9zc2IuaApAQCAtOTQsNiArOTQsMTUgQEAKIAkJfSBnaHo1OwkJLyogNUdIeiBiYW5kICovCiAJfSBhbnRlbm5hX2dhaW47CiAKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgeworCQkJdTggdHNzaXBvcywgZXh0cGFfZ2FpbiwgcGRldF9yYW5nZSwgdHJfaXNvLCBhbnRzd2x1dDsKKwkJfSBnaHoyOworCQlzdHJ1Y3QgeworCQkJdTggdHNzaXBvcywgZXh0cGFfZ2FpbiwgcGRldF9yYW5nZSwgdHJfaXNvLCBhbnRzd2x1dDsKKwkJfSBnaHo1OworCX0gZmVtOworCiAJLyogVE9ETyAtIGFkZCBhbnkgcGFyYW1ldGVycyBuZWVkZWQgZnJvbSByZXYgMiwgMywgNCwgNSBvciA4IFNQUk9NcyAqLwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zc2Ivc3NiX3JlZ3MuaCBiL2luY2x1ZGUvbGludXgvc3NiL3NzYl9yZWdzLmgKaW5kZXggOTg5NDEyMC4uYzgxNGFlNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9zc2Ivc3NiX3JlZ3MuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NzYi9zc2JfcmVncy5oCkBAIC00MzIsNiArNDMyLDIzIEBACiAjZGVmaW5lICBTU0JfU1BST004X1JYUE8yRwkJMHgwMEZGCS8qIDJHSHogUlggcG93ZXIgb2Zmc2V0ICovCiAjZGVmaW5lICBTU0JfU1BST004X1JYUE81RwkJMHhGRjAwCS8qIDVHSHogUlggcG93ZXIgb2Zmc2V0ICovCiAjZGVmaW5lICBTU0JfU1BST004X1JYUE81R19TSElGVAk4CisjZGVmaW5lIFNTQl9TUFJPTThfRkVNMkcJCTB4MDBBRQorI2RlZmluZSBTU0JfU1BST004X0ZFTTVHCQkweDAwQjAKKyNkZWZpbmUgIFNTQl9TUk9NOF9GRU1fVFNTSVBPUwkJMHgwMDAxCisjZGVmaW5lICBTU0JfU1JPTThfRkVNX1RTU0lQT1NfU0hJRlQJMAorI2RlZmluZSAgU1NCX1NST004X0ZFTV9FWFRQQV9HQUlOCTB4MDAwNgorI2RlZmluZSAgU1NCX1NST004X0ZFTV9FWFRQQV9HQUlOX1NISUZUCTEKKyNkZWZpbmUgIFNTQl9TUk9NOF9GRU1fUERFVF9SQU5HRQkweDAwRjgKKyNkZWZpbmUgIFNTQl9TUk9NOF9GRU1fUERFVF9SQU5HRV9TSElGVAkzCisjZGVmaW5lICBTU0JfU1JPTThfRkVNX1RSX0lTTwkJMHgwNzAwCisjZGVmaW5lICBTU0JfU1JPTThfRkVNX1RSX0lTT19TSElGVAk4CisjZGVmaW5lICBTU0JfU1JPTThfRkVNX0FOVFNXTFVUCQkweEY4MDAKKyNkZWZpbmUgIFNTQl9TUk9NOF9GRU1fQU5UU1dMVVRfU0hJRlQJMTEKKyNkZWZpbmUgU1NCX1NQUk9NOF9USEVSTUFMCQkweDAwQjIKKyNkZWZpbmUgU1NCX1NQUk9NOF9NUFdSX1JBV1RTCQkweDAwQjQKKyNkZWZpbmUgU1NCX1NQUk9NOF9UU19TTFBfT1BUX0NPUlJYCTB4MDBCNgorI2RlZmluZSBTU0JfU1BST004X0ZPQ19IV0lRX0lRU1dQCTB4MDBCOAorI2RlZmluZSBTU0JfU1BST004X1BIWUNBTF9URU1QREVMVEEJMHgwMEJBCiAjZGVmaW5lIFNTQl9TUFJPTThfTUFYUF9CRwkJMHgwMEMwICAvKiBNYXggUG93ZXIgMkdIeiBpbiBwYXRoIDEgKi8KICNkZWZpbmUgIFNTQl9TUFJPTThfTUFYUF9CR19NQVNLCTB4MDBGRiAgLyogTWFzayBmb3IgTWF4IFBvd2VyIDJHSHogKi8KICNkZWZpbmUgIFNTQl9TUFJPTThfSVRTU0lfQkcJCTB4RkYwMAkvKiBNYXNrIGZvciBwYXRoIDEgaXRzc2lfYmcgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaCBiL2luY2x1ZGUvbGludXgvc3VucnBjL2NsbnQuaAppbmRleCAzZDhmOWM0Li4yYzU5OTNhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3N1bnJwYy9jbG50LmgKKysrIGIvaW5jbHVkZS9saW51eC9zdW5ycGMvY2xudC5oCkBAIC0yMTUsNyArMjE1LDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgaW5saW5lIGJvb2wgX19ycGNfY21wX2FkZHI2KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwMSwKIAkJCQkgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcDIpCiB7CkBAIC0yMzcsMTAgKzIzNywxMCBAQAogCXN0cnVjdCBzb2NrYWRkcl9pbjYgKmRzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikgZHN0OwogCiAJZHNpbjYtPnNpbjZfZmFtaWx5ID0gc3NpbjYtPnNpbjZfZmFtaWx5OwotCWlwdjZfYWRkcl9jb3B5KCZkc2luNi0+c2luNl9hZGRyLCAmc3NpbjYtPnNpbjZfYWRkcik7CisJZHNpbjYtPnNpbjZfYWRkciA9IHNzaW42LT5zaW42X2FkZHI7CiAJcmV0dXJuIHRydWU7CiB9Ci0jZWxzZQkvKiAhKENPTkZJR19JUFY2IHx8IENPTkZJR19JUFY2X01PRFVMRSkgKi8KKyNlbHNlCS8qICEoSVNfRU5BQkxFRChDT05GSUdfSVBWNikgKi8KIHN0YXRpYyBpbmxpbmUgYm9vbCBfX3JwY19jbXBfYWRkcjYoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAxLAogCQkJCSAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2FwMikKIHsKQEAgLTI1Miw3ICsyNTIsNyBAQAogewogCXJldHVybiBmYWxzZTsKIH0KLSNlbmRpZgkvKiAhKENPTkZJR19JUFY2IHx8IENPTkZJR19JUFY2X01PRFVMRSkgKi8KKyNlbmRpZgkvKiAhKElTX0VOQUJMRUQoQ09ORklHX0lQVjYpICovCiAKIC8qKgogICogcnBjX2NtcF9hZGRyIC0gY29tcGFyZSB0aGUgYWRkcmVzcyBwb3J0aW9uIG9mIHR3byBzb2NrYWRkcnMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RjcC5oIGIvaW5jbHVkZS9saW51eC90Y3AuaAppbmRleCA3ZjU5ZWU5Li40NmE4NWM5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RjcC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGNwLmgKQEAgLTIzOCw2ICsyMzgsMTEgQEAKIAl1MzIJZW5kX3NlcTsKIH07CiAKKy8qVGhlc2UgYXJlIHVzZWQgdG8gc2V0IHRoZSBzYWNrX29rIGZpZWxkIGluIHN0cnVjdCB0Y3Bfb3B0aW9uc19yZWNlaXZlZCAqLworI2RlZmluZSBUQ1BfU0FDS19TRUVOICAgICAoMSA8PCAwKSAgIC8qMSA9IHBlZXIgaXMgU0FDSyBjYXBhYmxlLCAqLworI2RlZmluZSBUQ1BfRkFDS19FTkFCTEVEICAoMSA8PCAxKSAgIC8qMSA9IEZBQ0sgaXMgZW5hYmxlZCBsb2NhbGx5Ki8KKyNkZWZpbmUgVENQX0RTQUNLX1NFRU4gICAgKDEgPDwgMikgICAvKjEgPSBEU0FDSyB3YXMgcmVjZWl2ZWQgZnJvbSBwZWVyKi8KKwogc3RydWN0IHRjcF9vcHRpb25zX3JlY2VpdmVkIHsKIC8qCVBBV1MvUlRUTSBkYXRhCSovCiAJbG9uZwl0c19yZWNlbnRfc3RhbXA7LyogVGltZSB3ZSBzdG9yZWQgdHNfcmVjZW50IChmb3IgYWdpbmcpICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpY2suaCBiL2luY2x1ZGUvbGludXgvdGljay5oCmluZGV4IGIyMzJjY2MuLmFiOGJlOTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGljay5oCisrKyBiL2luY2x1ZGUvbGludXgvdGljay5oCkBAIC03LDYgKzcsNyBAQAogI2RlZmluZSBfTElOVVhfVElDS19ICiAKICNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisjaW5jbHVkZSA8bGludXgvaXJxZmxhZ3MuaD4KIAogI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTCiAKQEAgLTEyMSwxNCArMTIyLDE2IEBACiAjZW5kaWYgLyogIUNPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTICovCiAKICMgaWZkZWYgQ09ORklHX05PX0haCi1leHRlcm4gdm9pZCB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKGludCBpbmlkbGUpOwotZXh0ZXJuIHZvaWQgdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljayh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfbm9oel9pZGxlX2VudGVyKHZvaWQpOworZXh0ZXJuIHZvaWQgdGlja19ub2h6X2lkbGVfZXhpdCh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfbm9oel9pcnFfZXhpdCh2b2lkKTsKIGV4dGVybiBrdGltZV90IHRpY2tfbm9oel9nZXRfc2xlZXBfbGVuZ3RoKHZvaWQpOwogZXh0ZXJuIHU2NCBnZXRfY3B1X2lkbGVfdGltZV91cyhpbnQgY3B1LCB1NjQgKmxhc3RfdXBkYXRlX3RpbWUpOwogZXh0ZXJuIHU2NCBnZXRfY3B1X2lvd2FpdF90aW1lX3VzKGludCBjcHUsIHU2NCAqbGFzdF91cGRhdGVfdGltZSk7CiAjIGVsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKGludCBpbmlkbGUpIHsgfQotc3RhdGljIGlubGluZSB2b2lkIHRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2sodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19ub2h6X2lkbGVfZW50ZXIodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19ub2h6X2lkbGVfZXhpdCh2b2lkKSB7IH0KKwogc3RhdGljIGlubGluZSBrdGltZV90IHRpY2tfbm9oel9nZXRfc2xlZXBfbGVuZ3RoKHZvaWQpCiB7CiAJa3RpbWVfdCBsZW4gPSB7IC50djY0ID0gTlNFQ19QRVJfU0VDL0haIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3VuaXhfZGlhZy5oIGIvaW5jbHVkZS9saW51eC91bml4X2RpYWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWQyYmYxCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC91bml4X2RpYWcuaApAQCAtMCwwICsxLDU0IEBACisjaWZuZGVmIF9fVU5JWF9ESUFHX0hfXworI2RlZmluZSBfX1VOSVhfRElBR19IX18KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKK3N0cnVjdCB1bml4X2RpYWdfcmVxIHsKKwlfX3U4CXNkaWFnX2ZhbWlseTsKKwlfX3U4CXNkaWFnX3Byb3RvY29sOworCV9fdTE2CXBhZDsKKwlfX3UzMgl1ZGlhZ19zdGF0ZXM7CisJX191MzIJdWRpYWdfaW5vOworCV9fdTMyCXVkaWFnX3Nob3c7CisJX191MzIJdWRpYWdfY29va2llWzJdOworfTsKKworI2RlZmluZSBVRElBR19TSE9XX05BTUUJCTB4MDAwMDAwMDEJLyogc2hvdyBuYW1lIChub3QgcGF0aCkgKi8KKyNkZWZpbmUgVURJQUdfU0hPV19WRlMJCTB4MDAwMDAwMDIJLyogc2hvdyBWRlMgaW5vZGUgaW5mbyAqLworI2RlZmluZSBVRElBR19TSE9XX1BFRVIJCTB4MDAwMDAwMDQJLyogc2hvdyBwZWVyIHNvY2tldCBpbmZvICovCisjZGVmaW5lIFVESUFHX1NIT1dfSUNPTlMJMHgwMDAwMDAwOAkvKiBzaG93IHBlbmRpbmcgY29ubmVjdGlvbnMgKi8KKyNkZWZpbmUgVURJQUdfU0hPV19SUUxFTgkweDAwMDAwMDEwCS8qIHNob3cgc2tiIHJlY2VpdmUgcXVldWUgbGVuICovCisjZGVmaW5lIFVESUFHX1NIT1dfTUVNSU5GTwkweDAwMDAwMDIwCS8qIHNob3cgbWVtb3J5IGluZm8gb2YgYSBzb2NrZXQgKi8KKworc3RydWN0IHVuaXhfZGlhZ19tc2cgeworCV9fdTgJdWRpYWdfZmFtaWx5OworCV9fdTgJdWRpYWdfdHlwZTsKKwlfX3U4CXVkaWFnX3N0YXRlOworCV9fdTgJcGFkOworCisJX191MzIJdWRpYWdfaW5vOworCV9fdTMyCXVkaWFnX2Nvb2tpZVsyXTsKK307CisKK2VudW0geworCVVOSVhfRElBR19OQU1FLAorCVVOSVhfRElBR19WRlMsCisJVU5JWF9ESUFHX1BFRVIsCisJVU5JWF9ESUFHX0lDT05TLAorCVVOSVhfRElBR19SUUxFTiwKKwlVTklYX0RJQUdfTUVNSU5GTywKKworCVVOSVhfRElBR19NQVgsCit9OworCitzdHJ1Y3QgdW5peF9kaWFnX3ZmcyB7CisJX191MzIJdWRpYWdfdmZzX2lubzsKKwlfX3UzMgl1ZGlhZ192ZnNfZGV2OworfTsKKworc3RydWN0IHVuaXhfZGlhZ19ycWxlbiB7CisJX191MzIJdWRpYWdfcnF1ZXVlOworCV9fdTMyCXVkaWFnX3dxdWV1ZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC92aXJ0aW9fY29uZmlnLmggYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25maWcuaAppbmRleCBlOWU3MmJkLi41MjA2ZDY1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25maWcuaAorKysgYi9pbmNsdWRlL2xpbnV4L3ZpcnRpb19jb25maWcuaApAQCAtMTAyLDYgKzEwMiwxMCBAQAogICoJdmRldjogdGhlIHZpcnRpb19kZXZpY2UKICAqCVRoaXMgZ2l2ZXMgdGhlIGZpbmFsIGZlYXR1cmUgYml0cyBmb3IgdGhlIGRldmljZTogaXQgY2FuIGNoYW5nZQogICoJdGhlIGRldi0+ZmVhdHVyZSBiaXRzIGlmIGl0IHdhbnRzLgorICogQGJ1c19uYW1lOiByZXR1cm4gdGhlIGJ1cyBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlCisgKgl2ZGV2OiB0aGUgdmlydGlvX2RldmljZQorICogICAgICBUaGlzIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBidXMgbmFtZSBhIGxhIHBjaV9uYW1lIGZyb20gd2hpY2gKKyAqICAgICAgdGhlIGNhbGxlciBjYW4gdGhlbiBjb3B5LgogICovCiB0eXBlZGVmIHZvaWQgdnFfY2FsbGJhY2tfdChzdHJ1Y3QgdmlydHF1ZXVlICopOwogc3RydWN0IHZpcnRpb19jb25maWdfb3BzIHsKQEAgLTExOSw2ICsxMjMsNyBAQAogCXZvaWQgKCpkZWxfdnFzKShzdHJ1Y3QgdmlydGlvX2RldmljZSAqKTsKIAl1MzIgKCpnZXRfZmVhdHVyZXMpKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KTsKIAl2b2lkICgqZmluYWxpemVfZmVhdHVyZXMpKHN0cnVjdCB2aXJ0aW9fZGV2aWNlICp2ZGV2KTsKKwljb25zdCBjaGFyICooKmJ1c19uYW1lKShzdHJ1Y3QgdmlydGlvX2RldmljZSAqdmRldik7CiB9OwogCiAvKiBJZiBkcml2ZXIgZGlkbid0IGFkdmVydGlzZSB0aGUgZmVhdHVyZSwgaXQgd2lsbCBuZXZlciBhcHBlYXIuICovCkBAIC0xODQsNSArMTg5LDE0IEBACiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAJcmV0dXJuIHZxOwogfQorCitzdGF0aWMgaW5saW5lCitjb25zdCBjaGFyICp2aXJ0aW9fYnVzX25hbWUoc3RydWN0IHZpcnRpb19kZXZpY2UgKnZkZXYpCit7CisJaWYgKCF2ZGV2LT5jb25maWctPmJ1c19uYW1lKQorCQlyZXR1cm4gInZpcnRpbyI7CisJcmV0dXJuIHZkZXYtPmNvbmZpZy0+YnVzX25hbWUodmRldik7Cit9CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX0xJTlVYX1ZJUlRJT19DT05GSUdfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93YWl0LmggYi9pbmNsdWRlL2xpbnV4L3dhaXQuaAppbmRleCAzZWZjOWYzLi5hOWNlNDVlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dhaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dhaXQuaApAQCAtNzcsMTMgKzc3LDEzIEBACiAjZGVmaW5lIF9fV0FJVF9CSVRfS0VZX0lOSVRJQUxJWkVSKHdvcmQsIGJpdCkJCQkJXAogCXsgLmZsYWdzID0gd29yZCwgLmJpdF9uciA9IGJpdCwgfQogCi1leHRlcm4gdm9pZCBfX2luaXRfd2FpdHF1ZXVlX2hlYWQod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqKTsKK2V4dGVybiB2b2lkIF9faW5pdF93YWl0cXVldWVfaGVhZCh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICopOwogCiAjZGVmaW5lIGluaXRfd2FpdHF1ZXVlX2hlYWQocSkJCQkJXAogCWRvIHsJCQkJCQlcCiAJCXN0YXRpYyBzdHJ1Y3QgbG9ja19jbGFzc19rZXkgX19rZXk7CVwKIAkJCQkJCQlcCi0JCV9faW5pdF93YWl0cXVldWVfaGVhZCgocSksICZfX2tleSk7CVwKKwkJX19pbml0X3dhaXRxdWV1ZV9oZWFkKChxKSwgI3EsICZfX2tleSk7CVwKIAl9IHdoaWxlICgwKQogCiAjaWZkZWYgQ09ORklHX0xPQ0tERVAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvd2wxMnh4LmggYi9pbmNsdWRlL2xpbnV4L3dsMTJ4eC5oCmluZGV4IDRiNjk3MzkuLjBkNjM3MzEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvd2wxMnh4LmgKKysrIGIvaW5jbHVkZS9saW51eC93bDEyeHguaApAQCAtNTQsNiArNTQsOSBAQAogCWludCBib2FyZF9yZWZfY2xvY2s7CiAJaW50IGJvYXJkX3RjeG9fY2xvY2s7CiAJdW5zaWduZWQgbG9uZyBwbGF0Zm9ybV9xdWlya3M7CisJYm9vbCBwd3JfaW5fc3VzcGVuZDsKKworCXN0cnVjdCB3bDEyNzFfaWZfb3BlcmF0aW9ucyAqb3BzOwogfTsKIAogLyogUGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBsZXZlbCB0cmlnZ2VyIGludGVycnVwdHMgKi8KQEAgLTczLDYgKzc2LDYgQEAKIAogI2VuZGlmCiAKLWNvbnN0IHN0cnVjdCB3bDEyeHhfcGxhdGZvcm1fZGF0YSAqd2wxMnh4X2dldF9wbGF0Zm9ybV9kYXRhKHZvaWQpOworc3RydWN0IHdsMTJ4eF9wbGF0Zm9ybV9kYXRhICp3bDEyeHhfZ2V0X3BsYXRmb3JtX2RhdGEodm9pZCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9zb2NfY2FtZXJhLmggYi9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaAppbmRleCBiMTM3N2I5Li41ZmIyYzNkIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaAorKysgYi9pbmNsdWRlL21lZGlhL3NvY19jYW1lcmEuaApAQCAtMjU0LDcgKzI1NCw3IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCB2aWRlb19kZXZpY2UgKnNvY19jYW1lcmFfaTJjX3RvX3ZkZXYoY29uc3Qgc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKIHsKIAlzdHJ1Y3QgdjRsMl9zdWJkZXYgKnNkID0gaTJjX2dldF9jbGllbnRkYXRhKGNsaWVudCk7Ci0Jc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICppY2QgPSAoc3RydWN0IHNvY19jYW1lcmFfZGV2aWNlICopc2QtPmdycF9pZDsKKwlzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCA9IHY0bDJfZ2V0X3N1YmRldl9ob3N0ZGF0YShzZCk7CiAJcmV0dXJuIGljZCA/IGljZC0+dmRldiA6IE5VTEw7CiB9CiAKQEAgLTI3OSw2ICsyNzksMTEgQEAKIAlyZXR1cm4gY29udGFpbmVyX29mKHZxLCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UsIHZiX3ZpZHEpOwogfQogCitzdGF0aWMgaW5saW5lIHUzMiBzb2NfY2FtZXJhX2dycF9pZChjb25zdCBzdHJ1Y3Qgc29jX2NhbWVyYV9kZXZpY2UgKmljZCkKK3sKKwlyZXR1cm4gKGljZC0+aWZhY2UgPDwgOCkgfCAoaWNkLT5kZXZudW0gKyAxKTsKK30KKwogdm9pZCBzb2NfY2FtZXJhX2xvY2soc3RydWN0IHZiMl9xdWV1ZSAqdnEpOwogdm9pZCBzb2NfY2FtZXJhX3VubG9jayhzdHJ1Y3QgdmIyX3F1ZXVlICp2cSk7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2FkZHJjb25mLmggYi9pbmNsdWRlL25ldC9hZGRyY29uZi5oCmluZGV4IGNiYzZiYjAuLmY2OGRjZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2FkZHJjb25mLmgKKysrIGIvaW5jbHVkZS9uZXQvYWRkcmNvbmYuaApAQCAtMTUxLDcgKzE1MSw4IEBACiAJCQkgICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzcmNfYWRkcik7CiBleHRlcm4gaW50IGlwdjZfaXNfbWxkKHN0cnVjdCBza19idWZmICpza2IsIGludCBuZXh0aGRyKTsKIAotZXh0ZXJuIHZvaWQgYWRkcmNvbmZfcHJlZml4X3JjdihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1OCAqb3B0LCBpbnQgbGVuKTsKK2V4dGVybiB2b2lkIGFkZHJjb25mX3ByZWZpeF9yY3Yoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQl1OCAqb3B0LCBpbnQgbGVuLCBib29sIHNsbGFvKTsKIAogLyoKICAqCWFueWNhc3QgcHJvdG90eXBlcyAoYW55Y2FzdC5jKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYWZfdW5peC5oIGIvaW5jbHVkZS9uZXQvYWZfdW5peC5oCmluZGV4IDkxYWI1YjAuLjVhNGUyOWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2FmX3VuaXguaAorKysgYi9pbmNsdWRlL25ldC9hZl91bml4LmgKQEAgLTExLDEwICsxMSwxMyBAQAogZXh0ZXJuIHZvaWQgdW5peF9nYyh2b2lkKTsKIGV4dGVybiB2b2lkIHdhaXRfZm9yX3VuaXhfZ2Modm9pZCk7CiBleHRlcm4gc3RydWN0IHNvY2sgKnVuaXhfZ2V0X3NvY2tldChzdHJ1Y3QgZmlsZSAqZmlscCk7CitleHRlcm4gc3RydWN0IHNvY2sgKnVuaXhfcGVlcl9nZXQoc3RydWN0IHNvY2sgKik7CiAKICNkZWZpbmUgVU5JWF9IQVNIX1NJWkUJMjU2CiAKIGV4dGVybiB1bnNpZ25lZCBpbnQgdW5peF90b3RfaW5mbGlnaHQ7CitleHRlcm4gc3BpbmxvY2tfdCB1bml4X3RhYmxlX2xvY2s7CitleHRlcm4gc3RydWN0IGhsaXN0X2hlYWQgdW5peF9zb2NrZXRfdGFibGVbVU5JWF9IQVNIX1NJWkUgKyAxXTsKIAogc3RydWN0IHVuaXhfYWRkcmVzcyB7CiAJYXRvbWljX3QJcmVmY250OwpAQCAtNjMsNiArNjYsOSBAQAogCiAjZGVmaW5lIHBlZXJfd2FpdCBwZWVyX3dxLndhaXQKIAorbG9uZyB1bml4X2lucV9sZW4oc3RydWN0IHNvY2sgKnNrKTsKK2xvbmcgdW5peF9vdXRxX2xlbihzdHJ1Y3Qgc29jayAqc2spOworCiAjaWZkZWYgQ09ORklHX1NZU0NUTAogZXh0ZXJuIGludCB1bml4X3N5c2N0bF9yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQpOwogZXh0ZXJuIHZvaWQgdW5peF9zeXNjdGxfdW5yZWdpc3RlcihzdHJ1Y3QgbmV0ICpuZXQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYXJwLmggYi9pbmNsdWRlL25ldC9hcnAuaAppbmRleCA0OTc5YWY4Li4wMDEzZGM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9hcnAuaAorKysgYi9pbmNsdWRlL25ldC9hcnAuaApAQCAtMjMsNyArMjMsNyBAQAogCiAJcmN1X3JlYWRfbG9ja19iaCgpOwogCW5odCA9IHJjdV9kZXJlZmVyZW5jZV9iaCh0YmwtPm5odCk7Ci0JaGFzaF92YWwgPSBhcnBfaGFzaGZuKGtleSwgZGV2LCBuaHQtPmhhc2hfcm5kKSA+PiAoMzIgLSBuaHQtPmhhc2hfc2hpZnQpOworCWhhc2hfdmFsID0gYXJwX2hhc2hmbihrZXksIGRldiwgbmh0LT5oYXNoX3JuZFswXSkgPj4gKDMyIC0gbmh0LT5oYXNoX3NoaWZ0KTsKIAlmb3IgKG4gPSByY3VfZGVyZWZlcmVuY2VfYmgobmh0LT5oYXNoX2J1Y2tldHNbaGFzaF92YWxdKTsKIAkgICAgIG4gIT0gTlVMTDsKIAkgICAgIG4gPSByY3VfZGVyZWZlcmVuY2VfYmgobi0+bmV4dCkpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2F0bWNsaXAuaCBiL2luY2x1ZGUvbmV0L2F0bWNsaXAuaAppbmRleCA0OTdlZjY0Li41ODY1OTI0ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvYXRtY2xpcC5oCisrKyBiL2luY2x1ZGUvbmV0L2F0bWNsaXAuaApAQCAtMTUsNyArMTUsNiBAQAogCiAKICNkZWZpbmUgQ0xJUF9WQ0ModmNjKSAoKHN0cnVjdCBjbGlwX3ZjYyAqKSAoKHZjYyktPnVzZXJfYmFjaykpCi0jZGVmaW5lIE5FSUdIMkVOVFJZKG5laWdoKSAoKHN0cnVjdCBhdG1hcnBfZW50cnkgKikgKG5laWdoKS0+cHJpbWFyeV9rZXkpCiAKIHN0cnVjdCBza19idWZmOwogCkBAIC0zNiwyNCArMzUsMTggQEAKIAogCiBzdHJ1Y3QgYXRtYXJwX2VudHJ5IHsKLQlfX2JlMzIJCWlwOwkJLyogSVAgYWRkcmVzcyAqLwogCXN0cnVjdCBjbGlwX3ZjYwkqdmNjczsJCS8qIGFjdGl2ZSBWQ0NzOyBOVUxMIGlmIHJlc29sdXRpb24gaXMKIAkJCQkJICAgcGVuZGluZyAqLwogCXVuc2lnbmVkIGxvbmcJZXhwaXJlczsJLyogZW50cnkgZXhwaXJhdGlvbiB0aW1lICovCiAJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CS8qIG5laWdoYm91ciBiYWNrLXBvaW50ZXIgKi8KIH07CiAKLQogI2RlZmluZSBQUklWKGRldikgKChzdHJ1Y3QgY2xpcF9wcml2ICopIG5ldGRldl9wcml2KGRldikpCiAKLQogc3RydWN0IGNsaXBfcHJpdiB7CiAJaW50IG51bWJlcjsJCQkvKiBmb3IgY29udmVuaWVuY2UgLi4uICovCiAJc3BpbmxvY2tfdCB4b2ZmX2xvY2s7CQkvKiBlbnN1cmVzIHRoYXQgcG9wIGlzIGF0b21pYyAoU01QKSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXh0OwkvKiBuZXh0IENMSVAgaW50ZXJmYWNlICovCiB9OwogCi0KLWV4dGVybiBzdHJ1Y3QgbmVpZ2hfdGFibGUgKmNsaXBfdGJsX2hvb2s7Ci0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oCmluZGV4IGU4NmFmMDguLmFiYWFkNmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9ibHVldG9vdGguaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmgKQEAgLTM2LDYgKzM2LDExIEBACiAjZGVmaW5lIFBGX0JMVUVUT09USAlBRl9CTFVFVE9PVEgKICNlbmRpZgogCisvKiBCbHVldG9vdGggdmVyc2lvbnMgKi8KKyNkZWZpbmUgQkxVRVRPT1RIX1ZFUl8xXzEJMQorI2RlZmluZSBCTFVFVE9PVEhfVkVSXzFfMgkyCisjZGVmaW5lIEJMVUVUT09USF9WRVJfMl8wCTMKKwogLyogUmVzZXJ2IGZvciBjb3JlIGFuZCBkcml2ZXJzIHVzZSAqLwogI2RlZmluZSBCVF9TS0JfUkVTRVJWRQk4CiAKQEAgLTc3LDYgKzgyLDMzIEBACiAjZGVmaW5lIEJUX1BPV0VSX0ZPUkNFX0FDVElWRV9PRkYgMAogI2RlZmluZSBCVF9QT1dFUl9GT1JDRV9BQ1RJVkVfT04gIDEKIAorI2RlZmluZSBCVF9DSEFOTkVMX1BPTElDWQkxMAorCisvKiBCUi9FRFIgb25seSAoZGVmYXVsdCBwb2xpY3kpCisgKiAgIEFNUCBjb250cm9sbGVycyBjYW5ub3QgYmUgdXNlZC4KKyAqICAgQ2hhbm5lbCBtb3ZlIHJlcXVlc3RzIGZyb20gdGhlIHJlbW90ZSBkZXZpY2UgYXJlIGRlbmllZC4KKyAqICAgSWYgdGhlIEwyQ0FQIGNoYW5uZWwgaXMgY3VycmVudGx5IHVzaW5nIEFNUCwgbW92ZSB0aGUgY2hhbm5lbCB0byBCUi9FRFIuCisgKi8KKyNkZWZpbmUgQlRfQ0hBTk5FTF9QT0xJQ1lfQlJFRFJfT05MWQkJMAorCisvKiBCUi9FRFIgUHJlZmVycmVkCisgKiAgIEFsbG93IHVzZSBvZiBBTVAgY29udHJvbGxlcnMuCisgKiAgIElmIHRoZSBMMkNBUCBjaGFubmVsIGlzIGN1cnJlbnRseSBvbiBBTVAsIG1vdmUgaXQgdG8gQlIvRURSLgorICogICBDaGFubmVsIG1vdmUgcmVxdWVzdHMgZnJvbSB0aGUgcmVtb3RlIGRldmljZSBhcmUgYWxsb3dlZC4KKyAqLworI2RlZmluZSBCVF9DSEFOTkVMX1BPTElDWV9CUkVEUl9QUkVGRVJSRUQJMQorCisvKiBBTVAgUHJlZmVycmVkCisgKiAgIEFsbG93IHVzZSBvZiBBTVAgY29udHJvbGxlcnMKKyAqICAgSWYgdGhlIEwyQ0FQIGNoYW5uZWwgaXMgY3VycmVudGx5IG9uIEJSL0VEUiBhbmQgQU1QIGNvbnRyb2xsZXIKKyAqICAgICByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZSwgaW5pdGlhdGUgYSBjaGFubmVsIG1vdmUgdG8gQU1QLgorICogICBDaGFubmVsIG1vdmUgcmVxdWVzdHMgZnJvbSB0aGUgcmVtb3RlIGRldmljZSBhcmUgYWxsb3dlZC4KKyAqICAgSWYgdGhlIEwyQ0FQIHNvY2tldCBoYXMgbm90IGJlZW4gY29ubmVjdGVkIHlldCwgdHJ5IHRvIGNyZWF0ZQorICogICAgIGFuZCBjb25maWd1cmUgdGhlIGNoYW5uZWwgZGlyZWN0bHkgb24gYW4gQU1QIGNvbnRyb2xsZXIgcmF0aGVyCisgKiAgICAgdGhhbiBCUi9FRFIuCisgKi8KKyNkZWZpbmUgQlRfQ0hBTk5FTF9QT0xJQ1lfQU1QX1BSRUZFUlJFRAkJMgorCiBfX3ByaW50ZigyLCAzKQogaW50IGJ0X3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCkBAIC0xNTgsNyArMTkwLDcgQEAKIAlfX3U4IHBrdF90eXBlOwogCV9fdTggaW5jb21pbmc7CiAJX191MTYgZXhwZWN0OwotCV9fdTggdHhfc2VxOworCV9fdTE2IHR4X3NlcTsKIAlfX3U4IHJldHJpZXM7CiAJX191OCBzYXI7CiAJdW5zaWduZWQgc2hvcnQgY2hhbm5lbDsKQEAgLTIxOCwzMiArMjUwLDEwIEBACiAKIGV4dGVybiBzdHJ1Y3QgZGVudHJ5ICpidF9kZWJ1Z2ZzOwogCi0jaWZkZWYgQ09ORklHX0JUX0wyQ0FQCiBpbnQgbDJjYXBfaW5pdCh2b2lkKTsKIHZvaWQgbDJjYXBfZXhpdCh2b2lkKTsKLSNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBsMmNhcF9pbml0KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9leGl0KHZvaWQpCi17Ci19Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19CVF9TQ08KIGludCBzY29faW5pdCh2b2lkKTsKIHZvaWQgc2NvX2V4aXQodm9pZCk7Ci0jZWxzZQotc3RhdGljIGlubGluZSBpbnQgc2NvX2luaXQodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHNjb19leGl0KHZvaWQpCi17Ci19Ci0jZW5kaWYKIAogI2VuZGlmIC8qIF9fQkxVRVRPT1RIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2kuaAppbmRleCBhYWY3OWFmLi41YjJmZWQ1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2hjaS5oCkBAIC04OCw2ICs4OCwxNCBAQAogCUhDSV9SRVNFVCwKIH07CiAKKy8qCisgKiBCUi9FRFIgYW5kL29yIExFIGNvbnRyb2xsZXIgZmxhZ3M6IHRoZSBmbGFncyBkZWZpbmVkIGhlcmUgc2hvdWxkIHJlcHJlc2VudAorICogc3RhdGVzIGZyb20gdGhlIGNvbnRyb2xsZXIuCisgKi8KK2VudW0geworCUhDSV9MRV9TQ0FOLAorfTsKKwogLyogSENJIGlvY3RsIGRlZmluZXMgKi8KICNkZWZpbmUgSENJREVWVVAJX0lPVygnSCcsIDIwMSwgaW50KQogI2RlZmluZSBIQ0lERVZET1dOCV9JT1coJ0gnLCAyMDIsIGludCkKQEAgLTIwMiw2ICsyMTAsNyBAQAogCiAjZGVmaW5lIExNUF9FVjQJCTB4MDEKICNkZWZpbmUgTE1QX0VWNQkJMHgwMgorI2RlZmluZSBMTVBfTk9fQlJFRFIJMHgyMAogI2RlZmluZSBMTVBfTEUJCTB4NDAKIAogI2RlZmluZSBMTVBfU05JRkZfU1VCUgkweDAyCkBAIC0yNjQsNiArMjczLDE3IEBACiAjZGVmaW5lIEhDSV9MS19TTVBfSVJLCQkJMHg4MgogI2RlZmluZSBIQ0lfTEtfU01QX0NTUksJCQkweDgzCiAKKy8qIC0tLS0gSENJIEVycm9yIENvZGVzIC0tLS0gKi8KKyNkZWZpbmUgSENJX0VSUk9SX0FVVEhfRkFJTFVSRQkJMHgwNQorI2RlZmluZSBIQ0lfRVJST1JfUkVKX0JBRF9BRERSCQkweDBmCisjZGVmaW5lIEhDSV9FUlJPUl9SRU1PVEVfVVNFUl9URVJNCTB4MTMKKyNkZWZpbmUgSENJX0VSUk9SX0xPQ0FMX0hPU1RfVEVSTQkweDE2CisjZGVmaW5lIEhDSV9FUlJPUl9QQUlSSU5HX05PVF9BTExPV0VECTB4MTgKKworLyogRmxvdyBjb250cm9sIG1vZGVzICovCisjZGVmaW5lIEhDSV9GTE9XX0NUTF9NT0RFX1BBQ0tFVF9CQVNFRAkweDAwCisjZGVmaW5lIEhDSV9GTE9XX0NUTF9NT0RFX0JMT0NLX0JBU0VECTB4MDEKKwogLyogLS0tLS0gIEhDSSBDb21tYW5kcyAtLS0tICovCiAjZGVmaW5lIEhDSV9PUF9OT1AJCQkweDAwMDAKIApAQCAtNDQ2LDYgKzQ2NiwxNCBAQAogCiAjZGVmaW5lIEhDSV9PUF9VU0VSX0NPTkZJUk1fTkVHX1JFUExZCTB4MDQyZAogCisjZGVmaW5lIEhDSV9PUF9VU0VSX1BBU1NLRVlfUkVQTFkJCTB4MDQyZQorc3RydWN0IGhjaV9jcF91c2VyX3Bhc3NrZXlfcmVwbHkgeworCWJkYWRkcl90IGJkYWRkcjsKKwlfX2xlMzIJcGFzc2tleTsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgSENJX09QX1VTRVJfUEFTU0tFWV9ORUdfUkVQTFkJMHgwNDJmCisKICNkZWZpbmUgSENJX09QX1JFTU9URV9PT0JfREFUQV9SRVBMWQkweDA0MzAKIHN0cnVjdCBoY2lfY3BfcmVtb3RlX29vYl9kYXRhX3JlcGx5IHsKIAliZGFkZHJfdCBiZGFkZHI7CkBAIC02NjIsNiArNjkwLDEyIEBACiAKICNkZWZpbmUgSENJX09QX1JFQURfSU5RX1JTUF9UWF9QT1dFUgkweDBjNTgKIAorI2RlZmluZSBIQ0lfT1BfUkVBRF9GTE9XX0NPTlRST0xfTU9ERQkweDBjNjYKK3N0cnVjdCBoY2lfcnBfcmVhZF9mbG93X2NvbnRyb2xfbW9kZSB7CisJX191OCAgICAgc3RhdHVzOworCV9fdTggICAgIG1vZGU7Cit9IF9fcGFja2VkOworCiAjZGVmaW5lIEhDSV9PUF9XUklURV9MRV9IT1NUX1NVUFBPUlRFRAkweDBjNmQKIHN0cnVjdCBoY2lfY3Bfd3JpdGVfbGVfaG9zdF9zdXBwb3J0ZWQgewogCV9fdTggbGU7CkBAIC03MTYsNiArNzUwLDE0IEBACiAJYmRhZGRyX3QgYmRhZGRyOwogfSBfX3BhY2tlZDsKIAorI2RlZmluZSBIQ0lfT1BfUkVBRF9EQVRBX0JMT0NLX1NJWkUJMHgxMDBhCitzdHJ1Y3QgaGNpX3JwX3JlYWRfZGF0YV9ibG9ja19zaXplIHsKKwlfX3U4ICAgICBzdGF0dXM7CisJX19sZTE2ICAgbWF4X2FjbF9sZW47CisJX19sZTE2ICAgYmxvY2tfbGVuOworCV9fbGUxNiAgIG51bV9ibG9ja3M7Cit9IF9fcGFja2VkOworCiAjZGVmaW5lIEhDSV9PUF9XUklURV9QQUdFX1NDQU5fQUNUSVZJVFkJMHgwYzFjCiBzdHJ1Y3QgaGNpX2NwX3dyaXRlX3BhZ2Vfc2Nhbl9hY3Rpdml0eSB7CiAJX19sZTE2ICAgaW50ZXJ2YWw7CkBAIC03MjYsNiArNzY4LDIxIEBACiAJI2RlZmluZSBQQUdFX1NDQU5fVFlQRV9TVEFOREFSRAkJMHgwMAogCSNkZWZpbmUgUEFHRV9TQ0FOX1RZUEVfSU5URVJMQUNFRAkweDAxCiAKKyNkZWZpbmUgSENJX09QX1JFQURfTE9DQUxfQU1QX0lORk8JMHgxNDA5CitzdHJ1Y3QgaGNpX3JwX3JlYWRfbG9jYWxfYW1wX2luZm8geworCV9fdTggICAgIHN0YXR1czsKKwlfX3U4ICAgICBhbXBfc3RhdHVzOworCV9fbGUzMiAgIHRvdGFsX2J3OworCV9fbGUzMiAgIG1heF9idzsKKwlfX2xlMzIgICBtaW5fbGF0ZW5jeTsKKwlfX2xlMzIgICBtYXhfcGR1OworCV9fdTggICAgIGFtcF90eXBlOworCV9fbGUxNiAgIHBhbF9jYXA7CisJX19sZTE2ICAgbWF4X2Fzc29jX3NpemU7CisJX19sZTMyICAgbWF4X2ZsdXNoX3RvOworCV9fbGUzMiAgIGJlX2ZsdXNoX3RvOworfSBfX3BhY2tlZDsKKwogI2RlZmluZSBIQ0lfT1BfTEVfU0VUX0VWRU5UX01BU0sJMHgyMDAxCiBzdHJ1Y3QgaGNpX2NwX2xlX3NldF9ldmVudF9tYXNrIHsKIAlfX3U4ICAgICBtYXNrWzhdOwpAQCAtNzM4LDYgKzc5NSwxOCBAQAogCV9fdTggICAgIGxlX21heF9wa3Q7CiB9IF9fcGFja2VkOwogCisjZGVmaW5lIEhDSV9PUF9MRV9TRVRfU0NBTl9QQVJBTQkweDIwMGIKK3N0cnVjdCBoY2lfY3BfbGVfc2V0X3NjYW5fcGFyYW0geworCV9fdTggICAgdHlwZTsKKwlfX2xlMTYgIGludGVydmFsOworCV9fbGUxNiAgd2luZG93OworCV9fdTggICAgb3duX2FkZHJlc3NfdHlwZTsKKwlfX3U4ICAgIGZpbHRlcl9wb2xpY3k7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIExFX1NDQU5OSU5HX0RJU0FCTEVECQkweDAwCisjZGVmaW5lIExFX1NDQU5OSU5HX0VOQUJMRUQJCTB4MDEKKwogI2RlZmluZSBIQ0lfT1BfTEVfU0VUX1NDQU5fRU5BQkxFCTB4MjAwYwogc3RydWN0IGhjaV9jcF9sZV9zZXRfc2Nhbl9lbmFibGUgewogCV9fdTggICAgIGVuYWJsZTsKQEAgLTkxMyw5ICs5ODIsMTQgQEAKIH0gX19wYWNrZWQ7CiAKICNkZWZpbmUgSENJX0VWX05VTV9DT01QX1BLVFMJCTB4MTMKK3N0cnVjdCBoY2lfY29tcF9wa3RzX2luZm8geworCV9fbGUxNiAgIGhhbmRsZTsKKwlfX2xlMTYgICBjb3VudDsKK30gX19wYWNrZWQ7CisKIHN0cnVjdCBoY2lfZXZfbnVtX2NvbXBfcGt0cyB7CiAJX191OCAgICAgbnVtX2huZGw7Ci0JLyogdmFyaWFibGUgbGVuZ3RoIHBhcnQgKi8KKwlzdHJ1Y3QgaGNpX2NvbXBfcGt0c19pbmZvIGhhbmRsZXNbMF07CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIEhDSV9FVl9NT0RFX0NIQU5HRQkJMHgxNApAQCAtMTA1NCw2ICsxMTI4LDExIEBACiAJX19sZTMyCQlwYXNza2V5OwogfSBfX3BhY2tlZDsKIAorI2RlZmluZSBIQ0lfRVZfVVNFUl9QQVNTS0VZX1JFUVVFU1QJMHgzNAorc3RydWN0IGhjaV9ldl91c2VyX3Bhc3NrZXlfcmVxIHsKKwliZGFkZHJfdAliZGFkZHI7Cit9IF9fcGFja2VkOworCiAjZGVmaW5lIEhDSV9FVl9SRU1PVEVfT09CX0RBVEFfUkVRVUVTVAkweDM1CiBzdHJ1Y3QgaGNpX2V2X3JlbW90ZV9vb2JfZGF0YV9yZXF1ZXN0IHsKIAliZGFkZHJfdCBiZGFkZHI7CkBAIC0xMzA5LDQgKzEzODgsNiBAQAogfTsKICNkZWZpbmUgSVJFUV9DQUNIRV9GTFVTSCAweDAwMDEKIAorZXh0ZXJuIGludCBlbmFibGVfaHM7CisKICNlbmRpZiAvKiBfX0hDSV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCmluZGV4IDM3NzllYTMuLjVlMmU5ODQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9oY2lfY29yZS5oCkBAIC0yOCw5ICsyOCw4IEBACiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2kuaD4KIAotLyogSENJIHVwcGVyIHByb3RvY29scyAqLwotI2RlZmluZSBIQ0lfUFJPVE9fTDJDQVAJMAotI2RlZmluZSBIQ0lfUFJPVE9fU0NPCTEKKy8qIEhDSSBwcmlvcml0eSAqLworI2RlZmluZSBIQ0lfUFJJT19NQVgJNwogCiAvKiBIQ0kgQ29yZSBzdHJ1Y3R1cmVzICovCiBzdHJ1Y3QgaW5xdWlyeV9kYXRhIHsKQEAgLTUxLDE0ICs1MCwxMiBAQAogfTsKIAogc3RydWN0IGlucXVpcnlfY2FjaGUgewotCXNwaW5sb2NrX3QJCWxvY2s7CiAJX191MzIJCQl0aW1lc3RhbXA7CiAJc3RydWN0IGlucXVpcnlfZW50cnkJKmxpc3Q7CiB9OwogCiBzdHJ1Y3QgaGNpX2Nvbm5faGFzaCB7CiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwotCXNwaW5sb2NrX3QgICAgICAgbG9jazsKIAl1bnNpZ25lZCBpbnQgICAgIGFjbF9udW07CiAJdW5zaWduZWQgaW50ICAgICBzY29fbnVtOwogCXVuc2lnbmVkIGludCAgICAgbGVfbnVtOwpAQCAtMTE1LDcgKzExMiw3IEBACiAjZGVmaW5lIE5VTV9SRUFTU0VNQkxZIDQKIHN0cnVjdCBoY2lfZGV2IHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0Jc3BpbmxvY2tfdAlsb2NrOworCXN0cnVjdCBtdXRleAlsb2NrOwogCWF0b21pY190CXJlZmNudDsKIAogCWNoYXIJCW5hbWVbOF07CkBAIC0xNTAsNiArMTQ3LDE5IEBACiAJX191MTYJCXNuaWZmX21pbl9pbnRlcnZhbDsKIAlfX3UxNgkJc25pZmZfbWF4X2ludGVydmFsOwogCisJX191OAkJYW1wX3N0YXR1czsKKwlfX3UzMgkJYW1wX3RvdGFsX2J3OworCV9fdTMyCQlhbXBfbWF4X2J3OworCV9fdTMyCQlhbXBfbWluX2xhdGVuY3k7CisJX191MzIJCWFtcF9tYXhfcGR1OworCV9fdTgJCWFtcF90eXBlOworCV9fdTE2CQlhbXBfcGFsX2NhcDsKKwlfX3UxNgkJYW1wX2Fzc29jX3NpemU7CisJX191MzIJCWFtcF9tYXhfZmx1c2hfdG87CisJX191MzIJCWFtcF9iZV9mbHVzaF90bzsKKworCV9fdTgJCWZsb3dfY3RsX21vZGU7CisKIAl1bnNpZ25lZCBpbnQJYXV0b19hY2NlcHRfZGVsYXk7CiAKIAl1bnNpZ25lZCBsb25nCXF1aXJrczsKQEAgLTE2Niw2ICsxNzYsMTEgQEAKIAl1bnNpZ25lZCBpbnQJc2NvX3BrdHM7CiAJdW5zaWduZWQgaW50CWxlX3BrdHM7CiAKKwlfX3UxNgkJYmxvY2tfbGVuOworCV9fdTE2CQlibG9ja19tdHU7CisJX191MTYJCW51bV9ibG9ja3M7CisJX191MTYJCWJsb2NrX2NudDsKKwogCXVuc2lnbmVkIGxvbmcJYWNsX2xhc3RfdHg7CiAJdW5zaWduZWQgbG9uZwlzY29fbGFzdF90eDsKIAl1bnNpZ25lZCBsb25nCWxlX2xhc3RfdHg7CkBAIC0xNzMsMTMgKzE4OCwxOCBAQAogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSp3b3JrcXVldWU7CiAKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcG93ZXJfb247Ci0Jc3RydWN0IHdvcmtfc3RydWN0CXBvd2VyX29mZjsKLQlzdHJ1Y3QgdGltZXJfbGlzdAlvZmZfdGltZXI7CisJc3RydWN0IGRlbGF5ZWRfd29yawlwb3dlcl9vZmY7CisKKwlfX3UxNgkJCWRpc2Nvdl90aW1lb3V0OworCXN0cnVjdCBkZWxheWVkX3dvcmsJZGlzY292X29mZjsKKworCXN0cnVjdCBkZWxheWVkX3dvcmsJc2VydmljZV9jYWNoZTsKIAogCXN0cnVjdCB0aW1lcl9saXN0CWNtZF90aW1lcjsKLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QJY21kX3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CXJ4X3Rhc2s7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0CXR4X3Rhc2s7CisKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcnhfd29yazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJY21kX3dvcms7CisJc3RydWN0IHdvcmtfc3RydWN0CXR4X3dvcms7CiAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkCXJ4X3E7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZAlyYXdfcTsKQEAgLTE5NSw2ICsyMTUsOCBAQAogCiAJX191MTYJCQlpbml0X2xhc3RfY21kOwogCisJc3RydWN0IGxpc3RfaGVhZAltZ210X3BlbmRpbmc7CisKIAlzdHJ1Y3QgaW5xdWlyeV9jYWNoZQlpbnFfY2FjaGU7CiAJc3RydWN0IGhjaV9jb25uX2hhc2gJY29ubl9oYXNoOwogCXN0cnVjdCBsaXN0X2hlYWQJYmxhY2tsaXN0OwpAQCAtMjA2LDcgKzIyOCw3IEBACiAJc3RydWN0IGxpc3RfaGVhZAlyZW1vdGVfb29iX2RhdGE7CiAKIAlzdHJ1Y3QgbGlzdF9oZWFkCWFkdl9lbnRyaWVzOwotCXN0cnVjdCB0aW1lcl9saXN0CWFkdl90aW1lcjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCWFkdl93b3JrOwogCiAJc3RydWN0IGhjaV9kZXZfc3RhdHMJc3RhdDsKIApAQCAtMjI2LDYgKzI0OCw4IEBACiAKIAlzdHJ1Y3QgbW9kdWxlCQkqb3duZXI7CiAKKwl1bnNpZ25lZCBsb25nCQlkZXZfZmxhZ3M7CisKIAlpbnQgKCpvcGVuKShzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiAJaW50ICgqY2xvc2UpKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIAlpbnQgKCpmbHVzaCkoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwpAQCAtMjczLDIwICsyOTcsMTkgQEAKIAl1bnNpZ25lZCBpbnQJc2VudDsKIAogCXN0cnVjdCBza19idWZmX2hlYWQgZGF0YV9xOworCXN0cnVjdCBsaXN0X2hlYWQgY2hhbl9saXN0OwogCi0Jc3RydWN0IHRpbWVyX2xpc3QgZGlzY190aW1lcjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrIGRpc2Nfd29yazsKIAlzdHJ1Y3QgdGltZXJfbGlzdCBpZGxlX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IGF1dG9fYWNjZXB0X3RpbWVyOwogCi0Jc3RydWN0IHdvcmtfc3RydWN0IHdvcmtfYWRkOwotCXN0cnVjdCB3b3JrX3N0cnVjdCB3b3JrX2RlbDsKLQogCXN0cnVjdCBkZXZpY2UJZGV2OwogCWF0b21pY190CWRldnJlZjsKIAogCXN0cnVjdCBoY2lfZGV2CSpoZGV2OwogCXZvaWQJCSpsMmNhcF9kYXRhOwogCXZvaWQJCSpzY29fZGF0YTsKKwl2b2lkCQkqc21wX2Nvbm47CiAKIAlzdHJ1Y3QgaGNpX2Nvbm4JKmxpbms7CiAKQEAgLTI5NSwyNSArMzE4LDM5IEBACiAJdm9pZCAoKmRpc2Nvbm5fY2ZtX2NiKQkoc3RydWN0IGhjaV9jb25uICpjb25uLCB1OCByZWFzb24pOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBoY2lfcHJvdG8gKmhjaV9wcm90b1tdOworc3RydWN0IGhjaV9jaGFuIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBkYXRhX3E7CisJdW5zaWduZWQgaW50CXNlbnQ7Cit9OworCiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBoY2lfZGV2X2xpc3Q7CiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBoY2lfY2JfbGlzdDsKIGV4dGVybiByd2xvY2tfdCBoY2lfZGV2X2xpc3RfbG9jazsKIGV4dGVybiByd2xvY2tfdCBoY2lfY2JfbGlzdF9sb2NrOwogCisvKiAtLS0tLSBIQ0kgaW50ZXJmYWNlIHRvIHVwcGVyIHByb3RvY29scyAtLS0tLSAqLworZXh0ZXJuIGludCBsMmNhcF9jb25uZWN0X2luZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcik7CitleHRlcm4gaW50IGwyY2FwX2Nvbm5lY3RfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzKTsKK2V4dGVybiBpbnQgbDJjYXBfZGlzY29ubl9pbmQoc3RydWN0IGhjaV9jb25uICpoY29uKTsKK2V4dGVybiBpbnQgbDJjYXBfZGlzY29ubl9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCByZWFzb24pOworZXh0ZXJuIGludCBsMmNhcF9zZWN1cml0eV9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCBzdGF0dXMsIHU4IGVuY3J5cHQpOworZXh0ZXJuIGludCBsMmNhcF9yZWN2X2FjbGRhdGEoc3RydWN0IGhjaV9jb25uICpoY29uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgZmxhZ3MpOworCitleHRlcm4gaW50IHNjb19jb25uZWN0X2luZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcik7CitleHRlcm4gaW50IHNjb19jb25uZWN0X2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIF9fdTggc3RhdHVzKTsKK2V4dGVybiBpbnQgc2NvX2Rpc2Nvbm5fY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgX191OCByZWFzb24pOworZXh0ZXJuIGludCBzY29fcmVjdl9zY29kYXRhKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CisKIC8qIC0tLS0tIElucXVpcnkgY2FjaGUgLS0tLS0gKi8KICNkZWZpbmUgSU5RVUlSWV9DQUNIRV9BR0VfTUFYICAgKEhaKjMwKSAgIC8qIDMwIHNlY29uZHMgKi8KICNkZWZpbmUgSU5RVUlSWV9FTlRSWV9BR0VfTUFYICAgKEhaKjYwKSAgIC8qIDYwIHNlY29uZHMgKi8KIAotI2RlZmluZSBpbnF1aXJ5X2NhY2hlX2xvY2soYykJCXNwaW5fbG9jaygmYy0+bG9jaykKLSNkZWZpbmUgaW5xdWlyeV9jYWNoZV91bmxvY2soYykJCXNwaW5fdW5sb2NrKCZjLT5sb2NrKQotI2RlZmluZSBpbnF1aXJ5X2NhY2hlX2xvY2tfYmgoYykJc3Bpbl9sb2NrX2JoKCZjLT5sb2NrKQotI2RlZmluZSBpbnF1aXJ5X2NhY2hlX3VubG9ja19iaChjKQlzcGluX3VubG9ja19iaCgmYy0+bG9jaykKLQogc3RhdGljIGlubGluZSB2b2lkIGlucXVpcnlfY2FjaGVfaW5pdChzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlzdHJ1Y3QgaW5xdWlyeV9jYWNoZSAqYyA9ICZoZGV2LT5pbnFfY2FjaGU7Ci0Jc3Bpbl9sb2NrX2luaXQoJmMtPmxvY2spOwogCWMtPmxpc3QgPSBOVUxMOwogfQogCkBAIC0zNTMsMTUgKzM5MCwxNSBAQAogewogCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsKIAlJTklUX0xJU1RfSEVBRCgmaC0+bGlzdCk7Ci0Jc3Bpbl9sb2NrX2luaXQoJmgtPmxvY2spOwogCWgtPmFjbF9udW0gPSAwOwogCWgtPnNjb19udW0gPSAwOworCWgtPmxlX251bSA9IDA7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfY29ubl9oYXNoX2FkZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IGhjaV9jb25uICpjKQogewogCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsKLQlsaXN0X2FkZCgmYy0+bGlzdCwgJmgtPmxpc3QpOworCWxpc3RfYWRkX3JjdSgmYy0+bGlzdCwgJmgtPmxpc3QpOwogCXN3aXRjaCAoYy0+dHlwZSkgewogCWNhc2UgQUNMX0xJTks6CiAJCWgtPmFjbF9udW0rKzsKQEAgLTM3OSw3ICs0MTYsMTAgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfY29ubl9oYXNoX2RlbChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IGhjaV9jb25uICpjKQogewogCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsKLQlsaXN0X2RlbCgmYy0+bGlzdCk7CisKKwlsaXN0X2RlbF9yY3UoJmMtPmxpc3QpOworCXN5bmNocm9uaXplX3JjdSgpOworCiAJc3dpdGNoIChjLT50eXBlKSB7CiAJY2FzZSBBQ0xfTElOSzoKIAkJaC0+YWNsX251bS0tOwpAQCAtNDE0LDE0ICs0NTQsMTggQEAKIAkJCQkJCQkJX191MTYgaGFuZGxlKQogewogCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXN0cnVjdCBoY2lfY29ubiAgKmM7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZoLT5saXN0KSB7Ci0JCWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfY29ubiwgbGlzdCk7Ci0JCWlmIChjLT5oYW5kbGUgPT0gaGFuZGxlKQorCXJjdV9yZWFkX2xvY2soKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGMsICZoLT5saXN0LCBsaXN0KSB7CisJCWlmIChjLT5oYW5kbGUgPT0gaGFuZGxlKSB7CisJCQlyY3VfcmVhZF91bmxvY2soKTsKIAkJCXJldHVybiBjOworCQl9CiAJfQorCXJjdV9yZWFkX3VubG9jaygpOworCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTQyOSwxNCArNDczLDE5IEBACiAJCQkJCQkJX191OCB0eXBlLCBiZGFkZHJfdCAqYmEpCiB7CiAJc3RydWN0IGhjaV9jb25uX2hhc2ggKmggPSAmaGRldi0+Y29ubl9oYXNoOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAJc3RydWN0IGhjaV9jb25uICAqYzsKIAotCWxpc3RfZm9yX2VhY2gocCwgJmgtPmxpc3QpIHsKLQkJYyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhjaV9jb25uLCBsaXN0KTsKLQkJaWYgKGMtPnR5cGUgPT0gdHlwZSAmJiAhYmFjbXAoJmMtPmRzdCwgYmEpKQorCXJjdV9yZWFkX2xvY2soKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGMsICZoLT5saXN0LCBsaXN0KSB7CisJCWlmIChjLT50eXBlID09IHR5cGUgJiYgIWJhY21wKCZjLT5kc3QsIGJhKSkgeworCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQlyZXR1cm4gYzsKKwkJfQogCX0KKworCXJjdV9yZWFkX3VubG9jaygpOworCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTQ0NCwxNCArNDkzLDE5IEBACiAJCQkJCQkJX191OCB0eXBlLCBfX3UxNiBzdGF0ZSkKIHsKIAlzdHJ1Y3QgaGNpX2Nvbm5faGFzaCAqaCA9ICZoZGV2LT5jb25uX2hhc2g7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlzdHJ1Y3QgaGNpX2Nvbm4gICpjOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmaC0+bGlzdCkgewotCQljID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOwotCQlpZiAoYy0+dHlwZSA9PSB0eXBlICYmIGMtPnN0YXRlID09IHN0YXRlKQorCXJjdV9yZWFkX2xvY2soKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGMsICZoLT5saXN0LCBsaXN0KSB7CisJCWlmIChjLT50eXBlID09IHR5cGUgJiYgYy0+c3RhdGUgPT0gc3RhdGUpIHsKKwkJCXJjdV9yZWFkX3VubG9jaygpOwogCQkJcmV0dXJuIGM7CisJCX0KIAl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKwogCXJldHVybiBOVUxMOwogfQogCkBAIC00NjYsNiArNTIwLDEwIEBACiB2b2lkIGhjaV9jb25uX2hhc2hfZmx1c2goc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogdm9pZCBoY2lfY29ubl9jaGVja19wZW5kaW5nKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIAorc3RydWN0IGhjaV9jaGFuICpoY2lfY2hhbl9jcmVhdGUoc3RydWN0IGhjaV9jb25uICpjb25uKTsKK2ludCBoY2lfY2hhbl9kZWwoc3RydWN0IGhjaV9jaGFuICpjaGFuKTsKK3ZvaWQgaGNpX2NoYW5fbGlzdF9mbHVzaChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOworCiBzdHJ1Y3QgaGNpX2Nvbm4gKmhjaV9jb25uZWN0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgYmRhZGRyX3QgKmRzdCwKIAkJCQkJCV9fdTggc2VjX2xldmVsLCBfX3U4IGF1dGhfdHlwZSk7CiBpbnQgaGNpX2Nvbm5fY2hlY2tfbGlua19tb2RlKHN0cnVjdCBoY2lfY29ubiAqY29ubik7CkBAIC00NzUsNyArNTMzLDYgQEAKIGludCBoY2lfY29ubl9zd2l0Y2hfcm9sZShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggcm9sZSk7CiAKIHZvaWQgaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IGZvcmNlX2FjdGl2ZSk7Ci12b2lkIGhjaV9jb25uX2VudGVyX3NuaWZmX21vZGUoc3RydWN0IGhjaV9jb25uICpjb25uKTsKIAogdm9pZCBoY2lfY29ubl9ob2xkX2RldmljZShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOwogdm9pZCBoY2lfY29ubl9wdXRfZGV2aWNlKHN0cnVjdCBoY2lfY29ubiAqY29ubik7CkBAIC00ODMsNyArNTQwLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfY29ubl9ob2xkKHN0cnVjdCBoY2lfY29ubiAqY29ubikKIHsKIAlhdG9taWNfaW5jKCZjb25uLT5yZWZjbnQpOwotCWRlbF90aW1lcigmY29ubi0+ZGlzY190aW1lcik7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZjb25uLT5kaXNjX3dvcmspOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2Nvbm5fcHV0KHN0cnVjdCBoY2lfY29ubiAqY29ubikKQEAgLTUwMiw3ICs1NTksOSBAQAogCQl9IGVsc2UgewogCQkJdGltZW8gPSBtc2Vjc190b19qaWZmaWVzKDEwKTsKIAkJfQotCQltb2RfdGltZXIoJmNvbm4tPmRpc2NfdGltZXIsIGppZmZpZXMgKyB0aW1lbyk7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29ubi0+ZGlzY193b3JrKTsKKwkJcXVldWVfZGVsYXllZF93b3JrKGNvbm4tPmhkZXYtPndvcmtxdWV1ZSwKKwkJCQkJJmNvbm4tPmRpc2Nfd29yaywgamlmZmllcyArIHRpbWVvKTsKIAl9CiB9CiAKQEAgLTUzNCwxMCArNTkzLDggQEAKIAl0cnlfbW9kdWxlX2dldChkLT5vd25lcikgPyBfX2hjaV9kZXZfaG9sZChkKSA6IE5VTEw7CVwKIH0pCiAKLSNkZWZpbmUgaGNpX2Rldl9sb2NrKGQpCQlzcGluX2xvY2soJmQtPmxvY2spCi0jZGVmaW5lIGhjaV9kZXZfdW5sb2NrKGQpCXNwaW5fdW5sb2NrKCZkLT5sb2NrKQotI2RlZmluZSBoY2lfZGV2X2xvY2tfYmgoZCkJc3Bpbl9sb2NrX2JoKCZkLT5sb2NrKQotI2RlZmluZSBoY2lfZGV2X3VubG9ja19iaChkKQlzcGluX3VubG9ja19iaCgmZC0+bG9jaykKKyNkZWZpbmUgaGNpX2Rldl9sb2NrKGQpCQltdXRleF9sb2NrKCZkLT5sb2NrKQorI2RlZmluZSBoY2lfZGV2X3VubG9jayhkKQltdXRleF91bmxvY2soJmQtPmxvY2spCiAKIHN0cnVjdCBoY2lfZGV2ICpoY2lfZGV2X2dldChpbnQgaW5kZXgpOwogc3RydWN0IGhjaV9kZXYgKmhjaV9nZXRfcm91dGUoYmRhZGRyX3QgKnNyYywgYmRhZGRyX3QgKmRzdCk7CkBAIC01NDUsNyArNjAyLDcgQEAKIHN0cnVjdCBoY2lfZGV2ICpoY2lfYWxsb2NfZGV2KHZvaWQpOwogdm9pZCBoY2lfZnJlZV9kZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogaW50IGhjaV9yZWdpc3Rlcl9kZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwotaW50IGhjaV91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldik7Cit2b2lkIGhjaV91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiBpbnQgaGNpX3N1c3BlbmRfZGV2KHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKIGludCBoY2lfcmVzdW1lX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldik7CiBpbnQgaGNpX2Rldl9vcGVuKF9fdTE2IGRldik7CkBAIC01OTksOCArNjU2LDkgQEAKIGludCBoY2lfcmVjdl9mcmFnbWVudChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgaW50IHR5cGUsIHZvaWQgKmRhdGEsIGludCBjb3VudCk7CiBpbnQgaGNpX3JlY3Zfc3RyZWFtX2ZyYWdtZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB2b2lkICpkYXRhLCBpbnQgY291bnQpOwogCi1pbnQgaGNpX3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKLXZvaWQgaGNpX3VucmVnaXN0ZXJfc3lzZnMoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwordm9pZCBoY2lfaW5pdF9zeXNmcyhzdHJ1Y3QgaGNpX2RldiAqaGRldik7CitpbnQgaGNpX2FkZF9zeXNmcyhzdHJ1Y3QgaGNpX2RldiAqaGRldik7Cit2b2lkIGhjaV9kZWxfc3lzZnMoc3RydWN0IGhjaV9kZXYgKmhkZXYpOwogdm9pZCBoY2lfY29ubl9pbml0X3N5c2ZzKHN0cnVjdCBoY2lfY29ubiAqY29ubik7CiB2b2lkIGhjaV9jb25uX2FkZF9zeXNmcyhzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOwogdm9pZCBoY2lfY29ubl9kZWxfc3lzZnMoc3RydWN0IGhjaV9jb25uICpjb25uKTsKQEAgLTYyMSw1MyArNjc5LDQwIEBACiAjZGVmaW5lIGxtcF9ob3N0X2xlX2NhcGFibGUoZGV2KSAgICgoZGV2KS0+ZXh0ZmVhdHVyZXNbMF0gJiBMTVBfSE9TVF9MRSkKIAogLyogLS0tLS0gSENJIHByb3RvY29scyAtLS0tLSAqLwotc3RydWN0IGhjaV9wcm90byB7Ci0JY2hhcgkJKm5hbWU7Ci0JdW5zaWduZWQgaW50CWlkOwotCXVuc2lnbmVkIGxvbmcJZmxhZ3M7Ci0KLQl2b2lkCQkqcHJpdjsKLQotCWludCAoKmNvbm5lY3RfaW5kKQkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsCi0JCQkJCQkJCV9fdTggdHlwZSk7Ci0JaW50ICgqY29ubmVjdF9jZm0pCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggc3RhdHVzKTsKLQlpbnQgKCpkaXNjb25uX2luZCkJKHN0cnVjdCBoY2lfY29ubiAqY29ubik7Ci0JaW50ICgqZGlzY29ubl9jZm0pCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIF9fdTggcmVhc29uKTsKLQlpbnQgKCpyZWN2X2FjbGRhdGEpCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJCQkJCV9fdTE2IGZsYWdzKTsKLQlpbnQgKCpyZWN2X3Njb2RhdGEpCShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpOwotCWludCAoKnNlY3VyaXR5X2NmbSkJKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMsCi0JCQkJCQkJCV9fdTggZW5jcnlwdCk7Ci19OwotCiBzdGF0aWMgaW5saW5lIGludCBoY2lfcHJvdG9fY29ubmVjdF9pbmQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsCiAJCQkJCQkJCV9fdTggdHlwZSkKIHsKLQlyZWdpc3RlciBzdHJ1Y3QgaGNpX3Byb3RvICpocDsKLQlpbnQgbWFzayA9IDA7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBBQ0xfTElOSzoKKwkJcmV0dXJuIGwyY2FwX2Nvbm5lY3RfaW5kKGhkZXYsIGJkYWRkcik7CiAKLQlocCA9IGhjaV9wcm90b1tIQ0lfUFJPVE9fTDJDQVBdOwotCWlmIChocCAmJiBocC0+Y29ubmVjdF9pbmQpCi0JCW1hc2sgfD0gaHAtPmNvbm5lY3RfaW5kKGhkZXYsIGJkYWRkciwgdHlwZSk7CisJY2FzZSBTQ09fTElOSzoKKwljYXNlIEVTQ09fTElOSzoKKwkJcmV0dXJuIHNjb19jb25uZWN0X2luZChoZGV2LCBiZGFkZHIpOwogCi0JaHAgPSBoY2lfcHJvdG9bSENJX1BST1RPX1NDT107Ci0JaWYgKGhwICYmIGhwLT5jb25uZWN0X2luZCkKLQkJbWFzayB8PSBocC0+Y29ubmVjdF9pbmQoaGRldiwgYmRhZGRyLCB0eXBlKTsKLQotCXJldHVybiBtYXNrOworCWRlZmF1bHQ6CisJCUJUX0VSUigidW5rbm93biBsaW5rIHR5cGUgJWQiLCB0eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX3Byb3RvX2Nvbm5lY3RfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMpCiB7Ci0JcmVnaXN0ZXIgc3RydWN0IGhjaV9wcm90byAqaHA7CisJc3dpdGNoIChjb25uLT50eXBlKSB7CisJY2FzZSBBQ0xfTElOSzoKKwljYXNlIExFX0xJTks6CisJCWwyY2FwX2Nvbm5lY3RfY2ZtKGNvbm4sIHN0YXR1cyk7CisJCWJyZWFrOwogCi0JaHAgPSBoY2lfcHJvdG9bSENJX1BST1RPX0wyQ0FQXTsKLQlpZiAoaHAgJiYgaHAtPmNvbm5lY3RfY2ZtKQotCQlocC0+Y29ubmVjdF9jZm0oY29ubiwgc3RhdHVzKTsKKwljYXNlIFNDT19MSU5LOgorCWNhc2UgRVNDT19MSU5LOgorCQlzY29fY29ubmVjdF9jZm0oY29ubiwgc3RhdHVzKTsKKwkJYnJlYWs7CiAKLQlocCA9IGhjaV9wcm90b1tIQ0lfUFJPVE9fU0NPXTsKLQlpZiAoaHAgJiYgaHAtPmNvbm5lY3RfY2ZtKQotCQlocC0+Y29ubmVjdF9jZm0oY29ubiwgc3RhdHVzKTsKKwlkZWZhdWx0OgorCQlCVF9FUlIoInVua25vd24gbGluayB0eXBlICVkIiwgY29ubi0+dHlwZSk7CisJCWJyZWFrOworCX0KIAogCWlmIChjb25uLT5jb25uZWN0X2NmbV9jYikKIAkJY29ubi0+Y29ubmVjdF9jZm1fY2IoY29ubiwgc3RhdHVzKTsKQEAgLTY3NSwzMSArNzIwLDI5IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGhjaV9wcm90b19kaXNjb25uX2luZChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCiB7Ci0JcmVnaXN0ZXIgc3RydWN0IGhjaV9wcm90byAqaHA7Ci0JaW50IHJlYXNvbiA9IDB4MTM7CisJaWYgKGNvbm4tPnR5cGUgIT0gQUNMX0xJTksgJiYgY29ubi0+dHlwZSAhPSBMRV9MSU5LKQorCQlyZXR1cm4gSENJX0VSUk9SX1JFTU9URV9VU0VSX1RFUk07CiAKLQlocCA9IGhjaV9wcm90b1tIQ0lfUFJPVE9fTDJDQVBdOwotCWlmIChocCAmJiBocC0+ZGlzY29ubl9pbmQpCi0JCXJlYXNvbiA9IGhwLT5kaXNjb25uX2luZChjb25uKTsKLQotCWhwID0gaGNpX3Byb3RvW0hDSV9QUk9UT19TQ09dOwotCWlmIChocCAmJiBocC0+ZGlzY29ubl9pbmQpCi0JCXJlYXNvbiA9IGhwLT5kaXNjb25uX2luZChjb25uKTsKLQotCXJldHVybiByZWFzb247CisJcmV0dXJuIGwyY2FwX2Rpc2Nvbm5faW5kKGNvbm4pOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX3Byb3RvX2Rpc2Nvbm5fY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCByZWFzb24pCiB7Ci0JcmVnaXN0ZXIgc3RydWN0IGhjaV9wcm90byAqaHA7CisJc3dpdGNoIChjb25uLT50eXBlKSB7CisJY2FzZSBBQ0xfTElOSzoKKwljYXNlIExFX0xJTks6CisJCWwyY2FwX2Rpc2Nvbm5fY2ZtKGNvbm4sIHJlYXNvbik7CisJCWJyZWFrOwogCi0JaHAgPSBoY2lfcHJvdG9bSENJX1BST1RPX0wyQ0FQXTsKLQlpZiAoaHAgJiYgaHAtPmRpc2Nvbm5fY2ZtKQotCQlocC0+ZGlzY29ubl9jZm0oY29ubiwgcmVhc29uKTsKKwljYXNlIFNDT19MSU5LOgorCWNhc2UgRVNDT19MSU5LOgorCQlzY29fZGlzY29ubl9jZm0oY29ubiwgcmVhc29uKTsKKwkJYnJlYWs7CiAKLQlocCA9IGhjaV9wcm90b1tIQ0lfUFJPVE9fU0NPXTsKLQlpZiAoaHAgJiYgaHAtPmRpc2Nvbm5fY2ZtKQotCQlocC0+ZGlzY29ubl9jZm0oY29ubiwgcmVhc29uKTsKKwlkZWZhdWx0OgorCQlCVF9FUlIoInVua25vd24gbGluayB0eXBlICVkIiwgY29ubi0+dHlwZSk7CisJCWJyZWFrOworCX0KIAogCWlmIChjb25uLT5kaXNjb25uX2NmbV9jYikKIAkJY29ubi0+ZGlzY29ubl9jZm1fY2IoY29ubiwgcmVhc29uKTsKQEAgLTcwNywyMSArNzUwLDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfcHJvdG9fYXV0aF9jZm0oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cykKIHsKLQlyZWdpc3RlciBzdHJ1Y3QgaGNpX3Byb3RvICpocDsKIAlfX3U4IGVuY3J5cHQ7CiAKKwlpZiAoY29ubi0+dHlwZSAhPSBBQ0xfTElOSyAmJiBjb25uLT50eXBlICE9IExFX0xJTkspCisJCXJldHVybjsKKwogCWlmICh0ZXN0X2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZjb25uLT5wZW5kKSkKIAkJcmV0dXJuOwogCiAJZW5jcnlwdCA9IChjb25uLT5saW5rX21vZGUgJiBIQ0lfTE1fRU5DUllQVCkgPyAweDAxIDogMHgwMDsKLQotCWhwID0gaGNpX3Byb3RvW0hDSV9QUk9UT19MMkNBUF07Ci0JaWYgKGhwICYmIGhwLT5zZWN1cml0eV9jZm0pCi0JCWhwLT5zZWN1cml0eV9jZm0oY29ubiwgc3RhdHVzLCBlbmNyeXB0KTsKLQotCWhwID0gaGNpX3Byb3RvW0hDSV9QUk9UT19TQ09dOwotCWlmIChocCAmJiBocC0+c2VjdXJpdHlfY2ZtKQotCQlocC0+c2VjdXJpdHlfY2ZtKGNvbm4sIHN0YXR1cywgZW5jcnlwdCk7CisJbDJjYXBfc2VjdXJpdHlfY2ZtKGNvbm4sIHN0YXR1cywgZW5jcnlwdCk7CiAKIAlpZiAoY29ubi0+c2VjdXJpdHlfY2ZtX2NiKQogCQljb25uLT5zZWN1cml0eV9jZm1fY2IoY29ubiwgc3RhdHVzKTsKQEAgLTczMCwyMyArNzY4LDE1IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX3Byb3RvX2VuY3J5cHRfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMsCiAJCQkJCQkJCV9fdTggZW5jcnlwdCkKIHsKLQlyZWdpc3RlciBzdHJ1Y3QgaGNpX3Byb3RvICpocDsKKwlpZiAoY29ubi0+dHlwZSAhPSBBQ0xfTElOSyAmJiBjb25uLT50eXBlICE9IExFX0xJTkspCisJCXJldHVybjsKIAotCWhwID0gaGNpX3Byb3RvW0hDSV9QUk9UT19MMkNBUF07Ci0JaWYgKGhwICYmIGhwLT5zZWN1cml0eV9jZm0pCi0JCWhwLT5zZWN1cml0eV9jZm0oY29ubiwgc3RhdHVzLCBlbmNyeXB0KTsKLQotCWhwID0gaGNpX3Byb3RvW0hDSV9QUk9UT19TQ09dOwotCWlmIChocCAmJiBocC0+c2VjdXJpdHlfY2ZtKQotCQlocC0+c2VjdXJpdHlfY2ZtKGNvbm4sIHN0YXR1cywgZW5jcnlwdCk7CisJbDJjYXBfc2VjdXJpdHlfY2ZtKGNvbm4sIHN0YXR1cywgZW5jcnlwdCk7CiAKIAlpZiAoY29ubi0+c2VjdXJpdHlfY2ZtX2NiKQogCQljb25uLT5zZWN1cml0eV9jZm1fY2IoY29ubiwgc3RhdHVzKTsKIH0KIAotaW50IGhjaV9yZWdpc3Rlcl9wcm90byhzdHJ1Y3QgaGNpX3Byb3RvICpocHJvdG8pOwotaW50IGhjaV91bnJlZ2lzdGVyX3Byb3RvKHN0cnVjdCBoY2lfcHJvdG8gKmhwcm90byk7Ci0KIC8qIC0tLS0tIEhDSSBjYWxsYmFja3MgLS0tLS0gKi8KIHN0cnVjdCBoY2lfY2IgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKQEAgLTc3MSwxMyArODAxLDEzIEBACiAKIAllbmNyeXB0ID0gKGNvbm4tPmxpbmtfbW9kZSAmIEhDSV9MTV9FTkNSWVBUKSA/IDB4MDEgOiAweDAwOwogCi0JcmVhZF9sb2NrX2JoKCZoY2lfY2JfbGlzdF9sb2NrKTsKKwlyZWFkX2xvY2soJmhjaV9jYl9saXN0X2xvY2spOwogCWxpc3RfZm9yX2VhY2gocCwgJmhjaV9jYl9saXN0KSB7CiAJCXN0cnVjdCBoY2lfY2IgKmNiID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2NiLCBsaXN0KTsKIAkJaWYgKGNiLT5zZWN1cml0eV9jZm0pCiAJCQljYi0+c2VjdXJpdHlfY2ZtKGNvbm4sIHN0YXR1cywgZW5jcnlwdCk7CiAJfQotCXJlYWRfdW5sb2NrX2JoKCZoY2lfY2JfbGlzdF9sb2NrKTsKKwlyZWFkX3VubG9jaygmaGNpX2NiX2xpc3RfbG9jayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfZW5jcnlwdF9jZm0oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cywKQEAgLTc5MywyNiArODIzLDI2IEBACiAKIAloY2lfcHJvdG9fZW5jcnlwdF9jZm0oY29ubiwgc3RhdHVzLCBlbmNyeXB0KTsKIAotCXJlYWRfbG9ja19iaCgmaGNpX2NiX2xpc3RfbG9jayk7CisJcmVhZF9sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfY2JfbGlzdCkgewogCQlzdHJ1Y3QgaGNpX2NiICpjYiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhjaV9jYiwgbGlzdCk7CiAJCWlmIChjYi0+c2VjdXJpdHlfY2ZtKQogCQkJY2ItPnNlY3VyaXR5X2NmbShjb25uLCBzdGF0dXMsIGVuY3J5cHQpOwogCX0KLQlyZWFkX3VubG9ja19iaCgmaGNpX2NiX2xpc3RfbG9jayk7CisJcmVhZF91bmxvY2soJmhjaV9jYl9saXN0X2xvY2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2tleV9jaGFuZ2VfY2ZtKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgX191OCBzdGF0dXMpCiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCXJlYWRfbG9ja19iaCgmaGNpX2NiX2xpc3RfbG9jayk7CisJcmVhZF9sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfY2JfbGlzdCkgewogCQlzdHJ1Y3QgaGNpX2NiICpjYiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhjaV9jYiwgbGlzdCk7CiAJCWlmIChjYi0+a2V5X2NoYW5nZV9jZm0pCiAJCQljYi0+a2V5X2NoYW5nZV9jZm0oY29ubiwgc3RhdHVzKTsKIAl9Ci0JcmVhZF91bmxvY2tfYmgoJmhjaV9jYl9saXN0X2xvY2spOworCXJlYWRfdW5sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGhjaV9yb2xlX3N3aXRjaF9jZm0oc3RydWN0IGhjaV9jb25uICpjb25uLCBfX3U4IHN0YXR1cywKQEAgLTgyMCwxMyArODUwLDEzIEBACiB7CiAJc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCXJlYWRfbG9ja19iaCgmaGNpX2NiX2xpc3RfbG9jayk7CisJcmVhZF9sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKIAlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfY2JfbGlzdCkgewogCQlzdHJ1Y3QgaGNpX2NiICpjYiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhjaV9jYiwgbGlzdCk7CiAJCWlmIChjYi0+cm9sZV9zd2l0Y2hfY2ZtKQogCQkJY2ItPnJvbGVfc3dpdGNoX2NmbShjb25uLCBzdGF0dXMsIHJvbGUpOwogCX0KLQlyZWFkX3VubG9ja19iaCgmaGNpX2NiX2xpc3RfbG9jayk7CisJcmVhZF91bmxvY2soJmhjaV9jYl9saXN0X2xvY2spOwogfQogCiBpbnQgaGNpX3JlZ2lzdGVyX2NiKHN0cnVjdCBoY2lfY2IgKmhjYik7CkBAIC04MzYsNyArODY2LDcgQEAKIGludCBoY2lfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKIAogaW50IGhjaV9zZW5kX2NtZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgX191MTYgb3Bjb2RlLCBfX3UzMiBwbGVuLCB2b2lkICpwYXJhbSk7Ci12b2lkIGhjaV9zZW5kX2FjbChzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IsIF9fdTE2IGZsYWdzKTsKK3ZvaWQgaGNpX3NlbmRfYWNsKHN0cnVjdCBoY2lfY2hhbiAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MTYgZmxhZ3MpOwogdm9pZCBoY2lfc2VuZF9zY28oc3RydWN0IGhjaV9jb25uICpjb25uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogdm9pZCAqaGNpX3NlbnRfY21kX2RhdGEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTE2IG9wY29kZSk7CkBAIC04NDksNDQgKzg3OSw2MyBAQAogCiAvKiBNYW5hZ2VtZW50IGludGVyZmFjZSAqLwogaW50IG1nbXRfY29udHJvbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbik7Ci1pbnQgbWdtdF9pbmRleF9hZGRlZCh1MTYgaW5kZXgpOwotaW50IG1nbXRfaW5kZXhfcmVtb3ZlZCh1MTYgaW5kZXgpOwotaW50IG1nbXRfcG93ZXJlZCh1MTYgaW5kZXgsIHU4IHBvd2VyZWQpOwotaW50IG1nbXRfZGlzY292ZXJhYmxlKHUxNiBpbmRleCwgdTggZGlzY292ZXJhYmxlKTsKLWludCBtZ210X2Nvbm5lY3RhYmxlKHUxNiBpbmRleCwgdTggY29ubmVjdGFibGUpOwotaW50IG1nbXRfbmV3X2tleSh1MTYgaW5kZXgsIHN0cnVjdCBsaW5rX2tleSAqa2V5LCB1OCBwZXJzaXN0ZW50KTsKLWludCBtZ210X2Nvbm5lY3RlZCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IGxpbmtfdHlwZSk7Ci1pbnQgbWdtdF9kaXNjb25uZWN0ZWQodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyKTsKLWludCBtZ210X2Rpc2Nvbm5lY3RfZmFpbGVkKHUxNiBpbmRleCk7Ci1pbnQgbWdtdF9jb25uZWN0X2ZhaWxlZCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cyk7Ci1pbnQgbWdtdF9waW5fY29kZV9yZXF1ZXN0KHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc2VjdXJlKTsKLWludCBtZ210X3Bpbl9jb2RlX3JlcGx5X2NvbXBsZXRlKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc3RhdHVzKTsKLWludCBtZ210X3Bpbl9jb2RlX25lZ19yZXBseV9jb21wbGV0ZSh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cyk7Ci1pbnQgbWdtdF91c2VyX2NvbmZpcm1fcmVxdWVzdCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIF9fbGUzMiB2YWx1ZSwKLQkJCQkJCQl1OCBjb25maXJtX2hpbnQpOwotaW50IG1nbXRfdXNlcl9jb25maXJtX3JlcGx5X2NvbXBsZXRlKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc3RhdHVzKTsKLWludCBtZ210X3VzZXJfY29uZmlybV9uZWdfcmVwbHlfY29tcGxldGUodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLAoraW50IG1nbXRfaW5kZXhfYWRkZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpOworaW50IG1nbXRfaW5kZXhfcmVtb3ZlZChzdHJ1Y3QgaGNpX2RldiAqaGRldik7CitpbnQgbWdtdF9wb3dlcmVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBwb3dlcmVkKTsKK2ludCBtZ210X2Rpc2NvdmVyYWJsZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggZGlzY292ZXJhYmxlKTsKK2ludCBtZ210X2Nvbm5lY3RhYmxlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBjb25uZWN0YWJsZSk7CitpbnQgbWdtdF93cml0ZV9zY2FuX2ZhaWxlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc2NhbiwgdTggc3RhdHVzKTsKK2ludCBtZ210X25ld19saW5rX2tleShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IGxpbmtfa2V5ICprZXksCisJCQkJCQkJCXU4IHBlcnNpc3RlbnQpOworaW50IG1nbXRfY29ubmVjdGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBsaW5rX3R5cGUsCisJCQkJCQkJCXU4IGFkZHJfdHlwZSk7CitpbnQgbWdtdF9kaXNjb25uZWN0ZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IGxpbmtfdHlwZSwKKwkJCQkJCQkJdTggYWRkcl90eXBlKTsKK2ludCBtZ210X2Rpc2Nvbm5lY3RfZmFpbGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBzdGF0dXMpOworaW50IG1nbXRfY29ubmVjdF9mYWlsZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IGxpbmtfdHlwZSwKKwkJCQkJCXU4IGFkZHJfdHlwZSwgdTggc3RhdHVzKTsKK2ludCBtZ210X3Bpbl9jb2RlX3JlcXVlc3Qoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHNlY3VyZSk7CitpbnQgbWdtdF9waW5fY29kZV9yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwKIAkJCQkJCQkJdTggc3RhdHVzKTsKLWludCBtZ210X2F1dGhfZmFpbGVkKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc3RhdHVzKTsKLWludCBtZ210X3NldF9sb2NhbF9uYW1lX2NvbXBsZXRlKHUxNiBpbmRleCwgdTggKm5hbWUsIHU4IHN0YXR1cyk7Ci1pbnQgbWdtdF9yZWFkX2xvY2FsX29vYl9kYXRhX3JlcGx5X2NvbXBsZXRlKHUxNiBpbmRleCwgdTggKmhhc2gsIHU4ICpyYW5kb21pemVyLAoraW50IG1nbXRfcGluX2NvZGVfbmVnX3JlcGx5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLAogCQkJCQkJCQl1OCBzdGF0dXMpOwotaW50IG1nbXRfZGV2aWNlX2ZvdW5kKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggKmRldl9jbGFzcywgczggcnNzaSwKLQkJCQkJCQkJdTggKmVpcik7Ci1pbnQgbWdtdF9yZW1vdGVfbmFtZSh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4ICpuYW1lKTsKLWludCBtZ210X2Rpc2NvdmVyaW5nKHUxNiBpbmRleCwgdTggZGlzY292ZXJpbmcpOwotaW50IG1nbXRfZGV2aWNlX2Jsb2NrZWQodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyKTsKLWludCBtZ210X2RldmljZV91bmJsb2NrZWQodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyKTsKK2ludCBtZ210X3VzZXJfY29uZmlybV9yZXF1ZXN0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLAorCQkJCQkJX19sZTMyIHZhbHVlLCB1OCBjb25maXJtX2hpbnQpOworaW50IG1nbXRfdXNlcl9jb25maXJtX3JlcGx5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLAorCQkJCQkJCQl1OCBzdGF0dXMpOworaW50IG1nbXRfdXNlcl9jb25maXJtX25lZ19yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJCWJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cyk7CitpbnQgbWdtdF91c2VyX3Bhc3NrZXlfcmVxdWVzdChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcik7CitpbnQgbWdtdF91c2VyX3Bhc3NrZXlfcmVwbHlfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsCisJCQkJCQkJCXU4IHN0YXR1cyk7CitpbnQgbWdtdF91c2VyX3Bhc3NrZXlfbmVnX3JlcGx5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCQkJYmRhZGRyX3QgKmJkYWRkciwgdTggc3RhdHVzKTsKK2ludCBtZ210X2F1dGhfZmFpbGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBzdGF0dXMpOworaW50IG1nbXRfc2V0X2xvY2FsX25hbWVfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4ICpuYW1lLCB1OCBzdGF0dXMpOworaW50IG1nbXRfcmVhZF9sb2NhbF9vb2JfZGF0YV9yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggKmhhc2gsCisJCQkJCQl1OCAqcmFuZG9taXplciwgdTggc3RhdHVzKTsKK2ludCBtZ210X2RldmljZV9mb3VuZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgdTggbGlua190eXBlLAorCQkJCXU4IGFkZHJfdHlwZSwgdTggKmRldl9jbGFzcywgczggcnNzaSwgdTggKmVpcik7CitpbnQgbWdtdF9yZW1vdGVfbmFtZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgdTggKm5hbWUpOworaW50IG1nbXRfc3RhcnRfZGlzY292ZXJ5X2ZhaWxlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzKTsKK2ludCBtZ210X3N0b3BfZGlzY292ZXJ5X2ZhaWxlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggc3RhdHVzKTsKK2ludCBtZ210X2Rpc2NvdmVyaW5nKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBkaXNjb3ZlcmluZyk7CitpbnQgbWdtdF9kZXZpY2VfYmxvY2tlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcik7CitpbnQgbWdtdF9kZXZpY2VfdW5ibG9ja2VkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKTsKIAogLyogSENJIGluZm8gZm9yIHNvY2tldCAqLwogI2RlZmluZSBoY2lfcGkoc2spICgoc3RydWN0IGhjaV9waW5mbyAqKSBzaykKIAorLyogSENJIHNvY2tldCBmbGFncyAqLworI2RlZmluZSBIQ0lfUElfTUdNVF9JTklUCTAKKwogc3RydWN0IGhjaV9waW5mbyB7CiAJc3RydWN0IGJ0X3NvY2sgICAgYnQ7CiAJc3RydWN0IGhjaV9kZXYgICAgKmhkZXY7CiAJc3RydWN0IGhjaV9maWx0ZXIgZmlsdGVyOwogCV9fdTMyICAgICAgICAgICAgIGNtc2dfbWFzazsKIAl1bnNpZ25lZCBzaG9ydCAgIGNoYW5uZWw7CisJdW5zaWduZWQgbG9uZyAgICAgZmxhZ3M7CiB9OwogCiAvKiBIQ0kgc2VjdXJpdHkgZmlsdGVyICovCkBAIC05MTUsNCArOTY0LDcgQEAKIHZvaWQgaGNpX2xlX2x0a19yZXBseShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4sIHU4IGx0a1sxNl0pOwogdm9pZCBoY2lfbGVfbHRrX25lZ19yZXBseShzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pOwogCitpbnQgaGNpX2RvX2lucXVpcnkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IGxlbmd0aCk7CitpbnQgaGNpX2NhbmNlbF9pbnF1aXJ5KHN0cnVjdCBoY2lfZGV2ICpoZGV2KTsKKwogI2VuZGlmIC8qIF9fSENJX0NPUkVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL2wyY2FwLmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvbDJjYXAuaAppbmRleCA2Y2MxOGYzLi42OGY1ODkxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvbDJjYXAuaAorKysgYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvbDJjYXAuaApAQCAtMjcsMTcgKzI3LDIzIEBACiAjaWZuZGVmIF9fTDJDQVBfSAogI2RlZmluZSBfX0wyQ0FQX0gKIAorI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKwogLyogTDJDQVAgZGVmYXVsdHMgKi8KICNkZWZpbmUgTDJDQVBfREVGQVVMVF9NVFUJCTY3MgogI2RlZmluZSBMMkNBUF9ERUZBVUxUX01JTl9NVFUJCTQ4CiAjZGVmaW5lIEwyQ0FQX0RFRkFVTFRfRkxVU0hfVE8JCTB4ZmZmZgogI2RlZmluZSBMMkNBUF9ERUZBVUxUX1RYX1dJTkRPVwkJNjMKKyNkZWZpbmUgTDJDQVBfREVGQVVMVF9FWFRfV0lORE9XCTB4M0ZGRgogI2RlZmluZSBMMkNBUF9ERUZBVUxUX01BWF9UWAkJMwogI2RlZmluZSBMMkNBUF9ERUZBVUxUX1JFVFJBTlNfVE8JMjAwMCAgICAvKiAyIHNlY29uZHMgKi8KICNkZWZpbmUgTDJDQVBfREVGQVVMVF9NT05JVE9SX1RPCTEyMDAwICAgLyogMTIgc2Vjb25kcyAqLwogI2RlZmluZSBMMkNBUF9ERUZBVUxUX01BWF9QRFVfU0laRQkxMDA5ICAgIC8qIFNpemVkIGZvciAzLURINSBwYWNrZXQgKi8KICNkZWZpbmUgTDJDQVBfREVGQVVMVF9BQ0tfVE8JCTIwMAogI2RlZmluZSBMMkNBUF9MRV9ERUZBVUxUX01UVQkJMjMKKyNkZWZpbmUgTDJDQVBfREVGQVVMVF9NQVhfU0RVX1NJWkUJMHhGRkZGCisjZGVmaW5lIEwyQ0FQX0RFRkFVTFRfU0RVX0lUSU1FCQkweEZGRkZGRkZGCisjZGVmaW5lIEwyQ0FQX0RFRkFVTFRfQUNDX0xBVAkJMHhGRkZGRkZGRgogCiAjZGVmaW5lIEwyQ0FQX0RJU0NfVElNRU9VVCAgICAgICAgICAgICAoMTAwKQogI2RlZmluZSBMMkNBUF9ESVNDX1JFSl9USU1FT1VUICAgICAgICAgKDUwMDApICAvKiAgNSBzZWNvbmRzICovCkBAIC05MSw1MiArOTcsODIgQEAKICNkZWZpbmUgTDJDQVBfRUNIT19SU1AJCTB4MDkKICNkZWZpbmUgTDJDQVBfSU5GT19SRVEJCTB4MGEKICNkZWZpbmUgTDJDQVBfSU5GT19SU1AJCTB4MGIKKyNkZWZpbmUgTDJDQVBfQ1JFQVRFX0NIQU5fUkVRCTB4MGMKKyNkZWZpbmUgTDJDQVBfQ1JFQVRFX0NIQU5fUlNQCTB4MGQKKyNkZWZpbmUgTDJDQVBfTU9WRV9DSEFOX1JFUQkweDBlCisjZGVmaW5lIEwyQ0FQX01PVkVfQ0hBTl9SU1AJMHgwZgorI2RlZmluZSBMMkNBUF9NT1ZFX0NIQU5fQ0ZNCTB4MTAKKyNkZWZpbmUgTDJDQVBfTU9WRV9DSEFOX0NGTV9SU1AJMHgxMQogI2RlZmluZSBMMkNBUF9DT05OX1BBUkFNX1VQREFURV9SRVEJMHgxMgogI2RlZmluZSBMMkNBUF9DT05OX1BBUkFNX1VQREFURV9SU1AJMHgxMwogCi0vKiBMMkNBUCBmZWF0dXJlIG1hc2sgKi8KKy8qIEwyQ0FQIGV4dGVuZGVkIGZlYXR1cmUgbWFzayAqLwogI2RlZmluZSBMMkNBUF9GRUFUX0ZMT1dDVEwJMHgwMDAwMDAwMQogI2RlZmluZSBMMkNBUF9GRUFUX1JFVFJBTlMJMHgwMDAwMDAwMgorI2RlZmluZSBMMkNBUF9GRUFUX0JJRElSX1FPUwkweDAwMDAwMDA0CiAjZGVmaW5lIEwyQ0FQX0ZFQVRfRVJUTQkJMHgwMDAwMDAwOAogI2RlZmluZSBMMkNBUF9GRUFUX1NUUkVBTUlORwkweDAwMDAwMDEwCiAjZGVmaW5lIEwyQ0FQX0ZFQVRfRkNTCQkweDAwMDAwMDIwCisjZGVmaW5lIEwyQ0FQX0ZFQVRfRVhUX0ZMT1cJMHgwMDAwMDA0MAogI2RlZmluZSBMMkNBUF9GRUFUX0ZJWEVEX0NIQU4JMHgwMDAwMDA4MAorI2RlZmluZSBMMkNBUF9GRUFUX0VYVF9XSU5ET1cJMHgwMDAwMDEwMAorI2RlZmluZSBMMkNBUF9GRUFUX1VDRAkJMHgwMDAwMDIwMAogCiAvKiBMMkNBUCBjaGVja3N1bSBvcHRpb24gKi8KICNkZWZpbmUgTDJDQVBfRkNTX05PTkUJCTB4MDAKICNkZWZpbmUgTDJDQVBfRkNTX0NSQzE2CQkweDAxCiAKLS8qIEwyQ0FQIENvbnRyb2wgRmllbGQgYml0IG1hc2tzICovCi0jZGVmaW5lIEwyQ0FQX0NUUkxfU0FSICAgICAgICAgICAgICAgMHhDMDAwCi0jZGVmaW5lIEwyQ0FQX0NUUkxfUkVRU0VRICAgICAgICAgICAgMHgzRjAwCi0jZGVmaW5lIEwyQ0FQX0NUUkxfVFhTRVEgICAgICAgICAgICAgMHgwMDdFCi0jZGVmaW5lIEwyQ0FQX0NUUkxfUkVUUkFOUyAgICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIEwyQ0FQX0NUUkxfRklOQUwgICAgICAgICAgICAgMHgwMDgwCi0jZGVmaW5lIEwyQ0FQX0NUUkxfUE9MTCAgICAgICAgICAgICAgMHgwMDEwCi0jZGVmaW5lIEwyQ0FQX0NUUkxfU1VQRVJWSVNFICAgICAgICAgMHgwMDBDCi0jZGVmaW5lIEwyQ0FQX0NUUkxfRlJBTUVfVFlQRSAgICAgICAgMHgwMDAxIC8qIEktIG9yIFMtRnJhbWUgKi8KKy8qIEwyQ0FQIGZpeGVkIGNoYW5uZWxzICovCisjZGVmaW5lIEwyQ0FQX0ZDX0wyQ0FQCQkweDAyCisjZGVmaW5lIEwyQ0FQX0ZDX0EyTVAJCTB4MDgKIAotI2RlZmluZSBMMkNBUF9DVFJMX1RYU0VRX1NISUZUICAgICAgMQotI2RlZmluZSBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVCAgICAgOAotI2RlZmluZSBMMkNBUF9DVFJMX1NBUl9TSElGVCAgICAgICAxNAorLyogTDJDQVAgQ29udHJvbCBGaWVsZCBiaXQgbWFza3MgKi8KKyNkZWZpbmUgTDJDQVBfQ1RSTF9TQVIJCQkweEMwMDAKKyNkZWZpbmUgTDJDQVBfQ1RSTF9SRVFTRVEJCTB4M0YwMAorI2RlZmluZSBMMkNBUF9DVFJMX1RYU0VRCQkweDAwN0UKKyNkZWZpbmUgTDJDQVBfQ1RSTF9TVVBFUlZJU0UJCTB4MDAwQworCisjZGVmaW5lIEwyQ0FQX0NUUkxfUkVUUkFOUwkJMHgwMDgwCisjZGVmaW5lIEwyQ0FQX0NUUkxfRklOQUwJCTB4MDA4MAorI2RlZmluZSBMMkNBUF9DVFJMX1BPTEwJCQkweDAwMTAKKyNkZWZpbmUgTDJDQVBfQ1RSTF9GUkFNRV9UWVBFCQkweDAwMDEgLyogSS0gb3IgUy1GcmFtZSAqLworCisjZGVmaW5lIEwyQ0FQX0NUUkxfVFhTRVFfU0hJRlQJCTEKKyNkZWZpbmUgTDJDQVBfQ1RSTF9TVVBFUl9TSElGVAkJMgorI2RlZmluZSBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVAkJOAorI2RlZmluZSBMMkNBUF9DVFJMX1NBUl9TSElGVAkJMTQKKworLyogTDJDQVAgRXh0ZW5kZWQgQ29udHJvbCBGaWVsZCBiaXQgbWFzayAqLworI2RlZmluZSBMMkNBUF9FWFRfQ1RSTF9UWFNFUQkJMHhGRkZDMDAwMAorI2RlZmluZSBMMkNBUF9FWFRfQ1RSTF9TQVIJCTB4MDAwMzAwMDAKKyNkZWZpbmUgTDJDQVBfRVhUX0NUUkxfU1VQRVJWSVNFCTB4MDAwMzAwMDAKKyNkZWZpbmUgTDJDQVBfRVhUX0NUUkxfUkVRU0VRCQkweDAwMDBGRkZDCisKKyNkZWZpbmUgTDJDQVBfRVhUX0NUUkxfUE9MTAkJMHgwMDA0MDAwMAorI2RlZmluZSBMMkNBUF9FWFRfQ1RSTF9GSU5BTAkJMHgwMDAwMDAwMgorI2RlZmluZSBMMkNBUF9FWFRfQ1RSTF9GUkFNRV9UWVBFCTB4MDAwMDAwMDEgLyogSS0gb3IgUy1GcmFtZSAqLworCisjZGVmaW5lIEwyQ0FQX0VYVF9DVFJMX1JFUVNFUV9TSElGVAkyCisjZGVmaW5lIEwyQ0FQX0VYVF9DVFJMX1NBUl9TSElGVAkxNgorI2RlZmluZSBMMkNBUF9FWFRfQ1RSTF9TVVBFUl9TSElGVAkxNgorI2RlZmluZSBMMkNBUF9FWFRfQ1RSTF9UWFNFUV9TSElGVAkxOAogCiAvKiBMMkNBUCBTdXBlcnZpc29yeSBGdW5jdGlvbiAqLwotI2RlZmluZSBMMkNBUF9TVVBFUl9SQ1ZfUkVBRFkgICAgICAgICAgIDB4MDAwMAotI2RlZmluZSBMMkNBUF9TVVBFUl9SRUpFQ1QgICAgICAgICAgICAgIDB4MDAwNAotI2RlZmluZSBMMkNBUF9TVVBFUl9SQ1ZfTk9UX1JFQURZICAgICAgIDB4MDAwOAotI2RlZmluZSBMMkNBUF9TVVBFUl9TRUxFQ1RfUkVKRUNUICAgICAgIDB4MDAwQworI2RlZmluZSBMMkNBUF9TVVBFUl9SUgkJMHgwMAorI2RlZmluZSBMMkNBUF9TVVBFUl9SRUoJCTB4MDEKKyNkZWZpbmUgTDJDQVBfU1VQRVJfUk5SCQkweDAyCisjZGVmaW5lIEwyQ0FQX1NVUEVSX1NSRUoJMHgwMwogCiAvKiBMMkNBUCBTZWdtZW50YXRpb24gYW5kIFJlYXNzZW1ibHkgKi8KLSNkZWZpbmUgTDJDQVBfU0RVX1VOU0VHTUVOVEVEICAgICAgIDB4MDAwMAotI2RlZmluZSBMMkNBUF9TRFVfU1RBUlQgICAgICAgICAgICAgMHg0MDAwCi0jZGVmaW5lIEwyQ0FQX1NEVV9FTkQgICAgICAgICAgICAgICAweDgwMDAKLSNkZWZpbmUgTDJDQVBfU0RVX0NPTlRJTlVFICAgICAgICAgIDB4QzAwMAorI2RlZmluZSBMMkNBUF9TQVJfVU5TRUdNRU5URUQJMHgwMAorI2RlZmluZSBMMkNBUF9TQVJfU1RBUlQJCTB4MDEKKyNkZWZpbmUgTDJDQVBfU0FSX0VORAkJMHgwMgorI2RlZmluZSBMMkNBUF9TQVJfQ09OVElOVUUJMHgwMwogCiAvKiBMMkNBUCBDb21tYW5kIHJlai4gcmVhc29ucyAqLwotI2RlZmluZSBMMkNBUF9SRUpfTk9UX1VOREVSU1RPT0QgICAgICAweDAwMDAKLSNkZWZpbmUgTDJDQVBfUkVKX01UVV9FWENFRURFRCAgICAgICAgMHgwMDAxCi0jZGVmaW5lIEwyQ0FQX1JFSl9JTlZBTElEX0NJRCAgICAgICAgIDB4MDAwMgotCisjZGVmaW5lIEwyQ0FQX1JFSl9OT1RfVU5ERVJTVE9PRAkweDAwMDAKKyNkZWZpbmUgTDJDQVBfUkVKX01UVV9FWENFRURFRAkJMHgwMDAxCisjZGVmaW5lIEwyQ0FQX1JFSl9JTlZBTElEX0NJRAkJMHgwMDAyCiAKIC8qIEwyQ0FQIHN0cnVjdHVyZXMgKi8KIHN0cnVjdCBsMmNhcF9oZHIgewpAQCAtMTQ0LDYgKzE4MCwxMiBAQAogCV9fbGUxNiAgICAgY2lkOwogfSBfX3BhY2tlZDsKICNkZWZpbmUgTDJDQVBfSERSX1NJWkUJCTQKKyNkZWZpbmUgTDJDQVBfRU5IX0hEUl9TSVpFCTYKKyNkZWZpbmUgTDJDQVBfRVhUX0hEUl9TSVpFCTgKKworI2RlZmluZSBMMkNBUF9GQ1NfU0laRQkJMgorI2RlZmluZSBMMkNBUF9TRFVMRU5fU0laRQkyCisjZGVmaW5lIEwyQ0FQX1BTTUxFTl9TSVpFCTIKIAogc3RydWN0IGwyY2FwX2NtZF9oZHIgewogCV9fdTggICAgICAgY29kZTsKQEAgLTE4OCwxNCArMjMwLDE1IEBACiAjZGVmaW5lIEwyQ0FQX0NJRF9EWU5fU1RBUlQJMHgwMDQwCiAjZGVmaW5lIEwyQ0FQX0NJRF9EWU5fRU5ECTB4ZmZmZgogCi0vKiBjb25uZWN0IHJlc3VsdCAqLworLyogY29ubmVjdC9jcmVhdGUgY2hhbm5lbCByZXN1bHRzICovCiAjZGVmaW5lIEwyQ0FQX0NSX1NVQ0NFU1MJMHgwMDAwCiAjZGVmaW5lIEwyQ0FQX0NSX1BFTkQJCTB4MDAwMQogI2RlZmluZSBMMkNBUF9DUl9CQURfUFNNCTB4MDAwMgogI2RlZmluZSBMMkNBUF9DUl9TRUNfQkxPQ0sJMHgwMDAzCiAjZGVmaW5lIEwyQ0FQX0NSX05PX01FTQkJMHgwMDA0CisjZGVmaW5lIEwyQ0FQX0NSX0JBRF9BTVAJMHgwMDA1CiAKLS8qIGNvbm5lY3Qgc3RhdHVzICovCisvKiBjb25uZWN0L2NyZWF0ZSBjaGFubmVsIHN0YXR1cyAqLwogI2RlZmluZSBMMkNBUF9DU19OT19JTkZPCTB4MDAwMAogI2RlZmluZSBMMkNBUF9DU19BVVRIRU5fUEVORAkweDAwMDEKICNkZWZpbmUgTDJDQVBfQ1NfQVVUSE9SX1BFTkQJMHgwMDAyCkBAIC0yMTcsNiArMjYwLDggQEAKICNkZWZpbmUgTDJDQVBfQ09ORl9VTkFDQ0VQVAkweDAwMDEKICNkZWZpbmUgTDJDQVBfQ09ORl9SRUpFQ1QJMHgwMDAyCiAjZGVmaW5lIEwyQ0FQX0NPTkZfVU5LTk9XTgkweDAwMDMKKyNkZWZpbmUgTDJDQVBfQ09ORl9QRU5ESU5HCTB4MDAwNAorI2RlZmluZSBMMkNBUF9DT05GX0VGU19SRUpFQ1QJMHgwMDA1CiAKIHN0cnVjdCBsMmNhcF9jb25mX29wdCB7CiAJX191OCAgICAgICB0eXBlOwpAQCAtMjMzLDYgKzI3OCw4IEBACiAjZGVmaW5lIEwyQ0FQX0NPTkZfUU9TCQkweDAzCiAjZGVmaW5lIEwyQ0FQX0NPTkZfUkZDCQkweDA0CiAjZGVmaW5lIEwyQ0FQX0NPTkZfRkNTCQkweDA1CisjZGVmaW5lIEwyQ0FQX0NPTkZfRUZTCQkweDA2CisjZGVmaW5lIEwyQ0FQX0NPTkZfRVdTCQkweDA3CiAKICNkZWZpbmUgTDJDQVBfQ09ORl9NQVhfU0laRQkyMgogCkBAIC0yNTEsNiArMjk4LDIxIEBACiAjZGVmaW5lIEwyQ0FQX01PREVfRVJUTQkJMHgwMwogI2RlZmluZSBMMkNBUF9NT0RFX1NUUkVBTUlORwkweDA0CiAKK3N0cnVjdCBsMmNhcF9jb25mX2VmcyB7CisJX191OAlpZDsKKwlfX3U4CXN0eXBlOworCV9fbGUxNgltc2R1OworCV9fbGUzMglzZHVfaXRpbWU7CisJX19sZTMyCWFjY19sYXQ7CisJX19sZTMyCWZsdXNoX3RvOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBMMkNBUF9TRVJWX05PVFJBRklDCTB4MDAKKyNkZWZpbmUgTDJDQVBfU0VSVl9CRVNURUZGT1JUCTB4MDEKKyNkZWZpbmUgTDJDQVBfU0VSVl9HVUFSQU5URUVECTB4MDIKKworI2RlZmluZSBMMkNBUF9CRVNURUZGT1JUX0lECTB4MDEKKwogc3RydWN0IGwyY2FwX2Rpc2Nvbm5fcmVxIHsKIAlfX2xlMTYgICAgIGRjaWQ7CiAJX19sZTE2ICAgICBzY2lkOwpAQCAtMjcxLDE0ICszMzMsNTcgQEAKIAlfX3U4ICAgICAgICBkYXRhWzBdOwogfSBfX3BhY2tlZDsKIAorc3RydWN0IGwyY2FwX2NyZWF0ZV9jaGFuX3JlcSB7CisJX19sZTE2ICAgICAgcHNtOworCV9fbGUxNiAgICAgIHNjaWQ7CisJX191OCAgICAgICAgYW1wX2lkOworfSBfX3BhY2tlZDsKKworc3RydWN0IGwyY2FwX2NyZWF0ZV9jaGFuX3JzcCB7CisJX19sZTE2ICAgICAgZGNpZDsKKwlfX2xlMTYgICAgICBzY2lkOworCV9fbGUxNiAgICAgIHJlc3VsdDsKKwlfX2xlMTYgICAgICBzdGF0dXM7Cit9IF9fcGFja2VkOworCitzdHJ1Y3QgbDJjYXBfbW92ZV9jaGFuX3JlcSB7CisJX19sZTE2ICAgICAgaWNpZDsKKwlfX3U4ICAgICAgICBkZXN0X2FtcF9pZDsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBsMmNhcF9tb3ZlX2NoYW5fcnNwIHsKKwlfX2xlMTYgICAgICBpY2lkOworCV9fbGUxNiAgICAgIHJlc3VsdDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTDJDQVBfTVJfU1VDQ0VTUwkweDAwMDAKKyNkZWZpbmUgTDJDQVBfTVJfUEVORAkJMHgwMDAxCisjZGVmaW5lIEwyQ0FQX01SX0JBRF9JRAkJMHgwMDAyCisjZGVmaW5lIEwyQ0FQX01SX1NBTUVfSUQJMHgwMDAzCisjZGVmaW5lIEwyQ0FQX01SX05PVF9TVVBQCTB4MDAwNAorI2RlZmluZSBMMkNBUF9NUl9DT0xMSVNJT04JMHgwMDA1CisjZGVmaW5lIEwyQ0FQX01SX05PVF9BTExPV0VECTB4MDAwNgorCitzdHJ1Y3QgbDJjYXBfbW92ZV9jaGFuX2NmbSB7CisJX19sZTE2ICAgICAgaWNpZDsKKwlfX2xlMTYgICAgICByZXN1bHQ7Cit9IF9fcGFja2VkOworCisjZGVmaW5lIEwyQ0FQX01DX0NPTkZJUk1FRAkweDAwMDAKKyNkZWZpbmUgTDJDQVBfTUNfVU5DT05GSVJNRUQJMHgwMDAxCisKK3N0cnVjdCBsMmNhcF9tb3ZlX2NoYW5fY2ZtX3JzcCB7CisJX19sZTE2ICAgICAgaWNpZDsKK30gX19wYWNrZWQ7CisKIC8qIGluZm8gdHlwZSAqLwotI2RlZmluZSBMMkNBUF9JVF9DTF9NVFUgICAgIDB4MDAwMQotI2RlZmluZSBMMkNBUF9JVF9GRUFUX01BU0sgIDB4MDAwMgotI2RlZmluZSBMMkNBUF9JVF9GSVhFRF9DSEFOIDB4MDAwMworI2RlZmluZSBMMkNBUF9JVF9DTF9NVFUJCTB4MDAwMQorI2RlZmluZSBMMkNBUF9JVF9GRUFUX01BU0sJMHgwMDAyCisjZGVmaW5lIEwyQ0FQX0lUX0ZJWEVEX0NIQU4JMHgwMDAzCiAKIC8qIGluZm8gcmVzdWx0ICovCi0jZGVmaW5lIEwyQ0FQX0lSX1NVQ0NFU1MgICAgMHgwMDAwCi0jZGVmaW5lIEwyQ0FQX0lSX05PVFNVUFAgICAgMHgwMDAxCisjZGVmaW5lIEwyQ0FQX0lSX1NVQ0NFU1MJMHgwMDAwCisjZGVmaW5lIEwyQ0FQX0lSX05PVFNVUFAJMHgwMDAxCiAKIHN0cnVjdCBsMmNhcF9jb25uX3BhcmFtX3VwZGF0ZV9yZXEgewogCV9fbGUxNiAgICAgIG1pbjsKQEAgLTI5Nyw3ICs0MDIsNyBAQAogCiAvKiAtLS0tLSBMMkNBUCBjaGFubmVscyBhbmQgY29ubmVjdGlvbnMgLS0tLS0gKi8KIHN0cnVjdCBzcmVqX2xpc3QgewotCV9fdTgJdHhfc2VxOworCV9fdTE2CXR4X3NlcTsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwogCkBAIC0zMTksMTQgKzQyNCwxMSBAQAogCV9fdTE2CQlmbHVzaF90bzsKIAlfX3U4CQltb2RlOwogCV9fdTgJCWNoYW5fdHlwZTsKKwlfX3U4CQljaGFuX3BvbGljeTsKIAogCV9fbGUxNgkJc3BvcnQ7CiAKIAlfX3U4CQlzZWNfbGV2ZWw7Ci0JX191OAkJcm9sZV9zd2l0Y2g7Ci0JX191OAkJZm9yY2VfcmVsaWFibGU7Ci0JX191OAkJZmx1c2hhYmxlOwotCV9fdTgJCWZvcmNlX2FjdGl2ZTsKIAogCV9fdTgJCWlkZW50OwogCkBAIC0zMzcsNyArNDM5LDggQEAKIAogCV9fdTgJCWZjczsKIAotCV9fdTgJCXR4X3dpbjsKKwlfX3UxNgkJdHhfd2luOworCV9fdTE2CQl0eF93aW5fbWF4OwogCV9fdTgJCW1heF90eDsKIAlfX3UxNgkJcmV0cmFuc190aW1lb3V0OwogCV9fdTE2CQltb25pdG9yX3RpbWVvdXQ7CkBAIC0zNDUsMjkgKzQ0OCw0NSBAQAogCiAJdW5zaWduZWQgbG9uZwljb25mX3N0YXRlOwogCXVuc2lnbmVkIGxvbmcJY29ubl9zdGF0ZTsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOwogCi0JX191OAkJbmV4dF90eF9zZXE7Ci0JX191OAkJZXhwZWN0ZWRfYWNrX3NlcTsKLQlfX3U4CQlleHBlY3RlZF90eF9zZXE7Ci0JX191OAkJYnVmZmVyX3NlcTsKLQlfX3U4CQlidWZmZXJfc2VxX3NyZWo7Ci0JX191OAkJc3Jlal9zYXZlX3JlcXNlcTsKLQlfX3U4CQlmcmFtZXNfc2VudDsKLQlfX3U4CQl1bmFja2VkX2ZyYW1lczsKKwlfX3UxNgkJbmV4dF90eF9zZXE7CisJX191MTYJCWV4cGVjdGVkX2Fja19zZXE7CisJX191MTYJCWV4cGVjdGVkX3R4X3NlcTsKKwlfX3UxNgkJYnVmZmVyX3NlcTsKKwlfX3UxNgkJYnVmZmVyX3NlcV9zcmVqOworCV9fdTE2CQlzcmVqX3NhdmVfcmVxc2VxOworCV9fdTE2CQlmcmFtZXNfc2VudDsKKwlfX3UxNgkJdW5hY2tlZF9mcmFtZXM7CiAJX191OAkJcmV0cnlfY291bnQ7CiAJX191OAkJbnVtX2Fja2VkOwogCV9fdTE2CQlzZHVfbGVuOwogCXN0cnVjdCBza19idWZmCSpzZHU7CiAJc3RydWN0IHNrX2J1ZmYJKnNkdV9sYXN0X2ZyYWc7CiAKLQlfX3U4CQlyZW1vdGVfdHhfd2luOworCV9fdTE2CQlyZW1vdGVfdHhfd2luOwogCV9fdTgJCXJlbW90ZV9tYXhfdHg7CiAJX191MTYJCXJlbW90ZV9tcHM7CiAKLQlzdHJ1Y3QgdGltZXJfbGlzdAljaGFuX3RpbWVyOwotCXN0cnVjdCB0aW1lcl9saXN0CXJldHJhbnNfdGltZXI7Ci0Jc3RydWN0IHRpbWVyX2xpc3QJbW9uaXRvcl90aW1lcjsKLQlzdHJ1Y3QgdGltZXJfbGlzdAlhY2tfdGltZXI7CisJX191OAkJbG9jYWxfaWQ7CisJX191OAkJbG9jYWxfc3R5cGU7CisJX191MTYJCWxvY2FsX21zZHU7CisJX191MzIJCWxvY2FsX3NkdV9pdGltZTsKKwlfX3UzMgkJbG9jYWxfYWNjX2xhdDsKKwlfX3UzMgkJbG9jYWxfZmx1c2hfdG87CisKKwlfX3U4CQlyZW1vdGVfaWQ7CisJX191OAkJcmVtb3RlX3N0eXBlOworCV9fdTE2CQlyZW1vdGVfbXNkdTsKKwlfX3UzMgkJcmVtb3RlX3NkdV9pdGltZTsKKwlfX3UzMgkJcmVtb3RlX2FjY19sYXQ7CisJX191MzIJCXJlbW90ZV9mbHVzaF90bzsKKworCXN0cnVjdCBkZWxheWVkX3dvcmsJY2hhbl90aW1lcjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrCXJldHJhbnNfdGltZXI7CisJc3RydWN0IGRlbGF5ZWRfd29yawltb25pdG9yX3RpbWVyOworCXN0cnVjdCBkZWxheWVkX3dvcmsJYWNrX3RpbWVyOworCiAJc3RydWN0IHNrX2J1ZmYJCSp0eF9zZW5kX2hlYWQ7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZAl0eF9xOwogCXN0cnVjdCBza19idWZmX2hlYWQJc3Jlal9xOwpAQCAtMzkxLDYgKzUxMCw3IEBACiAKIHN0cnVjdCBsMmNhcF9jb25uIHsKIAlzdHJ1Y3QgaGNpX2Nvbm4JKmhjb247CisJc3RydWN0IGhjaV9jaGFuCSpoY2hhbjsKIAogCWJkYWRkcl90CSpkc3Q7CiAJYmRhZGRyX3QJKnNyYzsKQEAgLTQwMiw3ICs1MjIsNyBAQAogCV9fdTgJCWluZm9fc3RhdGU7CiAJX191OAkJaW5mb19pZGVudDsKIAotCXN0cnVjdCB0aW1lcl9saXN0IGluZm9fdGltZXI7CisJc3RydWN0IGRlbGF5ZWRfd29yayBpbmZvX3RpbWVyOwogCiAJc3BpbmxvY2tfdAlsb2NrOwogCkBAIC00MTIsMTEgKzUzMiwxMSBAQAogCiAJX191OAkJZGlzY19yZWFzb247CiAKLQlzdHJ1Y3QgdGltZXJfbGlzdCBzZWN1cml0eV90aW1lcjsKKwlzdHJ1Y3QgZGVsYXllZF93b3JrICBzZWN1cml0eV90aW1lcjsKIAlzdHJ1Y3Qgc21wX2NoYW4gKnNtcF9jaGFuOwogCiAJc3RydWN0IGxpc3RfaGVhZCBjaGFuX2w7Ci0Jcndsb2NrX3QJY2hhbl9sb2NrOworCXN0cnVjdCBtdXRleAljaGFuX2xvY2s7CiB9OwogCiAjZGVmaW5lIEwyQ0FQX0lORk9fQ0xfTVRVX1JFUV9TRU5UCTB4MDEKQEAgLTQ0NSw2ICs1NjUsOSBAQAogCUNPTkZfQ09OTkVDVF9QRU5ELAogCUNPTkZfTk9fRkNTX1JFQ1YsCiAJQ09ORl9TVEFURTJfREVWSUNFLAorCUNPTkZfRVdTX1JFQ1YsCisJQ09ORl9MT0NfQ09ORl9QRU5ELAorCUNPTkZfUkVNX0NPTkZfUEVORCwKIH07CiAKICNkZWZpbmUgTDJDQVBfQ09ORl9NQVhfQ09ORl9SRVEgMgpAQCAtNDYyLDYgKzU4NSw0NCBAQAogCUNPTk5fUk5SX1NFTlQsCiB9OwogCisvKiBEZWZpbml0aW9ucyBmb3IgZmxhZ3MgaW4gbDJjYXBfY2hhbiAqLworZW51bSB7CisJRkxBR19ST0xFX1NXSVRDSCwKKwlGTEFHX0ZPUkNFX0FDVElWRSwKKwlGTEFHX0ZPUkNFX1JFTElBQkxFLAorCUZMQUdfRkxVU0hBQkxFLAorCUZMQUdfRVhUX0NUUkwsCisJRkxBR19FRlNfRU5BQkxFLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX2NoYW5faG9sZChzdHJ1Y3QgbDJjYXBfY2hhbiAqYykKK3sKKwlhdG9taWNfaW5jKCZjLT5yZWZjbnQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfY2hhbl9wdXQoc3RydWN0IGwyY2FwX2NoYW4gKmMpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmMtPnJlZmNudCkpCisJCWtmcmVlKGMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfc2V0X3RpbWVyKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLAorCQkJCQlzdHJ1Y3QgZGVsYXllZF93b3JrICp3b3JrLCBsb25nIHRpbWVvdXQpCit7CisJQlRfREJHKCJjaGFuICVwIHN0YXRlICVkIHRpbWVvdXQgJWxkIiwgY2hhbiwgY2hhbi0+c3RhdGUsIHRpbWVvdXQpOworCisJaWYgKCFfX2NhbmNlbF9kZWxheWVkX3dvcmsod29yaykpCisJCWwyY2FwX2NoYW5faG9sZChjaGFuKTsKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsod29yaywgdGltZW91dCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9jbGVhcl90aW1lcihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwKKwkJCQkJc3RydWN0IGRlbGF5ZWRfd29yayAqd29yaykKK3sKKwlpZiAoX19jYW5jZWxfZGVsYXllZF93b3JrKHdvcmspKQorCQlsMmNhcF9jaGFuX3B1dChjaGFuKTsKK30KKwogI2RlZmluZSBfX3NldF9jaGFuX3RpbWVyKGMsIHQpIGwyY2FwX3NldF90aW1lcihjLCAmYy0+Y2hhbl90aW1lciwgKHQpKQogI2RlZmluZSBfX2NsZWFyX2NoYW5fdGltZXIoYykgbDJjYXBfY2xlYXJfdGltZXIoYywgJmMtPmNoYW5fdGltZXIpCiAjZGVmaW5lIF9fc2V0X3JldHJhbnNfdGltZXIoYykgbDJjYXBfc2V0X3RpbWVyKGMsICZjLT5yZXRyYW5zX3RpbWVyLCBcCkBAIC00NzQsNiArNjM1LDIyIEBACiAJCUwyQ0FQX0RFRkFVTFRfQUNLX1RPKTsKICNkZWZpbmUgX19jbGVhcl9hY2tfdGltZXIoYykgbDJjYXBfY2xlYXJfdGltZXIoYywgJmMtPmFja190aW1lcikKIAorc3RhdGljIGlubGluZSBpbnQgX19zZXFfb2Zmc2V0KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX3UxNiBzZXExLCBfX3UxNiBzZXEyKQoreworCWludCBvZmZzZXQ7CisKKwlvZmZzZXQgPSAoc2VxMSAtIHNlcTIpICUgKGNoYW4tPnR4X3dpbl9tYXggKyAxKTsKKwlpZiAob2Zmc2V0IDwgMCkKKwkJb2Zmc2V0ICs9IChjaGFuLT50eF93aW5fbWF4ICsgMSk7CisKKwlyZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgaW5saW5lIF9fdTE2IF9fbmV4dF9zZXEoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIF9fdTE2IHNlcSkKK3sKKwlyZXR1cm4gKHNlcSArIDEpICUgKGNoYW4tPnR4X3dpbl9tYXggKyAxKTsKK30KKwogc3RhdGljIGlubGluZSBpbnQgbDJjYXBfdHhfd2luZG93X2Z1bGwoc3RydWN0IGwyY2FwX2NoYW4gKmNoKQogewogCWludCBzdWI7CkBAIC00ODYsMTMgKzY2MywxNjQgQEAKIAlyZXR1cm4gc3ViID09IGNoLT5yZW1vdGVfdHhfd2luOwogfQogCi0jZGVmaW5lIF9fZ2V0X3R4c2VxKGN0cmwpCSgoKGN0cmwpICYgTDJDQVBfQ1RSTF9UWFNFUSkgPj4gMSkKLSNkZWZpbmUgX19nZXRfcmVxc2VxKGN0cmwpCSgoKGN0cmwpICYgTDJDQVBfQ1RSTF9SRVFTRVEpID4+IDgpCi0jZGVmaW5lIF9faXNfaWZyYW1lKGN0cmwpCSghKChjdHJsKSAmIEwyQ0FQX0NUUkxfRlJBTUVfVFlQRSkpCi0jZGVmaW5lIF9faXNfc2ZyYW1lKGN0cmwpCSgoY3RybCkgJiBMMkNBUF9DVFJMX0ZSQU1FX1RZUEUpCi0jZGVmaW5lIF9faXNfc2FyX3N0YXJ0KGN0cmwpCSgoKGN0cmwpICYgTDJDQVBfQ1RSTF9TQVIpID09IEwyQ0FQX1NEVV9TVEFSVCkKK3N0YXRpYyBpbmxpbmUgX191MTYgX19nZXRfcmVxc2VxKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX3UzMiBjdHJsKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gKGN0cmwgJiBMMkNBUF9FWFRfQ1RSTF9SRVFTRVEpID4+CisJCQkJCQlMMkNBUF9FWFRfQ1RSTF9SRVFTRVFfU0hJRlQ7CisJZWxzZQorCQlyZXR1cm4gKGN0cmwgJiBMMkNBUF9DVFJMX1JFUVNFUSkgPj4gTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQ7Cit9CiAKLWV4dGVybiBpbnQgZGlzYWJsZV9lcnRtOworc3RhdGljIGlubGluZSBfX3UzMiBfX3NldF9yZXFzZXEoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIF9fdTMyIHJlcXNlcSkKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIChyZXFzZXEgPDwgTDJDQVBfRVhUX0NUUkxfUkVRU0VRX1NISUZUKSAmCisJCQkJCQkJTDJDQVBfRVhUX0NUUkxfUkVRU0VROworCWVsc2UKKwkJcmV0dXJuIChyZXFzZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQpICYgTDJDQVBfQ1RSTF9SRVFTRVE7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MTYgX19nZXRfdHhzZXEoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIF9fdTMyIGN0cmwpCit7CisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCXJldHVybiAoY3RybCAmIEwyQ0FQX0VYVF9DVFJMX1RYU0VRKSA+PgorCQkJCQkJTDJDQVBfRVhUX0NUUkxfVFhTRVFfU0hJRlQ7CisJZWxzZQorCQlyZXR1cm4gKGN0cmwgJiBMMkNBUF9DVFJMX1RYU0VRKSA+PiBMMkNBUF9DVFJMX1RYU0VRX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fc2V0X3R4c2VxKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX3UzMiB0eHNlcSkKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuICh0eHNlcSA8PCBMMkNBUF9FWFRfQ1RSTF9UWFNFUV9TSElGVCkgJgorCQkJCQkJCUwyQ0FQX0VYVF9DVFJMX1RYU0VROworCWVsc2UKKwkJcmV0dXJuICh0eHNlcSA8PCBMMkNBUF9DVFJMX1RYU0VRX1NISUZUKSAmIEwyQ0FQX0NUUkxfVFhTRVE7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBfX2lzX3NmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgY3RybCkKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIGN0cmwgJiBMMkNBUF9FWFRfQ1RSTF9GUkFNRV9UWVBFOworCWVsc2UKKwkJcmV0dXJuIGN0cmwgJiBMMkNBUF9DVFJMX0ZSQU1FX1RZUEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MzIgX19zZXRfc2ZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gTDJDQVBfRVhUX0NUUkxfRlJBTUVfVFlQRTsKKwllbHNlCisJCXJldHVybiBMMkNBUF9DVFJMX0ZSQU1FX1RZUEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191OCBfX2dldF9jdHJsX3NhcihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgY3RybCkKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIChjdHJsICYgTDJDQVBfRVhUX0NUUkxfU0FSKSA+PiBMMkNBUF9FWFRfQ1RSTF9TQVJfU0hJRlQ7CisJZWxzZQorCQlyZXR1cm4gKGN0cmwgJiBMMkNBUF9DVFJMX1NBUikgPj4gTDJDQVBfQ1RSTF9TQVJfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MzIgX19zZXRfY3RybF9zYXIoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIF9fdTMyIHNhcikKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIChzYXIgPDwgTDJDQVBfRVhUX0NUUkxfU0FSX1NISUZUKSAmIEwyQ0FQX0VYVF9DVFJMX1NBUjsKKwllbHNlCisJCXJldHVybiAoc2FyIDw8IEwyQ0FQX0NUUkxfU0FSX1NISUZUKSAmIEwyQ0FQX0NUUkxfU0FSOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX19pc19zYXJfc3RhcnQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIF9fdTMyIGN0cmwpCit7CisJcmV0dXJuIF9fZ2V0X2N0cmxfc2FyKGNoYW4sIGN0cmwpID09IEwyQ0FQX1NBUl9TVEFSVDsKK30KKworc3RhdGljIGlubGluZSBfX3UzMiBfX2dldF9zYXJfbWFzayhzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIEwyQ0FQX0VYVF9DVFJMX1NBUjsKKwllbHNlCisJCXJldHVybiBMMkNBUF9DVFJMX1NBUjsKK30KKworc3RhdGljIGlubGluZSBfX3U4IF9fZ2V0X2N0cmxfc3VwZXIoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIF9fdTMyIGN0cmwpCit7CisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCXJldHVybiAoY3RybCAmIEwyQ0FQX0VYVF9DVFJMX1NVUEVSVklTRSkgPj4KKwkJCQkJCUwyQ0FQX0VYVF9DVFJMX1NVUEVSX1NISUZUOworCWVsc2UKKwkJcmV0dXJuIChjdHJsICYgTDJDQVBfQ1RSTF9TVVBFUlZJU0UpID4+IEwyQ0FQX0NUUkxfU1VQRVJfU0hJRlQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191MzIgX19zZXRfY3RybF9zdXBlcihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgc3VwZXIpCit7CisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCXJldHVybiAoc3VwZXIgPDwgTDJDQVBfRVhUX0NUUkxfU1VQRVJfU0hJRlQpICYKKwkJCQkJCUwyQ0FQX0VYVF9DVFJMX1NVUEVSVklTRTsKKwllbHNlCisJCXJldHVybiAoc3VwZXIgPDwgTDJDQVBfQ1RSTF9TVVBFUl9TSElGVCkgJgorCQkJCQkJCUwyQ0FQX0NUUkxfU1VQRVJWSVNFOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fc2V0X2N0cmxfZmluYWwoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCit7CisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCXJldHVybiBMMkNBUF9FWFRfQ1RSTF9GSU5BTDsKKwllbHNlCisJCXJldHVybiBMMkNBUF9DVFJMX0ZJTkFMOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX19pc19jdHJsX2ZpbmFsKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX3UzMiBjdHJsKQoreworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQlyZXR1cm4gY3RybCAmIEwyQ0FQX0VYVF9DVFJMX0ZJTkFMOworCWVsc2UKKwkJcmV0dXJuIGN0cmwgJiBMMkNBUF9DVFJMX0ZJTkFMOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fc2V0X2N0cmxfcG9sbChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIEwyQ0FQX0VYVF9DVFJMX1BPTEw7CisJZWxzZQorCQlyZXR1cm4gTDJDQVBfQ1RSTF9QT0xMOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX19pc19jdHJsX3BvbGwoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIF9fdTMyIGN0cmwpCit7CisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCXJldHVybiBjdHJsICYgTDJDQVBfRVhUX0NUUkxfUE9MTDsKKwllbHNlCisJCXJldHVybiBjdHJsICYgTDJDQVBfQ1RSTF9QT0xMOworfQorCitzdGF0aWMgaW5saW5lIF9fdTMyIF9fZ2V0X2NvbnRyb2woc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHZvaWQgKnApCit7CisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCXJldHVybiBnZXRfdW5hbGlnbmVkX2xlMzIocCk7CisJZWxzZQorCQlyZXR1cm4gZ2V0X3VuYWxpZ25lZF9sZTE2KHApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19wdXRfY29udHJvbChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgX191MzIgY29udHJvbCwKKwkJCQkJCQkJdm9pZCAqcCkKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIHB1dF91bmFsaWduZWRfbGUzMihjb250cm9sLCBwKTsKKwllbHNlCisJCXJldHVybiBwdXRfdW5hbGlnbmVkX2xlMTYoY29udHJvbCwgcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgX191OCBfX2N0cmxfc2l6ZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKK3sKKwlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJcmV0dXJuIEwyQ0FQX0VYVF9IRFJfU0laRSAtIEwyQ0FQX0hEUl9TSVpFOworCWVsc2UKKwkJcmV0dXJuIEwyQ0FQX0VOSF9IRFJfU0laRSAtIEwyQ0FQX0hEUl9TSVpFOworfQorCitleHRlcm4gYm9vbCBkaXNhYmxlX2VydG07CiAKIGludCBsMmNhcF9pbml0X3NvY2tldHModm9pZCk7CiB2b2lkIGwyY2FwX2NsZWFudXBfc29ja2V0cyh2b2lkKTsKQEAgLTUwNiw4ICs4MzQsMTEgQEAKIHN0cnVjdCBsMmNhcF9jaGFuICpsMmNhcF9jaGFuX2NyZWF0ZShzdHJ1Y3Qgc29jayAqc2spOwogdm9pZCBsMmNhcF9jaGFuX2Nsb3NlKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBpbnQgcmVhc29uKTsKIHZvaWQgbDJjYXBfY2hhbl9kZXN0cm95KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKTsKLWludCBsMmNhcF9jaGFuX2Nvbm5lY3Qoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pOwotaW50IGwyY2FwX2NoYW5fc2VuZChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKTsKK2lubGluZSBpbnQgbDJjYXBfY2hhbl9jb25uZWN0KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX2xlMTYgcHNtLCB1MTYgY2lkLAorCQkJCQkJCQliZGFkZHJfdCAqZHN0KTsKK2ludCBsMmNhcF9jaGFuX3NlbmQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCQkJCQkJdTMyIHByaW9yaXR5KTsKIHZvaWQgbDJjYXBfY2hhbl9idXN5KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBpbnQgYnVzeSk7CitpbnQgbDJjYXBfY2hhbl9jaGVja19zZWN1cml0eShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbik7CiAKICNlbmRpZiAvKiBfX0wyQ0FQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmggYi9pbmNsdWRlL25ldC9ibHVldG9vdGgvbWdtdC5oCmluZGV4IGQ2NmRhMGYuLmJlNjVkMzQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9tZ210LmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL21nbXQuaApAQCAtMjMsNiArMjMsMjMgQEAKIAogI2RlZmluZSBNR01UX0lOREVYX05PTkUJCQkweEZGRkYKIAorI2RlZmluZSBNR01UX1NUQVRVU19TVUNDRVNTCQkweDAwCisjZGVmaW5lIE1HTVRfU1RBVFVTX1VOS05PV05fQ09NTUFORAkweDAxCisjZGVmaW5lIE1HTVRfU1RBVFVTX05PVF9DT05ORUNURUQJMHgwMgorI2RlZmluZSBNR01UX1NUQVRVU19GQUlMRUQJCTB4MDMKKyNkZWZpbmUgTUdNVF9TVEFUVVNfQ09OTkVDVF9GQUlMRUQJMHgwNAorI2RlZmluZSBNR01UX1NUQVRVU19BVVRIX0ZBSUxFRAkJMHgwNQorI2RlZmluZSBNR01UX1NUQVRVU19OT1RfUEFJUkVECQkweDA2CisjZGVmaW5lIE1HTVRfU1RBVFVTX05PX1JFU09VUkNFUwkweDA3CisjZGVmaW5lIE1HTVRfU1RBVFVTX1RJTUVPVVQJCTB4MDgKKyNkZWZpbmUgTUdNVF9TVEFUVVNfQUxSRUFEWV9DT05ORUNURUQJMHgwOQorI2RlZmluZSBNR01UX1NUQVRVU19CVVNZCQkweDBhCisjZGVmaW5lIE1HTVRfU1RBVFVTX1JFSkVDVEVECQkweDBiCisjZGVmaW5lIE1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQJMHgwYworI2RlZmluZSBNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUwkweDBkCisjZGVmaW5lIE1HTVRfU1RBVFVTX0RJU0NPTk5FQ1RFRAkweDBlCisjZGVmaW5lIE1HTVRfU1RBVFVTX05PVF9QT1dFUkVECQkweDBmCisKIHN0cnVjdCBtZ210X2hkciB7CiAJX19sZTE2IG9wY29kZTsKIAlfX2xlMTYgaW5kZXg7CkBAIC00NCwyMiArNjEsMjkgQEAKIC8qIFJlc2VydmUgb25lIGV4dHJhIGJ5dGUgZm9yIG5hbWVzIGluIG1hbmFnZW1lbnQgbWVzc2FnZXMgc28gdGhhdCB0aGV5CiAgKiBhcmUgYWx3YXlzIGd1YXJhbnRlZWQgdG8gYmUgbnVsLXRlcm1pbmF0ZWQgKi8KICNkZWZpbmUgTUdNVF9NQVhfTkFNRV9MRU5HVEgJCShIQ0lfTUFYX05BTUVfTEVOR1RIICsgMSkKKyNkZWZpbmUgTUdNVF9NQVhfU0hPUlRfTkFNRV9MRU5HVEgJKDEwICsgMSkKKworI2RlZmluZSBNR01UX1NFVFRJTkdfUE9XRVJFRAkJMHgwMDAwMDAwMQorI2RlZmluZSBNR01UX1NFVFRJTkdfQ09OTkVDVEFCTEUJMHgwMDAwMDAwMgorI2RlZmluZSBNR01UX1NFVFRJTkdfRkFTVF9DT05ORUNUQUJMRQkweDAwMDAwMDA0CisjZGVmaW5lIE1HTVRfU0VUVElOR19ESVNDT1ZFUkFCTEUJMHgwMDAwMDAwOAorI2RlZmluZSBNR01UX1NFVFRJTkdfUEFJUkFCTEUJCTB4MDAwMDAwMTAKKyNkZWZpbmUgTUdNVF9TRVRUSU5HX0xJTktfU0VDVVJJVFkJMHgwMDAwMDAyMAorI2RlZmluZSBNR01UX1NFVFRJTkdfU1NQCQkweDAwMDAwMDQwCisjZGVmaW5lIE1HTVRfU0VUVElOR19CUkVEUgkJMHgwMDAwMDA4MAorI2RlZmluZSBNR01UX1NFVFRJTkdfSFMJCQkweDAwMDAwMTAwCisjZGVmaW5lIE1HTVRfU0VUVElOR19MRQkJCTB4MDAwMDAyMDAKIAogI2RlZmluZSBNR01UX09QX1JFQURfSU5GTwkJMHgwMDA0CiBzdHJ1Y3QgbWdtdF9ycF9yZWFkX2luZm8gewotCV9fdTggdHlwZTsKLQlfX3U4IHBvd2VyZWQ7Ci0JX191OCBjb25uZWN0YWJsZTsKLQlfX3U4IGRpc2NvdmVyYWJsZTsKLQlfX3U4IHBhaXJhYmxlOwotCV9fdTggc2VjX21vZGU7CiAJYmRhZGRyX3QgYmRhZGRyOworCV9fdTggdmVyc2lvbjsKKwlfX2xlMTYgbWFudWZhY3R1cmVyOworCV9fbGUzMiBzdXBwb3J0ZWRfc2V0dGluZ3M7CisJX19sZTMyIGN1cnJlbnRfc2V0dGluZ3M7CiAJX191OCBkZXZfY2xhc3NbM107Ci0JX191OCBmZWF0dXJlc1s4XTsKLQlfX3UxNiBtYW51ZmFjdHVyZXI7Ci0JX191OCBoY2lfdmVyOwotCV9fdTE2IGhjaV9yZXY7CiAJX191OCBuYW1lW01HTVRfTUFYX05BTUVfTEVOR1RIXTsKKwlfX3U4IHNob3J0X25hbWVbTUdNVF9NQVhfU0hPUlRfTkFNRV9MRU5HVEhdOwogfSBfX3BhY2tlZDsKIAogc3RydWN0IG1nbXRfbW9kZSB7CkBAIC02OSw3MCArOTMsOTcgQEAKICNkZWZpbmUgTUdNVF9PUF9TRVRfUE9XRVJFRAkJMHgwMDA1CiAKICNkZWZpbmUgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFCTB4MDAwNgorc3RydWN0IG1nbXRfY3Bfc2V0X2Rpc2NvdmVyYWJsZSB7CisJX191OCB2YWw7CisJX191MTYgdGltZW91dDsKK30gX19wYWNrZWQ7CiAKICNkZWZpbmUgTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUJCTB4MDAwNwogCi0jZGVmaW5lIE1HTVRfT1BfU0VUX1BBSVJBQkxFCQkweDAwMDgKKyNkZWZpbmUgTUdNVF9PUF9TRVRfRkFTVF9DT05ORUNUQUJMRQkweDAwMDgKIAotI2RlZmluZSBNR01UX09QX0FERF9VVUlECQkweDAwMDkKLXN0cnVjdCBtZ210X2NwX2FkZF91dWlkIHsKLQlfX3U4IHV1aWRbMTZdOwotCV9fdTggc3ZjX2hpbnQ7Ci19IF9fcGFja2VkOworI2RlZmluZSBNR01UX09QX1NFVF9QQUlSQUJMRQkJMHgwMDA5CiAKLSNkZWZpbmUgTUdNVF9PUF9SRU1PVkVfVVVJRAkJMHgwMDBBCi1zdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfdXVpZCB7Ci0JX191OCB1dWlkWzE2XTsKLX0gX19wYWNrZWQ7CisjZGVmaW5lIE1HTVRfT1BfU0VUX0xJTktfU0VDVVJJVFkJMHgwMDBBCiAKLSNkZWZpbmUgTUdNVF9PUF9TRVRfREVWX0NMQVNTCQkweDAwMEIKKyNkZWZpbmUgTUdNVF9PUF9TRVRfU1NQCQkJMHgwMDBCCisKKyNkZWZpbmUgTUdNVF9PUF9TRVRfSFMJCQkweDAwMEMKKworI2RlZmluZSBNR01UX09QX1NFVF9MRQkJCTB4MDAwRAorCisjZGVmaW5lIE1HTVRfT1BfU0VUX0RFVl9DTEFTUwkJMHgwMDBFCiBzdHJ1Y3QgbWdtdF9jcF9zZXRfZGV2X2NsYXNzIHsKIAlfX3U4IG1ham9yOwogCV9fdTggbWlub3I7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfU0VUX1NFUlZJQ0VfQ0FDSEUJMHgwMDBDCi1zdHJ1Y3QgbWdtdF9jcF9zZXRfc2VydmljZV9jYWNoZSB7Ci0JX191OCBlbmFibGU7CisjZGVmaW5lIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUJCTB4MDAwRgorc3RydWN0IG1nbXRfY3Bfc2V0X2xvY2FsX25hbWUgeworCV9fdTggbmFtZVtNR01UX01BWF9OQU1FX0xFTkdUSF07CiB9IF9fcGFja2VkOwogCi1zdHJ1Y3QgbWdtdF9rZXlfaW5mbyB7CisjZGVmaW5lIE1HTVRfT1BfQUREX1VVSUQJCTB4MDAxMAorc3RydWN0IG1nbXRfY3BfYWRkX3V1aWQgeworCV9fdTggdXVpZFsxNl07CisJX191OCBzdmNfaGludDsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTUdNVF9PUF9SRU1PVkVfVVVJRAkJMHgwMDExCitzdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfdXVpZCB7CisJX191OCB1dWlkWzE2XTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCBtZ210X2xpbmtfa2V5X2luZm8gewogCWJkYWRkcl90IGJkYWRkcjsKIAl1OCB0eXBlOwogCXU4IHZhbFsxNl07CiAJdTggcGluX2xlbjsKLQl1OCBkbGVuOwotCXU4IGRhdGFbMF07CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfTE9BRF9LRVlTCQkweDAwMEQKLXN0cnVjdCBtZ210X2NwX2xvYWRfa2V5cyB7CisjZGVmaW5lIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVMJCTB4MDAxMgorc3RydWN0IG1nbXRfY3BfbG9hZF9saW5rX2tleXMgewogCV9fdTggZGVidWdfa2V5czsKIAlfX2xlMTYga2V5X2NvdW50OwotCXN0cnVjdCBtZ210X2tleV9pbmZvIGtleXNbMF07CisJc3RydWN0IG1nbXRfbGlua19rZXlfaW5mbyBrZXlzWzBdOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBNR01UX09QX1JFTU9WRV9LRVkJCTB4MDAwRQotc3RydWN0IG1nbXRfY3BfcmVtb3ZlX2tleSB7CisjZGVmaW5lIE1HTVRfT1BfUkVNT1ZFX0tFWVMJCTB4MDAxMworc3RydWN0IG1nbXRfY3BfcmVtb3ZlX2tleXMgewogCWJkYWRkcl90IGJkYWRkcjsKIAlfX3U4IGRpc2Nvbm5lY3Q7CiB9IF9fcGFja2VkOworc3RydWN0IG1nbXRfcnBfcmVtb3ZlX2tleXMgeworCWJkYWRkcl90IGJkYWRkcjsKKwlfX3U4IHN0YXR1czsKK307CiAKLSNkZWZpbmUgTUdNVF9PUF9ESVNDT05ORUNUCQkweDAwMEYKKyNkZWZpbmUgTUdNVF9PUF9ESVNDT05ORUNUCQkweDAwMTQKIHN0cnVjdCBtZ210X2NwX2Rpc2Nvbm5lY3QgewogCWJkYWRkcl90IGJkYWRkcjsKIH0gX19wYWNrZWQ7CiBzdHJ1Y3QgbWdtdF9ycF9kaXNjb25uZWN0IHsKIAliZGFkZHJfdCBiZGFkZHI7CisJX191OCBzdGF0dXM7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfR0VUX0NPTk5FQ1RJT05TCQkweDAwMTAKKyNkZWZpbmUgTUdNVF9BRERSX0JSRURSCQkJMHgwMAorI2RlZmluZSBNR01UX0FERFJfTEVfUFVCTElDCQkweDAxCisjZGVmaW5lIE1HTVRfQUREUl9MRV9SQU5ET00JCTB4MDIKKyNkZWZpbmUgTUdNVF9BRERSX0lOVkFMSUQJCTB4ZmYKKworc3RydWN0IG1nbXRfYWRkcl9pbmZvIHsKKwliZGFkZHJfdCBiZGFkZHI7CisJX191OCB0eXBlOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBNR01UX09QX0dFVF9DT05ORUNUSU9OUwkJMHgwMDE1CiBzdHJ1Y3QgbWdtdF9ycF9nZXRfY29ubmVjdGlvbnMgewogCV9fbGUxNiBjb25uX2NvdW50OwotCWJkYWRkcl90IGNvbm5bMF07CisJc3RydWN0IG1nbXRfYWRkcl9pbmZvIGFkZHJbMF07CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfUElOX0NPREVfUkVQTFkJCTB4MDAxMQorI2RlZmluZSBNR01UX09QX1BJTl9DT0RFX1JFUExZCQkweDAwMTYKIHN0cnVjdCBtZ210X2NwX3Bpbl9jb2RlX3JlcGx5IHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCBwaW5fbGVuOwpAQCAtMTQzLDI3ICsxOTQsMjcgQEAKIAl1aW50OF90IHN0YXR1czsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTUdNVF9PUF9QSU5fQ09ERV9ORUdfUkVQTFkJMHgwMDEyCisjZGVmaW5lIE1HTVRfT1BfUElOX0NPREVfTkVHX1JFUExZCTB4MDAxNwogc3RydWN0IG1nbXRfY3BfcGluX2NvZGVfbmVnX3JlcGx5IHsKIAliZGFkZHJfdCBiZGFkZHI7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfU0VUX0lPX0NBUEFCSUxJVFkJMHgwMDEzCisjZGVmaW5lIE1HTVRfT1BfU0VUX0lPX0NBUEFCSUxJVFkJMHgwMDE4CiBzdHJ1Y3QgbWdtdF9jcF9zZXRfaW9fY2FwYWJpbGl0eSB7CiAJX191OCBpb19jYXBhYmlsaXR5OwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBNR01UX09QX1BBSVJfREVWSUNFCQkweDAwMTQKKyNkZWZpbmUgTUdNVF9PUF9QQUlSX0RFVklDRQkJMHgwMDE5CiBzdHJ1Y3QgbWdtdF9jcF9wYWlyX2RldmljZSB7Ci0JYmRhZGRyX3QgYmRhZGRyOworCXN0cnVjdCBtZ210X2FkZHJfaW5mbyBhZGRyOwogCV9fdTggaW9fY2FwOwogfSBfX3BhY2tlZDsKIHN0cnVjdCBtZ210X3JwX3BhaXJfZGV2aWNlIHsKLQliZGFkZHJfdCBiZGFkZHI7CisJc3RydWN0IG1nbXRfYWRkcl9pbmZvIGFkZHI7CiAJX191OCBzdGF0dXM7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfVVNFUl9DT05GSVJNX1JFUExZCTB4MDAxNQorI2RlZmluZSBNR01UX09QX1VTRVJfQ09ORklSTV9SRVBMWQkweDAwMUEKIHN0cnVjdCBtZ210X2NwX3VzZXJfY29uZmlybV9yZXBseSB7CiAJYmRhZGRyX3QgYmRhZGRyOwogfSBfX3BhY2tlZDsKQEAgLTE3Miw1MCArMjIzLDcxIEBACiAJX191OCBzdGF0dXM7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfVVNFUl9DT05GSVJNX05FR19SRVBMWQkweDAwMTYKLQotI2RlZmluZSBNR01UX09QX1NFVF9MT0NBTF9OQU1FCQkweDAwMTcKLXN0cnVjdCBtZ210X2NwX3NldF9sb2NhbF9uYW1lIHsKLQlfX3U4IG5hbWVbTUdNVF9NQVhfTkFNRV9MRU5HVEhdOworI2RlZmluZSBNR01UX09QX1VTRVJfQ09ORklSTV9ORUdfUkVQTFkJMHgwMDFCCitzdHJ1Y3QgbWdtdF9jcF91c2VyX2NvbmZpcm1fbmVnX3JlcGx5IHsKKwliZGFkZHJfdCBiZGFkZHI7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfREFUQQkweDAwMTgKKyNkZWZpbmUgTUdNVF9PUF9VU0VSX1BBU1NLRVlfUkVQTFkJMHgwMDFDCitzdHJ1Y3QgbWdtdF9jcF91c2VyX3Bhc3NrZXlfcmVwbHkgeworCWJkYWRkcl90IGJkYWRkcjsKKwlfX2xlMzIgcGFzc2tleTsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgbWdtdF9ycF91c2VyX3Bhc3NrZXlfcmVwbHkgeworCWJkYWRkcl90IGJkYWRkcjsKKwlfX3U4IHN0YXR1czsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTUdNVF9PUF9VU0VSX1BBU1NLRVlfTkVHX1JFUExZCTB4MDAxRAorc3RydWN0IG1nbXRfY3BfdXNlcl9wYXNza2V5X25lZ19yZXBseSB7CisJYmRhZGRyX3QgYmRhZGRyOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEJMHgwMDFFCiBzdHJ1Y3QgbWdtdF9ycF9yZWFkX2xvY2FsX29vYl9kYXRhIHsKIAlfX3U4IGhhc2hbMTZdOwogCV9fdTggcmFuZG9taXplclsxNl07CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfQUREX1JFTU9URV9PT0JfREFUQQkweDAwMTkKKyNkZWZpbmUgTUdNVF9PUF9BRERfUkVNT1RFX09PQl9EQVRBCTB4MDAxRgogc3RydWN0IG1nbXRfY3BfYWRkX3JlbW90ZV9vb2JfZGF0YSB7CiAJYmRhZGRyX3QgYmRhZGRyOwogCV9fdTggaGFzaFsxNl07CiAJX191OCByYW5kb21pemVyWzE2XTsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTUdNVF9PUF9SRU1PVkVfUkVNT1RFX09PQl9EQVRBCTB4MDAxQQorI2RlZmluZSBNR01UX09QX1JFTU9WRV9SRU1PVEVfT09CX0RBVEEJMHgwMDIwCiBzdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfcmVtb3RlX29vYl9kYXRhIHsKIAliZGFkZHJfdCBiZGFkZHI7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfU1RBUlRfRElTQ09WRVJZCQkweDAwMUIKKyNkZWZpbmUgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlkJCTB4MDAyMQorc3RydWN0IG1nbXRfY3Bfc3RhcnRfZGlzY292ZXJ5IHsKKwlfX3U4IHR5cGU7Cit9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfU1RPUF9ESVNDT1ZFUlkJCTB4MDAxQworI2RlZmluZSBNR01UX09QX1NUT1BfRElTQ09WRVJZCQkweDAwMjIKIAotI2RlZmluZSBNR01UX09QX0JMT0NLX0RFVklDRQkJMHgwMDFECisjZGVmaW5lIE1HTVRfT1BfQ09ORklSTV9OQU1FCQkweDAwMjMKK3N0cnVjdCBtZ210X2NwX2NvbmZpcm1fbmFtZSB7CisJYmRhZGRyX3QgYmRhZGRyOworCV9fdTggbmFtZV9rbm93bjsKK30gX19wYWNrZWQ7CitzdHJ1Y3QgbWdtdF9ycF9jb25maXJtX25hbWUgeworCWJkYWRkcl90IGJkYWRkcjsKKwlfX3U4IHN0YXR1czsKK30gX19wYWNrZWQ7CisKKyNkZWZpbmUgTUdNVF9PUF9CTE9DS19ERVZJQ0UJCTB4MDAyNAogc3RydWN0IG1nbXRfY3BfYmxvY2tfZGV2aWNlIHsKIAliZGFkZHJfdCBiZGFkZHI7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UJCTB4MDAxRQorI2RlZmluZSBNR01UX09QX1VOQkxPQ0tfREVWSUNFCQkweDAwMjUKIHN0cnVjdCBtZ210X2NwX3VuYmxvY2tfZGV2aWNlIHsKIAliZGFkZHJfdCBiZGFkZHI7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfT1BfU0VUX0ZBU1RfQ09OTkVDVEFCTEUJMHgwMDFGCi1zdHJ1Y3QgbWdtdF9jcF9zZXRfZmFzdF9jb25uZWN0YWJsZSB7Ci0JX191OCBlbmFibGU7Ci19IF9fcGFja2VkOwotCiAjZGVmaW5lIE1HTVRfRVZfQ01EX0NPTVBMRVRFCQkweDAwMDEKIHN0cnVjdCBtZ210X2V2X2NtZF9jb21wbGV0ZSB7CiAJX19sZTE2IG9wY29kZTsKQEAgLTIzNyw4MyArMzA5LDgyIEBACiAKICNkZWZpbmUgTUdNVF9FVl9JTkRFWF9SRU1PVkVECQkweDAwMDUKIAotI2RlZmluZSBNR01UX0VWX1BPV0VSRUQJCQkweDAwMDYKKyNkZWZpbmUgTUdNVF9FVl9ORVdfU0VUVElOR1MJCTB4MDAwNgogCi0jZGVmaW5lIE1HTVRfRVZfRElTQ09WRVJBQkxFCQkweDAwMDcKKyNkZWZpbmUgTUdNVF9FVl9DTEFTU19PRl9ERVZfQ0hBTkdFRAkweDAwMDcKK3N0cnVjdCBtZ210X2V2X2NsYXNzX29mX2Rldl9jaGFuZ2VkIHsKKwlfX3U4IGRldl9jbGFzc1szXTsKK307CiAKLSNkZWZpbmUgTUdNVF9FVl9DT05ORUNUQUJMRQkJMHgwMDA4CisjZGVmaW5lIE1HTVRfRVZfTE9DQUxfTkFNRV9DSEFOR0VECTB4MDAwOAorc3RydWN0IG1nbXRfZXZfbG9jYWxfbmFtZV9jaGFuZ2VkIHsKKwlfX3U4IG5hbWVbTUdNVF9NQVhfTkFNRV9MRU5HVEhdOworCV9fdTggc2hvcnRfbmFtZVtNR01UX01BWF9TSE9SVF9OQU1FX0xFTkdUSF07Cit9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfRVZfUEFJUkFCTEUJCTB4MDAwOQotCi0jZGVmaW5lIE1HTVRfRVZfTkVXX0tFWQkJCTB4MDAwQQotc3RydWN0IG1nbXRfZXZfbmV3X2tleSB7CisjZGVmaW5lIE1HTVRfRVZfTkVXX0xJTktfS0VZCQkweDAwMDkKK3N0cnVjdCBtZ210X2V2X25ld19saW5rX2tleSB7CiAJX191OCBzdG9yZV9oaW50OwotCXN0cnVjdCBtZ210X2tleV9pbmZvIGtleTsKKwlzdHJ1Y3QgbWdtdF9saW5rX2tleV9pbmZvIGtleTsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTUdNVF9FVl9DT05ORUNURUQJCTB4MDAwQgotc3RydWN0IG1nbXRfZXZfY29ubmVjdGVkIHsKLQliZGFkZHJfdCBiZGFkZHI7Ci0JX191OCBsaW5rX3R5cGU7Ci19IF9fcGFja2VkOworI2RlZmluZSBNR01UX0VWX0NPTk5FQ1RFRAkJMHgwMDBBCiAKLSNkZWZpbmUgTUdNVF9FVl9ESVNDT05ORUNURUQJCTB4MDAwQwotc3RydWN0IG1nbXRfZXZfZGlzY29ubmVjdGVkIHsKLQliZGFkZHJfdCBiZGFkZHI7Ci19IF9fcGFja2VkOworI2RlZmluZSBNR01UX0VWX0RJU0NPTk5FQ1RFRAkJMHgwMDBCCiAKLSNkZWZpbmUgTUdNVF9FVl9DT05ORUNUX0ZBSUxFRAkJMHgwMDBECisjZGVmaW5lIE1HTVRfRVZfQ09OTkVDVF9GQUlMRUQJCTB4MDAwQwogc3RydWN0IG1nbXRfZXZfY29ubmVjdF9mYWlsZWQgewotCWJkYWRkcl90IGJkYWRkcjsKKwlzdHJ1Y3QgbWdtdF9hZGRyX2luZm8gYWRkcjsKIAlfX3U4IHN0YXR1czsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTUdNVF9FVl9QSU5fQ09ERV9SRVFVRVNUCTB4MDAwRQorI2RlZmluZSBNR01UX0VWX1BJTl9DT0RFX1JFUVVFU1QJMHgwMDBECiBzdHJ1Y3QgbWdtdF9ldl9waW5fY29kZV9yZXF1ZXN0IHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCBzZWN1cmU7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfRVZfVVNFUl9DT05GSVJNX1JFUVVFU1QJMHgwMDBGCisjZGVmaW5lIE1HTVRfRVZfVVNFUl9DT05GSVJNX1JFUVVFU1QJMHgwMDBFCiBzdHJ1Y3QgbWdtdF9ldl91c2VyX2NvbmZpcm1fcmVxdWVzdCB7CiAJYmRhZGRyX3QgYmRhZGRyOwogCV9fdTggY29uZmlybV9oaW50OwogCV9fbGUzMiB2YWx1ZTsKIH0gX19wYWNrZWQ7CiAKKyNkZWZpbmUgTUdNVF9FVl9VU0VSX1BBU1NLRVlfUkVRVUVTVAkweDAwMEYKK3N0cnVjdCBtZ210X2V2X3VzZXJfcGFzc2tleV9yZXF1ZXN0IHsKKwliZGFkZHJfdCBiZGFkZHI7Cit9IF9fcGFja2VkOworCiAjZGVmaW5lIE1HTVRfRVZfQVVUSF9GQUlMRUQJCTB4MDAxMAogc3RydWN0IG1nbXRfZXZfYXV0aF9mYWlsZWQgewogCWJkYWRkcl90IGJkYWRkcjsKIAlfX3U4IHN0YXR1czsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTUdNVF9FVl9MT0NBTF9OQU1FX0NIQU5HRUQJMHgwMDExCi1zdHJ1Y3QgbWdtdF9ldl9sb2NhbF9uYW1lX2NoYW5nZWQgewotCV9fdTggbmFtZVtNR01UX01BWF9OQU1FX0xFTkdUSF07Ci19IF9fcGFja2VkOwotCi0jZGVmaW5lIE1HTVRfRVZfREVWSUNFX0ZPVU5ECQkweDAwMTIKKyNkZWZpbmUgTUdNVF9FVl9ERVZJQ0VfRk9VTkQJCTB4MDAxMQogc3RydWN0IG1nbXRfZXZfZGV2aWNlX2ZvdW5kIHsKLQliZGFkZHJfdCBiZGFkZHI7CisJc3RydWN0IG1nbXRfYWRkcl9pbmZvIGFkZHI7CiAJX191OCBkZXZfY2xhc3NbM107CiAJX19zOCByc3NpOworCV9fdTggY29uZmlybV9uYW1lOwogCV9fdTggZWlyW0hDSV9NQVhfRUlSX0xFTkdUSF07CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfRVZfUkVNT1RFX05BTUUJCTB4MDAxMworI2RlZmluZSBNR01UX0VWX1JFTU9URV9OQU1FCQkweDAwMTIKIHN0cnVjdCBtZ210X2V2X3JlbW90ZV9uYW1lIHsKIAliZGFkZHJfdCBiZGFkZHI7CiAJX191OCBuYW1lW01HTVRfTUFYX05BTUVfTEVOR1RIXTsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTUdNVF9FVl9ESVNDT1ZFUklORwkJMHgwMDE0CisjZGVmaW5lIE1HTVRfRVZfRElTQ09WRVJJTkcJCTB4MDAxMwogCi0jZGVmaW5lIE1HTVRfRVZfREVWSUNFX0JMT0NLRUQJCTB4MDAxNQorI2RlZmluZSBNR01UX0VWX0RFVklDRV9CTE9DS0VECQkweDAwMTQKIHN0cnVjdCBtZ210X2V2X2RldmljZV9ibG9ja2VkIHsKIAliZGFkZHJfdCBiZGFkZHI7CiB9IF9fcGFja2VkOwogCi0jZGVmaW5lIE1HTVRfRVZfREVWSUNFX1VOQkxPQ0tFRAkweDAwMTYKKyNkZWZpbmUgTUdNVF9FVl9ERVZJQ0VfVU5CTE9DS0VECTB4MDAxNQogc3RydWN0IG1nbXRfZXZfZGV2aWNlX3VuYmxvY2tlZCB7CiAJYmRhZGRyX3QgYmRhZGRyOwogfSBfX3BhY2tlZDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2JsdWV0b290aC9zbXAuaCBiL2luY2x1ZGUvbmV0L2JsdWV0b290aC9zbXAuaAppbmRleCAxNWI5N2Q1Li5hZWFmNWZhIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9ibHVldG9vdGgvc21wLmgKKysrIGIvaW5jbHVkZS9uZXQvYmx1ZXRvb3RoL3NtcC5oCkBAIC0xMTUsNiArMTE1LDEwIEBACiAjZGVmaW5lIFNNUF9NSU5fRU5DX0tFWV9TSVpFCQk3CiAjZGVmaW5lIFNNUF9NQVhfRU5DX0tFWV9TSVpFCQkxNgogCisjZGVmaW5lIFNNUF9GTEFHX1RLX1ZBTElECTEKKyNkZWZpbmUgU01QX0ZMQUdfQ0ZNX1BFTkRJTkcJMgorI2RlZmluZSBTTVBfRkxBR19NSVRNX0FVVEgJMworCiBzdHJ1Y3Qgc21wX2NoYW4gewogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uOwogCXU4CQlwcmVxWzddOyAvKiBTTVAgUGFpcmluZyBSZXF1ZXN0ICovCkBAIC0xMjQsNiArMTI4LDcgQEAKIAl1OAkJcGNuZlsxNl07IC8qIFNNUCBQYWlyaW5nIENvbmZpcm0gKi8KIAl1OAkJdGtbMTZdOyAvKiBTTVAgVGVtcG9yYXJ5IEtleSAqLwogCXU4CQlzbXBfa2V5X3NpemU7CisJdW5zaWduZWQgbG9uZwlzbXBfZmxhZ3M7CiAJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIJKnRmbTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY29uZmlybTsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcmFuZG9tOwpAQCAtMTM0LDYgKzEzOSw3IEBACiBpbnQgc21wX2Nvbm5fc2VjdXJpdHkoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIF9fdTggc2VjX2xldmVsKTsKIGludCBzbXBfc2lnX2NoYW5uZWwoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpOwogaW50IHNtcF9kaXN0cmlidXRlX2tleXMoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIF9fdTggZm9yY2UpOworaW50IHNtcF91c2VyX2NvbmZpcm1fcmVwbHkoc3RydWN0IGhjaV9jb25uICpjb25uLCB1MTYgbWdtdF9vcCwgX19sZTMyIHBhc3NrZXkpOwogCiB2b2lkIHNtcF9jaGFuX2Rlc3Ryb3koc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jYWlmL2NhaWZfZGV2LmggYi9pbmNsdWRlL25ldC9jYWlmL2NhaWZfZGV2LmgKaW5kZXggYzAxMTI4MS4uZWYyZGQ5NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2FpZi9jYWlmX2Rldi5oCisrKyBiL2luY2x1ZGUvbmV0L2NhaWYvY2FpZl9kZXYuaApAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgPG5ldC9jYWlmL2NhaWZfbGF5ZXIuaD4KICNpbmNsdWRlIDxuZXQvY2FpZi9jZmNuZmcuaD4KKyNpbmNsdWRlIDxuZXQvY2FpZi9jYWlmX2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2NhaWYvY2FpZl9zb2NrZXQuaD4KICNpbmNsdWRlIDxsaW51eC9pZi5oPgogI2luY2x1ZGUgPGxpbnV4L25ldC5oPgpAQCAtMTA0LDQgKzEwNSwyNCBAQAogICovCiB2b2lkIGNhaWZfZnJlZV9jbGllbnQoc3RydWN0IGNmbGF5ZXIgKmFkYXBfbGF5ZXIpOwogCisvKioKKyAqIHN0cnVjdCBjYWlmX2Vucm9sbF9kZXYgLSBFbnJvbGwgYSBuZXQtZGV2aWNlIGFzIGEgQ0FJRiBMaW5rIGxheWVyCisgKiBAZGV2OgkJTmV0d29yayBkZXZpY2UgdG8gZW5yb2xsLgorICogQGNhaWZkZXY6CQlDb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZyb20gQ0FJRiBMaW5rIExheWVyCisgKiBAbGlua19zdXBwb3J0OglMaW5rIGxheWVyIHN1cHBvcnQgbGF5ZXIKKyAqIEBoZWFkX3Jvb206CQlIZWFkIHJvb20gbmVlZGVkIGJ5IGxpbmsgc3VwcG9ydCBsYXllcgorICogQGxheWVyOgkJTG93ZXN0IGxheWVyIGluIENBSUYgc3RhY2sKKyAqIEByY3ZfZnVuOgkJUmVjZWl2ZSBmdW5jdGlvbiBmb3IgQ0FJRiBzdGFjay4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVucm9sbCBhIENBSUYgbGluayBsYXllciBpbnRvIENBSUYgU3RhY2sgYW5kCisgKiBleHBlY3RzIHRoZSBpbnRlcmZhY2UgdG8gYmUgYWJsZSB0byBoYW5kbGUgQ0FJRiBwYXlsb2FkLgorICogVGhlIGxpbmtfc3VwcG9ydCBsYXllciBpcyB1c2VkIHRvIGFkZCBhbnkgTGluayBMYXllciBzcGVjaWZpYworICogZnJhbWluZy4KKyAqLwordm9pZCBjYWlmX2Vucm9sbF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGNhaWZfZGV2X2NvbW1vbiAqY2FpZmRldiwKKwkJCXN0cnVjdCBjZmxheWVyICpsaW5rX3N1cHBvcnQsIGludCBoZWFkX3Jvb20sCisJCQlzdHJ1Y3QgY2ZsYXllciAqKmxheWVyLCBpbnQgKCoqcmN2X2Z1bmMpKAorCQkJCXN0cnVjdCBza19idWZmICosIHN0cnVjdCBuZXRfZGV2aWNlICosCisJCQkJc3RydWN0IHBhY2tldF90eXBlICosIHN0cnVjdCBuZXRfZGV2aWNlICopKTsKKwogI2VuZGlmIC8qIENBSUZfREVWX0hfICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jYWlmL2NhaWZfbGF5ZXIuaCBiL2luY2x1ZGUvbmV0L2NhaWYvY2FpZl9sYXllci5oCmluZGV4IDM1YmM3ODguLjBmM2EzOTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2NhaWYvY2FpZl9sYXllci5oCisrKyBiL2luY2x1ZGUvbmV0L2NhaWYvY2FpZl9sYXllci5oCkBAIC0xMjEsOSArMTIxLDcgQEAKICAqIEB0cmFuc21pdDoJUGFja2V0IHRyYW5zbWl0IGZ1bmNpdG9uLgogICogQGN0cmxjbWQ6CVVzZWQgZm9yIGNvbnRyb2wgc2lnbmFsbGluZyB1cHdhcmRzIGluIHRoZSBzdGFjay4KICAqIEBtb2RlbWNtZDoJVXNlZCBmb3IgY29udHJvbCBzaWduYWxpbmcgZG93bndhcmRzIGluIHRoZSBzdGFjay4KLSAqIEBwcmlvOglQcmlvcml0eSBvZiB0aGlzIGxheWVyLgogICogQGlkOgkJVGhlIGlkZW50aXR5IG9mIHRoaXMgbGF5ZXIKLSAqIEB0eXBlOglUaGUgdHlwZSBvZiB0aGlzIGxheWVyCiAgKiBAbmFtZToJTmFtZSBvZiB0aGUgbGF5ZXIuCiAgKgogICogIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGxheWVyZWQgc3RydWN0dXJlIGluIENBSUYuCkBAIC0yMzAsOSArMjI4LDcgQEAKIAkgKi8KIAlpbnQgKCptb2RlbWNtZCkgKHN0cnVjdCBjZmxheWVyICpsYXlyLCBlbnVtIGNhaWZfbW9kZW1jbWQgY3RybCk7CiAKLQl1bnNpZ25lZCBzaG9ydCBwcmlvOwogCXVuc2lnbmVkIGludCBpZDsKLQl1bnNpZ25lZCBpbnQgdHlwZTsKIAljaGFyIG5hbWVbQ0FJRl9MQVlFUl9OQU1FX1NaXTsKIH07CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NhaWYvY2FpZl9zcGkuaCBiL2luY2x1ZGUvbmV0L2NhaWYvY2FpZl9zcGkuaAppbmRleCA4N2MzZDExLi5hYTZhNDg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jYWlmL2NhaWZfc3BpLmgKKysrIGIvaW5jbHVkZS9uZXQvY2FpZi9jYWlmX3NwaS5oCkBAIC01NSw4ICs1NSw4IEBACiBzdHJ1Y3QgY2ZzcGlfeGZlciB7CiAJdTE2IHR4X2RtYV9sZW47CiAJdTE2IHJ4X2RtYV9sZW47Ci0Jdm9pZCAqdmFfdHg7Ci0JZG1hX2FkZHJfdCBwYV90eDsKKwl2b2lkICp2YV90eFsyXTsKKwlkbWFfYWRkcl90IHBhX3R4WzJdOwogCXZvaWQgKnZhX3J4OwogCWRtYV9hZGRyX3QgcGFfcng7CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvY2FpZi9jZmNuZmcuaCBiL2luY2x1ZGUvbmV0L2NhaWYvY2ZjbmZnLmgKaW5kZXggM2U5M2E0YS4uOTBiNGZmOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvY2FpZi9jZmNuZmcuaAorKysgYi9pbmNsdWRlL25ldC9jYWlmL2NmY25mZy5oCkBAIC0xNCwxOCArMTQsNiBAQAogc3RydWN0IGNmY25mZzsKIAogLyoqCi0gKiBlbnVtIGNmY25mZ19waHlfdHlwZSAtICBUeXBlcyBvZiBwaHlzaWNhbCBsYXllcnMgZGVmaW5lZCBpbiBDQUlGIFN0YWNrCi0gKgotICogQENGUEhZVFlQRV9GUkFHOglGcmFnbWVudGVkIGZyYW1lcyBwaHlzaWNhbCBpbnRlcmZhY2UuCi0gKiBAQ0ZQSFlUWVBFX0NBSUY6CUdlbmVyaWMgQ0FJRiBwaHlzaWNhbCBpbnRlcmZhY2UKLSAqLwotZW51bSBjZmNuZmdfcGh5X3R5cGUgewotCUNGUEhZVFlQRV9GUkFHID0gMSwKLQlDRlBIWVRZUEVfQ0FJRiwKLQlDRlBIWVRZUEVfTUFYCi19OwotCi0vKioKICAqIGVudW0gY2ZjbmZnX3BoeV9wcmVmZXJlbmNlIC0gUGh5c2ljYWwgcHJlZmVyZW5jZSBIVyBBYnN0cmFjdGlvbgogICoKICAqIEBDRlBIWVBSRUZfVU5TUEVDSUZJRUQ6CURlZmF1bHQgcGh5c2ljYWwgaW50ZXJmYWNlCkBAIC02NiwyMSArNTQsMjAgQEAKICAqIGNmY25mZ19hZGRfcGh5X2xheWVyKCkgLSBBZGRzIGEgcGh5c2ljYWwgbGF5ZXIgdG8gdGhlIENBSUYgc3RhY2suCiAgKiBAY25mZzoJUG9pbnRlciB0byBhIENBSUYgY29uZmlndXJhdGlvbiBvYmplY3QsIGNyZWF0ZWQgYnkKICAqCQljZmNuZmdfY3JlYXRlKCkuCi0gKiBAcGh5X3R5cGU6CVNwZWNpZmllcyB0aGUgdHlwZSBvZiBwaHlzaWNhbCBpbnRlcmZhY2UsIGUuZy4KLSAqCQkJQ0ZQSFlUWVBFX0ZSQUcuCiAgKiBAZGV2OglQb2ludGVyIHRvIGxpbmsgbGF5ZXIgZGV2aWNlCiAgKiBAcGh5X2xheWVyOglTcGVjaWZ5IHRoZSBwaHlzaWNhbCBsYXllci4gVGhlIHRyYW5zbWl0IGZ1bmN0aW9uCiAgKgkJTVVTVCBiZSBzZXQgaW4gdGhlIHN0cnVjdHVyZS4KICAqIEBwcmVmOglUaGUgcGh5IChsaW5rIGxheWVyKSBwcmVmZXJlbmNlLgorICogQGxpbmtfc3VwcG9ydDogUHJvdG9jb2wgaW1wbGVtZW50YXRpb24gZm9yIGxpbmsgbGF5ZXIgc3BlY2lmaWMgcHJvdG9jb2wuCiAgKiBAZmNzOglTcGVjaWZ5IGlmIGNoZWNrc3VtIGlzIHVzZWQgaW4gQ0FJRiBGcmFtaW5nIExheWVyLgotICogQHN0eDoJU3BlY2lmeSBpZiBTdGFydCBPZiBGcmFtZSBlWHRlbnRpb24gaXMgdXNlZC4KKyAqIEBoZWFkX3Jvb206CUhlYWQgc3BhY2UgbmVlZGVkIGJ5IGxpbmsgc3BlY2lmaWMgcHJvdG9jb2wuCiAgKi8KLQogdm9pZAotY2ZjbmZnX2FkZF9waHlfbGF5ZXIoc3RydWN0IGNmY25mZyAqY25mZywgZW51bSBjZmNuZmdfcGh5X3R5cGUgcGh5X3R5cGUsCitjZmNuZmdfYWRkX3BoeV9sYXllcihzdHJ1Y3QgY2ZjbmZnICpjbmZnLAogCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBjZmxheWVyICpwaHlfbGF5ZXIsCiAJCSAgICAgZW51bSBjZmNuZmdfcGh5X3ByZWZlcmVuY2UgcHJlZiwKLQkJICAgICBib29sIGZjcywgYm9vbCBzdHgpOworCQkgICAgIHN0cnVjdCBjZmxheWVyICpsaW5rX3N1cHBvcnQsCisJCSAgICAgYm9vbCBmY3MsIGludCBoZWFkX3Jvb20pOwogCiAvKioKICAqIGNmY25mZ19kZWxfcGh5X2xheWVyIC0gRGVsZXRlcyBhbiBwaHkgbGF5ZXIgZnJvbSB0aGUgQ0FJRiBzdGFjay4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2NhaWYvY2ZzZXJsLmggYi9pbmNsdWRlL25ldC9jYWlmL2Nmc2VybC5oCmluZGV4IGI4Mzc0MzIuLmYxMjEyOTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2NhaWYvY2ZzZXJsLmgKKysrIGIvaW5jbHVkZS9uZXQvY2FpZi9jZnNlcmwuaApAQCAtOCw1ICs4LDUgQEAKICNkZWZpbmUgQ0ZTRVJMX0hfCiAjaW5jbHVkZSA8bmV0L2NhaWYvY2FpZl9sYXllci5oPgogCi1zdHJ1Y3QgY2ZsYXllciAqY2ZzZXJsX2NyZWF0ZShpbnQgdHlwZSwgaW50IGluc3RhbmNlLCBib29sIHVzZV9zdHgpOwotI2VuZGlmCQkJCS8qIENGU0VSTF9IXyAqLworc3RydWN0IGNmbGF5ZXIgKmNmc2VybF9jcmVhdGUoaW50IGluc3RhbmNlLCBib29sIHVzZV9zdHgpOworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oIGIvaW5jbHVkZS9uZXQvY2ZnODAyMTEuaAppbmRleCA5NTg1MmUzLi4xNWY0YmU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9jZmc4MDIxMS5oCisrKyBiL2luY2x1ZGUvbmV0L2NmZzgwMjExLmgKQEAgLTM5MSw2ICszOTEsOCBAQAogICogQGFzc29jcmVzcF9pZXM6IGV4dHJhIGluZm9ybWF0aW9uIGVsZW1lbnQocykgdG8gYWRkIGludG8gKFJlKUFzc29jaWF0aW9uCiAgKglSZXNwb25zZSBmcmFtZXMgb3IgJU5VTEwKICAqIEBhc3NvY3Jlc3BfaWVzX2xlbjogbGVuZ3RoIG9mIGFzc29jcmVzcF9pZXMgaW4gb2N0ZXRzCisgKiBAcHJvYmVfcmVzcF9sZW46IGxlbmd0aCBvZiBwcm9iZSByZXNwb25zZSB0ZW1wbGF0ZSAoQHByb2JlX3Jlc3ApCisgKiBAcHJvYmVfcmVzcDogcHJvYmUgcmVzcG9uc2UgdGVtcGxhdGUgKEFQIG1vZGUgb25seSkKICAqLwogc3RydWN0IGJlYWNvbl9wYXJhbWV0ZXJzIHsKIAl1OCAqaGVhZCwgKnRhaWw7CkBAIC00MDgsNiArNDEwLDggQEAKIAlzaXplX3QgcHJvYmVyZXNwX2llc19sZW47CiAJY29uc3QgdTggKmFzc29jcmVzcF9pZXM7CiAJc2l6ZV90IGFzc29jcmVzcF9pZXNfbGVuOworCWludCBwcm9iZV9yZXNwX2xlbjsKKwl1OCAqcHJvYmVfcmVzcDsKIH07CiAKIC8qKgpAQCAtNTAxLDYgKzUwNSw3IEBACiAgKiBAU1RBVElPTl9JTkZPX0NPTk5FQ1RFRF9USU1FOiBAY29ubmVjdGVkX3RpbWUgZmlsbGVkCiAgKiBAU1RBVElPTl9JTkZPX0FTU09DX1JFUV9JRVM6IEBhc3NvY19yZXFfaWVzIGZpbGxlZAogICogQFNUQVRJT05fSU5GT19TVEFfRkxBR1M6IEBzdGFfZmxhZ3MgZmlsbGVkCisgKiBAU1RBVElPTl9JTkZPX0JFQUNPTl9MT1NTX0NPVU5UOiBAYmVhY29uX2xvc3NfY291bnQgZmlsbGVkCiAgKi8KIGVudW0gc3RhdGlvbl9pbmZvX2ZsYWdzIHsKIAlTVEFUSU9OX0lORk9fSU5BQ1RJVkVfVElNRQk9IDE8PDAsCkBAIC01MjEsNyArNTI2LDggQEAKIAlTVEFUSU9OX0lORk9fQlNTX1BBUkFNICAgICAgICAgID0gMTw8MTUsCiAJU1RBVElPTl9JTkZPX0NPTk5FQ1RFRF9USU1FCT0gMTw8MTYsCiAJU1RBVElPTl9JTkZPX0FTU09DX1JFUV9JRVMJPSAxPDwxNywKLQlTVEFUSU9OX0lORk9fU1RBX0ZMQUdTCQk9IDE8PDE4CisJU1RBVElPTl9JTkZPX1NUQV9GTEFHUwkJPSAxPDwxOCwKKwlTVEFUSU9OX0lORk9fQkVBQ09OX0xPU1NfQ09VTlQJPSAxPDwxOQogfTsKIAogLyoqCkBAIC02MTksNiArNjI1LDcgQEAKICAqCXRoZSBjZmc4MDIxMV9uZXdfc3RhKCkgY2FsbHMgdG8gbm90aWZ5IHVzZXIgc3BhY2Ugb2YgdGhlIElFcy4KICAqIEBhc3NvY19yZXFfaWVzX2xlbjogTGVuZ3RoIG9mIGFzc29jX3JlcV9pZXMgYnVmZmVyIGluIG9jdGV0cy4KICAqIEBzdGFfZmxhZ3M6IHN0YXRpb24gZmxhZ3MgbWFzayAmIHZhbHVlcworICogQGJlYWNvbl9sb3NzX2NvdW50OiBOdW1iZXIgb2YgdGltZXMgYmVhY29uIGxvc3MgZXZlbnQgaGFzIHRyaWdnZXJlZC4KICAqLwogc3RydWN0IHN0YXRpb25faW5mbyB7CiAJdTMyIGZpbGxlZDsKQEAgLTY0Niw2ICs2NTMsOCBAQAogCWNvbnN0IHU4ICphc3NvY19yZXFfaWVzOwogCXNpemVfdCBhc3NvY19yZXFfaWVzX2xlbjsKIAorCXUzMiBiZWFjb25fbG9zc19jb3VudDsKKwogCS8qCiAJICogTm90ZTogQWRkIGEgbmV3IGVudW0gc3RhdGlvbl9pbmZvX2ZsYWdzIHZhbHVlIGZvciBlYWNoIG5ldyBmaWVsZCBhbmQKIAkgKiB1c2UgaXQgdG8gY2hlY2sgd2hpY2ggZmllbGRzIGFyZSBpbml0aWFsaXplZC4KQEAgLTc3OCw2ICs3ODcsNyBAQAogCXUxNiBtaW5fZGlzY292ZXJ5X3RpbWVvdXQ7CiAJdTMyIGRvdDExTWVzaEhXTVBhY3RpdmVQYXRoVGltZW91dDsKIAl1MTYgZG90MTFNZXNoSFdNUHByZXFNaW5JbnRlcnZhbDsKKwl1MTYgZG90MTFNZXNoSFdNUHBlcnJNaW5JbnRlcnZhbDsKIAl1MTYgZG90MTFNZXNoSFdNUG5ldERpYW1ldGVyVHJhdmVyc2FsVGltZTsKIAl1OCAgZG90MTFNZXNoSFdNUFJvb3RNb2RlOwogCXUxNiBkb3QxMU1lc2hIV01QUmFubkludGVydmFsOwpAQCAtNzk4LDYgKzgwOCw3IEBACiAgKiBAaWVfbGVuOiBsZW5ndGggb2YgdmVuZG9yIGluZm9ybWF0aW9uIGVsZW1lbnRzCiAgKiBAaXNfYXV0aGVudGljYXRlZDogdGhpcyBtZXNoIHJlcXVpcmVzIGF1dGhlbnRpY2F0aW9uCiAgKiBAaXNfc2VjdXJlOiB0aGlzIG1lc2ggdXNlcyBzZWN1cml0eQorICogQG1jYXN0X3JhdGU6IG11bHRpY2F0IHJhdGUgZm9yIE1lc2ggTm9kZSBbNk1icHMgaXMgdGhlIGRlZmF1bHQgZm9yIDgwMi4xMWFdCiAgKgogICogVGhlc2UgcGFyYW1ldGVycyBhcmUgZml4ZWQgd2hlbiB0aGUgbWVzaCBpcyBjcmVhdGVkLgogICovCkBAIC04MTAsNiArODIxLDcgQEAKIAl1OCBpZV9sZW47CiAJYm9vbCBpc19hdXRoZW50aWNhdGVkOwogCWJvb2wgaXNfc2VjdXJlOworCWludCBtY2FzdF9yYXRlW0lFRUU4MDIxMV9OVU1fQkFORFNdOwogfTsKIAogLyoqCkBAIC0xMDQwLDYgKzEwNTIsMTUgQEAKIH07CiAKIC8qKgorICogZW51bSBjZmc4MDIxMV9hc3NvY19yZXFfZmxhZ3MgLSBPdmVyLXJpZGUgZGVmYXVsdCBiZWhhdmlvdXIgaW4gYXNzb2NpYXRpb24uCisgKgorICogQEFTU09DX1JFUV9ESVNBQkxFX0hUOiAgRGlzYWJsZSBIVCAoODAyLjExbikKKyAqLworZW51bSBjZmc4MDIxMV9hc3NvY19yZXFfZmxhZ3MgeworCUFTU09DX1JFUV9ESVNBQkxFX0hUCQk9IEJJVCgwKSwKK307CisKKy8qKgogICogc3RydWN0IGNmZzgwMjExX2Fzc29jX3JlcXVlc3QgLSAoUmUpQXNzb2NpYXRpb24gcmVxdWVzdCBkYXRhCiAgKgogICogVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgaW5mb3JtYXRpb24gbmVlZGVkIHRvIGNvbXBsZXRlIElFRUUgODAyLjExCkBAIC0xMDUwLDYgKzEwNzEsMTAgQEAKICAqIEB1c2VfbWZwOiBVc2UgbWFuYWdlbWVudCBmcmFtZSBwcm90ZWN0aW9uIChJRUVFIDgwMi4xMXcpIGluIHRoaXMgYXNzb2NpYXRpb24KICAqIEBjcnlwdG86IGNyeXB0byBzZXR0aW5ncwogICogQHByZXZfYnNzaWQ6IHByZXZpb3VzIEJTU0lELCBpZiBub3QgJU5VTEwgdXNlIHJlYXNzb2NpYXRlIGZyYW1lCisgKiBAZmxhZ3M6ICBTZWUgJmVudW0gY2ZnODAyMTFfYXNzb2NfcmVxX2ZsYWdzCisgKiBAaHRfY2FwYTogIEhUIENhcGFiaWxpdGllcyBvdmVyLXJpZGVzLiAgVmFsdWVzIHNldCBpbiBodF9jYXBhX21hc2sKKyAqICAgd2lsbCBiZSB1c2VkIGluIGh0X2NhcGEuICBVbi1zdXBwb3J0ZWQgdmFsdWVzIHdpbGwgYmUgaWdub3JlZC4KKyAqIEBodF9jYXBhX21hc2s6ICBUaGUgYml0cyBvZiBodF9jYXBhIHdoaWNoIGFyZSB0byBiZSB1c2VkLgogICovCiBzdHJ1Y3QgY2ZnODAyMTFfYXNzb2NfcmVxdWVzdCB7CiAJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwpAQCAtMTA1Nyw2ICsxMDgyLDkgQEAKIAlzaXplX3QgaWVfbGVuOwogCXN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgY3J5cHRvOwogCWJvb2wgdXNlX21mcDsKKwl1MzIgZmxhZ3M7CisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwYTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXBhX21hc2s7CiB9OwogCiAvKioKQEAgLTExMjYsNiArMTE1NCw3IEBACiAJdTggKnNzaWQ7CiAJdTggKmJzc2lkOwogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbDsKKwllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZTsKIAl1OCAqaWU7CiAJdTggc3NpZF9sZW4sIGllX2xlbjsKIAl1MTYgYmVhY29uX2ludGVydmFsOwpAQCAtMTE1NSw2ICsxMTg0LDEwIEBACiAgKiBAa2V5X2xlbjogbGVuZ3RoIG9mIFdFUCBrZXkgZm9yIHNoYXJlZCBrZXkgYXV0aGVudGljYXRpb24KICAqIEBrZXlfaWR4OiBpbmRleCBvZiBXRVAga2V5IGZvciBzaGFyZWQga2V5IGF1dGhlbnRpY2F0aW9uCiAgKiBAa2V5OiBXRVAga2V5IGZvciBzaGFyZWQga2V5IGF1dGhlbnRpY2F0aW9uCisgKiBAZmxhZ3M6ICBTZWUgJmVudW0gY2ZnODAyMTFfYXNzb2NfcmVxX2ZsYWdzCisgKiBAaHRfY2FwYTogIEhUIENhcGFiaWxpdGllcyBvdmVyLXJpZGVzLiAgVmFsdWVzIHNldCBpbiBodF9jYXBhX21hc2sKKyAqICAgd2lsbCBiZSB1c2VkIGluIGh0X2NhcGEuICBVbi1zdXBwb3J0ZWQgdmFsdWVzIHdpbGwgYmUgaWdub3JlZC4KKyAqIEBodF9jYXBhX21hc2s6ICBUaGUgYml0cyBvZiBodF9jYXBhIHdoaWNoIGFyZSB0byBiZSB1c2VkLgogICovCiBzdHJ1Y3QgY2ZnODAyMTFfY29ubmVjdF9wYXJhbXMgewogCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbDsKQEAgLTExNjgsNiArMTIwMSw5IEBACiAJc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyBjcnlwdG87CiAJY29uc3QgdTggKmtleTsKIAl1OCBrZXlfbGVuLCBrZXlfaWR4OworCXUzMiBmbGFnczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBodF9jYXBhOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcGFfbWFzazsKIH07CiAKIC8qKgpAQCAtMTMxNSw3ICsxMzUxLDEyIEBACiAgKgogICogQGFkZF9zdGF0aW9uOiBBZGQgYSBuZXcgc3RhdGlvbi4KICAqIEBkZWxfc3RhdGlvbjogUmVtb3ZlIGEgc3RhdGlvbjsgQG1hYyBtYXkgYmUgTlVMTCB0byByZW1vdmUgYWxsIHN0YXRpb25zLgotICogQGNoYW5nZV9zdGF0aW9uOiBNb2RpZnkgYSBnaXZlbiBzdGF0aW9uLgorICogQGNoYW5nZV9zdGF0aW9uOiBNb2RpZnkgYSBnaXZlbiBzdGF0aW9uLiBOb3RlIHRoYXQgZmxhZ3MgY2hhbmdlcyBhcmUgbm90IG11Y2gKKyAqCXZhbGlkYXRlZCBpbiBjZmc4MDIxMSwgaW4gcGFydGljdWxhciB0aGUgYXV0aC9hc3NvYy9hdXRob3JpemVkIGZsYWdzCisgKgltaWdodCBjb21lIHRvIHRoZSBkcml2ZXIgaW4gaW52YWxpZCBjb21iaW5hdGlvbnMgLS0gbWFrZSBzdXJlIHRvIGNoZWNrCisgKgl0aGVtLCBhbHNvIGFnYWluc3QgdGhlIGV4aXN0aW5nIHN0YXRlISBBbHNvLCBzdXBwb3J0ZWRfcmF0ZXMgY2hhbmdlcyBhcmUKKyAqCW5vdCBjaGVja2VkIGluIHN0YXRpb24gbW9kZSAtLSBkcml2ZXJzIG5lZWQgdG8gcmVqZWN0IChvciBpZ25vcmUpIHRoZW0KKyAqCWZvciBhbnl0aGluZyBidXQgVERMUyBwZWVycy4KICAqIEBnZXRfc3RhdGlvbjogZ2V0IHN0YXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzdGF0aW9uIGlkZW50aWZpZWQgYnkgQG1hYwogICogQGR1bXBfc3RhdGlvbjogZHVtcCBzdGF0aW9uIGNhbGxiYWNrIC0tIHJlc3VtZSBkdW1wIGF0IGluZGV4IEBpZHgKICAqCkBAIC0xMzQyLDYgKzEzODMsOSBAQAogICoJZG9lc24ndCB2ZXJpZnkgbXVjaC4gTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgcGFzc2VkIG5ldGRldiBtYXkgYmUKICAqCSVOVUxMIGFzIHdlbGwgaWYgdGhlIHVzZXIgcmVxdWVzdGVkIGNoYW5naW5nIHRoZSBjaGFubmVsIGZvciB0aGUKICAqCWRldmljZSBpdHNlbGYsIG9yIGZvciBhIG1vbml0b3IgaW50ZXJmYWNlLgorICogQGdldF9jaGFubmVsOiBHZXQgdGhlIGN1cnJlbnQgb3BlcmF0aW5nIGNoYW5uZWwsIHNob3VsZCByZXR1cm4gJU5VTEwgaWYKKyAqCXRoZXJlJ3Mgbm8gc2luZ2xlIGRlZmluZWQgb3BlcmF0aW5nIGNoYW5uZWwgaWYgZm9yIGV4YW1wbGUgdGhlCisgKglkZXZpY2UgaW1wbGVtZW50cyBjaGFubmVsIGhvcHBpbmcgZm9yIG11bHRpLWNoYW5uZWwgdmlydHVhbCBpbnRlcmZhY2VzLgogICoKICAqIEBzY2FuOiBSZXF1ZXN0IHRvIGRvIGEgc2Nhbi4gSWYgcmV0dXJuaW5nIHplcm8sIHRoZSBzY2FuIHJlcXVlc3QgaXMgZ2l2ZW4KICAqCXRoZSBkcml2ZXIsIGFuZCB3aWxsIGJlIHZhbGlkIHVudGlsIHBhc3NlZCB0byBjZmc4MDIxMV9zY2FuX2RvbmUoKS4KQEAgLTEzNjksNyArMTQxMyw4IEBACiAgKgloYXZlIGNoYW5nZWQuIFRoZSBhY3R1YWwgcGFyYW1ldGVyIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGluCiAgKglzdHJ1Y3Qgd2lwaHkuIElmIHJldHVybmluZyBhbiBlcnJvciwgbm8gdmFsdWUgc2hvdWxkIGJlIGNoYW5nZWQuCiAgKgotICogQHNldF90eF9wb3dlcjogc2V0IHRoZSB0cmFuc21pdCBwb3dlciBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMKKyAqIEBzZXRfdHhfcG93ZXI6IHNldCB0aGUgdHJhbnNtaXQgcG93ZXIgYWNjb3JkaW5nIHRvIHRoZSBwYXJhbWV0ZXJzLAorICoJdGhlIHBvd2VyIHBhc3NlZCBpcyBpbiBtQm0sIHRvIGdldCBkQm0gdXNlIE1CTV9UT19EQk0oKS4KICAqIEBnZXRfdHhfcG93ZXI6IHN0b3JlIHRoZSBjdXJyZW50IFRYIHBvd2VyIGludG8gdGhlIGRibSB2YXJpYWJsZTsKICAqCXJldHVybiAwIGlmIHN1Y2Nlc3NmdWwKICAqCkBAIC0xNDMyLDYgKzE0NzcsMTEgQEAKICAqCiAgKiBAdGRsc19tZ210OiBUcmFuc21pdCBhIFRETFMgbWFuYWdlbWVudCBmcmFtZS4KICAqIEB0ZGxzX29wZXI6IFBlcmZvcm0gYSBoaWdoLWxldmVsIFRETFMgb3BlcmF0aW9uIChlLmcuIFRETFMgbGluayBzZXR1cCkuCisgKgorICogQHByb2JlX2NsaWVudDogcHJvYmUgYW4gYXNzb2NpYXRlZCBjbGllbnQsIG11c3QgcmV0dXJuIGEgY29va2llIHRoYXQgaXQKKyAqCWxhdGVyIHBhc3NlcyB0byBjZmc4MDIxMV9wcm9iZV9zdGF0dXMoKS4KKyAqCisgKiBAc2V0X25vYWNrX21hcDogU2V0IHRoZSBOb0FjayBNYXAgZm9yIHRoZSBUSURzLgogICovCiBzdHJ1Y3QgY2ZnODAyMTFfb3BzIHsKIAlpbnQJKCpzdXNwZW5kKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgY2ZnODAyMTFfd293bGFuICp3b3cpOwpAQCAtMTU4NSw3ICsxNjM1LDcgQEAKIAkJCSAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCiAJCQkgIGJvb2wgY2hhbm5lbF90eXBlX3ZhbGlkLCB1bnNpZ25lZCBpbnQgd2FpdCwKIAkJCSAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCBub19jY2ssCi0JCQkgIHU2NCAqY29va2llKTsKKwkJCSAgYm9vbCBkb250X3dhaXRfZm9yX2FjaywgdTY0ICpjb29raWUpOwogCWludAkoKm1nbXRfdHhfY2FuY2VsX3dhaXQpKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgICAgIHU2NCBjb29raWUpOwpAQCAtMTYyMSw2ICsxNjcxLDE1IEBACiAJCQkgICAgIHUxNiBzdGF0dXNfY29kZSwgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbik7CiAJaW50CSgqdGRsc19vcGVyKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJICAgICB1OCAqcGVlciwgZW51bSBubDgwMjExX3RkbHNfb3BlcmF0aW9uIG9wZXIpOworCisJaW50CSgqcHJvYmVfY2xpZW50KShzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCWNvbnN0IHU4ICpwZWVyLCB1NjQgKmNvb2tpZSk7CisKKwlpbnQJKCpzZXRfbm9hY2tfbWFwKShzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIHUxNiBub2Fja19tYXApOworCisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICooKmdldF9jaGFubmVsKShzdHJ1Y3Qgd2lwaHkgKndpcGh5KTsKIH07CiAKIC8qCkBAIC0xNjQ1LDcgKzE3MDQsOSBAQAogICoJcmVndWxhdG9yeSBkb21haW4gbm8gdXNlciByZWd1bGF0b3J5IGRvbWFpbiBjYW4gZW5hYmxlIHRoZXNlIGNoYW5uZWxzCiAgKglhdCBhIGxhdGVyIHRpbWUuIFRoaXMgY2FuIGJlIHVzZWQgZm9yIGRldmljZXMgd2hpY2ggZG8gbm90IGhhdmUKICAqCWNhbGlicmF0aW9uIGluZm9ybWF0aW9uIGd1YXJhbnRlZWQgZm9yIGZyZXF1ZW5jaWVzIG9yIHNldHRpbmdzCi0gKglvdXRzaWRlIG9mIGl0cyByZWd1bGF0b3J5IGRvbWFpbi4KKyAqCW91dHNpZGUgb2YgaXRzIHJlZ3VsYXRvcnkgZG9tYWluLiBJZiB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgKKyAqCVdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkgdGhlIGluc3BlY3RlZCBjb3VudHJ5IElFIHBvd2VyIHNldHRpbmdzCisgKgl3aWxsIGJlIGZvbGxvd2VkLgogICogQFdJUEhZX0ZMQUdfRElTQUJMRV9CRUFDT05fSElOVFM6IGVuYWJsZSB0aGlzIGlmIHlvdXIgZHJpdmVyIG5lZWRzIHRvIGVuc3VyZQogICoJdGhhdCBwYXNzaXZlIHNjYW4gZmxhZ3MgYW5kIGJlYWNvbmluZyBmbGFncyBtYXkgbm90IGJlIGxpZnRlZCBieQogICoJY2ZnODAyMTEgZHVlIHRvIHJlZ3VsYXRvcnkgYmVhY29uIGhpbnRzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBiZWFjb24KQEAgLTE2NzksNiArMTc0MCwxNCBAQAogICoJdGVhcmRvd24gcGFja2V0cyBzaG91bGQgYmUgc2VudCB0aHJvdWdoIHRoZSBATkw4MDIxMV9DTURfVERMU19NR01UCiAgKgljb21tYW5kLiBXaGVuIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCBATkw4MDIxMV9DTURfVERMU19PUEVSIHNob3VsZCBiZQogICoJdXNlZCBmb3IgYXNraW5nIHRoZSBkcml2ZXIvZmlybXdhcmUgdG8gcGVyZm9ybSBhIFRETFMgb3BlcmF0aW9uLgorICogQFdJUEhZX0ZMQUdfSEFWRV9BUF9TTUU6IGRldmljZSBpbnRlZ3JhdGVzIEFQIFNNRQorICogQFdJUEhZX0ZMQUdfUkVQT1JUU19PQlNTOiB0aGUgZGV2aWNlIHdpbGwgcmVwb3J0IGJlYWNvbnMgZnJvbSBvdGhlciBCU1NlcworICoJd2hlbiB0aGVyZSBhcmUgdmlydHVhbCBpbnRlcmZhY2VzIGluIEFQIG1vZGUgYnkgY2FsbGluZworICoJY2ZnODAyMTFfcmVwb3J0X29ic3NfYmVhY29uKCkuCisgKiBAV0lQSFlfRkxBR19BUF9QUk9CRV9SRVNQX09GRkxPQUQ6IFdoZW4gb3BlcmF0aW5nIGFzIGFuIEFQLCB0aGUgZGV2aWNlCisgKglyZXNwb25kcyB0byBwcm9iZS1yZXF1ZXN0cyBpbiBoYXJkd2FyZS4KKyAqIEBXSVBIWV9GTEFHX09GRkNIQU5fVFg6IERldmljZSBzdXBwb3J0cyBkaXJlY3Qgb2ZmLWNoYW5uZWwgVFguCisgKiBAV0lQSFlfRkxBR19IQVNfUkVNQUlOX09OX0NIQU5ORUw6IERldmljZSBzdXBwb3J0cyByZW1haW4tb24tY2hhbm5lbCBjYWxsLgogICovCiBlbnVtIHdpcGh5X2ZsYWdzIHsKIAlXSVBIWV9GTEFHX0NVU1RPTV9SRUdVTEFUT1JZCQk9IEJJVCgwKSwKQEAgLTE2OTcsNiArMTc2NiwxMSBAQAogCVdJUEhZX0ZMQUdfQVBfVUFQU0QJCQk9IEJJVCgxNCksCiAJV0lQSFlfRkxBR19TVVBQT1JUU19URExTCQk9IEJJVCgxNSksCiAJV0lQSFlfRkxBR19URExTX0VYVEVSTkFMX1NFVFVQCQk9IEJJVCgxNiksCisJV0lQSFlfRkxBR19IQVZFX0FQX1NNRQkJCT0gQklUKDE3KSwKKwlXSVBIWV9GTEFHX1JFUE9SVFNfT0JTUwkJCT0gQklUKDE4KSwKKwlXSVBIWV9GTEFHX0FQX1BST0JFX1JFU1BfT0ZGTE9BRAk9IEJJVCgxOSksCisJV0lQSFlfRkxBR19PRkZDSEFOX1RYCQkJPSBCSVQoMjApLAorCVdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMCT0gQklUKDIxKSwKIH07CiAKIC8qKgpAQCAtMTg2OSw2ICsxOTQzLDcgQEAKICAqIEBzb2Z0d2FyZV9pZnR5cGVzOiBiaXRtYXNrIG9mIHNvZnR3YXJlIGludGVyZmFjZSB0eXBlcywgdGhlc2UgYXJlIG5vdAogICoJc3ViamVjdCB0byBhbnkgcmVzdHJpY3Rpb25zIHNpbmNlIHRoZXkgYXJlIHB1cmVseSBtYW5hZ2VkIGluIFNXLgogICogQGZsYWdzOiB3aXBoeSBmbGFncywgc2VlICZlbnVtIHdpcGh5X2ZsYWdzCisgKiBAZmVhdHVyZXM6IGZlYXR1cmVzIGFkdmVydGlzZWQgdG8gbmw4MDIxMSwgc2VlICZlbnVtIG5sODAyMTFfZmVhdHVyZV9mbGFncy4KICAqIEBic3NfcHJpdl9zaXplOiBlYWNoIEJTUyBzdHJ1Y3QgaGFzIHByaXZhdGUgZGF0YSBhbGxvY2F0ZWQgd2l0aCBpdCwKICAqCXRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyBpdHMgc2l6ZQogICogQG1heF9zY2FuX3NzaWRzOiBtYXhpbXVtIG51bWJlciBvZiBTU0lEcyB0aGUgZGV2aWNlIGNhbiBzY2FuIGZvciBpbgpAQCAtMTkwNyw2ICsxOTgyLDEwIEBACiAgKgltYXkgcmVxdWVzdCwgaWYgaW1wbGVtZW50ZWQuCiAgKgogICogQHdvd2xhbjogV29XTEFOIHN1cHBvcnQgaW5mb3JtYXRpb24KKyAqCisgKiBAYXBfc21lX2NhcGE6IEFQIFNNRSBjYXBhYmlsaXRpZXMsIGZsYWdzIGZyb20gJmVudW0gbmw4MDIxMV9hcF9zbWVfZmVhdHVyZXMuCisgKiBAaHRfY2FwYV9tb2RfbWFzazogIFNwZWNpZnkgd2hhdCBodF9jYXAgdmFsdWVzIGNhbiBiZSBvdmVyLXJpZGRlbi4KKyAqCUlmIG51bGwsIHRoZW4gbm9uZSBjYW4gYmUgb3Zlci1yaWRkZW4uCiAgKi8KIHN0cnVjdCB3aXBoeSB7CiAJLyogYXNzaWduIHRoZXNlIGZpZWxkcyBiZWZvcmUgeW91IHJlZ2lzdGVyIHRoZSB3aXBoeSAqLwpAQCAtMTkyOCw3ICsyMDA3LDkgQEAKIAkvKiBTdXBwb3J0ZWQgaW50ZXJmYWNlIG1vZGVzLCBPUiB0b2dldGhlciBCSVQoTkw4MDIxMV9JRlRZUEVfLi4uKSAqLwogCXUxNiBpbnRlcmZhY2VfbW9kZXM7CiAKLQl1MzIgZmxhZ3M7CisJdTMyIGZsYWdzLCBmZWF0dXJlczsKKworCXUzMiBhcF9zbWVfY2FwYTsKIAogCWVudW0gY2ZnODAyMTFfc2lnbmFsX3R5cGUgc2lnbmFsX3R5cGU7CiAKQEAgLTE5NjAsNiArMjA0MSwxMyBAQAogCXUzMiBhdmFpbGFibGVfYW50ZW5uYXNfdHg7CiAJdTMyIGF2YWlsYWJsZV9hbnRlbm5hc19yeDsKIAorCS8qCisJICogQml0bWFwIG9mIHN1cHBvcnRlZCBwcm90b2NvbHMgZm9yIHByb2JlIHJlc3BvbnNlIG9mZmxvYWRpbmcKKwkgKiBzZWUgJmVudW0gbmw4MDIxMV9wcm9iZV9yZXNwX29mZmxvYWRfc3VwcG9ydF9hdHRyLiBPbmx5IHZhbGlkCisJICogd2hlbiB0aGUgd2lwaHkgZmxhZyBAV0lQSFlfRkxBR19BUF9QUk9CRV9SRVNQX09GRkxPQUQgaXMgc2V0LgorCSAqLworCXUzMiBwcm9iZV9yZXNwX29mZmxvYWQ7CisKIAkvKiBJZiBtdWx0aXBsZSB3aXBoeXMgYXJlIHJlZ2lzdGVyZWQgYW5kIHlvdSdyZSBoYW5kZWQgZS5nLgogCSAqIGEgcmVndWxhciBuZXRkZXYgd2l0aCBhc3NpZ25lZCBpZWVlODAyMTFfcHRyLCB5b3Ugd29uJ3QKIAkgKiBrbm93IHdoZXRoZXIgaXQgcG9pbnRzIHRvIGEgd2lwaHkgeW91ciBkcml2ZXIgaGFzIHJlZ2lzdGVyZWQKQEAgLTE5ODcsNiArMjA3NSw4IEBACiAJLyogZGlyIGluIGRlYnVnZnM6IGllZWU4MDIxMS88d2lwaHluYW1lPiAqLwogCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNkaXI7CiAKKwljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYV9tb2RfbWFzazsKKwogI2lmZGVmIENPTkZJR19ORVRfTlMKIAkvKiB0aGUgbmV0d29yayBuYW1lc3BhY2UgdGhpcyBwaHkgbGl2ZXMgaW4gY3VycmVudGx5ICovCiAJc3RydWN0IG5ldCAqX25ldDsKQEAgLTIxODMsNiArMjI3Myw4IEBACiAKIAlpbnQgYmVhY29uX2ludGVydmFsOwogCisJdTMyIGFwX3VuZXhwZWN0ZWRfbmxwaWQ7CisKICNpZmRlZiBDT05GSUdfQ0ZHODAyMTFfV0VYVAogCS8qIHdleHQgZGF0YSAqLwogCXN0cnVjdCB7CkBAIC0yMzQ5LDY5ICsyNDQxLDYgQEAKIGV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIHJmYzEwNDJfaGVhZGVyWzZdOwogZXh0ZXJuIGNvbnN0IHVuc2lnbmVkIGNoYXIgYnJpZGdlX3R1bm5lbF9oZWFkZXJbNl07CiAKLS8qIFBhcnNlZCBJbmZvcm1hdGlvbiBFbGVtZW50cyAqLwotc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgewotCXU4ICppZV9zdGFydDsKLQlzaXplX3QgdG90YWxfbGVuOwotCi0JLyogcG9pbnRlcnMgdG8gSUVzICovCi0JdTggKnNzaWQ7Ci0JdTggKnN1cHBfcmF0ZXM7Ci0JdTggKmZoX3BhcmFtczsKLQl1OCAqZHNfcGFyYW1zOwotCXU4ICpjZl9wYXJhbXM7Ci0Jc3RydWN0IGllZWU4MDIxMV90aW1faWUgKnRpbTsKLQl1OCAqaWJzc19wYXJhbXM7Ci0JdTggKmNoYWxsZW5nZTsKLQl1OCAqd3BhOwotCXU4ICpyc247Ci0JdTggKmVycF9pbmZvOwotCXU4ICpleHRfc3VwcF9yYXRlczsKLQl1OCAqd21tX2luZm87Ci0JdTggKndtbV9wYXJhbTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwX2VsZW07Ci0Jc3RydWN0IGllZWU4MDIxMV9odF9pbmZvICpodF9pbmZvX2VsZW07Ci0Jc3RydWN0IGllZWU4MDIxMV9tZXNoY29uZl9pZSAqbWVzaF9jb25maWc7Ci0JdTggKm1lc2hfaWQ7Ci0JdTggKnBlZXJpbmc7Ci0JdTggKnByZXE7Ci0JdTggKnByZXA7Ci0JdTggKnBlcnI7Ci0Jc3RydWN0IGllZWU4MDIxMV9yYW5uX2llICpyYW5uOwotCXU4ICpjaF9zd2l0Y2hfZWxlbTsKLQl1OCAqY291bnRyeV9lbGVtOwotCXU4ICpwd3JfY29uc3RyX2VsZW07Ci0JdTggKnF1aWV0X2VsZW07CS8qIGZpcnN0IHF1aXRlIGVsZW1lbnQgKi8KLQl1OCAqdGltZW91dF9pbnQ7Ci0KLQkvKiBsZW5ndGggb2YgdGhlbSwgcmVzcGVjdGl2ZWx5ICovCi0JdTggc3NpZF9sZW47Ci0JdTggc3VwcF9yYXRlc19sZW47Ci0JdTggZmhfcGFyYW1zX2xlbjsKLQl1OCBkc19wYXJhbXNfbGVuOwotCXU4IGNmX3BhcmFtc19sZW47Ci0JdTggdGltX2xlbjsKLQl1OCBpYnNzX3BhcmFtc19sZW47Ci0JdTggY2hhbGxlbmdlX2xlbjsKLQl1OCB3cGFfbGVuOwotCXU4IHJzbl9sZW47Ci0JdTggZXJwX2luZm9fbGVuOwotCXU4IGV4dF9zdXBwX3JhdGVzX2xlbjsKLQl1OCB3bW1faW5mb19sZW47Ci0JdTggd21tX3BhcmFtX2xlbjsKLQl1OCBtZXNoX2lkX2xlbjsKLQl1OCBwZWVyaW5nX2xlbjsKLQl1OCBwcmVxX2xlbjsKLQl1OCBwcmVwX2xlbjsKLQl1OCBwZXJyX2xlbjsKLQl1OCBjaF9zd2l0Y2hfZWxlbV9sZW47Ci0JdTggY291bnRyeV9lbGVtX2xlbjsKLQl1OCBwd3JfY29uc3RyX2VsZW1fbGVuOwotCXU4IHF1aWV0X2VsZW1fbGVuOwotCXU4IG51bV9vZl9xdWlldF9lbGVtOwkvKiBjYW4gYmUgbW9yZSB0aGUgb25lICovCi0JdTggdGltZW91dF9pbnRfbGVuOwotfTsKLQogLyoqCiAgKiBpZWVlODAyMTFfZ2V0X2hkcmxlbl9mcm9tX3NrYiAtIGdldCBoZWFkZXIgbGVuZ3RoIGZyb20gZGF0YQogICoKQEAgLTI2MzYsOCArMjY2NSwxMCBAQAogICoKICAqIFRoaXMgaW5mb3JtcyBjZmc4MDIxMSB0aGF0IEJTUyBpbmZvcm1hdGlvbiB3YXMgZm91bmQgYW5kCiAgKiB0aGUgQlNTIHNob3VsZCBiZSB1cGRhdGVkL2FkZGVkLgorICoKKyAqIE5PVEU6IFJldHVybnMgYSByZWZlcmVuY2VkIHN0cnVjdCwgbXVzdCBiZSByZWxlYXNlZCB3aXRoIGNmZzgwMjExX3B1dF9ic3MoKSEKICAqLwotc3RydWN0IGNmZzgwMjExX2JzcyoKK3N0cnVjdCBjZmc4MDIxMV9ic3MgKiBfX211c3RfY2hlY2sKIGNmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUoc3RydWN0IHdpcGh5ICp3aXBoeSwKIAkJCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAogCQkJICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsIHNpemVfdCBsZW4sCkBAIC0yNjU5LDggKzI2OTAsMTAgQEAKICAqCiAgKiBUaGlzIGluZm9ybXMgY2ZnODAyMTEgdGhhdCBCU1MgaW5mb3JtYXRpb24gd2FzIGZvdW5kIGFuZAogICogdGhlIEJTUyBzaG91bGQgYmUgdXBkYXRlZC9hZGRlZC4KKyAqCisgKiBOT1RFOiBSZXR1cm5zIGEgcmVmZXJlbmNlZCBzdHJ1Y3QsIG11c3QgYmUgcmVsZWFzZWQgd2l0aCBjZmc4MDIxMV9wdXRfYnNzKCkhCiAgKi8KLXN0cnVjdCBjZmc4MDIxMV9ic3MqCitzdHJ1Y3QgY2ZnODAyMTFfYnNzICogX19tdXN0X2NoZWNrCiBjZmc4MDIxMV9pbmZvcm1fYnNzKHN0cnVjdCB3aXBoeSAqd2lwaHksCiAJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCiAJCSAgICBjb25zdCB1OCAqYnNzaWQsCkBAIC0zMDQzLDYgKzMwNzYsMzIgQEAKIAkJICAgICBjb25zdCB1OCAqcmVzcF9pZSwgc2l6ZV90IHJlc3BfaWVfbGVuLCBnZnBfdCBnZnApOwogCiAvKioKKyAqIGNmZzgwMjExX3JvYW1lZF9ic3MgLSBub3RpZnkgY2ZnODAyMTEgb2Ygcm9hbWluZworICoKKyAqIEBkZXY6IG5ldHdvcmsgZGV2aWNlCisgKiBAYnNzOiBlbnRyeSBvZiBic3MgdG8gd2hpY2ggU1RBIGdvdCByb2FtZWQKKyAqIEByZXFfaWU6IGFzc29jaWF0aW9uIHJlcXVlc3QgSUVzIChtYXliZSBiZSAlTlVMTCkKKyAqIEByZXFfaWVfbGVuOiBhc3NvY2lhdGlvbiByZXF1ZXN0IElFcyBsZW5ndGgKKyAqIEByZXNwX2llOiBhc3NvY2lhdGlvbiByZXNwb25zZSBJRXMgKG1heSBiZSAlTlVMTCkKKyAqIEByZXNwX2llX2xlbjogYXNzb2MgcmVzcG9uc2UgSUVzIGxlbmd0aAorICogQGdmcDogYWxsb2NhdGlvbiBmbGFncworICoKKyAqIFRoaXMgaXMganVzdCBhIHdyYXBwZXIgdG8gbm90aWZ5IGNmZzgwMjExIG9mIHJvYW1pbmcgZXZlbnQgd2l0aCBkcml2ZXIKKyAqIHBhc3NpbmcgYnNzIHRvIGF2b2lkIGEgcmFjZSBpbiB0aW1lb3V0IG9mIHRoZSBic3MgZW50cnkuIEl0IHNob3VsZCBiZQorICogY2FsbGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGRyaXZlciB3aGVuZXZlciBpdCByb2FtZWQgZnJvbSBvbmUgQVAgdG8gYW5vdGhlcgorICogd2hpbGUgY29ubmVjdGVkLiBEcml2ZXJzIHdoaWNoIGhhdmUgcm9hbWluZyBpbXBsZW1lbnRlZCBpbiBmaXJtd2FyZQorICogbWF5IHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGF2b2lkIGEgcmFjZSBpbiBic3MgZW50cnkgdGltZW91dCB3aGVyZSB0aGUgYnNzCisgKiBlbnRyeSBvZiB0aGUgbmV3IEFQIGlzIHNlZW4gaW4gdGhlIGRyaXZlciwgYnV0IGdldHMgdGltZWQgb3V0IGJ5IHRoZSB0aW1lCisgKiBpdCBpcyBhY2Nlc3NlZCBpbiBfX2NmZzgwMjExX3JvYW1lZCgpIGR1ZSB0byBkZWxheSBpbiBzY2hlZHVsaW5nCisgKiByZGV2LT5ldmVudF93b3JrLiBJbiBjYXNlIG9mIGFueSBmYWlsdXJlcywgdGhlIHJlZmVyZW5jZSBpcyByZWxlYXNlZAorICogZWl0aGVyIGluIGNmZzgwMjExX3JvYW1lZF9ic3MoKSBvciBpbiBfX2NmZzgwMjExX3JvbWVkKCksIE90aGVyd2lzZSwKKyAqIGl0IHdpbGwgYmUgcmVsZWFzZWQgd2hpbGUgZGljb25uZXRpbmcgZnJvbSB0aGUgY3VycmVudCBic3MuCisgKi8KK3ZvaWQgY2ZnODAyMTFfcm9hbWVkX2JzcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MsCisJCQkgY29uc3QgdTggKnJlcV9pZSwgc2l6ZV90IHJlcV9pZV9sZW4sCisJCQkgY29uc3QgdTggKnJlc3BfaWUsIHNpemVfdCByZXNwX2llX2xlbiwgZ2ZwX3QgZ2ZwKTsKKworLyoqCiAgKiBjZmc4MDIxMV9kaXNjb25uZWN0ZWQgLSBub3RpZnkgY2ZnODAyMTEgdGhhdCBjb25uZWN0aW9uIHdhcyBkcm9wcGVkCiAgKgogICogQGRldjogbmV0d29yayBkZXZpY2UKQEAgLTMxODksNiArMzI0OCw3NCBAQAogdm9pZCBjZmc4MDIxMV9wbWtzYV9jYW5kaWRhdGVfbm90aWZ5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBpbmRleCwKIAkJCQkgICAgIGNvbnN0IHU4ICpic3NpZCwgYm9vbCBwcmVhdXRoLCBnZnBfdCBnZnApOwogCisvKioKKyAqIGNmZzgwMjExX3J4X3NwdXJpb3VzX2ZyYW1lIC0gaW5mb3JtIHVzZXJzcGFjZSBhYm91dCBhIHNwdXJpb3VzIGZyYW1lCisgKiBAZGV2OiBUaGUgZGV2aWNlIHRoZSBmcmFtZSBtYXRjaGVkIHRvCisgKiBAYWRkcjogdGhlIHRyYW5zbWl0dGVyIGFkZHJlc3MKKyAqIEBnZnA6IGNvbnRleHQgZmxhZ3MKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gQVAgbW9kZSAob25seSEpIHRvIGluZm9ybSB1c2Vyc3BhY2UgdGhhdAorICogYSBzcHVyaW91cyBjbGFzcyAzIGZyYW1lIHdhcyByZWNlaXZlZCwgdG8gYmUgYWJsZSB0byBkZWF1dGggdGhlCisgKiBzZW5kZXIuCisgKiBSZXR1cm5zICV0cnVlIGlmIHRoZSBmcmFtZSB3YXMgcGFzc2VkIHRvIHVzZXJzcGFjZSAob3IgdGhpcyBmYWlsZWQKKyAqIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIG5vdCBoYXZpbmcgYSBzdWJzY3JpcHRpb24uKQorICovCitib29sIGNmZzgwMjExX3J4X3NwdXJpb3VzX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJY29uc3QgdTggKmFkZHIsIGdmcF90IGdmcCk7CisKKy8qKgorICogY2ZnODAyMTFfcnhfdW5leHBlY3RlZF80YWRkcl9mcmFtZSAtIGluZm9ybSBhYm91dCB1bmV4cGVjdGVkIFdEUyBmcmFtZQorICogQGRldjogVGhlIGRldmljZSB0aGUgZnJhbWUgbWF0Y2hlZCB0bworICogQGFkZHI6IHRoZSB0cmFuc21pdHRlciBhZGRyZXNzCisgKiBAZ2ZwOiBjb250ZXh0IGZsYWdzCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGluIEFQIG1vZGUgKG9ubHkhKSB0byBpbmZvcm0gdXNlcnNwYWNlIHRoYXQKKyAqIGFuIGFzc29jaWF0ZWQgc3RhdGlvbiBzZW50IGEgNGFkZHIgZnJhbWUgYnV0IHRoYXQgd2Fzbid0IGV4cGVjdGVkLgorICogSXQgaXMgYWxsb3dlZCBhbmQgZGVzaXJhYmxlIHRvIHNlbmQgdGhpcyBldmVudCBvbmx5IG9uY2UgZm9yIGVhY2gKKyAqIHN0YXRpb24gdG8gYXZvaWQgZXZlbnQgZmxvb2RpbmcuCisgKiBSZXR1cm5zICV0cnVlIGlmIHRoZSBmcmFtZSB3YXMgcGFzc2VkIHRvIHVzZXJzcGFjZSAob3IgdGhpcyBmYWlsZWQKKyAqIGZvciBhIHJlYXNvbiBvdGhlciB0aGFuIG5vdCBoYXZpbmcgYSBzdWJzY3JpcHRpb24uKQorICovCitib29sIGNmZzgwMjExX3J4X3VuZXhwZWN0ZWRfNGFkZHJfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkJY29uc3QgdTggKmFkZHIsIGdmcF90IGdmcCk7CisKKy8qKgorICogY2ZnODAyMTFfcHJvYmVfc3RhdHVzIC0gbm90aWZ5IHVzZXJzcGFjZSBhYm91dCBwcm9iZSBzdGF0dXMKKyAqIEBkZXY6IHRoZSBkZXZpY2UgdGhlIHByb2JlIHdhcyBzZW50IG9uCisgKiBAYWRkcjogdGhlIGFkZHJlc3Mgb2YgdGhlIHBlZXIKKyAqIEBjb29raWU6IHRoZSBjb29raWUgZmlsbGVkIGluIEBwcm9iZV9jbGllbnQgcHJldmlvdXNseQorICogQGFja2VkOiBpbmRpY2F0ZXMgd2hldGhlciBwcm9iZSB3YXMgYWNrZWQgb3Igbm90CisgKiBAZ2ZwOiBhbGxvY2F0aW9uIGZsYWdzCisgKi8KK3ZvaWQgY2ZnODAyMTFfcHJvYmVfc3RhdHVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICphZGRyLAorCQkJICAgdTY0IGNvb2tpZSwgYm9vbCBhY2tlZCwgZ2ZwX3QgZ2ZwKTsKKworLyoqCisgKiBjZmc4MDIxMV9yZXBvcnRfb2Jzc19iZWFjb24gLSByZXBvcnQgYmVhY29uIGZyb20gb3RoZXIgQVBzCisgKiBAd2lwaHk6IFRoZSB3aXBoeSB0aGF0IHJlY2VpdmVkIHRoZSBiZWFjb24KKyAqIEBmcmFtZTogdGhlIGZyYW1lCisgKiBAbGVuOiBsZW5ndGggb2YgdGhlIGZyYW1lCisgKiBAZnJlcTogZnJlcXVlbmN5IHRoZSBmcmFtZSB3YXMgcmVjZWl2ZWQgb24KKyAqIEBnZnA6IGFsbG9jYXRpb24gZmxhZ3MKKyAqCisgKiBVc2UgdGhpcyBmdW5jdGlvbiB0byByZXBvcnQgdG8gdXNlcnNwYWNlIHdoZW4gYSBiZWFjb24gd2FzCisgKiByZWNlaXZlZC4gSXQgaXMgbm90IHVzZWZ1bCB0byBjYWxsIHRoaXMgd2hlbiB0aGVyZSBpcyBubworICogbmV0ZGV2IHRoYXQgaXMgaW4gQVAvR08gbW9kZS4KKyAqLwordm9pZCBjZmc4MDIxMV9yZXBvcnRfb2Jzc19iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgY29uc3QgdTggKmZyYW1lLCBzaXplX3QgbGVuLAorCQkJCSBpbnQgZnJlcSwgZ2ZwX3QgZ2ZwKTsKKworLyoKKyAqIGNmZzgwMjExX2Nhbl9iZWFjb25fc2VjX2NoYW4gLSB0ZXN0IGlmIGh0NDAgb24gZXh0ZW5zaW9uIGNoYW5uZWwgY2FuIGJlIHVzZWQKKyAqIEB3aXBoeTogdGhlIHdpcGh5CisgKiBAY2hhbjogbWFpbiBjaGFubmVsCisgKiBAY2hhbm5lbF90eXBlOiBIVCBtb2RlCisgKi8KK2ludCBjZmc4MDIxMV9jYW5fYmVhY29uX3NlY19jaGFuKHN0cnVjdCB3aXBoeSAqd2lwaHksCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbiwKKwkJCQkgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUpOworCiAvKiBMb2dnaW5nLCBkZWJ1Z2dpbmcgYW5kIHRyb3VibGVzaG9vdGluZy9kaWFnbm9zdGljIGhlbHBlcnMuICovCiAKIC8qIHdpcGh5X3ByaW50ayBoZWxwZXJzLCBzaW1pbGFyIHRvIGRldl9wcmludGsgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RzYS5oIGIvaW5jbHVkZS9uZXQvZHNhLmgKaW5kZXggODM5Zjc2OC4uNzgyOGViZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZHNhLmgKKysrIGIvaW5jbHVkZS9uZXQvZHNhLmgKQEAgLTExLDYgKzExLDExIEBACiAjaWZuZGVmIF9fTElOVVhfTkVUX0RTQV9ICiAjZGVmaW5lIF9fTElOVVhfTkVUX0RTQV9ICiAKKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCiAjZGVmaW5lIERTQV9NQVhfU1dJVENIRVMJNAogI2RlZmluZSBEU0FfTUFYX1BPUlRTCQkxMgogCkBAIC01NCw4ICs1OSwxNDMgQEAKIAlzdHJ1Y3QgZHNhX2NoaXBfZGF0YQkqY2hpcDsKIH07CiAKLWV4dGVybiBib29sIGRzYV91c2VzX2RzYV90YWdzKHZvaWQgKmRzYV9wdHIpOwotZXh0ZXJuIGJvb2wgZHNhX3VzZXNfdHJhaWxlcl90YWdzKHZvaWQgKmRzYV9wdHIpOworc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSB7CisJLyoKKwkgKiBDb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoZSBwbGF0Zm9ybSBkZXZpY2UgdGhhdCBvd25zCisJICogdGhpcyBkc2Egc3dpdGNoIHRyZWUgaW5zdGFuY2UuCisJICovCisJc3RydWN0IGRzYV9wbGF0Zm9ybV9kYXRhCSpwZDsKIAorCS8qCisJICogUmVmZXJlbmNlIHRvIG5ldHdvcmsgZGV2aWNlIHRvIHVzZSwgYW5kIHdoaWNoIHRhZ2dpbmcKKwkgKiBwcm90b2NvbCB0byB1c2UuCisJICovCisJc3RydWN0IG5ldF9kZXZpY2UJKm1hc3Rlcl9uZXRkZXY7CisJX19iZTE2CQkJdGFnX3Byb3RvY29sOworCisJLyoKKwkgKiBUaGUgc3dpdGNoIGFuZCBwb3J0IHRvIHdoaWNoIHRoZSBDUFUgaXMgYXR0YWNoZWQuCisJICovCisJczgJCQljcHVfc3dpdGNoOworCXM4CQkJY3B1X3BvcnQ7CisKKwkvKgorCSAqIExpbmsgc3RhdGUgcG9sbGluZy4KKwkgKi8KKwlpbnQJCQlsaW5rX3BvbGxfbmVlZGVkOworCXN0cnVjdCB3b3JrX3N0cnVjdAlsaW5rX3BvbGxfd29yazsKKwlzdHJ1Y3QgdGltZXJfbGlzdAlsaW5rX3BvbGxfdGltZXI7CisKKwkvKgorCSAqIERhdGEgZm9yIHRoZSBpbmRpdmlkdWFsIHN3aXRjaCBjaGlwcy4KKwkgKi8KKwlzdHJ1Y3QgZHNhX3N3aXRjaAkqZHNbRFNBX01BWF9TV0lUQ0hFU107Cit9OworCitzdHJ1Y3QgZHNhX3N3aXRjaCB7CisJLyoKKwkgKiBQYXJlbnQgc3dpdGNoIHRyZWUsIGFuZCBzd2l0Y2ggaW5kZXguCisJICovCisJc3RydWN0IGRzYV9zd2l0Y2hfdHJlZQkqZHN0OworCWludAkJCWluZGV4OworCisJLyoKKwkgKiBDb25maWd1cmF0aW9uIGRhdGEgZm9yIHRoaXMgc3dpdGNoLgorCSAqLworCXN0cnVjdCBkc2FfY2hpcF9kYXRhCSpwZDsKKworCS8qCisJICogVGhlIHVzZWQgc3dpdGNoIGRyaXZlci4KKwkgKi8KKwlzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIJKmRydjsKKworCS8qCisJICogUmVmZXJlbmNlIHRvIG1paSBidXMgdG8gdXNlLgorCSAqLworCXN0cnVjdCBtaWlfYnVzCQkqbWFzdGVyX21paV9idXM7CisKKwkvKgorCSAqIFNsYXZlIG1paV9idXMgYW5kIGRldmljZXMgZm9yIHRoZSBpbmRpdmlkdWFsIHBvcnRzLgorCSAqLworCXUzMgkJCWRzYV9wb3J0X21hc2s7CisJdTMyCQkJcGh5c19wb3J0X21hc2s7CisJc3RydWN0IG1paV9idXMJCSpzbGF2ZV9taWlfYnVzOworCXN0cnVjdCBuZXRfZGV2aWNlCSpwb3J0c1tEU0FfTUFYX1BPUlRTXTsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBkc2FfaXNfY3B1X3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcCkKK3sKKwlyZXR1cm4gISEoZHMtPmluZGV4ID09IGRzLT5kc3QtPmNwdV9zd2l0Y2ggJiYgcCA9PSBkcy0+ZHN0LT5jcHVfcG9ydCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTggZHNhX3Vwc3RyZWFtX3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQoreworCXN0cnVjdCBkc2Ffc3dpdGNoX3RyZWUgKmRzdCA9IGRzLT5kc3Q7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgdGhlIHJvb3Qgc3dpdGNoIChpLmUuIHRoZSBzd2l0Y2ggdGhhdCBjb25uZWN0cworCSAqIHRvIHRoZSBDUFUpLCByZXR1cm4gdGhlIGNwdSBwb3J0IG51bWJlciBvbiB0aGlzIHN3aXRjaC4KKwkgKiBFbHNlIHJldHVybiB0aGUgKERTQSkgcG9ydCBudW1iZXIgdGhhdCBjb25uZWN0cyB0byB0aGUKKwkgKiBzd2l0Y2ggdGhhdCBpcyBvbmUgaG9wIGNsb3NlciB0byB0aGUgY3B1LgorCSAqLworCWlmIChkc3QtPmNwdV9zd2l0Y2ggPT0gZHMtPmluZGV4KQorCQlyZXR1cm4gZHN0LT5jcHVfcG9ydDsKKwllbHNlCisJCXJldHVybiBkcy0+cGQtPnJ0YWJsZVtkc3QtPmNwdV9zd2l0Y2hdOworfQorCitzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgeworCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKworCV9fYmUxNgkJCXRhZ19wcm90b2NvbDsKKwlpbnQJCQlwcml2X3NpemU7CisKKwkvKgorCSAqIFByb2JpbmcgYW5kIHNldHVwLgorCSAqLworCWNoYXIJKigqcHJvYmUpKHN0cnVjdCBtaWlfYnVzICpidXMsIGludCBzd19hZGRyKTsKKwlpbnQJKCpzZXR1cCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKKwlpbnQJKCpzZXRfYWRkcikoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCB1OCAqYWRkcik7CisKKwkvKgorCSAqIEFjY2VzcyB0byB0aGUgc3dpdGNoJ3MgUEhZIHJlZ2lzdGVycy4KKwkgKi8KKwlpbnQJKCpwaHlfcmVhZCkoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgaW50IHJlZ251bSk7CisJaW50CSgqcGh5X3dyaXRlKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LAorCQkJICAgICBpbnQgcmVnbnVtLCB1MTYgdmFsKTsKKworCS8qCisJICogTGluayBzdGF0ZSBwb2xsaW5nIGFuZCBJUlEgaGFuZGxpbmcuCisJICovCisJdm9pZAkoKnBvbGxfbGluaykoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKTsKKworCS8qCisJICogZXRodG9vbCBoYXJkd2FyZSBzdGF0aXN0aWNzLgorCSAqLworCXZvaWQJKCpnZXRfc3RyaW5ncykoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcG9ydCwgdWludDhfdCAqZGF0YSk7CisJdm9pZAkoKmdldF9ldGh0b29sX3N0YXRzKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsCisJCQkJICAgICBpbnQgcG9ydCwgdWludDY0X3QgKmRhdGEpOworCWludAkoKmdldF9zc2V0X2NvdW50KShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOworfTsKKwordm9pZCByZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqdHlwZSk7Cit2b2lkIHVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcihzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKnR5cGUpOworCisvKgorICogVGhlIG9yaWdpbmFsIERTQSB0YWcgZm9ybWF0IGFuZCBzb21lIG90aGVyIHRhZyBmb3JtYXRzIGhhdmUgbm8KKyAqIGV0aGVydHlwZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGFkZCBhIGxpdHRsZSBoYWNrIHRvIHRoZQorICogbmV0d29ya2luZyByZWNlaXZlIHBhdGggdG8gbWFrZSBzdXJlIHRoYXQgcmVjZWl2ZWQgZnJhbWVzIGdldAorICogdGhlIHJpZ2h0IC0+cHJvdG9jb2wgYXNzaWduZWQgdG8gdGhlbSB3aGVuIG9uZSBvZiB0aG9zZSB0YWcKKyAqIGZvcm1hdHMgaXMgaW4gdXNlLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgZHNhX3VzZXNfZHNhX3RhZ3Moc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0KQoreworCXJldHVybiAhIShkc3QtPnRhZ19wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9EU0EpKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGRzYV91c2VzX3RyYWlsZXJfdGFncyhzdHJ1Y3QgZHNhX3N3aXRjaF90cmVlICpkc3QpCit7CisJcmV0dXJuICEhKGRzdC0+dGFnX3Byb3RvY29sID09IGh0b25zKEVUSF9QX1RSQUlMRVIpKTsKK30KIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9kc3QuaCBiL2luY2x1ZGUvbmV0L2RzdC5oCmluZGV4IDRmYjZjNDMuLjM0NGM4ZGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2RzdC5oCisrKyBiL2luY2x1ZGUvbmV0L2RzdC5oCkBAIC01Myw2ICs1Myw3IEBACiAjZGVmaW5lIERTVF9OT0hBU0gJCTB4MDAwOAogI2RlZmluZSBEU1RfTk9DQUNIRQkJMHgwMDEwCiAjZGVmaW5lIERTVF9OT0NPVU5UCQkweDAwMjAKKyNkZWZpbmUgRFNUX05PUEVFUgkJMHgwMDQwCiAKIAlzaG9ydAkJCWVycm9yOwogCXNob3J0CQkJb2Jzb2xldGU7CkBAIC04NiwxMiArODcsMTIgQEAKIAl9OwogfTsKIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgbmVpZ2hib3VyICpkc3RfZ2V0X25laWdoYm91cihzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCitzdGF0aWMgaW5saW5lIHN0cnVjdCBuZWlnaGJvdXIgKmRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKIAlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlKGRzdC0+X25laWdoYm91cik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IG5laWdoYm91ciAqZHN0X2dldF9uZWlnaGJvdXJfcmF3KHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5laWdoYm91ciAqZHN0X2dldF9uZWlnaGJvdXJfbm9yZWZfcmF3KHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKIAlyZXR1cm4gcmN1X2RlcmVmZXJlbmNlX3Jhdyhkc3QtPl9uZWlnaGJvdXIpOwogfQpAQCAtMjA1LDEyICsyMDYsNyBAQAogCiBzdGF0aWMgaW5saW5lIHUzMiBkc3RfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKLQl1MzIgbXR1ID0gZHN0X21ldHJpY19yYXcoZHN0LCBSVEFYX01UVSk7Ci0KLQlpZiAoIW10dSkKLQkJbXR1ID0gZHN0LT5vcHMtPmRlZmF1bHRfbXR1KGRzdCk7Ci0KLQlyZXR1cm4gbXR1OworCXJldHVybiBkc3QtPm9wcy0+bXR1KGRzdCk7CiB9CiAKIC8qIFJUVCBtZXRyaWNzIGFyZSBzdG9yZWQgaW4gbWlsbGlzZWNvbmRzIGZvciB1c2VyIEFCSSwgYnV0IHVzZWQgYXMgamlmZmllcyAqLwpAQCAtMzk3LDcgKzM5Myw3IEBACiAJCXN0cnVjdCBuZWlnaGJvdXIgKm47CiAKIAkJcmN1X3JlYWRfbG9jaygpOwotCQluID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwkJbiA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKGRzdCk7CiAJCW5laWdoX2NvbmZpcm0obik7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2RzdF9vcHMuaCBiL2luY2x1ZGUvbmV0L2RzdF9vcHMuaAppbmRleCA5YWRiOTk4Li5lMWMyZWUwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9kc3Rfb3BzLmgKKysrIGIvaW5jbHVkZS9uZXQvZHN0X29wcy5oCkBAIC0xNyw3ICsxNyw3IEBACiAJaW50CQkJKCpnYykoc3RydWN0IGRzdF9vcHMgKm9wcyk7CiAJc3RydWN0IGRzdF9lbnRyeSAqCSgqY2hlY2spKHN0cnVjdCBkc3RfZW50cnkgKiwgX191MzIgY29va2llKTsKIAl1bnNpZ25lZCBpbnQJCSgqZGVmYXVsdF9hZHZtc3MpKGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKik7Ci0JdW5zaWduZWQgaW50CQkoKmRlZmF1bHRfbXR1KShjb25zdCBzdHJ1Y3QgZHN0X2VudHJ5ICopOworCXVuc2lnbmVkIGludAkJKCptdHUpKGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKik7CiAJdTMyICoJCQkoKmNvd19tZXRyaWNzKShzdHJ1Y3QgZHN0X2VudHJ5ICosIHVuc2lnbmVkIGxvbmcpOwogCXZvaWQJCQkoKmRlc3Ryb3kpKHN0cnVjdCBkc3RfZW50cnkgKik7CiAJdm9pZAkJCSgqaWZkb3duKShzdHJ1Y3QgZHN0X2VudHJ5ICosCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9mbG93LmggYi9pbmNsdWRlL25ldC9mbG93LmgKaW5kZXggYTA5NDQ3Ny4uZGExZjA2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZmxvdy5oCisrKyBiL2luY2x1ZGUvbmV0L2Zsb3cuaApAQCAtNTksOCArNTksMTEgQEAKICNkZWZpbmUgZmxvd2k0X3Byb3RvCQlfX2ZsX2NvbW1vbi5mbG93aWNfcHJvdG8KICNkZWZpbmUgZmxvd2k0X2ZsYWdzCQlfX2ZsX2NvbW1vbi5mbG93aWNfZmxhZ3MKICNkZWZpbmUgZmxvd2k0X3NlY2lkCQlfX2ZsX2NvbW1vbi5mbG93aWNfc2VjaWQKLQlfX2JlMzIJCQlkYWRkcjsKKworCS8qIChzYWRkcixkYWRkcikgbXVzdCBiZSBncm91cGVkLCBzYW1lIG9yZGVyIGFzIGluIElQIGhlYWRlciAqLwogCV9fYmUzMgkJCXNhZGRyOworCV9fYmUzMgkJCWRhZGRyOworCiAJdW5pb24gZmxvd2lfdWxpCQl1bGk7CiAjZGVmaW5lIGZsNF9zcG9ydAkJdWxpLnBvcnRzLnNwb3J0CiAjZGVmaW5lIGZsNF9kcG9ydAkJdWxpLnBvcnRzLmRwb3J0CkBAIC0yMDcsNiArMjEwLDcgQEAKIAkJdTggZGlyLCBmbG93X3Jlc29sdmVfdCByZXNvbHZlciwgdm9pZCAqY3R4KTsKIAogZXh0ZXJuIHZvaWQgZmxvd19jYWNoZV9mbHVzaCh2b2lkKTsKK2V4dGVybiB2b2lkIGZsb3dfY2FjaGVfZmx1c2hfZGVmZXJyZWQodm9pZCk7CiBleHRlcm4gYXRvbWljX3QgZmxvd19jYWNoZV9nZW5pZDsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9mbG93X2tleXMuaCBiL2luY2x1ZGUvbmV0L2Zsb3dfa2V5cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNDYxYzEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL25ldC9mbG93X2tleXMuaApAQCAtMCwwICsxLDE2IEBACisjaWZuZGVmIF9ORVRfRkxPV19LRVlTX0gKKyNkZWZpbmUgX05FVF9GTE9XX0tFWVNfSAorCitzdHJ1Y3QgZmxvd19rZXlzIHsKKwkvKiAoc3JjLGRzdCkgbXVzdCBiZSBncm91cGVkLCBpbiB0aGUgc2FtZSB3YXkgdGhhbiBpbiBJUCBoZWFkZXIgKi8KKwlfX2JlMzIgc3JjOworCV9fYmUzMiBkc3Q7CisJdW5pb24geworCQlfX2JlMzIgcG9ydHM7CisJCV9fYmUxNiBwb3J0MTZbMl07CisJfTsKKwl1OCBpcF9wcm90bzsKK307CisKK2V4dGVybiBib29sIHNrYl9mbG93X2Rpc3NlY3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dfa2V5cyAqZmxvdyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2dlbmV0bGluay5oIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKaW5kZXggODJkOGQwOS4uN2RiMzI5OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKKysrIGIvaW5jbHVkZS9uZXQvZ2VuZXRsaW5rLmgKQEAgLTEyOCw2ICsxMjgsOCBAQAogCQkJCSAgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwICpncnApOwogZXh0ZXJuIHZvaWQgZ2VubF91bnJlZ2lzdGVyX21jX2dyb3VwKHN0cnVjdCBnZW5sX2ZhbWlseSAqZmFtaWx5LAogCQkJCSAgICAgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwICpncnApOworZXh0ZXJuIHZvaWQgZ2VubF9ub3RpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldCAqbmV0LCB1MzIgcGlkLAorCQkJdTMyIGdyb3VwLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgZ2ZwX3QgZmxhZ3MpOwogCiAvKioKICAqIGdlbmxtc2dfcHV0IC0gQWRkIGdlbmVyaWMgbmV0bGluayBoZWFkZXIgdG8gbmV0bGluayBtZXNzYWdlCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pY21wLmggYi9pbmNsdWRlL25ldC9pY21wLmgKaW5kZXggZjA2OThiOS4uNzVkNjE1NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWNtcC5oCisrKyBiL2luY2x1ZGUvbmV0L2ljbXAuaApAQCAtMzEsOCArMzEsOCBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpY21wX2VyciBpY21wX2Vycl9jb252ZXJ0W107CiAjZGVmaW5lIElDTVBfSU5DX1NUQVRTKG5ldCwgZmllbGQpCVNOTVBfSU5DX1NUQVRTKChuZXQpLT5taWIuaWNtcF9zdGF0aXN0aWNzLCBmaWVsZCkKICNkZWZpbmUgSUNNUF9JTkNfU1RBVFNfQkgobmV0LCBmaWVsZCkJU05NUF9JTkNfU1RBVFNfQkgoKG5ldCktPm1pYi5pY21wX3N0YXRpc3RpY3MsIGZpZWxkKQotI2RlZmluZSBJQ01QTVNHT1VUX0lOQ19TVEFUUyhuZXQsIGZpZWxkKQlTTk1QX0lOQ19TVEFUUygobmV0KS0+bWliLmljbXBtc2dfc3RhdGlzdGljcywgZmllbGQrMjU2KQotI2RlZmluZSBJQ01QTVNHSU5fSU5DX1NUQVRTX0JIKG5ldCwgZmllbGQpCVNOTVBfSU5DX1NUQVRTX0JIKChuZXQpLT5taWIuaWNtcG1zZ19zdGF0aXN0aWNzLCBmaWVsZCkKKyNkZWZpbmUgSUNNUE1TR09VVF9JTkNfU1RBVFMobmV0LCBmaWVsZCkJU05NUF9JTkNfU1RBVFNfQVRPTUlDX0xPTkcoKG5ldCktPm1pYi5pY21wbXNnX3N0YXRpc3RpY3MsIGZpZWxkKzI1NikKKyNkZWZpbmUgSUNNUE1TR0lOX0lOQ19TVEFUU19CSChuZXQsIGZpZWxkKQlTTk1QX0lOQ19TVEFUU19BVE9NSUNfTE9ORygobmV0KS0+bWliLmljbXBtc2dfc3RhdGlzdGljcywgZmllbGQpCiAKIHN0cnVjdCBkc3RfZW50cnk7CiBzdHJ1Y3QgbmV0X3Byb3RvX2ZhbWlseTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2llZWU4MDIxMV9yYWRpb3RhcC5oIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExX3JhZGlvdGFwLmgKaW5kZXggN2UyYzRkNC4uNzEzOTI1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaWVlZTgwMjExX3JhZGlvdGFwLmgKKysrIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjExX3JhZGlvdGFwLmgKQEAgLTI3MSwxNCArMjcxLDYgQEAKICNkZWZpbmUgSUVFRTgwMjExX1JBRElPVEFQX01DU19GRUNfTERQQwkJMHgxMAogCiAKLS8qIFVnbHkgbWFjcm8gdG8gY29udmVydCBsaXRlcmFsIGNoYW5uZWwgbnVtYmVycyBpbnRvIHRoZWlyIG1oeiBlcXVpdmFsZW50cwotICogVGhlcmUgYXJlIGNlcnRpYW5seSBzb21lIGNvbmRpdGlvbnMgdGhhdCB3aWxsIGJyZWFrIHRoaXMgKGxpa2UgZmVlZGluZyBpdCAnMzAnKQotICogYnV0IHRoZXkgc2hvdWxkbid0IGFyaXNlIHNpbmNlIG5vdGhpbmcgdGFsa3Mgb24gY2hhbm5lbCAzMC4gKi8KLSNkZWZpbmUgaWVlZTgwMjExY2hhbjJtaHooeCkgXAotCSgoKHgpIDw9IDE0KSA/IFwKLQkoKCh4KSA9PSAxNCkgPyAyNDg0IDogKCh4KSAqIDUpICsgMjQwNykgOiBcCi0JKCh4KSArIDEwMDApICogNSkKLQogLyogaGVscGVycyAqLwogc3RhdGljIGlubGluZSBpbnQgaWVlZTgwMjExX2dldF9yYWRpb3RhcF9sZW4odW5zaWduZWQgY2hhciAqZGF0YSkKIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2llZWU4MDIxNTQuaCBiL2luY2x1ZGUvbmV0L2llZWU4MDIxNTQuaAppbmRleCBkNTI2ODVkLi5lZTU5ZjhiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pZWVlODAyMTU0LmgKKysrIGIvaW5jbHVkZS9uZXQvaWVlZTgwMjE1NC5oCkBAIC0yMSwxMSArMjEsMTQgQEAKICAqIE1heGltIEdvcmJhY2h5b3YgPG1heGltLmdvcmJhY2hldkBzaWVtZW5zLmNvbT4KICAqIE1heGltIE9zaXBvdiA8bWF4aW0ub3NpcG92QHNpZW1lbnMuY29tPgogICogRG1pdHJ5IEVyZW1pbi1Tb2xlbmlrb3YgPGRiYXJ5c2hrb3ZAZ21haWwuY29tPgorICogQWxleGFuZGVyIFNtaXJub3YgPGFsZXguYmx1ZXNtYW4uc21pcm5vdkBnbWFpbC5jb20+CiAgKi8KIAogI2lmbmRlZiBORVRfSUVFRTgwMjE1NF9ICiAjZGVmaW5lIE5FVF9JRUVFODAyMTU0X0gKIAorI2RlZmluZSBJRUVFODAyMTU0X01UVQkJCTEyNworCiAjZGVmaW5lIElFRUU4MDIxNTRfRkNfVFlQRV9CRUFDT04JMHgwCS8qIEZyYW1lIGlzIGJlYWNvbiAqLwogI2RlZmluZQlJRUVFODAyMTU0X0ZDX1RZUEVfREFUQQkJMHgxCS8qIEZyYW1lIGlzIGRhdGEgKi8KICNkZWZpbmUgSUVFRTgwMjE1NF9GQ19UWVBFX0FDSwkJMHgyCS8qIEZyYW1lIGlzIGFja25vd2xlZGdtZW50ICovCkBAIC01Niw2ICs1OSw5IEBACiAJKCgoeCkgJiBJRUVFODAyMTU0X0ZDX0RBTU9ERV9NQVNLKSA+PiBJRUVFODAyMTU0X0ZDX0RBTU9ERV9TSElGVCkKIAogCisvKiBNQUMgZm9vdGVyIHNpemUgKi8KKyNkZWZpbmUgSUVFRTgwMjE1NF9NRlJfU0laRQkyIC8qIDIgb2N0ZXRzICovCisKIC8qIE1BQydzIENvbW1hbmQgRnJhbWVzIElkZW50aWZpZXJzICovCiAjZGVmaW5lIElFRUU4MDIxNTRfQ01EX0FTU09DSUFUSU9OX1JFUQkJMHgwMQogI2RlZmluZSBJRUVFODAyMTU0X0NNRF9BU1NPQ0lBVElPTl9SRVNQCQkweDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmggYi9pbmNsdWRlL25ldC9pbmV0Nl9oYXNodGFibGVzLmgKaW5kZXggZTQ2Njc0ZC4uMDBjYmI0MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldDZfaGFzaHRhYmxlcy5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXQ2X2hhc2h0YWJsZXMuaApAQCAtMTUsNyArMTUsNyBAQAogI2RlZmluZSBfSU5FVDZfSEFTSFRBQkxFU19ICiAKIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogI2luY2x1ZGUgPGxpbnV4L2luNi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgpAQCAtMTEwLDUgKzExMCw1IEBACiAJCQkJIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIGNvbnN0IF9fYmUxNiBzcG9ydCwKIAkJCQkgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgY29uc3QgX19iZTE2IGRwb3J0LAogCQkJCSBjb25zdCBpbnQgZGlmKTsKLSNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpICovCisjZW5kaWYgLyogSVNfRU5BQkxFRChDT05GSUdfSVBWNikgKi8KICNlbmRpZiAvKiBfSU5FVDZfSEFTSFRBQkxFU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oIGIvaW5jbHVkZS9uZXQvaW5ldF9jb25uZWN0aW9uX3NvY2suaAppbmRleCBlNmRiNjJlLi5kYmY5YWFiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X2Nvbm5lY3Rpb25fc29jay5oCisrKyBiL2luY2x1ZGUvbmV0L2luZXRfY29ubmVjdGlvbl9zb2NrLmgKQEAgLTE0Myw5ICsxNDMsOSBAQAogCXJldHVybiAodm9pZCAqKWluZXRfY3NrKHNrKS0+aWNza19jYV9wcml2OwogfQogCi1leHRlcm4gc3RydWN0IHNvY2sgKmluZXRfY3NrX2Nsb25lKHN0cnVjdCBzb2NrICpzaywKLQkJCQkgICBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkJICAgY29uc3QgZ2ZwX3QgcHJpb3JpdHkpOworZXh0ZXJuIHN0cnVjdCBzb2NrICppbmV0X2Nza19jbG9uZV9sb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKKwkJCQkJY29uc3Qgc3RydWN0IHJlcXVlc3Rfc29jayAqcmVxLAorCQkJCQljb25zdCBnZnBfdCBwcmlvcml0eSk7CiAKIGVudW0gaW5ldF9jc2tfYWNrX3N0YXRlX3QgewogCUlDU0tfQUNLX1NDSEVECT0gMSwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRfc29jay5oIGIvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmgKaW5kZXggYjg5N2Q2ZS4uZTNlNDA1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldF9zb2NrLmgKQEAgLTMxLDYgKzMxLDcgQEAKIC8qKiBzdHJ1Y3QgaXBfb3B0aW9ucyAtIElQIE9wdGlvbnMKICAqCiAgKiBAZmFkZHIgLSBTYXZlZCBmaXJzdCBob3AgYWRkcmVzcworICogQG5leHRob3AgLSBTYXZlZCBuZXh0aG9wIGFkZHJlc3MgaW4gTFNSUiBhbmQgU1NSUgogICogQGlzX2RhdGEgLSBPcHRpb25zIGluIF9fZGF0YSwgcmF0aGVyIHRoYW4gc2tiCiAgKiBAaXNfc3RyaWN0cm91dGUgLSBTdHJpY3Qgc291cmNlIHJvdXRlCiAgKiBAc3JyX2lzX2hpdCAtIFBhY2tldCBkZXN0aW5hdGlvbiBhZGRyIHdhcyBvdXIgb25lCkBAIC00MSw2ICs0Miw3IEBACiAgKi8KIHN0cnVjdCBpcF9vcHRpb25zIHsKIAlfX2JlMzIJCWZhZGRyOworCV9fYmUzMgkJbmV4dGhvcDsKIAl1bnNpZ25lZCBjaGFyCW9wdGxlbjsKIAl1bnNpZ25lZCBjaGFyCXNycjsKIAl1bnNpZ25lZCBjaGFyCXJyOwpAQCAtNjksNyArNzEsNyBAQAogCiBzdHJ1Y3QgaW5ldF9yZXF1ZXN0X3NvY2sgewogCXN0cnVjdCByZXF1ZXN0X3NvY2sJcmVxOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJdTE2CQkJaW5ldDZfcnNrX29mZnNldDsKICNlbmRpZgogCV9fYmUxNgkJCWxvY19wb3J0OwpAQCAtMTM3LDcgKzEzOSw3IEBACiBzdHJ1Y3QgaW5ldF9zb2NrIHsKIAkvKiBzayBhbmQgcGluZXQ2IGhhcyB0byBiZSB0aGUgZmlyc3QgdHdvIG1lbWJlcnMgb2YgaW5ldF9zb2NrICovCiAJc3RydWN0IHNvY2sJCXNrOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJc3RydWN0IGlwdjZfcGluZm8JKnBpbmV0NjsKICNlbmRpZgogCS8qIFNvY2tldCBkZW11bHRpcGxleCBjb21wYXJpc29ucyBvbiBpbmNvbWluZyBwYWNrZXRzLiAqLwpAQCAtMTg2LDcgKzE4OCw3IEBACiAJbWVtY3B5KGluZXRfc2soc2tfdG8pICsgMSwgaW5ldF9zayhza19mcm9tKSArIDEsCiAJICAgICAgIHNrX2Zyb20tPnNrX3Byb3QtPm9ial9zaXplIC0gYW5jZXN0b3Jfc2l6ZSk7CiB9Ci0jaWYgIShkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkpCisjaWYgIShJU19FTkFCTEVEKENPTkZJR19JUFY2KSkKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbmV0X3NrX2NvcHlfZGVzY2VuZGFudChzdHJ1Y3Qgc29jayAqc2tfdG8sCiAJCQkJCSAgIGNvbnN0IHN0cnVjdCBzb2NrICpza19mcm9tKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaW5ldF90aW1ld2FpdF9zb2NrLmggYi9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaAppbmRleCBlOGMyNWI5Li5iYTUyYzgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaAorKysgYi9pbmNsdWRlL25ldC9pbmV0X3RpbWV3YWl0X3NvY2suaApAQCAtMjE4LDIwICsyMTgsMTIgQEAKIHN0YXRpYyBpbmxpbmUKIHN0cnVjdCBuZXQgKnR3c2tfbmV0KGNvbnN0IHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3c2spCiB7Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCXJldHVybiByY3VfZGVyZWZlcmVuY2VfcmF3KHR3c2stPnR3X25ldCk7IC8qIHByb3RlY3RlZCBieSBsb2NraW5nLCAqLwotCQkJCQkJICAvKiByZWZlcmVuY2UgY291bnRpbmcsICovCi0JCQkJCQkgIC8qIGluaXRpYWxpemF0aW9uLCBvciBSQ1UuICovCi0jZWxzZQotCXJldHVybiAmaW5pdF9uZXQ7Ci0jZW5kaWYKKwlyZXR1cm4gcmVhZF9wbmV0KCZ0d3NrLT50d19uZXQpOwogfQogCiBzdGF0aWMgaW5saW5lCiB2b2lkIHR3c2tfbmV0X3NldChzdHJ1Y3QgaW5ldF90aW1ld2FpdF9zb2NrICp0d3NrLCBzdHJ1Y3QgbmV0ICpuZXQpCiB7Ci0jaWZkZWYgQ09ORklHX05FVF9OUwotCXJjdV9hc3NpZ25fcG9pbnRlcih0d3NrLT50d19uZXQsIG5ldCk7Ci0jZW5kaWYKKwl3cml0ZV9wbmV0KCZ0d3NrLT50d19uZXQsIG5ldCk7CiB9CiAjZW5kaWYJLyogX0lORVRfVElNRVdBSVRfU09DS18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2luZXRwZWVyLmggYi9pbmNsdWRlL25ldC9pbmV0cGVlci5oCmluZGV4IDc4YzgzZTYuLjA2Yjc5NWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2luZXRwZWVyLmgKKysrIGIvaW5jbHVkZS9uZXQvaW5ldHBlZXIuaApAQCAtMzUsNiArMzUsNyBAQAogCiAJdTMyCQkJbWV0cmljc1tSVEFYX01BWF07CiAJdTMyCQkJcmF0ZV90b2tlbnM7CS8qIHJhdGUgbGltaXRpbmcgZm9yIElDTVAgKi8KKwlpbnQJCQlyZWRpcmVjdF9nZW5pZDsKIAl1bnNpZ25lZCBsb25nCQlyYXRlX2xhc3Q7CiAJdW5zaWduZWQgbG9uZwkJcG10dV9leHBpcmVzOwogCXUzMgkJCXBtdHVfb3JpZzsKQEAgLTg2LDcgKzg3LDcgQEAKIHsKIAlzdHJ1Y3QgaW5ldHBlZXJfYWRkciBkYWRkcjsKIAotCWlwdjZfYWRkcl9jb3B5KChzdHJ1Y3QgaW42X2FkZHIgKilkYWRkci5hZGRyLmE2LCB2NmRhZGRyKTsKKwkqKHN0cnVjdCBpbjZfYWRkciAqKWRhZGRyLmFkZHIuYTYgPSAqdjZkYWRkcjsKIAlkYWRkci5mYW1pbHkgPSBBRl9JTkVUNjsKIAlyZXR1cm4gaW5ldF9nZXRwZWVyKCZkYWRkciwgY3JlYXRlKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2lwLmggYi9pbmNsdWRlL25ldC9pcC5oCmluZGV4IGVjYTBlZjcuLjc3NTAwOWYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwLmgKKysrIGIvaW5jbHVkZS9uZXQvaXAuaApAQCAtMzUzLDE0ICszNTMsMTQgQEAKIAkJbWVtY3B5KGJ1ZiwgJm5hZGRyLCBzaXplb2YobmFkZHIpKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgogI2VuZGlmCiAKIHN0YXRpYyBfX2lubGluZV9fIHZvaWQgaW5ldF9yZXNldF9zYWRkcihzdHJ1Y3Qgc29jayAqc2spCiB7CiAJaW5ldF9zayhzayktPmluZXRfcmN2X3NhZGRyID0gaW5ldF9zayhzayktPmluZXRfc2FkZHIgPSAwOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJaWYgKHNrLT5za19mYW1pbHkgPT0gUEZfSU5FVDYpIHsKIAkJc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCkBAIC0zNzksNyArMzc5LDcgQEAKIAlzd2l0Y2ggKHNrLT5za19mYW1pbHkpIHsKIAljYXNlIEFGX0lORVQ6CiAJCXJldHVybiBpbmV0X3NrKHNrKS0+bWNfbG9vcDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgQUZfSU5FVDY6CiAJCXJldHVybiBpbmV0Nl9zayhzayktPm1jX2xvb3A7CiAjZW5kaWYKQEAgLTQ1MCw3ICs0NTAsNyBAQAogICoJRnVuY3Rpb25zIHByb3ZpZGVkIGJ5IGlwX3NvY2tnbHVlLmMKICAqLwogCi1leHRlcm4gaW50CWlwX3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKK2V4dGVybiB2b2lkCWlwdjRfcGt0aW5mb19wcmVwYXJlKHN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHZvaWQJaXBfY21zZ19yZWN2KHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBleHRlcm4gaW50CWlwX2Ntc2dfc2VuZChzdHJ1Y3QgbmV0ICpuZXQsCiAJCQkgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IGlwY21fY29va2llICppcGMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oIGIvaW5jbHVkZS9uZXQvaXA2X2ZpYi5oCmluZGV4IDU3MzVhMGYuLmIyNmJiODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwNl9maWIuaAorKysgYi9pbmNsdWRlL25ldC9pcDZfZmliLmgKQEAgLTg2LDkgKzg2LDYgQEAKIHN0cnVjdCBydDZfaW5mbyB7CiAJc3RydWN0IGRzdF9lbnRyeQkJZHN0OwogCi0jZGVmaW5lIHJ0NmlfZGV2CQkJZHN0LmRldgotI2RlZmluZSBydDZpX2V4cGlyZXMJCQlkc3QuZXhwaXJlcwotCiAJLyoKIAkgKiBUYWlsIGVsZW1lbnRzIG9mIGRzdF9lbnRyeSAoX19yZWZjbnQgZXRjLikKIAkgKiBhbmQgdGhlc2UgZWxlbWVudHMgKHJhcmVseSB1c2VkIGluIGhvdCBwYXRoKSBhcmUgaW4KQEAgLTIwMiw2ICsxOTksMTAgQEAKIAkJCQkJICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBpbnQgZHN0X2xlbiwKIAkJCQkJICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBpbnQgc3JjX2xlbik7CiAKK2V4dGVybiB2b2lkCQkJZmliNl9jbGVhbl9hbGxfcm8oc3RydWN0IG5ldCAqbmV0LAorCQkJCQkgICAgICAgaW50ICgqZnVuYykoc3RydWN0IHJ0Nl9pbmZvICosIHZvaWQgKmFyZyksCisJCQkJCSAgICAgICBpbnQgcHJ1bmUsIHZvaWQgKmFyZyk7CisKIGV4dGVybiB2b2lkCQkJZmliNl9jbGVhbl9hbGwoc3RydWN0IG5ldCAqbmV0LAogCQkJCQkgICAgICAgaW50ICgqZnVuYykoc3RydWN0IHJ0Nl9pbmZvICosIHZvaWQgKmFyZyksCiAJCQkJCSAgICAgICBpbnQgcHJ1bmUsIHZvaWQgKmFyZyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9pcDZfcm91dGUuaCBiL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCmluZGV4IDVlOTFiNzIuLjJhZDkyY2EgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCisrKyBiL2luY2x1ZGUvbmV0L2lwNl9yb3V0ZS5oCkBAIC03MCw2ICs3MCw4IEBACiBleHRlcm4gc3RydWN0IGRzdF9lbnRyeSAqCWlwNl9yb3V0ZV9vdXRwdXQoc3RydWN0IG5ldCAqbmV0LAogCQkJCQkJIGNvbnN0IHN0cnVjdCBzb2NrICpzaywKIAkJCQkJCSBzdHJ1Y3QgZmxvd2k2ICpmbDYpOworZXh0ZXJuIHN0cnVjdCBkc3RfZW50cnkgKglpcDZfcm91dGVfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkJCSBzdHJ1Y3QgZmxvd2k2ICpmbDYsIGludCBmbGFncyk7CiAKIGV4dGVybiBpbnQJCQlpcDZfcm91dGVfaW5pdCh2b2lkKTsKIGV4dGVybiB2b2lkCQkJaXA2X3JvdXRlX2NsZWFudXAodm9pZCk7CkBAIC05NSwxNCArOTcsMTQgQEAKIAogZXh0ZXJuIHN0cnVjdCBkc3RfZW50cnkgKmljbXA2X2RzdF9hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkgc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsCi0JCQkJCSBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpOworCQkJCQkgc3RydWN0IGZsb3dpNiAqZmw2KTsKIGV4dGVybiBpbnQgaWNtcDZfZHN0X2djKHZvaWQpOwogCiBleHRlcm4gdm9pZCBmaWI2X2ZvcmNlX3N0YXJ0X2djKHN0cnVjdCBuZXQgKm5ldCk7CiAKIGV4dGVybiBzdHJ1Y3QgcnQ2X2luZm8gKmFkZHJjb25mX2RzdF9hbGxvYyhzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2LAogCQkJCQkgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCi0JCQkJCSAgIGludCBhbnljYXN0KTsKKwkJCQkJICAgYm9vbCBhbnljYXN0KTsKIAogZXh0ZXJuIGludAkJCWlwNl9kc3RfaG9wbGltaXQoc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXBfdnMuaCBiL2luY2x1ZGUvbmV0L2lwX3ZzLmgKaW5kZXggODczZDViZS4uZWJlNTE3ZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXBfdnMuaAorKysgYi9pbmNsdWRlL25ldC9pcF92cy5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyLmg+CQkvKiBmb3IgdW5pb24gbmZfaW5ldF9hZGRyICovCiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CQkJLyogZm9yIHN0cnVjdCBpcHY2aGRyICovCi0jaW5jbHVkZSA8bmV0L2lwdjYuaD4JCQkvKiBmb3IgaXB2Nl9hZGRyX2NvcHkgKi8KKyNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay5oPgogI2VuZGlmCkBAIC0xMTksOCArMTE5LDggQEAKIAkJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwaCA9IG5oOwogCQlpcGhkci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKTsKIAkJaXBoZHItPnByb3RvY29sID0gaXBoLT5uZXh0aGRyOwotCQlpcHY2X2FkZHJfY29weSgmaXBoZHItPnNhZGRyLmluNiwgJmlwaC0+c2FkZHIpOwotCQlpcHY2X2FkZHJfY29weSgmaXBoZHItPmRhZGRyLmluNiwgJmlwaC0+ZGFkZHIpOworCQlpcGhkci0+c2FkZHIuaW42ID0gaXBoLT5zYWRkcjsKKwkJaXBoZHItPmRhZGRyLmluNiA9IGlwaC0+ZGFkZHI7CiAJfSBlbHNlCiAjZW5kaWYKIAl7CkBAIC0xMzcsNyArMTM3LDcgQEAKIHsKICNpZmRlZiBDT05GSUdfSVBfVlNfSVBWNgogCWlmIChhZiA9PSBBRl9JTkVUNikKLQkJaXB2Nl9hZGRyX2NvcHkoJmRzdC0+aW42LCAmc3JjLT5pbjYpOworCQlkc3QtPmluNiA9IHNyYy0+aW42OwogCWVsc2UKICNlbmRpZgogCWRzdC0+aXAgPSBzcmMtPmlwOwpAQCAtMTIwNyw3ICsxMjA3LDcgQEAKIGV4dGVybiBzdHJ1Y3QgaXBfdnNfZGVzdCAqCiBpcF92c19maW5kX2Rlc3Qoc3RydWN0IG5ldCAqbmV0LCBpbnQgYWYsIGNvbnN0IHVuaW9uIG5mX2luZXRfYWRkciAqZGFkZHIsCiAJCV9fYmUxNiBkcG9ydCwgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICp2YWRkciwgX19iZTE2IHZwb3J0LAotCQlfX3UxNiBwcm90b2NvbCwgX191MzIgZndtYXJrKTsKKwkJX191MTYgcHJvdG9jb2wsIF9fdTMyIGZ3bWFyaywgX191MzIgZmxhZ3MpOwogZXh0ZXJuIHN0cnVjdCBpcF92c19kZXN0ICppcF92c190cnlfYmluZF9kZXN0KHN0cnVjdCBpcF92c19jb25uICpjcCk7CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvaXB2Ni5oIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCmluZGV4IGEzNjZhOGExLi5lNDE3MGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9pcHY2LmgKKysrIGIvaW5jbHVkZS9uZXQvaXB2Ni5oCkBAIC0xMzIsNiArMTMyLDE1IEBACiAJU05NUF9JTkNfU1RBVFMjI21vZGlmaWVyKChuZXQpLT5taWIuc3RhdG5hbWUjI19zdGF0aXN0aWNzLCAoZmllbGQpKTtcCiB9KQogCisvKiBwZXIgZGV2aWNlIGFuZCBwZXIgbmV0IGNvdW50ZXJzIGFyZSBhdG9taWNfbG9uZ190ICovCisjZGVmaW5lIF9ERVZJTkNfQVRPTUlDX0FUT01JQyhuZXQsIHN0YXRuYW1lLCBpZGV2LCBmaWVsZCkJCVwKKyh7CQkJCQkJCQkJXAorCXN0cnVjdCBpbmV0Nl9kZXYgKl9pZGV2ID0gKGlkZXYpOwkJCQlcCisJaWYgKGxpa2VseShfaWRldiAhPSBOVUxMKSkJCQkJCVwKKwkJU05NUF9JTkNfU1RBVFNfQVRPTUlDX0xPTkcoKF9pZGV2KS0+c3RhdHMuc3RhdG5hbWUjI2RldiwgKGZpZWxkKSk7IFwKKwlTTk1QX0lOQ19TVEFUU19BVE9NSUNfTE9ORygobmV0KS0+bWliLnN0YXRuYW1lIyNfc3RhdGlzdGljcywgKGZpZWxkKSk7XAorfSkKKwogI2RlZmluZSBfREVWQUREKG5ldCwgc3RhdG5hbWUsIG1vZGlmaWVyLCBpZGV2LCBmaWVsZCwgdmFsKQkJXAogKHsJCQkJCQkJCQlcCiAJc3RydWN0IGluZXQ2X2RldiAqX2lkZXYgPSAoaWRldik7CQkJCVwKQEAgLTE2OCwxMSArMTc3LDExIEBACiAJCV9ERVZJTkNBVE9NSUMobmV0LCBpY21wdjYsIF9CSCwgaWRldiwgZmllbGQpCiAKICNkZWZpbmUgSUNNUDZNU0dPVVRfSU5DX1NUQVRTKG5ldCwgaWRldiwgZmllbGQpCQlcCi0JX0RFVklOQ0FUT01JQyhuZXQsIGljbXB2Nm1zZywgLCBpZGV2LCBmaWVsZCArMjU2KQorCV9ERVZJTkNfQVRPTUlDX0FUT01JQyhuZXQsIGljbXB2Nm1zZywgaWRldiwgZmllbGQgKzI1NikKICNkZWZpbmUgSUNNUDZNU0dPVVRfSU5DX1NUQVRTX0JIKG5ldCwgaWRldiwgZmllbGQpCVwKLQlfREVWSU5DQVRPTUlDKG5ldCwgaWNtcHY2bXNnLCBfQkgsIGlkZXYsIGZpZWxkICsyNTYpCisJX0RFVklOQ19BVE9NSUNfQVRPTUlDKG5ldCwgaWNtcHY2bXNnLCBpZGV2LCBmaWVsZCArMjU2KQogI2RlZmluZSBJQ01QNk1TR0lOX0lOQ19TVEFUU19CSChuZXQsIGlkZXYsIGZpZWxkKQlcCi0JX0RFVklOQ0FUT01JQyhuZXQsIGljbXB2Nm1zZywgX0JILCBpZGV2LCBmaWVsZCkKKwlfREVWSU5DX0FUT01JQ19BVE9NSUMobmV0LCBpY21wdjZtc2csIGlkZXYsIGZpZWxkKQogCiBzdHJ1Y3QgaXA2X3JhX2NoYWluIHsKIAlzdHJ1Y3QgaXA2X3JhX2NoYWluCSpuZXh0OwpAQCAtMzAwLDExICszMDksNiBAQAogCQkgICgoYTEtPnM2X2FkZHIzMlszXSBeIGEyLT5zNl9hZGRyMzJbM10pICYgbS0+czZfYWRkcjMyWzNdKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBpcHY2X2FkZHJfY29weShzdHJ1Y3QgaW42X2FkZHIgKmExLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmEyKQotewotCW1lbWNweShhMSwgYTIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKLX0KLQogc3RhdGljIGlubGluZSB2b2lkIGlwdjZfYWRkcl9wcmVmaXgoc3RydWN0IGluNl9hZGRyICpwZngsIAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIsCiAJCQkJICAgIGludCBwbGVuKQpAQCAtNTU0LDcgKzU1OCw3IEBACiAJCQkJCQkgICAgdTggKnByb3RvKTsKIAogZXh0ZXJuIGludAkJCWlwdjZfc2tpcF9leHRoZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKiwgaW50IHN0YXJ0LAotCQkJCQkgICAgICAgICB1OCAqbmV4dGhkcnApOworCQkJCQkgICAgICAgICB1OCAqbmV4dGhkcnAsIF9fYmUxNiAqZnJhZ19vZmZwKTsKIAogZXh0ZXJuIGludCAJCQlpcHY2X2V4dF9oZHIodTggbmV4dGhkcik7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L2l1Y3YvYWZfaXVjdi5oIGIvaW5jbHVkZS9uZXQvaXVjdi9hZl9pdWN2LmgKaW5kZXggZjI0MTljZi4uMDk1NGVjOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvaXVjdi9hZl9pdWN2LmgKKysrIGIvaW5jbHVkZS9uZXQvaXVjdi9hZl9pdWN2LmgKQEAgLTI3LDcgKzI3LDYgQEAKIAlJVUNWX09QRU4sCiAJSVVDVl9CT1VORCwKIAlJVUNWX0xJU1RFTiwKLQlJVUNWX1NFVkVSRUQsCiAJSVVDVl9ESVNDT05OLAogCUlVQ1ZfQ0xPU0lORywKIAlJVUNWX0NMT1NFRApAQCAtMTQ2LDcgKzE0NSw2IEBACiAJCQkgICAgcG9sbF90YWJsZSAqd2FpdCk7CiB2b2lkIGl1Y3Zfc29ja19saW5rKHN0cnVjdCBpdWN2X3NvY2tfbGlzdCAqbCwgc3RydWN0IHNvY2sgKnMpOwogdm9pZCBpdWN2X3NvY2tfdW5saW5rKHN0cnVjdCBpdWN2X3NvY2tfbGlzdCAqbCwgc3RydWN0IHNvY2sgKnMpOwotaW50ICBpdWN2X3NvY2tfd2FpdF9jbnQoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBsb25nIHRpbWVvKTsKIHZvaWQgaXVjdl9hY2NlcHRfZW5xdWV1ZShzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3Qgc29jayAqc2spOwogdm9pZCBpdWN2X2FjY2VwdF91bmxpbmsoc3RydWN0IHNvY2sgKnNrKTsKIHN0cnVjdCBzb2NrICppdWN2X2FjY2VwdF9kZXF1ZXVlKHN0cnVjdCBzb2NrICpwYXJlbnQsIHN0cnVjdCBzb2NrZXQgKm5ld3NvY2spOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaCBiL2luY2x1ZGUvbmV0L21hYzgwMjExLmgKaW5kZXggNzJlZGRkMS4uMmE3NTIzZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAorKysgYi9pbmNsdWRlL25ldC9tYWM4MDIxMS5oCkBAIC0xNjYsNiArMTY2LDcgQEAKICAqCXRoYXQgaXQgaXMgb25seSBldmVyIGRpc2FibGVkIGZvciBzdGF0aW9uIG1vZGUuCiAgKiBAQlNTX0NIQU5HRURfSURMRTogSWRsZSBjaGFuZ2VkIGZvciB0aGlzIEJTUy9pbnRlcmZhY2UuCiAgKiBAQlNTX0NIQU5HRURfU1NJRDogU1NJRCBjaGFuZ2VkIGZvciB0aGlzIEJTUyAoQVAgbW9kZSkKKyAqIEBCU1NfQ0hBTkdFRF9BUF9QUk9CRV9SRVNQOiBQcm9iZSBSZXNwb25zZSBjaGFuZ2VkIGZvciB0aGlzIEJTUyAoQVAgbW9kZSkKICAqLwogZW51bSBpZWVlODAyMTFfYnNzX2NoYW5nZSB7CiAJQlNTX0NIQU5HRURfQVNTT0MJCT0gMTw8MCwKQEAgLTE4NCw2ICsxODUsNyBAQAogCUJTU19DSEFOR0VEX1FPUwkJCT0gMTw8MTMsCiAJQlNTX0NIQU5HRURfSURMRQkJPSAxPDwxNCwKIAlCU1NfQ0hBTkdFRF9TU0lECQk9IDE8PDE1LAorCUJTU19DSEFOR0VEX0FQX1BST0JFX1JFU1AJPSAxPDwxNiwKIAogCS8qIHdoZW4gYWRkaW5nIGhlcmUsIG1ha2Ugc3VyZSB0byBjaGFuZ2UgaWVlZTgwMjExX3JlY29uZmlnICovCiB9OwpAQCAtNTE4LDcgKzUyMCw3IEBACiAgKiBAZmxhZ3M6IHRyYW5zbWl0IGluZm8gZmxhZ3MsIGRlZmluZWQgYWJvdmUKICAqIEBiYW5kOiB0aGUgYmFuZCB0byB0cmFuc21pdCBvbiAodXNlIGZvciBjaGVja2luZyBmb3IgcmFjZXMpCiAgKiBAYW50ZW5uYV9zZWxfdHg6IGFudGVubmEgdG8gdXNlLCAwIGZvciBhdXRvbWF0aWMgZGl2ZXJzaXR5Ci0gKiBAcGFkOiBwYWRkaW5nLCBpZ25vcmUKKyAqIEBhY2tfZnJhbWVfaWQ6IGludGVybmFsIGZyYW1lIElEIGZvciBUWCBzdGF0dXMsIHVzZWQgaW50ZXJuYWxseQogICogQGNvbnRyb2w6IHVuaW9uIGZvciBjb250cm9sIGRhdGEKICAqIEBzdGF0dXM6IHVuaW9uIGZvciBzdGF0dXMgZGF0YQogICogQGRyaXZlcl9kYXRhOiBhcnJheSBvZiBkcml2ZXJfZGF0YSBwb2ludGVycwpAQCAtNTM1LDggKzUzNyw3IEBACiAKIAl1OCBhbnRlbm5hX3NlbF90eDsKIAotCS8qIDIgYnl0ZSBob2xlICovCi0JdTggcGFkWzJdOworCXUxNiBhY2tfZnJhbWVfaWQ7CiAKIAl1bmlvbiB7CiAJCXN0cnVjdCB7CkBAIC05MDEsNiArOTAyLDEwIEBACiAgKiBASUVFRTgwMjExX0tFWV9GTEFHX1NXX01HTVQ6IFRoaXMgZmxhZyBzaG91bGQgYmUgc2V0IGJ5IHRoZSBkcml2ZXIgZm9yIGEKICAqCUNDTVAga2V5IGlmIGl0IHJlcXVpcmVzIENDTVAgZW5jcnlwdGlvbiBvZiBtYW5hZ2VtZW50IGZyYW1lcyAoTUZQKSB0bwogICoJYmUgZG9uZSBpbiBzb2Z0d2FyZS4KKyAqIEBJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFOiBUaGlzIGZsYWcgc2hvdWxkIGJlIHNldCBieSB0aGUgZHJpdmVyCisgKglmb3IgYSBDQ01QIGtleSBpZiBzcGFjZSBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIHRoZSBJViwgYnV0IHRoZSBJVgorICoJaXRzZWxmIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkLiBEbyBub3Qgc2V0IHRvZ2V0aGVyIHdpdGgKKyAqCUBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYgb24gdGhlIHNhbWUga2V5LgogICovCiBlbnVtIGllZWU4MDIxMV9rZXlfZmxhZ3MgewogCUlFRUU4MDIxMV9LRVlfRkxBR19XTU1fU1RBCT0gMTw8MCwKQEAgLTkwOCw2ICs5MTMsNyBAQAogCUlFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9NTUlDPSAxPDwyLAogCUlFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRQk9IDE8PDMsCiAJSUVFRTgwMjExX0tFWV9GTEFHX1NXX01HTVQJPSAxPDw0LAorCUlFRUU4MDIxMV9LRVlfRkxBR19QVVRfSVZfU1BBQ0UgPSAxPDw1LAogfTsKIAogLyoqCkBAIC0xMzA0LDYgKzEzMTAsMTYgQEAKIH0KIAogLyoqCisgKiBpZWVlODAyMTFfZnJlZV90eHNrYiAtIGZyZWUgVFggc2tiCisgKiBAaHc6IHRoZSBoYXJkd2FyZQorICogQHNrYjogdGhlIHNrYgorICoKKyAqIEZyZWUgYSB0cmFuc21pdCBza2IuIFVzZSB0aGlzIGZ1bnRpb24gd2hlbiBzb21lIGZhaWx1cmUKKyAqIHRvIHRyYW5zbWl0IGhhcHBlbmVkIGFuZCB0aHVzIHN0YXR1cyBjYW5ub3QgYmUgcmVwb3J0ZWQuCisgKi8KK3ZvaWQgaWVlZTgwMjExX2ZyZWVfdHhza2Ioc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpOworCisvKioKICAqIERPQzogSGFyZHdhcmUgY3J5cHRvIGFjY2VsZXJhdGlvbgogICoKICAqIG1hYzgwMjExIGlzIGNhcGFibGUgb2YgdGFraW5nIGFkdmFudGFnZSBvZiBtYW55IGhhcmR3YXJlCkBAIC0xNzQ0LDExICsxNzYwLDIxIEBACiAgKglza2IgY29udGFpbnMgdGhlIGJ1ZmZlciBzdGFydGluZyBmcm9tIHRoZSBJRUVFIDgwMi4xMSBoZWFkZXIuCiAgKglUaGUgbG93LWxldmVsIGRyaXZlciBzaG91bGQgc2VuZCB0aGUgZnJhbWUgb3V0IGJhc2VkIG9uCiAgKgljb25maWd1cmF0aW9uIGluIHRoZSBUWCBjb250cm9sIGRhdGEuIFRoaXMgaGFuZGxlciBzaG91bGQsCi0gKglwcmVmZXJhYmx5LCBuZXZlciBmYWlsIGFuZCBzdG9wIHF1ZXVlcyBhcHByb3ByaWF0ZWx5LCBtb3JlCi0gKglpbXBvcnRhbnRseSwgaG93ZXZlciwgaXQgbXVzdCBuZXZlciBmYWlsIGZvciBBLU1QRFUtcXVldWVzLgotICoJVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIE5FVERFVl9UWF9PSyBleGNlcHQgaW4gdmVyeQotICoJbGltaXRlZCBjYXNlcy4KLSAqCU11c3QgYmUgaW1wbGVtZW50ZWQgYW5kIGF0b21pYy4KKyAqCXByZWZlcmFibHksIG5ldmVyIGZhaWwgYW5kIHN0b3AgcXVldWVzIGFwcHJvcHJpYXRlbHkuCisgKglUaGlzIG11c3QgYmUgaW1wbGVtZW50ZWQgaWYgQHR4X2ZyYWdzIGlzIG5vdC4KKyAqCU11c3QgYmUgYXRvbWljLgorICoKKyAqIEB0eF9mcmFnczogQ2FsbGVkIHRvIHRyYW5zbWl0IG11bHRpcGxlIGZyYWdtZW50cyBvZiBhIHNpbmdsZSBNU0RVLgorICoJVGhpcyBoYW5kbGVyIG11c3QgY29uc3VtZSBhbGwgZnJhZ21lbnRzLCBzZW5kaW5nIG91dCBzb21lIG9mCisgKgl0aGVtIG9ubHkgaXMgdXNlbGVzcyBhbmQgaXQgY2FuJ3QgYXNrIGZvciBzb21lIG9mIHRoZW0gdG8gYmUKKyAqCXF1ZXVlZCBhZ2Fpbi4gSWYgdGhlIGZyYW1lIGlzIG5vdCBmcmFnbWVudGVkIHRoZSBxdWV1ZSBoYXMgYQorICoJc2luZ2xlIFNLQiBvbmx5LiBUbyBhdm9pZCBpc3N1ZXMgd2l0aCB0aGUgbmV0d29ya2luZyBzdGFjaworICoJd2hlbiBUWCBzdGF0dXMgaXMgcmVwb3J0ZWQgdGhlIGZyYW1lcyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tCisgKgl0aGUgc2tiIHF1ZXVlLgorICoJSWYgdGhpcyBpcyB1c2VkLCB0aGUgdHhfaW5mbyBAdmlmIGFuZCBAc3RhIHBvaW50ZXJzIHdpbGwgYmUKKyAqCWludmFsaWQgLS0geW91IG11c3Qgbm90IHVzZSB0aGVtIGluIHRoYXQgY2FzZS4KKyAqCVRoaXMgbXVzdCBiZSBpbXBsZW1lbnRlZCBpZiBAdHggaXNuJ3QuCisgKglNdXN0IGJlIGF0b21pYy4KICAqCiAgKiBAc3RhcnQ6IENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IG5ldGRldmljZSBhdHRhY2hlZCB0byB0aGUgaGFyZHdhcmUKICAqCWlzIGVuYWJsZWQuIFRoaXMgc2hvdWxkIHR1cm4gb24gdGhlIGhhcmR3YXJlIGFuZCBtdXN0IHR1cm4gb24KQEAgLTIwODUsNiArMjExMSw4IEBACiAgKi8KIHN0cnVjdCBpZWVlODAyMTFfb3BzIHsKIAl2b2lkICgqdHgpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKKwl2b2lkICgqdHhfZnJhZ3MpKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLAorCQkJIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMpOwogCWludCAoKnN0YXJ0KShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7CiAJdm9pZCAoKnN0b3ApKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsKICNpZmRlZiBDT05GSUdfUE0KQEAgLTI2NjEsNiArMjY4OSwxOSBAQAogfQogCiAvKioKKyAqIGllZWU4MDIxMV9wcm9iZXJlc3BfZ2V0IC0gcmV0cmlldmUgYSBQcm9iZSBSZXNwb25zZSB0ZW1wbGF0ZQorICogQGh3OiBwb2ludGVyIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkuCisgKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgorICoKKyAqIENyZWF0ZXMgYSBQcm9iZSBSZXNwb25zZSB0ZW1wbGF0ZSB3aGljaCBjYW4sIGZvciBleGFtcGxlLCBiZSB1cGxvYWRlZCB0bworICogaGFyZHdhcmUuIFRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHNob3VsZCBiZSBzZXQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiBDYW4gb25seSBiZSBjYWxsZWQgaW4gQVAgbW9kZS4KKyAqLworc3RydWN0IHNrX2J1ZmYgKmllZWU4MDIxMV9wcm9iZXJlc3BfZ2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LAorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKTsKKworLyoqCiAgKiBpZWVlODAyMTFfcHNwb2xsX2dldCAtIHJldHJpZXZlIGEgUFMgUG9sbCB0ZW1wbGF0ZQogICogQGh3OiBwb2ludGVyIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkuCiAgKiBAdmlmOiAmc3RydWN0IGllZWU4MDIxMV92aWYgcG9pbnRlciBmcm9tIHRoZSBhZGRfaW50ZXJmYWNlIGNhbGxiYWNrLgpAQCAtMzQ2MSw5ICszNTAyLDEyIEBACiAgKgogICogQElFRUU4MDIxMV9SQ19IVF9DSEFOR0VEOiBUaGUgSFQgcGFyYW1ldGVycyBvZiB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgaGF2ZQogICoJY2hhbmdlZCwgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBjYW4gdXBkYXRlIGl0cyBpbnRlcm5hbCBzdGF0ZSBpZiBuZWVkZWQuCisgKiBASUVFRTgwMjExX1JDX1NNUFNfQ0hBTkdFRDogVGhlIFNNUFMgc3RhdGUgb2YgdGhlIHN0YXRpb24gY2hhbmdlZCwgdGhlIHJhdGUKKyAqCWNvbnRyb2wgYWxnb3JpdGhtIG5lZWRzIHRvIGFkanVzdCBhY2NvcmRpbmdseS4KICAqLwogZW51bSByYXRlX2NvbnRyb2xfY2hhbmdlZCB7Ci0JSUVFRTgwMjExX1JDX0hUX0NIQU5HRUQgPSBCSVQoMCkKKwlJRUVFODAyMTFfUkNfSFRfQ0hBTkdFRAkJPSBCSVQoMCksCisJSUVFRTgwMjExX1JDX1NNUFNfQ0hBTkdFRAk9IEJJVCgxKSwKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmRpc2MuaCBiL2luY2x1ZGUvbmV0L25kaXNjLmgKaW5kZXggNjJiZWViOS4uZTMxMzNjMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmRpc2MuaAorKysgYi9pbmNsdWRlL25ldC9uZGlzYy5oCkBAIC03OSw2ICs3OSw0MiBAQAogCV9fdTgJCW5kX29wdF9sZW47CiB9IF9fcGFja2VkOwogCitzdGF0aWMgaW5saW5lIHUzMiBuZGlzY19oYXNoZm4oY29uc3Qgdm9pZCAqcGtleSwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgX191MzIgKmhhc2hfcm5kKQoreworCWNvbnN0IHUzMiAqcDMyID0gcGtleTsKKworCXJldHVybiAoKChwMzJbMF0gXiBkZXYtPmlmaW5kZXgpICogaGFzaF9ybmRbMF0pICsKKwkJKHAzMlsxXSAqIGhhc2hfcm5kWzFdKSArCisJCShwMzJbMl0gKiBoYXNoX3JuZFsyXSkgKworCQkocDMyWzNdICogaGFzaF9ybmRbM10pKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgbmVpZ2hib3VyICpfX2lwdjZfbmVpZ2hfbG9va3VwKHN0cnVjdCBuZWlnaF90YWJsZSAqdGJsLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjb25zdCB2b2lkICpwa2V5KQoreworCXN0cnVjdCBuZWlnaF9oYXNoX3RhYmxlICpuaHQ7CisJY29uc3QgdTMyICpwMzIgPSBwa2V5OworCXN0cnVjdCBuZWlnaGJvdXIgKm47CisJdTMyIGhhc2hfdmFsOworCisJcmN1X3JlYWRfbG9ja19iaCgpOworCW5odCA9IHJjdV9kZXJlZmVyZW5jZV9iaCh0YmwtPm5odCk7CisJaGFzaF92YWwgPSBuZGlzY19oYXNoZm4ocGtleSwgZGV2LCBuaHQtPmhhc2hfcm5kKSA+PiAoMzIgLSBuaHQtPmhhc2hfc2hpZnQpOworCWZvciAobiA9IHJjdV9kZXJlZmVyZW5jZV9iaChuaHQtPmhhc2hfYnVja2V0c1toYXNoX3ZhbF0pOworCSAgICAgbiAhPSBOVUxMOworCSAgICAgbiA9IHJjdV9kZXJlZmVyZW5jZV9iaChuLT5uZXh0KSkgeworCQl1MzIgKm4zMiA9ICh1MzIgKikgbi0+cHJpbWFyeV9rZXk7CisJCWlmIChuLT5kZXYgPT0gZGV2ICYmCisJCSAgICAoKG4zMlswXSBeIHAzMlswXSkgfCAobjMyWzFdIF4gcDMyWzFdKSB8CisJCSAgICAgKG4zMlsyXSBeIHAzMlsyXSkgfCAobjMyWzNdIF4gcDMyWzNdKSkgPT0gMCkgeworCQkJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZuLT5yZWZjbnQpKQorCQkJCW4gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CisKKwlyZXR1cm4gbjsKK30KIAogZXh0ZXJuIGludAkJCW5kaXNjX2luaXQodm9pZCk7CiAKQEAgLTE0NSwxMyArMTgxLDQgQEAKIGV4dGVybiB2b2lkIAkJCWluZXQ2X2lmaW5mb19ub3RpZnkoaW50IGV2ZW50LAogCQkJCQkJICAgIHN0cnVjdCBpbmV0Nl9kZXYgKmlkZXYpOwogCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBuZWlnaGJvdXIgKiBuZGlzY19nZXRfbmVpZ2goc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKQotewotCi0JaWYgKGRldikKLQkJcmV0dXJuIF9fbmVpZ2hfbG9va3VwX2Vycm5vKCZuZF90YmwsIGFkZHIsIGRldik7Ci0KLQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKLX0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZWlnaGJvdXIuaCBiL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCmluZGV4IDI3MjA4ODQuLjM0Yzk5NmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCisrKyBiL2luY2x1ZGUvbmV0L25laWdoYm91ci5oCkBAIC01OSw3ICs1OSw3IEBACiAJaW50CXJlYWNoYWJsZV90aW1lOwogCWludAlkZWxheV9wcm9iZV90aW1lOwogCi0JaW50CXF1ZXVlX2xlbjsKKwlpbnQJcXVldWVfbGVuX2J5dGVzOwogCWludAl1Y2FzdF9wcm9iZXM7CiAJaW50CWFwcF9wcm9iZXM7CiAJaW50CW1jYXN0X3Byb2JlczsKQEAgLTk5LDYgKzk5LDcgQEAKIAlyd2xvY2tfdAkJbG9jazsKIAlhdG9taWNfdAkJcmVmY250OwogCXN0cnVjdCBza19idWZmX2hlYWQJYXJwX3F1ZXVlOworCXVuc2lnbmVkIGludAkJYXJwX3F1ZXVlX2xlbl9ieXRlczsKIAlzdHJ1Y3QgdGltZXJfbGlzdAl0aW1lcjsKIAl1bnNpZ25lZCBsb25nCQl1c2VkOwogCWF0b21pY190CQlwcm9iZXM7CkBAIC0xMzgsMTAgKzEzOSwxMiBAQAogICoJbmVpZ2hib3VyIHRhYmxlIG1hbmlwdWxhdGlvbgogICovCiAKKyNkZWZpbmUgTkVJR0hfTlVNX0hBU0hfUk5ECTQKKwogc3RydWN0IG5laWdoX2hhc2hfdGFibGUgewogCXN0cnVjdCBuZWlnaGJvdXIgX19yY3UJKipoYXNoX2J1Y2tldHM7CiAJdW5zaWduZWQgaW50CQloYXNoX3NoaWZ0OwotCV9fdTMyCQkJaGFzaF9ybmQ7CisJX191MzIJCQloYXNoX3JuZFtORUlHSF9OVU1fSEFTSF9STkRdOwogCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogfTsKIApAQCAtMTUzLDcgKzE1Niw3IEBACiAJaW50CQkJa2V5X2xlbjsKIAlfX3UzMgkJCSgqaGFzaCkoY29uc3Qgdm9pZCAqcGtleSwKIAkJCQkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJCQkJX191MzIgaGFzaF9ybmQpOworCQkJCQlfX3UzMiAqaGFzaF9ybmQpOwogCWludAkJCSgqY29uc3RydWN0b3IpKHN0cnVjdCBuZWlnaGJvdXIgKik7CiAJaW50CQkJKCpwY29uc3RydWN0b3IpKHN0cnVjdCBwbmVpZ2hfZW50cnkgKik7CiAJdm9pZAkJCSgqcGRlc3RydWN0b3IpKHN0cnVjdCBwbmVpZ2hfZW50cnkgKik7CkBAIC0xNzIsMTIgKzE3NSwxOCBAQAogCWF0b21pY190CQllbnRyaWVzOwogCXJ3bG9ja190CQlsb2NrOwogCXVuc2lnbmVkIGxvbmcJCWxhc3RfcmFuZDsKLQlzdHJ1Y3Qga21lbV9jYWNoZQkqa21lbV9jYWNoZXA7CiAJc3RydWN0IG5laWdoX3N0YXRpc3RpY3MJX19wZXJjcHUgKnN0YXRzOwogCXN0cnVjdCBuZWlnaF9oYXNoX3RhYmxlIF9fcmN1ICpuaHQ7CiAJc3RydWN0IHBuZWlnaF9lbnRyeQkqKnBoYXNoX2J1Y2tldHM7CiB9OwogCisjZGVmaW5lIE5FSUdIX1BSSVZfQUxJR04Jc2l6ZW9mKGxvbmcgbG9uZykKKworc3RhdGljIGlubGluZSB2b2lkICpuZWlnaGJvdXJfcHJpdihjb25zdCBzdHJ1Y3QgbmVpZ2hib3VyICpuKQoreworCXJldHVybiAoY2hhciAqKW4gKyBBTElHTihzaXplb2YoKm4pICsgbi0+dGJsLT5rZXlfbGVuLCBORUlHSF9QUklWX0FMSUdOKTsKK30KKwogLyogZmxhZ3MgZm9yIG5laWdoX3VwZGF0ZSgpICovCiAjZGVmaW5lIE5FSUdIX1VQREFURV9GX09WRVJSSURFCQkJMHgwMDAwMDAwMQogI2RlZmluZSBORUlHSF9VUERBVEVfRl9XRUFLX09WRVJSSURFCQkweDAwMDAwMDAyCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmggYi9pbmNsdWRlL25ldC9uZXRfbmFtZXNwYWNlLmgKaW5kZXggM2JiNmZhMC4uZWU1NDdjMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0X25hbWVzcGFjZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldF9uYW1lc3BhY2UuaApAQCAtNzcsNyArNzcsNyBAQAogCXN0cnVjdCBuZXRuc19wYWNrZXQJcGFja2V0OwogCXN0cnVjdCBuZXRuc191bml4CXVueDsKIAlzdHJ1Y3QgbmV0bnNfaXB2NAlpcHY0OwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJc3RydWN0IG5ldG5zX2lwdjYJaXB2NjsKICNlbmRpZgogI2lmIGRlZmluZWQoQ09ORklHX0lQX0RDQ1ApIHx8IGRlZmluZWQoQ09ORklHX0lQX0RDQ1BfTU9EVUxFKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaAppbmRleCA0ZTljNjNhLi40NjNhZThlIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuaApAQCAtMTUsOCArMTUsOCBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oPgogCiBzdHJ1Y3QgbmZfY29ubl9jb3VudGVyIHsKLQl1X2ludDY0X3QgcGFja2V0czsKLQl1X2ludDY0X3QgYnl0ZXM7CisJYXRvbWljNjRfdCBwYWNrZXRzOworCWF0b21pYzY0X3QgYnl0ZXM7CiB9OwogCiBzdGF0aWMgaW5saW5lCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuaAppbmRleCA0MjgzNTA4Li5hODhmYjY5IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2VjYWNoZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmgKQEAgLTY3LDE4ICs2NywxOCBAQAogCWludCAoKmZjbikodW5zaWduZWQgaW50IGV2ZW50cywgc3RydWN0IG5mX2N0X2V2ZW50ICppdGVtKTsKIH07CiAKLWV4dGVybiBzdHJ1Y3QgbmZfY3RfZXZlbnRfbm90aWZpZXIgX19yY3UgKm5mX2Nvbm50cmFja19ldmVudF9jYjsKLWV4dGVybiBpbnQgbmZfY29ubnRyYWNrX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBuZl9jdF9ldmVudF9ub3RpZmllciAqbmIpOwotZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5mX2N0X2V2ZW50X25vdGlmaWVyICpuYik7CitleHRlcm4gaW50IG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBuZl9jdF9ldmVudF9ub3RpZmllciAqbmIpOworZXh0ZXJuIHZvaWQgbmZfY29ubnRyYWNrX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmZfY3RfZXZlbnRfbm90aWZpZXIgKm5iKTsKIAogZXh0ZXJuIHZvaWQgbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKHN0cnVjdCBuZl9jb25uICpjdCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmZfY29ubnRyYWNrX2V2ZW50X2NhY2hlKGVudW0gaXBfY29ubnRyYWNrX2V2ZW50cyBldmVudCwgc3RydWN0IG5mX2Nvbm4gKmN0KQogeworCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CiAJc3RydWN0IG5mX2Nvbm50cmFja19lY2FjaGUgKmU7CiAKLQlpZiAobmZfY29ubnRyYWNrX2V2ZW50X2NiID09IE5VTEwpCisJaWYgKG5ldC0+Y3QubmZfY29ubnRyYWNrX2V2ZW50X2NiID09IE5VTEwpCiAJCXJldHVybjsKIAogCWUgPSBuZl9jdF9lY2FjaGVfZmluZChjdCk7CkBAIC05NSwxMSArOTUsMTIgQEAKIAkJCSAgICAgIGludCByZXBvcnQpCiB7CiAJaW50IHJldCA9IDA7CisJc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfbmV0KGN0KTsKIAlzdHJ1Y3QgbmZfY3RfZXZlbnRfbm90aWZpZXIgKm5vdGlmeTsKIAlzdHJ1Y3QgbmZfY29ubnRyYWNrX2VjYWNoZSAqZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlub3RpZnkgPSByY3VfZGVyZWZlcmVuY2UobmZfY29ubnRyYWNrX2V2ZW50X2NiKTsKKwlub3RpZnkgPSByY3VfZGVyZWZlcmVuY2UobmV0LT5jdC5uZl9jb25udHJhY2tfZXZlbnRfY2IpOwogCWlmIChub3RpZnkgPT0gTlVMTCkKIAkJZ290byBvdXRfdW5sb2NrOwogCkBAIC0xNjQsOSArMTY1LDggQEAKIAlpbnQgKCpmY24pKHVuc2lnbmVkIGludCBldmVudHMsIHN0cnVjdCBuZl9leHBfZXZlbnQgKml0ZW0pOwogfTsKIAotZXh0ZXJuIHN0cnVjdCBuZl9leHBfZXZlbnRfbm90aWZpZXIgX19yY3UgKm5mX2V4cGVjdF9ldmVudF9jYjsKLWV4dGVybiBpbnQgbmZfY3RfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBuZl9leHBfZXZlbnRfbm90aWZpZXIgKm5iKTsKLWV4dGVybiB2b2lkIG5mX2N0X2V4cGVjdF91bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBuZl9leHBfZXZlbnRfbm90aWZpZXIgKm5iKTsKK2V4dGVybiBpbnQgbmZfY3RfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IG5mX2V4cF9ldmVudF9ub3RpZmllciAqbmIpOworZXh0ZXJuIHZvaWQgbmZfY3RfZXhwZWN0X3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5ldCAqbmV0LCBzdHJ1Y3QgbmZfZXhwX2V2ZW50X25vdGlmaWVyICpuYik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZAogbmZfY3RfZXhwZWN0X2V2ZW50X3JlcG9ydChlbnVtIGlwX2Nvbm50cmFja19leHBlY3RfZXZlbnRzIGV2ZW50LApAQCAtMTc0LDExICsxNzQsMTIgQEAKIAkJCSAgdTMyIHBpZCwKIAkJCSAgaW50IHJlcG9ydCkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9leHBfbmV0KGV4cCk7CiAJc3RydWN0IG5mX2V4cF9ldmVudF9ub3RpZmllciAqbm90aWZ5OwogCXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5vdGlmeSA9IHJjdV9kZXJlZmVyZW5jZShuZl9leHBlY3RfZXZlbnRfY2IpOworCW5vdGlmeSA9IHJjdV9kZXJlZmVyZW5jZShuZXQtPmN0Lm5mX2V4cGVjdF9ldmVudF9jYik7CiAJaWYgKG5vdGlmeSA9PSBOVUxMKQogCQlnb3RvIG91dF91bmxvY2s7CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmggYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5oCmluZGV4IDBmOGE4YzUuLjQ2MTljYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19leHBlY3QuaApAQCAtOTEsNyArOTEsNiBAQAogCiB2b2lkIG5mX2N0X3JlbW92ZV9leHBlY3RhdGlvbnMoc3RydWN0IG5mX2Nvbm4gKmN0KTsKIHZvaWQgbmZfY3RfdW5leHBlY3RfcmVsYXRlZChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKTsKLXZvaWQgbmZfY3RfcmVtb3ZlX3VzZXJzcGFjZV9leHBlY3RhdGlvbnModm9pZCk7CiAKIC8qIEFsbG9jYXRlIHNwYWNlIGZvciBhbiBleHBlY3RhdGlvbjogdGhpcyBpcyBtYW5kYXRvcnkgYmVmb3JlIGNhbGxpbmcKICAgIG5mX2N0X2V4cGVjdF9yZWxhdGVkLiAgWW91IHdpbGwgaGF2ZSB0byBjYWxsIHB1dCBhZnRlcndhcmRzLiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oCmluZGV4IDJmOGZiNzcuLmFlYTNmODIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGUuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3R1cGxlLmgKQEAgLTEyLDcgKzEyLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9jb25udHJhY2tfdHVwbGVfY29tbW9uLmg+Ci0jaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQvbmZfbmF0Lmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdF9udWxscy5oPgogCiAvKiBBIGB0dXBsZScgaXMgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgaW5mb3JtYXRpb24gdG8gdW5pcXVlbHkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXQuaAppbmRleCBiODg3MmRmLi5iNGRlOTkwIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0LmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdC5oCkBAIC0xLDE0ICsxLDEyIEBACiAjaWZuZGVmIF9ORl9OQVRfSAogI2RlZmluZSBfTkZfTkFUX0gKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L25mX25hdC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZl9uYXQuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190dXBsZS5oPgogCi0jZGVmaW5lIE5GX05BVF9NQVBQSU5HX1RZUEVfTUFYX05BTUVMRU4gMTYKLQogZW51bSBuZl9uYXRfbWFuaXBfdHlwZSB7Ci0JSVBfTkFUX01BTklQX1NSQywKLQlJUF9OQVRfTUFOSVBfRFNUCisJTkZfTkFUX01BTklQX1NSQywKKwlORl9OQVRfTUFOSVBfRFNUCiB9OwogCiAvKiBTUkMgbWFuaXAgb2NjdXJzIFBPU1RfUk9VVElORyBvciBMT0NBTF9JTiAqLwpAQCAtNTIsNyArNTAsNyBAQAogCiAvKiBTZXQgdXAgdGhlIGluZm8gc3RydWN0dXJlIHRvIG1hcCBpbnRvIHRoaXMgcmFuZ2UuICovCiBleHRlcm4gdW5zaWduZWQgaW50IG5mX25hdF9zZXR1cF9pbmZvKHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJCQkgICAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlLAogCQkJCSAgICAgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKTsKIAogLyogSXMgdGhpcyB0dXBsZSBhbHJlYWR5IHRha2VuPyAobm90IGJ5IHVzKSovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5oCmluZGV4IDNkYzdiOTguLmIxM2Q4ZDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfY29yZS5oCkBAIC0yMCw3ICsyMCw3IEBACiBzdGF0aWMgaW5saW5lIGludCBuZl9uYXRfaW5pdGlhbGl6ZWQoc3RydWN0IG5mX2Nvbm4gKmN0LAogCQkJCSAgICAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcCkKIHsKLQlpZiAobWFuaXAgPT0gSVBfTkFUX01BTklQX1NSQykKKwlpZiAobWFuaXAgPT0gTkZfTkFUX01BTklQX1NSQykKIAkJcmV0dXJuIGN0LT5zdGF0dXMgJiBJUFNfU1JDX05BVF9ET05FOwogCWVsc2UKIAkJcmV0dXJuIGN0LT5zdGF0dXMgJiBJUFNfRFNUX05BVF9ET05FOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9wcm90b2NvbC5oIGIvaW5jbHVkZS9uZXQvbmV0ZmlsdGVyL25mX25hdF9wcm90b2NvbC5oCmluZGV4IDkzY2M5MGQuLjdiMGI1MTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9jb2wuaAorKysgYi9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvY29sLmgKQEAgLTQsMTQgKzQsMTIgQEAKICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX25hdC5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmg+CiAKLXN0cnVjdCBuZl9uYXRfcmFuZ2U7CitzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2U7CiAKIHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgewogCS8qIFByb3RvY29sIG51bWJlci4gKi8KIAl1bnNpZ25lZCBpbnQgcHJvdG9udW07CiAKLQlzdHJ1Y3QgbW9kdWxlICptZTsKLQogCS8qIFRyYW5zbGF0ZSBhIHBhY2tldCB0byB0aGUgdGFyZ2V0IGFjY29yZGluZyB0byBtYW5pcCB0eXBlLgogCSAgIFJldHVybiB0cnVlIGlmIHN1Y2NlZWRlZC4gKi8KIAlib29sICgqbWFuaXBfcGt0KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLApAQCAtMzAsMTUgKzI4LDEyIEBACiAJICAgcG9zc2libGUuICBQZXItcHJvdG9jb2wgcGFydCBvZiB0dXBsZSBpcyBpbml0aWFsaXplZCB0byB0aGUKIAkgICBpbmNvbWluZyBwYWNrZXQuICovCiAJdm9pZCAoKnVuaXF1ZV90dXBsZSkoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlLAogCQkJICAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKIAkJCSAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KTsKIAotCWludCAoKnJhbmdlX3RvX25sYXR0cikoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSk7Ci0KIAlpbnQgKCpubGF0dHJfdG9fcmFuZ2UpKHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCQkgICAgICAgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UpOworCQkJICAgICAgIHN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSAqcmFuZ2UpOwogfTsKIAogLyogUHJvdG9jb2wgcmVnaXN0cmF0aW9uLiAqLwpAQCAtNjEsMTQgKzU2LDEyIEBACiAJCQkJICBjb25zdCB1bmlvbiBuZl9jb25udHJhY2tfbWFuX3Byb3RvICptYXgpOwogCiBleHRlcm4gdm9pZCBuZl9uYXRfcHJvdG9fdW5pcXVlX3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSAqcmFuZ2UsCiAJCQkJICAgICAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0LAogCQkJCSAgICAgIHVfaW50MTZfdCAqcm92ZXIpOwogCi1leHRlcm4gaW50IG5mX25hdF9wcm90b19yYW5nZV90b19ubGF0dHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCQkJY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UpOwogZXh0ZXJuIGludCBuZl9uYXRfcHJvdG9fbmxhdHRyX3RvX3JhbmdlKHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCQkJCXN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKTsKKwkJCQkJc3RydWN0IG5mX25hdF9pcHY0X3JhbmdlICpyYW5nZSk7CiAKICNlbmRpZiAvKl9ORl9OQVRfUFJPVE9fSCovCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRmaWx0ZXIvbmZfdHByb3h5X2NvcmUuaCBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90cHJveHlfY29yZS5oCmluZGV4IGU1MDUzNTguLjc1Y2E5MjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90cHJveHlfY29yZS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldGZpbHRlci9uZl90cHJveHlfY29yZS5oCkBAIC0xMzEsNyArMTMxLDcgQEAKIAlyZXR1cm4gc2s7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIGlubGluZSBzdHJ1Y3Qgc29jayAqCiBuZl90cHJveHlfZ2V0X3NvY2tfdjYoc3RydWN0IG5ldCAqbmV0LCBjb25zdCB1OCBwcm90b2NvbCwKIAkJICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25ldG5zL2Nvbm50cmFjay5oIGIvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKaW5kZXggMDI0OTM5OS4uN2E5MTFlYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKKysrIGIvaW5jbHVkZS9uZXQvbmV0bnMvY29ubnRyYWNrLmgKQEAgLTE4LDYgKzE4LDggQEAKIAlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZAl1bmNvbmZpcm1lZDsKIAlzdHJ1Y3QgaGxpc3RfbnVsbHNfaGVhZAlkeWluZzsKIAlzdHJ1Y3QgaXBfY29ubnRyYWNrX3N0YXQgX19wZXJjcHUgKnN0YXQ7CisJc3RydWN0IG5mX2N0X2V2ZW50X25vdGlmaWVyIF9fcmN1ICpuZl9jb25udHJhY2tfZXZlbnRfY2I7CisJc3RydWN0IG5mX2V4cF9ldmVudF9ub3RpZmllciBfX3JjdSAqbmZfZXhwZWN0X2V2ZW50X2NiOwogCWludAkJCXN5c2N0bF9ldmVudHM7CiAJdW5zaWduZWQgaW50CQlzeXNjdGxfZXZlbnRzX3JldHJ5X3RpbWVvdXQ7CiAJaW50CQkJc3lzY3RsX2FjY3Q7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRucy9pcHY0LmggYi9pbmNsdWRlL25ldC9uZXRucy9pcHY0LmgKaW5kZXggZDc4NmI0Zi4uYmJkMDIzYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bnMvaXB2NC5oCisrKyBiL2luY2x1ZGUvbmV0L25ldG5zL2lwdjQuaApAQCAtNTUsNiArNTUsNyBAQAogCWludCBjdXJyZW50X3J0X2NhY2hlX3JlYnVpbGRfY291bnQ7CiAKIAl1bnNpZ25lZCBpbnQgc3lzY3RsX3BpbmdfZ3JvdXBfcmFuZ2VbMl07CisJbG9uZyBzeXNjdGxfdGNwX21lbVszXTsKIAogCWF0b21pY190IHJ0X2dlbmlkOwogCWF0b21pY190IGRldl9hZGRyX2dlbmlkOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0bnMvbWliLmggYi9pbmNsdWRlL25ldC9uZXRucy9taWIuaAppbmRleCAwYjQ0MTEyLi5kNTQyYTRiIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZXRucy9taWIuaAorKysgYi9pbmNsdWRlL25ldC9uZXRucy9taWIuaApAQCAtMTAsMTUgKzEwLDE1IEBACiAJREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgdWRwX21pYiwgdWRwX3N0YXRpc3RpY3MpOwogCURFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcGxpdGVfc3RhdGlzdGljcyk7CiAJREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaWNtcF9taWIsIGljbXBfc3RhdGlzdGljcyk7Ci0JREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaWNtcG1zZ19taWIsIGljbXBtc2dfc3RhdGlzdGljcyk7CisJREVGSU5FX1NOTVBfU1RBVF9BVE9NSUMoc3RydWN0IGljbXBtc2dfbWliLCBpY21wbXNnX3N0YXRpc3RpY3MpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2NfbmV0X2RldnNubXA2OwogCURFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcF9zdGF0c19pbjYpOwogCURFRklORV9TTk1QX1NUQVQoc3RydWN0IHVkcF9taWIsIHVkcGxpdGVfc3RhdHNfaW42KTsKIAlERUZJTkVfU05NUF9TVEFUKHN0cnVjdCBpcHN0YXRzX21pYiwgaXB2Nl9zdGF0aXN0aWNzKTsKIAlERUZJTkVfU05NUF9TVEFUKHN0cnVjdCBpY21wdjZfbWliLCBpY21wdjZfc3RhdGlzdGljcyk7Ci0JREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgaWNtcHY2bXNnX21pYiwgaWNtcHY2bXNnX3N0YXRpc3RpY3MpOworCURFRklORV9TTk1QX1NUQVRfQVRPTUlDKHN0cnVjdCBpY21wdjZtc2dfbWliLCBpY21wdjZtc2dfc3RhdGlzdGljcyk7CiAjZW5kaWYKICNpZmRlZiBDT05GSUdfWEZSTV9TVEFUSVNUSUNTCiAJREVGSU5FX1NOTVBfU1RBVChzdHJ1Y3QgbGludXhfeGZybV9taWIsIHhmcm1fc3RhdGlzdGljcyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9uZXRucy94ZnJtLmggYi9pbmNsdWRlL25ldC9uZXRucy94ZnJtLmgKaW5kZXggNzQ4ZjkxZi4uNTI5OWU2OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmV0bnMveGZybS5oCisrKyBiL2luY2x1ZGUvbmV0L25ldG5zL3hmcm0uaApAQCAtNTYsNyArNTYsNyBAQAogI2VuZGlmCiAKIAlzdHJ1Y3QgZHN0X29wcwkJeGZybTRfZHN0X29wczsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCXN0cnVjdCBkc3Rfb3BzCQl4ZnJtNl9kc3Rfb3BzOwogI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmV0cHJpb19jZ3JvdXAuaCBiL2luY2x1ZGUvbmV0L25ldHByaW9fY2dyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwM2I4NwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbmV0L25ldHByaW9fY2dyb3VwLmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIG5ldHByaW9fY2dyb3VwLmgJCQlDb250cm9sIEdyb3VwIFByaW9yaXR5IHNldAorICoKKyAqCisgKiBBdXRob3JzOglOZWlsIEhvcm1hbiA8bmhvcm1hbkB0dXhkcml2ZXIuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICogYW55IGxhdGVyIHZlcnNpb24uCisgKgorICovCisKKyNpZm5kZWYgX05FVFBSSU9fQ0dST1VQX0gKKyNkZWZpbmUgX05FVFBSSU9fQ0dST1VQX0gKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKworCitzdHJ1Y3QgbmV0cHJpb19tYXAgeworCXN0cnVjdCByY3VfaGVhZCByY3U7CisJdTMyIHByaW9tYXBfbGVuOworCXUzMiBwcmlvbWFwW107Cit9OworCisjaWZkZWYgQ09ORklHX0NHUk9VUFMKKworc3RydWN0IGNncm91cF9uZXRwcmlvX3N0YXRlIHsKKwlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSBjc3M7CisJdTMyIHByaW9pZHg7Cit9OworCisjaWZuZGVmIENPTkZJR19ORVRQUklPX0NHUk9VUAorZXh0ZXJuIGludCBuZXRfcHJpb19zdWJzeXNfaWQ7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgc29ja191cGRhdGVfbmV0cHJpb2lkeChzdHJ1Y3Qgc29jayAqc2spOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjZ3JvdXBfbmV0cHJpb19zdGF0ZQorCQkqdGFza19uZXRwcmlvX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRQUklPX0NHUk9VUCkKKwlyZXR1cm4gY29udGFpbmVyX29mKHRhc2tfc3Vic3lzX3N0YXRlKHAsIG5ldF9wcmlvX3N1YnN5c19pZCksCisJCQkgICAgc3RydWN0IGNncm91cF9uZXRwcmlvX3N0YXRlLCBjc3MpOworI2Vsc2UKKwlyZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCisjZWxzZQorCisjZGVmaW5lIHNvY2tfdXBkYXRlX25ldHByaW9pZHgoc2spCisjZW5kaWYKKworI2VuZGlmICAvKiBfTkVUX0NMU19DR1JPVVBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvbmZjL25jaS5oIGIvaW5jbHVkZS9uZXQvbmZjL25jaS5oCmluZGV4IDM5Yjg1YmMuLjJiZTk1ZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L25mYy9uY2kuaAorKysgYi9pbmNsdWRlL25ldC9uZmMvbmNpLmgKQEAgLTM0LDMyICszNCwzMCBAQAogI2RlZmluZSBOQ0lfTUFYX05VTV9DT05OCQkJCQkxMAogCiAvKiBOQ0kgU3RhdHVzIENvZGVzICovCi0jZGVmaW5lCU5DSV9TVEFUVVNfT0sJCQkJCQkweDAwCi0jZGVmaW5lCU5DSV9TVEFUVVNfUkVKRUNURUQJCQkJCTB4MDEKLSNkZWZpbmUJTkNJX1NUQVRVU19NRVNTQUdFX0NPUlJVUFRFRAkJCQkweDAyCi0jZGVmaW5lCU5DSV9TVEFUVVNfQlVGRkVSX0ZVTEwJCQkJCTB4MDMKLSNkZWZpbmUJTkNJX1NUQVRVU19GQUlMRUQJCQkJCTB4MDQKLSNkZWZpbmUJTkNJX1NUQVRVU19OT1RfSU5JVElBTElaRUQJCQkJMHgwNQotI2RlZmluZQlOQ0lfU1RBVFVTX1NZTlRBWF9FUlJPUgkJCQkJMHgwNgotI2RlZmluZQlOQ0lfU1RBVFVTX1NFTUFOVElDX0VSUk9SCQkJCTB4MDcKLSNkZWZpbmUJTkNJX1NUQVRVU19VTktOT1dOX0dJRAkJCQkJMHgwOAotI2RlZmluZQlOQ0lfU1RBVFVTX1VOS05PV05fT0lECQkJCQkweDA5Ci0jZGVmaW5lCU5DSV9TVEFUVVNfSU5WQUxJRF9QQVJBTQkJCQkweDBhCi0jZGVmaW5lCU5DSV9TVEFUVVNfTUVTU0FHRV9TSVpFX0VYQ0VFREVECQkJMHgwYgorI2RlZmluZSBOQ0lfU1RBVFVTX09LCQkJCQkJMHgwMAorI2RlZmluZSBOQ0lfU1RBVFVTX1JFSkVDVEVECQkJCQkweDAxCisjZGVmaW5lIE5DSV9TVEFUVVNfUkZfRlJBTUVfQ09SUlVQVEVECQkJCTB4MDIKKyNkZWZpbmUgTkNJX1NUQVRVU19GQUlMRUQJCQkJCTB4MDMKKyNkZWZpbmUgTkNJX1NUQVRVU19OT1RfSU5JVElBTElaRUQJCQkJMHgwNAorI2RlZmluZSBOQ0lfU1RBVFVTX1NZTlRBWF9FUlJPUgkJCQkJMHgwNQorI2RlZmluZSBOQ0lfU1RBVFVTX1NFTUFOVElDX0VSUk9SCQkJCTB4MDYKKyNkZWZpbmUgTkNJX1NUQVRVU19VTktOT1dOX0dJRAkJCQkJMHgwNworI2RlZmluZSBOQ0lfU1RBVFVTX1VOS05PV05fT0lECQkJCQkweDA4CisjZGVmaW5lIE5DSV9TVEFUVVNfSU5WQUxJRF9QQVJBTQkJCQkweDA5CisjZGVmaW5lIE5DSV9TVEFUVVNfTUVTU0FHRV9TSVpFX0VYQ0VFREVECQkJMHgwYQogLyogRGlzY292ZXJ5IFNwZWNpZmljIFN0YXR1cyBDb2RlcyAqLwotI2RlZmluZQlOQ0lfU1RBVFVTX0RJU0NPVkVSWV9BTFJFQURZX1NUQVJURUQJCQkweGEwCi0jZGVmaW5lCU5DSV9TVEFUVVNfRElTQ09WRVJZX1RBUkdFVF9BQ1RJVkFUSU9OX0ZBSUxFRAkJMHhhMQorI2RlZmluZSBOQ0lfU1RBVFVTX0RJU0NPVkVSWV9BTFJFQURZX1NUQVJURUQJCQkweGEwCisjZGVmaW5lIE5DSV9TVEFUVVNfRElTQ09WRVJZX1RBUkdFVF9BQ1RJVkFUSU9OX0ZBSUxFRAkJMHhhMQorI2RlZmluZSBOQ0lfU1RBVFVTX0RJU0NPVkVSWV9URUFSX0RPV04JCQkJMHhhMgogLyogUkYgSW50ZXJmYWNlIFNwZWNpZmljIFN0YXR1cyBDb2RlcyAqLwotI2RlZmluZQlOQ0lfU1RBVFVTX1JGX1RSQU5TTUlTU0lPTl9FUlJPUgkJCTB4YjAKLSNkZWZpbmUJTkNJX1NUQVRVU19SRl9QUk9UT0NPTF9FUlJPUgkJCQkweGIxCi0jZGVmaW5lCU5DSV9TVEFUVVNfUkZfVElNRU9VVF9FUlJPUgkJCQkweGIyCi0jZGVmaW5lCU5DSV9TVEFUVVNfUkZfTElOS19MT1NTX0VSUk9SCQkJCTB4YjMKKyNkZWZpbmUgTkNJX1NUQVRVU19SRl9UUkFOU01JU1NJT05fRVJST1IJCQkweGIwCisjZGVmaW5lIE5DSV9TVEFUVVNfUkZfUFJPVE9DT0xfRVJST1IJCQkJMHhiMQorI2RlZmluZSBOQ0lfU1RBVFVTX1JGX1RJTUVPVVRfRVJST1IJCQkJMHhiMgogLyogTkZDRUUgSW50ZXJmYWNlIFNwZWNpZmljIFN0YXR1cyBDb2RlcyAqLwotI2RlZmluZQlOQ0lfU1RBVFVTX01BWF9BQ1RJVkVfTkZDRUVfSU5URVJGQUNFU19SRUFDSEVECQkweGMwCi0jZGVmaW5lCU5DSV9TVEFUVVNfTkZDRUVfSU5URVJGQUNFX0FDVElWQVRJT05fRkFJTEVECQkweGMxCi0jZGVmaW5lCU5DSV9TVEFUVVNfTkZDRUVfVFJBTlNNSVNTSU9OX0VSUk9SCQkJMHhjMgotI2RlZmluZQlOQ0lfU1RBVFVTX05GQ0VFX1BST1RPQ09MX0VSUk9SCQkJCTB4YzMKLSNkZWZpbmUgTkNJX1NUQVRVU19ORkNFRV9USU1FT1VUX0VSUk9SCQkJCTB4YzQKKyNkZWZpbmUgTkNJX1NUQVRVU19ORkNFRV9JTlRFUkZBQ0VfQUNUSVZBVElPTl9GQUlMRUQJCTB4YzAKKyNkZWZpbmUgTkNJX1NUQVRVU19ORkNFRV9UUkFOU01JU1NJT05fRVJST1IJCQkweGMxCisjZGVmaW5lIE5DSV9TVEFUVVNfTkZDRUVfUFJPVE9DT0xfRVJST1IJCQkJMHhjMgorI2RlZmluZSBOQ0lfU1RBVFVTX05GQ0VFX1RJTUVPVVRfRVJST1IJCQkJMHhjMwogCiAvKiBOQ0kgUkYgVGVjaG5vbG9neSBhbmQgTW9kZSAqLwogI2RlZmluZSBOQ0lfTkZDX0FfUEFTU0lWRV9QT0xMX01PREUJCQkJMHgwMApAQCAtNjcsMTEgKzY1LDI4IEBACiAjZGVmaW5lIE5DSV9ORkNfRl9QQVNTSVZFX1BPTExfTU9ERQkJCQkweDAyCiAjZGVmaW5lIE5DSV9ORkNfQV9BQ1RJVkVfUE9MTF9NT0RFCQkJCTB4MDMKICNkZWZpbmUgTkNJX05GQ19GX0FDVElWRV9QT0xMX01PREUJCQkJMHgwNQorI2RlZmluZSBOQ0lfTkZDXzE1NjkzX1BBU1NJVkVfUE9MTF9NT0RFCQkJCTB4MDYKICNkZWZpbmUgTkNJX05GQ19BX1BBU1NJVkVfTElTVEVOX01PREUJCQkJMHg4MAogI2RlZmluZSBOQ0lfTkZDX0JfUEFTU0lWRV9MSVNURU5fTU9ERQkJCQkweDgxCiAjZGVmaW5lIE5DSV9ORkNfRl9QQVNTSVZFX0xJU1RFTl9NT0RFCQkJCTB4ODIKICNkZWZpbmUgTkNJX05GQ19BX0FDVElWRV9MSVNURU5fTU9ERQkJCQkweDgzCiAjZGVmaW5lIE5DSV9ORkNfRl9BQ1RJVkVfTElTVEVOX01PREUJCQkJMHg4NQorI2RlZmluZSBOQ0lfTkZDXzE1NjkzX1BBU1NJVkVfTElTVEVOX01PREUJCQkweDg2CisKKy8qIE5DSSBSRiBUZWNobm9sb2dpZXMgKi8KKyNkZWZpbmUgTkNJX05GQ19SRl9URUNITk9MT0dZX0EJCQkJCTB4MDAKKyNkZWZpbmUgTkNJX05GQ19SRl9URUNITk9MT0dZX0IJCQkJCTB4MDEKKyNkZWZpbmUgTkNJX05GQ19SRl9URUNITk9MT0dZX0YJCQkJCTB4MDIKKyNkZWZpbmUgTkNJX05GQ19SRl9URUNITk9MT0dZXzE1NjkzCQkJCTB4MDMKKworLyogTkNJIEJpdCBSYXRlcyAqLworI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzEwNgkJCQkJMHgwMAorI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzIxMgkJCQkJMHgwMQorI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzQyNAkJCQkJMHgwMgorI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzg0OAkJCQkJMHgwMworI2RlZmluZSBOQ0lfTkZDX0JJVF9SQVRFXzE2OTUJCQkJCTB4MDQKKyNkZWZpbmUgTkNJX05GQ19CSVRfUkFURV8zMzkwCQkJCQkweDA1CisjZGVmaW5lIE5DSV9ORkNfQklUX1JBVEVfNjc4MAkJCQkJMHgwNgogCiAvKiBOQ0kgUkYgUHJvdG9jb2xzICovCiAjZGVmaW5lIE5DSV9SRl9QUk9UT0NPTF9VTktOT1dOCQkJCQkweDAwCkBAIC04MiwzNyArOTcsMzAgQEAKICNkZWZpbmUgTkNJX1JGX1BST1RPQ09MX05GQ19ERVAJCQkJCTB4MDUKIAogLyogTkNJIFJGIEludGVyZmFjZXMgKi8KLSNkZWZpbmUgTkNJX1JGX0lOVEVSRkFDRV9SRlUJCQkJCTB4MDAKLSNkZWZpbmUJTkNJX1JGX0lOVEVSRkFDRV9GUkFNRQkJCQkJMHgwMQotI2RlZmluZQlOQ0lfUkZfSU5URVJGQUNFX0lTT19ERVAJCQkJMHgwMgotI2RlZmluZQlOQ0lfUkZfSU5URVJGQUNFX05GQ19ERVAJCQkJMHgwMworI2RlZmluZSBOQ0lfUkZfSU5URVJGQUNFX05GQ0VFX0RJUkVDVAkJCQkweDAwCisjZGVmaW5lIE5DSV9SRl9JTlRFUkZBQ0VfRlJBTUUJCQkJCTB4MDEKKyNkZWZpbmUgTkNJX1JGX0lOVEVSRkFDRV9JU09fREVQCQkJCTB4MDIKKyNkZWZpbmUgTkNJX1JGX0lOVEVSRkFDRV9ORkNfREVQCQkJCTB4MDMKKworLyogTkNJIFJlc2V0IHR5cGVzICovCisjZGVmaW5lIE5DSV9SRVNFVF9UWVBFX0tFRVBfQ09ORklHCQkJCTB4MDAKKyNkZWZpbmUgTkNJX1JFU0VUX1RZUEVfUkVTRVRfQ09ORklHCQkJCTB4MDEKKworLyogTkNJIFN0YXRpYyBSRiBjb25uZWN0aW9uIElEICovCisjZGVmaW5lIE5DSV9TVEFUSUNfUkZfQ09OTl9JRAkJCQkJMHgwMAorCisvKiBOQ0kgRGF0YSBGbG93IENvbnRyb2wgKi8KKyNkZWZpbmUgTkNJX0RBVEFfRkxPV19DT05UUk9MX05PVF9VU0VECQkJCTB4ZmYKIAogLyogTkNJIFJGX0RJU0NPVkVSX01BUF9DTUQgbW9kZXMgKi8KICNkZWZpbmUgTkNJX0RJU0NfTUFQX01PREVfUE9MTAkJCQkJMHgwMQogI2RlZmluZSBOQ0lfRElTQ19NQVBfTU9ERV9MSVNURU4JCQkJMHgwMgotI2RlZmluZSBOQ0lfRElTQ19NQVBfTU9ERV9CT1RICQkJCQkweDAzCi0KLS8qIE5DSSBEaXNjb3ZlcnkgVHlwZXMgKi8KLSNkZWZpbmUgTkNJX0RJU0NPVkVSWV9UWVBFX1BPTExfQV9QQVNTSVZFCQkJMHgwMAotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfUE9MTF9CX1BBU1NJVkUJCQkweDAxCi0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9QT0xMX0ZfUEFTU0lWRQkJCTB4MDIKLSNkZWZpbmUJTkNJX0RJU0NPVkVSWV9UWVBFX1BPTExfQV9BQ1RJVkUJCQkweDAzCi0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9QT0xMX0ZfQUNUSVZFCQkJMHgwNQotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfV0FLRVVQX0FfUEFTU0lWRQkJCTB4MDYKLSNkZWZpbmUJTkNJX0RJU0NPVkVSWV9UWVBFX1dBS0VVUF9CX1BBU1NJVkUJCQkweDA3Ci0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9XQUtFVVBfQV9BQ1RJVkUJCQkweDA5Ci0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fQV9QQVNTSVZFCQkJMHg4MAotI2RlZmluZQlOQ0lfRElTQ09WRVJZX1RZUEVfTElTVEVOX0JfUEFTU0lWRQkJCTB4ODEKLSNkZWZpbmUJTkNJX0RJU0NPVkVSWV9UWVBFX0xJU1RFTl9GX1BBU1NJVkUJCQkweDgyCi0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fQV9BQ1RJVkUJCQkweDgzCi0jZGVmaW5lCU5DSV9ESVNDT1ZFUllfVFlQRV9MSVNURU5fRl9BQ1RJVkUJCQkweDg1CiAKIC8qIE5DSSBEZWFjdGl2YXRpb24gVHlwZSAqLwotI2RlZmluZQlOQ0lfREVBQ1RJVkFURV9UWVBFX0lETEVfTU9ERQkJCQkweDAwCi0jZGVmaW5lCU5DSV9ERUFDVElWQVRFX1RZUEVfU0xFRVBfTU9ERQkJCQkweDAxCi0jZGVmaW5lCU5DSV9ERUFDVElWQVRFX1RZUEVfU0xFRVBfQUZfTU9ERQkJCTB4MDIKLSNkZWZpbmUJTkNJX0RFQUNUSVZBVEVfVFlQRV9SRl9MSU5LX0xPU1MJCQkweDAzCi0jZGVmaW5lCU5DSV9ERUFDVElWQVRFX1RZUEVfRElTQ09WRVJZX0VSUk9SCQkJMHgwNAorI2RlZmluZSBOQ0lfREVBQ1RJVkFURV9UWVBFX0lETEVfTU9ERQkJCQkweDAwCisjZGVmaW5lIE5DSV9ERUFDVElWQVRFX1RZUEVfU0xFRVBfTU9ERQkJCQkweDAxCisjZGVmaW5lIE5DSV9ERUFDVElWQVRFX1RZUEVfU0xFRVBfQUZfTU9ERQkJCTB4MDIKKyNkZWZpbmUgTkNJX0RFQUNUSVZBVEVfVFlQRV9ESVNDT1ZFUlkJCQkJMHgwMwogCiAvKiBNZXNzYWdlIFR5cGUgKE1UKSAqLwogI2RlZmluZSBOQ0lfTVRfREFUQV9QS1QJCQkJCQkweDAwCkBAIC0xNDQsMTAgKzE1MiwxMCBAQAogI2RlZmluZSBuY2lfY29ubl9pZChoZHIpCQkoX191OCkoKChoZHIpWzBdKSYweDBmKQogCiAvKiBHSUQgdmFsdWVzICovCi0jZGVmaW5lCU5DSV9HSURfQ09SRQkJCQkJCTB4MAotI2RlZmluZQlOQ0lfR0lEX1JGX01HTVQJCQkJCQkweDEKLSNkZWZpbmUJTkNJX0dJRF9ORkNFRV9NR01UCQkJCQkweDIKLSNkZWZpbmUJTkNJX0dJRF9QUk9QUklFVEFSWQkJCQkJMHhmCisjZGVmaW5lIE5DSV9HSURfQ09SRQkJCQkJCTB4MAorI2RlZmluZSBOQ0lfR0lEX1JGX01HTVQJCQkJCQkweDEKKyNkZWZpbmUgTkNJX0dJRF9ORkNFRV9NR01UCQkJCQkweDIKKyNkZWZpbmUgTkNJX0dJRF9QUk9QUklFVEFSWQkJCQkJMHhmCiAKIC8qIC0tLS0gTkNJIFBhY2tldCBzdHJ1Y3R1cmVzIC0tLS0gKi8KICNkZWZpbmUgTkNJX0NUUkxfSERSX1NJWkUJCQkJCTMKQEAgLTE2OSwyNCArMTc3LDE3IEBACiAvKiAtLS0tLSAgTkNJIENvbW1hbmRzIC0tLS0gKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwogI2RlZmluZSBOQ0lfT1BfQ09SRV9SRVNFVF9DTUQJCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDApCi0KLSNkZWZpbmUgTkNJX09QX0NPUkVfSU5JVF9DTUQJCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDEpCi0KLSNkZWZpbmUgTkNJX09QX0NPUkVfU0VUX0NPTkZJR19DTUQJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwMikKLQotI2RlZmluZSBOQ0lfT1BfQ09SRV9DT05OX0NSRUFURV9DTUQJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwNCkKLXN0cnVjdCBuY2lfY29yZV9jb25uX2NyZWF0ZV9jbWQgewotCV9fdTgJdGFyZ2V0X2hhbmRsZTsKLQlfX3U4CW51bV90YXJnZXRfc3BlY2lmaWNfcGFyYW1zOworc3RydWN0IG5jaV9jb3JlX3Jlc2V0X2NtZCB7CisJX191OAlyZXNldF90eXBlOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBOQ0lfT1BfQ09SRV9DT05OX0NMT1NFX0NNRAluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9DT1JFLCAweDA2KQorI2RlZmluZSBOQ0lfT1BfQ09SRV9JTklUX0NNRAkJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwMSkKIAogI2RlZmluZSBOQ0lfT1BfUkZfRElTQ09WRVJfTUFQX0NNRAluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9SRl9NR01ULCAweDAwKQogc3RydWN0IGRpc2NfbWFwX2NvbmZpZyB7CiAJX191OAlyZl9wcm90b2NvbDsKIAlfX3U4CW1vZGU7Ci0JX191OAlyZl9pbnRlcmZhY2VfdHlwZTsKKwlfX3U4CXJmX2ludGVyZmFjZTsKIH0gX19wYWNrZWQ7CiAKIHN0cnVjdCBuY2lfcmZfZGlzY19tYXBfY21kIHsKQEAgLTE5Nyw3ICsxOTgsNyBAQAogCiAjZGVmaW5lIE5DSV9PUF9SRl9ESVNDT1ZFUl9DTUQJCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX1JGX01HTVQsIDB4MDMpCiBzdHJ1Y3QgZGlzY19jb25maWcgewotCV9fdTgJdHlwZTsKKwlfX3U4CXJmX3RlY2hfYW5kX21vZGU7CiAJX191OAlmcmVxdWVuY3k7CiB9IF9fcGFja2VkOwogCkBAIC0yMTgsNiArMjE5LDcgQEAKIHN0cnVjdCBuY2lfY29yZV9yZXNldF9yc3AgewogCV9fdTgJc3RhdHVzOwogCV9fdTgJbmNpX3ZlcjsKKwlfX3U4CWNvbmZpZ19zdGF0dXM7CiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIE5DSV9PUF9DT1JFX0lOSVRfUlNQCQluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9DT1JFLCAweDAxKQpAQCAtMjMyLDI0ICsyMzQsMTIgQEAKIHN0cnVjdCBuY2lfY29yZV9pbml0X3JzcF8yIHsKIAlfX3U4CW1heF9sb2dpY2FsX2Nvbm5lY3Rpb25zOwogCV9fbGUxNgltYXhfcm91dGluZ190YWJsZV9zaXplOwotCV9fdTgJbWF4X2NvbnRyb2xfcGFja2V0X3BheWxvYWRfbGVuZ3RoOwotCV9fbGUxNglyZl9zZW5kaW5nX2J1ZmZlcl9zaXplOwotCV9fbGUxNglyZl9yZWNlaXZpbmdfYnVmZmVyX3NpemU7Ci0JX19sZTE2CW1hbnVmYWN0dXJlcl9pZDsKKwlfX3U4CW1heF9jdHJsX3BrdF9wYXlsb2FkX2xlbjsKKwlfX2xlMTYJbWF4X3NpemVfZm9yX2xhcmdlX3BhcmFtczsKKwlfX3U4CW1hbnVmYWN0X2lkOworCV9fbGUzMgltYW51ZmFjdF9zcGVjaWZpY19pbmZvOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBOQ0lfT1BfQ09SRV9TRVRfQ09ORklHX1JTUAluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9DT1JFLCAweDAyKQotCi0jZGVmaW5lIE5DSV9PUF9DT1JFX0NPTk5fQ1JFQVRFX1JTUAluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9DT1JFLCAweDA0KQotc3RydWN0IG5jaV9jb3JlX2Nvbm5fY3JlYXRlX3JzcCB7Ci0JX191OAlzdGF0dXM7Ci0JX191OAltYXhfcGt0X3BheWxvYWRfc2l6ZTsKLQlfX3U4CWluaXRpYWxfbnVtX2NyZWRpdHM7Ci0JX191OAljb25uX2lkOwotfSBfX3BhY2tlZDsKLQotI2RlZmluZSBOQ0lfT1BfQ09SRV9DT05OX0NMT1NFX1JTUAluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9DT1JFLCAweDA2KQotCiAjZGVmaW5lIE5DSV9PUF9SRl9ESVNDT1ZFUl9NQVBfUlNQCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX1JGX01HTVQsIDB4MDApCiAKICNkZWZpbmUgTkNJX09QX1JGX0RJU0NPVkVSX1JTUAkJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfUkZfTUdNVCwgMHgwMykKQEAgLTI1OSw3ICsyNDksNyBAQAogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAvKiAtLS0tIE5DSSBOb3RpZmljYXRpb25zIC0tLS0gKi8KIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotI2RlZmluZSBOQ0lfT1BfQ09SRV9DT05OX0NSRURJVFNfTlRGCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDcpCisjZGVmaW5lIE5DSV9PUF9DT1JFX0NPTk5fQ1JFRElUU19OVEYJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwNikKIHN0cnVjdCBjb25uX2NyZWRpdF9lbnRyeSB7CiAJX191OAljb25uX2lkOwogCV9fdTgJY3JlZGl0czsKQEAgLTI3MCwxMiArMjYwLDEzIEBACiAJc3RydWN0IGNvbm5fY3JlZGl0X2VudHJ5CWNvbm5fZW50cmllc1tOQ0lfTUFYX05VTV9DT05OXTsKIH0gX19wYWNrZWQ7CiAKLSNkZWZpbmUgTkNJX09QX1JGX0ZJRUxEX0lORk9fTlRGCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX0NPUkUsIDB4MDgpCi1zdHJ1Y3QgbmNpX3JmX2ZpZWxkX2luZm9fbnRmIHsKLQlfX3U4CXJmX2ZpZWxkX3N0YXR1czsKKyNkZWZpbmUgTkNJX09QX0NPUkVfSU5URl9FUlJPUl9OVEYJbmNpX29wY29kZV9wYWNrKE5DSV9HSURfQ09SRSwgMHgwOCkKK3N0cnVjdCBuY2lfY29yZV9pbnRmX2Vycm9yX250ZiB7CisJX191OAlzdGF0dXM7CisJX191OAljb25uX2lkOwogfSBfX3BhY2tlZDsKIAotI2RlZmluZSBOQ0lfT1BfUkZfQUNUSVZBVEVfTlRGCQluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9SRl9NR01ULCAweDA1KQorI2RlZmluZSBOQ0lfT1BfUkZfSU5URl9BQ1RJVkFURURfTlRGCW5jaV9vcGNvZGVfcGFjayhOQ0lfR0lEX1JGX01HTVQsIDB4MDUpCiBzdHJ1Y3QgcmZfdGVjaF9zcGVjaWZpY19wYXJhbXNfbmZjYV9wb2xsIHsKIAlfX3UxNglzZW5zX3JlczsKIAlfX3U4CW5mY2lkMV9sZW47CS8qIDAsIDQsIDcsIG9yIDEwIEJ5dGVzICovCkBAIC0yODksMTcgKzI4MCwyMiBAQAogCV9fdTgJcmF0c19yZXNbMjBdOwogfTsKIAotc3RydWN0IG5jaV9yZl9hY3RpdmF0ZV9udGYgewotCV9fdTgJdGFyZ2V0X2hhbmRsZTsKK3N0cnVjdCBuY2lfcmZfaW50Zl9hY3RpdmF0ZWRfbnRmIHsKKwlfX3U4CXJmX2Rpc2NvdmVyeV9pZDsKKwlfX3U4CXJmX2ludGVyZmFjZTsKIAlfX3U4CXJmX3Byb3RvY29sOwotCV9fdTgJcmZfdGVjaF9hbmRfbW9kZTsKKwlfX3U4CWFjdGl2YXRpb25fcmZfdGVjaF9hbmRfbW9kZTsKKwlfX3U4CW1heF9kYXRhX3BrdF9wYXlsb2FkX3NpemU7CisJX191OAlpbml0aWFsX251bV9jcmVkaXRzOwogCV9fdTgJcmZfdGVjaF9zcGVjaWZpY19wYXJhbXNfbGVuOwogCiAJdW5pb24gewogCQlzdHJ1Y3QgcmZfdGVjaF9zcGVjaWZpY19wYXJhbXNfbmZjYV9wb2xsIG5mY2FfcG9sbDsKIAl9IHJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zOwogCi0JX191OAlyZl9pbnRlcmZhY2VfdHlwZTsKKwlfX3U4CWRhdGFfZXhjaF9yZl90ZWNoX2FuZF9tb2RlOworCV9fdTgJZGF0YV9leGNoX3R4X2JpdF9yYXRlOworCV9fdTgJZGF0YV9leGNoX3J4X2JpdF9yYXRlOwogCV9fdTgJYWN0aXZhdGlvbl9wYXJhbXNfbGVuOwogCiAJdW5pb24gewpAQCAtMzA5LDUgKzMwNSw5IEBACiB9IF9fcGFja2VkOwogCiAjZGVmaW5lIE5DSV9PUF9SRl9ERUFDVElWQVRFX05URgluY2lfb3Bjb2RlX3BhY2soTkNJX0dJRF9SRl9NR01ULCAweDA2KQorc3RydWN0IG5jaV9yZl9kZWFjdGl2YXRlX250ZiB7CisJX191OAl0eXBlOworCV9fdTgJcmVhc29uOworfSBfX3BhY2tlZDsKIAogI2VuZGlmIC8qIF9fTkNJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25mYy9uY2lfY29yZS5oIGIvaW5jbHVkZS9uZXQvbmZjL25jaV9jb3JlLmgKaW5kZXggYjhiNGJiZC4uYmNjZDg5ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvbmZjL25jaV9jb3JlLmgKKysrIGIvaW5jbHVkZS9uZXQvbmZjL25jaV9jb3JlLmgKQEAgLTEwOSwxNSArMTA5LDE0IEBACiAJCQkJW05DSV9NQVhfU1VQUE9SVEVEX1JGX0lOVEVSRkFDRVNdOwogCV9fdTgJCQltYXhfbG9naWNhbF9jb25uZWN0aW9uczsKIAlfX3UxNgkJCW1heF9yb3V0aW5nX3RhYmxlX3NpemU7Ci0JX191OAkJCW1heF9jb250cm9sX3BhY2tldF9wYXlsb2FkX2xlbmd0aDsKLQlfX3UxNgkJCXJmX3NlbmRpbmdfYnVmZmVyX3NpemU7Ci0JX191MTYJCQlyZl9yZWNlaXZpbmdfYnVmZmVyX3NpemU7Ci0JX191MTYJCQltYW51ZmFjdHVyZXJfaWQ7CisJX191OAkJCW1heF9jdHJsX3BrdF9wYXlsb2FkX2xlbjsKKwlfX3UxNgkJCW1heF9zaXplX2Zvcl9sYXJnZV9wYXJhbXM7CisJX191OAkJCW1hbnVmYWN0X2lkOworCV9fdTMyCQkJbWFudWZhY3Rfc3BlY2lmaWNfaW5mbzsKIAotCS8qIHJlY2VpdmVkIGR1cmluZyBOQ0lfT1BfQ09SRV9DT05OX0NSRUFURV9SU1AgZm9yIHN0YXRpYyBjb25uIDAgKi8KLQlfX3U4CQkJbWF4X3BrdF9wYXlsb2FkX3NpemU7CisJLyogcmVjZWl2ZWQgZHVyaW5nIE5DSV9PUF9SRl9JTlRGX0FDVElWQVRFRF9OVEYgKi8KKwlfX3U4CQkJbWF4X2RhdGFfcGt0X3BheWxvYWRfc2l6ZTsKIAlfX3U4CQkJaW5pdGlhbF9udW1fY3JlZGl0czsKLQlfX3U4CQkJY29ubl9pZDsKIAogCS8qIHN0b3JlZCBkdXJpbmcgbmNpX2RhdGFfZXhjaGFuZ2UgKi8KIAlkYXRhX2V4Y2hhbmdlX2NiX3QJZGF0YV9leGNoYW5nZV9jYjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L25mYy9uZmMuaCBiL2luY2x1ZGUvbmV0L25mYy9uZmMuaAppbmRleCA2YTdmNjAyLi44Njk2Yjc3IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9uZmMvbmZjLmgKKysrIGIvaW5jbHVkZS9uZXQvbmZjL25mYy5oCkBAIC01Miw2ICs1Miw5IEBACiAJaW50ICgqZGV2X2Rvd24pKHN0cnVjdCBuZmNfZGV2ICpkZXYpOwogCWludCAoKnN0YXJ0X3BvbGwpKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiBwcm90b2NvbHMpOwogCXZvaWQgKCpzdG9wX3BvbGwpKHN0cnVjdCBuZmNfZGV2ICpkZXYpOworCWludCAoKmRlcF9saW5rX3VwKShzdHJ1Y3QgbmZjX2RldiAqZGV2LCBpbnQgdGFyZ2V0X2lkeCwKKwkJCQl1OCBjb21tX21vZGUsIHU4IHJmX21vZGUpOworCWludCAoKmRlcF9saW5rX2Rvd24pKHN0cnVjdCBuZmNfZGV2ICpkZXYpOwogCWludCAoKmFjdGl2YXRlX3RhcmdldCkoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsCiAJCQkJCQkJdTMyIHByb3RvY29sKTsKIAl2b2lkICgqZGVhY3RpdmF0ZV90YXJnZXQpKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiB0YXJnZXRfaWR4KTsKQEAgLTYwLDExICs2MywxNyBAQAogCQkJCQkJCXZvaWQgKmNiX2NvbnRleHQpOwogfTsKIAorI2RlZmluZSBORkNfVEFSR0VUX0lEWF9BTlkgLTEKKyNkZWZpbmUgTkZDX01BWF9HVF9MRU4gNDgKKyNkZWZpbmUgTkZDX01BWF9ORkNJRDFfTEVOIDEwCisKIHN0cnVjdCBuZmNfdGFyZ2V0IHsKIAl1MzIgaWR4OwogCXUzMiBzdXBwb3J0ZWRfcHJvdG9jb2xzOwogCXUxNiBzZW5zX3JlczsKIAl1OCBzZWxfcmVzOworCXU4IG5mY2lkMV9sZW47CisJdTggbmZjaWQxW05GQ19NQVhfTkZDSUQxX0xFTl07CiB9OwogCiBzdHJ1Y3QgbmZjX2dlbmxfZGF0YSB7CkBAIC04Myw2ICs5Miw4IEBACiAJYm9vbCBkZXZfdXA7CiAJYm9vbCBwb2xsaW5nOwogCWJvb2wgcmVtb3RlX2FjdGl2YXRlZDsKKwlib29sIGRlcF9saW5rX3VwOworCXUzMiBkZXBfcmZfbW9kZTsKIAlzdHJ1Y3QgbmZjX2dlbmxfZGF0YSBnZW5sX2RhdGE7CiAJdTMyIHN1cHBvcnRlZF9wcm90b2NvbHM7CiAKQEAgLTE1Nyw5ICsxNjgsMjAgQEAKIAlyZXR1cm4gZGV2X25hbWUoJmRldi0+ZGV2KTsKIH0KIAotc3RydWN0IHNrX2J1ZmYgKm5mY19hbGxvY19za2IodW5zaWduZWQgaW50IHNpemUsIGdmcF90IGdmcCk7CitzdHJ1Y3Qgc2tfYnVmZiAqbmZjX2FsbG9jX3NlbmRfc2tiKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHN0cnVjdCBzb2NrICpzaywKKwkJCQkJdW5zaWduZWQgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgc2l6ZSwKKwkJCQkJdW5zaWduZWQgaW50ICplcnIpOworc3RydWN0IHNrX2J1ZmYgKm5mY19hbGxvY19yZWN2X3NrYih1bnNpZ25lZCBpbnQgc2l6ZSwgZ2ZwX3QgZ2ZwKTsKKworaW50IG5mY19zZXRfcmVtb3RlX2dlbmVyYWxfYnl0ZXMoc3RydWN0IG5mY19kZXYgKmRldiwKKwkJCQkJdTggKmd0LCB1OCBndF9sZW4pOworCit1OCAqbmZjX2dldF9sb2NhbF9nZW5lcmFsX2J5dGVzKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHU4ICpndF9sZW4pOwogCiBpbnQgbmZjX3RhcmdldHNfZm91bmQoc3RydWN0IG5mY19kZXYgKmRldiwgc3RydWN0IG5mY190YXJnZXQgKnRhcmdldHMsCiAJCQkJCQkJaW50IG50YXJnZXRzKTsKIAoraW50IG5mY19kZXBfbGlua19pc191cChzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCwKKwkJICAgICAgIHU4IGNvbW1fbW9kZSwgdTggcmZfbW9kZSk7CisKICNlbmRpZiAvKiBfX05FVF9ORkNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaCBiL2luY2x1ZGUvbmV0L3Byb3RvY29sLmgKaW5kZXggNmY3ZWI4MC4uODc1ZjQ4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcHJvdG9jb2wuaAorKysgYi9pbmNsdWRlL25ldC9wcm90b2NvbC5oCkBAIC0yNSw3ICsyNSw3IEBACiAjZGVmaW5lIF9QUk9UT0NPTF9ICiAKICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjZW5kaWYKIApAQCAtMzgsNyArMzgsNyBAQAogCXZvaWQJCQkoKmVycl9oYW5kbGVyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgaW5mbyk7CiAJaW50CQkJKCpnc29fc2VuZF9jaGVjaykoc3RydWN0IHNrX2J1ZmYgKnNrYik7CiAJc3RydWN0IHNrX2J1ZmYJICAgICAgICooKmdzb19zZWdtZW50KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICAgICAgdTMyIGZlYXR1cmVzKTsKKwkJCQkJICAgICAgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKTsKIAlzdHJ1Y3Qgc2tfYnVmZgkgICAgICAqKigqZ3JvX3JlY2VpdmUpKHN0cnVjdCBza19idWZmICoqaGVhZCwKIAkJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpOwogCWludAkJCSgqZ3JvX2NvbXBsZXRlKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTQ2LDcgKzQ2LDcgQEAKIAkJCQluZXRuc19vazoxOwogfTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RydWN0IGluZXQ2X3Byb3RvY29sIHsKIAlpbnQJKCpoYW5kbGVyKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIApAQCAtNTcsNyArNTcsNyBAQAogCiAJaW50CSgqZ3NvX3NlbmRfY2hlY2spKHN0cnVjdCBza19idWZmICpza2IpOwogCXN0cnVjdCBza19idWZmICooKmdzb19zZWdtZW50KShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCSAgICAgICB1MzIgZmVhdHVyZXMpOworCQkJCSAgICAgICBuZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyk7CiAJc3RydWN0IHNrX2J1ZmYgKiooKmdyb19yZWNlaXZlKShzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsCiAJCQkJCXN0cnVjdCBza19idWZmICpza2IpOwogCWludAkoKmdyb19jb21wbGV0ZSkoc3RydWN0IHNrX2J1ZmYgKnNrYik7CkBAIC05MSw3ICs5MSw3IEBACiAKIGV4dGVybiBjb25zdCBzdHJ1Y3QgbmV0X3Byb3RvY29sIF9fcmN1ICppbmV0X3Byb3Rvc1tNQVhfSU5FVF9QUk9UT1NdOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZCAoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBleHRlcm4gY29uc3Qgc3RydWN0IGluZXQ2X3Byb3RvY29sIF9fcmN1ICppbmV0Nl9wcm90b3NbTUFYX0lORVRfUFJPVE9TXTsKICNlbmRpZgogCkBAIC0xMDAsNyArMTAwLDcgQEAKIGV4dGVybiB2b2lkCWluZXRfcmVnaXN0ZXJfcHJvdG9zdyhzdHJ1Y3QgaW5ldF9wcm90b3N3ICpwKTsKIGV4dGVybiB2b2lkCWluZXRfdW5yZWdpc3Rlcl9wcm90b3N3KHN0cnVjdCBpbmV0X3Byb3Rvc3cgKnApOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZCAoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBleHRlcm4gaW50CWluZXQ2X2FkZF9wcm90b2NvbChjb25zdCBzdHJ1Y3QgaW5ldDZfcHJvdG9jb2wgKnByb3QsIHVuc2lnbmVkIGNoYXIgbnVtKTsKIGV4dGVybiBpbnQJaW5ldDZfZGVsX3Byb3RvY29sKGNvbnN0IHN0cnVjdCBpbmV0Nl9wcm90b2NvbCAqcHJvdCwgdW5zaWduZWQgY2hhciBudW0pOwogZXh0ZXJuIGludAlpbmV0Nl9yZWdpc3Rlcl9wcm90b3N3KHN0cnVjdCBpbmV0X3Byb3Rvc3cgKnApOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcmVkLmggYi9pbmNsdWRlL25ldC9yZWQuaAppbmRleCAzMzE5ZjE2Li5iYWFiMzg1IDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9yZWQuaAorKysgYi9pbmNsdWRlL25ldC9yZWQuaApAQCAtNSw2ICs1LDcgQEAKICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfZWNuLmg+CiAjaW5jbHVkZSA8bmV0L2RzZmllbGQuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWNpcHJvY2FsX2Rpdi5oPgogCiAvKglSYW5kb20gRWFybHkgRGV0ZWN0aW9uIChSRUQpIGFsZ29yaXRobS4KIAk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTg3LDYgKzg4LDI5IEBACiAJZXRjLgogICovCiAKKy8qCisgKiBBZGFwdGF0aXZlIFJFRCA6IEFuIEFsZ29yaXRobSBmb3IgSW5jcmVhc2luZyB0aGUgUm9idXN0bmVzcyBvZiBSRUQncyBBUU0KKyAqIChTYWxseSBGTG95ZCwgUmFtYWtyaXNobmEgR3VtbWFkaSwgYW5kIFNjb3R0IFNoZW5rZXIpIEF1Z3VzdCAyMDAxCisgKgorICogRXZlcnkgNTAwIG1zOgorICogIGlmIChhdmcgPiB0YXJnZXQgYW5kIG1heF9wIDw9IDAuNSkKKyAqICAgaW5jcmVhc2UgbWF4X3AgOiBtYXhfcCArPSBhbHBoYTsKKyAqICBlbHNlIGlmIChhdmcgPCB0YXJnZXQgYW5kIG1heF9wID49IDAuMDEpCisgKiAgIGRlY3JlYXNlIG1heF9wIDogbWF4X3AgKj0gYmV0YTsKKyAqCisgKiB0YXJnZXQgOltxdGhfbWluICsgMC40KihxdGhfbWluIC0gcXRoX21heCksCisgKiAgICAgICAgICBxdGhfbWluICsgMC42KihxdGhfbWluIC0gcXRoX21heCldLgorICogYWxwaGEgOiBtaW4oMC4wMSwgbWF4X3AgLyA0KQorICogYmV0YSA6IDAuOQorICogbWF4X1AgaXMgYSBRMC4zMiBmaXhlZCBwb2ludCBudW1iZXIgKHdpdGggMzIgYml0cyBtYW50aXNzYSkKKyAqIG1heF9QIGJldHdlZW4gMC4wMSBhbmQgMC41ICgxJSAtIDUwJSkgWyBJdHMgbm8gbG9uZ2VyIGEgbmVnYXRpdmUgcG93ZXIgb2YgdHdvIF0KKyAqLworI2RlZmluZSBSRURfT05FX1BFUkNFTlQgKCh1MzIpRElWX1JPVU5EX0NMT1NFU1QoMVVMTDw8MzIsIDEwMCkpCisKKyNkZWZpbmUgTUFYX1BfTUlOICgxICogUkVEX09ORV9QRVJDRU5UKQorI2RlZmluZSBNQVhfUF9NQVggKDUwICogUkVEX09ORV9QRVJDRU5UKQorI2RlZmluZSBNQVhfUF9BTFBIQSh2YWwpIG1pbihNQVhfUF9NSU4sIHZhbCAvIDQpCisKICNkZWZpbmUgUkVEX1NUQUJfU0laRQkyNTYKICNkZWZpbmUgUkVEX1NUQUJfTUFTSwkoUkVEX1NUQUJfU0laRSAtIDEpCiAKQEAgLTEwMSw4MiArMTI1LDExMiBAQAogCiBzdHJ1Y3QgcmVkX3Bhcm1zIHsKIAkvKiBQYXJhbWV0ZXJzICovCi0JdTMyCQlxdGhfbWluOwkvKiBNaW4gYXZnIGxlbmd0aCB0aHJlc2hvbGQ6IEEgc2NhbGVkICovCi0JdTMyCQlxdGhfbWF4OwkvKiBNYXggYXZnIGxlbmd0aCB0aHJlc2hvbGQ6IEEgc2NhbGVkICovCisJdTMyCQlxdGhfbWluOwkvKiBNaW4gYXZnIGxlbmd0aCB0aHJlc2hvbGQ6IFdsb2cgc2NhbGVkICovCisJdTMyCQlxdGhfbWF4OwkvKiBNYXggYXZnIGxlbmd0aCB0aHJlc2hvbGQ6IFdsb2cgc2NhbGVkICovCiAJdTMyCQlTY2VsbF9tYXg7Ci0JdTMyCQlSbWFzazsJCS8qIENhY2hlZCByYW5kb20gbWFzaywgc2VlIHJlZF9ybWFzayAqLworCXUzMgkJbWF4X1A7CQkvKiBwcm9iYWJpbGl0eSwgWzAgLi4gMS4wXSAzMiBzY2FsZWQgKi8KKwl1MzIJCW1heF9QX3JlY2lwcm9jYWw7IC8qIHJlY2lwcm9jYWxfdmFsdWUobWF4X1AgLyBxdGhfZGVsdGEpICovCisJdTMyCQlxdGhfZGVsdGE7CS8qIG1heF90aCAtIG1pbl90aCAqLworCXUzMgkJdGFyZ2V0X21pbjsJLyogbWluX3RoICsgMC40KihtYXhfdGggLSBtaW5fdGgpICovCisJdTMyCQl0YXJnZXRfbWF4OwkvKiBtaW5fdGggKyAwLjYqKG1heF90aCAtIG1pbl90aCkgKi8KIAl1OAkJU2NlbGxfbG9nOwogCXU4CQlXbG9nOwkJLyogbG9nKFcpCQkqLwogCXU4CQlQbG9nOwkJLyogcmFuZG9tIG51bWJlciBiaXRzCSovCiAJdTgJCVN0YWJbUkVEX1NUQUJfU0laRV07Cit9OwogCitzdHJ1Y3QgcmVkX3ZhcnMgewogCS8qIFZhcmlhYmxlcyAqLwogCWludAkJcWNvdW50OwkJLyogTnVtYmVyIG9mIHBhY2tldHMgc2luY2UgbGFzdCByYW5kb20KIAkJCQkJICAgbnVtYmVyIGdlbmVyYXRpb24gKi8KIAl1MzIJCXFSOwkJLyogQ2FjaGVkIHJhbmRvbSBudW1iZXIgKi8KIAotCXVuc2lnbmVkIGxvbmcJcWF2ZzsJCS8qIEF2ZXJhZ2UgcXVldWUgbGVuZ3RoOiBBIHNjYWxlZCAqLwotCXBzY2hlZF90aW1lX3QJcWlkbGVzdGFydDsJLyogU3RhcnQgb2YgY3VycmVudCBpZGxlIHBlcmlvZCAqLworCXVuc2lnbmVkIGxvbmcJcWF2ZzsJCS8qIEF2ZXJhZ2UgcXVldWUgbGVuZ3RoOiBXbG9nIHNjYWxlZCAqLworCWt0aW1lX3QJCXFpZGxlc3RhcnQ7CS8qIFN0YXJ0IG9mIGN1cnJlbnQgaWRsZSBwZXJpb2QgKi8KIH07CiAKLXN0YXRpYyBpbmxpbmUgdTMyIHJlZF9ybWFzayh1OCBQbG9nKQorc3RhdGljIGlubGluZSB1MzIgcmVkX21heHAodTggUGxvZykKIHsKLQlyZXR1cm4gUGxvZyA8IDMyID8gKCgxIDw8IFBsb2cpIC0gMSkgOiB+MFVMOworCXJldHVybiBQbG9nIDwgMzIgPyAofjBVID4+IFBsb2cpIDogfjBVOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVkX3NldF9wYXJtcyhzdHJ1Y3QgcmVkX3Bhcm1zICpwLAotCQkJCSB1MzIgcXRoX21pbiwgdTMyIHF0aF9tYXgsIHU4IFdsb2csIHU4IFBsb2csCi0JCQkJIHU4IFNjZWxsX2xvZywgdTggKnN0YWIpCitzdGF0aWMgaW5saW5lIHZvaWQgcmVkX3NldF92YXJzKHN0cnVjdCByZWRfdmFycyAqdikKIHsKIAkvKiBSZXNldCBhdmVyYWdlIHF1ZXVlIGxlbmd0aCwgdGhlIHZhbHVlIGlzIHN0cmljdGx5IGJvdW5kCiAJICogdG8gdGhlIHBhcmFtZXRlcnMgYmVsb3csIHJlc2V0aW5nIGh1cnRzIGEgYml0IGJ1dCBsZWF2aW5nCiAJICogaXQgbWlnaHQgcmVzdWx0IGluIGFuIHVucmVhc29uYWJsZSBxYXZnIGZvciBhIHdoaWxlLiAtLVRHUgogCSAqLwotCXAtPnFhdmcJCT0gMDsKKwl2LT5xYXZnCQk9IDA7CiAKLQlwLT5xY291bnQJPSAtMTsKKwl2LT5xY291bnQJPSAtMTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlZF9zZXRfcGFybXMoc3RydWN0IHJlZF9wYXJtcyAqcCwKKwkJCQkgdTMyIHF0aF9taW4sIHUzMiBxdGhfbWF4LCB1OCBXbG9nLCB1OCBQbG9nLAorCQkJCSB1OCBTY2VsbF9sb2csIHU4ICpzdGFiLCB1MzIgbWF4X1ApCit7CisJaW50IGRlbHRhID0gcXRoX21heCAtIHF0aF9taW47CisJdTMyIG1heF9wX2RlbHRhOworCiAJcC0+cXRoX21pbgk9IHF0aF9taW4gPDwgV2xvZzsKIAlwLT5xdGhfbWF4CT0gcXRoX21heCA8PCBXbG9nOwogCXAtPldsb2cJCT0gV2xvZzsKIAlwLT5QbG9nCQk9IFBsb2c7Ci0JcC0+Um1hc2sJPSByZWRfcm1hc2soUGxvZyk7CisJaWYgKGRlbHRhIDwgMCkKKwkJZGVsdGEgPSAxOworCXAtPnF0aF9kZWx0YQk9IGRlbHRhOworCWlmICghbWF4X1ApIHsKKwkJbWF4X1AgPSByZWRfbWF4cChQbG9nKTsKKwkJbWF4X1AgKj0gZGVsdGE7IC8qIG1heF9QID0gKHF0aF9tYXggLSBxdGhfbWluKS8yXlBsb2cgKi8KKwl9CisJcC0+bWF4X1AgPSBtYXhfUDsKKwltYXhfcF9kZWx0YSA9IG1heF9QIC8gZGVsdGE7CisJbWF4X3BfZGVsdGEgPSBtYXgobWF4X3BfZGVsdGEsIDFVKTsKKwlwLT5tYXhfUF9yZWNpcHJvY2FsICA9IHJlY2lwcm9jYWxfdmFsdWUobWF4X3BfZGVsdGEpOworCisJLyogUkVEIEFkYXB0YXRpdmUgdGFyZ2V0IDoKKwkgKiBbbWluX3RoICsgMC40KihtaW5fdGggLSBtYXhfdGgpLAorCSAqICBtaW5fdGggKyAwLjYqKG1pbl90aCAtIG1heF90aCldLgorCSAqLworCWRlbHRhIC89IDU7CisJcC0+dGFyZ2V0X21pbiA9IHF0aF9taW4gKyAyKmRlbHRhOworCXAtPnRhcmdldF9tYXggPSBxdGhfbWluICsgMypkZWx0YTsKKwogCXAtPlNjZWxsX2xvZwk9IFNjZWxsX2xvZzsKIAlwLT5TY2VsbF9tYXgJPSAoMjU1IDw8IFNjZWxsX2xvZyk7CiAKIAltZW1jcHkocC0+U3RhYiwgc3RhYiwgc2l6ZW9mKHAtPlN0YWIpKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmVkX2lzX2lkbGluZyhzdHJ1Y3QgcmVkX3Bhcm1zICpwKQorc3RhdGljIGlubGluZSBpbnQgcmVkX2lzX2lkbGluZyhjb25zdCBzdHJ1Y3QgcmVkX3ZhcnMgKnYpCiB7Ci0JcmV0dXJuIHAtPnFpZGxlc3RhcnQgIT0gUFNDSEVEX1BBU1RQRVJGRUNUOworCXJldHVybiB2LT5xaWRsZXN0YXJ0LnR2NjQgIT0gMDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJlZF9zdGFydF9vZl9pZGxlX3BlcmlvZChzdHJ1Y3QgcmVkX3Bhcm1zICpwKQorc3RhdGljIGlubGluZSB2b2lkIHJlZF9zdGFydF9vZl9pZGxlX3BlcmlvZChzdHJ1Y3QgcmVkX3ZhcnMgKnYpCiB7Ci0JcC0+cWlkbGVzdGFydCA9IHBzY2hlZF9nZXRfdGltZSgpOworCXYtPnFpZGxlc3RhcnQgPSBrdGltZV9nZXQoKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIHJlZF9lbmRfb2ZfaWRsZV9wZXJpb2Qoc3RydWN0IHJlZF9wYXJtcyAqcCkKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWRfZW5kX29mX2lkbGVfcGVyaW9kKHN0cnVjdCByZWRfdmFycyAqdikKIHsKLQlwLT5xaWRsZXN0YXJ0ID0gUFNDSEVEX1BBU1RQRVJGRUNUOworCXYtPnFpZGxlc3RhcnQudHY2NCA9IDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCByZWRfcmVzdGFydChzdHJ1Y3QgcmVkX3Bhcm1zICpwKQorc3RhdGljIGlubGluZSB2b2lkIHJlZF9yZXN0YXJ0KHN0cnVjdCByZWRfdmFycyAqdikKIHsKLQlyZWRfZW5kX29mX2lkbGVfcGVyaW9kKHApOwotCXAtPnFhdmcgPSAwOwotCXAtPnFjb3VudCA9IC0xOworCXJlZF9lbmRfb2ZfaWRsZV9wZXJpb2Qodik7CisJdi0+cWF2ZyA9IDA7CisJdi0+cWNvdW50ID0gLTE7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWRfY2FsY19xYXZnX2Zyb21faWRsZV90aW1lKHN0cnVjdCByZWRfcGFybXMgKnApCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVkX2NhbGNfcWF2Z19mcm9tX2lkbGVfdGltZShjb25zdCBzdHJ1Y3QgcmVkX3Bhcm1zICpwLAorCQkJCQkJCSBjb25zdCBzdHJ1Y3QgcmVkX3ZhcnMgKnYpCiB7Ci0JcHNjaGVkX3RpbWVfdCBub3c7Ci0JbG9uZyB1c19pZGxlOworCXM2NCBkZWx0YSA9IGt0aW1lX3VzX2RlbHRhKGt0aW1lX2dldCgpLCB2LT5xaWRsZXN0YXJ0KTsKKwlsb25nIHVzX2lkbGUgPSBtaW5fdChzNjQsIGRlbHRhLCBwLT5TY2VsbF9tYXgpOwogCWludCAgc2hpZnQ7CiAKLQlub3cgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKLQl1c19pZGxlID0gcHNjaGVkX3RkaWZmX2JvdW5kZWQobm93LCBwLT5xaWRsZXN0YXJ0LCBwLT5TY2VsbF9tYXgpOwotCiAJLyoKIAkgKiBUaGUgcHJvYmxlbTogaWRlYWxseSwgYXZlcmFnZSBsZW5ndGggcXVldWUgcmVjYWxjdWx0aW9uIHNob3VsZAogCSAqIGJlIGRvbmUgb3ZlciBjb25zdGFudCBjbG9jayBpbnRlcnZhbHMuIFRoaXMgaXMgdG9vIGV4cGVuc2l2ZSwgc28KQEAgLTIwMCw3ICsyNTQsNyBAQAogCXNoaWZ0ID0gcC0+U3RhYlsodXNfaWRsZSA+PiBwLT5TY2VsbF9sb2cpICYgUkVEX1NUQUJfTUFTS107CiAKIAlpZiAoc2hpZnQpCi0JCXJldHVybiBwLT5xYXZnID4+IHNoaWZ0OworCQlyZXR1cm4gdi0+cWF2ZyA+PiBzaGlmdDsKIAllbHNlIHsKIAkJLyogQXBwcm94aW1hdGUgaW5pdGlhbCBwYXJ0IG9mIGV4cG9uZW50IHdpdGggbGluZWFyIGZ1bmN0aW9uOgogCQkgKgpAQCAtMjA5LDE2ICsyNjMsMTcgQEAKIAkJICogU2VlbXMsIGl0IGlzIHRoZSBiZXN0IHNvbHV0aW9uIHRvCiAJCSAqIHByb2JsZW0gb2YgdG9vIGNvYXJzZSBleHBvbmVudCB0YWJ1bGF0aW9uLgogCQkgKi8KLQkJdXNfaWRsZSA9IChwLT5xYXZnICogKHU2NCl1c19pZGxlKSA+PiBwLT5TY2VsbF9sb2c7CisJCXVzX2lkbGUgPSAodi0+cWF2ZyAqICh1NjQpdXNfaWRsZSkgPj4gcC0+U2NlbGxfbG9nOwogCi0JCWlmICh1c19pZGxlIDwgKHAtPnFhdmcgPj4gMSkpCi0JCQlyZXR1cm4gcC0+cWF2ZyAtIHVzX2lkbGU7CisJCWlmICh1c19pZGxlIDwgKHYtPnFhdmcgPj4gMSkpCisJCQlyZXR1cm4gdi0+cWF2ZyAtIHVzX2lkbGU7CiAJCWVsc2UKLQkJCXJldHVybiBwLT5xYXZnID4+IDE7CisJCQlyZXR1cm4gdi0+cWF2ZyA+PiAxOwogCX0KIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlZF9jYWxjX3Fhdmdfbm9faWRsZV90aW1lKHN0cnVjdCByZWRfcGFybXMgKnAsCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcmVkX2NhbGNfcWF2Z19ub19pZGxlX3RpbWUoY29uc3Qgc3RydWN0IHJlZF9wYXJtcyAqcCwKKwkJCQkJCSAgICAgICBjb25zdCBzdHJ1Y3QgcmVkX3ZhcnMgKnYsCiAJCQkJCQkgICAgICAgdW5zaWduZWQgaW50IGJhY2tsb2cpCiB7CiAJLyoKQEAgLTIzMCw0MiArMjg1LDQ2IEBACiAJICoKIAkgKiAtLUFOSyAoOTgwOTI0KQogCSAqLwotCXJldHVybiBwLT5xYXZnICsgKGJhY2tsb2cgLSAocC0+cWF2ZyA+PiBwLT5XbG9nKSk7CisJcmV0dXJuIHYtPnFhdmcgKyAoYmFja2xvZyAtICh2LT5xYXZnID4+IHAtPldsb2cpKTsKIH0KIAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHJlZF9jYWxjX3Fhdmcoc3RydWN0IHJlZF9wYXJtcyAqcCwKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByZWRfY2FsY19xYXZnKGNvbnN0IHN0cnVjdCByZWRfcGFybXMgKnAsCisJCQkJCSAgY29uc3Qgc3RydWN0IHJlZF92YXJzICp2LAogCQkJCQkgIHVuc2lnbmVkIGludCBiYWNrbG9nKQogewotCWlmICghcmVkX2lzX2lkbGluZyhwKSkKLQkJcmV0dXJuIHJlZF9jYWxjX3Fhdmdfbm9faWRsZV90aW1lKHAsIGJhY2tsb2cpOworCWlmICghcmVkX2lzX2lkbGluZyh2KSkKKwkJcmV0dXJuIHJlZF9jYWxjX3Fhdmdfbm9faWRsZV90aW1lKHAsIHYsIGJhY2tsb2cpOwogCWVsc2UKLQkJcmV0dXJuIHJlZF9jYWxjX3FhdmdfZnJvbV9pZGxlX3RpbWUocCk7CisJCXJldHVybiByZWRfY2FsY19xYXZnX2Zyb21faWRsZV90aW1lKHAsIHYpOwogfQogCi1zdGF0aWMgaW5saW5lIHUzMiByZWRfcmFuZG9tKHN0cnVjdCByZWRfcGFybXMgKnApCisKK3N0YXRpYyBpbmxpbmUgdTMyIHJlZF9yYW5kb20oY29uc3Qgc3RydWN0IHJlZF9wYXJtcyAqcCkKIHsKLQlyZXR1cm4gbmV0X3JhbmRvbSgpICYgcC0+Um1hc2s7CisJcmV0dXJuIHJlY2lwcm9jYWxfZGl2aWRlKG5ldF9yYW5kb20oKSwgcC0+bWF4X1BfcmVjaXByb2NhbCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlZF9tYXJrX3Byb2JhYmlsaXR5KHN0cnVjdCByZWRfcGFybXMgKnAsIHVuc2lnbmVkIGxvbmcgcWF2ZykKK3N0YXRpYyBpbmxpbmUgaW50IHJlZF9tYXJrX3Byb2JhYmlsaXR5KGNvbnN0IHN0cnVjdCByZWRfcGFybXMgKnAsCisJCQkJICAgICAgIGNvbnN0IHN0cnVjdCByZWRfdmFycyAqdiwKKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBxYXZnKQogewogCS8qIFRoZSBmb3JtdWxhIHVzZWQgYmVsb3cgY2F1c2VzIHF1ZXN0aW9ucy4KIAotCSAgIE9LLiBxUiBpcyByYW5kb20gbnVtYmVyIGluIHRoZSBpbnRlcnZhbCAwLi5SbWFzaworCSAgIE9LLiBxUiBpcyByYW5kb20gbnVtYmVyIGluIHRoZSBpbnRlcnZhbAorCQkoMC4uMS9tYXhfUCkqKHF0aF9tYXgtcXRoX21pbikKIAkgICBpLmUuIDAuLigyXlBsb2cpLiBJZiB3ZSB1c2VkIGZsb2F0aW5nIHBvaW50CiAJICAgYXJpdGhtZXRpY3MsIGl0IHdvdWxkIGJlOiAoMl5QbG9nKSpybmRfbnVtLAogCSAgIHdoZXJlIHJuZF9udW0gaXMgbGVzcyAxLgogCiAJICAgVGFraW5nIGludG8gYWNjb3VudCwgdGhhdCBxYXZnIGhhdmUgZml4ZWQKLQkgICBwb2ludCBhdCBXbG9nLCBhbmQgUGxvZyBpcyByZWxhdGVkIHRvIG1heF9QIGJ5Ci0JICAgbWF4X1AgPSAocXRoX21heC1xdGhfbWluKS8yXlBsb2c7IHR3byBsaW5lcworCSAgIHBvaW50IGF0IFdsb2csIHR3byBsaW5lcwogCSAgIGJlbG93IGhhdmUgdGhlIGZvbGxvd2luZyBmbG9hdGluZyBwb2ludCBlcXVpdmFsZW50OgogCiAJICAgbWF4X1AqKHFhdmcgLSBxdGhfbWluKS8ocXRoX21heC1xdGhfbWluKSA8IHJuZC9xY291bnQKIAogCSAgIEFueSBxdWVzdGlvbnM/IC0tQU5LICg5ODA5MjQpCiAJICovCi0JcmV0dXJuICEoKChxYXZnIC0gcC0+cXRoX21pbikgPj4gcC0+V2xvZykgKiBwLT5xY291bnQgPCBwLT5xUik7CisJcmV0dXJuICEoKChxYXZnIC0gcC0+cXRoX21pbikgPj4gcC0+V2xvZykgKiB2LT5xY291bnQgPCB2LT5xUik7CiB9CiAKIGVudW0gewpAQCAtMjc0LDcgKzMzMyw3IEBACiAJUkVEX0FCT1ZFX01BWF9UUkVTSCwKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlZF9jbXBfdGhyZXNoKHN0cnVjdCByZWRfcGFybXMgKnAsIHVuc2lnbmVkIGxvbmcgcWF2ZykKK3N0YXRpYyBpbmxpbmUgaW50IHJlZF9jbXBfdGhyZXNoKGNvbnN0IHN0cnVjdCByZWRfcGFybXMgKnAsIHVuc2lnbmVkIGxvbmcgcWF2ZykKIHsKIAlpZiAocWF2ZyA8IHAtPnF0aF9taW4pCiAJCXJldHVybiBSRURfQkVMT1dfTUlOX1RIUkVTSDsKQEAgLTI5MCwyNyArMzQ5LDI5IEBACiAJUkVEX0hBUkRfTUFSSywKIH07CiAKLXN0YXRpYyBpbmxpbmUgaW50IHJlZF9hY3Rpb24oc3RydWN0IHJlZF9wYXJtcyAqcCwgdW5zaWduZWQgbG9uZyBxYXZnKQorc3RhdGljIGlubGluZSBpbnQgcmVkX2FjdGlvbihjb25zdCBzdHJ1Y3QgcmVkX3Bhcm1zICpwLAorCQkJICAgICBzdHJ1Y3QgcmVkX3ZhcnMgKnYsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgcWF2ZykKIHsKIAlzd2l0Y2ggKHJlZF9jbXBfdGhyZXNoKHAsIHFhdmcpKSB7CiAJCWNhc2UgUkVEX0JFTE9XX01JTl9USFJFU0g6Ci0JCQlwLT5xY291bnQgPSAtMTsKKwkJCXYtPnFjb3VudCA9IC0xOwogCQkJcmV0dXJuIFJFRF9ET05UX01BUks7CiAKIAkJY2FzZSBSRURfQkVUV0VFTl9UUkVTSDoKLQkJCWlmICgrK3AtPnFjb3VudCkgewotCQkJCWlmIChyZWRfbWFya19wcm9iYWJpbGl0eShwLCBxYXZnKSkgewotCQkJCQlwLT5xY291bnQgPSAwOwotCQkJCQlwLT5xUiA9IHJlZF9yYW5kb20ocCk7CisJCQlpZiAoKyt2LT5xY291bnQpIHsKKwkJCQlpZiAocmVkX21hcmtfcHJvYmFiaWxpdHkocCwgdiwgcWF2ZykpIHsKKwkJCQkJdi0+cWNvdW50ID0gMDsKKwkJCQkJdi0+cVIgPSByZWRfcmFuZG9tKHApOwogCQkJCQlyZXR1cm4gUkVEX1BST0JfTUFSSzsKIAkJCQl9CiAJCQl9IGVsc2UKLQkJCQlwLT5xUiA9IHJlZF9yYW5kb20ocCk7CisJCQkJdi0+cVIgPSByZWRfcmFuZG9tKHApOwogCiAJCQlyZXR1cm4gUkVEX0RPTlRfTUFSSzsKIAogCQljYXNlIFJFRF9BQk9WRV9NQVhfVFJFU0g6Ci0JCQlwLT5xY291bnQgPSAtMTsKKwkJCXYtPnFjb3VudCA9IC0xOwogCQkJcmV0dXJuIFJFRF9IQVJEX01BUks7CiAJfQogCkBAIC0zMTgsNCArMzc5LDI1IEBACiAJcmV0dXJuIFJFRF9ET05UX01BUks7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCByZWRfYWRhcHRhdGl2ZV9hbGdvKHN0cnVjdCByZWRfcGFybXMgKnAsIHN0cnVjdCByZWRfdmFycyAqdikKK3sKKwl1bnNpZ25lZCBsb25nIHFhdmc7CisJdTMyIG1heF9wX2RlbHRhOworCisJcWF2ZyA9IHYtPnFhdmc7CisJaWYgKHJlZF9pc19pZGxpbmcodikpCisJCXFhdmcgPSByZWRfY2FsY19xYXZnX2Zyb21faWRsZV90aW1lKHAsIHYpOworCisJLyogcC0+cWF2ZyBpcyBmaXhlZCBwb2ludCBudW1iZXIgd2l0aCBwb2ludCBhdCBXbG9nICovCisJcWF2ZyA+Pj0gcC0+V2xvZzsKKworCWlmIChxYXZnID4gcC0+dGFyZ2V0X21heCAmJiBwLT5tYXhfUCA8PSBNQVhfUF9NQVgpCisJCXAtPm1heF9QICs9IE1BWF9QX0FMUEhBKHAtPm1heF9QKTsgLyogbWF4cCA9IG1heHAgKyBhbHBoYSAqLworCWVsc2UgaWYgKHFhdmcgPCBwLT50YXJnZXRfbWluICYmIHAtPm1heF9QID49IE1BWF9QX01JTikKKwkJcC0+bWF4X1AgPSAocC0+bWF4X1AvMTApKjk7IC8qIG1heHAgPSBtYXhwICogQmV0YSAqLworCisJbWF4X3BfZGVsdGEgPSBESVZfUk9VTkRfQ0xPU0VTVChwLT5tYXhfUCwgcC0+cXRoX2RlbHRhKTsKKwltYXhfcF9kZWx0YSA9IG1heChtYXhfcF9kZWx0YSwgMVUpOworCXAtPm1heF9QX3JlY2lwcm9jYWwgPSByZWNpcHJvY2FsX3ZhbHVlKG1heF9wX2RlbHRhKTsKK30KICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcmVndWxhdG9yeS5oIGIvaW5jbHVkZS9uZXQvcmVndWxhdG9yeS5oCmluZGV4IGViN2QzYzIuLmE1Zjc5OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3JlZ3VsYXRvcnkuaAorKysgYi9pbmNsdWRlL25ldC9yZWd1bGF0b3J5LmgKQEAgLTQ4LDYgKzQ4LDEwIEBACiAgKiAJOTkgLSBidWlsdCBieSBkcml2ZXIgYnV0IGEgc3BlY2lmaWMgYWxwaGEyIGNhbm5vdCBiZSBkZXRlcm1pbmVkCiAgKiAJOTggLSByZXN1bHQgb2YgYW4gaW50ZXJzZWN0aW9uIGJldHdlZW4gdHdvIHJlZ3VsYXRvcnkgZG9tYWlucwogICoJOTcgLSByZWd1bGF0b3J5IGRvbWFpbiBoYXMgbm90IHlldCBiZWVuIGNvbmZpZ3VyZWQKKyAqIEBkZnNfcmVnaW9uOiBJZiBDUkRBIHJlc3BvbmRlZCB3aXRoIGEgcmVndWxhdG9yeSBkb21haW4gdGhhdCByZXF1aXJlcworICoJREZTIG1hc3RlciBvcGVyYXRpb24gb24gYSBrbm93biBERlMgcmVnaW9uIChOTDgwMjExX0RGU18qKSwKKyAqCWRmc19yZWdpb24gcmVwcmVzZW50cyB0aGF0IHJlZ2lvbi4gRHJpdmVycyBjYW4gdXNlIHRoaXMgYW5kIHRoZQorICoJQGFscGhhMiB0byBhZGp1c3QgdGhlaXIgZGV2aWNlJ3MgREZTIHBhcmFtZXRlcnMgYXMgcmVxdWlyZWQuCiAgKiBAaW50ZXJzZWN0OiBpbmRpY2F0ZXMgd2hldGhlciB0aGUgd2lyZWxlc3MgY29yZSBzaG91bGQgaW50ZXJzZWN0CiAgKiAJdGhlIHJlcXVlc3RlZCByZWd1bGF0b3J5IGRvbWFpbiB3aXRoIHRoZSBwcmVzZW50bHkgc2V0IHJlZ3VsYXRvcnkKICAqIAlkb21haW4uCkBAIC02Nyw2ICs3MSw3IEBACiAJaW50IHdpcGh5X2lkeDsKIAllbnVtIG5sODAyMTFfcmVnX2luaXRpYXRvciBpbml0aWF0b3I7CiAJY2hhciBhbHBoYTJbMl07CisJdTggZGZzX3JlZ2lvbjsKIAlib29sIGludGVyc2VjdDsKIAlib29sIHByb2Nlc3NlZDsKIAllbnVtIGVudmlyb25tZW50X2NhcCBjb3VudHJ5X2llX2VudjsKQEAgLTkzLDYgKzk4LDcgQEAKIHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluIHsKIAl1MzIgbl9yZWdfcnVsZXM7CiAJY2hhciBhbHBoYTJbMl07CisJdTggZGZzX3JlZ2lvbjsKIAlzdHJ1Y3QgaWVlZTgwMjExX3JlZ19ydWxlIHJlZ19ydWxlc1tdOwogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvcm91dGUuaCBiL2luY2x1ZGUvbmV0L3JvdXRlLmgKaW5kZXggZGI3YjM0My4uOTE4NTVkMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvcm91dGUuaAorKysgYi9pbmNsdWRlL25ldC9yb3V0ZS5oCkBAIC03MSwxMiArNzEsMTIgQEAKIAlzdHJ1Y3QgZmliX2luZm8JCSpmaTsgLyogZm9yIGNsaWVudCByZWYgdG8gc2hhcmVkIG1ldHJpY3MgKi8KIH07CiAKLXN0YXRpYyBpbmxpbmUgYm9vbCBydF9pc19pbnB1dF9yb3V0ZShzdHJ1Y3QgcnRhYmxlICpydCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBydF9pc19pbnB1dF9yb3V0ZShjb25zdCBzdHJ1Y3QgcnRhYmxlICpydCkKIHsKIAlyZXR1cm4gcnQtPnJ0X3JvdXRlX2lpZiAhPSAwOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgcnRfaXNfb3V0cHV0X3JvdXRlKHN0cnVjdCBydGFibGUgKnJ0KQorc3RhdGljIGlubGluZSBib29sIHJ0X2lzX291dHB1dF9yb3V0ZShjb25zdCBzdHJ1Y3QgcnRhYmxlICpydCkKIHsKIAlyZXR1cm4gcnQtPnJ0X3JvdXRlX2lpZiA9PSAwOwogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc2N0cC9zY3RwLmggYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAppbmRleCA2YTcyYTU4Li5kMzY4NTYxIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaAorKysgYi9pbmNsdWRlL25ldC9zY3RwL3NjdHAuaApAQCAtNzEsNyArNzEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pZHIuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvaXA2X3JvdXRlLmg+CiAjZW5kaWYKQEAgLTM4Myw3ICszODMsNyBAQAogLyogU2l6ZSBvZiBTdXBwb3J0ZWQgQWRkcmVzcyBQYXJhbWV0ZXIgZm9yICd4JyBhZGRyZXNzIHR5cGVzLiAqLwogI2RlZmluZSBTQ1RQX1NBVF9MRU4oeCkgKHNpemVvZihzdHJ1Y3Qgc2N0cF9wYXJhbWhkcikgKyAoeCkgKiBzaXplb2YoX191MTYpKQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAogdm9pZCBzY3RwX3Y2X3BmX2luaXQodm9pZCk7CiB2b2lkIHNjdHBfdjZfcGZfZXhpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NjdHAvc3RydWN0cy5oIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKaW5kZXggZTkwZTdhOS4uODg5NDlhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKKysrIGIvaW5jbHVkZS9uZXQvc2N0cC9zdHJ1Y3RzLmgKQEAgLTIzNSwxMiArMjM1LDE1IEBACiAKIAkvKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgY29tcHV0aW5nIGFuZCB2ZXJpZnlpbmcgY2hlY2tzdW0KIAkgKiBpcyBkaXNhYmxlZC4gKi8KLSAgICAgICAgaW50IGNoZWNrc3VtX2Rpc2FibGU7CisgICAgICAgIGJvb2wgY2hlY2tzdW1fZGlzYWJsZTsKIAogCS8qIFRocmVzaG9sZCBmb3IgcnduZCB1cGRhdGUgU0FDS1MuICBSZWNlaXZlIGJ1ZmZlciBzaGlmdGVkIHRoaXMgbWFueQogCSAqIGJpdHMgaXMgYW4gaW5kaWNhdG9yIG9mIHdoZW4gdG8gc2VuZCBhbmQgd2luZG93IHVwZGF0ZSBTQUNLLgogCSAqLwogCWludCByd25kX3VwZGF0ZV9zaGlmdDsKKworCS8qIFRocmVzaG9sZCBmb3IgYXV0b2Nsb3NlIHRpbWVvdXQsIGluIHNlY29uZHMuICovCisJdW5zaWduZWQgbG9uZyBtYXhfYXV0b2Nsb3NlOwogfSBzY3RwX2dsb2JhbHM7CiAKICNkZWZpbmUgc2N0cF9ydG9faW5pdGlhbAkJKHNjdHBfZ2xvYmFscy5ydG9faW5pdGlhbCkKQEAgLTI4MSw2ICsyODQsNyBAQAogI2RlZmluZSBzY3RwX2F1dGhfZW5hYmxlCQkoc2N0cF9nbG9iYWxzLmF1dGhfZW5hYmxlKQogI2RlZmluZSBzY3RwX2NoZWNrc3VtX2Rpc2FibGUJCShzY3RwX2dsb2JhbHMuY2hlY2tzdW1fZGlzYWJsZSkKICNkZWZpbmUgc2N0cF9yd25kX3VwZF9zaGlmdAkJKHNjdHBfZ2xvYmFscy5yd25kX3VwZGF0ZV9zaGlmdCkKKyNkZWZpbmUgc2N0cF9tYXhfYXV0b2Nsb3NlCQkoc2N0cF9nbG9iYWxzLm1heF9hdXRvY2xvc2UpCiAKIC8qIFNDVFAgU29ja2V0IHR5cGU6IFVEUCBvciBUQ1Agc3R5bGUuICovCiB0eXBlZGVmIGVudW0gewpAQCAtMzY1LDcgKzM2OSw3IEBACiAgICAgICAgcmV0dXJuIChzdHJ1Y3Qgc29jayAqKXNwOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0cnVjdCBzY3RwNl9zb2NrIHsKICAgICAgICBzdHJ1Y3Qgc2N0cF9zb2NrICBzY3RwOwogICAgICAgIHN0cnVjdCBpcHY2X3BpbmZvIGluZXQ2OwpAQCAtMTA4NSw2ICsxMDg5LDcgQEAKIHVuc2lnbmVkIGxvbmcgc2N0cF90cmFuc3BvcnRfdGltZW91dChzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgKik7CiB2b2lkIHNjdHBfdHJhbnNwb3J0X3Jlc2V0KHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqKTsKIHZvaWQgc2N0cF90cmFuc3BvcnRfdXBkYXRlX3BtdHUoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICosIHUzMik7Cit2b2lkIHNjdHBfdHJhbnNwb3J0X2ltbWVkaWF0ZV9ydHgoc3RydWN0IHNjdHBfdHJhbnNwb3J0ICopOwogCiAKIC8qIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB3ZSB1c2UgdG8gcXVldWUgcGFja2V0cyBhcyB0aGV5IGNvbWUgaW50bwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvc25tcC5oIGIvaW5jbHVkZS9uZXQvc25tcC5oCmluZGV4IDhmMGY5YWMuLjJmNjVlMTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3NubXAuaAorKysgYi9pbmNsdWRlL25ldC9zbm1wLmgKQEAgLTY3LDcgKzY3LDcgQEAKIAogI2RlZmluZSBJQ01QTVNHX01JQl9NQVgJX19JQ01QTVNHX01JQl9NQVgKIHN0cnVjdCBpY21wbXNnX21pYiB7Ci0JdW5zaWduZWQgbG9uZwltaWJzW0lDTVBNU0dfTUlCX01BWF07CisJYXRvbWljX2xvbmdfdAltaWJzW0lDTVBNU0dfTUlCX01BWF07CiB9OwogCiAvKiBJQ01QNiAoSVB2Ni1JQ01QKSAqLwpAQCAtODQsNyArODQsNyBAQAogI2RlZmluZSBJQ01QNk1TR19NSUJfTUFYICBfX0lDTVA2TVNHX01JQl9NQVgKIC8qIHBlciBuZXR3b3JrIG5zIGNvdW50ZXJzICovCiBzdHJ1Y3QgaWNtcHY2bXNnX21pYiB7Ci0JdW5zaWduZWQgbG9uZwltaWJzW0lDTVA2TVNHX01JQl9NQVhdOworCWF0b21pY19sb25nX3QJbWlic1tJQ01QNk1TR19NSUJfTUFYXTsKIH07CiAvKiBwZXIgZGV2aWNlIGNvdW50ZXJzLCAoc2hhcmVkIG9uIGFsbCBjcHVzKSAqLwogc3RydWN0IGljbXB2Nm1zZ19taWJfZGV2aWNlIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3NvY2suaCBiL2luY2x1ZGUvbmV0L3NvY2suaAppbmRleCBhYmI2ZTBmLi5iYjk3MmQyIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC9zb2NrLmgKKysrIGIvaW5jbHVkZS9uZXQvc29jay5oCkBAIC01Myw2ICs1Myw4IEBACiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNfY291bnRlci5oPgogCiAjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdF9udWxscy5oPgpAQCAtNjIsNiArNjQsMjIgQEAKICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAjaW5jbHVkZSA8bmV0L2NoZWNrc3VtLmg+CiAKK3N0cnVjdCBjZ3JvdXA7CitzdHJ1Y3QgY2dyb3VwX3N1YnN5czsKKyNpZmRlZiBDT05GSUdfTkVUCitpbnQgbWVtX2Nncm91cF9zb2NrZXRzX2luaXQoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKTsKK3ZvaWQgbWVtX2Nncm91cF9zb2NrZXRzX2Rlc3Ryb3koc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lCitpbnQgbWVtX2Nncm91cF9zb2NrZXRzX2luaXQoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZQordm9pZCBtZW1fY2dyb3VwX3NvY2tldHNfZGVzdHJveShzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MpCit7Cit9CisjZW5kaWYKIC8qCiAgKiBUaGlzIHN0cnVjdHVyZSByZWFsbHkgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cC4KICAqIE1vc3Qgb2YgaXQgaXMgZm9yIFRDUCwgYW5kIG5vdCB1c2VkIGJ5IGFueSBvZgpAQCAtMTY3LDYgKzE4NSw3IEBACiAJLyogcHVibGljOiAqLwogfTsKIAorc3RydWN0IGNnX3Byb3RvOwogLyoqCiAgICoJc3RydWN0IHNvY2sgLSBuZXR3b3JrIGxheWVyIHJlcHJlc2VudGF0aW9uIG9mIHNvY2tldHMKICAgKglAX19za19jb21tb246IHNoYXJlZCBsYXlvdXQgd2l0aCBpbmV0X3RpbWV3YWl0X3NvY2sKQEAgLTIyNyw2ICsyNDYsNyBAQAogICAqCUBza19zZWN1cml0eTogdXNlZCBieSBzZWN1cml0eSBtb2R1bGVzCiAgICoJQHNrX21hcms6IGdlbmVyaWMgcGFja2V0IG1hcmsKICAgKglAc2tfY2xhc3NpZDogdGhpcyBzb2NrZXQncyBjZ3JvdXAgY2xhc3NpZAorICAqCUBza19jZ3JwOiB0aGlzIHNvY2tldCdzIGNncm91cC1zcGVjaWZpYyBwcm90byBkYXRhCiAgICoJQHNrX3dyaXRlX3BlbmRpbmc6IGEgd3JpdGUgdG8gc3RyZWFtIHNvY2tldCB3YWl0cyB0byBzdGFydAogICAqCUBza19zdGF0ZV9jaGFuZ2U6IGNhbGxiYWNrIHRvIGluZGljYXRlIGNoYW5nZSBpbiB0aGUgc3RhdGUgb2YgdGhlIHNvY2sKICAgKglAc2tfZGF0YV9yZWFkeTogY2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhlcmUgaXMgZGF0YSB0byBiZSBwcm9jZXNzZWQKQEAgLTMwNiw4ICszMjYsOCBAQAogCWttZW1jaGVja19iaXRmaWVsZF9lbmQoZmxhZ3MpOwogCWludAkJCXNrX3dtZW1fcXVldWVkOwogCWdmcF90CQkJc2tfYWxsb2NhdGlvbjsKLQlpbnQJCQlza19yb3V0ZV9jYXBzOwotCWludAkJCXNrX3JvdXRlX25vY2FwczsKKwluZXRkZXZfZmVhdHVyZXNfdAlza19yb3V0ZV9jYXBzOworCW5ldGRldl9mZWF0dXJlc190CXNrX3JvdXRlX25vY2FwczsKIAlpbnQJCQlza19nc29fdHlwZTsKIAl1bnNpZ25lZCBpbnQJCXNrX2dzb19tYXhfc2l6ZTsKIAlpbnQJCQlza19yY3Zsb3dhdDsKQEAgLTMyMCw2ICszNDAsOSBAQAogCXVuc2lnbmVkIHNob3J0CQlza19hY2tfYmFja2xvZzsKIAl1bnNpZ25lZCBzaG9ydAkJc2tfbWF4X2Fja19iYWNrbG9nOwogCV9fdTMyCQkJc2tfcHJpb3JpdHk7CisjaWZkZWYgQ09ORklHX0NHUk9VUFMKKwlfX3UzMgkJCXNrX2NncnBfcHJpb2lkeDsKKyNlbmRpZgogCXN0cnVjdCBwaWQJCSpza19wZWVyX3BpZDsKIAljb25zdCBzdHJ1Y3QgY3JlZAkqc2tfcGVlcl9jcmVkOwogCWxvbmcJCQlza19yY3Z0aW1lbzsKQEAgLTMzOCw2ICszNjEsNyBAQAogI2VuZGlmCiAJX191MzIJCQlza19tYXJrOwogCXUzMgkJCXNrX2NsYXNzaWQ7CisJc3RydWN0IGNnX3Byb3RvCQkqc2tfY2dycDsKIAl2b2lkCQkJKCpza19zdGF0ZV9jaGFuZ2UpKHN0cnVjdCBzb2NrICpzayk7CiAJdm9pZAkJCSgqc2tfZGF0YV9yZWFkeSkoc3RydWN0IHNvY2sgKnNrLCBpbnQgYnl0ZXMpOwogCXZvaWQJCQkoKnNrX3dyaXRlX3NwYWNlKShzdHJ1Y3Qgc29jayAqc2spOwpAQCAtNTYzLDYgKzU4Nyw3IEBACiAJU09DS19GQVNZTkMsIC8qIGZhc3luYygpIGFjdGl2ZSAqLwogCVNPQ0tfUlhRX09WRkwsCiAJU09DS19aRVJPQ09QWSwgLyogYnVmZmVycyBmcm9tIHVzZXJzcGFjZSAqLworCVNPQ0tfV0lGSV9TVEFUVVMsIC8qIHB1c2ggd2lmaSBzdGF0dXMgdG8gdXNlcnNwYWNlICovCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgc29ja19jb3B5X2ZsYWdzKHN0cnVjdCBzb2NrICpuc2ssIHN0cnVjdCBzb2NrICpvc2spCkBAIC02MzcsMTIgKzY2MiwxNCBAQAogCiAvKgogICogVGFrZSBpbnRvIGFjY291bnQgc2l6ZSBvZiByZWNlaXZlIHF1ZXVlIGFuZCBiYWNrbG9nIHF1ZXVlCisgKiBEbyBub3QgdGFrZSBpbnRvIGFjY291bnQgdGhpcyBza2IgdHJ1ZXNpemUsCisgKiB0byBhbGxvdyBldmVuIGEgc2luZ2xlIGJpZyBwYWNrZXQgdG8gY29tZS4KICAqLwogc3RhdGljIGlubGluZSBib29sIHNrX3JjdnF1ZXVlc19mdWxsKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAl1bnNpZ25lZCBpbnQgcXNpemUgPSBzay0+c2tfYmFja2xvZy5sZW4gKyBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpOwogCi0JcmV0dXJuIHFzaXplICsgc2tiLT50cnVlc2l6ZSA+IHNrLT5za19yY3ZidWY7CisJcmV0dXJuIHFzaXplID4gc2stPnNrX3JjdmJ1ZjsKIH0KIAogLyogVGhlIHBlci1zb2NrZXQgc3BpbmxvY2sgbXVzdCBiZSBoZWxkIGhlcmUuICovCkBAIC04MzMsNiArODYwLDM3IEBACiAjaWZkZWYgU09DS19SRUZDTlRfREVCVUcKIAlhdG9taWNfdAkJc29ja3M7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9LTUVNCisJLyoKKwkgKiBjZ3JvdXAgc3BlY2lmaWMgaW5pdC9kZWluaXQgZnVuY3Rpb25zLiBDYWxsZWQgb25jZSBmb3IgYWxsCisJICogcHJvdG9jb2xzIHRoYXQgaW1wbGVtZW50IGl0LCBmcm9tIGNncm91cHMgcG9wdWxhdGUgZnVuY3Rpb24uCisJICogVGhpcyBmdW5jdGlvbiBoYXMgdG8gc2V0dXAgYW55IGZpbGVzIHRoZSBwcm90b2NvbCB3YW50IHRvCisJICogYXBwZWFyIGluIHRoZSBrbWVtIGNncm91cCBmaWxlc3lzdGVtLgorCSAqLworCWludAkJCSgqaW5pdF9jZ3JvdXApKHN0cnVjdCBjZ3JvdXAgKmNncnAsCisJCQkJCSAgICAgICBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MpOworCXZvaWQJCQkoKmRlc3Ryb3lfY2dyb3VwKShzdHJ1Y3QgY2dyb3VwICpjZ3JwLAorCQkJCQkJICBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MpOworCXN0cnVjdCBjZ19wcm90bwkJKigqcHJvdG9fY2dyb3VwKShzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOworI2VuZGlmCit9OworCitzdHJ1Y3QgY2dfcHJvdG8geworCXZvaWQJCQkoKmVudGVyX21lbW9yeV9wcmVzc3VyZSkoc3RydWN0IHNvY2sgKnNrKTsKKwlzdHJ1Y3QgcmVzX2NvdW50ZXIJKm1lbW9yeV9hbGxvY2F0ZWQ7CS8qIEN1cnJlbnQgYWxsb2NhdGVkIG1lbW9yeS4gKi8KKwlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIJKnNvY2tldHNfYWxsb2NhdGVkOwkvKiBDdXJyZW50IG51bWJlciBvZiBzb2NrZXRzLiAqLworCWludAkJCSptZW1vcnlfcHJlc3N1cmU7CisJbG9uZwkJCSpzeXNjdGxfbWVtOworCS8qCisJICogbWVtY2cgZmllbGQgaXMgdXNlZCB0byBmaW5kIHdoaWNoIG1lbWNnIHdlIGJlbG9uZyBkaXJlY3RseQorCSAqIEVhY2ggbWVtY2cgc3RydWN0IGNhbiBob2xkIG1vcmUgdGhhbiBvbmUgY2dfcHJvdG8sIHNvIGNvbnRhaW5lcl9vZgorCSAqIHdvbid0IHJlYWxseSBjdXQuCisJICoKKwkgKiBUaGUgZWxlZ2FudCBzb2x1dGlvbiB3b3VsZCBiZSBoYXZpbmcgYW4gaW52ZXJzZSBmdW5jdGlvbiB0bworCSAqIHByb3RvX2Nncm91cCBpbiBzdHJ1Y3QgcHJvdG8sIGJ1dCB0aGF0IG1lYW5zIHBvbGx1dGluZyB0aGUgc3RydWN0dXJlCisJICogZm9yIGV2ZXJ5Ym9keSwgaW5zdGVhZCBvZiBqdXN0IGZvciBtZW1jZyB1c2Vycy4KKwkgKi8KKwlzdHJ1Y3QgbWVtX2Nncm91cAkqbWVtY2c7CiB9OwogCiBleHRlcm4gaW50IHByb3RvX3JlZ2lzdGVyKHN0cnVjdCBwcm90byAqcHJvdCwgaW50IGFsbG9jX3NsYWIpOwpAQCAtODUxLDcgKzkwOSw3IEBACiAJICAgICAgIHNrLT5za19wcm90LT5uYW1lLCBzaywgYXRvbWljX3JlYWQoJnNrLT5za19wcm90LT5zb2NrcykpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgc2tfcmVmY250X2RlYnVnX3JlbGVhc2UoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoraW5saW5lIHZvaWQgc2tfcmVmY250X2RlYnVnX3JlbGVhc2UoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQogewogCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JlZmNudCkgIT0gMSkKIAkJcHJpbnRrKEtFUk5fREVCVUcgIkRlc3RydWN0aW9uIG9mIHRoZSAlcyBzb2NrZXQgJXAgZGVsYXllZCwgcmVmY250PSVkXG4iLApAQCAtODYzLDYgKzkyMSwyMDggQEAKICNkZWZpbmUgc2tfcmVmY250X2RlYnVnX3JlbGVhc2Uoc2spIGRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZiAvKiBTT0NLX1JFRkNOVF9ERUJVRyAqLwogCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfS01FTQorZXh0ZXJuIHN0cnVjdCBqdW1wX2xhYmVsX2tleSBtZW1jZ19zb2NrZXRfbGltaXRfZW5hYmxlZDsKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNnX3Byb3RvICpwYXJlbnRfY2dfcHJvdG8oc3RydWN0IHByb3RvICpwcm90bywKKwkJCQkJICAgICAgIHN0cnVjdCBjZ19wcm90byAqY2dfcHJvdG8pCit7CisJcmV0dXJuIHByb3RvLT5wcm90b19jZ3JvdXAocGFyZW50X21lbV9jZ3JvdXAoY2dfcHJvdG8tPm1lbWNnKSk7Cit9CisjZGVmaW5lIG1lbV9jZ3JvdXBfc29ja2V0c19lbmFibGVkIHN0YXRpY19icmFuY2goJm1lbWNnX3NvY2tldF9saW1pdF9lbmFibGVkKQorI2Vsc2UKKyNkZWZpbmUgbWVtX2Nncm91cF9zb2NrZXRzX2VuYWJsZWQgMAorc3RhdGljIGlubGluZSBzdHJ1Y3QgY2dfcHJvdG8gKnBhcmVudF9jZ19wcm90byhzdHJ1Y3QgcHJvdG8gKnByb3RvLAorCQkJCQkgICAgICAgc3RydWN0IGNnX3Byb3RvICpjZ19wcm90bykKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBza19oYXNfbWVtb3J5X3ByZXNzdXJlKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwlyZXR1cm4gc2stPnNrX3Byb3QtPm1lbW9yeV9wcmVzc3VyZSAhPSBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc2tfdW5kZXJfbWVtb3J5X3ByZXNzdXJlKGNvbnN0IHN0cnVjdCBzb2NrICpzaykKK3sKKwlpZiAoIXNrLT5za19wcm90LT5tZW1vcnlfcHJlc3N1cmUpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChtZW1fY2dyb3VwX3NvY2tldHNfZW5hYmxlZCAmJiBzay0+c2tfY2dycCkKKwkJcmV0dXJuICEhKnNrLT5za19jZ3JwLT5tZW1vcnlfcHJlc3N1cmU7CisKKwlyZXR1cm4gISEqc2stPnNrX3Byb3QtPm1lbW9yeV9wcmVzc3VyZTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrX2xlYXZlX21lbW9yeV9wcmVzc3VyZShzdHJ1Y3Qgc29jayAqc2spCit7CisJaW50ICptZW1vcnlfcHJlc3N1cmUgPSBzay0+c2tfcHJvdC0+bWVtb3J5X3ByZXNzdXJlOworCisJaWYgKCFtZW1vcnlfcHJlc3N1cmUpCisJCXJldHVybjsKKworCWlmICgqbWVtb3J5X3ByZXNzdXJlKQorCQkqbWVtb3J5X3ByZXNzdXJlID0gMDsKKworCWlmIChtZW1fY2dyb3VwX3NvY2tldHNfZW5hYmxlZCAmJiBzay0+c2tfY2dycCkgeworCQlzdHJ1Y3QgY2dfcHJvdG8gKmNnX3Byb3RvID0gc2stPnNrX2NncnA7CisJCXN0cnVjdCBwcm90byAqcHJvdCA9IHNrLT5za19wcm90OworCisJCWZvciAoOyBjZ19wcm90bzsgY2dfcHJvdG8gPSBwYXJlbnRfY2dfcHJvdG8ocHJvdCwgY2dfcHJvdG8pKQorCQkJaWYgKCpjZ19wcm90by0+bWVtb3J5X3ByZXNzdXJlKQorCQkJCSpjZ19wcm90by0+bWVtb3J5X3ByZXNzdXJlID0gMDsKKwl9CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNrX2VudGVyX21lbW9yeV9wcmVzc3VyZShzdHJ1Y3Qgc29jayAqc2spCit7CisJaWYgKCFzay0+c2tfcHJvdC0+ZW50ZXJfbWVtb3J5X3ByZXNzdXJlKQorCQlyZXR1cm47CisKKwlpZiAobWVtX2Nncm91cF9zb2NrZXRzX2VuYWJsZWQgJiYgc2stPnNrX2NncnApIHsKKwkJc3RydWN0IGNnX3Byb3RvICpjZ19wcm90byA9IHNrLT5za19jZ3JwOworCQlzdHJ1Y3QgcHJvdG8gKnByb3QgPSBzay0+c2tfcHJvdDsKKworCQlmb3IgKDsgY2dfcHJvdG87IGNnX3Byb3RvID0gcGFyZW50X2NnX3Byb3RvKHByb3QsIGNnX3Byb3RvKSkKKwkJCWNnX3Byb3RvLT5lbnRlcl9tZW1vcnlfcHJlc3N1cmUoc2spOworCX0KKworCXNrLT5za19wcm90LT5lbnRlcl9tZW1vcnlfcHJlc3N1cmUoc2spOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcgc2tfcHJvdF9tZW1fbGltaXRzKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgaW50IGluZGV4KQoreworCWxvbmcgKnByb3QgPSBzay0+c2tfcHJvdC0+c3lzY3RsX21lbTsKKwlpZiAobWVtX2Nncm91cF9zb2NrZXRzX2VuYWJsZWQgJiYgc2stPnNrX2NncnApCisJCXByb3QgPSBzay0+c2tfY2dycC0+c3lzY3RsX21lbTsKKwlyZXR1cm4gcHJvdFtpbmRleF07Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1jZ19tZW1vcnlfYWxsb2NhdGVkX2FkZChzdHJ1Y3QgY2dfcHJvdG8gKnByb3QsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYW10LAorCQkJCQkgICAgICBpbnQgKnBhcmVudF9zdGF0dXMpCit7CisJc3RydWN0IHJlc19jb3VudGVyICpmYWlsOworCWludCByZXQ7CisKKwlyZXQgPSByZXNfY291bnRlcl9jaGFyZ2UocHJvdC0+bWVtb3J5X2FsbG9jYXRlZCwKKwkJCQkgYW10IDw8IFBBR0VfU0hJRlQsICZmYWlsKTsKKworCWlmIChyZXQgPCAwKQorCQkqcGFyZW50X3N0YXR1cyA9IE9WRVJfTElNSVQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZW1jZ19tZW1vcnlfYWxsb2NhdGVkX3N1YihzdHJ1Y3QgY2dfcHJvdG8gKnByb3QsCisJCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgYW10KQoreworCXJlc19jb3VudGVyX3VuY2hhcmdlKHByb3QtPm1lbW9yeV9hbGxvY2F0ZWQsIGFtdCA8PCBQQUdFX1NISUZUKTsKK30KKworc3RhdGljIGlubGluZSB1NjQgbWVtY2dfbWVtb3J5X2FsbG9jYXRlZF9yZWFkKHN0cnVjdCBjZ19wcm90byAqcHJvdCkKK3sKKwl1NjQgcmV0OworCXJldCA9IHJlc19jb3VudGVyX3JlYWRfdTY0KHByb3QtPm1lbW9yeV9hbGxvY2F0ZWQsIFJFU19VU0FHRSk7CisJcmV0dXJuIHJldCA+PiBQQUdFX1NISUZUOworfQorCitzdGF0aWMgaW5saW5lIGxvbmcKK3NrX21lbW9yeV9hbGxvY2F0ZWQoY29uc3Qgc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBwcm90byAqcHJvdCA9IHNrLT5za19wcm90OworCWlmIChtZW1fY2dyb3VwX3NvY2tldHNfZW5hYmxlZCAmJiBzay0+c2tfY2dycCkKKwkJcmV0dXJuIG1lbWNnX21lbW9yeV9hbGxvY2F0ZWRfcmVhZChzay0+c2tfY2dycCk7CisKKwlyZXR1cm4gYXRvbWljX2xvbmdfcmVhZChwcm90LT5tZW1vcnlfYWxsb2NhdGVkKTsKK30KKworc3RhdGljIGlubGluZSBsb25nCitza19tZW1vcnlfYWxsb2NhdGVkX2FkZChzdHJ1Y3Qgc29jayAqc2ssIGludCBhbXQsIGludCAqcGFyZW50X3N0YXR1cykKK3sKKwlzdHJ1Y3QgcHJvdG8gKnByb3QgPSBzay0+c2tfcHJvdDsKKworCWlmIChtZW1fY2dyb3VwX3NvY2tldHNfZW5hYmxlZCAmJiBzay0+c2tfY2dycCkgeworCQltZW1jZ19tZW1vcnlfYWxsb2NhdGVkX2FkZChzay0+c2tfY2dycCwgYW10LCBwYXJlbnRfc3RhdHVzKTsKKwkJLyogdXBkYXRlIHRoZSByb290IGNncm91cCByZWdhcmRsZXNzICovCisJCWF0b21pY19sb25nX2FkZF9yZXR1cm4oYW10LCBwcm90LT5tZW1vcnlfYWxsb2NhdGVkKTsKKwkJcmV0dXJuIG1lbWNnX21lbW9yeV9hbGxvY2F0ZWRfcmVhZChzay0+c2tfY2dycCk7CisJfQorCisJcmV0dXJuIGF0b21pY19sb25nX2FkZF9yZXR1cm4oYW10LCBwcm90LT5tZW1vcnlfYWxsb2NhdGVkKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitza19tZW1vcnlfYWxsb2NhdGVkX3N1YihzdHJ1Y3Qgc29jayAqc2ssIGludCBhbXQsIGludCBwYXJlbnRfc3RhdHVzKQoreworCXN0cnVjdCBwcm90byAqcHJvdCA9IHNrLT5za19wcm90OworCisJaWYgKG1lbV9jZ3JvdXBfc29ja2V0c19lbmFibGVkICYmIHNrLT5za19jZ3JwICYmCisJICAgIHBhcmVudF9zdGF0dXMgIT0gT1ZFUl9MSU1JVCkgLyogT3RoZXJ3aXNlIHdhcyB1bmNoYXJnZWQgYWxyZWFkeSAqLworCQltZW1jZ19tZW1vcnlfYWxsb2NhdGVkX3N1Yihzay0+c2tfY2dycCwgYW10KTsKKworCWF0b21pY19sb25nX3N1YihhbXQsIHByb3QtPm1lbW9yeV9hbGxvY2F0ZWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tfc29ja2V0c19hbGxvY2F0ZWRfZGVjKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgcHJvdG8gKnByb3QgPSBzay0+c2tfcHJvdDsKKworCWlmIChtZW1fY2dyb3VwX3NvY2tldHNfZW5hYmxlZCAmJiBzay0+c2tfY2dycCkgeworCQlzdHJ1Y3QgY2dfcHJvdG8gKmNnX3Byb3RvID0gc2stPnNrX2NncnA7CisKKwkJZm9yICg7IGNnX3Byb3RvOyBjZ19wcm90byA9IHBhcmVudF9jZ19wcm90byhwcm90LCBjZ19wcm90bykpCisJCQlwZXJjcHVfY291bnRlcl9kZWMoY2dfcHJvdG8tPnNvY2tldHNfYWxsb2NhdGVkKTsKKwl9CisKKwlwZXJjcHVfY291bnRlcl9kZWMocHJvdC0+c29ja2V0c19hbGxvY2F0ZWQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2tfc29ja2V0c19hbGxvY2F0ZWRfaW5jKHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgcHJvdG8gKnByb3QgPSBzay0+c2tfcHJvdDsKKworCWlmIChtZW1fY2dyb3VwX3NvY2tldHNfZW5hYmxlZCAmJiBzay0+c2tfY2dycCkgeworCQlzdHJ1Y3QgY2dfcHJvdG8gKmNnX3Byb3RvID0gc2stPnNrX2NncnA7CisKKwkJZm9yICg7IGNnX3Byb3RvOyBjZ19wcm90byA9IHBhcmVudF9jZ19wcm90byhwcm90LCBjZ19wcm90bykpCisJCQlwZXJjcHVfY291bnRlcl9pbmMoY2dfcHJvdG8tPnNvY2tldHNfYWxsb2NhdGVkKTsKKwl9CisKKwlwZXJjcHVfY291bnRlcl9pbmMocHJvdC0+c29ja2V0c19hbGxvY2F0ZWQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorc2tfc29ja2V0c19hbGxvY2F0ZWRfcmVhZF9wb3NpdGl2ZShzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHByb3RvICpwcm90ID0gc2stPnNrX3Byb3Q7CisKKwlpZiAobWVtX2Nncm91cF9zb2NrZXRzX2VuYWJsZWQgJiYgc2stPnNrX2NncnApCisJCXJldHVybiBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUoc2stPnNrX2NncnAtPnNvY2tldHNfYWxsb2NhdGVkKTsKKworCXJldHVybiBwZXJjcHVfY291bnRlcl9zdW1fcG9zaXRpdmUocHJvdC0+c29ja2V0c19hbGxvY2F0ZWQpOworfQorCitzdGF0aWMgaW5saW5lIGludAorcHJvdG9fc29ja2V0c19hbGxvY2F0ZWRfc3VtX3Bvc2l0aXZlKHN0cnVjdCBwcm90byAqcHJvdCkKK3sKKwlyZXR1cm4gcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKHByb3QtPnNvY2tldHNfYWxsb2NhdGVkKTsKK30KKworc3RhdGljIGlubGluZSBsb25nCitwcm90b19tZW1vcnlfYWxsb2NhdGVkKHN0cnVjdCBwcm90byAqcHJvdCkKK3sKKwlyZXR1cm4gYXRvbWljX2xvbmdfcmVhZChwcm90LT5tZW1vcnlfYWxsb2NhdGVkKTsKK30KKworc3RhdGljIGlubGluZSBib29sCitwcm90b19tZW1vcnlfcHJlc3N1cmUoc3RydWN0IHByb3RvICpwcm90KQoreworCWlmICghcHJvdC0+bWVtb3J5X3ByZXNzdXJlKQorCQlyZXR1cm4gZmFsc2U7CisJcmV0dXJuICEhKnByb3QtPm1lbW9yeV9wcmVzc3VyZTsKK30KKwogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIC8qIENhbGxlZCB3aXRoIGxvY2FsIGJoIGRpc2FibGVkICovCkBAIC0xMDg5LDggKzEzNDksOCBAQAogCQkJCQkgIHN0cnVjdCBwcm90byAqcHJvdCk7CiBleHRlcm4gdm9pZAkJCXNrX2ZyZWUoc3RydWN0IHNvY2sgKnNrKTsKIGV4dGVybiB2b2lkCQkJc2tfcmVsZWFzZV9rZXJuZWwoc3RydWN0IHNvY2sgKnNrKTsKLWV4dGVybiBzdHJ1Y3Qgc29jawkJKnNrX2Nsb25lKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKLQkJCQkJICBjb25zdCBnZnBfdCBwcmlvcml0eSk7CitleHRlcm4gc3RydWN0IHNvY2sJCSpza19jbG9uZV9sb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaywKKwkJCQkJICAgICAgIGNvbnN0IGdmcF90IHByaW9yaXR5KTsKIAogZXh0ZXJuIHN0cnVjdCBza19idWZmCQkqc29ja193bWFsbG9jKHN0cnVjdCBzb2NrICpzaywKIAkJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzaXplLCBpbnQgZm9yY2UsCkBAIC0xMzkzLDcgKzE2NTMsNyBAQAogCiBleHRlcm4gdm9pZCBza19zZXR1cF9jYXBzKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIAotc3RhdGljIGlubGluZSB2b2lkIHNrX25vY2Fwc19hZGQoc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZ3MpCitzdGF0aWMgaW5saW5lIHZvaWQgc2tfbm9jYXBzX2FkZChzdHJ1Y3Qgc29jayAqc2ssIG5ldGRldl9mZWF0dXJlc190IGZsYWdzKQogewogCXNrLT5za19yb3V0ZV9ub2NhcHMgfD0gZmxhZ3M7CiAJc2stPnNrX3JvdXRlX2NhcHMgJj0gfmZsYWdzOwpAQCAtMTY3MCw3ICsxOTMwLDcgQEAKIAogCXBhZ2UgPSBhbGxvY19wYWdlcyhzay0+c2tfYWxsb2NhdGlvbiwgMCk7CiAJaWYgKCFwYWdlKSB7Ci0JCXNrLT5za19wcm90LT5lbnRlcl9tZW1vcnlfcHJlc3N1cmUoc2spOworCQlza19lbnRlcl9tZW1vcnlfcHJlc3N1cmUoc2spOwogCQlza19zdHJlYW1fbW9kZXJhdGVfc25kYnVmKHNrKTsKIAl9CiAJcmV0dXJuIHBhZ2U7CkBAIC0xNzE0LDYgKzE5NzQsOCBAQAogCiBleHRlcm4gdm9pZCBfX3NvY2tfcmVjdl90aW1lc3RhbXAoc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc29jayAqc2ssCiAJc3RydWN0IHNrX2J1ZmYgKnNrYik7CitleHRlcm4gdm9pZCBfX3NvY2tfcmVjdl93aWZpX3N0YXR1cyhzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzb2NrICpzaywKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKIAogc3RhdGljIF9faW5saW5lX18gdm9pZAogc29ja19yZWN2X3RpbWVzdGFtcChzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTE3NDEsNiArMjAwMyw5IEBACiAJCV9fc29ja19yZWN2X3RpbWVzdGFtcChtc2csIHNrLCBza2IpOwogCWVsc2UKIAkJc2stPnNrX3N0YW1wID0ga3Q7CisKKwlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1dJRklfU1RBVFVTKSAmJiBza2ItPndpZmlfYWNrZWRfdmFsaWQpCisJCV9fc29ja19yZWN2X3dpZmlfc3RhdHVzKG1zZywgc2ssIHNrYik7CiB9CiAKIGV4dGVybiB2b2lkIF9fc29ja19yZWN2X3RzX2FuZF9kcm9wcyhzdHJ1Y3QgbXNnaGRyICptc2csIHN0cnVjdCBzb2NrICpzaywKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L3RjcC5oIGIvaW5jbHVkZS9uZXQvdGNwLmgKaW5kZXggYmIxOGM0ZC4uMDExOGVhOSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9uZXQvdGNwLmgKKysrIGIvaW5jbHVkZS9uZXQvdGNwLmgKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxuZXQvZHN0Lmg+CiAKICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWNvbnRyb2wuaD4KIAogZXh0ZXJuIHN0cnVjdCBpbmV0X2hhc2hpbmZvIHRjcF9oYXNoaW5mbzsKIApAQCAtMjI5LDcgKzIzMCw2IEBACiBleHRlcm4gaW50IHN5c2N0bF90Y3BfcmVvcmRlcmluZzsKIGV4dGVybiBpbnQgc3lzY3RsX3RjcF9lY247CiBleHRlcm4gaW50IHN5c2N0bF90Y3BfZHNhY2s7Ci1leHRlcm4gbG9uZyBzeXNjdGxfdGNwX21lbVszXTsKIGV4dGVybiBpbnQgc3lzY3RsX3RjcF93bWVtWzNdOwogZXh0ZXJuIGludCBzeXNjdGxfdGNwX3JtZW1bM107CiBleHRlcm4gaW50IHN5c2N0bF90Y3BfYXBwX3dpbjsKQEAgLTI4NSw3ICsyODUsNyBAQAogCX0KIAogCWlmIChzay0+c2tfd21lbV9xdWV1ZWQgPiBTT0NLX01JTl9TTkRCVUYgJiYKLQkgICAgYXRvbWljX2xvbmdfcmVhZCgmdGNwX21lbW9yeV9hbGxvY2F0ZWQpID4gc3lzY3RsX3RjcF9tZW1bMl0pCisJICAgIHNrX21lbW9yeV9hbGxvY2F0ZWQoc2spID4gc2tfcHJvdF9tZW1fbGltaXRzKHNrLCAyKSkKIAkJcmV0dXJuIHRydWU7CiAJcmV0dXJuIGZhbHNlOwogfQpAQCAtNjI4LDcgKzYyOCw3IEBACiBzdHJ1Y3QgdGNwX3NrYl9jYiB7CiAJdW5pb24gewogCQlzdHJ1Y3QgaW5ldF9za2JfcGFybQloNDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJc3RydWN0IGluZXQ2X3NrYl9wYXJtCWg2OwogI2VuZGlmCiAJfSBoZWFkZXI7CS8qIEZvciBpbmNvbWluZyBmcmFtZXMJCSovCkBAIC03NzMsMTIgKzc3MywxMiBAQAogCiBzdGF0aWMgaW5saW5lIGludCB0Y3BfaXNfZmFjayhjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQogewotCXJldHVybiB0cC0+cnhfb3B0LnNhY2tfb2sgJiAyOworCXJldHVybiB0cC0+cnhfb3B0LnNhY2tfb2sgJiBUQ1BfRkFDS19FTkFCTEVEOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgdGNwX2VuYWJsZV9mYWNrKHN0cnVjdCB0Y3Bfc29jayAqdHApCiB7Ci0JdHAtPnJ4X29wdC5zYWNrX29rIHw9IDI7CisJdHAtPnJ4X29wdC5zYWNrX29rIHw9IFRDUF9GQUNLX0VOQUJMRUQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IHRjcF9sZWZ0X291dChjb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwKQpAQCAtODM0LDYgKzgzNCwxNCBAQAogZXh0ZXJuIHZvaWQgdGNwX2VudGVyX2N3cihzdHJ1Y3Qgc29jayAqc2ssIGNvbnN0IGludCBzZXRfc3N0aHJlc2gpOwogZXh0ZXJuIF9fdTMyIHRjcF9pbml0X2N3bmQoY29uc3Qgc3RydWN0IHRjcF9zb2NrICp0cCwgY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIAorLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIE1TUyBvZiBhdmFpbGFibGUgY3duZCBmb3Igd2hpY2ggVFNPIGRlZmVycworICogc2VuZGluZyBpZiBub3QgdXNpbmcgc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3IuCisgKi8KK3N0YXRpYyBpbmxpbmUgX191MzIgdGNwX21heF90c29fZGVmZXJyZWRfbXNzKGNvbnN0IHN0cnVjdCB0Y3Bfc29jayAqdHApCit7CisJcmV0dXJuIDM7Cit9CisKIC8qIFNsb3cgc3RhcnQgd2l0aCBkZWxhY2sgcHJvZHVjZXMgMyBwYWNrZXRzIG9mIGJ1cnN0LCBzbyB0aGF0CiAgKiBpdCBpcyBzYWZlICJkZSBmYWN0byIuICBUaGlzIHdpbGwgYmUgdGhlIGRlZmF1bHQgLSBzYW1lIGFzCiAgKiB0aGUgZGVmYXVsdCByZW9yZGVyaW5nIHRocmVzaG9sZCAtIGJ1dCBpZiByZW9yZGVyaW5nIGluY3JlYXNlcywKQEAgLTExNDQsNyArMTE1Miw3IEBACiAvKiAtIHNvY2sgYmxvY2sgKi8KIHN0cnVjdCB0Y3BfbWQ1c2lnX2luZm8gewogCXN0cnVjdCB0Y3A0X21kNXNpZ19rZXkJKmtleXM0OwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJc3RydWN0IHRjcDZfbWQ1c2lnX2tleQkqa2V5czY7CiAJdTMyCQkJZW50cmllczY7CiAJdTMyCQkJYWxsb2NlZDY7CkBAIC0xMTcxLDcgKzExNzksNyBAQAogCiB1bmlvbiB0Y3BfbWQ1c3VtX2Jsb2NrIHsKIAlzdHJ1Y3QgdGNwNF9wc2V1ZG9oZHIgaXA0OwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJc3RydWN0IHRjcDZfcHNldWRvaGRyIGlwNjsKICNlbmRpZgogfTsKQEAgLTE0MzAsNyArMTQzOCw4IEBACiBleHRlcm4gdm9pZCB0Y3BfdjRfZGVzdHJveV9zb2NrKHN0cnVjdCBzb2NrICpzayk7CiAKIGV4dGVybiBpbnQgdGNwX3Y0X2dzb19zZW5kX2NoZWNrKHN0cnVjdCBza19idWZmICpza2IpOwotZXh0ZXJuIHN0cnVjdCBza19idWZmICp0Y3BfdHNvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGZlYXR1cmVzKTsKK2V4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqdGNwX3Rzb19zZWdtZW50KHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgICAgIG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKTsKIGV4dGVybiBzdHJ1Y3Qgc2tfYnVmZiAqKnRjcF9ncm9fcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsCiAJCQkJCXN0cnVjdCBza19idWZmICpza2IpOwogZXh0ZXJuIHN0cnVjdCBza19idWZmICoqdGNwNF9ncm9fcmVjZWl2ZShzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsCmRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC90Y3BfbWVtY29udHJvbC5oIGIvaW5jbHVkZS9uZXQvdGNwX21lbWNvbnRyb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTEyMDgyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9uZXQvdGNwX21lbWNvbnRyb2wuaApAQCAtMCwwICsxLDE5IEBACisjaWZuZGVmIF9UQ1BfTUVNQ0dfSAorI2RlZmluZSBfVENQX01FTUNHX0gKKworc3RydWN0IHRjcF9tZW1jb250cm9sIHsKKwlzdHJ1Y3QgY2dfcHJvdG8gY2dfcHJvdG87CisJLyogcGVyLWNncm91cCB0Y3AgbWVtb3J5IHByZXNzdXJlIGtub2JzICovCisJc3RydWN0IHJlc19jb3VudGVyIHRjcF9tZW1vcnlfYWxsb2NhdGVkOworCXN0cnVjdCBwZXJjcHVfY291bnRlciB0Y3Bfc29ja2V0c19hbGxvY2F0ZWQ7CisJLyogdGhvc2UgdHdvIGFyZSByZWFkLW1vc3RseSwgbGVhdmUgdGhlbSBhdCB0aGUgZW5kICovCisJbG9uZyB0Y3BfcHJvdF9tZW1bM107CisJaW50IHRjcF9tZW1vcnlfcHJlc3N1cmU7Cit9OworCitzdHJ1Y3QgY2dfcHJvdG8gKnRjcF9wcm90b19jZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTsKK2ludCB0Y3BfaW5pdF9jZ3JvdXAoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKTsKK3ZvaWQgdGNwX2Rlc3Ryb3lfY2dyb3VwKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcyk7Cit1bnNpZ25lZCBsb25nIGxvbmcgdGNwX21heF9tZW1vcnkoY29uc3Qgc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTsKK3ZvaWQgdGNwX3Byb3RfbWVtKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgbG9uZyB2YWwsIGludCBpZHgpOworI2VuZGlmIC8qIF9UQ1BfTUVNQ0dfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQvdWRwLmggYi9pbmNsdWRlL25ldC91ZHAuaAppbmRleCAzYjI4NWY0Li5lMzk1OTJmIDEwMDY0NAotLS0gYS9pbmNsdWRlL25ldC91ZHAuaAorKysgYi9pbmNsdWRlL25ldC91ZHAuaApAQCAtNDEsNyArNDEsNyBAQAogc3RydWN0IHVkcF9za2JfY2IgewogCXVuaW9uIHsKIAkJc3RydWN0IGluZXRfc2tiX3Bhcm0JaDQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZCAoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCXN0cnVjdCBpbmV0Nl9za2JfcGFybQloNjsKICNlbmRpZgogCX0gaGVhZGVyOwpAQCAtMTk0LDkgKzE5NCwxNSBAQAogZXh0ZXJuIHN0cnVjdCBzb2NrICp1ZHA0X2xpYl9sb29rdXAoc3RydWN0IG5ldCAqbmV0LCBfX2JlMzIgc2FkZHIsIF9fYmUxNiBzcG9ydCwKIAkJCQkgICAgX19iZTMyIGRhZGRyLCBfX2JlMTYgZHBvcnQsCiAJCQkJICAgIGludCBkaWYpOworZXh0ZXJuIHN0cnVjdCBzb2NrICpfX3VkcDRfbGliX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUzMiBzYWRkciwgX19iZTE2IHNwb3J0LAorCQkJCSAgICBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCwKKwkJCQkgICAgaW50IGRpZiwgc3RydWN0IHVkcF90YWJsZSAqdGJsKTsKIGV4dGVybiBzdHJ1Y3Qgc29jayAqdWRwNl9saWJfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgX19iZTE2IHNwb3J0LAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyLCBfX2JlMTYgZHBvcnQsCiAJCQkJICAgIGludCBkaWYpOworZXh0ZXJuIHN0cnVjdCBzb2NrICpfX3VkcDZfbGliX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHIsIF9fYmUxNiBzcG9ydCwKKwkJCQkgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgX19iZTE2IGRwb3J0LAorCQkJCSAgICBpbnQgZGlmLCBzdHJ1Y3QgdWRwX3RhYmxlICp0YmwpOwogCiAvKgogICogCVNOTVAgc3RhdGlzdGljcyBmb3IgVURQIGFuZCBVRFAtTGl0ZQpAQCAtMjE3LDcgKzIyMyw3IEBACiAJZWxzZQkgICAgU05NUF9JTkNfU1RBVFNfVVNFUigobmV0KS0+bWliLnVkcF9zdGF0c19pbjYsIGZpZWxkKTsgICAgICBcCiB9IHdoaWxlKDApCiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogI2RlZmluZSBVRFBYX0lOQ19TVEFUU19CSChzaywgZmllbGQpIFwKIAlkbyB7IFwKIAkJaWYgKChzayktPnNrX2ZhbWlseSA9PSBBRl9JTkVUKSBcCkBAIC0yNTgsNSArMjY0LDYgQEAKIGV4dGVybiB2b2lkIHVkcF9pbml0KHZvaWQpOwogCiBleHRlcm4gaW50IHVkcDRfdWZvX3NlbmRfY2hlY2soc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci1leHRlcm4gc3RydWN0IHNrX2J1ZmYgKnVkcDRfdWZvX2ZyYWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIHUzMiBmZWF0dXJlcyk7CitleHRlcm4gc3RydWN0IHNrX2J1ZmYgKnVkcDRfdWZvX2ZyYWdtZW50KHN0cnVjdCBza19idWZmICpza2IsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpOwogI2VuZGlmCS8qIF9VRFBfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9uZXQveGZybS5oIGIvaW5jbHVkZS9uZXQveGZybS5oCmluZGV4IGIyMDNlMTQuLjg5MTc0ZTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbmV0L3hmcm0uaAorKysgYi9pbmNsdWRlL25ldC94ZnJtLmgKQEAgLTgyNyw2ICs4MjcsMTQgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGlubGluZSBib29sIGFkZHI0X21hdGNoKF9fYmUzMiBhMSwgX19iZTMyIGEyLCB1OCBwcmVmaXhsZW4pCit7CisJLyogQzk5IDYuNS43ICgzKTogdTMyIDw8IDMyIGlzIHVuZGVmaW5lZCBiZWhhdmlvdXIgKi8KKwlpZiAocHJlZml4bGVuID09IDApCisJCXJldHVybiB0cnVlOworCXJldHVybiAhKChhMSBeIGEyKSAmIGh0b25sKDB4RkZGRkZGRkZ1IDw8ICgzMiAtIHByZWZpeGxlbikpKTsKK30KKwogc3RhdGljIF9faW5saW5lX18KIF9fYmUxNiB4ZnJtX2Zsb3dpX3Nwb3J0KGNvbnN0IHN0cnVjdCBmbG93aSAqZmwsIGNvbnN0IHVuaW9uIGZsb3dpX3VsaSAqdWxpKQogewpAQCAtMTIwOSw4ICsxMjE3LDggQEAKIAkJbWVtY3B5KCZkYWRkci0+YTQsICZmbC0+dS5pcDQuZGFkZHIsIHNpemVvZihkYWRkci0+YTQpKTsKIAkJYnJlYWs7CiAJY2FzZSBBRl9JTkVUNjoKLQkJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKSZzYWRkci0+YTYsICZmbC0+dS5pcDYuc2FkZHIpOwotCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopJmRhZGRyLT5hNiwgJmZsLT51LmlwNi5kYWRkcik7CisJCSooc3RydWN0IGluNl9hZGRyICopc2FkZHItPmE2ID0gZmwtPnUuaXA2LnNhZGRyOworCQkqKHN0cnVjdCBpbjZfYWRkciAqKWRhZGRyLT5hNiA9IGZsLT51LmlwNi5kYWRkcjsKIAkJYnJlYWs7CiAJfQogfQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zY3NpL2xpYmZjb2UuaCBiL2luY2x1ZGUvc2NzaS9saWJmY29lLmgKaW5kZXggZDFlOTVjNi4uNWEzNWEyYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zY3NpL2xpYmZjb2UuaAorKysgYi9pbmNsdWRlL3Njc2kvbGliZmNvZS5oCkBAIC0xNDcsNiArMTQ3LDcgQEAKIAl1OCBtYXBfZGVzdDsKIAl1OCBzcG1hOwogCXU4IHByb2JlX3RyaWVzOworCXU4IHByaW9yaXR5OwogCXU4IGRlc3RfYWRkcltFVEhfQUxFTl07CiAJdTggY3RsX3NyY19hZGRyW0VUSF9BTEVOXTsKIApAQCAtMzAxLDYgKzMwMiw3IEBACiAgKiBAbHBvcnQ6CQkgICAgICAgVGhlIGFzc29jaWF0ZWQgbG9jYWwgcG9ydAogICogQGZjb2VfcGVuZGluZ19xdWV1ZToJICAgICAgIFRoZSBwZW5kaW5nIFJ4IHF1ZXVlIG9mIHNrYnMKICAqIEBmY29lX3BlbmRpbmdfcXVldWVfYWN0aXZlOiBJbmRpY2F0ZXMgaWYgdGhlIHBlbmRpbmcgcXVldWUgaXMgYWN0aXZlCisgKiBAcHJpb3JpdHk6CQkgICAgICAgUGFja2V0IHByaW9yaXR5IChEQ0IpCiAgKiBAbWF4X3F1ZXVlX2RlcHRoOgkgICAgICAgTWF4IHF1ZXVlIGRlcHRoIG9mIHBlbmRpbmcgcXVldWUKICAqIEBtaW5fcXVldWVfZGVwdGg6CSAgICAgICBNaW4gcXVldWUgZGVwdGggb2YgcGVuZGluZyBxdWV1ZQogICogQHRpbWVyOgkJICAgICAgIFRoZSBxdWV1ZSB0aW1lcgpAQCAtMzE2LDYgKzMxOCw3IEBACiAJc3RydWN0IGZjX2xwb3J0CSAgICAgICpscG9ydDsKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICAgZmNvZV9wZW5kaW5nX3F1ZXVlOwogCXU4CQkgICAgICBmY29lX3BlbmRpbmdfcXVldWVfYWN0aXZlOworCXU4CQkgICAgICBwcmlvcml0eTsKIAl1MzIJCSAgICAgIG1heF9xdWV1ZV9kZXB0aDsKIAl1MzIJCSAgICAgIG1pbl9xdWV1ZV9kZXB0aDsKIAlzdHJ1Y3QgdGltZXJfbGlzdCAgICAgdGltZXI7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYXNlLmggYi9pbmNsdWRlL3RhcmdldC90YXJnZXRfY29yZV9iYXNlLmgKaW5kZXggN2Y1ZmVkMy4uNjg3M2M3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfYmFzZS5oCisrKyBiL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX2Jhc2UuaApAQCAtMTAzLDkgKzEwMywxMCBAQAogCVNDRl9TQ1NJX05PTl9EQVRBX0NEQgkJPSAweDAwMDAwMDQwLAogCVNDRl9TQ1NJX0NEQl9FWENFUFRJT04JCT0gMHgwMDAwMDA4MCwKIAlTQ0ZfU0NTSV9SRVNFUlZBVElPTl9DT05GTElDVAk9IDB4MDAwMDAxMDAsCi0JU0NGX1NFX0NNRF9GQUlMRUQJCT0gMHgwMDAwMDQwMCwKKwlTQ0ZfRlVBCQkJCT0gMHgwMDAwMDIwMCwKIAlTQ0ZfU0VfTFVOX0NNRAkJCT0gMHgwMDAwMDgwMCwKIAlTQ0ZfU0VfQUxMT1dfRU9PCQk9IDB4MDAwMDEwMDAsCisJU0NGX0JJREkJCQk9IDB4MDAwMDIwMDAsCiAJU0NGX1NFTlRfQ0hFQ0tfQ09ORElUSU9OCT0gMHgwMDAwNDAwMCwKIAlTQ0ZfT1ZFUkZMT1dfQklUCQk9IDB4MDAwMDgwMDAsCiAJU0NGX1VOREVSRkxPV19CSVQJCT0gMHgwMDAxMDAwMCwKQEAgLTE1NCw2ICsxNTUsNyBAQAogCVRDTV9DSEVDS19DT05ESVRJT05fQUJPUlRfQ01ECQk9IDB4MGQsCiAJVENNX0NIRUNLX0NPTkRJVElPTl9VTklUX0FUVEVOVElPTgk9IDB4MGUsCiAJVENNX0NIRUNLX0NPTkRJVElPTl9OT1RfUkVBRFkJCT0gMHgwZiwKKwlUQ01fUkVTRVJWQVRJT05fQ09ORkxJQ1QJCT0gMHgxMCwKIH07CiAKIHN0cnVjdCBzZV9vYmogewpAQCAtMjExLDcgKzIxMyw2IEBACiAJdTE2CWx1X2dwX2lkOwogCWludAlsdV9ncF92YWxpZF9pZDsKIAl1MzIJbHVfZ3BfbWVtYmVyczsKLQlhdG9taWNfdCBsdV9ncF9zaHV0ZG93bjsKIAlhdG9taWNfdCBsdV9ncF9yZWZfY250OwogCXNwaW5sb2NrX3QgbHVfZ3BfbG9jazsKIAlzdHJ1Y3QgY29uZmlnX2dyb3VwIGx1X2dwX2dyb3VwOwpAQCAtNDIyLDExICs0MjMsOSBAQAogCWludAkJCXNhbV90YXNrX2F0dHI7CiAJLyogVHJhbnNwb3J0IHByb3RvY29sIGRlcGVuZGVudCBzdGF0ZSwgc2VlIHRyYW5zcG9ydF9zdGF0ZV90YWJsZSAqLwogCWVudW0gdHJhbnNwb3J0X3N0YXRlX3RhYmxlIHRfc3RhdGU7Ci0JLyogVHJhbnNwb3J0IHNwZWNpZmljIGVycm9yIHN0YXR1cyAqLwotCWludAkJCXRyYW5zcG9ydF9lcnJvcl9zdGF0dXM7CiAJLyogVXNlZCB0byBzaWduYWwgY21kLT5zZV90Zm8tPmNoZWNrX3JlbGVhc2VfY21kKCkgdXNhZ2UgcGVyIGNtZCAqLwotCWludAkJCWNoZWNrX3JlbGVhc2U6MTsKLQlpbnQJCQljbWRfd2FpdF9zZXQ6MTsKKwl1bnNpZ25lZAkJY2hlY2tfcmVsZWFzZToxOworCXVuc2lnbmVkCQljbWRfd2FpdF9zZXQ6MTsKIAkvKiBTZWUgc2VfY21kX2ZsYWdzX3RhYmxlICovCiAJdTMyCQkJc2VfY21kX2ZsYWdzOwogCXUzMgkJCXNlX29yZGVyZWRfaWQ7CkBAIC00NDEsMTMgKzQ0MCwxMCBAQAogCS8qIFVzZWQgZm9yIHNlbnNlIGRhdGEgKi8KIAl2b2lkCQkJKnNlbnNlX2J1ZmZlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNlX2RlbGF5ZWRfbm9kZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkCXNlX29yZGVyZWRfbm9kZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNlX2x1bl9ub2RlOwogCXN0cnVjdCBsaXN0X2hlYWQJc2VfcWZfbm9kZTsKIAlzdHJ1Y3Qgc2VfZGV2aWNlICAgICAgKnNlX2RldjsKIAlzdHJ1Y3Qgc2VfZGV2X2VudHJ5ICAgKnNlX2RldmU7Ci0Jc3RydWN0IHNlX2RldmljZQkqc2Vfb2JqX3B0cjsKLQlzdHJ1Y3Qgc2VfZGV2aWNlCSpzZV9vcmlnX29ial9wdHI7CiAJc3RydWN0IHNlX2x1bgkJKnNlX2x1bjsKIAkvKiBPbmx5IHVzZWQgZm9yIGludGVybmFsIHBhc3N0aHJvdWdoIGFuZCBsZWdhY3kgVENNIGZhYnJpYyBtb2R1bGVzICovCiAJc3RydWN0IHNlX3Nlc3Npb24JKnNlX3Nlc3M7CkBAIC00NjMsOCArNDU5LDYgQEAKIAl1bnNpZ25lZCBjaGFyCQlfX3RfdGFza19jZGJbVENNX01BWF9DT01NQU5EX1NJWkVdOwogCXVuc2lnbmVkIGxvbmcgbG9uZwl0X3Rhc2tfbGJhOwogCWludAkJCXRfdGFza3NfZmFpbGVkOwotCWludAkJCXRfdGFza3NfZnVhOwotCWJvb2wJCQl0X3Rhc2tzX2JpZGk7CiAJdTMyCQkJdF90YXNrc19zZ19jaGFpbmVkX25vOwogCWF0b21pY190CQl0X2ZlX2NvdW50OwogCWF0b21pY190CQl0X3NlX2NvdW50OwpAQCAtNDg5LDE0ICs0ODMsNiBAQAogCiAJc3RydWN0IHdvcmtfc3RydWN0CXdvcms7CiAKLQkvKgotCSAqIFVzZWQgZm9yIHByZS1yZWdpc3RlcmVkIGZhYnJpYyBTR0wgcGFzc3Rocm91Z2ggV1JJVEUgYW5kIFJFQUQKLQkgKiB3aXRoIHRoZSBzcGVjaWFsIFNDRl9QQVNTVEhST1VHSF9DT05USUdfVE9fU0cgY2FzZSBmb3IgVENNX0xvb3AKLQkgKiBhbmQgb3RoZXIgSFcgdGFyZ2V0IG1vZGUgZmFicmljIG1vZHVsZXMuCi0JICovCi0Jc3RydWN0IHNjYXR0ZXJsaXN0CSp0X3Rhc2tfcHRfc2dsOwotCXUzMgkJCXRfdGFza19wdF9zZ2xfbnVtOwotCiAJc3RydWN0IHNjYXR0ZXJsaXN0CSp0X2RhdGFfc2c7CiAJdW5zaWduZWQgaW50CQl0X2RhdGFfbmVudHM7CiAJc3RydWN0IHNjYXR0ZXJsaXN0CSp0X2JpZGlfZGF0YV9zZzsKQEAgLTU2Miw3ICs1NDgsNyBAQAogfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKIHN0cnVjdCBzZV9zZXNzaW9uIHsKLQlpbnQJCQlzZXNzX3RlYXJpbmdfZG93bjoxOworCXVuc2lnbmVkCQlzZXNzX3RlYXJpbmdfZG93bjoxOwogCXU2NAkJCXNlc3NfYmluX2lzaWQ7CiAJc3RydWN0IHNlX25vZGVfYWNsCSpzZV9ub2RlX2FjbDsKIAlzdHJ1Y3Qgc2VfcG9ydGFsX2dyb3VwICpzZV90cGc7CkBAIC02ODMsNyArNjY5LDYgQEAKIAlzdHJ1Y3QgdDEwX3Jlc2VydmF0aW9uIHQxMF9wcjsKIAlzcGlubG9ja190ICAgICAgc2VfZGV2X2xvY2s7CiAJdm9pZCAgICAgICAgICAgICpzZV9kZXZfc3VfcHRyOwotCXN0cnVjdCBsaXN0X2hlYWQgc2VfZGV2X25vZGU7CiAJc3RydWN0IGNvbmZpZ19ncm91cCBzZV9kZXZfZ3JvdXA7CiAJLyogRm9yIFQxMCBSZXNlcnZhdGlvbnMgKi8KIAlzdHJ1Y3QgY29uZmlnX2dyb3VwIHNlX2Rldl9wcl9ncm91cDsKQEAgLTY5Miw5ICs2NzcsNiBAQAogfSBfX19fY2FjaGVsaW5lX2FsaWduZWQ7CiAKIHN0cnVjdCBzZV9kZXZpY2UgewotCS8qIFNldCB0byAxIGlmIHRocmVhZCBpcyBOT1Qgc2xlZXBpbmcgb24gdGhyZWFkX3NlbSAqLwotCXU4CQkJdGhyZWFkX2FjdGl2ZTsKLQl1OAkJCWRldl9zdGF0dXNfdGltZXJfZmxhZ3M7CiAJLyogUkVMQVRJVkUgVEFSR0VUIFBPUlQgSURFTlRJRkVSIENvdW50ZXIgKi8KIAl1MTYJCQlkZXZfcnB0aV9jb3VudGVyOwogCS8qIFVzZWQgZm9yIFNBTSBUYXNrIEF0dHJpYnV0ZSBvcmRlcmluZyAqLwpAQCAtNzE5LDE0ICs3MDEsMTAgQEAKIAl1NjQJCQl3cml0ZV9ieXRlczsKIAlzcGlubG9ja190CQlzdGF0c19sb2NrOwogCS8qIEFjdGl2ZSBjb21tYW5kcyBvbiB0aGlzIHZpcnR1YWwgU0UgZGV2aWNlICovCi0JYXRvbWljX3QJCWFjdGl2ZV9jbWRzOwogCWF0b21pY190CQlzaW1wbGVfY21kczsKIAlhdG9taWNfdAkJZGVwdGhfbGVmdDsKIAlhdG9taWNfdAkJZGV2X29yZGVyZWRfaWQ7Ci0JYXRvbWljX3QJCWRldl90dXJfYWN0aXZlOwogCWF0b21pY190CQlleGVjdXRlX3Rhc2tzOwotCWF0b21pY190CQlkZXZfc3RhdHVzX3Rocl9jb3VudDsKLQlhdG9taWNfdAkJZGV2X2hvcV9jb3VudDsKIAlhdG9taWNfdAkJZGV2X29yZGVyZWRfc3luYzsKIAlhdG9taWNfdAkJZGV2X3FmX2NvdW50OwogCXN0cnVjdCBzZV9vYmoJCWRldl9vYmo7CkBAIC03MzQsMTQgKzcxMiw5IEBACiAJc3RydWN0IHNlX29iagkJZGV2X2V4cG9ydF9vYmo7CiAJc3RydWN0IHNlX3F1ZXVlX29iaglkZXZfcXVldWVfb2JqOwogCXNwaW5sb2NrX3QJCWRlbGF5ZWRfY21kX2xvY2s7Ci0Jc3BpbmxvY2tfdAkJb3JkZXJlZF9jbWRfbG9jazsKIAlzcGlubG9ja190CQlleGVjdXRlX3Rhc2tfbG9jazsKLQlzcGlubG9ja190CQlzdGF0ZV90YXNrX2xvY2s7Ci0Jc3BpbmxvY2tfdAkJZGV2X2FsdWFfbG9jazsKIAlzcGlubG9ja190CQlkZXZfcmVzZXJ2YXRpb25fbG9jazsKLQlzcGlubG9ja190CQlkZXZfc3RhdGVfbG9jazsKIAlzcGlubG9ja190CQlkZXZfc3RhdHVzX2xvY2s7Ci0Jc3BpbmxvY2tfdAkJZGV2X3N0YXR1c190aHJfbG9jazsKIAlzcGlubG9ja190CQlzZV9wb3J0X2xvY2s7CiAJc3BpbmxvY2tfdAkJc2VfdG1yX2xvY2s7CiAJc3BpbmxvY2tfdAkJcWZfY21kX2xvY2s7CkBAIC03NTMsMTQgKzcyNiwxMCBAQAogCXN0cnVjdCB0MTBfcHJfcmVnaXN0cmF0aW9uICpkZXZfcHJfcmVzX2hvbGRlcjsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRldl9zZXBfbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRldl90bXJfbGlzdDsKLQlzdHJ1Y3QgdGltZXJfbGlzdAlkZXZfc3RhdHVzX3RpbWVyOwogCS8qIFBvaW50ZXIgdG8gZGVzY3JpcHRvciBmb3IgcHJvY2Vzc2luZyB0aHJlYWQgKi8KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnByb2Nlc3NfdGhyZWFkOwotCXBpZF90CQkJcHJvY2Vzc190aHJlYWRfcGlkOwotCXN0cnVjdCB0YXNrX3N0cnVjdAkJKmRldl9tZ210X3RocmVhZDsKIAlzdHJ1Y3Qgd29ya19zdHJ1Y3QJcWZfd29ya19xdWV1ZTsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWRlbGF5ZWRfY21kX2xpc3Q7Ci0Jc3RydWN0IGxpc3RfaGVhZAlvcmRlcmVkX2NtZF9saXN0OwogCXN0cnVjdCBsaXN0X2hlYWQJZXhlY3V0ZV90YXNrX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAlzdGF0ZV90YXNrX2xpc3Q7CiAJc3RydWN0IGxpc3RfaGVhZAlxZl9jbWRfbGlzdDsKQEAgLTc3MSw4ICs3NDAsNiBAQAogCXN0cnVjdCBzZV9zdWJzeXN0ZW1fYXBpICp0cmFuc3BvcnQ7CiAJLyogTGlua2VkIGxpc3QgZm9yIHN0cnVjdCBzZV9oYmEgc3RydWN0IHNlX2RldmljZSBsaXN0ICovCiAJc3RydWN0IGxpc3RfaGVhZAlkZXZfbGlzdDsKLQkvKiBMaW5rZWQgbGlzdCBmb3Igc3RydWN0IHNlX2dsb2JhbC0+Z19zZV9kZXZfbGlzdCAqLwotCXN0cnVjdCBsaXN0X2hlYWQJZ19zZV9kZXZfbGlzdDsKIH0gIF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAogc3RydWN0IHNlX2hiYSB7CkBAIC04MzQsNyArODAxLDYgQEAKIAl1MzIJCXNlcF9pbmRleDsKIAlzdHJ1Y3Qgc2NzaV9wb3J0X3N0YXRzIHNlcF9zdGF0czsKIAkvKiBVc2VkIGZvciBBTFVBIFRhcmdldCBQb3J0IEdyb3VwcyBtZW1iZXJzaGlwICovCi0JYXRvbWljX3QJc2VwX3RnX3B0X2dwX2FjdGl2ZTsKIAlhdG9taWNfdAlzZXBfdGdfcHRfc2Vjb25kYXJ5X29mZmxpbmU7CiAJLyogVXNlZCBmb3IgUFIgQUxMX1RHX1BUPTEgKi8KIAlhdG9taWNfdAlzZXBfdGdfcHRfcmVmX2NudDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFyZ2V0L3RhcmdldF9jb3JlX3RyYW5zcG9ydC5oIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKaW5kZXggYzE2ZTk0My4uZGFjNGYyZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKKysrIGIvaW5jbHVkZS90YXJnZXQvdGFyZ2V0X2NvcmVfdHJhbnNwb3J0LmgKQEAgLTEwLDI5ICsxMCw2IEBACiAKICNkZWZpbmUgUFlYX1RSQU5TUE9SVF9TVEFUVVNfSU5URVJWQUwJCTUgLyogSW4gc2Vjb25kcyAqLwogCi0jZGVmaW5lIFBZWF9UUkFOU1BPUlRfU0VOVF9UT19UUkFOU1BPUlQJCTAKLSNkZWZpbmUgUFlYX1RSQU5TUE9SVF9XUklURV9QRU5ESU5HCQkxCi0KLSNkZWZpbmUgUFlYX1RSQU5TUE9SVF9VTktOT1dOX1NBTV9PUENPREUJLTEKLSNkZWZpbmUgUFlYX1RSQU5TUE9SVF9IQkFfUVVFVUVfRlVMTAkJLTIKLSNkZWZpbmUgUFlYX1RSQU5TUE9SVF9SRVFfVE9PX01BTllfU0VDVE9SUwktMwotI2RlZmluZSBQWVhfVFJBTlNQT1JUX09VVF9PRl9NRU1PUllfUkVTT1VSQ0VTCS00Ci0jZGVmaW5lIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9DREJfRklFTEQJCS01Ci0jZGVmaW5lIFBZWF9UUkFOU1BPUlRfSU5WQUxJRF9QQVJBTUVURVJfTElTVAktNgotI2RlZmluZSBQWVhfVFJBTlNQT1JUX0xVX0NPTU1fRkFJTFVSRQkJLTcKLSNkZWZpbmUgUFlYX1RSQU5TUE9SVF9VTktOT1dOX01PREVfUEFHRQkJLTgKLSNkZWZpbmUgUFlYX1RSQU5TUE9SVF9XUklURV9QUk9URUNURUQJCS05Ci0jZGVmaW5lIFBZWF9UUkFOU1BPUlRfUkVTRVJWQVRJT05fQ09ORkxJQ1QJLTEwCi0jZGVmaW5lIFBZWF9UUkFOU1BPUlRfSUxMRUdBTF9SRVFVRVNUCQktMTEKLSNkZWZpbmUgUFlYX1RSQU5TUE9SVF9VU0VfU0VOU0VfUkVBU09OCQktMTIKLQotI2lmbmRlZiBTQU1fU1RBVF9SRVNFUlZBVElPTl9DT05GTElDVAotI2RlZmluZSBTQU1fU1RBVF9SRVNFUlZBVElPTl9DT05GTElDVAkJMHgxOAotI2VuZGlmCi0KLSNkZWZpbmUgVFJBTlNQT1JUX1BMVUdJTl9GUkVFCQkJMAotI2RlZmluZSBUUkFOU1BPUlRfUExVR0lOX1JFR0lTVEVSRUQJCTEKLQogI2RlZmluZSBUUkFOU1BPUlRfUExVR0lOX1BIQkFfUERFVgkJMQogI2RlZmluZSBUUkFOU1BPUlRfUExVR0lOX1ZIQkFfUERFVgkJMgogI2RlZmluZSBUUkFOU1BPUlRfUExVR0lOX1ZIQkFfVkRFVgkJMwpAQCAtMTU4LDcgKzEzNSw2IEBACiBleHRlcm4gaW50IHRyYW5zcG9ydF9oYW5kbGVfY2RiX2RpcmVjdChzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIGludCB0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfY2RiX21hcChzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIGludCB0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfZGF0YShzdHJ1Y3Qgc2VfY21kICopOwotZXh0ZXJuIHZvaWQgdHJhbnNwb3J0X25ld19jbWRfZmFpbHVyZShzdHJ1Y3Qgc2VfY21kICopOwogZXh0ZXJuIGludCB0cmFuc3BvcnRfZ2VuZXJpY19oYW5kbGVfdG1yKHN0cnVjdCBzZV9jbWQgKik7CiBleHRlcm4gYm9vbCB0YXJnZXRfc3RvcF90YXNrKHN0cnVjdCBzZV90YXNrICp0YXNrLCB1bnNpZ25lZCBsb25nICpmbGFncyk7CiBleHRlcm4gaW50IHRyYW5zcG9ydF9nZW5lcmljX21hcF9tZW1fdG9fY21kKHN0cnVjdCBzZV9jbWQgKmNtZCwgc3RydWN0IHNjYXR0ZXJsaXN0ICosIHUzMiwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3JjdS5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcmN1LmgKaW5kZXggNjY5ZmJkNi4uZDJkODhiZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS90cmFjZS9ldmVudHMvcmN1LmgKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvcmN1LmgKQEAgLTI0MSwyNCArMjQxLDczIEBACiAKIC8qCiAgKiBUcmFjZXBvaW50IGZvciBkeW50aWNrLWlkbGUgZW50cnkvZXhpdCBldmVudHMuICBUaGVzZSB0YWtlIGEgc3RyaW5nCi0gKiBhcyBhcmd1bWVudDogIlN0YXJ0IiBmb3IgZW50ZXJpbmcgZHludGljay1pZGxlIG1vZGUgYW5kICJFbmQiIGZvcgotICogbGVhdmluZyBpdC4KKyAqIGFzIGFyZ3VtZW50OiAiU3RhcnQiIGZvciBlbnRlcmluZyBkeW50aWNrLWlkbGUgbW9kZSwgIkVuZCIgZm9yCisgKiBsZWF2aW5nIGl0LCAiLS09IiBmb3IgZXZlbnRzIG1vdmluZyB0b3dhcmRzIGlkbGUsIGFuZCAiKys9IiBmb3IgZXZlbnRzCisgKiBtb3ZpbmcgYXdheSBmcm9tIGlkbGUuICAiRXJyb3Igb24gZW50cnk6IG5vdCBpZGxlIHRhc2siIGFuZCAiRXJyb3Igb24KKyAqIGV4aXQ6IG5vdCBpZGxlIHRhc2siIGluZGljYXRlIHRoYXQgYSBub24taWRsZSB0YXNrIGlzIGVycm9uZW91c2x5CisgKiB0b3lpbmcgd2l0aCB0aGUgaWRsZSBsb29wLgorICoKKyAqIFRoZXNlIGV2ZW50cyBhbHNvIHRha2UgYSBwYWlyIG9mIG51bWJlcnMsIHdoaWNoIGluZGljYXRlIHRoZSBuZXN0aW5nCisgKiBkZXB0aCBiZWZvcmUgYW5kIGFmdGVyIHRoZSBldmVudCBvZiBpbnRlcmVzdC4gIE5vdGUgdGhhdCB0YXNrLXJlbGF0ZWQKKyAqIGV2ZW50cyB1c2UgdGhlIHVwcGVyIGJpdHMgb2YgZWFjaCBudW1iZXIsIHdoaWxlIGludGVycnVwdC1yZWxhdGVkCisgKiBldmVudHMgdXNlIHRoZSBsb3dlciBiaXRzLgogICovCiBUUkFDRV9FVkVOVChyY3VfZHludGljaywKIAotCVRQX1BST1RPKGNoYXIgKnBvbGFyaXR5KSwKKwlUUF9QUk9UTyhjaGFyICpwb2xhcml0eSwgbG9uZyBsb25nIG9sZG5lc3RpbmcsIGxvbmcgbG9uZyBuZXduZXN0aW5nKSwKIAotCVRQX0FSR1MocG9sYXJpdHkpLAorCVRQX0FSR1MocG9sYXJpdHksIG9sZG5lc3RpbmcsIG5ld25lc3RpbmcpLAogCiAJVFBfU1RSVUNUX19lbnRyeSgKIAkJX19maWVsZChjaGFyICosIHBvbGFyaXR5KQorCQlfX2ZpZWxkKGxvbmcgbG9uZywgb2xkbmVzdGluZykKKwkJX19maWVsZChsb25nIGxvbmcsIG5ld25lc3RpbmcpCiAJKSwKIAogCVRQX2Zhc3RfYXNzaWduKAogCQlfX2VudHJ5LT5wb2xhcml0eSA9IHBvbGFyaXR5OworCQlfX2VudHJ5LT5vbGRuZXN0aW5nID0gb2xkbmVzdGluZzsKKwkJX19lbnRyeS0+bmV3bmVzdGluZyA9IG5ld25lc3Rpbmc7CiAJKSwKIAotCVRQX3ByaW50aygiJXMiLCBfX2VudHJ5LT5wb2xhcml0eSkKKwlUUF9wcmludGsoIiVzICVsbHggJWxseCIsIF9fZW50cnktPnBvbGFyaXR5LAorCQkgIF9fZW50cnktPm9sZG5lc3RpbmcsIF9fZW50cnktPm5ld25lc3RpbmcpCispOworCisvKgorICogVHJhY2Vwb2ludCBmb3IgUkNVIHByZXBhcmF0aW9uIGZvciBpZGxlLCB0aGUgZ29hbCBiZWluZyB0byBnZXQgUkNVCisgKiBwcm9jZXNzaW5nIGRvbmUgc28gdGhhdCB0aGUgY3VycmVudCBDUFUgY2FuIHNodXQgb2ZmIGl0cyBzY2hlZHVsaW5nCisgKiBjbG9jayBhbmQgZW50ZXIgZHludGljay1pZGxlIG1vZGUuICBPbmUgd2F5IHRvIGFjY29tcGxpc2ggdGhpcyBpcworICogdG8gZHJhaW4gYWxsIFJDVSBjYWxsYmFja3MgZnJvbSB0aGlzIENQVSwgYW5kIHRoZSBvdGhlciBpcyB0byBoYXZlCisgKiBkb25lIGV2ZXJ5dGhpbmcgUkNVIHJlcXVpcmVzIGZvciB0aGUgY3VycmVudCBncmFjZSBwZXJpb2QuICBJbiB0aGlzCisgKiBsYXR0ZXIgY2FzZSwgdGhlIENQVSB3aWxsIGJlIGF3YWtlbmVkIGF0IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZ3JhY2UKKyAqIHBlcmlvZCBpbiBvcmRlciB0byBwcm9jZXNzIHRoZSByZW1haW5kZXIgb2YgaXRzIGNhbGxiYWNrcy4KKyAqCisgKiBUaGVzZSB0cmFjZXBvaW50cyB0YWtlIGEgc3RyaW5nIGFzIGFyZ3VtZW50OgorICoKKyAqCSJObyBjYWxsYmFja3MiOiBOb3RoaW5nIHRvIGRvLCBubyBjYWxsYmFja3Mgb24gdGhpcyBDUFUuCisgKgkiSW4gaG9sZG9mZiI6IE5vdGhpbmcgdG8gZG8sIGhvbGRpbmcgb2ZmIGFmdGVyIHVuc3VjY2Vzc2Z1bCBhdHRlbXB0LgorICoJIkJlZ2luIGhvbGRvZmYiOiBBdHRlbXB0IGZhaWxlZCwgZG9uJ3QgcmV0cnkgdW50aWwgbmV4dCBqaWZmeS4KKyAqCSJEeW50aWNrIHdpdGggY2FsbGJhY2tzIjogRW50ZXJpbmcgZHludGljay1pZGxlIGRlc3BpdGUgY2FsbGJhY2tzLgorICoJIk1vcmUgY2FsbGJhY2tzIjogU3RpbGwgbW9yZSBjYWxsYmFja3MsIHRyeSBhZ2FpbiB0byBjbGVhciB0aGVtIG91dC4KKyAqCSJDYWxsYmFja3MgZHJhaW5lZCI6IEFsbCBjYWxsYmFja3MgcHJvY2Vzc2VkLCBvZmYgdG8gZHludGljayBpZGxlIQorICoJIlRpbWVyIjogVGltZXIgZmlyZWQgdG8gY2F1c2UgQ1BVIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcgY2FsbGJhY2tzLgorICovCitUUkFDRV9FVkVOVChyY3VfcHJlcF9pZGxlLAorCisJVFBfUFJPVE8oY2hhciAqcmVhc29uKSwKKworCVRQX0FSR1MocmVhc29uKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoY2hhciAqLCByZWFzb24pCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5yZWFzb24gPSByZWFzb247CisJKSwKKworCVRQX3ByaW50aygiJXMiLCBfX2VudHJ5LT5yZWFzb24pCiApOwogCiAvKgpAQCAtNDEyLDI3ICs0NjEsNzEgQEAKIAogLyoKICAqIFRyYWNlcG9pbnQgZm9yIGV4aXRpbmcgcmN1X2RvX2JhdGNoIGFmdGVyIFJDVSBjYWxsYmFja3MgaGF2ZSBiZWVuCi0gKiBpbnZva2VkLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBSQ1UgZmxhdm9yIGFuZAotICogdGhlIHNlY29uZCBhcmd1bWVudCBpcyBudW1iZXIgb2YgY2FsbGJhY2tzIGFjdHVhbGx5IGludm9rZWQuCisgKiBpbnZva2VkLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBSQ1UgZmxhdm9yLAorICogdGhlIHNlY29uZCBhcmd1bWVudCBpcyBudW1iZXIgb2YgY2FsbGJhY2tzIGFjdHVhbGx5IGludm9rZWQsCisgKiB0aGUgdGhpcmQgYXJndW1lbnQgKGNiKSBpcyB3aGV0aGVyIG9yIG5vdCBhbnkgb2YgdGhlIGNhbGxiYWNrcyB0aGF0CisgKiB3ZXJlIHJlYWR5IHRvIGludm9rZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoaXMgYmF0Y2ggYXJlIHN0aWxsCisgKiBxdWV1ZWQsIHRoZSBmb3VydGggYXJndW1lbnQgKG5yKSBpcyB0aGUgcmV0dXJuIHZhbHVlIG9mIG5lZWRfcmVzY2hlZCgpLAorICogdGhlIGZpZnRoIGFyZ3VtZW50IChpaXQpIGlzIDEgaWYgdGhlIGN1cnJlbnQgdGFzayBpcyB0aGUgaWRsZSB0YXNrLAorICogYW5kIHRoZSBzaXh0aCBhcmd1bWVudCAocmlzaykgaXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tCisgKiByY3VfaXNfY2FsbGJhY2tzX2t0aHJlYWQoKS4KICAqLwogVFJBQ0VfRVZFTlQocmN1X2JhdGNoX2VuZCwKIAotCVRQX1BST1RPKGNoYXIgKnJjdW5hbWUsIGludCBjYWxsYmFja3NfaW52b2tlZCksCisJVFBfUFJPVE8oY2hhciAqcmN1bmFtZSwgaW50IGNhbGxiYWNrc19pbnZva2VkLAorCQkgYm9vbCBjYiwgYm9vbCBuciwgYm9vbCBpaXQsIGJvb2wgcmlzayksCiAKLQlUUF9BUkdTKHJjdW5hbWUsIGNhbGxiYWNrc19pbnZva2VkKSwKKwlUUF9BUkdTKHJjdW5hbWUsIGNhbGxiYWNrc19pbnZva2VkLCBjYiwgbnIsIGlpdCwgcmlzayksCiAKIAlUUF9TVFJVQ1RfX2VudHJ5KAogCQlfX2ZpZWxkKGNoYXIgKiwgcmN1bmFtZSkKIAkJX19maWVsZChpbnQsIGNhbGxiYWNrc19pbnZva2VkKQorCQlfX2ZpZWxkKGJvb2wsIGNiKQorCQlfX2ZpZWxkKGJvb2wsIG5yKQorCQlfX2ZpZWxkKGJvb2wsIGlpdCkKKwkJX19maWVsZChib29sLCByaXNrKQogCSksCiAKIAlUUF9mYXN0X2Fzc2lnbigKIAkJX19lbnRyeS0+cmN1bmFtZSA9IHJjdW5hbWU7CiAJCV9fZW50cnktPmNhbGxiYWNrc19pbnZva2VkID0gY2FsbGJhY2tzX2ludm9rZWQ7CisJCV9fZW50cnktPmNiID0gY2I7CisJCV9fZW50cnktPm5yID0gbnI7CisJCV9fZW50cnktPmlpdCA9IGlpdDsKKwkJX19lbnRyeS0+cmlzayA9IHJpc2s7CiAJKSwKIAotCVRQX3ByaW50aygiJXMgQ0JzLWludm9rZWQ9JWQiLAotCQkgIF9fZW50cnktPnJjdW5hbWUsIF9fZW50cnktPmNhbGxiYWNrc19pbnZva2VkKQorCVRQX3ByaW50aygiJXMgQ0JzLWludm9rZWQ9JWQgaWRsZT0lYyVjJWMlYyIsCisJCSAgX19lbnRyeS0+cmN1bmFtZSwgX19lbnRyeS0+Y2FsbGJhY2tzX2ludm9rZWQsCisJCSAgX19lbnRyeS0+Y2IgPyAnQycgOiAnLicsCisJCSAgX19lbnRyeS0+bnIgPyAnUycgOiAnLicsCisJCSAgX19lbnRyeS0+aWl0ID8gJ0knIDogJy4nLAorCQkgIF9fZW50cnktPnJpc2sgPyAnUicgOiAnLicpCispOworCisvKgorICogVHJhY2Vwb2ludCBmb3IgcmN1dG9ydHVyZSByZWFkZXJzLiAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBuYW1lCisgKiBvZiB0aGUgUkNVIGZsYXZvciBmcm9tIHJjdXRvcnR1cmUncyB2aWV3cG9pbnQgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQKKyAqIGlzIHRoZSBjYWxsYmFjayBhZGRyZXNzLgorICovCitUUkFDRV9FVkVOVChyY3VfdG9ydHVyZV9yZWFkLAorCisJVFBfUFJPVE8oY2hhciAqcmN1dG9ydHVyZW5hbWUsIHN0cnVjdCByY3VfaGVhZCAqcmhwKSwKKworCVRQX0FSR1MocmN1dG9ydHVyZW5hbWUsIHJocCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKGNoYXIgKiwgcmN1dG9ydHVyZW5hbWUpCisJCV9fZmllbGQoc3RydWN0IHJjdV9oZWFkICosIHJocCkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPnJjdXRvcnR1cmVuYW1lID0gcmN1dG9ydHVyZW5hbWU7CisJCV9fZW50cnktPnJocCA9IHJocDsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyB0b3J0dXJlIHJlYWQgJXAiLAorCQkgIF9fZW50cnktPnJjdXRvcnR1cmVuYW1lLCBfX2VudHJ5LT5yaHApCiApOwogCiAjZWxzZSAvKiAjaWZkZWYgQ09ORklHX1JDVV9UUkFDRSAqLwpAQCAtNDQzLDEzICs1MzYsMTYgQEAKICNkZWZpbmUgdHJhY2VfcmN1X3VubG9ja19wcmVlbXB0ZWRfdGFzayhyY3VuYW1lLCBncG51bSwgcGlkKSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHRyYWNlX3JjdV9xdWllc2NlbnRfc3RhdGVfcmVwb3J0KHJjdW5hbWUsIGdwbnVtLCBtYXNrLCBxc21hc2ssIGxldmVsLCBncnBsbywgZ3JwaGksIGdwX3Rhc2tzKSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHRyYWNlX3JjdV9mcXMocmN1bmFtZSwgZ3BudW0sIGNwdSwgcXNldmVudCkgZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSB0cmFjZV9yY3VfZHludGljayhwb2xhcml0eSkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB0cmFjZV9yY3VfZHludGljayhwb2xhcml0eSwgb2xkbmVzdGluZywgbmV3bmVzdGluZykgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB0cmFjZV9yY3VfcHJlcF9pZGxlKHJlYXNvbikgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSB0cmFjZV9yY3VfY2FsbGJhY2socmN1bmFtZSwgcmhwLCBxbGVuKSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHRyYWNlX3JjdV9rZnJlZV9jYWxsYmFjayhyY3VuYW1lLCByaHAsIG9mZnNldCwgcWxlbikgZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSB0cmFjZV9yY3VfYmF0Y2hfc3RhcnQocmN1bmFtZSwgcWxlbiwgYmxpbWl0KSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHRyYWNlX3JjdV9pbnZva2VfY2FsbGJhY2socmN1bmFtZSwgcmhwKSBkbyB7IH0gd2hpbGUgKDApCiAjZGVmaW5lIHRyYWNlX3JjdV9pbnZva2Vfa2ZyZWVfY2FsbGJhY2socmN1bmFtZSwgcmhwLCBvZmZzZXQpIGRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgdHJhY2VfcmN1X2JhdGNoX2VuZChyY3VuYW1lLCBjYWxsYmFja3NfaW52b2tlZCkgZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB0cmFjZV9yY3VfYmF0Y2hfZW5kKHJjdW5hbWUsIGNhbGxiYWNrc19pbnZva2VkLCBjYiwgbnIsIGlpdCwgcmlzaykgXAorCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChyY3V0b3J0dXJlbmFtZSwgcmhwKSBkbyB7IH0gd2hpbGUgKDApCiAKICNlbmRpZiAvKiAjZWxzZSAjaWZkZWYgQ09ORklHX1JDVV9UUkFDRSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9zY2hlZC5oIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvc2NoZWQuaAppbmRleCA5NTlmZjE4Li42YmE1OTZiIDEwMDY0NAotLS0gYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9zY2hlZC5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3NjaGVkLmgKQEAgLTMzMSw2ICszMzEsMTMgQEAKIAkgICAgIFRQX0FSR1ModHNrLCBkZWxheSkpOwogCiAvKgorICogVHJhY2Vwb2ludCBmb3IgYWNjb3VudGluZyBibG9ja2VkIHRpbWUgKHRpbWUgdGhlIHRhc2sgaXMgaW4gdW5pbnRlcnJ1cHRpYmxlKS4KKyAqLworREVGSU5FX0VWRU5UKHNjaGVkX3N0YXRfdGVtcGxhdGUsIHNjaGVkX3N0YXRfYmxvY2tlZCwKKwkgICAgIFRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1NjQgZGVsYXkpLAorCSAgICAgVFBfQVJHUyh0c2ssIGRlbGF5KSk7CisKKy8qCiAgKiBUcmFjZXBvaW50IGZvciBhY2NvdW50aW5nIHJ1bnRpbWUgKHRpbWUgdGhlIHRhc2sgaXMgZXhlY3V0aW5nCiAgKiBvbiBhIENQVSkuCiAgKi8KQEAgLTM2Myw2ICszNzAsNTYgQEAKIAkJCSh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+dnJ1bnRpbWUpCiApOwogCisjaWZkZWYgQ1JFQVRFX1RSQUNFX1BPSU5UUworc3RhdGljIGlubGluZSB1NjQgdHJhY2VfZ2V0X3NsZWVwdGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKyNpZmRlZiBDT05GSUdfU0NIRURTVEFUUworCXU2NCBibG9jaywgc2xlZXA7CisKKwlibG9jayA9IHRzay0+c2Uuc3RhdGlzdGljcy5ibG9ja19zdGFydDsKKwlzbGVlcCA9IHRzay0+c2Uuc3RhdGlzdGljcy5zbGVlcF9zdGFydDsKKwl0c2stPnNlLnN0YXRpc3RpY3MuYmxvY2tfc3RhcnQgPSAwOworCXRzay0+c2Uuc3RhdGlzdGljcy5zbGVlcF9zdGFydCA9IDA7CisKKwlyZXR1cm4gYmxvY2sgPyBibG9jayA6IHNsZWVwID8gc2xlZXAgOiAwOworI2Vsc2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8qCisgKiBUcmFjZXBvaW50IGZvciBhY2NvdW50aW5nIHNsZWVwdGltZSAodGltZSB0aGUgdGFzayBpcyBzbGVlcGluZworICogb3Igd2FpdGluZyBmb3IgSS9PKS4KKyAqLworVFJBQ0VfRVZFTlQoc2NoZWRfc3RhdF9zbGVlcHRpbWUsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdTY0IG5vdyksCisKKwlUUF9BUkdTKHRzaywgbm93KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fYXJyYXkoIGNoYXIsCWNvbW0sCVRBU0tfQ09NTV9MRU4JKQorCQlfX2ZpZWxkKCBwaWRfdCwJcGlkCQkJKQorCQlfX2ZpZWxkKCB1NjQsCXNsZWVwdGltZQkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIHRzay0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJCV9fZW50cnktPnBpZAkJPSB0c2stPnBpZDsKKwkJX19lbnRyeS0+c2xlZXB0aW1lID0gdHJhY2VfZ2V0X3NsZWVwdGltZSh0c2spOworCQlfX2VudHJ5LT5zbGVlcHRpbWUgPSBfX2VudHJ5LT5zbGVlcHRpbWUgPworCQkJCW5vdyAtIF9fZW50cnktPnNsZWVwdGltZSA6IDA7CisJKQorCVRQX3BlcmZfYXNzaWduKAorCQlfX3BlcmZfY291bnQoX19lbnRyeS0+c2xlZXB0aW1lKTsKKwkpLAorCisJVFBfcHJpbnRrKCJjb21tPSVzIHBpZD0lZCBzbGVlcHRpbWU9JUx1IFtuc10iLAorCQkJX19lbnRyeS0+Y29tbSwgX19lbnRyeS0+cGlkLAorCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zbGVlcHRpbWUpCispOworCiAvKgogICogVHJhY2Vwb2ludCBmb3Igc2hvd2luZyBwcmlvcml0eSBpbmhlcml0YW5jZSBtb2RpZnlpbmcgYSB0YXNrcwogICogcHJpb3JpdHkuCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy93cml0ZWJhY2suaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dyaXRlYmFjay5oCmluZGV4IGI5OWNhYTguLjk5ZDFkMGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dyaXRlYmFjay5oCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dyaXRlYmFjay5oCkBAIC0yMSw2ICsyMSwxNiBAQAogCQl7SV9SRUZFUkVOQ0VELAkJIklfUkVGRVJFTkNFRCJ9CQlcCiAJKQogCisjZGVmaW5lIFdCX1dPUktfUkVBU09OCQkJCQkJCVwKKwkJe1dCX1JFQVNPTl9CQUNLR1JPVU5ELAkJImJhY2tncm91bmQifSwJCVwKKwkJe1dCX1JFQVNPTl9UUllfVE9fRlJFRV9QQUdFUywJInRyeV90b19mcmVlX3BhZ2VzIn0sCVwKKwkJe1dCX1JFQVNPTl9TWU5DLAkJInN5bmMifSwJCVwKKwkJe1dCX1JFQVNPTl9QRVJJT0RJQywJCSJwZXJpb2RpYyJ9LAkJXAorCQl7V0JfUkVBU09OX0xBUFRPUF9USU1FUiwJImxhcHRvcF90aW1lciJ9LAlcCisJCXtXQl9SRUFTT05fRlJFRV9NT1JFX01FTSwJImZyZWVfbW9yZV9tZW1vcnkifSwJXAorCQl7V0JfUkVBU09OX0ZTX0ZSRUVfU1BBQ0UsCSJmc19mcmVlX3NwYWNlIn0sCVwKKwkJe1dCX1JFQVNPTl9GT1JLRVJfVEhSRUFELAkiZm9ya2VyX3RocmVhZCJ9CisKIHN0cnVjdCB3Yl93cml0ZWJhY2tfd29yazsKIAogREVDTEFSRV9FVkVOVF9DTEFTUyh3cml0ZWJhY2tfd29ya19jbGFzcywKQEAgLTU1LDcgKzY1LDcgQEAKIAkJICBfX2VudHJ5LT5mb3Jfa3VwZGF0ZSwKIAkJICBfX2VudHJ5LT5yYW5nZV9jeWNsaWMsCiAJCSAgX19lbnRyeS0+Zm9yX2JhY2tncm91bmQsCi0JCSAgd2JfcmVhc29uX25hbWVbX19lbnRyeS0+cmVhc29uXQorCQkgIF9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+cmVhc29uLCBXQl9XT1JLX1JFQVNPTikKIAkpCiApOwogI2RlZmluZSBERUZJTkVfV1JJVEVCQUNLX1dPUktfRVZFTlQobmFtZSkgXApAQCAtMTg0LDcgKzE5NCw4IEBACiAJCV9fZW50cnktPm9sZGVyLAkvKiBvbGRlcl90aGFuX3RoaXMgaW4gamlmZmllcyAqLwogCQlfX2VudHJ5LT5hZ2UsCS8qIG9sZGVyX3RoYW5fdGhpcyBpbiByZWxhdGl2ZSBtaWxsaXNlY29uZHMgKi8KIAkJX19lbnRyeS0+bW92ZWQsCi0JCXdiX3JlYXNvbl9uYW1lW19fZW50cnktPnJlYXNvbl0pCisJCV9fcHJpbnRfc3ltYm9saWMoX19lbnRyeS0+cmVhc29uLCBXQl9XT1JLX1JFQVNPTikKKwkpCiApOwogCiBUUkFDRV9FVkVOVChnbG9iYWxfZGlydHlfc3RhdGUsCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvaW8veHNfd2lyZS5oIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL2lvL3hzX3dpcmUuaAppbmRleCBmMGI2ODkwLi5mNmYwN2FhIDEwMDY0NAotLS0gYS9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvaW8veHNfd2lyZS5oCisrKyBiL2luY2x1ZGUveGVuL2ludGVyZmFjZS9pby94c193aXJlLmgKQEAgLTI5LDggKzI5LDcgQEAKICAgICBYU19JU19ET01BSU5fSU5UUk9EVUNFRCwKICAgICBYU19SRVNVTUUsCiAgICAgWFNfU0VUX1RBUkdFVCwKLSAgICBYU19SRVNUUklDVCwKLSAgICBYU19SRVNFVF9XQVRDSEVTCisgICAgWFNfUkVTVFJJQ1QKIH07CiAKICNkZWZpbmUgWFNfV1JJVEVfTk9ORSAiTk9ORSIKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCA0MzI5OGY5Li5hMDc1NzY1IDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC00NjksMTQgKzQ2OSwxNCBAQAogCiBjb25maWcgUkNVX0ZBU1RfTk9fSFoKIAlib29sICJBY2NlbGVyYXRlIGxhc3Qgbm9uLWR5bnRpY2staWRsZSBDUFUncyBncmFjZSBwZXJpb2RzIgotCWRlcGVuZHMgb24gVFJFRV9SQ1UgJiYgTk9fSFogJiYgU01QCisJZGVwZW5kcyBvbiBOT19IWiAmJiBTTVAKIAlkZWZhdWx0IG4KIAloZWxwCiAJICBUaGlzIG9wdGlvbiBjYXVzZXMgUkNVIHRvIGF0dGVtcHQgdG8gYWNjZWxlcmF0ZSBncmFjZSBwZXJpb2RzCi0JICBpbiBvcmRlciB0byBhbGxvdyB0aGUgZmluYWwgQ1BVIHRvIGVudGVyIGR5bnRpY2tzLWlkbGUgc3RhdGUKLQkgIG1vcmUgcXVpY2tseS4gIE9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIG9wdGlvbiBpbmNyZWFzZXMgdGhlCi0JICBvdmVyaGVhZCBvZiB0aGUgZHludGlja3MtaWRsZSBjaGVja2luZywgcGFydGljdWxhcmx5IG9uIHN5c3RlbXMKLQkgIHdpdGggbGFyZ2UgbnVtYmVycyBvZiBDUFVzLgorCSAgaW4gb3JkZXIgdG8gYWxsb3cgQ1BVcyB0byBlbnRlciBkeW50aWNrcy1pZGxlIHN0YXRlIG1vcmUKKwkgIHF1aWNrbHkuICBPbiB0aGUgb3RoZXIgaGFuZCwgdGhpcyBvcHRpb24gaW5jcmVhc2VzIHRoZSBvdmVyaGVhZAorCSAgb2YgdGhlIGR5bnRpY2tzLWlkbGUgY2hlY2tpbmcsIHBhcnRpY3VsYXJseSBvbiBzeXN0ZW1zIHdpdGgKKwkgIGxhcmdlIG51bWJlcnMgb2YgQ1BVcy4KIAogCSAgU2F5IFkgaWYgZW5lcmd5IGVmZmljaWVuY3kgaXMgY3JpdGljYWxseSBpbXBvcnRhbnQsIHBhcnRpY3VsYXJseQogCSAgCWlmIHlvdSBoYXZlIHJlbGF0aXZlbHkgZmV3IENQVXMuCkBAIC02ODksNiArNjg5LDE3IEBACiAJICBGb3IgdGhvc2Ugd2hvIHdhbnQgdG8gaGF2ZSB0aGUgZmVhdHVyZSBlbmFibGVkIGJ5IGRlZmF1bHQgc2hvdWxkCiAJICBzZWxlY3QgdGhpcyBvcHRpb24gKGlmLCBmb3Igc29tZSByZWFzb24sIHRoZXkgbmVlZCB0byBkaXNhYmxlIGl0CiAJICB0aGVuIHN3YXBhY2NvdW50PTAgZG9lcyB0aGUgdHJpY2spLgorY29uZmlnIENHUk9VUF9NRU1fUkVTX0NUTFJfS01FTQorCWJvb2wgIk1lbW9yeSBSZXNvdXJjZSBDb250cm9sbGVyIEtlcm5lbCBNZW1vcnkgYWNjb3VudGluZyAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIENHUk9VUF9NRU1fUkVTX0NUTFIgJiYgRVhQRVJJTUVOVEFMCisJZGVmYXVsdCBuCisJaGVscAorCSAgVGhlIEtlcm5lbCBNZW1vcnkgZXh0ZW5zaW9uIGZvciBNZW1vcnkgUmVzb3VyY2UgQ29udHJvbGxlciBjYW4gbGltaXQKKwkgIHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkga2VybmVsIG9iamVjdHMgaW4gdGhlIHN5c3RlbS4gVGhvc2UgYXJlCisJICBmdW5kYW1lbnRhbGx5IGRpZmZlcmVudCBmcm9tIHRoZSBlbnRpdGllcyBoYW5kbGVkIGJ5IHRoZSBzdGFuZGFyZAorCSAgTWVtb3J5IENvbnRyb2xsZXIsIHdoaWNoIGFyZSBwYWdlLWJhc2VkLCBhbmQgY2FuIGJlIHN3YXBwZWQuIFVzZXJzIG9mCisJICB0aGUga21lbSBleHRlbnNpb24gY2FuIHVzZSBpdCB0byBndWFyYW50ZWUgdGhhdCBubyBncm91cCBvZiBwcm9jZXNzZXMKKwkgIHdpbGwgZXZlciBleGhhdXN0IGtlcm5lbCByZXNvdXJjZXMgYWxvbmUuCiAKIGNvbmZpZyBDR1JPVVBfUEVSRgogCWJvb2wgIkVuYWJsZSBwZXJmX2V2ZW50IHBlci1jcHUgcGVyLWNvbnRhaW5lciBncm91cCAoY2dyb3VwKSBtb25pdG9yaW5nIgpkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCAyMTdlZDIzLi4yYzc2ZWZiIDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtNDY5LDEzICs0NjksMTIgQEAKIAljaGFyICogY29tbWFuZF9saW5lOwogCWV4dGVybiBjb25zdCBzdHJ1Y3Qga2VybmVsX3BhcmFtIF9fc3RhcnRfX19wYXJhbVtdLCBfX3N0b3BfX19wYXJhbVtdOwogCi0Jc21wX3NldHVwX3Byb2Nlc3Nvcl9pZCgpOwotCiAJLyoKIAkgKiBOZWVkIHRvIHJ1biBhcyBlYXJseSBhcyBwb3NzaWJsZSwgdG8gaW5pdGlhbGl6ZSB0aGUKIAkgKiBsb2NrZGVwIGhhc2g6CiAJICovCiAJbG9ja2RlcF9pbml0KCk7CisJc21wX3NldHVwX3Byb2Nlc3Nvcl9pZCgpOwogCWRlYnVnX29iamVjdHNfZWFybHlfaW5pdCgpOwogCiAJLyoKZGlmZiAtLWdpdCBhL2lwYy9tcXVldWUuYyBiL2lwYy9tcXVldWUuYwppbmRleCAyZTBlY2ZjLi41YjQyOTNkIDEwMDY0NAotLS0gYS9pcGMvbXF1ZXVlLmMKKysrIGIvaXBjL21xdWV1ZS5jCkBAIC0xMjY5LDcgKzEyNjksNyBAQAogCiB2b2lkIG1xX3B1dF9tbnQoc3RydWN0IGlwY19uYW1lc3BhY2UgKm5zKQogewotCW1udHB1dChucy0+bXFfbW50KTsKKwlrZXJuX3VubW91bnQobnMtPm1xX21udCk7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfbXF1ZXVlX2ZzKHZvaWQpCkBAIC0xMjkxLDExICsxMjkxLDkgQEAKIAogCXNwaW5fbG9ja19pbml0KCZtcV9sb2NrKTsKIAotCWluaXRfaXBjX25zLm1xX21udCA9IGtlcm5fbW91bnRfZGF0YSgmbXF1ZXVlX2ZzX3R5cGUsICZpbml0X2lwY19ucyk7Ci0JaWYgKElTX0VSUihpbml0X2lwY19ucy5tcV9tbnQpKSB7Ci0JCWVycm9yID0gUFRSX0VSUihpbml0X2lwY19ucy5tcV9tbnQpOworCWVycm9yID0gbXFfaW5pdF9ucygmaW5pdF9pcGNfbnMpOworCWlmIChlcnJvcikKIAkJZ290byBvdXRfZmlsZXN5c3RlbTsKLQl9CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvaXBjL21zZ3V0aWwuYyBiL2lwYy9tc2d1dGlsLmMKaW5kZXggOGI1Y2U1ZDMuLjU2NTIxMDEgMTAwNjQ0Ci0tLSBhL2lwYy9tc2d1dGlsLmMKKysrIGIvaXBjL21zZ3V0aWwuYwpAQCAtMjcsMTEgKzI3LDYgQEAKICAqLwogc3RydWN0IGlwY19uYW1lc3BhY2UgaW5pdF9pcGNfbnMgPSB7CiAJLmNvdW50CQk9IEFUT01JQ19JTklUKDEpLAotI2lmZGVmIENPTkZJR19QT1NJWF9NUVVFVUUKLQkubXFfcXVldWVzX21heCAgID0gREZMVF9RVUVVRVNNQVgsCi0JLm1xX21zZ19tYXggICAgICA9IERGTFRfTVNHTUFYLAotCS5tcV9tc2dzaXplX21heCAgPSBERkxUX01TR1NJWkVNQVgsCi0jZW5kaWYKIAkudXNlcl9ucyA9ICZpbml0X3VzZXJfbnMsCiB9OwogCmRpZmYgLS1naXQgYS9rZXJuZWwvTWFrZWZpbGUgYi9rZXJuZWwvTWFrZWZpbGUKaW5kZXggZTg5OGM1Yi4uZjcwMzk2ZSAxMDA2NDQKLS0tIGEva2VybmVsL01ha2VmaWxlCisrKyBiL2tlcm5lbC9NYWtlZmlsZQpAQCAtMiwxNiArMiwxNSBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIGxpbnV4IGtlcm5lbC4KICMKIAotb2JqLXkgICAgID0gc2NoZWQubyBmb3JrLm8gZXhlY19kb21haW4ubyBwYW5pYy5vIHByaW50ay5vIFwKK29iai15ICAgICA9IGZvcmsubyBleGVjX2RvbWFpbi5vIHBhbmljLm8gcHJpbnRrLm8gXAogCSAgICBjcHUubyBleGl0Lm8gaXRpbWVyLm8gdGltZS5vIHNvZnRpcnEubyByZXNvdXJjZS5vIFwKIAkgICAgc3lzY3RsLm8gc3lzY3RsX2JpbmFyeS5vIGNhcGFiaWxpdHkubyBwdHJhY2UubyB0aW1lci5vIHVzZXIubyBcCiAJICAgIHNpZ25hbC5vIHN5cy5vIGttb2QubyB3b3JrcXVldWUubyBwaWQubyBcCiAJICAgIHJjdXBkYXRlLm8gZXh0YWJsZS5vIHBhcmFtcy5vIHBvc2l4LXRpbWVycy5vIFwKIAkgICAga3RocmVhZC5vIHdhaXQubyBrZmlmby5vIHN5c19uaS5vIHBvc2l4LWNwdS10aW1lcnMubyBtdXRleC5vIFwKIAkgICAgaHJ0aW1lci5vIHJ3c2VtLm8gbnNwcm94eS5vIHNyY3UubyBzZW1hcGhvcmUubyBcCi0JICAgIG5vdGlmaWVyLm8ga3N5c2ZzLm8gc2NoZWRfY2xvY2subyBjcmVkLm8gXAotCSAgICBhc3luYy5vIHJhbmdlLm8KLW9iai15ICs9IGdyb3Vwcy5vCisJICAgIG5vdGlmaWVyLm8ga3N5c2ZzLm8gY3JlZC5vIFwKKwkgICAgYXN5bmMubyByYW5nZS5vIGdyb3Vwcy5vCiAKIGlmZGVmIENPTkZJR19GVU5DVElPTl9UUkFDRVIKICMgRG8gbm90IHRyYWNlIGRlYnVnIGZpbGVzIGFuZCBpbnRlcm5hbCBmdHJhY2UgZmlsZXMKQEAgLTIwLDEwICsxOSwxMSBAQAogQ0ZMQUdTX1JFTU9WRV9tdXRleC1kZWJ1Zy5vID0gLXBnCiBDRkxBR1NfUkVNT1ZFX3J0bXV0ZXgtZGVidWcubyA9IC1wZwogQ0ZMQUdTX1JFTU9WRV9jZ3JvdXAtZGVidWcubyA9IC1wZwotQ0ZMQUdTX1JFTU9WRV9zY2hlZF9jbG9jay5vID0gLXBnCiBDRkxBR1NfUkVNT1ZFX2lycV93b3JrLm8gPSAtcGcKIGVuZGlmCiAKK29iai15ICs9IHNjaGVkLworCiBvYmotJChDT05GSUdfRlJFRVpFUikgKz0gZnJlZXplci5vCiBvYmotJChDT05GSUdfUFJPRklMSU5HKSArPSBwcm9maWxlLm8KIG9iai0kKENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSykgKz0gc3lzY3RsX2NoZWNrLm8KQEAgLTk5LDcgKzk5LDYgQEAKIG9iai0kKENPTkZJR19YODZfRFMpICs9IHRyYWNlLwogb2JqLSQoQ09ORklHX1JJTkdfQlVGRkVSKSArPSB0cmFjZS8KIG9iai0kKENPTkZJR19UUkFDRVBPSU5UUykgKz0gdHJhY2UvCi1vYmotJChDT05GSUdfU01QKSArPSBzY2hlZF9jcHVwcmkubwogb2JqLSQoQ09ORklHX0lSUV9XT1JLKSArPSBpcnFfd29yay5vCiBvYmotJChDT05GSUdfQ1BVX1BNKSArPSBjcHVfcG0ubwogCkBAIC0xMTAsMTUgKzEwOSw2IEBACiBvYmotJChDT05GSUdfQ1JBU0hfRFVNUCkgKz0gY3Jhc2hfZHVtcC5vCiBvYmotJChDT05GSUdfSlVNUF9MQUJFTCkgKz0ganVtcF9sYWJlbC5vCiAKLWlmbmVxICgkKENPTkZJR19TQ0hFRF9PTUlUX0ZSQU1FX1BPSU5URVIpLHkpCi0jIEFjY29yZGluZyB0byBBbGFuIE1vZHJhIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+LCB0aGUgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgaXMKLSMgbmVlZGVkIGZvciB4ODYgb25seS4gIFdoeSB0aGlzIHVzZWQgdG8gYmUgZW5hYmxlZCBmb3IgYWxsIGFyY2hpdGVjdHVyZXMgaXMgYmV5b25kCi0jIG1lLiAgSSBzdXNwZWN0IG1vc3QgcGxhdGZvcm1zIGRvbid0IG5lZWQgdGhpcywgYnV0IHVudGlsIHdlIGtub3cgdGhhdCBmb3Igc3VyZQotIyBJIHR1cm4gdGhpcyBvZmYgZm9yIElBLTY0IG9ubHkuICBBbmRyZWFzIFNjaHdhYiBzYXlzIGl0J3MgYWxzbyBuZWVkZWQgb24gbTY4awotIyB0byBnZXQgYSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgd2FpdC1jaGFubmVsIChXQ0hBTiBpbiBwcykuIC0tZGF2aWRtCi1DRkxBR1Nfc2NoZWQubyA6PSAkKFBST0ZJTElORykgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIKLWVuZGlmCi0KICQob2JqKS9jb25maWdzLm86ICQob2JqKS9jb25maWdfZGF0YS5oCiAKICMgY29uZmlnX2RhdGEuaCBjb250YWlucyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyBpa2NvbmZpZy5oIGJ1dCBnemlwcGVkLgpkaWZmIC0tZ2l0IGEva2VybmVsL2FjY3QuYyBiL2tlcm5lbC9hY2N0LmMKaW5kZXggZmE3ZWIzZC4uMjAzZGZlYSAxMDA2NDQKLS0tIGEva2VybmVsL2FjY3QuYworKysgYi9rZXJuZWwvYWNjdC5jCkBAIC02MTMsOCArNjEzLDggQEAKIAkJcGFjY3QtPmFjX2ZsYWcgfD0gQUNPUkU7CiAJaWYgKGN1cnJlbnQtPmZsYWdzICYgUEZfU0lHTkFMRUQpCiAJCXBhY2N0LT5hY19mbGFnIHw9IEFYU0lHOwotCXBhY2N0LT5hY191dGltZSA9IGNwdXRpbWVfYWRkKHBhY2N0LT5hY191dGltZSwgY3VycmVudC0+dXRpbWUpOwotCXBhY2N0LT5hY19zdGltZSA9IGNwdXRpbWVfYWRkKHBhY2N0LT5hY19zdGltZSwgY3VycmVudC0+c3RpbWUpOworCXBhY2N0LT5hY191dGltZSArPSBjdXJyZW50LT51dGltZTsKKwlwYWNjdC0+YWNfc3RpbWUgKz0gY3VycmVudC0+c3RpbWU7CiAJcGFjY3QtPmFjX21pbmZsdCArPSBjdXJyZW50LT5taW5fZmx0OwogCXBhY2N0LT5hY19tYWpmbHQgKz0gY3VycmVudC0+bWFqX2ZsdDsKIAlzcGluX3VubG9ja19pcnEoJmN1cnJlbnQtPnNpZ2hhbmQtPnNpZ2xvY2spOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Nncm91cC5jIGIva2VybmVsL2Nncm91cC5jCmluZGV4IGQ5ZDU2NDguLmExODQ0NzAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jZ3JvdXAuYworKysgYi9rZXJuZWwvY2dyb3VwLmMKQEAgLTIwOTgsMTEgKzIwOTgsNiBAQAogCQkJY29udGludWU7CiAJCS8qIGdldCBvbGQgY3NzX3NldCBwb2ludGVyICovCiAJCXRhc2tfbG9jayh0c2spOwotCQlpZiAodHNrLT5mbGFncyAmIFBGX0VYSVRJTkcpIHsKLQkJCS8qIGlnbm9yZSB0aGlzIHRhc2sgaWYgaXQncyBnb2luZyBhd2F5ICovCi0JCQl0YXNrX3VubG9jayh0c2spOwotCQkJY29udGludWU7Ci0JCX0KIAkJb2xkY2cgPSB0c2stPmNncm91cHM7CiAJCWdldF9jc3Nfc2V0KG9sZGNnKTsKIAkJdGFza191bmxvY2sodHNrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHUuYyBiL2tlcm5lbC9jcHUuYwppbmRleCA1NjNmMTM2Li41Y2EzOGQ1IDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1LmMKKysrIGIva2VybmVsL2NwdS5jCkBAIC0xNzgsOCArMTc4LDcgQEAKIAl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CiAJZm9yX2VhY2hfcHJvY2VzcyhwKSB7CiAJCWlmICh0YXNrX2NwdShwKSA9PSBjcHUgJiYgcC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HICYmCi0JCSAgICAoIWNwdXRpbWVfZXEocC0+dXRpbWUsIGNwdXRpbWVfemVybykgfHwKLQkJICAgICAhY3B1dGltZV9lcShwLT5zdGltZSwgY3B1dGltZV96ZXJvKSkpCisJCSAgICAocC0+dXRpbWUgfHwgcC0+c3RpbWUpKQogCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiVGFzayAlcyAocGlkID0gJWQpIGlzIG9uIGNwdSAlZCAiCiAJCQkJIihzdGF0ZSA9ICVsZCwgZmxhZ3MgPSAleClcbiIsCiAJCQkJcC0+Y29tbSwgdGFza19waWRfbnIocCksIGNwdSwKQEAgLTM4MCw2ICszNzksNyBAQAogCWNwdV9tYXBzX3VwZGF0ZV9kb25lKCk7CiAJcmV0dXJuIGVycjsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV91cCk7CiAKICNpZmRlZiBDT05GSUdfUE1fU0xFRVBfU01QCiBzdGF0aWMgY3B1bWFza192YXJfdCBmcm96ZW5fY3B1czsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jcHVzZXQuYyBiL2tlcm5lbC9jcHVzZXQuYwppbmRleCA5ZmU1OGM0Li4wYjE3MTJkIDEwMDY0NAotLS0gYS9rZXJuZWwvY3B1c2V0LmMKKysrIGIva2VybmVsL2NwdXNldC5jCkBAIC0xMjMsNiArMTIzLDE5IEBACiAJCQkgICAgc3RydWN0IGNwdXNldCwgY3NzKTsKIH0KIAorI2lmZGVmIENPTkZJR19OVU1BCitzdGF0aWMgaW5saW5lIGJvb2wgdGFza19oYXNfbWVtcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gdGFzay0+bWVtcG9saWN5OworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgYm9vbCB0YXNrX2hhc19tZW1wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZgorCisKIC8qIGJpdHMgaW4gc3RydWN0IGNwdXNldCBmbGFncyBmaWVsZCAqLwogdHlwZWRlZiBlbnVtIHsKIAlDU19DUFVfRVhDTFVTSVZFLApAQCAtOTQ5LDcgKzk2Miw3IEBACiBzdGF0aWMgdm9pZCBjcHVzZXRfY2hhbmdlX3Rhc2tfbm9kZW1hc2soc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCiAJCQkJCW5vZGVtYXNrX3QgKm5ld21lbXMpCiB7Ci0JYm9vbCBtYXNrc19kaXNqb2ludCA9ICFub2Rlc19pbnRlcnNlY3RzKCpuZXdtZW1zLCB0c2stPm1lbXNfYWxsb3dlZCk7CisJYm9vbCBuZWVkX2xvb3A7CiAKIHJlcGVhdDoKIAkvKgpAQCAtOTYyLDYgKzk3NSwxNCBAQAogCQlyZXR1cm47CiAKIAl0YXNrX2xvY2sodHNrKTsKKwkvKgorCSAqIERldGVybWluZSBpZiBhIGxvb3AgaXMgbmVjZXNzYXJ5IGlmIGFub3RoZXIgdGhyZWFkIGlzIGRvaW5nCisJICogZ2V0X21lbXNfYWxsb3dlZCgpLiAgSWYgYXQgbGVhc3Qgb25lIG5vZGUgcmVtYWlucyB1bmNoYW5nZWQgYW5kCisJICogdHNrIGRvZXMgbm90IGhhdmUgYSBtZW1wb2xpY3ksIHRoZW4gYW4gZW1wdHkgbm9kZW1hc2sgd2lsbCBub3QgYmUKKwkgKiBwb3NzaWJsZSB3aGVuIG1lbXNfYWxsb3dlZCBpcyBsYXJnZXIgdGhhbiBhIHdvcmQuCisJICovCisJbmVlZF9sb29wID0gdGFza19oYXNfbWVtcG9saWN5KHRzaykgfHwKKwkJCSFub2Rlc19pbnRlcnNlY3RzKCpuZXdtZW1zLCB0c2stPm1lbXNfYWxsb3dlZCk7CiAJbm9kZXNfb3IodHNrLT5tZW1zX2FsbG93ZWQsIHRzay0+bWVtc19hbGxvd2VkLCAqbmV3bWVtcyk7CiAJbXBvbF9yZWJpbmRfdGFzayh0c2ssIG5ld21lbXMsIE1QT0xfUkVCSU5EX1NURVAxKTsKIApAQCAtOTgxLDExICsxMDAyLDkgQEAKIAogCS8qCiAJICogQWxsb2NhdGlvbiBvZiBtZW1vcnkgaXMgdmVyeSBmYXN0LCB3ZSBuZWVkbid0IHNsZWVwIHdoZW4gd2FpdGluZwotCSAqIGZvciB0aGUgcmVhZC1zaWRlLiAgTm8gd2FpdCBpcyBuZWNlc3NhcnksIGhvd2V2ZXIsIGlmIGF0IGxlYXN0IG9uZQotCSAqIG5vZGUgcmVtYWlucyB1bmNoYW5nZWQuCisJICogZm9yIHRoZSByZWFkLXNpZGUuCiAJICovCi0Jd2hpbGUgKG1hc2tzX2Rpc2pvaW50ICYmCi0JCQlBQ0NFU1NfT05DRSh0c2stPm1lbXNfYWxsb3dlZF9jaGFuZ2VfZGlzYWJsZSkpIHsKKwl3aGlsZSAobmVlZF9sb29wICYmIEFDQ0VTU19PTkNFKHRzay0+bWVtc19hbGxvd2VkX2NoYW5nZV9kaXNhYmxlKSkgewogCQl0YXNrX3VubG9jayh0c2spOwogCQlpZiAoIXRhc2tfY3Vycih0c2spKQogCQkJeWllbGQoKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX3N1cHBvcnQuYyBiL2tlcm5lbC9kZWJ1Zy9rZGIva2RiX3N1cHBvcnQuYwppbmRleCA1NTMyZGQzLi43ZDZmYjQwIDEwMDY0NAotLS0gYS9rZXJuZWwvZGVidWcva2RiL2tkYl9zdXBwb3J0LmMKKysrIGIva2VybmVsL2RlYnVnL2tkYi9rZGJfc3VwcG9ydC5jCkBAIC02MzYsNyArNjM2LDcgQEAKIAkJKHAtPmV4aXRfc3RhdGUgJiBFWElUX1pPTUJJRSkgPyAnWicgOgogCQkocC0+ZXhpdF9zdGF0ZSAmIEVYSVRfREVBRCkgPyAnRScgOgogCQkocC0+c3RhdGUgJiBUQVNLX0lOVEVSUlVQVElCTEUpID8gJ1MnIDogJz8nOwotCWlmIChwLT5waWQgPT0gMCkgeworCWlmIChpc19pZGxlX3Rhc2socCkpIHsKIAkJLyogSWRsZSB0YXNrLiAgSXMgaXQgcmVhbGx5IGlkbGUsIGFwYXJ0IGZyb20gdGhlIGtkYgogCQkgKiBpbnRlcnJ1cHQ/ICovCiAJCWlmICgha2RiX3Rhc2tfaGFzX2NwdShwKSB8fCBrZ2RiX2luZm9bY3B1XS5pcnFfZGVwdGggPT0gMSkgewpkaWZmIC0tZ2l0IGEva2VybmVsL2V2ZW50cy9NYWtlZmlsZSBiL2tlcm5lbC9ldmVudHMvTWFrZWZpbGUKaW5kZXggODllNWU4YS4uMjJkOTAxZiAxMDA2NDQKLS0tIGEva2VybmVsL2V2ZW50cy9NYWtlZmlsZQorKysgYi9rZXJuZWwvZXZlbnRzL01ha2VmaWxlCkBAIC0yLDUgKzIsNSBAQAogQ0ZMQUdTX1JFTU9WRV9jb3JlLm8gPSAtcGcKIGVuZGlmCiAKLW9iai15IDo9IGNvcmUubyByaW5nX2J1ZmZlci5vCitvYmoteSA6PSBjb3JlLm8gcmluZ19idWZmZXIubyBjYWxsY2hhaW4ubwogb2JqLSQoQ09ORklHX0hBVkVfSFdfQlJFQUtQT0lOVCkgKz0gaHdfYnJlYWtwb2ludC5vCmRpZmYgLS1naXQgYS9rZXJuZWwvZXZlbnRzL2NhbGxjaGFpbi5jIGIva2VybmVsL2V2ZW50cy9jYWxsY2hhaW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTdlMjRiCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL2V2ZW50cy9jYWxsY2hhaW4uYwpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGV2ZW50cyBjYWxsY2hhaW4gY29kZSwgZXh0cmFjdGVkIGZyb20gY29yZS5jOgorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDggVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBSZWQgSGF0LCBJbmMuLCBQZXRlciBaaWpsc3RyYSA8cHppamxzdHJAcmVkaGF0LmNvbT4KKyAqICBDb3B5cmlnaHQgIKkgIDIwMDkgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3JwLiA8cGF1bHVzQGF1MS5pYm0uY29tPgorICoKKyAqIEZvciBsaWNlbnNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisKKyNpbmNsdWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgImludGVybmFsLmgiCisKK3N0cnVjdCBjYWxsY2hhaW5fY3B1c19lbnRyaWVzIHsKKwlzdHJ1Y3QgcmN1X2hlYWQJCQlyY3VfaGVhZDsKKwlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkJKmNwdV9lbnRyaWVzWzBdOworfTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgY2FsbGNoYWluX3JlY3Vyc2lvbltQRVJGX05SX0NPTlRFWFRTXSk7CitzdGF0aWMgYXRvbWljX3QgbnJfY2FsbGNoYWluX2V2ZW50czsKK3N0YXRpYyBERUZJTkVfTVVURVgoY2FsbGNoYWluX211dGV4KTsKK3N0YXRpYyBzdHJ1Y3QgY2FsbGNoYWluX2NwdXNfZW50cmllcyAqY2FsbGNoYWluX2NwdXNfZW50cmllczsKKworCitfX3dlYWsgdm9pZCBwZXJmX2NhbGxjaGFpbl9rZXJuZWwoc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSwKKwkJCQkgIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworfQorCitfX3dlYWsgdm9pZCBwZXJmX2NhbGxjaGFpbl91c2VyKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqZW50cnksCisJCQkJc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfY2FsbGNoYWluX2J1ZmZlcnNfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCkKK3sKKwlzdHJ1Y3QgY2FsbGNoYWluX2NwdXNfZW50cmllcyAqZW50cmllczsKKwlpbnQgY3B1OworCisJZW50cmllcyA9IGNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3QgY2FsbGNoYWluX2NwdXNfZW50cmllcywgcmN1X2hlYWQpOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJa2ZyZWUoZW50cmllcy0+Y3B1X2VudHJpZXNbY3B1XSk7CisKKwlrZnJlZShlbnRyaWVzKTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9jYWxsY2hhaW5fYnVmZmVycyh2b2lkKQoreworCXN0cnVjdCBjYWxsY2hhaW5fY3B1c19lbnRyaWVzICplbnRyaWVzOworCisJZW50cmllcyA9IGNhbGxjaGFpbl9jcHVzX2VudHJpZXM7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGNhbGxjaGFpbl9jcHVzX2VudHJpZXMsIE5VTEwpOworCWNhbGxfcmN1KCZlbnRyaWVzLT5yY3VfaGVhZCwgcmVsZWFzZV9jYWxsY2hhaW5fYnVmZmVyc19yY3UpOworfQorCitzdGF0aWMgaW50IGFsbG9jX2NhbGxjaGFpbl9idWZmZXJzKHZvaWQpCit7CisJaW50IGNwdTsKKwlpbnQgc2l6ZTsKKwlzdHJ1Y3QgY2FsbGNoYWluX2NwdXNfZW50cmllcyAqZW50cmllczsKKworCS8qCisJICogV2UgY2FuJ3QgdXNlIHRoZSBwZXJjcHUgYWxsb2NhdGlvbiBBUEkgZm9yIGRhdGEgdGhhdCBjYW4gYmUKKwkgKiBhY2Nlc3NlZCBmcm9tIE5NSS4gVXNlIGEgdGVtcG9yYXJ5IG1hbnVhbCBwZXIgY3B1IGFsbG9jYXRpb24KKwkgKiB1bnRpbCB0aGF0IGdldHMgc29ydGVkIG91dC4KKwkgKi8KKwlzaXplID0gb2Zmc2V0b2Yoc3RydWN0IGNhbGxjaGFpbl9jcHVzX2VudHJpZXMsIGNwdV9lbnRyaWVzW25yX2NwdV9pZHNdKTsKKworCWVudHJpZXMgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghZW50cmllcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzaXplID0gc2l6ZW9mKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSkgKiBQRVJGX05SX0NPTlRFWFRTOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQllbnRyaWVzLT5jcHVfZW50cmllc1tjcHVdID0ga21hbGxvY19ub2RlKHNpemUsIEdGUF9LRVJORUwsCisJCQkJCQkJIGNwdV90b19ub2RlKGNwdSkpOworCQlpZiAoIWVudHJpZXMtPmNwdV9lbnRyaWVzW2NwdV0pCisJCQlnb3RvIGZhaWw7CisJfQorCisJcmN1X2Fzc2lnbl9wb2ludGVyKGNhbGxjaGFpbl9jcHVzX2VudHJpZXMsIGVudHJpZXMpOworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJa2ZyZWUoZW50cmllcy0+Y3B1X2VudHJpZXNbY3B1XSk7CisJa2ZyZWUoZW50cmllcyk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworaW50IGdldF9jYWxsY2hhaW5fYnVmZmVycyh2b2lkKQoreworCWludCBlcnIgPSAwOworCWludCBjb3VudDsKKworCW11dGV4X2xvY2soJmNhbGxjaGFpbl9tdXRleCk7CisKKwljb3VudCA9IGF0b21pY19pbmNfcmV0dXJuKCZucl9jYWxsY2hhaW5fZXZlbnRzKTsKKwlpZiAoV0FSTl9PTl9PTkNFKGNvdW50IDwgMSkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBleGl0OworCX0KKworCWlmIChjb3VudCA+IDEpIHsKKwkJLyogSWYgdGhlIGFsbG9jYXRpb24gZmFpbGVkLCBnaXZlIHVwICovCisJCWlmICghY2FsbGNoYWluX2NwdXNfZW50cmllcykKKwkJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXhpdDsKKwl9CisKKwllcnIgPSBhbGxvY19jYWxsY2hhaW5fYnVmZmVycygpOworCWlmIChlcnIpCisJCXJlbGVhc2VfY2FsbGNoYWluX2J1ZmZlcnMoKTsKK2V4aXQ6CisJbXV0ZXhfdW5sb2NrKCZjYWxsY2hhaW5fbXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KKwordm9pZCBwdXRfY2FsbGNoYWluX2J1ZmZlcnModm9pZCkKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jaygmbnJfY2FsbGNoYWluX2V2ZW50cywgJmNhbGxjaGFpbl9tdXRleCkpIHsKKwkJcmVsZWFzZV9jYWxsY2hhaW5fYnVmZmVycygpOworCQltdXRleF91bmxvY2soJmNhbGxjaGFpbl9tdXRleCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICpnZXRfY2FsbGNoYWluX2VudHJ5KGludCAqcmN0eCkKK3sKKwlpbnQgY3B1OworCXN0cnVjdCBjYWxsY2hhaW5fY3B1c19lbnRyaWVzICplbnRyaWVzOworCisJKnJjdHggPSBnZXRfcmVjdXJzaW9uX2NvbnRleHQoX19nZXRfY3B1X3ZhcihjYWxsY2hhaW5fcmVjdXJzaW9uKSk7CisJaWYgKCpyY3R4ID09IC0xKQorCQlyZXR1cm4gTlVMTDsKKworCWVudHJpZXMgPSByY3VfZGVyZWZlcmVuY2UoY2FsbGNoYWluX2NwdXNfZW50cmllcyk7CisJaWYgKCFlbnRyaWVzKQorCQlyZXR1cm4gTlVMTDsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCXJldHVybiAmZW50cmllcy0+Y3B1X2VudHJpZXNbY3B1XVsqcmN0eF07Cit9CisKK3N0YXRpYyB2b2lkCitwdXRfY2FsbGNoYWluX2VudHJ5KGludCByY3R4KQoreworCXB1dF9yZWN1cnNpb25fY29udGV4dChfX2dldF9jcHVfdmFyKGNhbGxjaGFpbl9yZWN1cnNpb24pLCByY3R4KTsKK30KKworc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICpwZXJmX2NhbGxjaGFpbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgcmN0eDsKKwlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5OworCisKKwllbnRyeSA9IGdldF9jYWxsY2hhaW5fZW50cnkoJnJjdHgpOworCWlmIChyY3R4ID09IC0xKQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZW50cnkpCisJCWdvdG8gZXhpdF9wdXQ7CisKKwllbnRyeS0+bnIgPSAwOworCisJaWYgKCF1c2VyX21vZGUocmVncykpIHsKKwkJcGVyZl9jYWxsY2hhaW5fc3RvcmUoZW50cnksIFBFUkZfQ09OVEVYVF9LRVJORUwpOworCQlwZXJmX2NhbGxjaGFpbl9rZXJuZWwoZW50cnksIHJlZ3MpOworCQlpZiAoY3VycmVudC0+bW0pCisJCQlyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOworCQllbHNlCisJCQlyZWdzID0gTlVMTDsKKwl9CisKKwlpZiAocmVncykgeworCQlwZXJmX2NhbGxjaGFpbl9zdG9yZShlbnRyeSwgUEVSRl9DT05URVhUX1VTRVIpOworCQlwZXJmX2NhbGxjaGFpbl91c2VyKGVudHJ5LCByZWdzKTsKKwl9CisKK2V4aXRfcHV0OgorCXB1dF9jYWxsY2hhaW5fZW50cnkocmN0eCk7CisKKwlyZXR1cm4gZW50cnk7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvZXZlbnRzL2NvcmUuYyBiL2tlcm5lbC9ldmVudHMvY29yZS5jCmluZGV4IDBlODQ1N2QuLjg5MGViMDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ldmVudHMvY29yZS5jCisrKyBiL2tlcm5lbC9ldmVudHMvY29yZS5jCkBAIC0xMjgsNyArMTI4LDcgQEAKICAqIHBlcmZfc2NoZWRfZXZlbnRzIDogPjAgZXZlbnRzIGV4aXN0CiAgKiBwZXJmX2Nncm91cF9ldmVudHM6ID4wIHBlci1jcHUgY2dyb3VwIGV2ZW50cyBleGlzdCBvbiB0aGlzIGNwdQogICovCi1zdHJ1Y3QganVtcF9sYWJlbF9rZXkgcGVyZl9zY2hlZF9ldmVudHMgX19yZWFkX21vc3RseTsKK3N0cnVjdCBqdW1wX2xhYmVsX2tleV9kZWZlcnJlZCBwZXJmX3NjaGVkX2V2ZW50cyBfX3JlYWRfbW9zdGx5Owogc3RhdGljIERFRklORV9QRVJfQ1BVKGF0b21pY190LCBwZXJmX2Nncm91cF9ldmVudHMpOwogCiBzdGF0aWMgYXRvbWljX3QgbnJfbW1hcF9ldmVudHMgX19yZWFkX21vc3RseTsKQEAgLTE4NSw2ICsxODUsOSBAQAogc3RhdGljIHZvaWQgdXBkYXRlX2NvbnRleHRfdGltZShzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpOwogc3RhdGljIHU2NCBwZXJmX2V2ZW50X3RpbWUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KTsKIAorc3RhdGljIHZvaWQgcmluZ19idWZmZXJfYXR0YWNoKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSAgICAgICBzdHJ1Y3QgcmluZ19idWZmZXIgKnJiKTsKKwogdm9pZCBfX3dlYWsgcGVyZl9ldmVudF9wcmludF9kZWJ1Zyh2b2lkKQl7IH0KIAogZXh0ZXJuIF9fd2VhayBjb25zdCBjaGFyICpwZXJmX3BtdV9uYW1lKHZvaWQpCkBAIC0xMTI3LDYgKzExMzAsOCBAQAogCWlmICghaXNfc29mdHdhcmVfZXZlbnQoZXZlbnQpKQogCQljcHVjdHgtPmFjdGl2ZV9vbmNwdS0tOwogCWN0eC0+bnJfYWN0aXZlLS07CisJaWYgKGV2ZW50LT5hdHRyLmZyZXEgJiYgZXZlbnQtPmF0dHIuc2FtcGxlX2ZyZXEpCisJCWN0eC0+bnJfZnJlcS0tOwogCWlmIChldmVudC0+YXR0ci5leGNsdXNpdmUgfHwgIWNwdWN0eC0+YWN0aXZlX29uY3B1KQogCQljcHVjdHgtPmV4Y2x1c2l2ZSA9IDA7CiB9CkBAIC0xMzIyLDYgKzEzMjcsNyBAQAogCX0KIAlyYXdfc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOwogfQorRVhQT1JUX1NZTUJPTF9HUEwocGVyZl9ldmVudF9kaXNhYmxlKTsKIAogc3RhdGljIHZvaWQgcGVyZl9zZXRfc2hhZG93X3RpbWUoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSBzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgsCkBAIC0xNDAzLDYgKzE0MDksOCBAQAogCWlmICghaXNfc29mdHdhcmVfZXZlbnQoZXZlbnQpKQogCQljcHVjdHgtPmFjdGl2ZV9vbmNwdSsrOwogCWN0eC0+bnJfYWN0aXZlKys7CisJaWYgKGV2ZW50LT5hdHRyLmZyZXEgJiYgZXZlbnQtPmF0dHIuc2FtcGxlX2ZyZXEpCisJCWN0eC0+bnJfZnJlcSsrOwogCiAJaWYgKGV2ZW50LT5hdHRyLmV4Y2x1c2l2ZSkKIAkJY3B1Y3R4LT5leGNsdXNpdmUgPSAxOwpAQCAtMTY1OSw4ICsxNjY3LDcgQEAKICAqIE5vdGU6IHRoaXMgd29ya3MgZm9yIGdyb3VwIG1lbWJlcnMgYXMgd2VsbCBhcyBncm91cCBsZWFkZXJzCiAgKiBzaW5jZSB0aGUgbm9uLWxlYWRlciBtZW1iZXJzJyBzaWJsaW5nX2xpc3RzIHdpbGwgYmUgZW1wdHkuCiAgKi8KLXN0YXRpYyB2b2lkIF9fcGVyZl9ldmVudF9tYXJrX2VuYWJsZWQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJCQlzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpCitzdGF0aWMgdm9pZCBfX3BlcmZfZXZlbnRfbWFya19lbmFibGVkKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldmVudCAqc3ViOwogCXU2NCB0c3RhbXAgPSBwZXJmX2V2ZW50X3RpbWUoZXZlbnQpOwpAQCAtMTY5OCw3ICsxNzA1LDcgQEAKIAkgKi8KIAlwZXJmX2Nncm91cF9zZXRfdGltZXN0YW1wKGN1cnJlbnQsIGN0eCk7CiAKLQlfX3BlcmZfZXZlbnRfbWFya19lbmFibGVkKGV2ZW50LCBjdHgpOworCV9fcGVyZl9ldmVudF9tYXJrX2VuYWJsZWQoZXZlbnQpOwogCiAJaWYgKCFldmVudF9maWx0ZXJfbWF0Y2goZXZlbnQpKSB7CiAJCWlmIChpc19jZ3JvdXBfZXZlbnQoZXZlbnQpKQpAQCAtMTc3OSw3ICsxNzg2LDcgQEAKIAogcmV0cnk6CiAJaWYgKCFjdHgtPmlzX2FjdGl2ZSkgewotCQlfX3BlcmZfZXZlbnRfbWFya19lbmFibGVkKGV2ZW50LCBjdHgpOworCQlfX3BlcmZfZXZlbnRfbWFya19lbmFibGVkKGV2ZW50KTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0xODA2LDYgKzE4MTMsNyBAQAogb3V0OgogCXJhd19zcGluX3VubG9ja19pcnEoJmN0eC0+bG9jayk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChwZXJmX2V2ZW50X2VuYWJsZSk7CiAKIGludCBwZXJmX2V2ZW50X3JlZnJlc2goc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCBpbnQgcmVmcmVzaCkKIHsKQEAgLTIxNzEsOSArMjE3OSwxMCBAQAogCSAqLwogCWNwdV9jdHhfc2NoZWRfb3V0KGNwdWN0eCwgRVZFTlRfRkxFWElCTEUpOwogCi0JcGVyZl9ldmVudF9zY2hlZF9pbihjcHVjdHgsIGN0eCwgdGFzayk7CisJaWYgKGN0eC0+bnJfZXZlbnRzKQorCQljcHVjdHgtPnRhc2tfY3R4ID0gY3R4OwogCi0JY3B1Y3R4LT50YXNrX2N0eCA9IGN0eDsKKwlwZXJmX2V2ZW50X3NjaGVkX2luKGNwdWN0eCwgY3B1Y3R4LT50YXNrX2N0eCwgdGFzayk7CiAKIAlwZXJmX3BtdV9lbmFibGUoY3R4LT5wbXUpOwogCXBlcmZfY3R4X3VubG9jayhjcHVjdHgsIGN0eCk7CkBAIC0yMzIzLDYgKzIzMzIsOSBAQAogCXU2NCBpbnRlcnJ1cHRzLCBub3c7CiAJczY0IGRlbHRhOwogCisJaWYgKCFjdHgtPm5yX2ZyZXEpCisJCXJldHVybjsKKwogCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGV2ZW50LCAmY3R4LT5ldmVudF9saXN0LCBldmVudF9lbnRyeSkgewogCQlpZiAoZXZlbnQtPnN0YXRlICE9IFBFUkZfRVZFTlRfU1RBVEVfQUNUSVZFKQogCQkJY29udGludWU7CkBAIC0yMzc4LDEyICsyMzkwLDE0IEBACiB7CiAJdTY0IGludGVydmFsID0gKHU2NCljcHVjdHgtPmppZmZpZXNfaW50ZXJ2YWwgKiBUSUNLX05TRUM7CiAJc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqY3R4ID0gTlVMTDsKLQlpbnQgcm90YXRlID0gMCwgcmVtb3ZlID0gMTsKKwlpbnQgcm90YXRlID0gMCwgcmVtb3ZlID0gMSwgZnJlcSA9IDA7CiAKIAlpZiAoY3B1Y3R4LT5jdHgubnJfZXZlbnRzKSB7CiAJCXJlbW92ZSA9IDA7CiAJCWlmIChjcHVjdHgtPmN0eC5ucl9ldmVudHMgIT0gY3B1Y3R4LT5jdHgubnJfYWN0aXZlKQogCQkJcm90YXRlID0gMTsKKwkJaWYgKGNwdWN0eC0+Y3R4Lm5yX2ZyZXEpCisJCQlmcmVxID0gMTsKIAl9CiAKIAljdHggPSBjcHVjdHgtPnRhc2tfY3R4OwpAQCAtMjM5MSwzMyArMjQwNSw0MCBAQAogCQlyZW1vdmUgPSAwOwogCQlpZiAoY3R4LT5ucl9ldmVudHMgIT0gY3R4LT5ucl9hY3RpdmUpCiAJCQlyb3RhdGUgPSAxOworCQlpZiAoY3R4LT5ucl9mcmVxKQorCQkJZnJlcSA9IDE7CiAJfQogCisJaWYgKCFyb3RhdGUgJiYgIWZyZXEpCisJCWdvdG8gZG9uZTsKKwogCXBlcmZfY3R4X2xvY2soY3B1Y3R4LCBjcHVjdHgtPnRhc2tfY3R4KTsKIAlwZXJmX3BtdV9kaXNhYmxlKGNwdWN0eC0+Y3R4LnBtdSk7Ci0JcGVyZl9jdHhfYWRqdXN0X2ZyZXEoJmNwdWN0eC0+Y3R4LCBpbnRlcnZhbCk7Ci0JaWYgKGN0eCkKLQkJcGVyZl9jdHhfYWRqdXN0X2ZyZXEoY3R4LCBpbnRlcnZhbCk7CiAKLQlpZiAoIXJvdGF0ZSkKLQkJZ290byBkb25lOworCWlmIChmcmVxKSB7CisJCXBlcmZfY3R4X2FkanVzdF9mcmVxKCZjcHVjdHgtPmN0eCwgaW50ZXJ2YWwpOworCQlpZiAoY3R4KQorCQkJcGVyZl9jdHhfYWRqdXN0X2ZyZXEoY3R4LCBpbnRlcnZhbCk7CisJfQogCi0JY3B1X2N0eF9zY2hlZF9vdXQoY3B1Y3R4LCBFVkVOVF9GTEVYSUJMRSk7Ci0JaWYgKGN0eCkKLQkJY3R4X3NjaGVkX291dChjdHgsIGNwdWN0eCwgRVZFTlRfRkxFWElCTEUpOworCWlmIChyb3RhdGUpIHsKKwkJY3B1X2N0eF9zY2hlZF9vdXQoY3B1Y3R4LCBFVkVOVF9GTEVYSUJMRSk7CisJCWlmIChjdHgpCisJCQljdHhfc2NoZWRfb3V0KGN0eCwgY3B1Y3R4LCBFVkVOVF9GTEVYSUJMRSk7CiAKLQlyb3RhdGVfY3R4KCZjcHVjdHgtPmN0eCk7Ci0JaWYgKGN0eCkKLQkJcm90YXRlX2N0eChjdHgpOworCQlyb3RhdGVfY3R4KCZjcHVjdHgtPmN0eCk7CisJCWlmIChjdHgpCisJCQlyb3RhdGVfY3R4KGN0eCk7CiAKLQlwZXJmX2V2ZW50X3NjaGVkX2luKGNwdWN0eCwgY3R4LCBjdXJyZW50KTsKKwkJcGVyZl9ldmVudF9zY2hlZF9pbihjcHVjdHgsIGN0eCwgY3VycmVudCk7CisJfQorCisJcGVyZl9wbXVfZW5hYmxlKGNwdWN0eC0+Y3R4LnBtdSk7CisJcGVyZl9jdHhfdW5sb2NrKGNwdWN0eCwgY3B1Y3R4LT50YXNrX2N0eCk7CiAKIGRvbmU6CiAJaWYgKHJlbW92ZSkKIAkJbGlzdF9kZWxfaW5pdCgmY3B1Y3R4LT5yb3RhdGlvbl9saXN0KTsKLQotCXBlcmZfcG11X2VuYWJsZShjcHVjdHgtPmN0eC5wbXUpOwotCXBlcmZfY3R4X3VubG9jayhjcHVjdHgsIGNwdWN0eC0+dGFza19jdHgpOwogfQogCiB2b2lkIHBlcmZfZXZlbnRfdGFza190aWNrKHZvaWQpCkBAIC0yNDQ0LDcgKzI0NjUsNyBAQAogCWlmIChldmVudC0+c3RhdGUgPj0gUEVSRl9FVkVOVF9TVEFURV9JTkFDVElWRSkKIAkJcmV0dXJuIDA7CiAKLQlfX3BlcmZfZXZlbnRfbWFya19lbmFibGVkKGV2ZW50LCBjdHgpOworCV9fcGVyZl9ldmVudF9tYXJrX2VuYWJsZWQoZXZlbnQpOwogCiAJcmV0dXJuIDE7CiB9CkBAIC0yNDc2LDEzICsyNDk3LDcgQEAKIAlyYXdfc3Bpbl9sb2NrKCZjdHgtPmxvY2spOwogCXRhc2tfY3R4X3NjaGVkX291dChjdHgpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgJmN0eC0+cGlubmVkX2dyb3VwcywgZ3JvdXBfZW50cnkpIHsKLQkJcmV0ID0gZXZlbnRfZW5hYmxlX29uX2V4ZWMoZXZlbnQsIGN0eCk7Ci0JCWlmIChyZXQpCi0JCQllbmFibGVkID0gMTsKLQl9Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2ZW50LCAmY3R4LT5mbGV4aWJsZV9ncm91cHMsIGdyb3VwX2VudHJ5KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgJmN0eC0+ZXZlbnRfbGlzdCwgZXZlbnRfZW50cnkpIHsKIAkJcmV0ID0gZXZlbnRfZW5hYmxlX29uX2V4ZWMoZXZlbnQsIGN0eCk7CiAJCWlmIChyZXQpCiAJCQllbmFibGVkID0gMTsKQEAgLTI1NzAsMjE1ICsyNTg1LDYgQEAKIH0KIAogLyoKLSAqIENhbGxjaGFpbiBzdXBwb3J0Ci0gKi8KLQotc3RydWN0IGNhbGxjaGFpbl9jcHVzX2VudHJpZXMgewotCXN0cnVjdCByY3VfaGVhZAkJCXJjdV9oZWFkOwotCXN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeQkqY3B1X2VudHJpZXNbMF07Ci19OwotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBjYWxsY2hhaW5fcmVjdXJzaW9uW1BFUkZfTlJfQ09OVEVYVFNdKTsKLXN0YXRpYyBhdG9taWNfdCBucl9jYWxsY2hhaW5fZXZlbnRzOwotc3RhdGljIERFRklORV9NVVRFWChjYWxsY2hhaW5fbXV0ZXgpOwotc3RydWN0IGNhbGxjaGFpbl9jcHVzX2VudHJpZXMgKmNhbGxjaGFpbl9jcHVzX2VudHJpZXM7Ci0KLQotX193ZWFrIHZvaWQgcGVyZl9jYWxsY2hhaW5fa2VybmVsKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqZW50cnksCi0JCQkJICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLX0KLQotX193ZWFrIHZvaWQgcGVyZl9jYWxsY2hhaW5fdXNlcihzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5LAotCQkJCXN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotfQotCi1zdGF0aWMgdm9pZCByZWxlYXNlX2NhbGxjaGFpbl9idWZmZXJzX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IGNhbGxjaGFpbl9jcHVzX2VudHJpZXMgKmVudHJpZXM7Ci0JaW50IGNwdTsKLQotCWVudHJpZXMgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IGNhbGxjaGFpbl9jcHVzX2VudHJpZXMsIHJjdV9oZWFkKTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCi0JCWtmcmVlKGVudHJpZXMtPmNwdV9lbnRyaWVzW2NwdV0pOwotCi0Ja2ZyZWUoZW50cmllcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbGVhc2VfY2FsbGNoYWluX2J1ZmZlcnModm9pZCkKLXsKLQlzdHJ1Y3QgY2FsbGNoYWluX2NwdXNfZW50cmllcyAqZW50cmllczsKLQotCWVudHJpZXMgPSBjYWxsY2hhaW5fY3B1c19lbnRyaWVzOwotCXJjdV9hc3NpZ25fcG9pbnRlcihjYWxsY2hhaW5fY3B1c19lbnRyaWVzLCBOVUxMKTsKLQljYWxsX3JjdSgmZW50cmllcy0+cmN1X2hlYWQsIHJlbGVhc2VfY2FsbGNoYWluX2J1ZmZlcnNfcmN1KTsKLX0KLQotc3RhdGljIGludCBhbGxvY19jYWxsY2hhaW5fYnVmZmVycyh2b2lkKQotewotCWludCBjcHU7Ci0JaW50IHNpemU7Ci0Jc3RydWN0IGNhbGxjaGFpbl9jcHVzX2VudHJpZXMgKmVudHJpZXM7Ci0KLQkvKgotCSAqIFdlIGNhbid0IHVzZSB0aGUgcGVyY3B1IGFsbG9jYXRpb24gQVBJIGZvciBkYXRhIHRoYXQgY2FuIGJlCi0JICogYWNjZXNzZWQgZnJvbSBOTUkuIFVzZSBhIHRlbXBvcmFyeSBtYW51YWwgcGVyIGNwdSBhbGxvY2F0aW9uCi0JICogdW50aWwgdGhhdCBnZXRzIHNvcnRlZCBvdXQuCi0JICovCi0Jc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBjYWxsY2hhaW5fY3B1c19lbnRyaWVzLCBjcHVfZW50cmllc1tucl9jcHVfaWRzXSk7Ci0KLQllbnRyaWVzID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWVudHJpZXMpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc2l6ZSA9IHNpemVvZihzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkpICogUEVSRl9OUl9DT05URVhUUzsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJZW50cmllcy0+Y3B1X2VudHJpZXNbY3B1XSA9IGttYWxsb2Nfbm9kZShzaXplLCBHRlBfS0VSTkVMLAotCQkJCQkJCSBjcHVfdG9fbm9kZShjcHUpKTsKLQkJaWYgKCFlbnRyaWVzLT5jcHVfZW50cmllc1tjcHVdKQotCQkJZ290byBmYWlsOwotCX0KLQotCXJjdV9hc3NpZ25fcG9pbnRlcihjYWxsY2hhaW5fY3B1c19lbnRyaWVzLCBlbnRyaWVzKTsKLQotCXJldHVybiAwOwotCi1mYWlsOgotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCi0JCWtmcmVlKGVudHJpZXMtPmNwdV9lbnRyaWVzW2NwdV0pOwotCWtmcmVlKGVudHJpZXMpOwotCi0JcmV0dXJuIC1FTk9NRU07Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2NhbGxjaGFpbl9idWZmZXJzKHZvaWQpCi17Ci0JaW50IGVyciA9IDA7Ci0JaW50IGNvdW50OwotCi0JbXV0ZXhfbG9jaygmY2FsbGNoYWluX211dGV4KTsKLQotCWNvdW50ID0gYXRvbWljX2luY19yZXR1cm4oJm5yX2NhbGxjaGFpbl9ldmVudHMpOwotCWlmIChXQVJOX09OX09OQ0UoY291bnQgPCAxKSkgewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGV4aXQ7Ci0JfQotCi0JaWYgKGNvdW50ID4gMSkgewotCQkvKiBJZiB0aGUgYWxsb2NhdGlvbiBmYWlsZWQsIGdpdmUgdXAgKi8KLQkJaWYgKCFjYWxsY2hhaW5fY3B1c19lbnRyaWVzKQotCQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBleGl0OwotCX0KLQotCWVyciA9IGFsbG9jX2NhbGxjaGFpbl9idWZmZXJzKCk7Ci0JaWYgKGVycikKLQkJcmVsZWFzZV9jYWxsY2hhaW5fYnVmZmVycygpOwotZXhpdDoKLQltdXRleF91bmxvY2soJmNhbGxjaGFpbl9tdXRleCk7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgdm9pZCBwdXRfY2FsbGNoYWluX2J1ZmZlcnModm9pZCkKLXsKLQlpZiAoYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jaygmbnJfY2FsbGNoYWluX2V2ZW50cywgJmNhbGxjaGFpbl9tdXRleCkpIHsKLQkJcmVsZWFzZV9jYWxsY2hhaW5fYnVmZmVycygpOwotCQltdXRleF91bmxvY2soJmNhbGxjaGFpbl9tdXRleCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGdldF9yZWN1cnNpb25fY29udGV4dChpbnQgKnJlY3Vyc2lvbikKLXsKLQlpbnQgcmN0eDsKLQotCWlmIChpbl9ubWkoKSkKLQkJcmN0eCA9IDM7Ci0JZWxzZSBpZiAoaW5faXJxKCkpCi0JCXJjdHggPSAyOwotCWVsc2UgaWYgKGluX3NvZnRpcnEoKSkKLQkJcmN0eCA9IDE7Ci0JZWxzZQotCQlyY3R4ID0gMDsKLQotCWlmIChyZWN1cnNpb25bcmN0eF0pCi0JCXJldHVybiAtMTsKLQotCXJlY3Vyc2lvbltyY3R4XSsrOwotCWJhcnJpZXIoKTsKLQotCXJldHVybiByY3R4OwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgcHV0X3JlY3Vyc2lvbl9jb250ZXh0KGludCAqcmVjdXJzaW9uLCBpbnQgcmN0eCkKLXsKLQliYXJyaWVyKCk7Ci0JcmVjdXJzaW9uW3JjdHhdLS07Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmdldF9jYWxsY2hhaW5fZW50cnkoaW50ICpyY3R4KQotewotCWludCBjcHU7Ci0Jc3RydWN0IGNhbGxjaGFpbl9jcHVzX2VudHJpZXMgKmVudHJpZXM7Ci0KLQkqcmN0eCA9IGdldF9yZWN1cnNpb25fY29udGV4dChfX2dldF9jcHVfdmFyKGNhbGxjaGFpbl9yZWN1cnNpb24pKTsKLQlpZiAoKnJjdHggPT0gLTEpCi0JCXJldHVybiBOVUxMOwotCi0JZW50cmllcyA9IHJjdV9kZXJlZmVyZW5jZShjYWxsY2hhaW5fY3B1c19lbnRyaWVzKTsKLQlpZiAoIWVudHJpZXMpCi0JCXJldHVybiBOVUxMOwotCi0JY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JcmV0dXJuICZlbnRyaWVzLT5jcHVfZW50cmllc1tjcHVdWypyY3R4XTsKLX0KLQotc3RhdGljIHZvaWQKLXB1dF9jYWxsY2hhaW5fZW50cnkoaW50IHJjdHgpCi17Ci0JcHV0X3JlY3Vyc2lvbl9jb250ZXh0KF9fZ2V0X2NwdV92YXIoY2FsbGNoYWluX3JlY3Vyc2lvbiksIHJjdHgpOwotfQotCi1zdGF0aWMgc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICpwZXJmX2NhbGxjaGFpbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQlpbnQgcmN0eDsKLQlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5OwotCi0KLQllbnRyeSA9IGdldF9jYWxsY2hhaW5fZW50cnkoJnJjdHgpOwotCWlmIChyY3R4ID09IC0xKQotCQlyZXR1cm4gTlVMTDsKLQotCWlmICghZW50cnkpCi0JCWdvdG8gZXhpdF9wdXQ7Ci0KLQllbnRyeS0+bnIgPSAwOwotCi0JaWYgKCF1c2VyX21vZGUocmVncykpIHsKLQkJcGVyZl9jYWxsY2hhaW5fc3RvcmUoZW50cnksIFBFUkZfQ09OVEVYVF9LRVJORUwpOwotCQlwZXJmX2NhbGxjaGFpbl9rZXJuZWwoZW50cnksIHJlZ3MpOwotCQlpZiAoY3VycmVudC0+bW0pCi0JCQlyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOwotCQllbHNlCi0JCQlyZWdzID0gTlVMTDsKLQl9Ci0KLQlpZiAocmVncykgewotCQlwZXJmX2NhbGxjaGFpbl9zdG9yZShlbnRyeSwgUEVSRl9DT05URVhUX1VTRVIpOwotCQlwZXJmX2NhbGxjaGFpbl91c2VyKGVudHJ5LCByZWdzKTsKLQl9Ci0KLWV4aXRfcHV0OgotCXB1dF9jYWxsY2hhaW5fZW50cnkocmN0eCk7Ci0KLQlyZXR1cm4gZW50cnk7Ci19Ci0KLS8qCiAgKiBJbml0aWFsaXplIHRoZSBwZXJmX2V2ZW50IGNvbnRleHQgaW4gYSB0YXNrX3N0cnVjdDoKICAqLwogc3RhdGljIHZvaWQgX19wZXJmX2V2ZW50X2luaXRfY29udGV4dChzdHJ1Y3QgcGVyZl9ldmVudF9jb250ZXh0ICpjdHgpCkBAIC0yOTQyLDcgKzI3NDgsNyBAQAogCiAJaWYgKCFldmVudC0+cGFyZW50KSB7CiAJCWlmIChldmVudC0+YXR0YWNoX3N0YXRlICYgUEVSRl9BVFRBQ0hfVEFTSykKLQkJCWp1bXBfbGFiZWxfZGVjKCZwZXJmX3NjaGVkX2V2ZW50cyk7CisJCQlqdW1wX2xhYmVsX2RlY19kZWZlcnJlZCgmcGVyZl9zY2hlZF9ldmVudHMpOwogCQlpZiAoZXZlbnQtPmF0dHIubW1hcCB8fCBldmVudC0+YXR0ci5tbWFwX2RhdGEpCiAJCQlhdG9taWNfZGVjKCZucl9tbWFwX2V2ZW50cyk7CiAJCWlmIChldmVudC0+YXR0ci5jb21tKQpAQCAtMjk1Myw3ICsyNzU5LDcgQEAKIAkJCXB1dF9jYWxsY2hhaW5fYnVmZmVycygpOwogCQlpZiAoaXNfY2dyb3VwX2V2ZW50KGV2ZW50KSkgewogCQkJYXRvbWljX2RlYygmcGVyX2NwdShwZXJmX2Nncm91cF9ldmVudHMsIGV2ZW50LT5jcHUpKTsKLQkJCWp1bXBfbGFiZWxfZGVjKCZwZXJmX3NjaGVkX2V2ZW50cyk7CisJCQlqdW1wX2xhYmVsX2RlY19kZWZlcnJlZCgmcGVyZl9zY2hlZF9ldmVudHMpOwogCQl9CiAJfQogCkBAIC0zMTkwLDEyICsyOTk2LDMzIEBACiAJc3RydWN0IHJpbmdfYnVmZmVyICpyYjsKIAl1bnNpZ25lZCBpbnQgZXZlbnRzID0gUE9MTF9IVVA7CiAKKwkvKgorCSAqIFJhY2UgYmV0d2VlbiBwZXJmX2V2ZW50X3NldF9vdXRwdXQoKSBhbmQgcGVyZl9wb2xsKCk6IHBlcmZfcG9sbCgpCisJICogZ3JhYnMgdGhlIHJiIHJlZmVyZW5jZSBidXQgcGVyZl9ldmVudF9zZXRfb3V0cHV0KCkgb3ZlcnJpZGVzIGl0LgorCSAqIEhlcmUgaXMgdGhlIHRpbWVsaW5lIGZvciB0d28gdGhyZWFkcyBUMSwgVDI6CisJICogdDA6IFQxLCByYiA9IHJjdV9kZXJlZmVyZW5jZShldmVudC0+cmIpCisJICogdDE6IFQyLCBvbGRfcmIgPSBldmVudC0+cmIKKwkgKiB0MjogVDIsIGV2ZW50LT5yYiA9IG5ldyByYgorCSAqIHQzOiBUMiwgcmluZ19idWZmZXJfZGV0YWNoKG9sZF9yYikKKwkgKiB0NDogVDEsIHJpbmdfYnVmZmVyX2F0dGFjaChyYjEpCisJICogdDU6IFQxLCBwb2xsX3dhaXQoZXZlbnQtPndhaXRxKQorCSAqCisJICogVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCB3ZSBncmFiIG1tYXBfbXV0ZXggaW4gcGVyZl9wb2xsKCkKKwkgKiB0aGVyZWJ5IGVuc3VyaW5nIHRoYXQgdGhlIGFzc2lnbm1lbnQgb2YgdGhlIG5ldyByaW5nIGJ1ZmZlcgorCSAqIGFuZCB0aGUgZGV0YWNobWVudCBvZiB0aGUgb2xkIGJ1ZmZlciBhcHBlYXIgYXRvbWljIHRvIHBlcmZfcG9sbCgpCisJICovCisJbXV0ZXhfbG9jaygmZXZlbnQtPm1tYXBfbXV0ZXgpOworCiAJcmN1X3JlYWRfbG9jaygpOwogCXJiID0gcmN1X2RlcmVmZXJlbmNlKGV2ZW50LT5yYik7Ci0JaWYgKHJiKQorCWlmIChyYikgeworCQlyaW5nX2J1ZmZlcl9hdHRhY2goZXZlbnQsIHJiKTsKIAkJZXZlbnRzID0gYXRvbWljX3hjaGcoJnJiLT5wb2xsLCAwKTsKKwl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKKwltdXRleF91bmxvY2soJmV2ZW50LT5tbWFwX211dGV4KTsKKwogCXBvbGxfd2FpdChmaWxlLCAmZXZlbnQtPndhaXRxLCB3YWl0KTsKIAogCXJldHVybiBldmVudHM7CkBAIC0zNDk2LDYgKzMzMjMsNTMgQEAKIAlyZXR1cm4gcmV0OwogfQogCitzdGF0aWMgdm9pZCByaW5nX2J1ZmZlcl9hdHRhY2goc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJICAgICAgIHN0cnVjdCByaW5nX2J1ZmZlciAqcmIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghbGlzdF9lbXB0eSgmZXZlbnQtPnJiX2VudHJ5KSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJiLT5ldmVudF9sb2NrLCBmbGFncyk7CisJaWYgKCFsaXN0X2VtcHR5KCZldmVudC0+cmJfZW50cnkpKQorCQlnb3RvIHVubG9jazsKKworCWxpc3RfYWRkKCZldmVudC0+cmJfZW50cnksICZyYi0+ZXZlbnRfbGlzdCk7Cit1bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmItPmV2ZW50X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcmluZ19idWZmZXJfZGV0YWNoKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSAgICAgICBzdHJ1Y3QgcmluZ19idWZmZXIgKnJiKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobGlzdF9lbXB0eSgmZXZlbnQtPnJiX2VudHJ5KSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnJiLT5ldmVudF9sb2NrLCBmbGFncyk7CisJbGlzdF9kZWxfaW5pdCgmZXZlbnQtPnJiX2VudHJ5KTsKKwl3YWtlX3VwX2FsbCgmZXZlbnQtPndhaXRxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZyYi0+ZXZlbnRfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCByaW5nX2J1ZmZlcl93YWtldXAoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCByaW5nX2J1ZmZlciAqcmI7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmIgPSByY3VfZGVyZWZlcmVuY2UoZXZlbnQtPnJiKTsKKwlpZiAoIXJiKQorCQlnb3RvIHVubG9jazsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGV2ZW50LCAmcmItPmV2ZW50X2xpc3QsIHJiX2VudHJ5KQorCQl3YWtlX3VwX2FsbCgmZXZlbnQtPndhaXRxKTsKKwordW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworfQorCiBzdGF0aWMgdm9pZCByYl9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdV9oZWFkKQogewogCXN0cnVjdCByaW5nX2J1ZmZlciAqcmI7CkBAIC0zNTIxLDkgKzMzOTUsMTkgQEAKIAogc3RhdGljIHZvaWQgcmluZ19idWZmZXJfcHV0KHN0cnVjdCByaW5nX2J1ZmZlciAqcmIpCiB7CisJc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50LCAqbjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCiAJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZyYi0+cmVmY291bnQpKQogCQlyZXR1cm47CiAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcmItPmV2ZW50X2xvY2ssIGZsYWdzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXZlbnQsIG4sICZyYi0+ZXZlbnRfbGlzdCwgcmJfZW50cnkpIHsKKwkJbGlzdF9kZWxfaW5pdCgmZXZlbnQtPnJiX2VudHJ5KTsKKwkJd2FrZV91cF9hbGwoJmV2ZW50LT53YWl0cSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJiLT5ldmVudF9sb2NrLCBmbGFncyk7CisKIAljYWxsX3JjdSgmcmItPnJjdV9oZWFkLCByYl9mcmVlX3JjdSk7CiB9CiAKQEAgLTM1NDYsNiArMzQzMCw3IEBACiAJCWF0b21pY19sb25nX3N1Yigoc2l6ZSA+PiBQQUdFX1NISUZUKSArIDEsICZ1c2VyLT5sb2NrZWRfdm0pOwogCQl2bWEtPnZtX21tLT5waW5uZWRfdm0gLT0gZXZlbnQtPm1tYXBfbG9ja2VkOwogCQlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPnJiLCBOVUxMKTsKKwkJcmluZ19idWZmZXJfZGV0YWNoKGV2ZW50LCByYik7CiAJCW11dGV4X3VubG9jaygmZXZlbnQtPm1tYXBfbXV0ZXgpOwogCiAJCXJpbmdfYnVmZmVyX3B1dChyYik7CkBAIC0zNzAwLDcgKzM1ODUsNyBAQAogCiB2b2lkIHBlcmZfZXZlbnRfd2FrZXVwKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCkKIHsKLQl3YWtlX3VwX2FsbCgmZXZlbnQtPndhaXRxKTsKKwlyaW5nX2J1ZmZlcl93YWtldXAoZXZlbnQpOwogCiAJaWYgKGV2ZW50LT5wZW5kaW5nX2tpbGwpIHsKIAkJa2lsbF9mYXN5bmMoJmV2ZW50LT5mYXN5bmMsIFNJR0lPLCBldmVudC0+cGVuZGluZ19raWxsKTsKQEAgLTQ3MzcsNyArNDYyMiw2IEBACiAJc3RydWN0IGh3X3BlcmZfZXZlbnQgKmh3YyA9ICZldmVudC0+aHc7CiAJaW50IHRocm90dGxlID0gMDsKIAotCWRhdGEtPnBlcmlvZCA9IGV2ZW50LT5ody5sYXN0X3BlcmlvZDsKIAlpZiAoIW92ZXJmbG93KQogCQlvdmVyZmxvdyA9IHBlcmZfc3dldmVudF9zZXRfcGVyaW9kKGV2ZW50KTsKIApAQCAtNDc3MSw2ICs0NjU1LDEyIEBACiAJaWYgKCFpc19zYW1wbGluZ19ldmVudChldmVudCkpCiAJCXJldHVybjsKIAorCWlmICgoZXZlbnQtPmF0dHIuc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9QRVJJT0QpICYmICFldmVudC0+YXR0ci5mcmVxKSB7CisJCWRhdGEtPnBlcmlvZCA9IG5yOworCQlyZXR1cm4gcGVyZl9zd2V2ZW50X292ZXJmbG93KGV2ZW50LCAxLCBkYXRhLCByZWdzKTsKKwl9IGVsc2UKKwkJZGF0YS0+cGVyaW9kID0gZXZlbnQtPmh3Lmxhc3RfcGVyaW9kOworCiAJaWYgKG5yID09IDEgJiYgaHdjLT5zYW1wbGVfcGVyaW9kID09IDEgJiYgIWV2ZW50LT5hdHRyLmZyZXEpCiAJCXJldHVybiBwZXJmX3N3ZXZlbnRfb3ZlcmZsb3coZXZlbnQsIDEsIGRhdGEsIHJlZ3MpOwogCkBAIC01MjgzLDcgKzUxNzMsNyBAQAogCXJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKIAogCWlmIChyZWdzICYmICFwZXJmX2V4Y2x1ZGVfZXZlbnQoZXZlbnQsIHJlZ3MpKSB7Ci0JCWlmICghKGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaWRsZSAmJiBjdXJyZW50LT5waWQgPT0gMCkpCisJCWlmICghKGV2ZW50LT5hdHRyLmV4Y2x1ZGVfaWRsZSAmJiBpc19pZGxlX3Rhc2soY3VycmVudCkpKQogCQkJaWYgKHBlcmZfZXZlbnRfb3ZlcmZsb3coZXZlbnQsICZkYXRhLCByZWdzKSkKIAkJCQlyZXQgPSBIUlRJTUVSX05PUkVTVEFSVDsKIAl9CkBAIC01ODIyLDYgKzU3MTIsOCBAQAogCUlOSVRfTElTVF9IRUFEKCZldmVudC0+Z3JvdXBfZW50cnkpOwogCUlOSVRfTElTVF9IRUFEKCZldmVudC0+ZXZlbnRfZW50cnkpOwogCUlOSVRfTElTVF9IRUFEKCZldmVudC0+c2libGluZ19saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZXZlbnQtPnJiX2VudHJ5KTsKKwogCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmV2ZW50LT53YWl0cSk7CiAJaW5pdF9pcnFfd29yaygmZXZlbnQtPnBlbmRpbmcsIHBlcmZfcGVuZGluZ19ldmVudCk7CiAKQEAgLTU4OTYsNyArNTc4OCw3IEBACiAKIAlpZiAoIWV2ZW50LT5wYXJlbnQpIHsKIAkJaWYgKGV2ZW50LT5hdHRhY2hfc3RhdGUgJiBQRVJGX0FUVEFDSF9UQVNLKQotCQkJanVtcF9sYWJlbF9pbmMoJnBlcmZfc2NoZWRfZXZlbnRzKTsKKwkJCWp1bXBfbGFiZWxfaW5jKCZwZXJmX3NjaGVkX2V2ZW50cy5rZXkpOwogCQlpZiAoZXZlbnQtPmF0dHIubW1hcCB8fCBldmVudC0+YXR0ci5tbWFwX2RhdGEpCiAJCQlhdG9taWNfaW5jKCZucl9tbWFwX2V2ZW50cyk7CiAJCWlmIChldmVudC0+YXR0ci5jb21tKQpAQCAtNjAyOCw2ICs1OTIwLDggQEAKIAogCW9sZF9yYiA9IGV2ZW50LT5yYjsKIAlyY3VfYXNzaWduX3BvaW50ZXIoZXZlbnQtPnJiLCByYik7CisJaWYgKG9sZF9yYikKKwkJcmluZ19idWZmZXJfZGV0YWNoKGV2ZW50LCBvbGRfcmIpOwogCXJldCA9IDA7CiB1bmxvY2s6CiAJbXV0ZXhfdW5sb2NrKCZldmVudC0+bW1hcF9tdXRleCk7CkBAIC02MTMyLDcgKzYwMjYsNyBAQAogCQkgKiAtIHRoYXQgbWF5IG5lZWQgd29yayBvbiBjb250ZXh0IHN3aXRjaAogCQkgKi8KIAkJYXRvbWljX2luYygmcGVyX2NwdShwZXJmX2Nncm91cF9ldmVudHMsIGV2ZW50LT5jcHUpKTsKLQkJanVtcF9sYWJlbF9pbmMoJnBlcmZfc2NoZWRfZXZlbnRzKTsKKwkJanVtcF9sYWJlbF9pbmMoJnBlcmZfc2NoZWRfZXZlbnRzLmtleSk7CiAJfQogCiAJLyoKQEAgLTY5NzgsNiArNjg3Miw5IEBACiAKIAlyZXQgPSBpbml0X2h3X2JyZWFrcG9pbnQoKTsKIAlXQVJOKHJldCwgImh3X2JyZWFrcG9pbnQgaW5pdGlhbGl6YXRpb24gZmFpbGVkIHdpdGg6ICVkIiwgcmV0KTsKKworCS8qIGRvIG5vdCBwYXRjaCBqdW1wIGxhYmVsIG1vcmUgdGhhbiBvbmNlIHBlciBzZWNvbmQgKi8KKwlqdW1wX2xhYmVsX3JhdGVfbGltaXQoJnBlcmZfc2NoZWRfZXZlbnRzLCBIWik7CiB9CiAKIHN0YXRpYyBpbnQgX19pbml0IHBlcmZfZXZlbnRfc3lzZnNfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEva2VybmVsL2V2ZW50cy9pbnRlcm5hbC5oIGIva2VybmVsL2V2ZW50cy9pbnRlcm5hbC5oCmluZGV4IDA5MDk3ZGQuLmIwYjEwN2YgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ldmVudHMvaW50ZXJuYWwuaAorKysgYi9rZXJuZWwvZXZlbnRzL2ludGVybmFsLmgKQEAgLTEsNiArMSwxMCBAQAogI2lmbmRlZiBfS0VSTkVMX0VWRU5UU19JTlRFUk5BTF9ICiAjZGVmaW5lIF9LRVJORUxfRVZFTlRTX0lOVEVSTkFMX0gKIAorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKworLyogQnVmZmVyIGhhbmRsaW5nICovCisKICNkZWZpbmUgUklOR19CVUZGRVJfV1JJVEFCTEUJCTB4MDEKIAogc3RydWN0IHJpbmdfYnVmZmVyIHsKQEAgLTIyLDYgKzI2LDkgQEAKIAlsb2NhbF90CQkJCWxvc3Q7CQkvKiBuciByZWNvcmRzIGxvc3QgICAqLwogCiAJbG9uZwkJCQl3YXRlcm1hcms7CS8qIHdha2V1cCB3YXRlcm1hcmsgICovCisJLyogcG9sbCBjcmFwICovCisJc3BpbmxvY2tfdAkJCWV2ZW50X2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZAkJZXZlbnRfbGlzdDsKIAogCXN0cnVjdCBwZXJmX2V2ZW50X21tYXBfcGFnZQkqdXNlcl9wYWdlOwogCXZvaWQJCQkJKmRhdGFfcGFnZXNbMF07CkBAIC02NCw3ICs3MSw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHVuc2lnbmVkIGxvbmcgcGVyZl9kYXRhX3NpemUoc3RydWN0IHJpbmdfYnVmZmVyICpyYikKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwZXJmX2RhdGFfc2l6ZShzdHJ1Y3QgcmluZ19idWZmZXIgKnJiKQogewogCXJldHVybiByYi0+bnJfcGFnZXMgPDwgKFBBR0VfU0hJRlQgKyBwYWdlX29yZGVyKHJiKSk7CiB9CkBAIC05Myw0ICsxMDAsMzcgQEAKIAl9IHdoaWxlIChsZW4pOwogfQogCisvKiBDYWxsY2hhaW4gaGFuZGxpbmcgKi8KK2V4dGVybiBzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKnBlcmZfY2FsbGNoYWluKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKK2V4dGVybiBpbnQgZ2V0X2NhbGxjaGFpbl9idWZmZXJzKHZvaWQpOworZXh0ZXJuIHZvaWQgcHV0X2NhbGxjaGFpbl9idWZmZXJzKHZvaWQpOworCitzdGF0aWMgaW5saW5lIGludCBnZXRfcmVjdXJzaW9uX2NvbnRleHQoaW50ICpyZWN1cnNpb24pCit7CisJaW50IHJjdHg7CisKKwlpZiAoaW5fbm1pKCkpCisJCXJjdHggPSAzOworCWVsc2UgaWYgKGluX2lycSgpKQorCQlyY3R4ID0gMjsKKwllbHNlIGlmIChpbl9zb2Z0aXJxKCkpCisJCXJjdHggPSAxOworCWVsc2UKKwkJcmN0eCA9IDA7CisKKwlpZiAocmVjdXJzaW9uW3JjdHhdKQorCQlyZXR1cm4gLTE7CisKKwlyZWN1cnNpb25bcmN0eF0rKzsKKwliYXJyaWVyKCk7CisKKwlyZXR1cm4gcmN0eDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHB1dF9yZWN1cnNpb25fY29udGV4dChpbnQgKnJlY3Vyc2lvbiwgaW50IHJjdHgpCit7CisJYmFycmllcigpOworCXJlY3Vyc2lvbltyY3R4XS0tOworfQorCiAjZW5kaWYgLyogX0tFUk5FTF9FVkVOVFNfSU5URVJOQUxfSCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL2V2ZW50cy9yaW5nX2J1ZmZlci5jIGIva2VybmVsL2V2ZW50cy9yaW5nX2J1ZmZlci5jCmluZGV4IGEyYTI5MjAuLjdmMzAxMWMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ldmVudHMvcmluZ19idWZmZXIuYworKysgYi9rZXJuZWwvZXZlbnRzL3JpbmdfYnVmZmVyLmMKQEAgLTIwOSw2ICsyMDksOSBAQAogCQlyYi0+d3JpdGFibGUgPSAxOwogCiAJYXRvbWljX3NldCgmcmItPnJlZmNvdW50LCAxKTsKKworCUlOSVRfTElTVF9IRUFEKCZyYi0+ZXZlbnRfbGlzdCk7CisJc3Bpbl9sb2NrX2luaXQoJnJiLT5ldmVudF9sb2NrKTsKIH0KIAogI2lmbmRlZiBDT05GSUdfUEVSRl9VU0VfVk1BTExPQwpkaWZmIC0tZ2l0IGEva2VybmVsL2V4aXQuYyBiL2tlcm5lbC9leGl0LmMKaW5kZXggZDBiN2Q5OC4uZDU3OWE0NSAxMDA2NDQKLS0tIGEva2VybmVsL2V4aXQuYworKysgYi9rZXJuZWwvZXhpdC5jCkBAIC0xMjEsOSArMTIxLDkgQEAKIAkJICogV2Ugd29uJ3QgZXZlciBnZXQgaGVyZSBmb3IgdGhlIGdyb3VwIGxlYWRlciwgc2luY2UgaXQKIAkJICogd2lsbCBoYXZlIGJlZW4gdGhlIGxhc3QgcmVmZXJlbmNlIG9uIHRoZSBzaWduYWxfc3RydWN0LgogCQkgKi8KLQkJc2lnLT51dGltZSA9IGNwdXRpbWVfYWRkKHNpZy0+dXRpbWUsIHRzay0+dXRpbWUpOwotCQlzaWctPnN0aW1lID0gY3B1dGltZV9hZGQoc2lnLT5zdGltZSwgdHNrLT5zdGltZSk7Ci0JCXNpZy0+Z3RpbWUgPSBjcHV0aW1lX2FkZChzaWctPmd0aW1lLCB0c2stPmd0aW1lKTsKKwkJc2lnLT51dGltZSArPSB0c2stPnV0aW1lOworCQlzaWctPnN0aW1lICs9IHRzay0+c3RpbWU7CisJCXNpZy0+Z3RpbWUgKz0gdHNrLT5ndGltZTsKIAkJc2lnLT5taW5fZmx0ICs9IHRzay0+bWluX2ZsdDsKIAkJc2lnLT5tYWpfZmx0ICs9IHRzay0+bWFqX2ZsdDsKIAkJc2lnLT5udmNzdyArPSB0c2stPm52Y3N3OwpAQCAtMTI1NSwxOSArMTI1NSw5IEBACiAJCXNwaW5fbG9ja19pcnEoJnAtPnJlYWxfcGFyZW50LT5zaWdoYW5kLT5zaWdsb2NrKTsKIAkJcHNpZyA9IHAtPnJlYWxfcGFyZW50LT5zaWduYWw7CiAJCXNpZyA9IHAtPnNpZ25hbDsKLQkJcHNpZy0+Y3V0aW1lID0KLQkJCWNwdXRpbWVfYWRkKHBzaWctPmN1dGltZSwKLQkJCWNwdXRpbWVfYWRkKHRndXRpbWUsCi0JCQkJICAgIHNpZy0+Y3V0aW1lKSk7Ci0JCXBzaWctPmNzdGltZSA9Ci0JCQljcHV0aW1lX2FkZChwc2lnLT5jc3RpbWUsCi0JCQljcHV0aW1lX2FkZCh0Z3N0aW1lLAotCQkJCSAgICBzaWctPmNzdGltZSkpOwotCQlwc2lnLT5jZ3RpbWUgPQotCQkJY3B1dGltZV9hZGQocHNpZy0+Y2d0aW1lLAotCQkJY3B1dGltZV9hZGQocC0+Z3RpbWUsCi0JCQljcHV0aW1lX2FkZChzaWctPmd0aW1lLAotCQkJCSAgICBzaWctPmNndGltZSkpKTsKKwkJcHNpZy0+Y3V0aW1lICs9IHRndXRpbWUgKyBzaWctPmN1dGltZTsKKwkJcHNpZy0+Y3N0aW1lICs9IHRnc3RpbWUgKyBzaWctPmNzdGltZTsKKwkJcHNpZy0+Y2d0aW1lICs9IHAtPmd0aW1lICsgc2lnLT5ndGltZSArIHNpZy0+Y2d0aW1lOwogCQlwc2lnLT5jbWluX2ZsdCArPQogCQkJcC0+bWluX2ZsdCArIHNpZy0+bWluX2ZsdCArIHNpZy0+Y21pbl9mbHQ7CiAJCXBzaWctPmNtYWpfZmx0ICs9CkBAIC0xNTQwLDggKzE1MzAsMTUgQEAKIAl9CiAKIAkvKiBkZWFkIGJvZHkgZG9lc24ndCBoYXZlIG11Y2ggdG8gY29udHJpYnV0ZSAqLwotCWlmIChwLT5leGl0X3N0YXRlID09IEVYSVRfREVBRCkKKwlpZiAodW5saWtlbHkocC0+ZXhpdF9zdGF0ZSA9PSBFWElUX0RFQUQpKSB7CisJCS8qCisJCSAqIEJ1dCBkbyBub3QgaWdub3JlIHRoaXMgdGFzayB1bnRpbCB0aGUgdHJhY2VyIGRvZXMKKwkJICogd2FpdF90YXNrX3pvbWJpZSgpLT5kb19ub3RpZnlfcGFyZW50KCkuCisJCSAqLworCQlpZiAobGlrZWx5KCFwdHJhY2UpICYmIHVubGlrZWx5KHB0cmFjZV9yZXBhcmVudGVkKHApKSkKKwkJCXdvLT5ub3Rhc2tfZXJyb3IgPSAwOwogCQlyZXR1cm4gMDsKKwl9CiAKIAkvKiBzbGF5IHpvbWJpZT8gKi8KIAlpZiAocC0+ZXhpdF9zdGF0ZSA9PSBFWElUX1pPTUJJRSkgewpkaWZmIC0tZ2l0IGEva2VybmVsL2ZvcmsuYyBiL2tlcm5lbC9mb3JrLmMKaW5kZXggZGE0YTZhMS4uYjA1OGM1OCAxMDA2NDQKLS0tIGEva2VybmVsL2ZvcmsuYworKysgYi9rZXJuZWwvZm9yay5jCkBAIC0xMDIzLDggKzEwMjMsOCBAQAogICovCiBzdGF0aWMgdm9pZCBwb3NpeF9jcHVfdGltZXJzX2luaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCiB7Ci0JdHNrLT5jcHV0aW1lX2V4cGlyZXMucHJvZl9leHAgPSBjcHV0aW1lX3plcm87Ci0JdHNrLT5jcHV0aW1lX2V4cGlyZXMudmlydF9leHAgPSBjcHV0aW1lX3plcm87CisJdHNrLT5jcHV0aW1lX2V4cGlyZXMucHJvZl9leHAgPSAwOworCXRzay0+Y3B1dGltZV9leHBpcmVzLnZpcnRfZXhwID0gMDsKIAl0c2stPmNwdXRpbWVfZXhwaXJlcy5zY2hlZF9leHAgPSAwOwogCUlOSVRfTElTVF9IRUFEKCZ0c2stPmNwdV90aW1lcnNbMF0pOwogCUlOSVRfTElTVF9IRUFEKCZ0c2stPmNwdV90aW1lcnNbMV0pOwpAQCAtMTEzMiwxNCArMTEzMiwxMCBAQAogCiAJaW5pdF9zaWdwZW5kaW5nKCZwLT5wZW5kaW5nKTsKIAotCXAtPnV0aW1lID0gY3B1dGltZV96ZXJvOwotCXAtPnN0aW1lID0gY3B1dGltZV96ZXJvOwotCXAtPmd0aW1lID0gY3B1dGltZV96ZXJvOwotCXAtPnV0aW1lc2NhbGVkID0gY3B1dGltZV96ZXJvOwotCXAtPnN0aW1lc2NhbGVkID0gY3B1dGltZV96ZXJvOworCXAtPnV0aW1lID0gcC0+c3RpbWUgPSBwLT5ndGltZSA9IDA7CisJcC0+dXRpbWVzY2FsZWQgPSBwLT5zdGltZXNjYWxlZCA9IDA7CiAjaWZuZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCi0JcC0+cHJldl91dGltZSA9IGNwdXRpbWVfemVybzsKLQlwLT5wcmV2X3N0aW1lID0gY3B1dGltZV96ZXJvOworCXAtPnByZXZfdXRpbWUgPSBwLT5wcmV2X3N0aW1lID0gMDsKICNlbmRpZgogI2lmIGRlZmluZWQoU1BMSVRfUlNTX0NPVU5USU5HKQogCW1lbXNldCgmcC0+cnNzX3N0YXQsIDAsIHNpemVvZihwLT5yc3Nfc3RhdCkpOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCBlYTg3ZjRkLi4xNjE0YmUyIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMzE0LDE3ICszMTQsMjkgQEAKICNlbmRpZgogCiAJbG9ja19wYWdlKHBhZ2VfaGVhZCk7CisKKwkvKgorCSAqIElmIHBhZ2VfaGVhZC0+bWFwcGluZyBpcyBOVUxMLCB0aGVuIGl0IGNhbm5vdCBiZSBhIFBhZ2VBbm9uCisJICogcGFnZTsgYnV0IGl0IG1pZ2h0IGJlIHRoZSBaRVJPX1BBR0Ugb3IgaW4gdGhlIGdhdGUgYXJlYSBvcgorCSAqIGluIGEgc3BlY2lhbCBtYXBwaW5nIChhbGwgY2FzZXMgd2hpY2ggd2UgYXJlIGhhcHB5IHRvIGZhaWwpOworCSAqIG9yIGl0IG1heSBoYXZlIGJlZW4gYSBnb29kIGZpbGUgcGFnZSB3aGVuIGdldF91c2VyX3BhZ2VzX2Zhc3QKKwkgKiBmb3VuZCBpdCwgYnV0IHRydW5jYXRlZCBvciBob2xlcHVuY2hlZCBvciBzdWJqZWN0ZWQgdG8KKwkgKiBpbnZhbGlkYXRlX2NvbXBsZXRlX3BhZ2UyIGJlZm9yZSB3ZSBnb3QgdGhlIHBhZ2UgbG9jayAoYWxzbworCSAqIGNhc2VzIHdoaWNoIHdlIGFyZSBoYXBweSB0byBmYWlsKS4gIEFuZCB3ZSBob2xkIGEgcmVmZXJlbmNlLAorCSAqIHNvIHJlZmNvdW50IGNhcmUgaW4gaW52YWxpZGF0ZV9jb21wbGV0ZV9wYWdlJ3MgcmVtb3ZlX21hcHBpbmcKKwkgKiBwcmV2ZW50cyBkcm9wX2NhY2hlcyBmcm9tIHNldHRpbmcgbWFwcGluZyB0byBOVUxMIGJlbmVhdGggdXMuCisJICoKKwkgKiBUaGUgY2FzZSB3ZSBkbyBoYXZlIHRvIGd1YXJkIGFnYWluc3QgaXMgd2hlbiBtZW1vcnkgcHJlc3N1cmUgbWFkZQorCSAqIHNobWVtX3dyaXRlcGFnZSBtb3ZlIGl0IGZyb20gZmlsZWNhY2hlIHRvIHN3YXBjYWNoZSBiZW5lYXRoIHVzOgorCSAqIGFuIHVubGlrZWx5IHJhY2UsIGJ1dCB3ZSBkbyBuZWVkIHRvIHJldHJ5IGZvciBwYWdlX2hlYWQtPm1hcHBpbmcuCisJICovCiAJaWYgKCFwYWdlX2hlYWQtPm1hcHBpbmcpIHsKKwkJaW50IHNobWVtX3N3aXp6bGVkID0gUGFnZVN3YXBDYWNoZShwYWdlX2hlYWQpOwogCQl1bmxvY2tfcGFnZShwYWdlX2hlYWQpOwogCQlwdXRfcGFnZShwYWdlX2hlYWQpOwotCQkvKgotCQkqIFpFUk9fUEFHRSBwYWdlcyBkb24ndCBoYXZlIGEgbWFwcGluZy4gQXZvaWQgYSBidXN5IGxvb3AKLQkJKiB0cnlpbmcgdG8gZmluZCBvbmUuIFJXIG1hcHBpbmcgd291bGQgaGF2ZSBDT1cnZCAoYW5kIHRodXMKLQkJKiBoYXZlIGEgbWFwcGluZykgc28gdGhpcyBwYWdlIGlzIFJPIGFuZCB3b24ndCBldmVyIGNoYW5nZS4KLQkJKi8KLQkJaWYgKChwYWdlX2hlYWQgPT0gWkVST19QQUdFKGFkZHJlc3MpKSkKLQkJCXJldHVybiAtRUZBVUxUOwotCQlnb3RvIGFnYWluOworCQlpZiAoc2htZW1fc3dpenpsZWQpCisJCQlnb3RvIGFnYWluOworCQlyZXR1cm4gLUVGQVVMVDsKIAl9CiAKIAkvKgpkaWZmIC0tZ2l0IGEva2VybmVsL2h1bmdfdGFzay5jIGIva2VybmVsL2h1bmdfdGFzay5jCmluZGV4IDhiMTc0OGQuLjJlNDhlYzAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9odW5nX3Rhc2suYworKysgYi9rZXJuZWwvaHVuZ190YXNrLmMKQEAgLTc0LDExICs3NCwxNyBAQAogCiAJLyoKIAkgKiBFbnN1cmUgdGhlIHRhc2sgaXMgbm90IGZyb3plbi4KLQkgKiBBbHNvLCB3aGVuIGEgZnJlc2hseSBjcmVhdGVkIHRhc2sgaXMgc2NoZWR1bGVkIG9uY2UsIGNoYW5nZXMKLQkgKiBpdHMgc3RhdGUgdG8gVEFTS19VTklOVEVSUlVQVElCTEUgd2l0aG91dCBoYXZpbmcgZXZlciBiZWVuCi0JICogc3dpdGNoZWQgb3V0IG9uY2UsIGl0IG11c24ndCBiZSBjaGVja2VkLgorCSAqIEFsc28sIHNraXAgdmZvcmsgYW5kIGFueSBvdGhlciB1c2VyIHByb2Nlc3MgdGhhdCBmcmVlemVyIHNob3VsZCBza2lwLgogCSAqLwotCWlmICh1bmxpa2VseSh0LT5mbGFncyAmIFBGX0ZST1pFTiB8fCAhc3dpdGNoX2NvdW50KSkKKwlpZiAodW5saWtlbHkodC0+ZmxhZ3MgJiAoUEZfRlJPWkVOIHwgUEZfRlJFRVpFUl9TS0lQKSkpCisJICAgIHJldHVybjsKKworCS8qCisJICogV2hlbiBhIGZyZXNobHkgY3JlYXRlZCB0YXNrIGlzIHNjaGVkdWxlZCBvbmNlLCBjaGFuZ2VzIGl0cyBzdGF0ZSB0bworCSAqIFRBU0tfVU5JTlRFUlJVUFRJQkxFIHdpdGhvdXQgaGF2aW5nIGV2ZXIgYmVlbiBzd2l0Y2hlZCBvdXQgb25jZSwgaXQKKwkgKiBtdXNuJ3QgYmUgY2hlY2tlZC4KKwkgKi8KKwlpZiAodW5saWtlbHkoIXN3aXRjaF9jb3VudCkpCiAJCXJldHVybjsKIAogCWlmIChzd2l0Y2hfY291bnQgIT0gdC0+bGFzdF9zd2l0Y2hfY291bnQpIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvbWFuYWdlLmMgYi9rZXJuZWwvaXJxL21hbmFnZS5jCmluZGV4IDBlMmIxNzkuLjFkYTk5OWY1IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21hbmFnZS5jCisrKyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKQEAgLTYyMyw4ICs2MjMsOSBAQAogCiBzdGF0aWMgaW50IGlycV93YWl0X2Zvcl9pbnRlcnJ1cHQoc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uKQogeworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKIAl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewotCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSVJRVEZfUlVOVEhSRUFELAogCQkJCSAgICAgICAmYWN0aW9uLT50aHJlYWRfZmxhZ3MpKSB7CkBAIC02MzIsNyArNjMzLDkgQEAKIAkJCXJldHVybiAwOwogCQl9CiAJCXNjaGVkdWxlKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CiAJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAlyZXR1cm4gLTE7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9pdGltZXIuYyBiL2tlcm5lbC9pdGltZXIuYwppbmRleCBkODAyODgzLi4yMjAwMGMzIDEwMDY0NAotLS0gYS9rZXJuZWwvaXRpbWVyLmMKKysrIGIva2VybmVsL2l0aW1lci5jCkBAIC01MiwyMiArNTIsMjIgQEAKIAogCWN2YWwgPSBpdC0+ZXhwaXJlczsKIAljaW50ZXJ2YWwgPSBpdC0+aW5jcjsKLQlpZiAoIWNwdXRpbWVfZXEoY3ZhbCwgY3B1dGltZV96ZXJvKSkgeworCWlmIChjdmFsKSB7CiAJCXN0cnVjdCB0YXNrX2NwdXRpbWUgY3B1dGltZTsKIAkJY3B1dGltZV90IHQ7CiAKIAkJdGhyZWFkX2dyb3VwX2NwdXRpbWVyKHRzaywgJmNwdXRpbWUpOwogCQlpZiAoY2xvY2tfaWQgPT0gQ1BVQ0xPQ0tfUFJPRikKLQkJCXQgPSBjcHV0aW1lX2FkZChjcHV0aW1lLnV0aW1lLCBjcHV0aW1lLnN0aW1lKTsKKwkJCXQgPSBjcHV0aW1lLnV0aW1lICsgY3B1dGltZS5zdGltZTsKIAkJZWxzZQogCQkJLyogQ1BVQ0xPQ0tfVklSVCAqLwogCQkJdCA9IGNwdXRpbWUudXRpbWU7CiAKLQkJaWYgKGNwdXRpbWVfbGUoY3ZhbCwgdCkpCisJCWlmIChjdmFsIDwgdCkKIAkJCS8qIGFib3V0IHRvIGZpcmUgKi8KIAkJCWN2YWwgPSBjcHV0aW1lX29uZV9qaWZmeTsKIAkJZWxzZQotCQkJY3ZhbCA9IGNwdXRpbWVfc3ViKGN2YWwsIHQpOworCQkJY3ZhbCA9IGN2YWwgLSB0OwogCX0KIAogCXNwaW5fdW5sb2NrX2lycSgmdHNrLT5zaWdoYW5kLT5zaWdsb2NrKTsKQEAgLTE2MSwxMCArMTYxLDkgQEAKIAogCWN2YWwgPSBpdC0+ZXhwaXJlczsKIAljaW50ZXJ2YWwgPSBpdC0+aW5jcjsKLQlpZiAoIWNwdXRpbWVfZXEoY3ZhbCwgY3B1dGltZV96ZXJvKSB8fAotCSAgICAhY3B1dGltZV9lcShudmFsLCBjcHV0aW1lX3plcm8pKSB7Ci0JCWlmIChjcHV0aW1lX2d0KG52YWwsIGNwdXRpbWVfemVybykpCi0JCQludmFsID0gY3B1dGltZV9hZGQobnZhbCwgY3B1dGltZV9vbmVfamlmZnkpOworCWlmIChjdmFsIHx8IG52YWwpIHsKKwkJaWYgKG52YWwgPiAwKQorCQkJbnZhbCArPSBjcHV0aW1lX29uZV9qaWZmeTsKIAkJc2V0X3Byb2Nlc3NfY3B1X3RpbWVyKHRzaywgY2xvY2tfaWQsICZudmFsLCAmY3ZhbCk7CiAJfQogCWl0LT5leHBpcmVzID0gbnZhbDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9qdW1wX2xhYmVsLmMgYi9rZXJuZWwvanVtcF9sYWJlbC5jCmluZGV4IGJiZGZlMmEuLjMwYzNjNzcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9qdW1wX2xhYmVsLmMKKysrIGIva2VybmVsL2p1bXBfbGFiZWwuYwpAQCAtNjYsMjAgKzY2LDUyIEBACiAJCXJldHVybjsKIAogCWp1bXBfbGFiZWxfbG9jaygpOwotCWlmIChhdG9taWNfYWRkX3JldHVybigxLCAma2V5LT5lbmFibGVkKSA9PSAxKQorCWlmIChhdG9taWNfcmVhZCgma2V5LT5lbmFibGVkKSA9PSAwKQogCQlqdW1wX2xhYmVsX3VwZGF0ZShrZXksIEpVTVBfTEFCRUxfRU5BQkxFKTsKKwlhdG9taWNfaW5jKCZrZXktPmVuYWJsZWQpOwogCWp1bXBfbGFiZWxfdW5sb2NrKCk7CiB9CiAKLXZvaWQganVtcF9sYWJlbF9kZWMoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICprZXkpCitzdGF0aWMgdm9pZCBfX2p1bXBfbGFiZWxfZGVjKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5LAorCQl1bnNpZ25lZCBsb25nIHJhdGVfbGltaXQsIHN0cnVjdCBkZWxheWVkX3dvcmsgKndvcmspCiB7CiAJaWYgKCFhdG9taWNfZGVjX2FuZF9tdXRleF9sb2NrKCZrZXktPmVuYWJsZWQsICZqdW1wX2xhYmVsX211dGV4KSkKIAkJcmV0dXJuOwogCi0JanVtcF9sYWJlbF91cGRhdGUoa2V5LCBKVU1QX0xBQkVMX0RJU0FCTEUpOworCWlmIChyYXRlX2xpbWl0KSB7CisJCWF0b21pY19pbmMoJmtleS0+ZW5hYmxlZCk7CisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yayh3b3JrLCByYXRlX2xpbWl0KTsKKwl9IGVsc2UKKwkJanVtcF9sYWJlbF91cGRhdGUoa2V5LCBKVU1QX0xBQkVMX0RJU0FCTEUpOworCiAJanVtcF9sYWJlbF91bmxvY2soKTsKIH0KIAorc3RhdGljIHZvaWQganVtcF9sYWJlbF91cGRhdGVfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGp1bXBfbGFiZWxfa2V5X2RlZmVycmVkICprZXkgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IGp1bXBfbGFiZWxfa2V5X2RlZmVycmVkLCB3b3JrLndvcmspOworCV9fanVtcF9sYWJlbF9kZWMoJmtleS0+a2V5LCAwLCBOVUxMKTsKK30KKwordm9pZCBqdW1wX2xhYmVsX2RlYyhzdHJ1Y3QganVtcF9sYWJlbF9rZXkgKmtleSkKK3sKKwlfX2p1bXBfbGFiZWxfZGVjKGtleSwgMCwgTlVMTCk7Cit9CisKK3ZvaWQganVtcF9sYWJlbF9kZWNfZGVmZXJyZWQoc3RydWN0IGp1bXBfbGFiZWxfa2V5X2RlZmVycmVkICprZXkpCit7CisJX19qdW1wX2xhYmVsX2RlYygma2V5LT5rZXksIGtleS0+dGltZW91dCwgJmtleS0+d29yayk7Cit9CisKKwordm9pZCBqdW1wX2xhYmVsX3JhdGVfbGltaXQoc3RydWN0IGp1bXBfbGFiZWxfa2V5X2RlZmVycmVkICprZXksCisJCXVuc2lnbmVkIGxvbmcgcmwpCit7CisJa2V5LT50aW1lb3V0ID0gcmw7CisJSU5JVF9ERUxBWUVEX1dPUksoJmtleS0+d29yaywganVtcF9sYWJlbF91cGRhdGVfdGltZW91dCk7Cit9CisKIHN0YXRpYyBpbnQgYWRkcl9jb25mbGljdChzdHJ1Y3QganVtcF9lbnRyeSAqZW50cnksIHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpCiB7CiAJaWYgKGVudHJ5LT5jb2RlIDw9ICh1bnNpZ25lZCBsb25nKWVuZCAmJgpAQCAtMTEwLDcgKzE0Miw3IEBACiAgKiBydW5uaW5nIGNvZGUgY2FuIG92ZXJyaWRlIHRoaXMgdG8gbWFrZSB0aGUgbm9uLWxpdmUgdXBkYXRlIGNhc2UKICAqIGNoZWFwZXIuCiAgKi8KLXZvaWQgX193ZWFrIGFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm1fc3RhdGljKHN0cnVjdCBqdW1wX2VudHJ5ICplbnRyeSwKK3ZvaWQgX193ZWFrIF9faW5pdF9vcl9tb2R1bGUgYXJjaF9qdW1wX2xhYmVsX3RyYW5zZm9ybV9zdGF0aWMoc3RydWN0IGp1bXBfZW50cnkgKmVudHJ5LAogCQkJCQkgICAgZW51bSBqdW1wX2xhYmVsX3R5cGUgdHlwZSkKIHsKIAlhcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtKGVudHJ5LCB0eXBlKTsJCkBAIC0yMTYsOCArMjQ4LDEzIEBACiAJaWYgKGl0ZXJfc3RhcnQgPT0gaXRlcl9zdG9wKQogCQlyZXR1cm47CiAKLQlmb3IgKGl0ZXIgPSBpdGVyX3N0YXJ0OyBpdGVyIDwgaXRlcl9zdG9wOyBpdGVyKyspCi0JCWFyY2hfanVtcF9sYWJlbF90cmFuc2Zvcm1fc3RhdGljKGl0ZXIsIEpVTVBfTEFCRUxfRElTQUJMRSk7CisJZm9yIChpdGVyID0gaXRlcl9zdGFydDsgaXRlciA8IGl0ZXJfc3RvcDsgaXRlcisrKSB7CisJCXN0cnVjdCBqdW1wX2xhYmVsX2tleSAqaXRlcms7CisKKwkJaXRlcmsgPSAoc3RydWN0IGp1bXBfbGFiZWxfa2V5ICopKHVuc2lnbmVkIGxvbmcpaXRlci0+a2V5OworCQlhcmNoX2p1bXBfbGFiZWxfdHJhbnNmb3JtX3N0YXRpYyhpdGVyLCBqdW1wX2xhYmVsX2VuYWJsZWQoaXRlcmspID8KKwkJCQlKVU1QX0xBQkVMX0VOQUJMRSA6IEpVTVBfTEFCRUxfRElTQUJMRSk7CisJfQogfQogCiBzdGF0aWMgaW50IGp1bXBfbGFiZWxfYWRkX21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QpCkBAIC0yNTcsOCArMjk0LDcgQEAKIAkJa2V5LT5uZXh0ID0gamxtOwogCiAJCWlmIChqdW1wX2xhYmVsX2VuYWJsZWQoa2V5KSkKLQkJCV9fanVtcF9sYWJlbF91cGRhdGUoa2V5LCBpdGVyLCBpdGVyX3N0b3AsCi0JCQkJCSAgICBKVU1QX0xBQkVMX0VOQUJMRSk7CisJCQlfX2p1bXBfbGFiZWxfdXBkYXRlKGtleSwgaXRlciwgaXRlcl9zdG9wLCBKVU1QX0xBQkVMX0VOQUJMRSk7CiAJfQogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9rZXJuZWwvbG9ja2RlcC5jIGIva2VybmVsL2xvY2tkZXAuYwppbmRleCBlNjk0MzRiLi44ODg5ZjdkIDEwMDY0NAotLS0gYS9rZXJuZWwvbG9ja2RlcC5jCisrKyBiL2tlcm5lbC9sb2NrZGVwLmMKQEAgLTQ0LDYgKzQ0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdHJpbmdpZnkuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9nZnAuaD4KKyNpbmNsdWRlIDxsaW51eC9rbWVtY2hlY2suaD4KIAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCkBAIC00MzAsNiArNDMxLDcgQEAKICAqIGFib3V0IGl0IGxhdGVyIG9uLCBpbiBsb2NrZGVwX2luZm8oKS4KICAqLwogc3RhdGljIGludCBsb2NrZGVwX2luaXRfZXJyb3I7CitzdGF0aWMgY29uc3QgY2hhciAqbG9ja19pbml0X2Vycm9yOwogc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9ja2RlcF9pbml0X3RyYWNlX2RhdGFbMjBdOwogc3RhdGljIHN0cnVjdCBzdGFja190cmFjZSBsb2NrZGVwX2luaXRfdHJhY2UgPSB7CiAJLm1heF9lbnRyaWVzID0gQVJSQVlfU0laRShsb2NrZGVwX2luaXRfdHJhY2VfZGF0YSksCkBAIC00OTgsMzYgKzUwMCwzMiBAQAogCXVzYWdlW2ldID0gJ1wwJzsKIH0KIAotc3RhdGljIGludCBfX3ByaW50X2xvY2tfbmFtZShzdHJ1Y3QgbG9ja19jbGFzcyAqY2xhc3MpCitzdGF0aWMgdm9pZCBfX3ByaW50X2xvY2tfbmFtZShzdHJ1Y3QgbG9ja19jbGFzcyAqY2xhc3MpCiB7CiAJY2hhciBzdHJbS1NZTV9OQU1FX0xFTl07CiAJY29uc3QgY2hhciAqbmFtZTsKIAogCW5hbWUgPSBjbGFzcy0+bmFtZTsKLQlpZiAoIW5hbWUpCi0JCW5hbWUgPSBfX2dldF9rZXlfbmFtZShjbGFzcy0+a2V5LCBzdHIpOwotCi0JcmV0dXJuIHByaW50aygiJXMiLCBuYW1lKTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfbG9ja19uYW1lKHN0cnVjdCBsb2NrX2NsYXNzICpjbGFzcykKLXsKLQljaGFyIHN0cltLU1lNX05BTUVfTEVOXSwgdXNhZ2VbTE9DS19VU0FHRV9DSEFSU107Ci0JY29uc3QgY2hhciAqbmFtZTsKLQotCWdldF91c2FnZV9jaGFycyhjbGFzcywgdXNhZ2UpOwotCi0JbmFtZSA9IGNsYXNzLT5uYW1lOwogCWlmICghbmFtZSkgewogCQluYW1lID0gX19nZXRfa2V5X25hbWUoY2xhc3MtPmtleSwgc3RyKTsKLQkJcHJpbnRrKCIgKCVzIiwgbmFtZSk7CisJCXByaW50aygiJXMiLCBuYW1lKTsKIAl9IGVsc2UgewotCQlwcmludGsoIiAoJXMiLCBuYW1lKTsKKwkJcHJpbnRrKCIlcyIsIG5hbWUpOwogCQlpZiAoY2xhc3MtPm5hbWVfdmVyc2lvbiA+IDEpCiAJCQlwcmludGsoIiMlZCIsIGNsYXNzLT5uYW1lX3ZlcnNpb24pOwogCQlpZiAoY2xhc3MtPnN1YmNsYXNzKQogCQkJcHJpbnRrKCIvJWQiLCBjbGFzcy0+c3ViY2xhc3MpOwogCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfbG9ja19uYW1lKHN0cnVjdCBsb2NrX2NsYXNzICpjbGFzcykKK3sKKwljaGFyIHVzYWdlW0xPQ0tfVVNBR0VfQ0hBUlNdOworCisJZ2V0X3VzYWdlX2NoYXJzKGNsYXNzLCB1c2FnZSk7CisKKwlwcmludGsoIiAoIik7CisJX19wcmludF9sb2NrX25hbWUoY2xhc3MpOwogCXByaW50aygiKXslc30iLCB1c2FnZSk7CiB9CiAKQEAgLTU2NywxMSArNTY1LDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBwcmludF9rZXJuZWxfdmVyc2lvbih2b2lkKQorc3RhdGljIHZvaWQgcHJpbnRfa2VybmVsX2lkZW50KHZvaWQpCiB7Ci0JcHJpbnRrKCIlcyAlLipzXG4iLCBpbml0X3V0c25hbWUoKS0+cmVsZWFzZSwKKwlwcmludGsoIiVzICUuKnMgJXNcbiIsIGluaXRfdXRzbmFtZSgpLT5yZWxlYXNlLAogCQkoaW50KXN0cmNzcG4oaW5pdF91dHNuYW1lKCktPnZlcnNpb24sICIgIiksCi0JCWluaXRfdXRzbmFtZSgpLT52ZXJzaW9uKTsKKwkJaW5pdF91dHNuYW1lKCktPnZlcnNpb24sCisJCXByaW50X3RhaW50ZWQoKSk7CiB9CiAKIHN0YXRpYyBpbnQgdmVyeV92ZXJib3NlKHN0cnVjdCBsb2NrX2NsYXNzICpjbGFzcykKQEAgLTY1NSw2ICs2NTQsNyBAQAogCWlmICh1bmxpa2VseSghbG9ja2RlcF9pbml0aWFsaXplZCkpIHsKIAkJbG9ja2RlcF9pbml0KCk7CiAJCWxvY2tkZXBfaW5pdF9lcnJvciA9IDE7CisJCWxvY2tfaW5pdF9lcnJvciA9IGxvY2stPm5hbWU7CiAJCXNhdmVfc3RhY2tfdHJhY2UoJmxvY2tkZXBfaW5pdF90cmFjZSk7CiAJfQogI2VuZGlmCkBAIC03MjIsNyArNzIyLDcgQEAKIAogCWNsYXNzID0gbG9va191cF9sb2NrX2NsYXNzKGxvY2ssIHN1YmNsYXNzKTsKIAlpZiAobGlrZWx5KGNsYXNzKSkKLQkJcmV0dXJuIGNsYXNzOworCQlnb3RvIG91dF9zZXRfY2xhc3NfY2FjaGU7CiAKIAkvKgogCSAqIERlYnVnLWNoZWNrOiBhbGwga2V5cyBtdXN0IGJlIHBlcnNpc3RlbnQhCkBAIC04MDcsNiArODA3LDcgQEAKIAlncmFwaF91bmxvY2soKTsKIAlyYXdfbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCitvdXRfc2V0X2NsYXNzX2NhY2hlOgogCWlmICghc3ViY2xhc3MgfHwgZm9yY2UpCiAJCWxvY2stPmNsYXNzX2NhY2hlWzBdID0gY2xhc3M7CiAJZWxzZSBpZiAoc3ViY2xhc3MgPCBOUl9MT0NLREVQX0NBQ0hJTkdfQ0xBU1NFUykKQEAgLTExNDgsNyArMTE0OSw3IEBACiAJcHJpbnRrKCJcbiIpOwogCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKIAlwcmludGsoIlsgSU5GTzogcG9zc2libGUgY2lyY3VsYXIgbG9ja2luZyBkZXBlbmRlbmN5IGRldGVjdGVkIF1cbiIpOwotCXByaW50X2tlcm5lbF92ZXJzaW9uKCk7CisJcHJpbnRfa2VybmVsX2lkZW50KCk7CiAJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlwcmludGsoIiVzLyVkIGlzIHRyeWluZyB0byBhY3F1aXJlIGxvY2s6XG4iLAogCQljdXJyLT5jb21tLCB0YXNrX3BpZF9ucihjdXJyKSk7CkBAIC0xNDg3LDcgKzE0ODgsNyBAQAogCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKIAlwcmludGsoIlsgSU5GTzogJXMtc2FmZSAtPiAlcy11bnNhZmUgbG9jayBvcmRlciBkZXRlY3RlZCBdXG4iLAogCQlpcnFjbGFzcywgaXJxY2xhc3MpOwotCXByaW50X2tlcm5lbF92ZXJzaW9uKCk7CisJcHJpbnRfa2VybmVsX2lkZW50KCk7CiAJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCXByaW50aygiJXMvJWQgW0hDJXVbJWx1XTpTQyV1WyVsdV06SEUldTpTRSV1XSBpcyB0cnlpbmcgdG8gYWNxdWlyZTpcbiIsCiAJCWN1cnItPmNvbW0sIHRhc2tfcGlkX25yKGN1cnIpLApAQCAtMTcxNiw3ICsxNzE3LDcgQEAKIAlwcmludGsoIlxuIik7CiAJcHJpbnRrKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCXByaW50aygiWyBJTkZPOiBwb3NzaWJsZSByZWN1cnNpdmUgbG9ja2luZyBkZXRlY3RlZCBdXG4iKTsKLQlwcmludF9rZXJuZWxfdmVyc2lvbigpOworCXByaW50X2tlcm5lbF9pZGVudCgpOwogCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlwcmludGsoIiVzLyVkIGlzIHRyeWluZyB0byBhY3F1aXJlIGxvY2s6XG4iLAogCQljdXJyLT5jb21tLCB0YXNrX3BpZF9ucihjdXJyKSk7CkBAIC0yMjIzLDcgKzIyMjQsNyBAQAogCXByaW50aygiXG4iKTsKIAlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAJcHJpbnRrKCJbIElORk86IGluY29uc2lzdGVudCBsb2NrIHN0YXRlIF1cbiIpOwotCXByaW50X2tlcm5lbF92ZXJzaW9uKCk7CisJcHJpbnRfa2VybmVsX2lkZW50KCk7CiAJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCiAJcHJpbnRrKCJpbmNvbnNpc3RlbnQgeyVzfSAtPiB7JXN9IHVzYWdlLlxuIiwKQEAgLTIyODgsNyArMjI4OSw3IEBACiAJcHJpbnRrKCJcbiIpOwogCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKIAlwcmludGsoIlsgSU5GTzogcG9zc2libGUgaXJxIGxvY2sgaW52ZXJzaW9uIGRlcGVuZGVuY3kgZGV0ZWN0ZWQgXVxuIik7Ci0JcHJpbnRfa2VybmVsX3ZlcnNpb24oKTsKKwlwcmludF9rZXJuZWxfaWRlbnQoKTsKIAlwcmludGsoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAJcHJpbnRrKCIlcy8lZCBqdXN0IGNoYW5nZWQgdGhlIHN0YXRlIG9mIGxvY2s6XG4iLAogCQljdXJyLT5jb21tLCB0YXNrX3BpZF9ucihjdXJyKSk7CkBAIC0yOTQ4LDcgKzI5NDksMTIgQEAKIHZvaWQgbG9ja2RlcF9pbml0X21hcChzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIGNvbnN0IGNoYXIgKm5hbWUsCiAJCSAgICAgIHN0cnVjdCBsb2NrX2NsYXNzX2tleSAqa2V5LCBpbnQgc3ViY2xhc3MpCiB7Ci0JbWVtc2V0KGxvY2ssIDAsIHNpemVvZigqbG9jaykpOworCWludCBpOworCisJa21lbWNoZWNrX21hcmtfaW5pdGlhbGl6ZWQobG9jaywgc2l6ZW9mKCpsb2NrKSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfTE9DS0RFUF9DQUNISU5HX0NMQVNTRVM7IGkrKykKKwkJbG9jay0+Y2xhc3NfY2FjaGVbaV0gPSBOVUxMOwogCiAjaWZkZWYgQ09ORklHX0xPQ0tfU1RBVAogCWxvY2stPmNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CkBAIC0zMTY5LDYgKzMxNzUsNyBAQAogCXByaW50aygiXG4iKTsKIAlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCXByaW50aygiWyBCVUc6IGJhZCB1bmxvY2sgYmFsYW5jZSBkZXRlY3RlZCEgXVxuIik7CisJcHJpbnRfa2VybmVsX2lkZW50KCk7CiAJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlwcmludGsoIiVzLyVkIGlzIHRyeWluZyB0byByZWxlYXNlIGxvY2sgKCIsCiAJCWN1cnItPmNvbW0sIHRhc2tfcGlkX25yKGN1cnIpKTsKQEAgLTM2MTMsNiArMzYyMCw3IEBACiAJcHJpbnRrKCJcbiIpOwogCXByaW50aygiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKIAlwcmludGsoIlsgQlVHOiBiYWQgY29udGVudGlvbiBkZXRlY3RlZCEgXVxuIik7CisJcHJpbnRfa2VybmVsX2lkZW50KCk7CiAJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCXByaW50aygiJXMvJWQgaXMgdHJ5aW5nIHRvIGNvbnRlbmQgbG9jayAoIiwKIAkJY3Vyci0+Y29tbSwgdGFza19waWRfbnIoY3VycikpOwpAQCAtMzk2OCw3ICszOTc2LDggQEAKIAogI2lmZGVmIENPTkZJR19ERUJVR19MT0NLREVQCiAJaWYgKGxvY2tkZXBfaW5pdF9lcnJvcikgewotCQlwcmludGsoIldBUk5JTkc6IGxvY2tkZXAgaW5pdCBlcnJvciEgQXJjaCBjb2RlIGRpZG4ndCBjYWxsIGxvY2tkZXBfaW5pdCgpIGVhcmx5IGVub3VnaD9cbiIpOworCQlwcmludGsoIldBUk5JTkc6IGxvY2tkZXAgaW5pdCBlcnJvciEgbG9jay0lcyB3YXMgYWNxdWlyZWQiCisJCQkiYmVmb3JlIGxvY2tkZXBfaW5pdFxuIiwgbG9ja19pbml0X2Vycm9yKTsKIAkJcHJpbnRrKCJDYWxsIHN0YWNrIGxlYWRpbmcgdG8gbG9ja2RlcCBpbnZvY2F0aW9uIHdhczpcbiIpOwogCQlwcmludF9zdGFja190cmFjZSgmbG9ja2RlcF9pbml0X3RyYWNlLCAwKTsKIAl9CkBAIC0zOTg3LDYgKzM5OTYsNyBAQAogCXByaW50aygiXG4iKTsKIAlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCXByaW50aygiWyBCVUc6IGhlbGQgbG9jayBmcmVlZCEgXVxuIik7CisJcHJpbnRfa2VybmVsX2lkZW50KCk7CiAJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlwcmludGsoIiVzLyVkIGlzIGZyZWVpbmcgbWVtb3J5ICVwLSVwLCB3aXRoIGEgbG9jayBzdGlsbCBoZWxkIHRoZXJlIVxuIiwKIAkJY3Vyci0+Y29tbSwgdGFza19waWRfbnIoY3VyciksIG1lbV9mcm9tLCBtZW1fdG8tMSk7CkBAIC00MDQ0LDYgKzQwNTQsNyBAQAogCXByaW50aygiXG4iKTsKIAlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCXByaW50aygiWyBCVUc6IGxvY2sgaGVsZCBhdCB0YXNrIGV4aXQgdGltZSEgXVxuIik7CisJcHJpbnRfa2VybmVsX2lkZW50KCk7CiAJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlwcmludGsoIiVzLyVkIGlzIGV4aXRpbmcgd2l0aCBsb2NrcyBzdGlsbCBoZWxkIVxuIiwKIAkJY3Vyci0+Y29tbSwgdGFza19waWRfbnIoY3VycikpOwpAQCAtNDE0MSw2ICs0MTUyLDcgQEAKIAkJcHJpbnRrKCJcbiIpOwogCQlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAJCXByaW50aygiWyBCVUc6IGxvY2sgaGVsZCB3aGVuIHJldHVybmluZyB0byB1c2VyIHNwYWNlISBdXG4iKTsKKwkJcHJpbnRfa2VybmVsX2lkZW50KCk7CiAJCXByaW50aygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAkJcHJpbnRrKCIlcy8lZCBpcyBsZWF2aW5nIHRoZSBrZXJuZWwgd2l0aCBsb2NrcyBzdGlsbCBoZWxkIVxuIiwKIAkJCQljdXJyLT5jb21tLCBjdXJyLT5waWQpOwpAQCAtNDE2MCwxMCArNDE3MiwzMyBAQAogCXByaW50aygiXG4iKTsKIAlwcmludGsoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCXByaW50aygiWyBJTkZPOiBzdXNwaWNpb3VzIFJDVSB1c2FnZS4gXVxuIik7CisJcHJpbnRfa2VybmVsX2lkZW50KCk7CiAJcHJpbnRrKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKIAlwcmludGsoIiVzOiVkICVzIVxuIiwgZmlsZSwgbGluZSwgcyk7CiAJcHJpbnRrKCJcbm90aGVyIGluZm8gdGhhdCBtaWdodCBoZWxwIHVzIGRlYnVnIHRoaXM6XG5cbiIpOwogCXByaW50aygiXG5yY3Vfc2NoZWR1bGVyX2FjdGl2ZSA9ICVkLCBkZWJ1Z19sb2NrcyA9ICVkXG4iLCByY3Vfc2NoZWR1bGVyX2FjdGl2ZSwgZGVidWdfbG9ja3MpOworCisJLyoKKwkgKiBJZiBhIENQVSBpcyBpbiB0aGUgUkNVLWZyZWUgd2luZG93IGluIGlkbGUgKGllOiBpbiB0aGUgc2VjdGlvbgorCSAqIGJldHdlZW4gcmN1X2lkbGVfZW50ZXIoKSBhbmQgcmN1X2lkbGVfZXhpdCgpLCB0aGVuIFJDVQorCSAqIGNvbnNpZGVycyB0aGF0IENQVSB0byBiZSBpbiBhbiAiZXh0ZW5kZWQgcXVpZXNjZW50IHN0YXRlIiwKKwkgKiB3aGljaCBtZWFucyB0aGF0IFJDVSB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JpbmcgdGhhdCBDUFUuCisJICogVGhlcmVmb3JlLCByY3VfcmVhZF9sb2NrKCkgYW5kIGZyaWVuZHMgaGF2ZSBhYnNvbHV0ZWx5IG5vCisJICogZWZmZWN0IG9uIGEgQ1BVIHJ1bm5pbmcgaW4gdGhhdCBzdGF0ZS4gSW4gb3RoZXIgd29yZHMsIGV2ZW4gaWYKKwkgKiBzdWNoIGFuIFJDVS1pZGxlIENQVSBoYXMgY2FsbGVkIHJjdV9yZWFkX2xvY2soKSwgUkNVIG1pZ2h0IHdlbGwKKwkgKiBkZWxldGUgZGF0YSBzdHJ1Y3R1cmVzIG91dCBmcm9tIHVuZGVyIGl0LiAgUkNVIHJlYWxseSBoYXMgbm8KKwkgKiBjaG9pY2UgaGVyZTogd2UgbmVlZCB0byBrZWVwIGFuIFJDVS1mcmVlIHdpbmRvdyBpbiBpZGxlIHdoZXJlCisJICogdGhlIENQVSBtYXkgcG9zc2libHkgZW50ZXIgaW50byBsb3cgcG93ZXIgbW9kZS4gVGhpcyB3YXkgd2UgY2FuCisJICogbm90aWNlIGFuIGV4dGVuZGVkIHF1aWVzY2VudCBzdGF0ZSB0byBvdGhlciBDUFVzIHRoYXQgc3RhcnRlZCBhIGdyYWNlCisJICogcGVyaW9kLiBPdGhlcndpc2Ugd2Ugd291bGQgZGVsYXkgYW55IGdyYWNlIHBlcmlvZCBhcyBsb25nIGFzIHdlIHJ1bgorCSAqIGluIHRoZSBpZGxlIHRhc2suCisJICoKKwkgKiBTbyBjb21wbGFpbiBiaXR0ZXJseSBpZiBzb21lb25lIGRvZXMgY2FsbCByY3VfcmVhZF9sb2NrKCksCisJICogcmN1X3JlYWRfbG9ja19iaCgpIGFuZCBzbyBvbiBmcm9tIGV4dGVuZGVkIHF1aWVzY2VudCBzdGF0ZXMuCisJICovCisJaWYgKHJjdV9pc19jcHVfaWRsZSgpKQorCQlwcmludGsoIlJDVSB1c2VkIGlsbGVnYWxseSBmcm9tIGV4dGVuZGVkIHF1aWVzY2VudCBzdGF0ZSFcbiIpOworCiAJbG9ja2RlcF9wcmludF9oZWxkX2xvY2tzKGN1cnIpOwogCXByaW50aygiXG5zdGFjayBiYWNrdHJhY2U6XG4iKTsKIAlkdW1wX3N0YWNrKCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcGFuaWMuYyBiL2tlcm5lbC9wYW5pYy5jCmluZGV4IGIyNjU5MzYwLi4zNDU4NDY5IDEwMDY0NAotLS0gYS9rZXJuZWwvcGFuaWMuYworKysgYi9rZXJuZWwvcGFuaWMuYwpAQCAtMjM3LDExICsyMzcsMjAgQEAKIAkgKiBDYW4ndCB0cnVzdCB0aGUgaW50ZWdyaXR5IG9mIHRoZSBrZXJuZWwgYW55bW9yZS4KIAkgKiBXZSBkb24ndCBjYWxsIGRpcmVjdGx5IGRlYnVnX2xvY2tzX29mZigpIGJlY2F1c2UgdGhlIGlzc3VlCiAJICogaXMgbm90IG5lY2Vzc2FyaWx5IHNlcmlvdXMgZW5vdWdoIHRvIHNldCBvb3BzX2luX3Byb2dyZXNzIHRvIDEKLQkgKiBBbHNvIHdlIHdhbnQgdG8ga2VlcCB1cCBsb2NrZGVwIGZvciBzdGFnaW5nIGRldmVsb3BtZW50IGFuZAotCSAqIHBvc3Qtd2FybmluZyBjYXNlLgorCSAqIEFsc28gd2Ugd2FudCB0byBrZWVwIHVwIGxvY2tkZXAgZm9yIHN0YWdpbmcvb3V0LW9mLXRyZWUKKwkgKiBkZXZlbG9wbWVudCBhbmQgcG9zdC13YXJuaW5nIGNhc2UuCiAJICovCi0JaWYgKGZsYWcgIT0gVEFJTlRfQ1JBUCAmJiBmbGFnICE9IFRBSU5UX1dBUk4gJiYgX19kZWJ1Z19sb2Nrc19vZmYoKSkKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRGlzYWJsaW5nIGxvY2sgZGVidWdnaW5nIGR1ZSB0byBrZXJuZWwgdGFpbnRcbiIpOworCXN3aXRjaCAoZmxhZykgeworCWNhc2UgVEFJTlRfQ1JBUDoKKwljYXNlIFRBSU5UX09PVF9NT0RVTEU6CisJY2FzZSBUQUlOVF9XQVJOOgorCWNhc2UgVEFJTlRfRklSTVdBUkVfV09SS0FST1VORDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAoX19kZWJ1Z19sb2Nrc19vZmYoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkRpc2FibGluZyBsb2NrIGRlYnVnZ2luZyBkdWUgdG8ga2VybmVsIHRhaW50XG4iKTsKKwl9CiAKIAlzZXRfYml0KGZsYWcsICZ0YWludGVkX21hc2spOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYyBiL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMKaW5kZXggZTdjYjc2ZC4uMTI1Y2I2NyAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYworKysgYi9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCkBAIC03OCw3ICs3OCw3IEBACiAJaWYgKENQVUNMT0NLX1dISUNIKHdoaWNoX2Nsb2NrKSA9PSBDUFVDTE9DS19TQ0hFRCkgewogCQlyZXR1cm4gbm93LnNjaGVkIDwgdGhlbi5zY2hlZDsKIAl9ICBlbHNlIHsKLQkJcmV0dXJuIGNwdXRpbWVfbHQobm93LmNwdSwgdGhlbi5jcHUpOworCQlyZXR1cm4gbm93LmNwdSA8IHRoZW4uY3B1OwogCX0KIH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjcHVfdGltZV9hZGQoY29uc3QgY2xvY2tpZF90IHdoaWNoX2Nsb2NrLApAQCAtODgsNyArODgsNyBAQAogCWlmIChDUFVDTE9DS19XSElDSCh3aGljaF9jbG9jaykgPT0gQ1BVQ0xPQ0tfU0NIRUQpIHsKIAkJYWNjLT5zY2hlZCArPSB2YWwuc2NoZWQ7CiAJfSAgZWxzZSB7Ci0JCWFjYy0+Y3B1ID0gY3B1dGltZV9hZGQoYWNjLT5jcHUsIHZhbC5jcHUpOworCQlhY2MtPmNwdSArPSB2YWwuY3B1OwogCX0KIH0KIHN0YXRpYyBpbmxpbmUgdW5pb24gY3B1X3RpbWVfY291bnQgY3B1X3RpbWVfc3ViKGNvbnN0IGNsb2NraWRfdCB3aGljaF9jbG9jaywKQEAgLTk4LDI1ICs5OCwxMiBAQAogCWlmIChDUFVDTE9DS19XSElDSCh3aGljaF9jbG9jaykgPT0gQ1BVQ0xPQ0tfU0NIRUQpIHsKIAkJYS5zY2hlZCAtPSBiLnNjaGVkOwogCX0gIGVsc2UgewotCQlhLmNwdSA9IGNwdXRpbWVfc3ViKGEuY3B1LCBiLmNwdSk7CisJCWEuY3B1IC09IGIuY3B1OwogCX0KIAlyZXR1cm4gYTsKIH0KIAogLyoKLSAqIERpdmlkZSBhbmQgbGltaXQgdGhlIHJlc3VsdCB0byByZXMgPj0gMQotICoKLSAqIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgc2lnbmFsIGRlbGl2ZXJ5IHN0YXJ2YXRpb24sIHdoZW4gdGhlIHJlc3VsdCBvZgotICogdGhlIGRpdmlzaW9uIHdvdWxkIGJlIHJvdW5kZWQgZG93biB0byAwLgotICovCi1zdGF0aWMgaW5saW5lIGNwdXRpbWVfdCBjcHV0aW1lX2Rpdl9ub25femVybyhjcHV0aW1lX3QgdGltZSwgdW5zaWduZWQgbG9uZyBkaXYpCi17Ci0JY3B1dGltZV90IHJlcyA9IGNwdXRpbWVfZGl2KHRpbWUsIGRpdik7Ci0KLQlyZXR1cm4gbWF4X3QoY3B1dGltZV90LCByZXMsIDEpOwotfQotCi0vKgogICogVXBkYXRlIGV4cGlyeSB0aW1lIGZyb20gaW5jcmVtZW50LCBhbmQgaW5jcmVhc2Ugb3ZlcnJ1biBjb3VudCwKICAqIGdpdmVuIHRoZSBjdXJyZW50IGNsb2NrIHNhbXBsZS4KICAqLwpAQCAtMTQ4LDI4ICsxMzUsMjYgQEAKIAl9IGVsc2UgewogCQljcHV0aW1lX3QgZGVsdGEsIGluY3I7CiAKLQkJaWYgKGNwdXRpbWVfbHQobm93LmNwdSwgdGltZXItPml0LmNwdS5leHBpcmVzLmNwdSkpCisJCWlmIChub3cuY3B1IDwgdGltZXItPml0LmNwdS5leHBpcmVzLmNwdSkKIAkJCXJldHVybjsKIAkJaW5jciA9IHRpbWVyLT5pdC5jcHUuaW5jci5jcHU7Ci0JCWRlbHRhID0gY3B1dGltZV9zdWIoY3B1dGltZV9hZGQobm93LmNwdSwgaW5jciksCi0JCQkJICAgIHRpbWVyLT5pdC5jcHUuZXhwaXJlcy5jcHUpOworCQlkZWx0YSA9IG5vdy5jcHUgKyBpbmNyIC0gdGltZXItPml0LmNwdS5leHBpcmVzLmNwdTsKIAkJLyogRG9uJ3QgdXNlIChpbmNyKjIgPCBkZWx0YSksIGluY3IqMiBtaWdodCBvdmVyZmxvdy4gKi8KLQkJZm9yIChpID0gMDsgY3B1dGltZV9sdChpbmNyLCBjcHV0aW1lX3N1YihkZWx0YSwgaW5jcikpOyBpKyspCi0JCQkgICAgIGluY3IgPSBjcHV0aW1lX2FkZChpbmNyLCBpbmNyKTsKLQkJZm9yICg7IGkgPj0gMDsgaW5jciA9IGNwdXRpbWVfaGFsdmUoaW5jciksIGktLSkgewotCQkJaWYgKGNwdXRpbWVfbHQoZGVsdGEsIGluY3IpKQorCQlmb3IgKGkgPSAwOyBpbmNyIDwgZGVsdGEgLSBpbmNyOyBpKyspCisJCQkgICAgIGluY3IgKz0gaW5jcjsKKwkJZm9yICg7IGkgPj0gMDsgaW5jciA9IGluY3IgPj4gMSwgaS0tKSB7CisJCQlpZiAoZGVsdGEgPCBpbmNyKQogCQkJCWNvbnRpbnVlOwotCQkJdGltZXItPml0LmNwdS5leHBpcmVzLmNwdSA9Ci0JCQkJY3B1dGltZV9hZGQodGltZXItPml0LmNwdS5leHBpcmVzLmNwdSwgaW5jcik7CisJCQl0aW1lci0+aXQuY3B1LmV4cGlyZXMuY3B1ICs9IGluY3I7CiAJCQl0aW1lci0+aXRfb3ZlcnJ1biArPSAxIDw8IGk7Ci0JCQlkZWx0YSA9IGNwdXRpbWVfc3ViKGRlbHRhLCBpbmNyKTsKKwkJCWRlbHRhIC09IGluY3I7CiAJCX0KIAl9CiB9CiAKIHN0YXRpYyBpbmxpbmUgY3B1dGltZV90IHByb2ZfdGlja3Moc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewotCXJldHVybiBjcHV0aW1lX2FkZChwLT51dGltZSwgcC0+c3RpbWUpOworCXJldHVybiBwLT51dGltZSArIHAtPnN0aW1lOwogfQogc3RhdGljIGlubGluZSBjcHV0aW1lX3QgdmlydF90aWNrcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CkBAIC0yNDgsOCArMjMzLDggQEAKIAogCXQgPSB0c2s7CiAJZG8gewotCQl0aW1lcy0+dXRpbWUgPSBjcHV0aW1lX2FkZCh0aW1lcy0+dXRpbWUsIHQtPnV0aW1lKTsKLQkJdGltZXMtPnN0aW1lID0gY3B1dGltZV9hZGQodGltZXMtPnN0aW1lLCB0LT5zdGltZSk7CisJCXRpbWVzLT51dGltZSArPSB0LT51dGltZTsKKwkJdGltZXMtPnN0aW1lICs9IHQtPnN0aW1lOwogCQl0aW1lcy0+c3VtX2V4ZWNfcnVudGltZSArPSB0YXNrX3NjaGVkX3J1bnRpbWUodCk7CiAJfSB3aGlsZV9lYWNoX3RocmVhZCh0c2ssIHQpOwogb3V0OgpAQCAtMjU4LDEwICsyNDMsMTAgQEAKIAogc3RhdGljIHZvaWQgdXBkYXRlX2d0X2NwdXRpbWUoc3RydWN0IHRhc2tfY3B1dGltZSAqYSwgc3RydWN0IHRhc2tfY3B1dGltZSAqYikKIHsKLQlpZiAoY3B1dGltZV9ndChiLT51dGltZSwgYS0+dXRpbWUpKQorCWlmIChiLT51dGltZSA+IGEtPnV0aW1lKQogCQlhLT51dGltZSA9IGItPnV0aW1lOwogCi0JaWYgKGNwdXRpbWVfZ3QoYi0+c3RpbWUsIGEtPnN0aW1lKSkKKwlpZiAoYi0+c3RpbWUgPiBhLT5zdGltZSkKIAkJYS0+c3RpbWUgPSBiLT5zdGltZTsKIAogCWlmIChiLT5zdW1fZXhlY19ydW50aW1lID4gYS0+c3VtX2V4ZWNfcnVudGltZSkKQEAgLTMwNiw3ICsyOTEsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAljYXNlIENQVUNMT0NLX1BST0Y6CiAJCXRocmVhZF9ncm91cF9jcHV0aW1lKHAsICZjcHV0aW1lKTsKLQkJY3B1LT5jcHUgPSBjcHV0aW1lX2FkZChjcHV0aW1lLnV0aW1lLCBjcHV0aW1lLnN0aW1lKTsKKwkJY3B1LT5jcHUgPSBjcHV0aW1lLnV0aW1lICsgY3B1dGltZS5zdGltZTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVDTE9DS19WSVJUOgogCQl0aHJlYWRfZ3JvdXBfY3B1dGltZShwLCAmY3B1dGltZSk7CkBAIC00NzAsMjYgKzQ1NSwyNCBAQAogCQkJICAgdW5zaWduZWQgbG9uZyBsb25nIHN1bV9leGVjX3J1bnRpbWUpCiB7CiAJc3RydWN0IGNwdV90aW1lcl9saXN0ICp0aW1lciwgKm5leHQ7Ci0JY3B1dGltZV90IHB0aW1lID0gY3B1dGltZV9hZGQodXRpbWUsIHN0aW1lKTsKKwljcHV0aW1lX3QgcHRpbWUgPSB1dGltZSArIHN0aW1lOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRpbWVyLCBuZXh0LCBoZWFkLCBlbnRyeSkgewogCQlsaXN0X2RlbF9pbml0KCZ0aW1lci0+ZW50cnkpOwotCQlpZiAoY3B1dGltZV9sdCh0aW1lci0+ZXhwaXJlcy5jcHUsIHB0aW1lKSkgewotCQkJdGltZXItPmV4cGlyZXMuY3B1ID0gY3B1dGltZV96ZXJvOworCQlpZiAodGltZXItPmV4cGlyZXMuY3B1IDwgcHRpbWUpIHsKKwkJCXRpbWVyLT5leHBpcmVzLmNwdSA9IDA7CiAJCX0gZWxzZSB7Ci0JCQl0aW1lci0+ZXhwaXJlcy5jcHUgPSBjcHV0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcy5jcHUsCi0JCQkJCQkJIHB0aW1lKTsKKwkJCXRpbWVyLT5leHBpcmVzLmNwdSAtPSBwdGltZTsKIAkJfQogCX0KIAogCSsraGVhZDsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodGltZXIsIG5leHQsIGhlYWQsIGVudHJ5KSB7CiAJCWxpc3RfZGVsX2luaXQoJnRpbWVyLT5lbnRyeSk7Ci0JCWlmIChjcHV0aW1lX2x0KHRpbWVyLT5leHBpcmVzLmNwdSwgdXRpbWUpKSB7Ci0JCQl0aW1lci0+ZXhwaXJlcy5jcHUgPSBjcHV0aW1lX3plcm87CisJCWlmICh0aW1lci0+ZXhwaXJlcy5jcHUgPCB1dGltZSkgeworCQkJdGltZXItPmV4cGlyZXMuY3B1ID0gMDsKIAkJfSBlbHNlIHsKLQkJCXRpbWVyLT5leHBpcmVzLmNwdSA9IGNwdXRpbWVfc3ViKHRpbWVyLT5leHBpcmVzLmNwdSwKLQkJCQkJCQkgdXRpbWUpOworCQkJdGltZXItPmV4cGlyZXMuY3B1IC09IHV0aW1lOwogCQl9CiAJfQogCkBAIC01MjAsOCArNTAzLDcgQEAKIAlzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqY29uc3Qgc2lnID0gdHNrLT5zaWduYWw7CiAKIAljbGVhbnVwX3RpbWVycyh0c2stPnNpZ25hbC0+Y3B1X3RpbWVycywKLQkJICAgICAgIGNwdXRpbWVfYWRkKHRzay0+dXRpbWUsIHNpZy0+dXRpbWUpLAotCQkgICAgICAgY3B1dGltZV9hZGQodHNrLT5zdGltZSwgc2lnLT5zdGltZSksCisJCSAgICAgICB0c2stPnV0aW1lICsgc2lnLT51dGltZSwgdHNrLT5zdGltZSArIHNpZy0+c3RpbWUsCiAJCSAgICAgICB0c2stPnNlLnN1bV9leGVjX3J1bnRpbWUgKyBzaWctPnN1bV9zY2hlZF9ydW50aW1lKTsKIH0KIApAQCAtNTQwLDggKzUyMiw3IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IGV4cGlyZXNfZ3QoY3B1dGltZV90IGV4cGlyZXMsIGNwdXRpbWVfdCBuZXdfZXhwKQogewotCXJldHVybiBjcHV0aW1lX2VxKGV4cGlyZXMsIGNwdXRpbWVfemVybykgfHwKLQkgICAgICAgY3B1dGltZV9ndChleHBpcmVzLCBuZXdfZXhwKTsKKwlyZXR1cm4gZXhwaXJlcyA9PSAwIHx8IGV4cGlyZXMgPiBuZXdfZXhwOwogfQogCiAvKgpAQCAtNjUxLDcgKzYzMiw3IEBACiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FSU5WQUw7CiAJY2FzZSBDUFVDTE9DS19QUk9GOgotCQljcHUtPmNwdSA9IGNwdXRpbWVfYWRkKGNwdXRpbWUudXRpbWUsIGNwdXRpbWUuc3RpbWUpOworCQljcHUtPmNwdSA9IGNwdXRpbWUudXRpbWUgKyBjcHV0aW1lLnN0aW1lOwogCQlicmVhazsKIAljYXNlIENQVUNMT0NLX1ZJUlQ6CiAJCWNwdS0+Y3B1ID0gY3B1dGltZS51dGltZTsKQEAgLTkxOCwxMiArODk5LDEyIEBACiAJdW5zaWduZWQgbG9uZyBzb2Z0OwogCiAJbWF4ZmlyZSA9IDIwOwotCXRzay0+Y3B1dGltZV9leHBpcmVzLnByb2ZfZXhwID0gY3B1dGltZV96ZXJvOworCXRzay0+Y3B1dGltZV9leHBpcmVzLnByb2ZfZXhwID0gMDsKIAl3aGlsZSAoIWxpc3RfZW1wdHkodGltZXJzKSkgewogCQlzdHJ1Y3QgY3B1X3RpbWVyX2xpc3QgKnQgPSBsaXN0X2ZpcnN0X2VudHJ5KHRpbWVycywKIAkJCQkJCSAgICAgIHN0cnVjdCBjcHVfdGltZXJfbGlzdCwKIAkJCQkJCSAgICAgIGVudHJ5KTsKLQkJaWYgKCEtLW1heGZpcmUgfHwgY3B1dGltZV9sdChwcm9mX3RpY2tzKHRzayksIHQtPmV4cGlyZXMuY3B1KSkgeworCQlpZiAoIS0tbWF4ZmlyZSB8fCBwcm9mX3RpY2tzKHRzaykgPCB0LT5leHBpcmVzLmNwdSkgewogCQkJdHNrLT5jcHV0aW1lX2V4cGlyZXMucHJvZl9leHAgPSB0LT5leHBpcmVzLmNwdTsKIAkJCWJyZWFrOwogCQl9CkBAIC05MzMsMTIgKzkxNCwxMiBAQAogCiAJKyt0aW1lcnM7CiAJbWF4ZmlyZSA9IDIwOwotCXRzay0+Y3B1dGltZV9leHBpcmVzLnZpcnRfZXhwID0gY3B1dGltZV96ZXJvOworCXRzay0+Y3B1dGltZV9leHBpcmVzLnZpcnRfZXhwID0gMDsKIAl3aGlsZSAoIWxpc3RfZW1wdHkodGltZXJzKSkgewogCQlzdHJ1Y3QgY3B1X3RpbWVyX2xpc3QgKnQgPSBsaXN0X2ZpcnN0X2VudHJ5KHRpbWVycywKIAkJCQkJCSAgICAgIHN0cnVjdCBjcHVfdGltZXJfbGlzdCwKIAkJCQkJCSAgICAgIGVudHJ5KTsKLQkJaWYgKCEtLW1heGZpcmUgfHwgY3B1dGltZV9sdCh2aXJ0X3RpY2tzKHRzayksIHQtPmV4cGlyZXMuY3B1KSkgeworCQlpZiAoIS0tbWF4ZmlyZSB8fCB2aXJ0X3RpY2tzKHRzaykgPCB0LT5leHBpcmVzLmNwdSkgewogCQkJdHNrLT5jcHV0aW1lX2V4cGlyZXMudmlydF9leHAgPSB0LT5leHBpcmVzLmNwdTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMDA5LDIwICs5OTAsMTkgQEAKIHN0YXRpYyB2b2lkIGNoZWNrX2NwdV9pdGltZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCBjcHVfaXRpbWVyICppdCwKIAkJCSAgICAgY3B1dGltZV90ICpleHBpcmVzLCBjcHV0aW1lX3QgY3VyX3RpbWUsIGludCBzaWdubykKIHsKLQlpZiAoY3B1dGltZV9lcShpdC0+ZXhwaXJlcywgY3B1dGltZV96ZXJvKSkKKwlpZiAoIWl0LT5leHBpcmVzKQogCQlyZXR1cm47CiAKLQlpZiAoY3B1dGltZV9nZShjdXJfdGltZSwgaXQtPmV4cGlyZXMpKSB7Ci0JCWlmICghY3B1dGltZV9lcShpdC0+aW5jciwgY3B1dGltZV96ZXJvKSkgewotCQkJaXQtPmV4cGlyZXMgPSBjcHV0aW1lX2FkZChpdC0+ZXhwaXJlcywgaXQtPmluY3IpOworCWlmIChjdXJfdGltZSA+PSBpdC0+ZXhwaXJlcykgeworCQlpZiAoaXQtPmluY3IpIHsKKwkJCWl0LT5leHBpcmVzICs9IGl0LT5pbmNyOwogCQkJaXQtPmVycm9yICs9IGl0LT5pbmNyX2Vycm9yOwogCQkJaWYgKGl0LT5lcnJvciA+PSBvbmVjcHV0aWNrKSB7Ci0JCQkJaXQtPmV4cGlyZXMgPSBjcHV0aW1lX3N1YihpdC0+ZXhwaXJlcywKLQkJCQkJCQkgIGNwdXRpbWVfb25lX2ppZmZ5KTsKKwkJCQlpdC0+ZXhwaXJlcyAtPSBjcHV0aW1lX29uZV9qaWZmeTsKIAkJCQlpdC0+ZXJyb3IgLT0gb25lY3B1dGljazsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCWl0LT5leHBpcmVzID0gY3B1dGltZV96ZXJvOworCQkJaXQtPmV4cGlyZXMgPSAwOwogCQl9CiAKIAkJdHJhY2VfaXRpbWVyX2V4cGlyZShzaWdubyA9PSBTSUdQUk9GID8KQEAgLTEwMzEsOSArMTAxMSw3IEBACiAJCV9fZ3JvdXBfc2VuZF9zaWdfaW5mbyhzaWdubywgU0VORF9TSUdfUFJJViwgdHNrKTsKIAl9CiAKLQlpZiAoIWNwdXRpbWVfZXEoaXQtPmV4cGlyZXMsIGNwdXRpbWVfemVybykgJiYKLQkgICAgKGNwdXRpbWVfZXEoKmV4cGlyZXMsIGNwdXRpbWVfemVybykgfHwKLQkgICAgIGNwdXRpbWVfbHQoaXQtPmV4cGlyZXMsICpleHBpcmVzKSkpIHsKKwlpZiAoaXQtPmV4cGlyZXMgJiYgKCEqZXhwaXJlcyB8fCBpdC0+ZXhwaXJlcyA8ICpleHBpcmVzKSkgewogCQkqZXhwaXJlcyA9IGl0LT5leHBpcmVzOwogCX0KIH0KQEAgLTEwNDgsOSArMTAyNiw3IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfY3B1dGltZV96ZXJvKGNvbnN0IHN0cnVjdCB0YXNrX2NwdXRpbWUgKmNwdXRpbWUpCiB7Ci0JaWYgKGNwdXRpbWVfZXEoY3B1dGltZS0+dXRpbWUsIGNwdXRpbWVfemVybykgJiYKLQkgICAgY3B1dGltZV9lcShjcHV0aW1lLT5zdGltZSwgY3B1dGltZV96ZXJvKSAmJgotCSAgICBjcHV0aW1lLT5zdW1fZXhlY19ydW50aW1lID09IDApCisJaWYgKCFjcHV0aW1lLT51dGltZSAmJiAhY3B1dGltZS0+c3RpbWUgJiYgIWNwdXRpbWUtPnN1bV9leGVjX3J1bnRpbWUpCiAJCXJldHVybiAxOwogCXJldHVybiAwOwogfQpAQCAtMTA3NiwxNSArMTA1MiwxNSBAQAogCSAqLwogCXRocmVhZF9ncm91cF9jcHV0aW1lcih0c2ssICZjcHV0aW1lKTsKIAl1dGltZSA9IGNwdXRpbWUudXRpbWU7Ci0JcHRpbWUgPSBjcHV0aW1lX2FkZCh1dGltZSwgY3B1dGltZS5zdGltZSk7CisJcHRpbWUgPSB1dGltZSArIGNwdXRpbWUuc3RpbWU7CiAJc3VtX3NjaGVkX3J1bnRpbWUgPSBjcHV0aW1lLnN1bV9leGVjX3J1bnRpbWU7CiAJbWF4ZmlyZSA9IDIwOwotCXByb2ZfZXhwaXJlcyA9IGNwdXRpbWVfemVybzsKKwlwcm9mX2V4cGlyZXMgPSAwOwogCXdoaWxlICghbGlzdF9lbXB0eSh0aW1lcnMpKSB7CiAJCXN0cnVjdCBjcHVfdGltZXJfbGlzdCAqdGwgPSBsaXN0X2ZpcnN0X2VudHJ5KHRpbWVycywKIAkJCQkJCSAgICAgIHN0cnVjdCBjcHVfdGltZXJfbGlzdCwKIAkJCQkJCSAgICAgIGVudHJ5KTsKLQkJaWYgKCEtLW1heGZpcmUgfHwgY3B1dGltZV9sdChwdGltZSwgdGwtPmV4cGlyZXMuY3B1KSkgeworCQlpZiAoIS0tbWF4ZmlyZSB8fCBwdGltZSA8IHRsLT5leHBpcmVzLmNwdSkgewogCQkJcHJvZl9leHBpcmVzID0gdGwtPmV4cGlyZXMuY3B1OwogCQkJYnJlYWs7CiAJCX0KQEAgLTEwOTQsMTIgKzEwNzAsMTIgQEAKIAogCSsrdGltZXJzOwogCW1heGZpcmUgPSAyMDsKLQl2aXJ0X2V4cGlyZXMgPSBjcHV0aW1lX3plcm87CisJdmlydF9leHBpcmVzID0gMDsKIAl3aGlsZSAoIWxpc3RfZW1wdHkodGltZXJzKSkgewogCQlzdHJ1Y3QgY3B1X3RpbWVyX2xpc3QgKnRsID0gbGlzdF9maXJzdF9lbnRyeSh0aW1lcnMsCiAJCQkJCQkgICAgICBzdHJ1Y3QgY3B1X3RpbWVyX2xpc3QsCiAJCQkJCQkgICAgICBlbnRyeSk7Ci0JCWlmICghLS1tYXhmaXJlIHx8IGNwdXRpbWVfbHQodXRpbWUsIHRsLT5leHBpcmVzLmNwdSkpIHsKKwkJaWYgKCEtLW1heGZpcmUgfHwgdXRpbWUgPCB0bC0+ZXhwaXJlcy5jcHUpIHsKIAkJCXZpcnRfZXhwaXJlcyA9IHRsLT5leHBpcmVzLmNwdTsKIAkJCWJyZWFrOwogCQl9CkBAIC0xMTU0LDggKzExMzAsNyBAQAogCQkJfQogCQl9CiAJCXggPSBzZWNzX3RvX2NwdXRpbWUoc29mdCk7Ci0JCWlmIChjcHV0aW1lX2VxKHByb2ZfZXhwaXJlcywgY3B1dGltZV96ZXJvKSB8fAotCQkgICAgY3B1dGltZV9sdCh4LCBwcm9mX2V4cGlyZXMpKSB7CisJCWlmICghcHJvZl9leHBpcmVzIHx8IHggPCBwcm9mX2V4cGlyZXMpIHsKIAkJCXByb2ZfZXhwaXJlcyA9IHg7CiAJCX0KIAl9CkBAIC0xMjQ5LDEyICsxMjI0LDkgQEAKIHN0YXRpYyBpbmxpbmUgaW50IHRhc2tfY3B1dGltZV9leHBpcmVkKGNvbnN0IHN0cnVjdCB0YXNrX2NwdXRpbWUgKnNhbXBsZSwKIAkJCQkJY29uc3Qgc3RydWN0IHRhc2tfY3B1dGltZSAqZXhwaXJlcykKIHsKLQlpZiAoIWNwdXRpbWVfZXEoZXhwaXJlcy0+dXRpbWUsIGNwdXRpbWVfemVybykgJiYKLQkgICAgY3B1dGltZV9nZShzYW1wbGUtPnV0aW1lLCBleHBpcmVzLT51dGltZSkpCisJaWYgKGV4cGlyZXMtPnV0aW1lICYmIHNhbXBsZS0+dXRpbWUgPj0gZXhwaXJlcy0+dXRpbWUpCiAJCXJldHVybiAxOwotCWlmICghY3B1dGltZV9lcShleHBpcmVzLT5zdGltZSwgY3B1dGltZV96ZXJvKSAmJgotCSAgICBjcHV0aW1lX2dlKGNwdXRpbWVfYWRkKHNhbXBsZS0+dXRpbWUsIHNhbXBsZS0+c3RpbWUpLAotCQkgICAgICAgZXhwaXJlcy0+c3RpbWUpKQorCWlmIChleHBpcmVzLT5zdGltZSAmJiBzYW1wbGUtPnV0aW1lICsgc2FtcGxlLT5zdGltZSA+PSBleHBpcmVzLT5zdGltZSkKIAkJcmV0dXJuIDE7CiAJaWYgKGV4cGlyZXMtPnN1bV9leGVjX3J1bnRpbWUgIT0gMCAmJgogCSAgICBzYW1wbGUtPnN1bV9leGVjX3J1bnRpbWUgPj0gZXhwaXJlcy0+c3VtX2V4ZWNfcnVudGltZSkKQEAgLTEzODksMTggKzEzNjEsMTggQEAKIAkJICogaXQgdG8gYmUgcmVsYXRpdmUsICpuZXd2YWwgYXJndW1lbnQgaXMgcmVsYXRpdmUgYW5kIHdlIHVwZGF0ZQogCQkgKiBpdCB0byBiZSBhYnNvbHV0ZS4KIAkJICovCi0JCWlmICghY3B1dGltZV9lcSgqb2xkdmFsLCBjcHV0aW1lX3plcm8pKSB7Ci0JCQlpZiAoY3B1dGltZV9sZSgqb2xkdmFsLCBub3cuY3B1KSkgeworCQlpZiAoKm9sZHZhbCkgeworCQkJaWYgKCpvbGR2YWwgPD0gbm93LmNwdSkgewogCQkJCS8qIEp1c3QgYWJvdXQgdG8gZmlyZS4gKi8KIAkJCQkqb2xkdmFsID0gY3B1dGltZV9vbmVfamlmZnk7CiAJCQl9IGVsc2UgewotCQkJCSpvbGR2YWwgPSBjcHV0aW1lX3N1Yigqb2xkdmFsLCBub3cuY3B1KTsKKwkJCQkqb2xkdmFsIC09IG5vdy5jcHU7CiAJCQl9CiAJCX0KIAotCQlpZiAoY3B1dGltZV9lcSgqbmV3dmFsLCBjcHV0aW1lX3plcm8pKQorCQlpZiAoISpuZXd2YWwpCiAJCQlyZXR1cm47Ci0JCSpuZXd2YWwgPSBjcHV0aW1lX2FkZCgqbmV3dmFsLCBub3cuY3B1KTsKKwkJKm5ld3ZhbCArPSBub3cuY3B1OwogCX0KIAogCS8qCmRpZmYgLS1naXQgYS9rZXJuZWwvcHJpbnRrLmMgYi9rZXJuZWwvcHJpbnRrLmMKaW5kZXggMTQ1NWEwZC4uOTg5ZTRhNSAxMDA2NDQKLS0tIGEva2VybmVsL3ByaW50ay5jCisrKyBiL2tlcm5lbC9wcmludGsuYwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJCXVuc2lnbmVkIGxvbmcgbWVtOwogCiAJCW1lbSA9IG1lbWJsb2NrX2FsbG9jKG5ld19sb2dfYnVmX2xlbiwgUEFHRV9TSVpFKTsKLQkJaWYgKG1lbSA9PSBNRU1CTE9DS19FUlJPUikKKwkJaWYgKCFtZW0pCiAJCQlyZXR1cm47CiAJCW5ld19sb2dfYnVmID0gX192YShtZW0pOwogCX0gZWxzZSB7CkBAIC02ODgsNiArNjg4LDcgQEAKIAogCW9vcHNfdGltZXN0YW1wID0gamlmZmllczsKIAorCWRlYnVnX2xvY2tzX29mZigpOwogCS8qIElmIGEgY3Jhc2ggaXMgb2NjdXJyaW5nLCBtYWtlIHN1cmUgd2UgY2FuJ3QgZGVhZGxvY2sgKi8KIAlyYXdfc3Bpbl9sb2NrX2luaXQoJmxvZ2J1Zl9sb2NrKTsKIAkvKiBBbmQgbWFrZSBzdXJlIHRoYXQgd2UgcHJpbnQgaW1tZWRpYXRlbHkgKi8KQEAgLTg0MCw5ICs4NDEsOCBAQAogCWJvb3RfZGVsYXlfbXNlYygpOwogCXByaW50a19kZWxheSgpOwogCi0JcHJlZW1wdF9kaXNhYmxlKCk7CiAJLyogVGhpcyBzdG9wcyB0aGUgaG9sZGVyIG9mIGNvbnNvbGVfc2VtIGp1c3Qgd2hlcmUgd2Ugd2FudCBoaW0gKi8KLQlyYXdfbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAl0aGlzX2NwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCS8qCkBAIC04NTYsNyArODU2LDcgQEAKIAkJICogcmVjdXJzaW9uIGFuZCByZXR1cm4gLSBidXQgZmxhZyB0aGUgcmVjdXJzaW9uIHNvIHRoYXQKIAkJICogaXQgY2FuIGJlIHByaW50ZWQgYXQgdGhlIG5leHQgYXBwcm9wcmlhdGUgbW9tZW50OgogCQkgKi8KLQkJaWYgKCFvb3BzX2luX3Byb2dyZXNzKSB7CisJCWlmICghb29wc19pbl9wcm9ncmVzcyAmJiAhbG9ja2RlcF9yZWN1cnNpbmcoY3VycmVudCkpIHsKIAkJCXJlY3Vyc2lvbl9idWcgPSAxOwogCQkJZ290byBvdXRfcmVzdG9yZV9pcnFzOwogCQl9CkBAIC05NjIsOSArOTYyLDggQEAKIAogCWxvY2tkZXBfb24oKTsKIG91dF9yZXN0b3JlX2lycXM6Ci0JcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKLQlwcmVlbXB0X2VuYWJsZSgpOwogCXJldHVybiBwcmludGVkX2xlbjsKIH0KIEVYUE9SVF9TWU1CT0wocHJpbnRrKTsKQEAgLTEyOTMsMTAgKzEyOTIsMTEgQEAKIAlyYXdfc3Bpbl9sb2NrKCZsb2didWZfbG9jayk7CiAJaWYgKGNvbl9zdGFydCAhPSBsb2dfZW5kKQogCQlyZXRyeSA9IDE7CisJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvZ2J1Zl9sb2NrLCBmbGFncyk7CisKIAlpZiAocmV0cnkgJiYgY29uc29sZV90cnlsb2NrKCkpCiAJCWdvdG8gYWdhaW47CiAKLQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9nYnVmX2xvY2ssIGZsYWdzKTsKIAlpZiAod2FrZV9rbG9nZCkKIAkJd2FrZV91cF9rbG9nZCgpOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3B0cmFjZS5jIGIva2VybmVsL3B0cmFjZS5jCmluZGV4IDI0ZDA0NDcuLjc4YWIyNGEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9wdHJhY2UuYworKysgYi9rZXJuZWwvcHRyYWNlLmMKQEAgLTk2LDkgKzk2LDIwIEBACiAJICovCiAJaWYgKCEoY2hpbGQtPmZsYWdzICYgUEZfRVhJVElORykgJiYKIAkgICAgKGNoaWxkLT5zaWduYWwtPmZsYWdzICYgU0lHTkFMX1NUT1BfU1RPUFBFRCB8fAotCSAgICAgY2hpbGQtPnNpZ25hbC0+Z3JvdXBfc3RvcF9jb3VudCkpCisJICAgICBjaGlsZC0+c2lnbmFsLT5ncm91cF9zdG9wX2NvdW50KSkgewogCQljaGlsZC0+am9iY3RsIHw9IEpPQkNUTF9TVE9QX1BFTkRJTkc7CiAKKwkJLyoKKwkJICogVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGlmIHRoaXMgdGhyZWFkIHdhcyBjbG9uZWQgYnkgdGhlCisJCSAqIHRyYWNlZCB0YXNrIHJ1bm5pbmcgaW4gdGhlIHN0b3BwZWQgZ3JvdXAsIHNldCB0aGUgc2lnbmFsCisJCSAqIGZvciB0aGUgZnV0dXJlIHJlcG9ydHMuCisJCSAqIEZJWE1FOiB3ZSBzaG91bGQgY2hhbmdlIHB0cmFjZV9pbml0X3Rhc2soKSB0byBoYW5kbGUgdGhpcworCQkgKiBjYXNlLgorCQkgKi8KKwkJaWYgKCEoY2hpbGQtPmpvYmN0bCAmIEpPQkNUTF9TVE9QX1NJR01BU0spKQorCQkJY2hpbGQtPmpvYmN0bCB8PSBTSUdTVE9QOworCX0KKwogCS8qCiAJICogSWYgdHJhbnNpdGlvbiB0byBUQVNLX1NUT1BQRUQgaXMgcGVuZGluZyBvciBpbiBUQVNLX1RSQUNFRCwga2ljawogCSAqIEBjaGlsZCBpbiB0aGUgYnV0dC4gIE5vdGUgdGhhdCBAcmVzdW1lIHNob3VsZCBiZSB1c2VkIGlmZiBAY2hpbGQKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3UuaCBiL2tlcm5lbC9yY3UuaAppbmRleCBmNjAwODY4Li5hYTg4YmFhIDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1LmgKKysrIGIva2VybmVsL3JjdS5oCkBAIC0zMCw2ICszMCwxMyBAQAogI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfUkNVX1RSQUNFICovCiAKIC8qCisgKiBQcm9jZXNzLWxldmVsIGluY3JlbWVudCB0byAtPmR5bnRpY2tzX25lc3RpbmcgZmllbGQuICBUaGlzIGFsbG93cyBmb3IKKyAqIGFyY2hpdGVjdHVyZXMgdGhhdCB1c2UgaGFsZi1pbnRlcnJ1cHRzIGFuZCBoYWxmLWV4Y2VwdGlvbnMgZnJvbQorICogcHJvY2VzcyBjb250ZXh0LgorICovCisjZGVmaW5lIERZTlRJQ0tfVEFTS19ORVNUSU5HIChMTE9OR19NQVggLyAyIC0gMSkKKworLyoKICAqIGRlYnVnX3JjdV9oZWFkX3F1ZXVlKCkvZGVidWdfcmN1X2hlYWRfdW5xdWV1ZSgpIGFyZSB1c2VkIGludGVybmFsbHkKICAqIGJ5IGNhbGxfcmN1KCkgYW5kIHJjdSBjYWxsYmFjayBleGVjdXRpb24sIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCBwYXJ0IG9mIHRoZQogICogUkNVIEFQSS4gTGVhdmluZyBpbiByY3VwZGF0ZS5oIGJlY2F1c2UgdGhleSBhcmUgdXNlZCBieSBhbGwgUkNVIGZsYXZvcnMuCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1cGRhdGUuYyBiL2tlcm5lbC9yY3VwZGF0ZS5jCmluZGV4IGM1Yjk4ZTUuLjJiYzRlMTMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3VwZGF0ZS5jCisrKyBiL2tlcm5lbC9yY3VwZGF0ZS5jCkBAIC05Myw2ICs5Myw4IEBACiB7CiAJaWYgKCFkZWJ1Z19sb2NrZGVwX3JjdV9lbmFibGVkKCkpCiAJCXJldHVybiAxOworCWlmIChyY3VfaXNfY3B1X2lkbGUoKSkKKwkJcmV0dXJuIDA7CiAJcmV0dXJuIGluX3NvZnRpcnEoKSB8fCBpcnFzX2Rpc2FibGVkKCk7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChyY3VfcmVhZF9sb2NrX2JoX2hlbGQpOwpAQCAtMzE2LDMgKzMxOCwxMyBAQAogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHJjdWhlYWRfZGVidWdfZGVzY3IpOwogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfREVCVUdfT0JKRUNUU19SQ1VfSEVBRCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfVFJFRV9SQ1UpIHx8IGRlZmluZWQoQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UpIHx8IGRlZmluZWQoQ09ORklHX1JDVV9UUkFDRSkKK3ZvaWQgZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChjaGFyICpyY3V0b3J0dXJlbmFtZSwgc3RydWN0IHJjdV9oZWFkICpyaHApCit7CisJdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChyY3V0b3J0dXJlbmFtZSwgcmhwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGRvX3RyYWNlX3JjdV90b3J0dXJlX3JlYWQpOworI2Vsc2UKKyNkZWZpbmUgZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChyY3V0b3J0dXJlbmFtZSwgcmhwKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0aW55LmMgYi9rZXJuZWwvcmN1dGlueS5jCmluZGV4IDYzNmFmNmQuLjk3NzI5NmQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0aW55LmMKKysrIGIva2VybmVsL3JjdXRpbnkuYwpAQCAtNTMsMzEgKzUzLDEzNyBAQAogCiAjaW5jbHVkZSAicmN1dGlueV9wbHVnaW4uaCIKIAotI2lmZGVmIENPTkZJR19OT19IWgorc3RhdGljIGxvbmcgbG9uZyByY3VfZHludGlja3NfbmVzdGluZyA9IERZTlRJQ0tfVEFTS19ORVNUSU5HOwogCi1zdGF0aWMgbG9uZyByY3VfZHludGlja3NfbmVzdGluZyA9IDE7Ci0KLS8qCi0gKiBFbnRlciBkeW50aWNrcy1pZGxlIG1vZGUsIHdoaWNoIGlzIGFuIGV4dGVuZGVkIHF1aWVzY2VudCBzdGF0ZQotICogaWYgd2UgaGF2ZSBmdWxseSBlbnRlcmVkIHRoYXQgbW9kZSAoaS5lLiwgaWYgdGhlIG5ldyB2YWx1ZSBvZgotICogZHludGlja3NfbmVzdGluZyBpcyB6ZXJvKS4KLSAqLwotdm9pZCByY3VfZW50ZXJfbm9oeih2b2lkKQorLyogQ29tbW9uIGNvZGUgZm9yIHJjdV9pZGxlX2VudGVyKCkgYW5kIHJjdV9pcnFfZXhpdCgpLCBzZWUga2VybmVsL3JjdXRyZWUuYy4gKi8KK3N0YXRpYyB2b2lkIHJjdV9pZGxlX2VudGVyX2NvbW1vbihsb25nIGxvbmcgb2xkdmFsKQogewotCWlmICgtLXJjdV9keW50aWNrc19uZXN0aW5nID09IDApCi0JCXJjdV9zY2hlZF9xcygwKTsgLyogaW1wbGllcyByY3VfYmhfcXNjdHJfaW5jKDApICovCisJaWYgKHJjdV9keW50aWNrc19uZXN0aW5nKSB7CisJCVJDVV9UUkFDRSh0cmFjZV9yY3VfZHludGljaygiLS09IiwKKwkJCQkJICAgIG9sZHZhbCwgcmN1X2R5bnRpY2tzX25lc3RpbmcpKTsKKwkJcmV0dXJuOworCX0KKwlSQ1VfVFJBQ0UodHJhY2VfcmN1X2R5bnRpY2soIlN0YXJ0Iiwgb2xkdmFsLCByY3VfZHludGlja3NfbmVzdGluZykpOworCWlmICghaXNfaWRsZV90YXNrKGN1cnJlbnQpKSB7CisJCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSA9IGlkbGVfdGFzayhzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJCVJDVV9UUkFDRSh0cmFjZV9yY3VfZHludGljaygiRXJyb3Igb24gZW50cnk6IG5vdCBpZGxlIHRhc2siLAorCQkJCQkgICAgb2xkdmFsLCByY3VfZHludGlja3NfbmVzdGluZykpOworCQlmdHJhY2VfZHVtcChEVU1QX0FMTCk7CisJCVdBUk5fT05DRSgxLCAiQ3VycmVudCBwaWQ6ICVkIGNvbW06ICVzIC8gSWRsZSBwaWQ6ICVkIGNvbW06ICVzIiwKKwkJCSAgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLAorCQkJICBpZGxlLT5waWQsIGlkbGUtPmNvbW0pOyAvKiBtdXN0IGJlIGlkbGUgdGFzayEgKi8KKwl9CisJcmN1X3NjaGVkX3FzKDApOyAvKiBpbXBsaWVzIHJjdV9iaF9xc2N0cl9pbmMoMCkgKi8KIH0KIAogLyoKLSAqIEV4aXQgZHludGlja3MtaWRsZSBtb2RlLCBzbyB0aGF0IHdlIGFyZSBubyBsb25nZXIgaW4gYW4gZXh0ZW5kZWQKLSAqIHF1aWVzY2VudCBzdGF0ZS4KKyAqIEVudGVyIGlkbGUsIHdoaWNoIGlzIGFuIGV4dGVuZGVkIHF1aWVzY2VudCBzdGF0ZSBpZiB3ZSBoYXZlIGZ1bGx5CisgKiBlbnRlcmVkIHRoYXQgbW9kZSAoaS5lLiwgaWYgdGhlIG5ldyB2YWx1ZSBvZiBkeW50aWNrc19uZXN0aW5nIGlzIHplcm8pLgogICovCi12b2lkIHJjdV9leGl0X25vaHoodm9pZCkKK3ZvaWQgcmN1X2lkbGVfZW50ZXIodm9pZCkKIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvbmcgbG9uZyBvbGR2YWw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJb2xkdmFsID0gcmN1X2R5bnRpY2tzX25lc3Rpbmc7CisJcmN1X2R5bnRpY2tzX25lc3RpbmcgPSAwOworCXJjdV9pZGxlX2VudGVyX2NvbW1vbihvbGR2YWwpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIEV4aXQgYW4gaW50ZXJydXB0IGhhbmRsZXIgdG93YXJkcyBpZGxlLgorICovCit2b2lkIHJjdV9pcnFfZXhpdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyBsb25nIG9sZHZhbDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlvbGR2YWwgPSByY3VfZHludGlja3NfbmVzdGluZzsKKwlyY3VfZHludGlja3NfbmVzdGluZy0tOworCVdBUk5fT05fT05DRShyY3VfZHludGlja3NfbmVzdGluZyA8IDApOworCXJjdV9pZGxlX2VudGVyX2NvbW1vbihvbGR2YWwpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyogQ29tbW9uIGNvZGUgZm9yIHJjdV9pZGxlX2V4aXQoKSBhbmQgcmN1X2lycV9lbnRlcigpLCBzZWUga2VybmVsL3JjdXRyZWUuYy4gKi8KK3N0YXRpYyB2b2lkIHJjdV9pZGxlX2V4aXRfY29tbW9uKGxvbmcgbG9uZyBvbGR2YWwpCit7CisJaWYgKG9sZHZhbCkgeworCQlSQ1VfVFJBQ0UodHJhY2VfcmN1X2R5bnRpY2soIisrPSIsCisJCQkJCSAgICBvbGR2YWwsIHJjdV9keW50aWNrc19uZXN0aW5nKSk7CisJCXJldHVybjsKKwl9CisJUkNVX1RSQUNFKHRyYWNlX3JjdV9keW50aWNrKCJFbmQiLCBvbGR2YWwsIHJjdV9keW50aWNrc19uZXN0aW5nKSk7CisJaWYgKCFpc19pZGxlX3Rhc2soY3VycmVudCkpIHsKKwkJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlID0gaWRsZV90YXNrKHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwkJUkNVX1RSQUNFKHRyYWNlX3JjdV9keW50aWNrKCJFcnJvciBvbiBleGl0OiBub3QgaWRsZSB0YXNrIiwKKwkJCSAgb2xkdmFsLCByY3VfZHludGlja3NfbmVzdGluZykpOworCQlmdHJhY2VfZHVtcChEVU1QX0FMTCk7CisJCVdBUk5fT05DRSgxLCAiQ3VycmVudCBwaWQ6ICVkIGNvbW06ICVzIC8gSWRsZSBwaWQ6ICVkIGNvbW06ICVzIiwKKwkJCSAgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLAorCQkJICBpZGxlLT5waWQsIGlkbGUtPmNvbW0pOyAvKiBtdXN0IGJlIGlkbGUgdGFzayEgKi8KKwl9Cit9CisKKy8qCisgKiBFeGl0IGlkbGUsIHNvIHRoYXQgd2UgYXJlIG5vIGxvbmdlciBpbiBhbiBleHRlbmRlZCBxdWllc2NlbnQgc3RhdGUuCisgKi8KK3ZvaWQgcmN1X2lkbGVfZXhpdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyBsb25nIG9sZHZhbDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlvbGR2YWwgPSByY3VfZHludGlja3NfbmVzdGluZzsKKwlXQVJOX09OX09OQ0Uob2xkdmFsICE9IDApOworCXJjdV9keW50aWNrc19uZXN0aW5nID0gRFlOVElDS19UQVNLX05FU1RJTkc7CisJcmN1X2lkbGVfZXhpdF9jb21tb24ob2xkdmFsKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiBFbnRlciBhbiBpbnRlcnJ1cHQgaGFuZGxlciwgbW92aW5nIGF3YXkgZnJvbSBpZGxlLgorICovCit2b2lkIHJjdV9pcnFfZW50ZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvbmcgbG9uZyBvbGR2YWw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJb2xkdmFsID0gcmN1X2R5bnRpY2tzX25lc3Rpbmc7CiAJcmN1X2R5bnRpY2tzX25lc3RpbmcrKzsKKwlXQVJOX09OX09OQ0UocmN1X2R5bnRpY2tzX25lc3RpbmcgPT0gMCk7CisJcmN1X2lkbGVfZXhpdF9jb21tb24ob2xkdmFsKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLSNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCisjaWZkZWYgQ09ORklHX1BST1ZFX1JDVQorCisvKgorICogVGVzdCB3aGV0aGVyIFJDVSB0aGlua3MgdGhhdCB0aGUgY3VycmVudCBDUFUgaXMgaWRsZS4KKyAqLworaW50IHJjdV9pc19jcHVfaWRsZSh2b2lkKQoreworCXJldHVybiAhcmN1X2R5bnRpY2tzX25lc3Rpbmc7Cit9CitFWFBPUlRfU1lNQk9MKHJjdV9pc19jcHVfaWRsZSk7CisKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1BST1ZFX1JDVSAqLworCisvKgorICogVGVzdCB3aGV0aGVyIHRoZSBjdXJyZW50IENQVSB3YXMgaW50ZXJydXB0ZWQgZnJvbSBpZGxlLiAgTmVzdGVkCisgKiBpbnRlcnJ1cHRzIGRvbid0IGNvdW50LCB3ZSBtdXN0IGJlIHJ1bm5pbmcgYXQgdGhlIGZpcnN0IGludGVycnVwdAorICogbGV2ZWwuCisgKi8KK2ludCByY3VfaXNfY3B1X3JydXB0X2Zyb21faWRsZSh2b2lkKQoreworCXJldHVybiByY3VfZHludGlja3NfbmVzdGluZyA8PSAwOworfQogCiAvKgogICogSGVscGVyIGZ1bmN0aW9uIGZvciByY3Vfc2NoZWRfcXMoKSBhbmQgcmN1X2JoX3FzKCkuCkBAIC0xMjYsMTQgKzIzMiwxMyBAQAogCiAvKgogICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBzY2hlZHVsaW5nLWNsb2NrIGludGVycnVwdCBjYW1lIGZyb20gYW4gZXh0ZW5kZWQKLSAqIHF1aWVzY2VudCBzdGF0ZSwgYW5kLCBpZiBzbywgdGVsbCBSQ1UgYWJvdXQgaXQuCisgKiBxdWllc2NlbnQgc3RhdGUsIGFuZCwgaWYgc28sIHRlbGwgUkNVIGFib3V0IGl0LiAgVGhpcyBmdW5jdGlvbiBtdXN0CisgKiBiZSBjYWxsZWQgZnJvbSBoYXJkaXJxIGNvbnRleHQuICBJdCBpcyBub3JtYWxseSBjYWxsZWQgZnJvbSB0aGUKKyAqIHNjaGVkdWxpbmctY2xvY2sgaW50ZXJydXB0LgogICovCiB2b2lkIHJjdV9jaGVja19jYWxsYmFja3MoaW50IGNwdSwgaW50IHVzZXIpCiB7Ci0JaWYgKHVzZXIgfHwKLQkgICAgKGlkbGVfY3B1KGNwdSkgJiYKLQkgICAgICFpbl9zb2Z0aXJxKCkgJiYKLQkgICAgIGhhcmRpcnFfY291bnQoKSA8PSAoMSA8PCBIQVJESVJRX1NISUZUKSkpCisJaWYgKHVzZXIgfHwgcmN1X2lzX2NwdV9ycnVwdF9mcm9tX2lkbGUoKSkKIAkJcmN1X3NjaGVkX3FzKGNwdSk7CiAJZWxzZSBpZiAoIWluX3NvZnRpcnEoKSkKIAkJcmN1X2JoX3FzKGNwdSk7CkBAIC0xNTQsNyArMjU5LDExIEBACiAJLyogSWYgbm8gUkNVIGNhbGxiYWNrcyByZWFkeSB0byBpbnZva2UsIGp1c3QgcmV0dXJuLiAqLwogCWlmICgmcmNwLT5yY3VjYmxpc3QgPT0gcmNwLT5kb25ldGFpbCkgewogCQlSQ1VfVFJBQ0UodHJhY2VfcmN1X2JhdGNoX3N0YXJ0KHJjcC0+bmFtZSwgMCwgLTEpKTsKLQkJUkNVX1RSQUNFKHRyYWNlX3JjdV9iYXRjaF9lbmQocmNwLT5uYW1lLCAwKSk7CisJCVJDVV9UUkFDRSh0cmFjZV9yY3VfYmF0Y2hfZW5kKHJjcC0+bmFtZSwgMCwKKwkJCQkJICAgICAgQUNDRVNTX09OQ0UocmNwLT5yY3VjYmxpc3QpLAorCQkJCQkgICAgICBuZWVkX3Jlc2NoZWQoKSwKKwkJCQkJICAgICAgaXNfaWRsZV90YXNrKGN1cnJlbnQpLAorCQkJCQkgICAgICByY3VfaXNfY2FsbGJhY2tzX2t0aHJlYWQoKSkpOwogCQlyZXR1cm47CiAJfQogCkBAIC0xODMsNyArMjkyLDkgQEAKIAkJUkNVX1RSQUNFKGNiX2NvdW50KyspOwogCX0KIAlSQ1VfVFJBQ0UocmN1X3RyYWNlX3N1Yl9xbGVuKHJjcCwgY2JfY291bnQpKTsKLQlSQ1VfVFJBQ0UodHJhY2VfcmN1X2JhdGNoX2VuZChyY3AtPm5hbWUsIGNiX2NvdW50KSk7CisJUkNVX1RSQUNFKHRyYWNlX3JjdV9iYXRjaF9lbmQocmNwLT5uYW1lLCBjYl9jb3VudCwgMCwgbmVlZF9yZXNjaGVkKCksCisJCQkJICAgICAgaXNfaWRsZV90YXNrKGN1cnJlbnQpLAorCQkJCSAgICAgIHJjdV9pc19jYWxsYmFja3Nfa3RocmVhZCgpKSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJjdV9wcm9jZXNzX2NhbGxiYWNrcyhzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKnVudXNlZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0aW55X3BsdWdpbi5oIGIva2VybmVsL3JjdXRpbnlfcGx1Z2luLmgKaW5kZXggMmIwNDg0YS4uOWNiMWFlNCAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRpbnlfcGx1Z2luLmgKKysrIGIva2VybmVsL3JjdXRpbnlfcGx1Z2luLmgKQEAgLTMxMiw4ICszMTIsOCBAQAogCXJ0X211dGV4X2xvY2soJm10eCk7CiAJcnRfbXV0ZXhfdW5sb2NrKCZtdHgpOyAgLyogS2VlcCBsb2NrZGVwIGhhcHB5LiAqLwogCi0JcmV0dXJuIHJjdV9wcmVlbXB0X2N0cmxibGsuYm9vc3RfdGFza3MgIT0gTlVMTCB8fAotCSAgICAgICByY3VfcHJlZW1wdF9jdHJsYmxrLmV4cF90YXNrcyAhPSBOVUxMOworCXJldHVybiBBQ0NFU1NfT05DRShyY3VfcHJlZW1wdF9jdHJsYmxrLmJvb3N0X3Rhc2tzKSAhPSBOVUxMIHx8CisJICAgICAgIEFDQ0VTU19PTkNFKHJjdV9wcmVlbXB0X2N0cmxibGsuZXhwX3Rhc2tzKSAhPSBOVUxMOwogfQogCiAvKgpAQCAtODg1LDYgKzg4NSwxOSBAQAogCXdha2VfdXAoJnJjdV9rdGhyZWFkX3dxKTsKIH0KIAorI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UKKworLyoKKyAqIElzIHRoZSBjdXJyZW50IENQVSBydW5uaW5nIHRoZSBSQ1UtY2FsbGJhY2tzIGt0aHJlYWQ/CisgKiBDYWxsZXIgbXVzdCBoYXZlIHByZWVtcHRpb24gZGlzYWJsZWQuCisgKi8KK3N0YXRpYyBib29sIHJjdV9pc19jYWxsYmFja3Nfa3RocmVhZCh2b2lkKQoreworCXJldHVybiByY3Vfa3RocmVhZF90YXNrID09IGN1cnJlbnQ7Cit9CisKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1JDVV9UUkFDRSAqLworCiAvKgogICogVGhpcyBrdGhyZWFkIGludm9rZXMgUkNVIGNhbGxiYWNrcyB3aG9zZSBncmFjZSBwZXJpb2RzIGhhdmUKICAqIGVsYXBzZWQuICBJdCBpcyBhd2FrZW5lZCBhcyBuZWVkZWQsIGFuZCB0YWtlcyB0aGUgcGxhY2Ugb2YgdGhlCkBAIC05MzgsNiArOTUxLDE4IEBACiAJcmFpc2Vfc29mdGlycShSQ1VfU09GVElSUSk7CiB9CiAKKyNpZmRlZiBDT05GSUdfUkNVX1RSQUNFCisKKy8qCisgKiBUaGVyZSBpcyBubyBjYWxsYmFjayBrdGhyZWFkLCBzbyB0aGlzIHRocmVhZCBpcyBuZXZlciBpdC4KKyAqLworc3RhdGljIGJvb2wgcmN1X2lzX2NhbGxiYWNrc19rdGhyZWFkKHZvaWQpCit7CisJcmV0dXJuIGZhbHNlOworfQorCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UgKi8KKwogdm9pZCByY3VfaW5pdCh2b2lkKQogewogCW9wZW5fc29mdGlycShSQ1VfU09GVElSUSwgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0b3J0dXJlLmMgYi9rZXJuZWwvcmN1dG9ydHVyZS5jCmluZGV4IDc2NDgyNWMuLjg4ZjE3YjggMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0b3J0dXJlLmMKKysrIGIva2VybmVsL3JjdXRvcnR1cmUuYwpAQCAtNjEsOSArNjEsMTEgQEAKIHN0YXRpYyBpbnQgc2h1ZmZsZV9pbnRlcnZhbCA9IDM7IC8qIEludGVydmFsIGJldHdlZW4gc2h1ZmZsZXMgKGluIHNlYykqLwogc3RhdGljIGludCBzdHV0dGVyID0gNTsJCS8qIFN0YXJ0L3N0b3AgdGVzdGluZyBpbnRlcnZhbCAoaW4gc2VjKSAqLwogc3RhdGljIGludCBpcnFyZWFkZXIgPSAxOwkvKiBSQ1UgcmVhZGVycyBmcm9tIGlycSAodGltZXJzKS4gKi8KLXN0YXRpYyBpbnQgZnFzX2R1cmF0aW9uID0gMDsJLyogRHVyYXRpb24gb2YgYnVyc3RzICh1cyksIDAgdG8gZGlzYWJsZS4gKi8KLXN0YXRpYyBpbnQgZnFzX2hvbGRvZmYgPSAwOwkvKiBIb2xkIHRpbWUgd2l0aGluIGJ1cnN0ICh1cykuICovCitzdGF0aWMgaW50IGZxc19kdXJhdGlvbjsJLyogRHVyYXRpb24gb2YgYnVyc3RzICh1cyksIDAgdG8gZGlzYWJsZS4gKi8KK3N0YXRpYyBpbnQgZnFzX2hvbGRvZmY7CQkvKiBIb2xkIHRpbWUgd2l0aGluIGJ1cnN0ICh1cykuICovCiBzdGF0aWMgaW50IGZxc19zdHV0dGVyID0gMzsJLyogV2FpdCB0aW1lIGJldHdlZW4gYnVyc3RzIChzKS4gKi8KK3N0YXRpYyBpbnQgb25vZmZfaW50ZXJ2YWw7CS8qIFdhaXQgdGltZSBiZXR3ZWVuIENQVSBob3RwbHVncywgMD1kaXNhYmxlLiAqLworc3RhdGljIGludCBzaHV0ZG93bl9zZWNzOwkvKiBTaHV0ZG93biB0aW1lIChzKS4gIDw9MCBmb3Igbm8gc2h1dGRvd24uICovCiBzdGF0aWMgaW50IHRlc3RfYm9vc3QgPSAxOwkvKiBUZXN0IFJDVSBwcmlvIGJvb3N0OiAwPW5vLCAxPW1heWJlLCAyPXllcy4gKi8KIHN0YXRpYyBpbnQgdGVzdF9ib29zdF9pbnRlcnZhbCA9IDc7IC8qIEludGVydmFsIGJldHdlZW4gYm9vc3QgdGVzdHMsIHNlY29uZHMuICovCiBzdGF0aWMgaW50IHRlc3RfYm9vc3RfZHVyYXRpb24gPSA0OyAvKiBEdXJhdGlvbiBvZiBlYWNoIGJvb3N0IHRlc3QsIHNlY29uZHMuICovCkBAIC05MSw2ICs5MywxMCBAQAogTU9EVUxFX1BBUk1fREVTQyhmcXNfaG9sZG9mZiwgIkhvbGRvZmYgdGltZSB3aXRoaW4gZnFzIGJ1cnN0cyAodXMpIik7CiBtb2R1bGVfcGFyYW0oZnFzX3N0dXR0ZXIsIGludCwgMDQ0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKGZxc19zdHV0dGVyLCAiV2FpdCB0aW1lIGJldHdlZW4gZnFzIGJ1cnN0cyAocykiKTsKK21vZHVsZV9wYXJhbShvbm9mZl9pbnRlcnZhbCwgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Mob25vZmZfaW50ZXJ2YWwsICJUaW1lIGJldHdlZW4gQ1BVIGhvdHBsdWdzIChzKSwgMD1kaXNhYmxlIik7Cittb2R1bGVfcGFyYW0oc2h1dGRvd25fc2VjcywgaW50LCAwNDQ0KTsKK01PRFVMRV9QQVJNX0RFU0Moc2h1dGRvd25fc2VjcywgIlNodXRkb3duIHRpbWUgKHMpLCB6ZXJvIHRvIGRpc2FibGUuIik7CiBtb2R1bGVfcGFyYW0odGVzdF9ib29zdCwgaW50LCAwNDQ0KTsKIE1PRFVMRV9QQVJNX0RFU0ModGVzdF9ib29zdCwgIlRlc3QgUkNVIHByaW8gYm9vc3Q6IDA9bm8sIDE9bWF5YmUsIDI9eWVzLiIpOwogbW9kdWxlX3BhcmFtKHRlc3RfYm9vc3RfaW50ZXJ2YWwsIGludCwgMDQ0NCk7CkBAIC0xMTksNiArMTI1LDEwIEBACiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzdHV0dGVyX3Rhc2s7CiBzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpmcXNfdGFzazsKIHN0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmJvb3N0X3Rhc2tzW05SX0NQVVNdOworc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqc2h1dGRvd25fdGFzazsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm9ub2ZmX3Rhc2s7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCiAjZGVmaW5lIFJDVV9UT1JUVVJFX1BJUEVfTEVOIDEwCiAKQEAgLTE0OSw2ICsxNTksMTAgQEAKIHN0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RfZmFpbHVyZTsKIHN0YXRpYyBsb25nIG5fcmN1X3RvcnR1cmVfYm9vc3RzOwogc3RhdGljIGxvbmcgbl9yY3VfdG9ydHVyZV90aW1lcnM7CitzdGF0aWMgbG9uZyBuX29mZmxpbmVfYXR0ZW1wdHM7CitzdGF0aWMgbG9uZyBuX29mZmxpbmVfc3VjY2Vzc2VzOworc3RhdGljIGxvbmcgbl9vbmxpbmVfYXR0ZW1wdHM7CitzdGF0aWMgbG9uZyBuX29ubGluZV9zdWNjZXNzZXM7CiBzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCByY3VfdG9ydHVyZV9yZW1vdmVkOwogc3RhdGljIGNwdW1hc2tfdmFyX3Qgc2h1ZmZsZV90bXBfbWFzazsKIApAQCAtMTYwLDYgKzE3NCw4IEBACiAjZGVmaW5lIFJDVVRPUlRVUkVfUlVOTkFCTEVfSU5JVCAwCiAjZW5kaWYKIGludCByY3V0b3J0dXJlX3J1bm5hYmxlID0gUkNVVE9SVFVSRV9SVU5OQUJMRV9JTklUOworbW9kdWxlX3BhcmFtKHJjdXRvcnR1cmVfcnVubmFibGUsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKHJjdXRvcnR1cmVfcnVubmFibGUsICJTdGFydCByY3V0b3J0dXJlIGF0IGJvb3QiKTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgIWRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKQogI2RlZmluZSByY3VfY2FuX2Jvb3N0KCkgMQpAQCAtMTY3LDYgKzE4Myw3IEBACiAjZGVmaW5lIHJjdV9jYW5fYm9vc3QoKSAwCiAjZW5kaWYgLyogI2Vsc2UgI2lmIGRlZmluZWQoQ09ORklHX1JDVV9CT09TVCkgJiYgIWRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSAqLwogCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzaHV0ZG93bl90aW1lOwkvKiBqaWZmaWVzIHRvIHN5c3RlbSBzaHV0ZG93bi4gKi8KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGJvb3N0X3N0YXJ0dGltZTsJLyogamlmZmllcyBvZiBuZXh0IGJvb3N0IHRlc3Qgc3RhcnQuICovCiBERUZJTkVfTVVURVgoYm9vc3RfbXV0ZXgpOwkJLyogcHJvdGVjdCBzZXR0aW5nIGJvb3N0X3N0YXJ0dGltZSAqLwogCQkJCQkvKiAgYW5kIGJvb3N0IHRhc2sgY3JlYXRlL2Rlc3Ryb3kuICovCkBAIC0xODIsNiArMTk5LDkgQEAKICAqLwogc3RhdGljIERFRklORV9NVVRFWChmdWxsc3RvcF9tdXRleCk7CiAKKy8qIEZvcndhcmQgcmVmZXJlbmNlLiAqLworc3RhdGljIHZvaWQgcmN1X3RvcnR1cmVfY2xlYW51cCh2b2lkKTsKKwogLyoKICAqIERldGVjdCBhbmQgcmVzcG9uZCB0byBhIHN5c3RlbSBzaHV0ZG93bi4KICAqLwpAQCAtNjEyLDYgKzYzMiwzMCBAQAogCS5uYW1lCQk9ICJzcmN1IgogfTsKIAorc3RhdGljIGludCBzcmN1X3RvcnR1cmVfcmVhZF9sb2NrX3Jhdyh2b2lkKSBfX2FjcXVpcmVzKCZzcmN1X2N0bCkKK3sKKwlyZXR1cm4gc3JjdV9yZWFkX2xvY2tfcmF3KCZzcmN1X2N0bCk7Cit9CisKK3N0YXRpYyB2b2lkIHNyY3VfdG9ydHVyZV9yZWFkX3VubG9ja19yYXcoaW50IGlkeCkgX19yZWxlYXNlcygmc3JjdV9jdGwpCit7CisJc3JjdV9yZWFkX3VubG9ja19yYXcoJnNyY3VfY3RsLCBpZHgpOworfQorCitzdGF0aWMgc3RydWN0IHJjdV90b3J0dXJlX29wcyBzcmN1X3Jhd19vcHMgPSB7CisJLmluaXQJCT0gc3JjdV90b3J0dXJlX2luaXQsCisJLmNsZWFudXAJPSBzcmN1X3RvcnR1cmVfY2xlYW51cCwKKwkucmVhZGxvY2sJPSBzcmN1X3RvcnR1cmVfcmVhZF9sb2NrX3JhdywKKwkucmVhZF9kZWxheQk9IHNyY3VfcmVhZF9kZWxheSwKKwkucmVhZHVubG9jawk9IHNyY3VfdG9ydHVyZV9yZWFkX3VubG9ja19yYXcsCisJLmNvbXBsZXRlZAk9IHNyY3VfdG9ydHVyZV9jb21wbGV0ZWQsCisJLmRlZmVycmVkX2ZyZWUJPSByY3Vfc3luY190b3J0dXJlX2RlZmVycmVkX2ZyZWUsCisJLnN5bmMJCT0gc3JjdV90b3J0dXJlX3N5bmNocm9uaXplLAorCS5jYl9iYXJyaWVyCT0gTlVMTCwKKwkuc3RhdHMJCT0gc3JjdV90b3J0dXJlX3N0YXRzLAorCS5uYW1lCQk9ICJzcmN1X3JhdyIKK307CisKIHN0YXRpYyB2b2lkIHNyY3VfdG9ydHVyZV9zeW5jaHJvbml6ZV9leHBlZGl0ZWQodm9pZCkKIHsKIAlzeW5jaHJvbml6ZV9zcmN1X2V4cGVkaXRlZCgmc3JjdV9jdGwpOwpAQCAtOTEzLDYgKzk1NywxOCBAQAogCXJldHVybiAwOwogfQogCit2b2lkIHJjdXRvcnR1cmVfdHJhY2VfZHVtcCh2b2lkKQoreworCXN0YXRpYyBhdG9taWNfdCBiZWVuaGVyZSA9IEFUT01JQ19JTklUKDApOworCisJaWYgKGF0b21pY19yZWFkKCZiZWVuaGVyZSkpCisJCXJldHVybjsKKwlpZiAoYXRvbWljX3hjaGcoJmJlZW5oZXJlLCAxKSAhPSAwKQorCQlyZXR1cm47CisJZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChjdXJfb3BzLT5uYW1lLCAoc3RydWN0IHJjdV9oZWFkICopfjBVTCk7CisJZnRyYWNlX2R1bXAoRFVNUF9BTEwpOworfQorCiAvKgogICogUkNVIHRvcnR1cmUgcmVhZGVyIGZyb20gdGltZXIgaGFuZGxlci4gIERlcmVmZXJlbmNlcyByY3VfdG9ydHVyZV9jdXJyZW50LAogICogaW5jcmVtZW50aW5nIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQgb2YgdGhlIHBpcGVsaW5lIGFycmF5LiAgVGhlCkBAIC05MzQsNiArOTkwLDcgQEAKIAkJCQkgIHJjdV9yZWFkX2xvY2tfYmhfaGVsZCgpIHx8CiAJCQkJICByY3VfcmVhZF9sb2NrX3NjaGVkX2hlbGQoKSB8fAogCQkJCSAgc3JjdV9yZWFkX2xvY2tfaGVsZCgmc3JjdV9jdGwpKTsKKwlkb190cmFjZV9yY3VfdG9ydHVyZV9yZWFkKGN1cl9vcHMtPm5hbWUsICZwLT5ydG9ydF9yY3UpOwogCWlmIChwID09IE5VTEwpIHsKIAkJLyogTGVhdmUgYmVjYXVzZSByY3VfdG9ydHVyZV93cml0ZXIgaXMgbm90IHlldCB1bmRlcndheSAqLwogCQljdXJfb3BzLT5yZWFkdW5sb2NrKGlkeCk7CkBAIC05NTEsNiArMTAwOCw4IEBACiAJCS8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQuLi4gKi8KIAkJcGlwZV9jb3VudCA9IFJDVV9UT1JUVVJFX1BJUEVfTEVOOwogCX0KKwlpZiAocGlwZV9jb3VudCA+IDEpCisJCXJjdXRvcnR1cmVfdHJhY2VfZHVtcCgpOwogCV9fdGhpc19jcHVfaW5jKHJjdV90b3J0dXJlX2NvdW50W3BpcGVfY291bnRdKTsKIAljb21wbGV0ZWQgPSBjdXJfb3BzLT5jb21wbGV0ZWQoKSAtIGNvbXBsZXRlZDsKIAlpZiAoY29tcGxldGVkID4gUkNVX1RPUlRVUkVfUElQRV9MRU4pIHsKQEAgLTk5NCw2ICsxMDUzLDcgQEAKIAkJCQkJICByY3VfcmVhZF9sb2NrX2JoX2hlbGQoKSB8fAogCQkJCQkgIHJjdV9yZWFkX2xvY2tfc2NoZWRfaGVsZCgpIHx8CiAJCQkJCSAgc3JjdV9yZWFkX2xvY2tfaGVsZCgmc3JjdV9jdGwpKTsKKwkJZG9fdHJhY2VfcmN1X3RvcnR1cmVfcmVhZChjdXJfb3BzLT5uYW1lLCAmcC0+cnRvcnRfcmN1KTsKIAkJaWYgKHAgPT0gTlVMTCkgewogCQkJLyogV2FpdCBmb3IgcmN1X3RvcnR1cmVfd3JpdGVyIHRvIGdldCB1bmRlcndheSAqLwogCQkJY3VyX29wcy0+cmVhZHVubG9jayhpZHgpOwpAQCAtMTAwOSw2ICsxMDY5LDggQEAKIAkJCS8qIFNob3VsZCBub3QgaGFwcGVuLCBidXQuLi4gKi8KIAkJCXBpcGVfY291bnQgPSBSQ1VfVE9SVFVSRV9QSVBFX0xFTjsKIAkJfQorCQlpZiAocGlwZV9jb3VudCA+IDEpCisJCQlyY3V0b3J0dXJlX3RyYWNlX2R1bXAoKTsKIAkJX190aGlzX2NwdV9pbmMocmN1X3RvcnR1cmVfY291bnRbcGlwZV9jb3VudF0pOwogCQljb21wbGV0ZWQgPSBjdXJfb3BzLT5jb21wbGV0ZWQoKSAtIGNvbXBsZXRlZDsKIAkJaWYgKGNvbXBsZXRlZCA+IFJDVV9UT1JUVVJFX1BJUEVfTEVOKSB7CkBAIC0xMDU2LDcgKzExMTgsOCBAQAogCWNudCArPSBzcHJpbnRmKCZwYWdlW2NudF0sCiAJCSAgICAgICAicnRjOiAlcCB2ZXI6ICVsdSB0ZmxlOiAlZCBydGE6ICVkIHJ0YWY6ICVkIHJ0ZjogJWQgIgogCQkgICAgICAgInJ0bWJlOiAlZCBydGJrZTogJWxkIHJ0YnJlOiAlbGQgIgotCQkgICAgICAgInJ0YmY6ICVsZCBydGI6ICVsZCBudDogJWxkIiwKKwkJICAgICAgICJydGJmOiAlbGQgcnRiOiAlbGQgbnQ6ICVsZCAiCisJCSAgICAgICAib25vZmY6ICVsZC8lbGQ6JWxkLyVsZCIsCiAJCSAgICAgICByY3VfdG9ydHVyZV9jdXJyZW50LAogCQkgICAgICAgcmN1X3RvcnR1cmVfY3VycmVudF92ZXJzaW9uLAogCQkgICAgICAgbGlzdF9lbXB0eSgmcmN1X3RvcnR1cmVfZnJlZWxpc3QpLApAQCAtMTA2OCw3ICsxMTMxLDExIEBACiAJCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X3J0ZXJyb3IsCiAJCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2ZhaWx1cmUsCiAJCSAgICAgICBuX3JjdV90b3J0dXJlX2Jvb3N0cywKLQkJICAgICAgIG5fcmN1X3RvcnR1cmVfdGltZXJzKTsKKwkJICAgICAgIG5fcmN1X3RvcnR1cmVfdGltZXJzLAorCQkgICAgICAgbl9vbmxpbmVfc3VjY2Vzc2VzLAorCQkgICAgICAgbl9vbmxpbmVfYXR0ZW1wdHMsCisJCSAgICAgICBuX29mZmxpbmVfc3VjY2Vzc2VzLAorCQkgICAgICAgbl9vZmZsaW5lX2F0dGVtcHRzKTsKIAlpZiAoYXRvbWljX3JlYWQoJm5fcmN1X3RvcnR1cmVfbWJlcnJvcikgIT0gMCB8fAogCSAgICBuX3JjdV90b3J0dXJlX2Jvb3N0X2t0cmVycm9yICE9IDAgfHwKIAkgICAgbl9yY3VfdG9ydHVyZV9ib29zdF9ydGVycm9yICE9IDAgfHwKQEAgLTEyMzIsMTIgKzEyOTksMTQgQEAKIAkJInNodWZmbGVfaW50ZXJ2YWw9JWQgc3R1dHRlcj0lZCBpcnFyZWFkZXI9JWQgIgogCQkiZnFzX2R1cmF0aW9uPSVkIGZxc19ob2xkb2ZmPSVkIGZxc19zdHV0dGVyPSVkICIKIAkJInRlc3RfYm9vc3Q9JWQvJWQgdGVzdF9ib29zdF9pbnRlcnZhbD0lZCAiCi0JCSJ0ZXN0X2Jvb3N0X2R1cmF0aW9uPSVkXG4iLAorCQkidGVzdF9ib29zdF9kdXJhdGlvbj0lZCBzaHV0ZG93bl9zZWNzPSVkICIKKwkJIm9ub2ZmX2ludGVydmFsPSVkXG4iLAogCQl0b3J0dXJlX3R5cGUsIHRhZywgbnJlYWxyZWFkZXJzLCBuZmFrZXdyaXRlcnMsCiAJCXN0YXRfaW50ZXJ2YWwsIHZlcmJvc2UsIHRlc3Rfbm9faWRsZV9oeiwgc2h1ZmZsZV9pbnRlcnZhbCwKIAkJc3R1dHRlciwgaXJxcmVhZGVyLCBmcXNfZHVyYXRpb24sIGZxc19ob2xkb2ZmLCBmcXNfc3R1dHRlciwKIAkJdGVzdF9ib29zdCwgY3VyX29wcy0+Y2FuX2Jvb3N0LAotCQl0ZXN0X2Jvb3N0X2ludGVydmFsLCB0ZXN0X2Jvb3N0X2R1cmF0aW9uKTsKKwkJdGVzdF9ib29zdF9pbnRlcnZhbCwgdGVzdF9ib29zdF9kdXJhdGlvbiwgc2h1dGRvd25fc2VjcywKKwkJb25vZmZfaW50ZXJ2YWwpOwogfQogCiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHJjdXRvcnR1cmVfc2h1dGRvd25fbmIgPSB7CkBAIC0xMjg3LDYgKzEzNTYsMTMxIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qCisgKiBDYXVzZSB0aGUgcmN1dG9ydHVyZSB0ZXN0IHRvIHNodXRkb3duIHRoZSBzeXN0ZW0gYWZ0ZXIgdGhlIHRlc3QgaGFzCisgKiBydW4gZm9yIHRoZSB0aW1lIHNwZWNpZmllZCBieSB0aGUgc2h1dGRvd25fc2VjcyBtb2R1bGUgcGFyYW1ldGVyLgorICovCitzdGF0aWMgaW50CityY3VfdG9ydHVyZV9zaHV0ZG93bih2b2lkICphcmcpCit7CisJbG9uZyBkZWx0YTsKKwl1bnNpZ25lZCBsb25nIGppZmZpZXNfc25hcDsKKworCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfc2h1dGRvd24gdGFzayBzdGFydGVkIik7CisJamlmZmllc19zbmFwID0gQUNDRVNTX09OQ0UoamlmZmllcyk7CisJd2hpbGUgKFVMT05HX0NNUF9MVChqaWZmaWVzX3NuYXAsIHNodXRkb3duX3RpbWUpICYmCisJICAgICAgICFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpIHsKKwkJZGVsdGEgPSBzaHV0ZG93bl90aW1lIC0gamlmZmllc19zbmFwOworCQlpZiAodmVyYm9zZSkKKwkJCXByaW50ayhLRVJOX0FMRVJUICIlcyIgVE9SVFVSRV9GTEFHCisJCQkgICAgICAgInJjdV90b3J0dXJlX3NodXRkb3duIHRhc2s6ICVsdSAiCisJCQkgICAgICAgImppZmZpZXMgcmVtYWluaW5nXG4iLAorCQkJICAgICAgIHRvcnR1cmVfdHlwZSwgZGVsdGEpOworCQlzY2hlZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoZGVsdGEpOworCQlqaWZmaWVzX3NuYXAgPSBBQ0NFU1NfT05DRShqaWZmaWVzKTsKKwl9CisJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQlWRVJCT1NFX1BSSU5US19TVFJJTkcoInJjdV90b3J0dXJlX3NodXRkb3duIHRhc2sgc3RvcHBpbmciKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogT0ssIHNodXQgZG93biB0aGUgc3lzdGVtLiAqLworCisJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9zaHV0ZG93biB0YXNrIHNodXR0aW5nIGRvd24gc3lzdGVtIik7CisJc2h1dGRvd25fdGFzayA9IE5VTEw7CS8qIEF2b2lkIHNlbGYta2lsbCBkZWFkbG9jay4gKi8KKwlyY3VfdG9ydHVyZV9jbGVhbnVwKCk7CS8qIEdldCB0aGUgc3VjY2Vzcy9mYWlsdXJlIG1lc3NhZ2UuICovCisJa2VybmVsX3Bvd2VyX29mZigpOwkvKiBTaHV0IGRvd24gdGhlIHN5c3RlbS4gKi8KKwlyZXR1cm4gMDsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorCisvKgorICogRXhlY3V0ZSByYW5kb20gQ1BVLWhvdHBsdWcgb3BlcmF0aW9ucyBhdCB0aGUgaW50ZXJ2YWwgc3BlY2lmaWVkCisgKiBieSB0aGUgb25vZmZfaW50ZXJ2YWwuCisgKi8KK3N0YXRpYyBpbnQKK3JjdV90b3J0dXJlX29ub2ZmKHZvaWQgKmFyZykKK3sKKwlpbnQgY3B1OworCWludCBtYXhjcHUgPSAtMTsKKwlERUZJTkVfUkNVX1JBTkRPTShyYW5kKTsKKworCVZFUkJPU0VfUFJJTlRLX1NUUklORygicmN1X3RvcnR1cmVfb25vZmYgdGFzayBzdGFydGVkIik7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCW1heGNwdSA9IGNwdTsKKwlXQVJOX09OKG1heGNwdSA8IDApOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCWNwdSA9IChyY3VfcmFuZG9tKCZyYW5kKSA+PiA0KSAlIChtYXhjcHUgKyAxKTsKKwkJaWYgKGNwdV9vbmxpbmUoY3B1KSAmJiBjcHVfaXNfaG90cGx1Z2dhYmxlKGNwdSkpIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ayhLRVJOX0FMRVJUICIlcyIgVE9SVFVSRV9GTEFHCisJCQkJICAgICAgICJyY3VfdG9ydHVyZV9vbm9mZiB0YXNrOiBvZmZsaW5pbmcgJWRcbiIsCisJCQkJICAgICAgIHRvcnR1cmVfdHlwZSwgY3B1KTsKKwkJCW5fb2ZmbGluZV9hdHRlbXB0cysrOworCQkJaWYgKGNwdV9kb3duKGNwdSkgPT0gMCkgeworCQkJCWlmICh2ZXJib3NlKQorCQkJCQlwcmludGsoS0VSTl9BTEVSVCAiJXMiIFRPUlRVUkVfRkxBRworCQkJCQkgICAgICAgInJjdV90b3J0dXJlX29ub2ZmIHRhc2s6ICIKKwkJCQkJICAgICAgICJvZmZsaW5lZCAlZFxuIiwKKwkJCQkJICAgICAgIHRvcnR1cmVfdHlwZSwgY3B1KTsKKwkJCQluX29mZmxpbmVfc3VjY2Vzc2VzKys7CisJCQl9CisJCX0gZWxzZSBpZiAoY3B1X2lzX2hvdHBsdWdnYWJsZShjcHUpKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcmludGsoS0VSTl9BTEVSVCAiJXMiIFRPUlRVUkVfRkxBRworCQkJCSAgICAgICAicmN1X3RvcnR1cmVfb25vZmYgdGFzazogb25saW5pbmcgJWRcbiIsCisJCQkJICAgICAgIHRvcnR1cmVfdHlwZSwgY3B1KTsKKwkJCW5fb25saW5lX2F0dGVtcHRzKys7CisJCQlpZiAoY3B1X3VwKGNwdSkgPT0gMCkgeworCQkJCWlmICh2ZXJib3NlKQorCQkJCQlwcmludGsoS0VSTl9BTEVSVCAiJXMiIFRPUlRVUkVfRkxBRworCQkJCQkgICAgICAgInJjdV90b3J0dXJlX29ub2ZmIHRhc2s6ICIKKwkJCQkJICAgICAgICJvbmxpbmVkICVkXG4iLAorCQkJCQkgICAgICAgdG9ydHVyZV90eXBlLCBjcHUpOworCQkJCW5fb25saW5lX3N1Y2Nlc3NlcysrOworCQkJfQorCQl9CisJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZShvbm9mZl9pbnRlcnZhbCAqIEhaKTsKKwl9CisJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJyY3VfdG9ydHVyZV9vbm9mZiB0YXNrIHN0b3BwaW5nIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3JjdV90b3J0dXJlX29ub2ZmX2luaXQodm9pZCkKK3sKKwlpZiAob25vZmZfaW50ZXJ2YWwgPD0gMCkKKwkJcmV0dXJuIDA7CisJb25vZmZfdGFzayA9IGt0aHJlYWRfcnVuKHJjdV90b3J0dXJlX29ub2ZmLCBOVUxMLCAicmN1X3RvcnR1cmVfb25vZmYiKTsKKwlpZiAoSVNfRVJSKG9ub2ZmX3Rhc2spKSB7CisJCW9ub2ZmX3Rhc2sgPSBOVUxMOworCQlyZXR1cm4gUFRSX0VSUihvbm9mZl90YXNrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJjdV90b3J0dXJlX29ub2ZmX2NsZWFudXAodm9pZCkKK3sKKwlpZiAob25vZmZfdGFzayA9PSBOVUxMKQorCQlyZXR1cm47CisJVkVSQk9TRV9QUklOVEtfU1RSSU5HKCJTdG9wcGluZyByY3VfdG9ydHVyZV9vbm9mZiB0YXNrIik7CisJa3RocmVhZF9zdG9wKG9ub2ZmX3Rhc2spOworfQorCisjZWxzZSAvKiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCisKK3N0YXRpYyB2b2lkCityY3VfdG9ydHVyZV9vbm9mZl9pbml0KHZvaWQpCit7Cit9CisKK3N0YXRpYyB2b2lkIHJjdV90b3J0dXJlX29ub2ZmX2NsZWFudXAodm9pZCkKK3sKK30KKworI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUgKi8KKwogc3RhdGljIGludCByY3V0b3J0dXJlX2NwdV9ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJCSB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKQEAgLTEzOTEsNiArMTU4NSwxMSBAQAogCQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKIAkJCXJjdXRvcnR1cmVfYm9vc3Rlcl9jbGVhbnVwKGkpOwogCX0KKwlpZiAoc2h1dGRvd25fdGFzayAhPSBOVUxMKSB7CisJCVZFUkJPU0VfUFJJTlRLX1NUUklORygiU3RvcHBpbmcgcmN1X3RvcnR1cmVfc2h1dGRvd24gdGFzayIpOworCQlrdGhyZWFkX3N0b3Aoc2h1dGRvd25fdGFzayk7CisJfQorCXJjdV90b3J0dXJlX29ub2ZmX2NsZWFudXAoKTsKIAogCS8qIFdhaXQgZm9yIGFsbCBSQ1UgY2FsbGJhY2tzIHRvIGZpcmUuICAqLwogCkBAIC0xNDE2LDcgKzE2MTUsNyBAQAogCXN0YXRpYyBzdHJ1Y3QgcmN1X3RvcnR1cmVfb3BzICp0b3J0dXJlX29wc1tdID0KIAkJeyAmcmN1X29wcywgJnJjdV9zeW5jX29wcywgJnJjdV9leHBlZGl0ZWRfb3BzLAogCQkgICZyY3VfYmhfb3BzLCAmcmN1X2JoX3N5bmNfb3BzLCAmcmN1X2JoX2V4cGVkaXRlZF9vcHMsCi0JCSAgJnNyY3Vfb3BzLCAmc3JjdV9leHBlZGl0ZWRfb3BzLAorCQkgICZzcmN1X29wcywgJnNyY3VfcmF3X29wcywgJnNyY3VfZXhwZWRpdGVkX29wcywKIAkJICAmc2NoZWRfb3BzLCAmc2NoZWRfc3luY19vcHMsICZzY2hlZF9leHBlZGl0ZWRfb3BzLCB9OwogCiAJbXV0ZXhfbG9jaygmZnVsbHN0b3BfbXV0ZXgpOwpAQCAtMTYwNyw2ICsxODA2LDE4IEBACiAJCQl9CiAJCX0KIAl9CisJaWYgKHNodXRkb3duX3NlY3MgPiAwKSB7CisJCXNodXRkb3duX3RpbWUgPSBqaWZmaWVzICsgc2h1dGRvd25fc2VjcyAqIEhaOworCQlzaHV0ZG93bl90YXNrID0ga3RocmVhZF9ydW4ocmN1X3RvcnR1cmVfc2h1dGRvd24sIE5VTEwsCisJCQkJCSAgICAicmN1X3RvcnR1cmVfc2h1dGRvd24iKTsKKwkJaWYgKElTX0VSUihzaHV0ZG93bl90YXNrKSkgeworCQkJZmlyc3RlcnIgPSBQVFJfRVJSKHNodXRkb3duX3Rhc2spOworCQkJVkVSQk9TRV9QUklOVEtfRVJSU1RSSU5HKCJGYWlsZWQgdG8gY3JlYXRlIHNodXRkb3duIik7CisJCQlzaHV0ZG93bl90YXNrID0gTlVMTDsKKwkJCWdvdG8gdW53aW5kOworCQl9CisJfQorCXJjdV90b3J0dXJlX29ub2ZmX2luaXQoKTsKIAlyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJnJjdXRvcnR1cmVfc2h1dGRvd25fbmIpOwogCXJjdXRvcnR1cmVfcmVjb3JkX3Rlc3RfdHJhbnNpdGlvbigpOwogCW11dGV4X3VubG9jaygmZnVsbHN0b3BfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWUuYyBiL2tlcm5lbC9yY3V0cmVlLmMKaW5kZXggNmI3NmQ4MS4uNmM0YTY3MiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWUuYworKysgYi9rZXJuZWwvcmN1dHJlZS5jCkBAIC02OSw3ICs2OSw3IEBACiAJCU5VTV9SQ1VfTFZMXzMsIFwKIAkJTlVNX1JDVV9MVkxfNCwgLyogPT0gTUFYX1JDVV9MVkxTICovIFwKIAl9LCBcCi0JLnNpZ25hbGVkID0gUkNVX0dQX0lETEUsIFwKKwkuZnFzX3N0YXRlID0gUkNVX0dQX0lETEUsIFwKIAkuZ3BudW0gPSAtMzAwLCBcCiAJLmNvbXBsZXRlZCA9IC0zMDAsIFwKIAkub25vZmZsb2NrID0gX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEKCZzdHJ1Y3RuYW1lIyNfc3RhdGUub25vZmZsb2NrKSwgXApAQCAtMTk1LDEyICsxOTUsMTAgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJjdV9ub3RlX2NvbnRleHRfc3dpdGNoKTsKIAotI2lmZGVmIENPTkZJR19OT19IWgogREVGSU5FX1BFUl9DUFUoc3RydWN0IHJjdV9keW50aWNrcywgcmN1X2R5bnRpY2tzKSA9IHsKLQkuZHludGlja3NfbmVzdGluZyA9IDEsCisJLmR5bnRpY2tzX25lc3RpbmcgPSBEWU5USUNLX1RBU0tfTkVTVElORywKIAkuZHludGlja3MgPSBBVE9NSUNfSU5JVCgxKSwKIH07Ci0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLwogCiBzdGF0aWMgaW50IGJsaW1pdCA9IDEwOwkJLyogTWF4aW11bSBjYWxsYmFja3MgcGVyIHJjdV9kb19iYXRjaC4gKi8KIHN0YXRpYyBpbnQgcWhpbWFyayA9IDEwMDAwOwkvKiBJZiB0aGlzIG1hbnkgcGVuZGluZywgaWdub3JlIGJsaW1pdC4gKi8KQEAgLTMyOCwxMSArMzI2LDExIEBACiAJCXJldHVybiAxOwogCX0KIAotCS8qIElmIHByZWVtcHRpYmxlIFJDVSwgbm8gcG9pbnQgaW4gc2VuZGluZyByZXNjaGVkdWxlIElQSS4gKi8KLQlpZiAocmRwLT5wcmVlbXB0aWJsZSkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBUaGUgQ1BVIGlzIG9ubGluZSwgc28gc2VuZCBpdCBhIHJlc2NoZWR1bGUgSVBJLiAqLworCS8qCisJICogVGhlIENQVSBpcyBvbmxpbmUsIHNvIHNlbmQgaXQgYSByZXNjaGVkdWxlIElQSS4gIFRoaXMgZm9yY2VzCisJICogaXQgdGhyb3VnaCB0aGUgc2NoZWR1bGVyLCBhbmQgKGluZWZmaWNpZW50bHkpIGFsc28gaGFuZGxlcyBjYXNlcworCSAqIHdoZXJlIGlkbGUgbG9vcHMgZmFpbCB0byBpbmZvcm0gUkNVIGFib3V0IHRoZSBDUFUgYmVpbmcgaWRsZS4KKwkgKi8KIAlpZiAocmRwLT5jcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKQogCQlzbXBfc2VuZF9yZXNjaGVkdWxlKHJkcC0+Y3B1KTsKIAllbHNlCkBAIC0zNDMsNTkgKzM0MSwxODEgQEAKIAogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfU01QICovCiAKLSNpZmRlZiBDT05GSUdfTk9fSFoKLQotLyoqCi0gKiByY3VfZW50ZXJfbm9oeiAtIGluZm9ybSBSQ1UgdGhhdCBjdXJyZW50IENQVSBpcyBlbnRlcmluZyBub2h6CisvKgorICogcmN1X2lkbGVfZW50ZXJfY29tbW9uIC0gaW5mb3JtIFJDVSB0aGF0IGN1cnJlbnQgQ1BVIGlzIG1vdmluZyB0b3dhcmRzIGlkbGUKICAqCi0gKiBFbnRlciBub2h6IG1vZGUsIGluIG90aGVyIHdvcmRzLCAtbGVhdmUtIHRoZSBtb2RlIGluIHdoaWNoIFJDVQotICogcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIGNhbiBvY2N1ci4gIChUaG91Z2ggUkNVIHJlYWQtc2lkZQotICogY3JpdGljYWwgc2VjdGlvbnMgY2FuIG9jY3VyIGluIGlycSBoYW5kbGVycyBpbiBub2h6IG1vZGUsIGEgcG9zc2liaWxpdHkKLSAqIGhhbmRsZWQgYnkgcmN1X2lycV9lbnRlcigpIGFuZCByY3VfaXJxX2V4aXQoKSkuCisgKiBJZiB0aGUgbmV3IHZhbHVlIG9mIHRoZSAtPmR5bnRpY2tzX25lc3RpbmcgY291bnRlciBub3cgaXMgemVybywKKyAqIHdlIHJlYWxseSBoYXZlIGVudGVyZWQgaWRsZSwgYW5kIG11c3QgZG8gdGhlIGFwcHJvcHJpYXRlIGFjY291bnRpbmcuCisgKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBkaXNhYmxlZCBpbnRlcnJ1cHRzLgogICovCi12b2lkIHJjdV9lbnRlcl9ub2h6KHZvaWQpCitzdGF0aWMgdm9pZCByY3VfaWRsZV9lbnRlcl9jb21tb24oc3RydWN0IHJjdV9keW50aWNrcyAqcmR0cCwgbG9uZyBsb25nIG9sZHZhbCkKIHsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCByY3VfZHludGlja3MgKnJkdHA7CisJdHJhY2VfcmN1X2R5bnRpY2soIlN0YXJ0Iiwgb2xkdmFsLCAwKTsKKwlpZiAoIWlzX2lkbGVfdGFzayhjdXJyZW50KSkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUgPSBpZGxlX3Rhc2soc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlyZHRwID0gJl9fZ2V0X2NwdV92YXIocmN1X2R5bnRpY2tzKTsKLQlpZiAoLS1yZHRwLT5keW50aWNrc19uZXN0aW5nKSB7Ci0JCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQkJcmV0dXJuOworCQl0cmFjZV9yY3VfZHludGljaygiRXJyb3Igb24gZW50cnk6IG5vdCBpZGxlIHRhc2siLCBvbGR2YWwsIDApOworCQlmdHJhY2VfZHVtcChEVU1QX0FMTCk7CisJCVdBUk5fT05DRSgxLCAiQ3VycmVudCBwaWQ6ICVkIGNvbW06ICVzIC8gSWRsZSBwaWQ6ICVkIGNvbW06ICVzIiwKKwkJCSAgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLAorCQkJICBpZGxlLT5waWQsIGlkbGUtPmNvbW0pOyAvKiBtdXN0IGJlIGlkbGUgdGFzayEgKi8KIAl9Ci0JdHJhY2VfcmN1X2R5bnRpY2soIlN0YXJ0Iik7CisJcmN1X3ByZXBhcmVfZm9yX2lkbGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAkvKiBDUFVzIHNlZWluZyBhdG9taWNfaW5jKCkgbXVzdCBzZWUgcHJpb3IgUkNVIHJlYWQtc2lkZSBjcml0IHNlY3RzICovCiAJc21wX21iX19iZWZvcmVfYXRvbWljX2luYygpOyAgLyogU2VlIGFib3ZlLiAqLwogCWF0b21pY19pbmMoJnJkdHAtPmR5bnRpY2tzKTsKIAlzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKTsgIC8qIEZvcmNlIG9yZGVyaW5nIHdpdGggbmV4dCBzb2pvdXJuLiAqLwogCVdBUk5fT05fT05DRShhdG9taWNfcmVhZCgmcmR0cC0+ZHludGlja3MpICYgMHgxKTsKLQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKLS8qCi0gKiByY3VfZXhpdF9ub2h6IC0gaW5mb3JtIFJDVSB0aGF0IGN1cnJlbnQgQ1BVIGlzIGxlYXZpbmcgbm9oegorLyoqCisgKiByY3VfaWRsZV9lbnRlciAtIGluZm9ybSBSQ1UgdGhhdCBjdXJyZW50IENQVSBpcyBlbnRlcmluZyBpZGxlCiAgKgotICogRXhpdCBub2h6IG1vZGUsIGluIG90aGVyIHdvcmRzLCAtZW50ZXItIHRoZSBtb2RlIGluIHdoaWNoIFJDVQotICogcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIG5vcm1hbGx5IG9jY3VyLgorICogRW50ZXIgaWRsZSBtb2RlLCBpbiBvdGhlciB3b3JkcywgLWxlYXZlLSB0aGUgbW9kZSBpbiB3aGljaCBSQ1UKKyAqIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9ucyBjYW4gb2NjdXIuICAoVGhvdWdoIFJDVSByZWFkLXNpZGUKKyAqIGNyaXRpY2FsIHNlY3Rpb25zIGNhbiBvY2N1ciBpbiBpcnEgaGFuZGxlcnMgaW4gaWRsZSwgYSBwb3NzaWJpbGl0eQorICogaGFuZGxlZCBieSBpcnFfZW50ZXIoKSBhbmQgaXJxX2V4aXQoKS4pCisgKgorICogV2UgY3Jvd2JhciB0aGUgLT5keW50aWNrc19uZXN0aW5nIGZpZWxkIHRvIHplcm8gdG8gYWxsb3cgZm9yCisgKiB0aGUgcG9zc2liaWxpdHkgb2YgdXNlcm1vZGUgdXBjYWxscyBoYXZpbmcgbWVzc2VkIHVwIG91ciBjb3VudAorICogb2YgaW50ZXJydXB0IG5lc3RpbmcgbGV2ZWwgZHVyaW5nIHRoZSBwcmlvciBidXN5IHBlcmlvZC4KICAqLwotdm9pZCByY3VfZXhpdF9ub2h6KHZvaWQpCit2b2lkIHJjdV9pZGxlX2VudGVyKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIGxvbmcgb2xkdmFsOwogCXN0cnVjdCByY3VfZHludGlja3MgKnJkdHA7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJcmR0cCA9ICZfX2dldF9jcHVfdmFyKHJjdV9keW50aWNrcyk7Ci0JaWYgKHJkdHAtPmR5bnRpY2tzX25lc3RpbmcrKykgewotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JCXJldHVybjsKLQl9CisJb2xkdmFsID0gcmR0cC0+ZHludGlja3NfbmVzdGluZzsKKwlyZHRwLT5keW50aWNrc19uZXN0aW5nID0gMDsKKwlyY3VfaWRsZV9lbnRlcl9jb21tb24ocmR0cCwgb2xkdmFsKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qKgorICogcmN1X2lycV9leGl0IC0gaW5mb3JtIFJDVSB0aGF0IGN1cnJlbnQgQ1BVIGlzIGV4aXRpbmcgaXJxIHRvd2FyZHMgaWRsZQorICoKKyAqIEV4aXQgZnJvbSBhbiBpbnRlcnJ1cHQgaGFuZGxlciwgd2hpY2ggbWlnaHQgcG9zc2libHkgcmVzdWx0IGluIGVudGVyaW5nCisgKiBpZGxlIG1vZGUsIGluIG90aGVyIHdvcmRzLCBsZWF2aW5nIHRoZSBtb2RlIGluIHdoaWNoIHJlYWQtc2lkZSBjcml0aWNhbAorICogc2VjdGlvbnMgY2FuIG9jY3VyLgorICoKKyAqIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIGlkbGUgbG9vcCBuZXZlciBkb2VzIGFueXRoaW5nIHRoYXQgbWlnaHQKKyAqIHJlc3VsdCBpbiB1bmJhbGFuY2VkIGNhbGxzIHRvIGlycV9lbnRlcigpIGFuZCBpcnFfZXhpdCgpLiAgSWYgeW91cgorICogYXJjaGl0ZWN0dXJlIHZpb2xhdGVzIHRoaXMgYXNzdW1wdGlvbiwgUkNVIHdpbGwgZ2l2ZSB5b3Ugd2hhdCB5b3UKKyAqIGRlc2VydmUsIGdvb2QgYW5kIGhhcmQuICBCdXQgdmVyeSBpbmZyZXF1ZW50bHkgYW5kIGlycmVwcm9kdWNpYmx5LgorICoKKyAqIFVzZSB0aGluZ3MgbGlrZSB3b3JrIHF1ZXVlcyB0byB3b3JrIGFyb3VuZCB0aGlzIGxpbWl0YXRpb24uCisgKgorICogWW91IGhhdmUgYmVlbiB3YXJuZWQuCisgKi8KK3ZvaWQgcmN1X2lycV9leGl0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIGxvbmcgb2xkdmFsOworCXN0cnVjdCByY3VfZHludGlja3MgKnJkdHA7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmR0cCA9ICZfX2dldF9jcHVfdmFyKHJjdV9keW50aWNrcyk7CisJb2xkdmFsID0gcmR0cC0+ZHludGlja3NfbmVzdGluZzsKKwlyZHRwLT5keW50aWNrc19uZXN0aW5nLS07CisJV0FSTl9PTl9PTkNFKHJkdHAtPmR5bnRpY2tzX25lc3RpbmcgPCAwKTsKKwlpZiAocmR0cC0+ZHludGlja3NfbmVzdGluZykKKwkJdHJhY2VfcmN1X2R5bnRpY2soIi0tPSIsIG9sZHZhbCwgcmR0cC0+ZHludGlja3NfbmVzdGluZyk7CisJZWxzZQorCQlyY3VfaWRsZV9lbnRlcl9jb21tb24ocmR0cCwgb2xkdmFsKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qCisgKiByY3VfaWRsZV9leGl0X2NvbW1vbiAtIGluZm9ybSBSQ1UgdGhhdCBjdXJyZW50IENQVSBpcyBtb3ZpbmcgYXdheSBmcm9tIGlkbGUKKyAqCisgKiBJZiB0aGUgbmV3IHZhbHVlIG9mIHRoZSAtPmR5bnRpY2tzX25lc3RpbmcgY291bnRlciB3YXMgcHJldmlvdXNseSB6ZXJvLAorICogd2UgcmVhbGx5IGhhdmUgZXhpdGVkIGlkbGUsIGFuZCBtdXN0IGRvIHRoZSBhcHByb3ByaWF0ZSBhY2NvdW50aW5nLgorICogVGhlIGNhbGxlciBtdXN0IGhhdmUgZGlzYWJsZWQgaW50ZXJydXB0cy4KKyAqLworc3RhdGljIHZvaWQgcmN1X2lkbGVfZXhpdF9jb21tb24oc3RydWN0IHJjdV9keW50aWNrcyAqcmR0cCwgbG9uZyBsb25nIG9sZHZhbCkKK3sKIAlzbXBfbWJfX2JlZm9yZV9hdG9taWNfaW5jKCk7ICAvKiBGb3JjZSBvcmRlcmluZyB3L3ByZXZpb3VzIHNvam91cm4uICovCiAJYXRvbWljX2luYygmcmR0cC0+ZHludGlja3MpOwogCS8qIENQVXMgc2VlaW5nIGF0b21pY19pbmMoKSBtdXN0IHNlZSBsYXRlciBSQ1UgcmVhZC1zaWRlIGNyaXQgc2VjdHMgKi8KIAlzbXBfbWJfX2FmdGVyX2F0b21pY19pbmMoKTsgIC8qIFNlZSBhYm92ZS4gKi8KIAlXQVJOX09OX09OQ0UoIShhdG9taWNfcmVhZCgmcmR0cC0+ZHludGlja3MpICYgMHgxKSk7Ci0JdHJhY2VfcmN1X2R5bnRpY2soIkVuZCIpOworCXJjdV9jbGVhbnVwX2FmdGVyX2lkbGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwl0cmFjZV9yY3VfZHludGljaygiRW5kIiwgb2xkdmFsLCByZHRwLT5keW50aWNrc19uZXN0aW5nKTsKKwlpZiAoIWlzX2lkbGVfdGFzayhjdXJyZW50KSkgeworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUgPSBpZGxlX3Rhc2soc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCQl0cmFjZV9yY3VfZHludGljaygiRXJyb3Igb24gZXhpdDogbm90IGlkbGUgdGFzayIsCisJCQkJICBvbGR2YWwsIHJkdHAtPmR5bnRpY2tzX25lc3RpbmcpOworCQlmdHJhY2VfZHVtcChEVU1QX0FMTCk7CisJCVdBUk5fT05DRSgxLCAiQ3VycmVudCBwaWQ6ICVkIGNvbW06ICVzIC8gSWRsZSBwaWQ6ICVkIGNvbW06ICVzIiwKKwkJCSAgY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tLAorCQkJICBpZGxlLT5waWQsIGlkbGUtPmNvbW0pOyAvKiBtdXN0IGJlIGlkbGUgdGFzayEgKi8KKwl9Cit9CisKKy8qKgorICogcmN1X2lkbGVfZXhpdCAtIGluZm9ybSBSQ1UgdGhhdCBjdXJyZW50IENQVSBpcyBsZWF2aW5nIGlkbGUKKyAqCisgKiBFeGl0IGlkbGUgbW9kZSwgaW4gb3RoZXIgd29yZHMsIC1lbnRlci0gdGhlIG1vZGUgaW4gd2hpY2ggUkNVCisgKiByZWFkLXNpZGUgY3JpdGljYWwgc2VjdGlvbnMgY2FuIG9jY3VyLgorICoKKyAqIFdlIGNyb3diYXIgdGhlIC0+ZHludGlja3NfbmVzdGluZyBmaWVsZCB0byBEWU5USUNLX1RBU0tfTkVTVElORyB0bworICogYWxsb3cgZm9yIHRoZSBwb3NzaWJpbGl0eSBvZiB1c2VybW9kZSB1cGNhbGxzIG1lc3NpbmcgdXAgb3VyIGNvdW50CisgKiBvZiBpbnRlcnJ1cHQgbmVzdGluZyBsZXZlbCBkdXJpbmcgdGhlIGJ1c3kgcGVyaW9kIHRoYXQgaXMganVzdAorICogbm93IHN0YXJ0aW5nLgorICovCit2b2lkIHJjdV9pZGxlX2V4aXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCByY3VfZHludGlja3MgKnJkdHA7CisJbG9uZyBsb25nIG9sZHZhbDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwlyZHRwID0gJl9fZ2V0X2NwdV92YXIocmN1X2R5bnRpY2tzKTsKKwlvbGR2YWwgPSByZHRwLT5keW50aWNrc19uZXN0aW5nOworCVdBUk5fT05fT05DRShvbGR2YWwgIT0gMCk7CisJcmR0cC0+ZHludGlja3NfbmVzdGluZyA9IERZTlRJQ0tfVEFTS19ORVNUSU5HOworCXJjdV9pZGxlX2V4aXRfY29tbW9uKHJkdHAsIG9sZHZhbCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIHJjdV9pcnFfZW50ZXIgLSBpbmZvcm0gUkNVIHRoYXQgY3VycmVudCBDUFUgaXMgZW50ZXJpbmcgaXJxIGF3YXkgZnJvbSBpZGxlCisgKgorICogRW50ZXIgYW4gaW50ZXJydXB0IGhhbmRsZXIsIHdoaWNoIG1pZ2h0IHBvc3NpYmx5IHJlc3VsdCBpbiBleGl0aW5nCisgKiBpZGxlIG1vZGUsIGluIG90aGVyIHdvcmRzLCBlbnRlcmluZyB0aGUgbW9kZSBpbiB3aGljaCByZWFkLXNpZGUgY3JpdGljYWwKKyAqIHNlY3Rpb25zIGNhbiBvY2N1ci4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIExpbnV4IGtlcm5lbCBpcyBmdWxseSBjYXBhYmxlIG9mIGVudGVyaW5nIGFuIGludGVycnVwdAorICogaGFuZGxlciB0aGF0IGl0IG5ldmVyIGV4aXRzLCBmb3IgZXhhbXBsZSB3aGVuIGRvaW5nIHVwY2FsbHMgdG8KKyAqIHVzZXIgbW9kZSEgIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIGlkbGUgbG9vcCBuZXZlciBkb2VzIHVwY2FsbHMgdG8KKyAqIHVzZXIgbW9kZS4gIElmIHlvdXIgYXJjaGl0ZWN0dXJlIGRvZXMgZG8gdXBjYWxscyBmcm9tIHRoZSBpZGxlIGxvb3AgKG9yCisgKiBkb2VzIGFueXRoaW5nIGVsc2UgdGhhdCByZXN1bHRzIGluIHVuYmFsYW5jZWQgY2FsbHMgdG8gdGhlIGlycV9lbnRlcigpCisgKiBhbmQgaXJxX2V4aXQoKSBmdW5jdGlvbnMpLCBSQ1Ugd2lsbCBnaXZlIHlvdSB3aGF0IHlvdSBkZXNlcnZlLCBnb29kCisgKiBhbmQgaGFyZC4gIEJ1dCB2ZXJ5IGluZnJlcXVlbnRseSBhbmQgaXJyZXByb2R1Y2libHkuCisgKgorICogVXNlIHRoaW5ncyBsaWtlIHdvcmsgcXVldWVzIHRvIHdvcmsgYXJvdW5kIHRoaXMgbGltaXRhdGlvbi4KKyAqCisgKiBZb3UgaGF2ZSBiZWVuIHdhcm5lZC4KKyAqLwordm9pZCByY3VfaXJxX2VudGVyKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcmN1X2R5bnRpY2tzICpyZHRwOworCWxvbmcgbG9uZyBvbGR2YWw7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcmR0cCA9ICZfX2dldF9jcHVfdmFyKHJjdV9keW50aWNrcyk7CisJb2xkdmFsID0gcmR0cC0+ZHludGlja3NfbmVzdGluZzsKKwlyZHRwLT5keW50aWNrc19uZXN0aW5nKys7CisJV0FSTl9PTl9PTkNFKHJkdHAtPmR5bnRpY2tzX25lc3RpbmcgPT0gMCk7CisJaWYgKG9sZHZhbCkKKwkJdHJhY2VfcmN1X2R5bnRpY2soIisrPSIsIG9sZHZhbCwgcmR0cC0+ZHludGlja3NfbmVzdGluZyk7CisJZWxzZQorCQlyY3VfaWRsZV9leGl0X2NvbW1vbihyZHRwLCBvbGR2YWwpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KIApAQCAtNDQyLDI3ICs1NjIsMzcgQEAKIAlXQVJOX09OX09OQ0UoYXRvbWljX3JlYWQoJnJkdHAtPmR5bnRpY2tzKSAmIDB4MSk7CiB9CiAKLS8qKgotICogcmN1X2lycV9lbnRlciAtIGluZm9ybSBSQ1Ugb2YgZW50cnkgdG8gaGFyZCBpcnEgY29udGV4dAotICoKLSAqIElmIHRoZSBDUFUgd2FzIGlkbGUgd2l0aCBkeW5hbWljIHRpY2tzIGFjdGl2ZSwgdGhpcyB1cGRhdGVzIHRoZQotICogcmR0cC0+ZHludGlja3MgdG8gbGV0IHRoZSBSQ1UgaGFuZGxpbmcga25vdyB0aGF0IHRoZSBDUFUgaXMgYWN0aXZlLgotICovCi12b2lkIHJjdV9pcnFfZW50ZXIodm9pZCkKLXsKLQlyY3VfZXhpdF9ub2h6KCk7Ci19CisjaWZkZWYgQ09ORklHX1BST1ZFX1JDVQogCiAvKioKLSAqIHJjdV9pcnFfZXhpdCAtIGluZm9ybSBSQ1Ugb2YgZXhpdCBmcm9tIGhhcmQgaXJxIGNvbnRleHQKKyAqIHJjdV9pc19jcHVfaWRsZSAtIHNlZSBpZiBSQ1UgdGhpbmtzIHRoYXQgdGhlIGN1cnJlbnQgQ1BVIGlzIGlkbGUKICAqCi0gKiBJZiB0aGUgQ1BVIHdhcyBpZGxlIHdpdGggZHluYW1pYyB0aWNrcyBhY3RpdmUsIHVwZGF0ZSB0aGUgcmRwLT5keW50aWNrcwotICogdG8gcHV0IGxldCB0aGUgUkNVIGhhbmRsaW5nIGJlIGF3YXJlIHRoYXQgdGhlIENQVSBpcyBnb2luZyBiYWNrIHRvIGlkbGUKLSAqIHdpdGggbm8gdGlja3MuCisgKiBJZiB0aGUgY3VycmVudCBDUFUgaXMgaW4gaXRzIGlkbGUgbG9vcCBhbmQgaXMgbmVpdGhlciBpbiBhbiBpbnRlcnJ1cHQKKyAqIG9yIE5NSSBoYW5kbGVyLCByZXR1cm4gdHJ1ZS4KICAqLwotdm9pZCByY3VfaXJxX2V4aXQodm9pZCkKK2ludCByY3VfaXNfY3B1X2lkbGUodm9pZCkKIHsKLQlyY3VfZW50ZXJfbm9oeigpOworCWludCByZXQ7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwlyZXQgPSAoYXRvbWljX3JlYWQoJl9fZ2V0X2NwdV92YXIocmN1X2R5bnRpY2tzKS5keW50aWNrcykgJiAweDEpID09IDA7CisJcHJlZW1wdF9lbmFibGUoKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChyY3VfaXNfY3B1X2lkbGUpOworCisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19QUk9WRV9SQ1UgKi8KKworLyoqCisgKiByY3VfaXNfY3B1X3JydXB0X2Zyb21faWRsZSAtIHNlZSBpZiBpZGxlIG9yIGltbWVkaWF0ZWx5IGludGVycnVwdGVkIGZyb20gaWRsZQorICoKKyAqIElmIHRoZSBjdXJyZW50IENQVSBpcyBpZGxlIG9yIHJ1bm5pbmcgYXQgYSBmaXJzdC1sZXZlbCAobm90IG5lc3RlZCkKKyAqIGludGVycnVwdCBmcm9tIGlkbGUsIHJldHVybiB0cnVlLiAgVGhlIGNhbGxlciBtdXN0IGhhdmUgYXQgbGVhc3QKKyAqIGRpc2FibGVkIHByZWVtcHRpb24uCisgKi8KK2ludCByY3VfaXNfY3B1X3JydXB0X2Zyb21faWRsZSh2b2lkKQoreworCXJldHVybiBfX2dldF9jcHVfdmFyKHJjdV9keW50aWNrcykuZHludGlja3NfbmVzdGluZyA8PSAxOwogfQogCiAjaWZkZWYgQ09ORklHX1NNUApAQCAtNDc1LDcgKzYwNSw3IEBACiBzdGF0aWMgaW50IGR5bnRpY2tfc2F2ZV9wcm9ncmVzc19jb3VudGVyKHN0cnVjdCByY3VfZGF0YSAqcmRwKQogewogCXJkcC0+ZHludGlja3Nfc25hcCA9IGF0b21pY19hZGRfcmV0dXJuKDAsICZyZHAtPmR5bnRpY2tzLT5keW50aWNrcyk7Ci0JcmV0dXJuIDA7CisJcmV0dXJuIChyZHAtPmR5bnRpY2tzX3NuYXAgJiAweDEpID09IDA7CiB9CiAKIC8qCkBAIC01MTIsMjYgKzY0Miw2IEBACiAKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1NNUCAqLwogCi0jZWxzZSAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCi0KLSNpZmRlZiBDT05GSUdfU01QCi0KLXN0YXRpYyBpbnQgZHludGlja19zYXZlX3Byb2dyZXNzX2NvdW50ZXIoc3RydWN0IHJjdV9kYXRhICpyZHApCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmN1X2ltcGxpY2l0X2R5bnRpY2tzX3FzKHN0cnVjdCByY3VfZGF0YSAqcmRwKQotewotCXJldHVybiByY3VfaW1wbGljaXRfb2ZmbGluZV9xcyhyZHApOwotfQotCi0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19TTVAgKi8KLQotI2VuZGlmIC8qICNlbHNlICNpZmRlZiBDT05GSUdfTk9fSFogKi8KLQotaW50IHJjdV9jcHVfc3RhbGxfc3VwcHJlc3MgX19yZWFkX21vc3RseTsKLQogc3RhdGljIHZvaWQgcmVjb3JkX2dwX3N0YWxsX2NoZWNrX3RpbWUoc3RydWN0IHJjdV9zdGF0ZSAqcnNwKQogewogCXJzcC0+Z3Bfc3RhcnQgPSBqaWZmaWVzOwpAQCAtODY2LDggKzk3Niw4IEBACiAJLyogQWR2YW5jZSB0byBhIG5ldyBncmFjZSBwZXJpb2QgYW5kIGluaXRpYWxpemUgc3RhdGUuICovCiAJcnNwLT5ncG51bSsrOwogCXRyYWNlX3JjdV9ncmFjZV9wZXJpb2QocnNwLT5uYW1lLCByc3AtPmdwbnVtLCAic3RhcnQiKTsKLQlXQVJOX09OX09OQ0UocnNwLT5zaWduYWxlZCA9PSBSQ1VfR1BfSU5JVCk7Ci0JcnNwLT5zaWduYWxlZCA9IFJDVV9HUF9JTklUOyAvKiBIb2xkIG9mZiBmb3JjZV9xdWllc2NlbnRfc3RhdGUuICovCisJV0FSTl9PTl9PTkNFKHJzcC0+ZnFzX3N0YXRlID09IFJDVV9HUF9JTklUKTsKKwlyc3AtPmZxc19zdGF0ZSA9IFJDVV9HUF9JTklUOyAvKiBIb2xkIG9mZiBmb3JjZV9xdWllc2NlbnRfc3RhdGUuICovCiAJcnNwLT5qaWZmaWVzX2ZvcmNlX3FzID0gamlmZmllcyArIFJDVV9KSUZGSUVTX1RJTExfRk9SQ0VfUVM7CiAJcmVjb3JkX2dwX3N0YWxsX2NoZWNrX3RpbWUocnNwKTsKIApAQCAtODc3LDcgKzk4Nyw3IEBACiAJCXJucC0+cXNtYXNrID0gcm5wLT5xc21hc2tpbml0OwogCQlybnAtPmdwbnVtID0gcnNwLT5ncG51bTsKIAkJcm5wLT5jb21wbGV0ZWQgPSByc3AtPmNvbXBsZXRlZDsKLQkJcnNwLT5zaWduYWxlZCA9IFJDVV9TSUdOQUxfSU5JVDsgLyogZm9yY2VfcXVpZXNjZW50X3N0YXRlIE9LLiAqLworCQlyc3AtPmZxc19zdGF0ZSA9IFJDVV9TSUdOQUxfSU5JVDsgLyogZm9yY2VfcXVpZXNjZW50X3N0YXRlIE9LICovCiAJCXJjdV9zdGFydF9ncF9wZXJfY3B1KHJzcCwgcm5wLCByZHApOwogCQlyY3VfcHJlZW1wdF9ib29zdF9zdGFydF9ncChybnApOwogCQl0cmFjZV9yY3VfZ3JhY2VfcGVyaW9kX2luaXQocnNwLT5uYW1lLCBybnAtPmdwbnVtLApAQCAtOTI3LDcgKzEwMzcsNyBAQAogCiAJcm5wID0gcmN1X2dldF9yb290KHJzcCk7CiAJcmF3X3NwaW5fbG9jaygmcm5wLT5sb2NrKTsJCS8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZC4gKi8KLQlyc3AtPnNpZ25hbGVkID0gUkNVX1NJR05BTF9JTklUOyAvKiBmb3JjZV9xdWllc2NlbnRfc3RhdGUgbm93IE9LLiAqLworCXJzcC0+ZnFzX3N0YXRlID0gUkNVX1NJR05BTF9JTklUOyAvKiBmb3JjZV9xdWllc2NlbnRfc3RhdGUgbm93IE9LLiAqLwogCXJhd19zcGluX3VubG9jaygmcm5wLT5sb2NrKTsJCS8qIGlycXMgcmVtYWluIGRpc2FibGVkLiAqLwogCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZyc3AtPm9ub2ZmbG9jaywgZmxhZ3MpOwogfQpAQCAtOTkxLDcgKzExMDEsNyBAQAogCiAJcnNwLT5jb21wbGV0ZWQgPSByc3AtPmdwbnVtOyAgLyogRGVjbGFyZSB0aGUgZ3JhY2UgcGVyaW9kIGNvbXBsZXRlLiAqLwogCXRyYWNlX3JjdV9ncmFjZV9wZXJpb2QocnNwLT5uYW1lLCByc3AtPmNvbXBsZXRlZCwgImVuZCIpOwotCXJzcC0+c2lnbmFsZWQgPSBSQ1VfR1BfSURMRTsKKwlyc3AtPmZxc19zdGF0ZSA9IFJDVV9HUF9JRExFOwogCXJjdV9zdGFydF9ncChyc3AsIGZsYWdzKTsgIC8qIHJlbGVhc2VzIHJvb3Qgbm9kZSdzIHJucC0+bG9jay4gKi8KIH0KIApAQCAtMTIyMSw3ICsxMzMxLDcgQEAKIAllbHNlCiAJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKIAlpZiAobmVlZF9yZXBvcnQgJiBSQ1VfT0ZMX1RBU0tTX0VYUF9HUCkKLQkJcmN1X3JlcG9ydF9leHBfcm5wKHJzcCwgcm5wKTsKKwkJcmN1X3JlcG9ydF9leHBfcm5wKHJzcCwgcm5wLCB0cnVlKTsKIAlyY3Vfbm9kZV9rdGhyZWFkX3NldGFmZmluaXR5KHJucCwgLTEpOwogfQogCkBAIC0xMjYzLDcgKzEzNzMsOSBAQAogCS8qIElmIG5vIGNhbGxiYWNrcyBhcmUgcmVhZHksIGp1c3QgcmV0dXJuLiovCiAJaWYgKCFjcHVfaGFzX2NhbGxiYWNrc19yZWFkeV90b19pbnZva2UocmRwKSkgewogCQl0cmFjZV9yY3VfYmF0Y2hfc3RhcnQocnNwLT5uYW1lLCAwLCAwKTsKLQkJdHJhY2VfcmN1X2JhdGNoX2VuZChyc3AtPm5hbWUsIDApOworCQl0cmFjZV9yY3VfYmF0Y2hfZW5kKHJzcC0+bmFtZSwgMCwgISFBQ0NFU1NfT05DRShyZHAtPm54dGxpc3QpLAorCQkJCSAgICBuZWVkX3Jlc2NoZWQoKSwgaXNfaWRsZV90YXNrKGN1cnJlbnQpLAorCQkJCSAgICByY3VfaXNfY2FsbGJhY2tzX2t0aHJlYWQoKSk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyOTEsMTIgKzE0MDMsMTcgQEAKIAkJZGVidWdfcmN1X2hlYWRfdW5xdWV1ZShsaXN0KTsKIAkJX19yY3VfcmVjbGFpbShyc3AtPm5hbWUsIGxpc3QpOwogCQlsaXN0ID0gbmV4dDsKLQkJaWYgKCsrY291bnQgPj0gYmwpCisJCS8qIFN0b3Agb25seSBpZiBsaW1pdCByZWFjaGVkIGFuZCBDUFUgaGFzIHNvbWV0aGluZyB0byBkby4gKi8KKwkJaWYgKCsrY291bnQgPj0gYmwgJiYKKwkJICAgIChuZWVkX3Jlc2NoZWQoKSB8fAorCQkgICAgICghaXNfaWRsZV90YXNrKGN1cnJlbnQpICYmICFyY3VfaXNfY2FsbGJhY2tzX2t0aHJlYWQoKSkpKQogCQkJYnJlYWs7CiAJfQogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCXRyYWNlX3JjdV9iYXRjaF9lbmQocnNwLT5uYW1lLCBjb3VudCk7CisJdHJhY2VfcmN1X2JhdGNoX2VuZChyc3AtPm5hbWUsIGNvdW50LCAhIWxpc3QsIG5lZWRfcmVzY2hlZCgpLAorCQkJICAgIGlzX2lkbGVfdGFzayhjdXJyZW50KSwKKwkJCSAgICByY3VfaXNfY2FsbGJhY2tzX2t0aHJlYWQoKSk7CiAKIAkvKiBVcGRhdGUgY291bnQsIGFuZCByZXF1ZXVlIGFueSByZW1haW5pbmcgY2FsbGJhY2tzLiAqLwogCXJkcC0+cWxlbiAtPSBjb3VudDsKQEAgLTEzMzQsMTYgKzE0NTEsMTQgQEAKICAqICh1c2VyIG1vZGUgb3IgaWRsZSBsb29wIGZvciByY3UsIG5vbi1zb2Z0aXJxIGV4ZWN1dGlvbiBmb3IgcmN1X2JoKS4KICAqIEFsc28gc2NoZWR1bGUgUkNVIGNvcmUgcHJvY2Vzc2luZy4KICAqCi0gKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggaGFyZGlycXMgZGlzYWJsZWQuICBJdCBpcyBub3JtYWxseQorICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBmcm9tIGhhcmRpcnEgY29udGV4dC4gIEl0IGlzIG5vcm1hbGx5CiAgKiBpbnZva2VkIGZyb20gdGhlIHNjaGVkdWxpbmctY2xvY2sgaW50ZXJydXB0LiAgSWYgcmN1X3BlbmRpbmcgcmV0dXJucwogICogZmFsc2UsIHRoZXJlIGlzIG5vIHBvaW50IGluIGludm9raW5nIHJjdV9jaGVja19jYWxsYmFja3MoKS4KICAqLwogdm9pZCByY3VfY2hlY2tfY2FsbGJhY2tzKGludCBjcHUsIGludCB1c2VyKQogewogCXRyYWNlX3JjdV91dGlsaXphdGlvbigiU3RhcnQgc2NoZWR1bGVyLXRpY2siKTsKLQlpZiAodXNlciB8fAotCSAgICAoaWRsZV9jcHUoY3B1KSAmJiByY3Vfc2NoZWR1bGVyX2FjdGl2ZSAmJgotCSAgICAgIWluX3NvZnRpcnEoKSAmJiBoYXJkaXJxX2NvdW50KCkgPD0gKDEgPDwgSEFSRElSUV9TSElGVCkpKSB7CisJaWYgKHVzZXIgfHwgcmN1X2lzX2NwdV9ycnVwdF9mcm9tX2lkbGUoKSkgewogCiAJCS8qCiAJCSAqIEdldCBoZXJlIGlmIHRoaXMgQ1BVIHRvb2sgaXRzIGludGVycnVwdCBmcm9tIHVzZXIKQEAgLTE0NTcsNyArMTU3Miw3IEBACiAJCWdvdG8gdW5sb2NrX2Zxc19yZXQ7ICAvKiBubyBHUCBpbiBwcm9ncmVzcywgdGltZSB1cGRhdGVkLiAqLwogCX0KIAlyc3AtPmZxc19hY3RpdmUgPSAxOwotCXN3aXRjaCAocnNwLT5zaWduYWxlZCkgeworCXN3aXRjaCAocnNwLT5mcXNfc3RhdGUpIHsKIAljYXNlIFJDVV9HUF9JRExFOgogCWNhc2UgUkNVX0dQX0lOSVQ6CiAKQEAgLTE0NzMsNyArMTU4OCw3IEBACiAJCWZvcmNlX3FzX3JucChyc3AsIGR5bnRpY2tfc2F2ZV9wcm9ncmVzc19jb3VudGVyKTsKIAkJcmF3X3NwaW5fbG9jaygmcm5wLT5sb2NrKTsgIC8qIGlycXMgYWxyZWFkeSBkaXNhYmxlZCAqLwogCQlpZiAocmN1X2dwX2luX3Byb2dyZXNzKHJzcCkpCi0JCQlyc3AtPnNpZ25hbGVkID0gUkNVX0ZPUkNFX1FTOworCQkJcnNwLT5mcXNfc3RhdGUgPSBSQ1VfRk9SQ0VfUVM7CiAJCWJyZWFrOwogCiAJY2FzZSBSQ1VfRk9SQ0VfUVM6CkBAIC0xODEyLDcgKzE5MjcsNyBAQAogICogYnkgdGhlIGN1cnJlbnQgQ1BVLCBldmVuIGlmIG5vbmUgbmVlZCBiZSBkb25lIGltbWVkaWF0ZWx5LCByZXR1cm5pbmcKICAqIDEgaWYgc28uCiAgKi8KLXN0YXRpYyBpbnQgcmN1X25lZWRzX2NwdV9xdWlja19jaGVjayhpbnQgY3B1KQorc3RhdGljIGludCByY3VfY3B1X2hhc19jYWxsYmFja3MoaW50IGNwdSkKIHsKIAkvKiBSQ1UgY2FsbGJhY2tzIGVpdGhlciByZWFkeSBvciBwZW5kaW5nPyAqLwogCXJldHVybiBwZXJfY3B1KHJjdV9zY2hlZF9kYXRhLCBjcHUpLm54dGxpc3QgfHwKQEAgLTE5MTMsOSArMjAyOCw5IEBACiAJZm9yIChpID0gMDsgaSA8IFJDVV9ORVhUX1NJWkU7IGkrKykKIAkJcmRwLT5ueHR0YWlsW2ldID0gJnJkcC0+bnh0bGlzdDsKIAlyZHAtPnFsZW4gPSAwOwotI2lmZGVmIENPTkZJR19OT19IWgogCXJkcC0+ZHludGlja3MgPSAmcGVyX2NwdShyY3VfZHludGlja3MsIGNwdSk7Ci0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLworCVdBUk5fT05fT05DRShyZHAtPmR5bnRpY2tzLT5keW50aWNrc19uZXN0aW5nICE9IERZTlRJQ0tfVEFTS19ORVNUSU5HKTsKKwlXQVJOX09OX09OQ0UoYXRvbWljX3JlYWQoJnJkcC0+ZHludGlja3MtPmR5bnRpY2tzKSAhPSAxKTsKIAlyZHAtPmNwdSA9IGNwdTsKIAlyZHAtPnJzcCA9IHJzcDsKIAlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcm5wLT5sb2NrLCBmbGFncyk7CkBAIC0xOTQyLDYgKzIwNTcsMTAgQEAKIAlyZHAtPnFsZW5fbGFzdF9mcXNfY2hlY2sgPSAwOwogCXJkcC0+bl9mb3JjZV9xc19zbmFwID0gcnNwLT5uX2ZvcmNlX3FzOwogCXJkcC0+YmxpbWl0ID0gYmxpbWl0OworCXJkcC0+ZHludGlja3MtPmR5bnRpY2tzX25lc3RpbmcgPSBEWU5USUNLX1RBU0tfTkVTVElORzsKKwlhdG9taWNfc2V0KCZyZHAtPmR5bnRpY2tzLT5keW50aWNrcywKKwkJICAgKGF0b21pY19yZWFkKCZyZHAtPmR5bnRpY2tzLT5keW50aWNrcykgJiB+MHgxKSArIDEpOworCXJjdV9wcmVwYXJlX2Zvcl9pZGxlX2luaXQoY3B1KTsKIAlyYXdfc3Bpbl91bmxvY2soJnJucC0+bG9jayk7CQkvKiBpcnFzIHJlbWFpbiBkaXNhYmxlZC4gKi8KIAogCS8qCkBAIC0yMDIzLDYgKzIxNDIsNyBAQAogCQlyY3Vfc2VuZF9jYnNfdG9fb25saW5lKCZyY3VfYmhfc3RhdGUpOwogCQlyY3Vfc2VuZF9jYnNfdG9fb25saW5lKCZyY3Vfc2NoZWRfc3RhdGUpOwogCQlyY3VfcHJlZW1wdF9zZW5kX2Nic190b19vbmxpbmUoKTsKKwkJcmN1X2NsZWFudXBfYWZ0ZXJfaWRsZShjcHUpOwogCQlicmVhazsKIAljYXNlIENQVV9ERUFEOgogCWNhc2UgQ1BVX0RFQURfRlJPWkVOOgpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWUuaCBiL2tlcm5lbC9yY3V0cmVlLmgKaW5kZXggODQ5Y2U5ZS4uZmRkZmY5MiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWUuaAorKysgYi9rZXJuZWwvcmN1dHJlZS5oCkBAIC04NCw5ICs4NCwxMCBAQAogICogRHludGlja3MgcGVyLUNQVSBzdGF0ZS4KICAqLwogc3RydWN0IHJjdV9keW50aWNrcyB7Ci0JaW50IGR5bnRpY2tzX25lc3Rpbmc7CS8qIFRyYWNrIGlycS9wcm9jZXNzIG5lc3RpbmcgbGV2ZWwuICovCi0JaW50IGR5bnRpY2tzX25taV9uZXN0aW5nOyAvKiBUcmFjayBOTUkgbmVzdGluZyBsZXZlbC4gKi8KLQlhdG9taWNfdCBkeW50aWNrczsJLyogRXZlbiB2YWx1ZSBmb3IgZHludGlja3MtaWRsZSwgZWxzZSBvZGQuICovCisJbG9uZyBsb25nIGR5bnRpY2tzX25lc3Rpbmc7IC8qIFRyYWNrIGlycS9wcm9jZXNzIG5lc3RpbmcgbGV2ZWwuICovCisJCQkJICAgIC8qIFByb2Nlc3MgbGV2ZWwgaXMgd29ydGggTExPTkdfTUFYLzIuICovCisJaW50IGR5bnRpY2tzX25taV9uZXN0aW5nOyAgIC8qIFRyYWNrIE5NSSBuZXN0aW5nIGxldmVsLiAqLworCWF0b21pY190IGR5bnRpY2tzOwkgICAgLyogRXZlbiB2YWx1ZSBmb3IgaWRsZSwgZWxzZSBvZGQuICovCiB9OwogCiAvKiBSQ1UncyBrdGhyZWFkIHN0YXRlcyBmb3IgdHJhY2luZy4gKi8KQEAgLTI3NCwxNiArMjc1LDEyIEBACiAJCQkJCS8qIGRpZCBvdGhlciBDUFUgZm9yY2UgUVMgcmVjZW50bHk/ICovCiAJbG9uZwkJYmxpbWl0OwkJLyogVXBwZXIgbGltaXQgb24gYSBwcm9jZXNzZWQgYmF0Y2ggKi8KIAotI2lmZGVmIENPTkZJR19OT19IWgogCS8qIDMpIGR5bnRpY2tzIGludGVyZmFjZS4gKi8KIAlzdHJ1Y3QgcmN1X2R5bnRpY2tzICpkeW50aWNrczsJLyogU2hhcmVkIHBlci1DUFUgZHludGlja3Mgc3RhdGUuICovCiAJaW50IGR5bnRpY2tzX3NuYXA7CQkvKiBQZXItR1AgdHJhY2tpbmcgZm9yIGR5bnRpY2tzLiAqLwotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KIAogCS8qIDQpIHJlYXNvbnMgdGhpcyBDUFUgbmVlZGVkIHRvIGJlIGtpY2tlZCBieSBmb3JjZV9xdWllc2NlbnRfc3RhdGUgKi8KLSNpZmRlZiBDT05GSUdfTk9fSFoKIAl1bnNpZ25lZCBsb25nIGR5bnRpY2tzX2ZxczsJLyogS2lja2VkIGR1ZSB0byBkeW50aWNrcyBpZGxlLiAqLwotI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfTk9fSFogKi8KIAl1bnNpZ25lZCBsb25nIG9mZmxpbmVfZnFzOwkvKiBLaWNrZWQgZHVlIHRvIGJlaW5nIG9mZmxpbmUuICovCiAJdW5zaWduZWQgbG9uZyByZXNjaGVkX2lwaTsJLyogU2VudCBhIHJlc2NoZWQgSVBJLiAqLwogCkBAIC0zMDIsMTYgKzI5OSwxMiBAQAogCXN0cnVjdCByY3Vfc3RhdGUgKnJzcDsKIH07CiAKLS8qIFZhbHVlcyBmb3Igc2lnbmFsZWQgZmllbGQgaW4gc3RydWN0IHJjdV9zdGF0ZS4gKi8KKy8qIFZhbHVlcyBmb3IgZnFzX3N0YXRlIGZpZWxkIGluIHN0cnVjdCByY3Vfc3RhdGUuICovCiAjZGVmaW5lIFJDVV9HUF9JRExFCQkwCS8qIE5vIGdyYWNlIHBlcmlvZCBpbiBwcm9ncmVzcy4gKi8KICNkZWZpbmUgUkNVX0dQX0lOSVQJCTEJLyogR3JhY2UgcGVyaW9kIGJlaW5nIGluaXRpYWxpemVkLiAqLwogI2RlZmluZSBSQ1VfU0FWRV9EWU5USUNLCTIJLyogTmVlZCB0byBzY2FuIGR5bnRpY2sgc3RhdGUuICovCiAjZGVmaW5lIFJDVV9GT1JDRV9RUwkJMwkvKiBOZWVkIHRvIGZvcmNlIHF1aWVzY2VudCBzdGF0ZS4gKi8KLSNpZmRlZiBDT05GSUdfTk9fSFoKICNkZWZpbmUgUkNVX1NJR05BTF9JTklUCQlSQ1VfU0FWRV9EWU5USUNLCi0jZWxzZSAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCi0jZGVmaW5lIFJDVV9TSUdOQUxfSU5JVAkJUkNVX0ZPUkNFX1FTCi0jZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19OT19IWiAqLwogCiAjZGVmaW5lIFJDVV9KSUZGSUVTX1RJTExfRk9SQ0VfUVMJIDMJLyogZm9yIHJzcC0+amlmZmllc19mb3JjZV9xcyAqLwogCkBAIC0zNjEsNyArMzU0LDcgQEAKIAogCS8qIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFyZSBndWFyZGVkIGJ5IHRoZSByb290IHJjdV9ub2RlJ3MgbG9jay4gKi8KIAotCXU4CXNpZ25hbGVkIF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXA7CisJdTgJZnFzX3N0YXRlIF9fX19jYWNoZWxpbmVfaW50ZXJub2RlYWxpZ25lZF9pbl9zbXA7CiAJCQkJCQkvKiBGb3JjZSBRUyBzdGF0ZS4gKi8KIAl1OAlmcXNfYWN0aXZlOwkJCS8qIGZvcmNlX3F1aWVzY2VudF9zdGF0ZSgpICovCiAJCQkJCQkvKiAgaXMgcnVubmluZy4gKi8KQEAgLTQ1MSw3ICs0NDQsOCBAQAogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfcHJvY2Vzc19jYWxsYmFja3Modm9pZCk7CiB2b2lkIGNhbGxfcmN1KHN0cnVjdCByY3VfaGVhZCAqaGVhZCwgdm9pZCAoKmZ1bmMpKHN0cnVjdCByY3VfaGVhZCAqcmN1KSk7CiAjaWYgZGVmaW5lZChDT05GSUdfSE9UUExVR19DUFUpIHx8IGRlZmluZWQoQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UpCi1zdGF0aWMgdm9pZCByY3VfcmVwb3J0X2V4cF9ybnAoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X25vZGUgKnJucCk7CitzdGF0aWMgdm9pZCByY3VfcmVwb3J0X2V4cF9ybnAoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X25vZGUgKnJucCwKKwkJCSAgICAgICBib29sIHdha2UpOwogI2VuZGlmIC8qICNpZiBkZWZpbmVkKENPTkZJR19IT1RQTFVHX0NQVSkgfHwgZGVmaW5lZChDT05GSUdfVFJFRV9QUkVFTVBUX1JDVSkgKi8KIHN0YXRpYyBpbnQgcmN1X3ByZWVtcHRfcGVuZGluZyhpbnQgY3B1KTsKIHN0YXRpYyBpbnQgcmN1X3ByZWVtcHRfbmVlZHNfY3B1KGludCBjcHUpOwpAQCAtNDYxLDYgKzQ1NSw3IEBACiBzdGF0aWMgdm9pZCByY3VfaW5pdGlhdGVfYm9vc3Qoc3RydWN0IHJjdV9ub2RlICpybnAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfYm9vc3Rfc3RhcnRfZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApOwogc3RhdGljIHZvaWQgaW52b2tlX3JjdV9jYWxsYmFja3Nfa3RocmVhZCh2b2lkKTsKK3N0YXRpYyBib29sIHJjdV9pc19jYWxsYmFja3Nfa3RocmVhZCh2b2lkKTsKICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCiBzdGF0aWMgdm9pZCByY3VfcHJlZW1wdF9kb19jYWxsYmFja3Modm9pZCk7CiBzdGF0aWMgdm9pZCByY3VfYm9vc3Rfa3RocmVhZF9zZXRhZmZpbml0eShzdHJ1Y3QgcmN1X25vZGUgKnJucCwKQEAgLTQ3Myw1ICs0NjgsOCBAQAogI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUICovCiBzdGF0aWMgdm9pZCByY3VfY3B1X2t0aHJlYWRfc2V0cnQoaW50IGNwdSwgaW50IHRvX3J0KTsKIHN0YXRpYyB2b2lkIF9fY3B1aW5pdCByY3VfcHJlcGFyZV9rdGhyZWFkcyhpbnQgY3B1KTsKK3N0YXRpYyB2b2lkIHJjdV9wcmVwYXJlX2Zvcl9pZGxlX2luaXQoaW50IGNwdSk7CitzdGF0aWMgdm9pZCByY3VfY2xlYW51cF9hZnRlcl9pZGxlKGludCBjcHUpOworc3RhdGljIHZvaWQgcmN1X3ByZXBhcmVfZm9yX2lkbGUoaW50IGNwdSk7CiAKICNlbmRpZiAvKiAjaWZuZGVmIFJDVV9UUkVFX05PTkNPUkUgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlX3BsdWdpbi5oIGIva2VybmVsL3JjdXRyZWVfcGx1Z2luLmgKaW5kZXggNGI5YjlmOC4uOGJiMzVkNyAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWVfcGx1Z2luLmgKKysrIGIva2VybmVsL3JjdXRyZWVfcGx1Z2luLmgKQEAgLTMxMiw2ICszMTIsNyBAQAogewogCWludCBlbXB0eTsKIAlpbnQgZW1wdHlfZXhwOworCWludCBlbXB0eV9leHBfbm93OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJc3RydWN0IGxpc3RfaGVhZCAqbnA7CiAjaWZkZWYgQ09ORklHX1JDVV9CT09TVApAQCAtMzgyLDggKzM4MywxMCBAQAogCQkvKgogCQkgKiBJZiB0aGlzIHdhcyB0aGUgbGFzdCB0YXNrIG9uIHRoZSBjdXJyZW50IGxpc3QsIGFuZCBpZgogCQkgKiB3ZSBhcmVuJ3Qgd2FpdGluZyBvbiBhbnkgQ1BVcywgcmVwb3J0IHRoZSBxdWllc2NlbnQgc3RhdGUuCi0JCSAqIE5vdGUgdGhhdCByY3VfcmVwb3J0X3VuYmxvY2tfcXNfcm5wKCkgcmVsZWFzZXMgcm5wLT5sb2NrLgorCQkgKiBOb3RlIHRoYXQgcmN1X3JlcG9ydF91bmJsb2NrX3FzX3JucCgpIHJlbGVhc2VzIHJucC0+bG9jaywKKwkJICogc28gd2UgbXVzdCB0YWtlIGEgc25hcHNob3Qgb2YgdGhlIGV4cGVkaXRlZCBzdGF0ZS4KIAkJICovCisJCWVtcHR5X2V4cF9ub3cgPSAhcmN1X3ByZWVtcHRlZF9yZWFkZXJzX2V4cChybnApOwogCQlpZiAoIWVtcHR5ICYmICFyY3VfcHJlZW1wdF9ibG9ja2VkX3JlYWRlcnNfY2dwKHJucCkpIHsKIAkJCXRyYWNlX3JjdV9xdWllc2NlbnRfc3RhdGVfcmVwb3J0KCJwcmVlbXB0X3JjdSIsCiAJCQkJCQkJIHJucC0+Z3BudW0sCkBAIC00MDYsOCArNDA5LDggQEAKIAkJICogSWYgdGhpcyB3YXMgdGhlIGxhc3QgdGFzayBvbiB0aGUgZXhwZWRpdGVkIGxpc3RzLAogCQkgKiB0aGVuIHdlIG5lZWQgdG8gcmVwb3J0IHVwIHRoZSByY3Vfbm9kZSBoaWVyYXJjaHkuCiAJCSAqLwotCQlpZiAoIWVtcHR5X2V4cCAmJiAhcmN1X3ByZWVtcHRlZF9yZWFkZXJzX2V4cChybnApKQotCQkJcmN1X3JlcG9ydF9leHBfcm5wKCZyY3VfcHJlZW1wdF9zdGF0ZSwgcm5wKTsKKwkJaWYgKCFlbXB0eV9leHAgJiYgZW1wdHlfZXhwX25vdykKKwkJCXJjdV9yZXBvcnRfZXhwX3JucCgmcmN1X3ByZWVtcHRfc3RhdGUsIHJucCwgdHJ1ZSk7CiAJfSBlbHNlIHsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCX0KQEAgLTcyOSw5ICs3MzIsMTMgQEAKICAqIHJlY3Vyc2l2ZWx5IHVwIHRoZSB0cmVlLiAgKENhbG0gZG93biwgY2FsbSBkb3duLCB3ZSBkbyB0aGUgcmVjdXJzaW9uCiAgKiBpdGVyYXRpdmVseSEpCiAgKgorICogTW9zdCBjYWxsZXJzIHdpbGwgc2V0IHRoZSAid2FrZSIgZmxhZywgYnV0IHRoZSB0YXNrIGluaXRpYXRpbmcgdGhlCisgKiBleHBlZGl0ZWQgZ3JhY2UgcGVyaW9kIG5lZWQgbm90IHdha2UgaXRzZWxmLgorICoKICAqIENhbGxlciBtdXN0IGhvbGQgc3luY19yY3VfcHJlZW1wdF9leHBfbXV0ZXguCiAgKi8KLXN0YXRpYyB2b2lkIHJjdV9yZXBvcnRfZXhwX3JucChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHN0cnVjdCByY3Vfbm9kZSAqcm5wKQorc3RhdGljIHZvaWQgcmN1X3JlcG9ydF9leHBfcm5wKHN0cnVjdCByY3Vfc3RhdGUgKnJzcCwgc3RydWN0IHJjdV9ub2RlICpybnAsCisJCQkgICAgICAgYm9vbCB3YWtlKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBtYXNrOwpAQCAtNzQ0LDcgKzc1MSw4IEBACiAJCX0KIAkJaWYgKHJucC0+cGFyZW50ID09IE5VTEwpIHsKIAkJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZybnAtPmxvY2ssIGZsYWdzKTsKLQkJCXdha2VfdXAoJnN5bmNfcmN1X3ByZWVtcHRfZXhwX3dxKTsKKwkJCWlmICh3YWtlKQorCQkJCXdha2VfdXAoJnN5bmNfcmN1X3ByZWVtcHRfZXhwX3dxKTsKIAkJCWJyZWFrOwogCQl9CiAJCW1hc2sgPSBybnAtPmdycG1hc2s7CkBAIC03NzcsNyArNzg1LDcgQEAKIAkJbXVzdF93YWl0ID0gMTsKIAl9CiAJaWYgKCFtdXN0X3dhaXQpCi0JCXJjdV9yZXBvcnRfZXhwX3JucChyc3AsIHJucCk7CisJCXJjdV9yZXBvcnRfZXhwX3JucChyc3AsIHJucCwgZmFsc2UpOyAvKiBEb24ndCB3YWtlIHNlbGYuICovCiB9CiAKIC8qCkBAIC0xMDY5LDkgKzEwNzcsOSBAQAogICogcmVwb3J0IG9uIHRhc2tzIHByZWVtcHRlZCBpbiBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb25zIGR1cmluZwogICogZXhwZWRpdGVkIFJDVSBncmFjZSBwZXJpb2RzLgogICovCi1zdGF0aWMgdm9pZCByY3VfcmVwb3J0X2V4cF9ybnAoc3RydWN0IHJjdV9zdGF0ZSAqcnNwLCBzdHJ1Y3QgcmN1X25vZGUgKnJucCkKK3N0YXRpYyB2b2lkIHJjdV9yZXBvcnRfZXhwX3JucChzdHJ1Y3QgcmN1X3N0YXRlICpyc3AsIHN0cnVjdCByY3Vfbm9kZSAqcm5wLAorCQkJICAgICAgIGJvb2wgd2FrZSkKIHsKLQlyZXR1cm47CiB9CiAKICNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVICovCkBAIC0xMTU3LDggKzExNjUsNiBAQAogCiAjZW5kaWYgLyogI2Vsc2UgI2lmZGVmIENPTkZJR19SQ1VfVFJBQ0UgKi8KIAotc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSByY3VfYm9vc3RfY2xhc3M7Ci0KIC8qCiAgKiBDYXJyeSBvdXQgUkNVIHByaW9yaXR5IGJvb3N0aW5nIG9uIHRoZSB0YXNrIGluZGljYXRlZCBieSAtPmV4cF90YXNrcwogICogb3IgLT5ib29zdF90YXNrcywgYWR2YW5jaW5nIHRoZSBwb2ludGVyIHRvIHRoZSBuZXh0IHRhc2sgaW4gdGhlCkBAIC0xMjIxLDE1ICsxMjI3LDEzIEBACiAJICovCiAJdCA9IGNvbnRhaW5lcl9vZih0Yiwgc3RydWN0IHRhc2tfc3RydWN0LCByY3Vfbm9kZV9lbnRyeSk7CiAJcnRfbXV0ZXhfaW5pdF9wcm94eV9sb2NrZWQoJm10eCwgdCk7Ci0JLyogQXZvaWQgbG9ja2RlcCBmYWxzZSBwb3NpdGl2ZXMuICBUaGlzIHJ0X211dGV4IGlzIGl0cyBvd24gdGhpbmcuICovCi0JbG9ja2RlcF9zZXRfY2xhc3NfYW5kX25hbWUoJm10eC53YWl0X2xvY2ssICZyY3VfYm9vc3RfY2xhc3MsCi0JCQkJICAgInJjdV9ib29zdF9tdXRleCIpOwogCXQtPnJjdV9ib29zdF9tdXRleCA9ICZtdHg7CiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJucC0+bG9jaywgZmxhZ3MpOwogCXJ0X211dGV4X2xvY2soJm10eCk7ICAvKiBTaWRlIGVmZmVjdDogYm9vc3RzIHRhc2sgdCdzIHByaW9yaXR5LiAqLwogCXJ0X211dGV4X3VubG9jaygmbXR4KTsgIC8qIEtlZXAgbG9ja2RlcCBoYXBweS4gKi8KIAotCXJldHVybiBybnAtPmV4cF90YXNrcyAhPSBOVUxMIHx8IHJucC0+Ym9vc3RfdGFza3MgIT0gTlVMTDsKKwlyZXR1cm4gQUNDRVNTX09OQ0Uocm5wLT5leHBfdGFza3MpICE9IE5VTEwgfHwKKwkgICAgICAgQUNDRVNTX09OQ0Uocm5wLT5ib29zdF90YXNrcykgIT0gTlVMTDsKIH0KIAogLyoKQEAgLTEzMjksNiArMTMzMywxNSBAQAogfQogCiAvKgorICogSXMgdGhlIGN1cnJlbnQgQ1BVIHJ1bm5pbmcgdGhlIFJDVS1jYWxsYmFja3Mga3RocmVhZD8KKyAqIENhbGxlciBtdXN0IGhhdmUgcHJlZW1wdGlvbiBkaXNhYmxlZC4KKyAqLworc3RhdGljIGJvb2wgcmN1X2lzX2NhbGxiYWNrc19rdGhyZWFkKHZvaWQpCit7CisJcmV0dXJuIF9fZ2V0X2NwdV92YXIocmN1X2NwdV9rdGhyZWFkX3Rhc2spID09IGN1cnJlbnQ7Cit9CisKKy8qCiAgKiBTZXQgdGhlIGFmZmluaXR5IG9mIHRoZSBib29zdCBrdGhyZWFkLiAgVGhlIENQVS1ob3RwbHVnIGxvY2tzIGFyZQogICogaGVsZCwgc28gbm8gb25lIHNob3VsZCBiZSBtZXNzaW5nIHdpdGggdGhlIGV4aXN0ZW5jZSBvZiB0aGUgYm9vc3QKICAqIGt0aHJlYWQuCkBAIC0xNzcyLDYgKzE3ODUsMTEgQEAKIAlXQVJOX09OX09OQ0UoMSk7CiB9CiAKK3N0YXRpYyBib29sIHJjdV9pc19jYWxsYmFja3Nfa3RocmVhZCh2b2lkKQoreworCXJldHVybiBmYWxzZTsKK30KKwogc3RhdGljIHZvaWQgcmN1X3ByZWVtcHRfYm9vc3Rfc3RhcnRfZ3Aoc3RydWN0IHJjdV9ub2RlICpybnApCiB7CiB9CkBAIC0xOTA3LDcgKzE5MjUsNyBAQAogCQkgKiBncmFjZSBwZXJpb2Qgd29ya3MgZm9yIHVzLgogCQkgKi8KIAkJZ2V0X29ubGluZV9jcHVzKCk7Ci0JCXNuYXAgPSBhdG9taWNfcmVhZCgmc3luY19zY2hlZF9leHBlZGl0ZWRfc3RhcnRlZCkgLSAxOworCQlzbmFwID0gYXRvbWljX3JlYWQoJnN5bmNfc2NoZWRfZXhwZWRpdGVkX3N0YXJ0ZWQpOwogCQlzbXBfbWIoKTsgLyogZW5zdXJlIHJlYWQgaXMgYmVmb3JlIHRyeV9zdG9wX2NwdXMoKS4gKi8KIAl9CiAKQEAgLTE5MzksODggKzE5NTcsMjQzIEBACiAgKiAxIGlmIHNvLiAgVGhpcyBmdW5jdGlvbiBpcyBwYXJ0IG9mIHRoZSBSQ1UgaW1wbGVtZW50YXRpb247IGl0IGlzIC1ub3QtCiAgKiBhbiBleHBvcnRlZCBtZW1iZXIgb2YgdGhlIFJDVSBBUEkuCiAgKgotICogQmVjYXVzZSB3ZSBoYXZlIHByZWVtcHRpYmxlIFJDVSwganVzdCBjaGVjayB3aGV0aGVyIHRoaXMgQ1BVIG5lZWRzCi0gKiBhbnkgZmxhdm9yIG9mIFJDVS4gIERvIG5vdCBjaGV3IHVwIGxvdHMgb2YgQ1BVIGN5Y2xlcyB3aXRoIHByZWVtcHRpb24KLSAqIGRpc2FibGVkIGluIGEgbW9zdC1saWtlbHkgdmFpbiBhdHRlbXB0IHRvIGNhdXNlIFJDVSBub3QgdG8gbmVlZCB0aGlzIENQVS4KKyAqIEJlY2F1c2Ugd2Ugbm90IGhhdmUgUkNVX0ZBU1RfTk9fSFosIGp1c3QgY2hlY2sgd2hldGhlciB0aGlzIENQVSBuZWVkcworICogYW55IGZsYXZvciBvZiBSQ1UuCiAgKi8KIGludCByY3VfbmVlZHNfY3B1KGludCBjcHUpCiB7Ci0JcmV0dXJuIHJjdV9uZWVkc19jcHVfcXVpY2tfY2hlY2soY3B1KTsKKwlyZXR1cm4gcmN1X2NwdV9oYXNfY2FsbGJhY2tzKGNwdSk7Cit9CisKKy8qCisgKiBCZWNhdXNlIHdlIGRvIG5vdCBoYXZlIFJDVV9GQVNUX05PX0haLCBkb24ndCBib3RoZXIgaW5pdGlhbGl6aW5nIGZvciBpdC4KKyAqLworc3RhdGljIHZvaWQgcmN1X3ByZXBhcmVfZm9yX2lkbGVfaW5pdChpbnQgY3B1KQoreworfQorCisvKgorICogQmVjYXVzZSB3ZSBkbyBub3QgaGF2ZSBSQ1VfRkFTVF9OT19IWiwgZG9uJ3QgYm90aGVyIGNsZWFuaW5nIHVwCisgKiBhZnRlciBpdC4KKyAqLworc3RhdGljIHZvaWQgcmN1X2NsZWFudXBfYWZ0ZXJfaWRsZShpbnQgY3B1KQoreworfQorCisvKgorICogRG8gdGhlIGlkbGUtZW50cnkgZ3JhY2UtcGVyaW9kIHdvcmssIHdoaWNoLCBiZWNhdXNlIENPTkZJR19SQ1VfRkFTVF9OT19IWj15LAorICogaXMgbm90aGluZy4KKyAqLworc3RhdGljIHZvaWQgcmN1X3ByZXBhcmVfZm9yX2lkbGUoaW50IGNwdSkKK3sKIH0KIAogI2Vsc2UgLyogI2lmICFkZWZpbmVkKENPTkZJR19SQ1VfRkFTVF9OT19IWikgKi8KIAotI2RlZmluZSBSQ1VfTkVFRFNfQ1BVX0ZMVVNIRVMgNQorLyoKKyAqIFRoaXMgY29kZSBpcyBpbnZva2VkIHdoZW4gYSBDUFUgZ29lcyBpZGxlLCBhdCB3aGljaCBwb2ludCB3ZSB3YW50CisgKiB0byBoYXZlIHRoZSBDUFUgZG8gZXZlcnl0aGluZyByZXF1aXJlZCBmb3IgUkNVIHNvIHRoYXQgaXQgY2FuIGVudGVyCisgKiB0aGUgZW5lcmd5LWVmZmljaWVudCBkeW50aWNrLWlkbGUgbW9kZS4gIFRoaXMgaXMgaGFuZGxlZCBieSBhCisgKiBzdGF0ZSBtYWNoaW5lIGltcGxlbWVudGVkIGJ5IHJjdV9wcmVwYXJlX2Zvcl9pZGxlKCkgYmVsb3cuCisgKgorICogVGhlIGZvbGxvd2luZyB0aHJlZSBwcm9wcm9jZXNzb3Igc3ltYm9scyBjb250cm9sIHRoaXMgc3RhdGUgbWFjaGluZToKKyAqCisgKiBSQ1VfSURMRV9GTFVTSEVTIGdpdmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGF0IHdlIHdpbGwgYXR0ZW1wdAorICoJdG8gc2F0aXNmeSBSQ1UuICBCZXlvbmQgdGhpcyBwb2ludCwgaXQgaXMgYmV0dGVyIHRvIGluY3VyIGEgcGVyaW9kaWMKKyAqCXNjaGVkdWxpbmctY2xvY2sgaW50ZXJydXB0IHRoYW4gdG8gbG9vcCB0aHJvdWdoIHRoZSBzdGF0ZSBtYWNoaW5lCisgKglhdCBmdWxsIHBvd2VyLgorICogUkNVX0lETEVfT1BUX0ZMVVNIRVMgZ2l2ZXMgdGhlIG51bWJlciBvZiBSQ1VfSURMRV9GTFVTSEVTIHRoYXQgYXJlCisgKglvcHRpb25hbCBpZiBSQ1UgZG9lcyBub3QgbmVlZCBhbnl0aGluZyBpbW1lZGlhdGVseSBmcm9tIHRoaXMKKyAqCUNQVSwgZXZlbiBpZiB0aGlzIENQVSBzdGlsbCBoYXMgUkNVIGNhbGxiYWNrcyBxdWV1ZWQuICBUaGUgZmlyc3QKKyAqCXRpbWVzIHRocm91Z2ggdGhlIHN0YXRlIG1hY2hpbmUgYXJlIG1hbmRhdG9yeTogd2UgbmVlZCB0byBnaXZlCisgKgl0aGUgc3RhdGUgbWFjaGluZSBhIGNoYW5jZSB0byBjb21tdW5pY2F0ZSBhIHF1aWVzY2VudCBzdGF0ZQorICoJdG8gdGhlIFJDVSBjb3JlLgorICogUkNVX0lETEVfR1BfREVMQVkgZ2l2ZXMgdGhlIG51bWJlciBvZiBqaWZmaWVzIHRoYXQgYSBDUFUgaXMgcGVybWl0dGVkCisgKgl0byBzbGVlcCBpbiBkeW50aWNrLWlkbGUgbW9kZSB3aXRoIFJDVSBjYWxsYmFja3MgcGVuZGluZy4gIFRoaXMKKyAqCWlzIHNpemVkIHRvIGJlIHJvdWdobHkgb25lIFJDVSBncmFjZSBwZXJpb2QuICBUaG9zZSBlbmVyZ3ktZWZmaWNpZW5jeQorICoJYmVuY2htYXJrZXJzIHdobyBtaWdodCBvdGhlcndpc2UgYmUgdGVtcHRlZCB0byBzZXQgdGhpcyB0byBhIGxhcmdlCisgKgludW1iZXIsIGJlIHdhcm5lZDogU2V0dGluZyBSQ1VfSURMRV9HUF9ERUxBWSB0b28gaGlnaCBjYW4gaGFuZyB5b3VyCisgKglzeXN0ZW0uICBBbmQgaWYgeW91IGFyZSAtdGhhdC0gY29uY2VybmVkIGFib3V0IGVuZXJneSBlZmZpY2llbmN5LAorICoJanVzdCBwb3dlciB0aGUgc3lzdGVtIGRvd24gYW5kIGJlIGRvbmUgd2l0aCBpdCEKKyAqCisgKiBUaGUgdmFsdWVzIGJlbG93IHdvcmsgd2VsbCBpbiBwcmFjdGljZS4gIElmIGZ1dHVyZSB3b3JrbG9hZHMgcmVxdWlyZQorICogYWRqdXN0bWVudCwgdGhleSBjYW4gYmUgY29udmVydGVkIGludG8ga2VybmVsIGNvbmZpZyBwYXJhbWV0ZXJzLCB0aG91Z2gKKyAqIG1ha2luZyB0aGUgc3RhdGUgbWFjaGluZSBzbWFydGVyIG1pZ2h0IGJlIGEgYmV0dGVyIG9wdGlvbi4KKyAqLworI2RlZmluZSBSQ1VfSURMRV9GTFVTSEVTIDUJCS8qIE51bWJlciBvZiBkeW50aWNrLWlkbGUgdHJpZXMuICovCisjZGVmaW5lIFJDVV9JRExFX09QVF9GTFVTSEVTIDMJCS8qIE9wdGlvbmFsIGR5bnRpY2staWRsZSB0cmllcy4gKi8KKyNkZWZpbmUgUkNVX0lETEVfR1BfREVMQVkgNgkJLyogUm91Z2hseSBvbmUgZ3JhY2UgcGVyaW9kLiAqLworCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCByY3VfZHludGlja19kcmFpbik7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQgbG9uZywgcmN1X2R5bnRpY2tfaG9sZG9mZik7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGhydGltZXIsIHJjdV9pZGxlX2dwX3RpbWVyKTsKK3N0YXRpYyBrdGltZV90IHJjdV9pZGxlX2dwX3dhaXQ7CiAKIC8qCi0gKiBDaGVjayB0byBzZWUgaWYgYW55IGZ1dHVyZSBSQ1UtcmVsYXRlZCB3b3JrIHdpbGwgbmVlZCB0byBiZSBkb25lCi0gKiBieSB0aGUgY3VycmVudCBDUFUsIGV2ZW4gaWYgbm9uZSBuZWVkIGJlIGRvbmUgaW1tZWRpYXRlbHksIHJldHVybmluZwotICogMSBpZiBzby4gIFRoaXMgZnVuY3Rpb24gaXMgcGFydCBvZiB0aGUgUkNVIGltcGxlbWVudGF0aW9uOyBpdCBpcyAtbm90LQotICogYW4gZXhwb3J0ZWQgbWVtYmVyIG9mIHRoZSBSQ1UgQVBJLgorICogQWxsb3cgdGhlIENQVSB0byBlbnRlciBkeW50aWNrLWlkbGUgbW9kZSBpZiBlaXRoZXI6ICgxKSBUaGVyZSBhcmUgbm8KKyAqIGNhbGxiYWNrcyBvbiB0aGlzIENQVSwgKDIpIHRoaXMgQ1BVIGhhcyBub3QgeWV0IGF0dGVtcHRlZCB0byBlbnRlcgorICogZHludGljay1pZGxlIG1vZGUsIG9yICgzKSB0aGlzIENQVSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBhdHRlbXB0aW5nIHRvCisgKiBlbnRlciBkeW50aWNrLWlkbGUgbW9kZS4gIE90aGVyd2lzZSwgaWYgd2UgaGF2ZSByZWNlbnRseSB0cmllZCBhbmQgZmFpbGVkCisgKiB0byBlbnRlciBkeW50aWNrLWlkbGUgbW9kZSwgd2UgcmVmdXNlIHRvIHRyeSB0byBlbnRlciBpdC4gIEFmdGVyIGFsbCwKKyAqIGl0IGlzIGJldHRlciB0byBpbmN1ciBzY2hlZHVsaW5nLWNsb2NrIGludGVycnVwdHMgdGhhbiB0byBzcGluCisgKiBjb250aW51b3VzbHkgZm9yIHRoZSBzYW1lIHRpbWUgZHVyYXRpb24hCisgKi8KK2ludCByY3VfbmVlZHNfY3B1KGludCBjcHUpCit7CisJLyogSWYgbm8gY2FsbGJhY2tzLCBSQ1UgZG9lc24ndCBuZWVkIHRoZSBDUFUuICovCisJaWYgKCFyY3VfY3B1X2hhc19jYWxsYmFja3MoY3B1KSkKKwkJcmV0dXJuIDA7CisJLyogT3RoZXJ3aXNlLCBSQ1UgbmVlZHMgdGhlIENQVSBvbmx5IGlmIGl0IHJlY2VudGx5IHRyaWVkIGFuZCBmYWlsZWQuICovCisJcmV0dXJuIHBlcl9jcHUocmN1X2R5bnRpY2tfaG9sZG9mZiwgY3B1KSA9PSBqaWZmaWVzOworfQorCisvKgorICogVGltZXIgaGFuZGxlciB1c2VkIHRvIGZvcmNlIENQVSB0byBzdGFydCBwdXNoaW5nIGl0cyByZW1haW5pbmcgUkNVCisgKiBjYWxsYmFja3MgaW4gdGhlIGNhc2Ugd2hlcmUgaXQgZW50ZXJlZCBkeW50aWNrLWlkbGUgbW9kZSB3aXRoIGNhbGxiYWNrcworICogcGVuZGluZy4gIFRoZSBoYW5kZXIgZG9lc24ndCByZWFsbHkgbmVlZCB0byBkbyBhbnl0aGluZyBiZWNhdXNlIHRoZQorICogcmVhbCB3b3JrIGlzIGRvbmUgdXBvbiByZS1lbnRyeSB0byBpZGxlLCBvciBieSB0aGUgbmV4dCBzY2hlZHVsaW5nLWNsb2NrCisgKiBpbnRlcnJ1cHQgc2hvdWxkIGlkbGUgbm90IGJlIHJlLWVudGVyZWQuCisgKi8KK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCByY3VfaWRsZV9ncF90aW1lcl9mdW5jKHN0cnVjdCBocnRpbWVyICpocnRwKQoreworCXRyYWNlX3JjdV9wcmVwX2lkbGUoIlRpbWVyIik7CisJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgdGltZXIgdXNlZCB0byBwdWxsIENQVXMgb3V0IG9mIGR5bnRpY2staWRsZSBtb2RlLgorICovCitzdGF0aWMgdm9pZCByY3VfcHJlcGFyZV9mb3JfaWRsZV9pbml0KGludCBjcHUpCit7CisJc3RhdGljIGludCBmaXJzdHRpbWUgPSAxOworCXN0cnVjdCBocnRpbWVyICpocnRwID0gJnBlcl9jcHUocmN1X2lkbGVfZ3BfdGltZXIsIGNwdSk7CisKKwlocnRpbWVyX2luaXQoaHJ0cCwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKKwlocnRwLT5mdW5jdGlvbiA9IHJjdV9pZGxlX2dwX3RpbWVyX2Z1bmM7CisJaWYgKGZpcnN0dGltZSkgeworCQl1bnNpZ25lZCBpbnQgdXBqID0gamlmZmllc190b191c2VjcyhSQ1VfSURMRV9HUF9ERUxBWSk7CisKKwkJcmN1X2lkbGVfZ3Bfd2FpdCA9IG5zX3RvX2t0aW1lKHVwaiAqICh1NjQpMTAwMCk7CisJCWZpcnN0dGltZSA9IDA7CisJfQorfQorCisvKgorICogQ2xlYW4gdXAgZm9yIGV4aXQgZnJvbSBpZGxlLiAgQmVjYXVzZSB3ZSBhcmUgZXhpdGluZyBmcm9tIGlkbGUsIHRoZXJlCisgKiBpcyBubyBsb25nZXIgYW55IHBvaW50IHRvIHJjdV9pZGxlX2dwX3RpbWVyLCBzbyBjYW5jZWwgaXQuICBUaGlzIHdpbGwKKyAqIGRvIG5vdGhpbmcgaWYgdGhpcyB0aW1lciBpcyBub3QgYWN0aXZlLCBzbyBqdXN0IGNhbmNlbCBpdCB1bmNvbmRpdGlvbmFsbHkuCisgKi8KK3N0YXRpYyB2b2lkIHJjdV9jbGVhbnVwX2FmdGVyX2lkbGUoaW50IGNwdSkKK3sKKwlocnRpbWVyX2NhbmNlbCgmcGVyX2NwdShyY3VfaWRsZV9ncF90aW1lciwgY3B1KSk7Cit9CisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgYW55IFJDVS1yZWxhdGVkIHdvcmsgY2FuIGJlIGRvbmUgYnkgdGhlIGN1cnJlbnQgQ1BVLAorICogYW5kIGlmIHNvLCBzY2hlZHVsZSBhIHNvZnRpcnEgdG8gZ2V0IGl0IGRvbmUuICBUaGlzIGZ1bmN0aW9uIGlzIHBhcnQKKyAqIG9mIHRoZSBSQ1UgaW1wbGVtZW50YXRpb247IGl0IGlzIC1ub3QtIGFuIGV4cG9ydGVkIG1lbWJlciBvZiB0aGUgUkNVIEFQSS4KICAqCi0gKiBCZWNhdXNlIHdlIGFyZSBub3Qgc3VwcG9ydGluZyBwcmVlbXB0aWJsZSBSQ1UsIGF0dGVtcHQgdG8gYWNjZWxlcmF0ZQotICogYW55IGN1cnJlbnQgZ3JhY2UgcGVyaW9kcyBzbyB0aGF0IFJDVSBubyBsb25nZXIgbmVlZHMgdGhpcyBDUFUsIGJ1dAotICogb25seSBpZiBhbGwgb3RoZXIgQ1BVcyBhcmUgYWxyZWFkeSBpbiBkeW50aWNrcy1pZGxlIG1vZGUuICBUaGlzIHdpbGwKLSAqIGFsbG93IHRoZSBDUFUgY29yZXMgdG8gYmUgcG93ZXJlZCBkb3duIGltbWVkaWF0ZWx5LCBhcyBvcHBvc2VkIHRvIGFmdGVyCi0gKiB3YWl0aW5nIG1hbnkgbWlsbGlzZWNvbmRzIGZvciBncmFjZSBwZXJpb2RzIHRvIGVsYXBzZS4KKyAqIFRoZSBpZGVhIGlzIGZvciB0aGUgY3VycmVudCBDUFUgdG8gY2xlYXIgb3V0IGFsbCB3b3JrIHJlcXVpcmVkIGJ5IHRoZQorICogUkNVIGNvcmUgZm9yIHRoZSBjdXJyZW50IGdyYWNlIHBlcmlvZCwgc28gdGhhdCB0aGlzIENQVSBjYW4gYmUgcGVybWl0dGVkCisgKiB0byBlbnRlciBkeW50aWNrLWlkbGUgbW9kZS4gIEluIHNvbWUgY2FzZXMsIGl0IHdpbGwgbmVlZCB0byBiZSBhd2FrZW5lZAorICogYXQgdGhlIGVuZCBvZiB0aGUgZ3JhY2UgcGVyaW9kIGJ5IHdoYXRldmVyIENQVSBlbmRzIHRoZSBncmFjZSBwZXJpb2QuCisgKiBUaGlzIGFsbG93cyBDUFVzIHRvIGdvIGR5bnRpY2staWRsZSBtb3JlIHF1aWNrbHksIGFuZCB0byByZWR1Y2UgdGhlCisgKiBudW1iZXIgb2Ygd2FrZXVwcyBieSBhIG1vZGVzdCBpbnRlZ2VyIGZhY3Rvci4KICAqCiAgKiBCZWNhdXNlIGl0IGlzIG5vdCBsZWdhbCB0byBpbnZva2UgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCkgd2l0aCBpcnFzCiAgKiBkaXNhYmxlZCwgd2UgZG8gb25lIHBhc3Mgb2YgZm9yY2VfcXVpZXNjZW50X3N0YXRlKCksIHRoZW4gZG8gYQogICogaW52b2tlX3JjdV9jb3JlKCkgdG8gY2F1c2UgcmN1X3Byb2Nlc3NfY2FsbGJhY2tzKCkgdG8gYmUgaW52b2tlZAogICogbGF0ZXIuICBUaGUgcGVyLWNwdSByY3VfZHludGlja19kcmFpbiB2YXJpYWJsZSBjb250cm9scyB0aGUgc2VxdWVuY2luZy4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBkaXNhYmxlZCBpbnRlcnJ1cHRzLgogICovCi1pbnQgcmN1X25lZWRzX2NwdShpbnQgY3B1KQorc3RhdGljIHZvaWQgcmN1X3ByZXBhcmVfZm9yX2lkbGUoaW50IGNwdSkKIHsKLQlpbnQgYyA9IDA7Ci0JaW50IHNuYXA7Ci0JaW50IHRoYXRjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKIAotCS8qIENoZWNrIGZvciBiZWluZyBpbiB0aGUgaG9sZG9mZiBwZXJpb2QuICovCi0JaWYgKHBlcl9jcHUocmN1X2R5bnRpY2tfaG9sZG9mZiwgY3B1KSA9PSBqaWZmaWVzKQotCQlyZXR1cm4gcmN1X25lZWRzX2NwdV9xdWlja19jaGVjayhjcHUpOworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAotCS8qIERvbid0IGJvdGhlciB1bmxlc3Mgd2UgYXJlIHRoZSBsYXN0IG5vbi1keW50aWNrLWlkbGUgQ1BVLiAqLwotCWZvcl9lYWNoX29ubGluZV9jcHUodGhhdGNwdSkgewotCQlpZiAodGhhdGNwdSA9PSBjcHUpCi0JCQljb250aW51ZTsKLQkJc25hcCA9IGF0b21pY19hZGRfcmV0dXJuKDAsICZwZXJfY3B1KHJjdV9keW50aWNrcywKLQkJCQkJCSAgICAgdGhhdGNwdSkuZHludGlja3MpOwotCQlzbXBfbWIoKTsgLyogT3JkZXIgc2FtcGxpbmcgb2Ygc25hcCB3aXRoIGVuZCBvZiBncmFjZSBwZXJpb2QuICovCi0JCWlmICgoc25hcCAmIDB4MSkgIT0gMCkgewotCQkJcGVyX2NwdShyY3VfZHludGlja19kcmFpbiwgY3B1KSA9IDA7Ci0JCQlwZXJfY3B1KHJjdV9keW50aWNrX2hvbGRvZmYsIGNwdSkgPSBqaWZmaWVzIC0gMTsKLQkJCXJldHVybiByY3VfbmVlZHNfY3B1X3F1aWNrX2NoZWNrKGNwdSk7Ci0JCX0KKwkvKgorCSAqIElmIHRoZXJlIGFyZSBubyBjYWxsYmFja3Mgb24gdGhpcyBDUFUsIGVudGVyIGR5bnRpY2staWRsZSBtb2RlLgorCSAqIEFsc28gcmVzZXQgc3RhdGUgdG8gYXZvaWQgcHJlanVkaWNpbmcgbGF0ZXIgYXR0ZW1wdHMuCisJICovCisJaWYgKCFyY3VfY3B1X2hhc19jYWxsYmFja3MoY3B1KSkgeworCQlwZXJfY3B1KHJjdV9keW50aWNrX2hvbGRvZmYsIGNwdSkgPSBqaWZmaWVzIC0gMTsKKwkJcGVyX2NwdShyY3VfZHludGlja19kcmFpbiwgY3B1KSA9IDA7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJdHJhY2VfcmN1X3ByZXBfaWRsZSgiTm8gY2FsbGJhY2tzIik7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIElmIGluIGhvbGRvZmYgbW9kZSwganVzdCByZXR1cm4uICBXZSB3aWxsIHByZXN1bWFibHkgaGF2ZQorCSAqIHJlZnJhaW5lZCBmcm9tIGRpc2FibGluZyB0aGUgc2NoZWR1bGluZy1jbG9jayB0aWNrLgorCSAqLworCWlmIChwZXJfY3B1KHJjdV9keW50aWNrX2hvbGRvZmYsIGNwdSkgPT0gamlmZmllcykgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXRyYWNlX3JjdV9wcmVwX2lkbGUoIkluIGhvbGRvZmYiKTsKKwkJcmV0dXJuOwogCX0KIAogCS8qIENoZWNrIGFuZCB1cGRhdGUgdGhlIHJjdV9keW50aWNrX2RyYWluIHNlcXVlbmNpbmcuICovCiAJaWYgKHBlcl9jcHUocmN1X2R5bnRpY2tfZHJhaW4sIGNwdSkgPD0gMCkgewogCQkvKiBGaXJzdCB0aW1lIHRocm91Z2gsIGluaXRpYWxpemUgdGhlIGNvdW50ZXIuICovCi0JCXBlcl9jcHUocmN1X2R5bnRpY2tfZHJhaW4sIGNwdSkgPSBSQ1VfTkVFRFNfQ1BVX0ZMVVNIRVM7CisJCXBlcl9jcHUocmN1X2R5bnRpY2tfZHJhaW4sIGNwdSkgPSBSQ1VfSURMRV9GTFVTSEVTOworCX0gZWxzZSBpZiAocGVyX2NwdShyY3VfZHludGlja19kcmFpbiwgY3B1KSA8PSBSQ1VfSURMRV9PUFRfRkxVU0hFUyAmJgorCQkgICAhcmN1X3BlbmRpbmcoY3B1KSkgeworCQkvKiBDYW4gd2UgZ28gZHludGljay1pZGxlIGRlc3BpdGUgc3RpbGwgaGF2aW5nIGNhbGxiYWNrcz8gKi8KKwkJdHJhY2VfcmN1X3ByZXBfaWRsZSgiRHludGljayB3aXRoIGNhbGxiYWNrcyIpOworCQlwZXJfY3B1KHJjdV9keW50aWNrX2RyYWluLCBjcHUpID0gMDsKKwkJcGVyX2NwdShyY3VfZHludGlja19ob2xkb2ZmLCBjcHUpID0gamlmZmllcyAtIDE7CisJCWhydGltZXJfc3RhcnQoJnBlcl9jcHUocmN1X2lkbGVfZ3BfdGltZXIsIGNwdSksCisJCQkgICAgICByY3VfaWRsZV9ncF93YWl0LCBIUlRJTUVSX01PREVfUkVMKTsKKwkJcmV0dXJuOyAvKiBOb3RoaW5nIG1vcmUgdG8gZG8gaW1tZWRpYXRlbHkuICovCiAJfSBlbHNlIGlmICgtLXBlcl9jcHUocmN1X2R5bnRpY2tfZHJhaW4sIGNwdSkgPD0gMCkgewogCQkvKiBXZSBoYXZlIGhpdCB0aGUgbGltaXQsIHNvIHRpbWUgdG8gZ2l2ZSB1cC4gKi8KIAkJcGVyX2NwdShyY3VfZHludGlja19ob2xkb2ZmLCBjcHUpID0gamlmZmllczsKLQkJcmV0dXJuIHJjdV9uZWVkc19jcHVfcXVpY2tfY2hlY2soY3B1KTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQl0cmFjZV9yY3VfcHJlcF9pZGxlKCJCZWdpbiBob2xkb2ZmIik7CisJCWludm9rZV9yY3VfY29yZSgpOyAgLyogRm9yY2UgdGhlIENQVSBvdXQgb2YgZHludGljay1pZGxlLiAqLworCQlyZXR1cm47CiAJfQogCi0JLyogRG8gb25lIHN0ZXAgcHVzaGluZyByZW1haW5pbmcgUkNVIGNhbGxiYWNrcyB0aHJvdWdoLiAqLworCS8qCisJICogRG8gb25lIHN0ZXAgb2YgcHVzaGluZyB0aGUgcmVtYWluaW5nIFJDVSBjYWxsYmFja3MgdGhyb3VnaAorCSAqIHRoZSBSQ1UgY29yZSBzdGF0ZSBtYWNoaW5lLgorCSAqLworI2lmZGVmIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVCisJaWYgKHBlcl9jcHUocmN1X3ByZWVtcHRfZGF0YSwgY3B1KS5ueHRsaXN0KSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJcmN1X3ByZWVtcHRfcXMoY3B1KTsKKwkJZm9yY2VfcXVpZXNjZW50X3N0YXRlKCZyY3VfcHJlZW1wdF9zdGF0ZSwgMCk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwl9CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVICovCiAJaWYgKHBlcl9jcHUocmN1X3NjaGVkX2RhdGEsIGNwdSkubnh0bGlzdCkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJCXJjdV9zY2hlZF9xcyhjcHUpOwogCQlmb3JjZV9xdWllc2NlbnRfc3RhdGUoJnJjdV9zY2hlZF9zdGF0ZSwgMCk7Ci0JCWMgPSBjIHx8IHBlcl9jcHUocmN1X3NjaGVkX2RhdGEsIGNwdSkubnh0bGlzdDsKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCX0KIAlpZiAocGVyX2NwdShyY3VfYmhfZGF0YSwgY3B1KS5ueHRsaXN0KSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAkJcmN1X2JoX3FzKGNwdSk7CiAJCWZvcmNlX3F1aWVzY2VudF9zdGF0ZSgmcmN1X2JoX3N0YXRlLCAwKTsKLQkJYyA9IGMgfHwgcGVyX2NwdShyY3VfYmhfZGF0YSwgY3B1KS5ueHRsaXN0OworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJfQogCi0JLyogSWYgUkNVIGNhbGxiYWNrcyBhcmUgc3RpbGwgcGVuZGluZywgUkNVIHN0aWxsIG5lZWRzIHRoaXMgQ1BVLiAqLwotCWlmIChjKQorCS8qCisJICogSWYgUkNVIGNhbGxiYWNrcyBhcmUgc3RpbGwgcGVuZGluZywgUkNVIHN0aWxsIG5lZWRzIHRoaXMgQ1BVLgorCSAqIFNvIHRyeSBmb3JjaW5nIHRoZSBjYWxsYmFja3MgdGhyb3VnaCB0aGUgZ3JhY2UgcGVyaW9kLgorCSAqLworCWlmIChyY3VfY3B1X2hhc19jYWxsYmFja3MoY3B1KSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXRyYWNlX3JjdV9wcmVwX2lkbGUoIk1vcmUgY2FsbGJhY2tzIik7CiAJCWludm9rZV9yY3VfY29yZSgpOwotCXJldHVybiBjOworCX0gZWxzZSB7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJdHJhY2VfcmN1X3ByZXBfaWRsZSgiQ2FsbGJhY2tzIGRyYWluZWQiKTsKKwl9CiB9CiAKICNlbmRpZiAvKiAjZWxzZSAjaWYgIWRlZmluZWQoQ09ORklHX1JDVV9GQVNUX05PX0haKSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWVfdHJhY2UuYyBiL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMKaW5kZXggOWZlZmZhNC4uNjU0Y2ZlNiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWVfdHJhY2UuYworKysgYi9rZXJuZWwvcmN1dHJlZV90cmFjZS5jCkBAIC02NywxMyArNjcsMTEgQEAKIAkJICAgcmRwLT5jb21wbGV0ZWQsIHJkcC0+Z3BudW0sCiAJCSAgIHJkcC0+cGFzc2VkX3F1aWVzY2UsIHJkcC0+cGFzc2VkX3F1aWVzY2VfZ3BudW0sCiAJCSAgIHJkcC0+cXNfcGVuZGluZyk7Ci0jaWZkZWYgQ09ORklHX05PX0haCi0Jc2VxX3ByaW50ZihtLCAiIGR0PSVkLyVkLyVkIGRmPSVsdSIsCisJc2VxX3ByaW50ZihtLCAiIGR0PSVkLyVsbHgvJWQgZGY9JWx1IiwKIAkJICAgYXRvbWljX3JlYWQoJnJkcC0+ZHludGlja3MtPmR5bnRpY2tzKSwKIAkJICAgcmRwLT5keW50aWNrcy0+ZHludGlja3NfbmVzdGluZywKIAkJICAgcmRwLT5keW50aWNrcy0+ZHludGlja3Nfbm1pX25lc3RpbmcsCiAJCSAgIHJkcC0+ZHludGlja3NfZnFzKTsKLSNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCiAJc2VxX3ByaW50ZihtLCAiIG9mPSVsdSByaT0lbHUiLCByZHAtPm9mZmxpbmVfZnFzLCByZHAtPnJlc2NoZWRfaXBpKTsKIAlzZXFfcHJpbnRmKG0sICIgcWw9JWxkIHFzPSVjJWMlYyVjIiwKIAkJICAgcmRwLT5xbGVuLApAQCAtMTQxLDEzICsxMzksMTEgQEAKIAkJICAgcmRwLT5jb21wbGV0ZWQsIHJkcC0+Z3BudW0sCiAJCSAgIHJkcC0+cGFzc2VkX3F1aWVzY2UsIHJkcC0+cGFzc2VkX3F1aWVzY2VfZ3BudW0sCiAJCSAgIHJkcC0+cXNfcGVuZGluZyk7Ci0jaWZkZWYgQ09ORklHX05PX0haCi0Jc2VxX3ByaW50ZihtLCAiLCVkLCVkLCVkLCVsdSIsCisJc2VxX3ByaW50ZihtLCAiLCVkLCVsbHgsJWQsJWx1IiwKIAkJICAgYXRvbWljX3JlYWQoJnJkcC0+ZHludGlja3MtPmR5bnRpY2tzKSwKIAkJICAgcmRwLT5keW50aWNrcy0+ZHludGlja3NfbmVzdGluZywKIAkJICAgcmRwLT5keW50aWNrcy0+ZHludGlja3Nfbm1pX25lc3RpbmcsCiAJCSAgIHJkcC0+ZHludGlja3NfZnFzKTsKLSNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX05PX0haICovCiAJc2VxX3ByaW50ZihtLCAiLCVsdSwlbHUiLCByZHAtPm9mZmxpbmVfZnFzLCByZHAtPnJlc2NoZWRfaXBpKTsKIAlzZXFfcHJpbnRmKG0sICIsJWxkLFwiJWMlYyVjJWNcIiIsIHJkcC0+cWxlbiwKIAkJICAgIi5OIltyZHAtPm54dHRhaWxbUkNVX05FWFRfUkVBRFlfVEFJTF0gIT0KQEAgLTE3MSw5ICsxNjcsNyBAQAogc3RhdGljIGludCBzaG93X3JjdWRhdGFfY3N2KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdW51c2VkKQogewogCXNlcV9wdXRzKG0sICJcIkNQVVwiLFwiT25saW5lP1wiLFwiY1wiLFwiZ1wiLFwicHFcIixcInBncFwiLFwicHFcIiwiKTsKLSNpZmRlZiBDT05GSUdfTk9fSFoKIAlzZXFfcHV0cyhtLCAiXCJkdFwiLFwiZHQgbmVzdGluZ1wiLFwiZHQgTk1JIG5lc3RpbmdcIixcImRmXCIsIik7Ci0jZW5kaWYgLyogI2lmZGVmIENPTkZJR19OT19IWiAqLwogCXNlcV9wdXRzKG0sICJcIm9mXCIsXCJyaVwiLFwicWxcIixcInFzXCIiKTsKICNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCiAJc2VxX3B1dHMobSwgIlwia3RcIixcImt0bFwiIik7CkBAIC0yNzgsNyArMjcyLDcgQEAKIAlncG51bSA9IHJzcC0+Z3BudW07CiAJc2VxX3ByaW50ZihtLCAiYz0lbHUgZz0lbHUgcz0lZCBqZnE9JWxkIGo9JXggIgogCQkgICAgICAibmZxcz0lbHUvbmZxc25nPSVsdSglbHUpIGZxbGg9JWx1XG4iLAotCQkgICByc3AtPmNvbXBsZXRlZCwgZ3BudW0sIHJzcC0+c2lnbmFsZWQsCisJCSAgIHJzcC0+Y29tcGxldGVkLCBncG51bSwgcnNwLT5mcXNfc3RhdGUsCiAJCSAgIChsb25nKShyc3AtPmppZmZpZXNfZm9yY2VfcXMgLSBqaWZmaWVzKSwKIAkJICAgKGludCkoamlmZmllcyAmIDB4ZmZmZiksCiAJCSAgIHJzcC0+bl9mb3JjZV9xcywgcnNwLT5uX2ZvcmNlX3FzX25ncCwKZGlmZiAtLWdpdCBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMgYi9rZXJuZWwvcnRtdXRleC1kZWJ1Zy5jCmluZGV4IDhlYWZkMWIuLjE2NTAyZDMgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4LWRlYnVnLmMKKysrIGIva2VybmVsL3J0bXV0ZXgtZGVidWcuYwpAQCAtMTAxLDYgKzEwMSw3IEBACiAKIAlwcmludGsoIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOwogCXByaW50ayggICJbIEJVRzogY2lyY3VsYXIgbG9ja2luZyBkZWFkbG9jayBkZXRlY3RlZCEgXVxuIik7CisJcHJpbnRrKCIlc1xuIiwgcHJpbnRfdGFpbnRlZCgpKTsKIAlwcmludGsoICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogCXByaW50aygiJXMvJWQgaXMgZGVhZGxvY2tpbmcgY3VycmVudCB0YXNrICVzLyVkXG5cbiIsCiAJICAgICAgIHRhc2stPmNvbW0sIHRhc2tfcGlkX25yKHRhc2spLApkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXguYyBiL2tlcm5lbC9ydG11dGV4LmMKaW5kZXggZjlkODQ4Mi4uYTI0MmU2OSAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXguYworKysgYi9rZXJuZWwvcnRtdXRleC5jCkBAIC01NzksNyArNTc5LDYgQEAKIAkJICAgIHN0cnVjdCBydF9tdXRleF93YWl0ZXIgKndhaXRlcikKIHsKIAlpbnQgcmV0ID0gMDsKLQlpbnQgd2FzX2Rpc2FibGVkOwogCiAJZm9yICg7OykgewogCQkvKiBUcnkgdG8gYWNxdWlyZSB0aGUgbG9jazogKi8KQEAgLTYwMiwxNyArNjAxLDEwIEBACiAKIAkJcmF3X3NwaW5fdW5sb2NrKCZsb2NrLT53YWl0X2xvY2spOwogCi0JCXdhc19kaXNhYmxlZCA9IGlycXNfZGlzYWJsZWQoKTsKLQkJaWYgKHdhc19kaXNhYmxlZCkKLQkJCWxvY2FsX2lycV9lbmFibGUoKTsKLQogCQlkZWJ1Z19ydF9tdXRleF9wcmludF9kZWFkbG9jayh3YWl0ZXIpOwogCiAJCXNjaGVkdWxlX3J0X211dGV4KGxvY2spOwogCi0JCWlmICh3YXNfZGlzYWJsZWQpCi0JCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCiAJCXJhd19zcGluX2xvY2soJmxvY2stPndhaXRfbG9jayk7CiAJCXNldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWQvTWFrZWZpbGUgYi9rZXJuZWwvc2NoZWQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3ZGQzNQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9zY2hlZC9NYWtlZmlsZQpAQCAtMCwwICsxLDIwIEBACitpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCitDRkxBR1NfUkVNT1ZFX2Nsb2NrLm8gPSAtcGcKK2VuZGlmCisKK2lmbmVxICgkKENPTkZJR19TQ0hFRF9PTUlUX0ZSQU1FX1BPSU5URVIpLHkpCisjIEFjY29yZGluZyB0byBBbGFuIE1vZHJhIDxhbGFuQGxpbnV4Y2FyZS5jb20uYXU+LCB0aGUgLWZuby1vbWl0LWZyYW1lLXBvaW50ZXIgaXMKKyMgbmVlZGVkIGZvciB4ODYgb25seS4gIFdoeSB0aGlzIHVzZWQgdG8gYmUgZW5hYmxlZCBmb3IgYWxsIGFyY2hpdGVjdHVyZXMgaXMgYmV5b25kCisjIG1lLiAgSSBzdXNwZWN0IG1vc3QgcGxhdGZvcm1zIGRvbid0IG5lZWQgdGhpcywgYnV0IHVudGlsIHdlIGtub3cgdGhhdCBmb3Igc3VyZQorIyBJIHR1cm4gdGhpcyBvZmYgZm9yIElBLTY0IG9ubHkuICBBbmRyZWFzIFNjaHdhYiBzYXlzIGl0J3MgYWxzbyBuZWVkZWQgb24gbTY4aworIyB0byBnZXQgYSBjb3JyZWN0IHZhbHVlIGZvciB0aGUgd2FpdC1jaGFubmVsIChXQ0hBTiBpbiBwcykuIC0tZGF2aWRtCitDRkxBR1NfY29yZS5vIDo9ICQoUFJPRklMSU5HKSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlcgorZW5kaWYKKworb2JqLXkgKz0gY29yZS5vIGNsb2NrLm8gaWRsZV90YXNrLm8gZmFpci5vIHJ0Lm8gc3RvcF90YXNrLm8KK29iai0kKENPTkZJR19TTVApICs9IGNwdXByaS5vCitvYmotJChDT05GSUdfU0NIRURfQVVUT0dST1VQKSArPSBhdXRvX2dyb3VwLm8KK29iai0kKENPTkZJR19TQ0hFRFNUQVRTKSArPSBzdGF0cy5vCitvYmotJChDT05GSUdfU0NIRURfREVCVUcpICs9IGRlYnVnLm8KKworCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfYXV0b2dyb3VwLmMgYi9rZXJuZWwvc2NoZWQvYXV0b19ncm91cC5jCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIGtlcm5lbC9zY2hlZF9hdXRvZ3JvdXAuYwpyZW5hbWUgdG8ga2VybmVsL3NjaGVkL2F1dG9fZ3JvdXAuYwppbmRleCA0MjkyNDJmLi5lOGExZjgzIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfYXV0b2dyb3VwLmMKKysrIGIva2VybmVsL3NjaGVkL2F1dG9fZ3JvdXAuYwpAQCAtMSwxNSArMSwxOSBAQAogI2lmZGVmIENPTkZJR19TQ0hFRF9BVVRPR1JPVVAKIAorI2luY2x1ZGUgInNjaGVkLmgiCisKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWN1cml0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiB1bnNpZ25lZCBpbnQgX19yZWFkX21vc3RseSBzeXNjdGxfc2NoZWRfYXV0b2dyb3VwX2VuYWJsZWQgPSAxOwogc3RhdGljIHN0cnVjdCBhdXRvZ3JvdXAgYXV0b2dyb3VwX2RlZmF1bHQ7CiBzdGF0aWMgYXRvbWljX3QgYXV0b2dyb3VwX3NlcV9ucjsKIAotc3RhdGljIHZvaWQgX19pbml0IGF1dG9ncm91cF9pbml0KHN0cnVjdCB0YXNrX3N0cnVjdCAqaW5pdF90YXNrKQordm9pZCBfX2luaXQgYXV0b2dyb3VwX2luaXQoc3RydWN0IHRhc2tfc3RydWN0ICppbml0X3Rhc2spCiB7CiAJYXV0b2dyb3VwX2RlZmF1bHQudGcgPSAmcm9vdF90YXNrX2dyb3VwOwogCWtyZWZfaW5pdCgmYXV0b2dyb3VwX2RlZmF1bHQua3JlZik7CkBAIC0xNyw3ICsyMSw3IEBACiAJaW5pdF90YXNrLT5zaWduYWwtPmF1dG9ncm91cCA9ICZhdXRvZ3JvdXBfZGVmYXVsdDsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGF1dG9ncm91cF9mcmVlKHN0cnVjdCB0YXNrX2dyb3VwICp0ZykKK3ZvaWQgYXV0b2dyb3VwX2ZyZWUoc3RydWN0IHRhc2tfZ3JvdXAgKnRnKQogewogCWtmcmVlKHRnLT5hdXRvZ3JvdXApOwogfQpAQCAtNTksMTAgKzYzLDYgQEAKIAlyZXR1cm4gYWc7CiB9CiAKLSNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKLXN0YXRpYyB2b2lkIGZyZWVfcnRfc2NoZWRfZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnKTsKLSNlbmRpZgotCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBhdXRvZ3JvdXAgKmF1dG9ncm91cF9jcmVhdGUodm9pZCkKIHsKIAlzdHJ1Y3QgYXV0b2dyb3VwICphZyA9IGt6YWxsb2Moc2l6ZW9mKCphZyksIEdGUF9LRVJORUwpOwpAQCAtMTA4LDggKzEwOCw3IEBACiAJcmV0dXJuIGF1dG9ncm91cF9rcmVmX2dldCgmYXV0b2dyb3VwX2RlZmF1bHQpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wKLXRhc2tfd2FudHNfYXV0b2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHRhc2tfZ3JvdXAgKnRnKQorYm9vbCB0YXNrX3dhbnRzX2F1dG9ncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCB0YXNrX2dyb3VwICp0ZykKIHsKIAlpZiAodGcgIT0gJnJvb3RfdGFza19ncm91cCkKIAkJcmV0dXJuIGZhbHNlOwpAQCAtMTI3LDIyICsxMjYsNiBAQAogCXJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgdGFza19ncm91cF9pc19hdXRvZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnKQotewotCXJldHVybiAhIXRnLT5hdXRvZ3JvdXA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfZ3JvdXAgKgotYXV0b2dyb3VwX3Rhc2tfZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgdGFza19ncm91cCAqdGcpCi17Ci0JaW50IGVuYWJsZWQgPSBBQ0NFU1NfT05DRShzeXNjdGxfc2NoZWRfYXV0b2dyb3VwX2VuYWJsZWQpOwotCi0JaWYgKGVuYWJsZWQgJiYgdGFza193YW50c19hdXRvZ3JvdXAocCwgdGcpKQotCQlyZXR1cm4gcC0+c2lnbmFsLT5hdXRvZ3JvdXAtPnRnOwotCi0JcmV0dXJuIHRnOwotfQotCiBzdGF0aWMgdm9pZAogYXV0b2dyb3VwX21vdmVfZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgYXV0b2dyb3VwICphZykKIHsKQEAgLTI2Myw3ICsyNDYsNyBAQAogI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCiAKICNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKLXN0YXRpYyBpbmxpbmUgaW50IGF1dG9ncm91cF9wYXRoKHN0cnVjdCB0YXNrX2dyb3VwICp0ZywgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoraW50IGF1dG9ncm91cF9wYXRoKHN0cnVjdCB0YXNrX2dyb3VwICp0ZywgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQogewogCWlmICghdGFza19ncm91cF9pc19hdXRvZ3JvdXAodGcpKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9hdXRvZ3JvdXAuaCBiL2tlcm5lbC9zY2hlZC9hdXRvX2dyb3VwLmgKc2ltaWxhcml0eSBpbmRleCA2NiUKcmVuYW1lIGZyb20ga2VybmVsL3NjaGVkX2F1dG9ncm91cC5oCnJlbmFtZSB0byBrZXJuZWwvc2NoZWQvYXV0b19ncm91cC5oCmluZGV4IGMyZjBlNzIuLjhiZDA0NzEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9hdXRvZ3JvdXAuaAorKysgYi9rZXJuZWwvc2NoZWQvYXV0b19ncm91cC5oCkBAIC0xLDUgKzEsOCBAQAogI2lmZGVmIENPTkZJR19TQ0hFRF9BVVRPR1JPVVAKIAorI2luY2x1ZGUgPGxpbnV4L2tyZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorCiBzdHJ1Y3QgYXV0b2dyb3VwIHsKIAkvKgogCSAqIHJlZmVyZW5jZSBkb2Vzbid0IG1lYW4gaG93IG1hbnkgdGhyZWFkIGF0dGFjaCB0byB0aGlzCkBAIC0xMyw5ICsxNiwyOCBAQAogCWludAkJCW5pY2U7CiB9OwogCi1zdGF0aWMgaW5saW5lIGJvb2wgdGFza19ncm91cF9pc19hdXRvZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnKTsKK2V4dGVybiB2b2lkIGF1dG9ncm91cF9pbml0KHN0cnVjdCB0YXNrX3N0cnVjdCAqaW5pdF90YXNrKTsKK2V4dGVybiB2b2lkIGF1dG9ncm91cF9mcmVlKHN0cnVjdCB0YXNrX2dyb3VwICp0Zyk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB0YXNrX2dyb3VwX2lzX2F1dG9ncm91cChzdHJ1Y3QgdGFza19ncm91cCAqdGcpCit7CisJcmV0dXJuICEhdGctPmF1dG9ncm91cDsKK30KKworZXh0ZXJuIGJvb2wgdGFza193YW50c19hdXRvZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgdGFza19ncm91cCAqdGcpOworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCB0YXNrX2dyb3VwICoKLWF1dG9ncm91cF90YXNrX2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHRhc2tfZ3JvdXAgKnRnKTsKK2F1dG9ncm91cF90YXNrX2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHRhc2tfZ3JvdXAgKnRnKQoreworCWludCBlbmFibGVkID0gQUNDRVNTX09OQ0Uoc3lzY3RsX3NjaGVkX2F1dG9ncm91cF9lbmFibGVkKTsKKworCWlmIChlbmFibGVkICYmIHRhc2tfd2FudHNfYXV0b2dyb3VwKHAsIHRnKSkKKwkJcmV0dXJuIHAtPnNpZ25hbC0+YXV0b2dyb3VwLT50ZzsKKworCXJldHVybiB0ZzsKK30KKworZXh0ZXJuIGludCBhdXRvZ3JvdXBfcGF0aChzdHJ1Y3QgdGFza19ncm91cCAqdGcsIGNoYXIgKmJ1ZiwgaW50IGJ1Zmxlbik7CiAKICNlbHNlIC8qICFDT05GSUdfU0NIRURfQVVUT0dST1VQICovCiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9jbG9jay5jIGIva2VybmVsL3NjaGVkL2Nsb2NrLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGtlcm5lbC9zY2hlZF9jbG9jay5jCnJlbmFtZSB0byBrZXJuZWwvc2NoZWQvY2xvY2suYwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQvY29yZS5jCnNpbWlsYXJpdHkgaW5kZXggNzklCnJlbmFtZSBmcm9tIGtlcm5lbC9zY2hlZC5jCnJlbmFtZSB0byBrZXJuZWwvc2NoZWQvY29yZS5jCmluZGV4IDBlOTM0NGEuLjRkYmZkMDQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZC5jCisrKyBiL2tlcm5lbC9zY2hlZC9jb3JlLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGtlcm5lbC9zY2hlZC5jCisgKiAga2VybmVsL3NjaGVkL2NvcmUuYwogICoKICAqICBLZXJuZWwgc2NoZWR1bGVyIGFuZCByZWxhdGVkIHN5c2NhbGxzCiAgKgpAQCAtNTYsNyArNTYsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0b3BfbWFjaGluZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KQEAgLTcxLDEzMiArNzAsMjEgQEAKICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KIAogI2luY2x1ZGUgPGFzbS90bGIuaD4KICNpbmNsdWRlIDxhc20vaXJxX3JlZ3MuaD4KLSNpbmNsdWRlIDxhc20vbXV0ZXguaD4KICNpZmRlZiBDT05GSUdfUEFSQVZJUlQKICNpbmNsdWRlIDxhc20vcGFyYXZpcnQuaD4KICNlbmRpZgogCi0jaW5jbHVkZSAic2NoZWRfY3B1cHJpLmgiCi0jaW5jbHVkZSAid29ya3F1ZXVlX3NjaGVkLmgiCi0jaW5jbHVkZSAic2NoZWRfYXV0b2dyb3VwLmgiCisjaW5jbHVkZSAic2NoZWQuaCIKKyNpbmNsdWRlICIuLi93b3JrcXVldWVfc2NoZWQuaCIKIAogI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCiAjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NjaGVkLmg+CiAKLS8qCi0gKiBDb252ZXJ0IHVzZXItbmljZSB2YWx1ZXMgWyAtMjAgLi4uIDAgLi4uIDE5IF0KLSAqIHRvIHN0YXRpYyBwcmlvcml0eSBbIE1BWF9SVF9QUklPLi5NQVhfUFJJTy0xIF0sCi0gKiBhbmQgYmFjay4KLSAqLwotI2RlZmluZSBOSUNFX1RPX1BSSU8obmljZSkJKE1BWF9SVF9QUklPICsgKG5pY2UpICsgMjApCi0jZGVmaW5lIFBSSU9fVE9fTklDRShwcmlvKQkoKHByaW8pIC0gTUFYX1JUX1BSSU8gLSAyMCkKLSNkZWZpbmUgVEFTS19OSUNFKHApCQlQUklPX1RPX05JQ0UoKHApLT5zdGF0aWNfcHJpbykKLQotLyoKLSAqICdVc2VyIHByaW9yaXR5JyBpcyB0aGUgbmljZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gc29tZXRoaW5nIHdlCi0gKiBjYW4gd29yayB3aXRoIGJldHRlciB3aGVuIHNjYWxpbmcgdmFyaW91cyBzY2hlZHVsZXIgcGFyYW1ldGVycywKLSAqIGl0J3MgYSBbIDAgLi4uIDM5IF0gcmFuZ2UuCi0gKi8KLSNkZWZpbmUgVVNFUl9QUklPKHApCQkoKHApLU1BWF9SVF9QUklPKQotI2RlZmluZSBUQVNLX1VTRVJfUFJJTyhwKQlVU0VSX1BSSU8oKHApLT5zdGF0aWNfcHJpbykKLSNkZWZpbmUgTUFYX1VTRVJfUFJJTwkJKFVTRVJfUFJJTyhNQVhfUFJJTykpCi0KLS8qCi0gKiBIZWxwZXJzIGZvciBjb252ZXJ0aW5nIG5hbm9zZWNvbmQgdGltaW5nIHRvIGppZmZ5IHJlc29sdXRpb24KLSAqLwotI2RlZmluZSBOU19UT19KSUZGSUVTKFRJTUUpCSgodW5zaWduZWQgbG9uZykoVElNRSkgLyAoTlNFQ19QRVJfU0VDIC8gSFopKQotCi0jZGVmaW5lIE5JQ0VfMF9MT0FECQlTQ0hFRF9MT0FEX1NDQUxFCi0jZGVmaW5lIE5JQ0VfMF9TSElGVAkJU0NIRURfTE9BRF9TSElGVAotCi0vKgotICogVGhlc2UgYXJlIHRoZSAndHVuaW5nIGtub2JzJyBvZiB0aGUgc2NoZWR1bGVyOgotICoKLSAqIGRlZmF1bHQgdGltZXNsaWNlIGlzIDEwMCBtc2VjcyAodXNlZCBvbmx5IGZvciBTQ0hFRF9SUiB0YXNrcykuCi0gKiBUaW1lc2xpY2VzIGdldCByZWZpbGxlZCBhZnRlciB0aGV5IGV4cGlyZS4KLSAqLwotI2RlZmluZSBERUZfVElNRVNMSUNFCQkoMTAwICogSFogLyAxMDAwKQotCi0vKgotICogc2luZ2xlIHZhbHVlIHRoYXQgZGVub3RlcyBydW50aW1lID09IHBlcmlvZCwgaWUgdW5saW1pdGVkIHRpbWUuCi0gKi8KLSNkZWZpbmUgUlVOVElNRV9JTkYJKCh1NjQpfjBVTEwpCi0KLXN0YXRpYyBpbmxpbmUgaW50IHJ0X3BvbGljeShpbnQgcG9saWN5KQotewotCWlmIChwb2xpY3kgPT0gU0NIRURfRklGTyB8fCBwb2xpY3kgPT0gU0NIRURfUlIpCi0JCXJldHVybiAxOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB0YXNrX2hhc19ydF9wb2xpY3koc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCXJldHVybiBydF9wb2xpY3kocC0+cG9saWN5KTsKLX0KLQotLyoKLSAqIFRoaXMgaXMgdGhlIHByaW9yaXR5LXF1ZXVlIGRhdGEgc3RydWN0dXJlIG9mIHRoZSBSVCBzY2hlZHVsaW5nIGNsYXNzOgotICovCi1zdHJ1Y3QgcnRfcHJpb19hcnJheSB7Ci0JREVDTEFSRV9CSVRNQVAoYml0bWFwLCBNQVhfUlRfUFJJTysxKTsgLyogaW5jbHVkZSAxIGJpdCBmb3IgZGVsaW1pdGVyICovCi0Jc3RydWN0IGxpc3RfaGVhZCBxdWV1ZVtNQVhfUlRfUFJJT107Ci19OwotCi1zdHJ1Y3QgcnRfYmFuZHdpZHRoIHsKLQkvKiBuZXN0cyBpbnNpZGUgdGhlIHJxIGxvY2s6ICovCi0JcmF3X3NwaW5sb2NrX3QJCXJ0X3J1bnRpbWVfbG9jazsKLQlrdGltZV90CQkJcnRfcGVyaW9kOwotCXU2NAkJCXJ0X3J1bnRpbWU7Ci0Jc3RydWN0IGhydGltZXIJCXJ0X3BlcmlvZF90aW1lcjsKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcnRfYmFuZHdpZHRoIGRlZl9ydF9iYW5kd2lkdGg7Ci0KLXN0YXRpYyBpbnQgZG9fc2NoZWRfcnRfcGVyaW9kX3RpbWVyKHN0cnVjdCBydF9iYW5kd2lkdGggKnJ0X2IsIGludCBvdmVycnVuKTsKLQotc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHNjaGVkX3J0X3BlcmlvZF90aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCi17Ci0Jc3RydWN0IHJ0X2JhbmR3aWR0aCAqcnRfYiA9Ci0JCWNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IHJ0X2JhbmR3aWR0aCwgcnRfcGVyaW9kX3RpbWVyKTsKLQlrdGltZV90IG5vdzsKLQlpbnQgb3ZlcnJ1bjsKLQlpbnQgaWRsZSA9IDA7Ci0KLQlmb3IgKDs7KSB7Ci0JCW5vdyA9IGhydGltZXJfY2JfZ2V0X3RpbWUodGltZXIpOwotCQlvdmVycnVuID0gaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLCBub3csIHJ0X2ItPnJ0X3BlcmlvZCk7Ci0KLQkJaWYgKCFvdmVycnVuKQotCQkJYnJlYWs7Ci0KLQkJaWRsZSA9IGRvX3NjaGVkX3J0X3BlcmlvZF90aW1lcihydF9iLCBvdmVycnVuKTsKLQl9Ci0KLQlyZXR1cm4gaWRsZSA/IEhSVElNRVJfTk9SRVNUQVJUIDogSFJUSU1FUl9SRVNUQVJUOwotfQotCi1zdGF0aWMKLXZvaWQgaW5pdF9ydF9iYW5kd2lkdGgoc3RydWN0IHJ0X2JhbmR3aWR0aCAqcnRfYiwgdTY0IHBlcmlvZCwgdTY0IHJ1bnRpbWUpCi17Ci0JcnRfYi0+cnRfcGVyaW9kID0gbnNfdG9fa3RpbWUocGVyaW9kKTsKLQlydF9iLT5ydF9ydW50aW1lID0gcnVudGltZTsKLQotCXJhd19zcGluX2xvY2tfaW5pdCgmcnRfYi0+cnRfcnVudGltZV9sb2NrKTsKLQotCWhydGltZXJfaW5pdCgmcnRfYi0+cnRfcGVyaW9kX3RpbWVyLAotCQkJQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKLQlydF9iLT5ydF9wZXJpb2RfdGltZXIuZnVuY3Rpb24gPSBzY2hlZF9ydF9wZXJpb2RfdGltZXI7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHJ0X2JhbmR3aWR0aF9lbmFibGVkKHZvaWQpCi17Ci0JcmV0dXJuIHN5c2N0bF9zY2hlZF9ydF9ydW50aW1lID49IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2JhbmR3aWR0aF90aW1lcihzdHJ1Y3QgaHJ0aW1lciAqcGVyaW9kX3RpbWVyLCBrdGltZV90IHBlcmlvZCkKK3ZvaWQgc3RhcnRfYmFuZHdpZHRoX3RpbWVyKHN0cnVjdCBocnRpbWVyICpwZXJpb2RfdGltZXIsIGt0aW1lX3QgcGVyaW9kKQogewogCXVuc2lnbmVkIGxvbmcgZGVsdGE7CiAJa3RpbWVfdCBzb2Z0LCBoYXJkLCBub3c7CkBAIC0yMTYsNTgwICsxMDQsMTIgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHN0YXJ0X3J0X2JhbmR3aWR0aChzdHJ1Y3QgcnRfYmFuZHdpZHRoICpydF9iKQotewotCWlmICghcnRfYmFuZHdpZHRoX2VuYWJsZWQoKSB8fCBydF9iLT5ydF9ydW50aW1lID09IFJVTlRJTUVfSU5GKQotCQlyZXR1cm47Ci0KLQlpZiAoaHJ0aW1lcl9hY3RpdmUoJnJ0X2ItPnJ0X3BlcmlvZF90aW1lcikpCi0JCXJldHVybjsKLQotCXJhd19zcGluX2xvY2soJnJ0X2ItPnJ0X3J1bnRpbWVfbG9jayk7Ci0Jc3RhcnRfYmFuZHdpZHRoX3RpbWVyKCZydF9iLT5ydF9wZXJpb2RfdGltZXIsIHJ0X2ItPnJ0X3BlcmlvZCk7Ci0JcmF3X3NwaW5fdW5sb2NrKCZydF9iLT5ydF9ydW50aW1lX2xvY2spOwotfQotCi0jaWZkZWYgQ09ORklHX1JUX0dST1VQX1NDSEVECi1zdGF0aWMgdm9pZCBkZXN0cm95X3J0X2JhbmR3aWR0aChzdHJ1Y3QgcnRfYmFuZHdpZHRoICpydF9iKQotewotCWhydGltZXJfY2FuY2VsKCZydF9iLT5ydF9wZXJpb2RfdGltZXIpOwotfQotI2VuZGlmCi0KLS8qCi0gKiBzY2hlZF9kb21haW5zX211dGV4IHNlcmlhbGl6ZXMgY2FsbHMgdG8gaW5pdF9zY2hlZF9kb21haW5zLAotICogZGV0YWNoX2Rlc3Ryb3lfZG9tYWlucyBhbmQgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMuCi0gKi8KLXN0YXRpYyBERUZJTkVfTVVURVgoc2NoZWRfZG9tYWluc19tdXRleCk7Ci0KLSNpZmRlZiBDT05GSUdfQ0dST1VQX1NDSEVECi0KLSNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KLQotc3RydWN0IGNmc19ycTsKLQotc3RhdGljIExJU1RfSEVBRCh0YXNrX2dyb3Vwcyk7Ci0KLXN0cnVjdCBjZnNfYmFuZHdpZHRoIHsKLSNpZmRlZiBDT05GSUdfQ0ZTX0JBTkRXSURUSAotCXJhd19zcGlubG9ja190IGxvY2s7Ci0Ja3RpbWVfdCBwZXJpb2Q7Ci0JdTY0IHF1b3RhLCBydW50aW1lOwotCXM2NCBoaWVyYXJjaGFsX3F1b3RhOwotCXU2NCBydW50aW1lX2V4cGlyZXM7Ci0KLQlpbnQgaWRsZSwgdGltZXJfYWN0aXZlOwotCXN0cnVjdCBocnRpbWVyIHBlcmlvZF90aW1lciwgc2xhY2tfdGltZXI7Ci0Jc3RydWN0IGxpc3RfaGVhZCB0aHJvdHRsZWRfY2ZzX3JxOwotCi0JLyogc3RhdGlzdGljcyAqLwotCWludCBucl9wZXJpb2RzLCBucl90aHJvdHRsZWQ7Ci0JdTY0IHRocm90dGxlZF90aW1lOwotI2VuZGlmCi19OwotCi0vKiB0YXNrIGdyb3VwIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KLXN0cnVjdCB0YXNrX2dyb3VwIHsKLQlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSBjc3M7Ci0KLSNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAotCS8qIHNjaGVkdWxhYmxlIGVudGl0aWVzIG9mIHRoaXMgZ3JvdXAgb24gZWFjaCBjcHUgKi8KLQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICoqc2U7Ci0JLyogcnVucXVldWUgIm93bmVkIiBieSB0aGlzIGdyb3VwIG9uIGVhY2ggY3B1ICovCi0Jc3RydWN0IGNmc19ycSAqKmNmc19ycTsKLQl1bnNpZ25lZCBsb25nIHNoYXJlczsKLQotCWF0b21pY190IGxvYWRfd2VpZ2h0OwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKLQlzdHJ1Y3Qgc2NoZWRfcnRfZW50aXR5ICoqcnRfc2U7Ci0Jc3RydWN0IHJ0X3JxICoqcnRfcnE7Ci0KLQlzdHJ1Y3QgcnRfYmFuZHdpZHRoIHJ0X2JhbmR3aWR0aDsKLSNlbmRpZgotCi0Jc3RydWN0IHJjdV9oZWFkIHJjdTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Ci0KLQlzdHJ1Y3QgdGFza19ncm91cCAqcGFyZW50OwotCXN0cnVjdCBsaXN0X2hlYWQgc2libGluZ3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsKLQotI2lmZGVmIENPTkZJR19TQ0hFRF9BVVRPR1JPVVAKLQlzdHJ1Y3QgYXV0b2dyb3VwICphdXRvZ3JvdXA7Ci0jZW5kaWYKLQotCXN0cnVjdCBjZnNfYmFuZHdpZHRoIGNmc19iYW5kd2lkdGg7Ci19OwotCi0vKiB0YXNrX2dyb3VwX2xvY2sgc2VyaWFsaXplcyB0aGUgYWRkaXRpb24vcmVtb3ZhbCBvZiB0YXNrIGdyb3VwcyAqLwotc3RhdGljIERFRklORV9TUElOTE9DSyh0YXNrX2dyb3VwX2xvY2spOwotCi0jaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKLQotIyBkZWZpbmUgUk9PVF9UQVNLX0dST1VQX0xPQUQJTklDRV8wX0xPQUQKLQotLyoKLSAqIEEgd2VpZ2h0IG9mIDAgb3IgMSBjYW4gY2F1c2UgYXJpdGhtZXRpY3MgcHJvYmxlbXMuCi0gKiBBIHdlaWdodCBvZiBhIGNmc19ycSBpcyB0aGUgc3VtIG9mIHdlaWdodHMgb2Ygd2hpY2ggZW50aXRpZXMKLSAqIGFyZSBxdWV1ZWQgb24gdGhpcyBjZnNfcnEsIHNvIGEgd2VpZ2h0IG9mIGEgZW50aXR5IHNob3VsZCBub3QgYmUKLSAqIHRvbyBsYXJnZSwgc28gYXMgdGhlIHNoYXJlcyB2YWx1ZSBvZiBhIHRhc2sgZ3JvdXAuCi0gKiAoVGhlIGRlZmF1bHQgd2VpZ2h0IGlzIDEwMjQgLSBzbyB0aGVyZSdzIG5vIHByYWN0aWNhbAotICogIGxpbWl0YXRpb24gZnJvbSB0aGlzLikKLSAqLwotI2RlZmluZSBNSU5fU0hBUkVTCSgxVUwgPDwgIDEpCi0jZGVmaW5lIE1BWF9TSEFSRVMJKDFVTCA8PCAxOCkKLQotc3RhdGljIGludCByb290X3Rhc2tfZ3JvdXBfbG9hZCA9IFJPT1RfVEFTS19HUk9VUF9MT0FEOwotI2VuZGlmCi0KLS8qIERlZmF1bHQgdGFzayBncm91cC4KLSAqCUV2ZXJ5IHRhc2sgaW4gc3lzdGVtIGJlbG9uZyB0byB0aGlzIGdyb3VwIGF0IGJvb3R1cC4KLSAqLwotc3RydWN0IHRhc2tfZ3JvdXAgcm9vdF90YXNrX2dyb3VwOwotCi0jZW5kaWYJLyogQ09ORklHX0NHUk9VUF9TQ0hFRCAqLwotCi0vKiBDRlMtcmVsYXRlZCBmaWVsZHMgaW4gYSBydW5xdWV1ZSAqLwotc3RydWN0IGNmc19ycSB7Ci0Jc3RydWN0IGxvYWRfd2VpZ2h0IGxvYWQ7Ci0JdW5zaWduZWQgbG9uZyBucl9ydW5uaW5nLCBoX25yX3J1bm5pbmc7Ci0KLQl1NjQgZXhlY19jbG9jazsKLQl1NjQgbWluX3ZydW50aW1lOwotI2lmbmRlZiBDT05GSUdfNjRCSVQKLQl1NjQgbWluX3ZydW50aW1lX2NvcHk7Ci0jZW5kaWYKLQotCXN0cnVjdCByYl9yb290IHRhc2tzX3RpbWVsaW5lOwotCXN0cnVjdCByYl9ub2RlICpyYl9sZWZ0bW9zdDsKLQotCXN0cnVjdCBsaXN0X2hlYWQgdGFza3M7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqYmFsYW5jZV9pdGVyYXRvcjsKLQotCS8qCi0JICogJ2N1cnInIHBvaW50cyB0byBjdXJyZW50bHkgcnVubmluZyBlbnRpdHkgb24gdGhpcyBjZnNfcnEuCi0JICogSXQgaXMgc2V0IHRvIE5VTEwgb3RoZXJ3aXNlIChpLmUgd2hlbiBub25lIGFyZSBjdXJyZW50bHkgcnVubmluZykuCi0JICovCi0Jc3RydWN0IHNjaGVkX2VudGl0eSAqY3VyciwgKm5leHQsICpsYXN0LCAqc2tpcDsKLQotI2lmZGVmCUNPTkZJR19TQ0hFRF9ERUJVRwotCXVuc2lnbmVkIGludCBucl9zcHJlYWRfb3ZlcjsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKLQlzdHJ1Y3QgcnEgKnJxOwkvKiBjcHUgcnVucXVldWUgdG8gd2hpY2ggdGhpcyBjZnNfcnEgaXMgYXR0YWNoZWQgKi8KLQotCS8qCi0JICogbGVhZiBjZnNfcnFzIGFyZSB0aG9zZSB0aGF0IGhvbGQgdGFza3MgKGxvd2VzdCBzY2hlZHVsYWJsZSBlbnRpdHkgaW4KLQkgKiBhIGhpZXJhcmNoeSkuIE5vbi1sZWFmIGxycXMgaG9sZCBvdGhlciBoaWdoZXIgc2NoZWR1bGFibGUgZW50aXRpZXMKLQkgKiAobGlrZSB1c2VycywgY29udGFpbmVycyBldGMuKQotCSAqCi0JICogbGVhZl9jZnNfcnFfbGlzdCB0aWVzIHRvZ2V0aGVyIGxpc3Qgb2YgbGVhZiBjZnNfcnEncyBpbiBhIGNwdS4gVGhpcwotCSAqIGxpc3QgaXMgdXNlZCBkdXJpbmcgbG9hZCBiYWxhbmNlLgotCSAqLwotCWludCBvbl9saXN0OwotCXN0cnVjdCBsaXN0X2hlYWQgbGVhZl9jZnNfcnFfbGlzdDsKLQlzdHJ1Y3QgdGFza19ncm91cCAqdGc7CS8qIGdyb3VwIHRoYXQgIm93bnMiIHRoaXMgcnVucXVldWUgKi8KLQotI2lmZGVmIENPTkZJR19TTVAKLQkvKgotCSAqIHRoZSBwYXJ0IG9mIGxvYWQud2VpZ2h0IGNvbnRyaWJ1dGVkIGJ5IHRhc2tzCi0JICovCi0JdW5zaWduZWQgbG9uZyB0YXNrX3dlaWdodDsKLQotCS8qCi0JICogICBoX2xvYWQgPSB3ZWlnaHQgKiBmKHRnKQotCSAqCi0JICogV2hlcmUgZih0ZykgaXMgdGhlIHJlY3Vyc2l2ZSB3ZWlnaHQgZnJhY3Rpb24gYXNzaWduZWQgdG8KLQkgKiB0aGlzIGdyb3VwLgotCSAqLwotCXVuc2lnbmVkIGxvbmcgaF9sb2FkOwotCi0JLyoKLQkgKiBNYWludGFpbmluZyBwZXItY3B1IHNoYXJlcyBkaXN0cmlidXRpb24gZm9yIGdyb3VwIHNjaGVkdWxpbmcKLQkgKgotCSAqIGxvYWRfc3RhbXAgaXMgdGhlIGxhc3QgdGltZSB3ZSB1cGRhdGVkIHRoZSBsb2FkIGF2ZXJhZ2UKLQkgKiBsb2FkX2xhc3QgaXMgdGhlIGxhc3QgdGltZSB3ZSB1cGRhdGVkIHRoZSBsb2FkIGF2ZXJhZ2UgYW5kIHNhdyBsb2FkCi0JICogbG9hZF91bmFjY19leGVjX3RpbWUgaXMgY3VycmVudGx5IHVuYWNjb3VudGVkIGV4ZWN1dGlvbiB0aW1lCi0JICovCi0JdTY0IGxvYWRfYXZnOwotCXU2NCBsb2FkX3BlcmlvZDsKLQl1NjQgbG9hZF9zdGFtcCwgbG9hZF9sYXN0LCBsb2FkX3VuYWNjX2V4ZWNfdGltZTsKLQotCXVuc2lnbmVkIGxvbmcgbG9hZF9jb250cmlidXRpb247Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfQ0ZTX0JBTkRXSURUSAotCWludCBydW50aW1lX2VuYWJsZWQ7Ci0JdTY0IHJ1bnRpbWVfZXhwaXJlczsKLQlzNjQgcnVudGltZV9yZW1haW5pbmc7Ci0KLQl1NjQgdGhyb3R0bGVkX3RpbWVzdGFtcDsKLQlpbnQgdGhyb3R0bGVkLCB0aHJvdHRsZV9jb3VudDsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHRocm90dGxlZF9saXN0OwotI2VuZGlmCi0jZW5kaWYKLX07Ci0KLSNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAotI2lmZGVmIENPTkZJR19DRlNfQkFORFdJRFRICi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjZnNfYmFuZHdpZHRoICp0Z19jZnNfYmFuZHdpZHRoKHN0cnVjdCB0YXNrX2dyb3VwICp0ZykKLXsKLQlyZXR1cm4gJnRnLT5jZnNfYmFuZHdpZHRoOwotfQotCi1zdGF0aWMgaW5saW5lIHU2NCBkZWZhdWx0X2Nmc19wZXJpb2Qodm9pZCk7Ci1zdGF0aWMgaW50IGRvX3NjaGVkX2Nmc19wZXJpb2RfdGltZXIoc3RydWN0IGNmc19iYW5kd2lkdGggKmNmc19iLCBpbnQgb3ZlcnJ1bik7Ci1zdGF0aWMgdm9pZCBkb19zY2hlZF9jZnNfc2xhY2tfdGltZXIoc3RydWN0IGNmc19iYW5kd2lkdGggKmNmc19iKTsKLQotc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHNjaGVkX2Nmc19zbGFja190aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCi17Ci0Jc3RydWN0IGNmc19iYW5kd2lkdGggKmNmc19iID0KLQkJY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCwgc2xhY2tfdGltZXIpOwotCWRvX3NjaGVkX2Nmc19zbGFja190aW1lcihjZnNfYik7Ci0KLQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Ci19Ci0KLXN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBzY2hlZF9jZnNfcGVyaW9kX3RpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKLXsKLQlzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IgPQotCQljb250YWluZXJfb2YodGltZXIsIHN0cnVjdCBjZnNfYmFuZHdpZHRoLCBwZXJpb2RfdGltZXIpOwotCWt0aW1lX3Qgbm93OwotCWludCBvdmVycnVuOwotCWludCBpZGxlID0gMDsKLQotCWZvciAoOzspIHsKLQkJbm93ID0gaHJ0aW1lcl9jYl9nZXRfdGltZSh0aW1lcik7Ci0JCW92ZXJydW4gPSBocnRpbWVyX2ZvcndhcmQodGltZXIsIG5vdywgY2ZzX2ItPnBlcmlvZCk7Ci0KLQkJaWYgKCFvdmVycnVuKQotCQkJYnJlYWs7Ci0KLQkJaWRsZSA9IGRvX3NjaGVkX2Nmc19wZXJpb2RfdGltZXIoY2ZzX2IsIG92ZXJydW4pOwotCX0KLQotCXJldHVybiBpZGxlID8gSFJUSU1FUl9OT1JFU1RBUlQgOiBIUlRJTUVSX1JFU1RBUlQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfY2ZzX2JhbmR3aWR0aChzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IpCi17Ci0JcmF3X3NwaW5fbG9ja19pbml0KCZjZnNfYi0+bG9jayk7Ci0JY2ZzX2ItPnJ1bnRpbWUgPSAwOwotCWNmc19iLT5xdW90YSA9IFJVTlRJTUVfSU5GOwotCWNmc19iLT5wZXJpb2QgPSBuc190b19rdGltZShkZWZhdWx0X2Nmc19wZXJpb2QoKSk7Ci0KLQlJTklUX0xJU1RfSEVBRCgmY2ZzX2ItPnRocm90dGxlZF9jZnNfcnEpOwotCWhydGltZXJfaW5pdCgmY2ZzX2ItPnBlcmlvZF90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKLQljZnNfYi0+cGVyaW9kX3RpbWVyLmZ1bmN0aW9uID0gc2NoZWRfY2ZzX3BlcmlvZF90aW1lcjsKLQlocnRpbWVyX2luaXQoJmNmc19iLT5zbGFja190aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKLQljZnNfYi0+c2xhY2tfdGltZXIuZnVuY3Rpb24gPSBzY2hlZF9jZnNfc2xhY2tfdGltZXI7Ci19Ci0KLXN0YXRpYyB2b2lkIGluaXRfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQotewotCWNmc19ycS0+cnVudGltZV9lbmFibGVkID0gMDsKLQlJTklUX0xJU1RfSEVBRCgmY2ZzX3JxLT50aHJvdHRsZWRfbGlzdCk7Ci19Ci0KLS8qIHJlcXVpcmVzIGNmc19iLT5sb2NrLCBtYXkgcmVsZWFzZSB0byByZXByb2dyYW0gdGltZXIgKi8KLXN0YXRpYyB2b2lkIF9fc3RhcnRfY2ZzX2JhbmR3aWR0aChzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IpCi17Ci0JLyoKLQkgKiBUaGUgdGltZXIgbWF5IGJlIGFjdGl2ZSBiZWNhdXNlIHdlJ3JlIHRyeWluZyB0byBzZXQgYSBuZXcgYmFuZHdpZHRoCi0JICogcGVyaW9kIG9yIGJlY2F1c2Ugd2UncmUgcmFjaW5nIHdpdGggdGhlIHRlYXItZG93biBwYXRoCi0JICogKHRpbWVyX2FjdGl2ZT09MCBiZWNvbWVzIHZpc2libGUgYmVmb3JlIHRoZSBocnRpbWVyIGNhbGwtYmFjawotCSAqIHRlcm1pbmF0ZXMpLiAgSW4gZWl0aGVyIGNhc2Ugd2UgZW5zdXJlIHRoYXQgaXQncyByZS1wcm9ncmFtbWVkCi0JICovCi0Jd2hpbGUgKHVubGlrZWx5KGhydGltZXJfYWN0aXZlKCZjZnNfYi0+cGVyaW9kX3RpbWVyKSkpIHsKLQkJcmF3X3NwaW5fdW5sb2NrKCZjZnNfYi0+bG9jayk7Ci0JCS8qIGVuc3VyZSBjZnNfYi0+bG9jayBpcyBhdmFpbGFibGUgd2hpbGUgd2Ugd2FpdCAqLwotCQlocnRpbWVyX2NhbmNlbCgmY2ZzX2ItPnBlcmlvZF90aW1lcik7Ci0KLQkJcmF3X3NwaW5fbG9jaygmY2ZzX2ItPmxvY2spOwotCQkvKiBpZiBzb21lb25lIGVsc2UgcmVzdGFydGVkIHRoZSB0aW1lciB0aGVuIHdlJ3JlIGRvbmUgKi8KLQkJaWYgKGNmc19iLT50aW1lcl9hY3RpdmUpCi0JCQlyZXR1cm47Ci0JfQotCi0JY2ZzX2ItPnRpbWVyX2FjdGl2ZSA9IDE7Ci0Jc3RhcnRfYmFuZHdpZHRoX3RpbWVyKCZjZnNfYi0+cGVyaW9kX3RpbWVyLCBjZnNfYi0+cGVyaW9kKTsKLX0KLQotc3RhdGljIHZvaWQgZGVzdHJveV9jZnNfYmFuZHdpZHRoKHN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYikKLXsKLQlocnRpbWVyX2NhbmNlbCgmY2ZzX2ItPnBlcmlvZF90aW1lcik7Ci0JaHJ0aW1lcl9jYW5jZWwoJmNmc19iLT5zbGFja190aW1lcik7Ci19Ci0jZWxzZQotc3RhdGljIHZvaWQgaW5pdF9jZnNfcnFfcnVudGltZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpIHt9Ci1zdGF0aWMgdm9pZCBpbml0X2Nmc19iYW5kd2lkdGgoc3RydWN0IGNmc19iYW5kd2lkdGggKmNmc19iKSB7fQotc3RhdGljIHZvaWQgZGVzdHJveV9jZnNfYmFuZHdpZHRoKHN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYikge30KLQotc3RhdGljIGlubGluZSBzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqdGdfY2ZzX2JhbmR3aWR0aChzdHJ1Y3QgdGFza19ncm91cCAqdGcpCi17Ci0JcmV0dXJuIE5VTEw7Ci19Ci0jZW5kaWYgLyogQ09ORklHX0NGU19CQU5EV0lEVEggKi8KLSNlbmRpZiAvKiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCAqLwotCi0vKiBSZWFsLVRpbWUgY2xhc3NlcycgcmVsYXRlZCBmaWVsZCBpbiBhIHJ1bnF1ZXVlOiAqLwotc3RydWN0IHJ0X3JxIHsKLQlzdHJ1Y3QgcnRfcHJpb19hcnJheSBhY3RpdmU7Ci0JdW5zaWduZWQgbG9uZyBydF9ucl9ydW5uaW5nOwotI2lmIGRlZmluZWQgQ09ORklHX1NNUCB8fCBkZWZpbmVkIENPTkZJR19SVF9HUk9VUF9TQ0hFRAotCXN0cnVjdCB7Ci0JCWludCBjdXJyOyAvKiBoaWdoZXN0IHF1ZXVlZCBydCB0YXNrIHByaW8gKi8KLSNpZmRlZiBDT05GSUdfU01QCi0JCWludCBuZXh0OyAvKiBuZXh0IGhpZ2hlc3QgKi8KLSNlbmRpZgotCX0gaGlnaGVzdF9wcmlvOwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1NNUAotCXVuc2lnbmVkIGxvbmcgcnRfbnJfbWlncmF0b3J5OwotCXVuc2lnbmVkIGxvbmcgcnRfbnJfdG90YWw7Ci0JaW50IG92ZXJsb2FkZWQ7Ci0Jc3RydWN0IHBsaXN0X2hlYWQgcHVzaGFibGVfdGFza3M7Ci0jZW5kaWYKLQlpbnQgcnRfdGhyb3R0bGVkOwotCXU2NCBydF90aW1lOwotCXU2NCBydF9ydW50aW1lOwotCS8qIE5lc3RzIGluc2lkZSB0aGUgcnEgbG9jazogKi8KLQlyYXdfc3BpbmxvY2tfdCBydF9ydW50aW1lX2xvY2s7Ci0KLSNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKLQl1bnNpZ25lZCBsb25nIHJ0X25yX2Jvb3N0ZWQ7Ci0KLQlzdHJ1Y3QgcnEgKnJxOwotCXN0cnVjdCBsaXN0X2hlYWQgbGVhZl9ydF9ycV9saXN0OwotCXN0cnVjdCB0YXNrX2dyb3VwICp0ZzsKLSNlbmRpZgotfTsKLQotI2lmZGVmIENPTkZJR19TTVAKLQotLyoKLSAqIFdlIGFkZCB0aGUgbm90aW9uIG9mIGEgcm9vdC1kb21haW4gd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGRlZmluZSBwZXItZG9tYWluCi0gKiB2YXJpYWJsZXMuIEVhY2ggZXhjbHVzaXZlIGNwdXNldCBlc3NlbnRpYWxseSBkZWZpbmVzIGFuIGlzbGFuZCBkb21haW4gYnkKLSAqIGZ1bGx5IHBhcnRpdGlvbmluZyB0aGUgbWVtYmVyIGNwdXMgZnJvbSBhbnkgb3RoZXIgY3B1c2V0LiBXaGVuZXZlciBhIG5ldwotICogZXhjbHVzaXZlIGNwdXNldCBpcyBjcmVhdGVkLCB3ZSBhbHNvIGNyZWF0ZSBhbmQgYXR0YWNoIGEgbmV3IHJvb3QtZG9tYWluCi0gKiBvYmplY3QuCi0gKgotICovCi1zdHJ1Y3Qgcm9vdF9kb21haW4gewotCWF0b21pY190IHJlZmNvdW50OwotCWF0b21pY190IHJ0b19jb3VudDsKLQlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwotCWNwdW1hc2tfdmFyX3Qgc3BhbjsKLQljcHVtYXNrX3Zhcl90IG9ubGluZTsKLQotCS8qCi0JICogVGhlICJSVCBvdmVybG9hZCIgZmxhZzogaXQgZ2V0cyBzZXQgaWYgYSBDUFUgaGFzIG1vcmUgdGhhbgotCSAqIG9uZSBydW5uYWJsZSBSVCB0YXNrLgotCSAqLwotCWNwdW1hc2tfdmFyX3QgcnRvX21hc2s7Ci0Jc3RydWN0IGNwdXByaSBjcHVwcmk7Ci19OwotCi0vKgotICogQnkgZGVmYXVsdCB0aGUgc3lzdGVtIGNyZWF0ZXMgYSBzaW5nbGUgcm9vdC1kb21haW4gd2l0aCBhbGwgY3B1cyBhcwotICogbWVtYmVycyAobWltaWNraW5nIHRoZSBnbG9iYWwgc3RhdGUgd2UgaGF2ZSB0b2RheSkuCi0gKi8KLXN0YXRpYyBzdHJ1Y3Qgcm9vdF9kb21haW4gZGVmX3Jvb3RfZG9tYWluOwotCi0jZW5kaWYgLyogQ09ORklHX1NNUCAqLwotCi0vKgotICogVGhpcyBpcyB0aGUgbWFpbiwgcGVyLUNQVSBydW5xdWV1ZSBkYXRhIHN0cnVjdHVyZS4KLSAqCi0gKiBMb2NraW5nIHJ1bGU6IHRob3NlIHBsYWNlcyB0aGF0IHdhbnQgdG8gbG9jayBtdWx0aXBsZSBydW5xdWV1ZXMKLSAqIChzdWNoIGFzIHRoZSBsb2FkIGJhbGFuY2luZyBvciB0aGUgdGhyZWFkIG1pZ3JhdGlvbiBjb2RlKSwgbG9jawotICogYWNxdWlyZSBvcGVyYXRpb25zIG11c3QgYmUgb3JkZXJlZCBieSBhc2NlbmRpbmcgJnJ1bnF1ZXVlLgotICovCi1zdHJ1Y3QgcnEgewotCS8qIHJ1bnF1ZXVlIGxvY2s6ICovCi0JcmF3X3NwaW5sb2NrX3QgbG9jazsKLQotCS8qCi0JICogbnJfcnVubmluZyBhbmQgY3B1X2xvYWQgc2hvdWxkIGJlIGluIHRoZSBzYW1lIGNhY2hlbGluZSBiZWNhdXNlCi0JICogcmVtb3RlIENQVXMgdXNlIGJvdGggdGhlc2UgZmllbGRzIHdoZW4gZG9pbmcgbG9hZCBjYWxjdWxhdGlvbi4KLQkgKi8KLQl1bnNpZ25lZCBsb25nIG5yX3J1bm5pbmc7Ci0JI2RlZmluZSBDUFVfTE9BRF9JRFhfTUFYIDUKLQl1bnNpZ25lZCBsb25nIGNwdV9sb2FkW0NQVV9MT0FEX0lEWF9NQVhdOwotCXVuc2lnbmVkIGxvbmcgbGFzdF9sb2FkX3VwZGF0ZV90aWNrOwotI2lmZGVmIENPTkZJR19OT19IWgotCXU2NCBub2h6X3N0YW1wOwotCXVuc2lnbmVkIGNoYXIgbm9oel9iYWxhbmNlX2tpY2s7Ci0jZW5kaWYKLQlpbnQgc2tpcF9jbG9ja191cGRhdGU7Ci0KLQkvKiBjYXB0dXJlIGxvYWQgZnJvbSAqYWxsKiB0YXNrcyBvbiB0aGlzIGNwdTogKi8KLQlzdHJ1Y3QgbG9hZF93ZWlnaHQgbG9hZDsKLQl1bnNpZ25lZCBsb25nIG5yX2xvYWRfdXBkYXRlczsKLQl1NjQgbnJfc3dpdGNoZXM7Ci0KLQlzdHJ1Y3QgY2ZzX3JxIGNmczsKLQlzdHJ1Y3QgcnRfcnEgcnQ7Ci0KLSNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAotCS8qIGxpc3Qgb2YgbGVhZiBjZnNfcnEgb24gdGhpcyBjcHU6ICovCi0Jc3RydWN0IGxpc3RfaGVhZCBsZWFmX2Nmc19ycV9saXN0OwotI2VuZGlmCi0jaWZkZWYgQ09ORklHX1JUX0dST1VQX1NDSEVECi0Jc3RydWN0IGxpc3RfaGVhZCBsZWFmX3J0X3JxX2xpc3Q7Ci0jZW5kaWYKLQotCS8qCi0JICogVGhpcyBpcyBwYXJ0IG9mIGEgZ2xvYmFsIGNvdW50ZXIgd2hlcmUgb25seSB0aGUgdG90YWwgc3VtCi0JICogb3ZlciBhbGwgQ1BVcyBtYXR0ZXJzLiBBIHRhc2sgY2FuIGluY3JlYXNlIHRoaXMgY291bnRlciBvbgotCSAqIG9uZSBDUFUgYW5kIGlmIGl0IGdvdCBtaWdyYXRlZCBhZnRlcndhcmRzIGl0IG1heSBkZWNyZWFzZQotCSAqIGl0IG9uIGFub3RoZXIgQ1BVLiBBbHdheXMgdXBkYXRlZCB1bmRlciB0aGUgcnVucXVldWUgbG9jazoKLQkgKi8KLQl1bnNpZ25lZCBsb25nIG5yX3VuaW50ZXJydXB0aWJsZTsKLQotCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciwgKmlkbGUsICpzdG9wOwotCXVuc2lnbmVkIGxvbmcgbmV4dF9iYWxhbmNlOwotCXN0cnVjdCBtbV9zdHJ1Y3QgKnByZXZfbW07Ci0KLQl1NjQgY2xvY2s7Ci0JdTY0IGNsb2NrX3Rhc2s7Ci0KLQlhdG9taWNfdCBucl9pb3dhaXQ7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0Jc3RydWN0IHJvb3RfZG9tYWluICpyZDsKLQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQotCXVuc2lnbmVkIGxvbmcgY3B1X3Bvd2VyOwotCi0JdW5zaWduZWQgY2hhciBpZGxlX2JhbGFuY2U7Ci0JLyogRm9yIGFjdGl2ZSBiYWxhbmNpbmcgKi8KLQlpbnQgcG9zdF9zY2hlZHVsZTsKLQlpbnQgYWN0aXZlX2JhbGFuY2U7Ci0JaW50IHB1c2hfY3B1OwotCXN0cnVjdCBjcHVfc3RvcF93b3JrIGFjdGl2ZV9iYWxhbmNlX3dvcms7Ci0JLyogY3B1IG9mIHRoaXMgcnVucXVldWU6ICovCi0JaW50IGNwdTsKLQlpbnQgb25saW5lOwotCi0JdTY0IHJ0X2F2ZzsKLQl1NjQgYWdlX3N0YW1wOwotCXU2NCBpZGxlX3N0YW1wOwotCXU2NCBhdmdfaWRsZTsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcKLQl1NjQgcHJldl9pcnFfdGltZTsKLSNlbmRpZgotI2lmZGVmIENPTkZJR19QQVJBVklSVAotCXU2NCBwcmV2X3N0ZWFsX3RpbWU7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfUEFSQVZJUlRfVElNRV9BQ0NPVU5USU5HCi0JdTY0IHByZXZfc3RlYWxfdGltZV9ycTsKLSNlbmRpZgotCi0JLyogY2FsY19sb2FkIHJlbGF0ZWQgZmllbGRzICovCi0JdW5zaWduZWQgbG9uZyBjYWxjX2xvYWRfdXBkYXRlOwotCWxvbmcgY2FsY19sb2FkX2FjdGl2ZTsKLQotI2lmZGVmIENPTkZJR19TQ0hFRF9IUlRJQ0sKLSNpZmRlZiBDT05GSUdfU01QCi0JaW50IGhydGlja19jc2RfcGVuZGluZzsKLQlzdHJ1Y3QgY2FsbF9zaW5nbGVfZGF0YSBocnRpY2tfY3NkOwotI2VuZGlmCi0Jc3RydWN0IGhydGltZXIgaHJ0aWNrX3RpbWVyOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfU0NIRURTVEFUUwotCS8qIGxhdGVuY3kgc3RhdHMgKi8KLQlzdHJ1Y3Qgc2NoZWRfaW5mbyBycV9zY2hlZF9pbmZvOwotCXVuc2lnbmVkIGxvbmcgbG9uZyBycV9jcHVfdGltZTsKLQkvKiBjb3VsZCBhYm92ZSBiZSBycS0+Y2ZzX3JxLmV4ZWNfY2xvY2sgKyBycS0+cnRfcnEucnRfcnVudGltZSA/ICovCi0KLQkvKiBzeXNfc2NoZWRfeWllbGQoKSBzdGF0cyAqLwotCXVuc2lnbmVkIGludCB5bGRfY291bnQ7Ci0KLQkvKiBzY2hlZHVsZSgpIHN0YXRzICovCi0JdW5zaWduZWQgaW50IHNjaGVkX3N3aXRjaDsKLQl1bnNpZ25lZCBpbnQgc2NoZWRfY291bnQ7Ci0JdW5zaWduZWQgaW50IHNjaGVkX2dvaWRsZTsKLQotCS8qIHRyeV90b193YWtlX3VwKCkgc3RhdHMgKi8KLQl1bnNpZ25lZCBpbnQgdHR3dV9jb3VudDsKLQl1bnNpZ25lZCBpbnQgdHR3dV9sb2NhbDsKLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NNUAotCXN0cnVjdCBsbGlzdF9oZWFkIHdha2VfbGlzdDsKLSNlbmRpZgotfTsKLQotc3RhdGljIERFRklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCBycSwgcnVucXVldWVzKTsKLQotCi1zdGF0aWMgdm9pZCBjaGVja19wcmVlbXB0X2N1cnIoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgZmxhZ3MpOwotCi1zdGF0aWMgaW5saW5lIGludCBjcHVfb2Yoc3RydWN0IHJxICpycSkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JcmV0dXJuIHJxLT5jcHU7Ci0jZWxzZQotCXJldHVybiAwOwotI2VuZGlmCi19Ci0KLSNkZWZpbmUgcmN1X2RlcmVmZXJlbmNlX2NoZWNrX3NjaGVkX2RvbWFpbihwKSBcCi0JcmN1X2RlcmVmZXJlbmNlX2NoZWNrKChwKSwgXAotCQkJICAgICAgbG9ja2RlcF9pc19oZWxkKCZzY2hlZF9kb21haW5zX211dGV4KSkKLQotLyoKLSAqIFRoZSBkb21haW4gdHJlZSAocnEtPnNkKSBpcyBwcm90ZWN0ZWQgYnkgUkNVJ3MgcXVpZXNjZW50IHN0YXRlIHRyYW5zaXRpb24uCi0gKiBTZWUgZGV0YWNoX2Rlc3Ryb3lfZG9tYWluczogc3luY2hyb25pemVfc2NoZWQgZm9yIGRldGFpbHMuCi0gKgotICogVGhlIGRvbWFpbiB0cmVlIG9mIGFueSBDUFUgbWF5IG9ubHkgYmUgYWNjZXNzZWQgZnJvbSB3aXRoaW4KLSAqIHByZWVtcHQtZGlzYWJsZWQgc2VjdGlvbnMuCi0gKi8KLSNkZWZpbmUgZm9yX2VhY2hfZG9tYWluKGNwdSwgX19zZCkgXAotCWZvciAoX19zZCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVja19zY2hlZF9kb21haW4oY3B1X3JxKGNwdSktPnNkKTsgX19zZDsgX19zZCA9IF9fc2QtPnBhcmVudCkKLQotI2RlZmluZSBjcHVfcnEoY3B1KQkJKCZwZXJfY3B1KHJ1bnF1ZXVlcywgKGNwdSkpKQotI2RlZmluZSB0aGlzX3JxKCkJCSgmX19nZXRfY3B1X3ZhcihydW5xdWV1ZXMpKQotI2RlZmluZSB0YXNrX3JxKHApCQljcHVfcnEodGFza19jcHUocCkpCi0jZGVmaW5lIGNwdV9jdXJyKGNwdSkJCShjcHVfcnEoY3B1KS0+Y3VycikKLSNkZWZpbmUgcmF3X3JxKCkJCSgmX19yYXdfZ2V0X2NwdV92YXIocnVucXVldWVzKSkKLQotI2lmZGVmIENPTkZJR19DR1JPVVBfU0NIRUQKLQotLyoKLSAqIFJldHVybiB0aGUgZ3JvdXAgdG8gd2hpY2ggdGhpcyB0YXNrcyBiZWxvbmdzLgotICoKLSAqIFdlIHVzZSB0YXNrX3N1YnN5c19zdGF0ZV9jaGVjaygpIGFuZCBleHRlbmQgdGhlIFJDVSB2ZXJpZmljYXRpb24gd2l0aAotICogcGktPmxvY2sgYW5kIHJxLT5sb2NrIGJlY2F1c2UgY3B1X2Nncm91cF9hdHRhY2goKSBob2xkcyB0aG9zZSBsb2NrcyBmb3IgZWFjaAotICogdGFzayBpdCBtb3ZlcyBpbnRvIHRoZSBjZ3JvdXAuIFRoZXJlZm9yZSBieSBob2xkaW5nIGVpdGhlciBvZiB0aG9zZSBsb2NrcywKLSAqIHdlIHBpbiB0aGUgdGFzayB0byB0aGUgY3VycmVudCBjZ3JvdXAuCi0gKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfZ3JvdXAgKnRhc2tfZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCXN0cnVjdCB0YXNrX2dyb3VwICp0ZzsKLQlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzOwotCi0JY3NzID0gdGFza19zdWJzeXNfc3RhdGVfY2hlY2socCwgY3B1X2Nncm91cF9zdWJzeXNfaWQsCi0JCQlsb2NrZGVwX2lzX2hlbGQoJnAtPnBpX2xvY2spIHx8Ci0JCQlsb2NrZGVwX2lzX2hlbGQoJnRhc2tfcnEocCktPmxvY2spKTsKLQl0ZyA9IGNvbnRhaW5lcl9vZihjc3MsIHN0cnVjdCB0YXNrX2dyb3VwLCBjc3MpOwotCi0JcmV0dXJuIGF1dG9ncm91cF90YXNrX2dyb3VwKHAsIHRnKTsKLX0KLQotLyogQ2hhbmdlIGEgdGFzaydzIGNmc19ycSBhbmQgcGFyZW50IGVudGl0eSBpZiBpdCBtb3ZlcyBhY3Jvc3MgQ1BVcy9ncm91cHMgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfdGFza19ycShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGludCBjcHUpCi17Ci0jaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKLQlwLT5zZS5jZnNfcnEgPSB0YXNrX2dyb3VwKHApLT5jZnNfcnFbY3B1XTsKLQlwLT5zZS5wYXJlbnQgPSB0YXNrX2dyb3VwKHApLT5zZVtjcHVdOwotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKLQlwLT5ydC5ydF9ycSAgPSB0YXNrX2dyb3VwKHApLT5ydF9ycVtjcHVdOwotCXAtPnJ0LnBhcmVudCA9IHRhc2tfZ3JvdXAocCktPnJ0X3NlW2NwdV07Ci0jZW5kaWYKLX0KLQotI2Vsc2UgLyogQ09ORklHX0NHUk9VUF9TQ0hFRCAqLwotCi1zdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Rhc2tfcnEoc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBpbnQgY3B1KSB7IH0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfZ3JvdXAgKnRhc2tfZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICpwKQotewotCXJldHVybiBOVUxMOwotfQotCi0jZW5kaWYgLyogQ09ORklHX0NHUk9VUF9TQ0hFRCAqLworREVGSU5FX01VVEVYKHNjaGVkX2RvbWFpbnNfbXV0ZXgpOworREVGSU5FX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IHJxLCBydW5xdWV1ZXMpOwogCiBzdGF0aWMgdm9pZCB1cGRhdGVfcnFfY2xvY2tfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzNjQgZGVsdGEpOwogCi1zdGF0aWMgdm9pZCB1cGRhdGVfcnFfY2xvY2soc3RydWN0IHJxICpycSkKK3ZvaWQgdXBkYXRlX3JxX2Nsb2NrKHN0cnVjdCBycSAqcnEpCiB7CiAJczY0IGRlbHRhOwogCkBAIC04MDIsNDQgKzEyMiwxNCBAQAogfQogCiAvKgotICogVHVuYWJsZXMgdGhhdCBiZWNvbWUgY29uc3RhbnRzIHdoZW4gQ09ORklHX1NDSEVEX0RFQlVHIGlzIG9mZjoKLSAqLwotI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwotIyBkZWZpbmUgY29uc3RfZGVidWcgX19yZWFkX21vc3RseQotI2Vsc2UKLSMgZGVmaW5lIGNvbnN0X2RlYnVnIHN0YXRpYyBjb25zdAotI2VuZGlmCi0KLS8qKgotICogcnVucXVldWVfaXNfbG9ja2VkIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGNwdSBydW5xdWV1ZSBpcyBsb2NrZWQKLSAqIEBjcHU6IHRoZSBwcm9jZXNzb3IgaW4gcXVlc3Rpb24uCi0gKgotICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIHByaW50ayB0byBiZSBjYWxsZWQgd2l0aCB0aGUgcnVucXVldWUgbG9jawotICogaGVsZCBhbmQga25vdyB3aGV0aGVyIG9yIG5vdCBpdCBpcyBPSyB0byB3YWtlIHVwIHRoZSBrbG9nZC4KLSAqLwotaW50IHJ1bnF1ZXVlX2lzX2xvY2tlZChpbnQgY3B1KQotewotCXJldHVybiByYXdfc3Bpbl9pc19sb2NrZWQoJmNwdV9ycShjcHUpLT5sb2NrKTsKLX0KLQotLyoKICAqIERlYnVnZ2luZzogdmFyaW91cyBmZWF0dXJlIGJpdHMKICAqLwogCiAjZGVmaW5lIFNDSEVEX0ZFQVQobmFtZSwgZW5hYmxlZCkJXAotCV9fU0NIRURfRkVBVF8jI25hbWUgLAotCi1lbnVtIHsKLSNpbmNsdWRlICJzY2hlZF9mZWF0dXJlcy5oIgotfTsKLQotI3VuZGVmIFNDSEVEX0ZFQVQKLQotI2RlZmluZSBTQ0hFRF9GRUFUKG5hbWUsIGVuYWJsZWQpCVwKIAkoMVVMIDw8IF9fU0NIRURfRkVBVF8jI25hbWUpICogZW5hYmxlZCB8CiAKIGNvbnN0X2RlYnVnIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfZmVhdHVyZXMgPQotI2luY2x1ZGUgInNjaGVkX2ZlYXR1cmVzLmgiCisjaW5jbHVkZSAiZmVhdHVyZXMuaCIKIAkwOwogCiAjdW5kZWYgU0NIRURfRkVBVApAQCAtODQ5LDcgKzEzOSw3IEBACiAJI25hbWUgLAogCiBzdGF0aWMgX19yZWFkX21vc3RseSBjaGFyICpzY2hlZF9mZWF0X25hbWVzW10gPSB7Ci0jaW5jbHVkZSAic2NoZWRfZmVhdHVyZXMuaCIKKyNpbmNsdWRlICJmZWF0dXJlcy5oIgogCU5VTEwKIH07CiAKQEAgLTg1OSw3ICsxNDksNyBAQAogewogCWludCBpOwogCi0JZm9yIChpID0gMDsgc2NoZWRfZmVhdF9uYW1lc1tpXTsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IF9fU0NIRURfRkVBVF9OUjsgaSsrKSB7CiAJCWlmICghKHN5c2N0bF9zY2hlZF9mZWF0dXJlcyAmICgxVUwgPDwgaSkpKQogCQkJc2VxX3B1dHMobSwgIk5PXyIpOwogCQlzZXFfcHJpbnRmKG0sICIlcyAiLCBzY2hlZF9mZWF0X25hbWVzW2ldKTsKQEAgLTg2OSw2ICsxNTksMzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2lmZGVmIEhBVkVfSlVNUF9MQUJFTAorCisjZGVmaW5lIGp1bXBfbGFiZWxfa2V5X190cnVlICBqdW1wX2xhYmVsX2tleV9lbmFibGVkCisjZGVmaW5lIGp1bXBfbGFiZWxfa2V5X19mYWxzZSBqdW1wX2xhYmVsX2tleV9kaXNhYmxlZAorCisjZGVmaW5lIFNDSEVEX0ZFQVQobmFtZSwgZW5hYmxlZCkJXAorCWp1bXBfbGFiZWxfa2V5X18jI2VuYWJsZWQgLAorCitzdHJ1Y3QganVtcF9sYWJlbF9rZXkgc2NoZWRfZmVhdF9rZXlzW19fU0NIRURfRkVBVF9OUl0gPSB7CisjaW5jbHVkZSAiZmVhdHVyZXMuaCIKK307CisKKyN1bmRlZiBTQ0hFRF9GRUFUCisKK3N0YXRpYyB2b2lkIHNjaGVkX2ZlYXRfZGlzYWJsZShpbnQgaSkKK3sKKwlpZiAoanVtcF9sYWJlbF9lbmFibGVkKCZzY2hlZF9mZWF0X2tleXNbaV0pKQorCQlqdW1wX2xhYmVsX2RlYygmc2NoZWRfZmVhdF9rZXlzW2ldKTsKK30KKworc3RhdGljIHZvaWQgc2NoZWRfZmVhdF9lbmFibGUoaW50IGkpCit7CisJaWYgKCFqdW1wX2xhYmVsX2VuYWJsZWQoJnNjaGVkX2ZlYXRfa2V5c1tpXSkpCisJCWp1bXBfbGFiZWxfaW5jKCZzY2hlZF9mZWF0X2tleXNbaV0pOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIHNjaGVkX2ZlYXRfZGlzYWJsZShpbnQgaSkgeyB9Oworc3RhdGljIHZvaWQgc2NoZWRfZmVhdF9lbmFibGUoaW50IGkpIHsgfTsKKyNlbmRpZiAvKiBIQVZFX0pVTVBfTEFCRUwgKi8KKwogc3RhdGljIHNzaXplX3QKIHNjaGVkX2ZlYXRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLAogCQlzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCkBAIC04OTIsMTcgKzIxMiwyMCBAQAogCQljbXAgKz0gMzsKIAl9CiAKLQlmb3IgKGkgPSAwOyBzY2hlZF9mZWF0X25hbWVzW2ldOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgX19TQ0hFRF9GRUFUX05SOyBpKyspIHsKIAkJaWYgKHN0cmNtcChjbXAsIHNjaGVkX2ZlYXRfbmFtZXNbaV0pID09IDApIHsKLQkJCWlmIChuZWcpCisJCQlpZiAobmVnKSB7CiAJCQkJc3lzY3RsX3NjaGVkX2ZlYXR1cmVzICY9IH4oMVVMIDw8IGkpOwotCQkJZWxzZQorCQkJCXNjaGVkX2ZlYXRfZGlzYWJsZShpKTsKKwkJCX0gZWxzZSB7CiAJCQkJc3lzY3RsX3NjaGVkX2ZlYXR1cmVzIHw9ICgxVUwgPDwgaSk7CisJCQkJc2NoZWRfZmVhdF9lbmFibGUoaSk7CisJCQl9CiAJCQlicmVhazsKIAkJfQogCX0KIAotCWlmICghc2NoZWRfZmVhdF9uYW1lc1tpXSkKKwlpZiAoaSA9PSBfX1NDSEVEX0ZFQVRfTlIpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJKnBwb3MgKz0gY250OwpAQCAtOTMxLDEwICsyNTQsNyBAQAogCXJldHVybiAwOwogfQogbGF0ZV9pbml0Y2FsbChzY2hlZF9pbml0X2RlYnVnKTsKLQotI2VuZGlmCi0KLSNkZWZpbmUgc2NoZWRfZmVhdCh4KSAoc3lzY3RsX3NjaGVkX2ZlYXR1cmVzICYgKDFVTCA8PCBfX1NDSEVEX0ZFQVRfIyN4KSkKKyNlbmRpZiAvKiBDT05GSUdfU0NIRURfREVCVUcgKi8KIAogLyoKICAqIE51bWJlciBvZiB0YXNrcyB0byBpdGVyYXRlIGluIGEgc2luZ2xlIGJhbGFuY2UgcnVuLgpAQCAtOTU2LDcgKzI3Niw3IEBACiAgKi8KIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfcnRfcGVyaW9kID0gMTAwMDAwMDsKIAotc3RhdGljIF9fcmVhZF9tb3N0bHkgaW50IHNjaGVkdWxlcl9ydW5uaW5nOworX19yZWFkX21vc3RseSBpbnQgc2NoZWR1bGVyX3J1bm5pbmc7CiAKIC8qCiAgKiBwYXJ0IG9mIHRoZSBwZXJpb2QgdGhhdCB3ZSBhbGxvdyBydCB0YXNrcyB0byBydW4gaW4gdXMuCkBAIC05NjQsMTEyICsyODQsNyBAQAogICovCiBpbnQgc3lzY3RsX3NjaGVkX3J0X3J1bnRpbWUgPSA5NTAwMDA7CiAKLXN0YXRpYyBpbmxpbmUgdTY0IGdsb2JhbF9ydF9wZXJpb2Qodm9pZCkKLXsKLQlyZXR1cm4gKHU2NClzeXNjdGxfc2NoZWRfcnRfcGVyaW9kICogTlNFQ19QRVJfVVNFQzsKLX0KIAotc3RhdGljIGlubGluZSB1NjQgZ2xvYmFsX3J0X3J1bnRpbWUodm9pZCkKLXsKLQlpZiAoc3lzY3RsX3NjaGVkX3J0X3J1bnRpbWUgPCAwKQotCQlyZXR1cm4gUlVOVElNRV9JTkY7Ci0KLQlyZXR1cm4gKHU2NClzeXNjdGxfc2NoZWRfcnRfcnVudGltZSAqIE5TRUNfUEVSX1VTRUM7Ci19Ci0KLSNpZm5kZWYgcHJlcGFyZV9hcmNoX3N3aXRjaAotIyBkZWZpbmUgcHJlcGFyZV9hcmNoX3N3aXRjaChuZXh0KQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLSNpZm5kZWYgZmluaXNoX2FyY2hfc3dpdGNoCi0jIGRlZmluZSBmaW5pc2hfYXJjaF9zd2l0Y2gocHJldikJZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLXN0YXRpYyBpbmxpbmUgaW50IHRhc2tfY3VycmVudChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0JcmV0dXJuIHJxLT5jdXJyID09IHA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHRhc2tfcnVubmluZyhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCXJldHVybiBwLT5vbl9jcHU7Ci0jZWxzZQotCXJldHVybiB0YXNrX2N1cnJlbnQocnEsIHApOwotI2VuZGlmCi19Ci0KLSNpZm5kZWYgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKLXN0YXRpYyBpbmxpbmUgdm9pZCBwcmVwYXJlX2xvY2tfc3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JLyoKLQkgKiBXZSBjYW4gb3B0aW1pc2UgdGhpcyBvdXQgY29tcGxldGVseSBmb3IgIVNNUCwgYmVjYXVzZSB0aGUKLQkgKiBTTVAgcmViYWxhbmNpbmcgZnJvbSBpbnRlcnJ1cHQgaXMgdGhlIG9ubHkgdGhpbmcgdGhhdCBjYXJlcwotCSAqIGhlcmUuCi0JICovCi0JbmV4dC0+b25fY3B1ID0gMTsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX2xvY2tfc3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JLyoKLQkgKiBBZnRlciAtPm9uX2NwdSBpcyBjbGVhcmVkLCB0aGUgdGFzayBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgQ1BVLgotCSAqIFdlIG11c3QgZW5zdXJlIHRoaXMgZG9lc24ndCBoYXBwZW4gdW50aWwgdGhlIHN3aXRjaCBpcyBjb21wbGV0ZWx5Ci0JICogZmluaXNoZWQuCi0JICovCi0Jc21wX3dtYigpOwotCXByZXYtPm9uX2NwdSA9IDA7Ci0jZW5kaWYKLSNpZmRlZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKLQkvKiB0aGlzIGlzIGEgdmFsaWQgY2FzZSB3aGVuIGFub3RoZXIgdGFzayByZWxlYXNlcyB0aGUgc3BpbmxvY2sgKi8KLQlycS0+bG9jay5vd25lciA9IGN1cnJlbnQ7Ci0jZW5kaWYKLQkvKgotCSAqIElmIHdlIGFyZSB0cmFja2luZyBzcGlubG9jayBkZXBlbmRlbmNpZXMgdGhlbiB3ZSBoYXZlIHRvCi0JICogZml4IHVwIHRoZSBydW5xdWV1ZSBsb2NrIC0gd2hpY2ggZ2V0cyAnY2FycmllZCBvdmVyJyBmcm9tCi0JICogcHJldiBpbnRvIGN1cnJlbnQ6Ci0JICovCi0Jc3Bpbl9hY3F1aXJlKCZycS0+bG9jay5kZXBfbWFwLCAwLCAwLCBfVEhJU19JUF8pOwotCi0JcmF3X3NwaW5fdW5sb2NrX2lycSgmcnEtPmxvY2spOwotfQotCi0jZWxzZSAvKiBfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVyAqLwotc3RhdGljIGlubGluZSB2b2lkIHByZXBhcmVfbG9ja19zd2l0Y2goc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQotewotI2lmZGVmIENPTkZJR19TTVAKLQkvKgotCSAqIFdlIGNhbiBvcHRpbWlzZSB0aGlzIG91dCBjb21wbGV0ZWx5IGZvciAhU01QLCBiZWNhdXNlIHRoZQotCSAqIFNNUCByZWJhbGFuY2luZyBmcm9tIGludGVycnVwdCBpcyB0aGUgb25seSB0aGluZyB0aGF0IGNhcmVzCi0JICogaGVyZS4KLQkgKi8KLQluZXh0LT5vbl9jcHUgPSAxOwotI2VuZGlmCi0jaWZkZWYgX19BUkNIX1dBTlRfSU5URVJSVVBUU19PTl9DVFhTVwotCXJhd19zcGluX3VubG9ja19pcnEoJnJxLT5sb2NrKTsKLSNlbHNlCi0JcmF3X3NwaW5fdW5sb2NrKCZycS0+bG9jayk7Ci0jZW5kaWYKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZpbmlzaF9sb2NrX3N3aXRjaChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCi17Ci0jaWZkZWYgQ09ORklHX1NNUAotCS8qCi0JICogQWZ0ZXIgLT5vbl9jcHUgaXMgY2xlYXJlZCwgdGhlIHRhc2sgY2FuIGJlIG1vdmVkIHRvIGEgZGlmZmVyZW50IENQVS4KLQkgKiBXZSBtdXN0IGVuc3VyZSB0aGlzIGRvZXNuJ3QgaGFwcGVuIHVudGlsIHRoZSBzd2l0Y2ggaXMgY29tcGxldGVseQotCSAqIGZpbmlzaGVkLgotCSAqLwotCXNtcF93bWIoKTsKLQlwcmV2LT5vbl9jcHUgPSAwOwotI2VuZGlmCi0jaWZuZGVmIF9fQVJDSF9XQU5UX0lOVEVSUlVQVFNfT05fQ1RYU1cKLQlsb2NhbF9pcnFfZW5hYmxlKCk7Ci0jZW5kaWYKLX0KLSNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVyAqLwogCiAvKgogICogX190YXNrX3JxX2xvY2sgLSBsb2NrIHRoZSBycSBAcCByZXNpZGVzIG9uLgpAQCAtMTE1MiwyMCArMzY3LDYgQEAKICAqIHJxLT5sb2NrLgogICovCiAKLS8qCi0gKiBVc2UgaHJ0aWNrIHdoZW46Ci0gKiAgLSBlbmFibGVkIGJ5IGZlYXR1cmVzCi0gKiAgLSBocnRpbWVyIGlzIGFjdHVhbGx5IGhpZ2ggcmVzCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGhydGlja19lbmFibGVkKHN0cnVjdCBycSAqcnEpCi17Ci0JaWYgKCFzY2hlZF9mZWF0KEhSVElDSykpCi0JCXJldHVybiAwOwotCWlmICghY3B1X2FjdGl2ZShjcHVfb2YocnEpKSkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIGhydGltZXJfaXNfaHJlc19hY3RpdmUoJnJxLT5ocnRpY2tfdGltZXIpOwotfQotCiBzdGF0aWMgdm9pZCBocnRpY2tfY2xlYXIoc3RydWN0IHJxICpycSkKIHsKIAlpZiAoaHJ0aW1lcl9hY3RpdmUoJnJxLT5ocnRpY2tfdGltZXIpKQpAQCAtMTIwOSw3ICs0MTAsNyBAQAogICoKICAqIGNhbGxlZCB3aXRoIHJxLT5sb2NrIGhlbGQgYW5kIGlycXMgZGlzYWJsZWQKICAqLwotc3RhdGljIHZvaWQgaHJ0aWNrX3N0YXJ0KHN0cnVjdCBycSAqcnEsIHU2NCBkZWxheSkKK3ZvaWQgaHJ0aWNrX3N0YXJ0KHN0cnVjdCBycSAqcnEsIHU2NCBkZWxheSkKIHsKIAlzdHJ1Y3QgaHJ0aW1lciAqdGltZXIgPSAmcnEtPmhydGlja190aW1lcjsKIAlrdGltZV90IHRpbWUgPSBrdGltZV9hZGRfbnModGltZXItPmJhc2UtPmdldF90aW1lKCksIGRlbGF5KTsKQEAgLTEyNTMsNyArNDU0LDcgQEAKICAqCiAgKiBjYWxsZWQgd2l0aCBycS0+bG9jayBoZWxkIGFuZCBpcnFzIGRpc2FibGVkCiAgKi8KLXN0YXRpYyB2b2lkIGhydGlja19zdGFydChzdHJ1Y3QgcnEgKnJxLCB1NjQgZGVsYXkpCit2b2lkIGhydGlja19zdGFydChzdHJ1Y3QgcnEgKnJxLCB1NjQgZGVsYXkpCiB7CiAJX19ocnRpbWVyX3N0YXJ0X3JhbmdlX25zKCZycS0+aHJ0aWNrX3RpbWVyLCBuc190b19rdGltZShkZWxheSksIDAsCiAJCQlIUlRJTUVSX01PREVfUkVMX1BJTk5FRCwgMCk7CkBAIC0xMzA0LDcgKzUwNSw3IEBACiAjZGVmaW5lIHRza19pc19wb2xsaW5nKHQpIHRlc3RfdHNrX3RocmVhZF9mbGFnKHQsIFRJRl9QT0xMSU5HX05SRkxBRykKICNlbmRpZgogCi1zdGF0aWMgdm9pZCByZXNjaGVkX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQordm9pZCByZXNjaGVkX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCWludCBjcHU7CiAKQEAgLTEzMjUsNyArNTI2LDcgQEAKIAkJc21wX3NlbmRfcmVzY2hlZHVsZShjcHUpOwogfQogCi1zdGF0aWMgdm9pZCByZXNjaGVkX2NwdShpbnQgY3B1KQordm9pZCByZXNjaGVkX2NwdShpbnQgY3B1KQogewogCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtMTQwNiw3ICs2MDcsOCBAQAogCiBzdGF0aWMgaW5saW5lIGJvb2wgZ290X25vaHpfaWRsZV9raWNrKHZvaWQpCiB7Ci0JcmV0dXJuIGlkbGVfY3B1KHNtcF9wcm9jZXNzb3JfaWQoKSkgJiYgdGhpc19ycSgpLT5ub2h6X2JhbGFuY2Vfa2ljazsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXJldHVybiBpZGxlX2NwdShjcHUpICYmIHRlc3RfYml0KE5PSFpfQkFMQU5DRV9LSUNLLCBub2h6X2ZsYWdzKGNwdSkpOwogfQogCiAjZWxzZSAvKiBDT05GSUdfTk9fSFogKi8KQEAgLTE0MTgsMTIgKzYyMCw3IEBACiAKICNlbmRpZiAvKiBDT05GSUdfTk9fSFogKi8KIAotc3RhdGljIHU2NCBzY2hlZF9hdmdfcGVyaW9kKHZvaWQpCi17Ci0JcmV0dXJuICh1NjQpc3lzY3RsX3NjaGVkX3RpbWVfYXZnICogTlNFQ19QRVJfTVNFQyAvIDI7Ci19Ci0KLXN0YXRpYyB2b2lkIHNjaGVkX2F2Z191cGRhdGUoc3RydWN0IHJxICpycSkKK3ZvaWQgc2NoZWRfYXZnX3VwZGF0ZShzdHJ1Y3QgcnEgKnJxKQogewogCXM2NCBwZXJpb2QgPSBzY2hlZF9hdmdfcGVyaW9kKCk7CiAKQEAgLTE0MzksMTkzICs2MzYsMjMgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIHNjaGVkX3J0X2F2Z191cGRhdGUoc3RydWN0IHJxICpycSwgdTY0IHJ0X2RlbHRhKQotewotCXJxLT5ydF9hdmcgKz0gcnRfZGVsdGE7Ci0Jc2NoZWRfYXZnX3VwZGF0ZShycSk7Ci19Ci0KICNlbHNlIC8qICFDT05GSUdfU01QICovCi1zdGF0aWMgdm9pZCByZXNjaGVkX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQordm9pZCByZXNjaGVkX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQogewogCWFzc2VydF9yYXdfc3Bpbl9sb2NrZWQoJnRhc2tfcnEocCktPmxvY2spOwogCXNldF90c2tfbmVlZF9yZXNjaGVkKHApOwogfQotCi1zdGF0aWMgdm9pZCBzY2hlZF9ydF9hdmdfdXBkYXRlKHN0cnVjdCBycSAqcnEsIHU2NCBydF9kZWx0YSkKLXsKLX0KLQotc3RhdGljIHZvaWQgc2NoZWRfYXZnX3VwZGF0ZShzdHJ1Y3QgcnEgKnJxKQotewotfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAotI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKLSMgZGVmaW5lIFdNVUxUX0NPTlNUCSh+MFVMKQotI2Vsc2UKLSMgZGVmaW5lIFdNVUxUX0NPTlNUCSgxVUwgPDwgMzIpCi0jZW5kaWYKLQotI2RlZmluZSBXTVVMVF9TSElGVAkzMgotCi0vKgotICogU2hpZnQgcmlnaHQgYW5kIHJvdW5kOgotICovCi0jZGVmaW5lIFNSUih4LCB5KSAoKCh4KSArICgxVUwgPDwgKCh5KSAtIDEpKSkgPj4gKHkpKQotCi0vKgotICogZGVsdGEgKj0gd2VpZ2h0IC8gbHcKLSAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcKLWNhbGNfZGVsdGFfbWluZSh1bnNpZ25lZCBsb25nIGRlbHRhX2V4ZWMsIHVuc2lnbmVkIGxvbmcgd2VpZ2h0LAotCQlzdHJ1Y3QgbG9hZF93ZWlnaHQgKmx3KQotewotCXU2NCB0bXA7Ci0KLQkvKgotCSAqIHdlaWdodCBjYW4gYmUgbGVzcyB0aGFuIDJeU0NIRURfTE9BRF9SRVNPTFVUSU9OIGZvciB0YXNrIGdyb3VwIHNjaGVkCi0JICogZW50aXRpZXMgc2luY2UgTUlOX1NIQVJFUyA9IDIuIFRyZWF0IHdlaWdodCBhcyAxIGlmIGxlc3MgdGhhbgotCSAqIDJeU0NIRURfTE9BRF9SRVNPTFVUSU9OLgotCSAqLwotCWlmIChsaWtlbHkod2VpZ2h0ID4gKDFVTCA8PCBTQ0hFRF9MT0FEX1JFU09MVVRJT04pKSkKLQkJdG1wID0gKHU2NClkZWx0YV9leGVjICogc2NhbGVfbG9hZF9kb3duKHdlaWdodCk7Ci0JZWxzZQotCQl0bXAgPSAodTY0KWRlbHRhX2V4ZWM7Ci0KLQlpZiAoIWx3LT5pbnZfd2VpZ2h0KSB7Ci0JCXVuc2lnbmVkIGxvbmcgdyA9IHNjYWxlX2xvYWRfZG93bihsdy0+d2VpZ2h0KTsKLQotCQlpZiAoQklUU19QRVJfTE9ORyA+IDMyICYmIHVubGlrZWx5KHcgPj0gV01VTFRfQ09OU1QpKQotCQkJbHctPmludl93ZWlnaHQgPSAxOwotCQllbHNlIGlmICh1bmxpa2VseSghdykpCi0JCQlsdy0+aW52X3dlaWdodCA9IFdNVUxUX0NPTlNUOwotCQllbHNlCi0JCQlsdy0+aW52X3dlaWdodCA9IFdNVUxUX0NPTlNUIC8gdzsKLQl9Ci0KLQkvKgotCSAqIENoZWNrIHdoZXRoZXIgd2UnZCBvdmVyZmxvdyB0aGUgNjQtYml0IG11bHRpcGxpY2F0aW9uOgotCSAqLwotCWlmICh1bmxpa2VseSh0bXAgPiBXTVVMVF9DT05TVCkpCi0JCXRtcCA9IFNSUihTUlIodG1wLCBXTVVMVF9TSElGVC8yKSAqIGx3LT5pbnZfd2VpZ2h0LAotCQkJV01VTFRfU0hJRlQvMik7Ci0JZWxzZQotCQl0bXAgPSBTUlIodG1wICogbHctPmludl93ZWlnaHQsIFdNVUxUX1NISUZUKTsKLQotCXJldHVybiAodW5zaWduZWQgbG9uZyltaW4odG1wLCAodTY0KSh1bnNpZ25lZCBsb25nKUxPTkdfTUFYKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9sb2FkX2FkZChzdHJ1Y3QgbG9hZF93ZWlnaHQgKmx3LCB1bnNpZ25lZCBsb25nIGluYykKLXsKLQlsdy0+d2VpZ2h0ICs9IGluYzsKLQlsdy0+aW52X3dlaWdodCA9IDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbG9hZF9zdWIoc3RydWN0IGxvYWRfd2VpZ2h0ICpsdywgdW5zaWduZWQgbG9uZyBkZWMpCi17Ci0JbHctPndlaWdodCAtPSBkZWM7Ci0JbHctPmludl93ZWlnaHQgPSAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2xvYWRfc2V0KHN0cnVjdCBsb2FkX3dlaWdodCAqbHcsIHVuc2lnbmVkIGxvbmcgdykKLXsKLQlsdy0+d2VpZ2h0ID0gdzsKLQlsdy0+aW52X3dlaWdodCA9IDA7Ci19Ci0KLS8qCi0gKiBUbyBhaWQgaW4gYXZvaWRpbmcgdGhlIHN1YnZlcnNpb24gb2YgIm5pY2VuZXNzIiBkdWUgdG8gdW5ldmVuIGRpc3RyaWJ1dGlvbgotICogb2YgdGFza3Mgd2l0aCBhYm5vcm1hbCAibmljZSIgdmFsdWVzIGFjcm9zcyBDUFVzIHRoZSBjb250cmlidXRpb24gdGhhdAotICogZWFjaCB0YXNrIG1ha2VzIHRvIGl0cyBydW4gcXVldWUncyBsb2FkIGlzIHdlaWdodGVkIGFjY29yZGluZyB0byBpdHMKLSAqIHNjaGVkdWxpbmcgY2xhc3MgYW5kICJuaWNlIiB2YWx1ZS4gRm9yIFNDSEVEX05PUk1BTCB0YXNrcyB0aGlzIGlzIGp1c3QgYQotICogc2NhbGVkIHZlcnNpb24gb2YgdGhlIG5ldyB0aW1lIHNsaWNlIGFsbG9jYXRpb24gdGhhdCB0aGV5IHJlY2VpdmUgb24gdGltZQotICogc2xpY2UgZXhwaXJ5IGV0Yy4KLSAqLwotCi0jZGVmaW5lIFdFSUdIVF9JRExFUFJJTyAgICAgICAgICAgICAgICAzCi0jZGVmaW5lIFdNVUxUX0lETEVQUklPICAgICAgICAgMTQzMTY1NTc2NQotCi0vKgotICogTmljZSBsZXZlbHMgYXJlIG11bHRpcGxpY2F0aXZlLCB3aXRoIGEgZ2VudGxlIDEwJSBjaGFuZ2UgZm9yIGV2ZXJ5Ci0gKiBuaWNlIGxldmVsIGNoYW5nZWQuIEkuZS4gd2hlbiBhIENQVS1ib3VuZCB0YXNrIGdvZXMgZnJvbSBuaWNlIDAgdG8KLSAqIG5pY2UgMSwgaXQgd2lsbCBnZXQgfjEwJSBsZXNzIENQVSB0aW1lIHRoYW4gYW5vdGhlciBDUFUtYm91bmQgdGFzawotICogdGhhdCByZW1haW5lZCBvbiBuaWNlIDAuCi0gKgotICogVGhlICIxMCUgZWZmZWN0IiBpcyByZWxhdGl2ZSBhbmQgY3VtdWxhdGl2ZTogZnJvbSBfYW55XyBuaWNlIGxldmVsLAotICogaWYgeW91IGdvIHVwIDEgbGV2ZWwsIGl0J3MgLTEwJSBDUFUgdXNhZ2UsIGlmIHlvdSBnbyBkb3duIDEgbGV2ZWwKLSAqIGl0J3MgKzEwJSBDUFUgdXNhZ2UuICh0byBhY2hpZXZlIHRoYXQgd2UgdXNlIGEgbXVsdGlwbGllciBvZiAxLjI1LgotICogSWYgYSB0YXNrIGdvZXMgdXAgYnkgfjEwJSBhbmQgYW5vdGhlciB0YXNrIGdvZXMgZG93biBieSB+MTAlIHRoZW4KLSAqIHRoZSByZWxhdGl2ZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0gaXMgfjI1JS4pCi0gKi8KLXN0YXRpYyBjb25zdCBpbnQgcHJpb190b193ZWlnaHRbNDBdID0gewotIC8qIC0yMCAqLyAgICAgODg3NjEsICAgICA3MTc1NSwgICAgIDU2NDgzLCAgICAgNDYyNzMsICAgICAzNjI5MSwKLSAvKiAtMTUgKi8gICAgIDI5MTU0LCAgICAgMjMyNTQsICAgICAxODcwNSwgICAgIDE0OTQ5LCAgICAgMTE5MTYsCi0gLyogLTEwICovICAgICAgOTU0OCwgICAgICA3NjIwLCAgICAgIDYxMDAsICAgICAgNDkwNCwgICAgICAzOTA2LAotIC8qICAtNSAqLyAgICAgIDMxMjEsICAgICAgMjUwMSwgICAgICAxOTkxLCAgICAgIDE1ODYsICAgICAgMTI3NywKLSAvKiAgIDAgKi8gICAgICAxMDI0LCAgICAgICA4MjAsICAgICAgIDY1NSwgICAgICAgNTI2LCAgICAgICA0MjMsCi0gLyogICA1ICovICAgICAgIDMzNSwgICAgICAgMjcyLCAgICAgICAyMTUsICAgICAgIDE3MiwgICAgICAgMTM3LAotIC8qICAxMCAqLyAgICAgICAxMTAsICAgICAgICA4NywgICAgICAgIDcwLCAgICAgICAgNTYsICAgICAgICA0NSwKLSAvKiAgMTUgKi8gICAgICAgIDM2LCAgICAgICAgMjksICAgICAgICAyMywgICAgICAgIDE4LCAgICAgICAgMTUsCi19OwotCi0vKgotICogSW52ZXJzZSAoMl4zMi94KSB2YWx1ZXMgb2YgdGhlIHByaW9fdG9fd2VpZ2h0W10gYXJyYXksIHByZWNhbGN1bGF0ZWQuCi0gKgotICogSW4gY2FzZXMgd2hlcmUgdGhlIHdlaWdodCBkb2VzIG5vdCBjaGFuZ2Ugb2Z0ZW4sIHdlIGNhbiB1c2UgdGhlCi0gKiBwcmVjYWxjdWxhdGVkIGludmVyc2UgdG8gc3BlZWQgdXAgYXJpdGhtZXRpY3MgYnkgdHVybmluZyBkaXZpc2lvbnMKLSAqIGludG8gbXVsdGlwbGljYXRpb25zOgotICovCi1zdGF0aWMgY29uc3QgdTMyIHByaW9fdG9fd211bHRbNDBdID0gewotIC8qIC0yMCAqLyAgICAgNDgzODgsICAgICA1OTg1NiwgICAgIDc2MDQwLCAgICAgOTI4MTgsICAgIDExODM0OCwKLSAvKiAtMTUgKi8gICAgMTQ3MzIwLCAgICAxODQ2OTgsICAgIDIyOTYxNiwgICAgMjg3MzA4LCAgICAzNjA0MzcsCi0gLyogLTEwICovICAgIDQ0OTgyOSwgICAgNTYzNjQ0LCAgICA3MDQwOTMsICAgIDg3NTgwOSwgICAxMDk5NTgyLAotIC8qICAtNSAqLyAgIDEzNzYxNTEsICAgMTcxNzMwMCwgICAyMTU3MTkxLCAgIDI3MDgwNTAsICAgMzM2MzMyNiwKLSAvKiAgIDAgKi8gICA0MTk0MzA0LCAgIDUyMzc3NjUsICAgNjU1NzIwMiwgICA4MTY1MzM3LCAgMTAxNTM1ODcsCi0gLyogICA1ICovICAxMjgyMDc5OCwgIDE1NzkwMzIxLCAgMTk5NzY1OTIsICAyNDk3MDc0MCwgIDMxMzUwMTI2LAotIC8qICAxMCAqLyAgMzkwNDUxNTcsICA0OTM2NzQ0MCwgIDYxMzU2Njc2LCAgNzY2OTU4NDQsICA5NTQ0MzcxNywKLSAvKiAgMTUgKi8gMTE5MzA0NjQ3LCAxNDgxMDIzMjAsIDE4NjczNzcwOCwgMjM4NjA5Mjk0LCAyODYzMzExNTMsCi19OwotCi0vKiBUaW1lIHNwZW50IGJ5IHRoZSB0YXNrcyBvZiB0aGUgY3B1IGFjY291bnRpbmcgZ3JvdXAgZXhlY3V0aW5nIGluIC4uLiAqLwotZW51bSBjcHVhY2N0X3N0YXRfaW5kZXggewotCUNQVUFDQ1RfU1RBVF9VU0VSLAkvKiAuLi4gdXNlciBtb2RlICovCi0JQ1BVQUNDVF9TVEFUX1NZU1RFTSwJLyogLi4uIGtlcm5lbCBtb2RlICovCi0KLQlDUFVBQ0NUX1NUQVRfTlNUQVRTLAotfTsKLQotI2lmZGVmIENPTkZJR19DR1JPVVBfQ1BVQUNDVAotc3RhdGljIHZvaWQgY3B1YWNjdF9jaGFyZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHU2NCBjcHV0aW1lKTsKLXN0YXRpYyB2b2lkIGNwdWFjY3RfdXBkYXRlX3N0YXRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQllbnVtIGNwdWFjY3Rfc3RhdF9pbmRleCBpZHgsIGNwdXRpbWVfdCB2YWwpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVhY2N0X2NoYXJnZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgdTY0IGNwdXRpbWUpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgY3B1YWNjdF91cGRhdGVfc3RhdHMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0JCWVudW0gY3B1YWNjdF9zdGF0X2luZGV4IGlkeCwgY3B1dGltZV90IHZhbCkge30KLSNlbmRpZgotCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5jX2NwdV9sb2FkKHN0cnVjdCBycSAqcnEsIHVuc2lnbmVkIGxvbmcgbG9hZCkKLXsKLQl1cGRhdGVfbG9hZF9hZGQoJnJxLT5sb2FkLCBsb2FkKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGRlY19jcHVfbG9hZChzdHJ1Y3QgcnEgKnJxLCB1bnNpZ25lZCBsb25nIGxvYWQpCi17Ci0JdXBkYXRlX2xvYWRfc3ViKCZycS0+bG9hZCwgbG9hZCk7Ci19Ci0KICNpZiBkZWZpbmVkKENPTkZJR19SVF9HUk9VUF9TQ0hFRCkgfHwgKGRlZmluZWQoQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQpICYmIFwKIAkJCShkZWZpbmVkKENPTkZJR19TTVApIHx8IGRlZmluZWQoQ09ORklHX0NGU19CQU5EV0lEVEgpKSkKLXR5cGVkZWYgaW50ICgqdGdfdmlzaXRvcikoc3RydWN0IHRhc2tfZ3JvdXAgKiwgdm9pZCAqKTsKLQogLyoKICAqIEl0ZXJhdGUgdGFza19ncm91cCB0cmVlIHJvb3RlZCBhdCAqZnJvbSwgY2FsbGluZyBAZG93biB3aGVuIGZpcnN0IGVudGVyaW5nIGEKICAqIG5vZGUgYW5kIEB1cCB3aGVuIGxlYXZpbmcgaXQgZm9yIHRoZSBmaW5hbCB0aW1lLgogICoKICAqIENhbGxlciBtdXN0IGhvbGQgcmN1X2xvY2sgb3Igc3VmZmljaWVudCBlcXVpdmFsZW50LgogICovCi1zdGF0aWMgaW50IHdhbGtfdGdfdHJlZV9mcm9tKHN0cnVjdCB0YXNrX2dyb3VwICpmcm9tLAoraW50IHdhbGtfdGdfdHJlZV9mcm9tKHN0cnVjdCB0YXNrX2dyb3VwICpmcm9tLAogCQkJICAgICB0Z192aXNpdG9yIGRvd24sIHRnX3Zpc2l0b3IgdXAsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHRhc2tfZ3JvdXAgKnBhcmVudCwgKmNoaWxkOwpAQCAtMTY1NiwyNzAgKzY4MywxMyBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBJdGVyYXRlIHRoZSBmdWxsIHRyZWUsIGNhbGxpbmcgQGRvd24gd2hlbiBmaXJzdCBlbnRlcmluZyBhIG5vZGUgYW5kIEB1cCB3aGVuCi0gKiBsZWF2aW5nIGl0IGZvciB0aGUgZmluYWwgdGltZS4KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIHJjdV9sb2NrIG9yIHN1ZmZpY2llbnQgZXF1aXZhbGVudC4KLSAqLwotCi1zdGF0aWMgaW5saW5lIGludCB3YWxrX3RnX3RyZWUodGdfdmlzaXRvciBkb3duLCB0Z192aXNpdG9yIHVwLCB2b2lkICpkYXRhKQotewotCXJldHVybiB3YWxrX3RnX3RyZWVfZnJvbSgmcm9vdF90YXNrX2dyb3VwLCBkb3duLCB1cCwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgdGdfbm9wKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgdm9pZCAqZGF0YSkKK2ludCB0Z19ub3Aoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCB2b2lkICpkYXRhKQogewogCXJldHVybiAwOwogfQogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU01QCi0vKiBVc2VkIGluc3RlYWQgb2Ygc291cmNlX2xvYWQgd2hlbiB3ZSBrbm93IHRoZSB0eXBlID09IDAgKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHdlaWdodGVkX2NwdWxvYWQoY29uc3QgaW50IGNwdSkKLXsKLQlyZXR1cm4gY3B1X3JxKGNwdSktPmxvYWQud2VpZ2h0OwotfQotCi0vKgotICogUmV0dXJuIGEgbG93IGd1ZXNzIGF0IHRoZSBsb2FkIG9mIGEgbWlncmF0aW9uLXNvdXJjZSBjcHUgd2VpZ2h0ZWQKLSAqIGFjY29yZGluZyB0byB0aGUgc2NoZWR1bGluZyBjbGFzcyBhbmQgIm5pY2UiIHZhbHVlLgotICoKLSAqIFdlIHdhbnQgdG8gdW5kZXItZXN0aW1hdGUgdGhlIGxvYWQgb2YgbWlncmF0aW9uIHNvdXJjZXMsIHRvCi0gKiBiYWxhbmNlIGNvbnNlcnZhdGl2ZWx5LgotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBzb3VyY2VfbG9hZChpbnQgY3B1LCBpbnQgdHlwZSkKLXsKLQlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbCA9IHdlaWdodGVkX2NwdWxvYWQoY3B1KTsKLQotCWlmICh0eXBlID09IDAgfHwgIXNjaGVkX2ZlYXQoTEJfQklBUykpCi0JCXJldHVybiB0b3RhbDsKLQotCXJldHVybiBtaW4ocnEtPmNwdV9sb2FkW3R5cGUtMV0sIHRvdGFsKTsKLX0KLQotLyoKLSAqIFJldHVybiBhIGhpZ2ggZ3Vlc3MgYXQgdGhlIGxvYWQgb2YgYSBtaWdyYXRpb24tdGFyZ2V0IGNwdSB3ZWlnaHRlZAotICogYWNjb3JkaW5nIHRvIHRoZSBzY2hlZHVsaW5nIGNsYXNzIGFuZCAibmljZSIgdmFsdWUuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHRhcmdldF9sb2FkKGludCBjcHUsIGludCB0eXBlKQotewotCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKLQl1bnNpZ25lZCBsb25nIHRvdGFsID0gd2VpZ2h0ZWRfY3B1bG9hZChjcHUpOwotCi0JaWYgKHR5cGUgPT0gMCB8fCAhc2NoZWRfZmVhdChMQl9CSUFTKSkKLQkJcmV0dXJuIHRvdGFsOwotCi0JcmV0dXJuIG1heChycS0+Y3B1X2xvYWRbdHlwZS0xXSwgdG90YWwpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBwb3dlcl9vZihpbnQgY3B1KQotewotCXJldHVybiBjcHVfcnEoY3B1KS0+Y3B1X3Bvd2VyOwotfQotCi1zdGF0aWMgaW50IHRhc2tfaG90KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdTY0IG5vdywgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjcHVfYXZnX2xvYWRfcGVyX3Rhc2soaW50IGNwdSkKLXsKLQlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7Ci0JdW5zaWduZWQgbG9uZyBucl9ydW5uaW5nID0gQUNDRVNTX09OQ0UocnEtPm5yX3J1bm5pbmcpOwotCi0JaWYgKG5yX3J1bm5pbmcpCi0JCXJldHVybiBycS0+bG9hZC53ZWlnaHQgLyBucl9ydW5uaW5nOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNpZmRlZiBDT05GSUdfUFJFRU1QVAotCi1zdGF0aWMgdm9pZCBkb3VibGVfcnFfbG9jayhzdHJ1Y3QgcnEgKnJxMSwgc3RydWN0IHJxICpycTIpOwotCi0vKgotICogZmFpciBkb3VibGVfbG9ja19iYWxhbmNlOiBTYWZlbHkgYWNxdWlyZXMgYm90aCBycS0+bG9ja3MgaW4gYSBmYWlyCi0gKiB3YXkgYXQgdGhlIGV4cGVuc2Ugb2YgZm9yY2luZyBleHRyYSBhdG9taWMgb3BlcmF0aW9ucyBpbiBhbGwKLSAqIGludm9jYXRpb25zLiAgVGhpcyBhc3N1cmVzIHRoYXQgdGhlIGRvdWJsZV9sb2NrIGlzIGFjcXVpcmVkIHVzaW5nIHRoZQotICogc2FtZSB1bmRlcmx5aW5nIHBvbGljeSBhcyB0aGUgc3BpbmxvY2tfdCBvbiB0aGlzIGFyY2hpdGVjdHVyZSwgd2hpY2gKLSAqIHJlZHVjZXMgbGF0ZW5jeSBjb21wYXJlZCB0byB0aGUgdW5mYWlyIHZhcmlhbnQgYmVsb3cuICBIb3dldmVyLCBpdAotICogYWxzbyBhZGRzIG1vcmUgb3ZlcmhlYWQgYW5kIHRoZXJlZm9yZSBtYXkgcmVkdWNlIHRocm91Z2hwdXQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IF9kb3VibGVfbG9ja19iYWxhbmNlKHN0cnVjdCBycSAqdGhpc19ycSwgc3RydWN0IHJxICpidXNpZXN0KQotCV9fcmVsZWFzZXModGhpc19ycS0+bG9jaykKLQlfX2FjcXVpcmVzKGJ1c2llc3QtPmxvY2spCi0JX19hY3F1aXJlcyh0aGlzX3JxLT5sb2NrKQotewotCXJhd19zcGluX3VubG9jaygmdGhpc19ycS0+bG9jayk7Ci0JZG91YmxlX3JxX2xvY2sodGhpc19ycSwgYnVzaWVzdCk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotI2Vsc2UKLS8qCi0gKiBVbmZhaXIgZG91YmxlX2xvY2tfYmFsYW5jZTogT3B0aW1pemVzIHRocm91Z2hwdXQgYXQgdGhlIGV4cGVuc2Ugb2YKLSAqIGxhdGVuY3kgYnkgZWxpbWluYXRpbmcgZXh0cmEgYXRvbWljIG9wZXJhdGlvbnMgd2hlbiB0aGUgbG9ja3MgYXJlCi0gKiBhbHJlYWR5IGluIHByb3BlciBvcmRlciBvbiBlbnRyeS4gIFRoaXMgZmF2b3JzIGxvd2VyIGNwdS1pZHMgYW5kIHdpbGwKLSAqIGdyYW50IHRoZSBkb3VibGUgbG9jayB0byBsb3dlciBjcHVzIG92ZXIgaGlnaGVyIGlkcyB1bmRlciBjb250ZW50aW9uLAotICogcmVnYXJkbGVzcyBvZiBlbnRyeSBvcmRlciBpbnRvIHRoZSBmdW5jdGlvbi4KLSAqLwotc3RhdGljIGludCBfZG91YmxlX2xvY2tfYmFsYW5jZShzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCBycSAqYnVzaWVzdCkKLQlfX3JlbGVhc2VzKHRoaXNfcnEtPmxvY2spCi0JX19hY3F1aXJlcyhidXNpZXN0LT5sb2NrKQotCV9fYWNxdWlyZXModGhpc19ycS0+bG9jaykKLXsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICh1bmxpa2VseSghcmF3X3NwaW5fdHJ5bG9jaygmYnVzaWVzdC0+bG9jaykpKSB7Ci0JCWlmIChidXNpZXN0IDwgdGhpc19ycSkgewotCQkJcmF3X3NwaW5fdW5sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKLQkJCXJhd19zcGluX2xvY2soJmJ1c2llc3QtPmxvY2spOwotCQkJcmF3X3NwaW5fbG9ja19uZXN0ZWQoJnRoaXNfcnEtPmxvY2ssCi0JCQkJCSAgICAgIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKLQkJCXJldCA9IDE7Ci0JCX0gZWxzZQotCQkJcmF3X3NwaW5fbG9ja19uZXN0ZWQoJmJ1c2llc3QtPmxvY2ssCi0JCQkJCSAgICAgIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKLQl9Ci0JcmV0dXJuIHJldDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19QUkVFTVBUICovCi0KLS8qCi0gKiBkb3VibGVfbG9ja19iYWxhbmNlIC0gbG9jayB0aGUgYnVzaWVzdCBydW5xdWV1ZSwgdGhpc19ycSBpcyBsb2NrZWQgYWxyZWFkeS4KLSAqLwotc3RhdGljIGludCBkb3VibGVfbG9ja19iYWxhbmNlKHN0cnVjdCBycSAqdGhpc19ycSwgc3RydWN0IHJxICpidXNpZXN0KQotewotCWlmICh1bmxpa2VseSghaXJxc19kaXNhYmxlZCgpKSkgewotCQkvKiBwcmludGsoKSBkb2Vzbid0IHdvcmsgZ29vZCB1bmRlciBycS0+bG9jayAqLwotCQlyYXdfc3Bpbl91bmxvY2soJnRoaXNfcnEtPmxvY2spOwotCQlCVUdfT04oMSk7Ci0JfQotCi0JcmV0dXJuIF9kb3VibGVfbG9ja19iYWxhbmNlKHRoaXNfcnEsIGJ1c2llc3QpOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgZG91YmxlX3VubG9ja19iYWxhbmNlKHN0cnVjdCBycSAqdGhpc19ycSwgc3RydWN0IHJxICpidXNpZXN0KQotCV9fcmVsZWFzZXMoYnVzaWVzdC0+bG9jaykKLXsKLQlyYXdfc3Bpbl91bmxvY2soJmJ1c2llc3QtPmxvY2spOwotCWxvY2tfc2V0X3N1YmNsYXNzKCZ0aGlzX3JxLT5sb2NrLmRlcF9tYXAsIDAsIF9SRVRfSVBfKTsKLX0KLQotLyoKLSAqIGRvdWJsZV9ycV9sb2NrIC0gc2FmZWx5IGxvY2sgdHdvIHJ1bnF1ZXVlcwotICoKLSAqIE5vdGUgdGhpcyBkb2VzIG5vdCBkaXNhYmxlIGludGVycnVwdHMgbGlrZSB0YXNrX3JxX2xvY2ssCi0gKiB5b3UgbmVlZCB0byBkbyBzbyBtYW51YWxseSBiZWZvcmUgY2FsbGluZy4KLSAqLwotc3RhdGljIHZvaWQgZG91YmxlX3JxX2xvY2soc3RydWN0IHJxICpycTEsIHN0cnVjdCBycSAqcnEyKQotCV9fYWNxdWlyZXMocnExLT5sb2NrKQotCV9fYWNxdWlyZXMocnEyLT5sb2NrKQotewotCUJVR19PTighaXJxc19kaXNhYmxlZCgpKTsKLQlpZiAocnExID09IHJxMikgewotCQlyYXdfc3Bpbl9sb2NrKCZycTEtPmxvY2spOwotCQlfX2FjcXVpcmUocnEyLT5sb2NrKTsJLyogRmFrZSBpdCBvdXQgOykgKi8KLQl9IGVsc2UgewotCQlpZiAocnExIDwgcnEyKSB7Ci0JCQlyYXdfc3Bpbl9sb2NrKCZycTEtPmxvY2spOwotCQkJcmF3X3NwaW5fbG9ja19uZXN0ZWQoJnJxMi0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOwotCQl9IGVsc2UgewotCQkJcmF3X3NwaW5fbG9jaygmcnEyLT5sb2NrKTsKLQkJCXJhd19zcGluX2xvY2tfbmVzdGVkKCZycTEtPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKLQkJfQotCX0KLX0KLQotLyoKLSAqIGRvdWJsZV9ycV91bmxvY2sgLSBzYWZlbHkgdW5sb2NrIHR3byBydW5xdWV1ZXMKLSAqCi0gKiBOb3RlIHRoaXMgZG9lcyBub3QgcmVzdG9yZSBpbnRlcnJ1cHRzIGxpa2UgdGFza19ycV91bmxvY2ssCi0gKiB5b3UgbmVlZCB0byBkbyBzbyBtYW51YWxseSBhZnRlciBjYWxsaW5nLgotICovCi1zdGF0aWMgdm9pZCBkb3VibGVfcnFfdW5sb2NrKHN0cnVjdCBycSAqcnExLCBzdHJ1Y3QgcnEgKnJxMikKLQlfX3JlbGVhc2VzKHJxMS0+bG9jaykKLQlfX3JlbGVhc2VzKHJxMi0+bG9jaykKLXsKLQlyYXdfc3Bpbl91bmxvY2soJnJxMS0+bG9jayk7Ci0JaWYgKHJxMSAhPSBycTIpCi0JCXJhd19zcGluX3VubG9jaygmcnEyLT5sb2NrKTsKLQllbHNlCi0JCV9fcmVsZWFzZShycTItPmxvY2spOwotfQotCi0jZWxzZSAvKiBDT05GSUdfU01QICovCi0KLS8qCi0gKiBkb3VibGVfcnFfbG9jayAtIHNhZmVseSBsb2NrIHR3byBydW5xdWV1ZXMKLSAqCi0gKiBOb3RlIHRoaXMgZG9lcyBub3QgZGlzYWJsZSBpbnRlcnJ1cHRzIGxpa2UgdGFza19ycV9sb2NrLAotICogeW91IG5lZWQgdG8gZG8gc28gbWFudWFsbHkgYmVmb3JlIGNhbGxpbmcuCi0gKi8KLXN0YXRpYyB2b2lkIGRvdWJsZV9ycV9sb2NrKHN0cnVjdCBycSAqcnExLCBzdHJ1Y3QgcnEgKnJxMikKLQlfX2FjcXVpcmVzKHJxMS0+bG9jaykKLQlfX2FjcXVpcmVzKHJxMi0+bG9jaykKLXsKLQlCVUdfT04oIWlycXNfZGlzYWJsZWQoKSk7Ci0JQlVHX09OKHJxMSAhPSBycTIpOwotCXJhd19zcGluX2xvY2soJnJxMS0+bG9jayk7Ci0JX19hY3F1aXJlKHJxMi0+bG9jayk7CS8qIEZha2UgaXQgb3V0IDspICovCi19Ci0KLS8qCi0gKiBkb3VibGVfcnFfdW5sb2NrIC0gc2FmZWx5IHVubG9jayB0d28gcnVucXVldWVzCi0gKgotICogTm90ZSB0aGlzIGRvZXMgbm90IHJlc3RvcmUgaW50ZXJydXB0cyBsaWtlIHRhc2tfcnFfdW5sb2NrLAotICogeW91IG5lZWQgdG8gZG8gc28gbWFudWFsbHkgYWZ0ZXIgY2FsbGluZy4KLSAqLwotc3RhdGljIHZvaWQgZG91YmxlX3JxX3VubG9jayhzdHJ1Y3QgcnEgKnJxMSwgc3RydWN0IHJxICpycTIpCi0JX19yZWxlYXNlcyhycTEtPmxvY2spCi0JX19yZWxlYXNlcyhycTItPmxvY2spCi17Ci0JQlVHX09OKHJxMSAhPSBycTIpOwotCXJhd19zcGluX3VubG9jaygmcnExLT5sb2NrKTsKLQlfX3JlbGVhc2UocnEyLT5sb2NrKTsKLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNhbGNfbG9hZF9hY2NvdW50X2lkbGUoc3RydWN0IHJxICp0aGlzX3JxKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV9zeXNjdGwodm9pZCk7Ci1zdGF0aWMgaW50IGdldF91cGRhdGVfc3lzY3RsX2ZhY3Rvcih2b2lkKTsKLXN0YXRpYyB2b2lkIHVwZGF0ZV9jcHVfbG9hZChzdHJ1Y3QgcnEgKnRoaXNfcnEpOwotCi1zdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfdGFza19jcHUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBpbnQgY3B1KQotewotCXNldF90YXNrX3JxKHAsIGNwdSk7Ci0jaWZkZWYgQ09ORklHX1NNUAotCS8qCi0JICogQWZ0ZXIgLT5jcHUgaXMgc2V0IHVwIHRvIGEgbmV3IHZhbHVlLCB0YXNrX3JxX2xvY2socCwgLi4uKSBjYW4gYmUKLQkgKiBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQgb24gYW5vdGhlciBDUFUuIFdlIG11c3QgZW5zdXJlIHRoYXQgdXBkYXRlcyBvZgotCSAqIHBlci10YXNrIGRhdGEgaGF2ZSBiZWVuIGNvbXBsZXRlZCBieSB0aGlzIG1vbWVudC4KLQkgKi8KLQlzbXBfd21iKCk7Ci0JdGFza190aHJlYWRfaW5mbyhwKS0+Y3B1ID0gY3B1OwotI2VuZGlmCi19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NoZWRfY2xhc3MgcnRfc2NoZWRfY2xhc3M7Ci0KLSNkZWZpbmUgc2NoZWRfY2xhc3NfaGlnaGVzdCAoJnN0b3Bfc2NoZWRfY2xhc3MpCi0jZGVmaW5lIGZvcl9lYWNoX2NsYXNzKGNsYXNzKSBcCi0gICBmb3IgKGNsYXNzID0gc2NoZWRfY2xhc3NfaGlnaGVzdDsgY2xhc3M7IGNsYXNzID0gY2xhc3MtPm5leHQpCi0KLSNpbmNsdWRlICJzY2hlZF9zdGF0cy5oIgotCi1zdGF0aWMgdm9pZCBpbmNfbnJfcnVubmluZyhzdHJ1Y3QgcnEgKnJxKQotewotCXJxLT5ucl9ydW5uaW5nKys7Ci19Ci0KLXN0YXRpYyB2b2lkIGRlY19ucl9ydW5uaW5nKHN0cnVjdCBycSAqcnEpCi17Ci0JcnEtPm5yX3J1bm5pbmctLTsKLX0KK3ZvaWQgdXBkYXRlX2NwdV9sb2FkKHN0cnVjdCBycSAqdGhpc19ycSk7CiAKIHN0YXRpYyB2b2lkIHNldF9sb2FkX3dlaWdodChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CkBAIC0xOTU2LDcgKzcyNiw3IEBACiAvKgogICogYWN0aXZhdGVfdGFzayAtIG1vdmUgYSB0YXNrIHRvIHRoZSBydW5xdWV1ZS4KICAqLwotc3RhdGljIHZvaWQgYWN0aXZhdGVfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBmbGFncykKK3ZvaWQgYWN0aXZhdGVfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBmbGFncykKIHsKIAlpZiAodGFza19jb250cmlidXRlc190b19sb2FkKHApKQogCQlycS0+bnJfdW5pbnRlcnJ1cHRpYmxlLS07CkBAIC0xOTY3LDcgKzczNyw3IEBACiAvKgogICogZGVhY3RpdmF0ZV90YXNrIC0gcmVtb3ZlIGEgdGFzayBmcm9tIHRoZSBydW5xdWV1ZS4KICAqLwotc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV90YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGZsYWdzKQordm9pZCBkZWFjdGl2YXRlX3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgZmxhZ3MpCiB7CiAJaWYgKHRhc2tfY29udHJpYnV0ZXNfdG9fbG9hZChwKSkKIAkJcnEtPm5yX3VuaW50ZXJydXB0aWJsZSsrOwpAQCAtMjE1OCwxNCArOTI4LDE0IEBACiAjaWZkZWYgQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcKIHN0YXRpYyBpbnQgaXJxdGltZV9hY2NvdW50X2hpX3VwZGF0ZSh2b2lkKQogewotCXN0cnVjdCBjcHVfdXNhZ2Vfc3RhdCAqY3B1c3RhdCA9ICZrc3RhdF90aGlzX2NwdS5jcHVzdGF0OworCXU2NCAqY3B1c3RhdCA9IGtjcHVzdGF0X3RoaXNfY3B1LT5jcHVzdGF0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdTY0IGxhdGVzdF9uczsKIAlpbnQgcmV0ID0gMDsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlsYXRlc3RfbnMgPSB0aGlzX2NwdV9yZWFkKGNwdV9oYXJkaXJxX3RpbWUpOwotCWlmIChjcHV0aW1lNjRfZ3QobnNlY3NfdG9fY3B1dGltZTY0KGxhdGVzdF9ucyksIGNwdXN0YXQtPmlycSkpCisJaWYgKG5zZWNzX3RvX2NwdXRpbWU2NChsYXRlc3RfbnMpID4gY3B1c3RhdFtDUFVUSU1FX0lSUV0pCiAJCXJldCA9IDE7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiByZXQ7CkBAIC0yMTczLDE0ICs5NDMsMTQgQEAKIAogc3RhdGljIGludCBpcnF0aW1lX2FjY291bnRfc2lfdXBkYXRlKHZvaWQpCiB7Ci0Jc3RydWN0IGNwdV91c2FnZV9zdGF0ICpjcHVzdGF0ID0gJmtzdGF0X3RoaXNfY3B1LmNwdXN0YXQ7CisJdTY0ICpjcHVzdGF0ID0ga2NwdXN0YXRfdGhpc19jcHUtPmNwdXN0YXQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1NjQgbGF0ZXN0X25zOwogCWludCByZXQgPSAwOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWxhdGVzdF9ucyA9IHRoaXNfY3B1X3JlYWQoY3B1X3NvZnRpcnFfdGltZSk7Ci0JaWYgKGNwdXRpbWU2NF9ndChuc2Vjc190b19jcHV0aW1lNjQobGF0ZXN0X25zKSwgY3B1c3RhdC0+c29mdGlycSkpCisJaWYgKG5zZWNzX3RvX2NwdXRpbWU2NChsYXRlc3RfbnMpID4gY3B1c3RhdFtDUFVUSU1FX1NPRlRJUlFdKQogCQlyZXQgPSAxOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlyZXR1cm4gcmV0OwpAQCAtMjE5MiwxNSArOTYyLDYgQEAKIAogI2VuZGlmCiAKLSNpbmNsdWRlICJzY2hlZF9pZGxldGFzay5jIgotI2luY2x1ZGUgInNjaGVkX2ZhaXIuYyIKLSNpbmNsdWRlICJzY2hlZF9ydC5jIgotI2luY2x1ZGUgInNjaGVkX2F1dG9ncm91cC5jIgotI2luY2x1ZGUgInNjaGVkX3N0b3B0YXNrLmMiCi0jaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCi0jIGluY2x1ZGUgInNjaGVkX2RlYnVnLmMiCi0jZW5kaWYKLQogdm9pZCBzY2hlZF9zZXRfc3RvcF90YXNrKGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqc3RvcCkKIHsKIAlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW0gPSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9SVF9QUklPIC0gMSB9OwpAQCAtMjI5OCw3ICsxMDU5LDcgQEAKIAkJcC0+c2NoZWRfY2xhc3MtPnByaW9fY2hhbmdlZChycSwgcCwgb2xkcHJpbyk7CiB9CiAKLXN0YXRpYyB2b2lkIGNoZWNrX3ByZWVtcHRfY3VycihzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBmbGFncykKK3ZvaWQgY2hlY2tfcHJlZW1wdF9jdXJyKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGZsYWdzKQogewogCWNvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyAqY2xhc3M7CiAKQEAgLTIzMjQsMzggKzEwODUsNiBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAotLyoKLSAqIElzIHRoaXMgdGFzayBsaWtlbHkgY2FjaGUtaG90OgotICovCi1zdGF0aWMgaW50Ci10YXNrX2hvdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHU2NCBub3csIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQotewotCXM2NCBkZWx0YTsKLQotCWlmIChwLT5zY2hlZF9jbGFzcyAhPSAmZmFpcl9zY2hlZF9jbGFzcykKLQkJcmV0dXJuIDA7Ci0KLQlpZiAodW5saWtlbHkocC0+cG9saWN5ID09IFNDSEVEX0lETEUpKQotCQlyZXR1cm4gMDsKLQotCS8qCi0JICogQnVkZHkgY2FuZGlkYXRlcyBhcmUgY2FjaGUgaG90OgotCSAqLwotCWlmIChzY2hlZF9mZWF0KENBQ0hFX0hPVF9CVUREWSkgJiYgdGhpc19ycSgpLT5ucl9ydW5uaW5nICYmCi0JCQkoJnAtPnNlID09IGNmc19ycV9vZigmcC0+c2UpLT5uZXh0IHx8Ci0JCQkgJnAtPnNlID09IGNmc19ycV9vZigmcC0+c2UpLT5sYXN0KSkKLQkJcmV0dXJuIDE7Ci0KLQlpZiAoc3lzY3RsX3NjaGVkX21pZ3JhdGlvbl9jb3N0ID09IC0xKQotCQlyZXR1cm4gMTsKLQlpZiAoc3lzY3RsX3NjaGVkX21pZ3JhdGlvbl9jb3N0ID09IDApCi0JCXJldHVybiAwOwotCi0JZGVsdGEgPSBub3cgLSBwLT5zZS5leGVjX3N0YXJ0OwotCi0JcmV0dXJuIGRlbHRhIDwgKHM2NClzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3Q7Ci19Ci0KIHZvaWQgc2V0X3Rhc2tfY3B1KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgaW50IG5ld19jcHUpCiB7CiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCkBAIC0yNzgyLDYgKzE1MTEsMTEgQEAKIAogfQogI2VuZGlmIC8qIF9fQVJDSF9XQU5UX0lOVEVSUlVQVFNfT05fQ1RYU1cgKi8KKworc3RhdGljIGlubGluZSBpbnQgdHR3dV9zaGFyZV9jYWNoZShpbnQgdGhpc19jcHUsIGludCB0aGF0X2NwdSkKK3sKKwlyZXR1cm4gcGVyX2NwdShzZF9sbGNfaWQsIHRoaXNfY3B1KSA9PSBwZXJfY3B1KHNkX2xsY19pZCwgdGhhdF9jcHUpOworfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogc3RhdGljIHZvaWQgdHR3dV9xdWV1ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBjcHUpCkBAIC0yNzg5LDcgKzE1MjMsNyBAQAogCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NNUCkKLQlpZiAoc2NoZWRfZmVhdChUVFdVX1FVRVVFKSAmJiBjcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKSB7CisJaWYgKHNjaGVkX2ZlYXQoVFRXVV9RVUVVRSkgJiYgIXR0d3Vfc2hhcmVfY2FjaGUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHUpKSB7CiAJCXNjaGVkX2Nsb2NrX2NwdShjcHUpOyAvKiBzeW5jIGNsb2NrcyB4LWNwdSAqLwogCQl0dHd1X3F1ZXVlX3JlbW90ZShwLCBjcHUpOwogCQlyZXR1cm47CkBAIC0zMjAzLDYgKzE5MzcsNyBAQAogCWxvY2FsX2lycV9lbmFibGUoKTsKICNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXICovCiAJZmluaXNoX2xvY2tfc3dpdGNoKHJxLCBwcmV2KTsKKwl0cmFjZV9zY2hlZF9zdGF0X3NsZWVwdGltZShjdXJyZW50LCBycS0+Y2xvY2spOwogCiAJZmlyZV9zY2hlZF9pbl9wcmVlbXB0X25vdGlmaWVycyhjdXJyZW50KTsKIAlpZiAobW0pCkBAIC0zNDM4LDcgKzIxNzMsNyBAQAogICovCiBzdGF0aWMgYXRvbWljX2xvbmdfdCBjYWxjX2xvYWRfdGFza3NfaWRsZTsKIAotc3RhdGljIHZvaWQgY2FsY19sb2FkX2FjY291bnRfaWRsZShzdHJ1Y3QgcnEgKnRoaXNfcnEpCit2b2lkIGNhbGNfbG9hZF9hY2NvdW50X2lkbGUoc3RydWN0IHJxICp0aGlzX3JxKQogewogCWxvbmcgZGVsdGE7CiAKQEAgLTM1ODIsNyArMjMxNyw3IEBACiAJICovCiB9CiAjZWxzZQotc3RhdGljIHZvaWQgY2FsY19sb2FkX2FjY291bnRfaWRsZShzdHJ1Y3QgcnEgKnRoaXNfcnEpCit2b2lkIGNhbGNfbG9hZF9hY2NvdW50X2lkbGUoc3RydWN0IHJxICp0aGlzX3JxKQogewogfQogCkBAIC0zNzI1LDcgKzI0NjAsNyBAQAogICogc2NoZWR1bGVyIHRpY2sgKFRJQ0tfTlNFQykuIFdpdGggdGlja2xlc3MgaWRsZSB0aGlzIHdpbGwgbm90IGJlIGNhbGxlZAogICogZXZlcnkgdGljay4gV2UgZml4IGl0IHVwIGJhc2VkIG9uIGppZmZpZXMuCiAgKi8KLXN0YXRpYyB2b2lkIHVwZGF0ZV9jcHVfbG9hZChzdHJ1Y3QgcnEgKnRoaXNfcnEpCit2b2lkIHVwZGF0ZV9jcHVfbG9hZChzdHJ1Y3QgcnEgKnRoaXNfcnEpCiB7CiAJdW5zaWduZWQgbG9uZyB0aGlzX2xvYWQgPSB0aGlzX3JxLT5sb2FkLndlaWdodDsKIAl1bnNpZ25lZCBsb25nIGN1cnJfamlmZmllcyA9IGppZmZpZXM7CkBAIC0zODAzLDggKzI1MzgsMTAgQEAKICNlbmRpZgogCiBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qga2VybmVsX3N0YXQsIGtzdGF0KTsKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBrZXJuZWxfY3B1c3RhdCwga2VybmVsX2NwdXN0YXQpOwogCiBFWFBPUlRfUEVSX0NQVV9TWU1CT0woa3N0YXQpOworRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGtlcm5lbF9jcHVzdGF0KTsKIAogLyoKICAqIFJldHVybiBhbnkgbnMgb24gdGhlIHNjaGVkX2Nsb2NrIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gYWNjb3VudGVkIGluCkBAIC0zODU3LDYgKzI1OTQsNDIgQEAKIAlyZXR1cm4gbnM7CiB9CiAKKyNpZmRlZiBDT05GSUdfQ0dST1VQX0NQVUFDQ1QKK3N0cnVjdCBjZ3JvdXBfc3Vic3lzIGNwdWFjY3Rfc3Vic3lzOworc3RydWN0IGNwdWFjY3Qgcm9vdF9jcHVhY2N0OworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX2dyb3VwX2FjY291bnRfZmllbGQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgaW5kZXgsCisJCQkJCSAgICB1NjQgdG1wKQoreworI2lmZGVmIENPTkZJR19DR1JPVVBfQ1BVQUNDVAorCXN0cnVjdCBrZXJuZWxfY3B1c3RhdCAqa2NwdXN0YXQ7CisJc3RydWN0IGNwdWFjY3QgKmNhOworI2VuZGlmCisJLyoKKwkgKiBTaW5jZSBhbGwgdXBkYXRlcyBhcmUgc3VyZSB0byB0b3VjaCB0aGUgcm9vdCBjZ3JvdXAsIHdlCisJICogZ2V0IG91cnNlbHZlcyBhaGVhZCBhbmQgdG91Y2ggaXQgZmlyc3QuIElmIHRoZSByb290IGNncm91cAorCSAqIGlzIHRoZSBvbmx5IGNncm91cCwgdGhlbiBub3RoaW5nIGVsc2Ugc2hvdWxkIGJlIG5lY2Vzc2FyeS4KKwkgKgorCSAqLworCV9fZ2V0X2NwdV92YXIoa2VybmVsX2NwdXN0YXQpLmNwdXN0YXRbaW5kZXhdICs9IHRtcDsKKworI2lmZGVmIENPTkZJR19DR1JPVVBfQ1BVQUNDVAorCWlmICh1bmxpa2VseSghY3B1YWNjdF9zdWJzeXMuYWN0aXZlKSkKKwkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOworCWNhID0gdGFza19jYShwKTsKKwl3aGlsZSAoY2EgJiYgKGNhICE9ICZyb290X2NwdWFjY3QpKSB7CisJCWtjcHVzdGF0ID0gdGhpc19jcHVfcHRyKGNhLT5jcHVzdGF0KTsKKwkJa2NwdXN0YXQtPmNwdXN0YXRbaW5kZXhdICs9IHRtcDsKKwkJY2EgPSBwYXJlbnRfY2EoY2EpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKyNlbmRpZgorfQorCisKIC8qCiAgKiBBY2NvdW50IHVzZXIgY3B1IHRpbWUgdG8gYSBwcm9jZXNzLgogICogQHA6IHRoZSBwcm9jZXNzIHRoYXQgdGhlIGNwdSB0aW1lIGdldHMgYWNjb3VudGVkIHRvCkBAIC0zODY2LDIyICsyNjM5LDE4IEBACiB2b2lkIGFjY291bnRfdXNlcl90aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY3B1dGltZV90IGNwdXRpbWUsCiAJCSAgICAgICBjcHV0aW1lX3QgY3B1dGltZV9zY2FsZWQpCiB7Ci0Jc3RydWN0IGNwdV91c2FnZV9zdGF0ICpjcHVzdGF0ID0gJmtzdGF0X3RoaXNfY3B1LmNwdXN0YXQ7Ci0JY3B1dGltZTY0X3QgdG1wOworCWludCBpbmRleDsKIAogCS8qIEFkZCB1c2VyIHRpbWUgdG8gcHJvY2Vzcy4gKi8KLQlwLT51dGltZSA9IGNwdXRpbWVfYWRkKHAtPnV0aW1lLCBjcHV0aW1lKTsKLQlwLT51dGltZXNjYWxlZCA9IGNwdXRpbWVfYWRkKHAtPnV0aW1lc2NhbGVkLCBjcHV0aW1lX3NjYWxlZCk7CisJcC0+dXRpbWUgKz0gY3B1dGltZTsKKwlwLT51dGltZXNjYWxlZCArPSBjcHV0aW1lX3NjYWxlZDsKIAlhY2NvdW50X2dyb3VwX3VzZXJfdGltZShwLCBjcHV0aW1lKTsKIAotCS8qIEFkZCB1c2VyIHRpbWUgdG8gY3B1c3RhdC4gKi8KLQl0bXAgPSBjcHV0aW1lX3RvX2NwdXRpbWU2NChjcHV0aW1lKTsKLQlpZiAoVEFTS19OSUNFKHApID4gMCkKLQkJY3B1c3RhdC0+bmljZSA9IGNwdXRpbWU2NF9hZGQoY3B1c3RhdC0+bmljZSwgdG1wKTsKLQllbHNlCi0JCWNwdXN0YXQtPnVzZXIgPSBjcHV0aW1lNjRfYWRkKGNwdXN0YXQtPnVzZXIsIHRtcCk7CisJaW5kZXggPSAoVEFTS19OSUNFKHApID4gMCkgPyBDUFVUSU1FX05JQ0UgOiBDUFVUSU1FX1VTRVI7CiAKLQljcHVhY2N0X3VwZGF0ZV9zdGF0cyhwLCBDUFVBQ0NUX1NUQVRfVVNFUiwgY3B1dGltZSk7CisJLyogQWRkIHVzZXIgdGltZSB0byBjcHVzdGF0LiAqLworCXRhc2tfZ3JvdXBfYWNjb3VudF9maWVsZChwLCBpbmRleCwgKF9fZm9yY2UgdTY0KSBjcHV0aW1lKTsKKwogCS8qIEFjY291bnQgZm9yIHVzZXIgdGltZSB1c2VkICovCiAJYWNjdF91cGRhdGVfaW50ZWdyYWxzKHApOwogfQpAQCAtMzg5NSwyNCArMjY2NCwyMSBAQAogc3RhdGljIHZvaWQgYWNjb3VudF9ndWVzdF90aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY3B1dGltZV90IGNwdXRpbWUsCiAJCQkgICAgICAgY3B1dGltZV90IGNwdXRpbWVfc2NhbGVkKQogewotCWNwdXRpbWU2NF90IHRtcDsKLQlzdHJ1Y3QgY3B1X3VzYWdlX3N0YXQgKmNwdXN0YXQgPSAma3N0YXRfdGhpc19jcHUuY3B1c3RhdDsKLQotCXRtcCA9IGNwdXRpbWVfdG9fY3B1dGltZTY0KGNwdXRpbWUpOworCXU2NCAqY3B1c3RhdCA9IGtjcHVzdGF0X3RoaXNfY3B1LT5jcHVzdGF0OwogCiAJLyogQWRkIGd1ZXN0IHRpbWUgdG8gcHJvY2Vzcy4gKi8KLQlwLT51dGltZSA9IGNwdXRpbWVfYWRkKHAtPnV0aW1lLCBjcHV0aW1lKTsKLQlwLT51dGltZXNjYWxlZCA9IGNwdXRpbWVfYWRkKHAtPnV0aW1lc2NhbGVkLCBjcHV0aW1lX3NjYWxlZCk7CisJcC0+dXRpbWUgKz0gY3B1dGltZTsKKwlwLT51dGltZXNjYWxlZCArPSBjcHV0aW1lX3NjYWxlZDsKIAlhY2NvdW50X2dyb3VwX3VzZXJfdGltZShwLCBjcHV0aW1lKTsKLQlwLT5ndGltZSA9IGNwdXRpbWVfYWRkKHAtPmd0aW1lLCBjcHV0aW1lKTsKKwlwLT5ndGltZSArPSBjcHV0aW1lOwogCiAJLyogQWRkIGd1ZXN0IHRpbWUgdG8gY3B1c3RhdC4gKi8KIAlpZiAoVEFTS19OSUNFKHApID4gMCkgewotCQljcHVzdGF0LT5uaWNlID0gY3B1dGltZTY0X2FkZChjcHVzdGF0LT5uaWNlLCB0bXApOwotCQljcHVzdGF0LT5ndWVzdF9uaWNlID0gY3B1dGltZTY0X2FkZChjcHVzdGF0LT5ndWVzdF9uaWNlLCB0bXApOworCQljcHVzdGF0W0NQVVRJTUVfTklDRV0gKz0gKF9fZm9yY2UgdTY0KSBjcHV0aW1lOworCQljcHVzdGF0W0NQVVRJTUVfR1VFU1RfTklDRV0gKz0gKF9fZm9yY2UgdTY0KSBjcHV0aW1lOwogCX0gZWxzZSB7Ci0JCWNwdXN0YXQtPnVzZXIgPSBjcHV0aW1lNjRfYWRkKGNwdXN0YXQtPnVzZXIsIHRtcCk7Ci0JCWNwdXN0YXQtPmd1ZXN0ID0gY3B1dGltZTY0X2FkZChjcHVzdGF0LT5ndWVzdCwgdG1wKTsKKwkJY3B1c3RhdFtDUFVUSU1FX1VTRVJdICs9IChfX2ZvcmNlIHU2NCkgY3B1dGltZTsKKwkJY3B1c3RhdFtDUFVUSU1FX0dVRVNUXSArPSAoX19mb3JjZSB1NjQpIGNwdXRpbWU7CiAJfQogfQogCkBAIC0zOTI1LDE4ICsyNjkxLDE1IEBACiAgKi8KIHN0YXRpYyBpbmxpbmUKIHZvaWQgX19hY2NvdW50X3N5c3RlbV90aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY3B1dGltZV90IGNwdXRpbWUsCi0JCQljcHV0aW1lX3QgY3B1dGltZV9zY2FsZWQsIGNwdXRpbWU2NF90ICp0YXJnZXRfY3B1dGltZTY0KQorCQkJY3B1dGltZV90IGNwdXRpbWVfc2NhbGVkLCBpbnQgaW5kZXgpCiB7Ci0JY3B1dGltZTY0X3QgdG1wID0gY3B1dGltZV90b19jcHV0aW1lNjQoY3B1dGltZSk7Ci0KIAkvKiBBZGQgc3lzdGVtIHRpbWUgdG8gcHJvY2Vzcy4gKi8KLQlwLT5zdGltZSA9IGNwdXRpbWVfYWRkKHAtPnN0aW1lLCBjcHV0aW1lKTsKLQlwLT5zdGltZXNjYWxlZCA9IGNwdXRpbWVfYWRkKHAtPnN0aW1lc2NhbGVkLCBjcHV0aW1lX3NjYWxlZCk7CisJcC0+c3RpbWUgKz0gY3B1dGltZTsKKwlwLT5zdGltZXNjYWxlZCArPSBjcHV0aW1lX3NjYWxlZDsKIAlhY2NvdW50X2dyb3VwX3N5c3RlbV90aW1lKHAsIGNwdXRpbWUpOwogCiAJLyogQWRkIHN5c3RlbSB0aW1lIHRvIGNwdXN0YXQuICovCi0JKnRhcmdldF9jcHV0aW1lNjQgPSBjcHV0aW1lNjRfYWRkKCp0YXJnZXRfY3B1dGltZTY0LCB0bXApOwotCWNwdWFjY3RfdXBkYXRlX3N0YXRzKHAsIENQVUFDQ1RfU1RBVF9TWVNURU0sIGNwdXRpbWUpOworCXRhc2tfZ3JvdXBfYWNjb3VudF9maWVsZChwLCBpbmRleCwgKF9fZm9yY2UgdTY0KSBjcHV0aW1lKTsKIAogCS8qIEFjY291bnQgZm9yIHN5c3RlbSB0aW1lIHVzZWQgKi8KIAlhY2N0X3VwZGF0ZV9pbnRlZ3JhbHMocCk7CkBAIC0zOTUyLDggKzI3MTUsNyBAQAogdm9pZCBhY2NvdW50X3N5c3RlbV90aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGhhcmRpcnFfb2Zmc2V0LAogCQkJIGNwdXRpbWVfdCBjcHV0aW1lLCBjcHV0aW1lX3QgY3B1dGltZV9zY2FsZWQpCiB7Ci0Jc3RydWN0IGNwdV91c2FnZV9zdGF0ICpjcHVzdGF0ID0gJmtzdGF0X3RoaXNfY3B1LmNwdXN0YXQ7Ci0JY3B1dGltZTY0X3QgKnRhcmdldF9jcHV0aW1lNjQ7CisJaW50IGluZGV4OwogCiAJaWYgKChwLT5mbGFncyAmIFBGX1ZDUFUpICYmIChpcnFfY291bnQoKSAtIGhhcmRpcnFfb2Zmc2V0ID09IDApKSB7CiAJCWFjY291bnRfZ3Vlc3RfdGltZShwLCBjcHV0aW1lLCBjcHV0aW1lX3NjYWxlZCk7CkBAIC0zOTYxLDEzICsyNzIzLDEzIEBACiAJfQogCiAJaWYgKGhhcmRpcnFfY291bnQoKSAtIGhhcmRpcnFfb2Zmc2V0KQotCQl0YXJnZXRfY3B1dGltZTY0ID0gJmNwdXN0YXQtPmlycTsKKwkJaW5kZXggPSBDUFVUSU1FX0lSUTsKIAllbHNlIGlmIChpbl9zZXJ2aW5nX3NvZnRpcnEoKSkKLQkJdGFyZ2V0X2NwdXRpbWU2NCA9ICZjcHVzdGF0LT5zb2Z0aXJxOworCQlpbmRleCA9IENQVVRJTUVfU09GVElSUTsKIAllbHNlCi0JCXRhcmdldF9jcHV0aW1lNjQgPSAmY3B1c3RhdC0+c3lzdGVtOworCQlpbmRleCA9IENQVVRJTUVfU1lTVEVNOwogCi0JX19hY2NvdW50X3N5c3RlbV90aW1lKHAsIGNwdXRpbWUsIGNwdXRpbWVfc2NhbGVkLCB0YXJnZXRfY3B1dGltZTY0KTsKKwlfX2FjY291bnRfc3lzdGVtX3RpbWUocCwgY3B1dGltZSwgY3B1dGltZV9zY2FsZWQsIGluZGV4KTsKIH0KIAogLyoKQEAgLTM5NzYsMTAgKzI3MzgsOSBAQAogICovCiB2b2lkIGFjY291bnRfc3RlYWxfdGltZShjcHV0aW1lX3QgY3B1dGltZSkKIHsKLQlzdHJ1Y3QgY3B1X3VzYWdlX3N0YXQgKmNwdXN0YXQgPSAma3N0YXRfdGhpc19jcHUuY3B1c3RhdDsKLQljcHV0aW1lNjRfdCBjcHV0aW1lNjQgPSBjcHV0aW1lX3RvX2NwdXRpbWU2NChjcHV0aW1lKTsKKwl1NjQgKmNwdXN0YXQgPSBrY3B1c3RhdF90aGlzX2NwdS0+Y3B1c3RhdDsKIAotCWNwdXN0YXQtPnN0ZWFsID0gY3B1dGltZTY0X2FkZChjcHVzdGF0LT5zdGVhbCwgY3B1dGltZTY0KTsKKwljcHVzdGF0W0NQVVRJTUVfU1RFQUxdICs9IChfX2ZvcmNlIHU2NCkgY3B1dGltZTsKIH0KIAogLyoKQEAgLTM5ODgsMTQgKzI3NDksMTMgQEAKICAqLwogdm9pZCBhY2NvdW50X2lkbGVfdGltZShjcHV0aW1lX3QgY3B1dGltZSkKIHsKLQlzdHJ1Y3QgY3B1X3VzYWdlX3N0YXQgKmNwdXN0YXQgPSAma3N0YXRfdGhpc19jcHUuY3B1c3RhdDsKLQljcHV0aW1lNjRfdCBjcHV0aW1lNjQgPSBjcHV0aW1lX3RvX2NwdXRpbWU2NChjcHV0aW1lKTsKKwl1NjQgKmNwdXN0YXQgPSBrY3B1c3RhdF90aGlzX2NwdS0+Y3B1c3RhdDsKIAlzdHJ1Y3QgcnEgKnJxID0gdGhpc19ycSgpOwogCiAJaWYgKGF0b21pY19yZWFkKCZycS0+bnJfaW93YWl0KSA+IDApCi0JCWNwdXN0YXQtPmlvd2FpdCA9IGNwdXRpbWU2NF9hZGQoY3B1c3RhdC0+aW93YWl0LCBjcHV0aW1lNjQpOworCQljcHVzdGF0W0NQVVRJTUVfSU9XQUlUXSArPSAoX19mb3JjZSB1NjQpIGNwdXRpbWU7CiAJZWxzZQotCQljcHVzdGF0LT5pZGxlID0gY3B1dGltZTY0X2FkZChjcHVzdGF0LT5pZGxlLCBjcHV0aW1lNjQpOworCQljcHVzdGF0W0NQVVRJTUVfSURMRV0gKz0gKF9fZm9yY2UgdTY0KSBjcHV0aW1lOwogfQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGJvb2wgc3RlYWxfYWNjb3VudF9wcm9jZXNzX3RpY2sodm9pZCkKQEAgLTQwNDUsMTYgKzI4MDUsMTUgQEAKIAkJCQkJCXN0cnVjdCBycSAqcnEpCiB7CiAJY3B1dGltZV90IG9uZV9qaWZmeV9zY2FsZWQgPSBjcHV0aW1lX3RvX3NjYWxlZChjcHV0aW1lX29uZV9qaWZmeSk7Ci0JY3B1dGltZTY0X3QgdG1wID0gY3B1dGltZV90b19jcHV0aW1lNjQoY3B1dGltZV9vbmVfamlmZnkpOwotCXN0cnVjdCBjcHVfdXNhZ2Vfc3RhdCAqY3B1c3RhdCA9ICZrc3RhdF90aGlzX2NwdS5jcHVzdGF0OworCXU2NCAqY3B1c3RhdCA9IGtjcHVzdGF0X3RoaXNfY3B1LT5jcHVzdGF0OwogCiAJaWYgKHN0ZWFsX2FjY291bnRfcHJvY2Vzc190aWNrKCkpCiAJCXJldHVybjsKIAogCWlmIChpcnF0aW1lX2FjY291bnRfaGlfdXBkYXRlKCkpIHsKLQkJY3B1c3RhdC0+aXJxID0gY3B1dGltZTY0X2FkZChjcHVzdGF0LT5pcnEsIHRtcCk7CisJCWNwdXN0YXRbQ1BVVElNRV9JUlFdICs9IChfX2ZvcmNlIHU2NCkgY3B1dGltZV9vbmVfamlmZnk7CiAJfSBlbHNlIGlmIChpcnF0aW1lX2FjY291bnRfc2lfdXBkYXRlKCkpIHsKLQkJY3B1c3RhdC0+c29mdGlycSA9IGNwdXRpbWU2NF9hZGQoY3B1c3RhdC0+c29mdGlycSwgdG1wKTsKKwkJY3B1c3RhdFtDUFVUSU1FX1NPRlRJUlFdICs9IChfX2ZvcmNlIHU2NCkgY3B1dGltZV9vbmVfamlmZnk7CiAJfSBlbHNlIGlmICh0aGlzX2NwdV9rc29mdGlycWQoKSA9PSBwKSB7CiAJCS8qCiAJCSAqIGtzb2Z0aXJxZCB0aW1lIGRvIG5vdCBnZXQgYWNjb3VudGVkIGluIGNwdV9zb2Z0aXJxX3RpbWUuCkBAIC00MDYyLDcgKzI4MjEsNyBAQAogCQkgKiBBbHNvLCBwLT5zdGltZSBuZWVkcyB0byBiZSB1cGRhdGVkIGZvciBrc29mdGlycWQuCiAJCSAqLwogCQlfX2FjY291bnRfc3lzdGVtX3RpbWUocCwgY3B1dGltZV9vbmVfamlmZnksIG9uZV9qaWZmeV9zY2FsZWQsCi0JCQkJCSZjcHVzdGF0LT5zb2Z0aXJxKTsKKwkJCQkJQ1BVVElNRV9TT0ZUSVJRKTsKIAl9IGVsc2UgaWYgKHVzZXJfdGljaykgewogCQlhY2NvdW50X3VzZXJfdGltZShwLCBjcHV0aW1lX29uZV9qaWZmeSwgb25lX2ppZmZ5X3NjYWxlZCk7CiAJfSBlbHNlIGlmIChwID09IHJxLT5pZGxlKSB7CkBAIC00MDcxLDcgKzI4MzAsNyBAQAogCQlhY2NvdW50X2d1ZXN0X3RpbWUocCwgY3B1dGltZV9vbmVfamlmZnksIG9uZV9qaWZmeV9zY2FsZWQpOwogCX0gZWxzZSB7CiAJCV9fYWNjb3VudF9zeXN0ZW1fdGltZShwLCBjcHV0aW1lX29uZV9qaWZmeSwgb25lX2ppZmZ5X3NjYWxlZCwKLQkJCQkJJmNwdXN0YXQtPnN5c3RlbSk7CisJCQkJCUNQVVRJTUVfU1lTVEVNKTsKIAl9CiB9CiAKQEAgLTQxNzAsNyArMjkyOSw3IEBACiAKIHZvaWQgdGFza190aW1lcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdXRpbWVfdCAqdXQsIGNwdXRpbWVfdCAqc3QpCiB7Ci0JY3B1dGltZV90IHJ0aW1lLCB1dGltZSA9IHAtPnV0aW1lLCB0b3RhbCA9IGNwdXRpbWVfYWRkKHV0aW1lLCBwLT5zdGltZSk7CisJY3B1dGltZV90IHJ0aW1lLCB1dGltZSA9IHAtPnV0aW1lLCB0b3RhbCA9IHV0aW1lICsgcC0+c3RpbWU7CiAKIAkvKgogCSAqIFVzZSBDRlMncyBwcmVjaXNlIGFjY291bnRpbmc6CkBAIC00MTc4LDExICsyOTM3LDExIEBACiAJcnRpbWUgPSBuc2Vjc190b19jcHV0aW1lKHAtPnNlLnN1bV9leGVjX3J1bnRpbWUpOwogCiAJaWYgKHRvdGFsKSB7Ci0JCXU2NCB0ZW1wID0gcnRpbWU7CisJCXU2NCB0ZW1wID0gKF9fZm9yY2UgdTY0KSBydGltZTsKIAotCQl0ZW1wICo9IHV0aW1lOwotCQlkb19kaXYodGVtcCwgdG90YWwpOwotCQl1dGltZSA9IChjcHV0aW1lX3QpdGVtcDsKKwkJdGVtcCAqPSAoX19mb3JjZSB1NjQpIHV0aW1lOworCQlkb19kaXYodGVtcCwgKF9fZm9yY2UgdTMyKSB0b3RhbCk7CisJCXV0aW1lID0gKF9fZm9yY2UgY3B1dGltZV90KSB0ZW1wOwogCX0gZWxzZQogCQl1dGltZSA9IHJ0aW1lOwogCkBAIC00MTkwLDcgKzI5NDksNyBAQAogCSAqIENvbXBhcmUgd2l0aCBwcmV2aW91cyB2YWx1ZXMsIHRvIGtlZXAgbW9ub3RvbmljaXR5OgogCSAqLwogCXAtPnByZXZfdXRpbWUgPSBtYXgocC0+cHJldl91dGltZSwgdXRpbWUpOwotCXAtPnByZXZfc3RpbWUgPSBtYXgocC0+cHJldl9zdGltZSwgY3B1dGltZV9zdWIocnRpbWUsIHAtPnByZXZfdXRpbWUpKTsKKwlwLT5wcmV2X3N0aW1lID0gbWF4KHAtPnByZXZfc3RpbWUsIHJ0aW1lIC0gcC0+cHJldl91dGltZSk7CiAKIAkqdXQgPSBwLT5wcmV2X3V0aW1lOwogCSpzdCA9IHAtPnByZXZfc3RpbWU7CkBAIC00MjA3LDIxICsyOTY2LDIwIEBACiAKIAl0aHJlYWRfZ3JvdXBfY3B1dGltZShwLCAmY3B1dGltZSk7CiAKLQl0b3RhbCA9IGNwdXRpbWVfYWRkKGNwdXRpbWUudXRpbWUsIGNwdXRpbWUuc3RpbWUpOworCXRvdGFsID0gY3B1dGltZS51dGltZSArIGNwdXRpbWUuc3RpbWU7CiAJcnRpbWUgPSBuc2Vjc190b19jcHV0aW1lKGNwdXRpbWUuc3VtX2V4ZWNfcnVudGltZSk7CiAKIAlpZiAodG90YWwpIHsKLQkJdTY0IHRlbXAgPSBydGltZTsKKwkJdTY0IHRlbXAgPSAoX19mb3JjZSB1NjQpIHJ0aW1lOwogCi0JCXRlbXAgKj0gY3B1dGltZS51dGltZTsKLQkJZG9fZGl2KHRlbXAsIHRvdGFsKTsKLQkJdXRpbWUgPSAoY3B1dGltZV90KXRlbXA7CisJCXRlbXAgKj0gKF9fZm9yY2UgdTY0KSBjcHV0aW1lLnV0aW1lOworCQlkb19kaXYodGVtcCwgKF9fZm9yY2UgdTMyKSB0b3RhbCk7CisJCXV0aW1lID0gKF9fZm9yY2UgY3B1dGltZV90KSB0ZW1wOwogCX0gZWxzZQogCQl1dGltZSA9IHJ0aW1lOwogCiAJc2lnLT5wcmV2X3V0aW1lID0gbWF4KHNpZy0+cHJldl91dGltZSwgdXRpbWUpOwotCXNpZy0+cHJldl9zdGltZSA9IG1heChzaWctPnByZXZfc3RpbWUsCi0JCQkgICAgICBjcHV0aW1lX3N1YihydGltZSwgc2lnLT5wcmV2X3V0aW1lKSk7CisJc2lnLT5wcmV2X3N0aW1lID0gbWF4KHNpZy0+cHJldl9zdGltZSwgcnRpbWUgLSBzaWctPnByZXZfdXRpbWUpOwogCiAJKnV0ID0gc2lnLT5wcmV2X3V0aW1lOwogCSpzdCA9IHNpZy0+cHJldl9zdGltZTsKQEAgLTQzMjAsNiArMzA3OCw5IEBACiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKIAorCWlmIChvb3BzX2luX3Byb2dyZXNzKQorCQlyZXR1cm47CisKIAlwcmludGsoS0VSTl9FUlIgIkJVRzogc2NoZWR1bGluZyB3aGlsZSBhdG9taWM6ICVzLyVkLzB4JTA4eFxuIiwKIAkJcHJldi0+Y29tbSwgcHJldi0+cGlkLCBwcmVlbXB0X2NvdW50KCkpOwogCkBAIC00ODEwLDYgKzM1NzEsOSBAQAogICogVGhpcyB3YWl0cyBmb3IgZWl0aGVyIGEgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2sgdG8gYmUgc2lnbmFsZWQgb3IgZm9yIGEKICAqIHNwZWNpZmllZCB0aW1lb3V0IHRvIGV4cGlyZS4gVGhlIHRpbWVvdXQgaXMgaW4gamlmZmllcy4gSXQgaXMgbm90CiAgKiBpbnRlcnJ1cHRpYmxlLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBpZiB0aW1lZCBvdXQsIGFuZCBwb3NpdGl2ZSAoYXQgbGVhc3QgMSwgb3IgbnVtYmVyIG9mCisgKiBqaWZmaWVzIGxlZnQgdGlsbCB0aW1lb3V0KSBpZiBjb21wbGV0ZWQuCiAgKi8KIHVuc2lnbmVkIGxvbmcgX19zY2hlZAogd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KHN0cnVjdCBjb21wbGV0aW9uICp4LCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCkBAIC00ODI0LDYgKzM1ODgsOCBAQAogICoKICAqIFRoaXMgd2FpdHMgZm9yIGNvbXBsZXRpb24gb2YgYSBzcGVjaWZpYyB0YXNrIHRvIGJlIHNpZ25hbGVkLiBJdCBpcwogICogaW50ZXJydXB0aWJsZS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIC1FUkVTVEFSVFNZUyBpZiBpbnRlcnJ1cHRlZCwgMCBpZiBjb21wbGV0ZWQuCiAgKi8KIGludCBfX3NjaGVkIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZShzdHJ1Y3QgY29tcGxldGlvbiAqeCkKIHsKQEAgLTQ4NDEsNiArMzYwNyw5IEBACiAgKgogICogVGhpcyB3YWl0cyBmb3IgZWl0aGVyIGEgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2sgdG8gYmUgc2lnbmFsZWQgb3IgZm9yIGEKICAqIHNwZWNpZmllZCB0aW1lb3V0IHRvIGV4cGlyZS4gSXQgaXMgaW50ZXJydXB0aWJsZS4gVGhlIHRpbWVvdXQgaXMgaW4gamlmZmllcy4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIC1FUkVTVEFSVFNZUyBpZiBpbnRlcnJ1cHRlZCwgMCBpZiB0aW1lZCBvdXQsCisgKiBwb3NpdGl2ZSAoYXQgbGVhc3QgMSwgb3IgbnVtYmVyIG9mIGppZmZpZXMgbGVmdCB0aWxsIHRpbWVvdXQpIGlmIGNvbXBsZXRlZC4KICAqLwogbG9uZyBfX3NjaGVkCiB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGVfdGltZW91dChzdHJ1Y3QgY29tcGxldGlvbiAqeCwKQEAgLTQ4NTYsNiArMzYyNSw4IEBACiAgKgogICogVGhpcyB3YWl0cyB0byBiZSBzaWduYWxlZCBmb3IgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2suIEl0IGNhbiBiZQogICogaW50ZXJydXB0ZWQgYnkgYSBraWxsIHNpZ25hbC4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIC1FUkVTVEFSVFNZUyBpZiBpbnRlcnJ1cHRlZCwgMCBpZiBjb21wbGV0ZWQuCiAgKi8KIGludCBfX3NjaGVkIHdhaXRfZm9yX2NvbXBsZXRpb25fa2lsbGFibGUoc3RydWN0IGNvbXBsZXRpb24gKngpCiB7CkBAIC00ODc0LDYgKzM2NDUsOSBAQAogICogVGhpcyB3YWl0cyBmb3IgZWl0aGVyIGEgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2sgdG8gYmUKICAqIHNpZ25hbGVkIG9yIGZvciBhIHNwZWNpZmllZCB0aW1lb3V0IHRvIGV4cGlyZS4gSXQgY2FuIGJlCiAgKiBpbnRlcnJ1cHRlZCBieSBhIGtpbGwgc2lnbmFsLiBUaGUgdGltZW91dCBpcyBpbiBqaWZmaWVzLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMgLUVSRVNUQVJUU1lTIGlmIGludGVycnVwdGVkLCAwIGlmIHRpbWVkIG91dCwKKyAqIHBvc2l0aXZlIChhdCBsZWFzdCAxLCBvciBudW1iZXIgb2YgamlmZmllcyBsZWZ0IHRpbGwgdGltZW91dCkgaWYgY29tcGxldGVkLgogICovCiBsb25nIF9fc2NoZWQKIHdhaXRfZm9yX2NvbXBsZXRpb25fa2lsbGFibGVfdGltZW91dChzdHJ1Y3QgY29tcGxldGlvbiAqeCwKQEAgLTU4MzgsNiArNDYxMiwxMyBAQAogCQkgKi8KIAkJaWYgKHByZWVtcHQgJiYgcnEgIT0gcF9ycSkKIAkJCXJlc2NoZWRfdGFzayhwX3JxLT5jdXJyKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBXZSBtaWdodCBoYXZlIHNldCBpdCBpbiB0YXNrX3lpZWxkX2ZhaXIoKSwgYnV0IGFyZQorCQkgKiBub3QgZ29pbmcgdG8gc2NoZWR1bGUoKSwgc28gZG9uJ3Qgd2FudCB0byBza2lwCisJCSAqIHRoZSBuZXh0IHVwZGF0ZS4KKwkJICovCisJCXJxLT5za2lwX2Nsb2NrX3VwZGF0ZSA9IDA7CiAJfQogCiBvdXQ6CkBAIC02MDA1LDcgKzQ3ODYsNyBAQAogCWZyZWUgPSBzdGFja19ub3RfdXNlZChwKTsKICNlbmRpZgogCXByaW50ayhLRVJOX0NPTlQgIiU1bHUgJTVkICU2ZCAweCUwOGx4XG4iLCBmcmVlLAotCQl0YXNrX3BpZF9ucihwKSwgdGFza19waWRfbnIocC0+cmVhbF9wYXJlbnQpLAorCQl0YXNrX3BpZF9ucihwKSwgdGFza19waWRfbnIocmN1X2RlcmVmZXJlbmNlKHAtPnJlYWxfcGFyZW50KSksCiAJCSh1bnNpZ25lZCBsb25nKXRhc2tfdGhyZWFkX2luZm8ocCktPmZsYWdzKTsKIAogCXNob3dfc3RhY2socCwgTlVMTCk7CkBAIC02MDk5LDUzICs0ODgwLDkgQEAKIAkgKi8KIAlpZGxlLT5zY2hlZF9jbGFzcyA9ICZpZGxlX3NjaGVkX2NsYXNzOwogCWZ0cmFjZV9ncmFwaF9pbml0X2lkbGVfdGFzayhpZGxlLCBjcHUpOwotfQotCi0vKgotICogSW5jcmVhc2UgdGhlIGdyYW51bGFyaXR5IHZhbHVlIHdoZW4gdGhlcmUgYXJlIG1vcmUgQ1BVcywKLSAqIGJlY2F1c2Ugd2l0aCBtb3JlIENQVXMgdGhlICdlZmZlY3RpdmUgbGF0ZW5jeScgYXMgdmlzaWJsZQotICogdG8gdXNlcnMgZGVjcmVhc2VzLiBCdXQgdGhlIHJlbGF0aW9uc2hpcCBpcyBub3QgbGluZWFyLAotICogc28gcGljayBhIHNlY29uZC1iZXN0IGd1ZXNzIGJ5IGdvaW5nIHdpdGggdGhlIGxvZzIgb2YgdGhlCi0gKiBudW1iZXIgb2YgQ1BVcy4KLSAqCi0gKiBUaGlzIGlkZWEgY29tZXMgZnJvbSB0aGUgU0Qgc2NoZWR1bGVyIG9mIENvbiBLb2xpdmFzOgotICovCi1zdGF0aWMgaW50IGdldF91cGRhdGVfc3lzY3RsX2ZhY3Rvcih2b2lkKQotewotCXVuc2lnbmVkIGludCBjcHVzID0gbWluX3QoaW50LCBudW1fb25saW5lX2NwdXMoKSwgOCk7Ci0JdW5zaWduZWQgaW50IGZhY3RvcjsKLQotCXN3aXRjaCAoc3lzY3RsX3NjaGVkX3R1bmFibGVfc2NhbGluZykgewotCWNhc2UgU0NIRURfVFVOQUJMRVNDQUxJTkdfTk9ORToKLQkJZmFjdG9yID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSBTQ0hFRF9UVU5BQkxFU0NBTElOR19MSU5FQVI6Ci0JCWZhY3RvciA9IGNwdXM7Ci0JCWJyZWFrOwotCWNhc2UgU0NIRURfVFVOQUJMRVNDQUxJTkdfTE9HOgotCWRlZmF1bHQ6Ci0JCWZhY3RvciA9IDEgKyBpbG9nMihjcHVzKTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGZhY3RvcjsKLX0KLQotc3RhdGljIHZvaWQgdXBkYXRlX3N5c2N0bCh2b2lkKQotewotCXVuc2lnbmVkIGludCBmYWN0b3IgPSBnZXRfdXBkYXRlX3N5c2N0bF9mYWN0b3IoKTsKLQotI2RlZmluZSBTRVRfU1lTQ1RMKG5hbWUpIFwKLQkoc3lzY3RsXyMjbmFtZSA9IChmYWN0b3IpICogbm9ybWFsaXplZF9zeXNjdGxfIyNuYW1lKQotCVNFVF9TWVNDVEwoc2NoZWRfbWluX2dyYW51bGFyaXR5KTsKLQlTRVRfU1lTQ1RMKHNjaGVkX2xhdGVuY3kpOwotCVNFVF9TWVNDVEwoc2NoZWRfd2FrZXVwX2dyYW51bGFyaXR5KTsKLSN1bmRlZiBTRVRfU1lTQ1RMCi19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9pbml0X2dyYW51bGFyaXR5KHZvaWQpCi17Ci0JdXBkYXRlX3N5c2N0bCgpOworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkKKwlzcHJpbnRmKGlkbGUtPmNvbW0sICIlcy8lZCIsIElOSVRfVEFTS19DT01NLCBjcHUpOworI2VuZGlmCiB9CiAKICNpZmRlZiBDT05GSUdfU01QCkBAIC02MzM0LDMwICs1MDcxLDYgQEAKIAlycS0+Y2FsY19sb2FkX2FjdGl2ZSA9IDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfQ0ZTX0JBTkRXSURUSAotc3RhdGljIHZvaWQgdW50aHJvdHRsZV9vZmZsaW5lX2Nmc19ycXMoc3RydWN0IHJxICpycSkKLXsKLQlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnE7Ci0KLQlmb3JfZWFjaF9sZWFmX2Nmc19ycShycSwgY2ZzX3JxKSB7Ci0JCXN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYiA9IHRnX2Nmc19iYW5kd2lkdGgoY2ZzX3JxLT50Zyk7Ci0KLQkJaWYgKCFjZnNfcnEtPnJ1bnRpbWVfZW5hYmxlZCkKLQkJCWNvbnRpbnVlOwotCi0JCS8qCi0JCSAqIGNsb2NrX3Rhc2sgaXMgbm90IGFkdmFuY2luZyBzbyB3ZSBqdXN0IG5lZWQgdG8gbWFrZSBzdXJlCi0JCSAqIHRoZXJlJ3Mgc29tZSB2YWxpZCBxdW90YSBhbW91bnQKLQkJICovCi0JCWNmc19ycS0+cnVudGltZV9yZW1haW5pbmcgPSBjZnNfYi0+cXVvdGE7Ci0JCWlmIChjZnNfcnFfdGhyb3R0bGVkKGNmc19ycSkpCi0JCQl1bnRocm90dGxlX2Nmc19ycShjZnNfcnEpOwotCX0KLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCB1bnRocm90dGxlX29mZmxpbmVfY2ZzX3JxcyhzdHJ1Y3QgcnEgKnJxKSB7fQotI2VuZGlmCi0KIC8qCiAgKiBNaWdyYXRlIGFsbCB0YXNrcyBmcm9tIHRoZSBycSwgc2xlZXBpbmcgdGFza3Mgd2lsbCBiZSBtaWdyYXRlZCBieQogICogdHJ5X3RvX3dha2VfdXAoKS0+c2VsZWN0X3Rhc2tfcnEoKS4KQEAgLTY5NjMsNiArNTY3NiwxMiBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCisvKgorICogQnkgZGVmYXVsdCB0aGUgc3lzdGVtIGNyZWF0ZXMgYSBzaW5nbGUgcm9vdC1kb21haW4gd2l0aCBhbGwgY3B1cyBhcworICogbWVtYmVycyAobWltaWNraW5nIHRoZSBnbG9iYWwgc3RhdGUgd2UgaGF2ZSB0b2RheSkuCisgKi8KK3N0cnVjdCByb290X2RvbWFpbiBkZWZfcm9vdF9kb21haW47CisKIHN0YXRpYyB2b2lkIGluaXRfZGVmcm9vdGRvbWFpbih2b2lkKQogewogCWluaXRfcm9vdGRvbWFpbigmZGVmX3Jvb3RfZG9tYWluKTsKQEAgLTcwMzQsNiArNTc1MywzMSBAQAogfQogCiAvKgorICogS2VlcCBhIHNwZWNpYWwgcG9pbnRlciB0byB0aGUgaGlnaGVzdCBzY2hlZF9kb21haW4gdGhhdCBoYXMKKyAqIFNEX1NIQVJFX1BLR19SRVNPVVJDRSBzZXQgKExhc3QgTGV2ZWwgQ2FjaGUgRG9tYWluKSBmb3IgdGhpcworICogYWxsb3dzIHVzIHRvIGF2b2lkIHNvbWUgcG9pbnRlciBjaGFzaW5nIHNlbGVjdF9pZGxlX3NpYmxpbmcoKS4KKyAqCisgKiBBbHNvIGtlZXAgYSB1bmlxdWUgSUQgcGVyIGRvbWFpbiAod2UgdXNlIHRoZSBmaXJzdCBjcHUgbnVtYmVyIGluCisgKiB0aGUgY3B1bWFzayBvZiB0aGUgZG9tYWluKSwgdGhpcyBhbGxvd3MgdXMgdG8gcXVpY2tseSB0ZWxsIGlmCisgKiB0d28gY3B1cyBhcmUgaW4gdGhlIHNhbWUgY2FjaGUgZG9tYWluLCBzZWUgdHR3dV9zaGFyZV9jYWNoZSgpLgorICovCitERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgc2NoZWRfZG9tYWluICosIHNkX2xsYyk7CitERUZJTkVfUEVSX0NQVShpbnQsIHNkX2xsY19pZCk7CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90b3BfY2FjaGVfZG9tYWluKGludCBjcHUpCit7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisJaW50IGlkID0gY3B1OworCisJc2QgPSBoaWdoZXN0X2ZsYWdfZG9tYWluKGNwdSwgU0RfU0hBUkVfUEtHX1JFU09VUkNFUyk7CisJaWYgKHNkKQorCQlpZCA9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZG9tYWluX3NwYW4oc2QpKTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihwZXJfY3B1KHNkX2xsYywgY3B1KSwgc2QpOworCXBlcl9jcHUoc2RfbGxjX2lkLCBjcHUpID0gaWQ7Cit9CisKKy8qCiAgKiBBdHRhY2ggdGhlIGRvbWFpbiAnc2QnIHRvICdjcHUnIGFzIGl0cyBiYXNlIGRvbWFpbi4gQ2FsbGVycyBtdXN0CiAgKiBob2xkIHRoZSBob3RwbHVnIGxvY2suCiAgKi8KQEAgLTcwNzIsNiArNTgxNiw4IEBACiAJdG1wID0gcnEtPnNkOwogCXJjdV9hc3NpZ25fcG9pbnRlcihycS0+c2QsIHNkKTsKIAlkZXN0cm95X3NjaGVkX2RvbWFpbnModG1wLCBjcHUpOworCisJdXBkYXRlX3RvcF9jYWNoZV9kb21haW4oY3B1KTsKIH0KIAogLyogY3B1cyB3aXRoIGlzb2xhdGVkIGRvbWFpbnMgKi8KQEAgLTcyMzEsNyArNTk3Nyw3IEBACiAJCQljb250aW51ZTsKIAogCQlzZyA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2dyb3VwKSArIGNwdW1hc2tfc2l6ZSgpLAotCQkJCUdGUF9LRVJORUwsIGNwdV90b19ub2RlKGkpKTsKKwkJCQlHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShjcHUpKTsKIAogCQlpZiAoIXNnKQogCQkJZ290byBmYWlsOwpAQCAtNzM2OSw2ICs2MTE1LDEyIEBACiAJCXJldHVybjsKIAogCXVwZGF0ZV9ncm91cF9wb3dlcihzZCwgY3B1KTsKKwlhdG9taWNfc2V0KCZzZy0+c2dwLT5ucl9idXN5X2NwdXMsIHNnLT5ncm91cF93ZWlnaHQpOworfQorCitpbnQgX193ZWFrIGFyY2hfc2Rfc2libGluZ19hc3ltX3BhY2tpbmcodm9pZCkKK3sKKyAgICAgICByZXR1cm4gMCpTRF9BU1lNX1BBQ0tJTkc7CiB9CiAKIC8qCkBAIC04MDA2LDI5ICs2NzU4LDYgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgdXBkYXRlX3J1bnRpbWUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCi0JCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCi17Ci0JaW50IGNwdSA9IChpbnQpKGxvbmcpaGNwdTsKLQotCXN3aXRjaCAoYWN0aW9uKSB7Ci0JY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgotCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46Ci0JCWRpc2FibGVfcnVudGltZShjcHVfcnEoY3B1KSk7Ci0JCXJldHVybiBOT1RJRllfT0s7Ci0KLQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQljYXNlIENQVV9ET1dOX0ZBSUxFRF9GUk9aRU46Ci0JY2FzZSBDUFVfT05MSU5FOgotCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JCWVuYWJsZV9ydW50aW1lKGNwdV9ycShjcHUpKTsKLQkJcmV0dXJuIE5PVElGWV9PSzsKLQotCWRlZmF1bHQ6Ci0JCXJldHVybiBOT1RJRllfRE9ORTsKLQl9Ci19Ci0KIHZvaWQgX19pbml0IHNjaGVkX2luaXRfc21wKHZvaWQpCiB7CiAJY3B1bWFza192YXJfdCBub25faXNvbGF0ZWRfY3B1czsKQEAgLTgwNzcsMTA0ICs2ODA2LDExIEBACiAJCSYmIGFkZHIgPCAodW5zaWduZWQgbG9uZylfX3NjaGVkX3RleHRfZW5kKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9jZnNfcnEoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQotewotCWNmc19ycS0+dGFza3NfdGltZWxpbmUgPSBSQl9ST09UOwotCUlOSVRfTElTVF9IRUFEKCZjZnNfcnEtPnRhc2tzKTsKLQljZnNfcnEtPm1pbl92cnVudGltZSA9ICh1NjQpKC0oMUxMIDw8IDIwKSk7Ci0jaWZuZGVmIENPTkZJR182NEJJVAotCWNmc19ycS0+bWluX3ZydW50aW1lX2NvcHkgPSBjZnNfcnEtPm1pbl92cnVudGltZTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBpbml0X3J0X3JxKHN0cnVjdCBydF9ycSAqcnRfcnEsIHN0cnVjdCBycSAqcnEpCi17Ci0Jc3RydWN0IHJ0X3ByaW9fYXJyYXkgKmFycmF5OwotCWludCBpOwotCi0JYXJyYXkgPSAmcnRfcnEtPmFjdGl2ZTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JUX1BSSU87IGkrKykgewotCQlJTklUX0xJU1RfSEVBRChhcnJheS0+cXVldWUgKyBpKTsKLQkJX19jbGVhcl9iaXQoaSwgYXJyYXktPmJpdG1hcCk7Ci0JfQotCS8qIGRlbGltaXRlciBmb3IgYml0c2VhcmNoOiAqLwotCV9fc2V0X2JpdChNQVhfUlRfUFJJTywgYXJyYXktPmJpdG1hcCk7Ci0KLSNpZiBkZWZpbmVkIENPTkZJR19TTVAKLQlydF9ycS0+aGlnaGVzdF9wcmlvLmN1cnIgPSBNQVhfUlRfUFJJTzsKLQlydF9ycS0+aGlnaGVzdF9wcmlvLm5leHQgPSBNQVhfUlRfUFJJTzsKLQlydF9ycS0+cnRfbnJfbWlncmF0b3J5ID0gMDsKLQlydF9ycS0+b3ZlcmxvYWRlZCA9IDA7Ci0JcGxpc3RfaGVhZF9pbml0KCZydF9ycS0+cHVzaGFibGVfdGFza3MpOworI2lmZGVmIENPTkZJR19DR1JPVVBfU0NIRUQKK3N0cnVjdCB0YXNrX2dyb3VwIHJvb3RfdGFza19ncm91cDsKICNlbmRpZgogCi0JcnRfcnEtPnJ0X3RpbWUgPSAwOwotCXJ0X3JxLT5ydF90aHJvdHRsZWQgPSAwOwotCXJ0X3JxLT5ydF9ydW50aW1lID0gMDsKLQlyYXdfc3Bpbl9sb2NrX2luaXQoJnJ0X3JxLT5ydF9ydW50aW1lX2xvY2spOwotfQotCi0jaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKLXN0YXRpYyB2b2lkIGluaXRfdGdfY2ZzX2VudHJ5KHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3RydWN0IGNmc19ycSAqY2ZzX3JxLAotCQkJCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlLCBpbnQgY3B1LAotCQkJCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnBhcmVudCkKLXsKLQlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7Ci0KLQljZnNfcnEtPnRnID0gdGc7Ci0JY2ZzX3JxLT5ycSA9IHJxOwotI2lmZGVmIENPTkZJR19TTVAKLQkvKiBhbGxvdyBpbml0aWFsIHVwZGF0ZV9jZnNfbG9hZCgpIHRvIHRydW5jYXRlICovCi0JY2ZzX3JxLT5sb2FkX3N0YW1wID0gMTsKLSNlbmRpZgotCWluaXRfY2ZzX3JxX3J1bnRpbWUoY2ZzX3JxKTsKLQotCXRnLT5jZnNfcnFbY3B1XSA9IGNmc19ycTsKLQl0Zy0+c2VbY3B1XSA9IHNlOwotCi0JLyogc2UgY291bGQgYmUgTlVMTCBmb3Igcm9vdF90YXNrX2dyb3VwICovCi0JaWYgKCFzZSkKLQkJcmV0dXJuOwotCi0JaWYgKCFwYXJlbnQpCi0JCXNlLT5jZnNfcnEgPSAmcnEtPmNmczsKLQllbHNlCi0JCXNlLT5jZnNfcnEgPSBwYXJlbnQtPm15X3E7Ci0KLQlzZS0+bXlfcSA9IGNmc19ycTsKLQl1cGRhdGVfbG9hZF9zZXQoJnNlLT5sb2FkLCAwKTsKLQlzZS0+cGFyZW50ID0gcGFyZW50OwotfQotI2VuZGlmCi0KLSNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKLXN0YXRpYyB2b2lkIGluaXRfdGdfcnRfZW50cnkoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCBzdHJ1Y3QgcnRfcnEgKnJ0X3JxLAotCQlzdHJ1Y3Qgc2NoZWRfcnRfZW50aXR5ICpydF9zZSwgaW50IGNwdSwKLQkJc3RydWN0IHNjaGVkX3J0X2VudGl0eSAqcGFyZW50KQotewotCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKLQotCXJ0X3JxLT5oaWdoZXN0X3ByaW8uY3VyciA9IE1BWF9SVF9QUklPOwotCXJ0X3JxLT5ydF9ucl9ib29zdGVkID0gMDsKLQlydF9ycS0+cnEgPSBycTsKLQlydF9ycS0+dGcgPSB0ZzsKLQotCXRnLT5ydF9ycVtjcHVdID0gcnRfcnE7Ci0JdGctPnJ0X3NlW2NwdV0gPSBydF9zZTsKLQotCWlmICghcnRfc2UpCi0JCXJldHVybjsKLQotCWlmICghcGFyZW50KQotCQlydF9zZS0+cnRfcnEgPSAmcnEtPnJ0OwotCWVsc2UKLQkJcnRfc2UtPnJ0X3JxID0gcGFyZW50LT5teV9xOwotCi0JcnRfc2UtPm15X3EgPSBydF9ycTsKLQlydF9zZS0+cGFyZW50ID0gcGFyZW50OwotCUlOSVRfTElTVF9IRUFEKCZydF9zZS0+cnVuX2xpc3QpOwotfQotI2VuZGlmCitERUNMQVJFX1BFUl9DUFUoY3B1bWFza192YXJfdCwgbG9hZF9iYWxhbmNlX3RtcG1hc2spOwogCiB2b2lkIF9faW5pdCBzY2hlZF9pbml0KHZvaWQpCiB7CkBAIC04MjMyLDkgKzY4NjgsMTcgQEAKICNpZmRlZiBDT05GSUdfQ0dST1VQX1NDSEVECiAJbGlzdF9hZGQoJnJvb3RfdGFza19ncm91cC5saXN0LCAmdGFza19ncm91cHMpOwogCUlOSVRfTElTVF9IRUFEKCZyb290X3Rhc2tfZ3JvdXAuY2hpbGRyZW4pOworCUlOSVRfTElTVF9IRUFEKCZyb290X3Rhc2tfZ3JvdXAuc2libGluZ3MpOwogCWF1dG9ncm91cF9pbml0KCZpbml0X3Rhc2spOworCiAjZW5kaWYgLyogQ09ORklHX0NHUk9VUF9TQ0hFRCAqLwogCisjaWZkZWYgQ09ORklHX0NHUk9VUF9DUFVBQ0NUCisJcm9vdF9jcHVhY2N0LmNwdXN0YXQgPSAma2VybmVsX2NwdXN0YXQ7CisJcm9vdF9jcHVhY2N0LmNwdXVzYWdlID0gYWxsb2NfcGVyY3B1KHU2NCk7CisJLyogVG9vIGVhcmx5LCBub3QgZXhwZWN0ZWQgdG8gZmFpbCAqLworCUJVR19PTighcm9vdF9jcHVhY2N0LmNwdXVzYWdlKTsKKyNlbmRpZgogCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CiAJCXN0cnVjdCBycSAqcnE7CiAKQEAgLTgyNDYsNyArNjg5MCw3IEBACiAJCWluaXRfY2ZzX3JxKCZycS0+Y2ZzKTsKIAkJaW5pdF9ydF9ycSgmcnEtPnJ0LCBycSk7CiAjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKLQkJcm9vdF90YXNrX2dyb3VwLnNoYXJlcyA9IHJvb3RfdGFza19ncm91cF9sb2FkOworCQlyb290X3Rhc2tfZ3JvdXAuc2hhcmVzID0gUk9PVF9UQVNLX0dST1VQX0xPQUQ7CiAJCUlOSVRfTElTVF9IRUFEKCZycS0+bGVhZl9jZnNfcnFfbGlzdCk7CiAJCS8qCiAJCSAqIEhvdyBtdWNoIGNwdSBiYW5kd2lkdGggZG9lcyByb290X3Rhc2tfZ3JvdXAgZ2V0PwpAQCAtODI5Niw3ICs2OTQwLDcgQEAKIAkJcnEtPmF2Z19pZGxlID0gMipzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3Q7CiAJCXJxX2F0dGFjaF9yb290KHJxLCAmZGVmX3Jvb3RfZG9tYWluKTsKICNpZmRlZiBDT05GSUdfTk9fSFoKLQkJcnEtPm5vaHpfYmFsYW5jZV9raWNrID0gMDsKKwkJcnEtPm5vaHpfZmxhZ3MgPSAwOwogI2VuZGlmCiAjZW5kaWYKIAkJaW5pdF9ycV9ocnRpY2socnEpOwpAQCAtODMwOSwxMCArNjk1Myw2IEBACiAJSU5JVF9ITElTVF9IRUFEKCZpbml0X3Rhc2sucHJlZW1wdF9ub3RpZmllcnMpOwogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfU01QCi0Jb3Blbl9zb2Z0aXJxKFNDSEVEX1NPRlRJUlEsIHJ1bl9yZWJhbGFuY2VfZG9tYWlucyk7Ci0jZW5kaWYKLQogI2lmZGVmIENPTkZJR19SVF9NVVRFWEVTCiAJcGxpc3RfaGVhZF9pbml0KCZpbml0X3Rhc2sucGlfd2FpdGVycyk7CiAjZW5kaWYKQEAgLTgzNDAsMTcgKzY5ODAsMTEgQEAKIAogI2lmZGVmIENPTkZJR19TTVAKIAl6YWxsb2NfY3B1bWFza192YXIoJnNjaGVkX2RvbWFpbnNfdG1wbWFzaywgR0ZQX05PV0FJVCk7Ci0jaWZkZWYgQ09ORklHX05PX0haCi0JemFsbG9jX2NwdW1hc2tfdmFyKCZub2h6LmlkbGVfY3B1c19tYXNrLCBHRlBfTk9XQUlUKTsKLQlhbGxvY19jcHVtYXNrX3Zhcigmbm9oei5ncnBfaWRsZV9tYXNrLCBHRlBfTk9XQUlUKTsKLQlhdG9taWNfc2V0KCZub2h6LmxvYWRfYmFsYW5jZXIsIG5yX2NwdV9pZHMpOwotCWF0b21pY19zZXQoJm5vaHouZmlyc3RfcGlja19jcHUsIG5yX2NwdV9pZHMpOwotCWF0b21pY19zZXQoJm5vaHouc2Vjb25kX3BpY2tfY3B1LCBucl9jcHVfaWRzKTsKLSNlbmRpZgogCS8qIE1heSBiZSBhbGxvY2F0ZWQgYXQgaXNvbGNwdXMgY21kbGluZSBwYXJzZSB0aW1lICovCiAJaWYgKGNwdV9pc29sYXRlZF9tYXAgPT0gTlVMTCkKIAkJemFsbG9jX2NwdW1hc2tfdmFyKCZjcHVfaXNvbGF0ZWRfbWFwLCBHRlBfTk9XQUlUKTsKLSNlbmRpZiAvKiBTTVAgKi8KKyNlbmRpZgorCWluaXRfc2NoZWRfZmFpcl9jbGFzcygpOwogCiAJc2NoZWR1bGVyX3J1bm5pbmcgPSAxOwogfQpAQCAtODUwMiwxNjkgKzcxMzYsMTQgQEAKIAogI2VuZGlmCiAKLSNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAotc3RhdGljIHZvaWQgZnJlZV9mYWlyX3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0ZykKLXsKLQlpbnQgaTsKLQotCWRlc3Ryb3lfY2ZzX2JhbmR3aWR0aCh0Z19jZnNfYmFuZHdpZHRoKHRnKSk7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlpZiAodGctPmNmc19ycSkKLQkJCWtmcmVlKHRnLT5jZnNfcnFbaV0pOwotCQlpZiAodGctPnNlKQotCQkJa2ZyZWUodGctPnNlW2ldKTsKLQl9Ci0KLQlrZnJlZSh0Zy0+Y2ZzX3JxKTsKLQlrZnJlZSh0Zy0+c2UpOwotfQotCi1zdGF0aWMKLWludCBhbGxvY19mYWlyX3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3RydWN0IHRhc2tfZ3JvdXAgKnBhcmVudCkKLXsKLQlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnE7Ci0Jc3RydWN0IHNjaGVkX2VudGl0eSAqc2U7Ci0JaW50IGk7Ci0KLQl0Zy0+Y2ZzX3JxID0ga3phbGxvYyhzaXplb2YoY2ZzX3JxKSAqIG5yX2NwdV9pZHMsIEdGUF9LRVJORUwpOwotCWlmICghdGctPmNmc19ycSkKLQkJZ290byBlcnI7Ci0JdGctPnNlID0ga3phbGxvYyhzaXplb2Yoc2UpICogbnJfY3B1X2lkcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0Zy0+c2UpCi0JCWdvdG8gZXJyOwotCi0JdGctPnNoYXJlcyA9IE5JQ0VfMF9MT0FEOwotCi0JaW5pdF9jZnNfYmFuZHdpZHRoKHRnX2Nmc19iYW5kd2lkdGgodGcpKTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCWNmc19ycSA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGNmc19ycSksCi0JCQkJICAgICAgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaSkpOwotCQlpZiAoIWNmc19ycSkKLQkJCWdvdG8gZXJyOwotCi0JCXNlID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZW50aXR5KSwKLQkJCQkgIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGkpKTsKLQkJaWYgKCFzZSkKLQkJCWdvdG8gZXJyX2ZyZWVfcnE7Ci0KLQkJaW5pdF9jZnNfcnEoY2ZzX3JxKTsKLQkJaW5pdF90Z19jZnNfZW50cnkodGcsIGNmc19ycSwgc2UsIGksIHBhcmVudC0+c2VbaV0pOwotCX0KLQotCXJldHVybiAxOwotCi1lcnJfZnJlZV9ycToKLQlrZnJlZShjZnNfcnEpOwotZXJyOgotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdW5yZWdpc3Rlcl9mYWlyX3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0ZywgaW50IGNwdSkKLXsKLQlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qCi0JKiBPbmx5IGVtcHR5IHRhc2sgZ3JvdXBzIGNhbiBiZSBkZXN0cm95ZWQ7IHNvIHdlIGNhbiBzcGVjdWxhdGl2ZWx5Ci0JKiBjaGVjayBvbl9saXN0IHdpdGhvdXQgZGFuZ2VyIG9mIGl0IGJlaW5nIHJlLWFkZGVkLgotCSovCi0JaWYgKCF0Zy0+Y2ZzX3JxW2NwdV0tPm9uX2xpc3QpCi0JCXJldHVybjsKLQotCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmcnEtPmxvY2ssIGZsYWdzKTsKLQlsaXN0X2RlbF9sZWFmX2Nmc19ycSh0Zy0+Y2ZzX3JxW2NwdV0pOwotCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZycS0+bG9jaywgZmxhZ3MpOwotfQotI2Vsc2UgLyogIUNPTkZJR19GQUlSX0dST1VQX1NDSEVEICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9mYWlyX3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0ZykKLXsKLX0KLQotc3RhdGljIGlubGluZQotaW50IGFsbG9jX2ZhaXJfc2NoZWRfZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCBzdHJ1Y3QgdGFza19ncm91cCAqcGFyZW50KQotewotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQgdW5yZWdpc3Rlcl9mYWlyX3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0ZywgaW50IGNwdSkKLXsKLX0KLSNlbmRpZiAvKiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCAqLwotCiAjaWZkZWYgQ09ORklHX1JUX0dST1VQX1NDSEVECi1zdGF0aWMgdm9pZCBmcmVlX3J0X3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0ZykKLXsKLQlpbnQgaTsKLQotCWlmICh0Zy0+cnRfc2UpCi0JCWRlc3Ryb3lfcnRfYmFuZHdpZHRoKCZ0Zy0+cnRfYmFuZHdpZHRoKTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCWlmICh0Zy0+cnRfcnEpCi0JCQlrZnJlZSh0Zy0+cnRfcnFbaV0pOwotCQlpZiAodGctPnJ0X3NlKQotCQkJa2ZyZWUodGctPnJ0X3NlW2ldKTsKLQl9Ci0KLQlrZnJlZSh0Zy0+cnRfcnEpOwotCWtmcmVlKHRnLT5ydF9zZSk7Ci19Ci0KLXN0YXRpYwotaW50IGFsbG9jX3J0X3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3RydWN0IHRhc2tfZ3JvdXAgKnBhcmVudCkKLXsKLQlzdHJ1Y3QgcnRfcnEgKnJ0X3JxOwotCXN0cnVjdCBzY2hlZF9ydF9lbnRpdHkgKnJ0X3NlOwotCWludCBpOwotCi0JdGctPnJ0X3JxID0ga3phbGxvYyhzaXplb2YocnRfcnEpICogbnJfY3B1X2lkcywgR0ZQX0tFUk5FTCk7Ci0JaWYgKCF0Zy0+cnRfcnEpCi0JCWdvdG8gZXJyOwotCXRnLT5ydF9zZSA9IGt6YWxsb2Moc2l6ZW9mKHJ0X3NlKSAqIG5yX2NwdV9pZHMsIEdGUF9LRVJORUwpOwotCWlmICghdGctPnJ0X3NlKQotCQlnb3RvIGVycjsKLQotCWluaXRfcnRfYmFuZHdpZHRoKCZ0Zy0+cnRfYmFuZHdpZHRoLAotCQkJa3RpbWVfdG9fbnMoZGVmX3J0X2JhbmR3aWR0aC5ydF9wZXJpb2QpLCAwKTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7Ci0JCXJ0X3JxID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgcnRfcnEpLAotCQkJCSAgICAgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaSkpOwotCQlpZiAoIXJ0X3JxKQotCQkJZ290byBlcnI7Ci0KLQkJcnRfc2UgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBzY2hlZF9ydF9lbnRpdHkpLAotCQkJCSAgICAgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaSkpOwotCQlpZiAoIXJ0X3NlKQotCQkJZ290byBlcnJfZnJlZV9ycTsKLQotCQlpbml0X3J0X3JxKHJ0X3JxLCBjcHVfcnEoaSkpOwotCQlydF9ycS0+cnRfcnVudGltZSA9IHRnLT5ydF9iYW5kd2lkdGgucnRfcnVudGltZTsKLQkJaW5pdF90Z19ydF9lbnRyeSh0ZywgcnRfcnEsIHJ0X3NlLCBpLCBwYXJlbnQtPnJ0X3NlW2ldKTsKLQl9Ci0KLQlyZXR1cm4gMTsKLQotZXJyX2ZyZWVfcnE6Ci0Ja2ZyZWUocnRfcnEpOwotZXJyOgotCXJldHVybiAwOwotfQogI2Vsc2UgLyogIUNPTkZJR19SVF9HUk9VUF9TQ0hFRCAqLwotc3RhdGljIGlubGluZSB2b2lkIGZyZWVfcnRfc2NoZWRfZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnKQotewotfQotCi1zdGF0aWMgaW5saW5lCi1pbnQgYWxsb2NfcnRfc2NoZWRfZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCBzdHJ1Y3QgdGFza19ncm91cCAqcGFyZW50KQotewotCXJldHVybiAxOwotfQogI2VuZGlmIC8qIENPTkZJR19SVF9HUk9VUF9TQ0hFRCAqLwogCiAjaWZkZWYgQ09ORklHX0NHUk9VUF9TQ0hFRAorLyogdGFza19ncm91cF9sb2NrIHNlcmlhbGl6ZXMgdGhlIGFkZGl0aW9uL3JlbW92YWwgb2YgdGFzayBncm91cHMgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGFza19ncm91cF9sb2NrKTsKKwogc3RhdGljIHZvaWQgZnJlZV9zY2hlZF9ncm91cChzdHJ1Y3QgdGFza19ncm91cCAqdGcpCiB7CiAJZnJlZV9mYWlyX3NjaGVkX2dyb3VwKHRnKTsKQEAgLTg3NzAsNDcgKzcyNDksNiBAQAogI2VuZGlmIC8qIENPTkZJR19DR1JPVVBfU0NIRUQgKi8KIAogI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECi1zdGF0aWMgREVGSU5FX01VVEVYKHNoYXJlc19tdXRleCk7Ci0KLWludCBzY2hlZF9ncm91cF9zZXRfc2hhcmVzKHN0cnVjdCB0YXNrX2dyb3VwICp0ZywgdW5zaWduZWQgbG9uZyBzaGFyZXMpCi17Ci0JaW50IGk7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCS8qCi0JICogV2UgY2FuJ3QgY2hhbmdlIHRoZSB3ZWlnaHQgb2YgdGhlIHJvb3QgY2dyb3VwLgotCSAqLwotCWlmICghdGctPnNlWzBdKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXNoYXJlcyA9IGNsYW1wKHNoYXJlcywgc2NhbGVfbG9hZChNSU5fU0hBUkVTKSwgc2NhbGVfbG9hZChNQVhfU0hBUkVTKSk7Ci0KLQltdXRleF9sb2NrKCZzaGFyZXNfbXV0ZXgpOwotCWlmICh0Zy0+c2hhcmVzID09IHNoYXJlcykKLQkJZ290byBkb25lOwotCi0JdGctPnNoYXJlcyA9IHNoYXJlczsKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGkpOwotCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZTsKLQotCQlzZSA9IHRnLT5zZVtpXTsKLQkJLyogUHJvcGFnYXRlIGNvbnRyaWJ1dGlvbiB0byBoaWVyYXJjaHkgKi8KLQkJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZycS0+bG9jaywgZmxhZ3MpOwotCQlmb3JfZWFjaF9zY2hlZF9lbnRpdHkoc2UpCi0JCQl1cGRhdGVfY2ZzX3NoYXJlcyhncm91cF9jZnNfcnEoc2UpKTsKLQkJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7Ci0JfQotCi1kb25lOgotCW11dGV4X3VubG9jaygmc2hhcmVzX211dGV4KTsKLQlyZXR1cm4gMDsKLX0KLQotdW5zaWduZWQgbG9uZyBzY2hlZF9ncm91cF9zaGFyZXMoc3RydWN0IHRhc2tfZ3JvdXAgKnRnKQotewotCXJldHVybiB0Zy0+c2hhcmVzOwotfQogI2VuZGlmCiAKICNpZiBkZWZpbmVkKENPTkZJR19SVF9HUk9VUF9TQ0hFRCkgfHwgZGVmaW5lZChDT05GSUdfQ0ZTX0JBTkRXSURUSCkKQEAgLTg4MzUsNyArNzI3Myw3IEBACiAJc3RydWN0IHRhc2tfc3RydWN0ICpnLCAqcDsKIAogCWRvX2VhY2hfdGhyZWFkKGcsIHApIHsKLQkJaWYgKHJ0X3Rhc2socCkgJiYgcnRfcnFfb2Zfc2UoJnAtPnJ0KS0+dGcgPT0gdGcpCisJCWlmIChydF90YXNrKHApICYmIHRhc2tfcnEocCktPnJ0LnRnID09IHRnKQogCQkJcmV0dXJuIDE7CiAJfSB3aGlsZV9lYWNoX3RocmVhZChnLCBwKTsKIApAQCAtOTE4Niw4ICs3NjI0LDggQEAKIAogc3RhdGljIGludCB0Z19zZXRfY2ZzX2JhbmR3aWR0aChzdHJ1Y3QgdGFza19ncm91cCAqdGcsIHU2NCBwZXJpb2QsIHU2NCBxdW90YSkKIHsKLQlpbnQgaSwgcmV0ID0gMCwgcnVudGltZV9lbmFibGVkOwotCXN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYiA9IHRnX2Nmc19iYW5kd2lkdGgodGcpOworCWludCBpLCByZXQgPSAwLCBydW50aW1lX2VuYWJsZWQsIHJ1bnRpbWVfd2FzX2VuYWJsZWQ7CisJc3RydWN0IGNmc19iYW5kd2lkdGggKmNmc19iID0gJnRnLT5jZnNfYmFuZHdpZHRoOwogCiAJaWYgKHRnID09ICZyb290X3Rhc2tfZ3JvdXApCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtOTIxNCw2ICs3NjUyLDggQEAKIAkJZ290byBvdXRfdW5sb2NrOwogCiAJcnVudGltZV9lbmFibGVkID0gcXVvdGEgIT0gUlVOVElNRV9JTkY7CisJcnVudGltZV93YXNfZW5hYmxlZCA9IGNmc19iLT5xdW90YSAhPSBSVU5USU1FX0lORjsKKwlhY2NvdW50X2Nmc19iYW5kd2lkdGhfdXNlZChydW50aW1lX2VuYWJsZWQsIHJ1bnRpbWVfd2FzX2VuYWJsZWQpOwogCXJhd19zcGluX2xvY2tfaXJxKCZjZnNfYi0+bG9jayk7CiAJY2ZzX2ItPnBlcmlvZCA9IG5zX3RvX2t0aW1lKHBlcmlvZCk7CiAJY2ZzX2ItPnF1b3RhID0gcXVvdGE7CkBAIC05MjI5LDEzICs3NjY5LDEzIEBACiAKIAlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSB0Zy0+Y2ZzX3JxW2ldOwotCQlzdHJ1Y3QgcnEgKnJxID0gcnFfb2YoY2ZzX3JxKTsKKwkJc3RydWN0IHJxICpycSA9IGNmc19ycS0+cnE7CiAKIAkJcmF3X3NwaW5fbG9ja19pcnEoJnJxLT5sb2NrKTsKIAkJY2ZzX3JxLT5ydW50aW1lX2VuYWJsZWQgPSBydW50aW1lX2VuYWJsZWQ7CiAJCWNmc19ycS0+cnVudGltZV9yZW1haW5pbmcgPSAwOwogCi0JCWlmIChjZnNfcnFfdGhyb3R0bGVkKGNmc19ycSkpCisJCWlmIChjZnNfcnEtPnRocm90dGxlZCkKIAkJCXVudGhyb3R0bGVfY2ZzX3JxKGNmc19ycSk7CiAJCXJhd19zcGluX3VubG9ja19pcnEoJnJxLT5sb2NrKTsKIAl9CkBAIC05MjQ5LDcgKzc2ODksNyBAQAogewogCXU2NCBxdW90YSwgcGVyaW9kOwogCi0JcGVyaW9kID0ga3RpbWVfdG9fbnModGdfY2ZzX2JhbmR3aWR0aCh0ZyktPnBlcmlvZCk7CisJcGVyaW9kID0ga3RpbWVfdG9fbnModGctPmNmc19iYW5kd2lkdGgucGVyaW9kKTsKIAlpZiAoY2ZzX3F1b3RhX3VzIDwgMCkKIAkJcXVvdGEgPSBSVU5USU1FX0lORjsKIAllbHNlCkBAIC05MjYyLDEwICs3NzAyLDEwIEBACiB7CiAJdTY0IHF1b3RhX3VzOwogCi0JaWYgKHRnX2Nmc19iYW5kd2lkdGgodGcpLT5xdW90YSA9PSBSVU5USU1FX0lORikKKwlpZiAodGctPmNmc19iYW5kd2lkdGgucXVvdGEgPT0gUlVOVElNRV9JTkYpCiAJCXJldHVybiAtMTsKIAotCXF1b3RhX3VzID0gdGdfY2ZzX2JhbmR3aWR0aCh0ZyktPnF1b3RhOworCXF1b3RhX3VzID0gdGctPmNmc19iYW5kd2lkdGgucXVvdGE7CiAJZG9fZGl2KHF1b3RhX3VzLCBOU0VDX1BFUl9VU0VDKTsKIAogCXJldHVybiBxdW90YV91czsKQEAgLTkyNzYsMTAgKzc3MTYsNyBAQAogCXU2NCBxdW90YSwgcGVyaW9kOwogCiAJcGVyaW9kID0gKHU2NCljZnNfcGVyaW9kX3VzICogTlNFQ19QRVJfVVNFQzsKLQlxdW90YSA9IHRnX2Nmc19iYW5kd2lkdGgodGcpLT5xdW90YTsKLQotCWlmIChwZXJpb2QgPD0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7CisJcXVvdGEgPSB0Zy0+Y2ZzX2JhbmR3aWR0aC5xdW90YTsKIAogCXJldHVybiB0Z19zZXRfY2ZzX2JhbmR3aWR0aCh0ZywgcGVyaW9kLCBxdW90YSk7CiB9CkBAIC05Mjg4LDcgKzc3MjUsNyBAQAogewogCXU2NCBjZnNfcGVyaW9kX3VzOwogCi0JY2ZzX3BlcmlvZF91cyA9IGt0aW1lX3RvX25zKHRnX2Nmc19iYW5kd2lkdGgodGcpLT5wZXJpb2QpOworCWNmc19wZXJpb2RfdXMgPSBrdGltZV90b19ucyh0Zy0+Y2ZzX2JhbmR3aWR0aC5wZXJpb2QpOwogCWRvX2RpdihjZnNfcGVyaW9kX3VzLCBOU0VDX1BFUl9VU0VDKTsKIAogCXJldHVybiBjZnNfcGVyaW9kX3VzOwpAQCAtOTM0OCwxMyArNzc4NSwxMyBAQAogc3RhdGljIGludCB0Z19jZnNfc2NoZWR1bGFibGVfZG93bihzdHJ1Y3QgdGFza19ncm91cCAqdGcsIHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IGNmc19zY2hlZHVsYWJsZV9kYXRhICpkID0gZGF0YTsKLQlzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IgPSB0Z19jZnNfYmFuZHdpZHRoKHRnKTsKKwlzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IgPSAmdGctPmNmc19iYW5kd2lkdGg7CiAJczY0IHF1b3RhID0gMCwgcGFyZW50X3F1b3RhID0gLTE7CiAKIAlpZiAoIXRnLT5wYXJlbnQpIHsKIAkJcXVvdGEgPSBSVU5USU1FX0lORjsKIAl9IGVsc2UgewotCQlzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqcGFyZW50X2IgPSB0Z19jZnNfYmFuZHdpZHRoKHRnLT5wYXJlbnQpOworCQlzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqcGFyZW50X2IgPSAmdGctPnBhcmVudC0+Y2ZzX2JhbmR3aWR0aDsKIAogCQlxdW90YSA9IG5vcm1hbGl6ZV9jZnNfcXVvdGEodGcsIGQpOwogCQlwYXJlbnRfcXVvdGEgPSBwYXJlbnRfYi0+aGllcmFyY2hhbF9xdW90YTsKQEAgLTkzOTgsNyArNzgzNSw3IEBACiAJCXN0cnVjdCBjZ3JvdXBfbWFwX2NiICpjYikKIHsKIAlzdHJ1Y3QgdGFza19ncm91cCAqdGcgPSBjZ3JvdXBfdGcoY2dycCk7Ci0Jc3RydWN0IGNmc19iYW5kd2lkdGggKmNmc19iID0gdGdfY2ZzX2JhbmR3aWR0aCh0Zyk7CisJc3RydWN0IGNmc19iYW5kd2lkdGggKmNmc19iID0gJnRnLT5jZnNfYmFuZHdpZHRoOwogCiAJY2ItPmZpbGwoY2IsICJucl9wZXJpb2RzIiwgY2ZzX2ItPm5yX3BlcmlvZHMpOwogCWNiLT5maWxsKGNiLCAibnJfdGhyb3R0bGVkIiwgY2ZzX2ItPm5yX3Rocm90dGxlZCk7CkBAIC05NDk5LDM4ICs3OTM2LDE2IEBACiAgKiAoYmFsYmlyQGluLmlibS5jb20pLgogICovCiAKLS8qIHRyYWNrIGNwdSB1c2FnZSBvZiBhIGdyb3VwIG9mIHRhc2tzIGFuZCBpdHMgY2hpbGQgZ3JvdXBzICovCi1zdHJ1Y3QgY3B1YWNjdCB7Ci0Jc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgY3NzOwotCS8qIGNwdXVzYWdlIGhvbGRzIHBvaW50ZXIgdG8gYSB1NjQtdHlwZSBvYmplY3Qgb24gZXZlcnkgY3B1ICovCi0JdTY0IF9fcGVyY3B1ICpjcHV1c2FnZTsKLQlzdHJ1Y3QgcGVyY3B1X2NvdW50ZXIgY3B1c3RhdFtDUFVBQ0NUX1NUQVRfTlNUQVRTXTsKLQlzdHJ1Y3QgY3B1YWNjdCAqcGFyZW50OwotfTsKLQotc3RydWN0IGNncm91cF9zdWJzeXMgY3B1YWNjdF9zdWJzeXM7Ci0KLS8qIHJldHVybiBjcHUgYWNjb3VudGluZyBncm91cCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY29udGFpbmVyICovCi1zdGF0aWMgaW5saW5lIHN0cnVjdCBjcHVhY2N0ICpjZ3JvdXBfY2Eoc3RydWN0IGNncm91cCAqY2dycCkKLXsKLQlyZXR1cm4gY29udGFpbmVyX29mKGNncm91cF9zdWJzeXNfc3RhdGUoY2dycCwgY3B1YWNjdF9zdWJzeXNfaWQpLAotCQkJICAgIHN0cnVjdCBjcHVhY2N0LCBjc3MpOwotfQotCi0vKiByZXR1cm4gY3B1IGFjY291bnRpbmcgZ3JvdXAgdG8gd2hpY2ggdGhpcyB0YXNrIGJlbG9uZ3MgKi8KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGNwdWFjY3QgKnRhc2tfY2Eoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JcmV0dXJuIGNvbnRhaW5lcl9vZih0YXNrX3N1YnN5c19zdGF0ZSh0c2ssIGNwdWFjY3Rfc3Vic3lzX2lkKSwKLQkJCSAgICBzdHJ1Y3QgY3B1YWNjdCwgY3NzKTsKLX0KLQogLyogY3JlYXRlIGEgbmV3IGNwdSBhY2NvdW50aW5nIGdyb3VwICovCiBzdGF0aWMgc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgKmNwdWFjY3RfY3JlYXRlKAogCXN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCkKIHsKLQlzdHJ1Y3QgY3B1YWNjdCAqY2EgPSBremFsbG9jKHNpemVvZigqY2EpLCBHRlBfS0VSTkVMKTsKLQlpbnQgaTsKKwlzdHJ1Y3QgY3B1YWNjdCAqY2E7CiAKKwlpZiAoIWNncnAtPnBhcmVudCkKKwkJcmV0dXJuICZyb290X2NwdWFjY3QuY3NzOworCisJY2EgPSBremFsbG9jKHNpemVvZigqY2EpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIWNhKQogCQlnb3RvIG91dDsKIApAQCAtOTUzOCwxOCArNzk1MywxMyBAQAogCWlmICghY2EtPmNwdXVzYWdlKQogCQlnb3RvIG91dF9mcmVlX2NhOwogCi0JZm9yIChpID0gMDsgaSA8IENQVUFDQ1RfU1RBVF9OU1RBVFM7IGkrKykKLQkJaWYgKHBlcmNwdV9jb3VudGVyX2luaXQoJmNhLT5jcHVzdGF0W2ldLCAwKSkKLQkJCWdvdG8gb3V0X2ZyZWVfY291bnRlcnM7Ci0KLQlpZiAoY2dycC0+cGFyZW50KQotCQljYS0+cGFyZW50ID0gY2dyb3VwX2NhKGNncnAtPnBhcmVudCk7CisJY2EtPmNwdXN0YXQgPSBhbGxvY19wZXJjcHUoc3RydWN0IGtlcm5lbF9jcHVzdGF0KTsKKwlpZiAoIWNhLT5jcHVzdGF0KQorCQlnb3RvIG91dF9mcmVlX2NwdXVzYWdlOwogCiAJcmV0dXJuICZjYS0+Y3NzOwogCi1vdXRfZnJlZV9jb3VudGVyczoKLQl3aGlsZSAoLS1pID49IDApCi0JCXBlcmNwdV9jb3VudGVyX2Rlc3Ryb3koJmNhLT5jcHVzdGF0W2ldKTsKK291dF9mcmVlX2NwdXVzYWdlOgogCWZyZWVfcGVyY3B1KGNhLT5jcHV1c2FnZSk7CiBvdXRfZnJlZV9jYToKIAlrZnJlZShjYSk7CkBAIC05NTYyLDEwICs3OTcyLDggQEAKIGNwdWFjY3RfZGVzdHJveShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnApCiB7CiAJc3RydWN0IGNwdWFjY3QgKmNhID0gY2dyb3VwX2NhKGNncnApOwotCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IENQVUFDQ1RfU1RBVF9OU1RBVFM7IGkrKykKLQkJcGVyY3B1X2NvdW50ZXJfZGVzdHJveSgmY2EtPmNwdXN0YXRbaV0pOworCWZyZWVfcGVyY3B1KGNhLT5jcHVzdGF0KTsKIAlmcmVlX3BlcmNwdShjYS0+Y3B1dXNhZ2UpOwogCWtmcmVlKGNhKTsKIH0KQEAgLTk2NTgsMTYgKzgwNjYsMzEgQEAKIH07CiAKIHN0YXRpYyBpbnQgY3B1YWNjdF9zdGF0c19zaG93KHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCwKLQkJc3RydWN0IGNncm91cF9tYXBfY2IgKmNiKQorCQkJICAgICAgc3RydWN0IGNncm91cF9tYXBfY2IgKmNiKQogewogCXN0cnVjdCBjcHVhY2N0ICpjYSA9IGNncm91cF9jYShjZ3JwKTsKLQlpbnQgaTsKKwlpbnQgY3B1OworCXM2NCB2YWwgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IENQVUFDQ1RfU1RBVF9OU1RBVFM7IGkrKykgewotCQlzNjQgdmFsID0gcGVyY3B1X2NvdW50ZXJfcmVhZCgmY2EtPmNwdXN0YXRbaV0pOwotCQl2YWwgPSBjcHV0aW1lNjRfdG9fY2xvY2tfdCh2YWwpOwotCQljYi0+ZmlsbChjYiwgY3B1YWNjdF9zdGF0X2Rlc2NbaV0sIHZhbCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJc3RydWN0IGtlcm5lbF9jcHVzdGF0ICprY3B1c3RhdCA9IHBlcl9jcHVfcHRyKGNhLT5jcHVzdGF0LCBjcHUpOworCQl2YWwgKz0ga2NwdXN0YXQtPmNwdXN0YXRbQ1BVVElNRV9VU0VSXTsKKwkJdmFsICs9IGtjcHVzdGF0LT5jcHVzdGF0W0NQVVRJTUVfTklDRV07CiAJfQorCXZhbCA9IGNwdXRpbWU2NF90b19jbG9ja190KHZhbCk7CisJY2ItPmZpbGwoY2IsIGNwdWFjY3Rfc3RhdF9kZXNjW0NQVUFDQ1RfU1RBVF9VU0VSXSwgdmFsKTsKKworCXZhbCA9IDA7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJc3RydWN0IGtlcm5lbF9jcHVzdGF0ICprY3B1c3RhdCA9IHBlcl9jcHVfcHRyKGNhLT5jcHVzdGF0LCBjcHUpOworCQl2YWwgKz0ga2NwdXN0YXQtPmNwdXN0YXRbQ1BVVElNRV9TWVNURU1dOworCQl2YWwgKz0ga2NwdXN0YXQtPmNwdXN0YXRbQ1BVVElNRV9JUlFdOworCQl2YWwgKz0ga2NwdXN0YXQtPmNwdXN0YXRbQ1BVVElNRV9TT0ZUSVJRXTsKKwl9CisKKwl2YWwgPSBjcHV0aW1lNjRfdG9fY2xvY2tfdCh2YWwpOworCWNiLT5maWxsKGNiLCBjcHVhY2N0X3N0YXRfZGVzY1tDUFVBQ0NUX1NUQVRfU1lTVEVNXSwgdmFsKTsKKwogCXJldHVybiAwOwogfQogCkBAIC05Njk3LDcgKzgxMjAsNyBAQAogICoKICAqIGNhbGxlZCB3aXRoIHJxLT5sb2NrIGhlbGQuCiAgKi8KLXN0YXRpYyB2b2lkIGNwdWFjY3RfY2hhcmdlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCB1NjQgY3B1dGltZSkKK3ZvaWQgY3B1YWNjdF9jaGFyZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHU2NCBjcHV0aW1lKQogewogCXN0cnVjdCBjcHVhY2N0ICpjYTsKIAlpbnQgY3B1OwpAQCAtOTcxMSw3ICs4MTM0LDcgQEAKIAogCWNhID0gdGFza19jYSh0c2spOwogCi0JZm9yICg7IGNhOyBjYSA9IGNhLT5wYXJlbnQpIHsKKwlmb3IgKDsgY2E7IGNhID0gcGFyZW50X2NhKGNhKSkgewogCQl1NjQgKmNwdXVzYWdlID0gcGVyX2NwdV9wdHIoY2EtPmNwdXVzYWdlLCBjcHUpOwogCQkqY3B1dXNhZ2UgKz0gY3B1dGltZTsKIAl9CkBAIC05NzE5LDQ1ICs4MTQyLDYgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotLyoKLSAqIFdoZW4gQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcgaXMgZW5hYmxlZCBvbmUgamlmZnkgY2FuIGJlIHZlcnkgbGFyZ2UKLSAqIGluIGNwdXRpbWVfdCB1bml0cy4gQXMgYSByZXN1bHQsIGNwdWFjY3RfdXBkYXRlX3N0YXRzIGNhbGxzCi0gKiBwZXJjcHVfY291bnRlcl9hZGQgd2l0aCB2YWx1ZXMgbGFyZ2UgZW5vdWdoIHRvIGFsd2F5cyBvdmVyZmxvdyB0aGUKLSAqIHBlciBjcHUgYmF0Y2ggbGltaXQgY2F1c2luZyBiYWQgU01QIHNjYWxhYmlsaXR5LgotICoKLSAqIFRvIGZpeCB0aGlzIHdlIHNjYWxlIHBlcmNwdV9jb3VudGVyX2JhdGNoIGJ5IGNwdXRpbWVfb25lX2ppZmZ5IHNvIHdlCi0gKiBiYXRjaCB0aGUgc2FtZSBhbW91bnQgb2YgdGltZSB3aXRoIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HIGRpc2FibGVkCi0gKiBhbmQgZW5hYmxlZC4gV2UgY2FwIGl0IGF0IElOVF9NQVggd2hpY2ggaXMgdGhlIGxhcmdlc3QgYWxsb3dlZCBiYXRjaCB2YWx1ZS4KLSAqLwotI2lmZGVmIENPTkZJR19TTVAKLSNkZWZpbmUgQ1BVQUNDVF9CQVRDSAlcCi0JbWluX3QobG9uZywgcGVyY3B1X2NvdW50ZXJfYmF0Y2ggKiBjcHV0aW1lX29uZV9qaWZmeSwgSU5UX01BWCkKLSNlbHNlCi0jZGVmaW5lIENQVUFDQ1RfQkFUQ0gJMAotI2VuZGlmCi0KLS8qCi0gKiBDaGFyZ2UgdGhlIHN5c3RlbS91c2VyIHRpbWUgdG8gdGhlIHRhc2sncyBhY2NvdW50aW5nIGdyb3VwLgotICovCi1zdGF0aWMgdm9pZCBjcHVhY2N0X3VwZGF0ZV9zdGF0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJZW51bSBjcHVhY2N0X3N0YXRfaW5kZXggaWR4LCBjcHV0aW1lX3QgdmFsKQotewotCXN0cnVjdCBjcHVhY2N0ICpjYTsKLQlpbnQgYmF0Y2ggPSBDUFVBQ0NUX0JBVENIOwotCi0JaWYgKHVubGlrZWx5KCFjcHVhY2N0X3N1YnN5cy5hY3RpdmUpKQotCQlyZXR1cm47Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JY2EgPSB0YXNrX2NhKHRzayk7Ci0KLQlkbyB7Ci0JCV9fcGVyY3B1X2NvdW50ZXJfYWRkKCZjYS0+Y3B1c3RhdFtpZHhdLCB2YWwsIGJhdGNoKTsKLQkJY2EgPSBjYS0+cGFyZW50OwotCX0gd2hpbGUgKGNhKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLX0KLQogc3RydWN0IGNncm91cF9zdWJzeXMgY3B1YWNjdF9zdWJzeXMgPSB7CiAJLm5hbWUgPSAiY3B1YWNjdCIsCiAJLmNyZWF0ZSA9IGNwdWFjY3RfY3JlYXRlLApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2NwdXByaS5jIGIva2VybmVsL3NjaGVkL2NwdXByaS5jCnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIGtlcm5lbC9zY2hlZF9jcHVwcmkuYwpyZW5hbWUgdG8ga2VybmVsL3NjaGVkL2NwdXByaS5jCmluZGV4IGE4NmNmOWQuLmIwZDc5OGUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zY2hlZF9jcHVwcmkuYworKysgYi9rZXJuZWwvc2NoZWQvY3B1cHJpLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICogIGtlcm5lbC9zY2hlZF9jcHVwcmkuYworICogIGtlcm5lbC9zY2hlZC9jcHVwcmkuYwogICoKICAqICBDUFUgcHJpb3JpdHkgbWFuYWdlbWVudAogICoKQEAgLTI4LDcgKzI4LDcgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+Ci0jaW5jbHVkZSAic2NoZWRfY3B1cHJpLmgiCisjaW5jbHVkZSAiY3B1cHJpLmgiCiAKIC8qIENvbnZlcnQgYmV0d2VlbiBhIDE0MCBiYXNlZCB0YXNrLT5wcmlvLCBhbmQgb3VyIDEwMiBiYXNlZCBjcHVwcmkgKi8KIHN0YXRpYyBpbnQgY29udmVydF9wcmlvKGludCBwcmlvKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2NwdXByaS5oIGIva2VybmVsL3NjaGVkL2NwdXByaS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBrZXJuZWwvc2NoZWRfY3B1cHJpLmgKcmVuYW1lIHRvIGtlcm5lbC9zY2hlZC9jcHVwcmkuaApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2RlYnVnLmMgYi9rZXJuZWwvc2NoZWQvZGVidWcuYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBrZXJuZWwvc2NoZWRfZGVidWcuYwpyZW5hbWUgdG8ga2VybmVsL3NjaGVkL2RlYnVnLmMKaW5kZXggYTY3MTBhMS4uMmEwNzVlMSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2RlYnVnLmMKKysrIGIva2VybmVsL3NjaGVkL2RlYnVnLmMKQEAgLTEsNSArMSw1IEBACiAvKgotICoga2VybmVsL3RpbWUvc2NoZWRfZGVidWcuYworICoga2VybmVsL3NjaGVkL2RlYnVnLmMKICAqCiAgKiBQcmludCB0aGUgQ0ZTIHJidHJlZQogICoKQEAgLTE2LDYgKzE2LDggQEAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KIAorI2luY2x1ZGUgInNjaGVkLmgiCisKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soc2NoZWRfZGVidWdfbG9jayk7CiAKIC8qCkBAIC0zNzMsNyArMzc1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgc3lzcnFfc2NoZWRfZGVidWdfc2hvdyh2b2lkKQordm9pZCBzeXNycV9zY2hlZF9kZWJ1Z19zaG93KHZvaWQpCiB7CiAJc2NoZWRfZGVidWdfc2hvdyhOVUxMLCBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZF9mYWlyLmMgYi9rZXJuZWwvc2NoZWQvZmFpci5jCnNpbWlsYXJpdHkgaW5kZXggODQlCnJlbmFtZSBmcm9tIGtlcm5lbC9zY2hlZF9mYWlyLmMKcmVuYW1lIHRvIGtlcm5lbC9zY2hlZC9mYWlyLmMKaW5kZXggNWM5ZTY3OS4uOGU0MmRlOSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2ZhaXIuYworKysgYi9rZXJuZWwvc2NoZWQvZmFpci5jCkBAIC0yMyw2ICsyMywxMyBAQAogI2luY2x1ZGUgPGxpbnV4L2xhdGVuY3l0b3AuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NjaGVkLmg+CisKKyNpbmNsdWRlICJzY2hlZC5oIgogCiAvKgogICogVGFyZ2V0ZWQgcHJlZW1wdGlvbiBsYXRlbmN5IGZvciBDUFUtYm91bmQgdGFza3M6CkBAIC0xMDMsNyArMTEwLDExMCBAQAogdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9jZnNfYmFuZHdpZHRoX3NsaWNlID0gNTAwMFVMOwogI2VuZGlmCiAKLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NoZWRfY2xhc3MgZmFpcl9zY2hlZF9jbGFzczsKKy8qCisgKiBJbmNyZWFzZSB0aGUgZ3JhbnVsYXJpdHkgdmFsdWUgd2hlbiB0aGVyZSBhcmUgbW9yZSBDUFVzLAorICogYmVjYXVzZSB3aXRoIG1vcmUgQ1BVcyB0aGUgJ2VmZmVjdGl2ZSBsYXRlbmN5JyBhcyB2aXNpYmxlCisgKiB0byB1c2VycyBkZWNyZWFzZXMuIEJ1dCB0aGUgcmVsYXRpb25zaGlwIGlzIG5vdCBsaW5lYXIsCisgKiBzbyBwaWNrIGEgc2Vjb25kLWJlc3QgZ3Vlc3MgYnkgZ29pbmcgd2l0aCB0aGUgbG9nMiBvZiB0aGUKKyAqIG51bWJlciBvZiBDUFVzLgorICoKKyAqIFRoaXMgaWRlYSBjb21lcyBmcm9tIHRoZSBTRCBzY2hlZHVsZXIgb2YgQ29uIEtvbGl2YXM6CisgKi8KK3N0YXRpYyBpbnQgZ2V0X3VwZGF0ZV9zeXNjdGxfZmFjdG9yKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGNwdXMgPSBtaW5fdChpbnQsIG51bV9vbmxpbmVfY3B1cygpLCA4KTsKKwl1bnNpZ25lZCBpbnQgZmFjdG9yOworCisJc3dpdGNoIChzeXNjdGxfc2NoZWRfdHVuYWJsZV9zY2FsaW5nKSB7CisJY2FzZSBTQ0hFRF9UVU5BQkxFU0NBTElOR19OT05FOgorCQlmYWN0b3IgPSAxOworCQlicmVhazsKKwljYXNlIFNDSEVEX1RVTkFCTEVTQ0FMSU5HX0xJTkVBUjoKKwkJZmFjdG9yID0gY3B1czsKKwkJYnJlYWs7CisJY2FzZSBTQ0hFRF9UVU5BQkxFU0NBTElOR19MT0c6CisJZGVmYXVsdDoKKwkJZmFjdG9yID0gMSArIGlsb2cyKGNwdXMpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZmFjdG9yOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVfc3lzY3RsKHZvaWQpCit7CisJdW5zaWduZWQgaW50IGZhY3RvciA9IGdldF91cGRhdGVfc3lzY3RsX2ZhY3RvcigpOworCisjZGVmaW5lIFNFVF9TWVNDVEwobmFtZSkgXAorCShzeXNjdGxfIyNuYW1lID0gKGZhY3RvcikgKiBub3JtYWxpemVkX3N5c2N0bF8jI25hbWUpCisJU0VUX1NZU0NUTChzY2hlZF9taW5fZ3JhbnVsYXJpdHkpOworCVNFVF9TWVNDVEwoc2NoZWRfbGF0ZW5jeSk7CisJU0VUX1NZU0NUTChzY2hlZF93YWtldXBfZ3JhbnVsYXJpdHkpOworI3VuZGVmIFNFVF9TWVNDVEwKK30KKwordm9pZCBzY2hlZF9pbml0X2dyYW51bGFyaXR5KHZvaWQpCit7CisJdXBkYXRlX3N5c2N0bCgpOworfQorCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorIyBkZWZpbmUgV01VTFRfQ09OU1QJKH4wVUwpCisjZWxzZQorIyBkZWZpbmUgV01VTFRfQ09OU1QJKDFVTCA8PCAzMikKKyNlbmRpZgorCisjZGVmaW5lIFdNVUxUX1NISUZUCTMyCisKKy8qCisgKiBTaGlmdCByaWdodCBhbmQgcm91bmQ6CisgKi8KKyNkZWZpbmUgU1JSKHgsIHkpICgoKHgpICsgKDFVTCA8PCAoKHkpIC0gMSkpKSA+PiAoeSkpCisKKy8qCisgKiBkZWx0YSAqPSB3ZWlnaHQgLyBsdworICovCitzdGF0aWMgdW5zaWduZWQgbG9uZworY2FsY19kZWx0YV9taW5lKHVuc2lnbmVkIGxvbmcgZGVsdGFfZXhlYywgdW5zaWduZWQgbG9uZyB3ZWlnaHQsCisJCXN0cnVjdCBsb2FkX3dlaWdodCAqbHcpCit7CisJdTY0IHRtcDsKKworCS8qCisJICogd2VpZ2h0IGNhbiBiZSBsZXNzIHRoYW4gMl5TQ0hFRF9MT0FEX1JFU09MVVRJT04gZm9yIHRhc2sgZ3JvdXAgc2NoZWQKKwkgKiBlbnRpdGllcyBzaW5jZSBNSU5fU0hBUkVTID0gMi4gVHJlYXQgd2VpZ2h0IGFzIDEgaWYgbGVzcyB0aGFuCisJICogMl5TQ0hFRF9MT0FEX1JFU09MVVRJT04uCisJICovCisJaWYgKGxpa2VseSh3ZWlnaHQgPiAoMVVMIDw8IFNDSEVEX0xPQURfUkVTT0xVVElPTikpKQorCQl0bXAgPSAodTY0KWRlbHRhX2V4ZWMgKiBzY2FsZV9sb2FkX2Rvd24od2VpZ2h0KTsKKwllbHNlCisJCXRtcCA9ICh1NjQpZGVsdGFfZXhlYzsKKworCWlmICghbHctPmludl93ZWlnaHQpIHsKKwkJdW5zaWduZWQgbG9uZyB3ID0gc2NhbGVfbG9hZF9kb3duKGx3LT53ZWlnaHQpOworCisJCWlmIChCSVRTX1BFUl9MT05HID4gMzIgJiYgdW5saWtlbHkodyA+PSBXTVVMVF9DT05TVCkpCisJCQlsdy0+aW52X3dlaWdodCA9IDE7CisJCWVsc2UgaWYgKHVubGlrZWx5KCF3KSkKKwkJCWx3LT5pbnZfd2VpZ2h0ID0gV01VTFRfQ09OU1Q7CisJCWVsc2UKKwkJCWx3LT5pbnZfd2VpZ2h0ID0gV01VTFRfQ09OU1QgLyB3OworCX0KKworCS8qCisJICogQ2hlY2sgd2hldGhlciB3ZSdkIG92ZXJmbG93IHRoZSA2NC1iaXQgbXVsdGlwbGljYXRpb246CisJICovCisJaWYgKHVubGlrZWx5KHRtcCA+IFdNVUxUX0NPTlNUKSkKKwkJdG1wID0gU1JSKFNSUih0bXAsIFdNVUxUX1NISUZULzIpICogbHctPmludl93ZWlnaHQsCisJCQlXTVVMVF9TSElGVC8yKTsKKwllbHNlCisJCXRtcCA9IFNSUih0bXAgKiBsdy0+aW52X3dlaWdodCwgV01VTFRfU0hJRlQpOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKW1pbih0bXAsICh1NjQpKHVuc2lnbmVkIGxvbmcpTE9OR19NQVgpOworfQorCisKK2NvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyBmYWlyX3NjaGVkX2NsYXNzOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIENGUyBvcGVyYXRpb25zIG9uIGdlbmVyaWMgc2NoZWR1bGFibGUgZW50aXRpZXM6CkBAIC00MTMsNyArNTIzLDcgQEAKIAlyYl9lcmFzZSgmc2UtPnJ1bl9ub2RlLCAmY2ZzX3JxLT50YXNrc190aW1lbGluZSk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpfX3BpY2tfZmlyc3RfZW50aXR5KHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKK3N0cnVjdCBzY2hlZF9lbnRpdHkgKl9fcGlja19maXJzdF9lbnRpdHkoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQogewogCXN0cnVjdCByYl9ub2RlICpsZWZ0ID0gY2ZzX3JxLT5yYl9sZWZ0bW9zdDsKIApAQCAtNDM0LDcgKzU0NCw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKLXN0YXRpYyBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpfX3BpY2tfbGFzdF9lbnRpdHkoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQorc3RydWN0IHNjaGVkX2VudGl0eSAqX19waWNrX2xhc3RfZW50aXR5KHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbGFzdCA9IHJiX2xhc3QoJmNmc19ycS0+dGFza3NfdGltZWxpbmUpOwogCkBAIC02ODQsNyArNzk0LDcgQEAKIHsKIAl1cGRhdGVfbG9hZF9hZGQoJmNmc19ycS0+bG9hZCwgc2UtPmxvYWQud2VpZ2h0KTsKIAlpZiAoIXBhcmVudF9lbnRpdHkoc2UpKQotCQlpbmNfY3B1X2xvYWQocnFfb2YoY2ZzX3JxKSwgc2UtPmxvYWQud2VpZ2h0KTsKKwkJdXBkYXRlX2xvYWRfYWRkKCZycV9vZihjZnNfcnEpLT5sb2FkLCBzZS0+bG9hZC53ZWlnaHQpOwogCWlmIChlbnRpdHlfaXNfdGFzayhzZSkpIHsKIAkJYWRkX2Nmc190YXNrX3dlaWdodChjZnNfcnEsIHNlLT5sb2FkLndlaWdodCk7CiAJCWxpc3RfYWRkKCZzZS0+Z3JvdXBfbm9kZSwgJmNmc19ycS0+dGFza3MpOwpAQCAtNjk3LDcgKzgwNyw3IEBACiB7CiAJdXBkYXRlX2xvYWRfc3ViKCZjZnNfcnEtPmxvYWQsIHNlLT5sb2FkLndlaWdodCk7CiAJaWYgKCFwYXJlbnRfZW50aXR5KHNlKSkKLQkJZGVjX2NwdV9sb2FkKHJxX29mKGNmc19ycSksIHNlLT5sb2FkLndlaWdodCk7CisJCXVwZGF0ZV9sb2FkX3N1YigmcnFfb2YoY2ZzX3JxKS0+bG9hZCwgc2UtPmxvYWQud2VpZ2h0KTsKIAlpZiAoZW50aXR5X2lzX3Rhc2soc2UpKSB7CiAJCWFkZF9jZnNfdGFza193ZWlnaHQoY2ZzX3JxLCAtc2UtPmxvYWQud2VpZ2h0KTsKIAkJbGlzdF9kZWxfaW5pdCgmc2UtPmdyb3VwX25vZGUpOwpAQCAtNzcyLDE5ICs4ODIsMzIgQEAKIAkJbGlzdF9kZWxfbGVhZl9jZnNfcnEoY2ZzX3JxKTsKIH0KIAorc3RhdGljIGlubGluZSBsb25nIGNhbGNfdGdfd2VpZ2h0KHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3RydWN0IGNmc19ycSAqY2ZzX3JxKQoreworCWxvbmcgdGdfd2VpZ2h0OworCisJLyoKKwkgKiBVc2UgdGhpcyBDUFUncyBhY3R1YWwgd2VpZ2h0IGluc3RlYWQgb2YgdGhlIGxhc3QgbG9hZF9jb250cmlidXRpb24KKwkgKiB0byBnYWluIGEgbW9yZSBhY2N1cmF0ZSBjdXJyZW50IHRvdGFsIHdlaWdodC4gU2VlCisJICogdXBkYXRlX2Nmc19ycV9sb2FkX2NvbnRyaWJ1dGlvbigpLgorCSAqLworCXRnX3dlaWdodCA9IGF0b21pY19yZWFkKCZ0Zy0+bG9hZF93ZWlnaHQpOworCXRnX3dlaWdodCAtPSBjZnNfcnEtPmxvYWRfY29udHJpYnV0aW9uOworCXRnX3dlaWdodCArPSBjZnNfcnEtPmxvYWQud2VpZ2h0OworCisJcmV0dXJuIHRnX3dlaWdodDsKK30KKwogc3RhdGljIGxvbmcgY2FsY19jZnNfc2hhcmVzKHN0cnVjdCBjZnNfcnEgKmNmc19ycSwgc3RydWN0IHRhc2tfZ3JvdXAgKnRnKQogewotCWxvbmcgbG9hZF93ZWlnaHQsIGxvYWQsIHNoYXJlczsKKwlsb25nIHRnX3dlaWdodCwgbG9hZCwgc2hhcmVzOwogCisJdGdfd2VpZ2h0ID0gY2FsY190Z193ZWlnaHQodGcsIGNmc19ycSk7CiAJbG9hZCA9IGNmc19ycS0+bG9hZC53ZWlnaHQ7CiAKLQlsb2FkX3dlaWdodCA9IGF0b21pY19yZWFkKCZ0Zy0+bG9hZF93ZWlnaHQpOwotCWxvYWRfd2VpZ2h0ICs9IGxvYWQ7Ci0JbG9hZF93ZWlnaHQgLT0gY2ZzX3JxLT5sb2FkX2NvbnRyaWJ1dGlvbjsKLQogCXNoYXJlcyA9ICh0Zy0+c2hhcmVzICogbG9hZCk7Ci0JaWYgKGxvYWRfd2VpZ2h0KQotCQlzaGFyZXMgLz0gbG9hZF93ZWlnaHQ7CisJaWYgKHRnX3dlaWdodCkKKwkJc2hhcmVzIC89IHRnX3dlaWdodDsKIAogCWlmIChzaGFyZXMgPCBNSU5fU0hBUkVTKQogCQlzaGFyZXMgPSBNSU5fU0hBUkVTOwpAQCAtODgwLDcgKzEwMDMsNiBAQAogCQlpZiAodW5saWtlbHkoZGVsdGEgPiBzZS0+c3RhdGlzdGljcy5zbGVlcF9tYXgpKQogCQkJc2UtPnN0YXRpc3RpY3Muc2xlZXBfbWF4ID0gZGVsdGE7CiAKLQkJc2UtPnN0YXRpc3RpY3Muc2xlZXBfc3RhcnQgPSAwOwogCQlzZS0+c3RhdGlzdGljcy5zdW1fc2xlZXBfcnVudGltZSArPSBkZWx0YTsKIAogCQlpZiAodHNrKSB7CkBAIC04OTcsNyArMTAxOSw2IEBACiAJCWlmICh1bmxpa2VseShkZWx0YSA+IHNlLT5zdGF0aXN0aWNzLmJsb2NrX21heCkpCiAJCQlzZS0+c3RhdGlzdGljcy5ibG9ja19tYXggPSBkZWx0YTsKIAotCQlzZS0+c3RhdGlzdGljcy5ibG9ja19zdGFydCA9IDA7CiAJCXNlLT5zdGF0aXN0aWNzLnN1bV9zbGVlcF9ydW50aW1lICs9IGRlbHRhOwogCiAJCWlmICh0c2spIHsKQEAgLTkwNyw2ICsxMDI4LDggQEAKIAkJCQl0cmFjZV9zY2hlZF9zdGF0X2lvd2FpdCh0c2ssIGRlbHRhKTsKIAkJCX0KIAorCQkJdHJhY2Vfc2NoZWRfc3RhdF9ibG9ja2VkKHRzaywgZGVsdGEpOworCiAJCQkvKgogCQkJICogQmxvY2tpbmcgdGltZSBpcyBpbiB1bml0cyBvZiBuYW5vc2Vjcywgc28gc2hpZnQgYnkKIAkJCSAqIDIwIHRvIGdldCBhIG1pbGxpc2Vjb25kcy1yYW5nZSBlc3RpbWF0aW9uIG9mIHRoZQpAQCAtMTI3NCw2ICsxMzk3LDMyIEBACiAgKi8KIAogI2lmZGVmIENPTkZJR19DRlNfQkFORFdJRFRICisKKyNpZmRlZiBIQVZFX0pVTVBfTEFCRUwKK3N0YXRpYyBzdHJ1Y3QganVtcF9sYWJlbF9rZXkgX19jZnNfYmFuZHdpZHRoX3VzZWQ7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBjZnNfYmFuZHdpZHRoX3VzZWQodm9pZCkKK3sKKwlyZXR1cm4gc3RhdGljX2JyYW5jaCgmX19jZnNfYmFuZHdpZHRoX3VzZWQpOworfQorCit2b2lkIGFjY291bnRfY2ZzX2JhbmR3aWR0aF91c2VkKGludCBlbmFibGVkLCBpbnQgd2FzX2VuYWJsZWQpCit7CisJLyogb25seSBuZWVkIHRvIGNvdW50IGdyb3VwcyB0cmFuc2l0aW9uaW5nIGJldHdlZW4gZW5hYmxlZC8hZW5hYmxlZCAqLworCWlmIChlbmFibGVkICYmICF3YXNfZW5hYmxlZCkKKwkJanVtcF9sYWJlbF9pbmMoJl9fY2ZzX2JhbmR3aWR0aF91c2VkKTsKKwllbHNlIGlmICghZW5hYmxlZCAmJiB3YXNfZW5hYmxlZCkKKwkJanVtcF9sYWJlbF9kZWMoJl9fY2ZzX2JhbmR3aWR0aF91c2VkKTsKK30KKyNlbHNlIC8qIEhBVkVfSlVNUF9MQUJFTCAqLworc3RhdGljIGJvb2wgY2ZzX2JhbmR3aWR0aF91c2VkKHZvaWQpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgYWNjb3VudF9jZnNfYmFuZHdpZHRoX3VzZWQoaW50IGVuYWJsZWQsIGludCB3YXNfZW5hYmxlZCkge30KKyNlbmRpZiAvKiBIQVZFX0pVTVBfTEFCRUwgKi8KKwogLyoKICAqIGRlZmF1bHQgcGVyaW9kIGZvciBjZnMgZ3JvdXAgYmFuZHdpZHRoLgogICogZGVmYXVsdDogMC4xcywgdW5pdHM6IG5hbm9zZWNvbmRzCkBAIC0xMjk1LDcgKzE0NDQsNyBAQAogICoKICAqIHJlcXVpcmVzIGNmc19iLT5sb2NrCiAgKi8KLXN0YXRpYyB2b2lkIF9fcmVmaWxsX2Nmc19iYW5kd2lkdGhfcnVudGltZShzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IpCit2b2lkIF9fcmVmaWxsX2Nmc19iYW5kd2lkdGhfcnVudGltZShzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IpCiB7CiAJdTY0IG5vdzsKIApAQCAtMTMwNyw2ICsxNDU2LDExIEBACiAJY2ZzX2ItPnJ1bnRpbWVfZXhwaXJlcyA9IG5vdyArIGt0aW1lX3RvX25zKGNmc19iLT5wZXJpb2QpOwogfQogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjZnNfYmFuZHdpZHRoICp0Z19jZnNfYmFuZHdpZHRoKHN0cnVjdCB0YXNrX2dyb3VwICp0ZykKK3sKKwlyZXR1cm4gJnRnLT5jZnNfYmFuZHdpZHRoOworfQorCiAvKiByZXR1cm5zIDAgb24gZmFpbHVyZSB0byBhbGxvY2F0ZSBydW50aW1lICovCiBzdGF0aWMgaW50IGFzc2lnbl9jZnNfcnFfcnVudGltZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpCiB7CkBAIC0xNDA4LDcgKzE1NjIsNyBAQAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIGFjY291bnRfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxLAogCQkJCQkJICAgdW5zaWduZWQgbG9uZyBkZWx0YV9leGVjKQogewotCWlmICghY2ZzX3JxLT5ydW50aW1lX2VuYWJsZWQpCisJaWYgKCFjZnNfYmFuZHdpZHRoX3VzZWQoKSB8fCAhY2ZzX3JxLT5ydW50aW1lX2VuYWJsZWQpCiAJCXJldHVybjsKIAogCV9fYWNjb3VudF9jZnNfcnFfcnVudGltZShjZnNfcnEsIGRlbHRhX2V4ZWMpOwpAQCAtMTQxNiwxMyArMTU3MCwxMyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBjZnNfcnFfdGhyb3R0bGVkKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKIHsKLQlyZXR1cm4gY2ZzX3JxLT50aHJvdHRsZWQ7CisJcmV0dXJuIGNmc19iYW5kd2lkdGhfdXNlZCgpICYmIGNmc19ycS0+dGhyb3R0bGVkOwogfQogCiAvKiBjaGVjayB3aGV0aGVyIGNmc19ycSwgb3IgYW55IHBhcmVudCwgaXMgdGhyb3R0bGVkICovCiBzdGF0aWMgaW5saW5lIGludCB0aHJvdHRsZWRfaGllcmFyY2h5KHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKIHsKLQlyZXR1cm4gY2ZzX3JxLT50aHJvdHRsZV9jb3VudDsKKwlyZXR1cm4gY2ZzX2JhbmR3aWR0aF91c2VkKCkgJiYgY2ZzX3JxLT50aHJvdHRsZV9jb3VudDsKIH0KIAogLyoKQEAgLTE1MTcsNyArMTY3MSw3IEBACiAJcmF3X3NwaW5fdW5sb2NrKCZjZnNfYi0+bG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIHVudGhyb3R0bGVfY2ZzX3JxKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKK3ZvaWQgdW50aHJvdHRsZV9jZnNfcnEoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQogewogCXN0cnVjdCBycSAqcnEgPSBycV9vZihjZnNfcnEpOwogCXN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYiA9IHRnX2Nmc19iYW5kd2lkdGgoY2ZzX3JxLT50Zyk7CkBAIC0xNzQzLDcgKzE4OTcsMTAgQEAKIAogc3RhdGljIF9fYWx3YXlzX2lubGluZSB2b2lkIHJldHVybl9jZnNfcnFfcnVudGltZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpCiB7Ci0JaWYgKCFjZnNfcnEtPnJ1bnRpbWVfZW5hYmxlZCB8fCAhY2ZzX3JxLT5ucl9ydW5uaW5nKQorCWlmICghY2ZzX2JhbmR3aWR0aF91c2VkKCkpCisJCXJldHVybjsKKworCWlmICghY2ZzX3JxLT5ydW50aW1lX2VuYWJsZWQgfHwgY2ZzX3JxLT5ucl9ydW5uaW5nKQogCQlyZXR1cm47CiAKIAlfX3JldHVybl9jZnNfcnFfcnVudGltZShjZnNfcnEpOwpAQCAtMTc4OCw2ICsxOTQ1LDkgQEAKICAqLwogc3RhdGljIHZvaWQgY2hlY2tfZW5xdWV1ZV90aHJvdHRsZShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpCiB7CisJaWYgKCFjZnNfYmFuZHdpZHRoX3VzZWQoKSkKKwkJcmV0dXJuOworCiAJLyogYW4gYWN0aXZlIGdyb3VwIG11c3QgYmUgaGFuZGxlZCBieSB0aGUgdXBkYXRlX2N1cnIoKS0+cHV0KCkgcGF0aCAqLwogCWlmICghY2ZzX3JxLT5ydW50aW1lX2VuYWJsZWQgfHwgY2ZzX3JxLT5jdXJyKQogCQlyZXR1cm47CkBAIC0xODA1LDYgKzE5NjUsOSBAQAogLyogY29uZGl0aW9uYWxseSB0aHJvdHRsZSBhY3RpdmUgY2ZzX3JxJ3MgZnJvbSBwdXRfcHJldl9lbnRpdHkoKSAqLwogc3RhdGljIHZvaWQgY2hlY2tfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKQogeworCWlmICghY2ZzX2JhbmR3aWR0aF91c2VkKCkpCisJCXJldHVybjsKKwogCWlmIChsaWtlbHkoIWNmc19ycS0+cnVudGltZV9lbmFibGVkIHx8IGNmc19ycS0+cnVudGltZV9yZW1haW5pbmcgPiAwKSkKIAkJcmV0dXJuOwogCkBAIC0xODE3LDcgKzE5ODAsMTEyIEBACiAKIAl0aHJvdHRsZV9jZnNfcnEoY2ZzX3JxKTsKIH0KLSNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdTY0IGRlZmF1bHRfY2ZzX3BlcmlvZCh2b2lkKTsKK3N0YXRpYyBpbnQgZG9fc2NoZWRfY2ZzX3BlcmlvZF90aW1lcihzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IsIGludCBvdmVycnVuKTsKK3N0YXRpYyB2b2lkIGRvX3NjaGVkX2Nmc19zbGFja190aW1lcihzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IpOworCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgc2NoZWRfY2ZzX3NsYWNrX3RpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IgPQorCQljb250YWluZXJfb2YodGltZXIsIHN0cnVjdCBjZnNfYmFuZHdpZHRoLCBzbGFja190aW1lcik7CisJZG9fc2NoZWRfY2ZzX3NsYWNrX3RpbWVyKGNmc19iKTsKKworCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKK30KKworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHNjaGVkX2Nmc19wZXJpb2RfdGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYiA9CisJCWNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGNmc19iYW5kd2lkdGgsIHBlcmlvZF90aW1lcik7CisJa3RpbWVfdCBub3c7CisJaW50IG92ZXJydW47CisJaW50IGlkbGUgPSAwOworCisJZm9yICg7OykgeworCQlub3cgPSBocnRpbWVyX2NiX2dldF90aW1lKHRpbWVyKTsKKwkJb3ZlcnJ1biA9IGhydGltZXJfZm9yd2FyZCh0aW1lciwgbm93LCBjZnNfYi0+cGVyaW9kKTsKKworCQlpZiAoIW92ZXJydW4pCisJCQlicmVhazsKKworCQlpZGxlID0gZG9fc2NoZWRfY2ZzX3BlcmlvZF90aW1lcihjZnNfYiwgb3ZlcnJ1bik7CisJfQorCisJcmV0dXJuIGlkbGUgPyBIUlRJTUVSX05PUkVTVEFSVCA6IEhSVElNRVJfUkVTVEFSVDsKK30KKwordm9pZCBpbml0X2Nmc19iYW5kd2lkdGgoc3RydWN0IGNmc19iYW5kd2lkdGggKmNmc19iKQoreworCXJhd19zcGluX2xvY2tfaW5pdCgmY2ZzX2ItPmxvY2spOworCWNmc19iLT5ydW50aW1lID0gMDsKKwljZnNfYi0+cXVvdGEgPSBSVU5USU1FX0lORjsKKwljZnNfYi0+cGVyaW9kID0gbnNfdG9fa3RpbWUoZGVmYXVsdF9jZnNfcGVyaW9kKCkpOworCisJSU5JVF9MSVNUX0hFQUQoJmNmc19iLT50aHJvdHRsZWRfY2ZzX3JxKTsKKwlocnRpbWVyX2luaXQoJmNmc19iLT5wZXJpb2RfdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJY2ZzX2ItPnBlcmlvZF90aW1lci5mdW5jdGlvbiA9IHNjaGVkX2Nmc19wZXJpb2RfdGltZXI7CisJaHJ0aW1lcl9pbml0KCZjZnNfYi0+c2xhY2tfdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJY2ZzX2ItPnNsYWNrX3RpbWVyLmZ1bmN0aW9uID0gc2NoZWRfY2ZzX3NsYWNrX3RpbWVyOworfQorCitzdGF0aWMgdm9pZCBpbml0X2Nmc19ycV9ydW50aW1lKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkKK3sKKwljZnNfcnEtPnJ1bnRpbWVfZW5hYmxlZCA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJmNmc19ycS0+dGhyb3R0bGVkX2xpc3QpOworfQorCisvKiByZXF1aXJlcyBjZnNfYi0+bG9jaywgbWF5IHJlbGVhc2UgdG8gcmVwcm9ncmFtIHRpbWVyICovCit2b2lkIF9fc3RhcnRfY2ZzX2JhbmR3aWR0aChzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IpCit7CisJLyoKKwkgKiBUaGUgdGltZXIgbWF5IGJlIGFjdGl2ZSBiZWNhdXNlIHdlJ3JlIHRyeWluZyB0byBzZXQgYSBuZXcgYmFuZHdpZHRoCisJICogcGVyaW9kIG9yIGJlY2F1c2Ugd2UncmUgcmFjaW5nIHdpdGggdGhlIHRlYXItZG93biBwYXRoCisJICogKHRpbWVyX2FjdGl2ZT09MCBiZWNvbWVzIHZpc2libGUgYmVmb3JlIHRoZSBocnRpbWVyIGNhbGwtYmFjaworCSAqIHRlcm1pbmF0ZXMpLiAgSW4gZWl0aGVyIGNhc2Ugd2UgZW5zdXJlIHRoYXQgaXQncyByZS1wcm9ncmFtbWVkCisJICovCisJd2hpbGUgKHVubGlrZWx5KGhydGltZXJfYWN0aXZlKCZjZnNfYi0+cGVyaW9kX3RpbWVyKSkpIHsKKwkJcmF3X3NwaW5fdW5sb2NrKCZjZnNfYi0+bG9jayk7CisJCS8qIGVuc3VyZSBjZnNfYi0+bG9jayBpcyBhdmFpbGFibGUgd2hpbGUgd2Ugd2FpdCAqLworCQlocnRpbWVyX2NhbmNlbCgmY2ZzX2ItPnBlcmlvZF90aW1lcik7CisKKwkJcmF3X3NwaW5fbG9jaygmY2ZzX2ItPmxvY2spOworCQkvKiBpZiBzb21lb25lIGVsc2UgcmVzdGFydGVkIHRoZSB0aW1lciB0aGVuIHdlJ3JlIGRvbmUgKi8KKwkJaWYgKGNmc19iLT50aW1lcl9hY3RpdmUpCisJCQlyZXR1cm47CisJfQorCisJY2ZzX2ItPnRpbWVyX2FjdGl2ZSA9IDE7CisJc3RhcnRfYmFuZHdpZHRoX3RpbWVyKCZjZnNfYi0+cGVyaW9kX3RpbWVyLCBjZnNfYi0+cGVyaW9kKTsKK30KKworc3RhdGljIHZvaWQgZGVzdHJveV9jZnNfYmFuZHdpZHRoKHN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYikKK3sKKwlocnRpbWVyX2NhbmNlbCgmY2ZzX2ItPnBlcmlvZF90aW1lcik7CisJaHJ0aW1lcl9jYW5jZWwoJmNmc19iLT5zbGFja190aW1lcik7Cit9CisKK3ZvaWQgdW50aHJvdHRsZV9vZmZsaW5lX2Nmc19ycXMoc3RydWN0IHJxICpycSkKK3sKKwlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnE7CisKKwlmb3JfZWFjaF9sZWFmX2Nmc19ycShycSwgY2ZzX3JxKSB7CisJCXN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYiA9IHRnX2Nmc19iYW5kd2lkdGgoY2ZzX3JxLT50Zyk7CisKKwkJaWYgKCFjZnNfcnEtPnJ1bnRpbWVfZW5hYmxlZCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIGNsb2NrX3Rhc2sgaXMgbm90IGFkdmFuY2luZyBzbyB3ZSBqdXN0IG5lZWQgdG8gbWFrZSBzdXJlCisJCSAqIHRoZXJlJ3Mgc29tZSB2YWxpZCBxdW90YSBhbW91bnQKKwkJICovCisJCWNmc19ycS0+cnVudGltZV9yZW1haW5pbmcgPSBjZnNfYi0+cXVvdGE7CisJCWlmIChjZnNfcnFfdGhyb3R0bGVkKGNmc19ycSkpCisJCQl1bnRocm90dGxlX2Nmc19ycShjZnNfcnEpOworCX0KK30KKworI2Vsc2UgLyogQ09ORklHX0NGU19CQU5EV0lEVEggKi8KIHN0YXRpYyB2b2lkIGFjY291bnRfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyBkZWx0YV9leGVjKSB7fQogc3RhdGljIHZvaWQgY2hlY2tfY2ZzX3JxX3J1bnRpbWUoc3RydWN0IGNmc19ycSAqY2ZzX3JxKSB7fQpAQCAtMTgzOSw4ICsyMTA3LDIyIEBACiB7CiAJcmV0dXJuIDA7CiB9CisKK3ZvaWQgaW5pdF9jZnNfYmFuZHdpZHRoKHN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYikge30KKworI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECitzdGF0aWMgdm9pZCBpbml0X2Nmc19ycV9ydW50aW1lKHN0cnVjdCBjZnNfcnEgKmNmc19ycSkge30KICNlbmRpZgogCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjZnNfYmFuZHdpZHRoICp0Z19jZnNfYmFuZHdpZHRoKHN0cnVjdCB0YXNrX2dyb3VwICp0ZykKK3sKKwlyZXR1cm4gTlVMTDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZXN0cm95X2Nmc19iYW5kd2lkdGgoc3RydWN0IGNmc19iYW5kd2lkdGggKmNmc19iKSB7fQordm9pZCB1bnRocm90dGxlX29mZmxpbmVfY2ZzX3JxcyhzdHJ1Y3QgcnEgKnJxKSB7fQorCisjZW5kaWYgLyogQ09ORklHX0NGU19CQU5EV0lEVEggKi8KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBDRlMgb3BlcmF0aW9ucyBvbiB0YXNrczoKICAqLwpAQCAtMTg1Myw3ICsyMTM1LDcgQEAKIAogCVdBUk5fT04odGFza19ycShwKSAhPSBycSk7CiAKLQlpZiAoaHJ0aWNrX2VuYWJsZWQocnEpICYmIGNmc19ycS0+bnJfcnVubmluZyA+IDEpIHsKKwlpZiAoY2ZzX3JxLT5ucl9ydW5uaW5nID4gMSkgewogCQl1NjQgc2xpY2UgPSBzY2hlZF9zbGljZShjZnNfcnEsIHNlKTsKIAkJdTY0IHJhbiA9IHNlLT5zdW1fZXhlY19ydW50aW1lIC0gc2UtPnByZXZfc3VtX2V4ZWNfcnVudGltZTsKIAkJczY0IGRlbHRhID0gc2xpY2UgLSByYW47CkBAIC0xODg0LDcgKzIxNjYsNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IHJxLT5jdXJyOwogCi0JaWYgKGN1cnItPnNjaGVkX2NsYXNzICE9ICZmYWlyX3NjaGVkX2NsYXNzKQorCWlmICghaHJ0aWNrX2VuYWJsZWQocnEpIHx8IGN1cnItPnNjaGVkX2NsYXNzICE9ICZmYWlyX3NjaGVkX2NsYXNzKQogCQlyZXR1cm47CiAKIAlpZiAoY2ZzX3JxX29mKCZjdXJyLT5zZSktPm5yX3J1bm5pbmcgPCBzY2hlZF9ucl9sYXRlbmN5KQpAQCAtMjAwNyw2ICsyMjg5LDYxIEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCisvKiBVc2VkIGluc3RlYWQgb2Ygc291cmNlX2xvYWQgd2hlbiB3ZSBrbm93IHRoZSB0eXBlID09IDAgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdlaWdodGVkX2NwdWxvYWQoY29uc3QgaW50IGNwdSkKK3sKKwlyZXR1cm4gY3B1X3JxKGNwdSktPmxvYWQud2VpZ2h0OworfQorCisvKgorICogUmV0dXJuIGEgbG93IGd1ZXNzIGF0IHRoZSBsb2FkIG9mIGEgbWlncmF0aW9uLXNvdXJjZSBjcHUgd2VpZ2h0ZWQKKyAqIGFjY29yZGluZyB0byB0aGUgc2NoZWR1bGluZyBjbGFzcyBhbmQgIm5pY2UiIHZhbHVlLgorICoKKyAqIFdlIHdhbnQgdG8gdW5kZXItZXN0aW1hdGUgdGhlIGxvYWQgb2YgbWlncmF0aW9uIHNvdXJjZXMsIHRvCisgKiBiYWxhbmNlIGNvbnNlcnZhdGl2ZWx5LgorICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBzb3VyY2VfbG9hZChpbnQgY3B1LCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7CisJdW5zaWduZWQgbG9uZyB0b3RhbCA9IHdlaWdodGVkX2NwdWxvYWQoY3B1KTsKKworCWlmICh0eXBlID09IDAgfHwgIXNjaGVkX2ZlYXQoTEJfQklBUykpCisJCXJldHVybiB0b3RhbDsKKworCXJldHVybiBtaW4ocnEtPmNwdV9sb2FkW3R5cGUtMV0sIHRvdGFsKTsKK30KKworLyoKKyAqIFJldHVybiBhIGhpZ2ggZ3Vlc3MgYXQgdGhlIGxvYWQgb2YgYSBtaWdyYXRpb24tdGFyZ2V0IGNwdSB3ZWlnaHRlZAorICogYWNjb3JkaW5nIHRvIHRoZSBzY2hlZHVsaW5nIGNsYXNzIGFuZCAibmljZSIgdmFsdWUuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRhcmdldF9sb2FkKGludCBjcHUsIGludCB0eXBlKQoreworCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsID0gd2VpZ2h0ZWRfY3B1bG9hZChjcHUpOworCisJaWYgKHR5cGUgPT0gMCB8fCAhc2NoZWRfZmVhdChMQl9CSUFTKSkKKwkJcmV0dXJuIHRvdGFsOworCisJcmV0dXJuIG1heChycS0+Y3B1X2xvYWRbdHlwZS0xXSwgdG90YWwpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwb3dlcl9vZihpbnQgY3B1KQoreworCXJldHVybiBjcHVfcnEoY3B1KS0+Y3B1X3Bvd2VyOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcHVfYXZnX2xvYWRfcGVyX3Rhc2soaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7CisJdW5zaWduZWQgbG9uZyBucl9ydW5uaW5nID0gQUNDRVNTX09OQ0UocnEtPm5yX3J1bm5pbmcpOworCisJaWYgKG5yX3J1bm5pbmcpCisJCXJldHVybiBycS0+bG9hZC53ZWlnaHQgLyBucl9ydW5uaW5nOworCisJcmV0dXJuIDA7Cit9CisKIAogc3RhdGljIHZvaWQgdGFza193YWtpbmdfZmFpcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CkBAIC0yMDM2LDM2ICsyMzczLDEwMCBAQAogICogQWRkaW5nIGxvYWQgdG8gYSBncm91cCBkb2Vzbid0IG1ha2UgYSBncm91cCBoZWF2aWVyLCBidXQgY2FuIGNhdXNlIG1vdmVtZW50CiAgKiBvZiBncm91cCBzaGFyZXMgYmV0d2VlbiBjcHVzLiBBc3N1bWluZyB0aGUgc2hhcmVzIHdlcmUgcGVyZmVjdGx5IGFsaWduZWQgb25lCiAgKiBjYW4gY2FsY3VsYXRlIHRoZSBzaGlmdCBpbiBzaGFyZXMuCisgKgorICogQ2FsY3VsYXRlIHRoZSBlZmZlY3RpdmUgbG9hZCBkaWZmZXJlbmNlIGlmIEB3bCBpcyBhZGRlZCAoc3VidHJhY3RlZCkgdG8gQHRnCisgKiBvbiB0aGlzIEBjcHUgYW5kIHJlc3VsdHMgaW4gYSB0b3RhbCBhZGRpdGlvbiAoc3VidHJhY3Rpb24pIG9mIEB3ZyB0byB0aGUKKyAqIHRvdGFsIGdyb3VwIHdlaWdodC4KKyAqCisgKiBHaXZlbiBhIHJ1bnF1ZXVlIHdlaWdodCBkaXN0cmlidXRpb24gKHJ3X2kpIHdlIGNhbiBjb21wdXRlIGEgc2hhcmVzCisgKiBkaXN0cmlidXRpb24gKHNfaSkgdXNpbmc6CisgKgorICogICBzX2kgPSByd19pIC8gXFN1bSByd19qCQkJCQkJKDEpCisgKgorICogU3VwcG9zZSB3ZSBoYXZlIDQgQ1BVcyBhbmQgb3VyIEB0ZyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgcm9vdCBncm91cCBhbmQKKyAqIGhhcyA3IGVxdWFsIHdlaWdodCB0YXNrcywgZGlzdHJpYnV0ZWQgYXMgYmVsb3cgKHJ3X2kpLCB3aXRoIHRoZSByZXN1bHRpbmcKKyAqIHNoYXJlcyBkaXN0cmlidXRpb24gKHNfaSk6CisgKgorICogICByd19pID0geyAgIDIsICAgNCwgICAxLCAgIDAgfQorICogICBzX2kgID0geyAyLzcsIDQvNywgMS83LCAgIDAgfQorICoKKyAqIEFzIHBlciB3YWtlX2FmZmluZSgpIHdlJ3JlIGludGVyZXN0ZWQgaW4gdGhlIGxvYWQgb2YgdHdvIENQVXMgKHRoZSBDUFUgdGhlCisgKiB0YXNrIHVzZWQgdG8gcnVuIG9uIGFuZCB0aGUgQ1BVIHRoZSB3YWtlciBpcyBydW5uaW5nIG9uKSwgd2UgbmVlZCB0bworICogY29tcHV0ZSB0aGUgZWZmZWN0IG9mIHdha2luZyBhIHRhc2sgb24gZWl0aGVyIENQVSBhbmQsIGluIGNhc2Ugb2YgYSBzeW5jCisgKiB3YWtldXAsIGNvbXB1dGUgdGhlIGVmZmVjdCBvZiB0aGUgY3VycmVudCB0YXNrIGdvaW5nIHRvIHNsZWVwLgorICoKKyAqIFNvIGZvciBhIGNoYW5nZSBvZiBAd2wgdG8gdGhlIGxvY2FsIEBjcHUgd2l0aCBhbiBvdmVyYWxsIGdyb3VwIHdlaWdodCBjaGFuZ2UKKyAqIG9mIEB3bCB3ZSBjYW4gY29tcHV0ZSB0aGUgbmV3IHNoYXJlcyBkaXN0cmlidXRpb24gKHMnX2kpIHVzaW5nOgorICoKKyAqICAgcydfaSA9IChyd19pICsgQHdsKSAvIChAd2cgKyBcU3VtIHJ3X2opCQkJCSgyKQorICoKKyAqIFN1cHBvc2Ugd2UncmUgaW50ZXJlc3RlZCBpbiBDUFVzIDAgYW5kIDEsIGFuZCB3YW50IHRvIGNvbXB1dGUgdGhlIGxvYWQKKyAqIGRpZmZlcmVuY2VzIGluIHdha2luZyBhIHRhc2sgdG8gQ1BVIDAuIFRoZSBhZGRpdGlvbmFsIHRhc2sgY2hhbmdlcyB0aGUKKyAqIHdlaWdodCBhbmQgc2hhcmVzIGRpc3RyaWJ1dGlvbnMgbGlrZToKKyAqCisgKiAgIHJ3J19pID0geyAgIDMsICAgNCwgICAxLCAgIDAgfQorICogICBzJ19pICA9IHsgMy84LCA0LzgsIDEvOCwgICAwIH0KKyAqCisgKiBXZSBjYW4gdGhlbiBjb21wdXRlIHRoZSBkaWZmZXJlbmNlIGluIGVmZmVjdGl2ZSB3ZWlnaHQgYnkgdXNpbmc6CisgKgorICogICBkd19pID0gUyAqIChzJ19pIC0gc19pKQkJCQkJCSgzKQorICoKKyAqIFdoZXJlICdTJyBpcyB0aGUgZ3JvdXAgd2VpZ2h0IGFzIHNlZW4gYnkgaXRzIHBhcmVudC4KKyAqCisgKiBUaGVyZWZvcmUgdGhlIGVmZmVjdGl2ZSBjaGFuZ2UgaW4gbG9hZHMgb24gQ1BVIDAgd291bGQgYmUgNS81NiAoMy84IC0gMi83KQorICogdGltZXMgdGhlIHdlaWdodCBvZiB0aGUgZ3JvdXAuIFRoZSBlZmZlY3Qgb24gQ1BVIDEgd291bGQgYmUgLTQvNTYgKDQvOCAtCisgKiA0LzcpIHRpbWVzIHRoZSB3ZWlnaHQgb2YgdGhlIGdyb3VwLgogICovCiBzdGF0aWMgbG9uZyBlZmZlY3RpdmVfbG9hZChzdHJ1Y3QgdGFza19ncm91cCAqdGcsIGludCBjcHUsIGxvbmcgd2wsIGxvbmcgd2cpCiB7CiAJc3RydWN0IHNjaGVkX2VudGl0eSAqc2UgPSB0Zy0+c2VbY3B1XTsKIAotCWlmICghdGctPnBhcmVudCkKKwlpZiAoIXRnLT5wYXJlbnQpCS8qIHRoZSB0cml2aWFsLCBub24tY2dyb3VwIGNhc2UgKi8KIAkJcmV0dXJuIHdsOwogCiAJZm9yX2VhY2hfc2NoZWRfZW50aXR5KHNlKSB7Ci0JCWxvbmcgbHcsIHc7CisJCWxvbmcgdywgVzsKIAogCQl0ZyA9IHNlLT5teV9xLT50ZzsKLQkJdyA9IHNlLT5teV9xLT5sb2FkLndlaWdodDsKIAotCQkvKiB1c2UgdGhpcyBjcHUncyBpbnN0YW50YW5lb3VzIGNvbnRyaWJ1dGlvbiAqLwotCQlsdyA9IGF0b21pY19yZWFkKCZ0Zy0+bG9hZF93ZWlnaHQpOwotCQlsdyAtPSBzZS0+bXlfcS0+bG9hZF9jb250cmlidXRpb247Ci0JCWx3ICs9IHcgKyB3ZzsKKwkJLyoKKwkJICogVyA9IEB3ZyArIFxTdW0gcndfagorCQkgKi8KKwkJVyA9IHdnICsgY2FsY190Z193ZWlnaHQodGcsIHNlLT5teV9xKTsKIAotCQl3bCArPSB3OworCQkvKgorCQkgKiB3ID0gcndfaSArIEB3bAorCQkgKi8KKwkJdyA9IHNlLT5teV9xLT5sb2FkLndlaWdodCArIHdsOwogCi0JCWlmIChsdyA+IDAgJiYgd2wgPCBsdykKLQkJCXdsID0gKHdsICogdGctPnNoYXJlcykgLyBsdzsKKwkJLyoKKwkJICogd2wgPSBTICogcydfaTsgc2VlICgyKQorCQkgKi8KKwkJaWYgKFcgPiAwICYmIHcgPCBXKQorCQkJd2wgPSAodyAqIHRnLT5zaGFyZXMpIC8gVzsKIAkJZWxzZQogCQkJd2wgPSB0Zy0+c2hhcmVzOwogCi0JCS8qIHplcm8gcG9pbnQgaXMgTUlOX1NIQVJFUyAqLworCQkvKgorCQkgKiBQZXIgdGhlIGFib3ZlLCB3bCBpcyB0aGUgbmV3IHNlLT5sb2FkLndlaWdodCB2YWx1ZTsgc2luY2UKKwkJICogdGhvc2UgYXJlIGNsaXBwZWQgdG8gW01JTl9TSEFSRVMsIC4uLikgZG8gc28gbm93LiBTZWUKKwkJICogY2FsY19jZnNfc2hhcmVzKCkuCisJCSAqLwogCQlpZiAod2wgPCBNSU5fU0hBUkVTKQogCQkJd2wgPSBNSU5fU0hBUkVTOworCisJCS8qCisJCSAqIHdsID0gZHdfaSA9IFMgKiAocydfaSAtIHNfaSk7IHNlZSAoMykKKwkJICovCiAJCXdsIC09IHNlLT5sb2FkLndlaWdodDsKKworCQkvKgorCQkgKiBSZWN1cnNpdmVseSBhcHBseSB0aGlzIGxvZ2ljIHRvIGFsbCBwYXJlbnQgZ3JvdXBzIHRvIGNvbXB1dGUKKwkJICogdGhlIGZpbmFsIGVmZmVjdGl2ZSBsb2FkIGNoYW5nZSBvbiB0aGUgcm9vdCBncm91cC4gU2luY2UKKwkJICogb25seSB0aGUgQHRnIGdyb3VwIGdldHMgZXh0cmEgd2VpZ2h0LCBhbGwgcGFyZW50IGdyb3VwcyBjYW4KKwkJICogb25seSByZWRpc3RyaWJ1dGUgZXhpc3Rpbmcgc2hhcmVzLiBAd2wgaXMgdGhlIHNoaWZ0IGluIHNoYXJlcworCQkgKiByZXN1bHRpbmcgZnJvbSB0aGlzIGxldmVsIHBlciB0aGUgYWJvdmUuCisJCSAqLwogCQl3ZyA9IDA7CiAJfQogCkBAIC0yMjQ5LDYgKzI2NTAsNyBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJaW50IHByZXZfY3B1ID0gdGFza19jcHUocCk7CiAJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisJc3RydWN0IHNjaGVkX2dyb3VwICpzZzsKIAlpbnQgaTsKIAogCS8qCkBAIC0yMjY5LDI1ICsyNjcxLDI4IEBACiAJICogT3RoZXJ3aXNlLCBpdGVyYXRlIHRoZSBkb21haW5zIGFuZCBmaW5kIGFuIGVsZWdpYmxlIGlkbGUgY3B1LgogCSAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQlmb3JfZWFjaF9kb21haW4odGFyZ2V0LCBzZCkgewotCQlpZiAoIShzZC0+ZmxhZ3MgJiBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTKSkKLQkJCWJyZWFrOwogCi0JCWZvcl9lYWNoX2NwdV9hbmQoaSwgc2NoZWRfZG9tYWluX3NwYW4oc2QpLCB0c2tfY3B1c19hbGxvd2VkKHApKSB7Ci0JCQlpZiAoaWRsZV9jcHUoaSkpIHsKLQkJCQl0YXJnZXQgPSBpOwotCQkJCWJyZWFrOworCXNkID0gcmN1X2RlcmVmZXJlbmNlKHBlcl9jcHUoc2RfbGxjLCB0YXJnZXQpKTsKKwlmb3JfZWFjaF9sb3dlcl9kb21haW4oc2QpIHsKKwkJc2cgPSBzZC0+Z3JvdXBzOworCQlkbyB7CisJCQlpZiAoIWNwdW1hc2tfaW50ZXJzZWN0cyhzY2hlZF9ncm91cF9jcHVzKHNnKSwKKwkJCQkJCXRza19jcHVzX2FsbG93ZWQocCkpKQorCQkJCWdvdG8gbmV4dDsKKworCQkJZm9yX2VhY2hfY3B1KGksIHNjaGVkX2dyb3VwX2NwdXMoc2cpKSB7CisJCQkJaWYgKCFpZGxlX2NwdShpKSkKKwkJCQkJZ290byBuZXh0OwogCQkJfQotCQl9CiAKLQkJLyoKLQkJICogTGV0cyBzdG9wIGxvb2tpbmcgZm9yIGFuIGlkbGUgc2libGluZyB3aGVuIHdlIHJlYWNoZWQKLQkJICogdGhlIGRvbWFpbiB0aGF0IHNwYW5zIHRoZSBjdXJyZW50IGNwdSBhbmQgcHJldl9jcHUuCi0JCSAqLwotCQlpZiAoY3B1bWFza190ZXN0X2NwdShjcHUsIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSkgJiYKLQkJICAgIGNwdW1hc2tfdGVzdF9jcHUocHJldl9jcHUsIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSkpCi0JCQlicmVhazsKKwkJCXRhcmdldCA9IGNwdW1hc2tfZmlyc3RfYW5kKHNjaGVkX2dyb3VwX2NwdXMoc2cpLAorCQkJCQl0c2tfY3B1c19hbGxvd2VkKHApKTsKKwkJCWdvdG8gZG9uZTsKK25leHQ6CisJCQlzZyA9IHNnLT5uZXh0OworCQl9IHdoaWxlIChzZyAhPSBzZC0+Z3JvdXBzKTsKIAl9Citkb25lOgogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHRhcmdldDsKQEAgLTIzMTUsNiArMjcyMCw5IEBACiAJaW50IHdhbnRfc2QgPSAxOwogCWludCBzeW5jID0gd2FrZV9mbGFncyAmIFdGX1NZTkM7CiAKKwlpZiAocC0+cnQubnJfY3B1c19hbGxvd2VkID09IDEpCisJCXJldHVybiBwcmV2X2NwdTsKKwogCWlmIChzZF9mbGFnICYgU0RfQkFMQU5DRV9XQUtFKSB7CiAJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgdHNrX2NwdXNfYWxsb3dlZChwKSkpCiAJCQl3YW50X2FmZmluZSA9IDE7CkBAIC0yNTk5LDcgKzMwMDcsOCBAQAogCX0gd2hpbGUgKGNmc19ycSk7CiAKIAlwID0gdGFza19vZihzZSk7Ci0JaHJ0aWNrX3N0YXJ0X2ZhaXIocnEsIHApOworCWlmIChocnRpY2tfZW5hYmxlZChycSkpCisJCWhydGlja19zdGFydF9mYWlyKHJxLCBwKTsKIAogCXJldHVybiBwOwogfQpAQCAtMjY0Myw2ICszMDUyLDEyIEBACiAJCSAqIFVwZGF0ZSBydW4tdGltZSBzdGF0aXN0aWNzIG9mIHRoZSAnY3VycmVudCcuCiAJCSAqLwogCQl1cGRhdGVfY3VycihjZnNfcnEpOworCQkvKgorCQkgKiBUZWxsIHVwZGF0ZV9ycV9jbG9jaygpIHRoYXQgd2UndmUganVzdCB1cGRhdGVkLAorCQkgKiBzbyB3ZSBkb24ndCBkbyBtaWNyb3Njb3BpYyB1cGRhdGUgaW4gc2NoZWR1bGUoKQorCQkgKiBhbmQgZG91YmxlIHRoZSBmYXN0cGF0aCBjb3N0LgorCQkgKi8KKwkJIHJxLT5za2lwX2Nsb2NrX3VwZGF0ZSA9IDE7CiAJfQogCiAJc2V0X3NraXBfYnVkZHkoc2UpOwpAQCAtMjY4MywxMiArMzA5OCw0OCBAQAogfQogCiAvKgorICogSXMgdGhpcyB0YXNrIGxpa2VseSBjYWNoZS1ob3Q6CisgKi8KK3N0YXRpYyBpbnQKK3Rhc2tfaG90KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdTY0IG5vdywgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCit7CisJczY0IGRlbHRhOworCisJaWYgKHAtPnNjaGVkX2NsYXNzICE9ICZmYWlyX3NjaGVkX2NsYXNzKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseShwLT5wb2xpY3kgPT0gU0NIRURfSURMRSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBCdWRkeSBjYW5kaWRhdGVzIGFyZSBjYWNoZSBob3Q6CisJICovCisJaWYgKHNjaGVkX2ZlYXQoQ0FDSEVfSE9UX0JVRERZKSAmJiB0aGlzX3JxKCktPm5yX3J1bm5pbmcgJiYKKwkJCSgmcC0+c2UgPT0gY2ZzX3JxX29mKCZwLT5zZSktPm5leHQgfHwKKwkJCSAmcC0+c2UgPT0gY2ZzX3JxX29mKCZwLT5zZSktPmxhc3QpKQorCQlyZXR1cm4gMTsKKworCWlmIChzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3QgPT0gLTEpCisJCXJldHVybiAxOworCWlmIChzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3QgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlkZWx0YSA9IG5vdyAtIHAtPnNlLmV4ZWNfc3RhcnQ7CisKKwlyZXR1cm4gZGVsdGEgPCAoczY0KXN5c2N0bF9zY2hlZF9taWdyYXRpb25fY29zdDsKK30KKworI2RlZmluZSBMQkZfQUxMX1BJTk5FRAkweDAxCisjZGVmaW5lIExCRl9ORUVEX0JSRUFLCTB4MDIKKyNkZWZpbmUgTEJGX0FCT1JUCTB4MDQKKworLyoKICAqIGNhbl9taWdyYXRlX3Rhc2sgLSBtYXkgdGFzayBwIGZyb20gcnVucXVldWUgcnEgYmUgbWlncmF0ZWQgdG8gdGhpc19jcHU/CiAgKi8KIHN0YXRpYwogaW50IGNhbl9taWdyYXRlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcnEgKnJxLCBpbnQgdGhpc19jcHUsCiAJCSAgICAgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGVudW0gY3B1X2lkbGVfdHlwZSBpZGxlLAotCQkgICAgIGludCAqYWxsX3Bpbm5lZCkKKwkJICAgICBpbnQgKmxiX2ZsYWdzKQogewogCWludCB0c2tfY2FjaGVfaG90ID0gMDsKIAkvKgpAQCAtMjcwMSw3ICszMTUyLDcgQEAKIAkJc2NoZWRzdGF0X2luYyhwLCBzZS5zdGF0aXN0aWNzLm5yX2ZhaWxlZF9taWdyYXRpb25zX2FmZmluZSk7CiAJCXJldHVybiAwOwogCX0KLQkqYWxsX3Bpbm5lZCA9IDA7CisJKmxiX2ZsYWdzICY9IH5MQkZfQUxMX1BJTk5FRDsKIAogCWlmICh0YXNrX3J1bm5pbmcocnEsIHApKSB7CiAJCXNjaGVkc3RhdF9pbmMocCwgc2Uuc3RhdGlzdGljcy5ucl9mYWlsZWRfbWlncmF0aW9uc19ydW5uaW5nKTsKQEAgLTI3NzUsNyArMzIyNiw3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZwogYmFsYW5jZV90YXNrcyhzdHJ1Y3QgcnEgKnRoaXNfcnEsIGludCB0aGlzX2NwdSwgc3RydWN0IHJxICpidXNpZXN0LAogCSAgICAgIHVuc2lnbmVkIGxvbmcgbWF4X2xvYWRfbW92ZSwgc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsCi0JICAgICAgZW51bSBjcHVfaWRsZV90eXBlIGlkbGUsIGludCAqYWxsX3Bpbm5lZCwKKwkgICAgICBlbnVtIGNwdV9pZGxlX3R5cGUgaWRsZSwgaW50ICpsYl9mbGFncywKIAkgICAgICBzdHJ1Y3QgY2ZzX3JxICpidXNpZXN0X2Nmc19ycSkKIHsKIAlpbnQgbG9vcHMgPSAwLCBwdWxsZWQgPSAwOwpAQCAtMjc4NiwxMiArMzIzNywxNCBAQAogCQlnb3RvIG91dDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwLCBuLCAmYnVzaWVzdF9jZnNfcnEtPnRhc2tzLCBzZS5ncm91cF9ub2RlKSB7Ci0JCWlmIChsb29wcysrID4gc3lzY3RsX3NjaGVkX25yX21pZ3JhdGUpCisJCWlmIChsb29wcysrID4gc3lzY3RsX3NjaGVkX25yX21pZ3JhdGUpIHsKKwkJCSpsYl9mbGFncyB8PSBMQkZfTkVFRF9CUkVBSzsKIAkJCWJyZWFrOworCQl9CiAKIAkJaWYgKChwLT5zZS5sb2FkLndlaWdodCA+PiAxKSA+IHJlbV9sb2FkX21vdmUgfHwKIAkJICAgICFjYW5fbWlncmF0ZV90YXNrKHAsIGJ1c2llc3QsIHRoaXNfY3B1LCBzZCwgaWRsZSwKLQkJCQkgICAgICBhbGxfcGlubmVkKSkKKwkJCQkgICAgICBsYl9mbGFncykpCiAJCQljb250aW51ZTsKIAogCQlwdWxsX3Rhc2soYnVzaWVzdCwgcCwgdGhpc19ycSwgdGhpc19jcHUpOwpAQCAtMjgwNCw4ICszMjU3LDEwIEBACiAJCSAqIGtlcm5lbHMgd2lsbCBzdG9wIGFmdGVyIHRoZSBmaXJzdCB0YXNrIGlzIHB1bGxlZCB0byBtaW5pbWl6ZQogCQkgKiB0aGUgY3JpdGljYWwgc2VjdGlvbi4KIAkJICovCi0JCWlmIChpZGxlID09IENQVV9ORVdMWV9JRExFKQorCQlpZiAoaWRsZSA9PSBDUFVfTkVXTFlfSURMRSkgeworCQkJKmxiX2ZsYWdzIHw9IExCRl9BQk9SVDsKIAkJCWJyZWFrOworCQl9CiAjZW5kaWYKIAogCQkvKgpAQCAtMjkxMCw3ICszMzY1LDcgQEAKIGxvYWRfYmFsYW5jZV9mYWlyKHN0cnVjdCBycSAqdGhpc19ycSwgaW50IHRoaXNfY3B1LCBzdHJ1Y3QgcnEgKmJ1c2llc3QsCiAJCSAgdW5zaWduZWQgbG9uZyBtYXhfbG9hZF9tb3ZlLAogCQkgIHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBlbnVtIGNwdV9pZGxlX3R5cGUgaWRsZSwKLQkJICBpbnQgKmFsbF9waW5uZWQpCisJCSAgaW50ICpsYl9mbGFncykKIHsKIAlsb25nIHJlbV9sb2FkX21vdmUgPSBtYXhfbG9hZF9tb3ZlOwogCXN0cnVjdCBjZnNfcnEgKmJ1c2llc3RfY2ZzX3JxOwpAQCAtMjkyMyw2ICszMzc4LDkgQEAKIAkJdW5zaWduZWQgbG9uZyBidXNpZXN0X3dlaWdodCA9IGJ1c2llc3RfY2ZzX3JxLT5sb2FkLndlaWdodDsKIAkJdTY0IHJlbV9sb2FkLCBtb3ZlZF9sb2FkOwogCisJCWlmICgqbGJfZmxhZ3MgJiAoTEJGX05FRURfQlJFQUt8TEJGX0FCT1JUKSkKKwkJCWJyZWFrOworCiAJCS8qCiAJCSAqIGVtcHR5IGdyb3VwIG9yIHBhcnQgb2YgYSB0aHJvdHRsZWQgaGllcmFyY2h5CiAJCSAqLwpAQCAtMjkzNCw3ICszMzkyLDcgQEAKIAkJcmVtX2xvYWQgPSBkaXZfdTY0KHJlbV9sb2FkLCBidXNpZXN0X2hfbG9hZCArIDEpOwogCiAJCW1vdmVkX2xvYWQgPSBiYWxhbmNlX3Rhc2tzKHRoaXNfcnEsIHRoaXNfY3B1LCBidXNpZXN0LAotCQkJCXJlbV9sb2FkLCBzZCwgaWRsZSwgYWxsX3Bpbm5lZCwKKwkJCQlyZW1fbG9hZCwgc2QsIGlkbGUsIGxiX2ZsYWdzLAogCQkJCWJ1c2llc3RfY2ZzX3JxKTsKIAogCQlpZiAoIW1vdmVkX2xvYWQpCkBAIC0yOTYwLDEwICszNDE4LDEwIEBACiBsb2FkX2JhbGFuY2VfZmFpcihzdHJ1Y3QgcnEgKnRoaXNfcnEsIGludCB0aGlzX2NwdSwgc3RydWN0IHJxICpidXNpZXN0LAogCQkgIHVuc2lnbmVkIGxvbmcgbWF4X2xvYWRfbW92ZSwKIAkJICBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgZW51bSBjcHVfaWRsZV90eXBlIGlkbGUsCi0JCSAgaW50ICphbGxfcGlubmVkKQorCQkgIGludCAqbGJfZmxhZ3MpCiB7CiAJcmV0dXJuIGJhbGFuY2VfdGFza3ModGhpc19ycSwgdGhpc19jcHUsIGJ1c2llc3QsCi0JCQltYXhfbG9hZF9tb3ZlLCBzZCwgaWRsZSwgYWxsX3Bpbm5lZCwKKwkJCW1heF9sb2FkX21vdmUsIHNkLCBpZGxlLCBsYl9mbGFncywKIAkJCSZidXNpZXN0LT5jZnMpOwogfQogI2VuZGlmCkBAIC0yOTc4LDI5ICszNDM2LDMwIEBACiBzdGF0aWMgaW50IG1vdmVfdGFza3Moc3RydWN0IHJxICp0aGlzX3JxLCBpbnQgdGhpc19jcHUsIHN0cnVjdCBycSAqYnVzaWVzdCwKIAkJICAgICAgdW5zaWduZWQgbG9uZyBtYXhfbG9hZF9tb3ZlLAogCQkgICAgICBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgZW51bSBjcHVfaWRsZV90eXBlIGlkbGUsCi0JCSAgICAgIGludCAqYWxsX3Bpbm5lZCkKKwkJICAgICAgaW50ICpsYl9mbGFncykKIHsKIAl1bnNpZ25lZCBsb25nIHRvdGFsX2xvYWRfbW92ZWQgPSAwLCBsb2FkX21vdmVkOwogCiAJZG8gewogCQlsb2FkX21vdmVkID0gbG9hZF9iYWxhbmNlX2ZhaXIodGhpc19ycSwgdGhpc19jcHUsIGJ1c2llc3QsCiAJCQkJbWF4X2xvYWRfbW92ZSAtIHRvdGFsX2xvYWRfbW92ZWQsCi0JCQkJc2QsIGlkbGUsIGFsbF9waW5uZWQpOworCQkJCXNkLCBpZGxlLCBsYl9mbGFncyk7CiAKIAkJdG90YWxfbG9hZF9tb3ZlZCArPSBsb2FkX21vdmVkOwogCisJCWlmICgqbGJfZmxhZ3MgJiAoTEJGX05FRURfQlJFQUt8TEJGX0FCT1JUKSkKKwkJCWJyZWFrOworCiAjaWZkZWYgQ09ORklHX1BSRUVNUFQKIAkJLyoKIAkJICogTkVXSURMRSBiYWxhbmNpbmcgaXMgYSBzb3VyY2Ugb2YgbGF0ZW5jeSwgc28gcHJlZW1wdGlibGUKIAkJICoga2VybmVscyB3aWxsIHN0b3AgYWZ0ZXIgdGhlIGZpcnN0IHRhc2sgaXMgcHVsbGVkIHRvIG1pbmltaXplCiAJCSAqIHRoZSBjcml0aWNhbCBzZWN0aW9uLgogCQkgKi8KLQkJaWYgKGlkbGUgPT0gQ1BVX05FV0xZX0lETEUgJiYgdGhpc19ycS0+bnJfcnVubmluZykKKwkJaWYgKGlkbGUgPT0gQ1BVX05FV0xZX0lETEUgJiYgdGhpc19ycS0+bnJfcnVubmluZykgeworCQkJKmxiX2ZsYWdzIHw9IExCRl9BQk9SVDsKIAkJCWJyZWFrOwotCi0JCWlmIChyYXdfc3Bpbl9pc19jb250ZW5kZWQoJnRoaXNfcnEtPmxvY2spIHx8Ci0JCQkJcmF3X3NwaW5faXNfY29udGVuZGVkKCZidXNpZXN0LT5sb2NrKSkKLQkJCWJyZWFrOworCQl9CiAjZW5kaWYKIAl9IHdoaWxlIChsb2FkX21vdmVkICYmIG1heF9sb2FkX21vdmUgPiB0b3RhbF9sb2FkX21vdmVkKTsKIApAQCAtMzA2MiwxNSArMzUyMSw2IEBACiB9OwogCiAvKioKLSAqIGdyb3VwX2ZpcnN0X2NwdSAtIFJldHVybnMgdGhlIGZpcnN0IGNwdSBpbiB0aGUgY3B1bWFzayBvZiBhIHNjaGVkX2dyb3VwLgotICogQGdyb3VwOiBUaGUgZ3JvdXAgd2hvc2UgZmlyc3QgY3B1IGlzIHRvIGJlIHJldHVybmVkLgotICovCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBncm91cF9maXJzdF9jcHUoc3RydWN0IHNjaGVkX2dyb3VwICpncm91cCkKLXsKLQlyZXR1cm4gY3B1bWFza19maXJzdChzY2hlZF9ncm91cF9jcHVzKGdyb3VwKSk7Ci19Ci0KLS8qKgogICogZ2V0X3NkX2xvYWRfaWR4IC0gT2J0YWluIHRoZSBsb2FkIGluZGV4IGZvciBhIGdpdmVuIHNjaGVkIGRvbWFpbi4KICAqIEBzZDogVGhlIHNjaGVkX2RvbWFpbiB3aG9zZSBsb2FkX2lkeCBpcyB0byBiZSBvYnRhaW5lZC4KICAqIEBpZGxlOiBUaGUgSWRsZSBzdGF0dXMgb2YgdGhlIENQVSBmb3Igd2hvc2Ugc2QgbG9hZF9pY3ggaXMgb2J0YWluZWQuCkBAIC0zMzE5LDcgKzM3NjksNyBAQAogCXNkZy0+c2dwLT5wb3dlciA9IHBvd2VyOwogfQogCi1zdGF0aWMgdm9pZCB1cGRhdGVfZ3JvdXBfcG93ZXIoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCit2b2lkIHVwZGF0ZV9ncm91cF9wb3dlcihzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKIHsKIAlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpjaGlsZCA9IHNkLT5jaGlsZDsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdyb3VwLCAqc2RnID0gc2QtPmdyb3VwczsKQEAgLTM1MTEsNyArMzk2MSw3IEBACiB9CiAKIC8qKgotICogdXBkYXRlX3NkX2xiX3N0YXRzIC0gVXBkYXRlIHNjaGVkX2dyb3VwJ3Mgc3RhdGlzdGljcyBmb3IgbG9hZCBiYWxhbmNpbmcuCisgKiB1cGRhdGVfc2RfbGJfc3RhdHMgLSBVcGRhdGUgc2NoZWRfZG9tYWluJ3Mgc3RhdGlzdGljcyBmb3IgbG9hZCBiYWxhbmNpbmcuCiAgKiBAc2Q6IHNjaGVkX2RvbWFpbiB3aG9zZSBzdGF0aXN0aWNzIGFyZSB0byBiZSB1cGRhdGVkLgogICogQHRoaXNfY3B1OiBDcHUgZm9yIHdoaWNoIGxvYWQgYmFsYW5jZSBpcyBjdXJyZW50bHkgcGVyZm9ybWVkLgogICogQGlkbGU6IElkbGUgc3RhdHVzIG9mIHRoaXNfY3B1CkBAIC0zNTg1LDExICs0MDM1LDYgQEAKIAl9IHdoaWxlIChzZyAhPSBzZC0+Z3JvdXBzKTsKIH0KIAotaW50IF9fd2VhayBhcmNoX3NkX3NpYmxpbmdfYXN5bV9wYWNraW5nKHZvaWQpCi17Ci0gICAgICAgcmV0dXJuIDAqU0RfQVNZTV9QQUNLSU5HOwotfQotCiAvKioKICAqIGNoZWNrX2FzeW1fcGFja2luZyAtIENoZWNrIHRvIHNlZSBpZiB0aGUgZ3JvdXAgaXMgcGFja2VkIGludG8gdGhlCiAgKgkJCXNjaGVkIGRvbWFuLgpAQCAtMzk1Myw3ICs0Mzk4LDcgQEAKICNkZWZpbmUgTUFYX1BJTk5FRF9JTlRFUlZBTAk1MTIKIAogLyogV29ya2luZyBjcHVtYXNrIGZvciBsb2FkX2JhbGFuY2UgYW5kIGxvYWRfYmFsYW5jZV9uZXdpZGxlLiAqLwotc3RhdGljIERFRklORV9QRVJfQ1BVKGNwdW1hc2tfdmFyX3QsIGxvYWRfYmFsYW5jZV90bXBtYXNrKTsKK0RFRklORV9QRVJfQ1BVKGNwdW1hc2tfdmFyX3QsIGxvYWRfYmFsYW5jZV90bXBtYXNrKTsKIAogc3RhdGljIGludCBuZWVkX2FjdGl2ZV9iYWxhbmNlKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgaWRsZSwKIAkJCSAgICAgICBpbnQgYnVzaWVzdF9jcHUsIGludCB0aGlzX2NwdSkKQEAgLTQwMDQsNyArNDQ0OSw3IEBACiAJCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgZW51bSBjcHVfaWRsZV90eXBlIGlkbGUsCiAJCQlpbnQgKmJhbGFuY2UpCiB7Ci0JaW50IGxkX21vdmVkLCBhbGxfcGlubmVkID0gMCwgYWN0aXZlX2JhbGFuY2UgPSAwOworCWludCBsZF9tb3ZlZCwgbGJfZmxhZ3MgPSAwLCBhY3RpdmVfYmFsYW5jZSA9IDA7CiAJc3RydWN0IHNjaGVkX2dyb3VwICpncm91cDsKIAl1bnNpZ25lZCBsb25nIGltYmFsYW5jZTsKIAlzdHJ1Y3QgcnEgKmJ1c2llc3Q7CkBAIC00MDQ1LDExICs0NDkwLDExIEBACiAJCSAqIHN0aWxsIHVuYmFsYW5jZWQuIGxkX21vdmVkIHNpbXBseSBzdGF5cyB6ZXJvLCBzbyBpdCBpcwogCQkgKiBjb3JyZWN0bHkgdHJlYXRlZCBhcyBhbiBpbWJhbGFuY2UuCiAJCSAqLwotCQlhbGxfcGlubmVkID0gMTsKKwkJbGJfZmxhZ3MgfD0gTEJGX0FMTF9QSU5ORUQ7CiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJZG91YmxlX3JxX2xvY2sodGhpc19ycSwgYnVzaWVzdCk7CiAJCWxkX21vdmVkID0gbW92ZV90YXNrcyh0aGlzX3JxLCB0aGlzX2NwdSwgYnVzaWVzdCwKLQkJCQkgICAgICBpbWJhbGFuY2UsIHNkLCBpZGxlLCAmYWxsX3Bpbm5lZCk7CisJCQkJICAgICAgaW1iYWxhbmNlLCBzZCwgaWRsZSwgJmxiX2ZsYWdzKTsKIAkJZG91YmxlX3JxX3VubG9jayh0aGlzX3JxLCBidXNpZXN0KTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCkBAIC00MDU5LDggKzQ1MDQsMTYgQEAKIAkJaWYgKGxkX21vdmVkICYmIHRoaXNfY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkKIAkJCXJlc2NoZWRfY3B1KHRoaXNfY3B1KTsKIAorCQlpZiAobGJfZmxhZ3MgJiBMQkZfQUJPUlQpCisJCQlnb3RvIG91dF9iYWxhbmNlZDsKKworCQlpZiAobGJfZmxhZ3MgJiBMQkZfTkVFRF9CUkVBSykgeworCQkJbGJfZmxhZ3MgJj0gfkxCRl9ORUVEX0JSRUFLOworCQkJZ290byByZWRvOworCQl9CisKIAkJLyogQWxsIHRhc2tzIG9uIHRoaXMgcnVucXVldWUgd2VyZSBwaW5uZWQgYnkgQ1BVIGFmZmluaXR5ICovCi0JCWlmICh1bmxpa2VseShhbGxfcGlubmVkKSkgeworCQlpZiAodW5saWtlbHkobGJfZmxhZ3MgJiBMQkZfQUxMX1BJTk5FRCkpIHsKIAkJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdV9vZihidXNpZXN0KSwgY3B1cyk7CiAJCQlpZiAoIWNwdW1hc2tfZW1wdHkoY3B1cykpCiAJCQkJZ290byByZWRvOwpAQCAtNDA5MCw3ICs0NTQzLDcgQEAKIAkJCQkJdHNrX2NwdXNfYWxsb3dlZChidXNpZXN0LT5jdXJyKSkpIHsKIAkJCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYnVzaWVzdC0+bG9jaywKIAkJCQkJCQkgICAgZmxhZ3MpOwotCQkJCWFsbF9waW5uZWQgPSAxOworCQkJCWxiX2ZsYWdzIHw9IExCRl9BTExfUElOTkVEOwogCQkJCWdvdG8gb3V0X29uZV9waW5uZWQ7CiAJCQl9CiAKQEAgLTQxNDMsNyArNDU5Niw4IEBACiAKIG91dF9vbmVfcGlubmVkOgogCS8qIHR1bmUgdXAgdGhlIGJhbGFuY2luZyBpbnRlcnZhbCAqLwotCWlmICgoYWxsX3Bpbm5lZCAmJiBzZC0+YmFsYW5jZV9pbnRlcnZhbCA8IE1BWF9QSU5ORURfSU5URVJWQUwpIHx8CisJaWYgKCgobGJfZmxhZ3MgJiBMQkZfQUxMX1BJTk5FRCkgJiYKKwkJCXNkLT5iYWxhbmNlX2ludGVydmFsIDwgTUFYX1BJTk5FRF9JTlRFUlZBTCkgfHwKIAkJCShzZC0+YmFsYW5jZV9pbnRlcnZhbCA8IHNkLT5tYXhfaW50ZXJ2YWwpKQogCQlzZC0+YmFsYW5jZV9pbnRlcnZhbCAqPSAyOwogCkBAIC00MTU2LDcgKzQ2MTAsNyBAQAogICogaWRsZV9iYWxhbmNlIGlzIGNhbGxlZCBieSBzY2hlZHVsZSgpIGlmIHRoaXNfY3B1IGlzIGFib3V0IHRvIGJlY29tZQogICogaWRsZS4gQXR0ZW1wdHMgdG8gcHVsbCB0YXNrcyBmcm9tIG90aGVyIENQVXMuCiAgKi8KLXN0YXRpYyB2b2lkIGlkbGVfYmFsYW5jZShpbnQgdGhpc19jcHUsIHN0cnVjdCBycSAqdGhpc19ycSkKK3ZvaWQgaWRsZV9iYWxhbmNlKGludCB0aGlzX2NwdSwgc3RydWN0IHJxICp0aGlzX3JxKQogewogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwogCWludCBwdWxsZWRfdGFzayA9IDA7CkBAIC00MjcxLDI4ICs0NzI1LDE2IEBACiAjaWZkZWYgQ09ORklHX05PX0haCiAvKgogICogaWRsZSBsb2FkIGJhbGFuY2luZyBkZXRhaWxzCi0gKiAtIE9uZSBvZiB0aGUgaWRsZSBDUFVzIG5vbWluYXRlcyBpdHNlbGYgYXMgaWRsZSBsb2FkX2JhbGFuY2VyLCB3aGlsZQotICogICBlbnRlcmluZyBpZGxlLgotICogLSBUaGlzIGlkbGUgbG9hZCBiYWxhbmNlciBDUFUgd2lsbCBhbHNvIGdvIGludG8gdGlja2xlc3MgbW9kZSB3aGVuCi0gKiAgIGl0IGlzIGlkbGUsIGp1c3QgbGlrZSBhbGwgb3RoZXIgaWRsZSBDUFVzCiAgKiAtIFdoZW4gb25lIG9mIHRoZSBidXN5IENQVXMgbm90aWNlIHRoYXQgdGhlcmUgbWF5IGJlIGFuIGlkbGUgcmViYWxhbmNpbmcKICAqICAgbmVlZGVkLCB0aGV5IHdpbGwga2ljayB0aGUgaWRsZSBsb2FkIGJhbGFuY2VyLCB3aGljaCB0aGVuIGRvZXMgaWRsZQogICogICBsb2FkIGJhbGFuY2luZyBmb3IgYWxsIHRoZSBpZGxlIENQVXMuCiAgKi8KIHN0YXRpYyBzdHJ1Y3QgewotCWF0b21pY190IGxvYWRfYmFsYW5jZXI7Ci0JYXRvbWljX3QgZmlyc3RfcGlja19jcHU7Ci0JYXRvbWljX3Qgc2Vjb25kX3BpY2tfY3B1OwogCWNwdW1hc2tfdmFyX3QgaWRsZV9jcHVzX21hc2s7Ci0JY3B1bWFza192YXJfdCBncnBfaWRsZV9tYXNrOworCWF0b21pY190IG5yX2NwdXM7CiAJdW5zaWduZWQgbG9uZyBuZXh0X2JhbGFuY2U7ICAgICAvKiBpbiBqaWZmeSB1bml0cyAqLwogfSBub2h6IF9fX19jYWNoZWxpbmVfYWxpZ25lZDsKIAotaW50IGdldF9ub2h6X2xvYWRfYmFsYW5jZXIodm9pZCkKLXsKLQlyZXR1cm4gYXRvbWljX3JlYWQoJm5vaHoubG9hZF9iYWxhbmNlcik7Ci19Ci0KICNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9NQykgfHwgZGVmaW5lZChDT05GSUdfU0NIRURfU01UKQogLyoqCiAgKiBsb3dlc3RfZmxhZ19kb21haW4gLSBSZXR1cm4gbG93ZXN0IHNjaGVkX2RvbWFpbiBjb250YWluaW5nIGZsYWcuCkBAIC00MzI5LDMzICs0NzcxLDYgQEAKIAkJKHNkICYmIChzZC0+ZmxhZ3MgJiBmbGFnKSk7IHNkID0gc2QtPnBhcmVudCkKIAogLyoqCi0gKiBpc19zZW1pX2lkbGVfZ3JvdXAgLSBDaGVja3MgaWYgdGhlIGdpdmVuIHNjaGVkX2dyb3VwIGlzIHNlbWktaWRsZS4KLSAqIEBpbGJfZ3JvdXA6CWdyb3VwIHRvIGJlIGNoZWNrZWQgZm9yIHNlbWktaWRsZW5lc3MKLSAqCi0gKiBSZXR1cm5zOgkxIGlmIHRoZSBncm91cCBpcyBzZW1pLWlkbGUuIDAgb3RoZXJ3aXNlLgotICoKLSAqIFdlIGRlZmluZSBhIHNjaGVkX2dyb3VwIHRvIGJlIHNlbWkgaWRsZSBpZiBpdCBoYXMgYXRsZWFzdCBvbmUgaWRsZS1DUFUKLSAqIGFuZCBhdGxlYXN0IG9uZSBub24taWRsZSBDUFUuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgZ2l2ZW4KLSAqIHNjaGVkX2dyb3VwIGlzIHNlbWktaWRsZSBvciBub3QuCi0gKi8KLXN0YXRpYyBpbmxpbmUgaW50IGlzX3NlbWlfaWRsZV9ncm91cChzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmlsYl9ncm91cCkKLXsKLQljcHVtYXNrX2FuZChub2h6LmdycF9pZGxlX21hc2ssIG5vaHouaWRsZV9jcHVzX21hc2ssCi0JCQkJCXNjaGVkX2dyb3VwX2NwdXMoaWxiX2dyb3VwKSk7Ci0KLQkvKgotCSAqIEEgc2NoZWRfZ3JvdXAgaXMgc2VtaS1pZGxlIHdoZW4gaXQgaGFzIGF0bGVhc3Qgb25lIGJ1c3kgY3B1Ci0JICogYW5kIGF0bGVhc3Qgb25lIGlkbGUgY3B1LgotCSAqLwotCWlmIChjcHVtYXNrX2VtcHR5KG5vaHouZ3JwX2lkbGVfbWFzaykpCi0JCXJldHVybiAwOwotCi0JaWYgKGNwdW1hc2tfZXF1YWwobm9oei5ncnBfaWRsZV9tYXNrLCBzY2hlZF9ncm91cF9jcHVzKGlsYl9ncm91cCkpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotLyoqCiAgKiBmaW5kX25ld19pbGIgLSBGaW5kcyB0aGUgb3B0aW11bSBpZGxlIGxvYWQgYmFsYW5jZXIgZm9yIG5vbWluYXRpb24uCiAgKiBAY3B1OglUaGUgY3B1IHdoaWNoIGlzIG5vbWluYXRpbmcgYSBuZXcgaWRsZV9sb2FkX2JhbGFuY2VyLgogICoKQEAgLTQzNjksOSArNDc4NCw5IEBACiAgKi8KIHN0YXRpYyBpbnQgZmluZF9uZXdfaWxiKGludCBjcHUpCiB7CisJaW50IGlsYiA9IGNwdW1hc2tfZmlyc3Qobm9oei5pZGxlX2NwdXNfbWFzayk7CisJc3RydWN0IHNjaGVkX2dyb3VwICppbGJnOwogCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwotCXN0cnVjdCBzY2hlZF9ncm91cCAqaWxiX2dyb3VwOwotCWludCBpbGIgPSBucl9jcHVfaWRzOwogCiAJLyoKIAkgKiBIYXZlIGlkbGUgbG9hZCBiYWxhbmNlciBzZWxlY3Rpb24gZnJvbSBzZW1pLWlkbGUgcGFja2FnZXMgb25seQpAQCAtNDM4OSwyMyArNDgwNCwyOCBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWZvcl9lYWNoX2ZsYWdfZG9tYWluKGNwdSwgc2QsIFNEX1BPV0VSU0FWSU5HU19CQUxBTkNFKSB7Ci0JCWlsYl9ncm91cCA9IHNkLT5ncm91cHM7CisJCWlsYmcgPSBzZC0+Z3JvdXBzOwogCiAJCWRvIHsKLQkJCWlmIChpc19zZW1pX2lkbGVfZ3JvdXAoaWxiX2dyb3VwKSkgewotCQkJCWlsYiA9IGNwdW1hc2tfZmlyc3Qobm9oei5ncnBfaWRsZV9tYXNrKTsKKwkJCWlmIChpbGJnLT5ncm91cF93ZWlnaHQgIT0KKwkJCQlhdG9taWNfcmVhZCgmaWxiZy0+c2dwLT5ucl9idXN5X2NwdXMpKSB7CisJCQkJaWxiID0gY3B1bWFza19maXJzdF9hbmQobm9oei5pZGxlX2NwdXNfbWFzaywKKwkJCQkJCQlzY2hlZF9ncm91cF9jcHVzKGlsYmcpKTsKIAkJCQlnb3RvIHVubG9jazsKIAkJCX0KIAotCQkJaWxiX2dyb3VwID0gaWxiX2dyb3VwLT5uZXh0OworCQkJaWxiZyA9IGlsYmctPm5leHQ7CiAKLQkJfSB3aGlsZSAoaWxiX2dyb3VwICE9IHNkLT5ncm91cHMpOworCQl9IHdoaWxlIChpbGJnICE9IHNkLT5ncm91cHMpOwogCX0KIHVubG9jazoKIAlyY3VfcmVhZF91bmxvY2soKTsKIAogb3V0X2RvbmU6Ci0JcmV0dXJuIGlsYjsKKwlpZiAoaWxiIDwgbnJfY3B1X2lkcyAmJiBpZGxlX2NwdShpbGIpKQorCQlyZXR1cm4gaWxiOworCisJcmV0dXJuIG5yX2NwdV9pZHM7CiB9CiAjZWxzZSAvKiAgKENPTkZJR19TQ0hFRF9NQyB8fCBDT05GSUdfU0NIRURfU01UKSAqLwogc3RhdGljIGlubGluZSBpbnQgZmluZF9uZXdfaWxiKGludCBjYWxsX2NwdSkKQEAgLTQ0MjUsOTkgKzQ4NDUsNjggQEAKIAogCW5vaHoubmV4dF9iYWxhbmNlKys7CiAKLQlpbGJfY3B1ID0gZ2V0X25vaHpfbG9hZF9iYWxhbmNlcigpOworCWlsYl9jcHUgPSBmaW5kX25ld19pbGIoY3B1KTsKIAotCWlmIChpbGJfY3B1ID49IG5yX2NwdV9pZHMpIHsKLQkJaWxiX2NwdSA9IGNwdW1hc2tfZmlyc3Qobm9oei5pZGxlX2NwdXNfbWFzayk7Ci0JCWlmIChpbGJfY3B1ID49IG5yX2NwdV9pZHMpCi0JCQlyZXR1cm47Ci0JfQorCWlmIChpbGJfY3B1ID49IG5yX2NwdV9pZHMpCisJCXJldHVybjsKIAotCWlmICghY3B1X3JxKGlsYl9jcHUpLT5ub2h6X2JhbGFuY2Vfa2ljaykgewotCQljcHVfcnEoaWxiX2NwdSktPm5vaHpfYmFsYW5jZV9raWNrID0gMTsKLQotCQlzbXBfbWIoKTsKLQkJLyoKLQkJICogVXNlIHNtcF9zZW5kX3Jlc2NoZWR1bGUoKSBpbnN0ZWFkIG9mIHJlc2NoZWRfY3B1KCkuCi0JCSAqIFRoaXMgd2F5IHdlIGdlbmVyYXRlIGEgc2NoZWQgSVBJIG9uIHRoZSB0YXJnZXQgY3B1IHdoaWNoCi0JCSAqIGlzIGlkbGUuIEFuZCB0aGUgc29mdGlycSBwZXJmb3JtaW5nIG5vaHogaWRsZSBsb2FkIGJhbGFuY2UKLQkJICogd2lsbCBiZSBydW4gYmVmb3JlIHJldHVybmluZyBmcm9tIHRoZSBJUEkuCi0JCSAqLwotCQlzbXBfc2VuZF9yZXNjaGVkdWxlKGlsYl9jcHUpOwotCX0KKwlpZiAodGVzdF9hbmRfc2V0X2JpdChOT0haX0JBTEFOQ0VfS0lDSywgbm9oel9mbGFncyhpbGJfY3B1KSkpCisJCXJldHVybjsKKwkvKgorCSAqIFVzZSBzbXBfc2VuZF9yZXNjaGVkdWxlKCkgaW5zdGVhZCBvZiByZXNjaGVkX2NwdSgpLgorCSAqIFRoaXMgd2F5IHdlIGdlbmVyYXRlIGEgc2NoZWQgSVBJIG9uIHRoZSB0YXJnZXQgY3B1IHdoaWNoCisJICogaXMgaWRsZS4gQW5kIHRoZSBzb2Z0aXJxIHBlcmZvcm1pbmcgbm9oeiBpZGxlIGxvYWQgYmFsYW5jZQorCSAqIHdpbGwgYmUgcnVuIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGUgSVBJLgorCSAqLworCXNtcF9zZW5kX3Jlc2NoZWR1bGUoaWxiX2NwdSk7CiAJcmV0dXJuOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdV9zZF9zdGF0ZV9idXN5KHZvaWQpCit7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKworCWlmICghdGVzdF9iaXQoTk9IWl9JRExFLCBub2h6X2ZsYWdzKGNwdSkpKQorCQlyZXR1cm47CisJY2xlYXJfYml0KE5PSFpfSURMRSwgbm9oel9mbGFncyhjcHUpKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlmb3JfZWFjaF9kb21haW4oY3B1LCBzZCkKKwkJYXRvbWljX2luYygmc2QtPmdyb3Vwcy0+c2dwLT5ucl9idXN5X2NwdXMpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCit2b2lkIHNldF9jcHVfc2Rfc3RhdGVfaWRsZSh2b2lkKQoreworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAodGVzdF9iaXQoTk9IWl9JRExFLCBub2h6X2ZsYWdzKGNwdSkpKQorCQlyZXR1cm47CisJc2V0X2JpdChOT0haX0lETEUsIG5vaHpfZmxhZ3MoY3B1KSk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpCisJCWF0b21pY19kZWMoJnNkLT5ncm91cHMtPnNncC0+bnJfYnVzeV9jcHVzKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKwogLyoKLSAqIFRoaXMgcm91dGluZSB3aWxsIHRyeSB0byBub21pbmF0ZSB0aGUgaWxiIChpZGxlIGxvYWQgYmFsYW5jaW5nKQotICogb3duZXIgYW1vbmcgdGhlIGNwdXMgd2hvc2UgdGlja3MgYXJlIHN0b3BwZWQuIGlsYiBvd25lciB3aWxsIGRvIHRoZSBpZGxlCi0gKiBsb2FkIGJhbGFuY2luZyBvbiBiZWhhbGYgb2YgYWxsIHRob3NlIGNwdXMuCi0gKgotICogV2hlbiB0aGUgaWxiIG93bmVyIGJlY29tZXMgYnVzeSwgd2Ugd2lsbCBub3QgaGF2ZSBuZXcgaWxiIG93bmVyIHVudGlsIHNvbWUKLSAqIGlkbGUgQ1BVIHdha2VzIHVwIGFuZCBnb2VzIGJhY2sgdG8gaWRsZSBvciBzb21lIGJ1c3kgQ1BVIHRyaWVzIHRvIGtpY2sKLSAqIGlkbGUgbG9hZCBiYWxhbmNpbmcgYnkga2lja2luZyBvbmUgb2YgdGhlIGlkbGUgQ1BVcy4KLSAqCi0gKiBUaWNrcyBhcmUgc3RvcHBlZCBmb3IgdGhlIGlsYiBvd25lciBhcyB3ZWxsLCB3aXRoIGJ1c3kgQ1BVIGtpY2tpbmcgdGhpcwotICogaWxiIG93bmVyIENQVSBpbiBmdXR1cmUgKHdoZW4gdGhlcmUgaXMgYSBuZWVkIGZvciBpZGxlIGxvYWQgYmFsYW5jaW5nIG9uCi0gKiBiZWhhbGYgb2YgYWxsIGlkbGUgQ1BVcykuCisgKiBUaGlzIHJvdXRpbmUgd2lsbCByZWNvcmQgdGhhdCB0aGlzIGNwdSBpcyBnb2luZyBpZGxlIHdpdGggdGljayBzdG9wcGVkLgorICogVGhpcyBpbmZvIHdpbGwgYmUgdXNlZCBpbiBwZXJmb3JtaW5nIGlkbGUgbG9hZCBiYWxhbmNpbmcgaW4gdGhlIGZ1dHVyZS4KICAqLwogdm9pZCBzZWxlY3Rfbm9oel9sb2FkX2JhbGFuY2VyKGludCBzdG9wX3RpY2spCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAogCWlmIChzdG9wX3RpY2spIHsKLQkJaWYgKCFjcHVfYWN0aXZlKGNwdSkpIHsKLQkJCWlmIChhdG9taWNfcmVhZCgmbm9oei5sb2FkX2JhbGFuY2VyKSAhPSBjcHUpCi0JCQkJcmV0dXJuOwotCi0JCQkvKgotCQkJICogSWYgd2UgYXJlIGdvaW5nIG9mZmxpbmUgYW5kIHN0aWxsIHRoZSBsZWFkZXIsCi0JCQkgKiBnaXZlIHVwIQotCQkJICovCi0JCQlpZiAoYXRvbWljX2NtcHhjaGcoJm5vaHoubG9hZF9iYWxhbmNlciwgY3B1LAotCQkJCQkgICBucl9jcHVfaWRzKSAhPSBjcHUpCi0JCQkJQlVHKCk7Ci0KKwkJaWYgKHRlc3RfYml0KE5PSFpfVElDS19TVE9QUEVELCBub2h6X2ZsYWdzKGNwdSkpKQogCQkJcmV0dXJuOwotCQl9CiAKIAkJY3B1bWFza19zZXRfY3B1KGNwdSwgbm9oei5pZGxlX2NwdXNfbWFzayk7Ci0KLQkJaWYgKGF0b21pY19yZWFkKCZub2h6LmZpcnN0X3BpY2tfY3B1KSA9PSBjcHUpCi0JCQlhdG9taWNfY21weGNoZygmbm9oei5maXJzdF9waWNrX2NwdSwgY3B1LCBucl9jcHVfaWRzKTsKLQkJaWYgKGF0b21pY19yZWFkKCZub2h6LnNlY29uZF9waWNrX2NwdSkgPT0gY3B1KQotCQkJYXRvbWljX2NtcHhjaGcoJm5vaHouc2Vjb25kX3BpY2tfY3B1LCBjcHUsIG5yX2NwdV9pZHMpOwotCi0JCWlmIChhdG9taWNfcmVhZCgmbm9oei5sb2FkX2JhbGFuY2VyKSA+PSBucl9jcHVfaWRzKSB7Ci0JCQlpbnQgbmV3X2lsYjsKLQotCQkJLyogbWFrZSBtZSB0aGUgaWxiIG93bmVyICovCi0JCQlpZiAoYXRvbWljX2NtcHhjaGcoJm5vaHoubG9hZF9iYWxhbmNlciwgbnJfY3B1X2lkcywKLQkJCQkJICAgY3B1KSAhPSBucl9jcHVfaWRzKQotCQkJCXJldHVybjsKLQotCQkJLyoKLQkJCSAqIENoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG1vcmUgcG93ZXItZWZmaWNpZW50Ci0JCQkgKiBpbGIuCi0JCQkgKi8KLQkJCW5ld19pbGIgPSBmaW5kX25ld19pbGIoY3B1KTsKLQkJCWlmIChuZXdfaWxiIDwgbnJfY3B1X2lkcyAmJiBuZXdfaWxiICE9IGNwdSkgewotCQkJCWF0b21pY19zZXQoJm5vaHoubG9hZF9iYWxhbmNlciwgbnJfY3B1X2lkcyk7Ci0JCQkJcmVzY2hlZF9jcHUobmV3X2lsYik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgbm9oei5pZGxlX2NwdXNfbWFzaykpCi0JCQlyZXR1cm47Ci0KLQkJY3B1bWFza19jbGVhcl9jcHUoY3B1LCBub2h6LmlkbGVfY3B1c19tYXNrKTsKLQotCQlpZiAoYXRvbWljX3JlYWQoJm5vaHoubG9hZF9iYWxhbmNlcikgPT0gY3B1KQotCQkJaWYgKGF0b21pY19jbXB4Y2hnKCZub2h6LmxvYWRfYmFsYW5jZXIsIGNwdSwKLQkJCQkJICAgbnJfY3B1X2lkcykgIT0gY3B1KQotCQkJCUJVRygpOworCQlhdG9taWNfaW5jKCZub2h6Lm5yX2NwdXMpOworCQlzZXRfYml0KE5PSFpfVElDS19TVE9QUEVELCBub2h6X2ZsYWdzKGNwdSkpOwogCX0KIAlyZXR1cm47CiB9CkBAIC00NTMxLDcgKzQ5MjAsNyBAQAogICogU2NhbGUgdGhlIG1heCBsb2FkX2JhbGFuY2UgaW50ZXJ2YWwgd2l0aCB0aGUgbnVtYmVyIG9mIENQVXMgaW4gdGhlIHN5c3RlbS4KICAqIFRoaXMgdHJhZGVzIGxvYWQtYmFsYW5jZSBsYXRlbmN5IG9uIGxhcmdlciBtYWNoaW5lcyBmb3IgbGVzcyBjcm9zcyB0YWxrLgogICovCi1zdGF0aWMgdm9pZCB1cGRhdGVfbWF4X2ludGVydmFsKHZvaWQpCit2b2lkIHVwZGF0ZV9tYXhfaW50ZXJ2YWwodm9pZCkKIHsKIAltYXhfbG9hZF9iYWxhbmNlX2ludGVydmFsID0gSFoqbnVtX29ubGluZV9jcHVzKCkvMTA7CiB9CkBAIC00NjIzLDExICs1MDEyLDEyIEBACiAJc3RydWN0IHJxICpycTsKIAlpbnQgYmFsYW5jZV9jcHU7CiAKLQlpZiAoaWRsZSAhPSBDUFVfSURMRSB8fCAhdGhpc19ycS0+bm9oel9iYWxhbmNlX2tpY2spCi0JCXJldHVybjsKKwlpZiAoaWRsZSAhPSBDUFVfSURMRSB8fAorCSAgICAhdGVzdF9iaXQoTk9IWl9CQUxBTkNFX0tJQ0ssIG5vaHpfZmxhZ3ModGhpc19jcHUpKSkKKwkJZ290byBlbmQ7CiAKIAlmb3JfZWFjaF9jcHUoYmFsYW5jZV9jcHUsIG5vaHouaWRsZV9jcHVzX21hc2spIHsKLQkJaWYgKGJhbGFuY2VfY3B1ID09IHRoaXNfY3B1KQorCQlpZiAoYmFsYW5jZV9jcHUgPT0gdGhpc19jcHUgfHwgIWlkbGVfY3B1KGJhbGFuY2VfY3B1KSkKIAkJCWNvbnRpbnVlOwogCiAJCS8qCkBAIC00NjM1LDEwICs1MDI1LDggQEAKIAkJICogd29yayBiZWluZyBkb25lIGZvciBvdGhlciBjcHVzLiBOZXh0IGxvYWQKIAkJICogYmFsYW5jaW5nIG93bmVyIHdpbGwgcGljayBpdCB1cC4KIAkJICovCi0JCWlmIChuZWVkX3Jlc2NoZWQoKSkgewotCQkJdGhpc19ycS0+bm9oel9iYWxhbmNlX2tpY2sgPSAwOworCQlpZiAobmVlZF9yZXNjaGVkKCkpCiAJCQlicmVhazsKLQkJfQogCiAJCXJhd19zcGluX2xvY2tfaXJxKCZ0aGlzX3JxLT5sb2NrKTsKIAkJdXBkYXRlX3JxX2Nsb2NrKHRoaXNfcnEpOwpAQCAtNDY1Miw1MyArNTA0MCw3NSBAQAogCQkJdGhpc19ycS0+bmV4dF9iYWxhbmNlID0gcnEtPm5leHRfYmFsYW5jZTsKIAl9CiAJbm9oei5uZXh0X2JhbGFuY2UgPSB0aGlzX3JxLT5uZXh0X2JhbGFuY2U7Ci0JdGhpc19ycS0+bm9oel9iYWxhbmNlX2tpY2sgPSAwOworZW5kOgorCWNsZWFyX2JpdChOT0haX0JBTEFOQ0VfS0lDSywgbm9oel9mbGFncyh0aGlzX2NwdSkpOwogfQogCiAvKgotICogQ3VycmVudCBoZXVyaXN0aWMgZm9yIGtpY2tpbmcgdGhlIGlkbGUgbG9hZCBiYWxhbmNlcgotICogLSBmaXJzdF9waWNrX2NwdSBpcyB0aGUgb25lIG9mIHRoZSBidXN5IENQVXMuIEl0IHdpbGwga2ljawotICogICBpZGxlIGxvYWQgYmFsYW5jZXIgd2hlbiBpdCBoYXMgbW9yZSB0aGFuIG9uZSBwcm9jZXNzIGFjdGl2ZS4gVGhpcwotICogICBlbGltaW5hdGVzIHRoZSBuZWVkIGZvciBpZGxlIGxvYWQgYmFsYW5jaW5nIGFsdG9nZXRoZXIgd2hlbiB3ZSBoYXZlCi0gKiAgIG9ubHkgb25lIHJ1bm5pbmcgcHJvY2VzcyBpbiB0aGUgc3lzdGVtIChjb21tb24gY2FzZSkuCi0gKiAtIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIGJ1c3kgQ1BVLCBpZGxlIGxvYWQgYmFsYW5jZXIgbWF5IGhhdmUKLSAqICAgdG8gcnVuIGZvciBhY3RpdmVfbG9hZF9iYWxhbmNlIHRvIGhhcHBlbiAoaS5lLiwgdHdvIGJ1c3kgQ1BVcyBhcmUKLSAqICAgU01UIG9yIGNvcmUgc2libGluZ3MgYW5kIGNhbiBydW4gYmV0dGVyIGlmIHRoZXkgbW92ZSB0byBkaWZmZXJlbnQKLSAqICAgcGh5c2ljYWwgQ1BVcykuIFNvLCBzZWNvbmRfcGlja19jcHUgaXMgdGhlIHNlY29uZCBvZiB0aGUgYnVzeSBDUFVzCi0gKiAgIHdoaWNoIHdpbGwga2ljayBpZGxlIGxvYWQgYmFsYW5jZXIgYXMgc29vbiBhcyBpdCBoYXMgYW55IGxvYWQuCisgKiBDdXJyZW50IGhldXJpc3RpYyBmb3Iga2lja2luZyB0aGUgaWRsZSBsb2FkIGJhbGFuY2VyIGluIHRoZSBwcmVzZW5jZQorICogb2YgYW4gaWRsZSBjcHUgaXMgdGhlIHN5c3RlbS4KKyAqICAgLSBUaGlzIHJxIGhhcyBtb3JlIHRoYW4gb25lIHRhc2suCisgKiAgIC0gQXQgYW55IHNjaGVkdWxlciBkb21haW4gbGV2ZWwsIHRoaXMgY3B1J3Mgc2NoZWR1bGVyIGdyb3VwIGhhcyBtdWx0aXBsZQorICogICAgIGJ1c3kgY3B1J3MgZXhjZWVkaW5nIHRoZSBncm91cCdzIHBvd2VyLgorICogICAtIEZvciBTRF9BU1lNX1BBQ0tJTkcsIGlmIHRoZSBsb3dlciBudW1iZXJlZCBjcHUncyBpbiB0aGUgc2NoZWR1bGVyCisgKiAgICAgZG9tYWluIHNwYW4gYXJlIGlkbGUuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IG5vaHpfa2lja19uZWVkZWQoc3RydWN0IHJxICpycSwgaW50IGNwdSkKIHsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7Ci0JaW50IHJldDsKLQlpbnQgZmlyc3RfcGlja19jcHUsIHNlY29uZF9waWNrX2NwdTsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKworCWlmICh1bmxpa2VseShpZGxlX2NwdShjcHUpKSkKKwkJcmV0dXJuIDA7CisKKyAgICAgICAvKgorCSogV2UgbWF5IGJlIHJlY2VudGx5IGluIHRpY2tlZCBvciB0aWNrbGVzcyBpZGxlIG1vZGUuIEF0IHRoZSBmaXJzdAorCSogYnVzeSB0aWNrIGFmdGVyIHJldHVybmluZyBmcm9tIGlkbGUsIHdlIHdpbGwgdXBkYXRlIHRoZSBidXN5IHN0YXRzLgorCSovCisJc2V0X2NwdV9zZF9zdGF0ZV9idXN5KCk7CisJaWYgKHVubGlrZWx5KHRlc3RfYml0KE5PSFpfVElDS19TVE9QUEVELCBub2h6X2ZsYWdzKGNwdSkpKSkgeworCQljbGVhcl9iaXQoTk9IWl9USUNLX1NUT1BQRUQsIG5vaHpfZmxhZ3MoY3B1KSk7CisJCWNwdW1hc2tfY2xlYXJfY3B1KGNwdSwgbm9oei5pZGxlX2NwdXNfbWFzayk7CisJCWF0b21pY19kZWMoJm5vaHoubnJfY3B1cyk7CisJfQorCisJLyoKKwkgKiBOb25lIGFyZSBpbiB0aWNrbGVzcyBtb2RlIGFuZCBoZW5jZSBubyBuZWVkIGZvciBOT0haIGlkbGUgbG9hZAorCSAqIGJhbGFuY2luZy4KKwkgKi8KKwlpZiAobGlrZWx5KCFhdG9taWNfcmVhZCgmbm9oei5ucl9jcHVzKSkpCisJCXJldHVybiAwOwogCiAJaWYgKHRpbWVfYmVmb3JlKG5vdywgbm9oei5uZXh0X2JhbGFuY2UpKQogCQlyZXR1cm4gMDsKIAotCWlmIChpZGxlX2NwdShjcHUpKQotCQlyZXR1cm4gMDsKKwlpZiAocnEtPm5yX3J1bm5pbmcgPj0gMikKKwkJZ290byBuZWVkX2tpY2s7CiAKLQlmaXJzdF9waWNrX2NwdSA9IGF0b21pY19yZWFkKCZub2h6LmZpcnN0X3BpY2tfY3B1KTsKLQlzZWNvbmRfcGlja19jcHUgPSBhdG9taWNfcmVhZCgmbm9oei5zZWNvbmRfcGlja19jcHUpOworCXJjdV9yZWFkX2xvY2soKTsKKwlmb3JfZWFjaF9kb21haW4oY3B1LCBzZCkgeworCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnID0gc2QtPmdyb3VwczsKKwkJc3RydWN0IHNjaGVkX2dyb3VwX3Bvd2VyICpzZ3AgPSBzZy0+c2dwOworCQlpbnQgbnJfYnVzeSA9IGF0b21pY19yZWFkKCZzZ3AtPm5yX2J1c3lfY3B1cyk7CiAKLQlpZiAoZmlyc3RfcGlja19jcHUgPCBucl9jcHVfaWRzICYmIGZpcnN0X3BpY2tfY3B1ICE9IGNwdSAmJgotCSAgICBzZWNvbmRfcGlja19jcHUgPCBucl9jcHVfaWRzICYmIHNlY29uZF9waWNrX2NwdSAhPSBjcHUpCi0JCXJldHVybiAwOworCQlpZiAoc2QtPmZsYWdzICYgU0RfU0hBUkVfUEtHX1JFU09VUkNFUyAmJiBucl9idXN5ID4gMSkKKwkJCWdvdG8gbmVlZF9raWNrX3VubG9jazsKIAotCXJldCA9IGF0b21pY19jbXB4Y2hnKCZub2h6LmZpcnN0X3BpY2tfY3B1LCBucl9jcHVfaWRzLCBjcHUpOwotCWlmIChyZXQgPT0gbnJfY3B1X2lkcyB8fCByZXQgPT0gY3B1KSB7Ci0JCWF0b21pY19jbXB4Y2hnKCZub2h6LnNlY29uZF9waWNrX2NwdSwgY3B1LCBucl9jcHVfaWRzKTsKLQkJaWYgKHJxLT5ucl9ydW5uaW5nID4gMSkKLQkJCXJldHVybiAxOwotCX0gZWxzZSB7Ci0JCXJldCA9IGF0b21pY19jbXB4Y2hnKCZub2h6LnNlY29uZF9waWNrX2NwdSwgbnJfY3B1X2lkcywgY3B1KTsKLQkJaWYgKHJldCA9PSBucl9jcHVfaWRzIHx8IHJldCA9PSBjcHUpIHsKLQkJCWlmIChycS0+bnJfcnVubmluZykKLQkJCQlyZXR1cm4gMTsKLQkJfQorCQlpZiAoc2QtPmZsYWdzICYgU0RfQVNZTV9QQUNLSU5HICYmIG5yX2J1c3kgIT0gc2ctPmdyb3VwX3dlaWdodAorCQkgICAgJiYgKGNwdW1hc2tfZmlyc3RfYW5kKG5vaHouaWRsZV9jcHVzX21hc2ssCisJCQkJCSAgc2NoZWRfZG9tYWluX3NwYW4oc2QpKSA8IGNwdSkpCisJCQlnb3RvIG5lZWRfa2lja191bmxvY2s7CisKKwkJaWYgKCEoc2QtPmZsYWdzICYgKFNEX1NIQVJFX1BLR19SRVNPVVJDRVMgfCBTRF9BU1lNX1BBQ0tJTkcpKSkKKwkJCWJyZWFrOwogCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gMDsKKworbmVlZF9raWNrX3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKK25lZWRfa2ljazoKKwlyZXR1cm4gMTsKIH0KICNlbHNlCiBzdGF0aWMgdm9pZCBub2h6X2lkbGVfYmFsYW5jZShpbnQgdGhpc19jcHUsIGVudW0gY3B1X2lkbGVfdHlwZSBpZGxlKSB7IH0KQEAgLTQ3MzMsMTQgKzUxNDMsMTQgQEAKIC8qCiAgKiBUcmlnZ2VyIHRoZSBTQ0hFRF9TT0ZUSVJRIGlmIGl0IGlzIHRpbWUgdG8gZG8gcGVyaW9kaWMgbG9hZCBiYWxhbmNpbmcuCiAgKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCB0cmlnZ2VyX2xvYWRfYmFsYW5jZShzdHJ1Y3QgcnEgKnJxLCBpbnQgY3B1KQordm9pZCB0cmlnZ2VyX2xvYWRfYmFsYW5jZShzdHJ1Y3QgcnEgKnJxLCBpbnQgY3B1KQogewogCS8qIERvbid0IG5lZWQgdG8gcmViYWxhbmNlIHdoaWxlIGF0dGFjaGVkIHRvIE5VTEwgZG9tYWluICovCiAJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgcnEtPm5leHRfYmFsYW5jZSkgJiYKIAkgICAgbGlrZWx5KCFvbl9udWxsX2RvbWFpbihjcHUpKSkKIAkJcmFpc2Vfc29mdGlycShTQ0hFRF9TT0ZUSVJRKTsKICNpZmRlZiBDT05GSUdfTk9fSFoKLQllbHNlIGlmIChub2h6X2tpY2tfbmVlZGVkKHJxLCBjcHUpICYmIGxpa2VseSghb25fbnVsbF9kb21haW4oY3B1KSkpCisJaWYgKG5vaHpfa2lja19uZWVkZWQocnEsIGNwdSkgJiYgbGlrZWx5KCFvbl9udWxsX2RvbWFpbihjcHUpKSkKIAkJbm9oel9iYWxhbmNlcl9raWNrKGNwdSk7CiAjZW5kaWYKIH0KQEAgLTQ3NTUsMTUgKzUxNjUsNiBAQAogCXVwZGF0ZV9zeXNjdGwoKTsKIH0KIAotI2Vsc2UJLyogQ09ORklHX1NNUCAqLwotCi0vKgotICogb24gVVAgd2UgZG8gbm90IG5lZWQgdG8gYmFsYW5jZSBiZXR3ZWVuIENQVXM6Ci0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBpZGxlX2JhbGFuY2UoaW50IGNwdSwgc3RydWN0IHJxICpycSkKLXsKLX0KLQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIAogLyoKQEAgLTQ3ODcsOCArNTE4OCw4IEBACiAgKi8KIHN0YXRpYyB2b2lkIHRhc2tfZm9ya19mYWlyKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEgPSB0YXNrX2Nmc19ycShjdXJyZW50KTsKLQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpzZSA9ICZwLT5zZSwgKmN1cnIgPSBjZnNfcnEtPmN1cnI7CisJc3RydWN0IGNmc19ycSAqY2ZzX3JxOworCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlID0gJnAtPnNlLCAqY3VycjsKIAlpbnQgdGhpc19jcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IHJxICpycSA9IHRoaXNfcnEoKTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtNDc5Nyw2ICs1MTk4LDkgQEAKIAogCXVwZGF0ZV9ycV9jbG9jayhycSk7CiAKKwljZnNfcnEgPSB0YXNrX2Nmc19ycShjdXJyZW50KTsKKwljdXJyID0gY2ZzX3JxLT5jdXJyOworCiAJaWYgKHVubGlrZWx5KHRhc2tfY3B1KHApICE9IHRoaXNfY3B1KSkgewogCQlyY3VfcmVhZF9sb2NrKCk7CiAJCV9fc2V0X3Rhc2tfY3B1KHAsIHRoaXNfY3B1KTsKQEAgLTQ5MDYsNiArNTMxMCwxNiBAQAogCX0KIH0KIAordm9pZCBpbml0X2Nmc19ycShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpCit7CisJY2ZzX3JxLT50YXNrc190aW1lbGluZSA9IFJCX1JPT1Q7CisJSU5JVF9MSVNUX0hFQUQoJmNmc19ycS0+dGFza3MpOworCWNmc19ycS0+bWluX3ZydW50aW1lID0gKHU2NCkoLSgxTEwgPDwgMjApKTsKKyNpZm5kZWYgQ09ORklHXzY0QklUCisJY2ZzX3JxLT5taW5fdnJ1bnRpbWVfY29weSA9IGNmc19ycS0+bWluX3ZydW50aW1lOworI2VuZGlmCit9CisKICNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAogc3RhdGljIHZvaWQgdGFza19tb3ZlX2dyb3VwX2ZhaXIoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgb25fcnEpCiB7CkBAIC00OTIyLDEzICs1MzM2LDE4MiBAQAogCSAqIHRvIGFub3RoZXIgY2dyb3VwJ3MgcnEuIFRoaXMgZG9lcyBzb21ld2hhdCBpbnRlcmZlcmUgd2l0aCB0aGUKIAkgKiBmYWlyIHNsZWVwZXIgc3R1ZmYgZm9yIHRoZSBmaXJzdCBwbGFjZW1lbnQsIGJ1dCB3aG8gY2FyZXMuCiAJICovCisJLyoKKwkgKiBXaGVuICFvbl9ycSwgdnJ1bnRpbWUgb2YgdGhlIHRhc2sgaGFzIHVzdWFsbHkgTk9UIGJlZW4gbm9ybWFsaXplZC4KKwkgKiBCdXQgdGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUgaXQgaGFzIGFscmVhZHkgYmVlbiBub3JtYWxpemVkOgorCSAqCisJICogLSBNb3ZpbmcgYSBmb3JrZWQgY2hpbGQgd2hpY2ggaXMgd2FpdGluZyBmb3IgYmVpbmcgd29rZW4gdXAgYnkKKwkgKiAgIHdha2VfdXBfbmV3X3Rhc2soKS4KKwkgKiAtIE1vdmluZyBhIHRhc2sgd2hpY2ggaGFzIGJlZW4gd29rZW4gdXAgYnkgdHJ5X3RvX3dha2VfdXAoKSBhbmQKKwkgKiAgIHdhaXRpbmcgZm9yIGFjdHVhbGx5IGJlaW5nIHdva2VuIHVwIGJ5IHNjaGVkX3R0d3VfcGVuZGluZygpLgorCSAqCisJICogVG8gcHJldmVudCBib29zdCBvciBwZW5hbHR5IGluIHRoZSBuZXcgY2ZzX3JxIGNhdXNlZCBieSBkZWx0YQorCSAqIG1pbl92cnVudGltZSBiZXR3ZWVuIHRoZSB0d28gY2ZzX3Jxcywgd2Ugc2tpcCB2cnVudGltZSBhZGp1c3RtZW50LgorCSAqLworCWlmICghb25fcnEgJiYgKCFwLT5zZS5zdW1fZXhlY19ydW50aW1lIHx8IHAtPnN0YXRlID09IFRBU0tfV0FLSU5HKSkKKwkJb25fcnEgPSAxOworCiAJaWYgKCFvbl9ycSkKIAkJcC0+c2UudnJ1bnRpbWUgLT0gY2ZzX3JxX29mKCZwLT5zZSktPm1pbl92cnVudGltZTsKIAlzZXRfdGFza19ycShwLCB0YXNrX2NwdShwKSk7CiAJaWYgKCFvbl9ycSkKIAkJcC0+c2UudnJ1bnRpbWUgKz0gY2ZzX3JxX29mKCZwLT5zZSktPm1pbl92cnVudGltZTsKIH0KKwordm9pZCBmcmVlX2ZhaXJfc2NoZWRfZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnKQoreworCWludCBpOworCisJZGVzdHJveV9jZnNfYmFuZHdpZHRoKHRnX2Nmc19iYW5kd2lkdGgodGcpKTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCWlmICh0Zy0+Y2ZzX3JxKQorCQkJa2ZyZWUodGctPmNmc19ycVtpXSk7CisJCWlmICh0Zy0+c2UpCisJCQlrZnJlZSh0Zy0+c2VbaV0pOworCX0KKworCWtmcmVlKHRnLT5jZnNfcnEpOworCWtmcmVlKHRnLT5zZSk7Cit9CisKK2ludCBhbGxvY19mYWlyX3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3RydWN0IHRhc2tfZ3JvdXAgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnE7CisJc3RydWN0IHNjaGVkX2VudGl0eSAqc2U7CisJaW50IGk7CisKKwl0Zy0+Y2ZzX3JxID0ga3phbGxvYyhzaXplb2YoY2ZzX3JxKSAqIG5yX2NwdV9pZHMsIEdGUF9LRVJORUwpOworCWlmICghdGctPmNmc19ycSkKKwkJZ290byBlcnI7CisJdGctPnNlID0ga3phbGxvYyhzaXplb2Yoc2UpICogbnJfY3B1X2lkcywgR0ZQX0tFUk5FTCk7CisJaWYgKCF0Zy0+c2UpCisJCWdvdG8gZXJyOworCisJdGctPnNoYXJlcyA9IE5JQ0VfMF9MT0FEOworCisJaW5pdF9jZnNfYmFuZHdpZHRoKHRnX2Nmc19iYW5kd2lkdGgodGcpKTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCWNmc19ycSA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IGNmc19ycSksCisJCQkJICAgICAgR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaSkpOworCQlpZiAoIWNmc19ycSkKKwkJCWdvdG8gZXJyOworCisJCXNlID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZW50aXR5KSwKKwkJCQkgIEdGUF9LRVJORUwsIGNwdV90b19ub2RlKGkpKTsKKwkJaWYgKCFzZSkKKwkJCWdvdG8gZXJyX2ZyZWVfcnE7CisKKwkJaW5pdF9jZnNfcnEoY2ZzX3JxKTsKKwkJaW5pdF90Z19jZnNfZW50cnkodGcsIGNmc19ycSwgc2UsIGksIHBhcmVudC0+c2VbaV0pOworCX0KKworCXJldHVybiAxOworCitlcnJfZnJlZV9ycToKKwlrZnJlZShjZnNfcnEpOworZXJyOgorCXJldHVybiAwOworfQorCit2b2lkIHVucmVnaXN0ZXJfZmFpcl9zY2hlZF9ncm91cChzdHJ1Y3QgdGFza19ncm91cCAqdGcsIGludCBjcHUpCit7CisJc3RydWN0IHJxICpycSA9IGNwdV9ycShjcHUpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSogT25seSBlbXB0eSB0YXNrIGdyb3VwcyBjYW4gYmUgZGVzdHJveWVkOyBzbyB3ZSBjYW4gc3BlY3VsYXRpdmVseQorCSogY2hlY2sgb25fbGlzdCB3aXRob3V0IGRhbmdlciBvZiBpdCBiZWluZyByZS1hZGRlZC4KKwkqLworCWlmICghdGctPmNmc19ycVtjcHVdLT5vbl9saXN0KQorCQlyZXR1cm47CisKKwlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJxLT5sb2NrLCBmbGFncyk7CisJbGlzdF9kZWxfbGVhZl9jZnNfcnEodGctPmNmc19ycVtjcHVdKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBpbml0X3RnX2Nmc19lbnRyeShzdHJ1Y3QgdGFza19ncm91cCAqdGcsIHN0cnVjdCBjZnNfcnEgKmNmc19ycSwKKwkJCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlLCBpbnQgY3B1LAorCQkJc3RydWN0IHNjaGVkX2VudGl0eSAqcGFyZW50KQoreworCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKKworCWNmc19ycS0+dGcgPSB0ZzsKKwljZnNfcnEtPnJxID0gcnE7CisjaWZkZWYgQ09ORklHX1NNUAorCS8qIGFsbG93IGluaXRpYWwgdXBkYXRlX2Nmc19sb2FkKCkgdG8gdHJ1bmNhdGUgKi8KKwljZnNfcnEtPmxvYWRfc3RhbXAgPSAxOwogI2VuZGlmCisJaW5pdF9jZnNfcnFfcnVudGltZShjZnNfcnEpOworCisJdGctPmNmc19ycVtjcHVdID0gY2ZzX3JxOworCXRnLT5zZVtjcHVdID0gc2U7CisKKwkvKiBzZSBjb3VsZCBiZSBOVUxMIGZvciByb290X3Rhc2tfZ3JvdXAgKi8KKwlpZiAoIXNlKQorCQlyZXR1cm47CisKKwlpZiAoIXBhcmVudCkKKwkJc2UtPmNmc19ycSA9ICZycS0+Y2ZzOworCWVsc2UKKwkJc2UtPmNmc19ycSA9IHBhcmVudC0+bXlfcTsKKworCXNlLT5teV9xID0gY2ZzX3JxOworCXVwZGF0ZV9sb2FkX3NldCgmc2UtPmxvYWQsIDApOworCXNlLT5wYXJlbnQgPSBwYXJlbnQ7Cit9CisKK3N0YXRpYyBERUZJTkVfTVVURVgoc2hhcmVzX211dGV4KTsKKworaW50IHNjaGVkX2dyb3VwX3NldF9zaGFyZXMoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCB1bnNpZ25lZCBsb25nIHNoYXJlcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBXZSBjYW4ndCBjaGFuZ2UgdGhlIHdlaWdodCBvZiB0aGUgcm9vdCBjZ3JvdXAuCisJICovCisJaWYgKCF0Zy0+c2VbMF0pCisJCXJldHVybiAtRUlOVkFMOworCisJc2hhcmVzID0gY2xhbXAoc2hhcmVzLCBzY2FsZV9sb2FkKE1JTl9TSEFSRVMpLCBzY2FsZV9sb2FkKE1BWF9TSEFSRVMpKTsKKworCW11dGV4X2xvY2soJnNoYXJlc19tdXRleCk7CisJaWYgKHRnLT5zaGFyZXMgPT0gc2hhcmVzKQorCQlnb3RvIGRvbmU7CisKKwl0Zy0+c2hhcmVzID0gc2hhcmVzOworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoaSk7CisJCXN0cnVjdCBzY2hlZF9lbnRpdHkgKnNlOworCisJCXNlID0gdGctPnNlW2ldOworCQkvKiBQcm9wYWdhdGUgY29udHJpYnV0aW9uIHRvIGhpZXJhcmNoeSAqLworCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnJxLT5sb2NrLCBmbGFncyk7CisJCWZvcl9lYWNoX3NjaGVkX2VudGl0eShzZSkKKwkJCXVwZGF0ZV9jZnNfc2hhcmVzKGdyb3VwX2Nmc19ycShzZSkpOworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssIGZsYWdzKTsKKwl9CisKK2RvbmU6CisJbXV0ZXhfdW5sb2NrKCZzaGFyZXNfbXV0ZXgpOworCXJldHVybiAwOworfQorI2Vsc2UgLyogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQgKi8KKwordm9pZCBmcmVlX2ZhaXJfc2NoZWRfZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnKSB7IH0KKworaW50IGFsbG9jX2ZhaXJfc2NoZWRfZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCBzdHJ1Y3QgdGFza19ncm91cCAqcGFyZW50KQoreworCXJldHVybiAxOworfQorCit2b2lkIHVucmVnaXN0ZXJfZmFpcl9zY2hlZF9ncm91cChzdHJ1Y3QgdGFza19ncm91cCAqdGcsIGludCBjcHUpIHsgfQorCisjZW5kaWYgLyogQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQgKi8KKwogCiBzdGF0aWMgdW5zaWduZWQgaW50IGdldF9ycl9pbnRlcnZhbF9mYWlyKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKIHsKQEAgLTQ5NDgsNyArNTUzMSw3IEBACiAvKgogICogQWxsIHRoZSBzY2hlZHVsaW5nIGNsYXNzIG1ldGhvZHM6CiAgKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NoZWRfY2xhc3MgZmFpcl9zY2hlZF9jbGFzcyA9IHsKK2NvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyBmYWlyX3NjaGVkX2NsYXNzID0gewogCS5uZXh0CQkJPSAmaWRsZV9zY2hlZF9jbGFzcywKIAkuZW5xdWV1ZV90YXNrCQk9IGVucXVldWVfdGFza19mYWlyLAogCS5kZXF1ZXVlX3Rhc2sJCT0gZGVxdWV1ZV90YXNrX2ZhaXIsCkBAIC00OTg1LDcgKzU1NjgsNyBAQAogfTsKIAogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwotc3RhdGljIHZvaWQgcHJpbnRfY2ZzX3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGNwdSkKK3ZvaWQgcHJpbnRfY2ZzX3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgY2ZzX3JxICpjZnNfcnE7CiAKQEAgLTQ5OTUsMyArNTU3OCwxNSBAQAogCXJjdV9yZWFkX3VubG9jaygpOwogfQogI2VuZGlmCisKK19faW5pdCB2b2lkIGluaXRfc2NoZWRfZmFpcl9jbGFzcyh2b2lkKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlvcGVuX3NvZnRpcnEoU0NIRURfU09GVElSUSwgcnVuX3JlYmFsYW5jZV9kb21haW5zKTsKKworI2lmZGVmIENPTkZJR19OT19IWgorCXphbGxvY19jcHVtYXNrX3Zhcigmbm9oei5pZGxlX2NwdXNfbWFzaywgR0ZQX05PV0FJVCk7CisjZW5kaWYKKyNlbmRpZiAvKiBTTVAgKi8KKworfQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2ZlYXR1cmVzLmggYi9rZXJuZWwvc2NoZWQvZmVhdHVyZXMuaApzaW1pbGFyaXR5IGluZGV4IDc0JQpyZW5hbWUgZnJvbSBrZXJuZWwvc2NoZWRfZmVhdHVyZXMuaApyZW5hbWUgdG8ga2VybmVsL3NjaGVkL2ZlYXR1cmVzLmgKaW5kZXggZWZhMGE3Yi4uZTYxZmQ3MyAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2ZlYXR1cmVzLmgKKysrIGIva2VybmVsL3NjaGVkL2ZlYXR1cmVzLmgKQEAgLTMsMTMgKzMsMTMgQEAKICAqIHRoZW0gdG8gcnVuIHNvb25lciwgYnV0IGRvZXMgbm90IGFsbG93IHRvbnMgb2Ygc2xlZXBlcnMgdG8KICAqIHJpcCB0aGUgc3ByZWFkIGFwYXJ0LgogICovCi1TQ0hFRF9GRUFUKEdFTlRMRV9GQUlSX1NMRUVQRVJTLCAxKQorU0NIRURfRkVBVChHRU5UTEVfRkFJUl9TTEVFUEVSUywgdHJ1ZSkKIAogLyoKICAqIFBsYWNlIG5ldyB0YXNrcyBhaGVhZCBzbyB0aGF0IHRoZXkgZG8gbm90IHN0YXJ2ZSBhbHJlYWR5IHJ1bm5pbmcKICAqIHRhc2tzCiAgKi8KLVNDSEVEX0ZFQVQoU1RBUlRfREVCSVQsIDEpCitTQ0hFRF9GRUFUKFNUQVJUX0RFQklULCB0cnVlKQogCiAvKgogICogQmFzZWQgb24gbG9hZCBhbmQgcHJvZ3JhbSBiZWhhdmlvdXIsIHNlZSBpZiBpdCBtYWtlcyBzZW5zZSB0byBwbGFjZQpAQCAtMTcsNTMgKzE3LDU0IEBACiAgKiBpbXByb3ZlIGNhY2hlIGxvY2FsaXR5LiBUeXBpY2FsbHkgdXNlZCB3aXRoIFNZTkMgd2FrZXVwcyBhcwogICogZ2VuZXJhdGVkIGJ5IHBpcGVzIGFuZCB0aGUgbGlrZSwgc2VlIGFsc28gU1lOQ19XQUtFVVBTLgogICovCi1TQ0hFRF9GRUFUKEFGRklORV9XQUtFVVBTLCAxKQorU0NIRURfRkVBVChBRkZJTkVfV0FLRVVQUywgdHJ1ZSkKIAogLyoKICAqIFByZWZlciB0byBzY2hlZHVsZSB0aGUgdGFzayB3ZSB3b2tlIGxhc3QgKGFzc3VtaW5nIGl0IGZhaWxlZAogICogd2FrZXVwLXByZWVtcHRpb24pLCBzaW5jZSBpdHMgbGlrZWx5IGdvaW5nIHRvIGNvbnN1bWUgZGF0YSB3ZQogICogdG91Y2hlZCwgaW5jcmVhc2VzIGNhY2hlIGxvY2FsaXR5LgogICovCi1TQ0hFRF9GRUFUKE5FWFRfQlVERFksIDApCitTQ0hFRF9GRUFUKE5FWFRfQlVERFksIGZhbHNlKQogCiAvKgogICogUHJlZmVyIHRvIHNjaGVkdWxlIHRoZSB0YXNrIHRoYXQgcmFuIGxhc3QgKHdoZW4gd2UgZGlkCiAgKiB3YWtlLXByZWVtcHQpIGFzIHRoYXQgbGlrZWx5IHdpbGwgdG91Y2ggdGhlIHNhbWUgZGF0YSwgaW5jcmVhc2VzCiAgKiBjYWNoZSBsb2NhbGl0eS4KICAqLwotU0NIRURfRkVBVChMQVNUX0JVRERZLCAxKQorU0NIRURfRkVBVChMQVNUX0JVRERZLCB0cnVlKQogCiAvKgogICogQ29uc2lkZXIgYnVkZGllcyB0byBiZSBjYWNoZSBob3QsIGRlY3JlYXNlcyB0aGUgbGlrZWx5bmVzcyBvZiBhCiAgKiBjYWNoZSBidWRkeSBiZWluZyBtaWdyYXRlZCBhd2F5LCBpbmNyZWFzZXMgY2FjaGUgbG9jYWxpdHkuCiAgKi8KLVNDSEVEX0ZFQVQoQ0FDSEVfSE9UX0JVRERZLCAxKQorU0NIRURfRkVBVChDQUNIRV9IT1RfQlVERFksIHRydWUpCiAKIC8qCiAgKiBVc2UgYXJjaCBkZXBlbmRlbnQgY3B1IHBvd2VyIGZ1bmN0aW9ucwogICovCi1TQ0hFRF9GRUFUKEFSQ0hfUE9XRVIsIDApCitTQ0hFRF9GRUFUKEFSQ0hfUE9XRVIsIGZhbHNlKQogCi1TQ0hFRF9GRUFUKEhSVElDSywgMCkKLVNDSEVEX0ZFQVQoRE9VQkxFX1RJQ0ssIDApCi1TQ0hFRF9GRUFUKExCX0JJQVMsIDEpCitTQ0hFRF9GRUFUKEhSVElDSywgZmFsc2UpCitTQ0hFRF9GRUFUKERPVUJMRV9USUNLLCBmYWxzZSkKK1NDSEVEX0ZFQVQoTEJfQklBUywgdHJ1ZSkKIAogLyoKICAqIFNwaW4td2FpdCBvbiBtdXRleCBhY3F1aXNpdGlvbiB3aGVuIHRoZSBtdXRleCBvd25lciBpcyBydW5uaW5nIG9uCiAgKiBhbm90aGVyIGNwdSAtLSBhc3N1bWVzIHRoYXQgd2hlbiB0aGUgb3duZXIgaXMgcnVubmluZywgaXQgd2lsbCBzb29uCiAgKiByZWxlYXNlIHRoZSBsb2NrLiBEZWNyZWFzZXMgc2NoZWR1bGluZyBvdmVyaGVhZC4KICAqLwotU0NIRURfRkVBVChPV05FUl9TUElOLCAxKQorU0NIRURfRkVBVChPV05FUl9TUElOLCB0cnVlKQogCiAvKgogICogRGVjcmVtZW50IENQVSBwb3dlciBiYXNlZCBvbiB0aW1lIG5vdCBzcGVudCBydW5uaW5nIHRhc2tzCiAgKi8KLVNDSEVEX0ZFQVQoTk9OVEFTS19QT1dFUiwgMSkKK1NDSEVEX0ZFQVQoTk9OVEFTS19QT1dFUiwgdHJ1ZSkKIAogLyoKICAqIFF1ZXVlIHJlbW90ZSB3YWtldXBzIG9uIHRoZSB0YXJnZXQgQ1BVIGFuZCBwcm9jZXNzIHRoZW0KICAqIHVzaW5nIHRoZSBzY2hlZHVsZXIgSVBJLiBSZWR1Y2VzIHJxLT5sb2NrIGNvbnRlbnRpb24vYm91bmNlcy4KICAqLwotU0NIRURfRkVBVChUVFdVX1FVRVVFLCAxKQorU0NIRURfRkVBVChUVFdVX1FVRVVFLCB0cnVlKQogCi1TQ0hFRF9GRUFUKEZPUkNFX1NEX09WRVJMQVAsIDApCitTQ0hFRF9GRUFUKEZPUkNFX1NEX09WRVJMQVAsIGZhbHNlKQorU0NIRURfRkVBVChSVF9SVU5USU1FX1NIQVJFLCB0cnVlKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2lkbGV0YXNrLmMgYi9rZXJuZWwvc2NoZWQvaWRsZV90YXNrLmMKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20ga2VybmVsL3NjaGVkX2lkbGV0YXNrLmMKcmVuYW1lIHRvIGtlcm5lbC9zY2hlZC9pZGxlX3Rhc2suYwppbmRleCAwYTUxODgyLi45MWI0Yzk1IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYworKysgYi9rZXJuZWwvc2NoZWQvaWRsZV90YXNrLmMKQEAgLTEsMyArMSw1IEBACisjaW5jbHVkZSAic2NoZWQuaCIKKwogLyoKICAqIGlkbGUtdGFzayBzY2hlZHVsaW5nIGNsYXNzLgogICoKQEAgLTcxLDcgKzczLDcgQEAKIC8qCiAgKiBTaW1wbGUsIHNwZWNpYWwgc2NoZWR1bGluZyBjbGFzcyBmb3IgdGhlIHBlci1DUFUgaWRsZSB0YXNrczoKICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyBpZGxlX3NjaGVkX2NsYXNzID0geworY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzIGlkbGVfc2NoZWRfY2xhc3MgPSB7CiAJLyogLm5leHQgaXMgTlVMTCAqLwogCS8qIG5vIGVucXVldWUveWllbGRfdGFzayBmb3IgaWRsZSB0YXNrcyAqLwogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2NoZWRfcnQuYyBiL2tlcm5lbC9zY2hlZC9ydC5jCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIGtlcm5lbC9zY2hlZF9ydC5jCnJlbmFtZSB0byBrZXJuZWwvc2NoZWQvcnQuYwppbmRleCAwNTZjYmQyLi4zNjQwZWJiIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfcnQuYworKysgYi9rZXJuZWwvc2NoZWQvcnQuYwpAQCAtMyw3ICszLDkyIEBACiAgKiBwb2xpY2llcykKICAqLwogCisjaW5jbHVkZSAic2NoZWQuaCIKKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKworc3RhdGljIGludCBkb19zY2hlZF9ydF9wZXJpb2RfdGltZXIoc3RydWN0IHJ0X2JhbmR3aWR0aCAqcnRfYiwgaW50IG92ZXJydW4pOworCitzdHJ1Y3QgcnRfYmFuZHdpZHRoIGRlZl9ydF9iYW5kd2lkdGg7CisKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBzY2hlZF9ydF9wZXJpb2RfdGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXN0cnVjdCBydF9iYW5kd2lkdGggKnJ0X2IgPQorCQljb250YWluZXJfb2YodGltZXIsIHN0cnVjdCBydF9iYW5kd2lkdGgsIHJ0X3BlcmlvZF90aW1lcik7CisJa3RpbWVfdCBub3c7CisJaW50IG92ZXJydW47CisJaW50IGlkbGUgPSAwOworCisJZm9yICg7OykgeworCQlub3cgPSBocnRpbWVyX2NiX2dldF90aW1lKHRpbWVyKTsKKwkJb3ZlcnJ1biA9IGhydGltZXJfZm9yd2FyZCh0aW1lciwgbm93LCBydF9iLT5ydF9wZXJpb2QpOworCisJCWlmICghb3ZlcnJ1bikKKwkJCWJyZWFrOworCisJCWlkbGUgPSBkb19zY2hlZF9ydF9wZXJpb2RfdGltZXIocnRfYiwgb3ZlcnJ1bik7CisJfQorCisJcmV0dXJuIGlkbGUgPyBIUlRJTUVSX05PUkVTVEFSVCA6IEhSVElNRVJfUkVTVEFSVDsKK30KKwordm9pZCBpbml0X3J0X2JhbmR3aWR0aChzdHJ1Y3QgcnRfYmFuZHdpZHRoICpydF9iLCB1NjQgcGVyaW9kLCB1NjQgcnVudGltZSkKK3sKKwlydF9iLT5ydF9wZXJpb2QgPSBuc190b19rdGltZShwZXJpb2QpOworCXJ0X2ItPnJ0X3J1bnRpbWUgPSBydW50aW1lOworCisJcmF3X3NwaW5fbG9ja19pbml0KCZydF9iLT5ydF9ydW50aW1lX2xvY2spOworCisJaHJ0aW1lcl9pbml0KCZydF9iLT5ydF9wZXJpb2RfdGltZXIsCisJCQlDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOworCXJ0X2ItPnJ0X3BlcmlvZF90aW1lci5mdW5jdGlvbiA9IHNjaGVkX3J0X3BlcmlvZF90aW1lcjsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfcnRfYmFuZHdpZHRoKHN0cnVjdCBydF9iYW5kd2lkdGggKnJ0X2IpCit7CisJaWYgKCFydF9iYW5kd2lkdGhfZW5hYmxlZCgpIHx8IHJ0X2ItPnJ0X3J1bnRpbWUgPT0gUlVOVElNRV9JTkYpCisJCXJldHVybjsKKworCWlmIChocnRpbWVyX2FjdGl2ZSgmcnRfYi0+cnRfcGVyaW9kX3RpbWVyKSkKKwkJcmV0dXJuOworCisJcmF3X3NwaW5fbG9jaygmcnRfYi0+cnRfcnVudGltZV9sb2NrKTsKKwlzdGFydF9iYW5kd2lkdGhfdGltZXIoJnJ0X2ItPnJ0X3BlcmlvZF90aW1lciwgcnRfYi0+cnRfcGVyaW9kKTsKKwlyYXdfc3Bpbl91bmxvY2soJnJ0X2ItPnJ0X3J1bnRpbWVfbG9jayk7Cit9CisKK3ZvaWQgaW5pdF9ydF9ycShzdHJ1Y3QgcnRfcnEgKnJ0X3JxLCBzdHJ1Y3QgcnEgKnJxKQoreworCXN0cnVjdCBydF9wcmlvX2FycmF5ICphcnJheTsKKwlpbnQgaTsKKworCWFycmF5ID0gJnJ0X3JxLT5hY3RpdmU7CisJZm9yIChpID0gMDsgaSA8IE1BWF9SVF9QUklPOyBpKyspIHsKKwkJSU5JVF9MSVNUX0hFQUQoYXJyYXktPnF1ZXVlICsgaSk7CisJCV9fY2xlYXJfYml0KGksIGFycmF5LT5iaXRtYXApOworCX0KKwkvKiBkZWxpbWl0ZXIgZm9yIGJpdHNlYXJjaDogKi8KKwlfX3NldF9iaXQoTUFYX1JUX1BSSU8sIGFycmF5LT5iaXRtYXApOworCisjaWYgZGVmaW5lZCBDT05GSUdfU01QCisJcnRfcnEtPmhpZ2hlc3RfcHJpby5jdXJyID0gTUFYX1JUX1BSSU87CisJcnRfcnEtPmhpZ2hlc3RfcHJpby5uZXh0ID0gTUFYX1JUX1BSSU87CisJcnRfcnEtPnJ0X25yX21pZ3JhdG9yeSA9IDA7CisJcnRfcnEtPm92ZXJsb2FkZWQgPSAwOworCXBsaXN0X2hlYWRfaW5pdCgmcnRfcnEtPnB1c2hhYmxlX3Rhc2tzKTsKKyNlbmRpZgorCisJcnRfcnEtPnJ0X3RpbWUgPSAwOworCXJ0X3JxLT5ydF90aHJvdHRsZWQgPSAwOworCXJ0X3JxLT5ydF9ydW50aW1lID0gMDsKKwlyYXdfc3Bpbl9sb2NrX2luaXQoJnJ0X3JxLT5ydF9ydW50aW1lX2xvY2spOworfQorCiAjaWZkZWYgQ09ORklHX1JUX0dST1VQX1NDSEVECitzdGF0aWMgdm9pZCBkZXN0cm95X3J0X2JhbmR3aWR0aChzdHJ1Y3QgcnRfYmFuZHdpZHRoICpydF9iKQoreworCWhydGltZXJfY2FuY2VsKCZydF9iLT5ydF9wZXJpb2RfdGltZXIpOworfQogCiAjZGVmaW5lIHJ0X2VudGl0eV9pc190YXNrKHJ0X3NlKSAoIShydF9zZSktPm15X3EpCiAKQEAgLTI1LDYgKzExMCw5MSBAQAogCXJldHVybiBydF9zZS0+cnRfcnE7CiB9CiAKK3ZvaWQgZnJlZV9ydF9zY2hlZF9ncm91cChzdHJ1Y3QgdGFza19ncm91cCAqdGcpCit7CisJaW50IGk7CisKKwlpZiAodGctPnJ0X3NlKQorCQlkZXN0cm95X3J0X2JhbmR3aWR0aCgmdGctPnJ0X2JhbmR3aWR0aCk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlpZiAodGctPnJ0X3JxKQorCQkJa2ZyZWUodGctPnJ0X3JxW2ldKTsKKwkJaWYgKHRnLT5ydF9zZSkKKwkJCWtmcmVlKHRnLT5ydF9zZVtpXSk7CisJfQorCisJa2ZyZWUodGctPnJ0X3JxKTsKKwlrZnJlZSh0Zy0+cnRfc2UpOworfQorCit2b2lkIGluaXRfdGdfcnRfZW50cnkoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCBzdHJ1Y3QgcnRfcnEgKnJ0X3JxLAorCQlzdHJ1Y3Qgc2NoZWRfcnRfZW50aXR5ICpydF9zZSwgaW50IGNwdSwKKwkJc3RydWN0IHNjaGVkX3J0X2VudGl0eSAqcGFyZW50KQoreworCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKKworCXJ0X3JxLT5oaWdoZXN0X3ByaW8uY3VyciA9IE1BWF9SVF9QUklPOworCXJ0X3JxLT5ydF9ucl9ib29zdGVkID0gMDsKKwlydF9ycS0+cnEgPSBycTsKKwlydF9ycS0+dGcgPSB0ZzsKKworCXRnLT5ydF9ycVtjcHVdID0gcnRfcnE7CisJdGctPnJ0X3NlW2NwdV0gPSBydF9zZTsKKworCWlmICghcnRfc2UpCisJCXJldHVybjsKKworCWlmICghcGFyZW50KQorCQlydF9zZS0+cnRfcnEgPSAmcnEtPnJ0OworCWVsc2UKKwkJcnRfc2UtPnJ0X3JxID0gcGFyZW50LT5teV9xOworCisJcnRfc2UtPm15X3EgPSBydF9ycTsKKwlydF9zZS0+cGFyZW50ID0gcGFyZW50OworCUlOSVRfTElTVF9IRUFEKCZydF9zZS0+cnVuX2xpc3QpOworfQorCitpbnQgYWxsb2NfcnRfc2NoZWRfZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCBzdHJ1Y3QgdGFza19ncm91cCAqcGFyZW50KQoreworCXN0cnVjdCBydF9ycSAqcnRfcnE7CisJc3RydWN0IHNjaGVkX3J0X2VudGl0eSAqcnRfc2U7CisJaW50IGk7CisKKwl0Zy0+cnRfcnEgPSBremFsbG9jKHNpemVvZihydF9ycSkgKiBucl9jcHVfaWRzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRnLT5ydF9ycSkKKwkJZ290byBlcnI7CisJdGctPnJ0X3NlID0ga3phbGxvYyhzaXplb2YocnRfc2UpICogbnJfY3B1X2lkcywgR0ZQX0tFUk5FTCk7CisJaWYgKCF0Zy0+cnRfc2UpCisJCWdvdG8gZXJyOworCisJaW5pdF9ydF9iYW5kd2lkdGgoJnRnLT5ydF9iYW5kd2lkdGgsCisJCQlrdGltZV90b19ucyhkZWZfcnRfYmFuZHdpZHRoLnJ0X3BlcmlvZCksIDApOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJcnRfcnEgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBydF9ycSksCisJCQkJICAgICBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShpKSk7CisJCWlmICghcnRfcnEpCisJCQlnb3RvIGVycjsKKworCQlydF9zZSA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX3J0X2VudGl0eSksCisJCQkJICAgICBHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShpKSk7CisJCWlmICghcnRfc2UpCisJCQlnb3RvIGVycl9mcmVlX3JxOworCisJCWluaXRfcnRfcnEocnRfcnEsIGNwdV9ycShpKSk7CisJCXJ0X3JxLT5ydF9ydW50aW1lID0gdGctPnJ0X2JhbmR3aWR0aC5ydF9ydW50aW1lOworCQlpbml0X3RnX3J0X2VudHJ5KHRnLCBydF9ycSwgcnRfc2UsIGksIHBhcmVudC0+cnRfc2VbaV0pOworCX0KKworCXJldHVybiAxOworCitlcnJfZnJlZV9ycToKKwlrZnJlZShydF9ycSk7CitlcnI6CisJcmV0dXJuIDA7Cit9CisKICNlbHNlIC8qIENPTkZJR19SVF9HUk9VUF9TQ0hFRCAqLwogCiAjZGVmaW5lIHJ0X2VudGl0eV9pc190YXNrKHJ0X3NlKSAoMSkKQEAgLTQ3LDYgKzIxNywxMiBAQAogCXJldHVybiAmcnEtPnJ0OwogfQogCit2b2lkIGZyZWVfcnRfc2NoZWRfZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnKSB7IH0KKworaW50IGFsbG9jX3J0X3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3RydWN0IHRhc2tfZ3JvdXAgKnBhcmVudCkKK3sKKwlyZXR1cm4gMTsKK30KICNlbmRpZiAvKiBDT05GSUdfUlRfR1JPVVBfU0NIRUQgKi8KIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTU1NiwxMCArNzMyLDM1IEBACiAJcmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7CiB9CiAKK2ludCB1cGRhdGVfcnVudGltZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJaW50IGNwdSA9IChpbnQpKGxvbmcpaGNwdTsKKworCXN3aXRjaCAoYWN0aW9uKSB7CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgorCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CisJCWRpc2FibGVfcnVudGltZShjcHVfcnEoY3B1KSk7CisJCXJldHVybiBOT1RJRllfT0s7CisKKwljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwljYXNlIENQVV9ET1dOX0ZBSUxFRF9GUk9aRU46CisJY2FzZSBDUFVfT05MSU5FOgorCWNhc2UgQ1BVX09OTElORV9GUk9aRU46CisJCWVuYWJsZV9ydW50aW1lKGNwdV9ycShjcHUpKTsKKwkJcmV0dXJuIE5PVElGWV9PSzsKKworCWRlZmF1bHQ6CisJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9Cit9CisKIHN0YXRpYyBpbnQgYmFsYW5jZV9ydW50aW1lKHN0cnVjdCBydF9ycSAqcnRfcnEpCiB7CiAJaW50IG1vcmUgPSAwOwogCisJaWYgKCFzY2hlZF9mZWF0KFJUX1JVTlRJTUVfU0hBUkUpKQorCQlyZXR1cm4gbW9yZTsKKwogCWlmIChydF9ycS0+cnRfdGltZSA+IHJ0X3JxLT5ydF9ydW50aW1lKSB7CiAJCXJhd19zcGluX3VubG9jaygmcnRfcnEtPnJ0X3J1bnRpbWVfbG9jayk7CiAJCW1vcmUgPSBkb19iYWxhbmNlX3J1bnRpbWUocnRfcnEpOwpAQCAtNjQ1LDcgKzg0Niw3IEBACiAJaWYgKHJ0X3JxLT5ydF90aHJvdHRsZWQpCiAJCXJldHVybiBydF9ycV90aHJvdHRsZWQocnRfcnEpOwogCi0JaWYgKHNjaGVkX3J0X3J1bnRpbWUocnRfcnEpID49IHNjaGVkX3J0X3BlcmlvZChydF9ycSkpCisJaWYgKHJ1bnRpbWUgPj0gc2NoZWRfcnRfcGVyaW9kKHJ0X3JxKSkKIAkJcmV0dXJuIDA7CiAKIAliYWxhbmNlX3J1bnRpbWUocnRfcnEpOwpAQCAtOTU0LDggKzExNTUsOCBAQAogfQogCiAvKgotICogUHV0IHRhc2sgdG8gdGhlIGVuZCBvZiB0aGUgcnVuIGxpc3Qgd2l0aG91dCB0aGUgb3ZlcmhlYWQgb2YgZGVxdWV1ZQotICogZm9sbG93ZWQgYnkgZW5xdWV1ZS4KKyAqIFB1dCB0YXNrIHRvIHRoZSBoZWFkIG9yIHRoZSBlbmQgb2YgdGhlIHJ1biBsaXN0IHdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mCisgKiBkZXF1ZXVlIGZvbGxvd2VkIGJ5IGVucXVldWUuCiAgKi8KIHN0YXRpYyB2b2lkCiByZXF1ZXVlX3J0X2VudGl0eShzdHJ1Y3QgcnRfcnEgKnJ0X3JxLCBzdHJ1Y3Qgc2NoZWRfcnRfZW50aXR5ICpydF9zZSwgaW50IGhlYWQpCkBAIC05OTksNiArMTIwMCw5IEBACiAKIAljcHUgPSB0YXNrX2NwdShwKTsKIAorCWlmIChwLT5ydC5ucl9jcHVzX2FsbG93ZWQgPT0gMSkKKwkJZ290byBvdXQ7CisKIAkvKiBGb3IgYW55dGhpbmcgYnV0IHdha2UgdXBzLCBqdXN0IHJldHVybiB0aGUgdGFza19jcHUgKi8KIAlpZiAoc2RfZmxhZyAhPSBTRF9CQUxBTkNFX1dBS0UgJiYgc2RfZmxhZyAhPSBTRF9CQUxBTkNFX0ZPUkspCiAJCWdvdG8gb3V0OwpAQCAtMTE3NSw4ICsxMzc5LDYgQEAKIC8qIE9ubHkgdHJ5IGFsZ29yaXRobXMgdGhyZWUgdGltZXMgKi8KICNkZWZpbmUgUlRfTUFYX1RSSUVTIDMKIAotc3RhdGljIHZvaWQgZGVhY3RpdmF0ZV90YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHNsZWVwKTsKLQogc3RhdGljIGludCBwaWNrX3J0X3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgY3B1KQogewogCWlmICghdGFza19ydW5uaW5nKHJxLCBwKSAmJgpAQCAtMTY1MCwxMyArMTg1MiwxNCBAQAogCQlwdWxsX3J0X3Rhc2socnEpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9zY2hlZF9ydF9jbGFzcyh2b2lkKQordm9pZCBpbml0X3NjaGVkX3J0X2NsYXNzKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IGk7CiAKLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewogCQl6YWxsb2NfY3B1bWFza192YXJfbm9kZSgmcGVyX2NwdShsb2NhbF9jcHVfbWFzaywgaSksCiAJCQkJCUdGUF9LRVJORUwsIGNwdV90b19ub2RlKGkpKTsKKwl9CiB9CiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCkBAIC0xNzk3LDcgKzIwMDAsNyBAQAogCQlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyBydF9zY2hlZF9jbGFzcyA9IHsKK2NvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyBydF9zY2hlZF9jbGFzcyA9IHsKIAkubmV4dAkJCT0gJmZhaXJfc2NoZWRfY2xhc3MsCiAJLmVucXVldWVfdGFzawkJPSBlbnF1ZXVlX3Rhc2tfcnQsCiAJLmRlcXVldWVfdGFzawkJPSBkZXF1ZXVlX3Rhc2tfcnQsCkBAIC0xODMyLDcgKzIwMzUsNyBAQAogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRwogZXh0ZXJuIHZvaWQgcHJpbnRfcnRfcnEoc3RydWN0IHNlcV9maWxlICptLCBpbnQgY3B1LCBzdHJ1Y3QgcnRfcnEgKnJ0X3JxKTsKIAotc3RhdGljIHZvaWQgcHJpbnRfcnRfc3RhdHMoc3RydWN0IHNlcV9maWxlICptLCBpbnQgY3B1KQordm9pZCBwcmludF9ydF9zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBjcHUpCiB7CiAJcnRfcnFfaXRlcl90IGl0ZXI7CiAJc3RydWN0IHJ0X3JxICpydF9ycTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9zY2hlZC5oIGIva2VybmVsL3NjaGVkL3NjaGVkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThjMGMyNgotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9zY2hlZC9zY2hlZC5oCkBAIC0wLDAgKzEsMTE2NiBAQAorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc3RvcF9tYWNoaW5lLmg+CisKKyNpbmNsdWRlICJjcHVwcmkuaCIKKworZXh0ZXJuIF9fcmVhZF9tb3N0bHkgaW50IHNjaGVkdWxlcl9ydW5uaW5nOworCisvKgorICogQ29udmVydCB1c2VyLW5pY2UgdmFsdWVzIFsgLTIwIC4uLiAwIC4uLiAxOSBdCisgKiB0byBzdGF0aWMgcHJpb3JpdHkgWyBNQVhfUlRfUFJJTy4uTUFYX1BSSU8tMSBdLAorICogYW5kIGJhY2suCisgKi8KKyNkZWZpbmUgTklDRV9UT19QUklPKG5pY2UpCShNQVhfUlRfUFJJTyArIChuaWNlKSArIDIwKQorI2RlZmluZSBQUklPX1RPX05JQ0UocHJpbykJKChwcmlvKSAtIE1BWF9SVF9QUklPIC0gMjApCisjZGVmaW5lIFRBU0tfTklDRShwKQkJUFJJT19UT19OSUNFKChwKS0+c3RhdGljX3ByaW8pCisKKy8qCisgKiAnVXNlciBwcmlvcml0eScgaXMgdGhlIG5pY2UgdmFsdWUgY29udmVydGVkIHRvIHNvbWV0aGluZyB3ZQorICogY2FuIHdvcmsgd2l0aCBiZXR0ZXIgd2hlbiBzY2FsaW5nIHZhcmlvdXMgc2NoZWR1bGVyIHBhcmFtZXRlcnMsCisgKiBpdCdzIGEgWyAwIC4uLiAzOSBdIHJhbmdlLgorICovCisjZGVmaW5lIFVTRVJfUFJJTyhwKQkJKChwKS1NQVhfUlRfUFJJTykKKyNkZWZpbmUgVEFTS19VU0VSX1BSSU8ocCkJVVNFUl9QUklPKChwKS0+c3RhdGljX3ByaW8pCisjZGVmaW5lIE1BWF9VU0VSX1BSSU8JCShVU0VSX1BSSU8oTUFYX1BSSU8pKQorCisvKgorICogSGVscGVycyBmb3IgY29udmVydGluZyBuYW5vc2Vjb25kIHRpbWluZyB0byBqaWZmeSByZXNvbHV0aW9uCisgKi8KKyNkZWZpbmUgTlNfVE9fSklGRklFUyhUSU1FKQkoKHVuc2lnbmVkIGxvbmcpKFRJTUUpIC8gKE5TRUNfUEVSX1NFQyAvIEhaKSkKKworI2RlZmluZSBOSUNFXzBfTE9BRAkJU0NIRURfTE9BRF9TQ0FMRQorI2RlZmluZSBOSUNFXzBfU0hJRlQJCVNDSEVEX0xPQURfU0hJRlQKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgJ3R1bmluZyBrbm9icycgb2YgdGhlIHNjaGVkdWxlcjoKKyAqCisgKiBkZWZhdWx0IHRpbWVzbGljZSBpcyAxMDAgbXNlY3MgKHVzZWQgb25seSBmb3IgU0NIRURfUlIgdGFza3MpLgorICogVGltZXNsaWNlcyBnZXQgcmVmaWxsZWQgYWZ0ZXIgdGhleSBleHBpcmUuCisgKi8KKyNkZWZpbmUgREVGX1RJTUVTTElDRQkJKDEwMCAqIEhaIC8gMTAwMCkKKworLyoKKyAqIHNpbmdsZSB2YWx1ZSB0aGF0IGRlbm90ZXMgcnVudGltZSA9PSBwZXJpb2QsIGllIHVubGltaXRlZCB0aW1lLgorICovCisjZGVmaW5lIFJVTlRJTUVfSU5GCSgodTY0KX4wVUxMKQorCitzdGF0aWMgaW5saW5lIGludCBydF9wb2xpY3koaW50IHBvbGljeSkKK3sKKwlpZiAocG9saWN5ID09IFNDSEVEX0ZJRk8gfHwgcG9saWN5ID09IFNDSEVEX1JSKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGFza19oYXNfcnRfcG9saWN5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcnRfcG9saWN5KHAtPnBvbGljeSk7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSBwcmlvcml0eS1xdWV1ZSBkYXRhIHN0cnVjdHVyZSBvZiB0aGUgUlQgc2NoZWR1bGluZyBjbGFzczoKKyAqLworc3RydWN0IHJ0X3ByaW9fYXJyYXkgeworCURFQ0xBUkVfQklUTUFQKGJpdG1hcCwgTUFYX1JUX1BSSU8rMSk7IC8qIGluY2x1ZGUgMSBiaXQgZm9yIGRlbGltaXRlciAqLworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWVbTUFYX1JUX1BSSU9dOworfTsKKworc3RydWN0IHJ0X2JhbmR3aWR0aCB7CisJLyogbmVzdHMgaW5zaWRlIHRoZSBycSBsb2NrOiAqLworCXJhd19zcGlubG9ja190CQlydF9ydW50aW1lX2xvY2s7CisJa3RpbWVfdAkJCXJ0X3BlcmlvZDsKKwl1NjQJCQlydF9ydW50aW1lOworCXN0cnVjdCBocnRpbWVyCQlydF9wZXJpb2RfdGltZXI7Cit9OworCitleHRlcm4gc3RydWN0IG11dGV4IHNjaGVkX2RvbWFpbnNfbXV0ZXg7CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX1NDSEVECisKKyNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KKworc3RydWN0IGNmc19ycTsKK3N0cnVjdCBydF9ycTsKKworc3RhdGljIExJU1RfSEVBRCh0YXNrX2dyb3Vwcyk7CisKK3N0cnVjdCBjZnNfYmFuZHdpZHRoIHsKKyNpZmRlZiBDT05GSUdfQ0ZTX0JBTkRXSURUSAorCXJhd19zcGlubG9ja190IGxvY2s7CisJa3RpbWVfdCBwZXJpb2Q7CisJdTY0IHF1b3RhLCBydW50aW1lOworCXM2NCBoaWVyYXJjaGFsX3F1b3RhOworCXU2NCBydW50aW1lX2V4cGlyZXM7CisKKwlpbnQgaWRsZSwgdGltZXJfYWN0aXZlOworCXN0cnVjdCBocnRpbWVyIHBlcmlvZF90aW1lciwgc2xhY2tfdGltZXI7CisJc3RydWN0IGxpc3RfaGVhZCB0aHJvdHRsZWRfY2ZzX3JxOworCisJLyogc3RhdGlzdGljcyAqLworCWludCBucl9wZXJpb2RzLCBucl90aHJvdHRsZWQ7CisJdTY0IHRocm90dGxlZF90aW1lOworI2VuZGlmCit9OworCisvKiB0YXNrIGdyb3VwIHJlbGF0ZWQgaW5mb3JtYXRpb24gKi8KK3N0cnVjdCB0YXNrX2dyb3VwIHsKKwlzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSBjc3M7CisKKyNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAorCS8qIHNjaGVkdWxhYmxlIGVudGl0aWVzIG9mIHRoaXMgZ3JvdXAgb24gZWFjaCBjcHUgKi8KKwlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICoqc2U7CisJLyogcnVucXVldWUgIm93bmVkIiBieSB0aGlzIGdyb3VwIG9uIGVhY2ggY3B1ICovCisJc3RydWN0IGNmc19ycSAqKmNmc19ycTsKKwl1bnNpZ25lZCBsb25nIHNoYXJlczsKKworCWF0b21pY190IGxvYWRfd2VpZ2h0OworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKKwlzdHJ1Y3Qgc2NoZWRfcnRfZW50aXR5ICoqcnRfc2U7CisJc3RydWN0IHJ0X3JxICoqcnRfcnE7CisKKwlzdHJ1Y3QgcnRfYmFuZHdpZHRoIHJ0X2JhbmR3aWR0aDsKKyNlbmRpZgorCisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgdGFza19ncm91cCAqcGFyZW50OworCXN0cnVjdCBsaXN0X2hlYWQgc2libGluZ3M7CisJc3RydWN0IGxpc3RfaGVhZCBjaGlsZHJlbjsKKworI2lmZGVmIENPTkZJR19TQ0hFRF9BVVRPR1JPVVAKKwlzdHJ1Y3QgYXV0b2dyb3VwICphdXRvZ3JvdXA7CisjZW5kaWYKKworCXN0cnVjdCBjZnNfYmFuZHdpZHRoIGNmc19iYW5kd2lkdGg7Cit9OworCisjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKKyNkZWZpbmUgUk9PVF9UQVNLX0dST1VQX0xPQUQJTklDRV8wX0xPQUQKKworLyoKKyAqIEEgd2VpZ2h0IG9mIDAgb3IgMSBjYW4gY2F1c2UgYXJpdGhtZXRpY3MgcHJvYmxlbXMuCisgKiBBIHdlaWdodCBvZiBhIGNmc19ycSBpcyB0aGUgc3VtIG9mIHdlaWdodHMgb2Ygd2hpY2ggZW50aXRpZXMKKyAqIGFyZSBxdWV1ZWQgb24gdGhpcyBjZnNfcnEsIHNvIGEgd2VpZ2h0IG9mIGEgZW50aXR5IHNob3VsZCBub3QgYmUKKyAqIHRvbyBsYXJnZSwgc28gYXMgdGhlIHNoYXJlcyB2YWx1ZSBvZiBhIHRhc2sgZ3JvdXAuCisgKiAoVGhlIGRlZmF1bHQgd2VpZ2h0IGlzIDEwMjQgLSBzbyB0aGVyZSdzIG5vIHByYWN0aWNhbAorICogIGxpbWl0YXRpb24gZnJvbSB0aGlzLikKKyAqLworI2RlZmluZSBNSU5fU0hBUkVTCSgxVUwgPDwgIDEpCisjZGVmaW5lIE1BWF9TSEFSRVMJKDFVTCA8PCAxOCkKKyNlbmRpZgorCisvKiBEZWZhdWx0IHRhc2sgZ3JvdXAuCisgKglFdmVyeSB0YXNrIGluIHN5c3RlbSBiZWxvbmcgdG8gdGhpcyBncm91cCBhdCBib290dXAuCisgKi8KK2V4dGVybiBzdHJ1Y3QgdGFza19ncm91cCByb290X3Rhc2tfZ3JvdXA7CisKK3R5cGVkZWYgaW50ICgqdGdfdmlzaXRvcikoc3RydWN0IHRhc2tfZ3JvdXAgKiwgdm9pZCAqKTsKKworZXh0ZXJuIGludCB3YWxrX3RnX3RyZWVfZnJvbShzdHJ1Y3QgdGFza19ncm91cCAqZnJvbSwKKwkJCSAgICAgdGdfdmlzaXRvciBkb3duLCB0Z192aXNpdG9yIHVwLCB2b2lkICpkYXRhKTsKKworLyoKKyAqIEl0ZXJhdGUgdGhlIGZ1bGwgdHJlZSwgY2FsbGluZyBAZG93biB3aGVuIGZpcnN0IGVudGVyaW5nIGEgbm9kZSBhbmQgQHVwIHdoZW4KKyAqIGxlYXZpbmcgaXQgZm9yIHRoZSBmaW5hbCB0aW1lLgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgcmN1X2xvY2sgb3Igc3VmZmljaWVudCBlcXVpdmFsZW50LgorICovCitzdGF0aWMgaW5saW5lIGludCB3YWxrX3RnX3RyZWUodGdfdmlzaXRvciBkb3duLCB0Z192aXNpdG9yIHVwLCB2b2lkICpkYXRhKQoreworCXJldHVybiB3YWxrX3RnX3RyZWVfZnJvbSgmcm9vdF90YXNrX2dyb3VwLCBkb3duLCB1cCwgZGF0YSk7Cit9CisKK2V4dGVybiBpbnQgdGdfbm9wKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgdm9pZCAqZGF0YSk7CisKK2V4dGVybiB2b2lkIGZyZWVfZmFpcl9zY2hlZF9ncm91cChzdHJ1Y3QgdGFza19ncm91cCAqdGcpOworZXh0ZXJuIGludCBhbGxvY19mYWlyX3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3RydWN0IHRhc2tfZ3JvdXAgKnBhcmVudCk7CitleHRlcm4gdm9pZCB1bnJlZ2lzdGVyX2ZhaXJfc2NoZWRfZ3JvdXAoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIGluaXRfdGdfY2ZzX2VudHJ5KHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3RydWN0IGNmc19ycSAqY2ZzX3JxLAorCQkJc3RydWN0IHNjaGVkX2VudGl0eSAqc2UsIGludCBjcHUsCisJCQlzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpwYXJlbnQpOworZXh0ZXJuIHZvaWQgaW5pdF9jZnNfYmFuZHdpZHRoKHN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYik7CitleHRlcm4gaW50IHNjaGVkX2dyb3VwX3NldF9zaGFyZXMoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLCB1bnNpZ25lZCBsb25nIHNoYXJlcyk7CisKK2V4dGVybiB2b2lkIF9fcmVmaWxsX2Nmc19iYW5kd2lkdGhfcnVudGltZShzdHJ1Y3QgY2ZzX2JhbmR3aWR0aCAqY2ZzX2IpOworZXh0ZXJuIHZvaWQgX19zdGFydF9jZnNfYmFuZHdpZHRoKHN0cnVjdCBjZnNfYmFuZHdpZHRoICpjZnNfYik7CitleHRlcm4gdm9pZCB1bnRocm90dGxlX2Nmc19ycShzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpOworCitleHRlcm4gdm9pZCBmcmVlX3J0X3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0Zyk7CitleHRlcm4gaW50IGFsbG9jX3J0X3NjaGVkX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3RydWN0IHRhc2tfZ3JvdXAgKnBhcmVudCk7CitleHRlcm4gdm9pZCBpbml0X3RnX3J0X2VudHJ5KHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3RydWN0IHJ0X3JxICpydF9ycSwKKwkJc3RydWN0IHNjaGVkX3J0X2VudGl0eSAqcnRfc2UsIGludCBjcHUsCisJCXN0cnVjdCBzY2hlZF9ydF9lbnRpdHkgKnBhcmVudCk7CisKKyNlbHNlIC8qIENPTkZJR19DR1JPVVBfU0NIRUQgKi8KKworc3RydWN0IGNmc19iYW5kd2lkdGggeyB9OworCisjZW5kaWYJLyogQ09ORklHX0NHUk9VUF9TQ0hFRCAqLworCisvKiBDRlMtcmVsYXRlZCBmaWVsZHMgaW4gYSBydW5xdWV1ZSAqLworc3RydWN0IGNmc19ycSB7CisJc3RydWN0IGxvYWRfd2VpZ2h0IGxvYWQ7CisJdW5zaWduZWQgbG9uZyBucl9ydW5uaW5nLCBoX25yX3J1bm5pbmc7CisKKwl1NjQgZXhlY19jbG9jazsKKwl1NjQgbWluX3ZydW50aW1lOworI2lmbmRlZiBDT05GSUdfNjRCSVQKKwl1NjQgbWluX3ZydW50aW1lX2NvcHk7CisjZW5kaWYKKworCXN0cnVjdCByYl9yb290IHRhc2tzX3RpbWVsaW5lOworCXN0cnVjdCByYl9ub2RlICpyYl9sZWZ0bW9zdDsKKworCXN0cnVjdCBsaXN0X2hlYWQgdGFza3M7CisJc3RydWN0IGxpc3RfaGVhZCAqYmFsYW5jZV9pdGVyYXRvcjsKKworCS8qCisJICogJ2N1cnInIHBvaW50cyB0byBjdXJyZW50bHkgcnVubmluZyBlbnRpdHkgb24gdGhpcyBjZnNfcnEuCisJICogSXQgaXMgc2V0IHRvIE5VTEwgb3RoZXJ3aXNlIChpLmUgd2hlbiBub25lIGFyZSBjdXJyZW50bHkgcnVubmluZykuCisJICovCisJc3RydWN0IHNjaGVkX2VudGl0eSAqY3VyciwgKm5leHQsICpsYXN0LCAqc2tpcDsKKworI2lmZGVmCUNPTkZJR19TQ0hFRF9ERUJVRworCXVuc2lnbmVkIGludCBucl9zcHJlYWRfb3ZlcjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKKwlzdHJ1Y3QgcnEgKnJxOwkvKiBjcHUgcnVucXVldWUgdG8gd2hpY2ggdGhpcyBjZnNfcnEgaXMgYXR0YWNoZWQgKi8KKworCS8qCisJICogbGVhZiBjZnNfcnFzIGFyZSB0aG9zZSB0aGF0IGhvbGQgdGFza3MgKGxvd2VzdCBzY2hlZHVsYWJsZSBlbnRpdHkgaW4KKwkgKiBhIGhpZXJhcmNoeSkuIE5vbi1sZWFmIGxycXMgaG9sZCBvdGhlciBoaWdoZXIgc2NoZWR1bGFibGUgZW50aXRpZXMKKwkgKiAobGlrZSB1c2VycywgY29udGFpbmVycyBldGMuKQorCSAqCisJICogbGVhZl9jZnNfcnFfbGlzdCB0aWVzIHRvZ2V0aGVyIGxpc3Qgb2YgbGVhZiBjZnNfcnEncyBpbiBhIGNwdS4gVGhpcworCSAqIGxpc3QgaXMgdXNlZCBkdXJpbmcgbG9hZCBiYWxhbmNlLgorCSAqLworCWludCBvbl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQgbGVhZl9jZnNfcnFfbGlzdDsKKwlzdHJ1Y3QgdGFza19ncm91cCAqdGc7CS8qIGdyb3VwIHRoYXQgIm93bnMiIHRoaXMgcnVucXVldWUgKi8KKworI2lmZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIHRoZSBwYXJ0IG9mIGxvYWQud2VpZ2h0IGNvbnRyaWJ1dGVkIGJ5IHRhc2tzCisJICovCisJdW5zaWduZWQgbG9uZyB0YXNrX3dlaWdodDsKKworCS8qCisJICogICBoX2xvYWQgPSB3ZWlnaHQgKiBmKHRnKQorCSAqCisJICogV2hlcmUgZih0ZykgaXMgdGhlIHJlY3Vyc2l2ZSB3ZWlnaHQgZnJhY3Rpb24gYXNzaWduZWQgdG8KKwkgKiB0aGlzIGdyb3VwLgorCSAqLworCXVuc2lnbmVkIGxvbmcgaF9sb2FkOworCisJLyoKKwkgKiBNYWludGFpbmluZyBwZXItY3B1IHNoYXJlcyBkaXN0cmlidXRpb24gZm9yIGdyb3VwIHNjaGVkdWxpbmcKKwkgKgorCSAqIGxvYWRfc3RhbXAgaXMgdGhlIGxhc3QgdGltZSB3ZSB1cGRhdGVkIHRoZSBsb2FkIGF2ZXJhZ2UKKwkgKiBsb2FkX2xhc3QgaXMgdGhlIGxhc3QgdGltZSB3ZSB1cGRhdGVkIHRoZSBsb2FkIGF2ZXJhZ2UgYW5kIHNhdyBsb2FkCisJICogbG9hZF91bmFjY19leGVjX3RpbWUgaXMgY3VycmVudGx5IHVuYWNjb3VudGVkIGV4ZWN1dGlvbiB0aW1lCisJICovCisJdTY0IGxvYWRfYXZnOworCXU2NCBsb2FkX3BlcmlvZDsKKwl1NjQgbG9hZF9zdGFtcCwgbG9hZF9sYXN0LCBsb2FkX3VuYWNjX2V4ZWNfdGltZTsKKworCXVuc2lnbmVkIGxvbmcgbG9hZF9jb250cmlidXRpb247CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworI2lmZGVmIENPTkZJR19DRlNfQkFORFdJRFRICisJaW50IHJ1bnRpbWVfZW5hYmxlZDsKKwl1NjQgcnVudGltZV9leHBpcmVzOworCXM2NCBydW50aW1lX3JlbWFpbmluZzsKKworCXU2NCB0aHJvdHRsZWRfdGltZXN0YW1wOworCWludCB0aHJvdHRsZWQsIHRocm90dGxlX2NvdW50OworCXN0cnVjdCBsaXN0X2hlYWQgdGhyb3R0bGVkX2xpc3Q7CisjZW5kaWYgLyogQ09ORklHX0NGU19CQU5EV0lEVEggKi8KKyNlbmRpZiAvKiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRCAqLworfTsKKworc3RhdGljIGlubGluZSBpbnQgcnRfYmFuZHdpZHRoX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gc3lzY3RsX3NjaGVkX3J0X3J1bnRpbWUgPj0gMDsKK30KKworLyogUmVhbC1UaW1lIGNsYXNzZXMnIHJlbGF0ZWQgZmllbGQgaW4gYSBydW5xdWV1ZTogKi8KK3N0cnVjdCBydF9ycSB7CisJc3RydWN0IHJ0X3ByaW9fYXJyYXkgYWN0aXZlOworCXVuc2lnbmVkIGxvbmcgcnRfbnJfcnVubmluZzsKKyNpZiBkZWZpbmVkIENPTkZJR19TTVAgfHwgZGVmaW5lZCBDT05GSUdfUlRfR1JPVVBfU0NIRUQKKwlzdHJ1Y3QgeworCQlpbnQgY3VycjsgLyogaGlnaGVzdCBxdWV1ZWQgcnQgdGFzayBwcmlvICovCisjaWZkZWYgQ09ORklHX1NNUAorCQlpbnQgbmV4dDsgLyogbmV4dCBoaWdoZXN0ICovCisjZW5kaWYKKwl9IGhpZ2hlc3RfcHJpbzsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TTVAKKwl1bnNpZ25lZCBsb25nIHJ0X25yX21pZ3JhdG9yeTsKKwl1bnNpZ25lZCBsb25nIHJ0X25yX3RvdGFsOworCWludCBvdmVybG9hZGVkOworCXN0cnVjdCBwbGlzdF9oZWFkIHB1c2hhYmxlX3Rhc2tzOworI2VuZGlmCisJaW50IHJ0X3Rocm90dGxlZDsKKwl1NjQgcnRfdGltZTsKKwl1NjQgcnRfcnVudGltZTsKKwkvKiBOZXN0cyBpbnNpZGUgdGhlIHJxIGxvY2s6ICovCisJcmF3X3NwaW5sb2NrX3QgcnRfcnVudGltZV9sb2NrOworCisjaWZkZWYgQ09ORklHX1JUX0dST1VQX1NDSEVECisJdW5zaWduZWQgbG9uZyBydF9ucl9ib29zdGVkOworCisJc3RydWN0IHJxICpycTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxlYWZfcnRfcnFfbGlzdDsKKwlzdHJ1Y3QgdGFza19ncm91cCAqdGc7CisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfU01QCisKKy8qCisgKiBXZSBhZGQgdGhlIG5vdGlvbiBvZiBhIHJvb3QtZG9tYWluIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBkZWZpbmUgcGVyLWRvbWFpbgorICogdmFyaWFibGVzLiBFYWNoIGV4Y2x1c2l2ZSBjcHVzZXQgZXNzZW50aWFsbHkgZGVmaW5lcyBhbiBpc2xhbmQgZG9tYWluIGJ5CisgKiBmdWxseSBwYXJ0aXRpb25pbmcgdGhlIG1lbWJlciBjcHVzIGZyb20gYW55IG90aGVyIGNwdXNldC4gV2hlbmV2ZXIgYSBuZXcKKyAqIGV4Y2x1c2l2ZSBjcHVzZXQgaXMgY3JlYXRlZCwgd2UgYWxzbyBjcmVhdGUgYW5kIGF0dGFjaCBhIG5ldyByb290LWRvbWFpbgorICogb2JqZWN0LgorICoKKyAqLworc3RydWN0IHJvb3RfZG9tYWluIHsKKwlhdG9taWNfdCByZWZjb3VudDsKKwlhdG9taWNfdCBydG9fY291bnQ7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwljcHVtYXNrX3Zhcl90IHNwYW47CisJY3B1bWFza192YXJfdCBvbmxpbmU7CisKKwkvKgorCSAqIFRoZSAiUlQgb3ZlcmxvYWQiIGZsYWc6IGl0IGdldHMgc2V0IGlmIGEgQ1BVIGhhcyBtb3JlIHRoYW4KKwkgKiBvbmUgcnVubmFibGUgUlQgdGFzay4KKwkgKi8KKwljcHVtYXNrX3Zhcl90IHJ0b19tYXNrOworCXN0cnVjdCBjcHVwcmkgY3B1cHJpOworfTsKKworZXh0ZXJuIHN0cnVjdCByb290X2RvbWFpbiBkZWZfcm9vdF9kb21haW47CisKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluLCBwZXItQ1BVIHJ1bnF1ZXVlIGRhdGEgc3RydWN0dXJlLgorICoKKyAqIExvY2tpbmcgcnVsZTogdGhvc2UgcGxhY2VzIHRoYXQgd2FudCB0byBsb2NrIG11bHRpcGxlIHJ1bnF1ZXVlcworICogKHN1Y2ggYXMgdGhlIGxvYWQgYmFsYW5jaW5nIG9yIHRoZSB0aHJlYWQgbWlncmF0aW9uIGNvZGUpLCBsb2NrCisgKiBhY3F1aXJlIG9wZXJhdGlvbnMgbXVzdCBiZSBvcmRlcmVkIGJ5IGFzY2VuZGluZyAmcnVucXVldWUuCisgKi8KK3N0cnVjdCBycSB7CisJLyogcnVucXVldWUgbG9jazogKi8KKwlyYXdfc3BpbmxvY2tfdCBsb2NrOworCisJLyoKKwkgKiBucl9ydW5uaW5nIGFuZCBjcHVfbG9hZCBzaG91bGQgYmUgaW4gdGhlIHNhbWUgY2FjaGVsaW5lIGJlY2F1c2UKKwkgKiByZW1vdGUgQ1BVcyB1c2UgYm90aCB0aGVzZSBmaWVsZHMgd2hlbiBkb2luZyBsb2FkIGNhbGN1bGF0aW9uLgorCSAqLworCXVuc2lnbmVkIGxvbmcgbnJfcnVubmluZzsKKwkjZGVmaW5lIENQVV9MT0FEX0lEWF9NQVggNQorCXVuc2lnbmVkIGxvbmcgY3B1X2xvYWRbQ1BVX0xPQURfSURYX01BWF07CisJdW5zaWduZWQgbG9uZyBsYXN0X2xvYWRfdXBkYXRlX3RpY2s7CisjaWZkZWYgQ09ORklHX05PX0haCisJdTY0IG5vaHpfc3RhbXA7CisJdW5zaWduZWQgbG9uZyBub2h6X2ZsYWdzOworI2VuZGlmCisJaW50IHNraXBfY2xvY2tfdXBkYXRlOworCisJLyogY2FwdHVyZSBsb2FkIGZyb20gKmFsbCogdGFza3Mgb24gdGhpcyBjcHU6ICovCisJc3RydWN0IGxvYWRfd2VpZ2h0IGxvYWQ7CisJdW5zaWduZWQgbG9uZyBucl9sb2FkX3VwZGF0ZXM7CisJdTY0IG5yX3N3aXRjaGVzOworCisJc3RydWN0IGNmc19ycSBjZnM7CisJc3RydWN0IHJ0X3JxIHJ0OworCisjaWZkZWYgQ09ORklHX0ZBSVJfR1JPVVBfU0NIRUQKKwkvKiBsaXN0IG9mIGxlYWYgY2ZzX3JxIG9uIHRoaXMgY3B1OiAqLworCXN0cnVjdCBsaXN0X2hlYWQgbGVhZl9jZnNfcnFfbGlzdDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19SVF9HUk9VUF9TQ0hFRAorCXN0cnVjdCBsaXN0X2hlYWQgbGVhZl9ydF9ycV9saXN0OworI2VuZGlmCisKKwkvKgorCSAqIFRoaXMgaXMgcGFydCBvZiBhIGdsb2JhbCBjb3VudGVyIHdoZXJlIG9ubHkgdGhlIHRvdGFsIHN1bQorCSAqIG92ZXIgYWxsIENQVXMgbWF0dGVycy4gQSB0YXNrIGNhbiBpbmNyZWFzZSB0aGlzIGNvdW50ZXIgb24KKwkgKiBvbmUgQ1BVIGFuZCBpZiBpdCBnb3QgbWlncmF0ZWQgYWZ0ZXJ3YXJkcyBpdCBtYXkgZGVjcmVhc2UKKwkgKiBpdCBvbiBhbm90aGVyIENQVS4gQWx3YXlzIHVwZGF0ZWQgdW5kZXIgdGhlIHJ1bnF1ZXVlIGxvY2s6CisJICovCisJdW5zaWduZWQgbG9uZyBucl91bmludGVycnVwdGlibGU7CisKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIsICppZGxlLCAqc3RvcDsKKwl1bnNpZ25lZCBsb25nIG5leHRfYmFsYW5jZTsKKwlzdHJ1Y3QgbW1fc3RydWN0ICpwcmV2X21tOworCisJdTY0IGNsb2NrOworCXU2NCBjbG9ja190YXNrOworCisJYXRvbWljX3QgbnJfaW93YWl0OworCisjaWZkZWYgQ09ORklHX1NNUAorCXN0cnVjdCByb290X2RvbWFpbiAqcmQ7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisKKwl1bnNpZ25lZCBsb25nIGNwdV9wb3dlcjsKKworCXVuc2lnbmVkIGNoYXIgaWRsZV9iYWxhbmNlOworCS8qIEZvciBhY3RpdmUgYmFsYW5jaW5nICovCisJaW50IHBvc3Rfc2NoZWR1bGU7CisJaW50IGFjdGl2ZV9iYWxhbmNlOworCWludCBwdXNoX2NwdTsKKwlzdHJ1Y3QgY3B1X3N0b3Bfd29yayBhY3RpdmVfYmFsYW5jZV93b3JrOworCS8qIGNwdSBvZiB0aGlzIHJ1bnF1ZXVlOiAqLworCWludCBjcHU7CisJaW50IG9ubGluZTsKKworCXU2NCBydF9hdmc7CisJdTY0IGFnZV9zdGFtcDsKKwl1NjQgaWRsZV9zdGFtcDsKKwl1NjQgYXZnX2lkbGU7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HCisJdTY0IHByZXZfaXJxX3RpbWU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEFSQVZJUlQKKwl1NjQgcHJldl9zdGVhbF90aW1lOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1BBUkFWSVJUX1RJTUVfQUNDT1VOVElORworCXU2NCBwcmV2X3N0ZWFsX3RpbWVfcnE7CisjZW5kaWYKKworCS8qIGNhbGNfbG9hZCByZWxhdGVkIGZpZWxkcyAqLworCXVuc2lnbmVkIGxvbmcgY2FsY19sb2FkX3VwZGF0ZTsKKwlsb25nIGNhbGNfbG9hZF9hY3RpdmU7CisKKyNpZmRlZiBDT05GSUdfU0NIRURfSFJUSUNLCisjaWZkZWYgQ09ORklHX1NNUAorCWludCBocnRpY2tfY3NkX3BlbmRpbmc7CisJc3RydWN0IGNhbGxfc2luZ2xlX2RhdGEgaHJ0aWNrX2NzZDsKKyNlbmRpZgorCXN0cnVjdCBocnRpbWVyIGhydGlja190aW1lcjsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKKwkvKiBsYXRlbmN5IHN0YXRzICovCisJc3RydWN0IHNjaGVkX2luZm8gcnFfc2NoZWRfaW5mbzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgcnFfY3B1X3RpbWU7CisJLyogY291bGQgYWJvdmUgYmUgcnEtPmNmc19ycS5leGVjX2Nsb2NrICsgcnEtPnJ0X3JxLnJ0X3J1bnRpbWUgPyAqLworCisJLyogc3lzX3NjaGVkX3lpZWxkKCkgc3RhdHMgKi8KKwl1bnNpZ25lZCBpbnQgeWxkX2NvdW50OworCisJLyogc2NoZWR1bGUoKSBzdGF0cyAqLworCXVuc2lnbmVkIGludCBzY2hlZF9zd2l0Y2g7CisJdW5zaWduZWQgaW50IHNjaGVkX2NvdW50OworCXVuc2lnbmVkIGludCBzY2hlZF9nb2lkbGU7CisKKwkvKiB0cnlfdG9fd2FrZV91cCgpIHN0YXRzICovCisJdW5zaWduZWQgaW50IHR0d3VfY291bnQ7CisJdW5zaWduZWQgaW50IHR0d3VfbG9jYWw7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19TTVAKKwlzdHJ1Y3QgbGxpc3RfaGVhZCB3YWtlX2xpc3Q7CisjZW5kaWYKK307CisKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9vZihzdHJ1Y3QgcnEgKnJxKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlyZXR1cm4gcnEtPmNwdTsKKyNlbHNlCisJcmV0dXJuIDA7CisjZW5kaWYKK30KKworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCBycSwgcnVucXVldWVzKTsKKworI2RlZmluZSBjcHVfcnEoY3B1KQkJKCZwZXJfY3B1KHJ1bnF1ZXVlcywgKGNwdSkpKQorI2RlZmluZSB0aGlzX3JxKCkJCSgmX19nZXRfY3B1X3ZhcihydW5xdWV1ZXMpKQorI2RlZmluZSB0YXNrX3JxKHApCQljcHVfcnEodGFza19jcHUocCkpCisjZGVmaW5lIGNwdV9jdXJyKGNwdSkJCShjcHVfcnEoY3B1KS0+Y3VycikKKyNkZWZpbmUgcmF3X3JxKCkJCSgmX19yYXdfZ2V0X2NwdV92YXIocnVucXVldWVzKSkKKworI2lmZGVmIENPTkZJR19TTVAKKworI2RlZmluZSByY3VfZGVyZWZlcmVuY2VfY2hlY2tfc2NoZWRfZG9tYWluKHApIFwKKwlyY3VfZGVyZWZlcmVuY2VfY2hlY2soKHApLCBcCisJCQkgICAgICBsb2NrZGVwX2lzX2hlbGQoJnNjaGVkX2RvbWFpbnNfbXV0ZXgpKQorCisvKgorICogVGhlIGRvbWFpbiB0cmVlIChycS0+c2QpIGlzIHByb3RlY3RlZCBieSBSQ1UncyBxdWllc2NlbnQgc3RhdGUgdHJhbnNpdGlvbi4KKyAqIFNlZSBkZXRhY2hfZGVzdHJveV9kb21haW5zOiBzeW5jaHJvbml6ZV9zY2hlZCBmb3IgZGV0YWlscy4KKyAqCisgKiBUaGUgZG9tYWluIHRyZWUgb2YgYW55IENQVSBtYXkgb25seSBiZSBhY2Nlc3NlZCBmcm9tIHdpdGhpbgorICogcHJlZW1wdC1kaXNhYmxlZCBzZWN0aW9ucy4KKyAqLworI2RlZmluZSBmb3JfZWFjaF9kb21haW4oY3B1LCBfX3NkKSBcCisJZm9yIChfX3NkID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrX3NjaGVkX2RvbWFpbihjcHVfcnEoY3B1KS0+c2QpOyBcCisJCQlfX3NkOyBfX3NkID0gX19zZC0+cGFyZW50KQorCisjZGVmaW5lIGZvcl9lYWNoX2xvd2VyX2RvbWFpbihzZCkgZm9yICg7IHNkOyBzZCA9IHNkLT5jaGlsZCkKKworLyoqCisgKiBoaWdoZXN0X2ZsYWdfZG9tYWluIC0gUmV0dXJuIGhpZ2hlc3Qgc2NoZWRfZG9tYWluIGNvbnRhaW5pbmcgZmxhZy4KKyAqIEBjcHU6CVRoZSBjcHUgd2hvc2UgaGlnaGVzdCBsZXZlbCBvZiBzY2hlZCBkb21haW4gaXMgdG8KKyAqCQliZSByZXR1cm5lZC4KKyAqIEBmbGFnOglUaGUgZmxhZyB0byBjaGVjayBmb3IgdGhlIGhpZ2hlc3Qgc2NoZWRfZG9tYWluCisgKgkJZm9yIHRoZSBnaXZlbiBjcHUuCisgKgorICogUmV0dXJucyB0aGUgaGlnaGVzdCBzY2hlZF9kb21haW4gb2YgYSBjcHUgd2hpY2ggY29udGFpbnMgdGhlIGdpdmVuIGZsYWcuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNjaGVkX2RvbWFpbiAqaGlnaGVzdF9mbGFnX2RvbWFpbihpbnQgY3B1LCBpbnQgZmxhZykKK3sKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgKmhzZCA9IE5VTEw7CisKKwlmb3JfZWFjaF9kb21haW4oY3B1LCBzZCkgeworCQlpZiAoIShzZC0+ZmxhZ3MgJiBmbGFnKSkKKwkJCWJyZWFrOworCQloc2QgPSBzZDsKKwl9CisKKwlyZXR1cm4gaHNkOworfQorCitERUNMQVJFX1BFUl9DUFUoc3RydWN0IHNjaGVkX2RvbWFpbiAqLCBzZF9sbGMpOworREVDTEFSRV9QRVJfQ1BVKGludCwgc2RfbGxjX2lkKTsKKworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKworI2luY2x1ZGUgInN0YXRzLmgiCisjaW5jbHVkZSAiYXV0b19ncm91cC5oIgorCisjaWZkZWYgQ09ORklHX0NHUk9VUF9TQ0hFRAorCisvKgorICogUmV0dXJuIHRoZSBncm91cCB0byB3aGljaCB0aGlzIHRhc2tzIGJlbG9uZ3MuCisgKgorICogV2UgdXNlIHRhc2tfc3Vic3lzX3N0YXRlX2NoZWNrKCkgYW5kIGV4dGVuZCB0aGUgUkNVIHZlcmlmaWNhdGlvbiB3aXRoCisgKiBwaS0+bG9jayBhbmQgcnEtPmxvY2sgYmVjYXVzZSBjcHVfY2dyb3VwX2F0dGFjaCgpIGhvbGRzIHRob3NlIGxvY2tzIGZvciBlYWNoCisgKiB0YXNrIGl0IG1vdmVzIGludG8gdGhlIGNncm91cC4gVGhlcmVmb3JlIGJ5IGhvbGRpbmcgZWl0aGVyIG9mIHRob3NlIGxvY2tzLAorICogd2UgcGluIHRoZSB0YXNrIHRvIHRoZSBjdXJyZW50IGNncm91cC4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19ncm91cCAqdGFza19ncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJc3RydWN0IHRhc2tfZ3JvdXAgKnRnOworCXN0cnVjdCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3M7CisKKwljc3MgPSB0YXNrX3N1YnN5c19zdGF0ZV9jaGVjayhwLCBjcHVfY2dyb3VwX3N1YnN5c19pZCwKKwkJCWxvY2tkZXBfaXNfaGVsZCgmcC0+cGlfbG9jaykgfHwKKwkJCWxvY2tkZXBfaXNfaGVsZCgmdGFza19ycShwKS0+bG9jaykpOworCXRnID0gY29udGFpbmVyX29mKGNzcywgc3RydWN0IHRhc2tfZ3JvdXAsIGNzcyk7CisKKwlyZXR1cm4gYXV0b2dyb3VwX3Rhc2tfZ3JvdXAocCwgdGcpOworfQorCisvKiBDaGFuZ2UgYSB0YXNrJ3MgY2ZzX3JxIGFuZCBwYXJlbnQgZW50aXR5IGlmIGl0IG1vdmVzIGFjcm9zcyBDUFVzL2dyb3VwcyAqLworc3RhdGljIGlubGluZSB2b2lkIHNldF90YXNrX3JxKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgaW50IGNwdSkKK3sKKyNpZiBkZWZpbmVkKENPTkZJR19GQUlSX0dST1VQX1NDSEVEKSB8fCBkZWZpbmVkKENPTkZJR19SVF9HUk9VUF9TQ0hFRCkKKwlzdHJ1Y3QgdGFza19ncm91cCAqdGcgPSB0YXNrX2dyb3VwKHApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAorCXAtPnNlLmNmc19ycSA9IHRnLT5jZnNfcnFbY3B1XTsKKwlwLT5zZS5wYXJlbnQgPSB0Zy0+c2VbY3B1XTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1JUX0dST1VQX1NDSEVECisJcC0+cnQucnRfcnEgID0gdGctPnJ0X3JxW2NwdV07CisJcC0+cnQucGFyZW50ID0gdGctPnJ0X3NlW2NwdV07CisjZW5kaWYKK30KKworI2Vsc2UgLyogQ09ORklHX0NHUk9VUF9TQ0hFRCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3Rhc2tfcnEoc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBpbnQgY3B1KSB7IH0KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRhc2tfZ3JvdXAgKnRhc2tfZ3JvdXAoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBOVUxMOworfQorCisjZW5kaWYgLyogQ09ORklHX0NHUk9VUF9TQ0hFRCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgX19zZXRfdGFza19jcHUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBpbnQgY3B1KQoreworCXNldF90YXNrX3JxKHAsIGNwdSk7CisjaWZkZWYgQ09ORklHX1NNUAorCS8qCisJICogQWZ0ZXIgLT5jcHUgaXMgc2V0IHVwIHRvIGEgbmV3IHZhbHVlLCB0YXNrX3JxX2xvY2socCwgLi4uKSBjYW4gYmUKKwkgKiBzdWNjZXNzZnVseSBleGVjdXRlZCBvbiBhbm90aGVyIENQVS4gV2UgbXVzdCBlbnN1cmUgdGhhdCB1cGRhdGVzIG9mCisJICogcGVyLXRhc2sgZGF0YSBoYXZlIGJlZW4gY29tcGxldGVkIGJ5IHRoaXMgbW9tZW50LgorCSAqLworCXNtcF93bWIoKTsKKwl0YXNrX3RocmVhZF9pbmZvKHApLT5jcHUgPSBjcHU7CisjZW5kaWYKK30KKworLyoKKyAqIFR1bmFibGVzIHRoYXQgYmVjb21lIGNvbnN0YW50cyB3aGVuIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBvZmY6CisgKi8KKyNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKKyMgaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgorIyBkZWZpbmUgY29uc3RfZGVidWcgX19yZWFkX21vc3RseQorI2Vsc2UKKyMgZGVmaW5lIGNvbnN0X2RlYnVnIGNvbnN0CisjZW5kaWYKKworZXh0ZXJuIGNvbnN0X2RlYnVnIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRfZmVhdHVyZXM7CisKKyNkZWZpbmUgU0NIRURfRkVBVChuYW1lLCBlbmFibGVkKQlcCisJX19TQ0hFRF9GRUFUXyMjbmFtZSAsCisKK2VudW0geworI2luY2x1ZGUgImZlYXR1cmVzLmgiCisJX19TQ0hFRF9GRUFUX05SLAorfTsKKworI3VuZGVmIFNDSEVEX0ZFQVQKKworI2lmIGRlZmluZWQoQ09ORklHX1NDSEVEX0RFQlVHKSAmJiBkZWZpbmVkKEhBVkVfSlVNUF9MQUJFTCkKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgYm9vbCBzdGF0aWNfYnJhbmNoX190cnVlKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5KQoreworCXJldHVybiBsaWtlbHkoc3RhdGljX2JyYW5jaChrZXkpKTsgLyogTm90IG91dCBvZiBsaW5lIGJyYW5jaC4gKi8KK30KKworc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIHN0YXRpY19icmFuY2hfX2ZhbHNlKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5KQoreworCXJldHVybiB1bmxpa2VseShzdGF0aWNfYnJhbmNoKGtleSkpOyAvKiBPdXQgb2YgbGluZSBicmFuY2guICovCit9CisKKyNkZWZpbmUgU0NIRURfRkVBVChuYW1lLCBlbmFibGVkKQkJCQkJXAorc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIHN0YXRpY19icmFuY2hfIyNuYW1lKHN0cnVjdCBqdW1wX2xhYmVsX2tleSAqa2V5KSBcCit7CQkJCQkJCQkJXAorCXJldHVybiBzdGF0aWNfYnJhbmNoX18jI2VuYWJsZWQoa2V5KTsJCQkJXAorfQorCisjaW5jbHVkZSAiZmVhdHVyZXMuaCIKKworI3VuZGVmIFNDSEVEX0ZFQVQKKworZXh0ZXJuIHN0cnVjdCBqdW1wX2xhYmVsX2tleSBzY2hlZF9mZWF0X2tleXNbX19TQ0hFRF9GRUFUX05SXTsKKyNkZWZpbmUgc2NoZWRfZmVhdCh4KSAoc3RhdGljX2JyYW5jaF8jI3goJnNjaGVkX2ZlYXRfa2V5c1tfX1NDSEVEX0ZFQVRfIyN4XSkpCisjZWxzZSAvKiAhKFNDSEVEX0RFQlVHICYmIEhBVkVfSlVNUF9MQUJFTCkgKi8KKyNkZWZpbmUgc2NoZWRfZmVhdCh4KSAoc3lzY3RsX3NjaGVkX2ZlYXR1cmVzICYgKDFVTCA8PCBfX1NDSEVEX0ZFQVRfIyN4KSkKKyNlbmRpZiAvKiBTQ0hFRF9ERUJVRyAmJiBIQVZFX0pVTVBfTEFCRUwgKi8KKworc3RhdGljIGlubGluZSB1NjQgZ2xvYmFsX3J0X3BlcmlvZCh2b2lkKQoreworCXJldHVybiAodTY0KXN5c2N0bF9zY2hlZF9ydF9wZXJpb2QgKiBOU0VDX1BFUl9VU0VDOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBnbG9iYWxfcnRfcnVudGltZSh2b2lkKQoreworCWlmIChzeXNjdGxfc2NoZWRfcnRfcnVudGltZSA8IDApCisJCXJldHVybiBSVU5USU1FX0lORjsKKworCXJldHVybiAodTY0KXN5c2N0bF9zY2hlZF9ydF9ydW50aW1lICogTlNFQ19QRVJfVVNFQzsKK30KKworCisKK3N0YXRpYyBpbmxpbmUgaW50IHRhc2tfY3VycmVudChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIHJxLT5jdXJyID09IHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHRhc2tfcnVubmluZyhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXJldHVybiBwLT5vbl9jcHU7CisjZWxzZQorCXJldHVybiB0YXNrX2N1cnJlbnQocnEsIHApOworI2VuZGlmCit9CisKKworI2lmbmRlZiBwcmVwYXJlX2FyY2hfc3dpdGNoCisjIGRlZmluZSBwcmVwYXJlX2FyY2hfc3dpdGNoKG5leHQpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorI2lmbmRlZiBmaW5pc2hfYXJjaF9zd2l0Y2gKKyMgZGVmaW5lIGZpbmlzaF9hcmNoX3N3aXRjaChwcmV2KQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2lmbmRlZiBfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVworc3RhdGljIGlubGluZSB2b2lkIHByZXBhcmVfbG9ja19zd2l0Y2goc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQoreworI2lmZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIFdlIGNhbiBvcHRpbWlzZSB0aGlzIG91dCBjb21wbGV0ZWx5IGZvciAhU01QLCBiZWNhdXNlIHRoZQorCSAqIFNNUCByZWJhbGFuY2luZyBmcm9tIGludGVycnVwdCBpcyB0aGUgb25seSB0aGluZyB0aGF0IGNhcmVzCisJICogaGVyZS4KKwkgKi8KKwluZXh0LT5vbl9jcHUgPSAxOworI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaW5pc2hfbG9ja19zd2l0Y2goc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQoreworI2lmZGVmIENPTkZJR19TTVAKKwkvKgorCSAqIEFmdGVyIC0+b25fY3B1IGlzIGNsZWFyZWQsIHRoZSB0YXNrIGNhbiBiZSBtb3ZlZCB0byBhIGRpZmZlcmVudCBDUFUuCisJICogV2UgbXVzdCBlbnN1cmUgdGhpcyBkb2Vzbid0IGhhcHBlbiB1bnRpbCB0aGUgc3dpdGNoIGlzIGNvbXBsZXRlbHkKKwkgKiBmaW5pc2hlZC4KKwkgKi8KKwlzbXBfd21iKCk7CisJcHJldi0+b25fY3B1ID0gMDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSworCS8qIHRoaXMgaXMgYSB2YWxpZCBjYXNlIHdoZW4gYW5vdGhlciB0YXNrIHJlbGVhc2VzIHRoZSBzcGlubG9jayAqLworCXJxLT5sb2NrLm93bmVyID0gY3VycmVudDsKKyNlbmRpZgorCS8qCisJICogSWYgd2UgYXJlIHRyYWNraW5nIHNwaW5sb2NrIGRlcGVuZGVuY2llcyB0aGVuIHdlIGhhdmUgdG8KKwkgKiBmaXggdXAgdGhlIHJ1bnF1ZXVlIGxvY2sgLSB3aGljaCBnZXRzICdjYXJyaWVkIG92ZXInIGZyb20KKwkgKiBwcmV2IGludG8gY3VycmVudDoKKwkgKi8KKwlzcGluX2FjcXVpcmUoJnJxLT5sb2NrLmRlcF9tYXAsIDAsIDAsIF9USElTX0lQXyk7CisKKwlyYXdfc3Bpbl91bmxvY2tfaXJxKCZycS0+bG9jayk7Cit9CisKKyNlbHNlIC8qIF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlcGFyZV9sb2NrX3N3aXRjaChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCS8qCisJICogV2UgY2FuIG9wdGltaXNlIHRoaXMgb3V0IGNvbXBsZXRlbHkgZm9yICFTTVAsIGJlY2F1c2UgdGhlCisJICogU01QIHJlYmFsYW5jaW5nIGZyb20gaW50ZXJydXB0IGlzIHRoZSBvbmx5IHRoaW5nIHRoYXQgY2FyZXMKKwkgKiBoZXJlLgorCSAqLworCW5leHQtPm9uX2NwdSA9IDE7CisjZW5kaWYKKyNpZmRlZiBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXCisJcmF3X3NwaW5fdW5sb2NrX2lycSgmcnEtPmxvY2spOworI2Vsc2UKKwlyYXdfc3Bpbl91bmxvY2soJnJxLT5sb2NrKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX2xvY2tfc3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKK3sKKyNpZmRlZiBDT05GSUdfU01QCisJLyoKKwkgKiBBZnRlciAtPm9uX2NwdSBpcyBjbGVhcmVkLCB0aGUgdGFzayBjYW4gYmUgbW92ZWQgdG8gYSBkaWZmZXJlbnQgQ1BVLgorCSAqIFdlIG11c3QgZW5zdXJlIHRoaXMgZG9lc24ndCBoYXBwZW4gdW50aWwgdGhlIHN3aXRjaCBpcyBjb21wbGV0ZWx5CisJICogZmluaXNoZWQuCisJICovCisJc21wX3dtYigpOworCXByZXYtPm9uX2NwdSA9IDA7CisjZW5kaWYKKyNpZm5kZWYgX19BUkNIX1dBTlRfSU5URVJSVVBUU19PTl9DVFhTVworCWxvY2FsX2lycV9lbmFibGUoKTsKKyNlbmRpZgorfQorI2VuZGlmIC8qIF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXICovCisKKworc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9sb2FkX2FkZChzdHJ1Y3QgbG9hZF93ZWlnaHQgKmx3LCB1bnNpZ25lZCBsb25nIGluYykKK3sKKwlsdy0+d2VpZ2h0ICs9IGluYzsKKwlsdy0+aW52X3dlaWdodCA9IDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVfbG9hZF9zdWIoc3RydWN0IGxvYWRfd2VpZ2h0ICpsdywgdW5zaWduZWQgbG9uZyBkZWMpCit7CisJbHctPndlaWdodCAtPSBkZWM7CisJbHctPmludl93ZWlnaHQgPSAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2xvYWRfc2V0KHN0cnVjdCBsb2FkX3dlaWdodCAqbHcsIHVuc2lnbmVkIGxvbmcgdykKK3sKKwlsdy0+d2VpZ2h0ID0gdzsKKwlsdy0+aW52X3dlaWdodCA9IDA7Cit9CisKKy8qCisgKiBUbyBhaWQgaW4gYXZvaWRpbmcgdGhlIHN1YnZlcnNpb24gb2YgIm5pY2VuZXNzIiBkdWUgdG8gdW5ldmVuIGRpc3RyaWJ1dGlvbgorICogb2YgdGFza3Mgd2l0aCBhYm5vcm1hbCAibmljZSIgdmFsdWVzIGFjcm9zcyBDUFVzIHRoZSBjb250cmlidXRpb24gdGhhdAorICogZWFjaCB0YXNrIG1ha2VzIHRvIGl0cyBydW4gcXVldWUncyBsb2FkIGlzIHdlaWdodGVkIGFjY29yZGluZyB0byBpdHMKKyAqIHNjaGVkdWxpbmcgY2xhc3MgYW5kICJuaWNlIiB2YWx1ZS4gRm9yIFNDSEVEX05PUk1BTCB0YXNrcyB0aGlzIGlzIGp1c3QgYQorICogc2NhbGVkIHZlcnNpb24gb2YgdGhlIG5ldyB0aW1lIHNsaWNlIGFsbG9jYXRpb24gdGhhdCB0aGV5IHJlY2VpdmUgb24gdGltZQorICogc2xpY2UgZXhwaXJ5IGV0Yy4KKyAqLworCisjZGVmaW5lIFdFSUdIVF9JRExFUFJJTyAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFdNVUxUX0lETEVQUklPICAgICAgICAgMTQzMTY1NTc2NQorCisvKgorICogTmljZSBsZXZlbHMgYXJlIG11bHRpcGxpY2F0aXZlLCB3aXRoIGEgZ2VudGxlIDEwJSBjaGFuZ2UgZm9yIGV2ZXJ5CisgKiBuaWNlIGxldmVsIGNoYW5nZWQuIEkuZS4gd2hlbiBhIENQVS1ib3VuZCB0YXNrIGdvZXMgZnJvbSBuaWNlIDAgdG8KKyAqIG5pY2UgMSwgaXQgd2lsbCBnZXQgfjEwJSBsZXNzIENQVSB0aW1lIHRoYW4gYW5vdGhlciBDUFUtYm91bmQgdGFzaworICogdGhhdCByZW1haW5lZCBvbiBuaWNlIDAuCisgKgorICogVGhlICIxMCUgZWZmZWN0IiBpcyByZWxhdGl2ZSBhbmQgY3VtdWxhdGl2ZTogZnJvbSBfYW55XyBuaWNlIGxldmVsLAorICogaWYgeW91IGdvIHVwIDEgbGV2ZWwsIGl0J3MgLTEwJSBDUFUgdXNhZ2UsIGlmIHlvdSBnbyBkb3duIDEgbGV2ZWwKKyAqIGl0J3MgKzEwJSBDUFUgdXNhZ2UuICh0byBhY2hpZXZlIHRoYXQgd2UgdXNlIGEgbXVsdGlwbGllciBvZiAxLjI1LgorICogSWYgYSB0YXNrIGdvZXMgdXAgYnkgfjEwJSBhbmQgYW5vdGhlciB0YXNrIGdvZXMgZG93biBieSB+MTAlIHRoZW4KKyAqIHRoZSByZWxhdGl2ZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZW0gaXMgfjI1JS4pCisgKi8KK3N0YXRpYyBjb25zdCBpbnQgcHJpb190b193ZWlnaHRbNDBdID0geworIC8qIC0yMCAqLyAgICAgODg3NjEsICAgICA3MTc1NSwgICAgIDU2NDgzLCAgICAgNDYyNzMsICAgICAzNjI5MSwKKyAvKiAtMTUgKi8gICAgIDI5MTU0LCAgICAgMjMyNTQsICAgICAxODcwNSwgICAgIDE0OTQ5LCAgICAgMTE5MTYsCisgLyogLTEwICovICAgICAgOTU0OCwgICAgICA3NjIwLCAgICAgIDYxMDAsICAgICAgNDkwNCwgICAgICAzOTA2LAorIC8qICAtNSAqLyAgICAgIDMxMjEsICAgICAgMjUwMSwgICAgICAxOTkxLCAgICAgIDE1ODYsICAgICAgMTI3NywKKyAvKiAgIDAgKi8gICAgICAxMDI0LCAgICAgICA4MjAsICAgICAgIDY1NSwgICAgICAgNTI2LCAgICAgICA0MjMsCisgLyogICA1ICovICAgICAgIDMzNSwgICAgICAgMjcyLCAgICAgICAyMTUsICAgICAgIDE3MiwgICAgICAgMTM3LAorIC8qICAxMCAqLyAgICAgICAxMTAsICAgICAgICA4NywgICAgICAgIDcwLCAgICAgICAgNTYsICAgICAgICA0NSwKKyAvKiAgMTUgKi8gICAgICAgIDM2LCAgICAgICAgMjksICAgICAgICAyMywgICAgICAgIDE4LCAgICAgICAgMTUsCit9OworCisvKgorICogSW52ZXJzZSAoMl4zMi94KSB2YWx1ZXMgb2YgdGhlIHByaW9fdG9fd2VpZ2h0W10gYXJyYXksIHByZWNhbGN1bGF0ZWQuCisgKgorICogSW4gY2FzZXMgd2hlcmUgdGhlIHdlaWdodCBkb2VzIG5vdCBjaGFuZ2Ugb2Z0ZW4sIHdlIGNhbiB1c2UgdGhlCisgKiBwcmVjYWxjdWxhdGVkIGludmVyc2UgdG8gc3BlZWQgdXAgYXJpdGhtZXRpY3MgYnkgdHVybmluZyBkaXZpc2lvbnMKKyAqIGludG8gbXVsdGlwbGljYXRpb25zOgorICovCitzdGF0aWMgY29uc3QgdTMyIHByaW9fdG9fd211bHRbNDBdID0geworIC8qIC0yMCAqLyAgICAgNDgzODgsICAgICA1OTg1NiwgICAgIDc2MDQwLCAgICAgOTI4MTgsICAgIDExODM0OCwKKyAvKiAtMTUgKi8gICAgMTQ3MzIwLCAgICAxODQ2OTgsICAgIDIyOTYxNiwgICAgMjg3MzA4LCAgICAzNjA0MzcsCisgLyogLTEwICovICAgIDQ0OTgyOSwgICAgNTYzNjQ0LCAgICA3MDQwOTMsICAgIDg3NTgwOSwgICAxMDk5NTgyLAorIC8qICAtNSAqLyAgIDEzNzYxNTEsICAgMTcxNzMwMCwgICAyMTU3MTkxLCAgIDI3MDgwNTAsICAgMzM2MzMyNiwKKyAvKiAgIDAgKi8gICA0MTk0MzA0LCAgIDUyMzc3NjUsICAgNjU1NzIwMiwgICA4MTY1MzM3LCAgMTAxNTM1ODcsCisgLyogICA1ICovICAxMjgyMDc5OCwgIDE1NzkwMzIxLCAgMTk5NzY1OTIsICAyNDk3MDc0MCwgIDMxMzUwMTI2LAorIC8qICAxMCAqLyAgMzkwNDUxNTcsICA0OTM2NzQ0MCwgIDYxMzU2Njc2LCAgNzY2OTU4NDQsICA5NTQ0MzcxNywKKyAvKiAgMTUgKi8gMTE5MzA0NjQ3LCAxNDgxMDIzMjAsIDE4NjczNzcwOCwgMjM4NjA5Mjk0LCAyODYzMzExNTMsCit9OworCisvKiBUaW1lIHNwZW50IGJ5IHRoZSB0YXNrcyBvZiB0aGUgY3B1IGFjY291bnRpbmcgZ3JvdXAgZXhlY3V0aW5nIGluIC4uLiAqLworZW51bSBjcHVhY2N0X3N0YXRfaW5kZXggeworCUNQVUFDQ1RfU1RBVF9VU0VSLAkvKiAuLi4gdXNlciBtb2RlICovCisJQ1BVQUNDVF9TVEFUX1NZU1RFTSwJLyogLi4uIGtlcm5lbCBtb2RlICovCisKKwlDUFVBQ0NUX1NUQVRfTlNUQVRTLAorfTsKKworCisjZGVmaW5lIHNjaGVkX2NsYXNzX2hpZ2hlc3QgKCZzdG9wX3NjaGVkX2NsYXNzKQorI2RlZmluZSBmb3JfZWFjaF9jbGFzcyhjbGFzcykgXAorICAgZm9yIChjbGFzcyA9IHNjaGVkX2NsYXNzX2hpZ2hlc3Q7IGNsYXNzOyBjbGFzcyA9IGNsYXNzLT5uZXh0KQorCitleHRlcm4gY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzIHN0b3Bfc2NoZWRfY2xhc3M7CitleHRlcm4gY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzIHJ0X3NjaGVkX2NsYXNzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyBmYWlyX3NjaGVkX2NsYXNzOworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyBpZGxlX3NjaGVkX2NsYXNzOworCisKKyNpZmRlZiBDT05GSUdfU01QCisKK2V4dGVybiB2b2lkIHRyaWdnZXJfbG9hZF9iYWxhbmNlKHN0cnVjdCBycSAqcnEsIGludCBjcHUpOworZXh0ZXJuIHZvaWQgaWRsZV9iYWxhbmNlKGludCB0aGlzX2NwdSwgc3RydWN0IHJxICp0aGlzX3JxKTsKKworI2Vsc2UJLyogQ09ORklHX1NNUCAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgaWRsZV9iYWxhbmNlKGludCBjcHUsIHN0cnVjdCBycSAqcnEpCit7Cit9CisKKyNlbmRpZgorCitleHRlcm4gdm9pZCBzeXNycV9zY2hlZF9kZWJ1Z19zaG93KHZvaWQpOworZXh0ZXJuIHZvaWQgc2NoZWRfaW5pdF9ncmFudWxhcml0eSh2b2lkKTsKK2V4dGVybiB2b2lkIHVwZGF0ZV9tYXhfaW50ZXJ2YWwodm9pZCk7CitleHRlcm4gdm9pZCB1cGRhdGVfZ3JvdXBfcG93ZXIoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpOworZXh0ZXJuIGludCB1cGRhdGVfcnVudGltZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpOworZXh0ZXJuIHZvaWQgaW5pdF9zY2hlZF9ydF9jbGFzcyh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfc2NoZWRfZmFpcl9jbGFzcyh2b2lkKTsKKworZXh0ZXJuIHZvaWQgcmVzY2hlZF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CitleHRlcm4gdm9pZCByZXNjaGVkX2NwdShpbnQgY3B1KTsKKworZXh0ZXJuIHN0cnVjdCBydF9iYW5kd2lkdGggZGVmX3J0X2JhbmR3aWR0aDsKK2V4dGVybiB2b2lkIGluaXRfcnRfYmFuZHdpZHRoKHN0cnVjdCBydF9iYW5kd2lkdGggKnJ0X2IsIHU2NCBwZXJpb2QsIHU2NCBydW50aW1lKTsKKworZXh0ZXJuIHZvaWQgdXBkYXRlX2NwdV9sb2FkKHN0cnVjdCBycSAqdGhpc19ycSk7CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX0NQVUFDQ1QKKyNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KKy8qIHRyYWNrIGNwdSB1c2FnZSBvZiBhIGdyb3VwIG9mIHRhc2tzIGFuZCBpdHMgY2hpbGQgZ3JvdXBzICovCitzdHJ1Y3QgY3B1YWNjdCB7CisJc3RydWN0IGNncm91cF9zdWJzeXNfc3RhdGUgY3NzOworCS8qIGNwdXVzYWdlIGhvbGRzIHBvaW50ZXIgdG8gYSB1NjQtdHlwZSBvYmplY3Qgb24gZXZlcnkgY3B1ICovCisJdTY0IF9fcGVyY3B1ICpjcHV1c2FnZTsKKwlzdHJ1Y3Qga2VybmVsX2NwdXN0YXQgX19wZXJjcHUgKmNwdXN0YXQ7Cit9OworCisvKiByZXR1cm4gY3B1IGFjY291bnRpbmcgZ3JvdXAgY29ycmVzcG9uZGluZyB0byB0aGlzIGNvbnRhaW5lciAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QgY3B1YWNjdCAqY2dyb3VwX2NhKHN0cnVjdCBjZ3JvdXAgKmNncnApCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjZ3JvdXBfc3Vic3lzX3N0YXRlKGNncnAsIGNwdWFjY3Rfc3Vic3lzX2lkKSwKKwkJCSAgICBzdHJ1Y3QgY3B1YWNjdCwgY3NzKTsKK30KKworLyogcmV0dXJuIGNwdSBhY2NvdW50aW5nIGdyb3VwIHRvIHdoaWNoIHRoaXMgdGFzayBiZWxvbmdzICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBjcHVhY2N0ICp0YXNrX2NhKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiBjb250YWluZXJfb2YodGFza19zdWJzeXNfc3RhdGUodHNrLCBjcHVhY2N0X3N1YnN5c19pZCksCisJCQkgICAgc3RydWN0IGNwdWFjY3QsIGNzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNwdWFjY3QgKnBhcmVudF9jYShzdHJ1Y3QgY3B1YWNjdCAqY2EpCit7CisJaWYgKCFjYSB8fCAhY2EtPmNzcy5jZ3JvdXAtPnBhcmVudCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGNncm91cF9jYShjYS0+Y3NzLmNncm91cC0+cGFyZW50KTsKK30KKworZXh0ZXJuIHZvaWQgY3B1YWNjdF9jaGFyZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHU2NCBjcHV0aW1lKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1YWNjdF9jaGFyZ2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHU2NCBjcHV0aW1lKSB7fQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfbnJfcnVubmluZyhzdHJ1Y3QgcnEgKnJxKQoreworCXJxLT5ucl9ydW5uaW5nKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNfbnJfcnVubmluZyhzdHJ1Y3QgcnEgKnJxKQoreworCXJxLT5ucl9ydW5uaW5nLS07Cit9CisKK2V4dGVybiB2b2lkIHVwZGF0ZV9ycV9jbG9jayhzdHJ1Y3QgcnEgKnJxKTsKKworZXh0ZXJuIHZvaWQgYWN0aXZhdGVfdGFzayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBmbGFncyk7CitleHRlcm4gdm9pZCBkZWFjdGl2YXRlX3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgZmxhZ3MpOworCitleHRlcm4gdm9pZCBjaGVja19wcmVlbXB0X2N1cnIoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgZmxhZ3MpOworCitleHRlcm4gY29uc3RfZGVidWcgdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF90aW1lX2F2ZzsKK2V4dGVybiBjb25zdF9kZWJ1ZyB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX25yX21pZ3JhdGU7CitleHRlcm4gY29uc3RfZGVidWcgdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9taWdyYXRpb25fY29zdDsKKworc3RhdGljIGlubGluZSB1NjQgc2NoZWRfYXZnX3BlcmlvZCh2b2lkKQoreworCXJldHVybiAodTY0KXN5c2N0bF9zY2hlZF90aW1lX2F2ZyAqIE5TRUNfUEVSX01TRUMgLyAyOworfQorCit2b2lkIGNhbGNfbG9hZF9hY2NvdW50X2lkbGUoc3RydWN0IHJxICp0aGlzX3JxKTsKKworI2lmZGVmIENPTkZJR19TQ0hFRF9IUlRJQ0sKKworLyoKKyAqIFVzZSBocnRpY2sgd2hlbjoKKyAqICAtIGVuYWJsZWQgYnkgZmVhdHVyZXMKKyAqICAtIGhydGltZXIgaXMgYWN0dWFsbHkgaGlnaCByZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aWNrX2VuYWJsZWQoc3RydWN0IHJxICpycSkKK3sKKwlpZiAoIXNjaGVkX2ZlYXQoSFJUSUNLKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFjcHVfYWN0aXZlKGNwdV9vZihycSkpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaHJ0aW1lcl9pc19ocmVzX2FjdGl2ZSgmcnEtPmhydGlja190aW1lcik7Cit9CisKK3ZvaWQgaHJ0aWNrX3N0YXJ0KHN0cnVjdCBycSAqcnEsIHU2NCBkZWxheSk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IGhydGlja19lbmFibGVkKHN0cnVjdCBycSAqcnEpCit7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU0NIRURfSFJUSUNLICovCisKKyNpZmRlZiBDT05GSUdfU01QCitleHRlcm4gdm9pZCBzY2hlZF9hdmdfdXBkYXRlKHN0cnVjdCBycSAqcnEpOworc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX3J0X2F2Z191cGRhdGUoc3RydWN0IHJxICpycSwgdTY0IHJ0X2RlbHRhKQoreworCXJxLT5ydF9hdmcgKz0gcnRfZGVsdGE7CisJc2NoZWRfYXZnX3VwZGF0ZShycSk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX3J0X2F2Z191cGRhdGUoc3RydWN0IHJxICpycSwgdTY0IHJ0X2RlbHRhKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzY2hlZF9hdmdfdXBkYXRlKHN0cnVjdCBycSAqcnEpIHsgfQorI2VuZGlmCisKK2V4dGVybiB2b2lkIHN0YXJ0X2JhbmR3aWR0aF90aW1lcihzdHJ1Y3QgaHJ0aW1lciAqcGVyaW9kX3RpbWVyLCBrdGltZV90IHBlcmlvZCk7CisKKyNpZmRlZiBDT05GSUdfU01QCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKworc3RhdGljIGlubGluZSB2b2lkIGRvdWJsZV9ycV9sb2NrKHN0cnVjdCBycSAqcnExLCBzdHJ1Y3QgcnEgKnJxMik7CisKKy8qCisgKiBmYWlyIGRvdWJsZV9sb2NrX2JhbGFuY2U6IFNhZmVseSBhY3F1aXJlcyBib3RoIHJxLT5sb2NrcyBpbiBhIGZhaXIKKyAqIHdheSBhdCB0aGUgZXhwZW5zZSBvZiBmb3JjaW5nIGV4dHJhIGF0b21pYyBvcGVyYXRpb25zIGluIGFsbAorICogaW52b2NhdGlvbnMuICBUaGlzIGFzc3VyZXMgdGhhdCB0aGUgZG91YmxlX2xvY2sgaXMgYWNxdWlyZWQgdXNpbmcgdGhlCisgKiBzYW1lIHVuZGVybHlpbmcgcG9saWN5IGFzIHRoZSBzcGlubG9ja190IG9uIHRoaXMgYXJjaGl0ZWN0dXJlLCB3aGljaAorICogcmVkdWNlcyBsYXRlbmN5IGNvbXBhcmVkIHRvIHRoZSB1bmZhaXIgdmFyaWFudCBiZWxvdy4gIEhvd2V2ZXIsIGl0CisgKiBhbHNvIGFkZHMgbW9yZSBvdmVyaGVhZCBhbmQgdGhlcmVmb3JlIG1heSByZWR1Y2UgdGhyb3VnaHB1dC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgX2RvdWJsZV9sb2NrX2JhbGFuY2Uoc3RydWN0IHJxICp0aGlzX3JxLCBzdHJ1Y3QgcnEgKmJ1c2llc3QpCisJX19yZWxlYXNlcyh0aGlzX3JxLT5sb2NrKQorCV9fYWNxdWlyZXMoYnVzaWVzdC0+bG9jaykKKwlfX2FjcXVpcmVzKHRoaXNfcnEtPmxvY2spCit7CisJcmF3X3NwaW5fdW5sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKKwlkb3VibGVfcnFfbG9jayh0aGlzX3JxLCBidXNpZXN0KTsKKworCXJldHVybiAxOworfQorCisjZWxzZQorLyoKKyAqIFVuZmFpciBkb3VibGVfbG9ja19iYWxhbmNlOiBPcHRpbWl6ZXMgdGhyb3VnaHB1dCBhdCB0aGUgZXhwZW5zZSBvZgorICogbGF0ZW5jeSBieSBlbGltaW5hdGluZyBleHRyYSBhdG9taWMgb3BlcmF0aW9ucyB3aGVuIHRoZSBsb2NrcyBhcmUKKyAqIGFscmVhZHkgaW4gcHJvcGVyIG9yZGVyIG9uIGVudHJ5LiAgVGhpcyBmYXZvcnMgbG93ZXIgY3B1LWlkcyBhbmQgd2lsbAorICogZ3JhbnQgdGhlIGRvdWJsZSBsb2NrIHRvIGxvd2VyIGNwdXMgb3ZlciBoaWdoZXIgaWRzIHVuZGVyIGNvbnRlbnRpb24sCisgKiByZWdhcmRsZXNzIG9mIGVudHJ5IG9yZGVyIGludG8gdGhlIGZ1bmN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGludCBfZG91YmxlX2xvY2tfYmFsYW5jZShzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCBycSAqYnVzaWVzdCkKKwlfX3JlbGVhc2VzKHRoaXNfcnEtPmxvY2spCisJX19hY3F1aXJlcyhidXNpZXN0LT5sb2NrKQorCV9fYWNxdWlyZXModGhpc19ycS0+bG9jaykKK3sKKwlpbnQgcmV0ID0gMDsKKworCWlmICh1bmxpa2VseSghcmF3X3NwaW5fdHJ5bG9jaygmYnVzaWVzdC0+bG9jaykpKSB7CisJCWlmIChidXNpZXN0IDwgdGhpc19ycSkgeworCQkJcmF3X3NwaW5fdW5sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKKwkJCXJhd19zcGluX2xvY2soJmJ1c2llc3QtPmxvY2spOworCQkJcmF3X3NwaW5fbG9ja19uZXN0ZWQoJnRoaXNfcnEtPmxvY2ssCisJCQkJCSAgICAgIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwkJCXJldCA9IDE7CisJCX0gZWxzZQorCQkJcmF3X3NwaW5fbG9ja19uZXN0ZWQoJmJ1c2llc3QtPmxvY2ssCisJCQkJCSAgICAgIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworI2VuZGlmIC8qIENPTkZJR19QUkVFTVBUICovCisKKy8qCisgKiBkb3VibGVfbG9ja19iYWxhbmNlIC0gbG9jayB0aGUgYnVzaWVzdCBydW5xdWV1ZSwgdGhpc19ycSBpcyBsb2NrZWQgYWxyZWFkeS4KKyAqLworc3RhdGljIGlubGluZSBpbnQgZG91YmxlX2xvY2tfYmFsYW5jZShzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCBycSAqYnVzaWVzdCkKK3sKKwlpZiAodW5saWtlbHkoIWlycXNfZGlzYWJsZWQoKSkpIHsKKwkJLyogcHJpbnRrKCkgZG9lc24ndCB3b3JrIGdvb2QgdW5kZXIgcnEtPmxvY2sgKi8KKwkJcmF3X3NwaW5fdW5sb2NrKCZ0aGlzX3JxLT5sb2NrKTsKKwkJQlVHX09OKDEpOworCX0KKworCXJldHVybiBfZG91YmxlX2xvY2tfYmFsYW5jZSh0aGlzX3JxLCBidXNpZXN0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRvdWJsZV91bmxvY2tfYmFsYW5jZShzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCBycSAqYnVzaWVzdCkKKwlfX3JlbGVhc2VzKGJ1c2llc3QtPmxvY2spCit7CisJcmF3X3NwaW5fdW5sb2NrKCZidXNpZXN0LT5sb2NrKTsKKwlsb2NrX3NldF9zdWJjbGFzcygmdGhpc19ycS0+bG9jay5kZXBfbWFwLCAwLCBfUkVUX0lQXyk7Cit9CisKKy8qCisgKiBkb3VibGVfcnFfbG9jayAtIHNhZmVseSBsb2NrIHR3byBydW5xdWV1ZXMKKyAqCisgKiBOb3RlIHRoaXMgZG9lcyBub3QgZGlzYWJsZSBpbnRlcnJ1cHRzIGxpa2UgdGFza19ycV9sb2NrLAorICogeW91IG5lZWQgdG8gZG8gc28gbWFudWFsbHkgYmVmb3JlIGNhbGxpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkb3VibGVfcnFfbG9jayhzdHJ1Y3QgcnEgKnJxMSwgc3RydWN0IHJxICpycTIpCisJX19hY3F1aXJlcyhycTEtPmxvY2spCisJX19hY3F1aXJlcyhycTItPmxvY2spCit7CisJQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpOworCWlmIChycTEgPT0gcnEyKSB7CisJCXJhd19zcGluX2xvY2soJnJxMS0+bG9jayk7CisJCV9fYWNxdWlyZShycTItPmxvY2spOwkvKiBGYWtlIGl0IG91dCA7KSAqLworCX0gZWxzZSB7CisJCWlmIChycTEgPCBycTIpIHsKKwkJCXJhd19zcGluX2xvY2soJnJxMS0+bG9jayk7CisJCQlyYXdfc3Bpbl9sb2NrX25lc3RlZCgmcnEyLT5sb2NrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CisJCX0gZWxzZSB7CisJCQlyYXdfc3Bpbl9sb2NrKCZycTItPmxvY2spOworCQkJcmF3X3NwaW5fbG9ja19uZXN0ZWQoJnJxMS0+bG9jaywgU0lOR0xFX0RFUFRIX05FU1RJTkcpOworCQl9CisJfQorfQorCisvKgorICogZG91YmxlX3JxX3VubG9jayAtIHNhZmVseSB1bmxvY2sgdHdvIHJ1bnF1ZXVlcworICoKKyAqIE5vdGUgdGhpcyBkb2VzIG5vdCByZXN0b3JlIGludGVycnVwdHMgbGlrZSB0YXNrX3JxX3VubG9jaywKKyAqIHlvdSBuZWVkIHRvIGRvIHNvIG1hbnVhbGx5IGFmdGVyIGNhbGxpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkb3VibGVfcnFfdW5sb2NrKHN0cnVjdCBycSAqcnExLCBzdHJ1Y3QgcnEgKnJxMikKKwlfX3JlbGVhc2VzKHJxMS0+bG9jaykKKwlfX3JlbGVhc2VzKHJxMi0+bG9jaykKK3sKKwlyYXdfc3Bpbl91bmxvY2soJnJxMS0+bG9jayk7CisJaWYgKHJxMSAhPSBycTIpCisJCXJhd19zcGluX3VubG9jaygmcnEyLT5sb2NrKTsKKwllbHNlCisJCV9fcmVsZWFzZShycTItPmxvY2spOworfQorCisjZWxzZSAvKiBDT05GSUdfU01QICovCisKKy8qCisgKiBkb3VibGVfcnFfbG9jayAtIHNhZmVseSBsb2NrIHR3byBydW5xdWV1ZXMKKyAqCisgKiBOb3RlIHRoaXMgZG9lcyBub3QgZGlzYWJsZSBpbnRlcnJ1cHRzIGxpa2UgdGFza19ycV9sb2NrLAorICogeW91IG5lZWQgdG8gZG8gc28gbWFudWFsbHkgYmVmb3JlIGNhbGxpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkb3VibGVfcnFfbG9jayhzdHJ1Y3QgcnEgKnJxMSwgc3RydWN0IHJxICpycTIpCisJX19hY3F1aXJlcyhycTEtPmxvY2spCisJX19hY3F1aXJlcyhycTItPmxvY2spCit7CisJQlVHX09OKCFpcnFzX2Rpc2FibGVkKCkpOworCUJVR19PTihycTEgIT0gcnEyKTsKKwlyYXdfc3Bpbl9sb2NrKCZycTEtPmxvY2spOworCV9fYWNxdWlyZShycTItPmxvY2spOwkvKiBGYWtlIGl0IG91dCA7KSAqLworfQorCisvKgorICogZG91YmxlX3JxX3VubG9jayAtIHNhZmVseSB1bmxvY2sgdHdvIHJ1bnF1ZXVlcworICoKKyAqIE5vdGUgdGhpcyBkb2VzIG5vdCByZXN0b3JlIGludGVycnVwdHMgbGlrZSB0YXNrX3JxX3VubG9jaywKKyAqIHlvdSBuZWVkIHRvIGRvIHNvIG1hbnVhbGx5IGFmdGVyIGNhbGxpbmcuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkb3VibGVfcnFfdW5sb2NrKHN0cnVjdCBycSAqcnExLCBzdHJ1Y3QgcnEgKnJxMikKKwlfX3JlbGVhc2VzKHJxMS0+bG9jaykKKwlfX3JlbGVhc2VzKHJxMi0+bG9jaykKK3sKKwlCVUdfT04ocnExICE9IHJxMik7CisJcmF3X3NwaW5fdW5sb2NrKCZycTEtPmxvY2spOworCV9fcmVsZWFzZShycTItPmxvY2spOworfQorCisjZW5kaWYKKworZXh0ZXJuIHN0cnVjdCBzY2hlZF9lbnRpdHkgKl9fcGlja19maXJzdF9lbnRpdHkoc3RydWN0IGNmc19ycSAqY2ZzX3JxKTsKK2V4dGVybiBzdHJ1Y3Qgc2NoZWRfZW50aXR5ICpfX3BpY2tfbGFzdF9lbnRpdHkoc3RydWN0IGNmc19ycSAqY2ZzX3JxKTsKK2V4dGVybiB2b2lkIHByaW50X2Nmc19zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGludCBjcHUpOworZXh0ZXJuIHZvaWQgcHJpbnRfcnRfc3RhdHMoc3RydWN0IHNlcV9maWxlICptLCBpbnQgY3B1KTsKKworZXh0ZXJuIHZvaWQgaW5pdF9jZnNfcnEoc3RydWN0IGNmc19ycSAqY2ZzX3JxKTsKK2V4dGVybiB2b2lkIGluaXRfcnRfcnEoc3RydWN0IHJ0X3JxICpydF9ycSwgc3RydWN0IHJxICpycSk7CitleHRlcm4gdm9pZCB1bnRocm90dGxlX29mZmxpbmVfY2ZzX3JxcyhzdHJ1Y3QgcnEgKnJxKTsKKworZXh0ZXJuIHZvaWQgYWNjb3VudF9jZnNfYmFuZHdpZHRoX3VzZWQoaW50IGVuYWJsZWQsIGludCB3YXNfZW5hYmxlZCk7CisKKyNpZmRlZiBDT05GSUdfTk9fSFoKK2VudW0gcnFfbm9oel9mbGFnX2JpdHMgeworCU5PSFpfVElDS19TVE9QUEVELAorCU5PSFpfQkFMQU5DRV9LSUNLLAorCU5PSFpfSURMRSwKK307CisKKyNkZWZpbmUgbm9oel9mbGFncyhjcHUpCSgmY3B1X3JxKGNwdSktPm5vaHpfZmxhZ3MpCisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9zY2hlZC9zdGF0cy5jIGIva2VybmVsL3NjaGVkL3N0YXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE1ODFiYQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9zY2hlZC9zdGF0cy5jCkBAIC0wLDAgKzEsMTExIEBACisKKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKworI2luY2x1ZGUgInNjaGVkLmgiCisKKy8qCisgKiBidW1wIHRoaXMgdXAgd2hlbiBjaGFuZ2luZyB0aGUgb3V0cHV0IGZvcm1hdCBvciB0aGUgbWVhbmluZyBvZiBhbiBleGlzdGluZworICogZm9ybWF0LCBzbyB0aGF0IHRvb2xzIGNhbiBhZGFwdCAob3IgYWJvcnQpCisgKi8KKyNkZWZpbmUgU0NIRURTVEFUX1ZFUlNJT04gMTUKKworc3RhdGljIGludCBzaG93X3NjaGVkc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKK3sKKwlpbnQgY3B1OworCWludCBtYXNrX2xlbiA9IERJVl9ST1VORF9VUChOUl9DUFVTLCAzMikgKiA5OworCWNoYXIgKm1hc2tfc3RyID0ga21hbGxvYyhtYXNrX2xlbiwgR0ZQX0tFUk5FTCk7CisKKwlpZiAobWFza19zdHIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzZXFfcHJpbnRmKHNlcSwgInZlcnNpb24gJWRcbiIsIFNDSEVEU1RBVF9WRVJTSU9OKTsKKwlzZXFfcHJpbnRmKHNlcSwgInRpbWVzdGFtcCAlbHVcbiIsIGppZmZpZXMpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKKyNpZmRlZiBDT05GSUdfU01QCisJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCQlpbnQgZGNvdW50ID0gMDsKKyNlbmRpZgorCisJCS8qIHJ1bnF1ZXVlLXNwZWNpZmljIHN0YXRzICovCisJCXNlcV9wcmludGYoc2VxLAorCQkgICAgImNwdSVkICV1ICV1ICV1ICV1ICV1ICV1ICVsbHUgJWxsdSAlbHUiLAorCQkgICAgY3B1LCBycS0+eWxkX2NvdW50LAorCQkgICAgcnEtPnNjaGVkX3N3aXRjaCwgcnEtPnNjaGVkX2NvdW50LCBycS0+c2NoZWRfZ29pZGxlLAorCQkgICAgcnEtPnR0d3VfY291bnQsIHJxLT50dHd1X2xvY2FsLAorCQkgICAgcnEtPnJxX2NwdV90aW1lLAorCQkgICAgcnEtPnJxX3NjaGVkX2luZm8ucnVuX2RlbGF5LCBycS0+cnFfc2NoZWRfaW5mby5wY291bnQpOworCisJCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKKworI2lmZGVmIENPTkZJR19TTVAKKwkJLyogZG9tYWluLXNwZWNpZmljIHN0YXRzICovCisJCXJjdV9yZWFkX2xvY2soKTsKKwkJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpIHsKKwkJCWVudW0gY3B1X2lkbGVfdHlwZSBpdHlwZTsKKworCQkJY3B1bWFza19zY25wcmludGYobWFza19zdHIsIG1hc2tfbGVuLAorCQkJCQkgIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgImRvbWFpbiVkICVzIiwgZGNvdW50KyssIG1hc2tfc3RyKTsKKwkJCWZvciAoaXR5cGUgPSBDUFVfSURMRTsgaXR5cGUgPCBDUFVfTUFYX0lETEVfVFlQRVM7CisJCQkJCWl0eXBlKyspIHsKKwkJCQlzZXFfcHJpbnRmKHNlcSwgIiAldSAldSAldSAldSAldSAldSAldSAldSIsCisJCQkJICAgIHNkLT5sYl9jb3VudFtpdHlwZV0sCisJCQkJICAgIHNkLT5sYl9iYWxhbmNlZFtpdHlwZV0sCisJCQkJICAgIHNkLT5sYl9mYWlsZWRbaXR5cGVdLAorCQkJCSAgICBzZC0+bGJfaW1iYWxhbmNlW2l0eXBlXSwKKwkJCQkgICAgc2QtPmxiX2dhaW5lZFtpdHlwZV0sCisJCQkJICAgIHNkLT5sYl9ob3RfZ2FpbmVkW2l0eXBlXSwKKwkJCQkgICAgc2QtPmxiX25vYnVzeXFbaXR5cGVdLAorCQkJCSAgICBzZC0+bGJfbm9idXN5Z1tpdHlwZV0pOworCQkJfQorCQkJc2VxX3ByaW50ZihzZXEsCisJCQkJICAgIiAldSAldSAldSAldSAldSAldSAldSAldSAldSAldSAldSAldVxuIiwKKwkJCSAgICBzZC0+YWxiX2NvdW50LCBzZC0+YWxiX2ZhaWxlZCwgc2QtPmFsYl9wdXNoZWQsCisJCQkgICAgc2QtPnNiZV9jb3VudCwgc2QtPnNiZV9iYWxhbmNlZCwgc2QtPnNiZV9wdXNoZWQsCisJCQkgICAgc2QtPnNiZl9jb3VudCwgc2QtPnNiZl9iYWxhbmNlZCwgc2QtPnNiZl9wdXNoZWQsCisJCQkgICAgc2QtPnR0d3Vfd2FrZV9yZW1vdGUsIHNkLT50dHd1X21vdmVfYWZmaW5lLAorCQkJICAgIHNkLT50dHd1X21vdmVfYmFsYW5jZSk7CisJCX0KKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisjZW5kaWYKKwl9CisJa2ZyZWUobWFza19zdHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjaGVkc3RhdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBzaXplID0gUEFHRV9TSVpFICogKDEgKyBudW1fb25saW5lX2NwdXMoKSAvIDMyKTsKKwljaGFyICpidWYgPSBrbWFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCXN0cnVjdCBzZXFfZmlsZSAqbTsKKwlpbnQgcmVzOworCisJaWYgKCFidWYpCisJCXJldHVybiAtRU5PTUVNOworCXJlcyA9IHNpbmdsZV9vcGVuKGZpbGUsIHNob3dfc2NoZWRzdGF0LCBOVUxMKTsKKwlpZiAoIXJlcykgeworCQltID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCQltLT5idWYgPSBidWY7CisJCW0tPnNpemUgPSBzaXplOworCX0gZWxzZQorCQlrZnJlZShidWYpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHByb2Nfc2NoZWRzdGF0X29wZXJhdGlvbnMgPSB7CisJLm9wZW4gICAgPSBzY2hlZHN0YXRfb3BlbiwKKwkucmVhZCAgICA9IHNlcV9yZWFkLAorCS5sbHNlZWsgID0gc2VxX2xzZWVrLAorCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcm9jX3NjaGVkc3RhdF9pbml0KHZvaWQpCit7CisJcHJvY19jcmVhdGUoInNjaGVkc3RhdCIsIDAsIE5VTEwsICZwcm9jX3NjaGVkc3RhdF9vcGVyYXRpb25zKTsKKwlyZXR1cm4gMDsKK30KK21vZHVsZV9pbml0KHByb2Nfc2NoZWRzdGF0X2luaXQpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX3N0YXRzLmggYi9rZXJuZWwvc2NoZWQvc3RhdHMuaApzaW1pbGFyaXR5IGluZGV4IDcwJQpyZW5hbWUgZnJvbSBrZXJuZWwvc2NoZWRfc3RhdHMuaApyZW5hbWUgdG8ga2VybmVsL3NjaGVkL3N0YXRzLmgKaW5kZXggODdmOWUzNi4uMmVmOTBhNSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX3N0YXRzLmgKKysrIGIva2VybmVsL3NjaGVkL3N0YXRzLmgKQEAgLTEsMTA4ICsxLDUgQEAKIAogI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCi0vKgotICogYnVtcCB0aGlzIHVwIHdoZW4gY2hhbmdpbmcgdGhlIG91dHB1dCBmb3JtYXQgb3IgdGhlIG1lYW5pbmcgb2YgYW4gZXhpc3RpbmcKLSAqIGZvcm1hdCwgc28gdGhhdCB0b29scyBjYW4gYWRhcHQgKG9yIGFib3J0KQotICovCi0jZGVmaW5lIFNDSEVEU1RBVF9WRVJTSU9OIDE1Ci0KLXN0YXRpYyBpbnQgc2hvd19zY2hlZHN0YXQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCi17Ci0JaW50IGNwdTsKLQlpbnQgbWFza19sZW4gPSBESVZfUk9VTkRfVVAoTlJfQ1BVUywgMzIpICogOTsKLQljaGFyICptYXNrX3N0ciA9IGttYWxsb2MobWFza19sZW4sIEdGUF9LRVJORUwpOwotCi0JaWYgKG1hc2tfc3RyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0Jc2VxX3ByaW50ZihzZXEsICJ2ZXJzaW9uICVkXG4iLCBTQ0hFRFNUQVRfVkVSU0lPTik7Ci0Jc2VxX3ByaW50ZihzZXEsICJ0aW1lc3RhbXAgJWx1XG4iLCBqaWZmaWVzKTsKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgewotCQlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7Ci0jaWZkZWYgQ09ORklHX1NNUAotCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQkJaW50IGRjb3VudCA9IDA7Ci0jZW5kaWYKLQotCQkvKiBydW5xdWV1ZS1zcGVjaWZpYyBzdGF0cyAqLwotCQlzZXFfcHJpbnRmKHNlcSwKLQkJICAgICJjcHUlZCAldSAldSAldSAldSAldSAldSAlbGx1ICVsbHUgJWx1IiwKLQkJICAgIGNwdSwgcnEtPnlsZF9jb3VudCwKLQkJICAgIHJxLT5zY2hlZF9zd2l0Y2gsIHJxLT5zY2hlZF9jb3VudCwgcnEtPnNjaGVkX2dvaWRsZSwKLQkJICAgIHJxLT50dHd1X2NvdW50LCBycS0+dHR3dV9sb2NhbCwKLQkJICAgIHJxLT5ycV9jcHVfdGltZSwKLQkJICAgIHJxLT5ycV9zY2hlZF9pbmZvLnJ1bl9kZWxheSwgcnEtPnJxX3NjaGVkX2luZm8ucGNvdW50KTsKLQotCQlzZXFfcHJpbnRmKHNlcSwgIlxuIik7Ci0KLSNpZmRlZiBDT05GSUdfU01QCi0JCS8qIGRvbWFpbi1zcGVjaWZpYyBzdGF0cyAqLwotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKSB7Ci0JCQllbnVtIGNwdV9pZGxlX3R5cGUgaXR5cGU7Ci0KLQkJCWNwdW1hc2tfc2NucHJpbnRmKG1hc2tfc3RyLCBtYXNrX2xlbiwKLQkJCQkJICBzY2hlZF9kb21haW5fc3BhbihzZCkpOwotCQkJc2VxX3ByaW50ZihzZXEsICJkb21haW4lZCAlcyIsIGRjb3VudCsrLCBtYXNrX3N0cik7Ci0JCQlmb3IgKGl0eXBlID0gQ1BVX0lETEU7IGl0eXBlIDwgQ1BVX01BWF9JRExFX1RZUEVTOwotCQkJCQlpdHlwZSsrKSB7Ci0JCQkJc2VxX3ByaW50ZihzZXEsICIgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUiLAotCQkJCSAgICBzZC0+bGJfY291bnRbaXR5cGVdLAotCQkJCSAgICBzZC0+bGJfYmFsYW5jZWRbaXR5cGVdLAotCQkJCSAgICBzZC0+bGJfZmFpbGVkW2l0eXBlXSwKLQkJCQkgICAgc2QtPmxiX2ltYmFsYW5jZVtpdHlwZV0sCi0JCQkJICAgIHNkLT5sYl9nYWluZWRbaXR5cGVdLAotCQkJCSAgICBzZC0+bGJfaG90X2dhaW5lZFtpdHlwZV0sCi0JCQkJICAgIHNkLT5sYl9ub2J1c3lxW2l0eXBlXSwKLQkJCQkgICAgc2QtPmxiX25vYnVzeWdbaXR5cGVdKTsKLQkJCX0KLQkJCXNlcV9wcmludGYoc2VxLAotCQkJCSAgICIgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXUgJXVcbiIsCi0JCQkgICAgc2QtPmFsYl9jb3VudCwgc2QtPmFsYl9mYWlsZWQsIHNkLT5hbGJfcHVzaGVkLAotCQkJICAgIHNkLT5zYmVfY291bnQsIHNkLT5zYmVfYmFsYW5jZWQsIHNkLT5zYmVfcHVzaGVkLAotCQkJICAgIHNkLT5zYmZfY291bnQsIHNkLT5zYmZfYmFsYW5jZWQsIHNkLT5zYmZfcHVzaGVkLAotCQkJICAgIHNkLT50dHd1X3dha2VfcmVtb3RlLCBzZC0+dHR3dV9tb3ZlX2FmZmluZSwKLQkJCSAgICBzZC0+dHR3dV9tb3ZlX2JhbGFuY2UpOwotCQl9Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotI2VuZGlmCi0JfQotCWtmcmVlKG1hc2tfc3RyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzY2hlZHN0YXRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKLXsKLQl1bnNpZ25lZCBpbnQgc2l6ZSA9IFBBR0VfU0laRSAqICgxICsgbnVtX29ubGluZV9jcHVzKCkgLyAzMik7Ci0JY2hhciAqYnVmID0ga21hbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlzdHJ1Y3Qgc2VxX2ZpbGUgKm07Ci0JaW50IHJlczsKLQotCWlmICghYnVmKQotCQlyZXR1cm4gLUVOT01FTTsKLQlyZXMgPSBzaW5nbGVfb3BlbihmaWxlLCBzaG93X3NjaGVkc3RhdCwgTlVMTCk7Ci0JaWYgKCFyZXMpIHsKLQkJbSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKLQkJbS0+YnVmID0gYnVmOwotCQltLT5zaXplID0gc2l6ZTsKLQl9IGVsc2UKLQkJa2ZyZWUoYnVmKTsKLQlyZXR1cm4gcmVzOwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBwcm9jX3NjaGVkc3RhdF9vcGVyYXRpb25zID0gewotCS5vcGVuICAgID0gc2NoZWRzdGF0X29wZW4sCi0JLnJlYWQgICAgPSBzZXFfcmVhZCwKLQkubGxzZWVrICA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotc3RhdGljIGludCBfX2luaXQgcHJvY19zY2hlZHN0YXRfaW5pdCh2b2lkKQotewotCXByb2NfY3JlYXRlKCJzY2hlZHN0YXQiLCAwLCBOVUxMLCAmcHJvY19zY2hlZHN0YXRfb3BlcmF0aW9ucyk7Ci0JcmV0dXJuIDA7Ci19Ci1tb2R1bGVfaW5pdChwcm9jX3NjaGVkc3RhdF9pbml0KTsKIAogLyoKICAqIEV4cGVjdHMgcnVucXVldWUgbG9jayB0byBiZSBoZWxkIGZvciBhdG9taWNpdHkgb2YgdXBkYXRlCkBAIC0yODMsOCArMTgwLDcgQEAKIAkJcmV0dXJuOwogCiAJcmF3X3NwaW5fbG9jaygmY3B1dGltZXItPmxvY2spOwotCWNwdXRpbWVyLT5jcHV0aW1lLnV0aW1lID0KLQkJY3B1dGltZV9hZGQoY3B1dGltZXItPmNwdXRpbWUudXRpbWUsIGNwdXRpbWUpOworCWNwdXRpbWVyLT5jcHV0aW1lLnV0aW1lICs9IGNwdXRpbWU7CiAJcmF3X3NwaW5fdW5sb2NrKCZjcHV0aW1lci0+bG9jayk7CiB9CiAKQEAgLTMwNyw4ICsyMDMsNyBAQAogCQlyZXR1cm47CiAKIAlyYXdfc3Bpbl9sb2NrKCZjcHV0aW1lci0+bG9jayk7Ci0JY3B1dGltZXItPmNwdXRpbWUuc3RpbWUgPQotCQljcHV0aW1lX2FkZChjcHV0aW1lci0+Y3B1dGltZS5zdGltZSwgY3B1dGltZSk7CisJY3B1dGltZXItPmNwdXRpbWUuc3RpbWUgKz0gY3B1dGltZTsKIAlyYXdfc3Bpbl91bmxvY2soJmNwdXRpbWVyLT5sb2NrKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX3N0b3B0YXNrLmMgYi9rZXJuZWwvc2NoZWQvc3RvcF90YXNrLmMKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20ga2VybmVsL3NjaGVkX3N0b3B0YXNrLmMKcmVuYW1lIHRvIGtlcm5lbC9zY2hlZC9zdG9wX3Rhc2suYwppbmRleCA4YjQ0ZTdmLi43YjM4NmU4IDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfc3RvcHRhc2suYworKysgYi9rZXJuZWwvc2NoZWQvc3RvcF90YXNrLmMKQEAgLTEsMyArMSw1IEBACisjaW5jbHVkZSAic2NoZWQuaCIKKwogLyoKICAqIHN0b3AtdGFzayBzY2hlZHVsaW5nIGNsYXNzLgogICoKQEAgLTgwLDcgKzgyLDcgQEAKIC8qCiAgKiBTaW1wbGUsIHNwZWNpYWwgc2NoZWR1bGluZyBjbGFzcyBmb3IgdGhlIHBlci1DUFUgc3RvcCB0YXNrczoKICAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBzY2hlZF9jbGFzcyBzdG9wX3NjaGVkX2NsYXNzID0geworY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzIHN0b3Bfc2NoZWRfY2xhc3MgPSB7CiAJLm5leHQJCQk9ICZydF9zY2hlZF9jbGFzcywKIAogCS5lbnF1ZXVlX3Rhc2sJCT0gZW5xdWV1ZV90YXNrX3N0b3AsCmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggYjNmNzhkMC4uNTZjZTNhNiAxMDA2NDQKLS0tIGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2tlcm5lbC9zaWduYWwuYwpAQCAtMTYyOSwxMCArMTYyOSw4IEBACiAJaW5mby5zaV91aWQgPSBfX3Rhc2tfY3JlZCh0c2spLT51aWQ7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlpbmZvLnNpX3V0aW1lID0gY3B1dGltZV90b19jbG9ja190KGNwdXRpbWVfYWRkKHRzay0+dXRpbWUsCi0JCQkJdHNrLT5zaWduYWwtPnV0aW1lKSk7Ci0JaW5mby5zaV9zdGltZSA9IGNwdXRpbWVfdG9fY2xvY2tfdChjcHV0aW1lX2FkZCh0c2stPnN0aW1lLAotCQkJCXRzay0+c2lnbmFsLT5zdGltZSkpOworCWluZm8uc2lfdXRpbWUgPSBjcHV0aW1lX3RvX2Nsb2NrX3QodHNrLT51dGltZSArIHRzay0+c2lnbmFsLT51dGltZSk7CisJaW5mby5zaV9zdGltZSA9IGNwdXRpbWVfdG9fY2xvY2tfdCh0c2stPnN0aW1lICsgdHNrLT5zaWduYWwtPnN0aW1lKTsKIAogCWluZm8uc2lfc3RhdHVzID0gdHNrLT5leGl0X2NvZGUgJiAweDdmOwogCWlmICh0c2stPmV4aXRfY29kZSAmIDB4ODApCkBAIC0xOTk0LDggKzE5OTIsNiBAQAogCQkgKi8KIAkJaWYgKCEoc2lnLT5mbGFncyAmIFNJR05BTF9TVE9QX1NUT1BQRUQpKQogCQkJc2lnLT5ncm91cF9leGl0X2NvZGUgPSBzaWducjsKLQkJZWxzZQotCQkJV0FSTl9PTl9PTkNFKCFjdXJyZW50LT5wdHJhY2UpOwogCiAJCXNpZy0+Z3JvdXBfc3RvcF9jb3VudCA9IDA7CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0aXJxLmMgYi9rZXJuZWwvc29mdGlycS5jCmluZGV4IDJjNzFkOTEuLjRlYjNhMGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0aXJxLmMKKysrIGIva2VybmVsL3NvZnRpcnEuYwpAQCAtMzQ3LDEyICszNDcsMTIgQEAKIAlpZiAoIWluX2ludGVycnVwdCgpICYmIGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKQogCQlpbnZva2Vfc29mdGlycSgpOwogCi0JcmN1X2lycV9leGl0KCk7CiAjaWZkZWYgQ09ORklHX05PX0haCiAJLyogTWFrZSBzdXJlIHRoYXQgdGltZXIgd2hlZWwgdXBkYXRlcyBhcmUgcHJvcGFnYXRlZCAqLwogCWlmIChpZGxlX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpICYmICFpbl9pbnRlcnJ1cHQoKSAmJiAhbmVlZF9yZXNjaGVkKCkpCi0JCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soMCk7CisJCXRpY2tfbm9oel9pcnFfZXhpdCgpOwogI2VuZGlmCisJcmN1X2lycV9leGl0KCk7CiAJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzLmMgYi9rZXJuZWwvc3lzLmMKaW5kZXggNDgxNjExZi4uZGRmODE1NSAxMDA2NDQKLS0tIGEva2VybmVsL3N5cy5jCisrKyBiL2tlcm5lbC9zeXMuYwpAQCAtMTYwNSw3ICsxNjA1LDcgQEAKIAl1bnNpZ25lZCBsb25nIG1heHJzcyA9IDA7CiAKIAltZW1zZXQoKGNoYXIgKikgciwgMCwgc2l6ZW9mICpyKTsKLQl1dGltZSA9IHN0aW1lID0gY3B1dGltZV96ZXJvOworCXV0aW1lID0gc3RpbWUgPSAwOwogCiAJaWYgKHdobyA9PSBSVVNBR0VfVEhSRUFEKSB7CiAJCXRhc2tfdGltZXMoY3VycmVudCwgJnV0aW1lLCAmc3RpbWUpOwpAQCAtMTYzNSw4ICsxNjM1LDggQEAKIAogCQljYXNlIFJVU0FHRV9TRUxGOgogCQkJdGhyZWFkX2dyb3VwX3RpbWVzKHAsICZ0Z3V0aW1lLCAmdGdzdGltZSk7Ci0JCQl1dGltZSA9IGNwdXRpbWVfYWRkKHV0aW1lLCB0Z3V0aW1lKTsKLQkJCXN0aW1lID0gY3B1dGltZV9hZGQoc3RpbWUsIHRnc3RpbWUpOworCQkJdXRpbWUgKz0gdGd1dGltZTsKKwkJCXN0aW1lICs9IHRnc3RpbWU7CiAJCQlyLT5ydV9udmNzdyArPSBwLT5zaWduYWwtPm52Y3N3OwogCQkJci0+cnVfbml2Y3N3ICs9IHAtPnNpZ25hbC0+bml2Y3N3OwogCQkJci0+cnVfbWluZmx0ICs9IHAtPnNpZ25hbC0+bWluX2ZsdDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zeXNjdGxfYmluYXJ5LmMgYi9rZXJuZWwvc3lzY3RsX2JpbmFyeS5jCmluZGV4IDYzMThiNTEuLmE2NTA2OTQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGxfYmluYXJ5LmMKKysrIGIva2VybmVsL3N5c2N0bF9iaW5hcnkuYwpAQCAtMTM1NCw3ICsxMzU0LDcgQEAKIAogCWZwdXQoZmlsZSk7CiBvdXRfcHV0bmFtZToKLQlwdXRuYW1lKHBhdGhuYW1lKTsKKwlfX3B1dG5hbWUocGF0aG5hbWUpOwogb3V0OgogCXJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9hbGFybXRpbWVyLmMgYi9rZXJuZWwvdGltZS9hbGFybXRpbWVyLmMKaW5kZXggYzQzNmU3OS4uOGE0NmY1ZCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvYWxhcm10aW1lci5jCisrKyBiL2tlcm5lbC90aW1lL2FsYXJtdGltZXIuYwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJCXN0cnVjdCBhbGFybSAqYWxhcm07CiAJCWt0aW1lX3QgZXhwaXJlZCA9IG5leHQtPmV4cGlyZXM7CiAKLQkJaWYgKGV4cGlyZWQudHY2NCA+PSBub3cudHY2NCkKKwkJaWYgKGV4cGlyZWQudHY2NCA+IG5vdy50djY0KQogCQkJYnJlYWs7CiAKIAkJYWxhcm0gPSBjb250YWluZXJfb2YobmV4dCwgc3RydWN0IGFsYXJtLCBub2RlKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCmluZGV4IGNmYzY1ZTEuLmQzYWQwMjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpAQCAtNTQ4LDcgKzU0OCw3IEBACiAJICogbm90ZSBhIG1hcmdpbiBvZiAxMi41JSBpcyB1c2VkIGJlY2F1c2UgdGhpcyBjYW4gYmUgY29tcHV0ZWQgd2l0aAogCSAqIGEgc2hpZnQsIHZlcnN1cyBzYXkgMTAlIHdoaWNoIHdvdWxkIHJlcXVpcmUgZGl2aXNpb24uCiAJICovCi0JcmV0dXJuIG1heF9uc2VjcyAtIChtYXhfbnNlY3MgPj4gNSk7CisJcmV0dXJuIG1heF9uc2VjcyAtIChtYXhfbnNlY3MgPj4gMyk7CiB9CiAKICNpZm5kZWYgQ09ORklHX0FSQ0hfVVNFU19HRVRUSU1FT0ZGU0VUCkBAIC02NDcsNyArNjQ3LDcgQEAKIAogLyoqCiAgKiBfX2Nsb2Nrc291cmNlX3VwZGF0ZWZyZXFfc2NhbGUgLSBVc2VkIHVwZGF0ZSBjbG9ja3NvdXJjZSB3aXRoIG5ldyBmcmVxCi0gKiBAdDoJCWNsb2Nrc291cmNlIHRvIGJlIHJlZ2lzdGVyZWQKKyAqIEBjczoJCWNsb2Nrc291cmNlIHRvIGJlIHJlZ2lzdGVyZWQKICAqIEBzY2FsZToJU2NhbGUgZmFjdG9yIG11bHRpcGxpZWQgYWdhaW5zdCBmcmVxIHRvIGdldCBjbG9ja3NvdXJjZSBoegogICogQGZyZXE6CWNsb2Nrc291cmNlIGZyZXF1ZW5jeSAoY3ljbGVzIHBlciBzZWNvbmQpIGRpdmlkZWQgYnkgc2NhbGUKICAqCkBAIC02NjksNyArNjY5LDcgQEAKIAkgKiB+IDAuMDZwcG0gZ3JhbnVsYXJpdHkgZm9yIE5UUC4gV2UgYXBwbHkgdGhlIHNhbWUgMTIuNSUKIAkgKiBtYXJnaW4gYXMgd2UgZG8gaW4gY2xvY2tzb3VyY2VfbWF4X2RlZmVybWVudCgpCiAJICovCi0Jc2VjID0gKGNzLT5tYXNrIC0gKGNzLT5tYXNrID4+IDUpKTsKKwlzZWMgPSAoY3MtPm1hc2sgLSAoY3MtPm1hc2sgPj4gMykpOwogCWRvX2RpdihzZWMsIGZyZXEpOwogCWRvX2RpdihzZWMsIHNjYWxlKTsKIAlpZiAoIXNlYykKQEAgLTY5OSw3ICs2OTksNyBAQAogCiAvKioKICAqIF9fY2xvY2tzb3VyY2VfcmVnaXN0ZXJfc2NhbGUgLSBVc2VkIHRvIGluc3RhbGwgbmV3IGNsb2Nrc291cmNlcwotICogQHQ6CQljbG9ja3NvdXJjZSB0byBiZSByZWdpc3RlcmVkCisgKiBAY3M6CQljbG9ja3NvdXJjZSB0byBiZSByZWdpc3RlcmVkCiAgKiBAc2NhbGU6CVNjYWxlIGZhY3RvciBtdWx0aXBsaWVkIGFnYWluc3QgZnJlcSB0byBnZXQgY2xvY2tzb3VyY2UgaHoKICAqIEBmcmVxOgljbG9ja3NvdXJjZSBmcmVxdWVuY3kgKGN5Y2xlcyBwZXIgc2Vjb25kKSBkaXZpZGVkIGJ5IHNjYWxlCiAgKgpAQCAtNzI3LDcgKzcyNyw3IEBACiAKIC8qKgogICogY2xvY2tzb3VyY2VfcmVnaXN0ZXIgLSBVc2VkIHRvIGluc3RhbGwgbmV3IGNsb2Nrc291cmNlcwotICogQHQ6CQljbG9ja3NvdXJjZSB0byBiZSByZWdpc3RlcmVkCisgKiBAY3M6CQljbG9ja3NvdXJjZSB0byBiZSByZWdpc3RlcmVkCiAgKgogICogUmV0dXJucyAtRUJVU1kgaWYgcmVnaXN0cmF0aW9uIGZhaWxzLCB6ZXJvIG90aGVyd2lzZS4KICAqLwpAQCAtNzYxLDYgKzc2MSw4IEBACiAKIC8qKgogICogY2xvY2tzb3VyY2VfY2hhbmdlX3JhdGluZyAtIENoYW5nZSB0aGUgcmF0aW5nIG9mIGEgcmVnaXN0ZXJlZCBjbG9ja3NvdXJjZQorICogQGNzOgkJY2xvY2tzb3VyY2UgdG8gYmUgY2hhbmdlZAorICogQHJhdGluZzoJbmV3IHJhdGluZwogICovCiB2b2lkIGNsb2Nrc291cmNlX2NoYW5nZV9yYXRpbmcoc3RydWN0IGNsb2Nrc291cmNlICpjcywgaW50IHJhdGluZykKIHsKQEAgLTc3Miw2ICs3NzQsNyBAQAogCiAvKioKICAqIGNsb2Nrc291cmNlX3VucmVnaXN0ZXIgLSByZW1vdmUgYSByZWdpc3RlcmVkIGNsb2Nrc291cmNlCisgKiBAY3M6CWNsb2Nrc291cmNlIHRvIGJlIHVucmVnaXN0ZXJlZAogICovCiB2b2lkIGNsb2Nrc291cmNlX3VucmVnaXN0ZXIoc3RydWN0IGNsb2Nrc291cmNlICpjcykKIHsKQEAgLTc4Nyw2ICs3OTAsNyBAQAogLyoqCiAgKiBzeXNmc19zaG93X2N1cnJlbnRfY2xvY2tzb3VyY2VzIC0gc3lzZnMgaW50ZXJmYWNlIGZvciBjdXJyZW50IGNsb2Nrc291cmNlCiAgKiBAZGV2Ogl1bnVzZWQKKyAqIEBhdHRyOgl1bnVzZWQKICAqIEBidWY6CWNoYXIgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIGNsb2Nrc291cmNlIGxpc3QKICAqCiAgKiBQcm92aWRlcyBzeXNmcyBpbnRlcmZhY2UgZm9yIGxpc3RpbmcgY3VycmVudCBjbG9ja3NvdXJjZS4KQEAgLTgwNyw2ICs4MTEsNyBAQAogLyoqCiAgKiBzeXNmc19vdmVycmlkZV9jbG9ja3NvdXJjZSAtIGludGVyZmFjZSBmb3IgbWFudWFsbHkgb3ZlcnJpZGluZyBjbG9ja3NvdXJjZQogICogQGRldjoJdW51c2VkCisgKiBAYXR0cjoJdW51c2VkCiAgKiBAYnVmOgluYW1lIG9mIG92ZXJyaWRlIGNsb2Nrc291cmNlCiAgKiBAY291bnQ6CWxlbmd0aCBvZiBidWZmZXIKICAqCkBAIC04NDIsNiArODQ3LDcgQEAKIC8qKgogICogc3lzZnNfc2hvd19hdmFpbGFibGVfY2xvY2tzb3VyY2VzIC0gc3lzZnMgaW50ZXJmYWNlIGZvciBsaXN0aW5nIGNsb2Nrc291cmNlCiAgKiBAZGV2Ogl1bnVzZWQKKyAqIEBhdHRyOgl1bnVzZWQKICAqIEBidWY6CWNoYXIgYnVmZmVyIHRvIGJlIGZpbGxlZCB3aXRoIGNsb2Nrc291cmNlIGxpc3QKICAqCiAgKiBQcm92aWRlcyBzeXNmcyBpbnRlcmZhY2UgZm9yIGxpc3RpbmcgcmVnaXN0ZXJlZCBjbG9ja3NvdXJjZXMKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMgYi9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jCmluZGV4IGY5NTQyODIuLmZkNGE3YjEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMKKysrIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwpAQCAtNzEsNyArNzEsNyBAQAogCSAgICAgKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9DM1NUT1ApKQogCQlyZXR1cm4gMDsKIAotCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShOVUxMLCBkZXYpOworCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZSh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2LCBkZXYpOwogCXRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXYgPSBkZXY7CiAJaWYgKCFjcHVtYXNrX2VtcHR5KHRpY2tfZ2V0X2Jyb2FkY2FzdF9tYXNrKCkpKQogCQl0aWNrX2Jyb2FkY2FzdF9zdGFydF9wZXJpb2RpYyhkZXYpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCmluZGV4IDQwNDIwNjQuLjc2NTY2NDIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYworKysgYi9rZXJuZWwvdGltZS90aWNrLXNjaGVkLmMKQEAgLTI3NSw0MiArMjc1LDE3IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChnZXRfY3B1X2lvd2FpdF90aW1lX3VzKTsKIAotLyoqCi0gKiB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrIC0gc3RvcCB0aGUgaWRsZSB0aWNrIGZyb20gdGhlIGlkbGUgdGFzawotICoKLSAqIFdoZW4gdGhlIG5leHQgZXZlbnQgaXMgbW9yZSB0aGFuIGEgdGljayBpbnRvIHRoZSBmdXR1cmUsIHN0b3AgdGhlIGlkbGUgdGljawotICogQ2FsbGVkIGVpdGhlciBmcm9tIHRoZSBpZGxlIGxvb3Agb3IgZnJvbSBpcnFfZXhpdCgpIHdoZW4gYW4gaWRsZSBwZXJpb2Qgd2FzCi0gKiBqdXN0IGludGVycnVwdGVkIGJ5IGFuIGludGVycnVwdCB3aGljaCBkaWQgbm90IGNhdXNlIGEgcmVzY2hlZHVsZS4KLSAqLwotdm9pZCB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKGludCBpbmlkbGUpCitzdGF0aWMgdm9pZCB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHN0cnVjdCB0aWNrX3NjaGVkICp0cykKIHsKLQl1bnNpZ25lZCBsb25nIHNlcSwgbGFzdF9qaWZmaWVzLCBuZXh0X2ppZmZpZXMsIGRlbHRhX2ppZmZpZXMsIGZsYWdzOwotCXN0cnVjdCB0aWNrX3NjaGVkICp0czsKKwl1bnNpZ25lZCBsb25nIHNlcSwgbGFzdF9qaWZmaWVzLCBuZXh0X2ppZmZpZXMsIGRlbHRhX2ppZmZpZXM7CiAJa3RpbWVfdCBsYXN0X3VwZGF0ZSwgZXhwaXJlcywgbm93OwogCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiA9IF9fZ2V0X2NwdV92YXIodGlja19jcHVfZGV2aWNlKS5ldnRkZXY7CiAJdTY0IHRpbWVfZGVsdGE7CiAJaW50IGNwdTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQogCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAl0cyA9ICZwZXJfY3B1KHRpY2tfY3B1X3NjaGVkLCBjcHUpOwogCi0JLyoKLQkgKiBDYWxsIHRvIHRpY2tfbm9oel9zdGFydF9pZGxlIHN0b3BzIHRoZSBsYXN0X3VwZGF0ZV90aW1lIGZyb20gYmVpbmcKLQkgKiB1cGRhdGVkLiBUaHVzLCBpdCBtdXN0IG5vdCBiZSBjYWxsZWQgaW4gdGhlIGV2ZW50IHdlIGFyZSBjYWxsZWQgZnJvbQotCSAqIGlycV9leGl0KCkgd2l0aCB0aGUgcHJpb3Igc3RhdGUgZGlmZmVyZW50IHRoYW4gaWRsZS4KLQkgKi8KLQlpZiAoIWluaWRsZSAmJiAhdHMtPmluaWRsZSkKLQkJZ290byBlbmQ7Ci0KLQkvKgotCSAqIFNldCB0cy0+aW5pZGxlIHVuY29uZGl0aW9uYWxseS4gRXZlbiBpZiB0aGUgc3lzdGVtIGRpZCBub3QKLQkgKiBzd2l0Y2ggdG8gTk9IWiBtb2RlIHRoZSBjcHUgZnJlcXVlbmN5IGdvdmVybmVycyByZWx5IG9uIHRoZQotCSAqIHVwZGF0ZSBvZiB0aGUgaWRsZSB0aW1lIGFjY291bnRpbmcgaW4gdGlja19ub2h6X3N0YXJ0X2lkbGUoKS4KLQkgKi8KLQl0cy0+aW5pZGxlID0gMTsKLQogCW5vdyA9IHRpY2tfbm9oel9zdGFydF9pZGxlKGNwdSwgdHMpOwogCiAJLyoKQEAgLTMyNiwxMCArMzAxLDEwIEBACiAJfQogCiAJaWYgKHVubGlrZWx5KHRzLT5ub2h6X21vZGUgPT0gTk9IWl9NT0RFX0lOQUNUSVZFKSkKLQkJZ290byBlbmQ7CisJCXJldHVybjsKIAogCWlmIChuZWVkX3Jlc2NoZWQoKSkKLQkJZ290byBlbmQ7CisJCXJldHVybjsKIAogCWlmICh1bmxpa2VseShsb2NhbF9zb2Z0aXJxX3BlbmRpbmcoKSAmJiBjcHVfb25saW5lKGNwdSkpKSB7CiAJCXN0YXRpYyBpbnQgcmF0ZWxpbWl0OwpAQCAtMzM5LDcgKzMxNCw3IEBACiAJCQkgICAgICAgKHVuc2lnbmVkIGludCkgbG9jYWxfc29mdGlycV9wZW5kaW5nKCkpOwogCQkJcmF0ZWxpbWl0Kys7CiAJCX0KLQkJZ290byBlbmQ7CisJCXJldHVybjsKIAl9CiAKIAl0cy0+aWRsZV9jYWxscysrOwpAQCAtNDM0LDcgKzQwOSw2IEBACiAJCQl0cy0+aWRsZV90aWNrID0gaHJ0aW1lcl9nZXRfZXhwaXJlcygmdHMtPnNjaGVkX3RpbWVyKTsKIAkJCXRzLT50aWNrX3N0b3BwZWQgPSAxOwogCQkJdHMtPmlkbGVfamlmZmllcyA9IGxhc3RfamlmZmllczsKLQkJCXJjdV9lbnRlcl9ub2h6KCk7CiAJCX0KIAogCQl0cy0+aWRsZV9zbGVlcHMrKzsKQEAgLTQ3Miw4ICs0NDYsNjQgQEAKIAl0cy0+bmV4dF9qaWZmaWVzID0gbmV4dF9qaWZmaWVzOwogCXRzLT5sYXN0X2ppZmZpZXMgPSBsYXN0X2ppZmZpZXM7CiAJdHMtPnNsZWVwX2xlbmd0aCA9IGt0aW1lX3N1YihkZXYtPm5leHRfZXZlbnQsIG5vdyk7Ci1lbmQ6Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIHRpY2tfbm9oel9pZGxlX2VudGVyIC0gc3RvcCB0aGUgaWRsZSB0aWNrIGZyb20gdGhlIGlkbGUgdGFzaworICoKKyAqIFdoZW4gdGhlIG5leHQgZXZlbnQgaXMgbW9yZSB0aGFuIGEgdGljayBpbnRvIHRoZSBmdXR1cmUsIHN0b3AgdGhlIGlkbGUgdGljaworICogQ2FsbGVkIHdoZW4gd2Ugc3RhcnQgdGhlIGlkbGUgbG9vcC4KKyAqCisgKiBUaGUgYXJjaCBpcyByZXNwb25zaWJsZSBvZiBjYWxsaW5nOgorICoKKyAqIC0gcmN1X2lkbGVfZW50ZXIoKSBhZnRlciBpdHMgbGFzdCB1c2Ugb2YgUkNVIGJlZm9yZSB0aGUgQ1BVIGlzIHB1dAorICogIHRvIHNsZWVwLgorICogLSByY3VfaWRsZV9leGl0KCkgYmVmb3JlIHRoZSBmaXJzdCB1c2Ugb2YgUkNVIGFmdGVyIHRoZSBDUFUgaXMgd29rZW4gdXAuCisgKi8KK3ZvaWQgdGlja19ub2h6X2lkbGVfZW50ZXIodm9pZCkKK3sKKwlzdHJ1Y3QgdGlja19zY2hlZCAqdHM7CisKKwlXQVJOX09OX09OQ0UoaXJxc19kaXNhYmxlZCgpKTsKKworCS8qCisgCSAqIFVwZGF0ZSB0aGUgaWRsZSBzdGF0ZSBpbiB0aGUgc2NoZWR1bGVyIGRvbWFpbiBoaWVyYXJjaHkKKyAJICogd2hlbiB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKCkgaXMgY2FsbGVkIGZyb20gdGhlIGlkbGUgbG9vcC4KKyAJICogU3RhdGUgd2lsbCBiZSB1cGRhdGVkIHRvIGJ1c3kgZHVyaW5nIHRoZSBmaXJzdCBidXN5IHRpY2sgYWZ0ZXIKKyAJICogZXhpdGluZyBpZGxlLgorIAkgKi8KKwlzZXRfY3B1X3NkX3N0YXRlX2lkbGUoKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwl0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKKwkvKgorCSAqIHNldCB0cy0+aW5pZGxlIHVuY29uZGl0aW9uYWxseS4gZXZlbiBpZiB0aGUgc3lzdGVtIGRpZCBub3QKKwkgKiBzd2l0Y2ggdG8gbm9oeiBtb2RlIHRoZSBjcHUgZnJlcXVlbmN5IGdvdmVybmVycyByZWx5IG9uIHRoZQorCSAqIHVwZGF0ZSBvZiB0aGUgaWRsZSB0aW1lIGFjY291bnRpbmcgaW4gdGlja19ub2h6X3N0YXJ0X2lkbGUoKS4KKwkgKi8KKwl0cy0+aW5pZGxlID0gMTsKKwl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHRzKTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKK30KKworLyoqCisgKiB0aWNrX25vaHpfaXJxX2V4aXQgLSB1cGRhdGUgbmV4dCB0aWNrIGV2ZW50IGZyb20gaW50ZXJydXB0IGV4aXQKKyAqCisgKiBXaGVuIGFuIGludGVycnVwdCBmaXJlcyB3aGlsZSB3ZSBhcmUgaWRsZSBhbmQgaXQgZG9lc24ndCBjYXVzZQorICogYSByZXNjaGVkdWxlLCBpdCBtYXkgc3RpbGwgYWRkLCBtb2RpZnkgb3IgZGVsZXRlIGEgdGltZXIsIGVucXVldWUKKyAqIGFuIFJDVSBjYWxsYmFjaywgZXRjLi4uCisgKiBTbyB3ZSBuZWVkIHRvIHJlLWNhbGN1bGF0ZSBhbmQgcmVwcm9ncmFtIHRoZSBuZXh0IHRpY2sgZXZlbnQuCisgKi8KK3ZvaWQgdGlja19ub2h6X2lycV9leGl0KHZvaWQpCit7CisJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gJl9fZ2V0X2NwdV92YXIodGlja19jcHVfc2NoZWQpOworCisJaWYgKCF0cy0+aW5pZGxlKQorCQlyZXR1cm47CisKKwl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHRzKTsKIH0KIAogLyoqCkBAIC01MTUsMTEgKzU0NSwxMyBAQAogfQogCiAvKioKLSAqIHRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2sgLSByZXN0YXJ0IHRoZSBpZGxlIHRpY2sgZnJvbSB0aGUgaWRsZSB0YXNrCisgKiB0aWNrX25vaHpfaWRsZV9leGl0IC0gcmVzdGFydCB0aGUgaWRsZSB0aWNrIGZyb20gdGhlIGlkbGUgdGFzawogICoKICAqIFJlc3RhcnQgdGhlIGlkbGUgdGljayB3aGVuIHRoZSBDUFUgaXMgd29rZW4gdXAgZnJvbSBpZGxlCisgKiBUaGlzIGFsc28gZXhpdCB0aGUgUkNVIGV4dGVuZGVkIHF1aWVzY2VudCBzdGF0ZS4gVGhlIENQVQorICogY2FuIHVzZSBSQ1UgYWdhaW4gYWZ0ZXIgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCiAgKi8KLXZvaWQgdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljayh2b2lkKQordm9pZCB0aWNrX25vaHpfaWRsZV9leGl0KHZvaWQpCiB7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlzdHJ1Y3QgdGlja19zY2hlZCAqdHMgPSAmcGVyX2NwdSh0aWNrX2NwdV9zY2hlZCwgY3B1KTsKQEAgLTUyOSw2ICs1NjEsNyBAQAogCWt0aW1lX3Qgbm93OwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwogCWlmICh0cy0+aWRsZV9hY3RpdmUgfHwgKHRzLT5pbmlkbGUgJiYgdHMtPnRpY2tfc3RvcHBlZCkpCiAJCW5vdyA9IGt0aW1lX2dldCgpOwogCkBAIC01NDMsOCArNTc2LDYgQEAKIAogCXRzLT5pbmlkbGUgPSAwOwogCi0JcmN1X2V4aXRfbm9oeigpOwotCiAJLyogVXBkYXRlIGppZmZpZXMgZmlyc3QgKi8KIAlzZWxlY3Rfbm9oel9sb2FkX2JhbGFuY2VyKDApOwogCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKaW5kZXggMjM3ODQxMy4uMGM2MzU4MSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYworKysgYi9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCkBAIC0xMzEsNyArMTMxLDcgQEAKIAkvKiBjYWxjdWxhdGUgdGhlIGRlbHRhIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZV93YWxsX3RpbWU6ICovCiAJY3ljbGVfZGVsdGEgPSAoY3ljbGVfbm93IC0gY2xvY2stPmN5Y2xlX2xhc3QpICYgY2xvY2stPm1hc2s7CiAKLQkvKiByZXR1cm4gZGVsdGEgY29udmVydCB0byBuYW5vc2Vjb25kcyB1c2luZyBudHAgYWRqdXN0ZWQgbXVsdC4gKi8KKwkvKiByZXR1cm4gZGVsdGEgY29udmVydCB0byBuYW5vc2Vjb25kcy4gKi8KIAlyZXR1cm4gY2xvY2tzb3VyY2VfY3ljMm5zKGN5Y2xlX2RlbHRhLCBjbG9jay0+bXVsdCwgY2xvY2stPnNoaWZ0KTsKIH0KIApAQCAtODEzLDExICs4MTMsMTEgQEAKIAkgKiBGaXJzdCB3ZSBzaGlmdCBpdCBkb3duIGZyb20gTlRQX1NISUZUIHRvIGNsb2Nrc291cmNlLT5zaGlmdGVkIG5zZWNzLgogCSAqCiAJICogTm90ZSB3ZSBzdWJ0cmFjdCBvbmUgaW4gdGhlIHNoaWZ0LCBzbyB0aGF0IGVycm9yIGlzIHJlYWxseSBlcnJvcioyLgotCSAqIFRoaXMgInNhdmVzIiBkaXZpZGluZyhzaGlmdGluZykgaW50ZXJlcnZhbCB0d2ljZSwgYnV0IGtlZXBzIHRoZQotCSAqIChlcnJvciA+IGludGVydmFsKSBjb21wYXJpc2lvbiBhcyBzdGlsbCBtZWFzdXJpbmcgaWYgZXJyb3IgaXMKKwkgKiBUaGlzICJzYXZlcyIgZGl2aWRpbmcoc2hpZnRpbmcpIGludGVydmFsIHR3aWNlLCBidXQga2VlcHMgdGhlCisJICogKGVycm9yID4gaW50ZXJ2YWwpIGNvbXBhcmlzb24gYXMgc3RpbGwgbWVhc3VyaW5nIGlmIGVycm9yIGlzCiAJICogbGFyZ2VyIHRoZW4gaGFsZiBhbiBpbnRlcnZhbC4KIAkgKgotCSAqIE5vdGU6IEl0IGRvZXMgbm90ICJzYXZlIiBvbiBhZ2dyaXZhdGlvbiB3aGVuIHJlYWRpbmcgdGhlIGNvZGUuCisJICogTm90ZTogSXQgZG9lcyBub3QgInNhdmUiIG9uIGFnZ3JhdmF0aW9uIHdoZW4gcmVhZGluZyB0aGUgY29kZS4KIAkgKi8KIAllcnJvciA9IHRpbWVrZWVwZXIubnRwX2Vycm9yID4+ICh0aW1la2VlcGVyLm50cF9lcnJvcl9zaGlmdCAtIDEpOwogCWlmIChlcnJvciA+IGludGVydmFsKSB7CkBAIC04MzMsNyArODMzLDcgQEAKIAkJICogbmFub3NlY29uZCwgYW5kIHN0b3JlIHRoZSBhbW91bnQgcm91bmRlZCB1cCBpbnRvCiAJCSAqIHRoZSBlcnJvci4gVGhpcyBjYXVzZXMgdGhlIGxpa2VseSBiZWxvdyB0byBiZSB1bmxpa2VseS4KIAkJICoKLQkJICogVGhlIHByb3BlcmZpeCBpcyB0byBhdm9pZCByb3VuZGluZyB1cCBieSB1c2luZworCQkgKiBUaGUgcHJvcGVyIGZpeCBpcyB0byBhdm9pZCByb3VuZGluZyB1cCBieSB1c2luZwogCQkgKiB0aGUgaGlnaCBwcmVjaXNpb24gdGltZWtlZXBlci54dGltZV9uc2VjIGluc3RlYWQgb2YKIAkJICogeHRpbWUudHZfbnNlYyBldmVyeXdoZXJlLiBGaXhpbmcgdGhpcyB3aWxsIHRha2Ugc29tZQogCQkgKiB0aW1lLgpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWVyLmMgYi9rZXJuZWwvdGltZXIuYwppbmRleCBkYmFhNjI0Li5hMjk3ZmZjIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZXIuYworKysgYi9rZXJuZWwvdGltZXIuYwpAQCAtNDI3LDYgKzQyNywxMiBAQAogCX0KIH0KIAorLyogU3R1YiB0aW1lciBjYWxsYmFjayBmb3IgaW1wcm9wZXJseSB1c2VkIHRpbWVycy4gKi8KK3N0YXRpYyB2b2lkIHN0dWJfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCVdBUk5fT04oMSk7Cit9CisKIC8qCiAgKiBmaXh1cF9hY3RpdmF0ZSBpcyBjYWxsZWQgd2hlbjoKICAqIC0gYW4gYWN0aXZlIG9iamVjdCBpcyBhY3RpdmF0ZWQKQEAgLTQ1MCw3ICs0NTYsOCBAQAogCQkJZGVidWdfb2JqZWN0X2FjdGl2YXRlKHRpbWVyLCAmdGltZXJfZGVidWdfZGVzY3IpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7Ci0JCQlXQVJOX09OX09OQ0UoMSk7CisJCQlzZXR1cF90aW1lcih0aW1lciwgc3R1Yl90aW1lciwgMCk7CisJCQlyZXR1cm4gMTsKIAkJfQogCQlyZXR1cm4gMDsKIApAQCAtNDgwLDEyICs0ODcsNDAgQEAKIAl9CiB9CiAKKy8qCisgKiBmaXh1cF9hc3NlcnRfaW5pdCBpcyBjYWxsZWQgd2hlbjoKKyAqIC0gYW4gdW50cmFja2VkL3VuaW5pdC1lZCBvYmplY3QgaXMgZm91bmQKKyAqLworc3RhdGljIGludCB0aW1lcl9maXh1cF9hc3NlcnRfaW5pdCh2b2lkICphZGRyLCBlbnVtIGRlYnVnX29ial9zdGF0ZSBzdGF0ZSkKK3sKKwlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIgPSBhZGRyOworCisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgT0RFQlVHX1NUQVRFX05PVEFWQUlMQUJMRToKKwkJaWYgKHRpbWVyLT5lbnRyeS5wcmV2ID09IFRJTUVSX0VOVFJZX1NUQVRJQykgeworCQkJLyoKKwkJCSAqIFRoaXMgaXMgbm90IHJlYWxseSBhIGZpeHVwLiBUaGUgdGltZXIgd2FzCisJCQkgKiBzdGF0aWNhbGx5IGluaXRpYWxpemVkLiBXZSBqdXN0IG1ha2Ugc3VyZSB0aGF0IGl0CisJCQkgKiBpcyB0cmFja2VkIGluIHRoZSBvYmplY3QgdHJhY2tlci4KKwkJCSAqLworCQkJZGVidWdfb2JqZWN0X2luaXQodGltZXIsICZ0aW1lcl9kZWJ1Z19kZXNjcik7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXNldHVwX3RpbWVyKHRpbWVyLCBzdHViX3RpbWVyLCAwKTsKKwkJCXJldHVybiAxOworCQl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IGRlYnVnX29ial9kZXNjciB0aW1lcl9kZWJ1Z19kZXNjciA9IHsKLQkubmFtZQkJPSAidGltZXJfbGlzdCIsCi0JLmRlYnVnX2hpbnQJPSB0aW1lcl9kZWJ1Z19oaW50LAotCS5maXh1cF9pbml0CT0gdGltZXJfZml4dXBfaW5pdCwKLQkuZml4dXBfYWN0aXZhdGUJPSB0aW1lcl9maXh1cF9hY3RpdmF0ZSwKLQkuZml4dXBfZnJlZQk9IHRpbWVyX2ZpeHVwX2ZyZWUsCisJLm5hbWUJCQk9ICJ0aW1lcl9saXN0IiwKKwkuZGVidWdfaGludAkJPSB0aW1lcl9kZWJ1Z19oaW50LAorCS5maXh1cF9pbml0CQk9IHRpbWVyX2ZpeHVwX2luaXQsCisJLmZpeHVwX2FjdGl2YXRlCQk9IHRpbWVyX2ZpeHVwX2FjdGl2YXRlLAorCS5maXh1cF9mcmVlCQk9IHRpbWVyX2ZpeHVwX2ZyZWUsCisJLmZpeHVwX2Fzc2VydF9pbml0CT0gdGltZXJfZml4dXBfYXNzZXJ0X2luaXQsCiB9OwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfdGltZXJfaW5pdChzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCkBAIC01MDgsNiArNTQzLDExIEBACiAJZGVidWdfb2JqZWN0X2ZyZWUodGltZXIsICZ0aW1lcl9kZWJ1Z19kZXNjcik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z190aW1lcl9hc3NlcnRfaW5pdChzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJZGVidWdfb2JqZWN0X2Fzc2VydF9pbml0KHRpbWVyLCAmdGltZXJfZGVidWdfZGVzY3IpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAogCQkJIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpOwpAQCAtNTMxLDYgKzU3MSw3IEBACiBzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfdGltZXJfaW5pdChzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3RpbWVyX2FjdGl2YXRlKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZGVidWdfdGltZXJfZGVhY3RpdmF0ZShzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX3RpbWVyX2Fzc2VydF9pbml0KHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikgeyB9CiAjZW5kaWYKIAogc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX2luaXQoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQpAQCAtNTUyLDYgKzU5MywxMSBAQAogCXRyYWNlX3RpbWVyX2NhbmNlbCh0aW1lcik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19hc3NlcnRfaW5pdChzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7CisJZGVidWdfdGltZXJfYXNzZXJ0X2luaXQodGltZXIpOworfQorCiBzdGF0aWMgdm9pZCBfX2luaXRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAogCQkJIGNvbnN0IGNoYXIgKm5hbWUsCiAJCQkgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpCkBAIC05MDIsNiArOTQ4LDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAwOwogCisJZGVidWdfYXNzZXJ0X2luaXQodGltZXIpOworCiAJdGltZXJfc3RhdHNfdGltZXJfY2xlYXJfc3RhcnRfaW5mbyh0aW1lcik7CiAJaWYgKHRpbWVyX3BlbmRpbmcodGltZXIpKSB7CiAJCWJhc2UgPSBsb2NrX3RpbWVyX2Jhc2UodGltZXIsICZmbGFncyk7CkBAIC05MzIsNiArOTgwLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCByZXQgPSAtMTsKIAorCWRlYnVnX2Fzc2VydF9pbml0KHRpbWVyKTsKKwogCWJhc2UgPSBsb2NrX3RpbWVyX2Jhc2UodGltZXIsICZmbGFncyk7CiAKIAlpZiAoYmFzZS0+cnVubmluZ190aW1lciA9PSB0aW1lcikKQEAgLTEzNjgsNyArMTQxOCw3IEBACiAJaW50IHBpZDsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlwaWQgPSB0YXNrX3RnaWRfdm5yKGN1cnJlbnQtPnJlYWxfcGFyZW50KTsKKwlwaWQgPSB0YXNrX3RnaWRfdm5yKHJjdV9kZXJlZmVyZW5jZShjdXJyZW50LT5yZWFsX3BhcmVudCkpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCiAJcmV0dXJuIHBpZDsKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9mdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwppbmRleCA5MDBiNDA5Li5iMWU4OTQzIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCkBAIC0xNTIsNyArMTUyLDYgQEAKIAlmdHJhY2VfcGlkX2Z1bmN0aW9uID0gZnRyYWNlX3N0dWI7CiB9CiAKLSN1bmRlZiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVAogI2lmbmRlZiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVAogLyoKICAqIEZvciB0aG9zZSBhcmNocyB0aGF0IGRvIG5vdCB0ZXN0IGZ0cmFjZV90cmFjZV9zdG9wIGluIHRoZWlyCkBAIC0xMjEyLDcgKzEyMTEsOSBAQAogCWlmICghc3JjLT5jb3VudCkgewogCQlmcmVlX2Z0cmFjZV9oYXNoX3JjdSgqZHN0KTsKIAkJcmN1X2Fzc2lnbl9wb2ludGVyKCpkc3QsIEVNUFRZX0hBU0gpOwotCQlyZXR1cm4gMDsKKwkJLyogc3RpbGwgbmVlZCB0byB1cGRhdGUgdGhlIGZ1bmN0aW9uIHJlY29yZHMgKi8KKwkJcmV0ID0gMDsKKwkJZ290byBvdXQ7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKaW5kZXggZjJiZDI3NS4uOTFkYzRiYyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlLmMKQEAgLTMzOCw3ICszMzgsOCBAQAogLyogdHJhY2VfZmxhZ3MgaG9sZHMgdHJhY2Vfb3B0aW9ucyBkZWZhdWx0IHZhbHVlcyAqLwogdW5zaWduZWQgbG9uZyB0cmFjZV9mbGFncyA9IFRSQUNFX0lURVJfUFJJTlRfUEFSRU5UIHwgVFJBQ0VfSVRFUl9QUklOVEsgfAogCVRSQUNFX0lURVJfQU5OT1RBVEUgfCBUUkFDRV9JVEVSX0NPTlRFWFRfSU5GTyB8IFRSQUNFX0lURVJfU0xFRVBfVElNRSB8Ci0JVFJBQ0VfSVRFUl9HUkFQSF9USU1FIHwgVFJBQ0VfSVRFUl9SRUNPUkRfQ01EIHwgVFJBQ0VfSVRFUl9PVkVSV1JJVEU7CisJVFJBQ0VfSVRFUl9HUkFQSF9USU1FIHwgVFJBQ0VfSVRFUl9SRUNPUkRfQ01EIHwgVFJBQ0VfSVRFUl9PVkVSV1JJVEUgfAorCVRSQUNFX0lURVJfSVJRX0lORk87CiAKIHN0YXRpYyBpbnQgdHJhY2Vfc3RvcF9jb3VudDsKIHN0YXRpYyBERUZJTkVfUkFXX1NQSU5MT0NLKHRyYWNpbmdfc3RhcnRfbG9jayk7CkBAIC00MjYsNiArNDI3LDcgQEAKIAkicmVjb3JkLWNtZCIsCiAJIm92ZXJ3cml0ZSIsCiAJImRpc2FibGVfb25fZnJlZSIsCisJImlycS1pbmZvIiwKIAlOVUxMCiB9OwogCkBAIC0xODQzLDYgKzE4NDUsMzMgQEAKIAl0cmFjZV9ldmVudF9yZWFkX3VubG9jaygpOwogfQogCitzdGF0aWMgdm9pZAorZ2V0X3RvdGFsX2VudHJpZXMoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwgdW5zaWduZWQgbG9uZyAqdG90YWwsIHVuc2lnbmVkIGxvbmcgKmVudHJpZXMpCit7CisJdW5zaWduZWQgbG9uZyBjb3VudDsKKwlpbnQgY3B1OworCisJKnRvdGFsID0gMDsKKwkqZW50cmllcyA9IDA7CisKKwlmb3JfZWFjaF90cmFjaW5nX2NwdShjcHUpIHsKKwkJY291bnQgPSByaW5nX2J1ZmZlcl9lbnRyaWVzX2NwdSh0ci0+YnVmZmVyLCBjcHUpOworCQkvKgorCQkgKiBJZiB0aGlzIGJ1ZmZlciBoYXMgc2tpcHBlZCBlbnRyaWVzLCB0aGVuIHdlIGhvbGQgYWxsCisJCSAqIGVudHJpZXMgZm9yIHRoZSB0cmFjZSBhbmQgd2UgbmVlZCB0byBpZ25vcmUgdGhlCisJCSAqIG9uZXMgYmVmb3JlIHRoZSB0aW1lIHN0YW1wLgorCQkgKi8KKwkJaWYgKHRyLT5kYXRhW2NwdV0tPnNraXBwZWRfZW50cmllcykgeworCQkJY291bnQgLT0gdHItPmRhdGFbY3B1XS0+c2tpcHBlZF9lbnRyaWVzOworCQkJLyogdG90YWwgaXMgdGhlIHNhbWUgYXMgdGhlIGVudHJpZXMgKi8KKwkJCSp0b3RhbCArPSBjb3VudDsKKwkJfSBlbHNlCisJCQkqdG90YWwgKz0gY291bnQgKworCQkJCXJpbmdfYnVmZmVyX292ZXJydW5fY3B1KHRyLT5idWZmZXIsIGNwdSk7CisJCSplbnRyaWVzICs9IGNvdW50OworCX0KK30KKwogc3RhdGljIHZvaWQgcHJpbnRfbGF0X2hlbHBfaGVhZGVyKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKIAlzZXFfcHV0cyhtLCAiIyAgICAgICAgICAgICAgICAgIF8tLS0tLS09PiBDUFUjICAgICAgICAgICAgXG4iKTsKQEAgLTE4NTUsMTIgKzE4ODQsMzUgQEAKIAlzZXFfcHV0cyhtLCAiIyAgICAgXFwgICAvICAgICAgfHx8fHwgIFxcICAgIHwgICAvICAgICAgICAgICBcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBwcmludF9mdW5jX2hlbHBfaGVhZGVyKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3N0YXRpYyB2b2lkIHByaW50X2V2ZW50X2luZm8oc3RydWN0IHRyYWNlX2FycmF5ICp0ciwgc3RydWN0IHNlcV9maWxlICptKQogewotCXNlcV9wdXRzKG0sICIjICAgICAgICAgICBUQVNLLVBJRCAgICBDUFUjICAgIFRJTUVTVEFNUCAgRlVOQ1RJT05cbiIpOworCXVuc2lnbmVkIGxvbmcgdG90YWw7CisJdW5zaWduZWQgbG9uZyBlbnRyaWVzOworCisJZ2V0X3RvdGFsX2VudHJpZXModHIsICZ0b3RhbCwgJmVudHJpZXMpOworCXNlcV9wcmludGYobSwgIiMgZW50cmllcy1pbi1idWZmZXIvZW50cmllcy13cml0dGVuOiAlbHUvJWx1ICAgI1A6JWRcbiIsCisJCSAgIGVudHJpZXMsIHRvdGFsLCBudW1fb25saW5lX2NwdXMoKSk7CisJc2VxX3B1dHMobSwgIiNcbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9mdW5jX2hlbHBfaGVhZGVyKHN0cnVjdCB0cmFjZV9hcnJheSAqdHIsIHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlwcmludF9ldmVudF9pbmZvKHRyLCBtKTsKKwlzZXFfcHV0cyhtLCAiIyAgICAgICAgICAgVEFTSy1QSUQgICBDUFUjICAgICAgVElNRVNUQU1QICBGVU5DVElPTlxuIik7CiAJc2VxX3B1dHMobSwgIiMgICAgICAgICAgICAgIHwgfCAgICAgICB8ICAgICAgICAgIHwgICAgICAgICB8XG4iKTsKIH0KIAorc3RhdGljIHZvaWQgcHJpbnRfZnVuY19oZWxwX2hlYWRlcl9pcnEoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwgc3RydWN0IHNlcV9maWxlICptKQoreworCXByaW50X2V2ZW50X2luZm8odHIsIG0pOworCXNlcV9wdXRzKG0sICIjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy0tLS0tPT4gaXJxcy1vZmZcbiIpOworCXNlcV9wdXRzKG0sICIjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIF8tLS0tPT4gbmVlZC1yZXNjaGVkXG4iKTsKKwlzZXFfcHV0cyhtLCAiIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC8gXy0tLT0+IGhhcmRpcnEvc29mdGlycVxuIik7CisJc2VxX3B1dHMobSwgIiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgLyBfLS09PiBwcmVlbXB0LWRlcHRoXG4iKTsKKwlzZXFfcHV0cyhtLCAiIyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fHwgLyAgICAgZGVsYXlcbiIpOworCXNlcV9wdXRzKG0sICIjICAgICAgICAgICBUQVNLLVBJRCAgIENQVSMgIHx8fHwgICAgVElNRVNUQU1QICBGVU5DVElPTlxuIik7CisJc2VxX3B1dHMobSwgIiMgICAgICAgICAgICAgIHwgfCAgICAgICB8ICAgfHx8fCAgICAgICB8ICAgICAgICAgfFxuIik7Cit9CiAKIHZvaWQKIHByaW50X3RyYWNlX2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKQEAgLTE4NjksMzIgKzE5MjEsMTQgQEAKIAlzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyID0gaXRlci0+dHI7CiAJc3RydWN0IHRyYWNlX2FycmF5X2NwdSAqZGF0YSA9IHRyLT5kYXRhW3RyLT5jcHVdOwogCXN0cnVjdCB0cmFjZXIgKnR5cGUgPSBjdXJyZW50X3RyYWNlOwotCXVuc2lnbmVkIGxvbmcgZW50cmllcyA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0b3RhbCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBjb3VudDsKKwl1bnNpZ25lZCBsb25nIGVudHJpZXM7CisJdW5zaWduZWQgbG9uZyB0b3RhbDsKIAljb25zdCBjaGFyICpuYW1lID0gInByZWVtcHRpb24iOwotCWludCBjcHU7CiAKIAlpZiAodHlwZSkKIAkJbmFtZSA9IHR5cGUtPm5hbWU7CiAKLQotCWZvcl9lYWNoX3RyYWNpbmdfY3B1KGNwdSkgewotCQljb3VudCA9IHJpbmdfYnVmZmVyX2VudHJpZXNfY3B1KHRyLT5idWZmZXIsIGNwdSk7Ci0JCS8qCi0JCSAqIElmIHRoaXMgYnVmZmVyIGhhcyBza2lwcGVkIGVudHJpZXMsIHRoZW4gd2UgaG9sZCBhbGwKLQkJICogZW50cmllcyBmb3IgdGhlIHRyYWNlIGFuZCB3ZSBuZWVkIHRvIGlnbm9yZSB0aGUKLQkJICogb25lcyBiZWZvcmUgdGhlIHRpbWUgc3RhbXAuCi0JCSAqLwotCQlpZiAodHItPmRhdGFbY3B1XS0+c2tpcHBlZF9lbnRyaWVzKSB7Ci0JCQljb3VudCAtPSB0ci0+ZGF0YVtjcHVdLT5za2lwcGVkX2VudHJpZXM7Ci0JCQkvKiB0b3RhbCBpcyB0aGUgc2FtZSBhcyB0aGUgZW50cmllcyAqLwotCQkJdG90YWwgKz0gY291bnQ7Ci0JCX0gZWxzZQotCQkJdG90YWwgKz0gY291bnQgKwotCQkJCXJpbmdfYnVmZmVyX292ZXJydW5fY3B1KHRyLT5idWZmZXIsIGNwdSk7Ci0JCWVudHJpZXMgKz0gY291bnQ7Ci0JfQorCWdldF90b3RhbF9lbnRyaWVzKHRyLCAmdG90YWwsICZlbnRyaWVzKTsKIAogCXNlcV9wcmludGYobSwgIiMgJXMgbGF0ZW5jeSB0cmFjZSB2MS4xLjUgb24gJXNcbiIsCiAJCSAgIG5hbWUsIFVUU19SRUxFQVNFKTsKQEAgLTIxNDAsNiArMjE3NCwyMSBAQAogCXJldHVybiBwcmludF90cmFjZV9mbXQoaXRlcik7CiB9CiAKK3ZvaWQgdHJhY2VfbGF0ZW5jeV9oZWFkZXIoc3RydWN0IHNlcV9maWxlICptKQoreworCXN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciA9IG0tPnByaXZhdGU7CisKKwkvKiBwcmludCBub3RoaW5nIGlmIHRoZSBidWZmZXJzIGFyZSBlbXB0eSAqLworCWlmICh0cmFjZV9lbXB0eShpdGVyKSkKKwkJcmV0dXJuOworCisJaWYgKGl0ZXItPml0ZXJfZmxhZ3MgJiBUUkFDRV9GSUxFX0xBVF9GTVQpCisJCXByaW50X3RyYWNlX2hlYWRlcihtLCBpdGVyKTsKKworCWlmICghKHRyYWNlX2ZsYWdzICYgVFJBQ0VfSVRFUl9WRVJCT1NFKSkKKwkJcHJpbnRfbGF0X2hlbHBfaGVhZGVyKG0pOworfQorCiB2b2lkIHRyYWNlX2RlZmF1bHRfaGVhZGVyKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKIAlzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIgPSBtLT5wcml2YXRlOwpAQCAtMjE1NSw4ICsyMjA0LDEyIEBACiAJCWlmICghKHRyYWNlX2ZsYWdzICYgVFJBQ0VfSVRFUl9WRVJCT1NFKSkKIAkJCXByaW50X2xhdF9oZWxwX2hlYWRlcihtKTsKIAl9IGVsc2UgewotCQlpZiAoISh0cmFjZV9mbGFncyAmIFRSQUNFX0lURVJfVkVSQk9TRSkpCi0JCQlwcmludF9mdW5jX2hlbHBfaGVhZGVyKG0pOworCQlpZiAoISh0cmFjZV9mbGFncyAmIFRSQUNFX0lURVJfVkVSQk9TRSkpIHsKKwkJCWlmICh0cmFjZV9mbGFncyAmIFRSQUNFX0lURVJfSVJRX0lORk8pCisJCQkJcHJpbnRfZnVuY19oZWxwX2hlYWRlcl9pcnEoaXRlci0+dHIsIG0pOworCQkJZWxzZQorCQkJCXByaW50X2Z1bmNfaGVscF9oZWFkZXIoaXRlci0+dHIsIG0pOworCQl9CiAJfQogfQogCkBAIC00Nzc1LDYgKzQ4MjgsNyBAQAogewogCV9fZnRyYWNlX2R1bXAodHJ1ZSwgb29wc19kdW1wX21vZGUpOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZnRyYWNlX2R1bXApOwogCiBfX2luaXQgc3RhdGljIGludCB0cmFjZXJfYWxsb2NfYnVmZmVycyh2b2lkKQogewpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmggYi9rZXJuZWwvdHJhY2UvdHJhY2UuaAppbmRleCAwOTJlMWY4Li4yYzI2NTc0IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuaApAQCAtMzcwLDYgKzM3MCw3IEBACiAJCSAgICB1bnNpZ25lZCBsb25nIGlwLAogCQkgICAgdW5zaWduZWQgbG9uZyBwYXJlbnRfaXAsCiAJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpOwordm9pZCB0cmFjZV9sYXRlbmN5X2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOwogdm9pZCB0cmFjZV9kZWZhdWx0X2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pOwogdm9pZCBwcmludF90cmFjZV9oZWFkZXIoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOwogaW50IHRyYWNlX2VtcHR5KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcik7CkBAIC02NTQsNiArNjU1LDcgQEAKIAlUUkFDRV9JVEVSX1JFQ09SRF9DTUQJCT0gMHgxMDAwMDAsCiAJVFJBQ0VfSVRFUl9PVkVSV1JJVEUJCT0gMHgyMDAwMDAsCiAJVFJBQ0VfSVRFUl9TVE9QX09OX0ZSRUUJCT0gMHg0MDAwMDAsCisJVFJBQ0VfSVRFUl9JUlFfSU5GTwkJPSAweDgwMDAwMCwKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMKaW5kZXggNTgxODc2Zi4uYzIxMmE3ZiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYwpAQCAtMTA3OCw3ICsxMDc4LDYgQEAKIAkvKiBGaXJzdCBzZWUgaWYgd2UgZGlkIG5vdCBhbHJlYWR5IGNyZWF0ZSB0aGlzIGRpciAqLwogCWxpc3RfZm9yX2VhY2hfZW50cnkoc3lzdGVtLCAmZXZlbnRfc3Vic3lzdGVtcywgbGlzdCkgewogCQlpZiAoc3RyY21wKHN5c3RlbS0+bmFtZSwgbmFtZSkgPT0gMCkgewotCQkJX19nZXRfc3lzdGVtKHN5c3RlbSk7CiAJCQlzeXN0ZW0tPm5yX2V2ZW50cysrOwogCQkJcmV0dXJuIHN5c3RlbS0+ZW50cnk7CiAJCX0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jCmluZGV4IDgxNmQzZDAuLmYwNGNjMzEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19maWx0ZXIuYwpAQCAtMjcsNiArMjcsMTIgQEAKICNpbmNsdWRlICJ0cmFjZS5oIgogI2luY2x1ZGUgInRyYWNlX291dHB1dC5oIgogCisjZGVmaW5lIERFRkFVTFRfU1lTX0ZJTFRFUl9NRVNTQUdFCQkJCQlcCisJIiMjIyBnbG9iYWwgZmlsdGVyICMjI1xuIgkJCQkJXAorCSIjIFVzZSB0aGlzIHRvIHNldCBmaWx0ZXJzIGZvciBtdWx0aXBsZSBldmVudHMuXG4iCQlcCisJIiMgT25seSBldmVudHMgd2l0aCB0aGUgZ2l2ZW4gZmllbGRzIHdpbGwgYmUgYWZmZWN0ZWQuXG4iCVwKKwkiIyBJZiBubyBldmVudHMgYXJlIG1vZGlmaWVkLCBhbiBlcnJvciBtZXNzYWdlIHdpbGwgYmUgZGlzcGxheWVkIGhlcmUiCisKIGVudW0gZmlsdGVyX29wX2lkcwogewogCU9QX09SLApAQCAtNjQ2LDcgKzY1Miw3IEBACiAJaWYgKGZpbHRlciAmJiBmaWx0ZXItPmZpbHRlcl9zdHJpbmcpCiAJCXRyYWNlX3NlcV9wcmludGYocywgIiVzXG4iLCBmaWx0ZXItPmZpbHRlcl9zdHJpbmcpOwogCWVsc2UKLQkJdHJhY2Vfc2VxX3ByaW50ZihzLCAibm9uZVxuIik7CisJCXRyYWNlX3NlcV9wcmludGYocywgREVGQVVMVF9TWVNfRklMVEVSX01FU1NBR0UgIlxuIik7CiAJbXV0ZXhfdW5sb2NrKCZldmVudF9tdXRleCk7CiB9CiAKQEAgLTE2NDksNyArMTY1NSw5IEBACiAJCSAqLwogCQllcnIgPSByZXBsYWNlX3ByZWRzKGNhbGwsIE5VTEwsIHBzLCBmaWx0ZXJfc3RyaW5nLCB0cnVlKTsKIAkJaWYgKGVycikKLQkJCWdvdG8gZmFpbDsKKwkJCWNhbGwtPmZsYWdzIHw9IFRSQUNFX0VWRU5UX0ZMX05PX1NFVF9GSUxURVI7CisJCWVsc2UKKwkJCWNhbGwtPmZsYWdzICY9IH5UUkFDRV9FVkVOVF9GTF9OT19TRVRfRklMVEVSOwogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKQEAgLTE2NTgsNiArMTY2Niw5IEBACiAJCWlmIChzdHJjbXAoY2FsbC0+Y2xhc3MtPnN5c3RlbSwgc3lzdGVtLT5uYW1lKSAhPSAwKQogCQkJY29udGludWU7CiAKKwkJaWYgKGNhbGwtPmZsYWdzICYgVFJBQ0VfRVZFTlRfRkxfTk9fU0VUX0ZJTFRFUikKKwkJCWNvbnRpbnVlOworCiAJCWZpbHRlcl9pdGVtID0ga3phbGxvYyhzaXplb2YoKmZpbHRlcl9pdGVtKSwgR0ZQX0tFUk5FTCk7CiAJCWlmICghZmlsdGVyX2l0ZW0pCiAJCQlnb3RvIGZhaWxfbWVtOwpAQCAtMTY4Niw3ICsxNjk3LDcgQEAKIAkJICogcmVwbGFjZSB0aGUgZmlsdGVyIGZvciB0aGUgY2FsbC4KIAkJICovCiAJCWZpbHRlciA9IGNhbGwtPmZpbHRlcjsKLQkJY2FsbC0+ZmlsdGVyID0gZmlsdGVyX2l0ZW0tPmZpbHRlcjsKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGNhbGwtPmZpbHRlciwgZmlsdGVyX2l0ZW0tPmZpbHRlcik7CiAJCWZpbHRlcl9pdGVtLT5maWx0ZXIgPSBmaWx0ZXI7CiAKIAkJZmFpbCA9IGZhbHNlOwpAQCAtMTc0MSw3ICsxNzUyLDcgQEAKIAkJZmlsdGVyID0gY2FsbC0+ZmlsdGVyOwogCQlpZiAoIWZpbHRlcikKIAkJCWdvdG8gb3V0X3VubG9jazsKLQkJY2FsbC0+ZmlsdGVyID0gTlVMTDsKKwkJUkNVX0lOSVRfUE9JTlRFUihjYWxsLT5maWx0ZXIsIE5VTEwpOwogCQkvKiBNYWtlIHN1cmUgdGhlIGZpbHRlciBpcyBub3QgYmVpbmcgdXNlZCAqLwogCQlzeW5jaHJvbml6ZV9zY2hlZCgpOwogCQlfX2ZyZWVfZmlsdGVyKGZpbHRlcik7CkBAIC0xNzgyLDcgKzE3OTMsNyBAQAogCSAqIHN0cmluZwogCSAqLwogCXRtcCA9IGNhbGwtPmZpbHRlcjsKLQljYWxsLT5maWx0ZXIgPSBmaWx0ZXI7CisJcmN1X2Fzc2lnbl9wb2ludGVyKGNhbGwtPmZpbHRlciwgZmlsdGVyKTsKIAlpZiAodG1wKSB7CiAJCS8qIE1ha2Ugc3VyZSB0aGUgY2FsbCBpcyBkb25lIHdpdGggdGhlIGZpbHRlciAqLwogCQlzeW5jaHJvbml6ZV9zY2hlZCgpOwpAQCAtMTgzMyw3ICsxODQ0LDEwIEBACiAJaWYgKCFmaWx0ZXIpCiAJCWdvdG8gb3V0OwogCi0JcmVwbGFjZV9maWx0ZXJfc3RyaW5nKGZpbHRlciwgZmlsdGVyX3N0cmluZyk7CisJLyogU3lzdGVtIGZpbHRlcnMganVzdCBzaG93IGEgZGVmYXVsdCBtZXNzYWdlICovCisJa2ZyZWUoZmlsdGVyLT5maWx0ZXJfc3RyaW5nKTsKKwlmaWx0ZXItPmZpbHRlcl9zdHJpbmcgPSBOVUxMOworCiAJLyoKIAkgKiBObyBldmVudCBhY3R1YWxseSB1c2VzIHRoZSBzeXN0ZW0gZmlsdGVyCiAJICogd2UgY2FuIGZyZWUgaXQgd2l0aG91dCBzeW5jaHJvbml6ZV9zY2hlZCgpLgpAQCAtMTg0MywxNCArMTg1NywxMiBAQAogCiAJcGFyc2VfaW5pdChwcywgZmlsdGVyX29wcywgZmlsdGVyX3N0cmluZyk7CiAJZXJyID0gZmlsdGVyX3BhcnNlKHBzKTsKLQlpZiAoZXJyKSB7Ci0JCWFwcGVuZF9maWx0ZXJfZXJyKHBzLCBzeXN0ZW0tPmZpbHRlcik7Ci0JCWdvdG8gb3V0OwotCX0KKwlpZiAoZXJyKQorCQlnb3RvIGVycl9maWx0ZXI7CiAKIAllcnIgPSByZXBsYWNlX3N5c3RlbV9wcmVkcyhzeXN0ZW0sIHBzLCBmaWx0ZXJfc3RyaW5nKTsKIAlpZiAoZXJyKQotCQlhcHBlbmRfZmlsdGVyX2Vycihwcywgc3lzdGVtLT5maWx0ZXIpOworCQlnb3RvIGVycl9maWx0ZXI7CiAKIG91dDoKIAlmaWx0ZXJfb3BzdGFja19jbGVhcihwcyk7CkBAIC0xODYwLDYgKzE4NzIsMTEgQEAKIAltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKIAogCXJldHVybiBlcnI7CisKK2Vycl9maWx0ZXI6CisJcmVwbGFjZV9maWx0ZXJfc3RyaW5nKGZpbHRlciwgZmlsdGVyX3N0cmluZyk7CisJYXBwZW5kX2ZpbHRlcl9lcnIocHMsIHN5c3RlbS0+ZmlsdGVyKTsKKwlnb3RvIG91dDsKIH0KIAogI2lmZGVmIENPTkZJR19QRVJGX0VWRU5UUwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2lycXNvZmYuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9pcnFzb2ZmLmMKaW5kZXggMjBkYWQwZC4uOTlkMjBlOSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2lycXNvZmYuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfaXJxc29mZi5jCkBAIC0yODAsOSArMjgwLDIwIEBACiB9CiAKIHN0YXRpYyB2b2lkIGlycXNvZmZfZ3JhcGhfcmV0dXJuKHN0cnVjdCBmdHJhY2VfZ3JhcGhfcmV0ICp0cmFjZSkgeyB9Ci1zdGF0aWMgdm9pZCBpcnFzb2ZmX3ByaW50X2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnMpIHsgfQogc3RhdGljIHZvaWQgaXJxc29mZl90cmFjZV9vcGVuKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikgeyB9CiBzdGF0aWMgdm9pZCBpcnFzb2ZmX3RyYWNlX2Nsb3NlKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikgeyB9CisKKyNpZmRlZiBDT05GSUdfRlVOQ1RJT05fVFJBQ0VSCitzdGF0aWMgdm9pZCBpcnFzb2ZmX3ByaW50X2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisJdHJhY2VfZGVmYXVsdF9oZWFkZXIocyk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgaXJxc29mZl9wcmludF9oZWFkZXIoc3RydWN0IHNlcV9maWxlICpzKQoreworCXRyYWNlX2xhdGVuY3lfaGVhZGVyKHMpOworfQorI2VuZGlmIC8qIENPTkZJR19GVU5DVElPTl9UUkFDRVIgKi8KICNlbmRpZiAvKiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSICovCiAKIC8qCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKaW5kZXggNTE5OTkzMC4uMGQ2ZmYzNSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYwpAQCAtNjI3LDExICs2MjcsMjMgQEAKIAl1bnNpZ25lZCBsb25nIHVzZWNfcmVtID0gZG9fZGl2KHQsIFVTRUNfUEVSX1NFQyk7CiAJdW5zaWduZWQgbG9uZyBzZWNzID0gKHVuc2lnbmVkIGxvbmcpdDsKIAljaGFyIGNvbW1bVEFTS19DT01NX0xFTl07CisJaW50IHJldDsKIAogCXRyYWNlX2ZpbmRfY21kbGluZShlbnRyeS0+cGlkLCBjb21tKTsKIAotCXJldHVybiB0cmFjZV9zZXFfcHJpbnRmKHMsICIlMTZzLSUtNWQgWyUwM2RdICU1bHUuJTA2bHU6ICIsCi0JCQkJY29tbSwgZW50cnktPnBpZCwgaXRlci0+Y3B1LCBzZWNzLCB1c2VjX3JlbSk7CisJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJTE2cy0lLTVkIFslMDNkXSAiLAorCQkJICAgICAgIGNvbW0sIGVudHJ5LT5waWQsIGl0ZXItPmNwdSk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJaWYgKHRyYWNlX2ZsYWdzICYgVFJBQ0VfSVRFUl9JUlFfSU5GTykgeworCQlyZXQgPSB0cmFjZV9wcmludF9sYXRfZm10KHMsIGVudHJ5KTsKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiICU1bHUuJTA2bHU6ICIsCisJCQkJc2VjcywgdXNlY19yZW0pOwogfQogCiBpbnQgdHJhY2VfcHJpbnRfbGF0X2NvbnRleHQoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3dha2V1cC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3dha2V1cC5jCmluZGV4IGU0YTcwYzAuLmZmNzkxZWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9zY2hlZF93YWtldXAuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfd2FrZXVwLmMKQEAgLTI4MCw5ICsyODAsMjAgQEAKIH0KIAogc3RhdGljIHZvaWQgd2FrZXVwX2dyYXBoX3JldHVybihzdHJ1Y3QgZnRyYWNlX2dyYXBoX3JldCAqdHJhY2UpIHsgfQotc3RhdGljIHZvaWQgd2FrZXVwX3ByaW50X2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnMpIHsgfQogc3RhdGljIHZvaWQgd2FrZXVwX3RyYWNlX29wZW4oc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKSB7IH0KIHN0YXRpYyB2b2lkIHdha2V1cF90cmFjZV9jbG9zZShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpIHsgfQorCisjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgorc3RhdGljIHZvaWQgd2FrZXVwX3ByaW50X2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisJdHJhY2VfZGVmYXVsdF9oZWFkZXIocyk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgd2FrZXVwX3ByaW50X2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKnMpCit7CisJdHJhY2VfbGF0ZW5jeV9oZWFkZXIocyk7Cit9CisjZW5kaWYgLyogQ09ORklHX0ZVTkNUSU9OX1RSQUNFUiAqLwogI2VuZGlmIC8qIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIgKi8KIAogLyoKZGlmZiAtLWdpdCBhL2tlcm5lbC90c2FjY3QuYyBiL2tlcm5lbC90c2FjY3QuYwppbmRleCA1YmJmYWM4Li4yM2I0ZDc4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHNhY2N0LmMKKysrIGIva2VybmVsL3RzYWNjdC5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAogCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJCXRpbWUgPSB0c2stPnN0aW1lICsgdHNrLT51dGltZTsKLQkJZHRpbWUgPSBjcHV0aW1lX3N1Yih0aW1lLCB0c2stPmFjY3RfdGltZXhwZCk7CisJCWR0aW1lID0gdGltZSAtIHRzay0+YWNjdF90aW1leHBkOwogCQlqaWZmaWVzX3RvX3RpbWV2YWwoY3B1dGltZV90b19qaWZmaWVzKGR0aW1lKSwgJnZhbHVlKTsKIAkJZGVsdGEgPSB2YWx1ZS50dl9zZWM7CiAJCWRlbHRhID0gZGVsdGEgKiBVU0VDX1BFUl9TRUMgKyB2YWx1ZS50dl91c2VjOwpkaWZmIC0tZ2l0IGEva2VybmVsL3dhaXQuYyBiL2tlcm5lbC93YWl0LmMKaW5kZXggMjZmYTc3OS4uN2ZkZDllYSAxMDA2NDQKLS0tIGEva2VybmVsL3dhaXQuYworKysgYi9rZXJuZWwvd2FpdC5jCkBAIC0xMCwxMCArMTAsMTAgQEAKICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogCi12b2lkIF9faW5pdF93YWl0cXVldWVfaGVhZCh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpCit2b2lkIF9faW5pdF93YWl0cXVldWVfaGVhZCh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpCiB7CiAJc3Bpbl9sb2NrX2luaXQoJnEtPmxvY2spOwotCWxvY2tkZXBfc2V0X2NsYXNzKCZxLT5sb2NrLCBrZXkpOworCWxvY2tkZXBfc2V0X2NsYXNzX2FuZF9uYW1lKCZxLT5sb2NrLCBrZXksIG5hbWUpOwogCUlOSVRfTElTVF9IRUFEKCZxLT50YXNrX2xpc3QpOwogfQogCmRpZmYgLS1naXQgYS9saWIvS2NvbmZpZyBiL2xpYi9LY29uZmlnCmluZGV4IDMyZjNlNWEuLjYzYjU3ODIgMTAwNjQ0Ci0tLSBhL2xpYi9LY29uZmlnCisrKyBiL2xpYi9LY29uZmlnCkBAIC0yNDQsNiArMjQ0LDkgQEAKIAlib29sCiAJZGVwZW5kcyBvbiBTTVAKIAorY29uZmlnIERRTAorCWJvb2wKKwogIwogIyBOZXRsaW5rIGF0dHJpYnV0ZSBwYXJzaW5nIHN1cHBvcnQgaXMgc2VsZWN0J2VkIGlmIG5lZWRlZAogIwpkaWZmIC0tZ2l0IGEvbGliL01ha2VmaWxlIGIvbGliL01ha2VmaWxlCmluZGV4IGE0ZGEyODMuLmZmMDBkNGQgMTAwNjQ0Ci0tLSBhL2xpYi9NYWtlZmlsZQorKysgYi9saWIvTWFrZWZpbGUKQEAgLTExNSw2ICsxMTUsOCBAQAogCiBvYmotJChDT05GSUdfQ09SRElDKSArPSBjb3JkaWMubwogCitvYmotJChDT05GSUdfRFFMKSArPSBkeW5hbWljX3F1ZXVlX2xpbWl0cy5vCisKIGhvc3Rwcm9ncy15CTo9IGdlbl9jcmMzMnRhYmxlCiBjbGVhbi1maWxlcwk6PSBjcmMzMnRhYmxlLmgKIApkaWZmIC0tZ2l0IGEvbGliL2RlYnVnb2JqZWN0cy5jIGIvbGliL2RlYnVnb2JqZWN0cy5jCmluZGV4IGE3OGI3YzYuLjc3Y2IyNDUgMTAwNjQ0Ci0tLSBhL2xpYi9kZWJ1Z29iamVjdHMuYworKysgYi9saWIvZGVidWdvYmplY3RzLmMKQEAgLTI2OCwxMiArMjY4LDE2IEBACiAgKiBUcnkgdG8gcmVwYWlyIHRoZSBkYW1hZ2UsIHNvIHdlIGhhdmUgYSBiZXR0ZXIgY2hhbmNlIHRvIGdldCB1c2VmdWwKICAqIGRlYnVnIG91dHB1dC4KICAqLwotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGRlYnVnX29iamVjdF9maXh1cChpbnQgKCpmaXh1cCkodm9pZCAqYWRkciwgZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGUpLAogCQkgICB2b2lkICogYWRkciwgZW51bSBkZWJ1Z19vYmpfc3RhdGUgc3RhdGUpCiB7CisJaW50IGZpeGVkID0gMDsKKwogCWlmIChmaXh1cCkKLQkJZGVidWdfb2JqZWN0c19maXh1cHMgKz0gZml4dXAoYWRkciwgc3RhdGUpOworCQlmaXhlZCA9IGZpeHVwKGFkZHIsIHN0YXRlKTsKKwlkZWJ1Z19vYmplY3RzX2ZpeHVwcyArPSBmaXhlZDsKKwlyZXR1cm4gZml4ZWQ7CiB9CiAKIHN0YXRpYyB2b2lkIGRlYnVnX29iamVjdF9pc19vbl9zdGFjayh2b2lkICphZGRyLCBpbnQgb25zdGFjaykKQEAgLTM4Niw2ICszOTAsOSBAQAogCXN0cnVjdCBkZWJ1Z19idWNrZXQgKmRiOwogCXN0cnVjdCBkZWJ1Z19vYmogKm9iajsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkZWJ1Z19vYmogbyA9IHsgLm9iamVjdCA9IGFkZHIsCisJCQkgICAgICAgLnN0YXRlID0gT0RFQlVHX1NUQVRFX05PVEFWQUlMQUJMRSwKKwkJCSAgICAgICAuZGVzY3IgPSBkZXNjciB9OwogCiAJaWYgKCFkZWJ1Z19vYmplY3RzX2VuYWJsZWQpCiAJCXJldHVybjsKQEAgLTQyNSw4ICs0MzIsOSBAQAogCSAqIGxldCB0aGUgdHlwZSBzcGVjaWZpYyBjb2RlIGRlY2lkZSB3aGV0aGVyIHRoaXMgaXMKIAkgKiB0cnVlIG9yIG5vdC4KIAkgKi8KLQlkZWJ1Z19vYmplY3RfZml4dXAoZGVzY3ItPmZpeHVwX2FjdGl2YXRlLCBhZGRyLAotCQkJICAgT0RFQlVHX1NUQVRFX05PVEFWQUlMQUJMRSk7CisJaWYgKGRlYnVnX29iamVjdF9maXh1cChkZXNjci0+Zml4dXBfYWN0aXZhdGUsIGFkZHIsCisJCQkgICBPREVCVUdfU1RBVEVfTk9UQVZBSUxBQkxFKSkKKwkJZGVidWdfcHJpbnRfb2JqZWN0KCZvLCAiYWN0aXZhdGUiKTsKIH0KIAogLyoqCkBAIC01NjMsNiArNTcxLDQ0IEBACiB9CiAKIC8qKgorICogZGVidWdfb2JqZWN0X2Fzc2VydF9pbml0IC0gZGVidWcgY2hlY2tzIHdoZW4gb2JqZWN0IHNob3VsZCBiZSBpbml0LWVkCisgKiBAYWRkcjoJYWRkcmVzcyBvZiB0aGUgb2JqZWN0CisgKiBAZGVzY3I6CXBvaW50ZXIgdG8gYW4gb2JqZWN0IHNwZWNpZmljIGRlYnVnIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQorICovCit2b2lkIGRlYnVnX29iamVjdF9hc3NlcnRfaW5pdCh2b2lkICphZGRyLCBzdHJ1Y3QgZGVidWdfb2JqX2Rlc2NyICpkZXNjcikKK3sKKwlzdHJ1Y3QgZGVidWdfYnVja2V0ICpkYjsKKwlzdHJ1Y3QgZGVidWdfb2JqICpvYmo7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghZGVidWdfb2JqZWN0c19lbmFibGVkKQorCQlyZXR1cm47CisKKwlkYiA9IGdldF9idWNrZXQoKHVuc2lnbmVkIGxvbmcpIGFkZHIpOworCisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZkYi0+bG9jaywgZmxhZ3MpOworCisJb2JqID0gbG9va3VwX29iamVjdChhZGRyLCBkYik7CisJaWYgKCFvYmopIHsKKwkJc3RydWN0IGRlYnVnX29iaiBvID0geyAub2JqZWN0ID0gYWRkciwKKwkJCQkgICAgICAgLnN0YXRlID0gT0RFQlVHX1NUQVRFX05PVEFWQUlMQUJMRSwKKwkJCQkgICAgICAgLmRlc2NyID0gZGVzY3IgfTsKKworCQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKKwkJLyoKKwkJICogTWF5YmUgdGhlIG9iamVjdCBpcyBzdGF0aWMuICBMZXQgdGhlIHR5cGUgc3BlY2lmaWMKKwkJICogY29kZSBkZWNpZGUgd2hhdCB0byBkby4KKwkJICovCisJCWlmIChkZWJ1Z19vYmplY3RfZml4dXAoZGVzY3ItPmZpeHVwX2Fzc2VydF9pbml0LCBhZGRyLAorCQkJCSAgICAgICBPREVCVUdfU1RBVEVfTk9UQVZBSUxBQkxFKSkKKwkJCWRlYnVnX3ByaW50X29iamVjdCgmbywgImFzc2VydF9pbml0Iik7CisJCXJldHVybjsKKwl9CisKKwlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGItPmxvY2ssIGZsYWdzKTsKK30KKworLyoqCiAgKiBkZWJ1Z19vYmplY3RfYWN0aXZlX3N0YXRlIC0gZGVidWcgY2hlY2tzIG9iamVjdCB1c2FnZSBzdGF0ZSBtYWNoaW5lCiAgKiBAYWRkcjoJYWRkcmVzcyBvZiB0aGUgb2JqZWN0CiAgKiBAZGVzY3I6CXBvaW50ZXIgdG8gYW4gb2JqZWN0IHNwZWNpZmljIGRlYnVnIGRlc2NyaXB0aW9uIHN0cnVjdHVyZQpkaWZmIC0tZ2l0IGEvbGliL2RtYS1kZWJ1Zy5jIGIvbGliL2RtYS1kZWJ1Zy5jCmluZGV4IDc0YzZjN2YuLmZlYTc5MGEgMTAwNjQ0Ci0tLSBhL2xpYi9kbWEtZGVidWcuYworKysgYi9saWIvZG1hLWRlYnVnLmMKQEAgLTI0NSw3ICsyNDUsNyBAQAogCiBzdGF0aWMgYm9vbCBleGFjdF9tYXRjaChzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICphLCBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpiKQogewotCXJldHVybiAoKGEtPmRldl9hZGRyID09IGEtPmRldl9hZGRyKSAmJgorCXJldHVybiAoKGEtPmRldl9hZGRyID09IGItPmRldl9hZGRyKSAmJgogCQkoYS0+ZGV2ID09IGItPmRldikpID8gdHJ1ZSA6IGZhbHNlOwogfQogCmRpZmYgLS1naXQgYS9saWIvZHluYW1pY19xdWV1ZV9saW1pdHMuYyBiL2xpYi9keW5hbWljX3F1ZXVlX2xpbWl0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMWJkY2QKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvZHluYW1pY19xdWV1ZV9saW1pdHMuYwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIER5bmFtaWMgYnl0ZSBxdWV1ZSBsaW1pdHMuICBTZWUgaW5jbHVkZS9saW51eC9keW5hbWljX3F1ZXVlX2xpbWl0cy5oCisgKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBUb20gSGVyYmVydCA8dGhlcmJlcnRAZ29vZ2xlLmNvbT4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9keW5hbWljX3F1ZXVlX2xpbWl0cy5oPgorCisjZGVmaW5lIFBPU0RJRkYoQSwgQikgKChBKSA+IChCKSA/IChBKSAtIChCKSA6IDApCisKKy8qIFJlY29yZHMgY29tcGxldGVkIGNvdW50IGFuZCByZWNhbGN1bGF0ZXMgdGhlIHF1ZXVlIGxpbWl0ICovCit2b2lkIGRxbF9jb21wbGV0ZWQoc3RydWN0IGRxbCAqZHFsLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgaW50IGlucHJvZ3Jlc3MsIHByZXZfaW5wcm9ncmVzcywgbGltaXQ7CisJdW5zaWduZWQgaW50IG92bGltaXQsIGFsbF9wcmV2X2NvbXBsZXRlZCwgY29tcGxldGVkOworCisJLyogQ2FuJ3QgY29tcGxldGUgbW9yZSB0aGFuIHdoYXQncyBpbiBxdWV1ZSAqLworCUJVR19PTihjb3VudCA+IGRxbC0+bnVtX3F1ZXVlZCAtIGRxbC0+bnVtX2NvbXBsZXRlZCk7CisKKwljb21wbGV0ZWQgPSBkcWwtPm51bV9jb21wbGV0ZWQgKyBjb3VudDsKKwlsaW1pdCA9IGRxbC0+bGltaXQ7CisJb3ZsaW1pdCA9IFBPU0RJRkYoZHFsLT5udW1fcXVldWVkIC0gZHFsLT5udW1fY29tcGxldGVkLCBsaW1pdCk7CisJaW5wcm9ncmVzcyA9IGRxbC0+bnVtX3F1ZXVlZCAtIGNvbXBsZXRlZDsKKwlwcmV2X2lucHJvZ3Jlc3MgPSBkcWwtPnByZXZfbnVtX3F1ZXVlZCAtIGRxbC0+bnVtX2NvbXBsZXRlZDsKKwlhbGxfcHJldl9jb21wbGV0ZWQgPSBQT1NESUZGKGNvbXBsZXRlZCwgZHFsLT5wcmV2X251bV9xdWV1ZWQpOworCisJaWYgKChvdmxpbWl0ICYmICFpbnByb2dyZXNzKSB8fAorCSAgICAoZHFsLT5wcmV2X292bGltaXQgJiYgYWxsX3ByZXZfY29tcGxldGVkKSkgeworCQkvKgorCQkgKiBRdWV1ZSBjb25zaWRlcmVkIHN0YXJ2ZWQgaWY6CisJCSAqICAgLSBUaGUgcXVldWUgd2FzIG92ZXItbGltaXQgaW4gdGhlIGxhc3QgaW50ZXJ2YWwsCisJCSAqICAgICBhbmQgdGhlcmUgaXMgbm8gbW9yZSBkYXRhIGluIHRoZSBxdWV1ZS4KKwkJICogIE9SCisJCSAqICAgLSBUaGUgcXVldWUgd2FzIG92ZXItbGltaXQgaW4gdGhlIHByZXZpb3VzIGludGVydmFsIGFuZAorCQkgKiAgICAgd2hlbiBlbnF1ZXVpbmcgaXQgd2FzIHBvc3NpYmxlIHRoYXQgYWxsIHF1ZXVlZCBkYXRhCisJCSAqICAgICBoYWQgYmVlbiBjb25zdW1lZC4gIFRoaXMgY292ZXJzIHRoZSBjYXNlIHdoZW4gcXVldWUKKwkJICogICAgIG1heSBoYXZlIGJlY29tZXMgc3RhcnZlZCBiZXR3ZWVuIGNvbXBsZXRpb24gcHJvY2Vzc2luZworCQkgKiAgICAgcnVubmluZyBhbmQgbmV4dCB0aW1lIGVucXVldWUgd2FzIHNjaGVkdWxlZC4KKwkJICoKKwkJICogICAgIFdoZW4gcXVldWUgaXMgc3RhcnZlZCBpbmNyZWFzZSB0aGUgbGltaXQgYnkgdGhlIGFtb3VudAorCQkgKiAgICAgb2YgYnl0ZXMgYm90aCBzZW50IGFuZCBjb21wbGV0ZWQgaW4gdGhlIGxhc3QgaW50ZXJ2YWwsCisJCSAqICAgICBwbHVzIGFueSBwcmV2aW91cyBvdmVyLWxpbWl0LgorCQkgKi8KKwkJbGltaXQgKz0gUE9TRElGRihjb21wbGV0ZWQsIGRxbC0+cHJldl9udW1fcXVldWVkKSArCisJCSAgICAgZHFsLT5wcmV2X292bGltaXQ7CisJCWRxbC0+c2xhY2tfc3RhcnRfdGltZSA9IGppZmZpZXM7CisJCWRxbC0+bG93ZXN0X3NsYWNrID0gVUlOVF9NQVg7CisJfSBlbHNlIGlmIChpbnByb2dyZXNzICYmIHByZXZfaW5wcm9ncmVzcyAmJiAhYWxsX3ByZXZfY29tcGxldGVkKSB7CisJCS8qCisJCSAqIFF1ZXVlIHdhcyBub3Qgc3RhcnZlZCwgY2hlY2sgaWYgdGhlIGxpbWl0IGNhbiBiZSBkZWNyZWFzZWQuCisJCSAqIEEgZGVjcmVhc2UgaXMgb25seSBjb25zaWRlcmVkIGlmIHRoZSBxdWV1ZSBoYXMgYmVlbiBidXN5IGluCisJCSAqIHRoZSB3aG9sZSBpbnRlcnZhbCAodGhlIGNoZWNrIGFib3ZlKS4KKwkJICoKKwkJICogSWYgdGhlcmUgaXMgc2xhY2ssIHRoZSBhbW91bnQgb2YgZXhlY2VzcyBkYXRhIHF1ZXVlZCBhYm92ZQorCQkgKiB0aGUgdGhlIGFtb3VudCBuZWVkZWQgdG8gcHJldmVudCBzdGFydmF0aW9uLCB0aGUgcXVldWUgbGltaXQKKwkJICogY2FuIGJlIGRlY3JlYXNlZC4gIFRvIGF2b2lkIGh5c3RlcmVzaXMgd2UgY29uc2lkZXIgdGhlCisJCSAqIG1pbmltdW0gYW1vdW50IG9mIHNsYWNrIGZvdW5kIG92ZXIgc2V2ZXJhbCBpdGVyYXRpb25zIG9mIHRoZQorCQkgKiBjb21wbGV0aW9uIHJvdXRpbmUuCisJCSAqLworCQl1bnNpZ25lZCBpbnQgc2xhY2ssIHNsYWNrX2xhc3Rfb2JqczsKKworCQkvKgorCQkgKiBTbGFjayBpcyB0aGUgbWF4aW11bSBvZgorCQkgKiAgIC0gVGhlIHF1ZXVlIGxpbWl0IHBsdXMgcHJldmlvdXMgb3Zlci1saW1pdCBtaW51cyB0d2ljZQorCQkgKiAgICAgdGhlIG51bWJlciBvZiBvYmplY3RzIGNvbXBsZXRlZC4gIE5vdGUgdGhhdCB0d28gdGltZXMKKwkJICogICAgIG51bWJlciBvZiBjb21wbGV0ZWQgYnl0ZXMgaXMgYSBiYXNpcyBmb3IgYW4gdXBwZXIgYm91bmQKKwkJICogICAgIG9mIHRoZSBsaW1pdC4KKwkJICogICAtIFBvcnRpb24gb2Ygb2JqZWN0cyBpbiB0aGUgbGFzdCBxdWV1aW5nIG9wZXJhdGlvbiB0aGF0CisJCSAqICAgICB3YXMgbm90IHBhcnQgb2Ygbm9uLXplcm8gcHJldmlvdXMgb3Zlci1saW1pdC4gIFRoYXQgaXMKKwkJICogICAgICJyb3VuZCBkb3duIiBieSBub24tb3ZlcmxpbWl0IHBvcnRpb24gb2YgdGhlIGxhc3QKKwkJICogICAgIHF1ZXVlaW5nIG9wZXJhdGlvbi4KKwkJICovCisJCXNsYWNrID0gUE9TRElGRihsaW1pdCArIGRxbC0+cHJldl9vdmxpbWl0LAorCQkgICAgMiAqIChjb21wbGV0ZWQgLSBkcWwtPm51bV9jb21wbGV0ZWQpKTsKKwkJc2xhY2tfbGFzdF9vYmpzID0gZHFsLT5wcmV2X292bGltaXQgPworCQkgICAgUE9TRElGRihkcWwtPnByZXZfbGFzdF9vYmpfY250LCBkcWwtPnByZXZfb3ZsaW1pdCkgOiAwOworCisJCXNsYWNrID0gbWF4KHNsYWNrLCBzbGFja19sYXN0X29ianMpOworCisJCWlmIChzbGFjayA8IGRxbC0+bG93ZXN0X3NsYWNrKQorCQkJZHFsLT5sb3dlc3Rfc2xhY2sgPSBzbGFjazsKKworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLAorCQkJICAgICAgIGRxbC0+c2xhY2tfc3RhcnRfdGltZSArIGRxbC0+c2xhY2tfaG9sZF90aW1lKSkgeworCQkJbGltaXQgPSBQT1NESUZGKGxpbWl0LCBkcWwtPmxvd2VzdF9zbGFjayk7CisJCQlkcWwtPnNsYWNrX3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworCQkJZHFsLT5sb3dlc3Rfc2xhY2sgPSBVSU5UX01BWDsKKwkJfQorCX0KKworCS8qIEVuZm9yY2UgYm91bmRzIG9uIGxpbWl0ICovCisJbGltaXQgPSBjbGFtcChsaW1pdCwgZHFsLT5taW5fbGltaXQsIGRxbC0+bWF4X2xpbWl0KTsKKworCWlmIChsaW1pdCAhPSBkcWwtPmxpbWl0KSB7CisJCWRxbC0+bGltaXQgPSBsaW1pdDsKKwkJb3ZsaW1pdCA9IDA7CisJfQorCisJZHFsLT5hZGpfbGltaXQgPSBsaW1pdCArIGNvbXBsZXRlZDsKKwlkcWwtPnByZXZfb3ZsaW1pdCA9IG92bGltaXQ7CisJZHFsLT5wcmV2X2xhc3Rfb2JqX2NudCA9IGRxbC0+bGFzdF9vYmpfY250OworCWRxbC0+bnVtX2NvbXBsZXRlZCA9IGNvbXBsZXRlZDsKKwlkcWwtPnByZXZfbnVtX3F1ZXVlZCA9IGRxbC0+bnVtX3F1ZXVlZDsKK30KK0VYUE9SVF9TWU1CT0woZHFsX2NvbXBsZXRlZCk7CisKK3ZvaWQgZHFsX3Jlc2V0KHN0cnVjdCBkcWwgKmRxbCkKK3sKKwkvKiBSZXNldCBhbGwgZHluYW1pYyB2YWx1ZXMgKi8KKwlkcWwtPmxpbWl0ID0gMDsKKwlkcWwtPm51bV9xdWV1ZWQgPSAwOworCWRxbC0+bnVtX2NvbXBsZXRlZCA9IDA7CisJZHFsLT5sYXN0X29ial9jbnQgPSAwOworCWRxbC0+cHJldl9udW1fcXVldWVkID0gMDsKKwlkcWwtPnByZXZfbGFzdF9vYmpfY250ID0gMDsKKwlkcWwtPnByZXZfb3ZsaW1pdCA9IDA7CisJZHFsLT5sb3dlc3Rfc2xhY2sgPSBVSU5UX01BWDsKKwlkcWwtPnNsYWNrX3N0YXJ0X3RpbWUgPSBqaWZmaWVzOworfQorRVhQT1JUX1NZTUJPTChkcWxfcmVzZXQpOworCitpbnQgZHFsX2luaXQoc3RydWN0IGRxbCAqZHFsLCB1bnNpZ25lZCBob2xkX3RpbWUpCit7CisJZHFsLT5tYXhfbGltaXQgPSBEUUxfTUFYX0xJTUlUOworCWRxbC0+bWluX2xpbWl0ID0gMDsKKwlkcWwtPnNsYWNrX2hvbGRfdGltZSA9IGhvbGRfdGltZTsKKwlkcWxfcmVzZXQoZHFsKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHFsX2luaXQpOwpkaWZmIC0tZ2l0IGEvbGliL3JlY2lwcm9jYWxfZGl2LmMgYi9saWIvcmVjaXByb2NhbF9kaXYuYwppbmRleCA2YTNiZDQ4Li43NTUxMGU5IDEwMDY0NAotLS0gYS9saWIvcmVjaXByb2NhbF9kaXYuYworKysgYi9saWIvcmVjaXByb2NhbF9kaXYuYwpAQCAtMSw1ICsxLDYgQEAKICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxsaW51eC9yZWNpcHJvY2FsX2Rpdi5oPgorI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgogCiB1MzIgcmVjaXByb2NhbF92YWx1ZSh1MzIgaykKIHsKQEAgLTcsMyArOCw0IEBACiAJZG9fZGl2KHZhbCwgayk7CiAJcmV0dXJuICh1MzIpdmFsOwogfQorRVhQT1JUX1NZTUJPTChyZWNpcHJvY2FsX3ZhbHVlKTsKZGlmZiAtLWdpdCBhL2xpYi92c3ByaW50Zi5jIGIvbGliL3ZzcHJpbnRmLmMKaW5kZXggOTkzNTk5ZS4uOGU3NTAwMyAxMDA2NDQKLS0tIGEvbGliL3ZzcHJpbnRmLmMKKysrIGIvbGliL3ZzcHJpbnRmLmMKQEAgLTc3Nyw2ICs3NzcsMTggQEAKIAlyZXR1cm4gc3RyaW5nKGJ1ZiwgZW5kLCB1dWlkLCBzcGVjKTsKIH0KIAorc3RhdGljCitjaGFyICpuZXRkZXZfZmVhdHVyZV9zdHJpbmcoY2hhciAqYnVmLCBjaGFyICplbmQsIGNvbnN0IHU4ICphZGRyLAorCQkgICAgICBzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYykKK3sKKwlzcGVjLmZsYWdzIHw9IFNQRUNJQUwgfCBTTUFMTCB8IFpFUk9QQUQ7CisJaWYgKHNwZWMuZmllbGRfd2lkdGggPT0gLTEpCisJCXNwZWMuZmllbGRfd2lkdGggPSAyICsgMiAqIHNpemVvZihuZXRkZXZfZmVhdHVyZXNfdCk7CisJc3BlYy5iYXNlID0gMTY7CisKKwlyZXR1cm4gbnVtYmVyKGJ1ZiwgZW5kLCAqKGNvbnN0IG5ldGRldl9mZWF0dXJlc190ICopYWRkciwgc3BlYyk7Cit9CisKIGludCBrcHRyX3Jlc3RyaWN0IF9fcmVhZF9tb3N0bHk7CiAKIC8qCkBAIC04MjQsNiArODM2LDcgQEAKICAqICAgICAgIERvIG5vdCB1c2UgdGhpcyBmZWF0dXJlIHdpdGhvdXQgc29tZSBtZWNoYW5pc20gdG8gdmVyaWZ5IHRoZQogICogICAgICAgY29ycmVjdG5lc3Mgb2YgdGhlIGZvcm1hdCBzdHJpbmcgYW5kIHZhX2xpc3QgYXJndW1lbnRzLgogICogLSAnSycgRm9yIGEga2VybmVsIHBvaW50ZXIgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGZyb20gdW5wcml2aWxlZ2VkIHVzZXJzCisgKiAtICdORicgRm9yIGEgbmV0ZGV2X2ZlYXR1cmVzX3QKICAqCiAgKiBOb3RlOiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuICdTJyBhbmQgJ0YnIGlzIHRoYXQgb24gaWE2NCBhbmQgcHBjNjQKICAqIGZ1bmN0aW9uIHBvaW50ZXJzIGFyZSByZWFsbHkgZnVuY3Rpb24gZGVzY3JpcHRvcnMsIHdoaWNoIGNvbnRhaW4gYQpAQCAtODk2LDYgKzkwOSwxMiBAQAogCQkgICAgICAgaGFzX2NhcGFiaWxpdHlfbm9hdWRpdChjdXJyZW50LCBDQVBfU1lTTE9HKSkpKQogCQkJcHRyID0gTlVMTDsKIAkJYnJlYWs7CisJY2FzZSAnTic6CisJCXN3aXRjaCAoZm10WzFdKSB7CisJCWNhc2UgJ0YnOgorCQkJcmV0dXJuIG5ldGRldl9mZWF0dXJlX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjKTsKKwkJfQorCQlicmVhazsKIAl9CiAJc3BlYy5mbGFncyB8PSBTTUFMTDsKIAlpZiAoc3BlYy5maWVsZF93aWR0aCA9PSAtMSkgewpkaWZmIC0tZ2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWcKaW5kZXggMDExYjExMC4uZTMzODQwNyAxMDA2NDQKLS0tIGEvbW0vS2NvbmZpZworKysgYi9tbS9LY29uZmlnCkBAIC0xMzEsNiArMTMxLDEyIEBACiBjb25maWcgSEFWRV9NRU1CTE9DSwogCWJvb2xlYW4KIAorY29uZmlnIEhBVkVfTUVNQkxPQ0tfTk9ERV9NQVAKKwlib29sZWFuCisKK2NvbmZpZyBBUkNIX0RJU0NBUkRfTUVNQkxPQ0sKKwlib29sZWFuCisKIGNvbmZpZyBOT19CT09UTUVNCiAJYm9vbGVhbgogCmRpZmYgLS1naXQgYS9tbS9maWxlbWFwLmMgYi9tbS9maWxlbWFwLmMKaW5kZXggYzAwMThmMi4uNWYwYTNjOSAxMDA2NDQKLS0tIGEvbW0vZmlsZW1hcC5jCisrKyBiL21tL2ZpbGVtYXAuYwpAQCAtMTgyOCw3ICsxODI4LDcgQEAKIAkJcGFnZSA9IF9fcGFnZV9jYWNoZV9hbGxvYyhnZnAgfCBfX0dGUF9DT0xEKTsKIAkJaWYgKCFwYWdlKQogCQkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7Ci0JCWVyciA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwgR0ZQX0tFUk5FTCk7CisJCWVyciA9IGFkZF90b19wYWdlX2NhY2hlX2xydShwYWdlLCBtYXBwaW5nLCBpbmRleCwgZ2ZwKTsKIAkJaWYgKHVubGlrZWx5KGVycikpIHsKIAkJCXBhZ2VfY2FjaGVfcmVsZWFzZShwYWdlKTsKIAkJCWlmIChlcnIgPT0gLUVFWElTVCkKQEAgLTE5MjUsMTAgKzE5MjUsNyBAQAogICogQGdmcDoJdGhlIHBhZ2UgYWxsb2NhdG9yIGZsYWdzIHRvIHVzZSBpZiBhbGxvY2F0aW5nCiAgKgogICogVGhpcyBpcyB0aGUgc2FtZSBhcyAicmVhZF9tYXBwaW5nX3BhZ2UobWFwcGluZywgaW5kZXgsIE5VTEwpIiwgYnV0IHdpdGgKLSAqIGFueSBuZXcgcGFnZSBhbGxvY2F0aW9ucyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgYWxsb2NhdGlvbiBmbGFncy4gTm90ZQotICogdGhhdCB0aGUgUmFkaXggdHJlZSBvcGVyYXRpb25zIHdpbGwgc3RpbGwgdXNlIEdGUF9LRVJORUwsIHNvIHlvdSBjYW4ndAotICogZXhwZWN0IHRvIGRvIHRoaXMgYXRvbWljYWxseSBvciBhbnl0aGluZyBsaWtlIHRoYXQgLSBidXQgeW91IGNhbiBwYXNzIGluCi0gKiBvdGhlciBwYWdlIHJlcXVpcmVtZW50cy4KKyAqIGFueSBuZXcgcGFnZSBhbGxvY2F0aW9ucyBkb25lIHVzaW5nIHRoZSBzcGVjaWZpZWQgYWxsb2NhdGlvbiBmbGFncy4KICAqCiAgKiBJZiB0aGUgcGFnZSBkb2VzIG5vdCBnZXQgYnJvdWdodCB1cHRvZGF0ZSwgcmV0dXJuIC1FSU8uCiAgKi8KQEAgLTI0MDcsNyArMjQwNCw2IEBACiAJCQkJCQlpb3ZfaXRlcl9jb3VudChpKSk7CiAKIGFnYWluOgotCiAJCS8qCiAJCSAqIEJyaW5nIGluIHRoZSB1c2VyIHBhZ2UgdGhhdCB3ZSB3aWxsIGNvcHkgZnJvbSBfZmlyc3RfLgogCQkgKiBPdGhlcndpc2UgdGhlcmUncyBhIG5hc3R5IGRlYWRsb2NrIG9uIGNvcHlpbmcgZnJvbSB0aGUKQEAgLTI0NjMsNyArMjQ1OSwxMCBAQAogCQl3cml0dGVuICs9IGNvcGllZDsKIAogCQliYWxhbmNlX2RpcnR5X3BhZ2VzX3JhdGVsaW1pdGVkKG1hcHBpbmcpOwotCisJCWlmIChmYXRhbF9zaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJc3RhdHVzID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KIAl9IHdoaWxlIChpb3ZfaXRlcl9jb3VudChpKSk7CiAKIAlyZXR1cm4gd3JpdHRlbiA/IHdyaXR0ZW4gOiBzdGF0dXM7CmRpZmYgLS1naXQgYS9tbS9odWdlX21lbW9yeS5jIGIvbW0vaHVnZV9tZW1vcnkuYwppbmRleCA0Mjk4YWJhLi4zNmIzZDk4IDEwMDY0NAotLS0gYS9tbS9odWdlX21lbW9yeS5jCisrKyBiL21tL2h1Z2VfbWVtb3J5LmMKQEAgLTIyNTksMTIgKzIyNTksOCBAQAogCiBzdGF0aWMgdm9pZCBraHVnZXBhZ2VkX2FsbG9jX3NsZWVwKHZvaWQpCiB7Ci0JREVGSU5FX1dBSVQod2FpdCk7Ci0JYWRkX3dhaXRfcXVldWUoJmtodWdlcGFnZWRfd2FpdCwgJndhaXQpOwotCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgKLQkJbXNlY3NfdG9famlmZmllcygKLQkJCWtodWdlcGFnZWRfYWxsb2Nfc2xlZXBfbWlsbGlzZWNzKSk7Ci0JcmVtb3ZlX3dhaXRfcXVldWUoJmtodWdlcGFnZWRfd2FpdCwgJndhaXQpOworCXdhaXRfZXZlbnRfZnJlZXphYmxlX3RpbWVvdXQoa2h1Z2VwYWdlZF93YWl0LCBmYWxzZSwKKwkJCW1zZWNzX3RvX2ppZmZpZXMoa2h1Z2VwYWdlZF9hbGxvY19zbGVlcF9taWxsaXNlY3MpKTsKIH0KIAogI2lmbmRlZiBDT05GSUdfTlVNQQpAQCAtMjMxMywxNCArMjMwOSwxMCBAQAogCQlpZiAodW5saWtlbHkoa3RocmVhZF9zaG91bGRfc3RvcCgpKSkKIAkJCWJyZWFrOwogCQlpZiAoa2h1Z2VwYWdlZF9oYXNfd29yaygpKSB7Ci0JCQlERUZJTkVfV0FJVCh3YWl0KTsKIAkJCWlmICgha2h1Z2VwYWdlZF9zY2FuX3NsZWVwX21pbGxpc2VjcykKIAkJCQljb250aW51ZTsKLQkJCWFkZF93YWl0X3F1ZXVlKCZraHVnZXBhZ2VkX3dhaXQsICZ3YWl0KTsKLQkJCXNjaGVkdWxlX3RpbWVvdXRfaW50ZXJydXB0aWJsZSgKLQkJCQltc2Vjc190b19qaWZmaWVzKAotCQkJCQlraHVnZXBhZ2VkX3NjYW5fc2xlZXBfbWlsbGlzZWNzKSk7Ci0JCQlyZW1vdmVfd2FpdF9xdWV1ZSgma2h1Z2VwYWdlZF93YWl0LCAmd2FpdCk7CisJCQl3YWl0X2V2ZW50X2ZyZWV6YWJsZV90aW1lb3V0KGtodWdlcGFnZWRfd2FpdCwgZmFsc2UsCisJCQkgICAgbXNlY3NfdG9famlmZmllcyhraHVnZXBhZ2VkX3NjYW5fc2xlZXBfbWlsbGlzZWNzKSk7CiAJCX0gZWxzZSBpZiAoa2h1Z2VwYWdlZF9lbmFibGVkKCkpCiAJCQl3YWl0X2V2ZW50X2ZyZWV6YWJsZShraHVnZXBhZ2VkX3dhaXQsCiAJCQkJCSAgICAga2h1Z2VwYWdlZF93YWl0X2V2ZW50KCkpOwpkaWZmIC0tZ2l0IGEvbW0vaHVnZXRsYi5jIGIvbW0vaHVnZXRsYi5jCmluZGV4IGJiMjhhNWYuLjIzMTY4NDAgMTAwNjQ0Ci0tLSBhL21tL2h1Z2V0bGIuYworKysgYi9tbS9odWdldGxiLmMKQEAgLTU3Niw2ICs1NzYsNyBAQAogCV9fU2V0UGFnZUhlYWQocGFnZSk7CiAJZm9yIChpID0gMTsgaSA8IG5yX3BhZ2VzOyBpKyssIHAgPSBtZW1fbWFwX25leHQocCwgcGFnZSwgaSkpIHsKIAkJX19TZXRQYWdlVGFpbChwKTsKKwkJc2V0X3BhZ2VfY291bnQocCwgMCk7CiAJCXAtPmZpcnN0X3BhZ2UgPSBwYWdlOwogCX0KIH0KQEAgLTkwMCw3ICs5MDEsNiBAQAogCWgtPnJlc3ZfaHVnZV9wYWdlcyArPSBkZWx0YTsKIAlyZXQgPSAwOwogCi0Jc3Bpbl91bmxvY2soJmh1Z2V0bGJfbG9jayk7CiAJLyogRnJlZSB0aGUgbmVlZGVkIHBhZ2VzIHRvIHRoZSBodWdldGxiIHBvb2wgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocGFnZSwgdG1wLCAmc3VycGx1c19saXN0LCBscnUpIHsKIAkJaWYgKCgtLW5lZWRlZCkgPCAwKQpAQCAtOTE0LDYgKzkxNCw3IEBACiAJCVZNX0JVR19PTihwYWdlX2NvdW50KHBhZ2UpKTsKIAkJZW5xdWV1ZV9odWdlX3BhZ2UoaCwgcGFnZSk7CiAJfQorCXNwaW5fdW5sb2NrKCZodWdldGxiX2xvY2spOwogCiAJLyogRnJlZSB1bm5lY2Vzc2FyeSBzdXJwbHVzIHBhZ2VzIHRvIHRoZSBidWRkeSBhbGxvY2F0b3IgKi8KIGZyZWU6CmRpZmYgLS1naXQgYS9tbS9tZW1ibG9jay5jIGIvbW0vbWVtYmxvY2suYwppbmRleCA4NGJlYzQ5Li4yZjU1ZjE5IDEwMDY0NAotLS0gYS9tbS9tZW1ibG9jay5jCisrKyBiL21tL21lbWJsb2NrLmMKQEAgLTIwLDEyICsyMCwyMyBAQAogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbWVtYmxvY2suaD4KIAotc3RydWN0IG1lbWJsb2NrIG1lbWJsb2NrIF9faW5pdGRhdGFfbWVtYmxvY2s7CitzdGF0aWMgc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiBtZW1ibG9ja19tZW1vcnlfaW5pdF9yZWdpb25zW0lOSVRfTUVNQkxPQ0tfUkVHSU9OU10gX19pbml0ZGF0YV9tZW1ibG9jazsKK3N0YXRpYyBzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uIG1lbWJsb2NrX3Jlc2VydmVkX2luaXRfcmVnaW9uc1tJTklUX01FTUJMT0NLX1JFR0lPTlNdIF9faW5pdGRhdGFfbWVtYmxvY2s7CisKK3N0cnVjdCBtZW1ibG9jayBtZW1ibG9jayBfX2luaXRkYXRhX21lbWJsb2NrID0geworCS5tZW1vcnkucmVnaW9ucwkJPSBtZW1ibG9ja19tZW1vcnlfaW5pdF9yZWdpb25zLAorCS5tZW1vcnkuY250CQk9IDEsCS8qIGVtcHR5IGR1bW15IGVudHJ5ICovCisJLm1lbW9yeS5tYXgJCT0gSU5JVF9NRU1CTE9DS19SRUdJT05TLAorCisJLnJlc2VydmVkLnJlZ2lvbnMJPSBtZW1ibG9ja19yZXNlcnZlZF9pbml0X3JlZ2lvbnMsCisJLnJlc2VydmVkLmNudAkJPSAxLAkvKiBlbXB0eSBkdW1teSBlbnRyeSAqLworCS5yZXNlcnZlZC5tYXgJCT0gSU5JVF9NRU1CTE9DS19SRUdJT05TLAorCisJLmN1cnJlbnRfbGltaXQJCT0gTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkUsCit9OwogCiBpbnQgbWVtYmxvY2tfZGVidWcgX19pbml0ZGF0YV9tZW1ibG9jazsKLWludCBtZW1ibG9ja19jYW5fcmVzaXplIF9faW5pdGRhdGFfbWVtYmxvY2s7Ci1zdGF0aWMgc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiBtZW1ibG9ja19tZW1vcnlfaW5pdF9yZWdpb25zW0lOSVRfTUVNQkxPQ0tfUkVHSU9OUyArIDFdIF9faW5pdGRhdGFfbWVtYmxvY2s7Ci1zdGF0aWMgc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiBtZW1ibG9ja19yZXNlcnZlZF9pbml0X3JlZ2lvbnNbSU5JVF9NRU1CTE9DS19SRUdJT05TICsgMV0gX19pbml0ZGF0YV9tZW1ibG9jazsKK3N0YXRpYyBpbnQgbWVtYmxvY2tfY2FuX3Jlc2l6ZSBfX2luaXRkYXRhX21lbWJsb2NrOwogCiAvKiBpbmxpbmUgc28gd2UgZG9uJ3QgZ2V0IGEgd2FybmluZyB3aGVuIHByX2RlYnVnIGlzIGNvbXBpbGVkIG91dCAqLwogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICptZW1ibG9ja190eXBlX25hbWUoc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUpCkBAIC0zOCwyMCArNDksMTUgQEAKIAkJcmV0dXJuICJ1bmtub3duIjsKIH0KIAorLyogYWRqdXN0ICpAc2l6ZSBzbyB0aGF0IChAYmFzZSArICpAc2l6ZSkgZG9lc24ndCBvdmVyZmxvdywgcmV0dXJuIG5ldyBzaXplICovCitzdGF0aWMgaW5saW5lIHBoeXNfYWRkcl90IG1lbWJsb2NrX2NhcF9zaXplKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90ICpzaXplKQoreworCXJldHVybiAqc2l6ZSA9IG1pbigqc2l6ZSwgKHBoeXNfYWRkcl90KVVMTE9OR19NQVggLSBiYXNlKTsKK30KKwogLyoKICAqIEFkZHJlc3MgY29tcGFyaXNvbiB1dGlsaXRpZXMKICAqLwotCi1zdGF0aWMgcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2FsaWduX2Rvd24ocGh5c19hZGRyX3QgYWRkciwgcGh5c19hZGRyX3Qgc2l6ZSkKLXsKLQlyZXR1cm4gYWRkciAmIH4oc2l6ZSAtIDEpOwotfQotCi1zdGF0aWMgcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2FsaWduX3VwKHBoeXNfYWRkcl90IGFkZHIsIHBoeXNfYWRkcl90IHNpemUpCi17Ci0JcmV0dXJuIChhZGRyICsgKHNpemUgLSAxKSkgJiB+KHNpemUgLSAxKTsKLX0KLQogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2FkZHJzX292ZXJsYXAocGh5c19hZGRyX3QgYmFzZTEsIHBoeXNfYWRkcl90IHNpemUxLAogCQkJCSAgICAgICBwaHlzX2FkZHJfdCBiYXNlMiwgcGh5c19hZGRyX3Qgc2l6ZTIpCiB7CkBAIC03Myw4MyArNzksNjYgQEAKIAlyZXR1cm4gKGkgPCB0eXBlLT5jbnQpID8gaSA6IC0xOwogfQogCi0vKgotICogRmluZCwgYWxsb2NhdGUsIGRlYWxsb2NhdGUgb3IgcmVzZXJ2ZSB1bnJlc2VydmVkIHJlZ2lvbnMuIEFsbCBhbGxvY2F0aW9ucwotICogYXJlIHRvcC1kb3duLgorLyoqCisgKiBtZW1ibG9ja19maW5kX2luX3JhbmdlX25vZGUgLSBmaW5kIGZyZWUgYXJlYSBpbiBnaXZlbiByYW5nZSBhbmQgbm9kZQorICogQHN0YXJ0OiBzdGFydCBvZiBjYW5kaWRhdGUgcmFuZ2UKKyAqIEBlbmQ6IGVuZCBvZiBjYW5kaWRhdGUgcmFuZ2UsIGNhbiBiZSAlTUVNQkxPQ0tfQUxMT0Nfe0FOWVdIRVJFfEFDQ0VTU0lCTEV9CisgKiBAc2l6ZTogc2l6ZSBvZiBmcmVlIGFyZWEgdG8gZmluZAorICogQGFsaWduOiBhbGlnbm1lbnQgb2YgZnJlZSBhcmVhIHRvIGZpbmQKKyAqIEBuaWQ6IG5pZCBvZiB0aGUgZnJlZSBhcmVhIHRvIGZpbmQsICVNQVhfTlVNTk9ERVMgZm9yIGFueSBub2RlCisgKgorICogRmluZCBAc2l6ZSBmcmVlIGFyZWEgYWxpZ25lZCB0byBAYWxpZ24gaW4gdGhlIHNwZWNpZmllZCByYW5nZSBhbmQgbm9kZS4KKyAqCisgKiBSRVRVUk5TOgorICogRm91bmQgYWRkcmVzcyBvbiBzdWNjZXNzLCAlMCBvbiBmYWlsdXJlLgogICovCi0KLXN0YXRpYyBwaHlzX2FkZHJfdCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfZmluZF9yZWdpb24ocGh5c19hZGRyX3Qgc3RhcnQsIHBoeXNfYWRkcl90IGVuZCwKLQkJCQkJICBwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbikKK3BoeXNfYWRkcl90IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19maW5kX2luX3JhbmdlX25vZGUocGh5c19hZGRyX3Qgc3RhcnQsCisJCQkJCXBoeXNfYWRkcl90IGVuZCwgcGh5c19hZGRyX3Qgc2l6ZSwKKwkJCQkJcGh5c19hZGRyX3QgYWxpZ24sIGludCBuaWQpCiB7Ci0JcGh5c19hZGRyX3QgYmFzZSwgcmVzX2Jhc2U7Ci0JbG9uZyBqOworCXBoeXNfYWRkcl90IHRoaXNfc3RhcnQsIHRoaXNfZW5kLCBjYW5kOworCXU2NCBpOwogCi0JLyogSW4gY2FzZSwgaHVnZSBzaXplIGlzIHJlcXVlc3RlZCAqLwotCWlmIChlbmQgPCBzaXplKQotCQlyZXR1cm4gTUVNQkxPQ0tfRVJST1I7CisJLyogYWxpZ24gQHNpemUgdG8gYXZvaWQgZXhjZXNzaXZlIGZyYWdtZW50YXRpb24gb24gcmVzZXJ2ZWQgYXJyYXkgKi8KKwlzaXplID0gcm91bmRfdXAoc2l6ZSwgYWxpZ24pOwogCi0JYmFzZSA9IG1lbWJsb2NrX2FsaWduX2Rvd24oKGVuZCAtIHNpemUpLCBhbGlnbik7Ci0KLQkvKiBQcmV2ZW50IGFsbG9jYXRpb25zIHJldHVybmluZyAwIGFzIGl0J3MgYWxzbyB1c2VkIHRvCi0JICogaW5kaWNhdGUgYW4gYWxsb2NhdGlvbiBmYWlsdXJlCi0JICovCi0JaWYgKHN0YXJ0ID09IDApCi0JCXN0YXJ0ID0gUEFHRV9TSVpFOwotCi0Jd2hpbGUgKHN0YXJ0IDw9IGJhc2UpIHsKLQkJaiA9IG1lbWJsb2NrX292ZXJsYXBzX3JlZ2lvbigmbWVtYmxvY2sucmVzZXJ2ZWQsIGJhc2UsIHNpemUpOwotCQlpZiAoaiA8IDApCi0JCQlyZXR1cm4gYmFzZTsKLQkJcmVzX2Jhc2UgPSBtZW1ibG9jay5yZXNlcnZlZC5yZWdpb25zW2pdLmJhc2U7Ci0JCWlmIChyZXNfYmFzZSA8IHNpemUpCi0JCQlicmVhazsKLQkJYmFzZSA9IG1lbWJsb2NrX2FsaWduX2Rvd24ocmVzX2Jhc2UgLSBzaXplLCBhbGlnbik7Ci0JfQotCi0JcmV0dXJuIE1FTUJMT0NLX0VSUk9SOwotfQotCi1zdGF0aWMgcGh5c19hZGRyX3QgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2ZpbmRfYmFzZShwaHlzX2FkZHJfdCBzaXplLAotCQkJcGh5c19hZGRyX3QgYWxpZ24sIHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQpCi17Ci0JbG9uZyBpOwotCi0JQlVHX09OKDAgPT0gc2l6ZSk7Ci0KLQkvKiBQdW1wIHVwIG1heF9hZGRyICovCisJLyogcHVtcCB1cCBAZW5kICovCiAJaWYgKGVuZCA9PSBNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFKQogCQllbmQgPSBtZW1ibG9jay5jdXJyZW50X2xpbWl0OwogCi0JLyogV2UgZG8gYSB0b3AtZG93biBzZWFyY2gsIHRoaXMgdGVuZHMgdG8gbGltaXQgbWVtb3J5Ci0JICogZnJhZ21lbnRhdGlvbiBieSBrZWVwaW5nIGVhcmx5IGJvb3QgYWxsb2NzIG5lYXIgdGhlCi0JICogdG9wIG9mIG1lbW9yeQotCSAqLwotCWZvciAoaSA9IG1lbWJsb2NrLm1lbW9yeS5jbnQgLSAxOyBpID49IDA7IGktLSkgewotCQlwaHlzX2FkZHJfdCBtZW1ibG9ja2Jhc2UgPSBtZW1ibG9jay5tZW1vcnkucmVnaW9uc1tpXS5iYXNlOwotCQlwaHlzX2FkZHJfdCBtZW1ibG9ja3NpemUgPSBtZW1ibG9jay5tZW1vcnkucmVnaW9uc1tpXS5zaXplOwotCQlwaHlzX2FkZHJfdCBib3R0b20sIHRvcCwgZm91bmQ7CisJLyogYWRqdXN0IEBzdGFydCB0byBhdm9pZCB1bmRlcmZsb3cgYW5kIGFsbG9jYXRpbmcgdGhlIGZpcnN0IHBhZ2UgKi8KKwlzdGFydCA9IG1heDMoc3RhcnQsIHNpemUsIChwaHlzX2FkZHJfdClQQUdFX1NJWkUpOworCWVuZCA9IG1heChzdGFydCwgZW5kKTsKIAotCQlpZiAobWVtYmxvY2tzaXplIDwgc2l6ZSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKG1lbWJsb2NrYmFzZSArIG1lbWJsb2Nrc2l6ZSkgPD0gc3RhcnQpCi0JCQlicmVhazsKLQkJYm90dG9tID0gbWF4KG1lbWJsb2NrYmFzZSwgc3RhcnQpOwotCQl0b3AgPSBtaW4obWVtYmxvY2tiYXNlICsgbWVtYmxvY2tzaXplLCBlbmQpOwotCQlpZiAoYm90dG9tID49IHRvcCkKLQkJCWNvbnRpbnVlOwotCQlmb3VuZCA9IG1lbWJsb2NrX2ZpbmRfcmVnaW9uKGJvdHRvbSwgdG9wLCBzaXplLCBhbGlnbik7Ci0JCWlmIChmb3VuZCAhPSBNRU1CTE9DS19FUlJPUikKLQkJCXJldHVybiBmb3VuZDsKKwlmb3JfZWFjaF9mcmVlX21lbV9yYW5nZV9yZXZlcnNlKGksIG5pZCwgJnRoaXNfc3RhcnQsICZ0aGlzX2VuZCwgTlVMTCkgeworCQl0aGlzX3N0YXJ0ID0gY2xhbXAodGhpc19zdGFydCwgc3RhcnQsIGVuZCk7CisJCXRoaXNfZW5kID0gY2xhbXAodGhpc19lbmQsIHN0YXJ0LCBlbmQpOworCisJCWNhbmQgPSByb3VuZF9kb3duKHRoaXNfZW5kIC0gc2l6ZSwgYWxpZ24pOworCQlpZiAoY2FuZCA+PSB0aGlzX3N0YXJ0KQorCQkJcmV0dXJuIGNhbmQ7CiAJfQotCXJldHVybiBNRU1CTE9DS19FUlJPUjsKKwlyZXR1cm4gMDsKIH0KIAotLyoKLSAqIEZpbmQgYSBmcmVlIGFyZWEgd2l0aCBzcGVjaWZpZWQgYWxpZ25tZW50IGluIGEgc3BlY2lmaWMgcmFuZ2UuCisvKioKKyAqIG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2UgLSBmaW5kIGZyZWUgYXJlYSBpbiBnaXZlbiByYW5nZQorICogQHN0YXJ0OiBzdGFydCBvZiBjYW5kaWRhdGUgcmFuZ2UKKyAqIEBlbmQ6IGVuZCBvZiBjYW5kaWRhdGUgcmFuZ2UsIGNhbiBiZSAlTUVNQkxPQ0tfQUxMT0Nfe0FOWVdIRVJFfEFDQ0VTU0lCTEV9CisgKiBAc2l6ZTogc2l6ZSBvZiBmcmVlIGFyZWEgdG8gZmluZAorICogQGFsaWduOiBhbGlnbm1lbnQgb2YgZnJlZSBhcmVhIHRvIGZpbmQKKyAqCisgKiBGaW5kIEBzaXplIGZyZWUgYXJlYSBhbGlnbmVkIHRvIEBhbGlnbiBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLgorICoKKyAqIFJFVFVSTlM6CisgKiBGb3VuZCBhZGRyZXNzIG9uIHN1Y2Nlc3MsICUwIG9uIGZhaWx1cmUuCiAgKi8KLXU2NCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfZmluZF9pbl9yYW5nZSh1NjQgc3RhcnQsIHU2NCBlbmQsIHU2NCBzaXplLCB1NjQgYWxpZ24pCitwaHlzX2FkZHJfdCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfZmluZF9pbl9yYW5nZShwaHlzX2FkZHJfdCBzdGFydCwKKwkJCQkJcGh5c19hZGRyX3QgZW5kLCBwaHlzX2FkZHJfdCBzaXplLAorCQkJCQlwaHlzX2FkZHJfdCBhbGlnbikKIHsKLQlyZXR1cm4gbWVtYmxvY2tfZmluZF9iYXNlKHNpemUsIGFsaWduLCBzdGFydCwgZW5kKTsKKwlyZXR1cm4gbWVtYmxvY2tfZmluZF9pbl9yYW5nZV9ub2RlKHN0YXJ0LCBlbmQsIHNpemUsIGFsaWduLAorCQkJCQkgICBNQVhfTlVNTk9ERVMpOwogfQogCiAvKgpAQCAtMTc4LDI1ICsxNjcsMjEgQEAKIAogc3RhdGljIHZvaWQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3JlbW92ZV9yZWdpb24oc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUsIHVuc2lnbmVkIGxvbmcgcikKIHsKLQl1bnNpZ25lZCBsb25nIGk7Ci0KLQlmb3IgKGkgPSByOyBpIDwgdHlwZS0+Y250IC0gMTsgaSsrKSB7Ci0JCXR5cGUtPnJlZ2lvbnNbaV0uYmFzZSA9IHR5cGUtPnJlZ2lvbnNbaSArIDFdLmJhc2U7Ci0JCXR5cGUtPnJlZ2lvbnNbaV0uc2l6ZSA9IHR5cGUtPnJlZ2lvbnNbaSArIDFdLnNpemU7Ci0JfQorCXR5cGUtPnRvdGFsX3NpemUgLT0gdHlwZS0+cmVnaW9uc1tyXS5zaXplOworCW1lbW1vdmUoJnR5cGUtPnJlZ2lvbnNbcl0sICZ0eXBlLT5yZWdpb25zW3IgKyAxXSwKKwkJKHR5cGUtPmNudCAtIChyICsgMSkpICogc2l6ZW9mKHR5cGUtPnJlZ2lvbnNbcl0pKTsKIAl0eXBlLT5jbnQtLTsKIAogCS8qIFNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgYXJyYXlzICovCiAJaWYgKHR5cGUtPmNudCA9PSAwKSB7CisJCVdBUk5fT04odHlwZS0+dG90YWxfc2l6ZSAhPSAwKTsKIAkJdHlwZS0+Y250ID0gMTsKIAkJdHlwZS0+cmVnaW9uc1swXS5iYXNlID0gMDsKIAkJdHlwZS0+cmVnaW9uc1swXS5zaXplID0gMDsKKwkJbWVtYmxvY2tfc2V0X3JlZ2lvbl9ub2RlKCZ0eXBlLT5yZWdpb25zWzBdLCBNQVhfTlVNTk9ERVMpOwogCX0KIH0KIAotLyogRGVmaW5lZCBiZWxvdyBidXQgbmVlZGVkIG5vdyAqLwotc3RhdGljIGxvbmcgbWVtYmxvY2tfYWRkX3JlZ2lvbihzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqdHlwZSwgcGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSk7Ci0KIHN0YXRpYyBpbnQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2RvdWJsZV9hcnJheShzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqdHlwZSkKIHsKIAlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpuZXdfYXJyYXksICpvbGRfYXJyYXk7CkBAIC0yMjYsMTAgKzIxMSwxMCBAQAogCSAqLwogCWlmICh1c2Vfc2xhYikgewogCQluZXdfYXJyYXkgPSBrbWFsbG9jKG5ld19zaXplLCBHRlBfS0VSTkVMKTsKLQkJYWRkciA9IG5ld19hcnJheSA9PSBOVUxMID8gTUVNQkxPQ0tfRVJST1IgOiBfX3BhKG5ld19hcnJheSk7CisJCWFkZHIgPSBuZXdfYXJyYXkgPyBfX3BhKG5ld19hcnJheSkgOiAwOwogCX0gZWxzZQotCQlhZGRyID0gbWVtYmxvY2tfZmluZF9iYXNlKG5ld19zaXplLCBzaXplb2YocGh5c19hZGRyX3QpLCAwLCBNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFKTsKLQlpZiAoYWRkciA9PSBNRU1CTE9DS19FUlJPUikgeworCQlhZGRyID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZSgwLCBNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFLCBuZXdfc2l6ZSwgc2l6ZW9mKHBoeXNfYWRkcl90KSk7CisJaWYgKCFhZGRyKSB7CiAJCXByX2VycigibWVtYmxvY2s6IEZhaWxlZCB0byBkb3VibGUgJXMgYXJyYXkgZnJvbSAlbGQgdG8gJWxkIGVudHJpZXMgIVxuIiwKIAkJICAgICAgIG1lbWJsb2NrX3R5cGVfbmFtZSh0eXBlKSwgdHlwZS0+bWF4LCB0eXBlLT5tYXggKiAyKTsKIAkJcmV0dXJuIC0xOwpAQCAtMjU0LDcgKzIzOSw3IEBACiAJCXJldHVybiAwOwogCiAJLyogQWRkIHRoZSBuZXcgcmVzZXJ2ZWQgcmVnaW9uIG5vdy4gU2hvdWxkIG5vdCBmYWlsICEgKi8KLQlCVUdfT04obWVtYmxvY2tfYWRkX3JlZ2lvbigmbWVtYmxvY2sucmVzZXJ2ZWQsIGFkZHIsIG5ld19zaXplKSk7CisJQlVHX09OKG1lbWJsb2NrX3Jlc2VydmUoYWRkciwgbmV3X3NpemUpKTsKIAogCS8qIElmIHRoZSBhcnJheSB3YXNuJ3Qgb3VyIHN0YXRpYyBpbml0IG9uZSwgdGhlbiBmcmVlIGl0LiBXZSBvbmx5IGRvCiAJICogdGhhdCBiZWZvcmUgU0xBQiBpcyBhdmFpbGFibGUgYXMgbGF0ZXIgb24sIHdlIGRvbid0IGtub3cgd2hldGhlcgpAQCAtMjY4LDIzMyArMjUzLDQ5NiBAQAogCXJldHVybiAwOwogfQogCi1pbnQgX19pbml0X21lbWJsb2NrIF9fd2VhayBtZW1ibG9ja19tZW1vcnlfY2FuX2NvYWxlc2NlKHBoeXNfYWRkcl90IGFkZHIxLCBwaHlzX2FkZHJfdCBzaXplMSwKLQkJCQkJICBwaHlzX2FkZHJfdCBhZGRyMiwgcGh5c19hZGRyX3Qgc2l6ZTIpCisvKioKKyAqIG1lbWJsb2NrX21lcmdlX3JlZ2lvbnMgLSBtZXJnZSBuZWlnaGJvcmluZyBjb21wYXRpYmxlIHJlZ2lvbnMKKyAqIEB0eXBlOiBtZW1ibG9jayB0eXBlIHRvIHNjYW4KKyAqCisgKiBTY2FuIEB0eXBlIGFuZCBtZXJnZSBuZWlnaGJvcmluZyBjb21wYXRpYmxlIHJlZ2lvbnMuCisgKi8KK3N0YXRpYyB2b2lkIF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19tZXJnZV9yZWdpb25zKHN0cnVjdCBtZW1ibG9ja190eXBlICp0eXBlKQogewotCXJldHVybiAxOwotfQorCWludCBpID0gMDsKIAotc3RhdGljIGxvbmcgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2FkZF9yZWdpb24oc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUsCi0JCQkJCQlwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKQotewotCXBoeXNfYWRkcl90IGVuZCA9IGJhc2UgKyBzaXplOwotCWludCBpLCBzbG90ID0gLTE7CisJLyogY250IG5ldmVyIGdvZXMgYmVsb3cgMSAqLworCXdoaWxlIChpIDwgdHlwZS0+Y250IC0gMSkgeworCQlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICp0aGlzID0gJnR5cGUtPnJlZ2lvbnNbaV07CisJCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKm5leHQgPSAmdHlwZS0+cmVnaW9uc1tpICsgMV07CiAKLQkvKiBGaXJzdCB0cnkgYW5kIGNvYWxlc2NlIHRoaXMgTUVNQkxPQ0sgd2l0aCBvdGhlcnMgKi8KLQlmb3IgKGkgPSAwOyBpIDwgdHlwZS0+Y250OyBpKyspIHsKLQkJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcmduID0gJnR5cGUtPnJlZ2lvbnNbaV07Ci0JCXBoeXNfYWRkcl90IHJlbmQgPSByZ24tPmJhc2UgKyByZ24tPnNpemU7Ci0KLQkJLyogRXhpdCBpZiB0aGVyZSdzIG5vIHBvc3NpYmxlIGhpdHMgKi8KLQkJaWYgKHJnbi0+YmFzZSA+IGVuZCB8fCByZ24tPnNpemUgPT0gMCkKLQkJCWJyZWFrOwotCi0JCS8qIENoZWNrIGlmIHdlIGFyZSBmdWxseSBlbmNsb3NlZCB3aXRoaW4gYW4gZXhpc3RpbmcKLQkJICogYmxvY2sKLQkJICovCi0JCWlmIChyZ24tPmJhc2UgPD0gYmFzZSAmJiByZW5kID49IGVuZCkKLQkJCXJldHVybiAwOwotCi0JCS8qIENoZWNrIGlmIHdlIG92ZXJsYXAgb3IgYXJlIGFkamFjZW50IHdpdGggdGhlIGJvdHRvbQotCQkgKiBvZiBhIGJsb2NrLgotCQkgKi8KLQkJaWYgKGJhc2UgPCByZ24tPmJhc2UgJiYgZW5kID49IHJnbi0+YmFzZSkgewotCQkJLyogSWYgd2UgY2FuJ3QgY29hbGVzY2UsIGNyZWF0ZSBhIG5ldyBibG9jayAqLwotCQkJaWYgKCFtZW1ibG9ja19tZW1vcnlfY2FuX2NvYWxlc2NlKGJhc2UsIHNpemUsCi0JCQkJCQkJICByZ24tPmJhc2UsCi0JCQkJCQkJICByZ24tPnNpemUpKSB7Ci0JCQkJLyogT3ZlcmxhcCAmIGNhbid0IGNvYWxlc2NlIGFyZSBtdXR1YWxseQotCQkJCSAqIGV4Y2x1c2l2ZSwgaWYgeW91IGRvIHRoYXQsIGJlIHByZXBhcmVkCi0JCQkJICogZm9yIHRyb3VibGUKLQkJCQkgKi8KLQkJCQlXQVJOX09OKGVuZCAhPSByZ24tPmJhc2UpOwotCQkJCWdvdG8gbmV3X2Jsb2NrOwotCQkJfQotCQkJLyogV2UgZXh0ZW5kIHRoZSBib3R0b20gb2YgdGhlIGJsb2NrIGRvd24gdG8gb3VyCi0JCQkgKiBiYXNlCi0JCQkgKi8KLQkJCXJnbi0+YmFzZSA9IGJhc2U7Ci0JCQlyZ24tPnNpemUgPSByZW5kIC0gYmFzZTsKLQotCQkJLyogUmV0dXJuIGlmIHdlIGhhdmUgbm90aGluZyBlbHNlIHRvIGFsbG9jYXRlCi0JCQkgKiAoZnVsbHkgY29hbGVzY2VkKQotCQkJICovCi0JCQlpZiAocmVuZCA+PSBlbmQpCi0JCQkJcmV0dXJuIDA7Ci0KLQkJCS8qIFdlIGNvbnRpbnVlIHByb2Nlc3NpbmcgZnJvbSB0aGUgZW5kIG9mIHRoZQotCQkJICogY29hbGVzY2VkIGJsb2NrLgotCQkJICovCi0JCQliYXNlID0gcmVuZDsKLQkJCXNpemUgPSBlbmQgLSBiYXNlOwotCQl9Ci0KLQkJLyogTm93IGNoZWNrIGlmIHdlIG92ZXJsYXAgb3IgYXJlIGFkamFjZW50IHdpdGggdGhlCi0JCSAqIHRvcCBvZiBhIGJsb2NrCi0JCSAqLwotCQlpZiAoYmFzZSA8PSByZW5kICYmIGVuZCA+PSByZW5kKSB7Ci0JCQkvKiBJZiB3ZSBjYW4ndCBjb2FsZXNjZSwgY3JlYXRlIGEgbmV3IGJsb2NrICovCi0JCQlpZiAoIW1lbWJsb2NrX21lbW9yeV9jYW5fY29hbGVzY2UocmduLT5iYXNlLAotCQkJCQkJCSAgcmduLT5zaXplLAotCQkJCQkJCSAgYmFzZSwgc2l6ZSkpIHsKLQkJCQkvKiBPdmVybGFwICYgY2FuJ3QgY29hbGVzY2UgYXJlIG11dHVhbGx5Ci0JCQkJICogZXhjbHVzaXZlLCBpZiB5b3UgZG8gdGhhdCwgYmUgcHJlcGFyZWQKLQkJCQkgKiBmb3IgdHJvdWJsZQotCQkJCSAqLwotCQkJCVdBUk5fT04ocmVuZCAhPSBiYXNlKTsKLQkJCQlnb3RvIG5ld19ibG9jazsKLQkJCX0KLQkJCS8qIFdlIGFkanVzdCBvdXIgYmFzZSBkb3duIHRvIGVuY2xvc2UgdGhlCi0JCQkgKiBvcmlnaW5hbCBibG9jayBhbmQgZGVzdHJveSBpdC4gSXQgd2lsbCBiZQotCQkJICogcGFydCBvZiBvdXIgbmV3IGFsbG9jYXRpb24uIFNpbmNlIHdlJ3ZlCi0JCQkgKiBmcmVlZCBhbiBlbnRyeSwgd2Uga25vdyB3ZSB3b24ndCBmYWlsCi0JCQkgKiB0byBhbGxvY2F0ZSBvbmUgbGF0ZXIsIHNvIHdlIHdvbid0IHJpc2sKLQkJCSAqIGxvc2luZyB0aGUgb3JpZ2luYWwgYmxvY2sgYWxsb2NhdGlvbi4KLQkJCSAqLwotCQkJc2l6ZSArPSAoYmFzZSAtIHJnbi0+YmFzZSk7Ci0JCQliYXNlID0gcmduLT5iYXNlOwotCQkJbWVtYmxvY2tfcmVtb3ZlX3JlZ2lvbih0eXBlLCBpLS0pOwotCQl9Ci0JfQotCi0JLyogSWYgdGhlIGFycmF5IGlzIGVtcHR5LCBzcGVjaWFsIGNhc2UsIHJlcGxhY2UgdGhlIGZha2UKLQkgKiBmaWxsZXIgcmVnaW9uIGFuZCByZXR1cm4KLQkgKi8KLQlpZiAoKHR5cGUtPmNudCA9PSAxKSAmJiAodHlwZS0+cmVnaW9uc1swXS5zaXplID09IDApKSB7Ci0JCXR5cGUtPnJlZ2lvbnNbMF0uYmFzZSA9IGJhc2U7Ci0JCXR5cGUtPnJlZ2lvbnNbMF0uc2l6ZSA9IHNpemU7Ci0JCXJldHVybiAwOwotCX0KLQotIG5ld19ibG9jazoKLQkvKiBJZiB3ZSBhcmUgb3V0IG9mIHNwYWNlLCB3ZSBmYWlsLiBJdCdzIHRvbyBsYXRlIHRvIHJlc2l6ZSB0aGUgYXJyYXkKLQkgKiBidXQgdGhlbiB0aGlzIHNob3VsZG4ndCBoYXZlIGhhcHBlbmVkIGluIHRoZSBmaXJzdCBwbGFjZS4KLQkgKi8KLQlpZiAoV0FSTl9PTih0eXBlLT5jbnQgPj0gdHlwZS0+bWF4KSkKLQkJcmV0dXJuIC0xOwotCi0JLyogQ291bGRuJ3QgY29hbGVzY2UgdGhlIE1FTUJMT0NLLCBzbyBhZGQgaXQgdG8gdGhlIHNvcnRlZCB0YWJsZS4gKi8KLQlmb3IgKGkgPSB0eXBlLT5jbnQgLSAxOyBpID49IDA7IGktLSkgewotCQlpZiAoYmFzZSA8IHR5cGUtPnJlZ2lvbnNbaV0uYmFzZSkgewotCQkJdHlwZS0+cmVnaW9uc1tpKzFdLmJhc2UgPSB0eXBlLT5yZWdpb25zW2ldLmJhc2U7Ci0JCQl0eXBlLT5yZWdpb25zW2krMV0uc2l6ZSA9IHR5cGUtPnJlZ2lvbnNbaV0uc2l6ZTsKLQkJfSBlbHNlIHsKLQkJCXR5cGUtPnJlZ2lvbnNbaSsxXS5iYXNlID0gYmFzZTsKLQkJCXR5cGUtPnJlZ2lvbnNbaSsxXS5zaXplID0gc2l6ZTsKLQkJCXNsb3QgPSBpICsgMTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCWlmIChiYXNlIDwgdHlwZS0+cmVnaW9uc1swXS5iYXNlKSB7Ci0JCXR5cGUtPnJlZ2lvbnNbMF0uYmFzZSA9IGJhc2U7Ci0JCXR5cGUtPnJlZ2lvbnNbMF0uc2l6ZSA9IHNpemU7Ci0JCXNsb3QgPSAwOwotCX0KLQl0eXBlLT5jbnQrKzsKLQotCS8qIFRoZSBhcnJheSBpcyBmdWxsID8gVHJ5IHRvIHJlc2l6ZSBpdC4gSWYgdGhhdCBmYWlscywgd2UgdW5kbwotCSAqIG91ciBhbGxvY2F0aW9uIGFuZCByZXR1cm4gYW4gZXJyb3IKLQkgKi8KLQlpZiAodHlwZS0+Y250ID09IHR5cGUtPm1heCAmJiBtZW1ibG9ja19kb3VibGVfYXJyYXkodHlwZSkpIHsKLQkJQlVHX09OKHNsb3QgPCAwKTsKLQkJbWVtYmxvY2tfcmVtb3ZlX3JlZ2lvbih0eXBlLCBzbG90KTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXJldHVybiAwOwotfQotCi1sb25nIF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19hZGQocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSkKLXsKLQlyZXR1cm4gbWVtYmxvY2tfYWRkX3JlZ2lvbigmbWVtYmxvY2subWVtb3J5LCBiYXNlLCBzaXplKTsKLQotfQotCi1zdGF0aWMgbG9uZyBfX2luaXRfbWVtYmxvY2sgX19tZW1ibG9ja19yZW1vdmUoc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUsCi0JCQkJCSAgICAgIHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUpCi17Ci0JcGh5c19hZGRyX3QgZW5kID0gYmFzZSArIHNpemU7Ci0JaW50IGk7Ci0KLQkvKiBXYWxrIHRocm91Z2ggdGhlIGFycmF5IGZvciBjb2xsaXNpb25zICovCi0JZm9yIChpID0gMDsgaSA8IHR5cGUtPmNudDsgaSsrKSB7Ci0JCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnJnbiA9ICZ0eXBlLT5yZWdpb25zW2ldOwotCQlwaHlzX2FkZHJfdCByZW5kID0gcmduLT5iYXNlICsgcmduLT5zaXplOwotCi0JCS8qIE5vdGhpbmcgbW9yZSB0byBkbywgZXhpdCAqLwotCQlpZiAocmduLT5iYXNlID4gZW5kIHx8IHJnbi0+c2l6ZSA9PSAwKQotCQkJYnJlYWs7Ci0KLQkJLyogSWYgd2UgZnVsbHkgZW5jbG9zZSB0aGUgYmxvY2ssIGRyb3AgaXQgKi8KLQkJaWYgKGJhc2UgPD0gcmduLT5iYXNlICYmIGVuZCA+PSByZW5kKSB7Ci0JCQltZW1ibG9ja19yZW1vdmVfcmVnaW9uKHR5cGUsIGktLSk7CisJCWlmICh0aGlzLT5iYXNlICsgdGhpcy0+c2l6ZSAhPSBuZXh0LT5iYXNlIHx8CisJCSAgICBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUodGhpcykgIT0KKwkJICAgIG1lbWJsb2NrX2dldF9yZWdpb25fbm9kZShuZXh0KSkgeworCQkJQlVHX09OKHRoaXMtPmJhc2UgKyB0aGlzLT5zaXplID4gbmV4dC0+YmFzZSk7CisJCQlpKys7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCS8qIElmIHdlIGFyZSBmdWxseSBlbmNsb3NlZCB3aXRoaW4gYSBibG9jawotCQkgKiB0aGVuIHdlIG5lZWQgdG8gc3BsaXQgaXQgYW5kIHdlIGFyZSBkb25lCi0JCSAqLwotCQlpZiAoYmFzZSA+IHJnbi0+YmFzZSAmJiBlbmQgPCByZW5kKSB7Ci0JCQlyZ24tPnNpemUgPSBiYXNlIC0gcmduLT5iYXNlOwotCQkJaWYgKCFtZW1ibG9ja19hZGRfcmVnaW9uKHR5cGUsIGVuZCwgcmVuZCAtIGVuZCkpCi0JCQkJcmV0dXJuIDA7Ci0JCQkvKiBGYWlsdXJlIHRvIHNwbGl0IGlzIGJhZCwgd2UgYXQgbGVhc3QKLQkJCSAqIHJlc3RvcmUgdGhlIGJsb2NrIGJlZm9yZSBlcnJvcmluZwotCQkJICovCi0JCQlyZ24tPnNpemUgPSByZW5kIC0gcmduLT5iYXNlOwotCQkJV0FSTl9PTigxKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gdHJpbSB0aGUgYm90dG9tIG9mIGEgYmxvY2sgKi8KLQkJaWYgKHJnbi0+YmFzZSA8IGVuZCAmJiByZW5kID4gZW5kKSB7Ci0JCQlyZ24tPnNpemUgLT0gZW5kIC0gcmduLT5iYXNlOwotCQkJcmduLT5iYXNlID0gZW5kOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBBbmQgY2hlY2sgaWYgd2UgbmVlZCB0byB0cmltIHRoZSB0b3Agb2YgYSBibG9jayAqLwotCQlpZiAoYmFzZSA8IHJlbmQpCi0JCQlyZ24tPnNpemUgLT0gcmVuZCAtIGJhc2U7Ci0KKwkJdGhpcy0+c2l6ZSArPSBuZXh0LT5zaXplOworCQltZW1tb3ZlKG5leHQsIG5leHQgKyAxLCAodHlwZS0+Y250IC0gKGkgKyAxKSkgKiBzaXplb2YoKm5leHQpKTsKKwkJdHlwZS0+Y250LS07CiAJfQorfQorCisvKioKKyAqIG1lbWJsb2NrX2luc2VydF9yZWdpb24gLSBpbnNlcnQgbmV3IG1lbWJsb2NrIHJlZ2lvbgorICogQHR5cGU6IG1lbWJsb2NrIHR5cGUgdG8gaW5zZXJ0IGludG8KKyAqIEBpZHg6IGluZGV4IGZvciB0aGUgaW5zZXJ0aW9uIHBvaW50CisgKiBAYmFzZTogYmFzZSBhZGRyZXNzIG9mIHRoZSBuZXcgcmVnaW9uCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbmV3IHJlZ2lvbgorICoKKyAqIEluc2VydCBuZXcgbWVtYmxvY2sgcmVnaW9uIFtAYmFzZSxAYmFzZStAc2l6ZSkgaW50byBAdHlwZSBhdCBAaWR4LgorICogQHR5cGUgbXVzdCBhbHJlYWR5IGhhdmUgZXh0cmEgcm9vbSB0byBhY2NvbW9kYXRlIHRoZSBuZXcgcmVnaW9uLgorICovCitzdGF0aWMgdm9pZCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfaW5zZXJ0X3JlZ2lvbihzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqdHlwZSwKKwkJCQkJCSAgIGludCBpZHgsIHBoeXNfYWRkcl90IGJhc2UsCisJCQkJCQkgICBwaHlzX2FkZHJfdCBzaXplLCBpbnQgbmlkKQoreworCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnJnbiA9ICZ0eXBlLT5yZWdpb25zW2lkeF07CisKKwlCVUdfT04odHlwZS0+Y250ID49IHR5cGUtPm1heCk7CisJbWVtbW92ZShyZ24gKyAxLCByZ24sICh0eXBlLT5jbnQgLSBpZHgpICogc2l6ZW9mKCpyZ24pKTsKKwlyZ24tPmJhc2UgPSBiYXNlOworCXJnbi0+c2l6ZSA9IHNpemU7CisJbWVtYmxvY2tfc2V0X3JlZ2lvbl9ub2RlKHJnbiwgbmlkKTsKKwl0eXBlLT5jbnQrKzsKKwl0eXBlLT50b3RhbF9zaXplICs9IHNpemU7Cit9CisKKy8qKgorICogbWVtYmxvY2tfYWRkX3JlZ2lvbiAtIGFkZCBuZXcgbWVtYmxvY2sgcmVnaW9uCisgKiBAdHlwZTogbWVtYmxvY2sgdHlwZSB0byBhZGQgbmV3IHJlZ2lvbiBpbnRvCisgKiBAYmFzZTogYmFzZSBhZGRyZXNzIG9mIHRoZSBuZXcgcmVnaW9uCisgKiBAc2l6ZTogc2l6ZSBvZiB0aGUgbmV3IHJlZ2lvbgorICogQG5pZDogbmlkIG9mIHRoZSBuZXcgcmVnaW9uCisgKgorICogQWRkIG5ldyBtZW1ibG9jayByZWdpb24gW0BiYXNlLEBiYXNlK0BzaXplKSBpbnRvIEB0eXBlLiAgVGhlIG5ldyByZWdpb24KKyAqIGlzIGFsbG93ZWQgdG8gb3ZlcmxhcCB3aXRoIGV4aXN0aW5nIG9uZXMgLSBvdmVybGFwcyBkb24ndCBhZmZlY3QgYWxyZWFkeQorICogZXhpc3RpbmcgcmVnaW9ucy4gIEB0eXBlIGlzIGd1YXJhbnRlZWQgdG8gYmUgbWluaW1hbCAoYWxsIG5laWdoYm91cmluZworICogY29tcGF0aWJsZSByZWdpb25zIGFyZSBtZXJnZWQpIGFmdGVyIHRoZSBhZGRpdGlvbi4KKyAqCisgKiBSRVRVUk5TOgorICogMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfYWRkX3JlZ2lvbihzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqdHlwZSwKKwkJCQlwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplLCBpbnQgbmlkKQoreworCWJvb2wgaW5zZXJ0ID0gZmFsc2U7CisJcGh5c19hZGRyX3Qgb2Jhc2UgPSBiYXNlOworCXBoeXNfYWRkcl90IGVuZCA9IGJhc2UgKyBtZW1ibG9ja19jYXBfc2l6ZShiYXNlLCAmc2l6ZSk7CisJaW50IGksIG5yX25ldzsKKworCS8qIHNwZWNpYWwgY2FzZSBmb3IgZW1wdHkgYXJyYXkgKi8KKwlpZiAodHlwZS0+cmVnaW9uc1swXS5zaXplID09IDApIHsKKwkJV0FSTl9PTih0eXBlLT5jbnQgIT0gMSB8fCB0eXBlLT50b3RhbF9zaXplKTsKKwkJdHlwZS0+cmVnaW9uc1swXS5iYXNlID0gYmFzZTsKKwkJdHlwZS0+cmVnaW9uc1swXS5zaXplID0gc2l6ZTsKKwkJbWVtYmxvY2tfc2V0X3JlZ2lvbl9ub2RlKCZ0eXBlLT5yZWdpb25zWzBdLCBuaWQpOworCQl0eXBlLT50b3RhbF9zaXplID0gc2l6ZTsKKwkJcmV0dXJuIDA7CisJfQorcmVwZWF0OgorCS8qCisJICogVGhlIGZvbGxvd2luZyBpcyBleGVjdXRlZCB0d2ljZS4gIE9uY2Ugd2l0aCAlZmFsc2UgQGluc2VydCBhbmQKKwkgKiB0aGVuIHdpdGggJXRydWUuICBUaGUgZmlyc3QgY291bnRzIHRoZSBudW1iZXIgb2YgcmVnaW9ucyBuZWVkZWQKKwkgKiB0byBhY2NvbW9kYXRlIHRoZSBuZXcgYXJlYS4gIFRoZSBzZWNvbmQgYWN0dWFsbHkgaW5zZXJ0cyB0aGVtLgorCSAqLworCWJhc2UgPSBvYmFzZTsKKwlucl9uZXcgPSAwOworCisJZm9yIChpID0gMDsgaSA8IHR5cGUtPmNudDsgaSsrKSB7CisJCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnJnbiA9ICZ0eXBlLT5yZWdpb25zW2ldOworCQlwaHlzX2FkZHJfdCByYmFzZSA9IHJnbi0+YmFzZTsKKwkJcGh5c19hZGRyX3QgcmVuZCA9IHJiYXNlICsgcmduLT5zaXplOworCisJCWlmIChyYmFzZSA+PSBlbmQpCisJCQlicmVhazsKKwkJaWYgKHJlbmQgPD0gYmFzZSkKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBAcmduIG92ZXJsYXBzLiAgSWYgaXQgc2VwYXJhdGVzIHRoZSBsb3dlciBwYXJ0IG9mIG5ldworCQkgKiBhcmVhLCBpbnNlcnQgdGhhdCBwb3J0aW9uLgorCQkgKi8KKwkJaWYgKHJiYXNlID4gYmFzZSkgeworCQkJbnJfbmV3Kys7CisJCQlpZiAoaW5zZXJ0KQorCQkJCW1lbWJsb2NrX2luc2VydF9yZWdpb24odHlwZSwgaSsrLCBiYXNlLAorCQkJCQkJICAgICAgIHJiYXNlIC0gYmFzZSwgbmlkKTsKKwkJfQorCQkvKiBhcmVhIGJlbG93IEByZW5kIGlzIGRlYWx0IHdpdGgsIGZvcmdldCBhYm91dCBpdCAqLworCQliYXNlID0gbWluKHJlbmQsIGVuZCk7CisJfQorCisJLyogaW5zZXJ0IHRoZSByZW1haW5pbmcgcG9ydGlvbiAqLworCWlmIChiYXNlIDwgZW5kKSB7CisJCW5yX25ldysrOworCQlpZiAoaW5zZXJ0KQorCQkJbWVtYmxvY2tfaW5zZXJ0X3JlZ2lvbih0eXBlLCBpLCBiYXNlLCBlbmQgLSBiYXNlLCBuaWQpOworCX0KKworCS8qCisJICogSWYgdGhpcyB3YXMgdGhlIGZpcnN0IHJvdW5kLCByZXNpemUgYXJyYXkgYW5kIHJlcGVhdCBmb3IgYWN0dWFsCisJICogaW5zZXJ0aW9uczsgb3RoZXJ3aXNlLCBtZXJnZSBhbmQgcmV0dXJuLgorCSAqLworCWlmICghaW5zZXJ0KSB7CisJCXdoaWxlICh0eXBlLT5jbnQgKyBucl9uZXcgPiB0eXBlLT5tYXgpCisJCQlpZiAobWVtYmxvY2tfZG91YmxlX2FycmF5KHR5cGUpIDwgMCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJaW5zZXJ0ID0gdHJ1ZTsKKwkJZ290byByZXBlYXQ7CisJfSBlbHNlIHsKKwkJbWVtYmxvY2tfbWVyZ2VfcmVnaW9ucyh0eXBlKTsKKwkJcmV0dXJuIDA7CisJfQorfQorCitpbnQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2FkZF9ub2RlKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUsCisJCQkJICAgICAgIGludCBuaWQpCit7CisJcmV0dXJuIG1lbWJsb2NrX2FkZF9yZWdpb24oJm1lbWJsb2NrLm1lbW9yeSwgYmFzZSwgc2l6ZSwgbmlkKTsKK30KKworaW50IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19hZGQocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSkKK3sKKwlyZXR1cm4gbWVtYmxvY2tfYWRkX3JlZ2lvbigmbWVtYmxvY2subWVtb3J5LCBiYXNlLCBzaXplLCBNQVhfTlVNTk9ERVMpOworfQorCisvKioKKyAqIG1lbWJsb2NrX2lzb2xhdGVfcmFuZ2UgLSBpc29sYXRlIGdpdmVuIHJhbmdlIGludG8gZGlzam9pbnQgbWVtYmxvY2tzCisgKiBAdHlwZTogbWVtYmxvY2sgdHlwZSB0byBpc29sYXRlIHJhbmdlIGZvcgorICogQGJhc2U6IGJhc2Ugb2YgcmFuZ2UgdG8gaXNvbGF0ZQorICogQHNpemU6IHNpemUgb2YgcmFuZ2UgdG8gaXNvbGF0ZQorICogQHN0YXJ0X3Jnbjogb3V0IHBhcmFtZXRlciBmb3IgdGhlIHN0YXJ0IG9mIGlzb2xhdGVkIHJlZ2lvbgorICogQGVuZF9yZ246IG91dCBwYXJhbWV0ZXIgZm9yIHRoZSBlbmQgb2YgaXNvbGF0ZWQgcmVnaW9uCisgKgorICogV2FsayBAdHlwZSBhbmQgZW5zdXJlIHRoYXQgcmVnaW9ucyBkb24ndCBjcm9zcyB0aGUgYm91bmRhcmllcyBkZWZpbmVkIGJ5CisgKiBbQGJhc2UsQGJhc2UrQHNpemUpLiAgQ3Jvc3NpbmcgcmVnaW9ucyBhcmUgc3BsaXQgYXQgdGhlIGJvdW5kYXJpZXMsCisgKiB3aGljaCBtYXkgY3JlYXRlIGF0IG1vc3QgdHdvIG1vcmUgcmVnaW9ucy4gIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QKKyAqIHJlZ2lvbiBpbnNpZGUgdGhlIHJhbmdlIGlzIHJldHVybmVkIGluICpAc3RhcnRfcmduIGFuZCBlbmQgaW4gKkBlbmRfcmduLgorICoKKyAqIFJFVFVSTlM6CisgKiAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19pc29sYXRlX3JhbmdlKHN0cnVjdCBtZW1ibG9ja190eXBlICp0eXBlLAorCQkJCQlwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplLAorCQkJCQlpbnQgKnN0YXJ0X3JnbiwgaW50ICplbmRfcmduKQoreworCXBoeXNfYWRkcl90IGVuZCA9IGJhc2UgKyBtZW1ibG9ja19jYXBfc2l6ZShiYXNlLCAmc2l6ZSk7CisJaW50IGk7CisKKwkqc3RhcnRfcmduID0gKmVuZF9yZ24gPSAwOworCisJLyogd2UnbGwgY3JlYXRlIGF0IG1vc3QgdHdvIG1vcmUgcmVnaW9ucyAqLworCXdoaWxlICh0eXBlLT5jbnQgKyAyID4gdHlwZS0+bWF4KQorCQlpZiAobWVtYmxvY2tfZG91YmxlX2FycmF5KHR5cGUpIDwgMCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJZm9yIChpID0gMDsgaSA8IHR5cGUtPmNudDsgaSsrKSB7CisJCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnJnbiA9ICZ0eXBlLT5yZWdpb25zW2ldOworCQlwaHlzX2FkZHJfdCByYmFzZSA9IHJnbi0+YmFzZTsKKwkJcGh5c19hZGRyX3QgcmVuZCA9IHJiYXNlICsgcmduLT5zaXplOworCisJCWlmIChyYmFzZSA+PSBlbmQpCisJCQlicmVhazsKKwkJaWYgKHJlbmQgPD0gYmFzZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChyYmFzZSA8IGJhc2UpIHsKKwkJCS8qCisJCQkgKiBAcmduIGludGVyc2VjdHMgZnJvbSBiZWxvdy4gIFNwbGl0IGFuZCBjb250aW51ZQorCQkJICogdG8gcHJvY2VzcyB0aGUgbmV4dCByZWdpb24gLSB0aGUgbmV3IHRvcCBoYWxmLgorCQkJICovCisJCQlyZ24tPmJhc2UgPSBiYXNlOworCQkJcmduLT5zaXplIC09IGJhc2UgLSByYmFzZTsKKwkJCXR5cGUtPnRvdGFsX3NpemUgLT0gYmFzZSAtIHJiYXNlOworCQkJbWVtYmxvY2tfaW5zZXJ0X3JlZ2lvbih0eXBlLCBpLCByYmFzZSwgYmFzZSAtIHJiYXNlLAorCQkJCQkgICAgICAgbWVtYmxvY2tfZ2V0X3JlZ2lvbl9ub2RlKHJnbikpOworCQl9IGVsc2UgaWYgKHJlbmQgPiBlbmQpIHsKKwkJCS8qCisJCQkgKiBAcmduIGludGVyc2VjdHMgZnJvbSBhYm92ZS4gIFNwbGl0IGFuZCByZWRvIHRoZQorCQkJICogY3VycmVudCByZWdpb24gLSB0aGUgbmV3IGJvdHRvbSBoYWxmLgorCQkJICovCisJCQlyZ24tPmJhc2UgPSBlbmQ7CisJCQlyZ24tPnNpemUgLT0gZW5kIC0gcmJhc2U7CisJCQl0eXBlLT50b3RhbF9zaXplIC09IGVuZCAtIHJiYXNlOworCQkJbWVtYmxvY2tfaW5zZXJ0X3JlZ2lvbih0eXBlLCBpLS0sIHJiYXNlLCBlbmQgLSByYmFzZSwKKwkJCQkJICAgICAgIG1lbWJsb2NrX2dldF9yZWdpb25fbm9kZShyZ24pKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEByZ24gaXMgZnVsbHkgY29udGFpbmVkLCByZWNvcmQgaXQgKi8KKwkJCWlmICghKmVuZF9yZ24pCisJCQkJKnN0YXJ0X3JnbiA9IGk7CisJCQkqZW5kX3JnbiA9IGkgKyAxOworCQl9CisJfQorCiAJcmV0dXJuIDA7CiB9CiAKLWxvbmcgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3JlbW92ZShwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKQorc3RhdGljIGludCBfX2luaXRfbWVtYmxvY2sgX19tZW1ibG9ja19yZW1vdmUoc3RydWN0IG1lbWJsb2NrX3R5cGUgKnR5cGUsCisJCQkJCSAgICAgcGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSkKK3sKKwlpbnQgc3RhcnRfcmduLCBlbmRfcmduOworCWludCBpLCByZXQ7CisKKwlyZXQgPSBtZW1ibG9ja19pc29sYXRlX3JhbmdlKHR5cGUsIGJhc2UsIHNpemUsICZzdGFydF9yZ24sICZlbmRfcmduKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gZW5kX3JnbiAtIDE7IGkgPj0gc3RhcnRfcmduOyBpLS0pCisJCW1lbWJsb2NrX3JlbW92ZV9yZWdpb24odHlwZSwgaSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfcmVtb3ZlKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUpCiB7CiAJcmV0dXJuIF9fbWVtYmxvY2tfcmVtb3ZlKCZtZW1ibG9jay5tZW1vcnksIGJhc2UsIHNpemUpOwogfQogCi1sb25nIF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19mcmVlKHBoeXNfYWRkcl90IGJhc2UsIHBoeXNfYWRkcl90IHNpemUpCitpbnQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2ZyZWUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSkKIHsKKwltZW1ibG9ja19kYmcoIiAgIG1lbWJsb2NrX2ZyZWU6IFslIzAxNmxseC0lIzAxNmxseF0gJXBGXG4iLAorCQkgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpYmFzZSwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJhc2UgKyBzaXplLAorCQkgICAgICh2b2lkICopX1JFVF9JUF8pOworCiAJcmV0dXJuIF9fbWVtYmxvY2tfcmVtb3ZlKCZtZW1ibG9jay5yZXNlcnZlZCwgYmFzZSwgc2l6ZSk7CiB9CiAKLWxvbmcgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX3Jlc2VydmUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSkKK2ludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfcmVzZXJ2ZShwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKQogewogCXN0cnVjdCBtZW1ibG9ja190eXBlICpfcmduID0gJm1lbWJsb2NrLnJlc2VydmVkOwogCisJbWVtYmxvY2tfZGJnKCJtZW1ibG9ja19yZXNlcnZlOiBbJSMwMTZsbHgtJSMwMTZsbHhdICVwRlxuIiwKKwkJICAgICAodW5zaWduZWQgbG9uZyBsb25nKWJhc2UsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyliYXNlICsgc2l6ZSwKKwkJICAgICAodm9pZCAqKV9SRVRfSVBfKTsKIAlCVUdfT04oMCA9PSBzaXplKTsKIAotCXJldHVybiBtZW1ibG9ja19hZGRfcmVnaW9uKF9yZ24sIGJhc2UsIHNpemUpOworCXJldHVybiBtZW1ibG9ja19hZGRfcmVnaW9uKF9yZ24sIGJhc2UsIHNpemUsIE1BWF9OVU1OT0RFUyk7Cit9CisKKy8qKgorICogX19uZXh0X2ZyZWVfbWVtX3JhbmdlIC0gbmV4dCBmdW5jdGlvbiBmb3IgZm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UoKQorICogQGlkeDogcG9pbnRlciB0byB1NjQgbG9vcCB2YXJpYWJsZQorICogQG5pZDogbmlkOiBub2RlIHNlbGVjdG9yLCAlTUFYX05VTU5PREVTIGZvciBhbGwgbm9kZXMKKyAqIEBwX3N0YXJ0OiBwdHIgdG8gcGh5c19hZGRyX3QgZm9yIHN0YXJ0IGFkZHJlc3Mgb2YgdGhlIHJhbmdlLCBjYW4gYmUgJU5VTEwKKyAqIEBwX2VuZDogcHRyIHRvIHBoeXNfYWRkcl90IGZvciBlbmQgYWRkcmVzcyBvZiB0aGUgcmFuZ2UsIGNhbiBiZSAlTlVMTAorICogQHBfbmlkOiBwdHIgdG8gaW50IGZvciBuaWQgb2YgdGhlIHJhbmdlLCBjYW4gYmUgJU5VTEwKKyAqCisgKiBGaW5kIHRoZSBmaXJzdCBmcmVlIGFyZWEgZnJvbSAqQGlkeCB3aGljaCBtYXRjaGVzIEBuaWQsIGZpbGwgdGhlIG91dAorICogcGFyYW1ldGVycywgYW5kIHVwZGF0ZSAqQGlkeCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uLiAgVGhlIGxvd2VyIDMyYml0IG9mCisgKiAqQGlkeCBjb250YWlucyBpbmRleCBpbnRvIG1lbW9yeSByZWdpb24gYW5kIHRoZSB1cHBlciAzMmJpdCBpbmRleGVzIHRoZQorICogYXJlYXMgYmVmb3JlIGVhY2ggcmVzZXJ2ZWQgcmVnaW9uLiAgRm9yIGV4YW1wbGUsIGlmIHJlc2VydmVkIHJlZ2lvbnMKKyAqIGxvb2sgbGlrZSB0aGUgZm9sbG93aW5nLAorICoKKyAqCTA6WzAtMTYpLCAxOlszMi00OCksIDI6WzEyOC0xMzApCisgKgorICogVGhlIHVwcGVyIDMyYml0IGluZGV4ZXMgdGhlIGZvbGxvd2luZyByZWdpb25zLgorICoKKyAqCTA6WzAtMCksIDE6WzE2LTMyKSwgMjpbNDgtMTI4KSwgMzpbMTMwLU1BWCkKKyAqCisgKiBBcyBib3RoIHJlZ2lvbiBhcnJheXMgYXJlIHNvcnRlZCwgdGhlIGZ1bmN0aW9uIGFkdmFuY2VzIHRoZSB0d28gaW5kaWNlcworICogaW4gbG9ja3N0ZXAgYW5kIHJldHVybnMgZWFjaCBpbnRlcnNlY3Rpb24uCisgKi8KK3ZvaWQgX19pbml0X21lbWJsb2NrIF9fbmV4dF9mcmVlX21lbV9yYW5nZSh1NjQgKmlkeCwgaW50IG5pZCwKKwkJCQkJICAgcGh5c19hZGRyX3QgKm91dF9zdGFydCwKKwkJCQkJICAgcGh5c19hZGRyX3QgKm91dF9lbmQsIGludCAqb3V0X25pZCkKK3sKKwlzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqbWVtID0gJm1lbWJsb2NrLm1lbW9yeTsKKwlzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqcnN2ID0gJm1lbWJsb2NrLnJlc2VydmVkOworCWludCBtaSA9ICppZHggJiAweGZmZmZmZmZmOworCWludCByaSA9ICppZHggPj4gMzI7CisKKwlmb3IgKCA7IG1pIDwgbWVtLT5jbnQ7IG1pKyspIHsKKwkJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqbSA9ICZtZW0tPnJlZ2lvbnNbbWldOworCQlwaHlzX2FkZHJfdCBtX3N0YXJ0ID0gbS0+YmFzZTsKKwkJcGh5c19hZGRyX3QgbV9lbmQgPSBtLT5iYXNlICsgbS0+c2l6ZTsKKworCQkvKiBvbmx5IG1lbW9yeSByZWdpb25zIGFyZSBhc3NvY2lhdGVkIHdpdGggbm9kZXMsIGNoZWNrIGl0ICovCisJCWlmIChuaWQgIT0gTUFYX05VTU5PREVTICYmIG5pZCAhPSBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUobSkpCisJCQljb250aW51ZTsKKworCQkvKiBzY2FuIGFyZWFzIGJlZm9yZSBlYWNoIHJlc2VydmF0aW9uIGZvciBpbnRlcnNlY3Rpb24gKi8KKwkJZm9yICggOyByaSA8IHJzdi0+Y250ICsgMTsgcmkrKykgeworCQkJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqciA9ICZyc3YtPnJlZ2lvbnNbcmldOworCQkJcGh5c19hZGRyX3Qgcl9zdGFydCA9IHJpID8gclstMV0uYmFzZSArIHJbLTFdLnNpemUgOiAwOworCQkJcGh5c19hZGRyX3Qgcl9lbmQgPSByaSA8IHJzdi0+Y250ID8gci0+YmFzZSA6IFVMTE9OR19NQVg7CisKKwkJCS8qIGlmIHJpIGFkdmFuY2VkIHBhc3QgbWksIGJyZWFrIG91dCB0byBhZHZhbmNlIG1pICovCisJCQlpZiAocl9zdGFydCA+PSBtX2VuZCkKKwkJCQlicmVhazsKKwkJCS8qIGlmIHRoZSB0d28gcmVnaW9ucyBpbnRlcnNlY3QsIHdlJ3JlIGRvbmUgKi8KKwkJCWlmIChtX3N0YXJ0IDwgcl9lbmQpIHsKKwkJCQlpZiAob3V0X3N0YXJ0KQorCQkJCQkqb3V0X3N0YXJ0ID0gbWF4KG1fc3RhcnQsIHJfc3RhcnQpOworCQkJCWlmIChvdXRfZW5kKQorCQkJCQkqb3V0X2VuZCA9IG1pbihtX2VuZCwgcl9lbmQpOworCQkJCWlmIChvdXRfbmlkKQorCQkJCQkqb3V0X25pZCA9IG1lbWJsb2NrX2dldF9yZWdpb25fbm9kZShtKTsKKwkJCQkvKgorCQkJCSAqIFRoZSByZWdpb24gd2hpY2ggZW5kcyBmaXJzdCBpcyBhZHZhbmNlZAorCQkJCSAqIGZvciB0aGUgbmV4dCBpdGVyYXRpb24uCisJCQkJICovCisJCQkJaWYgKG1fZW5kIDw9IHJfZW5kKQorCQkJCQltaSsrOworCQkJCWVsc2UKKwkJCQkJcmkrKzsKKwkJCQkqaWR4ID0gKHUzMiltaSB8ICh1NjQpcmkgPDwgMzI7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJLyogc2lnbmFsIGVuZCBvZiBpdGVyYXRpb24gKi8KKwkqaWR4ID0gVUxMT05HX01BWDsKK30KKworLyoqCisgKiBfX25leHRfZnJlZV9tZW1fcmFuZ2VfcmV2IC0gbmV4dCBmdW5jdGlvbiBmb3IgZm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2VfcmV2ZXJzZSgpCisgKiBAaWR4OiBwb2ludGVyIHRvIHU2NCBsb29wIHZhcmlhYmxlCisgKiBAbmlkOiBuaWQ6IG5vZGUgc2VsZWN0b3IsICVNQVhfTlVNTk9ERVMgZm9yIGFsbCBub2RlcworICogQHBfc3RhcnQ6IHB0ciB0byBwaHlzX2FkZHJfdCBmb3Igc3RhcnQgYWRkcmVzcyBvZiB0aGUgcmFuZ2UsIGNhbiBiZSAlTlVMTAorICogQHBfZW5kOiBwdHIgdG8gcGh5c19hZGRyX3QgZm9yIGVuZCBhZGRyZXNzIG9mIHRoZSByYW5nZSwgY2FuIGJlICVOVUxMCisgKiBAcF9uaWQ6IHB0ciB0byBpbnQgZm9yIG5pZCBvZiB0aGUgcmFuZ2UsIGNhbiBiZSAlTlVMTAorICoKKyAqIFJldmVyc2Ugb2YgX19uZXh0X2ZyZWVfbWVtX3JhbmdlKCkuCisgKi8KK3ZvaWQgX19pbml0X21lbWJsb2NrIF9fbmV4dF9mcmVlX21lbV9yYW5nZV9yZXYodTY0ICppZHgsIGludCBuaWQsCisJCQkJCSAgIHBoeXNfYWRkcl90ICpvdXRfc3RhcnQsCisJCQkJCSAgIHBoeXNfYWRkcl90ICpvdXRfZW5kLCBpbnQgKm91dF9uaWQpCit7CisJc3RydWN0IG1lbWJsb2NrX3R5cGUgKm1lbSA9ICZtZW1ibG9jay5tZW1vcnk7CisJc3RydWN0IG1lbWJsb2NrX3R5cGUgKnJzdiA9ICZtZW1ibG9jay5yZXNlcnZlZDsKKwlpbnQgbWkgPSAqaWR4ICYgMHhmZmZmZmZmZjsKKwlpbnQgcmkgPSAqaWR4ID4+IDMyOworCisJaWYgKCppZHggPT0gKHU2NClVTExPTkdfTUFYKSB7CisJCW1pID0gbWVtLT5jbnQgLSAxOworCQlyaSA9IHJzdi0+Y250OworCX0KKworCWZvciAoIDsgbWkgPj0gMDsgbWktLSkgeworCQlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICptID0gJm1lbS0+cmVnaW9uc1ttaV07CisJCXBoeXNfYWRkcl90IG1fc3RhcnQgPSBtLT5iYXNlOworCQlwaHlzX2FkZHJfdCBtX2VuZCA9IG0tPmJhc2UgKyBtLT5zaXplOworCisJCS8qIG9ubHkgbWVtb3J5IHJlZ2lvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCBub2RlcywgY2hlY2sgaXQgKi8KKwkJaWYgKG5pZCAhPSBNQVhfTlVNTk9ERVMgJiYgbmlkICE9IG1lbWJsb2NrX2dldF9yZWdpb25fbm9kZShtKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHNjYW4gYXJlYXMgYmVmb3JlIGVhY2ggcmVzZXJ2YXRpb24gZm9yIGludGVyc2VjdGlvbiAqLworCQlmb3IgKCA7IHJpID49IDA7IHJpLS0pIHsKKwkJCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnIgPSAmcnN2LT5yZWdpb25zW3JpXTsKKwkJCXBoeXNfYWRkcl90IHJfc3RhcnQgPSByaSA/IHJbLTFdLmJhc2UgKyByWy0xXS5zaXplIDogMDsKKwkJCXBoeXNfYWRkcl90IHJfZW5kID0gcmkgPCByc3YtPmNudCA/IHItPmJhc2UgOiBVTExPTkdfTUFYOworCisJCQkvKiBpZiByaSBhZHZhbmNlZCBwYXN0IG1pLCBicmVhayBvdXQgdG8gYWR2YW5jZSBtaSAqLworCQkJaWYgKHJfZW5kIDw9IG1fc3RhcnQpCisJCQkJYnJlYWs7CisJCQkvKiBpZiB0aGUgdHdvIHJlZ2lvbnMgaW50ZXJzZWN0LCB3ZSdyZSBkb25lICovCisJCQlpZiAobV9lbmQgPiByX3N0YXJ0KSB7CisJCQkJaWYgKG91dF9zdGFydCkKKwkJCQkJKm91dF9zdGFydCA9IG1heChtX3N0YXJ0LCByX3N0YXJ0KTsKKwkJCQlpZiAob3V0X2VuZCkKKwkJCQkJKm91dF9lbmQgPSBtaW4obV9lbmQsIHJfZW5kKTsKKwkJCQlpZiAob3V0X25pZCkKKwkJCQkJKm91dF9uaWQgPSBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUobSk7CisKKwkJCQlpZiAobV9zdGFydCA+PSByX3N0YXJ0KQorCQkJCQltaS0tOworCQkJCWVsc2UKKwkJCQkJcmktLTsKKwkJCQkqaWR4ID0gKHUzMiltaSB8ICh1NjQpcmkgPDwgMzI7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJfQorCisJKmlkeCA9IFVMTE9OR19NQVg7Cit9CisKKyNpZmRlZiBDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RFX01BUAorLyoKKyAqIENvbW1vbiBpdGVyYXRvciBpbnRlcmZhY2UgdXNlZCB0byBkZWZpbmUgZm9yX2VhY2hfbWVtX3JhbmdlKCkuCisgKi8KK3ZvaWQgX19pbml0X21lbWJsb2NrIF9fbmV4dF9tZW1fcGZuX3JhbmdlKGludCAqaWR4LCBpbnQgbmlkLAorCQkJCXVuc2lnbmVkIGxvbmcgKm91dF9zdGFydF9wZm4sCisJCQkJdW5zaWduZWQgbG9uZyAqb3V0X2VuZF9wZm4sIGludCAqb3V0X25pZCkKK3sKKwlzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqdHlwZSA9ICZtZW1ibG9jay5tZW1vcnk7CisJc3RydWN0IG1lbWJsb2NrX3JlZ2lvbiAqcjsKKworCXdoaWxlICgrKyppZHggPCB0eXBlLT5jbnQpIHsKKwkJciA9ICZ0eXBlLT5yZWdpb25zWyppZHhdOworCisJCWlmIChQRk5fVVAoci0+YmFzZSkgPj0gUEZOX0RPV04oci0+YmFzZSArIHItPnNpemUpKQorCQkJY29udGludWU7CisJCWlmIChuaWQgPT0gTUFYX05VTU5PREVTIHx8IG5pZCA9PSByLT5uaWQpCisJCQlicmVhazsKKwl9CisJaWYgKCppZHggPj0gdHlwZS0+Y250KSB7CisJCSppZHggPSAtMTsKKwkJcmV0dXJuOworCX0KKworCWlmIChvdXRfc3RhcnRfcGZuKQorCQkqb3V0X3N0YXJ0X3BmbiA9IFBGTl9VUChyLT5iYXNlKTsKKwlpZiAob3V0X2VuZF9wZm4pCisJCSpvdXRfZW5kX3BmbiA9IFBGTl9ET1dOKHItPmJhc2UgKyByLT5zaXplKTsKKwlpZiAob3V0X25pZCkKKwkJKm91dF9uaWQgPSByLT5uaWQ7Cit9CisKKy8qKgorICogbWVtYmxvY2tfc2V0X25vZGUgLSBzZXQgbm9kZSBJRCBvbiBtZW1ibG9jayByZWdpb25zCisgKiBAYmFzZTogYmFzZSBvZiBhcmVhIHRvIHNldCBub2RlIElEIGZvcgorICogQHNpemU6IHNpemUgb2YgYXJlYSB0byBzZXQgbm9kZSBJRCBmb3IKKyAqIEBuaWQ6IG5vZGUgSUQgdG8gc2V0CisgKgorICogU2V0IHRoZSBuaWQgb2YgbWVtYmxvY2sgbWVtb3J5IHJlZ2lvbnMgaW4gW0BiYXNlLEBiYXNlK0BzaXplKSB0byBAbmlkLgorICogUmVnaW9ucyB3aGljaCBjcm9zcyB0aGUgYXJlYSBib3VuZGFyaWVzIGFyZSBzcGxpdCBhcyBuZWNlc3NhcnkuCisgKgorICogUkVUVVJOUzoKKyAqIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCisgKi8KK2ludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfc2V0X25vZGUocGh5c19hZGRyX3QgYmFzZSwgcGh5c19hZGRyX3Qgc2l6ZSwKKwkJCQkgICAgICBpbnQgbmlkKQoreworCXN0cnVjdCBtZW1ibG9ja190eXBlICp0eXBlID0gJm1lbWJsb2NrLm1lbW9yeTsKKwlpbnQgc3RhcnRfcmduLCBlbmRfcmduOworCWludCBpLCByZXQ7CisKKwlyZXQgPSBtZW1ibG9ja19pc29sYXRlX3JhbmdlKHR5cGUsIGJhc2UsIHNpemUsICZzdGFydF9yZ24sICZlbmRfcmduKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZm9yIChpID0gc3RhcnRfcmduOyBpIDwgZW5kX3JnbjsgaSsrKQorCQl0eXBlLT5yZWdpb25zW2ldLm5pZCA9IG5pZDsKKworCW1lbWJsb2NrX21lcmdlX3JlZ2lvbnModHlwZSk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVAgKi8KKworc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBtZW1ibG9ja19hbGxvY19iYXNlX25pZChwaHlzX2FkZHJfdCBzaXplLAorCQkJCQlwaHlzX2FkZHJfdCBhbGlnbiwgcGh5c19hZGRyX3QgbWF4X2FkZHIsCisJCQkJCWludCBuaWQpCit7CisJcGh5c19hZGRyX3QgZm91bmQ7CisKKwlmb3VuZCA9IG1lbWJsb2NrX2ZpbmRfaW5fcmFuZ2Vfbm9kZSgwLCBtYXhfYWRkciwgc2l6ZSwgYWxpZ24sIG5pZCk7CisJaWYgKGZvdW5kICYmICFtZW1ibG9ja19yZXNlcnZlKGZvdW5kLCBzaXplKSkKKwkJcmV0dXJuIGZvdW5kOworCisJcmV0dXJuIDA7Cit9CisKK3BoeXNfYWRkcl90IF9faW5pdCBtZW1ibG9ja19hbGxvY19uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sIGludCBuaWQpCit7CisJcmV0dXJuIG1lbWJsb2NrX2FsbG9jX2Jhc2VfbmlkKHNpemUsIGFsaWduLCBNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFLCBuaWQpOwogfQogCiBwaHlzX2FkZHJfdCBfX2luaXQgX19tZW1ibG9ja19hbGxvY19iYXNlKHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduLCBwaHlzX2FkZHJfdCBtYXhfYWRkcikKIHsKLQlwaHlzX2FkZHJfdCBmb3VuZDsKLQotCS8qIFdlIGFsaWduIHRoZSBzaXplIHRvIGxpbWl0IGZyYWdtZW50YXRpb24uIFdpdGhvdXQgdGhpcywgYSBsb3Qgb2YKLQkgKiBzbWFsbCBhbGxvY3MgcXVpY2tseSBlYXQgdXAgdGhlIHdob2xlIHJlc2VydmUgYXJyYXkgb24gc3BhcmMKLQkgKi8KLQlzaXplID0gbWVtYmxvY2tfYWxpZ25fdXAoc2l6ZSwgYWxpZ24pOwotCi0JZm91bmQgPSBtZW1ibG9ja19maW5kX2Jhc2Uoc2l6ZSwgYWxpZ24sIDAsIG1heF9hZGRyKTsKLQlpZiAoZm91bmQgIT0gTUVNQkxPQ0tfRVJST1IgJiYKLQkgICAgIW1lbWJsb2NrX2FkZF9yZWdpb24oJm1lbWJsb2NrLnJlc2VydmVkLCBmb3VuZCwgc2l6ZSkpCi0JCXJldHVybiBmb3VuZDsKLQotCXJldHVybiAwOworCXJldHVybiBtZW1ibG9ja19hbGxvY19iYXNlX25pZChzaXplLCBhbGlnbiwgbWF4X2FkZHIsIE1BWF9OVU1OT0RFUyk7CiB9CiAKIHBoeXNfYWRkcl90IF9faW5pdCBtZW1ibG9ja19hbGxvY19iYXNlKHBoeXNfYWRkcl90IHNpemUsIHBoeXNfYWRkcl90IGFsaWduLCBwaHlzX2FkZHJfdCBtYXhfYWRkcikKQEAgLTUxNSwxMDUgKzc2MywxMyBAQAogCXJldHVybiBtZW1ibG9ja19hbGxvY19iYXNlKHNpemUsIGFsaWduLCBNRU1CTE9DS19BTExPQ19BQ0NFU1NJQkxFKTsKIH0KIAotCi0vKgotICogQWRkaXRpb25hbCBub2RlLWxvY2FsIGFsbG9jYXRvcnMuIFNlYXJjaCBmb3Igbm9kZSBtZW1vcnkgaXMgYm90dG9tIHVwCi0gKiBhbmQgd2Fsa3MgbWVtYmxvY2sgcmVnaW9ucyB3aXRoaW4gdGhhdCBub2RlIGJvdHRvbS11cCBhcyB3ZWxsLCBidXQgYWxsb2NhdGlvbgotICogd2l0aGluIGFuIG1lbWJsb2NrIHJlZ2lvbiBpcyB0b3AtZG93bi4gWFhYIEkgcGxhbiB0byBmaXggdGhhdCBhdCBzb21lIHN0YWdlCi0gKgotICogV0FSTklORzogT25seSBhdmFpbGFibGUgYWZ0ZXIgZWFybHlfbm9kZV9tYXBbXSBoYXMgYmVlbiBwb3B1bGF0ZWQsCi0gKiBvbiBzb21lIGFyY2hpdGVjdHVyZXMsIHRoYXQgaXMgYWZ0ZXIgYWxsIHRoZSBjYWxscyB0byBhZGRfYWN0aXZlX3JhbmdlKCkKLSAqIGhhdmUgYmVlbiBkb25lIHRvIHBvcHVsYXRlIGl0LgotICovCi0KLXBoeXNfYWRkcl90IF9fd2VhayBfX2luaXQgbWVtYmxvY2tfbmlkX3JhbmdlKHBoeXNfYWRkcl90IHN0YXJ0LCBwaHlzX2FkZHJfdCBlbmQsIGludCAqbmlkKQotewotI2lmZGVmIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUAotCS8qCi0JICogVGhpcyBjb2RlIG9yaWdpbmF0ZXMgZnJvbSBzcGFyYyB3aGljaCByZWFsbHkgd2FudHMgdXNlIHRvIHdhbGsgYnkgYWRkcmVzc2VzCi0JICogYW5kIHJldHVybnMgdGhlIG5pZC4gVGhpcyBpcyBub3QgdmVyeSBjb252ZW5pZW50IGZvciBlYXJseV9wZm5fbWFwW10gdXNlcnMKLQkgKiBhcyB0aGUgbWFwIGlzbid0IHNvcnRlZCB5ZXQsIGFuZCBpdCByZWFsbHkgd2FudHMgdG8gYmUgd2Fsa2VkIGJ5IG5pZC4KLQkgKgotCSAqIEZvciBub3csIEkgaW1wbGVtZW50IHRoZSBpbmVmZmljaWVudCBtZXRob2QgYmVsb3cgd2hpY2ggd2Fsa3MgdGhlIGVhcmx5Ci0JICogbWFwIG11bHRpcGxlIHRpbWVzLiBFdmVudHVhbGx5IHdlIG1heSB3YW50IHRvIHVzZSBhbiBBUkNIIGNvbmZpZyBvcHRpb24KLQkgKiB0byBpbXBsZW1lbnQgYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBtZXRob2QgZm9yIGJvdGggY2FzZS4KLQkgKi8KLQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykgewotCQlnZXRfcGZuX3JhbmdlX2Zvcl9uaWQoaSwgJnN0YXJ0X3BmbiwgJmVuZF9wZm4pOwotCQlpZiAoc3RhcnQgPCBQRk5fUEhZUyhzdGFydF9wZm4pIHx8IHN0YXJ0ID49IFBGTl9QSFlTKGVuZF9wZm4pKQotCQkJY29udGludWU7Ci0JCSpuaWQgPSBpOwotCQlyZXR1cm4gbWluKGVuZCwgUEZOX1BIWVMoZW5kX3BmbikpOwotCX0KLSNlbmRpZgotCSpuaWQgPSAwOwotCi0JcmV0dXJuIGVuZDsKLX0KLQotc3RhdGljIHBoeXNfYWRkcl90IF9faW5pdCBtZW1ibG9ja19hbGxvY19uaWRfcmVnaW9uKHN0cnVjdCBtZW1ibG9ja19yZWdpb24gKm1wLAotCQkJCQkgICAgICAgcGh5c19hZGRyX3Qgc2l6ZSwKLQkJCQkJICAgICAgIHBoeXNfYWRkcl90IGFsaWduLCBpbnQgbmlkKQotewotCXBoeXNfYWRkcl90IHN0YXJ0LCBlbmQ7Ci0KLQlzdGFydCA9IG1wLT5iYXNlOwotCWVuZCA9IHN0YXJ0ICsgbXAtPnNpemU7Ci0KLQlzdGFydCA9IG1lbWJsb2NrX2FsaWduX3VwKHN0YXJ0LCBhbGlnbik7Ci0Jd2hpbGUgKHN0YXJ0IDwgZW5kKSB7Ci0JCXBoeXNfYWRkcl90IHRoaXNfZW5kOwotCQlpbnQgdGhpc19uaWQ7Ci0KLQkJdGhpc19lbmQgPSBtZW1ibG9ja19uaWRfcmFuZ2Uoc3RhcnQsIGVuZCwgJnRoaXNfbmlkKTsKLQkJaWYgKHRoaXNfbmlkID09IG5pZCkgewotCQkJcGh5c19hZGRyX3QgcmV0ID0gbWVtYmxvY2tfZmluZF9yZWdpb24oc3RhcnQsIHRoaXNfZW5kLCBzaXplLCBhbGlnbik7Ci0JCQlpZiAocmV0ICE9IE1FTUJMT0NLX0VSUk9SICYmCi0JCQkgICAgIW1lbWJsb2NrX2FkZF9yZWdpb24oJm1lbWJsb2NrLnJlc2VydmVkLCByZXQsIHNpemUpKQotCQkJCXJldHVybiByZXQ7Ci0JCX0KLQkJc3RhcnQgPSB0aGlzX2VuZDsKLQl9Ci0KLQlyZXR1cm4gTUVNQkxPQ0tfRVJST1I7Ci19Ci0KLXBoeXNfYWRkcl90IF9faW5pdCBtZW1ibG9ja19hbGxvY19uaWQocGh5c19hZGRyX3Qgc2l6ZSwgcGh5c19hZGRyX3QgYWxpZ24sIGludCBuaWQpCi17Ci0Jc3RydWN0IG1lbWJsb2NrX3R5cGUgKm1lbSA9ICZtZW1ibG9jay5tZW1vcnk7Ci0JaW50IGk7Ci0KLQlCVUdfT04oMCA9PSBzaXplKTsKLQotCS8qIFdlIGFsaWduIHRoZSBzaXplIHRvIGxpbWl0IGZyYWdtZW50YXRpb24uIFdpdGhvdXQgdGhpcywgYSBsb3Qgb2YKLQkgKiBzbWFsbCBhbGxvY3MgcXVpY2tseSBlYXQgdXAgdGhlIHdob2xlIHJlc2VydmUgYXJyYXkgb24gc3BhcmMKLQkgKi8KLQlzaXplID0gbWVtYmxvY2tfYWxpZ25fdXAoc2l6ZSwgYWxpZ24pOwotCi0JLyogV2UgZG8gYSBib3R0b20tdXAgc2VhcmNoIGZvciBhIHJlZ2lvbiB3aXRoIHRoZSByaWdodAotCSAqIG5pZCBzaW5jZSB0aGF0J3MgZWFzaWVyIGNvbnNpZGVyaW5nIGhvdyBtZW1ibG9ja19uaWRfcmFuZ2UoKQotCSAqIHdvcmtzCi0JICovCi0JZm9yIChpID0gMDsgaSA8IG1lbS0+Y250OyBpKyspIHsKLQkJcGh5c19hZGRyX3QgcmV0ID0gbWVtYmxvY2tfYWxsb2NfbmlkX3JlZ2lvbigmbWVtLT5yZWdpb25zW2ldLAotCQkJCQkgICAgICAgc2l6ZSwgYWxpZ24sIG5pZCk7Ci0JCWlmIChyZXQgIT0gTUVNQkxPQ0tfRVJST1IpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldHVybiAwOwotfQotCiBwaHlzX2FkZHJfdCBfX2luaXQgbWVtYmxvY2tfYWxsb2NfdHJ5X25pZChwaHlzX2FkZHJfdCBzaXplLCBwaHlzX2FkZHJfdCBhbGlnbiwgaW50IG5pZCkKIHsKIAlwaHlzX2FkZHJfdCByZXMgPSBtZW1ibG9ja19hbGxvY19uaWQoc2l6ZSwgYWxpZ24sIG5pZCk7CiAKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwotCXJldHVybiBtZW1ibG9ja19hbGxvY19iYXNlKHNpemUsIGFsaWduLCBNRU1CTE9DS19BTExPQ19BTllXSEVSRSk7CisJcmV0dXJuIG1lbWJsb2NrX2FsbG9jX2Jhc2Uoc2l6ZSwgYWxpZ24sIE1FTUJMT0NLX0FMTE9DX0FDQ0VTU0lCTEUpOwogfQogCiAKQEAgLTYyMSwxMCArNzc3LDkgQEAKICAqIFJlbWFpbmluZyBBUEkgZnVuY3Rpb25zCiAgKi8KIAotLyogWW91IG11c3QgY2FsbCBtZW1ibG9ja19hbmFseXplKCkgYmVmb3JlIHRoaXMuICovCiBwaHlzX2FkZHJfdCBfX2luaXQgbWVtYmxvY2tfcGh5c19tZW1fc2l6ZSh2b2lkKQogewotCXJldHVybiBtZW1ibG9jay5tZW1vcnlfc2l6ZTsKKwlyZXR1cm4gbWVtYmxvY2subWVtb3J5LnRvdGFsX3NpemU7CiB9CiAKIC8qIGxvd2VzdCBhZGRyZXNzICovCkBAIC02NDAsNDUgKzc5NSwyOCBAQAogCXJldHVybiAobWVtYmxvY2subWVtb3J5LnJlZ2lvbnNbaWR4XS5iYXNlICsgbWVtYmxvY2subWVtb3J5LnJlZ2lvbnNbaWR4XS5zaXplKTsKIH0KIAotLyogWW91IG11c3QgY2FsbCBtZW1ibG9ja19hbmFseXplKCkgYWZ0ZXIgdGhpcy4gKi8KLXZvaWQgX19pbml0IG1lbWJsb2NrX2VuZm9yY2VfbWVtb3J5X2xpbWl0KHBoeXNfYWRkcl90IG1lbW9yeV9saW1pdCkKK3ZvaWQgX19pbml0IG1lbWJsb2NrX2VuZm9yY2VfbWVtb3J5X2xpbWl0KHBoeXNfYWRkcl90IGxpbWl0KQogewogCXVuc2lnbmVkIGxvbmcgaTsKLQlwaHlzX2FkZHJfdCBsaW1pdDsKLQlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpwOworCXBoeXNfYWRkcl90IG1heF9hZGRyID0gKHBoeXNfYWRkcl90KVVMTE9OR19NQVg7CiAKLQlpZiAoIW1lbW9yeV9saW1pdCkKKwlpZiAoIWxpbWl0KQogCQlyZXR1cm47CiAKLQkvKiBUcnVuY2F0ZSB0aGUgbWVtYmxvY2sgcmVnaW9ucyB0byBzYXRpc2Z5IHRoZSBtZW1vcnkgbGltaXQuICovCi0JbGltaXQgPSBtZW1vcnlfbGltaXQ7CisJLyogZmluZCBvdXQgbWF4IGFkZHJlc3MgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbWVtYmxvY2subWVtb3J5LmNudDsgaSsrKSB7Ci0JCWlmIChsaW1pdCA+IG1lbWJsb2NrLm1lbW9yeS5yZWdpb25zW2ldLnNpemUpIHsKLQkJCWxpbWl0IC09IG1lbWJsb2NrLm1lbW9yeS5yZWdpb25zW2ldLnNpemU7Ci0JCQljb250aW51ZTsKLQkJfQorCQlzdHJ1Y3QgbWVtYmxvY2tfcmVnaW9uICpyID0gJm1lbWJsb2NrLm1lbW9yeS5yZWdpb25zW2ldOwogCi0JCW1lbWJsb2NrLm1lbW9yeS5yZWdpb25zW2ldLnNpemUgPSBsaW1pdDsKLQkJbWVtYmxvY2subWVtb3J5LmNudCA9IGkgKyAxOwotCQlicmVhazsKKwkJaWYgKGxpbWl0IDw9IHItPnNpemUpIHsKKwkJCW1heF9hZGRyID0gci0+YmFzZSArIGxpbWl0OworCQkJYnJlYWs7CisJCX0KKwkJbGltaXQgLT0gci0+c2l6ZTsKIAl9CiAKLQltZW1vcnlfbGltaXQgPSBtZW1ibG9ja19lbmRfb2ZfRFJBTSgpOwotCi0JLyogQW5kIHRydW5jYXRlIGFueSByZXNlcnZlcyBhYm92ZSB0aGUgbGltaXQgYWxzby4gKi8KLQlmb3IgKGkgPSAwOyBpIDwgbWVtYmxvY2sucmVzZXJ2ZWQuY250OyBpKyspIHsKLQkJcCA9ICZtZW1ibG9jay5yZXNlcnZlZC5yZWdpb25zW2ldOwotCi0JCWlmIChwLT5iYXNlID4gbWVtb3J5X2xpbWl0KQotCQkJcC0+c2l6ZSA9IDA7Ci0JCWVsc2UgaWYgKChwLT5iYXNlICsgcC0+c2l6ZSkgPiBtZW1vcnlfbGltaXQpCi0JCQlwLT5zaXplID0gbWVtb3J5X2xpbWl0IC0gcC0+YmFzZTsKLQotCQlpZiAocC0+c2l6ZSA9PSAwKSB7Ci0JCQltZW1ibG9ja19yZW1vdmVfcmVnaW9uKCZtZW1ibG9jay5yZXNlcnZlZCwgaSk7Ci0JCQlpLS07Ci0JCX0KLQl9CisJLyogdHJ1bmNhdGUgYm90aCBtZW1vcnkgYW5kIHJlc2VydmVkIHJlZ2lvbnMgKi8KKwlfX21lbWJsb2NrX3JlbW92ZSgmbWVtYmxvY2subWVtb3J5LCBtYXhfYWRkciwgKHBoeXNfYWRkcl90KVVMTE9OR19NQVgpOworCV9fbWVtYmxvY2tfcmVtb3ZlKCZtZW1ibG9jay5yZXNlcnZlZCwgbWF4X2FkZHIsIChwaHlzX2FkZHJfdClVTExPTkdfTUFYKTsKIH0KIAogc3RhdGljIGludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfc2VhcmNoKHN0cnVjdCBtZW1ibG9ja190eXBlICp0eXBlLCBwaHlzX2FkZHJfdCBhZGRyKQpAQCAtNzEyLDE2ICs4NTAsMTggQEAKIGludCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfaXNfcmVnaW9uX21lbW9yeShwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKQogewogCWludCBpZHggPSBtZW1ibG9ja19zZWFyY2goJm1lbWJsb2NrLm1lbW9yeSwgYmFzZSk7CisJcGh5c19hZGRyX3QgZW5kID0gYmFzZSArIG1lbWJsb2NrX2NhcF9zaXplKGJhc2UsICZzaXplKTsKIAogCWlmIChpZHggPT0gLTEpCiAJCXJldHVybiAwOwogCXJldHVybiBtZW1ibG9jay5tZW1vcnkucmVnaW9uc1tpZHhdLmJhc2UgPD0gYmFzZSAmJgogCQkobWVtYmxvY2subWVtb3J5LnJlZ2lvbnNbaWR4XS5iYXNlICsKLQkJIG1lbWJsb2NrLm1lbW9yeS5yZWdpb25zW2lkeF0uc2l6ZSkgPj0gKGJhc2UgKyBzaXplKTsKKwkJIG1lbWJsb2NrLm1lbW9yeS5yZWdpb25zW2lkeF0uc2l6ZSkgPj0gZW5kOwogfQogCiBpbnQgX19pbml0X21lbWJsb2NrIG1lbWJsb2NrX2lzX3JlZ2lvbl9yZXNlcnZlZChwaHlzX2FkZHJfdCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKQogeworCW1lbWJsb2NrX2NhcF9zaXplKGJhc2UsICZzaXplKTsKIAlyZXR1cm4gbWVtYmxvY2tfb3ZlcmxhcHNfcmVnaW9uKCZtZW1ibG9jay5yZXNlcnZlZCwgYmFzZSwgc2l6ZSkgPj0gMDsKIH0KIApAQCAtNzMxLDg2ICs4NzEsNDUgQEAKIAltZW1ibG9jay5jdXJyZW50X2xpbWl0ID0gbGltaXQ7CiB9CiAKLXN0YXRpYyB2b2lkIF9faW5pdF9tZW1ibG9jayBtZW1ibG9ja19kdW1wKHN0cnVjdCBtZW1ibG9ja190eXBlICpyZWdpb24sIGNoYXIgKm5hbWUpCitzdGF0aWMgdm9pZCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfZHVtcChzdHJ1Y3QgbWVtYmxvY2tfdHlwZSAqdHlwZSwgY2hhciAqbmFtZSkKIHsKIAl1bnNpZ25lZCBsb25nIGxvbmcgYmFzZSwgc2l6ZTsKIAlpbnQgaTsKIAotCXByX2luZm8oIiAlcy5jbnQgID0gMHglbHhcbiIsIG5hbWUsIHJlZ2lvbi0+Y250KTsKKwlwcl9pbmZvKCIgJXMuY250ICA9IDB4JWx4XG4iLCBuYW1lLCB0eXBlLT5jbnQpOwogCi0JZm9yIChpID0gMDsgaSA8IHJlZ2lvbi0+Y250OyBpKyspIHsKLQkJYmFzZSA9IHJlZ2lvbi0+cmVnaW9uc1tpXS5iYXNlOwotCQlzaXplID0gcmVnaW9uLT5yZWdpb25zW2ldLnNpemU7CisJZm9yIChpID0gMDsgaSA8IHR5cGUtPmNudDsgaSsrKSB7CisJCXN0cnVjdCBtZW1ibG9ja19yZWdpb24gKnJnbiA9ICZ0eXBlLT5yZWdpb25zW2ldOworCQljaGFyIG5pZF9idWZbMzJdID0gIiI7CiAKLQkJcHJfaW5mbygiICVzWyUjeF1cdFslIzAxNmxseC0lIzAxNmxseF0sICUjbGx4IGJ5dGVzXG4iLAotCQkgICAgbmFtZSwgaSwgYmFzZSwgYmFzZSArIHNpemUgLSAxLCBzaXplKTsKKwkJYmFzZSA9IHJnbi0+YmFzZTsKKwkJc2l6ZSA9IHJnbi0+c2l6ZTsKKyNpZmRlZiBDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RFX01BUAorCQlpZiAobWVtYmxvY2tfZ2V0X3JlZ2lvbl9ub2RlKHJnbikgIT0gTUFYX05VTU5PREVTKQorCQkJc25wcmludGYobmlkX2J1Ziwgc2l6ZW9mKG5pZF9idWYpLCAiIG9uIG5vZGUgJWQiLAorCQkJCSBtZW1ibG9ja19nZXRfcmVnaW9uX25vZGUocmduKSk7CisjZW5kaWYKKwkJcHJfaW5mbygiICVzWyUjeF1cdFslIzAxNmxseC0lIzAxNmxseF0sICUjbGx4IGJ5dGVzJXNcbiIsCisJCQluYW1lLCBpLCBiYXNlLCBiYXNlICsgc2l6ZSAtIDEsIHNpemUsIG5pZF9idWYpOwogCX0KIH0KIAotdm9pZCBfX2luaXRfbWVtYmxvY2sgbWVtYmxvY2tfZHVtcF9hbGwodm9pZCkKK3ZvaWQgX19pbml0X21lbWJsb2NrIF9fbWVtYmxvY2tfZHVtcF9hbGwodm9pZCkKIHsKLQlpZiAoIW1lbWJsb2NrX2RlYnVnKQotCQlyZXR1cm47Ci0KIAlwcl9pbmZvKCJNRU1CTE9DSyBjb25maWd1cmF0aW9uOlxuIik7Ci0JcHJfaW5mbygiIG1lbW9yeSBzaXplID0gMHglbGx4XG4iLCAodW5zaWduZWQgbG9uZyBsb25nKW1lbWJsb2NrLm1lbW9yeV9zaXplKTsKKwlwcl9pbmZvKCIgbWVtb3J5IHNpemUgPSAlI2xseCByZXNlcnZlZCBzaXplID0gJSNsbHhcbiIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWVtYmxvY2subWVtb3J5LnRvdGFsX3NpemUsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpbWVtYmxvY2sucmVzZXJ2ZWQudG90YWxfc2l6ZSk7CiAKIAltZW1ibG9ja19kdW1wKCZtZW1ibG9jay5tZW1vcnksICJtZW1vcnkiKTsKIAltZW1ibG9ja19kdW1wKCZtZW1ibG9jay5yZXNlcnZlZCwgInJlc2VydmVkIik7CiB9CiAKLXZvaWQgX19pbml0IG1lbWJsb2NrX2FuYWx5emUodm9pZCkKK3ZvaWQgX19pbml0IG1lbWJsb2NrX2FsbG93X3Jlc2l6ZSh2b2lkKQogewotCWludCBpOwotCi0JLyogQ2hlY2sgbWFya2VyIGluIHRoZSB1bnVzZWQgbGFzdCBhcnJheSBlbnRyeSAqLwotCVdBUk5fT04obWVtYmxvY2tfbWVtb3J5X2luaXRfcmVnaW9uc1tJTklUX01FTUJMT0NLX1JFR0lPTlNdLmJhc2UKLQkJIT0gTUVNQkxPQ0tfSU5BQ1RJVkUpOwotCVdBUk5fT04obWVtYmxvY2tfcmVzZXJ2ZWRfaW5pdF9yZWdpb25zW0lOSVRfTUVNQkxPQ0tfUkVHSU9OU10uYmFzZQotCQkhPSBNRU1CTE9DS19JTkFDVElWRSk7Ci0KLQltZW1ibG9jay5tZW1vcnlfc2l6ZSA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWVtYmxvY2subWVtb3J5LmNudDsgaSsrKQotCQltZW1ibG9jay5tZW1vcnlfc2l6ZSArPSBtZW1ibG9jay5tZW1vcnkucmVnaW9uc1tpXS5zaXplOwotCi0JLyogV2UgYWxsb3cgcmVzaXppbmcgZnJvbSB0aGVyZSAqLwogCW1lbWJsb2NrX2Nhbl9yZXNpemUgPSAxOwogfQogCi12b2lkIF9faW5pdCBtZW1ibG9ja19pbml0KHZvaWQpCi17Ci0Jc3RhdGljIGludCBpbml0X2RvbmUgX19pbml0ZGF0YSA9IDA7Ci0KLQlpZiAoaW5pdF9kb25lKQotCQlyZXR1cm47Ci0JaW5pdF9kb25lID0gMTsKLQotCS8qIEhvb2t1cCB0aGUgaW5pdGlhbCBhcnJheXMgKi8KLQltZW1ibG9jay5tZW1vcnkucmVnaW9ucwk9IG1lbWJsb2NrX21lbW9yeV9pbml0X3JlZ2lvbnM7Ci0JbWVtYmxvY2subWVtb3J5Lm1heAkJPSBJTklUX01FTUJMT0NLX1JFR0lPTlM7Ci0JbWVtYmxvY2sucmVzZXJ2ZWQucmVnaW9ucwk9IG1lbWJsb2NrX3Jlc2VydmVkX2luaXRfcmVnaW9uczsKLQltZW1ibG9jay5yZXNlcnZlZC5tYXgJPSBJTklUX01FTUJMT0NLX1JFR0lPTlM7Ci0KLQkvKiBXcml0ZSBhIG1hcmtlciBpbiB0aGUgdW51c2VkIGxhc3QgYXJyYXkgZW50cnkgKi8KLQltZW1ibG9jay5tZW1vcnkucmVnaW9uc1tJTklUX01FTUJMT0NLX1JFR0lPTlNdLmJhc2UgPSBNRU1CTE9DS19JTkFDVElWRTsKLQltZW1ibG9jay5yZXNlcnZlZC5yZWdpb25zW0lOSVRfTUVNQkxPQ0tfUkVHSU9OU10uYmFzZSA9IE1FTUJMT0NLX0lOQUNUSVZFOwotCi0JLyogQ3JlYXRlIGEgZHVtbXkgemVybyBzaXplIE1FTUJMT0NLIHdoaWNoIHdpbGwgZ2V0IGNvYWxlc2NlZCBhd2F5IGxhdGVyLgotCSAqIFRoaXMgc2ltcGxpZmllcyB0aGUgbWVtYmxvY2tfYWRkKCkgY29kZSBiZWxvdy4uLgotCSAqLwotCW1lbWJsb2NrLm1lbW9yeS5yZWdpb25zWzBdLmJhc2UgPSAwOwotCW1lbWJsb2NrLm1lbW9yeS5yZWdpb25zWzBdLnNpemUgPSAwOwotCW1lbWJsb2NrLm1lbW9yeS5jbnQgPSAxOwotCi0JLyogRGl0dG8uICovCi0JbWVtYmxvY2sucmVzZXJ2ZWQucmVnaW9uc1swXS5iYXNlID0gMDsKLQltZW1ibG9jay5yZXNlcnZlZC5yZWdpb25zWzBdLnNpemUgPSAwOwotCW1lbWJsb2NrLnJlc2VydmVkLmNudCA9IDE7Ci0KLQltZW1ibG9jay5jdXJyZW50X2xpbWl0ID0gTUVNQkxPQ0tfQUxMT0NfQU5ZV0hFUkU7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGVhcmx5X21lbWJsb2NrKGNoYXIgKnApCiB7CiAJaWYgKHAgJiYgc3Ryc3RyKHAsICJkZWJ1ZyIpKQpAQCAtODE5LDcgKzkxOCw3IEBACiB9CiBlYXJseV9wYXJhbSgibWVtYmxvY2siLCBlYXJseV9tZW1ibG9jayk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ERUJVR19GUykgJiYgIWRlZmluZWQoQVJDSF9ESVNDQVJEX01FTUJMT0NLKQorI2lmIGRlZmluZWQoQ09ORklHX0RFQlVHX0ZTKSAmJiAhZGVmaW5lZChDT05GSUdfQVJDSF9ESVNDQVJEX01FTUJMT0NLKQogCiBzdGF0aWMgaW50IG1lbWJsb2NrX2RlYnVnX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICpwcml2YXRlKQogewpkaWZmIC0tZ2l0IGEvbW0vbWVtY29udHJvbC5jIGIvbW0vbWVtY29udHJvbC5jCmluZGV4IDZhZmY5M2MuLjk0ZGE4ZWUgMTAwNjQ0Ci0tLSBhL21tL21lbWNvbnRyb2wuYworKysgYi9tbS9tZW1jb250cm9sLmMKQEAgLTUwLDYgKzUwLDggQEAKICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9vb20uaD4KICNpbmNsdWRlICJpbnRlcm5hbC5oIgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3RjcF9tZW1jb250cm9sLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0yODYsNiArMjg4LDEwIEBACiAJICovCiAJc3RydWN0IG1lbV9jZ3JvdXBfc3RhdF9jcHUgbm9jcHVfYmFzZTsKIAlzcGlubG9ja190IHBjcF9jb3VudGVyX2xvY2s7CisKKyNpZmRlZiBDT05GSUdfSU5FVAorCXN0cnVjdCB0Y3BfbWVtY29udHJvbCB0Y3BfbWVtOworI2VuZGlmCiB9OwogCiAvKiBTdHVmZnMgZm9yIG1vdmUgY2hhcmdlcyBhdCB0YXNrIG1pZ3JhdGlvbi4gKi8KQEAgLTM2NSw3ICszNzEsNTggQEAKIAogc3RhdGljIHZvaWQgbWVtX2Nncm91cF9nZXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKTsKIHN0YXRpYyB2b2lkIG1lbV9jZ3JvdXBfcHV0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7Ci1zdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudF9tZW1fY2dyb3VwKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7CisKKy8qIFdyaXRpbmcgdGhlbSBoZXJlIHRvIGF2b2lkIGV4cG9zaW5nIG1lbWNnJ3MgaW5uZXIgbGF5b3V0ICovCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfS01FTQorI2lmZGVmIENPTkZJR19JTkVUCisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKworc3RhdGljIGJvb2wgbWVtX2Nncm91cF9pc19yb290KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyk7Cit2b2lkIHNvY2tfdXBkYXRlX21lbWNnKHN0cnVjdCBzb2NrICpzaykKK3sKKwkvKiBBIHNvY2tldCBzcGVuZHMgaXRzIHdob2xlIGxpZmUgaW4gdGhlIHNhbWUgY2dyb3VwICovCisJaWYgKHNrLT5za19jZ3JwKSB7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CisJaWYgKHN0YXRpY19icmFuY2goJm1lbWNnX3NvY2tldF9saW1pdF9lbmFibGVkKSkgeworCQlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2c7CisKKwkJQlVHX09OKCFzay0+c2tfcHJvdC0+cHJvdG9fY2dyb3VwKTsKKworCQlyY3VfcmVhZF9sb2NrKCk7CisJCW1lbWNnID0gbWVtX2Nncm91cF9mcm9tX3Rhc2soY3VycmVudCk7CisJCWlmICghbWVtX2Nncm91cF9pc19yb290KG1lbWNnKSkgeworCQkJbWVtX2Nncm91cF9nZXQobWVtY2cpOworCQkJc2stPnNrX2NncnAgPSBzay0+c2tfcHJvdC0+cHJvdG9fY2dyb3VwKG1lbWNnKTsKKwkJfQorCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKHNvY2tfdXBkYXRlX21lbWNnKTsKKwordm9pZCBzb2NrX3JlbGVhc2VfbWVtY2coc3RydWN0IHNvY2sgKnNrKQoreworCWlmIChzdGF0aWNfYnJhbmNoKCZtZW1jZ19zb2NrZXRfbGltaXRfZW5hYmxlZCkgJiYgc2stPnNrX2NncnApIHsKKwkJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOworCQlXQVJOX09OKCFzay0+c2tfY2dycC0+bWVtY2cpOworCQltZW1jZyA9IHNrLT5za19jZ3JwLT5tZW1jZzsKKwkJbWVtX2Nncm91cF9wdXQobWVtY2cpOworCX0KK30KKworc3RydWN0IGNnX3Byb3RvICp0Y3BfcHJvdG9fY2dyb3VwKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKK3sKKwlpZiAoIW1lbWNnIHx8IG1lbV9jZ3JvdXBfaXNfcm9vdChtZW1jZykpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuICZtZW1jZy0+dGNwX21lbS5jZ19wcm90bzsKK30KK0VYUE9SVF9TWU1CT0wodGNwX3Byb3RvX2Nncm91cCk7CisjZW5kaWYgLyogQ09ORklHX0lORVQgKi8KKyNlbmRpZiAvKiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9LTUVNICovCisKIHN0YXRpYyB2b2lkIGRyYWluX2FsbF9zdG9ja19hc3luYyhzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpOwogCiBzdGF0aWMgc3RydWN0IG1lbV9jZ3JvdXBfcGVyX3pvbmUgKgpAQCAtNzQ1LDcgKzgwMiw3IEBACiAJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAotc3RhdGljIHN0cnVjdCBtZW1fY2dyb3VwICptZW1fY2dyb3VwX2Zyb21fY29udChzdHJ1Y3QgY2dyb3VwICpjb250KQorc3RydWN0IG1lbV9jZ3JvdXAgKm1lbV9jZ3JvdXBfZnJvbV9jb250KHN0cnVjdCBjZ3JvdXAgKmNvbnQpCiB7CiAJcmV0dXJuIGNvbnRhaW5lcl9vZihjZ3JvdXBfc3Vic3lzX3N0YXRlKGNvbnQsCiAJCQkJbWVtX2Nncm91cF9zdWJzeXNfaWQpLCBzdHJ1Y3QgbWVtX2Nncm91cCwKQEAgLTQ2MTIsNiArNDY2OSwzNiBAQAogfQogI2VuZGlmIC8qIENPTkZJR19OVU1BICovCiAKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9LTUVNCitzdGF0aWMgaW50IHJlZ2lzdGVyX2ttZW1fZmlsZXMoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKQoreworCS8qCisJICogUGFydCBvZiB0aGlzIHdvdWxkIGJlIGJldHRlciBsaXZpbmcgaW4gYSBzZXBhcmF0ZSBhbGxvY2F0aW9uCisJICogZnVuY3Rpb24sIGxlYXZpbmcgdXMgd2l0aCBqdXN0IHRoZSBjZ3JvdXAgdHJlZSBwb3B1bGF0aW9uIHdvcmsuCisJICogV2UsIGhvd2V2ZXIsIGRlcGVuZCBvbiBzdGF0ZSBzdWNoIGFzIG5ldHdvcmsncyBwcm90b19saXN0IHRoYXQKKwkgKiBpcyBvbmx5IGluaXRpYWxpemVkIGFmdGVyIGNncm91cCBjcmVhdGlvbi4gSSBmb3VuZCB0aGUgbGVzcworCSAqIGN1bWJlcnNvbWUgd2F5IHRvIGRlYWwgd2l0aCBpdCB0byBkZWZlciBpdCBhbGwgdG8gcG9wdWxhdGUgdGltZQorCSAqLworCXJldHVybiBtZW1fY2dyb3VwX3NvY2tldHNfaW5pdChjb250LCBzcyk7Cit9OworCitzdGF0aWMgdm9pZCBrbWVtX2Nncm91cF9kZXN0cm95KHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKKwkJCQlzdHJ1Y3QgY2dyb3VwICpjb250KQoreworCW1lbV9jZ3JvdXBfc29ja2V0c19kZXN0cm95KGNvbnQsIHNzKTsKK30KKyNlbHNlCitzdGF0aWMgaW50IHJlZ2lzdGVyX2ttZW1fZmlsZXMoc3RydWN0IGNncm91cCAqY29udCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBrbWVtX2Nncm91cF9kZXN0cm95KHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywKKwkJCQlzdHJ1Y3QgY2dyb3VwICpjb250KQoreworfQorI2VuZGlmCisKIHN0YXRpYyBzdHJ1Y3QgY2Z0eXBlIG1lbV9jZ3JvdXBfZmlsZXNbXSA9IHsKIAl7CiAJCS5uYW1lID0gInVzYWdlX2luX2J5dGVzIiwKQEAgLTQ4NDMsMTIgKzQ5MzAsMTMgQEAKIC8qCiAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgbWVtX2Nncm91cCBpbiBtZW1jZ3JvdXAgaGllcmFyY2h5IHdpdGggaGllcmFyY2h5IGVuYWJsZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgbWVtX2Nncm91cCAqcGFyZW50X21lbV9jZ3JvdXAoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQorc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudF9tZW1fY2dyb3VwKHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZykKIHsKIAlpZiAoIW1lbWNnLT5yZXMucGFyZW50KQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gbWVtX2Nncm91cF9mcm9tX3Jlc19jb3VudGVyKG1lbWNnLT5yZXMucGFyZW50LCByZXMpOwogfQorRVhQT1JUX1NZTUJPTChwYXJlbnRfbWVtX2Nncm91cCk7CiAKICNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9TV0FQCiBzdGF0aWMgdm9pZCBfX2luaXQgZW5hYmxlX3N3YXBfY2dyb3VwKHZvaWQpCkBAIC00OTA3LDkgKzQ5OTUsOSBAQAogCQlpbnQgY3B1OwogCQllbmFibGVfc3dhcF9jZ3JvdXAoKTsKIAkJcGFyZW50ID0gTlVMTDsKLQkJcm9vdF9tZW1fY2dyb3VwID0gbWVtY2c7CiAJCWlmIChtZW1fY2dyb3VwX3NvZnRfbGltaXRfdHJlZV9pbml0KCkpCiAJCQlnb3RvIGZyZWVfb3V0OworCQlyb290X21lbV9jZ3JvdXAgPSBtZW1jZzsKIAkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogCQkJc3RydWN0IG1lbWNnX3N0b2NrX3BjcCAqc3RvY2sgPQogCQkJCQkJJnBlcl9jcHUobWVtY2dfc3RvY2ssIGNwdSk7CkBAIC00OTQ4LDcgKzUwMzYsNiBAQAogCXJldHVybiAmbWVtY2ctPmNzczsKIGZyZWVfb3V0OgogCV9fbWVtX2Nncm91cF9mcmVlKG1lbWNnKTsKLQlyb290X21lbV9jZ3JvdXAgPSBOVUxMOwogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIH0KIApAQCAtNDk2NSw2ICs1MDUyLDggQEAKIHsKIAlzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKIAorCWttZW1fY2dyb3VwX2Rlc3Ryb3koc3MsIGNvbnQpOworCiAJbWVtX2Nncm91cF9wdXQobWVtY2cpOwogfQogCkBAIC00OTc4LDYgKzUwNjcsMTAgQEAKIAogCWlmICghcmV0KQogCQlyZXQgPSByZWdpc3Rlcl9tZW1zd19maWxlcyhjb250LCBzcyk7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gcmVnaXN0ZXJfa21lbV9maWxlcyhjb250LCBzcyk7CisKIAlyZXR1cm4gcmV0OwogfQogCmRpZmYgLS1naXQgYS9tbS9tZW1wb2xpY3kuYyBiL21tL21lbXBvbGljeS5jCmluZGV4IGFkYzM5NTQuLmMzZmRiY2IgMTAwNjQ0Ci0tLSBhL21tL21lbXBvbGljeS5jCisrKyBiL21tL21lbXBvbGljeS5jCkBAIC02MzYsNiArNjM2LDcgQEAKIAlzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnByZXY7CiAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWE7CiAJaW50IGVyciA9IDA7CisJcGdvZmZfdCBwZ29mZjsKIAl1bnNpZ25lZCBsb25nIHZtc3RhcnQ7CiAJdW5zaWduZWQgbG9uZyB2bWVuZDsKIApAQCAtNjQzLDEzICs2NDQsMjEgQEAKIAlpZiAoIXZtYSB8fCB2bWEtPnZtX3N0YXJ0ID4gc3RhcnQpCiAJCXJldHVybiAtRUZBVUxUOwogCisJaWYgKHN0YXJ0ID4gdm1hLT52bV9zdGFydCkKKwkJcHJldiA9IHZtYTsKKwogCWZvciAoOyB2bWEgJiYgdm1hLT52bV9zdGFydCA8IGVuZDsgcHJldiA9IHZtYSwgdm1hID0gbmV4dCkgewogCQluZXh0ID0gdm1hLT52bV9uZXh0OwogCQl2bXN0YXJ0ID0gbWF4KHN0YXJ0LCB2bWEtPnZtX3N0YXJ0KTsKIAkJdm1lbmQgICA9IG1pbihlbmQsIHZtYS0+dm1fZW5kKTsKIAorCQlpZiAobXBvbF9lcXVhbCh2bWFfcG9saWN5KHZtYSksIG5ld19wb2wpKQorCQkJY29udGludWU7CisKKwkJcGdvZmYgPSB2bWEtPnZtX3Bnb2ZmICsKKwkJCSgodm1zdGFydCAtIHZtYS0+dm1fc3RhcnQpID4+IFBBR0VfU0hJRlQpOwogCQlwcmV2ID0gdm1hX21lcmdlKG1tLCBwcmV2LCB2bXN0YXJ0LCB2bWVuZCwgdm1hLT52bV9mbGFncywKLQkJCQkgIHZtYS0+YW5vbl92bWEsIHZtYS0+dm1fZmlsZSwgdm1hLT52bV9wZ29mZiwKKwkJCQkgIHZtYS0+YW5vbl92bWEsIHZtYS0+dm1fZmlsZSwgcGdvZmYsCiAJCQkJICBuZXdfcG9sKTsKIAkJaWYgKHByZXYpIHsKIAkJCXZtYSA9IHByZXY7CmRpZmYgLS1naXQgYS9tbS9taWdyYXRlLmMgYi9tbS9taWdyYXRlLmMKaW5kZXggNTc4ZTI5MS4uMTc3YWNhNCAxMDA2NDQKLS0tIGEvbW0vbWlncmF0ZS5jCisrKyBiL21tL21pZ3JhdGUuYwpAQCAtODcxLDkgKzg3MSw5IEBACiAKIAlpZiAoYW5vbl92bWEpCiAJCXB1dF9hbm9uX3ZtYShhbm9uX3ZtYSk7Ci1vdXQ6CiAJdW5sb2NrX3BhZ2UoaHBhZ2UpOwogCitvdXQ6CiAJaWYgKHJjICE9IC1FQUdBSU4pIHsKIAkJbGlzdF9kZWwoJmhwYWdlLT5scnUpOwogCQlwdXRfcGFnZShocGFnZSk7CmRpZmYgLS1naXQgYS9tbS9ub2Jvb3RtZW0uYyBiL21tL25vYm9vdG1lbS5jCmluZGV4IDdmYTQxYjQuLjI0ZjBmYzEgMTAwNjQ0Ci0tLSBhL21tL25vYm9vdG1lbS5jCisrKyBiL21tL25vYm9vdG1lbS5jCkBAIC00MSwxNCArNDEsMTMgQEAKIAlpZiAobGltaXQgPiBtZW1ibG9jay5jdXJyZW50X2xpbWl0KQogCQlsaW1pdCA9IG1lbWJsb2NrLmN1cnJlbnRfbGltaXQ7CiAKLQlhZGRyID0gZmluZF9tZW1vcnlfY29yZV9lYXJseShuaWQsIHNpemUsIGFsaWduLCBnb2FsLCBsaW1pdCk7Ci0KLQlpZiAoYWRkciA9PSBNRU1CTE9DS19FUlJPUikKKwlhZGRyID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZV9ub2RlKGdvYWwsIGxpbWl0LCBzaXplLCBhbGlnbiwgbmlkKTsKKwlpZiAoIWFkZHIpCiAJCXJldHVybiBOVUxMOwogCiAJcHRyID0gcGh5c190b192aXJ0KGFkZHIpOwogCW1lbXNldChwdHIsIDAsIHNpemUpOwotCW1lbWJsb2NrX3g4Nl9yZXNlcnZlX3JhbmdlKGFkZHIsIGFkZHIgKyBzaXplLCAiQk9PVE1FTSIpOworCW1lbWJsb2NrX3Jlc2VydmUoYWRkciwgc2l6ZSk7CiAJLyoKIAkgKiBUaGUgbWluX2NvdW50IGlzIHNldCB0byAwIHNvIHRoYXQgYm9vdG1lbSBhbGxvY2F0ZWQgYmxvY2tzCiAJICogYXJlIG5ldmVyIHJlcG9ydGVkIGFzIGxlYWtzLgpAQCAtMTA3LDIzICsxMDYsMjcgQEAKIAkJX19mcmVlX3BhZ2VzX2Jvb3RtZW0ocGZuX3RvX3BhZ2UoaSksIDApOwogfQogCi11bnNpZ25lZCBsb25nIF9faW5pdCBmcmVlX2FsbF9tZW1vcnlfY29yZV9lYXJseShpbnQgbm9kZWlkKQordW5zaWduZWQgbG9uZyBfX2luaXQgZnJlZV9sb3dfbWVtb3J5X2NvcmVfZWFybHkoaW50IG5vZGVpZCkKIHsKLQlpbnQgaTsKLQl1NjQgc3RhcnQsIGVuZDsKIAl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKLQlzdHJ1Y3QgcmFuZ2UgKnJhbmdlID0gTlVMTDsKLQlpbnQgbnJfcmFuZ2U7CisJcGh5c19hZGRyX3Qgc3RhcnQsIGVuZDsKKwl1NjQgaTsKIAotCW5yX3JhbmdlID0gZ2V0X2ZyZWVfYWxsX21lbW9yeV9yYW5nZSgmcmFuZ2UsIG5vZGVpZCk7CisJLyogZnJlZSByZXNlcnZlZCBhcnJheSB0ZW1wb3JhcmlseSBzbyB0aGF0IGl0J3MgdHJlYXRlZCBhcyBmcmVlIGFyZWEgKi8KKwltZW1ibG9ja19mcmVlX3Jlc2VydmVkX3JlZ2lvbnMoKTsKIAotCWZvciAoaSA9IDA7IGkgPCBucl9yYW5nZTsgaSsrKSB7Ci0JCXN0YXJ0ID0gcmFuZ2VbaV0uc3RhcnQ7Ci0JCWVuZCA9IHJhbmdlW2ldLmVuZDsKLQkJY291bnQgKz0gZW5kIC0gc3RhcnQ7Ci0JCV9fZnJlZV9wYWdlc19tZW1vcnkoc3RhcnQsIGVuZCk7CisJZm9yX2VhY2hfZnJlZV9tZW1fcmFuZ2UoaSwgTUFYX05VTU5PREVTLCAmc3RhcnQsICZlbmQsIE5VTEwpIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4gPSBQRk5fVVAoc3RhcnQpOworCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSBtaW5fdCh1bnNpZ25lZCBsb25nLAorCQkJCQkgICAgICBQRk5fRE9XTihlbmQpLCBtYXhfbG93X3Bmbik7CisJCWlmIChzdGFydF9wZm4gPCBlbmRfcGZuKSB7CisJCQlfX2ZyZWVfcGFnZXNfbWVtb3J5KHN0YXJ0X3BmbiwgZW5kX3Bmbik7CisJCQljb3VudCArPSBlbmRfcGZuIC0gc3RhcnRfcGZuOworCQl9CiAJfQogCisJLyogcHV0IHJlZ2lvbiBhcnJheSBiYWNrPyAqLworCW1lbWJsb2NrX3Jlc2VydmVfcmVzZXJ2ZWRfcmVnaW9ucygpOwogCXJldHVybiBjb3VudDsKIH0KIApAQCAtMTM3LDcgKzE0MCw3IEBACiB7CiAJcmVnaXN0ZXJfcGFnZV9ib290bWVtX2luZm9fbm9kZShwZ2RhdCk7CiAKLQkvKiBmcmVlX2FsbF9tZW1vcnlfY29yZV9lYXJseShNQVhfTlVNTk9ERVMpIHdpbGwgYmUgY2FsbGVkIGxhdGVyICovCisJLyogZnJlZV9sb3dfbWVtb3J5X2NvcmVfZWFybHkoTUFYX05VTU5PREVTKSB3aWxsIGJlIGNhbGxlZCBsYXRlciAqLwogCXJldHVybiAwOwogfQogCkBAIC0xNTUsNyArMTU4LDcgQEAKIAkgKiBVc2UgTUFYX05VTU5PREVTIHdpbGwgbWFrZSBzdXJlIGFsbCByYW5nZXMgaW4gZWFybHlfbm9kZV9tYXBbXQogCSAqICB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiBvbmx5IE5vZGUwIHJlbGF0ZWQKIAkgKi8KLQlyZXR1cm4gZnJlZV9hbGxfbWVtb3J5X2NvcmVfZWFybHkoTUFYX05VTU5PREVTKTsKKwlyZXR1cm4gZnJlZV9sb3dfbWVtb3J5X2NvcmVfZWFybHkoTUFYX05VTU5PREVTKTsKIH0KIAogLyoqCkBAIC0xNzIsNyArMTc1LDcgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIHsKIAlrbWVtbGVha19mcmVlX3BhcnQoX192YShwaHlzYWRkciksIHNpemUpOwotCW1lbWJsb2NrX3g4Nl9mcmVlX3JhbmdlKHBoeXNhZGRyLCBwaHlzYWRkciArIHNpemUpOworCW1lbWJsb2NrX2ZyZWUocGh5c2FkZHIsIHNpemUpOwogfQogCiAvKioKQEAgLTE4Nyw3ICsxOTAsNyBAQAogdm9pZCBfX2luaXQgZnJlZV9ib290bWVtKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbG9uZyBzaXplKQogewogCWttZW1sZWFrX2ZyZWVfcGFydChfX3ZhKGFkZHIpLCBzaXplKTsKLQltZW1ibG9ja194ODZfZnJlZV9yYW5nZShhZGRyLCBhZGRyICsgc2l6ZSk7CisJbWVtYmxvY2tfZnJlZShhZGRyLCBzaXplKTsKIH0KIAogc3RhdGljIHZvaWQgKiBfX2luaXQgX19fYWxsb2NfYm9vdG1lbV9ub3BhbmljKHVuc2lnbmVkIGxvbmcgc2l6ZSwKZGlmZiAtLWdpdCBhL21tL29vbV9raWxsLmMgYi9tbS9vb21fa2lsbC5jCmluZGV4IDc2ZjJjNWEuLjA2OWI2NGUgMTAwNjQ0Ci0tLSBhL21tL29vbV9raWxsLmMKKysrIGIvbW0vb29tX2tpbGwuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiB1bnNpZ25lZCBpbnQgb29tX2JhZG5lc3Moc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtLAogCQkgICAgICBjb25zdCBub2RlbWFza190ICpub2RlbWFzaywgdW5zaWduZWQgbG9uZyB0b3RhbHBhZ2VzKQogewotCWludCBwb2ludHM7CisJbG9uZyBwb2ludHM7CiAKIAlpZiAob29tX3Vua2lsbGFibGVfdGFzayhwLCBtZW0sIG5vZGVtYXNrKSkKIAkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9tbS9wYWdlLXdyaXRlYmFjay5jIGIvbW0vcGFnZS13cml0ZWJhY2suYwppbmRleCA3MTI1MjQ4Li41MGYwODI0IDEwMDY0NAotLS0gYS9tbS9wYWdlLXdyaXRlYmFjay5jCisrKyBiL21tL3BhZ2Utd3JpdGViYWNrLmMKQEAgLTQxMSw4ICs0MTEsMTMgQEAKICAqCiAgKiBSZXR1cm5zIEBiZGkncyBkaXJ0eSBsaW1pdCBpbiBwYWdlcy4gVGhlIHRlcm0gImRpcnR5IiBpbiB0aGUgY29udGV4dCBvZgogICogZGlydHkgYmFsYW5jaW5nIGluY2x1ZGVzIGFsbCBQR19kaXJ0eSwgUEdfd3JpdGViYWNrIGFuZCBORlMgdW5zdGFibGUgcGFnZXMuCi0gKiBBbmQgdGhlICJsaW1pdCIgaW4gdGhlIG5hbWUgaXMgbm90IHNlcmlvdXNseSB0YWtlbiBhcyBoYXJkIGxpbWl0IGluCi0gKiBiYWxhbmNlX2RpcnR5X3BhZ2VzKCkuCisgKgorICogTm90ZSB0aGF0IGJhbGFuY2VfZGlydHlfcGFnZXMoKSB3aWxsIG9ubHkgc2VyaW91c2x5IHRha2UgaXQgYXMgYSBoYXJkIGxpbWl0CisgKiB3aGVuIHNsZWVwaW5nIG1heF9wYXVzZSBwZXIgcGFnZSBpcyBub3QgZW5vdWdoIHRvIGtlZXAgdGhlIGRpcnR5IHBhZ2VzIHVuZGVyCisgKiBjb250cm9sLiBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgZGV2aWNlIGlzIGNvbXBsZXRlbHkgc3RhbGxlZCBkdWUgdG8gc29tZSBlcnJvcgorICogY29uZGl0aW9ucywgb3Igd2hlbiB0aGVyZSBhcmUgMTAwMCBkZCB0YXNrcyB3cml0aW5nIHRvIGEgc2xvdyAxME1CL3MgVVNCIGtleS4KKyAqIEluIHRoZSBvdGhlciBub3JtYWwgc2l0dWF0aW9ucywgaXQgYWN0cyBtb3JlIGdlbnRseSBieSB0aHJvdHRsaW5nIHRoZSB0YXNrcworICogbW9yZSAocmF0aGVyIHRoYW4gY29tcGxldGVseSBibG9jayB0aGVtKSB3aGVuIHRoZSBiZGkgZGlydHkgcGFnZXMgZ28gaGlnaC4KICAqCiAgKiBJdCBhbGxvY2F0ZXMgaGlnaC9sb3cgZGlydHkgbGltaXRzIHRvIGZhc3Qvc2xvdyBkZXZpY2VzLCBpbiBvcmRlciB0byBwcmV2ZW50CiAgKiAtIHN0YXJ2aW5nIGZhc3QgZGV2aWNlcwpAQCAtNTk0LDYgKzU5OSwxMyBAQAogCSAqLwogCWlmICh1bmxpa2VseShiZGlfdGhyZXNoID4gdGhyZXNoKSkKIAkJYmRpX3RocmVzaCA9IHRocmVzaDsKKwkvKgorCSAqIEl0J3MgdmVyeSBwb3NzaWJsZSB0aGF0IGJkaV90aHJlc2ggaXMgY2xvc2UgdG8gMCBub3QgYmVjYXVzZSB0aGUKKwkgKiBkZXZpY2UgaXMgc2xvdywgYnV0IHRoYXQgaXQgaGFzIHJlbWFpbmVkIGluYWN0aXZlIGZvciBsb25nIHRpbWUuCisJICogSG9ub3VyIHN1Y2ggZGV2aWNlcyBhIHJlYXNvbmFibGUgZ29vZCAoaG9wZWZ1bGx5IElPIGVmZmljaWVudCkKKwkgKiB0aHJlc2hvbGQsIHNvIHRoYXQgdGhlIG9jY2FzaW9uYWwgd3JpdGVzIHdvbid0IGJlIGJsb2NrZWQgYW5kIGFjdGl2ZQorCSAqIHdyaXRlcyBjYW4gcmFtcHVwIHRoZSB0aHJlc2hvbGQgcXVpY2tseS4KKwkgKi8KIAliZGlfdGhyZXNoID0gbWF4KGJkaV90aHJlc2gsIChsaW1pdCAtIGRpcnR5KSAvIDgpOwogCS8qCiAJICogc2NhbGUgZ2xvYmFsIHNldHBvaW50IHRvIGJkaSdzOgpAQCAtOTc3LDggKzk4OSw3IEBACiAJICoKIAkgKiA4IHNlcnZlcyBhcyB0aGUgc2FmZXR5IHJhdGlvLgogCSAqLwotCWlmIChiZGlfZGlydHkpCi0JCXQgPSBtaW4odCwgYmRpX2RpcnR5ICogSFogLyAoOCAqIGJ3ICsgMSkpOworCXQgPSBtaW4odCwgYmRpX2RpcnR5ICogSFogLyAoOCAqIGJ3ICsgMSkpOwogCiAJLyoKIAkgKiBUaGUgcGF1c2UgdGltZSB3aWxsIGJlIHNldHRsZWQgd2l0aGluIHJhbmdlIChtYXhfcGF1c2UvNCwgbWF4X3BhdXNlKS4KQEAgLTExMzYsNiArMTE0NywxOSBAQAogCQlpZiAodGFza19yYXRlbGltaXQpCiAJCQlicmVhazsKIAorCQkvKgorCQkgKiBJbiB0aGUgY2FzZSBvZiBhbiB1bnJlc3BvbmRpbmcgTkZTIHNlcnZlciBhbmQgdGhlIE5GUyBkaXJ0eQorCQkgKiBwYWdlcyBleGNlZWRzIGRpcnR5X3RocmVzaCwgZ2l2ZSB0aGUgb3RoZXIgZ29vZCBiZGkncyBhIHBpcGUKKwkJICogdG8gZ28gdGhyb3VnaCwgc28gdGhhdCB0YXNrcyBvbiB0aGVtIHN0aWxsIHJlbWFpbiByZXNwb25zaXZlLgorCQkgKgorCQkgKiBJbiB0aGVvcnkgMSBwYWdlIGlzIGVub3VnaCB0byBrZWVwIHRoZSBjb21zdW1lci1wcm9kdWNlcgorCQkgKiBwaXBlIGdvaW5nOiB0aGUgZmx1c2hlciBjbGVhbnMgMSBwYWdlID0+IHRoZSB0YXNrIGRpcnRpZXMgMQorCQkgKiBtb3JlIHBhZ2UuIEhvd2V2ZXIgYmRpX2RpcnR5IGhhcyBhY2NvdW50aW5nIGVycm9ycy4gIFNvIHVzZQorCQkgKiB0aGUgbGFyZ2VyIGFuZCBtb3JlIElPIGZyaWVuZGx5IGJkaV9zdGF0X2Vycm9yLgorCQkgKi8KKwkJaWYgKGJkaV9kaXJ0eSA8PSBiZGlfc3RhdF9lcnJvcihiZGkpKQorCQkJYnJlYWs7CisKIAkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQogCQkJYnJlYWs7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IDlkZDQ0M2QuLmJkYzgwNGMgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTE4MSwzOSArMTgxLDE3IEBACiBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIG5yX2FsbF9wYWdlczsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgZG1hX3Jlc2VydmU7CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKLSAgLyoKLSAgICogTUFYX0FDVElWRV9SRUdJT05TIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpc3RpbmN0Ci0gICAqIHJhbmdlcyBvZiBtZW1vcnkgKFJBTSkgdGhhdCBtYXkgYmUgcmVnaXN0ZXJlZCB3aXRoIGFkZF9hY3RpdmVfcmFuZ2UoKS4KLSAgICogUmFuZ2VzIHBhc3NlZCB0byBhZGRfYWN0aXZlX3JhbmdlKCkgd2lsbCBiZSBtZXJnZWQgaWYgcG9zc2libGUKLSAgICogc28gdGhlIG51bWJlciBvZiB0aW1lcyBhZGRfYWN0aXZlX3JhbmdlKCkgY2FuIGJlIGNhbGxlZCBpcwotICAgKiByZWxhdGVkIHRvIHRoZSBudW1iZXIgb2Ygbm9kZXMgYW5kIHRoZSBudW1iZXIgb2YgaG9sZXMKLSAgICovCi0gICNpZmRlZiBDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TCi0gICAgLyogQWxsb3cgYW4gYXJjaGl0ZWN0dXJlIHRvIHNldCBNQVhfQUNUSVZFX1JFR0lPTlMgdG8gc2F2ZSBtZW1vcnkgKi8KLSAgICAjZGVmaW5lIE1BWF9BQ1RJVkVfUkVHSU9OUyBDT05GSUdfTUFYX0FDVElWRV9SRUdJT05TCi0gICNlbHNlCi0gICAgI2lmIE1BWF9OVU1OT0RFUyA+PSAzMgotICAgICAgLyogSWYgdGhlcmUgY2FuIGJlIG1hbnkgbm9kZXMsIGFsbG93IHVwIHRvIDUwIGhvbGVzIHBlciBub2RlICovCi0gICAgICAjZGVmaW5lIE1BWF9BQ1RJVkVfUkVHSU9OUyAoTUFYX05VTU5PREVTKjUwKQotICAgICNlbHNlCi0gICAgICAvKiBCeSBkZWZhdWx0LCBhbGxvdyB1cCB0byAyNTYgZGlzdGluY3QgcmVnaW9ucyAqLwotICAgICAgI2RlZmluZSBNQVhfQUNUSVZFX1JFR0lPTlMgMjU2Ci0gICAgI2VuZGlmCi0gICNlbmRpZgorI2lmZGVmIENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQCitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW01BWF9OUl9aT05FU107CitzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSByZXF1aXJlZF9rZXJuZWxjb3JlOworc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0ZGF0YSByZXF1aXJlZF9tb3ZhYmxlY29yZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgem9uZV9tb3ZhYmxlX3BmbltNQVhfTlVNTk9ERVNdOwogCi0gIHN0YXRpYyBzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uIF9fbWVtaW5pdGRhdGEgZWFybHlfbm9kZV9tYXBbTUFYX0FDVElWRV9SRUdJT05TXTsKLSAgc3RhdGljIGludCBfX21lbWluaXRkYXRhIG5yX25vZGVtYXBfZW50cmllczsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOwotICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHJlcXVpcmVkX2tlcm5lbGNvcmU7Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcmVxdWlyZWRfbW92YWJsZWNvcmU7Ci0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgem9uZV9tb3ZhYmxlX3BmbltNQVhfTlVNTk9ERVNdOwotCi0gIC8qIG1vdmFibGVfem9uZSBpcyB0aGUgInJlYWwiIHpvbmUgcGFnZXMgaW4gWk9ORV9NT1ZBQkxFIGFyZSB0YWtlbiBmcm9tICovCi0gIGludCBtb3ZhYmxlX3pvbmU7Ci0gIEVYUE9SVF9TWU1CT0wobW92YWJsZV96b25lKTsKLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAgKi8KKy8qIG1vdmFibGVfem9uZSBpcyB0aGUgInJlYWwiIHpvbmUgcGFnZXMgaW4gWk9ORV9NT1ZBQkxFIGFyZSB0YWtlbiBmcm9tICovCitpbnQgbW92YWJsZV96b25lOworRVhQT1JUX1NZTUJPTChtb3ZhYmxlX3pvbmUpOworI2VuZGlmIC8qIENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQICovCiAKICNpZiBNQVhfTlVNTk9ERVMgPiAxCiBpbnQgbnJfbm9kZV9pZHMgX19yZWFkX21vc3RseSA9IE1BWF9OVU1OT0RFUzsKQEAgLTM1Niw4ICszMzQsOCBAQAogCV9fU2V0UGFnZUhlYWQocGFnZSk7CiAJZm9yIChpID0gMTsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKIAkJc3RydWN0IHBhZ2UgKnAgPSBwYWdlICsgaTsKLQogCQlfX1NldFBhZ2VUYWlsKHApOworCQlzZXRfcGFnZV9jb3VudChwLCAwKTsKIAkJcC0+Zmlyc3RfcGFnZSA9IHBhZ2U7CiAJfQogfQpAQCAtNzA2LDEwICs2ODQsMTAgQEAKIAkJaW50IGxvb3A7CiAKIAkJcHJlZmV0Y2h3KHBhZ2UpOwotCQlmb3IgKGxvb3AgPSAwOyBsb29wIDwgQklUU19QRVJfTE9ORzsgbG9vcCsrKSB7CisJCWZvciAobG9vcCA9IDA7IGxvb3AgPCAoMSA8PCBvcmRlcik7IGxvb3ArKykgewogCQkJc3RydWN0IHBhZ2UgKnAgPSAmcGFnZVtsb29wXTsKIAotCQkJaWYgKGxvb3AgKyAxIDwgQklUU19QRVJfTE9ORykKKwkJCWlmIChsb29wICsgMSA8ICgxIDw8IG9yZGVyKSkKIAkJCQlwcmVmZXRjaHcocCArIDEpOwogCQkJX19DbGVhclBhZ2VSZXNlcnZlZChwKTsKIAkJCXNldF9wYWdlX2NvdW50KHAsIDApOwpAQCAtMzM3Nyw5ICszMzU1LDE1IEBACiAJdW5zaWduZWQgbG9uZyBibG9ja19taWdyYXRldHlwZTsKIAlpbnQgcmVzZXJ2ZTsKIAotCS8qIEdldCB0aGUgc3RhcnQgcGZuLCBlbmQgcGZuIGFuZCB0aGUgbnVtYmVyIG9mIGJsb2NrcyB0byByZXNlcnZlICovCisJLyoKKwkgKiBHZXQgdGhlIHN0YXJ0IHBmbiwgZW5kIHBmbiBhbmQgdGhlIG51bWJlciBvZiBibG9ja3MgdG8gcmVzZXJ2ZQorCSAqIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBiZSBhbGlnbmVkIHRvIHBhZ2VibG9ja19ucl9wYWdlcyB0bworCSAqIG1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBjaGVjayBwZm5fdmFsaWQgZm9yIHRoZSBmaXJzdCBwYWdlIGluCisJICogdGhlIGJsb2NrLgorCSAqLwogCXN0YXJ0X3BmbiA9IHpvbmUtPnpvbmVfc3RhcnRfcGZuOwogCWVuZF9wZm4gPSBzdGFydF9wZm4gKyB6b25lLT5zcGFubmVkX3BhZ2VzOworCXN0YXJ0X3BmbiA9IHJvdW5kdXAoc3RhcnRfcGZuLCBwYWdlYmxvY2tfbnJfcGFnZXMpOwogCXJlc2VydmUgPSByb3VuZHVwKG1pbl93bWFya19wYWdlcyh6b25lKSwgcGFnZWJsb2NrX25yX3BhZ2VzKSA+PgogCQkJCQkJCXBhZ2VibG9ja19vcmRlcjsKIApAQCAtMzczMSwzNSArMzcxNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLSNpZmRlZiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAKLS8qCi0gKiBCYXNpYyBpdGVyYXRvciBzdXBwb3J0LiBSZXR1cm4gdGhlIGZpcnN0IHJhbmdlIG9mIFBGTnMgZm9yIGEgbm9kZQotICogTm90ZTogbmlkID09IE1BWF9OVU1OT0RFUyByZXR1cm5zIGZpcnN0IHJlZ2lvbiByZWdhcmRsZXNzIG9mIG5vZGUKLSAqLwotc3RhdGljIGludCBfX21lbWluaXQgZmlyc3RfYWN0aXZlX3JlZ2lvbl9pbmRleF9pbl9uaWQoaW50IG5pZCkKLXsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBucl9ub2RlbWFwX2VudHJpZXM7IGkrKykKLQkJaWYgKG5pZCA9PSBNQVhfTlVNTk9ERVMgfHwgZWFybHlfbm9kZV9tYXBbaV0ubmlkID09IG5pZCkKLQkJCXJldHVybiBpOwotCi0JcmV0dXJuIC0xOwotfQotCi0vKgotICogQmFzaWMgaXRlcmF0b3Igc3VwcG9ydC4gUmV0dXJuIHRoZSBuZXh0IGFjdGl2ZSByYW5nZSBvZiBQRk5zIGZvciBhIG5vZGUKLSAqIE5vdGU6IG5pZCA9PSBNQVhfTlVNTk9ERVMgcmV0dXJucyBuZXh0IHJlZ2lvbiByZWdhcmRsZXNzIG9mIG5vZGUKLSAqLwotc3RhdGljIGludCBfX21lbWluaXQgbmV4dF9hY3RpdmVfcmVnaW9uX2luZGV4X2luX25pZChpbnQgaW5kZXgsIGludCBuaWQpCi17Ci0JZm9yIChpbmRleCA9IGluZGV4ICsgMTsgaW5kZXggPCBucl9ub2RlbWFwX2VudHJpZXM7IGluZGV4KyspCi0JCWlmIChuaWQgPT0gTUFYX05VTU5PREVTIHx8IGVhcmx5X25vZGVfbWFwW2luZGV4XS5uaWQgPT0gbmlkKQotCQkJcmV0dXJuIGluZGV4OwotCi0JcmV0dXJuIC0xOwotfQotCisjaWZkZWYgQ09ORklHX0hBVkVfTUVNQkxPQ0tfTk9ERV9NQVAKICNpZm5kZWYgQ09ORklHX0hBVkVfQVJDSF9FQVJMWV9QRk5fVE9fTklECiAvKgogICogUmVxdWlyZWQgYnkgU1BBUlNFTUVNLiBHaXZlbiBhIFBGTiwgcmV0dXJuIHdoYXQgbm9kZSB0aGUgUEZOIGlzIG9uLgpAQCAtMzc2OSwxNSArMzcyNSwxMiBAQAogICovCiBpbnQgX19tZW1pbml0IF9fZWFybHlfcGZuX3RvX25pZCh1bnNpZ25lZCBsb25nIHBmbikKIHsKLQlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKKwlpbnQgaSwgbmlkOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX25vZGVtYXBfZW50cmllczsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuID0gZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuOwotCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuOwotCisJZm9yX2VhY2hfbWVtX3Bmbl9yYW5nZShpLCBNQVhfTlVNTk9ERVMsICZzdGFydF9wZm4sICZlbmRfcGZuLCAmbmlkKQogCQlpZiAoc3RhcnRfcGZuIDw9IHBmbiAmJiBwZm4gPCBlbmRfcGZuKQotCQkJcmV0dXJuIGVhcmx5X25vZGVfbWFwW2ldLm5pZDsKLQl9CisJCQlyZXR1cm4gbmlkOwogCS8qIFRoaXMgaXMgYSBtZW1vcnkgaG9sZSAqLwogCXJldHVybiAtMTsKIH0KQEAgLTM4MDYsMTEgKzM3NTksNiBAQAogfQogI2VuZGlmCiAKLS8qIEJhc2ljIGl0ZXJhdG9yIHN1cHBvcnQgdG8gd2FsayBlYXJseV9ub2RlX21hcFtdICovCi0jZGVmaW5lIGZvcl9lYWNoX2FjdGl2ZV9yYW5nZV9pbmRleF9pbl9uaWQoaSwgbmlkKSBcCi0JZm9yIChpID0gZmlyc3RfYWN0aXZlX3JlZ2lvbl9pbmRleF9pbl9uaWQobmlkKTsgaSAhPSAtMTsgXAotCQkJCWkgPSBuZXh0X2FjdGl2ZV9yZWdpb25faW5kZXhfaW5fbmlkKGksIG5pZCkpCi0KIC8qKgogICogZnJlZV9ib290bWVtX3dpdGhfYWN0aXZlX3JlZ2lvbnMgLSBDYWxsIGZyZWVfYm9vdG1lbV9ub2RlIGZvciBlYWNoIGFjdGl2ZSByYW5nZQogICogQG5pZDogVGhlIG5vZGUgdG8gZnJlZSBtZW1vcnkgb24uIElmIE1BWF9OVU1OT0RFUywgYWxsIG5vZGVzIGFyZSBmcmVlZC4KQEAgLTM4MjAsMTIyICszNzY4LDM0IEBACiAgKiBhZGRfYWN0aXZlX3JhbmdlcygpIGNvbnRhaW4gbm8gaG9sZXMgYW5kIG1heSBiZSBmcmVlZCwgdGhpcwogICogdGhpcyBmdW5jdGlvbiBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIGNhbGxpbmcgZnJlZV9ib290bWVtKCkgbWFudWFsbHkuCiAgKi8KLXZvaWQgX19pbml0IGZyZWVfYm9vdG1lbV93aXRoX2FjdGl2ZV9yZWdpb25zKGludCBuaWQsCi0JCQkJCQl1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuKQordm9pZCBfX2luaXQgZnJlZV9ib290bWVtX3dpdGhfYWN0aXZlX3JlZ2lvbnMoaW50IG5pZCwgdW5zaWduZWQgbG9uZyBtYXhfbG93X3BmbikKIHsKLQlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKKwlpbnQgaSwgdGhpc19uaWQ7CiAKLQlmb3JfZWFjaF9hY3RpdmVfcmFuZ2VfaW5kZXhfaW5fbmlkKGksIG5pZCkgewotCQl1bnNpZ25lZCBsb25nIHNpemVfcGFnZXMgPSAwOwotCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4gPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuOworCWZvcl9lYWNoX21lbV9wZm5fcmFuZ2UoaSwgbmlkLCAmc3RhcnRfcGZuLCAmZW5kX3BmbiwgJnRoaXNfbmlkKSB7CisJCXN0YXJ0X3BmbiA9IG1pbihzdGFydF9wZm4sIG1heF9sb3dfcGZuKTsKKwkJZW5kX3BmbiA9IG1pbihlbmRfcGZuLCBtYXhfbG93X3Bmbik7CiAKLQkJaWYgKGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiA+PSBtYXhfbG93X3BmbikKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChlbmRfcGZuID4gbWF4X2xvd19wZm4pCi0JCQllbmRfcGZuID0gbWF4X2xvd19wZm47Ci0KLQkJc2l6ZV9wYWdlcyA9IGVuZF9wZm4gLSBlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm47Ci0JCWZyZWVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShlYXJseV9ub2RlX21hcFtpXS5uaWQpLAotCQkJCVBGTl9QSFlTKGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiksCi0JCQkJc2l6ZV9wYWdlcyA8PCBQQUdFX1NISUZUKTsKKwkJaWYgKHN0YXJ0X3BmbiA8IGVuZF9wZm4pCisJCQlmcmVlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEodGhpc19uaWQpLAorCQkJCQkgIFBGTl9QSFlTKHN0YXJ0X3BmbiksCisJCQkJCSAgKGVuZF9wZm4gLSBzdGFydF9wZm4pIDw8IFBBR0VfU0hJRlQpOwogCX0KIH0KIAotI2lmZGVmIENPTkZJR19IQVZFX01FTUJMT0NLCi0vKgotICogQmFzaWMgaXRlcmF0b3Igc3VwcG9ydC4gUmV0dXJuIHRoZSBsYXN0IHJhbmdlIG9mIFBGTnMgZm9yIGEgbm9kZQotICogTm90ZTogbmlkID09IE1BWF9OVU1OT0RFUyByZXR1cm5zIGxhc3QgcmVnaW9uIHJlZ2FyZGxlc3Mgb2Ygbm9kZQotICovCi1zdGF0aWMgaW50IF9fbWVtaW5pdCBsYXN0X2FjdGl2ZV9yZWdpb25faW5kZXhfaW5fbmlkKGludCBuaWQpCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSBucl9ub2RlbWFwX2VudHJpZXMgLSAxOyBpID49IDA7IGktLSkKLQkJaWYgKG5pZCA9PSBNQVhfTlVNTk9ERVMgfHwgZWFybHlfbm9kZV9tYXBbaV0ubmlkID09IG5pZCkKLQkJCXJldHVybiBpOwotCi0JcmV0dXJuIC0xOwotfQotCi0vKgotICogQmFzaWMgaXRlcmF0b3Igc3VwcG9ydC4gUmV0dXJuIHRoZSBwcmV2aW91cyBhY3RpdmUgcmFuZ2Ugb2YgUEZOcyBmb3IgYSBub2RlCi0gKiBOb3RlOiBuaWQgPT0gTUFYX05VTU5PREVTIHJldHVybnMgbmV4dCByZWdpb24gcmVnYXJkbGVzcyBvZiBub2RlCi0gKi8KLXN0YXRpYyBpbnQgX19tZW1pbml0IHByZXZpb3VzX2FjdGl2ZV9yZWdpb25faW5kZXhfaW5fbmlkKGludCBpbmRleCwgaW50IG5pZCkKLXsKLQlmb3IgKGluZGV4ID0gaW5kZXggLSAxOyBpbmRleCA+PSAwOyBpbmRleC0tKQotCQlpZiAobmlkID09IE1BWF9OVU1OT0RFUyB8fCBlYXJseV9ub2RlX21hcFtpbmRleF0ubmlkID09IG5pZCkKLQkJCXJldHVybiBpbmRleDsKLQotCXJldHVybiAtMTsKLX0KLQotI2RlZmluZSBmb3JfZWFjaF9hY3RpdmVfcmFuZ2VfaW5kZXhfaW5fbmlkX3JldmVyc2UoaSwgbmlkKSBcCi0JZm9yIChpID0gbGFzdF9hY3RpdmVfcmVnaW9uX2luZGV4X2luX25pZChuaWQpOyBpICE9IC0xOyBcCi0JCQkJaSA9IHByZXZpb3VzX2FjdGl2ZV9yZWdpb25faW5kZXhfaW5fbmlkKGksIG5pZCkpCi0KLXU2NCBfX2luaXQgZmluZF9tZW1vcnlfY29yZV9lYXJseShpbnQgbmlkLCB1NjQgc2l6ZSwgdTY0IGFsaWduLAotCQkJCQl1NjQgZ29hbCwgdTY0IGxpbWl0KQotewotCWludCBpOwotCi0JLyogTmVlZCB0byBnbyBvdmVyIGVhcmx5X25vZGVfbWFwIHRvIGZpbmQgb3V0IGdvb2QgcmFuZ2UgZm9yIG5vZGUgKi8KLQlmb3JfZWFjaF9hY3RpdmVfcmFuZ2VfaW5kZXhfaW5fbmlkX3JldmVyc2UoaSwgbmlkKSB7Ci0JCXU2NCBhZGRyOwotCQl1NjQgZWlfc3RhcnQsIGVpX2xhc3Q7Ci0JCXU2NCBmaW5hbF9zdGFydCwgZmluYWxfZW5kOwotCi0JCWVpX2xhc3QgPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuOwotCQllaV9sYXN0IDw8PSBQQUdFX1NISUZUOwotCQllaV9zdGFydCA9IGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbjsKLQkJZWlfc3RhcnQgPDw9IFBBR0VfU0hJRlQ7Ci0KLQkJZmluYWxfc3RhcnQgPSBtYXgoZWlfc3RhcnQsIGdvYWwpOwotCQlmaW5hbF9lbmQgPSBtaW4oZWlfbGFzdCwgbGltaXQpOwotCi0JCWlmIChmaW5hbF9zdGFydCA+PSBmaW5hbF9lbmQpCi0JCQljb250aW51ZTsKLQotCQlhZGRyID0gbWVtYmxvY2tfZmluZF9pbl9yYW5nZShmaW5hbF9zdGFydCwgZmluYWxfZW5kLCBzaXplLCBhbGlnbik7Ci0KLQkJaWYgKGFkZHIgPT0gTUVNQkxPQ0tfRVJST1IpCi0JCQljb250aW51ZTsKLQotCQlyZXR1cm4gYWRkcjsKLQl9Ci0KLQlyZXR1cm4gTUVNQkxPQ0tfRVJST1I7Ci19Ci0jZW5kaWYKLQogaW50IF9faW5pdCBhZGRfZnJvbV9lYXJseV9ub2RlX21hcChzdHJ1Y3QgcmFuZ2UgKnJhbmdlLCBpbnQgYXosCiAJCQkJICAgaW50IG5yX3JhbmdlLCBpbnQgbmlkKQogeworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOwogCWludCBpOwotCXU2NCBzdGFydCwgZW5kOwogCiAJLyogbmVlZCB0byBnbyBvdmVyIGVhcmx5X25vZGVfbWFwIHRvIGZpbmQgb3V0IGdvb2QgcmFuZ2UgZm9yIG5vZGUgKi8KLQlmb3JfZWFjaF9hY3RpdmVfcmFuZ2VfaW5kZXhfaW5fbmlkKGksIG5pZCkgewotCQlzdGFydCA9IGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbjsKLQkJZW5kID0gZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbjsKLQkJbnJfcmFuZ2UgPSBhZGRfcmFuZ2UocmFuZ2UsIGF6LCBucl9yYW5nZSwgc3RhcnQsIGVuZCk7Ci0JfQorCWZvcl9lYWNoX21lbV9wZm5fcmFuZ2UoaSwgbmlkLCAmc3RhcnRfcGZuLCAmZW5kX3BmbiwgTlVMTCkKKwkJbnJfcmFuZ2UgPSBhZGRfcmFuZ2UocmFuZ2UsIGF6LCBucl9yYW5nZSwgc3RhcnRfcGZuLCBlbmRfcGZuKTsKIAlyZXR1cm4gbnJfcmFuZ2U7CiB9CiAKLXZvaWQgX19pbml0IHdvcmtfd2l0aF9hY3RpdmVfcmVnaW9ucyhpbnQgbmlkLCB3b3JrX2ZuX3Qgd29ya19mbiwgdm9pZCAqZGF0YSkKLXsKLQlpbnQgaTsKLQlpbnQgcmV0OwotCi0JZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBuaWQpIHsKLQkJcmV0ID0gd29ya19mbihlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4sCi0JCQkgICAgICBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuLCBkYXRhKTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCX0KLX0KIC8qKgogICogc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMgLSBDYWxsIG1lbW9yeV9wcmVzZW50IGZvciBlYWNoIGFjdGl2ZSByYW5nZQogICogQG5pZDogVGhlIG5vZGUgdG8gY2FsbCBtZW1vcnlfcHJlc2VudCBmb3IuIElmIE1BWF9OVU1OT0RFUywgYWxsIG5vZGVzIHdpbGwgYmUgdXNlZC4KQEAgLTM5NDYsMTIgKzM4MDYsMTEgQEAKICAqLwogdm9pZCBfX2luaXQgc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMoaW50IG5pZCkKIHsKLQlpbnQgaTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKKwlpbnQgaSwgdGhpc19uaWQ7CiAKLQlmb3JfZWFjaF9hY3RpdmVfcmFuZ2VfaW5kZXhfaW5fbmlkKGksIG5pZCkKLQkJbWVtb3J5X3ByZXNlbnQoZWFybHlfbm9kZV9tYXBbaV0ubmlkLAotCQkJCWVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiwKLQkJCQllYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuKTsKKwlmb3JfZWFjaF9tZW1fcGZuX3JhbmdlKGksIG5pZCwgJnN0YXJ0X3BmbiwgJmVuZF9wZm4sICZ0aGlzX25pZCkKKwkJbWVtb3J5X3ByZXNlbnQodGhpc19uaWQsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CiB9CiAKIC8qKgpAQCAtMzk2OCwxMyArMzgyNywxNSBAQAogdm9pZCBfX21lbWluaXQgZ2V0X3Bmbl9yYW5nZV9mb3JfbmlkKHVuc2lnbmVkIGludCBuaWQsCiAJCQl1bnNpZ25lZCBsb25nICpzdGFydF9wZm4sIHVuc2lnbmVkIGxvbmcgKmVuZF9wZm4pCiB7CisJdW5zaWduZWQgbG9uZyB0aGlzX3N0YXJ0X3BmbiwgdGhpc19lbmRfcGZuOwogCWludCBpOworCiAJKnN0YXJ0X3BmbiA9IC0xVUw7CiAJKmVuZF9wZm4gPSAwOwogCi0JZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBuaWQpIHsKLQkJKnN0YXJ0X3BmbiA9IG1pbigqc3RhcnRfcGZuLCBlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4pOwotCQkqZW5kX3BmbiA9IG1heCgqZW5kX3BmbiwgZWFybHlfbm9kZV9tYXBbaV0uZW5kX3Bmbik7CisJZm9yX2VhY2hfbWVtX3Bmbl9yYW5nZShpLCBuaWQsICZ0aGlzX3N0YXJ0X3BmbiwgJnRoaXNfZW5kX3BmbiwgTlVMTCkgeworCQkqc3RhcnRfcGZuID0gbWluKCpzdGFydF9wZm4sIHRoaXNfc3RhcnRfcGZuKTsKKwkJKmVuZF9wZm4gPSBtYXgoKmVuZF9wZm4sIHRoaXNfZW5kX3Bmbik7CiAJfQogCiAJaWYgKCpzdGFydF9wZm4gPT0gLTFVTCkKQEAgLTQwNzcsNDYgKzM5MzgsMTYgQEAKIAkJCQl1bnNpZ25lZCBsb25nIHJhbmdlX3N0YXJ0X3BmbiwKIAkJCQl1bnNpZ25lZCBsb25nIHJhbmdlX2VuZF9wZm4pCiB7Ci0JaW50IGkgPSAwOwotCXVuc2lnbmVkIGxvbmcgcHJldl9lbmRfcGZuID0gMCwgaG9sZV9wYWdlcyA9IDA7Ci0JdW5zaWduZWQgbG9uZyBzdGFydF9wZm47CisJdW5zaWduZWQgbG9uZyBucl9hYnNlbnQgPSByYW5nZV9lbmRfcGZuIC0gcmFuZ2Vfc3RhcnRfcGZuOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBlbmRfcGZuOworCWludCBpOwogCi0JLyogRmluZCB0aGUgZW5kX3BmbiBvZiB0aGUgZmlyc3QgYWN0aXZlIHJhbmdlIG9mIHBmbnMgaW4gdGhlIG5vZGUgKi8KLQlpID0gZmlyc3RfYWN0aXZlX3JlZ2lvbl9pbmRleF9pbl9uaWQobmlkKTsKLQlpZiAoaSA9PSAtMSkKLQkJcmV0dXJuIDA7Ci0KLQlwcmV2X2VuZF9wZm4gPSBtaW4oZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuLCByYW5nZV9lbmRfcGZuKTsKLQotCS8qIEFjY291bnQgZm9yIHJhbmdlcyBiZWZvcmUgcGh5c2ljYWwgbWVtb3J5IG9uIHRoaXMgbm9kZSAqLwotCWlmIChlYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4gPiByYW5nZV9zdGFydF9wZm4pCi0JCWhvbGVfcGFnZXMgPSBwcmV2X2VuZF9wZm4gLSByYW5nZV9zdGFydF9wZm47Ci0KLQkvKiBGaW5kIGFsbCBob2xlcyBmb3IgdGhlIHpvbmUgd2l0aGluIHRoZSBub2RlICovCi0JZm9yICg7IGkgIT0gLTE7IGkgPSBuZXh0X2FjdGl2ZV9yZWdpb25faW5kZXhfaW5fbmlkKGksIG5pZCkpIHsKLQotCQkvKiBObyBuZWVkIHRvIGNvbnRpbnVlIGlmIHByZXZfZW5kX3BmbiBpcyBvdXRzaWRlIHRoZSB6b25lICovCi0JCWlmIChwcmV2X2VuZF9wZm4gPj0gcmFuZ2VfZW5kX3BmbikKLQkJCWJyZWFrOwotCi0JCS8qIE1ha2Ugc3VyZSB0aGUgZW5kIG9mIHRoZSB6b25lIGlzIG5vdCB3aXRoaW4gdGhlIGhvbGUgKi8KLQkJc3RhcnRfcGZuID0gbWluKGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiwgcmFuZ2VfZW5kX3Bmbik7Ci0JCXByZXZfZW5kX3BmbiA9IG1heChwcmV2X2VuZF9wZm4sIHJhbmdlX3N0YXJ0X3Bmbik7Ci0KLQkJLyogVXBkYXRlIHRoZSBob2xlIHNpemUgY291bmQgYW5kIG1vdmUgb24gKi8KLQkJaWYgKHN0YXJ0X3BmbiA+IHJhbmdlX3N0YXJ0X3BmbikgewotCQkJQlVHX09OKHByZXZfZW5kX3BmbiA+IHN0YXJ0X3Bmbik7Ci0JCQlob2xlX3BhZ2VzICs9IHN0YXJ0X3BmbiAtIHByZXZfZW5kX3BmbjsKLQkJfQotCQlwcmV2X2VuZF9wZm4gPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuOworCWZvcl9lYWNoX21lbV9wZm5fcmFuZ2UoaSwgbmlkLCAmc3RhcnRfcGZuLCAmZW5kX3BmbiwgTlVMTCkgeworCQlzdGFydF9wZm4gPSBjbGFtcChzdGFydF9wZm4sIHJhbmdlX3N0YXJ0X3BmbiwgcmFuZ2VfZW5kX3Bmbik7CisJCWVuZF9wZm4gPSBjbGFtcChlbmRfcGZuLCByYW5nZV9zdGFydF9wZm4sIHJhbmdlX2VuZF9wZm4pOworCQlucl9hYnNlbnQgLT0gZW5kX3BmbiAtIHN0YXJ0X3BmbjsKIAl9Ci0KLQkvKiBBY2NvdW50IGZvciByYW5nZXMgcGFzdCBwaHlzaWNhbCBtZW1vcnkgb24gdGhpcyBub2RlICovCi0JaWYgKHJhbmdlX2VuZF9wZm4gPiBwcmV2X2VuZF9wZm4pCi0JCWhvbGVfcGFnZXMgKz0gcmFuZ2VfZW5kX3BmbiAtCi0JCQkJbWF4KHJhbmdlX3N0YXJ0X3BmbiwgcHJldl9lbmRfcGZuKTsKLQotCXJldHVybiBob2xlX3BhZ2VzOworCXJldHVybiBucl9hYnNlbnQ7CiB9CiAKIC8qKgpAQCAtNDEzNywxNCArMzk2OCwxNCBAQAogCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKIAkJCQkJdW5zaWduZWQgbG9uZyAqaWdub3JlZCkKIHsKKwl1bnNpZ25lZCBsb25nIHpvbmVfbG93ID0gYXJjaF96b25lX2xvd2VzdF9wb3NzaWJsZV9wZm5bem9uZV90eXBlXTsKKwl1bnNpZ25lZCBsb25nIHpvbmVfaGlnaCA9IGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3Bmblt6b25lX3R5cGVdOwogCXVuc2lnbmVkIGxvbmcgbm9kZV9zdGFydF9wZm4sIG5vZGVfZW5kX3BmbjsKIAl1bnNpZ25lZCBsb25nIHpvbmVfc3RhcnRfcGZuLCB6b25lX2VuZF9wZm47CiAKIAlnZXRfcGZuX3JhbmdlX2Zvcl9uaWQobmlkLCAmbm9kZV9zdGFydF9wZm4sICZub2RlX2VuZF9wZm4pOwotCXpvbmVfc3RhcnRfcGZuID0gbWF4KGFyY2hfem9uZV9sb3dlc3RfcG9zc2libGVfcGZuW3pvbmVfdHlwZV0sCi0JCQkJCQkJbm9kZV9zdGFydF9wZm4pOwotCXpvbmVfZW5kX3BmbiA9IG1pbihhcmNoX3pvbmVfaGlnaGVzdF9wb3NzaWJsZV9wZm5bem9uZV90eXBlXSwKLQkJCQkJCQlub2RlX2VuZF9wZm4pOworCXpvbmVfc3RhcnRfcGZuID0gY2xhbXAobm9kZV9zdGFydF9wZm4sIHpvbmVfbG93LCB6b25lX2hpZ2gpOworCXpvbmVfZW5kX3BmbiA9IGNsYW1wKG5vZGVfZW5kX3Bmbiwgem9uZV9sb3csIHpvbmVfaGlnaCk7CiAKIAlhZGp1c3Rfem9uZV9yYW5nZV9mb3Jfem9uZV9tb3ZhYmxlKG5pZCwgem9uZV90eXBlLAogCQkJbm9kZV9zdGFydF9wZm4sIG5vZGVfZW5kX3BmbiwKQEAgLTQxNTIsNyArMzk4Myw3IEBACiAJcmV0dXJuIF9fYWJzZW50X3BhZ2VzX2luX3JhbmdlKG5pZCwgem9uZV9zdGFydF9wZm4sIHpvbmVfZW5kX3Bmbik7CiB9CiAKLSNlbHNlCisjZWxzZSAvKiBDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RFX01BUCAqLwogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdCB6b25lX3NwYW5uZWRfcGFnZXNfaW5fbm9kZShpbnQgbmlkLAogCQkJCQl1bnNpZ25lZCBsb25nIHpvbmVfdHlwZSwKIAkJCQkJdW5zaWduZWQgbG9uZyAqem9uZXNfc2l6ZSkKQEAgLTQxNzAsNyArNDAwMSw3IEBACiAJcmV0dXJuIHpob2xlc19zaXplW3pvbmVfdHlwZV07CiB9CiAKLSNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQICovCiAKIHN0YXRpYyB2b2lkIF9fbWVtaW5pdCBjYWxjdWxhdGVfbm9kZV90b3RhbHBhZ2VzKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsCiAJCXVuc2lnbmVkIGxvbmcgKnpvbmVzX3NpemUsIHVuc2lnbmVkIGxvbmcgKnpob2xlc19zaXplKQpAQCAtNDM5MywxMCArNDIyNCwxMCBAQAogCSAqLwogCWlmIChwZ2RhdCA9PSBOT0RFX0RBVEEoMCkpIHsKIAkJbWVtX21hcCA9IE5PREVfREFUQSgwKS0+bm9kZV9tZW1fbWFwOwotI2lmZGVmIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUAorI2lmZGVmIENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQCiAJCWlmIChwYWdlX3RvX3BmbihtZW1fbWFwKSAhPSBwZ2RhdC0+bm9kZV9zdGFydF9wZm4pCiAJCQltZW1fbWFwIC09IChwZ2RhdC0+bm9kZV9zdGFydF9wZm4gLSBBUkNIX1BGTl9PRkZTRVQpOwotI2VuZGlmIC8qIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUCAqLworI2VuZGlmIC8qIENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQICovCiAJfQogI2VuZGlmCiAjZW5kaWYgLyogQ09ORklHX0ZMQVRfTk9ERV9NRU1fTUFQICovCkBAIC00NDIxLDcgKzQyNTIsNyBAQAogCWZyZWVfYXJlYV9pbml0X2NvcmUocGdkYXQsIHpvbmVzX3NpemUsIHpob2xlc19zaXplKTsKIH0KIAotI2lmZGVmIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUAorI2lmZGVmIENPTkZJR19IQVZFX01FTUJMT0NLX05PREVfTUFQCiAKICNpZiBNQVhfTlVNTk9ERVMgPiAxCiAvKgpAQCAtNDQ0MywxNzAgKzQyNzQsNiBAQAogI2VuZGlmCiAKIC8qKgotICogYWRkX2FjdGl2ZV9yYW5nZSAtIFJlZ2lzdGVyIGEgcmFuZ2Ugb2YgUEZOcyBiYWNrZWQgYnkgcGh5c2ljYWwgbWVtb3J5Ci0gKiBAbmlkOiBUaGUgbm9kZSBJRCB0aGUgcmFuZ2UgcmVzaWRlcyBvbgotICogQHN0YXJ0X3BmbjogVGhlIHN0YXJ0IFBGTiBvZiB0aGUgYXZhaWxhYmxlIHBoeXNpY2FsIG1lbW9yeQotICogQGVuZF9wZm46IFRoZSBlbmQgUEZOIG9mIHRoZSBhdmFpbGFibGUgcGh5c2ljYWwgbWVtb3J5Ci0gKgotICogVGhlc2UgcmFuZ2VzIGFyZSBzdG9yZWQgaW4gYW4gZWFybHlfbm9kZV9tYXBbXSBhbmQgbGF0ZXIgdXNlZCBieQotICogZnJlZV9hcmVhX2luaXRfbm9kZXMoKSB0byBjYWxjdWxhdGUgem9uZSBzaXplcyBhbmQgaG9sZXMuIElmIHRoZQotICogcmFuZ2Ugc3BhbnMgYSBtZW1vcnkgaG9sZSwgaXQgaXMgdXAgdG8gdGhlIGFyY2hpdGVjdHVyZSB0byBlbnN1cmUKLSAqIHRoZSBtZW1vcnkgaXMgbm90IGZyZWVkIGJ5IHRoZSBib290bWVtIGFsbG9jYXRvci4gSWYgcG9zc2libGUKLSAqIHRoZSByYW5nZSBiZWluZyByZWdpc3RlcmVkIHdpbGwgYmUgbWVyZ2VkIHdpdGggZXhpc3RpbmcgcmFuZ2VzLgotICovCi12b2lkIF9faW5pdCBhZGRfYWN0aXZlX3JhbmdlKHVuc2lnbmVkIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCQkJdW5zaWduZWQgbG9uZyBlbmRfcGZuKQotewotCWludCBpOwotCi0JbW1pbml0X2RwcmludGsoTU1JTklUX1RSQUNFLCAibWVtb3J5X3JlZ2lzdGVyIiwKLQkJCSJFbnRlcmluZyBhZGRfYWN0aXZlX3JhbmdlKCVkLCAlI2x4LCAlI2x4KSAiCi0JCQkiJWQgZW50cmllcyBvZiAlZCB1c2VkXG4iLAotCQkJbmlkLCBzdGFydF9wZm4sIGVuZF9wZm4sCi0JCQlucl9ub2RlbWFwX2VudHJpZXMsIE1BWF9BQ1RJVkVfUkVHSU9OUyk7Ci0KLQltbWluaXRfdmFsaWRhdGVfbWVtbW9kZWxfbGltaXRzKCZzdGFydF9wZm4sICZlbmRfcGZuKTsKLQotCS8qIE1lcmdlIHdpdGggZXhpc3RpbmcgYWN0aXZlIHJlZ2lvbnMgaWYgcG9zc2libGUgKi8KLQlmb3IgKGkgPSAwOyBpIDwgbnJfbm9kZW1hcF9lbnRyaWVzOyBpKyspIHsKLQkJaWYgKGVhcmx5X25vZGVfbWFwW2ldLm5pZCAhPSBuaWQpCi0JCQljb250aW51ZTsKLQotCQkvKiBTa2lwIGlmIGFuIGV4aXN0aW5nIHJlZ2lvbiBjb3ZlcnMgdGhpcyBuZXcgb25lICovCi0JCWlmIChzdGFydF9wZm4gPj0gZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuICYmCi0JCQkJZW5kX3BmbiA8PSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuKQotCQkJcmV0dXJuOwotCi0JCS8qIE1lcmdlIGZvcndhcmQgaWYgc3VpdGFibGUgKi8KLQkJaWYgKHN0YXJ0X3BmbiA8PSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuICYmCi0JCQkJZW5kX3BmbiA+IGVhcmx5X25vZGVfbWFwW2ldLmVuZF9wZm4pIHsKLQkJCWVhcmx5X25vZGVfbWFwW2ldLmVuZF9wZm4gPSBlbmRfcGZuOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLyogTWVyZ2UgYmFja3dhcmQgaWYgc3VpdGFibGUgKi8KLQkJaWYgKHN0YXJ0X3BmbiA8IGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiAmJgotCQkJCWVuZF9wZm4gPj0gZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuKSB7Ci0JCQllYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4gPSBzdGFydF9wZm47Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQkvKiBDaGVjayB0aGF0IGVhcmx5X25vZGVfbWFwIGlzIGxhcmdlIGVub3VnaCAqLwotCWlmIChpID49IE1BWF9BQ1RJVkVfUkVHSU9OUykgewotCQlwcmludGsoS0VSTl9DUklUICJNb3JlIHRoYW4gJWQgbWVtb3J5IHJlZ2lvbnMsIHRydW5jYXRpbmdcbiIsCi0JCQkJCQkJTUFYX0FDVElWRV9SRUdJT05TKTsKLQkJcmV0dXJuOwotCX0KLQotCWVhcmx5X25vZGVfbWFwW2ldLm5pZCA9IG5pZDsKLQllYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4gPSBzdGFydF9wZm47Ci0JZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbiA9IGVuZF9wZm47Ci0JbnJfbm9kZW1hcF9lbnRyaWVzID0gaSArIDE7Ci19Ci0KLS8qKgotICogcmVtb3ZlX2FjdGl2ZV9yYW5nZSAtIFNocmluayBhbiBleGlzdGluZyByZWdpc3RlcmVkIHJhbmdlIG9mIFBGTnMKLSAqIEBuaWQ6IFRoZSBub2RlIGlkIHRoZSByYW5nZSBpcyBvbiB0aGF0IHNob3VsZCBiZSBzaHJ1bmsKLSAqIEBzdGFydF9wZm46IFRoZSBuZXcgUEZOIG9mIHRoZSByYW5nZQotICogQGVuZF9wZm46IFRoZSBuZXcgUEZOIG9mIHRoZSByYW5nZQotICoKLSAqIGkzODYgd2l0aCBOVU1BIHVzZSBhbGxvY19yZW1hcCgpIHRvIHN0b3JlIGEgbm9kZV9tZW1fbWFwIG9uIGEgbG9jYWwgbm9kZS4KLSAqIFRoZSBtYXAgaXMga2VwdCBuZWFyIHRoZSBlbmQgcGh5c2ljYWwgcGFnZSByYW5nZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4KLSAqIHJlZ2lzdGVyZWQuIFRoaXMgZnVuY3Rpb24gYWxsb3dzIGFuIGFyY2ggdG8gc2hyaW5rIGFuIGV4aXN0aW5nIHJlZ2lzdGVyZWQKLSAqIHJhbmdlLgotICovCi12b2lkIF9faW5pdCByZW1vdmVfYWN0aXZlX3JhbmdlKHVuc2lnbmVkIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCXVuc2lnbmVkIGxvbmcgZW5kX3BmbikKLXsKLQlpbnQgaSwgajsKLQlpbnQgcmVtb3ZlZCA9IDA7Ci0KLQlwcmludGsoS0VSTl9ERUJVRyAicmVtb3ZlX2FjdGl2ZV9yYW5nZSAoJWQsICVsdSwgJWx1KVxuIiwKLQkJCSAgbmlkLCBzdGFydF9wZm4sIGVuZF9wZm4pOwotCi0JLyogRmluZCB0aGUgb2xkIGFjdGl2ZSByZWdpb24gZW5kIGFuZCBzaHJpbmsgKi8KLQlmb3JfZWFjaF9hY3RpdmVfcmFuZ2VfaW5kZXhfaW5fbmlkKGksIG5pZCkgewotCQlpZiAoZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuID49IHN0YXJ0X3BmbiAmJgotCQkgICAgZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbiA8PSBlbmRfcGZuKSB7Ci0JCQkvKiBjbGVhciBpdCAqLwotCQkJZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuID0gMDsKLQkJCWVhcmx5X25vZGVfbWFwW2ldLmVuZF9wZm4gPSAwOwotCQkJcmVtb3ZlZCA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuIDwgc3RhcnRfcGZuICYmCi0JCSAgICBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuID4gc3RhcnRfcGZuKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHRlbXBfZW5kX3BmbiA9IGVhcmx5X25vZGVfbWFwW2ldLmVuZF9wZm47Ci0JCQllYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuID0gc3RhcnRfcGZuOwotCQkJaWYgKHRlbXBfZW5kX3BmbiA+IGVuZF9wZm4pCi0JCQkJYWRkX2FjdGl2ZV9yYW5nZShuaWQsIGVuZF9wZm4sIHRlbXBfZW5kX3Bmbik7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuID49IHN0YXJ0X3BmbiAmJgotCQkgICAgZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbiA+IGVuZF9wZm4gJiYKLQkJICAgIGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiA8IGVuZF9wZm4pIHsKLQkJCWVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbiA9IGVuZF9wZm47Ci0JCQljb250aW51ZTsKLQkJfQotCX0KLQotCWlmICghcmVtb3ZlZCkKLQkJcmV0dXJuOwotCi0JLyogcmVtb3ZlIHRoZSBibGFuayBvbmVzICovCi0JZm9yIChpID0gbnJfbm9kZW1hcF9lbnRyaWVzIC0gMTsgaSA+IDA7IGktLSkgewotCQlpZiAoZWFybHlfbm9kZV9tYXBbaV0ubmlkICE9IG5pZCkKLQkJCWNvbnRpbnVlOwotCQlpZiAoZWFybHlfbm9kZV9tYXBbaV0uZW5kX3BmbikKLQkJCWNvbnRpbnVlOwotCQkvKiB3ZSBmb3VuZCBpdCwgZ2V0IHJpZCBvZiBpdCAqLwotCQlmb3IgKGogPSBpOyBqIDwgbnJfbm9kZW1hcF9lbnRyaWVzIC0gMTsgaisrKQotCQkJbWVtY3B5KCZlYXJseV9ub2RlX21hcFtqXSwgJmVhcmx5X25vZGVfbWFwW2orMV0sCi0JCQkJc2l6ZW9mKGVhcmx5X25vZGVfbWFwW2pdKSk7Ci0JCWogPSBucl9ub2RlbWFwX2VudHJpZXMgLSAxOwotCQltZW1zZXQoJmVhcmx5X25vZGVfbWFwW2pdLCAwLCBzaXplb2YoZWFybHlfbm9kZV9tYXBbal0pKTsKLQkJbnJfbm9kZW1hcF9lbnRyaWVzLS07Ci0JfQotfQotCi0vKioKLSAqIHJlbW92ZV9hbGxfYWN0aXZlX3JhbmdlcyAtIFJlbW92ZSBhbGwgY3VycmVudGx5IHJlZ2lzdGVyZWQgcmVnaW9ucwotICoKLSAqIER1cmluZyBkaXNjb3ZlcnksIGl0IG1heSBiZSBmb3VuZCB0aGF0IGEgdGFibGUgbGlrZSBTUkFUIGlzIGludmFsaWQKLSAqIGFuZCBhbiBhbHRlcm5hdGl2ZSBkaXNjb3ZlcnkgbWV0aG9kIG11c3QgYmUgdXNlZC4gVGhpcyBmdW5jdGlvbiByZW1vdmVzCi0gKiBhbGwgY3VycmVudGx5IHJlZ2lzdGVyZWQgcmVnaW9ucy4KLSAqLwotdm9pZCBfX2luaXQgcmVtb3ZlX2FsbF9hY3RpdmVfcmFuZ2VzKHZvaWQpCi17Ci0JbWVtc2V0KGVhcmx5X25vZGVfbWFwLCAwLCBzaXplb2YoZWFybHlfbm9kZV9tYXApKTsKLQlucl9ub2RlbWFwX2VudHJpZXMgPSAwOwotfQotCi0vKiBDb21wYXJlIHR3byBhY3RpdmUgbm9kZV9hY3RpdmVfcmVnaW9ucyAqLwotc3RhdGljIGludCBfX2luaXQgY21wX25vZGVfYWN0aXZlX3JlZ2lvbihjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQotewotCXN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24gKmFyYW5nZSA9IChzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uICopYTsKLQlzdHJ1Y3Qgbm9kZV9hY3RpdmVfcmVnaW9uICpicmFuZ2UgPSAoc3RydWN0IG5vZGVfYWN0aXZlX3JlZ2lvbiAqKWI7Ci0KLQkvKiBEb25lIHRoaXMgd2F5IHRvIGF2b2lkIG92ZXJmbG93cyAqLwotCWlmIChhcmFuZ2UtPnN0YXJ0X3BmbiA+IGJyYW5nZS0+c3RhcnRfcGZuKQotCQlyZXR1cm4gMTsKLQlpZiAoYXJhbmdlLT5zdGFydF9wZm4gPCBicmFuZ2UtPnN0YXJ0X3BmbikKLQkJcmV0dXJuIC0xOwotCi0JcmV0dXJuIDA7Ci19Ci0KLS8qIHNvcnQgdGhlIG5vZGVfbWFwIGJ5IHN0YXJ0X3BmbiAqLwotdm9pZCBfX2luaXQgc29ydF9ub2RlX21hcCh2b2lkKQotewotCXNvcnQoZWFybHlfbm9kZV9tYXAsIChzaXplX3QpbnJfbm9kZW1hcF9lbnRyaWVzLAotCQkJc2l6ZW9mKHN0cnVjdCBub2RlX2FjdGl2ZV9yZWdpb24pLAotCQkJY21wX25vZGVfYWN0aXZlX3JlZ2lvbiwgTlVMTCk7Ci19Ci0KLS8qKgogICogbm9kZV9tYXBfcGZuX2FsaWdubWVudCAtIGRldGVybWluZSB0aGUgbWF4aW11bSBpbnRlcm5vZGUgYWxpZ25tZW50CiAgKgogICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIG5vZGUgbWFwIGlzIHBvcHVsYXRlZCBhbmQgc29ydGVkLgpAQCAtNDYyOCwxNSArNDI5NSwxMSBAQAogdW5zaWduZWQgbG9uZyBfX2luaXQgbm9kZV9tYXBfcGZuX2FsaWdubWVudCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgYWNjbF9tYXNrID0gMCwgbGFzdF9lbmQgPSAwOworCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZCwgbWFzazsKIAlpbnQgbGFzdF9uaWQgPSAtMTsKLQlpbnQgaTsKKwlpbnQgaSwgbmlkOwogCi0JZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBNQVhfTlVNTk9ERVMpIHsKLQkJaW50IG5pZCA9IGVhcmx5X25vZGVfbWFwW2ldLm5pZDsKLQkJdW5zaWduZWQgbG9uZyBzdGFydCA9IGVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbjsKLQkJdW5zaWduZWQgbG9uZyBlbmQgPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuOwotCQl1bnNpZ25lZCBsb25nIG1hc2s7Ci0KKwlmb3JfZWFjaF9tZW1fcGZuX3JhbmdlKGksIE1BWF9OVU1OT0RFUywgJnN0YXJ0LCAmZW5kLCAmbmlkKSB7CiAJCWlmICghc3RhcnQgfHwgbGFzdF9uaWQgPCAwIHx8IGxhc3RfbmlkID09IG5pZCkgewogCQkJbGFzdF9uaWQgPSBuaWQ7CiAJCQlsYXN0X2VuZCA9IGVuZDsKQEAgLTQ2NjMsMTIgKzQzMjYsMTIgQEAKIC8qIEZpbmQgdGhlIGxvd2VzdCBwZm4gZm9yIGEgbm9kZSAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGZpbmRfbWluX3Bmbl9mb3Jfbm9kZShpbnQgbmlkKQogewotCWludCBpOwogCXVuc2lnbmVkIGxvbmcgbWluX3BmbiA9IFVMT05HX01BWDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbjsKKwlpbnQgaTsKIAotCS8qIEFzc3VtaW5nIGEgc29ydGVkIG1hcCwgdGhlIGZpcnN0IHJhbmdlIGZvdW5kIGhhcyB0aGUgc3RhcnRpbmcgcGZuICovCi0JZm9yX2VhY2hfYWN0aXZlX3JhbmdlX2luZGV4X2luX25pZChpLCBuaWQpCi0JCW1pbl9wZm4gPSBtaW4obWluX3BmbiwgZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuKTsKKwlmb3JfZWFjaF9tZW1fcGZuX3JhbmdlKGksIG5pZCwgJnN0YXJ0X3BmbiwgTlVMTCwgTlVMTCkKKwkJbWluX3BmbiA9IG1pbihtaW5fcGZuLCBzdGFydF9wZm4pOwogCiAJaWYgKG1pbl9wZm4gPT0gVUxPTkdfTUFYKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcKQEAgLTQ2OTcsMTUgKzQzNjAsMTYgQEAKICAqLwogc3RhdGljIHVuc2lnbmVkIGxvbmcgX19pbml0IGVhcmx5X2NhbGN1bGF0ZV90b3RhbHBhZ2VzKHZvaWQpCiB7Ci0JaW50IGk7CiAJdW5zaWduZWQgbG9uZyB0b3RhbHBhZ2VzID0gMDsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgZW5kX3BmbjsKKwlpbnQgaSwgbmlkOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX25vZGVtYXBfZW50cmllczsgaSsrKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGFnZXMgPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuIC0KLQkJCQkJCWVhcmx5X25vZGVfbWFwW2ldLnN0YXJ0X3BmbjsKKwlmb3JfZWFjaF9tZW1fcGZuX3JhbmdlKGksIE1BWF9OVU1OT0RFUywgJnN0YXJ0X3BmbiwgJmVuZF9wZm4sICZuaWQpIHsKKwkJdW5zaWduZWQgbG9uZyBwYWdlcyA9IGVuZF9wZm4gLSBzdGFydF9wZm47CisKIAkJdG90YWxwYWdlcyArPSBwYWdlczsKIAkJaWYgKHBhZ2VzKQotCQkJbm9kZV9zZXRfc3RhdGUoZWFybHlfbm9kZV9tYXBbaV0ubmlkLCBOX0hJR0hfTUVNT1JZKTsKKwkJCW5vZGVfc2V0X3N0YXRlKG5pZCwgTl9ISUdIX01FTU9SWSk7CiAJfQogICAJcmV0dXJuIHRvdGFscGFnZXM7CiB9CkBAIC00NzYwLDYgKzQ0MjQsOCBAQAogCS8qIFNwcmVhZCBrZXJuZWxjb3JlIG1lbW9yeSBhcyBldmVubHkgYXMgcG9zc2libGUgdGhyb3VnaG91dCBub2RlcyAqLwogCWtlcm5lbGNvcmVfbm9kZSA9IHJlcXVpcmVkX2tlcm5lbGNvcmUgLyB1c2FibGVfbm9kZXM7CiAJZm9yX2VhY2hfbm9kZV9zdGF0ZShuaWQsIE5fSElHSF9NRU1PUlkpIHsKKwkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47CisKIAkJLyoKIAkJICogUmVjYWxjdWxhdGUga2VybmVsY29yZV9ub2RlIGlmIHRoZSBkaXZpc2lvbiBwZXIgbm9kZQogCQkgKiBub3cgZXhjZWVkcyB3aGF0IGlzIG5lY2Vzc2FyeSB0byBzYXRpc2Z5IHRoZSByZXF1ZXN0ZWQKQEAgLTQ3NzYsMTMgKzQ0NDIsMTAgQEAKIAkJa2VybmVsY29yZV9yZW1haW5pbmcgPSBrZXJuZWxjb3JlX25vZGU7CiAKIAkJLyogR28gdGhyb3VnaCBlYWNoIHJhbmdlIG9mIFBGTnMgd2l0aGluIHRoaXMgbm9kZSAqLwotCQlmb3JfZWFjaF9hY3RpdmVfcmFuZ2VfaW5kZXhfaW5fbmlkKGksIG5pZCkgewotCQkJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47CisJCWZvcl9lYWNoX21lbV9wZm5fcmFuZ2UoaSwgbmlkLCAmc3RhcnRfcGZuLCAmZW5kX3BmbiwgTlVMTCkgewogCQkJdW5zaWduZWQgbG9uZyBzaXplX3BhZ2VzOwogCi0JCQlzdGFydF9wZm4gPSBtYXgoZWFybHlfbm9kZV9tYXBbaV0uc3RhcnRfcGZuLAotCQkJCQkJem9uZV9tb3ZhYmxlX3BmbltuaWRdKTsKLQkJCWVuZF9wZm4gPSBlYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuOworCQkJc3RhcnRfcGZuID0gbWF4KHN0YXJ0X3Bmbiwgem9uZV9tb3ZhYmxlX3BmbltuaWRdKTsKIAkJCWlmIChzdGFydF9wZm4gPj0gZW5kX3BmbikKIAkJCQljb250aW51ZTsKIApAQCAtNDg4NCwxMSArNDU0Nyw4IEBACiAgKi8KIHZvaWQgX19pbml0IGZyZWVfYXJlYV9pbml0X25vZGVzKHVuc2lnbmVkIGxvbmcgKm1heF96b25lX3BmbikKIHsKLQl1bnNpZ25lZCBsb25nIG5pZDsKLQlpbnQgaTsKLQotCS8qIFNvcnQgZWFybHlfbm9kZV9tYXAgYXMgaW5pdGlhbGlzYXRpb24gYXNzdW1lcyBpdCBpcyBzb3J0ZWQgKi8KLQlzb3J0X25vZGVfbWFwKCk7CisJdW5zaWduZWQgbG9uZyBzdGFydF9wZm4sIGVuZF9wZm47CisJaW50IGksIG5pZDsKIAogCS8qIFJlY29yZCB3aGVyZSB0aGUgem9uZSBib3VuZGFyaWVzIGFyZSAqLwogCW1lbXNldChhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbiwgMCwKQEAgLTQ5MzUsMTEgKzQ1OTUsOSBAQAogCX0KIAogCS8qIFByaW50IG91dCB0aGUgZWFybHlfbm9kZV9tYXBbXSAqLwotCXByaW50aygiZWFybHlfbm9kZV9tYXBbJWRdIGFjdGl2ZSBQRk4gcmFuZ2VzXG4iLCBucl9ub2RlbWFwX2VudHJpZXMpOwotCWZvciAoaSA9IDA7IGkgPCBucl9ub2RlbWFwX2VudHJpZXM7IGkrKykKLQkJcHJpbnRrKCIgICUzZDogJTAjMTBseCAtPiAlMCMxMGx4XG4iLCBlYXJseV9ub2RlX21hcFtpXS5uaWQsCi0JCQkJCQllYXJseV9ub2RlX21hcFtpXS5zdGFydF9wZm4sCi0JCQkJCQllYXJseV9ub2RlX21hcFtpXS5lbmRfcGZuKTsKKwlwcmludGsoIkVhcmx5IG1lbW9yeSBQRk4gcmFuZ2VzXG4iKTsKKwlmb3JfZWFjaF9tZW1fcGZuX3JhbmdlKGksIE1BWF9OVU1OT0RFUywgJnN0YXJ0X3BmbiwgJmVuZF9wZm4sICZuaWQpCisJCXByaW50aygiICAlM2Q6ICUwIzEwbHggLT4gJTAjMTBseFxuIiwgbmlkLCBzdGFydF9wZm4sIGVuZF9wZm4pOwogCiAJLyogSW5pdGlhbGlzZSBldmVyeSBub2RlICovCiAJbW1pbml0X3ZlcmlmeV9wYWdlZmxhZ3NfbGF5b3V0KCk7CkBAIC00OTkyLDcgKzQ2NTAsNyBAQAogZWFybHlfcGFyYW0oImtlcm5lbGNvcmUiLCBjbWRsaW5lX3BhcnNlX2tlcm5lbGNvcmUpOwogZWFybHlfcGFyYW0oIm1vdmFibGVjb3JlIiwgY21kbGluZV9wYXJzZV9tb3ZhYmxlY29yZSk7CiAKLSNlbmRpZiAvKiBDT05GSUdfQVJDSF9QT1BVTEFURVNfTk9ERV9NQVAgKi8KKyNlbmRpZiAvKiBDT05GSUdfSEFWRV9NRU1CTE9DS19OT0RFX01BUCAqLwogCiAvKioKICAqIHNldF9kbWFfcmVzZXJ2ZSAtIHNldCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBwYWdlcyByZXNlcnZlZCBpbiB0aGUgZmlyc3Qgem9uZQpkaWZmIC0tZ2l0IGEvbW0vcGVyY3B1LmMgYi9tbS9wZXJjcHUuYwppbmRleCAzYmI4MTBhLi43MTZlYjRhIDEwMDY0NAotLS0gYS9tbS9wZXJjcHUuYworKysgYi9tbS9wZXJjcHUuYwpAQCAtMTAyMyw5ICsxMDIzLDExIEBACiAJCWlmICghaXNfdm1hbGxvY19hZGRyKGFkZHIpKQogCQkJcmV0dXJuIF9fcGEoYWRkcik7CiAJCWVsc2UKLQkJCXJldHVybiBwYWdlX3RvX3BoeXModm1hbGxvY190b19wYWdlKGFkZHIpKTsKKwkJCXJldHVybiBwYWdlX3RvX3BoeXModm1hbGxvY190b19wYWdlKGFkZHIpKSArCisJCQkgICAgICAgb2Zmc2V0X2luX3BhZ2UoYWRkcik7CiAJfSBlbHNlCi0JCXJldHVybiBwYWdlX3RvX3BoeXMocGNwdV9hZGRyX3RvX3BhZ2UoYWRkcikpOworCQlyZXR1cm4gcGFnZV90b19waHlzKHBjcHVfYWRkcl90b19wYWdlKGFkZHIpKSArCisJCSAgICAgICBvZmZzZXRfaW5fcGFnZShhZGRyKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9tbS9zbGFiLmMgYi9tbS9zbGFiLmMKaW5kZXggNzA4ZWZlOC4uODMzMTFjOWEgMTAwNjQ0Ci0tLSBhL21tL3NsYWIuYworKysgYi9tbS9zbGFiLmMKQEAgLTU5NSw2ICs1OTUsNyBAQAogCVBBUlRJQUxfQUMsCiAJUEFSVElBTF9MMywKIAlFQVJMWSwKKwlMQVRFLAogCUZVTEwKIH0gZ19jcHVjYWNoZV91cDsKIApAQCAtNjcxLDcgKzY3Miw3IEBACiB7CiAJc3RydWN0IGNhY2hlX3NpemVzICpzID0gbWFsbG9jX3NpemVzOwogCi0JaWYgKGdfY3B1Y2FjaGVfdXAgIT0gRlVMTCkKKwlpZiAoZ19jcHVjYWNoZV91cCA8IExBVEUpCiAJCXJldHVybjsKIAogCWZvciAocyA9IG1hbGxvY19zaXplczsgcy0+Y3Nfc2l6ZSAhPSBVTE9OR19NQVg7IHMrKykgewpAQCAtMTY2Niw2ICsxNjY3LDggQEAKIHsKIAlzdHJ1Y3Qga21lbV9jYWNoZSAqY2FjaGVwOwogCisJZ19jcHVjYWNoZV91cCA9IExBVEU7CisKIAkvKiBBbm5vdGF0ZSBzbGFiIGZvciBsb2NrZGVwIC0tIGFubm90YXRlIHRoZSBtYWxsb2MgY2FjaGVzICovCiAJaW5pdF9sb2NrX2tleXMoKTsKIApkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IGVkMzMzNGQuLjA5Y2NlZTggMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTM2OCw3ICszNjgsNyBAQAogCVZNX0JVR19PTighaXJxc19kaXNhYmxlZCgpKTsKICNpZmRlZiBDT05GSUdfQ01QWENIR19ET1VCTEUKIAlpZiAocy0+ZmxhZ3MgJiBfX0NNUFhDSEdfRE9VQkxFKSB7Ci0JCWlmIChjbXB4Y2hnX2RvdWJsZSgmcGFnZS0+ZnJlZWxpc3QsCisJCWlmIChjbXB4Y2hnX2RvdWJsZSgmcGFnZS0+ZnJlZWxpc3QsICZwYWdlLT5jb3VudGVycywKIAkJCWZyZWVsaXN0X29sZCwgY291bnRlcnNfb2xkLAogCQkJZnJlZWxpc3RfbmV3LCBjb3VudGVyc19uZXcpKQogCQlyZXR1cm4gMTsKQEAgLTQwMiw3ICs0MDIsNyBAQAogewogI2lmZGVmIENPTkZJR19DTVBYQ0hHX0RPVUJMRQogCWlmIChzLT5mbGFncyAmIF9fQ01QWENIR19ET1VCTEUpIHsKLQkJaWYgKGNtcHhjaGdfZG91YmxlKCZwYWdlLT5mcmVlbGlzdCwKKwkJaWYgKGNtcHhjaGdfZG91YmxlKCZwYWdlLT5mcmVlbGlzdCwgJnBhZ2UtPmNvdW50ZXJzLAogCQkJZnJlZWxpc3Rfb2xkLCBjb3VudGVyc19vbGQsCiAJCQlmcmVlbGlzdF9uZXcsIGNvdW50ZXJzX25ldykpCiAJCXJldHVybiAxOwpkaWZmIC0tZ2l0IGEvbW0vdm1hbGxvYy5jIGIvbW0vdm1hbGxvYy5jCmluZGV4IDMyMzFiZjMuLjI3YmUyZjAgMTAwNjQ0Ci0tLSBhL21tL3ZtYWxsb2MuYworKysgYi9tbS92bWFsbG9jLmMKQEAgLTEyOTAsNyArMTI5MCw3IEBACiAJCXVuc2lnbmVkIGxvbmcgYWxpZ24sIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCiAJCXVuc2lnbmVkIGxvbmcgZW5kLCBpbnQgbm9kZSwgZ2ZwX3QgZ2ZwX21hc2ssIHZvaWQgKmNhbGxlcikKIHsKLQlzdGF0aWMgc3RydWN0IHZtYXBfYXJlYSAqdmE7CisJc3RydWN0IHZtYXBfYXJlYSAqdmE7CiAJc3RydWN0IHZtX3N0cnVjdCAqYXJlYTsKIAogCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CkBAIC0xNjMzLDYgKzE2MzMsOCBAQAogCQlnb3RvIGZhaWw7CiAKIAlhZGRyID0gX192bWFsbG9jX2FyZWFfbm9kZShhcmVhLCBnZnBfbWFzaywgcHJvdCwgbm9kZSwgY2FsbGVyKTsKKwlpZiAoIWFkZHIpCisJCXJldHVybiBOVUxMOwogCiAJLyoKIAkgKiBJbiB0aGlzIGZ1bmN0aW9uLCBuZXdseSBhbGxvY2F0ZWQgdm1fc3RydWN0IGlzIG5vdCBhZGRlZApkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92bXNjYW4uYwppbmRleCBhMTg5M2MwLi5mNTRhMDViIDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9tbS92bXNjYW4uYwpAQCAtMTgzLDcgKzE4Myw3IEBACiAgKi8KIHZvaWQgcmVnaXN0ZXJfc2hyaW5rZXIoc3RydWN0IHNocmlua2VyICpzaHJpbmtlcikKIHsKLQlzaHJpbmtlci0+bnIgPSAwOworCWF0b21pY19sb25nX3NldCgmc2hyaW5rZXItPm5yX2luX2JhdGNoLCAwKTsKIAlkb3duX3dyaXRlKCZzaHJpbmtlcl9yd3NlbSk7CiAJbGlzdF9hZGRfdGFpbCgmc2hyaW5rZXItPmxpc3QsICZzaHJpbmtlcl9saXN0KTsKIAl1cF93cml0ZSgmc2hyaW5rZXJfcndzZW0pOwpAQCAtMjQ3LDI1ICsyNDcsMjYgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoc2hyaW5rZXIsICZzaHJpbmtlcl9saXN0LCBsaXN0KSB7CiAJCXVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YTsKLQkJdW5zaWduZWQgbG9uZyB0b3RhbF9zY2FuOwotCQl1bnNpZ25lZCBsb25nIG1heF9wYXNzOworCQlsb25nIHRvdGFsX3NjYW47CisJCWxvbmcgbWF4X3Bhc3M7CiAJCWludCBzaHJpbmtfcmV0ID0gMDsKIAkJbG9uZyBucjsKIAkJbG9uZyBuZXdfbnI7CiAJCWxvbmcgYmF0Y2hfc2l6ZSA9IHNocmlua2VyLT5iYXRjaCA/IHNocmlua2VyLT5iYXRjaAogCQkJCQkJICA6IFNIUklOS19CQVRDSDsKIAorCQltYXhfcGFzcyA9IGRvX3Nocmlua2VyX3NocmluayhzaHJpbmtlciwgc2hyaW5rLCAwKTsKKwkJaWYgKG1heF9wYXNzIDw9IDApCisJCQljb250aW51ZTsKKwogCQkvKgogCQkgKiBjb3B5IHRoZSBjdXJyZW50IHNocmlua2VyIHNjYW4gY291bnQgaW50byBhIGxvY2FsIHZhcmlhYmxlCiAJCSAqIGFuZCB6ZXJvIGl0IHNvIHRoYXQgb3RoZXIgY29uY3VycmVudCBzaHJpbmtlciBpbnZvY2F0aW9ucwogCQkgKiBkb24ndCBhbHNvIGRvIHRoaXMgc2Nhbm5pbmcgd29yay4KIAkJICovCi0JCWRvIHsKLQkJCW5yID0gc2hyaW5rZXItPm5yOwotCQl9IHdoaWxlIChjbXB4Y2hnKCZzaHJpbmtlci0+bnIsIG5yLCAwKSAhPSBucik7CisJCW5yID0gYXRvbWljX2xvbmdfeGNoZygmc2hyaW5rZXItPm5yX2luX2JhdGNoLCAwKTsKIAogCQl0b3RhbF9zY2FuID0gbnI7Ci0JCW1heF9wYXNzID0gZG9fc2hyaW5rZXJfc2hyaW5rKHNocmlua2VyLCBzaHJpbmssIDApOwogCQlkZWx0YSA9ICg0ICogbnJfcGFnZXNfc2Nhbm5lZCkgLyBzaHJpbmtlci0+c2Vla3M7CiAJCWRlbHRhICo9IG1heF9wYXNzOwogCQlkb19kaXYoZGVsdGEsIGxydV9wYWdlcyArIDEpOwpAQCAtMzI1LDEyICszMjYsMTEgQEAKIAkJICogbWFubmVyIHRoYXQgaGFuZGxlcyBjb25jdXJyZW50IHVwZGF0ZXMuIElmIHdlIGV4aGF1c3RlZCB0aGUKIAkJICogc2NhbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBkbyBhbiB1cGRhdGUuCiAJCSAqLwotCQlkbyB7Ci0JCQluciA9IHNocmlua2VyLT5ucjsKLQkJCW5ld19uciA9IHRvdGFsX3NjYW4gKyBucjsKLQkJCWlmICh0b3RhbF9zY2FuIDw9IDApCi0JCQkJYnJlYWs7Ci0JCX0gd2hpbGUgKGNtcHhjaGcoJnNocmlua2VyLT5uciwgbnIsIG5ld19ucikgIT0gbnIpOworCQlpZiAodG90YWxfc2NhbiA+IDApCisJCQluZXdfbnIgPSBhdG9taWNfbG9uZ19hZGRfcmV0dXJuKHRvdGFsX3NjYW4sCisJCQkJCSZzaHJpbmtlci0+bnJfaW5fYmF0Y2gpOworCQllbHNlCisJCQluZXdfbnIgPSBhdG9taWNfbG9uZ19yZWFkKCZzaHJpbmtlci0+bnJfaW5fYmF0Y2gpOwogCiAJCXRyYWNlX21tX3Nocmlua19zbGFiX2VuZChzaHJpbmtlciwgc2hyaW5rX3JldCwgbnIsIG5ld19ucik7CiAJfQpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW4uYyBiL25ldC84MDIxcS92bGFuLmMKaW5kZXggNTQ3MTYyOC4uZWZlYTM1YiAxMDA2NDQKLS0tIGEvbmV0LzgwMjFxL3ZsYW4uYworKysgYi9uZXQvODAyMXEvdmxhbi5jCkBAIC01MSwyNyArNTEsNiBAQAogCiAvKiBFbmQgb2YgZ2xvYmFsIHZhcmlhYmxlcyBkZWZpbml0aW9ucy4gKi8KIAotc3RhdGljIHZvaWQgdmxhbl9ncm91cF9mcmVlKHN0cnVjdCB2bGFuX2dyb3VwICpncnApCi17Ci0JaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgVkxBTl9HUk9VUF9BUlJBWV9TUExJVF9QQVJUUzsgaSsrKQotCQlrZnJlZShncnAtPnZsYW5fZGV2aWNlc19hcnJheXNbaV0pOwotCWtmcmVlKGdycCk7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgdmxhbl9ncm91cCAqdmxhbl9ncm91cF9hbGxvYyhzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYpCi17Ci0Jc3RydWN0IHZsYW5fZ3JvdXAgKmdycDsKLQotCWdycCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2bGFuX2dyb3VwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFncnApCi0JCXJldHVybiBOVUxMOwotCi0JZ3JwLT5yZWFsX2RldiA9IHJlYWxfZGV2OwotCXJldHVybiBncnA7Ci19Ci0KIHN0YXRpYyBpbnQgdmxhbl9ncm91cF9wcmVhbGxvY192aWQoc3RydWN0IHZsYW5fZ3JvdXAgKnZnLCB1MTYgdmxhbl9pZCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqKmFycmF5OwpAQCAtOTIsMzIgKzcxLDI5IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHZsYW5fcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpyY3UpCi17Ci0Jdmxhbl9ncm91cF9mcmVlKGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCB2bGFuX2dyb3VwLCByY3UpKTsKLX0KLQogdm9pZCB1bnJlZ2lzdGVyX3ZsYW5fZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCiB7Ci0Jc3RydWN0IHZsYW5fZGV2X2luZm8gKnZsYW4gPSB2bGFuX2Rldl9pbmZvKGRldik7CisJc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW4gPSB2bGFuX2Rldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbi0+cmVhbF9kZXY7Ci0JY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSByZWFsX2Rldi0+bmV0ZGV2X29wczsKKwlzdHJ1Y3Qgdmxhbl9pbmZvICp2bGFuX2luZm87CiAJc3RydWN0IHZsYW5fZ3JvdXAgKmdycDsKIAl1MTYgdmxhbl9pZCA9IHZsYW4tPnZsYW5faWQ7CiAKIAlBU1NFUlRfUlROTCgpOwogCi0JZ3JwID0gcnRubF9kZXJlZmVyZW5jZShyZWFsX2Rldi0+dmxncnApOwotCUJVR19PTighZ3JwKTsKKwl2bGFuX2luZm8gPSBydG5sX2RlcmVmZXJlbmNlKHJlYWxfZGV2LT52bGFuX2luZm8pOworCUJVR19PTighdmxhbl9pbmZvKTsKKworCWdycCA9ICZ2bGFuX2luZm8tPmdycDsKIAogCS8qIFRha2UgaXQgb3V0IG9mIG91ciBvd24gc3RydWN0dXJlcywgYnV0IGJlIHN1cmUgdG8gaW50ZXJsb2NrIHdpdGgKIAkgKiBIVyBhY2NlbGVyYXRpbmcgZGV2aWNlcyBvciBTVyB2bGFuIGlucHV0IHBhY2tldCBwcm9jZXNzaW5nIGlmCiAJICogVkxBTiBpcyBub3QgMCAobGVhdmUgaXQgdGhlcmUgZm9yIDgwMi4xcCkuCiAJICovCi0JaWYgKHZsYW5faWQgJiYgKHJlYWxfZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpKQotCQlvcHMtPm5kb192bGFuX3J4X2tpbGxfdmlkKHJlYWxfZGV2LCB2bGFuX2lkKTsKKwlpZiAodmxhbl9pZCkKKwkJdmxhbl92aWRfZGVsKHJlYWxfZGV2LCB2bGFuX2lkKTsKIAotCWdycC0+bnJfdmxhbnMtLTsKKwlncnAtPm5yX3ZsYW5fZGV2cy0tOwogCiAJaWYgKHZsYW4tPmZsYWdzICYgVkxBTl9GTEFHX0dWUlApCiAJCXZsYW5fZ3ZycF9yZXF1ZXN0X2xlYXZlKGRldik7CkBAIC0xMjksMTYgKzEwNSw5IEBACiAJICovCiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2VfcXVldWUoZGV2LCBoZWFkKTsKIAotCS8qIElmIHRoZSBncm91cCBpcyBub3cgZW1wdHksIGtpbGwgb2ZmIHRoZSBncm91cC4gKi8KLQlpZiAoZ3JwLT5ucl92bGFucyA9PSAwKSB7CisJaWYgKGdycC0+bnJfdmxhbl9kZXZzID09IDApCiAJCXZsYW5fZ3ZycF91bmluaXRfYXBwbGljYW50KHJlYWxfZGV2KTsKIAotCQlSQ1VfSU5JVF9QT0lOVEVSKHJlYWxfZGV2LT52bGdycCwgTlVMTCk7Ci0KLQkJLyogRnJlZSB0aGUgZ3JvdXAsIGFmdGVyIGFsbCBjcHUncyBhcmUgZG9uZS4gKi8KLQkJY2FsbF9yY3UoJmdycC0+cmN1LCB2bGFuX3JjdV9mcmVlKTsKLQl9Ci0KIAkvKiBHZXQgcmlkIG9mIHRoZSB2bGFuJ3MgcmVmZXJlbmNlIHRvIHJlYWxfZGV2ICovCiAJZGV2X3B1dChyZWFsX2Rldik7CiB9CkBAIC0xNjcsMjEgKzEzNiwyNiBAQAogCiBpbnQgcmVnaXN0ZXJfdmxhbl9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbiA9IHZsYW5fZGV2X2luZm8oZGV2KTsKKwlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuLT5yZWFsX2RldjsKLQljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IHJlYWxfZGV2LT5uZXRkZXZfb3BzOwogCXUxNiB2bGFuX2lkID0gdmxhbi0+dmxhbl9pZDsKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwLCAqbmdycCA9IE5VTEw7CisJc3RydWN0IHZsYW5faW5mbyAqdmxhbl9pbmZvOworCXN0cnVjdCB2bGFuX2dyb3VwICpncnA7CiAJaW50IGVycjsKIAotCWdycCA9IHJ0bmxfZGVyZWZlcmVuY2UocmVhbF9kZXYtPnZsZ3JwKTsKLQlpZiAoIWdycCkgewotCQluZ3JwID0gZ3JwID0gdmxhbl9ncm91cF9hbGxvYyhyZWFsX2Rldik7Ci0JCWlmICghZ3JwKQotCQkJcmV0dXJuIC1FTk9CVUZTOworCWVyciA9IHZsYW5fdmlkX2FkZChyZWFsX2Rldiwgdmxhbl9pZCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXZsYW5faW5mbyA9IHJ0bmxfZGVyZWZlcmVuY2UocmVhbF9kZXYtPnZsYW5faW5mbyk7CisJLyogdmxhbl9pbmZvIHNob3VsZCBiZSB0aGVyZSBub3cuIHZsYW5fdmlkX2FkZCB0b29rIGNhcmUgb2YgaXQgKi8KKwlCVUdfT04oIXZsYW5faW5mbyk7CisKKwlncnAgPSAmdmxhbl9pbmZvLT5ncnA7CisJaWYgKGdycC0+bnJfdmxhbl9kZXZzID09IDApIHsKIAkJZXJyID0gdmxhbl9ndnJwX2luaXRfYXBwbGljYW50KHJlYWxfZGV2KTsKIAkJaWYgKGVyciA8IDApCi0JCQlnb3RvIG91dF9mcmVlX2dyb3VwOworCQkJZ290byBvdXRfdmlkX2RlbDsKIAl9CiAKIAllcnIgPSB2bGFuX2dyb3VwX3ByZWFsbG9jX3ZpZChncnAsIHZsYW5faWQpOwpAQCAtMTkyLDcgKzE2Niw3IEBACiAJaWYgKGVyciA8IDApCiAJCWdvdG8gb3V0X3VuaW5pdF9hcHBsaWNhbnQ7CiAKLQkvKiBBY2NvdW50IGZvciByZWZlcmVuY2UgaW4gc3RydWN0IHZsYW5fZGV2X2luZm8gKi8KKwkvKiBBY2NvdW50IGZvciByZWZlcmVuY2UgaW4gc3RydWN0IHZsYW5fZGV2X3ByaXYgKi8KIAlkZXZfaG9sZChyZWFsX2Rldik7CiAKIAluZXRpZl9zdGFja2VkX3RyYW5zZmVyX29wZXJzdGF0ZShyZWFsX2RldiwgZGV2KTsKQEAgLTIwMiwyNCArMTc2LDE1IEBACiAJICogaXQgaW50byBvdXIgbG9jYWwgc3RydWN0dXJlLgogCSAqLwogCXZsYW5fZ3JvdXBfc2V0X2RldmljZShncnAsIHZsYW5faWQsIGRldik7Ci0JZ3JwLT5ucl92bGFucysrOwotCi0JaWYgKG5ncnApIHsKLQkJcmN1X2Fzc2lnbl9wb2ludGVyKHJlYWxfZGV2LT52bGdycCwgbmdycCk7Ci0JfQotCWlmIChyZWFsX2Rldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0hXX1ZMQU5fRklMVEVSKQotCQlvcHMtPm5kb192bGFuX3J4X2FkZF92aWQocmVhbF9kZXYsIHZsYW5faWQpOworCWdycC0+bnJfdmxhbl9kZXZzKys7CiAKIAlyZXR1cm4gMDsKIAogb3V0X3VuaW5pdF9hcHBsaWNhbnQ6Ci0JaWYgKG5ncnApCisJaWYgKGdycC0+bnJfdmxhbl9kZXZzID09IDApCiAJCXZsYW5fZ3ZycF91bmluaXRfYXBwbGljYW50KHJlYWxfZGV2KTsKLW91dF9mcmVlX2dyb3VwOgotCWlmIChuZ3JwKSB7Ci0JCS8qIEZyZWUgdGhlIGdyb3VwLCBhZnRlciBhbGwgY3B1J3MgYXJlIGRvbmUuICovCi0JCWNhbGxfcmN1KCZuZ3JwLT5yY3UsIHZsYW5fcmN1X2ZyZWUpOwotCX0KK291dF92aWRfZGVsOgorCXZsYW5fdmlkX2RlbChyZWFsX2Rldiwgdmxhbl9pZCk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtMjY3LDcgKzIzMiw3IEBACiAJCXNucHJpbnRmKG5hbWUsIElGTkFNU0laLCAidmxhbiUuNGkiLCB2bGFuX2lkKTsKIAl9CiAKLQluZXdfZGV2ID0gYWxsb2NfbmV0ZGV2KHNpemVvZihzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyksIG5hbWUsIHZsYW5fc2V0dXApOworCW5ld19kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCB2bGFuX2Rldl9wcml2KSwgbmFtZSwgdmxhbl9zZXR1cCk7CiAKIAlpZiAobmV3X2RldiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT0JVRlM7CkBAIC0yNzgsMTAgKzI0MywxMCBAQAogCSAqLwogCW5ld19kZXYtPm10dSA9IHJlYWxfZGV2LT5tdHU7CiAKLQl2bGFuX2Rldl9pbmZvKG5ld19kZXYpLT52bGFuX2lkID0gdmxhbl9pZDsKLQl2bGFuX2Rldl9pbmZvKG5ld19kZXYpLT5yZWFsX2RldiA9IHJlYWxfZGV2OwotCXZsYW5fZGV2X2luZm8obmV3X2RldiktPmRlbnQgPSBOVUxMOwotCXZsYW5fZGV2X2luZm8obmV3X2RldiktPmZsYWdzID0gVkxBTl9GTEFHX1JFT1JERVJfSERSOworCXZsYW5fZGV2X3ByaXYobmV3X2RldiktPnZsYW5faWQgPSB2bGFuX2lkOworCXZsYW5fZGV2X3ByaXYobmV3X2RldiktPnJlYWxfZGV2ID0gcmVhbF9kZXY7CisJdmxhbl9kZXZfcHJpdihuZXdfZGV2KS0+ZGVudCA9IE5VTEw7CisJdmxhbl9kZXZfcHJpdihuZXdfZGV2KS0+ZmxhZ3MgPSBWTEFOX0ZMQUdfUkVPUkRFUl9IRFI7CiAKIAluZXdfZGV2LT5ydG5sX2xpbmtfb3BzID0gJnZsYW5fbGlua19vcHM7CiAJZXJyID0gcmVnaXN0ZXJfdmxhbl9kZXYobmV3X2Rldik7CkBAIC0yOTgsNyArMjYzLDcgQEAKIHN0YXRpYyB2b2lkIHZsYW5fc3luY19hZGRyZXNzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbmRldikKIHsKLQlzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbiA9IHZsYW5fZGV2X2luZm8odmxhbmRldik7CisJc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW4gPSB2bGFuX2Rldl9wcml2KHZsYW5kZXYpOwogCiAJLyogTWF5IGJlIGNhbGxlZCB3aXRob3V0IGFuIGFjdHVhbCBjaGFuZ2UgKi8KIAlpZiAoIWNvbXBhcmVfZXRoZXJfYWRkcih2bGFuLT5yZWFsX2Rldl9hZGRyLCBkZXYtPmRldl9hZGRyKSkKQEAgLTM2MCwyNSArMzI1LDI2IEBACiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKIAlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwOworCXN0cnVjdCB2bGFuX2luZm8gKnZsYW5faW5mbzsKIAlpbnQgaSwgZmxnczsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbmRldjsKLQlzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbjsKKwlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbjsKIAlMSVNUX0hFQUQobGlzdCk7CiAKIAlpZiAoaXNfdmxhbl9kZXYoZGV2KSkKIAkJX192bGFuX2RldmljZV9ldmVudChkZXYsIGV2ZW50KTsKIAogCWlmICgoZXZlbnQgPT0gTkVUREVWX1VQKSAmJgotCSAgICAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpICYmCi0JICAgIGRldi0+bmV0ZGV2X29wcy0+bmRvX3ZsYW5fcnhfYWRkX3ZpZCkgeworCSAgICAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpKSB7CiAJCXByX2luZm8oImFkZGluZyBWTEFOIDAgdG8gSFcgZmlsdGVyIG9uIGRldmljZSAlc1xuIiwKIAkJCWRldi0+bmFtZSk7Ci0JCWRldi0+bmV0ZGV2X29wcy0+bmRvX3ZsYW5fcnhfYWRkX3ZpZChkZXYsIDApOworCQl2bGFuX3ZpZF9hZGQoZGV2LCAwKTsKIAl9CiAKLQlncnAgPSBydG5sX2RlcmVmZXJlbmNlKGRldi0+dmxncnApOwotCWlmICghZ3JwKQorCXZsYW5faW5mbyA9IHJ0bmxfZGVyZWZlcmVuY2UoZGV2LT52bGFuX2luZm8pOworCWlmICghdmxhbl9pbmZvKQogCQlnb3RvIG91dDsKKwlncnAgPSAmdmxhbl9pbmZvLT5ncnA7CiAKIAkvKiBJdCBpcyBPSyB0aGF0IHdlIGRvIG5vdCBob2xkIHRoZSBncm91cCBsb2NrIHJpZ2h0IG5vdywKIAkgKiBhcyB3ZSBydW4gdW5kZXIgdGhlIFJUTkwgbG9jay4KQEAgLTQ0Nyw3ICs0MTMsNyBAQAogCQkJaWYgKCEoZmxncyAmIElGRl9VUCkpCiAJCQkJY29udGludWU7CiAKLQkJCXZsYW4gPSB2bGFuX2Rldl9pbmZvKHZsYW5kZXYpOworCQkJdmxhbiA9IHZsYW5fZGV2X3ByaXYodmxhbmRldik7CiAJCQlpZiAoISh2bGFuLT5mbGFncyAmIFZMQU5fRkxBR19MT09TRV9CSU5ESU5HKSkKIAkJCQlkZXZfY2hhbmdlX2ZsYWdzKHZsYW5kZXYsIGZsZ3MgJiB+SUZGX1VQKTsKIAkJCW5ldGlmX3N0YWNrZWRfdHJhbnNmZXJfb3BlcnN0YXRlKGRldiwgdmxhbmRldik7CkBAIC00NjUsNyArNDMxLDcgQEAKIAkJCWlmIChmbGdzICYgSUZGX1VQKQogCQkJCWNvbnRpbnVlOwogCi0JCQl2bGFuID0gdmxhbl9kZXZfaW5mbyh2bGFuZGV2KTsKKwkJCXZsYW4gPSB2bGFuX2Rldl9wcml2KHZsYW5kZXYpOwogCQkJaWYgKCEodmxhbi0+ZmxhZ3MgJiBWTEFOX0ZMQUdfTE9PU0VfQklORElORykpCiAJCQkJZGV2X2NoYW5nZV9mbGFncyh2bGFuZGV2LCBmbGdzIHwgSUZGX1VQKTsKIAkJCW5ldGlmX3N0YWNrZWRfdHJhbnNmZXJfb3BlcnN0YXRlKGRldiwgdmxhbmRldik7CkBAIC00ODIsOSArNDQ4LDkgQEAKIAkJCWlmICghdmxhbmRldikKIAkJCQljb250aW51ZTsKIAotCQkJLyogdW5yZWdpc3RyYXRpb24gb2YgbGFzdCB2bGFuIGRlc3Ryb3lzIGdyb3VwLCBhYm9ydAorCQkJLyogcmVtb3ZhbCBvZiBsYXN0IHZpZCBkZXN0cm95cyB2bGFuX2luZm8sIGFib3J0CiAJCQkgKiBhZnRlcndhcmRzICovCi0JCQlpZiAoZ3JwLT5ucl92bGFucyA9PSAxKQorCQkJaWYgKHZsYW5faW5mby0+bnJfdmlkcyA9PSAxKQogCQkJCWkgPSBWTEFOX05fVklEOwogCiAJCQl1bnJlZ2lzdGVyX3ZsYW5fZGV2KHZsYW5kZXYsICZsaXN0KTsKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuLmggYi9uZXQvODAyMXEvdmxhbi5oCmluZGV4IDlmZDQ1ZjMuLmE0ODg2ZDkgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuLmgKKysrIGIvbmV0LzgwMjFxL3ZsYW4uaApAQCAtMyw2ICszLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KICNpbmNsdWRlIDxsaW51eC91NjRfc3RhdHNfc3luYy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIAogCiAvKioKQEAgLTQwLDggKzQxLDEwIEBACiAJdTMyCQkJdHhfZHJvcHBlZDsKIH07CiAKK3N0cnVjdCBuZXRwb2xsOworCiAvKioKLSAqCXN0cnVjdCB2bGFuX2Rldl9pbmZvIC0gVkxBTiBwcml2YXRlIGRldmljZSBkYXRhCisgKglzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAtIFZMQU4gcHJpdmF0ZSBkZXZpY2UgZGF0YQogICoJQG5yX2luZ3Jlc3NfbWFwcGluZ3M6IG51bWJlciBvZiBpbmdyZXNzIHByaW9yaXR5IG1hcHBpbmdzCiAgKglAaW5ncmVzc19wcmlvcml0eV9tYXA6IGluZ3Jlc3MgcHJpb3JpdHkgbWFwcGluZ3MKICAqCUBucl9lZ3Jlc3NfbWFwcGluZ3M6IG51bWJlciBvZiBlZ3Jlc3MgcHJpb3JpdHkgbWFwcGluZ3MKQEAgLTUzLDcgKzU2LDcgQEAKICAqCUBkZW50OiBwcm9jIGRpciBlbnRyeQogICoJQHZsYW5fcGNwdV9zdGF0czogcHRyIHRvIHBlcmNwdSByeCBzdGF0cwogICovCi1zdHJ1Y3Qgdmxhbl9kZXZfaW5mbyB7CitzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiB7CiAJdW5zaWduZWQgaW50CQkJCW5yX2luZ3Jlc3NfbWFwcGluZ3M7CiAJdTMyCQkJCQlpbmdyZXNzX3ByaW9yaXR5X21hcFs4XTsKIAl1bnNpZ25lZCBpbnQJCQkJbnJfZWdyZXNzX21hcHBpbmdzOwpAQCAtNjcsMTMgKzcwLDM5IEBACiAKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkJCQkqZGVudDsKIAlzdHJ1Y3Qgdmxhbl9wY3B1X3N0YXRzIF9fcGVyY3B1CQkqdmxhbl9wY3B1X3N0YXRzOworI2lmZGVmIENPTkZJR19ORVRfUE9MTF9DT05UUk9MTEVSCisJc3RydWN0IG5ldHBvbGwJCQkJKm5ldHBvbGw7CisjZW5kaWYKIH07CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHZsYW5fZGV2X2luZm8gKnZsYW5fZGV2X2luZm8oY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW5fZGV2X3ByaXYoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlyZXR1cm4gbmV0ZGV2X3ByaXYoZGV2KTsKIH0KIAorLyogaWYgdGhpcyBjaGFuZ2VzLCBhbGdvcml0aG0gd2lsbCBoYXZlIHRvIGJlIHJld29ya2VkIGJlY2F1c2UgdGhpcworICogZGVwZW5kcyBvbiBjb21wbGV0ZWx5IGV4aGF1c3RpbmcgdGhlIFZMQU4gaWRlbnRpZmllciBzcGFjZS4gIFRodXMKKyAqIGl0IGdpdmVzIGNvbnN0YW50IHRpbWUgbG9vay11cCwgYnV0IGluIG1hbnkgY2FzZXMgaXQgd2FzdGVzIG1lbW9yeS4KKyAqLworI2RlZmluZSBWTEFOX0dST1VQX0FSUkFZX1NQTElUX1BBUlRTICA4CisjZGVmaW5lIFZMQU5fR1JPVVBfQVJSQVlfUEFSVF9MRU4gICAgIChWTEFOX05fVklEL1ZMQU5fR1JPVVBfQVJSQVlfU1BMSVRfUEFSVFMpCisKK3N0cnVjdCB2bGFuX2dyb3VwIHsKKwl1bnNpZ25lZCBpbnQJCW5yX3ZsYW5fZGV2czsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQlobGlzdDsJLyogbGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3QgbmV0X2RldmljZSAqKnZsYW5fZGV2aWNlc19hcnJheXNbVkxBTl9HUk9VUF9BUlJBWV9TUExJVF9QQVJUU107Cit9OworCitzdHJ1Y3Qgdmxhbl9pbmZvIHsKKwlzdHJ1Y3QgbmV0X2RldmljZQkqcmVhbF9kZXY7IC8qIFRoZSBldGhlcm5ldChsaWtlKSBkZXZpY2UKKwkJCQkJICAgICogdGhlIHZsYW4gaXMgYXR0YWNoZWQgdG8uCisJCQkJCSAgICAqLworCXN0cnVjdCB2bGFuX2dyb3VwCWdycDsKKwlzdHJ1Y3QgbGlzdF9oZWFkCXZpZF9saXN0OworCXVuc2lnbmVkIGludAkJbnJfdmlkczsKKwlzdHJ1Y3QgcmN1X2hlYWQJCXJjdTsKK307CisKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5fZ3JvdXBfZ2V0X2RldmljZShzdHJ1Y3Qgdmxhbl9ncm91cCAqdmcsCiAJCQkJCQkgICAgICAgdTE2IHZsYW5faWQpCiB7CkBAIC05NywxMCArMTI2LDEwIEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2ZpbmRfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiwKIAkJCQkJICAgICAgIHUxNiB2bGFuX2lkKQogewotCXN0cnVjdCB2bGFuX2dyb3VwICpncnAgPSByY3VfZGVyZWZlcmVuY2VfcnRubChyZWFsX2Rldi0+dmxncnApOworCXN0cnVjdCB2bGFuX2luZm8gKnZsYW5faW5mbyA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKHJlYWxfZGV2LT52bGFuX2luZm8pOwogCi0JaWYgKGdycCkKLQkJcmV0dXJuIHZsYW5fZ3JvdXBfZ2V0X2RldmljZShncnAsIHZsYW5faWQpOworCWlmICh2bGFuX2luZm8pCisJCXJldHVybiB2bGFuX2dyb3VwX2dldF9kZXZpY2UoJnZsYW5faW5mby0+Z3JwLCB2bGFuX2lkKTsKIAogCXJldHVybiBOVUxMOwogfQpAQCAtMTIxLDcgKzE1MCw3IEBACiBzdGF0aWMgaW5saW5lIHUzMiB2bGFuX2dldF9pbmdyZXNzX3ByaW9yaXR5KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJCSAgICB1MTYgdmxhbl90Y2kpCiB7Ci0Jc3RydWN0IHZsYW5fZGV2X2luZm8gKnZpcCA9IHZsYW5fZGV2X2luZm8oZGV2KTsKKwlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmlwID0gdmxhbl9kZXZfcHJpdihkZXYpOwogCiAJcmV0dXJuIHZpcC0+aW5ncmVzc19wcmlvcml0eV9tYXBbKHZsYW5fdGNpID4+IFZMQU5fUFJJT19TSElGVCkgJiAweDddOwogfQpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fY29yZS5jIGIvbmV0LzgwMjFxL3ZsYW5fY29yZS5jCmluZGV4IGY1ZmZjMDIuLjRkMzlkODAgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFuX2NvcmUuYworKysgYi9uZXQvODAyMXEvdmxhbl9jb3JlLmMKQEAgLTM2LDcgKzM2LDcgQEAKIAkJCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKIAl9CiAKLQlpZiAoISh2bGFuX2Rldl9pbmZvKHZsYW5fZGV2KS0+ZmxhZ3MgJiBWTEFOX0ZMQUdfUkVPUkRFUl9IRFIpKSB7CisJaWYgKCEodmxhbl9kZXZfcHJpdih2bGFuX2RldiktPmZsYWdzICYgVkxBTl9GTEFHX1JFT1JERVJfSERSKSkgewogCQl1bnNpZ25lZCBpbnQgb2Zmc2V0ID0gc2tiLT5kYXRhIC0gc2tiX21hY19oZWFkZXIoc2tiKTsKIAogCQkvKgpAQCAtNTUsNyArNTUsNyBAQAogCXNrYi0+cHJpb3JpdHkgPSB2bGFuX2dldF9pbmdyZXNzX3ByaW9yaXR5KHZsYW5fZGV2LCBza2ItPnZsYW5fdGNpKTsKIAlza2ItPnZsYW5fdGNpID0gMDsKIAotCXJ4X3N0YXRzID0gdGhpc19jcHVfcHRyKHZsYW5fZGV2X2luZm8odmxhbl9kZXYpLT52bGFuX3BjcHVfc3RhdHMpOworCXJ4X3N0YXRzID0gdGhpc19jcHVfcHRyKHZsYW5fZGV2X3ByaXYodmxhbl9kZXYpLT52bGFuX3BjcHVfc3RhdHMpOwogCiAJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmcnhfc3RhdHMtPnN5bmNwKTsKIAlyeF9zdGF0cy0+cnhfcGFja2V0cysrOwpAQCAtNzEsMTAgKzcxLDEwIEBACiBzdHJ1Y3QgbmV0X2RldmljZSAqX192bGFuX2ZpbmRfZGV2X2RlZXAoc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2LAogCQkJCQl1MTYgdmxhbl9pZCkKIHsKLQlzdHJ1Y3Qgdmxhbl9ncm91cCAqZ3JwID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwocmVhbF9kZXYtPnZsZ3JwKTsKKwlzdHJ1Y3Qgdmxhbl9pbmZvICp2bGFuX2luZm8gPSByY3VfZGVyZWZlcmVuY2VfcnRubChyZWFsX2Rldi0+dmxhbl9pbmZvKTsKIAotCWlmIChncnApIHsKLQkJcmV0dXJuIHZsYW5fZ3JvdXBfZ2V0X2RldmljZShncnAsIHZsYW5faWQpOworCWlmICh2bGFuX2luZm8pIHsKKwkJcmV0dXJuIHZsYW5fZ3JvdXBfZ2V0X2RldmljZSgmdmxhbl9pbmZvLT5ncnAsIHZsYW5faWQpOwogCX0gZWxzZSB7CiAJCS8qCiAJCSAqIEJvbmRpbmcgc2xhdmVzIGRvIG5vdCBoYXZlIGdycCBhc3NpZ25lZCB0byB0aGVtc2VsdmVzLgpAQCAtOTAsMTMgKzkwLDEzIEBACiAKIHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2Rldl9yZWFsX2Rldihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXJldHVybiB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCXJldHVybiB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwogfQogRVhQT1JUX1NZTUJPTCh2bGFuX2Rldl9yZWFsX2Rldik7CiAKIHUxNiB2bGFuX2Rldl92bGFuX2lkKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JcmV0dXJuIHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9pZDsKKwlyZXR1cm4gdmxhbl9kZXZfcHJpdihkZXYpLT52bGFuX2lkOwogfQogRVhQT1JUX1NZTUJPTCh2bGFuX2Rldl92bGFuX2lkKTsKIApAQCAtMTEwLDM5ICsxMTAsNiBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyB2b2lkIHZsYW5fc2V0X2VuY2FwX3Byb3RvKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB2bGFuX2hkciAqdmhkcikKLXsKLQlfX2JlMTYgcHJvdG87Ci0JdW5zaWduZWQgY2hhciAqcmF3cDsKLQotCS8qCi0JICogV2FzIGEgVkxBTiBwYWNrZXQsIGdyYWIgdGhlIGVuY2Fwc3VsYXRlZCBwcm90b2NvbCwgd2hpY2ggdGhlIGxheWVyCi0JICogdGhyZWUgcHJvdG9jb2xzIGNhcmUgYWJvdXQuCi0JICovCi0KLQlwcm90byA9IHZoZHItPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87Ci0JaWYgKG50b2hzKHByb3RvKSA+PSAxNTM2KSB7Ci0JCXNrYi0+cHJvdG9jb2wgPSBwcm90bzsKLQkJcmV0dXJuOwotCX0KLQotCXJhd3AgPSBza2ItPmRhdGE7Ci0JaWYgKCoodW5zaWduZWQgc2hvcnQgKikgcmF3cCA9PSAweEZGRkYpCi0JCS8qCi0JCSAqIFRoaXMgaXMgYSBtYWdpYyBoYWNrIHRvIHNwb3QgSVBYIHBhY2tldHMuIE9sZGVyIE5vdmVsbAotCQkgKiBicmVha3MgdGhlIHByb3RvY29sIGRlc2lnbiBhbmQgcnVucyBJUFggb3ZlciA4MDIuMyB3aXRob3V0Ci0JCSAqIGFuIDgwMi4yIExMQyBsYXllci4gV2UgbG9vayBmb3IgRkZGRiB3aGljaCBpc24ndCBhIHVzZWQKLQkJICogODAyLjIgU1NBUC9EU0FQLiBUaGlzIHdvbid0IHdvcmsgZm9yIGZhdWx0IHRvbGVyYW50IG5ldHdhcmUKLQkJICogYnV0IGRvZXMgZm9yIHRoZSByZXN0LgotCQkgKi8KLQkJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8zKTsKLQllbHNlCi0JCS8qCi0JCSAqIFJlYWwgODAyLjIgTExDCi0JCSAqLwotCQlza2ItPnByb3RvY29sID0gaHRvbnMoRVRIX1BfODAyXzIpOwotfQotCiBzdHJ1Y3Qgc2tfYnVmZiAqdmxhbl91bnRhZyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCB2bGFuX2hkciAqdmhkcjsKQEAgLTE3OSwzICsxNDYsMjI2IEBACiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIE5VTEw7CiB9CisKKworLyoKKyAqIHZsYW4gaW5mbyBhbmQgdmlkIGxpc3QKKyAqLworCitzdGF0aWMgdm9pZCB2bGFuX2dyb3VwX2ZyZWUoc3RydWN0IHZsYW5fZ3JvdXAgKmdycCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBWTEFOX0dST1VQX0FSUkFZX1NQTElUX1BBUlRTOyBpKyspCisJCWtmcmVlKGdycC0+dmxhbl9kZXZpY2VzX2FycmF5c1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIHZsYW5faW5mb19mcmVlKHN0cnVjdCB2bGFuX2luZm8gKnZsYW5faW5mbykKK3sKKwl2bGFuX2dyb3VwX2ZyZWUoJnZsYW5faW5mby0+Z3JwKTsKKwlrZnJlZSh2bGFuX2luZm8pOworfQorCitzdGF0aWMgdm9pZCB2bGFuX2luZm9fcmN1X2ZyZWUoc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJdmxhbl9pbmZvX2ZyZWUoY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHZsYW5faW5mbywgcmN1KSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgdmxhbl9pbmZvICp2bGFuX2luZm9fYWxsb2Moc3RydWN0IG5ldF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qgdmxhbl9pbmZvICp2bGFuX2luZm87CisKKwl2bGFuX2luZm8gPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgdmxhbl9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2bGFuX2luZm8pCisJCXJldHVybiBOVUxMOworCisJdmxhbl9pbmZvLT5yZWFsX2RldiA9IGRldjsKKwlJTklUX0xJU1RfSEVBRCgmdmxhbl9pbmZvLT52aWRfbGlzdCk7CisJcmV0dXJuIHZsYW5faW5mbzsKK30KKworc3RydWN0IHZsYW5fdmlkX2luZm8geworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwl1bnNpZ25lZCBzaG9ydCB2aWQ7CisJaW50IHJlZmNvdW50OworfTsKKworc3RhdGljIHN0cnVjdCB2bGFuX3ZpZF9pbmZvICp2bGFuX3ZpZF9pbmZvX2dldChzdHJ1Y3Qgdmxhbl9pbmZvICp2bGFuX2luZm8sCisJCQkJCSAgICAgICB1bnNpZ25lZCBzaG9ydCB2aWQpCit7CisJc3RydWN0IHZsYW5fdmlkX2luZm8gKnZpZF9pbmZvOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2aWRfaW5mbywgJnZsYW5faW5mby0+dmlkX2xpc3QsIGxpc3QpIHsKKwkJaWYgKHZpZF9pbmZvLT52aWQgPT0gdmlkKQorCQkJcmV0dXJuIHZpZF9pbmZvOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB2bGFuX3ZpZF9pbmZvICp2bGFuX3ZpZF9pbmZvX2FsbG9jKHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3Qgdmxhbl92aWRfaW5mbyAqdmlkX2luZm87CisKKwl2aWRfaW5mbyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB2bGFuX3ZpZF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2aWRfaW5mbykKKwkJcmV0dXJuIE5VTEw7CisJdmlkX2luZm8tPnZpZCA9IHZpZDsKKworCXJldHVybiB2aWRfaW5mbzsKK30KKworc3RhdGljIGludCBfX3ZsYW5fdmlkX2FkZChzdHJ1Y3Qgdmxhbl9pbmZvICp2bGFuX2luZm8sIHVuc2lnbmVkIHNob3J0IHZpZCwKKwkJCSAgc3RydWN0IHZsYW5fdmlkX2luZm8gKipwdmlkX2luZm8pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHZsYW5faW5mby0+cmVhbF9kZXY7CisJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSBkZXYtPm5ldGRldl9vcHM7CisJc3RydWN0IHZsYW5fdmlkX2luZm8gKnZpZF9pbmZvOworCWludCBlcnI7CisKKwl2aWRfaW5mbyA9IHZsYW5fdmlkX2luZm9fYWxsb2ModmlkKTsKKwlpZiAoIXZpZF9pbmZvKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpICYmCisJICAgIG9wcy0+bmRvX3ZsYW5fcnhfYWRkX3ZpZCkgeworCQllcnIgPSAgb3BzLT5uZG9fdmxhbl9yeF9hZGRfdmlkKGRldiwgdmlkKTsKKwkJaWYgKGVycikgeworCQkJa2ZyZWUodmlkX2luZm8pOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwlsaXN0X2FkZCgmdmlkX2luZm8tPmxpc3QsICZ2bGFuX2luZm8tPnZpZF9saXN0KTsKKwl2bGFuX2luZm8tPm5yX3ZpZHMrKzsKKwkqcHZpZF9pbmZvID0gdmlkX2luZm87CisJcmV0dXJuIDA7Cit9CisKK2ludCB2bGFuX3ZpZF9hZGQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgc2hvcnQgdmlkKQoreworCXN0cnVjdCB2bGFuX2luZm8gKnZsYW5faW5mbzsKKwlzdHJ1Y3Qgdmxhbl92aWRfaW5mbyAqdmlkX2luZm87CisJYm9vbCB2bGFuX2luZm9fY3JlYXRlZCA9IGZhbHNlOworCWludCBlcnI7CisKKwlBU1NFUlRfUlROTCgpOworCisJdmxhbl9pbmZvID0gcnRubF9kZXJlZmVyZW5jZShkZXYtPnZsYW5faW5mbyk7CisJaWYgKCF2bGFuX2luZm8pIHsKKwkJdmxhbl9pbmZvID0gdmxhbl9pbmZvX2FsbG9jKGRldik7CisJCWlmICghdmxhbl9pbmZvKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCXZsYW5faW5mb19jcmVhdGVkID0gdHJ1ZTsKKwl9CisJdmlkX2luZm8gPSB2bGFuX3ZpZF9pbmZvX2dldCh2bGFuX2luZm8sIHZpZCk7CisJaWYgKCF2aWRfaW5mbykgeworCQllcnIgPSBfX3ZsYW5fdmlkX2FkZCh2bGFuX2luZm8sIHZpZCwgJnZpZF9pbmZvKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2ZyZWVfdmxhbl9pbmZvOworCX0KKwl2aWRfaW5mby0+cmVmY291bnQrKzsKKworCWlmICh2bGFuX2luZm9fY3JlYXRlZCkKKwkJcmN1X2Fzc2lnbl9wb2ludGVyKGRldi0+dmxhbl9pbmZvLCB2bGFuX2luZm8pOworCisJcmV0dXJuIDA7CisKK291dF9mcmVlX3ZsYW5faW5mbzoKKwlpZiAodmxhbl9pbmZvX2NyZWF0ZWQpCisJCWtmcmVlKHZsYW5faW5mbyk7CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0wodmxhbl92aWRfYWRkKTsKKworc3RhdGljIHZvaWQgX192bGFuX3ZpZF9kZWwoc3RydWN0IHZsYW5faW5mbyAqdmxhbl9pbmZvLAorCQkJICAgc3RydWN0IHZsYW5fdmlkX2luZm8gKnZpZF9pbmZvKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSB2bGFuX2luZm8tPnJlYWxfZGV2OworCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gZGV2LT5uZXRkZXZfb3BzOworCXVuc2lnbmVkIHNob3J0IHZpZCA9IHZpZF9pbmZvLT52aWQ7CisJaW50IGVycjsKKworCWlmICgoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIpICYmCisJICAgICBvcHMtPm5kb192bGFuX3J4X2tpbGxfdmlkKSB7CisJCWVyciA9IG9wcy0+bmRvX3ZsYW5fcnhfa2lsbF92aWQoZGV2LCB2aWQpOworCQlpZiAoZXJyKSB7CisJCQlwcl93YXJuKCJmYWlsZWQgdG8ga2lsbCB2aWQgJWQgZm9yIGRldmljZSAlc1xuIiwKKwkJCQl2aWQsIGRldi0+bmFtZSk7CisJCX0KKwl9CisJbGlzdF9kZWwoJnZpZF9pbmZvLT5saXN0KTsKKwlrZnJlZSh2aWRfaW5mbyk7CisJdmxhbl9pbmZvLT5ucl92aWRzLS07Cit9CisKK3ZvaWQgdmxhbl92aWRfZGVsKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHVuc2lnbmVkIHNob3J0IHZpZCkKK3sKKwlzdHJ1Y3Qgdmxhbl9pbmZvICp2bGFuX2luZm87CisJc3RydWN0IHZsYW5fdmlkX2luZm8gKnZpZF9pbmZvOworCisJQVNTRVJUX1JUTkwoKTsKKworCXZsYW5faW5mbyA9IHJ0bmxfZGVyZWZlcmVuY2UoZGV2LT52bGFuX2luZm8pOworCWlmICghdmxhbl9pbmZvKQorCQlyZXR1cm47CisKKwl2aWRfaW5mbyA9IHZsYW5fdmlkX2luZm9fZ2V0KHZsYW5faW5mbywgdmlkKTsKKwlpZiAoIXZpZF9pbmZvKQorCQlyZXR1cm47CisJdmlkX2luZm8tPnJlZmNvdW50LS07CisJaWYgKHZpZF9pbmZvLT5yZWZjb3VudCA9PSAwKSB7CisJCV9fdmxhbl92aWRfZGVsKHZsYW5faW5mbywgdmlkX2luZm8pOworCQlpZiAodmxhbl9pbmZvLT5ucl92aWRzID09IDApIHsKKwkJCVJDVV9JTklUX1BPSU5URVIoZGV2LT52bGFuX2luZm8sIE5VTEwpOworCQkJY2FsbF9yY3UoJnZsYW5faW5mby0+cmN1LCB2bGFuX2luZm9fcmN1X2ZyZWUpOworCQl9CisJfQorfQorRVhQT1JUX1NZTUJPTCh2bGFuX3ZpZF9kZWwpOworCitpbnQgdmxhbl92aWRzX2FkZF9ieV9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqYnlfZGV2KQoreworCXN0cnVjdCB2bGFuX3ZpZF9pbmZvICp2aWRfaW5mbzsKKwlzdHJ1Y3Qgdmxhbl9pbmZvICp2bGFuX2luZm87CisJaW50IGVycjsKKworCUFTU0VSVF9SVE5MKCk7CisKKwl2bGFuX2luZm8gPSBydG5sX2RlcmVmZXJlbmNlKGJ5X2Rldi0+dmxhbl9pbmZvKTsKKwlpZiAoIXZsYW5faW5mbykKKwkJcmV0dXJuIDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHZpZF9pbmZvLCAmdmxhbl9pbmZvLT52aWRfbGlzdCwgbGlzdCkgeworCQllcnIgPSB2bGFuX3ZpZF9hZGQoZGV2LCB2aWRfaW5mby0+dmlkKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gdW53aW5kOworCX0KKwlyZXR1cm4gMDsKKwordW53aW5kOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWVfcmV2ZXJzZSh2aWRfaW5mbywKKwkJCQkJICAgICAmdmxhbl9pbmZvLT52aWRfbGlzdCwKKwkJCQkJICAgICBsaXN0KSB7CisJCXZsYW5fdmlkX2RlbChkZXYsIHZpZF9pbmZvLT52aWQpOworCX0KKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MKHZsYW5fdmlkc19hZGRfYnlfZGV2KTsKKwordm9pZCB2bGFuX3ZpZHNfZGVsX2J5X2RldihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqYnlfZGV2KQoreworCXN0cnVjdCB2bGFuX3ZpZF9pbmZvICp2aWRfaW5mbzsKKwlzdHJ1Y3Qgdmxhbl9pbmZvICp2bGFuX2luZm87CisKKwlBU1NFUlRfUlROTCgpOworCisJdmxhbl9pbmZvID0gcnRubF9kZXJlZmVyZW5jZShieV9kZXYtPnZsYW5faW5mbyk7CisJaWYgKCF2bGFuX2luZm8pCisJCXJldHVybjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkodmlkX2luZm8sICZ2bGFuX2luZm8tPnZpZF9saXN0LCBsaXN0KQorCQl2bGFuX3ZpZF9kZWwoZGV2LCB2aWRfaW5mby0+dmlkKTsKK30KK0VYUE9SVF9TWU1CT0wodmxhbl92aWRzX2RlbF9ieV9kZXYpOwpkaWZmIC0tZ2l0IGEvbmV0LzgwMjFxL3ZsYW5fZGV2LmMgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwppbmRleCBiYzI1Mjg2Li45OTg4ZDRhIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9kZXYuYworKysgYi9uZXQvODAyMXEvdmxhbl9kZXYuYwpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgInZsYW4uaCIKICNpbmNsdWRlICJ2bGFucHJvYy5oIgogI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRwb2xsLmg+CiAKIC8qCiAgKglSZWJ1aWxkIHRoZSBFdGhlcm5ldCBNQUMgaGVhZGVyLiBUaGlzIGlzIGNhbGxlZCBhZnRlciBhbiBBUlAKQEAgLTcyLDcgKzczLDcgQEAKIHsKIAlzdHJ1Y3Qgdmxhbl9wcmlvcml0eV90Y2lfbWFwcGluZyAqbXA7CiAKLQltcCA9IHZsYW5fZGV2X2luZm8oZGV2KS0+ZWdyZXNzX3ByaW9yaXR5X21hcFsoc2tiLT5wcmlvcml0eSAmIDB4RildOworCW1wID0gdmxhbl9kZXZfcHJpdihkZXYpLT5lZ3Jlc3NfcHJpb3JpdHlfbWFwWyhza2ItPnByaW9yaXR5ICYgMHhGKV07CiAJd2hpbGUgKG1wKSB7CiAJCWlmIChtcC0+cHJpb3JpdHkgPT0gc2tiLT5wcmlvcml0eSkgewogCQkJcmV0dXJuIG1wLT52bGFuX3FvczsgLyogVGhpcyBzaG91bGQgYWxyZWFkeSBiZSBzaGlmdGVkCkBAIC0xMDMsMTAgKzEwNCwxMCBAQAogCXUxNiB2bGFuX3RjaSA9IDA7CiAJaW50IHJjOwogCi0JaWYgKCEodmxhbl9kZXZfaW5mbyhkZXYpLT5mbGFncyAmIFZMQU5fRkxBR19SRU9SREVSX0hEUikpIHsKKwlpZiAoISh2bGFuX2Rldl9wcml2KGRldiktPmZsYWdzICYgVkxBTl9GTEFHX1JFT1JERVJfSERSKSkgewogCQl2aGRyID0gKHN0cnVjdCB2bGFuX2hkciAqKSBza2JfcHVzaChza2IsIFZMQU5fSExFTik7CiAKLQkJdmxhbl90Y2kgPSB2bGFuX2Rldl9pbmZvKGRldiktPnZsYW5faWQ7CisJCXZsYW5fdGNpID0gdmxhbl9kZXZfcHJpdihkZXYpLT52bGFuX2lkOwogCQl2bGFuX3RjaSB8PSB2bGFuX2Rldl9nZXRfZWdyZXNzX3Fvc19tYXNrKGRldiwgc2tiKTsKIAkJdmhkci0+aF92bGFuX1RDSSA9IGh0b25zKHZsYW5fdGNpKTsKIApAQCAtMTI5LDcgKzEzMCw3IEBACiAJCXNhZGRyID0gZGV2LT5kZXZfYWRkcjsKIAogCS8qIE5vdyBtYWtlIHRoZSB1bmRlcmx5aW5nIHJlYWwgaGFyZCBoZWFkZXIgKi8KLQlkZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCWRldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7CiAJcmMgPSBkZXZfaGFyZF9oZWFkZXIoc2tiLCBkZXYsIHR5cGUsIGRhZGRyLCBzYWRkciwgbGVuICsgdmhkcmxlbik7CiAJaWYgKHJjID4gMCkKIAkJcmMgKz0gdmhkcmxlbjsKQEAgLTE0OSwyNyArMTUwLDI5IEBACiAJICogT1RIRVIgVEhJTkdTIExJS0UgRkRESS9Ub2tlblJpbmcvODAyLjMgU05BUHMuLi4KIAkgKi8KIAlpZiAodmV0aC0+aF92bGFuX3Byb3RvICE9IGh0b25zKEVUSF9QXzgwMjFRKSB8fAotCSAgICB2bGFuX2Rldl9pbmZvKGRldiktPmZsYWdzICYgVkxBTl9GTEFHX1JFT1JERVJfSERSKSB7CisJICAgIHZsYW5fZGV2X3ByaXYoZGV2KS0+ZmxhZ3MgJiBWTEFOX0ZMQUdfUkVPUkRFUl9IRFIpIHsKIAkJdTE2IHZsYW5fdGNpOwotCQl2bGFuX3RjaSA9IHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9pZDsKKwkJdmxhbl90Y2kgPSB2bGFuX2Rldl9wcml2KGRldiktPnZsYW5faWQ7CiAJCXZsYW5fdGNpIHw9IHZsYW5fZGV2X2dldF9lZ3Jlc3NfcW9zX21hc2soZGV2LCBza2IpOwogCQlza2IgPSBfX3ZsYW5faHdhY2NlbF9wdXRfdGFnKHNrYiwgdmxhbl90Y2kpOwogCX0KIAotCXNrYl9zZXRfZGV2KHNrYiwgdmxhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2Rldik7CisJc2tiX3NldF9kZXYoc2tiLCB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2KTsKIAlsZW4gPSBza2ItPmxlbjsKKwlpZiAobmV0cG9sbF90eF9ydW5uaW5nKGRldikpCisJCXJldHVybiBza2ItPmRldi0+bmV0ZGV2X29wcy0+bmRvX3N0YXJ0X3htaXQoc2tiLCBza2ItPmRldik7CiAJcmV0ID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKIAogCWlmIChsaWtlbHkocmV0ID09IE5FVF9YTUlUX1NVQ0NFU1MgfHwgcmV0ID09IE5FVF9YTUlUX0NOKSkgewogCQlzdHJ1Y3Qgdmxhbl9wY3B1X3N0YXRzICpzdGF0czsKIAotCQlzdGF0cyA9IHRoaXNfY3B1X3B0cih2bGFuX2Rldl9pbmZvKGRldiktPnZsYW5fcGNwdV9zdGF0cyk7CisJCXN0YXRzID0gdGhpc19jcHVfcHRyKHZsYW5fZGV2X3ByaXYoZGV2KS0+dmxhbl9wY3B1X3N0YXRzKTsKIAkJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmc3RhdHMtPnN5bmNwKTsKIAkJc3RhdHMtPnR4X3BhY2tldHMrKzsKIAkJc3RhdHMtPnR4X2J5dGVzICs9IGxlbjsKIAkJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnN0YXRzLT5zeW5jcCk7CiAJfSBlbHNlIHsKLQkJdGhpc19jcHVfaW5jKHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9wY3B1X3N0YXRzLT50eF9kcm9wcGVkKTsKKwkJdGhpc19jcHVfaW5jKHZsYW5fZGV2X3ByaXYoZGV2KS0+dmxhbl9wY3B1X3N0YXRzLT50eF9kcm9wcGVkKTsKIAl9CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTgwLDcgKzE4Myw3IEBACiAJLyogVE9ETzogZ290dGEgbWFrZSBzdXJlIHRoZSB1bmRlcmx5aW5nIGxheWVyIGNhbiBoYW5kbGUgaXQsCiAJICogbWF5YmUgYW4gSUZGX1ZMQU5fQ0FQQUJMRSBmbGFnIGZvciBkZXZpY2VzPwogCSAqLwotCWlmICh2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2LT5tdHUgPCBuZXdfbXR1KQorCWlmICh2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2LT5tdHUgPCBuZXdfbXR1KQogCQlyZXR1cm4gLUVSQU5HRTsKIAogCWRldi0+bXR1ID0gbmV3X210dTsKQEAgLTE5MSw3ICsxOTQsNyBAQAogdm9pZCB2bGFuX2Rldl9zZXRfaW5ncmVzc19wcmlvcml0eShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSAgIHUzMiBza2JfcHJpbywgdTE2IHZsYW5fcHJpbykKIHsKLQlzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbiA9IHZsYW5fZGV2X2luZm8oZGV2KTsKKwlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKIAogCWlmICh2bGFuLT5pbmdyZXNzX3ByaW9yaXR5X21hcFt2bGFuX3ByaW8gJiAweDddICYmICFza2JfcHJpbykKIAkJdmxhbi0+bnJfaW5ncmVzc19tYXBwaW5ncy0tOwpAQCAtMjA0LDcgKzIwNyw3IEBACiBpbnQgdmxhbl9kZXZfc2V0X2VncmVzc19wcmlvcml0eShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCSB1MzIgc2tiX3ByaW8sIHUxNiB2bGFuX3ByaW8pCiB7Ci0Jc3RydWN0IHZsYW5fZGV2X2luZm8gKnZsYW4gPSB2bGFuX2Rldl9pbmZvKGRldik7CisJc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW4gPSB2bGFuX2Rldl9wcml2KGRldik7CiAJc3RydWN0IHZsYW5fcHJpb3JpdHlfdGNpX21hcHBpbmcgKm1wID0gTlVMTDsKIAlzdHJ1Y3Qgdmxhbl9wcmlvcml0eV90Y2lfbWFwcGluZyAqbnA7CiAJdTMyIHZsYW5fcW9zID0gKHZsYW5fcHJpbyA8PCBWTEFOX1BSSU9fU0hJRlQpICYgVkxBTl9QUklPX01BU0s7CkBAIC0yNDEsNyArMjQ0LDcgQEAKIC8qIEZsYWdzIGFyZSBkZWZpbmVkIGluIHRoZSB2bGFuX2ZsYWdzIGVudW0gaW4gaW5jbHVkZS9saW51eC9pZl92bGFuLmggZmlsZS4gKi8KIGludCB2bGFuX2Rldl9jaGFuZ2VfZmxhZ3MoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGZsYWdzLCB1MzIgbWFzaykKIHsKLQlzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbiA9IHZsYW5fZGV2X2luZm8oZGV2KTsKKwlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKIAl1MzIgb2xkX2ZsYWdzID0gdmxhbi0+ZmxhZ3M7CiAKIAlpZiAobWFzayAmIH4oVkxBTl9GTEFHX1JFT1JERVJfSERSIHwgVkxBTl9GTEFHX0dWUlAgfApAQCAtMjYxLDEyICsyNjQsMTIgQEAKIAogdm9pZCB2bGFuX2Rldl9nZXRfcmVhbGRldl9uYW1lKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNoYXIgKnJlc3VsdCkKIHsKLQlzdHJuY3B5KHJlc3VsdCwgdmxhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2Rldi0+bmFtZSwgMjMpOworCXN0cm5jcHkocmVzdWx0LCB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2LT5uYW1lLCAyMyk7CiB9CiAKIHN0YXRpYyBpbnQgdmxhbl9kZXZfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXN0cnVjdCB2bGFuX2Rldl9pbmZvICp2bGFuID0gdmxhbl9kZXZfaW5mbyhkZXYpOworCXN0cnVjdCB2bGFuX2Rldl9wcml2ICp2bGFuID0gdmxhbl9kZXZfcHJpdihkZXYpOwogCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW4tPnJlYWxfZGV2OwogCWludCBlcnI7CiAKQEAgLTMxMyw3ICszMTYsNyBAQAogCiBzdGF0aWMgaW50IHZsYW5fZGV2X3N0b3Aoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbiA9IHZsYW5fZGV2X2luZm8oZGV2KTsKKwlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuLT5yZWFsX2RldjsKIAogCWRldl9tY191bnN5bmMocmVhbF9kZXYsIGRldik7CkBAIC0zMzIsNyArMzM1LDcgQEAKIAogc3RhdGljIGludCB2bGFuX2Rldl9zZXRfbWFjX2FkZHJlc3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdm9pZCAqcCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7CiAJc3RydWN0IHNvY2thZGRyICphZGRyID0gcDsKIAlpbnQgZXJyOwogCkBAIC0zNTgsNyArMzYxLDcgQEAKIAogc3RhdGljIGludCB2bGFuX2Rldl9pb2N0bChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKmlmciwgaW50IGNtZCkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSByZWFsX2Rldi0+bmV0ZGV2X29wczsKIAlzdHJ1Y3QgaWZyZXEgaWZycjsKIAlpbnQgZXJyID0gLUVPUE5PVFNVUFA7CkBAIC0zODMsNyArMzg2LDcgQEAKIAogc3RhdGljIGludCB2bGFuX2Rldl9uZWlnaF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgbmVpZ2hfcGFybXMgKnBhKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X2luZm8oZGV2KS0+cmVhbF9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfcHJpdihkZXYpLT5yZWFsX2RldjsKIAljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IHJlYWxfZGV2LT5uZXRkZXZfb3BzOwogCWludCBlcnIgPSAwOwogCkBAIC0zOTcsNyArNDAwLDcgQEAKIHN0YXRpYyBpbnQgdmxhbl9kZXZfZmNvZV9kZHBfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHhpZCwKIAkJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnbCwgdW5zaWduZWQgaW50IHNnYykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSByZWFsX2Rldi0+bmV0ZGV2X29wczsKIAlpbnQgcmMgPSAwOwogCkBAIC00MDksNyArNDEyLDcgQEAKIAogc3RhdGljIGludCB2bGFuX2Rldl9mY29lX2RkcF9kb25lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB4aWQpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gcmVhbF9kZXYtPm5ldGRldl9vcHM7CiAJaW50IGxlbiA9IDA7CiAKQEAgLTQyMSw3ICs0MjQsNyBAQAogCiBzdGF0aWMgaW50IHZsYW5fZGV2X2Zjb2VfZW5hYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gcmVhbF9kZXYtPm5ldGRldl9vcHM7CiAJaW50IHJjID0gLUVJTlZBTDsKIApAQCAtNDMyLDcgKzQzNSw3IEBACiAKIHN0YXRpYyBpbnQgdmxhbl9kZXZfZmNvZV9kaXNhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9wcml2KGRldiktPnJlYWxfZGV2OwogCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyAqb3BzID0gcmVhbF9kZXYtPm5ldGRldl9vcHM7CiAJaW50IHJjID0gLUVJTlZBTDsKIApAQCAtNDQzLDcgKzQ0Niw3IEBACiAKIHN0YXRpYyBpbnQgdmxhbl9kZXZfZmNvZV9nZXRfd3duKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU2NCAqd3duLCBpbnQgdHlwZSkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7CiAJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2Vfb3BzICpvcHMgPSByZWFsX2Rldi0+bmV0ZGV2X29wczsKIAlpbnQgcmMgPSAtRUlOVkFMOwogCkBAIC00NTUsNyArNDU4LDcgQEAKIHN0YXRpYyBpbnQgdmxhbl9kZXZfZmNvZV9kZHBfdGFyZ2V0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUxNiB4aWQsCiAJCQkJICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCB1bnNpZ25lZCBpbnQgc2djKQogewotCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X2luZm8oZGV2KS0+cmVhbF9kZXY7CisJc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2ID0gdmxhbl9kZXZfcHJpdihkZXYpLT5yZWFsX2RldjsKIAljb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgKm9wcyA9IHJlYWxfZGV2LT5uZXRkZXZfb3BzOwogCWludCByYyA9IDA7CiAKQEAgLTQ2OCw3ICs0NzEsNyBAQAogCiBzdGF0aWMgdm9pZCB2bGFuX2Rldl9jaGFuZ2VfcnhfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGNoYW5nZSkKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7CiAKIAlpZiAoZGV2LT5mbGFncyAmIElGRl9VUCkgewogCQlpZiAoY2hhbmdlICYgSUZGX0FMTE1VTFRJKQpAQCAtNDgwLDggKzQ4Myw4IEBACiAKIHN0YXRpYyB2b2lkIHZsYW5fZGV2X3NldF9yeF9tb2RlKHN0cnVjdCBuZXRfZGV2aWNlICp2bGFuX2RldikKIHsKLQlkZXZfbWNfc3luYyh2bGFuX2Rldl9pbmZvKHZsYW5fZGV2KS0+cmVhbF9kZXYsIHZsYW5fZGV2KTsKLQlkZXZfdWNfc3luYyh2bGFuX2Rldl9pbmZvKHZsYW5fZGV2KS0+cmVhbF9kZXYsIHZsYW5fZGV2KTsKKwlkZXZfbWNfc3luYyh2bGFuX2Rldl9wcml2KHZsYW5fZGV2KS0+cmVhbF9kZXYsIHZsYW5fZGV2KTsKKwlkZXZfdWNfc3luYyh2bGFuX2Rldl9wcml2KHZsYW5fZGV2KS0+cmVhbF9kZXYsIHZsYW5fZGV2KTsKIH0KIAogLyoKQEAgLTUxOSw3ICs1MjIsNyBAQAogCiBzdGF0aWMgaW50IHZsYW5fZGV2X2luaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7CiAJaW50IHN1YmNsYXNzID0gMDsKIAogCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CkBAIC01NjgsOCArNTcxLDggQEAKIAogCXZsYW5fZGV2X3NldF9sb2NrZGVwX2NsYXNzKGRldiwgc3ViY2xhc3MpOwogCi0Jdmxhbl9kZXZfaW5mbyhkZXYpLT52bGFuX3BjcHVfc3RhdHMgPSBhbGxvY19wZXJjcHUoc3RydWN0IHZsYW5fcGNwdV9zdGF0cyk7Ci0JaWYgKCF2bGFuX2Rldl9pbmZvKGRldiktPnZsYW5fcGNwdV9zdGF0cykKKwl2bGFuX2Rldl9wcml2KGRldiktPnZsYW5fcGNwdV9zdGF0cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgdmxhbl9wY3B1X3N0YXRzKTsKKwlpZiAoIXZsYW5fZGV2X3ByaXYoZGV2KS0+dmxhbl9wY3B1X3N0YXRzKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXJldHVybiAwOwpAQCAtNTc4LDcgKzU4MSw3IEBACiBzdGF0aWMgdm9pZCB2bGFuX2Rldl91bmluaXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3Qgdmxhbl9wcmlvcml0eV90Y2lfbWFwcGluZyAqcG07Ci0Jc3RydWN0IHZsYW5fZGV2X2luZm8gKnZsYW4gPSB2bGFuX2Rldl9pbmZvKGRldik7CisJc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW4gPSB2bGFuX2Rldl9wcml2KGRldik7CiAJaW50IGk7CiAKIAlmcmVlX3BlcmNwdSh2bGFuLT52bGFuX3BjcHVfc3RhdHMpOwpAQCAtNTkxLDE4ICs1OTQsMTcgQEAKIAl9CiB9CiAKLXN0YXRpYyB1MzIgdmxhbl9kZXZfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCB2bGFuX2Rldl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKLQlzdHJ1Y3QgbmV0X2RldmljZSAqcmVhbF9kZXYgPSB2bGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IHZsYW5fZGV2X3ByaXYoZGV2KS0+cmVhbF9kZXY7CiAJdTMyIG9sZF9mZWF0dXJlcyA9IGZlYXR1cmVzOwogCi0JZmVhdHVyZXMgJj0gcmVhbF9kZXYtPmZlYXR1cmVzOwogCWZlYXR1cmVzICY9IHJlYWxfZGV2LT52bGFuX2ZlYXR1cmVzOworCWZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNOworCWZlYXR1cmVzICY9IHJlYWxfZGV2LT5mZWF0dXJlczsKIAogCWZlYXR1cmVzIHw9IG9sZF9mZWF0dXJlcyAmIE5FVElGX0ZfU09GVF9GRUFUVVJFUzsKLQotCWlmIChkZXZfZXRodG9vbF9nZXRfcnhfY3N1bShyZWFsX2RldikpCi0JCWZlYXR1cmVzIHw9IE5FVElGX0ZfUlhDU1VNOwogCWZlYXR1cmVzIHw9IE5FVElGX0ZfTExUWDsKIAogCXJldHVybiBmZWF0dXJlczsKQEAgLTYxMSw3ICs2MTMsNyBAQAogc3RhdGljIGludCB2bGFuX2V0aHRvb2xfZ2V0X3NldHRpbmdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICAgICBzdHJ1Y3QgZXRodG9vbF9jbWQgKmNtZCkKIHsKLQljb25zdCBzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbiA9IHZsYW5fZGV2X2luZm8oZGV2KTsKKwljb25zdCBzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKIAogCXJldHVybiBfX2V0aHRvb2xfZ2V0X3NldHRpbmdzKHZsYW4tPnJlYWxfZGV2LCBjbWQpOwogfQpAQCAtNjI3LDcgKzYyOSw3IEBACiBzdGF0aWMgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICp2bGFuX2Rldl9nZXRfc3RhdHM2NChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQogewogCi0JaWYgKHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9wY3B1X3N0YXRzKSB7CisJaWYgKHZsYW5fZGV2X3ByaXYoZGV2KS0+dmxhbl9wY3B1X3N0YXRzKSB7CiAJCXN0cnVjdCB2bGFuX3BjcHVfc3RhdHMgKnA7CiAJCXUzMiByeF9lcnJvcnMgPSAwLCB0eF9kcm9wcGVkID0gMDsKIAkJaW50IGk7CkBAIC02MzYsNyArNjM4LDcgQEAKIAkJCXU2NCByeHBhY2tldHMsIHJ4Ynl0ZXMsIHJ4bXVsdGljYXN0LCB0eHBhY2tldHMsIHR4Ynl0ZXM7CiAJCQl1bnNpZ25lZCBpbnQgc3RhcnQ7CiAKLQkJCXAgPSBwZXJfY3B1X3B0cih2bGFuX2Rldl9pbmZvKGRldiktPnZsYW5fcGNwdV9zdGF0cywgaSk7CisJCQlwID0gcGVyX2NwdV9wdHIodmxhbl9kZXZfcHJpdihkZXYpLT52bGFuX3BjcHVfc3RhdHMsIGkpOwogCQkJZG8gewogCQkJCXN0YXJ0ID0gdTY0X3N0YXRzX2ZldGNoX2JlZ2luX2JoKCZwLT5zeW5jcCk7CiAJCQkJcnhwYWNrZXRzCT0gcC0+cnhfcGFja2V0czsKQEAgLTY2MSw2ICs2NjMsNTcgQEAKIAlyZXR1cm4gc3RhdHM7CiB9CiAKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorc3RhdGljIHZvaWQgdmxhbl9kZXZfcG9sbF9jb250cm9sbGVyKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IHZsYW5fZGV2X25ldHBvbGxfc2V0dXAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IG5ldHBvbGxfaW5mbyAqbnBpbmZvKQoreworCXN0cnVjdCB2bGFuX2Rldl9wcml2ICppbmZvID0gdmxhbl9kZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRfZGV2aWNlICpyZWFsX2RldiA9IGluZm8tPnJlYWxfZGV2OworCXN0cnVjdCBuZXRwb2xsICpuZXRwb2xsOworCWludCBlcnIgPSAwOworCisJbmV0cG9sbCA9IGt6YWxsb2Moc2l6ZW9mKCpuZXRwb2xsKSwgR0ZQX0tFUk5FTCk7CisJZXJyID0gLUVOT01FTTsKKwlpZiAoIW5ldHBvbGwpCisJCWdvdG8gb3V0OworCisJbmV0cG9sbC0+ZGV2ID0gcmVhbF9kZXY7CisJc3RybGNweShuZXRwb2xsLT5kZXZfbmFtZSwgcmVhbF9kZXYtPm5hbWUsIElGTkFNU0laKTsKKworCWVyciA9IF9fbmV0cG9sbF9zZXR1cChuZXRwb2xsKTsKKwlpZiAoZXJyKSB7CisJCWtmcmVlKG5ldHBvbGwpOworCQlnb3RvIG91dDsKKwl9CisKKwlpbmZvLT5uZXRwb2xsID0gbmV0cG9sbDsKKworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHZsYW5fZGV2X25ldHBvbGxfY2xlYW51cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCXN0cnVjdCB2bGFuX2Rldl9wcml2ICppbmZvID0gdmxhbl9kZXZfcHJpdihkZXYpOworCXN0cnVjdCBuZXRwb2xsICpuZXRwb2xsID0gaW5mby0+bmV0cG9sbDsKKworCWlmICghbmV0cG9sbCkKKwkJcmV0dXJuOworCisJaW5mby0+bmV0cG9sbCA9IE5VTEw7CisKKyAgICAgICAgLyogV2FpdCBmb3IgdHJhbnNtaXR0aW5nIHBhY2tldHMgdG8gZmluaXNoIGJlZm9yZSBmcmVlaW5nLiAqLworICAgICAgICBzeW5jaHJvbml6ZV9yY3VfYmgoKTsKKworICAgICAgICBfX25ldHBvbGxfY2xlYW51cChuZXRwb2xsKTsKKyAgICAgICAga2ZyZWUobmV0cG9sbCk7Cit9CisjZW5kaWYgLyogQ09ORklHX05FVF9QT0xMX0NPTlRST0xMRVIgKi8KKwogc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyB2bGFuX2V0aHRvb2xfb3BzID0gewogCS5nZXRfc2V0dGluZ3MJICAgICAgICA9IHZsYW5fZXRodG9vbF9nZXRfc2V0dGluZ3MsCiAJLmdldF9kcnZpbmZvCSAgICAgICAgPSB2bGFuX2V0aHRvb2xfZ2V0X2RydmluZm8sCkBAIC02ODksNiArNzQyLDExIEBACiAJLm5kb19mY29lX2dldF93d24JPSB2bGFuX2Rldl9mY29lX2dldF93d24sCiAJLm5kb19mY29lX2RkcF90YXJnZXQJPSB2bGFuX2Rldl9mY29lX2RkcF90YXJnZXQsCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfTkVUX1BPTExfQ09OVFJPTExFUgorCS5uZG9fcG9sbF9jb250cm9sbGVyCT0gdmxhbl9kZXZfcG9sbF9jb250cm9sbGVyLAorCS5uZG9fbmV0cG9sbF9zZXR1cAk9IHZsYW5fZGV2X25ldHBvbGxfc2V0dXAsCisJLm5kb19uZXRwb2xsX2NsZWFudXAJPSB2bGFuX2Rldl9uZXRwb2xsX2NsZWFudXAsCisjZW5kaWYKIAkubmRvX2ZpeF9mZWF0dXJlcwk9IHZsYW5fZGV2X2ZpeF9mZWF0dXJlcywKIH07CiAKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX2d2cnAuYyBiL25ldC84MDIxcS92bGFuX2d2cnAuYwppbmRleCAwNjFjZWNlLi42Zjk3NTUzIDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9ndnJwLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fZ3ZycC5jCkBAIC0yOSw3ICsyOSw3IEBACiAKIGludCB2bGFuX2d2cnBfcmVxdWVzdF9qb2luKGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7Ci0JY29uc3Qgc3RydWN0IHZsYW5fZGV2X2luZm8gKnZsYW4gPSB2bGFuX2Rldl9pbmZvKGRldik7CisJY29uc3Qgc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW4gPSB2bGFuX2Rldl9wcml2KGRldik7CiAJX19iZTE2IHZsYW5faWQgPSBodG9ucyh2bGFuLT52bGFuX2lkKTsKIAogCXJldHVybiBnYXJwX3JlcXVlc3Rfam9pbih2bGFuLT5yZWFsX2RldiwgJnZsYW5fZ3ZycF9hcHAsCkBAIC0zOCw3ICszOCw3IEBACiAKIHZvaWQgdmxhbl9ndnJwX3JlcXVlc3RfbGVhdmUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQljb25zdCBzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbiA9IHZsYW5fZGV2X2luZm8oZGV2KTsKKwljb25zdCBzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKIAlfX2JlMTYgdmxhbl9pZCA9IGh0b25zKHZsYW4tPnZsYW5faWQpOwogCiAJZ2FycF9yZXF1ZXN0X2xlYXZlKHZsYW4tPnJlYWxfZGV2LCAmdmxhbl9ndnJwX2FwcCwKZGlmZiAtLWdpdCBhL25ldC84MDIxcS92bGFuX25ldGxpbmsuYyBiL25ldC84MDIxcS92bGFuX25ldGxpbmsuYwppbmRleCAyMzVjMjE5Li41MDcxMTM2IDEwMDY0NAotLS0gYS9uZXQvODAyMXEvdmxhbl9uZXRsaW5rLmMKKysrIGIvbmV0LzgwMjFxL3ZsYW5fbmV0bGluay5jCkBAIC0xMDUsNyArMTA1LDcgQEAKIHN0YXRpYyBpbnQgdmxhbl9uZXdsaW5rKHN0cnVjdCBuZXQgKnNyY19uZXQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQlzdHJ1Y3QgbmxhdHRyICp0YltdLCBzdHJ1Y3QgbmxhdHRyICpkYXRhW10pCiB7Ci0Jc3RydWN0IHZsYW5fZGV2X2luZm8gKnZsYW4gPSB2bGFuX2Rldl9pbmZvKGRldik7CisJc3RydWN0IHZsYW5fZGV2X3ByaXYgKnZsYW4gPSB2bGFuX2Rldl9wcml2KGRldik7CiAJc3RydWN0IG5ldF9kZXZpY2UgKnJlYWxfZGV2OwogCWludCBlcnI7CiAKQEAgLTE0OSw3ICsxNDksNyBAQAogCiBzdGF0aWMgc2l6ZV90IHZsYW5fZ2V0X3NpemUoY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbiA9IHZsYW5fZGV2X2luZm8oZGV2KTsKKwlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKIAogCXJldHVybiBubGFfdG90YWxfc2l6ZSgyKSArCS8qIElGTEFfVkxBTl9JRCAqLwogCSAgICAgICBzaXplb2Yoc3RydWN0IGlmbGFfdmxhbl9mbGFncykgKyAvKiBJRkxBX1ZMQU5fRkxBR1MgKi8KQEAgLTE1OSwxNCArMTU5LDE0IEBACiAKIHN0YXRpYyBpbnQgdmxhbl9maWxsX2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqdmxhbiA9IHZsYW5fZGV2X2luZm8oZGV2KTsKKwlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYoZGV2KTsKIAlzdHJ1Y3Qgdmxhbl9wcmlvcml0eV90Y2lfbWFwcGluZyAqcG07CiAJc3RydWN0IGlmbGFfdmxhbl9mbGFncyBmOwogCXN0cnVjdCBpZmxhX3ZsYW5fcW9zX21hcHBpbmcgbTsKIAlzdHJ1Y3QgbmxhdHRyICpuZXN0OwogCXVuc2lnbmVkIGludCBpOwogCi0JTkxBX1BVVF9VMTYoc2tiLCBJRkxBX1ZMQU5fSUQsIHZsYW5fZGV2X2luZm8oZGV2KS0+dmxhbl9pZCk7CisJTkxBX1BVVF9VMTYoc2tiLCBJRkxBX1ZMQU5fSUQsIHZsYW5fZGV2X3ByaXYoZGV2KS0+dmxhbl9pZCk7CiAJaWYgKHZsYW4tPmZsYWdzKSB7CiAJCWYuZmxhZ3MgPSB2bGFuLT5mbGFnczsKIAkJZi5tYXNrICA9IH4wOwpAQCAtMjE4LDcgKzIxOCw3IEBACiAJLmtpbmQJCT0gInZsYW4iLAogCS5tYXh0eXBlCT0gSUZMQV9WTEFOX01BWCwKIAkucG9saWN5CQk9IHZsYW5fcG9saWN5LAotCS5wcml2X3NpemUJPSBzaXplb2Yoc3RydWN0IHZsYW5fZGV2X2luZm8pLAorCS5wcml2X3NpemUJPSBzaXplb2Yoc3RydWN0IHZsYW5fZGV2X3ByaXYpLAogCS5zZXR1cAkJPSB2bGFuX3NldHVwLAogCS52YWxpZGF0ZQk9IHZsYW5fdmFsaWRhdGUsCiAJLm5ld2xpbmsJPSB2bGFuX25ld2xpbmssCmRpZmYgLS1naXQgYS9uZXQvODAyMXEvdmxhbnByb2MuYyBiL25ldC84MDIxcS92bGFucHJvYy5jCmluZGV4IGQzNGI2ZGEuLmM3MThmZDMgMTAwNjQ0Ci0tLSBhL25ldC84MDIxcS92bGFucHJvYy5jCisrKyBiL25ldC84MDIxcS92bGFucHJvYy5jCkBAIC0xNjgsMTMgKzE2OCwxMyBAQAogCiBpbnQgdmxhbl9wcm9jX2FkZF9kZXYoc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5kZXYpCiB7Ci0Jc3RydWN0IHZsYW5fZGV2X2luZm8gKmRldl9pbmZvID0gdmxhbl9kZXZfaW5mbyh2bGFuZGV2KTsKKwlzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYodmxhbmRldik7CiAJc3RydWN0IHZsYW5fbmV0ICp2biA9IG5ldF9nZW5lcmljKGRldl9uZXQodmxhbmRldiksIHZsYW5fbmV0X2lkKTsKIAotCWRldl9pbmZvLT5kZW50ID0KKwl2bGFuLT5kZW50ID0KIAkJcHJvY19jcmVhdGVfZGF0YSh2bGFuZGV2LT5uYW1lLCBTX0lGUkVHfFNfSVJVU1J8U19JV1VTUiwKIAkJCQkgdm4tPnByb2Nfdmxhbl9kaXIsICZ2bGFuZGV2X2ZvcHMsIHZsYW5kZXYpOwotCWlmICghZGV2X2luZm8tPmRlbnQpCisJaWYgKCF2bGFuLT5kZW50KQogCQlyZXR1cm4gLUVOT0JVRlM7CiAJcmV0dXJuIDA7CiB9CkBAIC0xODcsMTAgKzE4NywxMCBAQAogCXN0cnVjdCB2bGFuX25ldCAqdm4gPSBuZXRfZ2VuZXJpYyhkZXZfbmV0KHZsYW5kZXYpLCB2bGFuX25ldF9pZCk7CiAKIAkvKiogTk9URTogIFRoaXMgd2lsbCBjb25zdW1lIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSBkZW50LCBpdCBzZWVtcy4gKi8KLQlpZiAodmxhbl9kZXZfaW5mbyh2bGFuZGV2KS0+ZGVudCkgewotCQlyZW1vdmVfcHJvY19lbnRyeSh2bGFuX2Rldl9pbmZvKHZsYW5kZXYpLT5kZW50LT5uYW1lLAorCWlmICh2bGFuX2Rldl9wcml2KHZsYW5kZXYpLT5kZW50KSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5KHZsYW5fZGV2X3ByaXYodmxhbmRldiktPmRlbnQtPm5hbWUsCiAJCQkJICB2bi0+cHJvY192bGFuX2Rpcik7Ci0JCXZsYW5fZGV2X2luZm8odmxhbmRldiktPmRlbnQgPSBOVUxMOworCQl2bGFuX2Rldl9wcml2KHZsYW5kZXYpLT5kZW50ID0gTlVMTDsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC0yNjgsMTAgKzI2OCwxMCBAQAogCQkJICAgbm10eXBlID8gbm10eXBlIDogICJVTktOT1dOIik7CiAJfSBlbHNlIHsKIAkJY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKnZsYW5kZXYgPSB2OwotCQljb25zdCBzdHJ1Y3Qgdmxhbl9kZXZfaW5mbyAqZGV2X2luZm8gPSB2bGFuX2Rldl9pbmZvKHZsYW5kZXYpOworCQljb25zdCBzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYodmxhbmRldik7CiAKIAkJc2VxX3ByaW50ZihzZXEsICIlLTE1c3wgJWQgIHwgJXNcbiIsICB2bGFuZGV2LT5uYW1lLAotCQkJICAgZGV2X2luZm8tPnZsYW5faWQsICAgIGRldl9pbmZvLT5yZWFsX2Rldi0+bmFtZSk7CisJCQkgICB2bGFuLT52bGFuX2lkLCAgICB2bGFuLT5yZWFsX2Rldi0+bmFtZSk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtMjc5LDcgKzI3OSw3IEBACiBzdGF0aWMgaW50IHZsYW5kZXZfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqdmxhbmRldiA9IChzdHJ1Y3QgbmV0X2RldmljZSAqKSBzZXEtPnByaXZhdGU7Ci0JY29uc3Qgc3RydWN0IHZsYW5fZGV2X2luZm8gKmRldl9pbmZvID0gdmxhbl9kZXZfaW5mbyh2bGFuZGV2KTsKKwljb25zdCBzdHJ1Y3Qgdmxhbl9kZXZfcHJpdiAqdmxhbiA9IHZsYW5fZGV2X3ByaXYodmxhbmRldik7CiAJc3RydWN0IHJ0bmxfbGlua19zdGF0czY0IHRlbXA7CiAJY29uc3Qgc3RydWN0IHJ0bmxfbGlua19zdGF0czY0ICpzdGF0czsKIAlzdGF0aWMgY29uc3QgY2hhciBmbXQ2NFtdID0gIiUzMHMgJTEybGx1XG4iOwpAQCAtMjkxLDggKzI5MSw4IEBACiAJc3RhdHMgPSBkZXZfZ2V0X3N0YXRzKHZsYW5kZXYsICZ0ZW1wKTsKIAlzZXFfcHJpbnRmKHNlcSwKIAkJICAgIiVzICBWSUQ6ICVkCSBSRU9SREVSX0hEUjogJWkgIGRldi0+cHJpdl9mbGFnczogJWh4XG4iLAotCQkgICB2bGFuZGV2LT5uYW1lLCBkZXZfaW5mby0+dmxhbl9pZCwKLQkJICAgKGludCkoZGV2X2luZm8tPmZsYWdzICYgMSksIHZsYW5kZXYtPnByaXZfZmxhZ3MpOworCQkgICB2bGFuZGV2LT5uYW1lLCB2bGFuLT52bGFuX2lkLAorCQkgICAoaW50KSh2bGFuLT5mbGFncyAmIDEpLCB2bGFuZGV2LT5wcml2X2ZsYWdzKTsKIAogCXNlcV9wcmludGYoc2VxLCBmbXQ2NCwgInRvdGFsIGZyYW1lcyByZWNlaXZlZCIsIHN0YXRzLT5yeF9wYWNrZXRzKTsKIAlzZXFfcHJpbnRmKHNlcSwgZm10NjQsICJ0b3RhbCBieXRlcyByZWNlaXZlZCIsIHN0YXRzLT5yeF9ieXRlcyk7CkBAIC0zMDAsMjMgKzMwMCwyMyBAQAogCXNlcV9wdXRzKHNlcSwgIlxuIik7CiAJc2VxX3ByaW50ZihzZXEsIGZtdDY0LCAidG90YWwgZnJhbWVzIHRyYW5zbWl0dGVkIiwgc3RhdHMtPnR4X3BhY2tldHMpOwogCXNlcV9wcmludGYoc2VxLCBmbXQ2NCwgInRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkIiwgc3RhdHMtPnR4X2J5dGVzKTsKLQlzZXFfcHJpbnRmKHNlcSwgIkRldmljZTogJXMiLCBkZXZfaW5mby0+cmVhbF9kZXYtPm5hbWUpOworCXNlcV9wcmludGYoc2VxLCAiRGV2aWNlOiAlcyIsIHZsYW4tPnJlYWxfZGV2LT5uYW1lKTsKIAkvKiBub3cgc2hvdyBhbGwgUFJJT1JJVFkgbWFwcGluZ3MgcmVsYXRpbmcgdG8gdGhpcyBWTEFOICovCiAJc2VxX3ByaW50ZihzZXEsICJcbklOR1JFU1MgcHJpb3JpdHkgbWFwcGluZ3M6ICIKIAkJCSIwOiV1ICAxOiV1ICAyOiV1ICAzOiV1ICA0OiV1ICA1OiV1ICA2OiV1IDc6JXVcbiIsCi0JCSAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFswXSwKLQkJICAgZGV2X2luZm8tPmluZ3Jlc3NfcHJpb3JpdHlfbWFwWzFdLAotCQkgICBkZXZfaW5mby0+aW5ncmVzc19wcmlvcml0eV9tYXBbMl0sCi0JCSAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFszXSwKLQkJICAgZGV2X2luZm8tPmluZ3Jlc3NfcHJpb3JpdHlfbWFwWzRdLAotCQkgICBkZXZfaW5mby0+aW5ncmVzc19wcmlvcml0eV9tYXBbNV0sCi0JCSAgIGRldl9pbmZvLT5pbmdyZXNzX3ByaW9yaXR5X21hcFs2XSwKLQkJICAgZGV2X2luZm8tPmluZ3Jlc3NfcHJpb3JpdHlfbWFwWzddKTsKKwkJICAgdmxhbi0+aW5ncmVzc19wcmlvcml0eV9tYXBbMF0sCisJCSAgIHZsYW4tPmluZ3Jlc3NfcHJpb3JpdHlfbWFwWzFdLAorCQkgICB2bGFuLT5pbmdyZXNzX3ByaW9yaXR5X21hcFsyXSwKKwkJICAgdmxhbi0+aW5ncmVzc19wcmlvcml0eV9tYXBbM10sCisJCSAgIHZsYW4tPmluZ3Jlc3NfcHJpb3JpdHlfbWFwWzRdLAorCQkgICB2bGFuLT5pbmdyZXNzX3ByaW9yaXR5X21hcFs1XSwKKwkJICAgdmxhbi0+aW5ncmVzc19wcmlvcml0eV9tYXBbNl0sCisJCSAgIHZsYW4tPmluZ3Jlc3NfcHJpb3JpdHlfbWFwWzddKTsKIAogCXNlcV9wcmludGYoc2VxLCAiIEVHUkVTUyBwcmlvcml0eSBtYXBwaW5nczogIik7CiAJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKIAkJY29uc3Qgc3RydWN0IHZsYW5fcHJpb3JpdHlfdGNpX21hcHBpbmcgKm1wCi0JCQk9IGRldl9pbmZvLT5lZ3Jlc3NfcHJpb3JpdHlfbWFwW2ldOworCQkJPSB2bGFuLT5lZ3Jlc3NfcHJpb3JpdHlfbWFwW2ldOwogCQl3aGlsZSAobXApIHsKIAkJCXNlcV9wcmludGYoc2VxLCAiJXU6JWh1ICIsCiAJCQkJICAgbXAtPnByaW9yaXR5LCAoKG1wLT52bGFuX3FvcyA+PiAxMykgJiAweDcpKTsKZGlmZiAtLWdpdCBhL25ldC9LY29uZmlnIGIvbmV0L0tjb25maWcKaW5kZXggYTA3MzE0OC4uZTA3MjcyZCAxMDA2NDQKLS0tIGEvbmV0L0tjb25maWcKKysrIGIvbmV0L0tjb25maWcKQEAgLTIxNSw2ICsyMTUsNyBAQAogc291cmNlICJuZXQvZGNiL0tjb25maWciCiBzb3VyY2UgIm5ldC9kbnNfcmVzb2x2ZXIvS2NvbmZpZyIKIHNvdXJjZSAibmV0L2JhdG1hbi1hZHYvS2NvbmZpZyIKK3NvdXJjZSAibmV0L29wZW52c3dpdGNoL0tjb25maWciCiAKIGNvbmZpZyBSUFMKIAlib29sZWFuCkBAIC0yMzIsNiArMjMzLDE5IEBACiAJZGVwZW5kcyBvbiBTTVAgJiYgU1lTRlMgJiYgVVNFX0dFTkVSSUNfU01QX0hFTFBFUlMKIAlkZWZhdWx0IHkKIAorY29uZmlnIE5FVFBSSU9fQ0dST1VQCisJdHJpc3RhdGUgIk5ldHdvcmsgcHJpb3JpdHkgY2dyb3VwIgorCWRlcGVuZHMgb24gQ0dST1VQUworCS0tLWhlbHAtLS0KKwkgIENncm91cCBzdWJzeXN0ZW0gZm9yIHVzZSBpbiBhc3NpZ25pbmcgcHJvY2Vzc2VzIHRvIG5ldHdvcmsgcHJpb3JpdGllcyBvbgorCSAgYSBwZXItaW50ZXJmYWNlIGJhc2lzCisKK2NvbmZpZyBCUUwKKwlib29sZWFuCisJZGVwZW5kcyBvbiBTWVNGUworCXNlbGVjdCBEUUwKKwlkZWZhdWx0IHkKKwogY29uZmlnIEhBVkVfQlBGX0pJVAogCWJvb2wKIApkaWZmIC0tZ2l0IGEvbmV0L01ha2VmaWxlIGIvbmV0L01ha2VmaWxlCmluZGV4IGFjZGRlNDkuLmFkNDMyZmEgMTAwNjQ0Ci0tLSBhL25ldC9NYWtlZmlsZQorKysgYi9uZXQvTWFrZWZpbGUKQEAgLTY5LDMgKzY5LDQgQEAKIG9iai0kKENPTkZJR19DRVBIX0xJQikJCSs9IGNlcGgvCiBvYmotJChDT05GSUdfQkFUTUFOX0FEVikJKz0gYmF0bWFuLWFkdi8KIG9iai0kKENPTkZJR19ORkMpCQkrPSBuZmMvCitvYmotJChDT05GSUdfT1BFTlZTV0lUQ0gpCSs9IG9wZW52c3dpdGNoLwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9hdG1fbWlzYy5jIGIvbmV0L2F0bS9hdG1fbWlzYy5jCmluZGV4IGY0MWYwMjYuLjg3NmZiZTggMTAwNjQ0Ci0tLSBhL25ldC9hdG0vYXRtX21pc2MuYworKysgYi9uZXQvYXRtL2F0bV9taXNjLmMKQEAgLTI2LDcgKzI2LDcgQEAKIAkJCQkgZ2ZwX3QgZ2ZwX2ZsYWdzKQogewogCXN0cnVjdCBzb2NrICpzayA9IHNrX2F0bSh2Y2MpOwotCWludCBndWVzcyA9IGF0bV9ndWVzc19wZHUydHJ1ZXNpemUocGR1X3NpemUpOworCWludCBndWVzcyA9IFNLQl9UUlVFU0laRShwZHVfc2l6ZSk7CiAKIAlhdG1fZm9yY2VfY2hhcmdlKHZjYywgZ3Vlc3MpOwogCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpIDw9IHNrLT5za19yY3ZidWYpIHsKZGlmZiAtLWdpdCBhL25ldC9hdG0vYnIyNjg0LmMgYi9uZXQvYXRtL2JyMjY4NC5jCmluZGV4IGQwNzIyM2MuLjM1M2ZjY2YgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vYnIyNjg0LmMKKysrIGIvbmV0L2F0bS9icjI2ODQuYwpAQCAtNTMsNiArNTMsNyBAQAogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZXRoZXJ0eXBlX2lwdjZbXSA9IHsgRVRIRVJUWVBFX0lQVjYgfTsKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGxsY19vdWlfcGlkX3BhZFtdID0KIAkJCXsgTExDLCBTTkFQX0JSSURHRUQsIFBJRF9FVEhFUk5FVCwgUEFEX0JSSURHRUQgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHBhZFtdID0geyBQQURfQlJJREdFRCB9Owogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbGxjX291aV9pcHY0W10gPSB7IExMQywgU05BUF9ST1VURUQsIEVUSEVSVFlQRV9JUFY0IH07CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBsbGNfb3VpX2lwdjZbXSA9IHsgTExDLCBTTkFQX1JPVVRFRCwgRVRIRVJUWVBFX0lQVjYgfTsKIApAQCAtMjAyLDcgKzIwMywxMCBAQAogewogCXN0cnVjdCBicjI2ODRfZGV2ICpicmRldiA9IEJSUFJJVihkZXYpOwogCXN0cnVjdCBhdG1fdmNjICphdG12Y2M7Ci0JaW50IG1pbmhlYWRyb29tID0gKGJydmNjLT5lbmNhcHMgPT0gZV9sbGMpID8gMTAgOiAyOworCWludCBtaW5oZWFkcm9vbSA9IChicnZjYy0+ZW5jYXBzID09IGVfbGxjKSA/CisJCSgoYnJkZXYtPnBheWxvYWQgPT0gcF9icmlkZ2VkKSA/CisJCQlzaXplb2YobGxjX291aV9waWRfcGFkKSA6IHNpemVvZihsbGNfb3VpX2lwdjQpKSA6CisJCSgoYnJkZXYtPnBheWxvYWQgPT0gcF9icmlkZ2VkKSA/IEJSMjY4NF9QQURfTEVOIDogMCk7CiAKIAlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBtaW5oZWFkcm9vbSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiMiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgbWluaGVhZHJvb20pOwpAQCAtNDUwLDcgKzQ1NCw3IEBACiAJCQlza2ItPnBrdF90eXBlID0gUEFDS0VUX0hPU1Q7CiAJCX0gZWxzZSB7IC8qIHBfYnJpZGdlZCAqLwogCQkJLyogZmlyc3QgMiBjaGFycyBzaG91bGQgYmUgMCAqLwotCQkJaWYgKCooKHUxNiAqKSAoc2tiLT5kYXRhKSkgIT0gMCkKKwkJCWlmIChtZW1jbXAoc2tiLT5kYXRhLCBwYWQsIEJSMjY4NF9QQURfTEVOKSAhPSAwKQogCQkJCWdvdG8gZXJyb3I7CiAJCQlza2JfcHVsbChza2IsIEJSMjY4NF9QQURfTEVOKTsKIAkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIG5ldF9kZXYpOwpAQCAtNDg5LDE1ICs0OTMsMTEgQEAKICAqLwogc3RhdGljIGludCBicjI2ODRfcmVndmNjKHN0cnVjdCBhdG1fdmNjICphdG12Y2MsIHZvaWQgX191c2VyICogYXJnKQogewotCXN0cnVjdCBza19idWZmX2hlYWQgcXVldWU7Ci0JaW50IGVycjsKIAlzdHJ1Y3QgYnIyNjg0X3ZjYyAqYnJ2Y2M7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpycTsKIAlzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkZXY7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldF9kZXY7CiAJc3RydWN0IGF0bV9iYWNrZW5kX2JyMjY4NCBiZTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmJlLCBhcmcsIHNpemVvZiBiZSkpCiAJCXJldHVybiAtRUZBVUxUOwpAQCAtNTUwLDIzICs1NTAsNiBAQAogCWF0bXZjYy0+cHVzaCA9IGJyMjY4NF9wdXNoOwogCWF0bXZjYy0+cG9wID0gYnIyNjg0X3BvcDsKIAotCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmcXVldWUpOwotCXJxID0gJnNrX2F0bShhdG12Y2MpLT5za19yZWNlaXZlX3F1ZXVlOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnJxLT5sb2NrLCBmbGFncyk7Ci0Jc2tiX3F1ZXVlX3NwbGljZV9pbml0KHJxLCAmcXVldWUpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJxLT5sb2NrLCBmbGFncyk7Ci0KLQlza2JfcXVldWVfd2Fsa19zYWZlKCZxdWV1ZSwgc2tiLCB0bXApIHsKLQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKLQotCQlicjI2ODRfcHVzaChhdG12Y2MsIHNrYik7Ci0JCWRldiA9IHNrYi0+ZGV2OwotCi0JCWRldi0+c3RhdHMucnhfYnl0ZXMgLT0gc2tiLT5sZW47Ci0JCWRldi0+c3RhdHMucnhfcGFja2V0cy0tOwotCX0KLQogCS8qIGluaXRpYWxpemUgbmV0ZGV2IGNhcnJpZXIgc3RhdGUgKi8KIAlpZiAoYXRtdmNjLT5kZXYtPnNpZ25hbCA9PSBBVE1fUEhZX1NJR19MT1NUKQogCQluZXRpZl9jYXJyaWVyX29mZihuZXRfZGV2KTsKQEAgLTU3NCw2ICs1NTcsMTAgQEAKIAkJbmV0aWZfY2Fycmllcl9vbihuZXRfZGV2KTsKIAogCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiByZS1wcm9jZXNzIGV2ZXJ5dGhpbmcgcmVjZWl2ZWQgYmV0d2VlbiBjb25uZWN0aW9uIHNldHVwIGFuZAorCSAgIGJhY2tlbmQgc2V0dXAgKi8KKwl2Y2NfcHJvY2Vzc19yZWN2X3F1ZXVlKGF0bXZjYyk7CiAJcmV0dXJuIDA7CiAKIGVycm9yOgpAQCAtNjAwLDYgKzU4Nyw3IEBACiAJc3RydWN0IGJyMjY4NF9kZXYgKmJyZGV2ID0gQlJQUklWKG5ldGRldik7CiAKIAlldGhlcl9zZXR1cChuZXRkZXYpOworCW5ldGRldi0+aGFyZF9oZWFkZXJfbGVuICs9IHNpemVvZihsbGNfb3VpX3BpZF9wYWQpOyAvKiB3b3JzdCBjYXNlICovCiAJYnJkZXYtPm5ldF9kZXYgPSBuZXRkZXY7CiAKIAluZXRkZXYtPm5ldGRldl9vcHMgPSAmYnIyNjg0X25ldGRldl9vcHM7CkBAIC02MTIsNyArNjAwLDcgQEAKIAlzdHJ1Y3QgYnIyNjg0X2RldiAqYnJkZXYgPSBCUlBSSVYobmV0ZGV2KTsKIAogCWJyZGV2LT5uZXRfZGV2ID0gbmV0ZGV2OwotCW5ldGRldi0+aGFyZF9oZWFkZXJfbGVuID0gMDsKKwluZXRkZXYtPmhhcmRfaGVhZGVyX2xlbiA9IHNpemVvZihsbGNfb3VpX2lwdjQpOyAvKiB3b3JzdCBjYXNlICovCiAJbmV0ZGV2LT5uZXRkZXZfb3BzID0gJmJyMjY4NF9uZXRkZXZfb3BzX3JvdXRlZDsKIAluZXRkZXYtPmFkZHJfbGVuID0gMDsKIAluZXRkZXYtPm10dSA9IDE1MDA7CmRpZmYgLS1naXQgYS9uZXQvYXRtL2NsaXAuYyBiL25ldC9hdG0vY2xpcC5jCmluZGV4IDg1MjM5NDAuLmMxMmMyNTggMTAwNjQ0Ci0tLSBhL25ldC9hdG0vY2xpcC5jCisrKyBiL25ldC9hdG0vY2xpcC5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPiAvKiBmb3Igc3RydWN0IHJ0YWJsZSBhbmQgcm91dGluZyAqLwogI2luY2x1ZGUgPG5ldC9pY21wLmg+IC8qIGljbXBfc2VuZCAqLworI2luY2x1ZGUgPG5ldC9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPiAvKiBmb3IgSFogKi8KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPiAvKiBmb3IgaHRvbnMgZXRjLiAqLwpAQCAtMTE5LDcgKzEyMCw3IEBACiAvKiBUaGUgbmVpZ2hib3VyIGVudHJ5IG4tPmxvY2sgaXMgaGVsZC4gKi8KIHN0YXRpYyBpbnQgbmVpZ2hfY2hlY2tfY2Ioc3RydWN0IG5laWdoYm91ciAqbikKIHsKLQlzdHJ1Y3QgYXRtYXJwX2VudHJ5ICplbnRyeSA9IE5FSUdIMkVOVFJZKG4pOworCXN0cnVjdCBhdG1hcnBfZW50cnkgKmVudHJ5ID0gbmVpZ2hib3VyX3ByaXYobik7CiAJc3RydWN0IGNsaXBfdmNjICpjdjsKIAogCWZvciAoY3YgPSBlbnRyeS0+dmNjczsgY3Y7IGN2ID0gY3YtPm5leHQpIHsKQEAgLTE4OSw2ICsxOTAsMTMgQEAKIAlzdHJ1Y3QgY2xpcF92Y2MgKmNsaXBfdmNjID0gQ0xJUF9WQ0ModmNjKTsKIAogCXByX2RlYnVnKCJcbiIpOworCisJaWYgKCFjbGlwX2RldnMpIHsKKwkJYXRtX3JldHVybih2Y2MsIHNrYi0+dHJ1ZXNpemUpOworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuOworCX0KKwogCWlmICghc2tiKSB7CiAJCXByX2RlYnVnKCJyZW1vdmluZyBWQ0MgJXBcbiIsIGNsaXBfdmNjKTsKIAkJaWYgKGNsaXBfdmNjLT5lbnRyeSkKQEAgLTI1NSw4ICsyNjMsMTAgQEAKIAogc3RhdGljIHZvaWQgY2xpcF9uZWlnaF9zb2xpY2l0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogeworCV9fYmUzMiAqaXAgPSAoX19iZTMyICopIG5laWdoLT5wcmltYXJ5X2tleTsKKwogCXByX2RlYnVnKCIobmVpZ2ggJXAsIHNrYiAlcClcbiIsIG5laWdoLCBza2IpOwotCXRvX2F0bWFycGQoYWN0X25lZWQsIFBSSVYobmVpZ2gtPmRldiktPm51bWJlciwgTkVJR0gyRU5UUlkobmVpZ2gpLT5pcCk7CisJdG9fYXRtYXJwZChhY3RfbmVlZCwgUFJJVihuZWlnaC0+ZGV2KS0+bnVtYmVyLCAqaXApOwogfQogCiBzdGF0aWMgdm9pZCBjbGlwX25laWdoX2Vycm9yKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMjc3LDcyICsyODcsMjQgQEAKIAogc3RhdGljIGludCBjbGlwX2NvbnN0cnVjdG9yKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQogewotCXN0cnVjdCBhdG1hcnBfZW50cnkgKmVudHJ5ID0gTkVJR0gyRU5UUlkobmVpZ2gpOwotCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBuZWlnaC0+ZGV2OwotCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKLQlzdHJ1Y3QgbmVpZ2hfcGFybXMgKnBhcm1zOworCXN0cnVjdCBhdG1hcnBfZW50cnkgKmVudHJ5ID0gbmVpZ2hib3VyX3ByaXYobmVpZ2gpOwogCi0JcHJfZGVidWcoIihuZWlnaCAlcCwgZW50cnkgJXApXG4iLCBuZWlnaCwgZW50cnkpOwotCW5laWdoLT50eXBlID0gaW5ldF9hZGRyX3R5cGUoJmluaXRfbmV0LCBlbnRyeS0+aXApOworCWlmIChuZWlnaC0+dGJsLT5mYW1pbHkgIT0gQUZfSU5FVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAobmVpZ2gtPnR5cGUgIT0gUlROX1VOSUNBU1QpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcmN1X3JlYWRfbG9jaygpOwotCWluX2RldiA9IF9faW5fZGV2X2dldF9yY3UoZGV2KTsKLQlpZiAoIWluX2RldikgewotCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGFybXMgPSBpbl9kZXYtPmFycF9wYXJtczsKLQlfX25laWdoX3Bhcm1zX3B1dChuZWlnaC0+cGFybXMpOwotCW5laWdoLT5wYXJtcyA9IG5laWdoX3Bhcm1zX2Nsb25lKHBhcm1zKTsKLQlyY3VfcmVhZF91bmxvY2soKTsKLQorCW5laWdoLT5udWRfc3RhdGUgPSBOVURfTk9ORTsKIAluZWlnaC0+b3BzID0gJmNsaXBfbmVpZ2hfb3BzOwotCW5laWdoLT5vdXRwdXQgPSBuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1ZBTElEID8KLQkgICAgbmVpZ2gtPm9wcy0+Y29ubmVjdGVkX291dHB1dCA6IG5laWdoLT5vcHMtPm91dHB1dDsKKwluZWlnaC0+b3V0cHV0ID0gbmVpZ2gtPm9wcy0+b3V0cHV0OwogCWVudHJ5LT5uZWlnaCA9IG5laWdoOwogCWVudHJ5LT52Y2NzID0gTlVMTDsKIAllbnRyeS0+ZXhwaXJlcyA9IGppZmZpZXMgLSAxOworCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB1MzIgY2xpcF9oYXNoKGNvbnN0IHZvaWQgKnBrZXksIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTMyIHJuZCkKLXsKLQlyZXR1cm4gamhhc2hfMndvcmRzKCoodTMyICopIHBrZXksIGRldi0+aWZpbmRleCwgcm5kKTsKLX0KLQotc3RhdGljIHN0cnVjdCBuZWlnaF90YWJsZSBjbGlwX3RibCA9IHsKLQkuZmFtaWx5IAk9IEFGX0lORVQsCi0JLmVudHJ5X3NpemUgCT0gc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXIpK3NpemVvZihzdHJ1Y3QgYXRtYXJwX2VudHJ5KSwKLQkua2V5X2xlbiAJPSA0LAotCS5oYXNoIAkJPSBjbGlwX2hhc2gsCi0JLmNvbnN0cnVjdG9yIAk9IGNsaXBfY29uc3RydWN0b3IsCi0JLmlkIAkJPSAiY2xpcF9hcnBfY2FjaGUiLAotCi0JLyogcGFyYW1ldGVycyBhcmUgY29waWVkIGZyb20gQVJQIC4uLiAqLwotCS5wYXJtcyA9IHsKLQkJLnRibCAJCQk9ICZjbGlwX3RibCwKLQkJLmJhc2VfcmVhY2hhYmxlX3RpbWUgCT0gMzAgKiBIWiwKLQkJLnJldHJhbnNfdGltZSAJCT0gMSAqIEhaLAotCQkuZ2Nfc3RhbGV0aW1lIAkJPSA2MCAqIEhaLAotCQkucmVhY2hhYmxlX3RpbWUgCT0gMzAgKiBIWiwKLQkJLmRlbGF5X3Byb2JlX3RpbWUgCT0gNSAqIEhaLAotCQkucXVldWVfbGVuIAkJPSAzLAotCQkudWNhc3RfcHJvYmVzIAkJPSAzLAotCQkubWNhc3RfcHJvYmVzIAkJPSAzLAotCQkuYW55Y2FzdF9kZWxheSAJCT0gMSAqIEhaLAotCQkucHJveHlfZGVsYXkgCQk9ICg4ICogSFopIC8gMTAsCi0JCS5wcm94eV9xbGVuIAkJPSA2NCwKLQkJLmxvY2t0aW1lIAkJPSAxICogSFosCi0JfSwKLQkuZ2NfaW50ZXJ2YWwgCT0gMzAgKiBIWiwKLQkuZ2NfdGhyZXNoMSAJPSAxMjgsCi0JLmdjX3RocmVzaDIgCT0gNTEyLAotCS5nY190aHJlc2gzIAk9IDEwMjQsCi19OwotCiAvKiBAQEAgY29weSBiaCBsb2NraW5nIGZyb20gYXJwLmMgLS0gbmVlZCB0byBiaC1lbmFibGUgYXRtIGNvZGUgYmVmb3JlICovCiAKIC8qCkBAIC0zNzYsMjggKzMzOCwxOSBAQAogCQlkZXYtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKIAkJcmV0dXJuIE5FVERFVl9UWF9PSzsKIAl9Ci0JbiA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7CisJbiA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKGRzdCk7CiAJaWYgKCFuKSB7Ci0jaWYgMAotCQluID0gY2xpcF9maW5kX25laWdoYm91cihza2JfZHN0KHNrYiksIDEpOwotCQlpZiAoIW4pIHsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsJLyogbG9zdCB0aGF0IG9uZSAqLwotCQkJZGV2LT5zdGF0cy50eF9kcm9wcGVkKys7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlkc3Rfc2V0X25laWdoYm91cihkc3QsIG4pOwotI2VuZGlmCiAJCXByX2VycigiTk8gTkVJR0hCT1VSICFcbiIpOwogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CiAJCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwogCQlyZXR1cm4gTkVUREVWX1RYX09LOwogCX0KLQllbnRyeSA9IE5FSUdIMkVOVFJZKG4pOworCWVudHJ5ID0gbmVpZ2hib3VyX3ByaXYobik7CiAJaWYgKCFlbnRyeS0+dmNjcykgewogCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBlbnRyeS0+ZXhwaXJlcykpIHsKIAkJCS8qIHNob3VsZCBiZSByZXNvbHZlZCAqLwogCQkJZW50cnktPmV4cGlyZXMgPSBqaWZmaWVzICsgQVRNQVJQX1JFVFJZX0RFTEFZICogSFo7Ci0JCQl0b19hdG1hcnBkKGFjdF9uZWVkLCBQUklWKGRldiktPm51bWJlciwgZW50cnktPmlwKTsKKwkJCXRvX2F0bWFycGQoYWN0X25lZWQsIFBSSVYoZGV2KS0+bnVtYmVyLCAqKChfX2JlMzIgKiluLT5wcmltYXJ5X2tleSkpOwogCQl9CiAJCWlmIChlbnRyeS0+bmVpZ2gtPmFycF9xdWV1ZS5xbGVuIDwgQVRNQVJQX01BWF9VTlJFU19QQUNLRVRTKQogCQkJc2tiX3F1ZXVlX3RhaWwoJmVudHJ5LT5uZWlnaC0+YXJwX3F1ZXVlLCBza2IpOwpAQCAtNDQ4LDEwICs0MDEsNyBAQAogCiBzdGF0aWMgaW50IGNsaXBfbWtpcChzdHJ1Y3QgYXRtX3ZjYyAqdmNjLCBpbnQgdGltZW91dCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpycSwgcXVldWU7CiAJc3RydWN0IGNsaXBfdmNjICpjbGlwX3ZjYzsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAoIXZjYy0+cHVzaCkKIAkJcmV0dXJuIC1FQkFERkQ7CkBAIC00NzIsMjkgKzQyMiw5IEBACiAJdmNjLT5wdXNoID0gY2xpcF9wdXNoOwogCXZjYy0+cG9wID0gY2xpcF9wb3A7CiAKLQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnF1ZXVlKTsKLQlycSA9ICZza19hdG0odmNjKS0+c2tfcmVjZWl2ZV9xdWV1ZTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZycS0+bG9jaywgZmxhZ3MpOwotCXNrYl9xdWV1ZV9zcGxpY2VfaW5pdChycSwgJnF1ZXVlKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycS0+bG9jaywgZmxhZ3MpOwotCiAJLyogcmUtcHJvY2VzcyBldmVyeXRoaW5nIHJlY2VpdmVkIGJldHdlZW4gY29ubmVjdGlvbiBzZXR1cCBhbmQgTUtJUCAqLwotCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnF1ZXVlLCBza2IsIHRtcCkgewotCQlpZiAoIWNsaXBfZGV2cykgewotCQkJYXRtX3JldHVybih2Y2MsIHNrYi0+dHJ1ZXNpemUpOwotCQkJa2ZyZWVfc2tiKHNrYik7Ci0JCX0gZWxzZSB7Ci0JCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc2tiLT5kZXY7Ci0JCQl1bnNpZ25lZCBpbnQgbGVuID0gc2tiLT5sZW47CisJdmNjX3Byb2Nlc3NfcmVjdl9xdWV1ZSh2Y2MpOwogCi0JCQlza2JfZ2V0KHNrYik7Ci0JCQljbGlwX3B1c2godmNjLCBza2IpOwotCQkJZGV2LT5zdGF0cy5yeF9wYWNrZXRzLS07Ci0JCQlkZXYtPnN0YXRzLnJ4X2J5dGVzIC09IGxlbjsKLQkJCWtmcmVlX3NrYihza2IpOwotCQl9Ci0JfQogCXJldHVybiAwOwogfQogCkBAIC01MjMsMTEgKzQ1MywxMSBAQAogCXJ0ID0gaXBfcm91dGVfb3V0cHV0KCZpbml0X25ldCwgaXAsIDAsIDEsIDApOwogCWlmIChJU19FUlIocnQpKQogCQlyZXR1cm4gUFRSX0VSUihydCk7Ci0JbmVpZ2ggPSBfX25laWdoX2xvb2t1cCgmY2xpcF90YmwsICZpcCwgcnQtPmRzdC5kZXYsIDEpOworCW5laWdoID0gX19uZWlnaF9sb29rdXAoJmFycF90YmwsICZpcCwgcnQtPmRzdC5kZXYsIDEpOwogCWlwX3J0X3B1dChydCk7CiAJaWYgKCFuZWlnaCkKIAkJcmV0dXJuIC1FTk9NRU07Ci0JZW50cnkgPSBORUlHSDJFTlRSWShuZWlnaCk7CisJZW50cnkgPSBuZWlnaGJvdXJfcHJpdihuZWlnaCk7CiAJaWYgKGVudHJ5ICE9IGNsaXBfdmNjLT5lbnRyeSkgewogCQlpZiAoIWNsaXBfdmNjLT5lbnRyeSkKIAkJCXByX2RlYnVnKCJhZGRcbiIpOwpAQCAtNTQ0LDEzICs0NzQsMTUgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBjbGlwX25ldGRldl9vcHMgPSB7Ci0JLm5kb19zdGFydF94bWl0ID0gY2xpcF9zdGFydF94bWl0LAorCS5uZG9fc3RhcnRfeG1pdAkJPSBjbGlwX3N0YXJ0X3htaXQsCisJLm5kb19uZWlnaF9jb25zdHJ1Y3QJPSBjbGlwX2NvbnN0cnVjdG9yLAogfTsKIAogc3RhdGljIHZvaWQgY2xpcF9zZXR1cChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWRldi0+bmV0ZGV2X29wcyA9ICZjbGlwX25ldGRldl9vcHM7CiAJZGV2LT50eXBlID0gQVJQSFJEX0FUTTsKKwlkZXYtPm5laWdoX3ByaXZfbGVuID0gc2l6ZW9mKHN0cnVjdCBhdG1hcnBfZW50cnkpOwogCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gUkZDMTQ4M0xMQ19MRU47CiAJZGV2LT5tdHUgPSBSRkMxNjI2X01UVTsKIAlkZXYtPnR4X3F1ZXVlX2xlbiA9IDEwMDsJLyogIm5vcm1hbCIgcXVldWUgKHBhY2tldHMpICovCkBAIC02MDQsMTAgKzUzNiw4IEBACiAJaWYgKCFuZXRfZXEoZGV2X25ldChkZXYpLCAmaW5pdF9uZXQpKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CiAKLQlpZiAoZXZlbnQgPT0gTkVUREVWX1VOUkVHSVNURVIpIHsKLQkJbmVpZ2hfaWZkb3duKCZjbGlwX3RibCwgZGV2KTsKKwlpZiAoZXZlbnQgPT0gTkVUREVWX1VOUkVHSVNURVIpCiAJCXJldHVybiBOT1RJRllfRE9ORTsKLQl9CiAKIAkvKiBpZ25vcmUgbm9uLUNMSVAgZGV2aWNlcyAqLwogCWlmIChkZXYtPnR5cGUgIT0gQVJQSFJEX0FUTSB8fCBkZXYtPm5ldGRldl9vcHMgIT0gJmNsaXBfbmV0ZGV2X29wcykKQEAgLTc4Nyw5ICs3MTcsMTAgQEAKIC8qIFRoaXMgbWVhbnMgdGhlIG5laWdoYm91ciBlbnRyeSBoYXMgbm8gYXR0YWNoZWQgVkNDIG9iamVjdHMuICovCiAjZGVmaW5lIFNFUV9OT19WQ0NfVE9LRU4JKCh2b2lkICopIDIpCiAKLXN0YXRpYyB2b2lkIGF0bWFycF9pbmZvKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorc3RhdGljIHZvaWQgYXRtYXJwX2luZm8oc3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBuZWlnaGJvdXIgKm4sCiAJCQlzdHJ1Y3QgYXRtYXJwX2VudHJ5ICplbnRyeSwgc3RydWN0IGNsaXBfdmNjICpjbGlwX3ZjYykKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbi0+ZGV2OwogCXVuc2lnbmVkIGxvbmcgZXhwOwogCWNoYXIgYnVmWzE3XTsKIAlpbnQgc3ZjLCBsbGMsIG9mZjsKQEAgLTgwOSw4ICs3NDAsNyBAQAogCXNlcV9wcmludGYoc2VxLCAiJS02cyUtNHMlLTRzJTVsZCAiLAogCQkgICBkZXYtPm5hbWUsIHN2YyA/ICJTVkMiIDogIlBWQyIsIGxsYyA/ICJMTEMiIDogIk5VTEwiLCBleHApOwogCi0Jb2ZmID0gc2NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxLCAiJXBJNCIsCi0JCQkmZW50cnktPmlwKTsKKwlvZmYgPSBzY25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsICIlcEk0Iiwgbi0+cHJpbWFyeV9rZXkpOwogCXdoaWxlIChvZmYgPCAxNikKIAkJYnVmW29mZisrXSA9ICcgJzsKIAlidWZbb2ZmXSA9ICdcMCc7CkBAIC04ODEsMTQgKzgxMSwxNyBAQAogewogCXN0cnVjdCBjbGlwX3NlcV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGNsaXBfc2VxX3N0YXRlICopX3N0YXRlOwogCi0JcmV0dXJuIGNsaXBfc2VxX3ZjY193YWxrKHN0YXRlLCBORUlHSDJFTlRSWShuKSwgcG9zKTsKKwlpZiAobi0+ZGV2LT50eXBlICE9IEFSUEhSRF9BVE0pCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGNsaXBfc2VxX3ZjY193YWxrKHN0YXRlLCBuZWlnaGJvdXJfcHJpdihuKSwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKmNsaXBfc2VxX3N0YXJ0KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBsb2ZmX3QgKiBwb3MpCiB7CiAJc3RydWN0IGNsaXBfc2VxX3N0YXRlICpzdGF0ZSA9IHNlcS0+cHJpdmF0ZTsKIAlzdGF0ZS0+bnMubmVpZ2hfc3ViX2l0ZXIgPSBjbGlwX3NlcV9zdWJfaXRlcjsKLQlyZXR1cm4gbmVpZ2hfc2VxX3N0YXJ0KHNlcSwgcG9zLCAmY2xpcF90YmwsIE5FSUdIX1NFUV9ORUlHSF9PTkxZKTsKKwlyZXR1cm4gbmVpZ2hfc2VxX3N0YXJ0KHNlcSwgcG9zLCAmYXJwX3RibCwgTkVJR0hfU0VRX05FSUdIX09OTFkpOwogfQogCiBzdGF0aWMgaW50IGNsaXBfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYpCkBAIC05MDAsMTAgKzgzMywxMCBAQAogCQlzZXFfcHV0cyhzZXEsIGF0bV9hcnBfYmFubmVyKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgY2xpcF9zZXFfc3RhdGUgKnN0YXRlID0gc2VxLT5wcml2YXRlOwotCQlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gdjsKIAkJc3RydWN0IGNsaXBfdmNjICp2Y2MgPSBzdGF0ZS0+dmNjOworCQlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gdjsKIAotCQlhdG1hcnBfaW5mbyhzZXEsIG4tPmRldiwgTkVJR0gyRU5UUlkobiksIHZjYyk7CisJCWF0bWFycF9pbmZvKHNlcSwgbiwgbmVpZ2hib3VyX3ByaXYobiksIHZjYyk7CiAJfQogCXJldHVybiAwOwogfQpAQCAtOTM0LDkgKzg2Nyw2IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGF0bV9jbGlwX2luaXQodm9pZCkKIHsKLQluZWlnaF90YWJsZV9pbml0X25vX25ldGxpbmsoJmNsaXBfdGJsKTsKLQotCWNsaXBfdGJsX2hvb2sgPSAmY2xpcF90Ymw7CiAJcmVnaXN0ZXJfYXRtX2lvY3RsKCZjbGlwX2lvY3RsX29wcyk7CiAJcmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZjbGlwX2Rldl9ub3RpZmllcik7CiAJcmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJmNsaXBfaW5ldF9ub3RpZmllcik7CkBAIC05NzMsMTIgKzkwMyw2IEBACiAJICovCiAJZGVsX3RpbWVyX3N5bmMoJmlkbGVfdGltZXIpOwogCi0JLyogTmV4dCwgcHVyZ2UgdGhlIHRhYmxlLCBzbyB0aGF0IHRoZSBkZXZpY2UKLQkgKiB1bnJlZ2lzdGVyIGxvb3AgYmVsb3cgZG9lcyBub3QgaGFuZyBkdWUgdG8KLQkgKiBkZXZpY2UgcmVmZXJlbmNlcyByZW1haW5pbmcgaW4gdGhlIHRhYmxlLgotCSAqLwotCW5laWdoX2lmZG93bigmY2xpcF90YmwsIE5VTEwpOwotCiAJZGV2ID0gY2xpcF9kZXZzOwogCXdoaWxlIChkZXYpIHsKIAkJbmV4dCA9IFBSSVYoZGV2KS0+bmV4dDsKQEAgLTk4NiwxMSArOTEwLDYgQEAKIAkJZnJlZV9uZXRkZXYoZGV2KTsKIAkJZGV2ID0gbmV4dDsKIAl9Ci0KLQkvKiBOb3cgaXQgaXMgc2FmZSB0byBmdWxseSBzaHV0ZG93biB3aG9sZSB0YWJsZS4gKi8KLQluZWlnaF90YWJsZV9jbGVhcigmY2xpcF90YmwpOwotCi0JY2xpcF90YmxfaG9vayA9IE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBhdG1fY2xpcF9leGl0KHZvaWQpCmRpZmYgLS1naXQgYS9uZXQvYXRtL2NvbW1vbi5jIGIvbmV0L2F0bS9jb21tb24uYwppbmRleCAxNGZmOWZlLi5iNGI0NGRiIDEwMDY0NAotLS0gYS9uZXQvYXRtL2NvbW1vbi5jCisrKyBiL25ldC9hdG0vY29tbW9uLmMKQEAgLTIxNCw2ICsyMTQsMjYgQEAKIH0KIEVYUE9SVF9TWU1CT0wodmNjX3JlbGVhc2VfYXN5bmMpOwogCit2b2lkIHZjY19wcm9jZXNzX3JlY3ZfcXVldWUoc3RydWN0IGF0bV92Y2MgKnZjYykKK3sKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHF1ZXVlLCAqcnE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJX19za2JfcXVldWVfaGVhZF9pbml0KCZxdWV1ZSk7CisJcnEgPSAmc2tfYXRtKHZjYyktPnNrX3JlY2VpdmVfcXVldWU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnEtPmxvY2ssIGZsYWdzKTsKKwlza2JfcXVldWVfc3BsaWNlX2luaXQocnEsICZxdWV1ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnEtPmxvY2ssIGZsYWdzKTsKKworCXNrYl9xdWV1ZV93YWxrX3NhZmUoJnF1ZXVlLCBza2IsIHRtcCkgeworCQlfX3NrYl91bmxpbmsoc2tiLCAmcXVldWUpOworCQl2Y2MtPnB1c2godmNjLCBza2IpOworCX0KK30KK0VYUE9SVF9TWU1CT0wodmNjX3Byb2Nlc3NfcmVjdl9xdWV1ZSk7CisKIHZvaWQgYXRtX2Rldl9zaWduYWxfY2hhbmdlKHN0cnVjdCBhdG1fZGV2ICpkZXYsIGNoYXIgc2lnbmFsKQogewogCXByX2RlYnVnKCIlcyBzaWduYWw9JWQgZGV2PSVwIG51bWJlcj0lZCBkZXYtPnNpZ25hbD0lZFxuIiwKQEAgLTUwMiw4ICs1MjIsMTEgQEAKIAogCWlmIChzb2NrLT5zdGF0ZSAhPSBTU19DT05ORUNURUQpCiAJCXJldHVybiAtRU5PVENPTk47Ci0JaWYgKGZsYWdzICYgfk1TR19ET05UV0FJVCkJCS8qIG9ubHkgaGFuZGxlIE1TR19ET05UV0FJVCAqLworCisJLyogb25seSBoYW5kbGUgTVNHX0RPTlRXQUlUIGFuZCBNU0dfUEVFSyAqLworCWlmIChmbGFncyAmIH4oTVNHX0RPTlRXQUlUIHwgTVNHX1BFRUspKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAl2Y2MgPSBBVE1fU0Qoc29jayk7CiAJaWYgKHRlc3RfYml0KEFUTV9WRl9SRUxFQVNFRCwgJnZjYy0+ZmxhZ3MpIHx8CiAJICAgIHRlc3RfYml0KEFUTV9WRl9DTE9TRSwgJnZjYy0+ZmxhZ3MpIHx8CkBAIC01MjQsOCArNTQ3LDEzIEBACiAJaWYgKGVycm9yKQogCQlyZXR1cm4gZXJyb3I7CiAJc29ja19yZWN2X3RzX2FuZF9kcm9wcyhtc2csIHNrLCBza2IpOwotCXByX2RlYnVnKCIlZCAtPSAlZFxuIiwgYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSwgc2tiLT50cnVlc2l6ZSk7Ci0JYXRtX3JldHVybih2Y2MsIHNrYi0+dHJ1ZXNpemUpOworCisJaWYgKCEoZmxhZ3MgJiBNU0dfUEVFSykpIHsKKwkJcHJfZGVidWcoIiVkIC09ICVkXG4iLCBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpLAorCQkJIHNrYi0+dHJ1ZXNpemUpOworCQlhdG1fcmV0dXJuKHZjYywgc2tiLT50cnVlc2l6ZSk7CisJfQorCiAJc2tiX2ZyZWVfZGF0YWdyYW0oc2ssIHNrYik7CiAJcmV0dXJuIGNvcGllZDsKIH0KZGlmZiAtLWdpdCBhL25ldC9hdG0vY29tbW9uLmggYi9uZXQvYXRtL2NvbW1vbi5oCmluZGV4IGY0OGE3NmIuLmNjM2MyZGEgMTAwNjQ0Ci0tLSBhL25ldC9hdG0vY29tbW9uLmgKKysrIGIvbmV0L2F0bS9jb21tb24uaApAQCAtMjQsNiArMjQsNyBAQAogCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKTsKIGludCB2Y2NfZ2V0c29ja29wdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLAogCQkgICBjaGFyIF9fdXNlciAqb3B0dmFsLCBpbnQgX191c2VyICpvcHRsZW4pOwordm9pZCB2Y2NfcHJvY2Vzc19yZWN2X3F1ZXVlKHN0cnVjdCBhdG1fdmNjICp2Y2MpOwogCiBpbnQgYXRtcHZjX2luaXQodm9pZCk7CiB2b2lkIGF0bXB2Y19leGl0KHZvaWQpOwpkaWZmIC0tZ2l0IGEvbmV0L2F0bS9wcHBvYXRtLmMgYi9uZXQvYXRtL3BwcG9hdG0uYwppbmRleCBkYjRhMTFjLi5kZjM1ZDlhIDEwMDY0NAotLS0gYS9uZXQvYXRtL3BwcG9hdG0uYworKysgYi9uZXQvYXRtL3BwcG9hdG0uYwpAQCAtMzAzLDYgKzMwMywxMCBAQAogCWF0bXZjYy0+cHVzaCA9IHBwcG9hdG1fcHVzaDsKIAlhdG12Y2MtPnBvcCA9IHBwcG9hdG1fcG9wOwogCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwkvKiByZS1wcm9jZXNzIGV2ZXJ5dGhpbmcgcmVjZWl2ZWQgYmV0d2VlbiBjb25uZWN0aW9uIHNldHVwIGFuZAorCSAgIGJhY2tlbmQgc2V0dXAgKi8KKwl2Y2NfcHJvY2Vzc19yZWN2X3F1ZXVlKGF0bXZjYyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9heDI1L2FmX2F4MjUuYyBiL25ldC9heDI1L2FmX2F4MjUuYwppbmRleCBlN2M2OWY0Li4zY2QwYTBkIDEwMDY0NAotLS0gYS9uZXQvYXgyNS9hZl9heDI1LmMKKysrIGIvbmV0L2F4MjUvYWZfYXgyNS5jCkBAIC00MDIsMTQgKzQwMiwxNCBAQAogCQlicmVhazsKIAogCWNhc2UgQVgyNV9UMToKLQkJaWYgKGF4MjVfY3RsLmFyZyA8IDEpCisJCWlmIChheDI1X2N0bC5hcmcgPCAxIHx8IGF4MjVfY3RsLmFyZyA+IFVMT05HX01BWCAvIEhaKQogCQkJZ290byBlaW52YWxfcHV0OwogCQlheDI1LT5ydHQgPSAoYXgyNV9jdGwuYXJnICogSFopIC8gMjsKIAkJYXgyNS0+dDEgID0gYXgyNV9jdGwuYXJnICogSFo7CiAJCWJyZWFrOwogCiAJY2FzZSBBWDI1X1QyOgotCQlpZiAoYXgyNV9jdGwuYXJnIDwgMSkKKwkJaWYgKGF4MjVfY3RsLmFyZyA8IDEgfHwgYXgyNV9jdGwuYXJnID4gVUxPTkdfTUFYIC8gSFopCiAJCQlnb3RvIGVpbnZhbF9wdXQ7CiAJCWF4MjUtPnQyID0gYXgyNV9jdGwuYXJnICogSFo7CiAJCWJyZWFrOwpAQCAtNDIyLDEwICs0MjIsMTUgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFYMjVfVDM6CisJCWlmIChheDI1X2N0bC5hcmcgPiBVTE9OR19NQVggLyBIWikKKwkJCWdvdG8gZWludmFsX3B1dDsKIAkJYXgyNS0+dDMgPSBheDI1X2N0bC5hcmcgKiBIWjsKIAkJYnJlYWs7CiAKIAljYXNlIEFYMjVfSURMRToKKwkJaWYgKGF4MjVfY3RsLmFyZyA+IFVMT05HX01BWCAvICg2MCAqIEhaKSkKKwkJCWdvdG8gZWludmFsX3B1dDsKKwogCQlheDI1LT5pZGxlID0gYXgyNV9jdGwuYXJnICogNjAgKiBIWjsKIAkJYnJlYWs7CiAKQEAgLTU0MCwxNSArNTQ1LDE2IEBACiAJYXgyNV9jYiAqYXgyNTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCWNoYXIgZGV2bmFtZVtJRk5BTVNJWl07Ci0JaW50IG9wdCwgcmVzID0gMDsKKwl1bnNpZ25lZCBsb25nIG9wdDsKKwlpbnQgcmVzID0gMDsKIAogCWlmIChsZXZlbCAhPSBTT0xfQVgyNSkKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAotCWlmIChvcHRsZW4gPCBzaXplb2YoaW50KSkKKwlpZiAob3B0bGVuIDwgc2l6ZW9mKHVuc2lnbmVkIGludCkpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGdldF91c2VyKG9wdCwgKGludCBfX3VzZXIgKilvcHR2YWwpKQorCWlmIChnZXRfdXNlcihvcHQsICh1bnNpZ25lZCBpbnQgX191c2VyICopb3B0dmFsKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAlsb2NrX3NvY2soc2spOwpAQCAtNTcxLDcgKzU3Nyw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBBWDI1X1QxOgotCQlpZiAob3B0IDwgMSkgeworCQlpZiAob3B0IDwgMSB8fCBvcHQgPiBVTE9OR19NQVggLyBIWikgewogCQkJcmVzID0gLUVJTlZBTDsKIAkJCWJyZWFrOwogCQl9CkBAIC01ODAsNyArNTg2LDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFYMjVfVDI6Ci0JCWlmIChvcHQgPCAxKSB7CisJCWlmIChvcHQgPCAxIHx8IG9wdCA+IFVMT05HX01BWCAvIEhaKSB7CiAJCQlyZXMgPSAtRUlOVkFMOwogCQkJYnJlYWs7CiAJCX0KQEAgLTU5Niw3ICs2MDIsNyBAQAogCQlicmVhazsKIAogCWNhc2UgQVgyNV9UMzoKLQkJaWYgKG9wdCA8IDEpIHsKKwkJaWYgKG9wdCA8IDEgfHwgb3B0ID4gVUxPTkdfTUFYIC8gSFopIHsKIAkJCXJlcyA9IC1FSU5WQUw7CiAJCQlicmVhazsKIAkJfQpAQCAtNjA0LDcgKzYxMCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBBWDI1X0lETEU6Ci0JCWlmIChvcHQgPCAwKSB7CisJCWlmIChvcHQgPiBVTE9OR19NQVggLyAoNjAgKiBIWikpIHsKIAkJCXJlcyA9IC1FSU5WQUw7CiAJCQlicmVhazsKIAkJfQpAQCAtNjEyLDcgKzYxOCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBBWDI1X0JBQ0tPRkY6Ci0JCWlmIChvcHQgPCAwIHx8IG9wdCA+IDIpIHsKKwkJaWYgKG9wdCA+IDIpIHsKIAkJCXJlcyA9IC1FSU5WQUw7CiAJCQlicmVhazsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYmF0X3N5c2ZzLmMgYi9uZXQvYmF0bWFuLWFkdi9iYXRfc3lzZnMuYwppbmRleCBiOGE3NDE0Li5jMjU0OTJmIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9iYXRfc3lzZnMuYworKysgYi9uZXQvYmF0bWFuLWFkdi9iYXRfc3lzZnMuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJdW5zaWduZWQgbG9uZyB1aW50X3ZhbDsKIAlpbnQgcmV0OwogCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmZiwgMTAsICZ1aW50X3ZhbCk7CisJcmV0ID0ga3N0cnRvdWwoYnVmZiwgMTAsICZ1aW50X3ZhbCk7CiAJaWYgKHJldCkgewogCQliYXRfaW5mbyhuZXRfZGV2LAogCQkJICIlczogSW52YWxpZCBwYXJhbWV0ZXIgcmVjZWl2ZWQ6ICVzXG4iLApAQCAtMjM5LDcgKzIzOSw3IEBACiAJdW5zaWduZWQgbG9uZyB2YWw7CiAJaW50IHJldCwgdmlzX21vZGVfdG1wID0gLTE7CiAKLQlyZXQgPSBzdHJpY3Rfc3RydG91bChidWZmLCAxMCwgJnZhbCk7CisJcmV0ID0ga3N0cnRvdWwoYnVmZiwgMTAsICZ2YWwpOwogCiAJaWYgKCgoY291bnQgPT0gMikgJiYgKCFyZXQpICYmICh2YWwgPT0gVklTX1RZUEVfQ0xJRU5UX1VQREFURSkpIHx8CiAJICAgIChzdHJuY21wKGJ1ZmYsICJjbGllbnQiLCA2KSA9PSAwKSB8fApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvYml0YXJyYXkuYyBiL25ldC9iYXRtYW4tYWR2L2JpdGFycmF5LmMKaW5kZXggMGJlOWZmMy4uOWJjNjNiMiAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvYml0YXJyYXkuYworKysgYi9uZXQvYmF0bWFuLWFkdi9iaXRhcnJheS5jCkBAIC0xNTUsNyArMTU1LDcgQEAKIAkvKiBzZXF1ZW5jZSBudW1iZXIgaXMgbXVjaCBuZXdlciwgcHJvYmFibHkgbWlzc2VkIGEgbG90IG9mIHBhY2tldHMgKi8KIAogCWlmICgoc2VxX251bV9kaWZmID49IFRRX0xPQ0FMX1dJTkRPV19TSVpFKQotCQl8fCAoc2VxX251bV9kaWZmIDwgRVhQRUNURURfU0VRTk9fUkFOR0UpKSB7CisJCSYmIChzZXFfbnVtX2RpZmYgPCBFWFBFQ1RFRF9TRVFOT19SQU5HRSkpIHsKIAkJYmF0X2RiZyhEQkdfQkFUTUFOLCBiYXRfcHJpdiwKIAkJCSJXZSBtaXNzZWQgYSBsb3Qgb2YgcGFja2V0cyAoJWkpICFcbiIsCiAJCQlzZXFfbnVtX2RpZmYgLSAxKTsKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMgYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5jCmluZGV4IDYxOWZiNzMuLjI0NDAzYTcgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgImdhdGV3YXlfY29tbW9uLmgiCiAjaW5jbHVkZSAiaGFyZC1pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJvcmlnaW5hdG9yLmgiCisjaW5jbHVkZSAidHJhbnNsYXRpb24tdGFibGUuaCIKICNpbmNsdWRlICJyb3V0aW5nLmgiCiAjaW5jbHVkZSA8bGludXgvaXAuaD4KICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CkBAIC01NzIsMTA4ICs1NzMsMTQyIEBACiAJcmV0dXJuIHJldDsKIH0KIAotaW50IGd3X2lzX3RhcmdldChzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkgc3RydWN0IG9yaWdfbm9kZSAqb2xkX2d3KQorYm9vbCBnd19pc19kaGNwX3RhcmdldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1bnNpZ25lZCBpbnQgKmhlYWRlcl9sZW4pCiB7CiAJc3RydWN0IGV0aGhkciAqZXRoaGRyOwogCXN0cnVjdCBpcGhkciAqaXBoZHI7CiAJc3RydWN0IGlwdjZoZHIgKmlwdjZoZHI7CiAJc3RydWN0IHVkcGhkciAqdWRwaGRyOwotCXN0cnVjdCBnd19ub2RlICpjdXJyX2d3OwotCXN0cnVjdCBuZWlnaF9ub2RlICpuZWlnaF9jdXJyID0gTlVMTCwgKm5laWdoX29sZCA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IGhlYWRlcl9sZW4gPSAwOwotCWludCByZXQgPSAxOwotCi0JaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3dfbW9kZSkgPT0gR1dfTU9ERV9PRkYpCi0JCXJldHVybiAwOwogCiAJLyogY2hlY2sgZm9yIGV0aGVybmV0IGhlYWRlciAqLwotCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGhlYWRlcl9sZW4gKyBFVEhfSExFTikpCi0JCXJldHVybiAwOworCWlmICghcHNrYl9tYXlfcHVsbChza2IsICpoZWFkZXJfbGVuICsgRVRIX0hMRU4pKQorCQlyZXR1cm4gZmFsc2U7CiAJZXRoaGRyID0gKHN0cnVjdCBldGhoZHIgKilza2ItPmRhdGE7Ci0JaGVhZGVyX2xlbiArPSBFVEhfSExFTjsKKwkqaGVhZGVyX2xlbiArPSBFVEhfSExFTjsKIAogCS8qIGNoZWNrIGZvciBpbml0aWFsIHZsYW4gaGVhZGVyICovCiAJaWYgKG50b2hzKGV0aGhkci0+aF9wcm90bykgPT0gRVRIX1BfODAyMVEpIHsKLQkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgaGVhZGVyX2xlbiArIFZMQU5fSExFTikpCi0JCQlyZXR1cm4gMDsKKwkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKmhlYWRlcl9sZW4gKyBWTEFOX0hMRU4pKQorCQkJcmV0dXJuIGZhbHNlOwogCQlldGhoZHIgPSAoc3RydWN0IGV0aGhkciAqKShza2ItPmRhdGEgKyBWTEFOX0hMRU4pOwotCQloZWFkZXJfbGVuICs9IFZMQU5fSExFTjsKKwkJKmhlYWRlcl9sZW4gKz0gVkxBTl9ITEVOOwogCX0KIAogCS8qIGNoZWNrIGZvciBpcCBoZWFkZXIgKi8KIAlzd2l0Y2ggKG50b2hzKGV0aGhkci0+aF9wcm90bykpIHsKIAljYXNlIEVUSF9QX0lQOgotCQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBoZWFkZXJfbGVuICsgc2l6ZW9mKCppcGhkcikpKQotCQkJcmV0dXJuIDA7Ci0JCWlwaGRyID0gKHN0cnVjdCBpcGhkciAqKShza2ItPmRhdGEgKyBoZWFkZXJfbGVuKTsKLQkJaGVhZGVyX2xlbiArPSBpcGhkci0+aWhsICogNDsKKwkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKmhlYWRlcl9sZW4gKyBzaXplb2YoKmlwaGRyKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlwaGRyID0gKHN0cnVjdCBpcGhkciAqKShza2ItPmRhdGEgKyAqaGVhZGVyX2xlbik7CisJCSpoZWFkZXJfbGVuICs9IGlwaGRyLT5paGwgKiA0OwogCiAJCS8qIGNoZWNrIGZvciB1ZHAgaGVhZGVyICovCiAJCWlmIChpcGhkci0+cHJvdG9jb2wgIT0gSVBQUk9UT19VRFApCi0JCQlyZXR1cm4gMDsKKwkJCXJldHVybiBmYWxzZTsKIAogCQlicmVhazsKIAljYXNlIEVUSF9QX0lQVjY6Ci0JCWlmICghcHNrYl9tYXlfcHVsbChza2IsIGhlYWRlcl9sZW4gKyBzaXplb2YoKmlwdjZoZHIpKSkKLQkJCXJldHVybiAwOwotCQlpcHY2aGRyID0gKHN0cnVjdCBpcHY2aGRyICopKHNrYi0+ZGF0YSArIGhlYWRlcl9sZW4pOwotCQloZWFkZXJfbGVuICs9IHNpemVvZigqaXB2Nmhkcik7CisJCWlmICghcHNrYl9tYXlfcHVsbChza2IsICpoZWFkZXJfbGVuICsgc2l6ZW9mKCppcHY2aGRyKSkpCisJCQlyZXR1cm4gZmFsc2U7CisJCWlwdjZoZHIgPSAoc3RydWN0IGlwdjZoZHIgKikoc2tiLT5kYXRhICsgKmhlYWRlcl9sZW4pOworCQkqaGVhZGVyX2xlbiArPSBzaXplb2YoKmlwdjZoZHIpOwogCiAJCS8qIGNoZWNrIGZvciB1ZHAgaGVhZGVyICovCiAJCWlmIChpcHY2aGRyLT5uZXh0aGRyICE9IElQUFJPVE9fVURQKQotCQkJcmV0dXJuIDA7CisJCQlyZXR1cm4gZmFsc2U7CiAKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJcmV0dXJuIDA7CisJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBoZWFkZXJfbGVuICsgc2l6ZW9mKCp1ZHBoZHIpKSkKLQkJcmV0dXJuIDA7Ci0JdWRwaGRyID0gKHN0cnVjdCB1ZHBoZHIgKikoc2tiLT5kYXRhICsgaGVhZGVyX2xlbik7Ci0JaGVhZGVyX2xlbiArPSBzaXplb2YoKnVkcGhkcik7CisJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgKmhlYWRlcl9sZW4gKyBzaXplb2YoKnVkcGhkcikpKQorCQlyZXR1cm4gZmFsc2U7CisJdWRwaGRyID0gKHN0cnVjdCB1ZHBoZHIgKikoc2tiLT5kYXRhICsgKmhlYWRlcl9sZW4pOworCSpoZWFkZXJfbGVuICs9IHNpemVvZigqdWRwaGRyKTsKIAogCS8qIGNoZWNrIGZvciBib290cCBwb3J0ICovCiAJaWYgKChudG9ocyhldGhoZHItPmhfcHJvdG8pID09IEVUSF9QX0lQKSAmJgogCSAgICAgKG50b2hzKHVkcGhkci0+ZGVzdCkgIT0gNjcpKQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIGZhbHNlOwogCiAJaWYgKChudG9ocyhldGhoZHItPmhfcHJvdG8pID09IEVUSF9QX0lQVjYpICYmCiAJICAgIChudG9ocyh1ZHBoZHItPmRlc3QpICE9IDU0NykpCi0JCXJldHVybiAwOworCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5nd19tb2RlKSA9PSBHV19NT0RFX1NFUlZFUikKLQkJcmV0dXJuIC0xOworCXJldHVybiB0cnVlOworfQogCi0JY3Vycl9ndyA9IGd3X2dldF9zZWxlY3RlZF9nd19ub2RlKGJhdF9wcml2KTsKLQlpZiAoIWN1cnJfZ3cpCi0JCXJldHVybiAwOworYm9vbCBnd19vdXRfb2ZfcmFuZ2Uoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKKwkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZXRoaGRyICpldGhoZHIpCit7CisJc3RydWN0IG5laWdoX25vZGUgKm5laWdoX2N1cnIgPSBOVUxMLCAqbmVpZ2hfb2xkID0gTlVMTDsKKwlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX2RzdF9ub2RlID0gTlVMTDsKKwlzdHJ1Y3QgZ3dfbm9kZSAqY3Vycl9ndyA9IE5VTEw7CisJYm9vbCByZXQsIG91dF9vZl9yYW5nZSA9IGZhbHNlOworCXVuc2lnbmVkIGludCBoZWFkZXJfbGVuID0gMDsKKwl1aW50OF90IGN1cnJfdHFfYXZnOwogCi0JLyogSWYgb2xkX2d3ICE9IE5VTEwgdGhlbiB0aGlzIHBhY2tldCBpcyB1bmljYXN0LgotCSAqIFNvLCBhdCB0aGlzIHBvaW50IHdlIGhhdmUgdG8gY2hlY2sgdGhlIG1lc3NhZ2UgdHlwZTogaWYgaXQgaXMgYQotCSAqIERIQ1BSRVFVRVNUIHdlIGhhdmUgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZHJvcCBpdCBvciBub3QgKi8KLQlpZiAob2xkX2d3ICYmIGN1cnJfZ3ctPm9yaWdfbm9kZSAhPSBvbGRfZ3cpIHsKLQkJaWYgKGlzX3R5cGVfZGhjcHJlcXVlc3Qoc2tiLCBoZWFkZXJfbGVuKSkgewotCQkJLyogSWYgdGhlIGRoY3AgcGFja2V0IGhhcyBiZWVuIHNlbnQgdG8gYSBkaWZmZXJlbnQgZ3csCi0JCQkgKiB3ZSBoYXZlIHRvIGV2YWx1YXRlIHdoZXRoZXIgdGhlIG9sZCBndyBpcyBzdGlsbAotCQkJICogcmVsaWFibGUgZW5vdWdoICovCi0JCQluZWlnaF9jdXJyID0gZmluZF9yb3V0ZXIoYmF0X3ByaXYsIGN1cnJfZ3ctPm9yaWdfbm9kZSwKLQkJCQkJCSBOVUxMKTsKLQkJCW5laWdoX29sZCA9IGZpbmRfcm91dGVyKGJhdF9wcml2LCBvbGRfZ3csIE5VTEwpOwotCQkJaWYgKCFuZWlnaF9jdXJyIHx8ICFuZWlnaF9vbGQpCi0JCQkJZ290byBmcmVlX25laWdoOwotCQkJaWYgKG5laWdoX2N1cnItPnRxX2F2ZyAtIG5laWdoX29sZC0+dHFfYXZnIDwKLQkJCQkJCQkJR1dfVEhSRVNIT0xEKQotCQkJCXJldCA9IC0xOwotCQl9CisJcmV0ID0gZ3dfaXNfZGhjcF90YXJnZXQoc2tiLCAmaGVhZGVyX2xlbik7CisJaWYgKCFyZXQpCisJCWdvdG8gb3V0OworCisJb3JpZ19kc3Rfbm9kZSA9IHRyYW5zdGFibGVfc2VhcmNoKGJhdF9wcml2LCBldGhoZHItPmhfc291cmNlLAorCQkJCQkgIGV0aGhkci0+aF9kZXN0KTsKKwlpZiAoIW9yaWdfZHN0X25vZGUpCisJCWdvdG8gb3V0OworCisJaWYgKCFvcmlnX2RzdF9ub2RlLT5nd19mbGFncykKKwkJZ290byBvdXQ7CisKKwlyZXQgPSBpc190eXBlX2RoY3ByZXF1ZXN0KHNrYiwgaGVhZGVyX2xlbik7CisJaWYgKCFyZXQpCisJCWdvdG8gb3V0OworCisJc3dpdGNoIChhdG9taWNfcmVhZCgmYmF0X3ByaXYtPmd3X21vZGUpKSB7CisJY2FzZSBHV19NT0RFX1NFUlZFUjoKKwkJLyogSWYgd2UgYXJlIGEgR1cgdGhlbiB3ZSBhcmUgb3VyIGJlc3QgR1cuIFdlIGNhbiBhcnRpZmljaWFsbHkKKwkJICogc2V0IHRoZSB0cSB0b3dhcmRzIG91cnNlbGYgYXMgdGhlIG1heGltdW0gdmFsdWUgKi8KKwkJY3Vycl90cV9hdmcgPSBUUV9NQVhfVkFMVUU7CisJCWJyZWFrOworCWNhc2UgR1dfTU9ERV9DTElFTlQ6CisJCWN1cnJfZ3cgPSBnd19nZXRfc2VsZWN0ZWRfZ3dfbm9kZShiYXRfcHJpdik7CisJCWlmICghY3Vycl9ndykKKwkJCWdvdG8gb3V0OworCisJCS8qIHBhY2tldCBpcyBnb2luZyB0byBvdXIgZ2F0ZXdheSAqLworCQlpZiAoY3Vycl9ndy0+b3JpZ19ub2RlID09IG9yaWdfZHN0X25vZGUpCisJCQlnb3RvIG91dDsKKworCQkvKiBJZiB0aGUgZGhjcCBwYWNrZXQgaGFzIGJlZW4gc2VudCB0byBhIGRpZmZlcmVudCBndywKKwkJICogd2UgaGF2ZSB0byBldmFsdWF0ZSB3aGV0aGVyIHRoZSBvbGQgZ3cgaXMgc3RpbGwKKwkJICogcmVsaWFibGUgZW5vdWdoICovCisJCW5laWdoX2N1cnIgPSBmaW5kX3JvdXRlcihiYXRfcHJpdiwgY3Vycl9ndy0+b3JpZ19ub2RlLCBOVUxMKTsKKwkJaWYgKCFuZWlnaF9jdXJyKQorCQkJZ290byBvdXQ7CisKKwkJY3Vycl90cV9hdmcgPSBuZWlnaF9jdXJyLT50cV9hdmc7CisJCWJyZWFrOworCWNhc2UgR1dfTU9ERV9PRkY6CisJZGVmYXVsdDoKKwkJZ290byBvdXQ7CiAJfQotZnJlZV9uZWlnaDoKKworCW5laWdoX29sZCA9IGZpbmRfcm91dGVyKGJhdF9wcml2LCBvcmlnX2RzdF9ub2RlLCBOVUxMKTsKKwlpZiAoIW5laWdoX29sZCkKKwkJZ290byBvdXQ7CisKKwlpZiAoY3Vycl90cV9hdmcgLSBuZWlnaF9vbGQtPnRxX2F2ZyA+IEdXX1RIUkVTSE9MRCkKKwkJb3V0X29mX3JhbmdlID0gdHJ1ZTsKKworb3V0OgorCWlmIChvcmlnX2RzdF9ub2RlKQorCQlvcmlnX25vZGVfZnJlZV9yZWYob3JpZ19kc3Rfbm9kZSk7CisJaWYgKGN1cnJfZ3cpCisJCWd3X25vZGVfZnJlZV9yZWYoY3Vycl9ndyk7CiAJaWYgKG5laWdoX29sZCkKIAkJbmVpZ2hfbm9kZV9mcmVlX3JlZihuZWlnaF9vbGQpOwogCWlmIChuZWlnaF9jdXJyKQogCQluZWlnaF9ub2RlX2ZyZWVfcmVmKG5laWdoX2N1cnIpOwotCWlmIChjdXJyX2d3KQotCQlnd19ub2RlX2ZyZWVfcmVmKGN1cnJfZ3cpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIG91dF9vZl9yYW5nZTsKIH0KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmggYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NsaWVudC5oCmluZGV4IGI5Yjk4M2MuLmUxZWRiYTAgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY2xpZW50LmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jbGllbnQuaApAQCAtMzEsNyArMzEsOCBAQAogdm9pZCBnd19ub2RlX2RlbGV0ZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUpOwogdm9pZCBnd19ub2RlX3B1cmdlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpOwogaW50IGd3X2NsaWVudF9zZXFfcHJpbnRfdGV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KTsKLWludCBnd19pc190YXJnZXQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJIHN0cnVjdCBvcmlnX25vZGUgKm9sZF9ndyk7Citib29sIGd3X2lzX2RoY3BfdGFyZ2V0KHN0cnVjdCBza19idWZmICpza2IsIHVuc2lnbmVkIGludCAqaGVhZGVyX2xlbik7Citib29sIGd3X291dF9vZl9yYW5nZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAorCQkgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBldGhoZHIgKmV0aGhkcik7CiAKICNlbmRpZiAvKiBfTkVUX0JBVE1BTl9BRFZfR0FURVdBWV9DTElFTlRfSF8gKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY29tbW9uLmMgYi9uZXQvYmF0bWFuLWFkdi9nYXRld2F5X2NvbW1vbi5jCmluZGV4IDE4NjYxYWYuLmM0YWM3YjAgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L2dhdGV3YXlfY29tbW9uLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvZ2F0ZXdheV9jb21tb24uYwpAQCAtOTcsNyArOTcsNyBAQAogCQkJKnRtcF9wdHIgPSAnXDAnOwogCX0KIAotCXJldCA9IHN0cmljdF9zdHJ0b2woYnVmZiwgMTAsICZsZG93bik7CisJcmV0ID0ga3N0cnRvbChidWZmLCAxMCwgJmxkb3duKTsKIAlpZiAocmV0KSB7CiAJCWJhdF9lcnIobmV0X2RldiwKIAkJCSJEb3dubG9hZCBzcGVlZCBvZiBnYXRld2F5IG1vZGUgaW52YWxpZDogJXNcbiIsCkBAIC0xMjIsNyArMTIyLDcgQEAKIAkJCQkqdG1wX3B0ciA9ICdcMCc7CiAJCX0KIAotCQlyZXQgPSBzdHJpY3Rfc3RydG9sKHNsYXNoX3B0ciArIDEsIDEwLCAmbHVwKTsKKwkJcmV0ID0ga3N0cnRvbChzbGFzaF9wdHIgKyAxLCAxMCwgJmx1cCk7CiAJCWlmIChyZXQpIHsKIAkJCWJhdF9lcnIobmV0X2RldiwKIAkJCQkiVXBsb2FkIHNwZWVkIG9mIGdhdGV3YXkgbW9kZSBpbnZhbGlkOiAiCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9oYXNoLmMgYi9uZXQvYmF0bWFuLWFkdi9oYXNoLmMKaW5kZXggMmExNzI1MC4uZDFkYTI5ZCAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvaGFzaC5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2hhc2guYwpAQCAtMjUsNyArMjUsNyBAQAogLyogY2xlYXJzIHRoZSBoYXNoICovCiBzdGF0aWMgdm9pZCBoYXNoX2luaXQoc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoKQogewotCWludCBpOworCXVpbnQzMl90IGk7CiAKIAlmb3IgKGkgPSAwIDsgaSA8IGhhc2gtPnNpemU7IGkrKykgewogCQlJTklUX0hMSVNUX0hFQUQoJmhhc2gtPnRhYmxlW2ldKTsKQEAgLTQyLDcgKzQyLDcgQEAKIH0KIAogLyogYWxsb2NhdGVzIGFuZCBjbGVhcnMgdGhlIGhhc2ggKi8KLXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaF9uZXcoaW50IHNpemUpCitzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2hfbmV3KHVpbnQzMl90IHNpemUpCiB7CiAJc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoOwogCmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9oYXNoLmggYi9uZXQvYmF0bWFuLWFkdi9oYXNoLmgKaW5kZXggZDIwYWE3MS4uNDc2ODcxNyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvaGFzaC5oCisrKyBiL25ldC9iYXRtYW4tYWR2L2hhc2guaApAQCAtMzMsMTcgKzMzLDE3IEBACiAvKiB0aGUgaGFzaGZ1bmN0aW9uLCBzaG91bGQgcmV0dXJuIGFuIGluZGV4CiAgKiBiYXNlZCBvbiB0aGUga2V5IGluIHRoZSBkYXRhIG9mIHRoZSBmaXJzdAogICogYXJndW1lbnQgYW5kIHRoZSBzaXplIHRoZSBzZWNvbmQgKi8KLXR5cGVkZWYgaW50ICgqaGFzaGRhdGFfY2hvb3NlX2NiKShjb25zdCB2b2lkICosIGludCk7Cit0eXBlZGVmIHVpbnQzMl90ICgqaGFzaGRhdGFfY2hvb3NlX2NiKShjb25zdCB2b2lkICosIHVpbnQzMl90KTsKIHR5cGVkZWYgdm9pZCAoKmhhc2hkYXRhX2ZyZWVfY2IpKHN0cnVjdCBobGlzdF9ub2RlICosIHZvaWQgKik7CiAKIHN0cnVjdCBoYXNodGFibGVfdCB7CiAJc3RydWN0IGhsaXN0X2hlYWQgKnRhYmxlOyAgIC8qIHRoZSBoYXNodGFibGUgaXRzZWxmIHdpdGggdGhlIGJ1Y2tldHMgKi8KIAlzcGlubG9ja190ICpsaXN0X2xvY2tzOyAgICAgLyogc3BpbmxvY2sgZm9yIGVhY2ggaGFzaCBsaXN0IGVudHJ5ICovCi0JaW50IHNpemU7CQkgICAgLyogc2l6ZSBvZiBoYXNodGFibGUgKi8KKwl1aW50MzJfdCBzaXplOwkJICAgIC8qIHNpemUgb2YgaGFzaHRhYmxlICovCiB9OwogCiAvKiBhbGxvY2F0ZXMgYW5kIGNsZWFycyB0aGUgaGFzaCAqLwotc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoX25ldyhpbnQgc2l6ZSk7CitzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2hfbmV3KHVpbnQzMl90IHNpemUpOwogCiAvKiBmcmVlIG9ubHkgdGhlIGhhc2h0YWJsZSBhbmQgdGhlIGhhc2ggaXRzZWxmLiAqLwogdm9pZCBoYXNoX2Rlc3Ryb3koc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoKTsKQEAgLTU3LDcgKzU3LDcgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfdG1wOwogCXNwaW5sb2NrX3QgKmxpc3RfbG9jazsgLyogc3BpbmxvY2sgdG8gcHJvdGVjdCB3cml0ZSBhY2Nlc3MgKi8KLQlpbnQgaTsKKwl1aW50MzJfdCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgewogCQloZWFkID0gJmhhc2gtPnRhYmxlW2ldOwpAQCAtOTMsNyArOTMsOCBAQAogCQkJICAgaGFzaGRhdGFfY2hvb3NlX2NiIGNob29zZSwKIAkJCSAgIGNvbnN0IHZvaWQgKmRhdGEsIHN0cnVjdCBobGlzdF9ub2RlICpkYXRhX25vZGUpCiB7Ci0JaW50IGluZGV4LCByZXQgPSAtMTsKKwl1aW50MzJfdCBpbmRleDsKKwlpbnQgcmV0ID0gLTE7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJc3BpbmxvY2tfdCAqbGlzdF9sb2NrOyAvKiBzcGlubG9jayB0byBwcm90ZWN0IHdyaXRlIGFjY2VzcyAqLwpAQCAtMTM3LDcgKzEzOCw3IEBACiAJCQkJaGFzaGRhdGFfY29tcGFyZV9jYiBjb21wYXJlLAogCQkJCWhhc2hkYXRhX2Nob29zZV9jYiBjaG9vc2UsIHZvaWQgKmRhdGEpCiB7Ci0Jc2l6ZV90IGluZGV4OworCXVpbnQzMl90IGluZGV4OwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwogCXZvaWQgKmRhdGFfc2F2ZSA9IE5VTEw7CmRpZmYgLS1naXQgYS9uZXQvYmF0bWFuLWFkdi9pY21wX3NvY2tldC5jIGIvbmV0L2JhdG1hbi1hZHYvaWNtcF9zb2NrZXQuYwppbmRleCBhYzM1MjBlLi5kOWMxZTdiIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9pY21wX3NvY2tldC5jCisrKyBiL25ldC9iYXRtYW4tYWR2L2ljbXBfc29ja2V0LmMKQEAgLTEzNiwxMCArMTM2LDkgQEAKIAogCXNwaW5fdW5sb2NrX2JoKCZzb2NrZXRfY2xpZW50LT5sb2NrKTsKIAotCWVycm9yID0gX19jb3B5X3RvX3VzZXIoYnVmLCAmc29ja2V0X3BhY2tldC0+aWNtcF9wYWNrZXQsCi0JCQkgICAgICAgc29ja2V0X3BhY2tldC0+aWNtcF9sZW4pOworCXBhY2tldF9sZW4gPSBtaW4oY291bnQsIHNvY2tldF9wYWNrZXQtPmljbXBfbGVuKTsKKwllcnJvciA9IGNvcHlfdG9fdXNlcihidWYsICZzb2NrZXRfcGFja2V0LT5pY21wX3BhY2tldCwgcGFja2V0X2xlbik7CiAKLQlwYWNrZXRfbGVuID0gc29ja2V0X3BhY2tldC0+aWNtcF9sZW47CiAJa2ZyZWUoc29ja2V0X3BhY2tldCk7CiAKIAlpZiAoZXJyb3IpCkBAIC0xODcsMTIgKzE4Niw3IEBACiAJc2tiX3Jlc2VydmUoc2tiLCBzaXplb2Yoc3RydWN0IGV0aGhkcikpOwogCWljbXBfcGFja2V0ID0gKHN0cnVjdCBpY21wX3BhY2tldF9yciAqKXNrYl9wdXQoc2tiLCBwYWNrZXRfbGVuKTsKIAotCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmLCBwYWNrZXRfbGVuKSkgewotCQlsZW4gPSAtRUZBVUxUOwotCQlnb3RvIGZyZWVfc2tiOwotCX0KLQotCWlmIChfX2NvcHlfZnJvbV91c2VyKGljbXBfcGFja2V0LCBidWZmLCBwYWNrZXRfbGVuKSkgeworCWlmIChjb3B5X2Zyb21fdXNlcihpY21wX3BhY2tldCwgYnVmZiwgcGFja2V0X2xlbikpIHsKIAkJbGVuID0gLUVGQVVMVDsKIAkJZ290byBmcmVlX3NrYjsKIAl9CkBAIC0yMTcsNyArMjExLDcgQEAKIAogCWlmIChpY21wX3BhY2tldC0+dmVyc2lvbiAhPSBDT01QQVRfVkVSU0lPTikgewogCQlpY21wX3BhY2tldC0+bXNnX3R5cGUgPSBQQVJBTUVURVJfUFJPQkxFTTsKLQkJaWNtcF9wYWNrZXQtPnR0bCA9IENPTVBBVF9WRVJTSU9OOworCQlpY21wX3BhY2tldC0+dmVyc2lvbiA9IENPTVBBVF9WRVJTSU9OOwogCQliYXRfc29ja2V0X2FkZF9wYWNrZXQoc29ja2V0X2NsaWVudCwgaWNtcF9wYWNrZXQsIHBhY2tldF9sZW4pOwogCQlnb3RvIGZyZWVfc2tiOwogCX0KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L21haW4uaCBiL25ldC9iYXRtYW4tYWR2L21haW4uaAppbmRleCA5NjRhZDRkLi44NjM1NGUwIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9tYWluLmgKKysrIGIvbmV0L2JhdG1hbi1hZHYvbWFpbi5oCkBAIC0yOCw3ICsyOCw3IEBACiAjZGVmaW5lIERSSVZFUl9ERVZJQ0UgImJhdG1hbi1hZHYiCiAKICNpZm5kZWYgU09VUkNFX1ZFUlNJT04KLSNkZWZpbmUgU09VUkNFX1ZFUlNJT04gIjIwMTEuNC4wIgorI2RlZmluZSBTT1VSQ0VfVkVSU0lPTiAiMjAxMi4wLjAiCiAjZW5kaWYKIAogLyogQi5BLlQuTS5BLk4uIHBhcmFtZXRlcnMgKi8KZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYyBiL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuYwppbmRleCAwZTViNzcyLi4wYmMyMDQ1IDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5jCkBAIC0xNjQsNyArMTY0LDcgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKIAlzcGlubG9ja190ICpsaXN0X2xvY2s7IC8qIHNwaW5sb2NrIHRvIHByb3RlY3Qgd3JpdGUgYWNjZXNzICovCiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwotCWludCBpOworCXVpbnQzMl90IGk7CiAKIAlpZiAoIWhhc2gpCiAJCXJldHVybjsKQEAgLTM1MCw3ICszNTAsNyBAQAogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwogCXNwaW5sb2NrX3QgKmxpc3RfbG9jazsgLyogc3BpbmxvY2sgdG8gcHJvdGVjdCB3cml0ZSBhY2Nlc3MgKi8KIAlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7Ci0JaW50IGk7CisJdWludDMyX3QgaTsKIAogCWlmICghaGFzaCkKIAkJcmV0dXJuOwpAQCAtNDEzLDcgKzQxMyw4IEBACiAJaW50IGJhdG1hbl9jb3VudCA9IDA7CiAJaW50IGxhc3Rfc2Vlbl9zZWNzOwogCWludCBsYXN0X3NlZW5fbXNlY3M7Ci0JaW50IGksIHJldCA9IDA7CisJdWludDMyX3QgaTsKKwlpbnQgcmV0ID0gMDsKIAogCXByaW1hcnlfaWYgPSBwcmltYXJ5X2lmX2dldF9zZWxlY3RlZChiYXRfcHJpdik7CiAKQEAgLTUxOSw3ICs1MjAsOCBAQAogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwogCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlpbnQgaSwgcmV0OworCXVpbnQzMl90IGk7CisJaW50IHJldDsKIAogCS8qIHJlc2l6ZSBhbGwgb3JpZyBub2RlcyBiZWNhdXNlIG9yaWdfbm9kZS0+YmNhc3Rfb3duKF9zdW0pIGRlcGVuZCBvbgogCSAqIGlmX251bSAqLwpAQCAtNjAxLDcgKzYwMyw4IEBACiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2VfdG1wOwogCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZTsKLQlpbnQgaSwgcmV0OworCXVpbnQzMl90IGk7CisJaW50IHJldDsKIAogCS8qIHJlc2l6ZSBhbGwgb3JpZyBub2RlcyBiZWNhdXNlIG9yaWdfbm9kZS0+YmNhc3Rfb3duKF9zdW0pIGRlcGVuZCBvbgogCSAqIGlmX251bSAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oIGIvbmV0L2JhdG1hbi1hZHYvb3JpZ2luYXRvci5oCmluZGV4IGNmYzFmNjAuLjY3NzY1ZmYgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L29yaWdpbmF0b3IuaAorKysgYi9uZXQvYmF0bWFuLWFkdi9vcmlnaW5hdG9yLmgKQEAgLTQyLDcgKzQyLDcgQEAKIAogLyogaGFzaGZ1bmN0aW9uIHRvIGNob29zZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUgb2YgZ2l2ZW4gc2l6ZSAqLwogLyogaGFzaCBhbGdvcml0aG0gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2hfdGFibGUgKi8KLXN0YXRpYyBpbmxpbmUgaW50IGNob29zZV9vcmlnKGNvbnN0IHZvaWQgKmRhdGEsIGludDMyX3Qgc2l6ZSkKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgY2hvb3NlX29yaWcoY29uc3Qgdm9pZCAqZGF0YSwgdWludDMyX3Qgc2l6ZSkKIHsKIAljb25zdCB1bnNpZ25lZCBjaGFyICprZXkgPSBkYXRhOwogCXVpbnQzMl90IGhhc2ggPSAwOwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvcm91dGluZy5jIGIvbmV0L2JhdG1hbi1hZHYvcm91dGluZy5jCmluZGV4IGY5NjFjYzUuLjc3M2U2MDYgMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3JvdXRpbmcuYworKysgYi9uZXQvYmF0bWFuLWFkdi9yb3V0aW5nLmMKQEAgLTM5LDcgKzM5LDcgQEAKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKIAlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CiAJdW5zaWduZWQgbG9uZyAqd29yZDsKLQlpbnQgaTsKKwl1aW50MzJfdCBpOwogCXNpemVfdCB3b3JkX2luZGV4OwogCiAJZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgewpAQCAtNTc4LDYgKzU3OCw3IEBACiB7CiAJc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiA9IG5ldGRldl9wcml2KHJlY3ZfaWYtPnNvZnRfaWZhY2UpOwogCXN0cnVjdCB0dF9xdWVyeV9wYWNrZXQgKnR0X3F1ZXJ5OworCXVpbnQxNl90IHR0X2xlbjsKIAlzdHJ1Y3QgZXRoaGRyICpldGhoZHI7CiAKIAkvKiBkcm9wIHBhY2tldCBpZiBpdCBoYXMgbm90IG5lY2Vzc2FyeSBtaW5pbXVtIHNpemUgKi8KQEAgLTYxNiwxMyArNjE3LDIxIEBACiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBUVF9SRVNQT05TRToKLQkJLyogcGFja2V0IG5lZWRzIHRvIGJlIGxpbmVhcml6ZWQgdG8gYWNjZXNzIHRoZSBUVCBjaGFuZ2VzICovCi0JCWlmIChza2JfbGluZWFyaXplKHNrYikgPCAwKQotCQkJZ290byBvdXQ7CisJCWlmIChpc19teV9tYWModHRfcXVlcnktPmRzdCkpIHsKKwkJCS8qIHBhY2tldCBuZWVkcyB0byBiZSBsaW5lYXJpemVkIHRvIGFjY2VzcyB0aGUgVFQKKwkJCSAqIGNoYW5nZXMgKi8KKwkJCWlmIChza2JfbGluZWFyaXplKHNrYikgPCAwKQorCQkJCWdvdG8gb3V0OwogCi0JCWlmIChpc19teV9tYWModHRfcXVlcnktPmRzdCkpCisJCQl0dF9sZW4gPSB0dF9xdWVyeS0+dHRfZGF0YSAqIHNpemVvZihzdHJ1Y3QgdHRfY2hhbmdlKTsKKworCQkJLyogRW5zdXJlIHdlIGhhdmUgYWxsIHRoZSBjbGFpbWVkIGRhdGEgKi8KKwkJCWlmICh1bmxpa2VseShza2JfaGVhZGxlbihza2IpIDwKKwkJCQkgICAgIHNpemVvZihzdHJ1Y3QgdHRfcXVlcnlfcGFja2V0KSArIHR0X2xlbikpCisJCQkJZ290byBvdXQ7CisKIAkJCWhhbmRsZV90dF9yZXNwb25zZShiYXRfcHJpdiwgdHRfcXVlcnkpOwotCQllbHNlIHsKKwkJfSBlbHNlIHsKIAkJCWJhdF9kYmcoREJHX1RULCBiYXRfcHJpdiwKIAkJCQkiUm91dGluZyBUVF9SRVNQT05TRSB0byAlcE0gWyVjXVxuIiwKIAkJCQl0dF9xdWVyeS0+ZHN0LApkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYyBiL25ldC9iYXRtYW4tYWR2L3NvZnQtaW50ZXJmYWNlLmMKaW5kZXggZjljYzk1Ny4uOTg3Yzc1YSAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvc29mdC1pbnRlcmZhY2UuYworKysgYi9uZXQvYmF0bWFuLWFkdi9zb2Z0LWludGVyZmFjZS5jCkBAIC01NjMsMTAgKzU2MywxMCBAQAogCXN0cnVjdCBiY2FzdF9wYWNrZXQgKmJjYXN0X3BhY2tldDsKIAlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZoZHI7CiAJc3RydWN0IHNvZnRpZl9uZWlnaCAqY3Vycl9zb2Z0aWZfbmVpZ2ggPSBOVUxMOwotCXN0cnVjdCBvcmlnX25vZGUgKm9yaWdfbm9kZSA9IE5VTEw7CisJdW5zaWduZWQgaW50IGhlYWRlcl9sZW4gPSAwOwogCWludCBkYXRhX2xlbiA9IHNrYi0+bGVuLCByZXQ7CiAJc2hvcnQgdmlkID0gLTE7Ci0JYm9vbCBkb19iY2FzdDsKKwlib29sIGRvX2JjYXN0ID0gZmFsc2U7CiAKIAlpZiAoYXRvbWljX3JlYWQoJmJhdF9wcml2LT5tZXNoX3N0YXRlKSAhPSBNRVNIX0FDVElWRSkKIAkJZ290byBkcm9wcGVkOwpAQCAtNTk4LDE3ICs1OTgsMjggQEAKIAkvKiBSZWdpc3RlciB0aGUgY2xpZW50IE1BQyBpbiB0aGUgdHJhbnN0YWJsZSAqLwogCXR0X2xvY2FsX2FkZChzb2Z0X2lmYWNlLCBldGhoZHItPmhfc291cmNlLCBza2ItPnNrYl9paWYpOwogCi0Jb3JpZ19ub2RlID0gdHJhbnN0YWJsZV9zZWFyY2goYmF0X3ByaXYsIGV0aGhkci0+aF9zb3VyY2UsCi0JCQkJICAgICAgZXRoaGRyLT5oX2Rlc3QpOwotCWRvX2JjYXN0ID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoZXRoaGRyLT5oX2Rlc3QpOwotCWlmIChkb19iY2FzdCB8fCAob3JpZ19ub2RlICYmIG9yaWdfbm9kZS0+Z3dfZmxhZ3MpKSB7Ci0JCXJldCA9IGd3X2lzX3RhcmdldChiYXRfcHJpdiwgc2tiLCBvcmlnX25vZGUpOworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihldGhoZHItPmhfZGVzdCkpIHsKKwkJZG9fYmNhc3QgPSB0cnVlOwogCi0JCWlmIChyZXQgPCAwKQotCQkJZ290byBkcm9wcGVkOwotCi0JCWlmIChyZXQpCi0JCQlkb19iY2FzdCA9IGZhbHNlOworCQlzd2l0Y2ggKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3dfbW9kZSkpIHsKKwkJY2FzZSBHV19NT0RFX1NFUlZFUjoKKwkJCS8qIGdhdGV3YXkgc2VydmVycyBzaG91bGQgbm90IHNlbmQgZGhjcAorCQkJICogcmVxdWVzdHMgaW50byB0aGUgbWVzaCAqLworCQkJcmV0ID0gZ3dfaXNfZGhjcF90YXJnZXQoc2tiLCAmaGVhZGVyX2xlbik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gZHJvcHBlZDsKKwkJCWJyZWFrOworCQljYXNlIEdXX01PREVfQ0xJRU5UOgorCQkJLyogZ2F0ZXdheSBjbGllbnRzIHNob3VsZCBzZW5kIGRoY3AgcmVxdWVzdHMKKwkJCSAqIHZpYSB1bmljYXN0IHRvIHRoZWlyIGdhdGV3YXkgKi8KKwkJCXJldCA9IGd3X2lzX2RoY3BfdGFyZ2V0KHNrYiwgJmhlYWRlcl9sZW4pOworCQkJaWYgKHJldCkKKwkJCQlkb19iY2FzdCA9IGZhbHNlOworCQkJYnJlYWs7CisJCWNhc2UgR1dfTU9ERV9PRkY6CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQogCX0KIAogCS8qIGV0aGVybmV0IHBhY2tldCBzaG91bGQgYmUgYnJvYWRjYXN0ZWQgKi8KQEAgLTY0NCw2ICs2NTUsMTIgQEAKIAogCS8qIHVuaWNhc3QgcGFja2V0ICovCiAJfSBlbHNlIHsKKwkJaWYgKGF0b21pY19yZWFkKCZiYXRfcHJpdi0+Z3dfbW9kZSkgIT0gR1dfTU9ERV9PRkYpIHsKKwkJCXJldCA9IGd3X291dF9vZl9yYW5nZShiYXRfcHJpdiwgc2tiLCBldGhoZHIpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIGRyb3BwZWQ7CisJCX0KKwogCQlyZXQgPSB1bmljYXN0X3NlbmRfc2tiKHNrYiwgYmF0X3ByaXYpOwogCQlpZiAocmV0ICE9IDApCiAJCQlnb3RvIGRyb3BwZWRfZnJlZWQ7CkBAIC02NjIsOCArNjc5LDYgQEAKIAkJc29mdGlmX25laWdoX2ZyZWVfcmVmKGN1cnJfc29mdGlmX25laWdoKTsKIAlpZiAocHJpbWFyeV9pZikKIAkJaGFyZGlmX2ZyZWVfcmVmKHByaW1hcnlfaWYpOwotCWlmIChvcmlnX25vZGUpCi0JCW9yaWdfbm9kZV9mcmVlX3JlZihvcmlnX25vZGUpOwogCXJldHVybiBORVRERVZfVFhfT0s7CiB9CiAKQEAgLTg1OSw3ICs4NzQsNyBAQAogdW5yZWdfc3lzZnM6CiAJc3lzZnNfZGVsX21lc2hpZihzb2Z0X2lmYWNlKTsKIHVucmVnX3NvZnRfaWZhY2U6Ci0JdW5yZWdpc3Rlcl9uZXRkZXYoc29mdF9pZmFjZSk7CisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Uoc29mdF9pZmFjZSk7CiAJcmV0dXJuIE5VTEw7CiAKIGZyZWVfc29mdF9pZmFjZToKZGlmZiAtLWdpdCBhL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMgYi9uZXQvYmF0bWFuLWFkdi90cmFuc2xhdGlvbi10YWJsZS5jCmluZGV4IGM3YWFmYzcuLmFiOGRlYTggMTAwNjQ0Ci0tLSBhL25ldC9iYXRtYW4tYWR2L3RyYW5zbGF0aW9uLXRhYmxlLmMKKysrIGIvbmV0L2JhdG1hbi1hZHYvdHJhbnNsYXRpb24tdGFibGUuYwpAQCAtMzYsMTggKzM2LDkgQEAKIHN0YXRpYyB2b2lkIHR0X3B1cmdlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIC8qIHJldHVybnMgMSBpZiB0aGV5IGFyZSB0aGUgc2FtZSBtYWMgYWRkciAqLwotc3RhdGljIGludCBjb21wYXJlX2x0dChjb25zdCBzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgY29uc3Qgdm9pZCAqZGF0YTIpCitzdGF0aWMgaW50IGNvbXBhcmVfdHQoY29uc3Qgc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsIGNvbnN0IHZvaWQgKmRhdGEyKQogewotCWNvbnN0IHZvaWQgKmRhdGExID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCB0dF9sb2NhbF9lbnRyeSwKLQkJCQkJIGhhc2hfZW50cnkpOwotCi0JcmV0dXJuIChtZW1jbXAoZGF0YTEsIGRhdGEyLCBFVEhfQUxFTikgPT0gMCA/IDEgOiAwKTsKLX0KLQotLyogcmV0dXJucyAxIGlmIHRoZXkgYXJlIHRoZSBzYW1lIG1hYyBhZGRyICovCi1zdGF0aWMgaW50IGNvbXBhcmVfZ3R0KGNvbnN0IHN0cnVjdCBobGlzdF9ub2RlICpub2RlLCBjb25zdCB2b2lkICpkYXRhMikKLXsKLQljb25zdCB2b2lkICpkYXRhMSA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5LAorCWNvbnN0IHZvaWQgKmRhdGExID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCB0dF9jb21tb25fZW50cnksCiAJCQkJCSBoYXNoX2VudHJ5KTsKIAogCXJldHVybiAobWVtY21wKGRhdGExLCBkYXRhMiwgRVRIX0FMRU4pID09IDAgPyAxIDogMCk7CkBAIC02MCwxNCArNTEsMTMgQEAKIAkJCSAgIG1zZWNzX3RvX2ppZmZpZXMoNTAwMCkpOwogfQogCi1zdGF0aWMgc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9oYXNoX2ZpbmQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKLQkJCQkJCSBjb25zdCB2b2lkICpkYXRhKQorc3RhdGljIHN0cnVjdCB0dF9jb21tb25fZW50cnkgKnR0X2hhc2hfZmluZChzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2gsCisJCQkJCSAgICBjb25zdCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCA9IGJhdF9wcml2LT50dF9sb2NhbF9oYXNoOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCXN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnksICp0dF9sb2NhbF9lbnRyeV90bXAgPSBOVUxMOwotCWludCBpbmRleDsKKwlzdHJ1Y3QgdHRfY29tbW9uX2VudHJ5ICp0dF9jb21tb25fZW50cnksICp0dF9jb21tb25fZW50cnlfdG1wID0gTlVMTDsKKwl1aW50MzJfdCBpbmRleDsKIAogCWlmICghaGFzaCkKIAkJcmV0dXJuIE5VTEw7CkBAIC03Niw1MSArNjYsNDYgQEAKIAloZWFkID0gJmhhc2gtPnRhYmxlW2luZGV4XTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfbG9jYWxfZW50cnksIG5vZGUsIGhlYWQsIGhhc2hfZW50cnkpIHsKLQkJaWYgKCFjb21wYXJlX2V0aCh0dF9sb2NhbF9lbnRyeSwgZGF0YSkpCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHR0X2NvbW1vbl9lbnRyeSwgbm9kZSwgaGVhZCwgaGFzaF9lbnRyeSkgeworCQlpZiAoIWNvbXBhcmVfZXRoKHR0X2NvbW1vbl9lbnRyeSwgZGF0YSkpCiAJCQljb250aW51ZTsKIAotCQlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJnR0X2xvY2FsX2VudHJ5LT5yZWZjb3VudCkpCisJCWlmICghYXRvbWljX2luY19ub3RfemVybygmdHRfY29tbW9uX2VudHJ5LT5yZWZjb3VudCkpCiAJCQljb250aW51ZTsKIAotCQl0dF9sb2NhbF9lbnRyeV90bXAgPSB0dF9sb2NhbF9lbnRyeTsKKwkJdHRfY29tbW9uX2VudHJ5X3RtcCA9IHR0X2NvbW1vbl9lbnRyeTsKIAkJYnJlYWs7CiAJfQogCXJjdV9yZWFkX3VubG9jaygpOwogCi0JcmV0dXJuIHR0X2xvY2FsX2VudHJ5X3RtcDsKKwlyZXR1cm4gdHRfY29tbW9uX2VudHJ5X3RtcDsKK30KKworc3RhdGljIHN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfaGFzaF9maW5kKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsCisJCQkJCQkgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdHRfY29tbW9uX2VudHJ5ICp0dF9jb21tb25fZW50cnk7CisJc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeSA9IE5VTEw7CisKKwl0dF9jb21tb25fZW50cnkgPSB0dF9oYXNoX2ZpbmQoYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2gsIGRhdGEpOworCWlmICh0dF9jb21tb25fZW50cnkpCisJCXR0X2xvY2FsX2VudHJ5ID0gY29udGFpbmVyX29mKHR0X2NvbW1vbl9lbnRyeSwKKwkJCQkJICAgICAgc3RydWN0IHR0X2xvY2FsX2VudHJ5LCBjb21tb24pOworCXJldHVybiB0dF9sb2NhbF9lbnRyeTsKIH0KIAogc3RhdGljIHN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9oYXNoX2ZpbmQoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwKIAkJCQkJCSAgIGNvbnN0IHZvaWQgKmRhdGEpCiB7Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoID0gYmF0X3ByaXYtPnR0X2dsb2JhbF9oYXNoOwotCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwotCXN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKLQlzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5ICp0dF9nbG9iYWxfZW50cnlfdG1wID0gTlVMTDsKLQlpbnQgaW5kZXg7CisJc3RydWN0IHR0X2NvbW1vbl9lbnRyeSAqdHRfY29tbW9uX2VudHJ5OworCXN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeSA9IE5VTEw7CiAKLQlpZiAoIWhhc2gpCi0JCXJldHVybiBOVUxMOworCXR0X2NvbW1vbl9lbnRyeSA9IHR0X2hhc2hfZmluZChiYXRfcHJpdi0+dHRfZ2xvYmFsX2hhc2gsIGRhdGEpOworCWlmICh0dF9jb21tb25fZW50cnkpCisJCXR0X2dsb2JhbF9lbnRyeSA9IGNvbnRhaW5lcl9vZih0dF9jb21tb25fZW50cnksCisJCQkJCSAgICAgICBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5LCBjb21tb24pOworCXJldHVybiB0dF9nbG9iYWxfZW50cnk7CiAKLQlpbmRleCA9IGNob29zZV9vcmlnKGRhdGEsIGhhc2gtPnNpemUpOwotCWhlYWQgPSAmaGFzaC0+dGFibGVbaW5kZXhdOwotCi0JcmN1X3JlYWRfbG9jaygpOwotCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0dF9nbG9iYWxfZW50cnksIG5vZGUsIGhlYWQsIGhhc2hfZW50cnkpIHsKLQkJaWYgKCFjb21wYXJlX2V0aCh0dF9nbG9iYWxfZW50cnksIGRhdGEpKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFhdG9taWNfaW5jX25vdF96ZXJvKCZ0dF9nbG9iYWxfZW50cnktPnJlZmNvdW50KSkKLQkJCWNvbnRpbnVlOwotCi0JCXR0X2dsb2JhbF9lbnRyeV90bXAgPSB0dF9nbG9iYWxfZW50cnk7Ci0JCWJyZWFrOwotCX0KLQlyY3VfcmVhZF91bmxvY2soKTsKLQotCXJldHVybiB0dF9nbG9iYWxfZW50cnlfdG1wOwogfQogCiBzdGF0aWMgYm9vbCBpc19vdXRfb2ZfdGltZSh1bnNpZ25lZCBsb25nIHN0YXJ0aW5nX3RpbWUsIHVuc2lnbmVkIGxvbmcgdGltZW91dCkKQEAgLTEzMywxNSArMTE4LDE4IEBACiAKIHN0YXRpYyB2b2lkIHR0X2xvY2FsX2VudHJ5X2ZyZWVfcmVmKHN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnkpCiB7Ci0JaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJnR0X2xvY2FsX2VudHJ5LT5yZWZjb3VudCkpCi0JCWtmcmVlX3JjdSh0dF9sb2NhbF9lbnRyeSwgcmN1KTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdHRfbG9jYWxfZW50cnktPmNvbW1vbi5yZWZjb3VudCkpCisJCWtmcmVlX3JjdSh0dF9sb2NhbF9lbnRyeSwgY29tbW9uLnJjdSk7CiB9CiAKIHN0YXRpYyB2b2lkIHR0X2dsb2JhbF9lbnRyeV9mcmVlX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKIHsKKwlzdHJ1Y3QgdHRfY29tbW9uX2VudHJ5ICp0dF9jb21tb25fZW50cnk7CiAJc3RydWN0IHR0X2dsb2JhbF9lbnRyeSAqdHRfZ2xvYmFsX2VudHJ5OwogCi0JdHRfZ2xvYmFsX2VudHJ5ID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHR0X2dsb2JhbF9lbnRyeSwgcmN1KTsKKwl0dF9jb21tb25fZW50cnkgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgdHRfY29tbW9uX2VudHJ5LCByY3UpOworCXR0X2dsb2JhbF9lbnRyeSA9IGNvbnRhaW5lcl9vZih0dF9jb21tb25fZW50cnksIHN0cnVjdCB0dF9nbG9iYWxfZW50cnksCisJCQkJICAgICAgIGNvbW1vbik7CiAKIAlpZiAodHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUpCiAJCW9yaWdfbm9kZV9mcmVlX3JlZih0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSk7CkBAIC0xNTEsOCArMTM5LDkgQEAKIAogc3RhdGljIHZvaWQgdHRfZ2xvYmFsX2VudHJ5X2ZyZWVfcmVmKHN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeSkKIHsKLQlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdHRfZ2xvYmFsX2VudHJ5LT5yZWZjb3VudCkpCi0JCWNhbGxfcmN1KCZ0dF9nbG9iYWxfZW50cnktPnJjdSwgdHRfZ2xvYmFsX2VudHJ5X2ZyZWVfcmN1KTsKKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdHRfZ2xvYmFsX2VudHJ5LT5jb21tb24ucmVmY291bnQpKQorCQljYWxsX3JjdSgmdHRfZ2xvYmFsX2VudHJ5LT5jb21tb24ucmN1LAorCQkJIHR0X2dsb2JhbF9lbnRyeV9mcmVlX3JjdSk7CiB9CiAKIHN0YXRpYyB2b2lkIHR0X2xvY2FsX2V2ZW50KHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYsIGNvbnN0IHVpbnQ4X3QgKmFkZHIsCkBAIC0yMDEsNiArMTkwLDcgQEAKIAlzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2ID0gbmV0ZGV2X3ByaXYoc29mdF9pZmFjZSk7CiAJc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeSA9IE5VTEw7CiAJc3RydWN0IHR0X2dsb2JhbF9lbnRyeSAqdHRfZ2xvYmFsX2VudHJ5ID0gTlVMTDsKKwlpbnQgaGFzaF9hZGRlZDsKIAogCXR0X2xvY2FsX2VudHJ5ID0gdHRfbG9jYWxfaGFzaF9maW5kKGJhdF9wcml2LCBhZGRyKTsKIApAQCAtMjE3LDI2ICsyMDcsMzMgQEAKIAkJIkNyZWF0aW5nIG5ldyBsb2NhbCB0dCBlbnRyeTogJXBNICh0dHZuOiAlZClcbiIsIGFkZHIsCiAJCSh1aW50OF90KWF0b21pY19yZWFkKCZiYXRfcHJpdi0+dHR2bikpOwogCi0JbWVtY3B5KHR0X2xvY2FsX2VudHJ5LT5hZGRyLCBhZGRyLCBFVEhfQUxFTik7Ci0JdHRfbG9jYWxfZW50cnktPmxhc3Rfc2VlbiA9IGppZmZpZXM7Ci0JdHRfbG9jYWxfZW50cnktPmZsYWdzID0gTk9fRkxBR1M7CisJbWVtY3B5KHR0X2xvY2FsX2VudHJ5LT5jb21tb24uYWRkciwgYWRkciwgRVRIX0FMRU4pOworCXR0X2xvY2FsX2VudHJ5LT5jb21tb24uZmxhZ3MgPSBOT19GTEFHUzsKIAlpZiAoaXNfd2lmaV9pZmFjZShpZmluZGV4KSkKLQkJdHRfbG9jYWxfZW50cnktPmZsYWdzIHw9IFRUX0NMSUVOVF9XSUZJOwotCWF0b21pY19zZXQoJnR0X2xvY2FsX2VudHJ5LT5yZWZjb3VudCwgMik7CisJCXR0X2xvY2FsX2VudHJ5LT5jb21tb24uZmxhZ3MgfD0gVFRfQ0xJRU5UX1dJRkk7CisJYXRvbWljX3NldCgmdHRfbG9jYWxfZW50cnktPmNvbW1vbi5yZWZjb3VudCwgMik7CisJdHRfbG9jYWxfZW50cnktPmxhc3Rfc2VlbiA9IGppZmZpZXM7CiAKIAkvKiB0aGUgYmF0bWFuIGludGVyZmFjZSBtYWMgYWRkcmVzcyBzaG91bGQgbmV2ZXIgYmUgcHVyZ2VkICovCiAJaWYgKGNvbXBhcmVfZXRoKGFkZHIsIHNvZnRfaWZhY2UtPmRldl9hZGRyKSkKLQkJdHRfbG9jYWxfZW50cnktPmZsYWdzIHw9IFRUX0NMSUVOVF9OT1BVUkdFOworCQl0dF9sb2NhbF9lbnRyeS0+Y29tbW9uLmZsYWdzIHw9IFRUX0NMSUVOVF9OT1BVUkdFOwogCi0JdHRfbG9jYWxfZXZlbnQoYmF0X3ByaXYsIGFkZHIsIHR0X2xvY2FsX2VudHJ5LT5mbGFncyk7CisJaGFzaF9hZGRlZCA9IGhhc2hfYWRkKGJhdF9wcml2LT50dF9sb2NhbF9oYXNoLCBjb21wYXJlX3R0LCBjaG9vc2Vfb3JpZywKKwkJCSAmdHRfbG9jYWxfZW50cnktPmNvbW1vbiwKKwkJCSAmdHRfbG9jYWxfZW50cnktPmNvbW1vbi5oYXNoX2VudHJ5KTsKKworCWlmICh1bmxpa2VseShoYXNoX2FkZGVkICE9IDApKSB7CisJCS8qIHJlbW92ZSB0aGUgcmVmZXJlbmNlIGZvciB0aGUgaGFzaCAqLworCQl0dF9sb2NhbF9lbnRyeV9mcmVlX3JlZih0dF9sb2NhbF9lbnRyeSk7CisJCWdvdG8gb3V0OworCX0KKworCXR0X2xvY2FsX2V2ZW50KGJhdF9wcml2LCBhZGRyLCB0dF9sb2NhbF9lbnRyeS0+Y29tbW9uLmZsYWdzKTsKIAogCS8qIFRoZSBsb2NhbCBlbnRyeSBoYXMgdG8gYmUgbWFya2VkIGFzIE5FVyB0byBhdm9pZCB0byBzZW5kIGl0IGluCiAJICogYSBmdWxsIHRhYmxlIHJlc3BvbnNlIGdvaW5nIG91dCBiZWZvcmUgdGhlIG5leHQgdHR2biBpbmNyZW1lbnQKIAkgKiAoY29uc2lzdGVuY3kgY2hlY2spICovCi0JdHRfbG9jYWxfZW50cnktPmZsYWdzIHw9IFRUX0NMSUVOVF9ORVc7Ci0KLQloYXNoX2FkZChiYXRfcHJpdi0+dHRfbG9jYWxfaGFzaCwgY29tcGFyZV9sdHQsIGNob29zZV9vcmlnLAotCQkgdHRfbG9jYWxfZW50cnksICZ0dF9sb2NhbF9lbnRyeS0+aGFzaF9lbnRyeSk7CisJdHRfbG9jYWxfZW50cnktPmNvbW1vbi5mbGFncyB8PSBUVF9DTElFTlRfTkVXOwogCiAJLyogcmVtb3ZlIGFkZHJlc3MgZnJvbSBnbG9iYWwgaGFzaCBpZiBwcmVzZW50ICovCiAJdHRfZ2xvYmFsX2VudHJ5ID0gdHRfZ2xvYmFsX2hhc2hfZmluZChiYXRfcHJpdiwgYWRkcik7CkBAIC0yNDUsMTAgKzI0MiwxMSBAQAogCWlmICh0dF9nbG9iYWxfZW50cnkpIHsKIAkJLyogVGhpcyBub2RlIGlzIHByb2JhYmx5IGdvaW5nIHRvIHVwZGF0ZSBpdHMgdHQgdGFibGUgKi8KIAkJdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPnR0X3Bvc3NfY2hhbmdlID0gdHJ1ZTsKLQkJLyogVGhlIGdsb2JhbCBlbnRyeSBoYXMgdG8gYmUgbWFya2VkIGFzIFBFTkRJTkcgYW5kIGhhcyB0byBiZQorCQkvKiBUaGUgZ2xvYmFsIGVudHJ5IGhhcyB0byBiZSBtYXJrZWQgYXMgUk9BTUlORyBhbmQgaGFzIHRvIGJlCiAJCSAqIGtlcHQgZm9yIGNvbnNpc3RlbmN5IHB1cnBvc2UgKi8KLQkJdHRfZ2xvYmFsX2VudHJ5LT5mbGFncyB8PSBUVF9DTElFTlRfUEVORElORzsKLQkJc2VuZF9yb2FtX2FkdihiYXRfcHJpdiwgdHRfZ2xvYmFsX2VudHJ5LT5hZGRyLAorCQl0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5mbGFncyB8PSBUVF9DTElFTlRfUk9BTTsKKwkJdHRfZ2xvYmFsX2VudHJ5LT5yb2FtX2F0ID0gamlmZmllczsKKwkJc2VuZF9yb2FtX2FkdihiYXRfcHJpdiwgdHRfZ2xvYmFsX2VudHJ5LT5jb21tb24uYWRkciwKIAkJCSAgICAgIHR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlKTsKIAl9CiBvdXQ6CkBAIC0zMTAsMTMgKzMwOCwxMiBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopc2VxLT5wcml2YXRlOwogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2ggPSBiYXRfcHJpdi0+dHRfbG9jYWxfaGFzaDsKLQlzdHJ1Y3QgdHRfbG9jYWxfZW50cnkgKnR0X2xvY2FsX2VudHJ5OworCXN0cnVjdCB0dF9jb21tb25fZW50cnkgKnR0X2NvbW1vbl9lbnRyeTsKIAlzdHJ1Y3QgaGFyZF9pZmFjZSAqcHJpbWFyeV9pZjsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKLQlzaXplX3QgYnVmX3NpemUsIHBvczsKLQljaGFyICpidWZmOwotCWludCBpLCByZXQgPSAwOworCXVpbnQzMl90IGk7CisJaW50IHJldCA9IDA7CiAKIAlwcmltYXJ5X2lmID0gcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOwogCWlmICghcHJpbWFyeV9pZikgewpAQCAtMzM3LDUxICszMzQsMjcgQEAKIAkJICAgImFubm91bmNlZCB2aWEgVFQgKFRUVk46ICV1KTpcbiIsCiAJCSAgIG5ldF9kZXYtPm5hbWUsICh1aW50OF90KWF0b21pY19yZWFkKCZiYXRfcHJpdi0+dHR2bikpOwogCi0JYnVmX3NpemUgPSAxOwotCS8qIEVzdGltYXRlIGxlbmd0aCBmb3I6ICIgKiB4eDp4eDp4eDp4eDp4eDp4eFxuIiAqLwogCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKIAkJaGVhZCA9ICZoYXNoLT50YWJsZVtpXTsKIAogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCV9faGxpc3RfZm9yX2VhY2hfcmN1KG5vZGUsIGhlYWQpCi0JCQlidWZfc2l6ZSArPSAyOTsKLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JfQotCi0JYnVmZiA9IGttYWxsb2MoYnVmX3NpemUsIEdGUF9BVE9NSUMpOwotCWlmICghYnVmZikgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIG91dDsKLQl9Ci0KLQlidWZmWzBdID0gJ1wwJzsKLQlwb3MgPSAwOwotCi0JZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgewotCQloZWFkID0gJmhhc2gtPnRhYmxlW2ldOwotCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHR0X2xvY2FsX2VudHJ5LCBub2RlLAorCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfY29tbW9uX2VudHJ5LCBub2RlLAogCQkJCQkgaGVhZCwgaGFzaF9lbnRyeSkgewotCQkJcG9zICs9IHNucHJpbnRmKGJ1ZmYgKyBwb3MsIDMwLCAiICogJXBNICIKLQkJCQkJIlslYyVjJWMlYyVjXVxuIiwKLQkJCQkJdHRfbG9jYWxfZW50cnktPmFkZHIsCi0JCQkJCSh0dF9sb2NhbF9lbnRyeS0+ZmxhZ3MgJgorCQkJc2VxX3ByaW50ZihzZXEsICIgKiAlcE0gWyVjJWMlYyVjJWNdXG4iLAorCQkJCQl0dF9jb21tb25fZW50cnktPmFkZHIsCisJCQkJCSh0dF9jb21tb25fZW50cnktPmZsYWdzICYKIAkJCQkJIFRUX0NMSUVOVF9ST0FNID8gJ1InIDogJy4nKSwKLQkJCQkJKHR0X2xvY2FsX2VudHJ5LT5mbGFncyAmCisJCQkJCSh0dF9jb21tb25fZW50cnktPmZsYWdzICYKIAkJCQkJIFRUX0NMSUVOVF9OT1BVUkdFID8gJ1AnIDogJy4nKSwKLQkJCQkJKHR0X2xvY2FsX2VudHJ5LT5mbGFncyAmCisJCQkJCSh0dF9jb21tb25fZW50cnktPmZsYWdzICYKIAkJCQkJIFRUX0NMSUVOVF9ORVcgPyAnTicgOiAnLicpLAotCQkJCQkodHRfbG9jYWxfZW50cnktPmZsYWdzICYKKwkJCQkJKHR0X2NvbW1vbl9lbnRyeS0+ZmxhZ3MgJgogCQkJCQkgVFRfQ0xJRU5UX1BFTkRJTkcgPyAnWCcgOiAnLicpLAotCQkJCQkodHRfbG9jYWxfZW50cnktPmZsYWdzICYKKwkJCQkJKHR0X2NvbW1vbl9lbnRyeS0+ZmxhZ3MgJgogCQkJCQkgVFRfQ0xJRU5UX1dJRkkgPyAnVycgOiAnLicpKTsKIAkJfQogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9Ci0KLQlzZXFfcHJpbnRmKHNlcSwgIiVzIiwgYnVmZik7Ci0Ja2ZyZWUoYnVmZik7CiBvdXQ6CiAJaWYgKHByaW1hcnlfaWYpCiAJCWhhcmRpZl9mcmVlX3JlZihwcmltYXJ5X2lmKTsKQEAgLTM5MiwxMyArMzY1LDEzIEBACiAJCQkJIHN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnksCiAJCQkJIHVpbnQxNl90IGZsYWdzKQogewotCXR0X2xvY2FsX2V2ZW50KGJhdF9wcml2LCB0dF9sb2NhbF9lbnRyeS0+YWRkciwKLQkJICAgICAgIHR0X2xvY2FsX2VudHJ5LT5mbGFncyB8IGZsYWdzKTsKKwl0dF9sb2NhbF9ldmVudChiYXRfcHJpdiwgdHRfbG9jYWxfZW50cnktPmNvbW1vbi5hZGRyLAorCQkgICAgICAgdHRfbG9jYWxfZW50cnktPmNvbW1vbi5mbGFncyB8IGZsYWdzKTsKIAogCS8qIFRoZSBsb2NhbCBjbGllbnQgaGFzIHRvIGJlIG1hcmtlZCBhcyAicGVuZGluZyB0byBiZSByZW1vdmVkIiBidXQgaGFzCiAJICogdG8gYmUga2VwdCBpbiB0aGUgdGFibGUgaW4gb3JkZXIgdG8gc2VuZCBpdCBpbiBhIGZ1bGwgdGFibGUKIAkgKiByZXNwb25zZSBpc3N1ZWQgYmVmb3JlIHRoZSBuZXQgdHR2biBpbmNyZW1lbnQgKGNvbnNpc3RlbmN5IGNoZWNrKSAqLwotCXR0X2xvY2FsX2VudHJ5LT5mbGFncyB8PSBUVF9DTElFTlRfUEVORElORzsKKwl0dF9sb2NhbF9lbnRyeS0+Y29tbW9uLmZsYWdzIHw9IFRUX0NMSUVOVF9QRU5ESU5HOwogfQogCiB2b2lkIHR0X2xvY2FsX3JlbW92ZShzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LCBjb25zdCB1aW50OF90ICphZGRyLApAQCAtNDE0LDcgKzM4Nyw3IEBACiAJCQkgICAgIChyb2FtaW5nID8gVFRfQ0xJRU5UX1JPQU0gOiBOT19GTEFHUykpOwogCiAJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LCAiTG9jYWwgdHQgZW50cnkgKCVwTSkgcGVuZGluZyB0byBiZSByZW1vdmVkOiAiCi0JCSIlc1xuIiwgdHRfbG9jYWxfZW50cnktPmFkZHIsIG1lc3NhZ2UpOworCQkiJXNcbiIsIHR0X2xvY2FsX2VudHJ5LT5jb21tb24uYWRkciwgbWVzc2FnZSk7CiBvdXQ6CiAJaWYgKHR0X2xvY2FsX2VudHJ5KQogCQl0dF9sb2NhbF9lbnRyeV9mcmVlX3JlZih0dF9sb2NhbF9lbnRyeSk7CkBAIC00MjQsMjMgKzM5NywyNyBAQAogewogCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCA9IGJhdF9wcml2LT50dF9sb2NhbF9oYXNoOwogCXN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnk7CisJc3RydWN0IHR0X2NvbW1vbl9lbnRyeSAqdHRfY29tbW9uX2VudHJ5OwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbm9kZV90bXA7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3BpbmxvY2tfdCAqbGlzdF9sb2NrOyAvKiBwcm90ZWN0cyB3cml0ZSBhY2Nlc3MgdG8gdGhlIGhhc2ggbGlzdHMgKi8KLQlpbnQgaTsKKwl1aW50MzJfdCBpOwogCiAJZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgewogCQloZWFkID0gJmhhc2gtPnRhYmxlW2ldOwogCQlsaXN0X2xvY2sgPSAmaGFzaC0+bGlzdF9sb2Nrc1tpXTsKIAogCQlzcGluX2xvY2tfYmgobGlzdF9sb2NrKTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0dF9sb2NhbF9lbnRyeSwgbm9kZSwgbm9kZV90bXAsCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHRfY29tbW9uX2VudHJ5LCBub2RlLCBub2RlX3RtcCwKIAkJCQkJICBoZWFkLCBoYXNoX2VudHJ5KSB7Ci0JCQlpZiAodHRfbG9jYWxfZW50cnktPmZsYWdzICYgVFRfQ0xJRU5UX05PUFVSR0UpCisJCQl0dF9sb2NhbF9lbnRyeSA9IGNvbnRhaW5lcl9vZih0dF9jb21tb25fZW50cnksCisJCQkJCQkgICAgICBzdHJ1Y3QgdHRfbG9jYWxfZW50cnksCisJCQkJCQkgICAgICBjb21tb24pOworCQkJaWYgKHR0X2xvY2FsX2VudHJ5LT5jb21tb24uZmxhZ3MgJiBUVF9DTElFTlRfTk9QVVJHRSkKIAkJCQljb250aW51ZTsKIAogCQkJLyogZW50cnkgYWxyZWFkeSBtYXJrZWQgZm9yIGRlbGV0aW9uICovCi0JCQlpZiAodHRfbG9jYWxfZW50cnktPmZsYWdzICYgVFRfQ0xJRU5UX1BFTkRJTkcpCisJCQlpZiAodHRfbG9jYWxfZW50cnktPmNvbW1vbi5mbGFncyAmIFRUX0NMSUVOVF9QRU5ESU5HKQogCQkJCWNvbnRpbnVlOwogCiAJCQlpZiAoIWlzX291dF9vZl90aW1lKHR0X2xvY2FsX2VudHJ5LT5sYXN0X3NlZW4sCkBAIC00NTEsNyArNDI4LDcgQEAKIAkJCQkJICAgICBUVF9DTElFTlRfREVMKTsKIAkJCWJhdF9kYmcoREJHX1RULCBiYXRfcHJpdiwgIkxvY2FsIHR0IGVudHJ5ICglcE0pICIKIAkJCQkicGVuZGluZyB0byBiZSByZW1vdmVkOiB0aW1lZCBvdXRcbiIsCi0JCQkJdHRfbG9jYWxfZW50cnktPmFkZHIpOworCQkJCXR0X2xvY2FsX2VudHJ5LT5jb21tb24uYWRkcik7CiAJCX0KIAkJc3Bpbl91bmxvY2tfYmgobGlzdF9sb2NrKTsKIAl9CkBAIC00NjIsMTAgKzQzOSwxMSBAQAogewogCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaDsKIAlzcGlubG9ja190ICpsaXN0X2xvY2s7IC8qIHByb3RlY3RzIHdyaXRlIGFjY2VzcyB0byB0aGUgaGFzaCBsaXN0cyAqLworCXN0cnVjdCB0dF9jb21tb25fZW50cnkgKnR0X2NvbW1vbl9lbnRyeTsKIAlzdHJ1Y3QgdHRfbG9jYWxfZW50cnkgKnR0X2xvY2FsX2VudHJ5OwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbm9kZV90bXA7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0JaW50IGk7CisJdWludDMyX3QgaTsKIAogCWlmICghYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2gpCiAJCXJldHVybjsKQEAgLTQ3Nyw5ICs0NTUsMTIgQEAKIAkJbGlzdF9sb2NrID0gJmhhc2gtPmxpc3RfbG9ja3NbaV07CiAKIAkJc3Bpbl9sb2NrX2JoKGxpc3RfbG9jayk7Ci0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHRfbG9jYWxfZW50cnksIG5vZGUsIG5vZGVfdG1wLAorCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHR0X2NvbW1vbl9lbnRyeSwgbm9kZSwgbm9kZV90bXAsCiAJCQkJCSAgaGVhZCwgaGFzaF9lbnRyeSkgewogCQkJaGxpc3RfZGVsX3JjdShub2RlKTsKKwkJCXR0X2xvY2FsX2VudHJ5ID0gY29udGFpbmVyX29mKHR0X2NvbW1vbl9lbnRyeSwKKwkJCQkJCSAgICAgIHN0cnVjdCB0dF9sb2NhbF9lbnRyeSwKKwkJCQkJCSAgICAgIGNvbW1vbik7CiAJCQl0dF9sb2NhbF9lbnRyeV9mcmVlX3JlZih0dF9sb2NhbF9lbnRyeSk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfYmgobGlzdF9sb2NrKTsKQEAgLTUyNyw2ICs1MDgsNyBAQAogCXN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKIAlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGVfdG1wOwogCWludCByZXQgPSAwOworCWludCBoYXNoX2FkZGVkOwogCiAJdHRfZ2xvYmFsX2VudHJ5ID0gdHRfZ2xvYmFsX2hhc2hfZmluZChiYXRfcHJpdiwgdHRfYWRkcik7CiAKQEAgLTUzNywxOCArNTE5LDI0IEBACiAJCWlmICghdHRfZ2xvYmFsX2VudHJ5KQogCQkJZ290byBvdXQ7CiAKLQkJbWVtY3B5KHR0X2dsb2JhbF9lbnRyeS0+YWRkciwgdHRfYWRkciwgRVRIX0FMRU4pOworCQltZW1jcHkodHRfZ2xvYmFsX2VudHJ5LT5jb21tb24uYWRkciwgdHRfYWRkciwgRVRIX0FMRU4pOworCQl0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5mbGFncyA9IE5PX0ZMQUdTOworCQlhdG9taWNfc2V0KCZ0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5yZWZjb3VudCwgMik7CiAJCS8qIEFzc2lnbiB0aGUgbmV3IG9yaWdfbm9kZSAqLwogCQlhdG9taWNfaW5jKCZvcmlnX25vZGUtPnJlZmNvdW50KTsKIAkJdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUgPSBvcmlnX25vZGU7CiAJCXR0X2dsb2JhbF9lbnRyeS0+dHR2biA9IHR0dm47Ci0JCXR0X2dsb2JhbF9lbnRyeS0+ZmxhZ3MgPSBOT19GTEFHUzsKIAkJdHRfZ2xvYmFsX2VudHJ5LT5yb2FtX2F0ID0gMDsKLQkJYXRvbWljX3NldCgmdHRfZ2xvYmFsX2VudHJ5LT5yZWZjb3VudCwgMik7CiAKLQkJaGFzaF9hZGQoYmF0X3ByaXYtPnR0X2dsb2JhbF9oYXNoLCBjb21wYXJlX2d0dCwKLQkJCSBjaG9vc2Vfb3JpZywgdHRfZ2xvYmFsX2VudHJ5LAotCQkJICZ0dF9nbG9iYWxfZW50cnktPmhhc2hfZW50cnkpOworCQloYXNoX2FkZGVkID0gaGFzaF9hZGQoYmF0X3ByaXYtPnR0X2dsb2JhbF9oYXNoLCBjb21wYXJlX3R0LAorCQkJCSBjaG9vc2Vfb3JpZywgJnR0X2dsb2JhbF9lbnRyeS0+Y29tbW9uLAorCQkJCSAmdHRfZ2xvYmFsX2VudHJ5LT5jb21tb24uaGFzaF9lbnRyeSk7CisKKwkJaWYgKHVubGlrZWx5KGhhc2hfYWRkZWQgIT0gMCkpIHsKKwkJCS8qIHJlbW92ZSB0aGUgcmVmZXJlbmNlIGZvciB0aGUgaGFzaCAqLworCQkJdHRfZ2xvYmFsX2VudHJ5X2ZyZWVfcmVmKHR0X2dsb2JhbF9lbnRyeSk7CisJCQlnb3RvIG91dF9yZW1vdmU7CisJCX0KIAkJYXRvbWljX2luYygmb3JpZ19ub2RlLT50dF9zaXplKTsKIAl9IGVsc2UgewogCQlpZiAodHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUgIT0gb3JpZ19ub2RlKSB7CkBAIC01NTksMjAgKzU0NywyMSBAQAogCQkJb3JpZ19ub2RlX2ZyZWVfcmVmKG9yaWdfbm9kZV90bXApOwogCQkJYXRvbWljX2luYygmb3JpZ19ub2RlLT50dF9zaXplKTsKIAkJfQorCQl0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5mbGFncyA9IE5PX0ZMQUdTOwogCQl0dF9nbG9iYWxfZW50cnktPnR0dm4gPSB0dHZuOwotCQl0dF9nbG9iYWxfZW50cnktPmZsYWdzID0gTk9fRkxBR1M7CiAJCXR0X2dsb2JhbF9lbnRyeS0+cm9hbV9hdCA9IDA7CiAJfQogCiAJaWYgKHdpZmkpCi0JCXR0X2dsb2JhbF9lbnRyeS0+ZmxhZ3MgfD0gVFRfQ0xJRU5UX1dJRkk7CisJCXR0X2dsb2JhbF9lbnRyeS0+Y29tbW9uLmZsYWdzIHw9IFRUX0NMSUVOVF9XSUZJOwogCiAJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LAogCQkiQ3JlYXRpbmcgbmV3IGdsb2JhbCB0dCBlbnRyeTogJXBNICh2aWEgJXBNKVxuIiwKLQkJdHRfZ2xvYmFsX2VudHJ5LT5hZGRyLCBvcmlnX25vZGUtPm9yaWcpOworCQl0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5hZGRyLCBvcmlnX25vZGUtPm9yaWcpOwogCitvdXRfcmVtb3ZlOgogCS8qIHJlbW92ZSBhZGRyZXNzIGZyb20gbG9jYWwgaGFzaCBpZiBwcmVzZW50ICovCi0JdHRfbG9jYWxfcmVtb3ZlKGJhdF9wcml2LCB0dF9nbG9iYWxfZW50cnktPmFkZHIsCisJdHRfbG9jYWxfcmVtb3ZlKGJhdF9wcml2LCB0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5hZGRyLAogCQkJImdsb2JhbCB0dCByZWNlaXZlZCIsIHJvYW1pbmcpOwogCXJldCA9IDE7CiBvdXQ6CkBAIC01ODYsMTMgKzU3NSwxMyBAQAogCXN0cnVjdCBuZXRfZGV2aWNlICpuZXRfZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopc2VxLT5wcml2YXRlOwogCXN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYgPSBuZXRkZXZfcHJpdihuZXRfZGV2KTsKIAlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2ggPSBiYXRfcHJpdi0+dHRfZ2xvYmFsX2hhc2g7CisJc3RydWN0IHR0X2NvbW1vbl9lbnRyeSAqdHRfY29tbW9uX2VudHJ5OwogCXN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKIAlzdHJ1Y3QgaGFyZF9pZmFjZSAqcHJpbWFyeV9pZjsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKLQlzaXplX3QgYnVmX3NpemUsIHBvczsKLQljaGFyICpidWZmOwotCWludCBpLCByZXQgPSAwOworCXVpbnQzMl90IGk7CisJaW50IHJldCA9IDA7CiAKIAlwcmltYXJ5X2lmID0gcHJpbWFyeV9pZl9nZXRfc2VsZWN0ZWQoYmF0X3ByaXYpOwogCWlmICghcHJpbWFyeV9pZikgewpAQCAtNjE1LDUzICs2MDQsMzIgQEAKIAlzZXFfcHJpbnRmKHNlcSwgIiAgICAgICAlLTEzcyAlcyAgICAgICAlLTE1cyAlcyAlc1xuIiwKIAkJICAgIkNsaWVudCIsICIoVFRWTikiLCAiT3JpZ2luYXRvciIsICIoQ3VyciBUVFZOKSIsICJGbGFncyIpOwogCi0JYnVmX3NpemUgPSAxOwotCS8qIEVzdGltYXRlIGxlbmd0aCBmb3I6ICIgKiB4eDp4eDp4eDp4eDp4eDp4eCAodHR2bikgdmlhCi0JICogeHg6eHg6eHg6eHg6eHg6eHggKGN1cl90dHZuKVxuIiovCiAJZm9yIChpID0gMDsgaSA8IGhhc2gtPnNpemU7IGkrKykgewogCQloZWFkID0gJmhhc2gtPnRhYmxlW2ldOwogCiAJCXJjdV9yZWFkX2xvY2soKTsKLQkJX19obGlzdF9mb3JfZWFjaF9yY3Uobm9kZSwgaGVhZCkKLQkJCWJ1Zl9zaXplICs9IDY3OwotCQlyY3VfcmVhZF91bmxvY2soKTsKLQl9Ci0KLQlidWZmID0ga21hbGxvYyhidWZfc2l6ZSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFidWZmKSB7Ci0JCXJldCA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0OwotCX0KLQotCWJ1ZmZbMF0gPSAnXDAnOwotCXBvcyA9IDA7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7Ci0JCWhlYWQgPSAmaGFzaC0+dGFibGVbaV07Ci0KLQkJcmN1X3JlYWRfbG9jaygpOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfZ2xvYmFsX2VudHJ5LCBub2RlLAorCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfY29tbW9uX2VudHJ5LCBub2RlLAogCQkJCQkgaGVhZCwgaGFzaF9lbnRyeSkgewotCQkJcG9zICs9IHNucHJpbnRmKGJ1ZmYgKyBwb3MsIDY5LAotCQkJCQkiICogJXBNICAoJTN1KSB2aWEgJXBNICAgICAoJTN1KSAgICIKLQkJCQkJIlslYyVjJWNdXG4iLCB0dF9nbG9iYWxfZW50cnktPmFkZHIsCisJCQl0dF9nbG9iYWxfZW50cnkgPSBjb250YWluZXJfb2YodHRfY29tbW9uX2VudHJ5LAorCQkJCQkJICAgICAgIHN0cnVjdCB0dF9nbG9iYWxfZW50cnksCisJCQkJCQkgICAgICAgY29tbW9uKTsKKwkJCXNlcV9wcmludGYoc2VxLCAiICogJXBNICAoJTN1KSB2aWEgJXBNICAgICAoJTN1KSAgICIKKwkJCQkJIlslYyVjJWNdXG4iLAorCQkJCQl0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5hZGRyLAogCQkJCQl0dF9nbG9iYWxfZW50cnktPnR0dm4sCiAJCQkJCXR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnLAogCQkJCQkodWludDhfdCkgYXRvbWljX3JlYWQoCiAJCQkJCQkmdHRfZ2xvYmFsX2VudHJ5LT5vcmlnX25vZGUtPgogCQkJCQkJbGFzdF90dHZuKSwKLQkJCQkJKHR0X2dsb2JhbF9lbnRyeS0+ZmxhZ3MgJgorCQkJCQkodHRfZ2xvYmFsX2VudHJ5LT5jb21tb24uZmxhZ3MgJgogCQkJCQkgVFRfQ0xJRU5UX1JPQU0gPyAnUicgOiAnLicpLAotCQkJCQkodHRfZ2xvYmFsX2VudHJ5LT5mbGFncyAmCisJCQkJCSh0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5mbGFncyAmCiAJCQkJCSBUVF9DTElFTlRfUEVORElORyA/ICdYJyA6ICcuJyksCi0JCQkJCSh0dF9nbG9iYWxfZW50cnktPmZsYWdzICYKKwkJCQkJKHR0X2dsb2JhbF9lbnRyeS0+Y29tbW9uLmZsYWdzICYKIAkJCQkJIFRUX0NMSUVOVF9XSUZJID8gJ1cnIDogJy4nKSk7CiAJCX0KIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQotCi0Jc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1ZmYpOwotCWtmcmVlKGJ1ZmYpOwogb3V0OgogCWlmIChwcmltYXJ5X2lmKQogCQloYXJkaWZfZnJlZV9yZWYocHJpbWFyeV9pZik7CkBAIC02NzcsMTMgKzY0NSwxMyBAQAogCiAJYmF0X2RiZyhEQkdfVFQsIGJhdF9wcml2LAogCQkiRGVsZXRpbmcgZ2xvYmFsIHR0IGVudHJ5ICVwTSAodmlhICVwTSk6ICVzXG4iLAotCQl0dF9nbG9iYWxfZW50cnktPmFkZHIsIHR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnLAorCQl0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5hZGRyLCB0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+b3JpZywKIAkJbWVzc2FnZSk7CiAKIAlhdG9taWNfZGVjKCZ0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZS0+dHRfc2l6ZSk7CiAKLQloYXNoX3JlbW92ZShiYXRfcHJpdi0+dHRfZ2xvYmFsX2hhc2gsIGNvbXBhcmVfZ3R0LCBjaG9vc2Vfb3JpZywKLQkJICAgIHR0X2dsb2JhbF9lbnRyeS0+YWRkcik7CisJaGFzaF9yZW1vdmUoYmF0X3ByaXYtPnR0X2dsb2JhbF9oYXNoLCBjb21wYXJlX3R0LCBjaG9vc2Vfb3JpZywKKwkJICAgIHR0X2dsb2JhbF9lbnRyeS0+Y29tbW9uLmFkZHIpOwogb3V0OgogCWlmICh0dF9nbG9iYWxfZW50cnkpCiAJCXR0X2dsb2JhbF9lbnRyeV9mcmVlX3JlZih0dF9nbG9iYWxfZW50cnkpOwpAQCAtNjk0LDYgKzY2Miw3IEBACiAJCSAgIGNvbnN0IGNoYXIgKm1lc3NhZ2UsIGJvb2wgcm9hbWluZykKIHsKIAlzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5ICp0dF9nbG9iYWxfZW50cnkgPSBOVUxMOworCXN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnkgPSBOVUxMOwogCiAJdHRfZ2xvYmFsX2VudHJ5ID0gdHRfZ2xvYmFsX2hhc2hfZmluZChiYXRfcHJpdiwgYWRkcik7CiAJaWYgKCF0dF9nbG9iYWxfZW50cnkpCkBAIC03MDEsMjIgKzY3MCwzNyBAQAogCiAJaWYgKHR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlID09IG9yaWdfbm9kZSkgewogCQlpZiAocm9hbWluZykgewotCQkJdHRfZ2xvYmFsX2VudHJ5LT5mbGFncyB8PSBUVF9DTElFTlRfUk9BTTsKLQkJCXR0X2dsb2JhbF9lbnRyeS0+cm9hbV9hdCA9IGppZmZpZXM7Ci0JCQlnb3RvIG91dDsKKwkJCS8qIGlmIHdlIGFyZSBkZWxldGluZyBhIGdsb2JhbCBlbnRyeSBkdWUgdG8gYSByb2FtCisJCQkgKiBldmVudCwgdGhlcmUgYXJlIHR3byBwb3NzaWJpbGl0aWVzOgorCQkJICogMSkgdGhlIGNsaWVudCByb2FtZWQgZnJvbSBub2RlIEEgdG8gbm9kZSBCID0+IHdlIG1hcmsKKwkJCSAqICAgIGl0IHdpdGggVFRfQ0xJRU5UX1JPQU0sIHdlIHN0YXJ0IGEgdGltZXIgYW5kIHdlCisJCQkgKiAgICB3YWl0IGZvciBub2RlIEIgdG8gY2xhaW0gaXQuIEluIGNhc2Ugb2YgdGltZW91dAorCQkJICogICAgdGhlIGVudHJ5IGlzIHB1cmdlZC4KKwkJCSAqIDIpIHRoZSBjbGllbnQgcm9hbWVkIHRvIHVzID0+IHdlIGNhbiBkaXJlY3RseSBkZWxldGUKKwkJCSAqICAgIHRoZSBnbG9iYWwgZW50cnksIHNpbmNlIGl0IGlzIHVzZWxlc3Mgbm93LiAqLworCQkJdHRfbG9jYWxfZW50cnkgPSB0dF9sb2NhbF9oYXNoX2ZpbmQoYmF0X3ByaXYsCisJCQkJCQkJICAgIHR0X2dsb2JhbF9lbnRyeS0+Y29tbW9uLmFkZHIpOworCQkJaWYgKCF0dF9sb2NhbF9lbnRyeSkgeworCQkJCXR0X2dsb2JhbF9lbnRyeS0+Y29tbW9uLmZsYWdzIHw9IFRUX0NMSUVOVF9ST0FNOworCQkJCXR0X2dsb2JhbF9lbnRyeS0+cm9hbV9hdCA9IGppZmZpZXM7CisJCQkJZ290byBvdXQ7CisJCQl9CiAJCX0KIAkJX3R0X2dsb2JhbF9kZWwoYmF0X3ByaXYsIHR0X2dsb2JhbF9lbnRyeSwgbWVzc2FnZSk7CiAJfQogb3V0OgogCWlmICh0dF9nbG9iYWxfZW50cnkpCiAJCXR0X2dsb2JhbF9lbnRyeV9mcmVlX3JlZih0dF9nbG9iYWxfZW50cnkpOworCWlmICh0dF9sb2NhbF9lbnRyeSkKKwkJdHRfbG9jYWxfZW50cnlfZnJlZV9yZWYodHRfbG9jYWxfZW50cnkpOwogfQogCiB2b2lkIHR0X2dsb2JhbF9kZWxfb3JpZyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2LAogCQkJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlLCBjb25zdCBjaGFyICptZXNzYWdlKQogewogCXN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKLQlpbnQgaTsKKwlzdHJ1Y3QgdHRfY29tbW9uX2VudHJ5ICp0dF9jb21tb25fZW50cnk7CisJdWludDMyX3QgaTsKIAlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2ggPSBiYXRfcHJpdi0+dHRfZ2xvYmFsX2hhc2g7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpzYWZlOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwpAQCAtNzMwLDE0ICs3MTQsMTggQEAKIAkJbGlzdF9sb2NrID0gJmhhc2gtPmxpc3RfbG9ja3NbaV07CiAKIAkJc3Bpbl9sb2NrX2JoKGxpc3RfbG9jayk7Ci0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHRfZ2xvYmFsX2VudHJ5LCBub2RlLCBzYWZlLAorCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHR0X2NvbW1vbl9lbnRyeSwgbm9kZSwgc2FmZSwKIAkJCQkJIGhlYWQsIGhhc2hfZW50cnkpIHsKKwkJCXR0X2dsb2JhbF9lbnRyeSA9IGNvbnRhaW5lcl9vZih0dF9jb21tb25fZW50cnksCisJCQkJCQkgICAgICAgc3RydWN0IHR0X2dsb2JhbF9lbnRyeSwKKwkJCQkJCSAgICAgICBjb21tb24pOwogCQkJaWYgKHR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlID09IG9yaWdfbm9kZSkgewogCQkJCWJhdF9kYmcoREJHX1RULCBiYXRfcHJpdiwKIAkJCQkJIkRlbGV0aW5nIGdsb2JhbCB0dCBlbnRyeSAlcE0gIgotCQkJCQkiKHZpYSAlcE0pOiBvcmlnaW5hdG9yIHRpbWUgb3V0XG4iLAotCQkJCQl0dF9nbG9iYWxfZW50cnktPmFkZHIsCi0JCQkJCXR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnKTsKKwkJCQkJIih2aWEgJXBNKTogJXNcbiIsCisJCQkJCXR0X2dsb2JhbF9lbnRyeS0+Y29tbW9uLmFkZHIsCisJCQkJCXR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT5vcmlnLAorCQkJCQltZXNzYWdlKTsKIAkJCQlobGlzdF9kZWxfcmN1KG5vZGUpOwogCQkJCXR0X2dsb2JhbF9lbnRyeV9mcmVlX3JlZih0dF9nbG9iYWxfZW50cnkpOwogCQkJfQpAQCAtNzUwLDIwICs3MzgsMjQgQEAKIHN0YXRpYyB2b2lkIHR0X2dsb2JhbF9yb2FtX3B1cmdlKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCiB7CiAJc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoID0gYmF0X3ByaXYtPnR0X2dsb2JhbF9oYXNoOworCXN0cnVjdCB0dF9jb21tb25fZW50cnkgKnR0X2NvbW1vbl9lbnRyeTsKIAlzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5ICp0dF9nbG9iYWxfZW50cnk7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpub2RlX3RtcDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKIAlzcGlubG9ja190ICpsaXN0X2xvY2s7IC8qIHByb3RlY3RzIHdyaXRlIGFjY2VzcyB0byB0aGUgaGFzaCBsaXN0cyAqLwotCWludCBpOworCXVpbnQzMl90IGk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7CiAJCWhlYWQgPSAmaGFzaC0+dGFibGVbaV07CiAJCWxpc3RfbG9jayA9ICZoYXNoLT5saXN0X2xvY2tzW2ldOwogCiAJCXNwaW5fbG9ja19iaChsaXN0X2xvY2spOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHR0X2dsb2JhbF9lbnRyeSwgbm9kZSwgbm9kZV90bXAsCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHRfY29tbW9uX2VudHJ5LCBub2RlLCBub2RlX3RtcCwKIAkJCQkJICBoZWFkLCBoYXNoX2VudHJ5KSB7Ci0JCQlpZiAoISh0dF9nbG9iYWxfZW50cnktPmZsYWdzICYgVFRfQ0xJRU5UX1JPQU0pKQorCQkJdHRfZ2xvYmFsX2VudHJ5ID0gY29udGFpbmVyX29mKHR0X2NvbW1vbl9lbnRyeSwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5LAorCQkJCQkJICAgICAgIGNvbW1vbik7CisJCQlpZiAoISh0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5mbGFncyAmIFRUX0NMSUVOVF9ST0FNKSkKIAkJCQljb250aW51ZTsKIAkJCWlmICghaXNfb3V0X29mX3RpbWUodHRfZ2xvYmFsX2VudHJ5LT5yb2FtX2F0LAogCQkJCQkgICAgVFRfQ0xJRU5UX1JPQU1fVElNRU9VVCAqIDEwMDApKQpAQCAtNzcxLDcgKzc2Myw3IEBACiAKIAkJCWJhdF9kYmcoREJHX1RULCBiYXRfcHJpdiwgIkRlbGV0aW5nIGdsb2JhbCAiCiAJCQkJInR0IGVudHJ5ICglcE0pOiBSb2FtaW5nIHRpbWVvdXRcbiIsCi0JCQkJdHRfZ2xvYmFsX2VudHJ5LT5hZGRyKTsKKwkJCQl0dF9nbG9iYWxfZW50cnktPmNvbW1vbi5hZGRyKTsKIAkJCWF0b21pY19kZWMoJnR0X2dsb2JhbF9lbnRyeS0+b3JpZ19ub2RlLT50dF9zaXplKTsKIAkJCWhsaXN0X2RlbF9yY3Uobm9kZSk7CiAJCQl0dF9nbG9iYWxfZW50cnlfZnJlZV9yZWYodHRfZ2xvYmFsX2VudHJ5KTsKQEAgLTc4NSwxMCArNzc3LDExIEBACiB7CiAJc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoOwogCXNwaW5sb2NrX3QgKmxpc3RfbG9jazsgLyogcHJvdGVjdHMgd3JpdGUgYWNjZXNzIHRvIHRoZSBoYXNoIGxpc3RzICovCisJc3RydWN0IHR0X2NvbW1vbl9lbnRyeSAqdHRfY29tbW9uX2VudHJ5OwogCXN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfdG1wOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCWludCBpOworCXVpbnQzMl90IGk7CiAKIAlpZiAoIWJhdF9wcml2LT50dF9nbG9iYWxfaGFzaCkKIAkJcmV0dXJuOwpAQCAtODAwLDkgKzc5MywxMiBAQAogCQlsaXN0X2xvY2sgPSAmaGFzaC0+bGlzdF9sb2Nrc1tpXTsKIAogCQlzcGluX2xvY2tfYmgobGlzdF9sb2NrKTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0dF9nbG9iYWxfZW50cnksIG5vZGUsIG5vZGVfdG1wLAorCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHR0X2NvbW1vbl9lbnRyeSwgbm9kZSwgbm9kZV90bXAsCiAJCQkJCSAgaGVhZCwgaGFzaF9lbnRyeSkgewogCQkJaGxpc3RfZGVsX3JjdShub2RlKTsKKwkJCXR0X2dsb2JhbF9lbnRyeSA9IGNvbnRhaW5lcl9vZih0dF9jb21tb25fZW50cnksCisJCQkJCQkgICAgICAgc3RydWN0IHR0X2dsb2JhbF9lbnRyeSwKKwkJCQkJCSAgICAgICBjb21tb24pOwogCQkJdHRfZ2xvYmFsX2VudHJ5X2ZyZWVfcmVmKHR0X2dsb2JhbF9lbnRyeSk7CiAJCX0KIAkJc3Bpbl91bmxvY2tfYmgobGlzdF9sb2NrKTsKQEAgLTgxOCw4ICs4MTQsOCBAQAogewogCWJvb2wgcmV0ID0gZmFsc2U7CiAKLQlpZiAodHRfbG9jYWxfZW50cnktPmZsYWdzICYgVFRfQ0xJRU5UX1dJRkkgJiYKLQkgICAgdHRfZ2xvYmFsX2VudHJ5LT5mbGFncyAmIFRUX0NMSUVOVF9XSUZJKQorCWlmICh0dF9sb2NhbF9lbnRyeS0+Y29tbW9uLmZsYWdzICYgVFRfQ0xJRU5UX1dJRkkgJiYKKwkgICAgdHRfZ2xvYmFsX2VudHJ5LT5jb21tb24uZmxhZ3MgJiBUVF9DTElFTlRfV0lGSSkKIAkJcmV0ID0gdHJ1ZTsKIAogCXJldHVybiByZXQ7CkBAIC04NTIsNyArODQ4LDcgQEAKIAogCS8qIEEgZ2xvYmFsIGNsaWVudCBtYXJrZWQgYXMgUEVORElORyBoYXMgYWxyZWFkeSBtb3ZlZCBmcm9tIHRoYXQKIAkgKiBvcmlnaW5hdG9yICovCi0JaWYgKHR0X2dsb2JhbF9lbnRyeS0+ZmxhZ3MgJiBUVF9DTElFTlRfUEVORElORykKKwlpZiAodHRfZ2xvYmFsX2VudHJ5LT5jb21tb24uZmxhZ3MgJiBUVF9DTElFTlRfUEVORElORykKIAkJZ290byBvdXQ7CiAKIAlvcmlnX25vZGUgPSB0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZTsKQEAgLTg3MSwyOSArODY3LDM0IEBACiB7CiAJdWludDE2X3QgdG90YWwgPSAwLCB0b3RhbF9vbmU7CiAJc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoID0gYmF0X3ByaXYtPnR0X2dsb2JhbF9oYXNoOworCXN0cnVjdCB0dF9jb21tb25fZW50cnkgKnR0X2NvbW1vbl9lbnRyeTsKIAlzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5ICp0dF9nbG9iYWxfZW50cnk7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7Ci0JaW50IGksIGo7CisJdWludDMyX3QgaTsKKwlpbnQgajsKIAogCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5zaXplOyBpKyspIHsKIAkJaGVhZCA9ICZoYXNoLT50YWJsZVtpXTsKIAogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0dF9nbG9iYWxfZW50cnksIG5vZGUsCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0dF9jb21tb25fZW50cnksIG5vZGUsCiAJCQkJCSBoZWFkLCBoYXNoX2VudHJ5KSB7CisJCQl0dF9nbG9iYWxfZW50cnkgPSBjb250YWluZXJfb2YodHRfY29tbW9uX2VudHJ5LAorCQkJCQkJICAgICAgIHN0cnVjdCB0dF9nbG9iYWxfZW50cnksCisJCQkJCQkgICAgICAgY29tbW9uKTsKIAkJCWlmIChjb21wYXJlX2V0aCh0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSwKIAkJCQkJb3JpZ19ub2RlKSkgewogCQkJCS8qIFJvYW1pbmcgY2xpZW50cyBhcmUgaW4gdGhlIGdsb2JhbCB0YWJsZSBmb3IKIAkJCQkgKiBjb25zaXN0ZW5jeSBvbmx5LiBUaGV5IGRvbid0IGhhdmUgdG8gYmUKIAkJCQkgKiB0YWtlbiBpbnRvIGFjY291bnQgd2hpbGUgY29tcHV0aW5nIHRoZQogCQkJCSAqIGdsb2JhbCBjcmMgKi8KLQkJCQlpZiAodHRfZ2xvYmFsX2VudHJ5LT5mbGFncyAmIFRUX0NMSUVOVF9ST0FNKQorCQkJCWlmICh0dF9jb21tb25fZW50cnktPmZsYWdzICYgVFRfQ0xJRU5UX1JPQU0pCiAJCQkJCWNvbnRpbnVlOwogCQkJCXRvdGFsX29uZSA9IDA7CiAJCQkJZm9yIChqID0gMDsgaiA8IEVUSF9BTEVOOyBqKyspCiAJCQkJCXRvdGFsX29uZSA9IGNyYzE2X2J5dGUodG90YWxfb25lLAotCQkJCQkJdHRfZ2xvYmFsX2VudHJ5LT5hZGRyW2pdKTsKKwkJCQkJCXR0X2NvbW1vbl9lbnRyeS0+YWRkcltqXSk7CiAJCQkJdG90YWwgXj0gdG90YWxfb25lOwogCQkJfQogCQl9CkBAIC05MDgsMjUgKzkwOSwyNiBAQAogewogCXVpbnQxNl90IHRvdGFsID0gMCwgdG90YWxfb25lOwogCXN0cnVjdCBoYXNodGFibGVfdCAqaGFzaCA9IGJhdF9wcml2LT50dF9sb2NhbF9oYXNoOwotCXN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnk7CisJc3RydWN0IHR0X2NvbW1vbl9lbnRyeSAqdHRfY29tbW9uX2VudHJ5OwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwotCWludCBpLCBqOworCXVpbnQzMl90IGk7CisJaW50IGo7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7CiAJCWhlYWQgPSAmaGFzaC0+dGFibGVbaV07CiAKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfbG9jYWxfZW50cnksIG5vZGUsCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0dF9jb21tb25fZW50cnksIG5vZGUsCiAJCQkJCSBoZWFkLCBoYXNoX2VudHJ5KSB7CiAJCQkvKiBub3QgeWV0IGNvbW1pdHRlZCBjbGllbnRzIGhhdmUgbm90IHRvIGJlIHRha2VuIGludG8KIAkJCSAqIGFjY291bnQgd2hpbGUgY29tcHV0aW5nIHRoZSBDUkMgKi8KLQkJCWlmICh0dF9sb2NhbF9lbnRyeS0+ZmxhZ3MgJiBUVF9DTElFTlRfTkVXKQorCQkJaWYgKHR0X2NvbW1vbl9lbnRyeS0+ZmxhZ3MgJiBUVF9DTElFTlRfTkVXKQogCQkJCWNvbnRpbnVlOwogCQkJdG90YWxfb25lID0gMDsKIAkJCWZvciAoaiA9IDA7IGogPCBFVEhfQUxFTjsgaisrKQogCQkJCXRvdGFsX29uZSA9IGNyYzE2X2J5dGUodG90YWxfb25lLAotCQkJCQkJICAgdHRfbG9jYWxfZW50cnktPmFkZHJbal0pOworCQkJCQkJICAgdHRfY29tbW9uX2VudHJ5LT5hZGRyW2pdKTsKIAkJCXRvdGFsIF49IHRvdGFsX29uZTsKIAkJfQogCQlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTEwMTUsMjEgKzEwMTcsMjUgQEAKIC8qIGRhdGFfcHRyIGlzIHVzZWxlc3MgaGVyZSwgYnV0IGhhcyB0byBiZSBrZXB0IHRvIHJlc3BlY3QgdGhlIHByb3RvdHlwZSAqLwogc3RhdGljIGludCB0dF9sb2NhbF92YWxpZF9lbnRyeShjb25zdCB2b2lkICplbnRyeV9wdHIsIGNvbnN0IHZvaWQgKmRhdGFfcHRyKQogewotCWNvbnN0IHN0cnVjdCB0dF9sb2NhbF9lbnRyeSAqdHRfbG9jYWxfZW50cnkgPSBlbnRyeV9wdHI7CisJY29uc3Qgc3RydWN0IHR0X2NvbW1vbl9lbnRyeSAqdHRfY29tbW9uX2VudHJ5ID0gZW50cnlfcHRyOwogCi0JaWYgKHR0X2xvY2FsX2VudHJ5LT5mbGFncyAmIFRUX0NMSUVOVF9ORVcpCisJaWYgKHR0X2NvbW1vbl9lbnRyeS0+ZmxhZ3MgJiBUVF9DTElFTlRfTkVXKQogCQlyZXR1cm4gMDsKIAlyZXR1cm4gMTsKIH0KIAogc3RhdGljIGludCB0dF9nbG9iYWxfdmFsaWRfZW50cnkoY29uc3Qgdm9pZCAqZW50cnlfcHRyLCBjb25zdCB2b2lkICpkYXRhX3B0cikKIHsKLQljb25zdCBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5ICp0dF9nbG9iYWxfZW50cnkgPSBlbnRyeV9wdHI7CisJY29uc3Qgc3RydWN0IHR0X2NvbW1vbl9lbnRyeSAqdHRfY29tbW9uX2VudHJ5ID0gZW50cnlfcHRyOworCWNvbnN0IHN0cnVjdCB0dF9nbG9iYWxfZW50cnkgKnR0X2dsb2JhbF9lbnRyeTsKIAljb25zdCBzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGUgPSBkYXRhX3B0cjsKIAotCWlmICh0dF9nbG9iYWxfZW50cnktPmZsYWdzICYgVFRfQ0xJRU5UX1JPQU0pCisJaWYgKHR0X2NvbW1vbl9lbnRyeS0+ZmxhZ3MgJiBUVF9DTElFTlRfUk9BTSkKIAkJcmV0dXJuIDA7CiAKKwl0dF9nbG9iYWxfZW50cnkgPSBjb250YWluZXJfb2YodHRfY29tbW9uX2VudHJ5LCBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5LAorCQkJCSAgICAgICBjb21tb24pOworCiAJcmV0dXJuICh0dF9nbG9iYWxfZW50cnktPm9yaWdfbm9kZSA9PSBvcmlnX25vZGUpOwogfQogCkBAIC0xMDQwLDcgKzEwNDYsNyBAQAogCQkJCQkJCSAgICAgIGNvbnN0IHZvaWQgKiksCiAJCQkJCSAgICAgIHZvaWQgKmNiX2RhdGEpCiB7Ci0Jc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgdHRfY29tbW9uX2VudHJ5ICp0dF9jb21tb25fZW50cnk7CiAJc3RydWN0IHR0X3F1ZXJ5X3BhY2tldCAqdHRfcmVzcG9uc2U7CiAJc3RydWN0IHR0X2NoYW5nZSAqdHRfY2hhbmdlOwogCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOwpAQCAtMTA0OCw3ICsxMDU0LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gTlVMTDsKIAl1aW50MTZfdCB0dF90b3QsIHR0X2NvdW50OwogCXNzaXplX3QgdHRfcXVlcnlfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdHRfcXVlcnlfcGFja2V0KTsKLQlpbnQgaTsKKwl1aW50MzJfdCBpOwogCiAJaWYgKHR0X3F1ZXJ5X3NpemUgKyB0dF9sZW4gPiBwcmltYXJ5X2lmLT5zb2Z0X2lmYWNlLT5tdHUpIHsKIAkJdHRfbGVuID0gcHJpbWFyeV9pZi0+c29mdF9pZmFjZS0+bXR1IC0gdHRfcXVlcnlfc2l6ZTsKQEAgLTEwNzIsMTUgKzEwNzgsMTYgQEAKIAlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7CiAJCWhlYWQgPSAmaGFzaC0+dGFibGVbaV07CiAKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHR0X2xvY2FsX2VudHJ5LCBub2RlLAorCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfY29tbW9uX2VudHJ5LCBub2RlLAogCQkJCQkgaGVhZCwgaGFzaF9lbnRyeSkgewogCQkJaWYgKHR0X2NvdW50ID09IHR0X3RvdCkKIAkJCQlicmVhazsKIAotCQkJaWYgKCh2YWxpZF9jYikgJiYgKCF2YWxpZF9jYih0dF9sb2NhbF9lbnRyeSwgY2JfZGF0YSkpKQorCQkJaWYgKCh2YWxpZF9jYikgJiYgKCF2YWxpZF9jYih0dF9jb21tb25fZW50cnksIGNiX2RhdGEpKSkKIAkJCQljb250aW51ZTsKIAotCQkJbWVtY3B5KHR0X2NoYW5nZS0+YWRkciwgdHRfbG9jYWxfZW50cnktPmFkZHIsIEVUSF9BTEVOKTsKKwkJCW1lbWNweSh0dF9jaGFuZ2UtPmFkZHIsIHR0X2NvbW1vbl9lbnRyeS0+YWRkciwKKwkJCSAgICAgICBFVEhfQUxFTik7CiAJCQl0dF9jaGFuZ2UtPmZsYWdzID0gTk9fRkxBR1M7CiAKIAkJCXR0X2NvdW50Kys7CkBAIC0xMTg3LDExICsxMTk0LDExIEBACiAJCSh0dF9yZXF1ZXN0LT5mbGFncyAmIFRUX0ZVTExfVEFCTEUgPyAnRicgOiAnLicpKTsKIAogCS8qIExldCdzIGdldCB0aGUgb3JpZyBub2RlIG9mIHRoZSBSRUFMIGRlc3RpbmF0aW9uICovCi0JcmVxX2RzdF9vcmlnX25vZGUgPSBnZXRfb3JpZ19ub2RlKGJhdF9wcml2LCB0dF9yZXF1ZXN0LT5kc3QpOworCXJlcV9kc3Rfb3JpZ19ub2RlID0gb3JpZ19oYXNoX2ZpbmQoYmF0X3ByaXYsIHR0X3JlcXVlc3QtPmRzdCk7CiAJaWYgKCFyZXFfZHN0X29yaWdfbm9kZSkKIAkJZ290byBvdXQ7CiAKLQlyZXNfZHN0X29yaWdfbm9kZSA9IGdldF9vcmlnX25vZGUoYmF0X3ByaXYsIHR0X3JlcXVlc3QtPnNyYyk7CisJcmVzX2RzdF9vcmlnX25vZGUgPSBvcmlnX2hhc2hfZmluZChiYXRfcHJpdiwgdHRfcmVxdWVzdC0+c3JjKTsKIAlpZiAoIXJlc19kc3Rfb3JpZ19ub2RlKQogCQlnb3RvIG91dDsKIApAQCAtMTMxNyw3ICsxMzI0LDcgQEAKIAlteV90dHZuID0gKHVpbnQ4X3QpYXRvbWljX3JlYWQoJmJhdF9wcml2LT50dHZuKTsKIAlyZXFfdHR2biA9IHR0X3JlcXVlc3QtPnR0dm47CiAKLQlvcmlnX25vZGUgPSBnZXRfb3JpZ19ub2RlKGJhdF9wcml2LCB0dF9yZXF1ZXN0LT5zcmMpOworCW9yaWdfbm9kZSA9IG9yaWdfaGFzaF9maW5kKGJhdF9wcml2LCB0dF9yZXF1ZXN0LT5zcmMpOwogCWlmICghb3JpZ19ub2RlKQogCQlnb3RvIG91dDsKIApAQCAtMTQ5Nyw3ICsxNTA0LDcgQEAKIAkJZ290byBvdXQ7CiAJLyogQ2hlY2sgaWYgdGhlIGNsaWVudCBoYXMgYmVlbiBsb2dpY2FsbHkgZGVsZXRlZCAoYnV0IGlzIGtlcHQgZm9yCiAJICogY29uc2lzdGVuY3kgcHVycG9zZSkgKi8KLQlpZiAodHRfbG9jYWxfZW50cnktPmZsYWdzICYgVFRfQ0xJRU5UX1BFTkRJTkcpCisJaWYgKHR0X2xvY2FsX2VudHJ5LT5jb21tb24uZmxhZ3MgJiBUVF9DTElFTlRfUEVORElORykKIAkJZ290byBvdXQ7CiAJcmV0ID0gdHJ1ZTsKIG91dDoKQEAgLTE3MjAsNDUgKzE3MjcsNTMgQEAKIAlrZnJlZShiYXRfcHJpdi0+dHRfYnVmZik7CiB9CiAKLS8qIFRoaXMgZnVuY3Rpb24gd2lsbCByZXNldCB0aGUgc3BlY2lmaWVkIGZsYWdzIGZyb20gYWxsIHRoZSBlbnRyaWVzIGluCi0gKiB0aGUgZ2l2ZW4gaGFzaCB0YWJsZSBhbmQgd2lsbCBpbmNyZW1lbnQgbnVtX2xvY2FsX3R0IGZvciBlYWNoIGludm9sdmVkCi0gKiBlbnRyeSAqLwotc3RhdGljIHZvaWQgdHRfbG9jYWxfcmVzZXRfZmxhZ3Moc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdiwgdWludDE2X3QgZmxhZ3MpCisvKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZW5hYmxlIG9yIGRpc2FibGUgdGhlIHNwZWNpZmllZCBmbGFncyBmb3IgYWxsIHRoZSBlbnRyaWVzCisgKiBpbiB0aGUgZ2l2ZW4gaGFzaCB0YWJsZSBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIG1vZGlmaWVkIGVudHJpZXMgKi8KK3N0YXRpYyB1aW50MTZfdCB0dF9zZXRfZmxhZ3Moc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoLCB1aW50MTZfdCBmbGFncywKKwkJCSAgICAgYm9vbCBlbmFibGUpCiB7Ci0JaW50IGk7Ci0Jc3RydWN0IGhhc2h0YWJsZV90ICpoYXNoID0gYmF0X3ByaXYtPnR0X2xvY2FsX2hhc2g7CisJdWludDMyX3QgaTsKKwl1aW50MTZfdCBjaGFuZ2VkX251bSA9IDA7CiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7Ci0Jc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeTsKKwlzdHJ1Y3QgdHRfY29tbW9uX2VudHJ5ICp0dF9jb21tb25fZW50cnk7CiAKIAlpZiAoIWhhc2gpCi0JCXJldHVybjsKKwkJZ290byBvdXQ7CiAKIAlmb3IgKGkgPSAwOyBpIDwgaGFzaC0+c2l6ZTsgaSsrKSB7CiAJCWhlYWQgPSAmaGFzaC0+dGFibGVbaV07CiAKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfbG9jYWxfZW50cnksIG5vZGUsCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0dF9jb21tb25fZW50cnksIG5vZGUsCiAJCQkJCSBoZWFkLCBoYXNoX2VudHJ5KSB7Ci0JCQlpZiAoISh0dF9sb2NhbF9lbnRyeS0+ZmxhZ3MgJiBmbGFncykpCi0JCQkJY29udGludWU7Ci0JCQl0dF9sb2NhbF9lbnRyeS0+ZmxhZ3MgJj0gfmZsYWdzOwotCQkJYXRvbWljX2luYygmYmF0X3ByaXYtPm51bV9sb2NhbF90dCk7CisJCQlpZiAoZW5hYmxlKSB7CisJCQkJaWYgKCh0dF9jb21tb25fZW50cnktPmZsYWdzICYgZmxhZ3MpID09IGZsYWdzKQorCQkJCQljb250aW51ZTsKKwkJCQl0dF9jb21tb25fZW50cnktPmZsYWdzIHw9IGZsYWdzOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoISh0dF9jb21tb25fZW50cnktPmZsYWdzICYgZmxhZ3MpKQorCQkJCQljb250aW51ZTsKKwkJCQl0dF9jb21tb25fZW50cnktPmZsYWdzICY9IH5mbGFnczsKKwkJCX0KKwkJCWNoYW5nZWRfbnVtKys7CiAJCX0KIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJfQotCitvdXQ6CisJcmV0dXJuIGNoYW5nZWRfbnVtOwogfQogCiAvKiBQdXJnZSBvdXQgYWxsIHRoZSB0dCBsb2NhbCBlbnRyaWVzIG1hcmtlZCB3aXRoIFRUX0NMSUVOVF9QRU5ESU5HICovCiBzdGF0aWMgdm9pZCB0dF9sb2NhbF9wdXJnZV9wZW5kaW5nX2NsaWVudHMoc3RydWN0IGJhdF9wcml2ICpiYXRfcHJpdikKIHsKIAlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2ggPSBiYXRfcHJpdi0+dHRfbG9jYWxfaGFzaDsKKwlzdHJ1Y3QgdHRfY29tbW9uX2VudHJ5ICp0dF9jb21tb25fZW50cnk7CiAJc3RydWN0IHR0X2xvY2FsX2VudHJ5ICp0dF9sb2NhbF9lbnRyeTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZSwgKm5vZGVfdG1wOwogCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOwogCXNwaW5sb2NrX3QgKmxpc3RfbG9jazsgLyogcHJvdGVjdHMgd3JpdGUgYWNjZXNzIHRvIHRoZSBoYXNoIGxpc3RzICovCi0JaW50IGk7CisJdWludDMyX3QgaTsKIAogCWlmICghaGFzaCkKIAkJcmV0dXJuOwpAQCAtMTc2OCwxNiArMTc4MywxOSBAQAogCQlsaXN0X2xvY2sgPSAmaGFzaC0+bGlzdF9sb2Nrc1tpXTsKIAogCQlzcGluX2xvY2tfYmgobGlzdF9sb2NrKTsKLQkJaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0dF9sb2NhbF9lbnRyeSwgbm9kZSwgbm9kZV90bXAsCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodHRfY29tbW9uX2VudHJ5LCBub2RlLCBub2RlX3RtcCwKIAkJCQkJICBoZWFkLCBoYXNoX2VudHJ5KSB7Ci0JCQlpZiAoISh0dF9sb2NhbF9lbnRyeS0+ZmxhZ3MgJiBUVF9DTElFTlRfUEVORElORykpCisJCQlpZiAoISh0dF9jb21tb25fZW50cnktPmZsYWdzICYgVFRfQ0xJRU5UX1BFTkRJTkcpKQogCQkJCWNvbnRpbnVlOwogCiAJCQliYXRfZGJnKERCR19UVCwgYmF0X3ByaXYsICJEZWxldGluZyBsb2NhbCB0dCBlbnRyeSAiCi0JCQkJIiglcE0pOiBwZW5kaW5nXG4iLCB0dF9sb2NhbF9lbnRyeS0+YWRkcik7CisJCQkJIiglcE0pOiBwZW5kaW5nXG4iLCB0dF9jb21tb25fZW50cnktPmFkZHIpOwogCiAJCQlhdG9taWNfZGVjKCZiYXRfcHJpdi0+bnVtX2xvY2FsX3R0KTsKIAkJCWhsaXN0X2RlbF9yY3Uobm9kZSk7CisJCQl0dF9sb2NhbF9lbnRyeSA9IGNvbnRhaW5lcl9vZih0dF9jb21tb25fZW50cnksCisJCQkJCQkgICAgICBzdHJ1Y3QgdHRfbG9jYWxfZW50cnksCisJCQkJCQkgICAgICBjb21tb24pOwogCQkJdHRfbG9jYWxfZW50cnlfZnJlZV9yZWYodHRfbG9jYWxfZW50cnkpOwogCQl9CiAJCXNwaW5fdW5sb2NrX2JoKGxpc3RfbG9jayk7CkBAIC0xNzg3LDcgKzE4MDUsMTEgQEAKIAogdm9pZCB0dF9jb21taXRfY2hhbmdlcyhzdHJ1Y3QgYmF0X3ByaXYgKmJhdF9wcml2KQogewotCXR0X2xvY2FsX3Jlc2V0X2ZsYWdzKGJhdF9wcml2LCBUVF9DTElFTlRfTkVXKTsKKwl1aW50MTZfdCBjaGFuZ2VkX251bSA9IHR0X3NldF9mbGFncyhiYXRfcHJpdi0+dHRfbG9jYWxfaGFzaCwKKwkJCQkJICAgIFRUX0NMSUVOVF9ORVcsIGZhbHNlKTsKKwkvKiBhbGwgdGhlIHJlc2V0IGVudHJpZXMgaGF2ZSBub3cgdG8gYmUgZWZmZWN0aXZlbHkgY291bnRlZCBhcyBsb2NhbAorCSAqIGVudHJpZXMgKi8KKwlhdG9taWNfYWRkKGNoYW5nZWRfbnVtLCAmYmF0X3ByaXYtPm51bV9sb2NhbF90dCk7CiAJdHRfbG9jYWxfcHVyZ2VfcGVuZGluZ19jbGllbnRzKGJhdF9wcml2KTsKIAogCS8qIEluY3JlbWVudCB0aGUgVFRWTiBvbmx5IG9uY2UgcGVyIE9HTSBpbnRlcnZhbCAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvdHlwZXMuaCBiL25ldC9iYXRtYW4tYWR2L3R5cGVzLmgKaW5kZXggYWI4ZDBmZS4uZTllYjA0MyAxMDA2NDQKLS0tIGEvbmV0L2JhdG1hbi1hZHYvdHlwZXMuaAorKysgYi9uZXQvYmF0bWFuLWFkdi90eXBlcy5oCkBAIC0yMjIsMjQgKzIyMiwyNCBAQAogCXN0cnVjdCBpY21wX3BhY2tldF9yciBpY21wX3BhY2tldDsKIH07CiAKLXN0cnVjdCB0dF9sb2NhbF9lbnRyeSB7CitzdHJ1Y3QgdHRfY29tbW9uX2VudHJ5IHsKIAl1aW50OF90IGFkZHJbRVRIX0FMRU5dOwogCXN0cnVjdCBobGlzdF9ub2RlIGhhc2hfZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBsYXN0X3NlZW47CiAJdWludDE2X3QgZmxhZ3M7CiAJYXRvbWljX3QgcmVmY291bnQ7CiAJc3RydWN0IHJjdV9oZWFkIHJjdTsKIH07CiAKK3N0cnVjdCB0dF9sb2NhbF9lbnRyeSB7CisJc3RydWN0IHR0X2NvbW1vbl9lbnRyeSBjb21tb247CisJdW5zaWduZWQgbG9uZyBsYXN0X3NlZW47Cit9OworCiBzdHJ1Y3QgdHRfZ2xvYmFsX2VudHJ5IHsKLQl1aW50OF90IGFkZHJbRVRIX0FMRU5dOwotCXN0cnVjdCBobGlzdF9ub2RlIGhhc2hfZW50cnk7IC8qIGVudHJ5IGluIHRoZSBnbG9iYWwgdGFibGUgKi8KKwlzdHJ1Y3QgdHRfY29tbW9uX2VudHJ5IGNvbW1vbjsKIAlzdHJ1Y3Qgb3JpZ19ub2RlICpvcmlnX25vZGU7CiAJdWludDhfdCB0dHZuOwotCXVpbnQxNl90IGZsYWdzOyAvKiBvbmx5IFRUX0dMT0JBTF9ST0FNIGlzIHVzZWQgKi8KIAl1bnNpZ25lZCBsb25nIHJvYW1fYXQ7IC8qIHRpbWUgYXQgd2hpY2ggVFRfR0xPQkFMX1JPQU0gd2FzIHNldCAqLwotCWF0b21pY190IHJlZmNvdW50OwotCXN0cnVjdCByY3VfaGVhZCByY3U7CiB9OwogCiBzdHJ1Y3QgdHRfY2hhbmdlX25vZGUgewpkaWZmIC0tZ2l0IGEvbmV0L2JhdG1hbi1hZHYvdmlzLmMgYi9uZXQvYmF0bWFuLWFkdi92aXMuYwppbmRleCBmODFhNmI2Li5jYzNiOWYyIDEwMDY0NAotLS0gYS9uZXQvYmF0bWFuLWFkdi92aXMuYworKysgYi9uZXQvYmF0bWFuLWFkdi92aXMuYwpAQCAtNjYsNyArNjYsNyBAQAogCiAvKiBoYXNoIGZ1bmN0aW9uIHRvIGNob29zZSBhbiBlbnRyeSBpbiBhIGhhc2ggdGFibGUgb2YgZ2l2ZW4gc2l6ZSAqLwogLyogaGFzaCBhbGdvcml0aG0gZnJvbSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhc2hfdGFibGUgKi8KLXN0YXRpYyBpbnQgdmlzX2luZm9fY2hvb3NlKGNvbnN0IHZvaWQgKmRhdGEsIGludCBzaXplKQorc3RhdGljIHVpbnQzMl90IHZpc19pbmZvX2Nob29zZShjb25zdCB2b2lkICpkYXRhLCB1aW50MzJfdCBzaXplKQogewogCWNvbnN0IHN0cnVjdCB2aXNfaW5mbyAqdmlzX2luZm8gPSBkYXRhOwogCWNvbnN0IHN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7CkBAIC05Niw3ICs5Niw3IEBACiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJc3RydWN0IHZpc19pbmZvICp2aXNfaW5mbywgKnZpc19pbmZvX3RtcCA9IE5VTEw7Ci0JaW50IGluZGV4OworCXVpbnQzMl90IGluZGV4OwogCiAJaWYgKCFoYXNoKQogCQlyZXR1cm4gTlVMTDsKQEAgLTIwMiw3ICsyMDIsOCBAQAogCUhMSVNUX0hFQUQodmlzX2lmX2xpc3QpOwogCXN0cnVjdCBpZl9saXN0X2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcG9zLCAqbjsKLQlpbnQgaSwgaiwgcmV0ID0gMDsKKwl1aW50MzJfdCBpOworCWludCBqLCByZXQgPSAwOwogCWludCB2aXNfc2VydmVyID0gYXRvbWljX3JlYWQoJmJhdF9wcml2LT52aXNfbW9kZSk7CiAJc2l6ZV90IGJ1ZmZfcG9zLCBidWZfc2l6ZTsKIAljaGFyICpidWZmOwpAQCAtNTU2LDcgKzU1Nyw4IEBACiAJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CiAJc3RydWN0IG9yaWdfbm9kZSAqb3JpZ19ub2RlOwogCXN0cnVjdCB2aXNfcGFja2V0ICpwYWNrZXQ7Ci0JaW50IGJlc3RfdHEgPSAtMSwgaTsKKwlpbnQgYmVzdF90cSA9IC0xOworCXVpbnQzMl90IGk7CiAKIAlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwogCkBAIC02MDcsOCArNjA5LDkgQEAKIAlzdHJ1Y3QgdmlzX2luZm8gKmluZm8gPSBiYXRfcHJpdi0+bXlfdmlzX2luZm87CiAJc3RydWN0IHZpc19wYWNrZXQgKnBhY2tldCA9IChzdHJ1Y3QgdmlzX3BhY2tldCAqKWluZm8tPnNrYl9wYWNrZXQtPmRhdGE7CiAJc3RydWN0IHZpc19pbmZvX2VudHJ5ICplbnRyeTsKLQlzdHJ1Y3QgdHRfbG9jYWxfZW50cnkgKnR0X2xvY2FsX2VudHJ5OwotCWludCBiZXN0X3RxID0gLTEsIGk7CisJc3RydWN0IHR0X2NvbW1vbl9lbnRyeSAqdHRfY29tbW9uX2VudHJ5OworCWludCBiZXN0X3RxID0gLTE7CisJdWludDMyX3QgaTsKIAogCWluZm8tPmZpcnN0X3NlZW4gPSBqaWZmaWVzOwogCXBhY2tldC0+dmlzX3R5cGUgPSBhdG9taWNfcmVhZCgmYmF0X3ByaXYtPnZpc19tb2RlKTsKQEAgLTY2OSwxMyArNjcyLDEzIEBACiAJCWhlYWQgPSAmaGFzaC0+dGFibGVbaV07CiAKIAkJcmN1X3JlYWRfbG9jaygpOwotCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodHRfbG9jYWxfZW50cnksIG5vZGUsIGhlYWQsCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh0dF9jb21tb25fZW50cnksIG5vZGUsIGhlYWQsCiAJCQkJCSBoYXNoX2VudHJ5KSB7CiAJCQllbnRyeSA9IChzdHJ1Y3QgdmlzX2luZm9fZW50cnkgKikKIAkJCQkJc2tiX3B1dChpbmZvLT5za2JfcGFja2V0LAogCQkJCQkJc2l6ZW9mKCplbnRyeSkpOwogCQkJbWVtc2V0KGVudHJ5LT5zcmMsIDAsIEVUSF9BTEVOKTsKLQkJCW1lbWNweShlbnRyeS0+ZGVzdCwgdHRfbG9jYWxfZW50cnktPmFkZHIsIEVUSF9BTEVOKTsKKwkJCW1lbWNweShlbnRyeS0+ZGVzdCwgdHRfY29tbW9uX2VudHJ5LT5hZGRyLCBFVEhfQUxFTik7CiAJCQllbnRyeS0+cXVhbGl0eSA9IDA7IC8qIDAgbWVhbnMgVFQgKi8KIAkJCXBhY2tldC0+ZW50cmllcysrOwogCkBAIC02OTYsNyArNjk5LDcgQEAKICAqIGhlbGQgKi8KIHN0YXRpYyB2b2lkIHB1cmdlX3Zpc19wYWNrZXRzKHN0cnVjdCBiYXRfcHJpdiAqYmF0X3ByaXYpCiB7Ci0JaW50IGk7CisJdWludDMyX3QgaTsKIAlzdHJ1Y3QgaGFzaHRhYmxlX3QgKmhhc2ggPSBiYXRfcHJpdi0+dmlzX2hhc2g7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGUsICpub2RlX3RtcDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKQEAgLTczMyw3ICs3MzYsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGhhcmRfaWZhY2UgKmhhcmRfaWZhY2U7CiAJdWludDhfdCBkc3RhZGRyW0VUSF9BTEVOXTsKLQlpbnQgaTsKKwl1aW50MzJfdCBpOwogCiAKIAlwYWNrZXQgPSAoc3RydWN0IHZpc19wYWNrZXQgKilpbmZvLT5za2JfcGFja2V0LT5kYXRhOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9LY29uZmlnIGIvbmV0L2JsdWV0b290aC9LY29uZmlnCmluZGV4IGJmYjNkYzAuLjllYzg1ZWIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvS2NvbmZpZworKysgYi9uZXQvYmx1ZXRvb3RoL0tjb25maWcKQEAgLTYsNyArNiwxMSBAQAogCXRyaXN0YXRlICJCbHVldG9vdGggc3Vic3lzdGVtIHN1cHBvcnQiCiAJZGVwZW5kcyBvbiBORVQgJiYgIVMzOTAKIAlkZXBlbmRzIG9uIFJGS0lMTCB8fCAhUkZLSUxMCisJc2VsZWN0IENSQzE2CiAJc2VsZWN0IENSWVBUTworCXNlbGVjdCBDUllQVE9fQkxLQ0lQSEVSCisJc2VsZWN0IENSWVBUT19BRVMKKwlzZWxlY3QgQ1JZUFRPX0VDQgogCWhlbHAKIAkgIEJsdWV0b290aCBpcyBsb3ctY29zdCwgbG93LXBvd2VyLCBzaG9ydC1yYW5nZSB3aXJlbGVzcyB0ZWNobm9sb2d5LgogCSAgSXQgd2FzIGRlc2lnbmVkIGFzIGEgcmVwbGFjZW1lbnQgZm9yIGNhYmxlcyBhbmQgb3RoZXIgc2hvcnQtcmFuZ2UKQEAgLTE1LDEwICsxOSwxMiBAQAogCSAgQmx1ZXRvb3RoIGNhbiBiZSBmb3VuZCBhdCA8aHR0cDovL3d3dy5ibHVldG9vdGguY29tLz4uCiAKIAkgIExpbnV4IEJsdWV0b290aCBzdWJzeXN0ZW0gY29uc2lzdCBvZiBzZXZlcmFsIGxheWVyczoKLQkgICAgIEJsdWV0b290aCBDb3JlIChIQ0kgZGV2aWNlIGFuZCBjb25uZWN0aW9uIG1hbmFnZXIsIHNjaGVkdWxlcikKKwkgICAgIEJsdWV0b290aCBDb3JlCisJCUhDSSBkZXZpY2UgYW5kIGNvbm5lY3Rpb24gbWFuYWdlciwgc2NoZWR1bGVyCisJCVNDTyBhdWRpbyBsaW5rcworCQlMMkNBUCAoTG9naWNhbCBMaW5rIENvbnRyb2wgYW5kIEFkYXB0YXRpb24gUHJvdG9jb2wpCisJCVNNUCAoU2VjdXJpdHkgTWFuYWdlciBQcm90b2NvbCkgb24gTEUgKExvdyBFbmVyZ3kpIGxpbmtzCiAJICAgICBIQ0kgRGV2aWNlIGRyaXZlcnMgKEludGVyZmFjZSB0byB0aGUgaGFyZHdhcmUpCi0JICAgICBTQ08gTW9kdWxlIChTQ08gYXVkaW8gbGlua3MpCi0JICAgICBMMkNBUCBNb2R1bGUgKExvZ2ljYWwgTGluayBDb250cm9sIGFuZCBBZGFwdGF0aW9uIFByb3RvY29sKQogCSAgICAgUkZDT01NIE1vZHVsZSAoUkZDT01NIFByb3RvY29sKSAgCiAJICAgICBCTkVQIE1vZHVsZSAoQmx1ZXRvb3RoIE5ldHdvcmsgRW5jYXBzdWxhdGlvbiBQcm90b2NvbCkKIAkgICAgIENNVFAgTW9kdWxlIChDQVBJIE1lc3NhZ2UgVHJhbnNwb3J0IFByb3RvY29sKQpAQCAtMzMsMzEgKzM5LDYgQEAKIAkgIHRvIEJsdWV0b290aCBrZXJuZWwgbW9kdWxlcyBhcmUgcHJvdmlkZWQgaW4gdGhlIEJsdWVaIHBhY2thZ2VzLiAgRm9yCiAJICBtb3JlIGluZm9ybWF0aW9uLCBzZWUgPGh0dHA6Ly93d3cuYmx1ZXoub3JnLz4uCiAKLWlmIEJUICE9IG4KLQotY29uZmlnIEJUX0wyQ0FQCi0JYm9vbCAiTDJDQVAgcHJvdG9jb2wgc3VwcG9ydCIKLQlzZWxlY3QgQ1JDMTYKLQlzZWxlY3QgQ1JZUFRPCi0Jc2VsZWN0IENSWVBUT19CTEtDSVBIRVIKLQlzZWxlY3QgQ1JZUFRPX0FFUwotCXNlbGVjdCBDUllQVE9fRUNCCi0JaGVscAotCSAgTDJDQVAgKExvZ2ljYWwgTGluayBDb250cm9sIGFuZCBBZGFwdGF0aW9uIFByb3RvY29sKSBwcm92aWRlcwotCSAgY29ubmVjdGlvbiBvcmllbnRlZCBhbmQgY29ubmVjdGlvbi1sZXNzIGRhdGEgdHJhbnNwb3J0LiAgTDJDQVAKLQkgIHN1cHBvcnQgaXMgcmVxdWlyZWQgZm9yIG1vc3QgQmx1ZXRvb3RoIGFwcGxpY2F0aW9ucy4KLQotCSAgQWxzbyBpbmNsdWRlZCBpcyBzdXBwb3J0IGZvciBTTVAgKFNlY3VyaXR5IE1hbmFnZXIgUHJvdG9jb2wpIHdoaWNoCi0JICBpcyB0aGUgc2VjdXJpdHkgbGF5ZXIgb24gdG9wIG9mIExFIChMb3cgRW5lcmd5KSBsaW5rcy4KLQotY29uZmlnIEJUX1NDTwotCWJvb2wgIlNDTyBsaW5rcyBzdXBwb3J0IgotCWhlbHAKLQkgIFNDTyBsaW5rIHByb3ZpZGVzIHZvaWNlIHRyYW5zcG9ydCBvdmVyIEJsdWV0b290aC4gIFNDTyBzdXBwb3J0IGlzCi0JICByZXF1aXJlZCBmb3Igdm9pY2UgYXBwbGljYXRpb25zIGxpa2UgSGVhZHNldCBhbmQgQXVkaW8uCi0KLWVuZGlmCi0KIHNvdXJjZSAibmV0L2JsdWV0b290aC9yZmNvbW0vS2NvbmZpZyIKIAogc291cmNlICJuZXQvYmx1ZXRvb3RoL2JuZXAvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvTWFrZWZpbGUgYi9uZXQvYmx1ZXRvb3RoL01ha2VmaWxlCmluZGV4IDliNjdmM2QuLjJkYzVhNTcgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvTWFrZWZpbGUKKysrIGIvbmV0L2JsdWV0b290aC9NYWtlZmlsZQpAQCAtOCw2ICs4LDUgQEAKIG9iai0kKENPTkZJR19CVF9DTVRQKQkrPSBjbXRwLwogb2JqLSQoQ09ORklHX0JUX0hJRFApCSs9IGhpZHAvCiAKLWJsdWV0b290aC15IDo9IGFmX2JsdWV0b290aC5vIGhjaV9jb3JlLm8gaGNpX2Nvbm4ubyBoY2lfZXZlbnQubyBtZ210Lm8gaGNpX3NvY2subyBoY2lfc3lzZnMubyBsaWIubwotYmx1ZXRvb3RoLSQoQ09ORklHX0JUX0wyQ0FQKQkrPSBsMmNhcF9jb3JlLm8gbDJjYXBfc29jay5vIHNtcC5vCi1ibHVldG9vdGgtJChDT05GSUdfQlRfU0NPKQkrPSBzY28ubworYmx1ZXRvb3RoLXkgOj0gYWZfYmx1ZXRvb3RoLm8gaGNpX2NvcmUubyBoY2lfY29ubi5vIGhjaV9ldmVudC5vIG1nbXQubyBcCisJaGNpX3NvY2subyBoY2lfc3lzZnMubyBsMmNhcF9jb3JlLm8gbDJjYXBfc29jay5vIHNtcC5vIHNjby5vIGxpYi5vCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jIGIvbmV0L2JsdWV0b290aC9hZl9ibHVldG9vdGguYwppbmRleCAwNjIxMjRjLi5jZGNmY2FiIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2FmX2JsdWV0b290aC5jCisrKyBiL25ldC9ibHVldG9vdGgvYWZfYmx1ZXRvb3RoLmMKQEAgLTE5OSwxNSArMTk5LDE0IEBACiAKIAlCVF9EQkcoInBhcmVudCAlcCIsIHBhcmVudCk7CiAKLQlsb2NhbF9iaF9kaXNhYmxlKCk7CiAJbGlzdF9mb3JfZWFjaF9zYWZlKHAsIG4sICZidF9zayhwYXJlbnQpLT5hY2NlcHRfcSkgewogCQlzayA9IChzdHJ1Y3Qgc29jayAqKSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBidF9zb2NrLCBhY2NlcHRfcSk7CiAKLQkJYmhfbG9ja19zb2NrKHNrKTsKKwkJbG9ja19zb2NrKHNrKTsKIAogCQkvKiBGSVhNRTogSXMgdGhpcyBjaGVjayBzdGlsbCBuZWVkZWQgKi8KIAkJaWYgKHNrLT5za19zdGF0ZSA9PSBCVF9DTE9TRUQpIHsKLQkJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJCXJlbGVhc2Vfc29jayhzayk7CiAJCQlidF9hY2NlcHRfdW5saW5rKHNrKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC0yMTgsMTQgKzIxNywxMiBAQAogCQkJaWYgKG5ld3NvY2spCiAJCQkJc29ja19ncmFmdChzaywgbmV3c29jayk7CiAKLQkJCWJoX3VubG9ja19zb2NrKHNrKTsKLQkJCWxvY2FsX2JoX2VuYWJsZSgpOworCQkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJCXJldHVybiBzazsKIAkJfQogCi0JCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKIAl9Ci0JbG9jYWxfYmhfZW5hYmxlKCk7CiAKIAlyZXR1cm4gTlVMTDsKIH0KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvYm5lcC9LY29uZmlnIGIvbmV0L2JsdWV0b290aC9ibmVwL0tjb25maWcKaW5kZXggMzUxNThiMC4uNzE3OTFmYyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL0tjb25maWcKKysrIGIvbmV0L2JsdWV0b290aC9ibmVwL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgQlRfQk5FUAogCXRyaXN0YXRlICJCTkVQIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCVCAmJiBCVF9MMkNBUAorCWRlcGVuZHMgb24gQlQKIAlzZWxlY3QgQ1JDMzIKIAloZWxwCiAJICBCTkVQIChCbHVldG9vdGggTmV0d29yayBFbmNhcHN1bGF0aW9uIFByb3RvY29sKSBpcyBFdGhlcm5ldApkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYyBiL25ldC9ibHVldG9vdGgvYm5lcC9jb3JlLmMKaW5kZXggOTFiY2QzYS4uYTc3OWVjNyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9ibmVwL2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2JuZXAvY29yZS5jCkBAIC01Niw4ICs1Niw4IEBACiAKICNkZWZpbmUgVkVSU0lPTiAiMS4zIgogCi1zdGF0aWMgaW50IGNvbXByZXNzX3NyYyA9IDE7Ci1zdGF0aWMgaW50IGNvbXByZXNzX2RzdCA9IDE7CitzdGF0aWMgYm9vbCBjb21wcmVzc19zcmMgPSB0cnVlOworc3RhdGljIGJvb2wgY29tcHJlc3NfZHN0ID0gdHJ1ZTsKIAogc3RhdGljIExJU1RfSEVBRChibmVwX3Nlc3Npb25fbGlzdCk7CiBzdGF0aWMgREVDTEFSRV9SV1NFTShibmVwX3Nlc3Npb25fc2VtKTsKQEAgLTY1LDMxICs2NSwyNCBAQAogc3RhdGljIHN0cnVjdCBibmVwX3Nlc3Npb24gKl9fYm5lcF9nZXRfc2Vzc2lvbih1OCAqZHN0KQogewogCXN0cnVjdCBibmVwX3Nlc3Npb24gKnM7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAogCUJUX0RCRygiIik7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZibmVwX3Nlc3Npb25fbGlzdCkgewotCQlzID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYm5lcF9zZXNzaW9uLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZibmVwX3Nlc3Npb25fbGlzdCwgbGlzdCkKIAkJaWYgKCFjb21wYXJlX2V0aGVyX2FkZHIoZHN0LCBzLT5laC5oX3NvdXJjZSkpCiAJCQlyZXR1cm4gczsKLQl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIAogc3RhdGljIHZvaWQgX19ibmVwX2xpbmtfc2Vzc2lvbihzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzKQogewotCS8qIEl0J3Mgc2FmZSB0byBjYWxsIF9fbW9kdWxlX2dldCgpIGhlcmUgYmVjYXVzZSBzZXNzaW9ucyBhcmUgYWRkZWQKLQkgICBieSB0aGUgc29ja2V0IGxheWVyIHdoaWNoIGhhcyB0byBob2xkIHRoZSByZWZlcmVuY2UgdG8gdGhpcyBtb2R1bGUuCi0JICovCi0JX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKIAlsaXN0X2FkZCgmcy0+bGlzdCwgJmJuZXBfc2Vzc2lvbl9saXN0KTsKIH0KIAogc3RhdGljIHZvaWQgX19ibmVwX3VubGlua19zZXNzaW9uKHN0cnVjdCBibmVwX3Nlc3Npb24gKnMpCiB7CiAJbGlzdF9kZWwoJnMtPmxpc3QpOwotCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOwogfQogCiBzdGF0aWMgaW50IGJuZXBfc2VuZChzdHJ1Y3QgYm5lcF9zZXNzaW9uICpzLCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKQpAQCAtNTMwLDYgKzUyMyw3IEBACiAKIAl1cF93cml0ZSgmYm5lcF9zZXNzaW9uX3NlbSk7CiAJZnJlZV9uZXRkZXYoZGV2KTsKKwltb2R1bGVfcHV0X2FuZF9leGl0KDApOwogCXJldHVybiAwOwogfQogCkBAIC02MTYsOSArNjEwLDExIEBACiAKIAlfX2JuZXBfbGlua19zZXNzaW9uKHMpOwogCisJX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKIAlzLT50YXNrID0ga3RocmVhZF9ydW4oYm5lcF9zZXNzaW9uLCBzLCAia2JuZXBkICVzIiwgZGV2LT5uYW1lKTsKIAlpZiAoSVNfRVJSKHMtPnRhc2spKSB7CiAJCS8qIFNlc3Npb24gdGhyZWFkIHN0YXJ0IGZhaWxlZCwgZ290dGEgY2xlYW51cC4gKi8KKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiAJCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CiAJCV9fYm5lcF91bmxpbmtfc2Vzc2lvbihzKTsKIAkJZXJyID0gUFRSX0VSUihzLT50YXNrKTsKQEAgLTY2NywxNyArNjYzLDE0IEBACiAKIGludCBibmVwX2dldF9jb25ubGlzdChzdHJ1Y3QgYm5lcF9jb25ubGlzdF9yZXEgKnJlcSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBibmVwX3Nlc3Npb24gKnM7CiAJaW50IGVyciA9IDAsIG4gPSAwOwogCiAJZG93bl9yZWFkKCZibmVwX3Nlc3Npb25fc2VtKTsKIAotCWxpc3RfZm9yX2VhY2gocCwgJmJuZXBfc2Vzc2lvbl9saXN0KSB7Ci0JCXN0cnVjdCBibmVwX3Nlc3Npb24gKnM7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzLCAmYm5lcF9zZXNzaW9uX2xpc3QsIGxpc3QpIHsKIAkJc3RydWN0IGJuZXBfY29ubmluZm8gY2k7CiAKLQkJcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGJuZXBfc2Vzc2lvbiwgbGlzdCk7Ci0KIAkJX19ibmVwX2NvcHlfY2koJmNpLCBzKTsKIAogCQlpZiAoY29weV90b191c2VyKHJlcS0+Y2ksICZjaSwgc2l6ZW9mKGNpKSkpIHsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvY210cC9LY29uZmlnIGIvbmV0L2JsdWV0b290aC9jbXRwL0tjb25maWcKaW5kZXggZDZiMDM4Mi4uOTRjYmY0MiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9jbXRwL0tjb25maWcKKysrIGIvbmV0L2JsdWV0b290aC9jbXRwL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgQlRfQ01UUAogCXRyaXN0YXRlICJDTVRQIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCVCAmJiBCVF9MMkNBUCAmJiBJU0ROX0NBUEkKKwlkZXBlbmRzIG9uIEJUICYmIElTRE5fQ0FQSQogCWhlbHAKIAkgIENNVFAgKENBUEkgTWVzc2FnZSBUcmFuc3BvcnQgUHJvdG9jb2wpIGlzIGEgdHJhbnNwb3J0IGxheWVyCiAJICBmb3IgQ0FQSSBtZXNzYWdlcy4gIENNVFAgaXMgcmVxdWlyZWQgZm9yIHRoZSBCbHVldG9vdGggQ29tbW9uCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jIGIvbmV0L2JsdWV0b290aC9jbXRwL2NvcmUuYwppbmRleCA3ZDAwZGRmLi42YzljMWZkIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2NtdHAvY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvY210cC9jb3JlLmMKQEAgLTUzLDI4ICs1MywyNCBAQAogc3RhdGljIHN0cnVjdCBjbXRwX3Nlc3Npb24gKl9fY210cF9nZXRfc2Vzc2lvbihiZGFkZHJfdCAqYmRhZGRyKQogewogCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb247Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAogCUJUX0RCRygiIik7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZjbXRwX3Nlc3Npb25fbGlzdCkgewotCQlzZXNzaW9uID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgY210cF9zZXNzaW9uLCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlc3Npb24sICZjbXRwX3Nlc3Npb25fbGlzdCwgbGlzdCkKIAkJaWYgKCFiYWNtcChiZGFkZHIsICZzZXNzaW9uLT5iZGFkZHIpKQogCQkJcmV0dXJuIHNlc3Npb247Ci0JfQorCiAJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyB2b2lkIF9fY210cF9saW5rX3Nlc3Npb24oc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKLQlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwogCWxpc3RfYWRkKCZzZXNzaW9uLT5saXN0LCAmY210cF9zZXNzaW9uX2xpc3QpOwogfQogCiBzdGF0aWMgdm9pZCBfX2NtdHBfdW5saW5rX3Nlc3Npb24oc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKIAlsaXN0X2RlbCgmc2Vzc2lvbi0+bGlzdCk7Ci0JbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fY210cF9jb3B5X3Nlc3Npb24oc3RydWN0IGNtdHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IGNtdHBfY29ubmluZm8gKmNpKQpAQCAtMzI3LDYgKzMyMyw3IEBACiAJdXBfd3JpdGUoJmNtdHBfc2Vzc2lvbl9zZW0pOwogCiAJa2ZyZWUoc2Vzc2lvbik7CisJbW9kdWxlX3B1dF9hbmRfZXhpdCgwKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzc2LDkgKzM3MywxMSBAQAogCiAJX19jbXRwX2xpbmtfc2Vzc2lvbihzZXNzaW9uKTsKIAorCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CiAJc2Vzc2lvbi0+dGFzayA9IGt0aHJlYWRfcnVuKGNtdHBfc2Vzc2lvbiwgc2Vzc2lvbiwgImtjbXRwZF9jdHJfJWQiLAogCQkJCQkJCQlzZXNzaW9uLT5udW0pOwogCWlmIChJU19FUlIoc2Vzc2lvbi0+dGFzaykpIHsKKwkJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiAJCWVyciA9IFBUUl9FUlIoc2Vzc2lvbi0+dGFzayk7CiAJCWdvdG8gdW5saW5rOwogCX0KQEAgLTQzMSwxOSArNDMwLDE2IEBACiAKIGludCBjbXRwX2dldF9jb25ubGlzdChzdHJ1Y3QgY210cF9jb25ubGlzdF9yZXEgKnJlcSkKIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBjbXRwX3Nlc3Npb24gKnNlc3Npb247CiAJaW50IGVyciA9IDAsIG4gPSAwOwogCiAJQlRfREJHKCIiKTsKIAogCWRvd25fcmVhZCgmY210cF9zZXNzaW9uX3NlbSk7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZjbXRwX3Nlc3Npb25fbGlzdCkgewotCQlzdHJ1Y3QgY210cF9zZXNzaW9uICpzZXNzaW9uOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2Vzc2lvbiwgJmNtdHBfc2Vzc2lvbl9saXN0LCBsaXN0KSB7CiAJCXN0cnVjdCBjbXRwX2Nvbm5pbmZvIGNpOwogCi0JCXNlc3Npb24gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBjbXRwX3Nlc3Npb24sIGxpc3QpOwotCiAJCV9fY210cF9jb3B5X3Nlc3Npb24oc2Vzc2lvbiwgJmNpKTsKIAogCQlpZiAoY29weV90b191c2VyKHJlcS0+Y2ksICZjaSwgc2l6ZW9mKGNpKSkpIHsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYyBiL25ldC9ibHVldG9vdGgvaGNpX2Nvbm4uYwppbmRleCBlMGFmNzIzLi4zZGI0MzI0IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2hjaV9jb25uLmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfY29ubi5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAogCUJUX0RCRygiJXAiLCBjb25uKTsKIAotCWlmIChjb25uLT5oZGV2LT5oY2lfdmVyIDwgMikKKwlpZiAoY29ubi0+aGRldi0+aGNpX3ZlciA8IEJMVUVUT09USF9WRVJfMV8yKQogCQlyZXR1cm47CiAKIAliYWNweSgmY3AuYmRhZGRyLCAmY29ubi0+ZHN0KTsKQEAgLTI3NSw5ICsyNzUsMTAgQEAKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGhjaV9jb25uX3RpbWVvdXQodW5zaWduZWQgbG9uZyBhcmcpCitzdGF0aWMgdm9pZCBoY2lfY29ubl90aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4gPSAodm9pZCAqKSBhcmc7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBoY2lfY29ubiwKKwkJCQkJCQlkaXNjX3dvcmsud29yayk7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OwogCV9fdTggcmVhc29uOwogCkBAIC0zMTEsNiArMzEyLDQyIEBACiAJaGNpX2Rldl91bmxvY2soaGRldik7CiB9CiAKKy8qIEVudGVyIHNuaWZmIG1vZGUgKi8KK3N0YXRpYyB2b2lkIGhjaV9jb25uX2VudGVyX3NuaWZmX21vZGUoc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKworCUJUX0RCRygiY29ubiAlcCBtb2RlICVkIiwgY29ubiwgY29ubi0+bW9kZSk7CisKKwlpZiAodGVzdF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKSkKKwkJcmV0dXJuOworCisJaWYgKCFsbXBfc25pZmZfY2FwYWJsZShoZGV2KSB8fCAhbG1wX3NuaWZmX2NhcGFibGUoY29ubikpCisJCXJldHVybjsKKworCWlmIChjb25uLT5tb2RlICE9IEhDSV9DTV9BQ1RJVkUgfHwgIShjb25uLT5saW5rX3BvbGljeSAmIEhDSV9MUF9TTklGRikpCisJCXJldHVybjsKKworCWlmIChsbXBfc25pZmZzdWJyX2NhcGFibGUoaGRldikgJiYgbG1wX3NuaWZmc3Vicl9jYXBhYmxlKGNvbm4pKSB7CisJCXN0cnVjdCBoY2lfY3Bfc25pZmZfc3VicmF0ZSBjcDsKKwkJY3AuaGFuZGxlICAgICAgICAgICAgID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKKwkJY3AubWF4X2xhdGVuY3kgICAgICAgID0gY3B1X3RvX2xlMTYoMCk7CisJCWNwLm1pbl9yZW1vdGVfdGltZW91dCA9IGNwdV90b19sZTE2KDApOworCQljcC5taW5fbG9jYWxfdGltZW91dCAgPSBjcHVfdG9fbGUxNigwKTsKKwkJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9TTklGRl9TVUJSQVRFLCBzaXplb2YoY3ApLCAmY3ApOworCX0KKworCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfQ09OTl9NT0RFX0NIQU5HRV9QRU5ELCAmY29ubi0+cGVuZCkpIHsKKwkJc3RydWN0IGhjaV9jcF9zbmlmZl9tb2RlIGNwOworCQljcC5oYW5kbGUgICAgICAgPSBjcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOworCQljcC5tYXhfaW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihoZGV2LT5zbmlmZl9tYXhfaW50ZXJ2YWwpOworCQljcC5taW5faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihoZGV2LT5zbmlmZl9taW5faW50ZXJ2YWwpOworCQljcC5hdHRlbXB0ICAgICAgPSBjcHVfdG9fbGUxNig0KTsKKwkJY3AudGltZW91dCAgICAgID0gY3B1X3RvX2xlMTYoMSk7CisJCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfU05JRkZfTU9ERSwgc2l6ZW9mKGNwKSwgJmNwKTsKKwl9Cit9CisKIHN0YXRpYyB2b2lkIGhjaV9jb25uX2lkbGUodW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IGhjaV9jb25uICpjb25uID0gKHZvaWQgKikgYXJnOwpAQCAtMzI1LDEyICszNjIsOCBAQAogCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9ICh2b2lkICopIGFyZzsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7CiAKLQloY2lfZGV2X2xvY2soaGRldik7Ci0KIAloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1VTRVJfQ09ORklSTV9SRVBMWSwgc2l6ZW9mKGNvbm4tPmRzdCksCiAJCQkJCQkJCSZjb25uLT5kc3QpOwotCi0JaGNpX2Rldl91bmxvY2soaGRldik7CiB9CiAKIHN0cnVjdCBoY2lfY29ubiAqaGNpX2Nvbm5fYWRkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBpbnQgdHlwZSwgYmRhZGRyX3QgKmRzdCkKQEAgLTM3NCw3ICs0MDcsOSBAQAogCiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmY29ubi0+ZGF0YV9xKTsKIAotCXNldHVwX3RpbWVyKCZjb25uLT5kaXNjX3RpbWVyLCBoY2lfY29ubl90aW1lb3V0LCAodW5zaWduZWQgbG9uZyljb25uKTsKKwlJTklUX0xJU1RfSEVBRCgmY29ubi0+Y2hhbl9saXN0KTs7CisKKwlJTklUX0RFTEFZRURfV09SSygmY29ubi0+ZGlzY193b3JrLCBoY2lfY29ubl90aW1lb3V0KTsKIAlzZXR1cF90aW1lcigmY29ubi0+aWRsZV90aW1lciwgaGNpX2Nvbm5faWRsZSwgKHVuc2lnbmVkIGxvbmcpY29ubik7CiAJc2V0dXBfdGltZXIoJmNvbm4tPmF1dG9fYWNjZXB0X3RpbWVyLCBoY2lfY29ubl9hdXRvX2FjY2VwdCwKIAkJCQkJCQkodW5zaWduZWQgbG9uZykgY29ubik7CkBAIC0zODMsOCArNDE4LDYgQEAKIAogCWhjaV9kZXZfaG9sZChoZGV2KTsKIAotCXRhc2tsZXRfZGlzYWJsZSgmaGRldi0+dHhfdGFzayk7Ci0KIAloY2lfY29ubl9oYXNoX2FkZChoZGV2LCBjb25uKTsKIAlpZiAoaGRldi0+bm90aWZ5KQogCQloZGV2LT5ub3RpZnkoaGRldiwgSENJX05PVElGWV9DT05OX0FERCk7CkBAIC0zOTMsOCArNDI2LDYgQEAKIAogCWhjaV9jb25uX2luaXRfc3lzZnMoY29ubik7CiAKLQl0YXNrbGV0X2VuYWJsZSgmaGRldi0+dHhfdGFzayk7Ci0KIAlyZXR1cm4gY29ubjsKIH0KIApAQCAtNDA2LDcgKzQzNyw3IEBACiAKIAlkZWxfdGltZXIoJmNvbm4tPmlkbGVfdGltZXIpOwogCi0JZGVsX3RpbWVyKCZjb25uLT5kaXNjX3RpbWVyKTsKKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJmNvbm4tPmRpc2Nfd29yayk7CiAKIAlkZWxfdGltZXIoJmNvbm4tPmF1dG9fYWNjZXB0X3RpbWVyKTsKIApAQCAtNDMwLDE0ICs0NjEsMTMgQEAKIAkJfQogCX0KIAotCXRhc2tsZXRfZGlzYWJsZSgmaGRldi0+dHhfdGFzayk7CisKKwloY2lfY2hhbl9saXN0X2ZsdXNoKGNvbm4pOwogCiAJaGNpX2Nvbm5faGFzaF9kZWwoaGRldiwgY29ubik7CiAJaWYgKGhkZXYtPm5vdGlmeSkKIAkJaGRldi0+bm90aWZ5KGhkZXYsIEhDSV9OT1RJRllfQ09OTl9ERUwpOwogCi0JdGFza2xldF9lbmFibGUoJmhkZXYtPnR4X3Rhc2spOwotCiAJc2tiX3F1ZXVlX3B1cmdlKCZjb25uLT5kYXRhX3EpOwogCiAJaGNpX2Nvbm5fcHV0X2RldmljZShjb25uKTsKQEAgLTQ1MywxNiArNDgzLDEzIEBACiBzdHJ1Y3QgaGNpX2RldiAqaGNpX2dldF9yb3V0ZShiZGFkZHJfdCAqZHN0LCBiZGFkZHJfdCAqc3JjKQogewogCWludCB1c2Vfc3JjID0gYmFjbXAoc3JjLCBCREFERFJfQU5ZKTsKLQlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IE5VTEw7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IE5VTEwsICpkOwogCiAJQlRfREJHKCIlcyAtPiAlcyIsIGJhdG9zdHIoc3JjKSwgYmF0b3N0cihkc3QpKTsKIAotCXJlYWRfbG9ja19iaCgmaGNpX2Rldl9saXN0X2xvY2spOworCXJlYWRfbG9jaygmaGNpX2Rldl9saXN0X2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmaGNpX2Rldl9saXN0KSB7Ci0JCXN0cnVjdCBoY2lfZGV2ICpkID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2RldiwgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZoY2lfZGV2X2xpc3QsIGxpc3QpIHsKIAkJaWYgKCF0ZXN0X2JpdChIQ0lfVVAsICZkLT5mbGFncykgfHwgdGVzdF9iaXQoSENJX1JBVywgJmQtPmZsYWdzKSkKIAkJCWNvbnRpbnVlOwogCkBAIC00ODUsNyArNTEyLDcgQEAKIAlpZiAoaGRldikKIAkJaGRldiA9IGhjaV9kZXZfaG9sZChoZGV2KTsKIAotCXJlYWRfdW5sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisJcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKIAlyZXR1cm4gaGRldjsKIH0KIEVYUE9SVF9TWU1CT0woaGNpX2dldF9yb3V0ZSk7CkBAIC02NzMsNyArNzAwLDcgQEAKIAkJZ290byBlbmNyeXB0OwogCiBhdXRoOgotCWlmICh0ZXN0X2FuZF9zZXRfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmNvbm4tPnBlbmQpKQorCWlmICh0ZXN0X2JpdChIQ0lfQ09OTl9FTkNSWVBUX1BFTkQsICZjb25uLT5wZW5kKSkKIAkJcmV0dXJuIDA7CiAKIAlpZiAoIWhjaV9jb25uX2F1dGgoY29ubiwgc2VjX2xldmVsLCBhdXRoX3R5cGUpKQpAQCAtNzY2LDYwICs3OTMsMTggQEAKIAkJCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKGhkZXYtPmlkbGVfdGltZW91dCkpOwogfQogCi0vKiBFbnRlciBzbmlmZiBtb2RlICovCi12b2lkIGhjaV9jb25uX2VudGVyX3NuaWZmX21vZGUoc3RydWN0IGhjaV9jb25uICpjb25uKQotewotCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKLQotCUJUX0RCRygiY29ubiAlcCBtb2RlICVkIiwgY29ubiwgY29ubi0+bW9kZSk7Ci0KLQlpZiAodGVzdF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKSkKLQkJcmV0dXJuOwotCi0JaWYgKCFsbXBfc25pZmZfY2FwYWJsZShoZGV2KSB8fCAhbG1wX3NuaWZmX2NhcGFibGUoY29ubikpCi0JCXJldHVybjsKLQotCWlmIChjb25uLT5tb2RlICE9IEhDSV9DTV9BQ1RJVkUgfHwgIShjb25uLT5saW5rX3BvbGljeSAmIEhDSV9MUF9TTklGRikpCi0JCXJldHVybjsKLQotCWlmIChsbXBfc25pZmZzdWJyX2NhcGFibGUoaGRldikgJiYgbG1wX3NuaWZmc3Vicl9jYXBhYmxlKGNvbm4pKSB7Ci0JCXN0cnVjdCBoY2lfY3Bfc25pZmZfc3VicmF0ZSBjcDsKLQkJY3AuaGFuZGxlICAgICAgICAgICAgID0gY3B1X3RvX2xlMTYoY29ubi0+aGFuZGxlKTsKLQkJY3AubWF4X2xhdGVuY3kgICAgICAgID0gY3B1X3RvX2xlMTYoMCk7Ci0JCWNwLm1pbl9yZW1vdGVfdGltZW91dCA9IGNwdV90b19sZTE2KDApOwotCQljcC5taW5fbG9jYWxfdGltZW91dCAgPSBjcHVfdG9fbGUxNigwKTsKLQkJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9TTklGRl9TVUJSQVRFLCBzaXplb2YoY3ApLCAmY3ApOwotCX0KLQotCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfQ09OTl9NT0RFX0NIQU5HRV9QRU5ELCAmY29ubi0+cGVuZCkpIHsKLQkJc3RydWN0IGhjaV9jcF9zbmlmZl9tb2RlIGNwOwotCQljcC5oYW5kbGUgICAgICAgPSBjcHVfdG9fbGUxNihjb25uLT5oYW5kbGUpOwotCQljcC5tYXhfaW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihoZGV2LT5zbmlmZl9tYXhfaW50ZXJ2YWwpOwotCQljcC5taW5faW50ZXJ2YWwgPSBjcHVfdG9fbGUxNihoZGV2LT5zbmlmZl9taW5faW50ZXJ2YWwpOwotCQljcC5hdHRlbXB0ICAgICAgPSBjcHVfdG9fbGUxNig0KTsKLQkJY3AudGltZW91dCAgICAgID0gY3B1X3RvX2xlMTYoMSk7Ci0JCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfU05JRkZfTU9ERSwgc2l6ZW9mKGNwKSwgJmNwKTsKLQl9Ci19Ci0KIC8qIERyb3AgYWxsIGNvbm5lY3Rpb24gb24gdGhlIGRldmljZSAqLwogdm9pZCBoY2lfY29ubl9oYXNoX2ZsdXNoKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewogCXN0cnVjdCBoY2lfY29ubl9oYXNoICpoID0gJmhkZXYtPmNvbm5faGFzaDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBoY2lfY29ubiAqYzsKIAogCUJUX0RCRygiaGRldiAlcyIsIGhkZXYtPm5hbWUpOwogCi0JcCA9IGgtPmxpc3QubmV4dDsKLQl3aGlsZSAocCAhPSAmaC0+bGlzdCkgewotCQlzdHJ1Y3QgaGNpX2Nvbm4gKmM7Ci0KLQkJYyA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhjaV9jb25uLCBsaXN0KTsKLQkJcCA9IHAtPm5leHQ7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjLCAmaC0+bGlzdCwgbGlzdCkgewogCQljLT5zdGF0ZSA9IEJUX0NMT1NFRDsKIAotCQloY2lfcHJvdG9fZGlzY29ubl9jZm0oYywgMHgxNik7CisJCWhjaV9wcm90b19kaXNjb25uX2NmbShjLCBIQ0lfRVJST1JfTE9DQUxfSE9TVF9URVJNKTsKIAkJaGNpX2Nvbm5fZGVsKGMpOwogCX0KIH0KQEAgLTg1NSwxMCArODQwLDEwIEBACiAKIGludCBoY2lfZ2V0X2Nvbm5fbGlzdCh2b2lkIF9fdXNlciAqYXJnKQogeworCXJlZ2lzdGVyIHN0cnVjdCBoY2lfY29ubiAqYzsKIAlzdHJ1Y3QgaGNpX2Nvbm5fbGlzdF9yZXEgcmVxLCAqY2w7CiAJc3RydWN0IGhjaV9jb25uX2luZm8gKmNpOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAJaW50IG4gPSAwLCBzaXplLCBlcnI7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJnJlcSwgYXJnLCBzaXplb2YocmVxKSkpCkBAIC04ODEsMTEgKzg2Niw4IEBACiAKIAljaSA9IGNsLT5jb25uX2luZm87CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7Ci0JbGlzdF9mb3JfZWFjaChwLCAmaGRldi0+Y29ubl9oYXNoLmxpc3QpIHsKLQkJcmVnaXN0ZXIgc3RydWN0IGhjaV9jb25uICpjOwotCQljID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOwotCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmhkZXYtPmNvbm5faGFzaC5saXN0LCBsaXN0KSB7CiAJCWJhY3B5KCYoY2kgKyBuKS0+YmRhZGRyLCAmYy0+ZHN0KTsKIAkJKGNpICsgbiktPmhhbmRsZSA9IGMtPmhhbmRsZTsKIAkJKGNpICsgbiktPnR5cGUgID0gYy0+dHlwZTsKQEAgLTg5NSw3ICs4NzcsNyBAQAogCQlpZiAoKytuID49IHJlcS5jb25uX251bSkKIAkJCWJyZWFrOwogCX0KLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAogCWNsLT5kZXZfaWQgPSBoZGV2LT5pZDsKIAljbC0+Y29ubl9udW0gPSBuOwpAQCAtOTE5LDcgKzkwMSw3IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZyZXEsIGFyZywgc2l6ZW9mKHJlcSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwloY2lfZGV2X2xvY2soaGRldik7CiAJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIHJlcS50eXBlLCAmcmVxLmJkYWRkcik7CiAJaWYgKGNvbm4pIHsKIAkJYmFjcHkoJmNpLmJkYWRkciwgJmNvbm4tPmRzdCk7CkBAIC05MjksNyArOTExLDcgQEAKIAkJY2kuc3RhdGUgPSBjb25uLT5zdGF0ZTsKIAkJY2kubGlua19tb2RlID0gY29ubi0+bGlua19tb2RlOwogCX0KLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAogCWlmICghY29ubikKIAkJcmV0dXJuIC1FTk9FTlQ7CkBAIC05NDUsMTQgKzkyNyw2MCBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmcmVxLCBhcmcsIHNpemVvZihyZXEpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBBQ0xfTElOSywgJnJlcS5iZGFkZHIpOwogCWlmIChjb25uKQogCQlyZXEudHlwZSA9IGNvbm4tPmF1dGhfdHlwZTsKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAogCWlmICghY29ubikKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlyZXR1cm4gY29weV90b191c2VyKGFyZywgJnJlcSwgc2l6ZW9mKHJlcSkpID8gLUVGQVVMVCA6IDA7CiB9CisKK3N0cnVjdCBoY2lfY2hhbiAqaGNpX2NoYW5fY3JlYXRlKHN0cnVjdCBoY2lfY29ubiAqY29ubikKK3sKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7CisJc3RydWN0IGhjaV9jaGFuICpjaGFuOworCisJQlRfREJHKCIlcyBjb25uICVwIiwgaGRldi0+bmFtZSwgY29ubik7CisKKwljaGFuID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGhjaV9jaGFuKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFjaGFuKQorCQlyZXR1cm4gTlVMTDsKKworCWNoYW4tPmNvbm4gPSBjb25uOworCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmNoYW4tPmRhdGFfcSk7CisKKwlsaXN0X2FkZF9yY3UoJmNoYW4tPmxpc3QsICZjb25uLT5jaGFuX2xpc3QpOworCisJcmV0dXJuIGNoYW47Cit9CisKK2ludCBoY2lfY2hhbl9kZWwoc3RydWN0IGhjaV9jaGFuICpjaGFuKQoreworCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IGNoYW4tPmNvbm47CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OworCisJQlRfREJHKCIlcyBjb25uICVwIGNoYW4gJXAiLCBoZGV2LT5uYW1lLCBjb25uLCBjaGFuKTsKKworCWxpc3RfZGVsX3JjdSgmY2hhbi0+bGlzdCk7CisKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKworCXNrYl9xdWV1ZV9wdXJnZSgmY2hhbi0+ZGF0YV9xKTsKKwlrZnJlZShjaGFuKTsKKworCXJldHVybiAwOworfQorCit2b2lkIGhjaV9jaGFuX2xpc3RfZmx1c2goc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCXN0cnVjdCBoY2lfY2hhbiAqY2hhbjsKKworCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2hhbiwgJmNvbm4tPmNoYW5fbGlzdCwgbGlzdCkKKwkJaGNpX2NoYW5fZGVsKGNoYW4pOworfQpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jIGIvbmV0L2JsdWV0b290aC9oY2lfY29yZS5jCmluZGV4IGJlODRhZTMuLjg0NWRhM2UgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmMKQEAgLTEsNiArMSw3IEBACiAvKgogICAgQmx1ZVogLSBCbHVldG9vdGggcHJvdG9jb2wgc3RhY2sgZm9yIExpbnV4CiAgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBRdWFsY29tbSBJbmNvcnBvcmF0ZWQKKyAgIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcwogCiAgICBXcml0dGVuIDIwMDAsMjAwMSBieSBNYXhpbSBLcmFzbnlhbnNreSA8bWF4a0BxdWFsY29tbS5jb20+CiAKQEAgLTU0LDExICs1NSwxMSBAQAogCiAjZGVmaW5lIEFVVE9fT0ZGX1RJTUVPVVQgMjAwMAogCi1zdGF0aWMgdm9pZCBoY2lfY21kX3Rhc2sodW5zaWduZWQgbG9uZyBhcmcpOwotc3RhdGljIHZvaWQgaGNpX3J4X3Rhc2sodW5zaWduZWQgbG9uZyBhcmcpOwotc3RhdGljIHZvaWQgaGNpX3R4X3Rhc2sodW5zaWduZWQgbG9uZyBhcmcpOworaW50IGVuYWJsZV9oczsKIAotc3RhdGljIERFRklORV9SV0xPQ0soaGNpX3Rhc2tfbG9jayk7CitzdGF0aWMgdm9pZCBoY2lfcnhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOworc3RhdGljIHZvaWQgaGNpX2NtZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CitzdGF0aWMgdm9pZCBoY2lfdHhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKiBIQ0kgZGV2aWNlIGxpc3QgKi8KIExJU1RfSEVBRChoY2lfZGV2X2xpc3QpOwpAQCAtNjgsMTAgKzY5LDYgQEAKIExJU1RfSEVBRChoY2lfY2JfbGlzdCk7CiBERUZJTkVfUldMT0NLKGhjaV9jYl9saXN0X2xvY2spOwogCi0vKiBIQ0kgcHJvdG9jb2xzICovCi0jZGVmaW5lIEhDSV9NQVhfUFJPVE8JMgotc3RydWN0IGhjaV9wcm90byAqaGNpX3Byb3RvW0hDSV9NQVhfUFJPVE9dOwotCiAvKiBIQ0kgbm90aWZpZXJzIGxpc3QgKi8KIHN0YXRpYyBBVE9NSUNfTk9USUZJRVJfSEVBRChoY2lfbm90aWZpZXIpOwogCkBAIC0xOTAsMzMgKzE4NywyMCBAQAogCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfUkVTRVQsIDAsIE5VTEwpOwogfQogCi1zdGF0aWMgdm9pZCBoY2lfaW5pdF9yZXEoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHVuc2lnbmVkIGxvbmcgb3B0KQorc3RhdGljIHZvaWQgYnJlZHJfaW5pdChzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlzdHJ1Y3QgaGNpX2NwX2RlbGV0ZV9zdG9yZWRfbGlua19rZXkgY3A7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlfX2xlMTYgcGFyYW07CiAJX191OCBmbHRfdHlwZTsKIAotCUJUX0RCRygiJXMgJWxkIiwgaGRldi0+bmFtZSwgb3B0KTsKLQotCS8qIERyaXZlciBpbml0aWFsaXphdGlvbiAqLwotCi0JLyogU3BlY2lhbCBjb21tYW5kcyAqLwotCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmhkZXYtPmRyaXZlcl9pbml0KSkpIHsKLQkJYnRfY2Ioc2tiKS0+cGt0X3R5cGUgPSBIQ0lfQ09NTUFORF9QS1Q7Ci0JCXNrYi0+ZGV2ID0gKHZvaWQgKikgaGRldjsKLQotCQlza2JfcXVldWVfdGFpbCgmaGRldi0+Y21kX3EsIHNrYik7Ci0JCXRhc2tsZXRfc2NoZWR1bGUoJmhkZXYtPmNtZF90YXNrKTsKLQl9Ci0Jc2tiX3F1ZXVlX3B1cmdlKCZoZGV2LT5kcml2ZXJfaW5pdCk7CisJaGRldi0+Zmxvd19jdGxfbW9kZSA9IEhDSV9GTE9XX0NUTF9NT0RFX1BBQ0tFVF9CQVNFRDsKIAogCS8qIE1hbmRhdG9yeSBpbml0aWFsaXphdGlvbiAqLwogCiAJLyogUmVzZXQgKi8KIAlpZiAoIXRlc3RfYml0KEhDSV9RVUlSS19OT19SRVNFVCwgJmhkZXYtPnF1aXJrcykpIHsKLQkJCXNldF9iaXQoSENJX1JFU0VULCAmaGRldi0+ZmxhZ3MpOwotCQkJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9SRVNFVCwgMCwgTlVMTCk7CisJCXNldF9iaXQoSENJX1JFU0VULCAmaGRldi0+ZmxhZ3MpOworCQloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1JFU0VULCAwLCBOVUxMKTsKIAl9CiAKIAkvKiBSZWFkIExvY2FsIFN1cHBvcnRlZCBGZWF0dXJlcyAqLwpAQCAtMjI4LDE4ICsyMTIsNiBAQAogCS8qIFJlYWQgQnVmZmVyIFNpemUgKEFDTCBtdHUsIG1heCBwa3QsIGV0Yy4pICovCiAJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9SRUFEX0JVRkZFUl9TSVpFLCAwLCBOVUxMKTsKIAotI2lmIDAKLQkvKiBIb3N0IGJ1ZmZlciBzaXplICovCi0JewotCQlzdHJ1Y3QgaGNpX2NwX2hvc3RfYnVmZmVyX3NpemUgY3A7Ci0JCWNwLmFjbF9tdHUgPSBjcHVfdG9fbGUxNihIQ0lfTUFYX0FDTF9TSVpFKTsKLQkJY3Auc2NvX210dSA9IEhDSV9NQVhfU0NPX1NJWkU7Ci0JCWNwLmFjbF9tYXhfcGt0ID0gY3B1X3RvX2xlMTYoMHhmZmZmKTsKLQkJY3Auc2NvX21heF9wa3QgPSBjcHVfdG9fbGUxNigweGZmZmYpOwotCQloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX0hPU1RfQlVGRkVSX1NJWkUsIHNpemVvZihjcCksICZjcCk7Ci0JfQotI2VuZGlmCi0KIAkvKiBSZWFkIEJEIEFkZHJlc3MgKi8KIAloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1JFQURfQkRfQUREUiwgMCwgTlVMTCk7CiAKQEAgLTI2Nyw2ICsyMzksNTEgQEAKIAloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX0RFTEVURV9TVE9SRURfTElOS19LRVksIHNpemVvZihjcCksICZjcCk7CiB9CiAKK3N0YXRpYyB2b2lkIGFtcF9pbml0KHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCWhkZXYtPmZsb3dfY3RsX21vZGUgPSBIQ0lfRkxPV19DVExfTU9ERV9CTE9DS19CQVNFRDsKKworCS8qIFJlc2V0ICovCisJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9SRVNFVCwgMCwgTlVMTCk7CisKKwkvKiBSZWFkIExvY2FsIFZlcnNpb24gKi8KKwloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1JFQURfTE9DQUxfVkVSU0lPTiwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9pbml0X3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgbG9uZyBvcHQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCUJUX0RCRygiJXMgJWxkIiwgaGRldi0+bmFtZSwgb3B0KTsKKworCS8qIERyaXZlciBpbml0aWFsaXphdGlvbiAqLworCisJLyogU3BlY2lhbCBjb21tYW5kcyAqLworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmhkZXYtPmRyaXZlcl9pbml0KSkpIHsKKwkJYnRfY2Ioc2tiKS0+cGt0X3R5cGUgPSBIQ0lfQ09NTUFORF9QS1Q7CisJCXNrYi0+ZGV2ID0gKHZvaWQgKikgaGRldjsKKworCQlza2JfcXVldWVfdGFpbCgmaGRldi0+Y21kX3EsIHNrYik7CisJCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+Y21kX3dvcmspOworCX0KKwlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPmRyaXZlcl9pbml0KTsKKworCXN3aXRjaCAoaGRldi0+ZGV2X3R5cGUpIHsKKwljYXNlIEhDSV9CUkVEUjoKKwkJYnJlZHJfaW5pdChoZGV2KTsKKwkJYnJlYWs7CisKKwljYXNlIEhDSV9BTVA6CisJCWFtcF9pbml0KGhkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJUX0VSUigiVW5rbm93biBkZXZpY2UgdHlwZSAlZCIsIGhkZXYtPmRldl90eXBlKTsKKwkJYnJlYWs7CisJfQorCit9CisKIHN0YXRpYyB2b2lkIGhjaV9sZV9pbml0X3JlcShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdW5zaWduZWQgbG9uZyBvcHQpCiB7CiAJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwpAQCAtMzE5LDggKzMzNiw3IEBACiAgKiBEZXZpY2UgaXMgaGVsZCBvbiByZXR1cm4uICovCiBzdHJ1Y3QgaGNpX2RldiAqaGNpX2Rldl9nZXQoaW50IGluZGV4KQogewotCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gTlVMTDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gTlVMTCwgKmQ7CiAKIAlCVF9EQkcoIiVkIiwgaW5kZXgpOwogCkBAIC0zMjgsOCArMzQ0LDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZWFkX2xvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfZGV2X2xpc3QpIHsKLQkJc3RydWN0IGhjaV9kZXYgKmQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfZGV2LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGQsICZoY2lfZGV2X2xpc3QsIGxpc3QpIHsKIAkJaWYgKGQtPmlkID09IGluZGV4KSB7CiAJCQloZGV2ID0gaGNpX2Rldl9ob2xkKGQpOwogCQkJYnJlYWs7CkBAIC00NDUsMTQgKzQ2MCwxNCBAQAogCWlmICghaGRldikKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCWlmIChpbnF1aXJ5X2NhY2hlX2FnZShoZGV2KSA+IElOUVVJUllfQ0FDSEVfQUdFX01BWCB8fAogCQkJCWlucXVpcnlfY2FjaGVfZW1wdHkoaGRldikgfHwKIAkJCQlpci5mbGFncyAmIElSRVFfQ0FDSEVfRkxVU0gpIHsKIAkJaW5xdWlyeV9jYWNoZV9mbHVzaChoZGV2KTsKIAkJZG9faW5xdWlyeSA9IDE7CiAJfQotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCiAJdGltZW8gPSBpci5sZW5ndGggKiBtc2Vjc190b19qaWZmaWVzKDIwMDApOwogCkBAIC00NzQsOSArNDg5LDkgQEAKIAkJZ290byBkb25lOwogCX0KIAotCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwloY2lfZGV2X2xvY2soaGRldik7CiAJaXIubnVtX3JzcCA9IGlucXVpcnlfY2FjaGVfZHVtcChoZGV2LCBtYXhfcnNwLCBidWYpOwotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCiAJQlRfREJHKCJudW1fcnNwICVkIiwgaXIubnVtX3JzcCk7CiAKQEAgLTUyMyw4ICs1MzgsOSBAQAogCWlmICh0ZXN0X2JpdChIQ0lfUVVJUktfUkFXX0RFVklDRSwgJmhkZXYtPnF1aXJrcykpCiAJCXNldF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKTsKIAotCS8qIFRyZWF0IGFsbCBub24gQlIvRURSIGNvbnRyb2xsZXJzIGFzIHJhdyBkZXZpY2VzIGZvciBub3cgKi8KLQlpZiAoaGRldi0+ZGV2X3R5cGUgIT0gSENJX0JSRURSKQorCS8qIFRyZWF0IGFsbCBub24gQlIvRURSIGNvbnRyb2xsZXJzIGFzIHJhdyBkZXZpY2VzIGlmCisJICAgZW5hYmxlX2hzIGlzIG5vdCBzZXQgKi8KKwlpZiAoaGRldi0+ZGV2X3R5cGUgIT0gSENJX0JSRURSICYmICFlbmFibGVfaHMpCiAJCXNldF9iaXQoSENJX1JBVywgJmhkZXYtPmZsYWdzKTsKIAogCWlmIChoZGV2LT5vcGVuKGhkZXYpKSB7CkBAIC01NTEsMTMgKzU2NywxNiBAQAogCQloY2lfZGV2X2hvbGQoaGRldik7CiAJCXNldF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpOwogCQloY2lfbm90aWZ5KGhkZXYsIEhDSV9ERVZfVVApOwotCQlpZiAoIXRlc3RfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmZsYWdzKSkKLQkJCW1nbXRfcG93ZXJlZChoZGV2LT5pZCwgMSk7CisJCWlmICghdGVzdF9iaXQoSENJX1NFVFVQLCAmaGRldi0+ZmxhZ3MpKSB7CisJCQloY2lfZGV2X2xvY2soaGRldik7CisJCQltZ210X3Bvd2VyZWQoaGRldiwgMSk7CisJCQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwkJfQogCX0gZWxzZSB7CiAJCS8qIEluaXQgZmFpbGVkLCBjbGVhbnVwICovCi0JCXRhc2tsZXRfa2lsbCgmaGRldi0+cnhfdGFzayk7Ci0JCXRhc2tsZXRfa2lsbCgmaGRldi0+dHhfdGFzayk7Ci0JCXRhc2tsZXRfa2lsbCgmaGRldi0+Y21kX3Rhc2spOworCQlmbHVzaF93b3JrKCZoZGV2LT50eF93b3JrKTsKKwkJZmx1c2hfd29yaygmaGRldi0+Y21kX3dvcmspOworCQlmbHVzaF93b3JrKCZoZGV2LT5yeF93b3JrKTsKIAogCQlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPmNtZF9xKTsKIAkJc2tiX3F1ZXVlX3B1cmdlKCZoZGV2LT5yeF9xKTsKQEAgLTU5MywxNCArNjEyLDI1IEBACiAJCXJldHVybiAwOwogCX0KIAotCS8qIEtpbGwgUlggYW5kIFRYIHRhc2tzICovCi0JdGFza2xldF9raWxsKCZoZGV2LT5yeF90YXNrKTsKLQl0YXNrbGV0X2tpbGwoJmhkZXYtPnR4X3Rhc2spOworCS8qIEZsdXNoIFJYIGFuZCBUWCB3b3JrcyAqLworCWZsdXNoX3dvcmsoJmhkZXYtPnR4X3dvcmspOworCWZsdXNoX3dvcmsoJmhkZXYtPnJ4X3dvcmspOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWlmIChoZGV2LT5kaXNjb3ZfdGltZW91dCA+IDApIHsKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRldi0+ZGlzY292X29mZik7CisJCWhkZXYtPmRpc2Nvdl90aW1lb3V0ID0gMDsKKwl9CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmZsYWdzKSkKKwkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRldi0+cG93ZXJfb2ZmKTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX1NFUlZJQ0VfQ0FDSEUsICZoZGV2LT5mbGFncykpCisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmhkZXYtPnNlcnZpY2VfY2FjaGUpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCWlucXVpcnlfY2FjaGVfZmx1c2goaGRldik7CiAJaGNpX2Nvbm5faGFzaF9mbHVzaChoZGV2KTsKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAogCWhjaV9ub3RpZnkoaGRldiwgSENJX0RFVl9ET1dOKTsKIApAQCAtNjEzLDEyICs2NDMsMTIgQEAKIAlpZiAoIXRlc3RfYml0KEhDSV9SQVcsICZoZGV2LT5mbGFncykpIHsKIAkJc2V0X2JpdChIQ0lfSU5JVCwgJmhkZXYtPmZsYWdzKTsKIAkJX19oY2lfcmVxdWVzdChoZGV2LCBoY2lfcmVzZXRfcmVxLCAwLAotCQkJCQltc2Vjc190b19qaWZmaWVzKEhDSV9JTklUX1RJTUVPVVQpKTsKKwkJCQkJbXNlY3NfdG9famlmZmllcygyNTApKTsKIAkJY2xlYXJfYml0KEhDSV9JTklULCAmaGRldi0+ZmxhZ3MpOwogCX0KIAotCS8qIEtpbGwgY21kIHRhc2sgKi8KLQl0YXNrbGV0X2tpbGwoJmhkZXYtPmNtZF90YXNrKTsKKwkvKiBmbHVzaCBjbWQgIHdvcmsgKi8KKwlmbHVzaF93b3JrKCZoZGV2LT5jbWRfd29yayk7CiAKIAkvKiBEcm9wIHF1ZXVlcyAqLwogCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+cnhfcSk7CkBAIC02MzYsNyArNjY2LDkgQEAKIAkgKiBhbmQgbm8gdGFza3MgYXJlIHNjaGVkdWxlZC4gKi8KIAloZGV2LT5jbG9zZShoZGV2KTsKIAotCW1nbXRfcG93ZXJlZChoZGV2LT5pZCwgMCk7CisJaGNpX2Rldl9sb2NrKGhkZXYpOworCW1nbXRfcG93ZXJlZChoZGV2LCAwKTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAogCS8qIENsZWFyIGZsYWdzICovCiAJaGRldi0+ZmxhZ3MgPSAwOwpAQCAtNjcwLDcgKzcwMiw2IEBACiAJCXJldHVybiAtRU5PREVWOwogCiAJaGNpX3JlcV9sb2NrKGhkZXYpOwotCXRhc2tsZXRfZGlzYWJsZSgmaGRldi0+dHhfdGFzayk7CiAKIAlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkKIAkJZ290byBkb25lOwpAQCAtNjc5LDEwICs3MTAsMTAgQEAKIAlza2JfcXVldWVfcHVyZ2UoJmhkZXYtPnJ4X3EpOwogCXNrYl9xdWV1ZV9wdXJnZSgmaGRldi0+Y21kX3EpOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKIAlpbnF1aXJ5X2NhY2hlX2ZsdXNoKGhkZXYpOwogCWhjaV9jb25uX2hhc2hfZmx1c2goaGRldik7Ci0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAKIAlpZiAoaGRldi0+Zmx1c2gpCiAJCWhkZXYtPmZsdXNoKGhkZXYpOwpAQCAtNjk1LDcgKzcyNiw2IEBACiAJCQkJCW1zZWNzX3RvX2ppZmZpZXMoSENJX0lOSVRfVElNRU9VVCkpOwogCiBkb25lOgotCXRhc2tsZXRfZW5hYmxlKCZoZGV2LT50eF90YXNrKTsKIAloY2lfcmVxX3VubG9jayhoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAlyZXR1cm4gcmV0OwpAQCAtNzk0LDkgKzgyNCw5IEBACiAKIGludCBoY2lfZ2V0X2Rldl9saXN0KHZvaWQgX191c2VyICphcmcpCiB7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CiAJc3RydWN0IGhjaV9kZXZfbGlzdF9yZXEgKmRsOwogCXN0cnVjdCBoY2lfZGV2X3JlcSAqZHI7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAlpbnQgbiA9IDAsIHNpemUsIGVycjsKIAlfX3UxNiBkZXZfbnVtOwogCkBAIC04MTQsMTMgKzg0NCwxMCBAQAogCiAJZHIgPSBkbC0+ZGV2X3JlcTsKIAotCXJlYWRfbG9ja19iaCgmaGNpX2Rldl9saXN0X2xvY2spOwotCWxpc3RfZm9yX2VhY2gocCwgJmhjaV9kZXZfbGlzdCkgewotCQlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKLQotCQloZGV2ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2RldiwgbGlzdCk7Ci0KLQkJaGNpX2RlbF9vZmZfdGltZXIoaGRldik7CisJcmVhZF9sb2NrKCZoY2lfZGV2X2xpc3RfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShoZGV2LCAmaGNpX2Rldl9saXN0LCBsaXN0KSB7CisJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0FVVE9fT0ZGLCAmaGRldi0+ZmxhZ3MpKQorCQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmaGRldi0+cG93ZXJfb2ZmKTsKIAogCQlpZiAoIXRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZmxhZ3MpKQogCQkJc2V0X2JpdChIQ0lfUEFJUkFCTEUsICZoZGV2LT5mbGFncyk7CkBAIC04MzEsNyArODU4LDcgQEAKIAkJaWYgKCsrbiA+PSBkZXZfbnVtKQogCQkJYnJlYWs7CiAJfQotCXJlYWRfdW5sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisJcmVhZF91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKIAogCWRsLT5kZXZfbnVtID0gbjsKIAlzaXplID0gc2l6ZW9mKCpkbCkgKyBuICogc2l6ZW9mKCpkcik7CkBAIC04NTUsNyArODgyLDggQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaGNpX2RlbF9vZmZfdGltZXIoaGRldik7CisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfQVVUT19PRkYsICZoZGV2LT5mbGFncykpCisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaGRldi0+cG93ZXJfb2ZmKTsKIAogCWlmICghdGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCiAJCXNldF9iaXQoSENJX1BBSVJBQkxFLCAmaGRldi0+ZmxhZ3MpOwpAQCAtOTEyLDYgKzk0MCw3IEBACiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gTlVMTDsKIAorCWhjaV9pbml0X3N5c2ZzKGhkZXYpOwogCXNrYl9xdWV1ZV9oZWFkX2luaXQoJmhkZXYtPmRyaXZlcl9pbml0KTsKIAogCXJldHVybiBoZGV2OwpAQCAtOTM4LDM5ICs5NjcsNDEgQEAKIAkJcmV0dXJuOwogCiAJaWYgKHRlc3RfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmZsYWdzKSkKLQkJbW9kX3RpbWVyKCZoZGV2LT5vZmZfdGltZXIsCi0JCQkJamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoQVVUT19PRkZfVElNRU9VVCkpOworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmhkZXYtPnBvd2VyX29mZiwKKwkJCQkJbXNlY3NfdG9famlmZmllcyhBVVRPX09GRl9USU1FT1VUKSk7CiAKIAlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmZsYWdzKSkKLQkJbWdtdF9pbmRleF9hZGRlZChoZGV2LT5pZCk7CisJCW1nbXRfaW5kZXhfYWRkZWQoaGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGhjaV9wb3dlcl9vZmYoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBoY2lfZGV2LCBwb3dlcl9vZmYpOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBoY2lfZGV2LAorCQkJCQkJCXBvd2VyX29mZi53b3JrKTsKIAogCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKIAorCWNsZWFyX2JpdChIQ0lfQVVUT19PRkYsICZoZGV2LT5mbGFncyk7CisKIAloY2lfZGV2X2Nsb3NlKGhkZXYtPmlkKTsKIH0KIAotc3RhdGljIHZvaWQgaGNpX2F1dG9fb2ZmKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3N0YXRpYyB2b2lkIGhjaV9kaXNjb3Zfb2ZmKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IChzdHJ1Y3QgaGNpX2RldiAqKSBkYXRhOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCXU4IHNjYW4gPSBTQ0FOX1BBR0U7CisKKwloZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBoY2lfZGV2LCBkaXNjb3Zfb2ZmLndvcmspOwogCiAJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwogCi0JY2xlYXJfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmZsYWdzKTsKKwloY2lfZGV2X2xvY2soaGRldik7CiAKLQlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPnBvd2VyX29mZik7Ci19CisJaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9XUklURV9TQ0FOX0VOQUJMRSwgc2l6ZW9mKHNjYW4pLCAmc2Nhbik7CiAKLXZvaWQgaGNpX2RlbF9vZmZfdGltZXIoc3RydWN0IGhjaV9kZXYgKmhkZXYpCi17Ci0JQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOworCWhkZXYtPmRpc2Nvdl90aW1lb3V0ID0gMDsKIAotCWNsZWFyX2JpdChIQ0lfQVVUT19PRkYsICZoZGV2LT5mbGFncyk7Ci0JZGVsX3RpbWVyKCZoZGV2LT5vZmZfdGltZXIpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCiBpbnQgaGNpX3V1aWRzX2NsZWFyKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQpAQCAtMTAwNywxNiArMTAzOCwxMSBAQAogCiBzdHJ1Y3QgbGlua19rZXkgKmhjaV9maW5kX2xpbmtfa2V5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGxpbmtfa2V5ICprOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmaGRldi0+bGlua19rZXlzKSB7Ci0JCXN0cnVjdCBsaW5rX2tleSAqazsKLQotCQlrID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgbGlua19rZXksIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShrLCAmaGRldi0+bGlua19rZXlzLCBsaXN0KQogCQlpZiAoYmFjbXAoYmRhZGRyLCAmay0+YmRhZGRyKSA9PSAwKQogCQkJcmV0dXJuIGs7Ci0JfQogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xMTM4LDcgKzExNjQsNyBAQAogCiAJcGVyc2lzdGVudCA9IGhjaV9wZXJzaXN0ZW50X2tleShoZGV2LCBjb25uLCB0eXBlLCBvbGRfa2V5X3R5cGUpOwogCi0JbWdtdF9uZXdfa2V5KGhkZXYtPmlkLCBrZXksIHBlcnNpc3RlbnQpOworCW1nbXRfbmV3X2xpbmtfa2V5KGhkZXYsIGtleSwgcGVyc2lzdGVudCk7CiAKIAlpZiAoIXBlcnNpc3RlbnQpIHsKIAkJbGlzdF9kZWwoJmtleS0+bGlzdCk7CkBAIC0xMTgxLDcgKzEyMDcsNyBAQAogCW1lbWNweShpZC0+cmFuZCwgcmFuZCwgc2l6ZW9mKGlkLT5yYW5kKSk7CiAKIAlpZiAobmV3X2tleSkKLQkJbWdtdF9uZXdfa2V5KGhkZXYtPmlkLCBrZXksIG9sZF9rZXlfdHlwZSk7CisJCW1nbXRfbmV3X2xpbmtfa2V5KGhkZXYsIGtleSwgb2xkX2tleV90eXBlKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTIwOSw3ICsxMjM1LDcgQEAKIAogCUJUX0VSUigiJXMgY29tbWFuZCB0eCB0aW1lb3V0IiwgaGRldi0+bmFtZSk7CiAJYXRvbWljX3NldCgmaGRldi0+Y21kX2NudCwgMSk7Ci0JdGFza2xldF9zY2hlZHVsZSgmaGRldi0+Y21kX3Rhc2spOworCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+Y21kX3dvcmspOwogfQogCiBzdHJ1Y3Qgb29iX2RhdGEgKmhjaV9maW5kX3JlbW90ZV9vb2JfZGF0YShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKQEAgLTEyNzksMTYgKzEzMDUsMTEgQEAKIHN0cnVjdCBiZGFkZHJfbGlzdCAqaGNpX2JsYWNrbGlzdF9sb29rdXAoc3RydWN0IGhjaV9kZXYgKmhkZXYsCiAJCQkJCQliZGFkZHJfdCAqYmRhZGRyKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGJkYWRkcl9saXN0ICpiOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmaGRldi0+YmxhY2tsaXN0KSB7Ci0JCXN0cnVjdCBiZGFkZHJfbGlzdCAqYjsKLQotCQliID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYmRhZGRyX2xpc3QsIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeShiLCAmaGRldi0+YmxhY2tsaXN0LCBsaXN0KQogCQlpZiAoYmFjbXAoYmRhZGRyLCAmYi0+YmRhZGRyKSA9PSAwKQogCQkJcmV0dXJuIGI7Ci0JfQogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xMzI3LDMxICsxMzQ4LDMwIEBACiAKIAlsaXN0X2FkZCgmZW50cnktPmxpc3QsICZoZGV2LT5ibGFja2xpc3QpOwogCi0JcmV0dXJuIG1nbXRfZGV2aWNlX2Jsb2NrZWQoaGRldi0+aWQsIGJkYWRkcik7CisJcmV0dXJuIG1nbXRfZGV2aWNlX2Jsb2NrZWQoaGRldiwgYmRhZGRyKTsKIH0KIAogaW50IGhjaV9ibGFja2xpc3RfZGVsKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKQogewogCXN0cnVjdCBiZGFkZHJfbGlzdCAqZW50cnk7CiAKLQlpZiAoYmFjbXAoYmRhZGRyLCBCREFERFJfQU5ZKSA9PSAwKSB7CisJaWYgKGJhY21wKGJkYWRkciwgQkRBRERSX0FOWSkgPT0gMCkKIAkJcmV0dXJuIGhjaV9ibGFja2xpc3RfY2xlYXIoaGRldik7Ci0JfQogCiAJZW50cnkgPSBoY2lfYmxhY2tsaXN0X2xvb2t1cChoZGV2LCBiZGFkZHIpOwotCWlmICghZW50cnkpIHsKKwlpZiAoIWVudHJ5KQogCQlyZXR1cm4gLUVOT0VOVDsKLQl9CiAKIAlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwogCWtmcmVlKGVudHJ5KTsKIAotCXJldHVybiBtZ210X2RldmljZV91bmJsb2NrZWQoaGRldi0+aWQsIGJkYWRkcik7CisJcmV0dXJuIG1nbXRfZGV2aWNlX3VuYmxvY2tlZChoZGV2LCBiZGFkZHIpOwogfQogCi1zdGF0aWMgdm9pZCBoY2lfY2xlYXJfYWR2X2NhY2hlKHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIHZvaWQgaGNpX2NsZWFyX2Fkdl9jYWNoZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGhjaV9kZXYgKmhkZXYgPSAodm9pZCAqKSBhcmc7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhjaV9kZXYsCisJCQkJCQkJYWR2X3dvcmsud29yayk7CiAKIAloY2lfZGV2X2xvY2soaGRldik7CiAKQEAgLTE0MjUsNyArMTQ0NSw3IEBACiBpbnQgaGNpX3JlZ2lzdGVyX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJmhjaV9kZXZfbGlzdCwgKnA7Ci0JaW50IGksIGlkID0gMDsKKwlpbnQgaSwgaWQsIGVycm9yOwogCiAJQlRfREJHKCIlcCBuYW1lICVzIGJ1cyAlZCBvd25lciAlcCIsIGhkZXYsIGhkZXYtPm5hbWUsCiAJCQkJCQloZGV2LT5idXMsIGhkZXYtPm93bmVyKTsKQEAgLTE0MzMsNyArMTQ1MywxMiBAQAogCWlmICghaGRldi0+b3BlbiB8fCAhaGRldi0+Y2xvc2UgfHwgIWhkZXYtPmRlc3RydWN0KQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCXdyaXRlX2xvY2tfYmgoJmhjaV9kZXZfbGlzdF9sb2NrKTsKKwkvKiBEbyBub3QgYWxsb3cgSENJX0FNUCBkZXZpY2VzIHRvIHJlZ2lzdGVyIGF0IGluZGV4IDAsCisJICogc28gdGhlIGluZGV4IGNhbiBiZSB1c2VkIGFzIHRoZSBBTVAgY29udHJvbGxlciBJRC4KKwkgKi8KKwlpZCA9IChoZGV2LT5kZXZfdHlwZSA9PSBIQ0lfQlJFRFIpID8gMCA6IDE7CisKKwl3cml0ZV9sb2NrKCZoY2lfZGV2X2xpc3RfbG9jayk7CiAKIAkvKiBGaW5kIGZpcnN0IGF2YWlsYWJsZSBkZXZpY2UgaWQgKi8KIAlsaXN0X2Zvcl9lYWNoKHAsICZoY2lfZGV2X2xpc3QpIHsKQEAgLTE0NDQsMTIgKzE0NjksMTMgQEAKIAogCXNwcmludGYoaGRldi0+bmFtZSwgImhjaSVkIiwgaWQpOwogCWhkZXYtPmlkID0gaWQ7Ci0JbGlzdF9hZGQoJmhkZXYtPmxpc3QsIGhlYWQpOworCWxpc3RfYWRkX3RhaWwoJmhkZXYtPmxpc3QsIGhlYWQpOwogCiAJYXRvbWljX3NldCgmaGRldi0+cmVmY250LCAxKTsKLQlzcGluX2xvY2tfaW5pdCgmaGRldi0+bG9jayk7CisJbXV0ZXhfaW5pdCgmaGRldi0+bG9jayk7CiAKIAloZGV2LT5mbGFncyA9IDA7CisJaGRldi0+ZGV2X2ZsYWdzID0gMDsKIAloZGV2LT5wa3RfdHlwZSAgPSAoSENJX0RNMSB8IEhDSV9ESDEgfCBIQ0lfSFYxKTsKIAloZGV2LT5lc2NvX3R5cGUgPSAoRVNDT19IVjEpOwogCWhkZXYtPmxpbmtfbW9kZSA9IChIQ0lfTE1fQUNDRVBUKTsKQEAgLTE0NTksOSArMTQ4NSwxMCBAQAogCWhkZXYtPnNuaWZmX21heF9pbnRlcnZhbCA9IDgwMDsKIAloZGV2LT5zbmlmZl9taW5faW50ZXJ2YWwgPSA4MDsKIAotCXRhc2tsZXRfaW5pdCgmaGRldi0+Y21kX3Rhc2ssIGhjaV9jbWRfdGFzaywgKHVuc2lnbmVkIGxvbmcpIGhkZXYpOwotCXRhc2tsZXRfaW5pdCgmaGRldi0+cnhfdGFzaywgaGNpX3J4X3Rhc2ssICh1bnNpZ25lZCBsb25nKSBoZGV2KTsKLQl0YXNrbGV0X2luaXQoJmhkZXYtPnR4X3Rhc2ssIGhjaV90eF90YXNrLCAodW5zaWduZWQgbG9uZykgaGRldik7CisJSU5JVF9XT1JLKCZoZGV2LT5yeF93b3JrLCBoY2lfcnhfd29yayk7CisJSU5JVF9XT1JLKCZoZGV2LT5jbWRfd29yaywgaGNpX2NtZF93b3JrKTsKKwlJTklUX1dPUksoJmhkZXYtPnR4X3dvcmssIGhjaV90eF93b3JrKTsKKwogCiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaGRldi0+cnhfcSk7CiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmaGRldi0+Y21kX3EpOwpAQCAtMTQ3OSw2ICsxNTA2LDggQEAKIAogCWhjaV9jb25uX2hhc2hfaW5pdChoZGV2KTsKIAorCUlOSVRfTElTVF9IRUFEKCZoZGV2LT5tZ210X3BlbmRpbmcpOworCiAJSU5JVF9MSVNUX0hFQUQoJmhkZXYtPmJsYWNrbGlzdCk7CiAKIAlJTklUX0xJU1RfSEVBRCgmaGRldi0+dXVpZHMpOwpAQCAtMTQ4OCwyNCArMTUxNywyOSBAQAogCUlOSVRfTElTVF9IRUFEKCZoZGV2LT5yZW1vdGVfb29iX2RhdGEpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmhkZXYtPmFkdl9lbnRyaWVzKTsKLQlzZXR1cF90aW1lcigmaGRldi0+YWR2X3RpbWVyLCBoY2lfY2xlYXJfYWR2X2NhY2hlLAotCQkJCQkJKHVuc2lnbmVkIGxvbmcpIGhkZXYpOwogCisJSU5JVF9ERUxBWUVEX1dPUksoJmhkZXYtPmFkdl93b3JrLCBoY2lfY2xlYXJfYWR2X2NhY2hlKTsKIAlJTklUX1dPUksoJmhkZXYtPnBvd2VyX29uLCBoY2lfcG93ZXJfb24pOwotCUlOSVRfV09SSygmaGRldi0+cG93ZXJfb2ZmLCBoY2lfcG93ZXJfb2ZmKTsKLQlzZXR1cF90aW1lcigmaGRldi0+b2ZmX3RpbWVyLCBoY2lfYXV0b19vZmYsICh1bnNpZ25lZCBsb25nKSBoZGV2KTsKKwlJTklUX0RFTEFZRURfV09SSygmaGRldi0+cG93ZXJfb2ZmLCBoY2lfcG93ZXJfb2ZmKTsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZoZGV2LT5kaXNjb3Zfb2ZmLCBoY2lfZGlzY292X29mZik7CiAKIAltZW1zZXQoJmhkZXYtPnN0YXQsIDAsIHNpemVvZihzdHJ1Y3QgaGNpX2Rldl9zdGF0cykpOwogCiAJYXRvbWljX3NldCgmaGRldi0+cHJvbWlzYywgMCk7CiAKLQl3cml0ZV91bmxvY2tfYmgoJmhjaV9kZXZfbGlzdF9sb2NrKTsKKwl3cml0ZV91bmxvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKIAotCWhkZXYtPndvcmtxdWV1ZSA9IGNyZWF0ZV9zaW5nbGV0aHJlYWRfd29ya3F1ZXVlKGhkZXYtPm5hbWUpOwotCWlmICghaGRldi0+d29ya3F1ZXVlKQotCQlnb3RvIG5vbWVtOworCWhkZXYtPndvcmtxdWV1ZSA9IGFsbG9jX3dvcmtxdWV1ZShoZGV2LT5uYW1lLCBXUV9ISUdIUFJJIHwgV1FfVU5CT1VORCB8CisJCQkJCQkJV1FfTUVNX1JFQ0xBSU0sIDEpOworCWlmICghaGRldi0+d29ya3F1ZXVlKSB7CisJCWVycm9yID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQogCi0JaGNpX3JlZ2lzdGVyX3N5c2ZzKGhkZXYpOworCWVycm9yID0gaGNpX2FkZF9zeXNmcyhoZGV2KTsKKwlpZiAoZXJyb3IgPCAwKQorCQlnb3RvIGVycl93cXVldWU7CiAKIAloZGV2LT5yZmtpbGwgPSByZmtpbGxfYWxsb2MoaGRldi0+bmFtZSwgJmhkZXYtPmRldiwKIAkJCQlSRktJTExfVFlQRV9CTFVFVE9PVEgsICZoY2lfcmZraWxsX29wcywgaGRldik7CkBAIC0xNTE4LDMxICsxNTUyLDMzIEBACiAKIAlzZXRfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmZsYWdzKTsKIAlzZXRfYml0KEhDSV9TRVRVUCwgJmhkZXYtPmZsYWdzKTsKLQlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPnBvd2VyX29uKTsKKwlzY2hlZHVsZV93b3JrKCZoZGV2LT5wb3dlcl9vbik7CiAKIAloY2lfbm90aWZ5KGhkZXYsIEhDSV9ERVZfUkVHKTsKIAogCXJldHVybiBpZDsKIAotbm9tZW06Ci0Jd3JpdGVfbG9ja19iaCgmaGNpX2Rldl9saXN0X2xvY2spOworZXJyX3dxdWV1ZToKKwlkZXN0cm95X3dvcmtxdWV1ZShoZGV2LT53b3JrcXVldWUpOworZXJyOgorCXdyaXRlX2xvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKIAlsaXN0X2RlbCgmaGRldi0+bGlzdCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisJd3JpdGVfdW5sb2NrKCZoY2lfZGV2X2xpc3RfbG9jayk7CiAKLQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gZXJyb3I7CiB9CiBFWFBPUlRfU1lNQk9MKGhjaV9yZWdpc3Rlcl9kZXYpOwogCiAvKiBVbnJlZ2lzdGVyIEhDSSBkZXZpY2UgKi8KLWludCBoY2lfdW5yZWdpc3Rlcl9kZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit2b2lkIGhjaV91bnJlZ2lzdGVyX2RldihzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKIAlpbnQgaTsKIAogCUJUX0RCRygiJXAgbmFtZSAlcyBidXMgJWQiLCBoZGV2LCBoZGV2LT5uYW1lLCBoZGV2LT5idXMpOwogCi0Jd3JpdGVfbG9ja19iaCgmaGNpX2Rldl9saXN0X2xvY2spOworCXdyaXRlX2xvY2soJmhjaV9kZXZfbGlzdF9sb2NrKTsKIAlsaXN0X2RlbCgmaGRldi0+bGlzdCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZoY2lfZGV2X2xpc3RfbG9jayk7CisJd3JpdGVfdW5sb2NrKCZoY2lfZGV2X2xpc3RfbG9jayk7CiAKIAloY2lfZGV2X2RvX2Nsb3NlKGhkZXYpOwogCkBAIC0xNTUwLDggKzE1ODYsMTUgQEAKIAkJa2ZyZWVfc2tiKGhkZXYtPnJlYXNzZW1ibHlbaV0pOwogCiAJaWYgKCF0ZXN0X2JpdChIQ0lfSU5JVCwgJmhkZXYtPmZsYWdzKSAmJgotCQkJCQkhdGVzdF9iaXQoSENJX1NFVFVQLCAmaGRldi0+ZmxhZ3MpKQotCQltZ210X2luZGV4X3JlbW92ZWQoaGRldi0+aWQpOworCQkJCQkhdGVzdF9iaXQoSENJX1NFVFVQLCAmaGRldi0+ZmxhZ3MpKSB7CisJCWhjaV9kZXZfbG9jayhoZGV2KTsKKwkJbWdtdF9pbmRleF9yZW1vdmVkKGhkZXYpOworCQloY2lfZGV2X3VubG9jayhoZGV2KTsKKwl9CisKKwkvKiBtZ210X2luZGV4X3JlbW92ZWQgc2hvdWxkIHRha2UgY2FyZSBvZiBlbXB0eWluZyB0aGUKKwkgKiBwZW5kaW5nIGxpc3QgKi8KKwlCVUdfT04oIWxpc3RfZW1wdHkoJmhkZXYtPm1nbXRfcGVuZGluZykpOwogCiAJaGNpX25vdGlmeShoZGV2LCBIQ0lfREVWX1VOUkVHKTsKIApAQCAtMTU2MCwyNCArMTYwMywyMSBAQAogCQlyZmtpbGxfZGVzdHJveShoZGV2LT5yZmtpbGwpOwogCX0KIAotCWhjaV91bnJlZ2lzdGVyX3N5c2ZzKGhkZXYpOworCWhjaV9kZWxfc3lzZnMoaGRldik7CiAKLQloY2lfZGVsX29mZl90aW1lcihoZGV2KTsKLQlkZWxfdGltZXIoJmhkZXYtPmFkdl90aW1lcik7CisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZoZGV2LT5hZHZfd29yayk7CiAKIAlkZXN0cm95X3dvcmtxdWV1ZShoZGV2LT53b3JrcXVldWUpOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKIAloY2lfYmxhY2tsaXN0X2NsZWFyKGhkZXYpOwogCWhjaV91dWlkc19jbGVhcihoZGV2KTsKIAloY2lfbGlua19rZXlzX2NsZWFyKGhkZXYpOwogCWhjaV9yZW1vdGVfb29iX2RhdGFfY2xlYXIoaGRldik7CiAJaGNpX2Fkdl9lbnRyaWVzX2NsZWFyKGhkZXYpOwotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCiAJX19oY2lfZGV2X3B1dChoZGV2KTsKLQotCXJldHVybiAwOwogfQogRVhQT1JUX1NZTUJPTChoY2lfdW5yZWdpc3Rlcl9kZXYpOwogCkBAIC0xNjEzLDkgKzE2NTMsOCBAQAogCS8qIFRpbWUgc3RhbXAgKi8KIAlfX25ldF90aW1lc3RhbXAoc2tiKTsKIAotCS8qIFF1ZXVlIGZyYW1lIGZvciByeCB0YXNrICovCiAJc2tiX3F1ZXVlX3RhaWwoJmhkZXYtPnJ4X3EsIHNrYik7Ci0JdGFza2xldF9zY2hlZHVsZSgmaGRldi0+cnhfdGFzayk7CisJcXVldWVfd29yayhoZGV2LT53b3JrcXVldWUsICZoZGV2LT5yeF93b3JrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTc4Nyw1OSArMTgyNiwxMyBAQAogCiAvKiAtLS0tIEludGVyZmFjZSB0byB1cHBlciBwcm90b2NvbHMgLS0tLSAqLwogCi0vKiBSZWdpc3Rlci9VbnJlZ2lzdGVyIHByb3RvY29scy4KLSAqIGhjaV90YXNrX2xvY2sgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBubyB0YXNrcyBhcmUgcnVubmluZy4gKi8KLWludCBoY2lfcmVnaXN0ZXJfcHJvdG8oc3RydWN0IGhjaV9wcm90byAqaHApCi17Ci0JaW50IGVyciA9IDA7Ci0KLQlCVF9EQkcoIiVwIG5hbWUgJXMgaWQgJWQiLCBocCwgaHAtPm5hbWUsIGhwLT5pZCk7Ci0KLQlpZiAoaHAtPmlkID49IEhDSV9NQVhfUFJPVE8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd3JpdGVfbG9ja19iaCgmaGNpX3Rhc2tfbG9jayk7Ci0KLQlpZiAoIWhjaV9wcm90b1tocC0+aWRdKQotCQloY2lfcHJvdG9baHAtPmlkXSA9IGhwOwotCWVsc2UKLQkJZXJyID0gLUVFWElTVDsKLQotCXdyaXRlX3VubG9ja19iaCgmaGNpX3Rhc2tfbG9jayk7Ci0KLQlyZXR1cm4gZXJyOwotfQotRVhQT1JUX1NZTUJPTChoY2lfcmVnaXN0ZXJfcHJvdG8pOwotCi1pbnQgaGNpX3VucmVnaXN0ZXJfcHJvdG8oc3RydWN0IGhjaV9wcm90byAqaHApCi17Ci0JaW50IGVyciA9IDA7Ci0KLQlCVF9EQkcoIiVwIG5hbWUgJXMgaWQgJWQiLCBocCwgaHAtPm5hbWUsIGhwLT5pZCk7Ci0KLQlpZiAoaHAtPmlkID49IEhDSV9NQVhfUFJPVE8pCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd3JpdGVfbG9ja19iaCgmaGNpX3Rhc2tfbG9jayk7Ci0KLQlpZiAoaGNpX3Byb3RvW2hwLT5pZF0pCi0JCWhjaV9wcm90b1tocC0+aWRdID0gTlVMTDsKLQllbHNlCi0JCWVyciA9IC1FTk9FTlQ7Ci0KLQl3cml0ZV91bmxvY2tfYmgoJmhjaV90YXNrX2xvY2spOwotCi0JcmV0dXJuIGVycjsKLX0KLUVYUE9SVF9TWU1CT0woaGNpX3VucmVnaXN0ZXJfcHJvdG8pOwotCiBpbnQgaGNpX3JlZ2lzdGVyX2NiKHN0cnVjdCBoY2lfY2IgKmNiKQogewogCUJUX0RCRygiJXAgbmFtZSAlcyIsIGNiLCBjYi0+bmFtZSk7CiAKLQl3cml0ZV9sb2NrX2JoKCZoY2lfY2JfbGlzdF9sb2NrKTsKKwl3cml0ZV9sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKIAlsaXN0X2FkZCgmY2ItPmxpc3QsICZoY2lfY2JfbGlzdCk7Ci0Jd3JpdGVfdW5sb2NrX2JoKCZoY2lfY2JfbGlzdF9sb2NrKTsKKwl3cml0ZV91bmxvY2soJmhjaV9jYl9saXN0X2xvY2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xODQ5LDkgKzE4NDIsOSBAQAogewogCUJUX0RCRygiJXAgbmFtZSAlcyIsIGNiLCBjYi0+bmFtZSk7CiAKLQl3cml0ZV9sb2NrX2JoKCZoY2lfY2JfbGlzdF9sb2NrKTsKKwl3cml0ZV9sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKIAlsaXN0X2RlbCgmY2ItPmxpc3QpOwotCXdyaXRlX3VubG9ja19iaCgmaGNpX2NiX2xpc3RfbG9jayk7CisJd3JpdGVfdW5sb2NrKCZoY2lfY2JfbGlzdF9sb2NrKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTkxMiw3ICsxOTA1LDcgQEAKIAkJaGRldi0+aW5pdF9sYXN0X2NtZCA9IG9wY29kZTsKIAogCXNrYl9xdWV1ZV90YWlsKCZoZGV2LT5jbWRfcSwgc2tiKTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZoZGV2LT5jbWRfdGFzayk7CisJcXVldWVfd29yayhoZGV2LT53b3JrcXVldWUsICZoZGV2LT5jbWRfd29yayk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTE5NDgsMjMgKzE5NDEsMTggQEAKIAloZHItPmRsZW4gICA9IGNwdV90b19sZTE2KGxlbik7CiB9CiAKLXZvaWQgaGNpX3NlbmRfYWNsKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MTYgZmxhZ3MpCitzdGF0aWMgdm9pZCBoY2lfcXVldWVfYWNsKHN0cnVjdCBoY2lfY29ubiAqY29ubiwgc3RydWN0IHNrX2J1ZmZfaGVhZCAqcXVldWUsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MTYgZmxhZ3MpCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb25uLT5oZGV2OwogCXN0cnVjdCBza19idWZmICpsaXN0OwogCi0JQlRfREJHKCIlcyBjb25uICVwIGZsYWdzIDB4JXgiLCBoZGV2LT5uYW1lLCBjb25uLCBmbGFncyk7Ci0KLQlza2ItPmRldiA9ICh2b2lkICopIGhkZXY7Ci0JYnRfY2Ioc2tiKS0+cGt0X3R5cGUgPSBIQ0lfQUNMREFUQV9QS1Q7Ci0JaGNpX2FkZF9hY2xfaGRyKHNrYiwgY29ubi0+aGFuZGxlLCBmbGFncyk7Ci0KIAlsaXN0ID0gc2tiX3NoaW5mbyhza2IpLT5mcmFnX2xpc3Q7CiAJaWYgKCFsaXN0KSB7CiAJCS8qIE5vbiBmcmFnbWVudGVkICovCiAJCUJUX0RCRygiJXMgbm9uZnJhZyBza2IgJXAgbGVuICVkIiwgaGRldi0+bmFtZSwgc2tiLCBza2ItPmxlbik7CiAKLQkJc2tiX3F1ZXVlX3RhaWwoJmNvbm4tPmRhdGFfcSwgc2tiKTsKKwkJc2tiX3F1ZXVlX3RhaWwocXVldWUsIHNrYik7CiAJfSBlbHNlIHsKIAkJLyogRnJhZ21lbnRlZCAqLwogCQlCVF9EQkcoIiVzIGZyYWcgJXAgbGVuICVkIiwgaGRldi0+bmFtZSwgc2tiLCBza2ItPmxlbik7CkBAIC0xOTcyLDkgKzE5NjAsOSBAQAogCQlza2Jfc2hpbmZvKHNrYiktPmZyYWdfbGlzdCA9IE5VTEw7CiAKIAkJLyogUXVldWUgYWxsIGZyYWdtZW50cyBhdG9taWNhbGx5ICovCi0JCXNwaW5fbG9ja19iaCgmY29ubi0+ZGF0YV9xLmxvY2spOworCQlzcGluX2xvY2soJnF1ZXVlLT5sb2NrKTsKIAotCQlfX3NrYl9xdWV1ZV90YWlsKCZjb25uLT5kYXRhX3EsIHNrYik7CisJCV9fc2tiX3F1ZXVlX3RhaWwocXVldWUsIHNrYik7CiAKIAkJZmxhZ3MgJj0gfkFDTF9TVEFSVDsKIAkJZmxhZ3MgfD0gQUNMX0NPTlQ7CkBAIC0xOTg3LDEzICsxOTc1LDI3IEBACiAKIAkJCUJUX0RCRygiJXMgZnJhZyAlcCBsZW4gJWQiLCBoZGV2LT5uYW1lLCBza2IsIHNrYi0+bGVuKTsKIAotCQkJX19za2JfcXVldWVfdGFpbCgmY29ubi0+ZGF0YV9xLCBza2IpOworCQkJX19za2JfcXVldWVfdGFpbChxdWV1ZSwgc2tiKTsKIAkJfSB3aGlsZSAobGlzdCk7CiAKLQkJc3Bpbl91bmxvY2tfYmgoJmNvbm4tPmRhdGFfcS5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJnF1ZXVlLT5sb2NrKTsKIAl9Cit9CiAKLQl0YXNrbGV0X3NjaGVkdWxlKCZoZGV2LT50eF90YXNrKTsKK3ZvaWQgaGNpX3NlbmRfYWNsKHN0cnVjdCBoY2lfY2hhbiAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgX191MTYgZmxhZ3MpCit7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gY2hhbi0+Y29ubjsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7CisKKwlCVF9EQkcoIiVzIGNoYW4gJXAgZmxhZ3MgMHgleCIsIGhkZXYtPm5hbWUsIGNoYW4sIGZsYWdzKTsKKworCXNrYi0+ZGV2ID0gKHZvaWQgKikgaGRldjsKKwlidF9jYihza2IpLT5wa3RfdHlwZSA9IEhDSV9BQ0xEQVRBX1BLVDsKKwloY2lfYWRkX2FjbF9oZHIoc2tiLCBjb25uLT5oYW5kbGUsIGZsYWdzKTsKKworCWhjaV9xdWV1ZV9hY2woY29ubiwgJmNoYW4tPmRhdGFfcSwgc2tiLCBmbGFncyk7CisKKwlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPnR4X3dvcmspOwogfQogRVhQT1JUX1NZTUJPTChoY2lfc2VuZF9hY2wpOwogCkBAIC0yMDE2LDcgKzIwMTgsNyBAQAogCWJ0X2NiKHNrYiktPnBrdF90eXBlID0gSENJX1NDT0RBVEFfUEtUOwogCiAJc2tiX3F1ZXVlX3RhaWwoJmNvbm4tPmRhdGFfcSwgc2tiKTsKLQl0YXNrbGV0X3NjaGVkdWxlKCZoZGV2LT50eF90YXNrKTsKKwlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPnR4X3dvcmspOwogfQogRVhQT1JUX1NZTUJPTChoY2lfc2VuZF9zY28pOwogCkBAIC0yMDI2LDE2ICsyMDI4LDE1IEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBoY2lfY29ubiAqaGNpX2xvd19zZW50KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3U4IHR5cGUsIGludCAqcXVvdGUpCiB7CiAJc3RydWN0IGhjaV9jb25uX2hhc2ggKmggPSAmaGRldi0+Y29ubl9oYXNoOwotCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IE5VTEw7CisJc3RydWN0IGhjaV9jb25uICpjb25uID0gTlVMTCwgKmM7CiAJaW50IG51bSA9IDAsIG1pbiA9IH4wOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAKIAkvKiBXZSBkb24ndCBoYXZlIHRvIGxvY2sgZGV2aWNlIGhlcmUuIENvbm5lY3Rpb25zIGFyZSBhbHdheXMKIAkgKiBhZGRlZCBhbmQgcmVtb3ZlZCB3aXRoIFRYIHRhc2sgZGlzYWJsZWQuICovCi0JbGlzdF9mb3JfZWFjaChwLCAmaC0+bGlzdCkgewotCQlzdHJ1Y3QgaGNpX2Nvbm4gKmM7Ci0JCWMgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoY2lfY29ubiwgbGlzdCk7CiAKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjLCAmaC0+bGlzdCwgbGlzdCkgewogCQlpZiAoYy0+dHlwZSAhPSB0eXBlIHx8IHNrYl9xdWV1ZV9lbXB0eSgmYy0+ZGF0YV9xKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0yMDUzLDYgKzIwNTQsOCBAQAogCQkJYnJlYWs7CiAJfQogCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKIAlpZiAoY29ubikgewogCQlpbnQgY250LCBxOwogCkBAIC0yMDg0LDI3ICsyMDg3LDE1OSBAQAogc3RhdGljIGlubGluZSB2b2lkIGhjaV9saW5rX3R4X3RvKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3U4IHR5cGUpCiB7CiAJc3RydWN0IGhjaV9jb25uX2hhc2ggKmggPSAmaGRldi0+Y29ubl9oYXNoOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7Ci0Jc3RydWN0IGhjaV9jb25uICAqYzsKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmM7CiAKIAlCVF9FUlIoIiVzIGxpbmsgdHggdGltZW91dCIsIGhkZXYtPm5hbWUpOwogCisJcmN1X3JlYWRfbG9jaygpOworCiAJLyogS2lsbCBzdGFsbGVkIGNvbm5lY3Rpb25zICovCi0JbGlzdF9mb3JfZWFjaChwLCAmaC0+bGlzdCkgewotCQljID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGMsICZoLT5saXN0LCBsaXN0KSB7CiAJCWlmIChjLT50eXBlID09IHR5cGUgJiYgYy0+c2VudCkgewogCQkJQlRfRVJSKCIlcyBraWxsaW5nIHN0YWxsZWQgY29ubmVjdGlvbiAlcyIsCiAJCQkJaGRldi0+bmFtZSwgYmF0b3N0cigmYy0+ZHN0KSk7CiAJCQloY2lfYWNsX2Rpc2Nvbm4oYywgMHgxMyk7CiAJCX0KIAl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgaGNpX2NoYW4gKmhjaV9jaGFuX3NlbnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTggdHlwZSwKKwkJCQkJCWludCAqcXVvdGUpCit7CisJc3RydWN0IGhjaV9jb25uX2hhc2ggKmggPSAmaGRldi0+Y29ubl9oYXNoOworCXN0cnVjdCBoY2lfY2hhbiAqY2hhbiA9IE5VTEw7CisJaW50IG51bSA9IDAsIG1pbiA9IH4wLCBjdXJfcHJpbyA9IDA7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCWludCBjbnQsIHEsIGNvbm5fbnVtID0gMDsKKworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCXJjdV9yZWFkX2xvY2soKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNvbm4sICZoLT5saXN0LCBsaXN0KSB7CisJCXN0cnVjdCBoY2lfY2hhbiAqdG1wOworCisJCWlmIChjb25uLT50eXBlICE9IHR5cGUpCisJCQljb250aW51ZTsKKworCQlpZiAoY29ubi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEICYmIGNvbm4tPnN0YXRlICE9IEJUX0NPTkZJRykKKwkJCWNvbnRpbnVlOworCisJCWNvbm5fbnVtKys7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodG1wLCAmY29ubi0+Y2hhbl9saXN0LCBsaXN0KSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJCQlpZiAoc2tiX3F1ZXVlX2VtcHR5KCZ0bXAtPmRhdGFfcSkpCisJCQkJY29udGludWU7CisKKwkJCXNrYiA9IHNrYl9wZWVrKCZ0bXAtPmRhdGFfcSk7CisJCQlpZiAoc2tiLT5wcmlvcml0eSA8IGN1cl9wcmlvKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc2tiLT5wcmlvcml0eSA+IGN1cl9wcmlvKSB7CisJCQkJbnVtID0gMDsKKwkJCQltaW4gPSB+MDsKKwkJCQljdXJfcHJpbyA9IHNrYi0+cHJpb3JpdHk7CisJCQl9CisKKwkJCW51bSsrOworCisJCQlpZiAoY29ubi0+c2VudCA8IG1pbikgeworCQkJCW1pbiAgPSBjb25uLT5zZW50OworCQkJCWNoYW4gPSB0bXA7CisJCQl9CisJCX0KKworCQlpZiAoaGNpX2Nvbm5fbnVtKGhkZXYsIHR5cGUpID09IGNvbm5fbnVtKQorCQkJYnJlYWs7CisJfQorCisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoIWNoYW4pCisJCXJldHVybiBOVUxMOworCisJc3dpdGNoIChjaGFuLT5jb25uLT50eXBlKSB7CisJY2FzZSBBQ0xfTElOSzoKKwkJY250ID0gaGRldi0+YWNsX2NudDsKKwkJYnJlYWs7CisJY2FzZSBTQ09fTElOSzoKKwljYXNlIEVTQ09fTElOSzoKKwkJY250ID0gaGRldi0+c2NvX2NudDsKKwkJYnJlYWs7CisJY2FzZSBMRV9MSU5LOgorCQljbnQgPSBoZGV2LT5sZV9tdHUgPyBoZGV2LT5sZV9jbnQgOiBoZGV2LT5hY2xfY250OworCQlicmVhazsKKwlkZWZhdWx0OgorCQljbnQgPSAwOworCQlCVF9FUlIoIlVua25vd24gbGluayB0eXBlIik7CisJfQorCisJcSA9IGNudCAvIG51bTsKKwkqcXVvdGUgPSBxID8gcSA6IDE7CisJQlRfREJHKCJjaGFuICVwIHF1b3RlICVkIiwgY2hhbiwgKnF1b3RlKTsKKwlyZXR1cm4gY2hhbjsKK30KKworc3RhdGljIHZvaWQgaGNpX3ByaW9fcmVjYWxjdWxhdGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIF9fdTggdHlwZSkKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm5faGFzaCAqaCA9ICZoZGV2LT5jb25uX2hhc2g7CisJc3RydWN0IGhjaV9jb25uICpjb25uOworCWludCBudW0gPSAwOworCisJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOworCisJcmN1X3JlYWRfbG9jaygpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY29ubiwgJmgtPmxpc3QsIGxpc3QpIHsKKwkJc3RydWN0IGhjaV9jaGFuICpjaGFuOworCisJCWlmIChjb25uLT50eXBlICE9IHR5cGUpCisJCQljb250aW51ZTsKKworCQlpZiAoY29ubi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEICYmIGNvbm4tPnN0YXRlICE9IEJUX0NPTkZJRykKKwkJCWNvbnRpbnVlOworCisJCW51bSsrOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNoYW4sICZjb25uLT5jaGFuX2xpc3QsIGxpc3QpIHsKKwkJCXN0cnVjdCBza19idWZmICpza2I7CisKKwkJCWlmIChjaGFuLT5zZW50KSB7CisJCQkJY2hhbi0+c2VudCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWlmIChza2JfcXVldWVfZW1wdHkoJmNoYW4tPmRhdGFfcSkpCisJCQkJY29udGludWU7CisKKwkJCXNrYiA9IHNrYl9wZWVrKCZjaGFuLT5kYXRhX3EpOworCQkJaWYgKHNrYi0+cHJpb3JpdHkgPj0gSENJX1BSSU9fTUFYIC0gMSkKKwkJCQljb250aW51ZTsKKworCQkJc2tiLT5wcmlvcml0eSA9IEhDSV9QUklPX01BWCAtIDE7CisKKwkJCUJUX0RCRygiY2hhbiAlcCBza2IgJXAgcHJvbW90ZWQgdG8gJWQiLCBjaGFuLCBza2IsCisJCQkJCQkJCXNrYi0+cHJpb3JpdHkpOworCQl9CisKKwkJaWYgKGhjaV9jb25uX251bShoZGV2LCB0eXBlKSA9PSBudW0pCisJCQlicmVhazsKKwl9CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX3NjaGVkX2FjbChzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKLQlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CisJc3RydWN0IGhjaV9jaGFuICpjaGFuOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHF1b3RlOworCXVuc2lnbmVkIGludCBjbnQ7CiAKIAlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CiAKQEAgLTIxMTgsMTkgKzIyNTMsMzUgQEAKIAkJCWhjaV9saW5rX3R4X3RvKGhkZXYsIEFDTF9MSU5LKTsKIAl9CiAKLQl3aGlsZSAoaGRldi0+YWNsX2NudCAmJiAoY29ubiA9IGhjaV9sb3dfc2VudChoZGV2LCBBQ0xfTElOSywgJnF1b3RlKSkpIHsKLQkJd2hpbGUgKHF1b3RlLS0gJiYgKHNrYiA9IHNrYl9kZXF1ZXVlKCZjb25uLT5kYXRhX3EpKSkgewotCQkJQlRfREJHKCJza2IgJXAgbGVuICVkIiwgc2tiLCBza2ItPmxlbik7CisJY250ID0gaGRldi0+YWNsX2NudDsKIAotCQkJaGNpX2Nvbm5fZW50ZXJfYWN0aXZlX21vZGUoY29ubiwgYnRfY2Ioc2tiKS0+Zm9yY2VfYWN0aXZlKTsKKwl3aGlsZSAoaGRldi0+YWNsX2NudCAmJgorCQkJKGNoYW4gPSBoY2lfY2hhbl9zZW50KGhkZXYsIEFDTF9MSU5LLCAmcXVvdGUpKSkgeworCQl1MzIgcHJpb3JpdHkgPSAoc2tiX3BlZWsoJmNoYW4tPmRhdGFfcSkpLT5wcmlvcml0eTsKKwkJd2hpbGUgKHF1b3RlLS0gJiYgKHNrYiA9IHNrYl9wZWVrKCZjaGFuLT5kYXRhX3EpKSkgeworCQkJQlRfREJHKCJjaGFuICVwIHNrYiAlcCBsZW4gJWQgcHJpb3JpdHkgJXUiLCBjaGFuLCBza2IsCisJCQkJCXNrYi0+bGVuLCBza2ItPnByaW9yaXR5KTsKKworCQkJLyogU3RvcCBpZiBwcmlvcml0eSBoYXMgY2hhbmdlZCAqLworCQkJaWYgKHNrYi0+cHJpb3JpdHkgPCBwcmlvcml0eSkKKwkJCQlicmVhazsKKworCQkJc2tiID0gc2tiX2RlcXVldWUoJmNoYW4tPmRhdGFfcSk7CisKKwkJCWhjaV9jb25uX2VudGVyX2FjdGl2ZV9tb2RlKGNoYW4tPmNvbm4sCisJCQkJCQlidF9jYihza2IpLT5mb3JjZV9hY3RpdmUpOwogCiAJCQloY2lfc2VuZF9mcmFtZShza2IpOwogCQkJaGRldi0+YWNsX2xhc3RfdHggPSBqaWZmaWVzOwogCiAJCQloZGV2LT5hY2xfY250LS07Ci0JCQljb25uLT5zZW50Kys7CisJCQljaGFuLT5zZW50Kys7CisJCQljaGFuLT5jb25uLT5zZW50Kys7CiAJCX0KIAl9CisKKwlpZiAoY250ICE9IGhkZXYtPmFjbF9jbnQpCisJCWhjaV9wcmlvX3JlY2FsY3VsYXRlKGhkZXYsIEFDTF9MSU5LKTsKIH0KIAogLyogU2NoZWR1bGUgU0NPICovCkBAIC0yMTgyLDkgKzIzMzMsOSBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX3NjaGVkX2xlKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewotCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKKwlzdHJ1Y3QgaGNpX2NoYW4gKmNoYW47CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgcXVvdGUsIGNudDsKKwlpbnQgcXVvdGUsIGNudCwgdG1wOwogCiAJQlRfREJHKCIlcyIsIGhkZXYtPm5hbWUpOwogCkBAIC0yMjAwLDMwICsyMzUxLDQyIEBACiAJfQogCiAJY250ID0gaGRldi0+bGVfcGt0cyA/IGhkZXYtPmxlX2NudCA6IGhkZXYtPmFjbF9jbnQ7Ci0Jd2hpbGUgKGNudCAmJiAoY29ubiA9IGhjaV9sb3dfc2VudChoZGV2LCBMRV9MSU5LLCAmcXVvdGUpKSkgewotCQl3aGlsZSAocXVvdGUtLSAmJiAoc2tiID0gc2tiX2RlcXVldWUoJmNvbm4tPmRhdGFfcSkpKSB7Ci0JCQlCVF9EQkcoInNrYiAlcCBsZW4gJWQiLCBza2IsIHNrYi0+bGVuKTsKKwl0bXAgPSBjbnQ7CisJd2hpbGUgKGNudCAmJiAoY2hhbiA9IGhjaV9jaGFuX3NlbnQoaGRldiwgTEVfTElOSywgJnF1b3RlKSkpIHsKKwkJdTMyIHByaW9yaXR5ID0gKHNrYl9wZWVrKCZjaGFuLT5kYXRhX3EpKS0+cHJpb3JpdHk7CisJCXdoaWxlIChxdW90ZS0tICYmIChza2IgPSBza2JfcGVlaygmY2hhbi0+ZGF0YV9xKSkpIHsKKwkJCUJUX0RCRygiY2hhbiAlcCBza2IgJXAgbGVuICVkIHByaW9yaXR5ICV1IiwgY2hhbiwgc2tiLAorCQkJCQlza2ItPmxlbiwgc2tiLT5wcmlvcml0eSk7CisKKwkJCS8qIFN0b3AgaWYgcHJpb3JpdHkgaGFzIGNoYW5nZWQgKi8KKwkJCWlmIChza2ItPnByaW9yaXR5IDwgcHJpb3JpdHkpCisJCQkJYnJlYWs7CisKKwkJCXNrYiA9IHNrYl9kZXF1ZXVlKCZjaGFuLT5kYXRhX3EpOwogCiAJCQloY2lfc2VuZF9mcmFtZShza2IpOwogCQkJaGRldi0+bGVfbGFzdF90eCA9IGppZmZpZXM7CiAKIAkJCWNudC0tOwotCQkJY29ubi0+c2VudCsrOworCQkJY2hhbi0+c2VudCsrOworCQkJY2hhbi0+Y29ubi0+c2VudCsrOwogCQl9CiAJfQorCiAJaWYgKGhkZXYtPmxlX3BrdHMpCiAJCWhkZXYtPmxlX2NudCA9IGNudDsKIAllbHNlCiAJCWhkZXYtPmFjbF9jbnQgPSBjbnQ7CisKKwlpZiAoY250ICE9IHRtcCkKKwkJaGNpX3ByaW9fcmVjYWxjdWxhdGUoaGRldiwgTEVfTElOSyk7CiB9CiAKLXN0YXRpYyB2b2lkIGhjaV90eF90YXNrKHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIHZvaWQgaGNpX3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gKHN0cnVjdCBoY2lfZGV2ICopIGFyZzsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaGNpX2RldiwgdHhfd29yayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCXJlYWRfbG9jaygmaGNpX3Rhc2tfbG9jayk7Ci0KIAlCVF9EQkcoIiVzIGFjbCAlZCBzY28gJWQgbGUgJWQiLCBoZGV2LT5uYW1lLCBoZGV2LT5hY2xfY250LAogCQloZGV2LT5zY29fY250LCBoZGV2LT5sZV9jbnQpOwogCkBAIC0yMjQwLDggKzI0MDMsNiBAQAogCS8qIFNlbmQgbmV4dCBxdWV1ZWQgcmF3ICh1bmtub3duIHR5cGUpIHBhY2tldCAqLwogCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmhkZXYtPnJhd19xKSkpCiAJCWhjaV9zZW5kX2ZyYW1lKHNrYik7Ci0KLQlyZWFkX3VubG9jaygmaGNpX3Rhc2tfbG9jayk7CiB9CiAKIC8qIC0tLS0tIEhDSSBSWCB0YXNrIChpbmNvbWluZyBkYXRhIHByb2Nlc3NpbmcpIC0tLS0tICovCkBAIC0yMjY4LDE2ICsyNDI5LDExIEBACiAJaGNpX2Rldl91bmxvY2soaGRldik7CiAKIAlpZiAoY29ubikgewotCQlyZWdpc3RlciBzdHJ1Y3QgaGNpX3Byb3RvICpocDsKLQotCQloY2lfY29ubl9lbnRlcl9hY3RpdmVfbW9kZShjb25uLCBidF9jYihza2IpLT5mb3JjZV9hY3RpdmUpOworCQloY2lfY29ubl9lbnRlcl9hY3RpdmVfbW9kZShjb25uLCBCVF9QT1dFUl9GT1JDRV9BQ1RJVkVfT0ZGKTsKIAogCQkvKiBTZW5kIHRvIHVwcGVyIHByb3RvY29sICovCi0JCWhwID0gaGNpX3Byb3RvW0hDSV9QUk9UT19MMkNBUF07Ci0JCWlmIChocCAmJiBocC0+cmVjdl9hY2xkYXRhKSB7Ci0JCQlocC0+cmVjdl9hY2xkYXRhKGNvbm4sIHNrYiwgZmxhZ3MpOwotCQkJcmV0dXJuOwotCQl9CisJCWwyY2FwX3JlY3ZfYWNsZGF0YShjb25uLCBza2IsIGZsYWdzKTsKKwkJcmV0dXJuOwogCX0gZWxzZSB7CiAJCUJUX0VSUigiJXMgQUNMIHBhY2tldCBmb3IgdW5rbm93biBjb25uZWN0aW9uIGhhbmRsZSAlZCIsCiAJCQloZGV2LT5uYW1lLCBoYW5kbGUpOwpAQCAtMjMwNiwxNCArMjQ2Miw5IEBACiAJaGNpX2Rldl91bmxvY2soaGRldik7CiAKIAlpZiAoY29ubikgewotCQlyZWdpc3RlciBzdHJ1Y3QgaGNpX3Byb3RvICpocDsKLQogCQkvKiBTZW5kIHRvIHVwcGVyIHByb3RvY29sICovCi0JCWhwID0gaGNpX3Byb3RvW0hDSV9QUk9UT19TQ09dOwotCQlpZiAoaHAgJiYgaHAtPnJlY3Zfc2NvZGF0YSkgewotCQkJaHAtPnJlY3Zfc2NvZGF0YShjb25uLCBza2IpOwotCQkJcmV0dXJuOwotCQl9CisJCXNjb19yZWN2X3Njb2RhdGEoY29ubiwgc2tiKTsKKwkJcmV0dXJuOwogCX0gZWxzZSB7CiAJCUJUX0VSUigiJXMgU0NPIHBhY2tldCBmb3IgdW5rbm93biBjb25uZWN0aW9uIGhhbmRsZSAlZCIsCiAJCQloZGV2LT5uYW1lLCBoYW5kbGUpOwpAQCAtMjMyMiwxNSArMjQ3MywxMyBAQAogCWtmcmVlX3NrYihza2IpOwogfQogCi1zdGF0aWMgdm9pZCBoY2lfcnhfdGFzayh1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyB2b2lkIGhjaV9yeF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IChzdHJ1Y3QgaGNpX2RldiAqKSBhcmc7CisJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhjaV9kZXYsIHJ4X3dvcmspOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CiAKLQlyZWFkX2xvY2soJmhjaV90YXNrX2xvY2spOwotCiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmaGRldi0+cnhfcSkpKSB7CiAJCWlmIChhdG9taWNfcmVhZCgmaGRldi0+cHJvbWlzYykpIHsKIAkJCS8qIFNlbmQgY29weSB0byB0aGUgc29ja2V0cyAqLwpAQCAtMjM1NSw2ICsyNTA0LDcgQEAKIAkJLyogUHJvY2VzcyBmcmFtZSAqLwogCQlzd2l0Y2ggKGJ0X2NiKHNrYiktPnBrdF90eXBlKSB7CiAJCWNhc2UgSENJX0VWRU5UX1BLVDoKKwkJCUJUX0RCRygiJXMgRXZlbnQgcGFja2V0IiwgaGRldi0+bmFtZSk7CiAJCQloY2lfZXZlbnRfcGFja2V0KGhkZXYsIHNrYik7CiAJCQlicmVhazsKIApAQCAtMjM3MywxMyArMjUyMywxMSBAQAogCQkJYnJlYWs7CiAJCX0KIAl9Ci0KLQlyZWFkX3VubG9jaygmaGNpX3Rhc2tfbG9jayk7CiB9CiAKLXN0YXRpYyB2b2lkIGhjaV9jbWRfdGFzayh1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyB2b2lkIGhjaV9jbWRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGhjaV9kZXYgKmhkZXYgPSAoc3RydWN0IGhjaV9kZXYgKikgYXJnOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBoY2lfZGV2LCBjbWRfd29yayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCUJUX0RCRygiJXMgY21kICVkIiwgaGRldi0+bmFtZSwgYXRvbWljX3JlYWQoJmhkZXYtPmNtZF9jbnQpKTsKQEAgLTI0MDMsNyArMjU1MSwzOCBAQAogCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoSENJX0NNRF9USU1FT1VUKSk7CiAJCX0gZWxzZSB7CiAJCQlza2JfcXVldWVfaGVhZCgmaGRldi0+Y21kX3EsIHNrYik7Ci0JCQl0YXNrbGV0X3NjaGVkdWxlKCZoZGV2LT5jbWRfdGFzayk7CisJCQlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPmNtZF93b3JrKTsKIAkJfQogCX0KIH0KKworaW50IGhjaV9kb19pbnF1aXJ5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBsZW5ndGgpCit7CisJLyogR2VuZXJhbCBpbnF1aXJ5IGFjY2VzcyBjb2RlIChHSUFDKSAqLworCXU4IGxhcFszXSA9IHsgMHgzMywgMHg4YiwgMHg5ZSB9OworCXN0cnVjdCBoY2lfY3BfaW5xdWlyeSBjcDsKKworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKKworCWlmICh0ZXN0X2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKSkKKwkJcmV0dXJuIC1FSU5QUk9HUkVTUzsKKworCW1lbXNldCgmY3AsIDAsIHNpemVvZihjcCkpOworCW1lbWNweSgmY3AubGFwLCBsYXAsIHNpemVvZihjcC5sYXApKTsKKwljcC5sZW5ndGggID0gbGVuZ3RoOworCisJcmV0dXJuIGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfSU5RVUlSWSwgc2l6ZW9mKGNwKSwgJmNwKTsKK30KKworaW50IGhjaV9jYW5jZWxfaW5xdWlyeShzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3sKKwlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CisKKwlpZiAoIXRlc3RfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfSU5RVUlSWV9DQU5DRUwsIDAsIE5VTEwpOworfQorCittb2R1bGVfcGFyYW0oZW5hYmxlX2hzLCBib29sLCAwNjQ0KTsKK01PRFVMRV9QQVJNX0RFU0MoZW5hYmxlX2hzLCAiRW5hYmxlIEhpZ2ggU3BlZWQiKTsKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMgYi9uZXQvYmx1ZXRvb3RoL2hjaV9ldmVudC5jCmluZGV4IGQ3ZDk2YjYuLjQyMjFiZDIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX2V2ZW50LmMKKysrIGIvbmV0L2JsdWV0b290aC9oY2lfZXZlbnQuYwpAQCAtNDUsNyArNDUsNyBAQAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgogCi1zdGF0aWMgaW50IGVuYWJsZV9sZTsKK3N0YXRpYyBib29sIGVuYWJsZV9sZTsKIAogLyogSGFuZGxlIEhDSSBFdmVudCBwYWNrZXRzICovCiAKQEAgLTU1LDEyICs1NSwxOCBAQAogCiAJQlRfREJHKCIlcyBzdGF0dXMgMHgleCIsIGhkZXYtPm5hbWUsIHN0YXR1cyk7CiAKLQlpZiAoc3RhdHVzKQorCWlmIChzdGF0dXMpIHsKKwkJaGNpX2Rldl9sb2NrKGhkZXYpOworCQltZ210X3N0b3BfZGlzY292ZXJ5X2ZhaWxlZChoZGV2LCBzdGF0dXMpOworCQloY2lfZGV2X3VubG9jayhoZGV2KTsKIAkJcmV0dXJuOworCX0KIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0lOUVVJUlksICZoZGV2LT5mbGFncykgJiYKLQkJCXRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZmxhZ3MpKQotCQltZ210X2Rpc2NvdmVyaW5nKGhkZXYtPmlkLCAwKTsKKwljbGVhcl9iaXQoSENJX0lOUVVJUlksICZoZGV2LT5mbGFncyk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisJbWdtdF9kaXNjb3ZlcmluZyhoZGV2LCAwKTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAogCWhjaV9yZXFfY29tcGxldGUoaGRldiwgSENJX09QX0lOUVVJUllfQ0FOQ0VMLCBzdGF0dXMpOwogCkBAIC03NiwxMCArODIsNiBAQAogCWlmIChzdGF0dXMpCiAJCXJldHVybjsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0lOUVVJUlksICZoZGV2LT5mbGFncykgJiYKLQkJCQl0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKLQkJbWdtdF9kaXNjb3ZlcmluZyhoZGV2LT5pZCwgMCk7Ci0KIAloY2lfY29ubl9jaGVja19wZW5kaW5nKGhkZXYpOwogfQogCkBAIC0xOTIsNiArMTk0LDggQEAKIAljbGVhcl9iaXQoSENJX1JFU0VULCAmaGRldi0+ZmxhZ3MpOwogCiAJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBIQ0lfT1BfUkVTRVQsIHN0YXR1cyk7CisKKwloZGV2LT5kZXZfZmxhZ3MgPSAwOwogfQogCiBzdGF0aWMgdm9pZCBoY2lfY2Nfd3JpdGVfbG9jYWxfbmFtZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTIwNSwxMyArMjA5LDE1IEBACiAJaWYgKCFzZW50KQogCQlyZXR1cm47CiAKKwloY2lfZGV2X2xvY2soaGRldik7CisKIAlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCi0JCW1nbXRfc2V0X2xvY2FsX25hbWVfY29tcGxldGUoaGRldi0+aWQsIHNlbnQsIHN0YXR1cyk7CisJCW1nbXRfc2V0X2xvY2FsX25hbWVfY29tcGxldGUoaGRldiwgc2VudCwgc3RhdHVzKTsKIAotCWlmIChzdGF0dXMpCi0JCXJldHVybjsKKwlpZiAoc3RhdHVzID09IDApCisJCW1lbWNweShoZGV2LT5kZXZfbmFtZSwgc2VudCwgSENJX01BWF9OQU1FX0xFTkdUSCk7CiAKLQltZW1jcHkoaGRldi0+ZGV2X25hbWUsIHNlbnQsIEhDSV9NQVhfTkFNRV9MRU5HVEgpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBoY2lfY2NfcmVhZF9sb2NhbF9uYW1lKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMjc0LDcgKzI4MCw4IEBACiAKIHN0YXRpYyB2b2lkIGhjaV9jY193cml0ZV9zY2FuX2VuYWJsZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlfX3U4IHN0YXR1cyA9ICooKF9fdTggKikgc2tiLT5kYXRhKTsKKwlfX3U4IHBhcmFtLCBzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisJaW50IG9sZF9wc2Nhbiwgb2xkX2lzY2FuOwogCXZvaWQgKnNlbnQ7CiAKIAlCVF9EQkcoIiVzIHN0YXR1cyAweCV4IiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKQEAgLTI4MywyOCArMjkwLDQwIEBACiAJaWYgKCFzZW50KQogCQlyZXR1cm47CiAKLQlpZiAoIXN0YXR1cykgewotCQlfX3U4IHBhcmFtID0gKigoX191OCAqKSBzZW50KTsKLQkJaW50IG9sZF9wc2Nhbiwgb2xkX2lzY2FuOworCXBhcmFtID0gKigoX191OCAqKSBzZW50KTsKIAotCQlvbGRfcHNjYW4gPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX1BTQ0FOLCAmaGRldi0+ZmxhZ3MpOwotCQlvbGRfaXNjYW4gPSB0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0lTQ0FOLCAmaGRldi0+ZmxhZ3MpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCQlpZiAocGFyYW0gJiBTQ0FOX0lOUVVJUlkpIHsKLQkJCXNldF9iaXQoSENJX0lTQ0FOLCAmaGRldi0+ZmxhZ3MpOwotCQkJaWYgKCFvbGRfaXNjYW4pCi0JCQkJbWdtdF9kaXNjb3ZlcmFibGUoaGRldi0+aWQsIDEpOwotCQl9IGVsc2UgaWYgKG9sZF9pc2NhbikKLQkJCW1nbXRfZGlzY292ZXJhYmxlKGhkZXYtPmlkLCAwKTsKLQotCQlpZiAocGFyYW0gJiBTQ0FOX1BBR0UpIHsKLQkJCXNldF9iaXQoSENJX1BTQ0FOLCAmaGRldi0+ZmxhZ3MpOwotCQkJaWYgKCFvbGRfcHNjYW4pCi0JCQkJbWdtdF9jb25uZWN0YWJsZShoZGV2LT5pZCwgMSk7Ci0JCX0gZWxzZSBpZiAob2xkX3BzY2FuKQotCQkJbWdtdF9jb25uZWN0YWJsZShoZGV2LT5pZCwgMCk7CisJaWYgKHN0YXR1cyAhPSAwKSB7CisJCW1nbXRfd3JpdGVfc2Nhbl9mYWlsZWQoaGRldiwgcGFyYW0sIHN0YXR1cyk7CisJCWhkZXYtPmRpc2Nvdl90aW1lb3V0ID0gMDsKKwkJZ290byBkb25lOwogCX0KIAorCW9sZF9wc2NhbiA9IHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfUFNDQU4sICZoZGV2LT5mbGFncyk7CisJb2xkX2lzY2FuID0gdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9JU0NBTiwgJmhkZXYtPmZsYWdzKTsKKworCWlmIChwYXJhbSAmIFNDQU5fSU5RVUlSWSkgeworCQlzZXRfYml0KEhDSV9JU0NBTiwgJmhkZXYtPmZsYWdzKTsKKwkJaWYgKCFvbGRfaXNjYW4pCisJCQltZ210X2Rpc2NvdmVyYWJsZShoZGV2LCAxKTsKKwkJaWYgKGhkZXYtPmRpc2Nvdl90aW1lb3V0ID4gMCkgeworCQkJaW50IHRvID0gbXNlY3NfdG9famlmZmllcyhoZGV2LT5kaXNjb3ZfdGltZW91dCAqIDEwMDApOworCQkJcXVldWVfZGVsYXllZF93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPmRpc2Nvdl9vZmYsCisJCQkJCQkJCQl0byk7CisJCX0KKwl9IGVsc2UgaWYgKG9sZF9pc2NhbikKKwkJbWdtdF9kaXNjb3ZlcmFibGUoaGRldiwgMCk7CisKKwlpZiAocGFyYW0gJiBTQ0FOX1BBR0UpIHsKKwkJc2V0X2JpdChIQ0lfUFNDQU4sICZoZGV2LT5mbGFncyk7CisJCWlmICghb2xkX3BzY2FuKQorCQkJbWdtdF9jb25uZWN0YWJsZShoZGV2LCAxKTsKKwl9IGVsc2UgaWYgKG9sZF9wc2NhbikKKwkJbWdtdF9jb25uZWN0YWJsZShoZGV2LCAwKTsKKworZG9uZToKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIEhDSV9PUF9XUklURV9TQ0FOX0VOQUJMRSwgc3RhdHVzKTsKIH0KIApAQCAtMzU5LDExICszNzgsOCBAQAogCiAJQlRfREJHKCIlcyB2b2ljZSBzZXR0aW5nIDB4JTA0eCIsIGhkZXYtPm5hbWUsIHNldHRpbmcpOwogCi0JaWYgKGhkZXYtPm5vdGlmeSkgewotCQl0YXNrbGV0X2Rpc2FibGUoJmhkZXYtPnR4X3Rhc2spOworCWlmIChoZGV2LT5ub3RpZnkpCiAJCWhkZXYtPm5vdGlmeShoZGV2LCBIQ0lfTk9USUZZX1ZPSUNFX1NFVFRJTkcpOwotCQl0YXNrbGV0X2VuYWJsZSgmaGRldi0+dHhfdGFzayk7Ci0JfQogfQogCiBzdGF0aWMgdm9pZCBoY2lfY2Nfd3JpdGVfdm9pY2Vfc2V0dGluZyhzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTM5MCwxMSArNDA2LDggQEAKIAogCUJUX0RCRygiJXMgdm9pY2Ugc2V0dGluZyAweCUwNHgiLCBoZGV2LT5uYW1lLCBzZXR0aW5nKTsKIAotCWlmIChoZGV2LT5ub3RpZnkpIHsKLQkJdGFza2xldF9kaXNhYmxlKCZoZGV2LT50eF90YXNrKTsKKwlpZiAoaGRldi0+bm90aWZ5KQogCQloZGV2LT5ub3RpZnkoaGRldiwgSENJX05PVElGWV9WT0lDRV9TRVRUSU5HKTsKLQkJdGFza2xldF9lbmFibGUoJmhkZXYtPnR4X3Rhc2spOwotCX0KIH0KIAogc3RhdGljIHZvaWQgaGNpX2NjX2hvc3RfYnVmZmVyX3NpemUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC00ODEsNyArNDk0LDcgQEAKIAogCS8qIENTUiAxLjEgZG9uZ2xlcyBkb2VzIG5vdCBhY2NlcHQgYW55IGJpdGZpZWxkIHNvIGRvbid0IHRyeSB0byBzZXQKIAkgKiBhbnkgZXZlbnQgbWFzayBmb3IgcHJlIDEuMiBkZXZpY2VzICovCi0JaWYgKGhkZXYtPmxtcF92ZXIgPD0gMSkKKwlpZiAoaGRldi0+aGNpX3ZlciA8IEJMVUVUT09USF9WRVJfMV8yKQogCQlyZXR1cm47CiAKIAlldmVudHNbNF0gfD0gMHgwMTsgLyogRmxvdyBTcGVjaWZpY2F0aW9uIENvbXBsZXRlICovCkBAIC01NDMsOSArNTU2LDEyIEBACiAKIHN0YXRpYyB2b2lkIGhjaV9zZXR1cChzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKKwlpZiAoaGRldi0+ZGV2X3R5cGUgIT0gSENJX0JSRURSKQorCQlyZXR1cm47CisKIAloY2lfc2V0dXBfZXZlbnRfbWFzayhoZGV2KTsKIAotCWlmIChoZGV2LT5sbXBfdmVyID4gMSkKKwlpZiAoaGRldi0+aGNpX3ZlciA+IEJMVUVUT09USF9WRVJfMV8xKQogCQloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1JFQURfTE9DQUxfQ09NTUFORFMsIDAsIE5VTEwpOwogCiAJaWYgKGhkZXYtPmZlYXR1cmVzWzZdICYgTE1QX1NJTVBMRV9QQUlSKSB7CkBAIC03MDAsNiArNzE2LDIxIEBACiAJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBIQ0lfT1BfUkVBRF9MT0NBTF9FWFRfRkVBVFVSRVMsIHJwLT5zdGF0dXMpOwogfQogCitzdGF0aWMgdm9pZCBoY2lfY2NfcmVhZF9mbG93X2NvbnRyb2xfbW9kZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ycF9yZWFkX2Zsb3dfY29udHJvbF9tb2RlICpycCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKworCUJUX0RCRygiJXMgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBycC0+c3RhdHVzKTsKKworCWlmIChycC0+c3RhdHVzKQorCQlyZXR1cm47CisKKwloZGV2LT5mbG93X2N0bF9tb2RlID0gcnAtPm1vZGU7CisKKwloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIEhDSV9PUF9SRUFEX0ZMT1dfQ09OVFJPTF9NT0RFLCBycC0+c3RhdHVzKTsKK30KKwogc3RhdGljIHZvaWQgaGNpX2NjX3JlYWRfYnVmZmVyX3NpemUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGhjaV9ycF9yZWFkX2J1ZmZlcl9zaXplICpycCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKQEAgLTczOSw2ICs3NzAsMjggQEAKIAloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIEhDSV9PUF9SRUFEX0JEX0FERFIsIHJwLT5zdGF0dXMpOwogfQogCitzdGF0aWMgdm9pZCBoY2lfY2NfcmVhZF9kYXRhX2Jsb2NrX3NpemUoc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX3JwX3JlYWRfZGF0YV9ibG9ja19zaXplICpycCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKworCUJUX0RCRygiJXMgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBycC0+c3RhdHVzKTsKKworCWlmIChycC0+c3RhdHVzKQorCQlyZXR1cm47CisKKwloZGV2LT5ibG9ja19tdHUgPSBfX2xlMTZfdG9fY3B1KHJwLT5tYXhfYWNsX2xlbik7CisJaGRldi0+YmxvY2tfbGVuID0gX19sZTE2X3RvX2NwdShycC0+YmxvY2tfbGVuKTsKKwloZGV2LT5udW1fYmxvY2tzID0gX19sZTE2X3RvX2NwdShycC0+bnVtX2Jsb2Nrcyk7CisKKwloZGV2LT5ibG9ja19jbnQgPSBoZGV2LT5udW1fYmxvY2tzOworCisJQlRfREJHKCIlcyBibGsgbXR1ICVkIGNudCAlZCBsZW4gJWQiLCBoZGV2LT5uYW1lLCBoZGV2LT5ibG9ja19tdHUsCisJCQkJCWhkZXYtPmJsb2NrX2NudCwgaGRldi0+YmxvY2tfbGVuKTsKKworCWhjaV9yZXFfY29tcGxldGUoaGRldiwgSENJX09QX1JFQURfREFUQV9CTE9DS19TSVpFLCBycC0+c3RhdHVzKTsKK30KKwogc3RhdGljIHZvaWQgaGNpX2NjX3dyaXRlX2NhX3RpbWVvdXQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJX191OCBzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CkBAIC03NDgsNiArODAxLDMwIEBACiAJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBIQ0lfT1BfV1JJVEVfQ0FfVElNRU9VVCwgc3RhdHVzKTsKIH0KIAorc3RhdGljIHZvaWQgaGNpX2NjX3JlYWRfbG9jYWxfYW1wX2luZm8oc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ycF9yZWFkX2xvY2FsX2FtcF9pbmZvICpycCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKKworCUJUX0RCRygiJXMgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBycC0+c3RhdHVzKTsKKworCWlmIChycC0+c3RhdHVzKQorCQlyZXR1cm47CisKKwloZGV2LT5hbXBfc3RhdHVzID0gcnAtPmFtcF9zdGF0dXM7CisJaGRldi0+YW1wX3RvdGFsX2J3ID0gX19sZTMyX3RvX2NwdShycC0+dG90YWxfYncpOworCWhkZXYtPmFtcF9tYXhfYncgPSBfX2xlMzJfdG9fY3B1KHJwLT5tYXhfYncpOworCWhkZXYtPmFtcF9taW5fbGF0ZW5jeSA9IF9fbGUzMl90b19jcHUocnAtPm1pbl9sYXRlbmN5KTsKKwloZGV2LT5hbXBfbWF4X3BkdSA9IF9fbGUzMl90b19jcHUocnAtPm1heF9wZHUpOworCWhkZXYtPmFtcF90eXBlID0gcnAtPmFtcF90eXBlOworCWhkZXYtPmFtcF9wYWxfY2FwID0gX19sZTE2X3RvX2NwdShycC0+cGFsX2NhcCk7CisJaGRldi0+YW1wX2Fzc29jX3NpemUgPSBfX2xlMTZfdG9fY3B1KHJwLT5tYXhfYXNzb2Nfc2l6ZSk7CisJaGRldi0+YW1wX2JlX2ZsdXNoX3RvID0gX19sZTMyX3RvX2NwdShycC0+YmVfZmx1c2hfdG8pOworCWhkZXYtPmFtcF9tYXhfZmx1c2hfdG8gPSBfX2xlMzJfdG9fY3B1KHJwLT5tYXhfZmx1c2hfdG8pOworCisJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBIQ0lfT1BfUkVBRF9MT0NBTF9BTVBfSU5GTywgcnAtPnN0YXR1cyk7Cit9CisKIHN0YXRpYyB2b2lkIGhjaV9jY19kZWxldGVfc3RvcmVkX2xpbmtfa2V5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LAogCQkJCQkJCXN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC04MDQsMTkgKzg4MSwyNCBAQAogCiAJQlRfREJHKCIlcyBzdGF0dXMgMHgleCIsIGhkZXYtPm5hbWUsIHJwLT5zdGF0dXMpOwogCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCiAJaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZmxhZ3MpKQotCQltZ210X3Bpbl9jb2RlX3JlcGx5X2NvbXBsZXRlKGhkZXYtPmlkLCAmcnAtPmJkYWRkciwgcnAtPnN0YXR1cyk7CisJCW1nbXRfcGluX2NvZGVfcmVwbHlfY29tcGxldGUoaGRldiwgJnJwLT5iZGFkZHIsIHJwLT5zdGF0dXMpOwogCiAJaWYgKHJwLT5zdGF0dXMgIT0gMCkKLQkJcmV0dXJuOworCQlnb3RvIHVubG9jazsKIAogCWNwID0gaGNpX3NlbnRfY21kX2RhdGEoaGRldiwgSENJX09QX1BJTl9DT0RFX1JFUExZKTsKIAlpZiAoIWNwKQotCQlyZXR1cm47CisJCWdvdG8gdW5sb2NrOwogCiAJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCAmY3AtPmJkYWRkcik7CiAJaWYgKGNvbm4pCiAJCWNvbm4tPnBpbl9sZW5ndGggPSBjcC0+cGluX2xlbjsKKwordW5sb2NrOgorCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCiBzdGF0aWMgdm9pZCBoY2lfY2NfcGluX2NvZGVfbmVnX3JlcGx5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtODI1LDEwICs5MDcsMTUgQEAKIAogCUJUX0RCRygiJXMgc3RhdHVzIDB4JXgiLCBoZGV2LT5uYW1lLCBycC0+c3RhdHVzKTsKIAorCWhjaV9kZXZfbG9jayhoZGV2KTsKKwogCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKLQkJbWdtdF9waW5fY29kZV9uZWdfcmVwbHlfY29tcGxldGUoaGRldi0+aWQsICZycC0+YmRhZGRyLAorCQltZ210X3Bpbl9jb2RlX25lZ19yZXBseV9jb21wbGV0ZShoZGV2LCAmcnAtPmJkYWRkciwKIAkJCQkJCQkJcnAtPnN0YXR1cyk7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIH0KKwogc3RhdGljIHZvaWQgaGNpX2NjX2xlX3JlYWRfYnVmZmVyX3NpemUoc3RydWN0IGhjaV9kZXYgKmhkZXYsCiAJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC04NTUsOSArOTQyLDEzIEBACiAKIAlCVF9EQkcoIiVzIHN0YXR1cyAweCV4IiwgaGRldi0+bmFtZSwgcnAtPnN0YXR1cyk7CiAKKwloY2lfZGV2X2xvY2soaGRldik7CisKIAlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCi0JCW1nbXRfdXNlcl9jb25maXJtX3JlcGx5X2NvbXBsZXRlKGhkZXYtPmlkLCAmcnAtPmJkYWRkciwKKwkJbWdtdF91c2VyX2NvbmZpcm1fcmVwbHlfY29tcGxldGUoaGRldiwgJnJwLT5iZGFkZHIsCiAJCQkJCQkJCXJwLT5zdGF0dXMpOworCisJaGNpX2Rldl91bmxvY2soaGRldik7CiB9CiAKIHN0YXRpYyB2b2lkIGhjaV9jY191c2VyX2NvbmZpcm1fbmVnX3JlcGx5KHN0cnVjdCBoY2lfZGV2ICpoZGV2LApAQCAtODY3LDkgKzk1OCw0NCBAQAogCiAJQlRfREJHKCIlcyBzdGF0dXMgMHgleCIsIGhkZXYtPm5hbWUsIHJwLT5zdGF0dXMpOwogCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCiAJaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZmxhZ3MpKQotCQltZ210X3VzZXJfY29uZmlybV9uZWdfcmVwbHlfY29tcGxldGUoaGRldi0+aWQsICZycC0+YmRhZGRyLAorCQltZ210X3VzZXJfY29uZmlybV9uZWdfcmVwbHlfY29tcGxldGUoaGRldiwgJnJwLT5iZGFkZHIsCiAJCQkJCQkJCXJwLT5zdGF0dXMpOworCisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKK3N0YXRpYyB2b2lkIGhjaV9jY191c2VyX3Bhc3NrZXlfcmVwbHkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9ycF91c2VyX2NvbmZpcm1fcmVwbHkgKnJwID0gKHZvaWQgKikgc2tiLT5kYXRhOworCisJQlRfREJHKCIlcyBzdGF0dXMgMHgleCIsIGhkZXYtPm5hbWUsIHJwLT5zdGF0dXMpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZmxhZ3MpKQorCQltZ210X3VzZXJfcGFzc2tleV9yZXBseV9jb21wbGV0ZShoZGV2LCAmcnAtPmJkYWRkciwKKwkJCQkJCQkJcnAtPnN0YXR1cyk7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworc3RhdGljIHZvaWQgaGNpX2NjX3VzZXJfcGFzc2tleV9uZWdfcmVwbHkoc3RydWN0IGhjaV9kZXYgKmhkZXYsCisJCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgaGNpX3JwX3VzZXJfY29uZmlybV9yZXBseSAqcnAgPSAodm9pZCAqKSBza2ItPmRhdGE7CisKKwlCVF9EQkcoIiVzIHN0YXR1cyAweCV4IiwgaGRldi0+bmFtZSwgcnAtPnN0YXR1cyk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCisJCW1nbXRfdXNlcl9wYXNza2V5X25lZ19yZXBseV9jb21wbGV0ZShoZGV2LCAmcnAtPmJkYWRkciwKKwkJCQkJCQkJcnAtPnN0YXR1cyk7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIH0KIAogc3RhdGljIHZvaWQgaGNpX2NjX3JlYWRfbG9jYWxfb29iX2RhdGFfcmVwbHkoc3RydWN0IGhjaV9kZXYgKmhkZXYsCkBAIC04NzksOCArMTAwNSwxNyBAQAogCiAJQlRfREJHKCIlcyBzdGF0dXMgMHgleCIsIGhkZXYtPm5hbWUsIHJwLT5zdGF0dXMpOwogCi0JbWdtdF9yZWFkX2xvY2FsX29vYl9kYXRhX3JlcGx5X2NvbXBsZXRlKGhkZXYtPmlkLCBycC0+aGFzaCwKKwloY2lfZGV2X2xvY2soaGRldik7CisJbWdtdF9yZWFkX2xvY2FsX29vYl9kYXRhX3JlcGx5X2NvbXBsZXRlKGhkZXYsIHJwLT5oYXNoLAogCQkJCQkJcnAtPnJhbmRvbWl6ZXIsIHJwLT5zdGF0dXMpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworfQorCitzdGF0aWMgdm9pZCBoY2lfY2NfbGVfc2V0X3NjYW5fcGFyYW0oc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJX191OCBzdGF0dXMgPSAqKChfX3U4ICopIHNrYi0+ZGF0YSk7CisKKwlCVF9EQkcoIiVzIHN0YXR1cyAweCV4IiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKIH0KIAogc3RhdGljIHZvaWQgaGNpX2NjX2xlX3NldF9zY2FuX2VuYWJsZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKQEAgLTg5OCwxNCArMTAzMywyOCBAQAogCWlmICghY3ApCiAJCXJldHVybjsKIAotCWlmIChjcC0+ZW5hYmxlID09IDB4MDEpIHsKLQkJZGVsX3RpbWVyKCZoZGV2LT5hZHZfdGltZXIpOworCXN3aXRjaCAoY3AtPmVuYWJsZSkgeworCWNhc2UgTEVfU0NBTk5JTkdfRU5BQkxFRDoKKwkJc2V0X2JpdChIQ0lfTEVfU0NBTiwgJmhkZXYtPmRldl9mbGFncyk7CisKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZoZGV2LT5hZHZfd29yayk7CiAKIAkJaGNpX2Rldl9sb2NrKGhkZXYpOwogCQloY2lfYWR2X2VudHJpZXNfY2xlYXIoaGRldik7CiAJCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwotCX0gZWxzZSBpZiAoY3AtPmVuYWJsZSA9PSAweDAwKSB7Ci0JCW1vZF90aW1lcigmaGRldi0+YWR2X3RpbWVyLCBqaWZmaWVzICsgQURWX0NMRUFSX1RJTUVPVVQpOworCQlicmVhazsKKworCWNhc2UgTEVfU0NBTk5JTkdfRElTQUJMRUQ6CisJCWNsZWFyX2JpdChIQ0lfTEVfU0NBTiwgJmhkZXYtPmRldl9mbGFncyk7CisKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZoZGV2LT5hZHZfd29yayk7CisJCXF1ZXVlX2RlbGF5ZWRfd29yayhoZGV2LT53b3JrcXVldWUsICZoZGV2LT5hZHZfd29yaywKKwkJCQkJCSBqaWZmaWVzICsgQURWX0NMRUFSX1RJTUVPVVQpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJUX0VSUigiVXNlZCByZXNlcnZlZCBMRV9TY2FuX0VuYWJsZSBwYXJhbSAlZCIsIGNwLT5lbmFibGUpOworCQlicmVhazsKIAl9CiB9CiAKQEAgLTk1NSwxMiArMTEwNCwxOCBAQAogCWlmIChzdGF0dXMpIHsKIAkJaGNpX3JlcV9jb21wbGV0ZShoZGV2LCBIQ0lfT1BfSU5RVUlSWSwgc3RhdHVzKTsKIAkJaGNpX2Nvbm5fY2hlY2tfcGVuZGluZyhoZGV2KTsKKwkJaGNpX2Rldl9sb2NrKGhkZXYpOworCQlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCisJCQltZ210X3N0YXJ0X2Rpc2NvdmVyeV9mYWlsZWQoaGRldiwgc3RhdHVzKTsKKwkJaGNpX2Rldl91bmxvY2soaGRldik7CiAJCXJldHVybjsKIAl9CiAKLQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0lOUVVJUlksICZoZGV2LT5mbGFncykgJiYKLQkJCQl0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKLQkJbWdtdF9kaXNjb3ZlcmluZyhoZGV2LT5pZCwgMSk7CisJc2V0X2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKwltZ210X2Rpc2NvdmVyaW5nKGhkZXYsIDEpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgaGNpX2NzX2NyZWF0ZV9jb25uKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBfX3U4IHN0YXR1cykKQEAgLTEzMzksMTMgKzE0OTQsMTYgQEAKIAogCUJUX0RCRygiJXMgc3RhdHVzICVkIiwgaGRldi0+bmFtZSwgc3RhdHVzKTsKIAotCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0lOUVVJUlksICZoZGV2LT5mbGFncykgJiYKLQkJCQl0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKLQkJbWdtdF9kaXNjb3ZlcmluZyhoZGV2LT5pZCwgMCk7Ci0KIAloY2lfcmVxX2NvbXBsZXRlKGhkZXYsIEhDSV9PUF9JTlFVSVJZLCBzdGF0dXMpOwogCiAJaGNpX2Nvbm5fY2hlY2tfcGVuZGluZyhoZGV2KTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpKQorCQlyZXR1cm47CisKKwloY2lfZGV2X2xvY2soaGRldik7CisJbWdtdF9kaXNjb3ZlcmluZyhoZGV2LCAwKTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGhjaV9pbnF1aXJ5X3Jlc3VsdF9ldnQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xMzYxLDEyICsxNTE5LDYgQEAKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKSkgewotCi0JCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKLQkJCW1nbXRfZGlzY292ZXJpbmcoaGRldi0+aWQsIDEpOwotCX0KLQogCWZvciAoOyBudW1fcnNwOyBudW1fcnNwLS0sIGluZm8rKykgewogCQliYWNweSgmZGF0YS5iZGFkZHIsICZpbmZvLT5iZGFkZHIpOwogCQlkYXRhLnBzY2FuX3JlcF9tb2RlCT0gaW5mby0+cHNjYW5fcmVwX21vZGU7CkBAIC0xMzc3LDggKzE1MjksOCBAQAogCQlkYXRhLnJzc2kJCT0gMHgwMDsKIAkJZGF0YS5zc3BfbW9kZQkJPSAweDAwOwogCQloY2lfaW5xdWlyeV9jYWNoZV91cGRhdGUoaGRldiwgJmRhdGEpOwotCQltZ210X2RldmljZV9mb3VuZChoZGV2LT5pZCwgJmluZm8tPmJkYWRkciwgaW5mby0+ZGV2X2NsYXNzLCAwLAotCQkJCQkJCQkJTlVMTCk7CisJCW1nbXRfZGV2aWNlX2ZvdW5kKGhkZXYsICZpbmZvLT5iZGFkZHIsIEFDTF9MSU5LLCAweDAwLAorCQkJCQkJaW5mby0+ZGV2X2NsYXNzLCAwLCBOVUxMKTsKIAl9CiAKIAloY2lfZGV2X3VubG9jayhoZGV2KTsKQEAgLTE0MTIsNyArMTU2NCw4IEBACiAJCQljb25uLT5zdGF0ZSA9IEJUX0NPTkZJRzsKIAkJCWhjaV9jb25uX2hvbGQoY29ubik7CiAJCQljb25uLT5kaXNjX3RpbWVvdXQgPSBIQ0lfRElTQ09OTl9USU1FT1VUOwotCQkJbWdtdF9jb25uZWN0ZWQoaGRldi0+aWQsICZldi0+YmRhZGRyLCBjb25uLT50eXBlKTsKKwkJCW1nbXRfY29ubmVjdGVkKGhkZXYsICZldi0+YmRhZGRyLCBjb25uLT50eXBlLAorCQkJCQkJCWNvbm4tPmRzdF90eXBlKTsKIAkJfSBlbHNlCiAJCQljb25uLT5zdGF0ZSA9IEJUX0NPTk5FQ1RFRDsKIApAQCAtMTQzNCw3ICsxNTg3LDcgQEAKIAkJfQogCiAJCS8qIFNldCBwYWNrZXQgdHlwZSBmb3IgaW5jb21pbmcgY29ubmVjdGlvbiAqLwotCQlpZiAoIWNvbm4tPm91dCAmJiBoZGV2LT5oY2lfdmVyIDwgMykgeworCQlpZiAoIWNvbm4tPm91dCAmJiBoZGV2LT5oY2lfdmVyIDwgQkxVRVRPT1RIX1ZFUl8yXzApIHsKIAkJCXN0cnVjdCBoY2lfY3BfY2hhbmdlX2Nvbm5fcHR5cGUgY3A7CiAJCQljcC5oYW5kbGUgPSBldi0+aGFuZGxlOwogCQkJY3AucGt0X3R5cGUgPSBjcHVfdG9fbGUxNihjb25uLT5wa3RfdHlwZSk7CkBAIC0xNDQ0LDcgKzE1OTcsOCBAQAogCX0gZWxzZSB7CiAJCWNvbm4tPnN0YXRlID0gQlRfQ0xPU0VEOwogCQlpZiAoY29ubi0+dHlwZSA9PSBBQ0xfTElOSykKLQkJCW1nbXRfY29ubmVjdF9mYWlsZWQoaGRldi0+aWQsICZldi0+YmRhZGRyLCBldi0+c3RhdHVzKTsKKwkJCW1nbXRfY29ubmVjdF9mYWlsZWQoaGRldiwgJmV2LT5iZGFkZHIsIGNvbm4tPnR5cGUsCisJCQkJCQljb25uLT5kc3RfdHlwZSwgZXYtPnN0YXR1cyk7CiAJfQogCiAJaWYgKGNvbm4tPnR5cGUgPT0gQUNMX0xJTkspCkBAIC0xNTMxLDcgKzE2ODUsNyBAQAogCQlzdHJ1Y3QgaGNpX2NwX3JlamVjdF9jb25uX3JlcSBjcDsKIAogCQliYWNweSgmY3AuYmRhZGRyLCAmZXYtPmJkYWRkcik7Ci0JCWNwLnJlYXNvbiA9IDB4MGY7CisJCWNwLnJlYXNvbiA9IEhDSV9FUlJPUl9SRUpfQkFEX0FERFI7CiAJCWhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfUkVKRUNUX0NPTk5fUkVRLCBzaXplb2YoY3ApLCAmY3ApOwogCX0KIH0KQEAgLTE1NDMsMjQgKzE2OTcsMjcgQEAKIAogCUJUX0RCRygiJXMgc3RhdHVzICVkIiwgaGRldi0+bmFtZSwgZXYtPnN0YXR1cyk7CiAKLQlpZiAoZXYtPnN0YXR1cykgewotCQltZ210X2Rpc2Nvbm5lY3RfZmFpbGVkKGhkZXYtPmlkKTsKLQkJcmV0dXJuOwotCX0KLQogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9oYW5kbGUoaGRldiwgX19sZTE2X3RvX2NwdShldi0+aGFuZGxlKSk7CiAJaWYgKCFjb25uKQogCQlnb3RvIHVubG9jazsKIAotCWNvbm4tPnN0YXRlID0gQlRfQ0xPU0VEOworCWlmIChldi0+c3RhdHVzID09IDApCisJCWNvbm4tPnN0YXRlID0gQlRfQ0xPU0VEOwogCi0JaWYgKGNvbm4tPnR5cGUgPT0gQUNMX0xJTksgfHwgY29ubi0+dHlwZSA9PSBMRV9MSU5LKQotCQltZ210X2Rpc2Nvbm5lY3RlZChoZGV2LT5pZCwgJmNvbm4tPmRzdCk7CisJaWYgKGNvbm4tPnR5cGUgPT0gQUNMX0xJTksgfHwgY29ubi0+dHlwZSA9PSBMRV9MSU5LKSB7CisJCWlmIChldi0+c3RhdHVzICE9IDApCisJCQltZ210X2Rpc2Nvbm5lY3RfZmFpbGVkKGhkZXYsICZjb25uLT5kc3QsIGV2LT5zdGF0dXMpOworCQllbHNlCisJCQltZ210X2Rpc2Nvbm5lY3RlZChoZGV2LCAmY29ubi0+ZHN0LCBjb25uLT50eXBlLAorCQkJCQkJCWNvbm4tPmRzdF90eXBlKTsKKwl9CiAKLQloY2lfcHJvdG9fZGlzY29ubl9jZm0oY29ubiwgZXYtPnJlYXNvbik7Ci0JaGNpX2Nvbm5fZGVsKGNvbm4pOworCWlmIChldi0+c3RhdHVzID09IDApIHsKKwkJaGNpX3Byb3RvX2Rpc2Nvbm5fY2ZtKGNvbm4sIGV2LT5yZWFzb24pOworCQloY2lfY29ubl9kZWwoY29ubik7CisJfQogCiB1bmxvY2s6CiAJaGNpX2Rldl91bmxvY2soaGRldik7CkBAIC0xNTg4LDcgKzE3NDUsNyBAQAogCQkJY29ubi0+c2VjX2xldmVsID0gY29ubi0+cGVuZGluZ19zZWNfbGV2ZWw7CiAJCX0KIAl9IGVsc2UgewotCQltZ210X2F1dGhfZmFpbGVkKGhkZXYtPmlkLCAmY29ubi0+ZHN0LCBldi0+c3RhdHVzKTsKKwkJbWdtdF9hdXRoX2ZhaWxlZChoZGV2LCAmY29ubi0+ZHN0LCBldi0+c3RhdHVzKTsKIAl9CiAKIAljbGVhcl9iaXQoSENJX0NPTk5fQVVUSF9QRU5ELCAmY29ubi0+cGVuZCk7CkBAIC0xNjQzLDcgKzE4MDAsNyBAQAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWlmIChldi0+c3RhdHVzID09IDAgJiYgdGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCi0JCW1nbXRfcmVtb3RlX25hbWUoaGRldi0+aWQsICZldi0+YmRhZGRyLCBldi0+bmFtZSk7CisJCW1nbXRfcmVtb3RlX25hbWUoaGRldiwgJmV2LT5iZGFkZHIsIGV2LT5uYW1lKTsKIAogCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBBQ0xfTElOSywgJmV2LT5iZGFkZHIpOwogCWlmICghY29ubikKQEAgLTE4OTQsMTAgKzIwNTEsMjIgQEAKIAkJaGNpX2NjX3JlYWRfYmRfYWRkcihoZGV2LCBza2IpOwogCQlicmVhazsKIAorCWNhc2UgSENJX09QX1JFQURfREFUQV9CTE9DS19TSVpFOgorCQloY2lfY2NfcmVhZF9kYXRhX2Jsb2NrX3NpemUoaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKIAljYXNlIEhDSV9PUF9XUklURV9DQV9USU1FT1VUOgogCQloY2lfY2Nfd3JpdGVfY2FfdGltZW91dChoZGV2LCBza2IpOwogCQlicmVhazsKIAorCWNhc2UgSENJX09QX1JFQURfRkxPV19DT05UUk9MX01PREU6CisJCWhjaV9jY19yZWFkX2Zsb3dfY29udHJvbF9tb2RlKGhkZXYsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBIQ0lfT1BfUkVBRF9MT0NBTF9BTVBfSU5GTzoKKwkJaGNpX2NjX3JlYWRfbG9jYWxfYW1wX2luZm8oaGRldiwgc2tiKTsKKwkJYnJlYWs7CisKIAljYXNlIEhDSV9PUF9ERUxFVEVfU1RPUkVEX0xJTktfS0VZOgogCQloY2lfY2NfZGVsZXRlX3N0b3JlZF9saW5rX2tleShoZGV2LCBza2IpOwogCQlicmVhazsKQEAgLTE5NDIsNiArMjExMSwxNyBAQAogCQloY2lfY2NfdXNlcl9jb25maXJtX25lZ19yZXBseShoZGV2LCBza2IpOwogCQlicmVhazsKIAorCWNhc2UgSENJX09QX1VTRVJfUEFTU0tFWV9SRVBMWToKKwkJaGNpX2NjX3VzZXJfcGFzc2tleV9yZXBseShoZGV2LCBza2IpOworCQlicmVhazsKKworCWNhc2UgSENJX09QX1VTRVJfUEFTU0tFWV9ORUdfUkVQTFk6CisJCWhjaV9jY191c2VyX3Bhc3NrZXlfbmVnX3JlcGx5KGhkZXYsIHNrYik7CisKKwljYXNlIEhDSV9PUF9MRV9TRVRfU0NBTl9QQVJBTToKKwkJaGNpX2NjX2xlX3NldF9zY2FuX3BhcmFtKGhkZXYsIHNrYik7CisJCWJyZWFrOworCiAJY2FzZSBIQ0lfT1BfTEVfU0VUX1NDQU5fRU5BQkxFOgogCQloY2lfY2NfbGVfc2V0X3NjYW5fZW5hYmxlKGhkZXYsIHNrYik7CiAJCWJyZWFrOwpAQCAtMTk2OSw3ICsyMTQ5LDcgQEAKIAlpZiAoZXYtPm5jbWQpIHsKIAkJYXRvbWljX3NldCgmaGRldi0+Y21kX2NudCwgMSk7CiAJCWlmICghc2tiX3F1ZXVlX2VtcHR5KCZoZGV2LT5jbWRfcSkpCi0JCQl0YXNrbGV0X3NjaGVkdWxlKCZoZGV2LT5jbWRfdGFzayk7CisJCQlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPmNtZF93b3JrKTsKIAl9CiB9CiAKQEAgLTIwMjksNyArMjIwOSw3IEBACiAKIAljYXNlIEhDSV9PUF9ESVNDT05ORUNUOgogCQlpZiAoZXYtPnN0YXR1cyAhPSAwKQotCQkJbWdtdF9kaXNjb25uZWN0X2ZhaWxlZChoZGV2LT5pZCk7CisJCQltZ210X2Rpc2Nvbm5lY3RfZmFpbGVkKGhkZXYsIE5VTEwsIGV2LT5zdGF0dXMpOwogCQlicmVhazsKIAogCWNhc2UgSENJX09QX0xFX0NSRUFURV9DT05OOgpAQCAtMjA1MSw3ICsyMjMxLDcgQEAKIAlpZiAoZXYtPm5jbWQgJiYgIXRlc3RfYml0KEhDSV9SRVNFVCwgJmhkZXYtPmZsYWdzKSkgewogCQlhdG9taWNfc2V0KCZoZGV2LT5jbWRfY250LCAxKTsKIAkJaWYgKCFza2JfcXVldWVfZW1wdHkoJmhkZXYtPmNtZF9xKSkKLQkJCXRhc2tsZXRfc2NoZWR1bGUoJmhkZXYtPmNtZF90YXNrKTsKKwkJCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+Y21kX3dvcmspOwogCX0KIH0KIApAQCAtMjA4NCw1NiArMjI2NCw2OCBAQAogc3RhdGljIGlubGluZSB2b2lkIGhjaV9udW1fY29tcF9wa3RzX2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgaGNpX2V2X251bV9jb21wX3BrdHMgKmV2ID0gKHZvaWQgKikgc2tiLT5kYXRhOwotCV9fbGUxNiAqcHRyOwogCWludCBpOwogCiAJc2tiX3B1bGwoc2tiLCBzaXplb2YoKmV2KSk7CiAKIAlCVF9EQkcoIiVzIG51bV9obmRsICVkIiwgaGRldi0+bmFtZSwgZXYtPm51bV9obmRsKTsKIAorCWlmIChoZGV2LT5mbG93X2N0bF9tb2RlICE9IEhDSV9GTE9XX0NUTF9NT0RFX1BBQ0tFVF9CQVNFRCkgeworCQlCVF9FUlIoIldyb25nIGV2ZW50IGZvciBtb2RlICVkIiwgaGRldi0+Zmxvd19jdGxfbW9kZSk7CisJCXJldHVybjsKKwl9CisKIAlpZiAoc2tiLT5sZW4gPCBldi0+bnVtX2huZGwgKiA0KSB7CiAJCUJUX0RCRygiJXMgYmFkIHBhcmFtZXRlcnMiLCBoZGV2LT5uYW1lKTsKIAkJcmV0dXJuOwogCX0KIAotCXRhc2tsZXRfZGlzYWJsZSgmaGRldi0+dHhfdGFzayk7Ci0KLQlmb3IgKGkgPSAwLCBwdHIgPSAoX19sZTE2ICopIHNrYi0+ZGF0YTsgaSA8IGV2LT5udW1faG5kbDsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IGV2LT5udW1faG5kbDsgaSsrKSB7CisJCXN0cnVjdCBoY2lfY29tcF9wa3RzX2luZm8gKmluZm8gPSAmZXYtPmhhbmRsZXNbaV07CiAJCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKIAkJX191MTYgIGhhbmRsZSwgY291bnQ7CiAKLQkJaGFuZGxlID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHB0cisrKTsKLQkJY291bnQgID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHB0cisrKTsKKwkJaGFuZGxlID0gX19sZTE2X3RvX2NwdShpbmZvLT5oYW5kbGUpOworCQljb3VudCAgPSBfX2xlMTZfdG9fY3B1KGluZm8tPmNvdW50KTsKIAogCQljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfaGFuZGxlKGhkZXYsIGhhbmRsZSk7Ci0JCWlmIChjb25uKSB7Ci0JCQljb25uLT5zZW50IC09IGNvdW50OworCQlpZiAoIWNvbm4pCisJCQljb250aW51ZTsKIAotCQkJaWYgKGNvbm4tPnR5cGUgPT0gQUNMX0xJTkspIHsKKwkJY29ubi0+c2VudCAtPSBjb3VudDsKKworCQlzd2l0Y2ggKGNvbm4tPnR5cGUpIHsKKwkJY2FzZSBBQ0xfTElOSzoKKwkJCWhkZXYtPmFjbF9jbnQgKz0gY291bnQ7CisJCQlpZiAoaGRldi0+YWNsX2NudCA+IGhkZXYtPmFjbF9wa3RzKQorCQkJCWhkZXYtPmFjbF9jbnQgPSBoZGV2LT5hY2xfcGt0czsKKwkJCWJyZWFrOworCisJCWNhc2UgTEVfTElOSzoKKwkJCWlmIChoZGV2LT5sZV9wa3RzKSB7CisJCQkJaGRldi0+bGVfY250ICs9IGNvdW50OworCQkJCWlmIChoZGV2LT5sZV9jbnQgPiBoZGV2LT5sZV9wa3RzKQorCQkJCQloZGV2LT5sZV9jbnQgPSBoZGV2LT5sZV9wa3RzOworCQkJfSBlbHNlIHsKIAkJCQloZGV2LT5hY2xfY250ICs9IGNvdW50OwogCQkJCWlmIChoZGV2LT5hY2xfY250ID4gaGRldi0+YWNsX3BrdHMpCiAJCQkJCWhkZXYtPmFjbF9jbnQgPSBoZGV2LT5hY2xfcGt0czsKLQkJCX0gZWxzZSBpZiAoY29ubi0+dHlwZSA9PSBMRV9MSU5LKSB7Ci0JCQkJaWYgKGhkZXYtPmxlX3BrdHMpIHsKLQkJCQkJaGRldi0+bGVfY250ICs9IGNvdW50OwotCQkJCQlpZiAoaGRldi0+bGVfY250ID4gaGRldi0+bGVfcGt0cykKLQkJCQkJCWhkZXYtPmxlX2NudCA9IGhkZXYtPmxlX3BrdHM7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaGRldi0+YWNsX2NudCArPSBjb3VudDsKLQkJCQkJaWYgKGhkZXYtPmFjbF9jbnQgPiBoZGV2LT5hY2xfcGt0cykKLQkJCQkJCWhkZXYtPmFjbF9jbnQgPSBoZGV2LT5hY2xfcGt0czsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWhkZXYtPnNjb19jbnQgKz0gY291bnQ7Ci0JCQkJaWYgKGhkZXYtPnNjb19jbnQgPiBoZGV2LT5zY29fcGt0cykKLQkJCQkJaGRldi0+c2NvX2NudCA9IGhkZXYtPnNjb19wa3RzOwogCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTQ09fTElOSzoKKwkJCWhkZXYtPnNjb19jbnQgKz0gY291bnQ7CisJCQlpZiAoaGRldi0+c2NvX2NudCA+IGhkZXYtPnNjb19wa3RzKQorCQkJCWhkZXYtPnNjb19jbnQgPSBoZGV2LT5zY29fcGt0czsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlCVF9FUlIoIlVua25vd24gdHlwZSAlZCBjb25uICVwIiwgY29ubi0+dHlwZSwgY29ubik7CisJCQlicmVhazsKIAkJfQogCX0KIAotCXRhc2tsZXRfc2NoZWR1bGUoJmhkZXYtPnR4X3Rhc2spOwotCi0JdGFza2xldF9lbmFibGUoJmhkZXYtPnR4X3Rhc2spOworCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+dHhfd29yayk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfbW9kZV9jaGFuZ2VfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMjE5NCw3ICsyMzg2LDcgQEAKIAkJZWxzZQogCQkJc2VjdXJlID0gMDsKIAotCQltZ210X3Bpbl9jb2RlX3JlcXVlc3QoaGRldi0+aWQsICZldi0+YmRhZGRyLCBzZWN1cmUpOworCQltZ210X3Bpbl9jb2RlX3JlcXVlc3QoaGRldiwgJmV2LT5iZGFkZHIsIHNlY3VyZSk7CiAJfQogCiB1bmxvY2s6CkBAIC0yMzYzLDEyICsyNTU1LDYgQEAKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWlmICghdGVzdF9hbmRfc2V0X2JpdChIQ0lfSU5RVUlSWSwgJmhkZXYtPmZsYWdzKSkgewotCi0JCWlmICh0ZXN0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKSkKLQkJCW1nbXRfZGlzY292ZXJpbmcoaGRldi0+aWQsIDEpOwotCX0KLQogCWlmICgoc2tiLT5sZW4gLSAxKSAvIG51bV9yc3AgIT0gc2l6ZW9mKHN0cnVjdCBpbnF1aXJ5X2luZm9fd2l0aF9yc3NpKSkgewogCQlzdHJ1Y3QgaW5xdWlyeV9pbmZvX3dpdGhfcnNzaV9hbmRfcHNjYW5fbW9kZSAqaW5mbzsKIAkJaW5mbyA9ICh2b2lkICopIChza2ItPmRhdGEgKyAxKTsKQEAgLTIzODMsNyArMjU2OSw3IEBACiAJCQlkYXRhLnJzc2kJCT0gaW5mby0+cnNzaTsKIAkJCWRhdGEuc3NwX21vZGUJCT0gMHgwMDsKIAkJCWhjaV9pbnF1aXJ5X2NhY2hlX3VwZGF0ZShoZGV2LCAmZGF0YSk7Ci0JCQltZ210X2RldmljZV9mb3VuZChoZGV2LT5pZCwgJmluZm8tPmJkYWRkciwKKwkJCW1nbXRfZGV2aWNlX2ZvdW5kKGhkZXYsICZpbmZvLT5iZGFkZHIsIEFDTF9MSU5LLCAweDAwLAogCQkJCQkJaW5mby0+ZGV2X2NsYXNzLCBpbmZvLT5yc3NpLAogCQkJCQkJTlVMTCk7CiAJCX0KQEAgLTI0MDAsNyArMjU4Niw3IEBACiAJCQlkYXRhLnJzc2kJCT0gaW5mby0+cnNzaTsKIAkJCWRhdGEuc3NwX21vZGUJCT0gMHgwMDsKIAkJCWhjaV9pbnF1aXJ5X2NhY2hlX3VwZGF0ZShoZGV2LCAmZGF0YSk7Ci0JCQltZ210X2RldmljZV9mb3VuZChoZGV2LT5pZCwgJmluZm8tPmJkYWRkciwKKwkJCW1nbXRfZGV2aWNlX2ZvdW5kKGhkZXYsICZpbmZvLT5iZGFkZHIsIEFDTF9MSU5LLCAweDAwLAogCQkJCQkJaW5mby0+ZGV2X2NsYXNzLCBpbmZvLT5yc3NpLAogCQkJCQkJTlVMTCk7CiAJCX0KQEAgLTI1MzEsMTIgKzI3MTcsNiBAQAogCWlmICghbnVtX3JzcCkKIAkJcmV0dXJuOwogCi0JaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhDSV9JTlFVSVJZLCAmaGRldi0+ZmxhZ3MpKSB7Ci0KLQkJaWYgKHRlc3RfYml0KEhDSV9NR01ULCAmaGRldi0+ZmxhZ3MpKQotCQkJbWdtdF9kaXNjb3ZlcmluZyhoZGV2LT5pZCwgMSk7Ci0JfQotCiAJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJZm9yICg7IG51bV9yc3A7IG51bV9yc3AtLSwgaW5mbysrKSB7CkBAIC0yNTQ5LDggKzI3MjksOCBAQAogCQlkYXRhLnJzc2kJCT0gaW5mby0+cnNzaTsKIAkJZGF0YS5zc3BfbW9kZQkJPSAweDAxOwogCQloY2lfaW5xdWlyeV9jYWNoZV91cGRhdGUoaGRldiwgJmRhdGEpOwotCQltZ210X2RldmljZV9mb3VuZChoZGV2LT5pZCwgJmluZm8tPmJkYWRkciwgaW5mby0+ZGV2X2NsYXNzLAotCQkJCQkJaW5mby0+cnNzaSwgaW5mby0+ZGF0YSk7CisJCW1nbXRfZGV2aWNlX2ZvdW5kKGhkZXYsICZpbmZvLT5iZGFkZHIsIEFDTF9MSU5LLCAweDAwLAorCQkJCWluZm8tPmRldl9jbGFzcywgaW5mby0+cnNzaSwgaW5mby0+ZGF0YSk7CiAJfQogCiAJaGNpX2Rldl91bmxvY2soaGRldik7CkBAIC0yNjE0LDcgKzI3OTQsNyBAQAogCQlzdHJ1Y3QgaGNpX2NwX2lvX2NhcGFiaWxpdHlfbmVnX3JlcGx5IGNwOwogCiAJCWJhY3B5KCZjcC5iZGFkZHIsICZldi0+YmRhZGRyKTsKLQkJY3AucmVhc29uID0gMHgxODsgLyogUGFpcmluZyBub3QgYWxsb3dlZCAqLworCQljcC5yZWFzb24gPSBIQ0lfRVJST1JfUEFJUklOR19OT1RfQUxMT1dFRDsKIAogCQloY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX0lPX0NBUEFCSUxJVFlfTkVHX1JFUExZLAogCQkJCQkJCXNpemVvZihjcCksICZjcCk7CkBAIC0yNzA2LDEzICsyODg2LDI4IEBACiAJfQogCiBjb25maXJtOgotCW1nbXRfdXNlcl9jb25maXJtX3JlcXVlc3QoaGRldi0+aWQsICZldi0+YmRhZGRyLCBldi0+cGFzc2tleSwKKwltZ210X3VzZXJfY29uZmlybV9yZXF1ZXN0KGhkZXYsICZldi0+YmRhZGRyLCBldi0+cGFzc2tleSwKIAkJCQkJCQkJY29uZmlybV9oaW50KTsKIAogdW5sb2NrOgogCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgaGNpX3VzZXJfcGFzc2tleV9yZXF1ZXN0X2V2dChzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBoY2lfZXZfdXNlcl9wYXNza2V5X3JlcSAqZXYgPSAodm9pZCAqKSBza2ItPmRhdGE7CisKKwlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CisKKwloY2lfZGV2X2xvY2soaGRldik7CisKKwlpZiAodGVzdF9iaXQoSENJX01HTVQsICZoZGV2LT5mbGFncykpCisJCW1nbXRfdXNlcl9wYXNza2V5X3JlcXVlc3QoaGRldiwgJmV2LT5iZGFkZHIpOworCisJaGNpX2Rldl91bmxvY2soaGRldik7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBoY2lfc2ltcGxlX3BhaXJfY29tcGxldGVfZXZ0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBoY2lfZXZfc2ltcGxlX3BhaXJfY29tcGxldGUgKmV2ID0gKHZvaWQgKikgc2tiLT5kYXRhOwpAQCAtMjczMiw3ICsyOTI3LDcgQEAKIAkgKiBldmVudCBnZXRzIGFsd2F5cyBwcm9kdWNlZCBhcyBpbml0aWF0b3IgYW5kIGlzIGFsc28gbWFwcGVkIHRvCiAJICogdGhlIG1nbXRfYXV0aF9mYWlsZWQgZXZlbnQgKi8KIAlpZiAoIXRlc3RfYml0KEhDSV9DT05OX0FVVEhfUEVORCwgJmNvbm4tPnBlbmQpICYmIGV2LT5zdGF0dXMgIT0gMCkKLQkJbWdtdF9hdXRoX2ZhaWxlZChoZGV2LT5pZCwgJmNvbm4tPmRzdCwgZXYtPnN0YXR1cyk7CisJCW1nbXRfYXV0aF9mYWlsZWQoaGRldiwgJmNvbm4tPmRzdCwgZXYtPnN0YXR1cyk7CiAKIAloY2lfY29ubl9wdXQoY29ubik7CiAKQEAgLTI4MTMsMTQgKzMwMDgsMTUgQEAKIAl9CiAKIAlpZiAoZXYtPnN0YXR1cykgewotCQltZ210X2Nvbm5lY3RfZmFpbGVkKGhkZXYtPmlkLCAmZXYtPmJkYWRkciwgZXYtPnN0YXR1cyk7CisJCW1nbXRfY29ubmVjdF9mYWlsZWQoaGRldiwgJmV2LT5iZGFkZHIsIGNvbm4tPnR5cGUsCisJCQkJCQljb25uLT5kc3RfdHlwZSwgZXYtPnN0YXR1cyk7CiAJCWhjaV9wcm90b19jb25uZWN0X2NmbShjb25uLCBldi0+c3RhdHVzKTsKIAkJY29ubi0+c3RhdGUgPSBCVF9DTE9TRUQ7CiAJCWhjaV9jb25uX2RlbChjb25uKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JbWdtdF9jb25uZWN0ZWQoaGRldi0+aWQsICZldi0+YmRhZGRyLCBjb25uLT50eXBlKTsKKwltZ210X2Nvbm5lY3RlZChoZGV2LCAmZXYtPmJkYWRkciwgY29ubi0+dHlwZSwgY29ubi0+ZHN0X3R5cGUpOwogCiAJY29ubi0+c2VjX2xldmVsID0gQlRfU0VDVVJJVFlfTE9XOwogCWNvbm4tPmhhbmRsZSA9IF9fbGUxNl90b19jcHUoZXYtPmhhbmRsZSk7CkBAIC0zMDUxLDYgKzMyNDcsMTAgQEAKIAkJaGNpX3VzZXJfY29uZmlybV9yZXF1ZXN0X2V2dChoZGV2LCBza2IpOwogCQlicmVhazsKIAorCWNhc2UgSENJX0VWX1VTRVJfUEFTU0tFWV9SRVFVRVNUOgorCQloY2lfdXNlcl9wYXNza2V5X3JlcXVlc3RfZXZ0KGhkZXYsIHNrYik7CisJCWJyZWFrOworCiAJY2FzZSBIQ0lfRVZfU0lNUExFX1BBSVJfQ09NUExFVEU6CiAJCWhjaV9zaW1wbGVfcGFpcl9jb21wbGV0ZV9ldnQoaGRldiwgc2tiKTsKIAkJYnJlYWs7CkBAIC0zMTA0LDUgKzMzMDQsNSBAQAogCWtmcmVlX3NrYihza2IpOwogfQogCi1tb2R1bGVfcGFyYW0oZW5hYmxlX2xlLCBib29sLCAwNDQ0KTsKK21vZHVsZV9wYXJhbShlbmFibGVfbGUsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhlbmFibGVfbGUsICJFbmFibGUgTEUgc3VwcG9ydCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc29jay5jIGIvbmV0L2JsdWV0b290aC9oY2lfc29jay5jCmluZGV4IGY2YWZlM2QuLjZkOTQ2MTYgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGNpX3NvY2suYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zb2NrLmMKQEAgLTQ5LDcgKzQ5LDcgQEAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2JsdWV0b290aC5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvaGNpX2NvcmUuaD4KIAotc3RhdGljIGludCBlbmFibGVfbWdtdDsKK3N0YXRpYyBib29sIGVuYWJsZV9tZ210OwogCiAvKiAtLS0tLSBIQ0kgc29ja2V0IGludGVyZmFjZSAtLS0tLSAqLwogCkBAIC0xODgsMTEgKzE4OCwxMSBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmYmRhZGRyLCBhcmcsIHNpemVvZihiZGFkZHIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJZXJyID0gaGNpX2JsYWNrbGlzdF9hZGQoaGRldiwgJmJkYWRkcik7CiAKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0yMDUsMTEgKzIwNSwxMSBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmYmRhZGRyLCBhcmcsIHNpemVvZihiZGFkZHIpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJZXJyID0gaGNpX2JsYWNrbGlzdF9kZWwoaGRldiwgJmJkYWRkcik7CiAKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0zNDMsOCArMzQzLDExIEBACiAJaWYgKGhhZGRyLmhjaV9jaGFubmVsID4gSENJX0NIQU5ORUxfQ09OVFJPTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoaGFkZHIuaGNpX2NoYW5uZWwgPT0gSENJX0NIQU5ORUxfQ09OVFJPTCAmJiAhZW5hYmxlX21nbXQpCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChoYWRkci5oY2lfY2hhbm5lbCA9PSBIQ0lfQ0hBTk5FTF9DT05UUk9MKSB7CisJCWlmICghZW5hYmxlX21nbXQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc2V0X2JpdChIQ0lfUElfTUdNVF9JTklULCAmaGNpX3BpKHNrKS0+ZmxhZ3MpOworCX0KIAogCWxvY2tfc29jayhzayk7CiAKQEAgLTUzNSwxMCArNTM4LDEwIEBACiAKIAkJaWYgKHRlc3RfYml0KEhDSV9SQVcsICZoZGV2LT5mbGFncykgfHwgKG9nZiA9PSAweDNmKSkgewogCQkJc2tiX3F1ZXVlX3RhaWwoJmhkZXYtPnJhd19xLCBza2IpOwotCQkJdGFza2xldF9zY2hlZHVsZSgmaGRldi0+dHhfdGFzayk7CisJCQlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPnR4X3dvcmspOwogCQl9IGVsc2UgewogCQkJc2tiX3F1ZXVlX3RhaWwoJmhkZXYtPmNtZF9xLCBza2IpOwotCQkJdGFza2xldF9zY2hlZHVsZSgmaGRldi0+Y21kX3Rhc2spOworCQkJcXVldWVfd29yayhoZGV2LT53b3JrcXVldWUsICZoZGV2LT5jbWRfd29yayk7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoIWNhcGFibGUoQ0FQX05FVF9SQVcpKSB7CkBAIC01NDcsNyArNTUwLDcgQEAKIAkJfQogCiAJCXNrYl9xdWV1ZV90YWlsKCZoZGV2LT5yYXdfcSwgc2tiKTsKLQkJdGFza2xldF9zY2hlZHVsZSgmaGRldi0+dHhfdGFzayk7CisJCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+dHhfd29yayk7CiAJfQogCiAJZXJyID0gbGVuOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYyBiL25ldC9ibHVldG9vdGgvaGNpX3N5c2ZzLmMKaW5kZXggNjYxYjQ2MS4uNTIxMDk1NiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oY2lfc3lzZnMuYworKysgYi9uZXQvYmx1ZXRvb3RoL2hjaV9zeXNmcy5jCkBAIC04OSwxMSArODksMzUgQEAKIAkucmVsZWFzZSA9IGJ0X2xpbmtfcmVsZWFzZSwKIH07CiAKLXN0YXRpYyB2b2lkIGFkZF9jb25uKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKKy8qCisgKiBUaGUgcmZjb21tIHR0eSBkZXZpY2Ugd2lsbCBwb3NzaWJseSByZXRhaW4gZXZlbiB3aGVuIGNvbm4KKyAqIGlzIGRvd24sIGFuZCBzeXNmcyBkb2Vzbid0IHN1cHBvcnQgbW92ZSB6b21iaWUgZGV2aWNlLAorICogc28gd2Ugc2hvdWxkIG1vdmUgdGhlIGRldmljZSBiZWZvcmUgY29ubiBkZXZpY2UgaXMgZGVzdHJveWVkLgorICovCitzdGF0aWMgaW50IF9fbWF0Y2hfdHR5KHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGhjaV9jb25uLCB3b3JrX2FkZCk7CisJcmV0dXJuICFzdHJuY21wKGRldl9uYW1lKGRldiksICJyZmNvbW0iLCA2KTsKK30KKwordm9pZCBoY2lfY29ubl9pbml0X3N5c2ZzKHN0cnVjdCBoY2lfY29ubiAqY29ubikKK3sKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7CiAKKwlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKKworCWNvbm4tPmRldi50eXBlID0gJmJ0X2xpbms7CisJY29ubi0+ZGV2LmNsYXNzID0gYnRfY2xhc3M7CisJY29ubi0+ZGV2LnBhcmVudCA9ICZoZGV2LT5kZXY7CisKKwlkZXZpY2VfaW5pdGlhbGl6ZSgmY29ubi0+ZGV2KTsKK30KKwordm9pZCBoY2lfY29ubl9hZGRfc3lzZnMoc3RydWN0IGhjaV9jb25uICpjb25uKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKKworCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOworCiAJZGV2X3NldF9uYW1lKCZjb25uLT5kZXYsICIlczolZCIsIGhkZXYtPm5hbWUsIGNvbm4tPmhhbmRsZSk7CiAKIAlkZXZfc2V0X2RydmRhdGEoJmNvbm4tPmRldiwgY29ubik7CkBAIC0xMDYsMTkgKzEzMCw4IEBACiAJaGNpX2Rldl9ob2xkKGhkZXYpOwogfQogCi0vKgotICogVGhlIHJmY29tbSB0dHkgZGV2aWNlIHdpbGwgcG9zc2libHkgcmV0YWluIGV2ZW4gd2hlbiBjb25uCi0gKiBpcyBkb3duLCBhbmQgc3lzZnMgZG9lc24ndCBzdXBwb3J0IG1vdmUgem9tYmllIGRldmljZSwKLSAqIHNvIHdlIHNob3VsZCBtb3ZlIHRoZSBkZXZpY2UgYmVmb3JlIGNvbm4gZGV2aWNlIGlzIGRlc3Ryb3llZC4KLSAqLwotc3RhdGljIGludCBfX21hdGNoX3R0eShzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCit2b2lkIGhjaV9jb25uX2RlbF9zeXNmcyhzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm4pCiB7Ci0JcmV0dXJuICFzdHJuY21wKGRldl9uYW1lKGRldiksICJyZmNvbW0iLCA2KTsKLX0KLQotc3RhdGljIHZvaWQgZGVsX2Nvbm4oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaGNpX2Nvbm4sIHdvcmtfZGVsKTsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7CiAKIAlpZiAoIWRldmljZV9pc19yZWdpc3RlcmVkKCZjb25uLT5kZXYpKQpAQCAtMTQwLDM2ICsxNTMsNiBAQAogCWhjaV9kZXZfcHV0KGhkZXYpOwogfQogCi12b2lkIGhjaV9jb25uX2luaXRfc3lzZnMoc3RydWN0IGhjaV9jb25uICpjb25uKQotewotCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGRldjsKLQotCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOwotCi0JY29ubi0+ZGV2LnR5cGUgPSAmYnRfbGluazsKLQljb25uLT5kZXYuY2xhc3MgPSBidF9jbGFzczsKLQljb25uLT5kZXYucGFyZW50ID0gJmhkZXYtPmRldjsKLQotCWRldmljZV9pbml0aWFsaXplKCZjb25uLT5kZXYpOwotCi0JSU5JVF9XT1JLKCZjb25uLT53b3JrX2FkZCwgYWRkX2Nvbm4pOwotCUlOSVRfV09SSygmY29ubi0+d29ya19kZWwsIGRlbF9jb25uKTsKLX0KLQotdm9pZCBoY2lfY29ubl9hZGRfc3lzZnMoc3RydWN0IGhjaV9jb25uICpjb25uKQotewotCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOwotCi0JcXVldWVfd29yayhjb25uLT5oZGV2LT53b3JrcXVldWUsICZjb25uLT53b3JrX2FkZCk7Ci19Ci0KLXZvaWQgaGNpX2Nvbm5fZGVsX3N5c2ZzKHN0cnVjdCBoY2lfY29ubiAqY29ubikKLXsKLQlCVF9EQkcoImNvbm4gJXAiLCBjb25uKTsKLQotCXF1ZXVlX3dvcmsoY29ubi0+aGRldi0+d29ya3F1ZXVlLCAmY29ubi0+d29ya19kZWwpOwotfQotCiBzdGF0aWMgaW5saW5lIGNoYXIgKmhvc3RfYnVzdG9zdHIoaW50IGJ1cykKIHsKIAlzd2l0Y2ggKGJ1cykgewpAQCAtNDAzLDcgKzM4Niw3IEBACiAJc3RydWN0IGlucXVpcnlfY2FjaGUgKmNhY2hlID0gJmhkZXYtPmlucV9jYWNoZTsKIAlzdHJ1Y3QgaW5xdWlyeV9lbnRyeSAqZTsKIAotCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwloY2lfZGV2X2xvY2soaGRldik7CiAKIAlmb3IgKGUgPSBjYWNoZS0+bGlzdDsgZTsgZSA9IGUtPm5leHQpIHsKIAkJc3RydWN0IGlucXVpcnlfZGF0YSAqZGF0YSA9ICZlLT5kYXRhOwpAQCAtNDE2LDcgKzM5OSw3IEBACiAJCQkgICBkYXRhLT5yc3NpLCBkYXRhLT5zc3BfbW9kZSwgZS0+dGltZXN0YW1wKTsKIAl9CiAKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtNDM2LDE5ICs0MTksMTQgQEAKIHN0YXRpYyBpbnQgYmxhY2tsaXN0X3Nob3coc3RydWN0IHNlcV9maWxlICpmLCB2b2lkICpwKQogewogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gZi0+cHJpdmF0ZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBiZGFkZHJfbGlzdCAqYjsKIAotCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwloY2lfZGV2X2xvY2soaGRldik7CiAKLQlsaXN0X2Zvcl9lYWNoKGwsICZoZGV2LT5ibGFja2xpc3QpIHsKLQkJc3RydWN0IGJkYWRkcl9saXN0ICpiOwotCi0JCWIgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBiZGFkZHJfbGlzdCwgbGlzdCk7Ci0KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGIsICZoZGV2LT5ibGFja2xpc3QsIGxpc3QpCiAJCXNlcV9wcmludGYoZiwgIiVzXG4iLCBiYXRvc3RyKCZiLT5iZGFkZHIpKTsKLQl9CiAKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAogCXJldHVybiAwOwogfQpAQCAtNDg1LDE5ICs0NjMsMTQgQEAKIHN0YXRpYyBpbnQgdXVpZHNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKnApCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBmLT5wcml2YXRlOwotCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IGJ0X3V1aWQgKnV1aWQ7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JbGlzdF9mb3JfZWFjaChsLCAmaGRldi0+dXVpZHMpIHsKLQkJc3RydWN0IGJ0X3V1aWQgKnV1aWQ7Ci0KLQkJdXVpZCA9IGxpc3RfZW50cnkobCwgc3RydWN0IGJ0X3V1aWQsIGxpc3QpOwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1dWlkLCAmaGRldi0+dXVpZHMsIGxpc3QpCiAJCXByaW50X2J0X3V1aWQoZiwgdXVpZC0+dXVpZCk7Ci0JfQogCi0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUxOCwxMSArNDkxLDExIEBACiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBkYXRhOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWhkZXYtPmF1dG9fYWNjZXB0X2RlbGF5ID0gdmFsOwogCi0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUzMSwxMSArNTA0LDExIEBACiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXYgPSBkYXRhOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCSp2YWwgPSBoZGV2LT5hdXRvX2FjY2VwdF9kZWxheTsKIAotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC01NDMsMjIgKzUxNiwyOCBAQAogREVGSU5FX1NJTVBMRV9BVFRSSUJVVEUoYXV0b19hY2NlcHRfZGVsYXlfZm9wcywgYXV0b19hY2NlcHRfZGVsYXlfZ2V0LAogCQkJCQlhdXRvX2FjY2VwdF9kZWxheV9zZXQsICIlbGx1XG4iKTsKIAotaW50IGhjaV9yZWdpc3Rlcl9zeXNmcyhzdHJ1Y3QgaGNpX2RldiAqaGRldikKK3ZvaWQgaGNpX2luaXRfc3lzZnMoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJmhkZXYtPmRldjsKKworCWRldi0+dHlwZSA9ICZidF9ob3N0OworCWRldi0+Y2xhc3MgPSBidF9jbGFzczsKKworCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGhkZXYpOworCWRldmljZV9pbml0aWFsaXplKGRldik7Cit9CisKK2ludCBoY2lfYWRkX3N5c2ZzKHN0cnVjdCBoY2lfZGV2ICpoZGV2KQogewogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZoZGV2LT5kZXY7CiAJaW50IGVycjsKIAogCUJUX0RCRygiJXAgbmFtZSAlcyBidXMgJWQiLCBoZGV2LCBoZGV2LT5uYW1lLCBoZGV2LT5idXMpOwogCi0JZGV2LT50eXBlID0gJmJ0X2hvc3Q7Ci0JZGV2LT5jbGFzcyA9IGJ0X2NsYXNzOwogCWRldi0+cGFyZW50ID0gaGRldi0+cGFyZW50OwotCiAJZGV2X3NldF9uYW1lKGRldiwgIiVzIiwgaGRldi0+bmFtZSk7CiAKLQlkZXZfc2V0X2RydmRhdGEoZGV2LCBoZGV2KTsKLQotCWVyciA9IGRldmljZV9yZWdpc3RlcihkZXYpOworCWVyciA9IGRldmljZV9hZGQoZGV2KTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIApAQCAtNTgyLDcgKzU2MSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgaGNpX3VucmVnaXN0ZXJfc3lzZnMoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit2b2lkIGhjaV9kZWxfc3lzZnMoc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7CiAJQlRfREJHKCIlcCBuYW1lICVzIGJ1cyAlZCIsIGhkZXYsIGhkZXYtPm5hbWUsIGhkZXYtPmJ1cyk7CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9LY29uZmlnIGIvbmV0L2JsdWV0b290aC9oaWRwL0tjb25maWcKaW5kZXggODZhOTE1NC4uNGRlYWNhNyAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9oaWRwL0tjb25maWcKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL0tjb25maWcKQEAgLTEsNiArMSw2IEBACiBjb25maWcgQlRfSElEUAogCXRyaXN0YXRlICJISURQIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCVCAmJiBCVF9MMkNBUCAmJiBJTlBVVCAmJiBISURfU1VQUE9SVAorCWRlcGVuZHMgb24gQlQgJiYgSU5QVVQgJiYgSElEX1NVUFBPUlQKIAlzZWxlY3QgSElECiAJaGVscAogCSAgSElEUCAoSHVtYW4gSW50ZXJmYWNlIERldmljZSBQcm90b2NvbCkgaXMgYSB0cmFuc3BvcnQgbGF5ZXIKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2hpZHAvY29yZS5jCmluZGV4IDA3NWEzZTkuLmQ0NzhiZTEgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvaGlkcC9jb3JlLmMKKysrIGIvbmV0L2JsdWV0b290aC9oaWRwL2NvcmUuYwpAQCAtODEsMjQgKzgxLDIwIEBACiBzdGF0aWMgc3RydWN0IGhpZHBfc2Vzc2lvbiAqX19oaWRwX2dldF9zZXNzaW9uKGJkYWRkcl90ICpiZGFkZHIpCiB7CiAJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbjsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCiAJQlRfREJHKCIiKTsKIAotCWxpc3RfZm9yX2VhY2gocCwgJmhpZHBfc2Vzc2lvbl9saXN0KSB7Ci0JCXNlc3Npb24gPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBoaWRwX3Nlc3Npb24sIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2Vzc2lvbiwgJmhpZHBfc2Vzc2lvbl9saXN0LCBsaXN0KSB7CiAJCWlmICghYmFjbXAoYmRhZGRyLCAmc2Vzc2lvbi0+YmRhZGRyKSkKIAkJCXJldHVybiBzZXNzaW9uOwogCX0KKwogCXJldHVybiBOVUxMOwogfQogCiBzdGF0aWMgdm9pZCBfX2hpZHBfbGlua19zZXNzaW9uKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCiB7Ci0JX19tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKTsKIAlsaXN0X2FkZCgmc2Vzc2lvbi0+bGlzdCwgJmhpZHBfc2Vzc2lvbl9saXN0KTsKLQotCWhjaV9jb25uX2hvbGRfZGV2aWNlKHNlc3Npb24tPmNvbm4pOwogfQogCiBzdGF0aWMgdm9pZCBfX2hpZHBfdW5saW5rX3Nlc3Npb24oc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKQEAgLTEwNiw3ICsxMDIsNiBAQAogCWhjaV9jb25uX3B1dF9kZXZpY2Uoc2Vzc2lvbi0+Y29ubik7CiAKIAlsaXN0X2RlbCgmc2Vzc2lvbi0+bGlzdCk7Ci0JbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CiB9CiAKIHN0YXRpYyB2b2lkIF9faGlkcF9jb3B5X3Nlc3Npb24oc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbiwgc3RydWN0IGhpZHBfY29ubmluZm8gKmNpKQpAQCAtMjU1LDYgKzI1MCw5IEBACiAKIAlCVF9EQkcoInNlc3Npb24gJXAgZGF0YSAlcCBzaXplICVkIiwgc2Vzc2lvbiwgZGF0YSwgc2l6ZSk7CiAKKwlpZiAoYXRvbWljX3JlYWQoJnNlc3Npb24tPnRlcm1pbmF0ZSkpCisJCXJldHVybiAtRUlPOworCiAJc2tiID0gYWxsb2Nfc2tiKHNpemUgKyAxLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikgewogCQlCVF9FUlIoIkNhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgbmV3IGZyYW1lIik7CkBAIC0zMjksNiArMzI3LDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCXNpemVfdCBsZW47CiAJaW50IG51bWJlcmVkX3JlcG9ydHMgPSBoaWQtPnJlcG9ydF9lbnVtW3JlcG9ydF90eXBlXS5udW1iZXJlZDsKKwlpbnQgcmV0OwogCiAJc3dpdGNoIChyZXBvcnRfdHlwZSkgewogCWNhc2UgSElEX0ZFQVRVUkVfUkVQT1JUOgpAQCAtMzUyLDggKzM1MSw5IEBACiAJc2Vzc2lvbi0+d2FpdGluZ19yZXBvcnRfbnVtYmVyID0gbnVtYmVyZWRfcmVwb3J0cyA/IHJlcG9ydF9udW1iZXIgOiAtMTsKIAlzZXRfYml0KEhJRFBfV0FJVElOR19GT1JfUkVUVVJOLCAmc2Vzc2lvbi0+ZmxhZ3MpOwogCWRhdGFbMF0gPSByZXBvcnRfbnVtYmVyOwotCWlmIChoaWRwX3NlbmRfY3RybF9tZXNzYWdlKGhpZC0+ZHJpdmVyX2RhdGEsIHJlcG9ydF90eXBlLCBkYXRhLCAxKSkKLQkJZ290byBlcnJfZWlvOworCXJldCA9IGhpZHBfc2VuZF9jdHJsX21lc3NhZ2UoaGlkLT5kcml2ZXJfZGF0YSwgcmVwb3J0X3R5cGUsIGRhdGEsIDEpOworCWlmIChyZXQpCisJCWdvdG8gZXJyOwogCiAJLyogV2FpdCBmb3IgdGhlIHJldHVybiBvZiB0aGUgcmVwb3J0LiBUaGUgcmV0dXJuZWQgcmVwb3J0CiAJICAgZ2V0cyBwdXQgaW4gc2Vzc2lvbi0+cmVwb3J0X3JldHVybi4gICovCkBAIC0zNjUsMTEgKzM2NSwxMyBAQAogCQkJNSpIWik7CiAJCWlmIChyZXMgPT0gMCkgewogCQkJLyogdGltZW91dCAqLwotCQkJZ290byBlcnJfZWlvOworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gZXJyOwogCQl9CiAJCWlmIChyZXMgPCAwKSB7CiAJCQkvKiBzaWduYWwgKi8KLQkJCWdvdG8gZXJyX3Jlc3RhcnRzeXM7CisJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQlnb3RvIGVycjsKIAkJfQogCX0KIApAQCAtMzkwLDE0ICszOTIsMTAgQEAKIAogCXJldHVybiBsZW47CiAKLWVycl9yZXN0YXJ0c3lzOgorZXJyOgogCWNsZWFyX2JpdChISURQX1dBSVRJTkdfRk9SX1JFVFVSTiwgJnNlc3Npb24tPmZsYWdzKTsKIAltdXRleF91bmxvY2soJnNlc3Npb24tPnJlcG9ydF9tdXRleCk7Ci0JcmV0dXJuIC1FUkVTVEFSVFNZUzsKLWVycl9laW86Ci0JY2xlYXJfYml0KEhJRFBfV0FJVElOR19GT1JfUkVUVVJOLCAmc2Vzc2lvbi0+ZmxhZ3MpOwotCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+cmVwb3J0X211dGV4KTsKLQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgaW50IGhpZHBfb3V0cHV0X3Jhd19yZXBvcnQoc3RydWN0IGhpZF9kZXZpY2UgKmhpZCwgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGNvdW50LApAQCAtNDIyLDExICs0MjAsMTAgQEAKIAogCS8qIFNldCB1cCBvdXIgd2FpdCwgYW5kIHNlbmQgdGhlIHJlcG9ydCByZXF1ZXN0IHRvIHRoZSBkZXZpY2UuICovCiAJc2V0X2JpdChISURQX1dBSVRJTkdfRk9SX1NFTkRfQUNLLCAmc2Vzc2lvbi0+ZmxhZ3MpOwotCWlmIChoaWRwX3NlbmRfY3RybF9tZXNzYWdlKGhpZC0+ZHJpdmVyX2RhdGEsIHJlcG9ydF90eXBlLAotCQkJZGF0YSwgY291bnQpKSB7Ci0JCXJldCA9IC1FTk9NRU07CisJcmV0ID0gaGlkcF9zZW5kX2N0cmxfbWVzc2FnZShoaWQtPmRyaXZlcl9kYXRhLCByZXBvcnRfdHlwZSwgZGF0YSwKKwkJCQkJCQkJCWNvdW50KTsKKwlpZiAocmV0KQogCQlnb3RvIGVycjsKLQl9CiAKIAkvKiBXYWl0IGZvciB0aGUgQUNLIGZyb20gdGhlIGRldmljZS4gKi8KIAl3aGlsZSAodGVzdF9iaXQoSElEUF9XQUlUSU5HX0ZPUl9TRU5EX0FDSywgJnNlc3Npb24tPmZsYWdzKSkgewpAQCAtNDk2LDEwICs0OTMsOSBAQAogCWNhc2UgSElEUF9IU0hLX0VSUl9JTlZBTElEX1JFUE9SVF9JRDoKIAljYXNlIEhJRFBfSFNIS19FUlJfVU5TVVBQT1JURURfUkVRVUVTVDoKIAljYXNlIEhJRFBfSFNIS19FUlJfSU5WQUxJRF9QQVJBTUVURVI6Ci0JCWlmICh0ZXN0X2JpdChISURQX1dBSVRJTkdfRk9SX1JFVFVSTiwgJnNlc3Npb24tPmZsYWdzKSkgewotCQkJY2xlYXJfYml0KEhJRFBfV0FJVElOR19GT1JfUkVUVVJOLCAmc2Vzc2lvbi0+ZmxhZ3MpOworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhJRFBfV0FJVElOR19GT1JfUkVUVVJOLCAmc2Vzc2lvbi0+ZmxhZ3MpKQogCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXNzaW9uLT5yZXBvcnRfcXVldWUpOwotCQl9CisKIAkJLyogRklYTUU6IENhbGwgaW50byBTRVRfIEdFVF8gaGFuZGxlcnMgaGVyZSAqLwogCQlicmVhazsKIApAQCAtNTIwLDEwICs1MTYsOCBAQAogCX0KIAogCS8qIFdha2UgdXAgdGhlIHdhaXRpbmcgdGhyZWFkLiAqLwotCWlmICh0ZXN0X2JpdChISURQX1dBSVRJTkdfRk9SX1NFTkRfQUNLLCAmc2Vzc2lvbi0+ZmxhZ3MpKSB7Ci0JCWNsZWFyX2JpdChISURQX1dBSVRJTkdfRk9SX1NFTkRfQUNLLCAmc2Vzc2lvbi0+ZmxhZ3MpOworCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSElEUF9XQUlUSU5HX0ZPUl9TRU5EX0FDSywgJnNlc3Npb24tPmZsYWdzKSkKIAkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZzZXNzaW9uLT5yZXBvcnRfcXVldWUpOwotCX0KIH0KIAogc3RhdGljIHZvaWQgaGlkcF9wcm9jZXNzX2hpZF9jb250cm9sKHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24sCkBAIC02NjMsNyArNjU3LDI0IEBACiAJcmV0dXJuIGtlcm5lbF9zZW5kbXNnKHNvY2ssICZtc2csICZpdiwgMSwgbGVuKTsKIH0KIAotc3RhdGljIHZvaWQgaGlkcF9wcm9jZXNzX3RyYW5zbWl0KHN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb24pCitzdGF0aWMgdm9pZCBoaWRwX3Byb2Nlc3NfaW50cl90cmFuc21pdChzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlCVF9EQkcoInNlc3Npb24gJXAiLCBzZXNzaW9uKTsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJnNlc3Npb24tPmludHJfdHJhbnNtaXQpKSkgeworCQlpZiAoaGlkcF9zZW5kX2ZyYW1lKHNlc3Npb24tPmludHJfc29jaywgc2tiLT5kYXRhLCBza2ItPmxlbikgPCAwKSB7CisJCQlza2JfcXVldWVfaGVhZCgmc2Vzc2lvbi0+aW50cl90cmFuc21pdCwgc2tiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaGlkcF9zZXRfdGltZXIoc2Vzc2lvbik7CisJCWtmcmVlX3NrYihza2IpOworCX0KK30KKworc3RhdGljIHZvaWQgaGlkcF9wcm9jZXNzX2N0cmxfdHJhbnNtaXQoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCkBAIC02NzgsMTYgKzY4OSw2IEBACiAJCWhpZHBfc2V0X3RpbWVyKHNlc3Npb24pOwogCQlrZnJlZV9za2Ioc2tiKTsKIAl9Ci0KLQl3aGlsZSAoKHNrYiA9IHNrYl9kZXF1ZXVlKCZzZXNzaW9uLT5pbnRyX3RyYW5zbWl0KSkpIHsKLQkJaWYgKGhpZHBfc2VuZF9mcmFtZShzZXNzaW9uLT5pbnRyX3NvY2ssIHNrYi0+ZGF0YSwgc2tiLT5sZW4pIDwgMCkgewotCQkJc2tiX3F1ZXVlX2hlYWQoJnNlc3Npb24tPmludHJfdHJhbnNtaXQsIHNrYik7Ci0JCQlicmVhazsKLQkJfQotCi0JCWhpZHBfc2V0X3RpbWVyKHNlc3Npb24pOwotCQlrZnJlZV9za2Ioc2tiKTsKLQl9CiB9CiAKIHN0YXRpYyBpbnQgaGlkcF9zZXNzaW9uKHZvaWQgKmFyZykKQEAgLTcwMCw2ICs3MDEsNyBAQAogCiAJQlRfREJHKCJzZXNzaW9uICVwIiwgc2Vzc2lvbik7CiAKKwlfX21vZHVsZV9nZXQoVEhJU19NT0RVTEUpOwogCXNldF91c2VyX25pY2UoY3VycmVudCwgLTE1KTsKIAogCWluaXRfd2FpdHF1ZXVlX2VudHJ5KCZjdHJsX3dhaXQsIGN1cnJlbnQpOwpAQCAtNzE0LDE0ICs3MTYsNiBAQAogCQkJCWludHJfc2stPnNrX3N0YXRlICE9IEJUX0NPTk5FQ1RFRCkKIAkJCWJyZWFrOwogCi0JCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmN0cmxfc2stPnNrX3JlY2VpdmVfcXVldWUpKSkgewotCQkJc2tiX29ycGhhbihza2IpOwotCQkJaWYgKCFza2JfbGluZWFyaXplKHNrYikpCi0JCQkJaGlkcF9yZWN2X2N0cmxfZnJhbWUoc2Vzc2lvbiwgc2tiKTsKLQkJCWVsc2UKLQkJCQlrZnJlZV9za2Ioc2tiKTsKLQkJfQotCiAJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmludHJfc2stPnNrX3JlY2VpdmVfcXVldWUpKSkgewogCQkJc2tiX29ycGhhbihza2IpOwogCQkJaWYgKCFza2JfbGluZWFyaXplKHNrYikpCkBAIC03MzAsNyArNzI0LDE3IEBACiAJCQkJa2ZyZWVfc2tiKHNrYik7CiAJCX0KIAotCQloaWRwX3Byb2Nlc3NfdHJhbnNtaXQoc2Vzc2lvbik7CisJCWhpZHBfcHJvY2Vzc19pbnRyX3RyYW5zbWl0KHNlc3Npb24pOworCisJCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUoJmN0cmxfc2stPnNrX3JlY2VpdmVfcXVldWUpKSkgeworCQkJc2tiX29ycGhhbihza2IpOworCQkJaWYgKCFza2JfbGluZWFyaXplKHNrYikpCisJCQkJaGlkcF9yZWN2X2N0cmxfZnJhbWUoc2Vzc2lvbiwgc2tiKTsKKwkJCWVsc2UKKwkJCQlrZnJlZV9za2Ioc2tiKTsKKwkJfQorCisJCWhpZHBfcHJvY2Vzc19jdHJsX3RyYW5zbWl0KHNlc3Npb24pOwogCiAJCXNjaGVkdWxlKCk7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CkBAIC03MzksNiArNzQzLDEwIEBACiAJcmVtb3ZlX3dhaXRfcXVldWUoc2tfc2xlZXAoaW50cl9zayksICZpbnRyX3dhaXQpOwogCXJlbW92ZV93YWl0X3F1ZXVlKHNrX3NsZWVwKGN0cmxfc2spLCAmY3RybF93YWl0KTsKIAorCWNsZWFyX2JpdChISURQX1dBSVRJTkdfRk9SX1NFTkRfQUNLLCAmc2Vzc2lvbi0+ZmxhZ3MpOworCWNsZWFyX2JpdChISURQX1dBSVRJTkdfRk9SX1JFVFVSTiwgJnNlc3Npb24tPmZsYWdzKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoJnNlc3Npb24tPnJlcG9ydF9xdWV1ZSk7CisKIAlkb3duX3dyaXRlKCZoaWRwX3Nlc3Npb25fc2VtKTsKIAogCWhpZHBfZGVsX3RpbWVyKHNlc3Npb24pOwpAQCAtNzcyLDM0ICs3ODAsMzcgQEAKIAogCWtmcmVlKHNlc3Npb24tPnJkX2RhdGEpOwogCWtmcmVlKHNlc3Npb24pOworCW1vZHVsZV9wdXRfYW5kX2V4aXQoMCk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZGV2aWNlICpoaWRwX2dldF9kZXZpY2Uoc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKK3N0YXRpYyBzdHJ1Y3QgaGNpX2Nvbm4gKmhpZHBfZ2V0X2Nvbm5lY3Rpb24oc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKIAliZGFkZHJfdCAqc3JjID0gJmJ0X3NrKHNlc3Npb24tPmN0cmxfc29jay0+c2spLT5zcmM7CiAJYmRhZGRyX3QgKmRzdCA9ICZidF9zayhzZXNzaW9uLT5jdHJsX3NvY2stPnNrKS0+ZHN0OwotCXN0cnVjdCBkZXZpY2UgKmRldmljZSA9IE5VTEw7CisJc3RydWN0IGhjaV9jb25uICpjb25uOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwogCiAJaGRldiA9IGhjaV9nZXRfcm91dGUoZHN0LCBzcmMpOwogCWlmICghaGRldikKIAkJcmV0dXJuIE5VTEw7CiAKLQlzZXNzaW9uLT5jb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssIGRzdCk7Ci0JaWYgKHNlc3Npb24tPmNvbm4pCi0JCWRldmljZSA9ICZzZXNzaW9uLT5jb25uLT5kZXY7CisJaGNpX2Rldl9sb2NrKGhkZXYpOworCWNvbm4gPSBoY2lfY29ubl9oYXNoX2xvb2t1cF9iYShoZGV2LCBBQ0xfTElOSywgZHN0KTsKKwlpZiAoY29ubikKKwkJaGNpX2Nvbm5faG9sZF9kZXZpY2UoY29ubik7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAKIAloY2lfZGV2X3B1dChoZGV2KTsKIAotCXJldHVybiBkZXZpY2U7CisJcmV0dXJuIGNvbm47CiB9CiAKIHN0YXRpYyBpbnQgaGlkcF9zZXR1cF9pbnB1dChzdHJ1Y3QgaGlkcF9zZXNzaW9uICpzZXNzaW9uLAogCQkJCXN0cnVjdCBoaWRwX2Nvbm5hZGRfcmVxICpyZXEpCiB7CiAJc3RydWN0IGlucHV0X2RldiAqaW5wdXQ7Ci0JaW50IGVyciwgaTsKKwlpbnQgaTsKIAogCWlucHV0ID0gaW5wdXRfYWxsb2NhdGVfZGV2aWNlKCk7CiAJaWYgKCFpbnB1dCkKQEAgLTg0MiwxNyArODUzLDEwIEBACiAJCWlucHV0LT5yZWxiaXRbMF0gfD0gQklUX01BU0soUkVMX1dIRUVMKTsKIAl9CiAKLQlpbnB1dC0+ZGV2LnBhcmVudCA9IGhpZHBfZ2V0X2RldmljZShzZXNzaW9uKTsKKwlpbnB1dC0+ZGV2LnBhcmVudCA9ICZzZXNzaW9uLT5jb25uLT5kZXY7CiAKIAlpbnB1dC0+ZXZlbnQgPSBoaWRwX2lucHV0X2V2ZW50OwogCi0JZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKGlucHV0KTsKLQlpZiAoZXJyIDwgMCkgewotCQlpbnB1dF9mcmVlX2RldmljZShpbnB1dCk7Ci0JCXNlc3Npb24tPmlucHV0ID0gTlVMTDsKLQkJcmV0dXJuIGVycjsKLQl9Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtOTQ5LDcgKzk1Myw3IEBACiAJc3RybmNweShoaWQtPnBoeXMsIGJhdG9zdHIoJmJ0X3NrKHNlc3Npb24tPmN0cmxfc29jay0+c2spLT5zcmMpLCA2NCk7CiAJc3RybmNweShoaWQtPnVuaXEsIGJhdG9zdHIoJmJ0X3NrKHNlc3Npb24tPmN0cmxfc29jay0+c2spLT5kc3QpLCA2NCk7CiAKLQloaWQtPmRldi5wYXJlbnQgPSBoaWRwX2dldF9kZXZpY2Uoc2Vzc2lvbik7CisJaGlkLT5kZXYucGFyZW50ID0gJnNlc3Npb24tPmNvbm4tPmRldjsKIAloaWQtPmxsX2RyaXZlciA9ICZoaWRwX2hpZF9kcml2ZXI7CiAKIAloaWQtPmhpZF9nZXRfcmF3X3JlcG9ydCA9IGhpZHBfZ2V0X3Jhd19yZXBvcnQ7CkBAIC05NzYsMTggKzk4MCwyMCBAQAogCQkJYmFjbXAoJmJ0X3NrKGN0cmxfc29jay0+c2spLT5kc3QsICZidF9zayhpbnRyX3NvY2stPnNrKS0+ZHN0KSkKIAkJcmV0dXJuIC1FTk9UVU5JUTsKIAotCXNlc3Npb24gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgaGlkcF9zZXNzaW9uKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFzZXNzaW9uKQotCQlyZXR1cm4gLUVOT01FTTsKLQogCUJUX0RCRygicmRfZGF0YSAlcCByZF9zaXplICVkIiwgcmVxLT5yZF9kYXRhLCByZXEtPnJkX3NpemUpOwogCiAJZG93bl93cml0ZSgmaGlkcF9zZXNzaW9uX3NlbSk7CiAKIAlzID0gX19oaWRwX2dldF9zZXNzaW9uKCZidF9zayhjdHJsX3NvY2stPnNrKS0+ZHN0KTsKIAlpZiAocyAmJiBzLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQpIHsKLQkJZXJyID0gLUVFWElTVDsKLQkJZ290byBmYWlsZWQ7CisJCXVwX3dyaXRlKCZoaWRwX3Nlc3Npb25fc2VtKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJc2Vzc2lvbiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBoaWRwX3Nlc3Npb24pLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlc3Npb24pIHsKKwkJdXBfd3JpdGUoJmhpZHBfc2Vzc2lvbl9zZW0pOworCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKIAliYWNweSgmc2Vzc2lvbi0+YmRhZGRyLCAmYnRfc2soY3RybF9zb2NrLT5zayktPmRzdCk7CkBAIC0xMDAzLDYgKzEwMDksMTIgQEAKIAlzZXNzaW9uLT5pbnRyX3NvY2sgPSBpbnRyX3NvY2s7CiAJc2Vzc2lvbi0+c3RhdGUgICAgID0gQlRfQ09OTkVDVEVEOwogCisJc2Vzc2lvbi0+Y29ubiA9IGhpZHBfZ2V0X2Nvbm5lY3Rpb24oc2Vzc2lvbik7CisJaWYgKCFzZXNzaW9uLT5jb25uKSB7CisJCWVyciA9IC1FTk9UQ09OTjsKKwkJZ290byBmYWlsZWQ7CisJfQorCiAJc2V0dXBfdGltZXIoJnNlc3Npb24tPnRpbWVyLCBoaWRwX2lkbGVfdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpc2Vzc2lvbik7CiAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZzZXNzaW9uLT5jdHJsX3RyYW5zbWl0KTsKQEAgLTEwMTUsOSArMTAyNywxMSBAQAogCXNlc3Npb24tPmZsYWdzICAgPSByZXEtPmZsYWdzICYgKDEgPDwgSElEUF9CTFVFVE9PVEhfVkVORE9SX0lEKTsKIAlzZXNzaW9uLT5pZGxlX3RvID0gcmVxLT5pZGxlX3RvOwogCisJX19oaWRwX2xpbmtfc2Vzc2lvbihzZXNzaW9uKTsKKwogCWlmIChyZXEtPnJkX3NpemUgPiAwKSB7CiAJCWVyciA9IGhpZHBfc2V0dXBfaGlkKHNlc3Npb24sIHJlcSk7Ci0JCWlmIChlcnIgJiYgZXJyICE9IC1FTk9ERVYpCisJCWlmIChlcnIpCiAJCQlnb3RvIHB1cmdlOwogCX0KIApAQCAtMTAyNyw4ICsxMDQxLDYgQEAKIAkJCWdvdG8gcHVyZ2U7CiAJfQogCi0JX19oaWRwX2xpbmtfc2Vzc2lvbihzZXNzaW9uKTsKLQogCWhpZHBfc2V0X3RpbWVyKHNlc3Npb24pOwogCiAJaWYgKHNlc3Npb24tPmhpZCkgewpAQCAtMTA1NCw3ICsxMDY2LDExIEBACiAJCQkhc2Vzc2lvbi0+d2FpdGluZ19mb3Jfc3RhcnR1cCk7CiAJfQogCi0JZXJyID0gaGlkX2FkZF9kZXZpY2Uoc2Vzc2lvbi0+aGlkKTsKKwlpZiAoc2Vzc2lvbi0+aGlkKQorCQllcnIgPSBoaWRfYWRkX2RldmljZShzZXNzaW9uLT5oaWQpOworCWVsc2UKKwkJZXJyID0gaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKHNlc3Npb24tPmlucHV0KTsKKwogCWlmIChlcnIgPCAwKSB7CiAJCWF0b21pY19pbmMoJnNlc3Npb24tPnRlcm1pbmF0ZSk7CiAJCXdha2VfdXBfcHJvY2VzcyhzZXNzaW9uLT50YXNrKTsKQEAgLTEwNzcsOCArMTA5Myw2IEBACiB1bmxpbms6CiAJaGlkcF9kZWxfdGltZXIoc2Vzc2lvbik7CiAKLQlfX2hpZHBfdW5saW5rX3Nlc3Npb24oc2Vzc2lvbik7Ci0KIAlpZiAoc2Vzc2lvbi0+aW5wdXQpIHsKIAkJaW5wdXRfdW5yZWdpc3Rlcl9kZXZpY2Uoc2Vzc2lvbi0+aW5wdXQpOwogCQlzZXNzaW9uLT5pbnB1dCA9IE5VTEw7CkBAIC0xMDkzLDYgKzExMDcsOCBAQAogCXNlc3Npb24tPnJkX2RhdGEgPSBOVUxMOwogCiBwdXJnZToKKwlfX2hpZHBfdW5saW5rX3Nlc3Npb24oc2Vzc2lvbik7CisKIAlza2JfcXVldWVfcHVyZ2UoJnNlc3Npb24tPmN0cmxfdHJhbnNtaXQpOwogCXNrYl9xdWV1ZV9wdXJnZSgmc2Vzc2lvbi0+aW50cl90cmFuc21pdCk7CiAKQEAgLTExMzQsMTkgKzExNTAsMTYgQEAKIAogaW50IGhpZHBfZ2V0X2Nvbm5saXN0KHN0cnVjdCBoaWRwX2Nvbm5saXN0X3JlcSAqcmVxKQogewotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGhpZHBfc2Vzc2lvbiAqc2Vzc2lvbjsKIAlpbnQgZXJyID0gMCwgbiA9IDA7CiAKIAlCVF9EQkcoIiIpOwogCiAJZG93bl9yZWFkKCZoaWRwX3Nlc3Npb25fc2VtKTsKIAotCWxpc3RfZm9yX2VhY2gocCwgJmhpZHBfc2Vzc2lvbl9saXN0KSB7Ci0JCXN0cnVjdCBoaWRwX3Nlc3Npb24gKnNlc3Npb247CisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZXNzaW9uLCAmaGlkcF9zZXNzaW9uX2xpc3QsIGxpc3QpIHsKIAkJc3RydWN0IGhpZHBfY29ubmluZm8gY2k7CiAKLQkJc2Vzc2lvbiA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhpZHBfc2Vzc2lvbiwgbGlzdCk7Ci0KIAkJX19oaWRwX2NvcHlfc2Vzc2lvbihzZXNzaW9uLCAmY2kpOwogCiAJCWlmIChjb3B5X3RvX3VzZXIocmVxLT5jaSwgJmNpLCBzaXplb2YoY2kpKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9sMmNhcF9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYwppbmRleCA1ZWE5NGExLi5hYTc4ZDhjIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYworKysgYi9uZXQvYmx1ZXRvb3RoL2wyY2FwX2NvcmUuYwpAQCAtMyw2ICszLDcgQEAKICAgIENvcHlyaWdodCAoQykgMjAwMC0yMDAxIFF1YWxjb21tIEluY29ycG9yYXRlZAogICAgQ29weXJpZ2h0IChDKSAyMDA5LTIwMTAgR3VzdGF2byBGLiBQYWRvdmFuIDxndXN0YXZvQHBhZG92YW4ub3JnPgogICAgQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuCisgICBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9OIEVtYmVkZGVkIFN5c3RlbXMKIAogICAgV3JpdHRlbiAyMDAwLDIwMDEgYnkgTWF4aW0gS3Jhc255YW5za3kgPG1heGtAcXVhbGNvbW0uY29tPgogCkBAIC01NiwxMCArNTcsMTAgQEAKICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2wyY2FwLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9zbXAuaD4KIAotaW50IGRpc2FibGVfZXJ0bTsKK2Jvb2wgZGlzYWJsZV9lcnRtOwogCiBzdGF0aWMgdTMyIGwyY2FwX2ZlYXRfbWFzayA9IEwyQ0FQX0ZFQVRfRklYRURfQ0hBTjsKLXN0YXRpYyB1OCBsMmNhcF9maXhlZF9jaGFuWzhdID0geyAweDAyLCB9Oworc3RhdGljIHU4IGwyY2FwX2ZpeGVkX2NoYW5bOF0gPSB7IEwyQ0FQX0ZDX0wyQ0FQLCB9OwogCiBzdGF0aWMgTElTVF9IRUFEKGNoYW5fbGlzdCk7CiBzdGF0aWMgREVGSU5FX1JXTE9DSyhjaGFuX2xpc3RfbG9jayk7CkBAIC03NiwzOCArNzcsMzggQEAKIAogLyogLS0tLSBMMkNBUCBjaGFubmVscyAtLS0tICovCiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBjaGFuX2hvbGQoc3RydWN0IGwyY2FwX2NoYW4gKmMpCi17Ci0JYXRvbWljX2luYygmYy0+cmVmY250KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGNoYW5fcHV0KHN0cnVjdCBsMmNhcF9jaGFuICpjKQotewotCWlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZjLT5yZWZjbnQpKQotCQlrZnJlZShjKTsKLX0KLQogc3RhdGljIHN0cnVjdCBsMmNhcF9jaGFuICpfX2wyY2FwX2dldF9jaGFuX2J5X2RjaWQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHUxNiBjaWQpCiB7Ci0Jc3RydWN0IGwyY2FwX2NoYW4gKmM7CisJc3RydWN0IGwyY2FwX2NoYW4gKmMsICpyID0gTlVMTDsKIAotCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNvbm4tPmNoYW5fbCwgbGlzdCkgewotCQlpZiAoYy0+ZGNpZCA9PSBjaWQpCi0JCQlyZXR1cm4gYzsKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjLCAmY29ubi0+Y2hhbl9sLCBsaXN0KSB7CisJCWlmIChjLT5kY2lkID09IGNpZCkgeworCQkJciA9IGM7CisJCQlicmVhazsKKwkJfQogCX0KLQlyZXR1cm4gTlVMTDsKIAorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiByOwogfQogCiBzdGF0aWMgc3RydWN0IGwyY2FwX2NoYW4gKl9fbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgdTE2IGNpZCkKIHsKLQlzdHJ1Y3QgbDJjYXBfY2hhbiAqYzsKKwlzdHJ1Y3QgbDJjYXBfY2hhbiAqYywgKnIgPSBOVUxMOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmY29ubi0+Y2hhbl9sLCBsaXN0KSB7Ci0JCWlmIChjLT5zY2lkID09IGNpZCkKLQkJCXJldHVybiBjOworCXJjdV9yZWFkX2xvY2soKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGMsICZjb25uLT5jaGFuX2wsIGxpc3QpIHsKKwkJaWYgKGMtPnNjaWQgPT0gY2lkKSB7CisJCQlyID0gYzsKKwkJCWJyZWFrOworCQl9CiAJfQotCXJldHVybiBOVUxMOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHI7CiB9CiAKIC8qIEZpbmQgY2hhbm5lbCB3aXRoIGdpdmVuIFNDSUQuCkBAIC0xMTYsMzQgKzExNywzNiBAQAogewogCXN0cnVjdCBsMmNhcF9jaGFuICpjOwogCi0JcmVhZF9sb2NrKCZjb25uLT5jaGFuX2xvY2spOwogCWMgPSBfX2wyY2FwX2dldF9jaGFuX2J5X3NjaWQoY29ubiwgY2lkKTsKIAlpZiAoYykKLQkJYmhfbG9ja19zb2NrKGMtPnNrKTsKLQlyZWFkX3VubG9jaygmY29ubi0+Y2hhbl9sb2NrKTsKKwkJbG9ja19zb2NrKGMtPnNrKTsKIAlyZXR1cm4gYzsKIH0KIAogc3RhdGljIHN0cnVjdCBsMmNhcF9jaGFuICpfX2wyY2FwX2dldF9jaGFuX2J5X2lkZW50KHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1OCBpZGVudCkKIHsKLQlzdHJ1Y3QgbDJjYXBfY2hhbiAqYzsKKwlzdHJ1Y3QgbDJjYXBfY2hhbiAqYywgKnIgPSBOVUxMOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjLCAmY29ubi0+Y2hhbl9sLCBsaXN0KSB7Ci0JCWlmIChjLT5pZGVudCA9PSBpZGVudCkKLQkJCXJldHVybiBjOworCXJjdV9yZWFkX2xvY2soKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGMsICZjb25uLT5jaGFuX2wsIGxpc3QpIHsKKwkJaWYgKGMtPmlkZW50ID09IGlkZW50KSB7CisJCQlyID0gYzsKKwkJCWJyZWFrOworCQl9CiAJfQotCXJldHVybiBOVUxMOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHI7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IGwyY2FwX2NoYW4gKmwyY2FwX2dldF9jaGFuX2J5X2lkZW50KHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1OCBpZGVudCkKIHsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqYzsKIAotCXJlYWRfbG9jaygmY29ubi0+Y2hhbl9sb2NrKTsKIAljID0gX19sMmNhcF9nZXRfY2hhbl9ieV9pZGVudChjb25uLCBpZGVudCk7CiAJaWYgKGMpCi0JCWJoX2xvY2tfc29jayhjLT5zayk7Ci0JcmVhZF91bmxvY2soJmNvbm4tPmNoYW5fbG9jayk7CisJCWxvY2tfc29jayhjLT5zayk7CiAJcmV0dXJuIGM7CiB9CiAKQEAgLTE1MywxMiArMTU2LDkgQEAKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmNoYW5fbGlzdCwgZ2xvYmFsX2wpIHsKIAkJaWYgKGMtPnNwb3J0ID09IHBzbSAmJiAhYmFjbXAoJmJ0X3NrKGMtPnNrKS0+c3JjLCBzcmMpKQotCQkJZ290byBmb3VuZDsKKwkJCXJldHVybiBjOwogCX0KLQotCWMgPSBOVUxMOwotZm91bmQ6Ci0JcmV0dXJuIGM7CisJcmV0dXJuIE5VTEw7CiB9CiAKIGludCBsMmNhcF9hZGRfcHNtKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBiZGFkZHJfdCAqc3JjLCBfX2xlMTYgcHNtKQpAQCAtMjE3LDQ1ICsyMTcsNTEgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgbDJjYXBfc2V0X3RpbWVyKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIsIGxvbmcgdGltZW91dCkKK3N0YXRpYyBjaGFyICpzdGF0ZV90b19zdHJpbmcoaW50IHN0YXRlKQogewotCUJUX0RCRygiY2hhbiAlcCBzdGF0ZSAlZCB0aW1lb3V0ICVsZCIsIGNoYW4tPnNrLCBjaGFuLT5zdGF0ZSwgdGltZW91dCk7CisJc3dpdGNoKHN0YXRlKSB7CisJY2FzZSBCVF9DT05ORUNURUQ6CisJCXJldHVybiAiQlRfQ09OTkVDVEVEIjsKKwljYXNlIEJUX09QRU46CisJCXJldHVybiAiQlRfT1BFTiI7CisJY2FzZSBCVF9CT1VORDoKKwkJcmV0dXJuICJCVF9CT1VORCI7CisJY2FzZSBCVF9MSVNURU46CisJCXJldHVybiAiQlRfTElTVEVOIjsKKwljYXNlIEJUX0NPTk5FQ1Q6CisJCXJldHVybiAiQlRfQ09OTkVDVCI7CisJY2FzZSBCVF9DT05ORUNUMjoKKwkJcmV0dXJuICJCVF9DT05ORUNUMiI7CisJY2FzZSBCVF9DT05GSUc6CisJCXJldHVybiAiQlRfQ09ORklHIjsKKwljYXNlIEJUX0RJU0NPTk46CisJCXJldHVybiAiQlRfRElTQ09OTiI7CisJY2FzZSBCVF9DTE9TRUQ6CisJCXJldHVybiAiQlRfQ0xPU0VEIjsKKwl9CiAKLQlpZiAoIW1vZF90aW1lcih0aW1lciwgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModGltZW91dCkpKQotCQljaGFuX2hvbGQoY2hhbik7Ci19Ci0KLXN0YXRpYyB2b2lkIGwyY2FwX2NsZWFyX3RpbWVyKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCi17Ci0JQlRfREJHKCJjaGFuICVwIHN0YXRlICVkIiwgY2hhbiwgY2hhbi0+c3RhdGUpOwotCi0JaWYgKHRpbWVyX3BlbmRpbmcodGltZXIpICYmIGRlbF90aW1lcih0aW1lcikpCi0JCWNoYW5fcHV0KGNoYW4pOworCXJldHVybiAiaW52YWxpZCBzdGF0ZSI7CiB9CiAKIHN0YXRpYyB2b2lkIGwyY2FwX3N0YXRlX2NoYW5nZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgaW50IHN0YXRlKQogeworCUJUX0RCRygiJXAgJXMgLT4gJXMiLCBjaGFuLCBzdGF0ZV90b19zdHJpbmcoY2hhbi0+c3RhdGUpLAorCQkJCQkJc3RhdGVfdG9fc3RyaW5nKHN0YXRlKSk7CisKIAljaGFuLT5zdGF0ZSA9IHN0YXRlOwogCWNoYW4tPm9wcy0+c3RhdGVfY2hhbmdlKGNoYW4tPmRhdGEsIHN0YXRlKTsKIH0KIAotc3RhdGljIHZvaWQgbDJjYXBfY2hhbl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIHZvaWQgbDJjYXBfY2hhbl90aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IChzdHJ1Y3QgbDJjYXBfY2hhbiAqKSBhcmc7CisJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGwyY2FwX2NoYW4sCisJCQkJCQkJY2hhbl90aW1lci53b3JrKTsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLT5zazsKIAlpbnQgcmVhc29uOwogCiAJQlRfREJHKCJjaGFuICVwIHN0YXRlICVkIiwgY2hhbiwgY2hhbi0+c3RhdGUpOwogCi0JYmhfbG9ja19zb2NrKHNrKTsKLQotCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKSB7Ci0JCS8qIHNrIGlzIG93bmVkIGJ5IHVzZXIuIFRyeSBhZ2FpbiBsYXRlciAqLwotCQlfX3NldF9jaGFuX3RpbWVyKGNoYW4sIEwyQ0FQX0RJU0NfVElNRU9VVCk7Ci0JCWJoX3VubG9ja19zb2NrKHNrKTsKLQkJY2hhbl9wdXQoY2hhbik7Ci0JCXJldHVybjsKLQl9CisJbG9ja19zb2NrKHNrKTsKIAogCWlmIChjaGFuLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQgfHwgY2hhbi0+c3RhdGUgPT0gQlRfQ09ORklHKQogCQlyZWFzb24gPSBFQ09OTlJFRlVTRUQ7CkBAIC0yNjcsMTAgKzI3MywxMCBAQAogCiAJbDJjYXBfY2hhbl9jbG9zZShjaGFuLCByZWFzb24pOwogCi0JYmhfdW5sb2NrX3NvY2soc2spOworCXJlbGVhc2Vfc29jayhzayk7CiAKIAljaGFuLT5vcHMtPmNsb3NlKGNoYW4tPmRhdGEpOwotCWNoYW5fcHV0KGNoYW4pOworCWwyY2FwX2NoYW5fcHV0KGNoYW4pOwogfQogCiBzdHJ1Y3QgbDJjYXBfY2hhbiAqbDJjYXBfY2hhbl9jcmVhdGUoc3RydWN0IHNvY2sgKnNrKQpAQCAtMjg3LDEyICsyOTMsMTQgQEAKIAlsaXN0X2FkZCgmY2hhbi0+Z2xvYmFsX2wsICZjaGFuX2xpc3QpOwogCXdyaXRlX3VubG9ja19iaCgmY2hhbl9saXN0X2xvY2spOwogCi0Jc2V0dXBfdGltZXIoJmNoYW4tPmNoYW5fdGltZXIsIGwyY2FwX2NoYW5fdGltZW91dCwgKHVuc2lnbmVkIGxvbmcpIGNoYW4pOworCUlOSVRfREVMQVlFRF9XT1JLKCZjaGFuLT5jaGFuX3RpbWVyLCBsMmNhcF9jaGFuX3RpbWVvdXQpOwogCiAJY2hhbi0+c3RhdGUgPSBCVF9PUEVOOwogCiAJYXRvbWljX3NldCgmY2hhbi0+cmVmY250LCAxKTsKIAorCUJUX0RCRygic2sgJXAgY2hhbiAlcCIsIHNrLCBjaGFuKTsKKwogCXJldHVybiBjaGFuOwogfQogCkBAIC0zMDIsMTUgKzMxMCwxNSBAQAogCWxpc3RfZGVsKCZjaGFuLT5nbG9iYWxfbCk7CiAJd3JpdGVfdW5sb2NrX2JoKCZjaGFuX2xpc3RfbG9jayk7CiAKLQljaGFuX3B1dChjaGFuKTsKKwlsMmNhcF9jaGFuX3B1dChjaGFuKTsKIH0KIAotc3RhdGljIHZvaWQgX19sMmNhcF9jaGFuX2FkZChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCitzdGF0aWMgdm9pZCBsMmNhcF9jaGFuX2FkZChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCiB7CiAJQlRfREJHKCJjb25uICVwLCBwc20gMHglMi4yeCwgZGNpZCAweCU0LjR4IiwgY29ubiwKIAkJCWNoYW4tPnBzbSwgY2hhbi0+ZGNpZCk7CiAKLQljb25uLT5kaXNjX3JlYXNvbiA9IDB4MTM7CisJY29ubi0+ZGlzY19yZWFzb24gPSBIQ0lfRVJST1JfUkVNT1RFX1VTRVJfVEVSTTsKIAogCWNoYW4tPmNvbm4gPSBjb25uOwogCkBAIC0zMzcsOSArMzQ1LDE2IEBACiAJCWNoYW4tPm9tdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKIAl9CiAKLQljaGFuX2hvbGQoY2hhbik7CisJY2hhbi0+bG9jYWxfaWQJCT0gTDJDQVBfQkVTVEVGRk9SVF9JRDsKKwljaGFuLT5sb2NhbF9zdHlwZQk9IEwyQ0FQX1NFUlZfQkVTVEVGRk9SVDsKKwljaGFuLT5sb2NhbF9tc2R1CT0gTDJDQVBfREVGQVVMVF9NQVhfU0RVX1NJWkU7CisJY2hhbi0+bG9jYWxfc2R1X2l0aW1lCT0gTDJDQVBfREVGQVVMVF9TRFVfSVRJTUU7CisJY2hhbi0+bG9jYWxfYWNjX2xhdAk9IEwyQ0FQX0RFRkFVTFRfQUNDX0xBVDsKKwljaGFuLT5sb2NhbF9mbHVzaF90bwk9IEwyQ0FQX0RFRkFVTFRfRkxVU0hfVE87CiAKLQlsaXN0X2FkZCgmY2hhbi0+bGlzdCwgJmNvbm4tPmNoYW5fbCk7CisJbDJjYXBfY2hhbl9ob2xkKGNoYW4pOworCisJbGlzdF9hZGRfcmN1KCZjaGFuLT5saXN0LCAmY29ubi0+Y2hhbl9sKTsKIH0KIAogLyogRGVsZXRlIGNoYW5uZWwuCkBAIC0zNTYsMTAgKzM3MSwxMCBAQAogCiAJaWYgKGNvbm4pIHsKIAkJLyogRGVsZXRlIGZyb20gY2hhbm5lbCBsaXN0ICovCi0JCXdyaXRlX2xvY2tfYmgoJmNvbm4tPmNoYW5fbG9jayk7Ci0JCWxpc3RfZGVsKCZjaGFuLT5saXN0KTsKLQkJd3JpdGVfdW5sb2NrX2JoKCZjb25uLT5jaGFuX2xvY2spOwotCQljaGFuX3B1dChjaGFuKTsKKwkJbGlzdF9kZWxfcmN1KCZjaGFuLT5saXN0KTsKKwkJc3luY2hyb25pemVfcmN1KCk7CisKKwkJbDJjYXBfY2hhbl9wdXQoY2hhbik7CiAKIAkJY2hhbi0+Y29ubiA9IE5VTEw7CiAJCWhjaV9jb25uX3B1dChjb25uLT5oY29uKTsKQEAgLTUwOCw3ICs1MjMsNyBAQAogfQogCiAvKiBTZXJ2aWNlIGxldmVsIHNlY3VyaXR5ICovCi1zdGF0aWMgaW5saW5lIGludCBsMmNhcF9jaGVja19zZWN1cml0eShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKK2ludCBsMmNhcF9jaGFuX2NoZWNrX3NlY3VyaXR5KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gY2hhbi0+Y29ubjsKIAlfX3U4IGF1dGhfdHlwZTsKQEAgLTU1NiwzNCArNTcxLDU4IEBACiAJCWZsYWdzID0gQUNMX1NUQVJUOwogCiAJYnRfY2Ioc2tiKS0+Zm9yY2VfYWN0aXZlID0gQlRfUE9XRVJfRk9SQ0VfQUNUSVZFX09OOworCXNrYi0+cHJpb3JpdHkgPSBIQ0lfUFJJT19NQVg7CiAKLQloY2lfc2VuZF9hY2woY29ubi0+aGNvbiwgc2tiLCBmbGFncyk7CisJaGNpX3NlbmRfYWNsKGNvbm4tPmhjaGFuLCBza2IsIGZsYWdzKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX3NlbmRfc2ZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1MTYgY29udHJvbCkKK3N0YXRpYyB2b2lkIGwyY2FwX2RvX3NlbmQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGhjaV9jb25uICpoY29uID0gY2hhbi0+Y29ubi0+aGNvbjsKKwl1MTYgZmxhZ3M7CisKKwlCVF9EQkcoImNoYW4gJXAsIHNrYiAlcCBsZW4gJWQgcHJpb3JpdHkgJXUiLCBjaGFuLCBza2IsIHNrYi0+bGVuLAorCQkJCQkJCXNrYi0+cHJpb3JpdHkpOworCisJaWYgKCF0ZXN0X2JpdChGTEFHX0ZMVVNIQUJMRSwgJmNoYW4tPmZsYWdzKSAmJgorCQkJCQlsbXBfbm9fZmx1c2hfY2FwYWJsZShoY29uLT5oZGV2KSkKKwkJZmxhZ3MgPSBBQ0xfU1RBUlRfTk9fRkxVU0g7CisJZWxzZQorCQlmbGFncyA9IEFDTF9TVEFSVDsKKworCWJ0X2NiKHNrYiktPmZvcmNlX2FjdGl2ZSA9IHRlc3RfYml0KEZMQUdfRk9SQ0VfQUNUSVZFLCAmY2hhbi0+ZmxhZ3MpOworCWhjaV9zZW5kX2FjbChjaGFuLT5jb25uLT5oY2hhbiwgc2tiLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9zZW5kX3NmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTMyIGNvbnRyb2wpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgbDJjYXBfaGRyICpsaDsKIAlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGNoYW4tPmNvbm47Ci0JaW50IGNvdW50LCBobGVuID0gTDJDQVBfSERSX1NJWkUgKyAyOwotCXU4IGZsYWdzOworCWludCBjb3VudCwgaGxlbjsKIAogCWlmIChjaGFuLT5zdGF0ZSAhPSBCVF9DT05ORUNURUQpCiAJCXJldHVybjsKIAotCWlmIChjaGFuLT5mY3MgPT0gTDJDQVBfRkNTX0NSQzE2KQotCQlobGVuICs9IDI7CisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCWhsZW4gPSBMMkNBUF9FWFRfSERSX1NJWkU7CisJZWxzZQorCQlobGVuID0gTDJDQVBfRU5IX0hEUl9TSVpFOwogCi0JQlRfREJHKCJjaGFuICVwLCBjb250cm9sIDB4JTIuMngiLCBjaGFuLCBjb250cm9sKTsKKwlpZiAoY2hhbi0+ZmNzID09IEwyQ0FQX0ZDU19DUkMxNikKKwkJaGxlbiArPSBMMkNBUF9GQ1NfU0laRTsKKworCUJUX0RCRygiY2hhbiAlcCwgY29udHJvbCAweCU4Ljh4IiwgY2hhbiwgY29udHJvbCk7CiAKIAljb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgY29ubi0+bXR1LCBobGVuKTsKLQljb250cm9sIHw9IEwyQ0FQX0NUUkxfRlJBTUVfVFlQRTsKKworCWNvbnRyb2wgfD0gX19zZXRfc2ZyYW1lKGNoYW4pOwogCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDT05OX1NFTkRfRkJJVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQotCQljb250cm9sIHw9IEwyQ0FQX0NUUkxfRklOQUw7CisJCWNvbnRyb2wgfD0gX19zZXRfY3RybF9maW5hbChjaGFuKTsKIAogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9TRU5EX1BCSVQsICZjaGFuLT5jb25uX3N0YXRlKSkKLQkJY29udHJvbCB8PSBMMkNBUF9DVFJMX1BPTEw7CisJCWNvbnRyb2wgfD0gX19zZXRfY3RybF9wb2xsKGNoYW4pOwogCiAJc2tiID0gYnRfc2tiX2FsbG9jKGNvdW50LCBHRlBfQVRPTUlDKTsKIAlpZiAoIXNrYikKQEAgLTU5MiwzMiArNjMxLDI3IEBACiAJbGggPSAoc3RydWN0IGwyY2FwX2hkciAqKSBza2JfcHV0KHNrYiwgTDJDQVBfSERSX1NJWkUpOwogCWxoLT5sZW4gPSBjcHVfdG9fbGUxNihobGVuIC0gTDJDQVBfSERSX1NJWkUpOwogCWxoLT5jaWQgPSBjcHVfdG9fbGUxNihjaGFuLT5kY2lkKTsKLQlwdXRfdW5hbGlnbmVkX2xlMTYoY29udHJvbCwgc2tiX3B1dChza2IsIDIpKTsKKworCV9fcHV0X2NvbnRyb2woY2hhbiwgY29udHJvbCwgc2tiX3B1dChza2IsIF9fY3RybF9zaXplKGNoYW4pKSk7CiAKIAlpZiAoY2hhbi0+ZmNzID09IEwyQ0FQX0ZDU19DUkMxNikgewotCQl1MTYgZmNzID0gY3JjMTYoMCwgKHU4ICopbGgsIGNvdW50IC0gMik7Ci0JCXB1dF91bmFsaWduZWRfbGUxNihmY3MsIHNrYl9wdXQoc2tiLCAyKSk7CisJCXUxNiBmY3MgPSBjcmMxNigwLCAodTggKilsaCwgY291bnQgLSBMMkNBUF9GQ1NfU0laRSk7CisJCXB1dF91bmFsaWduZWRfbGUxNihmY3MsIHNrYl9wdXQoc2tiLCBMMkNBUF9GQ1NfU0laRSkpOwogCX0KIAotCWlmIChsbXBfbm9fZmx1c2hfY2FwYWJsZShjb25uLT5oY29uLT5oZGV2KSkKLQkJZmxhZ3MgPSBBQ0xfU1RBUlRfTk9fRkxVU0g7Ci0JZWxzZQotCQlmbGFncyA9IEFDTF9TVEFSVDsKLQotCWJ0X2NiKHNrYiktPmZvcmNlX2FjdGl2ZSA9IGNoYW4tPmZvcmNlX2FjdGl2ZTsKLQotCWhjaV9zZW5kX2FjbChjaGFuLT5jb25uLT5oY29uLCBza2IsIGZsYWdzKTsKKwlza2ItPnByaW9yaXR5ID0gSENJX1BSSU9fTUFYOworCWwyY2FwX2RvX3NlbmQoY2hhbiwgc2tiKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX3NlbmRfcnJfb3Jfcm5yKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1MTYgY29udHJvbCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9zZW5kX3JyX29yX3JucihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTMyIGNvbnRyb2wpCiB7CiAJaWYgKHRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7Ci0JCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX05PVF9SRUFEWTsKKwkJY29udHJvbCB8PSBfX3NldF9jdHJsX3N1cGVyKGNoYW4sIEwyQ0FQX1NVUEVSX1JOUik7CiAJCXNldF9iaXQoQ09OTl9STlJfU0VOVCwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCX0gZWxzZQotCQljb250cm9sIHw9IEwyQ0FQX1NVUEVSX1JDVl9SRUFEWTsKKwkJY29udHJvbCB8PSBfX3NldF9jdHJsX3N1cGVyKGNoYW4sIEwyQ0FQX1NVUEVSX1JSKTsKIAotCWNvbnRyb2wgfD0gY2hhbi0+YnVmZmVyX3NlcSA8PCBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVDsKKwljb250cm9sIHw9IF9fc2V0X3JlcXNlcShjaGFuLCBjaGFuLT5idWZmZXJfc2VxKTsKIAogCWwyY2FwX3NlbmRfc2ZyYW1lKGNoYW4sIGNvbnRyb2wpOwogfQpAQCAtNjM1LDcgKzY2OSw3IEBACiAJCWlmICghKGNvbm4tPmluZm9fc3RhdGUgJiBMMkNBUF9JTkZPX0ZFQVRfTUFTS19SRVFfRE9ORSkpCiAJCQlyZXR1cm47CiAKLQkJaWYgKGwyY2FwX2NoZWNrX3NlY3VyaXR5KGNoYW4pICYmCisJCWlmIChsMmNhcF9jaGFuX2NoZWNrX3NlY3VyaXR5KGNoYW4pICYmCiAJCQkJX19sMmNhcF9ub19jb25uX3BlbmRpbmcoY2hhbikpIHsKIAkJCXN0cnVjdCBsMmNhcF9jb25uX3JlcSByZXE7CiAJCQlyZXEuc2NpZCA9IGNwdV90b19sZTE2KGNoYW4tPnNjaWQpOwpAQCAtNjU0LDcgKzY4OCw3IEBACiAJCWNvbm4tPmluZm9fc3RhdGUgfD0gTDJDQVBfSU5GT19GRUFUX01BU0tfUkVRX1NFTlQ7CiAJCWNvbm4tPmluZm9faWRlbnQgPSBsMmNhcF9nZXRfaWRlbnQoY29ubik7CiAKLQkJbW9kX3RpbWVyKCZjb25uLT5pbmZvX3RpbWVyLCBqaWZmaWVzICsKKwkJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZjb25uLT5pbmZvX3RpbWVyLAogCQkJCQltc2Vjc190b19qaWZmaWVzKEwyQ0FQX0lORk9fVElNRU9VVCkpOwogCiAJCWwyY2FwX3NlbmRfY21kKGNvbm4sIGNvbm4tPmluZm9faWRlbnQsCkBAIC03MDYsMTMgKzc0MCwxMyBAQAogLyogLS0tLSBMMkNBUCBjb25uZWN0aW9ucyAtLS0tICovCiBzdGF0aWMgdm9pZCBsMmNhcF9jb25uX3N0YXJ0KHN0cnVjdCBsMmNhcF9jb25uICpjb25uKQogewotCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCAqdG1wOworCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuOwogCiAJQlRfREJHKCJjb25uICVwIiwgY29ubik7CiAKLQlyZWFkX2xvY2soJmNvbm4tPmNoYW5fbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNoYW4sIHRtcCwgJmNvbm4tPmNoYW5fbCwgbGlzdCkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNoYW4sICZjb25uLT5jaGFuX2wsIGxpc3QpIHsKIAkJc3RydWN0IHNvY2sgKnNrID0gY2hhbi0+c2s7CiAKIAkJYmhfbG9ja19zb2NrKHNrKTsKQEAgLTcyNSw3ICs3NTksNyBAQAogCQlpZiAoY2hhbi0+c3RhdGUgPT0gQlRfQ09OTkVDVCkgewogCQkJc3RydWN0IGwyY2FwX2Nvbm5fcmVxIHJlcTsKIAotCQkJaWYgKCFsMmNhcF9jaGVja19zZWN1cml0eShjaGFuKSB8fAorCQkJaWYgKCFsMmNhcF9jaGFuX2NoZWNrX3NlY3VyaXR5KGNoYW4pIHx8CiAJCQkJCSFfX2wyY2FwX25vX2Nvbm5fcGVuZGluZyhjaGFuKSkgewogCQkJCWJoX3VubG9ja19zb2NrKHNrKTsKIAkJCQljb250aW51ZTsKQEAgLTczNiw5ICs3NzAsNyBAQAogCQkJCQkmY2hhbi0+Y29uZl9zdGF0ZSkpIHsKIAkJCQkvKiBsMmNhcF9jaGFuX2Nsb3NlKCkgY2FsbHMgbGlzdF9kZWwoY2hhbikKIAkJCQkgKiBzbyByZWxlYXNlIHRoZSBsb2NrICovCi0JCQkJcmVhZF91bmxvY2soJmNvbm4tPmNoYW5fbG9jayk7CiAJCQkJbDJjYXBfY2hhbl9jbG9zZShjaGFuLCBFQ09OTlJFU0VUKTsKLQkJCQlyZWFkX2xvY2soJmNvbm4tPmNoYW5fbG9jayk7CiAJCQkJYmhfdW5sb2NrX3NvY2soc2spOwogCQkJCWNvbnRpbnVlOwogCQkJfQpAQCAtNzU4LDcgKzc5MCw3IEBACiAJCQlyc3Auc2NpZCA9IGNwdV90b19sZTE2KGNoYW4tPmRjaWQpOwogCQkJcnNwLmRjaWQgPSBjcHVfdG9fbGUxNihjaGFuLT5zY2lkKTsKIAotCQkJaWYgKGwyY2FwX2NoZWNrX3NlY3VyaXR5KGNoYW4pKSB7CisJCQlpZiAobDJjYXBfY2hhbl9jaGVja19zZWN1cml0eShjaGFuKSkgewogCQkJCWlmIChidF9zayhzayktPmRlZmVyX3NldHVwKSB7CiAJCQkJCXN0cnVjdCBzb2NrICpwYXJlbnQgPSBidF9zayhzayktPnBhcmVudDsKIAkJCQkJcnNwLnJlc3VsdCA9IGNwdV90b19sZTE2KEwyQ0FQX0NSX1BFTkQpOwpAQCAtNzk0LDcgKzgyNiw3IEBACiAJCWJoX3VubG9ja19zb2NrKHNrKTsKIAl9CiAKLQlyZWFkX3VubG9jaygmY29ubi0+Y2hhbl9sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAogLyogRmluZCBzb2NrZXQgd2l0aCBjaWQgYW5kIHNvdXJjZSBiZGFkZHIuCkBAIC04NDUsNyArODc3LDcgQEAKIAogCXBhcmVudCA9IHBjaGFuLT5zazsKIAotCWJoX2xvY2tfc29jayhwYXJlbnQpOworCWxvY2tfc29jayhwYXJlbnQpOwogCiAJLyogQ2hlY2sgZm9yIGJhY2tsb2cgc2l6ZSAqLwogCWlmIChza19hY2NlcHRxX2lzX2Z1bGwocGFyZW50KSkgewpAQCAtODU5LDggKzg5MSw2IEBACiAKIAlzayA9IGNoYW4tPnNrOwogCi0Jd3JpdGVfbG9ja19iaCgmY29ubi0+Y2hhbl9sb2NrKTsKLQogCWhjaV9jb25uX2hvbGQoY29ubi0+aGNvbik7CiAKIAliYWNweSgmYnRfc2soc2spLT5zcmMsIGNvbm4tPnNyYyk7CkBAIC04NjgsMTcgKzg5OCwxNSBAQAogCiAJYnRfYWNjZXB0X2VucXVldWUocGFyZW50LCBzayk7CiAKLQlfX2wyY2FwX2NoYW5fYWRkKGNvbm4sIGNoYW4pOworCWwyY2FwX2NoYW5fYWRkKGNvbm4sIGNoYW4pOwogCiAJX19zZXRfY2hhbl90aW1lcihjaGFuLCBzay0+c2tfc25kdGltZW8pOwogCiAJbDJjYXBfc3RhdGVfY2hhbmdlKGNoYW4sIEJUX0NPTk5FQ1RFRCk7CiAJcGFyZW50LT5za19kYXRhX3JlYWR5KHBhcmVudCwgMCk7CiAKLQl3cml0ZV91bmxvY2tfYmgoJmNvbm4tPmNoYW5fbG9jayk7Ci0KIGNsZWFuOgotCWJoX3VubG9ja19zb2NrKHBhcmVudCk7CisJcmVsZWFzZV9zb2NrKHBhcmVudCk7CiB9CiAKIHN0YXRpYyB2b2lkIGwyY2FwX2NoYW5fcmVhZHkoc3RydWN0IHNvY2sgKnNrKQpAQCAtOTEwLDkgKzkzOCw5IEBACiAJaWYgKGNvbm4tPmhjb24tPm91dCAmJiBjb25uLT5oY29uLT50eXBlID09IExFX0xJTkspCiAJCXNtcF9jb25uX3NlY3VyaXR5KGNvbm4sIGNvbm4tPmhjb24tPnBlbmRpbmdfc2VjX2xldmVsKTsKIAotCXJlYWRfbG9jaygmY29ubi0+Y2hhbl9sb2NrKTsKKwlyY3VfcmVhZF9sb2NrKCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNoYW4sICZjb25uLT5jaGFuX2wsIGxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjaGFuLCAmY29ubi0+Y2hhbl9sLCBsaXN0KSB7CiAJCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tPnNrOwogCiAJCWJoX2xvY2tfc29jayhzayk7CkBAIC05MzIsNyArOTYwLDcgQEAKIAkJYmhfdW5sb2NrX3NvY2soc2spOwogCX0KIAotCXJlYWRfdW5sb2NrKCZjb25uLT5jaGFuX2xvY2spOworCXJjdV9yZWFkX3VubG9jaygpOwogfQogCiAvKiBOb3RpZnkgc29ja2V0cyB0aGF0IHdlIGNhbm5vdCBndWFyYW50eSByZWxpYWJpbGl0eSBhbnltb3JlICovCkBAIC05NDIsMjEgKzk3MCwyMiBAQAogCiAJQlRfREJHKCJjb25uICVwIiwgY29ubik7CiAKLQlyZWFkX2xvY2soJmNvbm4tPmNoYW5fbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmY29ubi0+Y2hhbl9sLCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2hhbiwgJmNvbm4tPmNoYW5fbCwgbGlzdCkgewogCQlzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLT5zazsKIAotCQlpZiAoY2hhbi0+Zm9yY2VfcmVsaWFibGUpCisJCWlmICh0ZXN0X2JpdChGTEFHX0ZPUkNFX1JFTElBQkxFLCAmY2hhbi0+ZmxhZ3MpKQogCQkJc2stPnNrX2VyciA9IGVycjsKIAl9CiAKLQlyZWFkX3VubG9jaygmY29ubi0+Y2hhbl9sb2NrKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKIH0KIAotc3RhdGljIHZvaWQgbDJjYXBfaW5mb190aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIHZvaWQgbDJjYXBfaW5mb190aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9ICh2b2lkICopIGFyZzsKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbDJjYXBfY29ubiwKKwkJCQkJCQlpbmZvX3RpbWVyLndvcmspOwogCiAJY29ubi0+aW5mb19zdGF0ZSB8PSBMMkNBUF9JTkZPX0ZFQVRfTUFTS19SRVFfRE9ORTsKIAljb25uLT5pbmZvX2lkZW50ID0gMDsKQEAgLTk4MCwxNyArMTAwOSwxOSBAQAogCS8qIEtpbGwgY2hhbm5lbHMgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY2hhbiwgbCwgJmNvbm4tPmNoYW5fbCwgbGlzdCkgewogCQlzayA9IGNoYW4tPnNrOwotCQliaF9sb2NrX3NvY2soc2spOworCQlsb2NrX3NvY2soc2spOwogCQlsMmNhcF9jaGFuX2RlbChjaGFuLCBlcnIpOwotCQliaF91bmxvY2tfc29jayhzayk7CisJCXJlbGVhc2Vfc29jayhzayk7CiAJCWNoYW4tPm9wcy0+Y2xvc2UoY2hhbi0+ZGF0YSk7CiAJfQogCisJaGNpX2NoYW5fZGVsKGNvbm4tPmhjaGFuKTsKKwogCWlmIChjb25uLT5pbmZvX3N0YXRlICYgTDJDQVBfSU5GT19GRUFUX01BU0tfUkVRX1NFTlQpCi0JCWRlbF90aW1lcl9zeW5jKCZjb25uLT5pbmZvX3RpbWVyKTsKKwkJX19jYW5jZWxfZGVsYXllZF93b3JrKCZjb25uLT5pbmZvX3RpbWVyKTsKIAogCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX0NPTk5fTEVfU01QX1BFTkQsICZoY29uLT5wZW5kKSkgewotCQlkZWxfdGltZXIoJmNvbm4tPnNlY3VyaXR5X3RpbWVyKTsKKwkJX19jYW5jZWxfZGVsYXllZF93b3JrKCZjb25uLT5zZWN1cml0eV90aW1lcik7CiAJCXNtcF9jaGFuX2Rlc3Ryb3koY29ubik7CiAJfQogCkBAIC05OTgsOSArMTAyOSwxMCBAQAogCWtmcmVlKGNvbm4pOwogfQogCi1zdGF0aWMgdm9pZCBzZWN1cml0eV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIHZvaWQgc2VjdXJpdHlfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7Ci0Jc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSAodm9pZCAqKSBhcmc7CisJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGwyY2FwX2Nvbm4sCisJCQkJCQlzZWN1cml0eV90aW1lci53b3JrKTsKIAogCWwyY2FwX2Nvbm5fZGVsKGNvbm4tPmhjb24sIEVUSU1FRE9VVCk7CiB9CkBAIC0xMDA4LDE4ICsxMDQwLDI2IEBACiBzdGF0aWMgc3RydWN0IGwyY2FwX2Nvbm4gKmwyY2FwX2Nvbm5fYWRkKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzKQogewogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gaGNvbi0+bDJjYXBfZGF0YTsKKwlzdHJ1Y3QgaGNpX2NoYW4gKmhjaGFuOwogCiAJaWYgKGNvbm4gfHwgc3RhdHVzKQogCQlyZXR1cm4gY29ubjsKIAotCWNvbm4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbDJjYXBfY29ubiksIEdGUF9BVE9NSUMpOwotCWlmICghY29ubikKKwloY2hhbiA9IGhjaV9jaGFuX2NyZWF0ZShoY29uKTsKKwlpZiAoIWhjaGFuKQogCQlyZXR1cm4gTlVMTDsKIAorCWNvbm4gPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbDJjYXBfY29ubiksIEdGUF9BVE9NSUMpOworCWlmICghY29ubikgeworCQloY2lfY2hhbl9kZWwoaGNoYW4pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKIAloY29uLT5sMmNhcF9kYXRhID0gY29ubjsKIAljb25uLT5oY29uID0gaGNvbjsKKwljb25uLT5oY2hhbiA9IGhjaGFuOwogCi0JQlRfREJHKCJoY29uICVwIGNvbm4gJXAiLCBoY29uLCBjb25uKTsKKwlCVF9EQkcoImhjb24gJXAgY29ubiAlcCBoY2hhbiAlcCIsIGhjb24sIGNvbm4sIGhjaGFuKTsKIAogCWlmIChoY29uLT5oZGV2LT5sZV9tdHUgJiYgaGNvbi0+dHlwZSA9PSBMRV9MSU5LKQogCQljb25uLT5tdHUgPSBoY29uLT5oZGV2LT5sZV9tdHU7CkBAIC0xMDMyLDI5ICsxMDcyLDE5IEBACiAJY29ubi0+ZmVhdF9tYXNrID0gMDsKIAogCXNwaW5fbG9ja19pbml0KCZjb25uLT5sb2NrKTsKLQlyd2xvY2tfaW5pdCgmY29ubi0+Y2hhbl9sb2NrKTsKIAogCUlOSVRfTElTVF9IRUFEKCZjb25uLT5jaGFuX2wpOwogCiAJaWYgKGhjb24tPnR5cGUgPT0gTEVfTElOSykKLQkJc2V0dXBfdGltZXIoJmNvbm4tPnNlY3VyaXR5X3RpbWVyLCBzZWN1cml0eV90aW1lb3V0LAotCQkJCQkJKHVuc2lnbmVkIGxvbmcpIGNvbm4pOworCQlJTklUX0RFTEFZRURfV09SSygmY29ubi0+c2VjdXJpdHlfdGltZXIsIHNlY3VyaXR5X3RpbWVvdXQpOwogCWVsc2UKLQkJc2V0dXBfdGltZXIoJmNvbm4tPmluZm9fdGltZXIsIGwyY2FwX2luZm9fdGltZW91dCwKLQkJCQkJCSh1bnNpZ25lZCBsb25nKSBjb25uKTsKKwkJSU5JVF9ERUxBWUVEX1dPUksoJmNvbm4tPmluZm9fdGltZXIsIGwyY2FwX2luZm9fdGltZW91dCk7CiAKLQljb25uLT5kaXNjX3JlYXNvbiA9IDB4MTM7CisJY29ubi0+ZGlzY19yZWFzb24gPSBIQ0lfRVJST1JfUkVNT1RFX1VTRVJfVEVSTTsKIAogCXJldHVybiBjb25uOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfY2hhbl9hZGQoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQotewotCXdyaXRlX2xvY2tfYmgoJmNvbm4tPmNoYW5fbG9jayk7Ci0JX19sMmNhcF9jaGFuX2FkZChjb25uLCBjaGFuKTsKLQl3cml0ZV91bmxvY2tfYmgoJmNvbm4tPmNoYW5fbG9jayk7Ci19Ci0KIC8qIC0tLS0gU29ja2V0IGludGVyZmFjZSAtLS0tICovCiAKIC8qIEZpbmQgc29ja2V0IHdpdGggcHNtIGFuZCBzb3VyY2UgYmRhZGRyLgpAQCAtMTA5MCwxMSArMTEyMCwxMCBAQAogCXJldHVybiBjMTsKIH0KIAotaW50IGwyY2FwX2NoYW5fY29ubmVjdChzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKK2lubGluZSBpbnQgbDJjYXBfY2hhbl9jb25uZWN0KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBfX2xlMTYgcHNtLCB1MTYgY2lkLCBiZGFkZHJfdCAqZHN0KQogewogCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tPnNrOwogCWJkYWRkcl90ICpzcmMgPSAmYnRfc2soc2spLT5zcmM7Ci0JYmRhZGRyX3QgKmRzdCA9ICZidF9zayhzayktPmRzdDsKIAlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubjsKIAlzdHJ1Y3QgaGNpX2Nvbm4gKmhjb247CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7CkBAIC0xMTA4LDcgKzExMzcsNjIgQEAKIAlpZiAoIWhkZXYpCiAJCXJldHVybiAtRUhPU1RVTlJFQUNIOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCWxvY2tfc29jayhzayk7CisKKwkvKiBQU00gbXVzdCBiZSBvZGQgYW5kIGxzYiBvZiB1cHBlciBieXRlIG11c3QgYmUgMCAqLworCWlmICgoX19sZTE2X3RvX2NwdShwc20pICYgMHgwMTAxKSAhPSAweDAwMDEgJiYgIWNpZCAmJgorCQkJCQljaGFuLT5jaGFuX3R5cGUgIT0gTDJDQVBfQ0hBTl9SQVcpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCWlmIChjaGFuLT5jaGFuX3R5cGUgPT0gTDJDQVBfQ0hBTl9DT05OX09SSUVOVEVEICYmICEocHNtIHx8IGNpZCkpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBkb25lOworCX0KKworCXN3aXRjaCAoY2hhbi0+bW9kZSkgeworCWNhc2UgTDJDQVBfTU9ERV9CQVNJQzoKKwkJYnJlYWs7CisJY2FzZSBMMkNBUF9NT0RFX0VSVE06CisJY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKKwkJaWYgKCFkaXNhYmxlX2VydG0pCisJCQlicmVhazsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJZGVmYXVsdDoKKwkJZXJyID0gLUVOT1RTVVBQOworCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKKwljYXNlIEJUX0NPTk5FQ1Q6CisJY2FzZSBCVF9DT05ORUNUMjoKKwljYXNlIEJUX0NPTkZJRzoKKwkJLyogQWxyZWFkeSBjb25uZWN0aW5nICovCisJCWVyciA9IDA7CisJCWdvdG8gZG9uZTsKKworCWNhc2UgQlRfQ09OTkVDVEVEOgorCQkvKiBBbHJlYWR5IGNvbm5lY3RlZCAqLworCQllcnIgPSAtRUlTQ09OTjsKKwkJZ290byBkb25lOworCisJY2FzZSBCVF9PUEVOOgorCWNhc2UgQlRfQk9VTkQ6CisJCS8qIENhbiBjb25uZWN0ICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyID0gLUVCQURGRDsKKwkJZ290byBkb25lOworCX0KKworCS8qIFNldCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBwc20gKi8KKwliYWNweSgmYnRfc2soc2spLT5kc3QsIHNyYyk7CisJY2hhbi0+cHNtID0gcHNtOworCWNoYW4tPmRjaWQgPSBjaWQ7CiAKIAlhdXRoX3R5cGUgPSBsMmNhcF9nZXRfYXV0aF90eXBlKGNoYW4pOwogCkBAIC0xMTQyLDcgKzEyMjYsNyBAQAogCWlmIChoY29uLT5zdGF0ZSA9PSBCVF9DT05ORUNURUQpIHsKIAkJaWYgKGNoYW4tPmNoYW5fdHlwZSAhPSBMMkNBUF9DSEFOX0NPTk5fT1JJRU5URUQpIHsKIAkJCV9fY2xlYXJfY2hhbl90aW1lcihjaGFuKTsKLQkJCWlmIChsMmNhcF9jaGVja19zZWN1cml0eShjaGFuKSkKKwkJCWlmIChsMmNhcF9jaGFuX2NoZWNrX3NlY3VyaXR5KGNoYW4pKQogCQkJCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLCBCVF9DT05ORUNURUQpOwogCQl9IGVsc2UKIAkJCWwyY2FwX2RvX3N0YXJ0KGNoYW4pOwpAQCAtMTE1MSw3ICsxMjM1LDcgQEAKIAllcnIgPSAwOwogCiBkb25lOgotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCXJldHVybiBlcnI7CiB9CkBAIC0xMTg4LDE3ICsxMjcyLDE4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHZvaWQgbDJjYXBfbW9uaXRvcl90aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIHZvaWQgbDJjYXBfbW9uaXRvcl90aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9ICh2b2lkICopIGFyZzsKKwlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbDJjYXBfY2hhbiwKKwkJCQkJCQltb25pdG9yX3RpbWVyLndvcmspOwogCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tPnNrOwogCiAJQlRfREJHKCJjaGFuICVwIiwgY2hhbik7CiAKLQliaF9sb2NrX3NvY2soc2spOworCWxvY2tfc29jayhzayk7CiAJaWYgKGNoYW4tPnJldHJ5X2NvdW50ID49IGNoYW4tPnJlbW90ZV9tYXhfdHgpIHsKIAkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjaGFuLT5jb25uLCBjaGFuLCBFQ09OTkFCT1JURUQpOwotCQliaF91bmxvY2tfc29jayhzayk7CisJCXJlbGVhc2Vfc29jayhzayk7CiAJCXJldHVybjsKIAl9CiAKQEAgLTEyMDYsMjQgKzEyOTEsMjUgQEAKIAlfX3NldF9tb25pdG9yX3RpbWVyKGNoYW4pOwogCiAJbDJjYXBfc2VuZF9ycl9vcl9ybnIoY2hhbiwgTDJDQVBfQ1RSTF9QT0xMKTsKLQliaF91bmxvY2tfc29jayhzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKIH0KIAotc3RhdGljIHZvaWQgbDJjYXBfcmV0cmFuc190aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIHZvaWQgbDJjYXBfcmV0cmFuc190aW1lb3V0KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKLQlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9ICh2b2lkICopIGFyZzsKKwlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbDJjYXBfY2hhbiwKKwkJCQkJCQlyZXRyYW5zX3RpbWVyLndvcmspOwogCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tPnNrOwogCiAJQlRfREJHKCJjaGFuICVwIiwgY2hhbik7CiAKLQliaF9sb2NrX3NvY2soc2spOworCWxvY2tfc29jayhzayk7CiAJY2hhbi0+cmV0cnlfY291bnQgPSAxOwogCV9fc2V0X21vbml0b3JfdGltZXIoY2hhbik7CiAKIAlzZXRfYml0KENPTk5fV0FJVF9GLCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAKIAlsMmNhcF9zZW5kX3JyX29yX3JucihjaGFuLCBMMkNBUF9DVFJMX1BPTEwpOwotCWJoX3VubG9ja19zb2NrKHNrKTsKKwlyZWxlYXNlX3NvY2soc2spOwogfQogCiBzdGF0aWMgdm9pZCBsMmNhcF9kcm9wX2Fja2VkX2ZyYW1lcyhzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKQEAgLTEyNDUsNjAgKzEzMzEsNDYgQEAKIAkJX19jbGVhcl9yZXRyYW5zX3RpbWVyKGNoYW4pOwogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9kb19zZW5kKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBoY2lfY29ubiAqaGNvbiA9IGNoYW4tPmNvbm4tPmhjb247Ci0JdTE2IGZsYWdzOwotCi0JQlRfREJHKCJjaGFuICVwLCBza2IgJXAgbGVuICVkIiwgY2hhbiwgc2tiLCBza2ItPmxlbik7Ci0KLQlpZiAoIWNoYW4tPmZsdXNoYWJsZSAmJiBsbXBfbm9fZmx1c2hfY2FwYWJsZShoY29uLT5oZGV2KSkKLQkJZmxhZ3MgPSBBQ0xfU1RBUlRfTk9fRkxVU0g7Ci0JZWxzZQotCQlmbGFncyA9IEFDTF9TVEFSVDsKLQotCWJ0X2NiKHNrYiktPmZvcmNlX2FjdGl2ZSA9IGNoYW4tPmZvcmNlX2FjdGl2ZTsKLQloY2lfc2VuZF9hY2woaGNvbiwgc2tiLCBmbGFncyk7Ci19Ci0KIHN0YXRpYyB2b2lkIGwyY2FwX3N0cmVhbWluZ19zZW5kKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTE2IGNvbnRyb2wsIGZjczsKKwl1MzIgY29udHJvbDsKKwl1MTYgZmNzOwogCiAJd2hpbGUgKChza2IgPSBza2JfZGVxdWV1ZSgmY2hhbi0+dHhfcSkpKSB7Ci0JCWNvbnRyb2wgPSBnZXRfdW5hbGlnbmVkX2xlMTYoc2tiLT5kYXRhICsgTDJDQVBfSERSX1NJWkUpOwotCQljb250cm9sIHw9IGNoYW4tPm5leHRfdHhfc2VxIDw8IEwyQ0FQX0NUUkxfVFhTRVFfU0hJRlQ7Ci0JCXB1dF91bmFsaWduZWRfbGUxNihjb250cm9sLCBza2ItPmRhdGEgKyBMMkNBUF9IRFJfU0laRSk7CisJCWNvbnRyb2wgPSBfX2dldF9jb250cm9sKGNoYW4sIHNrYi0+ZGF0YSArIEwyQ0FQX0hEUl9TSVpFKTsKKwkJY29udHJvbCB8PSBfX3NldF90eHNlcShjaGFuLCBjaGFuLT5uZXh0X3R4X3NlcSk7CisJCV9fcHV0X2NvbnRyb2woY2hhbiwgY29udHJvbCwgc2tiLT5kYXRhICsgTDJDQVBfSERSX1NJWkUpOwogCiAJCWlmIChjaGFuLT5mY3MgPT0gTDJDQVBfRkNTX0NSQzE2KSB7Ci0JCQlmY3MgPSBjcmMxNigwLCAodTggKilza2ItPmRhdGEsIHNrYi0+bGVuIC0gMik7Ci0JCQlwdXRfdW5hbGlnbmVkX2xlMTYoZmNzLCBza2ItPmRhdGEgKyBza2ItPmxlbiAtIDIpOworCQkJZmNzID0gY3JjMTYoMCwgKHU4ICopc2tiLT5kYXRhLAorCQkJCQkJc2tiLT5sZW4gLSBMMkNBUF9GQ1NfU0laRSk7CisJCQlwdXRfdW5hbGlnbmVkX2xlMTYoZmNzLAorCQkJCQlza2ItPmRhdGEgKyBza2ItPmxlbiAtIEwyQ0FQX0ZDU19TSVpFKTsKIAkJfQogCiAJCWwyY2FwX2RvX3NlbmQoY2hhbiwgc2tiKTsKIAotCQljaGFuLT5uZXh0X3R4X3NlcSA9IChjaGFuLT5uZXh0X3R4X3NlcSArIDEpICUgNjQ7CisJCWNoYW4tPm5leHRfdHhfc2VxID0gX19uZXh0X3NlcShjaGFuLCBjaGFuLT5uZXh0X3R4X3NlcSk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9yZXRyYW5zbWl0X29uZV9mcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTggdHhfc2VxKQorc3RhdGljIHZvaWQgbDJjYXBfcmV0cmFuc21pdF9vbmVfZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUxNiB0eF9zZXEpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnR4X3NrYjsKLQl1MTYgY29udHJvbCwgZmNzOworCXUxNiBmY3M7CisJdTMyIGNvbnRyb2w7CiAKIAlza2IgPSBza2JfcGVlaygmY2hhbi0+dHhfcSk7CiAJaWYgKCFza2IpCiAJCXJldHVybjsKIAotCWRvIHsKLQkJaWYgKGJ0X2NiKHNrYiktPnR4X3NlcSA9PSB0eF9zZXEpCi0JCQlicmVhazsKLQorCXdoaWxlIChidF9jYihza2IpLT50eF9zZXEgIT0gdHhfc2VxKSB7CiAJCWlmIChza2JfcXVldWVfaXNfbGFzdCgmY2hhbi0+dHhfcSwgc2tiKSkKIAkJCXJldHVybjsKIAotCX0gd2hpbGUgKChza2IgPSBza2JfcXVldWVfbmV4dCgmY2hhbi0+dHhfcSwgc2tiKSkpOworCQlza2IgPSBza2JfcXVldWVfbmV4dCgmY2hhbi0+dHhfcSwgc2tiKTsKKwl9CiAKIAlpZiAoY2hhbi0+cmVtb3RlX21heF90eCAmJgogCQkJYnRfY2Ioc2tiKS0+cmV0cmllcyA9PSBjaGFuLT5yZW1vdGVfbWF4X3R4KSB7CkBAIC0xMzA4LDIwICsxMzgwLDIzIEBACiAKIAl0eF9za2IgPSBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKTsKIAlidF9jYihza2IpLT5yZXRyaWVzKys7Ci0JY29udHJvbCA9IGdldF91bmFsaWduZWRfbGUxNih0eF9za2ItPmRhdGEgKyBMMkNBUF9IRFJfU0laRSk7Ci0JY29udHJvbCAmPSBMMkNBUF9DVFJMX1NBUjsKKworCWNvbnRyb2wgPSBfX2dldF9jb250cm9sKGNoYW4sIHR4X3NrYi0+ZGF0YSArIEwyQ0FQX0hEUl9TSVpFKTsKKwljb250cm9sICY9IF9fZ2V0X3Nhcl9tYXNrKGNoYW4pOwogCiAJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChDT05OX1NFTkRfRkJJVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQotCQljb250cm9sIHw9IEwyQ0FQX0NUUkxfRklOQUw7CisJCWNvbnRyb2wgfD0gX19zZXRfY3RybF9maW5hbChjaGFuKTsKIAotCWNvbnRyb2wgfD0gKGNoYW4tPmJ1ZmZlcl9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQpCi0JCQl8ICh0eF9zZXEgPDwgTDJDQVBfQ1RSTF9UWFNFUV9TSElGVCk7CisJY29udHJvbCB8PSBfX3NldF9yZXFzZXEoY2hhbiwgY2hhbi0+YnVmZmVyX3NlcSk7CisJY29udHJvbCB8PSBfX3NldF90eHNlcShjaGFuLCB0eF9zZXEpOwogCi0JcHV0X3VuYWxpZ25lZF9sZTE2KGNvbnRyb2wsIHR4X3NrYi0+ZGF0YSArIEwyQ0FQX0hEUl9TSVpFKTsKKwlfX3B1dF9jb250cm9sKGNoYW4sIGNvbnRyb2wsIHR4X3NrYi0+ZGF0YSArIEwyQ0FQX0hEUl9TSVpFKTsKIAogCWlmIChjaGFuLT5mY3MgPT0gTDJDQVBfRkNTX0NSQzE2KSB7Ci0JCWZjcyA9IGNyYzE2KDAsICh1OCAqKXR4X3NrYi0+ZGF0YSwgdHhfc2tiLT5sZW4gLSAyKTsKLQkJcHV0X3VuYWxpZ25lZF9sZTE2KGZjcywgdHhfc2tiLT5kYXRhICsgdHhfc2tiLT5sZW4gLSAyKTsKKwkJZmNzID0gY3JjMTYoMCwgKHU4ICopdHhfc2tiLT5kYXRhLAorCQkJCQkJdHhfc2tiLT5sZW4gLSBMMkNBUF9GQ1NfU0laRSk7CisJCXB1dF91bmFsaWduZWRfbGUxNihmY3MsCisJCQkJdHhfc2tiLT5kYXRhICsgdHhfc2tiLT5sZW4gLSBMMkNBUF9GQ1NfU0laRSk7CiAJfQogCiAJbDJjYXBfZG9fc2VuZChjaGFuLCB0eF9za2IpOwpAQCAtMTMzMCw3ICsxNDA1LDggQEAKIHN0YXRpYyBpbnQgbDJjYXBfZXJ0bV9zZW5kKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewogCXN0cnVjdCBza19idWZmICpza2IsICp0eF9za2I7Ci0JdTE2IGNvbnRyb2wsIGZjczsKKwl1MTYgZmNzOworCXUzMiBjb250cm9sOwogCWludCBuc2VudCA9IDA7CiAKIAlpZiAoY2hhbi0+c3RhdGUgIT0gQlRfQ09OTkVDVEVEKQpAQCAtMTM0OCwyMCArMTQyNCwyMiBAQAogCiAJCWJ0X2NiKHNrYiktPnJldHJpZXMrKzsKIAotCQljb250cm9sID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHR4X3NrYi0+ZGF0YSArIEwyQ0FQX0hEUl9TSVpFKTsKLQkJY29udHJvbCAmPSBMMkNBUF9DVFJMX1NBUjsKKwkJY29udHJvbCA9IF9fZ2V0X2NvbnRyb2woY2hhbiwgdHhfc2tiLT5kYXRhICsgTDJDQVBfSERSX1NJWkUpOworCQljb250cm9sICY9IF9fZ2V0X3Nhcl9tYXNrKGNoYW4pOwogCiAJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoQ09OTl9TRU5EX0ZCSVQsICZjaGFuLT5jb25uX3N0YXRlKSkKLQkJCWNvbnRyb2wgfD0gTDJDQVBfQ1RSTF9GSU5BTDsKKwkJCWNvbnRyb2wgfD0gX19zZXRfY3RybF9maW5hbChjaGFuKTsKIAotCQljb250cm9sIHw9IChjaGFuLT5idWZmZXJfc2VxIDw8IEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUKQotCQkJCXwgKGNoYW4tPm5leHRfdHhfc2VxIDw8IEwyQ0FQX0NUUkxfVFhTRVFfU0hJRlQpOwotCQlwdXRfdW5hbGlnbmVkX2xlMTYoY29udHJvbCwgdHhfc2tiLT5kYXRhICsgTDJDQVBfSERSX1NJWkUpOworCQljb250cm9sIHw9IF9fc2V0X3JlcXNlcShjaGFuLCBjaGFuLT5idWZmZXJfc2VxKTsKKwkJY29udHJvbCB8PSBfX3NldF90eHNlcShjaGFuLCBjaGFuLT5uZXh0X3R4X3NlcSk7CiAKKwkJX19wdXRfY29udHJvbChjaGFuLCBjb250cm9sLCB0eF9za2ItPmRhdGEgKyBMMkNBUF9IRFJfU0laRSk7CiAKIAkJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpIHsKLQkJCWZjcyA9IGNyYzE2KDAsICh1OCAqKXNrYi0+ZGF0YSwgdHhfc2tiLT5sZW4gLSAyKTsKLQkJCXB1dF91bmFsaWduZWRfbGUxNihmY3MsIHNrYi0+ZGF0YSArIHR4X3NrYi0+bGVuIC0gMik7CisJCQlmY3MgPSBjcmMxNigwLCAodTggKilza2ItPmRhdGEsCisJCQkJCQl0eF9za2ItPmxlbiAtIEwyQ0FQX0ZDU19TSVpFKTsKKwkJCXB1dF91bmFsaWduZWRfbGUxNihmY3MsIHNrYi0+ZGF0YSArCisJCQkJCQl0eF9za2ItPmxlbiAtIEwyQ0FQX0ZDU19TSVpFKTsKIAkJfQogCiAJCWwyY2FwX2RvX3NlbmQoY2hhbiwgdHhfc2tiKTsKQEAgLTEzNjksNyArMTQ0Nyw4IEBACiAJCV9fc2V0X3JldHJhbnNfdGltZXIoY2hhbik7CiAKIAkJYnRfY2Ioc2tiKS0+dHhfc2VxID0gY2hhbi0+bmV4dF90eF9zZXE7Ci0JCWNoYW4tPm5leHRfdHhfc2VxID0gKGNoYW4tPm5leHRfdHhfc2VxICsgMSkgJSA2NDsKKworCQljaGFuLT5uZXh0X3R4X3NlcSA9IF9fbmV4dF9zZXEoY2hhbiwgY2hhbi0+bmV4dF90eF9zZXEpOwogCiAJCWlmIChidF9jYihza2IpLT5yZXRyaWVzID09IDEpCiAJCQljaGFuLT51bmFja2VkX2ZyYW1lcysrOwpAQCAtMTQwMSwxMiArMTQ4MCwxMiBAQAogCiBzdGF0aWMgdm9pZCBsMmNhcF9zZW5kX2FjayhzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKIHsKLQl1MTYgY29udHJvbCA9IDA7CisJdTMyIGNvbnRyb2wgPSAwOwogCi0JY29udHJvbCB8PSBjaGFuLT5idWZmZXJfc2VxIDw8IEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUOworCWNvbnRyb2wgfD0gX19zZXRfcmVxc2VxKGNoYW4sIGNoYW4tPmJ1ZmZlcl9zZXEpOwogCiAJaWYgKHRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7Ci0JCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX05PVF9SRUFEWTsKKwkJY29udHJvbCB8PSBfX3NldF9jdHJsX3N1cGVyKGNoYW4sIEwyQ0FQX1NVUEVSX1JOUik7CiAJCXNldF9iaXQoQ09OTl9STlJfU0VOVCwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCQlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKIAkJcmV0dXJuOwpAQCAtMTQxNSwyMCArMTQ5NCwyMCBAQAogCWlmIChsMmNhcF9lcnRtX3NlbmQoY2hhbikgPiAwKQogCQlyZXR1cm47CiAKLQljb250cm9sIHw9IEwyQ0FQX1NVUEVSX1JDVl9SRUFEWTsKKwljb250cm9sIHw9IF9fc2V0X2N0cmxfc3VwZXIoY2hhbiwgTDJDQVBfU1VQRVJfUlIpOwogCWwyY2FwX3NlbmRfc2ZyYW1lKGNoYW4sIGNvbnRyb2wpOwogfQogCiBzdGF0aWMgdm9pZCBsMmNhcF9zZW5kX3NyZWp0YWlsKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewogCXN0cnVjdCBzcmVqX2xpc3QgKnRhaWw7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAKLQljb250cm9sID0gTDJDQVBfU1VQRVJfU0VMRUNUX1JFSkVDVDsKLQljb250cm9sIHw9IEwyQ0FQX0NUUkxfRklOQUw7CisJY29udHJvbCA9IF9fc2V0X2N0cmxfc3VwZXIoY2hhbiwgTDJDQVBfU1VQRVJfU1JFSik7CisJY29udHJvbCB8PSBfX3NldF9jdHJsX2ZpbmFsKGNoYW4pOwogCiAJdGFpbCA9IGxpc3RfZW50cnkoKCZjaGFuLT5zcmVqX2wpLT5wcmV2LCBzdHJ1Y3Qgc3Jlal9saXN0LCBsaXN0KTsKLQljb250cm9sIHw9IHRhaWwtPnR4X3NlcSA8PCBMMkNBUF9DVFJMX1JFUVNFUV9TSElGVDsKKwljb250cm9sIHw9IF9fc2V0X3JlcXNlcShjaGFuLCB0YWlsLT50eF9zZXEpOwogCiAJbDJjYXBfc2VuZF9zZnJhbWUoY2hhbiwgY29udHJvbCk7CiB9CkBAIC0xNDU2LDYgKzE1MzUsOCBAQAogCQlpZiAobWVtY3B5X2Zyb21pb3ZlYyhza2JfcHV0KCpmcmFnLCBjb3VudCksIG1zZy0+bXNnX2lvdiwgY291bnQpKQogCQkJcmV0dXJuIC1FRkFVTFQ7CiAKKwkJKCpmcmFnKS0+cHJpb3JpdHkgPSBza2ItPnByaW9yaXR5OworCiAJCXNlbnQgKz0gY291bnQ7CiAJCWxlbiAgLT0gY291bnQ7CiAKQEAgLTE0NjUsMTUgKzE1NDYsMTcgQEAKIAlyZXR1cm4gc2VudDsKIH0KIAotc3RhdGljIHN0cnVjdCBza19idWZmICpsMmNhcF9jcmVhdGVfY29ubmxlc3NfcGR1KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4pCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmwyY2FwX2NyZWF0ZV9jb25ubGVzc19wZHUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sCisJCQkJCQlzdHJ1Y3QgbXNnaGRyICptc2csIHNpemVfdCBsZW4sCisJCQkJCQl1MzIgcHJpb3JpdHkpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gY2hhbi0+c2s7CiAJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBjaGFuLT5jb25uOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IGVyciwgY291bnQsIGhsZW4gPSBMMkNBUF9IRFJfU0laRSArIDI7CisJaW50IGVyciwgY291bnQsIGhsZW4gPSBMMkNBUF9IRFJfU0laRSArIEwyQ0FQX1BTTUxFTl9TSVpFOwogCXN0cnVjdCBsMmNhcF9oZHIgKmxoOwogCi0JQlRfREJHKCJzayAlcCBsZW4gJWQiLCBzaywgKGludClsZW4pOworCUJUX0RCRygic2sgJXAgbGVuICVkIHByaW9yaXR5ICV1Iiwgc2ssIChpbnQpbGVuLCBwcmlvcml0eSk7CiAKIAljb3VudCA9IG1pbl90KHVuc2lnbmVkIGludCwgKGNvbm4tPm10dSAtIGhsZW4pLCBsZW4pOwogCXNrYiA9IGJ0X3NrYl9zZW5kX2FsbG9jKHNrLCBjb3VudCArIGhsZW4sCkBAIC0xNDgxLDYgKzE1NjQsOCBAQAogCWlmICghc2tiKQogCQlyZXR1cm4gRVJSX1BUUihlcnIpOwogCisJc2tiLT5wcmlvcml0eSA9IHByaW9yaXR5OworCiAJLyogQ3JlYXRlIEwyQ0FQIGhlYWRlciAqLwogCWxoID0gKHN0cnVjdCBsMmNhcF9oZHIgKikgc2tiX3B1dChza2IsIEwyQ0FQX0hEUl9TSVpFKTsKIAlsaC0+Y2lkID0gY3B1X3RvX2xlMTYoY2hhbi0+ZGNpZCk7CkBAIC0xNDk1LDcgKzE1ODAsOSBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbDJjYXBfY3JlYXRlX2Jhc2ljX3BkdShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuKQorc3RhdGljIHN0cnVjdCBza19idWZmICpsMmNhcF9jcmVhdGVfYmFzaWNfcGR1KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLAorCQkJCQkJc3RydWN0IG1zZ2hkciAqbXNnLCBzaXplX3QgbGVuLAorCQkJCQkJdTMyIHByaW9yaXR5KQogewogCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tPnNrOwogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gY2hhbi0+Y29ubjsKQEAgLTE1MTEsNiArMTU5OCw4IEBACiAJaWYgKCFza2IpCiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAKKwlza2ItPnByaW9yaXR5ID0gcHJpb3JpdHk7CisKIAkvKiBDcmVhdGUgTDJDQVAgaGVhZGVyICovCiAJbGggPSAoc3RydWN0IGwyY2FwX2hkciAqKSBza2JfcHV0KHNrYiwgTDJDQVBfSERSX1NJWkUpOwogCWxoLT5jaWQgPSBjcHVfdG9fbGUxNihjaGFuLT5kY2lkKTsKQEAgLTE1MjYsMTIgKzE2MTUsMTIgQEAKIAogc3RhdGljIHN0cnVjdCBza19idWZmICpsMmNhcF9jcmVhdGVfaWZyYW1lX3BkdShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwKIAkJCQkJCXN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKLQkJCQkJCXUxNiBjb250cm9sLCB1MTYgc2R1bGVuKQorCQkJCQkJdTMyIGNvbnRyb2wsIHUxNiBzZHVsZW4pCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gY2hhbi0+c2s7CiAJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBjaGFuLT5jb25uOwogCXN0cnVjdCBza19idWZmICpza2I7Ci0JaW50IGVyciwgY291bnQsIGhsZW4gPSBMMkNBUF9IRFJfU0laRSArIDI7CisJaW50IGVyciwgY291bnQsIGhsZW47CiAJc3RydWN0IGwyY2FwX2hkciAqbGg7CiAKIAlCVF9EQkcoInNrICVwIGxlbiAlZCIsIHNrLCAoaW50KWxlbik7CkBAIC0xNTM5LDExICsxNjI4LDE2IEBACiAJaWYgKCFjb25uKQogCQlyZXR1cm4gRVJSX1BUUigtRU5PVENPTk4pOwogCisJaWYgKHRlc3RfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncykpCisJCWhsZW4gPSBMMkNBUF9FWFRfSERSX1NJWkU7CisJZWxzZQorCQlobGVuID0gTDJDQVBfRU5IX0hEUl9TSVpFOworCiAJaWYgKHNkdWxlbikKLQkJaGxlbiArPSAyOworCQlobGVuICs9IEwyQ0FQX1NEVUxFTl9TSVpFOwogCiAJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpCi0JCWhsZW4gKz0gMjsKKwkJaGxlbiArPSBMMkNBUF9GQ1NfU0laRTsKIAogCWNvdW50ID0gbWluX3QodW5zaWduZWQgaW50LCAoY29ubi0+bXR1IC0gaGxlbiksIGxlbik7CiAJc2tiID0gYnRfc2tiX3NlbmRfYWxsb2Moc2ssIGNvdW50ICsgaGxlbiwKQEAgLTE1NTUsOSArMTY0OSwxMSBAQAogCWxoID0gKHN0cnVjdCBsMmNhcF9oZHIgKikgc2tiX3B1dChza2IsIEwyQ0FQX0hEUl9TSVpFKTsKIAlsaC0+Y2lkID0gY3B1X3RvX2xlMTYoY2hhbi0+ZGNpZCk7CiAJbGgtPmxlbiA9IGNwdV90b19sZTE2KGxlbiArIChobGVuIC0gTDJDQVBfSERSX1NJWkUpKTsKLQlwdXRfdW5hbGlnbmVkX2xlMTYoY29udHJvbCwgc2tiX3B1dChza2IsIDIpKTsKKworCV9fcHV0X2NvbnRyb2woY2hhbiwgY29udHJvbCwgc2tiX3B1dChza2IsIF9fY3RybF9zaXplKGNoYW4pKSk7CisKIAlpZiAoc2R1bGVuKQotCQlwdXRfdW5hbGlnbmVkX2xlMTYoc2R1bGVuLCBza2JfcHV0KHNrYiwgMikpOworCQlwdXRfdW5hbGlnbmVkX2xlMTYoc2R1bGVuLCBza2JfcHV0KHNrYiwgTDJDQVBfU0RVTEVOX1NJWkUpKTsKIAogCWVyciA9IGwyY2FwX3NrYnVmZl9mcm9taW92ZWMoc2ssIG1zZywgbGVuLCBjb3VudCwgc2tiKTsKIAlpZiAodW5saWtlbHkoZXJyIDwgMCkpIHsKQEAgLTE1NjYsNyArMTY2Miw3IEBACiAJfQogCiAJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpCi0JCXB1dF91bmFsaWduZWRfbGUxNigwLCBza2JfcHV0KHNrYiwgMikpOworCQlwdXRfdW5hbGlnbmVkX2xlMTYoMCwgc2tiX3B1dChza2IsIEwyQ0FQX0ZDU19TSVpFKSk7CiAKIAlidF9jYihza2IpLT5yZXRyaWVzID0gMDsKIAlyZXR1cm4gc2tiOwpAQCAtMTU3NiwxMSArMTY3MiwxMSBAQAogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBzYXJfcXVldWU7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAJc2l6ZV90IHNpemUgPSAwOwogCiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmc2FyX3F1ZXVlKTsKLQljb250cm9sID0gTDJDQVBfU0RVX1NUQVJUOworCWNvbnRyb2wgPSBfX3NldF9jdHJsX3NhcihjaGFuLCBMMkNBUF9TQVJfU1RBUlQpOwogCXNrYiA9IGwyY2FwX2NyZWF0ZV9pZnJhbWVfcGR1KGNoYW4sIG1zZywgY2hhbi0+cmVtb3RlX21wcywgY29udHJvbCwgbGVuKTsKIAlpZiAoSVNfRVJSKHNrYikpCiAJCXJldHVybiBQVFJfRVJSKHNrYik7CkBAIC0xNTkzLDEwICsxNjg5LDEwIEBACiAJCXNpemVfdCBidWZsZW47CiAKIAkJaWYgKGxlbiA+IGNoYW4tPnJlbW90ZV9tcHMpIHsKLQkJCWNvbnRyb2wgPSBMMkNBUF9TRFVfQ09OVElOVUU7CisJCQljb250cm9sID0gX19zZXRfY3RybF9zYXIoY2hhbiwgTDJDQVBfU0FSX0NPTlRJTlVFKTsKIAkJCWJ1ZmxlbiA9IGNoYW4tPnJlbW90ZV9tcHM7CiAJCX0gZWxzZSB7Ci0JCQljb250cm9sID0gTDJDQVBfU0RVX0VORDsKKwkJCWNvbnRyb2wgPSBfX3NldF9jdHJsX3NhcihjaGFuLCBMMkNBUF9TQVJfRU5EKTsKIAkJCWJ1ZmxlbiA9IGxlbjsKIAkJfQogCkBAIC0xNjE3LDE1ICsxNzEzLDE2IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKLWludCBsMmNhcF9jaGFuX3NlbmQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbikKK2ludCBsMmNhcF9jaGFuX3NlbmQoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwKKwkJCQkJCQkJdTMyIHByaW9yaXR5KQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAJaW50IGVycjsKIAogCS8qIENvbm5lY3Rpb25sZXNzIGNoYW5uZWwgKi8KIAlpZiAoY2hhbi0+Y2hhbl90eXBlID09IEwyQ0FQX0NIQU5fQ09OTl9MRVNTKSB7Ci0JCXNrYiA9IGwyY2FwX2NyZWF0ZV9jb25ubGVzc19wZHUoY2hhbiwgbXNnLCBsZW4pOworCQlza2IgPSBsMmNhcF9jcmVhdGVfY29ubmxlc3NfcGR1KGNoYW4sIG1zZywgbGVuLCBwcmlvcml0eSk7CiAJCWlmIChJU19FUlIoc2tiKSkKIAkJCXJldHVybiBQVFJfRVJSKHNrYik7CiAKQEAgLTE2NDAsNyArMTczNyw3IEBACiAJCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJCS8qIENyZWF0ZSBhIGJhc2ljIFBEVSAqLwotCQlza2IgPSBsMmNhcF9jcmVhdGVfYmFzaWNfcGR1KGNoYW4sIG1zZywgbGVuKTsKKwkJc2tiID0gbDJjYXBfY3JlYXRlX2Jhc2ljX3BkdShjaGFuLCBtc2csIGxlbiwgcHJpb3JpdHkpOwogCQlpZiAoSVNfRVJSKHNrYikpCiAJCQlyZXR1cm4gUFRSX0VSUihza2IpOwogCkBAIC0xNjUyLDcgKzE3NDksNyBAQAogCWNhc2UgTDJDQVBfTU9ERV9TVFJFQU1JTkc6CiAJCS8qIEVudGlyZSBTRFUgZml0cyBpbnRvIG9uZSBQRFUgKi8KIAkJaWYgKGxlbiA8PSBjaGFuLT5yZW1vdGVfbXBzKSB7Ci0JCQljb250cm9sID0gTDJDQVBfU0RVX1VOU0VHTUVOVEVEOworCQkJY29udHJvbCA9IF9fc2V0X2N0cmxfc2FyKGNoYW4sIEwyQ0FQX1NBUl9VTlNFR01FTlRFRCk7CiAJCQlza2IgPSBsMmNhcF9jcmVhdGVfaWZyYW1lX3BkdShjaGFuLCBtc2csIGxlbiwgY29udHJvbCwKIAkJCQkJCQkJCTApOwogCQkJaWYgKElTX0VSUihza2IpKQpAQCAtMTcwNCw4ICsxODAxLDkgQEAKIAogCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOwogCi0JcmVhZF9sb2NrKCZjb25uLT5jaGFuX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hhbiwgJmNvbm4tPmNoYW5fbCwgbGlzdCkgeworCXJjdV9yZWFkX2xvY2soKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNoYW4sICZjb25uLT5jaGFuX2wsIGxpc3QpIHsKIAkJc3RydWN0IHNvY2sgKnNrID0gY2hhbi0+c2s7CiAJCWlmIChjaGFuLT5jaGFuX3R5cGUgIT0gTDJDQVBfQ0hBTl9SQVcpCiAJCQljb250aW51ZTsKQEAgLTE3MjAsNyArMTgxOCw4IEBACiAJCWlmIChjaGFuLT5vcHMtPnJlY3YoY2hhbi0+ZGF0YSwgbnNrYikpCiAJCQlrZnJlZV9za2IobnNrYik7CiAJfQotCXJlYWRfdW5sb2NrKCZjb25uLT5jaGFuX2xvY2spOworCisJcmN1X3JlYWRfdW5sb2NrKCk7CiB9CiAKIC8qIC0tLS0gTDJDQVAgc2lnbmFsbGluZyBjb21tYW5kcyAtLS0tICovCkBAIC0xODUwLDM3ICsxOTQ5LDY0IEBACiAJKnB0ciArPSBMMkNBUF9DT05GX09QVF9TSVpFICsgbGVuOwogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9hY2tfdGltZW91dCh1bnNpZ25lZCBsb25nIGFyZykKK3N0YXRpYyB2b2lkIGwyY2FwX2FkZF9vcHRfZWZzKHZvaWQgKipwdHIsIHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewotCXN0cnVjdCBsMmNhcF9jaGFuICpjaGFuID0gKHZvaWQgKikgYXJnOworCXN0cnVjdCBsMmNhcF9jb25mX2VmcyBlZnM7CiAKLQliaF9sb2NrX3NvY2soY2hhbi0+c2spOworCXN3aXRjaCAoY2hhbi0+bW9kZSkgeworCWNhc2UgTDJDQVBfTU9ERV9FUlRNOgorCQllZnMuaWQJCT0gY2hhbi0+bG9jYWxfaWQ7CisJCWVmcy5zdHlwZQk9IGNoYW4tPmxvY2FsX3N0eXBlOworCQllZnMubXNkdQk9IGNwdV90b19sZTE2KGNoYW4tPmxvY2FsX21zZHUpOworCQllZnMuc2R1X2l0aW1lCT0gY3B1X3RvX2xlMzIoY2hhbi0+bG9jYWxfc2R1X2l0aW1lKTsKKwkJZWZzLmFjY19sYXQJPSBjcHVfdG9fbGUzMihMMkNBUF9ERUZBVUxUX0FDQ19MQVQpOworCQllZnMuZmx1c2hfdG8JPSBjcHVfdG9fbGUzMihMMkNBUF9ERUZBVUxUX0ZMVVNIX1RPKTsKKwkJYnJlYWs7CisKKwljYXNlIEwyQ0FQX01PREVfU1RSRUFNSU5HOgorCQllZnMuaWQJCT0gMTsKKwkJZWZzLnN0eXBlCT0gTDJDQVBfU0VSVl9CRVNURUZGT1JUOworCQllZnMubXNkdQk9IGNwdV90b19sZTE2KGNoYW4tPmxvY2FsX21zZHUpOworCQllZnMuc2R1X2l0aW1lCT0gY3B1X3RvX2xlMzIoY2hhbi0+bG9jYWxfc2R1X2l0aW1lKTsKKwkJZWZzLmFjY19sYXQJPSAwOworCQllZnMuZmx1c2hfdG8JPSAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlsMmNhcF9hZGRfY29uZl9vcHQocHRyLCBMMkNBUF9DT05GX0VGUywgc2l6ZW9mKGVmcyksCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcpICZlZnMpOworfQorCitzdGF0aWMgdm9pZCBsMmNhcF9hY2tfdGltZW91dChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4gPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGwyY2FwX2NoYW4sCisJCQkJCQkJYWNrX3RpbWVyLndvcmspOworCisJQlRfREJHKCJjaGFuICVwIiwgY2hhbik7CisKKwlsb2NrX3NvY2soY2hhbi0+c2spOwogCWwyY2FwX3NlbmRfYWNrKGNoYW4pOwotCWJoX3VubG9ja19zb2NrKGNoYW4tPnNrKTsKKwlyZWxlYXNlX3NvY2soY2hhbi0+c2spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfZXJ0bV9pbml0KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewotCXN0cnVjdCBzb2NrICpzayA9IGNoYW4tPnNrOwotCiAJY2hhbi0+ZXhwZWN0ZWRfYWNrX3NlcSA9IDA7CiAJY2hhbi0+dW5hY2tlZF9mcmFtZXMgPSAwOwogCWNoYW4tPmJ1ZmZlcl9zZXEgPSAwOwogCWNoYW4tPm51bV9hY2tlZCA9IDA7CiAJY2hhbi0+ZnJhbWVzX3NlbnQgPSAwOwogCi0Jc2V0dXBfdGltZXIoJmNoYW4tPnJldHJhbnNfdGltZXIsIGwyY2FwX3JldHJhbnNfdGltZW91dCwKLQkJCQkJCQkodW5zaWduZWQgbG9uZykgY2hhbik7Ci0Jc2V0dXBfdGltZXIoJmNoYW4tPm1vbml0b3JfdGltZXIsIGwyY2FwX21vbml0b3JfdGltZW91dCwKLQkJCQkJCQkodW5zaWduZWQgbG9uZykgY2hhbik7Ci0Jc2V0dXBfdGltZXIoJmNoYW4tPmFja190aW1lciwgbDJjYXBfYWNrX3RpbWVvdXQsICh1bnNpZ25lZCBsb25nKSBjaGFuKTsKKwlJTklUX0RFTEFZRURfV09SSygmY2hhbi0+cmV0cmFuc190aW1lciwgbDJjYXBfcmV0cmFuc190aW1lb3V0KTsKKwlJTklUX0RFTEFZRURfV09SSygmY2hhbi0+bW9uaXRvcl90aW1lciwgbDJjYXBfbW9uaXRvcl90aW1lb3V0KTsKKwlJTklUX0RFTEFZRURfV09SSygmY2hhbi0+YWNrX3RpbWVyLCBsMmNhcF9hY2tfdGltZW91dCk7CiAKIAlza2JfcXVldWVfaGVhZF9pbml0KCZjaGFuLT5zcmVqX3EpOwogCiAJSU5JVF9MSVNUX0hFQUQoJmNoYW4tPnNyZWpfbCk7Ci0KLQotCXNrLT5za19iYWNrbG9nX3JjdiA9IGwyY2FwX2VydG1fZGF0YV9yY3Y7CiB9CiAKIHN0YXRpYyBpbmxpbmUgX191OCBsMmNhcF9zZWxlY3RfbW9kZShfX3U4IG1vZGUsIF9fdTE2IHJlbW90ZV9mZWF0X21hc2spCkBAIC0xODk2LDExICsyMDIyLDM2IEBACiAJfQogfQogCitzdGF0aWMgaW5saW5lIGJvb2wgX19sMmNhcF9ld3Nfc3VwcG9ydGVkKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCXJldHVybiBlbmFibGVfaHMgJiYgY2hhbi0+Y29ubi0+ZmVhdF9tYXNrICYgTDJDQVBfRkVBVF9FWFRfV0lORE9XOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgX19sMmNhcF9lZnNfc3VwcG9ydGVkKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCXJldHVybiBlbmFibGVfaHMgJiYgY2hhbi0+Y29ubi0+ZmVhdF9tYXNrICYgTDJDQVBfRkVBVF9FWFRfRkxPVzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX3R4d2luX3NldHVwKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQoreworCWlmIChjaGFuLT50eF93aW4gPiBMMkNBUF9ERUZBVUxUX1RYX1dJTkRPVyAmJgorCQkJCQkJX19sMmNhcF9ld3Nfc3VwcG9ydGVkKGNoYW4pKSB7CisJCS8qIHVzZSBleHRlbmRlZCBjb250cm9sIGZpZWxkICovCisJCXNldF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKTsKKwkJY2hhbi0+dHhfd2luX21heCA9IEwyQ0FQX0RFRkFVTFRfRVhUX1dJTkRPVzsKKwl9IGVsc2UgeworCQljaGFuLT50eF93aW4gPSBtaW5fdCh1MTYsIGNoYW4tPnR4X3dpbiwKKwkJCQkJCUwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XKTsKKwkJY2hhbi0+dHhfd2luX21heCA9IEwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XOworCX0KK30KKwogc3RhdGljIGludCBsMmNhcF9idWlsZF9jb25mX3JlcShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgbDJjYXBfY29uZl9yZXEgKnJlcSA9IGRhdGE7CiAJc3RydWN0IGwyY2FwX2NvbmZfcmZjIHJmYyA9IHsgLm1vZGUgPSBjaGFuLT5tb2RlIH07CiAJdm9pZCAqcHRyID0gcmVxLT5kYXRhOworCXUxNiBzaXplOwogCiAJQlRfREJHKCJjaGFuICVwIiwgY2hhbik7CiAKQEAgLTE5MTMsNiArMjA2NCw5IEBACiAJCWlmICh0ZXN0X2JpdChDT05GX1NUQVRFMl9ERVZJQ0UsICZjaGFuLT5jb25mX3N0YXRlKSkKIAkJCWJyZWFrOwogCisJCWlmIChfX2wyY2FwX2Vmc19zdXBwb3J0ZWQoY2hhbikpCisJCQlzZXRfYml0KEZMQUdfRUZTX0VOQUJMRSwgJmNoYW4tPmZsYWdzKTsKKwogCQkvKiBmYWxsIHRocm91Z2ggKi8KIAlkZWZhdWx0OgogCQljaGFuLT5tb2RlID0gbDJjYXBfc2VsZWN0X21vZGUocmZjLm1vZGUsIGNoYW4tPmNvbm4tPmZlYXRfbWFzayk7CkBAIC0xOTQyLDE3ICsyMDk2LDI3IEBACiAKIAljYXNlIEwyQ0FQX01PREVfRVJUTToKIAkJcmZjLm1vZGUgICAgICAgICAgICA9IEwyQ0FQX01PREVfRVJUTTsKLQkJcmZjLnR4d2luX3NpemUgICAgICA9IGNoYW4tPnR4X3dpbjsKIAkJcmZjLm1heF90cmFuc21pdCAgICA9IGNoYW4tPm1heF90eDsKIAkJcmZjLnJldHJhbnNfdGltZW91dCA9IDA7CiAJCXJmYy5tb25pdG9yX3RpbWVvdXQgPSAwOwotCQlyZmMubWF4X3BkdV9zaXplICAgID0gY3B1X3RvX2xlMTYoTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUpOwotCQlpZiAoTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUgPiBjaGFuLT5jb25uLT5tdHUgLSAxMCkKLQkJCXJmYy5tYXhfcGR1X3NpemUgPSBjcHVfdG9fbGUxNihjaGFuLT5jb25uLT5tdHUgLSAxMCk7CisKKwkJc2l6ZSA9IG1pbl90KHUxNiwgTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUsIGNoYW4tPmNvbm4tPm10dSAtCisJCQkJCQlMMkNBUF9FWFRfSERSX1NJWkUgLQorCQkJCQkJTDJDQVBfU0RVTEVOX1NJWkUgLQorCQkJCQkJTDJDQVBfRkNTX1NJWkUpOworCQlyZmMubWF4X3BkdV9zaXplID0gY3B1X3RvX2xlMTYoc2l6ZSk7CisKKwkJbDJjYXBfdHh3aW5fc2V0dXAoY2hhbik7CisKKwkJcmZjLnR4d2luX3NpemUgPSBtaW5fdCh1MTYsIGNoYW4tPnR4X3dpbiwKKwkJCQkJCUwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XKTsKIAogCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9SRkMsIHNpemVvZihyZmMpLAogCQkJCQkJCSh1bnNpZ25lZCBsb25nKSAmcmZjKTsKIAorCQlpZiAodGVzdF9iaXQoRkxBR19FRlNfRU5BQkxFLCAmY2hhbi0+ZmxhZ3MpKQorCQkJbDJjYXBfYWRkX29wdF9lZnMoJnB0ciwgY2hhbik7CisKIAkJaWYgKCEoY2hhbi0+Y29ubi0+ZmVhdF9tYXNrICYgTDJDQVBfRkVBVF9GQ1MpKQogCQkJYnJlYWs7CiAKQEAgLTE5NjEsNiArMjEyNSwxMCBAQAogCQkJY2hhbi0+ZmNzID0gTDJDQVBfRkNTX05PTkU7CiAJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9GQ1MsIDEsIGNoYW4tPmZjcyk7CiAJCX0KKworCQlpZiAodGVzdF9iaXQoRkxBR19FWFRfQ1RSTCwgJmNoYW4tPmZsYWdzKSkKKwkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0VXUywgMiwKKwkJCQkJCQkJY2hhbi0+dHhfd2luKTsKIAkJYnJlYWs7CiAKIAljYXNlIEwyQ0FQX01PREVfU1RSRUFNSU5HOgpAQCAtMTk2OSwxMyArMjEzNywxOSBAQAogCQlyZmMubWF4X3RyYW5zbWl0ICAgID0gMDsKIAkJcmZjLnJldHJhbnNfdGltZW91dCA9IDA7CiAJCXJmYy5tb25pdG9yX3RpbWVvdXQgPSAwOwotCQlyZmMubWF4X3BkdV9zaXplICAgID0gY3B1X3RvX2xlMTYoTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUpOwotCQlpZiAoTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUgPiBjaGFuLT5jb25uLT5tdHUgLSAxMCkKLQkJCXJmYy5tYXhfcGR1X3NpemUgPSBjcHVfdG9fbGUxNihjaGFuLT5jb25uLT5tdHUgLSAxMCk7CisKKwkJc2l6ZSA9IG1pbl90KHUxNiwgTDJDQVBfREVGQVVMVF9NQVhfUERVX1NJWkUsIGNoYW4tPmNvbm4tPm10dSAtCisJCQkJCQlMMkNBUF9FWFRfSERSX1NJWkUgLQorCQkJCQkJTDJDQVBfU0RVTEVOX1NJWkUgLQorCQkJCQkJTDJDQVBfRkNTX1NJWkUpOworCQlyZmMubWF4X3BkdV9zaXplID0gY3B1X3RvX2xlMTYoc2l6ZSk7CiAKIAkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfUkZDLCBzaXplb2YocmZjKSwKIAkJCQkJCQkodW5zaWduZWQgbG9uZykgJnJmYyk7CiAKKwkJaWYgKHRlc3RfYml0KEZMQUdfRUZTX0VOQUJMRSwgJmNoYW4tPmZsYWdzKSkKKwkJCWwyY2FwX2FkZF9vcHRfZWZzKCZwdHIsIGNoYW4pOworCiAJCWlmICghKGNoYW4tPmNvbm4tPmZlYXRfbWFzayAmIEwyQ0FQX0ZFQVRfRkNTKSkKIAkJCWJyZWFrOwogCkBAIC0yMDAyLDggKzIxNzYsMTEgQEAKIAlpbnQgdHlwZSwgaGludCwgb2xlbjsKIAl1bnNpZ25lZCBsb25nIHZhbDsKIAlzdHJ1Y3QgbDJjYXBfY29uZl9yZmMgcmZjID0geyAubW9kZSA9IEwyQ0FQX01PREVfQkFTSUMgfTsKKwlzdHJ1Y3QgbDJjYXBfY29uZl9lZnMgZWZzOworCXU4IHJlbW90ZV9lZnMgPSAwOwogCXUxNiBtdHUgPSBMMkNBUF9ERUZBVUxUX01UVTsKIAl1MTYgcmVzdWx0ID0gTDJDQVBfQ09ORl9TVUNDRVNTOworCXUxNiBzaXplOwogCiAJQlRfREJHKCJjaGFuICVwIiwgY2hhbik7CiAKQEAgLTIwMzMsNyArMjIxMCwyMiBAQAogCQljYXNlIEwyQ0FQX0NPTkZfRkNTOgogCQkJaWYgKHZhbCA9PSBMMkNBUF9GQ1NfTk9ORSkKIAkJCQlzZXRfYml0KENPTkZfTk9fRkNTX1JFQ1YsICZjaGFuLT5jb25mX3N0YXRlKTsKKwkJCWJyZWFrOwogCisJCWNhc2UgTDJDQVBfQ09ORl9FRlM6CisJCQlyZW1vdGVfZWZzID0gMTsKKwkJCWlmIChvbGVuID09IHNpemVvZihlZnMpKQorCQkJCW1lbWNweSgmZWZzLCAodm9pZCAqKSB2YWwsIG9sZW4pOworCQkJYnJlYWs7CisKKwkJY2FzZSBMMkNBUF9DT05GX0VXUzoKKwkJCWlmICghZW5hYmxlX2hzKQorCQkJCXJldHVybiAtRUNPTk5SRUZVU0VEOworCisJCQlzZXRfYml0KEZMQUdfRVhUX0NUUkwsICZjaGFuLT5mbGFncyk7CisJCQlzZXRfYml0KENPTkZfRVdTX1JFQ1YsICZjaGFuLT5jb25mX3N0YXRlKTsKKwkJCWNoYW4tPnR4X3dpbl9tYXggPSBMMkNBUF9ERUZBVUxUX0VYVF9XSU5ET1c7CisJCQljaGFuLT5yZW1vdGVfdHhfd2luID0gdmFsOwogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKQEAgLTIwNTgsNiArMjI1MCwxMyBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQlpZiAocmVtb3RlX2VmcykgeworCQkJaWYgKF9fbDJjYXBfZWZzX3N1cHBvcnRlZChjaGFuKSkKKwkJCQlzZXRfYml0KEZMQUdfRUZTX0VOQUJMRSwgJmNoYW4tPmZsYWdzKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVDT05OUkVGVVNFRDsKKwkJfQorCiAJCWlmIChjaGFuLT5tb2RlICE9IHJmYy5tb2RlKQogCQkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CiAKQEAgLTIwNzYsNyArMjI3NSw2IEBACiAJCQkJCXNpemVvZihyZmMpLCAodW5zaWduZWQgbG9uZykgJnJmYyk7CiAJfQogCi0KIAlpZiAocmVzdWx0ID09IEwyQ0FQX0NPTkZfU1VDQ0VTUykgewogCQkvKiBDb25maWd1cmUgb3V0cHV0IG9wdGlvbnMgYW5kIGxldCB0aGUgb3RoZXIgc2lkZSBrbm93CiAJCSAqIHdoaWNoIG9uZXMgd2UgZG9uJ3QgbGlrZS4gKi8KQEAgLTIwODksNiArMjI4NywyNiBAQAogCQl9CiAJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX01UVSwgMiwgY2hhbi0+b210dSk7CiAKKwkJaWYgKHJlbW90ZV9lZnMpIHsKKwkJCWlmIChjaGFuLT5sb2NhbF9zdHlwZSAhPSBMMkNBUF9TRVJWX05PVFJBRklDICYmCisJCQkJCWVmcy5zdHlwZSAhPSBMMkNBUF9TRVJWX05PVFJBRklDICYmCisJCQkJCWVmcy5zdHlwZSAhPSBjaGFuLT5sb2NhbF9zdHlwZSkgeworCisJCQkJcmVzdWx0ID0gTDJDQVBfQ09ORl9VTkFDQ0VQVDsKKworCQkJCWlmIChjaGFuLT5udW1fY29uZl9yZXEgPj0gMSkKKwkJCQkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisKKwkJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9FRlMsCisJCQkJCQkJc2l6ZW9mKGVmcyksCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcpICZlZnMpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBTZW5kIFBFTkRJTkcgQ29uZiBSc3AgKi8KKwkJCQlyZXN1bHQgPSBMMkNBUF9DT05GX1BFTkRJTkc7CisJCQkJc2V0X2JpdChDT05GX0xPQ19DT05GX1BFTkQsICZjaGFuLT5jb25mX3N0YXRlKTsKKwkJCX0KKwkJfQorCiAJCXN3aXRjaCAocmZjLm1vZGUpIHsKIAkJY2FzZSBMMkNBUF9NT0RFX0JBU0lDOgogCQkJY2hhbi0+ZmNzID0gTDJDQVBfRkNTX05PTkU7CkBAIC0yMDk2LDEzICsyMzE0LDIwIEBACiAJCQlicmVhazsKIAogCQljYXNlIEwyQ0FQX01PREVfRVJUTToKLQkJCWNoYW4tPnJlbW90ZV90eF93aW4gPSByZmMudHh3aW5fc2l6ZTsKKwkJCWlmICghdGVzdF9iaXQoQ09ORl9FV1NfUkVDViwgJmNoYW4tPmNvbmZfc3RhdGUpKQorCQkJCWNoYW4tPnJlbW90ZV90eF93aW4gPSByZmMudHh3aW5fc2l6ZTsKKwkJCWVsc2UKKwkJCQlyZmMudHh3aW5fc2l6ZSA9IEwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XOworCiAJCQljaGFuLT5yZW1vdGVfbWF4X3R4ID0gcmZjLm1heF90cmFuc21pdDsKIAotCQkJaWYgKGxlMTZfdG9fY3B1KHJmYy5tYXhfcGR1X3NpemUpID4gY2hhbi0+Y29ubi0+bXR1IC0gMTApCi0JCQkJcmZjLm1heF9wZHVfc2l6ZSA9IGNwdV90b19sZTE2KGNoYW4tPmNvbm4tPm10dSAtIDEwKTsKLQotCQkJY2hhbi0+cmVtb3RlX21wcyA9IGxlMTZfdG9fY3B1KHJmYy5tYXhfcGR1X3NpemUpOworCQkJc2l6ZSA9IG1pbl90KHUxNiwgbGUxNl90b19jcHUocmZjLm1heF9wZHVfc2l6ZSksCisJCQkJCQljaGFuLT5jb25uLT5tdHUgLQorCQkJCQkJTDJDQVBfRVhUX0hEUl9TSVpFIC0KKwkJCQkJCUwyQ0FQX1NEVUxFTl9TSVpFIC0KKwkJCQkJCUwyQ0FQX0ZDU19TSVpFKTsKKwkJCXJmYy5tYXhfcGR1X3NpemUgPSBjcHVfdG9fbGUxNihzaXplKTsKKwkJCWNoYW4tPnJlbW90ZV9tcHMgPSBzaXplOwogCiAJCQlyZmMucmV0cmFuc190aW1lb3V0ID0KIAkJCQlsZTE2X3RvX2NwdShMMkNBUF9ERUZBVUxUX1JFVFJBTlNfVE8pOwpAQCAtMjExNCwxMyArMjMzOSwyOSBAQAogCQkJbDJjYXBfYWRkX2NvbmZfb3B0KCZwdHIsIEwyQ0FQX0NPTkZfUkZDLAogCQkJCQlzaXplb2YocmZjKSwgKHVuc2lnbmVkIGxvbmcpICZyZmMpOwogCisJCQlpZiAodGVzdF9iaXQoRkxBR19FRlNfRU5BQkxFLCAmY2hhbi0+ZmxhZ3MpKSB7CisJCQkJY2hhbi0+cmVtb3RlX2lkID0gZWZzLmlkOworCQkJCWNoYW4tPnJlbW90ZV9zdHlwZSA9IGVmcy5zdHlwZTsKKwkJCQljaGFuLT5yZW1vdGVfbXNkdSA9IGxlMTZfdG9fY3B1KGVmcy5tc2R1KTsKKwkJCQljaGFuLT5yZW1vdGVfZmx1c2hfdG8gPQorCQkJCQkJbGUzMl90b19jcHUoZWZzLmZsdXNoX3RvKTsKKwkJCQljaGFuLT5yZW1vdGVfYWNjX2xhdCA9CisJCQkJCQlsZTMyX3RvX2NwdShlZnMuYWNjX2xhdCk7CisJCQkJY2hhbi0+cmVtb3RlX3NkdV9pdGltZSA9CisJCQkJCWxlMzJfdG9fY3B1KGVmcy5zZHVfaXRpbWUpOworCQkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0VGUywKKwkJCQkJc2l6ZW9mKGVmcyksICh1bnNpZ25lZCBsb25nKSAmZWZzKTsKKwkJCX0KIAkJCWJyZWFrOwogCiAJCWNhc2UgTDJDQVBfTU9ERV9TVFJFQU1JTkc6Ci0JCQlpZiAobGUxNl90b19jcHUocmZjLm1heF9wZHVfc2l6ZSkgPiBjaGFuLT5jb25uLT5tdHUgLSAxMCkKLQkJCQlyZmMubWF4X3BkdV9zaXplID0gY3B1X3RvX2xlMTYoY2hhbi0+Y29ubi0+bXR1IC0gMTApOwotCi0JCQljaGFuLT5yZW1vdGVfbXBzID0gbGUxNl90b19jcHUocmZjLm1heF9wZHVfc2l6ZSk7CisJCQlzaXplID0gbWluX3QodTE2LCBsZTE2X3RvX2NwdShyZmMubWF4X3BkdV9zaXplKSwKKwkJCQkJCWNoYW4tPmNvbm4tPm10dSAtCisJCQkJCQlMMkNBUF9FWFRfSERSX1NJWkUgLQorCQkJCQkJTDJDQVBfU0RVTEVOX1NJWkUgLQorCQkJCQkJTDJDQVBfRkNTX1NJWkUpOworCQkJcmZjLm1heF9wZHVfc2l6ZSA9IGNwdV90b19sZTE2KHNpemUpOworCQkJY2hhbi0+cmVtb3RlX21wcyA9IHNpemU7CiAKIAkJCXNldF9iaXQoQ09ORl9NT0RFX0RPTkUsICZjaGFuLT5jb25mX3N0YXRlKTsKIApAQCAtMjE1Miw3ICsyMzkzLDggQEAKIAl2b2lkICpwdHIgPSByZXEtPmRhdGE7CiAJaW50IHR5cGUsIG9sZW47CiAJdW5zaWduZWQgbG9uZyB2YWw7Ci0Jc3RydWN0IGwyY2FwX2NvbmZfcmZjIHJmYzsKKwlzdHJ1Y3QgbDJjYXBfY29uZl9yZmMgcmZjID0geyAubW9kZSA9IEwyQ0FQX01PREVfQkFTSUMgfTsKKwlzdHJ1Y3QgbDJjYXBfY29uZl9lZnMgZWZzOwogCiAJQlRfREJHKCJjaGFuICVwLCByc3AgJXAsIGxlbiAlZCwgcmVxICVwIiwgY2hhbiwgcnNwLCBsZW4sIGRhdGEpOwogCkBAIC0yMTg4LDYgKzI0MzAsMjYgQEAKIAkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX1JGQywKIAkJCQkJc2l6ZW9mKHJmYyksICh1bnNpZ25lZCBsb25nKSAmcmZjKTsKIAkJCWJyZWFrOworCisJCWNhc2UgTDJDQVBfQ09ORl9FV1M6CisJCQljaGFuLT50eF93aW4gPSBtaW5fdCh1MTYsIHZhbCwKKwkJCQkJCUwyQ0FQX0RFRkFVTFRfRVhUX1dJTkRPVyk7CisJCQlsMmNhcF9hZGRfY29uZl9vcHQoJnB0ciwgTDJDQVBfQ09ORl9FV1MsIDIsCisJCQkJCQkJY2hhbi0+dHhfd2luKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTDJDQVBfQ09ORl9FRlM6CisJCQlpZiAob2xlbiA9PSBzaXplb2YoZWZzKSkKKwkJCQltZW1jcHkoJmVmcywgKHZvaWQgKil2YWwsIG9sZW4pOworCisJCQlpZiAoY2hhbi0+bG9jYWxfc3R5cGUgIT0gTDJDQVBfU0VSVl9OT1RSQUZJQyAmJgorCQkJCQllZnMuc3R5cGUgIT0gTDJDQVBfU0VSVl9OT1RSQUZJQyAmJgorCQkJCQllZnMuc3R5cGUgIT0gY2hhbi0+bG9jYWxfc3R5cGUpCisJCQkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisKKwkJCWwyY2FwX2FkZF9jb25mX29wdCgmcHRyLCBMMkNBUF9DT05GX0VGUywKKwkJCQkJc2l6ZW9mKGVmcyksICh1bnNpZ25lZCBsb25nKSAmZWZzKTsKKwkJCWJyZWFrOwogCQl9CiAJfQogCkBAIC0yMTk2LDEzICsyNDU4LDIzIEBACiAKIAljaGFuLT5tb2RlID0gcmZjLm1vZGU7CiAKLQlpZiAoKnJlc3VsdCA9PSBMMkNBUF9DT05GX1NVQ0NFU1MpIHsKKwlpZiAoKnJlc3VsdCA9PSBMMkNBUF9DT05GX1NVQ0NFU1MgfHwgKnJlc3VsdCA9PSBMMkNBUF9DT05GX1BFTkRJTkcpIHsKIAkJc3dpdGNoIChyZmMubW9kZSkgewogCQljYXNlIEwyQ0FQX01PREVfRVJUTToKIAkJCWNoYW4tPnJldHJhbnNfdGltZW91dCA9IGxlMTZfdG9fY3B1KHJmYy5yZXRyYW5zX3RpbWVvdXQpOwogCQkJY2hhbi0+bW9uaXRvcl90aW1lb3V0ID0gbGUxNl90b19jcHUocmZjLm1vbml0b3JfdGltZW91dCk7CiAJCQljaGFuLT5tcHMgICAgPSBsZTE2X3RvX2NwdShyZmMubWF4X3BkdV9zaXplKTsKKworCQkJaWYgKHRlc3RfYml0KEZMQUdfRUZTX0VOQUJMRSwgJmNoYW4tPmZsYWdzKSkgeworCQkJCWNoYW4tPmxvY2FsX21zZHUgPSBsZTE2X3RvX2NwdShlZnMubXNkdSk7CisJCQkJY2hhbi0+bG9jYWxfc2R1X2l0aW1lID0KKwkJCQkJCWxlMzJfdG9fY3B1KGVmcy5zZHVfaXRpbWUpOworCQkJCWNoYW4tPmxvY2FsX2FjY19sYXQgPSBsZTMyX3RvX2NwdShlZnMuYWNjX2xhdCk7CisJCQkJY2hhbi0+bG9jYWxfZmx1c2hfdG8gPQorCQkJCQkJbGUzMl90b19jcHUoZWZzLmZsdXNoX3RvKTsKKwkJCX0KIAkJCWJyZWFrOworCiAJCWNhc2UgTDJDQVBfTU9ERV9TVFJFQU1JTkc6CiAJCQljaGFuLT5tcHMgICAgPSBsZTE2X3RvX2NwdShyZmMubWF4X3BkdV9zaXplKTsKIAkJfQpAQCAtMjI3MSw2ICsyNTQzLDE2IEBACiAJCX0KIAl9CiAKKwkvKiBVc2Ugc2FuZSBkZWZhdWx0IHZhbHVlcyBpbiBjYXNlIGEgbWlzYmVoYXZpbmcgcmVtb3RlIGRldmljZQorCSAqIGRpZCBub3Qgc2VuZCBhbiBSRkMgb3B0aW9uLgorCSAqLworCXJmYy5tb2RlID0gY2hhbi0+bW9kZTsKKwlyZmMucmV0cmFuc190aW1lb3V0ID0gY3B1X3RvX2xlMTYoTDJDQVBfREVGQVVMVF9SRVRSQU5TX1RPKTsKKwlyZmMubW9uaXRvcl90aW1lb3V0ID0gY3B1X3RvX2xlMTYoTDJDQVBfREVGQVVMVF9NT05JVE9SX1RPKTsKKwlyZmMubWF4X3BkdV9zaXplID0gY3B1X3RvX2xlMTYoY2hhbi0+aW10dSk7CisKKwlCVF9FUlIoIkV4cGVjdGVkIFJGQyBvcHRpb24gd2FzIG5vdCBmb3VuZCwgdXNpbmcgZGVmYXVsdHMiKTsKKwogZG9uZToKIAlzd2l0Y2ggKHJmYy5tb2RlKSB7CiAJY2FzZSBMMkNBUF9NT0RFX0VSVE06CkBAIC0yMjkyLDcgKzI1NzQsNyBAQAogCiAJaWYgKChjb25uLT5pbmZvX3N0YXRlICYgTDJDQVBfSU5GT19GRUFUX01BU0tfUkVRX1NFTlQpICYmCiAJCQkJCWNtZC0+aWRlbnQgPT0gY29ubi0+aW5mb19pZGVudCkgewotCQlkZWxfdGltZXIoJmNvbm4tPmluZm9fdGltZXIpOworCQlfX2NhbmNlbF9kZWxheWVkX3dvcmsoJmNvbm4tPmluZm9fdGltZXIpOwogCiAJCWNvbm4tPmluZm9fc3RhdGUgfD0gTDJDQVBfSU5GT19GRUFUX01BU0tfUkVRX0RPTkU7CiAJCWNvbm4tPmluZm9faWRlbnQgPSAwOwpAQCAtMjMyNSwxMiArMjYwNywxMiBAQAogCiAJcGFyZW50ID0gcGNoYW4tPnNrOwogCi0JYmhfbG9ja19zb2NrKHBhcmVudCk7CisJbG9ja19zb2NrKHBhcmVudCk7CiAKIAkvKiBDaGVjayBpZiB0aGUgQUNMIGlzIHNlY3VyZSBlbm91Z2ggKGlmIG5vdCBTRFApICovCiAJaWYgKHBzbSAhPSBjcHVfdG9fbGUxNigweDAwMDEpICYmCiAJCQkJIWhjaV9jb25uX2NoZWNrX2xpbmtfbW9kZShjb25uLT5oY29uKSkgewotCQljb25uLT5kaXNjX3JlYXNvbiA9IDB4MDU7CisJCWNvbm4tPmRpc2NfcmVhc29uID0gSENJX0VSUk9SX0FVVEhfRkFJTFVSRTsKIAkJcmVzdWx0ID0gTDJDQVBfQ1JfU0VDX0JMT0NLOwogCQlnb3RvIHJlc3BvbnNlOwogCX0KQEAgLTIzNDksMTEgKzI2MzEsOCBAQAogCiAJc2sgPSBjaGFuLT5zazsKIAotCXdyaXRlX2xvY2tfYmgoJmNvbm4tPmNoYW5fbG9jayk7Ci0KIAkvKiBDaGVjayBpZiB3ZSBhbHJlYWR5IGhhdmUgY2hhbm5lbCB3aXRoIHRoYXQgZGNpZCAqLwogCWlmIChfX2wyY2FwX2dldF9jaGFuX2J5X2RjaWQoY29ubiwgc2NpZCkpIHsKLQkJd3JpdGVfdW5sb2NrX2JoKCZjb25uLT5jaGFuX2xvY2spOwogCQlzb2NrX3NldF9mbGFnKHNrLCBTT0NLX1pBUFBFRCk7CiAJCWNoYW4tPm9wcy0+Y2xvc2UoY2hhbi0+ZGF0YSk7CiAJCWdvdG8gcmVzcG9uc2U7CkBAIC0yMzY4LDcgKzI2NDcsNyBAQAogCiAJYnRfYWNjZXB0X2VucXVldWUocGFyZW50LCBzayk7CiAKLQlfX2wyY2FwX2NoYW5fYWRkKGNvbm4sIGNoYW4pOworCWwyY2FwX2NoYW5fYWRkKGNvbm4sIGNoYW4pOwogCiAJZGNpZCA9IGNoYW4tPnNjaWQ7CiAKQEAgLTIzNzcsNyArMjY1Niw3IEBACiAJY2hhbi0+aWRlbnQgPSBjbWQtPmlkZW50OwogCiAJaWYgKGNvbm4tPmluZm9fc3RhdGUgJiBMMkNBUF9JTkZPX0ZFQVRfTUFTS19SRVFfRE9ORSkgewotCQlpZiAobDJjYXBfY2hlY2tfc2VjdXJpdHkoY2hhbikpIHsKKwkJaWYgKGwyY2FwX2NoYW5fY2hlY2tfc2VjdXJpdHkoY2hhbikpIHsKIAkJCWlmIChidF9zayhzayktPmRlZmVyX3NldHVwKSB7CiAJCQkJbDJjYXBfc3RhdGVfY2hhbmdlKGNoYW4sIEJUX0NPTk5FQ1QyKTsKIAkJCQlyZXN1bHQgPSBMMkNBUF9DUl9QRU5EOwpAQCAtMjM5OSwxMCArMjY3OCw4IEBACiAJCXN0YXR1cyA9IEwyQ0FQX0NTX05PX0lORk87CiAJfQogCi0Jd3JpdGVfdW5sb2NrX2JoKCZjb25uLT5jaGFuX2xvY2spOwotCiByZXNwb25zZToKLQliaF91bmxvY2tfc29jayhwYXJlbnQpOworCXJlbGVhc2Vfc29jayhwYXJlbnQpOwogCiBzZW5kcmVzcDoKIAlyc3Auc2NpZCAgID0gY3B1X3RvX2xlMTYoc2NpZCk7CkBAIC0yNDE4LDcgKzI2OTUsNyBAQAogCQljb25uLT5pbmZvX3N0YXRlIHw9IEwyQ0FQX0lORk9fRkVBVF9NQVNLX1JFUV9TRU5UOwogCQljb25uLT5pbmZvX2lkZW50ID0gbDJjYXBfZ2V0X2lkZW50KGNvbm4pOwogCi0JCW1vZF90aW1lcigmY29ubi0+aW5mb190aW1lciwgamlmZmllcyArCisJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29ubi0+aW5mb190aW1lciwKIAkJCQkJbXNlY3NfdG9famlmZmllcyhMMkNBUF9JTkZPX1RJTUVPVVQpKTsKIAogCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjb25uLT5pbmZvX2lkZW50LApAQCAtMjQ4NCwxOSArMjc2MSwxMSBAQAogCQlicmVhazsKIAogCWRlZmF1bHQ6Ci0JCS8qIGRvbid0IGRlbGV0ZSBsMmNhcCBjaGFubmVsIGlmIHNrIGlzIG93bmVkIGJ5IHVzZXIgKi8KLQkJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKLQkJCWwyY2FwX3N0YXRlX2NoYW5nZShjaGFuLCBCVF9ESVNDT05OKTsKLQkJCV9fY2xlYXJfY2hhbl90aW1lcihjaGFuKTsKLQkJCV9fc2V0X2NoYW5fdGltZXIoY2hhbiwgTDJDQVBfRElTQ19USU1FT1VUKTsKLQkJCWJyZWFrOwotCQl9Ci0KIAkJbDJjYXBfY2hhbl9kZWwoY2hhbiwgRUNPTk5SRUZVU0VEKTsKIAkJYnJlYWs7CiAJfQogCi0JYmhfdW5sb2NrX3NvY2soc2spOworCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2MDIsOCArMjg3MSwyMyBAQAogCQljaGFuLT5udW1fY29uZl9yZXErKzsKIAl9CiAKKwkvKiBHb3QgQ29uZiBSc3AgUEVORElORyBmcm9tIHJlbW90ZSBzaWRlIGFuZCBhc3VtZSB3ZSBzZW50CisJICAgQ29uZiBSc3AgUEVORElORyBpbiB0aGUgY29kZSBhYm92ZSAqLworCWlmICh0ZXN0X2JpdChDT05GX1JFTV9DT05GX1BFTkQsICZjaGFuLT5jb25mX3N0YXRlKSAmJgorCQkJdGVzdF9iaXQoQ09ORl9MT0NfQ09ORl9QRU5ELCAmY2hhbi0+Y29uZl9zdGF0ZSkpIHsKKworCQkvKiBjaGVjayBjb21wYXRpYmlsaXR5ICovCisKKwkJY2xlYXJfYml0KENPTkZfTE9DX0NPTkZfUEVORCwgJmNoYW4tPmNvbmZfc3RhdGUpOworCQlzZXRfYml0KENPTkZfT1VUUFVUX0RPTkUsICZjaGFuLT5jb25mX3N0YXRlKTsKKworCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9DT05GX1JTUCwKKwkJCQkJbDJjYXBfYnVpbGRfY29uZl9yc3AoY2hhbiwgcnNwLAorCQkJCQlMMkNBUF9DT05GX1NVQ0NFU1MsIDB4MDAwMCksIHJzcCk7CisJfQorCiB1bmxvY2s6Ci0JYmhfdW5sb2NrX3NvY2soc2spOworCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTI2MzEsOCArMjkxNSwzMyBAQAogCXN3aXRjaCAocmVzdWx0KSB7CiAJY2FzZSBMMkNBUF9DT05GX1NVQ0NFU1M6CiAJCWwyY2FwX2NvbmZfcmZjX2dldChjaGFuLCByc3AtPmRhdGEsIGxlbik7CisJCWNsZWFyX2JpdChDT05GX1JFTV9DT05GX1BFTkQsICZjaGFuLT5jb25mX3N0YXRlKTsKIAkJYnJlYWs7CiAKKwljYXNlIEwyQ0FQX0NPTkZfUEVORElORzoKKwkJc2V0X2JpdChDT05GX1JFTV9DT05GX1BFTkQsICZjaGFuLT5jb25mX3N0YXRlKTsKKworCQlpZiAodGVzdF9iaXQoQ09ORl9MT0NfQ09ORl9QRU5ELCAmY2hhbi0+Y29uZl9zdGF0ZSkpIHsKKwkJCWNoYXIgYnVmWzY0XTsKKworCQkJbGVuID0gbDJjYXBfcGFyc2VfY29uZl9yc3AoY2hhbiwgcnNwLT5kYXRhLCBsZW4sCisJCQkJCQkJCWJ1ZiwgJnJlc3VsdCk7CisJCQlpZiAobGVuIDwgMCkgeworCQkJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEoY29ubiwgY2hhbiwgRUNPTk5SRVNFVCk7CisJCQkJZ290byBkb25lOworCQkJfQorCisJCQkvKiBjaGVjayBjb21wYXRpYmlsaXR5ICovCisKKwkJCWNsZWFyX2JpdChDT05GX0xPQ19DT05GX1BFTkQsICZjaGFuLT5jb25mX3N0YXRlKTsKKwkJCXNldF9iaXQoQ09ORl9PVVRQVVRfRE9ORSwgJmNoYW4tPmNvbmZfc3RhdGUpOworCisJCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9DT05GX1JTUCwKKwkJCQkJCWwyY2FwX2J1aWxkX2NvbmZfcnNwKGNoYW4sIGJ1ZiwKKwkJCQkJCUwyQ0FQX0NPTkZfU1VDQ0VTUywgMHgwMDAwKSwgYnVmKTsKKwkJfQorCQlnb3RvIGRvbmU7CisKIAljYXNlIEwyQ0FQX0NPTkZfVU5BQ0NFUFQ6CiAJCWlmIChjaGFuLT5udW1fY29uZl9yc3AgPD0gTDJDQVBfQ09ORl9NQVhfQ09ORl9SU1ApIHsKIAkJCWNoYXIgcmVxWzY0XTsKQEAgLTI2ODUsNyArMjk5NCw3IEBACiAJfQogCiBkb25lOgotCWJoX3VubG9ja19zb2NrKHNrKTsKKwlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiAwOwogfQogCkBAIC0yNzE0LDE3ICszMDIzLDggQEAKIAogCXNrLT5za19zaHV0ZG93biA9IFNIVVRET1dOX01BU0s7CiAKLQkvKiBkb24ndCBkZWxldGUgbDJjYXAgY2hhbm5lbCBpZiBzayBpcyBvd25lZCBieSB1c2VyICovCi0JaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKLQkJbDJjYXBfc3RhdGVfY2hhbmdlKGNoYW4sIEJUX0RJU0NPTk4pOwotCQlfX2NsZWFyX2NoYW5fdGltZXIoY2hhbik7Ci0JCV9fc2V0X2NoYW5fdGltZXIoY2hhbiwgTDJDQVBfRElTQ19USU1FT1VUKTsKLQkJYmhfdW5sb2NrX3NvY2soc2spOwotCQlyZXR1cm4gMDsKLQl9Ci0KIAlsMmNhcF9jaGFuX2RlbChjaGFuLCBFQ09OTlJFU0VUKTsKLQliaF91bmxvY2tfc29jayhzayk7CisJcmVsZWFzZV9zb2NrKHNrKTsKIAogCWNoYW4tPm9wcy0+Y2xvc2UoY2hhbi0+ZGF0YSk7CiAJcmV0dXJuIDA7CkBAIC0yNzQ4LDE3ICszMDQ4LDggQEAKIAogCXNrID0gY2hhbi0+c2s7CiAKLQkvKiBkb24ndCBkZWxldGUgbDJjYXAgY2hhbm5lbCBpZiBzayBpcyBvd25lZCBieSB1c2VyICovCi0JaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKLQkJbDJjYXBfc3RhdGVfY2hhbmdlKGNoYW4sQlRfRElTQ09OTik7Ci0JCV9fY2xlYXJfY2hhbl90aW1lcihjaGFuKTsKLQkJX19zZXRfY2hhbl90aW1lcihjaGFuLCBMMkNBUF9ESVNDX1RJTUVPVVQpOwotCQliaF91bmxvY2tfc29jayhzayk7Ci0JCXJldHVybiAwOwotCX0KLQogCWwyY2FwX2NoYW5fZGVsKGNoYW4sIDApOwotCWJoX3VubG9ja19zb2NrKHNrKTsKKwlyZWxlYXNlX3NvY2soc2spOwogCiAJY2hhbi0+b3BzLT5jbG9zZShjaGFuLT5kYXRhKTsKIAlyZXR1cm4gMDsKQEAgLTI3ODIsMTUgKzMwNzMsMjUgQEAKIAkJaWYgKCFkaXNhYmxlX2VydG0pCiAJCQlmZWF0X21hc2sgfD0gTDJDQVBfRkVBVF9FUlRNIHwgTDJDQVBfRkVBVF9TVFJFQU1JTkcKIAkJCQkJCQkgfCBMMkNBUF9GRUFUX0ZDUzsKKwkJaWYgKGVuYWJsZV9ocykKKwkJCWZlYXRfbWFzayB8PSBMMkNBUF9GRUFUX0VYVF9GTE9XCisJCQkJCQl8IEwyQ0FQX0ZFQVRfRVhUX1dJTkRPVzsKKwogCQlwdXRfdW5hbGlnbmVkX2xlMzIoZmVhdF9tYXNrLCByc3AtPmRhdGEpOwogCQlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LAogCQkJCQlMMkNBUF9JTkZPX1JTUCwgc2l6ZW9mKGJ1ZiksIGJ1Zik7CiAJfSBlbHNlIGlmICh0eXBlID09IEwyQ0FQX0lUX0ZJWEVEX0NIQU4pIHsKIAkJdTggYnVmWzEyXTsKIAkJc3RydWN0IGwyY2FwX2luZm9fcnNwICpyc3AgPSAoc3RydWN0IGwyY2FwX2luZm9fcnNwICopIGJ1ZjsKKworCQlpZiAoZW5hYmxlX2hzKQorCQkJbDJjYXBfZml4ZWRfY2hhblswXSB8PSBMMkNBUF9GQ19BMk1QOworCQllbHNlCisJCQlsMmNhcF9maXhlZF9jaGFuWzBdICY9IH5MMkNBUF9GQ19BMk1QOworCiAJCXJzcC0+dHlwZSAgID0gY3B1X3RvX2xlMTYoTDJDQVBfSVRfRklYRURfQ0hBTik7CiAJCXJzcC0+cmVzdWx0ID0gY3B1X3RvX2xlMTYoTDJDQVBfSVJfU1VDQ0VTUyk7Ci0JCW1lbWNweShidWYgKyA0LCBsMmNhcF9maXhlZF9jaGFuLCA4KTsKKwkJbWVtY3B5KHJzcC0+ZGF0YSwgbDJjYXBfZml4ZWRfY2hhbiwgc2l6ZW9mKGwyY2FwX2ZpeGVkX2NoYW4pKTsKIAkJbDJjYXBfc2VuZF9jbWQoY29ubiwgY21kLT5pZGVudCwKIAkJCQkJTDJDQVBfSU5GT19SU1AsIHNpemVvZihidWYpLCBidWYpOwogCX0gZWxzZSB7CkBAIC0yODE5LDcgKzMxMjAsNyBAQAogCQkJY29ubi0+aW5mb19zdGF0ZSAmIEwyQ0FQX0lORk9fRkVBVF9NQVNLX1JFUV9ET05FKQogCQlyZXR1cm4gMDsKIAotCWRlbF90aW1lcigmY29ubi0+aW5mb190aW1lcik7CisJX19jYW5jZWxfZGVsYXllZF93b3JrKCZjb25uLT5pbmZvX3RpbWVyKTsKIAogCWlmIChyZXN1bHQgIT0gTDJDQVBfSVJfU1VDQ0VTUykgewogCQljb25uLT5pbmZvX3N0YXRlIHw9IEwyQ0FQX0lORk9fRkVBVF9NQVNLX1JFUV9ET05FOwpAQCAtMjg1Nyw2ICszMTU4LDE2NSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9jcmVhdGVfY2hhbm5lbF9yZXEoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCisJCQkJCXN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHUxNiBjbWRfbGVuLAorCQkJCQl2b2lkICpkYXRhKQoreworCXN0cnVjdCBsMmNhcF9jcmVhdGVfY2hhbl9yZXEgKnJlcSA9IGRhdGE7CisJc3RydWN0IGwyY2FwX2NyZWF0ZV9jaGFuX3JzcCByc3A7CisJdTE2IHBzbSwgc2NpZDsKKworCWlmIChjbWRfbGVuICE9IHNpemVvZigqcmVxKSkKKwkJcmV0dXJuIC1FUFJPVE87CisKKwlpZiAoIWVuYWJsZV9ocykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwc20gPSBsZTE2X3RvX2NwdShyZXEtPnBzbSk7CisJc2NpZCA9IGxlMTZfdG9fY3B1KHJlcS0+c2NpZCk7CisKKwlCVF9EQkcoInBzbSAlZCwgc2NpZCAlZCwgYW1wX2lkICVkIiwgcHNtLCBzY2lkLCByZXEtPmFtcF9pZCk7CisKKwkvKiBQbGFjZWhvbGRlcjogQWx3YXlzIHJlamVjdCAqLworCXJzcC5kY2lkID0gMDsKKwlyc3Auc2NpZCA9IGNwdV90b19sZTE2KHNjaWQpOworCXJzcC5yZXN1bHQgPSBMMkNBUF9DUl9OT19NRU07CisJcnNwLnN0YXR1cyA9IEwyQ0FQX0NTX05PX0lORk87CisKKwlsMmNhcF9zZW5kX2NtZChjb25uLCBjbWQtPmlkZW50LCBMMkNBUF9DUkVBVEVfQ0hBTl9SU1AsCisJCSAgICAgICBzaXplb2YocnNwKSwgJnJzcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbDJjYXBfY3JlYXRlX2NoYW5uZWxfcnNwKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLAorCQkJCQlzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kLCB2b2lkICpkYXRhKQoreworCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOworCisJcmV0dXJuIGwyY2FwX2Nvbm5lY3RfcnNwKGNvbm4sIGNtZCwgZGF0YSk7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NlbmRfbW92ZV9jaGFuX3JzcChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgdTggaWRlbnQsCisJCQkJCQkJdTE2IGljaWQsIHUxNiByZXN1bHQpCit7CisJc3RydWN0IGwyY2FwX21vdmVfY2hhbl9yc3AgcnNwOworCisJQlRfREJHKCJpY2lkICVkLCByZXN1bHQgJWQiLCBpY2lkLCByZXN1bHQpOworCisJcnNwLmljaWQgPSBjcHVfdG9fbGUxNihpY2lkKTsKKwlyc3AucmVzdWx0ID0gY3B1X3RvX2xlMTYocmVzdWx0KTsKKworCWwyY2FwX3NlbmRfY21kKGNvbm4sIGlkZW50LCBMMkNBUF9NT1ZFX0NIQU5fUlNQLCBzaXplb2YocnNwKSwgJnJzcCk7Cit9CisKK3N0YXRpYyB2b2lkIGwyY2FwX3NlbmRfbW92ZV9jaGFuX2NmbShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwKKwkJCQlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IGljaWQsIHUxNiByZXN1bHQpCit7CisJc3RydWN0IGwyY2FwX21vdmVfY2hhbl9jZm0gY2ZtOworCXU4IGlkZW50OworCisJQlRfREJHKCJpY2lkICVkLCByZXN1bHQgJWQiLCBpY2lkLCByZXN1bHQpOworCisJaWRlbnQgPSBsMmNhcF9nZXRfaWRlbnQoY29ubik7CisJaWYgKGNoYW4pCisJCWNoYW4tPmlkZW50ID0gaWRlbnQ7CisKKwljZm0uaWNpZCA9IGNwdV90b19sZTE2KGljaWQpOworCWNmbS5yZXN1bHQgPSBjcHVfdG9fbGUxNihyZXN1bHQpOworCisJbDJjYXBfc2VuZF9jbWQoY29ubiwgaWRlbnQsIEwyQ0FQX01PVkVfQ0hBTl9DRk0sIHNpemVvZihjZm0pLCAmY2ZtKTsKK30KKworc3RhdGljIHZvaWQgbDJjYXBfc2VuZF9tb3ZlX2NoYW5fY2ZtX3JzcChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwgdTggaWRlbnQsCisJCQkJCQkJCXUxNiBpY2lkKQoreworCXN0cnVjdCBsMmNhcF9tb3ZlX2NoYW5fY2ZtX3JzcCByc3A7CisKKwlCVF9EQkcoImljaWQgJWQiLCBpY2lkKTsKKworCXJzcC5pY2lkID0gY3B1X3RvX2xlMTYoaWNpZCk7CisJbDJjYXBfc2VuZF9jbWQoY29ubiwgaWRlbnQsIEwyQ0FQX01PVkVfQ0hBTl9DRk1fUlNQLCBzaXplb2YocnNwKSwgJnJzcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX21vdmVfY2hhbm5lbF9yZXEoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCisJCQlzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kLCB1MTYgY21kX2xlbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbDJjYXBfbW92ZV9jaGFuX3JlcSAqcmVxID0gZGF0YTsKKwl1MTYgaWNpZCA9IDA7CisJdTE2IHJlc3VsdCA9IEwyQ0FQX01SX05PVF9BTExPV0VEOworCisJaWYgKGNtZF9sZW4gIT0gc2l6ZW9mKCpyZXEpKQorCQlyZXR1cm4gLUVQUk9UTzsKKworCWljaWQgPSBsZTE2X3RvX2NwdShyZXEtPmljaWQpOworCisJQlRfREJHKCJpY2lkICVkLCBkZXN0X2FtcF9pZCAlZCIsIGljaWQsIHJlcS0+ZGVzdF9hbXBfaWQpOworCisJaWYgKCFlbmFibGVfaHMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUGxhY2Vob2xkZXI6IEFsd2F5cyByZWZ1c2UgKi8KKwlsMmNhcF9zZW5kX21vdmVfY2hhbl9yc3AoY29ubiwgY21kLT5pZGVudCwgaWNpZCwgcmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9tb3ZlX2NoYW5uZWxfcnNwKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLAorCQkJc3RydWN0IGwyY2FwX2NtZF9oZHIgKmNtZCwgdTE2IGNtZF9sZW4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGwyY2FwX21vdmVfY2hhbl9yc3AgKnJzcCA9IGRhdGE7CisJdTE2IGljaWQsIHJlc3VsdDsKKworCWlmIChjbWRfbGVuICE9IHNpemVvZigqcnNwKSkKKwkJcmV0dXJuIC1FUFJPVE87CisKKwlpY2lkID0gbGUxNl90b19jcHUocnNwLT5pY2lkKTsKKwlyZXN1bHQgPSBsZTE2X3RvX2NwdShyc3AtPnJlc3VsdCk7CisKKwlCVF9EQkcoImljaWQgJWQsIHJlc3VsdCAlZCIsIGljaWQsIHJlc3VsdCk7CisKKwkvKiBQbGFjZWhvbGRlcjogQWx3YXlzIHVuY29uZmlybWVkICovCisJbDJjYXBfc2VuZF9tb3ZlX2NoYW5fY2ZtKGNvbm4sIE5VTEwsIGljaWQsIEwyQ0FQX01DX1VOQ09ORklSTUVEKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9tb3ZlX2NoYW5uZWxfY29uZmlybShzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwKKwkJCXN0cnVjdCBsMmNhcF9jbWRfaGRyICpjbWQsIHUxNiBjbWRfbGVuLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBsMmNhcF9tb3ZlX2NoYW5fY2ZtICpjZm0gPSBkYXRhOworCXUxNiBpY2lkLCByZXN1bHQ7CisKKwlpZiAoY21kX2xlbiAhPSBzaXplb2YoKmNmbSkpCisJCXJldHVybiAtRVBST1RPOworCisJaWNpZCA9IGxlMTZfdG9fY3B1KGNmbS0+aWNpZCk7CisJcmVzdWx0ID0gbGUxNl90b19jcHUoY2ZtLT5yZXN1bHQpOworCisJQlRfREJHKCJpY2lkICVkLCByZXN1bHQgJWQiLCBpY2lkLCByZXN1bHQpOworCisJbDJjYXBfc2VuZF9tb3ZlX2NoYW5fY2ZtX3JzcChjb25uLCBjbWQtPmlkZW50LCBpY2lkKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9tb3ZlX2NoYW5uZWxfY29uZmlybV9yc3Aoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sCisJCQlzdHJ1Y3QgbDJjYXBfY21kX2hkciAqY21kLCB1MTYgY21kX2xlbiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgbDJjYXBfbW92ZV9jaGFuX2NmbV9yc3AgKnJzcCA9IGRhdGE7CisJdTE2IGljaWQ7CisKKwlpZiAoY21kX2xlbiAhPSBzaXplb2YoKnJzcCkpCisJCXJldHVybiAtRVBST1RPOworCisJaWNpZCA9IGxlMTZfdG9fY3B1KHJzcC0+aWNpZCk7CisKKwlCVF9EQkcoImljaWQgJWQiLCBpY2lkKTsKKworCXJldHVybiAwOworfQorCiBzdGF0aWMgaW5saW5lIGludCBsMmNhcF9jaGVja19jb25uX3BhcmFtKHUxNiBtaW4sIHUxNiBtYXgsIHUxNiBsYXRlbmN5LAogCQkJCQkJCXUxNiB0b19tdWx0aXBsaWVyKQogewpAQCAtMjk2OSw2ICszNDI5LDMwIEBACiAJCWVyciA9IGwyY2FwX2luZm9ybWF0aW9uX3JzcChjb25uLCBjbWQsIGRhdGEpOwogCQlicmVhazsKIAorCWNhc2UgTDJDQVBfQ1JFQVRFX0NIQU5fUkVROgorCQllcnIgPSBsMmNhcF9jcmVhdGVfY2hhbm5lbF9yZXEoY29ubiwgY21kLCBjbWRfbGVuLCBkYXRhKTsKKwkJYnJlYWs7CisKKwljYXNlIEwyQ0FQX0NSRUFURV9DSEFOX1JTUDoKKwkJZXJyID0gbDJjYXBfY3JlYXRlX2NoYW5uZWxfcnNwKGNvbm4sIGNtZCwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9NT1ZFX0NIQU5fUkVROgorCQllcnIgPSBsMmNhcF9tb3ZlX2NoYW5uZWxfcmVxKGNvbm4sIGNtZCwgY21kX2xlbiwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9NT1ZFX0NIQU5fUlNQOgorCQllcnIgPSBsMmNhcF9tb3ZlX2NoYW5uZWxfcnNwKGNvbm4sIGNtZCwgY21kX2xlbiwgZGF0YSk7CisJCWJyZWFrOworCisJY2FzZSBMMkNBUF9NT1ZFX0NIQU5fQ0ZNOgorCQllcnIgPSBsMmNhcF9tb3ZlX2NoYW5uZWxfY29uZmlybShjb25uLCBjbWQsIGNtZF9sZW4sIGRhdGEpOworCQlicmVhazsKKworCWNhc2UgTDJDQVBfTU9WRV9DSEFOX0NGTV9SU1A6CisJCWVyciA9IGwyY2FwX21vdmVfY2hhbm5lbF9jb25maXJtX3JzcChjb25uLCBjbWQsIGNtZF9sZW4sIGRhdGEpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCUJUX0VSUigiVW5rbm93biBCUi9FRFIgc2lnbmFsaW5nIGNvbW1hbmQgMHglMi4yeCIsIGNtZC0+Y29kZSk7CiAJCWVyciA9IC1FSU5WQUw7CkBAIC0zMDQ3LDEwICszNTMxLDE1IEBACiBzdGF0aWMgaW50IGwyY2FwX2NoZWNrX2ZjcyhzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdTE2IG91cl9mY3MsIHJjdl9mY3M7Ci0JaW50IGhkcl9zaXplID0gTDJDQVBfSERSX1NJWkUgKyAyOworCWludCBoZHJfc2l6ZTsKKworCWlmICh0ZXN0X2JpdChGTEFHX0VYVF9DVFJMLCAmY2hhbi0+ZmxhZ3MpKQorCQloZHJfc2l6ZSA9IEwyQ0FQX0VYVF9IRFJfU0laRTsKKwllbHNlCisJCWhkcl9zaXplID0gTDJDQVBfRU5IX0hEUl9TSVpFOwogCiAJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpIHsKLQkJc2tiX3RyaW0oc2tiLCBza2ItPmxlbiAtIDIpOworCQlza2JfdHJpbShza2IsIHNrYi0+bGVuIC0gTDJDQVBfRkNTX1NJWkUpOwogCQlyY3ZfZmNzID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHNrYi0+ZGF0YSArIHNrYi0+bGVuKTsKIAkJb3VyX2ZjcyA9IGNyYzE2KDAsIHNrYi0+ZGF0YSAtIGhkcl9zaXplLCBza2ItPmxlbiArIGhkcl9zaXplKTsKIApAQCAtMzA2MiwxNCArMzU1MSwxNCBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfc2VuZF9pX29yX3JyX29yX3JucihzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbikKIHsKLQl1MTYgY29udHJvbCA9IDA7CisJdTMyIGNvbnRyb2wgPSAwOwogCiAJY2hhbi0+ZnJhbWVzX3NlbnQgPSAwOwogCi0JY29udHJvbCB8PSBjaGFuLT5idWZmZXJfc2VxIDw8IEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUOworCWNvbnRyb2wgfD0gX19zZXRfcmVxc2VxKGNoYW4sIGNoYW4tPmJ1ZmZlcl9zZXEpOwogCiAJaWYgKHRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7Ci0JCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX05PVF9SRUFEWTsKKwkJY29udHJvbCB8PSBfX3NldF9jdHJsX3N1cGVyKGNoYW4sIEwyQ0FQX1NVUEVSX1JOUik7CiAJCWwyY2FwX3NlbmRfc2ZyYW1lKGNoYW4sIGNvbnRyb2wpOwogCQlzZXRfYml0KENPTk5fUk5SX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKTsKIAl9CkBAIC0zMDgxLDEyICszNTcwLDEyIEBACiAKIAlpZiAoIXRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpICYmCiAJCQljaGFuLT5mcmFtZXNfc2VudCA9PSAwKSB7Ci0JCWNvbnRyb2wgfD0gTDJDQVBfU1VQRVJfUkNWX1JFQURZOworCQljb250cm9sIHw9IF9fc2V0X2N0cmxfc3VwZXIoY2hhbiwgTDJDQVBfU1VQRVJfUlIpOwogCQlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbDJjYXBfYWRkX3RvX3NyZWpfcXVldWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IsIHU4IHR4X3NlcSwgdTggc2FyKQorc3RhdGljIGludCBsMmNhcF9hZGRfdG9fc3Jlal9xdWV1ZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IHR4X3NlcSwgdTggc2FyKQogewogCXN0cnVjdCBza19idWZmICpuZXh0X3NrYjsKIAlpbnQgdHhfc2VxX29mZnNldCwgbmV4dF90eF9zZXFfb2Zmc2V0OwpAQCAtMzA5NSwyMyArMzU4NCwxNSBAQAogCWJ0X2NiKHNrYiktPnNhciA9IHNhcjsKIAogCW5leHRfc2tiID0gc2tiX3BlZWsoJmNoYW4tPnNyZWpfcSk7Ci0JaWYgKCFuZXh0X3NrYikgewotCQlfX3NrYl9xdWV1ZV90YWlsKCZjaGFuLT5zcmVqX3EsIHNrYik7Ci0JCXJldHVybiAwOwotCX0KIAotCXR4X3NlcV9vZmZzZXQgPSAodHhfc2VxIC0gY2hhbi0+YnVmZmVyX3NlcSkgJSA2NDsKLQlpZiAodHhfc2VxX29mZnNldCA8IDApCi0JCXR4X3NlcV9vZmZzZXQgKz0gNjQ7CisJdHhfc2VxX29mZnNldCA9IF9fc2VxX29mZnNldChjaGFuLCB0eF9zZXEsIGNoYW4tPmJ1ZmZlcl9zZXEpOwogCi0JZG8geworCXdoaWxlIChuZXh0X3NrYikgewogCQlpZiAoYnRfY2IobmV4dF9za2IpLT50eF9zZXEgPT0gdHhfc2VxKQogCQkJcmV0dXJuIC1FSU5WQUw7CiAKLQkJbmV4dF90eF9zZXFfb2Zmc2V0ID0gKGJ0X2NiKG5leHRfc2tiKS0+dHhfc2VxIC0KLQkJCQkJCWNoYW4tPmJ1ZmZlcl9zZXEpICUgNjQ7Ci0JCWlmIChuZXh0X3R4X3NlcV9vZmZzZXQgPCAwKQotCQkJbmV4dF90eF9zZXFfb2Zmc2V0ICs9IDY0OworCQluZXh0X3R4X3NlcV9vZmZzZXQgPSBfX3NlcV9vZmZzZXQoY2hhbiwKKwkJCQlidF9jYihuZXh0X3NrYiktPnR4X3NlcSwgY2hhbi0+YnVmZmVyX3NlcSk7CiAKIAkJaWYgKG5leHRfdHhfc2VxX29mZnNldCA+IHR4X3NlcV9vZmZzZXQpIHsKIAkJCV9fc2tiX3F1ZXVlX2JlZm9yZSgmY2hhbi0+c3Jlal9xLCBuZXh0X3NrYiwgc2tiKTsKQEAgLTMxMTksOSArMzYwMCwxMCBAQAogCQl9CiAKIAkJaWYgKHNrYl9xdWV1ZV9pc19sYXN0KCZjaGFuLT5zcmVqX3EsIG5leHRfc2tiKSkKLQkJCWJyZWFrOwotCi0JfSB3aGlsZSAoKG5leHRfc2tiID0gc2tiX3F1ZXVlX25leHQoJmNoYW4tPnNyZWpfcSwgbmV4dF9za2IpKSk7CisJCQluZXh0X3NrYiA9IE5VTEw7CisJCWVsc2UKKwkJCW5leHRfc2tiID0gc2tiX3F1ZXVlX25leHQoJmNoYW4tPnNyZWpfcSwgbmV4dF9za2IpOworCX0KIAogCV9fc2tiX3F1ZXVlX3RhaWwoJmNoYW4tPnNyZWpfcSwgc2tiKTsKIApAQCAtMzE0NywyNCArMzYyOSwyNCBAQAogCXNrYi0+dHJ1ZXNpemUgKz0gbmV3X2ZyYWctPnRydWVzaXplOwogfQogCi1zdGF0aWMgaW50IGwyY2FwX3JlYXNzZW1ibGVfc2R1KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgY29udHJvbCkKK3N0YXRpYyBpbnQgbDJjYXBfcmVhc3NlbWJsZV9zZHUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBjb250cm9sKQogewogCWludCBlcnIgPSAtRUlOVkFMOwogCi0Jc3dpdGNoIChjb250cm9sICYgTDJDQVBfQ1RSTF9TQVIpIHsKLQljYXNlIEwyQ0FQX1NEVV9VTlNFR01FTlRFRDoKKwlzd2l0Y2ggKF9fZ2V0X2N0cmxfc2FyKGNoYW4sIGNvbnRyb2wpKSB7CisJY2FzZSBMMkNBUF9TQVJfVU5TRUdNRU5URUQ6CiAJCWlmIChjaGFuLT5zZHUpCiAJCQlicmVhazsKIAogCQllcnIgPSBjaGFuLT5vcHMtPnJlY3YoY2hhbi0+ZGF0YSwgc2tiKTsKIAkJYnJlYWs7CiAKLQljYXNlIEwyQ0FQX1NEVV9TVEFSVDoKKwljYXNlIEwyQ0FQX1NBUl9TVEFSVDoKIAkJaWYgKGNoYW4tPnNkdSkKIAkJCWJyZWFrOwogCiAJCWNoYW4tPnNkdV9sZW4gPSBnZXRfdW5hbGlnbmVkX2xlMTYoc2tiLT5kYXRhKTsKLQkJc2tiX3B1bGwoc2tiLCAyKTsKKwkJc2tiX3B1bGwoc2tiLCBMMkNBUF9TRFVMRU5fU0laRSk7CiAKIAkJaWYgKGNoYW4tPnNkdV9sZW4gPiBjaGFuLT5pbXR1KSB7CiAJCQllcnIgPSAtRU1TR1NJWkU7CkBAIC0zMTgxLDcgKzM2NjMsNyBAQAogCQllcnIgPSAwOwogCQlicmVhazsKIAotCWNhc2UgTDJDQVBfU0RVX0NPTlRJTlVFOgorCWNhc2UgTDJDQVBfU0FSX0NPTlRJTlVFOgogCQlpZiAoIWNoYW4tPnNkdSkKIAkJCWJyZWFrOwogCkBAIC0zMTk1LDcgKzM2NzcsNyBAQAogCQllcnIgPSAwOwogCQlicmVhazsKIAotCWNhc2UgTDJDQVBfU0RVX0VORDoKKwljYXNlIEwyQ0FQX1NBUl9FTkQ6CiAJCWlmICghY2hhbi0+c2R1KQogCQkJYnJlYWs7CiAKQEAgLTMyMzAsMTQgKzM3MTIsMTQgQEAKIAogc3RhdGljIHZvaWQgbDJjYXBfZXJ0bV9lbnRlcl9sb2NhbF9idXN5KHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuKQogewotCXUxNiBjb250cm9sOworCXUzMiBjb250cm9sOwogCiAJQlRfREJHKCJjaGFuICVwLCBFbnRlciBsb2NhbCBidXN5IiwgY2hhbik7CiAKIAlzZXRfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCi0JY29udHJvbCA9IGNoYW4tPmJ1ZmZlcl9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQ7Ci0JY29udHJvbCB8PSBMMkNBUF9TVVBFUl9SQ1ZfTk9UX1JFQURZOworCWNvbnRyb2wgPSBfX3NldF9yZXFzZXEoY2hhbiwgY2hhbi0+YnVmZmVyX3NlcSk7CisJY29udHJvbCB8PSBfX3NldF9jdHJsX3N1cGVyKGNoYW4sIEwyQ0FQX1NVUEVSX1JOUik7CiAJbDJjYXBfc2VuZF9zZnJhbWUoY2hhbiwgY29udHJvbCk7CiAKIAlzZXRfYml0KENPTk5fUk5SX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKTsKQEAgLTMyNDcsMTMgKzM3MjksMTQgQEAKIAogc3RhdGljIHZvaWQgbDJjYXBfZXJ0bV9leGl0X2xvY2FsX2J1c3koc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4pCiB7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAKIAlpZiAoIXRlc3RfYml0KENPTk5fUk5SX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKSkKIAkJZ290byBkb25lOwogCi0JY29udHJvbCA9IGNoYW4tPmJ1ZmZlcl9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQ7Ci0JY29udHJvbCB8PSBMMkNBUF9TVVBFUl9SQ1ZfUkVBRFkgfCBMMkNBUF9DVFJMX1BPTEw7CisJY29udHJvbCA9IF9fc2V0X3JlcXNlcShjaGFuLCBjaGFuLT5idWZmZXJfc2VxKTsKKwljb250cm9sIHw9IF9fc2V0X2N0cmxfcG9sbChjaGFuKTsKKwljb250cm9sIHw9IF9fc2V0X2N0cmxfc3VwZXIoY2hhbiwgTDJDQVBfU1VQRVJfUlIpOwogCWwyY2FwX3NlbmRfc2ZyYW1lKGNoYW4sIGNvbnRyb2wpOwogCWNoYW4tPnJldHJ5X2NvdW50ID0gMTsKIApAQCAtMzI3OSwxMCArMzc2MiwxMCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgbDJjYXBfY2hlY2tfc3Jlal9nYXAoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHU4IHR4X3NlcSkKK3N0YXRpYyB2b2lkIGwyY2FwX2NoZWNrX3NyZWpfZ2FwKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1MTYgdHhfc2VxKQogewogCXN0cnVjdCBza19idWZmICpza2I7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAKIAl3aGlsZSAoKHNrYiA9IHNrYl9wZWVrKCZjaGFuLT5zcmVqX3EpKSAmJgogCQkJIXRlc3RfYml0KENPTk5fTE9DQUxfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7CkBAIC0zMjkyLDcgKzM3NzUsNyBAQAogCQkJYnJlYWs7CiAKIAkJc2tiID0gc2tiX2RlcXVldWUoJmNoYW4tPnNyZWpfcSk7Ci0JCWNvbnRyb2wgPSBidF9jYihza2IpLT5zYXIgPDwgTDJDQVBfQ1RSTF9TQVJfU0hJRlQ7CisJCWNvbnRyb2wgPSBfX3NldF9jdHJsX3NhcihjaGFuLCBidF9jYihza2IpLT5zYXIpOwogCQllcnIgPSBsMmNhcF9yZWFzc2VtYmxlX3NkdShjaGFuLCBza2IsIGNvbnRyb2wpOwogCiAJCWlmIChlcnIgPCAwKSB7CkBAIC0zMzAwLDE2ICszNzgzLDE1IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWNoYW4tPmJ1ZmZlcl9zZXFfc3JlaiA9Ci0JCQkoY2hhbi0+YnVmZmVyX3NlcV9zcmVqICsgMSkgJSA2NDsKLQkJdHhfc2VxID0gKHR4X3NlcSArIDEpICUgNjQ7CisJCWNoYW4tPmJ1ZmZlcl9zZXFfc3JlaiA9IF9fbmV4dF9zZXEoY2hhbiwgY2hhbi0+YnVmZmVyX3NlcV9zcmVqKTsKKwkJdHhfc2VxID0gX19uZXh0X3NlcShjaGFuLCB0eF9zZXEpOwogCX0KIH0KIAotc3RhdGljIHZvaWQgbDJjYXBfcmVzZW5kX3NyZWpmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTggdHhfc2VxKQorc3RhdGljIHZvaWQgbDJjYXBfcmVzZW5kX3NyZWpmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IHR4X3NlcSkKIHsKIAlzdHJ1Y3Qgc3Jlal9saXN0ICpsLCAqdG1wOwotCXUxNiBjb250cm9sOworCXUzMiBjb250cm9sOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGwsIHRtcCwgJmNoYW4tPnNyZWpfbCwgbGlzdCkgewogCQlpZiAobC0+dHhfc2VxID09IHR4X3NlcSkgewpAQCAtMzMxNyw0NSArMzc5OSw1MyBAQAogCQkJa2ZyZWUobCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJY29udHJvbCA9IEwyQ0FQX1NVUEVSX1NFTEVDVF9SRUpFQ1Q7Ci0JCWNvbnRyb2wgfD0gbC0+dHhfc2VxIDw8IEwyQ0FQX0NUUkxfUkVRU0VRX1NISUZUOworCQljb250cm9sID0gX19zZXRfY3RybF9zdXBlcihjaGFuLCBMMkNBUF9TVVBFUl9TUkVKKTsKKwkJY29udHJvbCB8PSBfX3NldF9yZXFzZXEoY2hhbiwgbC0+dHhfc2VxKTsKIAkJbDJjYXBfc2VuZF9zZnJhbWUoY2hhbiwgY29udHJvbCk7CiAJCWxpc3RfZGVsKCZsLT5saXN0KTsKIAkJbGlzdF9hZGRfdGFpbCgmbC0+bGlzdCwgJmNoYW4tPnNyZWpfbCk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBsMmNhcF9zZW5kX3NyZWpmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTggdHhfc2VxKQorc3RhdGljIGludCBsMmNhcF9zZW5kX3NyZWpmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IHR4X3NlcSkKIHsKIAlzdHJ1Y3Qgc3Jlal9saXN0ICpuZXc7Ci0JdTE2IGNvbnRyb2w7CisJdTMyIGNvbnRyb2w7CiAKIAl3aGlsZSAodHhfc2VxICE9IGNoYW4tPmV4cGVjdGVkX3R4X3NlcSkgewotCQljb250cm9sID0gTDJDQVBfU1VQRVJfU0VMRUNUX1JFSkVDVDsKLQkJY29udHJvbCB8PSBjaGFuLT5leHBlY3RlZF90eF9zZXEgPDwgTDJDQVBfQ1RSTF9SRVFTRVFfU0hJRlQ7CisJCWNvbnRyb2wgPSBfX3NldF9jdHJsX3N1cGVyKGNoYW4sIEwyQ0FQX1NVUEVSX1NSRUopOworCQljb250cm9sIHw9IF9fc2V0X3JlcXNlcShjaGFuLCBjaGFuLT5leHBlY3RlZF90eF9zZXEpOwogCQlsMmNhcF9zZW5kX3NmcmFtZShjaGFuLCBjb250cm9sKTsKIAogCQluZXcgPSBremFsbG9jKHNpemVvZihzdHJ1Y3Qgc3Jlal9saXN0KSwgR0ZQX0FUT01JQyk7CisJCWlmICghbmV3KQorCQkJcmV0dXJuIC1FTk9NRU07CisKIAkJbmV3LT50eF9zZXEgPSBjaGFuLT5leHBlY3RlZF90eF9zZXE7Ci0JCWNoYW4tPmV4cGVjdGVkX3R4X3NlcSA9IChjaGFuLT5leHBlY3RlZF90eF9zZXEgKyAxKSAlIDY0OworCisJCWNoYW4tPmV4cGVjdGVkX3R4X3NlcSA9IF9fbmV4dF9zZXEoY2hhbiwgY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxKTsKKwogCQlsaXN0X2FkZF90YWlsKCZuZXctPmxpc3QsICZjaGFuLT5zcmVqX2wpOwogCX0KLQljaGFuLT5leHBlY3RlZF90eF9zZXEgPSAoY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxICsgMSkgJSA2NDsKKworCWNoYW4tPmV4cGVjdGVkX3R4X3NlcSA9IF9fbmV4dF9zZXEoY2hhbiwgY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxKTsKKworCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsMmNhcF9kYXRhX2NoYW5uZWxfaWZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1MTYgcnhfY29udHJvbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbmxpbmUgaW50IGwyY2FwX2RhdGFfY2hhbm5lbF9pZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUzMiByeF9jb250cm9sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXU4IHR4X3NlcSA9IF9fZ2V0X3R4c2VxKHJ4X2NvbnRyb2wpOwotCXU4IHJlcV9zZXEgPSBfX2dldF9yZXFzZXEocnhfY29udHJvbCk7Ci0JdTggc2FyID0gcnhfY29udHJvbCA+PiBMMkNBUF9DVFJMX1NBUl9TSElGVDsKKwl1MTYgdHhfc2VxID0gX19nZXRfdHhzZXEoY2hhbiwgcnhfY29udHJvbCk7CisJdTE2IHJlcV9zZXEgPSBfX2dldF9yZXFzZXEoY2hhbiwgcnhfY29udHJvbCk7CisJdTggc2FyID0gX19nZXRfY3RybF9zYXIoY2hhbiwgcnhfY29udHJvbCk7CiAJaW50IHR4X3NlcV9vZmZzZXQsIGV4cGVjdGVkX3R4X3NlcV9vZmZzZXQ7CiAJaW50IG51bV90b19hY2sgPSAoY2hhbi0+dHhfd2luLzYpICsgMTsKIAlpbnQgZXJyID0gMDsKIAotCUJUX0RCRygiY2hhbiAlcCBsZW4gJWQgdHhfc2VxICVkIHJ4X2NvbnRyb2wgMHglNC40eCIsIGNoYW4sIHNrYi0+bGVuLAorCUJUX0RCRygiY2hhbiAlcCBsZW4gJWQgdHhfc2VxICVkIHJ4X2NvbnRyb2wgMHglOC44eCIsIGNoYW4sIHNrYi0+bGVuLAogCQkJCQkJCXR4X3NlcSwgcnhfY29udHJvbCk7CiAKLQlpZiAoTDJDQVBfQ1RSTF9GSU5BTCAmIHJ4X2NvbnRyb2wgJiYKKwlpZiAoX19pc19jdHJsX2ZpbmFsKGNoYW4sIHJ4X2NvbnRyb2wpICYmCiAJCQl0ZXN0X2JpdChDT05OX1dBSVRfRiwgJmNoYW4tPmNvbm5fc3RhdGUpKSB7CiAJCV9fY2xlYXJfbW9uaXRvcl90aW1lcihjaGFuKTsKIAkJaWYgKGNoYW4tPnVuYWNrZWRfZnJhbWVzID4gMCkKQEAgLTMzNjYsOSArMzg1Niw3IEBACiAJY2hhbi0+ZXhwZWN0ZWRfYWNrX3NlcSA9IHJlcV9zZXE7CiAJbDJjYXBfZHJvcF9hY2tlZF9mcmFtZXMoY2hhbik7CiAKLQl0eF9zZXFfb2Zmc2V0ID0gKHR4X3NlcSAtIGNoYW4tPmJ1ZmZlcl9zZXEpICUgNjQ7Ci0JaWYgKHR4X3NlcV9vZmZzZXQgPCAwKQotCQl0eF9zZXFfb2Zmc2V0ICs9IDY0OworCXR4X3NlcV9vZmZzZXQgPSBfX3NlcV9vZmZzZXQoY2hhbiwgdHhfc2VxLCBjaGFuLT5idWZmZXJfc2VxKTsKIAogCS8qIGludmFsaWQgdHhfc2VxICovCiAJaWYgKHR4X3NlcV9vZmZzZXQgPj0gY2hhbi0+dHhfd2luKSB7CkBAIC0zNDEzLDEzICszOTAxLDE2IEBACiAJCQkJCXJldHVybiAwOwogCQkJCX0KIAkJCX0KLQkJCWwyY2FwX3NlbmRfc3JlamZyYW1lKGNoYW4sIHR4X3NlcSk7CisKKwkJCWVyciA9IGwyY2FwX3NlbmRfc3JlamZyYW1lKGNoYW4sIHR4X3NlcSk7CisJCQlpZiAoZXJyIDwgMCkgeworCQkJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEoY2hhbi0+Y29ubiwgY2hhbiwgLWVycik7CisJCQkJcmV0dXJuIGVycjsKKwkJCX0KIAkJfQogCX0gZWxzZSB7Ci0JCWV4cGVjdGVkX3R4X3NlcV9vZmZzZXQgPQotCQkJKGNoYW4tPmV4cGVjdGVkX3R4X3NlcSAtIGNoYW4tPmJ1ZmZlcl9zZXEpICUgNjQ7Ci0JCWlmIChleHBlY3RlZF90eF9zZXFfb2Zmc2V0IDwgMCkKLQkJCWV4cGVjdGVkX3R4X3NlcV9vZmZzZXQgKz0gNjQ7CisJCWV4cGVjdGVkX3R4X3NlcV9vZmZzZXQgPSBfX3NlcV9vZmZzZXQoY2hhbiwKKwkJCQljaGFuLT5leHBlY3RlZF90eF9zZXEsIGNoYW4tPmJ1ZmZlcl9zZXEpOwogCiAJCS8qIGR1cGxpY2F0ZWQgdHhfc2VxICovCiAJCWlmICh0eF9zZXFfb2Zmc2V0IDwgZXhwZWN0ZWRfdHhfc2VxX29mZnNldCkKQEAgLTM0MzcsMTQgKzM5MjgsMTggQEAKIAogCQlzZXRfYml0KENPTk5fU0VORF9QQklULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAKLQkJbDJjYXBfc2VuZF9zcmVqZnJhbWUoY2hhbiwgdHhfc2VxKTsKKwkJZXJyID0gbDJjYXBfc2VuZF9zcmVqZnJhbWUoY2hhbiwgdHhfc2VxKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEoY2hhbi0+Y29ubiwgY2hhbiwgLWVycik7CisJCQlyZXR1cm4gZXJyOworCQl9CiAKIAkJX19jbGVhcl9hY2tfdGltZXIoY2hhbik7CiAJfQogCXJldHVybiAwOwogCiBleHBlY3RlZDoKLQljaGFuLT5leHBlY3RlZF90eF9zZXEgPSAoY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxICsgMSkgJSA2NDsKKwljaGFuLT5leHBlY3RlZF90eF9zZXEgPSBfX25leHRfc2VxKGNoYW4sIGNoYW4tPmV4cGVjdGVkX3R4X3NlcSk7CiAKIAlpZiAodGVzdF9iaXQoQ09OTl9TUkVKX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKSkgewogCQlidF9jYihza2IpLT50eF9zZXEgPSB0eF9zZXE7CkBAIC0zNDU0LDIyICszOTQ5LDI0IEBACiAJfQogCiAJZXJyID0gbDJjYXBfcmVhc3NlbWJsZV9zZHUoY2hhbiwgc2tiLCByeF9jb250cm9sKTsKLQljaGFuLT5idWZmZXJfc2VxID0gKGNoYW4tPmJ1ZmZlcl9zZXEgKyAxKSAlIDY0OworCWNoYW4tPmJ1ZmZlcl9zZXEgPSBfX25leHRfc2VxKGNoYW4sIGNoYW4tPmJ1ZmZlcl9zZXEpOworCiAJaWYgKGVyciA8IDApIHsKIAkJbDJjYXBfc2VuZF9kaXNjb25uX3JlcShjaGFuLT5jb25uLCBjaGFuLCBFQ09OTlJFU0VUKTsKIAkJcmV0dXJuIGVycjsKIAl9CiAKLQlpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfRklOQUwpIHsKKwlpZiAoX19pc19jdHJsX2ZpbmFsKGNoYW4sIHJ4X2NvbnRyb2wpKSB7CiAJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KENPTk5fUkVKX0FDVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQogCQkJbDJjYXBfcmV0cmFuc21pdF9mcmFtZXMoY2hhbik7CiAJfQogCi0JX19zZXRfYWNrX3RpbWVyKGNoYW4pOwogCiAJY2hhbi0+bnVtX2Fja2VkID0gKGNoYW4tPm51bV9hY2tlZCArIDEpICUgbnVtX3RvX2FjazsKIAlpZiAoY2hhbi0+bnVtX2Fja2VkID09IG51bV90b19hY2sgLSAxKQogCQlsMmNhcF9zZW5kX2FjayhjaGFuKTsKKwllbHNlCisJCV9fc2V0X2Fja190aW1lcihjaGFuKTsKIAogCXJldHVybiAwOwogCkBAIC0zNDc4LDE1ICszOTc1LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9kYXRhX2NoYW5uZWxfcnJmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IHJ4X2NvbnRyb2wpCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfZGF0YV9jaGFubmVsX3JyZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUzMiByeF9jb250cm9sKQogewotCUJUX0RCRygiY2hhbiAlcCwgcmVxX3NlcSAlZCBjdHJsIDB4JTQuNHgiLCBjaGFuLCBfX2dldF9yZXFzZXEocnhfY29udHJvbCksCi0JCQkJCQlyeF9jb250cm9sKTsKKwlCVF9EQkcoImNoYW4gJXAsIHJlcV9zZXEgJWQgY3RybCAweCU4Ljh4IiwgY2hhbiwKKwkJCQlfX2dldF9yZXFzZXEoY2hhbiwgcnhfY29udHJvbCksIHJ4X2NvbnRyb2wpOwogCi0JY2hhbi0+ZXhwZWN0ZWRfYWNrX3NlcSA9IF9fZ2V0X3JlcXNlcShyeF9jb250cm9sKTsKKwljaGFuLT5leHBlY3RlZF9hY2tfc2VxID0gX19nZXRfcmVxc2VxKGNoYW4sIHJ4X2NvbnRyb2wpOwogCWwyY2FwX2Ryb3BfYWNrZWRfZnJhbWVzKGNoYW4pOwogCi0JaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX1BPTEwpIHsKKwlpZiAoX19pc19jdHJsX3BvbGwoY2hhbiwgcnhfY29udHJvbCkpIHsKIAkJc2V0X2JpdChDT05OX1NFTkRfRkJJVCwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCQlpZiAodGVzdF9iaXQoQ09OTl9TUkVKX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKSkgewogCQkJaWYgKHRlc3RfYml0KENPTk5fUkVNT1RFX0JVU1ksICZjaGFuLT5jb25uX3N0YXRlKSAmJgpAQCAtMzQ5OSw3ICszOTk2LDcgQEAKIAkJCWwyY2FwX3NlbmRfaV9vcl9ycl9vcl9ybnIoY2hhbik7CiAJCX0KIAotCX0gZWxzZSBpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfRklOQUwpIHsKKwl9IGVsc2UgaWYgKF9faXNfY3RybF9maW5hbChjaGFuLCByeF9jb250cm9sKSkgewogCQljbGVhcl9iaXQoQ09OTl9SRU1PVEVfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCiAJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KENPTk5fUkVKX0FDVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQpAQCAtMzUxOCwxOCArNDAxNSwxOCBAQAogCX0KIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX2RhdGFfY2hhbm5lbF9yZWpmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IHJ4X2NvbnRyb2wpCitzdGF0aWMgaW5saW5lIHZvaWQgbDJjYXBfZGF0YV9jaGFubmVsX3JlamZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1MzIgcnhfY29udHJvbCkKIHsKLQl1OCB0eF9zZXEgPSBfX2dldF9yZXFzZXEocnhfY29udHJvbCk7CisJdTE2IHR4X3NlcSA9IF9fZ2V0X3JlcXNlcShjaGFuLCByeF9jb250cm9sKTsKIAotCUJUX0RCRygiY2hhbiAlcCwgcmVxX3NlcSAlZCBjdHJsIDB4JTQuNHgiLCBjaGFuLCB0eF9zZXEsIHJ4X2NvbnRyb2wpOworCUJUX0RCRygiY2hhbiAlcCwgcmVxX3NlcSAlZCBjdHJsIDB4JTguOHgiLCBjaGFuLCB0eF9zZXEsIHJ4X2NvbnRyb2wpOwogCiAJY2xlYXJfYml0KENPTk5fUkVNT1RFX0JVU1ksICZjaGFuLT5jb25uX3N0YXRlKTsKIAogCWNoYW4tPmV4cGVjdGVkX2Fja19zZXEgPSB0eF9zZXE7CiAJbDJjYXBfZHJvcF9hY2tlZF9mcmFtZXMoY2hhbik7CiAKLQlpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfRklOQUwpIHsKKwlpZiAoX19pc19jdHJsX2ZpbmFsKGNoYW4sIHJ4X2NvbnRyb2wpKSB7CiAJCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KENPTk5fUkVKX0FDVCwgJmNoYW4tPmNvbm5fc3RhdGUpKQogCQkJbDJjYXBfcmV0cmFuc21pdF9mcmFtZXMoY2hhbik7CiAJfSBlbHNlIHsKQEAgLTM1MzksMTUgKzQwMzYsMTUgQEAKIAkJCXNldF9iaXQoQ09OTl9SRUpfQUNULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJfQogfQotc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX2RhdGFfY2hhbm5lbF9zcmVqZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUxNiByeF9jb250cm9sKQorc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX2RhdGFfY2hhbm5lbF9zcmVqZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUzMiByeF9jb250cm9sKQogewotCXU4IHR4X3NlcSA9IF9fZ2V0X3JlcXNlcShyeF9jb250cm9sKTsKKwl1MTYgdHhfc2VxID0gX19nZXRfcmVxc2VxKGNoYW4sIHJ4X2NvbnRyb2wpOwogCi0JQlRfREJHKCJjaGFuICVwLCByZXFfc2VxICVkIGN0cmwgMHglNC40eCIsIGNoYW4sIHR4X3NlcSwgcnhfY29udHJvbCk7CisJQlRfREJHKCJjaGFuICVwLCByZXFfc2VxICVkIGN0cmwgMHglOC44eCIsIGNoYW4sIHR4X3NlcSwgcnhfY29udHJvbCk7CiAKIAljbGVhcl9iaXQoQ09OTl9SRU1PVEVfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCi0JaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX1BPTEwpIHsKKwlpZiAoX19pc19jdHJsX3BvbGwoY2hhbiwgcnhfY29udHJvbCkpIHsKIAkJY2hhbi0+ZXhwZWN0ZWRfYWNrX3NlcSA9IHR4X3NlcTsKIAkJbDJjYXBfZHJvcF9hY2tlZF9mcmFtZXMoY2hhbik7CiAKQEAgLTM1NjAsNyArNDA1Nyw3IEBACiAJCQljaGFuLT5zcmVqX3NhdmVfcmVxc2VxID0gdHhfc2VxOwogCQkJc2V0X2JpdChDT05OX1NSRUpfQUNULCAmY2hhbi0+Y29ubl9zdGF0ZSk7CiAJCX0KLQl9IGVsc2UgaWYgKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX0ZJTkFMKSB7CisJfSBlbHNlIGlmIChfX2lzX2N0cmxfZmluYWwoY2hhbiwgcnhfY29udHJvbCkpIHsKIAkJaWYgKHRlc3RfYml0KENPTk5fU1JFSl9BQ1QsICZjaGFuLT5jb25uX3N0YXRlKSAmJgogCQkJCWNoYW4tPnNyZWpfc2F2ZV9yZXFzZXEgPT0gdHhfc2VxKQogCQkJY2xlYXJfYml0KENPTk5fU1JFSl9BQ1QsICZjaGFuLT5jb25uX3N0YXRlKTsKQEAgLTM1NzUsMzcgKzQwNzIsMzkgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBsMmNhcF9kYXRhX2NoYW5uZWxfcm5yZnJhbWUoc3RydWN0IGwyY2FwX2NoYW4gKmNoYW4sIHUxNiByeF9jb250cm9sKQorc3RhdGljIGlubGluZSB2b2lkIGwyY2FwX2RhdGFfY2hhbm5lbF9ybnJmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTMyIHJ4X2NvbnRyb2wpCiB7Ci0JdTggdHhfc2VxID0gX19nZXRfcmVxc2VxKHJ4X2NvbnRyb2wpOworCXUxNiB0eF9zZXEgPSBfX2dldF9yZXFzZXEoY2hhbiwgcnhfY29udHJvbCk7CiAKLQlCVF9EQkcoImNoYW4gJXAsIHJlcV9zZXEgJWQgY3RybCAweCU0LjR4IiwgY2hhbiwgdHhfc2VxLCByeF9jb250cm9sKTsKKwlCVF9EQkcoImNoYW4gJXAsIHJlcV9zZXEgJWQgY3RybCAweCU4Ljh4IiwgY2hhbiwgdHhfc2VxLCByeF9jb250cm9sKTsKIAogCXNldF9iaXQoQ09OTl9SRU1PVEVfQlVTWSwgJmNoYW4tPmNvbm5fc3RhdGUpOwogCWNoYW4tPmV4cGVjdGVkX2Fja19zZXEgPSB0eF9zZXE7CiAJbDJjYXBfZHJvcF9hY2tlZF9mcmFtZXMoY2hhbik7CiAKLQlpZiAocnhfY29udHJvbCAmIEwyQ0FQX0NUUkxfUE9MTCkKKwlpZiAoX19pc19jdHJsX3BvbGwoY2hhbiwgcnhfY29udHJvbCkpCiAJCXNldF9iaXQoQ09OTl9TRU5EX0ZCSVQsICZjaGFuLT5jb25uX3N0YXRlKTsKIAogCWlmICghdGVzdF9iaXQoQ09OTl9TUkVKX1NFTlQsICZjaGFuLT5jb25uX3N0YXRlKSkgewogCQlfX2NsZWFyX3JldHJhbnNfdGltZXIoY2hhbik7Ci0JCWlmIChyeF9jb250cm9sICYgTDJDQVBfQ1RSTF9QT0xMKQorCQlpZiAoX19pc19jdHJsX3BvbGwoY2hhbiwgcnhfY29udHJvbCkpCiAJCQlsMmNhcF9zZW5kX3JyX29yX3JucihjaGFuLCBMMkNBUF9DVFJMX0ZJTkFMKTsKIAkJcmV0dXJuOwogCX0KIAotCWlmIChyeF9jb250cm9sICYgTDJDQVBfQ1RSTF9QT0xMKQorCWlmIChfX2lzX2N0cmxfcG9sbChjaGFuLCByeF9jb250cm9sKSkgewogCQlsMmNhcF9zZW5kX3NyZWp0YWlsKGNoYW4pOwotCWVsc2UKLQkJbDJjYXBfc2VuZF9zZnJhbWUoY2hhbiwgTDJDQVBfU1VQRVJfUkNWX1JFQURZKTsKKwl9IGVsc2UgeworCQlyeF9jb250cm9sID0gX19zZXRfY3RybF9zdXBlcihjaGFuLCBMMkNBUF9TVVBFUl9SUik7CisJCWwyY2FwX3NlbmRfc2ZyYW1lKGNoYW4sIHJ4X2NvbnRyb2wpOworCX0KIH0KIAotc3RhdGljIGlubGluZSBpbnQgbDJjYXBfZGF0YV9jaGFubmVsX3NmcmFtZShzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiwgdTE2IHJ4X2NvbnRyb2wsIHN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgaW5saW5lIGludCBsMmNhcF9kYXRhX2NoYW5uZWxfc2ZyYW1lKHN0cnVjdCBsMmNhcF9jaGFuICpjaGFuLCB1MzIgcnhfY29udHJvbCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlCVF9EQkcoImNoYW4gJXAgcnhfY29udHJvbCAweCU0LjR4IGxlbiAlZCIsIGNoYW4sIHJ4X2NvbnRyb2wsIHNrYi0+bGVuKTsKKwlCVF9EQkcoImNoYW4gJXAgcnhfY29udHJvbCAweCU4Ljh4IGxlbiAlZCIsIGNoYW4sIHJ4X2NvbnRyb2wsIHNrYi0+bGVuKTsKIAotCWlmIChMMkNBUF9DVFJMX0ZJTkFMICYgcnhfY29udHJvbCAmJgorCWlmIChfX2lzX2N0cmxfZmluYWwoY2hhbiwgcnhfY29udHJvbCkgJiYKIAkJCXRlc3RfYml0KENPTk5fV0FJVF9GLCAmY2hhbi0+Y29ubl9zdGF0ZSkpIHsKIAkJX19jbGVhcl9tb25pdG9yX3RpbWVyKGNoYW4pOwogCQlpZiAoY2hhbi0+dW5hY2tlZF9mcmFtZXMgPiAwKQpAQCAtMzYxMywyMCArNDExMiwyMCBAQAogCQljbGVhcl9iaXQoQ09OTl9XQUlUX0YsICZjaGFuLT5jb25uX3N0YXRlKTsKIAl9CiAKLQlzd2l0Y2ggKHJ4X2NvbnRyb2wgJiBMMkNBUF9DVFJMX1NVUEVSVklTRSkgewotCWNhc2UgTDJDQVBfU1VQRVJfUkNWX1JFQURZOgorCXN3aXRjaCAoX19nZXRfY3RybF9zdXBlcihjaGFuLCByeF9jb250cm9sKSkgeworCWNhc2UgTDJDQVBfU1VQRVJfUlI6CiAJCWwyY2FwX2RhdGFfY2hhbm5lbF9ycmZyYW1lKGNoYW4sIHJ4X2NvbnRyb2wpOwogCQlicmVhazsKIAotCWNhc2UgTDJDQVBfU1VQRVJfUkVKRUNUOgorCWNhc2UgTDJDQVBfU1VQRVJfUkVKOgogCQlsMmNhcF9kYXRhX2NoYW5uZWxfcmVqZnJhbWUoY2hhbiwgcnhfY29udHJvbCk7CiAJCWJyZWFrOwogCi0JY2FzZSBMMkNBUF9TVVBFUl9TRUxFQ1RfUkVKRUNUOgorCWNhc2UgTDJDQVBfU1VQRVJfU1JFSjoKIAkJbDJjYXBfZGF0YV9jaGFubmVsX3NyZWpmcmFtZShjaGFuLCByeF9jb250cm9sKTsKIAkJYnJlYWs7CiAKLQljYXNlIEwyQ0FQX1NVUEVSX1JDVl9OT1RfUkVBRFk6CisJY2FzZSBMMkNBUF9TVVBFUl9STlI6CiAJCWwyY2FwX2RhdGFfY2hhbm5lbF9ybnJmcmFtZShjaGFuLCByeF9jb250cm9sKTsKIAkJYnJlYWs7CiAJfQpAQCAtMzYzOCwxMiArNDEzNywxMiBAQAogc3RhdGljIGludCBsMmNhcF9lcnRtX2RhdGFfcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbiA9IGwyY2FwX3BpKHNrKS0+Y2hhbjsKLQl1MTYgY29udHJvbDsKLQl1OCByZXFfc2VxOworCXUzMiBjb250cm9sOworCXUxNiByZXFfc2VxOwogCWludCBsZW4sIG5leHRfdHhfc2VxX29mZnNldCwgcmVxX3NlcV9vZmZzZXQ7CiAKLQljb250cm9sID0gZ2V0X3VuYWxpZ25lZF9sZTE2KHNrYi0+ZGF0YSk7Ci0Jc2tiX3B1bGwoc2tiLCAyKTsKKwljb250cm9sID0gX19nZXRfY29udHJvbChjaGFuLCBza2ItPmRhdGEpOworCXNrYl9wdWxsKHNrYiwgX19jdHJsX3NpemUoY2hhbikpOwogCWxlbiA9IHNrYi0+bGVuOwogCiAJLyoKQEAgLTM2NTQsMjYgKzQxNTMsMjMgQEAKIAlpZiAobDJjYXBfY2hlY2tfZmNzKGNoYW4sIHNrYikpCiAJCWdvdG8gZHJvcDsKIAotCWlmIChfX2lzX3Nhcl9zdGFydChjb250cm9sKSAmJiBfX2lzX2lmcmFtZShjb250cm9sKSkKLQkJbGVuIC09IDI7CisJaWYgKF9faXNfc2FyX3N0YXJ0KGNoYW4sIGNvbnRyb2wpICYmICFfX2lzX3NmcmFtZShjaGFuLCBjb250cm9sKSkKKwkJbGVuIC09IEwyQ0FQX1NEVUxFTl9TSVpFOwogCiAJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpCi0JCWxlbiAtPSAyOworCQlsZW4gLT0gTDJDQVBfRkNTX1NJWkU7CiAKIAlpZiAobGVuID4gY2hhbi0+bXBzKSB7CiAJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEoY2hhbi0+Y29ubiwgY2hhbiwgRUNPTk5SRVNFVCk7CiAJCWdvdG8gZHJvcDsKIAl9CiAKLQlyZXFfc2VxID0gX19nZXRfcmVxc2VxKGNvbnRyb2wpOwotCXJlcV9zZXFfb2Zmc2V0ID0gKHJlcV9zZXEgLSBjaGFuLT5leHBlY3RlZF9hY2tfc2VxKSAlIDY0OwotCWlmIChyZXFfc2VxX29mZnNldCA8IDApCi0JCXJlcV9zZXFfb2Zmc2V0ICs9IDY0OworCXJlcV9zZXEgPSBfX2dldF9yZXFzZXEoY2hhbiwgY29udHJvbCk7CiAKLQluZXh0X3R4X3NlcV9vZmZzZXQgPQotCQkoY2hhbi0+bmV4dF90eF9zZXEgLSBjaGFuLT5leHBlY3RlZF9hY2tfc2VxKSAlIDY0OwotCWlmIChuZXh0X3R4X3NlcV9vZmZzZXQgPCAwKQotCQluZXh0X3R4X3NlcV9vZmZzZXQgKz0gNjQ7CisJcmVxX3NlcV9vZmZzZXQgPSBfX3NlcV9vZmZzZXQoY2hhbiwgcmVxX3NlcSwgY2hhbi0+ZXhwZWN0ZWRfYWNrX3NlcSk7CisKKwluZXh0X3R4X3NlcV9vZmZzZXQgPSBfX3NlcV9vZmZzZXQoY2hhbiwgY2hhbi0+bmV4dF90eF9zZXEsCisJCQkJCQljaGFuLT5leHBlY3RlZF9hY2tfc2VxKTsKIAogCS8qIGNoZWNrIGZvciBpbnZhbGlkIHJlcS1zZXEgKi8KIAlpZiAocmVxX3NlcV9vZmZzZXQgPiBuZXh0X3R4X3NlcV9vZmZzZXQpIHsKQEAgLTM2ODEsNyArNDE3Nyw3IEBACiAJCWdvdG8gZHJvcDsKIAl9CiAKLQlpZiAoX19pc19pZnJhbWUoY29udHJvbCkpIHsKKwlpZiAoIV9faXNfc2ZyYW1lKGNoYW4sIGNvbnRyb2wpKSB7CiAJCWlmIChsZW4gPCAwKSB7CiAJCQlsMmNhcF9zZW5kX2Rpc2Nvbm5fcmVxKGNoYW4tPmNvbm4sIGNoYW4sIEVDT05OUkVTRVQpOwogCQkJZ290byBkcm9wOwpAQCAtMzcwOSw4ICs0MjA1LDggQEAKIHsKIAlzdHJ1Y3QgbDJjYXBfY2hhbiAqY2hhbjsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMOwotCXUxNiBjb250cm9sOwotCXU4IHR4X3NlcTsKKwl1MzIgY29udHJvbDsKKwl1MTYgdHhfc2VxOwogCWludCBsZW47CiAKIAljaGFuID0gbDJjYXBfZ2V0X2NoYW5fYnlfc2NpZChjb25uLCBjaWQpOwpAQCAtMzc0MSwzMyArNDIzNywyOCBAQAogCQlicmVhazsKIAogCWNhc2UgTDJDQVBfTU9ERV9FUlRNOgotCQlpZiAoIXNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKLQkJCWwyY2FwX2VydG1fZGF0YV9yY3Yoc2ssIHNrYik7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoc2tfYWRkX2JhY2tsb2coc2ssIHNrYikpCi0JCQkJZ290byBkcm9wOwotCQl9CisJCWwyY2FwX2VydG1fZGF0YV9yY3Yoc2ssIHNrYik7CiAKIAkJZ290byBkb25lOwogCiAJY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKLQkJY29udHJvbCA9IGdldF91bmFsaWduZWRfbGUxNihza2ItPmRhdGEpOwotCQlza2JfcHVsbChza2IsIDIpOworCQljb250cm9sID0gX19nZXRfY29udHJvbChjaGFuLCBza2ItPmRhdGEpOworCQlza2JfcHVsbChza2IsIF9fY3RybF9zaXplKGNoYW4pKTsKIAkJbGVuID0gc2tiLT5sZW47CiAKIAkJaWYgKGwyY2FwX2NoZWNrX2ZjcyhjaGFuLCBza2IpKQogCQkJZ290byBkcm9wOwogCi0JCWlmIChfX2lzX3Nhcl9zdGFydChjb250cm9sKSkKLQkJCWxlbiAtPSAyOworCQlpZiAoX19pc19zYXJfc3RhcnQoY2hhbiwgY29udHJvbCkpCisJCQlsZW4gLT0gTDJDQVBfU0RVTEVOX1NJWkU7CiAKIAkJaWYgKGNoYW4tPmZjcyA9PSBMMkNBUF9GQ1NfQ1JDMTYpCi0JCQlsZW4gLT0gMjsKKwkJCWxlbiAtPSBMMkNBUF9GQ1NfU0laRTsKIAotCQlpZiAobGVuID4gY2hhbi0+bXBzIHx8IGxlbiA8IDAgfHwgX19pc19zZnJhbWUoY29udHJvbCkpCisJCWlmIChsZW4gPiBjaGFuLT5tcHMgfHwgbGVuIDwgMCB8fCBfX2lzX3NmcmFtZShjaGFuLCBjb250cm9sKSkKIAkJCWdvdG8gZHJvcDsKIAotCQl0eF9zZXEgPSBfX2dldF90eHNlcShjb250cm9sKTsKKwkJdHhfc2VxID0gX19nZXRfdHhzZXEoY2hhbiwgY29udHJvbCk7CiAKIAkJaWYgKGNoYW4tPmV4cGVjdGVkX3R4X3NlcSAhPSB0eF9zZXEpIHsKIAkJCS8qIEZyYW1lKHMpIG1pc3NpbmcgLSBtdXN0IGRpc2NhcmQgcGFydGlhbCBTRFUgKi8KQEAgLTM3NzksNyArNDI3MCw3IEBACiAJCQkvKiBUT0RPOiBOb3RpZnkgdXNlcmxhbmQgb2YgbWlzc2luZyBkYXRhICovCiAJCX0KIAotCQljaGFuLT5leHBlY3RlZF90eF9zZXEgPSAodHhfc2VxICsgMSkgJSA2NDsKKwkJY2hhbi0+ZXhwZWN0ZWRfdHhfc2VxID0gX19uZXh0X3NlcShjaGFuLCB0eF9zZXEpOwogCiAJCWlmIChsMmNhcF9yZWFzc2VtYmxlX3NkdShjaGFuLCBza2IsIGNvbnRyb2wpID09IC1FTVNHU0laRSkKIAkJCWwyY2FwX3NlbmRfZGlzY29ubl9yZXEoY2hhbi0+Y29ubiwgY2hhbiwgRUNPTk5SRVNFVCk7CkBAIC0zNzk2LDcgKzQyODcsNyBAQAogCiBkb25lOgogCWlmIChzaykKLQkJYmhfdW5sb2NrX3NvY2soc2spOworCQlyZWxlYXNlX3NvY2soc2spOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0zODEyLDcgKzQzMDMsNyBAQAogCiAJc2sgPSBjaGFuLT5zazsKIAotCWJoX2xvY2tfc29jayhzayk7CisJbG9ja19zb2NrKHNrKTsKIAogCUJUX0RCRygic2sgJXAsIGxlbiAlZCIsIHNrLCBza2ItPmxlbik7CiAKQEAgLTM4MzAsNyArNDMyMSw3IEBACiAKIGRvbmU6CiAJaWYgKHNrKQotCQliaF91bmxvY2tfc29jayhzayk7CisJCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM4NDUsNyArNDMzNiw3IEBACiAKIAlzayA9IGNoYW4tPnNrOwogCi0JYmhfbG9ja19zb2NrKHNrKTsKKwlsb2NrX3NvY2soc2spOwogCiAJQlRfREJHKCJzayAlcCwgbGVuICVkIiwgc2ssIHNrYi0+bGVuKTsKIApAQCAtMzg2Myw3ICs0MzU0LDcgQEAKIAogZG9uZToKIAlpZiAoc2spCi0JCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJcmVsZWFzZV9zb2NrKHNrKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtMzkxMywxNCArNDQwNCwxMSBAQAogCiAvKiAtLS0tIEwyQ0FQIGludGVyZmFjZSB3aXRoIGxvd2VyIGxheWVyIChIQ0kpIC0tLS0gKi8KIAotc3RhdGljIGludCBsMmNhcF9jb25uZWN0X2luZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgdTggdHlwZSkKK2ludCBsMmNhcF9jb25uZWN0X2luZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcikKIHsKIAlpbnQgZXhhY3QgPSAwLCBsbTEgPSAwLCBsbTIgPSAwOwogCXN0cnVjdCBsMmNhcF9jaGFuICpjOwogCi0JaWYgKHR5cGUgIT0gQUNMX0xJTkspCi0JCXJldHVybiAtRUlOVkFMOwotCiAJQlRfREJHKCJoZGV2ICVzLCBiZGFkZHIgJXMiLCBoZGV2LT5uYW1lLCBiYXRvc3RyKGJkYWRkcikpOwogCiAJLyogRmluZCBsaXN0ZW5pbmcgc29ja2V0cyBhbmQgY2hlY2sgdGhlaXIgbGlua19tb2RlICovCkBAIC0zOTMzLDEyICs0NDIxLDEyIEBACiAKIAkJaWYgKCFiYWNtcCgmYnRfc2soc2spLT5zcmMsICZoZGV2LT5iZGFkZHIpKSB7CiAJCQlsbTEgfD0gSENJX0xNX0FDQ0VQVDsKLQkJCWlmIChjLT5yb2xlX3N3aXRjaCkKKwkJCWlmICh0ZXN0X2JpdChGTEFHX1JPTEVfU1dJVENILCAmYy0+ZmxhZ3MpKQogCQkJCWxtMSB8PSBIQ0lfTE1fTUFTVEVSOwogCQkJZXhhY3QrKzsKIAkJfSBlbHNlIGlmICghYmFjbXAoJmJ0X3NrKHNrKS0+c3JjLCBCREFERFJfQU5ZKSkgewogCQkJbG0yIHw9IEhDSV9MTV9BQ0NFUFQ7Ci0JCQlpZiAoYy0+cm9sZV9zd2l0Y2gpCisJCQlpZiAodGVzdF9iaXQoRkxBR19ST0xFX1NXSVRDSCwgJmMtPmZsYWdzKSkKIAkJCQlsbTIgfD0gSENJX0xNX01BU1RFUjsKIAkJfQogCX0KQEAgLTM5NDcsMTUgKzQ0MzUsMTIgQEAKIAlyZXR1cm4gZXhhY3QgPyBsbTEgOiBsbTI7CiB9CiAKLXN0YXRpYyBpbnQgbDJjYXBfY29ubmVjdF9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCBzdGF0dXMpCitpbnQgbDJjYXBfY29ubmVjdF9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCBzdGF0dXMpCiB7CiAJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm47CiAKIAlCVF9EQkcoImhjb24gJXAgYmRhZGRyICVzIHN0YXR1cyAlZCIsIGhjb24sIGJhdG9zdHIoJmhjb24tPmRzdCksIHN0YXR1cyk7CiAKLQlpZiAoIShoY29uLT50eXBlID09IEFDTF9MSU5LIHx8IGhjb24tPnR5cGUgPT0gTEVfTElOSykpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKCFzdGF0dXMpIHsKIAkJY29ubiA9IGwyY2FwX2Nvbm5fYWRkKGhjb24sIHN0YXR1cyk7CiAJCWlmIChjb25uKQpAQCAtMzk2NiwyNyArNDQ1MSwyMiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGwyY2FwX2Rpc2Nvbm5faW5kKHN0cnVjdCBoY2lfY29ubiAqaGNvbikKK2ludCBsMmNhcF9kaXNjb25uX2luZChzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24pCiB7CiAJc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4gPSBoY29uLT5sMmNhcF9kYXRhOwogCiAJQlRfREJHKCJoY29uICVwIiwgaGNvbik7CiAKLQlpZiAoKGhjb24tPnR5cGUgIT0gQUNMX0xJTksgJiYgaGNvbi0+dHlwZSAhPSBMRV9MSU5LKSB8fCAhY29ubikKLQkJcmV0dXJuIDB4MTM7Ci0KKwlpZiAoIWNvbm4pCisJCXJldHVybiBIQ0lfRVJST1JfUkVNT1RFX1VTRVJfVEVSTTsKIAlyZXR1cm4gY29ubi0+ZGlzY19yZWFzb247CiB9CiAKLXN0YXRpYyBpbnQgbDJjYXBfZGlzY29ubl9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCByZWFzb24pCitpbnQgbDJjYXBfZGlzY29ubl9jZm0oc3RydWN0IGhjaV9jb25uICpoY29uLCB1OCByZWFzb24pCiB7CiAJQlRfREJHKCJoY29uICVwIHJlYXNvbiAlZCIsIGhjb24sIHJlYXNvbik7CiAKLQlpZiAoIShoY29uLT50eXBlID09IEFDTF9MSU5LIHx8IGhjb24tPnR5cGUgPT0gTEVfTElOSykpCi0JCXJldHVybiAtRUlOVkFMOwotCiAJbDJjYXBfY29ubl9kZWwoaGNvbiwgYnRfdG9fZXJybm8ocmVhc29uKSk7Ci0KIAlyZXR1cm4gMDsKIH0KIApAQCAtNDAwNyw3ICs0NDg3LDcgQEAKIAl9CiB9CiAKLXN0YXRpYyBpbnQgbDJjYXBfc2VjdXJpdHlfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgdTggc3RhdHVzLCB1OCBlbmNyeXB0KQoraW50IGwyY2FwX3NlY3VyaXR5X2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHU4IHN0YXR1cywgdTggZW5jcnlwdCkKIHsKIAlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGhjb24tPmwyY2FwX2RhdGE7CiAJc3RydWN0IGwyY2FwX2NoYW4gKmNoYW47CkBAIC00MDE5LDEyICs0NDk5LDEyIEBACiAKIAlpZiAoaGNvbi0+dHlwZSA9PSBMRV9MSU5LKSB7CiAJCXNtcF9kaXN0cmlidXRlX2tleXMoY29ubiwgMCk7Ci0JCWRlbF90aW1lcigmY29ubi0+c2VjdXJpdHlfdGltZXIpOworCQlfX2NhbmNlbF9kZWxheWVkX3dvcmsoJmNvbm4tPnNlY3VyaXR5X3RpbWVyKTsKIAl9CiAKLQlyZWFkX2xvY2soJmNvbm4tPmNoYW5fbG9jayk7CisJcmN1X3JlYWRfbG9jaygpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjaGFuLCAmY29ubi0+Y2hhbl9sLCBsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2hhbiwgJmNvbm4tPmNoYW5fbCwgbGlzdCkgewogCQlzdHJ1Y3Qgc29jayAqc2sgPSBjaGFuLT5zazsKIAogCQliaF9sb2NrX3NvY2soc2spOwpAQCAtNDEwMiwxMiArNDU4MiwxMiBAQAogCQliaF91bmxvY2tfc29jayhzayk7CiAJfQogCi0JcmVhZF91bmxvY2soJmNvbm4tPmNoYW5fbG9jayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBsMmNhcF9yZWN2X2FjbGRhdGEoc3RydWN0IGhjaV9jb25uICpoY29uLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MTYgZmxhZ3MpCitpbnQgbDJjYXBfcmVjdl9hY2xkYXRhKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTE2IGZsYWdzKQogewogCXN0cnVjdCBsMmNhcF9jb25uICpjb25uID0gaGNvbi0+bDJjYXBfZGF0YTsKIApAQCAtNDE2OCwxMSArNDY0OCwxMSBAQAogCQkJCUJUX0VSUigiRnJhbWUgZXhjZWVkaW5nIHJlY3YgTVRVIChsZW4gJWQsICIKIAkJCQkJCQkiTVRVICVkKSIsIGxlbiwKIAkJCQkJCQljaGFuLT5pbXR1KTsKLQkJCQliaF91bmxvY2tfc29jayhzayk7CisJCQkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJCQlsMmNhcF9jb25uX3VucmVsaWFibGUoY29ubiwgRUNPTU0pOwogCQkJCWdvdG8gZHJvcDsKIAkJCX0KLQkJCWJoX3VubG9ja19zb2NrKHNrKTsKKwkJCXJlbGVhc2Vfc29jayhzayk7CiAJCX0KIAogCQkvKiBBbGxvY2F0ZSBza2IgZm9yIHRoZSBjb21wbGV0ZSBmcmFtZSAod2l0aCBoZWFkZXIpICovCkBAIC00MjU0LDE3ICs0NzM0LDYgQEAKIAogc3RhdGljIHN0cnVjdCBkZW50cnkgKmwyY2FwX2RlYnVnZnM7CiAKLXN0YXRpYyBzdHJ1Y3QgaGNpX3Byb3RvIGwyY2FwX2hjaV9wcm90byA9IHsKLQkubmFtZQkJPSAiTDJDQVAiLAotCS5pZAkJPSBIQ0lfUFJPVE9fTDJDQVAsCi0JLmNvbm5lY3RfaW5kCT0gbDJjYXBfY29ubmVjdF9pbmQsCi0JLmNvbm5lY3RfY2ZtCT0gbDJjYXBfY29ubmVjdF9jZm0sCi0JLmRpc2Nvbm5faW5kCT0gbDJjYXBfZGlzY29ubl9pbmQsCi0JLmRpc2Nvbm5fY2ZtCT0gbDJjYXBfZGlzY29ubl9jZm0sCi0JLnNlY3VyaXR5X2NmbQk9IGwyY2FwX3NlY3VyaXR5X2NmbSwKLQkucmVjdl9hY2xkYXRhCT0gbDJjYXBfcmVjdl9hY2xkYXRhCi19OwotCiBpbnQgX19pbml0IGwyY2FwX2luaXQodm9pZCkKIHsKIAlpbnQgZXJyOwpAQCAtNDI3MywxMyArNDc0Miw2IEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQllcnIgPSBoY2lfcmVnaXN0ZXJfcHJvdG8oJmwyY2FwX2hjaV9wcm90byk7Ci0JaWYgKGVyciA8IDApIHsKLQkJQlRfRVJSKCJMMkNBUCBwcm90b2NvbCByZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0JCWJ0X3NvY2tfdW5yZWdpc3RlcihCVFBST1RPX0wyQ0FQKTsKLQkJZ290byBlcnJvcjsKLQl9Ci0KIAlpZiAoYnRfZGVidWdmcykgewogCQlsMmNhcF9kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZmlsZSgibDJjYXAiLCAwNDQ0LAogCQkJCQlidF9kZWJ1Z2ZzLCBOVUxMLCAmbDJjYXBfZGVidWdmc19mb3BzKTsKQEAgLTQyODgsMTkgKzQ3NTAsMTEgQEAKIAl9CiAKIAlyZXR1cm4gMDsKLQotZXJyb3I6Ci0JbDJjYXBfY2xlYW51cF9zb2NrZXRzKCk7Ci0JcmV0dXJuIGVycjsKIH0KIAogdm9pZCBsMmNhcF9leGl0KHZvaWQpCiB7CiAJZGVidWdmc19yZW1vdmUobDJjYXBfZGVidWdmcyk7Ci0KLQlpZiAoaGNpX3VucmVnaXN0ZXJfcHJvdG8oJmwyY2FwX2hjaV9wcm90bykgPCAwKQotCQlCVF9FUlIoIkwyQ0FQIHByb3RvY29sIHVucmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotCiAJbDJjYXBfY2xlYW51cF9zb2NrZXRzKCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvbDJjYXBfc29jay5jIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKaW5kZXggNWM0MDZkMy4uOWNhNTYxNiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9sMmNhcF9zb2NrLmMKQEAgLTMsNiArMyw3IEBACiAgICBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBRdWFsY29tbSBJbmNvcnBvcmF0ZWQKICAgIENvcHlyaWdodCAoQykgMjAwOS0yMDEwIEd1c3Rhdm8gRi4gUGFkb3ZhbiA8Z3VzdGF2b0BwYWRvdmFuLm9yZz4KICAgIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLgorICAgQ29weXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCiAKICAgIFdyaXR0ZW4gMjAwMCwyMDAxIGJ5IE1heGltIEtyYXNueWFuc2t5IDxtYXhrQHF1YWxjb21tLmNvbT4KIApAQCAtMTIyLDcwICsxMjMsMTUgQEAKIAlpZiAobGEubDJfY2lkICYmIGxhLmwyX3BzbSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlsb2NrX3NvY2soc2spOwotCi0JaWYgKGNoYW4tPmNoYW5fdHlwZSA9PSBMMkNBUF9DSEFOX0NPTk5fT1JJRU5URUQKLQkJCSYmICEobGEubDJfcHNtIHx8IGxhLmwyX2NpZCkpIHsKLQkJZXJyID0gLUVJTlZBTDsKLQkJZ290byBkb25lOwotCX0KLQotCXN3aXRjaCAoY2hhbi0+bW9kZSkgewotCWNhc2UgTDJDQVBfTU9ERV9CQVNJQzoKLQkJYnJlYWs7Ci0JY2FzZSBMMkNBUF9NT0RFX0VSVE06Ci0JY2FzZSBMMkNBUF9NT0RFX1NUUkVBTUlORzoKLQkJaWYgKCFkaXNhYmxlX2VydG0pCi0JCQlicmVhazsKLQkJLyogZmFsbCB0aHJvdWdoICovCi0JZGVmYXVsdDoKLQkJZXJyID0gLUVOT1RTVVBQOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0Jc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKLQljYXNlIEJUX0NPTk5FQ1Q6Ci0JY2FzZSBCVF9DT05ORUNUMjoKLQljYXNlIEJUX0NPTkZJRzoKLQkJLyogQWxyZWFkeSBjb25uZWN0aW5nICovCi0JCWdvdG8gd2FpdDsKLQotCWNhc2UgQlRfQ09OTkVDVEVEOgotCQkvKiBBbHJlYWR5IGNvbm5lY3RlZCAqLwotCQllcnIgPSAtRUlTQ09OTjsKLQkJZ290byBkb25lOwotCi0JY2FzZSBCVF9PUEVOOgotCWNhc2UgQlRfQk9VTkQ6Ci0JCS8qIENhbiBjb25uZWN0ICovCi0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJZXJyID0gLUVCQURGRDsKLQkJZ290byBkb25lOwotCX0KLQotCS8qIFBTTSBtdXN0IGJlIG9kZCBhbmQgbHNiIG9mIHVwcGVyIGJ5dGUgbXVzdCBiZSAwICovCi0JaWYgKChfX2xlMTZfdG9fY3B1KGxhLmwyX3BzbSkgJiAweDAxMDEpICE9IDB4MDAwMSAmJiAhbGEubDJfY2lkICYmCi0JCQkJCWNoYW4tPmNoYW5fdHlwZSAhPSBMMkNBUF9DSEFOX1JBVykgewotCQllcnIgPSAtRUlOVkFMOwotCQlnb3RvIGRvbmU7Ci0JfQotCi0JLyogU2V0IGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHBzbSAqLwotCWJhY3B5KCZidF9zayhzayktPmRzdCwgJmxhLmwyX2JkYWRkcik7Ci0JY2hhbi0+cHNtID0gbGEubDJfcHNtOwotCWNoYW4tPmRjaWQgPSBsYS5sMl9jaWQ7Ci0KLQllcnIgPSBsMmNhcF9jaGFuX2Nvbm5lY3QobDJjYXBfcGkoc2spLT5jaGFuKTsKKwllcnIgPSBsMmNhcF9jaGFuX2Nvbm5lY3QoY2hhbiwgbGEubDJfcHNtLCBsYS5sMl9jaWQsICZsYS5sMl9iZGFkZHIpOwogCWlmIChlcnIpCiAJCWdvdG8gZG9uZTsKIAotd2FpdDoKIAllcnIgPSBidF9zb2NrX3dhaXRfc3RhdGUoc2ssIEJUX0NPTk5FQ1RFRCwKIAkJCXNvY2tfc25kdGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSykpOwogZG9uZToKLQlyZWxlYXNlX3NvY2soc2spOworCWlmIChzb2NrX293bmVkX2J5X3VzZXIoc2spKQorCQlyZWxlYXNlX3NvY2soc2spOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTMzNCw3ICsyODAsNyBAQAogCQlvcHRzLm1vZGUgICAgID0gY2hhbi0+bW9kZTsKIAkJb3B0cy5mY3MgICAgICA9IGNoYW4tPmZjczsKIAkJb3B0cy5tYXhfdHggICA9IGNoYW4tPm1heF90eDsKLQkJb3B0cy50eHdpbl9zaXplID0gKF9fdTE2KWNoYW4tPnR4X3dpbjsKKwkJb3B0cy50eHdpbl9zaXplID0gY2hhbi0+dHhfd2luOwogCiAJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2Yob3B0cykpOwogCQlpZiAoY29weV90b191c2VyKG9wdHZhbCwgKGNoYXIgKikgJm9wdHMsIGxlbikpCkBAIC0zNTksMTAgKzMwNSwxMCBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoY2hhbi0+cm9sZV9zd2l0Y2gpCisJCWlmICh0ZXN0X2JpdChGTEFHX1JPTEVfU1dJVENILCAmY2hhbi0+ZmxhZ3MpKQogCQkJb3B0IHw9IEwyQ0FQX0xNX01BU1RFUjsKIAotCQlpZiAoY2hhbi0+Zm9yY2VfcmVsaWFibGUpCisJCWlmICh0ZXN0X2JpdChGTEFHX0ZPUkNFX1JFTElBQkxFLCAmY2hhbi0+ZmxhZ3MpKQogCQkJb3B0IHw9IEwyQ0FQX0xNX1JFTElBQkxFOwogCiAJCWlmIChwdXRfdXNlcihvcHQsICh1MzIgX191c2VyICopIG9wdHZhbCkpCkBAIC00NDksNyArMzk1LDggQEAKIAkJYnJlYWs7CiAKIAljYXNlIEJUX0ZMVVNIQUJMRToKLQkJaWYgKHB1dF91c2VyKGNoYW4tPmZsdXNoYWJsZSwgKHUzMiBfX3VzZXIgKikgb3B0dmFsKSkKKwkJaWYgKHB1dF91c2VyKHRlc3RfYml0KEZMQUdfRkxVU0hBQkxFLCAmY2hhbi0+ZmxhZ3MpLAorCQkJCQkJKHUzMiBfX3VzZXIgKikgb3B0dmFsKSkKIAkJCWVyciA9IC1FRkFVTFQ7CiAKIAkJYnJlYWs7CkBAIC00NjEsNyArNDA4LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJcHdyLmZvcmNlX2FjdGl2ZSA9IGNoYW4tPmZvcmNlX2FjdGl2ZTsKKwkJcHdyLmZvcmNlX2FjdGl2ZSA9IHRlc3RfYml0KEZMQUdfRk9SQ0VfQUNUSVZFLCAmY2hhbi0+ZmxhZ3MpOwogCiAJCWxlbiA9IG1pbl90KHVuc2lnbmVkIGludCwgbGVuLCBzaXplb2YocHdyKSk7CiAJCWlmIChjb3B5X3RvX3VzZXIob3B0dmFsLCAoY2hhciAqKSAmcHdyLCBsZW4pKQpAQCAtNDY5LDYgKzQxNiwxNiBAQAogCiAJCWJyZWFrOwogCisJY2FzZSBCVF9DSEFOTkVMX1BPTElDWToKKwkJaWYgKCFlbmFibGVfaHMpIHsKKwkJCWVyciA9IC1FTk9QUk9UT09QVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHB1dF91c2VyKGNoYW4tPmNoYW5fcG9saWN5LCAodTMyIF9fdXNlciAqKSBvcHR2YWwpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQllcnIgPSAtRU5PUFJPVE9PUFQ7CiAJCWJyZWFrOwpAQCAtNTAzLDcgKzQ2MCw3IEBACiAJCW9wdHMubW9kZSAgICAgPSBjaGFuLT5tb2RlOwogCQlvcHRzLmZjcyAgICAgID0gY2hhbi0+ZmNzOwogCQlvcHRzLm1heF90eCAgID0gY2hhbi0+bWF4X3R4OwotCQlvcHRzLnR4d2luX3NpemUgPSAoX191MTYpY2hhbi0+dHhfd2luOworCQlvcHRzLnR4d2luX3NpemUgPSBjaGFuLT50eF93aW47CiAKIAkJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplb2Yob3B0cyksIG9wdGxlbik7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigoY2hhciAqKSAmb3B0cywgb3B0dmFsLCBsZW4pKSB7CkBAIC01MTEsNyArNDY4LDcgQEAKIAkJCWJyZWFrOwogCQl9CiAKLQkJaWYgKG9wdHMudHh3aW5fc2l6ZSA+IEwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XKSB7CisJCWlmIChvcHRzLnR4d2luX3NpemUgPiBMMkNBUF9ERUZBVUxUX0VYVF9XSU5ET1cpIHsKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlicmVhazsKIAkJfQpAQCAtNTM1LDcgKzQ5Miw3IEBACiAJCWNoYW4tPm9tdHUgPSBvcHRzLm9tdHU7CiAJCWNoYW4tPmZjcyAgPSBvcHRzLmZjczsKIAkJY2hhbi0+bWF4X3R4ID0gb3B0cy5tYXhfdHg7Ci0JCWNoYW4tPnR4X3dpbiA9IChfX3U4KW9wdHMudHh3aW5fc2l6ZTsKKwkJY2hhbi0+dHhfd2luID0gb3B0cy50eHdpbl9zaXplOwogCQlicmVhazsKIAogCWNhc2UgTDJDQVBfTE06CkBAIC01NTEsOCArNTA4LDE1IEBACiAJCWlmIChvcHQgJiBMMkNBUF9MTV9TRUNVUkUpCiAJCQljaGFuLT5zZWNfbGV2ZWwgPSBCVF9TRUNVUklUWV9ISUdIOwogCi0JCWNoYW4tPnJvbGVfc3dpdGNoICAgID0gKG9wdCAmIEwyQ0FQX0xNX01BU1RFUik7Ci0JCWNoYW4tPmZvcmNlX3JlbGlhYmxlID0gKG9wdCAmIEwyQ0FQX0xNX1JFTElBQkxFKTsKKwkJaWYgKG9wdCAmIEwyQ0FQX0xNX01BU1RFUikKKwkJCXNldF9iaXQoRkxBR19ST0xFX1NXSVRDSCwgJmNoYW4tPmZsYWdzKTsKKwkJZWxzZQorCQkJY2xlYXJfYml0KEZMQUdfUk9MRV9TV0lUQ0gsICZjaGFuLT5mbGFncyk7CisKKwkJaWYgKG9wdCAmIEwyQ0FQX0xNX1JFTElBQkxFKQorCQkJc2V0X2JpdChGTEFHX0ZPUkNFX1JFTElBQkxFLCAmY2hhbi0+ZmxhZ3MpOworCQllbHNlCisJCQljbGVhcl9iaXQoRkxBR19GT1JDRV9SRUxJQUJMRSwgJmNoYW4tPmZsYWdzKTsKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgpAQCAtNjA4LDggKzU3MiwxMyBAQAogCiAJCWNoYW4tPnNlY19sZXZlbCA9IHNlYy5sZXZlbDsKIAorCQlpZiAoIWNoYW4tPmNvbm4pCisJCQlicmVhazsKKwogCQljb25uID0gY2hhbi0+Y29ubjsKLQkJaWYgKGNvbm4gJiYgY2hhbi0+c2NpZCA9PSBMMkNBUF9DSURfTEVfREFUQSkgeworCisJCS8qY2hhbmdlIHNlY3VyaXR5IGZvciBMRSBjaGFubmVscyAqLworCQlpZiAoY2hhbi0+c2NpZCA9PSBMMkNBUF9DSURfTEVfREFUQSkgewogCQkJaWYgKCFjb25uLT5oY29uLT5vdXQpIHsKIAkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWJyZWFrOwpAQCAtNjE3LDkgKzU4NiwxNCBAQAogCiAJCQlpZiAoc21wX2Nvbm5fc2VjdXJpdHkoY29ubiwgc2VjLmxldmVsKSkKIAkJCQlicmVhazsKLQotCQkJZXJyID0gMDsKIAkJCXNrLT5za19zdGF0ZSA9IEJUX0NPTkZJRzsKKworCQkvKiBvciBmb3IgQUNMIGxpbmssIHVuZGVyIGRlZmVyX3NldHVwIHRpbWUgKi8KKwkJfSBlbHNlIGlmIChzay0+c2tfc3RhdGUgPT0gQlRfQ09OTkVDVDIgJiYKKwkJCQkJYnRfc2soc2spLT5kZWZlcl9zZXR1cCkgeworCQkJZXJyID0gbDJjYXBfY2hhbl9jaGVja19zZWN1cml0eShjaGFuKTsKKwkJfSBlbHNlIHsKKwkJCWVyciA9IC1FSU5WQUw7CiAJCX0KIAkJYnJlYWs7CiAKQEAgLTY1OCw3ICs2MzIsMTAgQEAKIAkJCX0KIAkJfQogCi0JCWNoYW4tPmZsdXNoYWJsZSA9IG9wdDsKKwkJaWYgKG9wdCkKKwkJCXNldF9iaXQoRkxBR19GTFVTSEFCTEUsICZjaGFuLT5mbGFncyk7CisJCWVsc2UKKwkJCWNsZWFyX2JpdChGTEFHX0ZMVVNIQUJMRSwgJmNoYW4tPmZsYWdzKTsKIAkJYnJlYWs7CiAKIAljYXNlIEJUX1BPV0VSOgpAQCAtNjc1LDcgKzY1MiwzNiBAQAogCQkJZXJyID0gLUVGQVVMVDsKIAkJCWJyZWFrOwogCQl9Ci0JCWNoYW4tPmZvcmNlX2FjdGl2ZSA9IHB3ci5mb3JjZV9hY3RpdmU7CisKKwkJaWYgKHB3ci5mb3JjZV9hY3RpdmUpCisJCQlzZXRfYml0KEZMQUdfRk9SQ0VfQUNUSVZFLCAmY2hhbi0+ZmxhZ3MpOworCQllbHNlCisJCQljbGVhcl9iaXQoRkxBR19GT1JDRV9BQ1RJVkUsICZjaGFuLT5mbGFncyk7CisJCWJyZWFrOworCisJY2FzZSBCVF9DSEFOTkVMX1BPTElDWToKKwkJaWYgKCFlbmFibGVfaHMpIHsKKwkJCWVyciA9IC1FTk9QUk9UT09QVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGdldF91c2VyKG9wdCwgKHUzMiBfX3VzZXIgKikgb3B0dmFsKSkgeworCQkJZXJyID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG9wdCA+IEJUX0NIQU5ORUxfUE9MSUNZX0FNUF9QUkVGRVJSRUQpIHsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChjaGFuLT5tb2RlICE9IEwyQ0FQX01PREVfRVJUTSAmJgorCQkJCWNoYW4tPm1vZGUgIT0gTDJDQVBfTU9ERV9TVFJFQU1JTkcpIHsKKwkJCWVyciA9IC1FT1BOT1RTVVBQOworCQkJYnJlYWs7CisJCX0KKworCQljaGFuLT5jaGFuX3BvbGljeSA9ICh1OCkgb3B0OwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC03MDksNyArNzE1LDcgQEAKIAkJcmV0dXJuIC1FTk9UQ09OTjsKIAl9CiAKLQllcnIgPSBsMmNhcF9jaGFuX3NlbmQoY2hhbiwgbXNnLCBsZW4pOworCWVyciA9IGwyY2FwX2NoYW5fc2VuZChjaGFuLCBtc2csIGxlbiwgc2stPnNrX3ByaW9yaXR5KTsKIAogCXJlbGVhc2Vfc29jayhzayk7CiAJcmV0dXJuIGVycjsKQEAgLTkzMSwxMSArOTM3LDkgQEAKIAkJY2hhbi0+ZmNzICA9IHBjaGFuLT5mY3M7CiAJCWNoYW4tPm1heF90eCA9IHBjaGFuLT5tYXhfdHg7CiAJCWNoYW4tPnR4X3dpbiA9IHBjaGFuLT50eF93aW47CisJCWNoYW4tPnR4X3dpbl9tYXggPSBwY2hhbi0+dHhfd2luX21heDsKIAkJY2hhbi0+c2VjX2xldmVsID0gcGNoYW4tPnNlY19sZXZlbDsKLQkJY2hhbi0+cm9sZV9zd2l0Y2ggPSBwY2hhbi0+cm9sZV9zd2l0Y2g7Ci0JCWNoYW4tPmZvcmNlX3JlbGlhYmxlID0gcGNoYW4tPmZvcmNlX3JlbGlhYmxlOwotCQljaGFuLT5mbHVzaGFibGUgPSBwY2hhbi0+Zmx1c2hhYmxlOwotCQljaGFuLT5mb3JjZV9hY3RpdmUgPSBwY2hhbi0+Zm9yY2VfYWN0aXZlOworCQljaGFuLT5mbGFncyA9IHBjaGFuLT5mbGFnczsKIAogCQlzZWN1cml0eV9za19jbG9uZShwYXJlbnQsIHNrKTsKIAl9IGVsc2UgewpAQCAtOTY0LDEyICs5NjgsMTAgQEAKIAkJY2hhbi0+bWF4X3R4ID0gTDJDQVBfREVGQVVMVF9NQVhfVFg7CiAJCWNoYW4tPmZjcyAgPSBMMkNBUF9GQ1NfQ1JDMTY7CiAJCWNoYW4tPnR4X3dpbiA9IEwyQ0FQX0RFRkFVTFRfVFhfV0lORE9XOworCQljaGFuLT50eF93aW5fbWF4ID0gTDJDQVBfREVGQVVMVF9UWF9XSU5ET1c7CiAJCWNoYW4tPnNlY19sZXZlbCA9IEJUX1NFQ1VSSVRZX0xPVzsKLQkJY2hhbi0+cm9sZV9zd2l0Y2ggPSAwOwotCQljaGFuLT5mb3JjZV9yZWxpYWJsZSA9IDA7Ci0JCWNoYW4tPmZsdXNoYWJsZSA9IEJUX0ZMVVNIQUJMRV9PRkY7Ci0JCWNoYW4tPmZvcmNlX2FjdGl2ZSA9IEJUX1BPV0VSX0ZPUkNFX0FDVElWRV9PTjsKLQorCQljaGFuLT5mbGFncyA9IDA7CisJCXNldF9iaXQoRkxBR19GT1JDRV9BQ1RJVkUsICZjaGFuLT5mbGFncyk7CiAJfQogCiAJLyogRGVmYXVsdCBjb25maWcgb3B0aW9ucyAqLwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9tZ210LmMgYi9uZXQvYmx1ZXRvb3RoL21nbXQuYwppbmRleCAyYzc2MzQyLi4yNTQwOTQ0IDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL21nbXQuYworKysgYi9uZXQvYmx1ZXRvb3RoL21nbXQuYwpAQCAtMjIsNiArMjIsNyBAQAogCiAvKiBCbHVldG9vdGggSENJIE1hbmFnZW1lbnQgaW50ZXJmYWNlICovCiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgpAQCAtMjksMjYgKzMwLDEwMyBAQAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbWdtdC5oPgorI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvc21wLmg+CiAKICNkZWZpbmUgTUdNVF9WRVJTSU9OCTAKICNkZWZpbmUgTUdNVF9SRVZJU0lPTgkxCiAKKyNkZWZpbmUgSU5RVUlSWV9MRU5fQlJFRFIgMHgwOCAvKiBUR0FQKDEwMCkgKi8KKworI2RlZmluZSBTRVJWSUNFX0NBQ0hFX1RJTUVPVVQgKDUgKiAxMDAwKQorCiBzdHJ1Y3QgcGVuZGluZ19jbWQgewogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKLQlfX3UxNiBvcGNvZGU7CisJdTE2IG9wY29kZTsKIAlpbnQgaW5kZXg7CiAJdm9pZCAqcGFyYW07CiAJc3RydWN0IHNvY2sgKnNrOwogCXZvaWQgKnVzZXJfZGF0YTsKIH07CiAKLXN0YXRpYyBMSVNUX0hFQUQoY21kX2xpc3QpOworLyogSENJIHRvIE1HTVQgZXJyb3IgY29kZSBjb252ZXJzaW9uIHRhYmxlICovCitzdGF0aWMgdTggbWdtdF9zdGF0dXNfdGFibGVbXSA9IHsKKwlNR01UX1NUQVRVU19TVUNDRVNTLAorCU1HTVRfU1RBVFVTX1VOS05PV05fQ09NTUFORCwJLyogVW5rbm93biBDb21tYW5kICovCisJTUdNVF9TVEFUVVNfTk9UX0NPTk5FQ1RFRCwJLyogTm8gQ29ubmVjdGlvbiAqLworCU1HTVRfU1RBVFVTX0ZBSUxFRCwJCS8qIEhhcmR3YXJlIEZhaWx1cmUgKi8KKwlNR01UX1NUQVRVU19DT05ORUNUX0ZBSUxFRCwJLyogUGFnZSBUaW1lb3V0ICovCisJTUdNVF9TVEFUVVNfQVVUSF9GQUlMRUQsCS8qIEF1dGhlbnRpY2F0aW9uIEZhaWxlZCAqLworCU1HTVRfU1RBVFVTX05PVF9QQUlSRUQsCQkvKiBQSU4gb3IgS2V5IE1pc3NpbmcgKi8KKwlNR01UX1NUQVRVU19OT19SRVNPVVJDRVMsCS8qIE1lbW9yeSBGdWxsICovCisJTUdNVF9TVEFUVVNfVElNRU9VVCwJCS8qIENvbm5lY3Rpb24gVGltZW91dCAqLworCU1HTVRfU1RBVFVTX05PX1JFU09VUkNFUywJLyogTWF4IE51bWJlciBvZiBDb25uZWN0aW9ucyAqLworCU1HTVRfU1RBVFVTX05PX1JFU09VUkNFUywJLyogTWF4IE51bWJlciBvZiBTQ08gQ29ubmVjdGlvbnMgKi8KKwlNR01UX1NUQVRVU19BTFJFQURZX0NPTk5FQ1RFRCwJLyogQUNMIENvbm5lY3Rpb24gRXhpc3RzICovCisJTUdNVF9TVEFUVVNfQlVTWSwJCS8qIENvbW1hbmQgRGlzYWxsb3dlZCAqLworCU1HTVRfU1RBVFVTX05PX1JFU09VUkNFUywJLyogUmVqZWN0ZWQgTGltaXRlZCBSZXNvdXJjZXMgKi8KKwlNR01UX1NUQVRVU19SRUpFQ1RFRCwJCS8qIFJlamVjdGVkIFNlY3VyaXR5ICovCisJTUdNVF9TVEFUVVNfUkVKRUNURUQsCQkvKiBSZWplY3RlZCBQZXJzb25hbCAqLworCU1HTVRfU1RBVFVTX1RJTUVPVVQsCQkvKiBIb3N0IFRpbWVvdXQgKi8KKwlNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVELAkvKiBVbnN1cHBvcnRlZCBGZWF0dXJlICovCisJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCS8qIEludmFsaWQgUGFyYW1ldGVycyAqLworCU1HTVRfU1RBVFVTX0RJU0NPTk5FQ1RFRCwJLyogT0UgVXNlciBFbmRlZCBDb25uZWN0aW9uICovCisJTUdNVF9TVEFUVVNfTk9fUkVTT1VSQ0VTLAkvKiBPRSBMb3cgUmVzb3VyY2VzICovCisJTUdNVF9TVEFUVVNfRElTQ09OTkVDVEVELAkvKiBPRSBQb3dlciBPZmYgKi8KKwlNR01UX1NUQVRVU19ESVNDT05ORUNURUQsCS8qIENvbm5lY3Rpb24gVGVybWluYXRlZCAqLworCU1HTVRfU1RBVFVTX0JVU1ksCQkvKiBSZXBlYXRlZCBBdHRlbXB0cyAqLworCU1HTVRfU1RBVFVTX1JFSkVDVEVELAkJLyogUGFpcmluZyBOb3QgQWxsb3dlZCAqLworCU1HTVRfU1RBVFVTX0ZBSUxFRCwJCS8qIFVua25vd24gTE1QIFBEVSAqLworCU1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQsCS8qIFVuc3VwcG9ydGVkIFJlbW90ZSBGZWF0dXJlICovCisJTUdNVF9TVEFUVVNfUkVKRUNURUQsCQkvKiBTQ08gT2Zmc2V0IFJlamVjdGVkICovCisJTUdNVF9TVEFUVVNfUkVKRUNURUQsCQkvKiBTQ08gSW50ZXJ2YWwgUmVqZWN0ZWQgKi8KKwlNR01UX1NUQVRVU19SRUpFQ1RFRCwJCS8qIEFpciBNb2RlIFJlamVjdGVkICovCisJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCS8qIEludmFsaWQgTE1QIFBhcmFtZXRlcnMgKi8KKwlNR01UX1NUQVRVU19GQUlMRUQsCQkvKiBVbnNwZWNpZmllZCBFcnJvciAqLworCU1HTVRfU1RBVFVTX05PVF9TVVBQT1JURUQsCS8qIFVuc3VwcG9ydGVkIExNUCBQYXJhbWV0ZXIgVmFsdWUgKi8KKwlNR01UX1NUQVRVU19GQUlMRUQsCQkvKiBSb2xlIENoYW5nZSBOb3QgQWxsb3dlZCAqLworCU1HTVRfU1RBVFVTX1RJTUVPVVQsCQkvKiBMTVAgUmVzcG9uc2UgVGltZW91dCAqLworCU1HTVRfU1RBVFVTX0ZBSUxFRCwJCS8qIExNUCBFcnJvciBUcmFuc2FjdGlvbiBDb2xsaXNpb24gKi8KKwlNR01UX1NUQVRVU19GQUlMRUQsCQkvKiBMTVAgUERVIE5vdCBBbGxvd2VkICovCisJTUdNVF9TVEFUVVNfUkVKRUNURUQsCQkvKiBFbmNyeXB0aW9uIE1vZGUgTm90IEFjY2VwdGVkICovCisJTUdNVF9TVEFUVVNfRkFJTEVELAkJLyogVW5pdCBMaW5rIEtleSBVc2VkICovCisJTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCwJLyogUW9TIE5vdCBTdXBwb3J0ZWQgKi8KKwlNR01UX1NUQVRVU19USU1FT1VULAkJLyogSW5zdGFudCBQYXNzZWQgKi8KKwlNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVELAkvKiBQYWlyaW5nIE5vdCBTdXBwb3J0ZWQgKi8KKwlNR01UX1NUQVRVU19GQUlMRUQsCQkvKiBUcmFuc2FjdGlvbiBDb2xsaXNpb24gKi8KKwlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywJLyogVW5hY2NlcHRhYmxlIFBhcmFtZXRlciAqLworCU1HTVRfU1RBVFVTX1JFSkVDVEVELAkJLyogUW9TIFJlamVjdGVkICovCisJTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCwJLyogQ2xhc3NpZmljYXRpb24gTm90IFN1cHBvcnRlZCAqLworCU1HTVRfU1RBVFVTX1JFSkVDVEVELAkJLyogSW5zdWZmaWNpZW50IFNlY3VyaXR5ICovCisJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCS8qIFBhcmFtZXRlciBPdXQgT2YgUmFuZ2UgKi8KKwlNR01UX1NUQVRVU19CVVNZLAkJLyogUm9sZSBTd2l0Y2ggUGVuZGluZyAqLworCU1HTVRfU1RBVFVTX0ZBSUxFRCwJCS8qIFNsb3QgVmlvbGF0aW9uICovCisJTUdNVF9TVEFUVVNfRkFJTEVELAkJLyogUm9sZSBTd2l0Y2ggRmFpbGVkICovCisJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMsCS8qIEVJUiBUb28gTGFyZ2UgKi8KKwlNR01UX1NUQVRVU19OT1RfU1VQUE9SVEVELAkvKiBTaW1wbGUgUGFpcmluZyBOb3QgU3VwcG9ydGVkICovCisJTUdNVF9TVEFUVVNfQlVTWSwJCS8qIEhvc3QgQnVzeSBQYWlyaW5nICovCisJTUdNVF9TVEFUVVNfUkVKRUNURUQsCQkvKiBSZWplY3RlZCwgTm8gU3VpdGFibGUgQ2hhbm5lbCAqLworCU1HTVRfU1RBVFVTX0JVU1ksCQkvKiBDb250cm9sbGVyIEJ1c3kgKi8KKwlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUywJLyogVW5zdWl0YWJsZSBDb25uZWN0aW9uIEludGVydmFsICovCisJTUdNVF9TVEFUVVNfVElNRU9VVCwJCS8qIERpcmVjdGVkIEFkdmVydGlzaW5nIFRpbWVvdXQgKi8KKwlNR01UX1NUQVRVU19BVVRIX0ZBSUxFRCwJLyogVGVybWluYXRlZCBEdWUgdG8gTUlDIEZhaWx1cmUgKi8KKwlNR01UX1NUQVRVU19DT05ORUNUX0ZBSUxFRCwJLyogQ29ubmVjdGlvbiBFc3RhYmxpc2htZW50IEZhaWxlZCAqLworCU1HTVRfU1RBVFVTX0NPTk5FQ1RfRkFJTEVELAkvKiBNQUMgQ29ubmVjdGlvbiBGYWlsZWQgKi8KK307CisKK3N0YXRpYyB1OCBtZ210X3N0YXR1cyh1OCBoY2lfc3RhdHVzKQoreworCWlmIChoY2lfc3RhdHVzIDwgQVJSQVlfU0laRShtZ210X3N0YXR1c190YWJsZSkpCisJCXJldHVybiBtZ210X3N0YXR1c190YWJsZVtoY2lfc3RhdHVzXTsKKworCXJldHVybiBNR01UX1NUQVRVU19GQUlMRUQ7Cit9CiAKIHN0YXRpYyBpbnQgY21kX3N0YXR1cyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdTE2IGNtZCwgdTggc3RhdHVzKQogewogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG1nbXRfaGRyICpoZHI7CiAJc3RydWN0IG1nbXRfZXZfY21kX3N0YXR1cyAqZXY7CisJaW50IGVycjsKIAogCUJUX0RCRygic29jayAlcCwgaW5kZXggJXUsIGNtZCAldSwgc3RhdHVzICV1Iiwgc2ssIGluZGV4LCBjbWQsIHN0YXR1cyk7CiAKQEAgLTY2LDEwICsxNDQsMTEgQEAKIAlldi0+c3RhdHVzID0gc3RhdHVzOwogCXB1dF91bmFsaWduZWRfbGUxNihjbWQsICZldi0+b3Bjb2RlKTsKIAotCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikgPCAwKQorCWVyciA9IHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKKwlpZiAoZXJyIDwgMCkKIAkJa2ZyZWVfc2tiKHNrYik7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgaW50IGNtZF9jb21wbGV0ZShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdTE2IGNtZCwgdm9pZCAqcnAsCkBAIC03OCw2ICsxNTcsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IG1nbXRfaGRyICpoZHI7CiAJc3RydWN0IG1nbXRfZXZfY21kX2NvbXBsZXRlICpldjsKKwlpbnQgZXJyOwogCiAJQlRfREJHKCJzb2NrICVwIiwgc2spOwogCkBAIC05NywxMCArMTc3LDExIEBACiAJaWYgKHJwKQogCQltZW1jcHkoZXYtPmRhdGEsIHJwLCBycF9sZW4pOwogCi0JaWYgKHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKSA8IDApCisJZXJyID0gc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOworCWlmIChlcnIgPCAwKQogCQlrZnJlZV9za2Ioc2tiKTsKIAotCXJldHVybiAwOworCXJldHVybiBlcnI7OwogfQogCiBzdGF0aWMgaW50IHJlYWRfdmVyc2lvbihzdHJ1Y3Qgc29jayAqc2spCkBAIC0xMjAsNiArMjAxLDcgQEAKIHsKIAlzdHJ1Y3QgbWdtdF9ycF9yZWFkX2luZGV4X2xpc3QgKnJwOwogCXN0cnVjdCBsaXN0X2hlYWQgKnA7CisJc3RydWN0IGhjaV9kZXYgKmQ7CiAJc2l6ZV90IHJwX2xlbjsKIAl1MTYgY291bnQ7CiAJaW50IGksIGVycjsKQEAgLTE0MywxMCArMjI1LDkgQEAKIAlwdXRfdW5hbGlnbmVkX2xlMTYoY291bnQsICZycC0+bnVtX2NvbnRyb2xsZXJzKTsKIAogCWkgPSAwOwotCWxpc3RfZm9yX2VhY2gocCwgJmhjaV9kZXZfbGlzdCkgewotCQlzdHJ1Y3QgaGNpX2RldiAqZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IGhjaV9kZXYsIGxpc3QpOwotCi0JCWhjaV9kZWxfb2ZmX3RpbWVyKGQpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJmhjaV9kZXZfbGlzdCwgbGlzdCkgeworCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9BVVRPX09GRiwgJmQtPmZsYWdzKSkKKwkJCWNhbmNlbF9kZWxheWVkX3dvcmsoJmQtPnBvd2VyX29mZik7CiAKIAkJaWYgKHRlc3RfYml0KEhDSV9TRVRVUCwgJmQtPmZsYWdzKSkKIAkJCWNvbnRpbnVlOwpAQCAtMTY1LDM4MiArMjQ2LDYxIEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGludCByZWFkX2NvbnRyb2xsZXJfaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCkKK3N0YXRpYyB1MzIgZ2V0X3N1cHBvcnRlZF9zZXR0aW5ncyhzdHJ1Y3QgaGNpX2RldiAqaGRldikKIHsKLQlzdHJ1Y3QgbWdtdF9ycF9yZWFkX2luZm8gcnA7Ci0Jc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJdTMyIHNldHRpbmdzID0gMDsKIAotCUJUX0RCRygic29jayAlcCBoY2kldSIsIHNrLCBpbmRleCk7CisJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX1BPV0VSRUQ7CisJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX0NPTk5FQ1RBQkxFOworCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19GQVNUX0NPTk5FQ1RBQkxFOworCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19ESVNDT1ZFUkFCTEU7CisJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX1BBSVJBQkxFOwogCi0JaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKLQlpZiAoIWhkZXYpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRUFEX0lORk8sIEVOT0RFVik7CisJaWYgKGhkZXYtPmZlYXR1cmVzWzZdICYgTE1QX1NJTVBMRV9QQUlSKQorCQlzZXR0aW5ncyB8PSBNR01UX1NFVFRJTkdfU1NQOwogCi0JaGNpX2RlbF9vZmZfdGltZXIoaGRldik7CisJaWYgKCEoaGRldi0+ZmVhdHVyZXNbNF0gJiBMTVBfTk9fQlJFRFIpKSB7CisJCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19CUkVEUjsKKwkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX0xJTktfU0VDVVJJVFk7CisJfQogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWlmIChoZGV2LT5mZWF0dXJlc1s0XSAmIExNUF9MRSkKKwkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX0xFOwogCi0Jc2V0X2JpdChIQ0lfTUdNVCwgJmhkZXYtPmZsYWdzKTsKKwlyZXR1cm4gc2V0dGluZ3M7Cit9CiAKLQltZW1zZXQoJnJwLCAwLCBzaXplb2YocnApKTsKK3N0YXRpYyB1MzIgZ2V0X2N1cnJlbnRfc2V0dGluZ3Moc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJdTMyIHNldHRpbmdzID0gMDsKIAotCXJwLnR5cGUgPSBoZGV2LT5kZXZfdHlwZTsKKwlpZiAodGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpKQorCQlzZXR0aW5ncyB8PSBNR01UX1NFVFRJTkdfUE9XRVJFRDsKKwllbHNlCisJCXJldHVybiBzZXR0aW5nczsKIAotCXJwLnBvd2VyZWQgPSB0ZXN0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncyk7Ci0JcnAuY29ubmVjdGFibGUgPSB0ZXN0X2JpdChIQ0lfUFNDQU4sICZoZGV2LT5mbGFncyk7Ci0JcnAuZGlzY292ZXJhYmxlID0gdGVzdF9iaXQoSENJX0lTQ0FOLCAmaGRldi0+ZmxhZ3MpOwotCXJwLnBhaXJhYmxlID0gdGVzdF9iaXQoSENJX1BTQ0FOLCAmaGRldi0+ZmxhZ3MpOworCWlmICh0ZXN0X2JpdChIQ0lfUFNDQU4sICZoZGV2LT5mbGFncykpCisJCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19DT05ORUNUQUJMRTsKKworCWlmICh0ZXN0X2JpdChIQ0lfSVNDQU4sICZoZGV2LT5mbGFncykpCisJCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19ESVNDT1ZFUkFCTEU7CisKKwlpZiAodGVzdF9iaXQoSENJX1BBSVJBQkxFLCAmaGRldi0+ZmxhZ3MpKQorCQlzZXR0aW5ncyB8PSBNR01UX1NFVFRJTkdfUEFJUkFCTEU7CisKKwlpZiAoIShoZGV2LT5mZWF0dXJlc1s0XSAmIExNUF9OT19CUkVEUikpCisJCXNldHRpbmdzIHw9IE1HTVRfU0VUVElOR19CUkVEUjsKKworCWlmIChoZGV2LT5leHRmZWF0dXJlc1swXSAmIExNUF9IT1NUX0xFKQorCQlzZXR0aW5ncyB8PSBNR01UX1NFVFRJTkdfTEU7CiAKIAlpZiAodGVzdF9iaXQoSENJX0FVVEgsICZoZGV2LT5mbGFncykpCi0JCXJwLnNlY19tb2RlID0gMzsKLQllbHNlIGlmIChoZGV2LT5zc3BfbW9kZSA+IDApCi0JCXJwLnNlY19tb2RlID0gNDsKLQllbHNlCi0JCXJwLnNlY19tb2RlID0gMjsKKwkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX0xJTktfU0VDVVJJVFk7CiAKLQliYWNweSgmcnAuYmRhZGRyLCAmaGRldi0+YmRhZGRyKTsKLQltZW1jcHkocnAuZmVhdHVyZXMsIGhkZXYtPmZlYXR1cmVzLCA4KTsKLQltZW1jcHkocnAuZGV2X2NsYXNzLCBoZGV2LT5kZXZfY2xhc3MsIDMpOwotCXB1dF91bmFsaWduZWRfbGUxNihoZGV2LT5tYW51ZmFjdHVyZXIsICZycC5tYW51ZmFjdHVyZXIpOwotCXJwLmhjaV92ZXIgPSBoZGV2LT5oY2lfdmVyOwotCXB1dF91bmFsaWduZWRfbGUxNihoZGV2LT5oY2lfcmV2LCAmcnAuaGNpX3Jldik7CisJaWYgKGhkZXYtPnNzcF9tb2RlID4gMCkKKwkJc2V0dGluZ3MgfD0gTUdNVF9TRVRUSU5HX1NTUDsKIAotCW1lbWNweShycC5uYW1lLCBoZGV2LT5kZXZfbmFtZSwgc2l6ZW9mKGhkZXYtPmRldl9uYW1lKSk7Ci0KLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKLQloY2lfZGV2X3B1dChoZGV2KTsKLQotCXJldHVybiBjbWRfY29tcGxldGUoc2ssIGluZGV4LCBNR01UX09QX1JFQURfSU5GTywgJnJwLCBzaXplb2YocnApKTsKLX0KLQotc3RhdGljIHZvaWQgbWdtdF9wZW5kaW5nX2ZyZWUoc3RydWN0IHBlbmRpbmdfY21kICpjbWQpCi17Ci0Jc29ja19wdXQoY21kLT5zayk7Ci0Ja2ZyZWUoY21kLT5wYXJhbSk7Ci0Ja2ZyZWUoY21kKTsKLX0KLQotc3RhdGljIHN0cnVjdCBwZW5kaW5nX2NtZCAqbWdtdF9wZW5kaW5nX2FkZChzdHJ1Y3Qgc29jayAqc2ssIHUxNiBvcGNvZGUsCi0JCQkJCQl1MTYgaW5kZXgsIHZvaWQgKmRhdGEsIHUxNiBsZW4pCi17Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7Ci0KLQljbWQgPSBrbWFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFjbWQpCi0JCXJldHVybiBOVUxMOwotCi0JY21kLT5vcGNvZGUgPSBvcGNvZGU7Ci0JY21kLT5pbmRleCA9IGluZGV4OwotCi0JY21kLT5wYXJhbSA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWNtZC0+cGFyYW0pIHsKLQkJa2ZyZWUoY21kKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JaWYgKGRhdGEpCi0JCW1lbWNweShjbWQtPnBhcmFtLCBkYXRhLCBsZW4pOwotCi0JY21kLT5zayA9IHNrOwotCXNvY2tfaG9sZChzayk7Ci0KLQlsaXN0X2FkZCgmY21kLT5saXN0LCAmY21kX2xpc3QpOwotCi0JcmV0dXJuIGNtZDsKLX0KLQotc3RhdGljIHZvaWQgbWdtdF9wZW5kaW5nX2ZvcmVhY2godTE2IG9wY29kZSwgaW50IGluZGV4LAotCQkJCXZvaWQgKCpjYikoc3RydWN0IHBlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpLAotCQkJCXZvaWQgKmRhdGEpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47Ci0KLQlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJmNtZF9saXN0KSB7Ci0JCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwotCi0JCWNtZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHBlbmRpbmdfY21kLCBsaXN0KTsKLQotCQlpZiAoY21kLT5vcGNvZGUgIT0gb3Bjb2RlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGluZGV4ID49IDAgJiYgY21kLT5pbmRleCAhPSBpbmRleCkKLQkJCWNvbnRpbnVlOwotCi0JCWNiKGNtZCwgZGF0YSk7Ci0JfQotfQotCi1zdGF0aWMgc3RydWN0IHBlbmRpbmdfY21kICptZ210X3BlbmRpbmdfZmluZCh1MTYgb3Bjb2RlLCBpbnQgaW5kZXgpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKLQotCWxpc3RfZm9yX2VhY2gocCwgJmNtZF9saXN0KSB7Ci0JCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwotCi0JCWNtZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHBlbmRpbmdfY21kLCBsaXN0KTsKLQotCQlpZiAoY21kLT5vcGNvZGUgIT0gb3Bjb2RlKQotCQkJY29udGludWU7Ci0KLQkJaWYgKGluZGV4ID49IDAgJiYgY21kLT5pbmRleCAhPSBpbmRleCkKLQkJCWNvbnRpbnVlOwotCi0JCXJldHVybiBjbWQ7Ci0JfQotCi0JcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIG1nbXRfcGVuZGluZ19yZW1vdmUoc3RydWN0IHBlbmRpbmdfY21kICpjbWQpCi17Ci0JbGlzdF9kZWwoJmNtZC0+bGlzdCk7Ci0JbWdtdF9wZW5kaW5nX2ZyZWUoY21kKTsKLX0KLQotc3RhdGljIGludCBzZXRfcG93ZXJlZChzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdW5zaWduZWQgY2hhciAqZGF0YSwgdTE2IGxlbikKLXsKLQlzdHJ1Y3QgbWdtdF9tb2RlICpjcDsKLQlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKLQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKLQlpbnQgZXJyLCB1cDsKLQotCWNwID0gKHZvaWQgKikgZGF0YTsKLQotCUJUX0RCRygicmVxdWVzdCBmb3IgaGNpJXUiLCBpbmRleCk7Ci0KLQlpZiAobGVuICE9IHNpemVvZigqY3ApKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX1BPV0VSRUQsIEVJTlZBTCk7Ci0KLQloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwotCWlmICghaGRldikKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9QT1dFUkVELCBFTk9ERVYpOwotCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwotCi0JdXAgPSB0ZXN0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncyk7Ci0JaWYgKChjcC0+dmFsICYmIHVwKSB8fCAoIWNwLT52YWwgJiYgIXVwKSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfUE9XRVJFRCwgRUFMUkVBRFkpOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfUE9XRVJFRCwgaW5kZXgpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9QT1dFUkVELCBFQlVTWSk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX1BPV0VSRUQsIGluZGV4LCBkYXRhLCBsZW4pOwotCWlmICghY21kKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCWlmIChjcC0+dmFsKQotCQlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJmhkZXYtPnBvd2VyX29uKTsKLQllbHNlCi0JCXF1ZXVlX3dvcmsoaGRldi0+d29ya3F1ZXVlLCAmaGRldi0+cG93ZXJfb2ZmKTsKLQotCWVyciA9IDA7Ci0KLWZhaWxlZDoKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKLQloY2lfZGV2X3B1dChoZGV2KTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHNldF9kaXNjb3ZlcmFibGUoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCi0JCQkJCQkJCQl1MTYgbGVuKQotewotCXN0cnVjdCBtZ210X21vZGUgKmNwOwotCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwotCXU4IHNjYW47Ci0JaW50IGVycjsKLQotCWNwID0gKHZvaWQgKikgZGF0YTsKLQotCUJUX0RCRygicmVxdWVzdCBmb3IgaGNpJXUiLCBpbmRleCk7Ci0KLQlpZiAobGVuICE9IHNpemVvZigqY3ApKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwgRUlOVkFMKTsKLQotCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7Ci0JaWYgKCFoZGV2KQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwgRU5PREVWKTsKLQotCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKLQotCWlmICghdGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsIEVORVRET1dOKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JaWYgKG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwgaW5kZXgpIHx8Ci0JCQltZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaW5kZXgpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsIEVCVVNZKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JaWYgKGNwLT52YWwgPT0gdGVzdF9iaXQoSENJX0lTQ0FOLCAmaGRldi0+ZmxhZ3MpICYmCi0JCQkJCXRlc3RfYml0KEhDSV9QU0NBTiwgJmhkZXYtPmZsYWdzKSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBFQUxSRUFEWSk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwgaW5kZXgsIGRhdGEsIGxlbik7Ci0JaWYgKCFjbWQpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0Jc2NhbiA9IFNDQU5fUEFHRTsKLQotCWlmIChjcC0+dmFsKQotCQlzY2FuIHw9IFNDQU5fSU5RVUlSWTsKLQotCWVyciA9IGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfV1JJVEVfU0NBTl9FTkFCTEUsIDEsICZzY2FuKTsKLQlpZiAoZXJyIDwgMCkKLQkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwotCi1mYWlsZWQ6Ci0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7Ci0JaGNpX2Rldl9wdXQoaGRldik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IHNldF9jb25uZWN0YWJsZShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdW5zaWduZWQgY2hhciAqZGF0YSwKLQkJCQkJCQkJCXUxNiBsZW4pCi17Ci0Jc3RydWN0IG1nbXRfbW9kZSAqY3A7Ci0Jc3RydWN0IGhjaV9kZXYgKmhkZXY7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7Ci0JdTggc2NhbjsKLQlpbnQgZXJyOwotCi0JY3AgPSAodm9pZCAqKSBkYXRhOwotCi0JQlRfREJHKCJyZXF1ZXN0IGZvciBoY2kldSIsIGluZGV4KTsKLQotCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsIEVJTlZBTCk7Ci0KLQloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwotCWlmICghaGRldikKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgRU5PREVWKTsKLQotCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKLQotCWlmICghdGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgRU5FVERPV04pOwotCQlnb3RvIGZhaWxlZDsKLQl9Ci0KLQlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBpbmRleCkgfHwKLQkJCW1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBpbmRleCkpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBFQlVTWSk7Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCWlmIChjcC0+dmFsID09IHRlc3RfYml0KEhDSV9QU0NBTiwgJmhkZXYtPmZsYWdzKSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsIEVBTFJFQURZKTsKLQkJZ290byBmYWlsZWQ7Ci0JfQotCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsIGluZGV4LCBkYXRhLCBsZW4pOwotCWlmICghY21kKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbGVkOwotCX0KLQotCWlmIChjcC0+dmFsKQotCQlzY2FuID0gU0NBTl9QQUdFOwotCWVsc2UKLQkJc2NhbiA9IDA7Ci0KLQllcnIgPSBoY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1dSSVRFX1NDQU5fRU5BQkxFLCAxLCAmc2Nhbik7Ci0JaWYgKGVyciA8IDApCi0JCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKLQotZmFpbGVkOgotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOwotCWhjaV9kZXZfcHV0KGhkZXYpOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBtZ210X2V2ZW50KHUxNiBldmVudCwgdTE2IGluZGV4LCB2b2lkICpkYXRhLCB1MTYgZGF0YV9sZW4sCi0JCQkJCQkJc3RydWN0IHNvY2sgKnNraXBfc2spCi17Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlzdHJ1Y3QgbWdtdF9oZHIgKmhkcjsKLQotCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKmhkcikgKyBkYXRhX2xlbiwgR0ZQX0FUT01JQyk7Ci0JaWYgKCFza2IpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JYnRfY2Ioc2tiKS0+Y2hhbm5lbCA9IEhDSV9DSEFOTkVMX0NPTlRST0w7Ci0KLQloZHIgPSAodm9pZCAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKCpoZHIpKTsKLQloZHItPm9wY29kZSA9IGNwdV90b19sZTE2KGV2ZW50KTsKLQloZHItPmluZGV4ID0gY3B1X3RvX2xlMTYoaW5kZXgpOwotCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoZGF0YV9sZW4pOwotCi0JaWYgKGRhdGEpCi0JCW1lbWNweShza2JfcHV0KHNrYiwgZGF0YV9sZW4pLCBkYXRhLCBkYXRhX2xlbik7Ci0KLQloY2lfc2VuZF90b19zb2NrKE5VTEwsIHNrYiwgc2tpcF9zayk7Ci0Ja2ZyZWVfc2tiKHNrYik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBzZW5kX21vZGVfcnNwKHN0cnVjdCBzb2NrICpzaywgdTE2IG9wY29kZSwgdTE2IGluZGV4LCB1OCB2YWwpCi17Ci0Jc3RydWN0IG1nbXRfbW9kZSBycDsKLQotCXJwLnZhbCA9IHZhbDsKLQotCXJldHVybiBjbWRfY29tcGxldGUoc2ssIGluZGV4LCBvcGNvZGUsICZycCwgc2l6ZW9mKHJwKSk7Ci19Ci0KLXN0YXRpYyBpbnQgc2V0X3BhaXJhYmxlKHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1bnNpZ25lZCBjaGFyICpkYXRhLAotCQkJCQkJCQkJdTE2IGxlbikKLXsKLQlzdHJ1Y3QgbWdtdF9tb2RlICpjcCwgZXY7Ci0Jc3RydWN0IGhjaV9kZXYgKmhkZXY7Ci0JaW50IGVycjsKLQotCWNwID0gKHZvaWQgKikgZGF0YTsKLQotCUJUX0RCRygicmVxdWVzdCBmb3IgaGNpJXUiLCBpbmRleCk7Ci0KLQlpZiAobGVuICE9IHNpemVvZigqY3ApKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX1BBSVJBQkxFLCBFSU5WQUwpOwotCi0JaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKLQlpZiAoIWhkZXYpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfUEFJUkFCTEUsIEVOT0RFVik7Ci0KLQloY2lfZGV2X2xvY2tfYmgoaGRldik7Ci0KLQlpZiAoY3AtPnZhbCkKLQkJc2V0X2JpdChIQ0lfUEFJUkFCTEUsICZoZGV2LT5mbGFncyk7Ci0JZWxzZQotCQljbGVhcl9iaXQoSENJX1BBSVJBQkxFLCAmaGRldi0+ZmxhZ3MpOwotCi0JZXJyID0gc2VuZF9tb2RlX3JzcChzaywgTUdNVF9PUF9TRVRfUEFJUkFCTEUsIGluZGV4LCBjcC0+dmFsKTsKLQlpZiAoZXJyIDwgMCkKLQkJZ290byBmYWlsZWQ7Ci0KLQlldi52YWwgPSBjcC0+dmFsOwotCi0JZXJyID0gbWdtdF9ldmVudChNR01UX0VWX1BBSVJBQkxFLCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLCBzayk7Ci0KLWZhaWxlZDoKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKLQloY2lfZGV2X3B1dChoZGV2KTsKLQotCXJldHVybiBlcnI7CisJcmV0dXJuIHNldHRpbmdzOwogfQogCiAjZGVmaW5lIEVJUl9GTEFHUwkJMHgwMSAvKiBmbGFncyAqLwpAQCAtNTg3LDcgKzM0Nyw3IEBACiAJdTE2IGVpcl9sZW4gPSAwOwogCXUxNiB1dWlkMTZfbGlzdFtIQ0lfTUFYX0VJUl9MRU5HVEggLyBzaXplb2YodTE2KV07CiAJaW50IGksIHRydW5jYXRlZCA9IDA7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgYnRfdXVpZCAqdXVpZDsKIAlzaXplX3QgbmFtZV9sZW47CiAKIAluYW1lX2xlbiA9IHN0cmxlbihoZGV2LT5kZXZfbmFtZSk7CkBAIC02MTIsOCArMzcyLDcgQEAKIAltZW1zZXQodXVpZDE2X2xpc3QsIDAsIHNpemVvZih1dWlkMTZfbGlzdCkpOwogCiAJLyogR3JvdXAgYWxsIFVVSUQxNiB0eXBlcyAqLwotCWxpc3RfZm9yX2VhY2gocCwgJmhkZXYtPnV1aWRzKSB7Ci0JCXN0cnVjdCBidF91dWlkICp1dWlkID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgYnRfdXVpZCwgbGlzdCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1dWlkLCAmaGRldi0+dXVpZHMsIGxpc3QpIHsKIAkJdTE2IHV1aWQxNjsKIAogCQl1dWlkMTYgPSBnZXRfdXVpZDE2KHV1aWQtPnV1aWQpOwpAQCAtNjg5LDE0ICs0NDgsMTEgQEAKIAogc3RhdGljIHU4IGdldF9zZXJ2aWNlX2NsYXNzZXMoc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgYnRfdXVpZCAqdXVpZDsKIAl1OCB2YWwgPSAwOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmaGRldi0+dXVpZHMpIHsKLQkJc3RydWN0IGJ0X3V1aWQgKnV1aWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBidF91dWlkLCBsaXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkodXVpZCwgJmhkZXYtPnV1aWRzLCBsaXN0KQogCQl2YWwgfD0gdXVpZC0+c3ZjX2hpbnQ7Ci0JfQogCiAJcmV0dXJuIHZhbDsKIH0KQEAgLTcyMCw2ICs0NzYsNDEyIEBACiAJcmV0dXJuIGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfV1JJVEVfQ0xBU1NfT0ZfREVWLCBzaXplb2YoY29kKSwgY29kKTsKIH0KIAorc3RhdGljIHZvaWQgc2VydmljZV9jYWNoZV9vZmYoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBoY2lfZGV2LAorCQkJCQkJCXNlcnZpY2VfY2FjaGUud29yayk7CisKKwlpZiAoIXRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfU0VSVklDRV9DQUNIRSwgJmhkZXYtPmZsYWdzKSkKKwkJcmV0dXJuOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJdXBkYXRlX2VpcihoZGV2KTsKKwl1cGRhdGVfY2xhc3MoaGRldik7CisKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKK30KKworc3RhdGljIHZvaWQgbWdtdF9pbml0X2hkZXYoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhDSV9NR01ULCAmaGRldi0+ZmxhZ3MpKQorCQlJTklUX0RFTEFZRURfV09SSygmaGRldi0+c2VydmljZV9jYWNoZSwgc2VydmljZV9jYWNoZV9vZmYpOworCisJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KEhDSV9TRVJWSUNFX0NBQ0hFLCAmaGRldi0+ZmxhZ3MpKQorCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmhkZXYtPnNlcnZpY2VfY2FjaGUsCisJCQkJbXNlY3NfdG9famlmZmllcyhTRVJWSUNFX0NBQ0hFX1RJTUVPVVQpKTsKK30KKworc3RhdGljIGludCByZWFkX2NvbnRyb2xsZXJfaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCkKK3sKKwlzdHJ1Y3QgbWdtdF9ycF9yZWFkX2luZm8gcnA7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisKKwlCVF9EQkcoInNvY2sgJXAgaGNpJXUiLCBzaywgaW5kZXgpOworCisJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKKwlpZiAoIWhkZXYpCisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRUFEX0lORk8sCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisKKwlpZiAodGVzdF9hbmRfY2xlYXJfYml0KEhDSV9BVVRPX09GRiwgJmhkZXYtPmZsYWdzKSkKKwkJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZoZGV2LT5wb3dlcl9vZmYpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdChIQ0lfUElfTUdNVF9JTklULCAmaGNpX3BpKHNrKS0+ZmxhZ3MpKQorCQltZ210X2luaXRfaGRldihoZGV2KTsKKworCW1lbXNldCgmcnAsIDAsIHNpemVvZihycCkpOworCisJYmFjcHkoJnJwLmJkYWRkciwgJmhkZXYtPmJkYWRkcik7CisKKwlycC52ZXJzaW9uID0gaGRldi0+aGNpX3ZlcjsKKworCXB1dF91bmFsaWduZWRfbGUxNihoZGV2LT5tYW51ZmFjdHVyZXIsICZycC5tYW51ZmFjdHVyZXIpOworCisJcnAuc3VwcG9ydGVkX3NldHRpbmdzID0gY3B1X3RvX2xlMzIoZ2V0X3N1cHBvcnRlZF9zZXR0aW5ncyhoZGV2KSk7CisJcnAuY3VycmVudF9zZXR0aW5ncyA9IGNwdV90b19sZTMyKGdldF9jdXJyZW50X3NldHRpbmdzKGhkZXYpKTsKKworCW1lbWNweShycC5kZXZfY2xhc3MsIGhkZXYtPmRldl9jbGFzcywgMyk7CisKKwltZW1jcHkocnAubmFtZSwgaGRldi0+ZGV2X25hbWUsIHNpemVvZihoZGV2LT5kZXZfbmFtZSkpOworCisJaGNpX2Rldl91bmxvY2soaGRldik7CisJaGNpX2Rldl9wdXQoaGRldik7CisKKwlyZXR1cm4gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9SRUFEX0lORk8sICZycCwgc2l6ZW9mKHJwKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1nbXRfcGVuZGluZ19mcmVlKHN0cnVjdCBwZW5kaW5nX2NtZCAqY21kKQoreworCXNvY2tfcHV0KGNtZC0+c2spOworCWtmcmVlKGNtZC0+cGFyYW0pOworCWtmcmVlKGNtZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVuZGluZ19jbWQgKm1nbXRfcGVuZGluZ19hZGQoc3RydWN0IHNvY2sgKnNrLCB1MTYgb3Bjb2RlLAorCQkJCQkJCXN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCQkJCXZvaWQgKmRhdGEsIHUxNiBsZW4pCit7CisJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisKKwljbWQgPSBrbWFsbG9jKHNpemVvZigqY21kKSwgR0ZQX0FUT01JQyk7CisJaWYgKCFjbWQpCisJCXJldHVybiBOVUxMOworCisJY21kLT5vcGNvZGUgPSBvcGNvZGU7CisJY21kLT5pbmRleCA9IGhkZXYtPmlkOworCisJY21kLT5wYXJhbSA9IGttYWxsb2MobGVuLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWNtZC0+cGFyYW0pIHsKKwkJa2ZyZWUoY21kKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGRhdGEpCisJCW1lbWNweShjbWQtPnBhcmFtLCBkYXRhLCBsZW4pOworCisJY21kLT5zayA9IHNrOworCXNvY2tfaG9sZChzayk7CisKKwlsaXN0X2FkZCgmY21kLT5saXN0LCAmaGRldi0+bWdtdF9wZW5kaW5nKTsKKworCXJldHVybiBjbWQ7Cit9CisKK3N0YXRpYyB2b2lkIG1nbXRfcGVuZGluZ19mb3JlYWNoKHUxNiBvcGNvZGUsIHN0cnVjdCBoY2lfZGV2ICpoZGV2LAorCQkJCXZvaWQgKCpjYikoc3RydWN0IHBlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpLAorCQkJCXZvaWQgKmRhdGEpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqcCwgKm47CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUocCwgbiwgJmhkZXYtPm1nbXRfcGVuZGluZykgeworCQlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKworCQljbWQgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCBwZW5kaW5nX2NtZCwgbGlzdCk7CisKKwkJaWYgKG9wY29kZSA+IDAgJiYgY21kLT5vcGNvZGUgIT0gb3Bjb2RlKQorCQkJY29udGludWU7CisKKwkJY2IoY21kLCBkYXRhKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVuZGluZ19jbWQgKm1nbXRfcGVuZGluZ19maW5kKHUxNiBvcGNvZGUsIHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjbWQsICZoZGV2LT5tZ210X3BlbmRpbmcsIGxpc3QpIHsKKwkJaWYgKGNtZC0+b3Bjb2RlID09IG9wY29kZSkKKwkJCXJldHVybiBjbWQ7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG1nbXRfcGVuZGluZ19yZW1vdmUoc3RydWN0IHBlbmRpbmdfY21kICpjbWQpCit7CisJbGlzdF9kZWwoJmNtZC0+bGlzdCk7CisJbWdtdF9wZW5kaW5nX2ZyZWUoY21kKTsKK30KKworc3RhdGljIGludCBzZW5kX3NldHRpbmdzX3JzcChzdHJ1Y3Qgc29jayAqc2ssIHUxNiBvcGNvZGUsIHN0cnVjdCBoY2lfZGV2ICpoZGV2KQoreworCV9fbGUzMiBzZXR0aW5ncyA9IGNwdV90b19sZTMyKGdldF9jdXJyZW50X3NldHRpbmdzKGhkZXYpKTsKKworCXJldHVybiBjbWRfY29tcGxldGUoc2ssIGhkZXYtPmlkLCBvcGNvZGUsICZzZXR0aW5ncywgc2l6ZW9mKHNldHRpbmdzKSk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3Bvd2VyZWQoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHUxNiBsZW4pCit7CisJc3RydWN0IG1nbXRfbW9kZSAqY3A7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CisJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJaW50IGVyciwgdXA7CisKKwljcCA9ICh2b2lkICopIGRhdGE7CisKKwlCVF9EQkcoInJlcXVlc3QgZm9yIGhjaSV1IiwgaW5kZXgpOworCisJaWYgKGxlbiAhPSBzaXplb2YoKmNwKSkKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9QT1dFUkVELAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCisJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKKwlpZiAoIWhkZXYpCisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfUE9XRVJFRCwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCXVwID0gdGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpOworCWlmICgoY3AtPnZhbCAmJiB1cCkgfHwgKCFjcC0+dmFsICYmICF1cCkpIHsKKwkJZXJyID0gc2VuZF9zZXR0aW5nc19yc3Aoc2ssIE1HTVRfT1BfU0VUX1BPV0VSRUQsIGhkZXYpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfUE9XRVJFRCwgaGRldikpIHsKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX1BPV0VSRUQsCisJCQkJCQkJTUdNVF9TVEFUVVNfQlVTWSk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX1BPV0VSRUQsIGhkZXYsIGRhdGEsIGxlbik7CisJaWYgKCFjbWQpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKGNwLT52YWwpCisJCXNjaGVkdWxlX3dvcmsoJmhkZXYtPnBvd2VyX29uKTsKKwllbHNlCisJCXNjaGVkdWxlX3dvcmsoJmhkZXYtPnBvd2VyX29mZi53b3JrKTsKKworCWVyciA9IDA7CisKK2ZhaWxlZDoKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3B1dChoZGV2KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHNldF9kaXNjb3ZlcmFibGUoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkJCQkJCQl1MTYgbGVuKQoreworCXN0cnVjdCBtZ210X2NwX3NldF9kaXNjb3ZlcmFibGUgKmNwOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCXU4IHNjYW47CisJaW50IGVycjsKKworCWNwID0gKHZvaWQgKikgZGF0YTsKKworCUJUX0RCRygicmVxdWVzdCBmb3IgaGNpJXUiLCBpbmRleCk7CisKKwlpZiAobGVuICE9IHNpemVvZigqY3ApKQorCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKworCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CisJaWYgKCFoZGV2KQorCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCWlmICghdGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpKSB7CisJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsCisJCQkJCQlNR01UX1NUQVRVU19OT1RfUE9XRVJFRCk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsIGhkZXYpIHx8CisJCQltZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaGRldikpIHsKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0RJU0NPVkVSQUJMRSwKKwkJCQkJCQlNR01UX1NUQVRVU19CVVNZKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKGNwLT52YWwgPT0gdGVzdF9iaXQoSENJX0lTQ0FOLCAmaGRldi0+ZmxhZ3MpICYmCisJCQkJCXRlc3RfYml0KEhDSV9QU0NBTiwgJmhkZXYtPmZsYWdzKSkgeworCQllcnIgPSBzZW5kX3NldHRpbmdzX3JzcChzaywgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2KTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2LCBkYXRhLCBsZW4pOworCWlmICghY21kKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkOworCX0KKworCXNjYW4gPSBTQ0FOX1BBR0U7CisKKwlpZiAoY3AtPnZhbCkKKwkJc2NhbiB8PSBTQ0FOX0lOUVVJUlk7CisJZWxzZQorCQljYW5jZWxfZGVsYXllZF93b3JrKCZoZGV2LT5kaXNjb3Zfb2ZmKTsKKworCWVyciA9IGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfV1JJVEVfU0NBTl9FTkFCTEUsIDEsICZzY2FuKTsKKwlpZiAoZXJyIDwgMCkKKwkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOworCisJaWYgKGNwLT52YWwpCisJCWhkZXYtPmRpc2Nvdl90aW1lb3V0ID0gZ2V0X3VuYWxpZ25lZF9sZTE2KCZjcC0+dGltZW91dCk7CisKK2ZhaWxlZDoKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3B1dChoZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2Nvbm5lY3RhYmxlKHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1bnNpZ25lZCBjaGFyICpkYXRhLAorCQkJCQkJCQkJdTE2IGxlbikKK3sKKwlzdHJ1Y3QgbWdtdF9tb2RlICpjcDsKKwlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKKwlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwl1OCBzY2FuOworCWludCBlcnI7CisKKwljcCA9ICh2b2lkICopIGRhdGE7CisKKwlCVF9EQkcoInJlcXVlc3QgZm9yIGhjaSV1IiwgaW5kZXgpOworCisJaWYgKGxlbiAhPSBzaXplb2YoKmNwKSkKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9DT05ORUNUQUJMRSwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKworCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CisJaWYgKCFoZGV2KQorCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCisJaGNpX2Rldl9sb2NrKGhkZXYpOworCisJaWYgKCF0ZXN0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncykpIHsKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLAorCQkJCQkJTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQpOworCQlnb3RvIGZhaWxlZDsKKwl9CisKKwlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2KSB8fAorCQkJbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsIGhkZXYpKSB7CisJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9DT05ORUNUQUJMRSwKKwkJCQkJCQlNR01UX1NUQVRVU19CVVNZKTsKKwkJZ290byBmYWlsZWQ7CisJfQorCisJaWYgKGNwLT52YWwgPT0gdGVzdF9iaXQoSENJX1BTQ0FOLCAmaGRldi0+ZmxhZ3MpKSB7CisJCWVyciA9IHNlbmRfc2V0dGluZ3NfcnNwKHNrLCBNR01UX09QX1NFVF9DT05ORUNUQUJMRSwgaGRldik7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBoZGV2LCBkYXRhLCBsZW4pOworCWlmICghY21kKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZmFpbGVkOworCX0KKworCWlmIChjcC0+dmFsKQorCQlzY2FuID0gU0NBTl9QQUdFOworCWVsc2UKKwkJc2NhbiA9IDA7CisKKwllcnIgPSBoY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1dSSVRFX1NDQU5fRU5BQkxFLCAxLCAmc2Nhbik7CisJaWYgKGVyciA8IDApCisJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKKworZmFpbGVkOgorCWhjaV9kZXZfdW5sb2NrKGhkZXYpOworCWhjaV9kZXZfcHV0KGhkZXYpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtZ210X2V2ZW50KHUxNiBldmVudCwgc3RydWN0IGhjaV9kZXYgKmhkZXYsIHZvaWQgKmRhdGEsCisJCQkJCXUxNiBkYXRhX2xlbiwgc3RydWN0IHNvY2sgKnNraXBfc2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbWdtdF9oZHIgKmhkcjsKKworCXNrYiA9IGFsbG9jX3NrYihzaXplb2YoKmhkcikgKyBkYXRhX2xlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCFza2IpCisJCXJldHVybiAtRU5PTUVNOworCisJYnRfY2Ioc2tiKS0+Y2hhbm5lbCA9IEhDSV9DSEFOTkVMX0NPTlRST0w7CisKKwloZHIgPSAodm9pZCAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKCpoZHIpKTsKKwloZHItPm9wY29kZSA9IGNwdV90b19sZTE2KGV2ZW50KTsKKwlpZiAoaGRldikKKwkJaGRyLT5pbmRleCA9IGNwdV90b19sZTE2KGhkZXYtPmlkKTsKKwllbHNlCisJCWhkci0+aW5kZXggPSBjcHVfdG9fbGUxNihNR01UX0lOREVYX05PTkUpOworCWhkci0+bGVuID0gY3B1X3RvX2xlMTYoZGF0YV9sZW4pOworCisJaWYgKGRhdGEpCisJCW1lbWNweShza2JfcHV0KHNrYiwgZGF0YV9sZW4pLCBkYXRhLCBkYXRhX2xlbik7CisKKwloY2lfc2VuZF90b19zb2NrKE5VTEwsIHNrYiwgc2tpcF9zayk7CisJa2ZyZWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfcGFpcmFibGUoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkJCQkJCQl1MTYgbGVuKQoreworCXN0cnVjdCBtZ210X21vZGUgKmNwOworCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCV9fbGUzMiBldjsKKwlpbnQgZXJyOworCisJY3AgPSAodm9pZCAqKSBkYXRhOworCisJQlRfREJHKCJyZXF1ZXN0IGZvciBoY2kldSIsIGluZGV4KTsKKworCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfUEFJUkFCTEUsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisKKwloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOworCWlmICghaGRldikKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9QQUlSQUJMRSwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKKworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCWlmIChjcC0+dmFsKQorCQlzZXRfYml0KEhDSV9QQUlSQUJMRSwgJmhkZXYtPmZsYWdzKTsKKwllbHNlCisJCWNsZWFyX2JpdChIQ0lfUEFJUkFCTEUsICZoZGV2LT5mbGFncyk7CisKKwllcnIgPSBzZW5kX3NldHRpbmdzX3JzcChzaywgTUdNVF9PUF9TRVRfUEFJUkFCTEUsIGhkZXYpOworCWlmIChlcnIgPCAwKQorCQlnb3RvIGZhaWxlZDsKKworCWV2ID0gY3B1X3RvX2xlMzIoZ2V0X2N1cnJlbnRfc2V0dGluZ3MoaGRldikpOworCisJZXJyID0gbWdtdF9ldmVudChNR01UX0VWX05FV19TRVRUSU5HUywgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBzayk7CisKK2ZhaWxlZDoKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKKwloY2lfZGV2X3B1dChoZGV2KTsKKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBpbnQgYWRkX3V1aWQoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmRhdGEsIHUxNiBsZW4pCiB7CiAJc3RydWN0IG1nbXRfY3BfYWRkX3V1aWQgKmNwOwpAQCAtNzMyLDEzICs4OTQsMTUgQEAKIAlCVF9EQkcoInJlcXVlc3QgZm9yIGhjaSV1IiwgaW5kZXgpOwogCiAJaWYgKGxlbiAhPSBzaXplb2YoKmNwKSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0FERF9VVUlELCBFSU5WQUwpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfQUREX1VVSUQsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwogCWlmICghaGRldikKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0FERF9VVUlELCBFTk9ERVYpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfQUREX1VVSUQsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJdXVpZCA9IGttYWxsb2Moc2l6ZW9mKCp1dWlkKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF1dWlkKSB7CkBAIC03NjIsNyArOTI2LDcgQEAKIAllcnIgPSBjbWRfY29tcGxldGUoc2ssIGluZGV4LCBNR01UX09QX0FERF9VVUlELCBOVUxMLCAwKTsKIAogZmFpbGVkOgotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTc4MSwxMyArOTQ1LDE1IEBACiAJQlRfREJHKCJyZXF1ZXN0IGZvciBoY2kldSIsIGluZGV4KTsKIAogCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfVVVJRCwgRUlOVkFMKTsKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1JFTU9WRV9VVUlELAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKIAlpZiAoIWhkZXYpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfVVVJRCwgRU5PREVWKTsKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1JFTU9WRV9VVUlELAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWlmIChtZW1jbXAoY3AtPnV1aWQsIGJ0X3V1aWRfYW55LCAxNikgPT0gMCkgewogCQllcnIgPSBoY2lfdXVpZHNfY2xlYXIoaGRldik7CkBAIC04MDcsNyArOTczLDggQEAKIAl9CiAKIAlpZiAoZm91bmQgPT0gMCkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfVVVJRCwgRU5PRU5UKTsKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX1VVSUQsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIApAQCAtODIyLDcgKzk4OSw3IEBACiAJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfVVVJRCwgTlVMTCwgMCk7CiAKIHVubG9jazoKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC04NDAsOTcgKzEwMDcsNzEgQEAKIAlCVF9EQkcoInJlcXVlc3QgZm9yIGhjaSV1IiwgaW5kZXgpOwogCiAJaWYgKGxlbiAhPSBzaXplb2YoKmNwKSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9ERVZfQ0xBU1MsIEVJTlZBTCk7CisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfREVWX0NMQVNTLAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKIAlpZiAoIWhkZXYpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfREVWX0NMQVNTLCBFTk9ERVYpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0RFVl9DTEFTUywKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAotCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwloY2lfZGV2X2xvY2soaGRldik7CiAKIAloZGV2LT5tYWpvcl9jbGFzcyA9IGNwLT5tYWpvcjsKIAloZGV2LT5taW5vcl9jbGFzcyA9IGNwLT5taW5vcjsKIAorCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoSENJX1NFUlZJQ0VfQ0FDSEUsICZoZGV2LT5mbGFncykpIHsKKwkJaGNpX2Rldl91bmxvY2soaGRldik7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmaGRldi0+c2VydmljZV9jYWNoZSk7CisJCWhjaV9kZXZfbG9jayhoZGV2KTsKKwkJdXBkYXRlX2VpcihoZGV2KTsKKwl9CisKIAllcnIgPSB1cGRhdGVfY2xhc3MoaGRldik7CiAKIAlpZiAoZXJyID09IDApCiAJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0RFVl9DTEFTUywgTlVMTCwgMCk7CiAKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgc2V0X3NlcnZpY2VfY2FjaGUoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsICB1bnNpZ25lZCBjaGFyICpkYXRhLAotCQkJCQkJCQkJdTE2IGxlbikKK3N0YXRpYyBpbnQgbG9hZF9saW5rX2tleXMoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCisJCQkJCQkJCXUxNiBsZW4pCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7Ci0Jc3RydWN0IG1nbXRfY3Bfc2V0X3NlcnZpY2VfY2FjaGUgKmNwOwotCWludCBlcnI7Ci0KLQljcCA9ICh2b2lkICopIGRhdGE7Ci0KLQlpZiAobGVuICE9IHNpemVvZigqY3ApKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX1NFUlZJQ0VfQ0FDSEUsIEVJTlZBTCk7Ci0KLQloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwotCWlmICghaGRldikKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9TRVJWSUNFX0NBQ0hFLCBFTk9ERVYpOwotCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwotCi0JQlRfREJHKCJoY2kldSBlbmFibGUgJWQiLCBpbmRleCwgY3AtPmVuYWJsZSk7Ci0KLQlpZiAoY3AtPmVuYWJsZSkgewotCQlzZXRfYml0KEhDSV9TRVJWSUNFX0NBQ0hFLCAmaGRldi0+ZmxhZ3MpOwotCQllcnIgPSAwOwotCX0gZWxzZSB7Ci0JCWNsZWFyX2JpdChIQ0lfU0VSVklDRV9DQUNIRSwgJmhkZXYtPmZsYWdzKTsKLQkJZXJyID0gdXBkYXRlX2NsYXNzKGhkZXYpOwotCQlpZiAoZXJyID09IDApCi0JCQllcnIgPSB1cGRhdGVfZWlyKGhkZXYpOwotCX0KLQotCWlmIChlcnIgPT0gMCkKLQkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfU0VSVklDRV9DQUNIRSwgTlVMTCwKLQkJCQkJCQkJCTApOwotCi0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7Ci0JaGNpX2Rldl9wdXQoaGRldik7Ci0KLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGxvYWRfa2V5cyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdW5zaWduZWQgY2hhciAqZGF0YSwgdTE2IGxlbikKLXsKLQlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKLQlzdHJ1Y3QgbWdtdF9jcF9sb2FkX2tleXMgKmNwOworCXN0cnVjdCBtZ210X2NwX2xvYWRfbGlua19rZXlzICpjcDsKIAl1MTYga2V5X2NvdW50LCBleHBlY3RlZF9sZW47CiAJaW50IGk7CiAKIAljcCA9ICh2b2lkICopIGRhdGE7CiAKIAlpZiAobGVuIDwgc2l6ZW9mKCpjcCkpCi0JCXJldHVybiAtRUlOVkFMOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVMsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAlrZXlfY291bnQgPSBnZXRfdW5hbGlnbmVkX2xlMTYoJmNwLT5rZXlfY291bnQpOwogCi0JZXhwZWN0ZWRfbGVuID0gc2l6ZW9mKCpjcCkgKyBrZXlfY291bnQgKiBzaXplb2Yoc3RydWN0IG1nbXRfa2V5X2luZm8pOworCWV4cGVjdGVkX2xlbiA9IHNpemVvZigqY3ApICsga2V5X2NvdW50ICoKKwkJCQkJc2l6ZW9mKHN0cnVjdCBtZ210X2xpbmtfa2V5X2luZm8pOwogCWlmIChleHBlY3RlZF9sZW4gIT0gbGVuKSB7Ci0JCUJUX0VSUigibG9hZF9rZXlzOiBleHBlY3RlZCAldSBieXRlcywgZ290ICV1IGJ5dGVzIiwKKwkJQlRfRVJSKCJsb2FkX2xpbmtfa2V5czogZXhwZWN0ZWQgJXUgYnl0ZXMsIGdvdCAldSBieXRlcyIsCiAJCQkJCQkJbGVuLCBleHBlY3RlZF9sZW4pOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0xPQURfTElOS19LRVlTLAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCX0KIAogCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CiAJaWYgKCFoZGV2KQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfTE9BRF9LRVlTLCBFTk9ERVYpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVMsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAlCVF9EQkcoImhjaSV1IGRlYnVnX2tleXMgJXUga2V5X2NvdW50ICV1IiwgaW5kZXgsIGNwLT5kZWJ1Z19rZXlzLAogCQkJCQkJCQlrZXlfY291bnQpOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWhjaV9saW5rX2tleXNfY2xlYXIoaGRldik7CiAKQEAgLTk0Miw1OCArMTA4Myw4NCBAQAogCQljbGVhcl9iaXQoSENJX0RFQlVHX0tFWVMsICZoZGV2LT5mbGFncyk7CiAKIAlmb3IgKGkgPSAwOyBpIDwga2V5X2NvdW50OyBpKyspIHsKLQkJc3RydWN0IG1nbXRfa2V5X2luZm8gKmtleSA9ICZjcC0+a2V5c1tpXTsKKwkJc3RydWN0IG1nbXRfbGlua19rZXlfaW5mbyAqa2V5ID0gJmNwLT5rZXlzW2ldOwogCiAJCWhjaV9hZGRfbGlua19rZXkoaGRldiwgTlVMTCwgMCwgJmtleS0+YmRhZGRyLCBrZXktPnZhbCwga2V5LT50eXBlLAogCQkJCQkJCQlrZXktPnBpbl9sZW4pOwogCX0KIAotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVMsIE5VTEwsIDApOworCisJaGNpX2Rldl91bmxvY2soaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZW1vdmVfa2V5KHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1MTYgbGVuKQorc3RhdGljIGludCByZW1vdmVfa2V5cyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdW5zaWduZWQgY2hhciAqZGF0YSwKKwkJCQkJCQkJdTE2IGxlbikKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKLQlzdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfa2V5ICpjcDsKKwlzdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfa2V5cyAqY3A7CisJc3RydWN0IG1nbXRfcnBfcmVtb3ZlX2tleXMgcnA7CisJc3RydWN0IGhjaV9jcF9kaXNjb25uZWN0IGRjOworCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKIAlpbnQgZXJyOwogCiAJY3AgPSAodm9pZCAqKSBkYXRhOwogCiAJaWYgKGxlbiAhPSBzaXplb2YoKmNwKSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1JFTU9WRV9LRVksIEVJTlZBTCk7CisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfS0VZUywKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CiAJaWYgKCFoZGV2KQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX0tFWSwgRU5PREVWKTsKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1JFTU9WRV9LRVlTLAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKKworCW1lbXNldCgmcnAsIDAsIHNpemVvZihycCkpOworCWJhY3B5KCZycC5iZGFkZHIsICZjcC0+YmRhZGRyKTsKKwlycC5zdGF0dXMgPSBNR01UX1NUQVRVU19GQUlMRUQ7CiAKIAllcnIgPSBoY2lfcmVtb3ZlX2xpbmtfa2V5KGhkZXYsICZjcC0+YmRhZGRyKTsKIAlpZiAoZXJyIDwgMCkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfS0VZLCAtZXJyKTsKKwkJcnAuc3RhdHVzID0gTUdNVF9TVEFUVVNfTk9UX1BBSVJFRDsKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JZXJyID0gMDsKLQotCWlmICghdGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpIHx8ICFjcC0+ZGlzY29ubmVjdCkKKwlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSB8fCAhY3AtPmRpc2Nvbm5lY3QpIHsKKwkJZXJyID0gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfS0VZUywgJnJwLAorCQkJCQkJCQlzaXplb2YocnApKTsKIAkJZ290byB1bmxvY2s7CisJfQogCiAJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCAmY3AtPmJkYWRkcik7Ci0JaWYgKGNvbm4pIHsKLQkJc3RydWN0IGhjaV9jcF9kaXNjb25uZWN0IGRjOwotCi0JCXB1dF91bmFsaWduZWRfbGUxNihjb25uLT5oYW5kbGUsICZkYy5oYW5kbGUpOwotCQlkYy5yZWFzb24gPSAweDEzOyAvKiBSZW1vdGUgVXNlciBUZXJtaW5hdGVkIENvbm5lY3Rpb24gKi8KLQkJZXJyID0gaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9ESVNDT05ORUNULCBzaXplb2YoZGMpLCAmZGMpOworCWlmICghY29ubikgeworCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGluZGV4LCBNR01UX09QX1JFTU9WRV9LRVlTLCAmcnAsCisJCQkJCQkJCXNpemVvZihycCkpOworCQlnb3RvIHVubG9jazsKIAl9CiAKKwljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBNR01UX09QX1JFTU9WRV9LRVlTLCBoZGV2LCBjcCwgc2l6ZW9mKCpjcCkpOworCWlmICghY21kKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gdW5sb2NrOworCX0KKworCXB1dF91bmFsaWduZWRfbGUxNihjb25uLT5oYW5kbGUsICZkYy5oYW5kbGUpOworCWRjLnJlYXNvbiA9IDB4MTM7IC8qIFJlbW90ZSBVc2VyIFRlcm1pbmF0ZWQgQ29ubmVjdGlvbiAqLworCWVyciA9IGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfRElTQ09OTkVDVCwgc2l6ZW9mKGRjKSwgJmRjKTsKKwlpZiAoZXJyIDwgMCkKKwkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOworCiB1bmxvY2s6Ci0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaWYgKGVyciA8IDApCisJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX0tFWVMsICZycCwKKwkJCQkJCQkJc2l6ZW9mKHJwKSk7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTAxMywyMSArMTE4MCwyNSBAQAogCWNwID0gKHZvaWQgKikgZGF0YTsKIAogCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9ESVNDT05ORUNULCBFSU5WQUwpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfRElTQ09OTkVDVCwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CiAJaWYgKCFoZGV2KQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfRElTQ09OTkVDVCwgRU5PREVWKTsKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0RJU0NPTk5FQ1QsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKCF0ZXN0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncykpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfRElTQ09OTkVDVCwgRU5FVERPV04pOworCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9ESVNDT05ORUNULAorCQkJCQkJTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQlpZiAobWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9ESVNDT05ORUNULCBpbmRleCkpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfRElTQ09OTkVDVCwgRUJVU1kpOworCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX0RJU0NPTk5FQ1QsIGhkZXYpKSB7CisJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0RJU0NPTk5FQ1QsCisJCQkJCQkJTUdNVF9TVEFUVVNfQlVTWSk7CiAJCWdvdG8gZmFpbGVkOwogCX0KIApAQCAtMTAzNiwxMSArMTIwNywxMiBAQAogCQljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgTEVfTElOSywgJmNwLT5iZGFkZHIpOwogCiAJaWYgKCFjb25uKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0RJU0NPTk5FQ1QsIEVOT1RDT05OKTsKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfRElTQ09OTkVDVCwKKwkJCQkJCU1HTVRfU1RBVFVTX05PVF9DT05ORUNURUQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBNR01UX09QX0RJU0NPTk5FQ1QsIGluZGV4LCBkYXRhLCBsZW4pOworCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfRElTQ09OTkVDVCwgaGRldiwgZGF0YSwgbGVuKTsKIAlpZiAoIWNtZCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZDsKQEAgLTEwNTQsMTYgKzEyMjYsMzYgQEAKIAkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwogCiBmYWlsZWQ6Ci0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgdTggbGlua190b19tZ210KHU4IGxpbmtfdHlwZSwgdTggYWRkcl90eXBlKQoreworCXN3aXRjaCAobGlua190eXBlKSB7CisJY2FzZSBMRV9MSU5LOgorCQlzd2l0Y2ggKGFkZHJfdHlwZSkgeworCQljYXNlIEFERFJfTEVfREVWX1BVQkxJQzoKKwkJCXJldHVybiBNR01UX0FERFJfTEVfUFVCTElDOworCQljYXNlIEFERFJfTEVfREVWX1JBTkRPTToKKwkJCXJldHVybiBNR01UX0FERFJfTEVfUkFORE9NOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIE1HTVRfQUREUl9JTlZBTElEOworCQl9CisJY2FzZSBBQ0xfTElOSzoKKwkJcmV0dXJuIE1HTVRfQUREUl9CUkVEUjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTUdNVF9BRERSX0lOVkFMSUQ7CisJfQorfQorCiBzdGF0aWMgaW50IGdldF9jb25uZWN0aW9ucyhzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCkKIHsKIAlzdHJ1Y3QgbWdtdF9ycF9nZXRfY29ubmVjdGlvbnMgKnJwOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCXN0cnVjdCBoY2lfY29ubiAqYzsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpwOwogCXNpemVfdCBycF9sZW47CiAJdTE2IGNvdW50OwpAQCAtMTA3MywxNiArMTI2NSwxNyBAQAogCiAJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKIAlpZiAoIWhkZXYpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9HRVRfQ09OTkVDVElPTlMsIEVOT0RFVik7CisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9HRVRfQ09OTkVDVElPTlMsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJY291bnQgPSAwOwogCWxpc3RfZm9yX2VhY2gocCwgJmhkZXYtPmNvbm5faGFzaC5saXN0KSB7CiAJCWNvdW50Kys7CiAJfQogCi0JcnBfbGVuID0gc2l6ZW9mKCpycCkgKyAoY291bnQgKiBzaXplb2YoYmRhZGRyX3QpKTsKKwlycF9sZW4gPSBzaXplb2YoKnJwKSArIChjb3VudCAqIHNpemVvZihzdHJ1Y3QgbWdtdF9hZGRyX2luZm8pKTsKIAlycCA9IGttYWxsb2MocnBfbGVuLCBHRlBfQVRPTUlDKTsKIAlpZiAoIXJwKSB7CiAJCWVyciA9IC1FTk9NRU07CkBAIC0xMDkyLDE3ICsxMjg1LDIyIEBACiAJcHV0X3VuYWxpZ25lZF9sZTE2KGNvdW50LCAmcnAtPmNvbm5fY291bnQpOwogCiAJaSA9IDA7Ci0JbGlzdF9mb3JfZWFjaChwLCAmaGRldi0+Y29ubl9oYXNoLmxpc3QpIHsKLQkJc3RydWN0IGhjaV9jb25uICpjID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgaGNpX2Nvbm4sIGxpc3QpOwotCi0JCWJhY3B5KCZycC0+Y29ubltpKytdLCAmYy0+ZHN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGMsICZoZGV2LT5jb25uX2hhc2gubGlzdCwgbGlzdCkgeworCQliYWNweSgmcnAtPmFkZHJbaV0uYmRhZGRyLCAmYy0+ZHN0KTsKKwkJcnAtPmFkZHJbaV0udHlwZSA9IGxpbmtfdG9fbWdtdChjLT50eXBlLCBjLT5kc3RfdHlwZSk7CisJCWlmIChycC0+YWRkcltpXS50eXBlID09IE1HTVRfQUREUl9JTlZBTElEKQorCQkJY29udGludWU7CisJCWkrKzsKIAl9CiAKKwkvKiBSZWNhbGN1bGF0ZSBsZW5ndGggaW4gY2FzZSBvZiBmaWx0ZXJlZCBTQ08gY29ubmVjdGlvbnMsIGV0YyAqLworCXJwX2xlbiA9IHNpemVvZigqcnApICsgKGkgKiBzaXplb2Yoc3RydWN0IG1nbXRfYWRkcl9pbmZvKSk7CisKIAllcnIgPSBjbWRfY29tcGxldGUoc2ssIGluZGV4LCBNR01UX09QX0dFVF9DT05ORUNUSU9OUywgcnAsIHJwX2xlbik7CiAKIHVubG9jazoKIAlrZnJlZShycCk7Ci0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTExMTMsNyArMTMxMSw3IEBACiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJaW50IGVycjsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfUElOX0NPREVfTkVHX1JFUExZLCBpbmRleCwgY3AsCisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9QSU5fQ09ERV9ORUdfUkVQTFksIGhkZXYsIGNwLAogCQkJCQkJCQlzaXplb2YoKmNwKSk7CiAJaWYgKCFjbWQpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMTE0MiwyMiArMTM0MCwyNiBAQAogCWNwID0gKHZvaWQgKikgZGF0YTsKIAogCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9QSU5fQ09ERV9SRVBMWSwgRUlOVkFMKTsKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1BJTl9DT0RFX1JFUExZLAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKIAlpZiAoIWhkZXYpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9QSU5fQ09ERV9SRVBMWSwgRU5PREVWKTsKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1BJTl9DT0RFX1JFUExZLAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWlmICghdGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1BJTl9DT0RFX1JFUExZLCBFTkVURE9XTik7CisJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1BJTl9DT0RFX1JFUExZLAorCQkJCQkJTUdNVF9TVEFUVVNfTk9UX1BPV0VSRUQpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKIAljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgQUNMX0xJTkssICZjcC0+YmRhZGRyKTsKIAlpZiAoIWNvbm4pIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUElOX0NPREVfUkVQTFksIEVOT1RDT05OKTsKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUElOX0NPREVfUkVQTFksCisJCQkJCQlNR01UX1NUQVRVU19OT1RfQ09OTkVDVEVEKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCkBAIC0xMTY5LDEyICsxMzcxLDEyIEBACiAJCWVyciA9IHNlbmRfcGluX2NvZGVfbmVnX3JlcGx5KHNrLCBpbmRleCwgaGRldiwgJm5jcCk7CiAJCWlmIChlcnIgPj0gMCkKIAkJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1BJTl9DT0RFX1JFUExZLAotCQkJCQkJCQlFSU5WQUwpOworCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJCWdvdG8gZmFpbGVkOwogCX0KIAotCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfUElOX0NPREVfUkVQTFksIGluZGV4LCBkYXRhLCBsZW4pOworCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfUElOX0NPREVfUkVQTFksIGhkZXYsIGRhdGEsIGxlbik7CiAJaWYgKCFjbWQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWQ7CkBAIC0xMTg5LDcgKzEzOTEsNyBAQAogCQltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKIGZhaWxlZDoKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC0xMjA4LDI1ICsxNDEwLDI1IEBACiAKIAlpZiAobGVuICE9IHNpemVvZigqY3ApKQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUElOX0NPREVfTkVHX1JFUExZLAotCQkJCQkJCQkJRUlOVkFMKTsKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUElOX0NPREVfTkVHX1JFUExZLAotCQkJCQkJCQkJRU5PREVWKTsKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAotCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwloY2lfZGV2X2xvY2soaGRldik7CiAKIAlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkgewogCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9QSU5fQ09ERV9ORUdfUkVQTFksCi0JCQkJCQkJCUVORVRET1dOKTsKKwkJCQkJCU1HTVRfU1RBVFVTX05PVF9QT1dFUkVEKTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCiAJZXJyID0gc2VuZF9waW5fY29kZV9uZWdfcmVwbHkoc2ssIGluZGV4LCBoZGV2LCBjcCk7CiAKIGZhaWxlZDoKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC0xMjQzLDIwICsxNDQ1LDIyIEBACiAJY3AgPSAodm9pZCAqKSBkYXRhOwogCiAJaWYgKGxlbiAhPSBzaXplb2YoKmNwKSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9JT19DQVBBQklMSVRZLCBFSU5WQUwpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0lPX0NBUEFCSUxJVFksCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwogCWlmICghaGRldikKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9JT19DQVBBQklMSVRZLCBFTk9ERVYpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0lPX0NBUEFCSUxJVFksCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaGRldi0+aW9fY2FwYWJpbGl0eSA9IGNwLT5pb19jYXBhYmlsaXR5OwogCiAJQlRfREJHKCIlcyBJTyBjYXBhYmlsaXR5IHNldCB0byAweCUwMngiLCBoZGV2LT5uYW1lLAogCQkJCQkJCWhkZXYtPmlvX2NhcGFiaWxpdHkpOwogCi0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gY21kX2NvbXBsZXRlKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfSU9fQ0FQQUJJTElUWSwgTlVMTCwgMCk7CkBAIC0xMjY1LDE5ICsxNDY5LDEyIEBACiBzdGF0aWMgaW5saW5lIHN0cnVjdCBwZW5kaW5nX2NtZCAqZmluZF9wYWlyaW5nKHN0cnVjdCBoY2lfY29ubiAqY29ubikKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldiA9IGNvbm4tPmhkZXY7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKIAotCWxpc3RfZm9yX2VhY2gocCwgJmNtZF9saXN0KSB7Ci0JCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwotCi0JCWNtZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHBlbmRpbmdfY21kLCBsaXN0KTsKLQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY21kLCAmaGRldi0+bWdtdF9wZW5kaW5nLCBsaXN0KSB7CiAJCWlmIChjbWQtPm9wY29kZSAhPSBNR01UX09QX1BBSVJfREVWSUNFKQogCQkJY29udGludWU7CiAKLQkJaWYgKGNtZC0+aW5kZXggIT0gaGRldi0+aWQpCi0JCQljb250aW51ZTsKLQogCQlpZiAoY21kLT51c2VyX2RhdGEgIT0gY29ubikKIAkJCWNvbnRpbnVlOwogCkBAIC0xMjkyLDcgKzE0ODksOCBAQAogCXN0cnVjdCBtZ210X3JwX3BhaXJfZGV2aWNlIHJwOwogCXN0cnVjdCBoY2lfY29ubiAqY29ubiA9IGNtZC0+dXNlcl9kYXRhOwogCi0JYmFjcHkoJnJwLmJkYWRkciwgJmNvbm4tPmRzdCk7CisJYmFjcHkoJnJwLmFkZHIuYmRhZGRyLCAmY29ubi0+ZHN0KTsKKwlycC5hZGRyLnR5cGUgPSBsaW5rX3RvX21nbXQoY29ubi0+dHlwZSwgY29ubi0+ZHN0X3R5cGUpOwogCXJwLnN0YXR1cyA9IHN0YXR1czsKIAogCWNtZF9jb21wbGV0ZShjbWQtPnNrLCBjbWQtPmluZGV4LCBNR01UX09QX1BBSVJfREVWSUNFLCAmcnAsIHNpemVvZihycCkpOwpAQCAtMTMxNCwyMCArMTUxMiwxOCBAQAogCUJUX0RCRygic3RhdHVzICV1Iiwgc3RhdHVzKTsKIAogCWNtZCA9IGZpbmRfcGFpcmluZyhjb25uKTsKLQlpZiAoIWNtZCkgeworCWlmICghY21kKQogCQlCVF9EQkcoIlVuYWJsZSB0byBmaW5kIGEgcGVuZGluZyBjb21tYW5kIik7Ci0JCXJldHVybjsKLQl9Ci0KLQlwYWlyaW5nX2NvbXBsZXRlKGNtZCwgc3RhdHVzKTsKKwllbHNlCisJCXBhaXJpbmdfY29tcGxldGUoY21kLCBzdGF0dXMpOwogfQogCiBzdGF0aWMgaW50IHBhaXJfZGV2aWNlKHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1MTYgbGVuKQogewogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwogCXN0cnVjdCBtZ210X2NwX3BhaXJfZGV2aWNlICpjcDsKKwlzdHJ1Y3QgbWdtdF9ycF9wYWlyX2RldmljZSBycDsKIAlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKLQlzdHJ1Y3QgYWR2X2VudHJ5ICplbnRyeTsKIAl1OCBzZWNfbGV2ZWwsIGF1dGhfdHlwZTsKIAlzdHJ1Y3QgaGNpX2Nvbm4gKmNvbm47CiAJaW50IGVycjsKQEAgLTEzMzcsMTMgKzE1MzMsMTUgQEAKIAljcCA9ICh2b2lkICopIGRhdGE7CiAKIAlpZiAobGVuICE9IHNpemVvZigqY3ApKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUEFJUl9ERVZJQ0UsIEVJTlZBTCk7CisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9QQUlSX0RFVklDRSwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CiAJaWYgKCFoZGV2KQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUEFJUl9ERVZJQ0UsIEVOT0RFVik7CisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9QQUlSX0RFVklDRSwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAotCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwloY2lfZGV2X2xvY2soaGRldik7CiAKIAlzZWNfbGV2ZWwgPSBCVF9TRUNVUklUWV9NRURJVU07CiAJaWYgKGNwLT5pb19jYXAgPT0gMHgwMykKQEAgLTEzNTEsMjYgKzE1NDksMzMgQEAKIAllbHNlCiAJCWF1dGhfdHlwZSA9IEhDSV9BVF9ERURJQ0FURURfQk9ORElOR19NSVRNOwogCi0JZW50cnkgPSBoY2lfZmluZF9hZHZfZW50cnkoaGRldiwgJmNwLT5iZGFkZHIpOwotCWlmIChlbnRyeSkKLQkJY29ubiA9IGhjaV9jb25uZWN0KGhkZXYsIExFX0xJTkssICZjcC0+YmRhZGRyLCBzZWNfbGV2ZWwsCisJaWYgKGNwLT5hZGRyLnR5cGUgPT0gTUdNVF9BRERSX0JSRURSKQorCQljb25uID0gaGNpX2Nvbm5lY3QoaGRldiwgQUNMX0xJTkssICZjcC0+YWRkci5iZGFkZHIsIHNlY19sZXZlbCwKIAkJCQkJCQkJYXV0aF90eXBlKTsKIAllbHNlCi0JCWNvbm4gPSBoY2lfY29ubmVjdChoZGV2LCBBQ0xfTElOSywgJmNwLT5iZGFkZHIsIHNlY19sZXZlbCwKKwkJY29ubiA9IGhjaV9jb25uZWN0KGhkZXYsIExFX0xJTkssICZjcC0+YWRkci5iZGFkZHIsIHNlY19sZXZlbCwKIAkJCQkJCQkJYXV0aF90eXBlKTsKIAorCW1lbXNldCgmcnAsIDAsIHNpemVvZihycCkpOworCWJhY3B5KCZycC5hZGRyLmJkYWRkciwgJmNwLT5hZGRyLmJkYWRkcik7CisJcnAuYWRkci50eXBlID0gY3AtPmFkZHIudHlwZTsKKwogCWlmIChJU19FUlIoY29ubikpIHsKLQkJZXJyID0gUFRSX0VSUihjb25uKTsKKwkJcnAuc3RhdHVzID0gLVBUUl9FUlIoY29ubik7CisJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfUEFJUl9ERVZJQ0UsCisJCQkJCQkJJnJwLCBzaXplb2YocnApKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCiAJaWYgKGNvbm4tPmNvbm5lY3RfY2ZtX2NiKSB7CiAJCWhjaV9jb25uX3B1dChjb25uKTsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUEFJUl9ERVZJQ0UsIEVCVVNZKTsKKwkJcnAuc3RhdHVzID0gRUJVU1k7CisJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfUEFJUl9ERVZJQ0UsCisJCQkJCQkJJnJwLCBzaXplb2YocnApKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9QQUlSX0RFVklDRSwgaW5kZXgsIGRhdGEsIGxlbik7CisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9QQUlSX0RFVklDRSwgaGRldiwgZGF0YSwgbGVuKTsKIAlpZiAoIWNtZCkgewogCQllcnIgPSAtRU5PTUVNOwogCQloY2lfY29ubl9wdXQoY29ubik7CkBAIC0xMzc4LDcgKzE1ODMsNyBAQAogCX0KIAogCS8qIEZvciBMRSwganVzdCBjb25uZWN0aW5nIGlzbid0IGEgcHJvb2YgdGhhdCB0aGUgcGFpcmluZyBmaW5pc2hlZCAqLwotCWlmICghZW50cnkpCisJaWYgKGNwLT5hZGRyLnR5cGUgPT0gTUdNVF9BRERSX0JSRURSKQogCQljb25uLT5jb25uZWN0X2NmbV9jYiA9IHBhaXJpbmdfY29tcGxldGVfY2I7CiAKIAljb25uLT5zZWN1cml0eV9jZm1fY2IgPSBwYWlyaW5nX2NvbXBsZXRlX2NiOwpAQCAtMTM5Myw2MiArMTU5OCwxNTEgQEAKIAllcnIgPSAwOwogCiB1bmxvY2s6Ci0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHVzZXJfY29uZmlybV9yZXBseShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdW5zaWduZWQgY2hhciAqZGF0YSwKLQkJCQkJCQl1MTYgbGVuLCBpbnQgc3VjY2VzcykKK3N0YXRpYyBpbnQgdXNlcl9wYWlyaW5nX3Jlc3Aoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsCisJCQkJCXUxNiBtZ210X29wLCB1MTYgaGNpX29wLCBfX2xlMzIgcGFzc2tleSkKIHsKLQlzdHJ1Y3QgbWdtdF9jcF91c2VyX2NvbmZpcm1fcmVwbHkgKmNwID0gKHZvaWQgKikgZGF0YTsKLQl1MTYgbWdtdF9vcCwgaGNpX29wOwogCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OworCXN0cnVjdCBoY2lfY29ubiAqY29ubjsKIAlpbnQgZXJyOwogCi0JQlRfREJHKCIiKTsKLQotCWlmIChzdWNjZXNzKSB7Ci0JCW1nbXRfb3AgPSBNR01UX09QX1VTRVJfQ09ORklSTV9SRVBMWTsKLQkJaGNpX29wID0gSENJX09QX1VTRVJfQ09ORklSTV9SRVBMWTsKLQl9IGVsc2UgewotCQltZ210X29wID0gTUdNVF9PUF9VU0VSX0NPTkZJUk1fTkVHX1JFUExZOwotCQloY2lfb3AgPSBIQ0lfT1BfVVNFUl9DT05GSVJNX05FR19SRVBMWTsKLQl9Ci0KLQlpZiAobGVuICE9IHNpemVvZigqY3ApKQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIG1nbXRfb3AsIEVJTlZBTCk7Ci0KIAloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwogCWlmICghaGRldikKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBtZ210X29wLCBFTk9ERVYpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIG1nbXRfb3AsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKCF0ZXN0X2JpdChIQ0lfVVAsICZoZGV2LT5mbGFncykpIHsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIG1nbXRfb3AsIEVORVRET1dOKTsKLQkJZ290byBmYWlsZWQ7CisJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBtZ210X29wLCBNR01UX1NUQVRVU19OT1RfUE9XRVJFRCk7CisJCWdvdG8gZG9uZTsKIAl9CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBtZ210X29wLCBpbmRleCwgZGF0YSwgbGVuKTsKKwkvKgorCSAqIENoZWNrIGZvciBhbiBleGlzdGluZyBBQ0wgbGluaywgaWYgcHJlc2VudCBwYWlyIHZpYQorCSAqIEhDSSBjb21tYW5kcy4KKwkgKgorCSAqIElmIG5vIEFDTCBsaW5rIGlzIHByZXNlbnQsIGNoZWNrIGZvciBhbiBMRSBsaW5rIGFuZCBpZgorCSAqIHByZXNlbnQsIHBhaXIgdmlhIHRoZSBTTVAgZW5naW5lLgorCSAqCisJICogSWYgbmVpdGhlciBBQ0wgbm9yIExFIGxpbmtzIGFyZSBwcmVzZW50LCBmYWlsIHdpdGggZXJyb3IuCisJICovCisJY29ubiA9IGhjaV9jb25uX2hhc2hfbG9va3VwX2JhKGhkZXYsIEFDTF9MSU5LLCBiZGFkZHIpOworCWlmICghY29ubikgeworCQljb25uID0gaGNpX2Nvbm5faGFzaF9sb29rdXBfYmEoaGRldiwgTEVfTElOSywgYmRhZGRyKTsKKwkJaWYgKCFjb25uKSB7CisJCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgbWdtdF9vcCwKKwkJCQkJCU1HTVRfU1RBVFVTX05PVF9DT05ORUNURUQpOworCQkJZ290byBkb25lOworCQl9CisKKwkJLyogQ29udGludWUgd2l0aCBwYWlyaW5nIHZpYSBTTVAgKi8KKwkJZXJyID0gc21wX3VzZXJfY29uZmlybV9yZXBseShjb25uLCBtZ210X29wLCBwYXNza2V5KTsKKworCQlpZiAoIWVycikKKwkJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBtZ210X29wLAorCQkJCQkJCU1HTVRfU1RBVFVTX1NVQ0NFU1MpOworCQllbHNlCisJCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgbWdtdF9vcCwKKwkJCQkJCQlNR01UX1NUQVRVU19GQUlMRUQpOworCisJCWdvdG8gZG9uZTsKKwl9CisKKwljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBtZ210X29wLCBoZGV2LCBiZGFkZHIsIHNpemVvZigqYmRhZGRyKSk7CiAJaWYgKCFjbWQpIHsKIAkJZXJyID0gLUVOT01FTTsKLQkJZ290byBmYWlsZWQ7CisJCWdvdG8gZG9uZTsKIAl9CiAKLQllcnIgPSBoY2lfc2VuZF9jbWQoaGRldiwgaGNpX29wLCBzaXplb2YoY3AtPmJkYWRkciksICZjcC0+YmRhZGRyKTsKKwkvKiBDb250aW51ZSB3aXRoIHBhaXJpbmcgdmlhIEhDSSAqLworCWlmIChoY2lfb3AgPT0gSENJX09QX1VTRVJfUEFTU0tFWV9SRVBMWSkgeworCQlzdHJ1Y3QgaGNpX2NwX3VzZXJfcGFzc2tleV9yZXBseSBjcDsKKworCQliYWNweSgmY3AuYmRhZGRyLCBiZGFkZHIpOworCQljcC5wYXNza2V5ID0gcGFzc2tleTsKKwkJZXJyID0gaGNpX3NlbmRfY21kKGhkZXYsIGhjaV9vcCwgc2l6ZW9mKGNwKSwgJmNwKTsKKwl9IGVsc2UKKwkJZXJyID0gaGNpX3NlbmRfY21kKGhkZXYsIGhjaV9vcCwgc2l6ZW9mKCpiZGFkZHIpLCBiZGFkZHIpOworCiAJaWYgKGVyciA8IDApCiAJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAotZmFpbGVkOgotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworZG9uZToKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CiB9CiAKK3N0YXRpYyBpbnQgdXNlcl9jb25maXJtX3JlcGx5KHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB2b2lkICpkYXRhLCB1MTYgbGVuKQoreworCXN0cnVjdCBtZ210X2NwX3VzZXJfY29uZmlybV9yZXBseSAqY3AgPSAodm9pZCAqKSBkYXRhOworCisJQlRfREJHKCIiKTsKKworCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9VU0VSX0NPTkZJUk1fUkVQTFksCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CisKKwlyZXR1cm4gdXNlcl9wYWlyaW5nX3Jlc3Aoc2ssIGluZGV4LCAmY3AtPmJkYWRkciwKKwkJCU1HTVRfT1BfVVNFUl9DT05GSVJNX1JFUExZLAorCQkJSENJX09QX1VTRVJfQ09ORklSTV9SRVBMWSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdXNlcl9jb25maXJtX25lZ19yZXBseShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCwgdm9pZCAqZGF0YSwKKwkJCQkJCQkJCXUxNiBsZW4pCit7CisJc3RydWN0IG1nbXRfY3BfdXNlcl9jb25maXJtX25lZ19yZXBseSAqY3AgPSBkYXRhOworCisJQlRfREJHKCIiKTsKKworCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9VU0VSX0NPTkZJUk1fTkVHX1JFUExZLAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCisJcmV0dXJuIHVzZXJfcGFpcmluZ19yZXNwKHNrLCBpbmRleCwgJmNwLT5iZGFkZHIsCisJCQlNR01UX09QX1VTRVJfQ09ORklSTV9ORUdfUkVQTFksCisJCQlIQ0lfT1BfVVNFUl9DT05GSVJNX05FR19SRVBMWSwgMCk7Cit9CisKK3N0YXRpYyBpbnQgdXNlcl9wYXNza2V5X3JlcGx5KHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB2b2lkICpkYXRhLCB1MTYgbGVuKQoreworCXN0cnVjdCBtZ210X2NwX3VzZXJfcGFzc2tleV9yZXBseSAqY3AgPSAodm9pZCAqKSBkYXRhOworCisJQlRfREJHKCIiKTsKKworCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9VU0VSX1BBU1NLRVlfUkVQTFksCisJCQkJCQkJCQlFSU5WQUwpOworCisJcmV0dXJuIHVzZXJfcGFpcmluZ19yZXNwKHNrLCBpbmRleCwgJmNwLT5iZGFkZHIsCisJCQlNR01UX09QX1VTRVJfUEFTU0tFWV9SRVBMWSwKKwkJCUhDSV9PUF9VU0VSX1BBU1NLRVlfUkVQTFksIGNwLT5wYXNza2V5KTsKK30KKworc3RhdGljIGludCB1c2VyX3Bhc3NrZXlfbmVnX3JlcGx5KHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LCB2b2lkICpkYXRhLAorCQkJCQkJCQkJdTE2IGxlbikKK3sKKwlzdHJ1Y3QgbWdtdF9jcF91c2VyX3Bhc3NrZXlfbmVnX3JlcGx5ICpjcCA9ICh2b2lkICopIGRhdGE7CisKKwlCVF9EQkcoIiIpOworCisJaWYgKGxlbiAhPSBzaXplb2YoKmNwKSkKKwkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1VTRVJfUEFTU0tFWV9ORUdfUkVQTFksCisJCQkJCQkJCQlFSU5WQUwpOworCisJcmV0dXJuIHVzZXJfcGFpcmluZ19yZXNwKHNrLCBpbmRleCwgJmNwLT5iZGFkZHIsCisJCQlNR01UX09QX1VTRVJfUEFTU0tFWV9ORUdfUkVQTFksCisJCQlIQ0lfT1BfVVNFUl9QQVNTS0VZX05FR19SRVBMWSwgMCk7Cit9CisKIHN0YXRpYyBpbnQgc2V0X2xvY2FsX25hbWUoc3RydWN0IHNvY2sgKnNrLCB1MTYgaW5kZXgsIHVuc2lnbmVkIGNoYXIgKmRhdGEsCiAJCQkJCQkJCXUxNiBsZW4pCiB7CkBAIC0xNDYxLDE1ICsxNzU1LDE3IEBACiAJQlRfREJHKCIiKTsKIAogCWlmIChsZW4gIT0gc2l6ZW9mKCptZ210X2NwKSkKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLCBFSU5WQUwpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwogCWlmICghaGRldikKLQkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLCBFTk9ERVYpOworCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TRVRfTE9DQUxfTkFNRSwgaW5kZXgsIGRhdGEsIGxlbik7CisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TRVRfTE9DQUxfTkFNRSwgaGRldiwgZGF0YSwgbGVuKTsKIAlpZiAoIWNtZCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZDsKQEAgLTE0ODIsNyArMTc3OCw3IEBACiAJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAogZmFpbGVkOgotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTE0OTksMjggKzE3OTUsMjkgQEAKIAloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwogCWlmICghaGRldikKIAkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCi0JCQkJCQkJCQlFTk9ERVYpOworCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfbG9jayhoZGV2KTsKIAogCWlmICghdGVzdF9iaXQoSENJX1VQLCAmaGRldi0+ZmxhZ3MpKSB7CiAJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCi0JCQkJCQkJCUVORVRET1dOKTsKKwkJCQkJCU1HTVRfU1RBVFVTX05PVF9QT1dFUkVEKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCiAJaWYgKCEoaGRldi0+ZmVhdHVyZXNbNl0gJiBMTVBfU0lNUExFX1BBSVIpKSB7CiAJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCi0JCQkJCQkJCUVPUE5PVFNVUFApOworCQkJCQkJTUdNVF9TVEFUVVNfTk9UX1NVUFBPUlRFRCk7CiAJCWdvdG8gdW5sb2NrOwogCX0KIAotCWlmIChtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsIGluZGV4KSkgewotCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLCBFQlVTWSk7CisJaWYgKG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwgaGRldikpIHsKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwKKwkJCQkJCQlNR01UX1NUQVRVU19CVVNZKTsKIAkJZ290byB1bmxvY2s7CiAJfQogCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLCBpbmRleCwgTlVMTCwgMCk7CisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLCBoZGV2LCBOVUxMLCAwKTsKIAlpZiAoIWNtZCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIHVubG9jazsKQEAgLTE1MzEsNyArMTgyOCw3IEBACiAJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAogdW5sb2NrOgotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTE1NDgsMjQgKzE4NDUsMjUgQEAKIAogCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9BRERfUkVNT1RFX09PQl9EQVRBLAotCQkJCQkJCQkJRUlOVkFMKTsKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfQUREX1JFTU9URV9PT0JfREFUQSwKLQkJCQkJCQkJCUVOT0RFVik7CisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJZXJyID0gaGNpX2FkZF9yZW1vdGVfb29iX2RhdGEoaGRldiwgJmNwLT5iZGFkZHIsIGNwLT5oYXNoLAogCQkJCQkJCQljcC0+cmFuZG9taXplcik7CiAJaWYgKGVyciA8IDApCi0JCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX0FERF9SRU1PVEVfT09CX0RBVEEsIC1lcnIpOworCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9BRERfUkVNT1RFX09PQl9EQVRBLAorCQkJCQkJCU1HTVRfU1RBVFVTX0ZBSUxFRCk7CiAJZWxzZQogCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGluZGV4LCBNR01UX09QX0FERF9SRU1PVEVfT09CX0RBVEEsIE5VTEwsCiAJCQkJCQkJCQkwKTsKIAotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTE1ODIsNjIgKzE4ODAsNjggQEAKIAogCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfUkVNT1RFX09PQl9EQVRBLAotCQkJCQkJCQkJRUlOVkFMKTsKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfUkVNT1ZFX1JFTU9URV9PT0JfREFUQSwKLQkJCQkJCQkJCUVOT0RFVik7CisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJZXJyID0gaGNpX3JlbW92ZV9yZW1vdGVfb29iX2RhdGEoaGRldiwgJmNwLT5iZGFkZHIpOwogCWlmIChlcnIgPCAwKQogCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9SRU1PVkVfUkVNT1RFX09PQl9EQVRBLAotCQkJCQkJCQkJLWVycik7CisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAJZWxzZQogCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGluZGV4LCBNR01UX09QX1JFTU9WRV9SRU1PVEVfT09CX0RBVEEsCiAJCQkJCQkJCU5VTEwsIDApOwogCi0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1zdGF0aWMgaW50IHN0YXJ0X2Rpc2NvdmVyeShzdHJ1Y3Qgc29jayAqc2ssIHUxNiBpbmRleCkKK3N0YXRpYyBpbnQgc3RhcnRfZGlzY292ZXJ5KHN0cnVjdCBzb2NrICpzaywgdTE2IGluZGV4LAorCQkJCQkJdW5zaWduZWQgY2hhciAqZGF0YSwgdTE2IGxlbikKIHsKLQl1OCBsYXBbM10gPSB7IDB4MzMsIDB4OGIsIDB4OWUgfTsKLQlzdHJ1Y3QgaGNpX2NwX2lucXVpcnkgY3A7CisJc3RydWN0IG1nbXRfY3Bfc3RhcnRfZGlzY292ZXJ5ICpjcCA9ICh2b2lkICopIGRhdGE7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7CiAJaW50IGVycjsKIAogCUJUX0RCRygiaGNpJXUiLCBpbmRleCk7CiAKKwlpZiAobGVuICE9IHNpemVvZigqY3ApKQorCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU1RBUlRfRElTQ09WRVJZLAorCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOworCiAJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKIAlpZiAoIWhkZXYpCi0JCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksIEVOT0RFVik7CisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksCisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksIGluZGV4LCBOVUxMLCAwKTsKKwlpZiAoIXRlc3RfYml0KEhDSV9VUCwgJmhkZXYtPmZsYWdzKSkgeworCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksCisJCQkJCQlNR01UX1NUQVRVU19OT1RfUE9XRVJFRCk7CisJCWdvdG8gZmFpbGVkOworCX0KKworCWNtZCA9IG1nbXRfcGVuZGluZ19hZGQoc2ssIE1HTVRfT1BfU1RBUlRfRElTQ09WRVJZLCBoZGV2LCBOVUxMLCAwKTsKIAlpZiAoIWNtZCkgewogCQllcnIgPSAtRU5PTUVNOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQltZW1zZXQoJmNwLCAwLCBzaXplb2YoY3ApKTsKLQltZW1jcHkoJmNwLmxhcCwgbGFwLCAzKTsKLQljcC5sZW5ndGggID0gMHgwODsKLQljcC5udW1fcnNwID0gMHgwMDsKLQotCWVyciA9IGhjaV9zZW5kX2NtZChoZGV2LCBIQ0lfT1BfSU5RVUlSWSwgc2l6ZW9mKGNwKSwgJmNwKTsKKwllcnIgPSBoY2lfZG9faW5xdWlyeShoZGV2LCBJTlFVSVJZX0xFTl9CUkVEUik7CiAJaWYgKGVyciA8IDApCiAJCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKIAogZmFpbGVkOgotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTE2NTMsMjIgKzE5NTcsMjMgQEAKIAogCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CiAJaWYgKCFoZGV2KQotCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU1RPUF9ESVNDT1ZFUlksIEVOT0RFVik7CisJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TVE9QX0RJU0NPVkVSWSwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAotCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKKwloY2lfZGV2X2xvY2soaGRldik7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBNR01UX09QX1NUT1BfRElTQ09WRVJZLCBpbmRleCwgTlVMTCwgMCk7CisJY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9TVE9QX0RJU0NPVkVSWSwgaGRldiwgTlVMTCwgMCk7CiAJaWYgKCFjbWQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBmYWlsZWQ7CiAJfQogCi0JZXJyID0gaGNpX3NlbmRfY21kKGhkZXYsIEhDSV9PUF9JTlFVSVJZX0NBTkNFTCwgMCwgTlVMTCk7CisJZXJyID0gaGNpX2NhbmNlbF9pbnF1aXJ5KGhkZXYpOwogCWlmIChlcnIgPCAwKQogCQltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKIGZhaWxlZDoKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAogCXJldHVybiBlcnI7CkBAIC0xNjc4LDcgKzE5ODMsNiBAQAogCQkJCQkJCQl1MTYgbGVuKQogewogCXN0cnVjdCBoY2lfZGV2ICpoZGV2OwotCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBtZ210X2NwX2Jsb2NrX2RldmljZSAqY3AgPSAodm9pZCAqKSBkYXRhOwogCWludCBlcnI7CiAKQEAgLTE2ODYsMzMgKzE5OTAsMjQgQEAKIAogCWlmIChsZW4gIT0gc2l6ZW9mKCpjcCkpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9CTE9DS19ERVZJQ0UsCi0JCQkJCQkJRUlOVkFMKTsKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhkZXYgPSBoY2lfZGV2X2dldChpbmRleCk7CiAJaWYgKCFoZGV2KQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfQkxPQ0tfREVWSUNFLAotCQkJCQkJCUVOT0RFVik7CisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7Ci0KLQljbWQgPSBtZ210X3BlbmRpbmdfYWRkKHNrLCBNR01UX09QX0JMT0NLX0RFVklDRSwgaW5kZXgsIE5VTEwsIDApOwotCWlmICghY21kKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbGVkOwotCX0KKwloY2lfZGV2X2xvY2soaGRldik7CiAKIAllcnIgPSBoY2lfYmxhY2tsaXN0X2FkZChoZGV2LCAmY3AtPmJkYWRkcik7Ci0KIAlpZiAoZXJyIDwgMCkKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfQkxPQ0tfREVWSUNFLCAtZXJyKTsKKwkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfQkxPQ0tfREVWSUNFLAorCQkJCQkJCU1HTVRfU1RBVFVTX0ZBSUxFRCk7CiAJZWxzZQogCQllcnIgPSBjbWRfY29tcGxldGUoc2ssIGluZGV4LCBNR01UX09QX0JMT0NLX0RFVklDRSwKIAkJCQkJCQlOVUxMLCAwKTsKIAotCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKLQotZmFpbGVkOgotCWhjaV9kZXZfdW5sb2NrX2JoKGhkZXYpOworCWhjaV9kZXZfdW5sb2NrKGhkZXYpOwogCWhjaV9kZXZfcHV0KGhkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTE3MjIsNyArMjAxNyw2IEBACiAJCQkJCQkJCXUxNiBsZW4pCiB7CiAJc3RydWN0IGhjaV9kZXYgKmhkZXY7Ci0Jc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IG1nbXRfY3BfdW5ibG9ja19kZXZpY2UgKmNwID0gKHZvaWQgKikgZGF0YTsKIAlpbnQgZXJyOwogCkBAIC0xNzMwLDMzICsyMDI0LDI1IEBACiAKIAlpZiAobGVuICE9IHNpemVvZigqY3ApKQogCQlyZXR1cm4gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UsCi0JCQkJCQkJCUVJTlZBTCk7CisJCQkJCQlNR01UX1NUQVRVU19JTlZBTElEX1BBUkFNUyk7CiAKIAloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwogCWlmICghaGRldikKIAkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1VOQkxPQ0tfREVWSUNFLAotCQkJCQkJCQlFTk9ERVYpOworCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCi0JaGNpX2Rldl9sb2NrX2JoKGhkZXYpOwotCi0JY21kID0gbWdtdF9wZW5kaW5nX2FkZChzaywgTUdNVF9PUF9VTkJMT0NLX0RFVklDRSwgaW5kZXgsIE5VTEwsIDApOwotCWlmICghY21kKSB7Ci0JCWVyciA9IC1FTk9NRU07Ci0JCWdvdG8gZmFpbGVkOwotCX0KKwloY2lfZGV2X2xvY2soaGRldik7CiAKIAllcnIgPSBoY2lfYmxhY2tsaXN0X2RlbChoZGV2LCAmY3AtPmJkYWRkcik7CiAKIAlpZiAoZXJyIDwgMCkKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UsIC1lcnIpOworCQllcnIgPSBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9VTkJMT0NLX0RFVklDRSwKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAllbHNlCiAJCWVyciA9IGNtZF9jb21wbGV0ZShzaywgaW5kZXgsIE1HTVRfT1BfVU5CTE9DS19ERVZJQ0UsCiAJCQkJCQkJCU5VTEwsIDApOwogCi0JbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwotCi1mYWlsZWQ6Ci0JaGNpX2Rldl91bmxvY2tfYmgoaGRldik7CisJaGNpX2Rldl91bmxvY2soaGRldik7CiAJaGNpX2Rldl9wdXQoaGRldik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTc2Niw3ICsyMDUyLDcgQEAKIAkJCQkJdW5zaWduZWQgY2hhciAqZGF0YSwgdTE2IGxlbikKIHsKIAlzdHJ1Y3QgaGNpX2RldiAqaGRldjsKLQlzdHJ1Y3QgbWdtdF9jcF9zZXRfZmFzdF9jb25uZWN0YWJsZSAqY3AgPSAodm9pZCAqKSBkYXRhOworCXN0cnVjdCBtZ210X21vZGUgKmNwID0gKHZvaWQgKikgZGF0YTsKIAlzdHJ1Y3QgaGNpX2NwX3dyaXRlX3BhZ2Vfc2Nhbl9hY3Rpdml0eSBhY3A7CiAJdTggdHlwZTsKIAlpbnQgZXJyOwpAQCAtMTc3NSwxNiArMjA2MSwxNiBAQAogCiAJaWYgKGxlbiAhPSBzaXplb2YoKmNwKSkKIAkJcmV0dXJuIGNtZF9zdGF0dXMoc2ssIGluZGV4LCBNR01UX09QX1NFVF9GQVNUX0NPTk5FQ1RBQkxFLAotCQkJCQkJCQlFSU5WQUwpOworCQkJCQkJTUdNVF9TVEFUVVNfSU5WQUxJRF9QQVJBTVMpOwogCiAJaGRldiA9IGhjaV9kZXZfZ2V0KGluZGV4KTsKIAlpZiAoIWhkZXYpCiAJCXJldHVybiBjbWRfc3RhdHVzKHNrLCBpbmRleCwgTUdNVF9PUF9TRVRfRkFTVF9DT05ORUNUQUJMRSwKLQkJCQkJCQkJRU5PREVWKTsKKwkJCQkJCU1HTVRfU1RBVFVTX0lOVkFMSURfUEFSQU1TKTsKIAogCWhjaV9kZXZfbG9jayhoZGV2KTsKIAotCWlmIChjcC0+ZW5hYmxlKSB7CisJaWYgKGNwLT52YWwpIHsKIAkJdHlwZSA9IFBBR0VfU0NBTl9UWVBFX0lOVEVSTEFDRUQ7CiAJCWFjcC5pbnRlcnZhbCA9IDB4MDAyNDsJLyogMjIuNSBtc2VjIHBhZ2Ugc2NhbiBpbnRlcnZhbCAqLwogCX0gZWxzZSB7CkBAIC0xNzk4LDE0ICsyMDg0LDE0IEBACiAJCQkJCQlzaXplb2YoYWNwKSwgJmFjcCk7CiAJaWYgKGVyciA8IDApIHsKIAkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0ZBU1RfQ09OTkVDVEFCTEUsCi0JCQkJCQkJCS1lcnIpOworCQkJCQkJCU1HTVRfU1RBVFVTX0ZBSUxFRCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKIAllcnIgPSBoY2lfc2VuZF9jbWQoaGRldiwgSENJX09QX1dSSVRFX1BBR0VfU0NBTl9UWVBFLCAxLCAmdHlwZSk7CiAJaWYgKGVyciA8IDApIHsKIAkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIE1HTVRfT1BfU0VUX0ZBU1RfQ09OTkVDVEFCTEUsCi0JCQkJCQkJCS1lcnIpOworCQkJCQkJCU1HTVRfU1RBVFVTX0ZBSUxFRCk7CiAJCWdvdG8gZG9uZTsKIAl9CiAKQEAgLTE4NjgsNiArMjE1NCwxMCBAQAogCWNhc2UgTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEU6CiAJCWVyciA9IHNldF9jb25uZWN0YWJsZShzaywgaW5kZXgsIGJ1ZiArIHNpemVvZigqaGRyKSwgbGVuKTsKIAkJYnJlYWs7CisJY2FzZSBNR01UX09QX1NFVF9GQVNUX0NPTk5FQ1RBQkxFOgorCQllcnIgPSBzZXRfZmFzdF9jb25uZWN0YWJsZShzaywgaW5kZXgsIGJ1ZiArIHNpemVvZigqaGRyKSwKKwkJCQkJCQkJbGVuKTsKKwkJYnJlYWs7CiAJY2FzZSBNR01UX09QX1NFVF9QQUlSQUJMRToKIAkJZXJyID0gc2V0X3BhaXJhYmxlKHNrLCBpbmRleCwgYnVmICsgc2l6ZW9mKCpoZHIpLCBsZW4pOwogCQlicmVhazsKQEAgLTE4ODAsMTQgKzIxNzAsMTEgQEAKIAljYXNlIE1HTVRfT1BfU0VUX0RFVl9DTEFTUzoKIAkJZXJyID0gc2V0X2Rldl9jbGFzcyhzaywgaW5kZXgsIGJ1ZiArIHNpemVvZigqaGRyKSwgbGVuKTsKIAkJYnJlYWs7Ci0JY2FzZSBNR01UX09QX1NFVF9TRVJWSUNFX0NBQ0hFOgotCQllcnIgPSBzZXRfc2VydmljZV9jYWNoZShzaywgaW5kZXgsIGJ1ZiArIHNpemVvZigqaGRyKSwgbGVuKTsKKwljYXNlIE1HTVRfT1BfTE9BRF9MSU5LX0tFWVM6CisJCWVyciA9IGxvYWRfbGlua19rZXlzKHNrLCBpbmRleCwgYnVmICsgc2l6ZW9mKCpoZHIpLCBsZW4pOwogCQlicmVhazsKLQljYXNlIE1HTVRfT1BfTE9BRF9LRVlTOgotCQllcnIgPSBsb2FkX2tleXMoc2ssIGluZGV4LCBidWYgKyBzaXplb2YoKmhkciksIGxlbik7Ci0JCWJyZWFrOwotCWNhc2UgTUdNVF9PUF9SRU1PVkVfS0VZOgotCQllcnIgPSByZW1vdmVfa2V5KHNrLCBpbmRleCwgYnVmICsgc2l6ZW9mKCpoZHIpLCBsZW4pOworCWNhc2UgTUdNVF9PUF9SRU1PVkVfS0VZUzoKKwkJZXJyID0gcmVtb3ZlX2tleXMoc2ssIGluZGV4LCBidWYgKyBzaXplb2YoKmhkciksIGxlbik7CiAJCWJyZWFrOwogCWNhc2UgTUdNVF9PUF9ESVNDT05ORUNUOgogCQllcnIgPSBkaXNjb25uZWN0KHNrLCBpbmRleCwgYnVmICsgc2l6ZW9mKCpoZHIpLCBsZW4pOwpAQCAtMTkwOCwxMCArMjE5NSwxOCBAQAogCQllcnIgPSBwYWlyX2RldmljZShzaywgaW5kZXgsIGJ1ZiArIHNpemVvZigqaGRyKSwgbGVuKTsKIAkJYnJlYWs7CiAJY2FzZSBNR01UX09QX1VTRVJfQ09ORklSTV9SRVBMWToKLQkJZXJyID0gdXNlcl9jb25maXJtX3JlcGx5KHNrLCBpbmRleCwgYnVmICsgc2l6ZW9mKCpoZHIpLCBsZW4sIDEpOworCQllcnIgPSB1c2VyX2NvbmZpcm1fcmVwbHkoc2ssIGluZGV4LCBidWYgKyBzaXplb2YoKmhkciksIGxlbik7CiAJCWJyZWFrOwogCWNhc2UgTUdNVF9PUF9VU0VSX0NPTkZJUk1fTkVHX1JFUExZOgotCQllcnIgPSB1c2VyX2NvbmZpcm1fcmVwbHkoc2ssIGluZGV4LCBidWYgKyBzaXplb2YoKmhkciksIGxlbiwgMCk7CisJCWVyciA9IHVzZXJfY29uZmlybV9uZWdfcmVwbHkoc2ssIGluZGV4LCBidWYgKyBzaXplb2YoKmhkciksCisJCQkJCQkJCQlsZW4pOworCQlicmVhazsKKwljYXNlIE1HTVRfT1BfVVNFUl9QQVNTS0VZX1JFUExZOgorCQllcnIgPSB1c2VyX3Bhc3NrZXlfcmVwbHkoc2ssIGluZGV4LCBidWYgKyBzaXplb2YoKmhkciksIGxlbik7CisJCWJyZWFrOworCWNhc2UgTUdNVF9PUF9VU0VSX1BBU1NLRVlfTkVHX1JFUExZOgorCQllcnIgPSB1c2VyX3Bhc3NrZXlfbmVnX3JlcGx5KHNrLCBpbmRleCwgYnVmICsgc2l6ZW9mKCpoZHIpLAorCQkJCQkJCQkJbGVuKTsKIAkJYnJlYWs7CiAJY2FzZSBNR01UX09QX1NFVF9MT0NBTF9OQU1FOgogCQllcnIgPSBzZXRfbG9jYWxfbmFtZShzaywgaW5kZXgsIGJ1ZiArIHNpemVvZigqaGRyKSwgbGVuKTsKQEAgLTE5MjcsNyArMjIyMiw3IEBACiAJCQkJCQkJCQlsZW4pOwogCQlicmVhazsKIAljYXNlIE1HTVRfT1BfU1RBUlRfRElTQ09WRVJZOgotCQllcnIgPSBzdGFydF9kaXNjb3Zlcnkoc2ssIGluZGV4KTsKKwkJZXJyID0gc3RhcnRfZGlzY292ZXJ5KHNrLCBpbmRleCwgYnVmICsgc2l6ZW9mKCpoZHIpLCBsZW4pOwogCQlicmVhazsKIAljYXNlIE1HTVRfT1BfU1RPUF9ESVNDT1ZFUlk6CiAJCWVyciA9IHN0b3BfZGlzY292ZXJ5KHNrLCBpbmRleCk7CkBAIC0xOTM4LDEzICsyMjMzLDEwIEBACiAJY2FzZSBNR01UX09QX1VOQkxPQ0tfREVWSUNFOgogCQllcnIgPSB1bmJsb2NrX2RldmljZShzaywgaW5kZXgsIGJ1ZiArIHNpemVvZigqaGRyKSwgbGVuKTsKIAkJYnJlYWs7Ci0JY2FzZSBNR01UX09QX1NFVF9GQVNUX0NPTk5FQ1RBQkxFOgotCQllcnIgPSBzZXRfZmFzdF9jb25uZWN0YWJsZShzaywgaW5kZXgsIGJ1ZiArIHNpemVvZigqaGRyKSwKLQkJCQkJCQkJbGVuKTsKLQkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlRfREJHKCJVbmtub3duIG9wICV1Iiwgb3Bjb2RlKTsKLQkJZXJyID0gY21kX3N0YXR1cyhzaywgaW5kZXgsIG9wY29kZSwgMHgwMSk7CisJCWVyciA9IGNtZF9zdGF0dXMoc2ssIGluZGV4LCBvcGNvZGUsCisJCQkJCQlNR01UX1NUQVRVU19VTktOT1dOX0NPTU1BTkQpOwogCQlicmVhazsKIAl9CiAKQEAgLTE5NTgsMzAgKzIyNTAsMzkgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbWdtdF9pbmRleF9hZGRlZCh1MTYgaW5kZXgpCitzdGF0aWMgdm9pZCBjbWRfc3RhdHVzX3JzcChzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSkKIHsKLQlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX0lOREVYX0FEREVELCBpbmRleCwgTlVMTCwgMCwgTlVMTCk7CisJdTggKnN0YXR1cyA9IGRhdGE7CisKKwljbWRfc3RhdHVzKGNtZC0+c2ssIGNtZC0+aW5kZXgsIGNtZC0+b3Bjb2RlLCAqc3RhdHVzKTsKKwltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiB9CiAKLWludCBtZ210X2luZGV4X3JlbW92ZWQodTE2IGluZGV4KQoraW50IG1nbXRfaW5kZXhfYWRkZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpCiB7Ci0JcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9JTkRFWF9SRU1PVkVELCBpbmRleCwgTlVMTCwgMCwgTlVMTCk7CisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9JTkRFWF9BRERFRCwgaGRldiwgTlVMTCwgMCwgTlVMTCk7Cit9CisKK2ludCBtZ210X2luZGV4X3JlbW92ZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYpCit7CisJdTggc3RhdHVzID0gRU5PREVWOworCisJbWdtdF9wZW5kaW5nX2ZvcmVhY2goMCwgaGRldiwgY21kX3N0YXR1c19yc3AsICZzdGF0dXMpOworCisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9JTkRFWF9SRU1PVkVELCBoZGV2LCBOVUxMLCAwLCBOVUxMKTsKIH0KIAogc3RydWN0IGNtZF9sb29rdXAgewogCXU4IHZhbDsKIAlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IGhjaV9kZXYgKmhkZXY7CiB9OwogCi1zdGF0aWMgdm9pZCBtb2RlX3JzcChzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSkKK3N0YXRpYyB2b2lkIHNldHRpbmdzX3JzcChzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgbWdtdF9tb2RlICpjcCA9IGNtZC0+cGFyYW07CiAJc3RydWN0IGNtZF9sb29rdXAgKm1hdGNoID0gZGF0YTsKIAotCWlmIChjcC0+dmFsICE9IG1hdGNoLT52YWwpCi0JCXJldHVybjsKLQotCXNlbmRfbW9kZV9yc3AoY21kLT5zaywgY21kLT5vcGNvZGUsIGNtZC0+aW5kZXgsIGNwLT52YWwpOworCXNlbmRfc2V0dGluZ3NfcnNwKGNtZC0+c2ssIGNtZC0+b3Bjb2RlLCBtYXRjaC0+aGRldik7CiAKIAlsaXN0X2RlbCgmY21kLT5saXN0KTsKIApAQCAtMTk5MywzNSArMjI5NCwyMiBAQAogCW1nbXRfcGVuZGluZ19mcmVlKGNtZCk7CiB9CiAKLWludCBtZ210X3Bvd2VyZWQodTE2IGluZGV4LCB1OCBwb3dlcmVkKQoraW50IG1nbXRfcG93ZXJlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgdTggcG93ZXJlZCkKIHsKLQlzdHJ1Y3QgbWdtdF9tb2RlIGV2OwotCXN0cnVjdCBjbWRfbG9va3VwIG1hdGNoID0geyBwb3dlcmVkLCBOVUxMIH07CisJc3RydWN0IGNtZF9sb29rdXAgbWF0Y2ggPSB7IHBvd2VyZWQsIE5VTEwsIGhkZXYgfTsKKwlfX2xlMzIgZXY7CiAJaW50IHJldDsKIAotCW1nbXRfcGVuZGluZ19mb3JlYWNoKE1HTVRfT1BfU0VUX1BPV0VSRUQsIGluZGV4LCBtb2RlX3JzcCwgJm1hdGNoKTsKKwltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1NFVF9QT1dFUkVELCBoZGV2LCBzZXR0aW5nc19yc3AsICZtYXRjaCk7CiAKLQlldi52YWwgPSBwb3dlcmVkOworCWlmICghcG93ZXJlZCkgeworCQl1OCBzdGF0dXMgPSBFTkVURE9XTjsKKwkJbWdtdF9wZW5kaW5nX2ZvcmVhY2goMCwgaGRldiwgY21kX3N0YXR1c19yc3AsICZzdGF0dXMpOworCX0KIAotCXJldCA9IG1nbXRfZXZlbnQoTUdNVF9FVl9QT1dFUkVELCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLCBtYXRjaC5zayk7CisJZXYgPSBjcHVfdG9fbGUzMihnZXRfY3VycmVudF9zZXR0aW5ncyhoZGV2KSk7CiAKLQlpZiAobWF0Y2guc2spCi0JCXNvY2tfcHV0KG1hdGNoLnNrKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLWludCBtZ210X2Rpc2NvdmVyYWJsZSh1MTYgaW5kZXgsIHU4IGRpc2NvdmVyYWJsZSkKLXsKLQlzdHJ1Y3QgbWdtdF9tb2RlIGV2OwotCXN0cnVjdCBjbWRfbG9va3VwIG1hdGNoID0geyBkaXNjb3ZlcmFibGUsIE5VTEwgfTsKLQlpbnQgcmV0OwotCi0JbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBpbmRleCwgbW9kZV9yc3AsICZtYXRjaCk7Ci0KLQlldi52YWwgPSBkaXNjb3ZlcmFibGU7Ci0KLQlyZXQgPSBtZ210X2V2ZW50KE1HTVRfRVZfRElTQ09WRVJBQkxFLCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLAorCXJldCA9IG1nbXRfZXZlbnQoTUdNVF9FVl9ORVdfU0VUVElOR1MsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwKIAkJCQkJCQkJbWF0Y2guc2spOwogCiAJaWYgKG1hdGNoLnNrKQpAQCAtMjAzMCwxNyArMjMxOCwzNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBtZ210X2Nvbm5lY3RhYmxlKHUxNiBpbmRleCwgdTggY29ubmVjdGFibGUpCitpbnQgbWdtdF9kaXNjb3ZlcmFibGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IGRpc2NvdmVyYWJsZSkKIHsKLQlzdHJ1Y3QgbWdtdF9tb2RlIGV2OwotCXN0cnVjdCBjbWRfbG9va3VwIG1hdGNoID0geyBjb25uZWN0YWJsZSwgTlVMTCB9OworCXN0cnVjdCBjbWRfbG9va3VwIG1hdGNoID0geyBkaXNjb3ZlcmFibGUsIE5VTEwsIGhkZXYgfTsKKwlfX2xlMzIgZXY7CiAJaW50IHJldDsKIAotCW1nbXRfcGVuZGluZ19mb3JlYWNoKE1HTVRfT1BfU0VUX0NPTk5FQ1RBQkxFLCBpbmRleCwgbW9kZV9yc3AsICZtYXRjaCk7CisJbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9TRVRfRElTQ09WRVJBQkxFLCBoZGV2LCBzZXR0aW5nc19yc3AsICZtYXRjaCk7CiAKLQlldi52YWwgPSBjb25uZWN0YWJsZTsKKwlldiA9IGNwdV90b19sZTMyKGdldF9jdXJyZW50X3NldHRpbmdzKGhkZXYpKTsKIAotCXJldCA9IG1nbXRfZXZlbnQoTUdNVF9FVl9DT05ORUNUQUJMRSwgaW5kZXgsICZldiwgc2l6ZW9mKGV2KSwgbWF0Y2guc2spOworCXJldCA9IG1nbXRfZXZlbnQoTUdNVF9FVl9ORVdfU0VUVElOR1MsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwKKwkJCQkJCQkJbWF0Y2guc2spOworCWlmIChtYXRjaC5zaykKKwkJc29ja19wdXQobWF0Y2guc2spOworCisJcmV0dXJuIHJldDsKK30KKworaW50IG1nbXRfY29ubmVjdGFibGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IGNvbm5lY3RhYmxlKQoreworCV9fbGUzMiBldjsKKwlzdHJ1Y3QgY21kX2xvb2t1cCBtYXRjaCA9IHsgY29ubmVjdGFibGUsIE5VTEwsIGhkZXYgfTsKKwlpbnQgcmV0OworCisJbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsIGhkZXYsIHNldHRpbmdzX3JzcCwKKwkJCQkJCQkJJm1hdGNoKTsKKworCWV2ID0gY3B1X3RvX2xlMzIoZ2V0X2N1cnJlbnRfc2V0dGluZ3MoaGRldikpOworCisJcmV0ID0gbWdtdF9ldmVudChNR01UX0VWX05FV19TRVRUSU5HUywgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBtYXRjaC5zayk7CiAKIAlpZiAobWF0Y2guc2spCiAJCXNvY2tfcHV0KG1hdGNoLnNrKTsKQEAgLTIwNDgsOSArMjM1NSwyNSBAQAogCXJldHVybiByZXQ7CiB9CiAKLWludCBtZ210X25ld19rZXkodTE2IGluZGV4LCBzdHJ1Y3QgbGlua19rZXkgKmtleSwgdTggcGVyc2lzdGVudCkKK2ludCBtZ210X3dyaXRlX3NjYW5fZmFpbGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzY2FuLCB1OCBzdGF0dXMpCiB7Ci0Jc3RydWN0IG1nbXRfZXZfbmV3X2tleSBldjsKKwl1OCBtZ210X2VyciA9IG1nbXRfc3RhdHVzKHN0YXR1cyk7CisKKwlpZiAoc2NhbiAmIFNDQU5fUEFHRSkKKwkJbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9TRVRfQ09OTkVDVEFCTEUsIGhkZXYsCisJCQkJCQljbWRfc3RhdHVzX3JzcCwgJm1nbXRfZXJyKTsKKworCWlmIChzY2FuICYgU0NBTl9JTlFVSVJZKQorCQltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX1NFVF9ESVNDT1ZFUkFCTEUsIGhkZXYsCisJCQkJCQljbWRfc3RhdHVzX3JzcCwgJm1nbXRfZXJyKTsKKworCXJldHVybiAwOworfQorCitpbnQgbWdtdF9uZXdfbGlua19rZXkoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHN0cnVjdCBsaW5rX2tleSAqa2V5LAorCQkJCQkJCQl1OCBwZXJzaXN0ZW50KQoreworCXN0cnVjdCBtZ210X2V2X25ld19saW5rX2tleSBldjsKIAogCW1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOwogCkBAIC0yMDYwLDE3ICsyMzgzLDE4IEBACiAJbWVtY3B5KGV2LmtleS52YWwsIGtleS0+dmFsLCAxNik7CiAJZXYua2V5LnBpbl9sZW4gPSBrZXktPnBpbl9sZW47CiAKLQlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX05FV19LRVksIGluZGV4LCAmZXYsIHNpemVvZihldiksIE5VTEwpOworCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfTkVXX0xJTktfS0VZLCBoZGV2LCAmZXYsIHNpemVvZihldiksIE5VTEwpOwogfQogCi1pbnQgbWdtdF9jb25uZWN0ZWQodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBsaW5rX3R5cGUpCitpbnQgbWdtdF9jb25uZWN0ZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IGxpbmtfdHlwZSwKKwkJCQkJCQkJdTggYWRkcl90eXBlKQogewotCXN0cnVjdCBtZ210X2V2X2Nvbm5lY3RlZCBldjsKKwlzdHJ1Y3QgbWdtdF9hZGRyX2luZm8gZXY7CiAKIAliYWNweSgmZXYuYmRhZGRyLCBiZGFkZHIpOwotCWV2LmxpbmtfdHlwZSA9IGxpbmtfdHlwZTsKKwlldi50eXBlID0gbGlua190b19tZ210KGxpbmtfdHlwZSwgYWRkcl90eXBlKTsKIAotCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfQ09OTkVDVEVELCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKKwlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX0NPTk5FQ1RFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgZGlzY29ubmVjdF9yc3Aoc3RydWN0IHBlbmRpbmdfY21kICpjbWQsIHZvaWQgKmRhdGEpCkBAIC0yMDgwLDYgKzI0MDQsNyBAQAogCXN0cnVjdCBtZ210X3JwX2Rpc2Nvbm5lY3QgcnA7CiAKIAliYWNweSgmcnAuYmRhZGRyLCAmY3AtPmJkYWRkcik7CisJcnAuc3RhdHVzID0gMDsKIAogCWNtZF9jb21wbGV0ZShjbWQtPnNrLCBjbWQtPmluZGV4LCBNR01UX09QX0RJU0NPTk5FQ1QsICZycCwgc2l6ZW9mKHJwKSk7CiAKQEAgLTIwODksNzUgKzI0MTQsMTEwIEBACiAJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwogfQogCi1pbnQgbWdtdF9kaXNjb25uZWN0ZWQodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyKQorc3RhdGljIHZvaWQgcmVtb3ZlX2tleXNfcnNwKHN0cnVjdCBwZW5kaW5nX2NtZCAqY21kLCB2b2lkICpkYXRhKQogewotCXN0cnVjdCBtZ210X2V2X2Rpc2Nvbm5lY3RlZCBldjsKKwl1OCAqc3RhdHVzID0gZGF0YTsKKwlzdHJ1Y3QgbWdtdF9jcF9yZW1vdmVfa2V5cyAqY3AgPSBjbWQtPnBhcmFtOworCXN0cnVjdCBtZ210X3JwX3JlbW92ZV9rZXlzIHJwOworCisJbWVtc2V0KCZycCwgMCwgc2l6ZW9mKHJwKSk7CisJYmFjcHkoJnJwLmJkYWRkciwgJmNwLT5iZGFkZHIpOworCWlmIChzdGF0dXMgIT0gTlVMTCkKKwkJcnAuc3RhdHVzID0gKnN0YXR1czsKKworCWNtZF9jb21wbGV0ZShjbWQtPnNrLCBjbWQtPmluZGV4LCBNR01UX09QX1JFTU9WRV9LRVlTLCAmcnAsCisJCQkJCQkJCXNpemVvZihycCkpOworCisJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOworfQorCitpbnQgbWdtdF9kaXNjb25uZWN0ZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsIHU4IGxpbmtfdHlwZSwKKwkJCQkJCQkJdTggYWRkcl90eXBlKQoreworCXN0cnVjdCBtZ210X2FkZHJfaW5mbyBldjsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBOVUxMOwogCWludCBlcnI7CiAKLQltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX0RJU0NPTk5FQ1QsIGluZGV4LCBkaXNjb25uZWN0X3JzcCwgJnNrKTsKKwltZ210X3BlbmRpbmdfZm9yZWFjaChNR01UX09QX0RJU0NPTk5FQ1QsIGhkZXYsIGRpc2Nvbm5lY3RfcnNwLCAmc2spOwogCiAJYmFjcHkoJmV2LmJkYWRkciwgYmRhZGRyKTsKKwlldi50eXBlID0gbGlua190b19tZ210KGxpbmtfdHlwZSwgYWRkcl90eXBlKTsKIAotCWVyciA9IG1nbXRfZXZlbnQoTUdNVF9FVl9ESVNDT05ORUNURUQsIGluZGV4LCAmZXYsIHNpemVvZihldiksIHNrKTsKKwllcnIgPSBtZ210X2V2ZW50KE1HTVRfRVZfRElTQ09OTkVDVEVELCBoZGV2LCAmZXYsIHNpemVvZihldiksIHNrKTsKIAogCWlmIChzaykKIAkJc29ja19wdXQoc2spOwogCisJbWdtdF9wZW5kaW5nX2ZvcmVhY2goTUdNVF9PUF9SRU1PVkVfS0VZUywgaGRldiwgcmVtb3ZlX2tleXNfcnNwLCBOVUxMKTsKKwogCXJldHVybiBlcnI7CiB9CiAKLWludCBtZ210X2Rpc2Nvbm5lY3RfZmFpbGVkKHUxNiBpbmRleCkKK2ludCBtZ210X2Rpc2Nvbm5lY3RfZmFpbGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBzdGF0dXMpCiB7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CisJdTggbWdtdF9lcnIgPSBtZ210X3N0YXR1cyhzdGF0dXMpOwogCWludCBlcnI7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX0RJU0NPTk5FQ1QsIGluZGV4KTsKKwljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX0RJU0NPTk5FQ1QsIGhkZXYpOwogCWlmICghY21kKQogCQlyZXR1cm4gLUVOT0VOVDsKIAotCWVyciA9IGNtZF9zdGF0dXMoY21kLT5zaywgaW5kZXgsIE1HTVRfT1BfRElTQ09OTkVDVCwgRUlPKTsKKwlpZiAoYmRhZGRyKSB7CisJCXN0cnVjdCBtZ210X3JwX2Rpc2Nvbm5lY3QgcnA7CisKKwkJYmFjcHkoJnJwLmJkYWRkciwgYmRhZGRyKTsKKwkJcnAuc3RhdHVzID0gc3RhdHVzOworCisJCWVyciA9IGNtZF9jb21wbGV0ZShjbWQtPnNrLCBjbWQtPmluZGV4LCBNR01UX09QX0RJU0NPTk5FQ1QsCisJCQkJCQkJJnJwLCBzaXplb2YocnApKTsKKwl9IGVsc2UKKwkJZXJyID0gY21kX3N0YXR1cyhjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9ESVNDT05ORUNULAorCQkJCQkJCQltZ210X2Vycik7CiAKIAltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbWdtdF9jb25uZWN0X2ZhaWxlZCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cykKK2ludCBtZ210X2Nvbm5lY3RfZmFpbGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBsaW5rX3R5cGUsCisJCQkJCQl1OCBhZGRyX3R5cGUsIHU4IHN0YXR1cykKIHsKIAlzdHJ1Y3QgbWdtdF9ldl9jb25uZWN0X2ZhaWxlZCBldjsKIAotCWJhY3B5KCZldi5iZGFkZHIsIGJkYWRkcik7Ci0JZXYuc3RhdHVzID0gc3RhdHVzOworCWJhY3B5KCZldi5hZGRyLmJkYWRkciwgYmRhZGRyKTsKKwlldi5hZGRyLnR5cGUgPSBsaW5rX3RvX21nbXQobGlua190eXBlLCBhZGRyX3R5cGUpOworCWV2LnN0YXR1cyA9IG1nbXRfc3RhdHVzKHN0YXR1cyk7CiAKLQlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX0NPTk5FQ1RfRkFJTEVELCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKKwlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX0NPTk5FQ1RfRkFJTEVELCBoZGV2LCAmZXYsIHNpemVvZihldiksIE5VTEwpOwogfQogCi1pbnQgbWdtdF9waW5fY29kZV9yZXF1ZXN0KHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc2VjdXJlKQoraW50IG1nbXRfcGluX2NvZGVfcmVxdWVzdChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgdTggc2VjdXJlKQogewogCXN0cnVjdCBtZ210X2V2X3Bpbl9jb2RlX3JlcXVlc3QgZXY7CiAKIAliYWNweSgmZXYuYmRhZGRyLCBiZGFkZHIpOwogCWV2LnNlY3VyZSA9IHNlY3VyZTsKIAotCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfUElOX0NPREVfUkVRVUVTVCwgaW5kZXgsICZldiwgc2l6ZW9mKGV2KSwKKwlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX1BJTl9DT0RFX1JFUVVFU1QsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwKIAkJCQkJCQkJCU5VTEwpOwogfQogCi1pbnQgbWdtdF9waW5fY29kZV9yZXBseV9jb21wbGV0ZSh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cykKK2ludCBtZ210X3Bpbl9jb2RlX3JlcGx5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLAorCQkJCQkJCQl1OCBzdGF0dXMpCiB7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IG1nbXRfcnBfcGluX2NvZGVfcmVwbHkgcnA7CiAJaW50IGVycjsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfUElOX0NPREVfUkVQTFksIGluZGV4KTsKKwljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1BJTl9DT0RFX1JFUExZLCBoZGV2KTsKIAlpZiAoIWNtZCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAliYWNweSgmcnAuYmRhZGRyLCBiZGFkZHIpOwotCXJwLnN0YXR1cyA9IHN0YXR1czsKKwlycC5zdGF0dXMgPSBtZ210X3N0YXR1cyhzdGF0dXMpOwogCi0JZXJyID0gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGluZGV4LCBNR01UX09QX1BJTl9DT0RFX1JFUExZLCAmcnAsCisJZXJyID0gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1BJTl9DT0RFX1JFUExZLCAmcnAsCiAJCQkJCQkJCXNpemVvZihycCkpOwogCiAJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOwpAQCAtMjE2NSwyMCArMjUyNSwyMSBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBtZ210X3Bpbl9jb2RlX25lZ19yZXBseV9jb21wbGV0ZSh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cykKK2ludCBtZ210X3Bpbl9jb2RlX25lZ19yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwKKwkJCQkJCQkJdTggc3RhdHVzKQogewogCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBtZ210X3JwX3Bpbl9jb2RlX3JlcGx5IHJwOwogCWludCBlcnI7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1BJTl9DT0RFX05FR19SRVBMWSwgaW5kZXgpOworCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfUElOX0NPREVfTkVHX1JFUExZLCBoZGV2KTsKIAlpZiAoIWNtZCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAliYWNweSgmcnAuYmRhZGRyLCBiZGFkZHIpOwotCXJwLnN0YXR1cyA9IHN0YXR1czsKKwlycC5zdGF0dXMgPSBtZ210X3N0YXR1cyhzdGF0dXMpOwogCi0JZXJyID0gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGluZGV4LCBNR01UX09QX1BJTl9DT0RFX05FR19SRVBMWSwgJnJwLAorCWVyciA9IGNtZF9jb21wbGV0ZShjbWQtPnNrLCBoZGV2LT5pZCwgTUdNVF9PUF9QSU5fQ09ERV9ORUdfUkVQTFksICZycCwKIAkJCQkJCQkJc2l6ZW9mKHJwKSk7CiAKIAltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CkBAIC0yMTg2LDk3ICsyNTQ3LDExOSBAQAogCXJldHVybiBlcnI7CiB9CiAKLWludCBtZ210X3VzZXJfY29uZmlybV9yZXF1ZXN0KHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgX19sZTMyIHZhbHVlLAotCQkJCQkJCXU4IGNvbmZpcm1faGludCkKK2ludCBtZ210X3VzZXJfY29uZmlybV9yZXF1ZXN0KHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLAorCQkJCQkJX19sZTMyIHZhbHVlLCB1OCBjb25maXJtX2hpbnQpCiB7CiAJc3RydWN0IG1nbXRfZXZfdXNlcl9jb25maXJtX3JlcXVlc3QgZXY7CiAKLQlCVF9EQkcoImhjaSV1IiwgaW5kZXgpOworCUJUX0RCRygiJXMiLCBoZGV2LT5uYW1lKTsKIAogCWJhY3B5KCZldi5iZGFkZHIsIGJkYWRkcik7CiAJZXYuY29uZmlybV9oaW50ID0gY29uZmlybV9oaW50OwogCXB1dF91bmFsaWduZWRfbGUzMih2YWx1ZSwgJmV2LnZhbHVlKTsKIAotCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfVVNFUl9DT05GSVJNX1JFUVVFU1QsIGluZGV4LCAmZXYsIHNpemVvZihldiksCisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9VU0VSX0NPTkZJUk1fUkVRVUVTVCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLAogCQkJCQkJCQkJTlVMTCk7CiB9CiAKLXN0YXRpYyBpbnQgY29uZmlybV9yZXBseV9jb21wbGV0ZSh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cywKLQkJCQkJCQkJdTggb3Bjb2RlKQoraW50IG1nbXRfdXNlcl9wYXNza2V5X3JlcXVlc3Qoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIpCit7CisJc3RydWN0IG1nbXRfZXZfdXNlcl9wYXNza2V5X3JlcXVlc3QgZXY7CisKKwlCVF9EQkcoIiVzIiwgaGRldi0+bmFtZSk7CisKKwliYWNweSgmZXYuYmRhZGRyLCBiZGFkZHIpOworCisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9VU0VSX1BBU1NLRVlfUkVRVUVTVCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLAorCQkJCQkJCQkJTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgdXNlcl9wYWlyaW5nX3Jlc3BfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsCisJCQkJCQkJdTggc3RhdHVzLCB1OCBvcGNvZGUpCiB7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJc3RydWN0IG1nbXRfcnBfdXNlcl9jb25maXJtX3JlcGx5IHJwOwogCWludCBlcnI7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChvcGNvZGUsIGluZGV4KTsKKwljbWQgPSBtZ210X3BlbmRpbmdfZmluZChvcGNvZGUsIGhkZXYpOwogCWlmICghY21kKQogCQlyZXR1cm4gLUVOT0VOVDsKIAogCWJhY3B5KCZycC5iZGFkZHIsIGJkYWRkcik7Ci0JcnAuc3RhdHVzID0gc3RhdHVzOwotCWVyciA9IGNtZF9jb21wbGV0ZShjbWQtPnNrLCBpbmRleCwgb3Bjb2RlLCAmcnAsIHNpemVvZihycCkpOworCXJwLnN0YXR1cyA9IG1nbXRfc3RhdHVzKHN0YXR1cyk7CisJZXJyID0gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGhkZXYtPmlkLCBvcGNvZGUsICZycCwgc2l6ZW9mKHJwKSk7CiAKIAltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbWdtdF91c2VyX2NvbmZpcm1fcmVwbHlfY29tcGxldGUodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBzdGF0dXMpCitpbnQgbWdtdF91c2VyX2NvbmZpcm1fcmVwbHlfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIGJkYWRkcl90ICpiZGFkZHIsCisJCQkJCQkJCXU4IHN0YXR1cykKIHsKLQlyZXR1cm4gY29uZmlybV9yZXBseV9jb21wbGV0ZShpbmRleCwgYmRhZGRyLCBzdGF0dXMsCisJcmV0dXJuIHVzZXJfcGFpcmluZ19yZXNwX2NvbXBsZXRlKGhkZXYsIGJkYWRkciwgc3RhdHVzLAogCQkJCQkJTUdNVF9PUF9VU0VSX0NPTkZJUk1fUkVQTFkpOwogfQogCi1pbnQgbWdtdF91c2VyX2NvbmZpcm1fbmVnX3JlcGx5X2NvbXBsZXRlKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggc3RhdHVzKQoraW50IG1nbXRfdXNlcl9jb25maXJtX25lZ19yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJCWJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cykKIHsKLQlyZXR1cm4gY29uZmlybV9yZXBseV9jb21wbGV0ZShpbmRleCwgYmRhZGRyLCBzdGF0dXMsCisJcmV0dXJuIHVzZXJfcGFpcmluZ19yZXNwX2NvbXBsZXRlKGhkZXYsIGJkYWRkciwgc3RhdHVzLAogCQkJCQlNR01UX09QX1VTRVJfQ09ORklSTV9ORUdfUkVQTFkpOwogfQogCi1pbnQgbWdtdF9hdXRoX2ZhaWxlZCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cykKK2ludCBtZ210X3VzZXJfcGFzc2tleV9yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwKKwkJCQkJCQkJdTggc3RhdHVzKQoreworCXJldHVybiB1c2VyX3BhaXJpbmdfcmVzcF9jb21wbGV0ZShoZGV2LCBiZGFkZHIsIHN0YXR1cywKKwkJCQkJCU1HTVRfT1BfVVNFUl9QQVNTS0VZX1JFUExZKTsKK30KKworaW50IG1nbXRfdXNlcl9wYXNza2V5X25lZ19yZXBseV9jb21wbGV0ZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwKKwkJCQkJCWJkYWRkcl90ICpiZGFkZHIsIHU4IHN0YXR1cykKK3sKKwlyZXR1cm4gdXNlcl9wYWlyaW5nX3Jlc3BfY29tcGxldGUoaGRldiwgYmRhZGRyLCBzdGF0dXMsCisJCQkJCU1HTVRfT1BfVVNFUl9QQVNTS0VZX05FR19SRVBMWSk7Cit9CisKK2ludCBtZ210X2F1dGhfZmFpbGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBzdGF0dXMpCiB7CiAJc3RydWN0IG1nbXRfZXZfYXV0aF9mYWlsZWQgZXY7CiAKIAliYWNweSgmZXYuYmRhZGRyLCBiZGFkZHIpOwotCWV2LnN0YXR1cyA9IHN0YXR1czsKKwlldi5zdGF0dXMgPSBtZ210X3N0YXR1cyhzdGF0dXMpOwogCi0JcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9BVVRIX0ZBSUxFRCwgaW5kZXgsICZldiwgc2l6ZW9mKGV2KSwgTlVMTCk7CisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9BVVRIX0ZBSUxFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLCBOVUxMKTsKIH0KIAotaW50IG1nbXRfc2V0X2xvY2FsX25hbWVfY29tcGxldGUodTE2IGluZGV4LCB1OCAqbmFtZSwgdTggc3RhdHVzKQoraW50IG1nbXRfc2V0X2xvY2FsX25hbWVfY29tcGxldGUoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4ICpuYW1lLCB1OCBzdGF0dXMpCiB7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7Ci0Jc3RydWN0IGhjaV9kZXYgKmhkZXY7CiAJc3RydWN0IG1nbXRfY3Bfc2V0X2xvY2FsX25hbWUgZXY7CiAJaW50IGVycjsKIAogCW1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOwogCW1lbWNweShldi5uYW1lLCBuYW1lLCBIQ0lfTUFYX05BTUVfTEVOR1RIKTsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfU0VUX0xPQ0FMX05BTUUsIGluZGV4KTsKKwljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NFVF9MT0NBTF9OQU1FLCBoZGV2KTsKIAlpZiAoIWNtZCkKIAkJZ290byBzZW5kX2V2ZW50OwogCiAJaWYgKHN0YXR1cykgewotCQllcnIgPSBjbWRfc3RhdHVzKGNtZC0+c2ssIGluZGV4LCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLCBFSU8pOworCQllcnIgPSBjbWRfc3RhdHVzKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLAorCQkJCQkJCW1nbXRfc3RhdHVzKHN0YXR1cykpOwogCQlnb3RvIGZhaWxlZDsKIAl9CiAKLQloZGV2ID0gaGNpX2Rldl9nZXQoaW5kZXgpOwotCWlmIChoZGV2KSB7Ci0JCWhjaV9kZXZfbG9ja19iaChoZGV2KTsKLQkJdXBkYXRlX2VpcihoZGV2KTsKLQkJaGNpX2Rldl91bmxvY2tfYmgoaGRldik7Ci0JCWhjaV9kZXZfcHV0KGhkZXYpOwotCX0KKwl1cGRhdGVfZWlyKGhkZXYpOwogCi0JZXJyID0gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGluZGV4LCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLCAmZXYsCisJZXJyID0gY21kX2NvbXBsZXRlKGNtZC0+c2ssIGhkZXYtPmlkLCBNR01UX09QX1NFVF9MT0NBTF9OQU1FLCAmZXYsCiAJCQkJCQkJCXNpemVvZihldikpOwogCWlmIChlcnIgPCAwKQogCQlnb3RvIGZhaWxlZDsKIAogc2VuZF9ldmVudDoKLQllcnIgPSBtZ210X2V2ZW50KE1HTVRfRVZfTE9DQUxfTkFNRV9DSEFOR0VELCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLAorCWVyciA9IG1nbXRfZXZlbnQoTUdNVF9FVl9MT0NBTF9OQU1FX0NIQU5HRUQsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwKIAkJCQkJCQljbWQgPyBjbWQtPnNrIDogTlVMTCk7CiAKIGZhaWxlZDoKQEAgLTIyODUsMjkgKzI2NjgsMzEgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbWdtdF9yZWFkX2xvY2FsX29vYl9kYXRhX3JlcGx5X2NvbXBsZXRlKHUxNiBpbmRleCwgdTggKmhhc2gsIHU4ICpyYW5kb21pemVyLAotCQkJCQkJCQl1OCBzdGF0dXMpCitpbnQgbWdtdF9yZWFkX2xvY2FsX29vYl9kYXRhX3JlcGx5X2NvbXBsZXRlKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCAqaGFzaCwKKwkJCQkJCXU4ICpyYW5kb21pemVyLCB1OCBzdGF0dXMpCiB7CiAJc3RydWN0IHBlbmRpbmdfY21kICpjbWQ7CiAJaW50IGVycjsKIAotCUJUX0RCRygiaGNpJXUgc3RhdHVzICV1IiwgaW5kZXgsIHN0YXR1cyk7CisJQlRfREJHKCIlcyBzdGF0dXMgJXUiLCBoZGV2LT5uYW1lLCBzdGF0dXMpOwogCi0JY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLCBpbmRleCk7CisJY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9SRUFEX0xPQ0FMX09PQl9EQVRBLCBoZGV2KTsKIAlpZiAoIWNtZCkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlpZiAoc3RhdHVzKSB7Ci0JCWVyciA9IGNtZF9zdGF0dXMoY21kLT5zaywgaW5kZXgsIE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwKLQkJCQkJCQkJCUVJTyk7CisJCWVyciA9IGNtZF9zdGF0dXMoY21kLT5zaywgaGRldi0+aWQsCisJCQkJCQlNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCisJCQkJCQltZ210X3N0YXR1cyhzdGF0dXMpKTsKIAl9IGVsc2UgewogCQlzdHJ1Y3QgbWdtdF9ycF9yZWFkX2xvY2FsX29vYl9kYXRhIHJwOwogCiAJCW1lbWNweShycC5oYXNoLCBoYXNoLCBzaXplb2YocnAuaGFzaCkpOwogCQltZW1jcHkocnAucmFuZG9taXplciwgcmFuZG9taXplciwgc2l6ZW9mKHJwLnJhbmRvbWl6ZXIpKTsKIAotCQllcnIgPSBjbWRfY29tcGxldGUoY21kLT5zaywgaW5kZXgsIE1HTVRfT1BfUkVBRF9MT0NBTF9PT0JfREFUQSwKLQkJCQkJCQkmcnAsIHNpemVvZihycCkpOworCQllcnIgPSBjbWRfY29tcGxldGUoY21kLT5zaywgaGRldi0+aWQsCisJCQkJCQlNR01UX09QX1JFQURfTE9DQUxfT09CX0RBVEEsCisJCQkJCQkmcnAsIHNpemVvZihycCkpOwogCX0KIAogCW1nbXRfcGVuZGluZ19yZW1vdmUoY21kKTsKQEAgLTIzMTUsMTQgKzI3MDAsMTUgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgbWdtdF9kZXZpY2VfZm91bmQodTE2IGluZGV4LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCAqZGV2X2NsYXNzLCBzOCByc3NpLAotCQkJCQkJCQl1OCAqZWlyKQoraW50IG1nbXRfZGV2aWNlX2ZvdW5kKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyLCB1OCBsaW5rX3R5cGUsCisJCQkJdTggYWRkcl90eXBlLCB1OCAqZGV2X2NsYXNzLCBzOCByc3NpLCB1OCAqZWlyKQogewogCXN0cnVjdCBtZ210X2V2X2RldmljZV9mb3VuZCBldjsKIAogCW1lbXNldCgmZXYsIDAsIHNpemVvZihldikpOwogCi0JYmFjcHkoJmV2LmJkYWRkciwgYmRhZGRyKTsKKwliYWNweSgmZXYuYWRkci5iZGFkZHIsIGJkYWRkcik7CisJZXYuYWRkci50eXBlID0gbGlua190b19tZ210KGxpbmtfdHlwZSwgYWRkcl90eXBlKTsKIAlldi5yc3NpID0gcnNzaTsKIAogCWlmIChlaXIpCkBAIC0yMzMxLDEwICsyNzE3LDEwIEBACiAJaWYgKGRldl9jbGFzcykKIAkJbWVtY3B5KGV2LmRldl9jbGFzcywgZGV2X2NsYXNzLCBzaXplb2YoZXYuZGV2X2NsYXNzKSk7CiAKLQlyZXR1cm4gbWdtdF9ldmVudChNR01UX0VWX0RFVklDRV9GT1VORCwgaW5kZXgsICZldiwgc2l6ZW9mKGV2KSwgTlVMTCk7CisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9ERVZJQ0VfRk9VTkQsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwgTlVMTCk7CiB9CiAKLWludCBtZ210X3JlbW90ZV9uYW1lKHUxNiBpbmRleCwgYmRhZGRyX3QgKmJkYWRkciwgdTggKm5hbWUpCitpbnQgbWdtdF9yZW1vdGVfbmFtZShzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgdTggKm5hbWUpCiB7CiAJc3RydWN0IG1nbXRfZXZfcmVtb3RlX25hbWUgZXY7CiAKQEAgLTIzNDMsMzcgKzI3MjksNzkgQEAKIAliYWNweSgmZXYuYmRhZGRyLCBiZGFkZHIpOwogCW1lbWNweShldi5uYW1lLCBuYW1lLCBIQ0lfTUFYX05BTUVfTEVOR1RIKTsKIAotCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfUkVNT1RFX05BTUUsIGluZGV4LCAmZXYsIHNpemVvZihldiksIE5VTEwpOworCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfUkVNT1RFX05BTUUsIGhkZXYsICZldiwgc2l6ZW9mKGV2KSwgTlVMTCk7CiB9CiAKLWludCBtZ210X2Rpc2NvdmVyaW5nKHUxNiBpbmRleCwgdTggZGlzY292ZXJpbmcpCitpbnQgbWdtdF9zdGFydF9kaXNjb3ZlcnlfZmFpbGVkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCB1OCBzdGF0dXMpCiB7Ci0JcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9ESVNDT1ZFUklORywgaW5kZXgsICZkaXNjb3ZlcmluZywKKwlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlpbnQgZXJyOworCisJY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TVEFSVF9ESVNDT1ZFUlksIGhkZXYpOworCWlmICghY21kKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWVyciA9IGNtZF9zdGF0dXMoY21kLT5zaywgaGRldi0+aWQsIGNtZC0+b3Bjb2RlLCBtZ210X3N0YXR1cyhzdGF0dXMpKTsKKwltZ210X3BlbmRpbmdfcmVtb3ZlKGNtZCk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgbWdtdF9zdG9wX2Rpc2NvdmVyeV9mYWlsZWQoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IHN0YXR1cykKK3sKKwlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKKwlpbnQgZXJyOworCisJY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9TVE9QX0RJU0NPVkVSWSwgaGRldik7CisJaWYgKCFjbWQpCisJCXJldHVybiAtRU5PRU5UOworCisJZXJyID0gY21kX3N0YXR1cyhjbWQtPnNrLCBoZGV2LT5pZCwgY21kLT5vcGNvZGUsIHN0YXR1cyk7CisJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IG1nbXRfZGlzY292ZXJpbmcoc3RydWN0IGhjaV9kZXYgKmhkZXYsIHU4IGRpc2NvdmVyaW5nKQoreworCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOworCisJaWYgKGRpc2NvdmVyaW5nKQorCQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NUQVJUX0RJU0NPVkVSWSwgaGRldik7CisJZWxzZQorCQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1NUT1BfRElTQ09WRVJZLCBoZGV2KTsKKworCWlmIChjbWQgIT0gTlVMTCkgeworCQljbWRfY29tcGxldGUoY21kLT5zaywgaGRldi0+aWQsIGNtZC0+b3Bjb2RlLCBOVUxMLCAwKTsKKwkJbWdtdF9wZW5kaW5nX3JlbW92ZShjbWQpOworCX0KKworCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfRElTQ09WRVJJTkcsIGhkZXYsICZkaXNjb3ZlcmluZywKIAkJCQkJCXNpemVvZihkaXNjb3ZlcmluZyksIE5VTEwpOwogfQogCi1pbnQgbWdtdF9kZXZpY2VfYmxvY2tlZCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIpCitpbnQgbWdtdF9kZXZpY2VfYmxvY2tlZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcikKIHsKIAlzdHJ1Y3QgcGVuZGluZ19jbWQgKmNtZDsKIAlzdHJ1Y3QgbWdtdF9ldl9kZXZpY2VfYmxvY2tlZCBldjsKIAotCWNtZCA9IG1nbXRfcGVuZGluZ19maW5kKE1HTVRfT1BfQkxPQ0tfREVWSUNFLCBpbmRleCk7CisJY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9CTE9DS19ERVZJQ0UsIGhkZXYpOwogCiAJYmFjcHkoJmV2LmJkYWRkciwgYmRhZGRyKTsKIAotCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfREVWSUNFX0JMT0NLRUQsIGluZGV4LCAmZXYsIHNpemVvZihldiksCi0JCQkJCQljbWQgPyBjbWQtPnNrIDogTlVMTCk7CisJcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9ERVZJQ0VfQkxPQ0tFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLAorCQkJCQkJCWNtZCA/IGNtZC0+c2sgOiBOVUxMKTsKIH0KIAotaW50IG1nbXRfZGV2aWNlX3VuYmxvY2tlZCh1MTYgaW5kZXgsIGJkYWRkcl90ICpiZGFkZHIpCitpbnQgbWdtdF9kZXZpY2VfdW5ibG9ja2VkKHN0cnVjdCBoY2lfZGV2ICpoZGV2LCBiZGFkZHJfdCAqYmRhZGRyKQogewogCXN0cnVjdCBwZW5kaW5nX2NtZCAqY21kOwogCXN0cnVjdCBtZ210X2V2X2RldmljZV91bmJsb2NrZWQgZXY7CiAKLQljbWQgPSBtZ210X3BlbmRpbmdfZmluZChNR01UX09QX1VOQkxPQ0tfREVWSUNFLCBpbmRleCk7CisJY21kID0gbWdtdF9wZW5kaW5nX2ZpbmQoTUdNVF9PUF9VTkJMT0NLX0RFVklDRSwgaGRldik7CiAKIAliYWNweSgmZXYuYmRhZGRyLCBiZGFkZHIpOwogCi0JcmV0dXJuIG1nbXRfZXZlbnQoTUdNVF9FVl9ERVZJQ0VfVU5CTE9DS0VELCBpbmRleCwgJmV2LCBzaXplb2YoZXYpLAotCQkJCQkJY21kID8gY21kLT5zayA6IE5VTEwpOworCXJldHVybiBtZ210X2V2ZW50KE1HTVRfRVZfREVWSUNFX1VOQkxPQ0tFRCwgaGRldiwgJmV2LCBzaXplb2YoZXYpLAorCQkJCQkJCWNtZCA/IGNtZC0+c2sgOiBOVUxMKTsKIH0KZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL0tjb25maWcgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9LY29uZmlnCmluZGV4IDQwNWEwZTYuLjIyZTcxOGIgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvcmZjb21tL0tjb25maWcKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBCVF9SRkNPTU0KIAl0cmlzdGF0ZSAiUkZDT01NIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBCVCAmJiBCVF9MMkNBUAorCWRlcGVuZHMgb24gQlQKIAloZWxwCiAJICBSRkNPTU0gcHJvdmlkZXMgY29ubmVjdGlvbiBvcmllbnRlZCBzdHJlYW0gdHJhbnNwb3J0LiAgUkZDT01NCiAJICBzdXBwb3J0IGlzIHJlcXVpcmVkIGZvciBEaWFsdXAgTmV0d29ya2luZywgT0JFWCBhbmQgb3RoZXIgQmx1ZXRvb3RoCmRpZmYgLS1naXQgYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS9jb3JlLmMKaW5kZXggNGUzMmUxOC4uNTAxNjQ5YiAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vY29yZS5jCisrKyBiL25ldC9ibHVldG9vdGgvcmZjb21tL2NvcmUuYwpAQCAtNTEsOCArNTEsOCBAQAogCiAjZGVmaW5lIFZFUlNJT04gIjEuMTEiCiAKLXN0YXRpYyBpbnQgZGlzYWJsZV9jZmM7Ci1zdGF0aWMgaW50IGwyY2FwX2VydG07CitzdGF0aWMgYm9vbCBkaXNhYmxlX2NmYzsKK3N0YXRpYyBib29sIGwyY2FwX2VydG07CiBzdGF0aWMgaW50IGNoYW5uZWxfbXR1ID0gLTE7CiBzdGF0aWMgdW5zaWduZWQgaW50IGwyY2FwX210dSA9IFJGQ09NTV9NQVhfTDJDQVBfTVRVOwogCkBAIC0zNzcsMTMgKzM3NywxMSBAQAogc3RhdGljIHN0cnVjdCByZmNvbW1fZGxjICpyZmNvbW1fZGxjX2dldChzdHJ1Y3QgcmZjb21tX3Nlc3Npb24gKnMsIHU4IGRsY2kpCiB7CiAJc3RydWN0IHJmY29tbV9kbGMgKmQ7Ci0Jc3RydWN0IGxpc3RfaGVhZCAqcDsKIAotCWxpc3RfZm9yX2VhY2gocCwgJnMtPmRsY3MpIHsKLQkJZCA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kbGMsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJnMtPmRsY3MsIGxpc3QpCiAJCWlmIChkLT5kbGNpID09IGRsY2kpCiAJCQlyZXR1cm4gZDsKLQl9CisKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtNzUxLDcgKzc0OSw2IEBACiAvKiAtLS0tIFJGQ09NTSBmcmFtZSBzZW5kaW5nIC0tLS0gKi8KIHN0YXRpYyBpbnQgcmZjb21tX3NlbmRfZnJhbWUoc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCAqZGF0YSwgaW50IGxlbikKIHsKLQlzdHJ1Y3Qgc29ja2V0ICpzb2NrID0gcy0+c29jazsKIAlzdHJ1Y3Qga3ZlYyBpdiA9IHsgZGF0YSwgbGVuIH07CiAJc3RydWN0IG1zZ2hkciBtc2c7CiAKQEAgLTc1OSw3ICs3NTYsMTQgQEAKIAogCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CiAKLQlyZXR1cm4ga2VybmVsX3NlbmRtc2coc29jaywgJm1zZywgJml2LCAxLCBsZW4pOworCXJldHVybiBrZXJuZWxfc2VuZG1zZyhzLT5zb2NrLCAmbXNnLCAmaXYsIDEsIGxlbik7Cit9CisKK3N0YXRpYyBpbnQgcmZjb21tX3NlbmRfY21kKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgc3RydWN0IHJmY29tbV9jbWQgKmNtZCkKK3sKKwlCVF9EQkcoIiVwIGNtZCAldSIsIHMsIGNtZC0+Y3RybCk7CisKKwlyZXR1cm4gcmZjb21tX3NlbmRfZnJhbWUocywgKHZvaWQgKikgY21kLCBzaXplb2YoKmNtZCkpOwogfQogCiBzdGF0aWMgaW50IHJmY29tbV9zZW5kX3NhYm0oc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCB1OCBkbGNpKQpAQCAtNzczLDcgKzc3Nyw3IEBACiAJY21kLmxlbiAgPSBfX2xlbjgoMCk7CiAJY21kLmZjcyAgPSBfX2ZjczIoKHU4ICopICZjbWQpOwogCi0JcmV0dXJuIHJmY29tbV9zZW5kX2ZyYW1lKHMsICh2b2lkICopICZjbWQsIHNpemVvZihjbWQpKTsKKwlyZXR1cm4gcmZjb21tX3NlbmRfY21kKHMsICZjbWQpOwogfQogCiBzdGF0aWMgaW50IHJmY29tbV9zZW5kX3VhKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggZGxjaSkKQEAgLTc4Nyw3ICs3OTEsNyBAQAogCWNtZC5sZW4gID0gX19sZW44KDApOwogCWNtZC5mY3MgID0gX19mY3MyKCh1OCAqKSAmY21kKTsKIAotCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCAodm9pZCAqKSAmY21kLCBzaXplb2YoY21kKSk7CisJcmV0dXJuIHJmY29tbV9zZW5kX2NtZChzLCAmY21kKTsKIH0KIAogc3RhdGljIGludCByZmNvbW1fc2VuZF9kaXNjKHN0cnVjdCByZmNvbW1fc2Vzc2lvbiAqcywgdTggZGxjaSkKQEAgLTgwMSw3ICs4MDUsNyBAQAogCWNtZC5sZW4gID0gX19sZW44KDApOwogCWNtZC5mY3MgID0gX19mY3MyKCh1OCAqKSAmY21kKTsKIAotCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCAodm9pZCAqKSAmY21kLCBzaXplb2YoY21kKSk7CisJcmV0dXJuIHJmY29tbV9zZW5kX2NtZChzLCAmY21kKTsKIH0KIAogc3RhdGljIGludCByZmNvbW1fcXVldWVfZGlzYyhzdHJ1Y3QgcmZjb21tX2RsYyAqZCkKQEAgLTgzNyw3ICs4NDEsNyBAQAogCWNtZC5sZW4gID0gX19sZW44KDApOwogCWNtZC5mY3MgID0gX19mY3MyKCh1OCAqKSAmY21kKTsKIAotCXJldHVybiByZmNvbW1fc2VuZF9mcmFtZShzLCAodm9pZCAqKSAmY21kLCBzaXplb2YoY21kKSk7CisJcmV0dXJuIHJmY29tbV9zZW5kX2NtZChzLCAmY21kKTsKIH0KIAogc3RhdGljIGludCByZmNvbW1fc2VuZF9uc2Moc3RydWN0IHJmY29tbV9zZXNzaW9uICpzLCBpbnQgY3IsIHU4IHR5cGUpCkBAIC0xMTQ2LDYgKzExNTAsNyBAQAogCQkJaWYgKGxpc3RfZW1wdHkoJnMtPmRsY3MpKSB7CiAJCQkJcy0+c3RhdGUgPSBCVF9ESVNDT05OOwogCQkJCXJmY29tbV9zZW5kX2Rpc2MocywgMCk7CisJCQkJcmZjb21tX3Nlc3Npb25fY2xlYXJfdGltZXIocyk7CiAJCQl9CiAKIAkJCWJyZWFrOwpAQCAtMjEyMCwxNSArMjEyNSwxMyBAQAogc3RhdGljIGludCByZmNvbW1fZGxjX2RlYnVnZnNfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKmYsIHZvaWQgKngpCiB7CiAJc3RydWN0IHJmY29tbV9zZXNzaW9uICpzOwotCXN0cnVjdCBsaXN0X2hlYWQgKnBwLCAqcDsKIAogCXJmY29tbV9sb2NrKCk7CiAKLQlsaXN0X2Zvcl9lYWNoKHAsICZzZXNzaW9uX2xpc3QpIHsKLQkJcyA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9zZXNzaW9uLCBsaXN0KTsKLQkJbGlzdF9mb3JfZWFjaChwcCwgJnMtPmRsY3MpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHMsICZzZXNzaW9uX2xpc3QsIGxpc3QpIHsKKwkJc3RydWN0IHJmY29tbV9kbGMgKmQ7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZCwgJnMtPmRsY3MsIGxpc3QpIHsKIAkJCXN0cnVjdCBzb2NrICpzayA9IHMtPnNvY2stPnNrOwotCQkJc3RydWN0IHJmY29tbV9kbGMgKmQgPSBsaXN0X2VudHJ5KHBwLCBzdHJ1Y3QgcmZjb21tX2RsYywgbGlzdCk7CiAKIAkJCXNlcV9wcmludGYoZiwgIiVzICVzICVsZCAlZCAlZCAlZCAlZFxuIiwKIAkJCQkJCWJhdG9zdHIoJmJ0X3NrKHNrKS0+c3JjKSwKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYyBiL25ldC9ibHVldG9vdGgvcmZjb21tL3NvY2suYwppbmRleCA1NDE3ZjYxLi5hZWEyYmRkIDEwMDY0NAotLS0gYS9uZXQvYmx1ZXRvb3RoL3JmY29tbS9zb2NrLmMKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vc29jay5jCkBAIC02MDAsNiArNjAwLDggQEAKIAkJCWJyZWFrOwogCQl9CiAKKwkJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKKwogCQllcnIgPSByZmNvbW1fZGxjX3NlbmQoZCwgc2tiKTsKIAkJaWYgKGVyciA8IDApIHsKIAkJCWtmcmVlX3NrYihza2IpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMgYi9uZXQvYmx1ZXRvb3RoL3JmY29tbS90dHkuYwppbmRleCBjMjU4Nzk2Li5mYThmNGRlNSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMKKysrIGIvbmV0L2JsdWV0b290aC9yZmNvbW0vdHR5LmMKQEAgLTM0LDYgKzM0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogCiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9ibHVldG9vdGguaD4KICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL2hjaV9jb3JlLmg+CkBAIC02NSw3ICs2Niw3IEBACiAJc3RydWN0IHJmY29tbV9kbGMJKmRsYzsKIAlzdHJ1Y3QgdHR5X3N0cnVjdAkqdHR5OwogCXdhaXRfcXVldWVfaGVhZF90ICAgICAgIHdhaXQ7Ci0Jc3RydWN0IHRhc2tsZXRfc3RydWN0ICAgd2FrZXVwX3Rhc2s7CisJc3RydWN0IHdvcmtfc3RydWN0CXdha2V1cF90YXNrOwogCiAJc3RydWN0IGRldmljZQkJKnR0eV9kZXY7CiAKQEAgLTgxLDcgKzgyLDcgQEAKIHN0YXRpYyB2b2lkIHJmY29tbV9kZXZfc3RhdGVfY2hhbmdlKHN0cnVjdCByZmNvbW1fZGxjICpkbGMsIGludCBlcnIpOwogc3RhdGljIHZvaWQgcmZjb21tX2Rldl9tb2RlbV9zdGF0dXMoc3RydWN0IHJmY29tbV9kbGMgKmRsYywgdTggdjI0X3NpZyk7CiAKLXN0YXRpYyB2b2lkIHJmY29tbV90dHlfd2FrZXVwKHVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyB2b2lkIHJmY29tbV90dHlfd2FrZXVwKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIC8qIC0tLS0gRGV2aWNlIGZ1bmN0aW9ucyAtLS0tICovCiBzdGF0aWMgdm9pZCByZmNvbW1fZGV2X2Rlc3RydWN0KHN0cnVjdCByZmNvbW1fZGV2ICpkZXYpCkBAIC0xMzMsMTMgKzEzNCwxMCBAQAogc3RhdGljIHN0cnVjdCByZmNvbW1fZGV2ICpfX3JmY29tbV9kZXZfZ2V0KGludCBpZCkKIHsKIAlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OwotCXN0cnVjdCBsaXN0X2hlYWQgICpwOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmcmZjb21tX2Rldl9saXN0KSB7Ci0JCWRldiA9IGxpc3RfZW50cnkocCwgc3RydWN0IHJmY29tbV9kZXYsIGxpc3QpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoZGV2LCAmcmZjb21tX2Rldl9saXN0LCBsaXN0KQogCQlpZiAoZGV2LT5pZCA9PSBpZCkKIAkJCXJldHVybiBkZXY7Ci0JfQogCiAJcmV0dXJuIE5VTEw7CiB9CkBAIC0xOTcsNyArMTk1LDcgQEAKIAogc3RhdGljIGludCByZmNvbW1fZGV2X2FkZChzdHJ1Y3QgcmZjb21tX2Rldl9yZXEgKnJlcSwgc3RydWN0IHJmY29tbV9kbGMgKmRsYykKIHsKLQlzdHJ1Y3QgcmZjb21tX2RldiAqZGV2OworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYsICplbnRyeTsKIAlzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJnJmY29tbV9kZXZfbGlzdCwgKnA7CiAJaW50IGVyciA9IDA7CiAKQEAgLTIxMiw4ICsyMTAsOCBAQAogCWlmIChyZXEtPmRldl9pZCA8IDApIHsKIAkJZGV2LT5pZCA9IDA7CiAKLQkJbGlzdF9mb3JfZWFjaChwLCAmcmZjb21tX2Rldl9saXN0KSB7Ci0JCQlpZiAobGlzdF9lbnRyeShwLCBzdHJ1Y3QgcmZjb21tX2RldiwgbGlzdCktPmlkICE9IGRldi0+aWQpCisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZyZmNvbW1fZGV2X2xpc3QsIGxpc3QpIHsKKwkJCWlmIChlbnRyeS0+aWQgIT0gZGV2LT5pZCkKIAkJCQlicmVhazsKIAogCQkJZGV2LT5pZCsrOwpAQCAtMjIyLDkgKzIyMCw3IEBACiAJfSBlbHNlIHsKIAkJZGV2LT5pZCA9IHJlcS0+ZGV2X2lkOwogCi0JCWxpc3RfZm9yX2VhY2gocCwgJnJmY29tbV9kZXZfbGlzdCkgewotCQkJc3RydWN0IHJmY29tbV9kZXYgKmVudHJ5ID0gbGlzdF9lbnRyeShwLCBzdHJ1Y3QgcmZjb21tX2RldiwgbGlzdCk7Ci0KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJnJmY29tbV9kZXZfbGlzdCwgbGlzdCkgewogCQkJaWYgKGVudHJ5LT5pZCA9PSBkZXYtPmlkKSB7CiAJCQkJZXJyID0gLUVBRERSSU5VU0U7CiAJCQkJZ290byBvdXQ7CkBAIC0yNTcsNyArMjUzLDcgQEAKIAlhdG9taWNfc2V0KCZkZXYtPm9wZW5lZCwgMCk7CiAKIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYtPndhaXQpOwotCXRhc2tsZXRfaW5pdCgmZGV2LT53YWtldXBfdGFzaywgcmZjb21tX3R0eV93YWtldXAsICh1bnNpZ25lZCBsb25nKSBkZXYpOworCUlOSVRfV09SSygmZGV2LT53YWtldXBfdGFzaywgcmZjb21tX3R0eV93YWtldXApOwogCiAJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmZGV2LT5wZW5kaW5nKTsKIApAQCAtMzUxLDcgKzM0Nyw3IEBACiAJc3RydWN0IHJmY29tbV9kZXYgKmRldiA9ICh2b2lkICopIHNrYi0+c2s7CiAJYXRvbWljX3N1Yihza2ItPnRydWVzaXplLCAmZGV2LT53bWVtX2FsbG9jKTsKIAlpZiAodGVzdF9iaXQoUkZDT01NX1RUWV9BVFRBQ0hFRCwgJmRldi0+ZmxhZ3MpKQotCQl0YXNrbGV0X3NjaGVkdWxlKCZkZXYtPndha2V1cF90YXNrKTsKKwkJcXVldWVfd29yayhzeXN0ZW1fbnJ0X3dxLCAmZGV2LT53YWtldXBfdGFzayk7CiAJcmZjb21tX2Rldl9wdXQoZGV2KTsKIH0KIApAQCAtNDU1LDkgKzQ1MSw5IEBACiAKIHN0YXRpYyBpbnQgcmZjb21tX2dldF9kZXZfbGlzdCh2b2lkIF9fdXNlciAqYXJnKQogeworCXN0cnVjdCByZmNvbW1fZGV2ICpkZXY7CiAJc3RydWN0IHJmY29tbV9kZXZfbGlzdF9yZXEgKmRsOwogCXN0cnVjdCByZmNvbW1fZGV2X2luZm8gKmRpOwotCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAJaW50IG4gPSAwLCBzaXplLCBlcnI7CiAJdTE2IGRldl9udW07CiAKQEAgLTQ3OSw4ICs0NzUsNyBAQAogCiAJcmVhZF9sb2NrX2JoKCZyZmNvbW1fZGV2X2xvY2spOwogCi0JbGlzdF9mb3JfZWFjaChwLCAmcmZjb21tX2Rldl9saXN0KSB7Ci0JCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCByZmNvbW1fZGV2LCBsaXN0KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGRldiwgJnJmY29tbV9kZXZfbGlzdCwgbGlzdCkgewogCQlpZiAodGVzdF9iaXQoUkZDT01NX1RUWV9SRUxFQVNFRCwgJmRldi0+ZmxhZ3MpKQogCQkJY29udGludWU7CiAJCShkaSArIG4pLT5pZCAgICAgID0gZGV2LT5pZDsKQEAgLTYzNSw5ICs2MzAsMTAgQEAKIH0KIAogLyogLS0tLSBUVFkgZnVuY3Rpb25zIC0tLS0gKi8KLXN0YXRpYyB2b2lkIHJmY29tbV90dHlfd2FrZXVwKHVuc2lnbmVkIGxvbmcgYXJnKQorc3RhdGljIHZvaWQgcmZjb21tX3R0eV93YWtldXAoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXN0cnVjdCByZmNvbW1fZGV2ICpkZXYgPSAodm9pZCAqKSBhcmc7CisJc3RydWN0IHJmY29tbV9kZXYgKmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgcmZjb21tX2RldiwKKwkJCQkJCQkJd2FrZXVwX3Rhc2spOwogCXN0cnVjdCB0dHlfc3RydWN0ICp0dHkgPSBkZXYtPnR0eTsKIAlpZiAoIXR0eSkKIAkJcmV0dXJuOwpAQCAtNzYyLDcgKzc1OCw3IEBACiAJCXJmY29tbV9kbGNfY2xvc2UoZGV2LT5kbGMsIDApOwogCiAJCWNsZWFyX2JpdChSRkNPTU1fVFRZX0FUVEFDSEVELCAmZGV2LT5mbGFncyk7Ci0JCXRhc2tsZXRfa2lsbCgmZGV2LT53YWtldXBfdGFzayk7CisJCWNhbmNlbF93b3JrX3N5bmMoJmRldi0+d2FrZXVwX3Rhc2spOwogCiAJCXJmY29tbV9kbGNfbG9jayhkZXYtPmRsYyk7CiAJCXR0eS0+ZHJpdmVyX2RhdGEgPSBOVUxMOwpAQCAtMTE1NSw5ICsxMTUxLDExIEBACiAKIGludCBfX2luaXQgcmZjb21tX2luaXRfdHR5cyh2b2lkKQogeworCWludCBlcnJvcjsKKwogCXJmY29tbV90dHlfZHJpdmVyID0gYWxsb2NfdHR5X2RyaXZlcihSRkNPTU1fVFRZX1BPUlRTKTsKIAlpZiAoIXJmY29tbV90dHlfZHJpdmVyKQotCQlyZXR1cm4gLTE7CisJCXJldHVybiAtRU5PTUVNOwogCiAJcmZjb21tX3R0eV9kcml2ZXItPm93bmVyCT0gVEhJU19NT0RVTEU7CiAJcmZjb21tX3R0eV9kcml2ZXItPmRyaXZlcl9uYW1lCT0gInJmY29tbSI7CkBAIC0xMTcyLDEwICsxMTcwLDExIEBACiAJcmZjb21tX3R0eV9kcml2ZXItPmluaXRfdGVybWlvcy5jX2xmbGFnICY9IH5JQ0FOT047CiAJdHR5X3NldF9vcGVyYXRpb25zKHJmY29tbV90dHlfZHJpdmVyLCAmcmZjb21tX29wcyk7CiAKLQlpZiAodHR5X3JlZ2lzdGVyX2RyaXZlcihyZmNvbW1fdHR5X2RyaXZlcikpIHsKKwllcnJvciA9IHR0eV9yZWdpc3Rlcl9kcml2ZXIocmZjb21tX3R0eV9kcml2ZXIpOworCWlmIChlcnJvcikgewogCQlCVF9FUlIoIkNhbid0IHJlZ2lzdGVyIFJGQ09NTSBUVFkgZHJpdmVyIik7CiAJCXB1dF90dHlfZHJpdmVyKHJmY29tbV90dHlfZHJpdmVyKTsKLQkJcmV0dXJuIC0xOworCQlyZXR1cm4gZXJyb3I7CiAJfQogCiAJQlRfSU5GTygiUkZDT01NIFRUWSBsYXllciBpbml0aWFsaXplZCIpOwpkaWZmIC0tZ2l0IGEvbmV0L2JsdWV0b290aC9zY28uYyBiL25ldC9ibHVldG9vdGgvc2NvLmMKaW5kZXggYTMyNGIwMC4uNWRjMmYyMSAxMDA2NDQKLS0tIGEvbmV0L2JsdWV0b290aC9zY28uYworKysgYi9uZXQvYmx1ZXRvb3RoL3Njby5jCkBAIC01MSw3ICs1MSw3IEBACiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvc2NvLmg+CiAKLXN0YXRpYyBpbnQgZGlzYWJsZV9lc2NvOworc3RhdGljIGJvb2wgZGlzYWJsZV9lc2NvOwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHByb3RvX29wcyBzY29fc29ja19vcHM7CiAKQEAgLTE4OSw3ICsxODksNyBAQAogCWlmICghaGRldikKIAkJcmV0dXJuIC1FSE9TVFVOUkVBQ0g7CiAKLQloY2lfZGV2X2xvY2tfYmgoaGRldik7CisJaGNpX2Rldl9sb2NrKGhkZXYpOwogCiAJaWYgKGxtcF9lc2NvX2NhcGFibGUoaGRldikgJiYgIWRpc2FibGVfZXNjbykKIAkJdHlwZSA9IEVTQ09fTElOSzsKQEAgLTIyNSw3ICsyMjUsNyBAQAogCX0KIAogZG9uZToKLQloY2lfZGV2X3VubG9ja19iaChoZGV2KTsKKwloY2lfZGV2X3VubG9jayhoZGV2KTsKIAloY2lfZGV2X3B1dChoZGV2KTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtODkzLDE1ICs4OTMsMTIgQEAKIH0KIAogLyogLS0tLS0gU0NPIGludGVyZmFjZSB3aXRoIGxvd2VyIGxheWVyIChIQ0kpIC0tLS0tICovCi1zdGF0aWMgaW50IHNjb19jb25uZWN0X2luZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkciwgX191OCB0eXBlKQoraW50IHNjb19jb25uZWN0X2luZChzdHJ1Y3QgaGNpX2RldiAqaGRldiwgYmRhZGRyX3QgKmJkYWRkcikKIHsKIAlyZWdpc3RlciBzdHJ1Y3Qgc29jayAqc2s7CiAJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CiAJaW50IGxtID0gMDsKIAotCWlmICh0eXBlICE9IFNDT19MSU5LICYmIHR5cGUgIT0gRVNDT19MSU5LKQotCQlyZXR1cm4gLUVJTlZBTDsKLQogCUJUX0RCRygiaGRldiAlcywgYmRhZGRyICVzIiwgaGRldi0+bmFtZSwgYmF0b3N0cihiZGFkZHIpKTsKIAogCS8qIEZpbmQgbGlzdGVuaW5nIHNvY2tldHMgKi8KQEAgLTkyMSwxMyArOTE4LDkgQEAKIAlyZXR1cm4gbG07CiB9CiAKLXN0YXRpYyBpbnQgc2NvX2Nvbm5lY3RfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgX191OCBzdGF0dXMpCitpbnQgc2NvX2Nvbm5lY3RfY2ZtKHN0cnVjdCBoY2lfY29ubiAqaGNvbiwgX191OCBzdGF0dXMpCiB7CiAJQlRfREJHKCJoY29uICVwIGJkYWRkciAlcyBzdGF0dXMgJWQiLCBoY29uLCBiYXRvc3RyKCZoY29uLT5kc3QpLCBzdGF0dXMpOwotCi0JaWYgKGhjb24tPnR5cGUgIT0gU0NPX0xJTksgJiYgaGNvbi0+dHlwZSAhPSBFU0NPX0xJTkspCi0JCXJldHVybiAtRUlOVkFMOwotCiAJaWYgKCFzdGF0dXMpIHsKIAkJc3RydWN0IHNjb19jb25uICpjb25uOwogCkBAIC05NDAsMTkgKzkzMywxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHNjb19kaXNjb25uX2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIF9fdTggcmVhc29uKQoraW50IHNjb19kaXNjb25uX2NmbShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIF9fdTggcmVhc29uKQogewogCUJUX0RCRygiaGNvbiAlcCByZWFzb24gJWQiLCBoY29uLCByZWFzb24pOwogCi0JaWYgKGhjb24tPnR5cGUgIT0gU0NPX0xJTksgJiYgaGNvbi0+dHlwZSAhPSBFU0NPX0xJTkspCi0JCXJldHVybiAtRUlOVkFMOwotCiAJc2NvX2Nvbm5fZGVsKGhjb24sIGJ0X3RvX2Vycm5vKHJlYXNvbikpOwotCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgc2NvX3JlY3Zfc2NvZGF0YShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHN0cnVjdCBza19idWZmICpza2IpCitpbnQgc2NvX3JlY3Zfc2NvZGF0YShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHNjb19jb25uICpjb25uID0gaGNvbi0+c2NvX2RhdGE7CiAKQEAgLTEwMjgsMTUgKzEwMTcsNiBAQAogCS5jcmVhdGUJPSBzY29fc29ja19jcmVhdGUsCiB9OwogCi1zdGF0aWMgc3RydWN0IGhjaV9wcm90byBzY29faGNpX3Byb3RvID0gewotCS5uYW1lCQk9ICJTQ08iLAotCS5pZAkJPSBIQ0lfUFJPVE9fU0NPLAotCS5jb25uZWN0X2luZAk9IHNjb19jb25uZWN0X2luZCwKLQkuY29ubmVjdF9jZm0JPSBzY29fY29ubmVjdF9jZm0sCi0JLmRpc2Nvbm5fY2ZtCT0gc2NvX2Rpc2Nvbm5fY2ZtLAotCS5yZWN2X3Njb2RhdGEJPSBzY29fcmVjdl9zY29kYXRhCi19OwotCiBpbnQgX19pbml0IHNjb19pbml0KHZvaWQpCiB7CiAJaW50IGVycjsKQEAgLTEwNTEsMTMgKzEwMzEsNiBAQAogCQlnb3RvIGVycm9yOwogCX0KIAotCWVyciA9IGhjaV9yZWdpc3Rlcl9wcm90bygmc2NvX2hjaV9wcm90byk7Ci0JaWYgKGVyciA8IDApIHsKLQkJQlRfRVJSKCJTQ08gcHJvdG9jb2wgcmVnaXN0cmF0aW9uIGZhaWxlZCIpOwotCQlidF9zb2NrX3VucmVnaXN0ZXIoQlRQUk9UT19TQ08pOwotCQlnb3RvIGVycm9yOwotCX0KLQogCWlmIChidF9kZWJ1Z2ZzKSB7CiAJCXNjb19kZWJ1Z2ZzID0gZGVidWdmc19jcmVhdGVfZmlsZSgic2NvIiwgMDQ0NCwKIAkJCQkJYnRfZGVidWdmcywgTlVMTCwgJnNjb19kZWJ1Z2ZzX2ZvcHMpOwpAQCAtMTA4MSw5ICsxMDU0LDYgQEAKIAlpZiAoYnRfc29ja191bnJlZ2lzdGVyKEJUUFJPVE9fU0NPKSA8IDApCiAJCUJUX0VSUigiU0NPIHNvY2tldCB1bnJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKIAotCWlmIChoY2lfdW5yZWdpc3Rlcl9wcm90bygmc2NvX2hjaV9wcm90bykgPCAwKQotCQlCVF9FUlIoIlNDTyBwcm90b2NvbCB1bnJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLQogCXByb3RvX3VucmVnaXN0ZXIoJnNjb19wcm90byk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9ibHVldG9vdGgvc21wLmMgYi9uZXQvYmx1ZXRvb3RoL3NtcC5jCmluZGV4IDc1OWI2MzUuLjMyYzQ3ZGUgMTAwNjQ0Ci0tLSBhL25ldC9ibHVldG9vdGgvc21wLmMKKysrIGIvbmV0L2JsdWV0b290aC9zbXAuYwpAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvYmx1ZXRvb3RoLmg+CiAjaW5jbHVkZSA8bmV0L2JsdWV0b290aC9oY2lfY29yZS5oPgogI2luY2x1ZGUgPG5ldC9ibHVldG9vdGgvbDJjYXAuaD4KKyNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL21nbXQuaD4KICNpbmNsdWRlIDxuZXQvYmx1ZXRvb3RoL3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L2NyeXB0by5oPgogI2luY2x1ZGUgPGxpbnV4L3NjYXR0ZXJsaXN0Lmg+CkBAIC0xODEsMzAgKzE4Miw1MyBAQAogCWlmICghc2tiKQogCQlyZXR1cm47CiAKLQloY2lfc2VuZF9hY2woY29ubi0+aGNvbiwgc2tiLCAwKTsKKwlza2ItPnByaW9yaXR5ID0gSENJX1BSSU9fTUFYOworCWhjaV9zZW5kX2FjbChjb25uLT5oY2hhbiwgc2tiLCAwKTsKIAotCW1vZF90aW1lcigmY29ubi0+c2VjdXJpdHlfdGltZXIsIGppZmZpZXMgKworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29ubi0+c2VjdXJpdHlfdGltZXIpOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmY29ubi0+c2VjdXJpdHlfdGltZXIsCiAJCQkJCW1zZWNzX3RvX2ppZmZpZXMoU01QX1RJTUVPVVQpKTsKIH0KIAorc3RhdGljIF9fdTggYXV0aHJlcV90b19zZWNsZXZlbChfX3U4IGF1dGhyZXEpCit7CisJaWYgKGF1dGhyZXEgJiBTTVBfQVVUSF9NSVRNKQorCQlyZXR1cm4gQlRfU0VDVVJJVFlfSElHSDsKKwllbHNlCisJCXJldHVybiBCVF9TRUNVUklUWV9NRURJVU07Cit9CisKK3N0YXRpYyBfX3U4IHNlY2xldmVsX3RvX2F1dGhyZXEoX191OCBzZWNfbGV2ZWwpCit7CisJc3dpdGNoIChzZWNfbGV2ZWwpIHsKKwljYXNlIEJUX1NFQ1VSSVRZX0hJR0g6CisJCXJldHVybiBTTVBfQVVUSF9NSVRNIHwgU01QX0FVVEhfQk9ORElORzsKKwljYXNlIEJUX1NFQ1VSSVRZX01FRElVTToKKwkJcmV0dXJuIFNNUF9BVVRIX0JPTkRJTkc7CisJZGVmYXVsdDoKKwkJcmV0dXJuIFNNUF9BVVRIX05PTkU7CisJfQorfQorCiBzdGF0aWMgdm9pZCBidWlsZF9wYWlyaW5nX2NtZChzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiwKIAkJCQlzdHJ1Y3Qgc21wX2NtZF9wYWlyaW5nICpyZXEsCiAJCQkJc3RydWN0IHNtcF9jbWRfcGFpcmluZyAqcnNwLAogCQkJCV9fdTggYXV0aHJlcSkKIHsKLQl1OCBkaXN0X2tleXM7CisJdTggZGlzdF9rZXlzID0gMDsKIAotCWRpc3Rfa2V5cyA9IDA7CiAJaWYgKHRlc3RfYml0KEhDSV9QQUlSQUJMRSwgJmNvbm4tPmhjb24tPmhkZXYtPmZsYWdzKSkgewogCQlkaXN0X2tleXMgPSBTTVBfRElTVF9FTkNfS0VZOwogCQlhdXRocmVxIHw9IFNNUF9BVVRIX0JPTkRJTkc7CisJfSBlbHNlIHsKKwkJYXV0aHJlcSAmPSB+U01QX0FVVEhfQk9ORElORzsKIAl9CiAKIAlpZiAocnNwID09IE5VTEwpIHsKIAkJcmVxLT5pb19jYXBhYmlsaXR5ID0gY29ubi0+aGNvbi0+aW9fY2FwYWJpbGl0eTsKIAkJcmVxLT5vb2JfZmxhZyA9IFNNUF9PT0JfTk9UX1BSRVNFTlQ7CiAJCXJlcS0+bWF4X2tleV9zaXplID0gU01QX01BWF9FTkNfS0VZX1NJWkU7Ci0JCXJlcS0+aW5pdF9rZXlfZGlzdCA9IGRpc3Rfa2V5czsKKwkJcmVxLT5pbml0X2tleV9kaXN0ID0gMDsKIAkJcmVxLT5yZXNwX2tleV9kaXN0ID0gZGlzdF9rZXlzOwogCQlyZXEtPmF1dGhfcmVxID0gYXV0aHJlcTsKIAkJcmV0dXJuOwpAQCAtMjEzLDcgKzIzNyw3IEBACiAJcnNwLT5pb19jYXBhYmlsaXR5ID0gY29ubi0+aGNvbi0+aW9fY2FwYWJpbGl0eTsKIAlyc3AtPm9vYl9mbGFnID0gU01QX09PQl9OT1RfUFJFU0VOVDsKIAlyc3AtPm1heF9rZXlfc2l6ZSA9IFNNUF9NQVhfRU5DX0tFWV9TSVpFOwotCXJzcC0+aW5pdF9rZXlfZGlzdCA9IHJlcS0+aW5pdF9rZXlfZGlzdCAmIGRpc3Rfa2V5czsKKwlyc3AtPmluaXRfa2V5X2Rpc3QgPSAwOwogCXJzcC0+cmVzcF9rZXlfZGlzdCA9IHJlcS0+cmVzcF9rZXlfZGlzdCAmIGRpc3Rfa2V5czsKIAlyc3AtPmF1dGhfcmVxID0gYXV0aHJlcTsKIH0KQEAgLTIzMSw2ICsyNTUsMTA3IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyB2b2lkIHNtcF9mYWlsdXJlKHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1OCByZWFzb24sIHU4IHNlbmQpCit7CisJaWYgKHNlbmQpCisJCXNtcF9zZW5kX2NtZChjb25uLCBTTVBfQ01EX1BBSVJJTkdfRkFJTCwgc2l6ZW9mKHJlYXNvbiksCisJCQkJCQkJCSZyZWFzb24pOworCisJY2xlYXJfYml0KEhDSV9DT05OX0VOQ1JZUFRfUEVORCwgJmNvbm4tPmhjb24tPnBlbmQpOworCW1nbXRfYXV0aF9mYWlsZWQoY29ubi0+aGNvbi0+aGRldiwgY29ubi0+ZHN0LCByZWFzb24pOworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29ubi0+c2VjdXJpdHlfdGltZXIpOworCXNtcF9jaGFuX2Rlc3Ryb3koY29ubik7Cit9CisKKyNkZWZpbmUgSlVTVF9XT1JLUwkweDAwCisjZGVmaW5lIEpVU1RfQ0ZNCTB4MDEKKyNkZWZpbmUgUkVRX1BBU1NLRVkJMHgwMgorI2RlZmluZSBDRk1fUEFTU0tFWQkweDAzCisjZGVmaW5lIFJFUV9PT0IJCTB4MDQKKyNkZWZpbmUgT1ZFUkxBUAkJMHhGRgorCitzdGF0aWMgY29uc3QgdTggZ2VuX21ldGhvZFs1XVs1XSA9IHsKKwl7IEpVU1RfV09SS1MsICBKVVNUX0NGTSwgICAgUkVRX1BBU1NLRVksIEpVU1RfV09SS1MsIFJFUV9QQVNTS0VZIH0sCisJeyBKVVNUX1dPUktTLCAgSlVTVF9DRk0sICAgIFJFUV9QQVNTS0VZLCBKVVNUX1dPUktTLCBSRVFfUEFTU0tFWSB9LAorCXsgQ0ZNX1BBU1NLRVksIENGTV9QQVNTS0VZLCBSRVFfUEFTU0tFWSwgSlVTVF9XT1JLUywgQ0ZNX1BBU1NLRVkgfSwKKwl7IEpVU1RfV09SS1MsICBKVVNUX0NGTSwgICAgSlVTVF9XT1JLUywgIEpVU1RfV09SS1MsIEpVU1RfQ0ZNICAgIH0sCisJeyBDRk1fUEFTU0tFWSwgQ0ZNX1BBU1NLRVksIFJFUV9QQVNTS0VZLCBKVVNUX1dPUktTLCBPVkVSTEFQICAgICB9LAorfTsKKworc3RhdGljIGludCB0a19yZXF1ZXN0KHN0cnVjdCBsMmNhcF9jb25uICpjb25uLCB1OCByZW1vdGVfb29iLCB1OCBhdXRoLAorCQkJCQkJdTggbG9jYWxfaW8sIHU4IHJlbW90ZV9pbykKK3sKKwlzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24gPSBjb25uLT5oY29uOworCXN0cnVjdCBzbXBfY2hhbiAqc21wID0gY29ubi0+c21wX2NoYW47CisJdTggbWV0aG9kOworCXUzMiBwYXNza2V5ID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCS8qIEluaXRpYWxpemUga2V5IGZvciBKVVNUIFdPUktTICovCisJbWVtc2V0KHNtcC0+dGssIDAsIHNpemVvZihzbXAtPnRrKSk7CisJY2xlYXJfYml0KFNNUF9GTEFHX1RLX1ZBTElELCAmc21wLT5zbXBfZmxhZ3MpOworCisJQlRfREJHKCJ0a19yZXF1ZXN0OiBhdXRoOiVkIGxjbDolZCByZW06JWQiLCBhdXRoLCBsb2NhbF9pbywgcmVtb3RlX2lvKTsKKworCS8qIElmIG5laXRoZXIgc2lkZSB3YW50cyBNSVRNLCB1c2UgSlVTVCBXT1JLUyAqLworCS8qIElmIGVpdGhlciBzaWRlIGhhcyB1bmtub3duIGlvX2NhcHMsIHVzZSBKVVNUIFdPUktTICovCisJLyogT3RoZXJ3aXNlLCBsb29rIHVwIG1ldGhvZCBmcm9tIHRoZSB0YWJsZSAqLworCWlmICghKGF1dGggJiBTTVBfQVVUSF9NSVRNKSB8fAorCQkJbG9jYWxfaW8gPiBTTVBfSU9fS0VZQk9BUkRfRElTUExBWSB8fAorCQkJcmVtb3RlX2lvID4gU01QX0lPX0tFWUJPQVJEX0RJU1BMQVkpCisJCW1ldGhvZCA9IEpVU1RfV09SS1M7CisJZWxzZQorCQltZXRob2QgPSBnZW5fbWV0aG9kW2xvY2FsX2lvXVtyZW1vdGVfaW9dOworCisJLyogSWYgbm90IGJvbmRpbmcsIGRvbid0IGFzayB1c2VyIHRvIGNvbmZpcm0gYSBaZXJvIFRLICovCisJaWYgKCEoYXV0aCAmIFNNUF9BVVRIX0JPTkRJTkcpICYmIG1ldGhvZCA9PSBKVVNUX0NGTSkKKwkJbWV0aG9kID0gSlVTVF9XT1JLUzsKKworCS8qIElmIEp1c3QgV29ya3MsIENvbnRpbnVlIHdpdGggWmVybyBUSyAqLworCWlmIChtZXRob2QgPT0gSlVTVF9XT1JLUykgeworCQlzZXRfYml0KFNNUF9GTEFHX1RLX1ZBTElELCAmc21wLT5zbXBfZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBOb3QgSnVzdCBXb3Jrcy9Db25maXJtIHJlc3VsdHMgaW4gTUlUTSBBdXRoZW50aWNhdGlvbiAqLworCWlmIChtZXRob2QgIT0gSlVTVF9DRk0pCisJCXNldF9iaXQoU01QX0ZMQUdfTUlUTV9BVVRILCAmc21wLT5zbXBfZmxhZ3MpOworCisJLyogSWYgYm90aCBkZXZpY2VzIGhhdmUgS2V5b2FyZC1EaXNwbGF5IEkvTywgdGhlIG1hc3RlcgorCSAqIENvbmZpcm1zIGFuZCB0aGUgc2xhdmUgRW50ZXJzIHRoZSBwYXNza2V5LgorCSAqLworCWlmIChtZXRob2QgPT0gT1ZFUkxBUCkgeworCQlpZiAoaGNvbi0+bGlua19tb2RlICYgSENJX0xNX01BU1RFUikKKwkJCW1ldGhvZCA9IENGTV9QQVNTS0VZOworCQllbHNlCisJCQltZXRob2QgPSBSRVFfUEFTU0tFWTsKKwl9CisKKwkvKiBHZW5lcmF0ZSByYW5kb20gcGFzc2tleS4gTm90IHZhbGlkIHVudGlsIGNvbmZpcm1lZC4gKi8KKwlpZiAobWV0aG9kID09IENGTV9QQVNTS0VZKSB7CisJCXU4IGtleVsxNl07CisKKwkJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKGtleSkpOworCQlnZXRfcmFuZG9tX2J5dGVzKCZwYXNza2V5LCBzaXplb2YocGFzc2tleSkpOworCQlwYXNza2V5ICU9IDEwMDAwMDA7CisJCXB1dF91bmFsaWduZWRfbGUzMihwYXNza2V5LCBrZXkpOworCQlzd2FwMTI4KGtleSwgc21wLT50ayk7CisJCUJUX0RCRygiUGFzc0tleTogJWQiLCBwYXNza2V5KTsKKwl9CisKKwloY2lfZGV2X2xvY2soaGNvbi0+aGRldik7CisKKwlpZiAobWV0aG9kID09IFJFUV9QQVNTS0VZKQorCQlyZXQgPSBtZ210X3VzZXJfcGFzc2tleV9yZXF1ZXN0KGhjb24tPmhkZXYsIGNvbm4tPmRzdCk7CisJZWxzZQorCQlyZXQgPSBtZ210X3VzZXJfY29uZmlybV9yZXF1ZXN0KGhjb24tPmhkZXYsIGNvbm4tPmRzdCwKKwkJCQkJCWNwdV90b19sZTMyKHBhc3NrZXkpLCAwKTsKKworCWhjaV9kZXZfdW5sb2NrKGhjb24tPmhkZXYpOworCisJcmV0dXJuIHJldDsKK30KKwogc3RhdGljIHZvaWQgY29uZmlybV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3Qgc21wX2NoYW4gKnNtcCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3Qgc21wX2NoYW4sIGNvbmZpcm0pOwpAQCAtMjYzLDE0ICszODgsMTUgQEAKIAkJZ290byBlcnJvcjsKIAl9CiAKKwljbGVhcl9iaXQoU01QX0ZMQUdfQ0ZNX1BFTkRJTkcsICZzbXAtPnNtcF9mbGFncyk7CisKIAlzd2FwMTI4KHJlcywgY3AuY29uZmlybV92YWwpOwogCXNtcF9zZW5kX2NtZChzbXAtPmNvbm4sIFNNUF9DTURfUEFJUklOR19DT05GSVJNLCBzaXplb2YoY3ApLCAmY3ApOwogCiAJcmV0dXJuOwogCiBlcnJvcjoKLQlzbXBfc2VuZF9jbWQoY29ubiwgU01QX0NNRF9QQUlSSU5HX0ZBSUwsIHNpemVvZihyZWFzb24pLCAmcmVhc29uKTsKLQlzbXBfY2hhbl9kZXN0cm95KGNvbm4pOworCXNtcF9mYWlsdXJlKGNvbm4sIHJlYXNvbiwgMSk7CiB9CiAKIHN0YXRpYyB2b2lkIHJhbmRvbV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKQEAgLTM1Myw4ICs0NzksNyBAQAogCXJldHVybjsKIAogZXJyb3I6Ci0Jc21wX3NlbmRfY21kKGNvbm4sIFNNUF9DTURfUEFJUklOR19GQUlMLCBzaXplb2YocmVhc29uKSwgJnJlYXNvbik7Ci0Jc21wX2NoYW5fZGVzdHJveShjb25uKTsKKwlzbXBfZmFpbHVyZShjb25uLCByZWFzb24sIDEpOwogfQogCiBzdGF0aWMgc3RydWN0IHNtcF9jaGFuICpzbXBfY2hhbl9jcmVhdGUoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4pCkBAIC0zNzAsNiArNDk1LDcgQEAKIAogCXNtcC0+Y29ubiA9IGNvbm47CiAJY29ubi0+c21wX2NoYW4gPSBzbXA7CisJY29ubi0+aGNvbi0+c21wX2Nvbm4gPSBjb25uOwogCiAJaGNpX2Nvbm5faG9sZChjb25uLT5oY29uKTsKIApAQCAtMzc4LDE5ICs1MDQsNzMgQEAKIAogdm9pZCBzbXBfY2hhbl9kZXN0cm95KHN0cnVjdCBsMmNhcF9jb25uICpjb25uKQogewotCWtmcmVlKGNvbm4tPnNtcF9jaGFuKTsKKwlzdHJ1Y3Qgc21wX2NoYW4gKnNtcCA9IGNvbm4tPnNtcF9jaGFuOworCisJY2xlYXJfYml0KEhDSV9DT05OX0xFX1NNUF9QRU5ELCAmY29ubi0+aGNvbi0+cGVuZCk7CisKKwlpZiAoc21wLT50Zm0pCisJCWNyeXB0b19mcmVlX2Jsa2NpcGhlcihzbXAtPnRmbSk7CisKKwlrZnJlZShzbXApOworCWNvbm4tPnNtcF9jaGFuID0gTlVMTDsKKwljb25uLT5oY29uLT5zbXBfY29ubiA9IE5VTEw7CiAJaGNpX2Nvbm5fcHV0KGNvbm4tPmhjb24pOwogfQogCitpbnQgc21wX3VzZXJfY29uZmlybV9yZXBseShzdHJ1Y3QgaGNpX2Nvbm4gKmhjb24sIHUxNiBtZ210X29wLCBfX2xlMzIgcGFzc2tleSkKK3sKKwlzdHJ1Y3QgbDJjYXBfY29ubiAqY29ubiA9IGhjb24tPnNtcF9jb25uOworCXN0cnVjdCBzbXBfY2hhbiAqc21wOworCXUzMiB2YWx1ZTsKKwl1OCBrZXlbMTZdOworCisJQlRfREJHKCIiKTsKKworCWlmICghY29ubikKKwkJcmV0dXJuIC1FTk9UQ09OTjsKKworCXNtcCA9IGNvbm4tPnNtcF9jaGFuOworCisJc3dpdGNoIChtZ210X29wKSB7CisJY2FzZSBNR01UX09QX1VTRVJfUEFTU0tFWV9SRVBMWToKKwkJdmFsdWUgPSBsZTMyX3RvX2NwdShwYXNza2V5KTsKKwkJbWVtc2V0KGtleSwgMCwgc2l6ZW9mKGtleSkpOworCQlCVF9EQkcoIlBhc3NLZXk6ICVkIiwgdmFsdWUpOworCQlwdXRfdW5hbGlnbmVkX2xlMzIodmFsdWUsIGtleSk7CisJCXN3YXAxMjgoa2V5LCBzbXAtPnRrKTsKKwkJLyogRmFsbCBUaHJvdWdoICovCisJY2FzZSBNR01UX09QX1VTRVJfQ09ORklSTV9SRVBMWToKKwkJc2V0X2JpdChTTVBfRkxBR19US19WQUxJRCwgJnNtcC0+c21wX2ZsYWdzKTsKKwkJYnJlYWs7CisJY2FzZSBNR01UX09QX1VTRVJfUEFTU0tFWV9ORUdfUkVQTFk6CisJY2FzZSBNR01UX09QX1VTRVJfQ09ORklSTV9ORUdfUkVQTFk6CisJCXNtcF9mYWlsdXJlKGNvbm4sIFNNUF9QQVNTS0VZX0VOVFJZX0ZBSUxFRCwgMSk7CisJCXJldHVybiAwOworCWRlZmF1bHQ6CisJCXNtcF9mYWlsdXJlKGNvbm4sIFNNUF9QQVNTS0VZX0VOVFJZX0ZBSUxFRCwgMSk7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwl9CisKKwkvKiBJZiBpdCBpcyBvdXIgdHVybiB0byBzZW5kIFBhaXJpbmcgQ29uZmlybSwgZG8gc28gbm93ICovCisJaWYgKHRlc3RfYml0KFNNUF9GTEFHX0NGTV9QRU5ESU5HLCAmc21wLT5zbXBfZmxhZ3MpKQorCQlxdWV1ZV93b3JrKGhjb24tPmhkZXYtPndvcmtxdWV1ZSwgJnNtcC0+Y29uZmlybSk7CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHU4IHNtcF9jbWRfcGFpcmluZ19yZXEoc3RydWN0IGwyY2FwX2Nvbm4gKmNvbm4sIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHNtcF9jbWRfcGFpcmluZyByc3AsICpyZXEgPSAodm9pZCAqKSBza2ItPmRhdGE7CiAJc3RydWN0IHNtcF9jaGFuICpzbXA7CiAJdTgga2V5X3NpemU7CisJdTggYXV0aCA9IFNNUF9BVVRIX05PTkU7CiAJaW50IHJldDsKIAogCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOwogCisJaWYgKGNvbm4tPmhjb24tPmxpbmtfbW9kZSAmIEhDSV9MTV9NQVNURVIpCisJCXJldHVybiBTTVBfQ01EX05PVFNVUFA7CisKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoSENJX0NPTk5fTEVfU01QX1BFTkQsICZjb25uLT5oY29uLT5wZW5kKSkKIAkJc21wID0gc21wX2NoYW5fY3JlYXRlKGNvbm4pOwogCkBAIC00MDAsMTkgKzU4MCwxNiBAQAogCW1lbWNweSgmc21wLT5wcmVxWzFdLCByZXEsIHNpemVvZigqcmVxKSk7CiAJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnJlcSkpOwogCi0JaWYgKHJlcS0+b29iX2ZsYWcpCi0JCXJldHVybiBTTVBfT09CX05PVF9BVkFJTDsKKwkvKiBXZSBkaWRuJ3Qgc3RhcnQgdGhlIHBhaXJpbmcsIHNvIG1hdGNoIHJlbW90ZSAqLworCWlmIChyZXEtPmF1dGhfcmVxICYgU01QX0FVVEhfQk9ORElORykKKwkJYXV0aCA9IHJlcS0+YXV0aF9yZXE7CiAKLQkvKiBXZSBkaWRuJ3Qgc3RhcnQgdGhlIHBhaXJpbmcsIHNvIG5vIHJlcXVpcmVtZW50cyAqLwotCWJ1aWxkX3BhaXJpbmdfY21kKGNvbm4sIHJlcSwgJnJzcCwgU01QX0FVVEhfTk9ORSk7CisJYnVpbGRfcGFpcmluZ19jbWQoY29ubiwgcmVxLCAmcnNwLCBhdXRoKTsKIAogCWtleV9zaXplID0gbWluKHJlcS0+bWF4X2tleV9zaXplLCByc3AubWF4X2tleV9zaXplKTsKIAlpZiAoY2hlY2tfZW5jX2tleV9zaXplKGNvbm4sIGtleV9zaXplKSkKIAkJcmV0dXJuIFNNUF9FTkNfS0VZX1NJWkU7CiAKLQkvKiBKdXN0IHdvcmtzICovCi0JbWVtc2V0KHNtcC0+dGssIDAsIHNpemVvZihzbXAtPnRrKSk7Ci0KIAlyZXQgPSBzbXBfcmFuZChzbXAtPnBybmQpOwogCWlmIChyZXQpCiAJCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CkBAIC00MjIsNiArNTk5LDExIEBACiAKIAlzbXBfc2VuZF9jbWQoY29ubiwgU01QX0NNRF9QQUlSSU5HX1JTUCwgc2l6ZW9mKHJzcCksICZyc3ApOwogCisJLyogUmVxdWVzdCBzZXR1cCBvZiBUSyAqLworCXJldCA9IHRrX3JlcXVlc3QoY29ubiwgMCwgYXV0aCwgcnNwLmlvX2NhcGFiaWxpdHksIHJlcS0+aW9fY2FwYWJpbGl0eSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIFNNUF9VTlNQRUNJRklFRDsKKwogCXJldHVybiAwOwogfQogCkBAIC00MzAsMTEgKzYxMiwxNCBAQAogCXN0cnVjdCBzbXBfY21kX3BhaXJpbmcgKnJlcSwgKnJzcCA9ICh2b2lkICopIHNrYi0+ZGF0YTsKIAlzdHJ1Y3Qgc21wX2NoYW4gKnNtcCA9IGNvbm4tPnNtcF9jaGFuOwogCXN0cnVjdCBoY2lfZGV2ICpoZGV2ID0gY29ubi0+aGNvbi0+aGRldjsKLQl1OCBrZXlfc2l6ZTsKKwl1OCBrZXlfc2l6ZSwgYXV0aCA9IFNNUF9BVVRIX05PTkU7CiAJaW50IHJldDsKIAogCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOwogCisJaWYgKCEoY29ubi0+aGNvbi0+bGlua19tb2RlICYgSENJX0xNX01BU1RFUikpCisJCXJldHVybiBTTVBfQ01EX05PVFNVUFA7CisKIAlza2JfcHVsbChza2IsIHNpemVvZigqcnNwKSk7CiAKIAlyZXEgPSAodm9pZCAqKSAmc21wLT5wcmVxWzFdOwpAQCAtNDQzLDEyICs2MjgsNiBAQAogCWlmIChjaGVja19lbmNfa2V5X3NpemUoY29ubiwga2V5X3NpemUpKQogCQlyZXR1cm4gU01QX0VOQ19LRVlfU0laRTsKIAotCWlmIChyc3AtPm9vYl9mbGFnKQotCQlyZXR1cm4gU01QX09PQl9OT1RfQVZBSUw7Ci0KLQkvKiBKdXN0IHdvcmtzICovCi0JbWVtc2V0KHNtcC0+dGssIDAsIHNpemVvZihzbXAtPnRrKSk7Ci0KIAlyZXQgPSBzbXBfcmFuZChzbXAtPnBybmQpOwogCWlmIChyZXQpCiAJCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CkBAIC00NTYsNiArNjM1LDIyIEBACiAJc21wLT5wcnNwWzBdID0gU01QX0NNRF9QQUlSSU5HX1JTUDsKIAltZW1jcHkoJnNtcC0+cHJzcFsxXSwgcnNwLCBzaXplb2YoKnJzcCkpOwogCisJaWYgKChyZXEtPmF1dGhfcmVxICYgU01QX0FVVEhfQk9ORElORykgJiYKKwkJCShyc3AtPmF1dGhfcmVxICYgU01QX0FVVEhfQk9ORElORykpCisJCWF1dGggPSBTTVBfQVVUSF9CT05ESU5HOworCisJYXV0aCB8PSAocmVxLT5hdXRoX3JlcSB8IHJzcC0+YXV0aF9yZXEpICYgU01QX0FVVEhfTUlUTTsKKworCXJldCA9IHRrX3JlcXVlc3QoY29ubiwgMCwgYXV0aCwgcnNwLT5pb19jYXBhYmlsaXR5LCByZXEtPmlvX2NhcGFiaWxpdHkpOworCWlmIChyZXQpCisJCXJldHVybiBTTVBfVU5TUEVDSUZJRUQ7CisKKwlzZXRfYml0KFNNUF9GTEFHX0NGTV9QRU5ESU5HLCAmc21wLT5zbXBfZmxhZ3MpOworCisJLyogQ2FuJ3QgY29tcG9zZSByZXNwb25zZSB1bnRpbCB3ZSBoYXZlIGJlZW4gY29uZmlybWVkICovCisJaWYgKCF0ZXN0X2JpdChTTVBfRkxBR19US19WQUxJRCwgJnNtcC0+c21wX2ZsYWdzKSkKKwkJcmV0dXJuIDA7CisKIAlxdWV1ZV93b3JrKGhkZXYtPndvcmtxdWV1ZSwgJnNtcC0+Y29uZmlybSk7CiAKIAlyZXR1cm4gMDsKQEAgLTQ3Nyw4ICs2NzIsMTAgQEAKIAkJc3dhcDEyOChzbXAtPnBybmQsIHJhbmRvbSk7CiAJCXNtcF9zZW5kX2NtZChjb25uLCBTTVBfQ01EX1BBSVJJTkdfUkFORE9NLCBzaXplb2YocmFuZG9tKSwKIAkJCQkJCQkJcmFuZG9tKTsKLQl9IGVsc2UgeworCX0gZWxzZSBpZiAodGVzdF9iaXQoU01QX0ZMQUdfVEtfVkFMSUQsICZzbXAtPnNtcF9mbGFncykpIHsKIAkJcXVldWVfd29yayhoZGV2LT53b3JrcXVldWUsICZzbXAtPmNvbmZpcm0pOworCX0gZWxzZSB7CisJCXNldF9iaXQoU01QX0ZMQUdfQ0ZNX1BFTkRJTkcsICZzbXAtPnNtcF9mbGFncyk7CiAJfQogCiAJcmV0dXJuIDA7CkBAIC01MzEsNyArNzI4LDcgQEAKIAogCUJUX0RCRygiY29ubiAlcCIsIGNvbm4pOwogCi0JaGNvbi0+cGVuZGluZ19zZWNfbGV2ZWwgPSBCVF9TRUNVUklUWV9NRURJVU07CisJaGNvbi0+cGVuZGluZ19zZWNfbGV2ZWwgPSBhdXRocmVxX3RvX3NlY2xldmVsKHJwLT5hdXRoX3JlcSk7CiAKIAlpZiAoc21wX2x0a19lbmNyeXB0KGNvbm4pKQogCQlyZXR1cm4gMDsKQEAgLTU1OCw2ICs3NTUsNyBAQAogewogCXN0cnVjdCBoY2lfY29ubiAqaGNvbiA9IGNvbm4tPmhjb247CiAJc3RydWN0IHNtcF9jaGFuICpzbXAgPSBjb25uLT5zbXBfY2hhbjsKKwlfX3U4IGF1dGhyZXE7CiAKIAlCVF9EQkcoImNvbm4gJXAgaGNvbiAlcCBsZXZlbCAweCUyLjJ4IiwgY29ubiwgaGNvbiwgc2VjX2xldmVsKTsKIApAQCAtNTc4LDE4ICs3NzYsMjIgQEAKIAkJcmV0dXJuIDA7CiAKIAlzbXAgPSBzbXBfY2hhbl9jcmVhdGUoY29ubik7CisJaWYgKCFzbXApCisJCXJldHVybiAxOworCisJYXV0aHJlcSA9IHNlY2xldmVsX3RvX2F1dGhyZXEoc2VjX2xldmVsKTsKIAogCWlmIChoY29uLT5saW5rX21vZGUgJiBIQ0lfTE1fTUFTVEVSKSB7CiAJCXN0cnVjdCBzbXBfY21kX3BhaXJpbmcgY3A7CiAKLQkJYnVpbGRfcGFpcmluZ19jbWQoY29ubiwgJmNwLCBOVUxMLCBTTVBfQVVUSF9OT05FKTsKKwkJYnVpbGRfcGFpcmluZ19jbWQoY29ubiwgJmNwLCBOVUxMLCBhdXRocmVxKTsKIAkJc21wLT5wcmVxWzBdID0gU01QX0NNRF9QQUlSSU5HX1JFUTsKIAkJbWVtY3B5KCZzbXAtPnByZXFbMV0sICZjcCwgc2l6ZW9mKGNwKSk7CiAKIAkJc21wX3NlbmRfY21kKGNvbm4sIFNNUF9DTURfUEFJUklOR19SRVEsIHNpemVvZihjcCksICZjcCk7CiAJfSBlbHNlIHsKIAkJc3RydWN0IHNtcF9jbWRfc2VjdXJpdHlfcmVxIGNwOwotCQljcC5hdXRoX3JlcSA9IFNNUF9BVVRIX05PTkU7CisJCWNwLmF1dGhfcmVxID0gYXV0aHJlcTsKIAkJc21wX3NlbmRfY21kKGNvbm4sIFNNUF9DTURfU0VDVVJJVFlfUkVRLCBzaXplb2YoY3ApLCAmY3ApOwogCX0KIApAQCAtNjE4LDcgKzgyMCw3IEBACiAKIAlza2JfcHVsbChza2IsIHNpemVvZigqcnApKTsKIAotCWhjaV9hZGRfbHRrKGNvbm4tPmhjb24tPmhkZXYsIDEsIGNvbm4tPnNyYywgc21wLT5zbXBfa2V5X3NpemUsCisJaGNpX2FkZF9sdGsoY29ubi0+aGNvbi0+aGRldiwgMSwgY29ubi0+ZHN0LCBzbXAtPnNtcF9rZXlfc2l6ZSwKIAkJCQkJCXJwLT5lZGl2LCBycC0+cmFuZCwgc21wLT50ayk7CiAKIAlzbXBfZGlzdHJpYnV0ZV9rZXlzKGNvbm4sIDEpOwpAQCAtNjQ2LDYgKzg0OCw3IEBACiAJCWJyZWFrOwogCiAJY2FzZSBTTVBfQ01EX1BBSVJJTkdfRkFJTDoKKwkJc21wX2ZhaWx1cmUoY29ubiwgc2tiLT5kYXRhWzBdLCAwKTsKIAkJcmVhc29uID0gMDsKIAkJZXJyID0gLUVQRVJNOwogCQlicmVhazsKQEAgLTY5MSw4ICs4OTQsNyBAQAogCiBkb25lOgogCWlmIChyZWFzb24pCi0JCXNtcF9zZW5kX2NtZChjb25uLCBTTVBfQ01EX1BBSVJJTkdfRkFJTCwgc2l6ZW9mKHJlYXNvbiksCi0JCQkJCQkJCSZyZWFzb24pOworCQlzbXBfZmFpbHVyZShjb25uLCByZWFzb24sIDEpOwogCiAJa2ZyZWVfc2tiKHNrYik7CiAJcmV0dXJuIGVycjsKQEAgLTc4MSw3ICs5ODMsNyBAQAogCiAJaWYgKGNvbm4tPmhjb24tPm91dCB8fCBmb3JjZSkgewogCQljbGVhcl9iaXQoSENJX0NPTk5fTEVfU01QX1BFTkQsICZjb25uLT5oY29uLT5wZW5kKTsKLQkJZGVsX3RpbWVyKCZjb25uLT5zZWN1cml0eV90aW1lcik7CisJCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmY29ubi0+c2VjdXJpdHlfdGltZXIpOwogCQlzbXBfY2hhbl9kZXN0cm95KGNvbm4pOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9ici5jIGIvbmV0L2JyaWRnZS9ici5jCmluZGV4IGYyMGM0ZmQuLmJhNzgwY2MgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnIuYworKysgYi9uZXQvYnJpZGdlL2JyLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAogCWJyaW9jdGxfc2V0KGJyX2lvY3RsX2RldmljZWxlc3Nfc3R1Yik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19BVE1fTEFORSkgfHwgZGVmaW5lZChDT05GSUdfQVRNX0xBTkVfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0FUTV9MQU5FKQogCWJyX2ZkYl90ZXN0X2FkZHJfaG9vayA9IGJyX2ZkYl90ZXN0X2FkZHI7CiAjZW5kaWYKIApAQCAtOTMsNyArOTMsNyBAQAogCXJjdV9iYXJyaWVyKCk7IC8qIFdhaXQgZm9yIGNvbXBsZXRpb24gb2YgY2FsbF9yY3UoKSdzICovCiAKIAlicl9uZXRmaWx0ZXJfZmluaSgpOwotI2lmIGRlZmluZWQoQ09ORklHX0FUTV9MQU5FKSB8fCBkZWZpbmVkKENPTkZJR19BVE1fTEFORV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQVRNX0xBTkUpCiAJYnJfZmRiX3Rlc3RfYWRkcl9ob29rID0gTlVMTDsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jIGIvbmV0L2JyaWRnZS9icl9kZXZpY2UuYwppbmRleCBmZWI3N2VhLi43MTc3M2IwIDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX2RldmljZS5jCisrKyBiL25ldC9icmlkZ2UvYnJfZGV2aWNlLmMKQEAgLTE3MCw4ICsxNzAsMTEgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfYmgoJmJyLT5sb2NrKTsKLQltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgRVRIX0FMRU4pOwotCWJyX3N0cF9jaGFuZ2VfYnJpZGdlX2lkKGJyLCBhZGRyLT5zYV9kYXRhKTsKKwlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGRldi0+ZGV2X2FkZHIsIGFkZHItPnNhX2RhdGEpKSB7CisJCW1lbWNweShkZXYtPmRldl9hZGRyLCBhZGRyLT5zYV9kYXRhLCBFVEhfQUxFTik7CisJCWJyX2ZkYl9jaGFuZ2VfbWFjX2FkZHJlc3MoYnIsIGFkZHItPnNhX2RhdGEpOworCQlicl9zdHBfY2hhbmdlX2JyaWRnZV9pZChiciwgYWRkci0+c2FfZGF0YSk7CisJfQogCWJyLT5mbGFncyB8PSBCUl9TRVRfTUFDX0FERFI7CiAJc3Bpbl91bmxvY2tfYmgoJmJyLT5sb2NrKTsKIApAQCAtMTg2LDcgKzE4OSw4IEBACiAJc3RyY3B5KGluZm8tPmJ1c19pbmZvLCAiTi9BIik7CiB9CiAKLXN0YXRpYyB1MzIgYnJfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBicl9maXhfZmVhdHVyZXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIgPSBuZXRkZXZfcHJpdihkZXYpOwogCkBAIC0zNDEsMTAgKzM0NSwxMCBAQAogCWRldi0+cHJpdl9mbGFncyA9IElGRl9FQlJJREdFOwogCiAJZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0ZSQUdMSVNUIHwgTkVUSUZfRl9ISUdIRE1BIHwKLQkJCU5FVElGX0ZfR1NPX01BU0sgfCBORVRJRl9GX05PX0NTVU0gfCBORVRJRl9GX0xMVFggfAorCQkJTkVUSUZfRl9HU09fTUFTSyB8IE5FVElGX0ZfSFdfQ1NVTSB8IE5FVElGX0ZfTExUWCB8CiAJCQlORVRJRl9GX05FVE5TX0xPQ0FMIHwgTkVUSUZfRl9IV19WTEFOX1RYOwogCWRldi0+aHdfZmVhdHVyZXMgPSBORVRJRl9GX1NHIHwgTkVUSUZfRl9GUkFHTElTVCB8IE5FVElGX0ZfSElHSERNQSB8Ci0JCQkgICBORVRJRl9GX0dTT19NQVNLIHwgTkVUSUZfRl9OT19DU1VNIHwKKwkJCSAgIE5FVElGX0ZfR1NPX01BU0sgfCBORVRJRl9GX0hXX0NTVU0gfAogCQkJICAgTkVUSUZfRl9IV19WTEFOX1RYOwogCiAJYnItPmRldiA9IGRldjsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZmRiLmMgYi9uZXQvYnJpZGdlL2JyX2ZkYi5jCmluZGV4IGM4ZTc4NjEuLmY5NjNmNmIgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfZmRiLmMKKysrIGIvbmV0L2JyaWRnZS9icl9mZGIuYwpAQCAtMjgsNyArMjgsOCBAQAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpicl9mZGJfY2FjaGUgX19yZWFkX21vc3RseTsKIHN0YXRpYyBpbnQgZmRiX2luc2VydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnNvdXJjZSwKIAkJICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYWRkcik7Ci1zdGF0aWMgdm9pZCBmZGJfbm90aWZ5KGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqLCBpbnQpOworc3RhdGljIHZvaWQgZmRiX25vdGlmeShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKiwgaW50KTsKIAogc3RhdGljIHUzMiBmZGJfc2FsdCBfX3JlYWRfbW9zdGx5OwogCkBAIC04MCwxMCArODEsMTAgQEAKIAlrbWVtX2NhY2hlX2ZyZWUoYnJfZmRiX2NhY2hlLCBlbnQpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZmRiX2RlbGV0ZShzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmYpCitzdGF0aWMgdm9pZCBmZGJfZGVsZXRlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmKQogewotCWZkYl9ub3RpZnkoZiwgUlRNX0RFTE5FSUdIKTsKIAlobGlzdF9kZWxfcmN1KCZmLT5obGlzdCk7CisJZmRiX25vdGlmeShiciwgZiwgUlRNX0RFTE5FSUdIKTsKIAljYWxsX3JjdSgmZi0+cmN1LCBmZGJfcmN1X2ZyZWUpOwogfQogCkBAIC0xMTQsNyArMTE1LDcgQEAKIAkJCQl9CiAKIAkJCQkvKiBkZWxldGUgb2xkIG9uZSAqLwotCQkJCWZkYl9kZWxldGUoZik7CisJCQkJZmRiX2RlbGV0ZShiciwgZik7CiAJCQkJZ290byBpbnNlcnQ7CiAJCQl9CiAJCX0KQEAgLTEyNiw2ICsxMjcsMTggQEAKIAlzcGluX3VubG9ja19iaCgmYnItPmhhc2hfbG9jayk7CiB9CiAKK3ZvaWQgYnJfZmRiX2NoYW5nZV9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIGNvbnN0IHU4ICpuZXdhZGRyKQoreworCXN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZjsKKworCS8qIElmIG9sZCBlbnRyeSB3YXMgdW5hc3NvY2lhdGVkIHdpdGggYW55IHBvcnQsIHRoZW4gZGVsZXRlIGl0LiAqLworCWYgPSBfX2JyX2ZkYl9nZXQoYnIsIGJyLT5kZXYtPmRldl9hZGRyKTsKKwlpZiAoZiAmJiBmLT5pc19sb2NhbCAmJiAhZi0+ZHN0KQorCQlmZGJfZGVsZXRlKGJyLCBmKTsKKworCWZkYl9pbnNlcnQoYnIsIE5VTEwsIG5ld2FkZHIpOworfQorCiB2b2lkIGJyX2ZkYl9jbGVhbnVwKHVuc2lnbmVkIGxvbmcgX2RhdGEpCiB7CiAJc3RydWN0IG5ldF9icmlkZ2UgKmJyID0gKHN0cnVjdCBuZXRfYnJpZGdlICopX2RhdGE7CkBAIC0xNDQsNyArMTU3LDcgQEAKIAkJCQljb250aW51ZTsKIAkJCXRoaXNfdGltZXIgPSBmLT51cGRhdGVkICsgZGVsYXk7CiAJCQlpZiAodGltZV9iZWZvcmVfZXEodGhpc190aW1lciwgamlmZmllcykpCi0JCQkJZmRiX2RlbGV0ZShmKTsKKwkJCQlmZGJfZGVsZXRlKGJyLCBmKTsKIAkJCWVsc2UgaWYgKHRpbWVfYmVmb3JlKHRoaXNfdGltZXIsIG5leHRfdGltZXIpKQogCQkJCW5leHRfdGltZXIgPSB0aGlzX3RpbWVyOwogCQl9CkBAIC0xNjUsNyArMTc4LDcgQEAKIAkJc3RydWN0IGhsaXN0X25vZGUgKmgsICpuOwogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGYsIGgsIG4sICZici0+aGFzaFtpXSwgaGxpc3QpIHsKIAkJCWlmICghZi0+aXNfc3RhdGljKQotCQkJCWZkYl9kZWxldGUoZik7CisJCQkJZmRiX2RlbGV0ZShiciwgZik7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfYmgoJmJyLT5oYXNoX2xvY2spOwpAQCAtMjA5LDcgKzIyMiw3IEBACiAJCQkJfQogCQkJfQogCi0JCQlmZGJfZGVsZXRlKGYpOworCQkJZmRiX2RlbGV0ZShiciwgZik7CiAJCXNraXBfZGVsZXRlOiA7CiAJCX0KIAl9CkBAIC0yMzQsNyArMjQ3LDcgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0FUTV9MQU5FKSB8fCBkZWZpbmVkKENPTkZJR19BVE1fTEFORV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQVRNX0xBTkUpCiAvKiBJbnRlcmZhY2UgdXNlZCBieSBBVE0gTEFORSBob29rIHRvIHRlc3QKICAqIGlmIGFuIGFkZHIgaXMgb24gc29tZSBvdGhlciBicmlkZ2UgcG9ydCAqLwogaW50IGJyX2ZkYl90ZXN0X2FkZHIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgY2hhciAqYWRkcikKQEAgLTI0OSw3ICsyNjIsNyBAQAogCQlyZXQgPSAwOwogCWVsc2UgewogCQlmZGIgPSBfX2JyX2ZkYl9nZXQocG9ydC0+YnIsIGFkZHIpOwotCQlyZXQgPSBmZGIgJiYgZmRiLT5kc3QtPmRldiAhPSBkZXYgJiYKKwkJcmV0ID0gZmRiICYmIGZkYi0+ZHN0ICYmIGZkYi0+ZHN0LT5kZXYgIT0gZGV2ICYmCiAJCQlmZGItPmRzdC0+c3RhdGUgPT0gQlJfU1RBVEVfRk9SV0FSRElORzsKIAl9CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0yODEsNiArMjk0LDEwIEBACiAJCQlpZiAoaGFzX2V4cGlyZWQoYnIsIGYpKQogCQkJCWNvbnRpbnVlOwogCisJCQkvKiBpZ25vcmUgcHNldWRvIGVudHJ5IGZvciBsb2NhbCBNQUMgYWRkcmVzcyAqLworCQkJaWYgKCFmLT5kc3QpCisJCQkJY29udGludWU7CisKIAkJCWlmIChza2lwKSB7CiAJCQkJLS1za2lwOwogCQkJCWNvbnRpbnVlOwpAQCAtMzQ3LDcgKzM2NCw2IEBACiAJCWZkYi0+aXNfc3RhdGljID0gMDsKIAkJZmRiLT51cGRhdGVkID0gZmRiLT51c2VkID0gamlmZmllczsKIAkJaGxpc3RfYWRkX2hlYWRfcmN1KCZmZGItPmhsaXN0LCBoZWFkKTsKLQkJZmRiX25vdGlmeShmZGIsIFJUTV9ORVdORUlHSCk7CiAJfQogCXJldHVybiBmZGI7CiB9CkBAIC0zNzEsNyArMzg3LDcgQEAKIAkJYnJfd2FybihiciwgImFkZGluZyBpbnRlcmZhY2UgJXMgd2l0aCBzYW1lIGFkZHJlc3MgIgogCQkgICAgICAgImFzIGEgcmVjZWl2ZWQgcGFja2V0XG4iLAogCQkgICAgICAgc291cmNlLT5kZXYtPm5hbWUpOwotCQlmZGJfZGVsZXRlKGZkYik7CisJCWZkYl9kZWxldGUoYnIsIGZkYik7CiAJfQogCiAJZmRiID0gZmRiX2NyZWF0ZShoZWFkLCBzb3VyY2UsIGFkZHIpOwpAQCAtMzc5LDYgKzM5NSw3IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJZmRiLT5pc19sb2NhbCA9IGZkYi0+aXNfc3RhdGljID0gMTsKKwlmZGJfbm90aWZ5KGJyLCBmZGIsIFJUTV9ORVdORUlHSCk7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTQyNCw5ICs0NDEsMTEgQEAKIAkJfQogCX0gZWxzZSB7CiAJCXNwaW5fbG9jaygmYnItPmhhc2hfbG9jayk7Ci0JCWlmIChsaWtlbHkoIWZkYl9maW5kKGhlYWQsIGFkZHIpKSkKLQkJCWZkYl9jcmVhdGUoaGVhZCwgc291cmNlLCBhZGRyKTsKLQorCQlpZiAobGlrZWx5KCFmZGJfZmluZChoZWFkLCBhZGRyKSkpIHsKKwkJCWZkYiA9IGZkYl9jcmVhdGUoaGVhZCwgc291cmNlLCBhZGRyKTsKKwkJCWlmIChmZGIpCisJCQkJZmRiX25vdGlmeShiciwgZmRiLCBSVE1fTkVXTkVJR0gpOworCQl9CiAJCS8qIGVsc2UgIHdlIGxvc2UgcmFjZSBhbmQgc29tZW9uZSBlbHNlIGluc2VydHMKIAkJICogaXQgZmlyc3QsIGRvbid0IGJvdGhlciB1cGRhdGluZwogCQkgKi8KQEAgLTQ0Niw3ICs0NjUsNyBAQAogCQlyZXR1cm4gTlVEX1JFQUNIQUJMRTsKIH0KIAotc3RhdGljIGludCBmZGJfZmlsbF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsCitzdGF0aWMgaW50IGZkYl9maWxsX2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5ldF9icmlkZ2UgKmJyLAogCQkJIGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlX2ZkYl9lbnRyeSAqZmRiLAogCQkJIHUzMiBwaWQsIHUzMiBzZXEsIGludCB0eXBlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CkBAIC00NTksMTQgKzQ3OCwxMyBAQAogCWlmIChubGggPT0gTlVMTCkKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAotCiAJbmRtID0gbmxtc2dfZGF0YShubGgpOwogCW5kbS0+bmRtX2ZhbWlseQkgPSBBRl9CUklER0U7CiAJbmRtLT5uZG1fcGFkMSAgICA9IDA7CiAJbmRtLT5uZG1fcGFkMiAgICA9IDA7CiAJbmRtLT5uZG1fZmxhZ3MJID0gMDsKIAluZG0tPm5kbV90eXBlCSA9IDA7Ci0JbmRtLT5uZG1faWZpbmRleCA9IGZkYi0+ZHN0LT5kZXYtPmlmaW5kZXg7CisJbmRtLT5uZG1faWZpbmRleCA9IGZkYi0+ZHN0ID8gZmRiLT5kc3QtPmRldi0+aWZpbmRleCA6IGJyLT5kZXYtPmlmaW5kZXg7CiAJbmRtLT5uZG1fc3RhdGUgICA9IGZkYl90b19udWQoZmRiKTsKIAogCU5MQV9QVVQoc2tiLCBOREFfTExBRERSLCBFVEhfQUxFTiwgJmZkYi0+YWRkcik7CkBAIC00OTEsOSArNTA5LDEwIEBACiAJCSsgbmxhX3RvdGFsX3NpemUoc2l6ZW9mKHN0cnVjdCBuZGFfY2FjaGVpbmZvKSk7CiB9CiAKLXN0YXRpYyB2b2lkIGZkYl9ub3RpZnkoY29uc3Qgc3RydWN0IG5ldF9icmlkZ2VfZmRiX2VudHJ5ICpmZGIsIGludCB0eXBlKQorc3RhdGljIHZvaWQgZmRiX25vdGlmeShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCisJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9mZGJfZW50cnkgKmZkYiwgaW50IHR5cGUpCiB7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChmZGItPmRzdC0+ZGV2KTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGJyLT5kZXYpOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IGVyciA9IC1FTk9CVUZTOwogCkBAIC01MDEsNyArNTIwLDcgQEAKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3V0OwogCi0JZXJyID0gZmRiX2ZpbGxfaW5mbyhza2IsIGZkYiwgMCwgMCwgdHlwZSwgMCk7CisJZXJyID0gZmRiX2ZpbGxfaW5mbyhza2IsIGJyLCBmZGIsIDAsIDAsIHR5cGUsIDApOwogCWlmIChlcnIgPCAwKSB7CiAJCS8qIC1FTVNHU0laRSBpbXBsaWVzIEJVRyBpbiBmZGJfbmxtc2dfc2l6ZSgpICovCiAJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CkBAIC01MzgsNyArNTU3LDcgQEAKIAkJCQlpZiAoaWR4IDwgY2ItPmFyZ3NbMF0pCiAJCQkJCWdvdG8gc2tpcDsKIAotCQkJCWlmIChmZGJfZmlsbF9pbmZvKHNrYiwgZiwKKwkJCQlpZiAoZmRiX2ZpbGxfaW5mbyhza2IsIGJyLCBmLAogCQkJCQkJICBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKIAkJCQkJCSAgY2ItPm5saC0+bmxtc2dfc2VxLAogCQkJCQkJICBSVE1fTkVXTkVJR0gsCkBAIC01NTYsNyArNTc1LDcgQEAKIAlyZXR1cm4gc2tiLT5sZW47CiB9CiAKLS8qIENyZWF0ZSBuZXcgc3RhdGljIGZkYiBlbnRyeSAqLworLyogVXBkYXRlIChjcmVhdGUgb3IgcmVwbGFjZSkgZm9yd2FyZGluZyBkYXRhYmFzZSBlbnRyeSAqLwogc3RhdGljIGludCBmZGJfYWRkX2VudHJ5KHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnNvdXJjZSwgY29uc3QgX191OCAqYWRkciwKIAkJCSBfX3UxNiBzdGF0ZSwgX191MTYgZmxhZ3MpCiB7CkBAIC01NzIsMTkgKzU5MSwyNSBAQAogCQlmZGIgPSBmZGJfY3JlYXRlKGhlYWQsIHNvdXJjZSwgYWRkcik7CiAJCWlmICghZmRiKQogCQkJcmV0dXJuIC1FTk9NRU07CisJCWZkYl9ub3RpZnkoYnIsIGZkYiwgUlRNX05FV05FSUdIKTsKIAl9IGVsc2UgewogCQlpZiAoZmxhZ3MgJiBOTE1fRl9FWENMKQogCQkJcmV0dXJuIC1FRVhJU1Q7Ci0KLQkJaWYgKGZsYWdzICYgTkxNX0ZfUkVQTEFDRSkKLQkJCWZkYi0+dXBkYXRlZCA9IGZkYi0+dXNlZCA9IGppZmZpZXM7Ci0JCWZkYi0+aXNfbG9jYWwgPSBmZGItPmlzX3N0YXRpYyA9IDA7CiAJfQogCi0JaWYgKHN0YXRlICYgTlVEX1BFUk1BTkVOVCkKLQkJZmRiLT5pc19sb2NhbCA9IGZkYi0+aXNfc3RhdGljID0gMTsKLQllbHNlIGlmIChzdGF0ZSAmIE5VRF9OT0FSUCkKLQkJZmRiLT5pc19zdGF0aWMgPSAxOworCWlmIChmZGJfdG9fbnVkKGZkYikgIT0gc3RhdGUpIHsKKwkJaWYgKHN0YXRlICYgTlVEX1BFUk1BTkVOVCkKKwkJCWZkYi0+aXNfbG9jYWwgPSBmZGItPmlzX3N0YXRpYyA9IDE7CisJCWVsc2UgaWYgKHN0YXRlICYgTlVEX05PQVJQKSB7CisJCQlmZGItPmlzX2xvY2FsID0gMDsKKwkJCWZkYi0+aXNfc3RhdGljID0gMTsKKwkJfSBlbHNlCisJCQlmZGItPmlzX2xvY2FsID0gZmRiLT5pc19zdGF0aWMgPSAwOworCisJCWZkYi0+dXBkYXRlZCA9IGZkYi0+dXNlZCA9IGppZmZpZXM7CisJCWZkYl9ub3RpZnkoYnIsIGZkYiwgUlRNX05FV05FSUdIKTsKKwl9CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtNjI3LDYgKzY1MiwxMSBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKKwlpZiAoIShuZG0tPm5kbV9zdGF0ZSAmIChOVURfUEVSTUFORU5UfE5VRF9OT0FSUHxOVURfUkVBQ0hBQkxFKSkpIHsKKwkJcHJfaW5mbygiYnJpZGdlOiBSVE1fTkVXTkVJR0ggd2l0aCBpbnZhbGlkIHN0YXRlICUjeFxuIiwgbmRtLT5uZG1fc3RhdGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKIAlwID0gYnJfcG9ydF9nZXRfcnRubChkZXYpOwogCWlmIChwID09IE5VTEwpIHsKIAkJcHJfaW5mbygiYnJpZGdlOiBSVE1fTkVXTkVJR0ggJXMgbm90IGEgYnJpZGdlIHBvcnRcbiIsCkBAIC02MzQsOSArNjY0LDE1IEBACiAJCXJldHVybiAtRUlOVkFMOwogCX0KIAotCXNwaW5fbG9ja19iaCgmcC0+YnItPmhhc2hfbG9jayk7Ci0JZXJyID0gZmRiX2FkZF9lbnRyeShwLCBhZGRyLCBuZG0tPm5kbV9zdGF0ZSwgbmxoLT5ubG1zZ19mbGFncyk7Ci0Jc3Bpbl91bmxvY2tfYmgoJnAtPmJyLT5oYXNoX2xvY2spOworCWlmIChuZG0tPm5kbV9mbGFncyAmIE5URl9VU0UpIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlicl9mZGJfdXBkYXRlKHAtPmJyLCBwLCBhZGRyKTsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2JoKCZwLT5ici0+aGFzaF9sb2NrKTsKKwkJZXJyID0gZmRiX2FkZF9lbnRyeShwLCBhZGRyLCBuZG0tPm5kbV9zdGF0ZSwgbmxoLT5ubG1zZ19mbGFncyk7CisJCXNwaW5fdW5sb2NrX2JoKCZwLT5ici0+aGFzaF9sb2NrKTsKKwl9CiAKIAlyZXR1cm4gZXJyOwogfQpAQCAtNjUxLDcgKzY4Nyw3IEBACiAJaWYgKCFmZGIpCiAJCXJldHVybiAtRU5PRU5UOwogCi0JZmRiX2RlbGV0ZShmZGIpOworCWZkYl9kZWxldGUocC0+YnIsIGZkYik7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfZm9yd2FyZC5jIGIvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMKaW5kZXggZWU2NDI4Ny4uNjFmNjUzNCAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMKKysrIGIvbmV0L2JyaWRnZS9icl9mb3J3YXJkLmMKQEAgLTk4LDcgKzk4LDcgQEAKIC8qIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2sgKi8KIHZvaWQgYnJfZGVsaXZlcihjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICp0bywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAoc2hvdWxkX2RlbGl2ZXIodG8sIHNrYikpIHsKKwlpZiAodG8gJiYgc2hvdWxkX2RlbGl2ZXIodG8sIHNrYikpIHsKIAkJX19icl9kZWxpdmVyKHRvLCBza2IpOwogCQlyZXR1cm47CiAJfQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9pZi5jIGIvbmV0L2JyaWRnZS9icl9pZi5jCmluZGV4IGY2MDNlNWIuLjBhOTQyZmIgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfaWYuYworKysgYi9uZXQvYnJpZGdlL2JyX2lmLmMKQEAgLTI5NiwxMCArMjk2LDExIEBACiAvKgogICogUmVjb21wdXRlcyBmZWF0dXJlcyB1c2luZyBzbGF2ZSdzIGZlYXR1cmVzCiAgKi8KLXUzMiBicl9mZWF0dXJlc19yZWNvbXB1dGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLCB1MzIgZmVhdHVyZXMpCituZXRkZXZfZmVhdHVyZXNfdCBicl9mZWF0dXJlc19yZWNvbXB1dGUoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnA7Ci0JdTMyIG1hc2s7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgbWFzazsKIAogCWlmIChsaXN0X2VtcHR5KCZici0+cG9ydF9saXN0KSkKIAkJcmV0dXJuIGZlYXR1cmVzOwpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYyBiL25ldC9icmlkZ2UvYnJfbXVsdGljYXN0LmMKaW5kZXggYTVmNGU1Ny4uNTY4ZDViZiAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9tdWx0aWNhc3QuYworKysgYi9uZXQvYnJpZGdlL2JyX211bHRpY2FzdC5jCkBAIC0yNCw3ICsyNCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKICNpbmNsdWRlIDxuZXQvaXB2Ni5oPgogI2luY2x1ZGUgPG5ldC9tbGQuaD4KICNpbmNsdWRlIDxuZXQvYWRkcmNvbmYuaD4KQEAgLTM2LDcgKzM2LDcgQEAKICNkZWZpbmUgbWxvY2tfZGVyZWZlcmVuY2UoWCwgYnIpIFwKIAlyY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKFgsIGxvY2tkZXBfaXNfaGVsZCgmYnItPm11bHRpY2FzdF9sb2NrKSkKIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgaW5saW5lIGludCBpcHY2X2lzX3RyYW5zaWVudF9tdWx0aWNhc3QoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKQogewogCWlmIChpcHY2X2FkZHJfaXNfbXVsdGljYXN0KGFkZHIpICYmIElQVjZfQUREUl9NQ19GTEFHX1RSQU5TSUVOVChhZGRyKSkKQEAgLTUyLDcgKzUyLDcgQEAKIAlzd2l0Y2ggKGEtPnByb3RvKSB7CiAJY2FzZSBodG9ucyhFVEhfUF9JUCk6CiAJCXJldHVybiBhLT51LmlwNCA9PSBiLT51LmlwNDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgaHRvbnMoRVRIX1BfSVBWNik6CiAJCXJldHVybiBpcHY2X2FkZHJfZXF1YWwoJmEtPnUuaXA2LCAmYi0+dS5pcDYpOwogI2VuZGlmCkBAIC02NSw3ICs2NSw3IEBACiAJcmV0dXJuIGpoYXNoXzF3b3JkKG1kYi0+c2VjcmV0LCAoX19mb3JjZSB1MzIpaXApICYgKG1kYi0+bWF4IC0gMSk7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIGlubGluZSBpbnQgX19icl9pcDZfaGFzaChzdHJ1Y3QgbmV0X2JyaWRnZV9tZGJfaHRhYmxlICptZGIsCiAJCQkJY29uc3Qgc3RydWN0IGluNl9hZGRyICppcCkKIHsKQEAgLTc5LDcgKzc5LDcgQEAKIAlzd2l0Y2ggKGlwLT5wcm90bykgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgogCQlyZXR1cm4gX19icl9pcDRfaGFzaChtZGIsIGlwLT51LmlwNCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgogCQlyZXR1cm4gX19icl9pcDZfaGFzaChtZGIsICZpcC0+dS5pcDYpOwogI2VuZGlmCkBAIC0xMjEsMTMgKzEyMSwxMyBAQAogCXJldHVybiBicl9tZGJfaXBfZ2V0KG1kYiwgJmJyX2RzdCk7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIHN0cnVjdCBuZXRfYnJpZGdlX21kYl9lbnRyeSAqYnJfbWRiX2lwNl9nZXQoCiAJc3RydWN0IG5ldF9icmlkZ2VfbWRiX2h0YWJsZSAqbWRiLCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRzdCkKIHsKIAlzdHJ1Y3QgYnJfaXAgYnJfZHN0OwogCi0JaXB2Nl9hZGRyX2NvcHkoJmJyX2RzdC51LmlwNiwgZHN0KTsKKwlicl9kc3QudS5pcDYgPSAqZHN0OwogCWJyX2RzdC5wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOwogCiAJcmV0dXJuIGJyX21kYl9pcF9nZXQobWRiLCAmYnJfZHN0KTsKQEAgLTE1Miw5ICsxNTIsOSBAQAogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgogCQlpcC51LmlwNCA9IGlwX2hkcihza2IpLT5kYWRkcjsKIAkJYnJlYWs7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgotCQlpcHY2X2FkZHJfY29weSgmaXAudS5pcDYsICZpcHY2X2hkcihza2IpLT5kYWRkcik7CisJCWlwLnUuaXA2ID0gaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CiAJCWJyZWFrOwogI2VuZGlmCiAJZGVmYXVsdDoKQEAgLTQxMSw3ICs0MTEsNyBAQAogCXJldHVybiBza2I7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIHN0cnVjdCBza19idWZmICpicl9pcDZfbXVsdGljYXN0X2FsbG9jX3F1ZXJ5KHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAkJCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmdyb3VwKQogewpAQCAtNDc0LDcgKzQ3NCw3IEBACiAJbWxkcS0+bWxkX2Nrc3VtID0gMDsKIAltbGRxLT5tbGRfbWF4ZGVsYXkgPSBodG9ucygodTE2KWppZmZpZXNfdG9fbXNlY3MoaW50ZXJ2YWwpKTsKIAltbGRxLT5tbGRfcmVzZXJ2ZWQgPSAwOwotCWlwdjZfYWRkcl9jb3B5KCZtbGRxLT5tbGRfbWNhLCBncm91cCk7CisJbWxkcS0+bWxkX21jYSA9ICpncm91cDsKIAogCS8qIGNoZWNrc3VtICovCiAJbWxkcS0+bWxkX2Nrc3VtID0gY3N1bV9pcHY2X21hZ2ljKCZpcDZoLT5zYWRkciwgJmlwNmgtPmRhZGRyLApAQCAtNDk2LDcgKzQ5Niw3IEBACiAJc3dpdGNoIChhZGRyLT5wcm90bykgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgogCQlyZXR1cm4gYnJfaXA0X211bHRpY2FzdF9hbGxvY19xdWVyeShiciwgYWRkci0+dS5pcDQpOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKIAkJcmV0dXJuIGJyX2lwNl9tdWx0aWNhc3RfYWxsb2NfcXVlcnkoYnIsICZhZGRyLT51LmlwNik7CiAjZW5kaWYKQEAgLTc3Myw3ICs3NzMsNyBAQAogCXJldHVybiBicl9tdWx0aWNhc3RfYWRkX2dyb3VwKGJyLCBwb3J0LCAmYnJfZ3JvdXApOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0YXRpYyBpbnQgYnJfaXA2X211bHRpY2FzdF9hZGRfZ3JvdXAoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAogCQkJCSAgICAgIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpncm91cCkKQEAgLTc4Myw3ICs3ODMsNyBAQAogCWlmICghaXB2Nl9pc190cmFuc2llbnRfbXVsdGljYXN0KGdyb3VwKSkKIAkJcmV0dXJuIDA7CiAKLQlpcHY2X2FkZHJfY29weSgmYnJfZ3JvdXAudS5pcDYsIGdyb3VwKTsKKwlicl9ncm91cC51LmlwNiA9ICpncm91cDsKIAlicl9ncm91cC5wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOwogCiAJcmV0dXJuIGJyX211bHRpY2FzdF9hZGRfZ3JvdXAoYnIsIHBvcnQsICZicl9ncm91cCk7CkBAIC04NDUsNyArODQ1LDcgQEAKIAlicl9ncm91cC5wcm90byA9IGh0b25zKEVUSF9QX0lQKTsKIAlfX2JyX211bHRpY2FzdF9zZW5kX3F1ZXJ5KGJyLCBwb3J0LCAmYnJfZ3JvdXApOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlicl9ncm91cC5wcm90byA9IGh0b25zKEVUSF9QX0lQVjYpOwogCV9fYnJfbXVsdGljYXN0X3NlbmRfcXVlcnkoYnIsIHBvcnQsICZicl9ncm91cCk7CiAjZW5kaWYKQEAgLTk4OSw3ICs5ODksNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIGludCBicl9pcDZfbXVsdGljYXN0X21sZDJfcmVwb3J0KHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAkJCQkJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCwKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTExODUsNyArMTE4NSw3IEBACiAJcmV0dXJuIGVycjsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgaW50IGJyX2lwNl9tdWx0aWNhc3RfcXVlcnkoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAogCQkJCSAgc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcG9ydCwKIAkJCQkgIHN0cnVjdCBza19idWZmICpza2IpCkBAIC0xMzM0LDcgKzEzMzQsNyBAQAogCWJyX211bHRpY2FzdF9sZWF2ZV9ncm91cChiciwgcG9ydCwgJmJyX2dyb3VwKTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgdm9pZCBicl9pcDZfbXVsdGljYXN0X2xlYXZlX2dyb3VwKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKIAkJCQkJIHN0cnVjdCBuZXRfYnJpZGdlX3BvcnQgKnBvcnQsCiAJCQkJCSBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmdyb3VwKQpAQCAtMTM0NCw3ICsxMzQ0LDcgQEAKIAlpZiAoIWlwdjZfaXNfdHJhbnNpZW50X211bHRpY2FzdChncm91cCkpCiAJCXJldHVybjsKIAotCWlwdjZfYWRkcl9jb3B5KCZicl9ncm91cC51LmlwNiwgZ3JvdXApOworCWJyX2dyb3VwLnUuaXA2ID0gKmdyb3VwOwogCWJyX2dyb3VwLnByb3RvID0gaHRvbnMoRVRIX1BfSVBWNik7CiAKIAlicl9tdWx0aWNhc3RfbGVhdmVfZ3JvdXAoYnIsIHBvcnQsICZicl9ncm91cCk7CkBAIC0xNDQ5LDcgKzE0NDksNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIGludCBicl9tdWx0aWNhc3RfaXB2Nl9yY3Yoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAogCQkJCSBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwb3J0LAogCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMTQ1OCw2ICsxNDU4LDcgQEAKIAljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXA2aDsKIAl1OCBpY21wNl90eXBlOwogCXU4IG5leHRoZHI7CisJX19iZTE2IGZyYWdfb2ZmOwogCXVuc2lnbmVkIGxlbjsKIAlpbnQgb2Zmc2V0OwogCWludCBlcnI7CkBAIC0xNDgzLDcgKzE0ODQsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCW5leHRoZHIgPSBpcDZoLT5uZXh0aGRyOwotCW9mZnNldCA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBzaXplb2YoKmlwNmgpLCAmbmV4dGhkcik7CisJb2Zmc2V0ID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZigqaXA2aCksICZuZXh0aGRyLCAmZnJhZ19vZmYpOwogCiAJaWYgKG9mZnNldCA8IDAgfHwgbmV4dGhkciAhPSBJUFBST1RPX0lDTVBWNikKIAkJcmV0dXJuIDA7CkBAIC0xNTk1LDcgKzE1OTYsNyBAQAogCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgogCQlyZXR1cm4gYnJfbXVsdGljYXN0X2lwdjRfcmN2KGJyLCBwb3J0LCBza2IpOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKIAkJcmV0dXJuIGJyX211bHRpY2FzdF9pcHY2X3JjdihiciwgcG9ydCwgc2tiKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYyBiL25ldC9icmlkZ2UvYnJfbmV0ZmlsdGVyLmMKaW5kZXggZDZlYzM3Mi4uODQxMjI0NyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9icl9uZXRmaWx0ZXIuYworKysgYi9uZXQvYnJpZGdlL2JyX25ldGZpbHRlci5jCkBAIC0xMTQsMTIgKzExNCwxOCBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgdW5zaWduZWQgaW50IGZha2VfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3sKKwlyZXR1cm4gZHN0LT5kZXYtPm10dTsKK30KKwogc3RhdGljIHN0cnVjdCBkc3Rfb3BzIGZha2VfZHN0X29wcyA9IHsKIAkuZmFtaWx5ID0JCUFGX0lORVQsCiAJLnByb3RvY29sID0JCWNwdV90b19iZTE2KEVUSF9QX0lQKSwKIAkudXBkYXRlX3BtdHUgPQkJZmFrZV91cGRhdGVfcG10dSwKIAkuY293X21ldHJpY3MgPQkJZmFrZV9jb3dfbWV0cmljcywKIAkubmVpZ2hfbG9va3VwID0JCWZha2VfbmVpZ2hfbG9va3VwLAorCS5tdHUgPQkJCWZha2VfbXR1LAogfTsKIAogLyoKQEAgLTE0MSw3ICsxNDcsNyBAQAogCXJ0LT5kc3QuZGV2ID0gYnItPmRldjsKIAlydC0+ZHN0LnBhdGggPSAmcnQtPmRzdDsKIAlkc3RfaW5pdF9tZXRyaWNzKCZydC0+ZHN0LCBicl9kc3RfZGVmYXVsdF9tZXRyaWNzLCB0cnVlKTsKLQlydC0+ZHN0LmZsYWdzCT0gRFNUX05PWEZSTTsKKwlydC0+ZHN0LmZsYWdzCT0gRFNUX05PWEZSTSB8IERTVF9OT1BFRVI7CiAJcnQtPmRzdC5vcHMgPSAmZmFrZV9kc3Rfb3BzOwogfQogCkBAIC0zNTYsNyArMzYyLDcgQEAKIAlpZiAoIXNrYi0+ZGV2KQogCQlnb3RvIGZyZWVfc2tiOwogCWRzdCA9IHNrYl9kc3Qoc2tiKTsKLQluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKGRzdCk7CisJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZihkc3QpOwogCWlmIChuZWlnaC0+aGguaGhfbGVuKSB7CiAJCW5laWdoX2hoX2JyaWRnZSgmbmVpZ2gtPmhoLCBza2IpOwogCQlza2ItPmRldiA9IG5mX2JyaWRnZS0+cGh5c2luZGV2OwpAQCAtODA3LDcgKzgxMyw3IEBACiAJcmV0dXJuIE5GX1NUT0xFTjsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19JUFY0KSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNF9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjQpCiBzdGF0aWMgaW50IGJyX25mX2Rldl9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jIGIvbmV0L2JyaWRnZS9icl9uZXRsaW5rLmMKaW5kZXggZTVmOWVjZTMuLmExZGFmODIgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCisrKyBiL25ldC9icmlkZ2UvYnJfbmV0bGluay5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8bmV0L3NvY2suaD4KIAogI2luY2x1ZGUgImJyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJicl9wcml2YXRlX3N0cC5oIgogCiBzdGF0aWMgaW5saW5lIHNpemVfdCBicl9ubG1zZ19zaXplKHZvaWQpCiB7CkBAIC0xODgsNiArMTg5LDExIEBACiAKIAlwLT5zdGF0ZSA9IG5ld19zdGF0ZTsKIAlicl9sb2dfc3RhdGUocCk7CisKKwlzcGluX2xvY2tfYmgoJnAtPmJyLT5sb2NrKTsKKwlicl9wb3J0X3N0YXRlX3NlbGVjdGlvbihwLT5icik7CisJc3Bpbl91bmxvY2tfYmgoJnAtPmJyLT5sb2NrKTsKKwogCWJyX2lmaW5mb19ub3RpZnkoUlRNX05FV0xJTkssIHApOwogCiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3ByaXZhdGUuaCBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCmluZGV4IGQ3ZDZmYjAuLjBiNjdhNjMgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCisrKyBiL25ldC9icmlkZ2UvYnJfcHJpdmF0ZS5oCkBAIC01Niw3ICs1Niw3IEBACiB7CiAJdW5pb24gewogCQlfX2JlMzIJaXA0OwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCXN0cnVjdCBpbjZfYWRkciBpcDY7CiAjZW5kaWYKIAl9IHU7CkBAIC0zNDgsNiArMzQ4LDcgQEAKIGV4dGVybiB2b2lkIGJyX2ZkYl9mbHVzaChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIpOwogZXh0ZXJuIHZvaWQgYnJfZmRiX2NoYW5nZWFkZHIoc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcCwKIAkJCSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm5ld2FkZHIpOworZXh0ZXJuIHZvaWQgYnJfZmRiX2NoYW5nZV9tYWNfYWRkcmVzcyhzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIGNvbnN0IHU4ICpuZXdhZGRyKTsKIGV4dGVybiB2b2lkIGJyX2ZkYl9jbGVhbnVwKHVuc2lnbmVkIGxvbmcgYXJnKTsKIGV4dGVybiB2b2lkIGJyX2ZkYl9kZWxldGVfYnlfcG9ydChzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsCiAJCQkJICBjb25zdCBzdHJ1Y3QgbmV0X2JyaWRnZV9wb3J0ICpwLCBpbnQgZG9fYWxsKTsKQEAgLTM4Nyw3ICszODgsOCBAQAogZXh0ZXJuIGludCBicl9kZWxfaWYoc3RydWN0IG5ldF9icmlkZ2UgKmJyLAogCSAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogZXh0ZXJuIGludCBicl9taW5fbXR1KGNvbnN0IHN0cnVjdCBuZXRfYnJpZGdlICpicik7Ci1leHRlcm4gdTMyIGJyX2ZlYXR1cmVzX3JlY29tcHV0ZShzdHJ1Y3QgbmV0X2JyaWRnZSAqYnIsIHUzMiBmZWF0dXJlcyk7CitleHRlcm4gbmV0ZGV2X2ZlYXR1cmVzX3QgYnJfZmVhdHVyZXNfcmVjb21wdXRlKHN0cnVjdCBuZXRfYnJpZGdlICpiciwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcyk7CiAKIC8qIGJyX2lucHV0LmMgKi8KIGV4dGVybiBpbnQgYnJfaGFuZGxlX2ZyYW1lX2ZpbmlzaChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTUzNSw3ICs1MzcsNyBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYnJfdGltZXJfdmFsdWUoY29uc3Qgc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKTsKIAogLyogYnIuYyAqLwotI2lmIGRlZmluZWQoQ09ORklHX0FUTV9MQU5FKSB8fCBkZWZpbmVkKENPTkZJR19BVE1fTEFORV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQVRNX0xBTkUpCiBleHRlcm4gaW50ICgqYnJfZmRiX3Rlc3RfYWRkcl9ob29rKShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBjaGFyICphZGRyKTsKICNlbmRpZgogCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL2JyX3N0cC5jIGIvbmV0L2JyaWRnZS9icl9zdHAuYwppbmRleCBhZDBhM2Y3Li5kZDE0N2Q3IDEwMDY0NAotLS0gYS9uZXQvYnJpZGdlL2JyX3N0cC5jCisrKyBiL25ldC9icmlkZ2UvYnJfc3RwLmMKQEAgLTM5OSwyNSArMzk5LDI0IEBACiAJc3RydWN0IG5ldF9icmlkZ2VfcG9ydCAqcDsKIAl1bnNpZ25lZCBpbnQgbGl2ZXBvcnRzID0gMDsKIAotCS8qIERvbid0IGNoYW5nZSBwb3J0IHN0YXRlcyBpZiB1c2Vyc3BhY2UgaXMgaGFuZGxpbmcgU1RQICovCi0JaWYgKGJyLT5zdHBfZW5hYmxlZCA9PSBCUl9VU0VSX1NUUCkKLQkJcmV0dXJuOwotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmYnItPnBvcnRfbGlzdCwgbGlzdCkgewogCQlpZiAocC0+c3RhdGUgPT0gQlJfU1RBVEVfRElTQUJMRUQpCiAJCQljb250aW51ZTsKIAotCQlpZiAocC0+cG9ydF9ubyA9PSBici0+cm9vdF9wb3J0KSB7Ci0JCQlwLT5jb25maWdfcGVuZGluZyA9IDA7Ci0JCQlwLT50b3BvbG9neV9jaGFuZ2VfYWNrID0gMDsKLQkJCWJyX21ha2VfZm9yd2FyZGluZyhwKTsKLQkJfSBlbHNlIGlmIChicl9pc19kZXNpZ25hdGVkX3BvcnQocCkpIHsKLQkJCWRlbF90aW1lcigmcC0+bWVzc2FnZV9hZ2VfdGltZXIpOwotCQkJYnJfbWFrZV9mb3J3YXJkaW5nKHApOwotCQl9IGVsc2UgewotCQkJcC0+Y29uZmlnX3BlbmRpbmcgPSAwOwotCQkJcC0+dG9wb2xvZ3lfY2hhbmdlX2FjayA9IDA7Ci0JCQlicl9tYWtlX2Jsb2NraW5nKHApOworCQkvKiBEb24ndCBjaGFuZ2UgcG9ydCBzdGF0ZXMgaWYgdXNlcnNwYWNlIGlzIGhhbmRsaW5nIFNUUCAqLworCQlpZiAoYnItPnN0cF9lbmFibGVkICE9IEJSX1VTRVJfU1RQKSB7CisJCQlpZiAocC0+cG9ydF9ubyA9PSBici0+cm9vdF9wb3J0KSB7CisJCQkJcC0+Y29uZmlnX3BlbmRpbmcgPSAwOworCQkJCXAtPnRvcG9sb2d5X2NoYW5nZV9hY2sgPSAwOworCQkJCWJyX21ha2VfZm9yd2FyZGluZyhwKTsKKwkJCX0gZWxzZSBpZiAoYnJfaXNfZGVzaWduYXRlZF9wb3J0KHApKSB7CisJCQkJZGVsX3RpbWVyKCZwLT5tZXNzYWdlX2FnZV90aW1lcik7CisJCQkJYnJfbWFrZV9mb3J3YXJkaW5nKHApOworCQkJfSBlbHNlIHsKKwkJCQlwLT5jb25maWdfcGVuZGluZyA9IDA7CisJCQkJcC0+dG9wb2xvZ3lfY2hhbmdlX2FjayA9IDA7CisJCQkJYnJfbWFrZV9ibG9ja2luZyhwKTsKKwkJCX0KIAkJfQogCiAJCWlmIChwLT5zdGF0ZSA9PSBCUl9TVEFURV9GT1JXQVJESU5HKQpkaWZmIC0tZ2l0IGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwNi5jIGIvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2lwNi5jCmluZGV4IDJlZDAwNTYuLjk5Yzg1NjYgMTAwNjQ0Ci0tLSBhL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9pcDYuYworKysgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfaXA2LmMKQEAgLTU1LDkgKzU1LDEwIEBACiAJCXJldHVybiBmYWxzZTsKIAlpZiAoaW5mby0+Yml0bWFzayAmIEVCVF9JUDZfUFJPVE8pIHsKIAkJdWludDhfdCBuZXh0aGRyID0gaWg2LT5uZXh0aGRyOworCQlfX2JlMTYgZnJhZ19vZmY7CiAJCWludCBvZmZzZXRfcGg7CiAKLQkJb2Zmc2V0X3BoID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZihfaXA2aCksICZuZXh0aGRyKTsKKwkJb2Zmc2V0X3BoID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZihfaXA2aCksICZuZXh0aGRyLCAmZnJhZ19vZmYpOwogCQlpZiAob2Zmc2V0X3BoID09IC0xKQogCQkJcmV0dXJuIGZhbHNlOwogCQlpZiAoRldJTlYoaW5mby0+cHJvdG9jb2wgIT0gbmV4dGhkciwgRUJUX0lQNl9QUk9UTykpCmRpZmYgLS1naXQgYS9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMgYi9uZXQvYnJpZGdlL25ldGZpbHRlci9lYnRfbG9nLmMKaW5kZXggNmU1YThiYi4uZjg4ZWU1MyAxMDA2NDQKLS0tIGEvbmV0L2JyaWRnZS9uZXRmaWx0ZXIvZWJ0X2xvZy5jCisrKyBiL25ldC9icmlkZ2UvbmV0ZmlsdGVyL2VidF9sb2cuYwpAQCAtMTA3LDEyICsxMDcsMTMgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0jaWYgZGVmaW5lZChDT05GSUdfQlJJREdFX0VCVF9JUDYpIHx8IGRlZmluZWQoQ09ORklHX0JSSURHRV9FQlRfSVA2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19CUklER0VfRUJUX0lQNikKIAlpZiAoKGJpdG1hc2sgJiBFQlRfTE9HX0lQNikgJiYgZXRoX2hkcihza2IpLT5oX3Byb3RvID09CiAJICAgaHRvbnMoRVRIX1BfSVBWNikpIHsKIAkJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmloOwogCQlzdHJ1Y3QgaXB2NmhkciBfaXBoOwogCQl1aW50OF90IG5leHRoZHI7CisJCV9fYmUxNiBmcmFnX29mZjsKIAkJaW50IG9mZnNldF9waDsKIAogCQlpaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIDAsIHNpemVvZihfaXBoKSwgJl9pcGgpOwpAQCAtMTIzLDcgKzEyNCw3IEBACiAJCXByaW50aygiIElQdjYgU1JDPSVwSTYgSVB2NiBEU1Q9JXBJNiwgSVB2NiBwcmlvcml0eT0weCUwMVgsIE5leHQgSGVhZGVyPSVkIiwKIAkJICAgICAgICZpaC0+c2FkZHIsICZpaC0+ZGFkZHIsIGloLT5wcmlvcml0eSwgaWgtPm5leHRoZHIpOwogCQluZXh0aGRyID0gaWgtPm5leHRoZHI7Ci0JCW9mZnNldF9waCA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBzaXplb2YoX2lwaCksICZuZXh0aGRyKTsKKwkJb2Zmc2V0X3BoID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZihfaXBoKSwgJm5leHRoZHIsICZmcmFnX29mZik7CiAJCWlmIChvZmZzZXRfcGggPT0gLTEpCiAJCQlnb3RvIG91dDsKIAkJcHJpbnRfcG9ydHMoc2tiLCBuZXh0aGRyLCBvZmZzZXRfcGgpOwpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvS2NvbmZpZyBiL25ldC9jYWlmL0tjb25maWcKaW5kZXggNTI5NzUwZC4uOTM2MzYxZSAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvS2NvbmZpZworKysgYi9uZXQvY2FpZi9LY29uZmlnCkBAIC00MCwzICs0MCwxNCBAQAogCUlmIHlvdSBzZWxlY3QgdG8gYnVpbGQgaXQgYXMgYSBidWlsdC1pbiB0aGVuIHRoZSBtYWluIENBSUYgZGV2aWNlIG11c3QKIAlhbHNvIGJlIGEgYnVpbHQtaW4uCiAJSWYgdW5zdXJlIHNheSBZLgorCitjb25maWcgQ0FJRl9VU0IKKwl0cmlzdGF0ZSAiQ0FJRiBVU0Igc3VwcG9ydCIKKwlkZXBlbmRzIG9uIENBSUYKKwlkZWZhdWx0IG4KKwktLS1oZWxwLS0tCisJU2F5IFkgaWYgeW91IGFyZSB1c2luZyBDQUlGIG92ZXIgVVNCIENEQyBOQ00uCisJVGhpcyBjYW4gYmUgZWl0aGVyIGJ1aWx0LWluIG9yIGEgbG9hZGFibGUgbW9kdWxlLAorCUlmIHlvdSBzZWxlY3QgdG8gYnVpbGQgaXQgYXMgYSBidWlsdC1pbiB0aGVuIHRoZSBtYWluIENBSUYgZGV2aWNlIG11c3QKKwlhbHNvIGJlIGEgYnVpbHQtaW4uCisJSWYgdW5zdXJlIHNheSBOLgpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvTWFrZWZpbGUgYi9uZXQvY2FpZi9NYWtlZmlsZQppbmRleCBlYmNkNGU3Li5jYzJiNTExIDEwMDY0NAotLS0gYS9uZXQvY2FpZi9NYWtlZmlsZQorKysgYi9uZXQvY2FpZi9NYWtlZmlsZQpAQCAtMTAsNSArMTAsNiBAQAogb2JqLSQoQ09ORklHX0NBSUYpICs9IGNhaWYubwogb2JqLSQoQ09ORklHX0NBSUZfTkVUREVWKSArPSBjaG5sX25ldC5vCiBvYmotJChDT05GSUdfQ0FJRikgKz0gY2FpZl9zb2NrZXQubworb2JqLSQoQ09ORklHX0NBSUZfVVNCKSArPSBjYWlmX3VzYi5vCiAKIGV4cG9ydC15IDo9IGNhaWYubwpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2FpZl9kZXYuYyBiL25ldC9jYWlmL2NhaWZfZGV2LmMKaW5kZXggZjFmYTFmNi4uYjBjZTE0ZiAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2FpZl9kZXYuYworKysgYi9uZXQvY2FpZi9jYWlmX2Rldi5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPG5ldC9uZXRucy9nZW5lcmljLmg+CiAjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CkBAIC0yNCw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bmV0L2NhaWYvY2FpZl9sYXllci5oPgogI2luY2x1ZGUgPG5ldC9jYWlmL2NmcGt0Lmg+CiAjaW5jbHVkZSA8bmV0L2NhaWYvY2ZjbmZnLmg+CisjaW5jbHVkZSA8bmV0L2NhaWYvY2ZzZXJsLmg+CiAKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIApAQCAtMzMsNiArMzUsMTAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiAJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKIAlpbnQgX19wZXJjcHUgKnBjcHVfcmVmY250OworCXNwaW5sb2NrX3QgZmxvd19sb2NrOworCXN0cnVjdCBza19idWZmICp4b2ZmX3NrYjsKKwl2b2lkICgqeG9mZl9za2JfZHRvcikoc3RydWN0IHNrX2J1ZmYgKnNrYik7CisJYm9vbCB4b2ZmOwogfTsKIAogc3RydWN0IGNhaWZfZGV2aWNlX2VudHJ5X2xpc3QgewpAQCAtNDcsMTMgKzUzLDE0IEBACiB9OwogCiBzdGF0aWMgaW50IGNhaWZfbmV0X2lkOworc3RhdGljIGludCBxX2hpZ2ggPSA1MDsgLyogUGVyY2VudCAqLwogCiBzdHJ1Y3QgY2ZjbmZnICpnZXRfY2ZjbmZnKHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgY2FpZl9uZXQgKmNhaWZuOwotCUJVR19PTighbmV0KTsKIAljYWlmbiA9IG5ldF9nZW5lcmljKG5ldCwgY2FpZl9uZXRfaWQpOwotCUJVR19PTighY2FpZm4pOworCWlmICghY2FpZm4pCisJCXJldHVybiBOVUxMOwogCXJldHVybiBjYWlmbi0+Y2ZnOwogfQogRVhQT1JUX1NZTUJPTChnZXRfY2ZjbmZnKTsKQEAgLTYxLDkgKzY4LDkgQEAKIHN0YXRpYyBzdHJ1Y3QgY2FpZl9kZXZpY2VfZW50cnlfbGlzdCAqY2FpZl9kZXZpY2VfbGlzdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJc3RydWN0IGNhaWZfbmV0ICpjYWlmbjsKLQlCVUdfT04oIW5ldCk7CiAJY2FpZm4gPSBuZXRfZ2VuZXJpYyhuZXQsIGNhaWZfbmV0X2lkKTsKLQlCVUdfT04oIWNhaWZuKTsKKwlpZiAoIWNhaWZuKQorCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gJmNhaWZuLT5jYWlmZGV2czsKIH0KIApAQCAtOTIsNyArOTksOCBAQAogCXN0cnVjdCBjYWlmX2RldmljZV9lbnRyeSAqY2FpZmQ7CiAKIAljYWlmZGV2cyA9IGNhaWZfZGV2aWNlX2xpc3QoZGV2X25ldChkZXYpKTsKLQlCVUdfT04oIWNhaWZkZXZzKTsKKwlpZiAoIWNhaWZkZXZzKQorCQlyZXR1cm4gTlVMTDsKIAogCWNhaWZkID0ga3phbGxvYyhzaXplb2YoKmNhaWZkKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFjYWlmZCkKQEAgLTExMiw3ICsxMjAsOSBAQAogCXN0cnVjdCBjYWlmX2RldmljZV9lbnRyeV9saXN0ICpjYWlmZGV2cyA9CiAJICAgIGNhaWZfZGV2aWNlX2xpc3QoZGV2X25ldChkZXYpKTsKIAlzdHJ1Y3QgY2FpZl9kZXZpY2VfZW50cnkgKmNhaWZkOwotCUJVR19PTighY2FpZmRldnMpOworCWlmICghY2FpZmRldnMpCisJCXJldHVybiBOVUxMOworCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY2FpZmQsICZjYWlmZGV2cy0+bGlzdCwgbGlzdCkgewogCQlpZiAoY2FpZmQtPm5ldGRldiA9PSBkZXYpCiAJCQlyZXR1cm4gY2FpZmQ7CkBAIC0xMjAsMTUgKzEzMCwxMDYgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAordm9pZCBjYWlmX2Zsb3dfY2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgY2FpZl9kZXZpY2VfZW50cnkgKmNhaWZkOworCXZvaWQgKCpkdG9yKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKSA9IE5VTEw7CisJYm9vbCBzZW5kX3hvZmY7CisKKwlXQVJOX09OKHNrYi0+ZGV2ID09IE5VTEwpOworCisJcmN1X3JlYWRfbG9jaygpOworCWNhaWZkID0gY2FpZl9nZXQoc2tiLT5kZXYpOworCWNhaWZkX2hvbGQoY2FpZmQpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJc3Bpbl9sb2NrX2JoKCZjYWlmZC0+Zmxvd19sb2NrKTsKKwlzZW5kX3hvZmYgPSBjYWlmZC0+eG9mZjsKKwljYWlmZC0+eG9mZiA9IDA7CisJaWYgKCFXQVJOX09OKGNhaWZkLT54b2ZmX3NrYl9kdG9yID09IE5VTEwpKSB7CisJCVdBUk5fT04oY2FpZmQtPnhvZmZfc2tiICE9IHNrYik7CisJCWR0b3IgPSBjYWlmZC0+eG9mZl9za2JfZHRvcjsKKwkJY2FpZmQtPnhvZmZfc2tiID0gTlVMTDsKKwkJY2FpZmQtPnhvZmZfc2tiX2R0b3IgPSBOVUxMOworCX0KKwlzcGluX3VubG9ja19iaCgmY2FpZmQtPmZsb3dfbG9jayk7CisKKwlpZiAoZHRvcikKKwkJZHRvcihza2IpOworCisJaWYgKHNlbmRfeG9mZikKKwkJY2FpZmQtPmxheWVyLnVwLT4KKwkJCWN0cmxjbWQoY2FpZmQtPmxheWVyLnVwLAorCQkJCV9DQUlGX0NUUkxDTURfUEhZSUZfRkxPV19PTl9JTkQsCisJCQkJY2FpZmQtPmxheWVyLmlkKTsKKwljYWlmZF9wdXQoY2FpZmQpOworfQorCiBzdGF0aWMgaW50IHRyYW5zbWl0KHN0cnVjdCBjZmxheWVyICpsYXllciwgc3RydWN0IGNmcGt0ICpwa3QpCiB7Ci0JaW50IGVycjsKKwlpbnQgZXJyLCBoaWdoID0gMCwgcWxlbiA9IDA7CisJc3RydWN0IGNhaWZfZGV2X2NvbW1vbiAqY2FpZmRldjsKIAlzdHJ1Y3QgY2FpZl9kZXZpY2VfZW50cnkgKmNhaWZkID0KIAkgICAgY29udGFpbmVyX29mKGxheWVyLCBzdHJ1Y3QgY2FpZl9kZXZpY2VfZW50cnksIGxheWVyKTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cTsKKworCXJjdV9yZWFkX2xvY2tfYmgoKTsKIAogCXNrYiA9IGNmcGt0X3RvbmF0aXZlKHBrdCk7CiAJc2tiLT5kZXYgPSBjYWlmZC0+bmV0ZGV2OworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9DQUlGKTsKKwljYWlmZGV2ID0gbmV0ZGV2X3ByaXYoY2FpZmQtPm5ldGRldik7CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRvIGhhbmRsZSB4b2ZmICovCisJaWYgKGxpa2VseShjYWlmZC0+bmV0ZGV2LT50eF9xdWV1ZV9sZW4gPT0gMCkpCisJCWdvdG8gbm94b2ZmOworCisJaWYgKHVubGlrZWx5KGNhaWZkLT54b2ZmKSkKKwkJZ290byBub3hvZmY7CisKKwlpZiAobGlrZWx5KCFuZXRpZl9xdWV1ZV9zdG9wcGVkKGNhaWZkLT5uZXRkZXYpKSkgeworCQkvKiBJZiB3ZSBydW4gd2l0aCBhIFRYIHF1ZXVlLCBjaGVjayBpZiB0aGUgcXVldWUgaXMgdG9vIGxvbmcqLworCQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHNrYi0+ZGV2LCAwKTsKKwkJcWxlbiA9IHFkaXNjX3FsZW4ocmN1X2RlcmVmZXJlbmNlX2JoKHR4cS0+cWRpc2MpKTsKKworCQlpZiAobGlrZWx5KHFsZW4gPT0gMCkpCisJCQlnb3RvIG5veG9mZjsKKworCQloaWdoID0gKGNhaWZkLT5uZXRkZXYtPnR4X3F1ZXVlX2xlbiAqIHFfaGlnaCkgLyAxMDA7CisJCWlmIChsaWtlbHkocWxlbiA8IGhpZ2gpKQorCQkJZ290byBub3hvZmY7CisJfQorCisJLyogSG9sZCBsb2NrIHdoaWxlIGFjY2Vzc2luZyB4b2ZmICovCisJc3Bpbl9sb2NrX2JoKCZjYWlmZC0+Zmxvd19sb2NrKTsKKwlpZiAoY2FpZmQtPnhvZmYpIHsKKwkJc3Bpbl91bmxvY2tfYmgoJmNhaWZkLT5mbG93X2xvY2spOworCQlnb3RvIG5veG9mZjsKKwl9CisKKwkvKgorCSAqIEhhbmRsZSBmbG93IG9mZiwgd2UgZG8gdGhpcyBieSB0ZW1wb3JhcnkgaGktamFja2luZyB0aGlzCisJICogc2tiJ3MgZGVzdHJ1Y3RvciBmdW5jdGlvbiwgYW5kIHJlcGxhY2UgaXQgd2l0aCBvdXIgb3duCisJICogZmxvdy1vbiBjYWxsYmFjay4gVGhlIGNhbGxiYWNrIHdpbGwgc2V0IGZsb3ctb24gYW5kIGNhbGwKKwkgKiB0aGUgb3JpZ2luYWwgZGVzdHJ1Y3Rvci4KKwkgKi8KKworCXByX2RlYnVnKCJxdWV1ZSBoYXMgc3RvcHBlZCglZCkgb3IgaXMgZnVsbCAoJWQgPiAlZClcbiIsCisJCQluZXRpZl9xdWV1ZV9zdG9wcGVkKGNhaWZkLT5uZXRkZXYpLAorCQkJcWxlbiwgaGlnaCk7CisJY2FpZmQtPnhvZmYgPSAxOworCWNhaWZkLT54b2ZmX3NrYiA9IHNrYjsKKwljYWlmZC0+eG9mZl9za2JfZHRvciA9IHNrYi0+ZGVzdHJ1Y3RvcjsKKwlza2ItPmRlc3RydWN0b3IgPSBjYWlmX2Zsb3dfY2I7CisJc3Bpbl91bmxvY2tfYmgoJmNhaWZkLT5mbG93X2xvY2spOworCisJY2FpZmQtPmxheWVyLnVwLT5jdHJsY21kKGNhaWZkLT5sYXllci51cCwKKwkJCQkJX0NBSUZfQ1RSTENNRF9QSFlJRl9GTE9XX09GRl9JTkQsCisJCQkJCWNhaWZkLT5sYXllci5pZCk7Citub3hvZmY6CisJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CiAKIAllcnIgPSBkZXZfcXVldWVfeG1pdChza2IpOwogCWlmIChlcnIgPiAwKQpAQCAtMTcyLDcgKzI3MywxMCBAQAogCiAJLyogUmVsZWFzZSByZWZlcmVuY2UgdG8gc3RhY2sgdXB3YXJkcyAqLwogCWNhaWZkX3B1dChjYWlmZCk7Ci0JcmV0dXJuIDA7CisKKwlpZiAoZXJyICE9IDApCisJCWVyciA9IE5FVF9SWF9EUk9QOworCXJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgY2FpZl9wYWNrZXRfdHlwZSBfX3JlYWRfbW9zdGx5ID0gewpAQCAtMjAzLDYgKzMwNyw1NyBAQAogCWNhaWZkX3B1dChjYWlmZCk7CiB9CiAKK3ZvaWQgY2FpZl9lbnJvbGxfZGV2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBjYWlmX2Rldl9jb21tb24gKmNhaWZkZXYsCisJCQlzdHJ1Y3QgY2ZsYXllciAqbGlua19zdXBwb3J0LCBpbnQgaGVhZF9yb29tLAorCQkJc3RydWN0IGNmbGF5ZXIgKipsYXllciwgaW50ICgqKnJjdl9mdW5jKSgKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqLAorCQkJCXN0cnVjdCBwYWNrZXRfdHlwZSAqLCBzdHJ1Y3QgbmV0X2RldmljZSAqKSkKK3sKKwlzdHJ1Y3QgY2FpZl9kZXZpY2VfZW50cnkgKmNhaWZkOworCWVudW0gY2ZjbmZnX3BoeV9wcmVmZXJlbmNlIHByZWY7CisJc3RydWN0IGNmY25mZyAqY2ZnID0gZ2V0X2NmY25mZyhkZXZfbmV0KGRldikpOworCXN0cnVjdCBjYWlmX2RldmljZV9lbnRyeV9saXN0ICpjYWlmZGV2czsKKworCWNhaWZkZXZzID0gY2FpZl9kZXZpY2VfbGlzdChkZXZfbmV0KGRldikpOworCWlmICghY2ZnIHx8ICFjYWlmZGV2cykKKwkJcmV0dXJuOworCWNhaWZkID0gY2FpZl9kZXZpY2VfYWxsb2MoZGV2KTsKKwlpZiAoIWNhaWZkKQorCQlyZXR1cm47CisJKmxheWVyID0gJmNhaWZkLT5sYXllcjsKKwlzcGluX2xvY2tfaW5pdCgmY2FpZmQtPmZsb3dfbG9jayk7CisKKwlzd2l0Y2ggKGNhaWZkZXYtPmxpbmtfc2VsZWN0KSB7CisJY2FzZSBDQUlGX0xJTktfSElHSF9CQU5EVzoKKwkJcHJlZiA9IENGUEhZUFJFRl9ISUdIX0JXOworCQlicmVhazsKKwljYXNlIENBSUZfTElOS19MT1dfTEFURU5DWToKKwkJcHJlZiA9IENGUEhZUFJFRl9MT1dfTEFUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmVmID0gQ0ZQSFlQUkVGX0hJR0hfQlc7CisJCWJyZWFrOworCX0KKwltdXRleF9sb2NrKCZjYWlmZGV2cy0+bG9jayk7CisJbGlzdF9hZGRfcmN1KCZjYWlmZC0+bGlzdCwgJmNhaWZkZXZzLT5saXN0KTsKKworCXN0cm5jcHkoY2FpZmQtPmxheWVyLm5hbWUsIGRldi0+bmFtZSwKKwkJc2l6ZW9mKGNhaWZkLT5sYXllci5uYW1lKSAtIDEpOworCWNhaWZkLT5sYXllci5uYW1lW3NpemVvZihjYWlmZC0+bGF5ZXIubmFtZSkgLSAxXSA9IDA7CisJY2FpZmQtPmxheWVyLnRyYW5zbWl0ID0gdHJhbnNtaXQ7CisJY2ZjbmZnX2FkZF9waHlfbGF5ZXIoY2ZnLAorCQkJCWRldiwKKwkJCQkmY2FpZmQtPmxheWVyLAorCQkJCXByZWYsCisJCQkJbGlua19zdXBwb3J0LAorCQkJCWNhaWZkZXYtPnVzZV9mY3MsCisJCQkJaGVhZF9yb29tKTsKKwltdXRleF91bmxvY2soJmNhaWZkZXZzLT5sb2NrKTsKKwlpZiAocmN2X2Z1bmMpCisJCSpyY3ZfZnVuYyA9IHJlY2VpdmU7Cit9CitFWFBPUlRfU1lNQk9MKGNhaWZfZW5yb2xsX2Rldik7CisKIC8qIG5vdGlmeSBDYWlmIG9mIGRldmljZSBldmVudHMgKi8KIHN0YXRpYyBpbnQgY2FpZl9kZXZpY2Vfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqbWUsIHVuc2lnbmVkIGxvbmcgd2hhdCwKIAkJCSAgICAgIHZvaWQgKmFyZykKQEAgLTIxMCw2MiArMzY1LDQwIEBACiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFyZzsKIAlzdHJ1Y3QgY2FpZl9kZXZpY2VfZW50cnkgKmNhaWZkID0gTlVMTDsKIAlzdHJ1Y3QgY2FpZl9kZXZfY29tbW9uICpjYWlmZGV2OwotCWVudW0gY2ZjbmZnX3BoeV9wcmVmZXJlbmNlIHByZWY7Ci0JZW51bSBjZmNuZmdfcGh5X3R5cGUgcGh5X3R5cGU7CiAJc3RydWN0IGNmY25mZyAqY2ZnOworCXN0cnVjdCBjZmxheWVyICpsYXllciwgKmxpbmtfc3VwcG9ydDsKKwlpbnQgaGVhZF9yb29tID0gMDsKIAlzdHJ1Y3QgY2FpZl9kZXZpY2VfZW50cnlfbGlzdCAqY2FpZmRldnM7CiAKLQlpZiAoZGV2LT50eXBlICE9IEFSUEhSRF9DQUlGKQotCQlyZXR1cm4gMDsKLQogCWNmZyA9IGdldF9jZmNuZmcoZGV2X25ldChkZXYpKTsKLQlpZiAoY2ZnID09IE5VTEwpCisJY2FpZmRldnMgPSBjYWlmX2RldmljZV9saXN0KGRldl9uZXQoZGV2KSk7CisJaWYgKCFjZmcgfHwgIWNhaWZkZXZzKQogCQlyZXR1cm4gMDsKIAotCWNhaWZkZXZzID0gY2FpZl9kZXZpY2VfbGlzdChkZXZfbmV0KGRldikpOworCWNhaWZkID0gY2FpZl9nZXQoZGV2KTsKKwlpZiAoY2FpZmQgPT0gTlVMTCAmJiBkZXYtPnR5cGUgIT0gQVJQSFJEX0NBSUYpCisJCXJldHVybiAwOwogCiAJc3dpdGNoICh3aGF0KSB7CiAJY2FzZSBORVRERVZfUkVHSVNURVI6Ci0JCWNhaWZkID0gY2FpZl9kZXZpY2VfYWxsb2MoZGV2KTsKLQkJaWYgKCFjYWlmZCkKLQkJCXJldHVybiAwOworCQlpZiAoY2FpZmQgIT0gTlVMTCkKKwkJCWJyZWFrOwogCiAJCWNhaWZkZXYgPSBuZXRkZXZfcHJpdihkZXYpOwotCQljYWlmZGV2LT5mbG93Y3RybCA9IGRldl9mbG93Y3RybDsKIAotCQljYWlmZC0+bGF5ZXIudHJhbnNtaXQgPSB0cmFuc21pdDsKLQotCQlpZiAoY2FpZmRldi0+dXNlX2ZyYWcpCi0JCQlwaHlfdHlwZSA9IENGUEhZVFlQRV9GUkFHOwotCQllbHNlCi0JCQlwaHlfdHlwZSA9IENGUEhZVFlQRV9DQUlGOwotCi0JCXN3aXRjaCAoY2FpZmRldi0+bGlua19zZWxlY3QpIHsKLQkJY2FzZSBDQUlGX0xJTktfSElHSF9CQU5EVzoKLQkJCXByZWYgPSBDRlBIWVBSRUZfSElHSF9CVzsKLQkJCWJyZWFrOwotCQljYXNlIENBSUZfTElOS19MT1dfTEFURU5DWToKLQkJCXByZWYgPSBDRlBIWVBSRUZfTE9XX0xBVDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcHJlZiA9IENGUEhZUFJFRl9ISUdIX0JXOwotCQkJYnJlYWs7CisJCWxpbmtfc3VwcG9ydCA9IE5VTEw7CisJCWlmIChjYWlmZGV2LT51c2VfZnJhZykgeworCQkJaGVhZF9yb29tID0gMTsKKwkJCWxpbmtfc3VwcG9ydCA9IGNmc2VybF9jcmVhdGUoZGV2LT5pZmluZGV4LAorCQkJCQkJCWNhaWZkZXYtPnVzZV9zdHgpOworCQkJaWYgKCFsaW5rX3N1cHBvcnQpIHsKKwkJCQlwcl93YXJuKCJPdXQgb2YgbWVtb3J5XG4iKTsKKwkJCQlicmVhazsKKwkJCX0KIAkJfQotCQlzdHJuY3B5KGNhaWZkLT5sYXllci5uYW1lLCBkZXYtPm5hbWUsCi0JCQlzaXplb2YoY2FpZmQtPmxheWVyLm5hbWUpIC0gMSk7Ci0JCWNhaWZkLT5sYXllci5uYW1lW3NpemVvZihjYWlmZC0+bGF5ZXIubmFtZSkgLSAxXSA9IDA7Ci0KLQkJbXV0ZXhfbG9jaygmY2FpZmRldnMtPmxvY2spOwotCQlsaXN0X2FkZF9yY3UoJmNhaWZkLT5saXN0LCAmY2FpZmRldnMtPmxpc3QpOwotCi0JCWNmY25mZ19hZGRfcGh5X2xheWVyKGNmZywKLQkJCQkgICAgIHBoeV90eXBlLAotCQkJCSAgICAgZGV2LAotCQkJCSAgICAgJmNhaWZkLT5sYXllciwKLQkJCQkgICAgIHByZWYsCi0JCQkJICAgICBjYWlmZGV2LT51c2VfZmNzLAotCQkJCSAgICAgY2FpZmRldi0+dXNlX3N0eCk7Ci0JCW11dGV4X3VubG9jaygmY2FpZmRldnMtPmxvY2spOworCQljYWlmX2Vucm9sbF9kZXYoZGV2LCBjYWlmZGV2LCBsaW5rX3N1cHBvcnQsIGhlYWRfcm9vbSwKKwkJCQkmbGF5ZXIsIE5VTEwpOworCQljYWlmZGV2LT5mbG93Y3RybCA9IGRldl9mbG93Y3RybDsKIAkJYnJlYWs7CiAKIAljYXNlIE5FVERFVl9VUDoKQEAgLTI3Nyw2ICs0MTAsNyBAQAogCQkJYnJlYWs7CiAJCX0KIAorCQljYWlmZC0+eG9mZiA9IDA7CiAJCWNmY25mZ19zZXRfcGh5X3N0YXRlKGNmZywgJmNhaWZkLT5sYXllciwgdHJ1ZSk7CiAJCXJjdV9yZWFkX3VubG9jaygpOwogCkBAIC0yOTgsNiArNDMyLDI0IEBACiAJCWNhaWZkLT5sYXllci51cC0+Y3RybGNtZChjYWlmZC0+bGF5ZXIudXAsCiAJCQkJCSBfQ0FJRl9DVFJMQ01EX1BIWUlGX0RPV05fSU5ELAogCQkJCQkgY2FpZmQtPmxheWVyLmlkKTsKKworCQlzcGluX2xvY2tfYmgoJmNhaWZkLT5mbG93X2xvY2spOworCisJCS8qCisJCSAqIFJlcGxhY2Ugb3VyIHhvZmYtZGVzdHJ1Y3RvciB3aXRoIG9yaWdpbmFsIGRlc3RydWN0b3IuCisJCSAqIFdlIHRydXN0IHRoYXQgc2tiLT5kZXN0cnVjdG9yICphbHdheXMqIGlzIGNhbGxlZCBiZWZvcmUKKwkJICogdGhlIHNrYiByZWZlcmVuY2UgaXMgaW52YWxpZC4gVGhlIGhpamFja2VkIFNLQiBkZXN0cnVjdG9yCisJCSAqIHRha2VzIHRoZSBmbG93X2xvY2sgc28gbWFuaXB1bGF0aW5nIHRoZSBza2ItPmRlc3RydWN0b3IgaGVyZQorCQkgKiBzaG91bGQgYmUgc2FmZS4KKwkJKi8KKwkJaWYgKGNhaWZkLT54b2ZmX3NrYl9kdG9yICE9IE5VTEwgJiYgY2FpZmQtPnhvZmZfc2tiICE9IE5VTEwpCisJCQljYWlmZC0+eG9mZl9za2ItPmRlc3RydWN0b3IgPSBjYWlmZC0+eG9mZl9za2JfZHRvcjsKKworCQljYWlmZC0+eG9mZiA9IDA7CisJCWNhaWZkLT54b2ZmX3NrYl9kdG9yID0gTlVMTDsKKwkJY2FpZmQtPnhvZmZfc2tiID0gTlVMTDsKKworCQlzcGluX3VubG9ja19iaCgmY2FpZmQtPmZsb3dfbG9jayk7CiAJCWNhaWZkX3B1dChjYWlmZCk7CiAJCWJyZWFrOwogCkBAIC0zNTMsMTUgKzUwNSwxNSBAQAogc3RhdGljIGludCBjYWlmX2luaXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKIHsKIAlzdHJ1Y3QgY2FpZl9uZXQgKmNhaWZuID0gbmV0X2dlbmVyaWMobmV0LCBjYWlmX25ldF9pZCk7Ci0JQlVHX09OKCFjYWlmbik7CisJaWYgKFdBUk5fT04oIWNhaWZuKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlJTklUX0xJU1RfSEVBRCgmY2FpZm4tPmNhaWZkZXZzLmxpc3QpOwogCW11dGV4X2luaXQoJmNhaWZuLT5jYWlmZGV2cy5sb2NrKTsKIAogCWNhaWZuLT5jZmcgPSBjZmNuZmdfY3JlYXRlKCk7Ci0JaWYgKCFjYWlmbi0+Y2ZnKSB7Ci0JCXByX3dhcm4oImNhbid0IGNyZWF0ZSBjZmNuZmdcbiIpOworCWlmICghY2FpZm4tPmNmZykKIAkJcmV0dXJuIC1FTk9NRU07Ci0JfQogCiAJcmV0dXJuIDA7CiB9CkBAIC0zNzEsMTcgKzUyMywxNCBAQAogCXN0cnVjdCBjYWlmX2RldmljZV9lbnRyeSAqY2FpZmQsICp0bXA7CiAJc3RydWN0IGNhaWZfZGV2aWNlX2VudHJ5X2xpc3QgKmNhaWZkZXZzID0KIAkgICAgY2FpZl9kZXZpY2VfbGlzdChuZXQpOwotCXN0cnVjdCBjZmNuZmcgKmNmZzsKKwlzdHJ1Y3QgY2ZjbmZnICpjZmcgPSAgZ2V0X2NmY25mZyhuZXQpOworCisJaWYgKCFjZmcgfHwgIWNhaWZkZXZzKQorCQlyZXR1cm47CiAKIAlydG5sX2xvY2soKTsKIAltdXRleF9sb2NrKCZjYWlmZGV2cy0+bG9jayk7CiAKLQljZmcgPSBnZXRfY2ZjbmZnKG5ldCk7Ci0JaWYgKGNmZyA9PSBOVUxMKSB7Ci0JCW11dGV4X3VubG9jaygmY2FpZmRldnMtPmxvY2spOwotCQlyZXR1cm47Ci0JfQotCiAJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNhaWZkLCB0bXAsICZjYWlmZGV2cy0+bGlzdCwgbGlzdCkgewogCQlpbnQgaSA9IDA7CiAJCWxpc3RfZGVsX3JjdSgmY2FpZmQtPmxpc3QpOwpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2FpZl91c2IuYyBiL25ldC9jYWlmL2NhaWZfdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjOWVjYQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9jYWlmL2NhaWZfdXNiLmMKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDQUlGIFVTQiBoYW5kbGVyCisgKiBDb3B5cmlnaHQgKEMpIFNULUVyaWNzc29uIEFCIDIwMTEKKyAqIEF1dGhvcjoJU2p1ciBCcmVuZGVsYW5kL3NqdXIuYnJhbmRlbGFuZEBzdGVyaWNzc29uLmNvbQorICogTGljZW5zZSB0ZXJtczogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCkgdmVyc2lvbiAyCisgKgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjolcygpOiAiIGZtdCwgX19mdW5jX18KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9taWkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvdXNibmV0Lmg+CisjaW5jbHVkZSA8bmV0L25ldG5zL2dlbmVyaWMuaD4KKyNpbmNsdWRlIDxuZXQvY2FpZi9jYWlmX2Rldi5oPgorI2luY2x1ZGUgPG5ldC9jYWlmL2NhaWZfbGF5ZXIuaD4KKyNpbmNsdWRlIDxuZXQvY2FpZi9jZnBrdC5oPgorI2luY2x1ZGUgPG5ldC9jYWlmL2NmY25mZy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNkZWZpbmUgQ0ZVU0JfUEFEX0RFU0NSX1NaIDEJLyogQWxpZ25tZW50IGRlc2NyaXB0b3IgbGVuZ3RoICovCisjZGVmaW5lIENGVVNCX0FMSUdOTUVOVCA0CS8qIE51bWJlciBvZiBieXRlcyB0byBhbGlnbi4gKi8KKyNkZWZpbmUgQ0ZVU0JfTUFYX0hFQURMRU4gKENGVVNCX1BBRF9ERVNDUl9TWiArIENGVVNCX0FMSUdOTUVOVC0xKQorI2RlZmluZSBTVEVfVVNCX1ZJRCAweDA0Y2MJLyogVVNCIFByb2R1Y3QgSUQgZm9yIFNULUVyaWNzc29uICovCisjZGVmaW5lIFNURV9VU0JfUElEX0NBSUYgMHgyMzA2CS8qIFByb2R1Y3QgaWQgZm9yIENBSUYgTW9kZW1zICovCisKK3N0cnVjdCBjZnVzYmwgeworCXN0cnVjdCBjZmxheWVyIGxheWVyOworCXU4IHR4X2V0aF9oZHJbRVRIX0hMRU5dOworfTsKKworc3RhdGljIGJvb2wgcGFja19hZGRlZDsKKworc3RhdGljIGludCBjZnVzYmxfcmVjZWl2ZShzdHJ1Y3QgY2ZsYXllciAqbGF5ciwgc3RydWN0IGNmcGt0ICpwa3QpCit7CisJdTggaHBhZDsKKworCS8qIFJlbW92ZSBwYWRkaW5nLiAqLworCWNmcGt0X2V4dHJfaGVhZChwa3QsICZocGFkLCAxKTsKKwljZnBrdF9leHRyX2hlYWQocGt0LCBOVUxMLCBocGFkKTsKKwlyZXR1cm4gbGF5ci0+dXAtPnJlY2VpdmUobGF5ci0+dXAsIHBrdCk7Cit9CisKK3N0YXRpYyBpbnQgY2Z1c2JsX3RyYW5zbWl0KHN0cnVjdCBjZmxheWVyICpsYXlyLCBzdHJ1Y3QgY2Zwa3QgKnBrdCkKK3sKKwlzdHJ1Y3QgY2FpZl9wYXlsb2FkX2luZm8gKmluZm87CisJdTggaHBhZDsKKwl1OCB6ZXJvc1tDRlVTQl9BTElHTk1FTlRdOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGNmdXNibCAqdXNibCA9IGNvbnRhaW5lcl9vZihsYXlyLCBzdHJ1Y3QgY2Z1c2JsLCBsYXllcik7CisKKwlza2IgPSBjZnBrdF90b25hdGl2ZShwa3QpOworCisJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CisJc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKworCWluZm8gPSBjZnBrdF9pbmZvKHBrdCk7CisJaHBhZCA9IChpbmZvLT5oZHJfbGVuICsgQ0ZVU0JfUEFEX0RFU0NSX1NaKSAmIChDRlVTQl9BTElHTk1FTlQgLSAxKTsKKworCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IEVUSF9ITEVOICsgQ0ZVU0JfUEFEX0RFU0NSX1NaICsgaHBhZCkgeworCQlwcl93YXJuKCJIZWFkcm9vbSB0byBzbWFsbFxuIik7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJbWVtc2V0KHplcm9zLCAwLCBocGFkKTsKKworCWNmcGt0X2FkZF9oZWFkKHBrdCwgemVyb3MsIGhwYWQpOworCWNmcGt0X2FkZF9oZWFkKHBrdCwgJmhwYWQsIDEpOworCWNmcGt0X2FkZF9oZWFkKHBrdCwgdXNibC0+dHhfZXRoX2hkciwgc2l6ZW9mKHVzYmwtPnR4X2V0aF9oZHIpKTsKKwlyZXR1cm4gbGF5ci0+ZG4tPnRyYW5zbWl0KGxheXItPmRuLCBwa3QpOworfQorCitzdGF0aWMgdm9pZCBjZnVzYmxfY3RybGNtZChzdHJ1Y3QgY2ZsYXllciAqbGF5ciwgZW51bSBjYWlmX2N0cmxjbWQgY3RybCwKKwkJCQkJaW50IHBoeWlkKQoreworCWlmIChsYXlyLT51cCAmJiBsYXlyLT51cC0+Y3RybGNtZCkKKwkJbGF5ci0+dXAtPmN0cmxjbWQobGF5ci0+dXAsIGN0cmwsIGxheXItPmlkKTsKK30KKworc3RydWN0IGNmbGF5ZXIgKmNmdXNibF9jcmVhdGUoaW50IHBoeWlkLCB1OCBldGhhZGRyW0VUSF9BTEVOXSwKKwkJCQkJdTggYnJhZGRyW0VUSF9BTEVOXSkKK3sKKwlzdHJ1Y3QgY2Z1c2JsICp0aGlzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNmdXNibCksIEdGUF9BVE9NSUMpOworCisJaWYgKCF0aGlzKSB7CisJCXByX3dhcm4oIk91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJY2FpZl9hc3NlcnQob2Zmc2V0b2Yoc3RydWN0IGNmdXNibCwgbGF5ZXIpID09IDApOworCisJbWVtc2V0KHRoaXMsIDAsIHNpemVvZihzdHJ1Y3QgY2ZsYXllcikpOworCXRoaXMtPmxheWVyLnJlY2VpdmUgPSBjZnVzYmxfcmVjZWl2ZTsKKwl0aGlzLT5sYXllci50cmFuc21pdCA9IGNmdXNibF90cmFuc21pdDsKKwl0aGlzLT5sYXllci5jdHJsY21kID0gY2Z1c2JsX2N0cmxjbWQ7CisJc25wcmludGYodGhpcy0+bGF5ZXIubmFtZSwgQ0FJRl9MQVlFUl9OQU1FX1NaLCAidXNiJWQiLCBwaHlpZCk7CisJdGhpcy0+bGF5ZXIuaWQgPSBwaHlpZDsKKworCS8qCisJICogQ29uc3RydWN0IFRYIGV0aGVybmV0IGhlYWRlcjoKKwkgKgkwLTUJZGVzdGluYXRpb24gYWRkcmVzcworCSAqCTUtMTEJc291cmNlIGFkZHJlc3MKKwkgKgkxMi0xMwlwcm90b2NvbCB0eXBlCisJICovCisJbWVtY3B5KCZ0aGlzLT50eF9ldGhfaGRyW0VUSF9BTEVOXSwgYnJhZGRyLCBFVEhfQUxFTik7CisJbWVtY3B5KCZ0aGlzLT50eF9ldGhfaGRyW0VUSF9BTEVOXSwgZXRoYWRkciwgRVRIX0FMRU4pOworCXRoaXMtPnR4X2V0aF9oZHJbMTJdID0gY3B1X3RvX2JlMTYoRVRIX1BfODAyX0VYMSkgJiAweGZmOworCXRoaXMtPnR4X2V0aF9oZHJbMTNdID0gKGNwdV90b19iZTE2KEVUSF9QXzgwMl9FWDEpID4+IDgpICYgMHhmZjsKKwlwcl9kZWJ1ZygiY2FpZiBldGhlcm5ldCBUWC1oZWFkZXIgZHN0OiVwTSBzcmM6JXBNIHR5cGU6JTAyeCUwMnhcbiIsCisJCQl0aGlzLT50eF9ldGhfaGRyLCB0aGlzLT50eF9ldGhfaGRyICsgRVRIX0FMRU4sCisJCQl0aGlzLT50eF9ldGhfaGRyWzEyXSwgdGhpcy0+dHhfZXRoX2hkclsxM10pOworCisJcmV0dXJuIChzdHJ1Y3QgY2ZsYXllciAqKSB0aGlzOworfQorCitzdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGNhaWZfdXNiX3R5cGUgX19yZWFkX21vc3RseSA9IHsKKwkudHlwZSA9IGNwdV90b19iZTE2KEVUSF9QXzgwMl9FWDEpLAorfTsKKworc3RhdGljIGludCBjZnVzYmxfZGV2aWNlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm1lLCB1bnNpZ25lZCBsb25nIHdoYXQsCisJCQkgICAgICB2b2lkICphcmcpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGFyZzsKKwlzdHJ1Y3QgY2FpZl9kZXZfY29tbW9uIGNvbW1vbjsKKwlzdHJ1Y3QgY2ZsYXllciAqbGF5ZXIsICpsaW5rX3N1cHBvcnQ7CisJc3RydWN0IHVzYm5ldAkqdXNibmV0ID0gbmV0ZGV2X3ByaXYoZGV2KTsKKwlzdHJ1Y3QgdXNiX2RldmljZQkqdXNiZGV2ID0gdXNibmV0LT51ZGV2OworCXN0cnVjdCBldGh0b29sX2RydmluZm8gZHJ2aW5mbzsKKworCS8qCisJICogUXVpcmtzOiBIaWdoLWphY2sgZXRodG9vbCB0byBmaW5kIGlmIHdlIGhhdmUgYSBOQ00gZGV2aWNlLAorCSAqIGFuZCBmaW5kIGl0J3MgVklEL1BJRC4KKwkgKi8KKwlpZiAoZGV2LT5ldGh0b29sX29wcyA9PSBOVUxMIHx8IGRldi0+ZXRodG9vbF9vcHMtPmdldF9kcnZpbmZvID09IE5VTEwpCisJCXJldHVybiAwOworCisJZGV2LT5ldGh0b29sX29wcy0+Z2V0X2RydmluZm8oZGV2LCAmZHJ2aW5mbyk7CisJaWYgKHN0cm5jbXAoZHJ2aW5mby5kcml2ZXIsICJjZGNfbmNtIiwgNykgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlwcl9kZWJ1ZygiVVNCIENEQyBOQ00gZGV2aWNlIFZJRDoweCU0eCBQSUQ6MHglNHhcbiIsCisJCWxlMTZfdG9fY3B1KHVzYmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvciksCisJCWxlMTZfdG9fY3B1KHVzYmRldi0+ZGVzY3JpcHRvci5pZFByb2R1Y3QpKTsKKworCS8qIENoZWNrIGZvciBWSUQvUElEIHRoYXQgc3VwcG9ydHMgQ0FJRiAqLworCWlmICghKGxlMTZfdG9fY3B1KHVzYmRldi0+ZGVzY3JpcHRvci5pZFZlbmRvcikgPT0gU1RFX1VTQl9WSUQgJiYKKwkJbGUxNl90b19jcHUodXNiZGV2LT5kZXNjcmlwdG9yLmlkUHJvZHVjdCkgPT0gU1RFX1VTQl9QSURfQ0FJRikpCisJCXJldHVybiAwOworCisJaWYgKHdoYXQgPT0gTkVUREVWX1VOUkVHSVNURVIpCisJCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworCisJaWYgKHdoYXQgIT0gTkVUREVWX1JFR0lTVEVSKQorCQlyZXR1cm4gMDsKKworCV9fbW9kdWxlX2dldChUSElTX01PRFVMRSk7CisKKwltZW1zZXQoJmNvbW1vbiwgMCwgc2l6ZW9mKGNvbW1vbikpOworCWNvbW1vbi51c2VfZnJhZyA9IGZhbHNlOworCWNvbW1vbi51c2VfZmNzID0gZmFsc2U7CisJY29tbW9uLnVzZV9zdHggPSBmYWxzZTsKKwljb21tb24ubGlua19zZWxlY3QgPSBDQUlGX0xJTktfSElHSF9CQU5EVzsKKwljb21tb24uZmxvd2N0cmwgPSBOVUxMOworCisJbGlua19zdXBwb3J0ID0gY2Z1c2JsX2NyZWF0ZShkZXYtPmlmaW5kZXgsIGRldi0+ZGV2X2FkZHIsCisJCQkJCWRldi0+YnJvYWRjYXN0KTsKKworCWlmICghbGlua19zdXBwb3J0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChkZXYtPm51bV90eF9xdWV1ZXMgPiAxKQorCQlwcl93YXJuKCJVU0IgZGV2aWNlIHVzZXMgbW9yZSB0aGFuIG9uZSB0eCBxdWV1ZVxuIik7CisKKwljYWlmX2Vucm9sbF9kZXYoZGV2LCAmY29tbW9uLCBsaW5rX3N1cHBvcnQsIENGVVNCX01BWF9IRUFETEVOLAorCQkJJmxheWVyLCAmY2FpZl91c2JfdHlwZS5mdW5jKTsKKwlpZiAoIXBhY2tfYWRkZWQpCisJCWRldl9hZGRfcGFjaygmY2FpZl91c2JfdHlwZSk7CisJcGFja19hZGRlZCA9IHRydWU7CisKKwlzdHJuY3B5KGxheWVyLT5uYW1lLCBkZXYtPm5hbWUsCisJCQlzaXplb2YobGF5ZXItPm5hbWUpIC0gMSk7CisJbGF5ZXItPm5hbWVbc2l6ZW9mKGxheWVyLT5uYW1lKSAtIDFdID0gMDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGNhaWZfZGV2aWNlX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gY2Z1c2JsX2RldmljZV9ub3RpZnksCisJLnByaW9yaXR5ID0gMCwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNmdXNibF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmY2FpZl9kZXZpY2Vfbm90aWZpZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2Z1c2JsX2V4aXQodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmY2FpZl9kZXZpY2Vfbm90aWZpZXIpOworCWRldl9yZW1vdmVfcGFjaygmY2FpZl91c2JfdHlwZSk7Cit9CisKK21vZHVsZV9pbml0KGNmdXNibF9pbml0KTsKK21vZHVsZV9leGl0KGNmdXNibF9leGl0KTsKZGlmZiAtLWdpdCBhL25ldC9jYWlmL2NmY25mZy5jIGIvbmV0L2NhaWYvY2ZjbmZnLmMKaW5kZXggMDA1MjNlYy4uNTk4YWFmYiAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2ZjbmZnLmMKKysrIGIvbmV0L2NhaWYvY2ZjbmZnLmMKQEAgLTQ1LDggKzQ1LDggQEAKIAkvKiBJbnRlcmZhY2UgaW5kZXggKi8KIAlpbnQgaWZpbmRleDsKIAotCS8qIFVzZSBTdGFydCBvZiBmcmFtZSBleHRlbnNpb24gKi8KLQlib29sIHVzZV9zdHg7CisJLyogUHJvdG9jb2wgaGVhZCByb29tIGFkZGVkIGZvciBDQUlGIGxpbmsgbGF5ZXIgKi8KKwlpbnQgaGVhZF9yb29tOwogCiAJLyogVXNlIFN0YXJ0IG9mIGZyYW1lIGNoZWNrc3VtICovCiAJYm9vbCB1c2VfZmNzOwpAQCAtMTg3LDExICsxODcsMTEgQEAKIAlpZiAoY2hhbm5lbF9pZCAhPSAwKSB7CiAJCXN0cnVjdCBjZmxheWVyICpzZXJ2bDsKIAkJc2VydmwgPSBjZm11eGxfcmVtb3ZlX3VwbGF5ZXIoY2ZnLT5tdXgsIGNoYW5uZWxfaWQpOworCQljZmN0cmxfbGlua2Rvd25fcmVxKGNmZy0+Y3RybCwgY2hhbm5lbF9pZCwgYWRhcF9sYXllcik7CiAJCWlmIChzZXJ2bCAhPSBOVUxMKQogCQkJbGF5ZXJfc2V0X3VwKHNlcnZsLCBOVUxMKTsKIAl9IGVsc2UKIAkJcHJfZGVidWcoIm5vdGhpbmcgdG8gZGlzY29ubmVjdFxuIik7Ci0JY2ZjdHJsX2xpbmtkb3duX3JlcShjZmctPmN0cmwsIGNoYW5uZWxfaWQsIGFkYXBfbGF5ZXIpOwogCiAJLyogRG8gUkNVIHN5bmMgYmVmb3JlIGluaXRpYXRpbmcgY2xlYW51cCAqLwogCXN5bmNocm9uaXplX3JjdSgpOwpAQCAtMzUwLDkgKzM1MCw3IEBACiAKIAkqaWZpbmRleCA9IHBoeS0+aWZpbmRleDsKIAkqcHJvdG9fdGFpbCA9IDI7Ci0JKnByb3RvX2hlYWQgPQotCi0JcHJvdG9oZWFkW3BhcmFtLmxpbmt0eXBlXSArIChwaHktPnVzZV9zdHggPyAxIDogMCk7CisJKnByb3RvX2hlYWQgPSBwcm90b2hlYWRbcGFyYW0ubGlua3R5cGVdICsgcGh5LT5oZWFkX3Jvb207CiAKIAlyY3VfcmVhZF91bmxvY2soKTsKIApAQCAtNDYwLDEzICs0NTgsMTMgQEAKIH0KIAogdm9pZAotY2ZjbmZnX2FkZF9waHlfbGF5ZXIoc3RydWN0IGNmY25mZyAqY25mZywgZW51bSBjZmNuZmdfcGh5X3R5cGUgcGh5X3R5cGUsCitjZmNuZmdfYWRkX3BoeV9sYXllcihzdHJ1Y3QgY2ZjbmZnICpjbmZnLAogCQkgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBjZmxheWVyICpwaHlfbGF5ZXIsCiAJCSAgICAgZW51bSBjZmNuZmdfcGh5X3ByZWZlcmVuY2UgcHJlZiwKLQkJICAgICBib29sIGZjcywgYm9vbCBzdHgpCisJCSAgICAgc3RydWN0IGNmbGF5ZXIgKmxpbmtfc3VwcG9ydCwKKwkJICAgICBib29sIGZjcywgaW50IGhlYWRfcm9vbSkKIHsKIAlzdHJ1Y3QgY2ZsYXllciAqZnJtbDsKLQlzdHJ1Y3QgY2ZsYXllciAqcGh5X2RyaXZlciA9IE5VTEw7CiAJc3RydWN0IGNmY25mZ19waHlpbmZvICpwaHlpbmZvID0gTlVMTDsKIAlpbnQgaTsKIAl1OCBwaHlpZDsKQEAgLTQ4MiwyNiArNDgwLDEzIEBACiAJCQlnb3RvIGdvdF9waHlpZDsKIAl9CiAJcHJfd2FybigiVG9vIG1hbnkgQ0FJRiBMaW5rIExheWVycyAobWF4IDYpXG4iKTsKLQlnb3RvIG91dF9lcnI7CisJZ290byBvdXQ7CiAKIGdvdF9waHlpZDoKIAlwaHlpbmZvID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGNmY25mZ19waHlpbmZvKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFwaHlpbmZvKQogCQlnb3RvIG91dF9lcnI7CiAKLQlzd2l0Y2ggKHBoeV90eXBlKSB7Ci0JY2FzZSBDRlBIWVRZUEVfRlJBRzoKLQkJcGh5X2RyaXZlciA9Ci0JCSAgICBjZnNlcmxfY3JlYXRlKENGUEhZVFlQRV9GUkFHLCBwaHlpZCwgc3R4KTsKLQkJaWYgKCFwaHlfZHJpdmVyKQotCQkJZ290byBvdXRfZXJyOwotCQlicmVhazsKLQljYXNlIENGUEhZVFlQRV9DQUlGOgotCQlwaHlfZHJpdmVyID0gTlVMTDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZ290byBvdXRfZXJyOwotCX0KIAlwaHlfbGF5ZXItPmlkID0gcGh5aWQ7CiAJcGh5aW5mby0+cHJlZiA9IHByZWY7CiAJcGh5aW5mby0+aWQgPSBwaHlpZDsKQEAgLTUwOSw3ICs0OTQsNyBAQAogCXBoeWluZm8tPmRldl9pbmZvLmRldiA9IGRldjsKIAlwaHlpbmZvLT5waHlfbGF5ZXIgPSBwaHlfbGF5ZXI7CiAJcGh5aW5mby0+aWZpbmRleCA9IGRldi0+aWZpbmRleDsKLQlwaHlpbmZvLT51c2Vfc3R4ID0gc3R4OworCXBoeWluZm8tPmhlYWRfcm9vbSA9IGhlYWRfcm9vbTsKIAlwaHlpbmZvLT51c2VfZmNzID0gZmNzOwogCiAJZnJtbCA9IGNmZnJtbF9jcmVhdGUocGh5aWQsIGZjcyk7CkBAIC01MTksMjMgKzUwNCwyMyBAQAogCXBoeWluZm8tPmZybV9sYXllciA9IGZybWw7CiAJbGF5ZXJfc2V0X3VwKGZybWwsIGNuZmctPm11eCk7CiAKLQlpZiAocGh5X2RyaXZlciAhPSBOVUxMKSB7Ci0JCXBoeV9kcml2ZXItPmlkID0gcGh5aWQ7Ci0JCWxheWVyX3NldF9kbihmcm1sLCBwaHlfZHJpdmVyKTsKLQkJbGF5ZXJfc2V0X3VwKHBoeV9kcml2ZXIsIGZybWwpOwotCQlsYXllcl9zZXRfZG4ocGh5X2RyaXZlciwgcGh5X2xheWVyKTsKLQkJbGF5ZXJfc2V0X3VwKHBoeV9sYXllciwgcGh5X2RyaXZlcik7CisJaWYgKGxpbmtfc3VwcG9ydCAhPSBOVUxMKSB7CisJCWxpbmtfc3VwcG9ydC0+aWQgPSBwaHlpZDsKKwkJbGF5ZXJfc2V0X2RuKGZybWwsIGxpbmtfc3VwcG9ydCk7CisJCWxheWVyX3NldF91cChsaW5rX3N1cHBvcnQsIGZybWwpOworCQlsYXllcl9zZXRfZG4obGlua19zdXBwb3J0LCBwaHlfbGF5ZXIpOworCQlsYXllcl9zZXRfdXAocGh5X2xheWVyLCBsaW5rX3N1cHBvcnQpOwogCX0gZWxzZSB7CiAJCWxheWVyX3NldF9kbihmcm1sLCBwaHlfbGF5ZXIpOwogCQlsYXllcl9zZXRfdXAocGh5X2xheWVyLCBmcm1sKTsKIAl9CiAKIAlsaXN0X2FkZF9yY3UoJnBoeWluZm8tPm5vZGUsICZjbmZnLT5waHlzKTsKK291dDoKIAltdXRleF91bmxvY2soJmNuZmctPmxvY2spOwogCXJldHVybjsKIAogb3V0X2VycjoKLQlrZnJlZShwaHlfZHJpdmVyKTsKIAlrZnJlZShwaHlpbmZvKTsKIAltdXRleF91bmxvY2soJmNuZmctPmxvY2spOwogfQpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2Zmcm1sLmMgYi9uZXQvY2FpZi9jZmZybWwuYwppbmRleCBmMzk5MjExLi5kM2NhODdiIDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jZmZybWwuYworKysgYi9uZXQvY2FpZi9jZmZybWwuYwpAQCAtMTM2LDIwICsxMzYsMjEgQEAKIAogc3RhdGljIGludCBjZmZybWxfdHJhbnNtaXQoc3RydWN0IGNmbGF5ZXIgKmxheXIsIHN0cnVjdCBjZnBrdCAqcGt0KQogewotCWludCB0bXA7CiAJdTE2IGNoa3M7CiAJdTE2IGxlbjsKKwlfX2xlMTYgZGF0YTsKKwogCXN0cnVjdCBjZmZybWwgKnRoaXMgPSBjb250YWluZXJfb2JqKGxheXIpOwogCWlmICh0aGlzLT5kb2ZjcykgewogCQljaGtzID0gY2Zwa3RfaXRlcmF0ZShwa3QsIGNmZnJtbF9jaGVja3N1bSwgMHhmZmZmKTsKLQkJdG1wID0gY3B1X3RvX2xlMTYoY2hrcyk7Ci0JCWNmcGt0X2FkZF90cmFpbChwa3QsICZ0bXAsIDIpOworCQlkYXRhID0gY3B1X3RvX2xlMTYoY2hrcyk7CisJCWNmcGt0X2FkZF90cmFpbChwa3QsICZkYXRhLCAyKTsKIAl9IGVsc2UgewogCQljZnBrdF9wYWRfdHJhaWwocGt0LCAyKTsKIAl9CiAJbGVuID0gY2Zwa3RfZ2V0bGVuKHBrdCk7Ci0JdG1wID0gY3B1X3RvX2xlMTYobGVuKTsKLQljZnBrdF9hZGRfaGVhZChwa3QsICZ0bXAsIDIpOworCWRhdGEgPSBjcHVfdG9fbGUxNihsZW4pOworCWNmcGt0X2FkZF9oZWFkKHBrdCwgJmRhdGEsIDIpOwogCWNmcGt0X2luZm8ocGt0KS0+aGRyX2xlbiArPSAyOwogCWlmIChjZnBrdF9lcnJvbmVvdXMocGt0KSkgewogCQlwcl9lcnIoIlBhY2tldCBpcyBlcnJvbmVvdXMhXG4iKTsKZGlmZiAtLWdpdCBhL25ldC9jYWlmL2NmcGt0X3NrYnVmZi5jIGIvbmV0L2NhaWYvY2Zwa3Rfc2tidWZmLmMKaW5kZXggZGYwOGM0Ny4uZTMzNWJhOCAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2Zwa3Rfc2tidWZmLmMKKysrIGIvbmV0L2NhaWYvY2Zwa3Rfc2tidWZmLmMKQEAgLTYzLDcgKzYzLDYgQEAKIAlyZXR1cm4gKHN0cnVjdCBjZnBrdCAqKSBza2I7CiB9CiAKLQogc3RydWN0IGNmcGt0ICpjZnBrdF9mcm9tbmF0aXZlKGVudW0gY2FpZl9kaXJlY3Rpb24gZGlyLCB2b2lkICpuYXRpdmVwa3QpCiB7CiAJc3RydWN0IGNmcGt0ICpwa3QgPSBza2JfdG9fcGt0KG5hdGl2ZXBrdCk7CkBAIC0xMDUsMTQgKzEwNCwxMiBAQAogCWtmcmVlX3NrYihza2IpOwogfQogCi0KIGlubGluZSBib29sIGNmcGt0X21vcmUoc3RydWN0IGNmcGt0ICpwa3QpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBrdF90b19za2IocGt0KTsKIAlyZXR1cm4gc2tiLT5sZW4gPiAwOwogfQogCi0KIGludCBjZnBrdF9wZWVrX2hlYWQoc3RydWN0IGNmcGt0ICpwa3QsIHZvaWQgKmRhdGEsIHUxNiBsZW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBrdF90b19za2IocGt0KTsKQEAgLTE0NCw5ICsxNDEsMTEgQEAKIAl9CiAJZnJvbSA9IHNrYl9wdWxsKHNrYiwgbGVuKTsKIAlmcm9tIC09IGxlbjsKLQltZW1jcHkoZGF0YSwgZnJvbSwgbGVuKTsKKwlpZiAoZGF0YSkKKwkJbWVtY3B5KGRhdGEsIGZyb20sIGxlbik7CiAJcmV0dXJuIDA7CiB9CitFWFBPUlRfU1lNQk9MKGNmcGt0X2V4dHJfaGVhZCk7CiAKIGludCBjZnBrdF9leHRyX3RyYWlsKHN0cnVjdCBjZnBrdCAqcGt0LCB2b2lkICpkdGEsIHUxNiBsZW4pCiB7CkBAIC0xNzAsMTMgKzE2OSwxMSBAQAogCXJldHVybiAwOwogfQogCi0KIGludCBjZnBrdF9wYWRfdHJhaWwoc3RydWN0IGNmcGt0ICpwa3QsIHUxNiBsZW4pCiB7CiAJcmV0dXJuIGNmcGt0X2FkZF9ib2R5KHBrdCwgTlVMTCwgbGVuKTsKIH0KIAotCiBpbnQgY2Zwa3RfYWRkX2JvZHkoc3RydWN0IGNmcGt0ICpwa3QsIGNvbnN0IHZvaWQgKmRhdGEsIHUxNiBsZW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBrdF90b19za2IocGt0KTsKQEAgLTI1NSwyMSArMjUyLDE5IEBACiAJbWVtY3B5KHRvLCBkYXRhLCBsZW4pOwogCXJldHVybiAwOwogfQotCitFWFBPUlRfU1lNQk9MKGNmcGt0X2FkZF9oZWFkKTsKIAogaW5saW5lIGludCBjZnBrdF9hZGRfdHJhaWwoc3RydWN0IGNmcGt0ICpwa3QsIGNvbnN0IHZvaWQgKmRhdGEsIHUxNiBsZW4pCiB7CiAJcmV0dXJuIGNmcGt0X2FkZF9ib2R5KHBrdCwgZGF0YSwgbGVuKTsKIH0KIAotCiBpbmxpbmUgdTE2IGNmcGt0X2dldGxlbihzdHJ1Y3QgY2Zwa3QgKnBrdCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gcGt0X3RvX3NrYihwa3QpOwogCXJldHVybiBza2ItPmxlbjsKIH0KIAotCiBpbmxpbmUgdTE2IGNmcGt0X2l0ZXJhdGUoc3RydWN0IGNmcGt0ICpwa3QsCiAJCQkgICAgdTE2ICgqaXRlcl9mdW5jKSh1MTYsIHZvaWQgKiwgdTE2KSwKIAkJCSAgICB1MTYgZGF0YSkKQEAgLTI4Nyw3ICsyODIsNiBAQAogCXJldHVybiBpdGVyX2Z1bmMoZGF0YSwgcGt0LT5za2IuZGF0YSwgY2Zwa3RfZ2V0bGVuKHBrdCkpOwogfQogCi0KIGludCBjZnBrdF9zZXRsZW4oc3RydWN0IGNmcGt0ICpwa3QsIHUxNiBsZW4pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHBrdF90b19za2IocGt0KTsKQEAgLTM5OSwzICszOTMsNCBAQAogewogCXJldHVybiAoc3RydWN0IGNhaWZfcGF5bG9hZF9pbmZvICopJnBrdF90b19za2IocGt0KS0+Y2I7CiB9CitFWFBPUlRfU1lNQk9MKGNmcGt0X2luZm8pOwpkaWZmIC0tZ2l0IGEvbmV0L2NhaWYvY2ZyZm1sLmMgYi9uZXQvY2FpZi9jZnJmbWwuYwppbmRleCA4MTY2MGY4Li42ZGM3NWQ0IDEwMDY0NAotLS0gYS9uZXQvY2FpZi9jZnJmbWwuYworKysgYi9uZXQvY2FpZi9jZnJmbWwuYwpAQCAtMTkwLDcgKzE5MCw3IEBACiAKIHN0YXRpYyBpbnQgY2ZyZm1sX3RyYW5zbWl0X3NlZ21lbnQoc3RydWN0IGNmcmZtbCAqcmZtbCwgc3RydWN0IGNmcGt0ICpwa3QpCiB7Ci0JY2FpZl9hc3NlcnQoY2Zwa3RfZ2V0bGVuKHBrdCkgPCByZm1sLT5mcmFnbWVudF9zaXplKTsKKwljYWlmX2Fzc2VydChjZnBrdF9nZXRsZW4ocGt0KSA8IHJmbWwtPmZyYWdtZW50X3NpemUgKyBSRk1fSEVBRF9TSVpFKTsKIAogCS8qIEFkZCBpbmZvIGZvciBNVVgtbGF5ZXIgdG8gcm91dGUgdGhlIHBhY2tldCBvdXQuICovCiAJY2Zwa3RfaW5mbyhwa3QpLT5jaGFubmVsX2lkID0gcmZtbC0+c2Vydi5sYXllci5pZDsKZGlmZiAtLWdpdCBhL25ldC9jYWlmL2Nmc2VybC5jIGIvbmV0L2NhaWYvY2ZzZXJsLmMKaW5kZXggNzk3YzhkMS4uOGU2OGI5NyAxMDA2NDQKLS0tIGEvbmV0L2NhaWYvY2ZzZXJsLmMKKysrIGIvbmV0L2NhaWYvY2ZzZXJsLmMKQEAgLTMxLDcgKzMxLDcgQEAKIHN0YXRpYyB2b2lkIGNmc2VybF9jdHJsY21kKHN0cnVjdCBjZmxheWVyICpsYXlyLCBlbnVtIGNhaWZfY3RybGNtZCBjdHJsLAogCQkJCWludCBwaHlpZCk7CiAKLXN0cnVjdCBjZmxheWVyICpjZnNlcmxfY3JlYXRlKGludCB0eXBlLCBpbnQgaW5zdGFuY2UsIGJvb2wgdXNlX3N0eCkKK3N0cnVjdCBjZmxheWVyICpjZnNlcmxfY3JlYXRlKGludCBpbnN0YW5jZSwgYm9vbCB1c2Vfc3R4KQogewogCXN0cnVjdCBjZnNlcmwgKnRoaXMgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2ZzZXJsKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCF0aGlzKQpAQCAtNDAsNyArNDAsNiBAQAogCXRoaXMtPmxheWVyLnJlY2VpdmUgPSBjZnNlcmxfcmVjZWl2ZTsKIAl0aGlzLT5sYXllci50cmFuc21pdCA9IGNmc2VybF90cmFuc21pdDsKIAl0aGlzLT5sYXllci5jdHJsY21kID0gY2ZzZXJsX2N0cmxjbWQ7Ci0JdGhpcy0+bGF5ZXIudHlwZSA9IHR5cGU7CiAJdGhpcy0+dXNlc3R4ID0gdXNlX3N0eDsKIAlzcGluX2xvY2tfaW5pdCgmdGhpcy0+c3luYyk7CiAJc25wcmludGYodGhpcy0+bGF5ZXIubmFtZSwgQ0FJRl9MQVlFUl9OQU1FX1NaLCAic2VyMSIpOwpkaWZmIC0tZ2l0IGEvbmV0L2NlcGgvY3J1c2gvbWFwcGVyLmMgYi9uZXQvY2VwaC9jcnVzaC9tYXBwZXIuYwppbmRleCA0MjU5OWUzLi4zYTk0ZWFlIDEwMDY0NAotLS0gYS9uZXQvY2VwaC9jcnVzaC9tYXBwZXIuYworKysgYi9uZXQvY2VwaC9jcnVzaC9tYXBwZXIuYwpAQCAtNDc3LDcgKzQ3Nyw2IEBACiAJaW50IGksIGo7CiAJaW50IG51bXJlcDsKIAlpbnQgZmlyc3RuOwotCWludCByYyA9IC0xOwogCiAJQlVHX09OKHJ1bGVubyA+PSBtYXAtPm1heF9ydWxlcyk7CiAKQEAgLTQ5MSwyMyArNDkwLDE4IEBACiAJICogdGhhdCB0aGlzIG1heSBvciBtYXkgbm90IGNvcnJlc3BvbmQgdG8gdGhlIHNwZWNpZmljIHR5cGVzCiAJICogcmVmZXJlbmNlZCBieSB0aGUgY3J1c2ggcnVsZS4KIAkgKi8KLQlpZiAoZm9yY2UgPj0gMCkgewotCQlpZiAoZm9yY2UgPj0gbWFwLT5tYXhfZGV2aWNlcyB8fAotCQkgICAgbWFwLT5kZXZpY2VfcGFyZW50c1tmb3JjZV0gPT0gMCkgewotCQkJLypkcHJpbnRrKCJDUlVTSDogZm9yY2VmZWQgZGV2aWNlIGRuZVxuIik7Ki8KLQkJCXJjID0gLTE7ICAvKiBmb3JjZSBmZWQgZGV2aWNlIGRuZSAqLwotCQkJZ290byBvdXQ7Ci0JCX0KLQkJaWYgKCFpc19vdXQobWFwLCB3ZWlnaHQsIGZvcmNlLCB4KSkgewotCQkJd2hpbGUgKDEpIHsKLQkJCQlmb3JjZV9jb250ZXh0WysrZm9yY2VfcG9zXSA9IGZvcmNlOwotCQkJCWlmIChmb3JjZSA+PSAwKQotCQkJCQlmb3JjZSA9IG1hcC0+ZGV2aWNlX3BhcmVudHNbZm9yY2VdOwotCQkJCWVsc2UKLQkJCQkJZm9yY2UgPSBtYXAtPmJ1Y2tldF9wYXJlbnRzWy0xLWZvcmNlXTsKLQkJCQlpZiAoZm9yY2UgPT0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9CisJaWYgKGZvcmNlID49IDAgJiYKKwkgICAgZm9yY2UgPCBtYXAtPm1heF9kZXZpY2VzICYmCisJICAgIG1hcC0+ZGV2aWNlX3BhcmVudHNbZm9yY2VdICE9IDAgJiYKKwkgICAgIWlzX291dChtYXAsIHdlaWdodCwgZm9yY2UsIHgpKSB7CisJCXdoaWxlICgxKSB7CisJCQlmb3JjZV9jb250ZXh0WysrZm9yY2VfcG9zXSA9IGZvcmNlOworCQkJaWYgKGZvcmNlID49IDApCisJCQkJZm9yY2UgPSBtYXAtPmRldmljZV9wYXJlbnRzW2ZvcmNlXTsKKwkJCWVsc2UKKwkJCQlmb3JjZSA9IG1hcC0+YnVja2V0X3BhcmVudHNbLTEtZm9yY2VdOworCQkJaWYgKGZvcmNlID09IDApCisJCQkJYnJlYWs7CiAJCX0KIAl9CiAKQEAgLTYwMCwxMCArNTk0LDcgQEAKIAkJCUJVR19PTigxKTsKIAkJfQogCX0KLQlyYyA9IHJlc3VsdF9sZW47Ci0KLW91dDoKLQlyZXR1cm4gcmM7CisJcmV0dXJuIHJlc3VsdF9sZW47CiB9CiAKIApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvTWFrZWZpbGUgYi9uZXQvY29yZS9NYWtlZmlsZQppbmRleCAwZDM1N2IxLi42NzQ2NDFiIDEwMDY0NAotLS0gYS9uZXQvY29yZS9NYWtlZmlsZQorKysgYi9uZXQvY29yZS9NYWtlZmlsZQpAQCAtMywxMiArMywxMyBAQAogIwogCiBvYmoteSA6PSBzb2NrLm8gcmVxdWVzdF9zb2NrLm8gc2tidWZmLm8gaW92ZWMubyBkYXRhZ3JhbS5vIHN0cmVhbS5vIHNjbS5vIFwKLQkgZ2VuX3N0YXRzLm8gZ2VuX2VzdGltYXRvci5vIG5ldF9uYW1lc3BhY2UubyBzZWN1cmVfc2VxLm8KKwkgZ2VuX3N0YXRzLm8gZ2VuX2VzdGltYXRvci5vIG5ldF9uYW1lc3BhY2UubyBzZWN1cmVfc2VxLm8gZmxvd19kaXNzZWN0b3IubwogCiBvYmotJChDT05GSUdfU1lTQ1RMKSArPSBzeXNjdGxfbmV0X2NvcmUubwogCiBvYmoteQkJICAgICArPSBkZXYubyBldGh0b29sLm8gZGV2X2FkZHJfbGlzdHMubyBkc3QubyBuZXRldmVudC5vIFwKLQkJCW5laWdoYm91ci5vIHJ0bmV0bGluay5vIHV0aWxzLm8gbGlua193YXRjaC5vIGZpbHRlci5vCisJCQluZWlnaGJvdXIubyBydG5ldGxpbmsubyB1dGlscy5vIGxpbmtfd2F0Y2gubyBmaWx0ZXIubyBcCisJCQlzb2NrX2RpYWcubwogCiBvYmotJChDT05GSUdfWEZSTSkgKz0gZmxvdy5vCiBvYmoteSArPSBuZXQtc3lzZnMubwpAQCAtMTksMyArMjAsNCBAQAogb2JqLSQoQ09ORklHX1RSQUNFUE9JTlRTKSArPSBuZXQtdHJhY2VzLm8KIG9iai0kKENPTkZJR19ORVRfRFJPUF9NT05JVE9SKSArPSBkcm9wX21vbml0b3Iubwogb2JqLSQoQ09ORklHX05FVFdPUktfUEhZX1RJTUVTVEFNUElORykgKz0gdGltZXN0YW1waW5nLm8KK29iai0kKENPTkZJR19ORVRQUklPX0NHUk9VUCkgKz0gbmV0cHJpb19jZ3JvdXAubwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZGV2LmMgYi9uZXQvY29yZS9kZXYuYwppbmRleCA2YmE1MGExLi5mNDk0Njc1IDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXYuYworKysgYi9uZXQvY29yZS9kZXYuYwpAQCAtMTMzLDEwICsxMzMsOSBAQAogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVfcm1hcC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3R1bm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2lmX3BwcG94Lmg+Ci0jaW5jbHVkZSA8bGludXgvcHBwX2RlZnMuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRfdHN0YW1wLmg+CisjaW5jbHVkZSA8bGludXgvanVtcF9sYWJlbC5oPgorI2luY2x1ZGUgPG5ldC9mbG93X2tleXMuaD4KIAogI2luY2x1ZGUgIm5ldC1zeXNmcy5oIgogCkBAIC0xMzIwLDggKzEzMTksNiBAQAogICovCiB2b2lkIGRldl9kaXNhYmxlX2xybyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXUzMiBmbGFnczsKLQogCS8qCiAJICogSWYgd2UncmUgdHJ5aW5nIHRvIGRpc2FibGUgbHJvIG9uIGEgdmxhbiBkZXZpY2UKIAkgKiB1c2UgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgZGV2aWNlIGluc3RlYWQKQEAgLTEzMjksMTUgKzEzMjYsOSBAQAogCWlmIChpc192bGFuX2RldihkZXYpKQogCQlkZXYgPSB2bGFuX2Rldl9yZWFsX2RldihkZXYpOwogCi0JaWYgKGRldi0+ZXRodG9vbF9vcHMgJiYgZGV2LT5ldGh0b29sX29wcy0+Z2V0X2ZsYWdzKQotCQlmbGFncyA9IGRldi0+ZXRodG9vbF9vcHMtPmdldF9mbGFncyhkZXYpOwotCWVsc2UKLQkJZmxhZ3MgPSBldGh0b29sX29wX2dldF9mbGFncyhkZXYpOworCWRldi0+d2FudGVkX2ZlYXR1cmVzICY9IH5ORVRJRl9GX0xSTzsKKwluZXRkZXZfdXBkYXRlX2ZlYXR1cmVzKGRldik7CiAKLQlpZiAoIShmbGFncyAmIEVUSF9GTEFHX0xSTykpCi0JCXJldHVybjsKLQotCV9fZXRodG9vbF9zZXRfZmxhZ3MoZGV2LCBmbGFncyAmIH5FVEhfRkxBR19MUk8pOwogCWlmICh1bmxpa2VseShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pKQogCQluZXRkZXZfV0FSTihkZXYsICJmYWlsZWQgdG8gZGlzYWJsZSBMUk8hXG4iKTsKIH0KQEAgLTEzOTYsNyArMTM4Nyw3IEBACiAJZm9yX2VhY2hfbmV0KG5ldCkgewogCQlmb3JfZWFjaF9uZXRkZXYobmV0LCBkZXYpIHsKIAkJCWlmIChkZXYgPT0gbGFzdCkKLQkJCQlicmVhazsKKwkJCQlnb3RvIG91dHJvbGw7CiAKIAkJCWlmIChkZXYtPmZsYWdzICYgSUZGX1VQKSB7CiAJCQkJbmItPm5vdGlmaWVyX2NhbGwobmIsIE5FVERFVl9HT0lOR19ET1dOLCBkZXYpOwpAQCAtMTQwNyw2ICsxMzk4LDcgQEAKIAkJfQogCX0KIAorb3V0cm9sbDoKIAlyYXdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmbmV0ZGV2X2NoYWluLCBuYik7CiAJZ290byB1bmxvY2s7CiB9CkBAIC0xNDQ5LDM0ICsxNDQxLDU1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGNhbGxfbmV0ZGV2aWNlX25vdGlmaWVycyk7CiAKLS8qIFdoZW4gPiAwIHRoZXJlIGFyZSBjb25zdW1lcnMgb2Ygcnggc2tiIHRpbWUgc3RhbXBzICovCi1zdGF0aWMgYXRvbWljX3QgbmV0c3RhbXBfbmVlZGVkID0gQVRPTUlDX0lOSVQoMCk7CitzdGF0aWMgc3RydWN0IGp1bXBfbGFiZWxfa2V5IG5ldHN0YW1wX25lZWRlZCBfX3JlYWRfbW9zdGx5OworI2lmZGVmIEhBVkVfSlVNUF9MQUJFTAorLyogV2UgYXJlIG5vdCBhbGxvd2VkIHRvIGNhbGwganVtcF9sYWJlbF9kZWMoKSBmcm9tIGlycSBjb250ZXh0CisgKiBJZiBuZXRfZGlzYWJsZV90aW1lc3RhbXAoKSBpcyBjYWxsZWQgZnJvbSBpcnEgY29udGV4dCwgZGVmZXIgdGhlCisgKiBqdW1wX2xhYmVsX2RlYygpIGNhbGxzLgorICovCitzdGF0aWMgYXRvbWljX3QgbmV0c3RhbXBfbmVlZGVkX2RlZmVycmVkOworI2VuZGlmCiAKIHZvaWQgbmV0X2VuYWJsZV90aW1lc3RhbXAodm9pZCkKIHsKLQlhdG9taWNfaW5jKCZuZXRzdGFtcF9uZWVkZWQpOworI2lmZGVmIEhBVkVfSlVNUF9MQUJFTAorCWludCBkZWZlcnJlZCA9IGF0b21pY194Y2hnKCZuZXRzdGFtcF9uZWVkZWRfZGVmZXJyZWQsIDApOworCisJaWYgKGRlZmVycmVkKSB7CisJCXdoaWxlICgtLWRlZmVycmVkKQorCQkJanVtcF9sYWJlbF9kZWMoJm5ldHN0YW1wX25lZWRlZCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlXQVJOX09OKGluX2ludGVycnVwdCgpKTsKKwlqdW1wX2xhYmVsX2luYygmbmV0c3RhbXBfbmVlZGVkKTsKIH0KIEVYUE9SVF9TWU1CT0wobmV0X2VuYWJsZV90aW1lc3RhbXApOwogCiB2b2lkIG5ldF9kaXNhYmxlX3RpbWVzdGFtcCh2b2lkKQogewotCWF0b21pY19kZWMoJm5ldHN0YW1wX25lZWRlZCk7CisjaWZkZWYgSEFWRV9KVU1QX0xBQkVMCisJaWYgKGluX2ludGVycnVwdCgpKSB7CisJCWF0b21pY19pbmMoJm5ldHN0YW1wX25lZWRlZF9kZWZlcnJlZCk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwlqdW1wX2xhYmVsX2RlYygmbmV0c3RhbXBfbmVlZGVkKTsKIH0KIEVYUE9SVF9TWU1CT0wobmV0X2Rpc2FibGVfdGltZXN0YW1wKTsKIAogc3RhdGljIGlubGluZSB2b2lkIG5ldF90aW1lc3RhbXBfc2V0KHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JaWYgKGF0b21pY19yZWFkKCZuZXRzdGFtcF9uZWVkZWQpKQorCXNrYi0+dHN0YW1wLnR2NjQgPSAwOworCWlmIChzdGF0aWNfYnJhbmNoKCZuZXRzdGFtcF9uZWVkZWQpKQogCQlfX25ldF90aW1lc3RhbXAoc2tiKTsKLQllbHNlCi0JCXNrYi0+dHN0YW1wLnR2NjQgPSAwOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgbmV0X3RpbWVzdGFtcF9jaGVjayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCWlmICghc2tiLT50c3RhbXAudHY2NCAmJiBhdG9taWNfcmVhZCgmbmV0c3RhbXBfbmVlZGVkKSkKLQkJX19uZXRfdGltZXN0YW1wKHNrYik7Ci19CisjZGVmaW5lIG5ldF90aW1lc3RhbXBfY2hlY2soQ09ORCwgU0tCKQkJCVwKKwlpZiAoc3RhdGljX2JyYW5jaCgmbmV0c3RhbXBfbmVlZGVkKSkgewkJXAorCQlpZiAoKENPTkQpICYmICEoU0tCKS0+dHN0YW1wLnR2NjQpCVwKKwkJCV9fbmV0X3RpbWVzdGFtcChTS0IpOwkJXAorCX0JCQkJCQlcCiAKIHN0YXRpYyBpbnQgbmV0X2h3dHN0YW1wX3ZhbGlkYXRlKHN0cnVjdCBpZnJlcSAqaWZyKQogewpAQCAtMTkyMyw3ICsxOTM2LDggQEAKICAqCUl0IG1heSByZXR1cm4gTlVMTCBpZiB0aGUgc2tiIHJlcXVpcmVzIG5vIHNlZ21lbnRhdGlvbi4gIFRoaXMgaXMKICAqCW9ubHkgcG9zc2libGUgd2hlbiBHU08gaXMgdXNlZCBmb3IgdmVyaWZ5aW5nIGhlYWRlciBpbnRlZ3JpdHkuCiAgKi8KLXN0cnVjdCBza19idWZmICpza2JfZ3NvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGZlYXR1cmVzKQorc3RydWN0IHNrX2J1ZmYgKnNrYl9nc29fc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBza19idWZmICpzZWdzID0gRVJSX1BUUigtRVBST1RPTk9TVVBQT1JUKTsKIAlzdHJ1Y3QgcGFja2V0X3R5cGUgKnB0eXBlOwpAQCAtMTk1Myw5ICsxOTY3LDkgQEAKIAkJaWYgKGRldiAmJiBkZXYtPmV0aHRvb2xfb3BzICYmIGRldi0+ZXRodG9vbF9vcHMtPmdldF9kcnZpbmZvKQogCQkJZGV2LT5ldGh0b29sX29wcy0+Z2V0X2RydmluZm8oZGV2LCAmaW5mbyk7CiAKLQkJV0FSTigxLCAiJXM6IGNhcHM9KDB4JWx4LCAweCVseCkgbGVuPSVkIGRhdGFfbGVuPSVkIGlwX3N1bW1lZD0lZFxuIiwKLQkJICAgICBpbmZvLmRyaXZlciwgZGV2ID8gZGV2LT5mZWF0dXJlcyA6IDBMLAotCQkgICAgIHNrYi0+c2sgPyBza2ItPnNrLT5za19yb3V0ZV9jYXBzIDogMEwsCisJCVdBUk4oMSwgIiVzOiBjYXBzPSglcE5GLCAlcE5GKSBsZW49JWQgZGF0YV9sZW49JWQgaXBfc3VtbWVkPSVkXG4iLAorCQkgICAgIGluZm8uZHJpdmVyLCBkZXYgPyAmZGV2LT5mZWF0dXJlcyA6IE5VTEwsCisJCSAgICAgc2tiLT5zayA/ICZza2ItPnNrLT5za19yb3V0ZV9jYXBzIDogTlVMTCwKIAkJICAgICBza2ItPmxlbiwgc2tiLT5kYXRhX2xlbiwgc2tiLT5pcF9zdW1tZWQpOwogCiAJCWlmIChza2JfaGVhZGVyX2Nsb25lZChza2IpICYmCkBAIC0yMDY0LDcgKzIwNzgsNyBAQAogICoJVGhpcyBmdW5jdGlvbiBzZWdtZW50cyB0aGUgZ2l2ZW4gc2tiIGFuZCBzdG9yZXMgdGhlIGxpc3Qgb2Ygc2VnbWVudHMKICAqCWluIHNrYi0+bmV4dC4KICAqLwotc3RhdGljIGludCBkZXZfZ3NvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGZlYXR1cmVzKQorc3RhdGljIGludCBkZXZfZ3NvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNlZ3M7CiAKQEAgLTIxMDMsNyArMjExNyw3IEBACiAJfQogfQogCi1zdGF0aWMgYm9vbCBjYW5fY2hlY2tzdW1fcHJvdG9jb2wodW5zaWduZWQgbG9uZyBmZWF0dXJlcywgX19iZTE2IHByb3RvY29sKQorc3RhdGljIGJvb2wgY2FuX2NoZWNrc3VtX3Byb3RvY29sKG5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzLCBfX2JlMTYgcHJvdG9jb2wpCiB7CiAJcmV0dXJuICgoZmVhdHVyZXMgJiBORVRJRl9GX0dFTl9DU1VNKSB8fAogCQkoKGZlYXR1cmVzICYgTkVUSUZfRl9WNF9DU1VNKSAmJgpAQCAtMjExNCw3ICsyMTI4LDggQEAKIAkJIHByb3RvY29sID09IGh0b25zKEVUSF9QX0ZDT0UpKSk7CiB9CiAKLXN0YXRpYyB1MzIgaGFybW9uaXplX2ZlYXR1cmVzKHN0cnVjdCBza19idWZmICpza2IsIF9fYmUxNiBwcm90b2NvbCwgdTMyIGZlYXR1cmVzKQorc3RhdGljIG5ldGRldl9mZWF0dXJlc190IGhhcm1vbml6ZV9mZWF0dXJlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCV9fYmUxNiBwcm90b2NvbCwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJaWYgKCFjYW5fY2hlY2tzdW1fcHJvdG9jb2woZmVhdHVyZXMsIHByb3RvY29sKSkgewogCQlmZWF0dXJlcyAmPSB+TkVUSUZfRl9BTExfQ1NVTTsKQEAgLTIxMjYsMTAgKzIxNDEsMTAgQEAKIAlyZXR1cm4gZmVhdHVyZXM7CiB9CiAKLXUzMiBuZXRpZl9za2JfZmVhdHVyZXMoc3RydWN0IHNrX2J1ZmYgKnNrYikKK25ldGRldl9mZWF0dXJlc190IG5ldGlmX3NrYl9mZWF0dXJlcyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCV9fYmUxNiBwcm90b2NvbCA9IHNrYi0+cHJvdG9jb2w7Ci0JdTMyIGZlYXR1cmVzID0gc2tiLT5kZXYtPmZlYXR1cmVzOworCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzID0gc2tiLT5kZXYtPmZlYXR1cmVzOwogCiAJaWYgKHByb3RvY29sID09IGh0b25zKEVUSF9QXzgwMjFRKSkgewogCQlzdHJ1Y3Qgdmxhbl9ldGhoZHIgKnZlaCA9IChzdHJ1Y3Qgdmxhbl9ldGhoZHIgKilza2ItPmRhdGE7CkBAIC0yMTc1LDcgKzIxOTAsNyBAQAogCXVuc2lnbmVkIGludCBza2JfbGVuOwogCiAJaWYgKGxpa2VseSghc2tiLT5uZXh0KSkgewotCQl1MzIgZmVhdHVyZXM7CisJCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzOwogCiAJCS8qCiAJCSAqIElmIGRldmljZSBkb2Vzbid0IG5lZWQgc2tiLT5kc3QsIHJlbGVhc2UgaXQgcmlnaHQgbm93IHdoaWxlCkBAIC0yMjU2LDcgKzIyNzEsNyBAQAogCQkJcmV0dXJuIHJjOwogCQl9CiAJCXR4cV90cmFuc191cGRhdGUodHhxKTsKLQkJaWYgKHVubGlrZWx5KG5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSAmJiBza2ItPm5leHQpKQorCQlpZiAodW5saWtlbHkobmV0aWZfeG1pdF9zdG9wcGVkKHR4cSkgJiYgc2tiLT5uZXh0KSkKIAkJCXJldHVybiBORVRERVZfVFhfQlVTWTsKIAl9IHdoaWxlIChza2ItPm5leHQpOwogCkBAIC0yNDU2LDYgKzI0NzEsMTggQEAKIAlyZXR1cm4gcmM7CiB9CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRQUklPX0NHUk9VUCkKK3N0YXRpYyB2b2lkIHNrYl91cGRhdGVfcHJpbyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRwcmlvX21hcCAqbWFwID0gcmN1X2RlcmVmZXJlbmNlX2JoKHNrYi0+ZGV2LT5wcmlvbWFwKTsKKworCWlmICgoIXNrYi0+cHJpb3JpdHkpICYmIChza2ItPnNrKSAmJiBtYXApCisJCXNrYi0+cHJpb3JpdHkgPSBtYXAtPnByaW9tYXBbc2tiLT5zay0+c2tfY2dycF9wcmlvaWR4XTsKK30KKyNlbHNlCisjZGVmaW5lIHNrYl91cGRhdGVfcHJpbyhza2IpCisjZW5kaWYKKwogc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgeG1pdF9yZWN1cnNpb24pOwogI2RlZmluZSBSRUNVUlNJT05fTElNSVQgMTAKIApAQCAtMjQ5Niw2ICsyNTIzLDggQEAKIAkgKi8KIAlyY3VfcmVhZF9sb2NrX2JoKCk7CiAKKwlza2JfdXBkYXRlX3ByaW8oc2tiKTsKKwogCXR4cSA9IGRldl9waWNrX3R4KGRldiwgc2tiKTsKIAlxID0gcmN1X2RlcmVmZXJlbmNlX2JoKHR4cS0+cWRpc2MpOwogCkBAIC0yNTMwLDcgKzI1NTksNyBAQAogCiAJCQlIQVJEX1RYX0xPQ0soZGV2LCB0eHEsIGNwdSk7CiAKLQkJCWlmICghbmV0aWZfdHhfcXVldWVfc3RvcHBlZCh0eHEpKSB7CisJCQlpZiAoIW5ldGlmX3htaXRfc3RvcHBlZCh0eHEpKSB7CiAJCQkJX190aGlzX2NwdV9pbmMoeG1pdF9yZWN1cnNpb24pOwogCQkJCXJjID0gZGV2X2hhcmRfc3RhcnRfeG1pdChza2IsIGRldiwgdHhxKTsKIAkJCQlfX3RoaXNfY3B1X2RlYyh4bWl0X3JlY3Vyc2lvbik7CkBAIC0yNTkxLDEyMyArMjYyMCwyOCBAQAogICovCiB2b2lkIF9fc2tiX2dldF9yeGhhc2goc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpbnQgbmhvZmYsIGhhc2ggPSAwLCBwb2ZmOwotCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcDY7Ci0JY29uc3Qgc3RydWN0IGlwaGRyICppcDsKLQljb25zdCBzdHJ1Y3Qgdmxhbl9oZHIgKnZsYW47Ci0JdTggaXBfcHJvdG87Ci0JdTMyIGFkZHIxLCBhZGRyMjsKLQl1MTYgcHJvdG87Ci0JdW5pb24gewotCQl1MzIgdjMyOwotCQl1MTYgdjE2WzJdOwotCX0gcG9ydHM7CisJc3RydWN0IGZsb3dfa2V5cyBrZXlzOworCXUzMiBoYXNoOwogCi0JbmhvZmYgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKLQlwcm90byA9IHNrYi0+cHJvdG9jb2w7CisJaWYgKCFza2JfZmxvd19kaXNzZWN0KHNrYiwgJmtleXMpKQorCQlyZXR1cm47CiAKLWFnYWluOgotCXN3aXRjaCAocHJvdG8pIHsKLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOgotaXA6Ci0JCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaXApICsgbmhvZmYpKQotCQkJZ290byBkb25lOwotCi0JCWlwID0gKGNvbnN0IHN0cnVjdCBpcGhkciAqKSAoc2tiLT5kYXRhICsgbmhvZmYpOwotCQlpZiAoaXBfaXNfZnJhZ21lbnQoaXApKQotCQkJaXBfcHJvdG8gPSAwOwotCQllbHNlCi0JCQlpcF9wcm90byA9IGlwLT5wcm90b2NvbDsKLQkJYWRkcjEgPSAoX19mb3JjZSB1MzIpIGlwLT5zYWRkcjsKLQkJYWRkcjIgPSAoX19mb3JjZSB1MzIpIGlwLT5kYWRkcjsKLQkJbmhvZmYgKz0gaXAtPmlobCAqIDQ7Ci0JCWJyZWFrOwotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KToKLWlwdjY6Ci0JCWlmICghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZigqaXA2KSArIG5ob2ZmKSkKLQkJCWdvdG8gZG9uZTsKLQotCQlpcDYgPSAoY29uc3Qgc3RydWN0IGlwdjZoZHIgKikgKHNrYi0+ZGF0YSArIG5ob2ZmKTsKLQkJaXBfcHJvdG8gPSBpcDYtPm5leHRoZHI7Ci0JCWFkZHIxID0gKF9fZm9yY2UgdTMyKSBpcDYtPnNhZGRyLnM2X2FkZHIzMlszXTsKLQkJYWRkcjIgPSAoX19mb3JjZSB1MzIpIGlwNi0+ZGFkZHIuczZfYWRkcjMyWzNdOwotCQluaG9mZiArPSA0MDsKLQkJYnJlYWs7Ci0JY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKToKLQkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKCp2bGFuKSArIG5ob2ZmKSkKLQkJCWdvdG8gZG9uZTsKLQkJdmxhbiA9IChjb25zdCBzdHJ1Y3Qgdmxhbl9oZHIgKikgKHNrYi0+ZGF0YSArIG5ob2ZmKTsKLQkJcHJvdG8gPSB2bGFuLT5oX3ZsYW5fZW5jYXBzdWxhdGVkX3Byb3RvOwotCQluaG9mZiArPSBzaXplb2YoKnZsYW4pOwotCQlnb3RvIGFnYWluOwotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9QUFBfU0VTKToKLQkJaWYgKCFwc2tiX21heV9wdWxsKHNrYiwgUFBQT0VfU0VTX0hMRU4gKyBuaG9mZikpCi0JCQlnb3RvIGRvbmU7Ci0JCXByb3RvID0gKigoX19iZTE2ICopIChza2ItPmRhdGEgKyBuaG9mZiArCi0JCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBwcHBvZV9oZHIpKSk7Ci0JCW5ob2ZmICs9IFBQUE9FX1NFU19ITEVOOwotCQlzd2l0Y2ggKHByb3RvKSB7Ci0JCWNhc2UgX19jb25zdGFudF9odG9ucyhQUFBfSVApOgotCQkJZ290byBpcDsKLQkJY2FzZSBfX2NvbnN0YW50X2h0b25zKFBQUF9JUFY2KToKLQkJCWdvdG8gaXB2NjsKLQkJZGVmYXVsdDoKLQkJCWdvdG8gZG9uZTsKLQkJfQotCWRlZmF1bHQ6Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlzd2l0Y2ggKGlwX3Byb3RvKSB7Ci0JY2FzZSBJUFBST1RPX0dSRToKLQkJaWYgKHBza2JfbWF5X3B1bGwoc2tiLCBuaG9mZiArIDE2KSkgewotCQkJdTggKmggPSBza2ItPmRhdGEgKyBuaG9mZjsKLQkJCV9fYmUxNiBmbGFncyA9ICooX19iZTE2ICopaDsKLQotCQkJLyoKLQkJCSAqIE9ubHkgbG9vayBpbnNpZGUgR1JFIGlmIHZlcnNpb24gemVybyBhbmQgbm8KLQkJCSAqIHJvdXRpbmcKLQkJCSAqLwotCQkJaWYgKCEoZmxhZ3MgJiAoR1JFX1ZFUlNJT058R1JFX1JPVVRJTkcpKSkgewotCQkJCXByb3RvID0gKihfX2JlMTYgKikoaCArIDIpOwotCQkJCW5ob2ZmICs9IDQ7Ci0JCQkJaWYgKGZsYWdzICYgR1JFX0NTVU0pCi0JCQkJCW5ob2ZmICs9IDQ7Ci0JCQkJaWYgKGZsYWdzICYgR1JFX0tFWSkKLQkJCQkJbmhvZmYgKz0gNDsKLQkJCQlpZiAoZmxhZ3MgJiBHUkVfU0VRKQotCQkJCQluaG9mZiArPSA0OwotCQkJCWdvdG8gYWdhaW47Ci0JCQl9Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBJUFBST1RPX0lQSVA6Ci0JCWdvdG8gYWdhaW47Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcG9ydHMudjMyID0gMDsKLQlwb2ZmID0gcHJvdG9fcG9ydHNfb2Zmc2V0KGlwX3Byb3RvKTsKLQlpZiAocG9mZiA+PSAwKSB7Ci0JCW5ob2ZmICs9IHBvZmY7Ci0JCWlmIChwc2tiX21heV9wdWxsKHNrYiwgbmhvZmYgKyA0KSkgewotCQkJcG9ydHMudjMyID0gKiAoX19mb3JjZSB1MzIgKikgKHNrYi0+ZGF0YSArIG5ob2ZmKTsKLQkJCWlmIChwb3J0cy52MTZbMV0gPCBwb3J0cy52MTZbMF0pCi0JCQkJc3dhcChwb3J0cy52MTZbMF0sIHBvcnRzLnYxNlsxXSk7Ci0JCQlza2ItPmw0X3J4aGFzaCA9IDE7Ci0JCX0KKwlpZiAoa2V5cy5wb3J0cykgeworCQlpZiAoKF9fZm9yY2UgdTE2KWtleXMucG9ydDE2WzFdIDwgKF9fZm9yY2UgdTE2KWtleXMucG9ydDE2WzBdKQorCQkJc3dhcChrZXlzLnBvcnQxNlswXSwga2V5cy5wb3J0MTZbMV0pOworCQlza2ItPmw0X3J4aGFzaCA9IDE7CiAJfQogCiAJLyogZ2V0IGEgY29uc2lzdGVudCBoYXNoIChzYW1lIHZhbHVlIG9uIGJvdGggZmxvdyBkaXJlY3Rpb25zKSAqLwotCWlmIChhZGRyMiA8IGFkZHIxKQotCQlzd2FwKGFkZHIxLCBhZGRyMik7CisJaWYgKChfX2ZvcmNlIHUzMilrZXlzLmRzdCA8IChfX2ZvcmNlIHUzMilrZXlzLnNyYykKKwkJc3dhcChrZXlzLmRzdCwga2V5cy5zcmMpOwogCi0JaGFzaCA9IGpoYXNoXzN3b3JkcyhhZGRyMSwgYWRkcjIsIHBvcnRzLnYzMiwgaGFzaHJuZCk7CisJaGFzaCA9IGpoYXNoXzN3b3JkcygoX19mb3JjZSB1MzIpa2V5cy5kc3QsCisJCQkgICAgKF9fZm9yY2UgdTMyKWtleXMuc3JjLAorCQkJICAgIChfX2ZvcmNlIHUzMilrZXlzLnBvcnRzLCBoYXNocm5kKTsKIAlpZiAoIWhhc2gpCiAJCWhhc2ggPSAxOwogCi1kb25lOgogCXNrYi0+cnhoYXNoID0gaGFzaDsKIH0KIEVYUE9SVF9TWU1CT0woX19za2JfZ2V0X3J4aGFzaCk7CkBAIC0yNzE4LDYgKzI2NTIsOCBAQAogc3RydWN0IHJwc19zb2NrX2Zsb3dfdGFibGUgX19yY3UgKnJwc19zb2NrX2Zsb3dfdGFibGUgX19yZWFkX21vc3RseTsKIEVYUE9SVF9TWU1CT0wocnBzX3NvY2tfZmxvd190YWJsZSk7CiAKK3N0cnVjdCBqdW1wX2xhYmVsX2tleSBycHNfbmVlZGVkIF9fcmVhZF9tb3N0bHk7CisKIHN0YXRpYyBzdHJ1Y3QgcnBzX2Rldl9mbG93ICoKIHNldF9ycHNfY3B1KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBza19idWZmICpza2IsCiAJICAgIHN0cnVjdCBycHNfZGV2X2Zsb3cgKnJmbG93LCB1MTYgbmV4dF9jcHUpCkBAIC0yOTk3LDEyICsyOTMzLDExIEBACiAJaWYgKG5ldHBvbGxfcngoc2tiKSkKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCi0JaWYgKG5ldGRldl90c3RhbXBfcHJlcXVldWUpCi0JCW5ldF90aW1lc3RhbXBfY2hlY2soc2tiKTsKKwluZXRfdGltZXN0YW1wX2NoZWNrKG5ldGRldl90c3RhbXBfcHJlcXVldWUsIHNrYik7CiAKIAl0cmFjZV9uZXRpZl9yeChza2IpOwogI2lmZGVmIENPTkZJR19SUFMKLQl7CisJaWYgKHN0YXRpY19icmFuY2goJnJwc19uZWVkZWQpKQl7CiAJCXN0cnVjdCBycHNfZGV2X2Zsb3cgdm9pZGZsb3csICpyZmxvdyA9ICZ2b2lkZmxvdzsKIAkJaW50IGNwdTsKIApAQCAtMzAxNywxNCArMjk1MiwxMyBAQAogCiAJCXJjdV9yZWFkX3VubG9jaygpOwogCQlwcmVlbXB0X2VuYWJsZSgpOwotCX0KLSNlbHNlCisJfSBlbHNlCisjZW5kaWYKIAl7CiAJCXVuc2lnbmVkIGludCBxdGFpbDsKIAkJcmV0ID0gZW5xdWV1ZV90b19iYWNrbG9nKHNrYiwgZ2V0X2NwdSgpLCAmcXRhaWwpOwogCQlwdXRfY3B1KCk7CiAJfQotI2VuZGlmCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0wobmV0aWZfcngpOwpAQCAtMzIzMCw4ICszMTY0LDcgQEAKIAlpbnQgcmV0ID0gTkVUX1JYX0RST1A7CiAJX19iZTE2IHR5cGU7CiAKLQlpZiAoIW5ldGRldl90c3RhbXBfcHJlcXVldWUpCi0JCW5ldF90aW1lc3RhbXBfY2hlY2soc2tiKTsKKwluZXRfdGltZXN0YW1wX2NoZWNrKCFuZXRkZXZfdHN0YW1wX3ByZXF1ZXVlLCBza2IpOwogCiAJdHJhY2VfbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKIApAQCAtMzM2MiwxNCArMzI5NSwxMyBAQAogICovCiBpbnQgbmV0aWZfcmVjZWl2ZV9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlpZiAobmV0ZGV2X3RzdGFtcF9wcmVxdWV1ZSkKLQkJbmV0X3RpbWVzdGFtcF9jaGVjayhza2IpOworCW5ldF90aW1lc3RhbXBfY2hlY2sobmV0ZGV2X3RzdGFtcF9wcmVxdWV1ZSwgc2tiKTsKIAogCWlmIChza2JfZGVmZXJfcnhfdGltZXN0YW1wKHNrYikpCiAJCXJldHVybiBORVRfUlhfU1VDQ0VTUzsKIAogI2lmZGVmIENPTkZJR19SUFMKLQl7CisJaWYgKHN0YXRpY19icmFuY2goJnJwc19uZWVkZWQpKSB7CiAJCXN0cnVjdCBycHNfZGV2X2Zsb3cgdm9pZGZsb3csICpyZmxvdyA9ICZ2b2lkZmxvdzsKIAkJaW50IGNwdSwgcmV0OwogCkBAIC0zMzgwLDE2ICszMzEyLDEyIEBACiAJCWlmIChjcHUgPj0gMCkgewogCQkJcmV0ID0gZW5xdWV1ZV90b19iYWNrbG9nKHNrYiwgY3B1LCAmcmZsb3ctPmxhc3RfcXRhaWwpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCX0gZWxzZSB7Ci0JCQlyY3VfcmVhZF91bmxvY2soKTsKLQkJCXJldCA9IF9fbmV0aWZfcmVjZWl2ZV9za2Ioc2tiKTsKKwkJCXJldHVybiByZXQ7CiAJCX0KLQotCQlyZXR1cm4gcmV0OworCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9Ci0jZWxzZQotCXJldHVybiBfX25ldGlmX3JlY2VpdmVfc2tiKHNrYik7CiAjZW5kaWYKKwlyZXR1cm4gX19uZXRpZl9yZWNlaXZlX3NrYihza2IpOwogfQogRVhQT1JUX1NZTUJPTChuZXRpZl9yZWNlaXZlX3NrYik7CiAKQEAgLTQyODIsNiArNDIxMCwxMiBAQAogCQkJICAgIHNpemVvZihzdHJ1Y3QgZGV2X2l0ZXJfc3RhdGUpKTsKIH0KIAoraW50IGRldl9zZXFfb3Blbl9vcHMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgICAgY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zICpvcHMpCit7CisJcmV0dXJuIHNlcV9vcGVuX25ldChpbm9kZSwgZmlsZSwgb3BzLCBzaXplb2Yoc3RydWN0IGRldl9pdGVyX3N0YXRlKSk7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGRldl9zZXFfZm9wcyA9IHsKIAkub3duZXIJID0gVEhJU19NT0RVTEUsCiAJLm9wZW4gICAgPSBkZXZfc2VxX29wZW4sCkBAIC00NTMyLDcgKzQ0NjYsNyBAQAogCiBzdGF0aWMgaW50IF9fZGV2X3NldF9wcm9taXNjdWl0eShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBpbnQgaW5jKQogewotCXVuc2lnbmVkIHNob3J0IG9sZF9mbGFncyA9IGRldi0+ZmxhZ3M7CisJdW5zaWduZWQgaW50IG9sZF9mbGFncyA9IGRldi0+ZmxhZ3M7CiAJdWlkX3QgdWlkOwogCWdpZF90IGdpZDsKIApAQCAtNDU4OSw3ICs0NTIzLDcgQEAKICAqLwogaW50IGRldl9zZXRfcHJvbWlzY3VpdHkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluYykKIHsKLQl1bnNpZ25lZCBzaG9ydCBvbGRfZmxhZ3MgPSBkZXYtPmZsYWdzOworCXVuc2lnbmVkIGludCBvbGRfZmxhZ3MgPSBkZXYtPmZsYWdzOwogCWludCBlcnI7CiAKIAllcnIgPSBfX2Rldl9zZXRfcHJvbWlzY3VpdHkoZGV2LCBpbmMpOwpAQCAtNDYxNiw3ICs0NTUwLDcgQEAKIAogaW50IGRldl9zZXRfYWxsbXVsdGkoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IGluYykKIHsKLQl1bnNpZ25lZCBzaG9ydCBvbGRfZmxhZ3MgPSBkZXYtPmZsYWdzOworCXVuc2lnbmVkIGludCBvbGRfZmxhZ3MgPSBkZXYtPmZsYWdzOwogCiAJQVNTRVJUX1JUTkwoKTsKIApAQCAtNDcxOSw3ICs0NjUzLDcgQEAKIAogaW50IF9fZGV2X2NoYW5nZV9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0JaW50IG9sZF9mbGFncyA9IGRldi0+ZmxhZ3M7CisJdW5zaWduZWQgaW50IG9sZF9mbGFncyA9IGRldi0+ZmxhZ3M7CiAJaW50IHJldDsKIAogCUFTU0VSVF9SVE5MKCk7CkBAIC00ODAyLDEwICs0NzM2LDEwIEBACiAgKglDaGFuZ2Ugc2V0dGluZ3Mgb24gZGV2aWNlIGJhc2VkIHN0YXRlIGZsYWdzLiBUaGUgZmxhZ3MgYXJlCiAgKglpbiB0aGUgdXNlcnNwYWNlIGV4cG9ydGVkIGZvcm1hdC4KICAqLwotaW50IGRldl9jaGFuZ2VfZmxhZ3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdW5zaWduZWQgZmxhZ3MpCitpbnQgZGV2X2NoYW5nZV9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0JaW50IHJldCwgY2hhbmdlczsKLQlpbnQgb2xkX2ZsYWdzID0gZGV2LT5mbGFnczsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGludCBjaGFuZ2VzLCBvbGRfZmxhZ3MgPSBkZXYtPmZsYWdzOwogCiAJcmV0ID0gX19kZXZfY2hhbmdlX2ZsYWdzKGRldiwgZmxhZ3MpOwogCWlmIChyZXQgPCAwKQpAQCAtNTM2Miw3ICs1Mjk2LDggQEAKIAlsaXN0X2RlbCgmc2luZ2xlKTsKIH0KIAotc3RhdGljIHUzMiBuZXRkZXZfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBuZXRkZXZfZml4X2ZlYXR1cmVzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJLyogRml4IGlsbGVnYWwgY2hlY2tzdW0gY29tYmluYXRpb25zICovCiAJaWYgKChmZWF0dXJlcyAmIE5FVElGX0ZfSFdfQ1NVTSkgJiYKQEAgLTUzNzEsMTIgKzUzMDYsNiBAQAogCQlmZWF0dXJlcyAmPSB+KE5FVElGX0ZfSVBfQ1NVTXxORVRJRl9GX0lQVjZfQ1NVTSk7CiAJfQogCi0JaWYgKChmZWF0dXJlcyAmIE5FVElGX0ZfTk9fQ1NVTSkgJiYKLQkgICAgKGZlYXR1cmVzICYgKE5FVElGX0ZfSFdfQ1NVTXxORVRJRl9GX0lQX0NTVU18TkVUSUZfRl9JUFY2X0NTVU0pKSkgewotCQluZXRkZXZfd2FybihkZXYsICJtaXhlZCBubyBjaGVja3N1bW1pbmcgYW5kIG90aGVyIHNldHRpbmdzLlxuIik7Ci0JCWZlYXR1cmVzICY9IH4oTkVUSUZfRl9JUF9DU1VNfE5FVElGX0ZfSVBWNl9DU1VNfE5FVElGX0ZfSFdfQ1NVTSk7Ci0JfQotCiAJLyogRml4IGlsbGVnYWwgU0crQ1NVTSBjb21iaW5hdGlvbnMuICovCiAJaWYgKChmZWF0dXJlcyAmIE5FVElGX0ZfU0cpICYmCiAJICAgICEoZmVhdHVyZXMgJiBORVRJRl9GX0FMTF9DU1VNKSkgewpAQCAtNTQyNCw3ICs1MzUzLDcgQEAKIAogaW50IF9fbmV0ZGV2X3VwZGF0ZV9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCXUzMiBmZWF0dXJlczsKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlczsKIAlpbnQgZXJyID0gMDsKIAogCUFTU0VSVF9SVE5MKCk7CkBAIC01NDQwLDE2ICs1MzY5LDE2IEBACiAJaWYgKGRldi0+ZmVhdHVyZXMgPT0gZmVhdHVyZXMpCiAJCXJldHVybiAwOwogCi0JbmV0ZGV2X2RiZyhkZXYsICJGZWF0dXJlcyBjaGFuZ2VkOiAweCUwOHggLT4gMHglMDh4XG4iLAotCQlkZXYtPmZlYXR1cmVzLCBmZWF0dXJlcyk7CisJbmV0ZGV2X2RiZyhkZXYsICJGZWF0dXJlcyBjaGFuZ2VkOiAlcE5GIC0+ICVwTkZcbiIsCisJCSZkZXYtPmZlYXR1cmVzLCAmZmVhdHVyZXMpOwogCiAJaWYgKGRldi0+bmV0ZGV2X29wcy0+bmRvX3NldF9mZWF0dXJlcykKIAkJZXJyID0gZGV2LT5uZXRkZXZfb3BzLT5uZG9fc2V0X2ZlYXR1cmVzKGRldiwgZmVhdHVyZXMpOwogCiAJaWYgKHVubGlrZWx5KGVyciA8IDApKSB7CiAJCW5ldGRldl9lcnIoZGV2LAotCQkJInNldF9mZWF0dXJlcygpIGZhaWxlZCAoJWQpOyB3YW50ZWQgMHglMDh4LCBsZWZ0IDB4JTA4eFxuIiwKLQkJCWVyciwgZmVhdHVyZXMsIGRldi0+ZmVhdHVyZXMpOworCQkJInNldF9mZWF0dXJlcygpIGZhaWxlZCAoJWQpOyB3YW50ZWQgJXBORiwgbGVmdCAlcE5GXG4iLAorCQkJZXJyLCAmZmVhdHVyZXMsICZkZXYtPmZlYXR1cmVzKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtNTU0OCw2ICs1NDc3LDkgQEAKIAlxdWV1ZS0+eG1pdF9sb2NrX293bmVyID0gLTE7CiAJbmV0ZGV2X3F1ZXVlX251bWFfbm9kZV93cml0ZShxdWV1ZSwgTlVNQV9OT19OT0RFKTsKIAlxdWV1ZS0+ZGV2ID0gZGV2OworI2lmZGVmIENPTkZJR19CUUwKKwlkcWxfaW5pdCgmcXVldWUtPmRxbCwgSFopOworI2VuZGlmCiB9CiAKIHN0YXRpYyBpbnQgbmV0aWZfYWxsb2NfbmV0ZGV2X3F1ZXVlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQpAQCAtNTYzMywxMSArNTU2NSwxMiBAQAogCWRldi0+d2FudGVkX2ZlYXR1cmVzID0gZGV2LT5mZWF0dXJlcyAmIGRldi0+aHdfZmVhdHVyZXM7CiAKIAkvKiBUdXJuIG9uIG5vIGNhY2hlIGNvcHkgaWYgSFcgaXMgZG9pbmcgY2hlY2tzdW0gKi8KLQlkZXYtPmh3X2ZlYXR1cmVzIHw9IE5FVElGX0ZfTk9DQUNIRV9DT1BZOwotCWlmICgoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfQUxMX0NTVU0pICYmCi0JICAgICEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfTk9fQ1NVTSkpIHsKLQkJZGV2LT53YW50ZWRfZmVhdHVyZXMgfD0gTkVUSUZfRl9OT0NBQ0hFX0NPUFk7Ci0JCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9OT0NBQ0hFX0NPUFk7CisJaWYgKCEoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykpIHsKKwkJZGV2LT5od19mZWF0dXJlcyB8PSBORVRJRl9GX05PQ0FDSEVfQ09QWTsKKwkJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX0FMTF9DU1VNKSB7CisJCQlkZXYtPndhbnRlZF9mZWF0dXJlcyB8PSBORVRJRl9GX05PQ0FDSEVfQ09QWTsKKwkJCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9OT0NBQ0hFX0NPUFk7CisJCX0KIAl9CiAKIAkvKiBNYWtlIE5FVElGX0ZfSElHSERNQSBpbmhlcml0YWJsZSB0byBWTEFOIGRldmljZXMuCkBAIC02MzczLDcgKzYzMDYsOCBAQAogICoJQG9uZSB0byB0aGUgbWFzdGVyIGRldmljZSB3aXRoIGN1cnJlbnQgZmVhdHVyZSBzZXQgQGFsbC4gIFdpbGwgbm90CiAgKgllbmFibGUgYW55dGhpbmcgdGhhdCBpcyBvZmYgaW4gQG1hc2suIFJldHVybnMgdGhlIG5ldyBmZWF0dXJlIHNldC4KICAqLwotdTMyIG5ldGRldl9pbmNyZW1lbnRfZmVhdHVyZXModTMyIGFsbCwgdTMyIG9uZSwgdTMyIG1hc2spCituZXRkZXZfZmVhdHVyZXNfdCBuZXRkZXZfaW5jcmVtZW50X2ZlYXR1cmVzKG5ldGRldl9mZWF0dXJlc190IGFsbCwKKwluZXRkZXZfZmVhdHVyZXNfdCBvbmUsIG5ldGRldl9mZWF0dXJlc190IG1hc2spCiB7CiAJaWYgKG1hc2sgJiBORVRJRl9GX0dFTl9DU1VNKQogCQltYXNrIHw9IE5FVElGX0ZfQUxMX0NTVU07CkBAIC02MzgyLDEwICs2MzE2LDYgQEAKIAlhbGwgfD0gb25lICYgKE5FVElGX0ZfT05FX0ZPUl9BTEx8TkVUSUZfRl9BTExfQ1NVTSkgJiBtYXNrOwogCWFsbCAmPSBvbmUgfCB+TkVUSUZfRl9BTExfRk9SX0FMTDsKIAotCS8qIElmIGRldmljZSBuZWVkcyBjaGVja3N1bW1pbmcsIGRvd25ncmFkZSB0byBpdC4gKi8KLQlpZiAoYWxsICYgKE5FVElGX0ZfQUxMX0NTVU0gJiB+TkVUSUZfRl9OT19DU1VNKSkKLQkJYWxsICY9IH5ORVRJRl9GX05PX0NTVU07Ci0KIAkvKiBJZiBvbmUgZGV2aWNlIHN1cHBvcnRzIGh3IGNoZWNrc3VtbWluZywgc2V0IGZvciBhbGwuICovCiAJaWYgKGFsbCAmIE5FVElGX0ZfR0VOX0NTVU0pCiAJCWFsbCAmPSB+KE5FVElGX0ZfQUxMX0NTVU0gJiB+TkVUSUZfRl9HRU5fQ1NVTSk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9kZXZfYWRkcl9saXN0cy5jIGIvbmV0L2NvcmUvZGV2X2FkZHJfbGlzdHMuYwppbmRleCAyNzdmYWVmLi5mZWJiYTUxIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kZXZfYWRkcl9saXN0cy5jCisrKyBiL25ldC9jb3JlL2Rldl9hZGRyX2xpc3RzLmMKQEAgLTY5Niw4ICs2OTYsNyBAQAogCiBzdGF0aWMgaW50IGRldl9tY19zZXFfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKIHsKLQlyZXR1cm4gc2VxX29wZW5fbmV0KGlub2RlLCBmaWxlLCAmZGV2X21jX3NlcV9vcHMsCi0JCQkgICAgc2l6ZW9mKHN0cnVjdCBzZXFfbmV0X3ByaXZhdGUpKTsKKwlyZXR1cm4gZGV2X3NlcV9vcGVuX29wcyhpbm9kZSwgZmlsZSwgJmRldl9tY19zZXFfb3BzKTsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2X21jX3NlcV9mb3BzID0gewpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZHN0LmMgYi9uZXQvY29yZS9kc3QuYwppbmRleCBkNWUyYzRjLi40M2Q5NGNlIDEwMDY0NAotLS0gYS9uZXQvY29yZS9kc3QuYworKysgYi9uZXQvY29yZS9kc3QuYwpAQCAtMzY2LDcgKzM2Niw3IEBACiAJCWRldl9ob2xkKGRzdC0+ZGV2KTsKIAkJZGV2X3B1dChkZXYpOwogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwkJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZihkc3QpOwogCQlpZiAobmVpZ2ggJiYgbmVpZ2gtPmRldiA9PSBkZXYpIHsKIAkJCW5laWdoLT5kZXYgPSBkc3QtPmRldjsKIAkJCWRldl9ob2xkKGRzdC0+ZGV2KTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2V0aHRvb2wuYyBiL25ldC9jb3JlL2V0aHRvb2wuYwppbmRleCBmNDQ0ODE3Li45MjFhYTJiIDEwMDY0NAotLS0gYS9uZXQvY29yZS9ldGh0b29sLmMKKysrIGIvbmV0L2NvcmUvZXRodG9vbC5jCkBAIC0zNiwyMzUgKzM2LDQ0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGV0aHRvb2xfb3BfZ2V0X2xpbmspOwogCi11MzIgZXRodG9vbF9vcF9nZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCXJldHVybiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfQUxMX0NTVU0pICE9IDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGV0aHRvb2xfb3BfZ2V0X3R4X2NzdW0pOwotCi1pbnQgZXRodG9vbF9vcF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKLXsKLQlpZiAoZGF0YSkKLQkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU07Ci0JZWxzZQotCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX0lQX0NTVU07Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZXRodG9vbF9vcF9zZXRfdHhfY3N1bSk7Ci0KLWludCBldGh0b29sX29wX3NldF90eF9od19jc3VtKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQotewotCWlmIChkYXRhKQotCQlkZXYtPmZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfQ1NVTTsKLQllbHNlCi0JCWRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfSFdfQ1NVTTsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChldGh0b29sX29wX3NldF90eF9od19jc3VtKTsKLQotaW50IGV0aHRvb2xfb3Bfc2V0X3R4X2lwdjZfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKLXsKLQlpZiAoZGF0YSkKLQkJZGV2LT5mZWF0dXJlcyB8PSBORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTTsKLQllbHNlCi0JCWRldi0+ZmVhdHVyZXMgJj0gfihORVRJRl9GX0lQX0NTVU0gfCBORVRJRl9GX0lQVjZfQ1NVTSk7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZXRodG9vbF9vcF9zZXRfdHhfaXB2Nl9jc3VtKTsKLQotdTMyIGV0aHRvb2xfb3BfZ2V0X3NnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9TRykgIT0gMDsKLX0KLUVYUE9SVF9TWU1CT0woZXRodG9vbF9vcF9nZXRfc2cpOwotCi1pbnQgZXRodG9vbF9vcF9zZXRfc2coc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCi17Ci0JaWYgKGRhdGEpCi0JCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9TRzsKLQllbHNlCi0JCWRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfU0c7Ci0KLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZXRodG9vbF9vcF9zZXRfc2cpOwotCi11MzIgZXRodG9vbF9vcF9nZXRfdHNvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9UU08pICE9IDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGV0aHRvb2xfb3BfZ2V0X3Rzbyk7Ci0KLWludCBldGh0b29sX29wX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCi17Ci0JaWYgKGRhdGEpCi0JCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9UU087Ci0JZWxzZQotCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1RTTzsKLQotCXJldHVybiAwOwotfQotRVhQT1JUX1NZTUJPTChldGh0b29sX29wX3NldF90c28pOwotCi11MzIgZXRodG9vbF9vcF9nZXRfdWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCi17Ci0JcmV0dXJuIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9VRk8pICE9IDA7Ci19Ci1FWFBPUlRfU1lNQk9MKGV0aHRvb2xfb3BfZ2V0X3Vmbyk7Ci0KLWludCBldGh0b29sX29wX3NldF91Zm8oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCi17Ci0JaWYgKGRhdGEpCi0JCWRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9VRk87Ci0JZWxzZQotCQlkZXYtPmZlYXR1cmVzICY9IH5ORVRJRl9GX1VGTzsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZXRodG9vbF9vcF9zZXRfdWZvKTsKLQotLyogdGhlIGZvbGxvd2luZyBsaXN0IG9mIGZsYWdzIGFyZSB0aGUgc2FtZSBhcyB0aGVpciBhc3NvY2lhdGVkCi0gKiBORVRJRl9GX3h4eCB2YWx1ZXMgaW4gaW5jbHVkZS9saW51eC9uZXRkZXZpY2UuaAotICovCi1zdGF0aWMgY29uc3QgdTMyIGZsYWdzX2R1cF9mZWF0dXJlcyA9Ci0JKEVUSF9GTEFHX0xSTyB8IEVUSF9GTEFHX1JYVkxBTiB8IEVUSF9GTEFHX1RYVkxBTiB8IEVUSF9GTEFHX05UVVBMRSB8Ci0JIEVUSF9GTEFHX1JYSEFTSCk7Ci0KLXUzMiBldGh0b29sX29wX2dldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQotewotCS8qIGluIHRoZSBmdXR1cmUsIHRoaXMgZnVuY3Rpb24gd2lsbCBwcm9iYWJseSBjb250YWluIGFkZGl0aW9uYWwKLQkgKiBoYW5kbGluZyBmb3IgZmxhZ3Mgd2hpY2ggYXJlIG5vdCBzbyBlYXNpbHkgaGFuZGxlZAotCSAqIGJ5IGEgc2ltcGxlIG1hc2tpbmcgb3BlcmF0aW9uCi0JICovCi0KLQlyZXR1cm4gZGV2LT5mZWF0dXJlcyAmIGZsYWdzX2R1cF9mZWF0dXJlczsKLX0KLUVYUE9SVF9TWU1CT0woZXRodG9vbF9vcF9nZXRfZmxhZ3MpOwotCi0vKiBDaGVjayBpZiBkZXZpY2UgY2FuIGVuYWJsZSAob3IgZGlzYWJsZSkgcGFydGljdWxhciBmZWF0dXJlIGNvZGVkIGluICJkYXRhIgotICogYXJndW1lbnQuIEZsYWdzICJzdXBwb3J0ZWQiIGRlc2NyaWJlIGZlYXR1cmVzIHRoYXQgY2FuIGJlIHRvZ2dsZWQgYnkgZGV2aWNlLgotICogSWYgZmVhdHVyZSBjYW4gbm90IGJlIHRvZ2dsZWQsIGl0IHN0YXRlIChlbmFibGVkIG9yIGRpc2FibGVkKSBtdXN0IG1hdGNoCi0gKiBoYXJkY29kZWQgZGV2aWNlIGZlYXR1cmVzIHN0YXRlLCBvdGhlcndpc2UgZmxhZ3MgYXJlIG1hcmtlZCBhcyBpbnZhbGlkLgotICovCi1ib29sIGV0aHRvb2xfaW52YWxpZF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSwgdTMyIHN1cHBvcnRlZCkKLXsKLQl1MzIgZmVhdHVyZXMgPSBkZXYtPmZlYXR1cmVzICYgZmxhZ3NfZHVwX2ZlYXR1cmVzOwotCS8qICJkYXRhIiBjYW4gY29udGFpbiBvbmx5IGZsYWdzX2R1cF9mZWF0dXJlcyBiaXRzLAotCSAqIHNlZSBfX2V0aHRvb2xfc2V0X2ZsYWdzICovCi0KLQlyZXR1cm4gKGZlYXR1cmVzICYgfnN1cHBvcnRlZCkgIT0gKGRhdGEgJiB+c3VwcG9ydGVkKTsKLX0KLUVYUE9SVF9TWU1CT0woZXRodG9vbF9pbnZhbGlkX2ZsYWdzKTsKLQotaW50IGV0aHRvb2xfb3Bfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhLCB1MzIgc3VwcG9ydGVkKQotewotCWlmIChldGh0b29sX2ludmFsaWRfZmxhZ3MoZGV2LCBkYXRhLCBzdXBwb3J0ZWQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRldi0+ZmVhdHVyZXMgPSAoKGRldi0+ZmVhdHVyZXMgJiB+ZmxhZ3NfZHVwX2ZlYXR1cmVzKSB8Ci0JCQkgKGRhdGEgJiBmbGFnc19kdXBfZmVhdHVyZXMpKTsKLQlyZXR1cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0woZXRodG9vbF9vcF9zZXRfZmxhZ3MpOwotCiAvKiBIYW5kbGVycyBmb3IgZWFjaCBldGh0b29sIGNvbW1hbmQgKi8KIAotI2RlZmluZSBFVEhUT09MX0RFVl9GRUFUVVJFX1dPUkRTCTEKKyNkZWZpbmUgRVRIVE9PTF9ERVZfRkVBVFVSRV9XT1JEUwkoKE5FVERFVl9GRUFUVVJFX0NPVU5UICsgMzEpIC8gMzIpCiAKLXN0YXRpYyB2b2lkIGV0aHRvb2xfZ2V0X2ZlYXR1cmVzX2NvbXBhdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCXN0cnVjdCBldGh0b29sX2dldF9mZWF0dXJlc19ibG9jayAqZmVhdHVyZXMpCi17Ci0JaWYgKCFkZXYtPmV0aHRvb2xfb3BzKQotCQlyZXR1cm47CitzdGF0aWMgY29uc3QgY2hhciBuZXRkZXZfZmVhdHVyZXNfc3RyaW5nc1tORVRERVZfRkVBVFVSRV9DT1VOVF1bRVRIX0dTVFJJTkdfTEVOXSA9IHsKKwlbTkVUSUZfRl9TR19CSVRdID0gICAgICAgICAgICAgICAidHgtc2NhdHRlci1nYXRoZXIiLAorCVtORVRJRl9GX0lQX0NTVU1fQklUXSA9ICAgICAgICAgICJ0eC1jaGVja3N1bS1pcHY0IiwKKwlbTkVUSUZfRl9IV19DU1VNX0JJVF0gPSAgICAgICAgICAidHgtY2hlY2tzdW0taXAtZ2VuZXJpYyIsCisJW05FVElGX0ZfSVBWNl9DU1VNX0JJVF0gPSAgICAgICAgInR4LWNoZWNrc3VtLWlwdjYiLAorCVtORVRJRl9GX0hJR0hETUFfQklUXSA9ICAgICAgICAgICJoaWdoZG1hIiwKKwlbTkVUSUZfRl9GUkFHTElTVF9CSVRdID0gICAgICAgICAidHgtc2NhdHRlci1nYXRoZXItZnJhZ2xpc3QiLAorCVtORVRJRl9GX0hXX1ZMQU5fVFhfQklUXSA9ICAgICAgICJ0eC12bGFuLWh3LWluc2VydCIsCiAKLQkvKiBnZXR0aW5nIFJYIGNoZWNrc3VtICovCi0JaWYgKGRldi0+ZXRodG9vbF9vcHMtPmdldF9yeF9jc3VtKQotCQlpZiAoZGV2LT5ldGh0b29sX29wcy0+Z2V0X3J4X2NzdW0oZGV2KSkKLQkJCWZlYXR1cmVzWzBdLmFjdGl2ZSB8PSBORVRJRl9GX1JYQ1NVTTsKKwlbTkVUSUZfRl9IV19WTEFOX1JYX0JJVF0gPSAgICAgICAicngtdmxhbi1ody1wYXJzZSIsCisJW05FVElGX0ZfSFdfVkxBTl9GSUxURVJfQklUXSA9ICAgInJ4LXZsYW4tZmlsdGVyIiwKKwlbTkVUSUZfRl9WTEFOX0NIQUxMRU5HRURfQklUXSA9ICAidmxhbi1jaGFsbGVuZ2VkIiwKKwlbTkVUSUZfRl9HU09fQklUXSA9ICAgICAgICAgICAgICAidHgtZ2VuZXJpYy1zZWdtZW50YXRpb24iLAorCVtORVRJRl9GX0xMVFhfQklUXSA9ICAgICAgICAgICAgICJ0eC1sb2NrbGVzcyIsCisJW05FVElGX0ZfTkVUTlNfTE9DQUxfQklUXSA9ICAgICAgIm5ldG5zLWxvY2FsIiwKKwlbTkVUSUZfRl9HUk9fQklUXSA9ICAgICAgICAgICAgICAicngtZ3JvIiwKKwlbTkVUSUZfRl9MUk9fQklUXSA9ICAgICAgICAgICAgICAicngtbHJvIiwKIAotCS8qIG1hcmsgbGVnYWN5LWNoYW5nZWFibGUgZmVhdHVyZXMgKi8KLQlpZiAoZGV2LT5ldGh0b29sX29wcy0+c2V0X3NnKQotCQlmZWF0dXJlc1swXS5hdmFpbGFibGUgfD0gTkVUSUZfRl9TRzsKLQlpZiAoZGV2LT5ldGh0b29sX29wcy0+c2V0X3R4X2NzdW0pCi0JCWZlYXR1cmVzWzBdLmF2YWlsYWJsZSB8PSBORVRJRl9GX0FMTF9DU1VNOwotCWlmIChkZXYtPmV0aHRvb2xfb3BzLT5zZXRfdHNvKQotCQlmZWF0dXJlc1swXS5hdmFpbGFibGUgfD0gTkVUSUZfRl9BTExfVFNPOwotCWlmIChkZXYtPmV0aHRvb2xfb3BzLT5zZXRfcnhfY3N1bSkKLQkJZmVhdHVyZXNbMF0uYXZhaWxhYmxlIHw9IE5FVElGX0ZfUlhDU1VNOwotCWlmIChkZXYtPmV0aHRvb2xfb3BzLT5zZXRfZmxhZ3MpCi0JCWZlYXR1cmVzWzBdLmF2YWlsYWJsZSB8PSBmbGFnc19kdXBfZmVhdHVyZXM7Ci19CisJW05FVElGX0ZfVFNPX0JJVF0gPSAgICAgICAgICAgICAgInR4LXRjcC1zZWdtZW50YXRpb24iLAorCVtORVRJRl9GX1VGT19CSVRdID0gICAgICAgICAgICAgICJ0eC11ZHAtZnJhZ21lbnRhdGlvbiIsCisJW05FVElGX0ZfR1NPX1JPQlVTVF9CSVRdID0gICAgICAgInR4LWdzby1yb2J1c3QiLAorCVtORVRJRl9GX1RTT19FQ05fQklUXSA9ICAgICAgICAgICJ0eC10Y3AtZWNuLXNlZ21lbnRhdGlvbiIsCisJW05FVElGX0ZfVFNPNl9CSVRdID0gICAgICAgICAgICAgInR4LXRjcDYtc2VnbWVudGF0aW9uIiwKKwlbTkVUSUZfRl9GU09fQklUXSA9ICAgICAgICAgICAgICAidHgtZmNvZS1zZWdtZW50YXRpb24iLAogCi1zdGF0aWMgaW50IGV0aHRvb2xfc2V0X2ZlYXR1cmVfY29tcGF0KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JaW50ICgqbGVnYWN5X3NldCkoc3RydWN0IG5ldF9kZXZpY2UgKiwgdTMyKSwKLQlzdHJ1Y3QgZXRodG9vbF9zZXRfZmVhdHVyZXNfYmxvY2sgKmZlYXR1cmVzLCB1MzIgbWFzaykKLXsKLQl1MzIgZG9fc2V0OwotCi0JaWYgKCFsZWdhY3lfc2V0KQotCQlyZXR1cm4gMDsKLQotCWlmICghKGZlYXR1cmVzWzBdLnZhbGlkICYgbWFzaykpCi0JCXJldHVybiAwOwotCi0JZmVhdHVyZXNbMF0udmFsaWQgJj0gfm1hc2s7Ci0KLQlkb19zZXQgPSAhIShmZWF0dXJlc1swXS5yZXF1ZXN0ZWQgJiBtYXNrKTsKLQotCWlmIChsZWdhY3lfc2V0KGRldiwgZG9fc2V0KSA8IDApCi0JCW5ldGRldl9pbmZvKGRldiwKLQkJCSJMZWdhY3kgZmVhdHVyZSBjaGFuZ2UgKCVzKSBmYWlsZWQgZm9yIDB4JTA4eFxuIiwKLQkJCWRvX3NldCA/ICJzZXQiIDogImNsZWFyIiwgbWFzayk7Ci0KLQlyZXR1cm4gMTsKLX0KLQotc3RhdGljIGludCBldGh0b29sX3NldF9mbGFnc19jb21wYXQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQlpbnQgKCpsZWdhY3lfc2V0KShzdHJ1Y3QgbmV0X2RldmljZSAqLCB1MzIpLAotCXN0cnVjdCBldGh0b29sX3NldF9mZWF0dXJlc19ibG9jayAqZmVhdHVyZXMsIHUzMiBtYXNrKQotewotCXUzMiB2YWx1ZTsKLQotCWlmICghbGVnYWN5X3NldCkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoIShmZWF0dXJlc1swXS52YWxpZCAmIG1hc2spKQotCQlyZXR1cm4gMDsKLQotCXZhbHVlID0gZGV2LT5mZWF0dXJlcyAmIH5mZWF0dXJlc1swXS52YWxpZDsKLQl2YWx1ZSB8PSBmZWF0dXJlc1swXS5yZXF1ZXN0ZWQ7Ci0KLQlmZWF0dXJlc1swXS52YWxpZCAmPSB+bWFzazsKLQotCWlmIChsZWdhY3lfc2V0KGRldiwgdmFsdWUgJiBtYXNrKSA8IDApCi0JCW5ldGRldl9pbmZvKGRldiwgIkxlZ2FjeSBmbGFncyBjaGFuZ2UgZmFpbGVkXG4iKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IGV0aHRvb2xfc2V0X2ZlYXR1cmVzX2NvbXBhdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCXN0cnVjdCBldGh0b29sX3NldF9mZWF0dXJlc19ibG9jayAqZmVhdHVyZXMpCi17Ci0JaW50IGNvbXBhdDsKLQotCWlmICghZGV2LT5ldGh0b29sX29wcykKLQkJcmV0dXJuIDA7Ci0KLQljb21wYXQgID0gZXRodG9vbF9zZXRfZmVhdHVyZV9jb21wYXQoZGV2LCBkZXYtPmV0aHRvb2xfb3BzLT5zZXRfc2csCi0JCWZlYXR1cmVzLCBORVRJRl9GX1NHKTsKLQljb21wYXQgfD0gZXRodG9vbF9zZXRfZmVhdHVyZV9jb21wYXQoZGV2LCBkZXYtPmV0aHRvb2xfb3BzLT5zZXRfdHhfY3N1bSwKLQkJZmVhdHVyZXMsIE5FVElGX0ZfQUxMX0NTVU0pOwotCWNvbXBhdCB8PSBldGh0b29sX3NldF9mZWF0dXJlX2NvbXBhdChkZXYsIGRldi0+ZXRodG9vbF9vcHMtPnNldF90c28sCi0JCWZlYXR1cmVzLCBORVRJRl9GX0FMTF9UU08pOwotCWNvbXBhdCB8PSBldGh0b29sX3NldF9mZWF0dXJlX2NvbXBhdChkZXYsIGRldi0+ZXRodG9vbF9vcHMtPnNldF9yeF9jc3VtLAotCQlmZWF0dXJlcywgTkVUSUZfRl9SWENTVU0pOwotCWNvbXBhdCB8PSBldGh0b29sX3NldF9mbGFnc19jb21wYXQoZGV2LCBkZXYtPmV0aHRvb2xfb3BzLT5zZXRfZmxhZ3MsCi0JCWZlYXR1cmVzLCBmbGFnc19kdXBfZmVhdHVyZXMpOwotCi0JcmV0dXJuIGNvbXBhdDsKLX0KKwlbTkVUSUZfRl9GQ09FX0NSQ19CSVRdID0gICAgICAgICAidHgtY2hlY2tzdW0tZmNvZS1jcmMiLAorCVtORVRJRl9GX1NDVFBfQ1NVTV9CSVRdID0gICAgICAgICJ0eC1jaGVja3N1bS1zY3RwIiwKKwlbTkVUSUZfRl9GQ09FX01UVV9CSVRdID0gICAgICAgICAiZmNvZS1tdHUiLAorCVtORVRJRl9GX05UVVBMRV9CSVRdID0gICAgICAgICAgICJyeC1udHVwbGUtZmlsdGVyIiwKKwlbTkVUSUZfRl9SWEhBU0hfQklUXSA9ICAgICAgICAgICAicngtaGFzaGluZyIsCisJW05FVElGX0ZfUlhDU1VNX0JJVF0gPSAgICAgICAgICAgInJ4LWNoZWNrc3VtIiwKKwlbTkVUSUZfRl9OT0NBQ0hFX0NPUFlfQklUXSA9ICAgICAidHgtbm9jYWNoZS1jb3B5IiwKKwlbTkVUSUZfRl9MT09QQkFDS19CSVRdID0gICAgICAgICAibG9vcGJhY2siLAorfTsKIAogc3RhdGljIGludCBldGh0b29sX2dldF9mZWF0dXJlcyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCiB7CkBAIC0yNzIsMTggKzgxLDIxIEBACiAJCS5jbWQgPSBFVEhUT09MX0dGRUFUVVJFUywKIAkJLnNpemUgPSBFVEhUT09MX0RFVl9GRUFUVVJFX1dPUkRTLAogCX07Ci0Jc3RydWN0IGV0aHRvb2xfZ2V0X2ZlYXR1cmVzX2Jsb2NrIGZlYXR1cmVzW0VUSFRPT0xfREVWX0ZFQVRVUkVfV09SRFNdID0gewotCQl7Ci0JCQkuYXZhaWxhYmxlID0gZGV2LT5od19mZWF0dXJlcywKLQkJCS5yZXF1ZXN0ZWQgPSBkZXYtPndhbnRlZF9mZWF0dXJlcywKLQkJCS5hY3RpdmUgPSBkZXYtPmZlYXR1cmVzLAotCQkJLm5ldmVyX2NoYW5nZWQgPSBORVRJRl9GX05FVkVSX0NIQU5HRSwKLQkJfSwKLQl9OworCXN0cnVjdCBldGh0b29sX2dldF9mZWF0dXJlc19ibG9jayBmZWF0dXJlc1tFVEhUT09MX0RFVl9GRUFUVVJFX1dPUkRTXTsKIAl1MzIgX191c2VyICpzaXplYWRkcjsKIAl1MzIgY29weV9zaXplOworCWludCBpOwogCi0JZXRodG9vbF9nZXRfZmVhdHVyZXNfY29tcGF0KGRldiwgZmVhdHVyZXMpOworCS8qIGluIGNhc2UgZmVhdHVyZSBiaXRzIHJ1biBvdXQgYWdhaW4gKi8KKwlCVUlMRF9CVUdfT04oRVRIVE9PTF9ERVZfRkVBVFVSRV9XT1JEUyAqIHNpemVvZih1MzIpID4gc2l6ZW9mKG5ldGRldl9mZWF0dXJlc190KSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgRVRIVE9PTF9ERVZfRkVBVFVSRV9XT1JEUzsgKytpKSB7CisJCWZlYXR1cmVzW2ldLmF2YWlsYWJsZSA9ICh1MzIpKGRldi0+aHdfZmVhdHVyZXMgPj4gKDMyICogaSkpOworCQlmZWF0dXJlc1tpXS5yZXF1ZXN0ZWQgPSAodTMyKShkZXYtPndhbnRlZF9mZWF0dXJlcyA+PiAoMzIgKiBpKSk7CisJCWZlYXR1cmVzW2ldLmFjdGl2ZSA9ICh1MzIpKGRldi0+ZmVhdHVyZXMgPj4gKDMyICogaSkpOworCQlmZWF0dXJlc1tpXS5uZXZlcl9jaGFuZ2VkID0KKwkJCSh1MzIpKE5FVElGX0ZfTkVWRVJfQ0hBTkdFID4+ICgzMiAqIGkpKTsKKwl9CiAKIAlzaXplYWRkciA9IHVzZXJhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IGV0aHRvb2xfZ2ZlYXR1cmVzLCBzaXplKTsKIAlpZiAoZ2V0X3VzZXIoY29weV9zaXplLCBzaXplYWRkcikpCkBAIC0zMDUsNyArMTE3LDggQEAKIHsKIAlzdHJ1Y3QgZXRodG9vbF9zZmVhdHVyZXMgY21kOwogCXN0cnVjdCBldGh0b29sX3NldF9mZWF0dXJlc19ibG9jayBmZWF0dXJlc1tFVEhUT09MX0RFVl9GRUFUVVJFX1dPUkRTXTsKLQlpbnQgcmV0ID0gMDsKKwluZXRkZXZfZmVhdHVyZXNfdCB3YW50ZWQgPSAwLCB2YWxpZCA9IDA7CisJaW50IGksIHJldCA9IDA7CiAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNtZCwgdXNlcmFkZHIsIHNpemVvZihjbWQpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CkBAIC0zMTcsNjUgKzEzMCwyOSBAQAogCWlmIChjb3B5X2Zyb21fdXNlcihmZWF0dXJlcywgdXNlcmFkZHIsIHNpemVvZihmZWF0dXJlcykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChmZWF0dXJlc1swXS52YWxpZCAmIH5ORVRJRl9GX0VUSFRPT0xfQklUUykKKwlmb3IgKGkgPSAwOyBpIDwgRVRIVE9PTF9ERVZfRkVBVFVSRV9XT1JEUzsgKytpKSB7CisJCXZhbGlkIHw9IChuZXRkZXZfZmVhdHVyZXNfdClmZWF0dXJlc1tpXS52YWxpZCA8PCAoMzIgKiBpKTsKKwkJd2FudGVkIHw9IChuZXRkZXZfZmVhdHVyZXNfdClmZWF0dXJlc1tpXS5yZXF1ZXN0ZWQgPDwgKDMyICogaSk7CisJfQorCisJaWYgKHZhbGlkICYgfk5FVElGX0ZfRVRIVE9PTF9CSVRTKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWlmIChldGh0b29sX3NldF9mZWF0dXJlc19jb21wYXQoZGV2LCBmZWF0dXJlcykpCi0JCXJldCB8PSBFVEhUT09MX0ZfQ09NUEFUOwotCi0JaWYgKGZlYXR1cmVzWzBdLnZhbGlkICYgfmRldi0+aHdfZmVhdHVyZXMpIHsKLQkJZmVhdHVyZXNbMF0udmFsaWQgJj0gZGV2LT5od19mZWF0dXJlczsKKwlpZiAodmFsaWQgJiB+ZGV2LT5od19mZWF0dXJlcykgeworCQl2YWxpZCAmPSBkZXYtPmh3X2ZlYXR1cmVzOwogCQlyZXQgfD0gRVRIVE9PTF9GX1VOU1VQUE9SVEVEOwogCX0KIAotCWRldi0+d2FudGVkX2ZlYXR1cmVzICY9IH5mZWF0dXJlc1swXS52YWxpZDsKLQlkZXYtPndhbnRlZF9mZWF0dXJlcyB8PSBmZWF0dXJlc1swXS52YWxpZCAmIGZlYXR1cmVzWzBdLnJlcXVlc3RlZDsKKwlkZXYtPndhbnRlZF9mZWF0dXJlcyAmPSB+dmFsaWQ7CisJZGV2LT53YW50ZWRfZmVhdHVyZXMgfD0gd2FudGVkICYgdmFsaWQ7CiAJX19uZXRkZXZfdXBkYXRlX2ZlYXR1cmVzKGRldik7CiAKLQlpZiAoKGRldi0+d2FudGVkX2ZlYXR1cmVzIF4gZGV2LT5mZWF0dXJlcykgJiBmZWF0dXJlc1swXS52YWxpZCkKKwlpZiAoKGRldi0+d2FudGVkX2ZlYXR1cmVzIF4gZGV2LT5mZWF0dXJlcykgJiB2YWxpZCkKIAkJcmV0IHw9IEVUSFRPT0xfRl9XSVNIOwogCiAJcmV0dXJuIHJldDsKIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgbmV0ZGV2X2ZlYXR1cmVzX3N0cmluZ3NbRVRIVE9PTF9ERVZfRkVBVFVSRV9XT1JEUyAqIDMyXVtFVEhfR1NUUklOR19MRU5dID0gewotCS8qIE5FVElGX0ZfU0cgKi8gICAgICAgICAgICAgICJ0eC1zY2F0dGVyLWdhdGhlciIsCi0JLyogTkVUSUZfRl9JUF9DU1VNICovICAgICAgICAgInR4LWNoZWNrc3VtLWlwdjQiLAotCS8qIE5FVElGX0ZfTk9fQ1NVTSAqLyAgICAgICAgICJ0eC1jaGVja3N1bS11bm5lZWRlZCIsCi0JLyogTkVUSUZfRl9IV19DU1VNICovICAgICAgICAgInR4LWNoZWNrc3VtLWlwLWdlbmVyaWMiLAotCS8qIE5FVElGX0ZfSVBWNl9DU1VNICovICAgICAgICJ0eC1jaGVja3N1bS1pcHY2IiwKLQkvKiBORVRJRl9GX0hJR0hETUEgKi8gICAgICAgICAiaGlnaGRtYSIsCi0JLyogTkVUSUZfRl9GUkFHTElTVCAqLyAgICAgICAgInR4LXNjYXR0ZXItZ2F0aGVyLWZyYWdsaXN0IiwKLQkvKiBORVRJRl9GX0hXX1ZMQU5fVFggKi8gICAgICAidHgtdmxhbi1ody1pbnNlcnQiLAotCi0JLyogTkVUSUZfRl9IV19WTEFOX1JYICovICAgICAgInJ4LXZsYW4taHctcGFyc2UiLAotCS8qIE5FVElGX0ZfSFdfVkxBTl9GSUxURVIgKi8gICJyeC12bGFuLWZpbHRlciIsCi0JLyogTkVUSUZfRl9WTEFOX0NIQUxMRU5HRUQgKi8gInZsYW4tY2hhbGxlbmdlZCIsCi0JLyogTkVUSUZfRl9HU08gKi8gICAgICAgICAgICAgInR4LWdlbmVyaWMtc2VnbWVudGF0aW9uIiwKLQkvKiBORVRJRl9GX0xMVFggKi8gICAgICAgICAgICAidHgtbG9ja2xlc3MiLAotCS8qIE5FVElGX0ZfTkVUTlNfTE9DQUwgKi8gICAgICJuZXRucy1sb2NhbCIsCi0JLyogTkVUSUZfRl9HUk8gKi8gICAgICAgICAgICAgInJ4LWdybyIsCi0JLyogTkVUSUZfRl9MUk8gKi8gICAgICAgICAgICAgInJ4LWxybyIsCi0KLQkvKiBORVRJRl9GX1RTTyAqLyAgICAgICAgICAgICAidHgtdGNwLXNlZ21lbnRhdGlvbiIsCi0JLyogTkVUSUZfRl9VRk8gKi8gICAgICAgICAgICAgInR4LXVkcC1mcmFnbWVudGF0aW9uIiwKLQkvKiBORVRJRl9GX0dTT19ST0JVU1QgKi8gICAgICAidHgtZ3NvLXJvYnVzdCIsCi0JLyogTkVUSUZfRl9UU09fRUNOICovICAgICAgICAgInR4LXRjcC1lY24tc2VnbWVudGF0aW9uIiwKLQkvKiBORVRJRl9GX1RTTzYgKi8gICAgICAgICAgICAidHgtdGNwNi1zZWdtZW50YXRpb24iLAotCS8qIE5FVElGX0ZfRlNPICovICAgICAgICAgICAgICJ0eC1mY29lLXNlZ21lbnRhdGlvbiIsCi0JIiIsCi0JIiIsCi0KLQkvKiBORVRJRl9GX0ZDT0VfQ1JDICovICAgICAgICAidHgtY2hlY2tzdW0tZmNvZS1jcmMiLAotCS8qIE5FVElGX0ZfU0NUUF9DU1VNICovICAgICAgICJ0eC1jaGVja3N1bS1zY3RwIiwKLQkvKiBORVRJRl9GX0ZDT0VfTVRVICovICAgICAgICAiZmNvZS1tdHUiLAotCS8qIE5FVElGX0ZfTlRVUExFICovICAgICAgICAgICJyeC1udHVwbGUtZmlsdGVyIiwKLQkvKiBORVRJRl9GX1JYSEFTSCAqLyAgICAgICAgICAicngtaGFzaGluZyIsCi0JLyogTkVUSUZfRl9SWENTVU0gKi8gICAgICAgICAgInJ4LWNoZWNrc3VtIiwKLQkvKiBORVRJRl9GX05PQ0FDSEVfQ09QWSAqLyAgICAidHgtbm9jYWNoZS1jb3B5IiwKLQkvKiBORVRJRl9GX0xPT1BCQUNLICovICAgICAgICAibG9vcGJhY2siLAotfTsKLQogc3RhdGljIGludCBfX2V0aHRvb2xfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNzZXQpCiB7CiAJY29uc3Qgc3RydWN0IGV0aHRvb2xfb3BzICpvcHMgPSBkZXYtPmV0aHRvb2xfb3BzOwpAQCAtNDAyLDcgKzE3OSw3IEBACiAJCW9wcy0+Z2V0X3N0cmluZ3MoZGV2LCBzdHJpbmdzZXQsIGRhdGEpOwogfQogCi1zdGF0aWMgdTMyIGV0aHRvb2xfZ2V0X2ZlYXR1cmVfbWFzayh1MzIgZXRoX2NtZCkKK3N0YXRpYyBuZXRkZXZfZmVhdHVyZXNfdCBldGh0b29sX2dldF9mZWF0dXJlX21hc2sodTMyIGV0aF9jbWQpCiB7CiAJLyogZmVhdHVyZSBtYXNrcyBvZiBsZWdhY3kgZGlzY3JldGUgZXRodG9vbCBvcHMgKi8KIApAQCAtNDMzLDEzNiArMjEwLDgyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCAqX19ldGh0b29sX2dldF9vbmVfZmVhdHVyZV9hY3RvcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZXRoY21kKQotewotCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqb3BzID0gZGV2LT5ldGh0b29sX29wczsKLQotCWlmICghb3BzKQotCQlyZXR1cm4gTlVMTDsKLQotCXN3aXRjaCAoZXRoY21kKSB7Ci0JY2FzZSBFVEhUT09MX0dUWENTVU06Ci0JCXJldHVybiBvcHMtPmdldF90eF9jc3VtOwotCWNhc2UgRVRIVE9PTF9HUlhDU1VNOgotCQlyZXR1cm4gb3BzLT5nZXRfcnhfY3N1bTsKLQljYXNlIEVUSFRPT0xfU1NHOgotCQlyZXR1cm4gb3BzLT5nZXRfc2c7Ci0JY2FzZSBFVEhUT09MX1NUU086Ci0JCXJldHVybiBvcHMtPmdldF90c287Ci0JY2FzZSBFVEhUT09MX1NVRk86Ci0JCXJldHVybiBvcHMtPmdldF91Zm87Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIE5VTEw7Ci0JfQotfQotCi1zdGF0aWMgdTMyIF9fZXRodG9vbF9nZXRfcnhfY3N1bV9vbGRidWcoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKLXsKLQlyZXR1cm4gISEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfQUxMX0NTVU0pOwotfQotCiBzdGF0aWMgaW50IGV0aHRvb2xfZ2V0X29uZV9mZWF0dXJlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJY2hhciBfX3VzZXIgKnVzZXJhZGRyLCB1MzIgZXRoY21kKQogewotCXUzMiBtYXNrID0gZXRodG9vbF9nZXRfZmVhdHVyZV9tYXNrKGV0aGNtZCk7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgbWFzayA9IGV0aHRvb2xfZ2V0X2ZlYXR1cmVfbWFzayhldGhjbWQpOwogCXN0cnVjdCBldGh0b29sX3ZhbHVlIGVkYXRhID0gewogCQkuY21kID0gZXRoY21kLAogCQkuZGF0YSA9ICEhKGRldi0+ZmVhdHVyZXMgJiBtYXNrKSwKIAl9OwogCi0JLyogY29tcGF0aWJpbGl0eSB3aXRoIGRpc2NyZXRlIGdldF8gb3BzICovCi0JaWYgKCEoZGV2LT5od19mZWF0dXJlcyAmIG1hc2spKSB7Ci0JCXUzMiAoKmFjdG9yKShzdHJ1Y3QgbmV0X2RldmljZSAqKTsKLQotCQlhY3RvciA9IF9fZXRodG9vbF9nZXRfb25lX2ZlYXR1cmVfYWN0b3IoZGV2LCBldGhjbWQpOwotCi0JCS8qIGJ1ZyBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGdldF9yeF9jc3VtICovCi0JCWlmIChldGhjbWQgPT0gRVRIVE9PTF9HUlhDU1VNICYmICFhY3RvcikKLQkJCWFjdG9yID0gX19ldGh0b29sX2dldF9yeF9jc3VtX29sZGJ1ZzsKLQotCQlpZiAoYWN0b3IpCi0JCQllZGF0YS5kYXRhID0gYWN0b3IoZGV2KTsKLQl9Ci0KIAlpZiAoY29weV90b191c2VyKHVzZXJhZGRyLCAmZWRhdGEsIHNpemVvZihlZGF0YSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2V0aHRvb2xfc2V0X3R4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpOwotc3RhdGljIGludCBfX2V0aHRvb2xfc2V0X3J4X2NzdW0oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpOwotc3RhdGljIGludCBfX2V0aHRvb2xfc2V0X3NnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKTsKLXN0YXRpYyBpbnQgX19ldGh0b29sX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpOwotc3RhdGljIGludCBfX2V0aHRvb2xfc2V0X3VmbyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSk7Ci0KIHN0YXRpYyBpbnQgZXRodG9vbF9zZXRfb25lX2ZlYXR1cmUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAl2b2lkIF9fdXNlciAqdXNlcmFkZHIsIHUzMiBldGhjbWQpCiB7CiAJc3RydWN0IGV0aHRvb2xfdmFsdWUgZWRhdGE7Ci0JdTMyIG1hc2s7CisJbmV0ZGV2X2ZlYXR1cmVzX3QgbWFzazsKIAogCWlmIChjb3B5X2Zyb21fdXNlcigmZWRhdGEsIHVzZXJhZGRyLCBzaXplb2YoZWRhdGEpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKIAltYXNrID0gZXRodG9vbF9nZXRfZmVhdHVyZV9tYXNrKGV0aGNtZCk7CiAJbWFzayAmPSBkZXYtPmh3X2ZlYXR1cmVzOwotCWlmIChtYXNrKSB7Ci0JCWlmIChlZGF0YS5kYXRhKQotCQkJZGV2LT53YW50ZWRfZmVhdHVyZXMgfD0gbWFzazsKLQkJZWxzZQotCQkJZGV2LT53YW50ZWRfZmVhdHVyZXMgJj0gfm1hc2s7Ci0KLQkJX19uZXRkZXZfdXBkYXRlX2ZlYXR1cmVzKGRldik7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qIERyaXZlciBpcyBub3QgY29udmVydGVkIHRvIG5kb19maXhfZmVhdHVyZXMgb3IgZG9lcyBub3QKLQkgKiBzdXBwb3J0IGNoYW5naW5nIHRoaXMgb2ZmbG9hZC4gSW4gdGhlIGxhdHRlciBjYXNlIGl0IHdvbid0Ci0JICogaGF2ZSBjb3JyZXNwb25kaW5nIGV0aHRvb2xfb3BzIGZpZWxkIHNldC4KLQkgKgotCSAqIEZvbGxvd2luZyBwYXJ0IGlzIHRvIGJlIHJlbW92ZWQgYWZ0ZXIgYWxsIGRyaXZlcnMgYWR2ZXJ0aXNlCi0JICogdGhlaXIgY2hhbmdlYWJsZSBmZWF0dXJlcyBpbiBuZXRkZXYtPmh3X2ZlYXR1cmVzIGFuZCBzdG9wCi0JICogdXNpbmcgZGlzY3JldGUgb2ZmbG9hZCBzZXR0aW5nIG9wcy4KLQkgKi8KLQotCXN3aXRjaCAoZXRoY21kKSB7Ci0JY2FzZSBFVEhUT09MX1NUWENTVU06Ci0JCXJldHVybiBfX2V0aHRvb2xfc2V0X3R4X2NzdW0oZGV2LCBlZGF0YS5kYXRhKTsKLQljYXNlIEVUSFRPT0xfU1JYQ1NVTToKLQkJcmV0dXJuIF9fZXRodG9vbF9zZXRfcnhfY3N1bShkZXYsIGVkYXRhLmRhdGEpOwotCWNhc2UgRVRIVE9PTF9TU0c6Ci0JCXJldHVybiBfX2V0aHRvb2xfc2V0X3NnKGRldiwgZWRhdGEuZGF0YSk7Ci0JY2FzZSBFVEhUT09MX1NUU086Ci0JCXJldHVybiBfX2V0aHRvb2xfc2V0X3RzbyhkZXYsIGVkYXRhLmRhdGEpOwotCWNhc2UgRVRIVE9PTF9TVUZPOgotCQlyZXR1cm4gX19ldGh0b29sX3NldF91Zm8oZGV2LCBlZGF0YS5kYXRhKTsKLQlkZWZhdWx0OgorCWlmICghbWFzaykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCX0KKworCWlmIChlZGF0YS5kYXRhKQorCQlkZXYtPndhbnRlZF9mZWF0dXJlcyB8PSBtYXNrOworCWVsc2UKKwkJZGV2LT53YW50ZWRfZmVhdHVyZXMgJj0gfm1hc2s7CisKKwlfX25ldGRldl91cGRhdGVfZmVhdHVyZXMoZGV2KTsKKworCXJldHVybiAwOwogfQogCi1pbnQgX19ldGh0b29sX3NldF9mbGFncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKLXsKLQl1MzIgY2hhbmdlZDsKKyNkZWZpbmUgRVRIX0FMTF9GTEFHUyAgICAoRVRIX0ZMQUdfTFJPIHwgRVRIX0ZMQUdfUlhWTEFOIHwgRVRIX0ZMQUdfVFhWTEFOIHwgXAorCQkJICBFVEhfRkxBR19OVFVQTEUgfCBFVEhfRkxBR19SWEhBU0gpCisjZGVmaW5lIEVUSF9BTExfRkVBVFVSRVMgKE5FVElGX0ZfTFJPIHwgTkVUSUZfRl9IV19WTEFOX1JYIHwgXAorCQkJICBORVRJRl9GX0hXX1ZMQU5fVFggfCBORVRJRl9GX05UVVBMRSB8IE5FVElGX0ZfUlhIQVNIKQogCi0JaWYgKGRhdGEgJiB+ZmxhZ3NfZHVwX2ZlYXR1cmVzKQorc3RhdGljIHUzMiBfX2V0aHRvb2xfZ2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJdTMyIGZsYWdzID0gMDsKKworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9MUk8pCWZsYWdzIHw9IEVUSF9GTEFHX0xSTzsKKwlpZiAoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfSFdfVkxBTl9SWCkJZmxhZ3MgfD0gRVRIX0ZMQUdfUlhWTEFOOworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9IV19WTEFOX1RYKQlmbGFncyB8PSBFVEhfRkxBR19UWFZMQU47CisJaWYgKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX05UVVBMRSkJZmxhZ3MgfD0gRVRIX0ZMQUdfTlRVUExFOworCWlmIChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9SWEhBU0gpCWZsYWdzIHw9IEVUSF9GTEFHX1JYSEFTSDsKKworCXJldHVybiBmbGFnczsKK30KKworc3RhdGljIGludCBfX2V0aHRvb2xfc2V0X2ZsYWdzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQoreworCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzID0gMCwgY2hhbmdlZDsKKworCWlmIChkYXRhICYgfkVUSF9BTExfRkxBR1MpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JLyogbGVnYWN5IHNldF9mbGFncygpIG9wICovCi0JaWYgKGRldi0+ZXRodG9vbF9vcHMtPnNldF9mbGFncykgewotCQlpZiAodW5saWtlbHkoZGV2LT5od19mZWF0dXJlcyAmIGZsYWdzX2R1cF9mZWF0dXJlcykpCi0JCQluZXRkZXZfd2FybihkZXYsCi0JCQkJImRyaXZlciBCVUc6IG1peGVkIGh3X2ZlYXR1cmVzIGFuZCBzZXRfZmxhZ3MoKVxuIik7Ci0JCXJldHVybiBkZXYtPmV0aHRvb2xfb3BzLT5zZXRfZmxhZ3MoZGV2LCBkYXRhKTsKLQl9CisJaWYgKGRhdGEgJiBFVEhfRkxBR19MUk8pCWZlYXR1cmVzIHw9IE5FVElGX0ZfTFJPOworCWlmIChkYXRhICYgRVRIX0ZMQUdfUlhWTEFOKQlmZWF0dXJlcyB8PSBORVRJRl9GX0hXX1ZMQU5fUlg7CisJaWYgKGRhdGEgJiBFVEhfRkxBR19UWFZMQU4pCWZlYXR1cmVzIHw9IE5FVElGX0ZfSFdfVkxBTl9UWDsKKwlpZiAoZGF0YSAmIEVUSF9GTEFHX05UVVBMRSkJZmVhdHVyZXMgfD0gTkVUSUZfRl9OVFVQTEU7CisJaWYgKGRhdGEgJiBFVEhfRkxBR19SWEhBU0gpCWZlYXR1cmVzIHw9IE5FVElGX0ZfUlhIQVNIOwogCiAJLyogYWxsb3cgY2hhbmdpbmcgb25seSBiaXRzIHNldCBpbiBod19mZWF0dXJlcyAqLwotCWNoYW5nZWQgPSAoZGF0YSBeIGRldi0+ZmVhdHVyZXMpICYgZmxhZ3NfZHVwX2ZlYXR1cmVzOworCWNoYW5nZWQgPSAoZmVhdHVyZXMgXiBkZXYtPmZlYXR1cmVzKSAmIEVUSF9BTExfRkVBVFVSRVM7CiAJaWYgKGNoYW5nZWQgJiB+ZGV2LT5od19mZWF0dXJlcykKIAkJcmV0dXJuIChjaGFuZ2VkICYgZGV2LT5od19mZWF0dXJlcykgPyAtRUlOVkFMIDogLUVPUE5PVFNVUFA7CiAKIAlkZXYtPndhbnRlZF9mZWF0dXJlcyA9Ci0JCShkZXYtPndhbnRlZF9mZWF0dXJlcyAmIH5jaGFuZ2VkKSB8IChkYXRhICYgZGV2LT5od19mZWF0dXJlcyk7CisJCShkZXYtPndhbnRlZF9mZWF0dXJlcyAmIH5jaGFuZ2VkKSB8IChmZWF0dXJlcyAmIGNoYW5nZWQpOwogCiAJX19uZXRkZXZfdXBkYXRlX2ZlYXR1cmVzKGRldik7CiAKQEAgLTcxNiw2ICs0MzksNyBAQAogewogCXN0cnVjdCBldGh0b29sX3J4bmZjIGluZm87CiAJc2l6ZV90IGluZm9fc2l6ZSA9IHNpemVvZihpbmZvKTsKKwlpbnQgcmM7CiAKIAlpZiAoIWRldi0+ZXRodG9vbF9vcHMtPnNldF9yeG5mYykKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwpAQCAtNzMxLDcgKzQ1NSwxNSBAQAogCWlmIChjb3B5X2Zyb21fdXNlcigmaW5mbywgdXNlcmFkZHIsIGluZm9fc2l6ZSkpCiAJCXJldHVybiAtRUZBVUxUOwogCi0JcmV0dXJuIGRldi0+ZXRodG9vbF9vcHMtPnNldF9yeG5mYyhkZXYsICZpbmZvKTsKKwlyYyA9IGRldi0+ZXRodG9vbF9vcHMtPnNldF9yeG5mYyhkZXYsICZpbmZvKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCWlmIChjbWQgPT0gRVRIVE9PTF9TUlhDTFNSTElOUyAmJgorCSAgICBjb3B5X3RvX3VzZXIodXNlcmFkZHIsICZpbmZvLCBpbmZvX3NpemUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIGludCBldGh0b29sX2dldF9yeG5mYyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtNzkyLDM0ICs1MjQsNDQgQEAKIHN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50IGV0aHRvb2xfZ2V0X3J4ZmhfaW5kaXIoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCQkJCSAgICAgdm9pZCBfX3VzZXIgKnVzZXJhZGRyKQogewotCXN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIgKmluZGlyOwotCXUzMiB0YWJsZV9zaXplOwotCXNpemVfdCBmdWxsX3NpemU7CisJdTMyIHVzZXJfc2l6ZSwgZGV2X3NpemU7CisJdTMyICppbmRpcjsKIAlpbnQgcmV0OwogCi0JaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcnhmaF9pbmRpcikKKwlpZiAoIWRldi0+ZXRodG9vbF9vcHMtPmdldF9yeGZoX2luZGlyX3NpemUgfHwKKwkgICAgIWRldi0+ZXRodG9vbF9vcHMtPmdldF9yeGZoX2luZGlyKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJZGV2X3NpemUgPSBkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcnhmaF9pbmRpcl9zaXplKGRldik7CisJaWYgKGRldl9zaXplID09IDApCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAotCWlmIChjb3B5X2Zyb21fdXNlcigmdGFibGVfc2l6ZSwKKwlpZiAoY29weV9mcm9tX3VzZXIoJnVzZXJfc2l6ZSwKIAkJCSAgIHVzZXJhZGRyICsgb2Zmc2V0b2Yoc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciwgc2l6ZSksCi0JCQkgICBzaXplb2YodGFibGVfc2l6ZSkpKQorCQkJICAgc2l6ZW9mKHVzZXJfc2l6ZSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmICh0YWJsZV9zaXplID4KLQkgICAgKEtNQUxMT0NfTUFYX1NJWkUgLSBzaXplb2YoKmluZGlyKSkgLyBzaXplb2YoKmluZGlyLT5yaW5nX2luZGV4KSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0JZnVsbF9zaXplID0gc2l6ZW9mKCppbmRpcikgKyBzaXplb2YoKmluZGlyLT5yaW5nX2luZGV4KSAqIHRhYmxlX3NpemU7Ci0JaW5kaXIgPSBremFsbG9jKGZ1bGxfc2l6ZSwgR0ZQX1VTRVIpOworCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIgKyBvZmZzZXRvZihzdHJ1Y3QgZXRodG9vbF9yeGZoX2luZGlyLCBzaXplKSwKKwkJCSAmZGV2X3NpemUsIHNpemVvZihkZXZfc2l6ZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCS8qIElmIHRoZSB1c2VyIGJ1ZmZlciBzaXplIGlzIDAsIHRoaXMgaXMganVzdCBhIHF1ZXJ5IGZvciB0aGUKKwkgKiBkZXZpY2UgdGFibGUgc2l6ZS4gIE90aGVyd2lzZSwgaWYgaXQncyBzbWFsbGVyIHRoYW4gdGhlCisJICogZGV2aWNlIHRhYmxlIHNpemUgaXQncyBhbiBlcnJvci4KKwkgKi8KKwlpZiAodXNlcl9zaXplIDwgZGV2X3NpemUpCisJCXJldHVybiB1c2VyX3NpemUgPT0gMCA/IDAgOiAtRUlOVkFMOworCisJaW5kaXIgPSBrY2FsbG9jKGRldl9zaXplLCBzaXplb2YoaW5kaXJbMF0pLCBHRlBfVVNFUik7CiAJaWYgKCFpbmRpcikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlpbmRpci0+Y21kID0gRVRIVE9PTF9HUlhGSElORElSOwotCWluZGlyLT5zaXplID0gdGFibGVfc2l6ZTsKIAlyZXQgPSBkZXYtPmV0aHRvb2xfb3BzLT5nZXRfcnhmaF9pbmRpcihkZXYsIGluZGlyKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dDsKIAotCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIsIGluZGlyLCBmdWxsX3NpemUpKQorCWlmIChjb3B5X3RvX3VzZXIodXNlcmFkZHIgKworCQkJIG9mZnNldG9mKHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIsIHJpbmdfaW5kZXhbMF0pLAorCQkJIGluZGlyLCBkZXZfc2l6ZSAqIHNpemVvZihpbmRpclswXSkpKQogCQlyZXQgPSAtRUZBVUxUOwogCiBvdXQ6CkBAIC04MzAsMzAgKzU3Miw1NiBAQAogc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBpbnQgZXRodG9vbF9zZXRfcnhmaF9pbmRpcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAogCQkJCQkJICAgICB2b2lkIF9fdXNlciAqdXNlcmFkZHIpCiB7Ci0Jc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciAqaW5kaXI7Ci0JdTMyIHRhYmxlX3NpemU7Ci0Jc2l6ZV90IGZ1bGxfc2l6ZTsKKwlzdHJ1Y3QgZXRodG9vbF9yeG5mYyByeF9yaW5nczsKKwl1MzIgdXNlcl9zaXplLCBkZXZfc2l6ZSwgaTsKKwl1MzIgKmluZGlyOwogCWludCByZXQ7CiAKLQlpZiAoIWRldi0+ZXRodG9vbF9vcHMtPnNldF9yeGZoX2luZGlyKQorCWlmICghZGV2LT5ldGh0b29sX29wcy0+Z2V0X3J4ZmhfaW5kaXJfc2l6ZSB8fAorCSAgICAhZGV2LT5ldGh0b29sX29wcy0+c2V0X3J4ZmhfaW5kaXIgfHwKKwkgICAgIWRldi0+ZXRodG9vbF9vcHMtPmdldF9yeG5mYykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCWRldl9zaXplID0gZGV2LT5ldGh0b29sX29wcy0+Z2V0X3J4ZmhfaW5kaXJfc2l6ZShkZXYpOworCWlmIChkZXZfc2l6ZSA9PSAwKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpZiAoY29weV9mcm9tX3VzZXIoJnRhYmxlX3NpemUsCisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1c2VyX3NpemUsCiAJCQkgICB1c2VyYWRkciArIG9mZnNldG9mKHN0cnVjdCBldGh0b29sX3J4ZmhfaW5kaXIsIHNpemUpLAotCQkJICAgc2l6ZW9mKHRhYmxlX3NpemUpKSkKKwkJCSAgIHNpemVvZih1c2VyX3NpemUpKSkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlpZiAodGFibGVfc2l6ZSA+Ci0JICAgIChLTUFMTE9DX01BWF9TSVpFIC0gc2l6ZW9mKCppbmRpcikpIC8gc2l6ZW9mKCppbmRpci0+cmluZ19pbmRleCkpCi0JCXJldHVybiAtRU5PTUVNOwotCWZ1bGxfc2l6ZSA9IHNpemVvZigqaW5kaXIpICsgc2l6ZW9mKCppbmRpci0+cmluZ19pbmRleCkgKiB0YWJsZV9zaXplOwotCWluZGlyID0ga21hbGxvYyhmdWxsX3NpemUsIEdGUF9VU0VSKTsKKwlpZiAodXNlcl9zaXplICE9IDAgJiYgdXNlcl9zaXplICE9IGRldl9zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWluZGlyID0ga2NhbGxvYyhkZXZfc2l6ZSwgc2l6ZW9mKGluZGlyWzBdKSwgR0ZQX1VTRVIpOwogCWlmICghaW5kaXIpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKGluZGlyLCB1c2VyYWRkciwgZnVsbF9zaXplKSkgewotCQlyZXQgPSAtRUZBVUxUOworCXJ4X3JpbmdzLmNtZCA9IEVUSFRPT0xfR1JYUklOR1M7CisJcmV0ID0gZGV2LT5ldGh0b29sX29wcy0+Z2V0X3J4bmZjKGRldiwgJnJ4X3JpbmdzLCBOVUxMKTsKKwlpZiAocmV0KQogCQlnb3RvIG91dDsKKworCWlmICh1c2VyX3NpemUgPT0gMCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZGV2X3NpemU7IGkrKykKKwkJCWluZGlyW2ldID0gZXRodG9vbF9yeGZoX2luZGlyX2RlZmF1bHQoaSwgcnhfcmluZ3MuZGF0YSk7CisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGluZGlyLAorCQkJCSAgdXNlcmFkZHIgKworCQkJCSAgb2Zmc2V0b2Yoc3RydWN0IGV0aHRvb2xfcnhmaF9pbmRpciwKKwkJCQkJICAgcmluZ19pbmRleFswXSksCisJCQkJICBkZXZfc2l6ZSAqIHNpemVvZihpbmRpclswXSkpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQkvKiBWYWxpZGF0ZSByaW5nIGluZGljZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGRldl9zaXplOyBpKyspIHsKKwkJCWlmIChpbmRpcltpXSA+PSByeF9yaW5ncy5kYXRhKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQogCX0KIAogCXJldCA9IGRldi0+ZXRodG9vbF9vcHMtPnNldF9yeGZoX2luZGlyKGRldiwgaW5kaXIpOwpAQCAtODYzLDU4ICs2MzEsNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBldGh0b29sIGRvZXMgbm90IChvciBkaWQgbm90KSBzZXQgbWFza3MgZm9yIGZsb3cgcGFyYW1ldGVycyB0aGF0IGFyZQotICogbm90IHNwZWNpZmllZCwgc28gaWYgYm90aCB2YWx1ZSBhbmQgbWFzayBhcmUgMCB0aGVuIHRoaXMgbXVzdCBiZQotICogdHJlYXRlZCBhcyBlcXVpdmFsZW50IHRvIGEgbWFzayB3aXRoIGFsbCBiaXRzIHNldC4gIEltcGxlbWVudCB0aGF0Ci0gKiBoZXJlIHJhdGhlciB0aGFuIGluIGRyaXZlcnMuCi0gKi8KLXN0YXRpYyB2b2lkIHJ4X250dXBsZV9maXhfbWFza3Moc3RydWN0IGV0aHRvb2xfcnhfbnR1cGxlX2Zsb3dfc3BlYyAqZnMpCi17Ci0Jc3RydWN0IGV0aHRvb2xfdGNwaXA0X3NwZWMgKmVudHJ5ID0gJmZzLT5oX3UudGNwX2lwNF9zcGVjOwotCXN0cnVjdCBldGh0b29sX3RjcGlwNF9zcGVjICptYXNrID0gJmZzLT5tX3UudGNwX2lwNF9zcGVjOwotCi0JaWYgKGZzLT5mbG93X3R5cGUgIT0gVENQX1Y0X0ZMT1cgJiYKLQkgICAgZnMtPmZsb3dfdHlwZSAhPSBVRFBfVjRfRkxPVyAmJgotCSAgICBmcy0+Zmxvd190eXBlICE9IFNDVFBfVjRfRkxPVykKLQkJcmV0dXJuOwotCi0JaWYgKCEoZW50cnktPmlwNHNyYyB8IG1hc2stPmlwNHNyYykpCi0JCW1hc2stPmlwNHNyYyA9IGh0b25sKDB4ZmZmZmZmZmYpOwotCWlmICghKGVudHJ5LT5pcDRkc3QgfCBtYXNrLT5pcDRkc3QpKQotCQltYXNrLT5pcDRkc3QgPSBodG9ubCgweGZmZmZmZmZmKTsKLQlpZiAoIShlbnRyeS0+cHNyYyB8IG1hc2stPnBzcmMpKQotCQltYXNrLT5wc3JjID0gaHRvbnMoMHhmZmZmKTsKLQlpZiAoIShlbnRyeS0+cGRzdCB8IG1hc2stPnBkc3QpKQotCQltYXNrLT5wZHN0ID0gaHRvbnMoMHhmZmZmKTsKLQlpZiAoIShlbnRyeS0+dG9zIHwgbWFzay0+dG9zKSkKLQkJbWFzay0+dG9zID0gMHhmZjsKLQlpZiAoIShmcy0+dmxhbl90YWcgfCBmcy0+dmxhbl90YWdfbWFzaykpCi0JCWZzLT52bGFuX3RhZ19tYXNrID0gMHhmZmZmOwotCWlmICghKGZzLT5kYXRhIHwgZnMtPmRhdGFfbWFzaykpCi0JCWZzLT5kYXRhX21hc2sgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7Ci19Ci0KLXN0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgaW50IGV0aHRvb2xfc2V0X3J4X250dXBsZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAotCQkJCQkJICAgIHZvaWQgX191c2VyICp1c2VyYWRkcikKLXsKLQlzdHJ1Y3QgZXRodG9vbF9yeF9udHVwbGUgY21kOwotCWNvbnN0IHN0cnVjdCBldGh0b29sX29wcyAqb3BzID0gZGV2LT5ldGh0b29sX29wczsKLQotCWlmICghb3BzLT5zZXRfcnhfbnR1cGxlKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlpZiAoIShkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9OVFVQTEUpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChjb3B5X2Zyb21fdXNlcigmY21kLCB1c2VyYWRkciwgc2l6ZW9mKGNtZCkpKQotCQlyZXR1cm4gLUVGQVVMVDsKLQotCXJ4X250dXBsZV9maXhfbWFza3MoJmNtZC5mcyk7Ci0KLQlyZXR1cm4gb3BzLT5zZXRfcnhfbnR1cGxlKGRldiwgJmNtZCk7Ci19Ci0KIHN0YXRpYyBpbnQgZXRodG9vbF9nZXRfcmVncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqdXNlcmFkZHIpCiB7CiAJc3RydWN0IGV0aHRvb2xfcmVncyByZWdzOwpAQCAtMTIzMSw4MSArOTQ3LDYgQEAKIAlyZXR1cm4gZGV2LT5ldGh0b29sX29wcy0+c2V0X3BhdXNlcGFyYW0oZGV2LCAmcGF1c2VwYXJhbSk7CiB9CiAKLXN0YXRpYyBpbnQgX19ldGh0b29sX3NldF9zZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKLXsKLQlpbnQgZXJyOwotCi0JaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5zZXRfc2cpCi0JCXJldHVybiAtRU9QTk9UU1VQUDsKLQotCWlmIChkYXRhICYmICEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfQUxMX0NTVU0pKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICghZGF0YSAmJiBkZXYtPmV0aHRvb2xfb3BzLT5zZXRfdHNvKSB7Ci0JCWVyciA9IGRldi0+ZXRodG9vbF9vcHMtPnNldF90c28oZGV2LCAwKTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7Ci0JfQotCi0JaWYgKCFkYXRhICYmIGRldi0+ZXRodG9vbF9vcHMtPnNldF91Zm8pIHsKLQkJZXJyID0gZGV2LT5ldGh0b29sX29wcy0+c2V0X3VmbyhkZXYsIDApOwotCQlpZiAoZXJyKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0JcmV0dXJuIGRldi0+ZXRodG9vbF9vcHMtPnNldF9zZyhkZXYsIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IF9fZXRodG9vbF9zZXRfdHhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKLXsKLQlpbnQgZXJyOwotCi0JaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5zZXRfdHhfY3N1bSkKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCi0JaWYgKCFkYXRhICYmIGRldi0+ZXRodG9vbF9vcHMtPnNldF9zZykgewotCQllcnIgPSBfX2V0aHRvb2xfc2V0X3NnKGRldiwgMCk7Ci0JCWlmIChlcnIpCi0JCQlyZXR1cm4gZXJyOwotCX0KLQotCXJldHVybiBkZXYtPmV0aHRvb2xfb3BzLT5zZXRfdHhfY3N1bShkZXYsIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IF9fZXRodG9vbF9zZXRfcnhfY3N1bShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgZGF0YSkKLXsKLQlpZiAoIWRldi0+ZXRodG9vbF9vcHMtPnNldF9yeF9jc3VtKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlpZiAoIWRhdGEpCi0JCWRldi0+ZmVhdHVyZXMgJj0gfk5FVElGX0ZfR1JPOwotCi0JcmV0dXJuIGRldi0+ZXRodG9vbF9vcHMtPnNldF9yeF9jc3VtKGRldiwgZGF0YSk7Ci19Ci0KLXN0YXRpYyBpbnQgX19ldGh0b29sX3NldF90c28oc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIGRhdGEpCi17Ci0JaWYgKCFkZXYtPmV0aHRvb2xfb3BzLT5zZXRfdHNvKQotCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0KLQlpZiAoZGF0YSAmJiAhKGRldi0+ZmVhdHVyZXMgJiBORVRJRl9GX1NHKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXR1cm4gZGV2LT5ldGh0b29sX29wcy0+c2V0X3RzbyhkZXYsIGRhdGEpOwotfQotCi1zdGF0aWMgaW50IF9fZXRodG9vbF9zZXRfdWZvKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHUzMiBkYXRhKQotewotCWlmICghZGV2LT5ldGh0b29sX29wcy0+c2V0X3VmbykKLQkJcmV0dXJuIC1FT1BOT1RTVVBQOwotCWlmIChkYXRhICYmICEoZGV2LT5mZWF0dXJlcyAmIE5FVElGX0ZfU0cpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoZGF0YSAmJiAhKChkZXYtPmZlYXR1cmVzICYgTkVUSUZfRl9HRU5fQ1NVTSkgfHwKLQkJKGRldi0+ZmVhdHVyZXMgJiAoTkVUSUZfRl9JUF9DU1VNfE5FVElGX0ZfSVBWNl9DU1VNKSkKLQkJCT09IChORVRJRl9GX0lQX0NTVU18TkVUSUZfRl9JUFY2X0NTVU0pKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIGRldi0+ZXRodG9vbF9vcHMtPnNldF91Zm8oZGV2LCBkYXRhKTsKLX0KLQogc3RhdGljIGludCBldGh0b29sX3NlbGZfdGVzdChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBjaGFyIF9fdXNlciAqdXNlcmFkZHIpCiB7CiAJc3RydWN0IGV0aHRvb2xfdGVzdCB0ZXN0OwpAQCAtMTc3MSw5ICsxNDEyLDcgQEAKIAkJYnJlYWs7CiAJY2FzZSBFVEhUT09MX0dGTEFHUzoKIAkJcmMgPSBldGh0b29sX2dldF92YWx1ZShkZXYsIHVzZXJhZGRyLCBldGhjbWQsCi0JCQkJICAgICAgIChkZXYtPmV0aHRvb2xfb3BzLT5nZXRfZmxhZ3MgPwotCQkJCQlkZXYtPmV0aHRvb2xfb3BzLT5nZXRfZmxhZ3MgOgotCQkJCQlldGh0b29sX29wX2dldF9mbGFncykpOworCQkJCQlfX2V0aHRvb2xfZ2V0X2ZsYWdzKTsKIAkJYnJlYWs7CiAJY2FzZSBFVEhUT09MX1NGTEFHUzoKIAkJcmMgPSBldGh0b29sX3NldF92YWx1ZShkZXYsIHVzZXJhZGRyLCBfX2V0aHRvb2xfc2V0X2ZsYWdzKTsKQEAgLTE4MDQsOSArMTQ0Myw2IEBACiAJY2FzZSBFVEhUT09MX1JFU0VUOgogCQlyYyA9IGV0aHRvb2xfcmVzZXQoZGV2LCB1c2VyYWRkcik7CiAJCWJyZWFrOwotCWNhc2UgRVRIVE9PTF9TUlhOVFVQTEU6Ci0JCXJjID0gZXRodG9vbF9zZXRfcnhfbnR1cGxlKGRldiwgdXNlcmFkZHIpOwotCQlicmVhazsKIAljYXNlIEVUSFRPT0xfR1NTRVRfSU5GTzoKIAkJcmMgPSBldGh0b29sX2dldF9zc2V0X2luZm8oZGV2LCB1c2VyYWRkcik7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvZmxvdy5jIGIvbmV0L2NvcmUvZmxvdy5jCmluZGV4IDhhZTQyZGUuLmUzMThjN2UgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL2Zsb3cuYworKysgYi9uZXQvY29yZS9mbG93LmMKQEAgLTM1OCw2ICszNTgsMTggQEAKIAlwdXRfb25saW5lX2NwdXMoKTsKIH0KIAorc3RhdGljIHZvaWQgZmxvd19jYWNoZV9mbHVzaF90YXNrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlmbG93X2NhY2hlX2ZsdXNoKCk7Cit9CisKK3N0YXRpYyBERUNMQVJFX1dPUksoZmxvd19jYWNoZV9mbHVzaF93b3JrLCBmbG93X2NhY2hlX2ZsdXNoX3Rhc2spOworCit2b2lkIGZsb3dfY2FjaGVfZmx1c2hfZGVmZXJyZWQodm9pZCkKK3sKKwlzY2hlZHVsZV93b3JrKCZmbG93X2NhY2hlX2ZsdXNoX3dvcmspOworfQorCiBzdGF0aWMgaW50IF9fY3B1aW5pdCBmbG93X2NhY2hlX2NwdV9wcmVwYXJlKHN0cnVjdCBmbG93X2NhY2hlICpmYywgaW50IGNwdSkKIHsKIAlzdHJ1Y3QgZmxvd19jYWNoZV9wZXJjcHUgKmZjcCA9IHBlcl9jcHVfcHRyKGZjLT5wZXJjcHUsIGNwdSk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9mbG93X2Rpc3NlY3Rvci5jIGIvbmV0L2NvcmUvZmxvd19kaXNzZWN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg1YjliCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2NvcmUvZmxvd19kaXNzZWN0b3IuYwpAQCAtMCwwICsxLDE0MyBAQAorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90dW5uZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wcHBveC5oPgorI2luY2x1ZGUgPGxpbnV4L3BwcF9kZWZzLmg+CisjaW5jbHVkZSA8bmV0L2Zsb3dfa2V5cy5oPgorCisvKiBjb3B5IHNhZGRyICYgZGFkZHIsIHBvc3NpYmx5IHVzaW5nIDY0Yml0IGxvYWQvc3RvcmUKKyAqIEVxdWl2YWxlbnQgdG8gOglmbG93LT5zcmMgPSBpcGgtPnNhZGRyOworICoJCQlmbG93LT5kc3QgPSBpcGgtPmRhZGRyOworICovCitzdGF0aWMgdm9pZCBpcGhfdG9fZmxvd19jb3B5X2FkZHJzKHN0cnVjdCBmbG93X2tleXMgKmZsb3csIGNvbnN0IHN0cnVjdCBpcGhkciAqaXBoKQoreworCUJVSUxEX0JVR19PTihvZmZzZXRvZih0eXBlb2YoKmZsb3cpLCBkc3QpICE9CisJCSAgICAgb2Zmc2V0b2YodHlwZW9mKCpmbG93KSwgc3JjKSArIHNpemVvZihmbG93LT5zcmMpKTsKKwltZW1jcHkoJmZsb3ctPnNyYywgJmlwaC0+c2FkZHIsIHNpemVvZihmbG93LT5zcmMpICsgc2l6ZW9mKGZsb3ctPmRzdCkpOworfQorCitib29sIHNrYl9mbG93X2Rpc3NlY3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGZsb3dfa2V5cyAqZmxvdykKK3sKKwlpbnQgcG9mZiwgbmhvZmYgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKKwl1OCBpcF9wcm90bzsKKwlfX2JlMTYgcHJvdG8gPSBza2ItPnByb3RvY29sOworCisJbWVtc2V0KGZsb3csIDAsIHNpemVvZigqZmxvdykpOworCithZ2FpbjoKKwlzd2l0Y2ggKHByb3RvKSB7CisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QX0lQKTogeworCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaDsKKwkJc3RydWN0IGlwaGRyIF9pcGg7CitpcDoKKwkJaXBoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYsIHNpemVvZihfaXBoKSwgJl9pcGgpOworCQlpZiAoIWlwaCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpZiAoaXBfaXNfZnJhZ21lbnQoaXBoKSkKKwkJCWlwX3Byb3RvID0gMDsKKwkJZWxzZQorCQkJaXBfcHJvdG8gPSBpcGgtPnByb3RvY29sOworCQlpcGhfdG9fZmxvd19jb3B5X2FkZHJzKGZsb3csIGlwaCk7CisJCW5ob2ZmICs9IGlwaC0+aWhsICogNDsKKwkJYnJlYWs7CisJfQorCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KTogeworCQljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXBoOworCQlzdHJ1Y3QgaXB2NmhkciBfaXBoOworaXB2NjoKKwkJaXBoID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYsIHNpemVvZihfaXBoKSwgJl9pcGgpOworCQlpZiAoIWlwaCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpcF9wcm90byA9IGlwaC0+bmV4dGhkcjsKKwkJZmxvdy0+c3JjID0gaXBoLT5zYWRkci5zNl9hZGRyMzJbM107CisJCWZsb3ctPmRzdCA9IGlwaC0+ZGFkZHIuczZfYWRkcjMyWzNdOworCQluaG9mZiArPSBzaXplb2Yoc3RydWN0IGlwdjZoZHIpOworCQlicmVhazsKKwl9CisJY2FzZSBfX2NvbnN0YW50X2h0b25zKEVUSF9QXzgwMjFRKTogeworCQljb25zdCBzdHJ1Y3Qgdmxhbl9oZHIgKnZsYW47CisJCXN0cnVjdCB2bGFuX2hkciBfdmxhbjsKKworCQl2bGFuID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYsIHNpemVvZihfdmxhbiksICZfdmxhbik7CisJCWlmICghdmxhbikKKwkJCXJldHVybiBmYWxzZTsKKworCQlwcm90byA9IHZsYW4tPmhfdmxhbl9lbmNhcHN1bGF0ZWRfcHJvdG87CisJCW5ob2ZmICs9IHNpemVvZigqdmxhbik7CisJCWdvdG8gYWdhaW47CisJfQorCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9QUFBfU0VTKTogeworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHBwcG9lX2hkciBoZHI7CisJCQlfX2JlMTYgcHJvdG87CisJCX0gKmhkciwgX2hkcjsKKwkJaGRyID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwgbmhvZmYsIHNpemVvZihfaGRyKSwgJl9oZHIpOworCQlpZiAoIWhkcikKKwkJCXJldHVybiBmYWxzZTsKKwkJcHJvdG8gPSBoZHItPnByb3RvOworCQluaG9mZiArPSBQUFBPRV9TRVNfSExFTjsKKwkJc3dpdGNoIChwcm90bykgeworCQljYXNlIF9fY29uc3RhbnRfaHRvbnMoUFBQX0lQKToKKwkJCWdvdG8gaXA7CisJCWNhc2UgX19jb25zdGFudF9odG9ucyhQUFBfSVBWNik6CisJCQlnb3RvIGlwdjY7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXN3aXRjaCAoaXBfcHJvdG8pIHsKKwljYXNlIElQUFJPVE9fR1JFOiB7CisJCXN0cnVjdCBncmVfaGRyIHsKKwkJCV9fYmUxNiBmbGFnczsKKwkJCV9fYmUxNiBwcm90bzsKKwkJfSAqaGRyLCBfaGRyOworCisJCWhkciA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG5ob2ZmLCBzaXplb2YoX2hkciksICZfaGRyKTsKKwkJaWYgKCFoZHIpCisJCQlyZXR1cm4gZmFsc2U7CisJCS8qCisJCSAqIE9ubHkgbG9vayBpbnNpZGUgR1JFIGlmIHZlcnNpb24gemVybyBhbmQgbm8KKwkJICogcm91dGluZworCQkgKi8KKwkJaWYgKCEoaGRyLT5mbGFncyAmIChHUkVfVkVSU0lPTnxHUkVfUk9VVElORykpKSB7CisJCQlwcm90byA9IGhkci0+cHJvdG87CisJCQluaG9mZiArPSA0OworCQkJaWYgKGhkci0+ZmxhZ3MgJiBHUkVfQ1NVTSkKKwkJCQluaG9mZiArPSA0OworCQkJaWYgKGhkci0+ZmxhZ3MgJiBHUkVfS0VZKQorCQkJCW5ob2ZmICs9IDQ7CisJCQlpZiAoaGRyLT5mbGFncyAmIEdSRV9TRVEpCisJCQkJbmhvZmYgKz0gNDsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgSVBQUk9UT19JUElQOgorCQlnb3RvIGFnYWluOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWZsb3ctPmlwX3Byb3RvID0gaXBfcHJvdG87CisJcG9mZiA9IHByb3RvX3BvcnRzX29mZnNldChpcF9wcm90byk7CisJaWYgKHBvZmYgPj0gMCkgeworCQlfX2JlMzIgKnBvcnRzLCBfcG9ydHM7CisKKwkJbmhvZmYgKz0gcG9mZjsKKwkJcG9ydHMgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiwgc2l6ZW9mKF9wb3J0cyksICZfcG9ydHMpOworCQlpZiAocG9ydHMpCisJCQlmbG93LT5wb3J0cyA9ICpwb3J0czsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9SVF9TWU1CT0woc2tiX2Zsb3dfZGlzc2VjdCk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZWlnaGJvdXIuYyBiL25ldC9jb3JlL25laWdoYm91ci5jCmluZGV4IDAzOWQ1MWUuLmUyODczNDYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25laWdoYm91ci5jCisrKyBiL25ldC9jb3JlL25laWdoYm91ci5jCkBAIC0yMzgsNiArMjM4LDcgQEAKIAkJCQkgICBpdCB0byBzYWZlIHN0YXRlLgogCQkJCSAqLwogCQkJCXNrYl9xdWV1ZV9wdXJnZSgmbi0+YXJwX3F1ZXVlKTsKKwkJCQluLT5hcnBfcXVldWVfbGVuX2J5dGVzID0gMDsKIAkJCQluLT5vdXRwdXQgPSBuZWlnaF9ibGFja2hvbGU7CiAJCQkJaWYgKG4tPm51ZF9zdGF0ZSAmIE5VRF9WQUxJRCkKIAkJCQkJbi0+bnVkX3N0YXRlID0gTlVEX05PQVJQOwpAQCAtMjcyLDcgKzI3Myw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKG5laWdoX2lmZG93bik7CiAKLXN0YXRpYyBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaF9hbGxvYyhzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCkKK3N0YXRpYyBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaF9hbGxvYyhzdHJ1Y3QgbmVpZ2hfdGFibGUgKnRibCwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gTlVMTDsKIAl1bnNpZ25lZCBsb25nIG5vdyA9IGppZmZpZXM7CkBAIC0yODcsNyArMjg4LDE1IEBACiAJCQlnb3RvIG91dF9lbnRyaWVzOwogCX0KIAotCW4gPSBrbWVtX2NhY2hlX3phbGxvYyh0YmwtPmttZW1fY2FjaGVwLCBHRlBfQVRPTUlDKTsKKwlpZiAodGJsLT5lbnRyeV9zaXplKQorCQluID0ga3phbGxvYyh0YmwtPmVudHJ5X3NpemUsIEdGUF9BVE9NSUMpOworCWVsc2UgeworCQlpbnQgc3ogPSBzaXplb2YoKm4pICsgdGJsLT5rZXlfbGVuOworCisJCXN6ID0gQUxJR04oc3osIE5FSUdIX1BSSVZfQUxJR04pOworCQlzeiArPSBkZXYtPm5laWdoX3ByaXZfbGVuOworCQluID0ga3phbGxvYyhzeiwgR0ZQX0FUT01JQyk7CisJfQogCWlmICghbikKIAkJZ290byBvdXRfZW50cmllczsKIApAQCAtMzEzLDExICszMjIsMTggQEAKIAlnb3RvIG91dDsKIH0KIAorc3RhdGljIHZvaWQgbmVpZ2hfZ2V0X2hhc2hfcm5kKHUzMiAqeCkKK3sKKwlnZXRfcmFuZG9tX2J5dGVzKHgsIHNpemVvZigqeCkpOworCSp4IHw9IDE7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgbmVpZ2hfaGFzaF90YWJsZSAqbmVpZ2hfaGFzaF9hbGxvYyh1bnNpZ25lZCBpbnQgc2hpZnQpCiB7CiAJc2l6ZV90IHNpemUgPSAoMSA8PCBzaGlmdCkgKiBzaXplb2Yoc3RydWN0IG5laWdoYm91ciAqKTsKIAlzdHJ1Y3QgbmVpZ2hfaGFzaF90YWJsZSAqcmV0OwogCXN0cnVjdCBuZWlnaGJvdXIgX19yY3UgKipidWNrZXRzOworCWludCBpOwogCiAJcmV0ID0ga21hbGxvYyhzaXplb2YoKnJldCksIEdGUF9BVE9NSUMpOwogCWlmICghcmV0KQpAQCAtMzM0LDggKzM1MCw4IEBACiAJfQogCXJldC0+aGFzaF9idWNrZXRzID0gYnVja2V0czsKIAlyZXQtPmhhc2hfc2hpZnQgPSBzaGlmdDsKLQlnZXRfcmFuZG9tX2J5dGVzKCZyZXQtPmhhc2hfcm5kLCBzaXplb2YocmV0LT5oYXNoX3JuZCkpOwotCXJldC0+aGFzaF9ybmQgfD0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgTkVJR0hfTlVNX0hBU0hfUk5EOyBpKyspCisJCW5laWdoX2dldF9oYXNoX3JuZCgmcmV0LT5oYXNoX3JuZFtpXSk7CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNDYyLDcgKzQ3OCw3IEBACiAJdTMyIGhhc2hfdmFsOwogCWludCBrZXlfbGVuID0gdGJsLT5rZXlfbGVuOwogCWludCBlcnJvcjsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuMSwgKnJjLCAqbiA9IG5laWdoX2FsbG9jKHRibCk7CisJc3RydWN0IG5laWdoYm91ciAqbjEsICpyYywgKm4gPSBuZWlnaF9hbGxvYyh0YmwsIGRldik7CiAJc3RydWN0IG5laWdoX2hhc2hfdGFibGUgKm5odDsKIAogCWlmICghbikgewpAQCAtNDgwLDYgKzQ5NiwxNCBAQAogCQlnb3RvIG91dF9uZWlnaF9yZWxlYXNlOwogCX0KIAorCWlmIChkZXYtPm5ldGRldl9vcHMtPm5kb19uZWlnaF9jb25zdHJ1Y3QpIHsKKwkJZXJyb3IgPSBkZXYtPm5ldGRldl9vcHMtPm5kb19uZWlnaF9jb25zdHJ1Y3Qobik7CisJCWlmIChlcnJvciA8IDApIHsKKwkJCXJjID0gRVJSX1BUUihlcnJvcik7CisJCQlnb3RvIG91dF9uZWlnaF9yZWxlYXNlOworCQl9CisJfQorCiAJLyogRGV2aWNlIHNwZWNpZmljIHNldHVwLiAqLwogCWlmIChuLT5wYXJtcy0+bmVpZ2hfc2V0dXAgJiYKIAkgICAgKGVycm9yID0gbi0+cGFybXMtPm5laWdoX3NldHVwKG4pKSA8IDApIHsKQEAgLTY3NywxOCArNzAxLDE0IEBACiAJCW5laWdoX3Bhcm1zX2Rlc3Ryb3kocGFybXMpOwogfQogCi1zdGF0aWMgdm9pZCBuZWlnaF9kZXN0cm95X3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCi17Ci0Jc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG5laWdoYm91ciwgcmN1KTsKLQotCWttZW1fY2FjaGVfZnJlZShuZWlnaC0+dGJsLT5rbWVtX2NhY2hlcCwgbmVpZ2gpOwotfQogLyoKICAqCW5laWdoYm91ciBtdXN0IGFscmVhZHkgYmUgb3V0IG9mIHRoZSB0YWJsZTsKICAqCiAgKi8KIHZvaWQgbmVpZ2hfZGVzdHJveShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKIHsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKKwogCU5FSUdIX0NBQ0hFX1NUQVRfSU5DKG5laWdoLT50YmwsIGRlc3Ryb3lzKTsKIAogCWlmICghbmVpZ2gtPmRlYWQpIHsKQEAgLTcwMiwxNCArNzIyLDE4IEBACiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIkltcG9zc2libGUgZXZlbnQuXG4iKTsKIAogCXNrYl9xdWV1ZV9wdXJnZSgmbmVpZ2gtPmFycF9xdWV1ZSk7CisJbmVpZ2gtPmFycF9xdWV1ZV9sZW5fYnl0ZXMgPSAwOwogCi0JZGV2X3B1dChuZWlnaC0+ZGV2KTsKKwlpZiAoZGV2LT5uZXRkZXZfb3BzLT5uZG9fbmVpZ2hfZGVzdHJveSkKKwkJZGV2LT5uZXRkZXZfb3BzLT5uZG9fbmVpZ2hfZGVzdHJveShuZWlnaCk7CisKKwlkZXZfcHV0KGRldik7CiAJbmVpZ2hfcGFybXNfcHV0KG5laWdoLT5wYXJtcyk7CiAKIAlORUlHSF9QUklOVEsyKCJuZWlnaCAlcCBpcyBkZXN0cm95ZWQuXG4iLCBuZWlnaCk7CiAKIAlhdG9taWNfZGVjKCZuZWlnaC0+dGJsLT5lbnRyaWVzKTsKLQljYWxsX3JjdSgmbmVpZ2gtPnJjdSwgbmVpZ2hfZGVzdHJveV9yY3UpOworCWtmcmVlX3JjdShuZWlnaCwgcmN1KTsKIH0KIEVYUE9SVF9TWU1CT0wobmVpZ2hfZGVzdHJveSk7CiAKQEAgLTg0Miw2ICs4NjYsNyBAQAogCQl3cml0ZV9sb2NrKCZuZWlnaC0+bG9jayk7CiAJfQogCXNrYl9xdWV1ZV9wdXJnZSgmbmVpZ2gtPmFycF9xdWV1ZSk7CisJbmVpZ2gtPmFycF9xdWV1ZV9sZW5fYnl0ZXMgPSAwOwogfQogCiBzdGF0aWMgdm9pZCBuZWlnaF9wcm9iZShzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCkKQEAgLTk4MCwxNSArMTAwNSwyMCBAQAogCiAJaWYgKG5laWdoLT5udWRfc3RhdGUgPT0gTlVEX0lOQ09NUExFVEUpIHsKIAkJaWYgKHNrYikgewotCQkJaWYgKHNrYl9xdWV1ZV9sZW4oJm5laWdoLT5hcnBfcXVldWUpID49Ci0JCQkgICAgbmVpZ2gtPnBhcm1zLT5xdWV1ZV9sZW4pIHsKKwkJCXdoaWxlIChuZWlnaC0+YXJwX3F1ZXVlX2xlbl9ieXRlcyArIHNrYi0+dHJ1ZXNpemUgPgorCQkJICAgICAgIG5laWdoLT5wYXJtcy0+cXVldWVfbGVuX2J5dGVzKSB7CiAJCQkJc3RydWN0IHNrX2J1ZmYgKmJ1ZmY7CisKIAkJCQlidWZmID0gX19za2JfZGVxdWV1ZSgmbmVpZ2gtPmFycF9xdWV1ZSk7CisJCQkJaWYgKCFidWZmKQorCQkJCQlicmVhazsKKwkJCQluZWlnaC0+YXJwX3F1ZXVlX2xlbl9ieXRlcyAtPSBidWZmLT50cnVlc2l6ZTsKIAkJCQlrZnJlZV9za2IoYnVmZik7CiAJCQkJTkVJR0hfQ0FDSEVfU1RBVF9JTkMobmVpZ2gtPnRibCwgdW5yZXNfZGlzY2FyZHMpOwogCQkJfQogCQkJc2tiX2RzdF9mb3JjZShza2IpOwogCQkJX19za2JfcXVldWVfdGFpbCgmbmVpZ2gtPmFycF9xdWV1ZSwgc2tiKTsKKwkJCW5laWdoLT5hcnBfcXVldWVfbGVuX2J5dGVzICs9IHNrYi0+dHJ1ZXNpemU7CiAJCX0KIAkJcmMgPSAxOwogCX0KQEAgLTExNjcsNyArMTE5Nyw3IEBACiAKIAkJCXJjdV9yZWFkX2xvY2soKTsKIAkJCS8qIE9uIHNoYXBlci9lcWwgc2tiLT5kc3QtPm5laWdoYm91ciAhPSBuZWlnaCA6KCAqLwotCQkJaWYgKGRzdCAmJiAobjIgPSBkc3RfZ2V0X25laWdoYm91cihkc3QpKSAhPSBOVUxMKQorCQkJaWYgKGRzdCAmJiAobjIgPSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZihkc3QpKSAhPSBOVUxMKQogCQkJCW4xID0gbjI7CiAJCQluMS0+b3V0cHV0KG4xLCBza2IpOwogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0xMTc1LDYgKzEyMDUsNyBAQAogCQkJd3JpdGVfbG9ja19iaCgmbmVpZ2gtPmxvY2spOwogCQl9CiAJCXNrYl9xdWV1ZV9wdXJnZSgmbmVpZ2gtPmFycF9xdWV1ZSk7CisJCW5laWdoLT5hcnBfcXVldWVfbGVuX2J5dGVzID0gMDsKIAl9CiBvdXQ6CiAJaWYgKHVwZGF0ZV9pc3JvdXRlcikgewpAQCAtMTQ3NywxMSArMTUwOCw2IEBACiAJdGJsLT5wYXJtcy5yZWFjaGFibGVfdGltZSA9CiAJCQkgIG5laWdoX3JhbmRfcmVhY2hfdGltZSh0YmwtPnBhcm1zLmJhc2VfcmVhY2hhYmxlX3RpbWUpOwogCi0JaWYgKCF0YmwtPmttZW1fY2FjaGVwKQotCQl0YmwtPmttZW1fY2FjaGVwID0KLQkJCWttZW1fY2FjaGVfY3JlYXRlKHRibC0+aWQsIHRibC0+ZW50cnlfc2l6ZSwgMCwKLQkJCQkJICBTTEFCX0hXQ0FDSEVfQUxJR058U0xBQl9QQU5JQywKLQkJCQkJICBOVUxMKTsKIAl0YmwtPnN0YXRzID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBuZWlnaF9zdGF0aXN0aWNzKTsKIAlpZiAoIXRibC0+c3RhdHMpCiAJCXBhbmljKCJjYW5ub3QgY3JlYXRlIG5laWdoYm91ciBjYWNoZSBzdGF0aXN0aWNzIik7CkBAIC0xNTY2LDkgKzE1OTIsNiBAQAogCWZyZWVfcGVyY3B1KHRibC0+c3RhdHMpOwogCXRibC0+c3RhdHMgPSBOVUxMOwogCi0Ja21lbV9jYWNoZV9kZXN0cm95KHRibC0+a21lbV9jYWNoZXApOwotCXRibC0+a21lbV9jYWNoZXAgPSBOVUxMOwotCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKG5laWdoX3RhYmxlX2NsZWFyKTsKQEAgLTE3NDcsNyArMTc3MCwxMSBAQAogCQlOTEFfUFVUX1UzMihza2IsIE5EVFBBX0lGSU5ERVgsIHBhcm1zLT5kZXYtPmlmaW5kZXgpOwogCiAJTkxBX1BVVF9VMzIoc2tiLCBORFRQQV9SRUZDTlQsIGF0b21pY19yZWFkKCZwYXJtcy0+cmVmY250KSk7Ci0JTkxBX1BVVF9VMzIoc2tiLCBORFRQQV9RVUVVRV9MRU4sIHBhcm1zLT5xdWV1ZV9sZW4pOworCU5MQV9QVVRfVTMyKHNrYiwgTkRUUEFfUVVFVUVfTEVOQllURVMsIHBhcm1zLT5xdWV1ZV9sZW5fYnl0ZXMpOworCS8qIGFwcHJveGltYXRpdmUgdmFsdWUgZm9yIGRlcHJlY2F0ZWQgUVVFVUVfTEVOIChpbiBwYWNrZXRzKSAqLworCU5MQV9QVVRfVTMyKHNrYiwgTkRUUEFfUVVFVUVfTEVOLAorCQkgICAgRElWX1JPVU5EX1VQKHBhcm1zLT5xdWV1ZV9sZW5fYnl0ZXMsCisJCQkJIFNLQl9UUlVFU0laRShFVEhfRlJBTUVfTEVOKSkpOwogCU5MQV9QVVRfVTMyKHNrYiwgTkRUUEFfUFJPWFlfUUxFTiwgcGFybXMtPnByb3h5X3FsZW4pOwogCU5MQV9QVVRfVTMyKHNrYiwgTkRUUEFfQVBQX1BST0JFUywgcGFybXMtPmFwcF9wcm9iZXMpOwogCU5MQV9QVVRfVTMyKHNrYiwgTkRUUEFfVUNBU1RfUFJPQkVTLCBwYXJtcy0+dWNhc3RfcHJvYmVzKTsKQEAgLTE4MDgsNyArMTgzNSw3IEBACiAKIAkJcmN1X3JlYWRfbG9ja19iaCgpOwogCQluaHQgPSByY3VfZGVyZWZlcmVuY2VfYmgodGJsLT5uaHQpOwotCQluZGMubmR0Y19oYXNoX3JuZCA9IG5odC0+aGFzaF9ybmQ7CisJCW5kYy5uZHRjX2hhc2hfcm5kID0gbmh0LT5oYXNoX3JuZFswXTsKIAkJbmRjLm5kdGNfaGFzaF9tYXNrID0gKCgxIDw8IG5odC0+aGFzaF9zaGlmdCkgLSAxKTsKIAkJcmN1X3JlYWRfdW5sb2NrX2JoKCk7CiAKQEAgLTE5NzQsNyArMjAwMSwxMSBAQAogCiAJCQlzd2l0Y2ggKGkpIHsKIAkJCWNhc2UgTkRUUEFfUVVFVUVfTEVOOgotCQkJCXAtPnF1ZXVlX2xlbiA9IG5sYV9nZXRfdTMyKHRicFtpXSk7CisJCQkJcC0+cXVldWVfbGVuX2J5dGVzID0gbmxhX2dldF91MzIodGJwW2ldKSAqCisJCQkJCQkgICAgIFNLQl9UUlVFU0laRShFVEhfRlJBTUVfTEVOKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgTkRUUEFfUVVFVUVfTEVOQllURVM6CisJCQkJcC0+cXVldWVfbGVuX2J5dGVzID0gbmxhX2dldF91MzIodGJwW2ldKTsKIAkJCQlicmVhazsKIAkJCWNhc2UgTkRUUEFfUFJPWFlfUUxFTjoKIAkJCQlwLT5wcm94eV9xbGVuID0gbmxhX2dldF91MzIodGJwW2ldKTsKQEAgLTIzOTcsNyArMjQyOCwxMCBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcV9maWxlX25ldChzZXEpOwogCXN0cnVjdCBuZWlnaF90YWJsZSAqdGJsID0gc3RhdGUtPnRibDsKIAotCXBuID0gcG4tPm5leHQ7CisJZG8geworCQlwbiA9IHBuLT5uZXh0OworCX0gd2hpbGUgKHBuICYmICFuZXRfZXEocG5laWdoX25ldChwbiksIG5ldCkpOworCiAJd2hpbGUgKCFwbikgewogCQlpZiAoKytzdGF0ZS0+YnVja2V0ID4gUE5FSUdIX0hBU0hNQVNLKQogCQkJYnJlYWs7CkBAIC0yNjM1LDExNyArMjY2OSwxNTggQEAKIAogI2lmZGVmIENPTkZJR19TWVNDVEwKIAotI2RlZmluZSBORUlHSF9WQVJTX01BWCAxOQorc3RhdGljIGludCBwcm9jX3VucmVzX3FsZW4oY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgIHNpemVfdCAqbGVucCwgbG9mZl90ICpwcG9zKQoreworCWludCBzaXplLCByZXQ7CisJY3RsX3RhYmxlIHRtcCA9ICpjdGw7CisKKwl0bXAuZGF0YSA9ICZzaXplOworCXNpemUgPSBESVZfUk9VTkRfVVAoKihpbnQgKiljdGwtPmRhdGEsIFNLQl9UUlVFU0laRShFVEhfRlJBTUVfTEVOKSk7CisJcmV0ID0gcHJvY19kb2ludHZlYygmdG1wLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwlpZiAod3JpdGUgJiYgIXJldCkKKwkJKihpbnQgKiljdGwtPmRhdGEgPSBzaXplICogU0tCX1RSVUVTSVpFKEVUSF9GUkFNRV9MRU4pOworCXJldHVybiByZXQ7Cit9CisKK2VudW0geworCU5FSUdIX1ZBUl9NQ0FTVF9QUk9CRSwKKwlORUlHSF9WQVJfVUNBU1RfUFJPQkUsCisJTkVJR0hfVkFSX0FQUF9QUk9CRSwKKwlORUlHSF9WQVJfUkVUUkFOU19USU1FLAorCU5FSUdIX1ZBUl9CQVNFX1JFQUNIQUJMRV9USU1FLAorCU5FSUdIX1ZBUl9ERUxBWV9QUk9CRV9USU1FLAorCU5FSUdIX1ZBUl9HQ19TVEFMRVRJTUUsCisJTkVJR0hfVkFSX1FVRVVFX0xFTiwKKwlORUlHSF9WQVJfUVVFVUVfTEVOX0JZVEVTLAorCU5FSUdIX1ZBUl9QUk9YWV9RTEVOLAorCU5FSUdIX1ZBUl9BTllDQVNUX0RFTEFZLAorCU5FSUdIX1ZBUl9QUk9YWV9ERUxBWSwKKwlORUlHSF9WQVJfTE9DS1RJTUUsCisJTkVJR0hfVkFSX1JFVFJBTlNfVElNRV9NUywKKwlORUlHSF9WQVJfQkFTRV9SRUFDSEFCTEVfVElNRV9NUywKKwlORUlHSF9WQVJfR0NfSU5URVJWQUwsCisJTkVJR0hfVkFSX0dDX1RIUkVTSDEsCisJTkVJR0hfVkFSX0dDX1RIUkVTSDIsCisJTkVJR0hfVkFSX0dDX1RIUkVTSDMsCisJTkVJR0hfVkFSX01BWAorfTsKIAogc3RhdGljIHN0cnVjdCBuZWlnaF9zeXNjdGxfdGFibGUgewogCXN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzeXNjdGxfaGVhZGVyOwotCXN0cnVjdCBjdGxfdGFibGUgbmVpZ2hfdmFyc1tORUlHSF9WQVJTX01BWF07CisJc3RydWN0IGN0bF90YWJsZSBuZWlnaF92YXJzW05FSUdIX1ZBUl9NQVggKyAxXTsKIAljaGFyICpkZXZfbmFtZTsKIH0gbmVpZ2hfc3lzY3RsX3RlbXBsYXRlIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5laWdoX3ZhcnMgPSB7Ci0JCXsKKwkJW05FSUdIX1ZBUl9NQ0FTVF9QUk9CRV0gPSB7CiAJCQkucHJvY25hbWUJPSAibWNhc3Rfc29saWNpdCIsCiAJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkJLm1vZGUJCT0gMDY0NCwKIAkJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCQl9LAotCQl7CisJCVtORUlHSF9WQVJfVUNBU1RfUFJPQkVdID0gewogCQkJLnByb2NuYW1lCT0gInVjYXN0X3NvbGljaXQiLAogCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKIAkJCS5tb2RlCQk9IDA2NDQsCiAJCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAkJfSwKLQkJeworCQlbTkVJR0hfVkFSX0FQUF9QUk9CRV0gPSB7CiAJCQkucHJvY25hbWUJPSAiYXBwX3NvbGljaXQiLAogCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKIAkJCS5tb2RlCQk9IDA2NDQsCiAJCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlYywKIAkJfSwKLQkJeworCQlbTkVJR0hfVkFSX1JFVFJBTlNfVElNRV0gPSB7CiAJCQkucHJvY25hbWUJPSAicmV0cmFuc190aW1lIiwKIAkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCQkubW9kZQkJPSAwNjQ0LAogCQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMsCiAJCX0sCi0JCXsKKwkJW05FSUdIX1ZBUl9CQVNFX1JFQUNIQUJMRV9USU1FXSA9IHsKIAkJCS5wcm9jbmFtZQk9ICJiYXNlX3JlYWNoYWJsZV90aW1lIiwKIAkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCQkubW9kZQkJPSAwNjQ0LAogCQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKIAkJfSwKLQkJeworCQlbTkVJR0hfVkFSX0RFTEFZX1BST0JFX1RJTUVdID0gewogCQkJLnByb2NuYW1lCT0gImRlbGF5X2ZpcnN0X3Byb2JlX3RpbWUiLAogCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKIAkJCS5tb2RlCQk9IDA2NDQsCiAJCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAogCQl9LAotCQl7CisJCVtORUlHSF9WQVJfR0NfU1RBTEVUSU1FXSA9IHsKIAkJCS5wcm9jbmFtZQk9ICJnY19zdGFsZV90aW1lIiwKIAkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCQkubW9kZQkJPSAwNjQ0LAogCQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKIAkJfSwKLQkJeworCQlbTkVJR0hfVkFSX1FVRVVFX0xFTl0gPSB7CiAJCQkucHJvY25hbWUJPSAidW5yZXNfcWxlbiIsCiAJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkJLm1vZGUJCT0gMDY0NCwKKwkJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX3VucmVzX3FsZW4sCisJCX0sCisJCVtORUlHSF9WQVJfUVVFVUVfTEVOX0JZVEVTXSA9IHsKKwkJCS5wcm9jbmFtZQk9ICJ1bnJlc19xbGVuX2J5dGVzIiwKKwkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCisJCQkubW9kZQkJPSAwNjQ0LAogCQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJCX0sCi0JCXsKKwkJW05FSUdIX1ZBUl9QUk9YWV9RTEVOXSA9IHsKIAkJCS5wcm9jbmFtZQk9ICJwcm94eV9xbGVuIiwKIAkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCQkubW9kZQkJPSAwNjQ0LAogCQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMsCiAJCX0sCi0JCXsKKwkJW05FSUdIX1ZBUl9BTllDQVNUX0RFTEFZXSA9IHsKIAkJCS5wcm9jbmFtZQk9ICJhbnljYXN0X2RlbGF5IiwKIAkJCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCiAJCQkubW9kZQkJPSAwNjQ0LAogCQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfdXNlcmh6X2ppZmZpZXMsCiAJCX0sCi0JCXsKKwkJW05FSUdIX1ZBUl9QUk9YWV9ERUxBWV0gPSB7CiAJCQkucHJvY25hbWUJPSAicHJveHlfZGVsYXkiLAogCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKIAkJCS5tb2RlCQk9IDA2NDQsCiAJCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY191c2VyaHpfamlmZmllcywKIAkJfSwKLQkJeworCQlbTkVJR0hfVkFSX0xPQ0tUSU1FXSA9IHsKIAkJCS5wcm9jbmFtZQk9ICJsb2NrdGltZSIsCiAJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkJLm1vZGUJCT0gMDY0NCwKIAkJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX3VzZXJoel9qaWZmaWVzLAogCQl9LAotCQl7CisJCVtORUlHSF9WQVJfUkVUUkFOU19USU1FX01TXSA9IHsKIAkJCS5wcm9jbmFtZQk9ICJyZXRyYW5zX3RpbWVfbXMiLAogCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKIAkJCS5tb2RlCQk9IDA2NDQsCiAJCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19tc19qaWZmaWVzLAogCQl9LAotCQl7CisJCVtORUlHSF9WQVJfQkFTRV9SRUFDSEFCTEVfVElNRV9NU10gPSB7CiAJCQkucHJvY25hbWUJPSAiYmFzZV9yZWFjaGFibGVfdGltZV9tcyIsCiAJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkJLm1vZGUJCT0gMDY0NCwKIAkJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjX21zX2ppZmZpZXMsCiAJCX0sCi0JCXsKKwkJW05FSUdIX1ZBUl9HQ19JTlRFUlZBTF0gPSB7CiAJCQkucHJvY25hbWUJPSAiZ2NfaW50ZXJ2YWwiLAogCQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKIAkJCS5tb2RlCQk9IDA2NDQsCiAJCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAogCQl9LAotCQl7CisJCVtORUlHSF9WQVJfR0NfVEhSRVNIMV0gPSB7CiAJCQkucHJvY25hbWUJPSAiZ2NfdGhyZXNoMSIsCiAJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkJLm1vZGUJCT0gMDY0NCwKIAkJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCQl9LAotCQl7CisJCVtORUlHSF9WQVJfR0NfVEhSRVNIMl0gPSB7CiAJCQkucHJvY25hbWUJPSAiZ2NfdGhyZXNoMiIsCiAJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkJLm1vZGUJCT0gMDY0NCwKIAkJCS5wcm9jX2hhbmRsZXIJPSBwcm9jX2RvaW50dmVjLAogCQl9LAotCQl7CisJCVtORUlHSF9WQVJfR0NfVEhSRVNIM10gPSB7CiAJCQkucHJvY25hbWUJPSAiZ2NfdGhyZXNoMyIsCiAJCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAogCQkJLm1vZGUJCT0gMDY0NCwKQEAgLTI3NzgsNDcgKzI4NTMsNDkgQEAKIAlpZiAoIXQpCiAJCWdvdG8gZXJyOwogCi0JdC0+bmVpZ2hfdmFyc1swXS5kYXRhICA9ICZwLT5tY2FzdF9wcm9iZXM7Ci0JdC0+bmVpZ2hfdmFyc1sxXS5kYXRhICA9ICZwLT51Y2FzdF9wcm9iZXM7Ci0JdC0+bmVpZ2hfdmFyc1syXS5kYXRhICA9ICZwLT5hcHBfcHJvYmVzOwotCXQtPm5laWdoX3ZhcnNbM10uZGF0YSAgPSAmcC0+cmV0cmFuc190aW1lOwotCXQtPm5laWdoX3ZhcnNbNF0uZGF0YSAgPSAmcC0+YmFzZV9yZWFjaGFibGVfdGltZTsKLQl0LT5uZWlnaF92YXJzWzVdLmRhdGEgID0gJnAtPmRlbGF5X3Byb2JlX3RpbWU7Ci0JdC0+bmVpZ2hfdmFyc1s2XS5kYXRhICA9ICZwLT5nY19zdGFsZXRpbWU7Ci0JdC0+bmVpZ2hfdmFyc1s3XS5kYXRhICA9ICZwLT5xdWV1ZV9sZW47Ci0JdC0+bmVpZ2hfdmFyc1s4XS5kYXRhICA9ICZwLT5wcm94eV9xbGVuOwotCXQtPm5laWdoX3ZhcnNbOV0uZGF0YSAgPSAmcC0+YW55Y2FzdF9kZWxheTsKLQl0LT5uZWlnaF92YXJzWzEwXS5kYXRhID0gJnAtPnByb3h5X2RlbGF5OwotCXQtPm5laWdoX3ZhcnNbMTFdLmRhdGEgPSAmcC0+bG9ja3RpbWU7Ci0JdC0+bmVpZ2hfdmFyc1sxMl0uZGF0YSAgPSAmcC0+cmV0cmFuc190aW1lOwotCXQtPm5laWdoX3ZhcnNbMTNdLmRhdGEgID0gJnAtPmJhc2VfcmVhY2hhYmxlX3RpbWU7CisJdC0+bmVpZ2hfdmFyc1tORUlHSF9WQVJfTUNBU1RfUFJPQkVdLmRhdGEgID0gJnAtPm1jYXN0X3Byb2JlczsKKwl0LT5uZWlnaF92YXJzW05FSUdIX1ZBUl9VQ0FTVF9QUk9CRV0uZGF0YSAgPSAmcC0+dWNhc3RfcHJvYmVzOworCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX0FQUF9QUk9CRV0uZGF0YSAgPSAmcC0+YXBwX3Byb2JlczsKKwl0LT5uZWlnaF92YXJzW05FSUdIX1ZBUl9SRVRSQU5TX1RJTUVdLmRhdGEgID0gJnAtPnJldHJhbnNfdGltZTsKKwl0LT5uZWlnaF92YXJzW05FSUdIX1ZBUl9CQVNFX1JFQUNIQUJMRV9USU1FXS5kYXRhICA9ICZwLT5iYXNlX3JlYWNoYWJsZV90aW1lOworCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX0RFTEFZX1BST0JFX1RJTUVdLmRhdGEgID0gJnAtPmRlbGF5X3Byb2JlX3RpbWU7CisJdC0+bmVpZ2hfdmFyc1tORUlHSF9WQVJfR0NfU1RBTEVUSU1FXS5kYXRhICA9ICZwLT5nY19zdGFsZXRpbWU7CisJdC0+bmVpZ2hfdmFyc1tORUlHSF9WQVJfUVVFVUVfTEVOXS5kYXRhICA9ICZwLT5xdWV1ZV9sZW5fYnl0ZXM7CisJdC0+bmVpZ2hfdmFyc1tORUlHSF9WQVJfUVVFVUVfTEVOX0JZVEVTXS5kYXRhICA9ICZwLT5xdWV1ZV9sZW5fYnl0ZXM7CisJdC0+bmVpZ2hfdmFyc1tORUlHSF9WQVJfUFJPWFlfUUxFTl0uZGF0YSAgPSAmcC0+cHJveHlfcWxlbjsKKwl0LT5uZWlnaF92YXJzW05FSUdIX1ZBUl9BTllDQVNUX0RFTEFZXS5kYXRhICA9ICZwLT5hbnljYXN0X2RlbGF5OworCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX1BST1hZX0RFTEFZXS5kYXRhID0gJnAtPnByb3h5X2RlbGF5OworCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX0xPQ0tUSU1FXS5kYXRhID0gJnAtPmxvY2t0aW1lOworCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX1JFVFJBTlNfVElNRV9NU10uZGF0YSAgPSAmcC0+cmV0cmFuc190aW1lOworCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX0JBU0VfUkVBQ0hBQkxFX1RJTUVfTVNdLmRhdGEgID0gJnAtPmJhc2VfcmVhY2hhYmxlX3RpbWU7CiAKIAlpZiAoZGV2KSB7CiAJCWRldl9uYW1lX3NvdXJjZSA9IGRldi0+bmFtZTsKIAkJLyogVGVybWluYXRlIHRoZSB0YWJsZSBlYXJseSAqLwotCQltZW1zZXQoJnQtPm5laWdoX3ZhcnNbMTRdLCAwLCBzaXplb2YodC0+bmVpZ2hfdmFyc1sxNF0pKTsKKwkJbWVtc2V0KCZ0LT5uZWlnaF92YXJzW05FSUdIX1ZBUl9HQ19JTlRFUlZBTF0sIDAsCisJCSAgICAgICBzaXplb2YodC0+bmVpZ2hfdmFyc1tORUlHSF9WQVJfR0NfSU5URVJWQUxdKSk7CiAJfSBlbHNlIHsKIAkJZGV2X25hbWVfc291cmNlID0gbmVpZ2hfcGF0aFtORUlHSF9DVExfUEFUSF9ERVZdLnByb2NuYW1lOwotCQl0LT5uZWlnaF92YXJzWzE0XS5kYXRhID0gKGludCAqKShwICsgMSk7Ci0JCXQtPm5laWdoX3ZhcnNbMTVdLmRhdGEgPSAoaW50ICopKHAgKyAxKSArIDE7Ci0JCXQtPm5laWdoX3ZhcnNbMTZdLmRhdGEgPSAoaW50ICopKHAgKyAxKSArIDI7Ci0JCXQtPm5laWdoX3ZhcnNbMTddLmRhdGEgPSAoaW50ICopKHAgKyAxKSArIDM7CisJCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX0dDX0lOVEVSVkFMXS5kYXRhID0gKGludCAqKShwICsgMSk7CisJCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX0dDX1RIUkVTSDFdLmRhdGEgPSAoaW50ICopKHAgKyAxKSArIDE7CisJCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX0dDX1RIUkVTSDJdLmRhdGEgPSAoaW50ICopKHAgKyAxKSArIDI7CisJCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX0dDX1RIUkVTSDNdLmRhdGEgPSAoaW50ICopKHAgKyAxKSArIDM7CiAJfQogCiAKIAlpZiAoaGFuZGxlcikgewogCQkvKiBSZXRyYW5zVGltZSAqLwotCQl0LT5uZWlnaF92YXJzWzNdLnByb2NfaGFuZGxlciA9IGhhbmRsZXI7Ci0JCXQtPm5laWdoX3ZhcnNbM10uZXh0cmExID0gZGV2OworCQl0LT5uZWlnaF92YXJzW05FSUdIX1ZBUl9SRVRSQU5TX1RJTUVdLnByb2NfaGFuZGxlciA9IGhhbmRsZXI7CisJCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX1JFVFJBTlNfVElNRV0uZXh0cmExID0gZGV2OwogCQkvKiBSZWFjaGFibGVUaW1lICovCi0JCXQtPm5laWdoX3ZhcnNbNF0ucHJvY19oYW5kbGVyID0gaGFuZGxlcjsKLQkJdC0+bmVpZ2hfdmFyc1s0XS5leHRyYTEgPSBkZXY7CisJCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX0JBU0VfUkVBQ0hBQkxFX1RJTUVdLnByb2NfaGFuZGxlciA9IGhhbmRsZXI7CisJCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX0JBU0VfUkVBQ0hBQkxFX1RJTUVdLmV4dHJhMSA9IGRldjsKIAkJLyogUmV0cmFuc1RpbWUgKGluIG1pbGxpc2Vjb25kcykqLwotCQl0LT5uZWlnaF92YXJzWzEyXS5wcm9jX2hhbmRsZXIgPSBoYW5kbGVyOwotCQl0LT5uZWlnaF92YXJzWzEyXS5leHRyYTEgPSBkZXY7CisJCXQtPm5laWdoX3ZhcnNbTkVJR0hfVkFSX1JFVFJBTlNfVElNRV9NU10ucHJvY19oYW5kbGVyID0gaGFuZGxlcjsKKwkJdC0+bmVpZ2hfdmFyc1tORUlHSF9WQVJfUkVUUkFOU19USU1FX01TXS5leHRyYTEgPSBkZXY7CiAJCS8qIFJlYWNoYWJsZVRpbWUgKGluIG1pbGxpc2Vjb25kcykgKi8KLQkJdC0+bmVpZ2hfdmFyc1sxM10ucHJvY19oYW5kbGVyID0gaGFuZGxlcjsKLQkJdC0+bmVpZ2hfdmFyc1sxM10uZXh0cmExID0gZGV2OworCQl0LT5uZWlnaF92YXJzW05FSUdIX1ZBUl9CQVNFX1JFQUNIQUJMRV9USU1FX01TXS5wcm9jX2hhbmRsZXIgPSBoYW5kbGVyOworCQl0LT5uZWlnaF92YXJzW05FSUdIX1ZBUl9CQVNFX1JFQUNIQUJMRV9USU1FX01TXS5leHRyYTEgPSBkZXY7CiAJfQogCiAJdC0+ZGV2X25hbWUgPSBrc3RyZHVwKGRldl9uYW1lX3NvdXJjZSwgR0ZQX0tFUk5FTCk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXQtc3lzZnMuYyBiL25ldC9jb3JlL25ldC1zeXNmcy5jCmluZGV4IGM3MWM0MzQuLmFiZjQzOTMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL25ldC1zeXNmcy5jCisrKyBiL25ldC9jb3JlL25ldC1zeXNmcy5jCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPG5ldC93ZXh0Lmg+CiAKICNpbmNsdWRlICJuZXQtc3lzZnMuaCIKQEAgLTYwNiw5ICs2MDcsMTIgQEAKIAlyY3VfYXNzaWduX3BvaW50ZXIocXVldWUtPnJwc19tYXAsIG1hcCk7CiAJc3Bpbl91bmxvY2soJnJwc19tYXBfbG9jayk7CiAKLQlpZiAob2xkX21hcCkKKwlpZiAobWFwKQorCQlqdW1wX2xhYmVsX2luYygmcnBzX25lZWRlZCk7CisJaWYgKG9sZF9tYXApIHsKIAkJa2ZyZWVfcmN1KG9sZF9tYXAsIHJjdSk7Ci0KKwkJanVtcF9sYWJlbF9kZWMoJnJwc19uZWVkZWQpOworCX0KIAlmcmVlX2NwdW1hc2tfdmFyKG1hc2spOwogCXJldHVybiBsZW47CiB9CkBAIC02MTgsMTUgKzYyMiwxNSBAQAogCQkJCQkgICBjaGFyICpidWYpCiB7CiAJc3RydWN0IHJwc19kZXZfZmxvd190YWJsZSAqZmxvd190YWJsZTsKLQl1bnNpZ25lZCBpbnQgdmFsID0gMDsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZmxvd190YWJsZSA9IHJjdV9kZXJlZmVyZW5jZShxdWV1ZS0+cnBzX2Zsb3dfdGFibGUpOwogCWlmIChmbG93X3RhYmxlKQotCQl2YWwgPSBmbG93X3RhYmxlLT5tYXNrICsgMTsKKwkJdmFsID0gKHVuc2lnbmVkIGxvbmcpZmxvd190YWJsZS0+bWFzayArIDE7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgdmFsKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHVcbiIsIHZhbCk7CiB9CiAKIHN0YXRpYyB2b2lkIHJwc19kZXZfZmxvd190YWJsZV9yZWxlYXNlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQpAQCAtNjUwLDMzICs2NTQsNDYgQEAKIAkJCQkgICAgIHN0cnVjdCByeF9xdWV1ZV9hdHRyaWJ1dGUgKmF0dHIsCiAJCQkJICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCiB7Ci0JdW5zaWduZWQgaW50IGNvdW50OwotCWNoYXIgKmVuZHA7CisJdW5zaWduZWQgbG9uZyBtYXNrLCBjb3VudDsKIAlzdHJ1Y3QgcnBzX2Rldl9mbG93X3RhYmxlICp0YWJsZSwgKm9sZF90YWJsZTsKIAlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHJwc19kZXZfZmxvd19sb2NrKTsKKwlpbnQgcmM7CiAKIAlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQljb3VudCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZHAsIDApOwotCWlmIChlbmRwID09IGJ1ZikKLQkJcmV0dXJuIC1FSU5WQUw7CisJcmMgPSBrc3RydG91bChidWYsIDAsICZjb3VudCk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOwogCiAJaWYgKGNvdW50KSB7Ci0JCWludCBpOwotCi0JCWlmIChjb3VudCA+IDE8PDMwKSB7CisJCW1hc2sgPSBjb3VudCAtIDE7CisJCS8qIG1hc2sgPSByb3VuZHVwX3Bvd19vZl90d28oY291bnQpIC0gMTsKKwkJICogd2l0aG91dCBvdmVyZmxvd3MuLi4KKwkJICovCisJCXdoaWxlICgobWFzayB8IChtYXNrID4+IDEpKSAhPSBtYXNrKQorCQkJbWFzayB8PSAobWFzayA+PiAxKTsKKwkJLyogT24gNjQgYml0IGFyY2hlcywgbXVzdCBjaGVjayBtYXNrIGZpdHMgaW4gdGFibGUtPm1hc2sgKHUzMiksCisJCSAqIGFuZCBvbiAzMmJpdCBhcmNoZXMsIG11c3QgY2hlY2sgUlBTX0RFVl9GTE9XX1RBQkxFX1NJWkUobWFzayArIDEpCisJCSAqIGRvZXNudCBvdmVyZmxvdy4KKwkJICovCisjaWYgQklUU19QRVJfTE9ORyA+IDMyCisJCWlmIChtYXNrID4gKHVuc2lnbmVkIGxvbmcpKHUzMiltYXNrKQorCQkJcmV0dXJuIC1FSU5WQUw7CisjZWxzZQorCQlpZiAobWFzayA+IChVTE9OR19NQVggLSBSUFNfREVWX0ZMT1dfVEFCTEVfU0laRSgxKSkKKwkJCQkvIHNpemVvZihzdHJ1Y3QgcnBzX2Rldl9mbG93KSkgewogCQkJLyogRW5mb3JjZSBhIGxpbWl0IHRvIHByZXZlbnQgb3ZlcmZsb3cgKi8KIAkJCXJldHVybiAtRUlOVkFMOwogCQl9Ci0JCWNvdW50ID0gcm91bmR1cF9wb3dfb2ZfdHdvKGNvdW50KTsKLQkJdGFibGUgPSB2bWFsbG9jKFJQU19ERVZfRkxPV19UQUJMRV9TSVpFKGNvdW50KSk7CisjZW5kaWYKKwkJdGFibGUgPSB2bWFsbG9jKFJQU19ERVZfRkxPV19UQUJMRV9TSVpFKG1hc2sgKyAxKSk7CiAJCWlmICghdGFibGUpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAotCQl0YWJsZS0+bWFzayA9IGNvdW50IC0gMTsKLQkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCQl0YWJsZS0+Zmxvd3NbaV0uY3B1ID0gUlBTX05PX0NQVTsKKwkJdGFibGUtPm1hc2sgPSBtYXNrOworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPD0gbWFzazsgY291bnQrKykKKwkJCXRhYmxlLT5mbG93c1tjb3VudF0uY3B1ID0gUlBTX05PX0NQVTsKIAl9IGVsc2UKIAkJdGFibGUgPSBOVUxMOwogCkBAIC03ODAsNyArNzk3LDcgQEAKICNlbmRpZgogfQogCi0jaWZkZWYgQ09ORklHX1hQUworI2lmZGVmIENPTkZJR19TWVNGUwogLyoKICAqIG5ldGRldl9xdWV1ZSBzeXNmcyBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMuCiAgKi8KQEAgLTgyNiw2ICs4NDMsMTMzIEBACiAJLnN0b3JlID0gbmV0ZGV2X3F1ZXVlX2F0dHJfc3RvcmUsCiB9OwogCitzdGF0aWMgc3NpemVfdCBzaG93X3RyYW5zX3RpbWVvdXQoc3RydWN0IG5ldGRldl9xdWV1ZSAqcXVldWUsCisJCQkJICBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlX2F0dHJpYnV0ZSAqYXR0cmlidXRlLAorCQkJCSAgY2hhciAqYnVmKQoreworCXVuc2lnbmVkIGxvbmcgdHJhbnNfdGltZW91dDsKKworCXNwaW5fbG9ja19pcnEoJnF1ZXVlLT5feG1pdF9sb2NrKTsKKwl0cmFuc190aW1lb3V0ID0gcXVldWUtPnRyYW5zX3RpbWVvdXQ7CisJc3Bpbl91bmxvY2tfaXJxKCZxdWV1ZS0+X3htaXRfbG9jayk7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlbHUiLCB0cmFuc190aW1lb3V0KTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRkZXZfcXVldWVfYXR0cmlidXRlIHF1ZXVlX3RyYW5zX3RpbWVvdXQgPQorCV9fQVRUUih0eF90aW1lb3V0LCBTX0lSVUdPLCBzaG93X3RyYW5zX3RpbWVvdXQsIE5VTEwpOworCisjaWZkZWYgQ09ORklHX0JRTAorLyoKKyAqIEJ5dGUgcXVldWUgbGltaXRzIHN5c2ZzIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucy4KKyAqLworc3RhdGljIHNzaXplX3QgYnFsX3Nob3coY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3QgYnFsX3NldChjb25zdCBjaGFyICpidWYsIGNvbnN0IHNpemVfdCBjb3VudCwKKwkJICAgICAgIHVuc2lnbmVkIGludCAqcHZhbHVlKQoreworCXVuc2lnbmVkIGludCB2YWx1ZTsKKwlpbnQgZXJyOworCisJaWYgKCFzdHJjbXAoYnVmLCAibWF4IikgfHwgIXN0cmNtcChidWYsICJtYXhcbiIpKQorCQl2YWx1ZSA9IERRTF9NQVhfTElNSVQ7CisJZWxzZSB7CisJCWVyciA9IGtzdHJ0b3VpbnQoYnVmLCAxMCwgJnZhbHVlKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQlpZiAodmFsdWUgPiBEUUxfTUFYX0xJTUlUKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKnB2YWx1ZSA9IHZhbHVlOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBicWxfc2hvd19ob2xkX3RpbWUoc3RydWN0IG5ldGRldl9xdWV1ZSAqcXVldWUsCisJCQkJICBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkgIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgZHFsICpkcWwgPSAmcXVldWUtPmRxbDsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBqaWZmaWVzX3RvX21zZWNzKGRxbC0+c2xhY2tfaG9sZF90aW1lKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJxbF9zZXRfaG9sZF90aW1lKHN0cnVjdCBuZXRkZXZfcXVldWUgKnF1ZXVlLAorCQkJCSBzdHJ1Y3QgbmV0ZGV2X3F1ZXVlX2F0dHJpYnV0ZSAqYXR0cmlidXRlLAorCQkJCSBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pCit7CisJc3RydWN0IGRxbCAqZHFsID0gJnF1ZXVlLT5kcWw7CisJdW5zaWduZWQgdmFsdWU7CisJaW50IGVycjsKKworCWVyciA9IGtzdHJ0b3VpbnQoYnVmLCAxMCwgJnZhbHVlKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWRxbC0+c2xhY2tfaG9sZF90aW1lID0gbXNlY3NfdG9famlmZmllcyh2YWx1ZSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc3RydWN0IG5ldGRldl9xdWV1ZV9hdHRyaWJ1dGUgYnFsX2hvbGRfdGltZV9hdHRyaWJ1dGUgPQorCV9fQVRUUihob2xkX3RpbWUsIFNfSVJVR08gfCBTX0lXVVNSLCBicWxfc2hvd19ob2xkX3RpbWUsCisJICAgIGJxbF9zZXRfaG9sZF90aW1lKTsKKworc3RhdGljIHNzaXplX3QgYnFsX3Nob3dfaW5mbGlnaHQoc3RydWN0IG5ldGRldl9xdWV1ZSAqcXVldWUsCisJCQkJIHN0cnVjdCBuZXRkZXZfcXVldWVfYXR0cmlidXRlICphdHRyLAorCQkJCSBjaGFyICpidWYpCit7CisJc3RydWN0IGRxbCAqZHFsID0gJnF1ZXVlLT5kcWw7CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgZHFsLT5udW1fcXVldWVkIC0gZHFsLT5udW1fY29tcGxldGVkKTsKK30KKworc3RhdGljIHN0cnVjdCBuZXRkZXZfcXVldWVfYXR0cmlidXRlIGJxbF9pbmZsaWdodF9hdHRyaWJ1dGUgPQorCV9fQVRUUihpbmZsaWdodCwgU19JUlVHTyB8IFNfSVdVU1IsIGJxbF9zaG93X2luZmxpZ2h0LCBOVUxMKTsKKworI2RlZmluZSBCUUxfQVRUUihOQU1FLCBGSUVMRCkJCQkJCQlcCitzdGF0aWMgc3NpemVfdCBicWxfc2hvd18gIyMgTkFNRShzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpxdWV1ZSwJCVwKKwkJCQkgc3RydWN0IG5ldGRldl9xdWV1ZV9hdHRyaWJ1dGUgKmF0dHIsCVwKKwkJCQkgY2hhciAqYnVmKQkJCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBicWxfc2hvdyhidWYsIHF1ZXVlLT5kcWwuRklFTEQpOwkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHNzaXplX3QgYnFsX3NldF8gIyMgTkFNRShzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpxdWV1ZSwJCVwKKwkJCQlzdHJ1Y3QgbmV0ZGV2X3F1ZXVlX2F0dHJpYnV0ZSAqYXR0ciwJXAorCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikJCVwKK3sJCQkJCQkJCQlcCisJcmV0dXJuIGJxbF9zZXQoYnVmLCBsZW4sICZxdWV1ZS0+ZHFsLkZJRUxEKTsJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCBuZXRkZXZfcXVldWVfYXR0cmlidXRlIGJxbF8gIyMgTkFNRSAjIyBfYXR0cmlidXRlID0JXAorCV9fQVRUUihOQU1FLCBTX0lSVUdPIHwgU19JV1VTUiwgYnFsX3Nob3dfICMjIE5BTUUsCQlcCisJICAgIGJxbF9zZXRfICMjIE5BTUUpOworCitCUUxfQVRUUihsaW1pdCwgbGltaXQpCitCUUxfQVRUUihsaW1pdF9tYXgsIG1heF9saW1pdCkKK0JRTF9BVFRSKGxpbWl0X21pbiwgbWluX2xpbWl0KQorCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqZHFsX2F0dHJzW10gPSB7CisJJmJxbF9saW1pdF9hdHRyaWJ1dGUuYXR0ciwKKwkmYnFsX2xpbWl0X21heF9hdHRyaWJ1dGUuYXR0ciwKKwkmYnFsX2xpbWl0X21pbl9hdHRyaWJ1dGUuYXR0ciwKKwkmYnFsX2hvbGRfdGltZV9hdHRyaWJ1dGUuYXR0ciwKKwkmYnFsX2luZmxpZ2h0X2F0dHJpYnV0ZS5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIGRxbF9ncm91cCA9IHsKKwkubmFtZSAgPSAiYnl0ZV9xdWV1ZV9saW1pdHMiLAorCS5hdHRycyAgPSBkcWxfYXR0cnMsCit9OworI2VuZGlmIC8qIENPTkZJR19CUUwgKi8KKworI2lmZGVmIENPTkZJR19YUFMKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGdldF9uZXRkZXZfcXVldWVfaW5kZXgoc3RydWN0IG5ldGRldl9xdWV1ZSAqcXVldWUpCiB7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHF1ZXVlLT5kZXY7CkBAIC04OTAsNiArMTAzNCw1MiBAQAogI2RlZmluZSB4bWFwX2RlcmVmZXJlbmNlKFApCQlcCiAJcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZCgoUCksIGxvY2tkZXBfaXNfaGVsZCgmeHBzX21hcF9tdXRleCkpCiAKK3N0YXRpYyB2b2lkIHhwc19xdWV1ZV9yZWxlYXNlKHN0cnVjdCBuZXRkZXZfcXVldWUgKnF1ZXVlKQoreworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBxdWV1ZS0+ZGV2OworCXN0cnVjdCB4cHNfZGV2X21hcHMgKmRldl9tYXBzOworCXN0cnVjdCB4cHNfbWFwICptYXA7CisJdW5zaWduZWQgbG9uZyBpbmRleDsKKwlpbnQgaSwgcG9zLCBub25lbXB0eSA9IDA7CisKKwlpbmRleCA9IGdldF9uZXRkZXZfcXVldWVfaW5kZXgocXVldWUpOworCisJbXV0ZXhfbG9jaygmeHBzX21hcF9tdXRleCk7CisJZGV2X21hcHMgPSB4bWFwX2RlcmVmZXJlbmNlKGRldi0+eHBzX21hcHMpOworCisJaWYgKGRldl9tYXBzKSB7CisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCQltYXAgPSB4bWFwX2RlcmVmZXJlbmNlKGRldl9tYXBzLT5jcHVfbWFwW2ldKTsKKwkJCWlmICghbWFwKQorCQkJCWNvbnRpbnVlOworCisJCQlmb3IgKHBvcyA9IDA7IHBvcyA8IG1hcC0+bGVuOyBwb3MrKykKKwkJCQlpZiAobWFwLT5xdWV1ZXNbcG9zXSA9PSBpbmRleCkKKwkJCQkJYnJlYWs7CisKKwkJCWlmIChwb3MgPCBtYXAtPmxlbikgeworCQkJCWlmIChtYXAtPmxlbiA+IDEpCisJCQkJCW1hcC0+cXVldWVzW3Bvc10gPQorCQkJCQkgICAgbWFwLT5xdWV1ZXNbLS1tYXAtPmxlbl07CisJCQkJZWxzZSB7CisJCQkJCVJDVV9JTklUX1BPSU5URVIoZGV2X21hcHMtPmNwdV9tYXBbaV0sCisJCQkJCSAgICBOVUxMKTsKKwkJCQkJa2ZyZWVfcmN1KG1hcCwgcmN1KTsKKwkJCQkJbWFwID0gTlVMTDsKKwkJCQl9CisJCQl9CisJCQlpZiAobWFwKQorCQkJCW5vbmVtcHR5ID0gMTsKKwkJfQorCisJCWlmICghbm9uZW1wdHkpIHsKKwkJCVJDVV9JTklUX1BPSU5URVIoZGV2LT54cHNfbWFwcywgTlVMTCk7CisJCQlrZnJlZV9yY3UoZGV2X21hcHMsIHJjdSk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZ4cHNfbWFwX211dGV4KTsKK30KKwogc3RhdGljIHNzaXplX3Qgc3RvcmVfeHBzX21hcChzdHJ1Y3QgbmV0ZGV2X3F1ZXVlICpxdWV1ZSwKIAkJICAgICAgc3RydWN0IG5ldGRldl9xdWV1ZV9hdHRyaWJ1dGUgKmF0dHJpYnV0ZSwKIAkJICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQpAQCAtOTAxLDcgKzEwOTEsNyBAQAogCXN0cnVjdCB4cHNfbWFwICptYXAsICpuZXdfbWFwOwogCXN0cnVjdCB4cHNfZGV2X21hcHMgKmRldl9tYXBzLCAqbmV3X2Rldl9tYXBzOwogCWludCBub25lbXB0eSA9IDA7Ci0JaW50IG51bWFfbm9kZSA9IC0yOworCWludCBudW1hX25vZGVfaWQgPSAtMjsKIAogCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKQEAgLTk0NCwxMCArMTEzNCwxMCBAQAogCQluZWVkX3NldCA9IGNwdW1hc2tfdGVzdF9jcHUoY3B1LCBtYXNrKSAmJiBjcHVfb25saW5lKGNwdSk7CiAjaWZkZWYgQ09ORklHX05VTUEKIAkJaWYgKG5lZWRfc2V0KSB7Ci0JCQlpZiAobnVtYV9ub2RlID09IC0yKQotCQkJCW51bWFfbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7Ci0JCQllbHNlIGlmIChudW1hX25vZGUgIT0gY3B1X3RvX25vZGUoY3B1KSkKLQkJCQludW1hX25vZGUgPSAtMTsKKwkJCWlmIChudW1hX25vZGVfaWQgPT0gLTIpCisJCQkJbnVtYV9ub2RlX2lkID0gY3B1X3RvX25vZGUoY3B1KTsKKwkJCWVsc2UgaWYgKG51bWFfbm9kZV9pZCAhPSBjcHVfdG9fbm9kZShjcHUpKQorCQkJCW51bWFfbm9kZV9pZCA9IC0xOwogCQl9CiAjZW5kaWYKIAkJaWYgKG5lZWRfc2V0ICYmIHBvcyA+PSBtYXBfbGVuKSB7CkBAIC05OTcsNyArMTE4Nyw3IEBACiAJaWYgKGRldl9tYXBzKQogCQlrZnJlZV9yY3UoZGV2X21hcHMsIHJjdSk7CiAKLQluZXRkZXZfcXVldWVfbnVtYV9ub2RlX3dyaXRlKHF1ZXVlLCAobnVtYV9ub2RlID49IDApID8gbnVtYV9ub2RlIDoKKwluZXRkZXZfcXVldWVfbnVtYV9ub2RlX3dyaXRlKHF1ZXVlLCAobnVtYV9ub2RlX2lkID49IDApID8gbnVtYV9ub2RlX2lkIDoKIAkJCQkJICAgIE5VTUFfTk9fTk9ERSk7CiAKIAltdXRleF91bmxvY2soJnhwc19tYXBfbXV0ZXgpOwpAQCAtMTAyMCw1OCArMTIxMCwyMyBAQAogCiBzdGF0aWMgc3RydWN0IG5ldGRldl9xdWV1ZV9hdHRyaWJ1dGUgeHBzX2NwdXNfYXR0cmlidXRlID0KICAgICBfX0FUVFIoeHBzX2NwdXMsIFNfSVJVR08gfCBTX0lXVVNSLCBzaG93X3hwc19tYXAsIHN0b3JlX3hwc19tYXApOworI2VuZGlmIC8qIENPTkZJR19YUFMgKi8KIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKm5ldGRldl9xdWV1ZV9kZWZhdWx0X2F0dHJzW10gPSB7CisJJnF1ZXVlX3RyYW5zX3RpbWVvdXQuYXR0ciwKKyNpZmRlZiBDT05GSUdfWFBTCiAJJnhwc19jcHVzX2F0dHJpYnV0ZS5hdHRyLAorI2VuZGlmCiAJTlVMTAogfTsKIAogc3RhdGljIHZvaWQgbmV0ZGV2X3F1ZXVlX3JlbGVhc2Uoc3RydWN0IGtvYmplY3QgKmtvYmopCiB7CiAJc3RydWN0IG5ldGRldl9xdWV1ZSAqcXVldWUgPSB0b19uZXRkZXZfcXVldWUoa29iaik7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHF1ZXVlLT5kZXY7Ci0Jc3RydWN0IHhwc19kZXZfbWFwcyAqZGV2X21hcHM7Ci0Jc3RydWN0IHhwc19tYXAgKm1hcDsKLQl1bnNpZ25lZCBsb25nIGluZGV4OwotCWludCBpLCBwb3MsIG5vbmVtcHR5ID0gMDsKIAotCWluZGV4ID0gZ2V0X25ldGRldl9xdWV1ZV9pbmRleChxdWV1ZSk7Ci0KLQltdXRleF9sb2NrKCZ4cHNfbWFwX211dGV4KTsKLQlkZXZfbWFwcyA9IHhtYXBfZGVyZWZlcmVuY2UoZGV2LT54cHNfbWFwcyk7Ci0KLQlpZiAoZGV2X21hcHMpIHsKLQkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKLQkJCW1hcCA9IHhtYXBfZGVyZWZlcmVuY2UoZGV2X21hcHMtPmNwdV9tYXBbaV0pOwotCQkJaWYgKCFtYXApCi0JCQkJY29udGludWU7Ci0KLQkJCWZvciAocG9zID0gMDsgcG9zIDwgbWFwLT5sZW47IHBvcysrKQotCQkJCWlmIChtYXAtPnF1ZXVlc1twb3NdID09IGluZGV4KQotCQkJCQlicmVhazsKLQotCQkJaWYgKHBvcyA8IG1hcC0+bGVuKSB7Ci0JCQkJaWYgKG1hcC0+bGVuID4gMSkKLQkJCQkJbWFwLT5xdWV1ZXNbcG9zXSA9Ci0JCQkJCSAgICBtYXAtPnF1ZXVlc1stLW1hcC0+bGVuXTsKLQkJCQllbHNlIHsKLQkJCQkJUkNVX0lOSVRfUE9JTlRFUihkZXZfbWFwcy0+Y3B1X21hcFtpXSwKLQkJCQkJICAgIE5VTEwpOwotCQkJCQlrZnJlZV9yY3UobWFwLCByY3UpOwotCQkJCQltYXAgPSBOVUxMOwotCQkJCX0KLQkJCX0KLQkJCWlmIChtYXApCi0JCQkJbm9uZW1wdHkgPSAxOwotCQl9Ci0KLQkJaWYgKCFub25lbXB0eSkgewotCQkJUkNVX0lOSVRfUE9JTlRFUihkZXYtPnhwc19tYXBzLCBOVUxMKTsKLQkJCWtmcmVlX3JjdShkZXZfbWFwcywgcmN1KTsKLQkJfQotCX0KLQotCW11dGV4X3VubG9jaygmeHBzX21hcF9tdXRleCk7CisjaWZkZWYgQ09ORklHX1hQUworCXhwc19xdWV1ZV9yZWxlYXNlKHF1ZXVlKTsKKyNlbmRpZgogCiAJbWVtc2V0KGtvYmosIDAsIHNpemVvZigqa29iaikpOwogCWRldl9wdXQocXVldWUtPmRldik7CkBAIC0xMDkyLDIyICsxMjQ3LDI5IEBACiAJa29iai0+a3NldCA9IG5ldC0+cXVldWVzX2tzZXQ7CiAJZXJyb3IgPSBrb2JqZWN0X2luaXRfYW5kX2FkZChrb2JqLCAmbmV0ZGV2X3F1ZXVlX2t0eXBlLCBOVUxMLAogCSAgICAidHgtJXUiLCBpbmRleCk7Ci0JaWYgKGVycm9yKSB7Ci0JCWtvYmplY3RfcHV0KGtvYmopOwotCQlyZXR1cm4gZXJyb3I7Ci0JfQorCWlmIChlcnJvcikKKwkJZ290byBleGl0OworCisjaWZkZWYgQ09ORklHX0JRTAorCWVycm9yID0gc3lzZnNfY3JlYXRlX2dyb3VwKGtvYmosICZkcWxfZ3JvdXApOworCWlmIChlcnJvcikKKwkJZ290byBleGl0OworI2VuZGlmCiAKIAlrb2JqZWN0X3VldmVudChrb2JqLCBLT0JKX0FERCk7CiAJZGV2X2hvbGQocXVldWUtPmRldik7CiAKKwlyZXR1cm4gMDsKK2V4aXQ6CisJa29iamVjdF9wdXQoa29iaik7CiAJcmV0dXJuIGVycm9yOwogfQotI2VuZGlmIC8qIENPTkZJR19YUFMgKi8KKyNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KIAogaW50CiBuZXRkZXZfcXVldWVfdXBkYXRlX2tvYmplY3RzKHN0cnVjdCBuZXRfZGV2aWNlICpuZXQsIGludCBvbGRfbnVtLCBpbnQgbmV3X251bSkKIHsKLSNpZmRlZiBDT05GSUdfWFBTCisjaWZkZWYgQ09ORklHX1NZU0ZTCiAJaW50IGk7CiAJaW50IGVycm9yID0gMDsKIApAQCAtMTExOSwyMCArMTI4MSwyNiBAQAogCQl9CiAJfQogCi0Jd2hpbGUgKC0taSA+PSBuZXdfbnVtKQotCQlrb2JqZWN0X3B1dCgmbmV0LT5fdHhbaV0ua29iaik7CisJd2hpbGUgKC0taSA+PSBuZXdfbnVtKSB7CisJCXN0cnVjdCBuZXRkZXZfcXVldWUgKnF1ZXVlID0gbmV0LT5fdHggKyBpOworCisjaWZkZWYgQ09ORklHX0JRTAorCQlzeXNmc19yZW1vdmVfZ3JvdXAoJnF1ZXVlLT5rb2JqLCAmZHFsX2dyb3VwKTsKKyNlbmRpZgorCQlrb2JqZWN0X3B1dCgmcXVldWUtPmtvYmopOworCX0KIAogCXJldHVybiBlcnJvcjsKICNlbHNlCiAJcmV0dXJuIDA7Ci0jZW5kaWYKKyNlbmRpZiAvKiBDT05GSUdfU1lTRlMgKi8KIH0KIAogc3RhdGljIGludCByZWdpc3Rlcl9xdWV1ZV9rb2JqZWN0cyhzdHJ1Y3QgbmV0X2RldmljZSAqbmV0KQogewogCWludCBlcnJvciA9IDAsIHR4cSA9IDAsIHJ4cSA9IDAsIHJlYWxfcnggPSAwLCByZWFsX3R4ID0gMDsKIAotI2lmIGRlZmluZWQoQ09ORklHX1JQUykgfHwgZGVmaW5lZChDT05GSUdfWFBTKQorI2lmZGVmIENPTkZJR19TWVNGUwogCW5ldC0+cXVldWVzX2tzZXQgPSBrc2V0X2NyZWF0ZV9hbmRfYWRkKCJxdWV1ZXMiLAogCSAgICBOVUxMLCAmbmV0LT5kZXYua29iaik7CiAJaWYgKCFuZXQtPnF1ZXVlc19rc2V0KQpAQCAtMTE3Myw3ICsxMzQxLDcgQEAKIAogCW5ldF9yeF9xdWV1ZV91cGRhdGVfa29iamVjdHMobmV0LCByZWFsX3J4LCAwKTsKIAluZXRkZXZfcXVldWVfdXBkYXRlX2tvYmplY3RzKG5ldCwgcmVhbF90eCwgMCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfUlBTKSB8fCBkZWZpbmVkKENPTkZJR19YUFMpCisjaWZkZWYgQ09ORklHX1NZU0ZTCiAJa3NldF91bnJlZ2lzdGVyKG5ldC0+cXVldWVzX2tzZXQpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9uZXQvY29yZS9uZXRwb2xsLmMgYi9uZXQvY29yZS9uZXRwb2xsLmMKaW5kZXggY2Y2NGMxZi4uMGQzODgwOCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvbmV0cG9sbC5jCisrKyBiL25ldC9jb3JlL25ldHBvbGwuYwpAQCAtNzYsNyArNzYsNyBAQAogCiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJX19uZXRpZl90eF9sb2NrKHR4cSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQkJaWYgKG5ldGlmX3R4X3F1ZXVlX2Zyb3plbl9vcl9zdG9wcGVkKHR4cSkgfHwKKwkJaWYgKG5ldGlmX3htaXRfZnJvemVuX29yX3N0b3BwZWQodHhxKSB8fAogCQkgICAgb3BzLT5uZG9fc3RhcnRfeG1pdChza2IsIGRldikgIT0gTkVUREVWX1RYX09LKSB7CiAJCQlza2JfcXVldWVfaGVhZCgmbnBpbmZvLT50eHEsIHNrYik7CiAJCQlfX25ldGlmX3R4X3VubG9jayh0eHEpOwpAQCAtMzE3LDcgKzMxNyw3IEBACiAJCWZvciAodHJpZXMgPSBqaWZmaWVzX3RvX3VzZWNzKDEpL1VTRUNfUEVSX1BPTEw7CiAJCSAgICAgdHJpZXMgPiAwOyAtLXRyaWVzKSB7CiAJCQlpZiAoX19uZXRpZl90eF90cnlsb2NrKHR4cSkpIHsKLQkJCQlpZiAoIW5ldGlmX3R4X3F1ZXVlX3N0b3BwZWQodHhxKSkgeworCQkJCWlmICghbmV0aWZfeG1pdF9zdG9wcGVkKHR4cSkpIHsKIAkJCQkJc3RhdHVzID0gb3BzLT5uZG9fc3RhcnRfeG1pdChza2IsIGRldik7CiAJCQkJCWlmIChzdGF0dXMgPT0gTkVUREVWX1RYX09LKQogCQkJCQkJdHhxX3RyYW5zX3VwZGF0ZSh0eHEpOwpAQCAtNDIyLDYgKzQyMiw3IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNlbmRfc2tiOwogCXN0cnVjdCBuZXRwb2xsICpucCwgKnRtcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBobGVuLCB0bGVuOwogCWludCBoaXRzID0gMDsKIAogCWlmIChsaXN0X2VtcHR5KCZucGluZm8tPnJ4X25wKSkKQEAgLTQ3OSw4ICs0ODAsOSBAQAogCQlpZiAodGlwICE9IG5wLT5sb2NhbF9pcCkKIAkJCWNvbnRpbnVlOwogCi0JCXNlbmRfc2tiID0gZmluZF9za2IobnAsIHNpemUgKyBMTF9BTExPQ0FURURfU1BBQ0UobnAtPmRldiksCi0JCQkJICAgIExMX1JFU0VSVkVEX1NQQUNFKG5wLT5kZXYpKTsKKwkJaGxlbiA9IExMX1JFU0VSVkVEX1NQQUNFKG5wLT5kZXYpOworCQl0bGVuID0gbnAtPmRldi0+bmVlZGVkX3RhaWxyb29tOworCQlzZW5kX3NrYiA9IGZpbmRfc2tiKG5wLCBzaXplICsgaGxlbiArIHRsZW4sIGhsZW4pOwogCQlpZiAoIXNlbmRfc2tiKQogCQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldHByaW9fY2dyb3VwLmMgYi9uZXQvY29yZS9uZXRwcmlvX2Nncm91cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOWZkNDgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvY29yZS9uZXRwcmlvX2Nncm91cC5jCkBAIC0wLDAgKzEsMzQ0IEBACisvKgorICogbmV0L2NvcmUvbmV0cHJpb19jZ3JvdXAuYwlQcmlvcml0eSBDb250cm9sIEdyb3VwCisgKgorICoJCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCQltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJCWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICoJCTIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczoJTmVpbCBIb3JtYW4gPG5ob3JtYW5AdHV4ZHJpdmVyLmNvbT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9jZ3JvdXAuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgorI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvcGt0X2Nscy5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L25ldHByaW9fY2dyb3VwLmg+CisKK3N0YXRpYyBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY2dycF9jcmVhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAorCQkJCQkgICAgICAgc3RydWN0IGNncm91cCAqY2dycCk7CitzdGF0aWMgdm9pZCBjZ3JwX2Rlc3Ryb3koc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLCBzdHJ1Y3QgY2dyb3VwICpjZ3JwKTsKK3N0YXRpYyBpbnQgY2dycF9wb3B1bGF0ZShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnApOworCitzdHJ1Y3QgY2dyb3VwX3N1YnN5cyBuZXRfcHJpb19zdWJzeXMgPSB7CisJLm5hbWUJCT0gIm5ldF9wcmlvIiwKKwkuY3JlYXRlCQk9IGNncnBfY3JlYXRlLAorCS5kZXN0cm95CT0gY2dycF9kZXN0cm95LAorCS5wb3B1bGF0ZQk9IGNncnBfcG9wdWxhdGUsCisjaWZkZWYgQ09ORklHX05FVFBSSU9fQ0dST1VQCisJLnN1YnN5c19pZAk9IG5ldF9wcmlvX3N1YnN5c19pZCwKKyNlbmRpZgorCS5tb2R1bGUJCT0gVEhJU19NT0RVTEUKK307CisKKyNkZWZpbmUgUFJJT0lEWF9TWiAxMjgKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJpb2lkeF9tYXBbUFJJT0lEWF9TWl07CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHByaW9pZHhfbWFwX2xvY2spOworc3RhdGljIGF0b21pY190IG1heF9wcmlvaWR4ID0gQVRPTUlDX0lOSVQoMCk7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGNncm91cF9uZXRwcmlvX3N0YXRlICpjZ3JwX25ldHByaW9fc3RhdGUoc3RydWN0IGNncm91cCAqY2dycCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKGNncm91cF9zdWJzeXNfc3RhdGUoY2dycCwgbmV0X3ByaW9fc3Vic3lzX2lkKSwKKwkJCSAgICBzdHJ1Y3QgY2dyb3VwX25ldHByaW9fc3RhdGUsIGNzcyk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3ByaW9pZHgodTMyICpwcmlvKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHByaW9pZHg7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpb2lkeF9tYXBfbG9jaywgZmxhZ3MpOworCXByaW9pZHggPSBmaW5kX2ZpcnN0X3plcm9fYml0KHByaW9pZHhfbWFwLCBzaXplb2YodW5zaWduZWQgbG9uZykgKiBQUklPSURYX1NaKTsKKwlzZXRfYml0KHByaW9pZHgsIHByaW9pZHhfbWFwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcmlvaWR4X21hcF9sb2NrLCBmbGFncyk7CisJaWYgKHByaW9pZHggPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogUFJJT0lEWF9TWikKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlhdG9taWNfc2V0KCZtYXhfcHJpb2lkeCwgcHJpb2lkeCk7CisJKnByaW8gPSBwcmlvaWR4OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwdXRfcHJpb2lkeCh1MzIgaWR4KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcHJpb2lkeF9tYXBfbG9jaywgZmxhZ3MpOworCWNsZWFyX2JpdChpZHgsIHByaW9pZHhfbWFwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwcmlvaWR4X21hcF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGV4dGVuZF9uZXRkZXZfdGFibGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTMyIG5ld19sZW4pCit7CisJc2l6ZV90IG5ld19zaXplID0gc2l6ZW9mKHN0cnVjdCBuZXRwcmlvX21hcCkgKworCQkJICAgKChzaXplb2YodTMyKSAqIG5ld19sZW4pKTsKKwlzdHJ1Y3QgbmV0cHJpb19tYXAgKm5ld19wcmlvbWFwID0ga3phbGxvYyhuZXdfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJc3RydWN0IG5ldHByaW9fbWFwICpvbGRfcHJpb21hcDsKKwlpbnQgaTsKKworCW9sZF9wcmlvbWFwICA9IHJ0bmxfZGVyZWZlcmVuY2UoZGV2LT5wcmlvbWFwKTsKKworCWlmICghbmV3X3ByaW9tYXApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiVW5hYmxlIHRvIGFsbG9jIG5ldyBwcmlvbWFwIVxuIik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOworCSAgICAgb2xkX3ByaW9tYXAgJiYgKGkgPCBvbGRfcHJpb21hcC0+cHJpb21hcF9sZW4pOworCSAgICAgaSsrKQorCQluZXdfcHJpb21hcC0+cHJpb21hcFtpXSA9IG9sZF9wcmlvbWFwLT5wcmlvbWFwW2ldOworCisJbmV3X3ByaW9tYXAtPnByaW9tYXBfbGVuID0gbmV3X2xlbjsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihkZXYtPnByaW9tYXAsIG5ld19wcmlvbWFwKTsKKwlpZiAob2xkX3ByaW9tYXApCisJCWtmcmVlX3JjdShvbGRfcHJpb21hcCwgcmN1KTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX25ldGRldl90YWJsZXModm9pZCkKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXUzMiBtYXhfbGVuID0gYXRvbWljX3JlYWQoJm1heF9wcmlvaWR4KTsKKwlzdHJ1Y3QgbmV0cHJpb19tYXAgKm1hcDsKKworCXJ0bmxfbG9jaygpOworCWZvcl9lYWNoX25ldGRldigmaW5pdF9uZXQsIGRldikgeworCQltYXAgPSBydG5sX2RlcmVmZXJlbmNlKGRldi0+cHJpb21hcCk7CisJCWlmICgoIW1hcCkgfHwKKwkJICAgIChtYXAtPnByaW9tYXBfbGVuIDwgbWF4X2xlbikpCisJCQlleHRlbmRfbmV0ZGV2X3RhYmxlKGRldiwgbWF4X2xlbik7CisJfQorCXJ0bmxfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY2dycF9jcmVhdGUoc3RydWN0IGNncm91cF9zdWJzeXMgKnNzLAorCQkJCQkJIHN0cnVjdCBjZ3JvdXAgKmNncnApCit7CisJc3RydWN0IGNncm91cF9uZXRwcmlvX3N0YXRlICpjczsKKwlpbnQgcmV0OworCisJY3MgPSBremFsbG9jKHNpemVvZigqY3MpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNzKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWlmIChjZ3JwLT5wYXJlbnQgJiYgY2dycF9uZXRwcmlvX3N0YXRlKGNncnAtPnBhcmVudCktPnByaW9pZHgpIHsKKwkJa2ZyZWUoY3MpOworCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKwl9CisKKwlyZXQgPSBnZXRfcHJpb2lkeCgmY3MtPnByaW9pZHgpOworCWlmIChyZXQgIT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJObyBzcGFjZSBpbiBwcmlvcml0eSBpbmRleCBhcnJheVxuIik7CisJCWtmcmVlKGNzKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0KTsKKwl9CisKKwlyZXR1cm4gJmNzLT5jc3M7Cit9CisKK3N0YXRpYyB2b2lkIGNncnBfZGVzdHJveShzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqc3MsIHN0cnVjdCBjZ3JvdXAgKmNncnApCit7CisJc3RydWN0IGNncm91cF9uZXRwcmlvX3N0YXRlICpjczsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXN0cnVjdCBuZXRwcmlvX21hcCAqbWFwOworCisJY3MgPSBjZ3JwX25ldHByaW9fc3RhdGUoY2dycCk7CisJcnRubF9sb2NrKCk7CisJZm9yX2VhY2hfbmV0ZGV2KCZpbml0X25ldCwgZGV2KSB7CisJCW1hcCA9IHJ0bmxfZGVyZWZlcmVuY2UoZGV2LT5wcmlvbWFwKTsKKwkJaWYgKG1hcCkKKwkJCW1hcC0+cHJpb21hcFtjcy0+cHJpb2lkeF0gPSAwOworCX0KKwlydG5sX3VubG9jaygpOworCXB1dF9wcmlvaWR4KGNzLT5wcmlvaWR4KTsKKwlrZnJlZShjcyk7Cit9CisKK3N0YXRpYyB1NjQgcmVhZF9wcmlvaWR4KHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZnR5cGUgKmNmdCkKK3sKKwlyZXR1cm4gKHU2NCljZ3JwX25ldHByaW9fc3RhdGUoY2dycCktPnByaW9pZHg7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9wcmlvbWFwKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZnR5cGUgKmNmdCwKKwkJCXN0cnVjdCBjZ3JvdXBfbWFwX2NiICpjYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCXUzMiBwcmlvaWR4ID0gY2dycF9uZXRwcmlvX3N0YXRlKGNvbnQpLT5wcmlvaWR4OworCXUzMiBwcmlvcml0eTsKKwlzdHJ1Y3QgbmV0cHJpb19tYXAgKm1hcDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlmb3JfZWFjaF9uZXRkZXZfcmN1KCZpbml0X25ldCwgZGV2KSB7CisJCW1hcCA9IHJjdV9kZXJlZmVyZW5jZShkZXYtPnByaW9tYXApOworCQlwcmlvcml0eSA9IG1hcCA/IG1hcC0+cHJpb21hcFtwcmlvaWR4XSA6IDA7CisJCWNiLT5maWxsKGNiLCBkZXYtPm5hbWUsIHByaW9yaXR5KTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd3JpdGVfcHJpb21hcChzdHJ1Y3QgY2dyb3VwICpjZ3JwLCBzdHJ1Y3QgY2Z0eXBlICpjZnQsCisJCQkgY29uc3QgY2hhciAqYnVmZmVyKQoreworCWNoYXIgKmRldm5hbWUgPSBrc3RyZHVwKGJ1ZmZlciwgR0ZQX0tFUk5FTCk7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdTMyIHByaW9pZHggPSBjZ3JwX25ldHByaW9fc3RhdGUoY2dycCktPnByaW9pZHg7CisJdW5zaWduZWQgbG9uZyBwcmlvcml0eTsKKwljaGFyICpwcmlvc3RyOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CisJc3RydWN0IG5ldHByaW9fbWFwICptYXA7CisKKwlpZiAoIWRldm5hbWUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBNaW5pbWFsbHkgc2l6ZWQgdmFsaWQgcHJpb21hcCBzdHJpbmcKKwkgKi8KKwlpZiAoc3RybGVuKGRldm5hbWUpIDwgMykKKwkJZ290byBvdXRfZnJlZV9kZXZuYW1lOworCisJcHJpb3N0ciA9IHN0cnN0cihkZXZuYW1lLCAiICIpOworCWlmICghcHJpb3N0cikKKwkJZ290byBvdXRfZnJlZV9kZXZuYW1lOworCisJLyoKKwkgKlNlcGFyYXRlIHRoZSBkZXZuYW1lIGZyb20gdGhlIGFzc29jaWF0ZWQgcHJpb3JpdHkKKwkgKmFuZCBhZHZhbmNlIHRoZSBwcmlvc3RyIHBvaXRuZXIgdG8gdGhlIHByaW9yaXR5IHZhbHVlCisJICovCisJKnByaW9zdHIgPSAnXDAnOworCXByaW9zdHIrKzsKKworCS8qCisJICogSWYgdGhlIHByaW9zdHIgcG9pbnRzIHRvIE5VTEwsIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIHBhc3NlZAorCSAqIGluIHN0cmluZywgYW5kIGl0cyBub3QgYSB2YWxpZCB3cml0ZQorCSAqLworCWlmICgqcHJpb3N0ciA9PSAnXDAnKQorCQlnb3RvIG91dF9mcmVlX2Rldm5hbWU7CisKKwlyZXQgPSBrc3RydG91bChwcmlvc3RyLCAxMCwgJnByaW9yaXR5KTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBvdXRfZnJlZV9kZXZuYW1lOworCisJcmV0ID0gLUVOT0RFVjsKKworCWRldiA9IGRldl9nZXRfYnlfbmFtZSgmaW5pdF9uZXQsIGRldm5hbWUpOworCWlmICghZGV2KQorCQlnb3RvIG91dF9mcmVlX2Rldm5hbWU7CisKKwl1cGRhdGVfbmV0ZGV2X3RhYmxlcygpOworCXJldCA9IDA7CisJcmN1X3JlYWRfbG9jaygpOworCW1hcCA9IHJjdV9kZXJlZmVyZW5jZShkZXYtPnByaW9tYXApOworCWlmIChtYXApCisJCW1hcC0+cHJpb21hcFtwcmlvaWR4XSA9IHByaW9yaXR5OworCXJjdV9yZWFkX3VubG9jaygpOworCWRldl9wdXQoZGV2KTsKKworb3V0X2ZyZWVfZGV2bmFtZToKKwlrZnJlZShkZXZuYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGNmdHlwZSBzc19maWxlc1tdID0geworCXsKKwkJLm5hbWUgPSAicHJpb2lkeCIsCisJCS5yZWFkX3U2NCA9IHJlYWRfcHJpb2lkeCwKKwl9LAorCXsKKwkJLm5hbWUgPSAiaWZwcmlvbWFwIiwKKwkJLnJlYWRfbWFwID0gcmVhZF9wcmlvbWFwLAorCQkud3JpdGVfc3RyaW5nID0gd3JpdGVfcHJpb21hcCwKKwl9LAorfTsKKworc3RhdGljIGludCBjZ3JwX3BvcHVsYXRlKHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcywgc3RydWN0IGNncm91cCAqY2dycCkKK3sKKwlyZXR1cm4gY2dyb3VwX2FkZF9maWxlcyhjZ3JwLCBzcywgc3NfZmlsZXMsIEFSUkFZX1NJWkUoc3NfZmlsZXMpKTsKK30KKworc3RhdGljIGludCBuZXRwcmlvX2RldmljZV9ldmVudChzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnVudXNlZCwKKwkJCQl1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKKwlzdHJ1Y3QgbmV0cHJpb19tYXAgKm9sZDsKKwl1MzIgbWF4X2xlbiA9IGF0b21pY19yZWFkKCZtYXhfcHJpb2lkeCk7CisKKwkvKgorCSAqIE5vdGUgdGhpcyBpcyBjYWxsZWQgd2l0aCBydG5sX2xvY2sgaGVsZCBzbyB3ZSBoYXZlIHVwZGF0ZSBzaWRlCisJICogcHJvdGVjdGlvbiBvbiBvdXIgcmN1IGFzc2lnbm1lbnRzCisJICovCisKKwlzd2l0Y2ggKGV2ZW50KSB7CisKKwljYXNlIE5FVERFVl9SRUdJU1RFUjoKKwkJaWYgKG1heF9sZW4pCisJCQlleHRlbmRfbmV0ZGV2X3RhYmxlKGRldiwgbWF4X2xlbik7CisJCWJyZWFrOworCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCW9sZCA9IHJ0bmxfZGVyZWZlcmVuY2UoZGV2LT5wcmlvbWFwKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihkZXYtPnByaW9tYXAsIE5VTEwpOworCQlpZiAob2xkKQorCQkJa2ZyZWVfcmN1KG9sZCwgcmN1KTsKKwkJYnJlYWs7CisJfQorCXJldHVybiBOT1RJRllfRE9ORTsKK30KKworc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBuZXRwcmlvX2RldmljZV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IG5ldHByaW9fZGV2aWNlX2V2ZW50Cit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2Nncm91cF9uZXRwcmlvKHZvaWQpCit7CisJaW50IHJldDsKKworCXJldCA9IGNncm91cF9sb2FkX3N1YnN5cygmbmV0X3ByaW9fc3Vic3lzKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKyNpZm5kZWYgQ09ORklHX05FVFBSSU9fQ0dST1VQCisJc21wX3dtYigpOworCW5ldF9wcmlvX3N1YnN5c19pZCA9IG5ldF9wcmlvX3N1YnN5cy5zdWJzeXNfaWQ7CisjZW5kaWYKKworCXJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmbmV0cHJpb19kZXZpY2Vfbm90aWZpZXIpOworCitvdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGV4aXRfY2dyb3VwX25ldHByaW8odm9pZCkKK3sKKwlzdHJ1Y3QgbmV0cHJpb19tYXAgKm9sZDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm5ldHByaW9fZGV2aWNlX25vdGlmaWVyKTsKKworCWNncm91cF91bmxvYWRfc3Vic3lzKCZuZXRfcHJpb19zdWJzeXMpOworCisjaWZuZGVmIENPTkZJR19ORVRQUklPX0NHUk9VUAorCW5ldF9wcmlvX3N1YnN5c19pZCA9IC0xOworCXN5bmNocm9uaXplX3JjdSgpOworI2VuZGlmCisKKwlydG5sX2xvY2soKTsKKwlmb3JfZWFjaF9uZXRkZXYoJmluaXRfbmV0LCBkZXYpIHsKKwkJb2xkID0gcnRubF9kZXJlZmVyZW5jZShkZXYtPnByaW9tYXApOworCQlSQ1VfSU5JVF9QT0lOVEVSKGRldi0+cHJpb21hcCwgTlVMTCk7CisJCWlmIChvbGQpCisJCQlrZnJlZV9yY3Uob2xkLCByY3UpOworCX0KKwlydG5sX3VubG9jaygpOworfQorCittb2R1bGVfaW5pdChpbml0X2Nncm91cF9uZXRwcmlvKTsKK21vZHVsZV9leGl0KGV4aXRfY2dyb3VwX25ldHByaW8pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwpkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvcGt0Z2VuLmMgYi9uZXQvY29yZS9wa3RnZW4uYwppbmRleCAwMDAxYzI0Li40NDlmZTBmIDEwMDY0NAotLS0gYS9uZXQvY29yZS9wa3RnZW4uYworKysgYi9uZXQvY29yZS9wa3RnZW4uYwpAQCAtMTMwNCw3ICsxMzA0LDcgQEAKIAkJc2Nhbl9pcDYoYnVmLCBwa3RfZGV2LT5pbjZfZGFkZHIuczZfYWRkcik7CiAJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcEk2YyIsICZwa3RfZGV2LT5pbjZfZGFkZHIpOwogCi0JCWlwdjZfYWRkcl9jb3B5KCZwa3RfZGV2LT5jdXJfaW42X2RhZGRyLCAmcGt0X2Rldi0+aW42X2RhZGRyKTsKKwkJcGt0X2Rldi0+Y3VyX2luNl9kYWRkciA9IHBrdF9kZXYtPmluNl9kYWRkcjsKIAogCQlpZiAoZGVidWcpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAicGt0Z2VuOiBkc3Q2IHNldCB0bzogJXNcbiIsIGJ1Zik7CkBAIC0xMzI3LDggKzEzMjcsNyBAQAogCQlzY2FuX2lwNihidWYsIHBrdF9kZXYtPm1pbl9pbjZfZGFkZHIuczZfYWRkcik7CiAJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlcEk2YyIsICZwa3RfZGV2LT5taW5faW42X2RhZGRyKTsKIAotCQlpcHY2X2FkZHJfY29weSgmcGt0X2Rldi0+Y3VyX2luNl9kYWRkciwKLQkJCSAgICAgICAmcGt0X2Rldi0+bWluX2luNl9kYWRkcik7CisJCXBrdF9kZXYtPmN1cl9pbjZfZGFkZHIgPSBwa3RfZGV2LT5taW5faW42X2RhZGRyOwogCQlpZiAoZGVidWcpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAicGt0Z2VuOiBkc3Q2X21pbiBzZXQgdG86ICVzXG4iLCBidWYpOwogCkBAIC0xMzcxLDcgKzEzNzAsNyBAQAogCQlzY2FuX2lwNihidWYsIHBrdF9kZXYtPmluNl9zYWRkci5zNl9hZGRyKTsKIAkJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiVwSTZjIiwgJnBrdF9kZXYtPmluNl9zYWRkcik7CiAKLQkJaXB2Nl9hZGRyX2NvcHkoJnBrdF9kZXYtPmN1cl9pbjZfc2FkZHIsICZwa3RfZGV2LT5pbjZfc2FkZHIpOworCQlwa3RfZGV2LT5jdXJfaW42X3NhZGRyID0gcGt0X2Rldi0+aW42X3NhZGRyOwogCiAJCWlmIChkZWJ1ZykKIAkJCXByaW50ayhLRVJOX0RFQlVHICJwa3RnZW46IHNyYzYgc2V0IHRvOiAlc1xuIiwgYnVmKTsKQEAgLTIwNzksOSArMjA3OCw3IEBACiAJCQkJICAgICBpZnAgPSBpZnAtPmlmX25leHQpIHsKIAkJCQkJaWYgKGlmcC0+c2NvcGUgPT0gSUZBX0xJTksgJiYKIAkJCQkJICAgICEoaWZwLT5mbGFncyAmIElGQV9GX1RFTlRBVElWRSkpIHsKLQkJCQkJCWlwdjZfYWRkcl9jb3B5KCZwa3RfZGV2LT4KLQkJCQkJCQkgICAgICAgY3VyX2luNl9zYWRkciwKLQkJCQkJCQkgICAgICAgJmlmcC0+YWRkcik7CisJCQkJCQlwa3RfZGV2LT5jdXJfaW42X3NhZGRyID0gaWZwLT5hZGRyOwogCQkJCQkJZXJyID0gMDsKIAkJCQkJCWJyZWFrOwogCQkJCQl9CkBAIC0yOTU4LDggKzI5NTUsOCBAQAogCWlwaC0+cGF5bG9hZF9sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBkYXRhbGVuKTsKIAlpcGgtPm5leHRoZHIgPSBJUFBST1RPX1VEUDsKIAotCWlwdjZfYWRkcl9jb3B5KCZpcGgtPmRhZGRyLCAmcGt0X2Rldi0+Y3VyX2luNl9kYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwaC0+c2FkZHIsICZwa3RfZGV2LT5jdXJfaW42X3NhZGRyKTsKKwlpcGgtPmRhZGRyID0gcGt0X2Rldi0+Y3VyX2luNl9kYWRkcjsKKwlpcGgtPnNhZGRyID0gcGt0X2Rldi0+Y3VyX2luNl9zYWRkcjsKIAogCXNrYi0+bWFjX2hlYWRlciA9IChza2ItPm5ldHdvcmtfaGVhZGVyIC0gRVRIX0hMRU4gLQogCQkJICAgcGt0X2Rldi0+cGt0X292ZXJoZWFkKTsKQEAgLTMzNDUsNyArMzM0Miw3IEBACiAKIAlfX25ldGlmX3R4X2xvY2tfYmgodHhxKTsKIAotCWlmICh1bmxpa2VseShuZXRpZl90eF9xdWV1ZV9mcm96ZW5fb3Jfc3RvcHBlZCh0eHEpKSkgeworCWlmICh1bmxpa2VseShuZXRpZl94bWl0X2Zyb3plbl9vcl9zdG9wcGVkKHR4cSkpKSB7CiAJCXJldCA9IE5FVERFVl9UWF9CVVNZOwogCQlwa3RfZGV2LT5sYXN0X29rID0gMDsKIAkJZ290byB1bmxvY2s7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9yZXF1ZXN0X3NvY2suYyBiL25ldC9jb3JlL3JlcXVlc3Rfc29jay5jCmluZGV4IDE4MjIzNmIuLjliNTcwYTYgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3JlcXVlc3Rfc29jay5jCisrKyBiL25ldC9jb3JlL3JlcXVlc3Rfc29jay5jCkBAIC0yNiwxMCArMjYsMTEgQEAKICAqIGJ1dCB0aGVuIHNvbWUgbWVhc3VyZSBhZ2FpbnN0IG9uZSBzb2NrZXQgc3RhcnZpbmcgYWxsIG90aGVyIHNvY2tldHMKICAqIHdvdWxkIGJlIG5lZWRlZC4KICAqCi0gKiBJdCB3YXMgMTI4IGJ5IGRlZmF1bHQuIEV4cGVyaW1lbnRzIHdpdGggcmVhbCBzZXJ2ZXJzIHNob3csIHRoYXQKKyAqIFRoZSBtaW5pbXVtIHZhbHVlIG9mIGl0IGlzIDEyOC4gRXhwZXJpbWVudHMgd2l0aCByZWFsIHNlcnZlcnMgc2hvdyB0aGF0CiAgKiBpdCBpcyBhYnNvbHV0ZWx5IG5vdCBlbm91Z2ggZXZlbiBhdCAxMDBjb25uL3NlYy4gMjU2IGN1cmVzIG1vc3QKLSAqIG9mIHByb2JsZW1zLiBUaGlzIHZhbHVlIGlzIGFkanVzdGVkIHRvIDEyOCBmb3IgdmVyeSBzbWFsbCBtYWNoaW5lcwotICogKDw9MzJNYiBvZiBtZW1vcnkpIGFuZCB0byAxMDI0IG9uIG5vcm1hbCBvciBiZXR0ZXIgb25lcyAoPj0yNTZNYikuCisgKiBvZiBwcm9ibGVtcy4KKyAqIFRoaXMgdmFsdWUgaXMgYWRqdXN0ZWQgdG8gMTI4IGZvciBsb3cgbWVtb3J5IG1hY2hpbmVzLAorICogYW5kIGl0IHdpbGwgaW5jcmVhc2UgaW4gcHJvcG9ydGlvbiB0byB0aGUgbWVtb3J5IG9mIG1hY2hpbmUuCiAgKiBOb3RlIDogRG9udCBmb3JnZXQgc29tYXhjb25uIHRoYXQgbWF5IGxpbWl0IGJhY2tsb2cgdG9vLgogICovCiBpbnQgc3lzY3RsX21heF9zeW5fYmFja2xvZyA9IDI1NjsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3J0bmV0bGluay5jIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKaW5kZXggOTA4M2U4Mi4uZGJmMmRkYSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvcnRuZXRsaW5rLmMKKysrIGIvbmV0L2NvcmUvcnRuZXRsaW5rLmMKQEAgLTI3Myw2ICsyNzMsMTcgQEAKIAogc3RhdGljIExJU1RfSEVBRChsaW5rX29wcyk7CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnRubF9saW5rX29wcyAqcnRubF9saW5rX29wc19nZXQoY29uc3QgY2hhciAqa2luZCkKK3sKKwljb25zdCBzdHJ1Y3QgcnRubF9saW5rX29wcyAqb3BzOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShvcHMsICZsaW5rX29wcywgbGlzdCkgeworCQlpZiAoIXN0cmNtcChvcHMtPmtpbmQsIGtpbmQpKQorCQkJcmV0dXJuIG9wczsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKIC8qKgogICogX19ydG5sX2xpbmtfcmVnaXN0ZXIgLSBSZWdpc3RlciBydG5sX2xpbmtfb3BzIHdpdGggcnRuZXRsaW5rLgogICogQG9wczogc3RydWN0IHJ0bmxfbGlua19vcHMgKiB0byByZWdpc3RlcgpAQCAtMjg1LDYgKzI5Niw5IEBACiAgKi8KIGludCBfX3J0bmxfbGlua19yZWdpc3RlcihzdHJ1Y3QgcnRubF9saW5rX29wcyAqb3BzKQogeworCWlmIChydG5sX2xpbmtfb3BzX2dldChvcHMtPmtpbmQpKQorCQlyZXR1cm4gLUVFWElTVDsKKwogCWlmICghb3BzLT5kZWxsaW5rKQogCQlvcHMtPmRlbGxpbmsgPSB1bnJlZ2lzdGVyX25ldGRldmljZV9xdWV1ZTsKIApAQCAtMzUxLDE3ICszNjUsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocnRubF9saW5rX3VucmVnaXN0ZXIpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IHJ0bmxfbGlua19vcHMgKnJ0bmxfbGlua19vcHNfZ2V0KGNvbnN0IGNoYXIgKmtpbmQpCi17Ci0JY29uc3Qgc3RydWN0IHJ0bmxfbGlua19vcHMgKm9wczsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnkob3BzLCAmbGlua19vcHMsIGxpc3QpIHsKLQkJaWYgKCFzdHJjbXAob3BzLT5raW5kLCBraW5kKSkKLQkJCXJldHVybiBvcHM7Ci0JfQotCXJldHVybiBOVUxMOwotfQotCiBzdGF0aWMgc2l6ZV90IHJ0bmxfbGlua19nZXRfc2l6ZShjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewogCWNvbnN0IHN0cnVjdCBydG5sX2xpbmtfb3BzICpvcHMgPSBkZXYtPnJ0bmxfbGlua19vcHM7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9zZWN1cmVfc2VxLmMgYi9uZXQvY29yZS9zZWN1cmVfc2VxLmMKaW5kZXggMDI1MjMzZC4uNmZkNDQ2MCAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2VjdXJlX3NlcS5jCisrKyBiL25ldC9jb3JlL3NlY3VyZV9zZXEuYwpAQCAtMTksNiArMTksNyBAQAogfQogbGF0ZV9pbml0Y2FsbChuZXRfc2VjcmV0X2luaXQpOwogCisjaWZkZWYgQ09ORklHX0lORVQKIHN0YXRpYyB1MzIgc2VxX3NjYWxlKHUzMiBzZXEpCiB7CiAJLyoKQEAgLTMzLDggKzM0LDkgQEAKIAkgKi8KIAlyZXR1cm4gc2VxICsgKGt0aW1lX3RvX25zKGt0aW1lX2dldF9yZWFsKCkpID4+IDYpOwogfQorI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogX191MzIgc2VjdXJlX3RjcHY2X3NlcXVlbmNlX251bWJlcihjb25zdCBfX2JlMzIgKnNhZGRyLCBjb25zdCBfX2JlMzIgKmRhZGRyLAogCQkJCSAgIF9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0KQogewpAQCAtMTMyLDcgKzEzNCw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChzZWN1cmVfaXB2NF9wb3J0X2VwaGVtZXJhbCk7CiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0lQX0RDQ1ApIHx8IGRlZmluZWQoQ09ORklHX0lQX0RDQ1BfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQX0RDQ1ApCiB1NjQgc2VjdXJlX2RjY3Bfc2VxdWVuY2VfbnVtYmVyKF9fYmUzMiBzYWRkciwgX19iZTMyIGRhZGRyLAogCQkJCV9fYmUxNiBzcG9ydCwgX19iZTE2IGRwb3J0KQogewpAQCAtMTU0LDcgKzE1Niw3IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNlY3VyZV9kY2NwX3NlcXVlbmNlX251bWJlcik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogdTY0IHNlY3VyZV9kY2NwdjZfc2VxdWVuY2VfbnVtYmVyKF9fYmUzMiAqc2FkZHIsIF9fYmUzMiAqZGFkZHIsCiAJCQkJICBfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCkKIHsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL3NrYnVmZi5jIGIvbmV0L2NvcmUvc2tidWZmLmMKaW5kZXggMThhM2NlYi4uZGEwYzk3ZiAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvc2tidWZmLmMKKysrIGIvbmV0L2NvcmUvc2tidWZmLmMKQEAgLTI0NSw2ICsyNDUsNTUgQEAKIEVYUE9SVF9TWU1CT0woX19hbGxvY19za2IpOwogCiAvKioKKyAqIGJ1aWxkX3NrYiAtIGJ1aWxkIGEgbmV0d29yayBidWZmZXIKKyAqIEBkYXRhOiBkYXRhIGJ1ZmZlciBwcm92aWRlZCBieSBjYWxsZXIKKyAqCisgKiBBbGxvY2F0ZSBhIG5ldyAmc2tfYnVmZi4gQ2FsbGVyIHByb3ZpZGVzIHNwYWNlIGhvbGRpbmcgaGVhZCBhbmQKKyAqIHNrYl9zaGFyZWRfaW5mby4gQGRhdGEgbXVzdCBoYXZlIGJlZW4gYWxsb2NhdGVkIGJ5IGttYWxsb2MoKQorICogVGhlIHJldHVybiBpcyB0aGUgbmV3IHNrYiBidWZmZXIuCisgKiBPbiBhIGZhaWx1cmUgdGhlIHJldHVybiBpcyAlTlVMTCwgYW5kIEBkYXRhIGlzIG5vdCBmcmVlZC4KKyAqIE5vdGVzIDoKKyAqICBCZWZvcmUgSU8sIGRyaXZlciBhbGxvY2F0ZXMgb25seSBkYXRhIGJ1ZmZlciB3aGVyZSBOSUMgcHV0IGluY29taW5nIGZyYW1lCisgKiAgRHJpdmVyIHNob3VsZCBhZGQgcm9vbSBhdCBoZWFkIChORVRfU0tCX1BBRCkgYW5kCisgKiAgTVVTVCBhZGQgcm9vbSBhdCB0YWlsIChTS0JfREFUQV9BTElHTihza2Jfc2hhcmVkX2luZm8pKQorICogIEFmdGVyIElPLCBkcml2ZXIgY2FsbHMgYnVpbGRfc2tiKCksIHRvIGFsbG9jYXRlIHNrX2J1ZmYgYW5kIHBvcHVsYXRlIGl0CisgKiAgYmVmb3JlIGdpdmluZyBwYWNrZXQgdG8gc3RhY2suCisgKiAgUlggcmluZ3Mgb25seSBjb250YWlucyBkYXRhIGJ1ZmZlcnMsIG5vdCBmdWxsIHNrYnMuCisgKi8KK3N0cnVjdCBza19idWZmICpidWlsZF9za2Iodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvICpzaGluZm87CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCXNrYiA9IGttZW1fY2FjaGVfYWxsb2Moc2tidWZmX2hlYWRfY2FjaGUsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlyZXR1cm4gTlVMTDsKKworCXNpemUgPSBrc2l6ZShkYXRhKSAtIFNLQl9EQVRBX0FMSUdOKHNpemVvZihzdHJ1Y3Qgc2tiX3NoYXJlZF9pbmZvKSk7CisKKwltZW1zZXQoc2tiLCAwLCBvZmZzZXRvZihzdHJ1Y3Qgc2tfYnVmZiwgdGFpbCkpOworCXNrYi0+dHJ1ZXNpemUgPSBTS0JfVFJVRVNJWkUoc2l6ZSk7CisJYXRvbWljX3NldCgmc2tiLT51c2VycywgMSk7CisJc2tiLT5oZWFkID0gZGF0YTsKKwlza2ItPmRhdGEgPSBkYXRhOworCXNrYl9yZXNldF90YWlsX3BvaW50ZXIoc2tiKTsKKwlza2ItPmVuZCA9IHNrYi0+dGFpbCArIHNpemU7CisjaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCisJc2tiLT5tYWNfaGVhZGVyID0gfjBVOworI2VuZGlmCisKKwkvKiBtYWtlIHN1cmUgd2UgaW5pdGlhbGl6ZSBzaGluZm8gc2VxdWVudGlhbGx5ICovCisJc2hpbmZvID0gc2tiX3NoaW5mbyhza2IpOworCW1lbXNldChzaGluZm8sIDAsIG9mZnNldG9mKHN0cnVjdCBza2Jfc2hhcmVkX2luZm8sIGRhdGFyZWYpKTsKKwlhdG9taWNfc2V0KCZzaGluZm8tPmRhdGFyZWYsIDEpOworCWttZW1jaGVja19hbm5vdGF0ZV92YXJpYWJsZShzaGluZm8tPmRlc3RydWN0b3JfYXJnKTsKKworCXJldHVybiBza2I7Cit9CitFWFBPUlRfU1lNQk9MKGJ1aWxkX3NrYik7CisKKy8qKgogICoJX19uZXRkZXZfYWxsb2Nfc2tiIC0gYWxsb2NhdGUgYW4gc2tidWZmIGZvciByeCBvbiBhIHNwZWNpZmljIGRldmljZQogICoJQGRldjogbmV0d29yayBkZXZpY2UgdG8gcmVjZWl2ZSBvbgogICoJQGxlbmd0aDogbGVuZ3RoIHRvIGFsbG9jYXRlCkBAIC00MDMsNyArNDUyLDcgQEAKIAkJV0FSTl9PTihpbl9pcnEoKSk7CiAJCXNrYi0+ZGVzdHJ1Y3Rvcihza2IpOwogCX0KLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLKQogCW5mX2Nvbm50cmFja19wdXQoc2tiLT5uZmN0KTsKICNlbmRpZgogI2lmZGVmIE5FVF9TS0JVRkZfTkZfREVGUkFHX05FRURFRApAQCAtNTUzLDE1ICs2MDIsMTQgQEAKIAluZXctPmlwX3N1bW1lZAkJPSBvbGQtPmlwX3N1bW1lZDsKIAlza2JfY29weV9xdWV1ZV9tYXBwaW5nKG5ldywgb2xkKTsKIAluZXctPnByaW9yaXR5CQk9IG9sZC0+cHJpb3JpdHk7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBfVlMpIHx8IGRlZmluZWQoQ09ORklHX0lQX1ZTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUF9WUykKIAluZXctPmlwdnNfcHJvcGVydHkJPSBvbGQtPmlwdnNfcHJvcGVydHk7CiAjZW5kaWYKIAluZXctPnByb3RvY29sCQk9IG9sZC0+cHJvdG9jb2w7CiAJbmV3LT5tYXJrCQk9IG9sZC0+bWFyazsKIAluZXctPnNrYl9paWYJCT0gb2xkLT5za2JfaWlmOwogCV9fbmZfY29weShuZXcsIG9sZCk7Ci0jaWYgZGVmaW5lZChDT05GSUdfTkVURklMVEVSX1hUX1RBUkdFVF9UUkFDRSkgfHwgXAotICAgIGRlZmluZWQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0VfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05FVEZJTFRFUl9YVF9UQVJHRVRfVFJBQ0UpCiAJbmV3LT5uZl90cmFjZQkJPSBvbGQtPm5mX3RyYWNlOwogI2VuZGlmCiAjaWZkZWYgQ09ORklHX05FVF9TQ0hFRApAQCAtNzkxLDggKzgzOSw5IEBACiBFWFBPUlRfU1lNQk9MKHNrYl9jb3B5KTsKIAogLyoqCi0gKglwc2tiX2NvcHkJLQljcmVhdGUgY29weSBvZiBhbiBza19idWZmIHdpdGggcHJpdmF0ZSBoZWFkLgorICoJX19wc2tiX2NvcHkJLQljcmVhdGUgY29weSBvZiBhbiBza19idWZmIHdpdGggcHJpdmF0ZSBoZWFkLgogICoJQHNrYjogYnVmZmVyIHRvIGNvcHkKKyAqCUBoZWFkcm9vbTogaGVhZHJvb20gb2YgbmV3IHNrYgogICoJQGdmcF9tYXNrOiBhbGxvY2F0aW9uIHByaW9yaXR5CiAgKgogICoJTWFrZSBhIGNvcHkgb2YgYm90aCBhbiAmc2tfYnVmZiBhbmQgcGFydCBvZiBpdHMgZGF0YSwgbG9jYXRlZApAQCAtODAzLDE2ICs4NTIsMTYgQEAKICAqCVRoZSByZXR1cm5lZCBidWZmZXIgaGFzIGEgcmVmZXJlbmNlIGNvdW50IG9mIDEuCiAgKi8KIAotc3RydWN0IHNrX2J1ZmYgKnBza2JfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBnZnBfdCBnZnBfbWFzaykKK3N0cnVjdCBza19idWZmICpfX3Bza2JfY29weShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgaGVhZHJvb20sIGdmcF90IGdmcF9tYXNrKQogewotCXVuc2lnbmVkIGludCBzaXplID0gc2tiX2VuZF9wb2ludGVyKHNrYikgLSBza2ItPmhlYWQ7CisJdW5zaWduZWQgaW50IHNpemUgPSBza2JfaGVhZGxlbihza2IpICsgaGVhZHJvb207CiAJc3RydWN0IHNrX2J1ZmYgKm4gPSBhbGxvY19za2Ioc2l6ZSwgZ2ZwX21hc2spOwogCiAJaWYgKCFuKQogCQlnb3RvIG91dDsKIAogCS8qIFNldCB0aGUgZGF0YSBwb2ludGVyICovCi0Jc2tiX3Jlc2VydmUobiwgc2tiX2hlYWRyb29tKHNrYikpOworCXNrYl9yZXNlcnZlKG4sIGhlYWRyb29tKTsKIAkvKiBTZXQgdGhlIHRhaWwgcG9pbnRlciBhbmQgbGVuZ3RoICovCiAJc2tiX3B1dChuLCBza2JfaGVhZGxlbihza2IpKTsKIAkvKiBDb3B5IHRoZSBieXRlcyAqLwpAQCAtODQ4LDcgKzg5Nyw3IEBACiBvdXQ6CiAJcmV0dXJuIG47CiB9Ci1FWFBPUlRfU1lNQk9MKHBza2JfY29weSk7CitFWFBPUlRfU1lNQk9MKF9fcHNrYl9jb3B5KTsKIAogLyoqCiAgKglwc2tiX2V4cGFuZF9oZWFkIC0gcmVhbGxvY2F0ZSBoZWFkZXIgb2YgJnNrX2J1ZmYKQEAgLTIyMzAsNyArMjI3OSw3IEBACiAgKiBAc2hpZnRsZW46IHNoaWZ0IHVwIHRvIHRoaXMgbWFueSBieXRlcwogICoKICAqIEF0dGVtcHRzIHRvIHNoaWZ0IHVwIHRvIHNoaWZ0bGVuIHdvcnRoIG9mIGJ5dGVzLCB3aGljaCBtYXkgYmUgbGVzcyB0aGFuCi0gKiB0aGUgbGVuZ3RoIG9mIHRoZSBza2IsIGZyb20gdGd0IHRvIHNrYi4gUmV0dXJucyBudW1iZXIgYnl0ZXMgc2hpZnRlZC4KKyAqIHRoZSBsZW5ndGggb2YgdGhlIHNrYiwgZnJvbSBza2IgdG8gdGd0LiBSZXR1cm5zIG51bWJlciBieXRlcyBzaGlmdGVkLgogICogSXQncyB1cCB0byBjYWxsZXIgdG8gZnJlZSBza2IgaWYgZXZlcnl0aGluZyB3YXMgc2hpZnRlZC4KICAqCiAgKiBJZiBAdGd0IHJ1bnMgb3V0IG9mIGZyYWdzLCB0aGUgd2hvbGUgb3BlcmF0aW9uIGlzIGFib3J0ZWQuCkBAIC0yNjIxLDcgKzI2NzAsNyBAQAogICoJYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBpbiBhIGxpc3Qgb2YgbmV3IHNrYnMgZm9yIHRoZSBzZWdtZW50cy4KICAqCUluIGNhc2Ugb2YgZXJyb3IgaXQgcmV0dXJucyBFUlJfUFRSKGVycikuCiAgKi8KLXN0cnVjdCBza19idWZmICpza2Jfc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZmVhdHVyZXMpCitzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgbmV0ZGV2X2ZlYXR1cmVzX3QgZmVhdHVyZXMpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNlZ3MgPSBOVUxMOwogCXN0cnVjdCBza19idWZmICp0YWlsID0gTlVMTDsKQEAgLTMxNjksNiArMzIxOCwyNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc2tiX3RzdGFtcF90eCk7CiAKK3ZvaWQgc2tiX2NvbXBsZXRlX3dpZmlfYWNrKHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgYWNrZWQpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKKwlzdHJ1Y3Qgc29ja19leHRlcnJfc2tiICpzZXJyOworCWludCBlcnI7CisKKwlza2ItPndpZmlfYWNrZWRfdmFsaWQgPSAxOworCXNrYi0+d2lmaV9hY2tlZCA9IGFja2VkOworCisJc2VyciA9IFNLQl9FWFRfRVJSKHNrYik7CisJbWVtc2V0KHNlcnIsIDAsIHNpemVvZigqc2VycikpOworCXNlcnItPmVlLmVlX2Vycm5vID0gRU5PTVNHOworCXNlcnItPmVlLmVlX29yaWdpbiA9IFNPX0VFX09SSUdJTl9UWFNUQVRVUzsKKworCWVyciA9IHNvY2tfcXVldWVfZXJyX3NrYihzaywgc2tiKTsKKwlpZiAoZXJyKQorCQlrZnJlZV9za2Ioc2tiKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNrYl9jb21wbGV0ZV93aWZpX2Fjayk7CisKIAogLyoqCiAgKiBza2JfcGFydGlhbF9jc3VtX3NldCAtIHNldCB1cCBhbmQgdmVyaWZ5IHBhcnRpYWwgY3N1bSB2YWx1ZXMgZm9yIHBhY2tldApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc29jay5jIGIvbmV0L2NvcmUvc29jay5jCmluZGV4IDRlZDdiMWQuLjAwMjkzOWMgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NvY2suYworKysgYi9uZXQvY29yZS9zb2NrLmMKQEAgLTExMSw2ICsxMTEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvdXNlcl9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9qdW1wX2xhYmVsLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KQEAgLTEyNSw2ICsxMjYsNyBAQAogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAjaW5jbHVkZSA8bGludXgvaXBzZWMuaD4KICNpbmNsdWRlIDxuZXQvY2xzX2Nncm91cC5oPgorI2luY2x1ZGUgPG5ldC9uZXRwcmlvX2Nncm91cC5oPgogCiAjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CiAKQEAgLTEzNCw2ICsxMzYsNDYgQEAKICNpbmNsdWRlIDxuZXQvdGNwLmg+CiAjZW5kaWYKIAorc3RhdGljIERFRklORV9NVVRFWChwcm90b19saXN0X211dGV4KTsKK3N0YXRpYyBMSVNUX0hFQUQocHJvdG9fbGlzdCk7CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9LTUVNCitpbnQgbWVtX2Nncm91cF9zb2NrZXRzX2luaXQoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKQoreworCXN0cnVjdCBwcm90byAqcHJvdG87CisJaW50IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZwcm90b19saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHByb3RvLCAmcHJvdG9fbGlzdCwgbm9kZSkgeworCQlpZiAocHJvdG8tPmluaXRfY2dyb3VwKSB7CisJCQlyZXQgPSBwcm90by0+aW5pdF9jZ3JvdXAoY2dycCwgc3MpOworCQkJaWYgKHJldCkKKwkJCQlnb3RvIG91dDsKKwkJfQorCX0KKworCW11dGV4X3VubG9jaygmcHJvdG9fbGlzdF9tdXRleCk7CisJcmV0dXJuIHJldDsKK291dDoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlX3JldmVyc2UocHJvdG8sICZwcm90b19saXN0LCBub2RlKQorCQlpZiAocHJvdG8tPmRlc3Ryb3lfY2dyb3VwKQorCQkJcHJvdG8tPmRlc3Ryb3lfY2dyb3VwKGNncnAsIHNzKTsKKwltdXRleF91bmxvY2soJnByb3RvX2xpc3RfbXV0ZXgpOworCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgbWVtX2Nncm91cF9zb2NrZXRzX2Rlc3Ryb3koc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKQoreworCXN0cnVjdCBwcm90byAqcHJvdG87CisKKwltdXRleF9sb2NrKCZwcm90b19saXN0X211dGV4KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UocHJvdG8sICZwcm90b19saXN0LCBub2RlKQorCQlpZiAocHJvdG8tPmRlc3Ryb3lfY2dyb3VwKQorCQkJcHJvdG8tPmRlc3Ryb3lfY2dyb3VwKGNncnAsIHNzKTsKKwltdXRleF91bmxvY2soJnByb3RvX2xpc3RfbXV0ZXgpOworfQorI2VuZGlmCisKIC8qCiAgKiBFYWNoIGFkZHJlc3MgZmFtaWx5IG1pZ2h0IGhhdmUgZGlmZmVyZW50IGxvY2tpbmcgcnVsZXMsIHNvIHdlIGhhdmUKICAqIG9uZSBzbG9jayBrZXkgcGVyIGFkZHJlc3MgZmFtaWx5OgpAQCAtMTQxLDYgKzE4Myw5IEBACiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGFmX2ZhbWlseV9rZXlzW0FGX01BWF07CiBzdGF0aWMgc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGFmX2ZhbWlseV9zbG9ja19rZXlzW0FGX01BWF07CiAKK3N0cnVjdCBqdW1wX2xhYmVsX2tleSBtZW1jZ19zb2NrZXRfbGltaXRfZW5hYmxlZDsKK0VYUE9SVF9TWU1CT0wobWVtY2dfc29ja2V0X2xpbWl0X2VuYWJsZWQpOworCiAvKgogICogTWFrZSBsb2NrIHZhbGlkYXRvciBvdXRwdXQgbW9yZSByZWFkYWJsZS4gKHdlIHByZS1jb25zdHJ1Y3QgdGhlc2UKICAqIHN0cmluZ3MgYnVpbGQtdGltZSwgc28gdGhhdCBydW50aW1lIGluaXRpYWxpemF0aW9uIG9mIHNvY2tldApAQCAtMjIxLDEwICsyNjYsMTYgQEAKIGludCBzeXNjdGxfb3B0bWVtX21heCBfX3JlYWRfbW9zdGx5ID0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKigyKlVJT19NQVhJT1YrNTEyKTsKIEVYUE9SVF9TWU1CT0woc3lzY3RsX29wdG1lbV9tYXgpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQ0dST1VQUykgJiYgIWRlZmluZWQoQ09ORklHX05FVF9DTFNfQ0dST1VQKQorI2lmIGRlZmluZWQoQ09ORklHX0NHUk9VUFMpCisjaWYgIWRlZmluZWQoQ09ORklHX05FVF9DTFNfQ0dST1VQKQogaW50IG5ldF9jbHNfc3Vic3lzX2lkID0gLTE7CiBFWFBPUlRfU1lNQk9MX0dQTChuZXRfY2xzX3N1YnN5c19pZCk7CiAjZW5kaWYKKyNpZiAhZGVmaW5lZChDT05GSUdfTkVUUFJJT19DR1JPVVApCitpbnQgbmV0X3ByaW9fc3Vic3lzX2lkID0gLTE7CitFWFBPUlRfU1lNQk9MX0dQTChuZXRfcHJpb19zdWJzeXNfaWQpOworI2VuZGlmCisjZW5kaWYKIAogc3RhdGljIGludCBzb2NrX3NldF90aW1lb3V0KGxvbmcgKnRpbWVvX3AsIGNoYXIgX191c2VyICpvcHR2YWwsIGludCBvcHRsZW4pCiB7CkBAIC0yNjksMTQgKzMyMCwxNCBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgc29ja19kaXNhYmxlX3RpbWVzdGFtcChzdHJ1Y3Qgc29jayAqc2ssIGludCBmbGFnKQorI2RlZmluZSBTS19GTEFHU19USU1FU1RBTVAgKCgxVUwgPDwgU09DS19USU1FU1RBTVApIHwgKDFVTCA8PCBTT0NLX1RJTUVTVEFNUElOR19SWF9TT0ZUV0FSRSkpCisKK3N0YXRpYyB2b2lkIHNvY2tfZGlzYWJsZV90aW1lc3RhbXAoc3RydWN0IHNvY2sgKnNrLCB1bnNpZ25lZCBsb25nIGZsYWdzKQogewotCWlmIChzb2NrX2ZsYWcoc2ssIGZsYWcpKSB7Ci0JCXNvY2tfcmVzZXRfZmxhZyhzaywgZmxhZyk7Ci0JCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1RJTUVTVEFNUCkgJiYKLQkJICAgICFzb2NrX2ZsYWcoc2ssIFNPQ0tfVElNRVNUQU1QSU5HX1JYX1NPRlRXQVJFKSkgeworCWlmIChzay0+c2tfZmxhZ3MgJiBmbGFncykgeworCQlzay0+c2tfZmxhZ3MgJj0gfmZsYWdzOworCQlpZiAoIShzay0+c2tfZmxhZ3MgJiBTS19GTEFHU19USU1FU1RBTVApKQogCQkJbmV0X2Rpc2FibGVfdGltZXN0YW1wKCk7Ci0JCX0KIAl9CiB9CiAKQEAgLTI4OCwxMSArMzM5LDcgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QgPSAmc2stPnNrX3JlY2VpdmVfcXVldWU7CiAKLQkvKiBDYXN0IHNrLT5yY3ZidWYgdG8gdW5zaWduZWQuLi4gSXQncyBwb2ludGxlc3MsIGJ1dCByZWR1Y2VzCi0JICAgbnVtYmVyIG9mIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggLVcgLS1BTksKLQkgKi8KLQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSArIHNrYi0+dHJ1ZXNpemUgPj0KLQkgICAgKHVuc2lnbmVkKXNrLT5za19yY3ZidWYpIHsKKwlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA+PSBzay0+c2tfcmN2YnVmKSB7CiAJCWF0b21pY19pbmMoJnNrLT5za19kcm9wcyk7CiAJCXRyYWNlX3NvY2tfcmN2cXVldWVfZnVsbChzaywgc2tiKTsKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC02ODIsNyArNzI5LDcgQEAKIAkJCQkJICAgICAgU09DS19USU1FU1RBTVBJTkdfUlhfU09GVFdBUkUpOwogCQllbHNlCiAJCQlzb2NrX2Rpc2FibGVfdGltZXN0YW1wKHNrLAotCQkJCQkgICAgICAgU09DS19USU1FU1RBTVBJTkdfUlhfU09GVFdBUkUpOworCQkJCQkgICAgICAgKDFVTCA8PCBTT0NLX1RJTUVTVEFNUElOR19SWF9TT0ZUV0FSRSkpOwogCQlzb2NrX3ZhbGJvb2xfZmxhZyhzaywgU09DS19USU1FU1RBTVBJTkdfU09GVFdBUkUsCiAJCQkJICB2YWwgJiBTT0ZfVElNRVNUQU1QSU5HX1NPRlRXQVJFKTsKIAkJc29ja192YWxib29sX2ZsYWcoc2ssIFNPQ0tfVElNRVNUQU1QSU5HX1NZU19IQVJEV0FSRSwKQEAgLTc0MCw2ICs3ODcsMTEgQEAKIAljYXNlIFNPX1JYUV9PVkZMOgogCQlzb2NrX3ZhbGJvb2xfZmxhZyhzaywgU09DS19SWFFfT1ZGTCwgdmFsYm9vbCk7CiAJCWJyZWFrOworCisJY2FzZSBTT19XSUZJX1NUQVRVUzoKKwkJc29ja192YWxib29sX2ZsYWcoc2ssIFNPQ0tfV0lGSV9TVEFUVVMsIHZhbGJvb2wpOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FTk9QUk9UT09QVDsKIAkJYnJlYWs7CkBAIC05NjEsNiArMTAxMywxMCBAQAogCQl2LnZhbCA9ICEhc29ja19mbGFnKHNrLCBTT0NLX1JYUV9PVkZMKTsKIAkJYnJlYWs7CiAKKwljYXNlIFNPX1dJRklfU1RBVFVTOgorCQl2LnZhbCA9ICEhc29ja19mbGFnKHNrLCBTT0NLX1dJRklfU1RBVFVTKTsKKwkJYnJlYWs7CisKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KQEAgLTExMTEsNiArMTE2NywxOCBAQAogCQlzay0+c2tfY2xhc3NpZCA9IGNsYXNzaWQ7CiB9CiBFWFBPUlRfU1lNQk9MKHNvY2tfdXBkYXRlX2NsYXNzaWQpOworCit2b2lkIHNvY2tfdXBkYXRlX25ldHByaW9pZHgoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBjZ3JvdXBfbmV0cHJpb19zdGF0ZSAqc3RhdGU7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CisJcmN1X3JlYWRfbG9jaygpOworCXN0YXRlID0gdGFza19uZXRwcmlvX3N0YXRlKGN1cnJlbnQpOworCXNrLT5za19jZ3JwX3ByaW9pZHggPSBzdGF0ZSA/IHN0YXRlLT5wcmlvaWR4IDogMDsKKwlyY3VfcmVhZF91bmxvY2soKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNvY2tfdXBkYXRlX25ldHByaW9pZHgpOwogI2VuZGlmCiAKIC8qKgpAQCAtMTEzOCw2ICsxMjA2LDcgQEAKIAkJYXRvbWljX3NldCgmc2stPnNrX3dtZW1fYWxsb2MsIDEpOwogCiAJCXNvY2tfdXBkYXRlX2NsYXNzaWQoc2spOworCQlzb2NrX3VwZGF0ZV9uZXRwcmlvaWR4KHNrKTsKIAl9CiAKIAlyZXR1cm4gc2s7CkBAIC0xMTU4LDggKzEyMjcsNyBAQAogCQlSQ1VfSU5JVF9QT0lOVEVSKHNrLT5za19maWx0ZXIsIE5VTEwpOwogCX0KIAotCXNvY2tfZGlzYWJsZV90aW1lc3RhbXAoc2ssIFNPQ0tfVElNRVNUQU1QKTsKLQlzb2NrX2Rpc2FibGVfdGltZXN0YW1wKHNrLCBTT0NLX1RJTUVTVEFNUElOR19SWF9TT0ZUV0FSRSk7CisJc29ja19kaXNhYmxlX3RpbWVzdGFtcChzaywgU0tfRkxBR1NfVElNRVNUQU1QKTsKIAogCWlmIChhdG9taWNfcmVhZCgmc2stPnNrX29tZW1fYWxsb2MpKQogCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IG9wdG1lbSBsZWFrYWdlICglZCBieXRlcykgZGV0ZWN0ZWQuXG4iLApAQCAtMTIwNCw3ICsxMjcyLDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNrX3JlbGVhc2Vfa2VybmVsKTsKIAotc3RydWN0IHNvY2sgKnNrX2Nsb25lKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3QgZ2ZwX3QgcHJpb3JpdHkpCisvKioKKyAqCXNrX2Nsb25lX2xvY2sgLSBjbG9uZSBhIHNvY2tldCwgYW5kIGxvY2sgaXRzIGNsb25lCisgKglAc2s6IHRoZSBzb2NrZXQgdG8gY2xvbmUKKyAqCUBwcmlvcml0eTogZm9yIGFsbG9jYXRpb24gKCVHRlBfS0VSTkVMLCAlR0ZQX0FUT01JQywgZXRjKQorICoKKyAqCUNhbGxlciBtdXN0IHVubG9jayBzb2NrZXQgZXZlbiBpbiBlcnJvciBwYXRoIChiaF91bmxvY2tfc29jayhuZXdzaykpCisgKi8KK3N0cnVjdCBzb2NrICpza19jbG9uZV9sb2NrKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgY29uc3QgZ2ZwX3QgcHJpb3JpdHkpCiB7CiAJc3RydWN0IHNvY2sgKm5ld3NrOwogCkBAIC0xMjg4LDE2ICsxMzYzLDE1IEBACiAJCW5ld3NrLT5za193cSA9IE5VTEw7CiAKIAkJaWYgKG5ld3NrLT5za19wcm90LT5zb2NrZXRzX2FsbG9jYXRlZCkKLQkJCXBlcmNwdV9jb3VudGVyX2luYyhuZXdzay0+c2tfcHJvdC0+c29ja2V0c19hbGxvY2F0ZWQpOworCQkJc2tfc29ja2V0c19hbGxvY2F0ZWRfaW5jKG5ld3NrKTsKIAotCQlpZiAoc29ja19mbGFnKG5ld3NrLCBTT0NLX1RJTUVTVEFNUCkgfHwKLQkJICAgIHNvY2tfZmxhZyhuZXdzaywgU09DS19USU1FU1RBTVBJTkdfUlhfU09GVFdBUkUpKQorCQlpZiAobmV3c2stPnNrX2ZsYWdzICYgU0tfRkxBR1NfVElNRVNUQU1QKQogCQkJbmV0X2VuYWJsZV90aW1lc3RhbXAoKTsKIAl9CiBvdXQ6CiAJcmV0dXJuIG5ld3NrOwogfQotRVhQT1JUX1NZTUJPTF9HUEwoc2tfY2xvbmUpOworRVhQT1JUX1NZTUJPTF9HUEwoc2tfY2xvbmVfbG9jayk7CiAKIHZvaWQgc2tfc2V0dXBfY2FwcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKQEAgLTE2NzcsMzAgKzE3NTEsMzQgQEAKIAlzdHJ1Y3QgcHJvdG8gKnByb3QgPSBzay0+c2tfcHJvdDsKIAlpbnQgYW10ID0gc2tfbWVtX3BhZ2VzKHNpemUpOwogCWxvbmcgYWxsb2NhdGVkOworCWludCBwYXJlbnRfc3RhdHVzID0gVU5ERVJfTElNSVQ7CiAKIAlzay0+c2tfZm9yd2FyZF9hbGxvYyArPSBhbXQgKiBTS19NRU1fUVVBTlRVTTsKLQlhbGxvY2F0ZWQgPSBhdG9taWNfbG9uZ19hZGRfcmV0dXJuKGFtdCwgcHJvdC0+bWVtb3J5X2FsbG9jYXRlZCk7CisKKwlhbGxvY2F0ZWQgPSBza19tZW1vcnlfYWxsb2NhdGVkX2FkZChzaywgYW10LCAmcGFyZW50X3N0YXR1cyk7CiAKIAkvKiBVbmRlciBsaW1pdC4gKi8KLQlpZiAoYWxsb2NhdGVkIDw9IHByb3QtPnN5c2N0bF9tZW1bMF0pIHsKLQkJaWYgKHByb3QtPm1lbW9yeV9wcmVzc3VyZSAmJiAqcHJvdC0+bWVtb3J5X3ByZXNzdXJlKQotCQkJKnByb3QtPm1lbW9yeV9wcmVzc3VyZSA9IDA7CisJaWYgKHBhcmVudF9zdGF0dXMgPT0gVU5ERVJfTElNSVQgJiYKKwkJCWFsbG9jYXRlZCA8PSBza19wcm90X21lbV9saW1pdHMoc2ssIDApKSB7CisJCXNrX2xlYXZlX21lbW9yeV9wcmVzc3VyZShzayk7CiAJCXJldHVybiAxOwogCX0KIAotCS8qIFVuZGVyIHByZXNzdXJlLiAqLwotCWlmIChhbGxvY2F0ZWQgPiBwcm90LT5zeXNjdGxfbWVtWzFdKQotCQlpZiAocHJvdC0+ZW50ZXJfbWVtb3J5X3ByZXNzdXJlKQotCQkJcHJvdC0+ZW50ZXJfbWVtb3J5X3ByZXNzdXJlKHNrKTsKKwkvKiBVbmRlciBwcmVzc3VyZS4gKHdlIG9yIG91ciBwYXJlbnRzKSAqLworCWlmICgocGFyZW50X3N0YXR1cyA+IFNPRlRfTElNSVQpIHx8CisJCQlhbGxvY2F0ZWQgPiBza19wcm90X21lbV9saW1pdHMoc2ssIDEpKQorCQlza19lbnRlcl9tZW1vcnlfcHJlc3N1cmUoc2spOwogCi0JLyogT3ZlciBoYXJkIGxpbWl0LiAqLwotCWlmIChhbGxvY2F0ZWQgPiBwcm90LT5zeXNjdGxfbWVtWzJdKQorCS8qIE92ZXIgaGFyZCBsaW1pdCAod2Ugb3Igb3VyIHBhcmVudHMpICovCisJaWYgKChwYXJlbnRfc3RhdHVzID09IE9WRVJfTElNSVQpIHx8CisJCQkoYWxsb2NhdGVkID4gc2tfcHJvdF9tZW1fbGltaXRzKHNrLCAyKSkpCiAJCWdvdG8gc3VwcHJlc3NfYWxsb2NhdGlvbjsKIAogCS8qIGd1YXJhbnRlZSBtaW5pbXVtIGJ1ZmZlciBzaXplIHVuZGVyIHByZXNzdXJlICovCiAJaWYgKGtpbmQgPT0gU0tfTUVNX1JFQ1YpIHsKIAkJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPCBwcm90LT5zeXNjdGxfcm1lbVswXSkKIAkJCXJldHVybiAxOworCiAJfSBlbHNlIHsgLyogU0tfTUVNX1NFTkQgKi8KIAkJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNKSB7CiAJCQlpZiAoc2stPnNrX3dtZW1fcXVldWVkIDwgcHJvdC0+c3lzY3RsX3dtZW1bMF0pCkBAIC0xNzEwLDEzICsxNzg4LDEzIEBACiAJCQkJcmV0dXJuIDE7CiAJfQogCi0JaWYgKHByb3QtPm1lbW9yeV9wcmVzc3VyZSkgeworCWlmIChza19oYXNfbWVtb3J5X3ByZXNzdXJlKHNrKSkgewogCQlpbnQgYWxsb2M7CiAKLQkJaWYgKCEqcHJvdC0+bWVtb3J5X3ByZXNzdXJlKQorCQlpZiAoIXNrX3VuZGVyX21lbW9yeV9wcmVzc3VyZShzaykpCiAJCQlyZXR1cm4gMTsKLQkJYWxsb2MgPSBwZXJjcHVfY291bnRlcl9yZWFkX3Bvc2l0aXZlKHByb3QtPnNvY2tldHNfYWxsb2NhdGVkKTsKLQkJaWYgKHByb3QtPnN5c2N0bF9tZW1bMl0gPiBhbGxvYyAqCisJCWFsbG9jID0gc2tfc29ja2V0c19hbGxvY2F0ZWRfcmVhZF9wb3NpdGl2ZShzayk7CisJCWlmIChza19wcm90X21lbV9saW1pdHMoc2ssIDIpID4gYWxsb2MgKgogCQkgICAgc2tfbWVtX3BhZ2VzKHNrLT5za193bWVtX3F1ZXVlZCArCiAJCQkJIGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgKwogCQkJCSBzay0+c2tfZm9yd2FyZF9hbGxvYykpCkBAIC0xNzM5LDcgKzE4MTcsOSBAQAogCiAJLyogQWxhcy4gVW5kbyBjaGFuZ2VzLiAqLwogCXNrLT5za19mb3J3YXJkX2FsbG9jIC09IGFtdCAqIFNLX01FTV9RVUFOVFVNOwotCWF0b21pY19sb25nX3N1YihhbXQsIHByb3QtPm1lbW9yeV9hbGxvY2F0ZWQpOworCisJc2tfbWVtb3J5X2FsbG9jYXRlZF9zdWIoc2ssIGFtdCwgcGFyZW50X3N0YXR1cyk7CisKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woX19za19tZW1fc2NoZWR1bGUpOwpAQCAtMTc1MCwxNSArMTgzMCwxMyBAQAogICovCiB2b2lkIF9fc2tfbWVtX3JlY2xhaW0oc3RydWN0IHNvY2sgKnNrKQogewotCXN0cnVjdCBwcm90byAqcHJvdCA9IHNrLT5za19wcm90OwotCi0JYXRvbWljX2xvbmdfc3ViKHNrLT5za19mb3J3YXJkX2FsbG9jID4+IFNLX01FTV9RVUFOVFVNX1NISUZULAotCQkgICBwcm90LT5tZW1vcnlfYWxsb2NhdGVkKTsKKwlza19tZW1vcnlfYWxsb2NhdGVkX3N1YihzaywKKwkJCQlzay0+c2tfZm9yd2FyZF9hbGxvYyA+PiBTS19NRU1fUVVBTlRVTV9TSElGVCwgMCk7CiAJc2stPnNrX2ZvcndhcmRfYWxsb2MgJj0gU0tfTUVNX1FVQU5UVU0gLSAxOwogCi0JaWYgKHByb3QtPm1lbW9yeV9wcmVzc3VyZSAmJiAqcHJvdC0+bWVtb3J5X3ByZXNzdXJlICYmCi0JICAgIChhdG9taWNfbG9uZ19yZWFkKHByb3QtPm1lbW9yeV9hbGxvY2F0ZWQpIDwgcHJvdC0+c3lzY3RsX21lbVswXSkpCi0JCSpwcm90LT5tZW1vcnlfcHJlc3N1cmUgPSAwOworCWlmIChza191bmRlcl9tZW1vcnlfcHJlc3N1cmUoc2spICYmCisJICAgIChza19tZW1vcnlfYWxsb2NhdGVkKHNrKSA8IHNrX3Byb3RfbWVtX2xpbWl0cyhzaywgMCkpKQorCQlza19sZWF2ZV9tZW1vcnlfcHJlc3N1cmUoc2spOwogfQogRVhQT1JUX1NZTUJPTChfX3NrX21lbV9yZWNsYWltKTsKIApAQCAtMjEyOSwxNiArMjIwNywxNSBAQAogdm9pZCBzb2NrX2VuYWJsZV90aW1lc3RhbXAoc3RydWN0IHNvY2sgKnNrLCBpbnQgZmxhZykKIHsKIAlpZiAoIXNvY2tfZmxhZyhzaywgZmxhZykpIHsKKwkJdW5zaWduZWQgbG9uZyBwcmV2aW91c19mbGFncyA9IHNrLT5za19mbGFnczsKKwogCQlzb2NrX3NldF9mbGFnKHNrLCBmbGFnKTsKIAkJLyoKIAkJICogd2UganVzdCBzZXQgb25lIG9mIHRoZSB0d28gZmxhZ3Mgd2hpY2ggcmVxdWlyZSBuZXQKIAkJICogdGltZSBzdGFtcGluZywgYnV0IHRpbWUgc3RhbXBpbmcgbWlnaHQgaGF2ZSBiZWVuIG9uCiAJCSAqIGFscmVhZHkgYmVjYXVzZSBvZiB0aGUgb3RoZXIgb25lCiAJCSAqLwotCQlpZiAoIXNvY2tfZmxhZyhzaywKLQkJCQlmbGFnID09IFNPQ0tfVElNRVNUQU1QID8KLQkJCQlTT0NLX1RJTUVTVEFNUElOR19SWF9TT0ZUV0FSRSA6Ci0JCQkJU09DS19USU1FU1RBTVApKQorCQlpZiAoIShwcmV2aW91c19mbGFncyAmIFNLX0ZMQUdTX1RJTUVTVEFNUCkpCiAJCQluZXRfZW5hYmxlX3RpbWVzdGFtcCgpOwogCX0KIH0KQEAgLTIyNTAsOSArMjMyNyw2IEBACiB9CiBFWFBPUlRfU1lNQk9MKHNrX2NvbW1vbl9yZWxlYXNlKTsKIAotc3RhdGljIERFRklORV9SV0xPQ0socHJvdG9fbGlzdF9sb2NrKTsKLXN0YXRpYyBMSVNUX0hFQUQocHJvdG9fbGlzdCk7Ci0KICNpZmRlZiBDT05GSUdfUFJPQ19GUwogI2RlZmluZSBQUk9UT19JTlVTRV9OUgk2NAkvKiBzaG91bGQgYmUgZW5vdWdoIGZvciB0aGUgZmlyc3QgdGltZSAqLwogc3RydWN0IHByb3RfaW51c2UgewpAQCAtMjQwMSwxMCArMjQ3NSwxMCBAQAogCQl9CiAJfQogCi0Jd3JpdGVfbG9jaygmcHJvdG9fbGlzdF9sb2NrKTsKKwltdXRleF9sb2NrKCZwcm90b19saXN0X211dGV4KTsKIAlsaXN0X2FkZCgmcHJvdC0+bm9kZSwgJnByb3RvX2xpc3QpOwogCWFzc2lnbl9wcm90b19pZHgocHJvdCk7Ci0Jd3JpdGVfdW5sb2NrKCZwcm90b19saXN0X2xvY2spOworCW11dGV4X3VubG9jaygmcHJvdG9fbGlzdF9tdXRleCk7CiAJcmV0dXJuIDA7CiAKIG91dF9mcmVlX3RpbWV3YWl0X3NvY2tfc2xhYl9uYW1lOgpAQCAtMjQyNywxMCArMjUwMSwxMCBAQAogCiB2b2lkIHByb3RvX3VucmVnaXN0ZXIoc3RydWN0IHByb3RvICpwcm90KQogewotCXdyaXRlX2xvY2soJnByb3RvX2xpc3RfbG9jayk7CisJbXV0ZXhfbG9jaygmcHJvdG9fbGlzdF9tdXRleCk7CiAJcmVsZWFzZV9wcm90b19pZHgocHJvdCk7CiAJbGlzdF9kZWwoJnByb3QtPm5vZGUpOwotCXdyaXRlX3VubG9jaygmcHJvdG9fbGlzdF9sb2NrKTsKKwltdXRleF91bmxvY2soJnByb3RvX2xpc3RfbXV0ZXgpOwogCiAJaWYgKHByb3QtPnNsYWIgIT0gTlVMTCkgewogCQlrbWVtX2NhY2hlX2Rlc3Ryb3kocHJvdC0+c2xhYik7CkBAIC0yNDUzLDkgKzI1MjcsOSBAQAogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKIHN0YXRpYyB2b2lkICpwcm90b19zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCAqcG9zKQotCV9fYWNxdWlyZXMocHJvdG9fbGlzdF9sb2NrKQorCV9fYWNxdWlyZXMocHJvdG9fbGlzdF9tdXRleCkKIHsKLQlyZWFkX2xvY2soJnByb3RvX2xpc3RfbG9jayk7CisJbXV0ZXhfbG9jaygmcHJvdG9fbGlzdF9tdXRleCk7CiAJcmV0dXJuIHNlcV9saXN0X3N0YXJ0X2hlYWQoJnByb3RvX2xpc3QsICpwb3MpOwogfQogCkBAIC0yNDY1LDI1ICsyNTM5LDM2IEBACiB9CiAKIHN0YXRpYyB2b2lkIHByb3RvX3NlcV9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KQotCV9fcmVsZWFzZXMocHJvdG9fbGlzdF9sb2NrKQorCV9fcmVsZWFzZXMocHJvdG9fbGlzdF9tdXRleCkKIHsKLQlyZWFkX3VubG9jaygmcHJvdG9fbGlzdF9sb2NrKTsKKwltdXRleF91bmxvY2soJnByb3RvX2xpc3RfbXV0ZXgpOwogfQogCiBzdGF0aWMgY2hhciBwcm90b19tZXRob2RfaW1wbGVtZW50ZWQoY29uc3Qgdm9pZCAqbWV0aG9kKQogewogCXJldHVybiBtZXRob2QgPT0gTlVMTCA/ICduJyA6ICd5JzsKIH0KK3N0YXRpYyBsb25nIHNvY2tfcHJvdF9tZW1vcnlfYWxsb2NhdGVkKHN0cnVjdCBwcm90byAqcHJvdG8pCit7CisJcmV0dXJuIHByb3RvLT5tZW1vcnlfYWxsb2NhdGVkICE9IE5VTEwgPyBwcm90b19tZW1vcnlfYWxsb2NhdGVkKHByb3RvKTogLTFMOworfQorCitzdGF0aWMgY2hhciAqc29ja19wcm90X21lbW9yeV9wcmVzc3VyZShzdHJ1Y3QgcHJvdG8gKnByb3RvKQoreworCXJldHVybiBwcm90by0+bWVtb3J5X3ByZXNzdXJlICE9IE5VTEwgPworCXByb3RvX21lbW9yeV9wcmVzc3VyZShwcm90bykgPyAieWVzIiA6ICJubyIgOiAiTkkiOworfQogCiBzdGF0aWMgdm9pZCBwcm90b19zZXFfcHJpbnRmKHN0cnVjdCBzZXFfZmlsZSAqc2VxLCBzdHJ1Y3QgcHJvdG8gKnByb3RvKQogeworCiAJc2VxX3ByaW50ZihzZXEsICIlLTlzICU0dSAlNmQgICU2bGQgICAlLTNzICU2dSAgICUtM3MgICUtMTBzICIKIAkJCSIlMmMgJTJjICUyYyAlMmMgJTJjICUyYyAlMmMgJTJjICUyYyAlMmMgJTJjICUyYyAlMmMgJTJjICUyYyAlMmMgJTJjICUyYyAlMmNcbiIsCiAJCSAgIHByb3RvLT5uYW1lLAogCQkgICBwcm90by0+b2JqX3NpemUsCiAJCSAgIHNvY2tfcHJvdF9pbnVzZV9nZXQoc2VxX2ZpbGVfbmV0KHNlcSksIHByb3RvKSwKLQkJICAgcHJvdG8tPm1lbW9yeV9hbGxvY2F0ZWQgIT0gTlVMTCA/IGF0b21pY19sb25nX3JlYWQocHJvdG8tPm1lbW9yeV9hbGxvY2F0ZWQpIDogLTFMLAotCQkgICBwcm90by0+bWVtb3J5X3ByZXNzdXJlICE9IE5VTEwgPyAqcHJvdG8tPm1lbW9yeV9wcmVzc3VyZSA/ICJ5ZXMiIDogIm5vIiA6ICJOSSIsCisJCSAgIHNvY2tfcHJvdF9tZW1vcnlfYWxsb2NhdGVkKHByb3RvKSwKKwkJICAgc29ja19wcm90X21lbW9yeV9wcmVzc3VyZShwcm90byksCiAJCSAgIHByb3RvLT5tYXhfaGVhZGVyLAogCQkgICBwcm90by0+c2xhYiA9PSBOVUxMID8gIm5vIiA6ICJ5ZXMiLAogCQkgICBtb2R1bGVfbmFtZShwcm90by0+b3duZXIpLApkaWZmIC0tZ2l0IGEvbmV0L2NvcmUvc29ja19kaWFnLmMgYi9uZXQvY29yZS9zb2NrX2RpYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTg2OGUxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L2NvcmUvc29ja19kaWFnLmMKQEAgLTAsMCArMSwxOTIgQEAKKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L25ldF9uYW1lc3BhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxuZXQvc29jay5oPgorCisjaW5jbHVkZSA8bGludXgvaW5ldF9kaWFnLmg+CisjaW5jbHVkZSA8bGludXgvc29ja19kaWFnLmg+CisKK3N0YXRpYyBzdHJ1Y3Qgc29ja19kaWFnX2hhbmRsZXIgKnNvY2tfZGlhZ19oYW5kbGVyc1tBRl9NQVhdOworc3RhdGljIGludCAoKmluZXRfcmN2X2NvbXBhdCkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpOworc3RhdGljIERFRklORV9NVVRFWChzb2NrX2RpYWdfdGFibGVfbXV0ZXgpOworCitpbnQgc29ja19kaWFnX2NoZWNrX2Nvb2tpZSh2b2lkICpzaywgX191MzIgKmNvb2tpZSkKK3sKKwlpZiAoKGNvb2tpZVswXSAhPSBJTkVUX0RJQUdfTk9DT09LSUUgfHwKKwkgICAgIGNvb2tpZVsxXSAhPSBJTkVUX0RJQUdfTk9DT09LSUUpICYmCisJICAgICgodTMyKSh1bnNpZ25lZCBsb25nKXNrICE9IGNvb2tpZVswXSB8fAorCSAgICAgKHUzMikoKCgodW5zaWduZWQgbG9uZylzaykgPj4gMzEpID4+IDEpICE9IGNvb2tpZVsxXSkpCisJCXJldHVybiAtRVNUQUxFOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzb2NrX2RpYWdfY2hlY2tfY29va2llKTsKKwordm9pZCBzb2NrX2RpYWdfc2F2ZV9jb29raWUodm9pZCAqc2ssIF9fdTMyICpjb29raWUpCit7CisJY29va2llWzBdID0gKHUzMikodW5zaWduZWQgbG9uZylzazsKKwljb29raWVbMV0gPSAodTMyKSgoKHVuc2lnbmVkIGxvbmcpc2sgPj4gMzEpID4+IDEpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoc29ja19kaWFnX3NhdmVfY29va2llKTsKKworaW50IHNvY2tfZGlhZ19wdXRfbWVtaW5mbyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsIGludCBhdHRydHlwZSkKK3sKKwlfX3UzMiAqbWVtOworCisJbWVtID0gUlRBX0RBVEEoX19SVEFfUFVUKHNrYiwgYXR0cnR5cGUsIFNLX01FTUlORk9fVkFSUyAqIHNpemVvZihfX3UzMikpKTsKKworCW1lbVtTS19NRU1JTkZPX1JNRU1fQUxMT0NdID0gc2tfcm1lbV9hbGxvY19nZXQoc2spOworCW1lbVtTS19NRU1JTkZPX1JDVkJVRl0gPSBzay0+c2tfcmN2YnVmOworCW1lbVtTS19NRU1JTkZPX1dNRU1fQUxMT0NdID0gc2tfd21lbV9hbGxvY19nZXQoc2spOworCW1lbVtTS19NRU1JTkZPX1NOREJVRl0gPSBzay0+c2tfc25kYnVmOworCW1lbVtTS19NRU1JTkZPX0ZXRF9BTExPQ10gPSBzay0+c2tfZm9yd2FyZF9hbGxvYzsKKwltZW1bU0tfTUVNSU5GT19XTUVNX1FVRVVFRF0gPSBzay0+c2tfd21lbV9xdWV1ZWQ7CisJbWVtW1NLX01FTUlORk9fT1BUTUVNXSA9IGF0b21pY19yZWFkKCZzay0+c2tfb21lbV9hbGxvYyk7CisKKwlyZXR1cm4gMDsKKworcnRhdHRyX2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNvY2tfZGlhZ19wdXRfbWVtaW5mbyk7CisKK3ZvaWQgc29ja19kaWFnX3JlZ2lzdGVyX2luZXRfY29tcGF0KGludCAoKmZuKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkpCit7CisJbXV0ZXhfbG9jaygmc29ja19kaWFnX3RhYmxlX211dGV4KTsKKwlpbmV0X3Jjdl9jb21wYXQgPSBmbjsKKwltdXRleF91bmxvY2soJnNvY2tfZGlhZ190YWJsZV9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzb2NrX2RpYWdfcmVnaXN0ZXJfaW5ldF9jb21wYXQpOworCit2b2lkIHNvY2tfZGlhZ191bnJlZ2lzdGVyX2luZXRfY29tcGF0KGludCAoKmZuKShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCkpCit7CisJbXV0ZXhfbG9jaygmc29ja19kaWFnX3RhYmxlX211dGV4KTsKKwlpbmV0X3Jjdl9jb21wYXQgPSBOVUxMOworCW11dGV4X3VubG9jaygmc29ja19kaWFnX3RhYmxlX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHNvY2tfZGlhZ191bnJlZ2lzdGVyX2luZXRfY29tcGF0KTsKKworaW50IHNvY2tfZGlhZ19yZWdpc3RlcihzdHJ1Y3Qgc29ja19kaWFnX2hhbmRsZXIgKmhuZGwpCit7CisJaW50IGVyciA9IDA7CisKKwlpZiAoaG5kbC0+ZmFtaWx5ID49IEFGX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltdXRleF9sb2NrKCZzb2NrX2RpYWdfdGFibGVfbXV0ZXgpOworCWlmIChzb2NrX2RpYWdfaGFuZGxlcnNbaG5kbC0+ZmFtaWx5XSkKKwkJZXJyID0gLUVCVVNZOworCWVsc2UKKwkJc29ja19kaWFnX2hhbmRsZXJzW2huZGwtPmZhbWlseV0gPSBobmRsOworCW11dGV4X3VubG9jaygmc29ja19kaWFnX3RhYmxlX211dGV4KTsKKworCXJldHVybiBlcnI7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzb2NrX2RpYWdfcmVnaXN0ZXIpOworCit2b2lkIHNvY2tfZGlhZ191bnJlZ2lzdGVyKHN0cnVjdCBzb2NrX2RpYWdfaGFuZGxlciAqaG5sZCkKK3sKKwlpbnQgZmFtaWx5ID0gaG5sZC0+ZmFtaWx5OworCisJaWYgKGZhbWlseSA+PSBBRl9NQVgpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnNvY2tfZGlhZ190YWJsZV9tdXRleCk7CisJQlVHX09OKHNvY2tfZGlhZ19oYW5kbGVyc1tmYW1pbHldICE9IGhubGQpOworCXNvY2tfZGlhZ19oYW5kbGVyc1tmYW1pbHldID0gTlVMTDsKKwltdXRleF91bmxvY2soJnNvY2tfZGlhZ190YWJsZV9tdXRleCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzb2NrX2RpYWdfdW5yZWdpc3Rlcik7CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2tfZGlhZ19oYW5kbGVyICpzb2NrX2RpYWdfbG9ja19oYW5kbGVyKGludCBmYW1pbHkpCit7CisJaWYgKHNvY2tfZGlhZ19oYW5kbGVyc1tmYW1pbHldID09IE5VTEwpCisJCXJlcXVlc3RfbW9kdWxlKCJuZXQtcGYtJWQtcHJvdG8tJWQtdHlwZS0lZCIsIFBGX05FVExJTkssCisJCQkJTkVUTElOS19TT0NLX0RJQUcsIGZhbWlseSk7CisKKwltdXRleF9sb2NrKCZzb2NrX2RpYWdfdGFibGVfbXV0ZXgpOworCXJldHVybiBzb2NrX2RpYWdfaGFuZGxlcnNbZmFtaWx5XTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNvY2tfZGlhZ191bmxvY2tfaGFuZGxlcihzdHJ1Y3Qgc29ja19kaWFnX2hhbmRsZXIgKmgpCit7CisJbXV0ZXhfdW5sb2NrKCZzb2NrX2RpYWdfdGFibGVfbXV0ZXgpOworfQorCitzdGF0aWMgaW50IF9fc29ja19kaWFnX3Jjdl9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpCit7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc29ja19kaWFnX3JlcSAqcmVxID0gTkxNU0dfREFUQShubGgpOworCXN0cnVjdCBzb2NrX2RpYWdfaGFuZGxlciAqaG5kbDsKKworCWlmIChubG1zZ19sZW4obmxoKSA8IHNpemVvZigqcmVxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlobmRsID0gc29ja19kaWFnX2xvY2tfaGFuZGxlcihyZXEtPnNkaWFnX2ZhbWlseSk7CisJaWYgKGhuZGwgPT0gTlVMTCkKKwkJZXJyID0gLUVOT0VOVDsKKwllbHNlCisJCWVyciA9IGhuZGwtPmR1bXAoc2tiLCBubGgpOworCXNvY2tfZGlhZ191bmxvY2tfaGFuZGxlcihobmRsKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgc29ja19kaWFnX3Jjdl9tc2coc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpubGgpCit7CisJaW50IHJldDsKKworCXN3aXRjaCAobmxoLT5ubG1zZ190eXBlKSB7CisJY2FzZSBUQ1BESUFHX0dFVFNPQ0s6CisJY2FzZSBEQ0NQRElBR19HRVRTT0NLOgorCQlpZiAoaW5ldF9yY3ZfY29tcGF0ID09IE5VTEwpCisJCQlyZXF1ZXN0X21vZHVsZSgibmV0LXBmLSVkLXByb3RvLSVkLXR5cGUtJWQiLCBQRl9ORVRMSU5LLAorCQkJCQlORVRMSU5LX1NPQ0tfRElBRywgQUZfSU5FVCk7CisKKwkJbXV0ZXhfbG9jaygmc29ja19kaWFnX3RhYmxlX211dGV4KTsKKwkJaWYgKGluZXRfcmN2X2NvbXBhdCAhPSBOVUxMKQorCQkJcmV0ID0gaW5ldF9yY3ZfY29tcGF0KHNrYiwgbmxoKTsKKwkJZWxzZQorCQkJcmV0ID0gLUVPUE5PVFNVUFA7CisJCW11dGV4X3VubG9jaygmc29ja19kaWFnX3RhYmxlX211dGV4KTsKKworCQlyZXR1cm4gcmV0OworCWNhc2UgU09DS19ESUFHX0JZX0ZBTUlMWToKKwkJcmV0dXJuIF9fc29ja19kaWFnX3Jjdl9tc2coc2tiLCBubGgpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIERFRklORV9NVVRFWChzb2NrX2RpYWdfbXV0ZXgpOworCitzdGF0aWMgdm9pZCBzb2NrX2RpYWdfcmN2KHN0cnVjdCBza19idWZmICpza2IpCit7CisJbXV0ZXhfbG9jaygmc29ja19kaWFnX211dGV4KTsKKwluZXRsaW5rX3Jjdl9za2Ioc2tiLCAmc29ja19kaWFnX3Jjdl9tc2cpOworCW11dGV4X3VubG9jaygmc29ja19kaWFnX211dGV4KTsKK30KKworc3RydWN0IHNvY2sgKnNvY2tfZGlhZ19ubHNrOworRVhQT1JUX1NZTUJPTF9HUEwoc29ja19kaWFnX25sc2spOworCitzdGF0aWMgaW50IF9faW5pdCBzb2NrX2RpYWdfaW5pdCh2b2lkKQoreworCXNvY2tfZGlhZ19ubHNrID0gbmV0bGlua19rZXJuZWxfY3JlYXRlKCZpbml0X25ldCwgTkVUTElOS19TT0NLX0RJQUcsIDAsCisJCQkJCXNvY2tfZGlhZ19yY3YsIE5VTEwsIFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gc29ja19kaWFnX25sc2sgPT0gTlVMTCA/IC1FTk9NRU0gOiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc29ja19kaWFnX2V4aXQodm9pZCkKK3sKKwluZXRsaW5rX2tlcm5lbF9yZWxlYXNlKHNvY2tfZGlhZ19ubHNrKTsKK30KKworbW9kdWxlX2luaXQoc29ja19kaWFnX2luaXQpOworbW9kdWxlX2V4aXQoc29ja19kaWFnX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVF9QRl9QUk9UTyhQRl9ORVRMSU5LLCBORVRMSU5LX1NPQ0tfRElBRyk7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9zeXNjdGxfbmV0X2NvcmUuYyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCmluZGV4IDc3YTY1ZjAuLmQwNTU1OWQgMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCisrKyBiL25ldC9jb3JlL3N5c2N0bF9uZXRfY29yZS5jCkBAIC02OCw4ICs2OCwxMyBAQAogCiAJCWlmIChzb2NrX3RhYmxlICE9IG9yaWdfc29ja190YWJsZSkgewogCQkJcmN1X2Fzc2lnbl9wb2ludGVyKHJwc19zb2NrX2Zsb3dfdGFibGUsIHNvY2tfdGFibGUpOwotCQkJc3luY2hyb25pemVfcmN1KCk7Ci0JCQl2ZnJlZShvcmlnX3NvY2tfdGFibGUpOworCQkJaWYgKHNvY2tfdGFibGUpCisJCQkJanVtcF9sYWJlbF9pbmMoJnJwc19uZWVkZWQpOworCQkJaWYgKG9yaWdfc29ja190YWJsZSkgeworCQkJCWp1bXBfbGFiZWxfZGVjKCZycHNfbmVlZGVkKTsKKwkJCQlzeW5jaHJvbml6ZV9yY3UoKTsKKwkJCQl2ZnJlZShvcmlnX3NvY2tfdGFibGUpOworCQkJfQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9jY2lkMi5jIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDIuYwppbmRleCA2NzE2NGJiLi5mMDUzMTk4IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9jY2lkMi5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2NjaWQyLmMKQEAgLTI5LDcgKzI5LDcgQEAKIAogCiAjaWZkZWYgQ09ORklHX0lQX0RDQ1BfQ0NJRDJfREVCVUcKLXN0YXRpYyBpbnQgY2NpZDJfZGVidWc7CitzdGF0aWMgYm9vbCBjY2lkMl9kZWJ1ZzsKICNkZWZpbmUgY2NpZDJfcHJfZGVidWcoZm9ybWF0LCBhLi4uKQlEQ0NQX1BSX0RFQlVHKGNjaWQyX2RlYnVnLCBmb3JtYXQsICMjYSkKICNlbHNlCiAjZGVmaW5lIGNjaWQyX3ByX2RlYnVnKGZvcm1hdCwgYS4uLikKQEAgLTE3NCw3ICsxNzQsNyBAQAogLyoKICAqCUNvbmdlc3Rpb24gd2luZG93IHZhbGlkYXRpb24gKFJGQyAyODYxKS4KICAqLwotc3RhdGljIGludCBjY2lkMl9kb19jd3YgPSAxOworc3RhdGljIGJvb2wgY2NpZDJfZG9fY3d2ID0gdHJ1ZTsKIG1vZHVsZV9wYXJhbShjY2lkMl9kb19jd3YsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhjY2lkMl9kb19jd3YsICJQZXJmb3JtIFJGQzI4NjEgQ29uZ2VzdGlvbiBXaW5kb3cgVmFsaWRhdGlvbiIpOwogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jIGIvbmV0L2RjY3AvY2NpZHMvY2NpZDMuYwppbmRleCAzZDYwNGUxLi41NjA2MjczIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9jY2lkcy9jY2lkMy5jCisrKyBiL25ldC9kY2NwL2NjaWRzL2NjaWQzLmMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKICNpZmRlZiBDT05GSUdfSVBfRENDUF9DQ0lEM19ERUJVRwotc3RhdGljIGludCBjY2lkM19kZWJ1ZzsKK3N0YXRpYyBib29sIGNjaWQzX2RlYnVnOwogI2RlZmluZSBjY2lkM19wcl9kZWJ1Zyhmb3JtYXQsIGEuLi4pCURDQ1BfUFJfREVCVUcoY2NpZDNfZGVidWcsIGZvcm1hdCwgIyNhKQogI2Vsc2UKICNkZWZpbmUgY2NpZDNfcHJfZGVidWcoZm9ybWF0LCBhLi4uKQpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuYyBiL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmMKaW5kZXggMWY5NGI3ZS4uNjJiNTgyOCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuYworKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5jCkBAIC04LDcgKzgsNyBAQAogI2luY2x1ZGUgInRmcmMuaCIKIAogI2lmZGVmIENPTkZJR19JUF9EQ0NQX1RGUkNfREVCVUcKLWludCB0ZnJjX2RlYnVnOworYm9vbCB0ZnJjX2RlYnVnOwogbW9kdWxlX3BhcmFtKHRmcmNfZGVidWcsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyh0ZnJjX2RlYnVnLCAiRW5hYmxlIFRGUkMgZGVidWcgbWVzc2FnZXMiKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuaCBiL25ldC9kY2NwL2NjaWRzL2xpYi90ZnJjLmgKaW5kZXggZjhlZTNmNS4uZWQ2OThjNCAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvY2NpZHMvbGliL3RmcmMuaAorKysgYi9uZXQvZGNjcC9jY2lkcy9saWIvdGZyYy5oCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSAicGFja2V0X2hpc3RvcnkuaCIKIAogI2lmZGVmIENPTkZJR19JUF9EQ0NQX1RGUkNfREVCVUcKLWV4dGVybiBpbnQgdGZyY19kZWJ1ZzsKK2V4dGVybiBib29sIHRmcmNfZGVidWc7CiAjZGVmaW5lIHRmcmNfcHJfZGVidWcoZm9ybWF0LCBhLi4uKQlEQ0NQX1BSX0RFQlVHKHRmcmNfZGVidWcsIGZvcm1hdCwgIyNhKQogI2Vsc2UKICNkZWZpbmUgdGZyY19wcl9kZWJ1Zyhmb3JtYXQsIGEuLi4pCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9kY2NwLmggYi9uZXQvZGNjcC9kY2NwLmgKaW5kZXggNTgzNDkwYS4uMjlkNmJiNiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvZGNjcC5oCisrKyBiL25ldC9kY2NwL2RjY3AuaApAQCAtMzksNyArMzksNyBAQAogCQkJCQkJICAiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyNhKQogCiAjaWZkZWYgQ09ORklHX0lQX0RDQ1BfREVCVUcKLWV4dGVybiBpbnQgZGNjcF9kZWJ1ZzsKK2V4dGVybiBib29sIGRjY3BfZGVidWc7CiAjZGVmaW5lIGRjY3BfcHJfZGVidWcoZm9ybWF0LCBhLi4uKQkgIERDQ1BfUFJfREVCVUcoZGNjcF9kZWJ1ZywgZm9ybWF0LCAjI2EpCiAjZGVmaW5lIGRjY3BfcHJfZGVidWdfY2F0KGZvcm1hdCwgYS4uLikgICBEQ0NQX1BSSU5USyhkY2NwX2RlYnVnLCBmb3JtYXQsICMjYSkKICNkZWZpbmUgZGNjcF9kZWJ1ZyhmbXQsIGEuLi4pCQkgIGRjY3BfcHJfZGVidWdfY2F0KEtFUk5fREVCVUcgZm10LCAjI2EpCkBAIC0zNTcsNyArMzU3LDcgQEAKIHN0cnVjdCBkY2NwX3NrYl9jYiB7CiAJdW5pb24gewogCQlzdHJ1Y3QgaW5ldF9za2JfcGFybQloNDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJc3RydWN0IGluZXQ2X3NrYl9wYXJtCWg2OwogI2VuZGlmCiAJfSBoZWFkZXI7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9kaWFnLmMgYi9uZXQvZGNjcC9kaWFnLmMKaW5kZXggYjIxZjI2MS4uOGYxNjI1NyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvZGlhZy5jCisrKyBiL25ldC9kY2NwL2RpYWcuYwpAQCAtNDgsMTEgKzQ4LDIzIEBACiAJCWRjY3BfZ2V0X2luZm8oc2ssIF9pbmZvKTsKIH0KIAorc3RhdGljIHZvaWQgZGNjcF9kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqciwgc3RydWN0IG5sYXR0ciAqYmMpCit7CisJaW5ldF9kaWFnX2R1bXBfaWNzaygmZGNjcF9oYXNoaW5mbywgc2tiLCBjYiwgciwgYmMpOworfQorCitzdGF0aWMgaW50IGRjY3BfZGlhZ19kdW1wX29uZShzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLCBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwKKwkJc3RydWN0IGluZXRfZGlhZ19yZXEgKnJlcSkKK3sKKwlyZXR1cm4gaW5ldF9kaWFnX2R1bXBfb25lX2ljc2soJmRjY3BfaGFzaGluZm8sIGluX3NrYiwgbmxoLCByZXEpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyIGRjY3BfZGlhZ19oYW5kbGVyID0gewotCS5pZGlhZ19oYXNoaW5mbwkgPSAmZGNjcF9oYXNoaW5mbywKKwkuZHVtcAkJID0gZGNjcF9kaWFnX2R1bXAsCisJLmR1bXBfb25lCSA9IGRjY3BfZGlhZ19kdW1wX29uZSwKIAkuaWRpYWdfZ2V0X2luZm8JID0gZGNjcF9kaWFnX2dldF9pbmZvLAotCS5pZGlhZ190eXBlCSA9IERDQ1BESUFHX0dFVFNPQ0ssCi0JLmlkaWFnX2luZm9fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNwX2luZm8pLAorCS5pZGlhZ190eXBlCSA9IElQUFJPVE9fRENDUCwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGRjY3BfZGlhZ19pbml0KHZvaWQpCkBAIC03MSw0ICs4Myw0IEBACiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiBNT0RVTEVfQVVUSE9SKCJBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAbWFuZHJpdmEuY29tPiIpOwogTU9EVUxFX0RFU0NSSVBUSU9OKCJEQ0NQIGluZXRfZGlhZyBoYW5kbGVyIik7Ci1NT0RVTEVfQUxJQVNfTkVUX1BGX1BST1RPX1RZUEUoUEZfTkVUTElOSywgTkVUTElOS19JTkVUX0RJQUcsIERDQ1BESUFHX0dFVFNPQ0spOworTU9EVUxFX0FMSUFTX05FVF9QRl9QUk9UT19UWVBFKFBGX05FVExJTkssIE5FVExJTktfU09DS19ESUFHLCAyLTMzIC8qIEFGX0lORVQgLSBJUFBST1RPX0RDQ1AgKi8pOwpkaWZmIC0tZ2l0IGEvbmV0L2RjY3AvZmVhdC5jIGIvbmV0L2RjY3AvZmVhdC5jCmluZGV4IDIzY2VhMGUuLjc4YTJhZDcgMTAwNjQ0Ci0tLSBhL25ldC9kY2NwL2ZlYXQuYworKysgYi9uZXQvZGNjcC9mZWF0LmMKQEAgLTQ5MCw4ICs0OTAsOCBAQAogCW5ldy0+ZmVhdF9udW0JICAgICA9IGZlYXQ7CiAJbmV3LT5pc19sb2NhbAkgICAgID0gbG9jYWw7CiAJbmV3LT5zdGF0ZQkgICAgID0gRkVBVF9JTklUSUFMSVNJTkc7Ci0JbmV3LT5uZWVkc19jb25maXJtICAgPSAwOwotCW5ldy0+ZW1wdHlfY29uZmlybSAgID0gMDsKKwluZXctPm5lZWRzX2NvbmZpcm0gICA9IGZhbHNlOworCW5ldy0+ZW1wdHlfY29uZmlybSAgID0gZmFsc2U7CiAJbmV3LT52YWwJICAgICA9ICpmdmFsOwogCW5ldy0+bmVlZHNfbWFuZGF0b3J5ID0gbWFuZGF0b3J5OwogCkBAIC01MTcsMTIgKzUxNywxMiBAQAogCW5ldy0+ZmVhdF9udW0JICAgICA9IGZlYXQ7CiAJbmV3LT5pc19sb2NhbAkgICAgID0gbG9jYWw7CiAJbmV3LT5zdGF0ZQkgICAgID0gRkVBVF9TVEFCTEU7CS8qIHRyYW5zaXRpb24gaW4gNi42LjIgKi8KLQluZXctPm5lZWRzX2NvbmZpcm0gICA9IDE7CisJbmV3LT5uZWVkc19jb25maXJtICAgPSB0cnVlOwogCW5ldy0+ZW1wdHlfY29uZmlybSAgID0gKGZ2YWwgPT0gTlVMTCk7CiAJbmV3LT52YWwubm4JICAgICA9IDA7CQkvKiB6ZXJvZXMgdGhlIHdob2xlIHN0cnVjdHVyZSAqLwogCWlmICghbmV3LT5lbXB0eV9jb25maXJtKQogCQluZXctPnZhbCAgICAgPSAqZnZhbDsKLQluZXctPm5lZWRzX21hbmRhdG9yeSA9IDA7CisJbmV3LT5uZWVkc19tYW5kYXRvcnkgPSBmYWxzZTsKIAogCXJldHVybiAwOwogfQpAQCAtMTE1NSw3ICsxMTU1LDcgQEAKIAl9CiAKIAlpZiAoZGNjcF9mZWF0X3JlY29uY2lsZSgmZW50cnktPnZhbCwgdmFsLCBsZW4sIHNlcnZlciwgdHJ1ZSkpIHsKLQkJZW50cnktPmVtcHR5X2NvbmZpcm0gPSAwOworCQllbnRyeS0+ZW1wdHlfY29uZmlybSA9IGZhbHNlOwogCX0gZWxzZSBpZiAoaXNfbWFuZGF0b3J5KSB7CiAJCXJldHVybiBEQ0NQX1JFU0VUX0NPREVfTUFOREFUT1JZX0VSUk9SOwogCX0gZWxzZSBpZiAoZW50cnktPnN0YXRlID09IEZFQVRfSU5JVElBTElTSU5HKSB7CkBAIC0xMTcxLDEwICsxMTcxLDEwIEBACiAJCWRlZnZhbCA9IGRjY3BfZmVhdF9kZWZhdWx0X3ZhbHVlKGZlYXQpOwogCQlpZiAoIWRjY3BfZmVhdF9yZWNvbmNpbGUoJmVudHJ5LT52YWwsICZkZWZ2YWwsIDEsIHNlcnZlciwgdHJ1ZSkpCiAJCQlyZXR1cm4gRENDUF9SRVNFVF9DT0RFX09QVElPTl9FUlJPUjsKLQkJZW50cnktPmVtcHR5X2NvbmZpcm0gPSAxOworCQllbnRyeS0+ZW1wdHlfY29uZmlybSA9IHRydWU7CiAJfQotCWVudHJ5LT5uZWVkc19jb25maXJtICAgPSAxOwotCWVudHJ5LT5uZWVkc19tYW5kYXRvcnkgPSAwOworCWVudHJ5LT5uZWVkc19jb25maXJtICAgPSB0cnVlOworCWVudHJ5LT5uZWVkc19tYW5kYXRvcnkgPSBmYWxzZTsKIAllbnRyeS0+c3RhdGUJICAgICAgID0gRkVBVF9TVEFCTEU7CiAJcmV0dXJuIDA7CiAKZGlmZiAtLWdpdCBhL25ldC9kY2NwL2lwdjQuYyBiL25ldC9kY2NwL2lwdjQuYwppbmRleCA5MGE5MTlhLi4xYzY3ZmU4IDEwMDY0NAotLS0gYS9uZXQvZGNjcC9pcHY0LmMKKysrIGIvbmV0L2RjY3AvaXB2NC5jCkBAIC0xMTEsNiArMTExLDcgQEAKIAlydCA9IGlwX3JvdXRlX25ld3BvcnRzKGZsNCwgcnQsIG9yaWdfc3BvcnQsIG9yaWdfZHBvcnQsCiAJCQkgICAgICAgaW5ldC0+aW5ldF9zcG9ydCwgaW5ldC0+aW5ldF9kcG9ydCwgc2spOwogCWlmIChJU19FUlIocnQpKSB7CisJCWVyciA9IFBUUl9FUlIocnQpOwogCQlydCA9IE5VTEw7CiAJCWdvdG8gZmFpbHVyZTsKIAl9CkBAIC00NzMsMTAgKzQ3NCwxMSBAQAogCQkJCQkgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBydGFibGUgKnJ0OworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoID0gaXBfaGRyKHNrYik7CiAJc3RydWN0IGZsb3dpNCBmbDQgPSB7CiAJCS5mbG93aTRfb2lmID0gc2tiX3J0YWJsZShza2IpLT5ydF9paWYsCi0JCS5kYWRkciA9IGlwX2hkcihza2IpLT5zYWRkciwKLQkJLnNhZGRyID0gaXBfaGRyKHNrYiktPmRhZGRyLAorCQkuZGFkZHIgPSBpcGgtPnNhZGRyLAorCQkuc2FkZHIgPSBpcGgtPmRhZGRyLAogCQkuZmxvd2k0X3RvcyA9IFJUX0NPTk5fRkxBR1Moc2spLAogCQkuZmxvd2k0X3Byb3RvID0gc2stPnNrX3Byb3RvY29sLAogCQkuZmw0X3Nwb3J0ID0gZGNjcF9oZHIoc2tiKS0+ZGNjcGhfZHBvcnQsCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9pcHY2LmMgYi9uZXQvZGNjcC9pcHY2LmMKaW5kZXggMTdlZTg1Yy4uY2U5MDNmNyAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvaXB2Ni5jCisrKyBiL25ldC9kY2NwL2lwdjYuYwpAQCAtMTUwLDggKzE1MCw4IEBACiAJCQkgKi8KIAkJCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7CiAJCQlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19EQ0NQOwotCQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgJm5wLT5kYWRkcik7Ci0JCQlpcHY2X2FkZHJfY29weSgmZmw2LnNhZGRyLCAmbnAtPnNhZGRyKTsKKwkJCWZsNi5kYWRkciA9IG5wLT5kYWRkcjsKKwkJCWZsNi5zYWRkciA9IG5wLT5zYWRkcjsKIAkJCWZsNi5mbG93aTZfb2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAkJCWZsNi5mbDZfZHBvcnQgPSBpbmV0LT5pbmV0X2Rwb3J0OwogCQkJZmw2LmZsNl9zcG9ydCA9IGluZXQtPmluZXRfc3BvcnQ7CkBAIC0yNDQsOCArMjQ0LDggQEAKIAogCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7CiAJZmw2LmZsb3dpNl9wcm90byA9IElQUFJPVE9fRENDUDsKLQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmaXJlcTYtPnJtdF9hZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmZmw2LnNhZGRyLCAmaXJlcTYtPmxvY19hZGRyKTsKKwlmbDYuZGFkZHIgPSBpcmVxNi0+cm10X2FkZHI7CisJZmw2LnNhZGRyID0gaXJlcTYtPmxvY19hZGRyOwogCWZsNi5mbG93bGFiZWwgPSAwOwogCWZsNi5mbG93aTZfb2lmID0gaXJlcTYtPmlpZjsKIAlmbDYuZmw2X2Rwb3J0ID0gaW5ldF9yc2socmVxKS0+cm10X3BvcnQ7CkBAIC0yNzAsNyArMjcwLDcgQEAKIAkJZGgtPmRjY3BoX2NoZWNrc3VtID0gZGNjcF92Nl9jc3VtX2ZpbmlzaChza2IsCiAJCQkJCQkJICZpcmVxNi0+bG9jX2FkZHIsCiAJCQkJCQkJICZpcmVxNi0+cm10X2FkZHIpOwotCQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmaXJlcTYtPnJtdF9hZGRyKTsKKwkJZmw2LmRhZGRyID0gaXJlcTYtPnJtdF9hZGRyOwogCQllcnIgPSBpcDZfeG1pdChzaywgc2tiLCAmZmw2LCBvcHQsIG5wLT50Y2xhc3MpOwogCQllcnIgPSBuZXRfeG1pdF9ldmFsKGVycik7CiAJfQpAQCAtMzEzLDggKzMxMyw4IEBACiAJCQkJCQkJICAgICZyeGlwNmgtPmRhZGRyKTsKIAogCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgJnJ4aXA2aC0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZmbDYuc2FkZHIsICZyeGlwNmgtPmRhZGRyKTsKKwlmbDYuZGFkZHIgPSByeGlwNmgtPnNhZGRyOworCWZsNi5zYWRkciA9IHJ4aXA2aC0+ZGFkZHI7CiAKIAlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19EQ0NQOwogCWZsNi5mbG93aTZfb2lmID0gaW5ldDZfaWlmKHJ4c2tiKTsKQEAgLTQxOSw4ICs0MTksOCBAQAogCQlnb3RvIGRyb3BfYW5kX2ZyZWU7CiAKIAlpcmVxNiA9IGluZXQ2X3JzayhyZXEpOwotCWlwdjZfYWRkcl9jb3B5KCZpcmVxNi0+cm10X2FkZHIsICZpcHY2X2hkcihza2IpLT5zYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlyZXE2LT5sb2NfYWRkciwgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKKwlpcmVxNi0+cm10X2FkZHIgPSBpcHY2X2hkcihza2IpLT5zYWRkcjsKKwlpcmVxNi0+bG9jX2FkZHIgPSBpcHY2X2hkcihza2IpLT5kYWRkcjsKIAogCWlmIChpcHY2X29wdF9hY2NlcHRlZChzaywgc2tiKSB8fAogCSAgICBucC0+cnhvcHQuYml0cy5yeGluZm8gfHwgbnAtPnJ4b3B0LmJpdHMucnhvaW5mbyB8fApAQCAtNDkxLDcgKzQ5MSw3IEBACiAKIAkJaXB2Nl9hZGRyX3NldF92NG1hcHBlZChuZXdpbmV0LT5pbmV0X3NhZGRyLCAmbmV3bnAtPnNhZGRyKTsKIAotCQlpcHY2X2FkZHJfY29weSgmbmV3bnAtPnJjdl9zYWRkciwgJm5ld25wLT5zYWRkcik7CisJCW5ld25wLT5yY3Zfc2FkZHIgPSBuZXducC0+c2FkZHI7CiAKIAkJaW5ldF9jc2sobmV3c2spLT5pY3NrX2FmX29wcyA9ICZkY2NwX2lwdjZfbWFwcGVkOwogCQluZXdzay0+c2tfYmFja2xvZ19yY3YgPSBkY2NwX3Y0X2RvX3JjdjsKQEAgLTUyNiw5ICs1MjYsOSBAQAogCiAJCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7CiAJCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX0RDQ1A7Ci0JCWlwdjZfYWRkcl9jb3B5KCZmbDYuZGFkZHIsICZpcmVxNi0+cm10X2FkZHIpOworCQlmbDYuZGFkZHIgPSBpcmVxNi0+cm10X2FkZHI7CiAJCWZpbmFsX3AgPSBmbDZfdXBkYXRlX2RzdCgmZmw2LCBvcHQsICZmaW5hbCk7Ci0JCWlwdjZfYWRkcl9jb3B5KCZmbDYuc2FkZHIsICZpcmVxNi0+bG9jX2FkZHIpOworCQlmbDYuc2FkZHIgPSBpcmVxNi0+bG9jX2FkZHI7CiAJCWZsNi5mbG93aTZfb2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAkJZmw2LmZsNl9kcG9ydCA9IGluZXRfcnNrKHJlcSktPnJtdF9wb3J0OwogCQlmbDYuZmw2X3Nwb3J0ID0gaW5ldF9yc2socmVxKS0+bG9jX3BvcnQ7CkBAIC01NTksOSArNTU5LDkgQEAKIAogCW1lbWNweShuZXducCwgbnAsIHNpemVvZihzdHJ1Y3QgaXB2Nl9waW5mbykpOwogCi0JaXB2Nl9hZGRyX2NvcHkoJm5ld25wLT5kYWRkciwgJmlyZXE2LT5ybXRfYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJm5ld25wLT5zYWRkciwgJmlyZXE2LT5sb2NfYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJm5ld25wLT5yY3Zfc2FkZHIsICZpcmVxNi0+bG9jX2FkZHIpOworCW5ld25wLT5kYWRkciA9IGlyZXE2LT5ybXRfYWRkcjsKKwluZXducC0+c2FkZHIgPSBpcmVxNi0+bG9jX2FkZHI7CisJbmV3bnAtPnJjdl9zYWRkciA9IGlyZXE2LT5sb2NfYWRkcjsKIAluZXdzay0+c2tfYm91bmRfZGV2X2lmID0gaXJlcTYtPmlpZjsKIAogCS8qIE5vdyBJUHY2IG9wdGlvbnMuLi4KQEAgLTg3Nyw3ICs4NzcsNyBAQAogCQkJZmxvd2xhYmVsID0gZmw2X3NvY2tfbG9va3VwKHNrLCBmbDYuZmxvd2xhYmVsKTsKIAkJCWlmIChmbG93bGFiZWwgPT0gTlVMTCkKIAkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCWlwdjZfYWRkcl9jb3B5KCZ1c2luLT5zaW42X2FkZHIsICZmbG93bGFiZWwtPmRzdCk7CisJCQl1c2luLT5zaW42X2FkZHIgPSBmbG93bGFiZWwtPmRzdDsKIAkJCWZsNl9zb2NrX3JlbGVhc2UoZmxvd2xhYmVsKTsKIAkJfQogCX0KQEAgLTkxMCw3ICs5MTAsNyBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0JaXB2Nl9hZGRyX2NvcHkoJm5wLT5kYWRkciwgJnVzaW4tPnNpbjZfYWRkcik7CisJbnAtPmRhZGRyID0gdXNpbi0+c2luNl9hZGRyOwogCW5wLT5mbG93X2xhYmVsID0gZmw2LmZsb3dsYWJlbDsKIAogCS8qCkBAIC05NDksOCArOTQ5LDggQEAKIAkJc2FkZHIgPSAmbnAtPnJjdl9zYWRkcjsKIAogCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX0RDQ1A7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgJm5wLT5kYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi5zYWRkciwgc2FkZHIgPyBzYWRkciA6ICZucC0+c2FkZHIpOworCWZsNi5kYWRkciA9IG5wLT5kYWRkcjsKKwlmbDYuc2FkZHIgPSBzYWRkciA/ICpzYWRkciA6IG5wLT5zYWRkcjsKIAlmbDYuZmxvd2k2X29pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7CiAJZmw2LmZsNl9kcG9ydCA9IHVzaW4tPnNpbjZfcG9ydDsKIAlmbDYuZmw2X3Nwb3J0ID0gaW5ldC0+aW5ldF9zcG9ydDsKQEAgLTk2NiwxMSArOTY2LDExIEBACiAKIAlpZiAoc2FkZHIgPT0gTlVMTCkgewogCQlzYWRkciA9ICZmbDYuc2FkZHI7Ci0JCWlwdjZfYWRkcl9jb3B5KCZucC0+cmN2X3NhZGRyLCBzYWRkcik7CisJCW5wLT5yY3Zfc2FkZHIgPSAqc2FkZHI7CiAJfQogCiAJLyogc2V0IHRoZSBzb3VyY2UgYWRkcmVzcyAqLwotCWlwdjZfYWRkcl9jb3B5KCZucC0+c2FkZHIsIHNhZGRyKTsKKwlucC0+c2FkZHIgPSAqc2FkZHI7CiAJaW5ldC0+aW5ldF9yY3Zfc2FkZHIgPSBMT09QQkFDSzRfSVBWNjsKIAogCV9faXA2X2RzdF9zdG9yZShzaywgZHN0LCBOVUxMLCBOVUxMKTsKZGlmZiAtLWdpdCBhL25ldC9kY2NwL21pbmlzb2Nrcy5jIGIvbmV0L2RjY3AvbWluaXNvY2tzLmMKaW5kZXggZDcwNDFhMC4uNWE3ZjkwYiAxMDA2NDQKLS0tIGEvbmV0L2RjY3AvbWluaXNvY2tzLmMKKysrIGIvbmV0L2RjY3AvbWluaXNvY2tzLmMKQEAgLTUzLDE1ICs1MywxNSBAQAogCWlmICh0dyAhPSBOVUxMKSB7CiAJCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAkJY29uc3QgaW50IHJ0byA9IChpY3NrLT5pY3NrX3J0byA8PCAyKSAtIChpY3NrLT5pY3NrX3J0byA+PiAxKTsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCQlpZiAodHctPnR3X2ZhbWlseSA9PSBQRl9JTkVUNikgewogCQkJY29uc3Qgc3RydWN0IGlwdjZfcGluZm8gKm5wID0gaW5ldDZfc2soc2spOwogCQkJc3RydWN0IGluZXQ2X3RpbWV3YWl0X3NvY2sgKnR3NjsKIAogCQkJdHctPnR3X2lwdjZfb2Zmc2V0ID0gaW5ldDZfdHdfb2Zmc2V0KHNrLT5za19wcm90KTsKIAkJCXR3NiA9IGluZXQ2X3R3c2soKHN0cnVjdCBzb2NrICopdHcpOwotCQkJaXB2Nl9hZGRyX2NvcHkoJnR3Ni0+dHdfdjZfZGFkZHIsICZucC0+ZGFkZHIpOwotCQkJaXB2Nl9hZGRyX2NvcHkoJnR3Ni0+dHdfdjZfcmN2X3NhZGRyLCAmbnAtPnJjdl9zYWRkcik7CisJCQl0dzYtPnR3X3Y2X2RhZGRyID0gbnAtPmRhZGRyOworCQkJdHc2LT50d192Nl9yY3Zfc2FkZHIgPSBucC0+cmN2X3NhZGRyOwogCQkJdHctPnR3X2lwdjZvbmx5ID0gbnAtPmlwdjZvbmx5OwogCQl9CiAjZW5kaWYKQEAgLTEwMCw3ICsxMDAsNyBAQAogCSAqICAgKCogR2VuZXJhdGUgYSBuZXcgc29ja2V0IGFuZCBzd2l0Y2ggdG8gdGhhdCBzb2NrZXQgKikKIAkgKiAgIFNldCBTIDo9IG5ldyBzb2NrZXQgZm9yIHRoaXMgcG9ydCBwYWlyCiAJICovCi0Jc3RydWN0IHNvY2sgKm5ld3NrID0gaW5ldF9jc2tfY2xvbmUoc2ssIHJlcSwgR0ZQX0FUT01JQyk7CisJc3RydWN0IHNvY2sgKm5ld3NrID0gaW5ldF9jc2tfY2xvbmVfbG9jayhzaywgcmVxLCBHRlBfQVRPTUlDKTsKIAogCWlmIChuZXdzayAhPSBOVUxMKSB7CiAJCXN0cnVjdCBkY2NwX3JlcXVlc3Rfc29jayAqZHJlcSA9IGRjY3BfcnNrKHJlcSk7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9vcHRpb25zLmMgYi9uZXQvZGNjcC9vcHRpb25zLmMKaW5kZXggNGIyYWI2NS4uNjhmYTZiNyAxMDA2NDQKLS0tIGEvbmV0L2RjY3Avb3B0aW9ucy5jCisrKyBiL25ldC9kY2NwL29wdGlvbnMuYwpAQCAtNTQ0LDcgKzU0NCw3IEBACiAJfQogCiAJaWYgKHVubGlrZWx5KHZhbCA9PSBOVUxMIHx8IGxlbiA9PSAwKSkKLQkJbGVuID0gcmVwZWF0X2ZpcnN0ID0gMDsKKwkJbGVuID0gcmVwZWF0X2ZpcnN0ID0gZmFsc2U7CiAJdG90X2xlbiA9IDMgKyByZXBlYXRfZmlyc3QgKyBsZW47CiAKIAlpZiAoRENDUF9TS0JfQ0Ioc2tiKS0+ZGNjcGRfb3B0X2xlbiArIHRvdF9sZW4gPiBEQ0NQX01BWF9PUFRfTEVOKSB7CmRpZmYgLS1naXQgYS9uZXQvZGNjcC9wcm9iZS5jIGIvbmV0L2RjY3AvcHJvYmUuYwppbmRleCAzM2QwZTYyLi4wYThkNmViIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9wcm9iZS5jCisrKyBiL25ldC9kY2NwL3Byb2JlLmMKQEAgLTE1Miw2ICsxNTIsMTcgQEAKIAkubGxzZWVrICA9IG5vb3BfbGxzZWVrLAogfTsKIAorc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfanByb2JlKHZvaWQpCit7CisJaW50IHJldCA9IHJlZ2lzdGVyX2pwcm9iZSgmZGNjcF9zZW5kX3Byb2JlKTsKKworCWlmIChyZXQpIHsKKwkJcmVxdWVzdF9tb2R1bGUoImRjY3AiKTsKKwkJcmV0ID0gcmVnaXN0ZXJfanByb2JlKCZkY2NwX3NlbmRfcHJvYmUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgX19pbml0IGludCBkY2NwcHJvYmVfaW5pdCh2b2lkKQogewogCWludCByZXQgPSAtRU5PTUVNOwpAQCAtMTYzLDggKzE3NCw3IEBACiAJaWYgKCFwcm9jX25ldF9mb3BzX2NyZWF0ZSgmaW5pdF9uZXQsIHByb2NuYW1lLCBTX0lSVVNSLCAmZGNjcHByb2JlX2ZvcHMpKQogCQlnb3RvIGVycjA7CiAKLQl0cnlfdGhlbl9yZXF1ZXN0X21vZHVsZSgocmV0ID0gcmVnaXN0ZXJfanByb2JlKCZkY2NwX3NlbmRfcHJvYmUpKSA9PSAwLAotCQkJCSJkY2NwIik7CisJcmV0ID0gc2V0dXBfanByb2JlKCk7CiAJaWYgKHJldCkKIAkJZ290byBlcnIxOwogCmRpZmYgLS1naXQgYS9uZXQvZGNjcC9wcm90by5jIGIvbmV0L2RjY3AvcHJvdG8uYwppbmRleCBlNzQyZjkwLi43MDY1YzBhIDEwMDY0NAotLS0gYS9uZXQvZGNjcC9wcm90by5jCisrKyBiL25ldC9kY2NwL3Byb3RvLmMKQEAgLTEwOTksNyArMTA5OSw3IEBACiBNT0RVTEVfUEFSTV9ERVNDKHRoYXNoX2VudHJpZXMsICJOdW1iZXIgb2YgZWhhc2ggYnVja2V0cyIpOwogCiAjaWZkZWYgQ09ORklHX0lQX0RDQ1BfREVCVUcKLWludCBkY2NwX2RlYnVnOworYm9vbCBkY2NwX2RlYnVnOwogbW9kdWxlX3BhcmFtKGRjY3BfZGVidWcsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhkY2NwX2RlYnVnLCAiRW5hYmxlIGRlYnVnIG1lc3NhZ2VzIik7CiAKZGlmZiAtLWdpdCBhL25ldC9kZWNuZXQvZG5fbmVpZ2guYyBiL25ldC9kZWNuZXQvZG5fbmVpZ2guYwppbmRleCA3ZjBlYjA4Li5iZWZlNDI2IDEwMDY0NAotLS0gYS9uZXQvZGVjbmV0L2RuX25laWdoLmMKKysrIGIvbmV0L2RlY25ldC9kbl9uZWlnaC5jCkBAIC04OCw5ICs4OCw5IEBACiAKIHN0YXRpYyB1MzIgZG5fbmVpZ2hfaGFzaChjb25zdCB2b2lkICpwa2V5LAogCQkJIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCQkgX191MzIgaGFzaF9ybmQpCisJCQkgX191MzIgKmhhc2hfcm5kKQogewotCXJldHVybiBqaGFzaF8yd29yZHMoKihfX3UxNiAqKXBrZXksIDAsIGhhc2hfcm5kKTsKKwlyZXR1cm4gamhhc2hfMndvcmRzKCooX191MTYgKilwa2V5LCAwLCBoYXNoX3JuZFswXSk7CiB9CiAKIHN0cnVjdCBuZWlnaF90YWJsZSBkbl9uZWlnaF90YWJsZSA9IHsKQEAgLTEwNyw3ICsxMDcsNyBAQAogCQkuZ2Nfc3RhbGV0aW1lID0JNjAgKiBIWiwKIAkJLnJlYWNoYWJsZV90aW1lID0JCTMwICogSFosCiAJCS5kZWxheV9wcm9iZV90aW1lID0JNSAqIEhaLAotCQkucXVldWVfbGVuID0JCTMsCisJCS5xdWV1ZV9sZW5fYnl0ZXMgPQk2NCoxMDI0LAogCQkudWNhc3RfcHJvYmVzID0JMCwKIAkJLmFwcF9wcm9iZXMgPQkJMCwKIAkJLm1jYXN0X3Byb2JlcyA9CTAsCkBAIC0yMDIsNyArMjAyLDcgQEAKIHsKIAlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7CiAJc3RydWN0IGRuX3JvdXRlICpydCA9IChzdHJ1Y3QgZG5fcm91dGUgKilkc3Q7Ci0Jc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOworCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoZHN0KTsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gbmVpZ2gtPmRldjsKIAljaGFyIG1hY19hZGRyW0VUSF9BTEVOXTsKIApkaWZmIC0tZ2l0IGEvbmV0L2RlY25ldC9kbl9yb3V0ZS5jIGIvbmV0L2RlY25ldC9kbl9yb3V0ZS5jCmluZGV4IGE3N2QxNjEuLmYzMWNlNzIgMTAwNjQ0Ci0tLSBhL25ldC9kZWNuZXQvZG5fcm91dGUuYworKysgYi9uZXQvZGVjbmV0L2RuX3JvdXRlLmMKQEAgLTExMiw3ICsxMTIsNyBAQAogc3RhdGljIGludCBkbl9kc3RfZ2Moc3RydWN0IGRzdF9vcHMgKm9wcyk7CiBzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqZG5fZHN0X2NoZWNrKHN0cnVjdCBkc3RfZW50cnkgKiwgX191MzIpOwogc3RhdGljIHVuc2lnbmVkIGludCBkbl9kc3RfZGVmYXVsdF9hZHZtc3MoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZG5fZHN0X2RlZmF1bHRfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CitzdGF0aWMgdW5zaWduZWQgaW50IGRuX2RzdF9tdHUoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIHN0YXRpYyB2b2lkIGRuX2RzdF9kZXN0cm95KHN0cnVjdCBkc3RfZW50cnkgKik7CiBzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqZG5fZHN0X25lZ2F0aXZlX2FkdmljZShzdHJ1Y3QgZHN0X2VudHJ5ICopOwogc3RhdGljIHZvaWQgZG5fZHN0X2xpbmtfZmFpbHVyZShzdHJ1Y3Qgc2tfYnVmZiAqKTsKQEAgLTEzNSw3ICsxMzUsNyBAQAogCS5nYyA9CQkJZG5fZHN0X2djLAogCS5jaGVjayA9CQlkbl9kc3RfY2hlY2ssCiAJLmRlZmF1bHRfYWR2bXNzID0JZG5fZHN0X2RlZmF1bHRfYWR2bXNzLAotCS5kZWZhdWx0X210dSA9CQlkbl9kc3RfZGVmYXVsdF9tdHUsCisJLm10dSA9CQkJZG5fZHN0X210dSwKIAkuY293X21ldHJpY3MgPQkJZHN0X2Nvd19tZXRyaWNzX2dlbmVyaWMsCiAJLmRlc3Ryb3kgPQkJZG5fZHN0X2Rlc3Ryb3ksCiAJLm5lZ2F0aXZlX2FkdmljZSA9CWRuX2RzdF9uZWdhdGl2ZV9hZHZpY2UsCkBAIC0yNDQsNyArMjQ0LDcgQEAKICAqLwogc3RhdGljIHZvaWQgZG5fZHN0X3VwZGF0ZV9wbXR1KHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgdTMyIG10dSkKIHsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoZHN0KTsKIAl1MzIgbWluX210dSA9IDIzMDsKIAlzdHJ1Y3QgZG5fZGV2ICpkbjsKIApAQCAtNzEzLDcgKzcxMyw3IEBACiBzdGF0aWMgaW50IGRuX3RvX25laWdoX291dHB1dChzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IHNrYl9kc3Qoc2tiKTsKLQlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoZHN0KTsKIAogCXJldHVybiBuLT5vdXRwdXQobiwgc2tiKTsKIH0KQEAgLTcyOCw3ICs3MjgsNyBAQAogCiAJaW50IGVyciA9IC1FSU5WQUw7CiAKLQlpZiAoKG5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KSkgPT0gTlVMTCkKKwlpZiAoKG5laWdoID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoZHN0KSkgPT0gTlVMTCkKIAkJZ290byBlcnJvcjsKIAogCXNrYi0+ZGV2ID0gZGV2OwpAQCAtODI1LDkgKzgyNSwxMSBAQAogCXJldHVybiBkbl9tc3NfZnJvbV9wbXR1KGRzdC0+ZGV2LCBkc3RfbXR1KGRzdCkpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGRuX2RzdF9kZWZhdWx0X210dShjb25zdCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCitzdGF0aWMgdW5zaWduZWQgaW50IGRuX2RzdF9tdHUoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQogewotCXJldHVybiBkc3QtPmRldi0+bXR1OworCXVuc2lnbmVkIGludCBtdHUgPSBkc3RfbWV0cmljX3Jhdyhkc3QsIFJUQVhfTVRVKTsKKworCXJldHVybiBtdHUgPyA6IGRzdC0+ZGV2LT5tdHU7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgbmVpZ2hib3VyICpkbl9kc3RfbmVpZ2hfbG9va3VwKGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgY29uc3Qgdm9pZCAqZGFkZHIpCkBAIC04NTAsNyArODUyLDcgQEAKIAl9CiAJcnQtPnJ0X3R5cGUgPSByZXMtPnR5cGU7CiAKLQlpZiAoZGV2ICE9IE5VTEwgJiYgZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpID09IE5VTEwpIHsKKwlpZiAoZGV2ICE9IE5VTEwgJiYgZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoJnJ0LT5kc3QpID09IE5VTEwpIHsKIAkJbiA9IF9fbmVpZ2hfbG9va3VwX2Vycm5vKCZkbl9uZWlnaF90YWJsZSwgJnJ0LT5ydF9nYXRld2F5LCBkZXYpOwogCQlpZiAoSVNfRVJSKG4pKQogCQkJcmV0dXJuIFBUUl9FUlIobik7CmRpZmYgLS1naXQgYS9uZXQvZGVjbmV0L2RuX3RpbWVyLmMgYi9uZXQvZGVjbmV0L2RuX3RpbWVyLmMKaW5kZXggNjdmNjkxYi4uZDljMTUwYyAxMDA2NDQKLS0tIGEvbmV0L2RlY25ldC9kbl90aW1lci5jCisrKyBiL25ldC9kZWNuZXQvZG5fdGltZXIuYwpAQCAtMzYsMTYgKzM2LDEzIEBACiAKIHZvaWQgZG5fc3RhcnRfc2xvd190aW1lcihzdHJ1Y3Qgc29jayAqc2spCiB7Ci0Jc2stPnNrX3RpbWVyLmV4cGlyZXMJPSBqaWZmaWVzICsgU0xPV19JTlRFUlZBTDsKLQlzay0+c2tfdGltZXIuZnVuY3Rpb24JPSBkbl9zbG93X3RpbWVyOwotCXNrLT5za190aW1lci5kYXRhCT0gKHVuc2lnbmVkIGxvbmcpc2s7Ci0KLQlhZGRfdGltZXIoJnNrLT5za190aW1lcik7CisJc2V0dXBfdGltZXIoJnNrLT5za190aW1lciwgZG5fc2xvd190aW1lciwgKHVuc2lnbmVkIGxvbmcpc2spOworCXNrX3Jlc2V0X3RpbWVyKHNrLCAmc2stPnNrX3RpbWVyLCBqaWZmaWVzICsgU0xPV19JTlRFUlZBTCk7CiB9CiAKIHZvaWQgZG5fc3RvcF9zbG93X3RpbWVyKHN0cnVjdCBzb2NrICpzaykKIHsKLQlkZWxfdGltZXIoJnNrLT5za190aW1lcik7CisJc2tfc3RvcF90aW1lcihzaywgJnNrLT5za190aW1lcik7CiB9CiAKIHN0YXRpYyB2b2lkIGRuX3Nsb3dfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpCkBAIC01MywxMiArNTAsMTAgQEAKIAlzdHJ1Y3Qgc29jayAqc2sgPSAoc3RydWN0IHNvY2sgKilhcmc7CiAJc3RydWN0IGRuX3NjcCAqc2NwID0gRE5fU0soc2spOwogCi0Jc29ja19ob2xkKHNrKTsKIAliaF9sb2NrX3NvY2soc2spOwogCiAJaWYgKHNvY2tfb3duZWRfYnlfdXNlcihzaykpIHsKLQkJc2stPnNrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKLQkJYWRkX3RpbWVyKCZzay0+c2tfdGltZXIpOworCQlza19yZXNldF90aW1lcihzaywgJnNrLT5za190aW1lciwgamlmZmllcyArIEhaIC8gMTApOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTEwMCw5ICs5NSw3IEBACiAJCQlzY3AtPmtlZXBhbGl2ZV9meG4oc2spOwogCX0KIAotCXNrLT5za190aW1lci5leHBpcmVzID0gamlmZmllcyArIFNMT1dfSU5URVJWQUw7Ci0KLQlhZGRfdGltZXIoJnNrLT5za190aW1lcik7CisJc2tfcmVzZXRfdGltZXIoc2ssICZzay0+c2tfdGltZXIsIGppZmZpZXMgKyBTTE9XX0lOVEVSVkFMKTsKIG91dDoKIAliaF91bmxvY2tfc29jayhzayk7CiAJc29ja19wdXQoc2spOwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9LY29uZmlnIGIvbmV0L2RzYS9LY29uZmlnCmluZGV4IGM1M2RlZDIuLjI3NDc5MWMgMTAwNjQ0Ci0tLSBhL25ldC9kc2EvS2NvbmZpZworKysgYi9uZXQvZHNhL0tjb25maWcKQEAgLTEsNSArMSw1IEBACi1tZW51Y29uZmlnIE5FVF9EU0EKLQlib29sICJEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaGl0ZWN0dXJlIHN1cHBvcnQiCitjb25maWcgTkVUX0RTQQorCXRyaXN0YXRlICJEaXN0cmlidXRlZCBTd2l0Y2ggQXJjaGl0ZWN0dXJlIHN1cHBvcnQiCiAJZGVmYXVsdCBuCiAJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwgJiYgTkVUREVWSUNFUyAmJiAhUzM5MAogCXNlbGVjdCBQSFlMSUIKQEAgLTIzLDM4ICsyMyw0IEBACiAJYm9vbAogCWRlZmF1bHQgbgogCi0KLSMgc3dpdGNoIGRyaXZlcnMKLWNvbmZpZyBORVRfRFNBX01WODhFNlhYWAotCWJvb2wKLQlkZWZhdWx0IG4KLQotY29uZmlnIE5FVF9EU0FfTVY4OEU2MDYwCi0JYm9vbCAiTWFydmVsbCA4OEU2MDYwIGV0aGVybmV0IHN3aXRjaCBjaGlwIHN1cHBvcnQiCi0Jc2VsZWN0IE5FVF9EU0FfVEFHX1RSQUlMRVIKLQktLS1oZWxwLS0tCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1hcnZlbGwgODhFNjA2MCBldGhlcm5ldCBzd2l0Y2gKLQkgIGNoaXAuCi0KLWNvbmZpZyBORVRfRFNBX01WODhFNlhYWF9ORUVEX1BQVQotCWJvb2wKLQlkZWZhdWx0IG4KLQotY29uZmlnIE5FVF9EU0FfTVY4OEU2MTMxCi0JYm9vbCAiTWFydmVsbCA4OEU2MDg1LzYwOTUvNjA5NUYvNjEzMSBldGhlcm5ldCBzd2l0Y2ggY2hpcCBzdXBwb3J0IgotCXNlbGVjdCBORVRfRFNBX01WODhFNlhYWAotCXNlbGVjdCBORVRfRFNBX01WODhFNlhYWF9ORUVEX1BQVQotCXNlbGVjdCBORVRfRFNBX1RBR19EU0EKLQktLS1oZWxwLS0tCi0JICBUaGlzIGVuYWJsZXMgc3VwcG9ydCBmb3IgdGhlIE1hcnZlbGwgODhFNjA4NS82MDk1LzYwOTVGLzYxMzEKLQkgIGV0aGVybmV0IHN3aXRjaCBjaGlwcy4KLQotY29uZmlnIE5FVF9EU0FfTVY4OEU2MTIzXzYxXzY1Ci0JYm9vbCAiTWFydmVsbCA4OEU2MTIzLzYxNjEvNjE2NSBldGhlcm5ldCBzd2l0Y2ggY2hpcCBzdXBwb3J0IgotCXNlbGVjdCBORVRfRFNBX01WODhFNlhYWAotCXNlbGVjdCBORVRfRFNBX1RBR19FRFNBCi0JLS0taGVscC0tLQotCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBNYXJ2ZWxsIDg4RTYxMjMvNjE2MS82MTY1Ci0JICBldGhlcm5ldCBzd2l0Y2ggY2hpcHMuCi0KIGVuZGlmCmRpZmYgLS1naXQgYS9uZXQvZHNhL01ha2VmaWxlIGIvbmV0L2RzYS9NYWtlZmlsZQppbmRleCAyMzc0ZmFmLi43YjlmY2JiIDEwMDY0NAotLS0gYS9uZXQvZHNhL01ha2VmaWxlCisrKyBiL25ldC9kc2EvTWFrZWZpbGUKQEAgLTEsMTMgKzEsOCBAQAotIyB0YWdnaW5nIGZvcm1hdHMKLW9iai0kKENPTkZJR19ORVRfRFNBX1RBR19EU0EpICs9IHRhZ19kc2Eubwotb2JqLSQoQ09ORklHX05FVF9EU0FfVEFHX0VEU0EpICs9IHRhZ19lZHNhLm8KLW9iai0kKENPTkZJR19ORVRfRFNBX1RBR19UUkFJTEVSKSArPSB0YWdfdHJhaWxlci5vCi0KLSMgc3dpdGNoIGRyaXZlcnMKLW9iai0kKENPTkZJR19ORVRfRFNBX01WODhFNlhYWCkgKz0gbXY4OGU2eHh4Lm8KLW9iai0kKENPTkZJR19ORVRfRFNBX01WODhFNjA2MCkgKz0gbXY4OGU2MDYwLm8KLW9iai0kKENPTkZJR19ORVRfRFNBX01WODhFNjEyM182MV82NSkgKz0gbXY4OGU2MTIzXzYxXzY1Lm8KLW9iai0kKENPTkZJR19ORVRfRFNBX01WODhFNjEzMSkgKz0gbXY4OGU2MTMxLm8KLQogIyB0aGUgY29yZQotb2JqLSQoQ09ORklHX05FVF9EU0EpICs9IGRzYS5vIHNsYXZlLm8KK29iai0kKENPTkZJR19ORVRfRFNBKSArPSBkc2FfY29yZS5vCitkc2FfY29yZS15ICs9IGRzYS5vIHNsYXZlLm8KKworIyB0YWdnaW5nIGZvcm1hdHMKK2RzYV9jb3JlLSQoQ09ORklHX05FVF9EU0FfVEFHX0RTQSkgKz0gdGFnX2RzYS5vCitkc2FfY29yZS0kKENPTkZJR19ORVRfRFNBX1RBR19FRFNBKSArPSB0YWdfZWRzYS5vCitkc2FfY29yZS0kKENPTkZJR19ORVRfRFNBX1RBR19UUkFJTEVSKSArPSB0YWdfdHJhaWxlci5vCmRpZmYgLS1naXQgYS9uZXQvZHNhL2RzYS5jIGIvbmV0L2RzYS9kc2EuYwppbmRleCAwZGMxNTg5Li44OGU3YzJmIDEwMDY0NAotLS0gYS9uZXQvZHNhL2RzYS5jCisrKyBiL25ldC9kc2EvZHNhLmMKQEAgLTI5LDYgKzI5LDcgQEAKIAlsaXN0X2FkZF90YWlsKCZkcnYtPmxpc3QsICZkc2Ffc3dpdGNoX2RyaXZlcnMpOwogCW11dGV4X3VubG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIpOwogCiB2b2lkIHVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcihzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKmRydikKIHsKQEAgLTM2LDYgKzM3LDcgQEAKIAlsaXN0X2RlbF9pbml0KCZkcnYtPmxpc3QpOwogCW11dGV4X3VubG9jaygmZHNhX3N3aXRjaF9kcml2ZXJzX211dGV4KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfc3dpdGNoX2RyaXZlcik7CiAKIHN0YXRpYyBzdHJ1Y3QgZHNhX3N3aXRjaF9kcml2ZXIgKgogZHNhX3N3aXRjaF9wcm9iZShzdHJ1Y3QgbWlpX2J1cyAqYnVzLCBpbnQgc3dfYWRkciwgY2hhciAqKl9uYW1lKQpAQCAtMTk5LDI5ICsyMDEsNiBAQAogfQogCiAKLS8qIGhvb2tzIGZvciBldGhlcnR5cGUtbGVzcyB0YWdnaW5nIGZvcm1hdHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIFRoZSBvcmlnaW5hbCBEU0EgdGFnIGZvcm1hdCBhbmQgc29tZSBvdGhlciB0YWcgZm9ybWF0cyBoYXZlIG5vCi0gKiBldGhlcnR5cGUsIHdoaWNoIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBhZGQgYSBsaXR0bGUgaGFjayB0byB0aGUKLSAqIG5ldHdvcmtpbmcgcmVjZWl2ZSBwYXRoIHRvIG1ha2Ugc3VyZSB0aGF0IHJlY2VpdmVkIGZyYW1lcyBnZXQKLSAqIHRoZSByaWdodCAtPnByb3RvY29sIGFzc2lnbmVkIHRvIHRoZW0gd2hlbiBvbmUgb2YgdGhvc2UgdGFnCi0gKiBmb3JtYXRzIGlzIGluIHVzZS4KLSAqLwotYm9vbCBkc2FfdXNlc19kc2FfdGFncyh2b2lkICpkc2FfcHRyKQotewotCXN0cnVjdCBkc2Ffc3dpdGNoX3RyZWUgKmRzdCA9IGRzYV9wdHI7Ci0KLQlyZXR1cm4gISEoZHN0LT50YWdfcHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfRFNBKSk7Ci19Ci0KLWJvb2wgZHNhX3VzZXNfdHJhaWxlcl90YWdzKHZvaWQgKmRzYV9wdHIpCi17Ci0Jc3RydWN0IGRzYV9zd2l0Y2hfdHJlZSAqZHN0ID0gZHNhX3B0cjsKLQotCXJldHVybiAhIShkc3QtPnRhZ19wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9UUkFJTEVSKSk7Ci19Ci0KLQogLyogbGluayBwb2xsaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBzdGF0aWMgdm9pZCBkc2FfbGlua19wb2xsX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp1Z2x5KQogewpAQCAtNDE5LDEyICszOTgsMzYgQEAKIAogc3RhdGljIGludCBfX2luaXQgZHNhX2luaXRfbW9kdWxlKHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcigmZHNhX2RyaXZlcik7CisJaW50IHJjOworCisJcmMgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmRzYV9kcml2ZXIpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisjaWZkZWYgQ09ORklHX05FVF9EU0FfVEFHX0RTQQorCWRldl9hZGRfcGFjaygmZHNhX3BhY2tldF90eXBlKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19FRFNBCisJZGV2X2FkZF9wYWNrKCZlZHNhX3BhY2tldF90eXBlKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19UUkFJTEVSCisJZGV2X2FkZF9wYWNrKCZ0cmFpbGVyX3BhY2tldF90eXBlKTsKKyNlbmRpZgorCXJldHVybiAwOwogfQogbW9kdWxlX2luaXQoZHNhX2luaXRfbW9kdWxlKTsKIAogc3RhdGljIHZvaWQgX19leGl0IGRzYV9jbGVhbnVwX21vZHVsZSh2b2lkKQogeworI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19UUkFJTEVSCisJZGV2X3JlbW92ZV9wYWNrKCZ0cmFpbGVyX3BhY2tldF90eXBlKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19FRFNBCisJZGV2X3JlbW92ZV9wYWNrKCZlZHNhX3BhY2tldF90eXBlKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19ORVRfRFNBX1RBR19EU0EKKwlkZXZfcmVtb3ZlX3BhY2soJmRzYV9wYWNrZXRfdHlwZSk7CisjZW5kaWYKIAlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmZHNhX2RyaXZlcik7CiB9CiBtb2R1bGVfZXhpdChkc2FfY2xlYW51cF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvbmV0L2RzYS9kc2FfcHJpdi5oIGIvbmV0L2RzYS9kc2FfcHJpdi5oCmluZGV4IDRiMGVhMDUuLmQ0Y2Y1Y2MgMTAwNjQ0Ci0tLSBhL25ldC9kc2EvZHNhX3ByaXYuaAorKysgYi9uZXQvZHNhL2RzYV9wcml2LmgKQEAgLTExLDk3ICsxMSw5IEBACiAjaWZuZGVmIF9fRFNBX1BSSVZfSAogI2RlZmluZSBfX0RTQV9QUklWX0gKIAotI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9waHkuaD4KLSNpbmNsdWRlIDxsaW51eC90aW1lci5oPgotI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgogI2luY2x1ZGUgPG5ldC9kc2EuaD4KIAotc3RydWN0IGRzYV9zd2l0Y2ggewotCS8qCi0JICogUGFyZW50IHN3aXRjaCB0cmVlLCBhbmQgc3dpdGNoIGluZGV4LgotCSAqLwotCXN0cnVjdCBkc2Ffc3dpdGNoX3RyZWUJKmRzdDsKLQlpbnQJCQlpbmRleDsKLQotCS8qCi0JICogQ29uZmlndXJhdGlvbiBkYXRhIGZvciB0aGlzIHN3aXRjaC4KLQkgKi8KLQlzdHJ1Y3QgZHNhX2NoaXBfZGF0YQkqcGQ7Ci0KLQkvKgotCSAqIFRoZSB1c2VkIHN3aXRjaCBkcml2ZXIuCi0JICovCi0Jc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyCSpkcnY7Ci0KLQkvKgotCSAqIFJlZmVyZW5jZSB0byBtaWkgYnVzIHRvIHVzZS4KLQkgKi8KLQlzdHJ1Y3QgbWlpX2J1cwkJKm1hc3Rlcl9taWlfYnVzOwotCi0JLyoKLQkgKiBTbGF2ZSBtaWlfYnVzIGFuZCBkZXZpY2VzIGZvciB0aGUgaW5kaXZpZHVhbCBwb3J0cy4KLQkgKi8KLQl1MzIJCQlkc2FfcG9ydF9tYXNrOwotCXUzMgkJCXBoeXNfcG9ydF9tYXNrOwotCXN0cnVjdCBtaWlfYnVzCQkqc2xhdmVfbWlpX2J1czsKLQlzdHJ1Y3QgbmV0X2RldmljZQkqcG9ydHNbRFNBX01BWF9QT1JUU107Ci19OwotCi1zdHJ1Y3QgZHNhX3N3aXRjaF90cmVlIHsKLQkvKgotCSAqIENvbmZpZ3VyYXRpb24gZGF0YSBmb3IgdGhlIHBsYXRmb3JtIGRldmljZSB0aGF0IG93bnMKLQkgKiB0aGlzIGRzYSBzd2l0Y2ggdHJlZSBpbnN0YW5jZS4KLQkgKi8KLQlzdHJ1Y3QgZHNhX3BsYXRmb3JtX2RhdGEJKnBkOwotCi0JLyoKLQkgKiBSZWZlcmVuY2UgdG8gbmV0d29yayBkZXZpY2UgdG8gdXNlLCBhbmQgd2hpY2ggdGFnZ2luZwotCSAqIHByb3RvY29sIHRvIHVzZS4KLQkgKi8KLQlzdHJ1Y3QgbmV0X2RldmljZQkqbWFzdGVyX25ldGRldjsKLQlfX2JlMTYJCQl0YWdfcHJvdG9jb2w7Ci0KLQkvKgotCSAqIFRoZSBzd2l0Y2ggYW5kIHBvcnQgdG8gd2hpY2ggdGhlIENQVSBpcyBhdHRhY2hlZC4KLQkgKi8KLQlzOAkJCWNwdV9zd2l0Y2g7Ci0JczgJCQljcHVfcG9ydDsKLQotCS8qCi0JICogTGluayBzdGF0ZSBwb2xsaW5nLgotCSAqLwotCWludAkJCWxpbmtfcG9sbF9uZWVkZWQ7Ci0Jc3RydWN0IHdvcmtfc3RydWN0CWxpbmtfcG9sbF93b3JrOwotCXN0cnVjdCB0aW1lcl9saXN0CWxpbmtfcG9sbF90aW1lcjsKLQotCS8qCi0JICogRGF0YSBmb3IgdGhlIGluZGl2aWR1YWwgc3dpdGNoIGNoaXBzLgotCSAqLwotCXN0cnVjdCBkc2Ffc3dpdGNoCSpkc1tEU0FfTUFYX1NXSVRDSEVTXTsKLX07Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBkc2FfaXNfY3B1X3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzLCBpbnQgcCkKLXsKLQlyZXR1cm4gISEoZHMtPmluZGV4ID09IGRzLT5kc3QtPmNwdV9zd2l0Y2ggJiYgcCA9PSBkcy0+ZHN0LT5jcHVfcG9ydCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTggZHNhX3Vwc3RyZWFtX3BvcnQoc3RydWN0IGRzYV9zd2l0Y2ggKmRzKQotewotCXN0cnVjdCBkc2Ffc3dpdGNoX3RyZWUgKmRzdCA9IGRzLT5kc3Q7Ci0KLQkvKgotCSAqIElmIHRoaXMgaXMgdGhlIHJvb3Qgc3dpdGNoIChpLmUuIHRoZSBzd2l0Y2ggdGhhdCBjb25uZWN0cwotCSAqIHRvIHRoZSBDUFUpLCByZXR1cm4gdGhlIGNwdSBwb3J0IG51bWJlciBvbiB0aGlzIHN3aXRjaC4KLQkgKiBFbHNlIHJldHVybiB0aGUgKERTQSkgcG9ydCBudW1iZXIgdGhhdCBjb25uZWN0cyB0byB0aGUKLQkgKiBzd2l0Y2ggdGhhdCBpcyBvbmUgaG9wIGNsb3NlciB0byB0aGUgY3B1LgotCSAqLwotCWlmIChkc3QtPmNwdV9zd2l0Y2ggPT0gZHMtPmluZGV4KQotCQlyZXR1cm4gZHN0LT5jcHVfcG9ydDsKLQllbHNlCi0JCXJldHVybiBkcy0+cGQtPnJ0YWJsZVtkc3QtPmNwdV9zd2l0Y2hdOwotfQotCiBzdHJ1Y3QgZHNhX3NsYXZlX3ByaXYgewogCS8qCiAJICogVGhlIGxpbnV4IG5ldHdvcmsgaW50ZXJmYWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcwpAQCAtMTIzLDQ0ICszNSw4IEBACiAJc3RydWN0IHBoeV9kZXZpY2UJKnBoeTsKIH07CiAKLXN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciB7Ci0Jc3RydWN0IGxpc3RfaGVhZAlsaXN0OwotCi0JX19iZTE2CQkJdGFnX3Byb3RvY29sOwotCWludAkJCXByaXZfc2l6ZTsKLQotCS8qCi0JICogUHJvYmluZyBhbmQgc2V0dXAuCi0JICovCi0JY2hhcgkqKCpwcm9iZSkoc3RydWN0IG1paV9idXMgKmJ1cywgaW50IHN3X2FkZHIpOwotCWludAkoKnNldHVwKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOwotCWludAkoKnNldF9hZGRyKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIHU4ICphZGRyKTsKLQotCS8qCi0JICogQWNjZXNzIHRvIHRoZSBzd2l0Y2gncyBQSFkgcmVnaXN0ZXJzLgotCSAqLwotCWludAkoKnBoeV9yZWFkKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCBpbnQgcmVnbnVtKTsKLQlpbnQJKCpwaHlfd3JpdGUpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywgaW50IHBvcnQsCi0JCQkgICAgIGludCByZWdudW0sIHUxNiB2YWwpOwotCi0JLyoKLQkgKiBMaW5rIHN0YXRlIHBvbGxpbmcgYW5kIElSUSBoYW5kbGluZy4KLQkgKi8KLQl2b2lkCSgqcG9sbF9saW5rKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOwotCi0JLyoKLQkgKiBldGh0b29sIGhhcmR3YXJlIHN0YXRpc3RpY3MuCi0JICovCi0Jdm9pZAkoKmdldF9zdHJpbmdzKShzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMsIGludCBwb3J0LCB1aW50OF90ICpkYXRhKTsKLQl2b2lkCSgqZ2V0X2V0aHRvb2xfc3RhdHMpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcywKLQkJCQkgICAgIGludCBwb3J0LCB1aW50NjRfdCAqZGF0YSk7Ci0JaW50CSgqZ2V0X3NzZXRfY291bnQpKHN0cnVjdCBkc2Ffc3dpdGNoICpkcyk7Ci19OwotCiAvKiBkc2EuYyAqLwogZXh0ZXJuIGNoYXIgZHNhX2RyaXZlcl92ZXJzaW9uW107Ci12b2lkIHJlZ2lzdGVyX3N3aXRjaF9kcml2ZXIoc3RydWN0IGRzYV9zd2l0Y2hfZHJpdmVyICp0eXBlKTsKLXZvaWQgdW5yZWdpc3Rlcl9zd2l0Y2hfZHJpdmVyKHN0cnVjdCBkc2Ffc3dpdGNoX2RyaXZlciAqdHlwZSk7CiAKIC8qIHNsYXZlLmMgKi8KIHZvaWQgZHNhX3NsYXZlX21paV9idXNfaW5pdChzdHJ1Y3QgZHNhX3N3aXRjaCAqZHMpOwpAQCAtMTcwLDEyICs0NiwxNSBAQAogCiAvKiB0YWdfZHNhLmMgKi8KIG5ldGRldl90eF90IGRzYV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBwYWNrZXRfdHlwZSBkc2FfcGFja2V0X3R5cGU7CiAKIC8qIHRhZ19lZHNhLmMgKi8KIG5ldGRldl90eF90IGVkc2FfeG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKK2V4dGVybiBzdHJ1Y3QgcGFja2V0X3R5cGUgZWRzYV9wYWNrZXRfdHlwZTsKIAogLyogdGFnX3RyYWlsZXIuYyAqLwogbmV0ZGV2X3R4X3QgdHJhaWxlcl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHN0cnVjdCBwYWNrZXRfdHlwZSB0cmFpbGVyX3BhY2tldF90eXBlOwogCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2RzYS90YWdfZHNhLmMgYi9uZXQvZHNhL3RhZ19kc2EuYwppbmRleCA5OGRmZTgwLi5jYWNjZTFlIDEwMDY0NAotLS0gYS9uZXQvZHNhL3RhZ19kc2EuYworKysgYi9uZXQvZHNhL3RhZ19kc2EuYwpAQCAtMTg2LDIwICsxODYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBhY2tldF90eXBlIGRzYV9wYWNrZXRfdHlwZSBfX3JlYWRfbW9zdGx5ID0geworc3RydWN0IHBhY2tldF90eXBlIGRzYV9wYWNrZXRfdHlwZSBfX3JlYWRfbW9zdGx5ID0gewogCS50eXBlCT0gY3B1X3RvX2JlMTYoRVRIX1BfRFNBKSwKIAkuZnVuYwk9IGRzYV9yY3YsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBkc2FfaW5pdF9tb2R1bGUodm9pZCkKLXsKLQlkZXZfYWRkX3BhY2soJmRzYV9wYWNrZXRfdHlwZSk7Ci0JcmV0dXJuIDA7Ci19Ci1tb2R1bGVfaW5pdChkc2FfaW5pdF9tb2R1bGUpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZHNhX2NsZWFudXBfbW9kdWxlKHZvaWQpCi17Ci0JZGV2X3JlbW92ZV9wYWNrKCZkc2FfcGFja2V0X3R5cGUpOwotfQotbW9kdWxlX2V4aXQoZHNhX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9kc2EvdGFnX2Vkc2EuYyBiL25ldC9kc2EvdGFnX2Vkc2EuYwppbmRleCA2ZjM4MzMyLi5lNzBjNDNjIDEwMDY0NAotLS0gYS9uZXQvZHNhL3RhZ19lZHNhLmMKKysrIGIvbmV0L2RzYS90YWdfZWRzYS5jCkBAIC0yMDUsMjAgKzIwNSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgZWRzYV9wYWNrZXRfdHlwZSBfX3JlYWRfbW9zdGx5ID0geworc3RydWN0IHBhY2tldF90eXBlIGVkc2FfcGFja2V0X3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkudHlwZQk9IGNwdV90b19iZTE2KEVUSF9QX0VEU0EpLAogCS5mdW5jCT0gZWRzYV9yY3YsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCBlZHNhX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JZGV2X2FkZF9wYWNrKCZlZHNhX3BhY2tldF90eXBlKTsKLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KGVkc2FfaW5pdF9tb2R1bGUpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgZWRzYV9jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCWRldl9yZW1vdmVfcGFjaygmZWRzYV9wYWNrZXRfdHlwZSk7Ci19Ci1tb2R1bGVfZXhpdChlZHNhX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9kc2EvdGFnX3RyYWlsZXIuYyBiL25ldC9kc2EvdGFnX3RyYWlsZXIuYwppbmRleCBkNmQ3ZDBhLi45NGJjMjYwIDEwMDY0NAotLS0gYS9uZXQvZHNhL3RhZ190cmFpbGVyLmMKKysrIGIvbmV0L2RzYS90YWdfdHJhaWxlci5jCkBAIC0xMTQsMjAgKzExNCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGFja2V0X3R5cGUgdHJhaWxlcl9wYWNrZXRfdHlwZSBfX3JlYWRfbW9zdGx5ID0geworc3RydWN0IHBhY2tldF90eXBlIHRyYWlsZXJfcGFja2V0X3R5cGUgX19yZWFkX21vc3RseSA9IHsKIAkudHlwZQk9IGNwdV90b19iZTE2KEVUSF9QX1RSQUlMRVIpLAogCS5mdW5jCT0gdHJhaWxlcl9yY3YsCiB9OwotCi1zdGF0aWMgaW50IF9faW5pdCB0cmFpbGVyX2luaXRfbW9kdWxlKHZvaWQpCi17Ci0JZGV2X2FkZF9wYWNrKCZ0cmFpbGVyX3BhY2tldF90eXBlKTsKLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KHRyYWlsZXJfaW5pdF9tb2R1bGUpOwotCi1zdGF0aWMgdm9pZCBfX2V4aXQgdHJhaWxlcl9jbGVhbnVwX21vZHVsZSh2b2lkKQotewotCWRldl9yZW1vdmVfcGFjaygmdHJhaWxlcl9wYWNrZXRfdHlwZSk7Ci19Ci1tb2R1bGVfZXhpdCh0cmFpbGVyX2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL25ldC9lY29uZXQvYWZfZWNvbmV0LmMgYi9uZXQvZWNvbmV0L2FmX2Vjb25ldC5jCmluZGV4IDFjMWYyNmMuLjdlNzE3Y2IgMTAwNjQ0Ci0tLSBhL25ldC9lY29uZXQvYWZfZWNvbmV0LmMKKysrIGIvbmV0L2Vjb25ldC9hZl9lY29uZXQuYwpAQCAtMzIyLDYgKzMyMiw3IEBACiAJCS8qIFJlYWwgaGFyZHdhcmUgRWNvbmV0LiAgV2UncmUgbm90IHdvcnRoeSBldGMuICovCiAjaWZkZWYgQ09ORklHX0VDT05FVF9OQVRJVkUKIAkJdW5zaWduZWQgc2hvcnQgcHJvdG8gPSAwOworCQlpbnQgaGxlbiwgdGxlbjsKIAkJaW50IHJlczsKIAogCQlpZiAobGVuICsgMTUgPiBkZXYtPm10dSkgewpAQCAtMzMxLDEyICszMzIsMTQgQEAKIAogCQlkZXZfaG9sZChkZXYpOwogCi0JCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIGxlbiArIExMX0FMTE9DQVRFRF9TUEFDRShkZXYpLAorCQlobGVuID0gTExfUkVTRVJWRURfU1BBQ0UoZGV2KTsKKwkJdGxlbiA9IGRldi0+bmVlZGVkX3RhaWxyb29tOworCQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBsZW4gKyBobGVuICsgdGxlbiwKIAkJCQkJICBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCWdvdG8gb3V0X3VubG9jazsKIAotCQlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOworCQlza2JfcmVzZXJ2ZShza2IsIGhsZW4pOwogCQlza2JfcmVzZXRfbmV0d29ya19oZWFkZXIoc2tiKTsKIAogCQllYiA9IChzdHJ1Y3QgZWNfY2IgKikmc2tiLT5jYjsKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0LzZsb3dwYW4uYyBiL25ldC9pZWVlODAyMTU0LzZsb3dwYW4uYwppbmRleCAxOWQ2YWVmLi5lNGVjYzFlIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjE1NC82bG93cGFuLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvNmxvd3Bhbi5jCkBAIC01MCw4ICs1MCw2IEBACiAgKiBTVUNIIERBTUFHRS4KICAqLwogCi0jZGVmaW5lIERFQlVHCi0KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KQEAgLTExMyw2ICsxMTEsMjAgQEAKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CiB9OwogCitzdHJ1Y3QgbG93cGFuX2ZyYWdtZW50IHsKKwlzdHJ1Y3Qgc2tfYnVmZgkJKnNrYjsJCS8qIHNrYiB0byBiZSBhc3NlbWJsZWQgKi8KKwlzcGlubG9ja190CQlsb2NrOwkJLyogY29uY3VyZW5jeSBsb2NrICovCisJdTE2CQkJbGVuZ3RoOwkJLyogbGVuZ3RoIHRvIGJlIGFzc2VtbGVkICovCisJdTMyCQkJYnl0ZXNfcmN2OwkvKiBieXRlcyByZWNlaXZlZCAqLworCXUxNgkJCXRhZzsJCS8qIGN1cnJlbnQgZnJhZ21lbnQgdGFnICovCisJc3RydWN0IHRpbWVyX2xpc3QJdGltZXI7CQkvKiBhc3NlbWJsaW5nIHRpbWVyICovCisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwkJLyogZnJhZ21lbnRzIGxpc3QgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmcmFnbWVudF90YWc7CitzdGF0aWMgTElTVF9IRUFEKGxvd3Bhbl9mcmFnbWVudHMpOworc3BpbmxvY2tfdCBmbGlzdF9sb2NrOworCiBzdGF0aWMgaW5saW5lIHN0cnVjdAogbG93cGFuX2Rldl9pbmZvICpsb3dwYW5fZGV2X2luZm8oY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKQEAgLTIzNCw2ICsyNDYsNTAgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQKK2xvd3Bhbl9jb21wcmVzc191ZHBfaGVhZGVyKHU4ICoqaGMwNl9wdHIsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHVkcGhkciAqdWggPSB1ZHBfaGRyKHNrYik7CisKKwlwcl9kZWJ1ZygiKCVzKTogVURQIGhlYWRlciBjb21wcmVzc2lvblxuIiwgX19mdW5jX18pOworCisJaWYgKCgodWgtPnNvdXJjZSAmIExPV1BBTl9OSENfVURQXzRCSVRfTUFTSykgPT0KKwkJCQlMT1dQQU5fTkhDX1VEUF80QklUX1BPUlQpICYmCisJICAgICgodWgtPmRlc3QgJiBMT1dQQU5fTkhDX1VEUF80QklUX01BU0spID09CisJCQkJTE9XUEFOX05IQ19VRFBfNEJJVF9QT1JUKSkgeworCQlwcl9kZWJ1ZygiKCVzKTogYm90aCBwb3J0cyBjb21wcmVzc2lvbiB0byA0IGJpdHNcbiIsIF9fZnVuY19fKTsKKwkJKipoYzA2X3B0ciA9IExPV1BBTl9OSENfVURQX0NTX1BfMTE7CisJCSoqKGhjMDZfcHRyICsgMSkgPSAvKiBzdWJ0cmFjdGlvbiBpcyBmYXN0ZXIgKi8KKwkJICAgKHU4KSgodWgtPmRlc3QgLSBMT1dQQU5fTkhDX1VEUF80QklUX1BPUlQpICsKKwkJICAgICAgICgodWgtPnNvdXJjZSAmIExPV1BBTl9OSENfVURQXzRCSVRfUE9SVCkgPDwgNCkpOworCQkqaGMwNl9wdHIgKz0gMjsKKwl9IGVsc2UgaWYgKCh1aC0+ZGVzdCAmIExPV1BBTl9OSENfVURQXzhCSVRfTUFTSykgPT0KKwkJCUxPV1BBTl9OSENfVURQXzhCSVRfUE9SVCkgeworCQlwcl9kZWJ1ZygiKCVzKTogcmVtb3ZlIDggYml0cyBvZiBkZXN0XG4iLCBfX2Z1bmNfXyk7CisJCSoqaGMwNl9wdHIgPSBMT1dQQU5fTkhDX1VEUF9DU19QXzAxOworCQltZW1jcHkoKmhjMDZfcHRyICsgMSwgJnVoLT5zb3VyY2UsIDIpOworCQkqKihoYzA2X3B0ciArIDMpID0gKHU4KSh1aC0+ZGVzdCAtIExPV1BBTl9OSENfVURQXzhCSVRfUE9SVCk7CisJCSpoYzA2X3B0ciArPSA0OworCX0gZWxzZSBpZiAoKHVoLT5zb3VyY2UgJiBMT1dQQU5fTkhDX1VEUF84QklUX01BU0spID09CisJCQlMT1dQQU5fTkhDX1VEUF84QklUX1BPUlQpIHsKKwkJcHJfZGVidWcoIiglcyk6IHJlbW92ZSA4IGJpdHMgb2Ygc291cmNlXG4iLCBfX2Z1bmNfXyk7CisJCSoqaGMwNl9wdHIgPSBMT1dQQU5fTkhDX1VEUF9DU19QXzEwOworCQltZW1jcHkoKmhjMDZfcHRyICsgMSwgJnVoLT5kZXN0LCAyKTsKKwkJKiooaGMwNl9wdHIgKyAzKSA9ICh1OCkodWgtPnNvdXJjZSAtIExPV1BBTl9OSENfVURQXzhCSVRfUE9SVCk7CisJCSpoYzA2X3B0ciArPSA0OworCX0gZWxzZSB7CisJCXByX2RlYnVnKCIoJXMpOiBjYW4ndCBjb21wcmVzcyBoZWFkZXJcbiIsIF9fZnVuY19fKTsKKwkJKipoYzA2X3B0ciA9IExPV1BBTl9OSENfVURQX0NTX1BfMDA7CisJCW1lbWNweSgqaGMwNl9wdHIgKyAxLCAmdWgtPnNvdXJjZSwgMik7CisJCW1lbWNweSgqaGMwNl9wdHIgKyAzLCAmdWgtPmRlc3QsIDIpOworCQkqaGMwNl9wdHIgKz0gNTsKKwl9CisKKwkvKiBjaGVja3N1bSBpcyBhbHdheXMgaW5saW5lICovCisJbWVtY3B5KCpoYzA2X3B0ciwgJnVoLT5jaGVjaywgMik7CisJKmhjMDZfcHRyICs9IDI7Cit9CisKIHN0YXRpYyB1OCBsb3dwYW5fZmV0Y2hfc2tiX3U4KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJdTggcmV0OwpAQCAtMjQ0LDYgKzMwMCw3MyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRpYyB1MTYgbG93cGFuX2ZldGNoX3NrYl91MTYoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1MTYgcmV0OworCisJQlVHX09OKCFwc2tiX21heV9wdWxsKHNrYiwgMikpOworCisJcmV0ID0gc2tiLT5kYXRhWzBdIHwgKHNrYi0+ZGF0YVsxXSA8PCA4KTsKKwlza2JfcHVsbChza2IsIDIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK2xvd3Bhbl91bmNvbXByZXNzX3VkcF9oZWFkZXIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgdWRwaGRyICp1aCA9IHVkcF9oZHIoc2tiKTsKKwl1OCB0bXA7CisKKwl0bXAgPSBsb3dwYW5fZmV0Y2hfc2tiX3U4KHNrYik7CisKKwlpZiAoKHRtcCAmIExPV1BBTl9OSENfVURQX01BU0spID09IExPV1BBTl9OSENfVURQX0lEKSB7CisJCXByX2RlYnVnKCIoJXMpOiBVRFAgaGVhZGVyIHVuY29tcHJlc3Npb25cbiIsIF9fZnVuY19fKTsKKwkJc3dpdGNoICh0bXAgJiBMT1dQQU5fTkhDX1VEUF9DU19QXzExKSB7CisJCWNhc2UgTE9XUEFOX05IQ19VRFBfQ1NfUF8wMDoKKwkJCW1lbWNweSgmdWgtPnNvdXJjZSwgJnNrYi0+ZGF0YVswXSwgMik7CisJCQltZW1jcHkoJnVoLT5kZXN0LCAmc2tiLT5kYXRhWzJdLCAyKTsKKwkJCXNrYl9wdWxsKHNrYiwgNCk7CisJCQlicmVhazsKKwkJY2FzZSBMT1dQQU5fTkhDX1VEUF9DU19QXzAxOgorCQkJbWVtY3B5KCZ1aC0+c291cmNlLCAmc2tiLT5kYXRhWzBdLCAyKTsKKwkJCXVoLT5kZXN0ID0KKwkJCSAgIHNrYi0+ZGF0YVsyXSArIExPV1BBTl9OSENfVURQXzhCSVRfUE9SVDsKKwkJCXNrYl9wdWxsKHNrYiwgMyk7CisJCQlicmVhazsKKwkJY2FzZSBMT1dQQU5fTkhDX1VEUF9DU19QXzEwOgorCQkJdWgtPnNvdXJjZSA9IHNrYi0+ZGF0YVswXSArIExPV1BBTl9OSENfVURQXzhCSVRfUE9SVDsKKwkJCW1lbWNweSgmdWgtPmRlc3QsICZza2ItPmRhdGFbMV0sIDIpOworCQkJc2tiX3B1bGwoc2tiLCAzKTsKKwkJCWJyZWFrOworCQljYXNlIExPV1BBTl9OSENfVURQX0NTX1BfMTE6CisJCQl1aC0+c291cmNlID0KKwkJCSAgIExPV1BBTl9OSENfVURQXzRCSVRfUE9SVCArIChza2ItPmRhdGFbMF0gPj4gNCk7CisJCQl1aC0+ZGVzdCA9CisJCQkgICBMT1dQQU5fTkhDX1VEUF80QklUX1BPUlQgKyAoc2tiLT5kYXRhWzBdICYgMHgwZik7CisJCQlza2JfcHVsbChza2IsIDEpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9kZWJ1ZygiKCVzKSBFUlJPUjogdW5rbm93biBVRFAgZm9ybWF0XG4iLCBfX2Z1bmNfXyk7CisJCQlnb3RvIGVycjsKKwkJCWJyZWFrOworCQl9CisKKwkJcHJfZGVidWcoIiglcyk6IHVuY29tcHJlc3NlZCBVRFAgcG9ydHM6IHNyYyA9ICVkLCBkc3QgPSAlZFxuIiwKKwkJCQkJX19mdW5jX18sIHVoLT5zb3VyY2UsIHVoLT5kZXN0KTsKKworCQkvKiBjb3B5IGNoZWNrc3VtICovCisJCW1lbWNweSgmdWgtPmNoZWNrLCAmc2tiLT5kYXRhWzBdLCAyKTsKKwkJc2tiX3B1bGwoc2tiLCAyKTsKKwl9IGVsc2UgeworCQlwcl9kZWJ1ZygiKCVzKTogRVJST1I6IHVuc3VwcG9ydGVkIE5IIGZvcm1hdFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK2VycjoKKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RhdGljIGludCBsb3dwYW5faGVhZGVyX2NyZWF0ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgIHVuc2lnbmVkIHNob3J0IHR5cGUsIGNvbnN0IHZvaWQgKl9kYWRkciwKQEAgLTM0Miw4ICs0NjUsNiBAQAogCWlmIChoZHItPm5leHRoZHIgPT0gVUlQX1BST1RPX1VEUCkKIAkJaXBoYzAgfD0gTE9XUEFOX0lQSENfTkhfQzsKIAotLyogVE9ETzogbmV4dCBoZWFkZXIgY29tcHJlc3Npb24gKi8KLQogCWlmICgoaXBoYzAgJiBMT1dQQU5fSVBIQ19OSF9DKSA9PSAwKSB7CiAJCSpoYzA2X3B0ciA9IGhkci0+bmV4dGhkcjsKIAkJaGMwNl9wdHIgKz0gMTsKQEAgLTQzMSw4ICs1NTIsOSBAQAogCQl9CiAJfQogCi0JLyogVE9ETzogVURQIGhlYWRlciBjb21wcmVzc2lvbiAqLwotCS8qIFRPRE86IE5leHQgSGVhZGVyIGNvbXByZXNzaW9uICovCisJLyogVURQIGhlYWRlciBjb21wcmVzc2lvbiAqLworCWlmIChoZHItPm5leHRoZHIgPT0gVUlQX1BST1RPX1VEUCkKKwkJbG93cGFuX2NvbXByZXNzX3VkcF9oZWFkZXIoJmhjMDZfcHRyLCBza2IpOwogCiAJaGVhZFswXSA9IGlwaGMwOwogCWhlYWRbMV0gPSBpcGhjMTsKQEAgLTQ2Nyw2ICs1ODksNyBAQAogCQltZW1jcHkoJihzYS5od2FkZHIpLCBzYWRkciwgOCk7CiAKIAkJbWFjX2NiKHNrYiktPmZsYWdzID0gSUVFRTgwMjE1NF9GQ19UWVBFX0RBVEE7CisKIAkJcmV0dXJuIGRldl9oYXJkX2hlYWRlcihza2IsIGxvd3Bhbl9kZXZfaW5mbyhkZXYpLT5yZWFsX2RldiwKIAkJCQl0eXBlLCAodm9pZCAqKSZkYSwgKHZvaWQgKikmc2EsIHNrYi0+bGVuKTsKIAl9CkBAIC01MTEsNiArNjM0LDIxIEBACiAJcmV0dXJuIHN0YXQ7CiB9CiAKK3N0YXRpYyB2b2lkIGxvd3Bhbl9mcmFnbWVudF90aW1lcl9leHBpcmVkKHVuc2lnbmVkIGxvbmcgZW50cnlfYWRkcikKK3sKKwlzdHJ1Y3QgbG93cGFuX2ZyYWdtZW50ICplbnRyeSA9IChzdHJ1Y3QgbG93cGFuX2ZyYWdtZW50ICopZW50cnlfYWRkcjsKKworCXByX2RlYnVnKCIlczogdGltZXIgZXhwaXJlZCBmb3IgZnJhbWUgd2l0aCB0YWcgJWRcbiIsIF9fZnVuY19fLAorCQkJCQkJCQllbnRyeS0+dGFnKTsKKworCXNwaW5fbG9jaygmZmxpc3RfbG9jayk7CisJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwlzcGluX3VubG9jaygmZmxpc3RfbG9jayk7CisKKwlkZXZfa2ZyZWVfc2tiKGVudHJ5LT5za2IpOworCWtmcmVlKGVudHJ5KTsKK30KKwogc3RhdGljIGludAogbG93cGFuX3Byb2Nlc3NfZGF0YShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewpAQCAtNTI1LDYgKzY2MywxMDcgQEAKIAlpZiAoc2tiLT5sZW4gPCAyKQogCQlnb3RvIGRyb3A7CiAJaXBoYzAgPSBsb3dwYW5fZmV0Y2hfc2tiX3U4KHNrYik7CisKKwkvKiBmcmFnbWVudHMgYXNzZW1ibGluZyAqLworCXN3aXRjaCAoaXBoYzAgJiBMT1dQQU5fRElTUEFUQ0hfTUFTSykgeworCWNhc2UgTE9XUEFOX0RJU1BBVENIX0ZSQUcxOgorCWNhc2UgTE9XUEFOX0RJU1BBVENIX0ZSQUdOOgorCXsKKwkJc3RydWN0IGxvd3Bhbl9mcmFnbWVudCAqZnJhbWU7CisJCXU4IGxlbiwgb2Zmc2V0OworCQl1MTYgdGFnOworCQlib29sIGZvdW5kID0gZmFsc2U7CisKKwkJbGVuID0gbG93cGFuX2ZldGNoX3NrYl91OChza2IpOyAvKiBmcmFtZSBsZW5ndGggKi8KKwkJdGFnID0gbG93cGFuX2ZldGNoX3NrYl91MTYoc2tiKTsKKworCQkvKgorCQkgKiBjaGVjayBpZiBmcmFtZSBhc3NlbWJsaW5nIHdpdGggdGhlIHNhbWUgdGFnIGlzCisJCSAqIGFscmVhZHkgaW4gcHJvZ3Jlc3MKKwkJICovCisJCXNwaW5fbG9jaygmZmxpc3RfbG9jayk7CisKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShmcmFtZSwgJmxvd3Bhbl9mcmFnbWVudHMsIGxpc3QpCisJCQlpZiAoZnJhbWUtPnRhZyA9PSB0YWcpIHsKKwkJCQlmb3VuZCA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJLyogYWxsb2MgbmV3IGZyYW1lIHN0cnVjdHVyZSAqLworCQlpZiAoIWZvdW5kKSB7CisJCQlmcmFtZSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBsb3dwYW5fZnJhZ21lbnQpLAorCQkJCQkJCQlHRlBfQVRPTUlDKTsKKwkJCWlmICghZnJhbWUpCisJCQkJZ290byB1bmxvY2tfYW5kX2Ryb3A7CisKKwkJCUlOSVRfTElTVF9IRUFEKCZmcmFtZS0+bGlzdCk7CisKKwkJCWZyYW1lLT5sZW5ndGggPSAoaXBoYzAgJiA3KSB8IChsZW4gPDwgMyk7CisJCQlmcmFtZS0+dGFnID0gdGFnOworCisJCQkvKiBhbGxvY2F0ZSBidWZmZXIgZm9yIGZyYW1lIGFzc2VtYmxpbmcgKi8KKwkJCWZyYW1lLT5za2IgPSBhbGxvY19za2IoZnJhbWUtPmxlbmd0aCArCisJCQkJCXNpemVvZihzdHJ1Y3QgaXB2NmhkciksIEdGUF9BVE9NSUMpOworCisJCQlpZiAoIWZyYW1lLT5za2IpIHsKKwkJCQlrZnJlZShmcmFtZSk7CisJCQkJZ290byB1bmxvY2tfYW5kX2Ryb3A7CisJCQl9CisKKwkJCWZyYW1lLT5za2ItPnByaW9yaXR5ID0gc2tiLT5wcmlvcml0eTsKKwkJCWZyYW1lLT5za2ItPmRldiA9IHNrYi0+ZGV2OworCisJCQkvKiByZXNlcnZlIGhlYWRyb29tIGZvciB1bmNvbXByZXNzZWQgaXB2NiBoZWFkZXIgKi8KKwkJCXNrYl9yZXNlcnZlKGZyYW1lLT5za2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOworCQkJc2tiX3B1dChmcmFtZS0+c2tiLCBmcmFtZS0+bGVuZ3RoKTsKKworCQkJaW5pdF90aW1lcigmZnJhbWUtPnRpbWVyKTsKKwkJCS8qIHRpbWUgb3V0IGlzIHRoZSBzYW1lIGFzIGZvciBpcHY2IC0gNjAgc2VjICovCisJCQlmcmFtZS0+dGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBMT1dQQU5fRlJBR19USU1FT1VUOworCQkJZnJhbWUtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylmcmFtZTsKKwkJCWZyYW1lLT50aW1lci5mdW5jdGlvbiA9IGxvd3Bhbl9mcmFnbWVudF90aW1lcl9leHBpcmVkOworCisJCQlhZGRfdGltZXIoJmZyYW1lLT50aW1lcik7CisKKwkJCWxpc3RfYWRkX3RhaWwoJmZyYW1lLT5saXN0LCAmbG93cGFuX2ZyYWdtZW50cyk7CisJCX0KKworCQlpZiAoKGlwaGMwICYgTE9XUEFOX0RJU1BBVENIX01BU0spID09IExPV1BBTl9ESVNQQVRDSF9GUkFHMSkKKwkJCWdvdG8gdW5sb2NrX2FuZF9kcm9wOworCisJCW9mZnNldCA9IGxvd3Bhbl9mZXRjaF9za2JfdTgoc2tiKTsgLyogZmV0Y2ggb2Zmc2V0ICovCisKKwkJLyogaWYgcGF5bG9hZCBmaXRzIGJ1ZmZlciwgY29weSBpdCAqLworCQlpZiAobGlrZWx5KChvZmZzZXQgKiA4ICsgc2tiLT5sZW4pIDw9IGZyYW1lLT5sZW5ndGgpKQorCQkJc2tiX2NvcHlfdG9fbGluZWFyX2RhdGFfb2Zmc2V0KGZyYW1lLT5za2IsIG9mZnNldCAqIDgsCisJCQkJCQkJc2tiLT5kYXRhLCBza2ItPmxlbik7CisJCWVsc2UKKwkJCWdvdG8gdW5sb2NrX2FuZF9kcm9wOworCisJCWZyYW1lLT5ieXRlc19yY3YgKz0gc2tiLT5sZW47CisKKwkJLyogZnJhbWUgYXNzZW1ibGluZyBjb21wbGV0ZSAqLworCQlpZiAoKGZyYW1lLT5ieXRlc19yY3YgPT0gZnJhbWUtPmxlbmd0aCkgJiYKKwkJICAgICBmcmFtZS0+dGltZXIuZXhwaXJlcyA+IGppZmZpZXMpIHsKKwkJCS8qIGlmIHRpbWVyIGhhdmVuJ3QgZXhwaXJlZCAtIGZpcnN0IG9mIGFsbCBkZWxldGUgaXQgKi8KKwkJCWRlbF90aW1lcigmZnJhbWUtPnRpbWVyKTsKKwkJCWxpc3RfZGVsKCZmcmFtZS0+bGlzdCk7CisJCQlzcGluX3VubG9jaygmZmxpc3RfbG9jayk7CisKKwkJCWRldl9rZnJlZV9za2Ioc2tiKTsKKwkJCXNrYiA9IGZyYW1lLT5za2I7CisJCQlrZnJlZShmcmFtZSk7CisJCQlpcGhjMCA9IGxvd3Bhbl9mZXRjaF9za2JfdTgoc2tiKTsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrKCZmbGlzdF9sb2NrKTsKKworCQlyZXR1cm4ga2ZyZWVfc2tiKHNrYiksIDA7CisJfQorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwogCWlwaGMxID0gbG93cGFuX2ZldGNoX3NrYl91OChza2IpOwogCiAJX3NhZGRyID0gbWFjX2NiKHNrYiktPnNhLmh3YWRkcjsKQEAgLTY1OSw3ICs4OTgsMTAgQEAKIAkJCWdvdG8gZHJvcDsKIAl9CiAKLQkvKiBUT0RPOiBVRFAgaGVhZGVyIHBhcnNlICovCisJLyogVURQIGRhdGEgdW5jb21wcmVzc2lvbiAqLworCWlmIChpcGhjMCAmIExPV1BBTl9JUEhDX05IX0MpCisJCWlmIChsb3dwYW5fdW5jb21wcmVzc191ZHBfaGVhZGVyKHNrYikpCisJCQlnb3RvIGRyb3A7CiAKIAkvKiBOb3QgZnJhZ21lbnRlZCBwYWNrYWdlICovCiAJaGRyLnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4pOwpAQCAtNjc0LDYgKzkxNiw5IEBACiAJbG93cGFuX3Jhd19kdW1wX3RhYmxlKF9fZnVuY19fLCAicmF3IGhlYWRlciBkdW1wIiwgKHU4ICopJmhkciwKIAkJCQkJCQlzaXplb2YoaGRyKSk7CiAJcmV0dXJuIGxvd3Bhbl9za2JfZGVsaXZlcihza2IsICZoZHIpOworCit1bmxvY2tfYW5kX2Ryb3A6CisJc3Bpbl91bmxvY2soJmZsaXN0X2xvY2spOwogZHJvcDoKIAlrZnJlZV9za2Ioc2tiKTsKIAlyZXR1cm4gLUVJTlZBTDsKQEAgLTY5MiwxOCArOTM3LDExNSBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGxvd3Bhbl9nZXRfbWFjX2hlYWRlcl9sZW5ndGgoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwkvKgorCSAqIEN1cnJlbnRseSBsb25nIGFkZHJlc3NpbmcgbW9kZSBpcyBzdXBwb3J0ZWQgb25seSwgc28gdGhlIG92ZXJhbGwKKwkgKiBoZWFkZXIgc2l6ZSBpcyAyMToKKwkgKiBGQyBTZXFOdW0gRFBBTiBEQSAgU0EgIFNlYworCSAqIDIgICsgIDEgICsgIDIgKyA4ICsgOCArIDAgID0gMjEKKwkgKi8KKwlyZXR1cm4gMjE7Cit9CisKK3N0YXRpYyBpbnQKK2xvd3Bhbl9mcmFnbWVudF94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHU4ICpoZWFkLAorCQkJaW50IG1sZW4sIGludCBwbGVuLCBpbnQgb2Zmc2V0KQoreworCXN0cnVjdCBza19idWZmICpmcmFnOworCWludCBobGVuLCByZXQ7CisKKwkvKiBpZiBwYXlsb2FkIGxlbmd0aCBpcyB6ZXJvLCB0aGVyZWZvcmUgaXQncyBhIGZpcnN0IGZyYWdtZW50ICovCisJaGxlbiA9IChwbGVuID09IDAgPyBMT1dQQU5fRlJBRzFfSEVBRF9TSVpFIDogIExPV1BBTl9GUkFHTl9IRUFEX1NJWkUpOworCisJbG93cGFuX3Jhd19kdW1wX2lubGluZShfX2Z1bmNfXywgIjZsb3dwYW4gZnJhZ21lbnQgaGVhZGVyIiwgaGVhZCwgaGxlbik7CisKKwlmcmFnID0gZGV2X2FsbG9jX3NrYihobGVuICsgbWxlbiArIHBsZW4gKyBJRUVFODAyMTU0X01GUl9TSVpFKTsKKwlpZiAoIWZyYWcpCisJCXJldHVybiAtRU5PTUVNOworCisJZnJhZy0+cHJpb3JpdHkgPSBza2ItPnByaW9yaXR5OworCWZyYWctPmRldiA9IHNrYi0+ZGV2OworCisJLyogY29weSBoZWFkZXIsIE1GUiBhbmQgcGF5bG9hZCAqLworCW1lbWNweShza2JfcHV0KGZyYWcsIG1sZW4pLCBza2ItPmRhdGEsIG1sZW4pOworCW1lbWNweShza2JfcHV0KGZyYWcsIGhsZW4pLCBoZWFkLCBobGVuKTsKKworCWlmIChwbGVuKQorCQlza2JfY29weV9mcm9tX2xpbmVhcl9kYXRhX29mZnNldChza2IsIG9mZnNldCArIG1sZW4sCisJCQkJCXNrYl9wdXQoZnJhZywgcGxlbiksIHBsZW4pOworCisJbG93cGFuX3Jhd19kdW1wX3RhYmxlKF9fZnVuY19fLCAiIHJhdyBmcmFnbWVudCBkdW1wIiwgZnJhZy0+ZGF0YSwKKwkJCQkJCQkJZnJhZy0+bGVuKTsKKworCXJldCA9IGRldl9xdWV1ZV94bWl0KGZyYWcpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAorbG93cGFuX3NrYl9mcmFnbWVudGF0aW9uKHN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50ICBlcnIsIGhlYWRlcl9sZW5ndGgsIHBheWxvYWRfbGVuZ3RoLCB0YWcsIG9mZnNldCA9IDA7CisJdTggaGVhZFs1XTsKKworCWhlYWRlcl9sZW5ndGggPSBsb3dwYW5fZ2V0X21hY19oZWFkZXJfbGVuZ3RoKHNrYik7CisJcGF5bG9hZF9sZW5ndGggPSBza2ItPmxlbiAtIGhlYWRlcl9sZW5ndGg7CisJdGFnID0gZnJhZ21lbnRfdGFnKys7CisKKwkvKiBmaXJzdCBmcmFnbWVudCBoZWFkZXIgKi8KKwloZWFkWzBdID0gTE9XUEFOX0RJU1BBVENIX0ZSQUcxIHwgKHBheWxvYWRfbGVuZ3RoICYgMHg3KTsKKwloZWFkWzFdID0gKHBheWxvYWRfbGVuZ3RoID4+IDMpICYgMHhmZjsKKwloZWFkWzJdID0gdGFnICYgMHhmZjsKKwloZWFkWzNdID0gdGFnID4+IDg7CisKKwllcnIgPSBsb3dwYW5fZnJhZ21lbnRfeG1pdChza2IsIGhlYWQsIGhlYWRlcl9sZW5ndGgsIDAsIDApOworCisJLyogbmV4dCBmcmFnbWVudCBoZWFkZXIgKi8KKwloZWFkWzBdICY9IH5MT1dQQU5fRElTUEFUQ0hfRlJBRzE7CisJaGVhZFswXSB8PSBMT1dQQU5fRElTUEFUQ0hfRlJBR047CisKKwl3aGlsZSAoKHBheWxvYWRfbGVuZ3RoIC0gb2Zmc2V0ID4gMCkgJiYgKGVyciA+PSAwKSkgeworCQlpbnQgbGVuID0gTE9XUEFOX0ZSQUdfU0laRTsKKworCQloZWFkWzRdID0gb2Zmc2V0IC8gODsKKworCQlpZiAocGF5bG9hZF9sZW5ndGggLSBvZmZzZXQgPCBsZW4pCisJCQlsZW4gPSBwYXlsb2FkX2xlbmd0aCAtIG9mZnNldDsKKworCQllcnIgPSBsb3dwYW5fZnJhZ21lbnRfeG1pdChza2IsIGhlYWQsIGhlYWRlcl9sZW5ndGgsCisJCQkJCQkJbGVuLCBvZmZzZXQpOworCQlvZmZzZXQgKz0gbGVuOworCX0KKworCXJldHVybiBlcnI7Cit9CisKIHN0YXRpYyBuZXRkZXZfdHhfdCBsb3dwYW5feG1pdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewotCWludCBlcnIgPSAwOworCWludCBlcnIgPSAtMTsKIAogCXByX2RlYnVnKCIoJXMpOiBwYWNrYWdlIHhtaXRcbiIsIF9fZnVuY19fKTsKIAogCXNrYi0+ZGV2ID0gbG93cGFuX2Rldl9pbmZvKGRldiktPnJlYWxfZGV2OwogCWlmIChza2ItPmRldiA9PSBOVUxMKSB7CiAJCXByX2RlYnVnKCIoJXMpIEVSUk9SOiBubyByZWFsIHdwYW4gZGV2aWNlIGZvdW5kXG4iLCBfX2Z1bmNfXyk7Ci0JCWRldl9rZnJlZV9za2Ioc2tiKTsKLQl9IGVsc2UKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoc2tiLT5sZW4gPD0gSUVFRTgwMjE1NF9NVFUpIHsKIAkJZXJyID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKKwkJZ290byBvdXQ7CisJfQorCisJcHJfZGVidWcoIiglcyk6IGZyYW1lIGlzIHRvbyBiaWcsIGZyYWdtZW50YXRpb24gaXMgbmVlZGVkXG4iLAorCQkJCQkJCQlfX2Z1bmNfXyk7CisJZXJyID0gbG93cGFuX3NrYl9mcmFnbWVudGF0aW9uKHNrYik7CitlcnJvcjoKKwlkZXZfa2ZyZWVfc2tiKHNrYik7CitvdXQ6CisJaWYgKGVyciA8IDApCisJCXByX2RlYnVnKCIoJXMpOiBFUlJPUjogeG1pdCBmYWlsZWRcbiIsIF9fZnVuY19fKTsKIAogCXJldHVybiAoZXJyIDwgMCA/IE5FVERFVl9UWF9CVVNZIDogTkVUREVWX1RYX09LKTsKIH0KQEAgLTczMCwxMyArMTA3MiwxMiBAQAogCWRldi0+YWRkcl9sZW4JCT0gSUVFRTgwMjE1NF9BRERSX0xFTjsKIAltZW1zZXQoZGV2LT5icm9hZGNhc3QsIDB4ZmYsIElFRUU4MDIxNTRfQUREUl9MRU4pOwogCWRldi0+dHlwZQkJPSBBUlBIUkRfSUVFRTgwMjE1NDsKLQlkZXYtPmZlYXR1cmVzCQk9IE5FVElGX0ZfTk9fQ1NVTTsKIAkvKiBGcmFtZSBDb250cm9sICsgU2VxdWVuY2UgTnVtYmVyICsgQWRkcmVzcyBmaWVsZHMgKyBTZWN1cml0eSBIZWFkZXIgKi8KIAlkZXYtPmhhcmRfaGVhZGVyX2xlbgk9IDIgKyAxICsgMjAgKyAxNDsKIAlkZXYtPm5lZWRlZF90YWlscm9vbQk9IDI7IC8qIEZDUyAqLwogCWRldi0+bXR1CQk9IDEyODE7CiAJZGV2LT50eF9xdWV1ZV9sZW4JPSAwOwotCWRldi0+ZmxhZ3MJCT0gSUZGX05PQVJQIHwgSUZGX0JST0FEQ0FTVDsKKwlkZXYtPmZsYWdzCQk9IElGRl9CUk9BRENBU1QgfCBJRkZfTVVMVElDQVNUOwogCWRldi0+d2F0Y2hkb2dfdGltZW8JPSAwOwogCiAJZGV2LT5uZXRkZXZfb3BzCQk9ICZsb3dwYW5fbmV0ZGV2X29wczsKQEAgLTc2NSw4ICsxMTA2LDE1IEBACiAJCWdvdG8gZHJvcDsKIAogCS8qIGNoZWNrIHRoYXQgaXQncyBvdXIgYnVmZmVyICovCi0JaWYgKChza2ItPmRhdGFbMF0gJiAweGUwKSA9PSAweDYwKQorCXN3aXRjaCAoc2tiLT5kYXRhWzBdICYgMHhlMCkgeworCWNhc2UgTE9XUEFOX0RJU1BBVENIX0lQSEM6CS8qIGlwdjYgZGF0YWdyYW0gKi8KKwljYXNlIExPV1BBTl9ESVNQQVRDSF9GUkFHMToJLyogZmlyc3QgZnJhZ21lbnQgaGVhZGVyICovCisJY2FzZSBMT1dQQU5fRElTUEFUQ0hfRlJBR046CS8qIG5leHQgZnJhZ21lbnRzIGhlYWRlcnMgKi8KIAkJbG93cGFuX3Byb2Nlc3NfZGF0YShza2IpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CiAKIAlyZXR1cm4gTkVUX1JYX1NVQ0NFU1M7CiAKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0LzZsb3dwYW4uaCBiL25ldC9pZWVlODAyMTU0LzZsb3dwYW4uaAppbmRleCA1ZDhjZjgwLi5hZWZmM2YzIDEwMDY0NAotLS0gYS9uZXQvaWVlZTgwMjE1NC82bG93cGFuLmgKKysrIGIvbmV0L2llZWU4MDIxNTQvNmxvd3Bhbi5oCkBAIC0xNTksNiArMTU5LDI0IEBACiAjZGVmaW5lIExPV1BBTl9ESVNQQVRDSF9GUkFHMQkweGMwIC8qIDExMDAweHh4ICovCiAjZGVmaW5lIExPV1BBTl9ESVNQQVRDSF9GUkFHTgkweGUwIC8qIDExMTAweHh4ICovCiAKKyNkZWZpbmUgTE9XUEFOX0RJU1BBVENIX01BU0sJMHhmOCAvKiAxMTExMTAwMCAqLworCisjZGVmaW5lIExPV1BBTl9GUkFHX1RJTUVPVVQJKEhaICogNjApCS8qIHRpbWUtb3V0IDYwIHNlYyAqLworCisjZGVmaW5lIExPV1BBTl9GUkFHMV9IRUFEX1NJWkUJMHg0CisjZGVmaW5lIExPV1BBTl9GUkFHTl9IRUFEX1NJWkUJMHg1CisKKy8qCisgKiBBY2NvcmRpbmcgSUVFRTgwMi4xNS40IHN0YW5kYXJkOgorICogICAtIE1UVSBpcyAxMjcgb2N0ZXRzCisgKiAgIC0gbWF4aW11bSBNSFIgc2l6ZSBpcyAzNyBvY3RldHMKKyAqICAgLSBNRlIgc2l6ZSBpcyAyIG9jdGV0cworICoKKyAqIHNvIG1pbmltYWwgcGF5bG9hZCBzaXplIHRoYXQgd2UgbWF5IGd1YXJhbnRlZSBpczoKKyAqICAgTVRVIC0gTUhSIC0gTUZSID0gODggb2N0ZXRzCisgKi8KKyNkZWZpbmUgTE9XUEFOX0ZSQUdfU0laRQk4OAorCiAvKgogICogVmFsdWVzIG9mIGZpZWxkcyB3aXRoaW4gdGhlIElQSEMgZW5jb2RpbmcgZmlyc3QgYnl0ZQogICogKEMgc3RhbmRzIGZvciBjb21wcmVzc2VkIGFuZCBJIGZvciBpbmxpbmUpCkBAIC0yMDEsNiArMjE5LDExIEBACiAjZGVmaW5lIExPV1BBTl9OSENfVURQX0NIRUNLU1VNQwkweDA0CiAjZGVmaW5lIExPV1BBTl9OSENfVURQX0NIRUNLU1VNSQkweDAwCiAKKyNkZWZpbmUgTE9XUEFOX05IQ19VRFBfNEJJVF9QT1JUCTB4RjBCMAorI2RlZmluZSBMT1dQQU5fTkhDX1VEUF80QklUX01BU0sJMHhGRkYwCisjZGVmaW5lIExPV1BBTl9OSENfVURQXzhCSVRfUE9SVAkweEYwMDAKKyNkZWZpbmUgTE9XUEFOX05IQ19VRFBfOEJJVF9NQVNLCTB4RkYwMAorCiAvKiB2YWx1ZXMgZm9yIHBvcnQgY29tcHJlc3Npb24sIF93aXRoIGNoZWNrc3VtXyBpZSBiaXQgNSBzZXQgdG8gMCAqLwogI2RlZmluZSBMT1dQQU5fTkhDX1VEUF9DU19QXzAwCTB4RjAgLyogYWxsIGlubGluZSAqLwogI2RlZmluZSBMT1dQQU5fTkhDX1VEUF9DU19QXzAxCTB4RjEgLyogc291cmNlIDE2Yml0IGlubGluZSwKZGlmZiAtLWdpdCBhL25ldC9pZWVlODAyMTU0L2RncmFtLmMgYi9uZXQvaWVlZTgwMjE1NC9kZ3JhbS5jCmluZGV4IGZhZWNmNjQuLjFiMDllYWEgMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTU0L2RncmFtLmMKKysrIGIvbmV0L2llZWU4MDIxNTQvZGdyYW0uYwpAQCAtMjA5LDYgKzIwOSw3IEBACiAJdW5zaWduZWQgbXR1OwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGRncmFtX3NvY2sgKnJvID0gZGdyYW1fc2soc2spOworCWludCBobGVuLCB0bGVuOwogCWludCBlcnI7CiAKIAlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfT09CKSB7CkBAIC0yMjksMTMgKzIzMCwxNSBAQAogCW10dSA9IGRldi0+bXR1OwogCXByX2RlYnVnKCJuYW1lID0gJXMsIG10dSA9ICV1XG4iLCBkZXYtPm5hbWUsIG10dSk7CiAKLQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBMTF9BTExPQ0FURURfU1BBQ0UoZGV2KSArIHNpemUsCisJaGxlbiA9IExMX1JFU0VSVkVEX1NQQUNFKGRldik7CisJdGxlbiA9IGRldi0+bmVlZGVkX3RhaWxyb29tOworCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIGhsZW4gKyB0bGVuICsgc2l6ZSwKIAkJCW1zZy0+bXNnX2ZsYWdzICYgTVNHX0RPTlRXQUlULAogCQkJJmVycik7CiAJaWYgKCFza2IpCiAJCWdvdG8gb3V0X2RldjsKIAotCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJc2tiX3Jlc2VydmUoc2tiLCBobGVuKTsKIAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCmRpZmYgLS1naXQgYS9uZXQvaWVlZTgwMjE1NC9yYXcuYyBiL25ldC9pZWVlODAyMTU0L3Jhdy5jCmluZGV4IDEwOTcwY2EuLmY5NmJhZTggMTAwNjQ0Ci0tLSBhL25ldC9pZWVlODAyMTU0L3Jhdy5jCisrKyBiL25ldC9pZWVlODAyMTU0L3Jhdy5jCkBAIC0xMDgsNiArMTA4LDcgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwogCXVuc2lnbmVkIG10dTsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBobGVuLCB0bGVuOwogCWludCBlcnI7CiAKIAlpZiAobXNnLT5tc2dfZmxhZ3MgJiBNU0dfT09CKSB7CkBAIC0xMzcsMTIgKzEzOCwxNCBAQAogCQlnb3RvIG91dF9kZXY7CiAJfQogCi0Jc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgTExfQUxMT0NBVEVEX1NQQUNFKGRldikgKyBzaXplLAorCWhsZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOworCXRsZW4gPSBkZXYtPm5lZWRlZF90YWlscm9vbTsKKwlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBobGVuICsgdGxlbiArIHNpemUsCiAJCQltc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CiAJaWYgKCFza2IpCiAJCWdvdG8gb3V0X2RldjsKIAotCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJc2tiX3Jlc2VydmUoc2tiLCBobGVuKTsKIAogCXNrYl9yZXNldF9tYWNfaGVhZGVyKHNrYik7CiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9LY29uZmlnIGIvbmV0L2lwdjQvS2NvbmZpZwppbmRleCBjYmI1MDViLi4xYThmOTNiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9LY29uZmlnCisrKyBiL25ldC9pcHY0L0tjb25maWcKQEAgLTQwOSw2ICs0MDksMTAgQEAKIAlkZXBlbmRzIG9uIElORVRfRElBRwogCWRlZl90cmlzdGF0ZSBJTkVUX0RJQUcKIAorY29uZmlnIElORVRfVURQX0RJQUcKKwlkZXBlbmRzIG9uIElORVRfRElBRworCWRlZl90cmlzdGF0ZSBJTkVUX0RJQUcgJiYgSVBWNgorCiBtZW51Y29uZmlnIFRDUF9DT05HX0FEVkFOQ0VECiAJYm9vbCAiVENQOiBhZHZhbmNlZCBjb25nZXN0aW9uIGNvbnRyb2wiCiAJLS0taGVscC0tLQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvTWFrZWZpbGUgYi9uZXQvaXB2NC9NYWtlZmlsZQppbmRleCBmMmRjNjljLi5mZjc1ZDNiIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9NYWtlZmlsZQorKysgYi9uZXQvaXB2NC9NYWtlZmlsZQpAQCAtMzQsNiArMzQsNyBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUikJKz0gbmV0ZmlsdGVyLm8gbmV0ZmlsdGVyLwogb2JqLSQoQ09ORklHX0lORVRfRElBRykgKz0gaW5ldF9kaWFnLm8gCiBvYmotJChDT05GSUdfSU5FVF9UQ1BfRElBRykgKz0gdGNwX2RpYWcubworb2JqLSQoQ09ORklHX0lORVRfVURQX0RJQUcpICs9IHVkcF9kaWFnLm8KIG9iai0kKENPTkZJR19ORVRfVENQUFJPQkUpICs9IHRjcF9wcm9iZS5vCiBvYmotJChDT05GSUdfVENQX0NPTkdfQklDKSArPSB0Y3BfYmljLm8KIG9iai0kKENPTkZJR19UQ1BfQ09OR19DVUJJQykgKz0gdGNwX2N1YmljLm8KQEAgLTQ3LDYgKzQ4LDcgQEAKIG9iai0kKENPTkZJR19UQ1BfQ09OR19MUCkgKz0gdGNwX2xwLm8KIG9iai0kKENPTkZJR19UQ1BfQ09OR19ZRUFIKSArPSB0Y3BfeWVhaC5vCiBvYmotJChDT05GSUdfVENQX0NPTkdfSUxMSU5PSVMpICs9IHRjcF9pbGxpbm9pcy5vCitvYmotJChDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9LTUVNKSArPSB0Y3BfbWVtY29udHJvbC5vCiBvYmotJChDT05GSUdfTkVUTEFCRUwpICs9IGNpcHNvX2lwdjQubwogCiBvYmotJChDT05GSUdfWEZSTSkgKz0geGZybTRfcG9saWN5Lm8geGZybTRfc3RhdGUubyB4ZnJtNF9pbnB1dC5vIFwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2FmX2luZXQuYyBiL25ldC9pcHY0L2FmX2luZXQuYwppbmRleCAxYjUwOTZhLi5mN2I1NjcwIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hZl9pbmV0LmMKKysrIGIvbmV0L2lwdjQvYWZfaW5ldC5jCkBAIC0xMjUwLDcgKzEyNTAsOCBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaW5ldF9nc29fc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB1MzIgZmVhdHVyZXMpCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmluZXRfZ3NvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2VncyA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJc3RydWN0IGlwaGRyICppcGg7CkBAIC0xNTcyLDkgKzE1NzMsOSBAQAogCQkJICBzaXplb2Yoc3RydWN0IGljbXBfbWliKSwKIAkJCSAgX19hbGlnbm9mX18oc3RydWN0IGljbXBfbWliKSkgPCAwKQogCQlnb3RvIGVycl9pY21wX21pYjsKLQlpZiAoc25tcF9taWJfaW5pdCgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5pY21wbXNnX3N0YXRpc3RpY3MsCi0JCQkgIHNpemVvZihzdHJ1Y3QgaWNtcG1zZ19taWIpLAotCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcG1zZ19taWIpKSA8IDApCisJbmV0LT5taWIuaWNtcG1zZ19zdGF0aXN0aWNzID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGljbXBtc2dfbWliKSwKKwkJCQkJICAgICAgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXQtPm1pYi5pY21wbXNnX3N0YXRpc3RpY3MpCiAJCWdvdG8gZXJyX2ljbXBtc2dfbWliOwogCiAJdGNwX21pYl9pbml0KG5ldCk7CkBAIC0xNTk4LDcgKzE1OTksNyBAQAogCiBzdGF0aWMgX19uZXRfZXhpdCB2b2lkIGlwdjRfbWliX2V4aXRfbmV0KHN0cnVjdCBuZXQgKm5ldCkKIHsKLQlzbm1wX21pYl9mcmVlKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXBtc2dfc3RhdGlzdGljcyk7CisJa2ZyZWUobmV0LT5taWIuaWNtcG1zZ19zdGF0aXN0aWNzKTsKIAlzbm1wX21pYl9mcmVlKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXBfc3RhdGlzdGljcyk7CiAJc25tcF9taWJfZnJlZSgodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi51ZHBsaXRlX3N0YXRpc3RpY3MpOwogCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwX3N0YXRpc3RpY3MpOwpAQCAtMTY3MSw2ICsxNjcyLDggQEAKIAlpcF9zdGF0aWNfc3lzY3RsX2luaXQoKTsKICNlbmRpZgogCisJdGNwX3Byb3Quc3lzY3RsX21lbSA9IGluaXRfbmV0LmlwdjQuc3lzY3RsX3RjcF9tZW07CisKIAkvKgogCSAqCUFkZCBhbGwgdGhlIGJhc2UgcHJvdG9jb2xzLgogCSAqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvYXJwLmMgYi9uZXQvaXB2NC9hcnAuYwppbmRleCA5NmExNjRhLi41OTQwMmJlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9hcnAuYworKysgYi9uZXQvaXB2NC9hcnAuYwpAQCAtMTEyLDExICsxMTIsNiBAQAogI2luY2x1ZGUgPG5ldC9hcnAuaD4KICNpbmNsdWRlIDxuZXQvYXgyNS5oPgogI2luY2x1ZGUgPG5ldC9uZXRyb20uaD4KLSNpZiBkZWZpbmVkKENPTkZJR19BVE1fQ0xJUCkgfHwgZGVmaW5lZChDT05GSUdfQVRNX0NMSVBfTU9EVUxFKQotI2luY2x1ZGUgPG5ldC9hdG1jbGlwLmg+Ci1zdHJ1Y3QgbmVpZ2hfdGFibGUgKmNsaXBfdGJsX2hvb2s7Ci1FWFBPUlRfU1lNQk9MKGNsaXBfdGJsX2hvb2spOwotI2VuZGlmCiAKICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgpAQCAtMTI2LDcgKzEyMSw3IEBACiAvKgogICoJSW50ZXJmYWNlIHRvIGdlbmVyaWMgbmVpZ2hib3VyIGNhY2hlLgogICovCi1zdGF0aWMgdTMyIGFycF9oYXNoKGNvbnN0IHZvaWQgKnBrZXksIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTMyIHJuZCk7CitzdGF0aWMgdTMyIGFycF9oYXNoKGNvbnN0IHZvaWQgKnBrZXksIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIF9fdTMyICpoYXNoX3JuZCk7CiBzdGF0aWMgaW50IGFycF9jb25zdHJ1Y3RvcihzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCk7CiBzdGF0aWMgdm9pZCBhcnBfc29saWNpdChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBzdGF0aWMgdm9pZCBhcnBfZXJyb3JfcmVwb3J0KHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTE2NCw3ICsxNTksNiBAQAogCiBzdHJ1Y3QgbmVpZ2hfdGFibGUgYXJwX3RibCA9IHsKIAkuZmFtaWx5CQk9IEFGX0lORVQsCi0JLmVudHJ5X3NpemUJPSBzaXplb2Yoc3RydWN0IG5laWdoYm91cikgKyA0LAogCS5rZXlfbGVuCT0gNCwKIAkuaGFzaAkJPSBhcnBfaGFzaCwKIAkuY29uc3RydWN0b3IJPSBhcnBfY29uc3RydWN0b3IsCkBAIC0xNzcsNyArMTcxLDcgQEAKIAkJLmdjX3N0YWxldGltZQkJPSA2MCAqIEhaLAogCQkucmVhY2hhYmxlX3RpbWUJCT0gMzAgKiBIWiwKIAkJLmRlbGF5X3Byb2JlX3RpbWUJPSA1ICogSFosCi0JCS5xdWV1ZV9sZW4JCT0gMywKKwkJLnF1ZXVlX2xlbl9ieXRlcwk9IDY0KjEwMjQsCiAJCS51Y2FzdF9wcm9iZXMJCT0gMywKIAkJLm1jYXN0X3Byb2JlcwkJPSAzLAogCQkuYW55Y2FzdF9kZWxheQkJPSAxICogSFosCkBAIC0yMjEsOSArMjE1LDkgQEAKIAogc3RhdGljIHUzMiBhcnBfaGFzaChjb25zdCB2b2lkICpwa2V5LAogCQkgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgIF9fdTMyIGhhc2hfcm5kKQorCQkgICAgX191MzIgKmhhc2hfcm5kKQogewotCXJldHVybiBhcnBfaGFzaGZuKCoodTMyICopcGtleSwgZGV2LCBoYXNoX3JuZCk7CisJcmV0dXJuIGFycF9oYXNoZm4oKih1MzIgKilwa2V5LCBkZXYsICpoYXNoX3JuZCk7CiB9CiAKIHN0YXRpYyBpbnQgYXJwX2NvbnN0cnVjdG9yKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQpAQCAtMjgzLDkgKzI3Nyw5IEBACiAJCWRlZmF1bHQ6CiAJCQlicmVhazsKIAkJY2FzZSBBUlBIUkRfUk9TRToKLSNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19BWDI1KQogCQljYXNlIEFSUEhSRF9BWDI1OgotI2lmIGRlZmluZWQoQ09ORklHX05FVFJPTSkgfHwgZGVmaW5lZChDT05GSUdfTkVUUk9NX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRST00pCiAJCWNhc2UgQVJQSFJEX05FVFJPTToKICNlbmRpZgogCQkJbmVpZ2gtPm9wcyA9ICZhcnBfYnJva2VuX29wczsKQEAgLTU5MiwxNiArNTg2LDE4IEBACiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgYXJwaGRyICphcnA7CiAJdW5zaWduZWQgY2hhciAqYXJwX3B0cjsKKwlpbnQgaGxlbiA9IExMX1JFU0VSVkVEX1NQQUNFKGRldik7CisJaW50IHRsZW4gPSBkZXYtPm5lZWRlZF90YWlscm9vbTsKIAogCS8qCiAJICoJQWxsb2NhdGUgYSBidWZmZXIKIAkgKi8KIAotCXNrYiA9IGFsbG9jX3NrYihhcnBfaGRyX2xlbihkZXYpICsgTExfQUxMT0NBVEVEX1NQQUNFKGRldiksIEdGUF9BVE9NSUMpOworCXNrYiA9IGFsbG9jX3NrYihhcnBfaGRyX2xlbihkZXYpICsgaGxlbiArIHRsZW4sIEdGUF9BVE9NSUMpOwogCWlmIChza2IgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOworCXNrYl9yZXNlcnZlKHNrYiwgaGxlbik7CiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJYXJwID0gKHN0cnVjdCBhcnBoZHIgKikgc2tiX3B1dChza2IsIGFycF9oZHJfbGVuKGRldikpOwogCXNrYi0+ZGV2ID0gZGV2OwpAQCAtNjMzLDEzICs2MjksMTMgQEAKIAkJYXJwLT5hcl9wcm8gPSBodG9ucyhFVEhfUF9JUCk7CiAJCWJyZWFrOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQVgyNSkKIAljYXNlIEFSUEhSRF9BWDI1OgogCQlhcnAtPmFyX2hyZCA9IGh0b25zKEFSUEhSRF9BWDI1KTsKIAkJYXJwLT5hcl9wcm8gPSBodG9ucyhBWDI1X1BfSVApOwogCQlicmVhazsKIAotI2lmIGRlZmluZWQoQ09ORklHX05FVFJPTSkgfHwgZGVmaW5lZChDT05GSUdfTkVUUk9NX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORVRST00pCiAJY2FzZSBBUlBIUkRfTkVUUk9NOgogCQlhcnAtPmFyX2hyZCA9IGh0b25zKEFSUEhSRF9ORVRST00pOwogCQlhcnAtPmFyX3BybyA9IGh0b25zKEFYMjVfUF9JUCk7CkBAIC02NDcsMTMgKzY0MywxMyBAQAogI2VuZGlmCiAjZW5kaWYKIAotI2lmIGRlZmluZWQoQ09ORklHX0ZEREkpIHx8IGRlZmluZWQoQ09ORklHX0ZERElfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0ZEREkpCiAJY2FzZSBBUlBIUkRfRkRESToKIAkJYXJwLT5hcl9ocmQgPSBodG9ucyhBUlBIUkRfRVRIRVIpOwogCQlhcnAtPmFyX3BybyA9IGh0b25zKEVUSF9QX0lQKTsKIAkJYnJlYWs7CiAjZW5kaWYKLSNpZiBkZWZpbmVkKENPTkZJR19UUikgfHwgZGVmaW5lZChDT05GSUdfVFJfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX1RSKQogCWNhc2UgQVJQSFJEX0lFRUU4MDJfVFI6CiAJCWFycC0+YXJfaHJkID0gaHRvbnMoQVJQSFJEX0lFRUU4MDIpOwogCQlhcnAtPmFyX3BybyA9IGh0b25zKEVUSF9QX0lQKTsKQEAgLTEwNDAsNyArMTAzNiw3IEBACiAJCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAJc3dpdGNoIChkZXYtPnR5cGUpIHsKLSNpZiBkZWZpbmVkKENPTkZJR19GRERJKSB8fCBkZWZpbmVkKENPTkZJR19GRERJX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19GRERJKQogCWNhc2UgQVJQSFJEX0ZEREk6CiAJCS8qCiAJCSAqIEFjY29yZGluZyB0byBSRkMgMTM5MCwgRkRESSBkZXZpY2VzIHNob3VsZCBhY2NlcHQgQVJQCkBAIC0xMjg2LDcgKzEyODIsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKLSNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19BWDI1KQogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qCkBAIC0xMzM0LDcgKzEzMzAsNyBAQAogCiAJcmVhZF9sb2NrKCZuLT5sb2NrKTsKIAkvKiBDb252ZXJ0IGhhcmR3YXJlIGFkZHJlc3MgdG8gWFg6WFg6WFg6WFggLi4uIGZvcm0uICovCi0jaWYgZGVmaW5lZChDT05GSUdfQVgyNSkgfHwgZGVmaW5lZChDT05GSUdfQVgyNV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfQVgyNSkKIAlpZiAoaGF0eXBlID09IEFSUEhSRF9BWDI1IHx8IGhhdHlwZSA9PSBBUlBIUkRfTkVUUk9NKQogCQlheDJhc2MyKChheDI1X2FkZHJlc3MgKiluLT5oYSwgaGJ1ZmZlcik7CiAJZWxzZSB7CkBAIC0xMzQ3LDcgKzEzNDMsNyBAQAogCWlmIChrICE9IDApCiAJCS0tazsKIAloYnVmZmVyW2tdID0gMDsKLSNpZiBkZWZpbmVkKENPTkZJR19BWDI1KSB8fCBkZWZpbmVkKENPTkZJR19BWDI1X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19BWDI1KQogCX0KICNlbmRpZgogCXNwcmludGYodGJ1ZiwgIiVwSTQiLCBuLT5wcmltYXJ5X2tleSk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9kZXZpbmV0LmMgYi9uZXQvaXB2NC9kZXZpbmV0LmMKaW5kZXggYzZiNTA5Mi4uNjVmMDFkYyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvZGV2aW5ldC5jCisrKyBiL25ldC9pcHY0L2RldmluZXQuYwpAQCAtMTQ5MCw3ICsxNDkwLDkgQEAKIAkJCSAgICAgdm9pZCBfX3VzZXIgKmJ1ZmZlciwKIAkJCSAgICAgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpCiB7CisJaW50IG9sZF92YWx1ZSA9ICooaW50ICopY3RsLT5kYXRhOwogCWludCByZXQgPSBwcm9jX2RvaW50dmVjKGN0bCwgd3JpdGUsIGJ1ZmZlciwgbGVucCwgcHBvcyk7CisJaW50IG5ld192YWx1ZSA9ICooaW50ICopY3RsLT5kYXRhOwogCiAJaWYgKHdyaXRlKSB7CiAJCXN0cnVjdCBpcHY0X2RldmNvbmYgKmNuZiA9IGN0bC0+ZXh0cmExOwpAQCAtMTUwMSw2ICsxNTAzLDkgQEAKIAogCQlpZiAoY25mID09IG5ldC0+aXB2NC5kZXZjb25mX2RmbHQpCiAJCQlkZXZpbmV0X2NvcHlfZGZsdF9jb25mKG5ldCwgaSk7CisJCWlmIChpID09IElQVjRfREVWQ09ORl9BQ0NFUFRfTE9DQUwgLSAxKQorCQkJaWYgKChuZXdfdmFsdWUgPT0gMCkgJiYgKG9sZF92YWx1ZSAhPSAwKSkKKwkJCQlydF9jYWNoZV9mbHVzaChuZXQsIDApOwogCX0KIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfcnVsZXMuYyBiL25ldC9pcHY0L2ZpYl9ydWxlcy5jCmluZGV4IDQ2MzM5YmEuLjc5OWZjNzkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2ZpYl9ydWxlcy5jCisrKyBiL25ldC9pcHY0L2ZpYl9ydWxlcy5jCkBAIC02Nyw2ICs2Nyw3IEBACiAKIAlyZXR1cm4gZXJyOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoZmliX2xvb2t1cCk7CiAKIHN0YXRpYyBpbnQgZmliNF9ydWxlX2FjdGlvbihzdHJ1Y3QgZmliX3J1bGUgKnJ1bGUsIHN0cnVjdCBmbG93aSAqZmxwLAogCQkJICAgIGludCBmbGFncywgc3RydWN0IGZpYl9sb29rdXBfYXJnICphcmcpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9maWJfdHJpZS5jIGIvbmV0L2lwdjQvZmliX3RyaWUuYwppbmRleCAzN2I2NzExLi5kMDRiMTNhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9maWJfdHJpZS5jCisrKyBiL25ldC9pcHY0L2ZpYl90cmllLmMKQEAgLTE2MDcsNiArMTYwNyw3IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJldDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGZpYl90YWJsZV9sb29rdXApOwogCiAvKgogICogUmVtb3ZlIHRoZSBsZWFmIGFuZCByZXR1cm4gcGFyZW50LgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaWdtcC5jIGIvbmV0L2lwdjQvaWdtcC5jCmluZGV4IGM3NDcyZWYuLmZhMDU3ZDEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lnbXAuYworKysgYi9uZXQvaXB2NC9pZ21wLmMKQEAgLTMwNCw5ICszMDQsMTEgQEAKIAlzdHJ1Y3QgaWdtcHYzX3JlcG9ydCAqcGlnOwogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoZGV2KTsKIAlzdHJ1Y3QgZmxvd2k0IGZsNDsKKwlpbnQgaGxlbiA9IExMX1JFU0VSVkVEX1NQQUNFKGRldik7CisJaW50IHRsZW4gPSBkZXYtPm5lZWRlZF90YWlscm9vbTsKIAogCXdoaWxlICgxKSB7Ci0JCXNrYiA9IGFsbG9jX3NrYihzaXplICsgTExfQUxMT0NBVEVEX1NQQUNFKGRldiksCisJCXNrYiA9IGFsbG9jX3NrYihzaXplICsgaGxlbiArIHRsZW4sCiAJCQkJR0ZQX0FUT01JQyB8IF9fR0ZQX05PV0FSTik7CiAJCWlmIChza2IpCiAJCQlicmVhazsKQEAgLTMyNyw3ICszMjksNyBAQAogCXNrYl9kc3Rfc2V0KHNrYiwgJnJ0LT5kc3QpOwogCXNrYi0+ZGV2ID0gZGV2OwogCi0Jc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKwlza2JfcmVzZXJ2ZShza2IsIGhsZW4pOwogCiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAJcGlwID0gaXBfaGRyKHNrYik7CkBAIC02NDcsNiArNjQ5LDcgQEAKIAlfX2JlMzIJZ3JvdXAgPSBwbWMgPyBwbWMtPm11bHRpYWRkciA6IDA7CiAJc3RydWN0IGZsb3dpNCBmbDQ7CiAJX19iZTMyCWRzdDsKKwlpbnQgaGxlbiwgdGxlbjsKIAogCWlmICh0eXBlID09IElHTVBWM19IT1NUX01FTUJFUlNISVBfUkVQT1JUKQogCQlyZXR1cm4gaWdtcHYzX3NlbmRfcmVwb3J0KGluX2RldiwgcG1jKTsKQEAgLTY2MSw3ICs2NjQsOSBAQAogCWlmIChJU19FUlIocnQpKQogCQlyZXR1cm4gLTE7CiAKLQlza2IgPSBhbGxvY19za2IoSUdNUF9TSVpFK0xMX0FMTE9DQVRFRF9TUEFDRShkZXYpLCBHRlBfQVRPTUlDKTsKKwlobGVuID0gTExfUkVTRVJWRURfU1BBQ0UoZGV2KTsKKwl0bGVuID0gZGV2LT5uZWVkZWRfdGFpbHJvb207CisJc2tiID0gYWxsb2Nfc2tiKElHTVBfU0laRSArIGhsZW4gKyB0bGVuLCBHRlBfQVRPTUlDKTsKIAlpZiAoc2tiID09IE5VTEwpIHsKIAkJaXBfcnRfcHV0KHJ0KTsKIAkJcmV0dXJuIC0xOwpAQCAtNjY5LDcgKzY3NCw3IEBACiAKIAlza2JfZHN0X3NldChza2IsICZydC0+ZHN0KTsKIAotCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UoZGV2KSk7CisJc2tiX3Jlc2VydmUoc2tiLCBobGVuKTsKIAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCWlwaCA9IGlwX2hkcihza2IpOwpAQCAtMTU3NCw3ICsxNTc5LDcgQEAKICAqIEFkZCBtdWx0aWNhc3Qgc2luZ2xlLXNvdXJjZSBmaWx0ZXIgdG8gdGhlIGludGVyZmFjZSBsaXN0CiAgKi8KIHN0YXRpYyBpbnQgaXBfbWNfYWRkMV9zcmMoc3RydWN0IGlwX21jX2xpc3QgKnBtYywgaW50IHNmbW9kZSwKLQlfX2JlMzIgKnBzZnNyYywgaW50IGRlbHRhKQorCV9fYmUzMiAqcHNmc3JjKQogewogCXN0cnVjdCBpcF9zZl9saXN0ICpwc2YsICpwc2ZfcHJldjsKIApAQCAtMTcwOSwxNCArMTcxNCwxNSBAQAogCQlwbWMtPnNmY291bnRbc2Ztb2RlXSsrOwogCWVyciA9IDA7CiAJZm9yIChpPTA7IGk8c2Zjb3VudDsgaSsrKSB7Ci0JCWVyciA9IGlwX21jX2FkZDFfc3JjKHBtYywgc2Ztb2RlLCAmcHNmc3JjW2ldLCBkZWx0YSk7CisJCWVyciA9IGlwX21jX2FkZDFfc3JjKHBtYywgc2Ztb2RlLCAmcHNmc3JjW2ldKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCX0KIAlpZiAoZXJyKSB7CiAJCWludCBqOwogCi0JCXBtYy0+c2Zjb3VudFtzZm1vZGVdLS07CisJCWlmICghZGVsdGEpCisJCQlwbWMtPnNmY291bnRbc2Ztb2RlXS0tOwogCQlmb3IgKGo9MDsgajxpOyBqKyspCiAJCQkodm9pZCkgaXBfbWNfZGVsMV9zcmMocG1jLCBzZm1vZGUsICZwc2ZzcmNbal0pOwogCX0gZWxzZSBpZiAoaXNleGNsdWRlICE9IChwbWMtPnNmY291bnRbTUNBU1RfRVhDTFVERV0gIT0gMCkpIHsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfY29ubmVjdGlvbl9zb2NrLmMgYi9uZXQvaXB2NC9pbmV0X2Nvbm5lY3Rpb25fc29jay5jCmluZGV4IGMxNGQ4OGEuLjJlNGUyNDQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2luZXRfY29ubmVjdGlvbl9zb2NrLmMKKysrIGIvbmV0L2lwdjQvaW5ldF9jb25uZWN0aW9uX3NvY2suYwpAQCAtNDE4LDcgKzQxOCw3IEBACiAJcmV0dXJuIGpoYXNoXzJ3b3JkcygoX19mb3JjZSB1MzIpcmFkZHIsIChfX2ZvcmNlIHUzMilycG9ydCwgcm5kKSAmIChzeW5xX2hzaXplIC0gMSk7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogI2RlZmluZSBBRl9JTkVUX0ZBTUlMWShmYW0pICgoZmFtKSA9PSBBRl9JTkVUKQogI2Vsc2UKICNkZWZpbmUgQUZfSU5FVF9GQU1JTFkoZmFtKSAxCkBAIC01ODgsMTAgKzU4OCwxOSBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF9jc2tfcmVxc2tfcXVldWVfcHJ1bmUpOwogCi1zdHJ1Y3Qgc29jayAqaW5ldF9jc2tfY2xvbmUoc3RydWN0IHNvY2sgKnNrLCBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCi0JCQkgICAgY29uc3QgZ2ZwX3QgcHJpb3JpdHkpCisvKioKKyAqCWluZXRfY3NrX2Nsb25lX2xvY2sgLSBjbG9uZSBhbiBpbmV0IHNvY2tldCwgYW5kIGxvY2sgaXRzIGNsb25lCisgKglAc2s6IHRoZSBzb2NrZXQgdG8gY2xvbmUKKyAqCUByZXE6IHJlcXVlc3Rfc29jaworICoJQHByaW9yaXR5OiBmb3IgYWxsb2NhdGlvbiAoJUdGUF9LRVJORUwsICVHRlBfQVRPTUlDLCBldGMpCisgKgorICoJQ2FsbGVyIG11c3QgdW5sb2NrIHNvY2tldCBldmVuIGluIGVycm9yIHBhdGggKGJoX3VubG9ja19zb2NrKG5ld3NrKSkKKyAqLworc3RydWN0IHNvY2sgKmluZXRfY3NrX2Nsb25lX2xvY2soY29uc3Qgc3RydWN0IHNvY2sgKnNrLAorCQkJCSBjb25zdCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsCisJCQkJIGNvbnN0IGdmcF90IHByaW9yaXR5KQogewotCXN0cnVjdCBzb2NrICpuZXdzayA9IHNrX2Nsb25lKHNrLCBwcmlvcml0eSk7CisJc3RydWN0IHNvY2sgKm5ld3NrID0gc2tfY2xvbmVfbG9jayhzaywgcHJpb3JpdHkpOwogCiAJaWYgKG5ld3NrICE9IE5VTEwpIHsKIAkJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICpuZXdpY3NrID0gaW5ldF9jc2sobmV3c2spOwpAQCAtNjE1LDcgKzYyNCw3IEBACiAJfQogCXJldHVybiBuZXdzazsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGluZXRfY3NrX2Nsb25lKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGluZXRfY3NrX2Nsb25lX2xvY2spOwogCiAvKgogICogQXQgdGhpcyBwb2ludCwgdGhlcmUgc2hvdWxkIGJlIG5vIHByb2Nlc3MgcmVmZXJlbmNlIHRvIHRoaXMKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2luZXRfZGlhZy5jIGIvbmV0L2lwdjQvaW5ldF9kaWFnLmMKaW5kZXggNjhlOGFjNS4uMjI0MGE4ZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaW5ldF9kaWFnLmMKKysrIGIvbmV0L2lwdjQvaW5ldF9kaWFnLmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2luZXRfZGlhZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tfZGlhZy5oPgogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICoqaW5ldF9kaWFnX3RhYmxlOwogCkBAIC00NSwyNCArNDYsMjIgQEAKIAl1MTYgdXNlcmxvY2tzOwogfTsKIAotc3RhdGljIHN0cnVjdCBzb2NrICppZGlhZ25sOwotCiAjZGVmaW5lIElORVRfRElBR19QVVQoc2tiLCBhdHRydHlwZSwgYXR0cmxlbikgXAogCVJUQV9EQVRBKF9fUlRBX1BVVChza2IsIGF0dHJ0eXBlLCBhdHRybGVuKSkKIAogc3RhdGljIERFRklORV9NVVRFWChpbmV0X2RpYWdfdGFibGVfbXV0ZXgpOwogCi1zdGF0aWMgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICppbmV0X2RpYWdfbG9ja19oYW5kbGVyKGludCB0eXBlKQorc3RhdGljIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciAqaW5ldF9kaWFnX2xvY2tfaGFuZGxlcihpbnQgcHJvdG8pCiB7Ci0JaWYgKCFpbmV0X2RpYWdfdGFibGVbdHlwZV0pCi0JCXJlcXVlc3RfbW9kdWxlKCJuZXQtcGYtJWQtcHJvdG8tJWQtdHlwZS0lZCIsIFBGX05FVExJTkssCi0JCQkgICAgICAgTkVUTElOS19JTkVUX0RJQUcsIHR5cGUpOworCWlmICghaW5ldF9kaWFnX3RhYmxlW3Byb3RvXSkKKwkJcmVxdWVzdF9tb2R1bGUoIm5ldC1wZi0lZC1wcm90by0lZC10eXBlLSVkLSVkIiwgUEZfTkVUTElOSywKKwkJCSAgICAgICBORVRMSU5LX1NPQ0tfRElBRywgQUZfSU5FVCwgcHJvdG8pOwogCiAJbXV0ZXhfbG9jaygmaW5ldF9kaWFnX3RhYmxlX211dGV4KTsKLQlpZiAoIWluZXRfZGlhZ190YWJsZVt0eXBlXSkKKwlpZiAoIWluZXRfZGlhZ190YWJsZVtwcm90b10pCiAJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOwogCi0JcmV0dXJuIGluZXRfZGlhZ190YWJsZVt0eXBlXTsKKwlyZXR1cm4gaW5ldF9kaWFnX3RhYmxlW3Byb3RvXTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGluZXRfZGlhZ191bmxvY2tfaGFuZGxlcigKQEAgLTcxLDIxICs3MCwyMSBAQAogCW11dGV4X3VubG9jaygmaW5ldF9kaWFnX3RhYmxlX211dGV4KTsKIH0KIAotc3RhdGljIGludCBpbmV0X2Nza19kaWFnX2ZpbGwoc3RydWN0IHNvY2sgKnNrLAotCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgIGludCBleHQsIHUzMiBwaWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKK2ludCBpbmV0X3NrX2RpYWdfZmlsbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzaywKKwkJCSAgICAgIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBpbmV0X2RpYWdfcmVxICpyZXEsCisJCQkgICAgICB1MzIgcGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKnVubGgpCiB7CiAJY29uc3Qgc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwotCWNvbnN0IHN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAlzdHJ1Y3QgaW5ldF9kaWFnX21zZyAqcjsKIAlzdHJ1Y3Qgbmxtc2doZHIgICpubGg7CiAJdm9pZCAqaW5mbyA9IE5VTEw7CiAJc3RydWN0IGluZXRfZGlhZ19tZW1pbmZvICAqbWluZm8gPSBOVUxMOwogCXVuc2lnbmVkIGNoYXIJICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciAqaGFuZGxlcjsKKwlpbnQgZXh0ID0gcmVxLT5pZGlhZ19leHQ7CiAKLQloYW5kbGVyID0gaW5ldF9kaWFnX3RhYmxlW3VubGgtPm5sbXNnX3R5cGVdOworCWhhbmRsZXIgPSBpbmV0X2RpYWdfdGFibGVbcmVxLT5zZGlhZ19wcm90b2NvbF07CiAJQlVHX09OKGhhbmRsZXIgPT0gTlVMTCk7CiAKIAlubGggPSBOTE1TR19QVVQoc2tiLCBwaWQsIHNlcSwgdW5saC0+bmxtc2dfdHlwZSwgc2l6ZW9mKCpyKSk7CkBAIC05Nyw0NyArOTYsNTUgQEAKIAlpZiAoZXh0ICYgKDEgPDwgKElORVRfRElBR19NRU1JTkZPIC0gMSkpKQogCQltaW5mbyA9IElORVRfRElBR19QVVQoc2tiLCBJTkVUX0RJQUdfTUVNSU5GTywgc2l6ZW9mKCptaW5mbykpOwogCi0JaWYgKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfSU5GTyAtIDEpKSkKLQkJaW5mbyA9IElORVRfRElBR19QVVQoc2tiLCBJTkVUX0RJQUdfSU5GTywKLQkJCQkgICAgIGhhbmRsZXItPmlkaWFnX2luZm9fc2l6ZSk7Ci0KLQlpZiAoKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfQ09ORyAtIDEpKSkgJiYgaWNzay0+aWNza19jYV9vcHMpIHsKLQkJY29uc3Qgc2l6ZV90IGxlbiA9IHN0cmxlbihpY3NrLT5pY3NrX2NhX29wcy0+bmFtZSk7Ci0KLQkJc3RyY3B5KElORVRfRElBR19QVVQoc2tiLCBJTkVUX0RJQUdfQ09ORywgbGVuICsgMSksCi0JCSAgICAgICBpY3NrLT5pY3NrX2NhX29wcy0+bmFtZSk7Ci0JfQotCi0JaWYgKChleHQgJiAoMSA8PCAoSU5FVF9ESUFHX1RPUyAtIDEpKSkgJiYgKHNrLT5za19mYW1pbHkgIT0gQUZfSU5FVDYpKQotCQlSVEFfUFVUX1U4KHNrYiwgSU5FVF9ESUFHX1RPUywgaW5ldC0+dG9zKTsKLQogCXItPmlkaWFnX2ZhbWlseSA9IHNrLT5za19mYW1pbHk7CiAJci0+aWRpYWdfc3RhdGUgPSBzay0+c2tfc3RhdGU7CiAJci0+aWRpYWdfdGltZXIgPSAwOwogCXItPmlkaWFnX3JldHJhbnMgPSAwOwogCiAJci0+aWQuaWRpYWdfaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOwotCXItPmlkLmlkaWFnX2Nvb2tpZVswXSA9ICh1MzIpKHVuc2lnbmVkIGxvbmcpc2s7Ci0Jci0+aWQuaWRpYWdfY29va2llWzFdID0gKHUzMikoKCh1bnNpZ25lZCBsb25nKXNrID4+IDMxKSA+PiAxKTsKKwlzb2NrX2RpYWdfc2F2ZV9jb29raWUoc2ssIHItPmlkLmlkaWFnX2Nvb2tpZSk7CiAKIAlyLT5pZC5pZGlhZ19zcG9ydCA9IGluZXQtPmluZXRfc3BvcnQ7CiAJci0+aWQuaWRpYWdfZHBvcnQgPSBpbmV0LT5pbmV0X2Rwb3J0OwogCXItPmlkLmlkaWFnX3NyY1swXSA9IGluZXQtPmluZXRfcmN2X3NhZGRyOwogCXItPmlkLmlkaWFnX2RzdFswXSA9IGluZXQtPmluZXRfZGFkZHI7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisJLyogSVB2NiBkdWFsLXN0YWNrIHNvY2tldHMgdXNlIGluZXQtPnRvcyBmb3IgSVB2NCBjb25uZWN0aW9ucywKKwkgKiBoZW5jZSB0aGlzIG5lZWRzIHRvIGJlIGluY2x1ZGVkIHJlZ2FyZGxlc3Mgb2Ygc29ja2V0IGZhbWlseS4KKwkgKi8KKwlpZiAoZXh0ICYgKDEgPDwgKElORVRfRElBR19UT1MgLSAxKSkpCisJCVJUQV9QVVRfVTgoc2tiLCBJTkVUX0RJQUdfVE9TLCBpbmV0LT50b3MpOworCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlpZiAoci0+aWRpYWdfZmFtaWx5ID09IEFGX0lORVQ2KSB7CiAJCWNvbnN0IHN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKIAotCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopci0+aWQuaWRpYWdfc3JjLAotCQkJICAgICAgICZucC0+cmN2X3NhZGRyKTsKLQkJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKXItPmlkLmlkaWFnX2RzdCwKLQkJCSAgICAgICAmbnAtPmRhZGRyKTsKKwkJKihzdHJ1Y3QgaW42X2FkZHIgKilyLT5pZC5pZGlhZ19zcmMgPSBucC0+cmN2X3NhZGRyOworCQkqKHN0cnVjdCBpbjZfYWRkciAqKXItPmlkLmlkaWFnX2RzdCA9IG5wLT5kYWRkcjsKIAkJaWYgKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfVENMQVNTIC0gMSkpKQogCQkJUlRBX1BVVF9VOChza2IsIElORVRfRElBR19UQ0xBU1MsIG5wLT50Y2xhc3MpOwogCX0KICNlbmRpZgogCisJci0+aWRpYWdfdWlkID0gc29ja19pX3VpZChzayk7CisJci0+aWRpYWdfaW5vZGUgPSBzb2NrX2lfaW5vKHNrKTsKKworCWlmIChtaW5mbykgeworCQltaW5mby0+aWRpYWdfcm1lbSA9IHNrX3JtZW1fYWxsb2NfZ2V0KHNrKTsKKwkJbWluZm8tPmlkaWFnX3dtZW0gPSBzay0+c2tfd21lbV9xdWV1ZWQ7CisJCW1pbmZvLT5pZGlhZ19mbWVtID0gc2stPnNrX2ZvcndhcmRfYWxsb2M7CisJCW1pbmZvLT5pZGlhZ190bWVtID0gc2tfd21lbV9hbGxvY19nZXQoc2spOworCX0KKworCWlmIChleHQgJiAoMSA8PCAoSU5FVF9ESUFHX1NLTUVNSU5GTyAtIDEpKSkKKwkJaWYgKHNvY2tfZGlhZ19wdXRfbWVtaW5mbyhzaywgc2tiLCBJTkVUX0RJQUdfU0tNRU1JTkZPKSkKKwkJCWdvdG8gcnRhdHRyX2ZhaWx1cmU7CisKKwlpZiAoaWNzayA9PSBOVUxMKSB7CisJCXItPmlkaWFnX3JxdWV1ZSA9IHItPmlkaWFnX3dxdWV1ZSA9IDA7CisJCWdvdG8gb3V0OworCX0KKwogI2RlZmluZSBFWFBJUkVTX0lOX01TKHRtbykgIERJVl9ST1VORF9VUCgodG1vIC0gamlmZmllcykgKiAxMDAwLCBIWikKIAogCWlmIChpY3NrLT5pY3NrX3BlbmRpbmcgPT0gSUNTS19USU1FX1JFVFJBTlMpIHsKQEAgLTE1OCwxNCArMTY1LDE0IEBACiAJfQogI3VuZGVmIEVYUElSRVNfSU5fTVMKIAotCXItPmlkaWFnX3VpZCA9IHNvY2tfaV91aWQoc2spOwotCXItPmlkaWFnX2lub2RlID0gc29ja19pX2lubyhzayk7CisJaWYgKGV4dCAmICgxIDw8IChJTkVUX0RJQUdfSU5GTyAtIDEpKSkKKwkJaW5mbyA9IElORVRfRElBR19QVVQoc2tiLCBJTkVUX0RJQUdfSU5GTywgc2l6ZW9mKHN0cnVjdCB0Y3BfaW5mbykpOwogCi0JaWYgKG1pbmZvKSB7Ci0JCW1pbmZvLT5pZGlhZ19ybWVtID0gc2tfcm1lbV9hbGxvY19nZXQoc2spOwotCQltaW5mby0+aWRpYWdfd21lbSA9IHNrLT5za193bWVtX3F1ZXVlZDsKLQkJbWluZm8tPmlkaWFnX2ZtZW0gPSBzay0+c2tfZm9yd2FyZF9hbGxvYzsKLQkJbWluZm8tPmlkaWFnX3RtZW0gPSBza193bWVtX2FsbG9jX2dldChzayk7CisJaWYgKChleHQgJiAoMSA8PCAoSU5FVF9ESUFHX0NPTkcgLSAxKSkpICYmIGljc2stPmljc2tfY2Ffb3BzKSB7CisJCWNvbnN0IHNpemVfdCBsZW4gPSBzdHJsZW4oaWNzay0+aWNza19jYV9vcHMtPm5hbWUpOworCisJCXN0cmNweShJTkVUX0RJQUdfUFVUKHNrYiwgSU5FVF9ESUFHX0NPTkcsIGxlbiArIDEpLAorCQkgICAgICAgaWNzay0+aWNza19jYV9vcHMtPm5hbWUpOwogCX0KIAogCWhhbmRsZXItPmlkaWFnX2dldF9pbmZvKHNrLCByLCBpbmZvKTsKQEAgLTE3NCw2ICsxODEsNyBAQAogCSAgICBpY3NrLT5pY3NrX2NhX29wcyAmJiBpY3NrLT5pY3NrX2NhX29wcy0+Z2V0X2luZm8pCiAJCWljc2stPmljc2tfY2Ffb3BzLT5nZXRfaW5mbyhzaywgZXh0LCBza2IpOwogCitvdXQ6CiAJbmxoLT5ubG1zZ19sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwogCXJldHVybiBza2ItPmxlbjsKIApAQCAtMTgyLDEwICsxOTAsMjAgQEAKIAlubG1zZ190cmltKHNrYiwgYik7CiAJcmV0dXJuIC1FTVNHU0laRTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKGluZXRfc2tfZGlhZ19maWxsKTsKKworc3RhdGljIGludCBpbmV0X2Nza19kaWFnX2ZpbGwoc3RydWN0IHNvY2sgKnNrLAorCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXRfZGlhZ19yZXEgKnJlcSwKKwkJCSAgICAgIHUzMiBwaWQsIHUzMiBzZXEsIHUxNiBubG1zZ19mbGFncywKKwkJCSAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqdW5saCkKK3sKKwlyZXR1cm4gaW5ldF9za19kaWFnX2ZpbGwoc2ssIGluZXRfY3NrKHNrKSwKKwkJCXNrYiwgcmVxLCBwaWQsIHNlcSwgbmxtc2dfZmxhZ3MsIHVubGgpOworfQogCiBzdGF0aWMgaW50IGluZXRfdHdza19kaWFnX2ZpbGwoc3RydWN0IGluZXRfdGltZXdhaXRfc29jayAqdHcsCi0JCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGV4dCwgdTMyIHBpZCwKLQkJCSAgICAgICB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCisJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGluZXRfZGlhZ19yZXEgKnJlcSwKKwkJCSAgICAgICB1MzIgcGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCiAJCQkgICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQogewogCWxvbmcgdG1vOwpAQCAtMjA2LDggKzIyNCw3IEBACiAJci0+aWRpYWdfZmFtaWx5CSAgICAgID0gdHctPnR3X2ZhbWlseTsKIAlyLT5pZGlhZ19yZXRyYW5zICAgICAgPSAwOwogCXItPmlkLmlkaWFnX2lmCSAgICAgID0gdHctPnR3X2JvdW5kX2Rldl9pZjsKLQlyLT5pZC5pZGlhZ19jb29raWVbMF0gPSAodTMyKSh1bnNpZ25lZCBsb25nKXR3OwotCXItPmlkLmlkaWFnX2Nvb2tpZVsxXSA9ICh1MzIpKCgodW5zaWduZWQgbG9uZyl0dyA+PiAzMSkgPj4gMSk7CisJc29ja19kaWFnX3NhdmVfY29va2llKHR3LCByLT5pZC5pZGlhZ19jb29raWUpOwogCXItPmlkLmlkaWFnX3Nwb3J0ICAgICA9IHR3LT50d19zcG9ydDsKIAlyLT5pZC5pZGlhZ19kcG9ydCAgICAgPSB0dy0+dHdfZHBvcnQ7CiAJci0+aWQuaWRpYWdfc3JjWzBdICAgID0gdHctPnR3X3Jjdl9zYWRkcjsKQEAgLTIxOSwxNSArMjM2LDEzIEBACiAJci0+aWRpYWdfd3F1ZXVlCSAgICAgID0gMDsKIAlyLT5pZGlhZ191aWQJICAgICAgPSAwOwogCXItPmlkaWFnX2lub2RlCSAgICAgID0gMDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlpZiAodHctPnR3X2ZhbWlseSA9PSBBRl9JTkVUNikgewogCQljb25zdCBzdHJ1Y3QgaW5ldDZfdGltZXdhaXRfc29jayAqdHc2ID0KIAkJCQkJCWluZXQ2X3R3c2soKHN0cnVjdCBzb2NrICopdHcpOwogCi0JCWlwdjZfYWRkcl9jb3B5KChzdHJ1Y3QgaW42X2FkZHIgKilyLT5pZC5pZGlhZ19zcmMsCi0JCQkgICAgICAgJnR3Ni0+dHdfdjZfcmN2X3NhZGRyKTsKLQkJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKXItPmlkLmlkaWFnX2RzdCwKLQkJCSAgICAgICAmdHc2LT50d192Nl9kYWRkcik7CisJCSooc3RydWN0IGluNl9hZGRyICopci0+aWQuaWRpYWdfc3JjID0gdHc2LT50d192Nl9yY3Zfc2FkZHI7CisJCSooc3RydWN0IGluNl9hZGRyICopci0+aWQuaWRpYWdfZHN0ID0gdHc2LT50d192Nl9kYWRkcjsKIAl9CiAjZW5kaWYKIAlubGgtPm5sbXNnX2xlbiA9IHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIHByZXZpb3VzX3RhaWw7CkBAIC0yMzgsNDIgKzI1MywzMSBAQAogfQogCiBzdGF0aWMgaW50IHNrX2RpYWdfZmlsbChzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IsCi0JCQlpbnQgZXh0LCB1MzIgcGlkLCB1MzIgc2VxLCB1MTYgbmxtc2dfZmxhZ3MsCisJCQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqciwgdTMyIHBpZCwgdTMyIHNlcSwgdTE2IG5sbXNnX2ZsYWdzLAogCQkJY29uc3Qgc3RydWN0IG5sbXNnaGRyICp1bmxoKQogewogCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX1RJTUVfV0FJVCkKIAkJcmV0dXJuIGluZXRfdHdza19kaWFnX2ZpbGwoKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKilzaywKLQkJCQkJICAgc2tiLCBleHQsIHBpZCwgc2VxLCBubG1zZ19mbGFncywKKwkJCQkJICAgc2tiLCByLCBwaWQsIHNlcSwgbmxtc2dfZmxhZ3MsCiAJCQkJCSAgIHVubGgpOwotCXJldHVybiBpbmV0X2Nza19kaWFnX2ZpbGwoc2ssIHNrYiwgZXh0LCBwaWQsIHNlcSwgbmxtc2dfZmxhZ3MsIHVubGgpOworCXJldHVybiBpbmV0X2Nza19kaWFnX2ZpbGwoc2ssIHNrYiwgciwgcGlkLCBzZXEsIG5sbXNnX2ZsYWdzLCB1bmxoKTsKIH0KIAotc3RhdGljIGludCBpbmV0X2RpYWdfZ2V0X2V4YWN0KHN0cnVjdCBza19idWZmICppbl9za2IsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgpCitpbnQgaW5ldF9kaWFnX2R1bXBfb25lX2ljc2soc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvLCBzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAorCQljb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IGluZXRfZGlhZ19yZXEgKnJlcSkKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCBzb2NrICpzazsKLQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqcmVxID0gTkxNU0dfREFUQShubGgpOwogCXN0cnVjdCBza19idWZmICpyZXA7Ci0Jc3RydWN0IGluZXRfaGFzaGluZm8gKmhhc2hpbmZvOwotCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciAqaGFuZGxlcjsKIAotCWhhbmRsZXIgPSBpbmV0X2RpYWdfbG9ja19oYW5kbGVyKG5saC0+bmxtc2dfdHlwZSk7Ci0JaWYgKElTX0VSUihoYW5kbGVyKSkgewotCQllcnIgPSBQVFJfRVJSKGhhbmRsZXIpOwotCQlnb3RvIHVubG9jazsKLQl9Ci0KLQloYXNoaW5mbyA9IGhhbmRsZXItPmlkaWFnX2hhc2hpbmZvOwogCWVyciA9IC1FSU5WQUw7Ci0KLQlpZiAocmVxLT5pZGlhZ19mYW1pbHkgPT0gQUZfSU5FVCkgeworCWlmIChyZXEtPnNkaWFnX2ZhbWlseSA9PSBBRl9JTkVUKSB7CiAJCXNrID0gaW5ldF9sb29rdXAoJmluaXRfbmV0LCBoYXNoaW5mbywgcmVxLT5pZC5pZGlhZ19kc3RbMF0sCiAJCQkJIHJlcS0+aWQuaWRpYWdfZHBvcnQsIHJlcS0+aWQuaWRpYWdfc3JjWzBdLAogCQkJCSByZXEtPmlkLmlkaWFnX3Nwb3J0LCByZXEtPmlkLmlkaWFnX2lmKTsKIAl9Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZCAoQ09ORklHX0lQVjZfTU9EVUxFKQotCWVsc2UgaWYgKHJlcS0+aWRpYWdfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwllbHNlIGlmIChyZXEtPnNkaWFnX2ZhbWlseSA9PSBBRl9JTkVUNikgewogCQlzayA9IGluZXQ2X2xvb2t1cCgmaW5pdF9uZXQsIGhhc2hpbmZvLAogCQkJCSAgKHN0cnVjdCBpbjZfYWRkciAqKXJlcS0+aWQuaWRpYWdfZHN0LAogCQkJCSAgcmVxLT5pZC5pZGlhZ19kcG9ydCwKQEAgLTI4MywyOSArMjg3LDI2IEBACiAJfQogI2VuZGlmCiAJZWxzZSB7Ci0JCWdvdG8gdW5sb2NrOworCQlnb3RvIG91dF9ub3NrOwogCX0KIAogCWVyciA9IC1FTk9FTlQ7CiAJaWYgKHNrID09IE5VTEwpCi0JCWdvdG8gdW5sb2NrOworCQlnb3RvIG91dF9ub3NrOwogCi0JZXJyID0gLUVTVEFMRTsKLQlpZiAoKHJlcS0+aWQuaWRpYWdfY29va2llWzBdICE9IElORVRfRElBR19OT0NPT0tJRSB8fAotCSAgICAgcmVxLT5pZC5pZGlhZ19jb29raWVbMV0gIT0gSU5FVF9ESUFHX05PQ09PS0lFKSAmJgotCSAgICAoKHUzMikodW5zaWduZWQgbG9uZylzayAhPSByZXEtPmlkLmlkaWFnX2Nvb2tpZVswXSB8fAotCSAgICAgKHUzMikoKCgodW5zaWduZWQgbG9uZylzaykgPj4gMzEpID4+IDEpICE9IHJlcS0+aWQuaWRpYWdfY29va2llWzFdKSkKKwllcnIgPSBzb2NrX2RpYWdfY2hlY2tfY29va2llKHNrLCByZXEtPmlkLmlkaWFnX2Nvb2tpZSk7CisJaWYgKGVycikKIAkJZ290byBvdXQ7CiAKIAllcnIgPSAtRU5PTUVNOwogCXJlcCA9IGFsbG9jX3NrYihOTE1TR19TUEFDRSgoc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfbXNnKSArCiAJCQkJICAgICBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19tZW1pbmZvKSArCi0JCQkJICAgICBoYW5kbGVyLT5pZGlhZ19pbmZvX3NpemUgKyA2NCkpLAorCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCB0Y3BfaW5mbykgKyA2NCkpLAogCQkJR0ZQX0tFUk5FTCk7CiAJaWYgKCFyZXApCiAJCWdvdG8gb3V0OwogCi0JZXJyID0gc2tfZGlhZ19maWxsKHNrLCByZXAsIHJlcS0+aWRpYWdfZXh0LAorCWVyciA9IHNrX2RpYWdfZmlsbChzaywgcmVwLCByZXEsCiAJCQkgICBORVRMSU5LX0NCKGluX3NrYikucGlkLAogCQkJICAgbmxoLT5ubG1zZ19zZXEsIDAsIG5saCk7CiAJaWYgKGVyciA8IDApIHsKQEAgLTMxMyw3ICszMTQsNyBAQAogCQlrZnJlZV9za2IocmVwKTsKIAkJZ290byBvdXQ7CiAJfQotCWVyciA9IG5ldGxpbmtfdW5pY2FzdChpZGlhZ25sLCByZXAsIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsCisJZXJyID0gbmV0bGlua191bmljYXN0KHNvY2tfZGlhZ19ubHNrLCByZXAsIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsCiAJCQkgICAgICBNU0dfRE9OVFdBSVQpOwogCWlmIChlcnIgPiAwKQogCQllcnIgPSAwOwpAQCAtMzI1LDggKzMyNiwyNSBAQAogCQllbHNlCiAJCQlzb2NrX3B1dChzayk7CiAJfQotdW5sb2NrOgorb3V0X25vc2s6CisJcmV0dXJuIGVycjsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGluZXRfZGlhZ19kdW1wX29uZV9pY3NrKTsKKworc3RhdGljIGludCBpbmV0X2RpYWdfZ2V0X2V4YWN0KHN0cnVjdCBza19idWZmICppbl9za2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCQkgICAgICAgc3RydWN0IGluZXRfZGlhZ19yZXEgKnJlcSkKK3sKKwljb25zdCBzdHJ1Y3QgaW5ldF9kaWFnX2hhbmRsZXIgKmhhbmRsZXI7CisJaW50IGVycjsKKworCWhhbmRsZXIgPSBpbmV0X2RpYWdfbG9ja19oYW5kbGVyKHJlcS0+c2RpYWdfcHJvdG9jb2wpOworCWlmIChJU19FUlIoaGFuZGxlcikpCisJCWVyciA9IFBUUl9FUlIoaGFuZGxlcik7CisJZWxzZQorCQllcnIgPSBoYW5kbGVyLT5kdW1wX29uZShpbl9za2IsIG5saCwgcmVxKTsKIAlpbmV0X2RpYWdfdW5sb2NrX2hhbmRsZXIoaGFuZGxlcik7CisKIAlyZXR1cm4gZXJyOwogfQogCkBAIC0zNTcsOSArMzc1LDEyIEBACiB9CiAKIAotc3RhdGljIGludCBpbmV0X2RpYWdfYmNfcnVuKGNvbnN0IHZvaWQgKmJjLCBpbnQgbGVuLAotCQkJICAgIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfZW50cnkgKmVudHJ5KQorc3RhdGljIGludCBpbmV0X2RpYWdfYmNfcnVuKGNvbnN0IHN0cnVjdCBubGF0dHIgKl9iYywKKwkJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19lbnRyeSAqZW50cnkpCiB7CisJY29uc3Qgdm9pZCAqYmMgPSBubGFfZGF0YShfYmMpOworCWludCBsZW4gPSBubGFfbGVuKF9iYyk7CisKIAl3aGlsZSAobGVuID4gMCkgewogCQlpbnQgeWVzID0gMTsKIAkJY29uc3Qgc3RydWN0IGluZXRfZGlhZ19iY19vcCAqb3AgPSBiYzsKQEAgLTQzMyw2ICs0NTQsMzUgQEAKIAlyZXR1cm4gbGVuID09IDA7CiB9CiAKK2ludCBpbmV0X2RpYWdfYmNfc2soY29uc3Qgc3RydWN0IG5sYXR0ciAqYmMsIHN0cnVjdCBzb2NrICpzaykKK3sKKwlzdHJ1Y3QgaW5ldF9kaWFnX2VudHJ5IGVudHJ5OworCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKKworCWlmIChiYyA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCWVudHJ5LmZhbWlseSA9IHNrLT5za19mYW1pbHk7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwlpZiAoZW50cnkuZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKKworCQllbnRyeS5zYWRkciA9IG5wLT5yY3Zfc2FkZHIuczZfYWRkcjMyOworCQllbnRyeS5kYWRkciA9IG5wLT5kYWRkci5zNl9hZGRyMzI7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWVudHJ5LnNhZGRyID0gJmluZXQtPmluZXRfcmN2X3NhZGRyOworCQllbnRyeS5kYWRkciA9ICZpbmV0LT5pbmV0X2RhZGRyOworCX0KKwllbnRyeS5zcG9ydCA9IGluZXQtPmluZXRfbnVtOworCWVudHJ5LmRwb3J0ID0gbnRvaHMoaW5ldC0+aW5ldF9kcG9ydCk7CisJZW50cnkudXNlcmxvY2tzID0gc2stPnNrX3VzZXJsb2NrczsKKworCXJldHVybiBpbmV0X2RpYWdfYmNfcnVuKGJjLCAmZW50cnkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaW5ldF9kaWFnX2JjX3NrKTsKKwogc3RhdGljIGludCB2YWxpZF9jYyhjb25zdCB2b2lkICpiYywgaW50IGxlbiwgaW50IGNjKQogewogCXdoaWxlIChsZW4gPj0gMCkgewpAQCAtNDg5LDU3ICs1MzksMjkgQEAKIAogc3RhdGljIGludCBpbmV0X2Nza19kaWFnX2R1bXAoc3RydWN0IHNvY2sgKnNrLAogCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYikKKwkJCSAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCSAgICAgIHN0cnVjdCBpbmV0X2RpYWdfcmVxICpyLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqYmMpCiB7Ci0Jc3RydWN0IGluZXRfZGlhZ19yZXEgKnIgPSBOTE1TR19EQVRBKGNiLT5ubGgpOworCWlmICghaW5ldF9kaWFnX2JjX3NrKGJjLCBzaykpCisJCXJldHVybiAwOwogCi0JaWYgKG5sbXNnX2F0dHJsZW4oY2ItPm5saCwgc2l6ZW9mKCpyKSkpIHsKLQkJc3RydWN0IGluZXRfZGlhZ19lbnRyeSBlbnRyeTsKLQkJY29uc3Qgc3RydWN0IG5sYXR0ciAqYmMgPSBubG1zZ19maW5kX2F0dHIoY2ItPm5saCwKLQkJCQkJCQkgIHNpemVvZigqciksCi0JCQkJCQkJICBJTkVUX0RJQUdfUkVRX0JZVEVDT0RFKTsKLQkJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwotCi0JCWVudHJ5LmZhbWlseSA9IHNrLT5za19mYW1pbHk7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZCAoQ09ORklHX0lQVjZfTU9EVUxFKQotCQlpZiAoZW50cnkuZmFtaWx5ID09IEFGX0lORVQ2KSB7Ci0JCQlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7Ci0KLQkJCWVudHJ5LnNhZGRyID0gbnAtPnJjdl9zYWRkci5zNl9hZGRyMzI7Ci0JCQllbnRyeS5kYWRkciA9IG5wLT5kYWRkci5zNl9hZGRyMzI7Ci0JCX0gZWxzZQotI2VuZGlmCi0JCXsKLQkJCWVudHJ5LnNhZGRyID0gJmluZXQtPmluZXRfcmN2X3NhZGRyOwotCQkJZW50cnkuZGFkZHIgPSAmaW5ldC0+aW5ldF9kYWRkcjsKLQkJfQotCQllbnRyeS5zcG9ydCA9IGluZXQtPmluZXRfbnVtOwotCQllbnRyeS5kcG9ydCA9IG50b2hzKGluZXQtPmluZXRfZHBvcnQpOwotCQllbnRyeS51c2VybG9ja3MgPSBzay0+c2tfdXNlcmxvY2tzOwotCi0JCWlmICghaW5ldF9kaWFnX2JjX3J1bihubGFfZGF0YShiYyksIG5sYV9sZW4oYmMpLCAmZW50cnkpKQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JcmV0dXJuIGluZXRfY3NrX2RpYWdfZmlsbChzaywgc2tiLCByLT5pZGlhZ19leHQsCisJcmV0dXJuIGluZXRfY3NrX2RpYWdfZmlsbChzaywgc2tiLCByLAogCQkJCSAgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCiAJCQkJICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBjYi0+bmxoKTsKIH0KIAogc3RhdGljIGludCBpbmV0X3R3c2tfZGlhZ19kdW1wKHN0cnVjdCBpbmV0X3RpbWV3YWl0X3NvY2sgKnR3LAogCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQorCQkJICAgICAgIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJCSAgICAgICBzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICpiYykKIHsKLQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqciA9IE5MTVNHX0RBVEEoY2ItPm5saCk7Ci0KLQlpZiAobmxtc2dfYXR0cmxlbihjYi0+bmxoLCBzaXplb2YoKnIpKSkgeworCWlmIChiYyAhPSBOVUxMKSB7CiAJCXN0cnVjdCBpbmV0X2RpYWdfZW50cnkgZW50cnk7Ci0JCWNvbnN0IHN0cnVjdCBubGF0dHIgKmJjID0gbmxtc2dfZmluZF9hdHRyKGNiLT5ubGgsCi0JCQkJCQkJICBzaXplb2YoKnIpLAotCQkJCQkJCSAgSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSk7CiAKIAkJZW50cnkuZmFtaWx5ID0gdHctPnR3X2ZhbWlseTsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJaWYgKHR3LT50d19mYW1pbHkgPT0gQUZfSU5FVDYpIHsKIAkJCXN0cnVjdCBpbmV0Nl90aW1ld2FpdF9zb2NrICp0dzYgPQogCQkJCQkJaW5ldDZfdHdzaygoc3RydWN0IHNvY2sgKil0dyk7CkBAIC01NTUsMTEgKzU3NywxMSBAQAogCQllbnRyeS5kcG9ydCA9IG50b2hzKHR3LT50d19kcG9ydCk7CiAJCWVudHJ5LnVzZXJsb2NrcyA9IDA7CiAKLQkJaWYgKCFpbmV0X2RpYWdfYmNfcnVuKG5sYV9kYXRhKGJjKSwgbmxhX2xlbihiYyksICZlbnRyeSkpCisJCWlmICghaW5ldF9kaWFnX2JjX3J1bihiYywgJmVudHJ5KSkKIAkJCXJldHVybiAwOwogCX0KIAotCXJldHVybiBpbmV0X3R3c2tfZGlhZ19maWxsKHR3LCBza2IsIHItPmlkaWFnX2V4dCwKKwlyZXR1cm4gaW5ldF90d3NrX2RpYWdfZmlsbCh0dywgc2tiLCByLAogCQkJCSAgIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAogCQkJCSAgIGNiLT5ubGgtPm5sbXNnX3NlcSwgTkxNX0ZfTVVMVEksIGNiLT5ubGgpOwogfQpAQCAtNTg1LDggKzYwNyw3IEBACiAJci0+aWRpYWdfcmV0cmFucyA9IHJlcS0+cmV0cmFuczsKIAogCXItPmlkLmlkaWFnX2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKLQlyLT5pZC5pZGlhZ19jb29raWVbMF0gPSAodTMyKSh1bnNpZ25lZCBsb25nKXJlcTsKLQlyLT5pZC5pZGlhZ19jb29raWVbMV0gPSAodTMyKSgoKHVuc2lnbmVkIGxvbmcpcmVxID4+IDMxKSA+PiAxKTsKKwlzb2NrX2RpYWdfc2F2ZV9jb29raWUocmVxLCByLT5pZC5pZGlhZ19jb29raWUpOwogCiAJdG1vID0gcmVxLT5leHBpcmVzIC0gamlmZmllczsKIAlpZiAodG1vIDwgMCkKQEAgLTYwMSwxMiArNjIyLDEwIEBACiAJci0+aWRpYWdfd3F1ZXVlID0gMDsKIAlyLT5pZGlhZ191aWQgPSBzb2NrX2lfdWlkKHNrKTsKIAlyLT5pZGlhZ19pbm9kZSA9IDA7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZCAoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJaWYgKHItPmlkaWFnX2ZhbWlseSA9PSBBRl9JTkVUNikgewotCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopci0+aWQuaWRpYWdfc3JjLAotCQkJICAgICAgICZpbmV0Nl9yc2socmVxKS0+bG9jX2FkZHIpOwotCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopci0+aWQuaWRpYWdfZHN0LAotCQkJICAgICAgICZpbmV0Nl9yc2socmVxKS0+cm10X2FkZHIpOworCQkqKHN0cnVjdCBpbjZfYWRkciAqKXItPmlkLmlkaWFnX3NyYyA9IGluZXQ2X3JzayhyZXEpLT5sb2NfYWRkcjsKKwkJKihzdHJ1Y3QgaW42X2FkZHIgKilyLT5pZC5pZGlhZ19kc3QgPSBpbmV0Nl9yc2socmVxKS0+cm10X2FkZHI7CiAJfQogI2VuZGlmCiAJbmxoLT5ubG1zZ19sZW4gPSBza2JfdGFpbF9wb2ludGVyKHNrYikgLSBiOwpAQCAtNjE5LDEzICs2MzgsMTMgQEAKIH0KIAogc3RhdGljIGludCBpbmV0X2RpYWdfZHVtcF9yZXFzKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzb2NrICpzaywKLQkJCSAgICAgICBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCisJCQkgICAgICAgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQkJICAgICAgIHN0cnVjdCBpbmV0X2RpYWdfcmVxICpyLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmJjKQogewogCXN0cnVjdCBpbmV0X2RpYWdfZW50cnkgZW50cnk7Ci0Jc3RydWN0IGluZXRfZGlhZ19yZXEgKnIgPSBOTE1TR19EQVRBKGNiLT5ubGgpOwogCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKIAlzdHJ1Y3QgbGlzdGVuX3NvY2sgKmxvcHQ7Ci0JY29uc3Qgc3RydWN0IG5sYXR0ciAqYmMgPSBOVUxMOwogCXN0cnVjdCBpbmV0X3NvY2sgKmluZXQgPSBpbmV0X3NrKHNrKTsKIAlpbnQgaiwgc19qOwogCWludCByZXFudW0sIHNfcmVxbnVtOwpAQCAtNjQ1LDkgKzY2NCw3IEBACiAJaWYgKCFsb3B0IHx8ICFsb3B0LT5xbGVuKQogCQlnb3RvIG91dDsKIAotCWlmIChubG1zZ19hdHRybGVuKGNiLT5ubGgsIHNpemVvZigqcikpKSB7Ci0JCWJjID0gbmxtc2dfZmluZF9hdHRyKGNiLT5ubGgsIHNpemVvZigqciksCi0JCQkJICAgICBJTkVUX0RJQUdfUkVRX0JZVEVDT0RFKTsKKwlpZiAoYmMgIT0gTlVMTCkgewogCQllbnRyeS5zcG9ydCA9IGluZXQtPmluZXRfbnVtOwogCQllbnRyeS51c2VybG9ja3MgPSBzay0+c2tfdXNlcmxvY2tzOwogCX0KQEAgLTY2NywyMSArNjg0LDIwIEBACiAKIAkJCWlmIChiYykgewogCQkJCWVudHJ5LnNhZGRyID0KLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJCQkJKGVudHJ5LmZhbWlseSA9PSBBRl9JTkVUNikgPwogCQkJCQlpbmV0Nl9yc2socmVxKS0+bG9jX2FkZHIuczZfYWRkcjMyIDoKICNlbmRpZgogCQkJCQkmaXJlcS0+bG9jX2FkZHI7CiAJCQkJZW50cnkuZGFkZHIgPQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQgKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCQkJCQkoZW50cnkuZmFtaWx5ID09IEFGX0lORVQ2KSA/CiAJCQkJCWluZXQ2X3JzayhyZXEpLT5ybXRfYWRkci5zNl9hZGRyMzIgOgogI2VuZGlmCiAJCQkJCSZpcmVxLT5ybXRfYWRkcjsKIAkJCQllbnRyeS5kcG9ydCA9IG50b2hzKGlyZXEtPnJtdF9wb3J0KTsKIAotCQkJCWlmICghaW5ldF9kaWFnX2JjX3J1bihubGFfZGF0YShiYyksCi0JCQkJCQkgICAgICBubGFfbGVuKGJjKSwgJmVudHJ5KSkKKwkJCQlpZiAoIWluZXRfZGlhZ19iY19ydW4oYmMsICZlbnRyeSkpCiAJCQkJCWNvbnRpbnVlOwogCQkJfQogCkBAIC03MDQsMTkgKzcyMCwxMSBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgaW5ldF9kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQordm9pZCBpbmV0X2RpYWdfZHVtcF9pY3NrKHN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbywgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLCBzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqciwgc3RydWN0IG5sYXR0ciAqYmMpCiB7CiAJaW50IGksIG51bTsKIAlpbnQgc19pLCBzX251bTsKLQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqciA9IE5MTVNHX0RBVEEoY2ItPm5saCk7Ci0JY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoYW5kbGVyOwotCXN0cnVjdCBpbmV0X2hhc2hpbmZvICpoYXNoaW5mbzsKLQotCWhhbmRsZXIgPSBpbmV0X2RpYWdfbG9ja19oYW5kbGVyKGNiLT5ubGgtPm5sbXNnX3R5cGUpOwotCWlmIChJU19FUlIoaGFuZGxlcikpCi0JCWdvdG8gdW5sb2NrOwotCi0JaGFzaGluZm8gPSBoYW5kbGVyLT5pZGlhZ19oYXNoaW5mbzsKIAogCXNfaSA9IGNiLT5hcmdzWzFdOwogCXNfbnVtID0gbnVtID0gY2ItPmFyZ3NbMl07CkBAIC03NDEsNiArNzQ5LDEwIEBACiAJCQkJCWNvbnRpbnVlOwogCQkJCX0KIAorCQkJCWlmIChyLT5zZGlhZ19mYW1pbHkgIT0gQUZfVU5TUEVDICYmCisJCQkJCQlzay0+c2tfZmFtaWx5ICE9IHItPnNkaWFnX2ZhbWlseSkKKwkJCQkJZ290byBuZXh0X2xpc3RlbjsKKwogCQkJCWlmIChyLT5pZC5pZGlhZ19zcG9ydCAhPSBpbmV0LT5pbmV0X3Nwb3J0ICYmCiAJCQkJICAgIHItPmlkLmlkaWFnX3Nwb3J0KQogCQkJCQlnb3RvIG5leHRfbGlzdGVuOwpAQCAtNzUwLDcgKzc2Miw3IEBACiAJCQkJICAgIGNiLT5hcmdzWzNdID4gMCkKIAkJCQkJZ290byBzeW5fcmVjdjsKIAotCQkJCWlmIChpbmV0X2Nza19kaWFnX2R1bXAoc2ssIHNrYiwgY2IpIDwgMCkgeworCQkJCWlmIChpbmV0X2Nza19kaWFnX2R1bXAoc2ssIHNrYiwgY2IsIHIsIGJjKSA8IDApIHsKIAkJCQkJc3Bpbl91bmxvY2tfYmgoJmlsYi0+bG9jayk7CiAJCQkJCWdvdG8gZG9uZTsKIAkJCQl9CkBAIC03NTksNyArNzcxLDcgQEAKIAkJCQlpZiAoIShyLT5pZGlhZ19zdGF0ZXMgJiBUQ1BGX1NZTl9SRUNWKSkKIAkJCQkJZ290byBuZXh0X2xpc3RlbjsKIAotCQkJCWlmIChpbmV0X2RpYWdfZHVtcF9yZXFzKHNrYiwgc2ssIGNiKSA8IDApIHsKKwkJCQlpZiAoaW5ldF9kaWFnX2R1bXBfcmVxcyhza2IsIHNrLCBjYiwgciwgYmMpIDwgMCkgewogCQkJCQlzcGluX3VubG9ja19iaCgmaWxiLT5sb2NrKTsKIAkJCQkJZ290byBkb25lOwogCQkJCX0KQEAgLTc4MSw3ICs3OTMsNyBAQAogCX0KIAogCWlmICghKHItPmlkaWFnX3N0YXRlcyAmIH4oVENQRl9MSVNURU4gfCBUQ1BGX1NZTl9SRUNWKSkpCi0JCWdvdG8gdW5sb2NrOworCQlnb3RvIG91dDsKIAogCWZvciAoaSA9IHNfaTsgaSA8PSBoYXNoaW5mby0+ZWhhc2hfbWFzazsgaSsrKSB7CiAJCXN0cnVjdCBpbmV0X2VoYXNoX2J1Y2tldCAqaGVhZCA9ICZoYXNoaW5mby0+ZWhhc2hbaV07CkBAIC04MDYsMTMgKzgxOCwxNiBAQAogCQkJCWdvdG8gbmV4dF9ub3JtYWw7CiAJCQlpZiAoIShyLT5pZGlhZ19zdGF0ZXMgJiAoMSA8PCBzay0+c2tfc3RhdGUpKSkKIAkJCQlnb3RvIG5leHRfbm9ybWFsOworCQkJaWYgKHItPnNkaWFnX2ZhbWlseSAhPSBBRl9VTlNQRUMgJiYKKwkJCQkJc2stPnNrX2ZhbWlseSAhPSByLT5zZGlhZ19mYW1pbHkpCisJCQkJZ290byBuZXh0X25vcm1hbDsKIAkJCWlmIChyLT5pZC5pZGlhZ19zcG9ydCAhPSBpbmV0LT5pbmV0X3Nwb3J0ICYmCiAJCQkgICAgci0+aWQuaWRpYWdfc3BvcnQpCiAJCQkJZ290byBuZXh0X25vcm1hbDsKIAkJCWlmIChyLT5pZC5pZGlhZ19kcG9ydCAhPSBpbmV0LT5pbmV0X2Rwb3J0ICYmCiAJCQkgICAgci0+aWQuaWRpYWdfZHBvcnQpCiAJCQkJZ290byBuZXh0X25vcm1hbDsKLQkJCWlmIChpbmV0X2Nza19kaWFnX2R1bXAoc2ssIHNrYiwgY2IpIDwgMCkgeworCQkJaWYgKGluZXRfY3NrX2RpYWdfZHVtcChzaywgc2tiLCBjYiwgciwgYmMpIDwgMCkgewogCQkJCXNwaW5fdW5sb2NrX2JoKGxvY2spOwogCQkJCWdvdG8gZG9uZTsKIAkJCX0KQEAgLTgyOCwxMyArODQzLDE2IEBACiAKIAkJCQlpZiAobnVtIDwgc19udW0pCiAJCQkJCWdvdG8gbmV4dF9keWluZzsKKwkJCQlpZiAoci0+c2RpYWdfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJgorCQkJCQkJdHctPnR3X2ZhbWlseSAhPSByLT5zZGlhZ19mYW1pbHkpCisJCQkJCWdvdG8gbmV4dF9keWluZzsKIAkJCQlpZiAoci0+aWQuaWRpYWdfc3BvcnQgIT0gdHctPnR3X3Nwb3J0ICYmCiAJCQkJICAgIHItPmlkLmlkaWFnX3Nwb3J0KQogCQkJCQlnb3RvIG5leHRfZHlpbmc7CiAJCQkJaWYgKHItPmlkLmlkaWFnX2Rwb3J0ICE9IHR3LT50d19kcG9ydCAmJgogCQkJCSAgICByLT5pZC5pZGlhZ19kcG9ydCkKIAkJCQkJZ290byBuZXh0X2R5aW5nOwotCQkJCWlmIChpbmV0X3R3c2tfZGlhZ19kdW1wKHR3LCBza2IsIGNiKSA8IDApIHsKKwkJCQlpZiAoaW5ldF90d3NrX2RpYWdfZHVtcCh0dywgc2tiLCBjYiwgciwgYmMpIDwgMCkgewogCQkJCQlzcGluX3VubG9ja19iaChsb2NrKTsKIAkJCQkJZ290byBkb25lOwogCQkJCX0KQEAgLTg0OCwxNSArODY2LDg1IEBACiBkb25lOgogCWNiLT5hcmdzWzFdID0gaTsKIAljYi0+YXJnc1syXSA9IG51bTsKLXVubG9jazoKK291dDoKKwk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChpbmV0X2RpYWdfZHVtcF9pY3NrKTsKKworc3RhdGljIGludCBfX2luZXRfZGlhZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJc3RydWN0IGluZXRfZGlhZ19yZXEgKnIsIHN0cnVjdCBubGF0dHIgKmJjKQoreworCWNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciAqaGFuZGxlcjsKKworCWhhbmRsZXIgPSBpbmV0X2RpYWdfbG9ja19oYW5kbGVyKHItPnNkaWFnX3Byb3RvY29sKTsKKwlpZiAoIUlTX0VSUihoYW5kbGVyKSkKKwkJaGFuZGxlci0+ZHVtcChza2IsIGNiLCByLCBiYyk7CiAJaW5ldF9kaWFnX3VubG9ja19oYW5kbGVyKGhhbmRsZXIpOworCiAJcmV0dXJuIHNrYi0+bGVuOwogfQogCi1zdGF0aWMgaW50IGluZXRfZGlhZ19yY3ZfbXNnKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQorc3RhdGljIGludCBpbmV0X2RpYWdfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCiB7CisJc3RydWN0IG5sYXR0ciAqYmMgPSBOVUxMOwogCWludCBoZHJsZW4gPSBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19yZXEpOwogCisJaWYgKG5sbXNnX2F0dHJsZW4oY2ItPm5saCwgaGRybGVuKSkKKwkJYmMgPSBubG1zZ19maW5kX2F0dHIoY2ItPm5saCwgaGRybGVuLCBJTkVUX0RJQUdfUkVRX0JZVEVDT0RFKTsKKworCXJldHVybiBfX2luZXRfZGlhZ19kdW1wKHNrYiwgY2IsIChzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqKU5MTVNHX0RBVEEoY2ItPm5saCksIGJjKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaW5ldF9kaWFnX3R5cGUycHJvdG8oaW50IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBUQ1BESUFHX0dFVFNPQ0s6CisJCXJldHVybiBJUFBST1RPX1RDUDsKKwljYXNlIERDQ1BESUFHX0dFVFNPQ0s6CisJCXJldHVybiBJUFBST1RPX0RDQ1A7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGluZXRfZGlhZ19kdW1wX2NvbXBhdChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IGluZXRfZGlhZ19yZXFfY29tcGF0ICpyYyA9IE5MTVNHX0RBVEEoY2ItPm5saCk7CisJc3RydWN0IGluZXRfZGlhZ19yZXEgcmVxOworCXN0cnVjdCBubGF0dHIgKmJjID0gTlVMTDsKKwlpbnQgaGRybGVuID0gc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfcmVxX2NvbXBhdCk7CisKKwlyZXEuc2RpYWdfZmFtaWx5ID0gQUZfVU5TUEVDOyAvKiBjb21wYXRpYmlsaXR5ICovCisJcmVxLnNkaWFnX3Byb3RvY29sID0gaW5ldF9kaWFnX3R5cGUycHJvdG8oY2ItPm5saC0+bmxtc2dfdHlwZSk7CisJcmVxLmlkaWFnX2V4dCA9IHJjLT5pZGlhZ19leHQ7CisJcmVxLmlkaWFnX3N0YXRlcyA9IHJjLT5pZGlhZ19zdGF0ZXM7CisJcmVxLmlkID0gcmMtPmlkOworCisJaWYgKG5sbXNnX2F0dHJsZW4oY2ItPm5saCwgaGRybGVuKSkKKwkJYmMgPSBubG1zZ19maW5kX2F0dHIoY2ItPm5saCwgaGRybGVuLCBJTkVUX0RJQUdfUkVRX0JZVEVDT0RFKTsKKworCXJldHVybiBfX2luZXRfZGlhZ19kdW1wKHNrYiwgY2IsICZyZXEsIGJjKTsKK30KKworc3RhdGljIGludCBpbmV0X2RpYWdfZ2V0X2V4YWN0X2NvbXBhdChzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoKQoreworCXN0cnVjdCBpbmV0X2RpYWdfcmVxX2NvbXBhdCAqcmMgPSBOTE1TR19EQVRBKG5saCk7CisJc3RydWN0IGluZXRfZGlhZ19yZXEgcmVxOworCisJcmVxLnNkaWFnX2ZhbWlseSA9IHJjLT5pZGlhZ19mYW1pbHk7CisJcmVxLnNkaWFnX3Byb3RvY29sID0gaW5ldF9kaWFnX3R5cGUycHJvdG8obmxoLT5ubG1zZ190eXBlKTsKKwlyZXEuaWRpYWdfZXh0ID0gcmMtPmlkaWFnX2V4dDsKKwlyZXEuaWRpYWdfc3RhdGVzID0gcmMtPmlkaWFnX3N0YXRlczsKKwlyZXEuaWQgPSByYy0+aWQ7CisKKwlyZXR1cm4gaW5ldF9kaWFnX2dldF9leGFjdChpbl9za2IsIG5saCwgJnJlcSk7Cit9CisKK3N0YXRpYyBpbnQgaW5ldF9kaWFnX3Jjdl9tc2dfY29tcGF0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBubG1zZ2hkciAqbmxoKQoreworCWludCBoZHJsZW4gPSBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19yZXFfY29tcGF0KTsKKwogCWlmIChubGgtPm5sbXNnX3R5cGUgPj0gSU5FVF9ESUFHX0dFVFNPQ0tfTUFYIHx8CiAJICAgIG5sbXNnX2xlbihubGgpIDwgaGRybGVuKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTg3MywyOCArOTYxLDU0IEBACiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KIAotCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KGlkaWFnbmwsIHNrYiwgbmxoLAorCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KHNvY2tfZGlhZ19ubHNrLCBza2IsIG5saCwKKwkJCQkJICBpbmV0X2RpYWdfZHVtcF9jb21wYXQsIE5VTEwsIDApOworCX0KKworCXJldHVybiBpbmV0X2RpYWdfZ2V0X2V4YWN0X2NvbXBhdChza2IsIG5saCk7Cit9CisKK3N0YXRpYyBpbnQgaW5ldF9kaWFnX2hhbmRsZXJfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgbmxtc2doZHIgKmgpCit7CisJaW50IGhkcmxlbiA9IHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX3JlcSk7CisKKwlpZiAobmxtc2dfbGVuKGgpIDwgaGRybGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0RVTVApIHsKKwkJaWYgKG5sbXNnX2F0dHJsZW4oaCwgaGRybGVuKSkgeworCQkJc3RydWN0IG5sYXR0ciAqYXR0cjsKKwkJCWF0dHIgPSBubG1zZ19maW5kX2F0dHIoaCwgaGRybGVuLAorCQkJCQkgICAgICAgSU5FVF9ESUFHX1JFUV9CWVRFQ09ERSk7CisJCQlpZiAoYXR0ciA9PSBOVUxMIHx8CisJCQkgICAgbmxhX2xlbihhdHRyKSA8IHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX2JjX29wKSB8fAorCQkJICAgIGluZXRfZGlhZ19iY19hdWRpdChubGFfZGF0YShhdHRyKSwgbmxhX2xlbihhdHRyKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KHNvY2tfZGlhZ19ubHNrLCBza2IsIGgsCiAJCQkJCSAgaW5ldF9kaWFnX2R1bXAsIE5VTEwsIDApOwogCX0KIAotCXJldHVybiBpbmV0X2RpYWdfZ2V0X2V4YWN0KHNrYiwgbmxoKTsKKwlyZXR1cm4gaW5ldF9kaWFnX2dldF9leGFjdChza2IsIGgsIChzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqKU5MTVNHX0RBVEEoaCkpOwogfQogCi1zdGF0aWMgREVGSU5FX01VVEVYKGluZXRfZGlhZ19tdXRleCk7CitzdGF0aWMgc3RydWN0IHNvY2tfZGlhZ19oYW5kbGVyIGluZXRfZGlhZ19oYW5kbGVyID0geworCS5mYW1pbHkgPSBBRl9JTkVULAorCS5kdW1wID0gaW5ldF9kaWFnX2hhbmRsZXJfZHVtcCwKK307CiAKLXN0YXRpYyB2b2lkIGluZXRfZGlhZ19yY3Yoc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQltdXRleF9sb2NrKCZpbmV0X2RpYWdfbXV0ZXgpOwotCW5ldGxpbmtfcmN2X3NrYihza2IsICZpbmV0X2RpYWdfcmN2X21zZyk7Ci0JbXV0ZXhfdW5sb2NrKCZpbmV0X2RpYWdfbXV0ZXgpOwotfQorc3RhdGljIHN0cnVjdCBzb2NrX2RpYWdfaGFuZGxlciBpbmV0Nl9kaWFnX2hhbmRsZXIgPSB7CisJLmZhbWlseSA9IEFGX0lORVQ2LAorCS5kdW1wID0gaW5ldF9kaWFnX2hhbmRsZXJfZHVtcCwKK307CiAKIGludCBpbmV0X2RpYWdfcmVnaXN0ZXIoY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICpoKQogewogCWNvbnN0IF9fdTE2IHR5cGUgPSBoLT5pZGlhZ190eXBlOwogCWludCBlcnIgPSAtRUlOVkFMOwogCi0JaWYgKHR5cGUgPj0gSU5FVF9ESUFHX0dFVFNPQ0tfTUFYKQorCWlmICh0eXBlID49IElQUFJPVE9fTUFYKQogCQlnb3RvIG91dDsKIAogCW11dGV4X2xvY2soJmluZXRfZGlhZ190YWJsZV9tdXRleCk7CkBAIC05MTMsNyArMTAyNyw3IEBACiB7CiAJY29uc3QgX191MTYgdHlwZSA9IGgtPmlkaWFnX3R5cGU7CiAKLQlpZiAodHlwZSA+PSBJTkVUX0RJQUdfR0VUU09DS19NQVgpCisJaWYgKHR5cGUgPj0gSVBQUk9UT19NQVgpCiAJCXJldHVybjsKIAogCW11dGV4X2xvY2soJmluZXRfZGlhZ190YWJsZV9tdXRleCk7CkBAIC05MjQsNyArMTAzOCw3IEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGluZXRfZGlhZ19pbml0KHZvaWQpCiB7Ci0JY29uc3QgaW50IGluZXRfZGlhZ190YWJsZV9zaXplID0gKElORVRfRElBR19HRVRTT0NLX01BWCAqCisJY29uc3QgaW50IGluZXRfZGlhZ190YWJsZV9zaXplID0gKElQUFJPVE9fTUFYICoKIAkJCQkJICBzaXplb2Yoc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyICopKTsKIAlpbnQgZXJyID0gLUVOT01FTTsKIApAQCAtOTMyLDI1ICsxMDQ2LDM1IEBACiAJaWYgKCFpbmV0X2RpYWdfdGFibGUpCiAJCWdvdG8gb3V0OwogCi0JaWRpYWdubCA9IG5ldGxpbmtfa2VybmVsX2NyZWF0ZSgmaW5pdF9uZXQsIE5FVExJTktfSU5FVF9ESUFHLCAwLAotCQkJCQlpbmV0X2RpYWdfcmN2LCBOVUxMLCBUSElTX01PRFVMRSk7Ci0JaWYgKGlkaWFnbmwgPT0gTlVMTCkKLQkJZ290byBvdXRfZnJlZV90YWJsZTsKLQllcnIgPSAwOworCWVyciA9IHNvY2tfZGlhZ19yZWdpc3RlcigmaW5ldF9kaWFnX2hhbmRsZXIpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2ZyZWVfbmw7CisKKwllcnIgPSBzb2NrX2RpYWdfcmVnaXN0ZXIoJmluZXQ2X2RpYWdfaGFuZGxlcik7CisJaWYgKGVycikKKwkJZ290byBvdXRfZnJlZV9pbmV0OworCisJc29ja19kaWFnX3JlZ2lzdGVyX2luZXRfY29tcGF0KGluZXRfZGlhZ19yY3ZfbXNnX2NvbXBhdCk7CiBvdXQ6CiAJcmV0dXJuIGVycjsKLW91dF9mcmVlX3RhYmxlOgorCitvdXRfZnJlZV9pbmV0OgorCXNvY2tfZGlhZ191bnJlZ2lzdGVyKCZpbmV0X2RpYWdfaGFuZGxlcik7CitvdXRfZnJlZV9ubDoKIAlrZnJlZShpbmV0X2RpYWdfdGFibGUpOwogCWdvdG8gb3V0OwogfQogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaW5ldF9kaWFnX2V4aXQodm9pZCkKIHsKLQluZXRsaW5rX2tlcm5lbF9yZWxlYXNlKGlkaWFnbmwpOworCXNvY2tfZGlhZ191bnJlZ2lzdGVyKCZpbmV0Nl9kaWFnX2hhbmRsZXIpOworCXNvY2tfZGlhZ191bnJlZ2lzdGVyKCZpbmV0X2RpYWdfaGFuZGxlcik7CisJc29ja19kaWFnX3VucmVnaXN0ZXJfaW5ldF9jb21wYXQoaW5ldF9kaWFnX3Jjdl9tc2dfY29tcGF0KTsKIAlrZnJlZShpbmV0X2RpYWdfdGFibGUpOwogfQogCiBtb2R1bGVfaW5pdChpbmV0X2RpYWdfaW5pdCk7CiBtb2R1bGVfZXhpdChpbmV0X2RpYWdfZXhpdCk7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7Ci1NT0RVTEVfQUxJQVNfTkVUX1BGX1BST1RPKFBGX05FVExJTkssIE5FVExJTktfSU5FVF9ESUFHKTsKK01PRFVMRV9BTElBU19ORVRfUEZfUFJPVE9fVFlQRShQRl9ORVRMSU5LLCBORVRMSU5LX1NPQ0tfRElBRywgMiAvKiBBRl9JTkVUICovKTsKK01PRFVMRV9BTElBU19ORVRfUEZfUFJPVE9fVFlQRShQRl9ORVRMSU5LLCBORVRMSU5LX1NPQ0tfRElBRywgMTAgLyogQUZfSU5FVDYgKi8pOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfZm9yd2FyZC5jIGIvbmV0L2lwdjQvaXBfZm9yd2FyZC5jCmluZGV4IDNiMzRkMWMuLjI5YTA3YjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2ZvcndhcmQuYworKysgYi9uZXQvaXB2NC9pcF9mb3J3YXJkLmMKQEAgLTg0LDcgKzg0LDcgQEAKIAogCXJ0ID0gc2tiX3J0YWJsZShza2IpOwogCi0JaWYgKG9wdC0+aXNfc3RyaWN0cm91dGUgJiYgaXBfaGRyKHNrYiktPmRhZGRyICE9IHJ0LT5ydF9nYXRld2F5KQorCWlmIChvcHQtPmlzX3N0cmljdHJvdXRlICYmIG9wdC0+bmV4dGhvcCAhPSBydC0+cnRfZ2F0ZXdheSkKIAkJZ290byBzcl9mYWlsZWQ7CiAKIAlpZiAodW5saWtlbHkoc2tiLT5sZW4gPiBkc3RfbXR1KCZydC0+ZHN0KSAmJiAhc2tiX2lzX2dzbyhza2IpICYmCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9pcF9ncmUuYyBiL25ldC9pcHY0L2lwX2dyZS5jCmluZGV4IGQ1NTExMGUuLjJiNTNhMWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX2dyZS5jCisrKyBiL25ldC9pcHY0L2lwX2dyZS5jCkBAIC00Niw3ICs0Niw3IEBACiAjaW5jbHVkZSA8bmV0L3J0bmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9ncmUuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNpbmNsdWRlIDxuZXQvaXA2X2ZpYi5oPgogI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KQEAgLTE3MSw3ICsxNzEsNyBAQAogCXVuc2lnbmVkIGxvbmcJcnhfYnl0ZXM7CiAJdW5zaWduZWQgbG9uZwl0eF9wYWNrZXRzOwogCXVuc2lnbmVkIGxvbmcJdHhfYnl0ZXM7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkpOwogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwZ3JlX2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtNzI5LDkgKzcyOSw5IEBACiAJCQlpZiAoKGRzdCA9IHJ0LT5ydF9nYXRld2F5KSA9PSAwKQogCQkJCWdvdG8gdHhfZXJyb3JfaWNtcDsKIAkJfQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCWVsc2UgaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKLQkJCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoc2tiX2RzdChza2IpKTsKKwkJCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoc2tiX2RzdChza2IpKTsKIAkJCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcjY7CiAJCQlpbnQgYWRkcl90eXBlOwogCkBAIC03OTksNyArNzk5LDcgQEAKIAkJCWdvdG8gdHhfZXJyb3I7CiAJCX0KIAl9Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKSB7CiAJCXN0cnVjdCBydDZfaW5mbyAqcnQ2ID0gKHN0cnVjdCBydDZfaW5mbyAqKXNrYl9kc3Qoc2tiKTsKIApAQCAtODM1LDYgKzgzNSw4IEBACiAJaWYgKHNrYl9oZWFkcm9vbShza2IpIDwgbWF4X2hlYWRyb29tIHx8IHNrYl9zaGFyZWQoc2tiKXx8CiAJICAgIChza2JfY2xvbmVkKHNrYikgJiYgIXNrYl9jbG9uZV93cml0YWJsZShza2IsIDApKSkgewogCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV3X3NrYiA9IHNrYl9yZWFsbG9jX2hlYWRyb29tKHNrYiwgbWF4X2hlYWRyb29tKTsKKwkJaWYgKG1heF9oZWFkcm9vbSA+IGRldi0+bmVlZGVkX2hlYWRyb29tKQorCQkJZGV2LT5uZWVkZWRfaGVhZHJvb20gPSBtYXhfaGVhZHJvb207CiAJCWlmICghbmV3X3NrYikgewogCQkJaXBfcnRfcHV0KHJ0KTsKIAkJCWRldi0+c3RhdHMudHhfZHJvcHBlZCsrOwpAQCAtODczLDcgKzg3NSw3IEBACiAJaWYgKChpcGgtPnR0bCA9IHRpcGgtPnR0bCkgPT0gMCkgewogCQlpZiAoc2tiLT5wcm90b2NvbCA9PSBodG9ucyhFVEhfUF9JUCkpCiAJCQlpcGgtPnR0bCA9IG9sZF9pcGgtPnR0bDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCQllbHNlIGlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKQogCQkJaXBoLT50dGwgPSAoKGNvbnN0IHN0cnVjdCBpcHY2aGRyICopb2xkX2lwaCktPmhvcF9saW1pdDsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3B0aW9ucy5jIGIvbmV0L2lwdjQvaXBfb3B0aW9ucy5jCmluZGV4IDA1ZDIwY2MuLjFlNjBmNzYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX29wdGlvbnMuYworKysgYi9uZXQvaXB2NC9pcF9vcHRpb25zLmMKQEAgLTU2OCwxMiArNTY4LDEzIEBACiAJCSAgICAgKSB7CiAJCQlpZiAoc3JycHRyICsgMyA+IHNycnNwYWNlKQogCQkJCWJyZWFrOwotCQkJaWYgKG1lbWNtcCgmaXBfaGRyKHNrYiktPmRhZGRyLCAmb3B0cHRyW3NycnB0ci0xXSwgNCkgPT0gMCkKKwkJCWlmIChtZW1jbXAoJm9wdC0+bmV4dGhvcCwgJm9wdHB0cltzcnJwdHItMV0sIDQpID09IDApCiAJCQkJYnJlYWs7CiAJCX0KIAkJaWYgKHNycnB0ciArIDMgPD0gc3Jyc3BhY2UpIHsKIAkJCW9wdC0+aXNfY2hhbmdlZCA9IDE7CiAJCQlpcF9ydF9nZXRfc291cmNlKCZvcHRwdHJbc3JycHRyLTFdLCBza2IsIHJ0KTsKKwkJCWlwX2hkcihza2IpLT5kYWRkciA9IG9wdC0+bmV4dGhvcDsKIAkJCW9wdHB0clsyXSA9IHNycnB0cis0OwogCQl9IGVsc2UgaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByaW50ayhLRVJOX0NSSVQgImlwX2ZvcndhcmQoKTogQXJnaCEgRGVzdGluYXRpb24gbG9zdCFcbiIpOwpAQCAtNjQwLDcgKzY0MSw3IEBACiAJfQogCWlmIChzcnJwdHIgPD0gc3Jyc3BhY2UpIHsKIAkJb3B0LT5zcnJfaXNfaGl0ID0gMTsKLQkJaXBoLT5kYWRkciA9IG5leHRob3A7CisJCW9wdC0+bmV4dGhvcCA9IG5leHRob3A7CiAJCW9wdC0+aXNfY2hhbmdlZCA9IDE7CiAJfQogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBfb3V0cHV0LmMgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwppbmRleCAwYmM5NWYzLi5mZjMwMmJkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9pcF9vdXRwdXQuYworKysgYi9uZXQvaXB2NC9pcF9vdXRwdXQuYwpAQCAtMjA2LDcgKzIwNiw3IEBACiAJfQogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKGRzdCk7CiAJaWYgKG5laWdoKSB7CiAJCWludCByZXMgPSBuZWlnaF9vdXRwdXQobmVpZ2gsIHNrYik7CiAKQEAgLTMxOSw2ICszMTksMjAgQEAKIAkJCSAgICAhKElQQ0Ioc2tiKS0+ZmxhZ3MgJiBJUFNLQl9SRVJPVVRFRCkpOwogfQogCisvKgorICogY29weSBzYWRkciBhbmQgZGFkZHIsIHBvc3NpYmx5IHVzaW5nIDY0Yml0IGxvYWQvc3RvcmVzCisgKiBFcXVpdmFsZW50IHRvIDoKKyAqICAgaXBoLT5zYWRkciA9IGZsNC0+c2FkZHI7CisgKiAgIGlwaC0+ZGFkZHIgPSBmbDQtPmRhZGRyOworICovCitzdGF0aWMgdm9pZCBpcF9jb3B5X2FkZHJzKHN0cnVjdCBpcGhkciAqaXBoLCBjb25zdCBzdHJ1Y3QgZmxvd2k0ICpmbDQpCit7CisJQlVJTERfQlVHX09OKG9mZnNldG9mKHR5cGVvZigqZmw0KSwgZGFkZHIpICE9CisJCSAgICAgb2Zmc2V0b2YodHlwZW9mKCpmbDQpLCBzYWRkcikgKyBzaXplb2YoZmw0LT5zYWRkcikpOworCW1lbWNweSgmaXBoLT5zYWRkciwgJmZsNC0+c2FkZHIsCisJICAgICAgIHNpemVvZihmbDQtPnNhZGRyKSArIHNpemVvZihmbDQtPmRhZGRyKSk7Cit9CisKIGludCBpcF9xdWV1ZV94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBmbG93aSAqZmwpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKQEAgLTM4MSw4ICszOTUsOCBAQAogCQlpcGgtPmZyYWdfb2ZmID0gMDsKIAlpcGgtPnR0bCAgICAgID0gaXBfc2VsZWN0X3R0bChpbmV0LCAmcnQtPmRzdCk7CiAJaXBoLT5wcm90b2NvbCA9IHNrLT5za19wcm90b2NvbDsKLQlpcGgtPnNhZGRyICAgID0gZmw0LT5zYWRkcjsKLQlpcGgtPmRhZGRyICAgID0gZmw0LT5kYWRkcjsKKwlpcF9jb3B5X2FkZHJzKGlwaCwgZmw0KTsKKwogCS8qIFRyYW5zcG9ydCBsYXllciBzZXQgc2tiLT5oLmZvbyBpdHNlbGYuICovCiAKIAlpZiAoaW5ldF9vcHQgJiYgaW5ldF9vcHQtPm9wdC5vcHRsZW4pIHsKQEAgLTEzMzcsOCArMTM1MSw3IEBACiAJaXBfc2VsZWN0X2lkZW50KGlwaCwgJnJ0LT5kc3QsIHNrKTsKIAlpcGgtPnR0bCA9IHR0bDsKIAlpcGgtPnByb3RvY29sID0gc2stPnNrX3Byb3RvY29sOwotCWlwaC0+c2FkZHIgPSBmbDQtPnNhZGRyOwotCWlwaC0+ZGFkZHIgPSBmbDQtPmRhZGRyOworCWlwX2NvcHlfYWRkcnMoaXBoLCBmbDQpOwogCiAJaWYgKG9wdCkgewogCQlpcGgtPmlobCArPSBvcHQtPm9wdGxlbj4+MjsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMgYi9uZXQvaXB2NC9pcF9zb2NrZ2x1ZS5jCmluZGV4IDA5ZmY1MWIuLjhhYTg3YzEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwX3NvY2tnbHVlLmMKKysrIGIvbmV0L2lwdjQvaXBfc29ja2dsdWUuYwpAQCAtMzcsNyArMzcsNyBAQAogI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC94ZnJtLmg+CiAjaW5jbHVkZSA8bmV0L2NvbXBhdC5oPgotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAjaW5jbHVkZSA8bmV0L3RyYW5zcF92Ni5oPgogI2VuZGlmCiAKQEAgLTU1LDIwICs1NSwxMyBAQAogLyoKICAqCVNPTF9JUCBjb250cm9sIG1lc3NhZ2VzLgogICovCisjZGVmaW5lIFBLVElORk9fU0tCX0NCKF9fc2tiKSAoKHN0cnVjdCBpbl9wa3RpbmZvICopKChfX3NrYiktPmNiKSkKIAogc3RhdGljIHZvaWQgaXBfY21zZ19yZWN2X3BrdGluZm8oc3RydWN0IG1zZ2hkciAqbXNnLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBpbl9wa3RpbmZvIGluZm87Ci0Jc3RydWN0IHJ0YWJsZSAqcnQgPSBza2JfcnRhYmxlKHNrYik7CisJc3RydWN0IGluX3BrdGluZm8gaW5mbyA9ICpQS1RJTkZPX1NLQl9DQihza2IpOwogCiAJaW5mby5pcGlfYWRkci5zX2FkZHIgPSBpcF9oZHIoc2tiKS0+ZGFkZHI7Ci0JaWYgKHJ0KSB7Ci0JCWluZm8uaXBpX2lmaW5kZXggPSBydC0+cnRfaWlmOwotCQlpbmZvLmlwaV9zcGVjX2RzdC5zX2FkZHIgPSBydC0+cnRfc3BlY19kc3Q7Ci0JfSBlbHNlIHsKLQkJaW5mby5pcGlfaWZpbmRleCA9IDA7Ci0JCWluZm8uaXBpX3NwZWNfZHN0LnNfYWRkciA9IDA7Ci0JfQogCiAJcHV0X2Ntc2cobXNnLCBTT0xfSVAsIElQX1BLVElORk8sIHNpemVvZihpbmZvKSwgJmluZm8pOwogfQpAQCAtNTE1LDcgKzUwOCw3IEBACiAJCQkJCQlzb2NrX293bmVkX2J5X3VzZXIoc2spKTsKIAkJaWYgKGluZXQtPmlzX2ljc2spIHsKIAkJCXN0cnVjdCBpbmV0X2Nvbm5lY3Rpb25fc29jayAqaWNzayA9IGluZXRfY3NrKHNrKTsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCQkJaWYgKHNrLT5za19mYW1pbHkgPT0gUEZfSU5FVCB8fAogCQkJICAgICghKCgxIDw8IHNrLT5za19zdGF0ZSkgJgogCQkJICAgICAgIChUQ1BGX0xJU1RFTiB8IFRDUEZfQ0xPU0UpKSAmJgpAQCAtNTI2LDcgKzUxOSw3IEBACiAJCQkJaWYgKG9wdCkKIAkJCQkJaWNzay0+aWNza19leHRfaGRyX2xlbiArPSBvcHQtPm9wdC5vcHRsZW47CiAJCQkJaWNzay0+aWNza19zeW5jX21zcyhzaywgaWNzay0+aWNza19wbXR1X2Nvb2tpZSk7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJCX0KICNlbmRpZgogCQl9CkBAIC05OTIsMjAgKzk4NSwyOCBAQAogfQogCiAvKioKLSAqIGlwX3F1ZXVlX3Jjdl9za2IgLSBRdWV1ZSBhbiBza2IgaW50byBzb2NrIHJlY2VpdmUgcXVldWUKKyAqIGlwdjRfcGt0aW5mb19wcmVwYXJlIC0gdHJhbnNmZXJ0IHNvbWUgaW5mbyBmcm9tIHJ0YWJsZSB0byBza2IKICAqIEBzazogc29ja2V0CiAgKiBAc2tiOiBidWZmZXIKICAqCi0gKiBRdWV1ZXMgYW4gc2tiIGludG8gc29ja2V0IHJlY2VpdmUgcXVldWUuIElmIElQX0NNU0dfUEtUSU5GTyBvcHRpb24KLSAqIGlzIG5vdCBzZXQsIHdlIGRyb3Agc2tiIGRzdCBlbnRyeSBub3csIHdoaWxlIGRzdCBjYWNoZSBsaW5lIGlzIGhvdC4KKyAqIFRvIHN1cHBvcnQgSVBfQ01TR19QS1RJTkZPIG9wdGlvbiwgd2Ugc3RvcmUgcnRfaWlmIGFuZCBydF9zcGVjX2RzdAorICogaW4gc2tiLT5jYltdIGJlZm9yZSBkc3QgZHJvcC4KKyAqIFRoaXMgd2F5LCByZWNlaXZlciBkb2VzbnQgbWFrZSBjYWNoZSBsaW5lIG1pc3NlcyB0byByZWFkIHJ0YWJsZS4KICAqLwotaW50IGlwX3F1ZXVlX3Jjdl9za2Ioc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQordm9pZCBpcHY0X3BrdGluZm9fcHJlcGFyZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCWlmICghKGluZXRfc2soc2spLT5jbXNnX2ZsYWdzICYgSVBfQ01TR19QS1RJTkZPKSkKLQkJc2tiX2RzdF9kcm9wKHNrYik7Ci0JcmV0dXJuIHNvY2tfcXVldWVfcmN2X3NrYihzaywgc2tiKTsKKwlzdHJ1Y3QgaW5fcGt0aW5mbyAqcGt0aW5mbyA9IFBLVElORk9fU0tCX0NCKHNrYik7CisJY29uc3Qgc3RydWN0IHJ0YWJsZSAqcnQgPSBza2JfcnRhYmxlKHNrYik7CisKKwlpZiAocnQpIHsKKwkJcGt0aW5mby0+aXBpX2lmaW5kZXggPSBydC0+cnRfaWlmOworCQlwa3RpbmZvLT5pcGlfc3BlY19kc3Quc19hZGRyID0gcnQtPnJ0X3NwZWNfZHN0OworCX0gZWxzZSB7CisJCXBrdGluZm8tPmlwaV9pZmluZGV4ID0gMDsKKwkJcGt0aW5mby0+aXBpX3NwZWNfZHN0LnNfYWRkciA9IDA7CisJfQorCXNrYl9kc3RfZHJvcChza2IpOwogfQotRVhQT1JUX1NZTUJPTChpcF9xdWV1ZV9yY3Zfc2tiKTsKIAogaW50IGlwX3NldHNvY2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgbGV2ZWwsCiAJCWludCBvcHRuYW1lLCBjaGFyIF9fdXNlciAqb3B0dmFsLCB1bnNpZ25lZCBpbnQgb3B0bGVuKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBjb25maWcuYyBiL25ldC9pcHY0L2lwY29uZmlnLmMKaW5kZXggMGRhMmFmYy4uN2U0ZWM5ZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvaXBjb25maWcuYworKysgYi9uZXQvaXB2NC9pcGNvbmZpZy5jCkBAIC0yNTMsNiArMjUzLDEwIEBACiAJCX0KIAl9CiAKKwkvKiBubyBwb2ludCBpbiB3YWl0aW5nIGlmIHdlIGNvdWxkIG5vdCBicmluZyB1cCBhdCBsZWFzdCBvbmUgZGV2aWNlICovCisJaWYgKCFpY19maXJzdF9kZXYpCisJCWdvdG8gaGF2ZV9jYXJyaWVyOworCiAJLyogd2FpdCBmb3IgYSBjYXJyaWVyIG9uIGF0IGxlYXN0IG9uZSBkZXZpY2UgKi8KIAlzdGFydCA9IGppZmZpZXM7CiAJd2hpbGUgKGppZmZpZXMgLSBzdGFydCA8IG1zZWNzX3RvX2ppZmZpZXMoQ09ORl9DQVJSSUVSX1RJTUVPVVQpKSB7CkBAIC03NjMsMTMgKzc2NywxNSBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGJvb3RwX3BrdCAqYjsKIAlzdHJ1Y3QgaXBoZHIgKmg7CisJaW50IGhsZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOworCWludCB0bGVuID0gZGV2LT5uZWVkZWRfdGFpbHJvb207CiAKIAkvKiBBbGxvY2F0ZSBwYWNrZXQgKi8KLQlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpICsgTExfQUxMT0NBVEVEX1NQQUNFKGRldikgKyAxNSwKKwlza2IgPSBhbGxvY19za2Ioc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpICsgaGxlbiArIHRsZW4gKyAxNSwKIAkJCUdGUF9LRVJORUwpOwogCWlmICghc2tiKQogCQlyZXR1cm47Ci0Jc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKwlza2JfcmVzZXJ2ZShza2IsIGhsZW4pOwogCWIgPSAoc3RydWN0IGJvb3RwX3BrdCAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpKTsKIAltZW1zZXQoYiwgMCwgc2l6ZW9mKHN0cnVjdCBib290cF9wa3QpKTsKIApAQCAtODIyLDggKzgyOCwxMyBAQAogCXNrYi0+ZGV2ID0gZGV2OwogCXNrYi0+cHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CiAJaWYgKGRldl9oYXJkX2hlYWRlcihza2IsIGRldiwgbnRvaHMoc2tiLT5wcm90b2NvbCksCi0JCQkgICAgZGV2LT5icm9hZGNhc3QsIGRldi0+ZGV2X2FkZHIsIHNrYi0+bGVuKSA8IDAgfHwKLQkgICAgZGV2X3F1ZXVlX3htaXQoc2tiKSA8IDApCisJCQkgICAgZGV2LT5icm9hZGNhc3QsIGRldi0+ZGV2X2FkZHIsIHNrYi0+bGVuKSA8IDApIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXByaW50aygiRSIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRldl9xdWV1ZV94bWl0KHNrYikgPCAwKQogCQlwcmludGsoIkUiKTsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBpcC5jIGIvbmV0L2lwdjQvaXBpcC5jCmluZGV4IDA2NWVmZmQuLjQxM2VkMWIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwaXAuYworKysgYi9uZXQvaXB2NC9pcGlwLmMKQEAgLTE0OCw3ICsxNDgsNyBAQAogCXVuc2lnbmVkIGxvbmcJcnhfYnl0ZXM7CiAJdW5zaWduZWQgbG9uZwl0eF9wYWNrZXRzOwogCXVuc2lnbmVkIGxvbmcJdHhfYnl0ZXM7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkpOwogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwaXBfZ2V0X3N0YXRzKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCiB7CkBAIC0yODUsNiArMjg1LDggQEAKIAlpZiAocmVnaXN0ZXJfbmV0ZGV2aWNlKGRldikgPCAwKQogCQlnb3RvIGZhaWxlZF9mcmVlOwogCisJc3RyY3B5KG50LT5wYXJtcy5uYW1lLCBkZXYtPm5hbWUpOworCiAJZGV2X2hvbGQoZGV2KTsKIAlpcGlwX3R1bm5lbF9saW5rKGlwbiwgbnQpOwogCXJldHVybiBudDsKQEAgLTc1OSw3ICs3NjEsNiBAQAogCXN0cnVjdCBpcF90dW5uZWwgKnR1bm5lbCA9IG5ldGRldl9wcml2KGRldik7CiAKIAl0dW5uZWwtPmRldiA9IGRldjsKLQlzdHJjcHkodHVubmVsLT5wYXJtcy5uYW1lLCBkZXYtPm5hbWUpOwogCiAJbWVtY3B5KGRldi0+ZGV2X2FkZHIsICZ0dW5uZWwtPnBhcm1zLmlwaC5zYWRkciwgNCk7CiAJbWVtY3B5KGRldi0+YnJvYWRjYXN0LCAmdHVubmVsLT5wYXJtcy5pcGguZGFkZHIsIDQpOwpAQCAtODI1LDYgKzgyNiw3IEBACiBzdGF0aWMgaW50IF9fbmV0X2luaXQgaXBpcF9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJc3RydWN0IGlwaXBfbmV0ICppcG4gPSBuZXRfZ2VuZXJpYyhuZXQsIGlwaXBfbmV0X2lkKTsKKwlzdHJ1Y3QgaXBfdHVubmVsICp0OwogCWludCBlcnI7CiAKIAlpcG4tPnR1bm5lbHNbMF0gPSBpcG4tPnR1bm5lbHNfd2M7CkBAIC04NDgsNiArODUwLDkgQEAKIAlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihpcG4tPmZiX3R1bm5lbF9kZXYpKSkKIAkJZ290byBlcnJfcmVnX2RldjsKIAorCXQgPSBuZXRkZXZfcHJpdihpcG4tPmZiX3R1bm5lbF9kZXYpOworCisJc3RyY3B5KHQtPnBhcm1zLm5hbWUsIGlwbi0+ZmJfdHVubmVsX2Rldi0+bmFtZSk7CiAJcmV0dXJuIDA7CiAKIGVycl9yZWdfZGV2OgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvaXBtci5jIGIvbmV0L2lwdjQvaXBtci5jCmluZGV4IDc2YTdmMDcuLjhlNTQ0OTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L2lwbXIuYworKysgYi9uZXQvaXB2NC9pcG1yLmMKQEAgLTE1MjAsNyArMTUyMCw2IEBACiAJc3RydWN0IG1yX3RhYmxlICptcnQ7CiAJc3RydWN0IHZpZl9kZXZpY2UgKnY7CiAJaW50IGN0OwotCUxJU1RfSEVBRChsaXN0KTsKIAogCWlmIChldmVudCAhPSBORVRERVZfVU5SRUdJU1RFUikKIAkJcmV0dXJuIE5PVElGWV9ET05FOwpAQCAtMTUyOSwxMCArMTUyOCw5IEBACiAJCXYgPSAmbXJ0LT52aWZfdGFibGVbMF07CiAJCWZvciAoY3QgPSAwOyBjdCA8IG1ydC0+bWF4dmlmOyBjdCsrLCB2KyspIHsKIAkJCWlmICh2LT5kZXYgPT0gZGV2KQotCQkJCXZpZl9kZWxldGUobXJ0LCBjdCwgMSwgJmxpc3QpOworCQkJCXZpZl9kZWxldGUobXJ0LCBjdCwgMSwgTlVMTCk7CiAJCX0KIAl9Ci0JdW5yZWdpc3Rlcl9uZXRkZXZpY2VfbWFueSgmbGlzdCk7CiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci5jCmluZGV4IDk4OTk2MTlhLi40ZjQ3ZTA2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIuYwpAQCAtNjQsNyArNjQsOCBAQAogCS8qIENoYW5nZSBpbiBvaWYgbWF5IG1lYW4gY2hhbmdlIGluIGhoX2xlbi4gKi8KIAloaF9sZW4gPSBza2JfZHN0KHNrYiktPmRldi0+aGFyZF9oZWFkZXJfbGVuOwogCWlmIChza2JfaGVhZHJvb20oc2tiKSA8IGhoX2xlbiAmJgotCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgaGhfbGVuIC0gc2tiX2hlYWRyb29tKHNrYiksIDAsIEdGUF9BVE9NSUMpKQorCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgSEhfREFUQV9BTElHTihoaF9sZW4gLSBza2JfaGVhZHJvb20oc2tiKSksCisJCQkJMCwgR0ZQX0FUT01JQykpCiAJCXJldHVybiAtMTsKIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwppbmRleCAxZGZjMThhLi43NGRmYzllIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtMjcsNyArMjcsNyBAQAogCiBjb25maWcgTkZfQ09OTlRSQUNLX1BST0NfQ09NUEFUCiAJYm9vbCAicHJvYy9zeXNjdGwgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBjb25uZWN0aW9uIHRyYWNraW5nIgotCWRlcGVuZHMgb24gTkZfQ09OTlRSQUNLX0lQVjQKKwlkZXBlbmRzIG9uIE5GX0NPTk5UUkFDS19QUk9DRlMgJiYgTkZfQ09OTlRSQUNLX0lQVjQKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBlbmFibGVzIC9wcm9jIGFuZCBzeXNjdGwgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBvbGQKQEAgLTc2LDExICs3NiwyMSBAQAogY29uZmlnIElQX05GX01BVENIX0VDTgogCXRyaXN0YXRlICciZWNuIiBtYXRjaCBzdXBwb3J0JwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECi0JaGVscAotCSAgVGhpcyBvcHRpb24gYWRkcyBhIGBFQ04nIG1hdGNoLCB3aGljaCBhbGxvd3MgeW91IHRvIG1hdGNoIGFnYWluc3QKLQkgIHRoZSBJUHY0IGFuZCBUQ1AgaGVhZGVyIEVDTiBmaWVsZHMuCisJc2VsZWN0IE5FVEZJTFRFUl9YVF9NQVRDSF9FQ04KKwktLS1oZWxwLS0tCisJVGhpcyBpcyBhIGJhY2t3YXJkcy1jb21wYXQgb3B0aW9uIGZvciB0aGUgdXNlcidzIGNvbnZlbmllbmNlCisJKGUuZy4gd2hlbiBydW5uaW5nIG9sZGNvbmZpZykuIEl0IHNlbGVjdHMKKwlDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0VDTi4KKworY29uZmlnIElQX05GX01BVENIX1JQRklMVEVSCisJdHJpc3RhdGUgJyJycGZpbHRlciIgcmV2ZXJzZSBwYXRoIGZpbHRlciBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIHdob3NlIHJlcGxpZXMgd291bGQKKwkgIGdvIG91dCB2aWEgdGhlIGludGVyZmFjZSB0aGUgcGFja2V0IGNhbWUgaW4uCiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcHRfcnBmaWx0ZXIuCiAKIGNvbmZpZyBJUF9ORl9NQVRDSF9UVEwKIAl0cmlzdGF0ZSAnInR0bCIgbWF0Y2ggc3VwcG9ydCcKQEAgLTMyNSw3ICszMzUsNiBAQAogIyByYXcgKyBzcGVjaWZpYyB0YXJnZXRzCiBjb25maWcgSVBfTkZfUkFXCiAJdHJpc3RhdGUgICdyYXcgdGFibGUgc3VwcG9ydCAocmVxdWlyZWQgZm9yIE5PVFJBQ0svVFJBQ0UpJwotCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECiAJaGVscAogCSAgVGhpcyBvcHRpb24gYWRkcyBhIGByYXcnIHRhYmxlIHRvIGlwdGFibGVzLiBUaGlzIHRhYmxlIGlzIHRoZSB2ZXJ5CiAJICBmaXJzdCBpbiB0aGUgbmV0ZmlsdGVyIGZyYW1ld29yayBhbmQgaG9va3MgaW4gYXQgdGhlIFBSRVJPVVRJTkcKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZSBiL25ldC9pcHY0L25ldGZpbHRlci9NYWtlZmlsZQppbmRleCBkY2EyMDgyLi4yMTNhNDYyIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL01ha2VmaWxlCkBAIC00OSw3ICs0OSw3IEBACiAKICMgbWF0Y2hlcwogb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0FIKSArPSBpcHRfYWgubwotb2JqLSQoQ09ORklHX0lQX05GX01BVENIX0VDTikgKz0gaXB0X2Vjbi5vCitvYmotJChDT05GSUdfSVBfTkZfTUFUQ0hfUlBGSUxURVIpICs9IGlwdF9ycGZpbHRlci5vCiAKICMgdGFyZ2V0cwogb2JqLSQoQ09ORklHX0lQX05GX1RBUkdFVF9DTFVTVEVSSVApICs9IGlwdF9DTFVTVEVSSVAubwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwX3F1ZXVlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwppbmRleCBlNTlhYWJkLi5hMDU3ZmU2IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXBfcXVldWUuYwpAQCAtNDA0LDYgKzQwNCw3IEBACiAJaW50IHN0YXR1cywgdHlwZSwgcGlkLCBmbGFnczsKIAl1bnNpZ25lZCBpbnQgbmxtc2dsZW4sIHNrYmxlbjsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKKwlib29sIGVuYWJsZV90aW1lc3RhbXAgPSBmYWxzZTsKIAogCXNrYmxlbiA9IHNrYi0+bGVuOwogCWlmIChza2JsZW4gPCBzaXplb2YoKm5saCkpCkBAIC00NDEsMTIgKzQ0MiwxMyBAQAogCQkJUkNWX1NLQl9GQUlMKC1FQlVTWSk7CiAJCX0KIAl9IGVsc2UgewotCQluZXRfZW5hYmxlX3RpbWVzdGFtcCgpOworCQllbmFibGVfdGltZXN0YW1wID0gdHJ1ZTsKIAkJcGVlcl9waWQgPSBwaWQ7CiAJfQogCiAJc3Bpbl91bmxvY2tfYmgoJnF1ZXVlX2xvY2spOwotCisJaWYgKGVuYWJsZV90aW1lc3RhbXApCisJCW5ldF9lbmFibGVfdGltZXN0YW1wKCk7CiAJc3RhdHVzID0gaXBxX3JlY2VpdmVfcGVlcihOTE1TR19EQVRBKG5saCksIHR5cGUsCiAJCQkJICBubG1zZ2xlbiAtIE5MTVNHX0xFTkdUSCgwKSk7CiAJaWYgKHN0YXR1cyA8IDApCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X01BU1FVRVJBREUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCmluZGV4IDk5MzExNTIuLjJmMjEwYzcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTUFTUVVFUkFERS5jCkBAIC0zMCw5ICszMCw5IEBACiAvKiBGSVhNRTogTXVsdGlwbGUgdGFyZ2V0cy4gLS1SUiAqLwogc3RhdGljIGludCBtYXNxdWVyYWRlX3RnX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CisJY29uc3Qgc3RydWN0IG5mX25hdF9pcHY0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSBwYXItPnRhcmdpbmZvOwogCi0JaWYgKG1yLT5yYW5nZVswXS5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSB7CisJaWYgKG1yLT5yYW5nZVswXS5mbGFncyAmIE5GX05BVF9SQU5HRV9NQVBfSVBTKSB7CiAJCXByX2RlYnVnKCJiYWQgTUFQX0lQUy5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00OSw4ICs0OSw4IEBACiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCXN0cnVjdCBuZl9jb25uX25hdCAqbmF0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCXN0cnVjdCBuZl9uYXRfcmFuZ2UgbmV3cmFuZ2U7Ci0JY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yOworCXN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSBuZXdyYW5nZTsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfbXVsdGlfcmFuZ2VfY29tcGF0ICptcjsKIAljb25zdCBzdHJ1Y3QgcnRhYmxlICpydDsKIAlfX2JlMzIgbmV3c3JjOwogCkBAIC03OSwxMyArNzksMTMgQEAKIAluYXQtPm1hc3FfaW5kZXggPSBwYXItPm91dC0+aWZpbmRleDsKIAogCS8qIFRyYW5zZmVyIGZyb20gb3JpZ2luYWwgcmFuZ2UuICovCi0JbmV3cmFuZ2UgPSAoKHN0cnVjdCBuZl9uYXRfcmFuZ2UpCi0JCXsgbXItPnJhbmdlWzBdLmZsYWdzIHwgSVBfTkFUX1JBTkdFX01BUF9JUFMsCisJbmV3cmFuZ2UgPSAoKHN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSkKKwkJeyBtci0+cmFuZ2VbMF0uZmxhZ3MgfCBORl9OQVRfUkFOR0VfTUFQX0lQUywKIAkJICBuZXdzcmMsIG5ld3NyYywKIAkJICBtci0+cmFuZ2VbMF0ubWluLCBtci0+cmFuZ2VbMF0ubWF4IH0pOwogCiAJLyogSGFuZCBtb2RpZmllZCByYW5nZSB0byBnZW5lcmljIHNldHVwLiAqLwotCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBJUF9OQVRfTUFOSVBfU1JDKTsKKwlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZuZXdyYW5nZSwgTkZfTkFUX01BTklQX1NSQyk7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEzOSw3ICsxMzksNyBAQAogCS5uYW1lCQk9ICJNQVNRVUVSQURFIiwKIAkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkudGFyZ2V0CQk9IG1hc3F1ZXJhZGVfdGcsCi0JLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpLAorCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZl9uYXRfaXB2NF9tdWx0aV9yYW5nZV9jb21wYXQpLAogCS50YWJsZQkJPSAibmF0IiwKIAkuaG9va3MJCT0gMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORywKIAkuY2hlY2tlbnRyeQk9IG1hc3F1ZXJhZGVfdGdfY2hlY2ssCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9ORVRNQVAuYwppbmRleCA2Y2RiMjk4Li5iNWJmYmJhIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X05FVE1BUC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfTkVUTUFQLmMKQEAgLTI0LDkgKzI0LDkgQEAKIAogc3RhdGljIGludCBuZXRtYXBfdGdfY2hlY2soY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gcGFyLT50YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CiAKLQlpZiAoIShtci0+cmFuZ2VbMF0uZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykpIHsKKwlpZiAoIShtci0+cmFuZ2VbMF0uZmxhZ3MgJiBORl9OQVRfUkFOR0VfTUFQX0lQUykpIHsKIAkJcHJfZGVidWcoImJhZCBNQVBfSVBTLlxuIik7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTQzLDggKzQzLDggQEAKIAlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJX19iZTMyIG5ld19pcCwgbmV0bWFzazsKLQljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSBwYXItPnRhcmdpbmZvOwotCXN0cnVjdCBuZl9uYXRfcmFuZ2UgbmV3cmFuZ2U7CisJY29uc3Qgc3RydWN0IG5mX25hdF9pcHY0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSBwYXItPnRhcmdpbmZvOworCXN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSBuZXdyYW5nZTsKIAogCU5GX0NUX0FTU0VSVChwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9QUkVfUk9VVElORyB8fAogCQkgICAgIHBhci0+aG9va251bSA9PSBORl9JTkVUX1BPU1RfUk9VVElORyB8fApAQCAtNjEsOCArNjEsOCBAQAogCQluZXdfaXAgPSBpcF9oZHIoc2tiKS0+c2FkZHIgJiB+bmV0bWFzazsKIAluZXdfaXAgfD0gbXItPnJhbmdlWzBdLm1pbl9pcCAmIG5ldG1hc2s7CiAKLQluZXdyYW5nZSA9ICgoc3RydWN0IG5mX25hdF9yYW5nZSkKLQkJeyBtci0+cmFuZ2VbMF0uZmxhZ3MgfCBJUF9OQVRfUkFOR0VfTUFQX0lQUywKKwluZXdyYW5nZSA9ICgoc3RydWN0IG5mX25hdF9pcHY0X3JhbmdlKQorCQl7IG1yLT5yYW5nZVswXS5mbGFncyB8IE5GX05BVF9SQU5HRV9NQVBfSVBTLAogCQkgIG5ld19pcCwgbmV3X2lwLAogCQkgIG1yLT5yYW5nZVswXS5taW4sIG1yLT5yYW5nZVswXS5tYXggfSk7CiAKQEAgLTc0LDcgKzc0LDcgQEAKIAkubmFtZSAJCT0gIk5FVE1BUCIsCiAJLmZhbWlseQkJPSBORlBST1RPX0lQVjQsCiAJLnRhcmdldCAJPSBuZXRtYXBfdGcsCi0JLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpLAorCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZl9uYXRfaXB2NF9tdWx0aV9yYW5nZV9jb21wYXQpLAogCS50YWJsZQkJPSAibmF0IiwKIAkuaG9va3MJCT0gKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORykgfAogCQkJICAoMSA8PCBORl9JTkVUX1BPU1RfUk9VVElORykgfApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9SRURJUkVDVC5jCmluZGV4IDE4YTA2NTYuLjdjMDEwM2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfUkVESVJFQ1QuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1JFRElSRUNULmMKQEAgLTI4LDkgKzI4LDkgQEAKIC8qIEZJWE1FOiBUYWtlIG11bHRpcGxlIHJhbmdlcyAtLVJSICovCiBzdGF0aWMgaW50IHJlZGlyZWN0X3RnX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF90Z2Noa19wYXJhbSAqcGFyKQogewotCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CisJY29uc3Qgc3RydWN0IG5mX25hdF9pcHY0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSBwYXItPnRhcmdpbmZvOwogCi0JaWYgKG1yLT5yYW5nZVswXS5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSB7CisJaWYgKG1yLT5yYW5nZVswXS5mbGFncyAmIE5GX05BVF9SQU5HRV9NQVBfSVBTKSB7CiAJCXByX2RlYnVnKCJiYWQgTUFQX0lQUy5cbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC00Nyw4ICs0Nyw4IEBACiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCV9fYmUzMiBuZXdkc3Q7Ci0JY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gcGFyLT50YXJnaW5mbzsKLQlzdHJ1Y3QgbmZfbmF0X3JhbmdlIG5ld3JhbmdlOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfaXB2NF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gcGFyLT50YXJnaW5mbzsKKwlzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgbmV3cmFuZ2U7CiAKIAlORl9DVF9BU1NFUlQocGFyLT5ob29rbnVtID09IE5GX0lORVRfUFJFX1JPVVRJTkcgfHwKIAkJICAgICBwYXItPmhvb2tudW0gPT0gTkZfSU5FVF9MT0NBTF9PVVQpOwpAQCAtNzYsMjAgKzc2LDIwIEBACiAJfQogCiAJLyogVHJhbnNmZXIgZnJvbSBvcmlnaW5hbCByYW5nZS4gKi8KLQluZXdyYW5nZSA9ICgoc3RydWN0IG5mX25hdF9yYW5nZSkKLQkJeyBtci0+cmFuZ2VbMF0uZmxhZ3MgfCBJUF9OQVRfUkFOR0VfTUFQX0lQUywKKwluZXdyYW5nZSA9ICgoc3RydWN0IG5mX25hdF9pcHY0X3JhbmdlKQorCQl7IG1yLT5yYW5nZVswXS5mbGFncyB8IE5GX05BVF9SQU5HRV9NQVBfSVBTLAogCQkgIG5ld2RzdCwgbmV3ZHN0LAogCQkgIG1yLT5yYW5nZVswXS5taW4sIG1yLT5yYW5nZVswXS5tYXggfSk7CiAKIAkvKiBIYW5kIG1vZGlmaWVkIHJhbmdlIHRvIGdlbmVyaWMgc2V0dXAuICovCi0JcmV0dXJuIG5mX25hdF9zZXR1cF9pbmZvKGN0LCAmbmV3cmFuZ2UsIElQX05BVF9NQU5JUF9EU1QpOworCXJldHVybiBuZl9uYXRfc2V0dXBfaW5mbyhjdCwgJm5ld3JhbmdlLCBORl9OQVRfTUFOSVBfRFNUKTsKIH0KIAogc3RhdGljIHN0cnVjdCB4dF90YXJnZXQgcmVkaXJlY3RfdGdfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gIlJFRElSRUNUIiwKIAkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKIAkudGFyZ2V0CQk9IHJlZGlyZWN0X3RnLAotCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKKwkudGFyZ2V0c2l6ZQk9IHNpemVvZihzdHJ1Y3QgbmZfbmF0X2lwdjRfbXVsdGlfcmFuZ2VfY29tcGF0KSwKIAkudGFibGUJCT0gIm5hdCIsCiAJLmhvb2tzCQk9ICgxIDw8IE5GX0lORVRfUFJFX1JPVVRJTkcpIHwgKDEgPDwgTkZfSU5FVF9MT0NBTF9PVVQpLAogCS5jaGVja2VudHJ5CT0gcmVkaXJlY3RfdGdfY2hlY2ssCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X1VMT0cuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCmluZGV4IGI1NTA4MTUuLmJhNTc1NmQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfVUxPRy5jCkBAIC02NSw3ICs2NSw3IEBACiBtb2R1bGVfcGFyYW0oZmx1c2h0aW1lb3V0LCB1aW50LCAwNjAwKTsKIE1PRFVMRV9QQVJNX0RFU0MoZmx1c2h0aW1lb3V0LCAiYnVmZmVyIGZsdXNoIHRpbWVvdXQgKGh1bmRyZWR0aHMgb2YgYSBzZWNvbmQpIik7CiAKLXN0YXRpYyBpbnQgbmZsb2cgPSAxOworc3RhdGljIGJvb2wgbmZsb2cgPSB0cnVlOwogbW9kdWxlX3BhcmFtKG5mbG9nLCBib29sLCAwNDAwKTsKIE1PRFVMRV9QQVJNX0RFU0MobmZsb2csICJyZWdpc3RlciBhcyBpbnRlcm5hbCBuZXRmaWx0ZXIgbG9nZ2luZyBtb2R1bGUiKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfZWNuLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNTdlNTIuLjAwMDAwMDAKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL2lwdF9lY24uYworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKiBJUCB0YWJsZXMgbW9kdWxlIGZvciBtYXRjaGluZyB0aGUgdmFsdWUgb2YgdGhlIElQdjQgYW5kIFRDUCBFQ04gYml0cwotICoKLSAqIChDKSAyMDAyIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+Ci0gKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqLwotI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAotI2luY2x1ZGUgPGxpbnV4L2luLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC90Y3AuaD4KLQotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwX3RhYmxlcy5oPgotI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY0L2lwdF9lY24uaD4KLQotTU9EVUxFX0FVVEhPUigiSGFyYWxkIFdlbHRlIDxsYWZvcmdlQG5ldGZpbHRlci5vcmc+Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oIlh0YWJsZXM6IEV4cGxpY2l0IENvbmdlc3Rpb24gTm90aWZpY2F0aW9uIChFQ04pIGZsYWcgbWF0Y2ggZm9yIElQdjQiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLQotc3RhdGljIGlubGluZSBib29sIG1hdGNoX2lwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsCi0JCQkgICAgY29uc3Qgc3RydWN0IGlwdF9lY25faW5mbyAqZWluZm8pCi17Ci0JcmV0dXJuICgoaXBfaGRyKHNrYiktPnRvcyAmIElQVF9FQ05fSVBfTUFTSykgPT0gZWluZm8tPmlwX2VjdCkgXgotCSAgICAgICAhIShlaW5mby0+aW52ZXJ0ICYgSVBUX0VDTl9PUF9NQVRDSF9JUCk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBtYXRjaF90Y3AoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCSAgICAgY29uc3Qgc3RydWN0IGlwdF9lY25faW5mbyAqZWluZm8sCi0JCQkgICAgIGJvb2wgKmhvdGRyb3ApCi17Ci0Jc3RydWN0IHRjcGhkciBfdGNwaDsKLQljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aDsKLQotCS8qIEluIHByYWN0aWNlLCBUQ1AgbWF0Y2ggZG9lcyB0aGlzLCBzbyBjYW4ndCBmYWlsLiAgQnV0IGxldCdzCi0JICogYmUgZ29vZCBjaXRpemVucy4KLQkgKi8KLQl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIGlwX2hkcmxlbihza2IpLCBzaXplb2YoX3RjcGgpLCAmX3RjcGgpOwotCWlmICh0aCA9PSBOVUxMKSB7Ci0JCSpob3Rkcm9wID0gZmFsc2U7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAoZWluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfTUFUQ0hfRUNFKSB7Ci0JCWlmIChlaW5mby0+aW52ZXJ0ICYgSVBUX0VDTl9PUF9NQVRDSF9FQ0UpIHsKLQkJCWlmICh0aC0+ZWNlID09IDEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJaWYgKHRoLT5lY2UgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlpZiAoZWluZm8tPm9wZXJhdGlvbiAmIElQVF9FQ05fT1BfTUFUQ0hfQ1dSKSB7Ci0JCWlmIChlaW5mby0+aW52ZXJ0ICYgSVBUX0VDTl9PUF9NQVRDSF9DV1IpIHsKLQkJCWlmICh0aC0+Y3dyID09IDEpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgewotCQkJaWYgKHRoLT5jd3IgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZWNuX210KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKLXsKLQljb25zdCBzdHJ1Y3QgaXB0X2Vjbl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87Ci0KLQlpZiAoaW5mby0+b3BlcmF0aW9uICYgSVBUX0VDTl9PUF9NQVRDSF9JUCkKLQkJaWYgKCFtYXRjaF9pcChza2IsIGluZm8pKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JaWYgKGluZm8tPm9wZXJhdGlvbiAmIChJUFRfRUNOX09QX01BVENIX0VDRXxJUFRfRUNOX09QX01BVENIX0NXUikpIHsKLQkJaWYgKCFtYXRjaF90Y3Aoc2tiLCBpbmZvLCAmcGFyLT5ob3Rkcm9wKSkKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGludCBlY25fbXRfY2hlY2soY29uc3Qgc3RydWN0IHh0X210Y2hrX3BhcmFtICpwYXIpCi17Ci0JY29uc3Qgc3RydWN0IGlwdF9lY25faW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOwotCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gcGFyLT5lbnRyeWluZm87Ci0KLQlpZiAoaW5mby0+b3BlcmF0aW9uICYgSVBUX0VDTl9PUF9NQVRDSF9NQVNLKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmIChpbmZvLT5pbnZlcnQgJiBJUFRfRUNOX09QX01BVENIX01BU0spCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKGluZm8tPm9wZXJhdGlvbiAmIChJUFRfRUNOX09QX01BVENIX0VDRXxJUFRfRUNOX09QX01BVENIX0NXUikgJiYKLQkgICAgKGlwLT5wcm90byAhPSBJUFBST1RPX1RDUCB8fCBpcC0+aW52ZmxhZ3MgJiBJUFRfSU5WX1BST1RPKSkgewotCQlwcl9pbmZvKCJjYW5ub3QgbWF0Y2ggVENQIGJpdHMgaW4gcnVsZSBmb3Igbm9uLXRjcCBwYWNrZXRzXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggZWNuX210X3JlZyBfX3JlYWRfbW9zdGx5ID0gewotCS5uYW1lCQk9ICJlY24iLAotCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY0LAotCS5tYXRjaAkJPSBlY25fbXQsCi0JLm1hdGNoc2l6ZQk9IHNpemVvZihzdHJ1Y3QgaXB0X2Vjbl9pbmZvKSwKLQkuY2hlY2tlbnRyeQk9IGVjbl9tdF9jaGVjaywKLQkubWUJCT0gVEhJU19NT0RVTEUsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBlY25fbXRfaW5pdCh2b2lkKQotewotCXJldHVybiB4dF9yZWdpc3Rlcl9tYXRjaCgmZWNuX210X3JlZyk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCBlY25fbXRfZXhpdCh2b2lkKQotewotCXh0X3VucmVnaXN0ZXJfbWF0Y2goJmVjbl9tdF9yZWcpOwotfQotCi1tb2R1bGVfaW5pdChlY25fbXRfaW5pdCk7Ci1tb2R1bGVfZXhpdChlY25fbXRfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JwZmlsdGVyLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0X3JwZmlsdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzNzFiZQotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRfcnBmaWx0ZXIuYwpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBGbG9yaWFuIFdlc3RwaGFsIDxmd0BzdHJsZW4uZGU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBiYXNlZCBvbiBmaWJfZnJvbnRlbmQuYzsgQXV0aG9yOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogIiBmbXQKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9pcF9maWIuaD4KKyNpbmNsdWRlIDxuZXQvcm91dGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9ycGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJGbG9yaWFuIFdlc3RwaGFsIDxmd0BzdHJsZW4uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oImlwdGFibGVzOiBpcHY0IHJldmVyc2UgcGF0aCBmaWx0ZXIgbWF0Y2giKTsKKworLyogZG9uJ3QgdHJ5IHRvIGZpbmQgcm91dGUgZnJvbSBtY2FzdC9iY2FzdC96ZXJvbmV0ICovCitzdGF0aWMgX19iZTMyIHJwZmlsdGVyX2dldF9zYWRkcihfX2JlMzIgYWRkcikKK3sKKwlpZiAoaXB2NF9pc19tdWx0aWNhc3QoYWRkcikgfHwgaXB2NF9pc19sYmNhc3QoYWRkcikgfHwKKwkgICAgaXB2NF9pc196ZXJvbmV0KGFkZHIpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gYWRkcjsKK30KKworc3RhdGljIGJvb2wgcnBmaWx0ZXJfbG9va3VwX3JldmVyc2Uoc3RydWN0IGZsb3dpNCAqZmw0LAorCQkJCWNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4IGZsYWdzKQoreworCXN0cnVjdCBmaWJfcmVzdWx0IHJlczsKKwlib29sIGRldl9tYXRjaDsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CisJaW50IHJldCBfX21heWJlX3VudXNlZDsKKworCWlmIChmaWJfbG9va3VwKG5ldCwgZmw0LCAmcmVzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHJlcy50eXBlICE9IFJUTl9VTklDQVNUKSB7CisJCWlmIChyZXMudHlwZSAhPSBSVE5fTE9DQUwgfHwgIShmbGFncyAmIFhUX1JQRklMVEVSX0FDQ0VQVF9MT0NBTCkpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCWRldl9tYXRjaCA9IGZhbHNlOworI2lmZGVmIENPTkZJR19JUF9ST1VURV9NVUxUSVBBVEgKKwlmb3IgKHJldCA9IDA7IHJldCA8IHJlcy5maS0+ZmliX25oczsgcmV0KyspIHsKKwkJc3RydWN0IGZpYl9uaCAqbmggPSAmcmVzLmZpLT5maWJfbmhbcmV0XTsKKworCQlpZiAobmgtPm5oX2RldiA9PSBkZXYpIHsKKwkJCWRldl9tYXRjaCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCX0KKyNlbHNlCisJaWYgKEZJQl9SRVNfREVWKHJlcykgPT0gZGV2KQorCQlkZXZfbWF0Y2ggPSB0cnVlOworI2VuZGlmCisJaWYgKGRldl9tYXRjaCB8fCBmbGFncyAmIFhUX1JQRklMVEVSX0xPT1NFKQorCQlyZXR1cm4gRklCX1JFU19OSChyZXMpLm5oX3Njb3BlIDw9IFJUX1NDT1BFX0hPU1Q7CisJcmV0dXJuIGRldl9tYXRjaDsKK30KKworc3RhdGljIGJvb2wgcnBmaWx0ZXJfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9ycGZpbHRlcl9pbmZvICppbmZvOworCWNvbnN0IHN0cnVjdCBpcGhkciAqaXBoOworCXN0cnVjdCBmbG93aTQgZmxvdzsKKwlib29sIGludmVydDsKKworCWluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwlpbnZlcnQgPSBpbmZvLT5mbGFncyAmIFhUX1JQRklMVEVSX0lOVkVSVDsKKworCWlmIChwYXItPmluLT5mbGFncyAmIElGRl9MT09QQkFDSykKKwkJcmV0dXJuIHRydWUgXiBpbnZlcnQ7CisKKwlpcGggPSBpcF9oZHIoc2tiKTsKKwlpZiAoaXB2NF9pc19tdWx0aWNhc3QoaXBoLT5kYWRkcikpIHsKKwkJaWYgKGlwdjRfaXNfemVyb25ldChpcGgtPnNhZGRyKSkKKwkJCXJldHVybiBpcHY0X2lzX2xvY2FsX211bHRpY2FzdChpcGgtPmRhZGRyKSBeIGludmVydDsKKwkJZmxvdy5mbG93aTRfaWlmID0gMDsKKwl9IGVsc2UgeworCQlmbG93LmZsb3dpNF9paWYgPSBkZXZfbmV0KHBhci0+aW4pLT5sb29wYmFja19kZXYtPmlmaW5kZXg7CisJfQorCisJZmxvdy5kYWRkciA9IGlwaC0+c2FkZHI7CisJZmxvdy5zYWRkciA9IHJwZmlsdGVyX2dldF9zYWRkcihpcGgtPmRhZGRyKTsKKwlmbG93LmZsb3dpNF9vaWYgPSAwOworCWZsb3cuZmxvd2k0X21hcmsgPSBpbmZvLT5mbGFncyAmIFhUX1JQRklMVEVSX1ZBTElEX01BUksgPyBza2ItPm1hcmsgOiAwOworCWZsb3cuZmxvd2k0X3RvcyA9IFJUX1RPUyhpcGgtPnRvcyk7CisJZmxvdy5mbG93aTRfc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRTsKKworCXJldHVybiBycGZpbHRlcl9sb29rdXBfcmV2ZXJzZSgmZmxvdywgcGFyLT5pbiwgaW5mby0+ZmxhZ3MpIF4gaW52ZXJ0OworfQorCitzdGF0aWMgaW50IHJwZmlsdGVyX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9ycGZpbHRlcl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CisJdW5zaWduZWQgaW50IG9wdGlvbnMgPSB+WFRfUlBGSUxURVJfT1BUSU9OX01BU0s7CisJaWYgKGluZm8tPmZsYWdzICYgb3B0aW9ucykgeworCQlwcl9pbmZvKCJ1bmtub3duIG9wdGlvbnMgZW5jb3VudGVyZWQiKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHN0cmNtcChwYXItPnRhYmxlLCAibWFuZ2xlIikgIT0gMCAmJgorCSAgICBzdHJjbXAocGFyLT50YWJsZSwgInJhdyIpICE9IDApIHsKKwkJcHJfaW5mbygibWF0Y2ggb25seSB2YWxpZCBpbiB0aGUgXCdyYXdcJyAiCisJCQkib3IgXCdtYW5nbGVcJyB0YWJsZXMsIG5vdCBcJyVzXCcuXG4iLCBwYXItPnRhYmxlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeHRfbWF0Y2ggcnBmaWx0ZXJfbXRfcmVnIF9fcmVhZF9tb3N0bHkgPSB7CisJLm5hbWUJCT0gInJwZmlsdGVyIiwKKwkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKKwkuY2hlY2tlbnRyeQk9IHJwZmlsdGVyX2NoZWNrLAorCS5tYXRjaAkJPSBycGZpbHRlcl9tdCwKKwkubWF0Y2hzaXplCT0gc2l6ZW9mKHN0cnVjdCB4dF9ycGZpbHRlcl9pbmZvKSwKKwkuaG9va3MJCT0gKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORyksCisJLm1lCQk9IFRISVNfTU9EVUxFCit9OworCitzdGF0aWMgaW50IF9faW5pdCBycGZpbHRlcl9tdF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZycGZpbHRlcl9tdF9yZWcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgcnBmaWx0ZXJfbXRfZXhpdCh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2goJnJwZmlsdGVyX210X3JlZyk7Cit9CisKK21vZHVsZV9pbml0KHJwZmlsdGVyX210X2luaXQpOworbW9kdWxlX2V4aXQocnBmaWx0ZXJfbXRfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvaXB0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCmluZGV4IGMzNzY0MWUuLjBlNThmMDkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9pcHRhYmxlX2ZpbHRlci5jCkBAIC01Miw3ICs1Miw3IEBACiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzICpmaWx0ZXJfb3BzIF9fcmVhZF9tb3N0bHk7CiAKIC8qIERlZmF1bHQgdG8gZm9yd2FyZCBiZWNhdXNlIEkgZ290IHRvbyBtdWNoIG1haWwgYWxyZWFkeS4gKi8KLXN0YXRpYyBpbnQgZm9yd2FyZCA9IE5GX0FDQ0VQVDsKK3N0YXRpYyBib29sIGZvcndhcmQgPSBORl9BQ0NFUFQ7CiBtb2R1bGVfcGFyYW0oZm9yd2FyZCwgYm9vbCwgMDAwMCk7CiAKIHN0YXRpYyBpbnQgX19uZXRfaW5pdCBpcHRhYmxlX2ZpbHRlcl9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2NvcmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCmluZGV4IDQ0N2JjNWMuLmFjZGQwMDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfY29yZS5jCkBAIC0zMCw3ICszMCw2IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbDNwcm90by5oPgotI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2w0cHJvdG8uaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja196b25lcy5oPgogCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKG5mX25hdF9sb2NrKTsKQEAgLTU3LDcgKzU2LDcgQEAKIAkvKiBPcmlnaW5hbCBzcmMsIHRvIGVuc3VyZSB3ZSBtYXAgaXQgY29uc2lzdGVudGx5IGlmIHBvc3MuICovCiAJaGFzaCA9IGpoYXNoXzN3b3JkcygoX19mb3JjZSB1MzIpdHVwbGUtPnNyYy51My5pcCwKIAkJCSAgICAoX19mb3JjZSB1MzIpdHVwbGUtPnNyYy51LmFsbCBeIHpvbmUsCi0JCQkgICAgdHVwbGUtPmRzdC5wcm90b251bSwgMCk7CisJCQkgICAgdHVwbGUtPmRzdC5wcm90b251bSwgbmZfY29ubnRyYWNrX2hhc2hfcm5kKTsKIAlyZXR1cm4gKCh1NjQpaGFzaCAqIG5ldC0+aXB2NC5uYXRfaHRhYmxlX3NpemUpID4+IDMyOwogfQogCkBAIC04MiwxNCArODEsMTQgQEAKICAqIHRoYXQgbWVldCB0aGUgY29uc3RyYWludHMgb2YgcmFuZ2UuICovCiBzdGF0aWMgaW50CiBpbl9yYW5nZShjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UpCisJIGNvbnN0IHN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSAqcmFuZ2UpCiB7CiAJY29uc3Qgc3RydWN0IG5mX25hdF9wcm90b2NvbCAqcHJvdG87CiAJaW50IHJldCA9IDA7CiAKIAkvKiBJZiB3ZSBhcmUgc3VwcG9zZWQgdG8gbWFwIElQcywgdGhlbiB3ZSBtdXN0IGJlIGluIHRoZQogCSAgIHJhbmdlIHNwZWNpZmllZCwgb3RoZXJ3aXNlIGxldCB0aGlzIGRyYWcgdXMgb250byBhIG5ldyBzcmMgSVAuICovCi0JaWYgKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9NQVBfSVBTKSB7CisJaWYgKHJhbmdlLT5mbGFncyAmIE5GX05BVF9SQU5HRV9NQVBfSVBTKSB7CiAJCWlmIChudG9obCh0dXBsZS0+c3JjLnUzLmlwKSA8IG50b2hsKHJhbmdlLT5taW5faXApIHx8CiAJCSAgICBudG9obCh0dXBsZS0+c3JjLnUzLmlwKSA+IG50b2hsKHJhbmdlLT5tYXhfaXApKQogCQkJcmV0dXJuIDA7CkBAIC05Nyw4ICs5Niw4IEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJcHJvdG8gPSBfX25mX25hdF9wcm90b19maW5kKHR1cGxlLT5kc3QucHJvdG9udW0pOwotCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpIHx8Ci0JICAgIHByb3RvLT5pbl9yYW5nZSh0dXBsZSwgSVBfTkFUX01BTklQX1NSQywKKwlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBORl9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSB8fAorCSAgICBwcm90by0+aW5fcmFuZ2UodHVwbGUsIE5GX05BVF9NQU5JUF9TUkMsCiAJCQkgICAgJnJhbmdlLT5taW4sICZyYW5nZS0+bWF4KSkKIAkJcmV0ID0gMTsKIAlyY3VfcmVhZF91bmxvY2soKTsKQEAgLTEyMyw3ICsxMjIsNyBAQAogZmluZF9hcHByb3ByaWF0ZV9zcmMoc3RydWN0IG5ldCAqbmV0LCB1MTYgem9uZSwKIAkJICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkJICAgICBzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICpyZXN1bHQsCi0JCSAgICAgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UpCisJCSAgICAgY29uc3Qgc3RydWN0IG5mX25hdF9pcHY0X3JhbmdlICpyYW5nZSkKIHsKIAl1bnNpZ25lZCBpbnQgaCA9IGhhc2hfYnlfc3JjKG5ldCwgem9uZSwgdHVwbGUpOwogCWNvbnN0IHN0cnVjdCBuZl9jb25uX25hdCAqbmF0OwpAQCAtMTU3LDcgKzE1Niw3IEBACiAqLwogc3RhdGljIHZvaWQKIGZpbmRfYmVzdF9pcHNfcHJvdG8odTE2IHpvbmUsIHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkgICAgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCisJCSAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlLAogCQkgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0LAogCQkgICAgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUpCiB7CkBAIC0xNjYsMTAgKzE2NSwxMCBAQAogCXVfaW50MzJfdCBtaW5pcCwgbWF4aXAsIGo7CiAKIAkvKiBObyBJUCBtYXBwaW5nPyAgRG8gbm90aGluZy4gKi8KLQlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfTUFQX0lQUykpCisJaWYgKCEocmFuZ2UtPmZsYWdzICYgTkZfTkFUX1JBTkdFX01BUF9JUFMpKQogCQlyZXR1cm47CiAKLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpCisJaWYgKG1hbmlwdHlwZSA9PSBORl9OQVRfTUFOSVBfU1JDKQogCQl2YXJfaXBwID0gJnR1cGxlLT5zcmMudTMuaXA7CiAJZWxzZQogCQl2YXJfaXBwID0gJnR1cGxlLT5kc3QudTMuaXA7CkBAIC0xODksNyArMTg4LDcgQEAKIAltaW5pcCA9IG50b2hsKHJhbmdlLT5taW5faXApOwogCW1heGlwID0gbnRvaGwocmFuZ2UtPm1heF9pcCk7CiAJaiA9IGpoYXNoXzJ3b3JkcygoX19mb3JjZSB1MzIpdHVwbGUtPnNyYy51My5pcCwKLQkJCSByYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUEVSU0lTVEVOVCA/CisJCQkgcmFuZ2UtPmZsYWdzICYgTkZfTkFUX1JBTkdFX1BFUlNJU1RFTlQgPwogCQkJCTAgOiAoX19mb3JjZSB1MzIpdHVwbGUtPmRzdC51My5pcCBeIHpvbmUsIDApOwogCWogPSAoKHU2NClqICogKG1heGlwIC0gbWluaXAgKyAxKSkgPj4gMzI7CiAJKnZhcl9pcHAgPSBodG9ubChtaW5pcCArIGopOwpAQCAtMjA0LDcgKzIwMyw3IEBACiBzdGF0aWMgdm9pZAogZ2V0X3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKIAkJIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKm9yaWdfdHVwbGUsCi0JCSBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJIGNvbnN0IHN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSAqcmFuZ2UsCiAJCSBzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCSBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSkKIHsKQEAgLTIxOSw4ICsyMTgsOCBAQAogCSAgIFRoaXMgaXMgb25seSByZXF1aXJlZCBmb3Igc291cmNlIChpZS4gTkFUL21hc3EpIG1hcHBpbmdzLgogCSAgIFNvIGZhciwgd2UgZG9uJ3QgZG8gbG9jYWwgc291cmNlIG1hcHBpbmdzLCBzbyBtdWx0aXBsZQogCSAgIG1hbmlwcyBub3QgYW4gaXNzdWUuICAqLwotCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQyAmJgotCSAgICAhKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pKSB7CisJaWYgKG1hbmlwdHlwZSA9PSBORl9OQVRfTUFOSVBfU1JDICYmCisJICAgICEocmFuZ2UtPmZsYWdzICYgTkZfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkpIHsKIAkJLyogdHJ5IHRoZSBvcmlnaW5hbCB0dXBsZSBmaXJzdCAqLwogCQlpZiAoaW5fcmFuZ2Uob3JpZ190dXBsZSwgcmFuZ2UpKSB7CiAJCQlpZiAoIW5mX25hdF91c2VkX3R1cGxlKG9yaWdfdHVwbGUsIGN0KSkgewpAQCAtMjQ3LDggKzI0Niw4IEBACiAJcHJvdG8gPSBfX25mX25hdF9wcm90b19maW5kKG9yaWdfdHVwbGUtPmRzdC5wcm90b251bSk7CiAKIAkvKiBPbmx5IGJvdGhlciBtYXBwaW5nIGlmIGl0J3Mgbm90IGFscmVhZHkgaW4gcmFuZ2UgYW5kIHVuaXF1ZSAqLwotCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pKSB7Ci0JCWlmIChyYW5nZS0+ZmxhZ3MgJiBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSB7CisJaWYgKCEocmFuZ2UtPmZsYWdzICYgTkZfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkpIHsKKwkJaWYgKHJhbmdlLT5mbGFncyAmIE5GX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpIHsKIAkJCWlmIChwcm90by0+aW5fcmFuZ2UodHVwbGUsIG1hbmlwdHlwZSwgJnJhbmdlLT5taW4sCiAJCQkJCSAgICAmcmFuZ2UtPm1heCkgJiYKIAkJCSAgICAocmFuZ2UtPm1pbi5hbGwgPT0gcmFuZ2UtPm1heC5hbGwgfHwKQEAgLTI2Nyw3ICsyNjYsNyBAQAogCiB1bnNpZ25lZCBpbnQKIG5mX25hdF9zZXR1cF9pbmZvKHN0cnVjdCBuZl9jb25uICpjdCwKLQkJICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJICBjb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlLAogCQkgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlKQogewogCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X25ldChjdCk7CkBAIC0yODQsOCArMjgzLDggQEAKIAkJfQogCX0KIAotCU5GX0NUX0FTU0VSVChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQyB8fAotCQkgICAgIG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfRFNUKTsKKwlORl9DVF9BU1NFUlQobWFuaXB0eXBlID09IE5GX05BVF9NQU5JUF9TUkMgfHwKKwkJICAgICBtYW5pcHR5cGUgPT0gTkZfTkFUX01BTklQX0RTVCk7CiAJQlVHX09OKG5mX25hdF9pbml0aWFsaXplZChjdCwgbWFuaXB0eXBlKSk7CiAKIAkvKiBXaGF0IHdlJ3ZlIGdvdCB3aWxsIGxvb2sgbGlrZSBpbnZlcnNlIG9mIHJlcGx5LiBOb3JtYWxseQpAQCAtMzA2LDEzICszMDUsMTMgQEAKIAkJbmZfY29ubnRyYWNrX2FsdGVyX3JlcGx5KGN0LCAmcmVwbHkpOwogCiAJCS8qIE5vbi1hdG9taWM6IHdlIG93biB0aGlzIGF0IHRoZSBtb21lbnQuICovCi0JCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKKwkJaWYgKG1hbmlwdHlwZSA9PSBORl9OQVRfTUFOSVBfU1JDKQogCQkJY3QtPnN0YXR1cyB8PSBJUFNfU1JDX05BVDsKIAkJZWxzZQogCQkJY3QtPnN0YXR1cyB8PSBJUFNfRFNUX05BVDsKIAl9CiAKLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpIHsKKwlpZiAobWFuaXB0eXBlID09IE5GX05BVF9NQU5JUF9TUkMpIHsKIAkJdW5zaWduZWQgaW50IHNyY2hhc2g7CiAKIAkJc3JjaGFzaCA9IGhhc2hfYnlfc3JjKG5ldCwgbmZfY3Rfem9uZShjdCksCkBAIC0zMjcsNyArMzI2LDcgQEAKIAl9CiAKIAkvKiBJdCdzIGRvbmUuICovCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfRFNUKQorCWlmIChtYW5pcHR5cGUgPT0gTkZfTkFUX01BTklQX0RTVCkKIAkJY3QtPnN0YXR1cyB8PSBJUFNfRFNUX05BVF9ET05FOwogCWVsc2UKIAkJY3QtPnN0YXR1cyB8PSBJUFNfU1JDX05BVF9ET05FOwpAQCAtMzYxLDcgKzM2MCw3IEBACiAKIAlpcGggPSAodm9pZCAqKXNrYi0+ZGF0YSArIGlwaGRyb2ZmOwogCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7CisJaWYgKG1hbmlwdHlwZSA9PSBORl9OQVRfTUFOSVBfU1JDKSB7CiAJCWNzdW1fcmVwbGFjZTQoJmlwaC0+Y2hlY2ssIGlwaC0+c2FkZHIsIHRhcmdldC0+c3JjLnUzLmlwKTsKIAkJaXBoLT5zYWRkciA9IHRhcmdldC0+c3JjLnUzLmlwOwogCX0gZWxzZSB7CkBAIC0zODEsNyArMzgwLDcgQEAKIAl1bnNpZ25lZCBsb25nIHN0YXR1c2JpdDsKIAllbnVtIG5mX25hdF9tYW5pcF90eXBlIG10eXBlID0gSE9PSzJNQU5JUChob29rbnVtKTsKIAotCWlmIChtdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQorCWlmIChtdHlwZSA9PSBORl9OQVRfTUFOSVBfU1JDKQogCQlzdGF0dXNiaXQgPSBJUFNfU1JDX05BVDsKIAllbHNlCiAJCXN0YXR1c2JpdCA9IElQU19EU1RfTkFUOwpAQCAtNDE0LDggKzQxMyw3IEBACiAJCXN0cnVjdCBpY21waGRyIGljbXA7CiAJCXN0cnVjdCBpcGhkciBpcDsKIAl9ICppbnNpZGU7Ci0JY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sNHByb3RvICpsNHByb3RvOwotCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgaW5uZXIsIHRhcmdldDsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlIHRhcmdldDsKIAlpbnQgaGRybGVuID0gaXBfaGRybGVuKHNrYik7CiAJZW51bSBpcF9jb25udHJhY2tfZGlyIGRpciA9IENUSU5GTzJESVIoY3RpbmZvKTsKIAl1bnNpZ25lZCBsb25nIHN0YXR1c2JpdDsKQEAgLTQ0Nyw3ICs0NDUsNyBAQAogCQkJcmV0dXJuIDA7CiAJfQogCi0JaWYgKG1hbmlwID09IElQX05BVF9NQU5JUF9TUkMpCisJaWYgKG1hbmlwID09IE5GX05BVF9NQU5JUF9TUkMpCiAJCXN0YXR1c2JpdCA9IElQU19TUkNfTkFUOwogCWVsc2UKIAkJc3RhdHVzYml0ID0gSVBTX0RTVF9OQVQ7CkBAIC00NjMsMTYgKzQ2MSw2IEBACiAJCSAiZGlyICVzXG4iLCBza2IsIG1hbmlwLAogCQkgZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCA/ICJPUklHIiA6ICJSRVBMWSIpOwogCi0JLyogcmN1X3JlYWRfbG9jaygpZWQgYnkgbmZfaG9va19zbG93ICovCi0JbDRwcm90byA9IF9fbmZfY3RfbDRwcm90b19maW5kKFBGX0lORVQsIGluc2lkZS0+aXAucHJvdG9jb2wpOwotCi0JaWYgKCFuZl9jdF9nZXRfdHVwbGUoc2tiLCBoZHJsZW4gKyBzaXplb2Yoc3RydWN0IGljbXBoZHIpLAotCQkJICAgICAoaGRybGVuICsKLQkJCSAgICAgIHNpemVvZihzdHJ1Y3QgaWNtcGhkcikgKyBpbnNpZGUtPmlwLmlobCAqIDQpLAotCQkJICAgICAodV9pbnQxNl90KUFGX0lORVQsIGluc2lkZS0+aXAucHJvdG9jb2wsCi0JCQkgICAgICZpbm5lciwgbDNwcm90bywgbDRwcm90bykpCi0JCXJldHVybiAwOwotCiAJLyogQ2hhbmdlIGlubmVyIGJhY2sgdG8gbG9vayBsaWtlIGluY29taW5nIHBhY2tldC4gIFdlIGRvIHRoZQogCSAgIG9wcG9zaXRlIG1hbmlwIG9uIHRoaXMgaG9vayB0byBub3JtYWwsIGJlY2F1c2UgaXQgbWlnaHQgbm90CiAJICAgcGFzcyBhbGwgaG9va3MgKGxvY2FsbHktZ2VuZXJhdGVkIElDTVApLiAgQ29uc2lkZXIgaW5jb21pbmcKQEAgLTU3NSwyNiArNTYzLDYgQEAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaD4KIAotc3RhdGljIGNvbnN0IHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKgotbmZfbmF0X3Byb3RvX2ZpbmRfZ2V0KHVfaW50OF90IHByb3RvbnVtKQotewotCWNvbnN0IHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKnA7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0JcCA9IF9fbmZfbmF0X3Byb3RvX2ZpbmQocHJvdG9udW0pOwotCWlmICghdHJ5X21vZHVsZV9nZXQocC0+bWUpKQotCQlwID0gJm5mX25hdF91bmtub3duX3Byb3RvY29sOwotCXJjdV9yZWFkX3VubG9jaygpOwotCi0JcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyB2b2lkCi1uZl9uYXRfcHJvdG9fcHV0KGNvbnN0IHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKnApCi17Ci0JbW9kdWxlX3B1dChwLT5tZSk7Ci19Ci0KIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSBwcm90b25hdF9ubGFfcG9saWN5W0NUQV9QUk9UT05BVF9NQVgrMV0gPSB7CiAJW0NUQV9QUk9UT05BVF9QT1JUX01JTl0JPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtDVEFfUFJPVE9OQVRfUE9SVF9NQVhdCT0geyAudHlwZSA9IE5MQV9VMTYgfSwKQEAgLTYwMiw3ICs1NzAsNyBAQAogCiBzdGF0aWMgaW50IG5mbmV0bGlua19wYXJzZV9uYXRfcHJvdG8oc3RydWN0IG5sYXR0ciAqYXR0ciwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCQkgICAgIHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKQorCQkJCSAgICAgc3RydWN0IG5mX25hdF9pcHY0X3JhbmdlICpyYW5nZSkKIHsKIAlzdHJ1Y3QgbmxhdHRyICp0YltDVEFfUFJPVE9OQVRfTUFYKzFdOwogCWNvbnN0IHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgKm5wdDsKQEAgLTYxMiwyMSArNTgwLDIzIEBACiAJaWYgKGVyciA8IDApCiAJCXJldHVybiBlcnI7CiAKLQlucHQgPSBuZl9uYXRfcHJvdG9fZmluZF9nZXQobmZfY3RfcHJvdG9udW0oY3QpKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisJbnB0ID0gX19uZl9uYXRfcHJvdG9fZmluZChuZl9jdF9wcm90b251bShjdCkpOwogCWlmIChucHQtPm5sYXR0cl90b19yYW5nZSkKIAkJZXJyID0gbnB0LT5ubGF0dHJfdG9fcmFuZ2UodGIsIHJhbmdlKTsKLQluZl9uYXRfcHJvdG9fcHV0KG5wdCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5hdF9ubGFfcG9saWN5W0NUQV9OQVRfTUFYKzFdID0gewogCVtDVEFfTkFUX01JTklQXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtDVEFfTkFUX01BWElQXQkJPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtDVEFfTkFUX1BST1RPXQkJPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogfTsKIAogc3RhdGljIGludAogbmZuZXRsaW5rX3BhcnNlX25hdChjb25zdCBzdHJ1Y3QgbmxhdHRyICpuYXQsCi0JCSAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsIHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKQorCQkgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0LCBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlKQogewogCXN0cnVjdCBubGF0dHIgKnRiW0NUQV9OQVRfTUFYKzFdOwogCWludCBlcnI7CkBAIC02NDYsNyArNjE2LDcgQEAKIAkJcmFuZ2UtPm1heF9pcCA9IG5sYV9nZXRfYmUzMih0YltDVEFfTkFUX01BWElQXSk7CiAKIAlpZiAocmFuZ2UtPm1pbl9pcCkKLQkJcmFuZ2UtPmZsYWdzIHw9IElQX05BVF9SQU5HRV9NQVBfSVBTOworCQlyYW5nZS0+ZmxhZ3MgfD0gTkZfTkFUX1JBTkdFX01BUF9JUFM7CiAKIAlpZiAoIXRiW0NUQV9OQVRfUFJPVE9dKQogCQlyZXR1cm4gMDsKQEAgLTY2Myw3ICs2MzMsNyBAQAogCQkJICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwLAogCQkJICBjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyKQogewotCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2U7CisJc3RydWN0IG5mX25hdF9pcHY0X3JhbmdlIHJhbmdlOwogCiAJaWYgKG5mbmV0bGlua19wYXJzZV9uYXQoYXR0ciwgY3QsICZyYW5nZSkgPCAwKQogCQlyZXR1cm4gLUVJTlZBTDsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaDMyMy5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oMzIzLmMKaW5kZXggYjlhMTEzNi4uZGMxZGQ5MSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oMzIzLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oMzIzLmMKQEAgLTM5OCw3ICszOTgsNyBAQAogc3RhdGljIHZvaWQgaXBfbmF0X3E5MzFfZXhwZWN0KHN0cnVjdCBuZl9jb25uICpuZXcsCiAJCQkgICAgICAgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKnRoaXMpCiB7Ci0Jc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZTsKKwlzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgcmFuZ2U7CiAKIAlpZiAodGhpcy0+dHVwbGUuc3JjLnUzLmlwICE9IDApIHsJLyogT25seSBhY2NlcHQgY2FsbHMgZnJvbSBHSyAqLwogCQluZl9uYXRfZm9sbG93X21hc3RlcihuZXcsIHRoaXMpOwpAQCAtNDA5LDE2ICs0MDksMTYgQEAKIAlCVUdfT04obmV3LT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSyk7CiAKIAkvKiBDaGFuZ2Ugc3JjIHRvIHdoZXJlIG1hc3RlciBzZW5kcyB0byAqLwotCXJhbmdlLmZsYWdzID0gSVBfTkFUX1JBTkdFX01BUF9JUFM7CisJcmFuZ2UuZmxhZ3MgPSBORl9OQVRfUkFOR0VfTUFQX0lQUzsKIAlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAgPSBuZXctPnR1cGxlaGFzaFshdGhpcy0+ZGlyXS50dXBsZS5zcmMudTMuaXA7Ci0JbmZfbmF0X3NldHVwX2luZm8obmV3LCAmcmFuZ2UsIElQX05BVF9NQU5JUF9TUkMpOworCW5mX25hdF9zZXR1cF9pbmZvKG5ldywgJnJhbmdlLCBORl9OQVRfTUFOSVBfU1JDKTsKIAogCS8qIEZvciBEU1QgbWFuaXAsIG1hcCBwb3J0IGhlcmUgdG8gd2hlcmUgaXQncyBleHBlY3RlZC4gKi8KLQlyYW5nZS5mbGFncyA9IChJUF9OQVRfUkFOR0VfTUFQX0lQUyB8IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpOworCXJhbmdlLmZsYWdzID0gKE5GX05BVF9SQU5HRV9NQVBfSVBTIHwgTkZfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCk7CiAJcmFuZ2UubWluID0gcmFuZ2UubWF4ID0gdGhpcy0+c2F2ZWRfcHJvdG87CiAJcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwID0KIAkgICAgbmV3LT5tYXN0ZXItPnR1cGxlaGFzaFshdGhpcy0+ZGlyXS50dXBsZS5zcmMudTMuaXA7Ci0JbmZfbmF0X3NldHVwX2luZm8obmV3LCAmcmFuZ2UsIElQX05BVF9NQU5JUF9EU1QpOworCW5mX25hdF9zZXR1cF9pbmZvKG5ldywgJnJhbmdlLCBORl9OQVRfTUFOSVBfRFNUKTsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00OTYsMjEgKzQ5NiwyMSBAQAogc3RhdGljIHZvaWQgaXBfbmF0X2NhbGxmb3J3YXJkaW5nX2V4cGVjdChzdHJ1Y3QgbmZfY29ubiAqbmV3LAogCQkJCQkgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKnRoaXMpCiB7Ci0Jc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZTsKKwlzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgcmFuZ2U7CiAKIAkvKiBUaGlzIG11c3QgYmUgYSBmcmVzaCBvbmUuICovCiAJQlVHX09OKG5ldy0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spOwogCiAJLyogQ2hhbmdlIHNyYyB0byB3aGVyZSBtYXN0ZXIgc2VuZHMgdG8gKi8KLQlyYW5nZS5mbGFncyA9IElQX05BVF9SQU5HRV9NQVBfSVBTOworCXJhbmdlLmZsYWdzID0gTkZfTkFUX1JBTkdFX01BUF9JUFM7CiAJcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwID0gbmV3LT50dXBsZWhhc2hbIXRoaXMtPmRpcl0udHVwbGUuc3JjLnUzLmlwOwotCW5mX25hdF9zZXR1cF9pbmZvKG5ldywgJnJhbmdlLCBJUF9OQVRfTUFOSVBfU1JDKTsKKwluZl9uYXRfc2V0dXBfaW5mbyhuZXcsICZyYW5nZSwgTkZfTkFUX01BTklQX1NSQyk7CiAKIAkvKiBGb3IgRFNUIG1hbmlwLCBtYXAgcG9ydCBoZXJlIHRvIHdoZXJlIGl0J3MgZXhwZWN0ZWQuICovCi0JcmFuZ2UuZmxhZ3MgPSAoSVBfTkFUX1JBTkdFX01BUF9JUFMgfCBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKTsKKwlyYW5nZS5mbGFncyA9IChORl9OQVRfUkFOR0VfTUFQX0lQUyB8IE5GX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpOwogCXJhbmdlLm1pbiA9IHJhbmdlLm1heCA9IHRoaXMtPnNhdmVkX3Byb3RvOwogCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcCA9IHRoaXMtPnNhdmVkX2lwOwotCW5mX25hdF9zZXR1cF9pbmZvKG5ldywgJnJhbmdlLCBJUF9OQVRfTUFOSVBfRFNUKTsKKwluZl9uYXRfc2V0dXBfaW5mbyhuZXcsICZyYW5nZSwgTkZfTkFUX01BTklQX0RTVCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfaGVscGVyLmMKaW5kZXggZWJjNWY4OC4uYWY2NTk1OCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9oZWxwZXIuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X2hlbHBlci5jCkBAIC0yNTMsMTIgKzI1Myw2IEBACiAJc3RydWN0IHVkcGhkciAqdWRwaDsKIAlpbnQgZGF0YWxlbiwgb2xkbGVuOwogCi0JLyogVURQIGhlbHBlcnMgbWlnaHQgYWNjaWRlbnRhbGx5IG1hbmdsZSB0aGUgd3JvbmcgcGFja2V0ICovCi0JaXBoID0gaXBfaGRyKHNrYik7Ci0JaWYgKHNrYi0+bGVuIDwgaXBoLT5paGwqNCArIHNpemVvZigqdWRwaCkgKwotCQkJICAgICAgIG1hdGNoX29mZnNldCArIG1hdGNoX2xlbikKLQkJcmV0dXJuIDA7Ci0KIAlpZiAoIXNrYl9tYWtlX3dyaXRhYmxlKHNrYiwgc2tiLT5sZW4pKQogCQlyZXR1cm4gMDsKIApAQCAtNDMwLDIyICs0MjQsMjIgQEAKIHZvaWQgbmZfbmF0X2ZvbGxvd19tYXN0ZXIoc3RydWN0IG5mX2Nvbm4gKmN0LAogCQkJICBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQogewotCXN0cnVjdCBuZl9uYXRfcmFuZ2UgcmFuZ2U7CisJc3RydWN0IG5mX25hdF9pcHY0X3JhbmdlIHJhbmdlOwogCiAJLyogVGhpcyBtdXN0IGJlIGEgZnJlc2ggb25lLiAqLwogCUJVR19PTihjdC0+c3RhdHVzICYgSVBTX05BVF9ET05FX01BU0spOwogCiAJLyogQ2hhbmdlIHNyYyB0byB3aGVyZSBtYXN0ZXIgc2VuZHMgdG8gKi8KLQlyYW5nZS5mbGFncyA9IElQX05BVF9SQU5HRV9NQVBfSVBTOworCXJhbmdlLmZsYWdzID0gTkZfTkFUX1JBTkdFX01BUF9JUFM7CiAJcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwCiAJCT0gY3QtPm1hc3Rlci0+dHVwbGVoYXNoWyFleHAtPmRpcl0udHVwbGUuZHN0LnUzLmlwOwotCW5mX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIElQX05BVF9NQU5JUF9TUkMpOworCW5mX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIE5GX05BVF9NQU5JUF9TUkMpOwogCiAJLyogRm9yIERTVCBtYW5pcCwgbWFwIHBvcnQgaGVyZSB0byB3aGVyZSBpdCdzIGV4cGVjdGVkLiAqLwotCXJhbmdlLmZsYWdzID0gKElQX05BVF9SQU5HRV9NQVBfSVBTIHwgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCk7CisJcmFuZ2UuZmxhZ3MgPSAoTkZfTkFUX1JBTkdFX01BUF9JUFMgfCBORl9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKTsKIAlyYW5nZS5taW4gPSByYW5nZS5tYXggPSBleHAtPnNhdmVkX3Byb3RvOwogCXJhbmdlLm1pbl9pcCA9IHJhbmdlLm1heF9pcAogCQk9IGN0LT5tYXN0ZXItPnR1cGxlaGFzaFshZXhwLT5kaXJdLnR1cGxlLnNyYy51My5pcDsKLQluZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBJUF9OQVRfTUFOSVBfRFNUKTsKKwluZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBORl9OQVRfTUFOSVBfRFNUKTsKIH0KIEVYUE9SVF9TWU1CT0wobmZfbmF0X2ZvbGxvd19tYXN0ZXIpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcHRwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3BwdHAuYwppbmRleCAzZTgyODRiLi5jMjczZDU4IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3BwdHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3BwdHAuYwpAQCAtNDcsNyArNDcsNyBAQAogCXN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgdDsKIAljb25zdCBzdHJ1Y3QgbmZfY3RfcHB0cF9tYXN0ZXIgKmN0X3BwdHBfaW5mbzsKIAljb25zdCBzdHJ1Y3QgbmZfbmF0X3BwdHAgKm5hdF9wcHRwX2luZm87Ci0Jc3RydWN0IG5mX25hdF9yYW5nZSByYW5nZTsKKwlzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgcmFuZ2U7CiAKIAljdF9wcHRwX2luZm8gPSAmbmZjdF9oZWxwKG1hc3RlciktPmhlbHAuY3RfcHB0cF9pbmZvOwogCW5hdF9wcHRwX2luZm8gPSAmbmZjdF9uYXQobWFzdGVyKS0+aGVscC5uYXRfcHB0cF9pbmZvOwpAQCAtODgsMjQgKzg4LDI0IEBACiAJQlVHX09OKGN0LT5zdGF0dXMgJiBJUFNfTkFUX0RPTkVfTUFTSyk7CiAKIAkvKiBDaGFuZ2Ugc3JjIHRvIHdoZXJlIG1hc3RlciBzZW5kcyB0byAqLwotCXJhbmdlLmZsYWdzID0gSVBfTkFUX1JBTkdFX01BUF9JUFM7CisJcmFuZ2UuZmxhZ3MgPSBORl9OQVRfUkFOR0VfTUFQX0lQUzsKIAlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAKIAkJPSBjdC0+bWFzdGVyLT50dXBsZWhhc2hbIWV4cC0+ZGlyXS50dXBsZS5kc3QudTMuaXA7CiAJaWYgKGV4cC0+ZGlyID09IElQX0NUX0RJUl9PUklHSU5BTCkgewotCQlyYW5nZS5mbGFncyB8PSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOworCQlyYW5nZS5mbGFncyB8PSBORl9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOwogCQlyYW5nZS5taW4gPSByYW5nZS5tYXggPSBleHAtPnNhdmVkX3Byb3RvOwogCX0KLQluZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBJUF9OQVRfTUFOSVBfU1JDKTsKKwluZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBORl9OQVRfTUFOSVBfU1JDKTsKIAogCS8qIEZvciBEU1QgbWFuaXAsIG1hcCBwb3J0IGhlcmUgdG8gd2hlcmUgaXQncyBleHBlY3RlZC4gKi8KLQlyYW5nZS5mbGFncyA9IElQX05BVF9SQU5HRV9NQVBfSVBTOworCXJhbmdlLmZsYWdzID0gTkZfTkFUX1JBTkdFX01BUF9JUFM7CiAJcmFuZ2UubWluX2lwID0gcmFuZ2UubWF4X2lwCiAJCT0gY3QtPm1hc3Rlci0+dHVwbGVoYXNoWyFleHAtPmRpcl0udHVwbGUuc3JjLnUzLmlwOwogCWlmIChleHAtPmRpciA9PSBJUF9DVF9ESVJfUkVQTFkpIHsKLQkJcmFuZ2UuZmxhZ3MgfD0gSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRDsKKwkJcmFuZ2UuZmxhZ3MgfD0gTkZfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRDsKIAkJcmFuZ2UubWluID0gcmFuZ2UubWF4ID0gZXhwLT5zYXZlZF9wcm90bzsKIAl9Ci0JbmZfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgSVBfTkFUX01BTklQX0RTVCk7CisJbmZfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgTkZfTkFUX01BTklQX0RTVCk7CiB9CiAKIC8qIG91dGJvdW5kIHBhY2tldHMgPT0gZnJvbSBQTlMgdG8gUEFDICovCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2NvbW1vbi5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19jb21tb24uYwppbmRleCBhM2Q5OTc2Li45OTkzYmM5IDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2NvbW1vbi5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fY29tbW9uLmMKQEAgLTI2LDcgKzI2LDcgQEAKIHsKIAlfX2JlMTYgcG9ydDsKIAotCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykKKwlpZiAobWFuaXB0eXBlID09IE5GX05BVF9NQU5JUF9TUkMpCiAJCXBvcnQgPSB0dXBsZS0+c3JjLnUuYWxsOwogCWVsc2UKIAkJcG9ydCA9IHR1cGxlLT5kc3QudS5hbGw7CkBAIC0zNyw3ICszNyw3IEBACiBFWFBPUlRfU1lNQk9MX0dQTChuZl9uYXRfcHJvdG9faW5fcmFuZ2UpOwogCiB2b2lkIG5mX25hdF9wcm90b191bmlxdWVfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5mX25hdF9pcHY0X3JhbmdlICpyYW5nZSwKIAkJCSAgICAgICBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCQkgICAgICAgdV9pbnQxNl90ICpyb3ZlcikKQEAgLTQ2LDE1ICs0NiwxNSBAQAogCV9fYmUxNiAqcG9ydHB0cjsKIAl1X2ludDE2X3Qgb2ZmOwogCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQorCWlmIChtYW5pcHR5cGUgPT0gTkZfTkFUX01BTklQX1NSQykKIAkJcG9ydHB0ciA9ICZ0dXBsZS0+c3JjLnUuYWxsOwogCWVsc2UKIAkJcG9ydHB0ciA9ICZ0dXBsZS0+ZHN0LnUuYWxsOwogCiAJLyogSWYgbm8gcmFuZ2Ugc3BlY2lmaWVkLi4uICovCi0JaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpIHsKKwlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBORl9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSkgewogCQkvKiBJZiBpdCdzIGRzdCByZXdyaXRlLCBjYW4ndCBjaGFuZ2UgcG9ydCAqLwotCQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9EU1QpCisJCWlmIChtYW5pcHR5cGUgPT0gTkZfTkFUX01BTklQX0RTVCkKIAkJCXJldHVybjsKIAogCQlpZiAobnRvaHMoKnBvcnRwdHIpIDwgMTAyNCkgewpAQCAtNzUsOSArNzUsOSBAQAogCQlyYW5nZV9zaXplID0gbnRvaHMocmFuZ2UtPm1heC5hbGwpIC0gbWluICsgMTsKIAl9CiAKLQlpZiAocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkKKwlpZiAocmFuZ2UtPmZsYWdzICYgTkZfTkFUX1JBTkdFX1BST1RPX1JBTkRPTSkKIAkJb2ZmID0gc2VjdXJlX2lwdjRfcG9ydF9lcGhlbWVyYWwodHVwbGUtPnNyYy51My5pcCwgdHVwbGUtPmRzdC51My5pcCwKLQkJCQkJCSBtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQworCQkJCQkJIG1hbmlwdHlwZSA9PSBORl9OQVRfTUFOSVBfU1JDCiAJCQkJCQkgPyB0dXBsZS0+ZHN0LnUuYWxsCiAJCQkJCQkgOiB0dXBsZS0+c3JjLnUuYWxsKTsKIAllbHNlCkBAIC04Nyw3ICs4Nyw3IEBACiAJCSpwb3J0cHRyID0gaHRvbnMobWluICsgb2ZmICUgcmFuZ2Vfc2l6ZSk7CiAJCWlmICgrK2kgIT0gcmFuZ2Vfc2l6ZSAmJiBuZl9uYXRfdXNlZF90dXBsZSh0dXBsZSwgY3QpKQogCQkJY29udGludWU7Ci0JCWlmICghKHJhbmdlLT5mbGFncyAmIElQX05BVF9SQU5HRV9QUk9UT19SQU5ET00pKQorCQlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBORl9OQVRfUkFOR0VfUFJPVE9fUkFORE9NKSkKIAkJCSpyb3ZlciA9IG9mZjsKIAkJcmV0dXJuOwogCX0KQEAgLTk2LDMxICs5NiwxOSBAQAogRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3Byb3RvX3VuaXF1ZV90dXBsZSk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LX01PRFVMRSkKLWludCBuZl9uYXRfcHJvdG9fcmFuZ2VfdG9fbmxhdHRyKHN0cnVjdCBza19idWZmICpza2IsCi0JCQkJIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKQotewotCU5MQV9QVVRfQkUxNihza2IsIENUQV9QUk9UT05BVF9QT1JUX01JTiwgcmFuZ2UtPm1pbi5hbGwpOwotCU5MQV9QVVRfQkUxNihza2IsIENUQV9QUk9UT05BVF9QT1JUX01BWCwgcmFuZ2UtPm1heC5hbGwpOwotCXJldHVybiAwOwotCi1ubGFfcHV0X2ZhaWx1cmU6Ci0JcmV0dXJuIC0xOwotfQotRVhQT1JUX1NZTUJPTF9HUEwobmZfbmF0X3Byb3RvX25sYXR0cl90b19yYW5nZSk7Ci0KIGludCBuZl9uYXRfcHJvdG9fbmxhdHRyX3RvX3JhbmdlKHN0cnVjdCBubGF0dHIgKnRiW10sCi0JCQkJIHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlKQorCQkJCSBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlKQogewogCWlmICh0YltDVEFfUFJPVE9OQVRfUE9SVF9NSU5dKSB7CiAJCXJhbmdlLT5taW4uYWxsID0gbmxhX2dldF9iZTE2KHRiW0NUQV9QUk9UT05BVF9QT1JUX01JTl0pOwogCQlyYW5nZS0+bWF4LmFsbCA9IHJhbmdlLT5taW4udGNwLnBvcnQ7Ci0JCXJhbmdlLT5mbGFncyB8PSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOworCQlyYW5nZS0+ZmxhZ3MgfD0gTkZfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRDsKIAl9CiAJaWYgKHRiW0NUQV9QUk9UT05BVF9QT1JUX01BWF0pIHsKIAkJcmFuZ2UtPm1heC5hbGwgPSBubGFfZ2V0X2JlMTYodGJbQ1RBX1BST1RPTkFUX1BPUlRfTUFYXSk7Ci0JCXJhbmdlLT5mbGFncyB8PSBJUF9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEOworCQlyYW5nZS0+ZmxhZ3MgfD0gTkZfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRDsKIAl9CiAJcmV0dXJuIDA7CiB9Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9uYXRfcHJvdG9fcmFuZ2VfdG9fbmxhdHRyKTsKK0VYUE9SVF9TWU1CT0xfR1BMKG5mX25hdF9wcm90b19ubGF0dHJfdG9fcmFuZ2UpOwogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2RjY3AuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZGNjcC5jCmluZGV4IDU3MGZhZjIuLjNmNjcxMzggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZGNjcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZGNjcC5jCkBAIC0yNCw3ICsyNCw3IEBACiAKIHN0YXRpYyB2b2lkCiBkY2NwX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJICBjb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlLAogCQkgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAogCQkgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKQEAgLTU0LDcgKzU0LDcgQEAKIAlpcGggPSAoc3RydWN0IGlwaGRyICopKHNrYi0+ZGF0YSArIGlwaGRyb2ZmKTsKIAloZHIgPSAoc3RydWN0IGRjY3BfaGRyICopKHNrYi0+ZGF0YSArIGhkcm9mZik7CiAKLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpIHsKKwlpZiAobWFuaXB0eXBlID09IE5GX05BVF9NQU5JUF9TUkMpIHsKIAkJb2xkaXAgPSBpcGgtPnNhZGRyOwogCQluZXdpcCA9IHR1cGxlLT5zcmMudTMuaXA7CiAJCW5ld3BvcnQgPSB0dXBsZS0+c3JjLnUuZGNjcC5wb3J0OwpAQCAtODAsMTIgKzgwLDEwIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sIG5mX25hdF9wcm90b2NvbF9kY2NwID0gewogCS5wcm90b251bQkJPSBJUFBST1RPX0RDQ1AsCi0JLm1lCQkJPSBUSElTX01PRFVMRSwKIAkubWFuaXBfcGt0CQk9IGRjY3BfbWFuaXBfcGt0LAogCS5pbl9yYW5nZQkJPSBuZl9uYXRfcHJvdG9faW5fcmFuZ2UsCiAJLnVuaXF1ZV90dXBsZQkJPSBkY2NwX3VuaXF1ZV90dXBsZSwKICNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LX01PRFVMRSkKLQkucmFuZ2VfdG9fbmxhdHRyCT0gbmZfbmF0X3Byb3RvX3JhbmdlX3RvX25sYXR0ciwKIAkubmxhdHRyX3RvX3JhbmdlCT0gbmZfbmF0X3Byb3RvX25sYXR0cl90b19yYW5nZSwKICNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZ3JlLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2dyZS5jCmluZGV4IGJjOGQ4M2EuLjQ2YmEwYjkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fZ3JlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b19ncmUuYwpAQCAtMzksNyArMzksNyBAQAogLyogZ2VuZXJhdGUgdW5pcXVlIHR1cGxlIC4uLiAqLwogc3RhdGljIHZvaWQKIGdyZV91bmlxdWVfdHVwbGUoc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsCi0JCSBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJIGNvbnN0IHN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSAqcmFuZ2UsCiAJCSBlbnVtIG5mX25hdF9tYW5pcF90eXBlIG1hbmlwdHlwZSwKIAkJIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKQEAgLTUyLDEyICs1MiwxMiBAQAogCWlmICghY3QtPm1hc3RlcikKIAkJcmV0dXJuOwogCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKQorCWlmIChtYW5pcHR5cGUgPT0gTkZfTkFUX01BTklQX1NSQykKIAkJa2V5cHRyID0gJnR1cGxlLT5zcmMudS5ncmUua2V5OwogCWVsc2UKIAkJa2V5cHRyID0gJnR1cGxlLT5kc3QudS5ncmUua2V5OwogCi0JaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpIHsKKwlpZiAoIShyYW5nZS0+ZmxhZ3MgJiBORl9OQVRfUkFOR0VfUFJPVE9fU1BFQ0lGSUVEKSkgewogCQlwcl9kZWJ1ZygiJXA6IE5BVGluZyBHUkUgUFBUUFxuIiwgY3QpOwogCQltaW4gPSAxOwogCQlyYW5nZV9zaXplID0gMHhmZmZmOwpAQCAtOTksNyArOTksNyBAQAogCiAJLyogd2Ugb25seSBoYXZlIGRlc3RpbmF0aW9uIG1hbmlwIG9mIGEgcGFja2V0LCBzaW5jZSAnc291cmNlIGtleScKIAkgKiBpcyBub3QgcHJlc2VudCBpbiB0aGUgcGFja2V0IGl0c2VsZiAqLwotCWlmIChtYW5pcHR5cGUgIT0gSVBfTkFUX01BTklQX0RTVCkKKwlpZiAobWFuaXB0eXBlICE9IE5GX05BVF9NQU5JUF9EU1QpCiAJCXJldHVybiB0cnVlOwogCXN3aXRjaCAoZ3JlaC0+dmVyc2lvbikgewogCWNhc2UgR1JFX1ZFUlNJT05fMTcwMToKQEAgLTExOSwxMiArMTE5LDEwIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sIGdyZSA9IHsKIAkucHJvdG9udW0JCT0gSVBQUk9UT19HUkUsCi0JLm1lCQkJPSBUSElTX01PRFVMRSwKIAkubWFuaXBfcGt0CQk9IGdyZV9tYW5pcF9wa3QsCiAJLmluX3JhbmdlCQk9IG5mX25hdF9wcm90b19pbl9yYW5nZSwKIAkudW5pcXVlX3R1cGxlCQk9IGdyZV91bmlxdWVfdHVwbGUsCiAjaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCi0JLnJhbmdlX3RvX25sYXR0cgk9IG5mX25hdF9wcm90b19yYW5nZV90b19ubGF0dHIsCiAJLm5sYXR0cl90b19yYW5nZQk9IG5mX25hdF9wcm90b19ubGF0dHJfdG9fcmFuZ2UsCiAjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX2ljbXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9faWNtcC5jCmluZGV4IDlmNGRjMTIuLmIzNTE3MjggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9faWNtcC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9faWNtcC5jCkBAIC0zMCw3ICszMCw3IEBACiAKIHN0YXRpYyB2b2lkCiBpY21wX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJICBjb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlLAogCQkgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAogCQkgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKQEAgLTQwLDcgKzQwLDcgQEAKIAogCXJhbmdlX3NpemUgPSBudG9ocyhyYW5nZS0+bWF4LmljbXAuaWQpIC0gbnRvaHMocmFuZ2UtPm1pbi5pY21wLmlkKSArIDE7CiAJLyogSWYgbm8gcmFuZ2Ugc3BlY2lmaWVkLi4uICovCi0JaWYgKCEocmFuZ2UtPmZsYWdzICYgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpCisJaWYgKCEocmFuZ2UtPmZsYWdzICYgTkZfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkpCiAJCXJhbmdlX3NpemUgPSAweEZGRkY7CiAKIAlmb3IgKGkgPSAwOyA7ICsraWQpIHsKQEAgLTc0LDEyICs3NCwxMCBAQAogCiBjb25zdCBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sIG5mX25hdF9wcm90b2NvbF9pY21wID0gewogCS5wcm90b251bQkJPSBJUFBST1RPX0lDTVAsCi0JLm1lCQkJPSBUSElTX01PRFVMRSwKIAkubWFuaXBfcGt0CQk9IGljbXBfbWFuaXBfcGt0LAogCS5pbl9yYW5nZQkJPSBpY21wX2luX3JhbmdlLAogCS51bmlxdWVfdHVwbGUJCT0gaWNtcF91bmlxdWVfdHVwbGUsCiAjaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCi0JLnJhbmdlX3RvX25sYXR0cgk9IG5mX25hdF9wcm90b19yYW5nZV90b19ubGF0dHIsCiAJLm5sYXR0cl90b19yYW5nZQk9IG5mX25hdF9wcm90b19ubGF0dHJfdG9fcmFuZ2UsCiAjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3NjdHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fc2N0cC5jCmluZGV4IGJkNWE4MGEuLjNjY2U5YjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fc2N0cC5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fc2N0cC5jCkBAIC0xOSw3ICsxOSw3IEBACiAKIHN0YXRpYyB2b2lkCiBzY3RwX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJICBjb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlLAogCQkgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAogCQkgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKQEAgLTQ2LDcgKzQ2LDcgQEAKIAlpcGggPSAoc3RydWN0IGlwaGRyICopKHNrYi0+ZGF0YSArIGlwaGRyb2ZmKTsKIAloZHIgPSAoc3RydWN0IHNjdHBoZHIgKikoc2tiLT5kYXRhICsgaGRyb2ZmKTsKIAotCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykgeworCWlmIChtYW5pcHR5cGUgPT0gTkZfTkFUX01BTklQX1NSQykgewogCQkvKiBHZXQgcmlkIG9mIHNyYyBpcCBhbmQgc3JjIHB0ICovCiAJCW9sZGlwID0gaXBoLT5zYWRkcjsKIAkJbmV3aXAgPSB0dXBsZS0+c3JjLnUzLmlwOwpAQCAtNzAsMTIgKzcwLDEwIEBACiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sIG5mX25hdF9wcm90b2NvbF9zY3RwID0gewogCS5wcm90b251bQkJPSBJUFBST1RPX1NDVFAsCi0JLm1lCQkJPSBUSElTX01PRFVMRSwKIAkubWFuaXBfcGt0CQk9IHNjdHBfbWFuaXBfcGt0LAogCS5pbl9yYW5nZQkJPSBuZl9uYXRfcHJvdG9faW5fcmFuZ2UsCiAJLnVuaXF1ZV90dXBsZQkJPSBzY3RwX3VuaXF1ZV90dXBsZSwKICNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LX01PRFVMRSkKLQkucmFuZ2VfdG9fbmxhdHRyCT0gbmZfbmF0X3Byb3RvX3JhbmdlX3RvX25sYXR0ciwKIAkubmxhdHRyX3RvX3JhbmdlCT0gbmZfbmF0X3Byb3RvX25sYXR0cl90b19yYW5nZSwKICNlbmRpZgogfTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdGNwLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3RjcC5jCmluZGV4IDBkNjdiYjguLjlmYjRiNGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdGNwLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b190Y3AuYwpAQCAtMjMsNyArMjMsNyBAQAogCiBzdGF0aWMgdm9pZAogdGNwX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJIGNvbnN0IHN0cnVjdCBuZl9uYXRfcmFuZ2UgKnJhbmdlLAorCQkgY29uc3Qgc3RydWN0IG5mX25hdF9pcHY0X3JhbmdlICpyYW5nZSwKIAkJIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAogCQkgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogewpAQCAtNTUsNyArNTUsNyBAQAogCWlwaCA9IChzdHJ1Y3QgaXBoZHIgKikoc2tiLT5kYXRhICsgaXBoZHJvZmYpOwogCWhkciA9IChzdHJ1Y3QgdGNwaGRyICopKHNrYi0+ZGF0YSArIGhkcm9mZik7CiAKLQlpZiAobWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMpIHsKKwlpZiAobWFuaXB0eXBlID09IE5GX05BVF9NQU5JUF9TUkMpIHsKIAkJLyogR2V0IHJpZCBvZiBzcmMgaXAgYW5kIHNyYyBwdCAqLwogCQlvbGRpcCA9IGlwaC0+c2FkZHI7CiAJCW5ld2lwID0gdHVwbGUtPnNyYy51My5pcDsKQEAgLTgyLDEyICs4MiwxMCBAQAogCiBjb25zdCBzdHJ1Y3QgbmZfbmF0X3Byb3RvY29sIG5mX25hdF9wcm90b2NvbF90Y3AgPSB7CiAJLnByb3RvbnVtCQk9IElQUFJPVE9fVENQLAotCS5tZQkJCT0gVEhJU19NT0RVTEUsCiAJLm1hbmlwX3BrdAkJPSB0Y3BfbWFuaXBfcGt0LAogCS5pbl9yYW5nZQkJPSBuZl9uYXRfcHJvdG9faW5fcmFuZ2UsCiAJLnVuaXF1ZV90dXBsZQkJPSB0Y3BfdW5pcXVlX3R1cGxlLAogI2lmIGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTkspIHx8IGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTktfTU9EVUxFKQotCS5yYW5nZV90b19ubGF0dHIJPSBuZl9uYXRfcHJvdG9fcmFuZ2VfdG9fbmxhdHRyLAogCS5ubGF0dHJfdG9fcmFuZ2UJPSBuZl9uYXRfcHJvdG9fbmxhdHRyX3RvX3JhbmdlLAogI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwLmMKaW5kZXggMGIxYjg2MC4uOTg4MzMzNiAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191ZHAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcC5jCkBAIC0yMiw3ICsyMiw3IEBACiAKIHN0YXRpYyB2b2lkCiB1ZHBfdW5pcXVlX3R1cGxlKHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAotCQkgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCisJCSBjb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlLAogCQkgZW51bSBuZl9uYXRfbWFuaXBfdHlwZSBtYW5pcHR5cGUsCiAJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CkBAIC00Nyw3ICs0Nyw3IEBACiAJaXBoID0gKHN0cnVjdCBpcGhkciAqKShza2ItPmRhdGEgKyBpcGhkcm9mZik7CiAJaGRyID0gKHN0cnVjdCB1ZHBoZHIgKikoc2tiLT5kYXRhICsgaGRyb2ZmKTsKIAotCWlmIChtYW5pcHR5cGUgPT0gSVBfTkFUX01BTklQX1NSQykgeworCWlmIChtYW5pcHR5cGUgPT0gTkZfTkFUX01BTklQX1NSQykgewogCQkvKiBHZXQgcmlkIG9mIHNyYyBpcCBhbmQgc3JjIHB0ICovCiAJCW9sZGlwID0gaXBoLT5zYWRkcjsKIAkJbmV3aXAgPSB0dXBsZS0+c3JjLnUzLmlwOwpAQCAtNzMsMTIgKzczLDEwIEBACiAKIGNvbnN0IHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgbmZfbmF0X3Byb3RvY29sX3VkcCA9IHsKIAkucHJvdG9udW0JCT0gSVBQUk9UT19VRFAsCi0JLm1lCQkJPSBUSElTX01PRFVMRSwKIAkubWFuaXBfcGt0CQk9IHVkcF9tYW5pcF9wa3QsCiAJLmluX3JhbmdlCQk9IG5mX25hdF9wcm90b19pbl9yYW5nZSwKIAkudW5pcXVlX3R1cGxlCQk9IHVkcF91bmlxdWVfdHVwbGUsCiAjaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCi0JLnJhbmdlX3RvX25sYXR0cgk9IG5mX25hdF9wcm90b19yYW5nZV90b19ubGF0dHIsCiAJLm5sYXR0cl90b19yYW5nZQk9IG5mX25hdF9wcm90b19ubGF0dHJfdG9fcmFuZ2UsCiAjZW5kaWYKIH07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3VkcGxpdGUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwbGl0ZS5jCmluZGV4IGY4M2VmMjMuLmQyNGQxMGEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwbGl0ZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcHJvdG9fdWRwbGl0ZS5jCkBAIC0yMSw3ICsyMSw3IEBACiAKIHN0YXRpYyB2b2lkCiB1ZHBsaXRlX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJICAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X3JhbmdlICpyYW5nZSwKKwkJICAgICBjb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfcmFuZ2UgKnJhbmdlLAogCQkgICAgIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAogCQkgICAgIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKQEAgLTQ3LDcgKzQ3LDcgQEAKIAlpcGggPSAoc3RydWN0IGlwaGRyICopKHNrYi0+ZGF0YSArIGlwaGRyb2ZmKTsKIAloZHIgPSAoc3RydWN0IHVkcGhkciAqKShza2ItPmRhdGEgKyBoZHJvZmYpOwogCi0JaWYgKG1hbmlwdHlwZSA9PSBJUF9OQVRfTUFOSVBfU1JDKSB7CisJaWYgKG1hbmlwdHlwZSA9PSBORl9OQVRfTUFOSVBfU1JDKSB7CiAJCS8qIEdldCByaWQgb2Ygc3JjIGlwIGFuZCBzcmMgcHQgKi8KIAkJb2xkaXAgPSBpcGgtPnNhZGRyOwogCQluZXdpcCA9IHR1cGxlLT5zcmMudTMuaXA7CkBAIC03MiwxMiArNzIsMTAgQEAKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgbmZfbmF0X3Byb3RvY29sX3VkcGxpdGUgPSB7CiAJLnByb3RvbnVtCQk9IElQUFJPVE9fVURQTElURSwKLQkubWUJCQk9IFRISVNfTU9EVUxFLAogCS5tYW5pcF9wa3QJCT0gdWRwbGl0ZV9tYW5pcF9wa3QsCiAJLmluX3JhbmdlCQk9IG5mX25hdF9wcm90b19pbl9yYW5nZSwKIAkudW5pcXVlX3R1cGxlCQk9IHVkcGxpdGVfdW5pcXVlX3R1cGxlLAogI2lmIGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTkspIHx8IGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTktfTU9EVUxFKQotCS5yYW5nZV90b19ubGF0dHIJPSBuZl9uYXRfcHJvdG9fcmFuZ2VfdG9fbmxhdHRyLAogCS5ubGF0dHJfdG9fcmFuZ2UJPSBuZl9uYXRfcHJvdG9fbmxhdHRyX3RvX3JhbmdlLAogI2VuZGlmCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9wcm90b191bmtub3duLmMgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3Vua25vd24uYwppbmRleCBhNTBmMmJjLi5lMGFmZTgxIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3Vua25vd24uYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3Byb3RvX3Vua25vd24uYwpAQCAtMjcsNyArMjcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCB1bmtub3duX3VuaXF1ZV90dXBsZShzdHJ1Y3QgbmZfY29ubnRyYWNrX3R1cGxlICp0dXBsZSwKLQkJCQkgY29uc3Qgc3RydWN0IG5mX25hdF9yYW5nZSAqcmFuZ2UsCisJCQkJIGNvbnN0IHN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSAqcmFuZ2UsCiAJCQkJIGVudW0gbmZfbmF0X21hbmlwX3R5cGUgbWFuaXB0eXBlLAogCQkJCSBjb25zdCBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CkBAIC00Niw3ICs0Niw2IEBACiB9CiAKIGNvbnN0IHN0cnVjdCBuZl9uYXRfcHJvdG9jb2wgbmZfbmF0X3Vua25vd25fcHJvdG9jb2wgPSB7Ci0JLyogLm1lIGlzbid0IHNldDogZ2V0dGluZyBhIHJlZiB0byB0aGlzIGNhbm5vdCBmYWlsLiAqLwogCS5tYW5pcF9wa3QJCT0gdW5rbm93bl9tYW5pcF9wa3QsCiAJLmluX3JhbmdlCQk9IHVua25vd25faW5fcmFuZ2UsCiAJLnVuaXF1ZV90dXBsZQkJPSB1bmtub3duX3VuaXF1ZV90dXBsZSwKZGlmZiAtLWdpdCBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfcnVsZS5jIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmMKaW5kZXggNzMzYzlhYi4uZDJhOWRjMyAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmMKKysrIGIvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9ydWxlLmMKQEAgLTQ0LDcgKzQ0LDcgQEAKIHsKIAlzdHJ1Y3QgbmZfY29ubiAqY3Q7CiAJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87Ci0JY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gcGFyLT50YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CiAKIAlORl9DVF9BU1NFUlQocGFyLT5ob29rbnVtID09IE5GX0lORVRfUE9TVF9ST1VUSU5HIHx8CiAJCSAgICAgcGFyLT5ob29rbnVtID09IE5GX0lORVRfTE9DQUxfSU4pOwpAQCAtNTYsNyArNTYsNyBAQAogCQkJICAgIGN0aW5mbyA9PSBJUF9DVF9SRUxBVEVEX1JFUExZKSk7CiAJTkZfQ1RfQVNTRVJUKHBhci0+b3V0ICE9IE5VTEwpOwogCi0JcmV0dXJuIG5mX25hdF9zZXR1cF9pbmZvKGN0LCAmbXItPnJhbmdlWzBdLCBJUF9OQVRfTUFOSVBfU1JDKTsKKwlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZtci0+cmFuZ2VbMF0sIE5GX05BVF9NQU5JUF9TUkMpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50CkBAIC02NCw3ICs2NCw3IEBACiB7CiAJc3RydWN0IG5mX2Nvbm4gKmN0OwogCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwotCWNvbnN0IHN0cnVjdCBuZl9uYXRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CisJY29uc3Qgc3RydWN0IG5mX25hdF9pcHY0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSBwYXItPnRhcmdpbmZvOwogCiAJTkZfQ1RfQVNTRVJUKHBhci0+aG9va251bSA9PSBORl9JTkVUX1BSRV9ST1VUSU5HIHx8CiAJCSAgICAgcGFyLT5ob29rbnVtID09IE5GX0lORVRfTE9DQUxfT1VUKTsKQEAgLTc0LDEyICs3NCwxMiBAQAogCS8qIENvbm5lY3Rpb24gbXVzdCBiZSB2YWxpZCBhbmQgbmV3LiAqLwogCU5GX0NUX0FTU0VSVChjdCAmJiAoY3RpbmZvID09IElQX0NUX05FVyB8fCBjdGluZm8gPT0gSVBfQ1RfUkVMQVRFRCkpOwogCi0JcmV0dXJuIG5mX25hdF9zZXR1cF9pbmZvKGN0LCAmbXItPnJhbmdlWzBdLCBJUF9OQVRfTUFOSVBfRFNUKTsKKwlyZXR1cm4gbmZfbmF0X3NldHVwX2luZm8oY3QsICZtci0+cmFuZ2VbMF0sIE5GX05BVF9NQU5JUF9EU1QpOwogfQogCiBzdGF0aWMgaW50IGlwdF9zbmF0X2NoZWNrZW50cnkoY29uc3Qgc3RydWN0IHh0X3RnY2hrX3BhcmFtICpwYXIpCiB7Ci0JY29uc3Qgc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gcGFyLT50YXJnaW5mbzsKKwljb25zdCBzdHJ1Y3QgbmZfbmF0X2lwdjRfbXVsdGlfcmFuZ2VfY29tcGF0ICptciA9IHBhci0+dGFyZ2luZm87CiAKIAkvKiBNdXN0IGJlIGEgdmFsaWQgcmFuZ2UgKi8KIAlpZiAobXItPnJhbmdlc2l6ZSAhPSAxKSB7CkBAIC05MSw3ICs5MSw3IEBACiAKIHN0YXRpYyBpbnQgaXB0X2RuYXRfY2hlY2tlbnRyeShjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKLQljb25zdCBzdHJ1Y3QgbmZfbmF0X211bHRpX3JhbmdlX2NvbXBhdCAqbXIgPSBwYXItPnRhcmdpbmZvOworCWNvbnN0IHN0cnVjdCBuZl9uYXRfaXB2NF9tdWx0aV9yYW5nZV9jb21wYXQgKm1yID0gcGFyLT50YXJnaW5mbzsKIAogCS8qIE11c3QgYmUgYSB2YWxpZCByYW5nZSAqLwogCWlmIChtci0+cmFuZ2VzaXplICE9IDEpIHsKQEAgLTEwNSwxMyArMTA1LDEzIEBACiBhbGxvY19udWxsX2JpbmRpbmcoc3RydWN0IG5mX2Nvbm4gKmN0LCB1bnNpZ25lZCBpbnQgaG9va251bSkKIHsKIAkvKiBGb3JjZSByYW5nZSB0byB0aGlzIElQOyBsZXQgcHJvdG8gZGVjaWRlIG1hcHBpbmcgZm9yCi0JICAgcGVyLXByb3RvIHBhcnRzIChoZW5jZSBub3QgSVBfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkuCisJICAgcGVyLXByb3RvIHBhcnRzIChoZW5jZSBub3QgTkZfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCkuCiAJKi8KLQlzdHJ1Y3QgbmZfbmF0X3JhbmdlIHJhbmdlOworCXN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSByYW5nZTsKIAogCXJhbmdlLmZsYWdzID0gMDsKIAlwcl9kZWJ1ZygiQWxsb2NhdGluZyBOVUxMIGJpbmRpbmcgZm9yICVwICglcEk0KVxuIiwgY3QsCi0JCSBIT09LMk1BTklQKGhvb2tudW0pID09IElQX05BVF9NQU5JUF9TUkMgPworCQkgSE9PSzJNQU5JUChob29rbnVtKSA9PSBORl9OQVRfTUFOSVBfU1JDID8KIAkJICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuZHN0LnUzLmlwIDoKIAkJICZjdC0+dHVwbGVoYXNoW0lQX0NUX0RJUl9SRVBMWV0udHVwbGUuc3JjLnUzLmlwKTsKIApAQCAtMTQwLDcgKzE0MCw3IEBACiBzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfc25hdF9yZWcgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZQkJPSAiU05BVCIsCiAJLnRhcmdldAkJPSBpcHRfc25hdF90YXJnZXQsCi0JLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpLAorCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZl9uYXRfaXB2NF9tdWx0aV9yYW5nZV9jb21wYXQpLAogCS50YWJsZQkJPSAibmF0IiwKIAkuaG9va3MJCT0gKDEgPDwgTkZfSU5FVF9QT1NUX1JPVVRJTkcpIHwgKDEgPDwgTkZfSU5FVF9MT0NBTF9JTiksCiAJLmNoZWNrZW50cnkJPSBpcHRfc25hdF9jaGVja2VudHJ5LApAQCAtMTUwLDcgKzE1MCw3IEBACiBzdGF0aWMgc3RydWN0IHh0X3RhcmdldCBpcHRfZG5hdF9yZWcgX19yZWFkX21vc3RseSA9IHsKIAkubmFtZQkJPSAiRE5BVCIsCiAJLnRhcmdldAkJPSBpcHRfZG5hdF90YXJnZXQsCi0JLnRhcmdldHNpemUJPSBzaXplb2Yoc3RydWN0IG5mX25hdF9tdWx0aV9yYW5nZV9jb21wYXQpLAorCS50YXJnZXRzaXplCT0gc2l6ZW9mKHN0cnVjdCBuZl9uYXRfaXB2NF9tdWx0aV9yYW5nZV9jb21wYXQpLAogCS50YWJsZQkJPSAibmF0IiwKIAkuaG9va3MJCT0gKDEgPDwgTkZfSU5FVF9QUkVfUk9VVElORykgfCAoMSA8PCBORl9JTkVUX0xPQ0FMX09VVCksCiAJLmNoZWNrZW50cnkJPSBpcHRfZG5hdF9jaGVja2VudHJ5LApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zaXAuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc2lwLmMKaW5kZXggNzg4NDRkOS4uZDAzMTlmOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvbmV0ZmlsdGVyL25mX25hdF9zaXAuYworKysgYi9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3NpcC5jCkBAIC0yNDksMjUgKzI0OSwyNSBAQAogc3RhdGljIHZvaWQgaXBfbmF0X3NpcF9leHBlY3RlZChzdHJ1Y3QgbmZfY29ubiAqY3QsCiAJCQkJc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKIHsKLQlzdHJ1Y3QgbmZfbmF0X3JhbmdlIHJhbmdlOworCXN0cnVjdCBuZl9uYXRfaXB2NF9yYW5nZSByYW5nZTsKIAogCS8qIFRoaXMgbXVzdCBiZSBhIGZyZXNoIG9uZS4gKi8KIAlCVUdfT04oY3QtPnN0YXR1cyAmIElQU19OQVRfRE9ORV9NQVNLKTsKIAogCS8qIEZvciBEU1QgbWFuaXAsIG1hcCBwb3J0IGhlcmUgdG8gd2hlcmUgaXQncyBleHBlY3RlZC4gKi8KLQlyYW5nZS5mbGFncyA9IChJUF9OQVRfUkFOR0VfTUFQX0lQUyB8IElQX05BVF9SQU5HRV9QUk9UT19TUEVDSUZJRUQpOworCXJhbmdlLmZsYWdzID0gKE5GX05BVF9SQU5HRV9NQVBfSVBTIHwgTkZfTkFUX1JBTkdFX1BST1RPX1NQRUNJRklFRCk7CiAJcmFuZ2UubWluID0gcmFuZ2UubWF4ID0gZXhwLT5zYXZlZF9wcm90bzsKIAlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAgPSBleHAtPnNhdmVkX2lwOwotCW5mX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIElQX05BVF9NQU5JUF9EU1QpOworCW5mX25hdF9zZXR1cF9pbmZvKGN0LCAmcmFuZ2UsIE5GX05BVF9NQU5JUF9EU1QpOwogCiAJLyogQ2hhbmdlIHNyYyB0byB3aGVyZSBtYXN0ZXIgc2VuZHMgdG8sIGJ1dCBvbmx5IGlmIHRoZSBjb25uZWN0aW9uCiAJICogYWN0dWFsbHkgY2FtZSBmcm9tIHRoZSBzYW1lIHNvdXJjZS4gKi8KIAlpZiAoY3QtPnR1cGxlaGFzaFtJUF9DVF9ESVJfT1JJR0lOQUxdLnR1cGxlLnNyYy51My5pcCA9PQogCSAgICBjdC0+bWFzdGVyLT50dXBsZWhhc2hbZXhwLT5kaXJdLnR1cGxlLnNyYy51My5pcCkgewotCQlyYW5nZS5mbGFncyA9IElQX05BVF9SQU5HRV9NQVBfSVBTOworCQlyYW5nZS5mbGFncyA9IE5GX05BVF9SQU5HRV9NQVBfSVBTOwogCQlyYW5nZS5taW5faXAgPSByYW5nZS5tYXhfaXAKIAkJCT0gY3QtPm1hc3Rlci0+dHVwbGVoYXNoWyFleHAtPmRpcl0udHVwbGUuZHN0LnUzLmlwOwotCQluZl9uYXRfc2V0dXBfaW5mbyhjdCwgJnJhbmdlLCBJUF9OQVRfTUFOSVBfU1JDKTsKKwkJbmZfbmF0X3NldHVwX2luZm8oY3QsICZyYW5nZSwgTkZfTkFUX01BTklQX1NSQyk7CiAJfQogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9uZXRmaWx0ZXIvbmZfbmF0X3N0YW5kYWxvbmUuYyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCmluZGV4IDkyOTAwNDguLjM4MjhhNDIgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCisrKyBiL25ldC9pcHY0L25ldGZpbHRlci9uZl9uYXRfc3RhbmRhbG9uZS5jCkBAIC0xMzcsNyArMTM3LDcgQEAKIAkJCQlyZXR1cm4gcmV0OwogCQl9IGVsc2UKIAkJCXByX2RlYnVnKCJBbHJlYWR5IHNldHVwIG1hbmlwICVzIGZvciBjdCAlcFxuIiwKLQkJCQkgbWFuaXB0eXBlID09IElQX05BVF9NQU5JUF9TUkMgPyAiU1JDIiA6ICJEU1QiLAorCQkJCSBtYW5pcHR5cGUgPT0gTkZfTkFUX01BTklQX1NSQyA/ICJTUkMiIDogIkRTVCIsCiAJCQkJIGN0KTsKIAkJYnJlYWs7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Byb2MuYyBiL25ldC9pcHY0L3Byb2MuYwppbmRleCA0NjZlYThiLi4zNTY5ZDhlIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9wcm9jLmMKKysrIGIvbmV0L2lwdjQvcHJvYy5jCkBAIC01NiwxNyArNTYsMTcgQEAKIAogCWxvY2FsX2JoX2Rpc2FibGUoKTsKIAlvcnBoYW5zID0gcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKCZ0Y3Bfb3JwaGFuX2NvdW50KTsKLQlzb2NrZXRzID0gcGVyY3B1X2NvdW50ZXJfc3VtX3Bvc2l0aXZlKCZ0Y3Bfc29ja2V0c19hbGxvY2F0ZWQpOworCXNvY2tldHMgPSBwcm90b19zb2NrZXRzX2FsbG9jYXRlZF9zdW1fcG9zaXRpdmUoJnRjcF9wcm90KTsKIAlsb2NhbF9iaF9lbmFibGUoKTsKIAogCXNvY2tldF9zZXFfc2hvdyhzZXEpOwogCXNlcV9wcmludGYoc2VxLCAiVENQOiBpbnVzZSAlZCBvcnBoYW4gJWQgdHcgJWQgYWxsb2MgJWQgbWVtICVsZFxuIiwKIAkJICAgc29ja19wcm90X2ludXNlX2dldChuZXQsICZ0Y3BfcHJvdCksIG9ycGhhbnMsCiAJCSAgIHRjcF9kZWF0aF9yb3cudHdfY291bnQsIHNvY2tldHMsCi0JCSAgIGF0b21pY19sb25nX3JlYWQoJnRjcF9tZW1vcnlfYWxsb2NhdGVkKSk7CisJCSAgIHByb3RvX21lbW9yeV9hbGxvY2F0ZWQoJnRjcF9wcm90KSk7CiAJc2VxX3ByaW50ZihzZXEsICJVRFA6IGludXNlICVkIG1lbSAlbGRcbiIsCiAJCSAgIHNvY2tfcHJvdF9pbnVzZV9nZXQobmV0LCAmdWRwX3Byb3QpLAotCQkgICBhdG9taWNfbG9uZ19yZWFkKCZ1ZHBfbWVtb3J5X2FsbG9jYXRlZCkpOworCQkgICBwcm90b19tZW1vcnlfYWxsb2NhdGVkKCZ1ZHBfcHJvdCkpOwogCXNlcV9wcmludGYoc2VxLCAiVURQTElURTogaW51c2UgJWRcbiIsCiAJCSAgIHNvY2tfcHJvdF9pbnVzZV9nZXQobmV0LCAmdWRwbGl0ZV9wcm90KSk7CiAJc2VxX3ByaW50ZihzZXEsICJSQVc6IGludXNlICVkXG4iLApAQCAtMjg4LDcgKzI4OCw3IEBACiAKIAljb3VudCA9IDA7CiAJZm9yIChpID0gMDsgaSA8IElDTVBNU0dfTUlCX01BWDsgaSsrKSB7Ci0JCXZhbCA9IHNubXBfZm9sZF9maWVsZCgodm9pZCBfX3BlcmNwdSAqKikgbmV0LT5taWIuaWNtcG1zZ19zdGF0aXN0aWNzLCBpKTsKKwkJdmFsID0gYXRvbWljX2xvbmdfcmVhZCgmbmV0LT5taWIuaWNtcG1zZ19zdGF0aXN0aWNzLT5taWJzW2ldKTsKIAkJaWYgKHZhbCkgewogCQkJdHlwZVtjb3VudF0gPSBpOwogCQkJdmFsc1tjb3VudCsrXSA9IHZhbDsKQEAgLTMwNyw2ICszMDcsNyBAQAogewogCWludCBpOwogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcS0+cHJpdmF0ZTsKKwlhdG9taWNfbG9uZ190ICpwdHIgPSBuZXQtPm1pYi5pY21wbXNnX3N0YXRpc3RpY3MtPm1pYnM7CiAKIAlzZXFfcHV0cyhzZXEsICJcbkljbXA6IEluTXNncyBJbkVycm9ycyIpOwogCWZvciAoaT0wOyBpY21wbWlibWFwW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQpAQCAtMzE5LDE1ICszMjAsMTMgQEAKIAkJc25tcF9mb2xkX2ZpZWxkKCh2b2lkIF9fcGVyY3B1ICoqKSBuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX0lORVJST1JTKSk7CiAJZm9yIChpPTA7IGljbXBtaWJtYXBbaV0ubmFtZSAhPSBOVUxMOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQlzbm1wX2ZvbGRfZmllbGQoKHZvaWQgX19wZXJjcHUgKiopIG5ldC0+bWliLmljbXBtc2dfc3RhdGlzdGljcywKLQkJCQlpY21wbWlibWFwW2ldLmluZGV4KSk7CisJCQkgICBhdG9taWNfbG9uZ19yZWFkKHB0ciArIGljbXBtaWJtYXBbaV0uaW5kZXgpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiAlbHUgJWx1IiwKIAkJc25tcF9mb2xkX2ZpZWxkKCh2b2lkIF9fcGVyY3B1ICoqKSBuZXQtPm1pYi5pY21wX3N0YXRpc3RpY3MsIElDTVBfTUlCX09VVE1TR1MpLAogCQlzbm1wX2ZvbGRfZmllbGQoKHZvaWQgX19wZXJjcHUgKiopIG5ldC0+bWliLmljbXBfc3RhdGlzdGljcywgSUNNUF9NSUJfT1VURVJST1JTKSk7CiAJZm9yIChpPTA7IGljbXBtaWJtYXBbaV0ubmFtZSAhPSBOVUxMOyBpKyspCiAJCXNlcV9wcmludGYoc2VxLCAiICVsdSIsCi0JCQlzbm1wX2ZvbGRfZmllbGQoKHZvaWQgX19wZXJjcHUgKiopIG5ldC0+bWliLmljbXBtc2dfc3RhdGlzdGljcywKLQkJCQlpY21wbWlibWFwW2ldLmluZGV4IHwgMHgxMDApKTsKKwkJCSAgIGF0b21pY19sb25nX3JlYWQocHRyICsgKGljbXBtaWJtYXBbaV0uaW5kZXggfCAweDEwMCkpKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3Jhdy5jIGIvbmV0L2lwdjQvcmF3LmMKaW5kZXggMDA3ZTJlYi4uM2NjZGE1YSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcmF3LmMKKysrIGIvbmV0L2lwdjQvcmF3LmMKQEAgLTI5Miw3ICsyOTIsOCBAQAogewogCS8qIENoYXJnZSBpdCB0byB0aGUgc29ja2V0LiAqLwogCi0JaWYgKGlwX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYikgPCAwKSB7CisJaXB2NF9wa3RpbmZvX3ByZXBhcmUoc2tiKTsKKwlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpIDwgMCkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCX0KQEAgLTMyNyw2ICszMjgsNyBAQAogCXVuc2lnbmVkIGludCBpcGhsZW47CiAJaW50IGVycjsKIAlzdHJ1Y3QgcnRhYmxlICpydCA9ICpydHA7CisJaW50IGhsZW4sIHRsZW47CiAKIAlpZiAobGVuZ3RoID4gcnQtPmRzdC5kZXYtPm10dSkgewogCQlpcF9sb2NhbF9lcnJvcihzaywgRU1TR1NJWkUsIGZsNC0+ZGFkZHIsIGluZXQtPmluZXRfZHBvcnQsCkBAIC0zMzYsMTIgKzMzOCwxNCBAQAogCWlmIChmbGFncyZNU0dfUFJPQkUpCiAJCWdvdG8gb3V0OwogCisJaGxlbiA9IExMX1JFU0VSVkVEX1NQQUNFKHJ0LT5kc3QuZGV2KTsKKwl0bGVuID0gcnQtPmRzdC5kZXYtPm5lZWRlZF90YWlscm9vbTsKIAlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAotCQkJCSAgbGVuZ3RoICsgTExfQUxMT0NBVEVEX1NQQUNFKHJ0LT5kc3QuZGV2KSArIDE1LAorCQkJCSAgbGVuZ3RoICsgaGxlbiArIHRsZW4gKyAxNSwKIAkJCQkgIGZsYWdzICYgTVNHX0RPTlRXQUlULCAmZXJyKTsKIAlpZiAoc2tiID09IE5VTEwpCiAJCWdvdG8gZXJyb3I7Ci0Jc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShydC0+ZHN0LmRldikpOworCXNrYl9yZXNlcnZlKHNrYiwgaGxlbik7CiAKIAlza2ItPnByaW9yaXR5ID0gc2stPnNrX3ByaW9yaXR5OwogCXNrYi0+bWFyayA9IHNrLT5za19tYXJrOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvcm91dGUuYyBiL25ldC9pcHY0L3JvdXRlLmMKaW5kZXggMGM3NGRhOC4uYmNhY2Y1NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvcm91dGUuYworKysgYi9uZXQvaXB2NC9yb3V0ZS5jCkBAIC05MSw2ICs5MSw3IEBACiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgogI2luY2x1ZGUgPG5ldC9kc3QuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9wcm90b2NvbC5oPgpAQCAtMTA4LDExICsxMDksMTAgQEAKICNpZmRlZiBDT05GSUdfU1lTQ1RMCiAjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CiAjZW5kaWYKLSNpbmNsdWRlIDxuZXQvYXRtY2xpcC5oPgogI2luY2x1ZGUgPG5ldC9zZWN1cmVfc2VxLmg+CiAKICNkZWZpbmUgUlRfRkxfVE9TKG9sZGZscDQpIFwKLSAgICAoKHUzMikob2xkZmxwNC0+Zmxvd2k0X3RvcyAmIChJUFRPU19SVF9NQVNLIHwgUlRPX09OTElOSykpKQorCSgob2xkZmxwNCktPmZsb3dpNF90b3MgJiAoSVBUT1NfUlRfTUFTSyB8IFJUT19PTkxJTkspKQogCiAjZGVmaW5lIElQX01BWF9NVFUJMHhGRkYwCiAKQEAgLTEyMCw2ICsxMjAsNyBAQAogCiBzdGF0aWMgaW50IGlwX3J0X21heF9zaXplOwogc3RhdGljIGludCBpcF9ydF9nY190aW1lb3V0IF9fcmVhZF9tb3N0bHkJPSBSVF9HQ19USU1FT1VUOworc3RhdGljIGludCBpcF9ydF9nY19pbnRlcnZhbCBfX3JlYWRfbW9zdGx5ICA9IDYwICogSFo7CiBzdGF0aWMgaW50IGlwX3J0X2djX21pbl9pbnRlcnZhbCBfX3JlYWRfbW9zdGx5CT0gSFogLyAyOwogc3RhdGljIGludCBpcF9ydF9yZWRpcmVjdF9udW1iZXIgX19yZWFkX21vc3RseQk9IDk7CiBzdGF0aWMgaW50IGlwX3J0X3JlZGlyZWN0X2xvYWQgX19yZWFkX21vc3RseQk9IEhaIC8gNTA7CkBAIC0xMzEsNiArMTMyLDEwIEBACiBzdGF0aWMgaW50IGlwX3J0X21pbl9wbXR1IF9fcmVhZF9tb3N0bHkJCT0gNTEyICsgMjAgKyAyMDsKIHN0YXRpYyBpbnQgaXBfcnRfbWluX2Fkdm1zcyBfX3JlYWRfbW9zdGx5CT0gMjU2Owogc3RhdGljIGludCBydF9jaGFpbl9sZW5ndGhfbWF4IF9fcmVhZF9tb3N0bHkJPSAyMDsKK3N0YXRpYyBpbnQgcmVkaXJlY3RfZ2VuaWQ7CisKK3N0YXRpYyBzdHJ1Y3QgZGVsYXllZF93b3JrIGV4cGlyZXNfd29yazsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGV4cGlyZXNfbGppZmZpZXM7CiAKIC8qCiAgKglJbnRlcmZhY2UgdG8gZ2VuZXJpYyBkZXN0aW5hdGlvbiBjYWNoZS4KQEAgLTEzOCw3ICsxNDMsNyBAQAogCiBzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqaXB2NF9kc3RfY2hlY2soc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1MzIgY29va2llKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQJIGlwdjRfZGVmYXVsdF9hZHZtc3MoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQJIGlwdjRfZGVmYXVsdF9tdHUoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJIGlwdjRfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CiBzdGF0aWMgdm9pZAkJIGlwdjRfZHN0X2Rlc3Ryb3koc3RydWN0IGRzdF9lbnRyeSAqZHN0KTsKIHN0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICppcHY0X25lZ2F0aXZlX2FkdmljZShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwogc3RhdGljIHZvaWQJCSBpcHY0X2xpbmtfZmFpbHVyZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKQEAgLTE5Myw3ICsxOTgsNyBAQAogCS5nYyA9CQkJcnRfZ2FyYmFnZV9jb2xsZWN0LAogCS5jaGVjayA9CQlpcHY0X2RzdF9jaGVjaywKIAkuZGVmYXVsdF9hZHZtc3MgPQlpcHY0X2RlZmF1bHRfYWR2bXNzLAotCS5kZWZhdWx0X210dSA9CQlpcHY0X2RlZmF1bHRfbXR1LAorCS5tdHUgPQkJCWlwdjRfbXR1LAogCS5jb3dfbWV0cmljcyA9CQlpcHY0X2Nvd19tZXRyaWNzLAogCS5kZXN0cm95ID0JCWlwdjRfZHN0X2Rlc3Ryb3ksCiAJLmlmZG93biA9CQlpcHY0X2RzdF9pZmRvd24sCkBAIC00MTYsOSArNDIxLDEzIEBACiAJZWxzZSB7CiAJCXN0cnVjdCBydGFibGUgKnIgPSB2OwogCQlzdHJ1Y3QgbmVpZ2hib3VyICpuOwotCQlpbnQgbGVuOworCQlpbnQgbGVuLCBISFVwdG9kOwogCi0JCW4gPSBkc3RfZ2V0X25laWdoYm91cigmci0+ZHN0KTsKKwkJcmN1X3JlYWRfbG9jaygpOworCQluID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoJnItPmRzdCk7CisJCUhIVXB0b2QgPSAobiAmJiAobi0+bnVkX3N0YXRlICYgTlVEX0NPTk5FQ1RFRCkpID8gMSA6IDA7CisJCXJjdV9yZWFkX3VubG9jaygpOworCiAJCXNlcV9wcmludGYoc2VxLCAiJXNcdCUwOFhcdCUwOFhcdCU4WFx0JWRcdCV1XHQlZFx0IgogCQkJICAgICAgIiUwOFhcdCVkXHQldVx0JXVcdCUwMlhcdCVkXHQlMWRcdCUwOFglbiIsCiAJCQlyLT5kc3QuZGV2ID8gci0+ZHN0LmRldi0+bmFtZSA6ICIqIiwKQEAgLTQzMiw3ICs0NDEsNyBAQAogCQkJICAgICAgZHN0X21ldHJpYygmci0+ZHN0LCBSVEFYX1JUVFZBUikpLAogCQkJci0+cnRfa2V5X3RvcywKIAkJCS0xLAotCQkJKG4gJiYgKG4tPm51ZF9zdGF0ZSAmIE5VRF9DT05ORUNURUQpKSA/IDEgOiAwLAorCQkJSEhVcHRvZCwKIAkJCXItPnJ0X3NwZWNfZHN0LCAmbGVuKTsKIAogCQlzZXFfcHJpbnRmKHNlcSwgIiUqc1xuIiwgMTI3IC0gbGVuLCAiIik7CkBAIC04MjUsNiArODM0LDk3IEBACiAJcmV0dXJuIE9ORTsKIH0KIAorc3RhdGljIHZvaWQgcnRfY2hlY2tfZXhwaXJlKHZvaWQpCit7CisJc3RhdGljIHVuc2lnbmVkIGludCByb3ZlcjsKKwl1bnNpZ25lZCBpbnQgaSA9IHJvdmVyLCBnb2FsOworCXN0cnVjdCBydGFibGUgKnJ0aDsKKwlzdHJ1Y3QgcnRhYmxlIF9fcmN1ICoqcnRocDsKKwl1bnNpZ25lZCBsb25nIHNhbXBsZXMgPSAwOworCXVuc2lnbmVkIGxvbmcgc3VtID0gMCwgc3VtMiA9IDA7CisJdW5zaWduZWQgbG9uZyBkZWx0YTsKKwl1NjQgbXVsdDsKKworCWRlbHRhID0gamlmZmllcyAtIGV4cGlyZXNfbGppZmZpZXM7CisJZXhwaXJlc19samlmZmllcyA9IGppZmZpZXM7CisJbXVsdCA9ICgodTY0KWRlbHRhKSA8PCBydF9oYXNoX2xvZzsKKwlpZiAoaXBfcnRfZ2NfdGltZW91dCA+IDEpCisJCWRvX2RpdihtdWx0LCBpcF9ydF9nY190aW1lb3V0KTsKKwlnb2FsID0gKHVuc2lnbmVkIGludCltdWx0OworCWlmIChnb2FsID4gcnRfaGFzaF9tYXNrKQorCQlnb2FsID0gcnRfaGFzaF9tYXNrICsgMTsKKwlmb3IgKDsgZ29hbCA+IDA7IGdvYWwtLSkgeworCQl1bnNpZ25lZCBsb25nIHRtbyA9IGlwX3J0X2djX3RpbWVvdXQ7CisJCXVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCisJCWkgPSAoaSArIDEpICYgcnRfaGFzaF9tYXNrOworCQlydGhwID0gJnJ0X2hhc2hfdGFibGVbaV0uY2hhaW47CisKKwkJaWYgKG5lZWRfcmVzY2hlZCgpKQorCQkJY29uZF9yZXNjaGVkKCk7CisKKwkJc2FtcGxlcysrOworCisJCWlmIChyY3VfZGVyZWZlcmVuY2VfcmF3KCpydGhwKSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWxlbmd0aCA9IDA7CisJCXNwaW5fbG9ja19iaChydF9oYXNoX2xvY2tfYWRkcihpKSk7CisJCXdoaWxlICgocnRoID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZCgqcnRocCwKKwkJCQkJbG9ja2RlcF9pc19oZWxkKHJ0X2hhc2hfbG9ja19hZGRyKGkpKSkpICE9IE5VTEwpIHsKKwkJCXByZWZldGNoKHJ0aC0+ZHN0LnJ0X25leHQpOworCQkJaWYgKHJ0X2lzX2V4cGlyZWQocnRoKSkgeworCQkJCSpydGhwID0gcnRoLT5kc3QucnRfbmV4dDsKKwkJCQlydF9mcmVlKHJ0aCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAocnRoLT5kc3QuZXhwaXJlcykgeworCQkJCS8qIEVudHJ5IGlzIGV4cGlyZWQgZXZlbiBpZiBpdCBpcyBpbiB1c2UgKi8KKwkJCQlpZiAodGltZV9iZWZvcmVfZXEoamlmZmllcywgcnRoLT5kc3QuZXhwaXJlcykpIHsKK25vZnJlZToKKwkJCQkJdG1vID4+PSAxOworCQkJCQlydGhwID0gJnJ0aC0+ZHN0LnJ0X25leHQ7CisJCQkJCS8qCisJCQkJCSAqIFdlIG9ubHkgY291bnQgZW50cmllcyBvbgorCQkJCQkgKiBhIGNoYWluIHdpdGggZXF1YWwgaGFzaCBpbnB1dHMgb25jZQorCQkJCQkgKiBzbyB0aGF0IGVudHJpZXMgZm9yIGRpZmZlcmVudCBRT1MKKwkJCQkJICogbGV2ZWxzLCBhbmQgb3RoZXIgbm9uLWhhc2ggaW5wdXQKKwkJCQkJICogYXR0cmlidXRlcyBkb24ndCB1bmZhaXJseSBza2V3CisJCQkJCSAqIHRoZSBsZW5ndGggY29tcHV0YXRpb24KKwkJCQkJICovCisJCQkJCWxlbmd0aCArPSBoYXNfbm9hbGlhcyhydF9oYXNoX3RhYmxlW2ldLmNoYWluLCBydGgpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKCFydF9tYXlfZXhwaXJlKHJ0aCwgdG1vLCBpcF9ydF9nY190aW1lb3V0KSkKKwkJCQlnb3RvIG5vZnJlZTsKKworCQkJLyogQ2xlYW51cCBhZ2VkIG9mZiBlbnRyaWVzLiAqLworCQkJKnJ0aHAgPSBydGgtPmRzdC5ydF9uZXh0OworCQkJcnRfZnJlZShydGgpOworCQl9CisJCXNwaW5fdW5sb2NrX2JoKHJ0X2hhc2hfbG9ja19hZGRyKGkpKTsKKwkJc3VtICs9IGxlbmd0aDsKKwkJc3VtMiArPSBsZW5ndGgqbGVuZ3RoOworCX0KKwlpZiAoc2FtcGxlcykgeworCQl1bnNpZ25lZCBsb25nIGF2ZyA9IHN1bSAvIHNhbXBsZXM7CisJCXVuc2lnbmVkIGxvbmcgc2QgPSBpbnRfc3FydChzdW0yIC8gc2FtcGxlcyAtIGF2ZyphdmcpOworCQlydF9jaGFpbl9sZW5ndGhfbWF4ID0gbWF4X3QodW5zaWduZWQgbG9uZywKKwkJCQkJaXBfcnRfZ2NfZWxhc3RpY2l0eSwKKwkJCQkJKGF2ZyArIDQqc2QpID4+IEZSQUNUX0JJVFMpOworCX0KKwlyb3ZlciA9IGk7Cit9CisKKy8qCisgKiBydF93b3JrZXJfZnVuYygpIGlzIHJ1biBpbiBwcm9jZXNzIGNvbnRleHQuCisgKiB3ZSBjYWxsIHJ0X2NoZWNrX2V4cGlyZSgpIHRvIHNjYW4gcGFydCBvZiB0aGUgaGFzaCB0YWJsZQorICovCitzdGF0aWMgdm9pZCBydF93b3JrZXJfZnVuYyhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJcnRfY2hlY2tfZXhwaXJlKCk7CisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZleHBpcmVzX3dvcmssIGlwX3J0X2djX2ludGVydmFsKTsKK30KKwogLyoKICAqIFBlcnR1cmJhdGlvbiBvZiBydF9nZW5pZCBieSBhIHNtYWxsIHF1YW50aXR5IFsxLi4yNTZdCiAgKiBVc2luZyA4IGJpdHMgb2Ygc2h1ZmZsaW5nIGVuc3VyZSB3ZSBjYW4gY2FsbCBydF9jYWNoZV9pbnZhbGlkYXRlKCkKQEAgLTgzNyw2ICs5MzcsNyBAQAogCiAJZ2V0X3JhbmRvbV9ieXRlcygmc2h1ZmZsZSwgc2l6ZW9mKHNodWZmbGUpKTsKIAlhdG9taWNfYWRkKHNodWZmbGUgKyAxVSwgJm5ldC0+aXB2NC5ydF9nZW5pZCk7CisJcmVkaXJlY3RfZ2VuaWQrKzsKIH0KIAogLyoKQEAgLTEwMTMsMjMgKzExMTQsMTggQEAKIAogc3RhdGljIHN0cnVjdCBuZWlnaGJvdXIgKmlwdjRfbmVpZ2hfbG9va3VwKGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgY29uc3Qgdm9pZCAqZGFkZHIpCiB7Ci0Jc3RydWN0IG5laWdoX3RhYmxlICp0YmwgPSAmYXJwX3RibDsKIAlzdGF0aWMgY29uc3QgX19iZTMyIGluYWRkcl9hbnkgPSAwOwogCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBkc3QtPmRldjsKIAljb25zdCBfX2JlMzIgKnBrZXkgPSBkYWRkcjsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuOwogCi0jaWYgZGVmaW5lZChDT05GSUdfQVRNX0NMSVApIHx8IGRlZmluZWQoQ09ORklHX0FUTV9DTElQX01PRFVMRSkKLQlpZiAoZGV2LT50eXBlID09IEFSUEhSRF9BVE0pCi0JCXRibCA9IGNsaXBfdGJsX2hvb2s7Ci0jZW5kaWYKIAlpZiAoZGV2LT5mbGFncyAmIChJRkZfTE9PUEJBQ0sgfCBJRkZfUE9JTlRPUE9JTlQpKQogCQlwa2V5ID0gJmluYWRkcl9hbnk7CiAKLQluID0gX19pcHY0X25laWdoX2xvb2t1cCh0YmwsIGRldiwgKihfX2ZvcmNlIHUzMiAqKXBrZXkpOworCW4gPSBfX2lwdjRfbmVpZ2hfbG9va3VwKCZhcnBfdGJsLCBkZXYsICooX19mb3JjZSB1MzIgKilwa2V5KTsKIAlpZiAobikKIAkJcmV0dXJuIG47Ci0JcmV0dXJuIG5laWdoX2NyZWF0ZSh0YmwsIHBrZXksIGRldik7CisJcmV0dXJuIG5laWdoX2NyZWF0ZSgmYXJwX3RibCwgcGtleSwgZGV2KTsKIH0KIAogc3RhdGljIGludCBydF9iaW5kX25laWdoYm91cihzdHJ1Y3QgcnRhYmxlICpydCkKQEAgLTEyNjUsNyArMTM2MSw3IEBACiB7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKSBkc3Q7CiAKLQlpZiAocnQpIHsKKwlpZiAocnQgJiYgIShydC0+ZHN0LmZsYWdzICYgRFNUX05PUEVFUikpIHsKIAkJaWYgKHJ0LT5wZWVyID09IE5VTEwpCiAJCQlydF9iaW5kX3BlZXIocnQsIHJ0LT5ydF9kc3QsIDEpOwogCkBAIC0xMjc2LDcgKzEzNzIsNyBAQAogCQkJaXBoLT5pZCA9IGh0b25zKGluZXRfZ2V0aWQocnQtPnBlZXIsIG1vcmUpKTsKIAkJCXJldHVybjsKIAkJfQotCX0gZWxzZQorCX0gZWxzZSBpZiAoIXJ0KQogCQlwcmludGsoS0VSTl9ERUJVRyAicnRfYmluZF9wZWVyKDApIEAlcFxuIiwKIAkJICAgICAgIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7CiAKQEAgLTEzMDQsNyArMTQwMCw3IEBACiAJc3Bpbl91bmxvY2tfYmgocnRfaGFzaF9sb2NrX2FkZHIoaGFzaCkpOwogfQogCi1zdGF0aWMgaW50IGNoZWNrX3BlZXJfcmVkaXIoc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBzdHJ1Y3QgaW5ldF9wZWVyICpwZWVyKQorc3RhdGljIHZvaWQgY2hlY2tfcGVlcl9yZWRpcihzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHN0cnVjdCBpbmV0X3BlZXIgKnBlZXIpCiB7CiAJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKSBkc3Q7CiAJX19iZTMyIG9yaWdfZ3cgPSBydC0+cnRfZ2F0ZXdheTsKQEAgLTEzMTUsMjEgKzE0MTEsMTkgQEAKIAlydC0+cnRfZ2F0ZXdheSA9IHBlZXItPnJlZGlyZWN0X2xlYXJuZWQuYTQ7CiAKIAluID0gaXB2NF9uZWlnaF9sb29rdXAoJnJ0LT5kc3QsICZydC0+cnRfZ2F0ZXdheSk7Ci0JaWYgKElTX0VSUihuKSkKLQkJcmV0dXJuIFBUUl9FUlIobik7CisJaWYgKElTX0VSUihuKSkgeworCQlydC0+cnRfZ2F0ZXdheSA9IG9yaWdfZ3c7CisJCXJldHVybjsKKwl9CiAJb2xkX24gPSB4Y2hnKCZydC0+ZHN0Ll9uZWlnaGJvdXIsIG4pOwogCWlmIChvbGRfbikKIAkJbmVpZ2hfcmVsZWFzZShvbGRfbik7Ci0JaWYgKCFuIHx8ICEobi0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSkgewotCQlpZiAobikKLQkJCW5laWdoX2V2ZW50X3NlbmQobiwgTlVMTCk7Ci0JCXJ0LT5ydF9nYXRld2F5ID0gb3JpZ19ndzsKLQkJcmV0dXJuIC1FQUdBSU47CisJaWYgKCEobi0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSkgeworCQluZWlnaF9ldmVudF9zZW5kKG4sIE5VTEwpOwogCX0gZWxzZSB7CiAJCXJ0LT5ydF9mbGFncyB8PSBSVENGX1JFRElSRUNURUQ7CiAJCWNhbGxfbmV0ZXZlbnRfbm90aWZpZXJzKE5FVEVWRU5UX05FSUdIX1VQREFURSwgbik7CiAJfQotCXJldHVybiAwOwogfQogCiAvKiBjYWxsZWQgaW4gcmN1X3JlYWRfbG9jaygpIHNlY3Rpb24gKi8KQEAgLTEzOTEsOCArMTQ4NSwxMCBAQAogCiAJCQkJcGVlciA9IHJ0LT5wZWVyOwogCQkJCWlmIChwZWVyKSB7Ci0JCQkJCWlmIChwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICE9IG5ld19ndykgeworCQkJCQlpZiAocGVlci0+cmVkaXJlY3RfbGVhcm5lZC5hNCAhPSBuZXdfZ3cgfHwKKwkJCQkJICAgIHBlZXItPnJlZGlyZWN0X2dlbmlkICE9IHJlZGlyZWN0X2dlbmlkKSB7CiAJCQkJCQlwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ID0gbmV3X2d3OworCQkJCQkJcGVlci0+cmVkaXJlY3RfZ2VuaWQgPSByZWRpcmVjdF9nZW5pZDsKIAkJCQkJCWF0b21pY19pbmMoJl9fcnRfcGVlcl9nZW5pZCk7CiAJCQkJCX0KIAkJCQkJY2hlY2tfcGVlcl9yZWRpcigmcnQtPmRzdCwgcGVlcik7CkBAIC0xNjg1LDEyICsxNzgxLDggQEAKIH0KIAogCi1zdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqaXB2NF9kc3RfY2hlY2soc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1MzIgY29va2llKQorc3RhdGljIHZvaWQgaXB2NF92YWxpZGF0ZV9wZWVyKHN0cnVjdCBydGFibGUgKnJ0KQogewotCXN0cnVjdCBydGFibGUgKnJ0ID0gKHN0cnVjdCBydGFibGUgKikgZHN0OwotCi0JaWYgKHJ0X2lzX2V4cGlyZWQocnQpKQotCQlyZXR1cm4gTlVMTDsKIAlpZiAocnQtPnJ0X3BlZXJfZ2VuaWQgIT0gcnRfcGVlcl9nZW5pZCgpKSB7CiAJCXN0cnVjdCBpbmV0X3BlZXIgKnBlZXI7CiAKQEAgLTE2OTksMTcgKzE3OTEsMjYgQEAKIAogCQlwZWVyID0gcnQtPnBlZXI7CiAJCWlmIChwZWVyKSB7Ci0JCQljaGVja19wZWVyX3BtdHUoZHN0LCBwZWVyKTsKKwkJCWNoZWNrX3BlZXJfcG10dSgmcnQtPmRzdCwgcGVlcik7CiAKKwkJCWlmIChwZWVyLT5yZWRpcmVjdF9nZW5pZCAhPSByZWRpcmVjdF9nZW5pZCkKKwkJCQlwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ID0gMDsKIAkJCWlmIChwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICYmCi0JCQkgICAgcGVlci0+cmVkaXJlY3RfbGVhcm5lZC5hNCAhPSBydC0+cnRfZ2F0ZXdheSkgewotCQkJCWlmIChjaGVja19wZWVyX3JlZGlyKGRzdCwgcGVlcikpCi0JCQkJCXJldHVybiBOVUxMOwotCQkJfQorCQkJICAgIHBlZXItPnJlZGlyZWN0X2xlYXJuZWQuYTQgIT0gcnQtPnJ0X2dhdGV3YXkpCisJCQkJY2hlY2tfcGVlcl9yZWRpcigmcnQtPmRzdCwgcGVlcik7CiAJCX0KIAogCQlydC0+cnRfcGVlcl9nZW5pZCA9IHJ0X3BlZXJfZ2VuaWQoKTsKIAl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHN0X2VudHJ5ICppcHY0X2RzdF9jaGVjayhzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBjb29raWUpCit7CisJc3RydWN0IHJ0YWJsZSAqcnQgPSAoc3RydWN0IHJ0YWJsZSAqKSBkc3Q7CisKKwlpZiAocnRfaXNfZXhwaXJlZChydCkpCisJCXJldHVybiBOVUxMOworCWlwdjRfdmFsaWRhdGVfcGVlcihydCk7CiAJcmV0dXJuIGRzdDsKIH0KIApAQCAtMTgxNCwxMiArMTkxNSwxNyBAQAogCXJldHVybiBhZHZtc3M7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXB2NF9kZWZhdWx0X210dShjb25zdCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCitzdGF0aWMgdW5zaWduZWQgaW50IGlwdjRfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKLQl1bnNpZ25lZCBpbnQgbXR1ID0gZHN0LT5kZXYtPm10dTsKKwljb25zdCBzdHJ1Y3QgcnRhYmxlICpydCA9IChjb25zdCBzdHJ1Y3QgcnRhYmxlICopIGRzdDsKKwl1bnNpZ25lZCBpbnQgbXR1ID0gZHN0X21ldHJpY19yYXcoZHN0LCBSVEFYX01UVSk7CisKKwlpZiAobXR1ICYmIHJ0X2lzX291dHB1dF9yb3V0ZShydCkpCisJCXJldHVybiBtdHU7CisKKwltdHUgPSBkc3QtPmRldi0+bXR1OwogCiAJaWYgKHVubGlrZWx5KGRzdF9tZXRyaWNfbG9ja2VkKGRzdCwgUlRBWF9NVFUpKSkgewotCQljb25zdCBzdHJ1Y3QgcnRhYmxlICpydCA9IChjb25zdCBzdHJ1Y3QgcnRhYmxlICopIGRzdDsKIAogCQlpZiAocnQtPnJ0X2dhdGV3YXkgIT0gcnQtPnJ0X2RzdCAmJiBtdHUgPiA1NzYpCiAJCQltdHUgPSA1NzY7CkBAIC0xODUyLDYgKzE5NTgsOCBAQAogCQlkc3RfaW5pdF9tZXRyaWNzKCZydC0+ZHN0LCBwZWVyLT5tZXRyaWNzLCBmYWxzZSk7CiAKIAkJY2hlY2tfcGVlcl9wbXR1KCZydC0+ZHN0LCBwZWVyKTsKKwkJaWYgKHBlZXItPnJlZGlyZWN0X2dlbmlkICE9IHJlZGlyZWN0X2dlbmlkKQorCQkJcGVlci0+cmVkaXJlY3RfbGVhcm5lZC5hNCA9IDA7CiAJCWlmIChwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICYmCiAJCSAgICBwZWVyLT5yZWRpcmVjdF9sZWFybmVkLmE0ICE9IHJ0LT5ydF9nYXRld2F5KSB7CiAJCQlydC0+cnRfZ2F0ZXdheSA9IHBlZXItPnJlZGlyZWN0X2xlYXJuZWQuYTQ7CkBAIC0yMzU3LDYgKzI0NjUsNyBAQAogCQkgICAgcnRoLT5ydF9tYXJrID09IHNrYi0+bWFyayAmJgogCQkgICAgbmV0X2VxKGRldl9uZXQocnRoLT5kc3QuZGV2KSwgbmV0KSAmJgogCQkgICAgIXJ0X2lzX2V4cGlyZWQocnRoKSkgeworCQkJaXB2NF92YWxpZGF0ZV9wZWVyKHJ0aCk7CiAJCQlpZiAobm9yZWYpIHsKIAkJCQlkc3RfdXNlX25vcmVmKCZydGgtPmRzdCwgamlmZmllcyk7CiAJCQkJc2tiX2RzdF9zZXRfbm9yZWYoc2tiLCAmcnRoLT5kc3QpOwpAQCAtMjQxNSwxMSArMjUyNCwxMSBAQAogc3RhdGljIHN0cnVjdCBydGFibGUgKl9fbWtyb3V0ZV9vdXRwdXQoY29uc3Qgc3RydWN0IGZpYl9yZXN1bHQgKnJlcywKIAkJCQkgICAgICAgY29uc3Qgc3RydWN0IGZsb3dpNCAqZmw0LAogCQkJCSAgICAgICBfX2JlMzIgb3JpZ19kYWRkciwgX19iZTMyIG9yaWdfc2FkZHIsCi0JCQkJICAgICAgIGludCBvcmlnX29pZiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9vdXQsCisJCQkJICAgICAgIGludCBvcmlnX29pZiwgX191OCBvcmlnX3J0b3MsCisJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXZfb3V0LAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CiAJc3RydWN0IGZpYl9pbmZvICpmaSA9IHJlcy0+Zmk7Ci0JdTMyIHRvcyA9IFJUX0ZMX1RPUyhmbDQpOwogCXN0cnVjdCBpbl9kZXZpY2UgKmluX2RldjsKIAl1MTYgdHlwZSA9IHJlcy0+dHlwZTsKIAlzdHJ1Y3QgcnRhYmxlICpydGg7CkBAIC0yNDcwLDcgKzI1NzksNyBAQAogCXJ0aC0+cnRfZ2VuaWQgPSBydF9nZW5pZChkZXZfbmV0KGRldl9vdXQpKTsKIAlydGgtPnJ0X2ZsYWdzCT0gZmxhZ3M7CiAJcnRoLT5ydF90eXBlCT0gdHlwZTsKLQlydGgtPnJ0X2tleV90b3MJPSB0b3M7CisJcnRoLT5ydF9rZXlfdG9zCT0gb3JpZ19ydG9zOwogCXJ0aC0+cnRfZHN0CT0gZmw0LT5kYWRkcjsKIAlydGgtPnJ0X3NyYwk9IGZsNC0+c2FkZHI7CiAJcnRoLT5ydF9yb3V0ZV9paWYgPSAwOwpAQCAtMjUyMCw3ICsyNjI5LDcgQEAKIHN0YXRpYyBzdHJ1Y3QgcnRhYmxlICppcF9yb3V0ZV9vdXRwdXRfc2xvdyhzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aTQgKmZsNCkKIHsKIAlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2X291dCA9IE5VTEw7Ci0JdTMyIHRvcwk9IFJUX0ZMX1RPUyhmbDQpOworCV9fdTggdG9zID0gUlRfRkxfVE9TKGZsNCk7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKIAlzdHJ1Y3QgZmliX3Jlc3VsdCByZXM7CiAJc3RydWN0IHJ0YWJsZSAqcnRoOwpAQCAtMjY5Niw3ICsyODA1LDcgQEAKIAogbWFrZV9yb3V0ZToKIAlydGggPSBfX21rcm91dGVfb3V0cHV0KCZyZXMsIGZsNCwgb3JpZ19kYWRkciwgb3JpZ19zYWRkciwgb3JpZ19vaWYsCi0JCQkgICAgICAgZGV2X291dCwgZmxhZ3MpOworCQkJICAgICAgIHRvcywgZGV2X291dCwgZmxhZ3MpOwogCWlmICghSVNfRVJSKHJ0aCkpIHsKIAkJdW5zaWduZWQgaW50IGhhc2g7CiAKQEAgLTI3MzIsNiArMjg0MSw3IEBACiAJCQkgICAgKElQVE9TX1JUX01BU0sgfCBSVE9fT05MSU5LKSkgJiYKIAkJICAgIG5ldF9lcShkZXZfbmV0KHJ0aC0+ZHN0LmRldiksIG5ldCkgJiYKIAkJICAgICFydF9pc19leHBpcmVkKHJ0aCkpIHsKKwkJCWlwdjRfdmFsaWRhdGVfcGVlcihydGgpOwogCQkJZHN0X3VzZSgmcnRoLT5kc3QsIGppZmZpZXMpOwogCQkJUlRfQ0FDSEVfU1RBVF9JTkMob3V0X2hpdCk7CiAJCQlyY3VfcmVhZF91bmxvY2tfYmgoKTsKQEAgLTI3NTUsOSArMjg2NSwxMSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwdjRfYmxhY2tob2xlX2RlZmF1bHRfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXB2NF9ibGFja2hvbGVfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKLQlyZXR1cm4gMDsKKwl1bnNpZ25lZCBpbnQgbXR1ID0gZHN0X21ldHJpY19yYXcoZHN0LCBSVEFYX01UVSk7CisKKwlyZXR1cm4gbXR1ID8gOiBkc3QtPmRldi0+bXR1OwogfQogCiBzdGF0aWMgdm9pZCBpcHY0X3J0X2JsYWNraG9sZV91cGRhdGVfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QsIHUzMiBtdHUpCkBAIC0yNzc1LDcgKzI4ODcsNyBAQAogCS5wcm90b2NvbAkJPQljcHVfdG9fYmUxNihFVEhfUF9JUCksCiAJLmRlc3Ryb3kJCT0JaXB2NF9kc3RfZGVzdHJveSwKIAkuY2hlY2sJCQk9CWlwdjRfYmxhY2tob2xlX2RzdF9jaGVjaywKLQkuZGVmYXVsdF9tdHUJCT0JaXB2NF9ibGFja2hvbGVfZGVmYXVsdF9tdHUsCisJLm10dQkJCT0JaXB2NF9ibGFja2hvbGVfbXR1LAogCS5kZWZhdWx0X2Fkdm1zcwkJPQlpcHY0X2RlZmF1bHRfYWR2bXNzLAogCS51cGRhdGVfcG10dQkJPQlpcHY0X3J0X2JsYWNraG9sZV91cGRhdGVfcG10dSwKIAkuY293X21ldHJpY3MJCT0JaXB2NF9ydF9ibGFja2hvbGVfY293X21ldHJpY3MsCkBAIC0zMTU3LDYgKzMyNjksMTMgQEAKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWNfamlmZmllcywKIAl9LAogCXsKKwkJLnByb2NuYW1lCT0gImdjX2ludGVydmFsIiwKKwkJLmRhdGEJCT0gJmlwX3J0X2djX2ludGVydmFsLAorCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gcHJvY19kb2ludHZlY19qaWZmaWVzLAorCX0sCisJewogCQkucHJvY25hbWUJPSAicmVkaXJlY3RfbG9hZCIsCiAJCS5kYXRhCQk9ICZpcF9ydF9yZWRpcmVjdF9sb2FkLAogCQkubWF4bGVuCQk9IHNpemVvZihpbnQpLApAQCAtMzM2Niw2ICszNDg1LDExIEBACiAJZGV2aW5ldF9pbml0KCk7CiAJaXBfZmliX2luaXQoKTsKIAorCUlOSVRfREVMQVlFRF9XT1JLX0RFRkVSUkFCTEUoJmV4cGlyZXNfd29yaywgcnRfd29ya2VyX2Z1bmMpOworCWV4cGlyZXNfbGppZmZpZXMgPSBqaWZmaWVzOworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmZXhwaXJlc193b3JrLAorCQluZXRfcmFuZG9tKCkgJSBpcF9ydF9nY19pbnRlcnZhbCArIGlwX3J0X2djX2ludGVydmFsKTsKKwogCWlmIChpcF9ydF9wcm9jX2luaXQoKSkKIAkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gY3JlYXRlIHJvdXRlIHByb2MgZmlsZXNcbiIpOwogI2lmZGVmIENPTkZJR19YRlJNCmRpZmYgLS1naXQgYS9uZXQvaXB2NC9zeW5jb29raWVzLmMgYi9uZXQvaXB2NC9zeW5jb29raWVzLmMKaW5kZXggOTBmNjU0NC4uNTFmZGJiNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvc3luY29va2llcy5jCisrKyBiL25ldC9pcHY0L3N5bmNvb2tpZXMuYwpAQCAtMjQ1LDcgKzI0NSw3IEBACiAJaWYgKCFzeXNjdGxfdGNwX3RpbWVzdGFtcHMpCiAJCXJldHVybiBmYWxzZTsKIAotCXRjcF9vcHQtPnNhY2tfb2sgPSAob3B0aW9ucyA+PiA0KSAmIDB4MTsKKwl0Y3Bfb3B0LT5zYWNrX29rID0gKG9wdGlvbnMgJiAoMSA8PCA0KSkgPyBUQ1BfU0FDS19TRUVOIDogMDsKIAkqZWNuX29rID0gKG9wdGlvbnMgPj4gNSkgJiAxOwogCWlmICgqZWNuX29rICYmICFzeXNjdGxfdGNwX2VjbikKIAkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvc3lzY3RsX25ldF9pcHY0LmMgYi9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYwppbmRleCA2OWZkNzIwLi40YWE3ZTlkIDEwMDY0NAotLS0gYS9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYworKysgYi9uZXQvaXB2NC9zeXNjdGxfbmV0X2lwdjQuYwpAQCAtMTQsNiArMTQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgorI2luY2x1ZGUgPGxpbnV4L3N3YXAuaD4KICNpbmNsdWRlIDxuZXQvc25tcC5oPgogI2luY2x1ZGUgPG5ldC9pY21wLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CkBAIC0yMyw2ICsyNCw3IEBACiAjaW5jbHVkZSA8bmV0L2NpcHNvX2lwdjQuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9mcmFnLmg+CiAjaW5jbHVkZSA8bmV0L3BpbmcuaD4KKyNpbmNsdWRlIDxuZXQvdGNwX21lbWNvbnRyb2wuaD4KIAogc3RhdGljIGludCB6ZXJvOwogc3RhdGljIGludCB0Y3BfcmV0cjFfbWF4ID0gMjU1OwpAQCAtNzMsNyArNzUsNyBAQAogfQogCiAKLXZvaWQgaW5ldF9nZXRfcGluZ19ncm91cF9yYW5nZV90YWJsZShzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgZ2lkX3QgKmxvdywgZ2lkX3QgKmhpZ2gpCitzdGF0aWMgdm9pZCBpbmV0X2dldF9waW5nX2dyb3VwX3JhbmdlX3RhYmxlKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBnaWRfdCAqbG93LCBnaWRfdCAqaGlnaCkKIHsKIAlnaWRfdCAqZGF0YSA9IHRhYmxlLT5kYXRhOwogCXVuc2lnbmVkIHNlcTsKQEAgLTg2LDcgKzg4LDcgQEAKIH0KIAogLyogVXBkYXRlIHN5c3RlbSB2aXNpYmxlIElQIHBvcnQgcmFuZ2UgKi8KLXN0YXRpYyB2b2lkIHNldF9waW5nX2dyb3VwX3JhbmdlKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBpbnQgcmFuZ2VbMl0pCitzdGF0aWMgdm9pZCBzZXRfcGluZ19ncm91cF9yYW5nZShzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgZ2lkX3QgcmFuZ2VbMl0pCiB7CiAJZ2lkX3QgKmRhdGEgPSB0YWJsZS0+ZGF0YTsKIAl3cml0ZV9zZXFsb2NrKCZzeXNjdGxfbG9jYWxfcG9ydHMubG9jayk7CkBAIC0xNzQsNiArMTc2LDQ5IEBACiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGludCBpcHY0X3RjcF9tZW0oY3RsX3RhYmxlICpjdGwsIGludCB3cml0ZSwKKwkJCSAgIHZvaWQgX191c2VyICpidWZmZXIsIHNpemVfdCAqbGVucCwKKwkJCSAgIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgdmVjWzNdOworCXN0cnVjdCBuZXQgKm5ldCA9IGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9LTUVNCisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnOworI2VuZGlmCisKKwljdGxfdGFibGUgdG1wID0geworCQkuZGF0YSA9ICZ2ZWMsCisJCS5tYXhsZW4gPSBzaXplb2YodmVjKSwKKwkJLm1vZGUgPSBjdGwtPm1vZGUsCisJfTsKKworCWlmICghd3JpdGUpIHsKKwkJY3RsLT5kYXRhID0gJm5ldC0+aXB2NC5zeXNjdGxfdGNwX21lbTsKKwkJcmV0dXJuIHByb2NfZG91bG9uZ3ZlY19taW5tYXgoY3RsLCB3cml0ZSwgYnVmZmVyLCBsZW5wLCBwcG9zKTsKKwl9CisKKwlyZXQgPSBwcm9jX2RvdWxvbmd2ZWNfbWlubWF4KCZ0bXAsIHdyaXRlLCBidWZmZXIsIGxlbnAsIHBwb3MpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX01FTV9SRVNfQ1RMUl9LTUVNCisJcmN1X3JlYWRfbG9jaygpOworCW1lbWNnID0gbWVtX2Nncm91cF9mcm9tX3Rhc2soY3VycmVudCk7CisKKwl0Y3BfcHJvdF9tZW0obWVtY2csIHZlY1swXSwgMCk7CisJdGNwX3Byb3RfbWVtKG1lbWNnLCB2ZWNbMV0sIDEpOworCXRjcF9wcm90X21lbShtZW1jZywgdmVjWzJdLCAyKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKyNlbmRpZgorCisJbmV0LT5pcHY0LnN5c2N0bF90Y3BfbWVtWzBdID0gdmVjWzBdOworCW5ldC0+aXB2NC5zeXNjdGxfdGNwX21lbVsxXSA9IHZlY1sxXTsKKwluZXQtPmlwdjQuc3lzY3RsX3RjcF9tZW1bMl0gPSB2ZWNbMl07CisKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgaXB2NF90YWJsZVtdID0gewogCXsKIAkJLnByb2NuYW1lCT0gInRjcF90aW1lc3RhbXBzIiwKQEAgLTQzMywxMyArNDc4LDYgQEAKIAkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG9pbnR2ZWMKIAl9LAogCXsKLQkJLnByb2NuYW1lCT0gInRjcF9tZW0iLAotCQkuZGF0YQkJPSAmc3lzY3RsX3RjcF9tZW0sCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF90Y3BfbWVtKSwKLQkJLm1vZGUJCT0gMDY0NCwKLQkJLnByb2NfaGFuZGxlcgk9IHByb2NfZG91bG9uZ3ZlY19taW5tYXgKLQl9LAotCXsKIAkJLnByb2NuYW1lCT0gInRjcF93bWVtIiwKIAkJLmRhdGEJCT0gJnN5c2N0bF90Y3Bfd21lbSwKIAkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX3RjcF93bWVtKSwKQEAgLTcyMSw2ICs3NTksMTIgQEAKIAkJLm1vZGUJCT0gMDY0NCwKIAkJLnByb2NfaGFuZGxlcgk9IGlwdjRfcGluZ19ncm91cF9yYW5nZSwKIAl9LAorCXsKKwkJLnByb2NuYW1lCT0gInRjcF9tZW0iLAorCQkubWF4bGVuCQk9IHNpemVvZihpbml0X25ldC5pcHY0LnN5c2N0bF90Y3BfbWVtKSwKKwkJLm1vZGUJCT0gMDY0NCwKKwkJLnByb2NfaGFuZGxlcgk9IGlwdjRfdGNwX21lbSwKKwl9LAogCXsgfQogfTsKIApAQCAtNzM0LDYgKzc3OCw3IEBACiBzdGF0aWMgX19uZXRfaW5pdCBpbnQgaXB2NF9zeXNjdGxfaW5pdF9uZXQoc3RydWN0IG5ldCAqbmV0KQogewogCXN0cnVjdCBjdGxfdGFibGUgKnRhYmxlOworCXVuc2lnbmVkIGxvbmcgbGltaXQ7CiAKIAl0YWJsZSA9IGlwdjRfbmV0X3RhYmxlOwogCWlmICghbmV0X2VxKG5ldCwgJmluaXRfbmV0KSkgewpAQCAtNzY5LDYgKzgxNCwxMiBAQAogCiAJbmV0LT5pcHY0LnN5c2N0bF9ydF9jYWNoZV9yZWJ1aWxkX2NvdW50ID0gNDsKIAorCWxpbWl0ID0gbnJfZnJlZV9idWZmZXJfcGFnZXMoKSAvIDg7CisJbGltaXQgPSBtYXgobGltaXQsIDEyOFVMKTsKKwluZXQtPmlwdjQuc3lzY3RsX3RjcF9tZW1bMF0gPSBsaW1pdCAvIDQgKiAzOworCW5ldC0+aXB2NC5zeXNjdGxfdGNwX21lbVsxXSA9IGxpbWl0OworCW5ldC0+aXB2NC5zeXNjdGxfdGNwX21lbVsyXSA9IG5ldC0+aXB2NC5zeXNjdGxfdGNwX21lbVswXSAqIDI7CisKIAluZXQtPmlwdjQuaXB2NF9oZHIgPSByZWdpc3Rlcl9uZXRfc3lzY3RsX3RhYmxlKG5ldCwKIAkJCW5ldF9pcHY0X2N0bF9wYXRoLCB0YWJsZSk7CiAJaWYgKG5ldC0+aXB2NC5pcHY0X2hkciA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwLmMgYi9uZXQvaXB2NC90Y3AuYwppbmRleCAzNGY1ZGIxLi45YmNkZWMzIDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3AuYworKysgYi9uZXQvaXB2NC90Y3AuYwpAQCAtMjgyLDExICsyODIsOSBAQAogc3RydWN0IHBlcmNwdV9jb3VudGVyIHRjcF9vcnBoYW5fY291bnQ7CiBFWFBPUlRfU1lNQk9MX0dQTCh0Y3Bfb3JwaGFuX2NvdW50KTsKIAotbG9uZyBzeXNjdGxfdGNwX21lbVszXSBfX3JlYWRfbW9zdGx5OwogaW50IHN5c2N0bF90Y3Bfd21lbVszXSBfX3JlYWRfbW9zdGx5OwogaW50IHN5c2N0bF90Y3Bfcm1lbVszXSBfX3JlYWRfbW9zdGx5OwogCi1FWFBPUlRfU1lNQk9MKHN5c2N0bF90Y3BfbWVtKTsKIEVYUE9SVF9TWU1CT0woc3lzY3RsX3RjcF9ybWVtKTsKIEVYUE9SVF9TWU1CT0woc3lzY3RsX3RjcF93bWVtKTsKIApAQCAtODg4LDE4ICs4ODYsMTggQEAKIH0KIEVYUE9SVF9TWU1CT0wodGNwX3NlbmRwYWdlKTsKIAotI2RlZmluZSBUQ1BfUEFHRShzaykJKHNrLT5za19zbmRtc2dfcGFnZSkKLSNkZWZpbmUgVENQX09GRihzaykJKHNrLT5za19zbmRtc2dfb2ZmKQotCi1zdGF0aWMgaW5saW5lIGludCBzZWxlY3Rfc2l6ZShjb25zdCBzdHJ1Y3Qgc29jayAqc2ssIGludCBzZykKK3N0YXRpYyBpbmxpbmUgaW50IHNlbGVjdF9zaXplKGNvbnN0IHN0cnVjdCBzb2NrICpzaywgYm9vbCBzZykKIHsKIAljb25zdCBzdHJ1Y3QgdGNwX3NvY2sgKnRwID0gdGNwX3NrKHNrKTsKIAlpbnQgdG1wID0gdHAtPm1zc19jYWNoZTsKIAogCWlmIChzZykgewotCQlpZiAoc2tfY2FuX2dzbyhzaykpCi0JCQl0bXAgPSAwOwotCQllbHNlIHsKKwkJaWYgKHNrX2Nhbl9nc28oc2spKSB7CisJCQkvKiBTbWFsbCBmcmFtZXMgd29udCB1c2UgYSBmdWxsIHBhZ2U6CisJCQkgKiBQYXlsb2FkIHdpbGwgaW1tZWRpYXRlbHkgZm9sbG93IHRjcCBoZWFkZXIuCisJCQkgKi8KKwkJCXRtcCA9IFNLQl9XSVRIX09WRVJIRUFEKDIwNDggLSBNQVhfVENQX0hFQURFUik7CisJCX0gZWxzZSB7CiAJCQlpbnQgcGdicmVhayA9IFNLQl9NQVhfSEVBRChNQVhfVENQX0hFQURFUik7CiAKIAkJCWlmICh0bXAgPj0gcGdicmVhayAmJgpAQCAtOTE3LDkgKzkxNSw5IEBACiAJc3RydWN0IGlvdmVjICppb3Y7CiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQlpbnQgaW92bGVuLCBmbGFnczsKKwlpbnQgaW92bGVuLCBmbGFncywgZXJyLCBjb3BpZWQ7CiAJaW50IG1zc19ub3csIHNpemVfZ29hbDsKLQlpbnQgc2csIGVyciwgY29waWVkOworCWJvb2wgc2c7CiAJbG9uZyB0aW1lbzsKIAogCWxvY2tfc29jayhzayk7CkBAIC05NDYsNyArOTQ0LDcgQEAKIAlpZiAoc2stPnNrX2VyciB8fCAoc2stPnNrX3NodXRkb3duICYgU0VORF9TSFVURE9XTikpCiAJCWdvdG8gb3V0X2VycjsKIAotCXNnID0gc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1NHOworCXNnID0gISEoc2stPnNrX3JvdXRlX2NhcHMgJiBORVRJRl9GX1NHKTsKIAogCXdoaWxlICgtLWlvdmxlbiA+PSAwKSB7CiAJCXNpemVfdCBzZWdsZW4gPSBpb3YtPmlvdl9sZW47CkBAIC0xMDA1LDggKzEwMDMsMTMgQEAKIAkJCX0gZWxzZSB7CiAJCQkJaW50IG1lcmdlID0gMDsKIAkJCQlpbnQgaSA9IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7Ci0JCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBUQ1BfUEFHRShzayk7Ci0JCQkJaW50IG9mZiA9IFRDUF9PRkYoc2spOworCQkJCXN0cnVjdCBwYWdlICpwYWdlID0gc2stPnNrX3NuZG1zZ19wYWdlOworCQkJCWludCBvZmY7CisKKwkJCQlpZiAocGFnZSAmJiBwYWdlX2NvdW50KHBhZ2UpID09IDEpCisJCQkJCXNrLT5za19zbmRtc2dfb2ZmID0gMDsKKworCQkJCW9mZiA9IHNrLT5za19zbmRtc2dfb2ZmOwogCiAJCQkJaWYgKHNrYl9jYW5fY29hbGVzY2Uoc2tiLCBpLCBwYWdlLCBvZmYpICYmCiAJCQkJICAgIG9mZiAhPSBQQUdFX1NJWkUpIHsKQEAgLTEwMjMsNyArMTAyNiw3IEBACiAJCQkJfSBlbHNlIGlmIChwYWdlKSB7CiAJCQkJCWlmIChvZmYgPT0gUEFHRV9TSVpFKSB7CiAJCQkJCQlwdXRfcGFnZShwYWdlKTsKLQkJCQkJCVRDUF9QQUdFKHNrKSA9IHBhZ2UgPSBOVUxMOworCQkJCQkJc2stPnNrX3NuZG1zZ19wYWdlID0gcGFnZSA9IE5VTEw7CiAJCQkJCQlvZmYgPSAwOwogCQkJCQl9CiAJCQkJfSBlbHNlCkBAIC0xMDQ5LDkgKzEwNTIsOSBAQAogCQkJCQkvKiBJZiB0aGlzIHBhZ2Ugd2FzIG5ldywgZ2l2ZSBpdCB0byB0aGUKIAkJCQkJICogc29ja2V0IHNvIGl0IGRvZXMgbm90IGdldCBsZWFrZWQuCiAJCQkJCSAqLwotCQkJCQlpZiAoIVRDUF9QQUdFKHNrKSkgewotCQkJCQkJVENQX1BBR0Uoc2spID0gcGFnZTsKLQkJCQkJCVRDUF9PRkYoc2spID0gMDsKKwkJCQkJaWYgKCFzay0+c2tfc25kbXNnX3BhZ2UpIHsKKwkJCQkJCXNrLT5za19zbmRtc2dfcGFnZSA9IHBhZ2U7CisJCQkJCQlzay0+c2tfc25kbXNnX29mZiA9IDA7CiAJCQkJCX0KIAkJCQkJZ290byBkb19lcnJvcjsKIAkJCQl9CkBAIC0xMDYxLDE1ICsxMDY0LDE1IEBACiAJCQkJCXNrYl9mcmFnX3NpemVfYWRkKCZza2Jfc2hpbmZvKHNrYiktPmZyYWdzW2kgLSAxXSwgY29weSk7CiAJCQkJfSBlbHNlIHsKIAkJCQkJc2tiX2ZpbGxfcGFnZV9kZXNjKHNrYiwgaSwgcGFnZSwgb2ZmLCBjb3B5KTsKLQkJCQkJaWYgKFRDUF9QQUdFKHNrKSkgeworCQkJCQlpZiAoc2stPnNrX3NuZG1zZ19wYWdlKSB7CiAJCQkJCQlnZXRfcGFnZShwYWdlKTsKIAkJCQkJfSBlbHNlIGlmIChvZmYgKyBjb3B5IDwgUEFHRV9TSVpFKSB7CiAJCQkJCQlnZXRfcGFnZShwYWdlKTsKLQkJCQkJCVRDUF9QQUdFKHNrKSA9IHBhZ2U7CisJCQkJCQlzay0+c2tfc25kbXNnX3BhZ2UgPSBwYWdlOwogCQkJCQl9CiAJCQkJfQogCi0JCQkJVENQX09GRihzaykgPSBvZmYgKyBjb3B5OworCQkJCXNrLT5za19zbmRtc2dfb2ZmID0gb2ZmICsgY29weTsKIAkJCX0KIAogCQkJaWYgKCFjb3BpZWQpCkBAIC0yNjUzLDcgKzI2NTYsOCBAQAogRVhQT1JUX1NZTUJPTChjb21wYXRfdGNwX2dldHNvY2tvcHQpOwogI2VuZGlmCiAKLXN0cnVjdCBza19idWZmICp0Y3BfdHNvX3NlZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGZlYXR1cmVzKQorc3RydWN0IHNrX2J1ZmYgKnRjcF90c29fc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBza19idWZmICpzZWdzID0gRVJSX1BUUigtRUlOVkFMKTsKIAlzdHJ1Y3QgdGNwaGRyICp0aDsKQEAgLTMyNzIsMTQgKzMyNzYsOSBAQAogCXN5c2N0bF90Y3BfbWF4X29ycGhhbnMgPSBjbnQgLyAyOwogCXN5c2N0bF9tYXhfc3luX2JhY2tsb2cgPSBtYXgoMTI4LCBjbnQgLyAyNTYpOwogCi0JbGltaXQgPSBucl9mcmVlX2J1ZmZlcl9wYWdlcygpIC8gODsKLQlsaW1pdCA9IG1heChsaW1pdCwgMTI4VUwpOwotCXN5c2N0bF90Y3BfbWVtWzBdID0gbGltaXQgLyA0ICogMzsKLQlzeXNjdGxfdGNwX21lbVsxXSA9IGxpbWl0OwotCXN5c2N0bF90Y3BfbWVtWzJdID0gc3lzY3RsX3RjcF9tZW1bMF0gKiAyOwotCiAJLyogU2V0IHBlci1zb2NrZXQgbGltaXRzIHRvIG5vIG1vcmUgdGhhbiAxLzEyOCB0aGUgcHJlc3N1cmUgdGhyZXNob2xkICovCi0JbGltaXQgPSAoKHVuc2lnbmVkIGxvbmcpc3lzY3RsX3RjcF9tZW1bMV0pIDw8IChQQUdFX1NISUZUIC0gNyk7CisJbGltaXQgPSAoKHVuc2lnbmVkIGxvbmcpaW5pdF9uZXQuaXB2NC5zeXNjdGxfdGNwX21lbVsxXSkKKwkJPDwgKFBBR0VfU0hJRlQgLSA3KTsKIAltYXhfc2hhcmUgPSBtaW4oNFVMKjEwMjQqMTAyNCwgbGltaXQpOwogCiAJc3lzY3RsX3RjcF93bWVtWzBdID0gU0tfTUVNX1FVQU5UVU07CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfY29uZy5jIGIvbmV0L2lwdjQvdGNwX2NvbmcuYwppbmRleCA4NTBjNzM3Li5mYzZkNDc1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfY29uZy5jCisrKyBiL25ldC9pcHY0L3RjcF9jb25nLmMKQEAgLTI5Miw3ICsyOTIsNyBAQAogCSAgICBsZWZ0ICogc3lzY3RsX3RjcF90c29fd2luX2Rpdmlzb3IgPCB0cC0+c25kX2N3bmQgJiYKIAkgICAgbGVmdCAqIHRwLT5tc3NfY2FjaGUgPCBzay0+c2tfZ3NvX21heF9zaXplKQogCQlyZXR1cm4gMTsKLQlyZXR1cm4gbGVmdCA8PSB0Y3BfbWF4X2J1cnN0KHRwKTsKKwlyZXR1cm4gbGVmdCA8PSB0Y3BfbWF4X3Rzb19kZWZlcnJlZF9tc3ModHApOwogfQogRVhQT1JUX1NZTUJPTF9HUEwodGNwX2lzX2N3bmRfbGltaXRlZCk7CiAKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9kaWFnLmMgYi9uZXQvaXB2NC90Y3BfZGlhZy5jCmluZGV4IDkzOWVkYjMuLjhjZDM1N2EgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9kaWFnLmMKKysrIGIvbmV0L2lwdjQvdGNwX2RpYWcuYwpAQCAtMzQsMTEgKzM0LDIzIEBACiAJCXRjcF9nZXRfaW5mbyhzaywgaW5mbyk7CiB9CiAKK3N0YXRpYyB2b2lkIHRjcF9kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiLAorCQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqciwgc3RydWN0IG5sYXR0ciAqYmMpCit7CisJaW5ldF9kaWFnX2R1bXBfaWNzaygmdGNwX2hhc2hpbmZvLCBza2IsIGNiLCByLCBiYyk7Cit9CisKK3N0YXRpYyBpbnQgdGNwX2RpYWdfZHVtcF9vbmUoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCXN0cnVjdCBpbmV0X2RpYWdfcmVxICpyZXEpCit7CisJcmV0dXJuIGluZXRfZGlhZ19kdW1wX29uZV9pY3NrKCZ0Y3BfaGFzaGluZm8sIGluX3NrYiwgbmxoLCByZXEpOworfQorCiBzdGF0aWMgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyIHRjcF9kaWFnX2hhbmRsZXIgPSB7Ci0JLmlkaWFnX2hhc2hpbmZvCSA9ICZ0Y3BfaGFzaGluZm8sCisJLmR1bXAJCSA9IHRjcF9kaWFnX2R1bXAsCisJLmR1bXBfb25lCSA9IHRjcF9kaWFnX2R1bXBfb25lLAogCS5pZGlhZ19nZXRfaW5mbwkgPSB0Y3BfZGlhZ19nZXRfaW5mbywKLQkuaWRpYWdfdHlwZQkgPSBUQ1BESUFHX0dFVFNPQ0ssCi0JLmlkaWFnX2luZm9fc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdGNwX2luZm8pLAorCS5pZGlhZ190eXBlCSA9IElQUFJPVE9fVENQLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgdGNwX2RpYWdfaW5pdCh2b2lkKQpAQCAtNTQsNCArNjYsNCBAQAogbW9kdWxlX2luaXQodGNwX2RpYWdfaW5pdCk7CiBtb2R1bGVfZXhpdCh0Y3BfZGlhZ19leGl0KTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKLU1PRFVMRV9BTElBU19ORVRfUEZfUFJPVE9fVFlQRShQRl9ORVRMSU5LLCBORVRMSU5LX0lORVRfRElBRywgVENQRElBR19HRVRTT0NLKTsKK01PRFVMRV9BTElBU19ORVRfUEZfUFJPVE9fVFlQRShQRl9ORVRMSU5LLCBORVRMSU5LX1NPQ0tfRElBRywgMi02IC8qIEFGX0lORVQgLSBJUFBST1RPX1RDUCAqLyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaW5wdXQuYyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCmluZGV4IDUyYjVjMmQuLjI4NzdjM2UgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3RjcF9pbnB1dC5jCisrKyBiL25ldC9pcHY0L3RjcF9pbnB1dC5jCkBAIC0zMjIsNyArMzIyLDcgQEAKIAkvKiBDaGVjayAjMSAqLwogCWlmICh0cC0+cmN2X3NzdGhyZXNoIDwgdHAtPndpbmRvd19jbGFtcCAmJgogCSAgICAoaW50KXRwLT5yY3Zfc3N0aHJlc2ggPCB0Y3Bfc3BhY2Uoc2spICYmCi0JICAgICF0Y3BfbWVtb3J5X3ByZXNzdXJlKSB7CisJICAgICFza191bmRlcl9tZW1vcnlfcHJlc3N1cmUoc2spKSB7CiAJCWludCBpbmNyOwogCiAJCS8qIENoZWNrICMyLiBJbmNyZWFzZSB3aW5kb3csIGlmIHNrYiB3aXRoIHN1Y2ggb3ZlcmhlYWQKQEAgLTQxMSw4ICs0MTEsOCBAQAogCiAJaWYgKHNrLT5za19yY3ZidWYgPCBzeXNjdGxfdGNwX3JtZW1bMl0gJiYKIAkgICAgIShzay0+c2tfdXNlcmxvY2tzICYgU09DS19SQ1ZCVUZfTE9DSykgJiYKLQkgICAgIXRjcF9tZW1vcnlfcHJlc3N1cmUgJiYKLQkgICAgYXRvbWljX2xvbmdfcmVhZCgmdGNwX21lbW9yeV9hbGxvY2F0ZWQpIDwgc3lzY3RsX3RjcF9tZW1bMF0pIHsKKwkgICAgIXNrX3VuZGVyX21lbW9yeV9wcmVzc3VyZShzaykgJiYKKwkgICAgc2tfbWVtb3J5X2FsbG9jYXRlZChzaykgPCBza19wcm90X21lbV9saW1pdHMoc2ssIDApKSB7CiAJCXNrLT5za19yY3ZidWYgPSBtaW4oYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSwKIAkJCQkgICAgc3lzY3RsX3RjcF9ybWVtWzJdKTsKIAl9CkBAIC04NjUsMTMgKzg2NSwxMyBAQAogCS8qIFJGQzM1MTcgdXNlcyBkaWZmZXJlbnQgbWV0cmljIGluIGxvc3QgbWFya2VyID0+IHJlc2V0IG9uIGNoYW5nZSAqLwogCWlmICh0Y3BfaXNfZmFjayh0cCkpCiAJCXRwLT5sb3N0X3NrYl9oaW50ID0gTlVMTDsKLQl0cC0+cnhfb3B0LnNhY2tfb2sgJj0gfjI7CisJdHAtPnJ4X29wdC5zYWNrX29rICY9IH5UQ1BfRkFDS19FTkFCTEVEOwogfQogCiAvKiBUYWtlIGEgbm90aWNlIHRoYXQgcGVlciBpcyBzZW5kaW5nIEQtU0FDS3MgKi8KIHN0YXRpYyB2b2lkIHRjcF9kc2Fja19zZWVuKHN0cnVjdCB0Y3Bfc29jayAqdHApCiB7Ci0JdHAtPnJ4X29wdC5zYWNrX29rIHw9IDQ7CisJdHAtPnJ4X29wdC5zYWNrX29rIHw9IFRDUF9EU0FDS19TRUVOOwogfQogCiAvKiBJbml0aWFsaXplIG1ldHJpY3Mgb24gc29ja2V0LiAqLwpAQCAtMjY2Myw3ICsyNjYzLDcgQEAKIAkJICAgICAgIHRwLT5zbmRfc3N0aHJlc2gsIHRwLT5wcmlvcl9zc3RocmVzaCwKIAkJICAgICAgIHRwLT5wYWNrZXRzX291dCk7CiAJfQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJZWxzZSBpZiAoc2stPnNrX2ZhbWlseSA9PSBBRl9JTkVUNikgewogCQlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJCXByaW50ayhLRVJOX0RFQlVHICJVbmRvICVzICVwSTYvJXUgYyV1IGwldSBzcyV1LyV1IHAldVxuIiwKQEAgLTI4NTgsNyArMjg1OCw3IEBACiAJc3RydWN0IHRjcF9zb2NrICp0cCA9IHRjcF9zayhzayk7CiAJaW50IHN0YXRlID0gVENQX0NBX09wZW47CiAKLQlpZiAodGNwX2xlZnRfb3V0KHRwKSB8fCB0Y3BfYW55X3JldHJhbnNfZG9uZShzaykgfHwgdHAtPnVuZG9fbWFya2VyKQorCWlmICh0Y3BfbGVmdF9vdXQodHApIHx8IHRjcF9hbnlfcmV0cmFuc19kb25lKHNrKSkKIAkJc3RhdGUgPSBUQ1BfQ0FfRGlzb3JkZXI7CiAKIAlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2NhX3N0YXRlICE9IHN0YXRlKSB7CkBAIC0yODgxLDcgKzI4ODEsOCBAQAogCiAJaWYgKGluZXRfY3NrKHNrKS0+aWNza19jYV9zdGF0ZSAhPSBUQ1BfQ0FfQ1dSKSB7CiAJCXRjcF90cnlfa2VlcF9vcGVuKHNrKTsKLQkJdGNwX21vZGVyYXRlX2N3bmQodHApOworCQlpZiAoaW5ldF9jc2soc2spLT5pY3NrX2NhX3N0YXRlICE9IFRDUF9DQV9PcGVuKQorCQkJdGNwX21vZGVyYXRlX2N3bmQodHApOwogCX0gZWxzZSB7CiAJCXRjcF9jd25kX2Rvd24oc2ssIGZsYWcpOwogCX0KQEAgLTMwMDksMTEgKzMwMTAsMTEgQEAKICAqIHRjcF94bWl0X3JldHJhbnNtaXRfcXVldWUoKS4KICAqLwogc3RhdGljIHZvaWQgdGNwX2Zhc3RyZXRyYW5zX2FsZXJ0KHN0cnVjdCBzb2NrICpzaywgaW50IHBrdHNfYWNrZWQsCi0JCQkJICBpbnQgbmV3bHlfYWNrZWRfc2Fja2VkLCBpbnQgZmxhZykKKwkJCQkgIGludCBuZXdseV9hY2tlZF9zYWNrZWQsIGJvb2wgaXNfZHVwYWNrLAorCQkJCSAgaW50IGZsYWcpCiB7CiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCXN0cnVjdCB0Y3Bfc29jayAqdHAgPSB0Y3Bfc2soc2spOwotCWludCBpc19kdXBhY2sgPSAhKGZsYWcgJiAoRkxBR19TTkRfVU5BX0FEVkFOQ0VEIHwgRkxBR19OT1RfRFVQKSk7CiAJaW50IGRvX2xvc3QgPSBpc19kdXBhY2sgfHwgKChmbGFnICYgRkxBR19EQVRBX1NBQ0tFRCkgJiYKIAkJCQkgICAgKHRjcF9mYWNrZXRzX291dCh0cCkgPiB0cC0+cmVvcmRlcmluZykpOwogCWludCBmYXN0X3JleG1pdCA9IDAsIG1pYl9pZHg7CkBAIC0zMDY2LDE3ICszMDY3LDYgQEAKIAkJCX0KIAkJCWJyZWFrOwogCi0JCWNhc2UgVENQX0NBX0Rpc29yZGVyOgotCQkJdGNwX3RyeV91bmRvX2RzYWNrKHNrKTsKLQkJCWlmICghdHAtPnVuZG9fbWFya2VyIHx8Ci0JCQkgICAgLyogRm9yIFNBQ0sgY2FzZSBkbyBub3QgT3BlbiB0byBhbGxvdyB0byB1bmRvCi0JCQkgICAgICogY2F0Y2hpbmcgZm9yIGFsbCBkdXBsaWNhdGUgQUNLcy4gKi8KLQkJCSAgICB0Y3BfaXNfcmVubyh0cCkgfHwgdHAtPnNuZF91bmEgIT0gdHAtPmhpZ2hfc2VxKSB7Ci0JCQkJdHAtPnVuZG9fbWFya2VyID0gMDsKLQkJCQl0Y3Bfc2V0X2NhX3N0YXRlKHNrLCBUQ1BfQ0FfT3Blbik7Ci0JCQl9Ci0JCQlicmVhazsKLQogCQljYXNlIFRDUF9DQV9SZWNvdmVyeToKIAkJCWlmICh0Y3BfaXNfcmVubyh0cCkpCiAJCQkJdGNwX3Jlc2V0X3Jlbm9fc2Fjayh0cCk7CkBAIC0zMTE3LDcgKzMxMDcsNyBAQAogCQkJCXRjcF9hZGRfcmVub19zYWNrKHNrKTsKIAkJfQogCi0JCWlmIChpY3NrLT5pY3NrX2NhX3N0YXRlID09IFRDUF9DQV9EaXNvcmRlcikKKwkJaWYgKGljc2stPmljc2tfY2Ffc3RhdGUgPD0gVENQX0NBX0Rpc29yZGVyKQogCQkJdGNwX3RyeV91bmRvX2RzYWNrKHNrKTsKIAogCQlpZiAoIXRjcF90aW1lX3RvX3JlY292ZXIoc2spKSB7CkBAIC0zNjgxLDEwICszNjcxLDEyIEBACiAJdTMyIHByaW9yX3NuZF91bmEgPSB0cC0+c25kX3VuYTsKIAl1MzIgYWNrX3NlcSA9IFRDUF9TS0JfQ0Ioc2tiKS0+c2VxOwogCXUzMiBhY2sgPSBUQ1BfU0tCX0NCKHNrYiktPmFja19zZXE7CisJYm9vbCBpc19kdXBhY2sgPSBmYWxzZTsKIAl1MzIgcHJpb3JfaW5fZmxpZ2h0OwogCXUzMiBwcmlvcl9mYWNrZXRzOwogCWludCBwcmlvcl9wYWNrZXRzOwogCWludCBwcmlvcl9zYWNrZWQgPSB0cC0+c2Fja2VkX291dDsKKwlpbnQgcGt0c19hY2tlZCA9IDA7CiAJaW50IG5ld2x5X2Fja2VkX3NhY2tlZCA9IDA7CiAJaW50IGZydG9fY3duZCA9IDA7CiAKQEAgLTM3NTcsNiArMzc0OSw3IEBACiAJLyogU2VlIGlmIHdlIGNhbiB0YWtlIGFueXRoaW5nIG9mZiBvZiB0aGUgcmV0cmFuc21pdCBxdWV1ZS4gKi8KIAlmbGFnIHw9IHRjcF9jbGVhbl9ydHhfcXVldWUoc2ssIHByaW9yX2ZhY2tldHMsIHByaW9yX3NuZF91bmEpOwogCisJcGt0c19hY2tlZCA9IHByaW9yX3BhY2tldHMgLSB0cC0+cGFja2V0c19vdXQ7CiAJbmV3bHlfYWNrZWRfc2Fja2VkID0gKHByaW9yX3BhY2tldHMgLSBwcmlvcl9zYWNrZWQpIC0KIAkJCSAgICAgKHRwLT5wYWNrZXRzX291dCAtIHRwLT5zYWNrZWRfb3V0KTsKIApAQCAtMzc3MSw4ICszNzY0LDkgQEAKIAkJaWYgKChmbGFnICYgRkxBR19EQVRBX0FDS0VEKSAmJiAhZnJ0b19jd25kICYmCiAJCSAgICB0Y3BfbWF5X3JhaXNlX2N3bmQoc2ssIGZsYWcpKQogCQkJdGNwX2NvbmdfYXZvaWQoc2ssIGFjaywgcHJpb3JfaW5fZmxpZ2h0KTsKLQkJdGNwX2Zhc3RyZXRyYW5zX2FsZXJ0KHNrLCBwcmlvcl9wYWNrZXRzIC0gdHAtPnBhY2tldHNfb3V0LAotCQkJCSAgICAgIG5ld2x5X2Fja2VkX3NhY2tlZCwgZmxhZyk7CisJCWlzX2R1cGFjayA9ICEoZmxhZyAmIChGTEFHX1NORF9VTkFfQURWQU5DRUQgfCBGTEFHX05PVF9EVVApKTsKKwkJdGNwX2Zhc3RyZXRyYW5zX2FsZXJ0KHNrLCBwa3RzX2Fja2VkLCBuZXdseV9hY2tlZF9zYWNrZWQsCisJCQkJICAgICAgaXNfZHVwYWNrLCBmbGFnKTsKIAl9IGVsc2UgewogCQlpZiAoKGZsYWcgJiBGTEFHX0RBVEFfQUNLRUQpICYmICFmcnRvX2N3bmQpCiAJCQl0Y3BfY29uZ19hdm9pZChzaywgYWNrLCBwcmlvcl9pbl9mbGlnaHQpOwpAQCAtMzc4NCw2ICszNzc4LDEwIEBACiAJcmV0dXJuIDE7CiAKIG5vX3F1ZXVlOgorCS8qIElmIGRhdGEgd2FzIERTQUNLZWQsIHNlZSBpZiB3ZSBjYW4gdW5kbyBhIGN3bmQgcmVkdWN0aW9uLiAqLworCWlmIChmbGFnICYgRkxBR19EU0FDS0lOR19BQ0spCisJCXRjcF9mYXN0cmV0cmFuc19hbGVydChzaywgcGt0c19hY2tlZCwgbmV3bHlfYWNrZWRfc2Fja2VkLAorCQkJCSAgICAgIGlzX2R1cGFjaywgZmxhZyk7CiAJLyogSWYgdGhpcyBhY2sgb3BlbnMgdXAgYSB6ZXJvIHdpbmRvdywgY2xlYXIgYmFja29mZi4gIEl0IHdhcwogCSAqIGJlaW5nIHVzZWQgdG8gdGltZSB0aGUgcHJvYmVzLCBhbmQgaXMgcHJvYmFibHkgZmFyIGhpZ2hlciB0aGFuCiAJICogaXQgbmVlZHMgdG8gYmUgZm9yIG5vcm1hbCByZXRyYW5zbWlzc2lvbi4KQEAgLTM3OTcsMTAgKzM3OTUsMTQgQEAKIAlyZXR1cm4gLTE7CiAKIG9sZF9hY2s6CisJLyogSWYgZGF0YSB3YXMgU0FDS2VkLCB0YWcgaXQgYW5kIHNlZSBpZiB3ZSBzaG91bGQgc2VuZCBtb3JlIGRhdGEuCisJICogSWYgZGF0YSB3YXMgRFNBQ0tlZCwgc2VlIGlmIHdlIGNhbiB1bmRvIGEgY3duZCByZWR1Y3Rpb24uCisJICovCiAJaWYgKFRDUF9TS0JfQ0Ioc2tiKS0+c2Fja2VkKSB7Ci0JCXRjcF9zYWNrdGFnX3dyaXRlX3F1ZXVlKHNrLCBza2IsIHByaW9yX3NuZF91bmEpOwotCQlpZiAoaWNzay0+aWNza19jYV9zdGF0ZSA9PSBUQ1BfQ0FfT3BlbikKLQkJCXRjcF90cnlfa2VlcF9vcGVuKHNrKTsKKwkJZmxhZyB8PSB0Y3Bfc2Fja3RhZ193cml0ZV9xdWV1ZShzaywgc2tiLCBwcmlvcl9zbmRfdW5hKTsKKwkJbmV3bHlfYWNrZWRfc2Fja2VkID0gdHAtPnNhY2tlZF9vdXQgLSBwcmlvcl9zYWNrZWQ7CisJCXRjcF9mYXN0cmV0cmFuc19hbGVydChzaywgcGt0c19hY2tlZCwgbmV3bHlfYWNrZWRfc2Fja2VkLAorCQkJCSAgICAgIGlzX2R1cGFjaywgZmxhZyk7CiAJfQogCiAJU09DS19ERUJVRyhzaywgIkFjayAldSBiZWZvcmUgJXU6JXVcbiIsIGFjaywgdHAtPnNuZF91bmEsIHRwLT5zbmRfbnh0KTsKQEAgLTM4NzYsNyArMzg3OCw3IEBACiAJCQljYXNlIFRDUE9QVF9TQUNLX1BFUk06CiAJCQkJaWYgKG9wc2l6ZSA9PSBUQ1BPTEVOX1NBQ0tfUEVSTSAmJiB0aC0+c3luICYmCiAJCQkJICAgICFlc3RhYiAmJiBzeXNjdGxfdGNwX3NhY2spIHsKLQkJCQkJb3B0X3J4LT5zYWNrX29rID0gMTsKKwkJCQkJb3B0X3J4LT5zYWNrX29rID0gVENQX1NBQ0tfU0VFTjsKIAkJCQkJdGNwX3NhY2tfcmVzZXQob3B0X3J4KTsKIAkJCQl9CiAJCQkJYnJlYWs7CkBAIC00ODY0LDcgKzQ4NjYsNyBAQAogCiAJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPj0gc2stPnNrX3JjdmJ1ZikKIAkJdGNwX2NsYW1wX3dpbmRvdyhzayk7Ci0JZWxzZSBpZiAodGNwX21lbW9yeV9wcmVzc3VyZSkKKwllbHNlIGlmIChza191bmRlcl9tZW1vcnlfcHJlc3N1cmUoc2spKQogCQl0cC0+cmN2X3NzdGhyZXNoID0gbWluKHRwLT5yY3Zfc3N0aHJlc2gsIDRVICogdHAtPmFkdm1zcyk7CiAKIAl0Y3BfY29sbGFwc2Vfb2ZvX3F1ZXVlKHNrKTsKQEAgLTQ5MzAsMTEgKzQ5MzIsMTEgQEAKIAkJcmV0dXJuIDA7CiAKIAkvKiBJZiB3ZSBhcmUgdW5kZXIgZ2xvYmFsIFRDUCBtZW1vcnkgcHJlc3N1cmUsIGRvIG5vdCBleHBhbmQuICAqLwotCWlmICh0Y3BfbWVtb3J5X3ByZXNzdXJlKQorCWlmIChza191bmRlcl9tZW1vcnlfcHJlc3N1cmUoc2spKQogCQlyZXR1cm4gMDsKIAogCS8qIElmIHdlIGFyZSB1bmRlciBzb2Z0IGdsb2JhbCBUQ1AgbWVtb3J5IHByZXNzdXJlLCBkbyBub3QgZXhwYW5kLiAgKi8KLQlpZiAoYXRvbWljX2xvbmdfcmVhZCgmdGNwX21lbW9yeV9hbGxvY2F0ZWQpID49IHN5c2N0bF90Y3BfbWVtWzBdKQorCWlmIChza19tZW1vcnlfYWxsb2NhdGVkKHNrKSA+PSBza19wcm90X21lbV9saW1pdHMoc2ssIDApKQogCQlyZXR1cm4gMDsKIAogCS8qIElmIHdlIGZpbGxlZCB0aGUgY29uZ2VzdGlvbiB3aW5kb3csIGRvIG5vdCBleHBhbmQuICAqLwpAQCAtNTgwOSw2ICs1ODExLDggQEAKIAkJCWdvdG8gZGlzY2FyZDsKIAogCQlpZiAodGgtPnN5bikgeworCQkJaWYgKHRoLT5maW4pCisJCQkJZ290byBkaXNjYXJkOwogCQkJaWYgKGljc2stPmljc2tfYWZfb3BzLT5jb25uX3JlcXVlc3Qoc2ssIHNrYikgPCAwKQogCQkJCXJldHVybiAxOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2NC90Y3BfaXB2NC5jIGIvbmV0L2lwdjQvdGNwX2lwdjQuYwppbmRleCBhOWRiNGIxLi4xZWI0YWQ1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfaXB2NC5jCisrKyBiL25ldC9pcHY0L3RjcF9pcHY0LmMKQEAgLTczLDYgKzczLDcgQEAKICNpbmNsdWRlIDxuZXQveGZybS5oPgogI2luY2x1ZGUgPG5ldC9uZXRkbWEuaD4KICNpbmNsdWRlIDxuZXQvc2VjdXJlX3NlcS5oPgorI2luY2x1ZGUgPG5ldC90Y3BfbWVtY29udHJvbC5oPgogCiAjaW5jbHVkZSA8bGludXgvaW5ldC5oPgogI2luY2x1ZGUgPGxpbnV4L2lwdjYuaD4KQEAgLTE1MTEsNiArMTUxMiw3IEBACiAJcmV0dXJuIE5VTEw7CiBwdXRfYW5kX2V4aXQ6CiAJdGNwX2NsZWFyX3htaXRfdGltZXJzKG5ld3NrKTsKKwl0Y3BfY2xlYW51cF9jb25nZXN0aW9uX2NvbnRyb2wobmV3c2spOwogCWJoX3VubG9ja19zb2NrKG5ld3NrKTsKIAlzb2NrX3B1dChuZXdzayk7CiAJZ290byBleGl0OwpAQCAtMTkxNiw3ICsxOTE4LDggQEAKIAlzay0+c2tfcmN2YnVmID0gc3lzY3RsX3RjcF9ybWVtWzFdOwogCiAJbG9jYWxfYmhfZGlzYWJsZSgpOwotCXBlcmNwdV9jb3VudGVyX2luYygmdGNwX3NvY2tldHNfYWxsb2NhdGVkKTsKKwlzb2NrX3VwZGF0ZV9tZW1jZyhzayk7CisJc2tfc29ja2V0c19hbGxvY2F0ZWRfaW5jKHNrKTsKIAlsb2NhbF9iaF9lbmFibGUoKTsKIAogCXJldHVybiAwOwpAQCAtMTk3Miw3ICsxOTc1LDggQEAKIAkJdHAtPmNvb2tpZV92YWx1ZXMgPSBOVUxMOwogCX0KIAotCXBlcmNwdV9jb3VudGVyX2RlYygmdGNwX3NvY2tldHNfYWxsb2NhdGVkKTsKKwlza19zb2NrZXRzX2FsbG9jYXRlZF9kZWMoc2spOworCXNvY2tfcmVsZWFzZV9tZW1jZyhzayk7CiB9CiBFWFBPUlRfU1lNQk9MKHRjcF92NF9kZXN0cm95X3NvY2spOwogCkBAIC0yNjE5LDcgKzI2MjMsNiBAQAogCS5vcnBoYW5fY291bnQJCT0gJnRjcF9vcnBoYW5fY291bnQsCiAJLm1lbW9yeV9hbGxvY2F0ZWQJPSAmdGNwX21lbW9yeV9hbGxvY2F0ZWQsCiAJLm1lbW9yeV9wcmVzc3VyZQk9ICZ0Y3BfbWVtb3J5X3ByZXNzdXJlLAotCS5zeXNjdGxfbWVtCQk9IHN5c2N0bF90Y3BfbWVtLAogCS5zeXNjdGxfd21lbQkJPSBzeXNjdGxfdGNwX3dtZW0sCiAJLnN5c2N0bF9ybWVtCQk9IHN5c2N0bF90Y3Bfcm1lbSwKIAkubWF4X2hlYWRlcgkJPSBNQVhfVENQX0hFQURFUiwKQEAgLTI2MzMsMTAgKzI2MzYsMTQgQEAKIAkuY29tcGF0X3NldHNvY2tvcHQJPSBjb21wYXRfdGNwX3NldHNvY2tvcHQsCiAJLmNvbXBhdF9nZXRzb2Nrb3B0CT0gY29tcGF0X3RjcF9nZXRzb2Nrb3B0LAogI2VuZGlmCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfS01FTQorCS5pbml0X2Nncm91cAkJPSB0Y3BfaW5pdF9jZ3JvdXAsCisJLmRlc3Ryb3lfY2dyb3VwCQk9IHRjcF9kZXN0cm95X2Nncm91cCwKKwkucHJvdG9fY2dyb3VwCQk9IHRjcF9wcm90b19jZ3JvdXAsCisjZW5kaWYKIH07CiBFWFBPUlRfU1lNQk9MKHRjcF9wcm90KTsKIAotCiBzdGF0aWMgaW50IF9fbmV0X2luaXQgdGNwX3NrX2luaXQoc3RydWN0IG5ldCAqbmV0KQogewogCXJldHVybiBpbmV0X2N0bF9zb2NrX2NyZWF0ZSgmbmV0LT5pcHY0LnRjcF9zb2NrLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdGNwX21lbWNvbnRyb2wuYyBiL25ldC9pcHY0L3RjcF9tZW1jb250cm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlZDA0ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3RjcF9tZW1jb250cm9sLmMKQEAgLTAsMCArMSwyNzIgQEAKKyNpbmNsdWRlIDxuZXQvdGNwLmg+CisjaW5jbHVkZSA8bmV0L3RjcF9tZW1jb250cm9sLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9uc3Byb3h5Lmg+CisjaW5jbHVkZSA8bGludXgvbWVtY29udHJvbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCitzdGF0aWMgdTY0IHRjcF9jZ3JvdXBfcmVhZChzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2Z0eXBlICpjZnQpOworc3RhdGljIGludCB0Y3BfY2dyb3VwX3dyaXRlKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZnR5cGUgKmNmdCwKKwkJCSAgICBjb25zdCBjaGFyICpidWZmZXIpOworc3RhdGljIGludCB0Y3BfY2dyb3VwX3Jlc2V0KHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHVuc2lnbmVkIGludCBldmVudCk7CisKK3N0YXRpYyBzdHJ1Y3QgY2Z0eXBlIHRjcF9maWxlc1tdID0geworCXsKKwkJLm5hbWUgPSAia21lbS50Y3AubGltaXRfaW5fYnl0ZXMiLAorCQkud3JpdGVfc3RyaW5nID0gdGNwX2Nncm91cF93cml0ZSwKKwkJLnJlYWRfdTY0ID0gdGNwX2Nncm91cF9yZWFkLAorCQkucHJpdmF0ZSA9IFJFU19MSU1JVCwKKwl9LAorCXsKKwkJLm5hbWUgPSAia21lbS50Y3AudXNhZ2VfaW5fYnl0ZXMiLAorCQkucmVhZF91NjQgPSB0Y3BfY2dyb3VwX3JlYWQsCisJCS5wcml2YXRlID0gUkVTX1VTQUdFLAorCX0sCisJeworCQkubmFtZSA9ICJrbWVtLnRjcC5mYWlsY250IiwKKwkJLnByaXZhdGUgPSBSRVNfRkFJTENOVCwKKwkJLnRyaWdnZXIgPSB0Y3BfY2dyb3VwX3Jlc2V0LAorCQkucmVhZF91NjQgPSB0Y3BfY2dyb3VwX3JlYWQsCisJfSwKKwl7CisJCS5uYW1lID0gImttZW0udGNwLm1heF91c2FnZV9pbl9ieXRlcyIsCisJCS5wcml2YXRlID0gUkVTX01BWF9VU0FHRSwKKwkJLnRyaWdnZXIgPSB0Y3BfY2dyb3VwX3Jlc2V0LAorCQkucmVhZF91NjQgPSB0Y3BfY2dyb3VwX3JlYWQsCisJfSwKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHRjcF9tZW1jb250cm9sICp0Y3BfZnJvbV9jZ3Byb3RvKHN0cnVjdCBjZ19wcm90byAqY2dfcHJvdG8pCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihjZ19wcm90bywgc3RydWN0IHRjcF9tZW1jb250cm9sLCBjZ19wcm90byk7Cit9CisKK3N0YXRpYyB2b2lkIG1lbWNnX3RjcF9lbnRlcl9tZW1vcnlfcHJlc3N1cmUoc3RydWN0IHNvY2sgKnNrKQoreworCWlmIChzay0+c2tfY2dycC0+bWVtb3J5X3ByZXNzdXJlKQorCQkqc2stPnNrX2NncnAtPm1lbW9yeV9wcmVzc3VyZSA9IDE7Cit9CitFWFBPUlRfU1lNQk9MKG1lbWNnX3RjcF9lbnRlcl9tZW1vcnlfcHJlc3N1cmUpOworCitpbnQgdGNwX2luaXRfY2dyb3VwKHN0cnVjdCBjZ3JvdXAgKmNncnAsIHN0cnVjdCBjZ3JvdXBfc3Vic3lzICpzcykKK3sKKwkvKgorCSAqIFRoZSByb290IGNncm91cCBkb2VzIG5vdCB1c2UgcmVzX2NvdW50ZXJzLCBidXQgcmF0aGVyLAorCSAqIHJlbHkgb24gdGhlIGRhdGEgYWxyZWFkeSBjb2xsZWN0ZWQgYnkgdGhlIG5ldHdvcmsKKwkgKiBzdWJzeXN0ZW0KKwkgKi8KKwlzdHJ1Y3QgcmVzX2NvdW50ZXIgKnJlc19wYXJlbnQgPSBOVUxMOworCXN0cnVjdCBjZ19wcm90byAqY2dfcHJvdG8sICpwYXJlbnRfY2c7CisJc3RydWN0IHRjcF9tZW1jb250cm9sICp0Y3A7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY2dycCk7CisJc3RydWN0IG1lbV9jZ3JvdXAgKnBhcmVudCA9IHBhcmVudF9tZW1fY2dyb3VwKG1lbWNnKTsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBjdXJyZW50LT5uc3Byb3h5LT5uZXRfbnM7CisKKwljZ19wcm90byA9IHRjcF9wcm90LnByb3RvX2Nncm91cChtZW1jZyk7CisJaWYgKCFjZ19wcm90bykKKwkJZ290byBjcmVhdGVfZmlsZXM7CisKKwl0Y3AgPSB0Y3BfZnJvbV9jZ3Byb3RvKGNnX3Byb3RvKTsKKworCXRjcC0+dGNwX3Byb3RfbWVtWzBdID0gbmV0LT5pcHY0LnN5c2N0bF90Y3BfbWVtWzBdOworCXRjcC0+dGNwX3Byb3RfbWVtWzFdID0gbmV0LT5pcHY0LnN5c2N0bF90Y3BfbWVtWzFdOworCXRjcC0+dGNwX3Byb3RfbWVtWzJdID0gbmV0LT5pcHY0LnN5c2N0bF90Y3BfbWVtWzJdOworCXRjcC0+dGNwX21lbW9yeV9wcmVzc3VyZSA9IDA7CisKKwlwYXJlbnRfY2cgPSB0Y3BfcHJvdC5wcm90b19jZ3JvdXAocGFyZW50KTsKKwlpZiAocGFyZW50X2NnKQorCQlyZXNfcGFyZW50ID0gcGFyZW50X2NnLT5tZW1vcnlfYWxsb2NhdGVkOworCisJcmVzX2NvdW50ZXJfaW5pdCgmdGNwLT50Y3BfbWVtb3J5X2FsbG9jYXRlZCwgcmVzX3BhcmVudCk7CisJcGVyY3B1X2NvdW50ZXJfaW5pdCgmdGNwLT50Y3Bfc29ja2V0c19hbGxvY2F0ZWQsIDApOworCisJY2dfcHJvdG8tPmVudGVyX21lbW9yeV9wcmVzc3VyZSA9IG1lbWNnX3RjcF9lbnRlcl9tZW1vcnlfcHJlc3N1cmU7CisJY2dfcHJvdG8tPm1lbW9yeV9wcmVzc3VyZSA9ICZ0Y3AtPnRjcF9tZW1vcnlfcHJlc3N1cmU7CisJY2dfcHJvdG8tPnN5c2N0bF9tZW0gPSB0Y3AtPnRjcF9wcm90X21lbTsKKwljZ19wcm90by0+bWVtb3J5X2FsbG9jYXRlZCA9ICZ0Y3AtPnRjcF9tZW1vcnlfYWxsb2NhdGVkOworCWNnX3Byb3RvLT5zb2NrZXRzX2FsbG9jYXRlZCA9ICZ0Y3AtPnRjcF9zb2NrZXRzX2FsbG9jYXRlZDsKKwljZ19wcm90by0+bWVtY2cgPSBtZW1jZzsKKworY3JlYXRlX2ZpbGVzOgorCXJldHVybiBjZ3JvdXBfYWRkX2ZpbGVzKGNncnAsIHNzLCB0Y3BfZmlsZXMsCisJCQkJQVJSQVlfU0laRSh0Y3BfZmlsZXMpKTsKK30KK0VYUE9SVF9TWU1CT0wodGNwX2luaXRfY2dyb3VwKTsKKwordm9pZCB0Y3BfZGVzdHJveV9jZ3JvdXAoc3RydWN0IGNncm91cCAqY2dycCwgc3RydWN0IGNncm91cF9zdWJzeXMgKnNzKQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZyA9IG1lbV9jZ3JvdXBfZnJvbV9jb250KGNncnApOworCXN0cnVjdCBjZ19wcm90byAqY2dfcHJvdG87CisJc3RydWN0IHRjcF9tZW1jb250cm9sICp0Y3A7CisJdTY0IHZhbDsKKworCWNnX3Byb3RvID0gdGNwX3Byb3QucHJvdG9fY2dyb3VwKG1lbWNnKTsKKwlpZiAoIWNnX3Byb3RvKQorCQlyZXR1cm47CisKKwl0Y3AgPSB0Y3BfZnJvbV9jZ3Byb3RvKGNnX3Byb3RvKTsKKwlwZXJjcHVfY291bnRlcl9kZXN0cm95KCZ0Y3AtPnRjcF9zb2NrZXRzX2FsbG9jYXRlZCk7CisKKwl2YWwgPSByZXNfY291bnRlcl9yZWFkX3U2NCgmdGNwLT50Y3BfbWVtb3J5X2FsbG9jYXRlZCwgUkVTX1VTQUdFKTsKKworCWlmICh2YWwgIT0gUkVTT1VSQ0VfTUFYKQorCQlqdW1wX2xhYmVsX2RlYygmbWVtY2dfc29ja2V0X2xpbWl0X2VuYWJsZWQpOworfQorRVhQT1JUX1NZTUJPTCh0Y3BfZGVzdHJveV9jZ3JvdXApOworCitzdGF0aWMgaW50IHRjcF91cGRhdGVfbGltaXQoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCB1NjQgdmFsKQoreworCXN0cnVjdCBuZXQgKm5ldCA9IGN1cnJlbnQtPm5zcHJveHktPm5ldF9uczsKKwlzdHJ1Y3QgdGNwX21lbWNvbnRyb2wgKnRjcDsKKwlzdHJ1Y3QgY2dfcHJvdG8gKmNnX3Byb3RvOworCXU2NCBvbGRfbGltOworCWludCBpOworCWludCByZXQ7CisKKwljZ19wcm90byA9IHRjcF9wcm90LnByb3RvX2Nncm91cChtZW1jZyk7CisJaWYgKCFjZ19wcm90bykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodmFsID4gUkVTT1VSQ0VfTUFYKQorCQl2YWwgPSBSRVNPVVJDRV9NQVg7CisKKwl0Y3AgPSB0Y3BfZnJvbV9jZ3Byb3RvKGNnX3Byb3RvKTsKKworCW9sZF9saW0gPSByZXNfY291bnRlcl9yZWFkX3U2NCgmdGNwLT50Y3BfbWVtb3J5X2FsbG9jYXRlZCwgUkVTX0xJTUlUKTsKKwlyZXQgPSByZXNfY291bnRlcl9zZXRfbGltaXQoJnRjcC0+dGNwX21lbW9yeV9hbGxvY2F0ZWQsIHZhbCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCXRjcC0+dGNwX3Byb3RfbWVtW2ldID0gbWluX3QobG9uZywgdmFsID4+IFBBR0VfU0hJRlQsCisJCQkJCSAgICAgbmV0LT5pcHY0LnN5c2N0bF90Y3BfbWVtW2ldKTsKKworCWlmICh2YWwgPT0gUkVTT1VSQ0VfTUFYICYmIG9sZF9saW0gIT0gUkVTT1VSQ0VfTUFYKQorCQlqdW1wX2xhYmVsX2RlYygmbWVtY2dfc29ja2V0X2xpbWl0X2VuYWJsZWQpOworCWVsc2UgaWYgKG9sZF9saW0gPT0gUkVTT1VSQ0VfTUFYICYmIHZhbCAhPSBSRVNPVVJDRV9NQVgpCisJCWp1bXBfbGFiZWxfaW5jKCZtZW1jZ19zb2NrZXRfbGltaXRfZW5hYmxlZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0Y3BfY2dyb3VwX3dyaXRlKHN0cnVjdCBjZ3JvdXAgKmNvbnQsIHN0cnVjdCBjZnR5cGUgKmNmdCwKKwkJCSAgICBjb25zdCBjaGFyICpidWZmZXIpCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJdW5zaWduZWQgbG9uZyBsb25nIHZhbDsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAoY2Z0LT5wcml2YXRlKSB7CisJY2FzZSBSRVNfTElNSVQ6CisJCS8qIHNlZSBtZW1jb250cm9sLmMgKi8KKwkJcmV0ID0gcmVzX2NvdW50ZXJfbWVtcGFyc2Vfd3JpdGVfc3RyYXRlZ3koYnVmZmVyLCAmdmFsKTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCQlyZXQgPSB0Y3BfdXBkYXRlX2xpbWl0KG1lbWNnLCB2YWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHU2NCB0Y3BfcmVhZF9zdGF0KHN0cnVjdCBtZW1fY2dyb3VwICptZW1jZywgaW50IHR5cGUsIHU2NCBkZWZhdWx0X3ZhbCkKK3sKKwlzdHJ1Y3QgdGNwX21lbWNvbnRyb2wgKnRjcDsKKwlzdHJ1Y3QgY2dfcHJvdG8gKmNnX3Byb3RvOworCisJY2dfcHJvdG8gPSB0Y3BfcHJvdC5wcm90b19jZ3JvdXAobWVtY2cpOworCWlmICghY2dfcHJvdG8pCisJCXJldHVybiBkZWZhdWx0X3ZhbDsKKworCXRjcCA9IHRjcF9mcm9tX2NncHJvdG8oY2dfcHJvdG8pOworCXJldHVybiByZXNfY291bnRlcl9yZWFkX3U2NCgmdGNwLT50Y3BfbWVtb3J5X2FsbG9jYXRlZCwgdHlwZSk7Cit9CisKK3N0YXRpYyB1NjQgdGNwX3JlYWRfdXNhZ2Uoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnKQoreworCXN0cnVjdCB0Y3BfbWVtY29udHJvbCAqdGNwOworCXN0cnVjdCBjZ19wcm90byAqY2dfcHJvdG87CisKKwljZ19wcm90byA9IHRjcF9wcm90LnByb3RvX2Nncm91cChtZW1jZyk7CisJaWYgKCFjZ19wcm90bykKKwkJcmV0dXJuIGF0b21pY19sb25nX3JlYWQoJnRjcF9tZW1vcnlfYWxsb2NhdGVkKSA8PCBQQUdFX1NISUZUOworCisJdGNwID0gdGNwX2Zyb21fY2dwcm90byhjZ19wcm90byk7CisJcmV0dXJuIHJlc19jb3VudGVyX3JlYWRfdTY0KCZ0Y3AtPnRjcF9tZW1vcnlfYWxsb2NhdGVkLCBSRVNfVVNBR0UpOworfQorCitzdGF0aWMgdTY0IHRjcF9jZ3JvdXBfcmVhZChzdHJ1Y3QgY2dyb3VwICpjb250LCBzdHJ1Y3QgY2Z0eXBlICpjZnQpCit7CisJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbWVtX2Nncm91cF9mcm9tX2NvbnQoY29udCk7CisJdTY0IHZhbDsKKworCXN3aXRjaCAoY2Z0LT5wcml2YXRlKSB7CisJY2FzZSBSRVNfTElNSVQ6CisJCXZhbCA9IHRjcF9yZWFkX3N0YXQobWVtY2csIFJFU19MSU1JVCwgUkVTT1VSQ0VfTUFYKTsKKwkJYnJlYWs7CisJY2FzZSBSRVNfVVNBR0U6CisJCXZhbCA9IHRjcF9yZWFkX3VzYWdlKG1lbWNnKTsKKwkJYnJlYWs7CisJY2FzZSBSRVNfRkFJTENOVDoKKwljYXNlIFJFU19NQVhfVVNBR0U6CisJCXZhbCA9IHRjcF9yZWFkX3N0YXQobWVtY2csIGNmdC0+cHJpdmF0ZSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IHRjcF9jZ3JvdXBfcmVzZXQoc3RydWN0IGNncm91cCAqY29udCwgdW5zaWduZWQgaW50IGV2ZW50KQoreworCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKKwlzdHJ1Y3QgdGNwX21lbWNvbnRyb2wgKnRjcDsKKwlzdHJ1Y3QgY2dfcHJvdG8gKmNnX3Byb3RvOworCisJbWVtY2cgPSBtZW1fY2dyb3VwX2Zyb21fY29udChjb250KTsKKwljZ19wcm90byA9IHRjcF9wcm90LnByb3RvX2Nncm91cChtZW1jZyk7CisJaWYgKCFjZ19wcm90bykKKwkJcmV0dXJuIDA7CisJdGNwID0gdGNwX2Zyb21fY2dwcm90byhjZ19wcm90byk7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBSRVNfTUFYX1VTQUdFOgorCQlyZXNfY291bnRlcl9yZXNldF9tYXgoJnRjcC0+dGNwX21lbW9yeV9hbGxvY2F0ZWQpOworCQlicmVhazsKKwljYXNlIFJFU19GQUlMQ05UOgorCQlyZXNfY291bnRlcl9yZXNldF9mYWlsY250KCZ0Y3AtPnRjcF9tZW1vcnlfYWxsb2NhdGVkKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbG9uZyB0Y3BfbWF4X21lbW9yeShjb25zdCBzdHJ1Y3QgbWVtX2Nncm91cCAqbWVtY2cpCit7CisJc3RydWN0IHRjcF9tZW1jb250cm9sICp0Y3A7CisJc3RydWN0IGNnX3Byb3RvICpjZ19wcm90bzsKKworCWNnX3Byb3RvID0gdGNwX3Byb3QucHJvdG9fY2dyb3VwKChzdHJ1Y3QgbWVtX2Nncm91cCAqKW1lbWNnKTsKKwlpZiAoIWNnX3Byb3RvKQorCQlyZXR1cm4gMDsKKworCXRjcCA9IHRjcF9mcm9tX2NncHJvdG8oY2dfcHJvdG8pOworCXJldHVybiByZXNfY291bnRlcl9yZWFkX3U2NCgmdGNwLT50Y3BfbWVtb3J5X2FsbG9jYXRlZCwgUkVTX0xJTUlUKTsKK30KKwordm9pZCB0Y3BfcHJvdF9tZW0oc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBsb25nIHZhbCwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgdGNwX21lbWNvbnRyb2wgKnRjcDsKKwlzdHJ1Y3QgY2dfcHJvdG8gKmNnX3Byb3RvOworCisJY2dfcHJvdG8gPSB0Y3BfcHJvdC5wcm90b19jZ3JvdXAobWVtY2cpOworCWlmICghY2dfcHJvdG8pCisJCXJldHVybjsKKworCXRjcCA9IHRjcF9mcm9tX2NncHJvdG8oY2dfcHJvdG8pOworCisJdGNwLT50Y3BfcHJvdF9tZW1baWR4XSA9IHZhbDsKK30KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYyBiL25ldC9pcHY0L3RjcF9taW5pc29ja3MuYwppbmRleCA2NjM2M2I2Li41NTBlNzU1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3BfbWluaXNvY2tzLmMKKysrIGIvbmV0L2lwdjQvdGNwX21pbmlzb2Nrcy5jCkBAIC0zMzYsMTUgKzMzNiwxNSBAQAogCQl0Y3B0dy0+dHdfdHNfcmVjZW50CT0gdHAtPnJ4X29wdC50c19yZWNlbnQ7CiAJCXRjcHR3LT50d190c19yZWNlbnRfc3RhbXAgPSB0cC0+cnhfb3B0LnRzX3JlY2VudF9zdGFtcDsKIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCWlmICh0dy0+dHdfZmFtaWx5ID09IFBGX0lORVQ2KSB7CiAJCQlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJCQlzdHJ1Y3QgaW5ldDZfdGltZXdhaXRfc29jayAqdHc2OwogCiAJCQl0dy0+dHdfaXB2Nl9vZmZzZXQgPSBpbmV0Nl90d19vZmZzZXQoc2stPnNrX3Byb3QpOwogCQkJdHc2ID0gaW5ldDZfdHdzaygoc3RydWN0IHNvY2sgKil0dyk7Ci0JCQlpcHY2X2FkZHJfY29weSgmdHc2LT50d192Nl9kYWRkciwgJm5wLT5kYWRkcik7Ci0JCQlpcHY2X2FkZHJfY29weSgmdHc2LT50d192Nl9yY3Zfc2FkZHIsICZucC0+cmN2X3NhZGRyKTsKKwkJCXR3Ni0+dHdfdjZfZGFkZHIgPSBucC0+ZGFkZHI7CisJCQl0dzYtPnR3X3Y2X3Jjdl9zYWRkciA9IG5wLT5yY3Zfc2FkZHI7CiAJCQl0dy0+dHdfdGNsYXNzID0gbnAtPnRjbGFzczsKIAkJCXR3LT50d19pcHY2b25seSA9IG5wLT5pcHY2b25seTsKIAkJfQpAQCAtNDI1LDcgKzQyNSw3IEBACiAgKi8KIHN0cnVjdCBzb2NrICp0Y3BfY3JlYXRlX29wZW5yZXFfY2hpbGQoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgcmVxdWVzdF9zb2NrICpyZXEsIHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IHNvY2sgKm5ld3NrID0gaW5ldF9jc2tfY2xvbmUoc2ssIHJlcSwgR0ZQX0FUT01JQyk7CisJc3RydWN0IHNvY2sgKm5ld3NrID0gaW5ldF9jc2tfY2xvbmVfbG9jayhzaywgcmVxLCBHRlBfQVRPTUlDKTsKIAogCWlmIChuZXdzayAhPSBOVUxMKSB7CiAJCWNvbnN0IHN0cnVjdCBpbmV0X3JlcXVlc3Rfc29jayAqaXJlcSA9IGluZXRfcnNrKHJlcSk7CkBAIC00OTUsNyArNDk1LDkgQEAKIAkJbmV3dHAtPmZydG9fY291bnRlciA9IDA7CiAJCW5ld3RwLT5mcnRvX2hpZ2htYXJrID0gMDsKIAotCQluZXdpY3NrLT5pY3NrX2NhX29wcyA9ICZ0Y3BfaW5pdF9jb25nZXN0aW9uX29wczsKKwkJaWYgKG5ld2ljc2stPmljc2tfY2Ffb3BzICE9ICZ0Y3BfaW5pdF9jb25nZXN0aW9uX29wcyAmJgorCQkgICAgIXRyeV9tb2R1bGVfZ2V0KG5ld2ljc2stPmljc2tfY2Ffb3BzLT5vd25lcikpCisJCQluZXdpY3NrLT5pY3NrX2NhX29wcyA9ICZ0Y3BfaW5pdF9jb25nZXN0aW9uX29wczsKIAogCQl0Y3Bfc2V0X2NhX3N0YXRlKG5ld3NrLCBUQ1BfQ0FfT3Blbik7CiAJCXRjcF9pbml0X3htaXRfdGltZXJzKG5ld3NrKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF9vdXRwdXQuYyBiL25ldC9pcHY0L3RjcF9vdXRwdXQuYwppbmRleCA2MzE3MGUyLi44YzhkZTI3IDEwMDY0NAotLS0gYS9uZXQvaXB2NC90Y3Bfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjQvdGNwX291dHB1dC5jCkBAIC0xMDkzLDYgKzEwOTMsMTMgQEAKIHsKIAlpbnQgaSwgaywgZWF0OwogCisJZWF0ID0gbWluX3QoaW50LCBsZW4sIHNrYl9oZWFkbGVuKHNrYikpOworCWlmIChlYXQpIHsKKwkJX19za2JfcHVsbChza2IsIGVhdCk7CisJCWxlbiAtPSBlYXQ7CisJCWlmICghbGVuKQorCQkJcmV0dXJuOworCX0KIAllYXQgPSBsZW47CiAJayA9IDA7CiAJZm9yIChpID0gMDsgaSA8IHNrYl9zaGluZm8oc2tiKS0+bnJfZnJhZ3M7IGkrKykgewpAQCAtMTEyNCwxMSArMTEzMSw3IEBACiAJaWYgKHNrYl9jbG9uZWQoc2tiKSAmJiBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgMCwgMCwgR0ZQX0FUT01JQykpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JLyogSWYgbGVuID09IGhlYWRsZW4sIHdlIGF2b2lkIF9fc2tiX3B1bGwgdG8gcHJlc2VydmUgYWxpZ25tZW50LiAqLwotCWlmICh1bmxpa2VseShsZW4gPCBza2JfaGVhZGxlbihza2IpKSkKLQkJX19za2JfcHVsbChza2IsIGxlbik7Ci0JZWxzZQotCQlfX3Bza2JfdHJpbV9oZWFkKHNrYiwgbGVuIC0gc2tiX2hlYWRsZW4oc2tiKSk7CisJX19wc2tiX3RyaW1faGVhZChza2IsIGxlbik7CiAKIAlUQ1BfU0tCX0NCKHNrYiktPnNlcSArPSBsZW47CiAJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9QQVJUSUFMOwpAQCAtMTU4MSw3ICsxNTg0LDcgQEAKIAkJICogZnJhbWUsIHNvIGlmIHdlIGhhdmUgc3BhY2UgZm9yIG1vcmUgdGhhbiAzIGZyYW1lcwogCQkgKiB0aGVuIHNlbmQgbm93LgogCQkgKi8KLQkJaWYgKGxpbWl0ID4gdGNwX21heF9idXJzdCh0cCkgKiB0cC0+bXNzX2NhY2hlKQorCQlpZiAobGltaXQgPiB0Y3BfbWF4X3Rzb19kZWZlcnJlZF9tc3ModHApICogdHAtPm1zc19jYWNoZSkKIAkJCWdvdG8gc2VuZF9ub3c7CiAJfQogCkBAIC0xOTE5LDcgKzE5MjIsNyBAQAogCWlmIChmcmVlX3NwYWNlIDwgKGZ1bGxfc3BhY2UgPj4gMSkpIHsKIAkJaWNzay0+aWNza19hY2sucXVpY2sgPSAwOwogCi0JCWlmICh0Y3BfbWVtb3J5X3ByZXNzdXJlKQorCQlpZiAoc2tfdW5kZXJfbWVtb3J5X3ByZXNzdXJlKHNrKSkKIAkJCXRwLT5yY3Zfc3N0aHJlc2ggPSBtaW4odHAtPnJjdl9zc3RocmVzaCwKIAkJCQkJICAgICAgIDRVICogdHAtPmFkdm1zcyk7CiAKQEAgLTIxNDcsNyArMjE1MCwxNSBAQAogCSAqLwogCVRDUF9TS0JfQ0Ioc2tiKS0+d2hlbiA9IHRjcF90aW1lX3N0YW1wOwogCi0JZXJyID0gdGNwX3RyYW5zbWl0X3NrYihzaywgc2tiLCAxLCBHRlBfQVRPTUlDKTsKKwkvKiBtYWtlIHN1cmUgc2tiLT5kYXRhIGlzIGFsaWduZWQgb24gYXJjaGVzIHRoYXQgcmVxdWlyZSBpdCAqLworCWlmICh1bmxpa2VseShORVRfSVBfQUxJR04gJiYgKCh1bnNpZ25lZCBsb25nKXNrYi0+ZGF0YSAmIDMpKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiA9IF9fcHNrYl9jb3B5KHNrYiwgTUFYX1RDUF9IRUFERVIsCisJCQkJCQkgICBHRlBfQVRPTUlDKTsKKwkJZXJyID0gbnNrYiA/IHRjcF90cmFuc21pdF9za2Ioc2ssIG5za2IsIDAsIEdGUF9BVE9NSUMpIDoKKwkJCSAgICAgLUVOT0JVRlM7CisJfSBlbHNlIHsKKwkJZXJyID0gdGNwX3RyYW5zbWl0X3NrYihzaywgc2tiLCAxLCBHRlBfQVRPTUlDKTsKKwl9CiAKIAlpZiAoZXJyID09IDApIHsKIAkJLyogVXBkYXRlIGdsb2JhbCBUQ1Agc3RhdGlzdGljcy4gKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY0L3RjcF90aW1lci5jIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKaW5kZXggMmUwZjBhZi4uYTUxNmQxZSAxMDA2NDQKLS0tIGEvbmV0L2lwdjQvdGNwX3RpbWVyLmMKKysrIGIvbmV0L2lwdjQvdGNwX3RpbWVyLmMKQEAgLTE3MSwxMyArMTcxLDEzIEBACiB7CiAJc3RydWN0IGluZXRfY29ubmVjdGlvbl9zb2NrICppY3NrID0gaW5ldF9jc2soc2spOwogCWludCByZXRyeV91bnRpbDsKLQlib29sIGRvX3Jlc2V0LCBzeW5fc2V0ID0gMDsKKwlib29sIGRvX3Jlc2V0LCBzeW5fc2V0ID0gZmFsc2U7CiAKIAlpZiAoKDEgPDwgc2stPnNrX3N0YXRlKSAmIChUQ1BGX1NZTl9TRU5UIHwgVENQRl9TWU5fUkVDVikpIHsKIAkJaWYgKGljc2stPmljc2tfcmV0cmFuc21pdHMpCiAJCQlkc3RfbmVnYXRpdmVfYWR2aWNlKHNrKTsKIAkJcmV0cnlfdW50aWwgPSBpY3NrLT5pY3NrX3N5bl9yZXRyaWVzID8gOiBzeXNjdGxfdGNwX3N5bl9yZXRyaWVzOwotCQlzeW5fc2V0ID0gMTsKKwkJc3luX3NldCA9IHRydWU7CiAJfSBlbHNlIHsKIAkJaWYgKHJldHJhbnNtaXRzX3RpbWVkX291dChzaywgc3lzY3RsX3RjcF9yZXRyaWVzMSwgMCwgMCkpIHsKIAkJCS8qIEJsYWNrIGhvbGUgZGV0ZWN0aW9uICovCkBAIC0yNjEsNyArMjYxLDcgQEAKIAl9CiAKIG91dDoKLQlpZiAodGNwX21lbW9yeV9wcmVzc3VyZSkKKwlpZiAoc2tfdW5kZXJfbWVtb3J5X3ByZXNzdXJlKHNrKSkKIAkJc2tfbWVtX3JlY2xhaW0oc2spOwogb3V0X3VubG9jazoKIAliaF91bmxvY2tfc29jayhzayk7CkBAIC0zNDAsNyArMzQwLDcgQEAKIAkJCSAgICAgICAmaW5ldC0+aW5ldF9kYWRkciwgbnRvaHMoaW5ldC0+aW5ldF9kcG9ydCksCiAJCQkgICAgICAgaW5ldC0+aW5ldF9udW0sIHRwLT5zbmRfdW5hLCB0cC0+c25kX254dCk7CiAJCX0KLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCQllbHNlIGlmIChzay0+c2tfZmFtaWx5ID09IEFGX0lORVQ2KSB7CiAJCQlzdHJ1Y3QgaXB2Nl9waW5mbyAqbnAgPSBpbmV0Nl9zayhzayk7CiAJCQlMSU1JVF9ORVRERUJVRyhLRVJOX0RFQlVHICJUQ1A6IFBlZXIgJXBJNjoldS8ldSB1bmV4cGVjdGVkbHkgc2hydW5rIHdpbmRvdyAldToldSAocmVwYWlyZWQpXG4iLApkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdHVubmVsNC5jIGIvbmV0L2lwdjQvdHVubmVsNC5jCmluZGV4IGFjM2IzZWUuLjAxNzc1OTggMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3R1bm5lbDQuYworKysgYi9uZXQvaXB2NC90dW5uZWw0LmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCXJldHVybiAwOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0YXRpYyBpbnQgdHVubmVsNjRfcmN2KHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IHhmcm1fdHVubmVsICpoYW5kbGVyOwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJCQlicmVhazsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgdm9pZCB0dW5uZWw2NF9lcnIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIGluZm8pCiB7CiAJc3RydWN0IHhmcm1fdHVubmVsICpoYW5kbGVyOwpAQCAtMTUyLDcgKzE1Miw3IEBACiAJLm5ldG5zX29rCT0JMSwKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfcHJvdG9jb2wgdHVubmVsNjRfcHJvdG9jb2wgPSB7CiAJLmhhbmRsZXIJPQl0dW5uZWw2NF9yY3YsCiAJLmVycl9oYW5kbGVyCT0JdHVubmVsNjRfZXJyLApAQCAtMTY3LDcgKzE2Nyw3IEBACiAJCXByaW50ayhLRVJOX0VSUiAidHVubmVsNCBpbml0OiBjYW4ndCBhZGQgcHJvdG9jb2xcbiIpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlpZiAoaW5ldF9hZGRfcHJvdG9jb2woJnR1bm5lbDY0X3Byb3RvY29sLCBJUFBST1RPX0lQVjYpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAidHVubmVsNjQgaW5pdDogY2FuJ3QgYWRkIHByb3RvY29sXG4iKTsKIAkJaW5ldF9kZWxfcHJvdG9jb2woJnR1bm5lbDRfcHJvdG9jb2wsIElQUFJPVE9fSVBJUCk7CkBAIC0xNzksNyArMTc5LDcgQEAKIAogc3RhdGljIHZvaWQgX19leGl0IHR1bm5lbDRfZmluaSh2b2lkKQogewotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJaWYgKGluZXRfZGVsX3Byb3RvY29sKCZ0dW5uZWw2NF9wcm90b2NvbCwgSVBQUk9UT19JUFY2KSkKIAkJcHJpbnRrKEtFUk5fRVJSICJ0dW5uZWw2NCBjbG9zZTogY2FuJ3QgcmVtb3ZlIHByb3RvY29sXG4iKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwLmMgYi9uZXQvaXB2NC91ZHAuYwppbmRleCBhYjA5NjZkLi41ZDA3NWI1IDEwMDY0NAotLS0gYS9uZXQvaXB2NC91ZHAuYworKysgYi9uZXQvaXB2NC91ZHAuYwpAQCAtNDQ1LDcgKzQ0NSw3IEBACiAvKiBVRFAgaXMgbmVhcmx5IGFsd2F5cyB3aWxkY2FyZHMgb3V0IHRoZSB3YXpvbywgaXQgbWFrZXMgbm8gc2Vuc2UgdG8gdHJ5CiAgKiBoYXJkZXIgdGhhbiB0aGlzLiAtRGF2ZU0KICAqLwotc3RhdGljIHN0cnVjdCBzb2NrICpfX3VkcDRfbGliX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUzMiBzYWRkciwKK3N0cnVjdCBzb2NrICpfX3VkcDRfbGliX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIF9fYmUzMiBzYWRkciwKIAkJX19iZTE2IHNwb3J0LCBfX2JlMzIgZGFkZHIsIF9fYmUxNiBkcG9ydCwKIAkJaW50IGRpZiwgc3RydWN0IHVkcF90YWJsZSAqdWRwdGFibGUpCiB7CkBAIC01MTIsNiArNTEyLDcgQEAKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmVzdWx0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwoX191ZHA0X2xpYl9sb29rdXApOwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzb2NrICpfX3VkcDRfbGliX2xvb2t1cF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJCSBfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCwKQEAgLTExNjQsNyArMTE2NSw3IEBACiAJc3RydWN0IGluZXRfc29jayAqaW5ldCA9IGluZXRfc2soc2spOwogCXN0cnVjdCBzb2NrYWRkcl9pbiAqc2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKW1zZy0+bXNnX25hbWU7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBpbnQgdWxlbjsKKwl1bnNpZ25lZCBpbnQgdWxlbiwgY29waWVkOwogCWludCBwZWVrZWQ7CiAJaW50IGVycjsKIAlpbnQgaXNfdWRwbGl0ZSA9IElTX1VEUExJVEUoc2spOwpAQCAtMTE4Niw5ICsxMTg3LDEwIEBACiAJCWdvdG8gb3V0OwogCiAJdWxlbiA9IHNrYi0+bGVuIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpOwotCWlmIChsZW4gPiB1bGVuKQotCQlsZW4gPSB1bGVuOwotCWVsc2UgaWYgKGxlbiA8IHVsZW4pCisJY29waWVkID0gbGVuOworCWlmIChjb3BpZWQgPiB1bGVuKQorCQljb3BpZWQgPSB1bGVuOworCWVsc2UgaWYgKGNvcGllZCA8IHVsZW4pCiAJCW1zZy0+bXNnX2ZsYWdzIHw9IE1TR19UUlVOQzsKIAogCS8qCkBAIC0xMTk3LDE0ICsxMTk5LDE0IEBACiAJICogY292ZXJhZ2UgY2hlY2tzdW0gKFVEUC1MaXRlKSwgZG8gaXQgYmVmb3JlIHRoZSBjb3B5LgogCSAqLwogCi0JaWYgKGxlbiA8IHVsZW4gfHwgVURQX1NLQl9DQihza2IpLT5wYXJ0aWFsX2NvdikgeworCWlmIChjb3BpZWQgPCB1bGVuIHx8IFVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YpIHsKIAkJaWYgKHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJCWdvdG8gY3N1bV9jb3B5X2VycjsKIAl9CiAKIAlpZiAoc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSkKIAkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksCi0JCQkJCSAgICAgIG1zZy0+bXNnX2lvdiwgbGVuKTsKKwkJCQkJICAgICAgbXNnLT5tc2dfaW92LCBjb3BpZWQpOwogCWVsc2UgewogCQllcnIgPSBza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbV9pb3ZlYyhza2IsCiAJCQkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpLApAQCAtMTIzMyw3ICsxMjM1LDcgQEAKIAlpZiAoaW5ldC0+Y21zZ19mbGFncykKIAkJaXBfY21zZ19yZWN2KG1zZywgc2tiKTsKIAotCWVyciA9IGxlbjsKKwllcnIgPSBjb3BpZWQ7CiAJaWYgKGZsYWdzICYgTVNHX1RSVU5DKQogCQllcnIgPSB1bGVuOwogCkBAIC0xMzU3LDcgKzEzNTksNyBAQAogCWlmIChpbmV0X3NrKHNrKS0+aW5ldF9kYWRkcikKIAkJc29ja19ycHNfc2F2ZV9yeGhhc2goc2ssIHNrYik7CiAKLQlyYyA9IGlwX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CisJcmMgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CiAJaWYgKHJjIDwgMCkgewogCQlpbnQgaXNfdWRwbGl0ZSA9IElTX1VEUExJVEUoc2spOwogCkBAIC0xNDczLDYgKzE0NzUsNyBAQAogCiAJcmMgPSAwOwogCisJaXB2NF9wa3RpbmZvX3ByZXBhcmUoc2tiKTsKIAliaF9sb2NrX3NvY2soc2spOwogCWlmICghc29ja19vd25lZF9ieV91c2VyKHNrKSkKIAkJcmMgPSBfX3VkcF9xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpOwpAQCAtMjI0Niw3ICsyMjQ5LDggQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHNrX2J1ZmYgKnVkcDRfdWZvX2ZyYWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIHUzMiBmZWF0dXJlcykKK3N0cnVjdCBza19idWZmICp1ZHA0X3Vmb19mcmFnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBza19idWZmICpzZWdzID0gRVJSX1BUUigtRUlOVkFMKTsKIAl1bnNpZ25lZCBpbnQgbXNzOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjQvdWRwX2RpYWcuYyBiL25ldC9pcHY0L3VkcF9kaWFnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmOGE3YwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9pcHY0L3VkcF9kaWFnLmMKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiB1ZHBfZGlhZy5jCU1vZHVsZSBmb3IgbW9uaXRvcmluZyBVRFAgdHJhbnNwb3J0IHByb3RvY29scyBzb2NrZXRzLgorICoKKyAqIEF1dGhvcnM6CVBhdmVsIEVtZWx5YW5vdiwgPHhlbXVsQHBhcmFsbGVscy5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqICAgICAgMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0X2RpYWcuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxuZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0L3VkcGxpdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbmV0X2RpYWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NrX2RpYWcuaD4KKworc3RhdGljIGludCBza19kaWFnX2R1bXAoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQlzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsIHN0cnVjdCBpbmV0X2RpYWdfcmVxICpyZXEsCisJCXN0cnVjdCBubGF0dHIgKmJjKQoreworCWlmICghaW5ldF9kaWFnX2JjX3NrKGJjLCBzaykpCisJCXJldHVybiAwOworCisJcmV0dXJuIGluZXRfc2tfZGlhZ19maWxsKHNrLCBOVUxMLCBza2IsIHJlcSwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCisJCQljYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLCBjYi0+bmxoKTsKK30KKworc3RhdGljIGludCB1ZHBfZHVtcF9vbmUoc3RydWN0IHVkcF90YWJsZSAqdGJsLCBzdHJ1Y3Qgc2tfYnVmZiAqaW5fc2tiLAorCQljb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgc3RydWN0IGluZXRfZGlhZ19yZXEgKnJlcSkKK3sKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNrX2J1ZmYgKnJlcDsKKworCWlmIChyZXEtPnNkaWFnX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlzayA9IF9fdWRwNF9saWJfbG9va3VwKCZpbml0X25ldCwKKwkJCQlyZXEtPmlkLmlkaWFnX3NyY1swXSwgcmVxLT5pZC5pZGlhZ19zcG9ydCwKKwkJCQlyZXEtPmlkLmlkaWFnX2RzdFswXSwgcmVxLT5pZC5pZGlhZ19kcG9ydCwKKwkJCQlyZXEtPmlkLmlkaWFnX2lmLCB0YmwpOworI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCisJZWxzZSBpZiAocmVxLT5zZGlhZ19mYW1pbHkgPT0gQUZfSU5FVDYpCisJCXNrID0gX191ZHA2X2xpYl9sb29rdXAoJmluaXRfbmV0LAorCQkJCShzdHJ1Y3QgaW42X2FkZHIgKilyZXEtPmlkLmlkaWFnX3NyYywKKwkJCQlyZXEtPmlkLmlkaWFnX3Nwb3J0LAorCQkJCShzdHJ1Y3QgaW42X2FkZHIgKilyZXEtPmlkLmlkaWFnX2RzdCwKKwkJCQlyZXEtPmlkLmlkaWFnX2Rwb3J0LAorCQkJCXJlcS0+aWQuaWRpYWdfaWYsIHRibCk7CisjZW5kaWYKKwllbHNlCisJCWdvdG8gb3V0X25vc2s7CisKKwllcnIgPSAtRU5PRU5UOworCWlmIChzayA9PSBOVUxMKQorCQlnb3RvIG91dF9ub3NrOworCisJZXJyID0gc29ja19kaWFnX2NoZWNrX2Nvb2tpZShzaywgcmVxLT5pZC5pZGlhZ19jb29raWUpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCisJZXJyID0gLUVOT01FTTsKKwlyZXAgPSBhbGxvY19za2IoTkxNU0dfU1BBQ0UoKHNpemVvZihzdHJ1Y3QgaW5ldF9kaWFnX21zZykgKworCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBpbmV0X2RpYWdfbWVtaW5mbykgKworCQkJCSAgICAgNjQpKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXApCisJCWdvdG8gb3V0OworCisJZXJyID0gaW5ldF9za19kaWFnX2ZpbGwoc2ssIE5VTEwsIHJlcCwgcmVxLAorCQkJICAgTkVUTElOS19DQihpbl9za2IpLnBpZCwKKwkJCSAgIG5saC0+bmxtc2dfc2VxLCAwLCBubGgpOworCWlmIChlcnIgPCAwKSB7CisJCVdBUk5fT04oZXJyID09IC1FTVNHU0laRSk7CisJCWtmcmVlX3NrYihyZXApOworCQlnb3RvIG91dDsKKwl9CisJZXJyID0gbmV0bGlua191bmljYXN0KHNvY2tfZGlhZ19ubHNrLCByZXAsIE5FVExJTktfQ0IoaW5fc2tiKS5waWQsCisJCQkgICAgICBNU0dfRE9OVFdBSVQpOworCWlmIChlcnIgPiAwKQorCQllcnIgPSAwOworb3V0OgorCWlmIChzaykKKwkJc29ja19wdXQoc2spOworb3V0X25vc2s6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdWRwX2R1bXAoc3RydWN0IHVkcF90YWJsZSAqdGFibGUsIHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJc3RydWN0IGluZXRfZGlhZ19yZXEgKnIsIHN0cnVjdCBubGF0dHIgKmJjKQoreworCWludCBudW0sIHNfbnVtLCBzbG90LCBzX3Nsb3Q7CisKKwlzX3Nsb3QgPSBjYi0+YXJnc1swXTsKKwludW0gPSBzX251bSA9IGNiLT5hcmdzWzFdOworCisJZm9yIChzbG90ID0gc19zbG90OyBzbG90IDw9IHRhYmxlLT5tYXNrOyBudW0gPSBzX251bSA9IDAsIHNsb3QrKykgeworCQlzdHJ1Y3Qgc29jayAqc2s7CisJCXN0cnVjdCBobGlzdF9udWxsc19ub2RlICpub2RlOworCQlzdHJ1Y3QgdWRwX2hzbG90ICpoc2xvdCA9ICZ0YWJsZS0+aGFzaFtzbG90XTsKKworCQlpZiAoaGxpc3RfbnVsbHNfZW1wdHkoJmhzbG90LT5oZWFkKSkKKwkJCWNvbnRpbnVlOworCisJCXNwaW5fbG9ja19iaCgmaHNsb3QtPmxvY2spOworCQlza19udWxsc19mb3JfZWFjaChzaywgbm9kZSwgJmhzbG90LT5oZWFkKSB7CisJCQlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CisKKwkJCWlmIChudW0gPCBzX251bSkKKwkJCQlnb3RvIG5leHQ7CisJCQlpZiAoIShyLT5pZGlhZ19zdGF0ZXMgJiAoMSA8PCBzay0+c2tfc3RhdGUpKSkKKwkJCQlnb3RvIG5leHQ7CisJCQlpZiAoci0+c2RpYWdfZmFtaWx5ICE9IEFGX1VOU1BFQyAmJgorCQkJCQlzay0+c2tfZmFtaWx5ICE9IHItPnNkaWFnX2ZhbWlseSkKKwkJCQlnb3RvIG5leHQ7CisJCQlpZiAoci0+aWQuaWRpYWdfc3BvcnQgIT0gaW5ldC0+aW5ldF9zcG9ydCAmJgorCQkJICAgIHItPmlkLmlkaWFnX3Nwb3J0KQorCQkJCWdvdG8gbmV4dDsKKwkJCWlmIChyLT5pZC5pZGlhZ19kcG9ydCAhPSBpbmV0LT5pbmV0X2Rwb3J0ICYmCisJCQkgICAgci0+aWQuaWRpYWdfZHBvcnQpCisJCQkJZ290byBuZXh0OworCisJCQlpZiAoc2tfZGlhZ19kdW1wKHNrLCBza2IsIGNiLCByLCBiYykgPCAwKSB7CisJCQkJc3Bpbl91bmxvY2tfYmgoJmhzbG90LT5sb2NrKTsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CituZXh0OgorCQkJbnVtKys7CisJCX0KKwkJc3Bpbl91bmxvY2tfYmgoJmhzbG90LT5sb2NrKTsKKwl9Citkb25lOgorCWNiLT5hcmdzWzBdID0gc2xvdDsKKwljYi0+YXJnc1sxXSA9IG51bTsKK30KKworc3RhdGljIHZvaWQgdWRwX2RpYWdfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IsCisJCXN0cnVjdCBpbmV0X2RpYWdfcmVxICpyLCBzdHJ1Y3QgbmxhdHRyICpiYykKK3sKKwl1ZHBfZHVtcCgmdWRwX3RhYmxlLCBza2IsIGNiLCByLCBiYyk7Cit9CisKK3N0YXRpYyBpbnQgdWRwX2RpYWdfZHVtcF9vbmUoc3RydWN0IHNrX2J1ZmYgKmluX3NrYiwgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCXN0cnVjdCBpbmV0X2RpYWdfcmVxICpyZXEpCit7CisJcmV0dXJuIHVkcF9kdW1wX29uZSgmdWRwX3RhYmxlLCBpbl9za2IsIG5saCwgcmVxKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbmV0X2RpYWdfaGFuZGxlciB1ZHBfZGlhZ19oYW5kbGVyID0geworCS5kdW1wCQkgPSB1ZHBfZGlhZ19kdW1wLAorCS5kdW1wX29uZQkgPSB1ZHBfZGlhZ19kdW1wX29uZSwKKwkuaWRpYWdfdHlwZQkgPSBJUFBST1RPX1VEUCwKK307CisKK3N0YXRpYyB2b2lkIHVkcGxpdGVfZGlhZ19kdW1wKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRsaW5rX2NhbGxiYWNrICpjYiwKKwkJc3RydWN0IGluZXRfZGlhZ19yZXEgKnIsIHN0cnVjdCBubGF0dHIgKmJjKQoreworCXVkcF9kdW1wKCZ1ZHBsaXRlX3RhYmxlLCBza2IsIGNiLCByLCBiYyk7Cit9CisKK3N0YXRpYyBpbnQgdWRwbGl0ZV9kaWFnX2R1bXBfb25lKHN0cnVjdCBza19idWZmICppbl9za2IsIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLAorCQlzdHJ1Y3QgaW5ldF9kaWFnX3JlcSAqcmVxKQoreworCXJldHVybiB1ZHBfZHVtcF9vbmUoJnVkcGxpdGVfdGFibGUsIGluX3NrYiwgbmxoLCByZXEpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGluZXRfZGlhZ19oYW5kbGVyIHVkcGxpdGVfZGlhZ19oYW5kbGVyID0geworCS5kdW1wCQkgPSB1ZHBsaXRlX2RpYWdfZHVtcCwKKwkuZHVtcF9vbmUJID0gdWRwbGl0ZV9kaWFnX2R1bXBfb25lLAorCS5pZGlhZ190eXBlCSA9IElQUFJPVE9fVURQTElURSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHVkcF9kaWFnX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJZXJyID0gaW5ldF9kaWFnX3JlZ2lzdGVyKCZ1ZHBfZGlhZ19oYW5kbGVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKwllcnIgPSBpbmV0X2RpYWdfcmVnaXN0ZXIoJnVkcGxpdGVfZGlhZ19oYW5kbGVyKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9saXRlOworb3V0OgorCXJldHVybiBlcnI7CitvdXRfbGl0ZToKKwlpbmV0X2RpYWdfdW5yZWdpc3RlcigmdWRwX2RpYWdfaGFuZGxlcik7CisJZ290byBvdXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1ZHBfZGlhZ19leGl0KHZvaWQpCit7CisJaW5ldF9kaWFnX3VucmVnaXN0ZXIoJnVkcGxpdGVfZGlhZ19oYW5kbGVyKTsKKwlpbmV0X2RpYWdfdW5yZWdpc3RlcigmdWRwX2RpYWdfaGFuZGxlcik7Cit9CisKK21vZHVsZV9pbml0KHVkcF9kaWFnX2luaXQpOworbW9kdWxlX2V4aXQodWRwX2RpYWdfZXhpdCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVNfTkVUX1BGX1BST1RPX1RZUEUoUEZfTkVUTElOSywgTkVUTElOS19TT0NLX0RJQUcsIDItMTcgLyogQUZfSU5FVCAtIElQUFJPVE9fVURQICovKTsKK01PRFVMRV9BTElBU19ORVRfUEZfUFJPVE9fVFlQRShQRl9ORVRMSU5LLCBORVRMSU5LX1NPQ0tfRElBRywgMi0xMzYgLyogQUZfSU5FVCAtIElQUFJPVE9fVURQTElURSAqLyk7CmRpZmYgLS1naXQgYS9uZXQvaXB2NC94ZnJtNF90dW5uZWwuYyBiL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jCmluZGV4IDgyODA2NDUuLjkyNDdkOWQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jCisrKyBiL25ldC9pcHY0L3hmcm00X3R1bm5lbC5jCkBAIC02NCw3ICs2NCw3IEBACiAJLnByaW9yaXR5CT0JMiwKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIHN0cnVjdCB4ZnJtX3R1bm5lbCB4ZnJtNjRfdHVubmVsX2hhbmRsZXIgX19yZWFkX21vc3RseSA9IHsKIAkuaGFuZGxlcgk9CXhmcm1fdHVubmVsX3JjdiwKIAkuZXJyX2hhbmRsZXIJPQl4ZnJtX3R1bm5lbF9lcnIsCkBAIC04NCw3ICs4NCw3IEBACiAJCXhmcm1fdW5yZWdpc3Rlcl90eXBlKCZpcGlwX3R5cGUsIEFGX0lORVQpOwogCQlyZXR1cm4gLUVBR0FJTjsKIAl9Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlpZiAoeGZybTRfdHVubmVsX3JlZ2lzdGVyKCZ4ZnJtNjRfdHVubmVsX2hhbmRsZXIsIEFGX0lORVQ2KSkgewogCQlwcmludGsoS0VSTl9JTkZPICJpcGlwIGluaXQ6IGNhbid0IGFkZCB4ZnJtIGhhbmRsZXIgZm9yIEFGX0lORVQ2XG4iKTsKIAkJeGZybTRfdHVubmVsX2RlcmVnaXN0ZXIoJnhmcm1fdHVubmVsX2hhbmRsZXIsIEFGX0lORVQpOwpAQCAtOTcsNyArOTcsNyBAQAogCiBzdGF0aWMgdm9pZCBfX2V4aXQgaXBpcF9maW5pKHZvaWQpCiB7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlpZiAoeGZybTRfdHVubmVsX2RlcmVnaXN0ZXIoJnhmcm02NF90dW5uZWxfaGFuZGxlciwgQUZfSU5FVDYpKQogCQlwcmludGsoS0VSTl9JTkZPICJpcGlwIGNsb3NlOiBjYW4ndCByZW1vdmUgeGZybSBoYW5kbGVyIGZvciBBRl9JTkVUNlxuIik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FkZHJjb25mLmMgYi9uZXQvaXB2Ni9hZGRyY29uZi5jCmluZGV4IGNmODhkZjguLjBiYTA4NjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2FkZHJjb25mLmMKKysrIGIvbmV0L2lwdjYvYWRkcmNvbmYuYwpAQCAtNjMwLDEzICs2MzAsMTMgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcnQgPSBhZGRyY29uZl9kc3RfYWxsb2MoaWRldiwgYWRkciwgMCk7CisJcnQgPSBhZGRyY29uZl9kc3RfYWxsb2MoaWRldiwgYWRkciwgZmFsc2UpOwogCWlmIChJU19FUlIocnQpKSB7CiAJCWVyciA9IFBUUl9FUlIocnQpOwogCQlnb3RvIG91dDsKIAl9CiAKLQlpcHY2X2FkZHJfY29weSgmaWZhLT5hZGRyLCBhZGRyKTsKKwlpZmEtPmFkZHIgPSAqYWRkcjsKIAogCXNwaW5fbG9ja19pbml0KCZpZmEtPmxvY2spOwogCXNwaW5fbG9ja19pbml0KCZpZmEtPnN0YXRlX2xvY2spOwpAQCAtNjUwLDE2ICs2NTAsNiBAQAogCiAJaWZhLT5ydCA9IHJ0OwogCi0JLyoKLQkgKiBwYXJ0IG9uZSBvZiBSRkMgNDQyOSwgc2VjdGlvbiAzLjMKLQkgKiBXZSBzaG91bGQgbm90IGNvbmZpZ3VyZSBhbiBhZGRyZXNzIGFzCi0JICogb3B0aW1pc3RpYyBpZiB3ZSBkbyBub3QgeWV0IGtub3cgdGhlIGxpbmsKLQkgKiBsYXllciBhZGRyZXNzIG9mIG91ciBuZXhob3Agcm91dGVyCi0JICovCi0KLQlpZiAoZHN0X2dldF9uZWlnaGJvdXJfcmF3KCZydC0+ZHN0KSA9PSBOVUxMKQotCQlpZmEtPmZsYWdzICY9IH5JRkFfRl9PUFRJTUlTVElDOwotCiAJaWZhLT5pZGV2ID0gaWRldjsKIAlpbjZfZGV2X2hvbGQoaWRldik7CiAJLyogRm9yIGNhbGxlciAqLwpAQCAtODA3LDcgKzc5Nyw3IEBACiAJCQkJaXA2X2RlbF9ydChydCk7CiAJCQkJcnQgPSBOVUxMOwogCQkJfSBlbHNlIGlmICghKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0VYUElSRVMpKSB7Ci0JCQkJcnQtPnJ0NmlfZXhwaXJlcyA9IGV4cGlyZXM7CisJCQkJcnQtPmRzdC5leHBpcmVzID0gZXhwaXJlczsKIAkJCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfRVhQSVJFUzsKIAkJCX0KIAkJfQpAQCAtMTIyOCw3ICsxMjE4LDcgQEAKIAlpZiAoIWhpc2NvcmUtPmlmYSkKIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOwogCi0JaXB2Nl9hZGRyX2NvcHkoc2FkZHIsICZoaXNjb3JlLT5pZmEtPmFkZHIpOworCSpzYWRkciA9IGhpc2NvcmUtPmlmYS0+YWRkcjsKIAlpbjZfaWZhX3B1dChoaXNjb3JlLT5pZmEpOwogCXJldHVybiAwOwogfQpAQCAtMTI0OSw3ICsxMjM5LDcgQEAKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShpZnAsICZpZGV2LT5hZGRyX2xpc3QsIGlmX2xpc3QpIHsKIAkJCWlmIChpZnAtPnNjb3BlID09IElGQV9MSU5LICYmCiAJCQkgICAgIShpZnAtPmZsYWdzICYgYmFubmVkX2ZsYWdzKSkgewotCQkJCWlwdjZfYWRkcl9jb3B5KGFkZHIsICZpZnAtPmFkZHIpOworCQkJCSphZGRyID0gaWZwLT5hZGRyOwogCQkJCWVyciA9IDA7CiAJCQkJYnJlYWs7CiAJCQl9CkBAIC0xNzAwLDcgKzE2OTAsNyBAQAogCQkuZmNfcHJvdG9jb2wgPSBSVFBST1RfS0VSTkVMLAogCX07CiAKLQlpcHY2X2FkZHJfY29weSgmY2ZnLmZjX2RzdCwgcGZ4KTsKKwljZmcuZmNfZHN0ID0gKnBmeDsKIAogCS8qIFByZXZlbnQgdXNlbGVzcyBjbG9uaW5nIG9uIFB0UCBTSVQuCiAJICAgVGhpcyB0aGluZyBpcyBkb25lIGhlcmUgZXhwZWN0aW5nIHRoYXQgdGhlIHdob2xlCkBAIC0xNzMzLDcgKzE3MjMsNyBAQAogCWlmICghZm4pCiAJCWdvdG8gb3V0OwogCWZvciAocnQgPSBmbi0+bGVhZjsgcnQ7IHJ0ID0gcnQtPmRzdC5ydDZfbmV4dCkgewotCQlpZiAocnQtPnJ0NmlfZGV2LT5pZmluZGV4ICE9IGRldi0+aWZpbmRleCkKKwkJaWYgKHJ0LT5kc3QuZGV2LT5pZmluZGV4ICE9IGRldi0+aWZpbmRleCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKHJ0LT5ydDZpX2ZsYWdzICYgZmxhZ3MpICE9IGZsYWdzKQogCQkJY29udGludWU7CkBAIC0xODA1LDE0ICsxNzk1LDE1IEBACiAJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOwogCiAJLyogQWRkIGRlZmF1bHQgbXVsdGljYXN0IHJvdXRlICovCi0JYWRkcmNvbmZfYWRkX21yb3V0ZShkZXYpOworCWlmICghKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKQorCQlhZGRyY29uZl9hZGRfbXJvdXRlKGRldik7CiAKIAkvKiBBZGQgbGluayBsb2NhbCByb3V0ZSAqLwogCWFkZHJjb25mX2FkZF9scm91dGUoZGV2KTsKIAlyZXR1cm4gaWRldjsKIH0KIAotdm9pZCBhZGRyY29uZl9wcmVmaXhfcmN2KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHU4ICpvcHQsIGludCBsZW4pCit2b2lkIGFkZHJjb25mX3ByZWZpeF9yY3Yoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggKm9wdCwgaW50IGxlbiwgYm9vbCBzbGxhbykKIHsKIAlzdHJ1Y3QgcHJlZml4X2luZm8gKnBpbmZvOwogCV9fdTMyIHZhbGlkX2xmdDsKQEAgLTE4OTAsMTEgKzE4ODEsMTEgQEAKIAkJCQlydCA9IE5VTEw7CiAJCQl9IGVsc2UgaWYgKGFkZHJjb25mX2Zpbml0ZV90aW1lb3V0KHJ0X2V4cGlyZXMpKSB7CiAJCQkJLyogbm90IGluZmluaXR5ICovCi0JCQkJcnQtPnJ0NmlfZXhwaXJlcyA9IGppZmZpZXMgKyBydF9leHBpcmVzOworCQkJCXJ0LT5kc3QuZXhwaXJlcyA9IGppZmZpZXMgKyBydF9leHBpcmVzOwogCQkJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9FWFBJUkVTOwogCQkJfSBlbHNlIHsKIAkJCQlydC0+cnQ2aV9mbGFncyAmPSB+UlRGX0VYUElSRVM7Ci0JCQkJcnQtPnJ0NmlfZXhwaXJlcyA9IDA7CisJCQkJcnQtPmRzdC5leHBpcmVzID0gMDsKIAkJCX0KIAkJfSBlbHNlIGlmICh2YWxpZF9sZnQpIHsKIAkJCWNsb2NrX3QgZXhwaXJlcyA9IDA7CkBAIC0xOTQzLDcgKzE5MzQsNyBAQAogCiAjaWZkZWYgQ09ORklHX0lQVjZfT1BUSU1JU1RJQ19EQUQKIAkJCWlmIChpbjZfZGV2LT5jbmYub3B0aW1pc3RpY19kYWQgJiYKLQkJCSAgICAhbmV0LT5pcHY2LmRldmNvbmZfYWxsLT5mb3J3YXJkaW5nKQorCQkJICAgICFuZXQtPmlwdjYuZGV2Y29uZl9hbGwtPmZvcndhcmRpbmcgJiYgc2xsYW8pCiAJCQkJYWRkcl9mbGFncyA9IElGQV9GX09QVElNSVNUSUM7CiAjZW5kaWYKIApAQCAtMzA3NywyMCArMzA2OCwzOSBAQAogc3RydWN0IGlmNl9pdGVyX3N0YXRlIHsKIAlzdHJ1Y3Qgc2VxX25ldF9wcml2YXRlIHA7CiAJaW50IGJ1Y2tldDsKKwlpbnQgb2Zmc2V0OwogfTsKIAotc3RhdGljIHN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmNl9nZXRfZmlyc3Qoc3RydWN0IHNlcV9maWxlICpzZXEpCitzdGF0aWMgc3RydWN0IGluZXQ2X2lmYWRkciAqaWY2X2dldF9maXJzdChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90IHBvcykKIHsKIAlzdHJ1Y3QgaW5ldDZfaWZhZGRyICppZmEgPSBOVUxMOwogCXN0cnVjdCBpZjZfaXRlcl9zdGF0ZSAqc3RhdGUgPSBzZXEtPnByaXZhdGU7CiAJc3RydWN0IG5ldCAqbmV0ID0gc2VxX2ZpbGVfbmV0KHNlcSk7CisJaW50IHAgPSAwOwogCi0JZm9yIChzdGF0ZS0+YnVja2V0ID0gMDsgc3RhdGUtPmJ1Y2tldCA8IElONl9BRERSX0hTSVpFOyArK3N0YXRlLT5idWNrZXQpIHsKKwkvKiBpbml0aWFsIGJ1Y2tldCBpZiBwb3MgaXMgMCAqLworCWlmIChwb3MgPT0gMCkgeworCQlzdGF0ZS0+YnVja2V0ID0gMDsKKwkJc3RhdGUtPm9mZnNldCA9IDA7CisJfQorCisJZm9yICg7IHN0YXRlLT5idWNrZXQgPCBJTjZfQUREUl9IU0laRTsgKytzdGF0ZS0+YnVja2V0KSB7CiAJCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3VfYmgoaWZhLCBuLCAmaW5ldDZfYWRkcl9sc3Rbc3RhdGUtPmJ1Y2tldF0sCi0JCQkJCSBhZGRyX2xzdCkKKwkJCQkJIGFkZHJfbHN0KSB7CisJCQkvKiBzeW5jIHdpdGggb2Zmc2V0ICovCisJCQlpZiAocCA8IHN0YXRlLT5vZmZzZXQpIHsKKwkJCQlwKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlzdGF0ZS0+b2Zmc2V0Kys7CiAJCQlpZiAobmV0X2VxKGRldl9uZXQoaWZhLT5pZGV2LT5kZXYpLCBuZXQpKQogCQkJCXJldHVybiBpZmE7CisJCX0KKworCQkvKiBwcmVwYXJlIGZvciBuZXh0IGJ1Y2tldCAqLworCQlzdGF0ZS0+b2Zmc2V0ID0gMDsKKwkJcCA9IDA7CiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtMzEwMiwxMyArMzExMiwxNyBAQAogCXN0cnVjdCBuZXQgKm5ldCA9IHNlcV9maWxlX25ldChzZXEpOwogCXN0cnVjdCBobGlzdF9ub2RlICpuID0gJmlmYS0+YWRkcl9sc3Q7CiAKLQlobGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZV9yY3VfYmgoaWZhLCBuLCBhZGRyX2xzdCkKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZV9yY3VfYmgoaWZhLCBuLCBhZGRyX2xzdCkgeworCQlzdGF0ZS0+b2Zmc2V0Kys7CiAJCWlmIChuZXRfZXEoZGV2X25ldChpZmEtPmlkZXYtPmRldiksIG5ldCkpCiAJCQlyZXR1cm4gaWZhOworCX0KIAogCXdoaWxlICgrK3N0YXRlLT5idWNrZXQgPCBJTjZfQUREUl9IU0laRSkgeworCQlzdGF0ZS0+b2Zmc2V0ID0gMDsKIAkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1X2JoKGlmYSwgbiwKIAkJCQkgICAgICZpbmV0Nl9hZGRyX2xzdFtzdGF0ZS0+YnVja2V0XSwgYWRkcl9sc3QpIHsKKwkJCXN0YXRlLT5vZmZzZXQrKzsKIAkJCWlmIChuZXRfZXEoZGV2X25ldChpZmEtPmlkZXYtPmRldiksIG5ldCkpCiAJCQkJcmV0dXJuIGlmYTsKIAkJfQpAQCAtMzExNywyMSArMzEzMSwxMSBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGluZXQ2X2lmYWRkciAqaWY2X2dldF9pZHgoc3RydWN0IHNlcV9maWxlICpzZXEsIGxvZmZfdCBwb3MpCi17Ci0Jc3RydWN0IGluZXQ2X2lmYWRkciAqaWZhID0gaWY2X2dldF9maXJzdChzZXEpOwotCi0JaWYgKGlmYSkKLQkJd2hpbGUgKHBvcyAmJiAoaWZhID0gaWY2X2dldF9uZXh0KHNlcSwgaWZhKSkgIT0gTlVMTCkKLQkJCS0tcG9zOwotCXJldHVybiBwb3MgPyBOVUxMIDogaWZhOwotfQotCiBzdGF0aWMgdm9pZCAqaWY2X3NlcV9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgbG9mZl90ICpwb3MpCiAJX19hY3F1aXJlcyhyY3VfYmgpCiB7CiAJcmN1X3JlYWRfbG9ja19iaCgpOwotCXJldHVybiBpZjZfZ2V0X2lkeChzZXEsICpwb3MpOworCXJldHVybiBpZjZfZ2V0X2ZpcnN0KHNlcSwgKnBvcyk7CiB9CiAKIHN0YXRpYyB2b2lkICppZjZfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKnYsIGxvZmZfdCAqcG9zKQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvYWZfaW5ldDYuYyBiL25ldC9pcHY2L2FmX2luZXQ2LmMKaW5kZXggZDI3Yzc5Ny4uMjczZjQ4ZCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWZfaW5ldDYuYworKysgYi9uZXQvaXB2Ni9hZl9pbmV0Ni5jCkBAIC0zNDcsNyArMzQ3LDcgQEAKIAkJCSAqLwogCQkJdjRhZGRyID0gTE9PUEJBQ0s0X0lQVjY7CiAJCQlpZiAoIShhZGRyX3R5cGUgJiBJUFY2X0FERFJfTVVMVElDQVNUKSkJewotCQkJCWlmICghaW5ldC0+dHJhbnNwYXJlbnQgJiYKKwkJCQlpZiAoIShpbmV0LT5mcmVlYmluZCB8fCBpbmV0LT50cmFuc3BhcmVudCkgJiYKIAkJCQkgICAgIWlwdjZfY2hrX2FkZHIobmV0LCAmYWRkci0+c2luNl9hZGRyLAogCQkJCQkJICAgZGV2LCAwKSkgewogCQkJCQllcnIgPSAtRUFERFJOT1RBVkFJTDsKQEAgLTM2MSwxMCArMzYxLDEwIEBACiAJaW5ldC0+aW5ldF9yY3Zfc2FkZHIgPSB2NGFkZHI7CiAJaW5ldC0+aW5ldF9zYWRkciA9IHY0YWRkcjsKIAotCWlwdjZfYWRkcl9jb3B5KCZucC0+cmN2X3NhZGRyLCAmYWRkci0+c2luNl9hZGRyKTsKKwlucC0+cmN2X3NhZGRyID0gYWRkci0+c2luNl9hZGRyOwogCiAJaWYgKCEoYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkpCi0JCWlwdjZfYWRkcl9jb3B5KCZucC0+c2FkZHIsICZhZGRyLT5zaW42X2FkZHIpOworCQlucC0+c2FkZHIgPSBhZGRyLT5zaW42X2FkZHI7CiAKIAkvKiBNYWtlIHN1cmUgd2UgYXJlIGFsbG93ZWQgdG8gYmluZCBoZXJlLiAqLwogCWlmIChzay0+c2tfcHJvdC0+Z2V0X3BvcnQoc2ssIHNudW0pKSB7CkBAIC00NTgsMTQgKzQ1OCwxNCBAQAogCQkgICAgcGVlciA9PSAxKQogCQkJcmV0dXJuIC1FTk9UQ09OTjsKIAkJc2luLT5zaW42X3BvcnQgPSBpbmV0LT5pbmV0X2Rwb3J0OwotCQlpcHY2X2FkZHJfY29weSgmc2luLT5zaW42X2FkZHIsICZucC0+ZGFkZHIpOworCQlzaW4tPnNpbjZfYWRkciA9IG5wLT5kYWRkcjsKIAkJaWYgKG5wLT5zbmRmbG93KQogCQkJc2luLT5zaW42X2Zsb3dpbmZvID0gbnAtPmZsb3dfbGFiZWw7CiAJfSBlbHNlIHsKIAkJaWYgKGlwdjZfYWRkcl9hbnkoJm5wLT5yY3Zfc2FkZHIpKQotCQkJaXB2Nl9hZGRyX2NvcHkoJnNpbi0+c2luNl9hZGRyLCAmbnAtPnNhZGRyKTsKKwkJCXNpbi0+c2luNl9hZGRyID0gbnAtPnNhZGRyOwogCQllbHNlCi0JCQlpcHY2X2FkZHJfY29weSgmc2luLT5zaW42X2FkZHIsICZucC0+cmN2X3NhZGRyKTsKKwkJCXNpbi0+c2luNl9hZGRyID0gbnAtPnJjdl9zYWRkcjsKIAogCQlzaW4tPnNpbjZfcG9ydCA9IGluZXQtPmluZXRfc3BvcnQ7CiAJfQpAQCAtNjYwLDggKzY2MCw4IEBACiAKIAkJbWVtc2V0KCZmbDYsIDAsIHNpemVvZihmbDYpKTsKIAkJZmw2LmZsb3dpNl9wcm90byA9IHNrLT5za19wcm90b2NvbDsKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgJm5wLT5kYWRkcik7Ci0JCWlwdjZfYWRkcl9jb3B5KCZmbDYuc2FkZHIsICZucC0+c2FkZHIpOworCQlmbDYuZGFkZHIgPSBucC0+ZGFkZHI7CisJCWZsNi5zYWRkciA9IG5wLT5zYWRkcjsKIAkJZmw2LmZsb3dsYWJlbCA9IG5wLT5mbG93X2xhYmVsOwogCQlmbDYuZmxvd2k2X29pZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7CiAJCWZsNi5mbG93aTZfbWFyayA9IHNrLT5za19tYXJrOwpAQCAtNzY5LDcgKzc2OSw4IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIHN0cnVjdCBza19idWZmICppcHY2X2dzb19zZWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqaXB2Nl9nc29fc2VnbWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCW5ldGRldl9mZWF0dXJlc190IGZlYXR1cmVzKQogewogCXN0cnVjdCBza19idWZmICpzZWdzID0gRVJSX1BUUigtRUlOVkFMKTsKIAlzdHJ1Y3QgaXB2NmhkciAqaXB2Nmg7CkBAIC05ODUsOSArOTg2LDkgQEAKIAkJCSAgc2l6ZW9mKHN0cnVjdCBpY21wdjZfbWliKSwKIAkJCSAgX19hbGlnbm9mX18oc3RydWN0IGljbXB2Nl9taWIpKSA8IDApCiAJCWdvdG8gZXJyX2ljbXBfbWliOwotCWlmIChzbm1wX21pYl9pbml0KCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXB2Nm1zZ19zdGF0aXN0aWNzLAotCQkJICBzaXplb2Yoc3RydWN0IGljbXB2Nm1zZ19taWIpLAotCQkJICBfX2FsaWdub2ZfXyhzdHJ1Y3QgaWNtcHY2bXNnX21pYikpIDwgMCkKKwluZXQtPm1pYi5pY21wdjZtc2dfc3RhdGlzdGljcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpY21wdjZtc2dfbWliKSwKKwkJCQkJCUdGUF9LRVJORUwpOworCWlmICghbmV0LT5taWIuaWNtcHY2bXNnX3N0YXRpc3RpY3MpCiAJCWdvdG8gZXJyX2ljbXBtc2dfbWliOwogCXJldHVybiAwOwogCkBAIC0xMDA4LDcgKzEwMDksNyBAQAogCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwbGl0ZV9zdGF0c19pbjYpOwogCXNubXBfbWliX2ZyZWUoKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIuaXB2Nl9zdGF0aXN0aWNzKTsKIAlzbm1wX21pYl9mcmVlKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXB2Nl9zdGF0aXN0aWNzKTsKLQlzbm1wX21pYl9mcmVlKCh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXB2Nm1zZ19zdGF0aXN0aWNzKTsKKwlrZnJlZShuZXQtPm1pYi5pY21wdjZtc2dfc3RhdGlzdGljcyk7CiB9CiAKIHN0YXRpYyBpbnQgX19uZXRfaW5pdCBpbmV0Nl9uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCkBAIC0xMTE1LDYgKzExMTYsOCBAQAogCWlmIChlcnIpCiAJCWdvdG8gc3RhdGljX3N5c2N0bF9mYWlsOwogI2VuZGlmCisJdGNwdjZfcHJvdC5zeXNjdGxfbWVtID0gaW5pdF9uZXQuaXB2NC5zeXNjdGxfdGNwX21lbTsKKwogCS8qCiAJICoJaXBuZ3dnIEFQSSBkcmFmdCBtYWtlcyBjbGVhciB0aGF0IHRoZSBjb3JyZWN0IHNlbWFudGljcwogCSAqCWZvciBUQ1AgYW5kIFVEUCBpcyB0byBjb25zaWRlciBvbmUgVENQIGFuZCBVRFAgaW5zdGFuY2UKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FoNi5jIGIvbmV0L2lwdjYvYWg2LmMKaW5kZXggNGMwZjg5NC4uMmFlNzlkYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvYWg2LmMKKysrIGIvbmV0L2lwdjYvYWg2LmMKQEAgLTE5Myw5ICsxOTMsOSBAQAogCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiZGVzdG9wdCBoYW86IGludmFsaWQgaGVhZGVyIGxlbmd0aDogJXVcbiIsIGhhby0+bGVuZ3RoKTsKIAkJCQkJZ290byBiYWQ7CiAJCQkJfQotCQkJCWlwdjZfYWRkcl9jb3B5KCZmaW5hbF9hZGRyLCAmaGFvLT5hZGRyKTsKLQkJCQlpcHY2X2FkZHJfY29weSgmaGFvLT5hZGRyLCAmaXBoLT5zYWRkcik7Ci0JCQkJaXB2Nl9hZGRyX2NvcHkoJmlwaC0+c2FkZHIsICZmaW5hbF9hZGRyKTsKKwkJCQlmaW5hbF9hZGRyID0gaGFvLT5hZGRyOworCQkJCWhhby0+YWRkciA9IGlwaC0+c2FkZHI7CisJCQkJaXBoLT5zYWRkciA9IGZpbmFsX2FkZHI7CiAJCQl9CiAJCQlicmVhazsKIAkJfQpAQCAtMjQxLDEzICsyNDEsMTMgQEAKIAlzZWdtZW50cyA9IHJ0aGRyLT5oZHJsZW4gPj4gMTsKIAogCWFkZHJzID0gKChzdHJ1Y3QgcnQwX2hkciAqKXJ0aGRyKS0+YWRkcjsKLQlpcHY2X2FkZHJfY29weSgmZmluYWxfYWRkciwgYWRkcnMgKyBzZWdtZW50cyAtIDEpOworCWZpbmFsX2FkZHIgPSBhZGRyc1tzZWdtZW50cyAtIDFdOwogCiAJYWRkcnMgKz0gc2VnbWVudHMgLSBzZWdtZW50c19sZWZ0OwogCW1lbW1vdmUoYWRkcnMgKyAxLCBhZGRycywgKHNlZ21lbnRzX2xlZnQgLSAxKSAqIHNpemVvZigqYWRkcnMpKTsKIAotCWlwdjZfYWRkcl9jb3B5KGFkZHJzLCAmaXBoLT5kYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwaC0+ZGFkZHIsICZmaW5hbF9hZGRyKTsKKwlhZGRyc1swXSA9IGlwaC0+ZGFkZHI7CisJaXBoLT5kYWRkciA9IGZpbmFsX2FkZHI7CiB9CiAKIHN0YXRpYyBpbnQgaXB2Nl9jbGVhcl9tdXRhYmxlX29wdGlvbnMoc3RydWN0IGlwdjZoZHIgKmlwaCwgaW50IGxlbiwgaW50IGRpcikKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2FueWNhc3QuYyBiL25ldC9pcHY2L2FueWNhc3QuYwppbmRleCA2NzQyNTVmLi41OTQwMmI0IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9hbnljYXN0LmMKKysrIGIvbmV0L2lwdjYvYW55Y2FzdC5jCkBAIC03NSw3ICs3NSw3IEBACiAJaWYgKHBhYyA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAlwYWMtPmFjbF9uZXh0ID0gTlVMTDsKLQlpcHY2X2FkZHJfY29weSgmcGFjLT5hY2xfYWRkciwgYWRkcik7CisJcGFjLT5hY2xfYWRkciA9ICphZGRyOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWlmIChpZmluZGV4ID09IDApIHsKQEAgLTgzLDcgKzgzLDcgQEAKIAogCQlydCA9IHJ0Nl9sb29rdXAobmV0LCBhZGRyLCBOVUxMLCAwLCAwKTsKIAkJaWYgKHJ0KSB7Ci0JCQlkZXYgPSBydC0+cnQ2aV9kZXY7CisJCQlkZXYgPSBydC0+ZHN0LmRldjsKIAkJCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKIAkJfSBlbHNlIGlmIChpc2hvc3QpIHsKIAkJCWVyciA9IC1FQUREUk5PVEFWQUlMOwpAQCAtMjg5LDE0ICsyODksMTQgQEAKIAkJZ290byBvdXQ7CiAJfQogCi0JcnQgPSBhZGRyY29uZl9kc3RfYWxsb2MoaWRldiwgYWRkciwgMSk7CisJcnQgPSBhZGRyY29uZl9kc3RfYWxsb2MoaWRldiwgYWRkciwgdHJ1ZSk7CiAJaWYgKElTX0VSUihydCkpIHsKIAkJa2ZyZWUoYWNhKTsKIAkJZXJyID0gUFRSX0VSUihydCk7CiAJCWdvdG8gb3V0OwogCX0KIAotCWlwdjZfYWRkcl9jb3B5KCZhY2EtPmFjYV9hZGRyLCBhZGRyKTsKKwlhY2EtPmFjYV9hZGRyID0gKmFkZHI7CiAJYWNhLT5hY2FfaWRldiA9IGlkZXY7CiAJYWNhLT5hY2FfcnQgPSBydDsKIAlhY2EtPmFjYV91c2VycyA9IDE7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9kYXRhZ3JhbS5jIGIvbmV0L2lwdjYvZGF0YWdyYW0uYwppbmRleCBlMjQ4MDY5Li5hZTA4YWVlIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9kYXRhZ3JhbS5jCisrKyBiL25ldC9pcHY2L2RhdGFncmFtLmMKQEAgLTcxLDcgKzcxLDcgQEAKIAkJCWZsb3dsYWJlbCA9IGZsNl9zb2NrX2xvb2t1cChzaywgZmw2LmZsb3dsYWJlbCk7CiAJCQlpZiAoZmxvd2xhYmVsID09IE5VTEwpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpcHY2X2FkZHJfY29weSgmdXNpbi0+c2luNl9hZGRyLCAmZmxvd2xhYmVsLT5kc3QpOworCQkJdXNpbi0+c2luNl9hZGRyID0gZmxvd2xhYmVsLT5kc3Q7CiAJCX0KIAl9CiAKQEAgLTE0Myw3ICsxNDMsNyBAQAogCQl9CiAJfQogCi0JaXB2Nl9hZGRyX2NvcHkoJm5wLT5kYWRkciwgZGFkZHIpOworCW5wLT5kYWRkciA9ICpkYWRkcjsKIAlucC0+Zmxvd19sYWJlbCA9IGZsNi5mbG93bGFiZWw7CiAKIAlpbmV0LT5pbmV0X2Rwb3J0ID0gdXNpbi0+c2luNl9wb3J0OwpAQCAtMTU0LDggKzE1NCw4IEBACiAJICovCiAKIAlmbDYuZmxvd2k2X3Byb3RvID0gc2stPnNrX3Byb3RvY29sOwotCWlwdjZfYWRkcl9jb3B5KCZmbDYuZGFkZHIsICZucC0+ZGFkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZmbDYuc2FkZHIsICZucC0+c2FkZHIpOworCWZsNi5kYWRkciA9IG5wLT5kYWRkcjsKKwlmbDYuc2FkZHIgPSBucC0+c2FkZHI7CiAJZmw2LmZsb3dpNl9vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOwogCWZsNi5mbG93aTZfbWFyayA9IHNrLT5za19tYXJrOwogCWZsNi5mbDZfZHBvcnQgPSBpbmV0LT5pbmV0X2Rwb3J0OwpAQCAtMTc5LDEwICsxNzksMTAgQEAKIAkvKiBzb3VyY2UgYWRkcmVzcyBsb29rdXAgZG9uZSBpbiBpcDZfZHN0X2xvb2t1cCAqLwogCiAJaWYgKGlwdjZfYWRkcl9hbnkoJm5wLT5zYWRkcikpCi0JCWlwdjZfYWRkcl9jb3B5KCZucC0+c2FkZHIsICZmbDYuc2FkZHIpOworCQlucC0+c2FkZHIgPSBmbDYuc2FkZHI7CiAKIAlpZiAoaXB2Nl9hZGRyX2FueSgmbnAtPnJjdl9zYWRkcikpIHsKLQkJaXB2Nl9hZGRyX2NvcHkoJm5wLT5yY3Zfc2FkZHIsICZmbDYuc2FkZHIpOworCQlucC0+cmN2X3NhZGRyID0gZmw2LnNhZGRyOwogCQlpbmV0LT5pbmV0X3Jjdl9zYWRkciA9IExPT1BCQUNLNF9JUFY2OwogCQlpZiAoc2stPnNrX3Byb3QtPnJlaGFzaCkKIAkJCXNrLT5za19wcm90LT5yZWhhc2goc2spOwpAQCAtMjU3LDcgKzI1Nyw3IEBACiAJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCWlwaCA9IGlwdjZfaGRyKHNrYik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwaC0+ZGFkZHIsICZmbDYtPmRhZGRyKTsKKwlpcGgtPmRhZGRyID0gZmw2LT5kYWRkcjsKIAogCXNlcnIgPSBTS0JfRVhUX0VSUihza2IpOwogCXNlcnItPmVlLmVlX2Vycm5vID0gZXJyOwpAQCAtMjk0LDcgKzI5NCw3IEBACiAJc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOwogCWlwaCA9IGlwdjZfaGRyKHNrYik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwaC0+ZGFkZHIsICZmbDYtPmRhZGRyKTsKKwlpcGgtPmRhZGRyID0gZmw2LT5kYWRkcjsKIAogCW10dV9pbmZvID0gSVA2Q0JNVFUoc2tiKTsKIApAQCAtMzAzLDcgKzMwMyw3IEBACiAJbXR1X2luZm8tPmlwNm1fYWRkci5zaW42X3BvcnQgPSAwOwogCW10dV9pbmZvLT5pcDZtX2FkZHIuc2luNl9mbG93aW5mbyA9IDA7CiAJbXR1X2luZm8tPmlwNm1fYWRkci5zaW42X3Njb3BlX2lkID0gZmw2LT5mbG93aTZfb2lmOwotCWlwdjZfYWRkcl9jb3B5KCZtdHVfaW5mby0+aXA2bV9hZGRyLnNpbjZfYWRkciwgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKKwltdHVfaW5mby0+aXA2bV9hZGRyLnNpbjZfYWRkciA9IGlwdjZfaGRyKHNrYiktPmRhZGRyOwogCiAJX19za2JfcHVsbChza2IsIHNrYl90YWlsX3BvaW50ZXIoc2tiKSAtIHNrYi0+ZGF0YSk7CiAJc2tiX3Jlc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKQEAgLTM1NCw4ICszNTQsOCBAQAogCQlzaW4tPnNpbjZfcG9ydCA9IHNlcnItPnBvcnQ7CiAJCXNpbi0+c2luNl9zY29wZV9pZCA9IDA7CiAJCWlmIChza2ItPnByb3RvY29sID09IGh0b25zKEVUSF9QX0lQVjYpKSB7Ci0JCQlpcHY2X2FkZHJfY29weSgmc2luLT5zaW42X2FkZHIsCi0JCQkJICAoc3RydWN0IGluNl9hZGRyICopKG5oICsgc2Vyci0+YWRkcl9vZmZzZXQpKTsKKwkJCXNpbi0+c2luNl9hZGRyID0KKwkJCQkqKHN0cnVjdCBpbjZfYWRkciAqKShuaCArIHNlcnItPmFkZHJfb2Zmc2V0KTsKIAkJCWlmIChucC0+c25kZmxvdykKIAkJCQlzaW4tPnNpbjZfZmxvd2luZm8gPQogCQkJCQkoKihfX2JlMzIgKikobmggKyBzZXJyLT5hZGRyX29mZnNldCAtIDI0KSAmCkBAIC0zNzYsNyArMzc2LDcgQEAKIAkJc2luLT5zaW42X2Zsb3dpbmZvID0gMDsKIAkJc2luLT5zaW42X3Njb3BlX2lkID0gMDsKIAkJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKLQkJCWlwdjZfYWRkcl9jb3B5KCZzaW4tPnNpbjZfYWRkciwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKKwkJCXNpbi0+c2luNl9hZGRyID0gaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CiAJCQlpZiAobnAtPnJ4b3B0LmFsbCkKIAkJCQlkYXRhZ3JhbV9yZWN2X2N0bChzaywgbXNnLCBza2IpOwogCQkJaWYgKGlwdjZfYWRkcl90eXBlKCZzaW4tPnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQpAQCAtNDUxLDcgKzQ1MSw3IEBACiAJCXNpbi0+c2luNl9mbG93aW5mbyA9IDA7CiAJCXNpbi0+c2luNl9wb3J0ID0gMDsKIAkJc2luLT5zaW42X3Njb3BlX2lkID0gbXR1X2luZm8uaXA2bV9hZGRyLnNpbjZfc2NvcGVfaWQ7Ci0JCWlwdjZfYWRkcl9jb3B5KCZzaW4tPnNpbjZfYWRkciwgJm10dV9pbmZvLmlwNm1fYWRkci5zaW42X2FkZHIpOworCQlzaW4tPnNpbjZfYWRkciA9IG10dV9pbmZvLmlwNm1fYWRkci5zaW42X2FkZHI7CiAJfQogCiAJcHV0X2Ntc2cobXNnLCBTT0xfSVBWNiwgSVBWNl9QQVRITVRVLCBzaXplb2YobXR1X2luZm8pLCAmbXR1X2luZm8pOwpAQCAtNDc1LDcgKzQ3NSw3IEBACiAJCXN0cnVjdCBpbjZfcGt0aW5mbyBzcmNfaW5mbzsKIAogCQlzcmNfaW5mby5pcGk2X2lmaW5kZXggPSBvcHQtPmlpZjsKLQkJaXB2Nl9hZGRyX2NvcHkoJnNyY19pbmZvLmlwaTZfYWRkciwgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKKwkJc3JjX2luZm8uaXBpNl9hZGRyID0gaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CiAJCXB1dF9jbXNnKG1zZywgU09MX0lQVjYsIElQVjZfUEtUSU5GTywgc2l6ZW9mKHNyY19pbmZvKSwgJnNyY19pbmZvKTsKIAl9CiAKQEAgLTU1MCw3ICs1NTAsNyBAQAogCQlzdHJ1Y3QgaW42X3BrdGluZm8gc3JjX2luZm87CiAKIAkJc3JjX2luZm8uaXBpNl9pZmluZGV4ID0gb3B0LT5paWY7Ci0JCWlwdjZfYWRkcl9jb3B5KCZzcmNfaW5mby5pcGk2X2FkZHIsICZpcHY2X2hkcihza2IpLT5kYWRkcik7CisJCXNyY19pbmZvLmlwaTZfYWRkciA9IGlwdjZfaGRyKHNrYiktPmRhZGRyOwogCQlwdXRfY21zZyhtc2csIFNPTF9JUFY2LCBJUFY2XzIyOTJQS1RJTkZPLCBzaXplb2Yoc3JjX2luZm8pLCAmc3JjX2luZm8pOwogCX0KIAlpZiAobnAtPnJ4b3B0LmJpdHMucnhvaGxpbSkgewpAQCAtNTg0LDcgKzU4NCw3IEBACiAJCQkgKi8KIAogCQkJc2luNi5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwotCQkJaXB2Nl9hZGRyX2NvcHkoJnNpbjYuc2luNl9hZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOworCQkJc2luNi5zaW42X2FkZHIgPSBpcHY2X2hkcihza2IpLT5kYWRkcjsKIAkJCXNpbjYuc2luNl9wb3J0ID0gcG9ydHNbMV07CiAJCQlzaW42LnNpbjZfZmxvd2luZm8gPSAwOwogCQkJc2luNi5zaW42X3Njb3BlX2lkID0gMDsKQEAgLTY1NCwxMiArNjU0LDEyIEBACiAKIAkJCWlmIChhZGRyX3R5cGUgIT0gSVBWNl9BRERSX0FOWSkgewogCQkJCWludCBzdHJpY3QgPSBfX2lwdjZfYWRkcl9zcmNfc2NvcGUoYWRkcl90eXBlKSA8PSBJUFY2X0FERFJfU0NPUEVfTElOS0xPQ0FMOwotCQkJCWlmICghaW5ldF9zayhzayktPnRyYW5zcGFyZW50ICYmCisJCQkJaWYgKCEoaW5ldF9zayhzayktPmZyZWViaW5kIHx8IGluZXRfc2soc2spLT50cmFuc3BhcmVudCkgJiYKIAkJCQkgICAgIWlwdjZfY2hrX2FkZHIobmV0LCAmc3JjX2luZm8tPmlwaTZfYWRkciwKIAkJCQkJCSAgIHN0cmljdCA/IGRldiA6IE5VTEwsIDApKQogCQkJCQllcnIgPSAtRUlOVkFMOwogCQkJCWVsc2UKLQkJCQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi0+c2FkZHIsICZzcmNfaW5mby0+aXBpNl9hZGRyKTsKKwkJCQkJZmw2LT5zYWRkciA9IHNyY19pbmZvLT5pcGk2X2FkZHI7CiAJCQl9CiAKIAkJCXJjdV9yZWFkX3VubG9jaygpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvZXh0aGRycy5jIGIvbmV0L2lwdjYvZXh0aGRycy5jCmluZGV4IGJmMjJhMjIuLjNkNjQxYjYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2V4dGhkcnMuYworKysgYi9uZXQvaXB2Ni9leHRoZHJzLmMKQEAgLTI0Myw5ICsyNDMsOSBAQAogCWlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9DT01QTEVURSkKIAkJc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwogCi0JaXB2Nl9hZGRyX2NvcHkoJnRtcF9hZGRyLCAmaXB2NmgtPnNhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmaXB2NmgtPnNhZGRyLCAmaGFvLT5hZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmaGFvLT5hZGRyLCAmdG1wX2FkZHIpOworCXRtcF9hZGRyID0gaXB2NmgtPnNhZGRyOworCWlwdjZoLT5zYWRkciA9IGhhby0+YWRkcjsKKwloYW8tPmFkZHIgPSB0bXBfYWRkcjsKIAogCWlmIChza2ItPnRzdGFtcC50djY0ID09IDApCiAJCV9fbmV0X3RpbWVzdGFtcChza2IpOwpAQCAtNDYxLDkgKzQ2MSw5IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQlpcHY2X2FkZHJfY29weSgmZGFkZHIsIGFkZHIpOwotCWlwdjZfYWRkcl9jb3B5KGFkZHIsICZpcHY2X2hkcihza2IpLT5kYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwdjZfaGRyKHNrYiktPmRhZGRyLCAmZGFkZHIpOworCWRhZGRyID0gKmFkZHI7CisJKmFkZHIgPSBpcHY2X2hkcihza2IpLT5kYWRkcjsKKwlpcHY2X2hkcihza2IpLT5kYWRkciA9IGRhZGRyOwogCiAJc2tiX2RzdF9kcm9wKHNrYik7CiAJaXA2X3JvdXRlX2lucHV0KHNrYik7CkBAIC02OTAsNyArNjkwLDcgQEAKIAkJbWVtY3B5KHBoZHItPmFkZHIsIGloZHItPmFkZHIgKyAxLAogCQkgICAgICAgKGhvcHMgLSAxKSAqIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKIAotCWlwdjZfYWRkcl9jb3B5KHBoZHItPmFkZHIgKyAoaG9wcyAtIDEpLCAqYWRkcl9wKTsKKwlwaGRyLT5hZGRyW2hvcHMgLSAxXSA9ICoqYWRkcl9wOwogCSphZGRyX3AgPSBpaGRyLT5hZGRyOwogCiAJcGhkci0+cnRfaGRyLm5leHRoZHIgPSAqcHJvdG87CkBAIC04ODgsOCArODg4LDggQEAKIAlpZiAoIW9wdCB8fCAhb3B0LT5zcmNydCkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpcHY2X2FkZHJfY29weShvcmlnLCAmZmw2LT5kYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi0+ZGFkZHIsICgoc3RydWN0IHJ0MF9oZHIgKilvcHQtPnNyY3J0KS0+YWRkcik7CisJKm9yaWcgPSBmbDYtPmRhZGRyOworCWZsNi0+ZGFkZHIgPSAqKChzdHJ1Y3QgcnQwX2hkciAqKW9wdC0+c3JjcnQpLT5hZGRyOwogCXJldHVybiBvcmlnOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9leHRoZHJzX2NvcmUuYyBiL25ldC9pcHY2L2V4dGhkcnNfY29yZS5jCmluZGV4IDM3ZjU0OGIuLjcyOTU3ZjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2V4dGhkcnNfY29yZS5jCisrKyBiL25ldC9pcHY2L2V4dGhkcnNfY29yZS5jCkBAIC01Nyw2ICs1Nyw5IEBACiAgKgkgICAgaXQgcmV0dXJucyBOVUxMLgogICoJICAtIEZpcnN0IGZyYWdtZW50IGhlYWRlciBpcyBza2lwcGVkLCBub3QtZmlyc3Qgb25lcwogICoJICAgIGFyZSBjb25zaWRlcmVkIGFzIHVucGFyc2FibGUuCisgKgkgIC0gUmVwb3J0cyB0aGUgb2Zmc2V0IGZpZWxkIG9mIHRoZSBmaW5hbCBmcmFnbWVudCBoZWFkZXIgc28gaXQgaXMKKyAqCSAgICBwb3NzaWJsZSB0byB0ZWxsIHdoZXRoZXIgdGhpcyBpcyBhIGZpcnN0IGZyYWdtZW50LCBsYXRlciBmcmFnbWVudCwKKyAqCSAgICBvciBub3QgZnJhZ21lbnRlZC4KICAqCSAgLSBFU1AgaXMgdW5wYXJzYWJsZSBmb3Igbm93IGFuZCBjb25zaWRlcmVkIGxpa2UKICAqCSAgICBub3JtYWwgcGF5bG9hZCBwcm90b2NvbC4KICAqCSAgLSBOb3RlIGFsc28gc3BlY2lhbCBoYW5kbGluZyBvZiBBVVRIIGhlYWRlci4gVGhhbmtzIHRvIElQc2VjIHdpemFyZHMuCkBAIC02NCwxMCArNjcsMTMgQEAKICAqIC0tQU5LICg5ODA3MjYpCiAgKi8KIAotaW50IGlwdjZfc2tpcF9leHRoZHIoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IHN0YXJ0LCB1OCAqbmV4dGhkcnApCitpbnQgaXB2Nl9za2lwX2V4dGhkcihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgc3RhcnQsIHU4ICpuZXh0aGRycCwKKwkJICAgICBfX2JlMTYgKmZyYWdfb2ZmcCkKIHsKIAl1OCBuZXh0aGRyID0gKm5leHRoZHJwOwogCisJKmZyYWdfb2ZmcCA9IDA7CisKIAl3aGlsZSAoaXB2Nl9leHRfaGRyKG5leHRoZHIpKSB7CiAJCXN0cnVjdCBpcHY2X29wdF9oZHIgX2hkciwgKmhwOwogCQlpbnQgaGRybGVuOwpAQCAtODcsNyArOTMsOCBAQAogCQkJaWYgKGZwID09IE5VTEwpCiAJCQkJcmV0dXJuIC0xOwogCi0JCQlpZiAobnRvaHMoKmZwKSAmIH4weDcpCisJCQkqZnJhZ19vZmZwID0gKmZwOworCQkJaWYgKG50b2hzKCpmcmFnX29mZnApICYgfjB4NykKIAkJCQlicmVhazsKIAkJCWhkcmxlbiA9IDg7CiAJCX0gZWxzZSBpZiAobmV4dGhkciA9PSBORVhUSERSX0FVVEgpCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9maWI2X3J1bGVzLmMgYi9uZXQvaXB2Ni9maWI2X3J1bGVzLmMKaW5kZXggMjk1NTcxNS4uYjZjNTczMSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvZmliNl9ydWxlcy5jCisrKyBiL25ldC9pcHY2L2ZpYjZfcnVsZXMuYwpAQCAtOTYsNyArOTYsNyBAQAogCQkJaWYgKCFpcHY2X3ByZWZpeF9lcXVhbCgmc2FkZHIsICZyLT5zcmMuYWRkciwKIAkJCQkJICAgICAgIHItPnNyYy5wbGVuKSkKIAkJCQlnb3RvIGFnYWluOwotCQkJaXB2Nl9hZGRyX2NvcHkoJmZscDYtPnNhZGRyLCAmc2FkZHIpOworCQkJZmxwNi0+c2FkZHIgPSBzYWRkcjsKIAkJfQogCQlnb3RvIG91dDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pY21wLmMgYi9uZXQvaXB2Ni9pY21wLmMKaW5kZXggOTA4NjhmYi4uMDFkNDZiZiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaWNtcC5jCisrKyBiL25ldC9pcHY2L2ljbXAuYwpAQCAtMTM1LDExICsxMzUsMTIgQEAKIAlpbnQgcHRyID0gKHU4ICopKGlwdjZfaGRyKHNrYikgKyAxKSAtIHNrYi0+ZGF0YTsKIAlpbnQgbGVuID0gc2tiLT5sZW4gLSBwdHI7CiAJX191OCBuZXh0aGRyID0gaXB2Nl9oZHIoc2tiKS0+bmV4dGhkcjsKKwlfX2JlMTYgZnJhZ19vZmY7CiAKIAlpZiAobGVuIDwgMCkKIAkJcmV0dXJuIDE7CiAKLQlwdHIgPSBpcHY2X3NraXBfZXh0aGRyKHNrYiwgcHRyLCAmbmV4dGhkcik7CisJcHRyID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHB0ciwgJm5leHRoZHIsICZmcmFnX29mZik7CiAJaWYgKHB0ciA8IDApCiAJCXJldHVybiAwOwogCWlmIChuZXh0aGRyID09IElQUFJPVE9fSUNNUFY2KSB7CkBAIC0yOTAsOSArMjkxLDkgQEAKIAkJaWYgKGxpa2VseShvZmYgPj0gMCkpIHsKIAkJCWhhbyA9IChzdHJ1Y3QgaXB2Nl9kZXN0b3B0X2hhbyAqKQogCQkJCQkoc2tiX25ldHdvcmtfaGVhZGVyKHNrYikgKyBvZmYpOwotCQkJaXB2Nl9hZGRyX2NvcHkoJnRtcCwgJmlwaC0+c2FkZHIpOwotCQkJaXB2Nl9hZGRyX2NvcHkoJmlwaC0+c2FkZHIsICZoYW8tPmFkZHIpOwotCQkJaXB2Nl9hZGRyX2NvcHkoJmhhby0+YWRkciwgJnRtcCk7CisJCQl0bXAgPSBpcGgtPnNhZGRyOworCQkJaXBoLT5zYWRkciA9IGhhby0+YWRkcjsKKwkJCWhhby0+YWRkciA9IHRtcDsKIAkJfQogCX0KIH0KQEAgLTQ0NCw5ICs0NDUsOSBAQAogCiAJbWVtc2V0KCZmbDYsIDAsIHNpemVvZihmbDYpKTsKIAlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19JQ01QVjY7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgJmhkci0+c2FkZHIpOworCWZsNi5kYWRkciA9IGhkci0+c2FkZHI7CiAJaWYgKHNhZGRyKQotCQlpcHY2X2FkZHJfY29weSgmZmw2LnNhZGRyLCBzYWRkcik7CisJCWZsNi5zYWRkciA9ICpzYWRkcjsKIAlmbDYuZmxvd2k2X29pZiA9IGlpZjsKIAlmbDYuZmw2X2ljbXBfdHlwZSA9IHR5cGU7CiAJZmw2LmZsNl9pY21wX2NvZGUgPSBjb2RlOwpAQCAtNTM4LDkgKzUzOSw5IEBACiAKIAltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwogCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX0lDTVBWNjsKLQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpOworCWZsNi5kYWRkciA9IGlwdjZfaGRyKHNrYiktPnNhZGRyOwogCWlmIChzYWRkcikKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi5zYWRkciwgc2FkZHIpOworCQlmbDYuc2FkZHIgPSAqc2FkZHI7CiAJZmw2LmZsb3dpNl9vaWYgPSBza2ItPmRldi0+aWZpbmRleDsKIAlmbDYuZmw2X2ljbXBfdHlwZSA9IElDTVBWNl9FQ0hPX1JFUExZOwogCXNlY3VyaXR5X3NrYl9jbGFzc2lmeV9mbG93KHNrYiwgZmxvd2k2X3RvX2Zsb3dpKCZmbDYpKTsKQEAgLTU5Niw2ICs1OTcsNyBAQAogCWludCBpbm5lcl9vZmZzZXQ7CiAJaW50IGhhc2g7CiAJdTggbmV4dGhkcjsKKwlfX2JlMTYgZnJhZ19vZmY7CiAKIAlpZiAoIXBza2JfbWF5X3B1bGwoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpKSkKIAkJcmV0dXJuOwpAQCAtNjAzLDcgKzYwNSw4IEBACiAJbmV4dGhkciA9ICgoc3RydWN0IGlwdjZoZHIgKilza2ItPmRhdGEpLT5uZXh0aGRyOwogCWlmIChpcHY2X2V4dF9oZHIobmV4dGhkcikpIHsKIAkJLyogbm93IHNraXAgb3ZlciBleHRlbnNpb24gaGVhZGVycyAqLwotCQlpbm5lcl9vZmZzZXQgPSBpcHY2X3NraXBfZXh0aGRyKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSwgJm5leHRoZHIpOworCQlpbm5lcl9vZmZzZXQgPSBpcHY2X3NraXBfZXh0aGRyKHNrYiwgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSwKKwkJCQkJCSZuZXh0aGRyLCAmZnJhZ19vZmYpOwogCQlpZiAoaW5uZXJfb2Zmc2V0PDApCiAJCQlyZXR1cm47CiAJfSBlbHNlIHsKQEAgLTc4Niw4ICs3ODksOCBAQAogCQkgICAgICBpbnQgb2lmKQogewogCW1lbXNldChmbDYsIDAsIHNpemVvZigqZmw2KSk7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi0+c2FkZHIsIHNhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmZmw2LT5kYWRkciwgZGFkZHIpOworCWZsNi0+c2FkZHIgPSAqc2FkZHI7CisJZmw2LT5kYWRkciA9ICpkYWRkcjsKIAlmbDYtPmZsb3dpNl9wcm90byAJPSBJUFBST1RPX0lDTVBWNjsKIAlmbDYtPmZsNl9pY21wX3R5cGUJPSB0eXBlOwogCWZsNi0+Zmw2X2ljbXBfY29kZQk9IDA7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pbmV0Nl9jb25uZWN0aW9uX3NvY2suYyBiL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jCmluZGV4IGZlZTQ2ZDUuLjAyZGQyMDMgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jCisrKyBiL25ldC9pcHY2L2luZXQ2X2Nvbm5lY3Rpb25fc29jay5jCkBAIC02NSw5ICs2NSw5IEBACiAKIAltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwogCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX1RDUDsKLQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmdHJlcS0+cm10X2FkZHIpOworCWZsNi5kYWRkciA9IHRyZXEtPnJtdF9hZGRyOwogCWZpbmFsX3AgPSBmbDZfdXBkYXRlX2RzdCgmZmw2LCBucC0+b3B0LCAmZmluYWwpOwotCWlwdjZfYWRkcl9jb3B5KCZmbDYuc2FkZHIsICZ0cmVxLT5sb2NfYWRkcik7CisJZmw2LnNhZGRyID0gdHJlcS0+bG9jX2FkZHI7CiAJZmw2LmZsb3dpNl9vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOwogCWZsNi5mbG93aTZfbWFyayA9IHNrLT5za19tYXJrOwogCWZsNi5mbDZfZHBvcnQgPSBpbmV0X3JzayhyZXEpLT5ybXRfcG9ydDsKQEAgLTg1LDcgKzg1LDcgQEAKICAqIHJlcXVlc3Rfc29jayAoZm9ybWVybHkgb3BlbiByZXF1ZXN0KSBoYXNoIHRhYmxlcy4KICAqLwogc3RhdGljIHUzMiBpbmV0Nl9zeW5xX2hhc2goY29uc3Qgc3RydWN0IGluNl9hZGRyICpyYWRkciwgY29uc3QgX19iZTE2IHJwb3J0LAotCQkJICAgY29uc3QgdTMyIHJuZCwgY29uc3QgdTE2IHN5bnFfaHNpemUpCisJCQkgICBjb25zdCB1MzIgcm5kLCBjb25zdCB1MzIgc3lucV9oc2l6ZSkKIHsKIAl1MzIgYzsKIApAQCAtMTU3LDcgKzE1Nyw3IEBACiAJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHVhZGRyOwogCiAJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKLQlpcHY2X2FkZHJfY29weSgmc2luNi0+c2luNl9hZGRyLCAmbnAtPmRhZGRyKTsKKwlzaW42LT5zaW42X2FkZHIgPSBucC0+ZGFkZHI7CiAJc2luNi0+c2luNl9wb3J0CT0gaW5ldF9zayhzayktPmluZXRfZHBvcnQ7CiAJLyogV2UgZG8gbm90IHN0b3JlIHJlY2VpdmVkIGZsb3dsYWJlbCBmb3IgVENQICovCiAJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7CkBAIC0yMTUsOCArMjE1LDggQEAKIAogCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7CiAJZmw2LmZsb3dpNl9wcm90byA9IHNrLT5za19wcm90b2NvbDsKLQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmbnAtPmRhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmZmw2LnNhZGRyLCAmbnAtPnNhZGRyKTsKKwlmbDYuZGFkZHIgPSBucC0+ZGFkZHI7CisJZmw2LnNhZGRyID0gbnAtPnNhZGRyOwogCWZsNi5mbG93bGFiZWwgPSBucC0+Zmxvd19sYWJlbDsKIAlJUDZfRUNOX2Zsb3dfeG1pdChzaywgZmw2LmZsb3dsYWJlbCk7CiAJZmw2LmZsb3dpNl9vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOwpAQCAtMjQ2LDcgKzI0Niw3IEBACiAJc2tiX2RzdF9zZXRfbm9yZWYoc2tiLCBkc3QpOwogCiAJLyogUmVzdG9yZSBmaW5hbCBkZXN0aW5hdGlvbiBiYWNrIGFmdGVyIHJvdXRpbmcgZG9uZSAqLwotCWlwdjZfYWRkcl9jb3B5KCZmbDYuZGFkZHIsICZucC0+ZGFkZHIpOworCWZsNi5kYWRkciA9IG5wLT5kYWRkcjsKIAogCXJlcyA9IGlwNl94bWl0KHNrLCBza2IsICZmbDYsIG5wLT5vcHQsIG5wLT50Y2xhc3MpOwogCXJjdV9yZWFkX3VubG9jaygpOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2ZpYi5jIGIvbmV0L2lwdjYvaXA2X2ZpYi5jCmluZGV4IDkzNzE4ZjMuLmI4MmJjZGUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9maWIuYworKysgYi9uZXQvaXB2Ni9pcDZfZmliLmMKQEAgLTE5MCw3ICsxOTAsNyBAQAogCXN0cnVjdCBmaWI2X3RhYmxlICp0YWJsZTsKIAogCXRhYmxlID0ga3phbGxvYyhzaXplb2YoKnRhYmxlKSwgR0ZQX0FUT01JQyk7Ci0JaWYgKHRhYmxlICE9IE5VTEwpIHsKKwlpZiAodGFibGUpIHsKIAkJdGFibGUtPnRiNl9pZCA9IGlkOwogCQl0YWJsZS0+dGI2X3Jvb3QubGVhZiA9IG5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeTsKIAkJdGFibGUtPnRiNl9yb290LmZuX2ZsYWdzID0gUlROX1JPT1QgfCBSVE5fVExfUk9PVCB8IFJUTl9SVElORk87CkBAIC0yMTAsNyArMjEwLDcgQEAKIAkJcmV0dXJuIHRiOwogCiAJdGIgPSBmaWI2X2FsbG9jX3RhYmxlKG5ldCwgaWQpOwotCWlmICh0YiAhPSBOVUxMKQorCWlmICh0YikKIAkJZmliNl9saW5rX3RhYmxlKG5ldCwgdGIpOwogCiAJcmV0dXJuIHRiOwpAQCAtMzY3LDcgKzM2Nyw3IEBACiAJc19lID0gY2ItPmFyZ3NbMV07CiAKIAl3ID0gKHZvaWQgKiljYi0+YXJnc1syXTsKLQlpZiAodyA9PSBOVUxMKSB7CisJaWYgKCF3KSB7CiAJCS8qIE5ldyBkdW1wOgogCQkgKgogCQkgKiAxLiBob29rIGNhbGxiYWNrIGRlc3RydWN0b3IuCkBAIC0zNzksNyArMzc5LDcgQEAKIAkJICogMi4gYWxsb2NhdGUgYW5kIGluaXRpYWxpemUgd2Fsa2VyLgogCQkgKi8KIAkJdyA9IGt6YWxsb2Moc2l6ZW9mKCp3KSwgR0ZQX0FUT01JQyk7Ci0JCWlmICh3ID09IE5VTEwpCisJCWlmICghdykKIAkJCXJldHVybiAtRU5PTUVNOwogCQl3LT5mdW5jID0gZmliNl9kdW1wX25vZGU7CiAJCWNiLT5hcmdzWzJdID0gKGxvbmcpdzsKQEAgLTQyNSw3ICs0MjUsOCBAQAogCiBzdGF0aWMgc3RydWN0IGZpYjZfbm9kZSAqIGZpYjZfYWRkXzEoc3RydWN0IGZpYjZfbm9kZSAqcm9vdCwgdm9pZCAqYWRkciwKIAkJCQkgICAgIGludCBhZGRybGVuLCBpbnQgcGxlbiwKLQkJCQkgICAgIGludCBvZmZzZXQpCisJCQkJICAgICBpbnQgb2Zmc2V0LCBpbnQgYWxsb3dfY3JlYXRlLAorCQkJCSAgICAgaW50IHJlcGxhY2VfcmVxdWlyZWQpCiB7CiAJc3RydWN0IGZpYjZfbm9kZSAqZm4sICppbiwgKmxuOwogCXN0cnVjdCBmaWI2X25vZGUgKnBuID0gTlVMTDsKQEAgLTQ0Nyw4ICs0NDgsMTggQEAKIAkJICoJUHJlZml4IG1hdGNoCiAJCSAqLwogCQlpZiAocGxlbiA8IGZuLT5mbl9iaXQgfHwKLQkJICAgICFpcHY2X3ByZWZpeF9lcXVhbCgma2V5LT5hZGRyLCBhZGRyLCBmbi0+Zm5fYml0KSkKKwkJICAgICFpcHY2X3ByZWZpeF9lcXVhbCgma2V5LT5hZGRyLCBhZGRyLCBmbi0+Zm5fYml0KSkgeworCQkJaWYgKCFhbGxvd19jcmVhdGUpIHsKKwkJCQlpZiAocmVwbGFjZV9yZXF1aXJlZCkgeworCQkJCQlwcl93YXJuKCJJUHY2OiBDYW4ndCByZXBsYWNlIHJvdXRlLCAiCisJCQkJCQkibm8gbWF0Y2ggZm91bmRcbiIpOworCQkJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJCQl9CisJCQkJcHJfd2FybigiSVB2NjogTkxNX0ZfQ1JFQVRFIHNob3VsZCBiZSBzZXQgIgorCQkJCQkid2hlbiBjcmVhdGluZyBuZXcgcm91dGVcbiIpOworCQkJfQogCQkJZ290byBpbnNlcnRfYWJvdmU7CisJCX0KIAogCQkvKgogCQkgKglFeGFjdCBtYXRjaCA/CkBAIC00NTYsNyArNDY3LDcgQEAKIAogCQlpZiAocGxlbiA9PSBmbi0+Zm5fYml0KSB7CiAJCQkvKiBjbGVhbiB1cCBhbiBpbnRlcm1lZGlhdGUgbm9kZSAqLwotCQkJaWYgKChmbi0+Zm5fZmxhZ3MgJiBSVE5fUlRJTkZPKSA9PSAwKSB7CisJCQlpZiAoIShmbi0+Zm5fZmxhZ3MgJiBSVE5fUlRJTkZPKSkgewogCQkJCXJ0Nl9yZWxlYXNlKGZuLT5sZWFmKTsKIAkJCQlmbi0+bGVhZiA9IE5VTEw7CiAJCQl9CkBAIC00NzcsNiArNDg4LDIzIEBACiAJCWZuID0gZGlyID8gZm4tPnJpZ2h0OiBmbi0+bGVmdDsKIAl9IHdoaWxlIChmbik7CiAKKwlpZiAoIWFsbG93X2NyZWF0ZSkgeworCQkvKiBXZSBzaG91bGQgbm90IGNyZWF0ZSBuZXcgbm9kZSBiZWNhdXNlCisJCSAqIE5MTV9GX1JFUExBQ0Ugd2FzIHNwZWNpZmllZCB3aXRob3V0IE5MTV9GX0NSRUFURQorCQkgKiBJIGFzc3VtZSBpdCBpcyBzYWZlIHRvIHJlcXVpcmUgTkxNX0ZfQ1JFQVRFIHdoZW4KKwkJICogUkVQTEFDRSBmbGFnIGlzIHVzZWQhIExhdGVyIHdlIG1heSB3YW50IHRvIHJlbW92ZSB0aGUKKwkJICogY2hlY2sgZm9yIHJlcGxhY2VfcmVxdWlyZWQsIGJlY2F1c2UgYWNjb3JkaW5nCisJCSAqIHRvIG5ldGxpbmsgc3BlY2lmaWNhdGlvbiwgTkxNX0ZfQ1JFQVRFCisJCSAqIE1VU1QgYmUgc3BlY2lmaWVkIGlmIG5ldyByb3V0ZSBpcyBjcmVhdGVkLgorCQkgKiBUaGF0IHdvdWxkIGtlZXAgSVB2NiBjb25zaXN0ZW50IHdpdGggSVB2NAorCQkgKi8KKwkJaWYgKHJlcGxhY2VfcmVxdWlyZWQpIHsKKwkJCXByX3dhcm4oIklQdjY6IENhbid0IHJlcGxhY2Ugcm91dGUsIG5vIG1hdGNoIGZvdW5kXG4iKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9FTlQpOworCQl9CisJCXByX3dhcm4oIklQdjY6IE5MTV9GX0NSRUFURSBzaG91bGQgYmUgc2V0ICIKKwkJCSJ3aGVuIGNyZWF0aW5nIG5ldyByb3V0ZVxuIik7CisJfQogCS8qCiAJICoJV2Ugd2Fsa2VkIHRvIHRoZSBib3R0b20gb2YgdHJlZS4KIAkgKglDcmVhdGUgbmV3IGxlYWYgbm9kZSB3aXRob3V0IGNoaWxkcmVuLgpAQCAtNDg0LDcgKzUxMiw3IEBACiAKIAlsbiA9IG5vZGVfYWxsb2MoKTsKIAotCWlmIChsbiA9PSBOVUxMKQorCWlmICghbG4pCiAJCXJldHVybiBOVUxMOwogCWxuLT5mbl9iaXQgPSBwbGVuOwogCkBAIC01MjcsNyArNTU1LDcgQEAKIAkJaW4gPSBub2RlX2FsbG9jKCk7CiAJCWxuID0gbm9kZV9hbGxvYygpOwogCi0JCWlmIChpbiA9PSBOVUxMIHx8IGxuID09IE5VTEwpIHsKKwkJaWYgKCFpbiB8fCAhbG4pIHsKIAkJCWlmIChpbikKIAkJCQlub2RlX2ZyZWUoaW4pOwogCQkJaWYgKGxuKQpAQCAtNTgxLDcgKzYwOSw3IEBACiAKIAkJbG4gPSBub2RlX2FsbG9jKCk7CiAKLQkJaWYgKGxuID09IE5VTEwpCisJCWlmICghbG4pCiAJCQlyZXR1cm4gTlVMTDsKIAogCQlsbi0+Zm5fYml0ID0gcGxlbjsKQEAgLTYxNCwxMCArNjQyLDE1IEBACiB7CiAJc3RydWN0IHJ0Nl9pbmZvICppdGVyID0gTlVMTDsKIAlzdHJ1Y3QgcnQ2X2luZm8gKippbnM7CisJaW50IHJlcGxhY2UgPSAoaW5mby0+bmxoICYmCisJCSAgICAgICAoaW5mby0+bmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX1JFUExBQ0UpKTsKKwlpbnQgYWRkID0gKCFpbmZvLT5ubGggfHwKKwkJICAgKGluZm8tPm5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUpKTsKKwlpbnQgZm91bmQgPSAwOwogCiAJaW5zID0gJmZuLT5sZWFmOwogCi0JZm9yIChpdGVyID0gZm4tPmxlYWY7IGl0ZXI7IGl0ZXI9aXRlci0+ZHN0LnJ0Nl9uZXh0KSB7CisJZm9yIChpdGVyID0gZm4tPmxlYWY7IGl0ZXI7IGl0ZXIgPSBpdGVyLT5kc3QucnQ2X25leHQpIHsKIAkJLyoKIAkJICoJU2VhcmNoIGZvciBkdXBsaWNhdGVzCiAJCSAqLwpAQCAtNjI2LDE3ICs2NTksMjQgQEAKIAkJCS8qCiAJCQkgKglTYW1lIHByaW9yaXR5IGxldmVsCiAJCQkgKi8KKwkJCWlmIChpbmZvLT5ubGggJiYKKwkJCSAgICAoaW5mby0+bmxoLT5ubG1zZ19mbGFncyAmIE5MTV9GX0VYQ0wpKQorCQkJCXJldHVybiAtRUVYSVNUOworCQkJaWYgKHJlcGxhY2UpIHsKKwkJCQlmb3VuZCsrOworCQkJCWJyZWFrOworCQkJfQogCi0JCQlpZiAoaXRlci0+cnQ2aV9kZXYgPT0gcnQtPnJ0NmlfZGV2ICYmCisJCQlpZiAoaXRlci0+ZHN0LmRldiA9PSBydC0+ZHN0LmRldiAmJgogCQkJICAgIGl0ZXItPnJ0NmlfaWRldiA9PSBydC0+cnQ2aV9pZGV2ICYmCiAJCQkgICAgaXB2Nl9hZGRyX2VxdWFsKCZpdGVyLT5ydDZpX2dhdGV3YXksCiAJCQkJCSAgICAmcnQtPnJ0NmlfZ2F0ZXdheSkpIHsKLQkJCQlpZiAoIShpdGVyLT5ydDZpX2ZsYWdzJlJURl9FWFBJUkVTKSkKKwkJCQlpZiAoIShpdGVyLT5ydDZpX2ZsYWdzICYgUlRGX0VYUElSRVMpKQogCQkJCQlyZXR1cm4gLUVFWElTVDsKLQkJCQlpdGVyLT5ydDZpX2V4cGlyZXMgPSBydC0+cnQ2aV9leHBpcmVzOwotCQkJCWlmICghKHJ0LT5ydDZpX2ZsYWdzJlJURl9FWFBJUkVTKSkgeworCQkJCWl0ZXItPmRzdC5leHBpcmVzID0gcnQtPmRzdC5leHBpcmVzOworCQkJCWlmICghKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0VYUElSRVMpKSB7CiAJCQkJCWl0ZXItPnJ0NmlfZmxhZ3MgJj0gflJURl9FWFBJUkVTOwotCQkJCQlpdGVyLT5ydDZpX2V4cGlyZXMgPSAwOworCQkJCQlpdGVyLT5kc3QuZXhwaXJlcyA9IDA7CiAJCQkJfQogCQkJCXJldHVybiAtRUVYSVNUOwogCQkJfQpAQCAtNjU1LDE3ICs2OTUsNDAgQEAKIAkvKgogCSAqCWluc2VydCBub2RlCiAJICovCisJaWYgKCFyZXBsYWNlKSB7CisJCWlmICghYWRkKQorCQkJcHJfd2FybigiSVB2NjogTkxNX0ZfQ1JFQVRFIHNob3VsZCBiZSBzZXQgd2hlbiBjcmVhdGluZyBuZXcgcm91dGVcbiIpOwogCi0JcnQtPmRzdC5ydDZfbmV4dCA9IGl0ZXI7Ci0JKmlucyA9IHJ0OwotCXJ0LT5ydDZpX25vZGUgPSBmbjsKLQlhdG9taWNfaW5jKCZydC0+cnQ2aV9yZWYpOwotCWluZXQ2X3J0X25vdGlmeShSVE1fTkVXUk9VVEUsIHJ0LCBpbmZvKTsKLQlpbmZvLT5ubF9uZXQtPmlwdjYucnQ2X3N0YXRzLT5maWJfcnRfZW50cmllcysrOworYWRkOgorCQlydC0+ZHN0LnJ0Nl9uZXh0ID0gaXRlcjsKKwkJKmlucyA9IHJ0OworCQlydC0+cnQ2aV9ub2RlID0gZm47CisJCWF0b21pY19pbmMoJnJ0LT5ydDZpX3JlZik7CisJCWluZXQ2X3J0X25vdGlmeShSVE1fTkVXUk9VVEUsIHJ0LCBpbmZvKTsKKwkJaW5mby0+bmxfbmV0LT5pcHY2LnJ0Nl9zdGF0cy0+ZmliX3J0X2VudHJpZXMrKzsKIAotCWlmICgoZm4tPmZuX2ZsYWdzICYgUlROX1JUSU5GTykgPT0gMCkgewotCQlpbmZvLT5ubF9uZXQtPmlwdjYucnQ2X3N0YXRzLT5maWJfcm91dGVfbm9kZXMrKzsKLQkJZm4tPmZuX2ZsYWdzIHw9IFJUTl9SVElORk87CisJCWlmICghKGZuLT5mbl9mbGFncyAmIFJUTl9SVElORk8pKSB7CisJCQlpbmZvLT5ubF9uZXQtPmlwdjYucnQ2X3N0YXRzLT5maWJfcm91dGVfbm9kZXMrKzsKKwkJCWZuLT5mbl9mbGFncyB8PSBSVE5fUlRJTkZPOworCQl9CisKKwl9IGVsc2UgeworCQlpZiAoIWZvdW5kKSB7CisJCQlpZiAoYWRkKQorCQkJCWdvdG8gYWRkOworCQkJcHJfd2FybigiSVB2NjogTkxNX0ZfUkVQTEFDRSBzZXQsIGJ1dCBubyBleGlzdGluZyBub2RlIGZvdW5kIVxuIik7CisJCQlyZXR1cm4gLUVOT0VOVDsKKwkJfQorCQkqaW5zID0gcnQ7CisJCXJ0LT5ydDZpX25vZGUgPSBmbjsKKwkJcnQtPmRzdC5ydDZfbmV4dCA9IGl0ZXItPmRzdC5ydDZfbmV4dDsKKwkJYXRvbWljX2luYygmcnQtPnJ0NmlfcmVmKTsKKwkJaW5ldDZfcnRfbm90aWZ5KFJUTV9ORVdST1VURSwgcnQsIGluZm8pOworCQlydDZfcmVsZWFzZShpdGVyKTsKKwkJaWYgKCEoZm4tPmZuX2ZsYWdzICYgUlROX1JUSU5GTykpIHsKKwkJCWluZm8tPm5sX25ldC0+aXB2Ni5ydDZfc3RhdHMtPmZpYl9yb3V0ZV9ub2RlcysrOworCQkJZm4tPmZuX2ZsYWdzIHw9IFJUTl9SVElORk87CisJCX0KIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTY3NCw3ICs3MzcsNyBAQAogc3RhdGljIF9faW5saW5lX18gdm9pZCBmaWI2X3N0YXJ0X2djKHN0cnVjdCBuZXQgKm5ldCwgc3RydWN0IHJ0Nl9pbmZvICpydCkKIHsKIAlpZiAoIXRpbWVyX3BlbmRpbmcoJm5ldC0+aXB2Ni5pcDZfZmliX3RpbWVyKSAmJgotCSAgICAocnQtPnJ0NmlfZmxhZ3MgJiAoUlRGX0VYUElSRVN8UlRGX0NBQ0hFKSkpCisJICAgIChydC0+cnQ2aV9mbGFncyAmIChSVEZfRVhQSVJFUyB8IFJURl9DQUNIRSkpKQogCQltb2RfdGltZXIoJm5ldC0+aXB2Ni5pcDZfZmliX3RpbWVyLAogCQkJICBqaWZmaWVzICsgbmV0LT5pcHY2LnN5c2N0bC5pcDZfcnRfZ2NfaW50ZXJ2YWwpOwogfQpAQCAtNjk2LDExICs3NTksMjggQEAKIHsKIAlzdHJ1Y3QgZmliNl9ub2RlICpmbiwgKnBuID0gTlVMTDsKIAlpbnQgZXJyID0gLUVOT01FTTsKKwlpbnQgYWxsb3dfY3JlYXRlID0gMTsKKwlpbnQgcmVwbGFjZV9yZXF1aXJlZCA9IDA7CisKKwlpZiAoaW5mby0+bmxoKSB7CisJCWlmICghKGluZm8tPm5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9DUkVBVEUpKQorCQkJYWxsb3dfY3JlYXRlID0gMDsKKwkJaWYgKGluZm8tPm5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVBMQUNFKQorCQkJcmVwbGFjZV9yZXF1aXJlZCA9IDE7CisJfQorCWlmICghYWxsb3dfY3JlYXRlICYmICFyZXBsYWNlX3JlcXVpcmVkKQorCQlwcl93YXJuKCJJUHY2OiBSVE1fTkVXUk9VVEUgd2l0aCBubyBOTE1fRl9DUkVBVEUgb3IgTkxNX0ZfUkVQTEFDRVxuIik7CiAKIAlmbiA9IGZpYjZfYWRkXzEocm9vdCwgJnJ0LT5ydDZpX2RzdC5hZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKLQkJCXJ0LT5ydDZpX2RzdC5wbGVuLCBvZmZzZXRvZihzdHJ1Y3QgcnQ2X2luZm8sIHJ0NmlfZHN0KSk7CisJCQlydC0+cnQ2aV9kc3QucGxlbiwgb2Zmc2V0b2Yoc3RydWN0IHJ0Nl9pbmZvLCBydDZpX2RzdCksCisJCQlhbGxvd19jcmVhdGUsIHJlcGxhY2VfcmVxdWlyZWQpOwogCi0JaWYgKGZuID09IE5VTEwpCisJaWYgKElTX0VSUihmbikpIHsKKwkJZXJyID0gUFRSX0VSUihmbik7CisJCWZuID0gTlVMTDsKKwl9CisKKwlpZiAoIWZuKQogCQlnb3RvIG91dDsKIAogCXBuID0gZm47CkBAIC03MDksNyArNzg5LDcgQEAKIAlpZiAocnQtPnJ0Nmlfc3JjLnBsZW4pIHsKIAkJc3RydWN0IGZpYjZfbm9kZSAqc247CiAKLQkJaWYgKGZuLT5zdWJ0cmVlID09IE5VTEwpIHsKKwkJaWYgKCFmbi0+c3VidHJlZSkgewogCQkJc3RydWN0IGZpYjZfbm9kZSAqc2ZuOwogCiAJCQkvKgpAQCAtNzI0LDcgKzgwNCw3IEBACiAKIAkJCS8qIENyZWF0ZSBzdWJ0cmVlIHJvb3Qgbm9kZSAqLwogCQkJc2ZuID0gbm9kZV9hbGxvYygpOwotCQkJaWYgKHNmbiA9PSBOVUxMKQorCQkJaWYgKCFzZm4pCiAJCQkJZ290byBzdF9mYWlsdXJlOwogCiAJCQlzZm4tPmxlYWYgPSBpbmZvLT5ubF9uZXQtPmlwdjYuaXA2X251bGxfZW50cnk7CkBAIC03MzYsOSArODE2LDEwIEBACiAKIAkJCXNuID0gZmliNl9hZGRfMShzZm4sICZydC0+cnQ2aV9zcmMuYWRkciwKIAkJCQkJc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksIHJ0LT5ydDZpX3NyYy5wbGVuLAotCQkJCQlvZmZzZXRvZihzdHJ1Y3QgcnQ2X2luZm8sIHJ0Nmlfc3JjKSk7CisJCQkJCW9mZnNldG9mKHN0cnVjdCBydDZfaW5mbywgcnQ2aV9zcmMpLAorCQkJCQlhbGxvd19jcmVhdGUsIHJlcGxhY2VfcmVxdWlyZWQpOwogCi0JCQlpZiAoc24gPT0gTlVMTCkgeworCQkJaWYgKCFzbikgewogCQkJCS8qIElmIGl0IGlzIGZhaWxlZCwgZGlzY2FyZCBqdXN0IGFsbG9jYXRlZAogCQkJCSAgIHJvb3QsIGFuZCB0aGVuIChpbiBzdF9mYWlsdXJlKSBzdGFsZSBub2RlCiAJCQkJICAgaW4gbWFpbiB0cmVlLgpAQCAtNzUzLDEzICs4MzQsMTggQEAKIAkJfSBlbHNlIHsKIAkJCXNuID0gZmliNl9hZGRfMShmbi0+c3VidHJlZSwgJnJ0LT5ydDZpX3NyYy5hZGRyLAogCQkJCQlzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwgcnQtPnJ0Nmlfc3JjLnBsZW4sCi0JCQkJCW9mZnNldG9mKHN0cnVjdCBydDZfaW5mbywgcnQ2aV9zcmMpKTsKKwkJCQkJb2Zmc2V0b2Yoc3RydWN0IHJ0Nl9pbmZvLCBydDZpX3NyYyksCisJCQkJCWFsbG93X2NyZWF0ZSwgcmVwbGFjZV9yZXF1aXJlZCk7CiAKLQkJCWlmIChzbiA9PSBOVUxMKQorCQkJaWYgKElTX0VSUihzbikpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHNuKTsKKwkJCQlzbiA9IE5VTEw7CisJCQl9CisJCQlpZiAoIXNuKQogCQkJCWdvdG8gc3RfZmFpbHVyZTsKIAkJfQogCi0JCWlmIChmbi0+bGVhZiA9PSBOVUxMKSB7CisJCWlmICghZm4tPmxlYWYpIHsKIAkJCWZuLT5sZWFmID0gcnQ7CiAJCQlhdG9taWNfaW5jKCZydC0+cnQ2aV9yZWYpOwogCQl9CkBAIC03NjgsMTAgKzg1NCw5IEBACiAjZW5kaWYKIAogCWVyciA9IGZpYjZfYWRkX3J0Mm5vZGUoZm4sIHJ0LCBpbmZvKTsKLQotCWlmIChlcnIgPT0gMCkgeworCWlmICghZXJyKSB7CiAJCWZpYjZfc3RhcnRfZ2MoaW5mby0+bmxfbmV0LCBydCk7Ci0JCWlmICghKHJ0LT5ydDZpX2ZsYWdzJlJURl9DQUNIRSkpCisJCWlmICghKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0NBQ0hFKSkKIAkJCWZpYjZfcHJ1bmVfY2xvbmVzKGluZm8tPm5sX25ldCwgcG4sIHJ0KTsKIAl9CiAKQEAgLTgxOSw3ICs5MDQsNyBAQAogICovCiAKIHN0cnVjdCBsb29rdXBfYXJncyB7Ci0JaW50CQlvZmZzZXQ7CQkvKiBrZXkgb2Zmc2V0IG9uIHJ0Nl9pbmZvCSovCisJaW50CQkJb2Zmc2V0OwkJLyoga2V5IG9mZnNldCBvbiBydDZfaW5mbwkqLwogCWNvbnN0IHN0cnVjdCBpbjZfYWRkcgkqYWRkcjsJCS8qIHNlYXJjaCBrZXkJCQkqLwogfTsKIApAQCAtODQ5LDExICs5MzQsMTAgQEAKIAkJCWZuID0gbmV4dDsKIAkJCWNvbnRpbnVlOwogCQl9Ci0KIAkJYnJlYWs7CiAJfQogCi0Jd2hpbGUoZm4pIHsKKwl3aGlsZSAoZm4pIHsKIAkJaWYgKEZJQjZfU1VCVFJFRShmbikgfHwgZm4tPmZuX2ZsYWdzICYgUlROX1JUSU5GTykgewogCQkJc3RydWN0IHJ0NmtleSAqa2V5OwogCkBAIC05MDAsOCArOTg0LDcgQEAKIAl9OwogCiAJZm4gPSBmaWI2X2xvb2t1cF8xKHJvb3QsIGRhZGRyID8gYXJncyA6IGFyZ3MgKyAxKTsKLQotCWlmIChmbiA9PSBOVUxMIHx8IGZuLT5mbl9mbGFncyAmIFJUTl9UTF9ST09UKQorCWlmICghZm4gfHwgZm4tPmZuX2ZsYWdzICYgUlROX1RMX1JPT1QpCiAJCWZuID0gcm9vdDsKIAogCXJldHVybiBmbjsKQEAgLTk2MSw3ICsxMDQ0LDcgQEAKIAl9CiAjZW5kaWYKIAotCWlmIChmbiAmJiBmbi0+Zm5fZmxhZ3MmUlROX1JUSU5GTykKKwlpZiAoZm4gJiYgZm4tPmZuX2ZsYWdzICYgUlROX1JUSU5GTykKIAkJcmV0dXJuIGZuOwogCiAJcmV0dXJuIE5VTEw7CkBAIC05NzUsMTQgKzEwNTgsMTMgQEAKIAogc3RhdGljIHN0cnVjdCBydDZfaW5mbyAqZmliNl9maW5kX3ByZWZpeChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmaWI2X25vZGUgKmZuKQogewotCWlmIChmbi0+Zm5fZmxhZ3MmUlROX1JPT1QpCisJaWYgKGZuLT5mbl9mbGFncyAmIFJUTl9ST09UKQogCQlyZXR1cm4gbmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5OwogCi0Jd2hpbGUoZm4pIHsKLQkJaWYoZm4tPmxlZnQpCisJd2hpbGUgKGZuKSB7CisJCWlmIChmbi0+bGVmdCkKIAkJCXJldHVybiBmbi0+bGVmdC0+bGVhZjsKLQotCQlpZihmbi0+cmlnaHQpCisJCWlmIChmbi0+cmlnaHQpCiAJCQlyZXR1cm4gZm4tPnJpZ2h0LT5sZWFmOwogCiAJCWZuID0gRklCNl9TVUJUUkVFKGZuKTsKQEAgLTEwMjAsMTIgKzExMDIsMTIgQEAKIAkJaWYgKGNoaWxkcmVuID09IDMgfHwgRklCNl9TVUJUUkVFKGZuKQogI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCiAJCSAgICAvKiBTdWJ0cmVlIHJvb3QgKGkuZS4gZm4pIG1heSBoYXZlIG9uZSBjaGlsZCAqLwotCQkgICAgfHwgKGNoaWxkcmVuICYmIGZuLT5mbl9mbGFncyZSVE5fUk9PVCkKKwkJICAgIHx8IChjaGlsZHJlbiAmJiBmbi0+Zm5fZmxhZ3MgJiBSVE5fUk9PVCkKICNlbmRpZgogCQkgICAgKSB7CiAJCQlmbi0+bGVhZiA9IGZpYjZfZmluZF9wcmVmaXgobmV0LCBmbik7CiAjaWYgUlQ2X0RFQlVHID49IDIKLQkJCWlmIChmbi0+bGVhZj09TlVMTCkgeworCQkJaWYgKCFmbi0+bGVhZikgewogCQkJCVdBUk5fT04oIWZuLT5sZWFmKTsKIAkJCQlmbi0+bGVhZiA9IG5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeTsKIAkJCX0KQEAgLTEwNTgsNyArMTE0MCw3IEBACiAKIAkJcmVhZF9sb2NrKCZmaWI2X3dhbGtlcl9sb2NrKTsKIAkJRk9SX1dBTEtFUlModykgewotCQkJaWYgKGNoaWxkID09IE5VTEwpIHsKKwkJCWlmICghY2hpbGQpIHsKIAkJCQlpZiAody0+cm9vdCA9PSBmbikgewogCQkJCQl3LT5yb290ID0gdy0+bm9kZSA9IE5VTEw7CiAJCQkJCVJUNl9UUkFDRSgiVyAlcCBhZGp1c3RlZCBieSBkZWxyb290IDFcbiIsIHcpOwpAQCAtMTA4Nyw3ICsxMTY5LDcgQEAKIAkJcmVhZF91bmxvY2soJmZpYjZfd2Fsa2VyX2xvY2spOwogCiAJCW5vZGVfZnJlZShmbik7Ci0JCWlmIChwbi0+Zm5fZmxhZ3MmUlROX1JUSU5GTyB8fCBGSUI2X1NVQlRSRUUocG4pKQorCQlpZiAocG4tPmZuX2ZsYWdzICYgUlROX1JUSU5GTyB8fCBGSUI2X1NVQlRSRUUocG4pKQogCQkJcmV0dXJuIHBuOwogCiAJCXJ0Nl9yZWxlYXNlKHBuLT5sZWFmKTsKQEAgLTExMjEsNyArMTIwMyw3IEBACiAJCWlmICh3LT5zdGF0ZSA9PSBGV1NfQyAmJiB3LT5sZWFmID09IHJ0KSB7CiAJCQlSVDZfVFJBQ0UoIndhbGtlciAlcCBhZGp1c3RlZCBieSBkZWxyb3V0ZVxuIiwgdyk7CiAJCQl3LT5sZWFmID0gcnQtPmRzdC5ydDZfbmV4dDsKLQkJCWlmICh3LT5sZWFmID09IE5VTEwpCisJCQlpZiAoIXctPmxlYWYpCiAJCQkJdy0+c3RhdGUgPSBGV1NfVTsKIAkJfQogCX0KQEAgLTExMzAsNyArMTIxMiw3IEBACiAJcnQtPmRzdC5ydDZfbmV4dCA9IE5VTEw7CiAKIAkvKiBJZiBpdCB3YXMgbGFzdCByb3V0ZSwgZXhwdW5nZSBpdHMgcmFkaXggdHJlZSBub2RlICovCi0JaWYgKGZuLT5sZWFmID09IE5VTEwpIHsKKwlpZiAoIWZuLT5sZWFmKSB7CiAJCWZuLT5mbl9mbGFncyAmPSB+UlROX1JUSU5GTzsKIAkJbmV0LT5pcHY2LnJ0Nl9zdGF0cy0+ZmliX3JvdXRlX25vZGVzLS07CiAJCWZuID0gZmliNl9yZXBhaXJfdHJlZShuZXQsIGZuKTsKQEAgLTExNDQsNyArMTIyNiw3IEBACiAJCSAqIHRvIHN0aWxsIGFsaXZlIG9uZXMuCiAJCSAqLwogCQl3aGlsZSAoZm4pIHsKLQkJCWlmICghKGZuLT5mbl9mbGFncyZSVE5fUlRJTkZPKSAmJiBmbi0+bGVhZiA9PSBydCkgeworCQkJaWYgKCEoZm4tPmZuX2ZsYWdzICYgUlROX1JUSU5GTykgJiYgZm4tPmxlYWYgPT0gcnQpIHsKIAkJCQlmbi0+bGVhZiA9IGZpYjZfZmluZF9wcmVmaXgobmV0LCBmbik7CiAJCQkJYXRvbWljX2luYygmZm4tPmxlYWYtPnJ0NmlfcmVmKTsKIAkJCQlydDZfcmVsZWFzZShydCk7CkBAIC0xMTcxLDE3ICsxMjUzLDE3IEBACiAJCXJldHVybiAtRU5PRU5UOwogCX0KICNlbmRpZgotCWlmIChmbiA9PSBOVUxMIHx8IHJ0ID09IG5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeSkKKwlpZiAoIWZuIHx8IHJ0ID09IG5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeSkKIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAlXQVJOX09OKCEoZm4tPmZuX2ZsYWdzICYgUlROX1JUSU5GTykpOwogCi0JaWYgKCEocnQtPnJ0NmlfZmxhZ3MmUlRGX0NBQ0hFKSkgeworCWlmICghKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0NBQ0hFKSkgewogCQlzdHJ1Y3QgZmliNl9ub2RlICpwbiA9IGZuOwogI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCiAJCS8qIGNsb25lcyBvZiB0aGlzIHJvdXRlIG1pZ2h0IGJlIGluIGFub3RoZXIgc3VidHJlZSAqLwogCQlpZiAocnQtPnJ0Nmlfc3JjLnBsZW4pIHsKLQkJCXdoaWxlICghKHBuLT5mbl9mbGFncyZSVE5fUk9PVCkpCisJCQl3aGlsZSAoIShwbi0+Zm5fZmxhZ3MgJiBSVE5fUk9PVCkpCiAJCQkJcG4gPSBwbi0+cGFyZW50OwogCQkJcG4gPSBwbi0+cGFyZW50OwogCQl9CkBAIC0xMjMyLDExICsxMzE0LDExIEBACiAKIAlmb3IgKDs7KSB7CiAJCWZuID0gdy0+bm9kZTsKLQkJaWYgKGZuID09IE5VTEwpCisJCWlmICghZm4pCiAJCQlyZXR1cm4gMDsKIAogCQlpZiAody0+cHJ1bmUgJiYgZm4gIT0gdy0+cm9vdCAmJgotCQkgICAgZm4tPmZuX2ZsYWdzJlJUTl9SVElORk8gJiYgdy0+c3RhdGUgPCBGV1NfQykgeworCQkgICAgZm4tPmZuX2ZsYWdzICYgUlROX1JUSU5GTyAmJiB3LT5zdGF0ZSA8IEZXU19DKSB7CiAJCQl3LT5zdGF0ZSA9IEZXU19DOwogCQkJdy0+bGVhZiA9IGZuLT5sZWFmOwogCQl9CkBAIC0xMjY1LDcgKzEzNDcsNyBAQAogCQkJdy0+c3RhdGUgPSBGV1NfQzsKIAkJCXctPmxlYWYgPSBmbi0+bGVhZjsKIAkJY2FzZSBGV1NfQzoKLQkJCWlmICh3LT5sZWFmICYmIGZuLT5mbl9mbGFncyZSVE5fUlRJTkZPKSB7CisJCQlpZiAody0+bGVhZiAmJiBmbi0+Zm5fZmxhZ3MgJiBSVE5fUlRJTkZPKSB7CiAJCQkJaW50IGVycjsKIAogCQkJCWlmICh3LT5jb3VudCA8IHctPnNraXApIHsKQEAgLTEzODAsNiArMTQ2MiwyNiBAQAogCWZpYjZfd2FsaygmYy53KTsKIH0KIAordm9pZCBmaWI2X2NsZWFuX2FsbF9ybyhzdHJ1Y3QgbmV0ICpuZXQsIGludCAoKmZ1bmMpKHN0cnVjdCBydDZfaW5mbyAqLCB2b2lkICphcmcpLAorCQkgICAgaW50IHBydW5lLCB2b2lkICphcmcpCit7CisJc3RydWN0IGZpYjZfdGFibGUgKnRhYmxlOworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXVuc2lnbmVkIGludCBoOworCisJcmN1X3JlYWRfbG9jaygpOworCWZvciAoaCA9IDA7IGggPCBGSUI2X1RBQkxFX0hBU0hTWjsgaCsrKSB7CisJCWhlYWQgPSAmbmV0LT5pcHY2LmZpYl90YWJsZV9oYXNoW2hdOworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UodGFibGUsIG5vZGUsIGhlYWQsIHRiNl9obGlzdCkgeworCQkJcmVhZF9sb2NrX2JoKCZ0YWJsZS0+dGI2X2xvY2spOworCQkJZmliNl9jbGVhbl90cmVlKG5ldCwgJnRhYmxlLT50YjZfcm9vdCwKKwkJCQkJZnVuYywgcHJ1bmUsIGFyZyk7CisJCQlyZWFkX3VubG9ja19iaCgmdGFibGUtPnRiNl9sb2NrKTsKKwkJfQorCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KIHZvaWQgZmliNl9jbGVhbl9hbGwoc3RydWN0IG5ldCAqbmV0LCBpbnQgKCpmdW5jKShzdHJ1Y3QgcnQ2X2luZm8gKiwgdm9pZCAqYXJnKSwKIAkJICAgIGludCBwcnVuZSwgdm9pZCAqYXJnKQogewpAQCAtMTQzOSw4ICsxNTQxLDggQEAKIAkgKglvbmx5IGlmIHRoZXkgYXJlIG5vdCBpbiB1c2Ugbm93LgogCSAqLwogCi0JaWYgKHJ0LT5ydDZpX2ZsYWdzJlJURl9FWFBJUkVTICYmIHJ0LT5ydDZpX2V4cGlyZXMpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIobm93LCBydC0+cnQ2aV9leHBpcmVzKSkgeworCWlmIChydC0+cnQ2aV9mbGFncyAmIFJURl9FWFBJUkVTICYmIHJ0LT5kc3QuZXhwaXJlcykgeworCQlpZiAodGltZV9hZnRlcihub3csIHJ0LT5kc3QuZXhwaXJlcykpIHsKIAkJCVJUNl9UUkFDRSgiZXhwaXJpbmcgJXBcbiIsIHJ0KTsKIAkJCXJldHVybiAtMTsKIAkJfQpAQCAtMTQ1MSw3ICsxNTUzLDcgQEAKIAkJCVJUNl9UUkFDRSgiYWdpbmcgY2xvbmUgJXBcbiIsIHJ0KTsKIAkJCXJldHVybiAtMTsKIAkJfSBlbHNlIGlmICgocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfR0FURVdBWSkgJiYKLQkJCSAgICghKGRzdF9nZXRfbmVpZ2hib3VyX3JhdygmcnQtPmRzdCktPmZsYWdzICYgTlRGX1JPVVRFUikpKSB7CisJCQkgICAoIShkc3RfZ2V0X25laWdoYm91cl9ub3JlZl9yYXcoJnJ0LT5kc3QpLT5mbGFncyAmIE5URl9ST1VURVIpKSkgewogCQkJUlQ2X1RSQUNFKCJwdXJnaW5nIHJvdXRlICVwIHZpYSBub24tcm91dGVyIGJ1dCBnYXRld2F5XG4iLAogCQkJCSAgcnQpOwogCQkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jIGIvbmV0L2lwdjYvaXA2X2Zsb3dsYWJlbC5jCmluZGV4IDQ1NjZkYmQuLmI3ODY3YTEgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9mbG93bGFiZWwuYworKysgYi9uZXQvaXB2Ni9pcDZfZmxvd2xhYmVsLmMKQEAgLTM4Niw3ICszODYsNyBAQAogCQllcnIgPSAtRUlOVkFMOwogCQlnb3RvIGRvbmU7CiAJfQotCWlwdjZfYWRkcl9jb3B5KCZmbC0+ZHN0LCAmZnJlcS0+ZmxyX2RzdCk7CisJZmwtPmRzdCA9IGZyZXEtPmZscl9kc3Q7CiAJYXRvbWljX3NldCgmZmwtPnVzZXJzLCAxKTsKIAlzd2l0Y2ggKGZsLT5zaGFyZSkgewogCWNhc2UgSVBWNl9GTF9TX0VYQ0w6CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZfaW5wdXQuYyBiL25ldC9pcHY2L2lwNl9pbnB1dC5jCmluZGV4IGE0NmM2NGUuLjFjYTVkNDUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L2lwNl9pbnB1dC5jCisrKyBiL25ldC9pcHY2L2lwNl9pbnB1dC5jCkBAIC0yODAsNiArMjgwLDcgQEAKIAkJCXU4ICpwdHIgPSBza2JfbmV0d29ya19oZWFkZXIoc2tiKSArIG9wdC0+cmE7CiAJCQlzdHJ1Y3QgaWNtcDZoZHIgKmljbXA2OwogCQkJdTggbmV4dGhkciA9IGhkci0+bmV4dGhkcjsKKwkJCV9fYmUxNiBmcmFnX29mZjsKIAkJCWludCBvZmZzZXQ7CiAKIAkJCS8qIENoZWNrIGlmIHRoZSB2YWx1ZSBvZiBSb3V0ZXIgQWxlcnQKQEAgLTI5Myw3ICsyOTQsNyBAQAogCQkJCQlnb3RvIG91dDsKIAkJCQl9CiAJCQkJb2Zmc2V0ID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZigqaGRyKSwKLQkJCQkJCQkgICZuZXh0aGRyKTsKKwkJCQkJCQkgICZuZXh0aGRyLCAmZnJhZ19vZmYpOwogCQkJCWlmIChvZmZzZXQgPCAwKQogCQkJCQlnb3RvIG91dDsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvaXA2X291dHB1dC5jIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCmluZGV4IDg0ZDBiZDVjLi5kOTdlMDcxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfb3V0cHV0LmMKKysrIGIvbmV0L2lwdjYvaXA2X291dHB1dC5jCkBAIC0xMzYsNyArMTM2LDcgQEAKIAl9CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cihkc3QpOworCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoZHN0KTsKIAlpZiAobmVpZ2gpIHsKIAkJaW50IHJlcyA9IG5laWdoX291dHB1dChuZWlnaCwgc2tiKTsKIApAQCAtMjM4LDggKzIzOCw4IEBACiAJaGRyLT5uZXh0aGRyID0gcHJvdG87CiAJaGRyLT5ob3BfbGltaXQgPSBobGltaXQ7CiAKLQlpcHY2X2FkZHJfY29weSgmaGRyLT5zYWRkciwgJmZsNi0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZoZHItPmRhZGRyLCBmaXJzdF9ob3ApOworCWhkci0+c2FkZHIgPSBmbDYtPnNhZGRyOworCWhkci0+ZGFkZHIgPSAqZmlyc3RfaG9wOwogCiAJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKIAlza2ItPm1hcmsgPSBzay0+c2tfbWFyazsKQEAgLTI5MCw4ICsyOTAsOCBAQAogCWhkci0+bmV4dGhkciA9IHByb3RvOwogCWhkci0+aG9wX2xpbWl0ID0gbnAtPmhvcF9saW1pdDsKIAotCWlwdjZfYWRkcl9jb3B5KCZoZHItPnNhZGRyLCBzYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmhkci0+ZGFkZHIsIGRhZGRyKTsKKwloZHItPnNhZGRyID0gKnNhZGRyOworCWhkci0+ZGFkZHIgPSAqZGFkZHI7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMyOSwxMCArMzI5LDExIEBACiB7CiAJc3RydWN0IGlwdjZoZHIgKmhkciA9IGlwdjZfaGRyKHNrYik7CiAJdTggbmV4dGhkciA9IGhkci0+bmV4dGhkcjsKKwlfX2JlMTYgZnJhZ19vZmY7CiAJaW50IG9mZnNldDsKIAogCWlmIChpcHY2X2V4dF9oZHIobmV4dGhkcikpIHsKLQkJb2Zmc2V0ID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZigqaGRyKSwgJm5leHRoZHIpOworCQlvZmZzZXQgPSBpcHY2X3NraXBfZXh0aGRyKHNrYiwgc2l6ZW9mKCpoZHIpLCAmbmV4dGhkciwgJmZyYWdfb2ZmKTsKIAkJaWYgKG9mZnNldCA8IDApCiAJCQlyZXR1cm4gMDsKIAl9IGVsc2UKQEAgLTQ2Miw3ICs0NjMsNyBAQAogCSAgIHNlbmQgcmVkaXJlY3RzIHRvIHNvdXJjZSByb3V0ZWQgZnJhbWVzLgogCSAgIFdlIGRvbid0IHNlbmQgcmVkaXJlY3RzIHRvIGZyYW1lcyBkZWNhcHN1bGF0ZWQgZnJvbSBJUHNlYy4KIAkgKi8KLQluID0gZHN0X2dldF9uZWlnaGJvdXIoZHN0KTsKKwluID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoZHN0KTsKIAlpZiAoc2tiLT5kZXYgPT0gZHN0LT5kZXYgJiYgbiAmJiBvcHQtPnNyY3J0ID09IDAgJiYgIXNrYl9zZWNfcGF0aChza2IpKSB7CiAJCXN0cnVjdCBpbjZfYWRkciAqdGFyZ2V0ID0gTlVMTDsKIAkJc3RydWN0IHJ0Nl9pbmZvICpydDsKQEAgLTYwMyw3ICs2MDQsNyBAQAogCXN0YXRpYyBhdG9taWNfdCBpcHY2X2ZyYWdtZW50YXRpb25faWQ7CiAJaW50IG9sZCwgbmV3OwogCi0JaWYgKHJ0KSB7CisJaWYgKHJ0ICYmICEocnQtPmRzdC5mbGFncyAmIERTVF9OT1BFRVIpKSB7CiAJCXN0cnVjdCBpbmV0X3BlZXIgKnBlZXI7CiAKIAkJaWYgKCFydC0+cnQ2aV9wZWVyKQpAQCAtNjMxLDYgKzYzMiw3IEBACiAJc3RydWN0IGlwdjZoZHIgKnRtcF9oZHI7CiAJc3RydWN0IGZyYWdfaGRyICpmaDsKIAl1bnNpZ25lZCBpbnQgbXR1LCBobGVuLCBsZWZ0LCBsZW47CisJaW50IGhyb29tLCB0cm9vbTsKIAlfX2JlMzIgZnJhZ19pZCA9IDA7CiAJaW50IHB0ciwgb2Zmc2V0ID0gMCwgZXJyPTA7CiAJdTggKnByZXZoZHIsIG5leHRoZHIgPSAwOwpAQCAtNzk3LDYgKzc5OSw4IEBACiAJICovCiAKIAkqcHJldmhkciA9IE5FWFRIRFJfRlJBR01FTlQ7CisJaHJvb20gPSBMTF9SRVNFUlZFRF9TUEFDRShydC0+ZHN0LmRldik7CisJdHJvb20gPSBydC0+ZHN0LmRldi0+bmVlZGVkX3RhaWxyb29tOwogCiAJLyoKIAkgKglLZWVwIGNvcHlpbmcgZGF0YSB1bnRpbCB3ZSBydW4gb3V0LgpAQCAtODE1LDcgKzgxOSw4IEBACiAJCSAqCUFsbG9jYXRlIGJ1ZmZlci4KIAkJICovCiAKLQkJaWYgKChmcmFnID0gYWxsb2Nfc2tiKGxlbitobGVuK3NpemVvZihzdHJ1Y3QgZnJhZ19oZHIpK0xMX0FMTE9DQVRFRF9TUEFDRShydC0+ZHN0LmRldiksIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CisJCWlmICgoZnJhZyA9IGFsbG9jX3NrYihsZW4gKyBobGVuICsgc2l6ZW9mKHN0cnVjdCBmcmFnX2hkcikgKworCQkJCSAgICAgIGhyb29tICsgdHJvb20sIEdGUF9BVE9NSUMpKSA9PSBOVUxMKSB7CiAJCQlORVRERUJVRyhLRVJOX0lORk8gIklQdjY6IGZyYWc6IG5vIG1lbW9yeSBmb3IgbmV3IGZyYWdtZW50IVxuIik7CiAJCQlJUDZfSU5DX1NUQVRTKG5ldCwgaXA2X2RzdF9pZGV2KHNrYl9kc3Qoc2tiKSksCiAJCQkJICAgICAgSVBTVEFUU19NSUJfRlJBR0ZBSUxTKTsKQEAgLTgyOCw3ICs4MzMsNyBAQAogCQkgKi8KIAogCQlpcDZfY29weV9tZXRhZGF0YShmcmFnLCBza2IpOwotCQlza2JfcmVzZXJ2ZShmcmFnLCBMTF9SRVNFUlZFRF9TUEFDRShydC0+ZHN0LmRldikpOworCQlza2JfcmVzZXJ2ZShmcmFnLCBocm9vbSk7CiAJCXNrYl9wdXQoZnJhZywgbGVuICsgaGxlbiArIHNpemVvZihzdHJ1Y3QgZnJhZ19oZHIpKTsKIAkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKGZyYWcpOwogCQlmaCA9IChzdHJ1Y3QgZnJhZ19oZHIgKikoc2tiX25ldHdvcmtfaGVhZGVyKGZyYWcpICsgaGxlbik7CkBAIC05NzgsNyArOTgzLDcgQEAKIAkgKiBkc3QgZW50cnkgb2YgdGhlIG5leHRob3Agcm91dGVyCiAJICovCiAJcmN1X3JlYWRfbG9jaygpOwotCW4gPSBkc3RfZ2V0X25laWdoYm91cigqZHN0KTsKKwluID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoKmRzdCk7CiAJaWYgKG4gJiYgIShuLT5udWRfc3RhdGUgJiBOVURfVkFMSUQpKSB7CiAJCXN0cnVjdCBpbmV0Nl9pZmFkZHIgKmlmcDsKIAkJc3RydWN0IGZsb3dpNiBmbF9ndzY7CkBAIC0xMDU5LDcgKzEwNjQsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAJaWYgKGZpbmFsX2RzdCkKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi0+ZGFkZHIsIGZpbmFsX2RzdCk7CisJCWZsNi0+ZGFkZHIgPSAqZmluYWxfZHN0OwogCWlmIChjYW5fc2xlZXApCiAJCWZsNi0+Zmxvd2k2X2ZsYWdzIHw9IEZMT1dJX0ZMQUdfQ0FOX1NMRUVQOwogCkBAIC0xMDk1LDcgKzExMDAsNyBAQAogCWlmIChlcnIpCiAJCXJldHVybiBFUlJfUFRSKGVycik7CiAJaWYgKGZpbmFsX2RzdCkKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi0+ZGFkZHIsIGZpbmFsX2RzdCk7CisJCWZsNi0+ZGFkZHIgPSAqZmluYWxfZHN0OwogCWlmIChjYW5fc2xlZXApCiAJCWZsNi0+Zmxvd2k2X2ZsYWdzIHw9IEZMT1dJX0ZMQUdfQ0FOX1NMRUVQOwogCkBAIC0xNTg4LDcgKzE1OTMsNyBAQAogCWlmIChucC0+cG10dWRpc2MgPCBJUFY2X1BNVFVESVNDX0RPKQogCQlza2ItPmxvY2FsX2RmID0gMTsKIAotCWlwdjZfYWRkcl9jb3B5KGZpbmFsX2RzdCwgJmZsNi0+ZGFkZHIpOworCSpmaW5hbF9kc3QgPSBmbDYtPmRhZGRyOwogCV9fc2tiX3B1bGwoc2tiLCBza2JfbmV0d29ya19oZWFkZXJfbGVuKHNrYikpOwogCWlmIChvcHQgJiYgb3B0LT5vcHRfZmxlbikKIAkJaXB2Nl9wdXNoX2ZyYWdfb3B0cyhza2IsIG9wdCwgJnByb3RvKTsKQEAgLTE2MDQsOCArMTYwOSw4IEBACiAKIAloZHItPmhvcF9saW1pdCA9IG5wLT5jb3JrLmhvcF9saW1pdDsKIAloZHItPm5leHRoZHIgPSBwcm90bzsKLQlpcHY2X2FkZHJfY29weSgmaGRyLT5zYWRkciwgJmZsNi0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZoZHItPmRhZGRyLCBmaW5hbF9kc3QpOworCWhkci0+c2FkZHIgPSBmbDYtPnNhZGRyOworCWhkci0+ZGFkZHIgPSAqZmluYWxfZHN0OwogCiAJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKIAlza2ItPm1hcmsgPSBzay0+c2tfbWFyazsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L2lwNl90dW5uZWwuYyBiL25ldC9pcHY2L2lwNl90dW5uZWwuYwppbmRleCA0ZTJlOWZmLi5lMWY3NzYxIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYvaXA2X3R1bm5lbC5jCkBAIC05Myw3ICs5Myw3IEBACiAJdW5zaWduZWQgbG9uZwlyeF9ieXRlczsKIAl1bnNpZ25lZCBsb25nCXR4X3BhY2tldHM7CiAJdW5zaWduZWQgbG9uZwl0eF9ieXRlczsKLX07Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCpzaXplb2YodW5zaWduZWQgbG9uZykpKSk7CiAKIHN0YXRpYyBzdHJ1Y3QgbmV0X2RldmljZV9zdGF0cyAqaXA2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtNjUzLDggKzY1Myw4IEBACiAJCXJ0ID0gcnQ2X2xvb2t1cChkZXZfbmV0KHNrYi0+ZGV2KSwgJmlwdjZfaGRyKHNrYjIpLT5zYWRkciwKIAkJCQlOVUxMLCAwLCAwKTsKIAotCQlpZiAocnQgJiYgcnQtPnJ0NmlfZGV2KQotCQkJc2tiMi0+ZGV2ID0gcnQtPnJ0NmlfZGV2OworCQlpZiAocnQgJiYgcnQtPmRzdC5kZXYpCisJCQlza2IyLT5kZXYgPSBydC0+ZHN0LmRldjsKIAogCQlpY21wdjZfc2VuZChza2IyLCByZWxfdHlwZSwgcmVsX2NvZGUsIHJlbF9pbmZvKTsKIApAQCAtOTc5LDggKzk3OSw4IEBACiAJaXB2Nl9jaGFuZ2VfZHNmaWVsZChpcHY2aCwgfklORVRfRUNOX01BU0ssIGRzZmllbGQpOwogCWlwdjZoLT5ob3BfbGltaXQgPSB0LT5wYXJtcy5ob3BfbGltaXQ7CiAJaXB2NmgtPm5leHRoZHIgPSBwcm90bzsKLQlpcHY2X2FkZHJfY29weSgmaXB2NmgtPnNhZGRyLCAmZmw2LT5zYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwdjZoLT5kYWRkciwgJmZsNi0+ZGFkZHIpOworCWlwdjZoLT5zYWRkciA9IGZsNi0+c2FkZHI7CisJaXB2NmgtPmRhZGRyID0gZmw2LT5kYWRkcjsKIAluZl9yZXNldChza2IpOwogCXBrdF9sZW4gPSBza2ItPmxlbjsKIAllcnIgPSBpcDZfbG9jYWxfb3V0KHNrYik7CkBAIC0xMTU1LDggKzExNTUsOCBAQAogCW1lbWNweShkZXYtPmJyb2FkY2FzdCwgJnAtPnJhZGRyLCBzaXplb2Yoc3RydWN0IGluNl9hZGRyKSk7CiAKIAkvKiBTZXQgdXAgZmxvd2kgdGVtcGxhdGUgKi8KLQlpcHY2X2FkZHJfY29weSgmZmw2LT5zYWRkciwgJnAtPmxhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmZmw2LT5kYWRkciwgJnAtPnJhZGRyKTsKKwlmbDYtPnNhZGRyID0gcC0+bGFkZHI7CisJZmw2LT5kYWRkciA9IHAtPnJhZGRyOwogCWZsNi0+Zmxvd2k2X29pZiA9IHAtPmxpbms7CiAJZmw2LT5mbG93bGFiZWwgPSAwOwogCkBAIC0xMTg1LDExICsxMTg1LDExIEBACiAJCWlmIChydCA9PSBOVUxMKQogCQkJcmV0dXJuOwogCi0JCWlmIChydC0+cnQ2aV9kZXYpIHsKLQkJCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gcnQtPnJ0NmlfZGV2LT5oYXJkX2hlYWRlcl9sZW4gKworCQlpZiAocnQtPmRzdC5kZXYpIHsKKwkJCWRldi0+aGFyZF9oZWFkZXJfbGVuID0gcnQtPmRzdC5kZXYtPmhhcmRfaGVhZGVyX2xlbiArCiAJCQkJc2l6ZW9mIChzdHJ1Y3QgaXB2Nmhkcik7CiAKLQkJCWRldi0+bXR1ID0gcnQtPnJ0NmlfZGV2LT5tdHUgLSBzaXplb2YgKHN0cnVjdCBpcHY2aGRyKTsKKwkJCWRldi0+bXR1ID0gcnQtPmRzdC5kZXYtPm10dSAtIHNpemVvZiAoc3RydWN0IGlwdjZoZHIpOwogCQkJaWYgKCEodC0+cGFybXMuZmxhZ3MgJiBJUDZfVE5MX0ZfSUdOX0VOQ0FQX0xJTUlUKSkKIAkJCQlkZXYtPm10dS09ODsKIApAQCAtMTIxMiw4ICsxMjEyLDggQEAKIHN0YXRpYyBpbnQKIGlwNl90bmxfY2hhbmdlKHN0cnVjdCBpcDZfdG5sICp0LCBzdHJ1Y3QgaXA2X3RubF9wYXJtICpwKQogewotCWlwdjZfYWRkcl9jb3B5KCZ0LT5wYXJtcy5sYWRkciwgJnAtPmxhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmdC0+cGFybXMucmFkZHIsICZwLT5yYWRkcik7CisJdC0+cGFybXMubGFkZHIgPSBwLT5sYWRkcjsKKwl0LT5wYXJtcy5yYWRkciA9IHAtPnJhZGRyOwogCXQtPnBhcm1zLmZsYWdzID0gcC0+ZmxhZ3M7CiAJdC0+cGFybXMuaG9wX2xpbWl0ID0gcC0+aG9wX2xpbWl0OwogCXQtPnBhcm1zLmVuY2FwX2xpbWl0ID0gcC0+ZW5jYXBfbGltaXQ7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcDZtci5jIGIvbmV0L2lwdjYvaXA2bXIuYwppbmRleCA0NDlhOTE4Li5jN2U5NWM4IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9pcDZtci5jCisrKyBiL25ldC9pcHY2L2lwNm1yLmMKQEAgLTExMDUsOCArMTEwNSw4IEBACiAJCW1zZy0+aW02X21zZ3R5cGUgPSBNUlQ2TVNHX1dIT0xFUEtUOwogCQltc2ctPmltNl9taWYgPSBtcnQtPm1yb3V0ZV9yZWdfdmlmX251bTsKIAkJbXNnLT5pbTZfcGFkID0gMDsKLQkJaXB2Nl9hZGRyX2NvcHkoJm1zZy0+aW02X3NyYywgJmlwdjZfaGRyKHBrdCktPnNhZGRyKTsKLQkJaXB2Nl9hZGRyX2NvcHkoJm1zZy0+aW02X2RzdCwgJmlwdjZfaGRyKHBrdCktPmRhZGRyKTsKKwkJbXNnLT5pbTZfc3JjID0gaXB2Nl9oZHIocGt0KS0+c2FkZHI7CisJCW1zZy0+aW02X2RzdCA9IGlwdjZfaGRyKHBrdCktPmRhZGRyOwogCiAJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CiAJfSBlbHNlCkBAIC0xMTMxLDggKzExMzEsOCBAQAogCW1zZy0+aW02X21zZ3R5cGUgPSBhc3NlcnQ7CiAJbXNnLT5pbTZfbWlmID0gbWlmaTsKIAltc2ctPmltNl9wYWQgPSAwOwotCWlwdjZfYWRkcl9jb3B5KCZtc2ctPmltNl9zcmMsICZpcHY2X2hkcihwa3QpLT5zYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJm1zZy0+aW02X2RzdCwgJmlwdjZfaGRyKHBrdCktPmRhZGRyKTsKKwltc2ctPmltNl9zcmMgPSBpcHY2X2hkcihwa3QpLT5zYWRkcjsKKwltc2ctPmltNl9kc3QgPSBpcHY2X2hkcihwa3QpLT5kYWRkcjsKIAogCXNrYl9kc3Rfc2V0KHNrYiwgZHN0X2Nsb25lKHNrYl9kc3QocGt0KSkpOwogCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fVU5ORUNFU1NBUlk7CkBAIC0yMTgxLDggKzIxODEsOCBAQAogCQlpcGgtPnBheWxvYWRfbGVuID0gMDsKIAkJaXBoLT5uZXh0aGRyID0gSVBQUk9UT19OT05FOwogCQlpcGgtPmhvcF9saW1pdCA9IDA7Ci0JCWlwdjZfYWRkcl9jb3B5KCZpcGgtPnNhZGRyLCAmcnQtPnJ0Nmlfc3JjLmFkZHIpOwotCQlpcHY2X2FkZHJfY29weSgmaXBoLT5kYWRkciwgJnJ0LT5ydDZpX2RzdC5hZGRyKTsKKwkJaXBoLT5zYWRkciA9IHJ0LT5ydDZpX3NyYy5hZGRyOworCQlpcGgtPmRhZGRyID0gcnQtPnJ0NmlfZHN0LmFkZHI7CiAKIAkJZXJyID0gaXA2bXJfY2FjaGVfdW5yZXNvbHZlZChtcnQsIHZpZiwgc2tiMik7CiAJCXJlYWRfdW5sb2NrKCZtcnRfbG9jayk7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMgYi9uZXQvaXB2Ni9pcHY2X3NvY2tnbHVlLmMKaW5kZXggYzk5ZTNlZS4uMThhMjcxOSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvaXB2Nl9zb2NrZ2x1ZS5jCisrKyBiL25ldC9pcHY2L2lwdjZfc29ja2dsdWUuYwpAQCAtNDM1LDcgKzQzNSw3IEBACiAJCQlnb3RvIGVfaW52YWw7CiAKIAkJbnAtPnN0aWNreV9wa3RpbmZvLmlwaTZfaWZpbmRleCA9IHBrdC5pcGk2X2lmaW5kZXg7Ci0JCWlwdjZfYWRkcl9jb3B5KCZucC0+c3RpY2t5X3BrdGluZm8uaXBpNl9hZGRyLCAmcGt0LmlwaTZfYWRkcik7CisJCW5wLT5zdGlja3lfcGt0aW5mby5pcGk2X2FkZHIgPSBwa3QuaXBpNl9hZGRyOwogCQlyZXR2ID0gMDsKIAkJYnJlYWs7CiAJfQpAQCAtNTAzLDcgKzUwMyw3IEBACiAJCQlnb3RvIGVfaW52YWw7CiAJCWlmICh2YWwgPiAyNTUgfHwgdmFsIDwgLTEpCiAJCQlnb3RvIGVfaW52YWw7Ci0JCW5wLT5tY2FzdF9ob3BzID0gdmFsOworCQlucC0+bWNhc3RfaG9wcyA9ICh2YWwgPT0gLTEgPyBJUFY2X0RFRkFVTFRfTUNBU1RIT1BTIDogdmFsKTsKIAkJcmV0diA9IDA7CiAJCWJyZWFrOwogCkBAIC05ODAsOCArOTgwLDcgQEAKIAkJCQlzdHJ1Y3QgaW42X3BrdGluZm8gc3JjX2luZm87CiAJCQkJc3JjX2luZm8uaXBpNl9pZmluZGV4ID0gbnAtPm1jYXN0X29pZiA/IG5wLT5tY2FzdF9vaWYgOgogCQkJCQlucC0+c3RpY2t5X3BrdGluZm8uaXBpNl9pZmluZGV4OwotCQkJCW5wLT5tY2FzdF9vaWY/IGlwdjZfYWRkcl9jb3B5KCZzcmNfaW5mby5pcGk2X2FkZHIsICZucC0+ZGFkZHIpIDoKLQkJCQkJaXB2Nl9hZGRyX2NvcHkoJnNyY19pbmZvLmlwaTZfYWRkciwgJihucC0+c3RpY2t5X3BrdGluZm8uaXBpNl9hZGRyKSk7CisJCQkJc3JjX2luZm8uaXBpNl9hZGRyID0gbnAtPm1jYXN0X29pZiA/IG5wLT5kYWRkciA6IG5wLT5zdGlja3lfcGt0aW5mby5pcGk2X2FkZHI7CiAJCQkJcHV0X2Ntc2coJm1zZywgU09MX0lQVjYsIElQVjZfUEtUSU5GTywgc2l6ZW9mKHNyY19pbmZvKSwgJnNyY19pbmZvKTsKIAkJCX0KIAkJCWlmIChucC0+cnhvcHQuYml0cy5yeGhsaW0pIHsKQEAgLTk5Miw4ICs5OTEsNyBAQAogCQkJCXN0cnVjdCBpbjZfcGt0aW5mbyBzcmNfaW5mbzsKIAkJCQlzcmNfaW5mby5pcGk2X2lmaW5kZXggPSBucC0+bWNhc3Rfb2lmID8gbnAtPm1jYXN0X29pZiA6CiAJCQkJCW5wLT5zdGlja3lfcGt0aW5mby5pcGk2X2lmaW5kZXg7Ci0JCQkJbnAtPm1jYXN0X29pZj8gaXB2Nl9hZGRyX2NvcHkoJnNyY19pbmZvLmlwaTZfYWRkciwgJm5wLT5kYWRkcikgOgotCQkJCQlpcHY2X2FkZHJfY29weSgmc3JjX2luZm8uaXBpNl9hZGRyLCAmKG5wLT5zdGlja3lfcGt0aW5mby5pcGk2X2FkZHIpKTsKKwkJCQlzcmNfaW5mby5pcGk2X2FkZHIgPSBucC0+bWNhc3Rfb2lmID8gbnAtPmRhZGRyIDogbnAtPnN0aWNreV9wa3RpbmZvLmlwaTZfYWRkcjsKIAkJCQlwdXRfY21zZygmbXNnLCBTT0xfSVBWNiwgSVBWNl8yMjkyUEtUSU5GTywgc2l6ZW9mKHNyY19pbmZvKSwgJnNyY19pbmZvKTsKIAkJCX0KIAkJCWlmIChucC0+cnhvcHQuYml0cy5yeG9obGltKSB7CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9tY2FzdC5jIGIvbmV0L2lwdjYvbWNhc3QuYwppbmRleCBlZTc4MzlmLi5iODUzZjA2IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9tY2FzdC5jCisrKyBiL25ldC9pcHY2L21jYXN0LmMKQEAgLTE1NSwxNCArMTU1LDE0IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJbWNfbHN0LT5uZXh0ID0gTlVMTDsKLQlpcHY2X2FkZHJfY29weSgmbWNfbHN0LT5hZGRyLCBhZGRyKTsKKwltY19sc3QtPmFkZHIgPSAqYWRkcjsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlpZiAoaWZpbmRleCA9PSAwKSB7CiAJCXN0cnVjdCBydDZfaW5mbyAqcnQ7CiAJCXJ0ID0gcnQ2X2xvb2t1cChuZXQsIGFkZHIsIE5VTEwsIDAsIDApOwogCQlpZiAocnQpIHsKLQkJCWRldiA9IHJ0LT5ydDZpX2RldjsKKwkJCWRldiA9IHJ0LT5kc3QuZGV2OwogCQkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwogCQl9CiAJfSBlbHNlCkBAIC0yNTYsNyArMjU2LDcgQEAKIAkJc3RydWN0IHJ0Nl9pbmZvICpydCA9IHJ0Nl9sb29rdXAobmV0LCBncm91cCwgTlVMTCwgMCwgMCk7CiAKIAkJaWYgKHJ0KSB7Ci0JCQlkZXYgPSBydC0+cnQ2aV9kZXY7CisJCQlkZXYgPSBydC0+ZHN0LmRldjsKIAkJCWRldl9ob2xkKGRldik7CiAJCQlkc3RfcmVsZWFzZSgmcnQtPmRzdCk7CiAJCX0KQEAgLTg1OCw3ICs4NTgsNyBAQAogCiAJc2V0dXBfdGltZXIoJm1jLT5tY2FfdGltZXIsIGlnbXA2X3RpbWVyX2hhbmRsZXIsICh1bnNpZ25lZCBsb25nKW1jKTsKIAotCWlwdjZfYWRkcl9jb3B5KCZtYy0+bWNhX2FkZHIsIGFkZHIpOworCW1jLT5tY2FfYWRkciA9ICphZGRyOwogCW1jLT5pZGV2ID0gaWRldjsgLyogKHJlZmVyZW5jZSB0YWtlbikgKi8KIAltYy0+bWNhX3VzZXJzID0gMTsKIAkvKiBtY2Ffc3RhbXAgc2hvdWxkIGJlIHVwZGF0ZWQgdXBvbiBjaGFuZ2VzICovCkBAIC0xMzQzLDEzICsxMzQzLDE1IEBACiAJc3RydWN0IG1sZDJfcmVwb3J0ICpwbXI7CiAJc3RydWN0IGluNl9hZGRyIGFkZHJfYnVmOwogCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc2FkZHI7CisJaW50IGhsZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOworCWludCB0bGVuID0gZGV2LT5uZWVkZWRfdGFpbHJvb207CiAJaW50IGVycjsKIAl1OCByYVs4XSA9IHsgSVBQUk9UT19JQ01QVjYsIDAsCiAJCSAgICAgSVBWNl9UTFZfUk9VVEVSQUxFUlQsIDIsIDAsIDAsCiAJCSAgICAgSVBWNl9UTFZfUEFETiwgMCB9OwogCiAJLyogd2UgYXNzdW1lIHNpemUgPiBzaXplb2YocmEpIGhlcmUgKi8KLQlzaXplICs9IExMX0FMTE9DQVRFRF9TUEFDRShkZXYpOworCXNpemUgKz0gaGxlbiArIHRsZW47CiAJLyogbGltaXQgb3VyIGFsbG9jYXRpb25zIHRvIG9yZGVyLTAgcGFnZSAqLwogCXNpemUgPSBtaW5fdChpbnQsIHNpemUsIFNLQl9NQVhfT1JERVIoMCwgMCkpOwogCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIHNpemUsIDEsICZlcnIpOwpAQCAtMTM1Nyw3ICsxMzU5LDcgQEAKIAlpZiAoIXNrYikKIAkJcmV0dXJuIE5VTEw7CiAKLQlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOworCXNrYl9yZXNlcnZlKHNrYiwgaGxlbik7CiAKIAlpZiAoaXB2Nl9nZXRfbGxhZGRyKGRldiwgJmFkZHJfYnVmLCBJRkFfRl9URU5UQVRJVkUpKSB7CiAJCS8qIDxkcmFmdC1pZXRmLW1hZ21hLW1sZC1zb3VyY2UtMDUudHh0PjoKQEAgLTE0MDgsMTggKzE0MTAsMTEgQEAKIAkJCQkJICAgY3N1bV9wYXJ0aWFsKHNrYl90cmFuc3BvcnRfaGVhZGVyKHNrYiksCiAJCQkJCQkJbWxkbGVuLCAwKSk7CiAKLQlkc3QgPSBpY21wNl9kc3RfYWxsb2Moc2tiLT5kZXYsIE5VTEwsICZpcHY2X2hkcihza2IpLT5kYWRkcik7Ci0KLQlpZiAoIWRzdCkgewotCQllcnIgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9vdXQ7Ci0JfQotCiAJaWNtcHY2X2Zsb3dfaW5pdChuZXQtPmlwdjYuaWdtcF9zaywgJmZsNiwgSUNNUFY2X01MRDJfUkVQT1JULAogCQkJICZpcHY2X2hkcihza2IpLT5zYWRkciwgJmlwdjZfaGRyKHNrYiktPmRhZGRyLAogCQkJIHNrYi0+ZGV2LT5pZmluZGV4KTsKKwlkc3QgPSBpY21wNl9kc3RfYWxsb2Moc2tiLT5kZXYsIE5VTEwsICZmbDYpOwogCi0JZHN0ID0geGZybV9sb29rdXAobmV0LCBkc3QsIGZsb3dpNl90b19mbG93aSgmZmw2KSwgTlVMTCwgMCk7CiAJZXJyID0gMDsKIAlpZiAoSVNfRVJSKGRzdCkpIHsKIAkJZXJyID0gUFRSX0VSUihkc3QpOwpAQCAtMTcyMyw2ICsxNzE4LDggQEAKIAlzdHJ1Y3QgbWxkX21zZyAqaGRyOwogCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqc25kX2FkZHIsICpzYWRkcjsKIAlzdHJ1Y3QgaW42X2FkZHIgYWRkcl9idWY7CisJaW50IGhsZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOworCWludCB0bGVuID0gZGV2LT5uZWVkZWRfdGFpbHJvb207CiAJaW50IGVyciwgbGVuLCBwYXlsb2FkX2xlbiwgZnVsbF9sZW47CiAJdTggcmFbOF0gPSB7IElQUFJPVE9fSUNNUFY2LCAwLAogCQkgICAgIElQVjZfVExWX1JPVVRFUkFMRVJULCAyLCAwLCAwLApAQCAtMTc0NCw3ICsxNzQxLDcgQEAKIAkJICAgICAgSVBTVEFUU19NSUJfT1VULCBmdWxsX2xlbik7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKLQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBMTF9BTExPQ0FURURfU1BBQ0UoZGV2KSArIGZ1bGxfbGVuLCAxLCAmZXJyKTsKKwlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBobGVuICsgdGxlbiArIGZ1bGxfbGVuLCAxLCAmZXJyKTsKIAogCWlmIChza2IgPT0gTlVMTCkgewogCQlyY3VfcmVhZF9sb2NrKCk7CkBAIC0xNzU0LDcgKzE3NTEsNyBAQAogCQlyZXR1cm47CiAJfQogCi0Jc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKwlza2JfcmVzZXJ2ZShza2IsIGhsZW4pOwogCiAJaWYgKGlwdjZfZ2V0X2xsYWRkcihkZXYsICZhZGRyX2J1ZiwgSUZBX0ZfVEVOVEFUSVZFKSkgewogCQkvKiA8ZHJhZnQtaWV0Zi1tYWdtYS1tbGQtc291cmNlLTA1LnR4dD46CkBAIC0xNzcyLDcgKzE3NjksNyBAQAogCWhkciA9IChzdHJ1Y3QgbWxkX21zZyAqKSBza2JfcHV0KHNrYiwgc2l6ZW9mKHN0cnVjdCBtbGRfbXNnKSk7CiAJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKHN0cnVjdCBtbGRfbXNnKSk7CiAJaGRyLT5tbGRfdHlwZSA9IHR5cGU7Ci0JaXB2Nl9hZGRyX2NvcHkoJmhkci0+bWxkX21jYSwgYWRkcik7CisJaGRyLT5tbGRfbWNhID0gKmFkZHI7CiAKIAloZHItPm1sZF9ja3N1bSA9IGNzdW1faXB2Nl9tYWdpYyhzYWRkciwgc25kX2FkZHIsIGxlbiwKIAkJCQkJIElQUFJPVE9fSUNNUFY2LApAQCAtMTc4MSwxNyArMTc3OCwxMCBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAlpZGV2ID0gX19pbjZfZGV2X2dldChza2ItPmRldik7CiAKLQlkc3QgPSBpY21wNl9kc3RfYWxsb2Moc2tiLT5kZXYsIE5VTEwsICZpcHY2X2hkcihza2IpLT5kYWRkcik7Ci0JaWYgKCFkc3QpIHsKLQkJZXJyID0gLUVOT01FTTsKLQkJZ290byBlcnJfb3V0OwotCX0KLQogCWljbXB2Nl9mbG93X2luaXQoc2ssICZmbDYsIHR5cGUsCiAJCQkgJmlwdjZfaGRyKHNrYiktPnNhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCiAJCQkgc2tiLT5kZXYtPmlmaW5kZXgpOwotCi0JZHN0ID0geGZybV9sb29rdXAobmV0LCBkc3QsIGZsb3dpNl90b19mbG93aSgmZmw2KSwgTlVMTCwgMCk7CisJZHN0ID0gaWNtcDZfZHN0X2FsbG9jKHNrYi0+ZGV2LCBOVUxMLCAmZmw2KTsKIAlpZiAoSVNfRVJSKGRzdCkpIHsKIAkJZXJyID0gUFRSX0VSUihkc3QpOwogCQlnb3RvIGVycl9vdXQ7CkBAIC0xOTE0LDcgKzE5MDQsNyBAQAogICogQWRkIG11bHRpY2FzdCBzaW5nbGUtc291cmNlIGZpbHRlciB0byB0aGUgaW50ZXJmYWNlIGxpc3QKICAqLwogc3RhdGljIGludCBpcDZfbWNfYWRkMV9zcmMoc3RydWN0IGlmbWNhZGRyNiAqcG1jLCBpbnQgc2Ztb2RlLAotCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqcHNmc3JjLCBpbnQgZGVsdGEpCisJY29uc3Qgc3RydWN0IGluNl9hZGRyICpwc2ZzcmMpCiB7CiAJc3RydWN0IGlwNl9zZl9saXN0ICpwc2YsICpwc2ZfcHJldjsKIApAQCAtMjA0NSw3ICsyMDM1LDcgQEAKIAkJcG1jLT5tY2Ffc2Zjb3VudFtzZm1vZGVdKys7CiAJZXJyID0gMDsKIAlmb3IgKGk9MDsgaTxzZmNvdW50OyBpKyspIHsKLQkJZXJyID0gaXA2X21jX2FkZDFfc3JjKHBtYywgc2Ztb2RlLCAmcHNmc3JjW2ldLCBkZWx0YSk7CisJCWVyciA9IGlwNl9tY19hZGQxX3NyYyhwbWMsIHNmbW9kZSwgJnBzZnNyY1tpXSk7CiAJCWlmIChlcnIpCiAJCQlicmVhazsKIAl9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9taXA2LmMgYi9uZXQvaXB2Ni9taXA2LmMKaW5kZXggNDMyNDJlNi4uN2UxZTBmYiAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbWlwNi5jCisrKyBiL25ldC9pcHY2L21pcDYuYwpAQCAtMTk1LDggKzE5NSw4IEBACiAJCW1pcDZfcmVwb3J0X3JsLnN0YW1wLnR2X3NlYyA9IHN0YW1wLT50dl9zZWM7CiAJCW1pcDZfcmVwb3J0X3JsLnN0YW1wLnR2X3VzZWMgPSBzdGFtcC0+dHZfdXNlYzsKIAkJbWlwNl9yZXBvcnRfcmwuaWlmID0gaWlmOwotCQlpcHY2X2FkZHJfY29weSgmbWlwNl9yZXBvcnRfcmwuc3JjLCBzcmMpOwotCQlpcHY2X2FkZHJfY29weSgmbWlwNl9yZXBvcnRfcmwuZHN0LCBkc3QpOworCQltaXA2X3JlcG9ydF9ybC5zcmMgPSAqc3JjOworCQltaXA2X3JlcG9ydF9ybC5kc3QgPSAqZHN0OwogCQlhbGxvdyA9IDE7CiAJfQogCXNwaW5fdW5sb2NrX2JoKCZtaXA2X3JlcG9ydF9ybC5sb2NrKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25kaXNjLmMgYi9uZXQvaXB2Ni9uZGlzYy5jCmluZGV4IDQ0ZTViN2YuLmQ4ZjAyZWYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25kaXNjLmMKKysrIGIvbmV0L2lwdjYvbmRpc2MuYwpAQCAtOTMsNyArOTMsNyBAQAogCiBzdGF0aWMgdTMyIG5kaXNjX2hhc2goY29uc3Qgdm9pZCAqcGtleSwKIAkJICAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKLQkJICAgICAgX191MzIgcm5kKTsKKwkJICAgICAgX191MzIgKmhhc2hfcm5kKTsKIHN0YXRpYyBpbnQgbmRpc2NfY29uc3RydWN0b3Ioc3RydWN0IG5laWdoYm91ciAqbmVpZ2gpOwogc3RhdGljIHZvaWQgbmRpc2Nfc29saWNpdChzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwgc3RydWN0IHNrX2J1ZmYgKnNrYik7CiBzdGF0aWMgdm9pZCBuZGlzY19lcnJvcl9yZXBvcnQoc3RydWN0IG5laWdoYm91ciAqbmVpZ2gsIHN0cnVjdCBza19idWZmICpza2IpOwpAQCAtMTI2LDcgKzEyNiw2IEBACiAKIHN0cnVjdCBuZWlnaF90YWJsZSBuZF90YmwgPSB7CiAJLmZhbWlseSA9CUFGX0lORVQ2LAotCS5lbnRyeV9zaXplID0Jc2l6ZW9mKHN0cnVjdCBuZWlnaGJvdXIpICsgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksCiAJLmtleV9sZW4gPQlzaXplb2Yoc3RydWN0IGluNl9hZGRyKSwKIAkuaGFzaCA9CQluZGlzY19oYXNoLAogCS5jb25zdHJ1Y3RvciA9CW5kaXNjX2NvbnN0cnVjdG9yLApAQCAtMTQxLDcgKzE0MCw3IEBACiAJCS5nY19zdGFsZXRpbWUJCT0gNjAgKiBIWiwKIAkJLnJlYWNoYWJsZV90aW1lCQk9IE5EX1JFQUNIQUJMRV9USU1FLAogCQkuZGVsYXlfcHJvYmVfdGltZQk9IDUgKiBIWiwKLQkJLnF1ZXVlX2xlbgkJPSAzLAorCQkucXVldWVfbGVuX2J5dGVzCT0gNjQqMTAyNCwKIAkJLnVjYXN0X3Byb2JlcwkJPSAzLAogCQkubWNhc3RfcHJvYmVzCQk9IDMsCiAJCS5hbnljYXN0X2RlbGF5CQk9IDEgKiBIWiwKQEAgLTM1MCwxNiArMzQ5LDkgQEAKIAogc3RhdGljIHUzMiBuZGlzY19oYXNoKGNvbnN0IHZvaWQgKnBrZXksCiAJCSAgICAgIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCi0JCSAgICAgIF9fdTMyIGhhc2hfcm5kKQorCQkgICAgICBfX3UzMiAqaGFzaF9ybmQpCiB7Ci0JY29uc3QgdTMyICpwMzIgPSBwa2V5OwotCXUzMiBhZGRyX2hhc2gsIGk7Ci0KLQlhZGRyX2hhc2ggPSAwOwotCWZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikgLyBzaXplb2YodTMyKSk7IGkrKykKLQkJYWRkcl9oYXNoIF49ICpwMzIrKzsKLQotCXJldHVybiBqaGFzaF8yd29yZHMoYWRkcl9oYXNoLCBkZXYtPmlmaW5kZXgsIGhhc2hfcm5kKTsKKwlyZXR1cm4gbmRpc2NfaGFzaGZuKHBrZXksIGRldiwgaGFzaF9ybmQpOwogfQogCiBzdGF0aWMgaW50IG5kaXNjX2NvbnN0cnVjdG9yKHN0cnVjdCBuZWlnaGJvdXIgKm5laWdoKQpAQCAtNDQ2LDYgKzQzOCw4IEBACiAJc3RydWN0IHNvY2sgKnNrID0gbmV0LT5pcHY2Lm5kaXNjX3NrOwogCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGljbXA2aGRyICpoZHI7CisJaW50IGhsZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOworCWludCB0bGVuID0gZGV2LT5uZWVkZWRfdGFpbHJvb207CiAJaW50IGxlbjsKIAlpbnQgZXJyOwogCXU4ICpvcHQ7CkBAIC00NTksNyArNDUzLDcgQEAKIAogCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssCiAJCQkJICAoTUFYX0hFQURFUiArIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikgKwotCQkJCSAgIGxlbiArIExMX0FMTE9DQVRFRF9TUEFDRShkZXYpKSwKKwkJCQkgICBsZW4gKyBobGVuICsgdGxlbiksCiAJCQkJICAxLCAmZXJyKTsKIAlpZiAoIXNrYikgewogCQlORF9QUklOVEswKEtFUk5fRVJSCkBAIC00NjgsNyArNDYyLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0Jc2tiX3Jlc2VydmUoc2tiLCBMTF9SRVNFUlZFRF9TUEFDRShkZXYpKTsKKwlza2JfcmVzZXJ2ZShza2IsIGhsZW4pOwogCWlwNl9uZF9oZHIoc2ssIHNrYiwgZGV2LCBzYWRkciwgZGFkZHIsIElQUFJPVE9fSUNNUFY2LCBsZW4pOwogCiAJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT50YWlsOwpAQCAtNDc5LDcgKzQ3Myw3IEBACiAKIAlvcHQgPSBza2JfdHJhbnNwb3J0X2hlYWRlcihza2IpICsgc2l6ZW9mKHN0cnVjdCBpY21wNmhkcik7CiAJaWYgKHRhcmdldCkgewotCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopb3B0LCB0YXJnZXQpOworCQkqKHN0cnVjdCBpbjZfYWRkciAqKW9wdCA9ICp0YXJnZXQ7CiAJCW9wdCArPSBzaXplb2YoKnRhcmdldCk7CiAJfQogCkBAIC01MTUsMTQgKzUwOSw3IEBACiAJdHlwZSA9IGljbXA2aC0+aWNtcDZfdHlwZTsKIAogCWljbXB2Nl9mbG93X2luaXQoc2ssICZmbDYsIHR5cGUsIHNhZGRyLCBkYWRkciwgZGV2LT5pZmluZGV4KTsKLQotCWRzdCA9IGljbXA2X2RzdF9hbGxvYyhkZXYsIG5laWdoLCBkYWRkcik7Ci0JaWYgKCFkc3QpIHsKLQkJa2ZyZWVfc2tiKHNrYik7Ci0JCXJldHVybjsKLQl9Ci0KLQlkc3QgPSB4ZnJtX2xvb2t1cChuZXQsIGRzdCwgZmxvd2k2X3RvX2Zsb3dpKCZmbDYpLCBOVUxMLCAwKTsKKwlkc3QgPSBpY21wNl9kc3RfYWxsb2MoZGV2LCBuZWlnaCwgJmZsNik7CiAJaWYgKElTX0VSUihkc3QpKSB7CiAJCWtmcmVlX3NrYihza2IpOwogCQlyZXR1cm47CkBAIC0xMjM3LDcgKzEyMjQsNyBAQAogCXJ0ID0gcnQ2X2dldF9kZmx0X3JvdXRlcigmaXB2Nl9oZHIoc2tiKS0+c2FkZHIsIHNrYi0+ZGV2KTsKIAogCWlmIChydCkKLQkJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCk7CisJCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoJnJ0LT5kc3QpOwogCiAJaWYgKHJ0ICYmIGxpZmV0aW1lID09IDApIHsKIAkJbmVpZ2hfY2xvbmUobmVpZ2gpOwpAQCAtMTI1Nyw3ICsxMjQ0LDcgQEAKIAkJCXJldHVybjsKIAkJfQogCi0JCW5laWdoID0gZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpOworCQluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKCZydC0+ZHN0KTsKIAkJaWYgKG5laWdoID09IE5VTEwpIHsKIAkJCU5EX1BSSU5USzAoS0VSTl9FUlIKIAkJCQkgICAiSUNNUHY2IFJBOiAlcygpIGdvdCBkZWZhdWx0IHJvdXRlciB3aXRob3V0IG5laWdoYm91ci5cbiIsCkBAIC0xMjcxLDcgKzEyNTgsNyBAQAogCX0KIAogCWlmIChydCkKLQkJcnQtPnJ0NmlfZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogKiBsaWZldGltZSk7CisJCXJ0LT5kc3QuZXhwaXJlcyA9IGppZmZpZXMgKyAoSFogKiBsaWZldGltZSk7CiAKIAlpZiAocmFfbXNnLT5pY21waC5pY21wNl9ob3BfbGltaXQpIHsKIAkJaW42X2Rldi0+Y25mLmhvcF9saW1pdCA9IHJhX21zZy0+aWNtcGguaWNtcDZfaG9wX2xpbWl0OwpAQCAtMTM4MSw3ICsxMzY4LDkgQEAKIAkJZm9yIChwID0gbmRvcHRzLm5kX29wdHNfcGk7CiAJCSAgICAgcDsKIAkJICAgICBwID0gbmRpc2NfbmV4dF9vcHRpb24ocCwgbmRvcHRzLm5kX29wdHNfcGlfZW5kKSkgewotCQkJYWRkcmNvbmZfcHJlZml4X3Jjdihza2ItPmRldiwgKHU4KilwLCAocC0+bmRfb3B0X2xlbikgPDwgMyk7CisJCQlhZGRyY29uZl9wcmVmaXhfcmN2KHNrYi0+ZGV2LCAodTggKilwLAorCQkJCQkgICAgKHAtPm5kX29wdF9sZW4pIDw8IDMsCisJCQkJCSAgICBuZG9wdHMubmRfb3B0c19zcmNfbGxhZGRyICE9IE5VTEwpOwogCQl9CiAJfQogCkBAIC0xNTMzLDYgKzE1MjIsNyBAQAogCXN0cnVjdCBpbmV0Nl9kZXYgKmlkZXY7CiAJc3RydWN0IGZsb3dpNiBmbDY7CiAJdTggKm9wdDsKKwlpbnQgaGxlbiwgdGxlbjsKIAlpbnQgcmRfbGVuOwogCWludCBlcnI7CiAJdTggaGFfYnVmW01BWF9BRERSX0xFTl0sICpoYSA9IE5VTEw7CkBAIC0xNTcxLDcgKzE1NjEsNyBAQAogCX0KIAlpZiAoIXJ0LT5ydDZpX3BlZXIpCiAJCXJ0Nl9iaW5kX3BlZXIocnQsIDEpOwotCWlmIChpbmV0X3BlZXJfeHJsaW1fYWxsb3cocnQtPnJ0NmlfcGVlciwgMSpIWikpCisJaWYgKCFpbmV0X3BlZXJfeHJsaW1fYWxsb3cocnQtPnJ0NmlfcGVlciwgMSpIWikpCiAJCWdvdG8gcmVsZWFzZTsKIAogCWlmIChkZXYtPmFkZHJfbGVuKSB7CkBAIC0xNTkwLDkgKzE1ODAsMTEgQEAKIAlyZF9sZW4gJj0gfjB4NzsKIAlsZW4gKz0gcmRfbGVuOwogCisJaGxlbiA9IExMX1JFU0VSVkVEX1NQQUNFKGRldik7CisJdGxlbiA9IGRldi0+bmVlZGVkX3RhaWxyb29tOwogCWJ1ZmYgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLAogCQkJCSAgIChNQVhfSEVBREVSICsgc2l6ZW9mKHN0cnVjdCBpcHY2aGRyKSArCi0JCQkJICAgIGxlbiArIExMX0FMTE9DQVRFRF9TUEFDRShkZXYpKSwKKwkJCQkgICAgbGVuICsgaGxlbiArIHRsZW4pLAogCQkJCSAgIDEsICZlcnIpOwogCWlmIChidWZmID09IE5VTEwpIHsKIAkJTkRfUFJJTlRLMChLRVJOX0VSUgpAQCAtMTYwMSw3ICsxNTkzLDcgQEAKIAkJZ290byByZWxlYXNlOwogCX0KIAotCXNrYl9yZXNlcnZlKGJ1ZmYsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOworCXNrYl9yZXNlcnZlKGJ1ZmYsIGhsZW4pOwogCWlwNl9uZF9oZHIoc2ssIGJ1ZmYsIGRldiwgJnNhZGRyX2J1ZiwgJmlwdjZfaGRyKHNrYiktPnNhZGRyLAogCQkgICBJUFBST1RPX0lDTVBWNiwgbGVuKTsKIApAQCAtMTYxNyw5ICsxNjA5LDkgQEAKIAkgKi8KIAogCWFkZHJwID0gKHN0cnVjdCBpbjZfYWRkciAqKShpY21waCArIDEpOwotCWlwdjZfYWRkcl9jb3B5KGFkZHJwLCB0YXJnZXQpOworCSphZGRycCA9ICp0YXJnZXQ7CiAJYWRkcnArKzsKLQlpcHY2X2FkZHJfY29weShhZGRycCwgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKKwkqYWRkcnAgPSBpcHY2X2hkcihza2IpLT5kYWRkcjsKIAogCW9wdCA9ICh1OCopIChhZGRycCArIDEpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvS2NvbmZpZyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCmluZGV4IDQ0ODQ2NDguLjlhNjhmYjUgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9pcHY2L25ldGZpbHRlci9LY29uZmlnCkBAIC0xMjUsNiArMTI1LDE2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgSVA2X05GX01BVENIX1JQRklMVEVSCisJdHJpc3RhdGUgJyJycGZpbHRlciIgcmV2ZXJzZSBwYXRoIGZpbHRlciBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECisJLS0taGVscC0tLQorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBtYXRjaCBwYWNrZXRzIHdob3NlIHJlcGxpZXMgd291bGQKKwkgIGdvIG91dCB2aWEgdGhlIGludGVyZmFjZSB0aGUgcGFja2V0IGNhbWUgaW4uCisKKwkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgorCSAgVGhlIG1vZHVsZSB3aWxsIGJlIGNhbGxlZCBpcDZ0X3JwZmlsdGVyLgorCiBjb25maWcgSVA2X05GX01BVENIX1JUCiAJdHJpc3RhdGUgJyJydCIgUm91dGluZyBoZWFkZXIgbWF0Y2ggc3VwcG9ydCcKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRApAQCAtMTg2LDcgKzE5Niw2IEBACiAKIGNvbmZpZyBJUDZfTkZfUkFXCiAJdHJpc3RhdGUgICdyYXcgdGFibGUgc3VwcG9ydCAocmVxdWlyZWQgZm9yIFRSQUNFKScKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIGFkZHMgYSBgcmF3JyB0YWJsZSB0byBpcDZ0YWJsZXMuIFRoaXMgdGFibGUgaXMgdGhlIHZlcnkKIAkgIGZpcnN0IGluIHRoZSBuZXRmaWx0ZXIgZnJhbWV3b3JrIGFuZCBob29rcyBpbiBhdCB0aGUgUFJFUk9VVElORwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IGFiZmVlOTEuLjJlYWVkOTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L25ldGZpbHRlci9NYWtlZmlsZQorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvTWFrZWZpbGUKQEAgLTI3LDYgKzI3LDcgQEAKIG9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfSVBWNkhFQURFUikgKz0gaXA2dF9pcHY2aGVhZGVyLm8KIG9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfTUgpICs9IGlwNnRfbWgubwogb2JqLSQoQ09ORklHX0lQNl9ORl9NQVRDSF9PUFRTKSArPSBpcDZ0X2hiaC5vCitvYmotJChDT05GSUdfSVA2X05GX01BVENIX1JQRklMVEVSKSArPSBpcDZ0X3JwZmlsdGVyLm8KIG9iai0kKENPTkZJR19JUDZfTkZfTUFUQ0hfUlQpICs9IGlwNnRfcnQubwogCiAjIHRhcmdldHMKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZfcXVldWUuYwppbmRleCBlNjNjMzk3Li5mYjgwYTIzIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2X3F1ZXVlLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNl9xdWV1ZS5jCkBAIC00MDUsNiArNDA1LDcgQEAKIAlpbnQgc3RhdHVzLCB0eXBlLCBwaWQsIGZsYWdzOwogCXVuc2lnbmVkIGludCBubG1zZ2xlbiwgc2tibGVuOwogCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCWJvb2wgZW5hYmxlX3RpbWVzdGFtcCA9IGZhbHNlOwogCiAJc2tibGVuID0gc2tiLT5sZW47CiAJaWYgKHNrYmxlbiA8IHNpemVvZigqbmxoKSkKQEAgLTQ0MiwxMSArNDQzLDEzIEBACiAJCQlSQ1ZfU0tCX0ZBSUwoLUVCVVNZKTsKIAkJfQogCX0gZWxzZSB7Ci0JCW5ldF9lbmFibGVfdGltZXN0YW1wKCk7CisJCWVuYWJsZV90aW1lc3RhbXAgPSB0cnVlOwogCQlwZWVyX3BpZCA9IHBpZDsKIAl9CiAKIAlzcGluX3VubG9ja19iaCgmcXVldWVfbG9jayk7CisJaWYgKGVuYWJsZV90aW1lc3RhbXApCisJCW5ldF9lbmFibGVfdGltZXN0YW1wKCk7CiAKIAlzdGF0dXMgPSBpcHFfcmVjZWl2ZV9wZWVyKE5MTVNHX0RBVEEobmxoKSwgdHlwZSwKIAkJCQkgIG5sbXNnbGVuIC0gTkxNU0dfTEVOR1RIKDApKTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X1JFSkVDVC5jIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKaW5kZXggYTVhNGM1ZC4uYWFkMmZhNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRfUkVKRUNULmMKQEAgLTQ5LDYgKzQ5LDcgQEAKIAljb25zdCBfX3U4IHRjbGFzcyA9IERFRkFVTFRfVE9TX1ZBTFVFOwogCXN0cnVjdCBkc3RfZW50cnkgKmRzdCA9IE5VTEw7CiAJdTggcHJvdG87CisJX19iZTE2IGZyYWdfb2ZmOwogCXN0cnVjdCBmbG93aTYgZmw2OwogCiAJaWYgKCghKGlwdjZfYWRkcl90eXBlKCZvaXA2aC0+c2FkZHIpICYgSVBWNl9BRERSX1VOSUNBU1QpKSB8fApAQCAtNTgsNyArNTksNyBAQAogCX0KIAogCXByb3RvID0gb2lwNmgtPm5leHRoZHI7Ci0JdGNwaG9mZiA9IGlwdjZfc2tpcF9leHRoZHIob2xkc2tiLCAoKHU4Kikob2lwNmgrMSkgLSBvbGRza2ItPmRhdGEpLCAmcHJvdG8pOworCXRjcGhvZmYgPSBpcHY2X3NraXBfZXh0aGRyKG9sZHNrYiwgKCh1OCopKG9pcDZoKzEpIC0gb2xkc2tiLT5kYXRhKSwgJnByb3RvLCAmZnJhZ19vZmYpOwogCiAJaWYgKCh0Y3Bob2ZmIDwgMCkgfHwgKHRjcGhvZmYgPiBvbGRza2ItPmxlbikpIHsKIAkJcHJfZGVidWcoIkNhbm5vdCBnZXQgVENQIGhlYWRlci5cbiIpOwpAQCAtOTMsOCArOTQsOCBAQAogCiAJbWVtc2V0KCZmbDYsIDAsIHNpemVvZihmbDYpKTsKIAlmbDYuZmxvd2k2X3Byb3RvID0gSVBQUk9UT19UQ1A7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi5zYWRkciwgJm9pcDZoLT5kYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgJm9pcDZoLT5zYWRkcik7CisJZmw2LnNhZGRyID0gb2lwNmgtPmRhZGRyOworCWZsNi5kYWRkciA9IG9pcDZoLT5zYWRkcjsKIAlmbDYuZmw2X3Nwb3J0ID0gb3RjcGguZGVzdDsKIAlmbDYuZmw2X2Rwb3J0ID0gb3RjcGguc291cmNlOwogCXNlY3VyaXR5X3NrYl9jbGFzc2lmeV9mbG93KG9sZHNrYiwgZmxvd2k2X3RvX2Zsb3dpKCZmbDYpKTsKQEAgLTEyOSw4ICsxMzAsOCBAQAogCSooX19iZTMyICopaXA2aCA9ICBodG9ubCgweDYwMDAwMDAwIHwgKHRjbGFzcyA8PCAyMCkpOwogCWlwNmgtPmhvcF9saW1pdCA9IGlwNl9kc3RfaG9wbGltaXQoZHN0KTsKIAlpcDZoLT5uZXh0aGRyID0gSVBQUk9UT19UQ1A7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwNmgtPnNhZGRyLCAmb2lwNmgtPmRhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmaXA2aC0+ZGFkZHIsICZvaXA2aC0+c2FkZHIpOworCWlwNmgtPnNhZGRyID0gb2lwNmgtPmRhZGRyOworCWlwNmgtPmRhZGRyID0gb2lwNmgtPnNhZGRyOwogCiAJdGNwaCA9IChzdHJ1Y3QgdGNwaGRyICopc2tiX3B1dChuc2tiLCBzaXplb2Yoc3RydWN0IHRjcGhkcikpOwogCS8qIFRydW5jYXRlIHRvIGxlbmd0aCAobm8gZGF0YSkgKi8KZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0X3JwZmlsdGVyLmMgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ycGZpbHRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMWQ4YjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dF9ycGZpbHRlci5jCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExIEZsb3JpYW4gV2VzdHBoYWwgPGZ3QHN0cmxlbi5kZT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvcm91dGUuaD4KKyNpbmNsdWRlIDxuZXQvaXA2X2ZpYi5oPgorI2luY2x1ZGUgPG5ldC9pcDZfcm91dGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9ycGZpbHRlci5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQVVUSE9SKCJGbG9yaWFuIFdlc3RwaGFsIDxmd0BzdHJsZW4uZGU+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIlh0YWJsZXM6IElQdjYgcmV2ZXJzZSBwYXRoIGZpbHRlciBtYXRjaCIpOworCitzdGF0aWMgYm9vbCBycGZpbHRlcl9hZGRyX3VuaWNhc3QoY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyKQoreworCWludCBhZGRyX3R5cGUgPSBpcHY2X2FkZHJfdHlwZShhZGRyKTsKKwlyZXR1cm4gYWRkcl90eXBlICYgSVBWNl9BRERSX1VOSUNBU1Q7Cit9CisKK3N0YXRpYyBib29sIHJwZmlsdGVyX2xvb2t1cF9yZXZlcnNlNihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggZmxhZ3MpCit7CisJc3RydWN0IHJ0Nl9pbmZvICpydDsKKwlzdHJ1Y3QgaXB2NmhkciAqaXBoID0gaXB2Nl9oZHIoc2tiKTsKKwlib29sIHJldCA9IGZhbHNlOworCXN0cnVjdCBmbG93aTYgZmw2ID0geworCQkuZmxvd2xhYmVsID0gKCogKF9fYmUzMiAqKSBpcGgpICYgSVBWNl9GTE9XSU5GT19NQVNLLAorCQkuZmxvd2k2X3Byb3RvID0gaXBoLT5uZXh0aGRyLAorCQkuZGFkZHIgPSBpcGgtPnNhZGRyLAorCX07CisJaW50IGxvb2t1cF9mbGFnczsKKworCWlmIChycGZpbHRlcl9hZGRyX3VuaWNhc3QoJmlwaC0+ZGFkZHIpKSB7CisJCW1lbWNweSgmZmw2LnNhZGRyLCAmaXBoLT5kYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQlsb29rdXBfZmxhZ3MgPSBSVDZfTE9PS1VQX0ZfSEFTX1NBRERSOworCX0gZWxzZSB7CisJCWxvb2t1cF9mbGFncyA9IDA7CisJfQorCisJZmw2LmZsb3dpNl9tYXJrID0gZmxhZ3MgJiBYVF9SUEZJTFRFUl9WQUxJRF9NQVJLID8gc2tiLT5tYXJrIDogMDsKKwlpZiAoKGZsYWdzICYgWFRfUlBGSUxURVJfTE9PU0UpID09IDApIHsKKwkJZmw2LmZsb3dpNl9vaWYgPSBkZXYtPmlmaW5kZXg7CisJCWxvb2t1cF9mbGFncyB8PSBSVDZfTE9PS1VQX0ZfSUZBQ0U7CisJfQorCisJcnQgPSAodm9pZCAqKSBpcDZfcm91dGVfbG9va3VwKGRldl9uZXQoZGV2KSwgJmZsNiwgbG9va3VwX2ZsYWdzKTsKKwlpZiAocnQtPmRzdC5lcnJvcikKKwkJZ290byBvdXQ7CisKKwlpZiAocnQtPnJ0NmlfZmxhZ3MgJiAoUlRGX1JFSkVDVHxSVEZfQU5ZQ0FTVCkpCisJCWdvdG8gb3V0OworCisJaWYgKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0xPQ0FMKSB7CisJCXJldCA9IGZsYWdzICYgWFRfUlBGSUxURVJfQUNDRVBUX0xPQ0FMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAocnQtPnJ0NmlfaWRldi0+ZGV2ID09IGRldiB8fCAoZmxhZ3MgJiBYVF9SUEZJTFRFUl9MT09TRSkpCisJCXJldCA9IHRydWU7Cisgb3V0OgorCWRzdF9yZWxlYXNlKCZydC0+ZHN0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgYm9vbCBycGZpbHRlcl9tdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIpCit7CisJY29uc3Qgc3RydWN0IHh0X3JwZmlsdGVyX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwlpbnQgc2FkZHJ0eXBlOworCXN0cnVjdCBpcHY2aGRyICppcGg7CisJYm9vbCBpbnZlcnQgPSBpbmZvLT5mbGFncyAmIFhUX1JQRklMVEVSX0lOVkVSVDsKKworCWlmIChwYXItPmluLT5mbGFncyAmIElGRl9MT09QQkFDSykKKwkJcmV0dXJuIHRydWUgXiBpbnZlcnQ7CisKKwlpcGggPSBpcHY2X2hkcihza2IpOworCXNhZGRydHlwZSA9IGlwdjZfYWRkcl90eXBlKCZpcGgtPnNhZGRyKTsKKwlpZiAodW5saWtlbHkoc2FkZHJ0eXBlID09IElQVjZfQUREUl9BTlkpKQorCQlyZXR1cm4gdHJ1ZSBeIGludmVydDsgLyogbm90IHJvdXRhYmxlOiBmb3J3YXJkIHBhdGggd2lsbCBkcm9wIGl0ICovCisKKwlyZXR1cm4gcnBmaWx0ZXJfbG9va3VwX3JldmVyc2U2KHNrYiwgcGFyLT5pbiwgaW5mby0+ZmxhZ3MpIF4gaW52ZXJ0OworfQorCitzdGF0aWMgaW50IHJwZmlsdGVyX2NoZWNrKGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9ycGZpbHRlcl9pbmZvICppbmZvID0gcGFyLT5tYXRjaGluZm87CisJdW5zaWduZWQgaW50IG9wdGlvbnMgPSB+WFRfUlBGSUxURVJfT1BUSU9OX01BU0s7CisKKwlpZiAoaW5mby0+ZmxhZ3MgJiBvcHRpb25zKSB7CisJCXByX2luZm8oInVua25vd24gb3B0aW9ucyBlbmNvdW50ZXJlZCIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc3RyY21wKHBhci0+dGFibGUsICJtYW5nbGUiKSAhPSAwICYmCisJICAgIHN0cmNtcChwYXItPnRhYmxlLCAicmF3IikgIT0gMCkgeworCQlwcl9pbmZvKCJtYXRjaCBvbmx5IHZhbGlkIGluIHRoZSBcJ3Jhd1wnICIKKwkJCSJvciBcJ21hbmdsZVwnIHRhYmxlcywgbm90IFwnJXNcJy5cbiIsIHBhci0+dGFibGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBycGZpbHRlcl9tdF9yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZQkJPSAicnBmaWx0ZXIiLAorCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAorCS5jaGVja2VudHJ5CT0gcnBmaWx0ZXJfY2hlY2ssCisJLm1hdGNoCQk9IHJwZmlsdGVyX210LAorCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X3JwZmlsdGVyX2luZm8pLAorCS5ob29rcwkJPSAoMSA8PCBORl9JTkVUX1BSRV9ST1VUSU5HKSwKKwkubWUJCT0gVEhJU19NT0RVTEUKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHJwZmlsdGVyX210X2luaXQodm9pZCkKK3sKKwlyZXR1cm4geHRfcmVnaXN0ZXJfbWF0Y2goJnJwZmlsdGVyX210X3JlZyk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBycGZpbHRlcl9tdF9leGl0KHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmcnBmaWx0ZXJfbXRfcmVnKTsKK30KKworbW9kdWxlX2luaXQocnBmaWx0ZXJfbXRfaW5pdCk7Cittb2R1bGVfZXhpdChycGZpbHRlcl9tdF9leGl0KTsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYyBiL25ldC9pcHY2L25ldGZpbHRlci9pcDZ0YWJsZV9maWx0ZXIuYwppbmRleCBjOWUzN2M4Li5hOGY2ZGE5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9uZXRmaWx0ZXIvaXA2dGFibGVfZmlsdGVyLmMKKysrIGIvbmV0L2lwdjYvbmV0ZmlsdGVyL2lwNnRhYmxlX2ZpbHRlci5jCkBAIC00NCw3ICs0NCw3IEBACiBzdGF0aWMgc3RydWN0IG5mX2hvb2tfb3BzICpmaWx0ZXJfb3BzIF9fcmVhZF9tb3N0bHk7CiAKIC8qIERlZmF1bHQgdG8gZm9yd2FyZCBiZWNhdXNlIEkgZ290IHRvbyBtdWNoIG1haWwgYWxyZWFkeS4gKi8KLXN0YXRpYyBpbnQgZm9yd2FyZCA9IE5GX0FDQ0VQVDsKK3N0YXRpYyBib29sIGZvcndhcmQgPSBORl9BQ0NFUFQ7CiBtb2R1bGVfcGFyYW0oZm9yd2FyZCwgYm9vbCwgMDAwMCk7CiAKIHN0YXRpYyBpbnQgX19uZXRfaW5pdCBpcDZ0YWJsZV9maWx0ZXJfbmV0X2luaXQoc3RydWN0IG5ldCAqbmV0KQpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcHJvYy5jIGIvbmV0L2lwdjYvcHJvYy5jCmluZGV4IDEwMDhjZTkuLmZkZWI2ZDAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Byb2MuYworKysgYi9uZXQvaXB2Ni9wcm9jLmMKQEAgLTE0MiwxMSArMTQyLDcgQEAKIAlTTk1QX01JQl9TRU5USU5FTAogfTsKIAotLyogY2FuIGJlIGNhbGxlZCBlaXRoZXIgd2l0aCBwZXJjcHUgbWliIChwY3B1bWliICE9IE5VTEwpLAotICogb3Igc2hhcmVkIG9uZSAoc21pYiAhPSBOVUxMKQotICovCi1zdGF0aWMgdm9pZCBzbm1wNl9zZXFfc2hvd19pY21wdjZtc2coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgX19wZXJjcHUgKipwY3B1bWliLAotCQkJCSAgICAgYXRvbWljX2xvbmdfdCAqc21pYikKK3N0YXRpYyB2b2lkIHNubXA2X3NlcV9zaG93X2ljbXB2Nm1zZyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgYXRvbWljX2xvbmdfdCAqc21pYikKIHsKIAljaGFyIG5hbWVbMzJdOwogCWludCBpOwpAQCAtMTYzLDE0ICsxNTksMTQgQEAKIAkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiSWNtcDYlcyVzIiwKIAkJCWkgJiAweDEwMCA/ICJPdXQiIDogIkluIiwgcCk7CiAJCXNlcV9wcmludGYoc2VxLCAiJS0zMnNcdCVsdVxuIiwgbmFtZSwKLQkJCXBjcHVtaWIgPyBzbm1wX2ZvbGRfZmllbGQocGNwdW1pYiwgaSkgOiBhdG9taWNfbG9uZ19yZWFkKHNtaWIgKyBpKSk7CisJCQkgICBhdG9taWNfbG9uZ19yZWFkKHNtaWIgKyBpKSk7CiAJfQogCiAJLyogcHJpbnQgYnkgbnVtYmVyIChub256ZXJvIG9ubHkpIC0gSUNNUE1zZ1N0YXQgZm9ybWF0ICovCiAJZm9yIChpID0gMDsgaSA8IElDTVA2TVNHX01JQl9NQVg7IGkrKykgewogCQl1bnNpZ25lZCBsb25nIHZhbDsKIAotCQl2YWwgPSBwY3B1bWliID8gc25tcF9mb2xkX2ZpZWxkKHBjcHVtaWIsIGkpIDogYXRvbWljX2xvbmdfcmVhZChzbWliICsgaSk7CisJCXZhbCA9IGF0b21pY19sb25nX3JlYWQoc21pYiArIGkpOwogCQlpZiAoIXZhbCkKIAkJCWNvbnRpbnVlOwogCQlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJJY21wNiVzVHlwZSV1IiwKQEAgLTIxNSw4ICsyMTEsNyBAQAogCQkJICAgIHNubXA2X2lwc3RhdHNfbGlzdCwgb2Zmc2V0b2Yoc3RydWN0IGlwc3RhdHNfbWliLCBzeW5jcCkpOwogCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCAodm9pZCBfX3BlcmNwdSAqKiluZXQtPm1pYi5pY21wdjZfc3RhdGlzdGljcywKIAkJCSAgICBOVUxMLCBzbm1wNl9pY21wNl9saXN0KTsKLQlzbm1wNl9zZXFfc2hvd19pY21wdjZtc2coc2VxLAotCQkJICAgICh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLmljbXB2Nm1zZ19zdGF0aXN0aWNzLCBOVUxMKTsKKwlzbm1wNl9zZXFfc2hvd19pY21wdjZtc2coc2VxLCBuZXQtPm1pYi5pY21wdjZtc2dfc3RhdGlzdGljcy0+bWlicyk7CiAJc25tcDZfc2VxX3Nob3dfaXRlbShzZXEsICh2b2lkIF9fcGVyY3B1ICoqKW5ldC0+bWliLnVkcF9zdGF0c19pbjYsCiAJCQkgICAgTlVMTCwgc25tcDZfdWRwNl9saXN0KTsKIAlzbm1wNl9zZXFfc2hvd19pdGVtKHNlcSwgKHZvaWQgX19wZXJjcHUgKiopbmV0LT5taWIudWRwbGl0ZV9zdGF0c19pbjYsCkBAIC0yNDYsNyArMjQxLDcgQEAKIAkJCSAgICBzbm1wNl9pcHN0YXRzX2xpc3QpOwogCXNubXA2X3NlcV9zaG93X2l0ZW0oc2VxLCBOVUxMLCBpZGV2LT5zdGF0cy5pY21wdjZkZXYtPm1pYnMsCiAJCQkgICAgc25tcDZfaWNtcDZfbGlzdCk7Ci0Jc25tcDZfc2VxX3Nob3dfaWNtcHY2bXNnKHNlcSwgTlVMTCwgaWRldi0+c3RhdHMuaWNtcHY2bXNnZGV2LT5taWJzKTsKKwlzbm1wNl9zZXFfc2hvd19pY21wdjZtc2coc2VxLCBpZGV2LT5zdGF0cy5pY21wdjZtc2dkZXYtPm1pYnMpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yYXcuYyBiL25ldC9pcHY2L3Jhdy5jCmluZGV4IDMzMWFmM2IuLmE0ODk0ZjQgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3Jhdy5jCisrKyBiL25ldC9pcHY2L3Jhdy5jCkBAIC0yOTksOSArMjk5LDkgQEAKIAl9CiAKIAlpbmV0LT5pbmV0X3Jjdl9zYWRkciA9IGluZXQtPmluZXRfc2FkZHIgPSB2NGFkZHI7Ci0JaXB2Nl9hZGRyX2NvcHkoJm5wLT5yY3Zfc2FkZHIsICZhZGRyLT5zaW42X2FkZHIpOworCW5wLT5yY3Zfc2FkZHIgPSBhZGRyLT5zaW42X2FkZHI7CiAJaWYgKCEoYWRkcl90eXBlICYgSVBWNl9BRERSX01VTFRJQ0FTVCkpCi0JCWlwdjZfYWRkcl9jb3B5KCZucC0+c2FkZHIsICZhZGRyLT5zaW42X2FkZHIpOworCQlucC0+c2FkZHIgPSBhZGRyLT5zaW42X2FkZHI7CiAJZXJyID0gMDsKIG91dF91bmxvY2s6CiAJcmN1X3JlYWRfdW5sb2NrKCk7CkBAIC0zODMsNyArMzgzLDggQEAKIAl9CiAKIAkvKiBDaGFyZ2UgaXQgdG8gdGhlIHNvY2tldC4gKi8KLQlpZiAoaXBfcXVldWVfcmN2X3NrYihzaywgc2tiKSA8IDApIHsKKwlza2JfZHN0X2Ryb3Aoc2tiKTsKKwlpZiAoc29ja19xdWV1ZV9yY3Zfc2tiKHNrLCBza2IpIDwgMCkgewogCQlrZnJlZV9za2Ioc2tiKTsKIAkJcmV0dXJuIE5FVF9SWF9EUk9QOwogCX0KQEAgLTQ5NCw3ICs0OTUsNyBAQAogCWlmIChzaW42KSB7CiAJCXNpbjYtPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAJCXNpbjYtPnNpbjZfcG9ydCA9IDA7Ci0JCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsICZpcHY2X2hkcihza2IpLT5zYWRkcik7CisJCXNpbjYtPnNpbjZfYWRkciA9IGlwdjZfaGRyKHNrYiktPnNhZGRyOwogCQlzaW42LT5zaW42X2Zsb3dpbmZvID0gMDsKIAkJc2luNi0+c2luNl9zY29wZV9pZCA9IDA7CiAJCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luNi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpCkBAIC02MTAsNiArNjExLDggQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCBlcnI7CiAJc3RydWN0IHJ0Nl9pbmZvICpydCA9IChzdHJ1Y3QgcnQ2X2luZm8gKikqZHN0cDsKKwlpbnQgaGxlbiA9IExMX1JFU0VSVkVEX1NQQUNFKHJ0LT5kc3QuZGV2KTsKKwlpbnQgdGxlbiA9IHJ0LT5kc3QuZGV2LT5uZWVkZWRfdGFpbHJvb207CiAKIAlpZiAobGVuZ3RoID4gcnQtPmRzdC5kZXYtPm10dSkgewogCQlpcHY2X2xvY2FsX2Vycm9yKHNrLCBFTVNHU0laRSwgZmw2LCBydC0+ZHN0LmRldi0+bXR1KTsKQEAgLTYxOSwxMSArNjIyLDExIEBACiAJCWdvdG8gb3V0OwogCiAJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywKLQkJCQkgIGxlbmd0aCArIExMX0FMTE9DQVRFRF9TUEFDRShydC0+ZHN0LmRldikgKyAxNSwKKwkJCQkgIGxlbmd0aCArIGhsZW4gKyB0bGVuICsgMTUsCiAJCQkJICBmbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CiAJaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIGVycm9yOwotCXNrYl9yZXNlcnZlKHNrYiwgTExfUkVTRVJWRURfU1BBQ0UocnQtPmRzdC5kZXYpKTsKKwlza2JfcmVzZXJ2ZShza2IsIGhsZW4pOwogCiAJc2tiLT5wcmlvcml0eSA9IHNrLT5za19wcmlvcml0eTsKIAlza2ItPm1hcmsgPSBzay0+c2tfbWFyazsKQEAgLTg0MywxMSArODQ2LDExIEBACiAJCWdvdG8gb3V0OwogCiAJaWYgKCFpcHY2X2FkZHJfYW55KGRhZGRyKSkKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgZGFkZHIpOworCQlmbDYuZGFkZHIgPSAqZGFkZHI7CiAJZWxzZQogCQlmbDYuZGFkZHIuczZfYWRkclsxNV0gPSAweDE7IC8qIDo6IG1lYW5zIGxvb3BiYWNrIChCU0QnaXNtKSAqLwogCWlmIChpcHY2X2FkZHJfYW55KCZmbDYuc2FkZHIpICYmICFpcHY2X2FkZHJfYW55KCZucC0+c2FkZHIpKQotCQlpcHY2X2FkZHJfY29weSgmZmw2LnNhZGRyLCAmbnAtPnNhZGRyKTsKKwkJZmw2LnNhZGRyID0gbnAtPnNhZGRyOwogCiAJZmluYWxfcCA9IGZsNl91cGRhdGVfZHN0KCZmbDYsIG9wdCwgJmZpbmFsKTsKIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvcmVhc3NlbWJseS5jIGIvbmV0L2lwdjYvcmVhc3NlbWJseS5jCmluZGV4IGRmYjE2NGUuLmI2OWZhZTcgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3JlYXNzZW1ibHkuYworKysgYi9uZXQvaXB2Ni9yZWFzc2VtYmx5LmMKQEAgLTE1Myw4ICsxNTMsOCBAQAogCiAJZnEtPmlkID0gYXJnLT5pZDsKIAlmcS0+dXNlciA9IGFyZy0+dXNlcjsKLQlpcHY2X2FkZHJfY29weSgmZnEtPnNhZGRyLCBhcmctPnNyYyk7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZxLT5kYWRkciwgYXJnLT5kc3QpOworCWZxLT5zYWRkciA9ICphcmctPnNyYzsKKwlmcS0+ZGFkZHIgPSAqYXJnLT5kc3Q7CiB9CiBFWFBPUlRfU1lNQk9MKGlwNl9mcmFnX2luaXQpOwogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni9yb3V0ZS5jIGIvbmV0L2lwdjYvcm91dGUuYwppbmRleCA4NDczMDE2Li4wNzM2MWRmIDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9yb3V0ZS5jCisrKyBiL25ldC9pcHY2L3JvdXRlLmMKQEAgLTYyLDIyICs2MiwxMSBAQAogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgogI2VuZGlmCiAKLS8qIFNldCB0byAzIHRvIGdldCB0cmFjaW5nLiAqLwotI2RlZmluZSBSVDZfREVCVUcgMgotCi0jaWYgUlQ2X0RFQlVHID49IDMKLSNkZWZpbmUgUkRCRyh4KSBwcmludGsgeAotI2RlZmluZSBSVDZfVFJBQ0UoeC4uLikgcHJpbnRrKEtFUk5fREVCVUcgeCkKLSNlbHNlCi0jZGVmaW5lIFJEQkcoeCkKLSNkZWZpbmUgUlQ2X1RSQUNFKHguLi4pIGRvIHsgOyB9IHdoaWxlICgwKQotI2VuZGlmCi0KIHN0YXRpYyBzdHJ1Y3QgcnQ2X2luZm8gKmlwNl9ydF9jb3B5KGNvbnN0IHN0cnVjdCBydDZfaW5mbyAqb3J0LAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRlc3QpOwogc3RhdGljIHN0cnVjdCBkc3RfZW50cnkJKmlwNl9kc3RfY2hlY2soc3RydWN0IGRzdF9lbnRyeSAqZHN0LCB1MzIgY29va2llKTsKIHN0YXRpYyB1bnNpZ25lZCBpbnQJIGlwNl9kZWZhdWx0X2Fkdm1zcyhjb25zdCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpOwotc3RhdGljIHVuc2lnbmVkIGludAkgaXA2X2RlZmF1bHRfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CitzdGF0aWMgdW5zaWduZWQgaW50CSBpcDZfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCk7CiBzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqaXA2X25lZ2F0aXZlX2FkdmljZShzdHJ1Y3QgZHN0X2VudHJ5ICopOwogc3RhdGljIHZvaWQJCWlwNl9kc3RfZGVzdHJveShzdHJ1Y3QgZHN0X2VudHJ5ICopOwogc3RhdGljIHZvaWQJCWlwNl9kc3RfaWZkb3duKHN0cnVjdCBkc3RfZW50cnkgKiwKQEAgLTEzNCw3ICsxMjMsMjMgQEAKIAogc3RhdGljIHN0cnVjdCBuZWlnaGJvdXIgKmlwNl9uZWlnaF9sb29rdXAoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0LCBjb25zdCB2b2lkICpkYWRkcikKIHsKLQlyZXR1cm4gX19uZWlnaF9sb29rdXBfZXJybm8oJm5kX3RibCwgZGFkZHIsIGRzdC0+ZGV2KTsKKwlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gX19pcHY2X25laWdoX2xvb2t1cCgmbmRfdGJsLCBkc3QtPmRldiwgZGFkZHIpOworCWlmIChuKQorCQlyZXR1cm4gbjsKKwlyZXR1cm4gbmVpZ2hfY3JlYXRlKCZuZF90YmwsIGRhZGRyLCBkc3QtPmRldik7Cit9CisKK3N0YXRpYyBpbnQgcnQ2X2JpbmRfbmVpZ2hib3VyKHN0cnVjdCBydDZfaW5mbyAqcnQsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IG5laWdoYm91ciAqbiA9IF9faXB2Nl9uZWlnaF9sb29rdXAoJm5kX3RibCwgZGV2LCAmcnQtPnJ0NmlfZ2F0ZXdheSk7CisJaWYgKCFuKSB7CisJCW4gPSBuZWlnaF9jcmVhdGUoJm5kX3RibCwgJnJ0LT5ydDZpX2dhdGV3YXksIGRldik7CisJCWlmIChJU19FUlIobikpCisJCQlyZXR1cm4gUFRSX0VSUihuKTsKKwl9CisJZHN0X3NldF9uZWlnaGJvdXIoJnJ0LT5kc3QsIG4pOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZHN0X29wcyBpcDZfZHN0X29wc190ZW1wbGF0ZSA9IHsKQEAgLTE0NCw3ICsxNDksNyBAQAogCS5nY190aHJlc2gJCT0JMTAyNCwKIAkuY2hlY2sJCQk9CWlwNl9kc3RfY2hlY2ssCiAJLmRlZmF1bHRfYWR2bXNzCQk9CWlwNl9kZWZhdWx0X2Fkdm1zcywKLQkuZGVmYXVsdF9tdHUJCT0JaXA2X2RlZmF1bHRfbXR1LAorCS5tdHUJCQk9CWlwNl9tdHUsCiAJLmNvd19tZXRyaWNzCQk9CWlwdjZfY293X21ldHJpY3MsCiAJLmRlc3Ryb3kJCT0JaXA2X2RzdF9kZXN0cm95LAogCS5pZmRvd24JCQk9CWlwNl9kc3RfaWZkb3duLApAQCAtMTU1LDkgKzE2MCwxMSBAQAogCS5uZWlnaF9sb29rdXAJCT0JaXA2X25laWdoX2xvb2t1cCwKIH07CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgaXA2X2JsYWNraG9sZV9kZWZhdWx0X210dShjb25zdCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCitzdGF0aWMgdW5zaWduZWQgaW50IGlwNl9ibGFja2hvbGVfbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKLQlyZXR1cm4gMDsKKwl1bnNpZ25lZCBpbnQgbXR1ID0gZHN0X21ldHJpY19yYXcoZHN0LCBSVEFYX01UVSk7CisKKwlyZXR1cm4gbXR1ID8gOiBkc3QtPmRldi0+bXR1OwogfQogCiBzdGF0aWMgdm9pZCBpcDZfcnRfYmxhY2tob2xlX3VwZGF0ZV9wbXR1KHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgdTMyIG10dSkKQEAgLTE3NSw3ICsxODIsNyBAQAogCS5wcm90b2NvbAkJPQljcHVfdG9fYmUxNihFVEhfUF9JUFY2KSwKIAkuZGVzdHJveQkJPQlpcDZfZHN0X2Rlc3Ryb3ksCiAJLmNoZWNrCQkJPQlpcDZfZHN0X2NoZWNrLAotCS5kZWZhdWx0X210dQkJPQlpcDZfYmxhY2tob2xlX2RlZmF1bHRfbXR1LAorCS5tdHUJCQk9CWlwNl9ibGFja2hvbGVfbXR1LAogCS5kZWZhdWx0X2Fkdm1zcwkJPQlpcDZfZGVmYXVsdF9hZHZtc3MsCiAJLnVwZGF0ZV9wbXR1CQk9CWlwNl9ydF9ibGFja2hvbGVfdXBkYXRlX3BtdHUsCiAJLmNvd19tZXRyaWNzCQk9CWlwNl9ydF9ibGFja2hvbGVfY293X21ldHJpY3MsCkBAIC0yNDUsOSArMjUyLDkgQEAKIHsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gZHN0X2FsbG9jKG9wcywgZGV2LCAwLCAwLCBmbGFncyk7CiAKLQlpZiAocnQgIT0gTlVMTCkKKwlpZiAocnQpCiAJCW1lbXNldCgmcnQtPnJ0NmlfdGFibGUsIDAsCi0JCQlzaXplb2YoKnJ0KSAtIHNpemVvZihzdHJ1Y3QgZHN0X2VudHJ5KSk7CisJCSAgICAgICBzaXplb2YoKnJ0KSAtIHNpemVvZihzdHJ1Y3QgZHN0X2VudHJ5KSk7CiAKIAlyZXR1cm4gcnQ7CiB9CkBAIC0yNjEsNyArMjY4LDcgQEAKIAlpZiAoIShydC0+ZHN0LmZsYWdzICYgRFNUX0hPU1QpKQogCQlkc3RfZGVzdHJveV9tZXRyaWNzX2dlbmVyaWMoZHN0KTsKIAotCWlmIChpZGV2ICE9IE5VTEwpIHsKKwlpZiAoaWRldikgewogCQlydC0+cnQ2aV9pZGV2ID0gTlVMTDsKIAkJaW42X2Rldl9wdXQoaWRldik7CiAJfQpAQCAtMjk3LDEwICszMDQsMTAgQEAKIAlzdHJ1Y3QgbmV0X2RldmljZSAqbG9vcGJhY2tfZGV2ID0KIAkJZGV2X25ldChkZXYpLT5sb29wYmFja19kZXY7CiAKLQlpZiAoZGV2ICE9IGxvb3BiYWNrX2RldiAmJiBpZGV2ICE9IE5VTEwgJiYgaWRldi0+ZGV2ID09IGRldikgeworCWlmIChkZXYgIT0gbG9vcGJhY2tfZGV2ICYmIGlkZXYgJiYgaWRldi0+ZGV2ID09IGRldikgewogCQlzdHJ1Y3QgaW5ldDZfZGV2ICpsb29wYmFja19pZGV2ID0KIAkJCWluNl9kZXZfZ2V0KGxvb3BiYWNrX2Rldik7Ci0JCWlmIChsb29wYmFja19pZGV2ICE9IE5VTEwpIHsKKwkJaWYgKGxvb3BiYWNrX2lkZXYpIHsKIAkJCXJ0LT5ydDZpX2lkZXYgPSBsb29wYmFja19pZGV2OwogCQkJaW42X2Rldl9wdXQoaWRldik7CiAJCX0KQEAgLTMxMCw3ICszMTcsNyBAQAogc3RhdGljIF9faW5saW5lX18gaW50IHJ0Nl9jaGVja19leHBpcmVkKGNvbnN0IHN0cnVjdCBydDZfaW5mbyAqcnQpCiB7CiAJcmV0dXJuIChydC0+cnQ2aV9mbGFncyAmIFJURl9FWFBJUkVTKSAmJgotCQl0aW1lX2FmdGVyKGppZmZpZXMsIHJ0LT5ydDZpX2V4cGlyZXMpOworCQl0aW1lX2FmdGVyKGppZmZpZXMsIHJ0LT5kc3QuZXhwaXJlcyk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJ0Nl9uZWVkX3N0cmljdChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmRhZGRyKQpAQCAtMzM2LDEzICszNDMsMTMgQEAKIAkJZ290byBvdXQ7CiAKIAlmb3IgKHNwcnQgPSBydDsgc3BydDsgc3BydCA9IHNwcnQtPmRzdC5ydDZfbmV4dCkgewotCQlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gc3BydC0+cnQ2aV9kZXY7CisJCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBzcHJ0LT5kc3QuZGV2OwogCiAJCWlmIChvaWYpIHsKIAkJCWlmIChkZXYtPmlmaW5kZXggPT0gb2lmKQogCQkJCXJldHVybiBzcHJ0OwogCQkJaWYgKGRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spIHsKLQkJCQlpZiAoc3BydC0+cnQ2aV9pZGV2ID09IE5VTEwgfHwKKwkJCQlpZiAoIXNwcnQtPnJ0NmlfaWRldiB8fAogCQkJCSAgICBzcHJ0LT5ydDZpX2lkZXYtPmRldi0+aWZpbmRleCAhPSBvaWYpIHsKIAkJCQkJaWYgKGZsYWdzICYgUlQ2X0xPT0tVUF9GX0lGQUNFICYmIG9pZikKIAkJCQkJCWNvbnRpbnVlOwpAQCAtMzgzLDcgKzM5MCw3IEBACiAJICogdG8gbm8gbW9yZSB0aGFuIG9uZSBwZXIgbWludXRlLgogCSAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQluZWlnaCA9IHJ0ID8gZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpIDogTlVMTDsKKwluZWlnaCA9IHJ0ID8gZHN0X2dldF9uZWlnaGJvdXJfbm9yZWYoJnJ0LT5kc3QpIDogTlVMTDsKIAlpZiAoIW5laWdoIHx8IChuZWlnaC0+bnVkX3N0YXRlICYgTlVEX1ZBTElEKSkKIAkJZ290byBvdXQ7CiAJcmVhZF9sb2NrX2JoKCZuZWlnaC0+bG9jayk7CkBAIC0zOTcsNyArNDA0LDcgQEAKIAogCQl0YXJnZXQgPSAoc3RydWN0IGluNl9hZGRyICopJm5laWdoLT5wcmltYXJ5X2tleTsKIAkJYWRkcmNvbmZfYWRkcl9zb2xpY3RfbXVsdCh0YXJnZXQsICZtY2FkZHIpOwotCQluZGlzY19zZW5kX25zKHJ0LT5ydDZpX2RldiwgTlVMTCwgdGFyZ2V0LCAmbWNhZGRyLCBOVUxMKTsKKwkJbmRpc2Nfc2VuZF9ucyhydC0+ZHN0LmRldiwgTlVMTCwgdGFyZ2V0LCAmbWNhZGRyLCBOVUxMKTsKIAl9IGVsc2UgewogCQlyZWFkX3VubG9ja19iaCgmbmVpZ2gtPmxvY2spOwogCX0KQEAgLTQxNSw3ICs0MjIsNyBAQAogICovCiBzdGF0aWMgaW5saW5lIGludCBydDZfY2hlY2tfZGV2KHN0cnVjdCBydDZfaW5mbyAqcnQsIGludCBvaWYpCiB7Ci0Jc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHJ0LT5ydDZpX2RldjsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gcnQtPmRzdC5kZXY7CiAJaWYgKCFvaWYgfHwgZGV2LT5pZmluZGV4ID09IG9pZikKIAkJcmV0dXJuIDI7CiAJaWYgKChkZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSAmJgpAQCAtNDMwLDcgKzQzNyw3IEBACiAJaW50IG07CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCk7CisJbmVpZ2ggPSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZigmcnQtPmRzdCk7CiAJaWYgKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX05PTkVYVEhPUCB8fAogCSAgICAhKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0dBVEVXQVkpKQogCQltID0gMTsKQEAgLTUxNiw5ICs1MjMsNiBAQAogCXN0cnVjdCBydDZfaW5mbyAqbWF0Y2gsICpydDA7CiAJc3RydWN0IG5ldCAqbmV0OwogCi0JUlQ2X1RSQUNFKCIlcyhmbi0+bGVhZj0lcCwgb2lmPSVkKVxuIiwKLQkJICBfX2Z1bmNfXywgZm4tPmxlYWYsIG9pZik7Ci0KIAlydDAgPSBmbi0+cnJfcHRyOwogCWlmICghcnQwKQogCQlmbi0+cnJfcHRyID0gcnQwID0gZm4tPmxlYWY7CkBAIC01MzcsMTAgKzU0MSw3IEBACiAJCQlmbi0+cnJfcHRyID0gbmV4dDsKIAl9CiAKLQlSVDZfVFJBQ0UoIiVzKCkgPT4gJXBcbiIsCi0JCSAgX19mdW5jX18sIG1hdGNoKTsKLQotCW5ldCA9IGRldl9uZXQocnQwLT5ydDZpX2Rldik7CisJbmV0ID0gZGV2X25ldChydDAtPmRzdC5kZXYpOwogCXJldHVybiBtYXRjaCA/IG1hdGNoIDogbmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5OwogfQogCkBAIC02MDksNyArNjEwLDcgQEAKIAkJaWYgKCFhZGRyY29uZl9maW5pdGVfdGltZW91dChsaWZldGltZSkpIHsKIAkJCXJ0LT5ydDZpX2ZsYWdzICY9IH5SVEZfRVhQSVJFUzsKIAkJfSBlbHNlIHsKLQkJCXJ0LT5ydDZpX2V4cGlyZXMgPSBqaWZmaWVzICsgSFogKiBsaWZldGltZTsKKwkJCXJ0LT5kc3QuZXhwaXJlcyA9IGppZmZpZXMgKyBIWiAqIGxpZmV0aW1lOwogCQkJcnQtPnJ0NmlfZmxhZ3MgfD0gUlRGX0VYUElSRVM7CiAJCX0KIAkJZHN0X3JlbGVhc2UoJnJ0LT5kc3QpOwpAQCAtNjM0LDcgKzYzNSw3IEBACiAJCQkJZ290byByZXN0YXJ0OyBcCiAJCX0gXAogCX0gXAotfSB3aGlsZSgwKQorfSB3aGlsZSAoMCkKIAogc3RhdGljIHN0cnVjdCBydDZfaW5mbyAqaXA2X3BvbF9yb3V0ZV9sb29rdXAoc3RydWN0IG5ldCAqbmV0LAogCQkJCQkgICAgIHN0cnVjdCBmaWI2X3RhYmxlICp0YWJsZSwKQEAgLTY1Niw2ICs2NTcsMTMgQEAKIAogfQogCitzdHJ1Y3QgZHN0X2VudHJ5ICogaXA2X3JvdXRlX2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBmbG93aTYgKmZsNiwKKwkJCQkgICAgaW50IGZsYWdzKQoreworCXJldHVybiBmaWI2X3J1bGVfbG9va3VwKG5ldCwgZmw2LCBmbGFncywgaXA2X3BvbF9yb3V0ZV9sb29rdXApOworfQorRVhQT1JUX1NZTUJPTF9HUEwoaXA2X3JvdXRlX2xvb2t1cCk7CisKIHN0cnVjdCBydDZfaW5mbyAqcnQ2X2xvb2t1cChzdHJ1Y3QgbmV0ICpuZXQsIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqZGFkZHIsCiAJCQkgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpzYWRkciwgaW50IG9pZiwgaW50IHN0cmljdCkKIHsKQEAgLTcwNCw3ICs3MTIsNyBAQAogaW50IGlwNl9pbnNfcnQoc3RydWN0IHJ0Nl9pbmZvICpydCkKIHsKIAlzdHJ1Y3QgbmxfaW5mbyBpbmZvID0gewotCQkubmxfbmV0ID0gZGV2X25ldChydC0+cnQ2aV9kZXYpLAorCQkubmxfbmV0ID0gZGV2X25ldChydC0+ZHN0LmRldiksCiAJfTsKIAlyZXR1cm4gX19pcDZfaW5zX3J0KHJ0LCAmaW5mbyk7CiB9CkBAIC03MjIsMjkgKzczMCwyNyBAQAogCXJ0ID0gaXA2X3J0X2NvcHkob3J0LCBkYWRkcik7CiAKIAlpZiAocnQpIHsKLQkJc3RydWN0IG5laWdoYm91ciAqbmVpZ2g7CiAJCWludCBhdHRlbXB0cyA9ICFpbl9zb2Z0aXJxKCk7CiAKLQkJaWYgKCEocnQtPnJ0NmlfZmxhZ3MmUlRGX0dBVEVXQVkpKSB7Ci0JCQlpZiAocnQtPnJ0NmlfZHN0LnBsZW4gIT0gMTI4ICYmCisJCWlmICghKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0dBVEVXQVkpKSB7CisJCQlpZiAob3J0LT5ydDZpX2RzdC5wbGVuICE9IDEyOCAmJgogCQkJICAgIGlwdjZfYWRkcl9lcXVhbCgmb3J0LT5ydDZpX2RzdC5hZGRyLCBkYWRkcikpCiAJCQkJcnQtPnJ0NmlfZmxhZ3MgfD0gUlRGX0FOWUNBU1Q7Ci0JCQlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZ2F0ZXdheSwgZGFkZHIpOworCQkJcnQtPnJ0NmlfZ2F0ZXdheSA9ICpkYWRkcjsKIAkJfQogCiAJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9DQUNIRTsKIAogI2lmZGVmIENPTkZJR19JUFY2X1NVQlRSRUVTCiAJCWlmIChydC0+cnQ2aV9zcmMucGxlbiAmJiBzYWRkcikgewotCQkJaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX3NyYy5hZGRyLCBzYWRkcik7CisJCQlydC0+cnQ2aV9zcmMuYWRkciA9ICpzYWRkcjsKIAkJCXJ0LT5ydDZpX3NyYy5wbGVuID0gMTI4OwogCQl9CiAjZW5kaWYKIAogCXJldHJ5OgotCQluZWlnaCA9IG5kaXNjX2dldF9uZWlnaChydC0+cnQ2aV9kZXYsICZydC0+cnQ2aV9nYXRld2F5KTsKLQkJaWYgKElTX0VSUihuZWlnaCkpIHsKLQkJCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQocnQtPnJ0NmlfZGV2KTsKKwkJaWYgKHJ0Nl9iaW5kX25laWdoYm91cihydCwgcnQtPmRzdC5kZXYpKSB7CisJCQlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KHJ0LT5kc3QuZGV2KTsKIAkJCWludCBzYXZlZF9ydF9taW5faW50ZXJ2YWwgPQogCQkJCW5ldC0+aXB2Ni5zeXNjdGwuaXA2X3J0X2djX21pbl9pbnRlcnZhbDsKIAkJCWludCBzYXZlZF9ydF9lbGFzdGljaXR5ID0KQEAgLTc2OSw4ICs3NzUsNiBAQAogCQkJZHN0X2ZyZWUoJnJ0LT5kc3QpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KLQkJZHN0X3NldF9uZWlnaGJvdXIoJnJ0LT5kc3QsIG5laWdoKTsKLQogCX0KIAogCXJldHVybiBydDsKQEAgLTc4Myw3ICs3ODcsNyBAQAogCiAJaWYgKHJ0KSB7CiAJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9DQUNIRTsKLQkJZHN0X3NldF9uZWlnaGJvdXIoJnJ0LT5kc3QsIG5laWdoX2Nsb25lKGRzdF9nZXRfbmVpZ2hib3VyX3Jhdygmb3J0LT5kc3QpKSk7CisJCWRzdF9zZXRfbmVpZ2hib3VyKCZydC0+ZHN0LCBuZWlnaF9jbG9uZShkc3RfZ2V0X25laWdoYm91cl9ub3JlZl9yYXcoJm9ydC0+ZHN0KSkpOwogCX0KIAlyZXR1cm4gcnQ7CiB9CkBAIC04MTcsNyArODIxLDcgQEAKIAlkc3RfaG9sZCgmcnQtPmRzdCk7CiAJcmVhZF91bmxvY2tfYmgoJnRhYmxlLT50YjZfbG9jayk7CiAKLQlpZiAoIWRzdF9nZXRfbmVpZ2hib3VyX3JhdygmcnQtPmRzdCkgJiYgIShydC0+cnQ2aV9mbGFncyAmIFJURl9OT05FWFRIT1ApKQorCWlmICghZHN0X2dldF9uZWlnaGJvdXJfbm9yZWZfcmF3KCZydC0+ZHN0KSAmJiAhKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX05PTkVYVEhPUCkpCiAJCW5ydCA9IHJ0Nl9hbGxvY19jb3cocnQsICZmbDYtPmRhZGRyLCAmZmw2LT5zYWRkcik7CiAJZWxzZSBpZiAoIShydC0+ZHN0LmZsYWdzICYgRFNUX0hPU1QpKQogCQlucnQgPSBydDZfYWxsb2NfY2xvbmUocnQsICZmbDYtPmRhZGRyKTsKQEAgLTg3Myw3ICs4NzcsNyBAQAogCQkuZmxvd2k2X2lpZiA9IHNrYi0+ZGV2LT5pZmluZGV4LAogCQkuZGFkZHIgPSBpcGgtPmRhZGRyLAogCQkuc2FkZHIgPSBpcGgtPnNhZGRyLAotCQkuZmxvd2xhYmVsID0gKCogKF9fYmUzMiAqKSBpcGgpJklQVjZfRkxPV0lORk9fTUFTSywKKwkJLmZsb3dsYWJlbCA9ICgqIChfX2JlMzIgKikgaXBoKSAmIElQVjZfRkxPV0lORk9fTUFTSywKIAkJLmZsb3dpNl9tYXJrID0gc2tiLT5tYXJrLAogCQkuZmxvd2k2X3Byb3RvID0gaXBoLT5uZXh0aGRyLAogCX07CkBAIC05MzAsOSArOTM0LDkgQEAKIAkJcnQtPnJ0NmlfaWRldiA9IG9ydC0+cnQ2aV9pZGV2OwogCQlpZiAocnQtPnJ0NmlfaWRldikKIAkJCWluNl9kZXZfaG9sZChydC0+cnQ2aV9pZGV2KTsKLQkJcnQtPnJ0NmlfZXhwaXJlcyA9IDA7CisJCXJ0LT5kc3QuZXhwaXJlcyA9IDA7CiAKLQkJaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX2dhdGV3YXksICZvcnQtPnJ0NmlfZ2F0ZXdheSk7CisJCXJ0LT5ydDZpX2dhdGV3YXkgPSBvcnQtPnJ0NmlfZ2F0ZXdheTsKIAkJcnQtPnJ0NmlfZmxhZ3MgPSBvcnQtPnJ0NmlfZmxhZ3MgJiB+UlRGX0VYUElSRVM7CiAJCXJ0LT5ydDZpX21ldHJpYyA9IDA7CiAKQEAgLTk5NSw3ICs5OTksNyBAQAogCiAJcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopIHNrYl9kc3Qoc2tiKTsKIAlpZiAocnQpIHsKLQkJaWYgKHJ0LT5ydDZpX2ZsYWdzJlJURl9DQUNIRSkgeworCQlpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfQ0FDSEUpIHsKIAkJCWRzdF9zZXRfZXhwaXJlcygmcnQtPmRzdCwgMCk7CiAJCQlydC0+cnQ2aV9mbGFncyB8PSBSVEZfRVhQSVJFUzsKIAkJfSBlbHNlIGlmIChydC0+cnQ2aV9ub2RlICYmIChydC0+cnQ2aV9mbGFncyAmIFJURl9ERUZBVUxUKSkKQEAgLTEwNDEsMTAgKzEwNDUsMTUgQEAKIAlyZXR1cm4gbXR1OwogfQogCi1zdGF0aWMgdW5zaWduZWQgaW50IGlwNl9kZWZhdWx0X210dShjb25zdCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCitzdGF0aWMgdW5zaWduZWQgaW50IGlwNl9tdHUoY29uc3Qgc3RydWN0IGRzdF9lbnRyeSAqZHN0KQogewotCXVuc2lnbmVkIGludCBtdHUgPSBJUFY2X01JTl9NVFU7CiAJc3RydWN0IGluZXQ2X2RldiAqaWRldjsKKwl1bnNpZ25lZCBpbnQgbXR1ID0gZHN0X21ldHJpY19yYXcoZHN0LCBSVEFYX01UVSk7CisKKwlpZiAobXR1KQorCQlyZXR1cm4gbXR1OworCisJbXR1ID0gSVBWNl9NSU5fTVRVOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWlkZXYgPSBfX2luNl9kZXZfZ2V0KGRzdC0+ZGV2KTsKQEAgLTEwNjAsMzQgKzEwNjksMzggQEAKIAogc3RydWN0IGRzdF9lbnRyeSAqaWNtcDZfZHN0X2FsbG9jKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCiAJCQkJICBzdHJ1Y3QgbmVpZ2hib3VyICpuZWlnaCwKLQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcikKKwkJCQkgIHN0cnVjdCBmbG93aTYgKmZsNikKIHsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3Q7CiAJc3RydWN0IHJ0Nl9pbmZvICpydDsKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaW42X2Rldl9nZXQoZGV2KTsKIAlzdHJ1Y3QgbmV0ICpuZXQgPSBkZXZfbmV0KGRldik7CiAKLQlpZiAodW5saWtlbHkoaWRldiA9PSBOVUxMKSkKKwlpZiAodW5saWtlbHkoIWlkZXYpKQogCQlyZXR1cm4gTlVMTDsKIAogCXJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLCBkZXYsIDApOwotCWlmICh1bmxpa2VseShydCA9PSBOVUxMKSkgeworCWlmICh1bmxpa2VseSghcnQpKSB7CiAJCWluNl9kZXZfcHV0KGlkZXYpOworCQlkc3QgPSBFUlJfUFRSKC1FTk9NRU0pOwogCQlnb3RvIG91dDsKIAl9CiAKIAlpZiAobmVpZ2gpCiAJCW5laWdoX2hvbGQobmVpZ2gpOwogCWVsc2UgewotCQluZWlnaCA9IG5kaXNjX2dldF9uZWlnaChkZXYsIGFkZHIpOwotCQlpZiAoSVNfRVJSKG5laWdoKSkKLQkJCW5laWdoID0gTlVMTDsKKwkJbmVpZ2ggPSBpcDZfbmVpZ2hfbG9va3VwKCZydC0+ZHN0LCAmZmw2LT5kYWRkcik7CisJCWlmIChJU19FUlIobmVpZ2gpKSB7CisJCQlkc3RfZnJlZSgmcnQtPmRzdCk7CisJCQlyZXR1cm4gRVJSX0NBU1QobmVpZ2gpOworCQl9CiAJfQogCiAJcnQtPmRzdC5mbGFncyB8PSBEU1RfSE9TVDsKIAlydC0+ZHN0Lm91dHB1dCAgPSBpcDZfb3V0cHV0OwogCWRzdF9zZXRfbmVpZ2hib3VyKCZydC0+ZHN0LCBuZWlnaCk7CiAJYXRvbWljX3NldCgmcnQtPmRzdC5fX3JlZmNudCwgMSk7Ci0JaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX2RzdC5hZGRyLCBhZGRyKTsKKwlydC0+cnQ2aV9kc3QuYWRkciA9IGZsNi0+ZGFkZHI7CiAJcnQtPnJ0NmlfZHN0LnBsZW4gPSAxMjg7CiAJcnQtPnJ0NmlfaWRldiAgICAgPSBpZGV2OwogCWRzdF9tZXRyaWNfc2V0KCZydC0+ZHN0LCBSVEFYX0hPUExJTUlULCAyNTUpOwpAQCAtMTA5OSw4ICsxMTEyLDEwIEBACiAKIAlmaWI2X2ZvcmNlX3N0YXJ0X2djKG5ldCk7CiAKKwlkc3QgPSB4ZnJtX2xvb2t1cChuZXQsICZydC0+ZHN0LCBmbG93aTZfdG9fZmxvd2koZmw2KSwgTlVMTCwgMCk7CisKIG91dDoKLQlyZXR1cm4gJnJ0LT5kc3Q7CisJcmV0dXJuIGRzdDsKIH0KIAogaW50IGljbXA2X2RzdF9nYyh2b2lkKQpAQCAtMTIzMCwyMSArMTI0NSwzMCBAQAogCWlmIChjZmctPmZjX21ldHJpYyA9PSAwKQogCQljZmctPmZjX21ldHJpYyA9IElQNl9SVF9QUklPX1VTRVI7CiAKLQl0YWJsZSA9IGZpYjZfbmV3X3RhYmxlKG5ldCwgY2ZnLT5mY190YWJsZSk7Ci0JaWYgKHRhYmxlID09IE5VTEwpIHsKLQkJZXJyID0gLUVOT0JVRlM7Ci0JCWdvdG8gb3V0OworCWVyciA9IC1FTk9CVUZTOworCWlmIChjZmctPmZjX25saW5mby5ubGggJiYKKwkgICAgIShjZmctPmZjX25saW5mby5ubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfQ1JFQVRFKSkgeworCQl0YWJsZSA9IGZpYjZfZ2V0X3RhYmxlKG5ldCwgY2ZnLT5mY190YWJsZSk7CisJCWlmICghdGFibGUpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIklQdjY6IE5MTV9GX0NSRUFURSBzaG91bGQgYmUgc3BlY2lmaWVkIHdoZW4gY3JlYXRpbmcgbmV3IHJvdXRlXG4iKTsKKwkJCXRhYmxlID0gZmliNl9uZXdfdGFibGUobmV0LCBjZmctPmZjX3RhYmxlKTsKKwkJfQorCX0gZWxzZSB7CisJCXRhYmxlID0gZmliNl9uZXdfdGFibGUobmV0LCBjZmctPmZjX3RhYmxlKTsKIAl9CiAKKwlpZiAoIXRhYmxlKQorCQlnb3RvIG91dDsKKwogCXJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLCBOVUxMLCBEU1RfTk9DT1VOVCk7CiAKLQlpZiAocnQgPT0gTlVMTCkgeworCWlmICghcnQpIHsKIAkJZXJyID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQogCiAJcnQtPmRzdC5vYnNvbGV0ZSA9IC0xOwotCXJ0LT5ydDZpX2V4cGlyZXMgPSAoY2ZnLT5mY19mbGFncyAmIFJURl9FWFBJUkVTKSA/CisJcnQtPmRzdC5leHBpcmVzID0gKGNmZy0+ZmNfZmxhZ3MgJiBSVEZfRVhQSVJFUykgPwogCQkJCWppZmZpZXMgKyBjbG9ja190X3RvX2ppZmZpZXMoY2ZnLT5mY19leHBpcmVzKSA6CiAJCQkJMDsKIApAQCAtMTI4Nyw4ICsxMzExLDkgQEAKIAkgICB0aGV5IHdvdWxkIHJlc3VsdCBpbiBrZXJuZWwgbG9vcGluZzsgcHJvbW90ZSB0aGVtIHRvIHJlamVjdCByb3V0ZXMKIAkgKi8KIAlpZiAoKGNmZy0+ZmNfZmxhZ3MgJiBSVEZfUkVKRUNUKSB8fAotCSAgICAoZGV2ICYmIChkZXYtPmZsYWdzJklGRl9MT09QQkFDSykgJiYgIShhZGRyX3R5cGUmSVBWNl9BRERSX0xPT1BCQUNLKQotCQkJCQkgICAgICAmJiAhKGNmZy0+ZmNfZmxhZ3MmUlRGX0xPQ0FMKSkpIHsKKwkgICAgKGRldiAmJiAoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykgJiYKKwkgICAgICEoYWRkcl90eXBlICYgSVBWNl9BRERSX0xPT1BCQUNLKSAmJgorCSAgICAgIShjZmctPmZjX2ZsYWdzICYgUlRGX0xPQ0FMKSkpIHsKIAkJLyogaG9sZCBsb29wYmFjayBkZXYvaWRldiBpZiB3ZSBoYXZlbid0IGRvbmUgc28uICovCiAJCWlmIChkZXYgIT0gbmV0LT5sb29wYmFja19kZXYpIHsKIAkJCWlmIChkZXYpIHsKQEAgLTEzMTUsNyArMTM0MCw3IEBACiAJCWludCBnd2FfdHlwZTsKIAogCQlnd19hZGRyID0gJmNmZy0+ZmNfZ2F0ZXdheTsKLQkJaXB2Nl9hZGRyX2NvcHkoJnJ0LT5ydDZpX2dhdGV3YXksIGd3X2FkZHIpOworCQlydC0+cnQ2aV9nYXRld2F5ID0gKmd3X2FkZHI7CiAJCWd3YV90eXBlID0gaXB2Nl9hZGRyX3R5cGUoZ3dfYWRkcik7CiAKIAkJaWYgKGd3YV90eXBlICE9IChJUFY2X0FERFJfTElOS0xPQ0FMfElQVjZfQUREUl9VTklDQVNUKSkgewpAQCAtMTMyOSwyNiArMTM1NCwyNiBAQAogCQkJICAgc29tZSBleGNlcHRpb25zLiAtLUFOSwogCQkJICovCiAJCQllcnIgPSAtRUlOVkFMOwotCQkJaWYgKCEoZ3dhX3R5cGUmSVBWNl9BRERSX1VOSUNBU1QpKQorCQkJaWYgKCEoZ3dhX3R5cGUgJiBJUFY2X0FERFJfVU5JQ0FTVCkpCiAJCQkJZ290byBvdXQ7CiAKIAkJCWdydCA9IHJ0Nl9sb29rdXAobmV0LCBnd19hZGRyLCBOVUxMLCBjZmctPmZjX2lmaW5kZXgsIDEpOwogCiAJCQllcnIgPSAtRUhPU1RVTlJFQUNIOwotCQkJaWYgKGdydCA9PSBOVUxMKQorCQkJaWYgKCFncnQpCiAJCQkJZ290byBvdXQ7CiAJCQlpZiAoZGV2KSB7Ci0JCQkJaWYgKGRldiAhPSBncnQtPnJ0NmlfZGV2KSB7CisJCQkJaWYgKGRldiAhPSBncnQtPmRzdC5kZXYpIHsKIAkJCQkJZHN0X3JlbGVhc2UoJmdydC0+ZHN0KTsKIAkJCQkJZ290byBvdXQ7CiAJCQkJfQogCQkJfSBlbHNlIHsKLQkJCQlkZXYgPSBncnQtPnJ0NmlfZGV2OworCQkJCWRldiA9IGdydC0+ZHN0LmRldjsKIAkJCQlpZGV2ID0gZ3J0LT5ydDZpX2lkZXY7CiAJCQkJZGV2X2hvbGQoZGV2KTsKIAkJCQlpbjZfZGV2X2hvbGQoZ3J0LT5ydDZpX2lkZXYpOwogCQkJfQotCQkJaWYgKCEoZ3J0LT5ydDZpX2ZsYWdzJlJURl9HQVRFV0FZKSkKKwkJCWlmICghKGdydC0+cnQ2aV9mbGFncyAmIFJURl9HQVRFV0FZKSkKIAkJCQllcnIgPSAwOwogCQkJZHN0X3JlbGVhc2UoJmdydC0+ZHN0KTsKIApAQCAtMTM1NiwxMiArMTM4MSwxMiBAQAogCQkJCWdvdG8gb3V0OwogCQl9CiAJCWVyciA9IC1FSU5WQUw7Ci0JCWlmIChkZXYgPT0gTlVMTCB8fCAoZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0spKQorCQlpZiAoIWRldiB8fCAoZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSykpCiAJCQlnb3RvIG91dDsKIAl9CiAKIAllcnIgPSAtRU5PREVWOwotCWlmIChkZXYgPT0gTlVMTCkKKwlpZiAoIWRldikKIAkJZ290byBvdXQ7CiAKIAlpZiAoIWlwdjZfYWRkcl9hbnkoJmNmZy0+ZmNfcHJlZnNyYykpIHsKQEAgLTEzNjksMTggKzEzOTQsMTUgQEAKIAkJCWVyciA9IC1FSU5WQUw7CiAJCQlnb3RvIG91dDsKIAkJfQotCQlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfcHJlZnNyYy5hZGRyLCAmY2ZnLT5mY19wcmVmc3JjKTsKKwkJcnQtPnJ0NmlfcHJlZnNyYy5hZGRyID0gY2ZnLT5mY19wcmVmc3JjOwogCQlydC0+cnQ2aV9wcmVmc3JjLnBsZW4gPSAxMjg7CiAJfSBlbHNlCiAJCXJ0LT5ydDZpX3ByZWZzcmMucGxlbiA9IDA7CiAKIAlpZiAoY2ZnLT5mY19mbGFncyAmIChSVEZfR0FURVdBWSB8IFJURl9OT05FWFRIT1ApKSB7Ci0JCXN0cnVjdCBuZWlnaGJvdXIgKm4gPSBfX25laWdoX2xvb2t1cF9lcnJubygmbmRfdGJsLCAmcnQtPnJ0NmlfZ2F0ZXdheSwgZGV2KTsKLQkJaWYgKElTX0VSUihuKSkgewotCQkJZXJyID0gUFRSX0VSUihuKTsKKwkJZXJyID0gcnQ2X2JpbmRfbmVpZ2hib3VyKHJ0LCBkZXYpOworCQlpZiAoZXJyKQogCQkJZ290byBvdXQ7Ci0JCX0KLQkJZHN0X3NldF9uZWlnaGJvdXIoJnJ0LT5kc3QsIG4pOwogCX0KIAogCXJ0LT5ydDZpX2ZsYWdzID0gY2ZnLT5mY19mbGFnczsKQEAgLTE0MjYsNyArMTQ0OCw3IEBACiB7CiAJaW50IGVycjsKIAlzdHJ1Y3QgZmliNl90YWJsZSAqdGFibGU7Ci0Jc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChydC0+cnQ2aV9kZXYpOworCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQocnQtPmRzdC5kZXYpOwogCiAJaWYgKHJ0ID09IG5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeSkKIAkJcmV0dXJuIC1FTk9FTlQ7CkBAIC0xNDQ1LDcgKzE0NjcsNyBAQAogaW50IGlwNl9kZWxfcnQoc3RydWN0IHJ0Nl9pbmZvICpydCkKIHsKIAlzdHJ1Y3QgbmxfaW5mbyBpbmZvID0gewotCQkubmxfbmV0ID0gZGV2X25ldChydC0+cnQ2aV9kZXYpLAorCQkubmxfbmV0ID0gZGV2X25ldChydC0+ZHN0LmRldiksCiAJfTsKIAlyZXR1cm4gX19pcDZfZGVsX3J0KHJ0LCAmaW5mbyk7CiB9CkBAIC0xNDU4LDcgKzE0ODAsNyBAQAogCWludCBlcnIgPSAtRVNSQ0g7CiAKIAl0YWJsZSA9IGZpYjZfZ2V0X3RhYmxlKGNmZy0+ZmNfbmxpbmZvLm5sX25ldCwgY2ZnLT5mY190YWJsZSk7Ci0JaWYgKHRhYmxlID09IE5VTEwpCisJaWYgKCF0YWJsZSkKIAkJcmV0dXJuIGVycjsKIAogCXJlYWRfbG9ja19iaCgmdGFibGUtPnRiNl9sb2NrKTsKQEAgLTE0NzAsOCArMTQ5Miw4IEBACiAJaWYgKGZuKSB7CiAJCWZvciAocnQgPSBmbi0+bGVhZjsgcnQ7IHJ0ID0gcnQtPmRzdC5ydDZfbmV4dCkgewogCQkJaWYgKGNmZy0+ZmNfaWZpbmRleCAmJgotCQkJICAgIChydC0+cnQ2aV9kZXYgPT0gTlVMTCB8fAotCQkJICAgICBydC0+cnQ2aV9kZXYtPmlmaW5kZXggIT0gY2ZnLT5mY19pZmluZGV4KSkKKwkJCSAgICAoIXJ0LT5kc3QuZGV2IHx8CisJCQkgICAgIHJ0LT5kc3QuZGV2LT5pZmluZGV4ICE9IGNmZy0+ZmNfaWZpbmRleCkpCiAJCQkJY29udGludWU7CiAJCQlpZiAoY2ZnLT5mY19mbGFncyAmIFJURl9HQVRFV0FZICYmCiAJCQkgICAgIWlwdjZfYWRkcl9lcXVhbCgmY2ZnLT5mY19nYXRld2F5LCAmcnQtPnJ0NmlfZ2F0ZXdheSkpCkBAIC0xNTMzLDcgKzE1NTUsNyBAQAogCQkJY29udGludWU7CiAJCWlmICghKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0dBVEVXQVkpKQogCQkJY29udGludWU7Ci0JCWlmIChmbDYtPmZsb3dpNl9vaWYgIT0gcnQtPnJ0NmlfZGV2LT5pZmluZGV4KQorCQlpZiAoZmw2LT5mbG93aTZfb2lmICE9IHJ0LT5kc3QuZGV2LT5pZmluZGV4KQogCQkJY29udGludWU7CiAJCWlmICghaXB2Nl9hZGRyX2VxdWFsKCZyZGZsLT5nYXRld2F5LCAmcnQtPnJ0NmlfZ2F0ZXdheSkpCiAJCQljb250aW51ZTsKQEAgLTE1NjYsNyArMTU4OCw3IEBACiAJCX0sCiAJfTsKIAotCWlwdjZfYWRkcl9jb3B5KCZyZGZsLmdhdGV3YXksIGdhdGV3YXkpOworCXJkZmwuZ2F0ZXdheSA9ICpnYXRld2F5OwogCiAJaWYgKHJ0Nl9uZWVkX3N0cmljdChkZXN0KSkKIAkJZmxhZ3MgfD0gUlQ2X0xPT0tVUF9GX0lGQUNFOwpAQCAtMTYxMSwxOCArMTYzMywxOCBAQAogCWRzdF9jb25maXJtKCZydC0+ZHN0KTsKIAogCS8qIER1cGxpY2F0ZSByZWRpcmVjdDogc2lsZW50bHkgaWdub3JlLiAqLwotCWlmIChuZWlnaCA9PSBkc3RfZ2V0X25laWdoYm91cl9yYXcoJnJ0LT5kc3QpKQorCWlmIChuZWlnaCA9PSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZl9yYXcoJnJ0LT5kc3QpKQogCQlnb3RvIG91dDsKIAogCW5ydCA9IGlwNl9ydF9jb3B5KHJ0LCBkZXN0KTsKLQlpZiAobnJ0ID09IE5VTEwpCisJaWYgKCFucnQpCiAJCWdvdG8gb3V0OwogCiAJbnJ0LT5ydDZpX2ZsYWdzID0gUlRGX0dBVEVXQVl8UlRGX1VQfFJURl9EWU5BTUlDfFJURl9DQUNIRTsKIAlpZiAob25fbGluaykKIAkJbnJ0LT5ydDZpX2ZsYWdzICY9IH5SVEZfR0FURVdBWTsKIAotCWlwdjZfYWRkcl9jb3B5KCZucnQtPnJ0NmlfZ2F0ZXdheSwgKHN0cnVjdCBpbjZfYWRkciopbmVpZ2gtPnByaW1hcnlfa2V5KTsKKwlucnQtPnJ0NmlfZ2F0ZXdheSA9ICooc3RydWN0IGluNl9hZGRyICopbmVpZ2gtPnByaW1hcnlfa2V5OwogCWRzdF9zZXRfbmVpZ2hib3VyKCZucnQtPmRzdCwgbmVpZ2hfY2xvbmUobmVpZ2gpKTsKIAogCWlmIChpcDZfaW5zX3J0KG5ydCkpCkBAIC0xNjMyLDcgKzE2NTQsNyBAQAogCW5ldGV2ZW50Lm5ldyA9ICZucnQtPmRzdDsKIAljYWxsX25ldGV2ZW50X25vdGlmaWVycyhORVRFVkVOVF9SRURJUkVDVCwgJm5ldGV2ZW50KTsKIAotCWlmIChydC0+cnQ2aV9mbGFncyZSVEZfQ0FDSEUpIHsKKwlpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfQ0FDSEUpIHsKIAkJaXA2X2RlbF9ydChydCk7CiAJCXJldHVybjsKIAl9CkBAIC0xNjUzLDcgKzE2NzUsNyBAQAogCWludCBhbGxmcmFnID0gMDsKIGFnYWluOgogCXJ0ID0gcnQ2X2xvb2t1cChuZXQsIGRhZGRyLCBzYWRkciwgaWZpbmRleCwgMCk7Ci0JaWYgKHJ0ID09IE5VTEwpCisJaWYgKCFydCkKIAkJcmV0dXJuOwogCiAJaWYgKHJ0Nl9jaGVja19leHBpcmVkKHJ0KSkgewpAQCAtMTcwMyw3ICsxNzI1LDcgQEAKIAkgICAxLiBJdCBpcyBjb25uZWN0ZWQgcm91dGUuIEFjdGlvbjogQ09XCiAJICAgMi4gSXQgaXMgZ2F0ZXdheWVkIHJvdXRlIG9yIE5PTkVYVEhPUCByb3V0ZS4gQWN0aW9uOiBjbG9uZSBpdC4KIAkgKi8KLQlpZiAoIWRzdF9nZXRfbmVpZ2hib3VyX3JhdygmcnQtPmRzdCkgJiYgIShydC0+cnQ2aV9mbGFncyAmIFJURl9OT05FWFRIT1ApKQorCWlmICghZHN0X2dldF9uZWlnaGJvdXJfbm9yZWZfcmF3KCZydC0+ZHN0KSAmJiAhKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX05PTkVYVEhPUCkpCiAJCW5ydCA9IHJ0Nl9hbGxvY19jb3cocnQsIGRhZGRyLCBzYWRkcik7CiAJZWxzZQogCQlucnQgPSBydDZfYWxsb2NfY2xvbmUocnQsIGRhZGRyKTsKQEAgLTE3NTksNyArMTc4MSw3IEBACiBzdGF0aWMgc3RydWN0IHJ0Nl9pbmZvICppcDZfcnRfY29weShjb25zdCBzdHJ1Y3QgcnQ2X2luZm8gKm9ydCwKIAkJCQkgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkZXN0KQogewotCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQob3J0LT5ydDZpX2Rldik7CisJc3RydWN0IG5ldCAqbmV0ID0gZGV2X25ldChvcnQtPmRzdC5kZXYpOwogCXN0cnVjdCBydDZfaW5mbyAqcnQgPSBpcDZfZHN0X2FsbG9jKCZuZXQtPmlwdjYuaXA2X2RzdF9vcHMsCiAJCQkJCSAgICBvcnQtPmRzdC5kZXYsIDApOwogCkBAIC0xNzY4LDcgKzE3OTAsNyBAQAogCQlydC0+ZHN0Lm91dHB1dCA9IG9ydC0+ZHN0Lm91dHB1dDsKIAkJcnQtPmRzdC5mbGFncyB8PSBEU1RfSE9TVDsKIAotCQlpcHY2X2FkZHJfY29weSgmcnQtPnJ0NmlfZHN0LmFkZHIsIGRlc3QpOworCQlydC0+cnQ2aV9kc3QuYWRkciA9ICpkZXN0OwogCQlydC0+cnQ2aV9kc3QucGxlbiA9IDEyODsKIAkJZHN0X2NvcHlfbWV0cmljcygmcnQtPmRzdCwgJm9ydC0+ZHN0KTsKIAkJcnQtPmRzdC5lcnJvciA9IG9ydC0+ZHN0LmVycm9yOwpAQCAtMTc3Niw5ICsxNzk4LDkgQEAKIAkJaWYgKHJ0LT5ydDZpX2lkZXYpCiAJCQlpbjZfZGV2X2hvbGQocnQtPnJ0NmlfaWRldik7CiAJCXJ0LT5kc3QubGFzdHVzZSA9IGppZmZpZXM7Ci0JCXJ0LT5ydDZpX2V4cGlyZXMgPSAwOworCQlydC0+ZHN0LmV4cGlyZXMgPSAwOwogCi0JCWlwdjZfYWRkcl9jb3B5KCZydC0+cnQ2aV9nYXRld2F5LCAmb3J0LT5ydDZpX2dhdGV3YXkpOworCQlydC0+cnQ2aV9nYXRld2F5ID0gb3J0LT5ydDZpX2dhdGV3YXk7CiAJCXJ0LT5ydDZpX2ZsYWdzID0gb3J0LT5ydDZpX2ZsYWdzICYgflJURl9FWFBJUkVTOwogCQlydC0+cnQ2aV9tZXRyaWMgPSAwOwogCkBAIC0xODAxLDcgKzE4MjMsNyBAQAogCXN0cnVjdCBmaWI2X3RhYmxlICp0YWJsZTsKIAogCXRhYmxlID0gZmliNl9nZXRfdGFibGUobmV0LCBSVDZfVEFCTEVfSU5GTyk7Ci0JaWYgKHRhYmxlID09IE5VTEwpCisJaWYgKCF0YWJsZSkKIAkJcmV0dXJuIE5VTEw7CiAKIAl3cml0ZV9sb2NrX2JoKCZ0YWJsZS0+dGI2X2xvY2spOwpAQCAtMTgxMCw3ICsxODMyLDcgQEAKIAkJZ290byBvdXQ7CiAKIAlmb3IgKHJ0ID0gZm4tPmxlYWY7IHJ0OyBydCA9IHJ0LT5kc3QucnQ2X25leHQpIHsKLQkJaWYgKHJ0LT5ydDZpX2Rldi0+aWZpbmRleCAhPSBpZmluZGV4KQorCQlpZiAocnQtPmRzdC5kZXYtPmlmaW5kZXggIT0gaWZpbmRleCkKIAkJCWNvbnRpbnVlOwogCQlpZiAoKHJ0LT5ydDZpX2ZsYWdzICYgKFJURl9ST1VURUlORk98UlRGX0dBVEVXQVkpKSAhPSAoUlRGX1JPVVRFSU5GT3xSVEZfR0FURVdBWSkpCiAJCQljb250aW51ZTsKQEAgLTE4NDEsOCArMTg2Myw4IEBACiAJCS5mY19ubGluZm8ubmxfbmV0ID0gbmV0LAogCX07CiAKLQlpcHY2X2FkZHJfY29weSgmY2ZnLmZjX2RzdCwgcHJlZml4KTsKLQlpcHY2X2FkZHJfY29weSgmY2ZnLmZjX2dhdGV3YXksIGd3YWRkcik7CisJY2ZnLmZjX2RzdCA9ICpwcmVmaXg7CisJY2ZnLmZjX2dhdGV3YXkgPSAqZ3dhZGRyOwogCiAJLyogV2Ugc2hvdWxkIHRyZWF0IGl0IGFzIGEgZGVmYXVsdCByb3V0ZSBpZiBwcmVmaXggbGVuZ3RoIGlzIDAuICovCiAJaWYgKCFwcmVmaXhsZW4pCkBAIC0xODYwLDEyICsxODgyLDEyIEBACiAJc3RydWN0IGZpYjZfdGFibGUgKnRhYmxlOwogCiAJdGFibGUgPSBmaWI2X2dldF90YWJsZShkZXZfbmV0KGRldiksIFJUNl9UQUJMRV9ERkxUKTsKLQlpZiAodGFibGUgPT0gTlVMTCkKKwlpZiAoIXRhYmxlKQogCQlyZXR1cm4gTlVMTDsKIAogCXdyaXRlX2xvY2tfYmgoJnRhYmxlLT50YjZfbG9jayk7CiAJZm9yIChydCA9IHRhYmxlLT50YjZfcm9vdC5sZWFmOyBydDsgcnQ9cnQtPmRzdC5ydDZfbmV4dCkgewotCQlpZiAoZGV2ID09IHJ0LT5ydDZpX2RldiAmJgorCQlpZiAoZGV2ID09IHJ0LT5kc3QuZGV2ICYmCiAJCSAgICAoKHJ0LT5ydDZpX2ZsYWdzICYgKFJURl9BRERSQ09ORiB8IFJURl9ERUZBVUxUKSkgPT0gKFJURl9BRERSQ09ORiB8IFJURl9ERUZBVUxUKSkgJiYKIAkJICAgIGlwdjZfYWRkcl9lcXVhbCgmcnQtPnJ0NmlfZ2F0ZXdheSwgYWRkcikpCiAJCQlicmVhazsKQEAgLTE4OTEsNyArMTkxMyw3IEBACiAJCS5mY19ubGluZm8ubmxfbmV0ID0gZGV2X25ldChkZXYpLAogCX07CiAKLQlpcHY2X2FkZHJfY29weSgmY2ZnLmZjX2dhdGV3YXksIGd3YWRkcik7CisJY2ZnLmZjX2dhdGV3YXkgPSAqZ3dhZGRyOwogCiAJaXA2X3JvdXRlX2FkZCgmY2ZnKTsKIApAQCAtMTkwNSw3ICsxOTI3LDcgQEAKIAogCS8qIE5PVEU6IEtlZXAgY29uc2lzdGVudCB3aXRoIHJ0Nl9nZXRfZGZsdF9yb3V0ZXIgKi8KIAl0YWJsZSA9IGZpYjZfZ2V0X3RhYmxlKG5ldCwgUlQ2X1RBQkxFX0RGTFQpOwotCWlmICh0YWJsZSA9PSBOVUxMKQorCWlmICghdGFibGUpCiAJCXJldHVybjsKIAogcmVzdGFydDoKQEAgLTE5MzcsOSArMTk1OSw5IEBACiAKIAljZmctPmZjX25saW5mby5ubF9uZXQgPSBuZXQ7CiAKLQlpcHY2X2FkZHJfY29weSgmY2ZnLT5mY19kc3QsICZydG1zZy0+cnRtc2dfZHN0KTsKLQlpcHY2X2FkZHJfY29weSgmY2ZnLT5mY19zcmMsICZydG1zZy0+cnRtc2dfc3JjKTsKLQlpcHY2X2FkZHJfY29weSgmY2ZnLT5mY19nYXRld2F5LCAmcnRtc2ctPnJ0bXNnX2dhdGV3YXkpOworCWNmZy0+ZmNfZHN0ID0gcnRtc2ctPnJ0bXNnX2RzdDsKKwljZmctPmZjX3NyYyA9IHJ0bXNnLT5ydG1zZ19zcmM7CisJY2ZnLT5mY19nYXRld2F5ID0gcnRtc2ctPnJ0bXNnX2dhdGV3YXk7CiB9CiAKIGludCBpcHY2X3JvdXRlX2lvY3RsKHN0cnVjdCBuZXQgKm5ldCwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKQEAgLTIwMzgsMTQgKzIwNjAsMTQgQEAKIAogc3RydWN0IHJ0Nl9pbmZvICphZGRyY29uZl9kc3RfYWxsb2Moc3RydWN0IGluZXQ2X2RldiAqaWRldiwKIAkJCQkgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyLAotCQkJCSAgICBpbnQgYW55Y2FzdCkKKwkJCQkgICAgYm9vbCBhbnljYXN0KQogewogCXN0cnVjdCBuZXQgKm5ldCA9IGRldl9uZXQoaWRldi0+ZGV2KTsKIAlzdHJ1Y3QgcnQ2X2luZm8gKnJ0ID0gaXA2X2RzdF9hbGxvYygmbmV0LT5pcHY2LmlwNl9kc3Rfb3BzLAogCQkJCQkgICAgbmV0LT5sb29wYmFja19kZXYsIDApOwotCXN0cnVjdCBuZWlnaGJvdXIgKm5laWdoOworCWludCBlcnI7CiAKLQlpZiAocnQgPT0gTlVMTCkgeworCWlmICghcnQpIHsKIAkJaWYgKG5ldF9yYXRlbGltaXQoKSkKIAkJCXByX3dhcm5pbmcoIklQdjY6ICBNYXhpbXVtIG51bWJlciBvZiByb3V0ZXMgcmVhY2hlZCwiCiAJCQkJICAgIiBjb25zaWRlciBpbmNyZWFzaW5nIHJvdXRlL21heF9zaXplLlxuIik7CkBAIC0yMDY1LDE1ICsyMDg3LDEzIEBACiAJCXJ0LT5ydDZpX2ZsYWdzIHw9IFJURl9BTllDQVNUOwogCWVsc2UKIAkJcnQtPnJ0NmlfZmxhZ3MgfD0gUlRGX0xPQ0FMOwotCW5laWdoID0gbmRpc2NfZ2V0X25laWdoKHJ0LT5ydDZpX2RldiwgJnJ0LT5ydDZpX2dhdGV3YXkpOwotCWlmIChJU19FUlIobmVpZ2gpKSB7CisJZXJyID0gcnQ2X2JpbmRfbmVpZ2hib3VyKHJ0LCBydC0+ZHN0LmRldik7CisJaWYgKGVycikgewogCQlkc3RfZnJlZSgmcnQtPmRzdCk7Ci0KLQkJcmV0dXJuIEVSUl9DQVNUKG5laWdoKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKIAl9Ci0JZHN0X3NldF9uZWlnaGJvdXIoJnJ0LT5kc3QsIG5laWdoKTsKIAotCWlwdjZfYWRkcl9jb3B5KCZydC0+cnQ2aV9kc3QuYWRkciwgYWRkcik7CisJcnQtPnJ0NmlfZHN0LmFkZHIgPSAqYWRkcjsKIAlydC0+cnQ2aV9kc3QucGxlbiA9IDEyODsKIAlydC0+cnQ2aV90YWJsZSA9IGZpYjZfZ2V0X3RhYmxlKG5ldCwgUlQ2X1RBQkxFX0xPQ0FMKTsKIApAQCAtMjA5MSw3ICsyMTExLDcgQEAKIAlzdHJ1Y3QgaW5ldDZfZGV2ICppZGV2ID0gaXA2X2RzdF9pZGV2KChzdHJ1Y3QgZHN0X2VudHJ5KilydCk7CiAJaW50IGVyciA9IDA7CiAJaWYgKHJ0LT5ydDZpX3ByZWZzcmMucGxlbikKLQkJaXB2Nl9hZGRyX2NvcHkoc2FkZHIsICZydC0+cnQ2aV9wcmVmc3JjLmFkZHIpOworCQkqc2FkZHIgPSBydC0+cnQ2aV9wcmVmc3JjLmFkZHI7CiAJZWxzZQogCQllcnIgPSBpcHY2X2Rldl9nZXRfc2FkZHIobmV0LCBpZGV2ID8gaWRldi0+ZGV2IDogTlVMTCwKIAkJCQkJIGRhZGRyLCBwcmVmcywgc2FkZHIpOwpAQCAtMjExMSw3ICsyMTMxLDcgQEAKIAlzdHJ1Y3QgbmV0ICpuZXQgPSAoKHN0cnVjdCBhcmdfZGV2X25ldF9pcCAqKWFyZyktPm5ldDsKIAlzdHJ1Y3QgaW42X2FkZHIgKmFkZHIgPSAoKHN0cnVjdCBhcmdfZGV2X25ldF9pcCAqKWFyZyktPmFkZHI7CiAKLQlpZiAoKCh2b2lkICopcnQtPnJ0NmlfZGV2ID09IGRldiB8fCBkZXYgPT0gTlVMTCkgJiYKKwlpZiAoKCh2b2lkICopcnQtPmRzdC5kZXYgPT0gZGV2IHx8ICFkZXYpICYmCiAJICAgIHJ0ICE9IG5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeSAmJgogCSAgICBpcHY2X2FkZHJfZXF1YWwoYWRkciwgJnJ0LT5ydDZpX3ByZWZzcmMuYWRkcikpIHsKIAkJLyogcmVtb3ZlIHByZWZzcmMgZW50cnkgKi8KQEAgLTIxNDEsMTEgKzIxNjEsMTAgQEAKIAljb25zdCBzdHJ1Y3QgYXJnX2Rldl9uZXQgKmFkbiA9IGFyZzsKIAljb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gYWRuLT5kZXY7CiAKLQlpZiAoKHJ0LT5ydDZpX2RldiA9PSBkZXYgfHwgZGV2ID09IE5VTEwpICYmCi0JICAgIHJ0ICE9IGFkbi0+bmV0LT5pcHY2LmlwNl9udWxsX2VudHJ5KSB7Ci0JCVJUNl9UUkFDRSgiZGVsZXRlZCBieSBpZmRvd24gJXBcbiIsIHJ0KTsKKwlpZiAoKHJ0LT5kc3QuZGV2ID09IGRldiB8fCAhZGV2KSAmJgorCSAgICBydCAhPSBhZG4tPm5ldC0+aXB2Ni5pcDZfbnVsbF9lbnRyeSkKIAkJcmV0dXJuIC0xOwotCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0yMTc4LDcgKzIxOTcsNyBAQAogCSovCiAKIAlpZGV2ID0gX19pbjZfZGV2X2dldChhcmctPmRldik7Ci0JaWYgKGlkZXYgPT0gTlVMTCkKKwlpZiAoIWlkZXYpCiAJCXJldHVybiAwOwogCiAJLyogRm9yIGFkbWluaXN0cmF0aXZlIE1UVSBpbmNyZWFzZSwgdGhlcmUgaXMgbm8gd2F5IHRvIGRpc2NvdmVyCkBAIC0yMTk1LDcgKzIyMTQsNyBAQAogCSAgIGFsc28gaGF2ZSB0aGUgbG93ZXN0IE1UVSwgVE9PIEJJRyBNRVNTQUdFIHdpbGwgYmUgbGVhZCB0bwogCSAgIFBNVFUgZGlzY291dmVyeS4KIAkgKi8KLQlpZiAocnQtPnJ0NmlfZGV2ID09IGFyZy0+ZGV2ICYmCisJaWYgKHJ0LT5kc3QuZGV2ID09IGFyZy0+ZGV2ICYmCiAJICAgICFkc3RfbWV0cmljX2xvY2tlZCgmcnQtPmRzdCwgUlRBWF9NVFUpICYmCiAJICAgIChkc3RfbXR1KCZydC0+ZHN0KSA+PSBhcmctPm10dSB8fAogCSAgICAgKGRzdF9tdHUoJnJ0LT5kc3QpIDwgYXJnLT5tdHUgJiYKQEAgLTIzNDQsMTEgKzIzNjMsMTMgQEAKIAkJCSBpbnQgaWlmLCBpbnQgdHlwZSwgdTMyIHBpZCwgdTMyIHNlcSwKIAkJCSBpbnQgcHJlZml4LCBpbnQgbm93YWl0LCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7CisJY29uc3Qgc3RydWN0IGluZXRfcGVlciAqcGVlcjsKIAlzdHJ1Y3QgcnRtc2cgKnJ0bTsKIAlzdHJ1Y3Qgbmxtc2doZHIgKm5saDsKIAlsb25nIGV4cGlyZXM7CiAJdTMyIHRhYmxlOwogCXN0cnVjdCBuZWlnaGJvdXIgKm47CisJdTMyIHRzLCB0c2FnZTsKIAogCWlmIChwcmVmaXgpIHsJLyogdXNlciB3YW50cyBwcmVmaXggcm91dGVzIG9ubHkgKi8KIAkJaWYgKCEocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfUFJFRklYX1JUKSkgewpAQCAtMjM1OCw3ICsyMzc5LDcgQEAKIAl9CiAKIAlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgdHlwZSwgc2l6ZW9mKCpydG0pLCBmbGFncyk7Ci0JaWYgKG5saCA9PSBOVUxMKQorCWlmICghbmxoKQogCQlyZXR1cm4gLUVNU0dTSVpFOwogCiAJcnRtID0gbmxtc2dfZGF0YShubGgpOwpAQCAtMjM3MiwyNSArMjM5MywyNSBAQAogCQl0YWJsZSA9IFJUNl9UQUJMRV9VTlNQRUM7CiAJcnRtLT5ydG1fdGFibGUgPSB0YWJsZTsKIAlOTEFfUFVUX1UzMihza2IsIFJUQV9UQUJMRSwgdGFibGUpOwotCWlmIChydC0+cnQ2aV9mbGFncyZSVEZfUkVKRUNUKQorCWlmIChydC0+cnQ2aV9mbGFncyAmIFJURl9SRUpFQ1QpCiAJCXJ0bS0+cnRtX3R5cGUgPSBSVE5fVU5SRUFDSEFCTEU7Ci0JZWxzZSBpZiAocnQtPnJ0NmlfZmxhZ3MmUlRGX0xPQ0FMKQorCWVsc2UgaWYgKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0xPQ0FMKQogCQlydG0tPnJ0bV90eXBlID0gUlROX0xPQ0FMOwotCWVsc2UgaWYgKHJ0LT5ydDZpX2RldiAmJiAocnQtPnJ0NmlfZGV2LT5mbGFncyZJRkZfTE9PUEJBQ0spKQorCWVsc2UgaWYgKHJ0LT5kc3QuZGV2ICYmIChydC0+ZHN0LmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKQogCQlydG0tPnJ0bV90eXBlID0gUlROX0xPQ0FMOwogCWVsc2UKIAkJcnRtLT5ydG1fdHlwZSA9IFJUTl9VTklDQVNUOwogCXJ0bS0+cnRtX2ZsYWdzID0gMDsKIAlydG0tPnJ0bV9zY29wZSA9IFJUX1NDT1BFX1VOSVZFUlNFOwogCXJ0bS0+cnRtX3Byb3RvY29sID0gcnQtPnJ0NmlfcHJvdG9jb2w7Ci0JaWYgKHJ0LT5ydDZpX2ZsYWdzJlJURl9EWU5BTUlDKQorCWlmIChydC0+cnQ2aV9mbGFncyAmIFJURl9EWU5BTUlDKQogCQlydG0tPnJ0bV9wcm90b2NvbCA9IFJUUFJPVF9SRURJUkVDVDsKIAllbHNlIGlmIChydC0+cnQ2aV9mbGFncyAmIFJURl9BRERSQ09ORikKIAkJcnRtLT5ydG1fcHJvdG9jb2wgPSBSVFBST1RfS0VSTkVMOwotCWVsc2UgaWYgKHJ0LT5ydDZpX2ZsYWdzJlJURl9ERUZBVUxUKQorCWVsc2UgaWYgKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0RFRkFVTFQpCiAJCXJ0bS0+cnRtX3Byb3RvY29sID0gUlRQUk9UX1JBOwogCi0JaWYgKHJ0LT5ydDZpX2ZsYWdzJlJURl9DQUNIRSkKKwlpZiAocnQtPnJ0NmlfZmxhZ3MgJiBSVEZfQ0FDSEUpCiAJCXJ0bS0+cnRtX2ZsYWdzIHw9IFJUTV9GX0NMT05FRDsKIAogCWlmIChkc3QpIHsKQEAgLTI0MzAsNyArMjQ1MSw3IEBACiAKIAlpZiAocnQtPnJ0NmlfcHJlZnNyYy5wbGVuKSB7CiAJCXN0cnVjdCBpbjZfYWRkciBzYWRkcl9idWY7Ci0JCWlwdjZfYWRkcl9jb3B5KCZzYWRkcl9idWYsICZydC0+cnQ2aV9wcmVmc3JjLmFkZHIpOworCQlzYWRkcl9idWYgPSBydC0+cnQ2aV9wcmVmc3JjLmFkZHI7CiAJCU5MQV9QVVQoc2tiLCBSVEFfUFJFRlNSQywgMTYsICZzYWRkcl9idWYpOwogCX0KIApAQCAtMjQzOCwyNCArMjQ1OSwzMSBAQAogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQluID0gZHN0X2dldF9uZWlnaGJvdXIoJnJ0LT5kc3QpOworCW4gPSBkc3RfZ2V0X25laWdoYm91cl9ub3JlZigmcnQtPmRzdCk7CiAJaWYgKG4pCiAJCU5MQV9QVVQoc2tiLCBSVEFfR0FURVdBWSwgMTYsICZuLT5wcmltYXJ5X2tleSk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKIAlpZiAocnQtPmRzdC5kZXYpCi0JCU5MQV9QVVRfVTMyKHNrYiwgUlRBX09JRiwgcnQtPnJ0NmlfZGV2LT5pZmluZGV4KTsKKwkJTkxBX1BVVF9VMzIoc2tiLCBSVEFfT0lGLCBydC0+ZHN0LmRldi0+aWZpbmRleCk7CiAKIAlOTEFfUFVUX1UzMihza2IsIFJUQV9QUklPUklUWSwgcnQtPnJ0NmlfbWV0cmljKTsKIAogCWlmICghKHJ0LT5ydDZpX2ZsYWdzICYgUlRGX0VYUElSRVMpKQogCQlleHBpcmVzID0gMDsKLQllbHNlIGlmIChydC0+cnQ2aV9leHBpcmVzIC0gamlmZmllcyA8IElOVF9NQVgpCi0JCWV4cGlyZXMgPSBydC0+cnQ2aV9leHBpcmVzIC0gamlmZmllczsKKwllbHNlIGlmIChydC0+ZHN0LmV4cGlyZXMgLSBqaWZmaWVzIDwgSU5UX01BWCkKKwkJZXhwaXJlcyA9IHJ0LT5kc3QuZXhwaXJlcyAtIGppZmZpZXM7CiAJZWxzZQogCQlleHBpcmVzID0gSU5UX01BWDsKIAotCWlmIChydG5sX3B1dF9jYWNoZWluZm8oc2tiLCAmcnQtPmRzdCwgMCwgMCwgMCwKKwlwZWVyID0gcnQtPnJ0NmlfcGVlcjsKKwl0cyA9IHRzYWdlID0gMDsKKwlpZiAocGVlciAmJiBwZWVyLT50Y3BfdHNfc3RhbXApIHsKKwkJdHMgPSBwZWVyLT50Y3BfdHM7CisJCXRzYWdlID0gZ2V0X3NlY29uZHMoKSAtIHBlZXItPnRjcF90c19zdGFtcDsKKwl9CisKKwlpZiAocnRubF9wdXRfY2FjaGVpbmZvKHNrYiwgJnJ0LT5kc3QsIDAsIHRzLCB0c2FnZSwKIAkJCSAgICAgICBleHBpcmVzLCBydC0+ZHN0LmVycm9yKSA8IDApCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCkBAIC0yNTA0LDE0ICsyNTMyLDE0IEBACiAJCWlmIChubGFfbGVuKHRiW1JUQV9TUkNdKSA8IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKQogCQkJZ290byBlcnJvdXQ7CiAKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi5zYWRkciwgbmxhX2RhdGEodGJbUlRBX1NSQ10pKTsKKwkJZmw2LnNhZGRyID0gKihzdHJ1Y3QgaW42X2FkZHIgKilubGFfZGF0YSh0YltSVEFfU1JDXSk7CiAJfQogCiAJaWYgKHRiW1JUQV9EU1RdKSB7CiAJCWlmIChubGFfbGVuKHRiW1JUQV9EU1RdKSA8IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKQogCQkJZ290byBlcnJvdXQ7CiAKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgbmxhX2RhdGEodGJbUlRBX0RTVF0pKTsKKwkJZmw2LmRhZGRyID0gKihzdHJ1Y3QgaW42X2FkZHIgKilubGFfZGF0YSh0YltSVEFfRFNUXSk7CiAJfQogCiAJaWYgKHRiW1JUQV9JSUZdKQpAQCAtMjUzMCw3ICsyNTU4LDcgQEAKIAl9CiAKIAlza2IgPSBhbGxvY19za2IoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOwotCWlmIChza2IgPT0gTlVMTCkgeworCWlmICghc2tiKSB7CiAJCWVyciA9IC1FTk9CVUZTOwogCQlnb3RvIGVycm91dDsKIAl9CkBAIC0yNTY1LDEwICsyNTkzLDEwIEBACiAJaW50IGVycjsKIAogCWVyciA9IC1FTk9CVUZTOwotCXNlcSA9IGluZm8tPm5saCAhPSBOVUxMID8gaW5mby0+bmxoLT5ubG1zZ19zZXEgOiAwOworCXNlcSA9IGluZm8tPm5saCA/IGluZm8tPm5saC0+bmxtc2dfc2VxIDogMDsKIAogCXNrYiA9IG5sbXNnX25ldyhydDZfbmxtc2dfc2l6ZSgpLCBnZnBfYW55KCkpOwotCWlmIChza2IgPT0gTlVMTCkKKwlpZiAoIXNrYikKIAkJZ290byBlcnJvdXQ7CiAKIAllcnIgPSBydDZfZmlsbF9ub2RlKG5ldCwgc2tiLCBydCwgTlVMTCwgTlVMTCwgMCwKQEAgLTI2MzUsNyArMjY2Myw3IEBACiAJc2VxX3B1dHMobSwgIjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwIDAwICIpOwogI2VuZGlmCiAJcmN1X3JlYWRfbG9jaygpOwotCW4gPSBkc3RfZ2V0X25laWdoYm91cigmcnQtPmRzdCk7CisJbiA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKCZydC0+ZHN0KTsKIAlpZiAobikgewogCQlzZXFfcHJpbnRmKG0sICIlcGk2Iiwgbi0+cHJpbWFyeV9rZXkpOwogCX0gZWxzZSB7CkBAIC0yNjQ1LDE0ICsyNjczLDE0IEBACiAJc2VxX3ByaW50ZihtLCAiICUwOHggJTA4eCAlMDh4ICUwOHggJThzXG4iLAogCQkgICBydC0+cnQ2aV9tZXRyaWMsIGF0b21pY19yZWFkKCZydC0+ZHN0Ll9fcmVmY250KSwKIAkJICAgcnQtPmRzdC5fX3VzZSwgcnQtPnJ0NmlfZmxhZ3MsCi0JCSAgIHJ0LT5ydDZpX2RldiA/IHJ0LT5ydDZpX2Rldi0+bmFtZSA6ICIiKTsKKwkJICAgcnQtPmRzdC5kZXYgPyBydC0+ZHN0LmRldi0+bmFtZSA6ICIiKTsKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpcHY2X3JvdXRlX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQogewogCXN0cnVjdCBuZXQgKm5ldCA9IChzdHJ1Y3QgbmV0ICopbS0+cHJpdmF0ZTsKLQlmaWI2X2NsZWFuX2FsbChuZXQsIHJ0Nl9pbmZvX3JvdXRlLCAwLCBtKTsKKwlmaWI2X2NsZWFuX2FsbF9ybyhuZXQsIHJ0Nl9pbmZvX3JvdXRlLCAwLCBtKTsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc2l0LmMgYi9uZXQvaXB2Ni9zaXQuYwppbmRleCBhN2ExODYwLi4zYjZkYWM5IDEwMDY0NAotLS0gYS9uZXQvaXB2Ni9zaXQuYworKysgYi9uZXQvaXB2Ni9zaXQuYwpAQCAtOTEsNyArOTEsNyBAQAogCXVuc2lnbmVkIGxvbmcJcnhfYnl0ZXM7CiAJdW5zaWduZWQgbG9uZwl0eF9wYWNrZXRzOwogCXVuc2lnbmVkIGxvbmcJdHhfYnl0ZXM7Ci19OworfSBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKDQqc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKSkpOwogCiBzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vfc3RhdHMgKmlwaXA2X2dldF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQogewpAQCAtMjYzLDYgKzI2Myw4IEBACiAJaWYgKHJlZ2lzdGVyX25ldGRldmljZShkZXYpIDwgMCkKIAkJZ290byBmYWlsZWRfZnJlZTsKIAorCXN0cmNweShudC0+cGFybXMubmFtZSwgZGV2LT5uYW1lKTsKKwogCWRldl9ob2xkKGRldik7CiAKIAlpcGlwNl90dW5uZWxfbGluayhzaXRuLCBudCk7CkBAIC02ODAsNyArNjgyLDcgQEAKIAkJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBOVUxMOwogCiAJCWlmIChza2JfZHN0KHNrYikpCi0JCQluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKHNrYl9kc3Qoc2tiKSk7CisJCQluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKHNrYl9kc3Qoc2tiKSk7CiAKIAkJaWYgKG5laWdoID09IE5VTEwpIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCkBAIC03MDUsNyArNzA3LDcgQEAKIAkJc3RydWN0IG5laWdoYm91ciAqbmVpZ2ggPSBOVUxMOwogCiAJCWlmIChza2JfZHN0KHNrYikpCi0JCQluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyKHNrYl9kc3Qoc2tiKSk7CisJCQluZWlnaCA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKHNrYl9kc3Qoc2tiKSk7CiAKIAkJaWYgKG5laWdoID09IE5VTEwpIHsKIAkJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCkBAIC05MTQsNyArOTE2LDcgQEAKIAkJCQlnb3RvIGRvbmU7CiAjaWZkZWYgQ09ORklHX0lQVjZfU0lUXzZSRAogCQl9IGVsc2UgewotCQkJaXB2Nl9hZGRyX2NvcHkoJmlwNnJkLnByZWZpeCwgJnQtPmlwNnJkLnByZWZpeCk7CisJCQlpcDZyZC5wcmVmaXggPSB0LT5pcDZyZC5wcmVmaXg7CiAJCQlpcDZyZC5yZWxheV9wcmVmaXggPSB0LT5pcDZyZC5yZWxheV9wcmVmaXg7CiAJCQlpcDZyZC5wcmVmaXhsZW4gPSB0LT5pcDZyZC5wcmVmaXhsZW47CiAJCQlpcDZyZC5yZWxheV9wcmVmaXhsZW4gPSB0LT5pcDZyZC5yZWxheV9wcmVmaXhsZW47CkBAIC0xMDgyLDcgKzEwODQsNyBAQAogCQkJaWYgKHJlbGF5X3ByZWZpeCAhPSBpcDZyZC5yZWxheV9wcmVmaXgpCiAJCQkJZ290byBkb25lOwogCi0JCQlpcHY2X2FkZHJfY29weSgmdC0+aXA2cmQucHJlZml4LCAmcHJlZml4KTsKKwkJCXQtPmlwNnJkLnByZWZpeCA9IHByZWZpeDsKIAkJCXQtPmlwNnJkLnJlbGF5X3ByZWZpeCA9IHJlbGF5X3ByZWZpeDsKIAkJCXQtPmlwNnJkLnByZWZpeGxlbiA9IGlwNnJkLnByZWZpeGxlbjsKIAkJCXQtPmlwNnJkLnJlbGF5X3ByZWZpeGxlbiA9IGlwNnJkLnJlbGF5X3ByZWZpeGxlbjsKQEAgLTExNDQsNyArMTE0Niw2IEBACiAJc3RydWN0IGlwX3R1bm5lbCAqdHVubmVsID0gbmV0ZGV2X3ByaXYoZGV2KTsKIAogCXR1bm5lbC0+ZGV2ID0gZGV2OwotCXN0cmNweSh0dW5uZWwtPnBhcm1zLm5hbWUsIGRldi0+bmFtZSk7CiAKIAltZW1jcHkoZGV2LT5kZXZfYWRkciwgJnR1bm5lbC0+cGFybXMuaXBoLnNhZGRyLCA0KTsKIAltZW1jcHkoZGV2LT5icm9hZGNhc3QsICZ0dW5uZWwtPnBhcm1zLmlwaC5kYWRkciwgNCk7CkBAIC0xMjA3LDYgKzEyMDgsNyBAQAogc3RhdGljIGludCBfX25ldF9pbml0IHNpdF9pbml0X25ldChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJc3RydWN0IHNpdF9uZXQgKnNpdG4gPSBuZXRfZ2VuZXJpYyhuZXQsIHNpdF9uZXRfaWQpOworCXN0cnVjdCBpcF90dW5uZWwgKnQ7CiAJaW50IGVycjsKIAogCXNpdG4tPnR1bm5lbHNbMF0gPSBzaXRuLT50dW5uZWxzX3djOwpAQCAtMTIzMSw2ICsxMjMzLDkgQEAKIAlpZiAoKGVyciA9IHJlZ2lzdGVyX25ldGRldihzaXRuLT5mYl90dW5uZWxfZGV2KSkpCiAJCWdvdG8gZXJyX3JlZ19kZXY7CiAKKwl0ID0gbmV0ZGV2X3ByaXYoc2l0bi0+ZmJfdHVubmVsX2Rldik7CisKKwlzdHJjcHkodC0+cGFybXMubmFtZSwgc2l0bi0+ZmJfdHVubmVsX2Rldi0+bmFtZSk7CiAJcmV0dXJuIDA7CiAKIGVycl9yZWdfZGV2OgpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvc3luY29va2llcy5jIGIvbmV0L2lwdjYvc3luY29va2llcy5jCmluZGV4IDVhMGQ2NjQuLjhlOTUxZDggMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3N5bmNvb2tpZXMuYworKysgYi9uZXQvaXB2Ni9zeW5jb29raWVzLmMKQEAgLTIwMCw4ICsyMDAsOCBAQAogCXJlcS0+bXNzID0gbXNzOwogCWlyZXEtPnJtdF9wb3J0ID0gdGgtPnNvdXJjZTsKIAlpcmVxLT5sb2NfcG9ydCA9IHRoLT5kZXN0OwotCWlwdjZfYWRkcl9jb3B5KCZpcmVxNi0+cm10X2FkZHIsICZpcHY2X2hkcihza2IpLT5zYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlyZXE2LT5sb2NfYWRkciwgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKKwlpcmVxNi0+cm10X2FkZHIgPSBpcHY2X2hkcihza2IpLT5zYWRkcjsKKwlpcmVxNi0+bG9jX2FkZHIgPSBpcHY2X2hkcihza2IpLT5kYWRkcjsKIAlpZiAoaXB2Nl9vcHRfYWNjZXB0ZWQoc2ssIHNrYikgfHwKIAkgICAgbnAtPnJ4b3B0LmJpdHMucnhpbmZvIHx8IG5wLT5yeG9wdC5iaXRzLnJ4b2luZm8gfHwKIAkgICAgbnAtPnJ4b3B0LmJpdHMucnhobGltIHx8IG5wLT5yeG9wdC5iaXRzLnJ4b2hsaW0pIHsKQEAgLTIzNyw5ICsyMzcsOSBAQAogCQlzdHJ1Y3QgZmxvd2k2IGZsNjsKIAkJbWVtc2V0KCZmbDYsIDAsIHNpemVvZihmbDYpKTsKIAkJZmw2LmZsb3dpNl9wcm90byA9IElQUFJPVE9fVENQOwotCQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmaXJlcTYtPnJtdF9hZGRyKTsKKwkJZmw2LmRhZGRyID0gaXJlcTYtPnJtdF9hZGRyOwogCQlmaW5hbF9wID0gZmw2X3VwZGF0ZV9kc3QoJmZsNiwgbnAtPm9wdCwgJmZpbmFsKTsKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi5zYWRkciwgJmlyZXE2LT5sb2NfYWRkcik7CisJCWZsNi5zYWRkciA9IGlyZXE2LT5sb2NfYWRkcjsKIAkJZmw2LmZsb3dpNl9vaWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOwogCQlmbDYuZmxvd2k2X21hcmsgPSBzay0+c2tfbWFyazsKIAkJZmw2LmZsNl9kcG9ydCA9IGluZXRfcnNrKHJlcSktPnJtdF9wb3J0OwpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYvdGNwX2lwdjYuYyBiL25ldC9pcHY2L3RjcF9pcHY2LmMKaW5kZXggMzYxMzFkMS4uOTA2YzdjYSAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdGNwX2lwdjYuYworKysgYi9uZXQvaXB2Ni90Y3BfaXB2Ni5jCkBAIC02Miw2ICs2Miw3IEBACiAjaW5jbHVkZSA8bmV0L25ldGRtYS5oPgogI2luY2x1ZGUgPG5ldC9pbmV0X2NvbW1vbi5oPgogI2luY2x1ZGUgPG5ldC9zZWN1cmVfc2VxLmg+CisjaW5jbHVkZSA8bmV0L3RjcF9tZW1jb250cm9sLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCkBAIC0xNTMsNyArMTU0LDcgQEAKIAkJCWZsb3dsYWJlbCA9IGZsNl9zb2NrX2xvb2t1cChzaywgZmw2LmZsb3dsYWJlbCk7CiAJCQlpZiAoZmxvd2xhYmVsID09IE5VTEwpCiAJCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQlpcHY2X2FkZHJfY29weSgmdXNpbi0+c2luNl9hZGRyLCAmZmxvd2xhYmVsLT5kc3QpOworCQkJdXNpbi0+c2luNl9hZGRyID0gZmxvd2xhYmVsLT5kc3Q7CiAJCQlmbDZfc29ja19yZWxlYXNlKGZsb3dsYWJlbCk7CiAJCX0KIAl9CkBAIC0xOTUsNyArMTk2LDcgQEAKIAkJdHAtPndyaXRlX3NlcSA9IDA7CiAJfQogCi0JaXB2Nl9hZGRyX2NvcHkoJm5wLT5kYWRkciwgJnVzaW4tPnNpbjZfYWRkcik7CisJbnAtPmRhZGRyID0gdXNpbi0+c2luNl9hZGRyOwogCW5wLT5mbG93X2xhYmVsID0gZmw2LmZsb3dsYWJlbDsKIAogCS8qCkBAIC0yNDQsOSArMjQ1LDggQEAKIAkJc2FkZHIgPSAmbnAtPnJjdl9zYWRkcjsKIAogCWZsNi5mbG93aTZfcHJvdG8gPSBJUFBST1RPX1RDUDsKLQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmbnAtPmRhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmZmw2LnNhZGRyLAotCQkgICAgICAgKHNhZGRyID8gc2FkZHIgOiAmbnAtPnNhZGRyKSk7CisJZmw2LmRhZGRyID0gbnAtPmRhZGRyOworCWZsNi5zYWRkciA9IHNhZGRyID8gKnNhZGRyIDogbnAtPnNhZGRyOwogCWZsNi5mbG93aTZfb2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAlmbDYuZmxvd2k2X21hcmsgPSBzay0+c2tfbWFyazsKIAlmbDYuZmw2X2Rwb3J0ID0gdXNpbi0+c2luNl9wb3J0OwpAQCAtMjY0LDExICsyNjQsMTEgQEAKIAogCWlmIChzYWRkciA9PSBOVUxMKSB7CiAJCXNhZGRyID0gJmZsNi5zYWRkcjsKLQkJaXB2Nl9hZGRyX2NvcHkoJm5wLT5yY3Zfc2FkZHIsIHNhZGRyKTsKKwkJbnAtPnJjdl9zYWRkciA9ICpzYWRkcjsKIAl9CiAKIAkvKiBzZXQgdGhlIHNvdXJjZSBhZGRyZXNzICovCi0JaXB2Nl9hZGRyX2NvcHkoJm5wLT5zYWRkciwgc2FkZHIpOworCW5wLT5zYWRkciA9ICpzYWRkcjsKIAlpbmV0LT5pbmV0X3Jjdl9zYWRkciA9IExPT1BCQUNLNF9JUFY2OwogCiAJc2stPnNrX2dzb190eXBlID0gU0tCX0dTT19UQ1BWNjsKQEAgLTM5OCw4ICszOTgsOCBAQAogCQkJICovCiAJCQltZW1zZXQoJmZsNiwgMCwgc2l6ZW9mKGZsNikpOwogCQkJZmw2LmZsb3dpNl9wcm90byA9IElQUFJPVE9fVENQOwotCQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgJm5wLT5kYWRkcik7Ci0JCQlpcHY2X2FkZHJfY29weSgmZmw2LnNhZGRyLCAmbnAtPnNhZGRyKTsKKwkJCWZsNi5kYWRkciA9IG5wLT5kYWRkcjsKKwkJCWZsNi5zYWRkciA9IG5wLT5zYWRkcjsKIAkJCWZsNi5mbG93aTZfb2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKIAkJCWZsNi5mbG93aTZfbWFyayA9IHNrLT5za19tYXJrOwogCQkJZmw2LmZsNl9kcG9ydCA9IGluZXQtPmluZXRfZHBvcnQ7CkBAIC00ODksOCArNDg5LDggQEAKIAogCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7CiAJZmw2LmZsb3dpNl9wcm90byA9IElQUFJPVE9fVENQOwotCWlwdjZfYWRkcl9jb3B5KCZmbDYuZGFkZHIsICZ0cmVxLT5ybXRfYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi5zYWRkciwgJnRyZXEtPmxvY19hZGRyKTsKKwlmbDYuZGFkZHIgPSB0cmVxLT5ybXRfYWRkcjsKKwlmbDYuc2FkZHIgPSB0cmVxLT5sb2NfYWRkcjsKIAlmbDYuZmxvd2xhYmVsID0gMDsKIAlmbDYuZmxvd2k2X29pZiA9IHRyZXEtPmlpZjsKIAlmbDYuZmxvd2k2X21hcmsgPSBzay0+c2tfbWFyazsKQEAgLTUxMiw3ICs1MTIsNyBAQAogCWlmIChza2IpIHsKIAkJX190Y3BfdjZfc2VuZF9jaGVjayhza2IsICZ0cmVxLT5sb2NfYWRkciwgJnRyZXEtPnJtdF9hZGRyKTsKIAotCQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmdHJlcS0+cm10X2FkZHIpOworCQlmbDYuZGFkZHIgPSB0cmVxLT5ybXRfYWRkcjsKIAkJZXJyID0gaXA2X3htaXQoc2ssIHNrYiwgJmZsNiwgb3B0LCBucC0+dGNsYXNzKTsKIAkJZXJyID0gbmV0X3htaXRfZXZhbChlcnIpOwogCX0KQEAgLTYxNyw4ICs2MTcsNyBAQAogCQkJdHAtPm1kNXNpZ19pbmZvLT5hbGxvY2VkNisrOwogCQl9CiAKLQkJaXB2Nl9hZGRyX2NvcHkoJnRwLT5tZDVzaWdfaW5mby0+a2V5czZbdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNl0uYWRkciwKLQkJCSAgICAgICBwZWVyKTsKKwkJdHAtPm1kNXNpZ19pbmZvLT5rZXlzNlt0cC0+bWQ1c2lnX2luZm8tPmVudHJpZXM2XS5hZGRyID0gKnBlZXI7CiAJCXRwLT5tZDVzaWdfaW5mby0+a2V5czZbdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNl0uYmFzZS5rZXkgPSBuZXdrZXk7CiAJCXRwLT5tZDVzaWdfaW5mby0+a2V5czZbdHAtPm1kNXNpZ19pbmZvLT5lbnRyaWVzNl0uYmFzZS5rZXlsZW4gPSBuZXdrZXlsZW47CiAKQEAgLTc1MCw4ICs3NDksOCBAQAogCiAJYnAgPSAmaHAtPm1kNV9ibGsuaXA2OwogCS8qIDEuIFRDUCBwc2V1ZG8taGVhZGVyIChSRkMyNDYwKSAqLwotCWlwdjZfYWRkcl9jb3B5KCZicC0+c2FkZHIsIHNhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmYnAtPmRhZGRyLCBkYWRkcik7CisJYnAtPnNhZGRyID0gKnNhZGRyOworCWJwLT5kYWRkciA9ICpkYWRkcjsKIAlicC0+cHJvdG9jb2wgPSBjcHVfdG9fYmUzMihJUFBST1RPX1RDUCk7CiAJYnAtPmxlbiA9IGNwdV90b19iZTMyKG5ieXRlcyk7CiAKQEAgLTEwMzksOCArMTAzOCw4IEBACiAjZW5kaWYKIAogCW1lbXNldCgmZmw2LCAwLCBzaXplb2YoZmw2KSk7Ci0JaXB2Nl9hZGRyX2NvcHkoJmZsNi5kYWRkciwgJmlwdjZfaGRyKHNrYiktPnNhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmZmw2LnNhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOworCWZsNi5kYWRkciA9IGlwdjZfaGRyKHNrYiktPnNhZGRyOworCWZsNi5zYWRkciA9IGlwdjZfaGRyKHNrYiktPmRhZGRyOwogCiAJYnVmZi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fUEFSVElBTDsKIAlidWZmLT5jc3VtID0gMDsKQEAgLTEyNTAsMTEgKzEyNDksMTggQEAKIAl0Y3Bfb3BlbnJlcV9pbml0KHJlcSwgJnRtcF9vcHQsIHNrYik7CiAKIAl0cmVxID0gaW5ldDZfcnNrKHJlcSk7Ci0JaXB2Nl9hZGRyX2NvcHkoJnRyZXEtPnJtdF9hZGRyLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZ0cmVxLT5sb2NfYWRkciwgJmlwdjZfaGRyKHNrYiktPmRhZGRyKTsKKwl0cmVxLT5ybXRfYWRkciA9IGlwdjZfaGRyKHNrYiktPnNhZGRyOworCXRyZXEtPmxvY19hZGRyID0gaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CiAJaWYgKCF3YW50X2Nvb2tpZSB8fCB0bXBfb3B0LnRzdGFtcF9vaykKIAkJVENQX0VDTl9jcmVhdGVfcmVxdWVzdChyZXEsIHRjcF9oZHIoc2tiKSk7CiAKKwl0cmVxLT5paWYgPSBzay0+c2tfYm91bmRfZGV2X2lmOworCisJLyogU28gdGhhdCBsaW5rIGxvY2FscyBoYXZlIG1lYW5pbmcgKi8KKwlpZiAoIXNrLT5za19ib3VuZF9kZXZfaWYgJiYKKwkgICAgaXB2Nl9hZGRyX3R5cGUoJnRyZXEtPnJtdF9hZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpCisJCXRyZXEtPmlpZiA9IGluZXQ2X2lpZihza2IpOworCiAJaWYgKCFpc24pIHsKIAkJc3RydWN0IGluZXRfcGVlciAqcGVlciA9IE5VTEw7CiAKQEAgLTEyNjQsMTIgKzEyNzAsNiBAQAogCQkJYXRvbWljX2luYygmc2tiLT51c2Vycyk7CiAJCQl0cmVxLT5wa3RvcHRzID0gc2tiOwogCQl9Ci0JCXRyZXEtPmlpZiA9IHNrLT5za19ib3VuZF9kZXZfaWY7Ci0KLQkJLyogU28gdGhhdCBsaW5rIGxvY2FscyBoYXZlIG1lYW5pbmcgKi8KLQkJaWYgKCFzay0+c2tfYm91bmRfZGV2X2lmICYmCi0JCSAgICBpcHY2X2FkZHJfdHlwZSgmdHJlcS0+cm10X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKLQkJCXRyZXEtPmlpZiA9IGluZXQ2X2lpZihza2IpOwogCiAJCWlmICh3YW50X2Nvb2tpZSkgewogCQkJaXNuID0gY29va2llX3Y2X2luaXRfc2VxdWVuY2Uoc2ssIHNrYiwgJnJlcS0+bXNzKTsKQEAgLTEzODAsNyArMTM4MCw3IEBACiAKIAkJaXB2Nl9hZGRyX3NldF92NG1hcHBlZChuZXdpbmV0LT5pbmV0X3NhZGRyLCAmbmV3bnAtPnNhZGRyKTsKIAotCQlpcHY2X2FkZHJfY29weSgmbmV3bnAtPnJjdl9zYWRkciwgJm5ld25wLT5zYWRkcik7CisJCW5ld25wLT5yY3Zfc2FkZHIgPSBuZXducC0+c2FkZHI7CiAKIAkJaW5ldF9jc2sobmV3c2spLT5pY3NrX2FmX29wcyA9ICZpcHY2X21hcHBlZDsKIAkJbmV3c2stPnNrX2JhY2tsb2dfcmN2ID0gdGNwX3Y0X2RvX3JjdjsKQEAgLTE0NDQsOSArMTQ0NCw5IEBACiAKIAltZW1jcHkobmV3bnAsIG5wLCBzaXplb2Yoc3RydWN0IGlwdjZfcGluZm8pKTsKIAotCWlwdjZfYWRkcl9jb3B5KCZuZXducC0+ZGFkZHIsICZ0cmVxLT5ybXRfYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJm5ld25wLT5zYWRkciwgJnRyZXEtPmxvY19hZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmbmV3bnAtPnJjdl9zYWRkciwgJnRyZXEtPmxvY19hZGRyKTsKKwluZXducC0+ZGFkZHIgPSB0cmVxLT5ybXRfYWRkcjsKKwluZXducC0+c2FkZHIgPSB0cmVxLT5sb2NfYWRkcjsKKwluZXducC0+cmN2X3NhZGRyID0gdHJlcS0+bG9jX2FkZHI7CiAJbmV3c2stPnNrX2JvdW5kX2Rldl9pZiA9IHRyZXEtPmlpZjsKIAogCS8qIE5vdyBJUHY2IG9wdGlvbnMuLi4KQEAgLTE5OTUsNyArMTk5NSw4IEBACiAJc2stPnNrX3JjdmJ1ZiA9IHN5c2N0bF90Y3Bfcm1lbVsxXTsKIAogCWxvY2FsX2JoX2Rpc2FibGUoKTsKLQlwZXJjcHVfY291bnRlcl9pbmMoJnRjcF9zb2NrZXRzX2FsbG9jYXRlZCk7CisJc29ja191cGRhdGVfbWVtY2coc2spOworCXNrX3NvY2tldHNfYWxsb2NhdGVkX2luYyhzayk7CiAJbG9jYWxfYmhfZW5hYmxlKCk7CiAKIAlyZXR1cm4gMDsKQEAgLTIyMTQsNyArMjIxNSw2IEBACiAJLm1lbW9yeV9hbGxvY2F0ZWQJPSAmdGNwX21lbW9yeV9hbGxvY2F0ZWQsCiAJLm1lbW9yeV9wcmVzc3VyZQk9ICZ0Y3BfbWVtb3J5X3ByZXNzdXJlLAogCS5vcnBoYW5fY291bnQJCT0gJnRjcF9vcnBoYW5fY291bnQsCi0JLnN5c2N0bF9tZW0JCT0gc3lzY3RsX3RjcF9tZW0sCiAJLnN5c2N0bF93bWVtCQk9IHN5c2N0bF90Y3Bfd21lbSwKIAkuc3lzY3RsX3JtZW0JCT0gc3lzY3RsX3RjcF9ybWVtLAogCS5tYXhfaGVhZGVyCQk9IE1BWF9UQ1BfSEVBREVSLApAQCAtMjIyOCw2ICsyMjI4LDkgQEAKIAkuY29tcGF0X3NldHNvY2tvcHQJPSBjb21wYXRfdGNwX3NldHNvY2tvcHQsCiAJLmNvbXBhdF9nZXRzb2Nrb3B0CT0gY29tcGF0X3RjcF9nZXRzb2Nrb3B0LAogI2VuZGlmCisjaWZkZWYgQ09ORklHX0NHUk9VUF9NRU1fUkVTX0NUTFJfS01FTQorCS5wcm90b19jZ3JvdXAJCT0gdGNwX3Byb3RvX2Nncm91cCwKKyNlbmRpZgogfTsKIAogc3RhdGljIGNvbnN0IHN0cnVjdCBpbmV0Nl9wcm90b2NvbCB0Y3B2Nl9wcm90b2NvbCA9IHsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3VkcC5jIGIvbmV0L2lwdjYvdWRwLmMKaW5kZXggODQ2ZjQ3NS4uNGY5NmI1YyAxMDA2NDQKLS0tIGEvbmV0L2lwdjYvdWRwLmMKKysrIGIvbmV0L2lwdjYvdWRwLmMKQEAgLTIzOCw3ICsyMzgsNyBAQAogCXJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXRpYyBzdHJ1Y3Qgc29jayAqX191ZHA2X2xpYl9sb29rdXAoc3RydWN0IG5ldCAqbmV0LAorc3RydWN0IHNvY2sgKl9fdWRwNl9saWJfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwKIAkJCQkgICAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKnNhZGRyLCBfX2JlMTYgc3BvcnQsCiAJCQkJICAgICAgY29uc3Qgc3RydWN0IGluNl9hZGRyICpkYWRkciwgX19iZTE2IGRwb3J0LAogCQkJCSAgICAgIGludCBkaWYsIHN0cnVjdCB1ZHBfdGFibGUgKnVkcHRhYmxlKQpAQCAtMzA1LDYgKzMwNSw3IEBACiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKF9fdWRwNl9saWJfbG9va3VwKTsKIAogc3RhdGljIHN0cnVjdCBzb2NrICpfX3VkcDZfbGliX2xvb2t1cF9za2Ioc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkJICBfX2JlMTYgc3BvcnQsIF9fYmUxNiBkcG9ydCwKQEAgLTM0MCw3ICszNDEsNyBAQAogCXN0cnVjdCBpcHY2X3BpbmZvICpucCA9IGluZXQ2X3NrKHNrKTsKIAlzdHJ1Y3QgaW5ldF9zb2NrICppbmV0ID0gaW5ldF9zayhzayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQl1bnNpZ25lZCBpbnQgdWxlbjsKKwl1bnNpZ25lZCBpbnQgdWxlbiwgY29waWVkOwogCWludCBwZWVrZWQ7CiAJaW50IGVycjsKIAlpbnQgaXNfdWRwbGl0ZSA9IElTX1VEUExJVEUoc2spOwpAQCAtMzYzLDkgKzM2NCwxMCBAQAogCQlnb3RvIG91dDsKIAogCXVsZW4gPSBza2ItPmxlbiAtIHNpemVvZihzdHJ1Y3QgdWRwaGRyKTsKLQlpZiAobGVuID4gdWxlbikKLQkJbGVuID0gdWxlbjsKLQllbHNlIGlmIChsZW4gPCB1bGVuKQorCWNvcGllZCA9IGxlbjsKKwlpZiAoY29waWVkID4gdWxlbikKKwkJY29waWVkID0gdWxlbjsKKwllbHNlIGlmIChjb3BpZWQgPCB1bGVuKQogCQltc2ctPm1zZ19mbGFncyB8PSBNU0dfVFJVTkM7CiAKIAlpc191ZHA0ID0gKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfSVApKTsKQEAgLTM3NiwxNCArMzc4LDE0IEBACiAJICogY292ZXJhZ2UgY2hlY2tzdW0gKFVEUC1MaXRlKSwgZG8gaXQgYmVmb3JlIHRoZSBjb3B5LgogCSAqLwogCi0JaWYgKGxlbiA8IHVsZW4gfHwgVURQX1NLQl9DQihza2IpLT5wYXJ0aWFsX2NvdikgeworCWlmIChjb3BpZWQgPCB1bGVuIHx8IFVEUF9TS0JfQ0Ioc2tiKS0+cGFydGlhbF9jb3YpIHsKIAkJaWYgKHVkcF9saWJfY2hlY2tzdW1fY29tcGxldGUoc2tiKSkKIAkJCWdvdG8gY3N1bV9jb3B5X2VycjsKIAl9CiAKIAlpZiAoc2tiX2NzdW1fdW5uZWNlc3Nhcnkoc2tiKSkKIAkJZXJyID0gc2tiX2NvcHlfZGF0YWdyYW1faW92ZWMoc2tiLCBzaXplb2Yoc3RydWN0IHVkcGhkciksCi0JCQkJCSAgICAgIG1zZy0+bXNnX2lvdixsZW4pOworCQkJCQkgICAgICBtc2ctPm1zZ19pb3YsIGNvcGllZCAgICAgICApOwogCWVsc2UgewogCQllcnIgPSBza2JfY29weV9hbmRfY3N1bV9kYXRhZ3JhbV9pb3ZlYyhza2IsIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSwgbXNnLT5tc2dfaW92KTsKIAkJaWYgKGVyciA9PSAtRUlOVkFMKQpAQCAtNDE3LDggKzQxOSw3IEBACiAJCQlpcHY2X2FkZHJfc2V0X3Y0bWFwcGVkKGlwX2hkcihza2IpLT5zYWRkciwKIAkJCQkJICAgICAgICZzaW42LT5zaW42X2FkZHIpOwogCQllbHNlIHsKLQkJCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsCi0JCQkJICAgICAgICZpcHY2X2hkcihza2IpLT5zYWRkcik7CisJCQlzaW42LT5zaW42X2FkZHIgPSBpcHY2X2hkcihza2IpLT5zYWRkcjsKIAkJCWlmIChpcHY2X2FkZHJfdHlwZSgmc2luNi0+c2luNl9hZGRyKSAmIElQVjZfQUREUl9MSU5LTE9DQUwpCiAJCQkJc2luNi0+c2luNl9zY29wZV9pZCA9IElQNkNCKHNrYiktPmlpZjsKIAkJfQpAQCAtNDMyLDcgKzQzMyw3IEBACiAJCQlkYXRhZ3JhbV9yZWN2X2N0bChzaywgbXNnLCBza2IpOwogCX0KIAotCWVyciA9IGxlbjsKKwllcnIgPSBjb3BpZWQ7CiAJaWYgKGZsYWdzICYgTVNHX1RSVU5DKQogCQllcnIgPSB1bGVuOwogCkBAIC01MzgsNyArNTM5LDkgQEAKIAkJCWdvdG8gZHJvcDsKIAl9CiAKLQlpZiAoKHJjID0gaXBfcXVldWVfcmN2X3NrYihzaywgc2tiKSkgPCAwKSB7CisJc2tiX2RzdF9kcm9wKHNrYik7CisJcmMgPSBzb2NrX3F1ZXVlX3Jjdl9za2Ioc2ssIHNrYik7CisJaWYgKHJjIDwgMCkgewogCQkvKiBOb3RlIHRoYXQgYW4gRU5PTUVNIGVycm9yIGlzIGNoYXJnZWQgdHdpY2UgKi8KIAkJaWYgKHJjID09IC1FTk9NRU0pCiAJCQlVRFA2X0lOQ19TVEFUU19CSChzb2NrX25ldChzayksCkBAIC0xMTEzLDExICsxMTE2LDExIEBACiAKIAlmbDYuZmxvd2k2X3Byb3RvID0gc2stPnNrX3Byb3RvY29sOwogCWlmICghaXB2Nl9hZGRyX2FueShkYWRkcikpCi0JCWlwdjZfYWRkcl9jb3B5KCZmbDYuZGFkZHIsIGRhZGRyKTsKKwkJZmw2LmRhZGRyID0gKmRhZGRyOwogCWVsc2UKIAkJZmw2LmRhZGRyLnM2X2FkZHJbMTVdID0gMHgxOyAvKiA6OiBtZWFucyBsb29wYmFjayAoQlNEJ2lzbSkgKi8KIAlpZiAoaXB2Nl9hZGRyX2FueSgmZmw2LnNhZGRyKSAmJiAhaXB2Nl9hZGRyX2FueSgmbnAtPnNhZGRyKSkKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi5zYWRkciwgJm5wLT5zYWRkcik7CisJCWZsNi5zYWRkciA9IG5wLT5zYWRkcjsKIAlmbDYuZmw2X3Nwb3J0ID0gaW5ldC0+aW5ldF9zcG9ydDsKIAogCWZpbmFsX3AgPSBmbDZfdXBkYXRlX2RzdCgmZmw2LCBvcHQsICZmaW5hbCk7CkBAIC0xMjk4LDcgKzEzMDEsOCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnVkcDZfdWZvX2ZyYWdtZW50KHN0cnVjdCBza19idWZmICpza2IsIHUzMiBmZWF0dXJlcykKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqdWRwNl91Zm9fZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwluZXRkZXZfZmVhdHVyZXNfdCBmZWF0dXJlcykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2VncyA9IEVSUl9QVFIoLUVJTlZBTCk7CiAJdW5zaWduZWQgaW50IG1zczsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X21vZGVfYmVldC5jIGIvbmV0L2lwdjYveGZybTZfbW9kZV9iZWV0LmMKaW5kZXggMzQzN2Q3ZC4uYTgxY2U5NCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfbW9kZV9iZWV0LmMKKysrIGIvbmV0L2lwdjYveGZybTZfbW9kZV9iZWV0LmMKQEAgLTcyLDggKzcyLDggQEAKIAkJdG9wX2lwaC0+bmV4dGhkciA9IElQUFJPVE9fQkVFVFBIOwogCX0KIAotCWlwdjZfYWRkcl9jb3B5KCZ0b3BfaXBoLT5zYWRkciwgKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5wcm9wcy5zYWRkcik7Ci0JaXB2Nl9hZGRyX2NvcHkoJnRvcF9pcGgtPmRhZGRyLCAoc3RydWN0IGluNl9hZGRyICopJngtPmlkLmRhZGRyKTsKKwl0b3BfaXBoLT5zYWRkciA9ICooc3RydWN0IGluNl9hZGRyICopJngtPnByb3BzLnNhZGRyOworCXRvcF9pcGgtPmRhZGRyID0gKihzdHJ1Y3QgaW42X2FkZHIgKikmeC0+aWQuZGFkZHI7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTk5LDggKzk5LDggQEAKIAogCWlwNmggPSBpcHY2X2hkcihza2IpOwogCWlwNmgtPnBheWxvYWRfbGVuID0gaHRvbnMoc2tiLT5sZW4gLSBzaXplKTsKLQlpcHY2X2FkZHJfY29weSgmaXA2aC0+ZGFkZHIsIChzdHJ1Y3QgaW42X2FkZHIgKikgJngtPnNlbC5kYWRkci5hNik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwNmgtPnNhZGRyLCAoc3RydWN0IGluNl9hZGRyICopICZ4LT5zZWwuc2FkZHIuYTYpOworCWlwNmgtPmRhZGRyID0gKihzdHJ1Y3QgaW42X2FkZHIgKikmeC0+c2VsLmRhZGRyLmE2OworCWlwNmgtPnNhZGRyID0gKihzdHJ1Y3QgaW42X2FkZHIgKikmeC0+c2VsLnNhZGRyLmE2OwogCWVyciA9IDA7CiBvdXQ6CiAJcmV0dXJuIGVycjsKZGlmZiAtLWdpdCBhL25ldC9pcHY2L3hmcm02X21vZGVfdHVubmVsLmMgYi9uZXQvaXB2Ni94ZnJtNl9tb2RlX3R1bm5lbC5jCmluZGV4IDRkNmVkZmYuLjI2MWU2ZTYgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X21vZGVfdHVubmVsLmMKKysrIGIvbmV0L2lwdjYveGZybTZfbW9kZV90dW5uZWwuYwpAQCAtNTUsOCArNTUsOCBAQAogCQlkc2ZpZWxkICY9IH5JTkVUX0VDTl9NQVNLOwogCWlwdjZfY2hhbmdlX2RzZmllbGQodG9wX2lwaCwgMCwgZHNmaWVsZCk7CiAJdG9wX2lwaC0+aG9wX2xpbWl0ID0gaXA2X2RzdF9ob3BsaW1pdChkc3QtPmNoaWxkKTsKLQlpcHY2X2FkZHJfY29weSgmdG9wX2lwaC0+c2FkZHIsIChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKikmeC0+cHJvcHMuc2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZ0b3BfaXBoLT5kYWRkciwgKGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5pZC5kYWRkcik7CisJdG9wX2lwaC0+c2FkZHIgPSAqKHN0cnVjdCBpbjZfYWRkciAqKSZ4LT5wcm9wcy5zYWRkcjsKKwl0b3BfaXBoLT5kYWRkciA9ICooc3RydWN0IGluNl9hZGRyICopJngtPmlkLmRhZGRyOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9vdXRwdXQuYyBiL25ldC9pcHY2L3hmcm02X291dHB1dC5jCmluZGV4IGZhYWU0MTcuLjRlZWZmODkgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X291dHB1dC5jCisrKyBiL25ldC9pcHY2L3hmcm02X291dHB1dC5jCkBAIC00OSw3ICs0OSw3IEBACiAJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKIAogCWZsNi5mbG93aTZfb2lmID0gc2stPnNrX2JvdW5kX2Rldl9pZjsKLQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOworCWZsNi5kYWRkciA9IGlwdjZfaGRyKHNrYiktPmRhZGRyOwogCiAJaXB2Nl9sb2NhbF9yeHBtdHUoc2ssICZmbDYsIG10dSk7CiB9CkBAIC02MCw3ICs2MCw3IEBACiAJc3RydWN0IHNvY2sgKnNrID0gc2tiLT5zazsKIAogCWZsNi5mbDZfZHBvcnQgPSBpbmV0X3NrKHNrKS0+aW5ldF9kcG9ydDsKLQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIpOworCWZsNi5kYWRkciA9IGlwdjZfaGRyKHNrYiktPmRhZGRyOwogCiAJaXB2Nl9sb2NhbF9lcnJvcihzaywgRU1TR1NJWkUsICZmbDYsIG10dSk7CiB9CmRpZmYgLS1naXQgYS9uZXQvaXB2Ni94ZnJtNl9wb2xpY3kuYyBiL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCmluZGV4IGQ4NzlmN2UuLjhlYTY1ZTAgMTAwNjQ0Ci0tLSBhL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCisrKyBiL25ldC9pcHY2L3hmcm02X3BvbGljeS5jCkBAIC0xMzIsOCArMTMyLDggQEAKIAltZW1zZXQoZmw2LCAwLCBzaXplb2Yoc3RydWN0IGZsb3dpNikpOwogCWZsNi0+Zmxvd2k2X21hcmsgPSBza2ItPm1hcms7CiAKLQlpcHY2X2FkZHJfY29weSgmZmw2LT5kYWRkciwgcmV2ZXJzZSA/ICZoZHItPnNhZGRyIDogJmhkci0+ZGFkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZmbDYtPnNhZGRyLCByZXZlcnNlID8gJmhkci0+ZGFkZHIgOiAmaGRyLT5zYWRkcik7CisJZmw2LT5kYWRkciA9IHJldmVyc2UgPyBoZHItPnNhZGRyIDogaGRyLT5kYWRkcjsKKwlmbDYtPnNhZGRyID0gcmV2ZXJzZSA/IGhkci0+ZGFkZHIgOiBoZHItPnNhZGRyOwogCiAJd2hpbGUgKG5oICsgb2Zmc2V0ICsgMSA8IHNrYi0+ZGF0YSB8fAogCSAgICAgICBwc2tiX21heV9wdWxsKHNrYiwgbmggKyBvZmZzZXQgKyAxIC0gc2tiLT5kYXRhKSkgewpkaWZmIC0tZ2l0IGEvbmV0L2lwdjYveGZybTZfc3RhdGUuYyBiL25ldC9pcHY2L3hmcm02X3N0YXRlLmMKaW5kZXggZjJkNzJiOC4uM2YyZjdjNCAxMDA2NDQKLS0tIGEvbmV0L2lwdjYveGZybTZfc3RhdGUuYworKysgYi9uZXQvaXB2Ni94ZnJtNl9zdGF0ZS5jCkBAIC0yNyw4ICsyNyw4IEBACiAKIAkvKiBJbml0aWFsaXplIHRlbXBvcmFyeSBzZWxlY3RvciBtYXRjaGluZyBvbmx5CiAJICogdG8gY3VycmVudCBzZXNzaW9uLiAqLwotCWlwdjZfYWRkcl9jb3B5KChzdHJ1Y3QgaW42X2FkZHIgKikmc2VsLT5kYWRkciwgJmZsNi0+ZGFkZHIpOwotCWlwdjZfYWRkcl9jb3B5KChzdHJ1Y3QgaW42X2FkZHIgKikmc2VsLT5zYWRkciwgJmZsNi0+c2FkZHIpOworCSooc3RydWN0IGluNl9hZGRyICopJnNlbC0+ZGFkZHIgPSBmbDYtPmRhZGRyOworCSooc3RydWN0IGluNl9hZGRyICopJnNlbC0+c2FkZHIgPSBmbDYtPnNhZGRyOwogCXNlbC0+ZHBvcnQgPSB4ZnJtX2Zsb3dpX2Rwb3J0KGZsLCAmZmw2LT51bGkpOwogCXNlbC0+ZHBvcnRfbWFzayA9IGh0b25zKDB4ZmZmZik7CiAJc2VsLT5zcG9ydCA9IHhmcm1fZmxvd2lfc3BvcnQoZmwsICZmbDYtPnVsaSk7CmRpZmYgLS1naXQgYS9uZXQvaXJkYS9hZl9pcmRhLmMgYi9uZXQvaXJkYS9hZl9pcmRhLmMKaW5kZXggYzI0ZjI1YS4uYmIxNGMzNCAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvYWZfaXJkYS5jCisrKyBiL25ldC9pcmRhL2FmX2lyZGEuYwpAQCAtMjU1OCw4ICsyNTU4LDggQEAKIAkJCXNlbGYtPmVycm5vID0gMDsKIAkJCXNldHVwX3RpbWVyKCZzZWxmLT53YXRjaGRvZywgaXJkYV9kaXNjb3ZlcnlfdGltZW91dCwKIAkJCQkJKHVuc2lnbmVkIGxvbmcpc2VsZik7Ci0JCQlzZWxmLT53YXRjaGRvZy5leHBpcmVzID0gamlmZmllcyArICh2YWwgKiBIWi8xMDAwKTsKLQkJCWFkZF90aW1lcigmKHNlbGYtPndhdGNoZG9nKSk7CisJCQltb2RfdGltZXIoJnNlbGYtPndhdGNoZG9nLAorCQkJCSAgamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXModmFsKSk7CiAKIAkJCS8qIFdhaXQgZm9yIElSLUxNUCB0byBjYWxsIHVzIGJhY2sgKi8KIAkJCV9fd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHNlbGYtPnF1ZXJ5X3dhaXQsCmRpZmYgLS1naXQgYS9uZXQvaXJkYS9pcmxhbi9pcmxhbl9jb21tb24uYyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NvbW1vbi5jCmluZGV4IDc3OTExNzYuLjU3OTYxN2MgMTAwNjQ0Ci0tLSBhL25ldC9pcmRhL2lybGFuL2lybGFuX2NvbW1vbi5jCisrKyBiL25ldC9pcmRhL2lybGFuL2lybGFuX2NvbW1vbi5jCkBAIC02Nyw3ICs2Nyw3IEBACiBzdGF0aWMgdm9pZCAqc2tleTsKIAogLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KLXN0YXRpYyBpbnQgZXRoOyAgIC8qIFVzZSAiZXRoIiBvciAiaXJsYW4iIG5hbWUgZm9yIGRldmljZXMgKi8KK3N0YXRpYyBib29sIGV0aDsgICAvKiBVc2UgImV0aCIgb3IgImlybGFuIiBuYW1lIGZvciBkZXZpY2VzICovCiBzdGF0aWMgaW50IGFjY2VzcyA9IEFDQ0VTU19QRUVSOyAvKiBQRUVSLCBESVJFQ1Qgb3IgSE9TVEVEICovCiAKICNpZmRlZiBDT05GSUdfUFJPQ19GUwpkaWZmIC0tZ2l0IGEvbmV0L2lyZGEvaXJ0dHAuYyBiL25ldC9pcmRhL2lydHRwLmMKaW5kZXggMzJlM2JiMC4uNWM5M2YyOSAxMDA2NDQKLS0tIGEvbmV0L2lyZGEvaXJ0dHAuYworKysgYi9uZXQvaXJkYS9pcnR0cC5jCkBAIC0xNDYxLDE0ICsxNDYxLDEyIEBACiAJfQogCiAJLyogQWxsb2NhdGUgYSBuZXcgaW5zdGFuY2UgKi8KLQluZXcgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHNhcF9jYiksIEdGUF9BVE9NSUMpOworCW5ldyA9IGttZW1kdXAob3JpZywgc2l6ZW9mKHN0cnVjdCB0c2FwX2NiKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFuZXcpIHsKIAkJSVJEQV9ERUJVRygwLCAiJXMoKSwgdW5hYmxlIHRvIGttYWxsb2NcbiIsIF9fZnVuY19fKTsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaXJ0dHAtPnRzYXBzLT5oYl9zcGlubG9jaywgZmxhZ3MpOwogCQlyZXR1cm4gTlVMTDsKIAl9Ci0JLyogRHVwICovCi0JbWVtY3B5KG5ldywgb3JpZywgc2l6ZW9mKHN0cnVjdCB0c2FwX2NiKSk7CiAJc3Bpbl9sb2NrX2luaXQoJm5ldy0+bG9jayk7CiAKIAkvKiBXZSBkb24ndCBuZWVkIHRoZSBvbGQgaW5zdGFuY2UgYW55IG1vcmUgKi8KZGlmZiAtLWdpdCBhL25ldC9pdWN2L2FmX2l1Y3YuYyBiL25ldC9pdWN2L2FmX2l1Y3YuYwppbmRleCAyNzRkMTUwLi5kNWM1YjhmIDEwMDY0NAotLS0gYS9uZXQvaXVjdi9hZl9pdWN2LmMKKysrIGIvbmV0L2l1Y3YvYWZfaXVjdi5jCkBAIC0xMzAsNiArMTMwLDE3IEBACiAgICAgICAgbWVtY3B5KCZkc3RbOF0sIHNyYywgOCk7CiB9CiAKK3N0YXRpYyB2b2lkIGl1Y3Zfc2tiX3F1ZXVlX3B1cmdlKHN0cnVjdCBza19idWZmX2hlYWQgKmxpc3QpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCXdoaWxlICgoc2tiID0gc2tiX2RlcXVldWUobGlzdCkpICE9IE5VTEwpIHsKKwkJaWYgKHNrYi0+ZGV2KQorCQkJZGV2X3B1dChza2ItPmRldik7CisJCWtmcmVlX3NrYihza2IpOworCX0KK30KKwogc3RhdGljIGludCBhZml1Y3ZfcG1fcHJlcGFyZShzdHJ1Y3QgZGV2aWNlICpkZXYpCiB7CiAjaWZkZWYgQ09ORklHX1BNX0RFQlVHCkBAIC0xNjQsMTAgKzE3NSw5IEBACiAJcmVhZF9sb2NrKCZpdWN2X3NrX2xpc3QubG9jayk7CiAJc2tfZm9yX2VhY2goc2ssIG5vZGUsICZpdWN2X3NrX2xpc3QuaGVhZCkgewogCQlpdWN2ID0gaXVjdl9zayhzayk7Ci0JCXNrYl9xdWV1ZV9wdXJnZSgmaXVjdi0+c2VuZF9za2JfcSk7CisJCWl1Y3Zfc2tiX3F1ZXVlX3B1cmdlKCZpdWN2LT5zZW5kX3NrYl9xKTsKIAkJc2tiX3F1ZXVlX3B1cmdlKCZpdWN2LT5iYWNrbG9nX3NrYl9xKTsKIAkJc3dpdGNoIChzay0+c2tfc3RhdGUpIHsKLQkJY2FzZSBJVUNWX1NFVkVSRUQ6CiAJCWNhc2UgSVVDVl9ESVNDT05OOgogCQljYXNlIElVQ1ZfQ0xPU0lORzoKIAkJY2FzZSBJVUNWX0NPTk5FQ1RFRDoKQEAgLTIxMiw3ICsyMjIsNiBAQAogCQkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CiAJCQlicmVhazsKIAkJY2FzZSBJVUNWX0RJU0NPTk46Ci0JCWNhc2UgSVVDVl9TRVZFUkVEOgogCQljYXNlIElVQ1ZfQ0xPU0lORzoKIAkJY2FzZSBJVUNWX0xJU1RFTjoKIAkJY2FzZSBJVUNWX0JPVU5EOgpAQCAtMzY2LDkgKzM3NSw3IEBACiAJaWYgKGltc2cpCiAJCW1lbWNweSgmcGhzX2hkci0+aXVjdl9oZHIsIGltc2csIHNpemVvZihzdHJ1Y3QgaXVjdl9tZXNzYWdlKSk7CiAKLQlyY3VfcmVhZF9sb2NrKCk7Ci0Jc2tiLT5kZXYgPSBkZXZfZ2V0X2J5X2luZGV4X3JjdShuZXQsIHNvY2stPnNrX2JvdW5kX2Rldl9pZik7Ci0JcmN1X3JlYWRfdW5sb2NrKCk7CisJc2tiLT5kZXYgPSBkZXZfZ2V0X2J5X2luZGV4KG5ldCwgc29jay0+c2tfYm91bmRfZGV2X2lmKTsKIAlpZiAoIXNrYi0+ZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAlpZiAoIShza2ItPmRldi0+ZmxhZ3MgJiBJRkZfVVApKQpAQCAtMzg4LDYgKzM5NSw3IEBACiAJZXJyID0gZGV2X3F1ZXVlX3htaXQoc2tiKTsKIAlpZiAoZXJyKSB7CiAJCXNrYl91bmxpbmsobnNrYiwgJml1Y3YtPnNlbmRfc2tiX3EpOworCQlkZXZfcHV0KG5za2ItPmRldik7CiAJCWtmcmVlX3NrYihuc2tiKTsKIAl9IGVsc2UgewogCQlhdG9taWNfc3ViKGNvbmZpcm1fcmVjdiwgJml1Y3YtPm1zZ19yZWN2KTsKQEAgLTM5NiwyNSArNDA0LDYgQEAKIAlyZXR1cm4gZXJyOwogfQogCi0vKiBUaW1lcnMgKi8KLXN0YXRpYyB2b2lkIGl1Y3Zfc29ja190aW1lb3V0KHVuc2lnbmVkIGxvbmcgYXJnKQotewotCXN0cnVjdCBzb2NrICpzayA9IChzdHJ1Y3Qgc29jayAqKWFyZzsKLQotCWJoX2xvY2tfc29jayhzayk7Ci0Jc2stPnNrX2VyciA9IEVUSU1FRE9VVDsKLQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKLQliaF91bmxvY2tfc29jayhzayk7Ci0KLQlpdWN2X3NvY2tfa2lsbChzayk7Ci0Jc29ja19wdXQoc2spOwotfQotCi1zdGF0aWMgdm9pZCBpdWN2X3NvY2tfY2xlYXJfdGltZXIoc3RydWN0IHNvY2sgKnNrKQotewotCXNrX3N0b3BfdGltZXIoc2ssICZzay0+c2tfdGltZXIpOwotfQotCiBzdGF0aWMgc3RydWN0IHNvY2sgKl9faXVjdl9nZXRfc29ja19ieV9uYW1lKGNoYXIgKm5tKQogewogCXN0cnVjdCBzb2NrICpzazsKQEAgLTQ2Nyw3ICs0NTYsNiBAQAogCWludCBlcnIsIGJsZW47CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCWl1Y3Zfc29ja19jbGVhcl90aW1lcihzayk7CiAJbG9ja19zb2NrKHNrKTsKIAogCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CkBAIC00ODEsMTYgKzQ2OSwxNCBAQAogCQkJYmxlbiA9IHNpemVvZihzdHJ1Y3QgYWZfaXVjdl90cmFuc19oZHIpICsgRVRIX0hMRU47CiAJCQlza2IgPSBzb2NrX2FsbG9jX3NlbmRfc2tiKHNrLCBibGVuLCAxLCAmZXJyKTsKIAkJCWlmIChza2IpIHsKLQkJCQlza2JfcmVzZXJ2ZShza2IsCi0JCQkJCXNpemVvZihzdHJ1Y3QgYWZfaXVjdl90cmFuc19oZHIpICsKLQkJCQkJRVRIX0hMRU4pOworCQkJCXNrYl9yZXNlcnZlKHNrYiwgYmxlbik7CiAJCQkJZXJyID0gYWZpdWN2X2hzX3NlbmQoTlVMTCwgc2ssIHNrYiwKIAkJCQkJCSAgICAgQUZfSVVDVl9GTEFHX0ZJTik7CiAJCQl9CiAJCQlzay0+c2tfc3RhdGUgPSBJVUNWX0RJU0NPTk47CiAJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKIAkJfQotCWNhc2UgSVVDVl9ESVNDT05OOgorCWNhc2UgSVVDVl9ESVNDT05OOiAgIC8qIGZhbGwgdGhyb3VnaCAqLwogCQlzay0+c2tfc3RhdGUgPSBJVUNWX0NMT1NJTkc7CiAJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwogCkBAIC01MjAsNyArNTA2LDcgQEAKIAkJc2stPnNrX2VyciA9IEVDT05OUkVTRVQ7CiAJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwogCi0JCXNrYl9xdWV1ZV9wdXJnZSgmaXVjdi0+c2VuZF9za2JfcSk7CisJCWl1Y3Zfc2tiX3F1ZXVlX3B1cmdlKCZpdWN2LT5zZW5kX3NrYl9xKTsKIAkJc2tiX3F1ZXVlX3B1cmdlKCZpdWN2LT5iYWNrbG9nX3NrYl9xKTsKIAkJYnJlYWs7CiAKQEAgLTU4MSw4ICs1NjcsNiBAQAogCXNrLT5za19wcm90b2NvbCA9IHByb3RvOwogCXNrLT5za19zdGF0ZQk9IElVQ1ZfT1BFTjsKIAotCXNldHVwX3RpbWVyKCZzay0+c2tfdGltZXIsIGl1Y3Zfc29ja190aW1lb3V0LCAodW5zaWduZWQgbG9uZylzayk7Ci0KIAlpdWN2X3NvY2tfbGluaygmaXVjdl9za19saXN0LCBzayk7CiAJcmV0dXJuIHNrOwogfQpAQCAtNjc1LDE2ICs2NTksMTIgQEAKIAkJfQogCiAJCWlmIChzay0+c2tfc3RhdGUgPT0gSVVDVl9DT05ORUNURUQgfHwKLQkJICAgIHNrLT5za19zdGF0ZSA9PSBJVUNWX1NFVkVSRUQgfHwKLQkJICAgIHNrLT5za19zdGF0ZSA9PSBJVUNWX0RJU0NPTk4gfHwJLyogZHVlIHRvIFBNIHJlc3RvcmUgKi8KKwkJICAgIHNrLT5za19zdGF0ZSA9PSBJVUNWX0RJU0NPTk4gfHwKIAkJICAgICFuZXdzb2NrKSB7CiAJCQlpdWN2X2FjY2VwdF91bmxpbmsoc2spOwogCQkJaWYgKG5ld3NvY2spCiAJCQkJc29ja19ncmFmdChzaywgbmV3c29jayk7CiAKLQkJCWlmIChzay0+c2tfc3RhdGUgPT0gSVVDVl9TRVZFUkVEKQotCQkJCXNrLT5za19zdGF0ZSA9IElVQ1ZfRElTQ09OTjsKLQogCQkJcmVsZWFzZV9zb2NrKHNrKTsKIAkJCXJldHVybiBzazsKIAkJfQpAQCAtNzM5LDcgKzcxOSw3IEBACiAJCWlmICghbWVtY21wKGRldi0+cGVybV9hZGRyLCB1aWQsIDgpKSB7CiAJCQltZW1jcHkoaXVjdi0+c3JjX25hbWUsIHNhLT5zaXVjdl9uYW1lLCA4KTsKIAkJCW1lbWNweShpdWN2LT5zcmNfdXNlcl9pZCwgc2EtPnNpdWN2X3VzZXJfaWQsIDgpOwotCQkJc29jay0+c2stPnNrX2JvdW5kX2Rldl9pZiA9IGRldi0+aWZpbmRleDsKKwkJCXNrLT5za19ib3VuZF9kZXZfaWYgPSBkZXYtPmlmaW5kZXg7CiAJCQlzay0+c2tfc3RhdGUgPSBJVUNWX0JPVU5EOwogCQkJaXVjdi0+dHJhbnNwb3J0ID0gQUZfSVVDVl9UUkFOU19ISVBFUjsKIAkJCWlmICghaXVjdi0+bXNnbGltaXQpCkBAIC03NzQsMTYgKzc1NCwxMyBAQAogc3RhdGljIGludCBpdWN2X3NvY2tfYXV0b2JpbmQoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBpdWN2X3NvY2sgKml1Y3YgPSBpdWN2X3NrKHNrKTsKLQljaGFyIHF1ZXJ5X2J1ZmZlcls4MF07CiAJY2hhciBuYW1lWzEyXTsKIAlpbnQgZXJyID0gMDsKIAotCS8qIFNldCB0aGUgdXNlcmlkIGFuZCBuYW1lICovCi0JY3BjbWQoIlFVRVJZIFVTRVJJRCIsIHF1ZXJ5X2J1ZmZlciwgc2l6ZW9mKHF1ZXJ5X2J1ZmZlciksICZlcnIpOwotCWlmICh1bmxpa2VseShlcnIpKQorCWlmICh1bmxpa2VseSghcHJfaXVjdikpCiAJCXJldHVybiAtRVBST1RPOwogCi0JbWVtY3B5KGl1Y3YtPnNyY191c2VyX2lkLCBxdWVyeV9idWZmZXIsIDgpOworCW1lbWNweShpdWN2LT5zcmNfdXNlcl9pZCwgaXVjdl91c2VyaWQsIDgpOwogCiAJd3JpdGVfbG9ja19iaCgmaXVjdl9za19saXN0LmxvY2spOwogCkBAIC0xMjI1LDYgKzEyMDIsOCBAQAogCXJldHVybiBsZW47CiAKIGZhaWw6CisJaWYgKHNrYi0+ZGV2KQorCQlkZXZfcHV0KHNrYi0+ZGV2KTsKIAlrZnJlZV9za2Ioc2tiKTsKIG91dDoKIAlyZWxlYXNlX3NvY2soc2spOwpAQCAtMTM1Nyw3ICsxMzM2LDcgQEAKIAlpbnQgYmxlbjsKIAlpbnQgZXJyID0gMDsKIAotCWlmICgoc2stPnNrX3N0YXRlID09IElVQ1ZfRElTQ09OTiB8fCBzay0+c2tfc3RhdGUgPT0gSVVDVl9TRVZFUkVEKSAmJgorCWlmICgoc2stPnNrX3N0YXRlID09IElVQ1ZfRElTQ09OTikgJiYKIAkgICAgc2tiX3F1ZXVlX2VtcHR5KCZpdWN2LT5iYWNrbG9nX3NrYl9xKSAmJgogCSAgICBza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSAmJgogCSAgICBsaXN0X2VtcHR5KCZpdWN2LT5tZXNzYWdlX3EubGlzdCkpCkBAIC0xNDQxLDkgKzE0MjAsNyBAQAogCQkJCQlFVEhfSExFTjsKIAkJCQlzc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgYmxlbiwgMSwgJmVycik7CiAJCQkJaWYgKHNza2IpIHsKLQkJCQkJc2tiX3Jlc2VydmUoc3NrYiwKLQkJCQkJCXNpemVvZihzdHJ1Y3QgYWZfaXVjdl90cmFuc19oZHIpCi0JCQkJCQkrIEVUSF9ITEVOKTsKKwkJCQkJc2tiX3Jlc2VydmUoc3NrYiwgYmxlbik7CiAJCQkJCWVyciA9IGFmaXVjdl9oc19zZW5kKE5VTEwsIHNrLCBzc2tiLAogCQkJCQkJCSAgICAgQUZfSVVDVl9GTEFHX1dJTik7CiAJCQkJfQpAQCAtMTUwNiw3ICsxNDgzLDcgQEAKIAlpZiAoc2stPnNrX3N0YXRlID09IElVQ1ZfQ0xPU0VEKQogCQltYXNrIHw9IFBPTExIVVA7CiAKLQlpZiAoc2stPnNrX3N0YXRlID09IElVQ1ZfRElTQ09OTiB8fCBzay0+c2tfc3RhdGUgPT0gSVVDVl9TRVZFUkVEKQorCWlmIChzay0+c2tfc3RhdGUgPT0gSVVDVl9ESVNDT05OKQogCQltYXNrIHw9IFBPTExJTjsKIAogCWlmIChzb2NrX3dyaXRlYWJsZShzaykpCkBAIC0xNTMzLDcgKzE1MTAsNiBAQAogCXN3aXRjaCAoc2stPnNrX3N0YXRlKSB7CiAJY2FzZSBJVUNWX0RJU0NPTk46CiAJY2FzZSBJVUNWX0NMT1NJTkc6Ci0JY2FzZSBJVUNWX1NFVkVSRUQ6CiAJY2FzZSBJVUNWX0NMT1NFRDoKIAkJZXJyID0gLUVOT1RDT05OOwogCQlnb3RvIGZhaWw7CkBAIC0xODg4LDEwICsxODY0LDcgQEAKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBwYXRoLT5wcml2YXRlOwogCi0JaWYgKCFsaXN0X2VtcHR5KCZpdWN2X3NrKHNrKS0+YWNjZXB0X3EpKQotCQlzay0+c2tfc3RhdGUgPSBJVUNWX1NFVkVSRUQ7Ci0JZWxzZQotCQlzay0+c2tfc3RhdGUgPSBJVUNWX0RJU0NPTk47CisJc2stPnNrX3N0YXRlID0gSVVDVl9ESVNDT05OOwogCiAJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CiB9CkBAIC0yMDUxLDEwICsyMDI0LDcgQEAKIAkvKiBvdGhlciBlbmQgb2YgY29ubmVjdGlvbiBjbG9zZWQgKi8KIAlpZiAoaXVjdikgewogCQliaF9sb2NrX3NvY2soc2spOwotCQlpZiAoIWxpc3RfZW1wdHkoJml1Y3YtPmFjY2VwdF9xKSkKLQkJCXNrLT5za19zdGF0ZSA9IElVQ1ZfU0VWRVJFRDsKLQkJZWxzZQotCQkJc2stPnNrX3N0YXRlID0gSVVDVl9ESVNDT05OOworCQlzay0+c2tfc3RhdGUgPSBJVUNWX0RJU0NPTk47CiAJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwogCQliaF91bmxvY2tfc29jayhzayk7CiAJfQpAQCAtMjIwOSw2ICsyMTc5LDggQEAKIAkJYnJlYWs7CiAJY2FzZSAwOgogCQkvKiBwbGFpbiBkYXRhIGZyYW1lICovCisJCW1lbWNweShDQl9UUkdDTFMoc2tiKSwgJnRyYW5zX2hkci0+aXVjdl9oZHIuY2xhc3MsCisJCSAgICAgICBDQl9UUkdDTFNfTEVOKTsKIAkJZXJyID0gYWZpdWN2X2hzX2NhbGxiYWNrX3J4KHNrLCBza2IpOwogCQlicmVhazsKIAlkZWZhdWx0OgpAQCAtMjI1OSw2ICsyMjMxLDcgQEAKIAkJCWNhc2UgVFhfTk9USUZZX09LOgogCQkJCV9fc2tiX3VubGluayh0aGlzLCBsaXN0KTsKIAkJCQlpdWN2X3NvY2tfd2FrZV9tc2dsaW0oc2spOworCQkJCWRldl9wdXQodGhpcy0+ZGV2KTsKIAkJCQlrZnJlZV9za2IodGhpcyk7CiAJCQkJYnJlYWs7CiAJCQljYXNlIFRYX05PVElGWV9QRU5ESU5HOgpAQCAtMjI2OSw2ICsyMjQyLDcgQEAKIAkJCQlhdG9taWNfZGVjKCZpdWN2LT5wZW5kaW5ncyk7CiAJCQkJaWYgKGF0b21pY19yZWFkKCZpdWN2LT5wZW5kaW5ncykgPD0gMCkKIAkJCQkJaXVjdl9zb2NrX3dha2VfbXNnbGltKHNrKTsKKwkJCQlkZXZfcHV0KHRoaXMtPmRldik7CiAJCQkJa2ZyZWVfc2tiKHRoaXMpOwogCQkJCWJyZWFrOwogCQkJY2FzZSBUWF9OT1RJRllfVU5SRUFDSEFCTEU6CkBAIC0yMjc3LDExICsyMjUxLDkgQEAKIAkJCWNhc2UgVFhfTk9USUZZX0dFTkVSQUxFUlJPUjoKIAkJCWNhc2UgVFhfTk9USUZZX0RFTEFZRURfR0VORVJBTEVSUk9SOgogCQkJCV9fc2tiX3VubGluayh0aGlzLCBsaXN0KTsKKwkJCQlkZXZfcHV0KHRoaXMtPmRldik7CiAJCQkJa2ZyZWVfc2tiKHRoaXMpOwotCQkJCWlmICghbGlzdF9lbXB0eSgmaXVjdi0+YWNjZXB0X3EpKQotCQkJCQlzay0+c2tfc3RhdGUgPSBJVUNWX1NFVkVSRUQ7Ci0JCQkJZWxzZQotCQkJCQlzay0+c2tfc3RhdGUgPSBJVUNWX0RJU0NPTk47CisJCQkJc2stPnNrX3N0YXRlID0gSVVDVl9ESVNDT05OOwogCQkJCXNrLT5za19zdGF0ZV9jaGFuZ2Uoc2spOwogCQkJCWJyZWFrOwogCQkJfQpAQCAtMjI5MSw2ICsyMjYzLDEzIEBACiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxpc3QtPmxvY2ssIGZsYWdzKTsKIAorCWlmIChzay0+c2tfc3RhdGUgPT0gSVVDVl9DTE9TSU5HKSB7CisJCWlmIChza2JfcXVldWVfZW1wdHkoJml1Y3Zfc2soc2spLT5zZW5kX3NrYl9xKSkgeworCQkJc2stPnNrX3N0YXRlID0gSVVDVl9DTE9TRUQ7CisJCQlzay0+c2tfc3RhdGVfY2hhbmdlKHNrKTsKKwkJfQorCX0KKwogb3V0X3VubG9jazoKIAliaF91bmxvY2tfc29jayhzayk7CiB9CmRpZmYgLS1naXQgYS9uZXQva2V5L2FmX2tleS5jIGIvbmV0L2tleS9hZl9rZXkuYwppbmRleCAxZTczM2U5Li4xMWRiYjIyIDEwMDY0NAotLS0gYS9uZXQva2V5L2FmX2tleS5jCisrKyBiL25ldC9rZXkvYWZfa2V5LmMKQEAgLTM3NSw3ICszNzUsNyBAQAogCWNvbnN0IHN0cnVjdCBzYWRiX2FkZHJlc3MgKnNwID0gcDsKIAljb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIgPSAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopKHNwICsgMSk7CiAJY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpzaW47Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OwogI2VuZGlmCiAJaW50IGxlbjsKQEAgLTM4Nyw3ICszODcsNyBAQAogCQkgICAgc3AtPnNhZGJfYWRkcmVzc19wcmVmaXhsZW4gPiAzMikKIAkJCXJldHVybiAtRUlOVkFMOwogCQlicmVhazsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgQUZfSU5FVDY6CiAJCWxlbiA9IERJVl9ST1VORF9VUChzaXplb2YoKnNwKSArIHNpemVvZigqc2luNiksIHNpemVvZih1aW50NjRfdCkpOwogCQlpZiAoc3AtPnNhZGJfYWRkcmVzc19sZW4gIT0gbGVuIHx8CkBAIC00NjksNyArNDY5LDcgQEAKIAlpZiAoc19hZGRyLT5zYV9mYW1pbHkgIT0gZF9hZGRyLT5zYV9mYW1pbHkpCiAJCXJldHVybiAwOwogCWlmIChzX2FkZHItPnNhX2ZhbWlseSAhPSBBRl9JTkVUCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkgICAgJiYgc19hZGRyLT5zYV9mYW1pbHkgIT0gQUZfSU5FVDYKICNlbmRpZgogCQkpCkBAIC01NzksNyArNTc5LDcgQEAKIAlzd2l0Y2ggKGZhbWlseSkgewogCWNhc2UgQUZfSU5FVDoKIAkJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJY2FzZSBBRl9JTkVUNjoKIAkJcmV0dXJuIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKICNlbmRpZgpAQCAtNTk1LDcgKzU5NSw3IEBACiAJCXhhZGRyLT5hNCA9CiAJCQkoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNhKS0+c2luX2FkZHIuc19hZGRyOwogCQlyZXR1cm4gQUZfSU5FVDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgQUZfSU5FVDY6CiAJCW1lbWNweSh4YWRkci0+YTYsCiAJCSAgICAgICAmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopc2EpLT5zaW42X2FkZHIsCkBAIC02MzksNyArNjM5LDcgQEAKIAljYXNlIEFGX0lORVQ6CiAJCXhhZGRyID0gKHhmcm1fYWRkcmVzc190ICopJigoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICopKGFkZHIgKyAxKSktPnNpbl9hZGRyOwogCQlicmVhazsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgQUZfSU5FVDY6CiAJCXhhZGRyID0gKHhmcm1fYWRkcmVzc190ICopJigoY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiAqKShhZGRyICsgMSkpLT5zaW42X2FkZHI7CiAJCWJyZWFrOwpAQCAtNzA1LDE0ICs3MDUsMTQgQEAKIAkJbWVtc2V0KHNpbi0+c2luX3plcm8sIDAsIHNpemVvZihzaW4tPnNpbl96ZXJvKSk7CiAJCXJldHVybiAzMjsKIAkgICAgfQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJY2FzZSBBRl9JTkVUNjoKIAkgICAgewogCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42ID0gKHN0cnVjdCBzb2NrYWRkcl9pbjYgKilzYTsKIAkJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKIAkJc2luNi0+c2luNl9wb3J0ID0gcG9ydDsKIAkJc2luNi0+c2luNl9mbG93aW5mbyA9IDA7Ci0JCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsIChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKil4YWRkci0+YTYpOworCQlzaW42LT5zaW42X2FkZHIgPSAqKHN0cnVjdCBpbjZfYWRkciAqKXhhZGRyLT5hNjsKIAkJc2luNi0+c2luNl9zY29wZV9pZCA9IDA7CiAJCXJldHVybiAxMjg7CiAJICAgIH0KQEAgLTEzMTEsNyArMTMxMSw3IEBACiAJCXhkYWRkciA9ICh4ZnJtX2FkZHJlc3NfdCAqKSYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKShkYWRkciArIDEpKS0+c2luX2FkZHIuc19hZGRyOwogCQl4c2FkZHIgPSAoeGZybV9hZGRyZXNzX3QgKikmKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikoc2FkZHIgKyAxKSktPnNpbl9hZGRyLnNfYWRkcjsKIAkJYnJlYWs7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIEFGX0lORVQ2OgogCQl4ZGFkZHIgPSAoeGZybV9hZGRyZXNzX3QgKikmKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopKGRhZGRyICsgMSkpLT5zaW42X2FkZHI7CiAJCXhzYWRkciA9ICh4ZnJtX2FkZHJlc3NfdCAqKSYoKHN0cnVjdCBzb2NrYWRkcl9pbjYgKikoc2FkZHIgKyAxKSktPnNpbjZfYWRkcjsKQEAgLTMxNDYsNyArMzE0Niw3IEBACiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlicmVhazsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgQUZfSU5FVDY6CiAJCWlmIChvcHQgIT0gSVBWNl9JUFNFQ19QT0xJQ1kpIHsKIAkJCSpkaXIgPSAtRU9QTk9UU1VQUDsKZGlmZiAtLWdpdCBhL25ldC9sMnRwL2wydHBfY29yZS5jIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmMKaW5kZXggY2YwZjMwOC4uODlmZjhjNiAxMDA2NDQKLS0tIGEvbmV0L2wydHAvbDJ0cF9jb3JlLmMKKysrIGIvbmV0L2wydHAvbDJ0cF9jb3JlLmMKQEAgLTEwNzIsNyArMTA3Miw3IEBACiAKIAkvKiBHZXQgcm91dGluZyBpbmZvIGZyb20gdGhlIHR1bm5lbCBzb2NrZXQgKi8KIAlza2JfZHN0X2Ryb3Aoc2tiKTsKLQlza2JfZHN0X3NldChza2IsIGRzdF9jbG9uZShfX3NrX2RzdF9nZXQoc2spKSk7CisJc2tiX2RzdF9zZXQoc2tiLCBkc3RfY2xvbmUoX19za19kc3RfY2hlY2soc2ssIDApKSk7CiAKIAlpbmV0ID0gaW5ldF9zayhzayk7CiAJZmwgPSAmaW5ldC0+Y29yay5mbDsKZGlmZiAtLWdpdCBhL25ldC9sbGMvYWZfbGxjLmMgYi9uZXQvbGxjL2FmX2xsYy5jCmluZGV4IGRmZDNhNjQuLmExOGU2YzMgMTAwNjQ0Ci0tLSBhL25ldC9sbGMvYWZfbGxjLmMKKysrIGIvbmV0L2xsYy9hZl9sbGMuYwpAQCAtODMzLDE1ICs4MzMsMTUgQEAKIAkJY29waWVkICs9IHVzZWQ7CiAJCWxlbiAtPSB1c2VkOwogCisJCS8qIEZvciBub24gc3RyZWFtIHByb3Rjb2xzIHdlIGdldCBvbmUgcGFja2V0IHBlciByZWN2bXNnIGNhbGwgKi8KKwkJaWYgKHNrLT5za190eXBlICE9IFNPQ0tfU1RSRUFNKQorCQkJZ290byBjb3B5X3VhZGRyOworCiAJCWlmICghKGZsYWdzICYgTVNHX1BFRUspKSB7CiAJCQlza19lYXRfc2tiKHNrLCBza2IsIDApOwogCQkJKnNlcSA9IDA7CiAJCX0KIAotCQkvKiBGb3Igbm9uIHN0cmVhbSBwcm90Y29scyB3ZSBnZXQgb25lIHBhY2tldCBwZXIgcmVjdm1zZyBjYWxsICovCi0JCWlmIChzay0+c2tfdHlwZSAhPSBTT0NLX1NUUkVBTSkKLQkJCWdvdG8gY29weV91YWRkcjsKLQogCQkvKiBQYXJ0aWFsIHJlYWQgKi8KIAkJaWYgKHVzZWQgKyBvZmZzZXQgPCBza2ItPmxlbikKIAkJCWNvbnRpbnVlOwpAQCAtODU3LDYgKzg1NywxMiBAQAogCX0KIAlpZiAobGxjX3NrKHNrKS0+Y21zZ19mbGFncykKIAkJbGxjX2Ntc2dfcmN2KG1zZywgc2tiKTsKKworCWlmICghKGZsYWdzICYgTVNHX1BFRUspKSB7CisJCQlza19lYXRfc2tiKHNrLCBza2IsIDApOworCQkJKnNlcSA9IDA7CisJfQorCiAJZ290byBvdXQ7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9LY29uZmlnIGIvbmV0L21hYzgwMjExL0tjb25maWcKaW5kZXggN2QzYjQzOC4uOTZkZGI3MiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL0tjb25maWcKKysrIGIvbmV0L21hYzgwMjExL0tjb25maWcKQEAgLTI0NywxNSArMjQ3LDMgQEAKIAkgIGFuZCBzaG93IHRoZW0gaW4gZGVidWdmcy4KIAogCSAgSWYgdW5zdXJlLCBzYXkgTi4KLQotY29uZmlnIE1BQzgwMjExX0RSSVZFUl9BUElfVFJBQ0VSCi0JYm9vbCAiRHJpdmVyIEFQSSB0cmFjZXIiCi0JZGVwZW5kcyBvbiBNQUM4MDIxMV9ERUJVR19NRU5VCi0JZGVwZW5kcyBvbiBFVkVOVF9UUkFDSU5HCi0JaGVscAotCSAgU2F5IFkgaGVyZSB0byBtYWtlIG1hYzgwMjExIHJlZ2lzdGVyIHdpdGggdGhlIGZ0cmFjZQotCSAgZnJhbWV3b3JrIGZvciB0aGUgZHJpdmVyIEFQSSAtLSB5b3UgY2FuIHRoZW4gc2VlIHdoaWNoCi0JICBkcml2ZXIgbWV0aG9kcyBpdCBpcyBjYWxsaW5nIGFuZCB3aGljaCBBUEkgZnVuY3Rpb25zCi0JICBkcml2ZXJzIGFyZSBjYWxsaW5nIGJ5IGxvb2tpbmcgYXQgdGhlIHRyYWNlLgotCi0JICBJZiB1bnN1cmUsIHNheSBZLgpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL01ha2VmaWxlIGIvbmV0L21hYzgwMjExL01ha2VmaWxlCmluZGV4IGZkYjU0ZTYuLmQ1NDBjM2IgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9NYWtlZmlsZQorKysgYi9uZXQvbWFjODAyMTEvTWFrZWZpbGUKQEAgLTI0LDcgKzI0LDggQEAKIAl1dGlsLm8gXAogCXdtZS5vIFwKIAlldmVudC5vIFwKLQljaGFuLm8KKwljaGFuLm8gXAorCWRyaXZlci10cmFjZS5vCiAKIG1hYzgwMjExLSQoQ09ORklHX01BQzgwMjExX0xFRFMpICs9IGxlZC5vCiBtYWM4MDIxMS0kKENPTkZJR19NQUM4MDIxMV9ERUJVR0ZTKSArPSBcCkBAIC00MSw3ICs0Miw2IEBACiAKIG1hYzgwMjExLSQoQ09ORklHX1BNKSArPSBwbS5vCiAKLW1hYzgwMjExLSQoQ09ORklHX01BQzgwMjExX0RSSVZFUl9BUElfVFJBQ0VSKSArPSBkcml2ZXItdHJhY2UubwogQ0ZMQUdTX2RyaXZlci10cmFjZS5vIDo9IC1JJChzcmMpCiAKICMgb2JqZWN0cyBmb3IgUElEIGFsZ29yaXRobQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2FnZy1yeC5jIGIvbmV0L21hYzgwMjExL2FnZy1yeC5jCmluZGV4IDkzYjI0MzQuLjk2ZGViYmEgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9hZ2ctcnguYworKysgYi9uZXQvbWFjODAyMTEvYWdnLXJ4LmMKQEAgLTczLDggKzczLDExIEBACiAJUkNVX0lOSVRfUE9JTlRFUihzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0sIE5VTEwpOwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JcHJpbnRrKEtFUk5fREVCVUcgIlJ4IEJBIHNlc3Npb24gc3RvcCByZXF1ZXN0ZWQgZm9yICVwTSB0aWQgJXVcbiIsCi0JICAgICAgIHN0YS0+c3RhLmFkZHIsIHRpZCk7CisJcHJpbnRrKEtFUk5fREVCVUcKKwkgICAgICAgIlJ4IEJBIHNlc3Npb24gc3RvcCByZXF1ZXN0ZWQgZm9yICVwTSB0aWQgJXUgJXMgcmVhc29uOiAlZFxuIiwKKwkgICAgICAgc3RhLT5zdGEuYWRkciwgdGlkLAorCSAgICAgICBpbml0aWF0b3IgPT0gV0xBTl9CQUNLX1JFQ0lQSUVOVCA/ICJyZWNpcGllbnQiIDogImluaXRpdGF0b3IiLAorCSAgICAgICAoaW50KXJlYXNvbik7CiAjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCiAKIAlpZiAoZHJ2X2FtcGR1X2FjdGlvbihsb2NhbCwgc3RhLT5zZGF0YSwgSUVFRTgwMjExX0FNUERVX1JYX1NUT1AsCkBAIC04NSw3ICs4OCw3IEBACiAJLyogY2hlY2sgaWYgdGhpcyBpcyBhIHNlbGYgZ2VuZXJhdGVkIGFnZ3JlZ2F0aW9uIGhhbHQgKi8KIAlpZiAoaW5pdGlhdG9yID09IFdMQU5fQkFDS19SRUNJUElFTlQgJiYgdHgpCiAJCWllZWU4MDIxMV9zZW5kX2RlbGJhKHN0YS0+c2RhdGEsIHN0YS0+c3RhLmFkZHIsCi0JCQkJICAgICB0aWQsIDAsIHJlYXNvbik7CisJCQkJICAgICB0aWQsIFdMQU5fQkFDS19SRUNJUElFTlQsIHJlYXNvbik7CiAKIAlkZWxfdGltZXJfc3luYygmdGlkX3J4LT5zZXNzaW9uX3RpbWVyKTsKIAlkZWxfdGltZXJfc3luYygmdGlkX3J4LT5yZW9yZGVyX3RpbWVyKTsKQEAgLTEwOSw3ICsxMTIsNyBAQAogCWludCBpOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgYWRkcik7CisJc3RhID0gc3RhX2luZm9fZ2V0X2JzcyhzZGF0YSwgYWRkcik7CiAJaWYgKCFzdGEpIHsKIAkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCXJldHVybjsKQEAgLTE3NywxMCArMTgwLDEzIEBACiAJbWVtY3B5KG1nbXQtPmRhLCBkYSwgRVRIX0FMRU4pOwogCW1lbWNweShtZ210LT5zYSwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CiAJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAotCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKKwkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gfHwKKwkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpCiAJCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CiAJZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPnUubWdkLmJzc2lkLCBFVEhfQUxFTik7CisJZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQorCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT51Lmlic3MuYnNzaWQsIEVUSF9BTEVOKTsKIAogCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CiAJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvYWdnLXR4LmMgYi9uZXQvbWFjODAyMTEvYWdnLXR4LmMKaW5kZXggYjNmNjU1Mi4uNzZiZTYxNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2FnZy10eC5jCisrKyBiL25ldC9tYWM4MDIxMS9hZ2ctdHguYwpAQCAtNTUsNiArNTUsOCBAQAogICogQGFtcGR1X2FjdGlvbiBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZSBhY3Rpb24KICAqICVJRUVFODAyMTFfQU1QRFVfVFhfU1RPUC4gSW4gdGhpcyBjYXNlLCB0aGUgY2FsbCBtdXN0IG5vdCBmYWlsLAogICogYW5kIHRoZSBkcml2ZXIgbXVzdCBsYXRlciBjYWxsIGllZWU4MDIxMV9zdG9wX3R4X2JhX2NiX2lycXNhZmUoKS4KKyAqIE5vdGUgdGhhdCB0aGUgc3RhIGNhbiBnZXQgZGVzdHJveWVkIGJlZm9yZSB0aGUgQkEgdGVhciBkb3duIGlzCisgKiBjb21wbGV0ZS4KICAqLwogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9hZGRiYV9yZXF1ZXN0KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLApAQCAtNzgsMTAgKzgwLDEzIEBACiAJbWVtY3B5KG1nbXQtPmRhLCBkYSwgRVRIX0FMRU4pOwogCW1lbWNweShtZ210LT5zYSwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CiAJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAotCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKKwkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gfHwKKwkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpCiAJCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CiAJZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPnUubWdkLmJzc2lkLCBFVEhfQUxFTik7CisJZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQorCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT51Lmlic3MuYnNzaWQsIEVUSF9BTEVOKTsKIAogCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CiAJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CkBAIC0xMDIsNyArMTA3LDcgQEAKIAltZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5zdGFydF9zZXFfbnVtID0KIAkJCQkJY3B1X3RvX2xlMTYoc3RhcnRfc2VxX251bSA8PCA0KTsKIAotCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYik7CisJaWVlZTgwMjExX3R4X3NrYl90aWQoc2RhdGEsIHNrYiwgdGlkKTsKIH0KIAogdm9pZCBpZWVlODAyMTFfc2VuZF9iYXIoc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTggKnJhLCB1MTYgdGlkLCB1MTYgc3NuKQpAQCAtMTMxLDcgKzEzNiw3IEBACiAJYmFyLT5zdGFydF9zZXFfbnVtID0gY3B1X3RvX2xlMTYoc3NuKTsKIAogCUlFRUU4MDIxMV9TS0JfQ0Ioc2tiKS0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0lOVEZMX0RPTlRfRU5DUllQVDsKLQlpZWVlODAyMTFfdHhfc2tiKHNkYXRhLCBza2IpOworCWllZWU4MDIxMV90eF9za2JfdGlkKHNkYXRhLCBza2IsIHRpZCk7CiB9CiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zZW5kX2Jhcik7CiAKQEAgLTE2MSw2ICsxNjYsMTIgQEAKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCisJLyogaWYgd2UncmUgYWxyZWFkeSBzdG9wcGluZyBpZ25vcmUgYW55IG5ldyByZXF1ZXN0cyB0byBzdG9wICovCisJaWYgKHRlc3RfYml0KEhUX0FHR19TVEFURV9TVE9QUElORywgJnRpZF90eC0+c3RhdGUpKSB7CisJCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCQlyZXR1cm4gLUVBTFJFQURZOworCX0KKwogCWlmICh0ZXN0X2JpdChIVF9BR0dfU1RBVEVfV0FOVF9TVEFSVCwgJnRpZF90eC0+c3RhdGUpKSB7CiAJCS8qIG5vdCBldmVuIHN0YXJ0ZWQgeWV0ISAqLwogCQlpZWVlODAyMTFfYXNzaWduX3RpZF90eChzdGEsIHRpZCwgTlVMTCk7CkBAIC0xNjksNiArMTgwLDggQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJc2V0X2JpdChIVF9BR0dfU1RBVEVfU1RPUFBJTkcsICZ0aWRfdHgtPnN0YXRlKTsKKwogCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCkBAIC0xNzYsOSArMTg5LDggQEAKIAkgICAgICAgc3RhLT5zdGEuYWRkciwgdGlkKTsKICNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KIAotCXNldF9iaXQoSFRfQUdHX1NUQVRFX1NUT1BQSU5HLCAmdGlkX3R4LT5zdGF0ZSk7Ci0KIAlkZWxfdGltZXJfc3luYygmdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmdGlkX3R4LT5zZXNzaW9uX3RpbWVyKTsKIAogCS8qCiAJICogQWZ0ZXIgdGhpcyBwYWNrZXRzIGFyZSBubyBsb25nZXIgaGFuZGVkIHJpZ2h0IHRocm91Z2gKQEAgLTE4Nyw2ICsxOTksMjAgQEAKIAkgKi8KIAljbGVhcl9iaXQoSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMLCAmdGlkX3R4LT5zdGF0ZSk7CiAKKwkvKgorCSAqIFRoZXJlIG1pZ2h0IGJlIGEgZmV3IHBhY2tldHMgYmVpbmcgcHJvY2Vzc2VkIHJpZ2h0IG5vdyAob24KKwkgKiBhbm90aGVyIENQVSkgdGhhdCBoYXZlIGFscmVhZHkgZ290dGVuIHBhc3QgdGhlIGFnZ3JlZ2F0aW9uCisJICogY2hlY2sgd2hlbiBpdCB3YXMgc3RpbGwgT1BFUkFUSU9OQUwgYW5kIGNvbnNlcXVlbnRseSBoYXZlCisJICogSUVFRTgwMjExX1RYX0NUTF9BTVBEVSBzZXQuIEluIHRoYXQgY2FzZSwgdGhpcyBjb2RlIG1pZ2h0CisJICogY2FsbCBpbnRvIHRoZSBkcml2ZXIgYXQgdGhlIHNhbWUgdGltZSBvciBldmVuIGJlZm9yZSB0aGUKKwkgKiBUWCBwYXRocyBjYWxscyBpbnRvIGl0LCB3aGljaCBjb3VsZCBjb25mdXNlIHRoZSBkcml2ZXIuCisJICoKKwkgKiBXYWl0IGZvciBhbGwgY3VycmVudGx5IHJ1bm5pbmcgVFggcGF0aHMgdG8gZmluaXNoIGJlZm9yZQorCSAqIHRlbGxpbmcgdGhlIGRyaXZlci4gTmV3IHBhY2tldHMgd2lsbCBub3QgZ28gdGhyb3VnaCBzaW5jZQorCSAqIHRoZSBhZ2dyZWdhdGlvbiBzZXNzaW9uIGlzIG5vIGxvbmdlciBPUEVSQVRJT05BTC4KKwkgKi8KKwlzeW5jaHJvbml6ZV9uZXQoKTsKKwogCXRpZF90eC0+c3RvcF9pbml0aWF0b3IgPSBpbml0aWF0b3I7CiAJdGlkX3R4LT50eF9zdG9wID0gdHg7CiAKQEAgLTI4MywxNjkgKzMwOSw2IEBACiAJX19yZWxlYXNlKGFnZ19xdWV1ZSk7CiB9CiAKLXZvaWQgaWVlZTgwMjExX3R4X2JhX3Nlc3Npb25faGFuZGxlX3N0YXJ0KHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBpbnQgdGlkKQotewotCXN0cnVjdCB0aWRfYW1wZHVfdHggKnRpZF90eDsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHN0YS0+bG9jYWw7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBzdGEtPnNkYXRhOwotCXUxNiBzdGFydF9zZXFfbnVtOwotCWludCByZXQ7Ci0KLQl0aWRfdHggPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkX3RpZF90eChzdGEsIHRpZCk7Ci0KLQkvKgotCSAqIFdoaWxlIHdlJ3JlIGFza2luZyB0aGUgZHJpdmVyIGFib3V0IHRoZSBhZ2dyZWdhdGlvbiwKLQkgKiBzdG9wIHRoZSBBQyBxdWV1ZSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gd29ycnkKLQkgKiBhYm91dCBmcmFtZXMgdGhhdCBjYW1lIGluIHdoaWxlIHdlIHdlcmUgZG9pbmcgdGhhdCwKLQkgKiB3aGljaCB3b3VsZCByZXF1aXJlIHVzIHRvIHB1dCB0aGVtIHRvIHRoZSBBQyBwZW5kaW5nCi0JICogYWZ0ZXJ3YXJkcyB3aGljaCBqdXN0IG1ha2VzIHRoZSBjb2RlIG1vcmUgY29tcGxleC4KLQkgKi8KLQlpZWVlODAyMTFfc3RvcF9xdWV1ZV9hZ2cobG9jYWwsIHRpZCk7Ci0KLQljbGVhcl9iaXQoSFRfQUdHX1NUQVRFX1dBTlRfU1RBUlQsICZ0aWRfdHgtPnN0YXRlKTsKLQotCS8qCi0JICogbWFrZSBzdXJlIG5vIHBhY2tldHMgYXJlIGJlaW5nIHByb2Nlc3NlZCB0byBnZXQKLQkgKiB2YWxpZCBzdGFydGluZyBzZXF1ZW5jZSBudW1iZXIKLQkgKi8KLQlzeW5jaHJvbml6ZV9uZXQoKTsKLQotCXN0YXJ0X3NlcV9udW0gPSBzdGEtPnRpZF9zZXFbdGlkXSA+PiA0OwotCi0JcmV0ID0gZHJ2X2FtcGR1X2FjdGlvbihsb2NhbCwgc2RhdGEsIElFRUU4MDIxMV9BTVBEVV9UWF9TVEFSVCwKLQkJCSAgICAgICAmc3RhLT5zdGEsIHRpZCwgJnN0YXJ0X3NlcV9udW0sIDApOwotCWlmIChyZXQpIHsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQkJcHJpbnRrKEtFUk5fREVCVUcgIkJBIHJlcXVlc3QgZGVuaWVkIC0gSFcgdW5hdmFpbGFibGUgZm9yIgotCQkJCQkiIHRpZCAlZFxuIiwgdGlkKTsKLSNlbmRpZgotCQlzcGluX2xvY2tfYmgoJnN0YS0+bG9jayk7Ci0JCWllZWU4MDIxMV9hc3NpZ25fdGlkX3R4KHN0YSwgdGlkLCBOVUxMKTsKLQkJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7Ci0KLQkJaWVlZTgwMjExX3dha2VfcXVldWVfYWdnKGxvY2FsLCB0aWQpOwotCQlrZnJlZV9yY3UodGlkX3R4LCByY3VfaGVhZCk7Ci0JCXJldHVybjsKLQl9Ci0KLQkvKiB3ZSBjYW4gdGFrZSBwYWNrZXRzIGFnYWluIG5vdyAqLwotCWllZWU4MDIxMV93YWtlX3F1ZXVlX2FnZyhsb2NhbCwgdGlkKTsKLQotCS8qIGFjdGl2YXRlIHRoZSB0aW1lciBmb3IgdGhlIHJlY2lwaWVudCdzIGFkZEJBIHJlc3BvbnNlICovCi0JbW9kX3RpbWVyKCZ0aWRfdHgtPmFkZGJhX3Jlc3BfdGltZXIsIGppZmZpZXMgKyBBRERCQV9SRVNQX0lOVEVSVkFMKTsKLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKLQlwcmludGsoS0VSTl9ERUJVRyAiYWN0aXZhdGVkIGFkZEJBIHJlc3BvbnNlIHRpbWVyIG9uIHRpZCAlZFxuIiwgdGlkKTsKLSNlbmRpZgotCi0Jc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOwotCXN0YS0+YW1wZHVfbWxtZS5hZGRiYV9yZXFfbnVtW3RpZF0rKzsKLQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKLQotCS8qIHNlbmQgQWRkQkEgcmVxdWVzdCAqLwotCWllZWU4MDIxMV9zZW5kX2FkZGJhX3JlcXVlc3Qoc2RhdGEsIHN0YS0+c3RhLmFkZHIsIHRpZCwKLQkJCQkgICAgIHRpZF90eC0+ZGlhbG9nX3Rva2VuLCBzdGFydF9zZXFfbnVtLAotCQkJCSAgICAgbG9jYWwtPmh3Lm1heF90eF9hZ2dyZWdhdGlvbl9zdWJmcmFtZXMsCi0JCQkJICAgICB0aWRfdHgtPnRpbWVvdXQpOwotfQotCi1pbnQgaWVlZTgwMjExX3N0YXJ0X3R4X2JhX3Nlc3Npb24oc3RydWN0IGllZWU4MDIxMV9zdGEgKnB1YnN0YSwgdTE2IHRpZCwKLQkJCQkgIHUxNiB0aW1lb3V0KQotewotCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gY29udGFpbmVyX29mKHB1YnN0YSwgc3RydWN0IHN0YV9pbmZvLCBzdGEpOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQlzdHJ1Y3QgdGlkX2FtcGR1X3R4ICp0aWRfdHg7Ci0JaW50IHJldCA9IDA7Ci0KLQl0cmFjZV9hcGlfc3RhcnRfdHhfYmFfc2Vzc2lvbihwdWJzdGEsIHRpZCk7Ci0KLQlpZiAoV0FSTl9PTighbG9jYWwtPm9wcy0+YW1wZHVfYWN0aW9uKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoKHRpZCA+PSBTVEFfVElEX05VTSkgfHwKLQkgICAgIShsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfQU1QRFVfQUdHUkVHQVRJT04pIHx8Ci0JICAgIChsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfVFhfQU1QRFVfU0VUVVBfSU5fSFcpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCXByaW50ayhLRVJOX0RFQlVHICJPcGVuIEJBIHNlc3Npb24gcmVxdWVzdGVkIGZvciAlcE0gdGlkICV1XG4iLAotCSAgICAgICBwdWJzdGEtPmFkZHIsIHRpZCk7Ci0jZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCi0KLQkvKgotCSAqIFRoZSBhZ2dyZWdhdGlvbiBjb2RlIGlzIG5vdCBwcmVwYXJlZCB0byBoYW5kbGUKLQkgKiBhbnl0aGluZyBidXQgU1RBL0FQIGR1ZSB0byB0aGUgQlNTSUQgaGFuZGxpbmcuCi0JICogSUJTUyBjb3VsZCB3b3JrIGluIHRoZSBjb2RlIGJ1dCBpc24ndCBzdXBwb3J0ZWQKLQkgKiBieSBkcml2ZXJzIG9yIHRoZSBzdGFuZGFyZC4KLQkgKi8KLQlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKLQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gJiYKLQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWlmICh0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQkxPQ0tfQkEpKSB7Ci0jaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCi0JCXByaW50ayhLRVJOX0RFQlVHICJCQSBzZXNzaW9ucyBibG9ja2VkLiAiCi0JCSAgICAgICAiRGVueWluZyBCQSBzZXNzaW9uIHJlcXVlc3RcbiIpOwotI2VuZGlmCi0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKLQotCS8qIHdlIGhhdmUgdHJpZWQgdG9vIG1hbnkgdGltZXMsIHJlY2VpdmVyIGRvZXMgbm90IHdhbnQgQS1NUERVICovCi0JaWYgKHN0YS0+YW1wZHVfbWxtZS5hZGRiYV9yZXFfbnVtW3RpZF0gPiBIVF9BR0dfTUFYX1JFVFJJRVMpIHsKLQkJcmV0ID0gLUVCVVNZOwotCQlnb3RvIGVycl91bmxvY2tfc3RhOwotCX0KLQotCXRpZF90eCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWRfdGlkX3R4KHN0YSwgdGlkKTsKLQkvKiBjaGVjayBpZiB0aGUgVElEIGlzIG5vdCBpbiBhZ2dyZWdhdGlvbiBmbG93IGFscmVhZHkgKi8KLQlpZiAodGlkX3R4IHx8IHN0YS0+YW1wZHVfbWxtZS50aWRfc3RhcnRfdHhbdGlkXSkgewotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwotCQlwcmludGsoS0VSTl9ERUJVRyAiQkEgcmVxdWVzdCBkZW5pZWQgLSBzZXNzaW9uIGlzIG5vdCAiCi0JCQkJICJpZGxlIG9uIHRpZCAldVxuIiwgdGlkKTsKLSNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KLQkJcmV0ID0gLUVBR0FJTjsKLQkJZ290byBlcnJfdW5sb2NrX3N0YTsKLQl9Ci0KLQkvKiBwcmVwYXJlIEEtTVBEVSBNTE1FIGZvciBUeCBhZ2dyZWdhdGlvbiAqLwotCXRpZF90eCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0aWRfYW1wZHVfdHgpLCBHRlBfQVRPTUlDKTsKLQlpZiAoIXRpZF90eCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl91bmxvY2tfc3RhOwotCX0KLQotCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnRpZF90eC0+cGVuZGluZyk7Ci0JX19zZXRfYml0KEhUX0FHR19TVEFURV9XQU5UX1NUQVJULCAmdGlkX3R4LT5zdGF0ZSk7Ci0KLQl0aWRfdHgtPnRpbWVvdXQgPSB0aW1lb3V0OwotCi0JLyogVHggdGltZXIgKi8KLQl0aWRfdHgtPmFkZGJhX3Jlc3BfdGltZXIuZnVuY3Rpb24gPSBzdGFfYWRkYmFfcmVzcF90aW1lcl9leHBpcmVkOwotCXRpZF90eC0+YWRkYmFfcmVzcF90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpJnN0YS0+dGltZXJfdG9fdGlkW3RpZF07Ci0JaW5pdF90aW1lcigmdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyKTsKLQotCS8qIGFzc2lnbiBhIGRpYWxvZyB0b2tlbiAqLwotCXN0YS0+YW1wZHVfbWxtZS5kaWFsb2dfdG9rZW5fYWxsb2NhdG9yKys7Ci0JdGlkX3R4LT5kaWFsb2dfdG9rZW4gPSBzdGEtPmFtcGR1X21sbWUuZGlhbG9nX3Rva2VuX2FsbG9jYXRvcjsKLQotCS8qCi0JICogRmluYWxseSwgYXNzaWduIGl0IHRvIHRoZSBzdGFydCBhcnJheTsgdGhlIHdvcmsgaXRlbSB3aWxsCi0JICogY29sbGVjdCBpdCBhbmQgbW92ZSBpdCB0byB0aGUgbm9ybWFsIGFycmF5LgotCSAqLwotCXN0YS0+YW1wZHVfbWxtZS50aWRfc3RhcnRfdHhbdGlkXSA9IHRpZF90eDsKLQotCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZzdGEtPmFtcGR1X21sbWUud29yayk7Ci0KLQkvKiB0aGlzIGZsb3cgY29udGludWVzIG9mZiB0aGUgd29yayAqLwotIGVycl91bmxvY2tfc3RhOgotCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOwotCXJldHVybiByZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKTsKLQogLyoKICAqIHNwbGljZSBwYWNrZXRzIGZyb20gdGhlIFNUQSdzIHBlbmRpbmcgdG8gdGhlIGxvY2FsIHBlbmRpbmcsCiAgKiByZXF1aXJlcyBhIGNhbGwgdG8gaWVlZTgwMjExX2FnZ19zcGxpY2VfZmluaXNoIGxhdGVyCkBAIC00NzgsNiArMzQxLDIyOCBAQAogCWllZWU4MDIxMV93YWtlX3F1ZXVlX2FnZyhsb2NhbCwgdGlkKTsKIH0KIAordm9pZCBpZWVlODAyMTFfdHhfYmFfc2Vzc2lvbl9oYW5kbGVfc3RhcnQoc3RydWN0IHN0YV9pbmZvICpzdGEsIGludCB0aWQpCit7CisJc3RydWN0IHRpZF9hbXBkdV90eCAqdGlkX3R4OworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc3RhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHN0YS0+c2RhdGE7CisJdTE2IHN0YXJ0X3NlcV9udW07CisJaW50IHJldDsKKworCXRpZF90eCA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWRfdGlkX3R4KHN0YSwgdGlkKTsKKworCS8qCisJICogU3RhcnQgcXVldWluZyB1cCBwYWNrZXRzIGZvciB0aGlzIGFnZ3JlZ2F0aW9uIHNlc3Npb24uCisJICogV2UncmUgZ29pbmcgdG8gcmVsZWFzZSB0aGVtIG9uY2UgdGhlIGRyaXZlciBpcyBPSyB3aXRoCisJICogdGhhdC4KKwkgKi8KKwljbGVhcl9iaXQoSFRfQUdHX1NUQVRFX1dBTlRfU1RBUlQsICZ0aWRfdHgtPnN0YXRlKTsKKworCS8qCisJICogTWFrZSBzdXJlIG5vIHBhY2tldHMgYXJlIGJlaW5nIHByb2Nlc3NlZC4gVGhpcyBlbnN1cmVzIHRoYXQKKwkgKiB3ZSBoYXZlIGEgdmFsaWQgc3RhcnRpbmcgc2VxdWVuY2UgbnVtYmVyIGFuZCB0aGF0IGluLWZsaWdodAorCSAqIHBhY2tldHMgaGF2ZSBiZWVuIGZsdXNoZWQgb3V0IGFuZCBubyBwYWNrZXRzIGZvciB0aGlzIFRJRAorCSAqIHdpbGwgZ28gaW50byB0aGUgZHJpdmVyIGR1cmluZyB0aGUgYW1wZHVfYWN0aW9uIGNhbGwuCisJICovCisJc3luY2hyb25pemVfbmV0KCk7CisKKwlzdGFydF9zZXFfbnVtID0gc3RhLT50aWRfc2VxW3RpZF0gPj4gNDsKKworCXJldCA9IGRydl9hbXBkdV9hY3Rpb24obG9jYWwsIHNkYXRhLCBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQsCisJCQkgICAgICAgJnN0YS0+c3RhLCB0aWQsICZzdGFydF9zZXFfbnVtLCAwKTsKKwlpZiAocmV0KSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJCQSByZXF1ZXN0IGRlbmllZCAtIEhXIHVuYXZhaWxhYmxlIGZvciIKKwkJCQkJIiB0aWQgJWRcbiIsIHRpZCk7CisjZW5kaWYKKwkJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOworCQlpZWVlODAyMTFfYWdnX3NwbGljZV9wYWNrZXRzKGxvY2FsLCB0aWRfdHgsIHRpZCk7CisJCWllZWU4MDIxMV9hc3NpZ25fdGlkX3R4KHN0YSwgdGlkLCBOVUxMKTsKKwkJaWVlZTgwMjExX2FnZ19zcGxpY2VfZmluaXNoKGxvY2FsLCB0aWQpOworCQlzcGluX3VubG9ja19iaCgmc3RhLT5sb2NrKTsKKworCQlrZnJlZV9yY3UodGlkX3R4LCByY3VfaGVhZCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBhY3RpdmF0ZSB0aGUgdGltZXIgZm9yIHRoZSByZWNpcGllbnQncyBhZGRCQSByZXNwb25zZSAqLworCW1vZF90aW1lcigmdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyLCBqaWZmaWVzICsgQUREQkFfUkVTUF9JTlRFUlZBTCk7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgImFjdGl2YXRlZCBhZGRCQSByZXNwb25zZSB0aW1lciBvbiB0aWQgJWRcbiIsIHRpZCk7CisjZW5kaWYKKworCXNwaW5fbG9ja19iaCgmc3RhLT5sb2NrKTsKKwlzdGEtPmFtcGR1X21sbWUubGFzdF9hZGRiYV9yZXFfdGltZVt0aWRdID0gamlmZmllczsKKwlzdGEtPmFtcGR1X21sbWUuYWRkYmFfcmVxX251bVt0aWRdKys7CisJc3Bpbl91bmxvY2tfYmgoJnN0YS0+bG9jayk7CisKKwkvKiBzZW5kIEFkZEJBIHJlcXVlc3QgKi8KKwlpZWVlODAyMTFfc2VuZF9hZGRiYV9yZXF1ZXN0KHNkYXRhLCBzdGEtPnN0YS5hZGRyLCB0aWQsCisJCQkJICAgICB0aWRfdHgtPmRpYWxvZ190b2tlbiwgc3RhcnRfc2VxX251bSwKKwkJCQkgICAgIGxvY2FsLT5ody5tYXhfdHhfYWdncmVnYXRpb25fc3ViZnJhbWVzLAorCQkJCSAgICAgdGlkX3R4LT50aW1lb3V0KTsKK30KKworLyoKKyAqIEFmdGVyIGFjY2VwdGluZyB0aGUgQWRkQkEgUmVzcG9uc2Ugd2UgYWN0aXZhdGVkIGEgdGltZXIsCisgKiByZXNldHRpbmcgaXQgYWZ0ZXIgZWFjaCBmcmFtZSB0aGF0IHdlIHNlbmQuCisgKi8KK3N0YXRpYyB2b2lkIHN0YV90eF9hZ2dfc2Vzc2lvbl90aW1lcl9leHBpcmVkKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwkvKiBub3QgYW4gZWxlZ2FudCBkZXRvdXIsIGJ1dCB0aGVyZSBpcyBubyBjaG9pY2UgYXMgdGhlIHRpbWVyIHBhc3NlcworCSAqIG9ubHkgb25lIGFyZ3VtZW50LCBhbmQgdmFyaW91cyBzdGFfaW5mbyBhcmUgbmVlZGVkIGhlcmUsIHNvIGluaXQKKwkgKiBmbG93IGluIHN0YV9pbmZvX2NyZWF0ZSBnaXZlcyB0aGUgVElEIGFzIGRhdGEsIHdoaWxlIHRoZSB0aW1lcl90b19pZAorCSAqIGFycmF5IGdpdmVzIHRoZSBzdGEgdGhyb3VnaCBjb250YWluZXJfb2YgKi8KKwl1OCAqcHRpZCA9ICh1OCAqKWRhdGE7CisJdTggKnRpbWVyX3RvX2lkID0gcHRpZCAtICpwdGlkOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gY29udGFpbmVyX29mKHRpbWVyX3RvX2lkLCBzdHJ1Y3Qgc3RhX2luZm8sCisJCQkJCSB0aW1lcl90b190aWRbMF0pOworCisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJcHJpbnRrKEtFUk5fREVCVUcgInR4IHNlc3Npb24gdGltZXIgZXhwaXJlZCBvbiB0aWQgJWRcbiIsICh1MTYpKnB0aWQpOworI2VuZGlmCisKKwlpZWVlODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKCZzdGEtPnN0YSwgKnB0aWQpOworfQorCitpbnQgaWVlZTgwMjExX3N0YXJ0X3R4X2JhX3Nlc3Npb24oc3RydWN0IGllZWU4MDIxMV9zdGEgKnB1YnN0YSwgdTE2IHRpZCwKKwkJCQkgIHUxNiB0aW1lb3V0KQoreworCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gY29udGFpbmVyX29mKHB1YnN0YSwgc3RydWN0IHN0YV9pbmZvLCBzdGEpOworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgdGlkX2FtcGR1X3R4ICp0aWRfdHg7CisJaW50IHJldCA9IDA7CisKKwl0cmFjZV9hcGlfc3RhcnRfdHhfYmFfc2Vzc2lvbihwdWJzdGEsIHRpZCk7CisKKwlpZiAoV0FSTl9PTighbG9jYWwtPm9wcy0+YW1wZHVfYWN0aW9uKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKHRpZCA+PSBTVEFfVElEX05VTSkgfHwKKwkgICAgIShsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfQU1QRFVfQUdHUkVHQVRJT04pIHx8CisJICAgIChsb2NhbC0+aHcuZmxhZ3MgJiBJRUVFODAyMTFfSFdfVFhfQU1QRFVfU0VUVVBfSU5fSFcpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCXByaW50ayhLRVJOX0RFQlVHICJPcGVuIEJBIHNlc3Npb24gcmVxdWVzdGVkIGZvciAlcE0gdGlkICV1XG4iLAorCSAgICAgICBwdWJzdGEtPmFkZHIsIHRpZCk7CisjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCisKKwlpZiAoc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQgJiYKKwkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gJiYKKwkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCisJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0JMT0NLX0JBKSkgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiQkEgc2Vzc2lvbnMgYmxvY2tlZC4gIgorCQkgICAgICAgIkRlbnlpbmcgQkEgc2Vzc2lvbiByZXF1ZXN0XG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIDgwMi4xMW4tMjAwOSAxMS41LjEuMTogSWYgdGhlIGluaXRpYXRpbmcgU1RBIGlzIGFuIEhUIFNUQSwgaXMgYQorCSAqIG1lbWJlciBvZiBhbiBJQlNTLCBhbmQgaGFzIG5vIG90aGVyIGV4aXN0aW5nIEJsb2NrIEFjayBhZ3JlZW1lbnQKKwkgKiB3aXRoIHRoZSByZWNpcGllbnQgU1RBLCB0aGVuIHRoZSBpbml0aWF0aW5nIFNUQSBzaGFsbCB0cmFuc21pdCBhCisJICogUHJvYmUgUmVxdWVzdCBmcmFtZSB0byB0aGUgcmVjaXBpZW50IFNUQSBhbmQgc2hhbGwgbm90IHRyYW5zbWl0IGFuCisJICogQUREQkEgUmVxdWVzdCBmcmFtZSB1bmxlc3MgaXQgcmVjZWl2ZXMgYSBQcm9iZSBSZXNwb25zZSBmcmFtZQorCSAqIGZyb20gdGhlIHJlY2lwaWVudCB3aXRoaW4gZG90MTFBRERCQUZhaWx1cmVUaW1lb3V0LgorCSAqCisJICogVGhlIHByb2JlIHJlcXVlc3QgbWVjaGFuaXNtIGZvciBBRERCQSBpcyBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkLAorCSAqIGJ1dCB3ZSBvbmx5IGJ1aWxkIHVwIEJsb2NrIEFjayBzZXNzaW9uIHdpdGggSFQgU1RBcy4gVGhpcyBpbmZvcm1hdGlvbgorCSAqIGlzIHNldCB3aGVuIHdlIHJlY2VpdmUgYSBic3MgaW5mbyBmcm9tIGEgcHJvYmUgcmVzcG9uc2Ugb3IgYSBiZWFjb24uCisJICovCisJaWYgKHN0YS0+c2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DICYmCisJICAgICFzdGEtPnN0YS5odF9jYXAuaHRfc3VwcG9ydGVkKSB7CisjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCisJCXByaW50ayhLRVJOX0RFQlVHICJCQSByZXF1ZXN0IGRlbmllZCAtIElCU1MgU1RBICVwTSIKKwkJICAgICAgICJkb2VzIG5vdCBhZHZlcnRpc2UgSFQgc3VwcG9ydFxuIiwgcHVic3RhLT5hZGRyKTsKKyNlbmRpZiAvKiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc3Bpbl9sb2NrX2JoKCZzdGEtPmxvY2spOworCisJLyogd2UgaGF2ZSB0cmllZCB0b28gbWFueSB0aW1lcywgcmVjZWl2ZXIgZG9lcyBub3Qgd2FudCBBLU1QRFUgKi8KKwlpZiAoc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1bdGlkXSA+IEhUX0FHR19NQVhfUkVUUklFUykgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3VubG9ja19zdGE7CisJfQorCisJLyoKKwkgKiBpZiB3ZSBoYXZlIHRyaWVkIG1vcmUgdGhhbiBIVF9BR0dfQlVSU1RfUkVUUklFUyB0aW1lcyB3ZQorCSAqIHdpbGwgc3ByZWFkIG91ciByZXF1ZXN0cyBpbiB0aW1lIHRvIGF2b2lkIHN0YWxsaW5nIGNvbm5lY3Rpb24KKwkgKiBmb3IgdG9vIGxvbmcKKwkgKi8KKwlpZiAoc3RhLT5hbXBkdV9tbG1lLmFkZGJhX3JlcV9udW1bdGlkXSA+IEhUX0FHR19CVVJTVF9SRVRSSUVTICYmCisJICAgIHRpbWVfYmVmb3JlKGppZmZpZXMsIHN0YS0+YW1wZHVfbWxtZS5sYXN0X2FkZGJhX3JlcV90aW1lW3RpZF0gKworCQkJSFRfQUdHX1JFVFJJRVNfUEVSSU9EKSkgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiQkEgcmVxdWVzdCBkZW5pZWQgLSAiCisJCSAgICAgICAid2FpdGluZyBhIGdyYWNlIHBlcmlvZCBhZnRlciAlZCBmYWlsZWQgcmVxdWVzdHMgIgorCQkgICAgICAgIm9uIHRpZCAldVxuIiwKKwkJICAgICAgIHN0YS0+YW1wZHVfbWxtZS5hZGRiYV9yZXFfbnVtW3RpZF0sIHRpZCk7CisjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfdW5sb2NrX3N0YTsKKwl9CisKKwl0aWRfdHggPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkX3RpZF90eChzdGEsIHRpZCk7CisJLyogY2hlY2sgaWYgdGhlIFRJRCBpcyBub3QgaW4gYWdncmVnYXRpb24gZmxvdyBhbHJlYWR5ICovCisJaWYgKHRpZF90eCB8fCBzdGEtPmFtcGR1X21sbWUudGlkX3N0YXJ0X3R4W3RpZF0pIHsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcgIkJBIHJlcXVlc3QgZGVuaWVkIC0gc2Vzc2lvbiBpcyBub3QgIgorCQkJCSAiaWRsZSBvbiB0aWQgJXVcbiIsIHRpZCk7CisjZW5kaWYgLyogQ09ORklHX01BQzgwMjExX0hUX0RFQlVHICovCisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gZXJyX3VubG9ja19zdGE7CisJfQorCisJLyogcHJlcGFyZSBBLU1QRFUgTUxNRSBmb3IgVHggYWdncmVnYXRpb24gKi8KKwl0aWRfdHggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgdGlkX2FtcGR1X3R4KSwgR0ZQX0FUT01JQyk7CisJaWYgKCF0aWRfdHgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfdW5sb2NrX3N0YTsKKwl9CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZ0aWRfdHgtPnBlbmRpbmcpOworCV9fc2V0X2JpdChIVF9BR0dfU1RBVEVfV0FOVF9TVEFSVCwgJnRpZF90eC0+c3RhdGUpOworCisJdGlkX3R4LT50aW1lb3V0ID0gdGltZW91dDsKKworCS8qIHJlc3BvbnNlIHRpbWVyICovCisJdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyLmZ1bmN0aW9uID0gc3RhX2FkZGJhX3Jlc3BfdGltZXJfZXhwaXJlZDsKKwl0aWRfdHgtPmFkZGJhX3Jlc3BfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSZzdGEtPnRpbWVyX3RvX3RpZFt0aWRdOworCWluaXRfdGltZXIoJnRpZF90eC0+YWRkYmFfcmVzcF90aW1lcik7CisKKwkvKiB0eCB0aW1lciAqLworCXRpZF90eC0+c2Vzc2lvbl90aW1lci5mdW5jdGlvbiA9IHN0YV90eF9hZ2dfc2Vzc2lvbl90aW1lcl9leHBpcmVkOworCXRpZF90eC0+c2Vzc2lvbl90aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpJnN0YS0+dGltZXJfdG9fdGlkW3RpZF07CisJaW5pdF90aW1lcigmdGlkX3R4LT5zZXNzaW9uX3RpbWVyKTsKKworCS8qIGFzc2lnbiBhIGRpYWxvZyB0b2tlbiAqLworCXN0YS0+YW1wZHVfbWxtZS5kaWFsb2dfdG9rZW5fYWxsb2NhdG9yKys7CisJdGlkX3R4LT5kaWFsb2dfdG9rZW4gPSBzdGEtPmFtcGR1X21sbWUuZGlhbG9nX3Rva2VuX2FsbG9jYXRvcjsKKworCS8qCisJICogRmluYWxseSwgYXNzaWduIGl0IHRvIHRoZSBzdGFydCBhcnJheTsgdGhlIHdvcmsgaXRlbSB3aWxsCisJICogY29sbGVjdCBpdCBhbmQgbW92ZSBpdCB0byB0aGUgbm9ybWFsIGFycmF5LgorCSAqLworCXN0YS0+YW1wZHVfbWxtZS50aWRfc3RhcnRfdHhbdGlkXSA9IHRpZF90eDsKKworCWllZWU4MDIxMV9xdWV1ZV93b3JrKCZsb2NhbC0+aHcsICZzdGEtPmFtcGR1X21sbWUud29yayk7CisKKwkvKiB0aGlzIGZsb3cgY29udGludWVzIG9mZiB0aGUgd29yayAqLworIGVycl91bmxvY2tfc3RhOgorCXNwaW5fdW5sb2NrX2JoKCZzdGEtPmxvY2spOworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9zdGFydF90eF9iYV9zZXNzaW9uKTsKKwogc3RhdGljIHZvaWQgaWVlZTgwMjExX2FnZ190eF9vcGVyYXRpb25hbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCQkJIHN0cnVjdCBzdGFfaW5mbyAqc3RhLCB1MTYgdGlkKQogewpAQCAtNTMxLDcgKzYxNiw3IEBACiAJfQogCiAJbXV0ZXhfbG9jaygmbG9jYWwtPnN0YV9tdHgpOwotCXN0YSA9IHN0YV9pbmZvX2dldChzZGF0YSwgcmEpOworCXN0YSA9IHN0YV9pbmZvX2dldF9ic3Moc2RhdGEsIHJhKTsKIAlpZiAoIXN0YSkgewogCQltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKQEAgLTY2MCw3ICs3NDUsNyBAQAogCiAJbXV0ZXhfbG9jaygmbG9jYWwtPnN0YV9tdHgpOwogCi0Jc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCByYSk7CisJc3RhID0gc3RhX2luZm9fZ2V0X2JzcyhzZGF0YSwgcmEpOwogCWlmICghc3RhKSB7CiAjaWZkZWYgQ09ORklHX01BQzgwMjExX0hUX0RFQlVHCiAJCXByaW50ayhLRVJOX0RFQlVHICJDb3VsZCBub3QgZmluZCBzdGF0aW9uOiAlcE1cbiIsIHJhKTsKQEAgLTc1NywxMSArODQyLDI3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWRlbF90aW1lcigmdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyKTsKKwlkZWxfdGltZXJfc3luYygmdGlkX3R4LT5hZGRiYV9yZXNwX3RpbWVyKTsKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRwogCXByaW50ayhLRVJOX0RFQlVHICJzd2l0Y2hlZCBvZmYgYWRkQkEgdGltZXIgZm9yIHRpZCAlZFxuIiwgdGlkKTsKICNlbmRpZgorCisJLyoKKwkgKiBhZGRiYV9yZXNwX3RpbWVyIG1heSBoYXZlIGZpcmVkIGJlZm9yZSB3ZSBnb3QgaGVyZSwgYW5kCisJICogY2F1c2VkIFdBTlRfU1RPUCB0byBiZSBzZXQuIElmIHRoZSBzdG9wIHRoZW4gd2FzIGFscmVhZHkKKwkgKiBwcm9jZXNzZWQgZnVydGhlciwgU1RPUFBJTkcgbWlnaHQgYmUgc2V0LgorCSAqLworCWlmICh0ZXN0X2JpdChIVF9BR0dfU1RBVEVfV0FOVF9TVE9QLCAmdGlkX3R4LT5zdGF0ZSkgfHwKKwkgICAgdGVzdF9iaXQoSFRfQUdHX1NUQVRFX1NUT1BQSU5HLCAmdGlkX3R4LT5zdGF0ZSkpIHsKKyNpZmRlZiBDT05GSUdfTUFDODAyMTFfSFRfREVCVUcKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJnb3QgYWRkQkEgcmVzcCBmb3IgdGlkICVkIGJ1dCB3ZSBhbHJlYWR5IGdhdmUgdXBcbiIsCisJCSAgICAgICB0aWQpOworI2VuZGlmCisJCWdvdG8gb3V0OworCX0KKwogCS8qCiAJICogSUVFRSA4MDIuMTEtMjAwNyA3LjMuMS4xNDoKIAkgKiBJbiBhbiBBRERCQSBSZXNwb25zZSBmcmFtZSwgd2hlbiB0aGUgU3RhdHVzIENvZGUgZmllbGQKQEAgLTc4Miw2ICs4ODMsMTEgQEAKIAkJCWllZWU4MDIxMV9hZ2dfdHhfb3BlcmF0aW9uYWwobG9jYWwsIHN0YSwgdGlkKTsKIAogCQlzdGEtPmFtcGR1X21sbWUuYWRkYmFfcmVxX251bVt0aWRdID0gMDsKKworCQlpZiAodGlkX3R4LT50aW1lb3V0KQorCQkJbW9kX3RpbWVyKCZ0aWRfdHgtPnNlc3Npb25fdGltZXIsCisJCQkJICBUVV9UT19FWFBfVElNRSh0aWRfdHgtPnRpbWVvdXQpKTsKKwogCX0gZWxzZSB7CiAJCV9fX2llZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oc3RhLCB0aWQsIFdMQU5fQkFDS19JTklUSUFUT1IsCiAJCQkJCQl0cnVlKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9jZmcuYyBiL25ldC9tYWM4MDIxMS9jZmcuYwppbmRleCBkMDZjNjVmLi44NTBiYjk2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvY2ZnLmMKKysrIGIvbmV0L21hYzgwMjExL2NmZy5jCkBAIC0xMDIsNiArMTAyLDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3NldF9ub2Fja19tYXAoc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICB1MTYgbm9hY2tfbWFwKQoreworCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKKworCXNkYXRhLT5ub2Fja19tYXAgPSBub2Fja19tYXA7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgaWVlZTgwMjExX2FkZF9rZXkoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICAgdTgga2V5X2lkeCwgYm9vbCBwYWlyd2lzZSwgY29uc3QgdTggKm1hY19hZGRyLAogCQkJICAgICBzdHJ1Y3Qga2V5X3BhcmFtcyAqcGFyYW1zKQpAQCAtMzQ1LDcgKzM1NSw4IEBACiAJCQlTVEFUSU9OX0lORk9fUlhfRFJPUF9NSVNDIHwKIAkJCVNUQVRJT05fSU5GT19CU1NfUEFSQU0gfAogCQkJU1RBVElPTl9JTkZPX0NPTk5FQ1RFRF9USU1FIHwKLQkJCVNUQVRJT05fSU5GT19TVEFfRkxBR1M7CisJCQlTVEFUSU9OX0lORk9fU1RBX0ZMQUdTIHwKKwkJCVNUQVRJT05fSU5GT19CRUFDT05fTE9TU19DT1VOVDsKIAogCWRvX3Bvc2l4X2Nsb2NrX21vbm90b25pY19nZXR0aW1lKCZ1cHRpbWUpOwogCXNpbmZvLT5jb25uZWN0ZWRfdGltZSA9IHVwdGltZS50dl9zZWMgLSBzdGEtPmxhc3RfY29ubmVjdGVkOwpAQCAtMzU4LDYgKzM2OSw3IEBACiAJc2luZm8tPnR4X3JldHJpZXMgPSBzdGEtPnR4X3JldHJ5X2NvdW50OwogCXNpbmZvLT50eF9mYWlsZWQgPSBzdGEtPnR4X3JldHJ5X2ZhaWxlZDsKIAlzaW5mby0+cnhfZHJvcHBlZF9taXNjID0gc3RhLT5yeF9kcm9wcGVkOworCXNpbmZvLT5iZWFjb25fbG9zc19jb3VudCA9IHN0YS0+YmVhY29uX2xvc3NfY291bnQ7CiAKIAlpZiAoKHN0YS0+bG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX1NJR05BTF9EQk0pIHx8CiAJICAgIChzdGEtPmxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19TSUdOQUxfVU5TUEVDKSkgewpAQCAtNDExLDcgKzQyMyw4IEBACiAJCQkJQklUKE5MODAyMTFfU1RBX0ZMQUdfU0hPUlRfUFJFQU1CTEUpIHwKIAkJCQlCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpIHwKIAkJCQlCSVQoTkw4MDIxMV9TVEFfRkxBR19NRlApIHwKLQkJCQlCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEKTsKKwkJCQlCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEKSB8CisJCQkJQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKTsKIAlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEhPUklaRUQpKQogCQlzaW5mby0+c3RhX2ZsYWdzLnNldCB8PSBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIT1JJWkVEKTsKIAlpZiAodGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1NIT1JUX1BSRUFNQkxFKSkKQEAgLTQyMiw2ICs0MzUsOCBAQAogCQlzaW5mby0+c3RhX2ZsYWdzLnNldCB8PSBCSVQoTkw4MDIxMV9TVEFfRkxBR19NRlApOwogCWlmICh0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSCkpCiAJCXNpbmZvLT5zdGFfZmxhZ3Muc2V0IHw9IEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpOworCWlmICh0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfVERMU19QRUVSKSkKKwkJc2luZm8tPnN0YV9mbGFncy5zZXQgfD0gQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKTsKIH0KIAogCkBAIC00ODgsNiArNTAzLDMxIEBACiAJCShwYXJhbXMtPmhpZGRlbl9zc2lkICE9IE5MODAyMTFfSElEREVOX1NTSURfTk9UX0lOX1VTRSk7CiB9CiAKK3N0YXRpYyBpbnQgaWVlZTgwMjExX3NldF9wcm9iZV9yZXNwKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICB1OCAqcmVzcCwgc2l6ZV90IHJlc3BfbGVuKQoreworCXN0cnVjdCBza19idWZmICpuZXcsICpvbGQ7CisKKwlpZiAoIXJlc3AgfHwgIXJlc3BfbGVuKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW9sZCA9IHJ0bmxfZGVyZWZlcmVuY2Uoc2RhdGEtPnUuYXAucHJvYmVfcmVzcCk7CisKKwluZXcgPSBkZXZfYWxsb2Nfc2tiKHJlc3BfbGVuKTsKKwlpZiAoIW5ldykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwltZW1jcHkoc2tiX3B1dChuZXcsIHJlc3BfbGVuKSwgcmVzcCwgcmVzcF9sZW4pOworCisJcmN1X2Fzc2lnbl9wb2ludGVyKHNkYXRhLT51LmFwLnByb2JlX3Jlc3AsIG5ldyk7CisJc3luY2hyb25pemVfcmN1KCk7CisKKwlpZiAob2xkKQorCQlkZXZfa2ZyZWVfc2tiKG9sZCk7CisKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIFRoaXMgaGFuZGxlcyBib3RoIGFkZGluZyBhIGJlYWNvbiBhbmQgc2V0dGluZyBuZXcgYmVhY29uIGluZm8KICAqLwpAQCAtNDk4LDYgKzUzOCw3IEBACiAJaW50IG5ld19oZWFkX2xlbiwgbmV3X3RhaWxfbGVuOwogCWludCBzaXplOwogCWludCBlcnIgPSAtRUlOVkFMOworCXUzMiBjaGFuZ2VkID0gMDsKIAogCW9sZCA9IHJ0bmxfZGVyZWZlcmVuY2Uoc2RhdGEtPnUuYXAuYmVhY29uKTsKIApAQCAtNTgxLDExICs2MjIsMTcgQEAKIAogCWtmcmVlKG9sZCk7CiAKLQlpZWVlODAyMTFfY29uZmlnX2FwX3NzaWQoc2RhdGEsIHBhcmFtcyk7CisJZXJyID0gaWVlZTgwMjExX3NldF9wcm9iZV9yZXNwKHNkYXRhLCBwYXJhbXMtPnByb2JlX3Jlc3AsCisJCQkJICAgICAgIHBhcmFtcy0+cHJvYmVfcmVzcF9sZW4pOworCWlmICghZXJyKQorCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0FQX1BST0JFX1JFU1A7CiAKLQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQgfAotCQkJCQkJQlNTX0NIQU5HRURfQkVBQ09OIHwKLQkJCQkJCUJTU19DSEFOR0VEX1NTSUQpOworCWllZWU4MDIxMV9jb25maWdfYXBfc3NpZChzZGF0YSwgcGFyYW1zKTsKKwljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEIHwKKwkJICAgQlNTX0NIQU5HRURfQkVBQ09OIHwKKwkJICAgQlNTX0NIQU5HRURfU1NJRDsKKworCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBjaGFuZ2VkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTk0LDYgKzY0MSw4IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJc3RydWN0IGJlYWNvbl9kYXRhICpvbGQ7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqdmxhbjsKKwlpbnQgcmV0OwogCiAJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihkZXYpOwogCkBAIC02MDEsNyArNjUwLDI0IEBACiAJaWYgKG9sZCkKIAkJcmV0dXJuIC1FQUxSRUFEWTsKIAotCXJldHVybiBpZWVlODAyMTFfY29uZmlnX2JlYWNvbihzZGF0YSwgcGFyYW1zKTsKKwlyZXQgPSBpZWVlODAyMTFfY29uZmlnX2JlYWNvbihzZGF0YSwgcGFyYW1zKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBBcHBseSBjb250cm9sIHBvcnQgcHJvdG9jb2wsIHRoaXMgYWxsb3dzIHVzIHRvCisJICogbm90IGVuY3J5cHQgZHluYW1pYyBXRVAgY29udHJvbCBmcmFtZXMuCisJICovCisJc2RhdGEtPmNvbnRyb2xfcG9ydF9wcm90b2NvbCA9IHBhcmFtcy0+Y3J5cHRvLmNvbnRyb2xfcG9ydF9ldGhlcnR5cGU7CisJc2RhdGEtPmNvbnRyb2xfcG9ydF9ub19lbmNyeXB0ID0gcGFyYW1zLT5jcnlwdG8uY29udHJvbF9wb3J0X25vX2VuY3J5cHQ7CisJbGlzdF9mb3JfZWFjaF9lbnRyeSh2bGFuLCAmc2RhdGEtPnUuYXAudmxhbnMsIHUudmxhbi5saXN0KSB7CisJCXZsYW4tPmNvbnRyb2xfcG9ydF9wcm90b2NvbCA9CisJCQlwYXJhbXMtPmNyeXB0by5jb250cm9sX3BvcnRfZXRoZXJ0eXBlOworCQl2bGFuLT5jb250cm9sX3BvcnRfbm9fZW5jcnlwdCA9CisJCQlwYXJhbXMtPmNyeXB0by5jb250cm9sX3BvcnRfbm9fZW5jcnlwdDsKKwl9CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBpZWVlODAyMTFfc2V0X2JlYWNvbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtNjgyLDEwICs3NDgsMTEgQEAKIAluZXRpZl9yeF9uaShza2IpOwogfQogCi1zdGF0aWMgdm9pZCBzdGFfYXBwbHlfcGFyYW1ldGVycyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkgc3RydWN0IHN0YV9pbmZvICpzdGEsCi0JCQkJIHN0cnVjdCBzdGF0aW9uX3BhcmFtZXRlcnMgKnBhcmFtcykKK3N0YXRpYyBpbnQgc3RhX2FwcGx5X3BhcmFtZXRlcnMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkJc3RydWN0IHN0YXRpb25fcGFyYW1ldGVycyAqcGFyYW1zKQogeworCWludCByZXQgPSAwOwogCXUzMiByYXRlczsKIAlpbnQgaSwgajsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKQEAgLTY5NywxMyArNzY0LDU5IEBACiAJbWFzayA9IHBhcmFtcy0+c3RhX2ZsYWdzX21hc2s7CiAJc2V0ID0gcGFyYW1zLT5zdGFfZmxhZ3Nfc2V0OwogCisJLyoKKwkgKiBJbiBtZXNoIG1vZGUsIHdlIGNhbiBjbGVhciBBVVRIRU5USUNBVEVEIGZsYWcgYnV0IG11c3QKKwkgKiBhbHNvIG1ha2UgQVNTT0NJQVRFRCBmb2xsb3cgYXBwcm9wcmlhdGVseSBmb3IgdGhlIGRyaXZlcgorCSAqIEFQSS4gU2VlIGFsc28gYmVsb3csIGFmdGVyIEFVVEhPUklaRUQgY2hhbmdlcy4KKwkgKi8KKwlpZiAobWFzayAmIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpKSB7CisJCS8qIGNmZzgwMjExIHNob3VsZCBub3QgYWxsb3cgdGhpcyBpbiBub24tbWVzaCBtb2RlcyAqLworCQlpZiAoV0FSTl9PTighaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkgJiYKKwkJICAgICF0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSCkpIHsKKwkJCXJldCA9IHN0YV9pbmZvX21vdmVfc3RhdGVfY2hlY2tlZChzdGEsCisJCQkJCUlFRUU4MDIxMV9TVEFfQVVUSCk7CisJCQlpZiAocmV0KQorCQkJCXJldHVybiByZXQ7CisJCQlyZXQgPSBzdGFfaW5mb19tb3ZlX3N0YXRlX2NoZWNrZWQoc3RhLAorCQkJCQlJRUVFODAyMTFfU1RBX0FTU09DKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwogCWlmIChtYXNrICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCkpIHsKIAkJaWYgKHNldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhPUklaRUQpKQotCQkJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSE9SSVpFRCk7CisJCQlyZXQgPSBzdGFfaW5mb19tb3ZlX3N0YXRlX2NoZWNrZWQoc3RhLAorCQkJCQlJRUVFODAyMTFfU1RBX0FVVEhPUklaRUQpOwogCQllbHNlCi0JCQljbGVhcl9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEhPUklaRUQpOworCQkJcmV0ID0gc3RhX2luZm9fbW92ZV9zdGF0ZV9jaGVja2VkKHN0YSwKKwkJCQkJSUVFRTgwMjExX1NUQV9BU1NPQyk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OwogCX0KIAorCWlmIChtYXNrICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSEVOVElDQVRFRCkpIHsKKwkJLyogY2ZnODAyMTEgc2hvdWxkIG5vdCBhbGxvdyB0aGlzIGluIG5vbi1tZXNoIG1vZGVzICovCisJCWlmIChXQVJOX09OKCFpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICghKHNldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpKSAmJgorCQkgICAgdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEgpKSB7CisJCQlyZXQgPSBzdGFfaW5mb19tb3ZlX3N0YXRlX2NoZWNrZWQoc3RhLAorCQkJCQlJRUVFODAyMTFfU1RBX0FVVEgpOworCQkJaWYgKHJldCkKKwkJCQlyZXR1cm4gcmV0OworCQkJcmV0ID0gc3RhX2luZm9fbW92ZV9zdGF0ZV9jaGVja2VkKHN0YSwKKwkJCQkJSUVFRTgwMjExX1NUQV9OT05FKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKworCiAJaWYgKG1hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19TSE9SVF9QUkVBTUJMRSkpIHsKIAkJaWYgKHNldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1NIT1JUX1BSRUFNQkxFKSkKIAkJCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1NIT1JUX1BSRUFNQkxFKTsKQEAgLTcyOCwxMyArODQxLDYgQEAKIAkJCWNsZWFyX3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfTUZQKTsKIAl9CiAKLQlpZiAobWFzayAmIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhFTlRJQ0FURUQpKSB7Ci0JCWlmIChzZXQgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEKSkKLQkJCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEgpOwotCQllbHNlCi0JCQljbGVhcl9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEgpOwotCX0KLQogCWlmIChtYXNrICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgewogCQlpZiAoc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkKIAkJCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1RETFNfUEVFUik7CkBAIC03NzgsNyArODg0LDcgQEAKIAl9CiAKIAlpZiAocGFyYW1zLT5odF9jYXBhKQotCQlpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc2JhbmQsCisJCWllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzZGF0YSwgc2JhbmQsCiAJCQkJCQkgIHBhcmFtcy0+aHRfY2FwYSwKIAkJCQkJCSAgJnN0YS0+c3RhLmh0X2NhcCk7CiAKQEAgLTgwNiw2ICs5MTIsOCBAQAogCQkJfQogI2VuZGlmCiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQgaWVlZTgwMjExX2FkZF9zdGF0aW9uKHN0cnVjdCB3aXBoeSAqd2lwaHksIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCkBAIC04MzIsMjIgKzk0MCwyNSBAQAogCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihtYWMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIE9ubHkgVERMUy1zdXBwb3J0aW5nIHN0YXRpb25zIGNhbiBhZGQgVERMUyBwZWVycyAqLwotCWlmICgocGFyYW1zLT5zdGFfZmxhZ3Nfc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgJiYKLQkgICAgISgod2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19TVVBQT1JUU19URExTKSAmJgotCSAgICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSkKLQkJcmV0dXJuIC1FTk9UU1VQUDsKLQogCXN0YSA9IHN0YV9pbmZvX2FsbG9jKHNkYXRhLCBtYWMsIEdGUF9LRVJORUwpOwogCWlmICghc3RhKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEgpOwotCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FTU09DKTsKKwlzdGFfaW5mb19tb3ZlX3N0YXRlKHN0YSwgSUVFRTgwMjExX1NUQV9BVVRIKTsKKwlzdGFfaW5mb19tb3ZlX3N0YXRlKHN0YSwgSUVFRTgwMjExX1NUQV9BU1NPQyk7CiAKLQlzdGFfYXBwbHlfcGFyYW1ldGVycyhsb2NhbCwgc3RhLCBwYXJhbXMpOworCWVyciA9IHN0YV9hcHBseV9wYXJhbWV0ZXJzKGxvY2FsLCBzdGEsIHBhcmFtcyk7CisJaWYgKGVycikgeworCQlzdGFfaW5mb19mcmVlKGxvY2FsLCBzdGEpOworCQlyZXR1cm4gZXJyOworCX0KIAotCXJhdGVfY29udHJvbF9yYXRlX2luaXQoc3RhKTsKKwkvKgorCSAqIGZvciBURExTLCByYXRlIGNvbnRyb2wgc2hvdWxkIGJlIGluaXRpYWxpemVkIG9ubHkgd2hlbiBzdXBwb3J0ZWQKKwkgKiByYXRlcyBhcmUga25vd24uCisJICovCisJaWYgKCF0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfVERMU19QRUVSKSkKKwkJcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEpOwogCiAJbGF5ZXIyX3VwZGF0ZSA9IHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOIHx8CiAJCXNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUDsKQEAgLTg5MSwxOSArMTAwMiwxOSBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnZsYW5zZGF0YTsKIAotCXJjdV9yZWFkX2xvY2soKTsKKwltdXRleF9sb2NrKCZsb2NhbC0+c3RhX210eCk7CiAKIAlzdGEgPSBzdGFfaW5mb19nZXRfYnNzKHNkYXRhLCBtYWMpOwogCWlmICghc3RhKSB7Ci0JCXJjdV9yZWFkX3VubG9jaygpOworCQltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKIAkJcmV0dXJuIC1FTk9FTlQ7CiAJfQogCi0JLyogVGhlIFRETFMgYml0IGNhbm5vdCBiZSB0b2dnbGVkIGFmdGVyIHRoZSBTVEEgd2FzIGFkZGVkICovCi0JaWYgKChwYXJhbXMtPnN0YV9mbGFnc19tYXNrICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgJiYKLQkgICAgISEocGFyYW1zLT5zdGFfZmxhZ3Nfc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgIT0KLQkgICAgISF0ZXN0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfVERMU19QRUVSKSkgewotCQlyY3VfcmVhZF91bmxvY2soKTsKKwkvKiBpbiBzdGF0aW9uIG1vZGUsIHN1cHBvcnRlZCByYXRlcyBhcmUgb25seSB2YWxpZCB3aXRoIFRETFMgKi8KKwlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKKwkgICAgcGFyYW1zLT5zdXBwb3J0ZWRfcmF0ZXMgJiYKKwkgICAgIXRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9URExTX1BFRVIpKSB7CisJCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTkxMiwxMyArMTAyMywxMyBAQAogCiAJCWlmICh2bGFuc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gJiYKIAkJICAgIHZsYW5zZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKLQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c3RhX210eCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQogCiAJCWlmIChwYXJhbXMtPnZsYW4tPmllZWU4MDIxMV9wdHItPnVzZV80YWRkcikgewogCQkJaWYgKHZsYW5zZGF0YS0+dS52bGFuLnN0YSkgewotCQkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwogCQkJCXJldHVybiAtRUJVU1k7CiAJCQl9CiAKQEAgLTkzMSw3ICsxMDQyLDEwIEBACiAKIAlzdGFfYXBwbHlfcGFyYW1ldGVycyhsb2NhbCwgc3RhLCBwYXJhbXMpOwogCi0JcmN1X3JlYWRfdW5sb2NrKCk7CisJaWYgKHRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9URExTX1BFRVIpICYmIHBhcmFtcy0+c3VwcG9ydGVkX3JhdGVzKQorCQlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7CisKKwltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKIAogCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgogCSAgICBwYXJhbXMtPnN0YV9mbGFnc19tYXNrICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCkpCkBAIC0xMTIzLDYgKzEyMzcsOCBAQAogewogCXU4ICpuZXdfaWU7CiAJY29uc3QgdTggKm9sZF9pZTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IGNvbnRhaW5lcl9vZihpZm1zaCwKKwkJCQkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSwgdS5tZXNoKTsKIAogCS8qIGFsbG9jYXRlIGluZm9ybWF0aW9uIGVsZW1lbnRzICovCiAJbmV3X2llID0gTlVMTDsKQEAgLTExNDksNiArMTI2NSwxMCBAQAogCWlmIChzZXR1cC0+aXNfc2VjdXJlKQogCQlpZm1zaC0+c2VjdXJpdHkgfD0gSUVFRTgwMjExX01FU0hfU0VDX1NFQ1VSRUQ7CiAKKwkvKiBtY2FzdCByYXRlIHNldHRpbmcgaW4gTWVzaCBOb2RlICovCisJbWVtY3B5KHNkYXRhLT52aWYuYnNzX2NvbmYubWNhc3RfcmF0ZSwgc2V0dXAtPm1jYXN0X3JhdGUsCisJCQkJCQlzaXplb2Yoc2V0dXAtPm1jYXN0X3JhdGUpKTsKKwogCXJldHVybiAwOwogfQogCkBAIC0xMTk0LDYgKzEzMTQsOSBAQAogCWlmIChfY2hnX21lc2hfYXR0cihOTDgwMjExX01FU0hDT05GX0hXTVBfUFJFUV9NSU5fSU5URVJWQUwsIG1hc2spKQogCQljb25mLT5kb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsID0KIAkJCW5jb25mLT5kb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsOworCWlmIChfY2hnX21lc2hfYXR0cihOTDgwMjExX01FU0hDT05GX0hXTVBfUEVSUl9NSU5fSU5URVJWQUwsIG1hc2spKQorCQljb25mLT5kb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsID0KKwkJCW5jb25mLT5kb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsOwogCWlmIChfY2hnX21lc2hfYXR0cihOTDgwMjExX01FU0hDT05GX0hXTVBfTkVUX0RJQU1fVFJWU19USU1FLAogCQkJICAgbWFzaykpCiAJCWNvbmYtPmRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUgPQpAQCAtMTM5NCw3ICsxNTE3LDcgQEAKIAkgICAgKG9sZF9vcGVyX3R5cGUgIT0gbG9jYWwtPl9vcGVyX2NoYW5uZWxfdHlwZSkpCiAJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKTsKIAotCWlmICgoc2RhdGEgJiYgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01PTklUT1IpICYmCisJaWYgKHNkYXRhICYmIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NT05JVE9SICYmCiAJICAgIG9sZF92aWZfb3Blcl90eXBlICE9IHNkYXRhLT52aWYuYnNzX2NvbmYuY2hhbm5lbF90eXBlKQogCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfSFQpOwogCkBAIC0xOTE3LDcgKzIwNDAsNyBAQAogCQkJICAgICBlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZSwKIAkJCSAgICAgYm9vbCBjaGFubmVsX3R5cGVfdmFsaWQsIHVuc2lnbmVkIGludCB3YWl0LAogCQkJICAgICBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBib29sIG5vX2NjaywKLQkJCSAgICAgdTY0ICpjb29raWUpCisJCQkgICAgIGJvb2wgZG9udF93YWl0X2Zvcl9hY2ssIHU2NCAqY29va2llKQogewogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gSUVFRTgwMjExX0RFVl9UT19TVUJfSUYoZGV2KTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKQEAgLTE5MjUsMTAgKzIwNDgsMTUgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3dvcmsgKndrOwogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdCA9ICh2b2lkICopYnVmOwotCXUzMiBmbGFncyA9IElFRUU4MDIxMV9UWF9JTlRGTF9OTDgwMjExX0ZSQU1FX1RYIHwKLQkJICAgIElFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUzsKKwl1MzIgZmxhZ3M7CiAJYm9vbCBpc19vZmZjaGFuID0gZmFsc2U7CiAKKwlpZiAoZG9udF93YWl0X2Zvcl9hY2spCisJCWZsYWdzID0gSUVFRTgwMjExX1RYX0NUTF9OT19BQ0s7CisJZWxzZQorCQlmbGFncyA9IElFRUU4MDIxMV9UWF9JTlRGTF9OTDgwMjExX0ZSQU1FX1RYIHwKKwkJCUlFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUzsKKwogCS8qIENoZWNrIHRoYXQgd2UgYXJlIG9uIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbCBmb3IgdHJhbnNtaXNzaW9uICovCiAJaWYgKGNoYW4gIT0gbG9jYWwtPnRtcF9jaGFubmVsICYmCiAJICAgIGNoYW4gIT0gbG9jYWwtPm9wZXJfY2hhbm5lbCkKQEAgLTI0ODgsNiArMjYxNiw4MiBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGllZWU4MDIxMV9wcm9iZV9jbGllbnQoc3RydWN0IHdpcGh5ICp3aXBoeSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCQkgIGNvbnN0IHU4ICpwZWVyLCB1NjQgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGRldik7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9xb3NfaGRyICpudWxsZnVuYzsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCBzaXplID0gc2l6ZW9mKCpudWxsZnVuYyk7CisJX19sZTE2IGZjOworCWJvb2wgcW9zOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlzdGEgPSBzdGFfaW5mb19nZXQoc2RhdGEsIHBlZXIpOworCWlmIChzdGEpIHsKKwkJcW9zID0gdGVzdF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX1dNRSk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCX0gZWxzZSB7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlyZXR1cm4gLUVOT0xJTks7CisJfQorCisJaWYgKHFvcykgeworCQlmYyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJCQkgSUVFRTgwMjExX1NUWVBFX1FPU19OVUxMRlVOQyB8CisJCQkJIElFRUU4MDIxMV9GQ1RMX0ZST01EUyk7CisJfSBlbHNlIHsKKwkJc2l6ZSAtPSAyOworCQlmYyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9EQVRBIHwKKwkJCQkgSUVFRTgwMjExX1NUWVBFX05VTExGVU5DIHwKKwkJCQkgSUVFRTgwMjExX0ZDVExfRlJPTURTKTsKKwl9CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArIHNpemUpOworCWlmICghc2tiKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYi0+ZGV2ID0gZGV2OworCisJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOworCisJbnVsbGZ1bmMgPSAodm9pZCAqKSBza2JfcHV0KHNrYiwgc2l6ZSk7CisJbnVsbGZ1bmMtPmZyYW1lX2NvbnRyb2wgPSBmYzsKKwludWxsZnVuYy0+ZHVyYXRpb25faWQgPSAwOworCW1lbWNweShudWxsZnVuYy0+YWRkcjEsIHN0YS0+c3RhLmFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobnVsbGZ1bmMtPmFkZHIyLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKKwltZW1jcHkobnVsbGZ1bmMtPmFkZHIzLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKKwludWxsZnVuYy0+c2VxX2N0cmwgPSAwOworCisJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKworCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUyB8CisJCSAgICAgICBJRUVFODAyMTFfVFhfSU5URkxfTkw4MDIxMV9GUkFNRV9UWDsKKworCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIElFRUU4MDIxMV9BQ19WTyk7CisJc2tiLT5wcmlvcml0eSA9IDc7CisJaWYgKHFvcykKKwkJbnVsbGZ1bmMtPnFvc19jdHJsID0gY3B1X3RvX2xlMTYoNyk7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJaWVlZTgwMjExX3htaXQoc2RhdGEsIHNrYik7CisJbG9jYWxfYmhfZW5hYmxlKCk7CisKKwkqY29va2llID0gKHVuc2lnbmVkIGxvbmcpIHNrYjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqCitpZWVlODAyMTFfd2lwaHlfZ2V0X2NoYW5uZWwoc3RydWN0IHdpcGh5ICp3aXBoeSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHdpcGh5X3ByaXYod2lwaHkpOworCisJcmV0dXJuIGxvY2FsLT5vcGVyX2NoYW5uZWw7Cit9CisKIHN0cnVjdCBjZmc4MDIxMV9vcHMgbWFjODAyMTFfY29uZmlnX29wcyA9IHsKIAkuYWRkX3ZpcnR1YWxfaW50ZiA9IGllZWU4MDIxMV9hZGRfaWZhY2UsCiAJLmRlbF92aXJ0dWFsX2ludGYgPSBpZWVlODAyMTFfZGVsX2lmYWNlLApAQCAtMjU1Myw0ICsyNzU3LDcgQEAKIAkuc2V0X3Jla2V5X2RhdGEgPSBpZWVlODAyMTFfc2V0X3Jla2V5X2RhdGEsCiAJLnRkbHNfb3BlciA9IGllZWU4MDIxMV90ZGxzX29wZXIsCiAJLnRkbHNfbWdtdCA9IGllZWU4MDIxMV90ZGxzX21nbXQsCisJLnByb2JlX2NsaWVudCA9IGllZWU4MDIxMV9wcm9iZV9jbGllbnQsCisJLmdldF9jaGFubmVsID0gaWVlZTgwMjExX3dpcGh5X2dldF9jaGFubmVsLAorCS5zZXRfbm9hY2tfbWFwID0gaWVlZTgwMjExX3NldF9ub2Fja19tYXAsCiB9OwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2RlYnVnZnMuYyBiL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzLmMKaW5kZXggODgzOTk2Yi4uOTBiYWVhNSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnMuYworKysgYi9uZXQvbWFjODAyMTEvZGVidWdmcy5jCkBAIC05Nyw0MCArOTcsNiBAQAogCS5sbHNlZWsgPSBub29wX2xsc2VlaywKIH07CiAKLXN0YXRpYyBzc2l6ZV90IG5vYWNrX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKLQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0KLQlyZXR1cm4gbWFjODAyMTFfZm9ybWF0X2J1ZmZlcih1c2VyX2J1ZiwgY291bnQsIHBwb3MsICIlZFxuIiwKLQkJCQkgICAgICBsb2NhbC0+d2lmaV93bWVfbm9hY2tfdGVzdCk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IG5vYWNrX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJfYnVmLAotCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCi17Ci0Jc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBmaWxlLT5wcml2YXRlX2RhdGE7Ci0JY2hhciBidWZbMTBdOwotCXNpemVfdCBsZW47Ci0KLQlsZW4gPSBtaW4oY291bnQsIHNpemVvZihidWYpIC0gMSk7Ci0JaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdXNlcl9idWYsIGxlbikpCi0JCXJldHVybiAtRUZBVUxUOwotCWJ1ZltsZW5dID0gJ1wwJzsKLQotCWxvY2FsLT53aWZpX3dtZV9ub2Fja190ZXN0ID0gISFzaW1wbGVfc3RydG91bChidWYsIE5VTEwsIDApOwotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBub2Fja19vcHMgPSB7Ci0JLnJlYWQgPSBub2Fja19yZWFkLAotCS53cml0ZSA9IG5vYWNrX3dyaXRlLAotCS5vcGVuID0gbWFjODAyMTFfb3Blbl9maWxlX2dlbmVyaWMsCi0JLmxsc2VlayA9IGRlZmF1bHRfbGxzZWVrLAotfTsKLQogc3RhdGljIHNzaXplX3QgdWFwc2RfcXVldWVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1c2VyX2J1ZiwKIAkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCiB7CkBAIC0xOTAsNyArMTU2LDcgQEAKIAkJcmV0dXJuIC1FRkFVTFQ7CiAJYnVmW2xlbl0gPSAnXDAnOwogCi0JcmV0ID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAwLCAmdmFsKTsKKwlyZXQgPSBrc3RydG91bChidWYsIDAsICZ2YWwpOwogCiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0zOTgsNyArMzY0LDYgQEAKIAlERUJVR0ZTX0FERCh3ZXBfaXYpOwogCURFQlVHRlNfQUREKHF1ZXVlcyk7CiAJREVCVUdGU19BRERfTU9ERShyZXNldCwgMDIwMCk7Ci0JREVCVUdGU19BREQobm9hY2spOwogCURFQlVHRlNfQUREKHVhcHNkX3F1ZXVlcyk7CiAJREVCVUdGU19BREQodWFwc2RfbWF4X3NwX2xlbik7CiAJREVCVUdGU19BREQoY2hhbm5lbF90eXBlKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX25ldGRldi5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKaW5kZXggOTM1MjgxOS4uMTc2YzA4ZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfbmV0ZGV2LmMKQEAgLTMyMSw2ICszMjEsNyBAQAogX19JRUVFODAyMTFfSUZfRklMRV9XKHRraXBfbWljX3Rlc3QpOwogCiAvKiBBUCBhdHRyaWJ1dGVzICovCitJRUVFODAyMTFfSUZfRklMRShudW1fc3RhX2F1dGhvcml6ZWQsIHUuYXAubnVtX3N0YV9hdXRob3JpemVkLCBBVE9NSUMpOwogSUVFRTgwMjExX0lGX0ZJTEUobnVtX3N0YV9wcywgdS5hcC5udW1fc3RhX3BzLCBBVE9NSUMpOwogSUVFRTgwMjExX0lGX0ZJTEUoZHRpbV9jb3VudCwgdS5hcC5kdGltX2NvdW50LCBERUMpOwogCkBAIC00MDUsNiArNDA2LDggQEAKIAkJdS5tZXNoLm1zaGNmZy5kb3QxMU1lc2hIV01QYWN0aXZlUGF0aFRpbWVvdXQsIERFQyk7CiBJRUVFODAyMTFfSUZfRklMRShkb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsLAogCQl1Lm1lc2gubXNoY2ZnLmRvdDExTWVzaEhXTVBwcmVxTWluSW50ZXJ2YWwsIERFQyk7CitJRUVFODAyMTFfSUZfRklMRShkb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsLAorCQl1Lm1lc2gubXNoY2ZnLmRvdDExTWVzaEhXTVBwZXJyTWluSW50ZXJ2YWwsIERFQyk7CiBJRUVFODAyMTFfSUZfRklMRShkb3QxMU1lc2hIV01QbmV0RGlhbWV0ZXJUcmF2ZXJzYWxUaW1lLAogCQl1Lm1lc2gubXNoY2ZnLmRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUsIERFQyk7CiBJRUVFODAyMTFfSUZfRklMRShkb3QxMU1lc2hIV01QbWF4UFJFUXJldHJpZXMsCkBAIC00NTYsNiArNDU5LDcgQEAKIAlERUJVR0ZTX0FERChyY19yYXRlaWR4X21hc2tfMmdoeik7CiAJREVCVUdGU19BREQocmNfcmF0ZWlkeF9tYXNrXzVnaHopOwogCisJREVCVUdGU19BREQobnVtX3N0YV9hdXRob3JpemVkKTsKIAlERUJVR0ZTX0FERChudW1fc3RhX3BzKTsKIAlERUJVR0ZTX0FERChkdGltX2NvdW50KTsKIAlERUJVR0ZTX0FERChudW1fYnVmZmVyZWRfbXVsdGljYXN0KTsKQEAgLTUzNCw2ICs1MzgsNyBAQAogCU1FU0hQQVJBTVNfQUREKGRvdDExTWVzaE1heFBlZXJMaW5rcyk7CiAJTUVTSFBBUkFNU19BREQoZG90MTFNZXNoSFdNUGFjdGl2ZVBhdGhUaW1lb3V0KTsKIAlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QcHJlcU1pbkludGVydmFsKTsKKwlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsKTsKIAlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QbmV0RGlhbWV0ZXJUcmF2ZXJzYWxUaW1lKTsKIAlNRVNIUEFSQU1TX0FERChkb3QxMU1lc2hIV01QbWF4UFJFUXJldHJpZXMpOwogCU1FU0hQQVJBTVNfQUREKHBhdGhfcmVmcmVzaF90aW1lKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9kZWJ1Z2ZzX3N0YS5jIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKaW5kZXggYzVmMzQxNy4uMjQwNmIzZSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKKysrIGIvbmV0L21hYzgwMjExL2RlYnVnZnNfc3RhLmMKQEAgLTYzLDEwICs2MywxMCBAQAogCXRlc3Rfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV8jI2ZsZykgPyAjZmxnICJcbiIgOiAiIgogCiAJaW50IHJlcyA9IHNjbnByaW50ZihidWYsIHNpemVvZihidWYpLAotCQkJICAgICIlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzIiwKKwkJCSAgICAiJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMlcyVzJXMiLAogCQkJICAgIFRFU1QoQVVUSCksIFRFU1QoQVNTT0MpLCBURVNUKFBTX1NUQSksCiAJCQkgICAgVEVTVChQU19EUklWRVIpLCBURVNUKEFVVEhPUklaRUQpLAotCQkJICAgIFRFU1QoU0hPUlRfUFJFQU1CTEUpLCBURVNUKEFTU09DX0FQKSwKKwkJCSAgICBURVNUKFNIT1JUX1BSRUFNQkxFKSwKIAkJCSAgICBURVNUKFdNRSksIFRFU1QoV0RTKSwgVEVTVChDTEVBUl9QU19GSUxUKSwKIAkJCSAgICBURVNUKE1GUCksIFRFU1QoQkxPQ0tfQkEpLCBURVNUKFBTUE9MTCksCiAJCQkgICAgVEVTVChVQVBTRCksIFRFU1QoU1ApLCBURVNUKFRETFNfUEVFUiksCkBAIC0yNzQsOSArMjc0LDkgQEAKIAogCQlQUklOVF9IVF9DQVAoKGh0Yy0+Y2FwICYgQklUKDEwKSksICJIVCBEZWxheWVkIEJsb2NrIEFjayIpOwogCi0JCVBSSU5UX0hUX0NBUCgoaHRjLT5jYXAgJiBCSVQoMTEpKSwgIk1heCBBTVNEVSBsZW5ndGg6ICIKLQkJCSAgICAgIjM4MzkgYnl0ZXMiKTsKIAkJUFJJTlRfSFRfQ0FQKCEoaHRjLT5jYXAgJiBCSVQoMTEpKSwgIk1heCBBTVNEVSBsZW5ndGg6ICIKKwkJCSAgICAgIjM4MzkgYnl0ZXMiKTsKKwkJUFJJTlRfSFRfQ0FQKChodGMtPmNhcCAmIEJJVCgxMSkpLCAiTWF4IEFNU0RVIGxlbmd0aDogIgogCQkJICAgICAiNzkzNSBieXRlcyIpOwogCiAJCS8qCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oIGIvbmV0L21hYzgwMjExL2RyaXZlci1vcHMuaAppbmRleCA1ZjE2NWQ3Li5lODk2MGFlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvZHJpdmVyLW9wcy5oCisrKyBiL25ldC9tYWM4MDIxMS9kcml2ZXItb3BzLmgKQEAgLTUsMTEgKzUsMzQgQEAKICNpbmNsdWRlICJpZWVlODAyMTFfaS5oIgogI2luY2x1ZGUgImRyaXZlci10cmFjZS5oIgogCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCVdBUk5fT04oIShzZGF0YS0+ZmxhZ3MgJiBJRUVFODAyMTFfU0RBVEFfSU5fRFJJVkVSKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqCitnZXRfYnNzX3NkYXRhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKKwkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSwKKwkJCQkgICAgIHUuYXApOworCisJcmV0dXJuIHNkYXRhOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZHJ2X3R4KHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCWxvY2FsLT5vcHMtPnR4KCZsb2NhbC0+aHcsIHNrYik7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBkcnZfdHhfZnJhZ3Moc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLAorCQkJCXN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMpCit7CisJbG9jYWwtPm9wcy0+dHhfZnJhZ3MoJmxvY2FsLT5odywgdmlmLCBzdGEsIHNrYnMpOworfQorCiBzdGF0aWMgaW5saW5lIGludCBkcnZfc3RhcnQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7CiAJaW50IHJldDsKQEAgLTY5LDE1ICs5MiwyMyBAQAogI2VuZGlmCiAKIHN0YXRpYyBpbmxpbmUgaW50IGRydl9hZGRfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAlpbnQgcmV0OwogCiAJbWlnaHRfc2xlZXAoKTsKIAotCXRyYWNlX2Rydl9hZGRfaW50ZXJmYWNlKGxvY2FsLCB2aWZfdG9fc2RhdGEodmlmKSk7Ci0JcmV0ID0gbG9jYWwtPm9wcy0+YWRkX2ludGVyZmFjZSgmbG9jYWwtPmh3LCB2aWYpOworCWlmIChXQVJOX09OKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOIHx8CisJCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikpCisJCXJldHVybiAtRUlOVkFMOworCisJdHJhY2VfZHJ2X2FkZF9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKKwlyZXQgPSBsb2NhbC0+b3BzLT5hZGRfaW50ZXJmYWNlKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmKTsKIAl0cmFjZV9kcnZfcmV0dXJuX2ludChsb2NhbCwgcmV0KTsKKworCWlmIChyZXQgPT0gMCkKKwkJc2RhdGEtPmZsYWdzIHw9IElFRUU4MDIxMV9TREFUQV9JTl9EUklWRVI7CisKIAlyZXR1cm4gcmV0OwogfQogCkBAIC04OSw2ICsxMjAsOCBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAorCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKIAl0cmFjZV9kcnZfY2hhbmdlX2ludGVyZmFjZShsb2NhbCwgc2RhdGEsIHR5cGUsIHAycCk7CiAJcmV0ID0gbG9jYWwtPm9wcy0+Y2hhbmdlX2ludGVyZmFjZSgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgdHlwZSwgcDJwKTsKIAl0cmFjZV9kcnZfcmV0dXJuX2ludChsb2NhbCwgcmV0KTsKQEAgLTk2LDEyICsxMjksMTUgQEAKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGRydl9yZW1vdmVfaW50ZXJmYWNlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQorCQkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAltaWdodF9zbGVlcCgpOwogCi0JdHJhY2VfZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsIHZpZl90b19zZGF0YSh2aWYpKTsKLQlsb2NhbC0+b3BzLT5yZW1vdmVfaW50ZXJmYWNlKCZsb2NhbC0+aHcsIHZpZik7CisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKworCXRyYWNlX2Rydl9yZW1vdmVfaW50ZXJmYWNlKGxvY2FsLCBzZGF0YSk7CisJbG9jYWwtPm9wcy0+cmVtb3ZlX2ludGVyZmFjZSgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CisJc2RhdGEtPmZsYWdzICY9IH5JRUVFODAyMTFfU0RBVEFfSU5fRFJJVkVSOwogCXRyYWNlX2Rydl9yZXR1cm5fdm9pZChsb2NhbCk7CiB9CiAKQEAgLTEyNCw2ICsxNjAsOCBAQAogewogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X2Jzc19pbmZvX2NoYW5nZWQobG9jYWwsIHNkYXRhLCBpbmZvLCBjaGFuZ2VkKTsKIAlpZiAobG9jYWwtPm9wcy0+YnNzX2luZm9fY2hhbmdlZCkKIAkJbG9jYWwtPm9wcy0+YnNzX2luZm9fY2hhbmdlZCgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgaW5mbywgY2hhbmdlZCk7CkBAIC0xMzksNiArMTc3LDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X3R4X3N5bmMobG9jYWwsIHNkYXRhLCBic3NpZCwgdHlwZSk7CiAJaWYgKGxvY2FsLT5vcHMtPnR4X3N5bmMpCiAJCXJldCA9IGxvY2FsLT5vcHMtPnR4X3N5bmMoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCkBAIC0xNTQsNiArMTk0LDggQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9maW5pc2hfdHhfc3luYyhsb2NhbCwgc2RhdGEsIGJzc2lkLCB0eXBlKTsKIAlpZiAobG9jYWwtPm9wcy0+ZmluaXNoX3R4X3N5bmMpCiAJCWxvY2FsLT5vcHMtPmZpbmlzaF90eF9zeW5jKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLApAQCAtMjExLDYgKzI1Myw4IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9zZXRfa2V5KGxvY2FsLCBjbWQsIHNkYXRhLCBzdGEsIGtleSk7CiAJcmV0ID0gbG9jYWwtPm9wcy0+c2V0X2tleSgmbG9jYWwtPmh3LCBjbWQsICZzZGF0YS0+dmlmLCBzdGEsIGtleSk7CiAJdHJhY2VfZHJ2X3JldHVybl9pbnQobG9jYWwsIHJldCk7CkBAIC0yMjgsNiArMjcyLDggQEAKIAlpZiAoc3RhKQogCQlpc3RhID0gJnN0YS0+c3RhOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl91cGRhdGVfdGtpcF9rZXkobG9jYWwsIHNkYXRhLCBjb25mLCBpc3RhLCBpdjMyKTsKIAlpZiAobG9jYWwtPm9wcy0+dXBkYXRlX3RraXBfa2V5KQogCQlsb2NhbC0+b3BzLT51cGRhdGVfdGtpcF9rZXkoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIGNvbmYsCkBAIC0yNDMsNiArMjg5LDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X2h3X3NjYW4obG9jYWwsIHNkYXRhKTsKIAlyZXQgPSBsb2NhbC0+b3BzLT5od19zY2FuKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCByZXEpOwogCXRyYWNlX2Rydl9yZXR1cm5faW50KGxvY2FsLCByZXQpOwpAQCAtMjU0LDYgKzMwMiw4IEBACiB7CiAJbWlnaHRfc2xlZXAoKTsKIAorCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKIAl0cmFjZV9kcnZfY2FuY2VsX2h3X3NjYW4obG9jYWwsIHNkYXRhKTsKIAlsb2NhbC0+b3BzLT5jYW5jZWxfaHdfc2NhbigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CiAJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKQEAgLTI2OSw2ICszMTksOCBAQAogCiAJbWlnaHRfc2xlZXAoKTsKIAorCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKIAl0cmFjZV9kcnZfc2NoZWRfc2Nhbl9zdGFydChsb2NhbCwgc2RhdGEpOwogCXJldCA9IGxvY2FsLT5vcHMtPnNjaGVkX3NjYW5fc3RhcnQoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCiAJCQkJCSAgICAgIHJlcSwgaWVzKTsKQEAgLTI4MSw2ICszMzMsOCBAQAogewogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X3NjaGVkX3NjYW5fc3RvcChsb2NhbCwgc2RhdGEpOwogCWxvY2FsLT5vcHMtPnNjaGVkX3NjYW5fc3RvcCgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CiAJdHJhY2VfZHJ2X3JldHVybl92b2lkKGxvY2FsKTsKQEAgLTM3Nyw2ICs0MzEsOSBAQAogCQkJCSAgZW51bSBzdGFfbm90aWZ5X2NtZCBjbWQsCiAJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhKQogeworCXNkYXRhID0gZ2V0X2Jzc19zZGF0YShzZGF0YSk7CisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9zdGFfbm90aWZ5KGxvY2FsLCBzZGF0YSwgY21kLCBzdGEpOwogCWlmIChsb2NhbC0+b3BzLT5zdGFfbm90aWZ5KQogCQlsb2NhbC0+b3BzLT5zdGFfbm90aWZ5KCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBjbWQsIHN0YSk7CkBAIC0zOTEsNiArNDQ4LDkgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwlzZGF0YSA9IGdldF9ic3Nfc2RhdGEoc2RhdGEpOworCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKIAl0cmFjZV9kcnZfc3RhX2FkZChsb2NhbCwgc2RhdGEsIHN0YSk7CiAJaWYgKGxvY2FsLT5vcHMtPnN0YV9hZGQpCiAJCXJldCA9IGxvY2FsLT5vcHMtPnN0YV9hZGQoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsIHN0YSk7CkBAIC00MDYsNiArNDY2LDkgQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCisJc2RhdGEgPSBnZXRfYnNzX3NkYXRhKHNkYXRhKTsKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X3N0YV9yZW1vdmUobG9jYWwsIHNkYXRhLCBzdGEpOwogCWlmIChsb2NhbC0+b3BzLT5zdGFfcmVtb3ZlKQogCQlsb2NhbC0+b3BzLT5zdGFfcmVtb3ZlKCZsb2NhbC0+aHcsICZzZGF0YS0+dmlmLCBzdGEpOwpAQCAtNDIxLDYgKzQ4NCw4IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9jb25mX3R4KGxvY2FsLCBzZGF0YSwgcXVldWUsIHBhcmFtcyk7CiAJaWYgKGxvY2FsLT5vcHMtPmNvbmZfdHgpCiAJCXJldCA9IGxvY2FsLT5vcHMtPmNvbmZfdHgoJmxvY2FsLT5odywgJnNkYXRhLT52aWYsCkBAIC00MzYsNiArNTAxLDggQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X2dldF90c2YobG9jYWwsIHNkYXRhKTsKIAlpZiAobG9jYWwtPm9wcy0+Z2V0X3RzZikKIAkJcmV0ID0gbG9jYWwtPm9wcy0+Z2V0X3RzZigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CkBAIC00NDksNiArNTE2LDggQEAKIHsKIAltaWdodF9zbGVlcCgpOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9zZXRfdHNmKGxvY2FsLCBzZGF0YSwgdHNmKTsKIAlpZiAobG9jYWwtPm9wcy0+c2V0X3RzZikKIAkJbG9jYWwtPm9wcy0+c2V0X3RzZigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgdHNmKTsKQEAgLTQ2MCw2ICs1MjksOCBAQAogewogCW1pZ2h0X3NsZWVwKCk7CiAKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X3Jlc2V0X3RzZihsb2NhbCwgc2RhdGEpOwogCWlmIChsb2NhbC0+b3BzLT5yZXNldF90c2YpCiAJCWxvY2FsLT5vcHMtPnJlc2V0X3RzZigmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZik7CkBAIC00ODksNiArNTYwLDkgQEAKIAogCW1pZ2h0X3NsZWVwKCk7CiAKKwlzZGF0YSA9IGdldF9ic3Nfc2RhdGEoc2RhdGEpOworCWNoZWNrX3NkYXRhX2luX2RyaXZlcihzZGF0YSk7CisKIAl0cmFjZV9kcnZfYW1wZHVfYWN0aW9uKGxvY2FsLCBzZGF0YSwgYWN0aW9uLCBzdGEsIHRpZCwgc3NuLCBidWZfc2l6ZSk7CiAKIAlpZiAobG9jYWwtPm9wcy0+YW1wZHVfYWN0aW9uKQpAQCAtNjQ0LDYgKzcxOCw4IEBACiAKIAltaWdodF9zbGVlcCgpOwogCisJY2hlY2tfc2RhdGFfaW5fZHJpdmVyKHNkYXRhKTsKKwogCXRyYWNlX2Rydl9zZXRfYml0cmF0ZV9tYXNrKGxvY2FsLCBzZGF0YSwgbWFzayk7CiAJaWYgKGxvY2FsLT5vcHMtPnNldF9iaXRyYXRlX21hc2spCiAJCXJldCA9IGxvY2FsLT5vcHMtPnNldF9iaXRyYXRlX21hc2soJmxvY2FsLT5odywKQEAgLTY1Nyw2ICs3MzMsOCBAQAogCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAogCQkJCSAgICAgIHN0cnVjdCBjZmc4MDIxMV9ndGtfcmVrZXlfZGF0YSAqZGF0YSkKIHsKKwljaGVja19zZGF0YV9pbl9kcml2ZXIoc2RhdGEpOworCiAJdHJhY2VfZHJ2X3NldF9yZWtleV9kYXRhKGxvY2FsLCBzZGF0YSwgZGF0YSk7CiAJaWYgKGxvY2FsLT5vcHMtPnNldF9yZWtleV9kYXRhKQogCQlsb2NhbC0+b3BzLT5zZXRfcmVrZXlfZGF0YSgmbG9jYWwtPmh3LCAmc2RhdGEtPnZpZiwgZGF0YSk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvZHJpdmVyLXRyYWNlLmggYi9uZXQvbWFjODAyMTEvZHJpdmVyLXRyYWNlLmgKaW5kZXggMmFmNGZjYS4uNmU5ZGY4ZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2RyaXZlci10cmFjZS5oCisrKyBiL25ldC9tYWM4MDIxMS9kcml2ZXItdHJhY2UuaApAQCAtNSwxNyArNSw2IEBACiAjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+CiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKIAotI2lmICFkZWZpbmVkKENPTkZJR19NQUM4MDIxMV9EUklWRVJfQVBJX1RSQUNFUikgfHwgZGVmaW5lZChfX0NIRUNLRVJfXykKLSN1bmRlZiBUUkFDRV9FVkVOVAotI2RlZmluZSBUUkFDRV9FVkVOVChuYW1lLCBwcm90bywgLi4uKSBcCi1zdGF0aWMgaW5saW5lIHZvaWQgdHJhY2VfICMjIG5hbWUocHJvdG8pIHt9Ci0jdW5kZWYgREVDTEFSRV9FVkVOVF9DTEFTUwotI2RlZmluZSBERUNMQVJFX0VWRU5UX0NMQVNTKC4uLikKLSN1bmRlZiBERUZJTkVfRVZFTlQKLSNkZWZpbmUgREVGSU5FX0VWRU5UKGV2dF9jbGFzcywgbmFtZSwgcHJvdG8sIC4uLikgXAotc3RhdGljIGlubGluZSB2b2lkIHRyYWNlXyAjIyBuYW1lKHByb3RvKSB7fQotI2VuZGlmCi0KICN1bmRlZiBUUkFDRV9TWVNURU0KICNkZWZpbmUgVFJBQ0VfU1lTVEVNIG1hYzgwMjExCiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9odC5jIGIvbmV0L21hYzgwMjExL2h0LmMKaW5kZXggZjBmYjczNy4uZjI1ZmZmNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2h0LmMKKysrIGIvbmV0L21hYzgwMjExL2h0LmMKQEAgLTE5LDcgKzE5LDg0IEBACiAjaW5jbHVkZSAiaWVlZTgwMjExX2kuaCIKICNpbmNsdWRlICJyYXRlLmgiCiAKLXZvaWQgaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAorYm9vbCBpZWVlODAxMTFfY2ZnX292ZXJyaWRlX2Rpc2FibGVzX2h0NDAoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJY29uc3QgX19sZTE2IGZsZyA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKTsKKwlpZiAoKHNkYXRhLT51Lm1nZC5odF9jYXBhX21hc2suY2FwX2luZm8gJiBmbGcpICYmCisJICAgICEoc2RhdGEtPnUubWdkLmh0X2NhcGEuY2FwX2luZm8gJiBmbGcpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIF9fY2hlY2tfaHRjYXBfZGlzYWJsZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwLAorCQkJCSAgdTE2IGZsYWcpCit7CisJX19sZTE2IGxlX2ZsYWcgPSBjcHVfdG9fbGUxNihmbGFnKTsKKwlpZiAoc2RhdGEtPnUubWdkLmh0X2NhcGFfbWFzay5jYXBfaW5mbyAmIGxlX2ZsYWcpIHsKKwkJaWYgKCEoc2RhdGEtPnUubWdkLmh0X2NhcGEuY2FwX2luZm8gJiBsZV9mbGFnKSkKKwkJCWh0X2NhcC0+Y2FwICY9IH5mbGFnOworCX0KK30KKwordm9pZCBpZWVlODAyMTFfYXBwbHlfaHRjYXBfb3ZlcnJpZGVzKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwICpodF9jYXApCit7CisJdTggKnNjYXBzID0gKHU4ICopKCZzZGF0YS0+dS5tZ2QuaHRfY2FwYS5tY3MucnhfbWFzayk7CisJdTggKnNtYXNrID0gKHU4ICopKCZzZGF0YS0+dS5tZ2QuaHRfY2FwYV9tYXNrLm1jcy5yeF9tYXNrKTsKKwlpbnQgaTsKKworCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgeworCQkvKiBBUCBpbnRlcmZhY2VzIGNhbGwgdGhpcyBjb2RlIHdoZW4gYWRkaW5nIG5ldyBzdGF0aW9ucywKKwkJICogc28ganVzdCBzaWxlbnRseSBpZ25vcmUgbm9uIHN0YXRpb24gaW50ZXJmYWNlcy4KKwkJICovCisJCXJldHVybjsKKwl9CisKKwkvKiBOT1RFOiAgSWYgeW91IGFkZCBtb3JlIG92ZXItcmlkZXMgaGVyZSwgdXBkYXRlIHJlZ2lzdGVyX2h3CisJICogaHRfY2FwYV9tb2RfbXNrIGxvZ2ljIGluIG1haW4uYyBhcyB3ZWxsLgorCSAqIEFuZCwgaWYgdGhpcyBtZXRob2QgY2FuIGV2ZXIgY2hhbmdlIGh0X2NhcC5odF9zdXBwb3J0ZWQsIGZpeAorCSAqIHRoZSBjaGVjayBpbiBpZWVlODAyMTFfYWRkX2h0X2llLgorCSAqLworCisJLyogY2hlY2sgZm9yIEhUIG92ZXItcmlkZXMsIE1DUyByYXRlcyBmaXJzdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX0hUX01DU19NQVNLX0xFTjsgaSsrKSB7CisJCXU4IG0gPSBzbWFza1tpXTsKKwkJaHRfY2FwLT5tY3MucnhfbWFza1tpXSAmPSB+bTsgLyogdHVybiBvZmYgYWxsIG1hc2tlZCBiaXRzICovCisJCS8qIEFkZCBiYWNrIHJhdGVzIHRoYXQgYXJlIHN1cHBvcnRlZCAqLworCQlodF9jYXAtPm1jcy5yeF9tYXNrW2ldIHw9IChtICYgc2NhcHNbaV0pOworCX0KKworCS8qIEZvcmNlIHJlbW92YWwgb2YgSFQtNDAgY2FwYWJpbGl0aWVzPyAqLworCV9fY2hlY2tfaHRjYXBfZGlzYWJsZShzZGF0YSwgaHRfY2FwLCBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCk7CisJX19jaGVja19odGNhcF9kaXNhYmxlKHNkYXRhLCBodF9jYXAsIElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKTsKKworCS8qIEFsbG93IHVzZXIgdG8gZGlzYWJsZSB0aGUgbWF4LUFNU0RVIGJpdC4gKi8KKwlfX2NoZWNrX2h0Y2FwX2Rpc2FibGUoc2RhdGEsIGh0X2NhcCwgSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFUpOworCisJLyogQWxsb3cgdXNlciB0byBkZWNyZWFzZSBBTVBEVSBmYWN0b3IgKi8KKwlpZiAoc2RhdGEtPnUubWdkLmh0X2NhcGFfbWFzay5hbXBkdV9wYXJhbXNfaW5mbyAmCisJICAgIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUikgeworCQl1OCBuID0gc2RhdGEtPnUubWdkLmh0X2NhcGEuYW1wZHVfcGFyYW1zX2luZm8KKwkJCSYgSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fRkFDVE9SOworCQlpZiAobiA8IGh0X2NhcC0+YW1wZHVfZmFjdG9yKQorCQkJaHRfY2FwLT5hbXBkdV9mYWN0b3IgPSBuOworCX0KKworCS8qIEFsbG93IHRoZSB1c2VyIHRvIGluY3JlYXNlIEFNUERVIGRlbnNpdHkuICovCisJaWYgKHNkYXRhLT51Lm1nZC5odF9jYXBhX21hc2suYW1wZHVfcGFyYW1zX2luZm8gJgorCSAgICBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZKSB7CisJCXU4IG4gPSAoc2RhdGEtPnUubWdkLmh0X2NhcGEuYW1wZHVfcGFyYW1zX2luZm8gJgorCQkJSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWSkKKwkJCT4+IElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFlfU0hJRlQ7CisJCWlmIChuID4gaHRfY2FwLT5hbXBkdV9kZW5zaXR5KQorCQkJaHRfY2FwLT5hbXBkdV9kZW5zaXR5ID0gbjsKKwl9Cit9CisKKwordm9pZCBpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kLAogCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwX2llLAogCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCkKIHsKQEAgLTEwMyw2ICsxODAsMTIgQEAKIAkvKiBoYW5kbGUgTUNTIHJhdGUgMzIgdG9vICovCiAJaWYgKHNiYW5kLT5odF9jYXAubWNzLnJ4X21hc2tbMzIvOF0gJiBodF9jYXBfaWUtPm1jcy5yeF9tYXNrWzMyLzhdICYgMSkKIAkJaHRfY2FwLT5tY3MucnhfbWFza1szMi84XSB8PSAxOworCisJLyoKKwkgKiBJZiB1c2VyIGhhcyBzcGVjaWZpZWQgY2FwYWJpbGl0eSBvdmVyLXJpZGVzLCB0YWtlIGNhcmUKKwkgKiBvZiB0aGF0IGhlcmUuCisJICovCisJaWVlZTgwMjExX2FwcGx5X2h0Y2FwX292ZXJyaWRlcyhzZGF0YSwgaHRfY2FwKTsKIH0KIAogdm9pZCBpZWVlODAyMTFfc3RhX3RlYXJfZG93bl9CQV9zZXNzaW9ucyhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwgYm9vbCB0eCkKQEAgLTE5NiwxMCArMjc5LDEzIEBACiAJbWVtY3B5KG1nbXQtPmRhLCBkYSwgRVRIX0FMRU4pOwogCW1lbWNweShtZ210LT5zYSwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CiAJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAotCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKKwkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4gfHwKKwkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpCiAJCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CiAJZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04pCiAJCW1lbWNweShtZ210LT5ic3NpZCwgc2RhdGEtPnUubWdkLmJzc2lkLCBFVEhfQUxFTik7CisJZWxzZSBpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKQorCQltZW1jcHkobWdtdC0+YnNzaWQsIHNkYXRhLT51Lmlic3MuYnNzaWQsIEVUSF9BTEVOKTsKIAogCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CiAJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CkBAIC0yMTQsNyArMzAwLDcgQEAKIAltZ210LT51LmFjdGlvbi51LmRlbGJhLnBhcmFtcyA9IGNwdV90b19sZTE2KHBhcmFtcyk7CiAJbWdtdC0+dS5hY3Rpb24udS5kZWxiYS5yZWFzb25fY29kZSA9IGNwdV90b19sZTE2KHJlYXNvbl9jb2RlKTsKIAotCWllZWU4MDIxMV90eF9za2Ioc2RhdGEsIHNrYik7CisJaWVlZTgwMjExX3R4X3NrYl90aWQoc2RhdGEsIHNrYiwgdGlkKTsKIH0KIAogdm9pZCBpZWVlODAyMTFfcHJvY2Vzc19kZWxiYShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pYnNzLmMgYi9uZXQvbWFjODAyMTEvaWJzcy5jCmluZGV4IGVkZTlhOGIuLmY4YTMyYmYgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9pYnNzLmMKKysrIGIvbmV0L21hYzgwMjExL2lic3MuYwpAQCAtNzcsNiArNzcsNyBAQAogCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzczsKIAl1MzIgYnNzX2NoYW5nZTsKIAl1OCBzdXBwX3JhdGVzW0lFRUU4MDIxMV9NQVhfU1VQUF9SQVRFU107CisJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGU7CiAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZpZmlic3MtPm10eCk7CiAKQEAgLTk3LDYgKzk4LDcgQEAKIAkvKiBpZiBtZXJnaW5nLCBpbmRpY2F0ZSB0byBkcml2ZXIgdGhhdCB3ZSBsZWF2ZSB0aGUgb2xkIElCU1MgKi8KIAlpZiAoc2RhdGEtPnZpZi5ic3NfY29uZi5pYnNzX2pvaW5lZCkgewogCQlzZGF0YS0+dmlmLmJzc19jb25mLmlic3Nfam9pbmVkID0gZmFsc2U7CisJCW5ldGlmX2NhcnJpZXJfb2ZmKHNkYXRhLT5kZXYpOwogCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgQlNTX0NIQU5HRURfSUJTUyk7CiAJfQogCkBAIC0xMDQsOCArMTA2LDE2IEBACiAKIAlzZGF0YS0+ZHJvcF91bmVuY3J5cHRlZCA9IGNhcGFiaWxpdHkgJiBXTEFOX0NBUEFCSUxJVFlfUFJJVkFDWSA/IDEgOiAwOwogCi0JbG9jYWwtPm9wZXJfY2hhbm5lbCA9IGNoYW47Ci0JV0FSTl9PTighaWVlZTgwMjExX3NldF9jaGFubmVsX3R5cGUobG9jYWwsIHNkYXRhLCBOTDgwMjExX0NIQU5fTk9fSFQpKTsKKwljaGFubmVsX3R5cGUgPSBpZmlic3MtPmNoYW5uZWxfdHlwZTsKKwlpZiAoY2hhbm5lbF90eXBlID4gTkw4MDIxMV9DSEFOX0hUMjAgJiYKKwkgICAgIWNmZzgwMjExX2Nhbl9iZWFjb25fc2VjX2NoYW4obG9jYWwtPmh3LndpcGh5LCBjaGFuLCBjaGFubmVsX3R5cGUpKQorCQljaGFubmVsX3R5cGUgPSBOTDgwMjExX0NIQU5fSFQyMDsKKwlpZiAoIWllZWU4MDIxMV9zZXRfY2hhbm5lbF90eXBlKGxvY2FsLCBzZGF0YSwgY2hhbm5lbF90eXBlKSkgeworCQkvKiBjYW4gb25seSBmYWlsIGR1ZSB0byBIVDQwKy8tIG1pc21hdGNoICovCisJCWNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9IVDIwOworCQlXQVJOX09OKCFpZWVlODAyMTFfc2V0X2NoYW5uZWxfdHlwZShsb2NhbCwgc2RhdGEsCisJCQkJCQkgICAgTkw4MDIxMV9DSEFOX0hUMjApKTsKKwl9CiAJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpOwogCiAJc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2NoYW4tPmJhbmRdOwpAQCAtMTcxLDYgKzE4MSwxOSBAQAogCQltZW1jcHkoc2tiX3B1dChza2IsIGlmaWJzcy0+aWVfbGVuKSwKIAkJICAgICAgIGlmaWJzcy0+aWUsIGlmaWJzcy0+aWVfbGVuKTsKIAorCS8qIGFkZCBIVCBjYXBhYmlsaXR5IGFuZCBpbmZvcm1hdGlvbiBJRXMgKi8KKwlpZiAoY2hhbm5lbF90eXBlICYmIHNiYW5kLT5odF9jYXAuaHRfc3VwcG9ydGVkKSB7CisJCXBvcyA9IHNrYl9wdXQoc2tiLCA0ICsKKwkJCQkgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApICsKKwkJCQkgICBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvKSk7CisJCXBvcyA9IGllZWU4MDIxMV9pZV9idWlsZF9odF9jYXAocG9zLCAmc2JhbmQtPmh0X2NhcCwKKwkJCQkJCXNiYW5kLT5odF9jYXAuY2FwKTsKKwkJcG9zID0gaWVlZTgwMjExX2llX2J1aWxkX2h0X2luZm8ocG9zLAorCQkJCQkJICZzYmFuZC0+aHRfY2FwLAorCQkJCQkJIGNoYW4sCisJCQkJCQkgY2hhbm5lbF90eXBlKTsKKwl9CisKIAlpZiAobG9jYWwtPmh3LnF1ZXVlcyA+PSA0KSB7CiAJCXBvcyA9IHNrYl9wdXQoc2tiLCA5KTsKIAkJKnBvcysrID0gV0xBTl9FSURfVkVORE9SX1NQRUNJRklDOwpAQCAtMTk0LDYgKzIxNyw3IEBACiAJYnNzX2NoYW5nZSB8PSBCU1NfQ0hBTkdFRF9CRUFDT047CiAJYnNzX2NoYW5nZSB8PSBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRDsKIAlic3NfY2hhbmdlIHw9IEJTU19DSEFOR0VEX0JBU0lDX1JBVEVTOworCWJzc19jaGFuZ2UgfD0gQlNTX0NIQU5HRURfSFQ7CiAJYnNzX2NoYW5nZSB8PSBCU1NfQ0hBTkdFRF9JQlNTOwogCXNkYXRhLT52aWYuYnNzX2NvbmYuaWJzc19qb2luZWQgPSB0cnVlOwogCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLCBic3NfY2hhbmdlKTsKQEAgLTIwNyw2ICsyMzEsNyBAQAogCWJzcyA9IGNmZzgwMjExX2luZm9ybV9ic3NfZnJhbWUobG9jYWwtPmh3LndpcGh5LCBsb2NhbC0+aHcuY29uZi5jaGFubmVsLAogCQkJCQltZ210LCBza2ItPmxlbiwgMCwgR0ZQX0tFUk5FTCk7CiAJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOworCW5ldGlmX2NhcnJpZXJfb24oc2RhdGEtPmRldik7CiAJY2ZnODAyMTFfaWJzc19qb2luZWQoc2RhdGEtPmRldiwgaWZpYnNzLT5ic3NpZCwgR0ZQX0tFUk5FTCk7CiB9CiAKQEAgLTI1MCw2ICsyNzUsODAgQEAKIAkJCQkgIGNic3MtPnRzZik7CiB9CiAKK3N0YXRpYyBzdHJ1Y3Qgc3RhX2luZm8gKmllZWU4MDIxMV9pYnNzX2ZpbmlzaF9zdGEoc3RydWN0IHN0YV9pbmZvICpzdGEpCisJX19hY3F1aXJlcyhSQ1UpCit7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBzdGEtPnNkYXRhOworCXU4IGFkZHJbRVRIX0FMRU5dOworCisJbWVtY3B5KGFkZHIsIHN0YS0+c3RhLmFkZHIsIEVUSF9BTEVOKTsKKworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCisJd2lwaHlfZGVidWcoc2RhdGEtPmxvY2FsLT5ody53aXBoeSwKKwkJICAgICJBZGRpbmcgbmV3IElCU1Mgc3RhdGlvbiAlcE0gKGRldj0lcylcbiIsCisJCSAgICBhZGRyLCBzZGF0YS0+bmFtZSk7CisjZW5kaWYKKworCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FVVEgpOworCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FTU09DKTsKKwlzdGFfaW5mb19tb3ZlX3N0YXRlKHN0YSwgSUVFRTgwMjExX1NUQV9BVVRIT1JJWkVEKTsKKworCXJhdGVfY29udHJvbF9yYXRlX2luaXQoc3RhKTsKKworCS8qIElmIGl0IGZhaWxzLCBtYXliZSB3ZSByYWNlZCBhbm90aGVyIGluc2VydGlvbj8gKi8KKwlpZiAoc3RhX2luZm9faW5zZXJ0X3JjdShzdGEpKQorCQlyZXR1cm4gc3RhX2luZm9fZ2V0KHNkYXRhLCBhZGRyKTsKKwlyZXR1cm4gc3RhOworfQorCitzdGF0aWMgc3RydWN0IHN0YV9pbmZvICoKK2llZWU4MDIxMV9pYnNzX2FkZF9zdGEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCSAgICAgICBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICphZGRyLAorCQkgICAgICAgdTMyIHN1cHBfcmF0ZXMpCisJX19hY3F1aXJlcyhSQ1UpCit7CisJc3RydWN0IGllZWU4MDIxMV9pZl9pYnNzICppZmlic3MgPSAmc2RhdGEtPnUuaWJzczsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKKwlpbnQgYmFuZCA9IGxvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmQ7CisKKwkvKgorCSAqIFhYWDogQ29uc2lkZXIgcmVtb3ZpbmcgdGhlIGxlYXN0IHJlY2VudGx5IHVzZWQgZW50cnkgYW5kCisJICogCWFsbG93IG5ldyBvbmUgdG8gYmUgYWRkZWQuCisJICovCisJaWYgKGxvY2FsLT5udW1fc3RhID49IElFRUU4MDIxMV9JQlNTX01BWF9TVEFfRU5UUklFUykgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBObyByb29tIGZvciBhIG5ldyBJQlNTIFNUQSBlbnRyeSAlcE1cbiIsCisJCQkgICAgICAgc2RhdGEtPm5hbWUsIGFkZHIpOworCQlyY3VfcmVhZF9sb2NrKCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWlmIChpZmlic3MtPnN0YXRlID09IElFRUU4MDIxMV9JQlNTX01MTUVfU0VBUkNIKSB7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGNvbXBhcmVfZXRoZXJfYWRkcihic3NpZCwgc2RhdGEtPnUuaWJzcy5ic3NpZCkpIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdGEgPSBzdGFfaW5mb19hbGxvYyhzZGF0YSwgYWRkciwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzdGEpIHsKKwkJcmN1X3JlYWRfbG9jaygpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdGEtPmxhc3RfcnggPSBqaWZmaWVzOworCisJLyogbWFrZSBzdXJlIG1hbmRhdG9yeSByYXRlcyBhcmUgYWx3YXlzIGFkZGVkICovCisJc3RhLT5zdGEuc3VwcF9yYXRlc1tiYW5kXSA9IHN1cHBfcmF0ZXMgfAorCQkJaWVlZTgwMjExX21hbmRhdG9yeV9yYXRlcyhsb2NhbCwgYmFuZCk7CisKKwlyZXR1cm4gaWVlZTgwMjExX2lic3NfZmluaXNoX3N0YShzdGEpOworfQorCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfcnhfYnNzX2luZm8oc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQsCiAJCQkJICBzaXplX3QgbGVuLApAQCAtMjY2LDYgKzM2NSw4IEBACiAJdTY0IGJlYWNvbl90aW1lc3RhbXAsIHJ4X3RpbWVzdGFtcDsKIAl1MzIgc3VwcF9yYXRlcyA9IDA7CiAJZW51bSBpZWVlODAyMTFfYmFuZCBiYW5kID0gcnhfc3RhdHVzLT5iYW5kOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tiYW5kXTsKKwlib29sIHJhdGVzX3VwZGF0ZWQgPSBmYWxzZTsKIAogCWlmIChlbGVtcy0+ZHNfcGFyYW1zICYmIGVsZW1zLT5kc19wYXJhbXNfbGVuID09IDEpCiAJCWZyZXEgPSBpZWVlODAyMTFfY2hhbm5lbF90b19mcmVxdWVuY3koZWxlbXMtPmRzX3BhcmFtc1swXSwKQEAgLTMwNSwxNyArNDA2LDUxIEBACiAJCQkJCQlwcmV2X3JhdGVzLAogCQkJCQkJc3RhLT5zdGEuc3VwcF9yYXRlc1tiYW5kXSk7CiAjZW5kaWYKLQkJCQkJcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEpOworCQkJCQlyYXRlc191cGRhdGVkID0gdHJ1ZTsKIAkJCQl9Ci0JCQl9IGVsc2UKKwkJCX0gZWxzZSB7CisJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQkJc3RhID0gaWVlZTgwMjExX2lic3NfYWRkX3N0YShzZGF0YSwgbWdtdC0+YnNzaWQsCi0JCQkJCQltZ210LT5zYSwgc3VwcF9yYXRlcywKLQkJCQkJCUdGUF9BVE9NSUMpOworCQkJCQkJbWdtdC0+c2EsIHN1cHBfcmF0ZXMpOworCQkJfQogCQl9CiAKIAkJaWYgKHN0YSAmJiBlbGVtcy0+d21tX2luZm8pCiAJCQlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9XTUUpOwogCisJCWlmIChzdGEgJiYgZWxlbXMtPmh0X2luZm9fZWxlbSAmJiBlbGVtcy0+aHRfY2FwX2VsZW0gJiYKKwkJICAgIHNkYXRhLT51Lmlic3MuY2hhbm5lbF90eXBlICE9IE5MODAyMTFfQ0hBTl9OT19IVCkgeworCQkJLyogd2UgYm90aCB1c2UgSFQgKi8KKwkJCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCBzdGFfaHRfY2FwX25ldzsKKwkJCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlID0KKwkJCQlpZWVlODAyMTFfaHRfaW5mb190b19jaGFubmVsX3R5cGUoCisJCQkJCQkJZWxlbXMtPmh0X2luZm9fZWxlbSk7CisKKwkJCWllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzZGF0YSwgc2JhbmQsCisJCQkJCQkJICBlbGVtcy0+aHRfY2FwX2VsZW0sCisJCQkJCQkJICAmc3RhX2h0X2NhcF9uZXcpOworCisJCQkvKgorCQkJICogZmFsbCBiYWNrIHRvIEhUMjAgaWYgd2UgZG9uJ3QgdXNlIG9yIHVzZQorCQkJICogdGhlIG90aGVyIGV4dGVuc2lvbiBjaGFubmVsCisJCQkgKi8KKwkJCWlmICgoY2hhbm5lbF90eXBlID09IE5MODAyMTFfQ0hBTl9IVDQwTUlOVVMgfHwKKwkJCSAgICAgY2hhbm5lbF90eXBlID09IE5MODAyMTFfQ0hBTl9IVDQwUExVUykgJiYKKwkJCSAgICBjaGFubmVsX3R5cGUgIT0gc2RhdGEtPnUuaWJzcy5jaGFubmVsX3R5cGUpCisJCQkJc3RhX2h0X2NhcF9uZXcuY2FwICY9CisJCQkJCX5JRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MDsKKworCQkJaWYgKG1lbWNtcCgmc3RhLT5zdGEuaHRfY2FwLCAmc3RhX2h0X2NhcF9uZXcsCisJCQkJICAgc2l6ZW9mKHN0YV9odF9jYXBfbmV3KSkpIHsKKwkJCQltZW1jcHkoJnN0YS0+c3RhLmh0X2NhcCwgJnN0YV9odF9jYXBfbmV3LAorCQkJCSAgICAgICBzaXplb2Yoc3RhX2h0X2NhcF9uZXcpKTsKKwkJCQlyYXRlc191cGRhdGVkID0gdHJ1ZTsKKwkJCX0KKwkJfQorCisJCWlmIChzdGEgJiYgcmF0ZXNfdXBkYXRlZCkKKwkJCXJhdGVfY29udHJvbF9yYXRlX2luaXQoc3RhKTsKKwogCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKQEAgLTQwNCwyMSArNTM5LDE3IEBACiAJCWllZWU4MDIxMV9zdGFfam9pbl9pYnNzKHNkYXRhLCBic3MpOwogCQlzdXBwX3JhdGVzID0gaWVlZTgwMjExX3N0YV9nZXRfcmF0ZXMobG9jYWwsIGVsZW1zLCBiYW5kKTsKIAkJaWVlZTgwMjExX2lic3NfYWRkX3N0YShzZGF0YSwgbWdtdC0+YnNzaWQsIG1nbXQtPnNhLAotCQkJCSAgICAgICBzdXBwX3JhdGVzLCBHRlBfS0VSTkVMKTsKKwkJCQkgICAgICAgc3VwcF9yYXRlcyk7CisJCXJjdV9yZWFkX3VubG9jaygpOwogCX0KIAogIHB1dF9ic3M6CiAJaWVlZTgwMjExX3J4X2Jzc19wdXQobG9jYWwsIGJzcyk7CiB9CiAKLS8qCi0gKiBBZGQgYSBuZXcgSUJTUyBzdGF0aW9uLCB3aWxsIGFsc28gYmUgY2FsbGVkIGJ5IHRoZSBSWCBjb2RlIHdoZW4sCi0gKiBpbiBJQlNTIG1vZGUsIHJlY2VpdmluZyBhIGZyYW1lIGZyb20gYSB5ZXQtdW5rbm93biBzdGF0aW9uLCBoZW5jZQotICogbXVzdCBiZSBjYWxsYWJsZSBpbiBhdG9taWMgY29udGV4dC4KLSAqLwotc3RydWN0IHN0YV9pbmZvICppZWVlODAyMTFfaWJzc19hZGRfc3RhKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCQl1OCAqYnNzaWQsIHU4ICphZGRyLCB1MzIgc3VwcF9yYXRlcywKLQkJCQkJZ2ZwX3QgZ2ZwKQordm9pZCBpZWVlODAyMTFfaWJzc19yeF9ub19zdGEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkgICAgICBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICphZGRyLAorCQkJICAgICAgdTMyIHN1cHBfcmF0ZXMpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9pYnNzICppZmlic3MgPSAmc2RhdGEtPnUuaWJzczsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKQEAgLTQzMywzNyArNTY0LDI5IEBACiAJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IE5vIHJvb20gZm9yIGEgbmV3IElCU1MgU1RBIGVudHJ5ICVwTVxuIiwKIAkJCSAgICAgICBzZGF0YS0+bmFtZSwgYWRkcik7Ci0JCXJldHVybiBOVUxMOworCQlyZXR1cm47CiAJfQogCiAJaWYgKGlmaWJzcy0+c3RhdGUgPT0gSUVFRTgwMjExX0lCU1NfTUxNRV9TRUFSQ0gpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm47CiAKIAlpZiAoY29tcGFyZV9ldGhlcl9hZGRyKGJzc2lkLCBzZGF0YS0+dS5pYnNzLmJzc2lkKSkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybjsKIAotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCi0Jd2lwaHlfZGVidWcobG9jYWwtPmh3LndpcGh5LCAiQWRkaW5nIG5ldyBJQlNTIHN0YXRpb24gJXBNIChkZXY9JXMpXG4iLAotCQkgICAgYWRkciwgc2RhdGEtPm5hbWUpOwotI2VuZGlmCi0KLQlzdGEgPSBzdGFfaW5mb19hbGxvYyhzZGF0YSwgYWRkciwgZ2ZwKTsKKwlzdGEgPSBzdGFfaW5mb19hbGxvYyhzZGF0YSwgYWRkciwgR0ZQX0FUT01JQyk7CiAJaWYgKCFzdGEpCi0JCXJldHVybiBOVUxMOworCQlyZXR1cm47CiAKIAlzdGEtPmxhc3RfcnggPSBqaWZmaWVzOwotCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEhPUklaRUQpOwogCiAJLyogbWFrZSBzdXJlIG1hbmRhdG9yeSByYXRlcyBhcmUgYWx3YXlzIGFkZGVkICovCiAJc3RhLT5zdGEuc3VwcF9yYXRlc1tiYW5kXSA9IHN1cHBfcmF0ZXMgfAogCQkJaWVlZTgwMjExX21hbmRhdG9yeV9yYXRlcyhsb2NhbCwgYmFuZCk7CiAKLQlyYXRlX2NvbnRyb2xfcmF0ZV9pbml0KHN0YSk7Ci0KLQkvKiBJZiBpdCBmYWlscywgbWF5YmUgd2UgcmFjZWQgYW5vdGhlciBpbnNlcnRpb24/ICovCi0JaWYgKHN0YV9pbmZvX2luc2VydChzdGEpKQotCQlyZXR1cm4gc3RhX2luZm9fZ2V0KHNkYXRhLCBhZGRyKTsKLQlyZXR1cm4gc3RhOworCXNwaW5fbG9jaygmaWZpYnNzLT5pbmNvbXBsZXRlX2xvY2spOworCWxpc3RfYWRkKCZzdGEtPmxpc3QsICZpZmlic3MtPmluY29tcGxldGVfc3RhdGlvbnMpOworCXNwaW5fdW5sb2NrKCZpZmlic3MtPmluY29tcGxldGVfbG9jayk7CisJaWVlZTgwMjExX3F1ZXVlX3dvcmsoJmxvY2FsLT5odywgJnNkYXRhLT53b3JrKTsKIH0KIAogc3RhdGljIGludCBpZWVlODAyMTFfc3RhX2FjdGl2ZV9pYnNzKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQpAQCAtODAyLDYgKzkyNSw3IEBACiB2b2lkIGllZWU4MDIxMV9pYnNzX3dvcmsoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9pYnNzICppZmlic3MgPSAmc2RhdGEtPnUuaWJzczsKKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAogCW11dGV4X2xvY2soJmlmaWJzcy0+bXR4KTsKIApAQCAtODEzLDYgKzkzNywxOSBAQAogCWlmICghaWZpYnNzLT5zc2lkX2xlbikKIAkJZ290byBvdXQ7CiAKKwlzcGluX2xvY2tfYmgoJmlmaWJzcy0+aW5jb21wbGV0ZV9sb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmlmaWJzcy0+aW5jb21wbGV0ZV9zdGF0aW9ucykpIHsKKwkJc3RhID0gbGlzdF9maXJzdF9lbnRyeSgmaWZpYnNzLT5pbmNvbXBsZXRlX3N0YXRpb25zLAorCQkJCSAgICAgICBzdHJ1Y3Qgc3RhX2luZm8sIGxpc3QpOworCQlsaXN0X2RlbCgmc3RhLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlmaWJzcy0+aW5jb21wbGV0ZV9sb2NrKTsKKworCQlpZWVlODAyMTFfaWJzc19maW5pc2hfc3RhKHN0YSk7CisJCXJjdV9yZWFkX3VubG9jaygpOworCQlzcGluX2xvY2tfYmgoJmlmaWJzcy0+aW5jb21wbGV0ZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmlmaWJzcy0+aW5jb21wbGV0ZV9sb2NrKTsKKwogCXN3aXRjaCAoaWZpYnNzLT5zdGF0ZSkgewogCWNhc2UgSUVFRTgwMjExX0lCU1NfTUxNRV9TRUFSQ0g6CiAJCWllZWU4MDIxMV9zdGFfZmluZF9pYnNzKHNkYXRhKTsKQEAgLTg3MSw2ICsxMDA4LDggQEAKIAlzZXR1cF90aW1lcigmaWZpYnNzLT50aW1lciwgaWVlZTgwMjExX2lic3NfdGltZXIsCiAJCSAgICAodW5zaWduZWQgbG9uZykgc2RhdGEpOwogCW11dGV4X2luaXQoJmlmaWJzcy0+bXR4KTsKKwlJTklUX0xJU1RfSEVBRCgmaWZpYnNzLT5pbmNvbXBsZXRlX3N0YXRpb25zKTsKKwlzcGluX2xvY2tfaW5pdCgmaWZpYnNzLT5pbmNvbXBsZXRlX2xvY2spOwogfQogCiAvKiBzY2FuIGZpbmlzaGVkIG5vdGlmaWNhdGlvbiAqLwpAQCAtODk0LDEyICsxMDMzLDE4IEBACiAJCQlzdHJ1Y3QgY2ZnODAyMTFfaWJzc19wYXJhbXMgKnBhcmFtcykKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXUzMiBjaGFuZ2VkID0gMDsKIAogCXNrYiA9IGRldl9hbGxvY19za2Ioc2RhdGEtPmxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArCi0JCQkgICAgMzYgLyogYml0cmF0ZXMgKi8gKwotCQkJICAgIDM0IC8qIFNTSUQgKi8gKwotCQkJICAgIDMgIC8qIERTIHBhcmFtcyAqLyArCi0JCQkgICAgNCAgLyogSUJTUyBwYXJhbXMgKi8gKworCQkJICAgIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2hkcl8zYWRkcikgKworCQkJICAgIDEyIC8qIHN0cnVjdCBpZWVlODAyMTFfbWdtdC51LmJlYWNvbiAqLyArCisJCQkgICAgMiArIElFRUU4MDIxMV9NQVhfU1NJRF9MRU4gLyogbWF4IFNTSUQgKi8gKworCQkJICAgIDIgKyA4IC8qIG1heCBTdXBwb3J0ZWQgUmF0ZXMgKi8gKworCQkJICAgIDMgLyogbWF4IERTIHBhcmFtcyAqLyArCisJCQkgICAgNCAvKiBJQlNTIHBhcmFtcyAqLyArCisJCQkgICAgMiArIChJRUVFODAyMTFfTUFYX1NVUFBfUkFURVMgLSA4KSArCisJCQkgICAgMiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkgKworCQkJICAgIDIgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvKSArCiAJCQkgICAgcGFyYW1zLT5pZV9sZW4pOwogCWlmICghc2tiKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTkyMCwxMyArMTA2NSwxOCBAQAogCXNkYXRhLT52aWYuYnNzX2NvbmYuYmVhY29uX2ludCA9IHBhcmFtcy0+YmVhY29uX2ludGVydmFsOwogCiAJc2RhdGEtPnUuaWJzcy5jaGFubmVsID0gcGFyYW1zLT5jaGFubmVsOworCXNkYXRhLT51Lmlic3MuY2hhbm5lbF90eXBlID0gcGFyYW1zLT5jaGFubmVsX3R5cGU7CiAJc2RhdGEtPnUuaWJzcy5maXhlZF9jaGFubmVsID0gcGFyYW1zLT5jaGFubmVsX2ZpeGVkOwogCiAJLyogZml4IG91cnNlbHZlcyB0byB0aGF0IGNoYW5uZWwgbm93IGFscmVhZHkgKi8KIAlpZiAocGFyYW1zLT5jaGFubmVsX2ZpeGVkKSB7CiAJCXNkYXRhLT5sb2NhbC0+b3Blcl9jaGFubmVsID0gcGFyYW1zLT5jaGFubmVsOwotCQlXQVJOX09OKCFpZWVlODAyMTFfc2V0X2NoYW5uZWxfdHlwZShzZGF0YS0+bG9jYWwsIHNkYXRhLAotCQkJCQkJICAgIE5MODAyMTFfQ0hBTl9OT19IVCkpOworCQlpZiAoIWllZWU4MDIxMV9zZXRfY2hhbm5lbF90eXBlKHNkYXRhLT5sb2NhbCwgc2RhdGEsCisJCQkJCSAgICAgICBwYXJhbXMtPmNoYW5uZWxfdHlwZSkpIHsKKwkJCW11dGV4X3VubG9jaygmc2RhdGEtPnUuaWJzcy5tdHgpOworCQkJa2ZyZWVfc2tiKHNrYik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQogCX0KIAogCWlmIChwYXJhbXMtPmllKSB7CkBAIC05NDksNiArMTA5OSwyMyBAQAogCWllZWU4MDIxMV9yZWNhbGNfaWRsZShzZGF0YS0+bG9jYWwpOwogCW11dGV4X3VubG9jaygmc2RhdGEtPmxvY2FsLT5tdHgpOwogCisJLyoKKwkgKiA4MDIuMTFuLTIwMDkgOS4xMy4zLjE6IEluIGFuIElCU1MsIHRoZSBIVCBQcm90ZWN0aW9uIGZpZWxkIGlzCisJICogcmVzZXJ2ZWQsIGJ1dCBhbiBIVCBTVEEgc2hhbGwgcHJvdGVjdCBIVCB0cmFuc21pc3Npb25zIGFzIHRob3VnaAorCSAqIHRoZSBIVCBQcm90ZWN0aW9uIGZpZWxkIHdlcmUgc2V0IHRvIG5vbi1IVCBtaXhlZCBtb2RlLgorCSAqCisJICogSW4gYW4gSUJTUywgdGhlIFJJRlMgTW9kZSBmaWVsZCBvZiB0aGUgSFQgT3BlcmF0aW9uIGVsZW1lbnQgaXMKKwkgKiBhbHNvIHJlc2VydmVkLCBidXQgYW4gSFQgU1RBIHNoYWxsIG9wZXJhdGUgYXMgdGhvdWdoIHRoaXMgZmllbGQKKwkgKiB3ZXJlIHNldCB0byAxLgorCSAqLworCisJc2RhdGEtPnZpZi5ic3NfY29uZi5odF9vcGVyYXRpb25fbW9kZSB8PQorCQkgIElFRUU4MDIxMV9IVF9PUF9NT0RFX1BST1RFQ1RJT05fTk9OSFRfTUlYRUQKKwkJfCBJRUVFODAyMTFfSFRfUEFSQU1fUklGU19NT0RFOworCisJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9IVDsKKwlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgY2hhbmdlZCk7CisKIAlpZWVlODAyMTFfcXVldWVfd29yaygmc2RhdGEtPmxvY2FsLT5odywgJnNkYXRhLT53b3JrKTsKIAogCXJldHVybiAwOwpAQCAtOTYyLDYgKzExMjksNyBAQAogCXN0cnVjdCBjZmc4MDIxMV9ic3MgKmNic3M7CiAJdTE2IGNhcGFiaWxpdHk7CiAJaW50IGFjdGl2ZV9pYnNzOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCiAJbXV0ZXhfbG9jaygmc2RhdGEtPnUuaWJzcy5tdHgpOwogCkBAIC05OTEsNiArMTE1OSwyMCBAQAogCiAJc3RhX2luZm9fZmx1c2goc2RhdGEtPmxvY2FsLCBzZGF0YSk7CiAKKwlzcGluX2xvY2tfYmgoJmlmaWJzcy0+aW5jb21wbGV0ZV9sb2NrKTsKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmlmaWJzcy0+aW5jb21wbGV0ZV9zdGF0aW9ucykpIHsKKwkJc3RhID0gbGlzdF9maXJzdF9lbnRyeSgmaWZpYnNzLT5pbmNvbXBsZXRlX3N0YXRpb25zLAorCQkJCSAgICAgICBzdHJ1Y3Qgc3RhX2luZm8sIGxpc3QpOworCQlsaXN0X2RlbCgmc3RhLT5saXN0KTsKKwkJc3Bpbl91bmxvY2tfYmgoJmlmaWJzcy0+aW5jb21wbGV0ZV9sb2NrKTsKKworCQlzdGFfaW5mb19mcmVlKGxvY2FsLCBzdGEpOworCQlzcGluX2xvY2tfYmgoJmlmaWJzcy0+aW5jb21wbGV0ZV9sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2tfYmgoJmlmaWJzcy0+aW5jb21wbGV0ZV9sb2NrKTsKKworCW5ldGlmX2NhcnJpZXJfb2ZmKHNkYXRhLT5kZXYpOworCiAJLyogcmVtb3ZlIGJlYWNvbiAqLwogCWtmcmVlKHNkYXRhLT51Lmlic3MuaWUpOwogCXNrYiA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoc2RhdGEtPnUuaWJzcy5wcmVzcCwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oIGIvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKaW5kZXggZWExMGE1MS4uMmYwNjQyZCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKKysrIGIvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbGVkcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPG5ldC9pZWVlODAyMTFfcmFkaW90YXAuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvbWFjODAyMTEuaD4KQEAgLTE0MSw2ICsxNDIsNyBAQAogCiBzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgewogCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBza2JzOwogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwpAQCAtMTg0LDEyICsxODYsMTUgQEAKICAqIGVudW0gaWVlZTgwMjExX3J4X2ZsYWdzIC0gUlggZGF0YSBmbGFncwogICoKICAqIEBJRUVFODAyMTFfUlhfQ01OVFI6IHJlY2VpdmVkIG9uIGNvb2tlZCBtb25pdG9yIGFscmVhZHkKKyAqIEBJRUVFODAyMTFfUlhfQkVBQ09OX1JFUE9SVEVEOiBUaGlzIGZyYW1lIHdhcyBhbHJlYWR5IHJlcG9ydGVkCisgKgl0byBjZmc4MDIxMV9yZXBvcnRfb2Jzc19iZWFjb24oKS4KICAqCiAgKiBUaGVzZSBmbGFncyBhcmUgdXNlZCBhY3Jvc3MgaGFuZGxpbmcgbXVsdGlwbGUgaW50ZXJmYWNlcwogICogZm9yIGEgc2luZ2xlIGZyYW1lLgogICovCiBlbnVtIGllZWU4MDIxMV9yeF9mbGFncyB7CiAJSUVFRTgwMjExX1JYX0NNTlRSCQk9IEJJVCgwKSwKKwlJRUVFODAyMTFfUlhfQkVBQ09OX1JFUE9SVEVECT0gQklUKDEpLAogfTsKIAogc3RydWN0IGllZWU4MDIxMV9yeF9kYXRhIHsKQEAgLTIyOCw2ICsyMzMsNyBAQAogCiBzdHJ1Y3QgaWVlZTgwMjExX2lmX2FwIHsKIAlzdHJ1Y3QgYmVhY29uX2RhdGEgX19yY3UgKmJlYWNvbjsKKwlzdHJ1Y3Qgc2tfYnVmZiBfX3JjdSAqcHJvYmVfcmVzcDsKIAogCXN0cnVjdCBsaXN0X2hlYWQgdmxhbnM7CiAKQEAgLTIzNyw2ICsyNDMsNyBAQAogCXU4IHRpbVtzaXplb2YodW5zaWduZWQgbG9uZykgKiBCSVRTX1RPX0xPTkdTKElFRUU4MDIxMV9NQVhfQUlEICsgMSldOwogCXN0cnVjdCBza19idWZmX2hlYWQgcHNfYmNfYnVmOwogCWF0b21pY190IG51bV9zdGFfcHM7IC8qIG51bWJlciBvZiBzdGF0aW9ucyBpbiBQUyBtb2RlICovCisJYXRvbWljX3QgbnVtX3N0YV9hdXRob3JpemVkOyAvKiBudW1iZXIgb2YgYXV0aG9yaXplZCBzdGF0aW9ucyAqLwogCWludCBkdGltX2NvdW50OwogCWJvb2wgZHRpbV9iY19tYzsKIH07CkBAIC00NDMsNiArNDUwLDkgQEAKIAkgKi8KIAlpbnQgcnNzaV9taW5fdGhvbGQsIHJzc2lfbWF4X3Rob2xkOwogCWludCBsYXN0X2F2ZV9iZWFjb25fc2lnbmFsOworCisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgaHRfY2FwYTsgLyogY29uZmlndXJlZCBodC1jYXAgb3Zlci1yaWRlcyAqLworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwIGh0X2NhcGFfbWFzazsgLyogVmFsaWQgcGFydHMgb2YgaHRfY2FwYSAqLwogfTsKIAogc3RydWN0IGllZWU4MDIxMV9pZl9pYnNzIHsKQEAgLTQ2NSwxMiArNDc1LDE2IEBACiAJdTggc3NpZF9sZW4sIGllX2xlbjsKIAl1OCAqaWU7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsOworCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlOwogCiAJdW5zaWduZWQgbG9uZyBpYnNzX2pvaW5fcmVxOwogCS8qIHByb2JlIHJlc3BvbnNlL2JlYWNvbiBmb3IgSUJTUyAqLwogCXN0cnVjdCBza19idWZmIF9fcmN1ICpwcmVzcDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCisJc3BpbmxvY2tfdCBpbmNvbXBsZXRlX2xvY2s7CisJc3RydWN0IGxpc3RfaGVhZCBpbmNvbXBsZXRlX3N0YXRpb25zOworCiAJZW51bSB7CiAJCUlFRUU4MDIxMV9JQlNTX01MTUVfU0VBUkNILAogCQlJRUVFODAyMTFfSUJTU19NTE1FX0pPSU5FRCwKQEAgLTUwNSw3ICs1MTksOSBAQAogCWF0b21pY190IG1wYXRoczsKIAkvKiBUaW1lc3RhbXAgb2YgbGFzdCBTTiB1cGRhdGUgKi8KIAl1bnNpZ25lZCBsb25nIGxhc3Rfc25fdXBkYXRlOwotCS8qIFRpbWVzdGFtcCBvZiBsYXN0IFNOIHNlbnQgKi8KKwkvKiBUaW1lIHdoZW4gaXQncyBvayB0byBzZW5kIG5leHQgUEVSUiAqLworCXVuc2lnbmVkIGxvbmcgbmV4dF9wZXJyOworCS8qIFRpbWVzdGFtcCBvZiBsYXN0IFBSRVEgc2VudCAqLwogCXVuc2lnbmVkIGxvbmcgbGFzdF9wcmVxOwogCXN0cnVjdCBtZXNoX3JtYyAqcm1jOwogCXNwaW5sb2NrX3QgbWVzaF9wcmVxX3F1ZXVlX2xvY2s7CkBAIC01NDMsNiArNTU5LDcgQEAKICAqCWFzc29jaWF0ZWQgc3RhdGlvbnMgYW5kIGRlbGl2ZXIgbXVsdGljYXN0IGZyYW1lcyBib3RoCiAgKgliYWNrIHRvIHdpcmVsZXNzIG1lZGlhIGFuZCB0byB0aGUgbG9jYWwgbmV0IHN0YWNrLgogICogQElFRUU4MDIxMV9TREFUQV9ESVNDT05ORUNUX1JFU1VNRTogRGlzY29ubmVjdCBhZnRlciByZXN1bWUuCisgKiBASUVFRTgwMjExX1NEQVRBX0lOX0RSSVZFUjogaW5kaWNhdGVzIGludGVyZmFjZSB3YXMgYWRkZWQgdG8gZHJpdmVyCiAgKi8KIGVudW0gaWVlZTgwMjExX3N1Yl9pZl9kYXRhX2ZsYWdzIHsKIAlJRUVFODAyMTFfU0RBVEFfQUxMTVVMVEkJCT0gQklUKDApLApAQCAtNTUwLDYgKzU2Nyw3IEBACiAJSUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERQkJPSBCSVQoMiksCiAJSUVFRTgwMjExX1NEQVRBX0RPTlRfQlJJREdFX1BBQ0tFVFMJPSBCSVQoMyksCiAJSUVFRTgwMjExX1NEQVRBX0RJU0NPTk5FQ1RfUkVTVU1FCT0gQklUKDQpLAorCUlFRUU4MDIxMV9TREFUQV9JTl9EUklWRVIJCT0gQklUKDUpLAogfTsKIAogLyoqCkBAIC02MDAsNiArNjE4LDkgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2ZyYWdtZW50X2VudHJ5CWZyYWdtZW50c1tJRUVFODAyMTFfRlJBR01FTlRfTUFYXTsKIAl1bnNpZ25lZCBpbnQgZnJhZ21lbnRfbmV4dDsKIAorCS8qIFRJRCBiaXRtYXAgZm9yIE5vQWNrIHBvbGljeSAqLworCXUxNiBub2Fja19tYXA7CisKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSBfX3JjdSAqa2V5c1tOVU1fREVGQVVMVF9LRVlTICsgTlVNX0RFRkFVTFRfTUdNVF9LRVlTXTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSBfX3JjdSAqZGVmYXVsdF91bmljYXN0X2tleTsKIAlzdHJ1Y3QgaWVlZTgwMjExX2tleSBfX3JjdSAqZGVmYXVsdF9tdWx0aWNhc3Rfa2V5OwpAQCAtNzIyLDE3ICs3NDMsMTYgQEAKICAqCW9wZXJhdGluZyBjaGFubmVsCiAgKiBAU0NBTl9TRVRfQ0hBTk5FTDogU2V0IHRoZSBuZXh0IGNoYW5uZWwgdG8gYmUgc2Nhbm5lZAogICogQFNDQU5fU0VORF9QUk9CRTogU2VuZCBwcm9iZSByZXF1ZXN0cyBhbmQgd2FpdCBmb3IgcHJvYmUgcmVzcG9uc2VzCi0gKiBAU0NBTl9MRUFWRV9PUEVSX0NIQU5ORUw6IExlYXZlIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCwgbm90aWZ5IHRoZSBBUAotICoJYWJvdXQgdXMgbGVhdmluZyB0aGUgY2hhbm5lbCBhbmQgc3RvcCBhbGwgYXNzb2NpYXRlZCBTVEEgaW50ZXJmYWNlcwotICogQFNDQU5fRU5URVJfT1BFUl9DSEFOTkVMOiBFbnRlciB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgYWdhaW4sIG5vdGlmeSB0aGUKLSAqCUFQIGFib3V0IHVzIGJlaW5nIGJhY2sgYW5kIHJlc3RhcnQgYWxsIGFzc29jaWF0ZWQgU1RBIGludGVyZmFjZXMKKyAqIEBTQ0FOX1NVU1BFTkQ6IFN1c3BlbmQgdGhlIHNjYW4gYW5kIGdvIGJhY2sgdG8gb3BlcmF0aW5nIGNoYW5uZWwgdG8KKyAqCXNlbmQgb3V0IGRhdGEKKyAqIEBTQ0FOX1JFU1VNRTogUmVzdW1lIHRoZSBzY2FuIGFuZCBzY2FuIHRoZSBuZXh0IGNoYW5uZWwKICAqLwogZW51bSBtYWM4MDIxMV9zY2FuX3N0YXRlIHsKIAlTQ0FOX0RFQ0lTSU9OLAogCVNDQU5fU0VUX0NIQU5ORUwsCiAJU0NBTl9TRU5EX1BST0JFLAotCVNDQU5fTEVBVkVfT1BFUl9DSEFOTkVMLAotCVNDQU5fRU5URVJfT1BFUl9DSEFOTkVMLAorCVNDQU5fU1VTUEVORCwKKwlTQ0FOX1JFU1VNRSwKIH07CiAKIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgewpAQCAtODM1LDE4ICs4NTUsMTUgQEAKIAogCS8qIFN0YXRpb24gZGF0YSAqLwogCS8qCi0JICogVGhlIG11dGV4IG9ubHkgcHJvdGVjdHMgdGhlIGxpc3QgYW5kIGNvdW50ZXIsCi0JICogcmVhZHMgYXJlIGRvbmUgaW4gUkNVLgotCSAqIEFkZGl0aW9uYWxseSwgdGhlIGxvY2sgcHJvdGVjdHMgdGhlIGhhc2ggdGFibGUsCi0JICogdGhlIHBlbmRpbmcgbGlzdCBhbmQgZWFjaCBCU1MncyBUSU0gYml0bWFwLgorCSAqIFRoZSBtdXRleCBvbmx5IHByb3RlY3RzIHRoZSBsaXN0LCBoYXNoIHRhYmxlIGFuZAorCSAqIGNvdW50ZXIsIHJlYWRzIGFyZSBkb25lIHdpdGggUkNVLgogCSAqLwogCXN0cnVjdCBtdXRleCBzdGFfbXR4OwotCXNwaW5sb2NrX3Qgc3RhX2xvY2s7CisJc3BpbmxvY2tfdCB0aW1fbG9jazsKIAl1bnNpZ25lZCBsb25nIG51bV9zdGE7Ci0Jc3RydWN0IGxpc3RfaGVhZCBzdGFfbGlzdCwgc3RhX3BlbmRpbmdfbGlzdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0YV9saXN0OwogCXN0cnVjdCBzdGFfaW5mbyBfX3JjdSAqc3RhX2hhc2hbU1RBX0hBU0hfU0laRV07CiAJc3RydWN0IHRpbWVyX2xpc3Qgc3RhX2NsZWFudXA7Ci0Jc3RydWN0IHdvcmtfc3RydWN0IHN0YV9maW5pc2hfd29yazsKIAlpbnQgc3RhX2dlbmVyYXRpb247CiAKIAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHBlbmRpbmdbSUVFRTgwMjExX01BWF9RVUVVRVNdOwpAQCAtOTUxLDcgKzk2OCw2IEBACiAJaW50IHRvdGFsX3BzX2J1ZmZlcmVkOyAvKiB0b3RhbCBudW1iZXIgb2YgYWxsIGJ1ZmZlcmVkIHVuaWNhc3QgYW5kCiAJCQkJKiBtdWx0aWNhc3QgcGFja2V0cyBmb3IgcG93ZXIgc2F2aW5nIHN0YXRpb25zCiAJCQkJKi8KLQlpbnQgd2lmaV93bWVfbm9hY2tfdGVzdDsKIAl1bnNpZ25lZCBpbnQgd21tX2FjbTsgLyogYml0IGZpZWxkIG9mIEFDTSBiaXRzIChCSVQoODAyLjFEIHRhZykpICovCiAKIAkvKgpAQCAtMTAxMiw2ICsxMDI4LDkgQEAKIAl1MzIgaHdfcm9jX2Nvb2tpZTsKIAlib29sIGh3X3JvY19mb3JfdHg7CiAKKwlzdHJ1Y3QgaWRyIGFja19zdGF0dXNfZnJhbWVzOworCXNwaW5sb2NrX3QgYWNrX3N0YXR1c19sb2NrOworCiAJLyogZHVtbXkgbmV0ZGV2IGZvciB1c2Ugdy8gTkFQSSAqLwogCXN0cnVjdCBuZXRfZGV2aWNlIG5hcGlfZGV2OwogCkBAIC0xMDMwLDYgKzEwNDksNjkgQEAKIAl1MTYgdGlkOwogfTsKIAorLyogUGFyc2VkIEluZm9ybWF0aW9uIEVsZW1lbnRzICovCitzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyB7CisJdTggKmllX3N0YXJ0OworCXNpemVfdCB0b3RhbF9sZW47CisKKwkvKiBwb2ludGVycyB0byBJRXMgKi8KKwl1OCAqc3NpZDsKKwl1OCAqc3VwcF9yYXRlczsKKwl1OCAqZmhfcGFyYW1zOworCXU4ICpkc19wYXJhbXM7CisJdTggKmNmX3BhcmFtczsKKwlzdHJ1Y3QgaWVlZTgwMjExX3RpbV9pZSAqdGltOworCXU4ICppYnNzX3BhcmFtczsKKwl1OCAqY2hhbGxlbmdlOworCXU4ICp3cGE7CisJdTggKnJzbjsKKwl1OCAqZXJwX2luZm87CisJdTggKmV4dF9zdXBwX3JhdGVzOworCXU4ICp3bW1faW5mbzsKKwl1OCAqd21tX3BhcmFtOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBfZWxlbTsKKwlzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKmh0X2luZm9fZWxlbTsKKwlzdHJ1Y3QgaWVlZTgwMjExX21lc2hjb25mX2llICptZXNoX2NvbmZpZzsKKwl1OCAqbWVzaF9pZDsKKwl1OCAqcGVlcmluZzsKKwl1OCAqcHJlcTsKKwl1OCAqcHJlcDsKKwl1OCAqcGVycjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3Jhbm5faWUgKnJhbm47CisJdTggKmNoX3N3aXRjaF9lbGVtOworCXU4ICpjb3VudHJ5X2VsZW07CisJdTggKnB3cl9jb25zdHJfZWxlbTsKKwl1OCAqcXVpZXRfZWxlbTsJLyogZmlyc3QgcXVpdGUgZWxlbWVudCAqLworCXU4ICp0aW1lb3V0X2ludDsKKworCS8qIGxlbmd0aCBvZiB0aGVtLCByZXNwZWN0aXZlbHkgKi8KKwl1OCBzc2lkX2xlbjsKKwl1OCBzdXBwX3JhdGVzX2xlbjsKKwl1OCBmaF9wYXJhbXNfbGVuOworCXU4IGRzX3BhcmFtc19sZW47CisJdTggY2ZfcGFyYW1zX2xlbjsKKwl1OCB0aW1fbGVuOworCXU4IGlic3NfcGFyYW1zX2xlbjsKKwl1OCBjaGFsbGVuZ2VfbGVuOworCXU4IHdwYV9sZW47CisJdTggcnNuX2xlbjsKKwl1OCBlcnBfaW5mb19sZW47CisJdTggZXh0X3N1cHBfcmF0ZXNfbGVuOworCXU4IHdtbV9pbmZvX2xlbjsKKwl1OCB3bW1fcGFyYW1fbGVuOworCXU4IG1lc2hfaWRfbGVuOworCXU4IHBlZXJpbmdfbGVuOworCXU4IHByZXFfbGVuOworCXU4IHByZXBfbGVuOworCXU4IHBlcnJfbGVuOworCXU4IGNoX3N3aXRjaF9lbGVtX2xlbjsKKwl1OCBjb3VudHJ5X2VsZW1fbGVuOworCXU4IHB3cl9jb25zdHJfZWxlbV9sZW47CisJdTggcXVpZXRfZWxlbV9sZW47CisJdTggbnVtX29mX3F1aWV0X2VsZW07CS8qIGNhbiBiZSBtb3JlIHRoZSBvbmUgKi8KKwl1OCB0aW1lb3V0X2ludF9sZW47Cit9OworCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmh3X3RvX2xvY2FsKAogCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQogewpAQCAtMTA5MCw5ICsxMTcyLDggQEAKIC8qIElCU1MgY29kZSAqLwogdm9pZCBpZWVlODAyMTFfaWJzc19ub3RpZnlfc2Nhbl9jb21wbGV0ZWQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwogdm9pZCBpZWVlODAyMTFfaWJzc19zZXR1cF9zZGF0YShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Ci1zdHJ1Y3Qgc3RhX2luZm8gKmllZWU4MDIxMV9pYnNzX2FkZF9zdGEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkJCXU4ICpic3NpZCwgdTggKmFkZHIsIHUzMiBzdXBwX3JhdGVzLAotCQkJCQlnZnBfdCBnZnApOwordm9pZCBpZWVlODAyMTFfaWJzc19yeF9ub19zdGEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkgICAgICBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICphZGRyLCB1MzIgc3VwcF9yYXRlcyk7CiBpbnQgaWVlZTgwMjExX2lic3Nfam9pbihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCXN0cnVjdCBjZmc4MDIxMV9pYnNzX3BhcmFtcyAqcGFyYW1zKTsKIGludCBpZWVlODAyMTFfaWJzc19sZWF2ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CkBAIC0xMTQwLDEzICsxMjIxLDkgQEAKIHZvaWQgaWVlZTgwMjExX3NjaGVkX3NjYW5fc3RvcHBlZF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIC8qIG9mZi1jaGFubmVsIGhlbHBlcnMgKi8KLWJvb2wgaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwotdm9pZCBpZWVlODAyMTFfb2ZmY2hhbm5lbF9lbmFibGVfYWxsX3BzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQlib29sIHRlbGxfYXApOwogdm9pZCBpZWVlODAyMTFfb2ZmY2hhbm5lbF9zdG9wX3ZpZnMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkJICAgIGJvb2wgb2ZmY2hhbm5lbF9wc19lbmFibGUpOwogdm9pZCBpZWVlODAyMTFfb2ZmY2hhbm5lbF9yZXR1cm4oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJIGJvb2wgZW5hYmxlX2JlYWNvbmluZywKIAkJCQkgYm9vbCBvZmZjaGFubmVsX3BzX2Rpc2FibGUpOwogdm9pZCBpZWVlODAyMTFfaHdfcm9jX3NldHVwKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsKTsKIApAQCAtMTE3OSw3ICsxMjU2LDExIEBACiAJCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpOwogCiAvKiBIVCAqLwotdm9pZCBpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCitib29sIGllZWU4MDExMV9jZmdfb3ZlcnJpZGVfZGlzYWJsZXNfaHQ0MChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7Cit2b2lkIGllZWU4MDIxMV9hcHBseV9odGNhcF9vdmVycmlkZXMoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCk7Cit2b2lkIGllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKKwkJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCiAJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBfaWUsCiAJCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwKTsKIHZvaWQgaWVlZTgwMjExX3NlbmRfZGVsYmEoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCkBAIC0xMjY2LDcgKzEzNDcsMTYgQEAKIAkJCQkgICAgIGdmcF90IGdmcCk7CiB2b2lkIGllZWU4MDIxMV9zZXRfd21tX2RlZmF1bHQoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBpZWVlODAyMTFfeG1pdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Ci12b2lkIGllZWU4MDIxMV90eF9za2Ioc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHN0cnVjdCBza19idWZmICpza2IpOworCit2b2lkIGllZWU4MDIxMV90eF9za2JfdGlkKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdGlkKTsKK3N0YXRpYyB2b2lkIGlubGluZSBpZWVlODAyMTFfdHhfc2tiKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJCSAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCS8qIFNlbmQgYWxsIGludGVybmFsIG1nbXQgZnJhbWVzIG9uIFZPLiBBY2NvcmRpbmdseSBzZXQgVElEIHRvIDcuICovCisJaWVlZTgwMjExX3R4X3NrYl90aWQoc2RhdGEsIHNrYiwgNyk7Cit9CisKIHZvaWQgaWVlZTgwMl8xMV9wYXJzZV9lbGVtcyh1OCAqc3RhcnQsIHNpemVfdCBsZW4sCiAJCQkgICAgc3RydWN0IGllZWU4MDJfMTFfZWxlbXMgKmVsZW1zKTsKIHUzMiBpZWVlODAyXzExX3BhcnNlX2VsZW1zX2NyYyh1OCAqc3RhcnQsIHNpemVfdCBsZW4sCkBAIC0xMzM0LDYgKzE0MjQsMTIgQEAKIHNpemVfdCBpZWVlODAyMTFfaWVfc3BsaXQoY29uc3QgdTggKmllcywgc2l6ZV90IGllbGVuLAogCQkJICBjb25zdCB1OCAqaWRzLCBpbnQgbl9pZHMsIHNpemVfdCBvZmZzZXQpOwogc2l6ZV90IGllZWU4MDIxMV9pZV9zcGxpdF92ZW5kb3IoY29uc3QgdTggKmllcywgc2l6ZV90IGllbGVuLCBzaXplX3Qgb2Zmc2V0KTsKK3U4ICppZWVlODAyMTFfaWVfYnVpbGRfaHRfY2FwKHU4ICpwb3MsIHN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwLAorCQkJICAgICAgdTE2IGNhcCk7Cit1OCAqaWVlZTgwMjExX2llX2J1aWxkX2h0X2luZm8odTggKnBvcywKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCwKKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUpOwogCiAvKiBpbnRlcm5hbCB3b3JrIGl0ZW1zICovCiB2b2lkIGllZWU4MDIxMV93b3JrX2luaXQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpOwpAQCAtMTM2Miw2ICsxNDU4LDggQEAKIGJvb2wgaWVlZTgwMjExX3NldF9jaGFubmVsX3R5cGUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCiAJCQkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCiAJCQkJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFudHlwZSk7CitlbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlCitpZWVlODAyMTFfaHRfaW5mb190b19jaGFubmVsX3R5cGUoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvICpodF9pbmZvKTsKIAogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9OT0lOTElORQogI2RlZmluZSBkZWJ1Z19ub2lubGluZSBub2lubGluZQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL2lmYWNlLmMgYi9uZXQvbWFjODAyMTEvaWZhY2UuYwppbmRleCAzMGQ3MzU1Li5lNDc3NjhjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvaWZhY2UuYworKysgYi9uZXQvbWFjODAyMTEvaWZhY2UuYwpAQCAtMTg4LDExICsxODgsMjIgQEAKIAkJaWYgKCFpc192YWxpZF9ldGhlcl9hZGRyKHNkYXRhLT51Lndkcy5yZW1vdGVfYWRkcikpCiAJCQlyZXR1cm4gLUVOT0xJTks7CiAJCWJyZWFrOwotCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQX1ZMQU46IHsKKwkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqbWFzdGVyOworCiAJCWlmICghc2RhdGEtPmJzcykKIAkJCXJldHVybiAtRU5PTElOSzsKKwogCQlsaXN0X2FkZCgmc2RhdGEtPnUudmxhbi5saXN0LCAmc2RhdGEtPmJzcy0+dmxhbnMpOworCisJCW1hc3RlciA9IGNvbnRhaW5lcl9vZihzZGF0YS0+YnNzLAorCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHUuYXApOworCQlzZGF0YS0+Y29udHJvbF9wb3J0X3Byb3RvY29sID0KKwkJCW1hc3Rlci0+Y29udHJvbF9wb3J0X3Byb3RvY29sOworCQlzZGF0YS0+Y29udHJvbF9wb3J0X25vX2VuY3J5cHQgPQorCQkJbWFzdGVyLT5jb250cm9sX3BvcnRfbm9fZW5jcnlwdDsKIAkJYnJlYWs7CisJCX0KIAljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgogCQlzZGF0YS0+YnNzID0gJnNkYXRhLT51LmFwOwogCQlicmVhazsKQEAgLTI2NSw3ICsyNzYsNyBAQAogCQlicmVhazsKIAlkZWZhdWx0OgogCQlpZiAoY29taW5nX3VwKSB7Ci0JCQlyZXMgPSBkcnZfYWRkX2ludGVyZmFjZShsb2NhbCwgJnNkYXRhLT52aWYpOworCQkJcmVzID0gZHJ2X2FkZF9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKIAkJCWlmIChyZXMpCiAJCQkJZ290byBlcnJfc3RvcDsKIAkJfQpAQCAtMjgyLDEwICsyOTMsMTggQEAKIAkJY2hhbmdlZCB8PSBpZWVlODAyMTFfcmVzZXRfZXJwX2luZm8oc2RhdGEpOwogCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwgY2hhbmdlZCk7CiAKLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQorCQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gfHwKKwkJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJCW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CiAJCWVsc2UKIAkJCW5ldGlmX2NhcnJpZXJfb24oZGV2KTsKKworCQkvKgorCQkgKiBzZXQgZGVmYXVsdCBxdWV1ZSBwYXJhbWV0ZXJzIHNvIGRyaXZlcnMgZG9uJ3QKKwkJICogbmVlZCB0byBpbml0aWFsaXNlIHRoZSBoYXJkd2FyZSBpZiB0aGUgaGFyZHdhcmUKKwkJICogZG9lc24ndCBzdGFydCB1cCB3aXRoIHNhbmUgZGVmYXVsdHMKKwkJICovCisJCWllZWU4MDIxMV9zZXRfd21tX2RlZmF1bHQoc2RhdGEpOwogCX0KIAogCXNldF9iaXQoU0RBVEFfU1RBVEVfUlVOTklORywgJnNkYXRhLT5zdGF0ZSk7CkBAIC0yOTksOCArMzE4LDkgQEAKIAkJCWdvdG8gZXJyX2RlbF9pbnRlcmZhY2U7CiAJCX0KIAotCQkvKiBubyBhdG9taWMgYml0b3AgcmVxdWlyZWQgc2luY2UgU1RBIGlzIG5vdCBsaXZlIHlldCAqLwotCQlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BVVRIT1JJWkVEKTsKKwkJc3RhX2luZm9fbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVVUSCk7CisJCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FTU09DKTsKKwkJc3RhX2luZm9fbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVVUSE9SSVpFRCk7CiAKIAkJcmVzID0gc3RhX2luZm9faW5zZXJ0KHN0YSk7CiAJCWlmIChyZXMpIHsKQEAgLTMyOSwxNSArMzQ5LDggQEAKIAlpZiAoY29taW5nX3VwKQogCQlsb2NhbC0+b3Blbl9jb3VudCsrOwogCi0JaWYgKGh3X3JlY29uZl9mbGFncykgeworCWlmIChod19yZWNvbmZfZmxhZ3MpCiAJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIGh3X3JlY29uZl9mbGFncyk7Ci0JCS8qCi0JCSAqIHNldCBkZWZhdWx0IHF1ZXVlIHBhcmFtZXRlcnMgc28gZHJpdmVycyBkb24ndAotCQkgKiBuZWVkIHRvIGluaXRpYWxpc2UgdGhlIGhhcmR3YXJlIGlmIHRoZSBoYXJkd2FyZQotCQkgKiBkb2Vzbid0IHN0YXJ0IHVwIHdpdGggc2FuZSBkZWZhdWx0cwotCQkgKi8KLQkJaWVlZTgwMjExX3NldF93bW1fZGVmYXVsdChzZGF0YSk7Ci0JfQogCiAJaWVlZTgwMjExX3JlY2FsY19wcyhsb2NhbCwgLTEpOwogCkBAIC0zNDUsNyArMzU4LDcgQEAKIAogCXJldHVybiAwOwogIGVycl9kZWxfaW50ZXJmYWNlOgotCWRydl9yZW1vdmVfaW50ZXJmYWNlKGxvY2FsLCAmc2RhdGEtPnZpZik7CisJZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsIHNkYXRhKTsKICBlcnJfc3RvcDoKIAlpZiAoIWxvY2FsLT5vcGVuX2NvdW50KQogCQlkcnZfc3RvcChsb2NhbCk7CkBAIC00NTAsMTUgKzQ2MywxOSBAQAogCQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICp2bGFuLCAqdG1wc2RhdGE7CiAJCXN0cnVjdCBiZWFjb25fZGF0YSAqb2xkX2JlYWNvbiA9CiAJCQlydG5sX2RlcmVmZXJlbmNlKHNkYXRhLT51LmFwLmJlYWNvbik7CisJCXN0cnVjdCBza19idWZmICpvbGRfcHJvYmVfcmVzcCA9CisJCQlydG5sX2RlcmVmZXJlbmNlKHNkYXRhLT51LmFwLnByb2JlX3Jlc3ApOwogCiAJCS8qIHNkYXRhX3J1bm5pbmcgd2lsbCByZXR1cm4gZmFsc2UsIHNvIHRoaXMgd2lsbCBkaXNhYmxlICovCiAJCWllZWU4MDIxMV9ic3NfaW5mb19jaGFuZ2Vfbm90aWZ5KHNkYXRhLAogCQkJCQkJIEJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKTsKIAotCQkvKiByZW1vdmUgYmVhY29uICovCisJCS8qIHJlbW92ZSBiZWFjb24gYW5kIHByb2JlIHJlc3BvbnNlICovCiAJCVJDVV9JTklUX1BPSU5URVIoc2RhdGEtPnUuYXAuYmVhY29uLCBOVUxMKTsKKwkJUkNVX0lOSVRfUE9JTlRFUihzZGF0YS0+dS5hcC5wcm9iZV9yZXNwLCBOVUxMKTsKIAkJc3luY2hyb25pemVfcmN1KCk7CiAJCWtmcmVlKG9sZF9iZWFjb24pOworCQlrZnJlZV9za2Iob2xkX3Byb2JlX3Jlc3ApOwogCiAJCS8qIGRvd24gYWxsIGRlcGVuZGVudCBkZXZpY2VzLCB0aGF0IGlzIFZMQU5zICovCiAJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh2bGFuLCB0bXBzZGF0YSwgJnNkYXRhLT51LmFwLnZsYW5zLApAQCAtNTIwLDcgKzUzNyw3IEBACiAJCWllZWU4MDIxMV9mcmVlX2tleXMoc2RhdGEpOwogCiAJCWlmIChnb2luZ19kb3duKQotCQkJZHJ2X3JlbW92ZV9pbnRlcmZhY2UobG9jYWwsICZzZGF0YS0+dmlmKTsKKwkJCWRydl9yZW1vdmVfaW50ZXJmYWNlKGxvY2FsLCBzZGF0YSk7CiAJfQogCiAJc2RhdGEtPmJzcyA9IE5VTEw7CkBAIC02NTYsNyArNjczLDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCXN0cnVjdCBpZWVlODAyMTFfcmFkaW90YXBfaGVhZGVyICpydGFwID0gKHZvaWQgKilza2ItPmRhdGE7Ci0JdTggKnA7CiAKIAlpZiAobG9jYWwtPmh3LnF1ZXVlcyA8IDQpCiAJCXJldHVybiAwOwpAQCAtNjY3LDE5ICs2ODMsNyBAQAogCiAJaGRyID0gKHZvaWQgKikoKHU4ICopc2tiLT5kYXRhICsgbGUxNl90b19jcHUocnRhcC0+aXRfbGVuKSk7CiAKLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKLQkJc2tiLT5wcmlvcml0eSA9IDc7Ci0JCXJldHVybiBpZWVlODAyXzFkX3RvX2FjW3NrYi0+cHJpb3JpdHldOwotCX0KLQlpZiAoIWllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpKSB7Ci0JCXNrYi0+cHJpb3JpdHkgPSAwOwotCQlyZXR1cm4gaWVlZTgwMl8xZF90b19hY1tza2ItPnByaW9yaXR5XTsKLQl9Ci0KLQlwID0gaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcik7Ci0Jc2tiLT5wcmlvcml0eSA9ICpwICYgSUVFRTgwMjExX1FPU19DVExfVEFHMURfTUFTSzsKLQotCXJldHVybiBpZWVlODAyMTFfZG93bmdyYWRlX3F1ZXVlKGxvY2FsLCBza2IpOworCXJldHVybiBpZWVlODAyMTFfc2VsZWN0X3F1ZXVlXzgwMjExKGxvY2FsLCBza2IsIGhkcik7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmV0X2RldmljZV9vcHMgaWVlZTgwMjExX21vbml0b3JpZl9vcHMgPSB7CkBAIC04NTAsNiArODU0LDggQEAKIAlzZGF0YS0+Y29udHJvbF9wb3J0X3Byb3RvY29sID0gY3B1X3RvX2JlMTYoRVRIX1BfUEFFKTsKIAlzZGF0YS0+Y29udHJvbF9wb3J0X25vX2VuY3J5cHQgPSBmYWxzZTsKIAorCXNkYXRhLT5ub2Fja19tYXAgPSAwOworCiAJLyogb25seSBtb25pdG9yIGRpZmZlcnMgKi8KIAlzZGF0YS0+ZGV2LT50eXBlID0gQVJQSFJEX0VUSEVSOwogCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEva2V5LmMgYi9uZXQvbWFjODAyMTEva2V5LmMKaW5kZXggZmIwMmVhNS4uODdhODk3NCAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL2tleS5jCisrKyBiL25ldC9tYWM4MDIxMS9rZXkuYwpAQCAtMTM0LDkgKzEzNCwxMyBAQAogCQlrZXktPmZsYWdzIHw9IEtFWV9GTEFHX1VQTE9BREVEX1RPX0hBUkRXQVJFOwogCiAJCWlmICghKChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQykgfHwKLQkJICAgICAgKGtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVikpKQorCQkgICAgICAoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWKSB8fAorCQkgICAgICAoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BVVF9JVl9TUEFDRSkpKQogCQkJc2RhdGEtPmNyeXB0b190eF90YWlscm9vbV9uZWVkZWRfY250LS07CiAKKwkJV0FSTl9PTigoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BVVF9JVl9TUEFDRSkgJiYKKwkJCShrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfSVYpKTsKKwogCQlyZXR1cm4gMDsKIAl9CiAKQEAgLTE3OSw3ICsxODMsOCBAQAogCXNkYXRhID0ga2V5LT5zZGF0YTsKIAogCWlmICghKChrZXktPmNvbmYuZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfR0VORVJBVEVfTU1JQykgfHwKLQkgICAgICAoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWKSkpCisJICAgICAgKGtleS0+Y29uZi5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVikgfHwKKwkgICAgICAoa2V5LT5jb25mLmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BVVF9JVl9TUEFDRSkpKQogCQlpbmNyZW1lbnRfdGFpbHJvb21fbmVlZF9jb3VudChzZGF0YSk7CiAKIAlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQX1ZMQU4pCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWFpbi5jIGIvbmV0L21hYzgwMjExL21haW4uYwppbmRleCBkOTk5YmYzLi4wYTBkOTRhIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWFpbi5jCisrKyBiL25ldC9tYWM4MDIxMS9tYWluLmMKQEAgLTQ3LDcgKzQ3LDcgQEAKIAlpZiAoYXRvbWljX3JlYWQoJmxvY2FsLT5pZmZfYWxsbXVsdGlzKSkKIAkJbmV3X2ZsYWdzIHw9IEZJRl9BTExNVUxUSTsKIAotCWlmIChsb2NhbC0+bW9uaXRvcnMgfHwgbG9jYWwtPnNjYW5uaW5nKQorCWlmIChsb2NhbC0+bW9uaXRvcnMgfHwgdGVzdF9iaXQoU0NBTl9TV19TQ0FOTklORywgJmxvY2FsLT5zY2FubmluZykpCiAJCW5ld19mbGFncyB8PSBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQzsKIAogCWlmIChsb2NhbC0+ZmlmX3Byb2JlX3JlcSB8fCBsb2NhbC0+cHJvYmVfcmVxX3JlZykKQEAgLTkyLDE4ICs5MiwyMCBAQAogCWllZWU4MDIxMV9jb25maWd1cmVfZmlsdGVyKGxvY2FsKTsKIH0KIAotLyoKLSAqIFJldHVybnMgdHJ1ZSBpZiB3ZSBhcmUgbG9naWNhbGx5IGNvbmZpZ3VyZWQgdG8gYmUgb24KLSAqIHRoZSBvcGVyYXRpbmcgY2hhbm5lbCBBTkQgdGhlIGhhcmR3YXJlLWNvbmYgaXMgY3VycmVudGx5Ci0gKiBjb25maWd1cmVkIG9uIHRoZSBvcGVyYXRpbmcgY2hhbm5lbC4gIENvbXBhcmVzIGNoYW5uZWwtdHlwZQotICogYXMgd2VsbC4KLSAqLwotYm9vbCBpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCkKK2ludCBpZWVlODAyMTFfaHdfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1MzIgY2hhbmdlZCkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sICpzY2FuX2NoYW47CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOworCWludCByZXQgPSAwOworCWludCBwb3dlcjsKIAllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZTsKKwl1MzIgb2ZmY2hhbm5lbF9mbGFnOwogCi0JLyogVGhpcyBsb2dpYyBuZWVkcyB0byBtYXRjaCBsb2dpYyBpbiBpZWVlODAyMTFfaHdfY29uZmlnICovCisJbWlnaHRfc2xlZXAoKTsKKworCS8qIElmIHRoaXMgb2ZmLWNoYW5uZWwgbG9naWMgZXZlciBjaGFuZ2VzLCAgaWVlZTgwMjExX29uX29wZXJfY2hhbm5lbAorCSAqIG1heSBuZWVkIHRvIGNoYW5nZSBhcyB3ZWxsLgorCSAqLworCW9mZmNoYW5uZWxfZmxhZyA9IGxvY2FsLT5ody5jb25mLmZsYWdzICYgSUVFRTgwMjExX0NPTkZfT0ZGQ0hBTk5FTDsKIAlpZiAobG9jYWwtPnNjYW5fY2hhbm5lbCkgewogCQljaGFuID0gbG9jYWwtPnNjYW5fY2hhbm5lbDsKIAkJLyogSWYgc2Nhbm5pbmcgb24gb3BlciBjaGFubmVsLCB1c2Ugd2hhdGV2ZXIgY2hhbm5lbC10eXBlCkBAIC0xMTQsNTIgKzExNiw3IEBACiAJCWVsc2UKIAkJCWNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9OT19IVDsKIAl9IGVsc2UgaWYgKGxvY2FsLT50bXBfY2hhbm5lbCkgewotCQljaGFuID0gc2Nhbl9jaGFuID0gbG9jYWwtPnRtcF9jaGFubmVsOwotCQljaGFubmVsX3R5cGUgPSBsb2NhbC0+dG1wX2NoYW5uZWxfdHlwZTsKLQl9IGVsc2UgewotCQljaGFuID0gbG9jYWwtPm9wZXJfY2hhbm5lbDsKLQkJY2hhbm5lbF90eXBlID0gbG9jYWwtPl9vcGVyX2NoYW5uZWxfdHlwZTsKLQl9Ci0KLQlpZiAoY2hhbiAhPSBsb2NhbC0+b3Blcl9jaGFubmVsIHx8Ci0JICAgIGNoYW5uZWxfdHlwZSAhPSBsb2NhbC0+X29wZXJfY2hhbm5lbF90eXBlKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBDaGVjayBjdXJyZW50IGhhcmR3YXJlLWNvbmZpZyBhZ2FpbnN0IG9wZXJfY2hhbm5lbC4gKi8KLQlpZiAoKGxvY2FsLT5vcGVyX2NoYW5uZWwgIT0gbG9jYWwtPmh3LmNvbmYuY2hhbm5lbCkgfHwKLQkgICAgKGxvY2FsLT5fb3Blcl9jaGFubmVsX3R5cGUgIT0gbG9jYWwtPmh3LmNvbmYuY2hhbm5lbF90eXBlKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIHRydWU7Ci19Ci0KLWludCBpZWVlODAyMTFfaHdfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCB1MzIgY2hhbmdlZCkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sICpzY2FuX2NoYW47Ci0JaW50IHJldCA9IDA7Ci0JaW50IHBvd2VyOwotCWVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlOwotCXUzMiBvZmZjaGFubmVsX2ZsYWc7Ci0KLQltaWdodF9zbGVlcCgpOwotCi0Jc2Nhbl9jaGFuID0gbG9jYWwtPnNjYW5fY2hhbm5lbDsKLQotCS8qIElmIHRoaXMgb2ZmLWNoYW5uZWwgbG9naWMgZXZlciBjaGFuZ2VzLCAgaWVlZTgwMjExX29uX29wZXJfY2hhbm5lbAotCSAqIG1heSBuZWVkIHRvIGNoYW5nZSBhcyB3ZWxsLgotCSAqLwotCW9mZmNoYW5uZWxfZmxhZyA9IGxvY2FsLT5ody5jb25mLmZsYWdzICYgSUVFRTgwMjExX0NPTkZfT0ZGQ0hBTk5FTDsKLQlpZiAoc2Nhbl9jaGFuKSB7Ci0JCWNoYW4gPSBzY2FuX2NoYW47Ci0JCS8qIElmIHNjYW5uaW5nIG9uIG9wZXIgY2hhbm5lbCwgdXNlIHdoYXRldmVyIGNoYW5uZWwtdHlwZQotCQkgKiBpcyBjdXJyZW50bHkgaW4gdXNlLgotCQkgKi8KLQkJaWYgKGNoYW4gPT0gbG9jYWwtPm9wZXJfY2hhbm5lbCkKLQkJCWNoYW5uZWxfdHlwZSA9IGxvY2FsLT5fb3Blcl9jaGFubmVsX3R5cGU7Ci0JCWVsc2UKLQkJCWNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9OT19IVDsKLQl9IGVsc2UgaWYgKGxvY2FsLT50bXBfY2hhbm5lbCkgewotCQljaGFuID0gc2Nhbl9jaGFuID0gbG9jYWwtPnRtcF9jaGFubmVsOworCQljaGFuID0gbG9jYWwtPnRtcF9jaGFubmVsOwogCQljaGFubmVsX3R5cGUgPSBsb2NhbC0+dG1wX2NoYW5uZWxfdHlwZTsKIAl9IGVsc2UgewogCQljaGFuID0gbG9jYWwtPm9wZXJfY2hhbm5lbDsKQEAgLTE5Myw4ICsxNTAsOCBAQAogCQljaGFuZ2VkIHw9IElFRUU4MDIxMV9DT05GX0NIQU5HRV9TTVBTOwogCX0KIAotCWlmICgobG9jYWwtPnNjYW5uaW5nICYgU0NBTl9TV19TQ0FOTklORykgfHwKLQkgICAgKGxvY2FsLT5zY2FubmluZyAmIFNDQU5fSFdfU0NBTk5JTkcpKQorCWlmICh0ZXN0X2JpdChTQ0FOX1NXX1NDQU5OSU5HLCAmbG9jYWwtPnNjYW5uaW5nKSB8fAorCSAgICB0ZXN0X2JpdChTQ0FOX0hXX1NDQU5OSU5HLCAmbG9jYWwtPnNjYW5uaW5nKSkKIAkJcG93ZXIgPSBjaGFuLT5tYXhfcG93ZXI7CiAJZWxzZQogCQlwb3dlciA9IGxvY2FsLT5wb3dlcl9jb25zdHJfbGV2ZWwgPwpAQCAtNDM2LDkgKzM5Myw2IEBACiAJc2RhdGEgPSBJRUVFODAyMTFfREVWX1RPX1NVQl9JRihuZGV2KTsKIAlic3NfY29uZiA9ICZzZGF0YS0+dmlmLmJzc19jb25mOwogCi0JaWYgKCFpZWVlODAyMTFfc2RhdGFfcnVubmluZyhzZGF0YSkpCi0JCXJldHVybiBOT1RJRllfRE9ORTsKLQogCS8qIEFSUCBmaWx0ZXJpbmcgaXMgb25seSBzdXBwb3J0ZWQgaW4gbWFuYWdlZCBtb2RlICovCiAJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQogCQlyZXR1cm4gTk9USUZZX0RPTkU7CkBAIC00NjcsNyArNDIxLDcgQEAKIAl9CiAJYnNzX2NvbmYtPmFycF9hZGRyX2NudCA9IGM7CiAKLQkvKiBDb25maWd1cmUgZHJpdmVyIG9ubHkgaWYgYXNzb2NpYXRlZCAqLworCS8qIENvbmZpZ3VyZSBkcml2ZXIgb25seSBpZiBhc3NvY2lhdGVkICh3aGljaCBhbHNvIGltcGxpZXMgaXQgaXMgdXApICovCiAJaWYgKGlmbWdkLT5hc3NvY2lhdGVkKSB7CiAJCWJzc19jb25mLT5hcnBfZmlsdGVyX2VuYWJsZWQgPSBzZGF0YS0+YXJwX2ZpbHRlcl9zdGF0ZTsKIAkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsCkBAIC01NjAsNiArNTE0LDE5IEBACiAJfSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCBtYWM4MDIxMV9odF9jYXBhX21vZF9tYXNrID0geworCS5hbXBkdV9wYXJhbXNfaW5mbyA9IElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0ZBQ1RPUiB8CisJCQkgICAgIElFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFksCisKKwkuY2FwX2luZm8gPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCB8CisJCQkJSUVFRTgwMjExX0hUX0NBUF9NQVhfQU1TRFUgfAorCQkJCUlFRUU4MDIxMV9IVF9DQVBfU0dJXzQwKSwKKwkubWNzID0geworCQkucnhfbWFzayA9IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwKKwkJCSAgICAgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgfSwKKwl9LAorfTsKKwogc3RydWN0IGllZWU4MDIxMV9odyAqaWVlZTgwMjExX2FsbG9jX2h3KHNpemVfdCBwcml2X2RhdGFfbGVuLAogCQkJCQljb25zdCBzdHJ1Y3QgaWVlZTgwMjExX29wcyAqb3BzKQogewpAQCAtNTk1LDcgKzU2MiwxMyBAQAogCiAJd2lwaHktPmZsYWdzIHw9IFdJUEhZX0ZMQUdfTkVUTlNfT0sgfAogCQkJV0lQSFlfRkxBR180QUREUl9BUCB8Ci0JCQlXSVBIWV9GTEFHXzRBRERSX1NUQVRJT047CisJCQlXSVBIWV9GTEFHXzRBRERSX1NUQVRJT04gfAorCQkJV0lQSFlfRkxBR19SRVBPUlRTX09CU1MgfAorCQkJV0lQSFlfRkxBR19PRkZDSEFOX1RYIHwKKwkJCVdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMOworCisJd2lwaHktPmZlYXR1cmVzID0gTkw4MDIxMV9GRUFUVVJFX1NLX1RYX1NUQVRVUyB8CisJCQkgIE5MODAyMTFfRkVBVFVSRV9IVF9JQlNTOwogCiAJaWYgKCFvcHMtPnNldF9rZXkpCiAJCXdpcGh5LT5mbGFncyB8PSBXSVBIWV9GTEFHX0lCU1NfUlNOOwpAQCAtNjA4LDcgKzU4MSw3IEBACiAKIAlsb2NhbC0+aHcucHJpdiA9IChjaGFyICopbG9jYWwgKyBBTElHTihzaXplb2YoKmxvY2FsKSwgTkVUREVWX0FMSUdOKTsKIAotCUJVR19PTighb3BzLT50eCk7CisJQlVHX09OKCFvcHMtPnR4ICYmICFvcHMtPnR4X2ZyYWdzKTsKIAlCVUdfT04oIW9wcy0+c3RhcnQpOwogCUJVR19PTighb3BzLT5zdG9wKTsKIAlCVUdfT04oIW9wcy0+Y29uZmlnKTsKQEAgLTYyOCw2ICs2MDEsNyBAQAogCWxvY2FsLT51c2VyX3Bvd2VyX2xldmVsID0gLTE7CiAJbG9jYWwtPnVhcHNkX3F1ZXVlcyA9IElFRUU4MDIxMV9ERUZBVUxUX1VBUFNEX1FVRVVFUzsKIAlsb2NhbC0+dWFwc2RfbWF4X3NwX2xlbiA9IElFRUU4MDIxMV9ERUZBVUxUX01BWF9TUF9MRU47CisJd2lwaHktPmh0X2NhcGFfbW9kX21hc2sgPSAmbWFjODAyMTFfaHRfY2FwYV9tb2RfbWFzazsKIAogCUlOSVRfTElTVF9IRUFEKCZsb2NhbC0+aW50ZXJmYWNlcyk7CiAKQEAgLTY3MCw2ICs2NDQsMTEgQEAKIAlJTklUX1dPUksoJmxvY2FsLT5zY2hlZF9zY2FuX3N0b3BwZWRfd29yaywKIAkJICBpZWVlODAyMTFfc2NoZWRfc2Nhbl9zdG9wcGVkX3dvcmspOwogCisJc3Bpbl9sb2NrX2luaXQoJmxvY2FsLT5hY2tfc3RhdHVzX2xvY2spOworCWlkcl9pbml0KCZsb2NhbC0+YWNrX3N0YXR1c19mcmFtZXMpOworCS8qIHByZWFsbG9jYXRlIGF0IGxlYXN0IG9uZSBlbnRyeSAqLworCWlkcl9wcmVfZ2V0KCZsb2NhbC0+YWNrX3N0YXR1c19mcmFtZXMsIEdGUF9LRVJORUwpOworCiAJc3RhX2luZm9faW5pdChsb2NhbCk7CiAKIAlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX01BWF9RVUVVRVM7IGkrKykgewpAQCAtNzU3LDYgKzczNiwxMiBAQAogCWlmICghbG9jYWwtPmludF9zY2FuX3JlcSkKIAkJcmV0dXJuIC1FTk9NRU07CiAKKwlmb3IgKGJhbmQgPSAwOyBiYW5kIDwgSUVFRTgwMjExX05VTV9CQU5EUzsgYmFuZCsrKSB7CisJCWlmICghbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tiYW5kXSkKKwkJCWNvbnRpbnVlOworCQlsb2NhbC0+aW50X3NjYW5fcmVxLT5yYXRlc1tiYW5kXSA9ICh1MzIpIC0xOworCX0KKwogCS8qIGlmIGxvdy1sZXZlbCBkcml2ZXIgc3VwcG9ydHMgQVAsIHdlIGFsc28gc3VwcG9ydCBWTEFOICovCiAJaWYgKGxvY2FsLT5ody53aXBoeS0+aW50ZXJmYWNlX21vZGVzICYgQklUKE5MODAyMTFfSUZUWVBFX0FQKSkgewogCQlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfQVBfVkxBTik7CkBAIC0xMDQ1LDYgKzEwMzAsMTMgQEAKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcpOwogCitzdGF0aWMgaW50IGllZWU4MDIxMV9mcmVlX2Fja19mcmFtZShpbnQgaWQsIHZvaWQgKnAsIHZvaWQgKmRhdGEpCit7CisJV0FSTl9PTkNFKDEsICJIYXZlIHBlbmRpbmcgYWNrIGZyYW1lcyFcbiIpOworCWtmcmVlX3NrYihwKTsKKwlyZXR1cm4gMDsKK30KKwogdm9pZCBpZWVlODAyMTFfZnJlZV9odyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKQEAgLTEwNTUsNiArMTA0NywxMCBAQAogCWlmIChsb2NhbC0+d2lwaHlfY2lwaGVyc19hbGxvY2F0ZWQpCiAJCWtmcmVlKGxvY2FsLT5ody53aXBoeS0+Y2lwaGVyX3N1aXRlcyk7CiAKKwlpZHJfZm9yX2VhY2goJmxvY2FsLT5hY2tfc3RhdHVzX2ZyYW1lcywKKwkJICAgICBpZWVlODAyMTFfZnJlZV9hY2tfZnJhbWUsIE5VTEwpOworCWlkcl9kZXN0cm95KCZsb2NhbC0+YWNrX3N0YXR1c19mcmFtZXMpOworCiAJd2lwaHlfZnJlZShsb2NhbC0+aHcud2lwaHkpOwogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZnJlZV9odyk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaC5jIGIvbmV0L21hYzgwMjExL21lc2guYwppbmRleCBhNzA3OGZkLi5jNzA3YzhiIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaC5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoLmMKQEAgLTc2LDYgKzc2LDcgQEAKIGJvb2wgbWVzaF9tYXRjaGVzX2xvY2FsKHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICppZSwgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCA9ICZzZGF0YS0+dS5tZXNoOworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwogCiAJLyoKIAkgKiBBcyBzdXBwb3J0IGZvciBlYWNoIGZlYXR1cmUgaXMgYWRkZWQsIGNoZWNrIGZvciBtYXRjaGluZwpAQCAtODcsMTUgKzg4LDIzIEBACiAJICogICAtIE1EQSBlbmFibGVkCiAJICogLSBQb3dlciBtYW5hZ2VtZW50IGNvbnRyb2wgb24gZmMKIAkgKi8KLQlpZiAoaWZtc2gtPm1lc2hfaWRfbGVuID09IGllLT5tZXNoX2lkX2xlbiAmJgotCQltZW1jbXAoaWZtc2gtPm1lc2hfaWQsIGllLT5tZXNoX2lkLCBpZS0+bWVzaF9pZF9sZW4pID09IDAgJiYKLQkJKGlmbXNoLT5tZXNoX3BwX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfcHNlbCkgJiYKLQkJKGlmbXNoLT5tZXNoX3BtX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfcG1ldHJpYykgJiYKLQkJKGlmbXNoLT5tZXNoX2NjX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfY29uZ2VzdCkgJiYKLQkJKGlmbXNoLT5tZXNoX3NwX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfc3luY2gpICYmCi0JCShpZm1zaC0+bWVzaF9hdXRoX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfYXV0aCkpCi0JCXJldHVybiB0cnVlOworCWlmICghKGlmbXNoLT5tZXNoX2lkX2xlbiA9PSBpZS0+bWVzaF9pZF9sZW4gJiYKKwkgICAgIG1lbWNtcChpZm1zaC0+bWVzaF9pZCwgaWUtPm1lc2hfaWQsIGllLT5tZXNoX2lkX2xlbikgPT0gMCAmJgorCSAgICAgKGlmbXNoLT5tZXNoX3BwX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfcHNlbCkgJiYKKwkgICAgIChpZm1zaC0+bWVzaF9wbV9pZCA9PSBpZS0+bWVzaF9jb25maWctPm1lc2hjb25mX3BtZXRyaWMpICYmCisJICAgICAoaWZtc2gtPm1lc2hfY2NfaWQgPT0gaWUtPm1lc2hfY29uZmlnLT5tZXNoY29uZl9jb25nZXN0KSAmJgorCSAgICAgKGlmbXNoLT5tZXNoX3NwX2lkID09IGllLT5tZXNoX2NvbmZpZy0+bWVzaGNvbmZfc3luY2gpICYmCisJICAgICAoaWZtc2gtPm1lc2hfYXV0aF9pZCA9PSBpZS0+bWVzaF9jb25maWctPm1lc2hjb25mX2F1dGgpKSkKKwkJZ290byBtaXNtYXRjaDsKIAorCS8qIGRpc2FsbG93IHBlZXJpbmcgd2l0aCBtaXNtYXRjaGVkIGNoYW5uZWwgdHlwZXMgZm9yIG5vdyAqLworCWlmIChpZS0+aHRfaW5mb19lbGVtICYmCisJICAgIChsb2NhbC0+X29wZXJfY2hhbm5lbF90eXBlICE9CisJICAgICBpZWVlODAyMTFfaHRfaW5mb190b19jaGFubmVsX3R5cGUoaWUtPmh0X2luZm9fZWxlbSkpKQorCQlnb3RvIG1pc21hdGNoOworCisJcmV0dXJuIHRydWU7CittaXNtYXRjaDoKIAlyZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTM0MSw2ICszNTAsNDkgQEAKIAlyZXR1cm4gMDsKIH0KIAoraW50IG1lc2hfYWRkX2h0X2NhcF9pZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CisJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CisJdTggKnBvczsKKworCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+b3Blcl9jaGFubmVsLT5iYW5kXTsKKwlpZiAoIXNiYW5kLT5odF9jYXAuaHRfc3VwcG9ydGVkIHx8CisJICAgIGxvY2FsLT5fb3Blcl9jaGFubmVsX3R5cGUgPT0gTkw4MDIxMV9DSEFOX05PX0hUKQorCQlyZXR1cm4gMDsKKworCWlmIChza2JfdGFpbHJvb20oc2tiKSA8IDIgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXBvcyA9IHNrYl9wdXQoc2tiLCAyICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7CisJaWVlZTgwMjExX2llX2J1aWxkX2h0X2NhcChwb3MsICZzYmFuZC0+aHRfY2FwLCBzYmFuZC0+aHRfY2FwLmNhcCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG1lc2hfYWRkX2h0X2luZm9faWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOworCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCA9IGxvY2FsLT5vcGVyX2NoYW5uZWw7CisJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUgPSBsb2NhbC0+X29wZXJfY2hhbm5lbF90eXBlOworCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kID0KKwkJCQlsb2NhbC0+aHcud2lwaHktPmJhbmRzW2NoYW5uZWwtPmJhbmRdOworCXN0cnVjdCBpZWVlODAyMTFfc3RhX2h0X2NhcCAqaHRfY2FwID0gJnNiYW5kLT5odF9jYXA7CisJdTggKnBvczsKKworCWlmICghaHRfY2FwLT5odF9zdXBwb3J0ZWQgfHwgY2hhbm5lbF90eXBlID09IE5MODAyMTFfQ0hBTl9OT19IVCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2tiX3RhaWxyb29tKHNrYikgPCAyICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpCisJCXJldHVybiAtRU5PTUVNOworCisJcG9zID0gc2tiX3B1dChza2IsIDIgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvKSk7CisJaWVlZTgwMjExX2llX2J1aWxkX2h0X2luZm8ocG9zLCBodF9jYXAsIGNoYW5uZWwsIGNoYW5uZWxfdHlwZSk7CisKKwlyZXR1cm4gMDsKK30KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV9tZXNoX3BhdGhfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQogewogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0KQEAgLTY5Nyw2ICs3NDksNyBAQAogCWF0b21pY19zZXQoJmlmbXNoLT5tcGF0aHMsIDApOwogCW1lc2hfcm1jX2luaXQoc2RhdGEpOwogCWlmbXNoLT5sYXN0X3ByZXEgPSBqaWZmaWVzOworCWlmbXNoLT5uZXh0X3BlcnIgPSBqaWZmaWVzOwogCS8qIEFsbG9jYXRlIGFsbCBtZXNoIHN0cnVjdHVyZXMgd2hlbiBjcmVhdGluZyB0aGUgZmlyc3QgbWVzaCBpbnRlcmZhY2UuICovCiAJaWYgKCFtZXNoX2FsbG9jYXRlZCkKIAkJaWVlZTgwMjExc19pbml0KCk7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaC5oIGIvbmV0L21hYzgwMjExL21lc2guaAppbmRleCA4YzAwZTJkLi5iZDE0YmQyIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaC5oCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoLmgKQEAgLTMxLDYgKzMxLDggQEAKICAqIEBNRVNIX1BBVEhfRklYRUQ6IHRoZSBtZXNoIHBhdGggaGFzIGJlZW4gbWFudWFsbHkgc2V0IGFuZCBzaG91bGQgbm90IGJlCiAgKiAJbW9kaWZpZWQKICAqIEBNRVNIX1BBVEhfUkVTT0xWRUQ6IHRoZSBtZXNoIHBhdGggY2FuIGhhcyBiZWVuIHJlc29sdmVkCisgKiBATUVTSF9QQVRIX1JFUV9RVUVVRUQ6IHRoZXJlIGlzIGFuIHVuc2VudCBwYXRoIHJlcXVlc3QgZm9yIHRoaXMgZGVzdGluYXRpb24KKyAqIGFscmVhZHkgcXVldWVkIHVwLCB3YWl0aW5nIGZvciB0aGUgZGlzY292ZXJ5IHByb2Nlc3MgdG8gc3RhcnQuCiAgKgogICogTUVTSF9QQVRIX1JFU09MVkVEIGlzIHVzZWQgYnkgdGhlIG1lc2ggcGF0aCB0aW1lciB0bwogICogZGVjaWRlIHdoZW4gdG8gc3RvcCBvciBjYW5jZWwgdGhlIG1lc2ggcGF0aCBkaXNjb3ZlcnkuCkBAIC00MSw2ICs0Myw3IEBACiAJTUVTSF9QQVRIX1NOX1ZBTElEID0JQklUKDIpLAogCU1FU0hfUEFUSF9GSVhFRAk9CUJJVCgzKSwKIAlNRVNIX1BBVEhfUkVTT0xWRUQgPQlCSVQoNCksCisJTUVTSF9QQVRIX1JFUV9RVUVVRUQgPQlCSVQoNSksCiB9OwogCiAvKioKQEAgLTIxMiw2ICsyMTUsMTAgQEAKIAkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIGludCBtZXNoX2FkZF9kc19wYXJhbXNfaWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCSAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOworaW50IG1lc2hfYWRkX2h0X2NhcF9pZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOworaW50IG1lc2hfYWRkX2h0X2luZm9faWUoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIHZvaWQgbWVzaF9ybWNfZnJlZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiBpbnQgbWVzaF9ybWNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSk7CiB2b2lkIGllZWU4MDIxMXNfaW5pdCh2b2lkKTsKQEAgLTIyNiw2ICsyMzMsOCBAQAogLyogTWVzaCBwYXRocyAqLwogaW50IG1lc2hfbmV4dGhvcF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOworaW50IG1lc2hfbmV4dGhvcF9yZXNvbHZlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwogdm9pZCBtZXNoX3BhdGhfc3RhcnRfZGlzY292ZXJ5KHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKTsKIHN0cnVjdCBtZXNoX3BhdGggKm1lc2hfcGF0aF9sb29rdXAodTggKmRzdCwKIAkJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jIGIvbmV0L21hYzgwMjExL21lc2hfaHdtcC5jCmluZGV4IDE3NDA0MGEuLjczYWJiNzUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tZXNoX2h3bXAuYworKysgYi9uZXQvbWFjODAyMTEvbWVzaF9od21wLmMKQEAgLTExMywyMCArMTEzLDIwIEBACiAJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArIDQwMCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7Ci0JdTggKnBvczsKLQlpbnQgaWVfbGVuOworCXU4ICpwb3MsIGllX2xlbjsKKwlpbnQgaGRyX2xlbiA9IG9mZnNldG9mKHN0cnVjdCBpZWVlODAyMTFfbWdtdCwgdS5hY3Rpb24udS5tZXNoX2FjdGlvbikgKworCQkgICAgICBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5tZXNoX2FjdGlvbik7CiAKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArCisJCQkgICAgaGRyX2xlbiArCisJCQkgICAgMiArIDM3KTsgLyogbWF4IEhXTVAgSUUgKi8KIAlpZiAoIXNrYikKIAkJcmV0dXJuIC0xOwogCXNrYl9yZXNlcnZlKHNrYiwgbG9jYWwtPmh3LmV4dHJhX3R4X2hlYWRyb29tKTsKLQkvKiAyNSBpcyB0aGUgc2l6ZSBvZiB0aGUgY29tbW9uIG1nbXQgcGFydCAoMjQpIHBsdXMgdGhlIHNpemUgb2YgdGhlCi0JICogY29tbW9uIGFjdGlvbiBwYXJ0ICgxKQotCSAqLwotCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopCi0JCXNrYl9wdXQoc2tiLCAyNSArIHNpemVvZihtZ210LT51LmFjdGlvbi51Lm1lc2hfYWN0aW9uKSk7Ci0JbWVtc2V0KG1nbXQsIDAsIDI1ICsgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUubWVzaF9hY3Rpb24pKTsKKwltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2JfcHV0KHNrYiwgaGRyX2xlbik7CisJbWVtc2V0KG1nbXQsIDAsIGhkcl9sZW4pOwogCW1nbXQtPmZyYW1lX2NvbnRyb2wgPSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8CiAJCQkJCSAgSUVFRTgwMjExX1NUWVBFX0FDVElPTik7CiAKQEAgLTI0MCwyMCArMjQwLDI0IEBACiAJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20gKyA0MDApOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCA9ICZzZGF0YS0+dS5tZXNoOwogCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKLQl1OCAqcG9zOwotCWludCBpZV9sZW47CisJdTggKnBvcywgaWVfbGVuOworCWludCBoZHJfbGVuID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFjdGlvbi51Lm1lc2hfYWN0aW9uKSArCisJCSAgICAgIHNpemVvZihtZ210LT51LmFjdGlvbi51Lm1lc2hfYWN0aW9uKTsKIAorCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCBpZm1zaC0+bmV4dF9wZXJyKSkKKwkJcmV0dXJuIC1FQUdBSU47CisKKwlza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArCisJCQkgICAgaGRyX2xlbiArCisJCQkgICAgMiArIDE1IC8qIFBFUlIgSUUgKi8pOwogCWlmICghc2tiKQogCQlyZXR1cm4gLTE7CiAJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+dHhfaGVhZHJvb20gKyBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOwotCS8qIDI1IGlzIHRoZSBzaXplIG9mIHRoZSBjb21tb24gbWdtdCBwYXJ0ICgyNCkgcGx1cyB0aGUgc2l6ZSBvZiB0aGUKLQkgKiBjb21tb24gYWN0aW9uIHBhcnQgKDEpCi0JICovCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikKLQkJc2tiX3B1dChza2IsIDI1ICsgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUubWVzaF9hY3Rpb24pKTsKLQltZW1zZXQobWdtdCwgMCwgMjUgKyBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5tZXNoX2FjdGlvbikpOworCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopIHNrYl9wdXQoc2tiLCBoZHJfbGVuKTsKKwltZW1zZXQobWdtdCwgMCwgaGRyX2xlbik7CiAJbWdtdC0+ZnJhbWVfY29udHJvbCA9IGNwdV90b19sZTE2KElFRUU4MDIxMV9GVFlQRV9NR01UIHwKIAkJCQkJICBJRUVFODAyMTFfU1RZUEVfQUNUSU9OKTsKIApAQCAtMjkwLDYgKzI5NCw4IEBACiAKIAkvKiBzZWUgbm90ZSBpbiBmdW5jdGlvbiBoZWFkZXIgKi8KIAlwcmVwYXJlX2ZyYW1lX2Zvcl9kZWZlcnJlZF90eChzZGF0YSwgc2tiKTsKKwlpZm1zaC0+bmV4dF9wZXJyID0gVFVfVE9fRVhQX1RJTUUoCisJCQkJICAgaWZtc2gtPm1zaGNmZy5kb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsKTsKIAlpZWVlODAyMTFfYWRkX3BlbmRpbmdfc2tiKGxvY2FsLCBza2IpOwogCXJldHVybiAwOwogfQpAQCAtMzkzLDE1ICszOTksMTMgQEAKIAkJb3JpZ19tZXRyaWMgPSBQUkVRX0lFX01FVFJJQyhod21wX2llKTsKIAkJYnJlYWs7CiAJY2FzZSBNUEFUSF9QUkVQOgotCQkvKiBPcmlnaW5hdG9yIGhlcmUgcmVmZXJzIHRvIHRoZSBNUCB0aGF0IHdhcyB0aGUgZGVzdGluYXRpb24gaW4KLQkJICogdGhlIFBhdGggUmVxdWVzdC4gVGhlIGRyYWZ0IHJlZmVycyB0byB0aGF0IE1QIGFzIHRoZQotCQkgKiBkZXN0aW5hdGlvbiBhZGRyZXNzLCBldmVuIHRob3VnaCB1c3VhbGx5IGl0IGlzIHRoZSBvcmlnaW4gb2YKLQkJICogdGhlIFBSRVAgZnJhbWUuIFdlIGRpdmVydCBmcm9tIHRoZSBub21lbmNsYXR1cmUgaW4gdGhlIGRyYWZ0CisJCS8qIE9yaWdpbmF0b3IgaGVyZSByZWZlcnMgdG8gdGhlIE1QIHRoYXQgd2FzIHRoZSB0YXJnZXQgaW4gdGhlCisJCSAqIFBhdGggUmVxdWVzdC4gV2UgZGl2ZXJ0IGZyb20gdGhlIG5vbWVuY2xhdHVyZSBpbiB0aGUgZHJhZnQKIAkJICogc28gdGhhdCB3ZSBjYW4gZWFzaWx5IHVzZSBhIHNpbmdsZSBmdW5jdGlvbiB0byBnYXRoZXIgcGF0aAogCQkgKiBpbmZvcm1hdGlvbiBmcm9tIGJvdGggUFJFUSBhbmQgUFJFUCBmcmFtZXMuCiAJCSAqLwotCQlvcmlnX2FkZHIgPSBQUkVQX0lFX09SSUdfQUREUihod21wX2llKTsKLQkJb3JpZ19zbiA9IFBSRVBfSUVfT1JJR19TTihod21wX2llKTsKKwkJb3JpZ19hZGRyID0gUFJFUF9JRV9UQVJHRVRfQUREUihod21wX2llKTsKKwkJb3JpZ19zbiA9IFBSRVBfSUVfVEFSR0VUX1NOKGh3bXBfaWUpOwogCQlvcmlnX2xpZmV0aW1lID0gUFJFUF9JRV9MSUZFVElNRShod21wX2llKTsKIAkJb3JpZ19tZXRyaWMgPSBQUkVQX0lFX01FVFJJQyhod21wX2llKTsKIAkJYnJlYWs7CkBAIC01NjIsOSArNTY2LDkgQEAKIAkJdHRsID0gaWZtc2gtPm1zaGNmZy5lbGVtZW50X3R0bDsKIAkJaWYgKHR0bCAhPSAwKSB7CiAJCQltaHdtcF9kYmcoInJlcGx5aW5nIHRvIHRoZSBQUkVRIik7Ci0JCQltZXNoX3BhdGhfc2VsX2ZyYW1lX3R4KE1QQVRIX1BSRVAsIDAsIHRhcmdldF9hZGRyLAotCQkJCWNwdV90b19sZTMyKHRhcmdldF9zbiksIDAsIG9yaWdfYWRkciwKLQkJCQljcHVfdG9fbGUzMihvcmlnX3NuKSwgbWdtdC0+c2EsIDAsIHR0bCwKKwkJCW1lc2hfcGF0aF9zZWxfZnJhbWVfdHgoTVBBVEhfUFJFUCwgMCwgb3JpZ19hZGRyLAorCQkJCWNwdV90b19sZTMyKG9yaWdfc24pLCAwLCB0YXJnZXRfYWRkciwKKwkJCQljcHVfdG9fbGUzMih0YXJnZXRfc24pLCBtZ210LT5zYSwgMCwgdHRsLAogCQkJCWNwdV90b19sZTMyKGxpZmV0aW1lKSwgY3B1X3RvX2xlMzIobWV0cmljKSwKIAkJCQkwLCBzZGF0YSk7CiAJCX0gZWxzZQpAQCAtNjE4LDE0ICs2MjIsOCBAQAogCiAJbWh3bXBfZGJnKCJyZWNlaXZlZCBQUkVQIGZyb20gJXBNIiwgUFJFUF9JRV9PUklHX0FERFIocHJlcF9lbGVtKSk7CiAKLQkvKiBOb3RlIHRoYXQgd2UgZGl2ZXJ0IGZyb20gdGhlIGRyYWZ0IG5vbWVuY2xhdHVyZSBhbmQgZGVub21pbmF0ZQotCSAqIGRlc3RpbmF0aW9uIHRvIHdoYXQgdGhlIGRyYWZ0IHJlZmVycyB0byBhcyBvcmlnaW5pbmF0b3IuIFNvIGluIHRoaXMKLQkgKiBmdW5jdGlvbiBkZXN0bmF0aW9uIHJlZmVycyB0byB0aGUgZmluYWwgZGVzdGluYXRpb24gb2YgdGhlIFBSRVAsCi0JICogd2hpY2ggY29ycmVzcG9uZHMgd2l0aCB0aGUgb3JpZ2luYXRvciBvZiB0aGUgUFJFUSB3aGljaCB0aGlzIFBSRVAKLQkgKiByZXBsaWVzCi0JICovCi0JdGFyZ2V0X2FkZHIgPSBQUkVQX0lFX1RBUkdFVF9BRERSKHByZXBfZWxlbSk7Ci0JaWYgKG1lbWNtcCh0YXJnZXRfYWRkciwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTikgPT0gMCkKKwlvcmlnX2FkZHIgPSBQUkVQX0lFX09SSUdfQUREUihwcmVwX2VsZW0pOworCWlmIChtZW1jbXAob3JpZ19hZGRyLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKSA9PSAwKQogCQkvKiBkZXN0aW5hdGlvbiwgbm8gZm9yd2FyZGluZyByZXF1aXJlZCAqLwogCQlyZXR1cm47CiAKQEAgLTYzNiw3ICs2MzQsNyBAQAogCX0KIAogCXJjdV9yZWFkX2xvY2soKTsKLQltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAodGFyZ2V0X2FkZHIsIHNkYXRhKTsKKwltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAob3JpZ19hZGRyLCBzZGF0YSk7CiAJaWYgKG1wYXRoKQogCQlzcGluX2xvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKIAllbHNlCkBAIC02NTEsNyArNjQ5LDcgQEAKIAlmbGFncyA9IFBSRVBfSUVfRkxBR1MocHJlcF9lbGVtKTsKIAlsaWZldGltZSA9IFBSRVBfSUVfTElGRVRJTUUocHJlcF9lbGVtKTsKIAlob3Bjb3VudCA9IFBSRVBfSUVfSE9QQ09VTlQocHJlcF9lbGVtKSArIDE7Ci0Jb3JpZ19hZGRyID0gUFJFUF9JRV9PUklHX0FERFIocHJlcF9lbGVtKTsKKwl0YXJnZXRfYWRkciA9IFBSRVBfSUVfVEFSR0VUX0FERFIocHJlcF9lbGVtKTsKIAl0YXJnZXRfc24gPSBQUkVQX0lFX1RBUkdFVF9TTihwcmVwX2VsZW0pOwogCW9yaWdfc24gPSBQUkVQX0lFX09SSUdfU04ocHJlcF9lbGVtKTsKIApAQCAtODY3LDkgKzg2NSwyMCBAQAogCQlyZXR1cm47CiAJfQogCisJc3Bpbl9sb2NrKCZtcGF0aC0+c3RhdGVfbG9jayk7CisJaWYgKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9SRVFfUVVFVUVEKSB7CisJCXNwaW5fdW5sb2NrKCZtcGF0aC0+c3RhdGVfbG9jayk7CisJCXNwaW5fdW5sb2NrX2JoKCZpZm1zaC0+bWVzaF9wcmVxX3F1ZXVlX2xvY2spOworCQlrZnJlZShwcmVxX25vZGUpOworCQlyZXR1cm47CisJfQorCiAJbWVtY3B5KHByZXFfbm9kZS0+ZHN0LCBtcGF0aC0+ZHN0LCBFVEhfQUxFTik7CiAJcHJlcV9ub2RlLT5mbGFncyA9IGZsYWdzOwogCisJbXBhdGgtPmZsYWdzIHw9IE1FU0hfUEFUSF9SRVFfUVVFVUVEOworCXNwaW5fdW5sb2NrKCZtcGF0aC0+c3RhdGVfbG9jayk7CisKIAlsaXN0X2FkZF90YWlsKCZwcmVxX25vZGUtPmxpc3QsICZpZm1zaC0+cHJlcV9xdWV1ZS5saXN0KTsKIAkrK2lmbXNoLT5wcmVxX3F1ZXVlX2xlbjsKIAlzcGluX3VubG9ja19iaCgmaWZtc2gtPm1lc2hfcHJlcV9xdWV1ZV9sb2NrKTsKQEAgLTkyMSw2ICs5MzAsNyBAQAogCQlnb3RvIGVuZGRpc2NvdmVyeTsKIAogCXNwaW5fbG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOworCW1wYXRoLT5mbGFncyAmPSB+TUVTSF9QQVRIX1JFUV9RVUVVRUQ7CiAJaWYgKHByZXFfbm9kZS0+ZmxhZ3MgJiBQUkVRX1FfRl9TVEFSVCkgewogCQlpZiAobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX1JFU09MVklORykgewogCQkJc3Bpbl91bmxvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKQEAgLTk3Miw3MSArOTgyLDk3IEBACiAJa2ZyZWUocHJlcV9ub2RlKTsKIH0KIAotLyoqCi0gKiBtZXNoX25leHRob3BfbG9va3VwIC0gcHV0IHRoZSBhcHByb3ByaWF0ZSBuZXh0IGhvcCBvbiBhIG1lc2ggZnJhbWUKKy8qIG1lc2hfbmV4dGhvcF9yZXNvbHZlIC0gbG9va3VwIG5leHQgaG9wIGZvciBnaXZlbiBza2IgYW5kIHN0YXJ0IHBhdGgKKyAqIGRpc2NvdmVyeSBpZiBubyBmb3J3YXJkaW5nIGluZm9ybWF0aW9uIGlzIGZvdW5kLgogICoKICAqIEBza2I6IDgwMi4xMSBmcmFtZSB0byBiZSBzZW50CiAgKiBAc2RhdGE6IG5ldHdvcmsgc3ViaWYgdGhlIGZyYW1lIHdpbGwgYmUgc2VudCB0aHJvdWdoCiAgKgotICogUmV0dXJuczogMCBpZiB0aGUgbmV4dCBob3Agd2FzIGZvdW5kLiBOb256ZXJvIG90aGVyd2lzZS4gSWYgbm8gbmV4dCBob3AgaXMKLSAqIGZvdW5kLCB0aGUgZnVuY3Rpb24gd2lsbCBzdGFydCBhIHBhdGggZGlzY292ZXJ5IGFuZCBxdWV1ZSB0aGUgZnJhbWUgc28gaXQgaXMKLSAqIHNlbnQgd2hlbiB0aGUgcGF0aCBpcyByZXNvbHZlZC4gVGhpcyBtZWFucyB0aGUgY2FsbGVyIG11c3Qgbm90IGZyZWUgdGhlIHNrYgotICogaW4gdGhpcyBjYXNlLgorICogUmV0dXJuczogMCBpZiB0aGUgbmV4dCBob3Agd2FzIGZvdW5kIGFuZCAtRU5PRU5UIGlmIHRoZSBmcmFtZSB3YXMgcXVldWVkLgorICogc2tiIGlzIGZyZWVlZCBoZXJlIGlmIG5vIG1wYXRoIGNvdWxkIGJlIGFsbG9jYXRlZC4KICAqLwotaW50IG1lc2hfbmV4dGhvcF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKLQkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoraW50IG1lc2hfbmV4dGhvcF9yZXNvbHZlKHN0cnVjdCBza19idWZmICpza2IsCisJCQkgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYl90b19mcmVlID0gTlVMTDsKLQlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKLQlzdHJ1Y3Qgc3RhX2luZm8gKm5leHRfaG9wOwogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiX3RvX2ZyZWUgPSBOVUxMOwogCXU4ICp0YXJnZXRfYWRkciA9IGhkci0+YWRkcjM7CiAJaW50IGVyciA9IDA7CiAKIAlyY3VfcmVhZF9sb2NrKCk7Ci0JbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKHRhcmdldF9hZGRyLCBzZGF0YSk7CisJZXJyID0gbWVzaF9uZXh0aG9wX2xvb2t1cChza2IsIHNkYXRhKTsKKwlpZiAoIWVycikKKwkJZ290byBlbmRsb29rdXA7CiAKKwkvKiBubyBuZXh0aG9wIGZvdW5kLCBzdGFydCByZXNvbHZpbmcgKi8KKwltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAodGFyZ2V0X2FkZHIsIHNkYXRhKTsKIAlpZiAoIW1wYXRoKSB7CiAJCW1lc2hfcGF0aF9hZGQodGFyZ2V0X2FkZHIsIHNkYXRhKTsKIAkJbXBhdGggPSBtZXNoX3BhdGhfbG9va3VwKHRhcmdldF9hZGRyLCBzZGF0YSk7CiAJCWlmICghbXBhdGgpIHsKLQkJCXNkYXRhLT51Lm1lc2gubXNoc3RhdHMuZHJvcHBlZF9mcmFtZXNfbm9fcm91dGUrKzsKKwkJCW1lc2hfcGF0aF9kaXNjYXJkX2ZyYW1lKHNrYiwgc2RhdGEpOwogCQkJZXJyID0gLUVOT1NQQzsKIAkJCWdvdG8gZW5kbG9va3VwOwogCQl9CiAJfQogCi0JaWYgKG1wYXRoLT5mbGFncyAmIE1FU0hfUEFUSF9BQ1RJVkUpIHsKLQkJaWYgKHRpbWVfYWZ0ZXIoamlmZmllcywKLQkJCSAgICAgICBtcGF0aC0+ZXhwX3RpbWUgLQotCQkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoc2RhdGEtPnUubWVzaC5tc2hjZmcucGF0aF9yZWZyZXNoX3RpbWUpKSAmJgotCQkgICAgIW1lbWNtcChzZGF0YS0+dmlmLmFkZHIsIGhkci0+YWRkcjQsIEVUSF9BTEVOKSAmJgotCQkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfUkVTT0xWSU5HKSAmJgotCQkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRklYRUQpKSB7Ci0JCQltZXNoX3F1ZXVlX3ByZXEobXBhdGgsCi0JCQkJCVBSRVFfUV9GX1NUQVJUIHwgUFJFUV9RX0ZfUkVGUkVTSCk7Ci0JCX0KLQkJbmV4dF9ob3AgPSByY3VfZGVyZWZlcmVuY2UobXBhdGgtPm5leHRfaG9wKTsKLQkJaWYgKG5leHRfaG9wKQotCQkJbWVtY3B5KGhkci0+YWRkcjEsIG5leHRfaG9wLT5zdGEuYWRkciwgRVRIX0FMRU4pOwotCQllbHNlCi0JCQllcnIgPSAtRU5PRU5UOwotCX0gZWxzZSB7Ci0JCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQkJaWYgKCEobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX1JFU09MVklORykpIHsKLQkJCS8qIFN0YXJ0IGRpc2NvdmVyeSBvbmx5IGlmIGl0IGlzIG5vdCBydW5uaW5nIHlldCAqLwotCQkJbWVzaF9xdWV1ZV9wcmVxKG1wYXRoLCBQUkVRX1FfRl9TVEFSVCk7Ci0JCX0KKwlpZiAoIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfUkVTT0xWSU5HKSkKKwkJbWVzaF9xdWV1ZV9wcmVxKG1wYXRoLCBQUkVRX1FfRl9TVEFSVCk7CiAKLQkJaWYgKHNrYl9xdWV1ZV9sZW4oJm1wYXRoLT5mcmFtZV9xdWV1ZSkgPj0KLQkJCQlNRVNIX0ZSQU1FX1FVRVVFX0xFTikKLQkJCXNrYl90b19mcmVlID0gc2tiX2RlcXVldWUoJm1wYXRoLT5mcmFtZV9xdWV1ZSk7CisJaWYgKHNrYl9xdWV1ZV9sZW4oJm1wYXRoLT5mcmFtZV9xdWV1ZSkgPj0gTUVTSF9GUkFNRV9RVUVVRV9MRU4pCisJCXNrYl90b19mcmVlID0gc2tiX2RlcXVldWUoJm1wYXRoLT5mcmFtZV9xdWV1ZSk7CiAKLQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0lOVEZMX05FRURfVFhQUk9DRVNTSU5HOwotCQlza2JfcXVldWVfdGFpbCgmbXBhdGgtPmZyYW1lX3F1ZXVlLCBza2IpOwotCQlpZiAoc2tiX3RvX2ZyZWUpCi0JCQltZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShza2JfdG9fZnJlZSwgc2RhdGEpOwotCQllcnIgPSAtRU5PRU5UOworCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9JTlRGTF9ORUVEX1RYUFJPQ0VTU0lORzsKKwlpZWVlODAyMTFfc2V0X3Fvc19oZHIoc2RhdGEsIHNrYik7CisJc2tiX3F1ZXVlX3RhaWwoJm1wYXRoLT5mcmFtZV9xdWV1ZSwgc2tiKTsKKwllcnIgPSAtRU5PRU5UOworCWlmIChza2JfdG9fZnJlZSkKKwkJbWVzaF9wYXRoX2Rpc2NhcmRfZnJhbWUoc2tiX3RvX2ZyZWUsIHNkYXRhKTsKKworZW5kbG9va3VwOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBlcnI7Cit9CisvKioKKyAqIG1lc2hfbmV4dGhvcF9sb29rdXAgLSBwdXQgdGhlIGFwcHJvcHJpYXRlIG5leHQgaG9wIG9uIGEgbWVzaCBmcmFtZS4gQ2FsbGluZworICogdGhpcyBmdW5jdGlvbiBpcyBjb25zaWRlcmVkICJ1c2luZyIgdGhlIGFzc29jaWF0ZWQgbXBhdGgsIHNvIHByZWVtcHQgYSBwYXRoCisgKiByZWZyZXNoIGlmIHRoaXMgbXBhdGggZXhwaXJlcyBzb29uLgorICoKKyAqIEBza2I6IDgwMi4xMSBmcmFtZSB0byBiZSBzZW50CisgKiBAc2RhdGE6IG5ldHdvcmsgc3ViaWYgdGhlIGZyYW1lIHdpbGwgYmUgc2VudCB0aHJvdWdoCisgKgorICogUmV0dXJuczogMCBpZiB0aGUgbmV4dCBob3Agd2FzIGZvdW5kLiBOb256ZXJvIG90aGVyd2lzZS4KKyAqLworaW50IG1lc2hfbmV4dGhvcF9sb29rdXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhKQoreworCXN0cnVjdCBtZXNoX3BhdGggKm1wYXRoOworCXN0cnVjdCBzdGFfaW5mbyAqbmV4dF9ob3A7CisJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJdTggKnRhcmdldF9hZGRyID0gaGRyLT5hZGRyMzsKKwlpbnQgZXJyID0gLUVOT0VOVDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAodGFyZ2V0X2FkZHIsIHNkYXRhKTsKKworCWlmICghbXBhdGggfHwgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfQUNUSVZFKSkKKwkJZ290byBlbmRsb29rdXA7CisKKwlpZiAodGltZV9hZnRlcihqaWZmaWVzLAorCQkgICAgICAgbXBhdGgtPmV4cF90aW1lIC0KKwkJICAgICAgIG1zZWNzX3RvX2ppZmZpZXMoc2RhdGEtPnUubWVzaC5tc2hjZmcucGF0aF9yZWZyZXNoX3RpbWUpKSAmJgorCSAgICAhbWVtY21wKHNkYXRhLT52aWYuYWRkciwgaGRyLT5hZGRyNCwgRVRIX0FMRU4pICYmCisJICAgICEobXBhdGgtPmZsYWdzICYgTUVTSF9QQVRIX1JFU09MVklORykgJiYKKwkgICAgIShtcGF0aC0+ZmxhZ3MgJiBNRVNIX1BBVEhfRklYRUQpKQorCQltZXNoX3F1ZXVlX3ByZXEobXBhdGgsIFBSRVFfUV9GX1NUQVJUIHwgUFJFUV9RX0ZfUkVGUkVTSCk7CisKKwluZXh0X2hvcCA9IHJjdV9kZXJlZmVyZW5jZShtcGF0aC0+bmV4dF9ob3ApOworCWlmIChuZXh0X2hvcCkgeworCQltZW1jcHkoaGRyLT5hZGRyMSwgbmV4dF9ob3AtPnN0YS5hZGRyLCBFVEhfQUxFTik7CisJCW1lbWNweShoZHItPmFkZHIyLCBzZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKKwkJZXJyID0gMDsKIAl9CiAKIGVuZGxvb2t1cDoKQEAgLTEwNjEsNiArMTA5Nyw3IEBACiAJfSBlbHNlIGlmIChtcGF0aC0+ZGlzY292ZXJ5X3JldHJpZXMgPCBtYXhfcHJlcV9yZXRyaWVzKHNkYXRhKSkgewogCQkrK21wYXRoLT5kaXNjb3ZlcnlfcmV0cmllczsKIAkJbXBhdGgtPmRpc2NvdmVyeV90aW1lb3V0ICo9IDI7CisJCW1wYXRoLT5mbGFncyAmPSB+TUVTSF9QQVRIX1JFUV9RVUVVRUQ7CiAJCXNwaW5fdW5sb2NrX2JoKCZtcGF0aC0+c3RhdGVfbG9jayk7CiAJCW1lc2hfcXVldWVfcHJlcShtcGF0aCwgMCk7CiAJfSBlbHNlIHsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYyBiL25ldC9tYWM4MDIxMS9tZXNoX3BhdGh0YmwuYwppbmRleCA3ZjU0YzUwLi5lZGYxNjdlIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9wYXRodGJsLmMKKysrIGIvbmV0L21hYzgwMjExL21lc2hfcGF0aHRibC5jCkBAIC02OSw4ICs2OSw2IEBACiAJCWxvY2tkZXBfaXNfaGVsZCgmcGF0aHRibF9yZXNpemVfbG9jaykpOwogfQogCi1zdGF0aWMgaW50IG1lc2hfZ2F0ZV9hZGQoc3RydWN0IG1lc2hfdGFibGUgKnRibCwgc3RydWN0IG1lc2hfcGF0aCAqbXBhdGgpOwotCiAvKgogICogQ0FSRUZVTCAtLSAidGJsIiBtdXN0IG5vdCBiZSBhbiBleHByZXNzaW9uLAogICogaW4gcGFydGljdWxhciBub3QgYW4gcmN1X2RlcmVmZXJlbmNlKCksIHNpbmNlCkBAIC0yMTMsNyArMjExLDYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCXN0cnVjdCBza19idWZmX2hlYWQgdG1wcTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gbXBhdGgtPnNkYXRhOwogCiAJcmN1X2Fzc2lnbl9wb2ludGVyKG1wYXRoLT5uZXh0X2hvcCwgc3RhKTsKIApAQCAtMjI0LDggKzIyMSw3IEBACiAJd2hpbGUgKChza2IgPSBfX3NrYl9kZXF1ZXVlKCZtcGF0aC0+ZnJhbWVfcXVldWUpKSAhPSBOVUxMKSB7CiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJCW1lbWNweShoZHItPmFkZHIxLCBzdGEtPnN0YS5hZGRyLCBFVEhfQUxFTik7Ci0JCXNrYl9zZXRfcXVldWVfbWFwcGluZyhza2IsIGllZWU4MDIxMV9zZWxlY3RfcXVldWUoc2RhdGEsIHNrYikpOwotCQlpZWVlODAyMTFfc2V0X3Fvc19oZHIoc2RhdGEsIHNrYik7CisJCW1lbWNweShoZHItPmFkZHIyLCBtcGF0aC0+c2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7CiAJCV9fc2tiX3F1ZXVlX3RhaWwoJnRtcHEsIHNrYik7CiAJfQogCkBAIC0yNjksNiArMjY1LDcgQEAKIAluZXh0X2hvcCA9IHJjdV9kZXJlZmVyZW5jZShnYXRlX21wYXRoLT5uZXh0X2hvcCktPnN0YS5hZGRyOwogCW1lbWNweShoZHItPmFkZHIxLCBuZXh0X2hvcCwgRVRIX0FMRU4pOwogCXJjdV9yZWFkX3VubG9jaygpOworCW1lbWNweShoZHItPmFkZHIyLCBnYXRlX21wYXRoLT5zZGF0YS0+dmlmLmFkZHIsIEVUSF9BTEVOKTsKIAltZW1jcHkoaGRyLT5hZGRyMywgZHN0X2FkZHIsIEVUSF9BTEVOKTsKIH0KIApAQCAtNDIzLDIxICs0MjAsMTggQEAKIH0KIAogLyoqCi0gKiBtZXNoX2dhdGVfYWRkIC0gbWFyayBtcGF0aCBhcyBwYXRoIHRvIGEgbWVzaCBnYXRlIGFuZCBhZGQgdG8ga25vd25fZ2F0ZXMKLSAqIEBtZXNoX3RibDogdGFibGUgd2hpY2ggY29udGFpbnMga25vd25fZ2F0ZXMgbGlzdAotICogQG1wYXRoOiBtcGF0aCB0byBrbm93biBtZXNoIGdhdGUKLSAqCi0gKiBSZXR1cm5zOiAwIG9uIHN1Y2Nlc3MKLSAqCisgKiBtZXNoX3BhdGhfYWRkX2dhdGUgLSBhZGQgdGhlIGdpdmVuIG1wYXRoIHRvIGEgbWVzaCBnYXRlIHRvIG91ciBwYXRoIHRhYmxlCisgKiBAbXBhdGg6IGdhdGUgcGF0aCB0byBhZGQgdG8gdGFibGUKICAqLwotc3RhdGljIGludCBtZXNoX2dhdGVfYWRkKHN0cnVjdCBtZXNoX3RhYmxlICp0YmwsIHN0cnVjdCBtZXNoX3BhdGggKm1wYXRoKQoraW50IG1lc2hfcGF0aF9hZGRfZ2F0ZShzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aCkKIHsKKwlzdHJ1Y3QgbWVzaF90YWJsZSAqdGJsOwogCXN0cnVjdCBtcGF0aF9ub2RlICpnYXRlLCAqbmV3X2dhdGU7CiAJc3RydWN0IGhsaXN0X25vZGUgKm47CiAJaW50IGVycjsKIAogCXJjdV9yZWFkX2xvY2soKTsKLQl0YmwgPSByY3VfZGVyZWZlcmVuY2UodGJsKTsKKwl0YmwgPSByY3VfZGVyZWZlcmVuY2UobWVzaF9wYXRocyk7CiAKIAlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoZ2F0ZSwgbiwgdGJsLT5rbm93bl9nYXRlcywgbGlzdCkKIAkJaWYgKGdhdGUtPm1wYXRoID09IG1wYXRoKSB7CkBAIC00ODEsOCArNDc1LDYgQEAKIAlzdHJ1Y3QgbXBhdGhfbm9kZSAqZ2F0ZTsKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSAqcCwgKnE7CiAKLQl0YmwgPSByY3VfZGVyZWZlcmVuY2UodGJsKTsKLQogCWhsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZ2F0ZSwgcCwgcSwgdGJsLT5rbm93bl9nYXRlcywgbGlzdCkKIAkJaWYgKGdhdGUtPm1wYXRoID09IG1wYXRoKSB7CiAJCQlzcGluX2xvY2tfYmgoJnRibC0+Z2F0ZXNfbG9jayk7CkBAIC01MDEsMTYgKzQ5Myw2IEBACiB9CiAKIC8qKgotICoKLSAqIG1lc2hfcGF0aF9hZGRfZ2F0ZSAtIGFkZCB0aGUgZ2l2ZW4gbXBhdGggdG8gYSBtZXNoIGdhdGUgdG8gb3VyIHBhdGggdGFibGUKLSAqIEBtcGF0aDogZ2F0ZSBwYXRoIHRvIGFkZCB0byB0YWJsZQotICovCi1pbnQgbWVzaF9wYXRoX2FkZF9nYXRlKHN0cnVjdCBtZXNoX3BhdGggKm1wYXRoKQotewotCXJldHVybiBtZXNoX2dhdGVfYWRkKG1lc2hfcGF0aHMsIG1wYXRoKTsKLX0KLQotLyoqCiAgKiBtZXNoX2dhdGVfbnVtIC0gbnVtYmVyIG9mIGdhdGVzIGtub3duIHRvIHRoaXMgaW50ZXJmYWNlCiAgKiBAc2RhdGE6IHN1YmlmIGRhdGEKICAqLwpAQCAtOTkxLDM4ICs5NzMsMTEgQEAKICAqIEBza2I6IGZyYW1lIHRvIGRpc2NhcmQKICAqIEBzZGF0YTogbmV0d29yayBzdWJpZiB0aGUgZnJhbWUgd2FzIHRvIGJlIHNlbnQgdGhyb3VnaAogICoKLSAqIElmIHRoZSBmcmFtZSB3YXMgYmVpbmcgZm9yd2FyZGVkIGZyb20gYW5vdGhlciBNUCwgYSBQRVJSIGZyYW1lIHdpbGwgYmUgc2VudAotICogdG8gdGhlIHByZWN1cnNvci4gIFRoZSBwcmVjdXJzb3IncyBhZGRyZXNzIChpLmUuIHRoZSBwcmV2aW91cyBob3ApIHdhcyBzYXZlZAotICogaW4gYWRkcjEgb2YgdGhlIGZyYW1lLXRvLWJlLWZvcndhcmRlZCwgYW5kIHdvdWxkIG9ubHkgYmUgb3ZlcndyaXR0ZW4gb25jZQotICogdGhlIGRlc3RpbmF0aW9uIGlzIHN1Y2Nlc3NmdWxseSByZXNvbHZlZC4KLSAqCiAgKiBMb2NraW5nOiB0aGUgZnVuY3Rpb24gbXVzdCBtZSBjYWxsZWQgd2l0aGluIGEgcmN1X3JlYWRfbG9jayByZWdpb24KICAqLwogdm9pZCBtZXNoX3BhdGhfZGlzY2FyZF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSkKIHsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKLQlzdHJ1Y3QgbWVzaF9wYXRoICptcGF0aDsKLQl1MzIgc24gPSAwOwotCV9fbGUxNiByZWFzb24gPSBjcHVfdG9fbGUxNihXTEFOX1JFQVNPTl9NRVNIX1BBVEhfTk9GT1JXQVJEKTsKLQotCWlmIChtZW1jbXAoaGRyLT5hZGRyNCwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTikgIT0gMCkgewotCQl1OCAqcmEsICpkYTsKLQotCQlkYSA9IGhkci0+YWRkcjM7Ci0JCXJhID0gaGRyLT5hZGRyMTsKLQkJcmN1X3JlYWRfbG9jaygpOwotCQltcGF0aCA9IG1lc2hfcGF0aF9sb29rdXAoZGEsIHNkYXRhKTsKLQkJaWYgKG1wYXRoKSB7Ci0JCQlzcGluX2xvY2tfYmgoJm1wYXRoLT5zdGF0ZV9sb2NrKTsKLQkJCXNuID0gKyttcGF0aC0+c247Ci0JCQlzcGluX3VubG9ja19iaCgmbXBhdGgtPnN0YXRlX2xvY2spOwotCQl9Ci0JCXJjdV9yZWFkX3VubG9jaygpOwotCQltZXNoX3BhdGhfZXJyb3JfdHgoc2RhdGEtPnUubWVzaC5tc2hjZmcuZWxlbWVudF90dGwsIHNrYi0+ZGF0YSwKLQkJCQkgICBjcHVfdG9fbGUzMihzbiksIHJlYXNvbiwgcmEsIHNkYXRhKTsKLQl9Ci0KIAlrZnJlZV9za2Ioc2tiKTsKIAlzZGF0YS0+dS5tZXNoLm1zaHN0YXRzLmRyb3BwZWRfZnJhbWVzX25vX3JvdXRlKys7CiB9CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jIGIvbmV0L21hYzgwMjExL21lc2hfcGxpbmsuYwppbmRleCA3ZTU3ZjVkLi40MWVmMWI0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvbWVzaF9wbGluay5jCisrKyBiL25ldC9tYWM4MDIxMS9tZXNoX3BsaW5rLmMKQEAgLTgwLDExICs4MCwxNSBAQAogICogICAgICAgb24gaXQgaW4gdGhlIGxpZmVjeWNsZSBtYW5hZ2VtZW50IHNlY3Rpb24hCiAgKi8KIHN0YXRpYyBzdHJ1Y3Qgc3RhX2luZm8gKm1lc2hfcGxpbmtfYWxsb2Moc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCi0JCQkJCSB1OCAqaHdfYWRkciwgdTMyIHJhdGVzKQorCQkJCQkgdTggKmh3X2FkZHIsIHUzMiByYXRlcywKKwkJCQkJIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHNkYXRhLT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAorCXNiYW5kID0gbG9jYWwtPmh3LndpcGh5LT5iYW5kc1tsb2NhbC0+b3Blcl9jaGFubmVsLT5iYW5kXTsKKwogCWlmIChsb2NhbC0+bnVtX3N0YSA+PSBNRVNIX01BWF9QTElOS1MpCiAJCXJldHVybiBOVUxMOwogCkBAIC05MiwxMCArOTYsMTcgQEAKIAlpZiAoIXN0YSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BVVRIKTsKLQlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BVVRIT1JJWkVEKTsKKwlzdGFfaW5mb19tb3ZlX3N0YXRlKHN0YSwgSUVFRTgwMjExX1NUQV9BVVRIKTsKKwlzdGFfaW5mb19tb3ZlX3N0YXRlKHN0YSwgSUVFRTgwMjExX1NUQV9BU1NPQyk7CisJc3RhX2luZm9fbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVVUSE9SSVpFRCk7CisKIAlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9XTUUpOworCiAJc3RhLT5zdGEuc3VwcF9yYXRlc1tsb2NhbC0+aHcuY29uZi5jaGFubmVsLT5iYW5kXSA9IHJhdGVzOworCWlmIChlbGVtcy0+aHRfY2FwX2VsZW0pCisJCWllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzZGF0YSwgc2JhbmQsCisJCQkJCQkgIGVsZW1zLT5odF9jYXBfZWxlbSwKKwkJCQkJCSAgJnN0YS0+c3RhLmh0X2NhcCk7CiAJcmF0ZV9jb250cm9sX3JhdGVfaW5pdChzdGEpOwogCiAJcmV0dXJuIHN0YTsKQEAgLTE1MywyMyArMTY0LDMxIEBACiAJCWVudW0gaWVlZTgwMjExX3NlbGZfcHJvdGVjdGVkX2FjdGlvbmNvZGUgYWN0aW9uLAogCQl1OCAqZGEsIF9fbGUxNiBsbGlkLCBfX2xlMTYgcGxpZCwgX19sZTE2IHJlYXNvbikgewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc2RhdGEtPmxvY2FsOwotCXN0cnVjdCBza19idWZmICpza2IgPSBkZXZfYWxsb2Nfc2tiKGxvY2FsLT5ody5leHRyYV90eF9oZWFkcm9vbSArIDQwMCArCi0JCQlzZGF0YS0+dS5tZXNoLmllX2xlbik7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7CiAJYm9vbCBpbmNsdWRlX3BsaWQgPSBmYWxzZTsKLQlpbnQgaWVfbGVuID0gNDsKIAl1MTYgcGVlcmluZ19wcm90byA9IDA7Ci0JdTggKnBvczsKKwl1OCAqcG9zLCBpZV9sZW4gPSA0OworCWludCBoZHJfbGVuID0gb2Zmc2V0b2Yoc3RydWN0IGllZWU4MDIxMV9tZ210LCB1LmFjdGlvbi51LnNlbGZfcHJvdCkgKworCQkgICAgICBzaXplb2YobWdtdC0+dS5hY3Rpb24udS5zZWxmX3Byb3QpOwogCisJc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20gKworCQkJICAgIGhkcl9sZW4gKworCQkJICAgIDIgKyAvKiBjYXBhYmlsaXR5IGluZm8gKi8KKwkJCSAgICAyICsgLyogQUlEICovCisJCQkgICAgMiArIDggKyAvKiBzdXBwb3J0ZWQgcmF0ZXMgKi8KKwkJCSAgICAyICsgKElFRUU4MDIxMV9NQVhfU1VQUF9SQVRFUyAtIDgpICsKKwkJCSAgICAyICsgc2RhdGEtPnUubWVzaC5tZXNoX2lkX2xlbiArCisJCQkgICAgMiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21lc2hjb25mX2llKSArCisJCQkgICAgMiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkgKworCQkJICAgIDIgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9pbmZvKSArCisJCQkgICAgMiArIDggKyAvKiBwZWVyaW5nIElFICovCisJCQkgICAgc2RhdGEtPnUubWVzaC5pZV9sZW4pOwogCWlmICghc2tiKQogCQlyZXR1cm4gLTE7CiAJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOwotCS8qIDI1IGlzIHRoZSBzaXplIG9mIHRoZSBjb21tb24gbWdtdCBwYXJ0ICgyNCkgcGx1cyB0aGUgc2l6ZSBvZiB0aGUKLQkgKiBjb21tb24gYWN0aW9uIHBhcnQgKDEpCi0JICovCi0JbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikKLQkJc2tiX3B1dChza2IsIDI1ICsgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuc2VsZl9wcm90KSk7Ci0JbWVtc2V0KG1nbXQsIDAsIDI1ICsgc2l6ZW9mKG1nbXQtPnUuYWN0aW9uLnUuc2VsZl9wcm90KSk7CisJbWdtdCA9IChzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKikgc2tiX3B1dChza2IsIGhkcl9sZW4pOworCW1lbXNldChtZ210LCAwLCBoZHJfbGVuKTsKIAltZ210LT5mcmFtZV9jb250cm9sID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZUWVBFX01HTVQgfAogCQkJCQkgIElFRUU4MDIxMV9TVFlQRV9BQ1RJT04pOwogCW1lbWNweShtZ210LT5kYSwgZGEsIEVUSF9BTEVOKTsKQEAgLTIzNSw2ICsyNTQsMTMgQEAKIAkJbWVtY3B5KHBvcywgJnJlYXNvbiwgMik7CiAJCXBvcyArPSAyOwogCX0KKworCWlmIChhY3Rpb24gIT0gV0xBTl9TUF9NRVNIX1BFRVJJTkdfQ0xPU0UpIHsKKwkJaWYgKG1lc2hfYWRkX2h0X2NhcF9pZShza2IsIHNkYXRhKSB8fAorCQkgICAgbWVzaF9hZGRfaHRfaW5mb19pZShza2IsIHNkYXRhKSkKKwkJCXJldHVybiAtMTsKKwl9CisKIAlpZiAobWVzaF9hZGRfdmVuZG9yX2llcyhza2IsIHNkYXRhKSkKIAkJcmV0dXJuIC0xOwogCkBAIC0yNjEsNyArMjg3LDcgQEAKIAkJCQkJZWxlbXMtPmllX3N0YXJ0LCBlbGVtcy0+dG90YWxfbGVuLAogCQkJCQlHRlBfS0VSTkVMKTsKIAkJZWxzZQotCQkJc3RhID0gbWVzaF9wbGlua19hbGxvYyhzZGF0YSwgaHdfYWRkciwgcmF0ZXMpOworCQkJc3RhID0gbWVzaF9wbGlua19hbGxvYyhzZGF0YSwgaHdfYWRkciwgcmF0ZXMsIGVsZW1zKTsKIAkJaWYgKCFzdGEpCiAJCQlyZXR1cm47CiAJCWlmIChzdGFfaW5mb19pbnNlcnRfcmN1KHN0YSkpIHsKQEAgLTU1Miw3ICs1NzgsNyBAQAogCQl9CiAKIAkJcmF0ZXMgPSBpZWVlODAyMTFfc3RhX2dldF9yYXRlcyhsb2NhbCwgJmVsZW1zLCByeF9zdGF0dXMtPmJhbmQpOwotCQlzdGEgPSBtZXNoX3BsaW5rX2FsbG9jKHNkYXRhLCBtZ210LT5zYSwgcmF0ZXMpOworCQlzdGEgPSBtZXNoX3BsaW5rX2FsbG9jKHNkYXRhLCBtZ210LT5zYSwgcmF0ZXMsICZlbGVtcyk7CiAJCWlmICghc3RhKSB7CiAJCQltcGxfZGJnKCJNZXNoIHBsaW5rIGVycm9yOiBwbGluayB0YWJsZSBmdWxsXG4iKTsKIAkJCXJldHVybjsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9tbG1lLmMgYi9uZXQvbWFjODAyMTEvbWxtZS5jCmluZGV4IGIxYjFiYjMuLmVjYjRjODQgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS9tbG1lLmMKKysrIGIvbmV0L21hYzgwMjExL21sbWUuYwpAQCAtMjA5LDYgKzIwOSw3IEBACiAJCWNoYW5uZWxfdHlwZSA9IE5MODAyMTFfQ0hBTl9IVDIwOwogCiAJCWlmICghKGFwX2h0X2NhcF9mbGFncyAmIElFRUU4MDIxMV9IVF9DQVBfNDBNSFpfSU5UT0xFUkFOVCkgJiYKKwkJICAgICFpZWVlODAxMTFfY2ZnX292ZXJyaWRlX2Rpc2FibGVzX2h0NDAoc2RhdGEpICYmCiAJCSAgICAoc2JhbmQtPmh0X2NhcC5jYXAgJiBJRUVFODAyMTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MCkgJiYKIAkJICAgIChodGktPmh0X3BhcmFtICYgSUVFRTgwMjExX0hUX1BBUkFNX0NIQU5fV0lEVEhfQU5ZKSkgewogCQkJc3dpdGNoKGh0aS0+aHRfcGFyYW0gJiBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19PRkZTRVQpIHsKQEAgLTgxOCw3ICs4MTksNyBAQAogCX0KIAogCWlmICgobG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX1BTX05VTExGVU5DX1NUQUNLKSAmJgotCSAgICAoIShpZm1nZC0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX05VTExGVU5DX0FDS0VEKSkpIHsKKwkgICAgIShpZm1nZC0+ZmxhZ3MgJiBJRUVFODAyMTFfU1RBX05VTExGVU5DX0FDS0VEKSkgewogCQluZXRpZl90eF9zdG9wX2FsbF9xdWV1ZXMoc2RhdGEtPmRldik7CiAKIAkJaWYgKGRydl90eF9mcmFtZXNfcGVuZGluZyhsb2NhbCkpCkBAIC0xMTIwLDYgKzExMjEsOCBAQAogCiAJLyogb24gdGhlIG5leHQgYXNzb2MsIHJlLXByb2dyYW0gSFQgcGFyYW1ldGVycyAqLwogCXNkYXRhLT5odF9vcG1vZGVfdmFsaWQgPSBmYWxzZTsKKwltZW1zZXQoJmlmbWdkLT5odF9jYXBhLCAwLCBzaXplb2YoaWZtZ2QtPmh0X2NhcGEpKTsKKwltZW1zZXQoJmlmbWdkLT5odF9jYXBhX21hc2ssIDAsIHNpemVvZihpZm1nZC0+aHRfY2FwYV9tYXNrKSk7CiAKIAlsb2NhbC0+cG93ZXJfY29uc3RyX2xldmVsID0gMDsKIApAQCAtMTM1OSw5ICsxMzYyLDYgQEAKIAlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCB0cnVlLCB0cnVlKTsKIAltdXRleF91bmxvY2soJmlmbWdkLT5tdHgpOwogCi0JbXV0ZXhfbG9jaygmbG9jYWwtPm10eCk7Ci0JaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKLQltdXRleF91bmxvY2soJmxvY2FsLT5tdHgpOwogCS8qCiAJICogbXVzdCBiZSBvdXRzaWRlIGxvY2sgZHVlIHRvIGNmZzgwMjExLAogCSAqIGJ1dCB0aGF0J3Mgbm90IGEgcHJvYmxlbS4KQEAgLTEzNzAsNiArMTM3MCwxMCBAQAogCQkJCSAgICAgICBJRUVFODAyMTFfU1RZUEVfREVBVVRILAogCQkJCSAgICAgICBXTEFOX1JFQVNPTl9ESVNBU1NPQ19EVUVfVE9fSU5BQ1RJVklUWSwKIAkJCQkgICAgICAgTlVMTCwgdHJ1ZSk7CisKKwltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKKwlpZWVlODAyMTFfcmVjYWxjX2lkbGUobG9jYWwpOworCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CiB9CiAKIHZvaWQgaWVlZTgwMjExX2JlYWNvbl9jb25uZWN0aW9uX2xvc3Nfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCkBAIC0xMzc3LDYgKzEzODEsMTYgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9CiAJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLAogCQkJICAgICB1Lm1nZC5iZWFjb25fY29ubmVjdGlvbl9sb3NzX3dvcmspOworCXN0cnVjdCBpZWVlODAyMTFfaWZfbWFuYWdlZCAqaWZtZ2QgPSAmc2RhdGEtPnUubWdkOworCXN0cnVjdCBzdGFfaW5mbyAqc3RhOworCisJaWYgKGlmbWdkLT5hc3NvY2lhdGVkKSB7CisJCXJjdV9yZWFkX2xvY2soKTsKKwkJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBpZm1nZC0+YnNzaWQpOworCQlpZiAoc3RhKQorCQkJc3RhLT5iZWFjb25fbG9zc19jb3VudCsrOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CiAKIAlpZiAoc2RhdGEtPmxvY2FsLT5ody5mbGFncyAmIElFRUU4MDIxMV9IV19DT05ORUNUSU9OX01PTklUT1IpCiAJCV9faWVlZTgwMjExX2Nvbm5lY3Rpb25fbG9zcyhzZGF0YSk7CkBAIC0xNDY4LDYgKzE0ODIsNDcgQEAKIAlyZXR1cm4gUlhfTUdNVF9DRkc4MDIxMV9ESVNBU1NPQzsKIH0KIAorc3RhdGljIHZvaWQgaWVlZTgwMjExX2dldF9yYXRlcyhzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZCwKKwkJCQl1OCAqc3VwcF9yYXRlcywgdW5zaWduZWQgaW50IHN1cHBfcmF0ZXNfbGVuLAorCQkJCXUzMiAqcmF0ZXMsIHUzMiAqYmFzaWNfcmF0ZXMsCisJCQkJYm9vbCAqaGF2ZV9oaWdoZXJfdGhhbl8xMW1iaXQsCisJCQkJaW50ICptaW5fcmF0ZSwgaW50ICptaW5fcmF0ZV9pbmRleCkKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBzdXBwX3JhdGVzX2xlbjsgaSsrKSB7CisJCWludCByYXRlID0gKHN1cHBfcmF0ZXNbaV0gJiAweDdmKSAqIDU7CisJCWJvb2wgaXNfYmFzaWMgPSAhIShzdXBwX3JhdGVzW2ldICYgMHg4MCk7CisKKwkJaWYgKHJhdGUgPiAxMTApCisJCQkqaGF2ZV9oaWdoZXJfdGhhbl8xMW1iaXQgPSB0cnVlOworCisJCS8qCisJCSAqIEJTU19NRU1CRVJTSElQX1NFTEVDVE9SX0hUX1BIWSBpcyBkZWZpbmVkIGluIDgwMi4xMW4tMjAwOQorCQkgKiA3LjMuMi4yIGFzIGEgbWFnaWMgdmFsdWUgaW5zdGVhZCBvZiBhIHJhdGUuIEhlbmNlLCBza2lwIGl0LgorCQkgKgorCQkgKiBOb3RlOiBFdmVuIHRocm91Z2ggdGhlIG1lbWJlcnNoaXAgc2VsZWN0b3IgYW5kIHRoZSBiYXNpYworCQkgKgkgcmF0ZSBmbGFnIHNoYXJlIHRoZSBzYW1lIGJpdCwgdGhleSBhcmUgbm90IGV4YWN0bHkKKwkJICoJIHRoZSBzYW1lLgorCQkgKi8KKwkJaWYgKCEhKHN1cHBfcmF0ZXNbaV0gJiAweDgwKSAmJgorCQkgICAgKHN1cHBfcmF0ZXNbaV0gJiAweDdmKSA9PSBCU1NfTUVNQkVSU0hJUF9TRUxFQ1RPUl9IVF9QSFkpCisJCQljb250aW51ZTsKKworCQlmb3IgKGogPSAwOyBqIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGorKykgeworCQkJaWYgKHNiYW5kLT5iaXRyYXRlc1tqXS5iaXRyYXRlID09IHJhdGUpIHsKKwkJCQkqcmF0ZXMgfD0gQklUKGopOworCQkJCWlmIChpc19iYXNpYykKKwkJCQkJKmJhc2ljX3JhdGVzIHw9IEJJVChqKTsKKwkJCQlpZiAocmF0ZSA8ICptaW5fcmF0ZSkgeworCQkJCQkqbWluX3JhdGUgPSByYXRlOworCQkJCQkqbWluX3JhdGVfaW5kZXggPSBqOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KIAogc3RhdGljIGJvb2wgaWVlZTgwMjExX2Fzc29jX3N1Y2Nlc3Moc3RydWN0IGllZWU4MDIxMV93b3JrICp3aywKIAkJCQkgICAgc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210LCBzaXplX3QgbGVuKQpAQCAtMTQ4NCw3ICsxNTM5LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyBlbGVtczsKIAlzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICpic3NfY29uZiA9ICZzZGF0YS0+dmlmLmJzc19jb25mOwogCXUzMiBjaGFuZ2VkID0gMDsKLQlpbnQgaSwgaiwgZXJyOworCWludCBlcnI7CiAJYm9vbCBoYXZlX2hpZ2hlcl90aGFuXzExbWJpdCA9IGZhbHNlOwogCXUxNiBhcF9odF9jYXBfZmxhZ3M7CiAJaW50IG1pbl9yYXRlID0gSU5UX01BWCwgbWluX3JhdGVfaW5kZXggPSAtMTsKQEAgLTE1MzIsNTcgKzE1ODcsMjMgQEAKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FVVEgpOwotCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0FTU09DKTsKLQlzZXRfc3RhX2ZsYWcoc3RhLCBXTEFOX1NUQV9BU1NPQ19BUCk7CisJc3RhX2luZm9fbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVVUSCk7CisJc3RhX2luZm9fbW92ZV9zdGF0ZShzdGEsIElFRUU4MDIxMV9TVEFfQVNTT0MpOwogCWlmICghKGlmbWdkLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfQ09OVFJPTF9QT1JUKSkKLQkJc2V0X3N0YV9mbGFnKHN0YSwgV0xBTl9TVEFfQVVUSE9SSVpFRCk7CisJCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBJRUVFODAyMTFfU1RBX0FVVEhPUklaRUQpOwogCiAJcmF0ZXMgPSAwOwogCWJhc2ljX3JhdGVzID0gMDsKIAlzYmFuZCA9IGxvY2FsLT5ody53aXBoeS0+YmFuZHNbd2stPmNoYW4tPmJhbmRdOwogCi0JZm9yIChpID0gMDsgaSA8IGVsZW1zLnN1cHBfcmF0ZXNfbGVuOyBpKyspIHsKLQkJaW50IHJhdGUgPSAoZWxlbXMuc3VwcF9yYXRlc1tpXSAmIDB4N2YpICogNTsKLQkJYm9vbCBpc19iYXNpYyA9ICEhKGVsZW1zLnN1cHBfcmF0ZXNbaV0gJiAweDgwKTsKKwlpZWVlODAyMTFfZ2V0X3JhdGVzKHNiYW5kLCBlbGVtcy5zdXBwX3JhdGVzLCBlbGVtcy5zdXBwX3JhdGVzX2xlbiwKKwkJCSAgICAmcmF0ZXMsICZiYXNpY19yYXRlcywgJmhhdmVfaGlnaGVyX3RoYW5fMTFtYml0LAorCQkJICAgICZtaW5fcmF0ZSwgJm1pbl9yYXRlX2luZGV4KTsKIAotCQlpZiAocmF0ZSA+IDExMCkKLQkJCWhhdmVfaGlnaGVyX3RoYW5fMTFtYml0ID0gdHJ1ZTsKLQotCQlmb3IgKGogPSAwOyBqIDwgc2JhbmQtPm5fYml0cmF0ZXM7IGorKykgewotCQkJaWYgKHNiYW5kLT5iaXRyYXRlc1tqXS5iaXRyYXRlID09IHJhdGUpIHsKLQkJCQlyYXRlcyB8PSBCSVQoaik7Ci0JCQkJaWYgKGlzX2Jhc2ljKQotCQkJCQliYXNpY19yYXRlcyB8PSBCSVQoaik7Ci0JCQkJaWYgKHJhdGUgPCBtaW5fcmF0ZSkgewotCQkJCQltaW5fcmF0ZSA9IHJhdGU7Ci0JCQkJCW1pbl9yYXRlX2luZGV4ID0gajsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZWxlbXMuZXh0X3N1cHBfcmF0ZXNfbGVuOyBpKyspIHsKLQkJaW50IHJhdGUgPSAoZWxlbXMuZXh0X3N1cHBfcmF0ZXNbaV0gJiAweDdmKSAqIDU7Ci0JCWJvb2wgaXNfYmFzaWMgPSAhIShlbGVtcy5leHRfc3VwcF9yYXRlc1tpXSAmIDB4ODApOwotCi0JCWlmIChyYXRlID4gMTEwKQotCQkJaGF2ZV9oaWdoZXJfdGhhbl8xMW1iaXQgPSB0cnVlOwotCi0JCWZvciAoaiA9IDA7IGogPCBzYmFuZC0+bl9iaXRyYXRlczsgaisrKSB7Ci0JCQlpZiAoc2JhbmQtPmJpdHJhdGVzW2pdLmJpdHJhdGUgPT0gcmF0ZSkgewotCQkJCXJhdGVzIHw9IEJJVChqKTsKLQkJCQlpZiAoaXNfYmFzaWMpCi0JCQkJCWJhc2ljX3JhdGVzIHw9IEJJVChqKTsKLQkJCQlpZiAocmF0ZSA8IG1pbl9yYXRlKSB7Ci0JCQkJCW1pbl9yYXRlID0gcmF0ZTsKLQkJCQkJbWluX3JhdGVfaW5kZXggPSBqOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KKwlpZWVlODAyMTFfZ2V0X3JhdGVzKHNiYW5kLCBlbGVtcy5leHRfc3VwcF9yYXRlcywKKwkJCSAgICBlbGVtcy5leHRfc3VwcF9yYXRlc19sZW4sICZyYXRlcywgJmJhc2ljX3JhdGVzLAorCQkJICAgICZoYXZlX2hpZ2hlcl90aGFuXzExbWJpdCwKKwkJCSAgICAmbWluX3JhdGUsICZtaW5fcmF0ZV9pbmRleCk7CiAKIAkvKgogCSAqIHNvbWUgYnVnZ3kgQVBzIGRvbid0IGFkdmVydGlzZSBiYXNpY19yYXRlcy4gdXNlIHRoZSBsb3dlc3QKQEAgLTE2MDUsNyArMTYyNiw3IEBACiAJCXNkYXRhLT5mbGFncyAmPSB+SUVFRTgwMjExX1NEQVRBX09QRVJBVElOR19HTU9ERTsKIAogCWlmIChlbGVtcy5odF9jYXBfZWxlbSAmJiAhKGlmbWdkLT5mbGFncyAmIElFRUU4MDIxMV9TVEFfRElTQUJMRV8xMU4pKQotCQlpZWVlODAyMTFfaHRfY2FwX2llX3RvX3N0YV9odF9jYXAoc2JhbmQsCisJCWllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzZGF0YSwgc2JhbmQsCiAJCQkJZWxlbXMuaHRfY2FwX2VsZW0sICZzdGEtPnN0YS5odF9jYXApOwogCiAJYXBfaHRfY2FwX2ZsYWdzID0gc3RhLT5zdGEuaHRfY2FwLmNhcDsKQEAgLTE5NzQsNyArMTk5NSw3IEBACiAKIAkJc2JhbmQgPSBsb2NhbC0+aHcud2lwaHktPmJhbmRzW2xvY2FsLT5ody5jb25mLmNoYW5uZWwtPmJhbmRdOwogCi0JCWllZWU4MDIxMV9odF9jYXBfaWVfdG9fc3RhX2h0X2NhcChzYmFuZCwKKwkJaWVlZTgwMjExX2h0X2NhcF9pZV90b19zdGFfaHRfY2FwKHNkYXRhLCBzYmFuZCwKIAkJCQllbGVtcy5odF9jYXBfZWxlbSwgJnN0YS0+c3RhLmh0X2NhcCk7CiAKIAkJYXBfaHRfY2FwX2ZsYWdzID0gc3RhLT5zdGEuaHRfY2FwLmNhcDsKQEAgLTIxMjgsOSArMjE0OSw2IEBACiAKIAlpZWVlODAyMTFfc2V0X2Rpc2Fzc29jKHNkYXRhLCB0cnVlLCB0cnVlKTsKIAltdXRleF91bmxvY2soJmlmbWdkLT5tdHgpOwotCW11dGV4X2xvY2soJmxvY2FsLT5tdHgpOwotCWllZWU4MDIxMV9yZWNhbGNfaWRsZShsb2NhbCk7Ci0JbXV0ZXhfdW5sb2NrKCZsb2NhbC0+bXR4KTsKIAkvKgogCSAqIG11c3QgYmUgb3V0c2lkZSBsb2NrIGR1ZSB0byBjZmc4MDIxMSwKIAkgKiBidXQgdGhhdCdzIG5vdCBhIHByb2JsZW0uCkBAIC0yMTM4LDYgKzIxNTYsMTEgQEAKIAlpZWVlODAyMTFfc2VuZF9kZWF1dGhfZGlzYXNzb2Moc2RhdGEsIGJzc2lkLAogCQkJSUVFRTgwMjExX1NUWVBFX0RFQVVUSCwgcmVhc29uLAogCQkJTlVMTCwgdHJ1ZSk7CisKKwltdXRleF9sb2NrKCZsb2NhbC0+bXR4KTsKKwlpZWVlODAyMTFfcmVjYWxjX2lkbGUobG9jYWwpOworCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CisKIAltdXRleF9sb2NrKCZpZm1nZC0+bXR4KTsKIH0KIApAQCAtMjM1OCw2ICsyMzgxLDcgQEAKIAkJICAgICh1bnNpZ25lZCBsb25nKSBzZGF0YSk7CiAKIAlpZm1nZC0+ZmxhZ3MgPSAwOworCWlmbWdkLT5wb3dlcnNhdmUgPSBzZGF0YS0+d2Rldi5wczsKIAogCW11dGV4X2luaXQoJmlmbWdkLT5tdHgpOwogCkBAIC0yNjMyLDYgKzI2NTYsMTMgQEAKIAkJCWlmbWdkLT5mbGFncyB8PSBJRUVFODAyMTFfU1RBX0RJU0FCTEVfMTFOOwogCiAKKwlpZiAocmVxLT5mbGFncyAmIEFTU09DX1JFUV9ESVNBQkxFX0hUKQorCQlpZm1nZC0+ZmxhZ3MgfD0gSUVFRTgwMjExX1NUQV9ESVNBQkxFXzExTjsKKworCW1lbWNweSgmaWZtZ2QtPmh0X2NhcGEsICZyZXEtPmh0X2NhcGEsIHNpemVvZihpZm1nZC0+aHRfY2FwYSkpOworCW1lbWNweSgmaWZtZ2QtPmh0X2NhcGFfbWFzaywgJnJlcS0+aHRfY2FwYV9tYXNrLAorCSAgICAgICBzaXplb2YoaWZtZ2QtPmh0X2NhcGFfbWFzaykpOworCiAJaWYgKHJlcS0+aWUgJiYgcmVxLT5pZV9sZW4pIHsKIAkJbWVtY3B5KHdrLT5pZSwgcmVxLT5pZSwgcmVxLT5pZV9sZW4pOwogCQl3ay0+aWVfbGVuID0gcmVxLT5pZV9sZW47CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvb2ZmY2hhbm5lbC5jIGIvbmV0L21hYzgwMjExL29mZmNoYW5uZWwuYwppbmRleCAzZDQxNDQxLi5mMDU0ZTk0IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvb2ZmY2hhbm5lbC5jCisrKyBiL25ldC9tYWM4MDIxMS9vZmZjaGFubmVsLmMKQEAgLTEzOCwzMSArMTM4LDE2IEBACiAJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+aWZsaXN0X210eCk7CiB9CiAKLXZvaWQgaWVlZTgwMjExX29mZmNoYW5uZWxfZW5hYmxlX2FsbF9wcyhzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkJYm9vbCB0ZWxsX2FwKQotewotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhOwotCi0JbXV0ZXhfbG9jaygmbG9jYWwtPmlmbGlzdF9tdHgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnkoc2RhdGEsICZsb2NhbC0+aW50ZXJmYWNlcywgbGlzdCkgewotCQlpZiAoIWllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgotCQkgICAgc2RhdGEtPnUubWdkLmFzc29jaWF0ZWQpCi0JCQlpZWVlODAyMTFfb2ZmY2hhbm5lbF9wc19lbmFibGUoc2RhdGEsIHRlbGxfYXApOwotCX0KLQltdXRleF91bmxvY2soJmxvY2FsLT5pZmxpc3RfbXR4KTsKLX0KLQogdm9pZCBpZWVlODAyMTFfb2ZmY2hhbm5lbF9yZXR1cm4oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCi0JCQkJIGJvb2wgZW5hYmxlX2JlYWNvbmluZywKIAkJCQkgYm9vbCBvZmZjaGFubmVsX3BzX2Rpc2FibGUpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAKIAltdXRleF9sb2NrKCZsb2NhbC0+aWZsaXN0X210eCk7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShzZGF0YSwgJmxvY2FsLT5pbnRlcmZhY2VzLCBsaXN0KSB7CisJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikKKwkJCWNsZWFyX2JpdChTREFUQV9TVEFURV9PRkZDSEFOTkVMLCAmc2RhdGEtPnN0YXRlKTsKKwogCQlpZiAoIWllZWU4MDIxMV9zZGF0YV9ydW5uaW5nKHNkYXRhKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0xNzQsNyArMTU5LDYgQEAKIAkJfQogCiAJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUikgewotCQkJY2xlYXJfYml0KFNEQVRBX1NUQVRFX09GRkNIQU5ORUwsICZzZGF0YS0+c3RhdGUpOwogCQkJLyoKIAkJCSAqIFRoaXMgbWF5IHdha2UgdXAgcXVldWVzIGV2ZW4gdGhvdWdoIHRoZSBkcml2ZXIKIAkJCSAqIGN1cnJlbnRseSBoYXMgdGhlbSBzdG9wcGVkLiBUaGlzIGlzIG5vdCB2ZXJ5CkBAIC0xODgsMTEgKzE3Miw5IEBACiAJCQluZXRpZl90eF93YWtlX2FsbF9xdWV1ZXMoc2RhdGEtPmRldik7CiAJCX0KIAotCQkvKiBDaGVjayB0byBzZWUgaWYgd2Ugc2hvdWxkIHJlLWVuYWJsZSBiZWFjb25pbmcgKi8KLQkJaWYgKGVuYWJsZV9iZWFjb25pbmcgJiYKLQkJICAgIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKLQkJICAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgfHwKLQkJICAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCkpCisJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKKwkJICAgIHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BREhPQyB8fAorCQkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQpCiAJCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeSgKIAkJCQlzZGF0YSwgQlNTX0NIQU5HRURfQkVBQ09OX0VOQUJMRUQpOwogCX0KQEAgLTIxMiw4ICsxOTQsNiBAQAogCQlyZXR1cm47CiAJfQogCi0JaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKLQogCWlmIChsb2NhbC0+aHdfcm9jX3NrYikgewogCQlzZGF0YSA9IElFRUU4MDIxMV9ERVZfVE9fU1VCX0lGKGxvY2FsLT5od19yb2NfZGV2KTsKIAkJaWVlZTgwMjExX3R4X3NrYihzZGF0YSwgbG9jYWwtPmh3X3JvY19za2IpOwpAQCAtMjI3LDYgKzIwNyw4IEBACiAJCQkJCSAgR0ZQX0tFUk5FTCk7CiAJfQogCisJaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKKwogCW11dGV4X3VubG9jaygmbG9jYWwtPm10eCk7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9wbS5jIGIvbmV0L21hYzgwMjExL3BtLmMKaW5kZXggOWVlNzE2NC4uNTk2ZWZhZiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3BtLmMKKysrIGIvbmV0L21hYzgwMjExL3BtLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCQlpZWVlODAyMTFfYnNzX2luZm9fY2hhbmdlX25vdGlmeShzZGF0YSwKIAkJCUJTU19DSEFOR0VEX0JFQUNPTl9FTkFCTEVEKTsKIAotCQlkcnZfcmVtb3ZlX2ludGVyZmFjZShsb2NhbCwgJnNkYXRhLT52aWYpOworCQlkcnZfcmVtb3ZlX2ludGVyZmFjZShsb2NhbCwgc2RhdGEpOwogCX0KIAogCS8qIHN0b3AgaGFyZHdhcmUgLSB0aGlzIG11c3Qgc3RvcCBSWCAqLwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsLmMKaW5kZXggNThhODk1NS4uYjM5ZGRhNSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWwuYworKysgYi9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbC5jCkBAIC0zMzQsOCArMzM0LDggQEAKIAogCiBzdGF0aWMgdm9pZAotY2FsY19yYXRlX2R1cmF0aW9ucyhzdHJ1Y3QgbWluc3RyZWxfc3RhX2luZm8gKm1pLCBzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1pbnN0cmVsX3JhdGUgKmQsIHN0cnVjdCBpZWVlODAyMTFfcmF0ZSAqcmF0ZSkKK2NhbGNfcmF0ZV9kdXJhdGlvbnMoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHN0cnVjdCBtaW5zdHJlbF9yYXRlICpkLAorCQkgICAgc3RydWN0IGllZWU4MDIxMV9yYXRlICpyYXRlKQogewogCWludCBlcnAgPSAhIShyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9SQVRFX0VSUF9HKTsKIApAQCAtNDAyLDggKzQwMiw3IEBACiAKIAkJbXItPnJpeCA9IGk7CiAJCW1yLT5iaXRyYXRlID0gc2JhbmQtPmJpdHJhdGVzW2ldLmJpdHJhdGUgLyA1OwotCQljYWxjX3JhdGVfZHVyYXRpb25zKG1pLCBsb2NhbCwgbXIsCi0JCQkJJnNiYW5kLT5iaXRyYXRlc1tpXSk7CisJCWNhbGNfcmF0ZV9kdXJhdGlvbnMobG9jYWwsIG1yLCAmc2JhbmQtPmJpdHJhdGVzW2ldKTsKIAogCQkvKiBjYWxjdWxhdGUgbWF4aW11bSBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIGJlZm9yZQogCQkgKiBmYWxsYmFjayAoYmFzZWQgb24gbWF4aW11bSBzZWdtZW50IHNpemUpICovCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfbWluc3RyZWxfaHQuYwppbmRleCBjZGIyODUzLi5mZjVmN2I4IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9taW5zdHJlbF9odC5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX21pbnN0cmVsX2h0LmMKQEAgLTM2LDggKzM2LDE3IEBACiAvKiBUcmFuc21pdCBkdXJhdGlvbiBmb3IgdGhlIHJhdyBkYXRhIHBhcnQgb2YgYW4gYXZlcmFnZSBzaXplZCBwYWNrZXQgKi8KICNkZWZpbmUgTUNTX0RVUkFUSU9OKHN0cmVhbXMsIHNnaSwgYnBzKSBNQ1NfU1lNQk9MX1RJTUUoc2dpLCBNQ1NfTlNZTVMoKHN0cmVhbXMpICogKGJwcykpKQogCisvKgorICogRGVmaW5lIGdyb3VwIHNvcnQgb3JkZXI6IEhUNDAgLT4gU0dJIC0+ICNzdHJlYW1zCisgKi8KKyNkZWZpbmUgR1JPVVBfSURYKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCkJXAorCU1JTlNUUkVMX01BWF9TVFJFQU1TICogMiAqIF9odDQwICsJXAorCU1JTlNUUkVMX01BWF9TVFJFQU1TICogX3NnaSArCQlcCisJX3N0cmVhbXMgLSAxCisKIC8qIE1DUyByYXRlIGluZm9ybWF0aW9uIGZvciBhbiBNQ1MgZ3JvdXAgKi8KLSNkZWZpbmUgTUNTX0dST1VQKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCkgewkJCQlcCisjZGVmaW5lIE1DU19HUk9VUChfc3RyZWFtcywgX3NnaSwgX2h0NDApCQkJCVwKKwlbR1JPVVBfSURYKF9zdHJlYW1zLCBfc2dpLCBfaHQ0MCldID0gewkJCQlcCiAJLnN0cmVhbXMgPSBfc3RyZWFtcywJCQkJCQlcCiAJLmZsYWdzID0JCQkJCQkJXAogCQkoX3NnaSA/IElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSA6IDApIHwJCQlcCkBAIC01OCw2ICs2Nyw5IEBACiAgKiBUbyBlbmFibGUgc3VmZmljaWVudGx5IHRhcmdldGVkIHJhdGUgc2FtcGxpbmcsIE1DUyByYXRlcyBhcmUgZGl2aWRlZCBpbnRvCiAgKiBncm91cHMsIGJhc2VkIG9uIHRoZSBudW1iZXIgb2Ygc3RyZWFtcyBhbmQgZmxhZ3MgKEhUNDAsIFNHSSkgdGhhdCB0aGV5CiAgKiB1c2UuCisgKgorICogU29ydG9yZGVyIGhhcyB0byBiZSBmaXhlZCBmb3IgR1JPVVBfSURYIG1hY3JvIHRvIGJlIGFwcGxpY2FibGU6CisgKiBIVDQwIC0+IFNHSSAtPiAjc3RyZWFtcwogICovCiBjb25zdCBzdHJ1Y3QgbWNzX2dyb3VwIG1pbnN0cmVsX21jc19ncm91cHNbXSA9IHsKIAlNQ1NfR1JPVVAoMSwgMCwgMCksCkBAIC0xMDIsMjEgKzExNCw5IEBACiBzdGF0aWMgaW50CiBtaW5zdHJlbF9odF9nZXRfZ3JvdXBfaWR4KHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqcmF0ZSkKIHsKLQlpbnQgc3RyZWFtcyA9IChyYXRlLT5pZHggLyBNQ1NfR1JPVVBfUkFURVMpICsgMTsKLQl1MzIgZmxhZ3MgPSBJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0kgfCBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIOwotCWludCBpOwotCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWluc3RyZWxfbWNzX2dyb3Vwcyk7IGkrKykgewotCQlpZiAobWluc3RyZWxfbWNzX2dyb3Vwc1tpXS5zdHJlYW1zICE9IHN0cmVhbXMpCi0JCQljb250aW51ZTsKLQkJaWYgKG1pbnN0cmVsX21jc19ncm91cHNbaV0uZmxhZ3MgIT0gKHJhdGUtPmZsYWdzICYgZmxhZ3MpKQotCQkJY29udGludWU7Ci0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JV0FSTl9PTigxKTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gR1JPVVBfSURYKChyYXRlLT5pZHggLyBNQ1NfR1JPVVBfUkFURVMpICsgMSwKKwkJCSAhIShyYXRlLT5mbGFncyAmIElFRUU4MDIxMV9UWF9SQ19TSE9SVF9HSSksCisJCQkgISEocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfNDBfTUhaX1dJRFRIKSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKgpAQCAtMTMwLDcgKzEzMCw3IEBACiAgKiBSZWNhbGN1bGF0ZSBzdWNjZXNzIHByb2JhYmlsaXRpZXMgYW5kIGNvdW50ZXJzIGZvciBhIHJhdGUgdXNpbmcgRVdNQQogICovCiBzdGF0aWMgdm9pZAotbWluc3RyZWxfY2FsY19yYXRlX2V3bWEoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXIpCittaW5zdHJlbF9jYWxjX3JhdGVfZXdtYShzdHJ1Y3QgbWluc3RyZWxfcmF0ZV9zdGF0cyAqbXIpCiB7CiAJaWYgKHVubGlrZWx5KG1yLT5hdHRlbXB0cyA+IDApKSB7CiAJCW1yLT5zYW1wbGVfc2tpcHBlZCA9IDA7CkBAIC0xNTYsOCArMTU2LDcgQEAKICAqIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgcmV0cmFuc21pc3Npb25zIGFuZCB0aGVpciBleHBlY3RlZCBsZW5ndGgKICAqLwogc3RhdGljIHZvaWQKLW1pbnN0cmVsX2h0X2NhbGNfdHAoc3RydWN0IG1pbnN0cmVsX3ByaXYgKm1wLCBzdHJ1Y3QgbWluc3RyZWxfaHRfc3RhICptaSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGdyb3VwLCBpbnQgcmF0ZSkKK21pbnN0cmVsX2h0X2NhbGNfdHAoc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWksIGludCBncm91cCwgaW50IHJhdGUpCiB7CiAJc3RydWN0IG1pbnN0cmVsX3JhdGVfc3RhdHMgKm1yOwogCXVuc2lnbmVkIGludCB1c2VjczsKQEAgLTIyNiw4ICsyMjUsOCBAQAogCQkJbXIgPSAmbWctPnJhdGVzW2ldOwogCQkJbXItPnJldHJ5X3VwZGF0ZWQgPSBmYWxzZTsKIAkJCWluZGV4ID0gTUNTX0dST1VQX1JBVEVTICogZ3JvdXAgKyBpOwotCQkJbWluc3RyZWxfY2FsY19yYXRlX2V3bWEobXAsIG1yKTsKLQkJCW1pbnN0cmVsX2h0X2NhbGNfdHAobXAsIG1pLCBncm91cCwgaSk7CisJCQltaW5zdHJlbF9jYWxjX3JhdGVfZXdtYShtcik7CisJCQltaW5zdHJlbF9odF9jYWxjX3RwKG1pLCBncm91cCwgaSk7CiAKIAkJCWlmICghbXItPmN1cl90cCkKIAkJCQljb250aW51ZTsKQEAgLTMwMCwxMCArMjk5LDEwIEBACiBzdGF0aWMgYm9vbAogbWluc3RyZWxfaHRfdHhzdGF0X3ZhbGlkKHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSAqcmF0ZSkKIHsKLQlpZiAoIXJhdGUtPmNvdW50KQorCWlmIChyYXRlLT5pZHggPCAwKQogCQlyZXR1cm4gZmFsc2U7CiAKLQlpZiAocmF0ZS0+aWR4IDwgMCkKKwlpZiAoIXJhdGUtPmNvdW50KQogCQlyZXR1cm4gZmFsc2U7CiAKIAlyZXR1cm4gISEocmF0ZS0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfTUNTKTsKQEAgLTM1Nyw3ICszNTYsNyBAQAogfQogCiBzdGF0aWMgdm9pZAotbWluc3RyZWxfYWdncl9jaGVjayhzdHJ1Y3QgbWluc3RyZWxfcHJpdiAqbXAsIHN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGEsIHN0cnVjdCBza19idWZmICpza2IpCittaW5zdHJlbF9hZ2dyX2NoZWNrKHN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGEsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBjb250YWluZXJfb2YocHVic3RhLCBzdHJ1Y3Qgc3RhX2luZm8sIHN0YSk7CkBAIC00NTUsNyArNDU0LDcgQEAKIAlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBtaS0+c3RhdHNfdXBkYXRlICsgKG1wLT51cGRhdGVfaW50ZXJ2YWwgLyAyICogSFopIC8gMTAwMCkpIHsKIAkJbWluc3RyZWxfaHRfdXBkYXRlX3N0YXRzKG1wLCBtaSk7CiAJCWlmICghKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BTVBEVSkpCi0JCQltaW5zdHJlbF9hZ2dyX2NoZWNrKG1wLCBzdGEsIHNrYik7CisJCQltaW5zdHJlbF9hZ2dyX2NoZWNrKHN0YSwgc2tiKTsKIAl9CiB9CiAKQEAgLTUxNSw3ICs1MTQsNiBAQAogc3RhdGljIHZvaWQKIG1pbnN0cmVsX2h0X3NldF9yYXRlKHN0cnVjdCBtaW5zdHJlbF9wcml2ICptcCwgc3RydWN0IG1pbnN0cmVsX2h0X3N0YSAqbWksCiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3R4X3JhdGUgKnJhdGUsIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZV9jb250cm9sICp0eHJjLAogICAgICAgICAgICAgICAgICAgICAgYm9vbCBzYW1wbGUsIGJvb2wgcnRzY3RzKQogewogCWNvbnN0IHN0cnVjdCBtY3NfZ3JvdXAgKmdyb3VwID0gJm1pbnN0cmVsX21jc19ncm91cHNbaW5kZXggLyBNQ1NfR1JPVVBfUkFURVNdOwpAQCAtNjI4LDExICs2MjYsMTEgQEAKIAlpZiAoc2FtcGxlX2lkeCA+PSAwKSB7CiAJCXNhbXBsZSA9IHRydWU7CiAJCW1pbnN0cmVsX2h0X3NldF9yYXRlKG1wLCBtaSwgJmFyWzBdLCBzYW1wbGVfaWR4LAotCQkJdHhyYywgdHJ1ZSwgZmFsc2UpOworCQkJdHJ1ZSwgZmFsc2UpOwogCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX1JBVEVfQ1RSTF9QUk9CRTsKIAl9IGVsc2UgewogCQltaW5zdHJlbF9odF9zZXRfcmF0ZShtcCwgbWksICZhclswXSwgbWktPm1heF90cF9yYXRlLAotCQkJdHhyYywgZmFsc2UsIGZhbHNlKTsKKwkJCWZhbHNlLCBmYWxzZSk7CiAJfQogCiAJaWYgKG1wLT5ody0+bWF4X3JhdGVzID49IDMpIHsKQEAgLTY0MywxMyArNjQxLDEzIEBACiAJCSAqLwogCQlpZiAoc2FtcGxlX2lkeCA+PSAwKQogCQkJbWluc3RyZWxfaHRfc2V0X3JhdGUobXAsIG1pLCAmYXJbMV0sIG1pLT5tYXhfdHBfcmF0ZSwKLQkJCQl0eHJjLCBmYWxzZSwgZmFsc2UpOworCQkJCWZhbHNlLCBmYWxzZSk7CiAJCWVsc2UKIAkJCW1pbnN0cmVsX2h0X3NldF9yYXRlKG1wLCBtaSwgJmFyWzFdLCBtaS0+bWF4X3RwX3JhdGUyLAotCQkJCXR4cmMsIGZhbHNlLCB0cnVlKTsKKwkJCQlmYWxzZSwgdHJ1ZSk7CiAKIAkJbWluc3RyZWxfaHRfc2V0X3JhdGUobXAsIG1pLCAmYXJbMl0sIG1pLT5tYXhfcHJvYl9yYXRlLAotCQkJCSAgICAgdHhyYywgZmFsc2UsICFzYW1wbGUpOworCQkJCSAgICAgZmFsc2UsICFzYW1wbGUpOwogCiAJCWFyWzNdLmNvdW50ID0gMDsKIAkJYXJbM10uaWR4ID0gLTE7CkBAIC02NjAsNyArNjU4LDcgQEAKIAkJICogbWF4X3RwX3JhdGUgLT4gbWF4X3Byb2JfcmF0ZSBieSBkZWZhdWx0LgogCQkgKi8KIAkJbWluc3RyZWxfaHRfc2V0X3JhdGUobXAsIG1pLCAmYXJbMV0sIG1pLT5tYXhfcHJvYl9yYXRlLAotCQkJCSAgICAgdHhyYywgZmFsc2UsICFzYW1wbGUpOworCQkJCSAgICAgZmFsc2UsICFzYW1wbGUpOwogCiAJCWFyWzJdLmNvdW50ID0gMDsKIAkJYXJbMl0uaWR4ID0gLTE7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9waWRfYWxnby5jIGIvbmV0L21hYzgwMjExL3JjODAyMTFfcGlkX2FsZ28uYwppbmRleCBhZWRhNjU0Li41MDJkM2VjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvcmM4MDIxMV9waWRfYWxnby5jCisrKyBiL25ldC9tYWM4MDIxMS9yYzgwMjExX3BpZF9hbGdvLmMKQEAgLTMxOCw3ICszMTgsNyBAQAogCQkJcmluZm9baV0uZGlmZiA9IGkgKiBwaW5mby0+bm9ybV9vZmZzZXQ7CiAJfQogCWZvciAoaSA9IDE7IGkgPCBzYmFuZC0+bl9iaXRyYXRlczsgaSsrKSB7Ci0JCXMgPSAwOworCQlzID0gZmFsc2U7CiAJCWZvciAoaiA9IDA7IGogPCBzYmFuZC0+bl9iaXRyYXRlcyAtIGk7IGorKykKIAkJCWlmICh1bmxpa2VseShzYmFuZC0+Yml0cmF0ZXNbcmluZm9bal0uaW5kZXhdLmJpdHJhdGUgPgogCQkJCSAgICAgc2JhbmQtPmJpdHJhdGVzW3JpbmZvW2ogKyAxXS5pbmRleF0uYml0cmF0ZSkpIHsKQEAgLTMyNyw3ICszMjcsNyBAQAogCQkJCXJpbmZvW2ogKyAxXS5pbmRleCA9IHRtcDsKIAkJCQlyaW5mb1tyaW5mb1tqXS5pbmRleF0ucmV2X2luZGV4ID0gajsKIAkJCQlyaW5mb1tyaW5mb1tqICsgMV0uaW5kZXhdLnJldl9pbmRleCA9IGogKyAxOwotCQkJCXMgPSAxOworCQkJCXMgPSB0cnVlOwogCQkJfQogCQlpZiAoIXMpCiAJCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9yeC5jIGIvbmV0L21hYzgwMjExL3J4LmMKaW5kZXggZmIxMjNlMi4uZjQwNzQyNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3J4LmMKKysrIGIvbmV0L21hYzgwMjExL3J4LmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlICJ3cGEuaCIKICNpbmNsdWRlICJ0a2lwLmgiCiAjaW5jbHVkZSAid21lLmgiCisjaW5jbHVkZSAicmF0ZS5oIgogCiAvKgogICogbW9uaXRvciBtb2RlIHJlY2VwdGlvbgpAQCAtNzQ4LDEwICs3NDksMTEgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHJ4LT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyA9ICZsb2NhbC0+aHc7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cyA9IElFRUU4MDIxMV9TS0JfUlhDQihza2IpOwogCXN0cnVjdCBzdGFfaW5mbyAqc3RhID0gcngtPnN0YTsKIAlzdHJ1Y3QgdGlkX2FtcGR1X3J4ICp0aWRfYWdnX3J4OwogCXUxNiBzYzsKLQlpbnQgdGlkOworCXU4IHRpZCwgYWNrX3BvbGljeTsKIAogCWlmICghaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpCiAJCWdvdG8gZG9udF9yZW9yZGVyOwpAQCAtNzY0LDYgKzc2Niw4IEBACiAJaWYgKCFzdGEpCiAJCWdvdG8gZG9udF9yZW9yZGVyOwogCisJYWNrX3BvbGljeSA9ICppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSAmCisJCSAgICAgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9NQVNLOwogCXRpZCA9ICppZWVlODAyMTFfZ2V0X3Fvc19jdGwoaGRyKSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RJRF9NQVNLOwogCiAJdGlkX2FnZ19yeCA9IHJjdV9kZXJlZmVyZW5jZShzdGEtPmFtcGR1X21sbWUudGlkX3J4W3RpZF0pOwpAQCAtNzc0LDYgKzc3OCwxNSBAQAogCWlmICh1bmxpa2VseShoZHItPmZyYW1lX2NvbnRyb2wgJiBjcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfTlVMTEZVTkMpKSkKIAkJZ290byBkb250X3Jlb3JkZXI7CiAKKwkvKiBub3QgcGFydCBvZiBhIEJBIHNlc3Npb24gKi8KKwlpZiAoYWNrX3BvbGljeSAhPSBJRUVFODAyMTFfUU9TX0NUTF9BQ0tfUE9MSUNZX0JMT0NLQUNLICYmCisJICAgIGFja19wb2xpY3kgIT0gSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9OT1JNQUwpCisJCWdvdG8gZG9udF9yZW9yZGVyOworCisJLyogbm90IGFjdHVhbGx5IHBhcnQgb2YgdGhpcyBCQSBzZXNzaW9uICovCisJaWYgKCEoc3RhdHVzLT5yeF9mbGFncyAmIElFRUU4MDIxMV9SWF9SQV9NQVRDSCkpCisJCWdvdG8gZG9udF9yZW9yZGVyOworCiAJLyogbmV3LCBwb3RlbnRpYWxseSB1bi1vcmRlcmVkLCBhbXBkdSBmcmFtZSAtIHByb2Nlc3MgaXQgKi8KIAogCS8qIHJlc2V0IHNlc3Npb24gdGltZXIgKi8KQEAgLTg1OCw2ICs4NzEsMTMgQEAKIAkJCSAgICByeC0+c2RhdGEtPmNvbnRyb2xfcG9ydF9wcm90b2NvbCkKIAkJCQlyZXR1cm4gUlhfQ09OVElOVUU7CiAJCX0KKworCQlpZiAocngtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCAmJgorCQkgICAgY2ZnODAyMTFfcnhfc3B1cmlvdXNfZnJhbWUocngtPnNkYXRhLT5kZXYsCisJCQkJCSAgICAgICBoZHItPmFkZHIyLAorCQkJCQkgICAgICAgR0ZQX0FUT01JQykpCisJCQlyZXR1cm4gUlhfRFJPUF9VTlVTQUJMRTsKKwogCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwogCX0KIApAQCAtMTMyNywxNSArMTM0NywyMCBAQAogCiAJCS8qCiAJCSAqIElmIHdlIHJlY2VpdmUgYSA0LWFkZHIgbnVsbGZ1bmMgZnJhbWUgZnJvbSBhIFNUQQotCQkgKiB0aGF0IHdhcyBub3QgbW92ZWQgdG8gYSA0LWFkZHIgU1RBIHZsYW4geWV0LCBkcm9wCi0JCSAqIHRoZSBmcmFtZSB0byB0aGUgbW9uaXRvciBpbnRlcmZhY2UsIHRvIG1ha2Ugc3VyZQotCQkgKiB0aGF0IGhvc3RhcGQgc2VlcyBpdAorCQkgKiB0aGF0IHdhcyBub3QgbW92ZWQgdG8gYSA0LWFkZHIgU1RBIHZsYW4geWV0IHNlbmQKKwkJICogdGhlIGV2ZW50IHRvIHVzZXJzcGFjZSBhbmQgZm9yIG9sZGVyIGhvc3RhcGQgZHJvcAorCQkgKiB0aGUgZnJhbWUgdG8gdGhlIG1vbml0b3IgaW50ZXJmYWNlLgogCQkgKi8KIAkJaWYgKGllZWU4MDIxMV9oYXNfYTQoaGRyLT5mcmFtZV9jb250cm9sKSAmJgogCQkgICAgKHJ4LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgfHwKIAkJICAgICAocngtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCi0JCSAgICAgICFyeC0+c2RhdGEtPnUudmxhbi5zdGEpKSkKKwkJICAgICAgIXJ4LT5zZGF0YS0+dS52bGFuLnN0YSkpKSB7CisJCQlpZiAoIXRlc3RfYW5kX3NldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBXzRBRERSX0VWRU5UKSkKKwkJCQljZmc4MDIxMV9yeF91bmV4cGVjdGVkXzRhZGRyX2ZyYW1lKAorCQkJCQlyeC0+c2RhdGEtPmRldiwgc3RhLT5zdGEuYWRkciwKKwkJCQkJR0ZQX0FUT01JQyk7CiAJCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCQl9CiAJCS8qCiAJCSAqIFVwZGF0ZSBjb3VudGVyIGFuZCBmcmVlIHBhY2tldCBoZXJlIHRvIGF2b2lkCiAJCSAqIGNvdW50aW5nIHRoaXMgYXMgYSBkcm9wcGVkIHBhY2tlZC4KQEAgLTE1NTEsMjUgKzE1NzYsNiBAQAogCXJldHVybiBSWF9DT05USU5VRTsKIH0KIAotc3RhdGljIGllZWU4MDIxMV9yeF9yZXN1bHQgZGVidWdfbm9pbmxpbmUKLWllZWU4MDIxMV9yeF9oX3JlbW92ZV9xb3NfY29udHJvbChzdHJ1Y3QgaWVlZTgwMjExX3J4X2RhdGEgKnJ4KQotewotCXU4ICpkYXRhID0gcngtPnNrYi0+ZGF0YTsKLQlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopZGF0YTsKLQotCWlmICghaWVlZTgwMjExX2lzX2RhdGFfcW9zKGhkci0+ZnJhbWVfY29udHJvbCkpCi0JCXJldHVybiBSWF9DT05USU5VRTsKLQotCS8qIHJlbW92ZSB0aGUgcW9zIGNvbnRyb2wgZmllbGQsIHVwZGF0ZSBmcmFtZSB0eXBlIGFuZCBtZXRhLWRhdGEgKi8KLQltZW1tb3ZlKGRhdGEgKyBJRUVFODAyMTFfUU9TX0NUTF9MRU4sIGRhdGEsCi0JCWllZWU4MDIxMV9oZHJsZW4oaGRyLT5mcmFtZV9jb250cm9sKSAtIElFRUU4MDIxMV9RT1NfQ1RMX0xFTik7Ci0JaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiX3B1bGwocngtPnNrYiwgSUVFRTgwMjExX1FPU19DVExfTEVOKTsKLQkvKiBjaGFuZ2UgZnJhbWUgdHlwZSB0byBub24gUU9TICovCi0JaGRyLT5mcmFtZV9jb250cm9sICY9IH5jcHVfdG9fbGUxNihJRUVFODAyMTFfU1RZUEVfUU9TX0RBVEEpOwotCi0JcmV0dXJuIFJYX0NPTlRJTlVFOwotfQotCiBzdGF0aWMgaW50CiBpZWVlODAyMTFfODAyXzF4X3BvcnRfY29udHJvbChzdHJ1Y3QgaWVlZTgwMjExX3J4X2RhdGEgKnJ4KQogewpAQCAtMTgwMiw3ICsxODA4LDEyIEBACiAJfQogCiAJaWYgKHhtaXRfc2tiKSB7Ci0JCS8qIHNlbmQgdG8gd2lyZWxlc3MgbWVkaWEgKi8KKwkJLyoKKwkJICogU2VuZCB0byB3aXJlbGVzcyBtZWRpYSBhbmQgaW5jcmVhc2UgcHJpb3JpdHkgYnkgMjU2IHRvCisJCSAqIGtlZXAgdGhlIHJlY2VpdmVkIHByaW9yaXR5IGluc3RlYWQgb2YgcmVjbGFzc2lmeWluZworCQkgKiB0aGUgZnJhbWUgKHNlZSBjZmc4MDIxMV9jbGFzc2lmeTgwMjFkKS4KKwkJICovCisJCXhtaXRfc2tiLT5wcmlvcml0eSArPSAyNTY7CiAJCXhtaXRfc2tiLT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8zKTsKIAkJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHhtaXRfc2tiKTsKIAkJc2tiX3Jlc2V0X21hY19oZWFkZXIoeG1pdF9za2IpOwpAQCAtMTg3MSwxMyArMTg4MiwxNiBAQAogc3RhdGljIGllZWU4MDIxMV9yeF9yZXN1bHQKIGllZWU4MDIxMV9yeF9oX21lc2hfZndkaW5nKHN0cnVjdCBpZWVlODAyMTFfcnhfZGF0YSAqcngpCiB7Ci0Jc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqZndkX2hkciwgKmhkcjsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CiAJc3RydWN0IGllZWU4MDIxMXNfaGRyICptZXNoX2hkcjsKLQl1bnNpZ25lZCBpbnQgaGRybGVuOwogCXN0cnVjdCBza19idWZmICpza2IgPSByeC0+c2tiLCAqZndkX3NrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHJ4LT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHJ4LT5zZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3J4X3N0YXR1cyAqc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHNrYik7CisJc3RydWN0IGllZWU4MDIxMV9pZl9tZXNoICppZm1zaCA9ICZzZGF0YS0+dS5tZXNoOworCV9fbGUxNiByZWFzb24gPSBjcHVfdG9fbGUxNihXTEFOX1JFQVNPTl9NRVNIX1BBVEhfTk9GT1JXQVJEKTsKKwl1MTYgcSwgaGRybGVuOwogCiAJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKIAloZHJsZW4gPSBpZWVlODAyMTFfaGRybGVuKGhkci0+ZnJhbWVfY29udHJvbCk7CkBAIC0xODkzLDE1ICsxOTA3LDggQEAKIAkJcmV0dXJuIFJYX0NPTlRJTlVFOwogCiAJaWYgKCFtZXNoX2hkci0+dHRsKQotCQkvKiBpbGxlZ2FsIGZyYW1lICovCiAJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CiAKLQlpZiAoaWVlZTgwMjExX3F1ZXVlX3N0b3BwZWQoJmxvY2FsLT5odywgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpKSB7Ci0JCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoJnNkYXRhLT51Lm1lc2gsCi0JCQkJCQlkcm9wcGVkX2ZyYW1lc19jb25nZXN0aW9uKTsKLQkJcmV0dXJuIFJYX0RST1BfTU9OSVRPUjsKLQl9Ci0KIAlpZiAobWVzaF9oZHItPmZsYWdzICYgTUVTSF9GTEFHU19BRSkgewogCQlzdHJ1Y3QgbWVzaF9wYXRoICptcHBhdGg7CiAJCWNoYXIgKnByb3hpZWRfYWRkcjsKQEAgLTE5MzMsNjAgKzE5NDAsNTAgQEAKIAkgICAgY29tcGFyZV9ldGhlcl9hZGRyKHNkYXRhLT52aWYuYWRkciwgaGRyLT5hZGRyMykgPT0gMCkKIAkJcmV0dXJuIFJYX0NPTlRJTlVFOwogCi0JbWVzaF9oZHItPnR0bC0tOworCXEgPSBpZWVlODAyMTFfc2VsZWN0X3F1ZXVlXzgwMjExKGxvY2FsLCBza2IsIGhkcik7CisJaWYgKGllZWU4MDIxMV9xdWV1ZV9zdG9wcGVkKCZsb2NhbC0+aHcsIHEpKSB7CisJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoaWZtc2gsIGRyb3BwZWRfZnJhbWVzX2Nvbmdlc3Rpb24pOworCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCX0KKwlza2Jfc2V0X3F1ZXVlX21hcHBpbmcoc2tiLCBxKTsKIAotCWlmIChzdGF0dXMtPnJ4X2ZsYWdzICYgSUVFRTgwMjExX1JYX1JBX01BVENIKSB7Ci0JCWlmICghbWVzaF9oZHItPnR0bCkKLQkJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoJnJ4LT5zZGF0YS0+dS5tZXNoLAotCQkJCQkJICAgICBkcm9wcGVkX2ZyYW1lc190dGwpOwotCQllbHNlIHsKLQkJCXN0cnVjdCBpZWVlODAyMTFfaGRyICpmd2RfaGRyOwotCQkJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOworCWlmICghKHN0YXR1cy0+cnhfZmxhZ3MgJiBJRUVFODAyMTFfUlhfUkFfTUFUQ0gpKQorCQlnb3RvIG91dDsKIAotCQkJZndkX3NrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7Ci0KLQkJCWlmICghZndkX3NrYiAmJiBuZXRfcmF0ZWxpbWl0KCkpCi0JCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBmYWlsZWQgdG8gY2xvbmUgbWVzaCBmcmFtZVxuIiwKLQkJCQkJCSAgIHNkYXRhLT5uYW1lKTsKLQkJCWlmICghZndkX3NrYikKLQkJCQlnb3RvIG91dDsKLQotCQkJZndkX2hkciA9ICAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgZndkX3NrYi0+ZGF0YTsKLQkJCW1lbWNweShmd2RfaGRyLT5hZGRyMiwgc2RhdGEtPnZpZi5hZGRyLCBFVEhfQUxFTik7Ci0JCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihmd2Rfc2tiKTsKLQkJCW1lbXNldChpbmZvLCAwLCBzaXplb2YoKmluZm8pKTsKLQkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9JTlRGTF9ORUVEX1RYUFJPQ0VTU0lORzsKLQkJCWluZm8tPmNvbnRyb2wudmlmID0gJnJ4LT5zZGF0YS0+dmlmOwotCQkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGZ3ZF9oZHItPmFkZHIxKSkgewotCQkJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoJnNkYXRhLT51Lm1lc2gsCi0JCQkJCQkJCWZ3ZGVkX21jYXN0KTsKLQkJCQlza2Jfc2V0X3F1ZXVlX21hcHBpbmcoZndkX3NrYiwKLQkJCQkJaWVlZTgwMjExX3NlbGVjdF9xdWV1ZShzZGF0YSwgZndkX3NrYikpOwotCQkJCWllZWU4MDIxMV9zZXRfcW9zX2hkcihzZGF0YSwgZndkX3NrYik7Ci0JCQl9IGVsc2UgewotCQkJCWludCBlcnI7Ci0JCQkJLyoKLQkJCQkgKiBTYXZlIFRBIHRvIGFkZHIxIHRvIHNlbmQgVEEgYSBwYXRoIGVycm9yIGlmIGEKLQkJCQkgKiBzdWl0YWJsZSBuZXh0IGhvcCBpcyBub3QgZm91bmQKLQkJCQkgKi8KLQkJCQltZW1jcHkoZndkX2hkci0+YWRkcjEsIGZ3ZF9oZHItPmFkZHIyLAotCQkJCQkJRVRIX0FMRU4pOwotCQkJCWVyciA9IG1lc2hfbmV4dGhvcF9sb29rdXAoZndkX3NrYiwgc2RhdGEpOwotCQkJCS8qIEZhaWxlZCB0byBpbW1lZGlhdGVseSByZXNvbHZlIG5leHQgaG9wOgotCQkJCSAqIGZ3ZGVkIGZyYW1lIHdhcyBkcm9wcGVkIG9yIHdpbGwgYmUgYWRkZWQKLQkJCQkgKiBsYXRlciB0byB0aGUgcGVuZGluZyBza2IgcXVldWUuICAqLwotCQkJCWlmIChlcnIpCi0JCQkJCXJldHVybiBSWF9EUk9QX01PTklUT1I7Ci0KLQkJCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKCZzZGF0YS0+dS5tZXNoLAotCQkJCQkJCQlmd2RlZF91bmljYXN0KTsKLQkJCX0KLQkJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoJnNkYXRhLT51Lm1lc2gsCi0JCQkJCQkgICAgIGZ3ZGVkX2ZyYW1lcyk7Ci0JCQlpZWVlODAyMTFfYWRkX3BlbmRpbmdfc2tiKGxvY2FsLCBmd2Rfc2tiKTsKLQkJfQorCWlmICghLS1tZXNoX2hkci0+dHRsKSB7CisJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoaWZtc2gsIGRyb3BwZWRfZnJhbWVzX3R0bCk7CisJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CiAJfQogCisJZndkX3NrYiA9IHNrYl9jb3B5KHNrYiwgR0ZQX0FUT01JQyk7CisJaWYgKCFmd2Rfc2tiKSB7CisJCWlmIChuZXRfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBjbG9uZSBtZXNoIGZyYW1lXG4iLAorCQkJCQlzZGF0YS0+bmFtZSk7CisJCWdvdG8gb3V0OworCX0KKworCWZ3ZF9oZHIgPSAgKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIGZ3ZF9za2ItPmRhdGE7CisJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IoZndkX3NrYik7CisJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOworCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9JTlRGTF9ORUVEX1RYUFJPQ0VTU0lORzsKKwlpbmZvLT5jb250cm9sLnZpZiA9ICZyeC0+c2RhdGEtPnZpZjsKKwlpbmZvLT5jb250cm9sLmppZmZpZXMgPSBqaWZmaWVzOworCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihmd2RfaGRyLT5hZGRyMSkpIHsKKwkJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQyhpZm1zaCwgZndkZWRfbWNhc3QpOworCQltZW1jcHkoZndkX2hkci0+YWRkcjIsIHNkYXRhLT52aWYuYWRkciwgRVRIX0FMRU4pOworCX0gZWxzZSBpZiAoIW1lc2hfbmV4dGhvcF9sb29rdXAoZndkX3NrYiwgc2RhdGEpKSB7CisJCUlFRUU4MDIxMV9JRlNUQV9NRVNIX0NUUl9JTkMoaWZtc2gsIGZ3ZGVkX3VuaWNhc3QpOworCX0gZWxzZSB7CisJCS8qIHVuYWJsZSB0byByZXNvbHZlIG5leHQgaG9wICovCisJCW1lc2hfcGF0aF9lcnJvcl90eChpZm1zaC0+bXNoY2ZnLmVsZW1lbnRfdHRsLCBmd2RfaGRyLT5hZGRyMywKKwkJCQkgICAgMCwgcmVhc29uLCBmd2RfaGRyLT5hZGRyMiwgc2RhdGEpOworCQlJRUVFODAyMTFfSUZTVEFfTUVTSF9DVFJfSU5DKGlmbXNoLCBkcm9wcGVkX2ZyYW1lc19ub19yb3V0ZSk7CisJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CisJfQorCisJSUVFRTgwMjExX0lGU1RBX01FU0hfQ1RSX0lOQyhpZm1zaCwgZndkZWRfZnJhbWVzKTsKKwlpZWVlODAyMTFfYWRkX3BlbmRpbmdfc2tiKGxvY2FsLCBmd2Rfc2tiKTsKICBvdXQ6CiAJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpIHx8CiAJICAgIHNkYXRhLT5kZXYtPmZsYWdzICYgSUZGX1BST01JU0MpCkBAIC0yMDE0LDEyICsyMDExLDE3IEBACiAJCXJldHVybiBSWF9EUk9QX01PTklUT1I7CiAKIAkvKgotCSAqIEFsbG93IHRoZSBjb29rZWQgbW9uaXRvciBpbnRlcmZhY2Ugb2YgYW4gQVAgdG8gc2VlIDQtYWRkciBmcmFtZXMgc28KLQkgKiB0aGF0IGEgNC1hZGRyIHN0YXRpb24gY2FuIGJlIGRldGVjdGVkIGFuZCBtb3ZlZCBpbnRvIGEgc2VwYXJhdGUgVkxBTgorCSAqIFNlbmQgdW5leHBlY3RlZC00YWRkci1mcmFtZSBldmVudCB0byBob3N0YXBkLiBGb3Igb2xkZXIgdmVyc2lvbnMsCisJICogYWxzbyBkcm9wIHRoZSBmcmFtZSB0byBjb29rZWQgbW9uaXRvciBpbnRlcmZhY2VzLgogCSAqLwogCWlmIChpZWVlODAyMTFfaGFzX2E0KGhkci0+ZnJhbWVfY29udHJvbCkgJiYKLQkgICAgc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCSAgICBzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApIHsKKwkJaWYgKHJ4LT5zdGEgJiYKKwkJICAgICF0ZXN0X2FuZF9zZXRfc3RhX2ZsYWcocngtPnN0YSwgV0xBTl9TVEFfNEFERFJfRVZFTlQpKQorCQkJY2ZnODAyMTFfcnhfdW5leHBlY3RlZF80YWRkcl9mcmFtZSgKKwkJCQlyeC0+c2RhdGEtPmRldiwgcngtPnN0YS0+c3RhLmFkZHIsIEdGUF9BVE9NSUMpOwogCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOworCX0KIAogCWVyciA9IF9faWVlZTgwMjExX2RhdGFfdG9fODAyMyhyeCwgJnBvcnRfY29udHJvbCk7CiAJaWYgKHVubGlrZWx5KGVycikpCkBAIC0yMTc0LDYgKzIxNzYsMTggQEAKIAlpZiAoIWllZWU4MDIxMV9pc19tZ210KG1nbXQtPmZyYW1lX2NvbnRyb2wpKQogCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwogCisJaWYgKHJ4LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkgICAgaWVlZTgwMjExX2lzX2JlYWNvbihtZ210LT5mcmFtZV9jb250cm9sKSAmJgorCSAgICAhKHJ4LT5mbGFncyAmIElFRUU4MDIxMV9SWF9CRUFDT05fUkVQT1JURUQpKSB7CisJCXN0cnVjdCBpZWVlODAyMTFfcnhfc3RhdHVzICpzdGF0dXM7CisKKwkJc3RhdHVzID0gSUVFRTgwMjExX1NLQl9SWENCKHJ4LT5za2IpOworCQljZmc4MDIxMV9yZXBvcnRfb2Jzc19iZWFjb24ocngtPmxvY2FsLT5ody53aXBoeSwKKwkJCQkJICAgIHJ4LT5za2ItPmRhdGEsIHJ4LT5za2ItPmxlbiwKKwkJCQkJICAgIHN0YXR1cy0+ZnJlcSwgR0ZQX0FUT01JQyk7CisJCXJ4LT5mbGFncyB8PSBJRUVFODAyMTFfUlhfQkVBQ09OX1JFUE9SVEVEOworCX0KKwogCWlmICghKHN0YXR1cy0+cnhfZmxhZ3MgJiBJRUVFODAyMTFfUlhfUkFfTUFUQ0gpKQogCQlyZXR1cm4gUlhfRFJPUF9NT05JVE9SOwogCkBAIC0yMjA2LDE2ICsyMjIwLDY5IEBACiAJCXJldHVybiBSWF9EUk9QX1VOVVNBQkxFOwogCiAJc3dpdGNoIChtZ210LT51LmFjdGlvbi5jYXRlZ29yeSkgewotCWNhc2UgV0xBTl9DQVRFR09SWV9CQUNLOgotCQkvKgotCQkgKiBUaGUgYWdncmVnYXRpb24gY29kZSBpcyBub3QgcHJlcGFyZWQgdG8gaGFuZGxlCi0JCSAqIGFueXRoaW5nIGJ1dCBTVEEvQVAgZHVlIHRvIHRoZSBCU1NJRCBoYW5kbGluZzsKLQkJICogSUJTUyBjb3VsZCB3b3JrIGluIHRoZSBjb2RlIGJ1dCBpc24ndCBzdXBwb3J0ZWQKLQkJICogYnkgZHJpdmVycyBvciB0aGUgc3RhbmRhcmQuCi0JCSAqLworCWNhc2UgV0xBTl9DQVRFR09SWV9IVDoKKwkJLyogcmVqZWN0IEhUIGFjdGlvbiBmcmFtZXMgZnJvbSBzdGF0aW9ucyBub3Qgc3VwcG9ydGluZyBIVCAqLworCQlpZiAoIXJ4LT5zdGEtPnN0YS5odF9jYXAuaHRfc3VwcG9ydGVkKQorCQkJZ290byBpbnZhbGlkOworCiAJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQgJiYKIAkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCi0JCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJCWJyZWFrOworCisJCS8qIHZlcmlmeSBhY3Rpb24gJiBzbXBzX2NvbnRyb2wgYXJlIHByZXNlbnQgKi8KKwkJaWYgKGxlbiA8IElFRUU4MDIxMV9NSU5fQUNUSU9OX1NJWkUgKyAyKQorCQkJZ290byBpbnZhbGlkOworCisJCXN3aXRjaCAobWdtdC0+dS5hY3Rpb24udS5odF9zbXBzLmFjdGlvbikgeworCQljYXNlIFdMQU5fSFRfQUNUSU9OX1NNUFM6IHsKKwkJCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKnNiYW5kOworCQkJdTggc21wczsKKworCQkJLyogY29udmVydCB0byBIVCBjYXBhYmlsaXR5ICovCisJCQlzd2l0Y2ggKG1nbXQtPnUuYWN0aW9uLnUuaHRfc21wcy5zbXBzX2NvbnRyb2wpIHsKKwkJCWNhc2UgV0xBTl9IVF9TTVBTX0NPTlRST0xfRElTQUJMRUQ6CisJCQkJc21wcyA9IFdMQU5fSFRfQ0FQX1NNX1BTX0RJU0FCTEVEOworCQkJCWJyZWFrOworCQkJY2FzZSBXTEFOX0hUX1NNUFNfQ09OVFJPTF9TVEFUSUM6CisJCQkJc21wcyA9IFdMQU5fSFRfQ0FQX1NNX1BTX1NUQVRJQzsKKwkJCQlicmVhazsKKwkJCWNhc2UgV0xBTl9IVF9TTVBTX0NPTlRST0xfRFlOQU1JQzoKKwkJCQlzbXBzID0gV0xBTl9IVF9DQVBfU01fUFNfRFlOQU1JQzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZ290byBpbnZhbGlkOworCQkJfQorCQkJc21wcyA8PD0gSUVFRTgwMjExX0hUX0NBUF9TTV9QU19TSElGVDsKKworCQkJLyogaWYgbm8gY2hhbmdlIGRvIG5vdGhpbmcgKi8KKwkJCWlmICgocngtPnN0YS0+c3RhLmh0X2NhcC5jYXAgJgorCQkJCQlJRUVFODAyMTFfSFRfQ0FQX1NNX1BTKSA9PSBzbXBzKQorCQkJCWdvdG8gaGFuZGxlZDsKKworCQkJcngtPnN0YS0+c3RhLmh0X2NhcC5jYXAgJj0gfklFRUU4MDIxMV9IVF9DQVBfU01fUFM7CisJCQlyeC0+c3RhLT5zdGEuaHRfY2FwLmNhcCB8PSBzbXBzOworCisJCQlzYmFuZCA9IHJ4LT5sb2NhbC0+aHcud2lwaHktPmJhbmRzW3N0YXR1cy0+YmFuZF07CisKKwkJCXJhdGVfY29udHJvbF9yYXRlX3VwZGF0ZShsb2NhbCwgc2JhbmQsIHJ4LT5zdGEsCisJCQkJCQkgSUVFRTgwMjExX1JDX1NNUFNfQ0hBTkdFRCwKKwkJCQkJCSBsb2NhbC0+X29wZXJfY2hhbm5lbF90eXBlKTsKKwkJCWdvdG8gaGFuZGxlZDsKKwkJfQorCQlkZWZhdWx0OgorCQkJZ290byBpbnZhbGlkOworCQl9CisKKwkJYnJlYWs7CisJY2FzZSBXTEFOX0NBVEVHT1JZX0JBQ0s6CisJCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTiAmJgorCQkgICAgc2RhdGEtPnZpZi50eXBlICE9IE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQgJiYKKwkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCisJCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkJICAgIHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykKIAkJCWJyZWFrOwogCiAJCS8qIHZlcmlmeSBhY3Rpb25fY29kZSBpcyBwcmVzZW50ICovCkBAIC0yNDkzLDYgKzI1NjAsMTAgQEAKIAkJZ290byBvdXRfZnJlZV9za2I7CiAJcngtPmZsYWdzIHw9IElFRUU4MDIxMV9SWF9DTU5UUjsKIAorCS8qIElmIHRoZXJlIGFyZSBubyBjb29rZWQgbW9uaXRvciBpbnRlcmZhY2VzLCBqdXN0IGZyZWUgdGhlIFNLQiAqLworCWlmICghbG9jYWwtPmNvb2tlZF9tbnRycykKKwkJZ290byBvdXRfZnJlZV9za2I7CisKIAlpZiAoc2tiX2hlYWRyb29tKHNrYikgPCBzaXplb2YoKnJ0aGRyKSAmJgogCSAgICBwc2tiX2V4cGFuZF9oZWFkKHNrYiwgc2l6ZW9mKCpydGhkciksIDAsIEdGUF9BVE9NSUMpKQogCQlnb3RvIG91dF9mcmVlX3NrYjsKQEAgLTI2MjgsNyArMjY5OSw2IEBACiAJCWlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnJ4LT5zZGF0YS0+dmlmKSkKIAkJCUNBTExfUlhIKGllZWU4MDIxMV9yeF9oX21lc2hfZndkaW5nKTsKICNlbmRpZgotCQlDQUxMX1JYSChpZWVlODAyMTFfcnhfaF9yZW1vdmVfcW9zX2NvbnRyb2wpCiAJCUNBTExfUlhIKGllZWU4MDIxMV9yeF9oX2Ftc2R1KQogCQlDQUxMX1JYSChpZWVlODAyMTFfcnhfaF9kYXRhKQogCQlDQUxMX1JYSChpZWVlODAyMTFfcnhfaF9jdHJsKTsKQEAgLTI3NDgsOCArMjgxOCw4IEBACiAJCQkJcmF0ZV9pZHggPSAwOyAvKiBUT0RPOiBIVCByYXRlcyAqLwogCQkJZWxzZQogCQkJCXJhdGVfaWR4ID0gc3RhdHVzLT5yYXRlX2lkeDsKLQkJCXJ4LT5zdGEgPSBpZWVlODAyMTFfaWJzc19hZGRfc3RhKHNkYXRhLCBic3NpZCwKLQkJCQkJaGRyLT5hZGRyMiwgQklUKHJhdGVfaWR4KSwgR0ZQX0FUT01JQyk7CisJCQlpZWVlODAyMTFfaWJzc19yeF9ub19zdGEoc2RhdGEsIGJzc2lkLCBoZHItPmFkZHIyLAorCQkJCQkJIEJJVChyYXRlX2lkeCkpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKQEAgLTI3NzAsMTAgKzI4NDAsMTcgQEAKIAkJCQlyZXR1cm4gMDsKIAkJfSBlbHNlIGlmICghaWVlZTgwMjExX2Jzc2lkX21hdGNoKGJzc2lkLAogCQkJCQlzZGF0YS0+dmlmLmFkZHIpKSB7CisJCQkvKgorCQkJICogQWNjZXB0IHB1YmxpYyBhY3Rpb24gZnJhbWVzIGV2ZW4gd2hlbiB0aGUKKwkJCSAqIEJTU0lEIGRvZXNuJ3QgbWF0Y2gsIHRoaXMgaXMgdXNlZCBmb3IgUDJQCisJCQkgKiBhbmQgbG9jYXRpb24gdXBkYXRlcy4gTm90ZSB0aGF0IG1hYzgwMjExCisJCQkgKiBpdHNlbGYgbmV2ZXIgbG9va3MgYXQgdGhlc2UgZnJhbWVzLgorCQkJICovCiAJCQlpZiAoIShzdGF0dXMtPnJ4X2ZsYWdzICYgSUVFRTgwMjExX1JYX0lOX1NDQU4pICYmCi0JCQkgICAgIWllZWU4MDIxMV9pc19iZWFjb24oaGRyLT5mcmFtZV9jb250cm9sKSAmJgotCQkJICAgICEoaWVlZTgwMjExX2lzX2FjdGlvbihoZHItPmZyYW1lX2NvbnRyb2wpICYmCi0JCQkgICAgICBzZGF0YS0+dmlmLnAycCkpCisJCQkgICAgaWVlZTgwMjExX2lzX3B1YmxpY19hY3Rpb24oaGRyLCBza2ItPmxlbikpCisJCQkJcmV0dXJuIDE7CisJCQlpZiAoIShzdGF0dXMtPnJ4X2ZsYWdzICYgSUVFRTgwMjExX1JYX0lOX1NDQU4pICYmCisJCQkgICAgIWllZWU4MDIxMV9pc19iZWFjb24oaGRyLT5mcmFtZV9jb250cm9sKSkKIAkJCQlyZXR1cm4gMDsKIAkJCXN0YXR1cy0+cnhfZmxhZ3MgJj0gfklFRUU4MDIxMV9SWF9SQV9NQVRDSDsKIAkJfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3NjYW4uYyBiL25ldC9tYWM4MDIxMS9zY2FuLmMKaW5kZXggMTA1NDM2ZC4uOTI3MDc3MSAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3NjYW4uYworKysgYi9uZXQvbWFjODAyMTEvc2Nhbi5jCkBAIC0xMDYsNyArMTA2LDcgQEAKIAkvKiBzYXZlIHRoZSBFUlAgdmFsdWUgc28gdGhhdCBpdCBpcyBhdmFpbGFibGUgYXQgYXNzb2NpYXRpb24gdGltZSAqLwogCWlmIChlbGVtcy0+ZXJwX2luZm8gJiYgZWxlbXMtPmVycF9pbmZvX2xlbiA+PSAxKSB7CiAJCWJzcy0+ZXJwX3ZhbHVlID0gZWxlbXMtPmVycF9pbmZvWzBdOwotCQlic3MtPmhhc19lcnBfdmFsdWUgPSAxOworCQlic3MtPmhhc19lcnBfdmFsdWUgPSB0cnVlOwogCX0KIAogCWlmIChlbGVtcy0+dGltKSB7CkBAIC0yMTMsMTIgKzIxMyw3IEBACiAJaWYgKGJzcykKIAkJaWVlZTgwMjExX3J4X2Jzc19wdXQoc2RhdGEtPmxvY2FsLCBic3MpOwogCi0JLyogSWYgd2UgYXJlIG9uLW9wZXJhdGluZy1jaGFubmVsLCBhbmQgdGhpcyBwYWNrZXQgaXMgZm9yIHRoZQotCSAqIGN1cnJlbnQgY2hhbm5lbCwgcGFzcyB0aGUgcGt0IG9uIHVwIHRoZSBzdGFjayBzbyB0aGF0Ci0JICogdGhlIHJlc3Qgb2YgdGhlIHN0YWNrIGNhbiBtYWtlIHVzZSBvZiBpdC4KLQkgKi8KLQlpZiAoaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwoc2RhdGEtPmxvY2FsKQotCSAgICAmJiAoY2hhbm5lbCA9PSBzZGF0YS0+bG9jYWwtPm9wZXJfY2hhbm5lbCkpCisJaWYgKGNoYW5uZWwgPT0gc2RhdGEtPmxvY2FsLT5vcGVyX2NoYW5uZWwpCiAJCXJldHVybiBSWF9DT05USU5VRTsKIAogCWRldl9rZnJlZV9za2Ioc2tiKTsKQEAgLTI2NCw4ICsyNTksNiBAQAogCQkJCSAgICAgICBib29sIHdhc19od19zY2FuKQogewogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwotCWJvb2wgb25fb3Blcl9jaGFuOwotCWJvb2wgZW5hYmxlX2JlYWNvbnMgPSBmYWxzZTsKIAogCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5tdHgpOwogCkBAIC0yOTgsMjUgKzI5MSwxMyBAQAogCWxvY2FsLT5zY2FubmluZyA9IDA7CiAJbG9jYWwtPnNjYW5fY2hhbm5lbCA9IE5VTEw7CiAKLQlvbl9vcGVyX2NoYW4gPSBpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCk7Ci0KLQlpZiAod2FzX2h3X3NjYW4gfHwgIW9uX29wZXJfY2hhbikKLQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpOwotCWVsc2UKLQkJLyogU2V0IHBvd2VyIGJhY2sgdG8gbm9ybWFsIG9wZXJhdGluZyBsZXZlbHMuICovCi0JCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOworCS8qIFNldCBwb3dlciBiYWNrIHRvIG5vcm1hbCBvcGVyYXRpbmcgbGV2ZWxzLiAqLworCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOwogCiAJaWYgKCF3YXNfaHdfc2NhbikgewotCQlib29sIG9uX29wZXJfY2hhbjI7CiAJCWllZWU4MDIxMV9jb25maWd1cmVfZmlsdGVyKGxvY2FsKTsKIAkJZHJ2X3N3X3NjYW5fY29tcGxldGUobG9jYWwpOwotCQlvbl9vcGVyX2NoYW4yID0gaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwobG9jYWwpOwotCQkvKiBXZSBzaG91bGQgYWx3YXlzIGJlIG9uLWNoYW5uZWwgYXQgdGhpcyBwb2ludC4gKi8KLQkJV0FSTl9PTighb25fb3Blcl9jaGFuMik7Ci0JCWlmIChvbl9vcGVyX2NoYW4yICYmIChvbl9vcGVyX2NoYW4gIT0gb25fb3Blcl9jaGFuMikpCi0JCQllbmFibGVfYmVhY29ucyA9IHRydWU7Ci0KLQkJaWVlZTgwMjExX29mZmNoYW5uZWxfcmV0dXJuKGxvY2FsLCBlbmFibGVfYmVhY29ucywgdHJ1ZSk7CisJCWllZWU4MDIxMV9vZmZjaGFubmVsX3JldHVybihsb2NhbCwgdHJ1ZSk7CiAJfQogCiAJaWVlZTgwMjExX3JlY2FsY19pZGxlKGxvY2FsKTsKQEAgLTM2MSwxMSArMzQyLDcgQEAKIAlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9ERUNJU0lPTjsKIAlsb2NhbC0+c2Nhbl9jaGFubmVsX2lkeCA9IDA7CiAKLQkvKiBXZSBhbHdheXMgd2FudCB0byB1c2Ugb2ZmLWNoYW5uZWwgUFMsIGV2ZW4gaWYgd2UKLQkgKiBhcmUgbm90IHJlYWxseSBsZWF2aW5nIG9wZXItY2hhbm5lbC4gIERvbid0Ci0JICogdGVsbCB0aGUgQVAgdGhvdWdoLCBhcyBsb25nIGFzIHdlIGFyZSBvbi1jaGFubmVsLgotCSAqLwotCWllZWU4MDIxMV9vZmZjaGFubmVsX2VuYWJsZV9hbGxfcHMobG9jYWwsIGZhbHNlKTsKKwlpZWVlODAyMTFfb2ZmY2hhbm5lbF9zdG9wX3ZpZnMobG9jYWwsIHRydWUpOwogCiAJaWVlZTgwMjExX2NvbmZpZ3VyZV9maWx0ZXIobG9jYWwpOwogCkBAIC0zNzMsOCArMzUwLDcgQEAKIAlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCAwKTsKIAogCWllZWU4MDIxMV9xdWV1ZV9kZWxheWVkX3dvcmsoJmxvY2FsLT5odywKLQkJCQkgICAgICZsb2NhbC0+c2Nhbl93b3JrLAotCQkJCSAgICAgSUVFRTgwMjExX0NIQU5ORUxfVElNRSk7CisJCQkJICAgICAmbG9jYWwtPnNjYW5fd29yaywgMCk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTUxMCw5OCArNDg2LDQxIEBACiAKIAluZXh0X2NoYW4gPSBsb2NhbC0+c2Nhbl9yZXEtPmNoYW5uZWxzW2xvY2FsLT5zY2FuX2NoYW5uZWxfaWR4XTsKIAotCWlmIChpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCkpIHsKLQkJLyogV2UncmUgY3VycmVudGx5IG9uIG9wZXJhdGluZyBjaGFubmVsLiAqLwotCQlpZiAobmV4dF9jaGFuID09IGxvY2FsLT5vcGVyX2NoYW5uZWwpCi0JCQkvKiBXZSBkb24ndCBuZWVkIHRvIG1vdmUgb2ZmIG9mIG9wZXJhdGluZyBjaGFubmVsLiAqLwotCQkJbG9jYWwtPm5leHRfc2Nhbl9zdGF0ZSA9IFNDQU5fU0VUX0NIQU5ORUw7Ci0JCWVsc2UKLQkJCS8qCi0JCQkgKiBXZSBkbyBuZWVkIHRvIGxlYXZlIG9wZXJhdGluZyBjaGFubmVsLCBhcyBuZXh0Ci0JCQkgKiBzY2FuIGlzIHNvbWV3aGVyZSBlbHNlLgotCQkJICovCi0JCQlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9MRUFWRV9PUEVSX0NIQU5ORUw7Ci0JfSBlbHNlIHsKLQkJLyoKLQkJICogd2UncmUgY3VycmVudGx5IHNjYW5uaW5nIGEgZGlmZmVyZW50IGNoYW5uZWwsIGxldCdzCi0JCSAqIHNlZSBpZiB3ZSBjYW4gc2NhbiBhbm90aGVyIGNoYW5uZWwgd2l0aG91dCBpbnRlcmZlcmluZwotCQkgKiB3aXRoIHRoZSBjdXJyZW50IHRyYWZmaWMgc2l0dWF0aW9uLgotCQkgKgotCQkgKiBTaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBBUCBoYXMgcGVuZGluZyBmcmFtZXMgZm9yIHVzCi0JCSAqIHdlIGNhbiBvbmx5IGNoZWNrIGZvciBvdXIgdHggcXVldWVzIGFuZCB1c2UgdGhlIGN1cnJlbnQKLQkJICogcG1fcW9zIHJlcXVpcmVtZW50cyBmb3IgcnguIEhlbmNlLCBpZiBubyB0eCB0cmFmZmljIG9jY3VycwotCQkgKiBhdCBhbGwgd2Ugd2lsbCBzY2FuIGFzIG1hbnkgY2hhbm5lbHMgaW4gYSByb3cgYXMgdGhlIHBtX3FvcwotCQkgKiBsYXRlbmN5IGFsbG93cyB1cyB0by4gQWRkaXRpb25hbGx5IHdlIGFsc28gY2hlY2sgZm9yIHRoZQotCQkgKiBjdXJyZW50bHkgbmVnb3RpYXRlZCBsaXN0ZW4gaW50ZXJ2YWwgdG8gcHJldmVudCBsb3NpbmcKLQkJICogZnJhbWVzIHVubmVjZXNzYXJpbHkuCi0JCSAqCi0JCSAqIE90aGVyd2lzZSBzd2l0Y2ggYmFjayB0byB0aGUgb3BlcmF0aW5nIGNoYW5uZWwuCi0JCSAqLworCS8qCisJICogd2UncmUgY3VycmVudGx5IHNjYW5uaW5nIGEgZGlmZmVyZW50IGNoYW5uZWwsIGxldCdzCisJICogc2VlIGlmIHdlIGNhbiBzY2FuIGFub3RoZXIgY2hhbm5lbCB3aXRob3V0IGludGVyZmVyaW5nCisJICogd2l0aCB0aGUgY3VycmVudCB0cmFmZmljIHNpdHVhdGlvbi4KKwkgKgorCSAqIFNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhlIEFQIGhhcyBwZW5kaW5nIGZyYW1lcyBmb3IgdXMKKwkgKiB3ZSBjYW4gb25seSBjaGVjayBmb3Igb3VyIHR4IHF1ZXVlcyBhbmQgdXNlIHRoZSBjdXJyZW50CisJICogcG1fcW9zIHJlcXVpcmVtZW50cyBmb3IgcnguIEhlbmNlLCBpZiBubyB0eCB0cmFmZmljIG9jY3VycworCSAqIGF0IGFsbCB3ZSB3aWxsIHNjYW4gYXMgbWFueSBjaGFubmVscyBpbiBhIHJvdyBhcyB0aGUgcG1fcW9zCisJICogbGF0ZW5jeSBhbGxvd3MgdXMgdG8uIEFkZGl0aW9uYWxseSB3ZSBhbHNvIGNoZWNrIGZvciB0aGUKKwkgKiBjdXJyZW50bHkgbmVnb3RpYXRlZCBsaXN0ZW4gaW50ZXJ2YWwgdG8gcHJldmVudCBsb3NpbmcKKwkgKiBmcmFtZXMgdW5uZWNlc3NhcmlseS4KKwkgKgorCSAqIE90aGVyd2lzZSBzd2l0Y2ggYmFjayB0byB0aGUgb3BlcmF0aW5nIGNoYW5uZWwuCisJICovCiAKLQkJYmFkX2xhdGVuY3kgPSB0aW1lX2FmdGVyKGppZmZpZXMgKwotCQkJCWllZWU4MDIxMV9zY2FuX2dldF9jaGFubmVsX3RpbWUobmV4dF9jaGFuKSwKLQkJCQlsb2NhbC0+bGVhdmVfb3Blcl9jaGFubmVsX3RpbWUgKwotCQkJCXVzZWNzX3RvX2ppZmZpZXMocG1fcW9zX3JlcXVlc3QoUE1fUU9TX05FVFdPUktfTEFURU5DWSkpKTsKKwliYWRfbGF0ZW5jeSA9IHRpbWVfYWZ0ZXIoamlmZmllcyArCisJCQlpZWVlODAyMTFfc2Nhbl9nZXRfY2hhbm5lbF90aW1lKG5leHRfY2hhbiksCisJCQlsb2NhbC0+bGVhdmVfb3Blcl9jaGFubmVsX3RpbWUgKworCQkJdXNlY3NfdG9famlmZmllcyhwbV9xb3NfcmVxdWVzdChQTV9RT1NfTkVUV09SS19MQVRFTkNZKSkpOwogCi0JCWxpc3Rlbl9pbnRfZXhjZWVkZWQgPSB0aW1lX2FmdGVyKGppZmZpZXMgKwotCQkJCWllZWU4MDIxMV9zY2FuX2dldF9jaGFubmVsX3RpbWUobmV4dF9jaGFuKSwKLQkJCQlsb2NhbC0+bGVhdmVfb3Blcl9jaGFubmVsX3RpbWUgKwotCQkJCXVzZWNzX3RvX2ppZmZpZXMobWluX2JlYWNvbl9pbnQgKiAxMDI0KSAqCi0JCQkJbG9jYWwtPmh3LmNvbmYubGlzdGVuX2ludGVydmFsKTsKKwlsaXN0ZW5faW50X2V4Y2VlZGVkID0gdGltZV9hZnRlcihqaWZmaWVzICsKKwkJCWllZWU4MDIxMV9zY2FuX2dldF9jaGFubmVsX3RpbWUobmV4dF9jaGFuKSwKKwkJCWxvY2FsLT5sZWF2ZV9vcGVyX2NoYW5uZWxfdGltZSArCisJCQl1c2Vjc190b19qaWZmaWVzKG1pbl9iZWFjb25faW50ICogMTAyNCkgKgorCQkJbG9jYWwtPmh3LmNvbmYubGlzdGVuX2ludGVydmFsKTsKIAotCQlpZiAoYXNzb2NpYXRlZCAmJiAoICF0eF9lbXB0eSB8fCBiYWRfbGF0ZW5jeSB8fAotCQkgICAgbGlzdGVuX2ludF9leGNlZWRlZCkpCi0JCQlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9FTlRFUl9PUEVSX0NIQU5ORUw7Ci0JCWVsc2UKLQkJCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX1NFVF9DSEFOTkVMOwotCX0KKwlpZiAoYXNzb2NpYXRlZCAmJiAoIXR4X2VtcHR5IHx8IGJhZF9sYXRlbmN5IHx8IGxpc3Rlbl9pbnRfZXhjZWVkZWQpKQorCQlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9TVVNQRU5EOworCWVsc2UKKwkJbG9jYWwtPm5leHRfc2Nhbl9zdGF0ZSA9IFNDQU5fU0VUX0NIQU5ORUw7CiAKIAkqbmV4dF9kZWxheSA9IDA7CiB9CiAKLXN0YXRpYyB2b2lkIGllZWU4MDIxMV9zY2FuX3N0YXRlX2xlYXZlX29wZXJfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKLQkJCQkJCSAgICB1bnNpZ25lZCBsb25nICpuZXh0X2RlbGF5KQotewotCS8qIFBTIHdpbGwgYWxyZWFkeSBiZSBpbiBvZmYtY2hhbm5lbCBtb2RlLAotCSAqIHdlIGRvIHRoYXQgb25jZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHNjYW5uaW5nLgotCSAqLwotCWllZWU4MDIxMV9vZmZjaGFubmVsX3N0b3Bfdmlmcyhsb2NhbCwgZmFsc2UpOwotCi0JLyoKLQkgKiBXaGF0IGlmIHRoZSBudWxsZnVuYyBmcmFtZXMgZGlkbid0IGFycml2ZT8KLQkgKi8KLQlkcnZfZmx1c2gobG9jYWwsIGZhbHNlKTsKLQlpZiAobG9jYWwtPm9wcy0+Zmx1c2gpCi0JCSpuZXh0X2RlbGF5ID0gMDsKLQllbHNlCi0JCSpuZXh0X2RlbGF5ID0gSFogLyAxMDsKLQotCS8qIHJlbWVtYmVyIHdoZW4gd2UgbGVmdCB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgKi8KLQlsb2NhbC0+bGVhdmVfb3Blcl9jaGFubmVsX3RpbWUgPSBqaWZmaWVzOwotCi0JLyogYWR2YW5jZSB0byB0aGUgbmV4dCBjaGFubmVsIHRvIGJlIHNjYW5uZWQgKi8KLQlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9TRVRfQ0hBTk5FTDsKLX0KLQotc3RhdGljIHZvaWQgaWVlZTgwMjExX3NjYW5fc3RhdGVfZW50ZXJfb3Blcl9jaGFubmVsKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJCQkJICAgIHVuc2lnbmVkIGxvbmcgKm5leHRfZGVsYXkpCi17Ci0JLyogc3dpdGNoIGJhY2sgdG8gdGhlIG9wZXJhdGluZyBjaGFubmVsICovCi0JbG9jYWwtPnNjYW5fY2hhbm5lbCA9IE5VTEw7Ci0JaWYgKCFpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCkpCi0JCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKTsKLQotCS8qCi0JICogUmUtZW5hYmxlIHZpZnMgYW5kIGJlYWNvbmluZy4gIExlYXZlIFBTCi0JICogaW4gb2ZmLWNoYW5uZWwgc3RhdGUuLndpbGwgcHV0IHRoYXQgYmFjawotCSAqIG9uLWNoYW5uZWwgYXQgdGhlIGVuZCBvZiBzY2FubmluZy4KLQkgKi8KLQlpZWVlODAyMTFfb2ZmY2hhbm5lbF9yZXR1cm4obG9jYWwsIHRydWUsIGZhbHNlKTsKLQotCSpuZXh0X2RlbGF5ID0gSFogLyA1OwotCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX0RFQ0lTSU9OOwotfQotCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2Nhbl9zdGF0ZV9zZXRfY2hhbm5lbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCQkJICAgICB1bnNpZ25lZCBsb25nICpuZXh0X2RlbGF5KQogewpAQCAtNjEzLDEwICs1MzIsOCBAQAogCiAJbG9jYWwtPnNjYW5fY2hhbm5lbCA9IGNoYW47CiAKLQkvKiBPbmx5IGNhbGwgaHctY29uZmlnIGlmIHdlIHJlYWxseSBuZWVkIHRvIGNoYW5nZSBjaGFubmVscy4gKi8KLQlpZiAoY2hhbiAhPSBsb2NhbC0+aHcuY29uZi5jaGFubmVsKQotCQlpZiAoaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgSUVFRTgwMjExX0NPTkZfQ0hBTkdFX0NIQU5ORUwpKQotCQkJc2tpcCA9IDE7CisJaWYgKGllZWU4MDIxMV9od19jb25maWcobG9jYWwsIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFOTkVMKSkKKwkJc2tpcCA9IDE7CiAKIAkvKiBhZHZhbmNlIHN0YXRlIG1hY2hpbmUgdG8gbmV4dCBjaGFubmVsL2JhbmQgKi8KIAlsb2NhbC0+c2Nhbl9jaGFubmVsX2lkeCsrOwpAQCAtNjczLDYgKzU5MCw0NCBAQAogCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX0RFQ0lTSU9OOwogfQogCitzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2Nhbl9zdGF0ZV9zdXNwZW5kKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCQkgdW5zaWduZWQgbG9uZyAqbmV4dF9kZWxheSkKK3sKKwkvKiBzd2l0Y2ggYmFjayB0byB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgKi8KKwlsb2NhbC0+c2Nhbl9jaGFubmVsID0gTlVMTDsKKwlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCBJRUVFODAyMTFfQ09ORl9DSEFOR0VfQ0hBTk5FTCk7CisKKwkvKgorCSAqIFJlLWVuYWJsZSB2aWZzIGFuZCBiZWFjb25pbmcuICBMZWF2ZSBQUworCSAqIGluIG9mZi1jaGFubmVsIHN0YXRlLi53aWxsIHB1dCB0aGF0IGJhY2sKKwkgKiBvbi1jaGFubmVsIGF0IHRoZSBlbmQgb2Ygc2Nhbm5pbmcuCisJICovCisJaWVlZTgwMjExX29mZmNoYW5uZWxfcmV0dXJuKGxvY2FsLCBmYWxzZSk7CisKKwkqbmV4dF9kZWxheSA9IEhaIC8gNTsKKwkvKiBhZnRlcndhcmRzLCByZXN1bWUgc2NhbiAmIGdvIHRvIG5leHQgY2hhbm5lbCAqLworCWxvY2FsLT5uZXh0X3NjYW5fc3RhdGUgPSBTQ0FOX1JFU1VNRTsKK30KKworc3RhdGljIHZvaWQgaWVlZTgwMjExX3NjYW5fc3RhdGVfcmVzdW1lKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJCQl1bnNpZ25lZCBsb25nICpuZXh0X2RlbGF5KQoreworCS8qIFBTIGFscmVhZHkgaXMgaW4gb2ZmLWNoYW5uZWwgbW9kZSAqLworCWllZWU4MDIxMV9vZmZjaGFubmVsX3N0b3Bfdmlmcyhsb2NhbCwgZmFsc2UpOworCisJaWYgKGxvY2FsLT5vcHMtPmZsdXNoKSB7CisJCWRydl9mbHVzaChsb2NhbCwgZmFsc2UpOworCQkqbmV4dF9kZWxheSA9IDA7CisJfSBlbHNlCisJCSpuZXh0X2RlbGF5ID0gSFogLyAxMDsKKworCS8qIHJlbWVtYmVyIHdoZW4gd2UgbGVmdCB0aGUgb3BlcmF0aW5nIGNoYW5uZWwgKi8KKwlsb2NhbC0+bGVhdmVfb3Blcl9jaGFubmVsX3RpbWUgPSBqaWZmaWVzOworCisJLyogYWR2YW5jZSB0byB0aGUgbmV4dCBjaGFubmVsIHRvIGJlIHNjYW5uZWQgKi8KKwlsb2NhbC0+bmV4dF9zY2FuX3N0YXRlID0gU0NBTl9TRVRfQ0hBTk5FTDsKK30KKwogdm9pZCBpZWVlODAyMTFfc2Nhbl93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9CkBAIC03NDMsMTEgKzY5OCwxMSBAQAogCQljYXNlIFNDQU5fU0VORF9QUk9CRToKIAkJCWllZWU4MDIxMV9zY2FuX3N0YXRlX3NlbmRfcHJvYmUobG9jYWwsICZuZXh0X2RlbGF5KTsKIAkJCWJyZWFrOwotCQljYXNlIFNDQU5fTEVBVkVfT1BFUl9DSEFOTkVMOgotCQkJaWVlZTgwMjExX3NjYW5fc3RhdGVfbGVhdmVfb3Blcl9jaGFubmVsKGxvY2FsLCAmbmV4dF9kZWxheSk7CisJCWNhc2UgU0NBTl9TVVNQRU5EOgorCQkJaWVlZTgwMjExX3NjYW5fc3RhdGVfc3VzcGVuZChsb2NhbCwgJm5leHRfZGVsYXkpOwogCQkJYnJlYWs7Ci0JCWNhc2UgU0NBTl9FTlRFUl9PUEVSX0NIQU5ORUw6Ci0JCQlpZWVlODAyMTFfc2Nhbl9zdGF0ZV9lbnRlcl9vcGVyX2NoYW5uZWwobG9jYWwsICZuZXh0X2RlbGF5KTsKKwkJY2FzZSBTQ0FOX1JFU1VNRToKKwkJCWllZWU4MDIxMV9zY2FuX3N0YXRlX3Jlc3VtZShsb2NhbCwgJm5leHRfZGVsYXkpOwogCQkJYnJlYWs7CiAJCX0KIAl9IHdoaWxlIChuZXh0X2RlbGF5ID09IDApOwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmMgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwppbmRleCA4ZWFhNzQ2Li5iMTk3MTM2IDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhX2luZm8uYworKysgYi9uZXQvbWFjODAyMTEvc3RhX2luZm8uYwpAQCAtNjIsMTQgKzYyLDE0IEBACiAgKiBmcmVlZCBiZWZvcmUgdGhleSBhcmUgZG9uZSB1c2luZyBpdC4KICAqLwogCi0vKiBDYWxsZXIgbXVzdCBob2xkIGxvY2FsLT5zdGFfbG9jayAqLworLyogQ2FsbGVyIG11c3QgaG9sZCBsb2NhbC0+c3RhX210eCAqLwogc3RhdGljIGludCBzdGFfaW5mb19oYXNoX2RlbChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCSAgICAgc3RydWN0IHN0YV9pbmZvICpzdGEpCiB7CiAJc3RydWN0IHN0YV9pbmZvICpzOwogCiAJcyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKHN0YS0+c3RhLmFkZHIpXSwKLQkJCQkgICAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbG9jaykpOworCQkJCSAgICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9tdHgpKTsKIAlpZiAoIXMpCiAJCXJldHVybiAtRU5PRU5UOwogCWlmIChzID09IHN0YSkgewpAQCAtODEsNyArODEsNyBAQAogCXdoaWxlIChyY3VfYWNjZXNzX3BvaW50ZXIocy0+aG5leHQpICYmCiAJICAgICAgIHJjdV9hY2Nlc3NfcG9pbnRlcihzLT5obmV4dCkgIT0gc3RhKQogCQlzID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChzLT5obmV4dCwKLQkJCQkJbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX2xvY2spKTsKKwkJCQkJbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOwogCWlmIChyY3VfYWNjZXNzX3BvaW50ZXIocy0+aG5leHQpKSB7CiAJCVJDVV9JTklUX1BPSU5URVIocy0+aG5leHQsIHN0YS0+aG5leHQpOwogCQlyZXR1cm4gMDsKQEAgLTk4LDE0ICs5OCwxMiBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCiAJc3RhID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChhZGRyKV0sCi0JCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9sb2NrKSB8fAogCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7CiAJd2hpbGUgKHN0YSkgewogCQlpZiAoc3RhLT5zZGF0YSA9PSBzZGF0YSAmJiAhc3RhLT5kdW1teSAmJgogCQkgICAgbWVtY21wKHN0YS0+c3RhLmFkZHIsIGFkZHIsIEVUSF9BTEVOKSA9PSAwKQogCQkJYnJlYWs7CiAJCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhzdGEtPmhuZXh0LAotCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX2xvY2spIHx8CiAJCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7CiAJfQogCXJldHVybiBzdGE7CkBAIC0xMTksMTQgKzExNywxMiBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhOwogCiAJc3RhID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChhZGRyKV0sCi0JCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9sb2NrKSB8fAogCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7CiAJd2hpbGUgKHN0YSkgewogCQlpZiAoc3RhLT5zZGF0YSA9PSBzZGF0YSAmJgogCQkgICAgbWVtY21wKHN0YS0+c3RhLmFkZHIsIGFkZHIsIEVUSF9BTEVOKSA9PSAwKQogCQkJYnJlYWs7CiAJCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhzdGEtPmhuZXh0LAotCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX2xvY2spIHx8CiAJCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbXR4KSk7CiAJfQogCXJldHVybiBzdGE7CkBAIC0xNDMsNyArMTM5LDYgQEAKIAlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKIAogCXN0YSA9IHJjdV9kZXJlZmVyZW5jZV9jaGVjayhsb2NhbC0+c3RhX2hhc2hbU1RBX0hBU0goYWRkcildLAotCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbG9jaykgfHwKIAkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOwogCXdoaWxlIChzdGEpIHsKIAkJaWYgKChzdGEtPnNkYXRhID09IHNkYXRhIHx8CkBAIC0xNTIsNyArMTQ3LDYgQEAKIAkJICAgIG1lbWNtcChzdGEtPnN0YS5hZGRyLCBhZGRyLCBFVEhfQUxFTikgPT0gMCkKIAkJCWJyZWFrOwogCQlzdGEgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2soc3RhLT5obmV4dCwKLQkJCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9sb2NrKSB8fAogCQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX210eCkpOwogCX0KIAlyZXR1cm4gc3RhOwpAQCAtMTY5LDcgKzE2Myw2IEBACiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CiAKIAlzdGEgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2sobG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKGFkZHIpXSwKLQkJCQkgICAgbG9ja2RlcF9pc19oZWxkKCZsb2NhbC0+c3RhX2xvY2spIHx8CiAJCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9tdHgpKTsKIAl3aGlsZSAoc3RhKSB7CiAJCWlmICgoc3RhLT5zZGF0YSA9PSBzZGF0YSB8fApAQCAtMTc3LDcgKzE3MCw2IEBACiAJCSAgICBtZW1jbXAoc3RhLT5zdGEuYWRkciwgYWRkciwgRVRIX0FMRU4pID09IDApCiAJCQlicmVhazsKIAkJc3RhID0gcmN1X2RlcmVmZXJlbmNlX2NoZWNrKHN0YS0+aG5leHQsCi0JCQkJCSAgICBsb2NrZGVwX2lzX2hlbGQoJmxvY2FsLT5zdGFfbG9jaykgfHwKIAkJCQkJICAgIGxvY2tkZXBfaXNfaGVsZCgmbG9jYWwtPnN0YV9tdHgpKTsKIAl9CiAJcmV0dXJuIHN0YTsKQEAgLTIwNCwxNiArMTk2LDE3IEBACiB9CiAKIC8qKgotICogX19zdGFfaW5mb19mcmVlIC0gaW50ZXJuYWwgU1RBIGZyZWUgaGVscGVyCisgKiBzdGFfaW5mb19mcmVlIC0gZnJlZSBTVEEKICAqCiAgKiBAbG9jYWw6IHBvaW50ZXIgdG8gdGhlIGdsb2JhbCBpbmZvcm1hdGlvbgogICogQHN0YTogU1RBIGluZm8gdG8gZnJlZQogICoKICAqIFRoaXMgZnVuY3Rpb24gbXVzdCB1bmRvIGV2ZXJ5dGhpbmcgZG9uZSBieSBzdGFfaW5mb19hbGxvYygpCi0gKiB0aGF0IG1heSBoYXBwZW4gYmVmb3JlIHN0YV9pbmZvX2luc2VydCgpLgorICogdGhhdCBtYXkgaGFwcGVuIGJlZm9yZSBzdGFfaW5mb19pbnNlcnQoKS4gSXQgbWF5IG9ubHkgYmUKKyAqIGNhbGxlZCB3aGVuIHN0YV9pbmZvX2luc2VydCgpIGhhcyBub3QgYmVlbiBhdHRlbXB0ZWQgKGFuZAorICogaWYgdGhhdCBmYWlscywgdGhlIHN0YXRpb24gaXMgZnJlZWQgYW55d2F5LikKICAqLwotc3RhdGljIHZvaWQgX19zdGFfaW5mb19mcmVlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAotCQkJICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQordm9pZCBzdGFfaW5mb19mcmVlKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLCBzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKIAlpZiAoc3RhLT5yYXRlX2N0cmwpIHsKIAkJcmF0ZV9jb250cm9sX2ZyZWVfc3RhKHN0YSk7CkBAIC0yMjcsMTAgKzIyMCwxMSBAQAogCWtmcmVlKHN0YSk7CiB9CiAKLS8qIENhbGxlciBtdXN0IGhvbGQgbG9jYWwtPnN0YV9sb2NrICovCisvKiBDYWxsZXIgbXVzdCBob2xkIGxvY2FsLT5zdGFfbXR4ICovCiBzdGF0aWMgdm9pZCBzdGFfaW5mb19oYXNoX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKIAkJCSAgICAgIHN0cnVjdCBzdGFfaW5mbyAqc3RhKQogeworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5zdGFfbXR4KTsKIAlzdGEtPmhuZXh0ID0gbG9jYWwtPnN0YV9oYXNoW1NUQV9IQVNIKHN0YS0+c3RhLmFkZHIpXTsKIAlSQ1VfSU5JVF9QT0lOVEVSKGxvY2FsLT5zdGFfaGFzaFtTVEFfSEFTSChzdGEtPnN0YS5hZGRyKV0sIHN0YSk7CiB9CkBAIC0yODAsNyArMjc0LDcgQEAKIH0KIAogc3RydWN0IHN0YV9pbmZvICpzdGFfaW5mb19hbGxvYyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKLQkJCQl1OCAqYWRkciwgZ2ZwX3QgZ2ZwKQorCQkJCWNvbnN0IHU4ICphZGRyLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzZGF0YS0+bG9jYWw7CiAJc3RydWN0IHN0YV9pbmZvICpzdGE7CkBAIC0zMzgsMTAyICszMzIsNiBAQAogCXJldHVybiBzdGE7CiB9CiAKLXN0YXRpYyBpbnQgc3RhX2luZm9fZmluaXNoX2luc2VydChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSwKLQkJCQlib29sIGFzeW5jLCBib29sIGR1bW15X3JlaW5zZXJ0KQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gc3RhLT5sb2NhbDsKLQlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHN0YS0+c2RhdGE7Ci0Jc3RydWN0IHN0YXRpb25faW5mbyBzaW5mbzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWludCBlcnIgPSAwOwotCi0JbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPnN0YV9tdHgpOwotCi0JaWYgKCFzdGEtPmR1bW15IHx8IGR1bW15X3JlaW5zZXJ0KSB7Ci0JCS8qIG5vdGlmeSBkcml2ZXIgKi8KLQkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQotCQkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKLQkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLAotCQkJCQkgICAgIHUuYXApOwotCQllcnIgPSBkcnZfc3RhX2FkZChsb2NhbCwgc2RhdGEsICZzdGEtPnN0YSk7Ci0JCWlmIChlcnIpIHsKLQkJCWlmICghYXN5bmMpCi0JCQkJcmV0dXJuIGVycjsKLQkJCXByaW50ayhLRVJOX0RFQlVHICIlczogZmFpbGVkIHRvIGFkZCBJQlNTIFNUQSAlcE0gdG8gIgotCQkJCQkgICJkcml2ZXIgKCVkKSAtIGtlZXBpbmcgaXQgYW55d2F5LlxuIiwKLQkJCSAgICAgICBzZGF0YS0+bmFtZSwgc3RhLT5zdGEuYWRkciwgZXJyKTsKLQkJfSBlbHNlIHsKLQkJCXN0YS0+dXBsb2FkZWQgPSB0cnVlOwotI2lmZGVmIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHCi0JCQlpZiAoYXN5bmMpCi0JCQkJd2lwaHlfZGVidWcobG9jYWwtPmh3LndpcGh5LAotCQkJCQkgICAgIkZpbmlzaGVkIGFkZGluZyBJQlNTIFNUQSAlcE1cbiIsCi0JCQkJCSAgICBzdGEtPnN0YS5hZGRyKTsKLSNlbmRpZgotCQl9Ci0KLQkJc2RhdGEgPSBzdGEtPnNkYXRhOwotCX0KLQotCWlmICghZHVtbXlfcmVpbnNlcnQpIHsKLQkJaWYgKCFhc3luYykgewotCQkJbG9jYWwtPm51bV9zdGErKzsKLQkJCWxvY2FsLT5zdGFfZ2VuZXJhdGlvbisrOwotCQkJc21wX21iKCk7Ci0KLQkJCS8qIG1ha2UgdGhlIHN0YXRpb24gdmlzaWJsZSAqLwotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwotCQkJc3RhX2luZm9faGFzaF9hZGQobG9jYWwsIHN0YSk7Ci0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKLQkJfQotCi0JCWxpc3RfYWRkKCZzdGEtPmxpc3QsICZsb2NhbC0+c3RhX2xpc3QpOwotCX0gZWxzZSB7Ci0JCXN0YS0+ZHVtbXkgPSBmYWxzZTsKLQl9Ci0KLQlpZiAoIXN0YS0+ZHVtbXkpIHsKLQkJaWVlZTgwMjExX3N0YV9kZWJ1Z2ZzX2FkZChzdGEpOwotCQlyYXRlX2NvbnRyb2xfYWRkX3N0YV9kZWJ1Z2ZzKHN0YSk7Ci0KLQkJbWVtc2V0KCZzaW5mbywgMCwgc2l6ZW9mKHNpbmZvKSk7Ci0JCXNpbmZvLmZpbGxlZCA9IDA7Ci0JCXNpbmZvLmdlbmVyYXRpb24gPSBsb2NhbC0+c3RhX2dlbmVyYXRpb247Ci0JCWNmZzgwMjExX25ld19zdGEoc2RhdGEtPmRldiwgc3RhLT5zdGEuYWRkciwgJnNpbmZvLCBHRlBfS0VSTkVMKTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgc3RhX2luZm9fZmluaXNoX3BlbmRpbmcoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCi17Ci0Jc3RydWN0IHN0YV9pbmZvICpzdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmxvY2FsLT5zdGFfcGVuZGluZ19saXN0KSkgewotCQlzdGEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZsb2NhbC0+c3RhX3BlbmRpbmdfbGlzdCwKLQkJCQkgICAgICAgc3RydWN0IHN0YV9pbmZvLCBsaXN0KTsKLQkJbGlzdF9kZWwoJnN0YS0+bGlzdCk7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwotCi0JCXN0YV9pbmZvX2ZpbmlzaF9pbnNlcnQoc3RhLCB0cnVlLCBmYWxzZSk7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhX2luZm9fZmluaXNoX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0KLQkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwsIHN0YV9maW5pc2hfd29yayk7Ci0KLQltdXRleF9sb2NrKCZsb2NhbC0+c3RhX210eCk7Ci0Jc3RhX2luZm9fZmluaXNoX3BlbmRpbmcobG9jYWwpOwotCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOwotfQotCiBzdGF0aWMgaW50IHN0YV9pbmZvX2luc2VydF9jaGVjayhzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSA9IHN0YS0+c2RhdGE7CkBAIC00NTMsNTAgKzM1MSwxNSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHN0YV9pbmZvX2luc2VydF9pYnNzKHN0cnVjdCBzdGFfaW5mbyAqc3RhKSBfX2FjcXVpcmVzKFJDVSkKLXsKLQlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHN0YS0+bG9jYWw7Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSBzdGEtPnNkYXRhOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPnN0YV9sb2NrLCBmbGFncyk7Ci0JLyogY2hlY2sgaWYgU1RBIGV4aXN0cyBhbHJlYWR5ICovCi0JaWYgKHN0YV9pbmZvX2dldF9ic3Nfcngoc2RhdGEsIHN0YS0+c3RhLmFkZHIpKSB7Ci0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwotCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXJldHVybiAtRUVYSVNUOwotCX0KLQotCWxvY2FsLT5udW1fc3RhKys7Ci0JbG9jYWwtPnN0YV9nZW5lcmF0aW9uKys7Ci0Jc21wX21iKCk7Ci0Jc3RhX2luZm9faGFzaF9hZGQobG9jYWwsIHN0YSk7Ci0KLQlsaXN0X2FkZF90YWlsKCZzdGEtPmxpc3QsICZsb2NhbC0+c3RhX3BlbmRpbmdfbGlzdCk7Ci0KLQlyY3VfcmVhZF9sb2NrKCk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnN0YV9sb2NrLCBmbGFncyk7Ci0KLSNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRwotCXdpcGh5X2RlYnVnKGxvY2FsLT5ody53aXBoeSwgIkFkZGVkIElCU1MgU1RBICVwTVxuIiwKLQkJCXN0YS0+c3RhLmFkZHIpOwotI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9WRVJCT1NFX0RFQlVHICovCi0KLQlpZWVlODAyMTFfcXVldWVfd29yaygmbG9jYWwtPmh3LCAmbG9jYWwtPnN0YV9maW5pc2hfd29yayk7Ci0KLQlyZXR1cm4gMDsKLX0KLQogLyoKICAqIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBzdGFfbXR4IGxvY2tlZAogICogdGhpcyBmdW5jdGlvbiByZXBsYWNlcyB0aGUgbXV0ZXggbG9jawogICogd2l0aCBhIFJDVSBsb2NrCiAgKi8KLXN0YXRpYyBpbnQgc3RhX2luZm9faW5zZXJ0X25vbl9pYnNzKHN0cnVjdCBzdGFfaW5mbyAqc3RhKSBfX2FjcXVpcmVzKFJDVSkKK3N0YXRpYyBpbnQgc3RhX2luZm9faW5zZXJ0X2ZpbmlzaChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkgX19hY3F1aXJlcyhSQ1UpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzdGEtPmxvY2FsOwogCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBzdGFfaW5mbyAqZXhpc3Rfc3RhOwogCWJvb2wgZHVtbXlfcmVpbnNlcnQgPSBmYWxzZTsKIAlpbnQgZXJyID0gMDsKQEAgLTUwNCwxOSArMzY3LDggQEAKIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+c3RhX210eCk7CiAKIAkvKgotCSAqIE9uIGZpcnN0IGdsYW5jZSwgdGhpcyB3aWxsIGxvb2sgcmFjeSwgYmVjYXVzZSB0aGUgY29kZQotCSAqIGluIHRoaXMgZnVuY3Rpb24sIHdoaWNoIGluc2VydHMgYSBzdGF0aW9uIHdpdGggc2xlZXBpbmcsCi0JICogdW5sb2NrcyB0aGUgc3RhX2xvY2sgYmV0d2VlbiBjaGVja2luZyBleGlzdGVuY2UgaW4gdGhlCi0JICogaGFzaCB0YWJsZSBhbmQgaW5zZXJ0aW5nIGludG8gaXQuCi0JICoKLQkgKiBIb3dldmVyLCBpdCBpcyBub3QgcmFjeSBhZ2FpbnN0IGl0c2VsZiBiZWNhdXNlIGl0IGtlZXBzCi0JICogdGhlIG11dGV4IGxvY2tlZC4KLQkgKi8KLQotCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKLQkvKgogCSAqIGNoZWNrIGlmIFNUQSBleGlzdHMgYWxyZWFkeS4KLQkgKiBvbmx5IGFjY2VwdCBhIHNjZW5hcmlvIG9mIGEgc2Vjb25kIGNhbGwgdG8gc3RhX2luZm9faW5zZXJ0X25vbl9pYnNzCisJICogb25seSBhY2NlcHQgYSBzY2VuYXJpbyBvZiBhIHNlY29uZCBjYWxsIHRvIHN0YV9pbmZvX2luc2VydF9maW5pc2gKIAkgKiB3aXRoIGEgZHVtbXkgc3RhdGlvbiBlbnRyeSB0aGF0IHdhcyBpbnNlcnRlZCBlYXJsaWVyCiAJICogaW4gdGhhdCBjYXNlIC0gYXNzdW1lIHRoYXQgdGhlIGR1bW15IHN0YXRpb24gZmxhZyBzaG91bGQKIAkgKiBiZSByZW1vdmVkLgpAQCAtNTI2LDIwICszNzgsNDcgQEAKIAkJaWYgKGV4aXN0X3N0YSA9PSBzdGEgJiYgc3RhLT5kdW1teSkgewogCQkJZHVtbXlfcmVpbnNlcnQgPSB0cnVlOwogCQl9IGVsc2UgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnN0YV9sb2NrLCBmbGFncyk7Ci0JCQltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKLQkJCXJjdV9yZWFkX2xvY2soKTsKLQkJCXJldHVybiAtRUVYSVNUOworCQkJZXJyID0gLUVFWElTVDsKKwkJCWdvdG8gb3V0X2VycjsKIAkJfQogCX0KIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOworCWlmICghc3RhLT5kdW1teSB8fCBkdW1teV9yZWluc2VydCkgeworCQkvKiBub3RpZnkgZHJpdmVyICovCisJCWVyciA9IGRydl9zdGFfYWRkKGxvY2FsLCBzZGF0YSwgJnN0YS0+c3RhKTsKKwkJaWYgKGVycikgeworCQkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykKKwkJCQlnb3RvIG91dF9lcnI7CisJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGZhaWxlZCB0byBhZGQgSUJTUyBTVEEgJXBNIHRvICIKKwkJCQkJICAiZHJpdmVyICglZCkgLSBrZWVwaW5nIGl0IGFueXdheS5cbiIsCisJCQkgICAgICAgc2RhdGEtPm5hbWUsIHN0YS0+c3RhLmFkZHIsIGVycik7CisJCX0gZWxzZQorCQkJc3RhLT51cGxvYWRlZCA9IHRydWU7CisJfQogCi0JZXJyID0gc3RhX2luZm9fZmluaXNoX2luc2VydChzdGEsIGZhbHNlLCBkdW1teV9yZWluc2VydCk7Ci0JaWYgKGVycikgewotCQltdXRleF91bmxvY2soJmxvY2FsLT5zdGFfbXR4KTsKLQkJcmN1X3JlYWRfbG9jaygpOwotCQlyZXR1cm4gZXJyOworCWlmICghZHVtbXlfcmVpbnNlcnQpIHsKKwkJbG9jYWwtPm51bV9zdGErKzsKKwkJbG9jYWwtPnN0YV9nZW5lcmF0aW9uKys7CisJCXNtcF9tYigpOworCisJCS8qIG1ha2UgdGhlIHN0YXRpb24gdmlzaWJsZSAqLworCQlzdGFfaW5mb19oYXNoX2FkZChsb2NhbCwgc3RhKTsKKworCQlsaXN0X2FkZCgmc3RhLT5saXN0LCAmbG9jYWwtPnN0YV9saXN0KTsKKwl9IGVsc2UgeworCQlzdGEtPmR1bW15ID0gZmFsc2U7CisJfQorCisJaWYgKCFzdGEtPmR1bW15KSB7CisJCXN0cnVjdCBzdGF0aW9uX2luZm8gc2luZm87CisKKwkJaWVlZTgwMjExX3N0YV9kZWJ1Z2ZzX2FkZChzdGEpOworCQlyYXRlX2NvbnRyb2xfYWRkX3N0YV9kZWJ1Z2ZzKHN0YSk7CisKKwkJbWVtc2V0KCZzaW5mbywgMCwgc2l6ZW9mKHNpbmZvKSk7CisJCXNpbmZvLmZpbGxlZCA9IDA7CisJCXNpbmZvLmdlbmVyYXRpb24gPSBsb2NhbC0+c3RhX2dlbmVyYXRpb247CisJCWNmZzgwMjExX25ld19zdGEoc2RhdGEtPmRldiwgc3RhLT5zdGEuYWRkciwgJnNpbmZvLCBHRlBfS0VSTkVMKTsKIAl9CiAKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRwpAQCAtNTU1LDU0ICs0MzQsMzUgQEAKIAkJbWVzaF9hY2NlcHRfcGxpbmtzX3VwZGF0ZShzZGF0YSk7CiAKIAlyZXR1cm4gMDsKKyBvdXRfZXJyOgorCW11dGV4X3VubG9jaygmbG9jYWwtPnN0YV9tdHgpOworCXJjdV9yZWFkX2xvY2soKTsKKwlyZXR1cm4gZXJyOwogfQogCiBpbnQgc3RhX2luZm9faW5zZXJ0X3JjdShzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkgX19hY3F1aXJlcyhSQ1UpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBzdGEtPmxvY2FsOwotCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhID0gc3RhLT5zZGF0YTsKIAlpbnQgZXJyID0gMDsKIAorCW1pZ2h0X3NsZWVwKCk7CisKIAllcnIgPSBzdGFfaW5mb19pbnNlcnRfY2hlY2soc3RhKTsKIAlpZiAoZXJyKSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJZ290byBvdXRfZnJlZTsKIAl9CiAKLQkvKgotCSAqIEluIGFkLWhvYyBtb2RlLCB3ZSBzb21ldGltZXMgbmVlZCB0byBpbnNlcnQgc3RhdGlvbnMKLQkgKiBmcm9tIHRhc2tsZXQgY29udGV4dCBmcm9tIHRoZSBSWCBwYXRoLiBUbyBhdm9pZCByYWNlcywKLQkgKiBhbHdheXMgZG8gc28gaW4gdGhhdCBjYXNlIC0tIHNlZSB0aGUgY29tbWVudCBiZWxvdy4KLQkgKi8KLQlpZiAoc2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKSB7Ci0JCWVyciA9IHN0YV9pbmZvX2luc2VydF9pYnNzKHN0YSk7Ci0JCWlmIChlcnIpCi0JCQlnb3RvIG91dF9mcmVlOwotCi0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogSXQgbWlnaHQgc2VlbSB0aGF0IHRoZSBmdW5jdGlvbiBjYWxsZWQgYmVsb3cgaXMgaW4gcmFjZSBhZ2FpbnN0Ci0JICogdGhlIGZ1bmN0aW9uIGNhbGwgYWJvdmUgdGhhdCBhdG9taWNhbGx5IGluc2VydHMgdGhlIHN0YXRpb24uLi4gVGhhdCwKLQkgKiBob3dldmVyLCBpcyBub3QgdHJ1ZSBiZWNhdXNlIHRoZSBhYm92ZSBjb2RlIGNhbiBvbmx5Ci0JICogYmUgaW52b2tlZCBmb3IgSUJTUyBpbnRlcmZhY2VzLCBhbmQgdGhlIGJlbG93IGNvZGUgd2lsbAotCSAqIG5vdCBiZSAtLSBhbmQgdGhlIHR3byBkbyBub3QgcmFjZSBhZ2FpbnN0IGVhY2ggb3RoZXIgYXMKLQkgKiB0aGUgaGFzaCB0YWJsZSBhbHNvIGtleXMgb2ZmIHRoZSBpbnRlcmZhY2UuCi0JICovCi0KLQltaWdodF9zbGVlcCgpOwotCiAJbXV0ZXhfbG9jaygmbG9jYWwtPnN0YV9tdHgpOwogCi0JZXJyID0gc3RhX2luZm9faW5zZXJ0X25vbl9pYnNzKHN0YSk7CisJZXJyID0gc3RhX2luZm9faW5zZXJ0X2ZpbmlzaChzdGEpOwogCWlmIChlcnIpCiAJCWdvdG8gb3V0X2ZyZWU7CiAKIAlyZXR1cm4gMDsKICBvdXRfZnJlZToKIAlCVUdfT04oIWVycik7Ci0JX19zdGFfaW5mb19mcmVlKGxvY2FsLCBzdGEpOworCXN0YV9pbmZvX2ZyZWUobG9jYWwsIHN0YSk7CiAJcmV0dXJuIGVycjsKIH0KIApAQCAtNjI5LDcgKzQ4OSw3IEBACiAKIAltaWdodF9zbGVlcCgpOwogCi0JZXJyID0gc3RhX2luZm9faW5zZXJ0X25vbl9pYnNzKHN0YSk7CisJZXJyID0gc3RhX2luZm9faW5zZXJ0X2ZpbmlzaChzdGEpOwogCXJjdV9yZWFkX3VubG9jaygpOwogCXJldHVybiBlcnI7CiB9CkBAIC03MTYsNyArNTc2LDcgQEAKIAl9CiAKICBkb25lOgotCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPnRpbV9sb2NrLCBmbGFncyk7CiAKIAlpZiAoaW5kaWNhdGVfdGltKQogCQlfX2Jzc190aW1fc2V0KGJzcywgc3RhLT5zdGEuYWlkKTsKQEAgLTcyOSw3ICs1ODksNyBAQAogCQlsb2NhbC0+dGltX2luX2xvY2tlZF9zZWN0aW9uID0gZmFsc2U7CiAJfQogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnN0YV9sb2NrLCBmbGFncyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnRpbV9sb2NrLCBmbGFncyk7CiB9CiAKIHN0YXRpYyBib29sIHN0YV9pbmZvX2J1ZmZlcl9leHBpcmVkKHN0cnVjdCBzdGFfaW5mbyAqc3RhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtODUzLDggKzcxMyw4IEBACiB7CiAJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWw7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAlpbnQgcmV0LCBpLCBhYzsKKwlzdHJ1Y3QgdGlkX2FtcGR1X3R4ICp0aWRfdHg7CiAKIAltaWdodF9zbGVlcCgpOwogCkBAIC04NzMsMTUgKzczMywxMiBAQAogCXNldF9zdGFfZmxhZyhzdGEsIFdMQU5fU1RBX0JMT0NLX0JBKTsKIAlpZWVlODAyMTFfc3RhX3RlYXJfZG93bl9CQV9zZXNzaW9ucyhzdGEsIHRydWUpOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOwogCXJldCA9IHN0YV9pbmZvX2hhc2hfZGVsKGxvY2FsLCBzdGEpOwotCS8qIHRoaXMgbWlnaHQgc3RpbGwgYmUgdGhlIHBlbmRpbmcgbGlzdCAuLi4gd2hpY2ggaXMgZmluZSAqLwotCWlmICghcmV0KQotCQlsaXN0X2RlbCgmc3RhLT5saXN0KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwogCisJbGlzdF9kZWwoJnN0YS0+bGlzdCk7CisKIAltdXRleF9sb2NrKCZsb2NhbC0+a2V5X210eCk7CiAJZm9yIChpID0gMDsgaSA8IE5VTV9ERUZBVUxUX0tFWVM7IGkrKykKIAkJX19pZWVlODAyMTFfa2V5X2ZyZWUoa2V5X210eF9kZXJlZmVyZW5jZShsb2NhbCwgc3RhLT5ndGtbaV0pKTsKQEAgLTkwOCw2ICs3NjUsOSBAQAogCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTikKIAkJUkNVX0lOSVRfUE9JTlRFUihzZGF0YS0+dS52bGFuLnN0YSwgTlVMTCk7CiAKKwl3aGlsZSAoc3RhLT5zdGFfc3RhdGUgPiBJRUVFODAyMTFfU1RBX05PTkUpCisJCXN0YV9pbmZvX21vdmVfc3RhdGUoc3RhLCBzdGEtPnN0YV9zdGF0ZSAtIDEpOworCiAJaWYgKHN0YS0+dXBsb2FkZWQpIHsKIAkJaWYgKHNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKQogCQkJc2RhdGEgPSBjb250YWluZXJfb2Yoc2RhdGEtPmJzcywKQEAgLTk1Myw3ICs4MTMsMzYgQEAKIAl9CiAjZW5kaWYKIAotCV9fc3RhX2luZm9fZnJlZShsb2NhbCwgc3RhKTsKKwkvKiBUaGVyZSBjb3VsZCBiZSBzb21lIG1lbW9yeSBsZWFrcyBiZWNhdXNlIG9mIGFtcGR1IHR4IHBlbmRpbmcgcXVldWUKKwkgKiBub3QgYmVpbmcgZnJlZWQgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIHN0YXRpb24gaW5mby4KKwkgKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHN1Y2ggcXVldWVzIGFyZSBwdXJnZWQgYmVmb3JlIGZyZWVpbmcgdGhlIHN0YXRpb24KKwkgKiBpbmZvLgorCSAqIFRPRE86IFdlIGhhdmUgdG8gc29tZWhvdyBwb3N0cG9uZSB0aGUgZnVsbCBkZXN0cnVjdGlvbgorCSAqIHVudGlsIHRoZSBhZ2dyZWdhdGlvbiBzdG9wIGNvbXBsZXRlcy4gUmVmZXIKKwkgKiBodHRwOi8vdGhyZWFkLmdtYW5lLm9yZy9nbWFuZS5saW51eC5rZXJuZWwud2lyZWxlc3MuZ2VuZXJhbC84MTkzNgorCSAqLworCisJbXV0ZXhfbG9jaygmc3RhLT5hbXBkdV9tbG1lLm10eCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgU1RBX1RJRF9OVU07IGkrKykgeworCQl0aWRfdHggPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkX3RpZF90eChzdGEsIGkpOworCQlpZiAoIXRpZF90eCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc2tiX3F1ZXVlX2xlbigmdGlkX3R4LT5wZW5kaW5nKSkgeworI2lmZGVmIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRworCQkJd2lwaHlfZGVidWcobG9jYWwtPmh3LndpcGh5LCAiVFggQS1NUERVICBwdXJnaW5nICVkICIKKwkJCQkicGFja2V0cyBmb3IgdGlkPSVkXG4iLAorCQkJCXNrYl9xdWV1ZV9sZW4oJnRpZF90eC0+cGVuZGluZyksIGkpOworI2VuZGlmIC8qIENPTkZJR19NQUM4MDIxMV9IVF9ERUJVRyAqLworCQkJX19za2JfcXVldWVfcHVyZ2UoJnRpZF90eC0+cGVuZGluZyk7CisJCX0KKwkJa2ZyZWVfcmN1KHRpZF90eCwgcmN1X2hlYWQpOworCX0KKworCW11dGV4X3VubG9jaygmc3RhLT5hbXBkdV9tbG1lLm10eCk7CisKKwlzdGFfaW5mb19mcmVlKGxvY2FsLCBzdGEpOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xMDA5LDExICs4OTgsOSBAQAogCiB2b2lkIHN0YV9pbmZvX2luaXQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwpCiB7Ci0Jc3Bpbl9sb2NrX2luaXQoJmxvY2FsLT5zdGFfbG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmxvY2FsLT50aW1fbG9jayk7CiAJbXV0ZXhfaW5pdCgmbG9jYWwtPnN0YV9tdHgpOwogCUlOSVRfTElTVF9IRUFEKCZsb2NhbC0+c3RhX2xpc3QpOwotCUlOSVRfTElTVF9IRUFEKCZsb2NhbC0+c3RhX3BlbmRpbmdfbGlzdCk7Ci0JSU5JVF9XT1JLKCZsb2NhbC0+c3RhX2ZpbmlzaF93b3JrLCBzdGFfaW5mb19maW5pc2hfd29yayk7CiAKIAlzZXR1cF90aW1lcigmbG9jYWwtPnN0YV9jbGVhbnVwLCBzdGFfaW5mb19jbGVhbnVwLAogCQkgICAgKHVuc2lnbmVkIGxvbmcpbG9jYWwpOwpAQCAtMTA0Miw5ICs5MjksNiBAQAogCW1pZ2h0X3NsZWVwKCk7CiAKIAltdXRleF9sb2NrKCZsb2NhbC0+c3RhX210eCk7Ci0KLQlzdGFfaW5mb19maW5pc2hfcGVuZGluZyhsb2NhbCk7Ci0KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc3RhLCB0bXAsICZsb2NhbC0+c3RhX2xpc3QsIGxpc3QpIHsKIAkJaWYgKCFzZGF0YSB8fCBzZGF0YSA9PSBzdGEtPnNkYXRhKQogCQkJV0FSTl9PTihfX3N0YV9pbmZvX2Rlc3Ryb3koc3RhKSk7CkBAIC0xMDYxLDcgKzk0NSwxMSBAQAogCXN0cnVjdCBzdGFfaW5mbyAqc3RhLCAqdG1wOwogCiAJbXV0ZXhfbG9jaygmbG9jYWwtPnN0YV9tdHgpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdGEsIHRtcCwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzdGEsIHRtcCwgJmxvY2FsLT5zdGFfbGlzdCwgbGlzdCkgeworCQlpZiAoc2RhdGEgIT0gc3RhLT5zZGF0YSkKKwkJCWNvbnRpbnVlOworCiAJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHN0YS0+bGFzdF9yeCArIGV4cF90aW1lKSkgewogI2lmZGVmIENPTkZJR19NQUM4MDIxMV9JQlNTX0RFQlVHCiAJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6IGV4cGlyaW5nIGluYWN0aXZlIFNUQSAlcE1cbiIsCkBAIC0xMDY5LDYgKzk1Nyw4IEBACiAjZW5kaWYKIAkJCVdBUk5fT04oX19zdGFfaW5mb19kZXN0cm95KHN0YSkpOwogCQl9CisJfQorCiAJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c3RhX210eCk7CiB9CiAKQEAgLTE1MTcsMyArMTQwNyw1NiBAQAogCXN0YV9pbmZvX3JlY2FsY190aW0oc3RhKTsKIH0KIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3N0YV9zZXRfYnVmZmVyZWQpOworCitpbnQgc3RhX2luZm9fbW92ZV9zdGF0ZV9jaGVja2VkKHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJCWVudW0gaWVlZTgwMjExX3N0YV9zdGF0ZSBuZXdfc3RhdGUpCit7CisJbWlnaHRfc2xlZXAoKTsKKworCWlmIChzdGEtPnN0YV9zdGF0ZSA9PSBuZXdfc3RhdGUpCisJCXJldHVybiAwOworCisJc3dpdGNoIChuZXdfc3RhdGUpIHsKKwljYXNlIElFRUU4MDIxMV9TVEFfTk9ORToKKwkJaWYgKHN0YS0+c3RhX3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVVUSCkKKwkJCWNsZWFyX2JpdChXTEFOX1NUQV9BVVRILCAmc3RhLT5fZmxhZ3MpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfU1RBX0FVVEg6CisJCWlmIChzdGEtPnN0YV9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX05PTkUpCisJCQlzZXRfYml0KFdMQU5fU1RBX0FVVEgsICZzdGEtPl9mbGFncyk7CisJCWVsc2UgaWYgKHN0YS0+c3RhX3N0YXRlID09IElFRUU4MDIxMV9TVEFfQVNTT0MpCisJCQljbGVhcl9iaXQoV0xBTl9TVEFfQVNTT0MsICZzdGEtPl9mbGFncyk7CisJCWVsc2UKKwkJCXJldHVybiAtRUlOVkFMOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9TVEFfQVNTT0M6CisJCWlmIChzdGEtPnN0YV9zdGF0ZSA9PSBJRUVFODAyMTFfU1RBX0FVVEgpIHsKKwkJCXNldF9iaXQoV0xBTl9TVEFfQVNTT0MsICZzdGEtPl9mbGFncyk7CisJCX0gZWxzZSBpZiAoc3RhLT5zdGFfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9BVVRIT1JJWkVEKSB7CisJCQlpZiAoc3RhLT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCQkJYXRvbWljX2RlYygmc3RhLT5zZGF0YS0+dS5hcC5udW1fc3RhX2F1dGhvcml6ZWQpOworCQkJY2xlYXJfYml0KFdMQU5fU1RBX0FVVEhPUklaRUQsICZzdGEtPl9mbGFncyk7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgSUVFRTgwMjExX1NUQV9BVVRIT1JJWkVEOgorCQlpZiAoc3RhLT5zdGFfc3RhdGUgPT0gSUVFRTgwMjExX1NUQV9BU1NPQykgeworCQkJaWYgKHN0YS0+c2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FQKQorCQkJCWF0b21pY19pbmMoJnN0YS0+c2RhdGEtPnUuYXAubnVtX3N0YV9hdXRob3JpemVkKTsKKwkJCXNldF9iaXQoV0xBTl9TVEFfQVVUSE9SSVpFRCwgJnN0YS0+X2ZsYWdzKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTigxLCAiaW52YWxpZCBzdGF0ZSAlZCIsIG5ld19zdGF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICIlczogbW92aW5nIFNUQSAlcE0gdG8gc3RhdGUgJWRcbiIsCisJCXN0YS0+c2RhdGEtPm5hbWUsIHN0YS0+c3RhLmFkZHIsIG5ld19zdGF0ZSk7CisJc3RhLT5zdGFfc3RhdGUgPSBuZXdfc3RhdGU7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zdGFfaW5mby5oIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmgKaW5kZXggOGM4Y2UwNS4uNmY3N2YxMiAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3N0YV9pbmZvLmgKKysrIGIvbmV0L21hYzgwMjExL3N0YV9pbmZvLmgKQEAgLTMwLDcgKzMwLDYgQEAKICAqCXdoZW4gdmlydHVhbCBwb3J0IGNvbnRyb2wgaXMgbm90IGluIHVzZS4KICAqIEBXTEFOX1NUQV9TSE9SVF9QUkVBTUJMRTogU3RhdGlvbiBpcyBjYXBhYmxlIG9mIHJlY2VpdmluZyBzaG9ydC1wcmVhbWJsZQogICoJZnJhbWVzLgotICogQFdMQU5fU1RBX0FTU09DX0FQOiBXZSdyZSBhc3NvY2lhdGVkIHRvIHRoYXQgc3RhdGlvbiwgaXQgaXMgYW4gQVAuCiAgKiBAV0xBTl9TVEFfV01FOiBTdGF0aW9uIGlzIGEgUW9TLVNUQS4KICAqIEBXTEFOX1NUQV9XRFM6IFN0YXRpb24gaXMgb25lIG9mIG91ciBXRFMgcGVlcnMuCiAgKiBAV0xBTl9TVEFfQ0xFQVJfUFNfRklMVDogQ2xlYXIgUFMgZmlsdGVyIGluIGhhcmR3YXJlICh1c2luZyB0aGUKQEAgLTUyLDYgKzUxLDcgQEAKICAqCXVuYmxvY2tzIHRoZSBzdGF0aW9uLgogICogQFdMQU5fU1RBX1NQOiBTdGF0aW9uIGlzIGluIGEgc2VydmljZSBwZXJpb2QsIHNvIGRvbid0IHRyeSB0bwogICoJcmVwbHkgdG8gb3RoZXIgdUFQU0QgdHJpZ2dlciBmcmFtZXMgb3IgUFMtUG9sbC4KKyAqIEBXTEFOX1NUQV80QUREUl9FVkVOVDogNC1hZGRyIGV2ZW50IHdhcyBhbHJlYWR5IHNlbnQgZm9yIHRoaXMgZnJhbWUuCiAgKi8KIGVudW0gaWVlZTgwMjExX3N0YV9pbmZvX2ZsYWdzIHsKIAlXTEFOX1NUQV9BVVRILApAQCAtNTksNyArNTksNiBAQAogCVdMQU5fU1RBX1BTX1NUQSwKIAlXTEFOX1NUQV9BVVRIT1JJWkVELAogCVdMQU5fU1RBX1NIT1JUX1BSRUFNQkxFLAotCVdMQU5fU1RBX0FTU09DX0FQLAogCVdMQU5fU1RBX1dNRSwKIAlXTEFOX1NUQV9XRFMsCiAJV0xBTl9TVEFfQ0xFQVJfUFNfRklMVCwKQEAgLTcxLDExICs3MCwyMiBAQAogCVdMQU5fU1RBX1RETFNfUEVFUl9BVVRILAogCVdMQU5fU1RBX1VBUFNELAogCVdMQU5fU1RBX1NQLAorCVdMQU5fU1RBXzRBRERSX0VWRU5ULAorfTsKKworZW51bSBpZWVlODAyMTFfc3RhX3N0YXRlIHsKKwkvKiBOT1RFOiBUaGVzZSBuZWVkIHRvIGJlIG9yZGVyZWQgY29ycmVjdGx5ISAqLworCUlFRUU4MDIxMV9TVEFfTk9ORSwKKwlJRUVFODAyMTFfU1RBX0FVVEgsCisJSUVFRTgwMjExX1NUQV9BU1NPQywKKwlJRUVFODAyMTFfU1RBX0FVVEhPUklaRUQsCiB9OwogCiAjZGVmaW5lIFNUQV9USURfTlVNIDE2CiAjZGVmaW5lIEFEREJBX1JFU1BfSU5URVJWQUwgSFoKLSNkZWZpbmUgSFRfQUdHX01BWF9SRVRSSUVTCQkweDMKKyNkZWZpbmUgSFRfQUdHX01BWF9SRVRSSUVTCQkxNQorI2RlZmluZSBIVF9BR0dfQlVSU1RfUkVUUklFUwkJMworI2RlZmluZSBIVF9BR0dfUkVUUklFU19QRVJJT0QJCSgxNSAqIEhaKQogCiAjZGVmaW5lIEhUX0FHR19TVEFURV9EUlZfUkVBRFkJCTAKICNkZWZpbmUgSFRfQUdHX1NUQVRFX1JFU1BPTlNFX1JFQ0VJVkVECTEKQEAgLTg4LDYgKzk4LDcgQEAKICAqIHN0cnVjdCB0aWRfYW1wZHVfdHggLSBUSUQgYWdncmVnYXRpb24gaW5mb3JtYXRpb24gKFR4KS4KICAqCiAgKiBAcmN1X2hlYWQ6IHJjdSBoZWFkIGZvciBmcmVlaW5nIHN0cnVjdHVyZQorICogQHNlc3Npb25fdGltZXI6IGNoZWNrIGlmIHdlIGtlZXAgVHgtaW5nIG9uIHRoZSBUSUQgKGJ5IHRpbWVvdXQgdmFsdWUpCiAgKiBAYWRkYmFfcmVzcF90aW1lcjogdGltZXIgZm9yIHBlZXIncyByZXNwb25zZSB0byBhZGRiYSByZXF1ZXN0CiAgKiBAcGVuZGluZzogcGVuZGluZyBmcmFtZXMgcXVldWUgLS0gdXNlIHN0YSdzIHNwaW5sb2NrIHRvIHByb3RlY3QKICAqIEBkaWFsb2dfdG9rZW46IGRpYWxvZyB0b2tlbiBmb3IgYWdncmVnYXRpb24gc2Vzc2lvbgpAQCAtMTEwLDYgKzEyMSw3IEBACiAgKi8KIHN0cnVjdCB0aWRfYW1wZHVfdHggewogCXN0cnVjdCByY3VfaGVhZCByY3VfaGVhZDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCBzZXNzaW9uX3RpbWVyOwogCXN0cnVjdCB0aW1lcl9saXN0IGFkZGJhX3Jlc3BfdGltZXI7CiAJc3RydWN0IHNrX2J1ZmZfaGVhZCBwZW5kaW5nOwogCXVuc2lnbmVkIGxvbmcgc3RhdGU7CkBAIC0xNjksNiArMTgxLDcgQEAKICAqIEB0aWRfdHg6IGFnZ3JlZ2F0aW9uIGluZm8gZm9yIFR4IHBlciBUSUQKICAqIEB0aWRfc3RhcnRfdHg6IHNlc3Npb25zIHdoZXJlIHN0YXJ0IHdhcyByZXF1ZXN0ZWQKICAqIEBhZGRiYV9yZXFfbnVtOiBudW1iZXIgb2YgdGltZXMgYWRkQkEgcmVxdWVzdCBoYXMgYmVlbiBzZW50LgorICogQGxhc3RfYWRkYmFfcmVxX3RpbWU6IHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBhZGRCQSByZXF1ZXN0LgogICogQGRpYWxvZ190b2tlbl9hbGxvY2F0b3I6IGRpYWxvZyB0b2tlbiBlbnVtZXJhdG9yIGZvciBlYWNoIG5ldyBzZXNzaW9uOwogICogQHdvcms6IHdvcmsgc3RydWN0IGZvciBzdGFydGluZy9zdG9wcGluZyBhZ2dyZWdhdGlvbgogICogQHRpZF9yeF90aW1lcl9leHBpcmVkOiBiaXRtYXAgaW5kaWNhdGluZyBvbiB3aGljaCBUSURzIHRoZQpAQCAtMTg4LDYgKzIwMSw3IEBACiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAJc3RydWN0IHRpZF9hbXBkdV90eCBfX3JjdSAqdGlkX3R4W1NUQV9USURfTlVNXTsKIAlzdHJ1Y3QgdGlkX2FtcGR1X3R4ICp0aWRfc3RhcnRfdHhbU1RBX1RJRF9OVU1dOworCXVuc2lnbmVkIGxvbmcgbGFzdF9hZGRiYV9yZXFfdGltZVtTVEFfVElEX05VTV07CiAJdTggYWRkYmFfcmVxX251bVtTVEFfVElEX05VTV07CiAJdTggZGlhbG9nX3Rva2VuX2FsbG9jYXRvcjsKIH07CkBAIC0yNjAsNiArMjc0LDggQEAKICAqIEBkdW1teTogaW5kaWNhdGUgYSBkdW1teSBzdGF0aW9uIGNyZWF0ZWQgZm9yIHJlY2VpdmluZwogICoJRUFQIGZyYW1lcyBiZWZvcmUgYXNzb2NpYXRpb24KICAqIEBzdGE6IHN0YXRpb24gaW5mb3JtYXRpb24gd2Ugc2hhcmUgd2l0aCB0aGUgZHJpdmVyCisgKiBAc3RhX3N0YXRlOiBkdXBsaWNhdGVzIGluZm9ybWF0aW9uIGFib3V0IHN0YXRpb24gc3RhdGUgKGZvciBkZWJ1ZykKKyAqIEBiZWFjb25fbG9zc19jb3VudDogbnVtYmVyIG9mIHRpbWVzIGJlYWNvbiBsb3NzIGhhcyB0cmlnZ2VyZWQKICAqLwogc3RydWN0IHN0YV9pbmZvIHsKIAkvKiBHZW5lcmFsIGluZm9ybWF0aW9uLCBtb3N0bHkgc3RhdGljICovCkBAIC0yODEsNiArMjk3LDggQEAKIAogCWJvb2wgdXBsb2FkZWQ7CiAKKwllbnVtIGllZWU4MDIxMV9zdGFfc3RhdGUgc3RhX3N0YXRlOworCiAJLyogdXNlIHRoZSBhY2Nlc3NvcnMgZGVmaW5lZCBiZWxvdyAqLwogCXVuc2lnbmVkIGxvbmcgX2ZsYWdzOwogCkBAIC0zNTAsNiArMzY4LDcgQEAKICNlbmRpZgogCiAJdW5zaWduZWQgaW50IGxvc3RfcGFja2V0czsKKwl1bnNpZ25lZCBpbnQgYmVhY29uX2xvc3NfY291bnQ7CiAKIAkvKiBzaG91bGQgYmUgcmlnaHQgaW4gZnJvbnQgb2Ygc3RhIHRvIGJlIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUgKi8KIAlib29sIGR1bW15OwpAQCAtMzY5LDEyICszODgsMTggQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfc3RhX2ZsYWcoc3RydWN0IHN0YV9pbmZvICpzdGEsCiAJCQkJZW51bSBpZWVlODAyMTFfc3RhX2luZm9fZmxhZ3MgZmxhZykKIHsKKwlXQVJOX09OKGZsYWcgPT0gV0xBTl9TVEFfQVVUSCB8fAorCQlmbGFnID09IFdMQU5fU1RBX0FTU09DIHx8CisJCWZsYWcgPT0gV0xBTl9TVEFfQVVUSE9SSVpFRCk7CiAJc2V0X2JpdChmbGFnLCAmc3RhLT5fZmxhZ3MpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc3RhX2ZsYWcoc3RydWN0IHN0YV9pbmZvICpzdGEsCiAJCQkJICBlbnVtIGllZWU4MDIxMV9zdGFfaW5mb19mbGFncyBmbGFnKQogeworCVdBUk5fT04oZmxhZyA9PSBXTEFOX1NUQV9BVVRIIHx8CisJCWZsYWcgPT0gV0xBTl9TVEFfQVNTT0MgfHwKKwkJZmxhZyA9PSBXTEFOX1NUQV9BVVRIT1JJWkVEKTsKIAljbGVhcl9iaXQoZmxhZywgJnN0YS0+X2ZsYWdzKTsKIH0KIApAQCAtMzg3LDkgKzQxMiwzMiBAQAogc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRfY2xlYXJfc3RhX2ZsYWcoc3RydWN0IHN0YV9pbmZvICpzdGEsCiAJCQkJCSAgZW51bSBpZWVlODAyMTFfc3RhX2luZm9fZmxhZ3MgZmxhZykKIHsKKwlXQVJOX09OKGZsYWcgPT0gV0xBTl9TVEFfQVVUSCB8fAorCQlmbGFnID09IFdMQU5fU1RBX0FTU09DIHx8CisJCWZsYWcgPT0gV0xBTl9TVEFfQVVUSE9SSVpFRCk7CiAJcmV0dXJuIHRlc3RfYW5kX2NsZWFyX2JpdChmbGFnLCAmc3RhLT5fZmxhZ3MpOwogfQogCitzdGF0aWMgaW5saW5lIGludCB0ZXN0X2FuZF9zZXRfc3RhX2ZsYWcoc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkJCWVudW0gaWVlZTgwMjExX3N0YV9pbmZvX2ZsYWdzIGZsYWcpCit7CisJV0FSTl9PTihmbGFnID09IFdMQU5fU1RBX0FVVEggfHwKKwkJZmxhZyA9PSBXTEFOX1NUQV9BU1NPQyB8fAorCQlmbGFnID09IFdMQU5fU1RBX0FVVEhPUklaRUQpOworCXJldHVybiB0ZXN0X2FuZF9zZXRfYml0KGZsYWcsICZzdGEtPl9mbGFncyk7Cit9CisKK2ludCBzdGFfaW5mb19tb3ZlX3N0YXRlX2NoZWNrZWQoc3RydWN0IHN0YV9pbmZvICpzdGEsCisJCQkJZW51bSBpZWVlODAyMTFfc3RhX3N0YXRlIG5ld19zdGF0ZSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdGFfaW5mb19tb3ZlX3N0YXRlKHN0cnVjdCBzdGFfaW5mbyAqc3RhLAorCQkJCSAgICAgICBlbnVtIGllZWU4MDIxMV9zdGFfc3RhdGUgbmV3X3N0YXRlKQoreworCWludCByZXQgPSBzdGFfaW5mb19tb3ZlX3N0YXRlX2NoZWNrZWQoc3RhLCBuZXdfc3RhdGUpOworCVdBUk5fT05fT05DRShyZXQpOworfQorCisKIHZvaWQgaWVlZTgwMjExX2Fzc2lnbl90aWRfdHgoc3RydWN0IHN0YV9pbmZvICpzdGEsIGludCB0aWQsCiAJCQkgICAgIHN0cnVjdCB0aWRfYW1wZHVfdHggKnRpZF90eCk7CiAKQEAgLTQ4MCw3ICs1MjgsMTAgQEAKICAqIHVudGlsIHN0YV9pbmZvX2luc2VydCgpLgogICovCiBzdHJ1Y3Qgc3RhX2luZm8gKnN0YV9pbmZvX2FsbG9jKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAotCQkJCXU4ICphZGRyLCBnZnBfdCBnZnApOworCQkJCWNvbnN0IHU4ICphZGRyLCBnZnBfdCBnZnApOworCit2b2lkIHN0YV9pbmZvX2ZyZWUoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKKwogLyoKICAqIEluc2VydCBTVEEgaW5mbyBpbnRvIGhhc2ggdGFibGUvbGlzdCwgcmV0dXJucyB6ZXJvIG9yIGEKICAqIC1FRVhJU1QgaWYgKGlmIHRoZSBzYW1lIE1BQyBhZGRyZXNzIGlzIGFscmVhZHkgcHJlc2VudCkuCkBAIC00OTEsNyArNTQyLDYgQEAKICAqLwogaW50IHN0YV9pbmZvX2luc2VydChzdHJ1Y3Qgc3RhX2luZm8gKnN0YSk7CiBpbnQgc3RhX2luZm9faW5zZXJ0X3JjdShzdHJ1Y3Qgc3RhX2luZm8gKnN0YSkgX19hY3F1aXJlcyhSQ1UpOwotaW50IHN0YV9pbmZvX2luc2VydF9hdG9taWMoc3RydWN0IHN0YV9pbmZvICpzdGEpOwogaW50IHN0YV9pbmZvX3JlaW5zZXJ0KHN0cnVjdCBzdGFfaW5mbyAqc3RhKTsKIAogaW50IHN0YV9pbmZvX2Rlc3Ryb3lfYWRkcihzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9zdGF0dXMuYyBiL25ldC9tYWM4MDIxMS9zdGF0dXMuYwppbmRleCA4MGRlNDM2Li4zMGMyNjVjIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvc3RhdHVzLmMKKysrIGIvbmV0L21hYzgwMjExL3N0YXR1cy5jCkBAIC0yNjAsNyArMjYwLDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHNrYi0+ZGF0YTsKIAlzdHJ1Y3QgaWVlZTgwMjExX3JhZGlvdGFwX2hlYWRlciAqcnRoZHI7CiAJdW5zaWduZWQgY2hhciAqcG9zOwotCV9fbGUxNiB0eGZsYWdzOworCXUxNiB0eGZsYWdzOwogCiAJcnRoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9yYWRpb3RhcF9oZWFkZXIgKikgc2tiX3B1c2goc2tiLCBydGFwX2xlbik7CiAKQEAgLTI5MCwxMyArMjkwLDEzIEBACiAJdHhmbGFncyA9IDA7CiAJaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spICYmCiAJICAgICFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKLQkJdHhmbGFncyB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfUkFESU9UQVBfRl9UWF9GQUlMKTsKKwkJdHhmbGFncyB8PSBJRUVFODAyMTFfUkFESU9UQVBfRl9UWF9GQUlMOwogCiAJaWYgKChpbmZvLT5zdGF0dXMucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpIHx8CiAJICAgIChpbmZvLT5zdGF0dXMucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX0NUU19QUk9URUNUKSkKLQkJdHhmbGFncyB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfUkFESU9UQVBfRl9UWF9DVFMpOworCQl0eGZsYWdzIHw9IElFRUU4MDIxMV9SQURJT1RBUF9GX1RYX0NUUzsKIAllbHNlIGlmIChpbmZvLT5zdGF0dXMucmF0ZXNbMF0uZmxhZ3MgJiBJRUVFODAyMTFfVFhfUkNfVVNFX1JUU19DVFMpCi0JCXR4ZmxhZ3MgfD0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1JBRElPVEFQX0ZfVFhfUlRTKTsKKwkJdHhmbGFncyB8PSBJRUVFODAyMTFfUkFESU9UQVBfRl9UWF9SVFM7CiAKIAlwdXRfdW5hbGlnbmVkX2xlMTYodHhmbGFncywgcG9zKTsKIAlwb3MgKz0gMjsKQEAgLTM0MCw3ICszNDAsNiBAQAogCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKikgc2tiLT5kYXRhOwogCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwoaHcpOwogCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKLQl1MTYgZnJhZywgdHlwZTsKIAlfX2xlMTYgZmM7CiAJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQ7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CkBAIC00NzYsMTIgKzQ3NSw4IEBACiAJICogRnJhZ21lbnRzIGFyZSBwYXNzZWQgdG8gbG93LWxldmVsIGRyaXZlcnMgYXMgc2VwYXJhdGUgc2ticywgc28gdGhlc2UKIAkgKiBhcmUgYWN0dWFsbHkgZnJhZ21lbnRzLCBub3QgZnJhbWVzLiBVcGRhdGUgZnJhbWUgY291bnRlcnMgb25seSBmb3IKIAkgKiB0aGUgZmlyc3QgZnJhZ21lbnQgb2YgdGhlIGZyYW1lLiAqLwotCi0JZnJhZyA9IGxlMTZfdG9fY3B1KGhkci0+c2VxX2N0cmwpICYgSUVFRTgwMjExX1NDVExfRlJBRzsKLQl0eXBlID0gbGUxNl90b19jcHUoaGRyLT5mcmFtZV9jb250cm9sKSAmIElFRUU4MDIxMV9GQ1RMX0ZUWVBFOwotCiAJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLKSB7Ci0JCWlmIChmcmFnID09IDApIHsKKwkJaWYgKGllZWU4MDIxMV9pc19maXJzdF9mcmFnKGhkci0+c2VxX2N0cmwpKSB7CiAJCQlsb2NhbC0+ZG90MTFUcmFuc21pdHRlZEZyYW1lQ291bnQrKzsKIAkJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKIAkJCQlsb2NhbC0+ZG90MTFNdWx0aWNhc3RUcmFuc21pdHRlZEZyYW1lQ291bnQrKzsKQEAgLTQ5NiwxMSArNDkxLDExIEBACiAJCSAqIHdpdGggYSBtdWx0aWNhc3QgYWRkcmVzcyBpbiB0aGUgYWRkcmVzcyAxIGZpZWxkIG9mIHR5cGUgRGF0YQogCQkgKiBvciBNYW5hZ2VtZW50LiAqLwogCQlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpIHx8Ci0JCSAgICB0eXBlID09IElFRUU4MDIxMV9GVFlQRV9EQVRBIHx8Ci0JCSAgICB0eXBlID09IElFRUU4MDIxMV9GVFlQRV9NR01UKQorCQkgICAgaWVlZTgwMjExX2lzX2RhdGEoZmMpIHx8CisJCSAgICBpZWVlODAyMTFfaXNfbWdtdChmYykpCiAJCQlsb2NhbC0+ZG90MTFUcmFuc21pdHRlZEZyYWdtZW50Q291bnQrKzsKIAl9IGVsc2UgewotCQlpZiAoZnJhZyA9PSAwKQorCQlpZiAoaWVlZTgwMjExX2lzX2ZpcnN0X2ZyYWcoaGRyLT5zZXFfY3RybCkpCiAJCQlsb2NhbC0+ZG90MTFGYWlsZWRDb3VudCsrOwogCX0KIApAQCAtNTE3LDI3ICs1MTIsNTQgQEAKIAl9CiAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfSU5URkxfTkw4MDIxMV9GUkFNRV9UWCkgewotCQlzdHJ1Y3QgaWVlZTgwMjExX3dvcmsgKndrOwogCQl1NjQgY29va2llID0gKHVuc2lnbmVkIGxvbmcpc2tiOwogCi0JCXJjdV9yZWFkX2xvY2soKTsKLQkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uod2ssICZsb2NhbC0+d29ya19saXN0LCBsaXN0KSB7Ci0JCQlpZiAod2stPnR5cGUgIT0gSUVFRTgwMjExX1dPUktfT0ZGQ0hBTk5FTF9UWCkKLQkJCQljb250aW51ZTsKLQkJCWlmICh3ay0+b2ZmY2hhbl90eC5mcmFtZSAhPSBza2IpCi0JCQkJY29udGludWU7Ci0JCQl3ay0+b2ZmY2hhbl90eC5zdGF0dXMgPSB0cnVlOwotCQkJYnJlYWs7Ci0JCX0KLQkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCWlmIChsb2NhbC0+aHdfcm9jX3NrYl9mb3Jfc3RhdHVzID09IHNrYikgewotCQkJY29va2llID0gbG9jYWwtPmh3X3JvY19jb29raWUgXiAyOwotCQkJbG9jYWwtPmh3X3JvY19za2JfZm9yX3N0YXR1cyA9IE5VTEw7Ci0JCX0KKwkJaWYgKGllZWU4MDIxMV9pc19udWxsZnVuYyhoZHItPmZyYW1lX2NvbnRyb2wpIHx8CisJCSAgICBpZWVlODAyMTFfaXNfcW9zX251bGxmdW5jKGhkci0+ZnJhbWVfY29udHJvbCkpIHsKKwkJCWJvb2wgYWNrZWQgPSBpbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9TVEFUX0FDSzsKKwkJCWNmZzgwMjExX3Byb2JlX3N0YXR1cyhza2ItPmRldiwgaGRyLT5hZGRyMSwKKwkJCQkJICAgICAgY29va2llLCBhY2tlZCwgR0ZQX0FUT01JQyk7CisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgaWVlZTgwMjExX3dvcmsgKndrOwogCi0JCWNmZzgwMjExX21nbXRfdHhfc3RhdHVzKAotCQkJc2tiLT5kZXYsIGNvb2tpZSwgc2tiLT5kYXRhLCBza2ItPmxlbiwKLQkJCSEhKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLKSwgR0ZQX0FUT01JQyk7CisJCQlyY3VfcmVhZF9sb2NrKCk7CisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdSh3aywgJmxvY2FsLT53b3JrX2xpc3QsIGxpc3QpIHsKKwkJCQlpZiAod2stPnR5cGUgIT0gSUVFRTgwMjExX1dPUktfT0ZGQ0hBTk5FTF9UWCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKHdrLT5vZmZjaGFuX3R4LmZyYW1lICE9IHNrYikKKwkJCQkJY29udGludWU7CisJCQkJd2stPm9mZmNoYW5fdHguc3RhdHVzID0gdHJ1ZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXJjdV9yZWFkX3VubG9jaygpOworCQkJaWYgKGxvY2FsLT5od19yb2Nfc2tiX2Zvcl9zdGF0dXMgPT0gc2tiKSB7CisJCQkJY29va2llID0gbG9jYWwtPmh3X3JvY19jb29raWUgXiAyOworCQkJCWxvY2FsLT5od19yb2Nfc2tiX2Zvcl9zdGF0dXMgPSBOVUxMOworCQkJfQorCisJCQljZmc4MDIxMV9tZ210X3R4X3N0YXR1cygKKwkJCQlza2ItPmRldiwgY29va2llLCBza2ItPmRhdGEsIHNrYi0+bGVuLAorCQkJCSEhKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX1NUQVRfQUNLKSwKKwkJCQlHRlBfQVRPTUlDKTsKKwkJfQorCX0KKworCWlmICh1bmxpa2VseShpbmZvLT5hY2tfZnJhbWVfaWQpKSB7CisJCXN0cnVjdCBza19idWZmICphY2tfc2tiOworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+YWNrX3N0YXR1c19sb2NrLCBmbGFncyk7CisJCWFja19za2IgPSBpZHJfZmluZCgmbG9jYWwtPmFja19zdGF0dXNfZnJhbWVzLAorCQkJCSAgIGluZm8tPmFja19mcmFtZV9pZCk7CisJCWlmIChhY2tfc2tiKQorCQkJaWRyX3JlbW92ZSgmbG9jYWwtPmFja19zdGF0dXNfZnJhbWVzLAorCQkJCSAgIGluZm8tPmFja19mcmFtZV9pZCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5hY2tfc3RhdHVzX2xvY2ssIGZsYWdzKTsKKworCQkvKiBjb25zdW1lcyBhY2tfc2tiICovCisJCWlmIChhY2tfc2tiKQorCQkJc2tiX2NvbXBsZXRlX3dpZmlfYWNrKGFja19za2IsCisJCQkJaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfU1RBVF9BQ0spOwogCX0KIAogCS8qIHRoaXMgd2FzIGEgdHJhbnNtaXR0ZWQgZnJhbWUsIGJ1dCBub3cgd2Ugd2FudCB0byByZXVzZSBpdCAqLwpAQCAtNTQ1LDcgKzU2Nyw3IEBACiAKIAkvKiBOZWVkIHRvIG1ha2UgYSBjb3B5IGJlZm9yZSBza2ItPmNiIGdldHMgY2xlYXJlZCAqLwogCXNlbmRfdG9fY29va2VkID0gISEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0lOSkVDVEVEKSB8fAotCQkJKHR5cGUgIT0gSUVFRTgwMjExX0ZUWVBFX0RBVEEpOworCQkJICEoaWVlZTgwMjExX2lzX2RhdGEoZmMpKTsKIAogCS8qCiAJICogVGhpcyBpcyBhIGJpdCByYWN5IGJ1dCB3ZSBjYW4gYXZvaWQgYSBsb3Qgb2Ygd29yawpAQCAtNjEwLDMgKzYzMiwyOSBAQAogCQkJCSAgICBudW1fcGFja2V0cywgR0ZQX0FUT01JQyk7CiB9CiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9yZXBvcnRfbG93X2Fjayk7CisKK3ZvaWQgaWVlZTgwMjExX2ZyZWVfdHhza2Ioc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCisJaWYgKHVubGlrZWx5KGluZm8tPmFja19mcmFtZV9pZCkpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmFja19za2I7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5hY2tfc3RhdHVzX2xvY2ssIGZsYWdzKTsKKwkJYWNrX3NrYiA9IGlkcl9maW5kKCZsb2NhbC0+YWNrX3N0YXR1c19mcmFtZXMsCisJCQkJICAgaW5mby0+YWNrX2ZyYW1lX2lkKTsKKwkJaWYgKGFja19za2IpCisJCQlpZHJfcmVtb3ZlKCZsb2NhbC0+YWNrX3N0YXR1c19mcmFtZXMsCisJCQkJICAgaW5mby0+YWNrX2ZyYW1lX2lkKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPmFja19zdGF0dXNfbG9jaywgZmxhZ3MpOworCisJCS8qIGNvbnN1bWVzIGFja19za2IgKi8KKwkJaWYgKGFja19za2IpCisJCQlkZXZfa2ZyZWVfc2tiX2FueShhY2tfc2tiKTsKKwl9CisKKwlkZXZfa2ZyZWVfc2tiX2FueShza2IpOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZnJlZV90eHNrYik7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHguYyBiL25ldC9tYWM4MDIxMS90eC5jCmluZGV4IDFmOGIxMjAuLmVkY2QxYzcgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS90eC5jCisrKyBiL25ldC9tYWM4MDIxMS90eC5jCkBAIC0zNiw3ICszNiw4IEBACiAKIC8qIG1pc2MgdXRpbHMgKi8KIAotc3RhdGljIF9fbGUxNiBpZWVlODAyMTFfZHVyYXRpb24oc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCwgaW50IGdyb3VwX2FkZHIsCitzdGF0aWMgX19sZTE2IGllZWU4MDIxMV9kdXJhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4LAorCQkJCSBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZ3JvdXBfYWRkciwKIAkJCQkgaW50IG5leHRfZnJhZ19sZW4pCiB7CiAJaW50IHJhdGUsIG1yYXRlLCBlcnAsIGR1ciwgaTsKQEAgLTQ0LDcgKzQ1LDcgQEAKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHR4LT5sb2NhbDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwotCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHgtPnNrYik7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCiAJLyogYXNzdW1lIEhXIGhhbmRsZXMgdGhpcyAqLwogCWlmIChpbmZvLT5jb250cm9sLnJhdGVzWzBdLmZsYWdzICYgSUVFRTgwMjExX1RYX1JDX01DUykKQEAgLTc2LDcgKzc3LDcgQEAKIAkgKiAgIGF0IHRoZSBoaWdoZXN0IHBvc3NpYmxlIHJhdGUgYmVsb25naW5nIHRvIHRoZSBQSFkgcmF0ZXMgaW4gdGhlCiAJICogICBCU1NCYXNpY1JhdGVTZXQKIAkgKi8KLQloZHIgPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKil0eC0+c2tiLT5kYXRhOworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAlpZiAoaWVlZTgwMjExX2lzX2N0bChoZHItPmZyYW1lX2NvbnRyb2wpKSB7CiAJCS8qIFRPRE86IFRoZXNlIGNvbnRyb2wgZnJhbWVzIGFyZSBub3QgY3VycmVudGx5IHNlbnQgYnkKIAkJICogbWFjODAyMTEsIGJ1dCBzaG91bGQgdGhleSBiZSBpbXBsZW1lbnRlZCwgdGhpcyBmdW5jdGlvbgpAQCAtMTUwLDExICsxNTEsMTUgQEAKIAkJcmF0ZSA9IG1yYXRlOwogCX0KIAotCS8qIFRpbWUgbmVlZGVkIHRvIHRyYW5zbWl0IEFDSwotCSAqICgxMCBieXRlcyArIDQtYnl0ZSBGQ1MgPSAxMTIgYml0cykgcGx1cyBTSUZTOyByb3VuZGVkIHVwCi0JICogdG8gY2xvc2VzdCBpbnRlZ2VyICovCi0KLQlkdXIgPSBpZWVlODAyMTFfZnJhbWVfZHVyYXRpb24obG9jYWwsIDEwLCByYXRlLCBlcnAsCisJLyogRG9uJ3QgY2FsY3VsYXRlIEFDS3MgZm9yIFFvUyBGcmFtZXMgd2l0aCBOb0FjayBQb2xpY3kgc2V0ICovCisJaWYgKGllZWU4MDIxMV9pc19kYXRhX3FvcyhoZHItPmZyYW1lX2NvbnRyb2wpICYmCisJICAgICooaWVlZTgwMjExX2dldF9xb3NfY3RsKGhkcikpIHwgSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9OT0FDSykKKwkJZHVyID0gMDsKKwllbHNlCisJCS8qIFRpbWUgbmVlZGVkIHRvIHRyYW5zbWl0IEFDSworCQkgKiAoMTAgYnl0ZXMgKyA0LWJ5dGUgRkNTID0gMTEyIGJpdHMpIHBsdXMgU0lGUzsgcm91bmRlZCB1cAorCQkgKiB0byBjbG9zZXN0IGludGVnZXIgKi8KKwkJZHVyID0gaWVlZTgwMjExX2ZyYW1lX2R1cmF0aW9uKGxvY2FsLCAxMCwgcmF0ZSwgZXJwLAogCQkJCXR4LT5zZGF0YS0+dmlmLmJzc19jb25mLnVzZV9zaG9ydF9wcmVhbWJsZSk7CiAKIAlpZiAobmV4dF9mcmFnX2xlbikgewpAQCAtMjkwLDcgKzI5NSw2IEBACiAKIAlpZiAobGlrZWx5KHR4LT5mbGFncyAmIElFRUU4MDIxMV9UWF9VTklDQVNUKSkgewogCQlpZiAodW5saWtlbHkoIWFzc29jICYmCi0JCQkgICAgIHR4LT5zZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQURIT0MgJiYKIAkJCSAgICAgaWVlZTgwMjExX2lzX2RhdGEoaGRyLT5mcmFtZV9jb250cm9sKSkpIHsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfVkVSQk9TRV9ERUJVRwogCQkJcHJpbnRrKEtFUk5fREVCVUcgIiVzOiBkcm9wcGVkIGRhdGEgZnJhbWUgdG8gbm90ICIKQEAgLTMwMCwxNyArMzA0LDE0IEBACiAJCQlJODAyX0RFQlVHX0lOQyh0eC0+bG9jYWwtPnR4X2hhbmRsZXJzX2Ryb3Bfbm90X2Fzc29jKTsKIAkJCXJldHVybiBUWF9EUk9QOwogCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHVubGlrZWx5KGllZWU4MDIxMV9pc19kYXRhKGhkci0+ZnJhbWVfY29udHJvbCkgJiYKLQkJCSAgICAgdHgtPmxvY2FsLT5udW1fc3RhID09IDAgJiYKLQkJCSAgICAgdHgtPnNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BREhPQykpIHsKLQkJCS8qCi0JCQkgKiBObyBhc3NvY2lhdGVkIFNUQXMgLSBubyBuZWVkIHRvIHNlbmQgbXVsdGljYXN0Ci0JCQkgKiBmcmFtZXMuCi0JCQkgKi8KLQkJCXJldHVybiBUWF9EUk9QOwotCQl9Ci0JCXJldHVybiBUWF9DT05USU5VRTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KHR4LT5zZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkJCSAgICBpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpICYmCisJCQkgICAgIWF0b21pY19yZWFkKCZ0eC0+c2RhdGEtPnUuYXAubnVtX3N0YV9hdXRob3JpemVkKSkpIHsKKwkJLyoKKwkJICogTm8gYXNzb2NpYXRlZCBTVEFzIC0gbm8gbmVlZCB0byBzZW5kIG11bHRpY2FzdAorCQkgKiBmcmFtZXMuCisJCSAqLworCQlyZXR1cm4gVFhfRFJPUDsKIAl9CiAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CkBAIC01NzIsOCArNTczLDYgQEAKIAkJc3dpdGNoICh0eC0+a2V5LT5jb25mLmNpcGhlcikgewogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOgogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDEwNDoKLQkJCWlmIChpZWVlODAyMTFfaXNfYXV0aChoZHItPmZyYW1lX2NvbnRyb2wpKQotCQkJCWJyZWFrOwogCQljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6CiAJCQlpZiAoIWllZWU4MDIxMV9pc19kYXRhX3ByZXNlbnQoaGRyLT5mcmFtZV9jb250cm9sKSkKIAkJCQl0eC0+a2V5ID0gTlVMTDsKQEAgLTYzNyw2ICs2MzYsNyBAQAogCWVsc2UKIAkJdHhyYy5tYXhfcmF0ZV9pZHggPSBmbHModHhyYy5yYXRlX2lkeF9tYXNrKSAtIDE7CiAJdHhyYy5ic3MgPSAodHgtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9BUCB8fAorCQkgICAgdHgtPnNkYXRhLT52aWYudHlwZSA9PSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UIHx8CiAJCSAgICB0eC0+c2RhdGEtPnZpZi50eXBlID09IE5MODAyMTFfSUZUWVBFX0FESE9DKTsKIAogCS8qIHNldCB1cCBSVFMgcHJvdGVjdGlvbiBpZiBkZXNpcmVkICovCkBAIC04NDQsMTEgKzg0NCwxMyBAQAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KIAotc3RhdGljIGludCBpZWVlODAyMTFfZnJhZ21lbnQoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCitzdGF0aWMgaW50IGllZWU4MDIxMV9mcmFnbWVudChzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4LAogCQkJICAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGhkcmxlbiwKIAkJCSAgICAgIGludCBmcmFnX3RocmVzaG9sZCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqdGFpbCA9IHNrYiwgKnRtcDsKKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9IHR4LT5sb2NhbDsKKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87CisJc3RydWN0IHNrX2J1ZmYgKnRtcDsKIAlpbnQgcGVyX2ZyYWdtID0gZnJhZ190aHJlc2hvbGQgLSBoZHJsZW4gLSBGQ1NfTEVOOwogCWludCBwb3MgPSBoZHJsZW4gKyBwZXJfZnJhZ207CiAJaW50IHJlbSA9IHNrYi0+bGVuIC0gaGRybGVuIC0gcGVyX2ZyYWdtOwpAQCAtODU2LDYgKzg1OCw4IEBACiAJaWYgKFdBUk5fT04ocmVtIDwgMCkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJLyogZmlyc3QgZnJhZ21lbnQgd2FzIGFscmVhZHkgYWRkZWQgdG8gcXVldWUgYnkgY2FsbGVyICovCisKIAl3aGlsZSAocmVtKSB7CiAJCWludCBmcmFnbGVuID0gcGVyX2ZyYWdtOwogCkBAIC04NjgsMTIgKzg3MiwyMSBAQAogCQkJCSAgICBJRUVFODAyMTFfRU5DUllQVF9UQUlMUk9PTSk7CiAJCWlmICghdG1wKQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCXRhaWwtPm5leHQgPSB0bXA7Ci0JCXRhaWwgPSB0bXA7CisKKwkJX19za2JfcXVldWVfdGFpbCgmdHgtPnNrYnMsIHRtcCk7CisKIAkJc2tiX3Jlc2VydmUodG1wLCBsb2NhbC0+dHhfaGVhZHJvb20gKwogCQkJCSBJRUVFODAyMTFfRU5DUllQVF9IRUFEUk9PTSk7CiAJCS8qIGNvcHkgY29udHJvbCBpbmZvcm1hdGlvbiAqLwogCQltZW1jcHkodG1wLT5jYiwgc2tiLT5jYiwgc2l6ZW9mKHRtcC0+Y2IpKTsKKworCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQih0bXApOworCQlpbmZvLT5mbGFncyAmPSB+KElFRUU4MDIxMV9UWF9DVExfQ0xFQVJfUFNfRklMVCB8CisJCQkJIElFRUU4MDIxMV9UWF9DVExfRklSU1RfRlJBR01FTlQpOworCisJCWlmIChyZW0pCisJCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX01PUkVfRlJBTUVTOworCiAJCXNrYl9jb3B5X3F1ZXVlX21hcHBpbmcodG1wLCBza2IpOwogCQl0bXAtPnByaW9yaXR5ID0gc2tiLT5wcmlvcml0eTsKIAkJdG1wLT5kZXYgPSBza2ItPmRldjsKQEAgLTg4NSw2ICs4OTgsNyBAQAogCQlwb3MgKz0gZnJhZ2xlbjsKIAl9CiAKKwkvKiBhZGp1c3QgZmlyc3QgZnJhZ21lbnQncyBsZW5ndGggKi8KIAlza2ItPmxlbiA9IGhkcmxlbiArIHBlcl9mcmFnbTsKIAlyZXR1cm4gMDsKIH0KQEAgLTg5OSw2ICs5MTMsMTAgQEAKIAlpbnQgaGRybGVuOwogCWludCBmcmFnbnVtOwogCisJLyogbm8gbWF0dGVyIHdoYXQgaGFwcGVucywgdHgtPnNrYiBtb3ZlcyB0byB0eC0+c2ticyAqLworCV9fc2tiX3F1ZXVlX3RhaWwoJnR4LT5za2JzLCBza2IpOworCXR4LT5za2IgPSBOVUxMOworCiAJaWYgKGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9ET05URlJBRykKIAkJcmV0dXJuIFRYX0NPTlRJTlVFOwogCkBAIC05MjcsMjEgKzk0NSwyMSBAQAogCSAqIG9mIHRoZSBmcmFnbWVudHMgdGhlbiB3ZSB3aWxsIHNpbXBseSBwcmV0ZW5kIHRvIGFjY2VwdCB0aGUgc2tiCiAJICogYnV0IHN0b3JlIGl0IGF3YXkgYXMgcGVuZGluZy4KIAkgKi8KLQlpZiAoaWVlZTgwMjExX2ZyYWdtZW50KHR4LT5sb2NhbCwgc2tiLCBoZHJsZW4sIGZyYWdfdGhyZXNob2xkKSkKKwlpZiAoaWVlZTgwMjExX2ZyYWdtZW50KHR4LCBza2IsIGhkcmxlbiwgZnJhZ190aHJlc2hvbGQpKQogCQlyZXR1cm4gVFhfRFJPUDsKIAogCS8qIHVwZGF0ZSBkdXJhdGlvbi9zZXEvZmxhZ3Mgb2YgZnJhZ21lbnRzICovCiAJZnJhZ251bSA9IDA7Ci0JZG8geworCisJc2tiX3F1ZXVlX3dhbGsoJnR4LT5za2JzLCBza2IpIHsKIAkJaW50IG5leHRfbGVuOwogCQljb25zdCBfX2xlMTYgbW9yZWZyYWdzID0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX0ZDVExfTU9SRUZSQUdTKTsKIAogCQloZHIgPSAodm9pZCAqKXNrYi0+ZGF0YTsKIAkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAotCQlpZiAoc2tiLT5uZXh0KSB7CisJCWlmICghc2tiX3F1ZXVlX2lzX2xhc3QoJnR4LT5za2JzLCBza2IpKSB7CiAJCQloZHItPmZyYW1lX2NvbnRyb2wgfD0gbW9yZWZyYWdzOwotCQkJbmV4dF9sZW4gPSBza2ItPm5leHQtPmxlbjsKIAkJCS8qCiAJCQkgKiBObyBtdWx0aS1yYXRlIHJldHJpZXMgZm9yIGZyYWdtZW50ZWQgZnJhbWVzLCB0aGF0CiAJCQkgKiB3b3VsZCBjb21wbGV0ZWx5IHRocm93IG9mZiB0aGUgTkFWIGF0IG90aGVyIFNUQXMuCkBAIC05NTYsMTAgKzk3NCw5IEBACiAJCQloZHItPmZyYW1lX2NvbnRyb2wgJj0gfm1vcmVmcmFnczsKIAkJCW5leHRfbGVuID0gMDsKIAkJfQotCQloZHItPmR1cmF0aW9uX2lkID0gaWVlZTgwMjExX2R1cmF0aW9uKHR4LCAwLCBuZXh0X2xlbik7CiAJCWhkci0+c2VxX2N0cmwgfD0gY3B1X3RvX2xlMTYoZnJhZ251bSAmIElFRUU4MDIxMV9TQ1RMX0ZSQUcpOwogCQlmcmFnbnVtKys7Ci0JfSB3aGlsZSAoKHNrYiA9IHNrYi0+bmV4dCkpOworCX0KIAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KQEAgLTk2NywxNiArOTg0LDE2IEBACiBzdGF0aWMgaWVlZTgwMjExX3R4X3Jlc3VsdCBkZWJ1Z19ub2lubGluZQogaWVlZTgwMjExX3R4X2hfc3RhdHMoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHgtPnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJaWYgKCF0eC0+c3RhKQogCQlyZXR1cm4gVFhfQ09OVElOVUU7CiAKIAl0eC0+c3RhLT50eF9wYWNrZXRzKys7Ci0JZG8geworCXNrYl9xdWV1ZV93YWxrKCZ0eC0+c2ticywgc2tiKSB7CiAJCXR4LT5zdGEtPnR4X2ZyYWdtZW50cysrOwogCQl0eC0+c3RhLT50eF9ieXRlcyArPSBza2ItPmxlbjsKLQl9IHdoaWxlICgoc2tiID0gc2tiLT5uZXh0KSk7CisJfQogCiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQpAQCAtMTAxNSwyMSArMTAzMiwyNSBAQAogc3RhdGljIGllZWU4MDIxMV90eF9yZXN1bHQgZGVidWdfbm9pbmxpbmUKIGllZWU4MDIxMV90eF9oX2NhbGN1bGF0ZV9kdXJhdGlvbihzdHJ1Y3QgaWVlZTgwMjExX3R4X2RhdGEgKnR4KQogewotCXN0cnVjdCBza19idWZmICpza2IgPSB0eC0+c2tiOworCXN0cnVjdCBza19idWZmICpza2I7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcjsKIAlpbnQgbmV4dF9sZW47CiAJYm9vbCBncm91cF9hZGRyOwogCi0JZG8geworCXNrYl9xdWV1ZV93YWxrKCZ0eC0+c2ticywgc2tiKSB7CiAJCWhkciA9ICh2b2lkICopIHNrYi0+ZGF0YTsKIAkJaWYgKHVubGlrZWx5KGllZWU4MDIxMV9pc19wc3BvbGwoaGRyLT5mcmFtZV9jb250cm9sKSkpCiAJCQlicmVhazsgLyogbXVzdCBub3Qgb3ZlcndyaXRlIEFJRCAqLwotCQluZXh0X2xlbiA9IHNrYi0+bmV4dCA/IHNrYi0+bmV4dC0+bGVuIDogMDsKKwkJaWYgKCFza2JfcXVldWVfaXNfbGFzdCgmdHgtPnNrYnMsIHNrYikpIHsKKwkJCXN0cnVjdCBza19idWZmICpuZXh0ID0gc2tiX3F1ZXVlX25leHQoJnR4LT5za2JzLCBza2IpOworCQkJbmV4dF9sZW4gPSBuZXh0LT5sZW47CisJCX0gZWxzZQorCQkJbmV4dF9sZW4gPSAwOwogCQlncm91cF9hZGRyID0gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIoaGRyLT5hZGRyMSk7CiAKIAkJaGRyLT5kdXJhdGlvbl9pZCA9Ci0JCQlpZWVlODAyMTFfZHVyYXRpb24odHgsIGdyb3VwX2FkZHIsIG5leHRfbGVuKTsKLQl9IHdoaWxlICgoc2tiID0gc2tiLT5uZXh0KSk7CisJCQlpZWVlODAyMTFfZHVyYXRpb24odHgsIHNrYiwgZ3JvdXBfYWRkciwgbmV4dF9sZW4pOworCX0KIAogCXJldHVybiBUWF9DT05USU5VRTsKIH0KQEAgLTEwNDMsOSArMTA2NCwxMSBAQAogCQkJCSAgaW50IHRpZCkKIHsKIAlib29sIHF1ZXVlZCA9IGZhbHNlOworCWJvb2wgcmVzZXRfYWdnX3RpbWVyID0gZmFsc2U7CiAKIAlpZiAodGVzdF9iaXQoSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMLCAmdGlkX3R4LT5zdGF0ZSkpIHsKIAkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9BTVBEVTsKKwkJcmVzZXRfYWdnX3RpbWVyID0gdHJ1ZTsKIAl9IGVsc2UgaWYgKHRlc3RfYml0KEhUX0FHR19TVEFURV9XQU5UX1NUQVJULCAmdGlkX3R4LT5zdGF0ZSkpIHsKIAkJLyoKIAkJICogbm90aGluZyAtLSB0aGlzIGFnZ3JlZ2F0aW9uIHNlc3Npb24gaXMgYmVpbmcgc3RhcnRlZApAQCAtMTA3Nyw2ICsxMTAwLDcgQEAKIAkJCS8qIGRvIG5vdGhpbmcsIGxldCBwYWNrZXQgcGFzcyB0aHJvdWdoICovCiAJCX0gZWxzZSBpZiAodGVzdF9iaXQoSFRfQUdHX1NUQVRFX09QRVJBVElPTkFMLCAmdGlkX3R4LT5zdGF0ZSkpIHsKIAkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfQU1QRFU7CisJCQlyZXNldF9hZ2dfdGltZXIgPSB0cnVlOwogCQl9IGVsc2UgewogCQkJcXVldWVkID0gdHJ1ZTsKIAkJCWluZm8tPmNvbnRyb2wudmlmID0gJnR4LT5zZGF0YS0+dmlmOwpAQCAtMTA4Niw2ICsxMTEwLDExIEBACiAJCXNwaW5fdW5sb2NrKCZ0eC0+c3RhLT5sb2NrKTsKIAl9CiAKKwkvKiByZXNldCBzZXNzaW9uIHRpbWVyICovCisJaWYgKHJlc2V0X2FnZ190aW1lciAmJiB0aWRfdHgtPnRpbWVvdXQpCisJCW1vZF90aW1lcigmdGlkX3R4LT5zZXNzaW9uX3RpbWVyLAorCQkJICBUVV9UT19FWFBfVElNRSh0aWRfdHgtPnRpbWVvdXQpKTsKKwogCXJldHVybiBxdWV1ZWQ7CiB9CiAKQEAgLTExMDgsNiArMTEzNyw3IEBACiAJdHgtPmxvY2FsID0gbG9jYWw7CiAJdHgtPnNkYXRhID0gc2RhdGE7CiAJdHgtPmNoYW5uZWwgPSBsb2NhbC0+aHcuY29uZi5jaGFubmVsOworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHgtPnNrYnMpOwogCiAJLyoKIAkgKiBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIHRydWUgYW55d2hlcmUsIGFuZCB3ZSBnZXQgaGVyZSwKQEAgLTExNTIsMTYgKzExODIsOCBAQAogCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkgewogCQl0eC0+ZmxhZ3MgJj0gfklFRUU4MDIxMV9UWF9VTklDQVNUOwogCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSzsKLQl9IGVsc2UgeworCX0gZWxzZQogCQl0eC0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1VOSUNBU1Q7Ci0JCWlmICh1bmxpa2VseShsb2NhbC0+d2lmaV93bWVfbm9hY2tfdGVzdCkpCi0JCQlpbmZvLT5mbGFncyB8PSBJRUVFODAyMTFfVFhfQ1RMX05PX0FDSzsKLQkJLyoKLQkJICogRmxhZ3MgYXJlIGluaXRpYWxpemVkIHRvIDAuIEhlbmNlLCBubyBuZWVkIHRvCi0JCSAqIGV4cGxpY2l0bHkgdW5zZXQgSUVFRTgwMjExX1RYX0NUTF9OT19BQ0sgc2luY2UKLQkJICogaXQgbWlnaHQgYWxyZWFkeSBiZSBzZXQgZm9yIGluamVjdGVkIGZyYW1lcy4KLQkJICovCi0JfQogCiAJaWYgKCEoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfQ1RMX0RPTlRGUkFHKSkgewogCQlpZiAoISh0eC0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfVU5JQ0FTVCkgfHwKQEAgLTExODAsMjIgKzEyMDIsMTggQEAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CiAKLS8qCi0gKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBmcmFtZSBjb3VsZG4ndCBiZSB0cmFuc21pdHRlZCBidXQgd2FzIHF1ZXVlZCBpbnN0ZWFkLgotICovCi1zdGF0aWMgYm9vbCBfX2llZWU4MDIxMV90eChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwgc3RydWN0IHNrX2J1ZmYgKipza2JwLAotCQkJICAgc3RydWN0IHN0YV9pbmZvICpzdGEsIGJvb2wgdHhwZW5kaW5nKQorc3RhdGljIGJvb2wgaWVlZTgwMjExX3R4X2ZyYWdzKHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsLAorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsCisJCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwKKwkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpza2JzLAorCQkJICAgICAgIGJvb2wgdHhwZW5kaW5nKQogewotCXN0cnVjdCBza19idWZmICpza2IgPSAqc2ticCwgKm5leHQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRtcDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87Ci0Jc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGE7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgbGVuOwotCWJvb2wgZnJhZ20gPSBmYWxzZTsKIAotCXdoaWxlIChza2IpIHsKKwlza2JfcXVldWVfd2Fsa19zYWZlKHNrYnMsIHNrYiwgdG1wKSB7CiAJCWludCBxID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7Ci0JCV9fbGUxNiBmYzsKIAogCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2ssIGZsYWdzKTsKIAkJaWYgKGxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbnNbcV0gfHwKQEAgLTEyMDUsMjQgKzEyMjMsMTEgQEAKIAkJCSAqIHRyYW5zbWlzc2lvbiBmcm9tIHRoZSB0eC1wZW5kaW5nIHRhc2tsZXQgd2hlbiB0aGUKIAkJCSAqIHF1ZXVlIGlzIHdva2VuIGFnYWluLgogCQkJICovCi0KLQkJCWRvIHsKLQkJCQluZXh0ID0gc2tiLT5uZXh0OwotCQkJCXNrYi0+bmV4dCA9IE5VTEw7Ci0JCQkJLyoKLQkJCQkgKiBOQjogSWYgdHhwZW5kaW5nIGlzIHRydWUsIG5leHQgbXVzdCBhbHJlYWR5Ci0JCQkJICogYmUgTlVMTCBzaW5jZSB3ZSBtdXN0J3ZlIGdvbmUgdGhyb3VnaCB0aGlzCi0JCQkJICogbG9vcCBiZWZvcmUgYWxyZWFkeTsgdGhlcmVmb3JlIHdlIGNhbiBqdXN0Ci0JCQkJICogcXVldWUgdGhlIGZyYW1lIHRvIHRoZSBoZWFkIHdpdGhvdXQgd29ycnlpbmcKLQkJCQkgKiBhYm91dCByZW9yZGVyaW5nIG9mIGZyYWdtZW50cy4KLQkJCQkgKi8KLQkJCQlpZiAodW5saWtlbHkodHhwZW5kaW5nKSkKLQkJCQkJX19za2JfcXVldWVfaGVhZCgmbG9jYWwtPnBlbmRpbmdbcV0sCi0JCQkJCQkJIHNrYik7Ci0JCQkJZWxzZQotCQkJCQlfX3NrYl9xdWV1ZV90YWlsKCZsb2NhbC0+cGVuZGluZ1txXSwKLQkJCQkJCQkgc2tiKTsKLQkJCX0gd2hpbGUgKChza2IgPSBuZXh0KSk7CisJCQlpZiAodHhwZW5kaW5nKQorCQkJCXNrYl9xdWV1ZV9zcGxpY2VfaW5pdChza2JzLCAmbG9jYWwtPnBlbmRpbmdbcV0pOworCQkJZWxzZQorCQkJCXNrYl9xdWV1ZV9zcGxpY2VfdGFpbF9pbml0KHNrYnMsCisJCQkJCQkJICAgJmxvY2FsLT5wZW5kaW5nW3FdKTsKIAogCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jYWwtPnF1ZXVlX3N0b3BfcmVhc29uX2xvY2ssCiAJCQkJCSAgICAgICBmbGFncyk7CkBAIC0xMjMxLDU3ICsxMjM2LDgxIEBACiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2FsLT5xdWV1ZV9zdG9wX3JlYXNvbl9sb2NrLCBmbGFncyk7CiAKIAkJaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKKwkJaW5mby0+Y29udHJvbC52aWYgPSB2aWY7CisJCWluZm8tPmNvbnRyb2wuc3RhID0gc3RhOwogCi0JCWlmIChmcmFnbSkKLQkJCWluZm8tPmZsYWdzICY9IH4oSUVFRTgwMjExX1RYX0NUTF9DTEVBUl9QU19GSUxUIHwKLQkJCQkJIElFRUU4MDIxMV9UWF9DVExfRklSU1RfRlJBR01FTlQpOwotCi0JCW5leHQgPSBza2ItPm5leHQ7Ci0JCWxlbiA9IHNrYi0+bGVuOwotCi0JCWlmIChuZXh0KQotCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX0NUTF9NT1JFX0ZSQU1FUzsKLQotCQlzZGF0YSA9IHZpZl90b19zZGF0YShpbmZvLT5jb250cm9sLnZpZik7Ci0KLQkJc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKLQkJY2FzZSBOTDgwMjExX0lGVFlQRV9NT05JVE9SOgotCQkJaW5mby0+Y29udHJvbC52aWYgPSBOVUxMOwotCQkJYnJlYWs7Ci0JCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKLQkJCWluZm8tPmNvbnRyb2wudmlmID0gJmNvbnRhaW5lcl9vZihzZGF0YS0+YnNzLAotCQkJCXN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEsIHUuYXApLT52aWY7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCS8qIGtlZXAgKi8KLQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKHN0YSAmJiBzdGEtPnVwbG9hZGVkKQotCQkJaW5mby0+Y29udHJvbC5zdGEgPSAmc3RhLT5zdGE7Ci0JCWVsc2UKLQkJCWluZm8tPmNvbnRyb2wuc3RhID0gTlVMTDsKLQotCQlmYyA9ICgoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGEpLT5mcmFtZV9jb250cm9sOworCQlfX3NrYl91bmxpbmsoc2tiLCBza2JzKTsKIAkJZHJ2X3R4KGxvY2FsLCBza2IpOwotCi0JCWllZWU4MDIxMV90cHRfbGVkX3RyaWdfdHgobG9jYWwsIGZjLCBsZW4pOwotCQkqc2ticCA9IHNrYiA9IG5leHQ7Ci0JCWllZWU4MDIxMV9sZWRfdHgobG9jYWwsIDEpOwotCQlmcmFnbSA9IHRydWU7CiAJfQogCiAJcmV0dXJuIHRydWU7CiB9CiAKIC8qCisgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBmcmFtZSBjb3VsZG4ndCBiZSB0cmFuc21pdHRlZCBidXQgd2FzIHF1ZXVlZCBpbnN0ZWFkLgorICovCitzdGF0aWMgYm9vbCBfX2llZWU4MDIxMV90eChzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCSAgIHN0cnVjdCBza19idWZmX2hlYWQgKnNrYnMsIGludCBsZWRfbGVuLAorCQkJICAgc3RydWN0IHN0YV9pbmZvICpzdGEsIGJvb2wgdHhwZW5kaW5nKQoreworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbzsKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YTsKKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOworCXN0cnVjdCBpZWVlODAyMTFfc3RhICpwdWJzdGE7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlib29sIHJlc3VsdCA9IHRydWU7CisJX19sZTE2IGZjOworCisJaWYgKFdBUk5fT04oc2tiX3F1ZXVlX2VtcHR5KHNrYnMpKSkKKwkJcmV0dXJuIHRydWU7CisKKwlza2IgPSBza2JfcGVlayhza2JzKTsKKwlmYyA9ICgoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGEpLT5mcmFtZV9jb250cm9sOworCWluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc2RhdGEgPSB2aWZfdG9fc2RhdGEoaW5mby0+Y29udHJvbC52aWYpOworCWlmIChzdGEgJiYgIXN0YS0+dXBsb2FkZWQpCisJCXN0YSA9IE5VTEw7CisKKwlpZiAoc3RhKQorCQlwdWJzdGEgPSAmc3RhLT5zdGE7CisJZWxzZQorCQlwdWJzdGEgPSBOVUxMOworCisJc3dpdGNoIChzZGF0YS0+dmlmLnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CisJCXNkYXRhID0gTlVMTDsKKwkJdmlmID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgorCQlzZGF0YSA9IGNvbnRhaW5lcl9vZihzZGF0YS0+YnNzLAorCQkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSwgdS5hcCk7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWRlZmF1bHQ6CisJCXZpZiA9ICZzZGF0YS0+dmlmOworCQlicmVhazsKKwl9CisKKwlpZiAobG9jYWwtPm9wcy0+dHhfZnJhZ3MpCisJCWRydl90eF9mcmFncyhsb2NhbCwgdmlmLCBwdWJzdGEsIHNrYnMpOworCWVsc2UKKwkJcmVzdWx0ID0gaWVlZTgwMjExX3R4X2ZyYWdzKGxvY2FsLCB2aWYsIHB1YnN0YSwgc2ticywKKwkJCQkJICAgIHR4cGVuZGluZyk7CisKKwlpZWVlODAyMTFfdHB0X2xlZF90cmlnX3R4KGxvY2FsLCBmYywgbGVkX2xlbik7CisJaWVlZTgwMjExX2xlZF90eChsb2NhbCwgMSk7CisKKwlXQVJOX09OX09OQ0UoIXNrYl9xdWV1ZV9lbXB0eShza2JzKSk7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKgogICogSW52b2tlIFRYIGhhbmRsZXJzLCByZXR1cm4gMCBvbiBzdWNjZXNzIGFuZCBub24temVybyBpZiB0aGUKICAqIGZyYW1lIHdhcyBkcm9wcGVkIG9yIHF1ZXVlZC4KICAqLwogc3RhdGljIGludCBpbnZva2VfdHhfaGFuZGxlcnMoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHgtPnNrYjsKLQlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm8gPSBJRUVFODAyMTFfU0tCX0NCKHNrYik7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQih0eC0+c2tiKTsKIAlpZWVlODAyMTFfdHhfcmVzdWx0IHJlcyA9IFRYX0RST1A7CiAKICNkZWZpbmUgQ0FMTF9UWEgodHhoKSBcCkBAIC0xMjk5LDggKzEzMjgsMTEgQEAKIAlpZiAoISh0eC0+bG9jYWwtPmh3LmZsYWdzICYgSUVFRTgwMjExX0hXX0hBU19SQVRFX0NPTlRST0wpKQogCQlDQUxMX1RYSChpZWVlODAyMTFfdHhfaF9yYXRlX2N0cmwpOwogCi0JaWYgKHVubGlrZWx5KGluZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0lOVEZMX1JFVFJBTlNNSVNTSU9OKSkKKwlpZiAodW5saWtlbHkoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfSU5URkxfUkVUUkFOU01JU1NJT04pKSB7CisJCV9fc2tiX3F1ZXVlX3RhaWwoJnR4LT5za2JzLCB0eC0+c2tiKTsKKwkJdHgtPnNrYiA9IE5VTEw7CiAJCWdvdG8gdHhoX2RvbmU7CisJfQogCiAJQ0FMTF9UWEgoaWVlZTgwMjExX3R4X2hfbWljaGFlbF9taWNfYWRkKTsKIAlDQUxMX1RYSChpZWVlODAyMTFfdHhfaF9zZXF1ZW5jZSk7CkBAIC0xMzE1LDEzICsxMzQ3LDEwIEBACiAgdHhoX2RvbmU6CiAJaWYgKHVubGlrZWx5KHJlcyA9PSBUWF9EUk9QKSkgewogCQlJODAyX0RFQlVHX0lOQyh0eC0+bG9jYWwtPnR4X2hhbmRsZXJzX2Ryb3ApOwotCQl3aGlsZSAoc2tiKSB7Ci0JCQlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dDsKLQotCQkJbmV4dCA9IHNrYi0+bmV4dDsKLQkJCWRldl9rZnJlZV9za2Ioc2tiKTsKLQkJCXNrYiA9IG5leHQ7Ci0JCX0KKwkJaWYgKHR4LT5za2IpCisJCQlkZXZfa2ZyZWVfc2tiKHR4LT5za2IpOworCQllbHNlCisJCQlfX3NrYl9xdWV1ZV9wdXJnZSgmdHgtPnNrYnMpOwogCQlyZXR1cm4gLTE7CiAJfSBlbHNlIGlmICh1bmxpa2VseShyZXMgPT0gVFhfUVVFVUVEKSkgewogCQlJODAyX0RFQlVHX0lOQyh0eC0+bG9jYWwtPnR4X2hhbmRsZXJzX3F1ZXVlZCk7CkBAIC0xMzQyLDYgKzEzNzEsNyBAQAogCWllZWU4MDIxMV90eF9yZXN1bHQgcmVzX3ByZXBhcmU7CiAJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOwogCWJvb2wgcmVzdWx0ID0gdHJ1ZTsKKwlpbnQgbGVkX2xlbjsKIAogCWlmICh1bmxpa2VseShza2ItPmxlbiA8IDEwKSkgewogCQlkZXZfa2ZyZWVfc2tiKHNrYik7CkBAIC0xMzUxLDYgKzEzODEsNyBAQAogCXJjdV9yZWFkX2xvY2soKTsKIAogCS8qIGluaXRpYWxpc2VzIHR4ICovCisJbGVkX2xlbiA9IHNrYi0+bGVuOwogCXJlc19wcmVwYXJlID0gaWVlZTgwMjExX3R4X3ByZXBhcmUoc2RhdGEsICZ0eCwgc2tiKTsKIAogCWlmICh1bmxpa2VseShyZXNfcHJlcGFyZSA9PSBUWF9EUk9QKSkgewpAQCAtMTM2NCw3ICsxMzk1LDggQEAKIAlpbmZvLT5iYW5kID0gdHguY2hhbm5lbC0+YmFuZDsKIAogCWlmICghaW52b2tlX3R4X2hhbmRsZXJzKCZ0eCkpCi0JCXJlc3VsdCA9IF9faWVlZTgwMjExX3R4KGxvY2FsLCAmdHguc2tiLCB0eC5zdGEsIHR4cGVuZGluZyk7CisJCXJlc3VsdCA9IF9faWVlZTgwMjExX3R4KGxvY2FsLCAmdHguc2ticywgbGVkX2xlbiwKKwkJCQkJdHguc3RhLCB0eHBlbmRpbmcpOwogIG91dDoKIAlyY3VfcmVhZF91bmxvY2soKTsKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMTQzMSw3ICsxNDYzLDcgQEAKIAlpZiAoaWVlZTgwMjExX3ZpZl9pc19tZXNoKCZzZGF0YS0+dmlmKSAmJgogCSAgICBpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpICYmCiAJCSFpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHItPmFkZHIxKSkKLQkJCWlmIChtZXNoX25leHRob3BfbG9va3VwKHNrYiwgc2RhdGEpKSB7CisJCQlpZiAobWVzaF9uZXh0aG9wX3Jlc29sdmUoc2tiLCBzZGF0YSkpIHsKIAkJCQkvKiBza2IgcXVldWVkOiBkb24ndCBmcmVlICovCiAJCQkJcmN1X3JlYWRfdW5sb2NrKCk7CiAJCQkJcmV0dXJuOwpAQCAtMTY4NSw4ICsxNzE3LDEwIEBACiAJaW50IG5oX3BvcywgaF9wb3M7CiAJc3RydWN0IHN0YV9pbmZvICpzdGEgPSBOVUxMOwogCWJvb2wgd21lX3N0YSA9IGZhbHNlLCBhdXRob3JpemVkID0gZmFsc2UsIHRkbHNfYXV0aCA9IGZhbHNlOwotCXN0cnVjdCBza19idWZmICp0bXBfc2tiOwogCWJvb2wgdGRsc19kaXJlY3QgPSBmYWxzZTsKKwlib29sIG11bHRpY2FzdDsKKwl1MzIgaW5mb19mbGFncyA9IDA7CisJdTE2IGluZm9faWQgPSAwOwogCiAJaWYgKHVubGlrZWx5KHNrYi0+bGVuIDwgRVRIX0hMRU4pKSB7CiAJCXJldCA9IE5FVERFVl9UWF9PSzsKQEAgLTE4NzMsNyArMTkwNyw4IEBACiAJICogaWYgaXQgaXMgYSBtdWx0aWNhc3QgYWRkcmVzcyAod2hpY2ggY2FuIG9ubHkgaGFwcGVuCiAJICogaW4gQVAgbW9kZSkKIAkgKi8KLQlpZiAoIWlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci5hZGRyMSkpIHsKKwltdWx0aWNhc3QgPSBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcihoZHIuYWRkcjEpOworCWlmICghbXVsdGljYXN0KSB7CiAJCXJjdV9yZWFkX2xvY2soKTsKIAkJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBoZHIuYWRkcjEpOwogCQlpZiAoc3RhKSB7CkBAIC0xOTE0LDExICsxOTQ5LDU0IEBACiAJCWdvdG8gZmFpbDsKIAl9CiAKKwlpZiAodW5saWtlbHkoIW11bHRpY2FzdCAmJiBza2ItPnNrICYmCisJCSAgICAgc2tiX3NoaW5mbyhza2IpLT50eF9mbGFncyAmIFNLQlRYX1dJRklfU1RBVFVTKSkgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqb3JpZ19za2IgPSBza2I7CisKKwkJc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmIChza2IpIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQlpbnQgaWQsIHI7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+YWNrX3N0YXR1c19sb2NrLCBmbGFncyk7CisJCQlyID0gaWRyX2dldF9uZXdfYWJvdmUoJmxvY2FsLT5hY2tfc3RhdHVzX2ZyYW1lcywKKwkJCQkJICAgICAgb3JpZ19za2IsIDEsICZpZCk7CisJCQlpZiAociA9PSAtRUFHQUlOKSB7CisJCQkJaWRyX3ByZV9nZXQoJmxvY2FsLT5hY2tfc3RhdHVzX2ZyYW1lcywKKwkJCQkJICAgIEdGUF9BVE9NSUMpOworCQkJCXIgPSBpZHJfZ2V0X25ld19hYm92ZSgmbG9jYWwtPmFja19zdGF0dXNfZnJhbWVzLAorCQkJCQkJICAgICAgb3JpZ19za2IsIDEsICZpZCk7CisJCQl9CisJCQlpZiAoV0FSTl9PTighaWQpIHx8IGlkID4gMHhmZmZmKSB7CisJCQkJaWRyX3JlbW92ZSgmbG9jYWwtPmFja19zdGF0dXNfZnJhbWVzLCBpZCk7CisJCQkJciA9IC1FUkFOR0U7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+YWNrX3N0YXR1c19sb2NrLCBmbGFncyk7CisKKwkJCWlmICghcikgeworCQkJCWluZm9faWQgPSBpZDsKKwkJCQlpbmZvX2ZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfUkVRX1RYX1NUQVRVUzsKKwkJCX0gZWxzZSBpZiAoc2tiX3NoYXJlZChza2IpKSB7CisJCQkJa2ZyZWVfc2tiKG9yaWdfc2tiKTsKKwkJCX0gZWxzZSB7CisJCQkJa2ZyZWVfc2tiKHNrYik7CisJCQkJc2tiID0gb3JpZ19za2I7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBjb3VsZG4ndCBjbG9uZSAtLSBsb3NlIHR4IHN0YXR1cyAuLi4gKi8KKwkJCXNrYiA9IG9yaWdfc2tiOworCQl9CisJfQorCiAJLyoKIAkgKiBJZiB0aGUgc2tiIGlzIHNoYXJlZCB3ZSBuZWVkIHRvIG9idGFpbiBvdXIgb3duIGNvcHkuCiAJICovCiAJaWYgKHNrYl9zaGFyZWQoc2tiKSkgewotCQl0bXBfc2tiID0gc2tiOworCQlzdHJ1Y3Qgc2tfYnVmZiAqdG1wX3NrYiA9IHNrYjsKKworCQkvKiBjYW4ndCBoYXBwZW4gLS0gc2tiIGlzIGEgY2xvbmUgaWYgaW5mb19pZCAhPSAwICovCisJCVdBUk5fT04oaW5mb19pZCk7CisKIAkJc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiAJCWtmcmVlX3NrYih0bXBfc2tiKTsKIApAQCAtMjAxOSw2ICsyMDk3LDEwIEBACiAJbWVtc2V0KGluZm8sIDAsIHNpemVvZigqaW5mbykpOwogCiAJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7CisKKwlpbmZvLT5mbGFncyA9IGluZm9fZmxhZ3M7CisJaW5mby0+YWNrX2ZyYW1lX2lkID0gaW5mb19pZDsKKwogCWllZWU4MDIxMV94bWl0KHNkYXRhLCBza2IpOwogCiAJcmV0dXJuIE5FVERFVl9UWF9PSzsKQEAgLTIwNjIsMTAgKzIxNDQsMTUgQEAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBJRUVFODAyMTFfVFhfSU5URkxfTkVFRF9UWFBST0NFU1NJTkcpIHsKIAkJcmVzdWx0ID0gaWVlZTgwMjExX3R4KHNkYXRhLCBza2IsIHRydWUpOwogCX0gZWxzZSB7CisJCXN0cnVjdCBza19idWZmX2hlYWQgc2ticzsKKworCQlfX3NrYl9xdWV1ZV9oZWFkX2luaXQoJnNrYnMpOworCQlfX3NrYl9xdWV1ZV90YWlsKCZza2JzLCBza2IpOworCiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKXNrYi0+ZGF0YTsKIAkJc3RhID0gc3RhX2luZm9fZ2V0KHNkYXRhLCBoZHItPmFkZHIxKTsKIAotCQlyZXN1bHQgPSBfX2llZWU4MDIxMV90eChsb2NhbCwgJnNrYiwgc3RhLCB0cnVlKTsKKwkJcmVzdWx0ID0gX19pZWVlODAyMTFfdHgobG9jYWwsICZza2JzLCBza2ItPmxlbiwgc3RhLCB0cnVlKTsKIAl9CiAKIAlyZXR1cm4gcmVzdWx0OwpAQCAtMjE3OCwxMCArMjI2NSwxMCBAQAogCQkvKiBCaXRtYXAgY29udHJvbCAqLwogCQkqcG9zKysgPSBuMSB8IGFpZDA7CiAJCS8qIFBhcnQgVmlydCBCaXRtYXAgKi8KKwkJc2tiX3B1dChza2IsIG4yIC0gbjEpOwogCQltZW1jcHkocG9zLCBic3MtPnRpbSArIG4xLCBuMiAtIG4xICsgMSk7CiAKIAkJdGltWzFdID0gbjIgLSBuMSArIDQ7Ci0JCXNrYl9wdXQoc2tiLCBuMiAtIG4xKTsKIAl9IGVsc2UgewogCQkqcG9zKysgPSBhaWQwOyAvKiBCaXRtYXAgY29udHJvbCAqLwogCQkqcG9zKysgPSAwOyAvKiBQYXJ0IFZpcnQgQml0bWFwICovCkBAIC0yMjQ2LDkgKzIzMzMsOSBAQAogCQkJfSBlbHNlIHsKIAkJCQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2FsLT5zdGFfbG9jaywgZmxhZ3MpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NhbC0+dGltX2xvY2ssIGZsYWdzKTsKIAkJCQlpZWVlODAyMTFfYmVhY29uX2FkZF90aW0oYXAsIHNrYiwgYmVhY29uKTsKLQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+c3RhX2xvY2ssIGZsYWdzKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NhbC0+dGltX2xvY2ssIGZsYWdzKTsKIAkJCX0KIAogCQkJaWYgKHRpbV9vZmZzZXQpCkBAIC0yMjc5LDIyICsyMzY2LDMxIEBACiAJfSBlbHNlIGlmIChpZWVlODAyMTFfdmlmX2lzX21lc2goJnNkYXRhLT52aWYpKSB7CiAJCXN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKIAkJdTggKnBvczsKKwkJaW50IGhkcl9sZW4gPSBvZmZzZXRvZihzdHJ1Y3QgaWVlZTgwMjExX21nbXQsIHUuYmVhY29uKSArCisJCQkgICAgICBzaXplb2YobWdtdC0+dS5iZWFjb24pOwogCiAjaWZkZWYgQ09ORklHX01BQzgwMjExX01FU0gKIAkJaWYgKCFzZGF0YS0+dS5tZXNoLm1lc2hfaWRfbGVuKQogCQkJZ290byBvdXQ7CiAjZW5kaWYKIAotCQkvKiBoZWFkcm9vbSwgaGVhZCBsZW5ndGgsIHRhaWwgbGVuZ3RoIGFuZCBtYXhpbXVtIFRJTSBsZW5ndGggKi8KLQkJc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+dHhfaGVhZHJvb20gKyA0MDAgKwotCQkJCXNkYXRhLT51Lm1lc2guaWVfbGVuKTsKKwkJc2tiID0gZGV2X2FsbG9jX3NrYihsb2NhbC0+dHhfaGVhZHJvb20gKworCQkJCSAgICBoZHJfbGVuICsKKwkJCQkgICAgMiArIC8qIE5VTEwgU1NJRCAqLworCQkJCSAgICAyICsgOCArIC8qIHN1cHBvcnRlZCByYXRlcyAqLworCQkJCSAgICAyICsgMyArIC8qIERTIHBhcmFtcyAqLworCQkJCSAgICAyICsgKElFRUU4MDIxMV9NQVhfU1VQUF9SQVRFUyAtIDgpICsKKwkJCQkgICAgMiArIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkgKworCQkJCSAgICAyICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykgKworCQkJCSAgICAyICsgc2RhdGEtPnUubWVzaC5tZXNoX2lkX2xlbiArCisJCQkJICAgIDIgKyBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9tZXNoY29uZl9pZSkgKworCQkJCSAgICBzZGF0YS0+dS5tZXNoLmllX2xlbik7CiAJCWlmICghc2tiKQogCQkJZ290byBvdXQ7CiAKIAkJc2tiX3Jlc2VydmUoc2tiLCBsb2NhbC0+aHcuZXh0cmFfdHhfaGVhZHJvb20pOwotCQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKQotCQkJc2tiX3B1dChza2IsIDI0ICsgc2l6ZW9mKG1nbXQtPnUuYmVhY29uKSk7Ci0JCW1lbXNldChtZ210LCAwLCAyNCArIHNpemVvZihtZ210LT51LmJlYWNvbikpOworCQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqKSBza2JfcHV0KHNrYiwgaGRyX2xlbik7CisJCW1lbXNldChtZ210LCAwLCBoZHJfbGVuKTsKIAkJbWdtdC0+ZnJhbWVfY29udHJvbCA9CiAJCSAgICBjcHVfdG9fbGUxNihJRUVFODAyMTFfRlRZUEVfTUdNVCB8IElFRUU4MDIxMV9TVFlQRV9CRUFDT04pOwogCQltZW1zZXQobWdtdC0+ZGEsIDB4ZmYsIEVUSF9BTEVOKTsKQEAgLTIzMTMsNiArMjQwOSw4IEBACiAJCSAgICBtZXNoX2FkZF9kc19wYXJhbXNfaWUoc2tiLCBzZGF0YSkgfHwKIAkJICAgIGllZWU4MDIxMV9hZGRfZXh0X3NyYXRlc19pZSgmc2RhdGEtPnZpZiwgc2tiKSB8fAogCQkgICAgbWVzaF9hZGRfcnNuX2llKHNrYiwgc2RhdGEpIHx8CisJCSAgICBtZXNoX2FkZF9odF9jYXBfaWUoc2tiLCBzZGF0YSkgfHwKKwkJICAgIG1lc2hfYWRkX2h0X2luZm9faWUoc2tiLCBzZGF0YSkgfHwKIAkJICAgIG1lc2hfYWRkX21lc2hpZF9pZShza2IsIHNkYXRhKSB8fAogCQkgICAgbWVzaF9hZGRfbWVzaGNvbmZfaWUoc2tiLCBzZGF0YSkgfHwKIAkJICAgIG1lc2hfYWRkX3ZlbmRvcl9pZXMoc2tiLCBzZGF0YSkpIHsKQEAgLTIzNTUsNiArMjQ1MywzNyBAQAogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfYmVhY29uX2dldF90aW0pOwogCitzdHJ1Y3Qgc2tfYnVmZiAqaWVlZTgwMjExX3Byb2JlcmVzcF9nZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsCisJCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCit7CisJc3RydWN0IGllZWU4MDIxMV9pZl9hcCAqYXAgPSBOVUxMOworCXN0cnVjdCBza19idWZmICpwcmVzcCA9IE5VTEwsICpza2IgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHI7CisJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKKworCWlmIChzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCXJldHVybiBOVUxMOworCisJcmN1X3JlYWRfbG9jaygpOworCisJYXAgPSAmc2RhdGEtPnUuYXA7CisJcHJlc3AgPSByY3VfZGVyZWZlcmVuY2UoYXAtPnByb2JlX3Jlc3ApOworCWlmICghcHJlc3ApCisJCWdvdG8gb3V0OworCisJc2tiID0gc2tiX2NvcHkocHJlc3AsIEdGUF9BVE9NSUMpOworCWlmICghc2tiKQorCQlnb3RvIG91dDsKKworCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CisJbWVtc2V0KGhkci0+YWRkcjEsIDAsIHNpemVvZihoZHItPmFkZHIxKSk7CisKK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gc2tiOworfQorRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcHJvYmVyZXNwX2dldCk7CisKIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfcHNwb2xsX2dldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKIAkJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpCiB7CkBAIC0yNTY3LDE1ICsyNjk2LDE1IEBACiB9CiBFWFBPUlRfU1lNQk9MKGllZWU4MDIxMV9nZXRfYnVmZmVyZWRfYmMpOwogCi12b2lkIGllZWU4MDIxMV90eF9za2Ioc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsIHN0cnVjdCBza19idWZmICpza2IpCit2b2lkIGllZWU4MDIxMV90eF9za2JfdGlkKHN0cnVjdCBpZWVlODAyMTFfc3ViX2lmX2RhdGEgKnNkYXRhLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgdGlkKQogewogCXNrYl9zZXRfbWFjX2hlYWRlcihza2IsIDApOwogCXNrYl9zZXRfbmV0d29ya19oZWFkZXIoc2tiLCAwKTsKIAlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCAwKTsKIAotCS8qIFNlbmQgYWxsIGludGVybmFsIG1nbXQgZnJhbWVzIG9uIFZPLiBBY2NvcmRpbmdseSBzZXQgVElEIHRvIDcuICovCi0Jc2tiX3NldF9xdWV1ZV9tYXBwaW5nKHNrYiwgSUVFRTgwMjExX0FDX1ZPKTsKLQlza2ItPnByaW9yaXR5ID0gNzsKKwlza2Jfc2V0X3F1ZXVlX21hcHBpbmcoc2tiLCBpZWVlODAyXzFkX3RvX2FjW3RpZF0pOworCXNrYi0+cHJpb3JpdHkgPSB0aWQ7CiAKIAkvKgogCSAqIFRoZSBvdGhlciBwYXRoIGNhbGxpbmcgaWVlZTgwMjExX3htaXQgaXMgZnJvbSB0aGUgdGFza2xldCwKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS91dGlsLmMgYi9uZXQvbWFjODAyMTEvdXRpbC5jCmluZGV4IGVjYTBmYWQuLjk5MTk4OTIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS91dGlsLmMKKysrIGIvbmV0L21hYzgwMjExL3V0aWwuYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CiAjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CisjaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxuZXQvbmV0X25hbWVzcGFjZS5oPgogI2luY2x1ZGUgPG5ldC9jZmc4MDIxMS5oPgogI2luY2x1ZGUgPG5ldC9ydG5ldGxpbmsuaD4KQEAgLTk2LDEzICs5NywxMyBAQAogCiB2b2lkIGllZWU4MDIxMV90eF9zZXRfcHJvdGVjdGVkKHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4LT5za2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAlzdHJ1Y3QgaWVlZTgwMjExX2hkciAqaGRyOwogCi0JZG8geworCXNrYl9xdWV1ZV93YWxrKCZ0eC0+c2ticywgc2tiKSB7CiAJCWhkciA9IChzdHJ1Y3QgaWVlZTgwMjExX2hkciAqKSBza2ItPmRhdGE7CiAJCWhkci0+ZnJhbWVfY29udHJvbCB8PSBjcHVfdG9fbGUxNihJRUVFODAyMTFfRkNUTF9QUk9URUNURUQpOwotCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKwl9CiB9CiAKIGludCBpZWVlODAyMTFfZnJhbWVfZHVyYXRpb24oc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsIHNpemVfdCBsZW4sCkBAIC01NjQsNiArNTY1LDE3MiBAQAogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcXVldWVfZGVsYXllZF93b3JrKTsKIAordTMyIGllZWU4MDJfMTFfcGFyc2VfZWxlbXNfY3JjKHU4ICpzdGFydCwgc2l6ZV90IGxlbiwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyAqZWxlbXMsCisJCQkgICAgICAgdTY0IGZpbHRlciwgdTMyIGNyYykKK3sKKwlzaXplX3QgbGVmdCA9IGxlbjsKKwl1OCAqcG9zID0gc3RhcnQ7CisJYm9vbCBjYWxjX2NyYyA9IGZpbHRlciAhPSAwOworCisJbWVtc2V0KGVsZW1zLCAwLCBzaXplb2YoKmVsZW1zKSk7CisJZWxlbXMtPmllX3N0YXJ0ID0gc3RhcnQ7CisJZWxlbXMtPnRvdGFsX2xlbiA9IGxlbjsKKworCXdoaWxlIChsZWZ0ID49IDIpIHsKKwkJdTggaWQsIGVsZW47CisKKwkJaWQgPSAqcG9zKys7CisJCWVsZW4gPSAqcG9zKys7CisJCWxlZnQgLT0gMjsKKworCQlpZiAoZWxlbiA+IGxlZnQpCisJCQlicmVhazsKKworCQlpZiAoY2FsY19jcmMgJiYgaWQgPCA2NCAmJiAoZmlsdGVyICYgKDFVTEwgPDwgaWQpKSkKKwkJCWNyYyA9IGNyYzMyX2JlKGNyYywgcG9zIC0gMiwgZWxlbiArIDIpOworCisJCXN3aXRjaCAoaWQpIHsKKwkJY2FzZSBXTEFOX0VJRF9TU0lEOgorCQkJZWxlbXMtPnNzaWQgPSBwb3M7CisJCQllbGVtcy0+c3NpZF9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfU1VQUF9SQVRFUzoKKwkJCWVsZW1zLT5zdXBwX3JhdGVzID0gcG9zOworCQkJZWxlbXMtPnN1cHBfcmF0ZXNfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0ZIX1BBUkFNUzoKKwkJCWVsZW1zLT5maF9wYXJhbXMgPSBwb3M7CisJCQllbGVtcy0+ZmhfcGFyYW1zX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9EU19QQVJBTVM6CisJCQllbGVtcy0+ZHNfcGFyYW1zID0gcG9zOworCQkJZWxlbXMtPmRzX3BhcmFtc19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfQ0ZfUEFSQU1TOgorCQkJZWxlbXMtPmNmX3BhcmFtcyA9IHBvczsKKwkJCWVsZW1zLT5jZl9wYXJhbXNfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1RJTToKKwkJCWlmIChlbGVuID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3RpbV9pZSkpIHsKKwkJCQllbGVtcy0+dGltID0gKHZvaWQgKilwb3M7CisJCQkJZWxlbXMtPnRpbV9sZW4gPSBlbGVuOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfSUJTU19QQVJBTVM6CisJCQllbGVtcy0+aWJzc19wYXJhbXMgPSBwb3M7CisJCQllbGVtcy0+aWJzc19wYXJhbXNfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0NIQUxMRU5HRToKKwkJCWVsZW1zLT5jaGFsbGVuZ2UgPSBwb3M7CisJCQllbGVtcy0+Y2hhbGxlbmdlX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9WRU5ET1JfU1BFQ0lGSUM6CisJCQlpZiAoZWxlbiA+PSA0ICYmIHBvc1swXSA9PSAweDAwICYmIHBvc1sxXSA9PSAweDUwICYmCisJCQkgICAgcG9zWzJdID09IDB4ZjIpIHsKKwkJCQkvKiBNaWNyb3NvZnQgT1VJICgwMDo1MDpGMikgKi8KKworCQkJCWlmIChjYWxjX2NyYykKKwkJCQkJY3JjID0gY3JjMzJfYmUoY3JjLCBwb3MgLSAyLCBlbGVuICsgMik7CisKKwkJCQlpZiAocG9zWzNdID09IDEpIHsKKwkJCQkJLyogT1VJIFR5cGUgMSAtIFdQQSBJRSAqLworCQkJCQllbGVtcy0+d3BhID0gcG9zOworCQkJCQllbGVtcy0+d3BhX2xlbiA9IGVsZW47CisJCQkJfSBlbHNlIGlmIChlbGVuID49IDUgJiYgcG9zWzNdID09IDIpIHsKKwkJCQkJLyogT1VJIFR5cGUgMiAtIFdNTSBJRSAqLworCQkJCQlpZiAocG9zWzRdID09IDApIHsKKwkJCQkJCWVsZW1zLT53bW1faW5mbyA9IHBvczsKKwkJCQkJCWVsZW1zLT53bW1faW5mb19sZW4gPSBlbGVuOworCQkJCQl9IGVsc2UgaWYgKHBvc1s0XSA9PSAxKSB7CisJCQkJCQllbGVtcy0+d21tX3BhcmFtID0gcG9zOworCQkJCQkJZWxlbXMtPndtbV9wYXJhbV9sZW4gPSBlbGVuOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUlNOOgorCQkJZWxlbXMtPnJzbiA9IHBvczsKKwkJCWVsZW1zLT5yc25fbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0VSUF9JTkZPOgorCQkJZWxlbXMtPmVycF9pbmZvID0gcG9zOworCQkJZWxlbXMtPmVycF9pbmZvX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUzoKKwkJCWVsZW1zLT5leHRfc3VwcF9yYXRlcyA9IHBvczsKKwkJCWVsZW1zLT5leHRfc3VwcF9yYXRlc19sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfSFRfQ0FQQUJJTElUWToKKwkJCWlmIChlbGVuID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkpCisJCQkJZWxlbXMtPmh0X2NhcF9lbGVtID0gKHZvaWQgKilwb3M7CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9IVF9JTkZPUk1BVElPTjoKKwkJCWlmIChlbGVuID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8pKQorCQkJCWVsZW1zLT5odF9pbmZvX2VsZW0gPSAodm9pZCAqKXBvczsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX01FU0hfSUQ6CisJCQllbGVtcy0+bWVzaF9pZCA9IHBvczsKKwkJCWVsZW1zLT5tZXNoX2lkX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9NRVNIX0NPTkZJRzoKKwkJCWlmIChlbGVuID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX21lc2hjb25mX2llKSkKKwkJCQllbGVtcy0+bWVzaF9jb25maWcgPSAodm9pZCAqKXBvczsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1BFRVJfTUdNVDoKKwkJCWVsZW1zLT5wZWVyaW5nID0gcG9zOworCQkJZWxlbXMtPnBlZXJpbmdfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1BSRVE6CisJCQllbGVtcy0+cHJlcSA9IHBvczsKKwkJCWVsZW1zLT5wcmVxX2xlbiA9IGVsZW47CisJCQlicmVhazsKKwkJY2FzZSBXTEFOX0VJRF9QUkVQOgorCQkJZWxlbXMtPnByZXAgPSBwb3M7CisJCQllbGVtcy0+cHJlcF9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUEVSUjoKKwkJCWVsZW1zLT5wZXJyID0gcG9zOworCQkJZWxlbXMtPnBlcnJfbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1JBTk46CisJCQlpZiAoZWxlbiA+PSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9yYW5uX2llKSkKKwkJCQllbGVtcy0+cmFubiA9ICh2b2lkICopcG9zOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfQ0hBTk5FTF9TV0lUQ0g6CisJCQllbGVtcy0+Y2hfc3dpdGNoX2VsZW0gPSBwb3M7CisJCQllbGVtcy0+Y2hfc3dpdGNoX2VsZW1fbGVuID0gZWxlbjsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX1FVSUVUOgorCQkJaWYgKCFlbGVtcy0+cXVpZXRfZWxlbSkgeworCQkJCWVsZW1zLT5xdWlldF9lbGVtID0gcG9zOworCQkJCWVsZW1zLT5xdWlldF9lbGVtX2xlbiA9IGVsZW47CisJCQl9CisJCQllbGVtcy0+bnVtX29mX3F1aWV0X2VsZW0rKzsKKwkJCWJyZWFrOworCQljYXNlIFdMQU5fRUlEX0NPVU5UUlk6CisJCQllbGVtcy0+Y291bnRyeV9lbGVtID0gcG9zOworCQkJZWxlbXMtPmNvdW50cnlfZWxlbV9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfUFdSX0NPTlNUUkFJTlQ6CisJCQllbGVtcy0+cHdyX2NvbnN0cl9lbGVtID0gcG9zOworCQkJZWxlbXMtPnB3cl9jb25zdHJfZWxlbV9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWNhc2UgV0xBTl9FSURfVElNRU9VVF9JTlRFUlZBTDoKKwkJCWVsZW1zLT50aW1lb3V0X2ludCA9IHBvczsKKwkJCWVsZW1zLT50aW1lb3V0X2ludF9sZW4gPSBlbGVuOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWxlZnQgLT0gZWxlbjsKKwkJcG9zICs9IGVsZW47CisJfQorCisJcmV0dXJuIGNyYzsKK30KKwogdm9pZCBpZWVlODAyXzExX3BhcnNlX2VsZW1zKHU4ICpzdGFydCwgc2l6ZV90IGxlbiwKIAkJCSAgICBzdHJ1Y3QgaWVlZTgwMl8xMV9lbGVtcyAqZWxlbXMpCiB7CkBAIC04MTIsMjMgKzk3OSw5IEBACiAJCW9mZnNldCA9IG5vZmZzZXQ7CiAJfQogCi0JaWYgKHNiYW5kLT5odF9jYXAuaHRfc3VwcG9ydGVkKSB7Ci0JCXUxNiBjYXAgPSBzYmFuZC0+aHRfY2FwLmNhcDsKLQkJX19sZTE2IHRtcDsKLQotCQkqcG9zKysgPSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOwotCQkqcG9zKysgPSBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApOwotCQltZW1zZXQocG9zLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKLQkJdG1wID0gY3B1X3RvX2xlMTYoY2FwKTsKLQkJbWVtY3B5KHBvcywgJnRtcCwgc2l6ZW9mKHUxNikpOwotCQlwb3MgKz0gc2l6ZW9mKHUxNik7Ci0JCSpwb3MrKyA9IHNiYW5kLT5odF9jYXAuYW1wZHVfZmFjdG9yIHwKLQkJCSAoc2JhbmQtPmh0X2NhcC5hbXBkdV9kZW5zaXR5IDw8Ci0JCQkJSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWV9TSElGVCk7Ci0JCW1lbWNweShwb3MsICZzYmFuZC0+aHRfY2FwLm1jcywgc2l6ZW9mKHNiYW5kLT5odF9jYXAubWNzKSk7Ci0JCXBvcyArPSBzaXplb2Yoc2JhbmQtPmh0X2NhcC5tY3MpOwotCQlwb3MgKz0gMiArIDQgKyAxOyAvKiBleHQgaW5mbywgQkYgY2FwLCBhbnRzZWwgKi8KLQl9CisJaWYgKHNiYW5kLT5odF9jYXAuaHRfc3VwcG9ydGVkKQorCQlwb3MgPSBpZWVlODAyMTFfaWVfYnVpbGRfaHRfY2FwKHBvcywgJnNiYW5kLT5odF9jYXAsCisJCQkJCQlzYmFuZC0+aHRfY2FwLmNhcCk7CiAKIAkvKgogCSAqIElmIGFkZGluZyBtb3JlIGhlcmUsIGFkanVzdCBjb2RlIGluIG1haW4uYwpAQCAtOTg5LDE2ICsxMTQyLDYgQEAKIAkJICovCiAJfQogI2VuZGlmCi0KLQkvKiBzZXR1cCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLwotCWRydl9zZXRfZnJhZ190aHJlc2hvbGQobG9jYWwsIGh3LT53aXBoeS0+ZnJhZ190aHJlc2hvbGQpOwotCi0JLyogc2V0dXAgUlRTIHRocmVzaG9sZCAqLwotCWRydl9zZXRfcnRzX3RocmVzaG9sZChsb2NhbCwgaHctPndpcGh5LT5ydHNfdGhyZXNob2xkKTsKLQotCS8qIHJlc2V0IGNvdmVyYWdlIGNsYXNzICovCi0JZHJ2X3NldF9jb3ZlcmFnZV9jbGFzcyhsb2NhbCwgaHctPndpcGh5LT5jb3ZlcmFnZV9jbGFzcyk7Ci0KIAkvKiBldmVyeXRoaW5nIGVsc2UgaGFwcGVucyBvbmx5IGlmIEhXIHdhcyB1cCAmIHJ1bm5pbmcgKi8KIAlpZiAoIWxvY2FsLT5vcGVuX2NvdW50KQogCQlnb3RvIHdha2VfdXA7CkBAIC0xMDE3LDYgKzExNjAsMTUgQEAKIAkJcmV0dXJuIHJlczsKIAl9CiAKKwkvKiBzZXR1cCBmcmFnbWVudGF0aW9uIHRocmVzaG9sZCAqLworCWRydl9zZXRfZnJhZ190aHJlc2hvbGQobG9jYWwsIGh3LT53aXBoeS0+ZnJhZ190aHJlc2hvbGQpOworCisJLyogc2V0dXAgUlRTIHRocmVzaG9sZCAqLworCWRydl9zZXRfcnRzX3RocmVzaG9sZChsb2NhbCwgaHctPndpcGh5LT5ydHNfdGhyZXNob2xkKTsKKworCS8qIHJlc2V0IGNvdmVyYWdlIGNsYXNzICovCisJZHJ2X3NldF9jb3ZlcmFnZV9jbGFzcyhsb2NhbCwgaHctPndpcGh5LT5jb3ZlcmFnZV9jbGFzcyk7CisKIAlpZWVlODAyMTFfbGVkX3JhZGlvKGxvY2FsLCB0cnVlKTsKIAlpZWVlODAyMTFfbW9kX3RwdF9sZWRfdHJpZyhsb2NhbCwKIAkJCQkgICBJRUVFODAyMTFfVFBUX0xFRFRSSUdfRkxfUkFESU8sIDApOwpAQCAtMTAyNiw3ICsxMTc4LDcgQEAKIAkJaWYgKHNkYXRhLT52aWYudHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOICYmCiAJCSAgICBzZGF0YS0+dmlmLnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfTU9OSVRPUiAmJgogCQkgICAgaWVlZTgwMjExX3NkYXRhX3J1bm5pbmcoc2RhdGEpKQotCQkJcmVzID0gZHJ2X2FkZF9pbnRlcmZhY2UobG9jYWwsICZzZGF0YS0+dmlmKTsKKwkJCXJlcyA9IGRydl9hZGRfaW50ZXJmYWNlKGxvY2FsLCBzZGF0YSk7CiAJfQogCiAJLyogYWRkIFNUQXMgYmFjayAqLwpAQCAtMTAzOSw3ICsxMTkxLDYgQEAKIAkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhLAogCQkJCQkgICAgIHUuYXApOwogCi0JCQltZW1zZXQoJnN0YS0+c3RhLmRydl9wcml2LCAwLCBody0+c3RhX2RhdGFfc2l6ZSk7CiAJCQlXQVJOX09OKGRydl9zdGFfYWRkKGxvY2FsLCBzZGF0YSwgJnN0YS0+c3RhKSk7CiAJCX0KIAl9CkBAIC0xMDc3LDExICsxMjI4LDEzIEBACiAJCQkgIEJTU19DSEFOR0VEX0JFQUNPTl9JTlQgfAogCQkJICBCU1NfQ0hBTkdFRF9CU1NJRCB8CiAJCQkgIEJTU19DSEFOR0VEX0NRTSB8Ci0JCQkgIEJTU19DSEFOR0VEX1FPUzsKKwkJCSAgQlNTX0NIQU5HRURfUU9TIHwKKwkJCSAgQlNTX0NIQU5HRURfSURMRTsKIAogCQlzd2l0Y2ggKHNkYXRhLT52aWYudHlwZSkgewogCQljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046Ci0JCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX0FTU09DOworCQkJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9BU1NPQyB8CisJCQkJICAgQlNTX0NIQU5HRURfQVJQX0ZJTFRFUjsKIAkJCW11dGV4X2xvY2soJnNkYXRhLT51Lm1nZC5tdHgpOwogCQkJaWVlZTgwMjExX2Jzc19pbmZvX2NoYW5nZV9ub3RpZnkoc2RhdGEsIGNoYW5nZWQpOwogCQkJbXV0ZXhfdW5sb2NrKCZzZGF0YS0+dS5tZ2QubXR4KTsKQEAgLTEwOTEsNiArMTI0NCwxMCBAQAogCQkJLyogZmFsbCB0aHJvdWdoICovCiAJCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CiAJCQljaGFuZ2VkIHw9IEJTU19DSEFOR0VEX1NTSUQ7CisKKwkJCWlmIChzZGF0YS0+dmlmLnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfQVApCisJCQkJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9BUF9QUk9CRV9SRVNQOworCiAJCQkvKiBmYWxsIHRocm91Z2ggKi8KIAkJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOgogCQkJY2hhbmdlZCB8PSBCU1NfQ0hBTkdFRF9CRUFDT04gfApAQCAtMTExMiw2ICsxMjY5LDggQEAKIAkJfQogCX0KIAorCWllZWU4MDIxMV9yZWNhbGNfcHMobG9jYWwsIC0xKTsKKwogCS8qCiAJICogQ2xlYXIgdGhlIFdMQU5fU1RBX0JMT0NLX0JBIGZsYWcgc28gbmV3IGFnZ3JlZ2F0aW9uCiAJICogc2Vzc2lvbnMgY2FuIGJlIGVzdGFibGlzaGVkIGFmdGVyIGEgcmVzdW1lLgpAQCAtMTM2Nyw2ICsxNTI2LDEwOCBAQAogfQogRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfZGlzYWJsZV9yc3NpX3JlcG9ydHMpOwogCit1OCAqaWVlZTgwMjExX2llX2J1aWxkX2h0X2NhcCh1OCAqcG9zLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCwKKwkJCSAgICAgIHUxNiBjYXApCit7CisJX19sZTE2IHRtcDsKKworCSpwb3MrKyA9IFdMQU5fRUlEX0hUX0NBUEFCSUxJVFk7CisJKnBvcysrID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKTsKKwltZW1zZXQocG9zLCAwLCBzaXplb2Yoc3RydWN0IGllZWU4MDIxMV9odF9jYXApKTsKKworCS8qIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKwl0bXAgPSBjcHVfdG9fbGUxNihjYXApOworCW1lbWNweShwb3MsICZ0bXAsIHNpemVvZih1MTYpKTsKKwlwb3MgKz0gc2l6ZW9mKHUxNik7CisKKwkvKiBBTVBEVSBwYXJhbWV0ZXJzICovCisJKnBvcysrID0gaHRfY2FwLT5hbXBkdV9mYWN0b3IgfAorCQkgKGh0X2NhcC0+YW1wZHVfZGVuc2l0eSA8PAorCQkJSUVFRTgwMjExX0hUX0FNUERVX1BBUk1fREVOU0lUWV9TSElGVCk7CisKKwkvKiBNQ1Mgc2V0ICovCisJbWVtY3B5KHBvcywgJmh0X2NhcC0+bWNzLCBzaXplb2YoaHRfY2FwLT5tY3MpKTsKKwlwb3MgKz0gc2l6ZW9mKGh0X2NhcC0+bWNzKTsKKworCS8qIGV4dGVuZGVkIGNhcGFiaWxpdGllcyAqLworCXBvcyArPSBzaXplb2YoX19sZTE2KTsKKworCS8qIEJGIGNhcGFiaWxpdGllcyAqLworCXBvcyArPSBzaXplb2YoX19sZTMyKTsKKworCS8qIGFudGVubmEgc2VsZWN0aW9uICovCisJcG9zICs9IHNpemVvZih1OCk7CisKKwlyZXR1cm4gcG9zOworfQorCit1OCAqaWVlZTgwMjExX2llX2J1aWxkX2h0X2luZm8odTggKnBvcywKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YV9odF9jYXAgKmh0X2NhcCwKKwkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCisJCQkgICAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUpCit7CisJc3RydWN0IGllZWU4MDIxMV9odF9pbmZvICpodF9pbmZvOworCS8qIEJ1aWxkIEhUIEluZm9ybWF0aW9uICovCisJKnBvcysrID0gV0xBTl9FSURfSFRfSU5GT1JNQVRJT047CisJKnBvcysrID0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyk7CisJaHRfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKilwb3M7CisJaHRfaW5mby0+Y29udHJvbF9jaGFuID0KKwkJCWllZWU4MDIxMV9mcmVxdWVuY3lfdG9fY2hhbm5lbChjaGFubmVsLT5jZW50ZXJfZnJlcSk7CisJc3dpdGNoIChjaGFubmVsX3R5cGUpIHsKKwljYXNlIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVM6CisJCWh0X2luZm8tPmh0X3BhcmFtID0gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQkVMT1c7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9DSEFOX0hUNDBQTFVTOgorCQlodF9pbmZvLT5odF9wYXJhbSA9IElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0FCT1ZFOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfQ0hBTl9IVDIwOgorCWRlZmF1bHQ6CisJCWh0X2luZm8tPmh0X3BhcmFtID0gSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfTk9ORTsKKwkJYnJlYWs7CisJfQorCWlmIChodF9jYXAtPmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfU1VQX1dJRFRIXzIwXzQwKQorCQlodF9pbmZvLT5odF9wYXJhbSB8PSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBTl9XSURUSF9BTlk7CisKKwkvKgorCSAqIE5vdGU6IEFjY29yZGluZyB0byA4MDIuMTFuLTIwMDkgOS4xMy4zLjEsIEhUIFByb3RlY3Rpb24gZmllbGQgYW5kCisJICogUklGUyBNb2RlIGFyZSByZXNlcnZlZCBpbiBJQlNTIG1vZGUsIHRoZXJlZm9yZSBrZWVwIHRoZW0gYXQgMAorCSAqLworCWh0X2luZm8tPm9wZXJhdGlvbl9tb2RlID0gMHgwMDAwOworCWh0X2luZm8tPnN0YmNfcGFyYW0gPSAweDAwMDA7CisKKwkvKiBJdCBzZWVtcyB0aGF0IEJhc2ljIE1DUyBzZXQgYW5kIFN1cHBvcnRlZCBNQ1Mgc2V0CisJICAgYXJlIGlkZW50aWNhbCBmb3IgdGhlIGZpcnN0IDEwIGJ5dGVzICovCisJbWVtc2V0KCZodF9pbmZvLT5iYXNpY19zZXQsIDAsIDE2KTsKKwltZW1jcHkoJmh0X2luZm8tPmJhc2ljX3NldCwgJmh0X2NhcC0+bWNzLCAxMCk7CisKKwlyZXR1cm4gcG9zICsgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyk7Cit9CisKK2VudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUKK2llZWU4MDIxMV9odF9pbmZvX3RvX2NoYW5uZWxfdHlwZShzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKmh0X2luZm8pCit7CisJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGU7CisKKwlpZiAoIWh0X2luZm8pCisJCXJldHVybiBOTDgwMjExX0NIQU5fTk9fSFQ7CisKKwlzd2l0Y2ggKGh0X2luZm8tPmh0X3BhcmFtICYgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfT0ZGU0VUKSB7CisJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19OT05FOgorCQljaGFubmVsX3R5cGUgPSBOTDgwMjExX0NIQU5fSFQyMDsKKwkJYnJlYWs7CisJY2FzZSBJRUVFODAyMTFfSFRfUEFSQU1fQ0hBX1NFQ19BQk9WRToKKwkJY2hhbm5lbF90eXBlID0gTkw4MDIxMV9DSEFOX0hUNDBQTFVTOworCQlicmVhazsKKwljYXNlIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX0JFTE9XOgorCQljaGFubmVsX3R5cGUgPSBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljaGFubmVsX3R5cGUgPSBOTDgwMjExX0NIQU5fTk9fSFQ7CisJfQorCisJcmV0dXJuIGNoYW5uZWxfdHlwZTsKK30KKwogaW50IGllZWU4MDIxMV9hZGRfc3JhdGVzX2llKHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEgPSB2aWZfdG9fc2RhdGEodmlmKTsKZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS93ZXAuYyBiL25ldC9tYWM4MDIxMS93ZXAuYwppbmRleCBhMWM2YmZkLi42OGFkMzUxIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvd2VwLmMKKysrIGIvbmV0L21hYzgwMjExL3dlcC5jCkBAIC0zMzAsMTMgKzMzMCwxMiBAQAogCiAJaWVlZTgwMjExX3R4X3NldF9wcm90ZWN0ZWQodHgpOwogCi0Jc2tiID0gdHgtPnNrYjsKLQlkbyB7CisJc2tiX3F1ZXVlX3dhbGsoJnR4LT5za2JzLCBza2IpIHsKIAkJaWYgKHdlcF9lbmNyeXB0X3NrYih0eCwgc2tiKSA8IDApIHsKIAkJCUk4MDJfREVCVUdfSU5DKHR4LT5sb2NhbC0+dHhfaGFuZGxlcnNfZHJvcF93ZXApOwogCQkJcmV0dXJuIFRYX0RST1A7CiAJCX0KLQl9IHdoaWxlICgoc2tiID0gc2tiLT5uZXh0KSk7CisJfQogCiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dtZS5jIGIvbmV0L21hYzgwMjExL3dtZS5jCmluZGV4IGZkNTJlNjkuLjg5NTExYmUgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93bWUuYworKysgYi9uZXQvbWFjODAyMTEvd21lLmMKQEAgLTUyLDYgKzUyLDMwIEBACiAJfQogfQogCisvKiBJbmRpY2F0ZSB3aGljaCBxdWV1ZSB0byB1c2UgZm9yIHRoaXMgZnVsbHkgZm9ybWVkIDgwMi4xMSBmcmFtZSAqLwordTE2IGllZWU4MDIxMV9zZWxlY3RfcXVldWVfODAyMTEoc3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwsCisJCQkJIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfaGRyICpoZHIpCit7CisJdTggKnA7CisKKwlpZiAobG9jYWwtPmh3LnF1ZXVlcyA8IDQpCisJCXJldHVybiAwOworCisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YShoZHItPmZyYW1lX2NvbnRyb2wpKSB7CisJCXNrYi0+cHJpb3JpdHkgPSA3OworCQlyZXR1cm4gaWVlZTgwMl8xZF90b19hY1tza2ItPnByaW9yaXR5XTsKKwl9CisJaWYgKCFpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkgeworCQlza2ItPnByaW9yaXR5ID0gMDsKKwkJcmV0dXJuIGllZWU4MDJfMWRfdG9fYWNbc2tiLT5wcmlvcml0eV07CisJfQorCisJcCA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOworCXNrYi0+cHJpb3JpdHkgPSAqcCAmIElFRUU4MDIxMV9RT1NfQ1RMX1RBRzFEX01BU0s7CisKKwlyZXR1cm4gaWVlZTgwMjExX2Rvd25ncmFkZV9xdWV1ZShsb2NhbCwgc2tiKTsKK30KIAogLyogSW5kaWNhdGUgd2hpY2ggcXVldWUgdG8gdXNlLiAqLwogdTE2IGllZWU4MDIxMV9zZWxlY3RfcXVldWUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCkBAIC04Myw3ICsxMDcsNyBAQAogCQlicmVhazsKICNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSAogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKLQkJcmEgPSBza2ItPmRhdGE7CisJCXFvcyA9IHRydWU7CiAJCWJyZWFrOwogI2VuZGlmCiAJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgpAQCAtMTM5LDE2ICsxNjMsMjQgQEAKIAkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkciA9ICh2b2lkICopc2tiLT5kYXRhOworCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsKIAogCS8qIEZpbGwgaW4gdGhlIFFvUyBoZWFkZXIgaWYgdGhlcmUgaXMgb25lLiAqLwogCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3MoaGRyLT5mcmFtZV9jb250cm9sKSkgewogCQl1OCAqcCA9IGllZWU4MDIxMV9nZXRfcW9zX2N0bChoZHIpOwotCQl1OCBhY2tfcG9saWN5ID0gMCwgdGlkOworCQl1OCBhY2tfcG9saWN5LCB0aWQ7CiAKIAkJdGlkID0gc2tiLT5wcmlvcml0eSAmIElFRUU4MDIxMV9RT1NfQ1RMX1RBRzFEX01BU0s7CiAKLQkJaWYgKHVubGlrZWx5KHNkYXRhLT5sb2NhbC0+d2lmaV93bWVfbm9hY2tfdGVzdCkpCisJCS8qIHByZXNlcnZlIEVPU1AgYml0ICovCisJCWFja19wb2xpY3kgPSAqcCAmIElFRUU4MDIxMV9RT1NfQ1RMX0VPU1A7CisKKwkJaWYgKGlzX211bHRpY2FzdF9ldGhlcl9hZGRyKGhkci0+YWRkcjEpIHx8CisJCSAgICBzZGF0YS0+bm9hY2tfbWFwICYgQklUKHRpZCkpIHsKIAkJCWFja19wb2xpY3kgfD0gSUVFRTgwMjExX1FPU19DVExfQUNLX1BPTElDWV9OT0FDSzsKKwkJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9UWF9DVExfTk9fQUNLOworCQl9CisKIAkJLyogcW9zIGhlYWRlciBpcyAyIGJ5dGVzICovCiAJCSpwKysgPSBhY2tfcG9saWN5IHwgdGlkOwogCQkqcCA9IGllZWU4MDIxMV92aWZfaXNfbWVzaCgmc2RhdGEtPnZpZikgPwpkaWZmIC0tZ2l0IGEvbmV0L21hYzgwMjExL3dtZS5oIGIvbmV0L21hYzgwMjExL3dtZS5oCmluZGV4IDM0ZTE2NmYuLjk0ZWRjZWIgMTAwNjQ0Ci0tLSBhL25ldC9tYWM4MDIxMS93bWUuaAorKysgYi9uZXQvbWFjODAyMTEvd21lLmgKQEAgLTE1LDYgKzE1LDkgQEAKIAogZXh0ZXJuIGNvbnN0IGludCBpZWVlODAyXzFkX3RvX2FjWzhdOwogCit1MTYgaWVlZTgwMjExX3NlbGVjdF9xdWV1ZV84MDIxMShzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCwKKwkJCQkgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgc3RydWN0IGllZWU4MDIxMV9oZHIgKmhkcik7CiB1MTYgaWVlZTgwMjExX3NlbGVjdF9xdWV1ZShzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKIAkJCSAgIHN0cnVjdCBza19idWZmICpza2IpOwogdm9pZCBpZWVlODAyMTFfc2V0X3Fvc19oZHIoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd29yay5jIGIvbmV0L21hYzgwMjExL3dvcmsuYwppbmRleCA2YzUzYjZkLi5jNmRkMDFhIDEwMDY0NAotLS0gYS9uZXQvbWFjODAyMTEvd29yay5jCisrKyBiL25ldC9tYWM4MDIxMS93b3JrLmMKQEAgLTk0LDcgKzk0LDggQEAKIAogLyogZnJhbWUgc2VuZGluZyBmdW5jdGlvbnMgKi8KIAotc3RhdGljIHZvaWQgaWVlZTgwMjExX2FkZF9odF9pZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCB1OCAqaHRfaW5mb19pZSwKK3N0YXRpYyB2b2lkIGllZWU4MDIxMV9hZGRfaHRfaWUoc3RydWN0IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2RhdGEsCisJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3QgdTggKmh0X2luZm9faWUsCiAJCQkJc3RydWN0IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqc2JhbmQsCiAJCQkJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsLAogCQkJCWVudW0gaWVlZTgwMjExX3NtcHNfbW9kZSBzbXBzKQpAQCAtMTAyLDggKzEwMywxMCBAQAogCXN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbyAqaHRfaW5mbzsKIAl1OCAqcG9zOwogCXUzMiBmbGFncyA9IGNoYW5uZWwtPmZsYWdzOwotCXUxNiBjYXAgPSBzYmFuZC0+aHRfY2FwLmNhcDsKLQlfX2xlMTYgdG1wOworCXUxNiBjYXA7CisJc3RydWN0IGllZWU4MDIxMV9zdGFfaHRfY2FwIGh0X2NhcDsKKworCUJVSUxEX0JVR19PTihzaXplb2YoaHRfY2FwKSAhPSBzaXplb2Yoc2JhbmQtPmh0X2NhcCkpOwogCiAJaWYgKCFzYmFuZC0+aHRfY2FwLmh0X3N1cHBvcnRlZCkKIAkJcmV0dXJuOwpAQCAtMTE0LDkgKzExNywxMyBAQAogCWlmIChodF9pbmZvX2llWzFdIDwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpCiAJCXJldHVybjsKIAorCW1lbWNweSgmaHRfY2FwLCAmc2JhbmQtPmh0X2NhcCwgc2l6ZW9mKGh0X2NhcCkpOworCWllZWU4MDIxMV9hcHBseV9odGNhcF9vdmVycmlkZXMoc2RhdGEsICZodF9jYXApOworCiAJaHRfaW5mbyA9IChzdHJ1Y3QgaWVlZTgwMjExX2h0X2luZm8gKikoaHRfaW5mb19pZSArIDIpOwogCiAJLyogZGV0ZXJtaW5lIGNhcGFiaWxpdHkgZmxhZ3MgKi8KKwljYXAgPSBodF9jYXAuY2FwOwogCiAJc3dpdGNoIChodF9pbmZvLT5odF9wYXJhbSAmIElFRUU4MDIxMV9IVF9QQVJBTV9DSEFfU0VDX09GRlNFVCkgewogCWNhc2UgSUVFRTgwMjExX0hUX1BBUkFNX0NIQV9TRUNfQUJPVkU6CkBAIC0xNTQsMzQgKzE2MSw4IEBACiAJfQogCiAJLyogcmVzZXJ2ZSBhbmQgZmlsbCBJRSAqLwotCiAJcG9zID0gc2tiX3B1dChza2IsIHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCkgKyAyKTsKLQkqcG9zKysgPSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOwotCSpwb3MrKyA9IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCk7Ci0JbWVtc2V0KHBvcywgMCwgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSk7Ci0KLQkvKiBjYXBhYmlsaXR5IGZsYWdzICovCi0JdG1wID0gY3B1X3RvX2xlMTYoY2FwKTsKLQltZW1jcHkocG9zLCAmdG1wLCBzaXplb2YodTE2KSk7Ci0JcG9zICs9IHNpemVvZih1MTYpOwotCi0JLyogQU1QRFUgcGFyYW1ldGVycyAqLwotCSpwb3MrKyA9IHNiYW5kLT5odF9jYXAuYW1wZHVfZmFjdG9yIHwKLQkJIChzYmFuZC0+aHRfY2FwLmFtcGR1X2RlbnNpdHkgPDwKLQkJCUlFRUU4MDIxMV9IVF9BTVBEVV9QQVJNX0RFTlNJVFlfU0hJRlQpOwotCi0JLyogTUNTIHNldCAqLwotCW1lbWNweShwb3MsICZzYmFuZC0+aHRfY2FwLm1jcywgc2l6ZW9mKHNiYW5kLT5odF9jYXAubWNzKSk7Ci0JcG9zICs9IHNpemVvZihzYmFuZC0+aHRfY2FwLm1jcyk7Ci0KLQkvKiBleHRlbmRlZCBjYXBhYmlsaXRpZXMgKi8KLQlwb3MgKz0gc2l6ZW9mKF9fbGUxNik7Ci0KLQkvKiBCRiBjYXBhYmlsaXRpZXMgKi8KLQlwb3MgKz0gc2l6ZW9mKF9fbGUzMik7Ci0KLQkvKiBhbnRlbm5hIHNlbGVjdGlvbiAqLwotCXBvcyArPSBzaXplb2YodTgpOworCWllZWU4MDIxMV9pZV9idWlsZF9odF9jYXAocG9zLCAmaHRfY2FwLCBjYXApOwogfQogCiBzdGF0aWMgdm9pZCBpZWVlODAyMTFfc2VuZF9hc3NvYyhzdHJ1Y3QgaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKQEAgLTM1Niw3ICszMzcsNyBAQAogCiAJaWYgKHdrLT5hc3NvYy51c2VfMTFuICYmIHdrLT5hc3NvYy53bW1fdXNlZCAmJgogCSAgICBsb2NhbC0+aHcucXVldWVzID49IDQpCi0JCWllZWU4MDIxMV9hZGRfaHRfaWUoc2tiLCB3ay0+YXNzb2MuaHRfaW5mb3JtYXRpb25faWUsCisJCWllZWU4MDIxMV9hZGRfaHRfaWUoc2RhdGEsIHNrYiwgd2stPmFzc29jLmh0X2luZm9ybWF0aW9uX2llLAogCQkJCSAgICBzYmFuZCwgd2stPmNoYW4sIHdrLT5hc3NvYy5zbXBzKTsKIAogCS8qIGlmIHByZXNlbnQsIGFkZCBhbnkgY3VzdG9tIG5vbi12ZW5kb3IgSUVzIHRoYXQgZ28gYWZ0ZXIgSFQgKi8KQEAgLTg4MSw0NCArODYyLDYgQEAKIAlrZnJlZV9za2Ioc2tiKTsKIH0KIAotc3RhdGljIGJvb2wgaWVlZTgwMjExX3dvcmtfY3RfY29leGlzdHMoZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSB3a19jdCwKLQkJCQkgICAgICAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBvcGVyX2N0KQotewotCXN3aXRjaCAod2tfY3QpIHsKLQljYXNlIE5MODAyMTFfQ0hBTl9OT19IVDoKLQkJcmV0dXJuIHRydWU7Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQyMDoKLQkJaWYgKG9wZXJfY3QgIT0gTkw4MDIxMV9DSEFOX05PX0hUKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQljYXNlIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVM6Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQ0MFBMVVM6Ci0JCXJldHVybiAod2tfY3QgPT0gb3Blcl9jdCk7Ci0JfQotCVdBUk5fT04oMSk7IC8qIHNob3VsZG4ndCBnZXQgaGVyZSAqLwotCXJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUKLWllZWU4MDIxMV9jYWxjX2N0KGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgd2tfY3QsCi0JCSAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBvcGVyX2N0KQotewotCXN3aXRjaCAod2tfY3QpIHsKLQljYXNlIE5MODAyMTFfQ0hBTl9OT19IVDoKLQkJcmV0dXJuIG9wZXJfY3Q7Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQyMDoKLQkJaWYgKG9wZXJfY3QgIT0gTkw4MDIxMV9DSEFOX05PX0hUKQotCQkJcmV0dXJuIG9wZXJfY3Q7Ci0JCXJldHVybiB3a19jdDsKLQljYXNlIE5MODAyMTFfQ0hBTl9IVDQwTUlOVVM6Ci0JY2FzZSBOTDgwMjExX0NIQU5fSFQ0MFBMVVM6Ci0JCXJldHVybiB3a19jdDsKLQl9Ci0JV0FSTl9PTigxKTsgLyogc2hvdWxkbid0IGdldCBoZXJlICovCi0JcmV0dXJuIHdrX2N0OwotfQotCi0KIHN0YXRpYyB2b2lkIGllZWU4MDIxMV93b3JrX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKIHsKIAlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICpsb2NhbCA9ICh2b2lkICopIGRhdGE7CkBAIC05NjksNTEgKzkxMiwxMiBAQAogCQl9CiAKIAkJaWYgKCFzdGFydGVkICYmICFsb2NhbC0+dG1wX2NoYW5uZWwpIHsKLQkJCWJvb2wgb25fb3Blcl9jaGFuOwotCQkJYm9vbCB0bXBfY2hhbl9jaGFuZ2VkID0gZmFsc2U7Ci0JCQlib29sIG9uX29wZXJfY2hhbjI7Ci0JCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIHdrX2N0OwotCQkJb25fb3Blcl9jaGFuID0gaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwobG9jYWwpOwotCi0JCQkvKiBXb3JrIHdpdGggZXhpc3RpbmcgY2hhbm5lbCB0eXBlIGlmIHBvc3NpYmxlLiAqLwotCQkJd2tfY3QgPSB3ay0+Y2hhbl90eXBlOwotCQkJaWYgKHdrLT5jaGFuID09IGxvY2FsLT5ody5jb25mLmNoYW5uZWwpCi0JCQkJd2tfY3QgPSBpZWVlODAyMTFfY2FsY19jdCh3ay0+Y2hhbl90eXBlLAotCQkJCQkJbG9jYWwtPmh3LmNvbmYuY2hhbm5lbF90eXBlKTsKLQotCQkJaWYgKGxvY2FsLT50bXBfY2hhbm5lbCkKLQkJCQlpZiAoKGxvY2FsLT50bXBfY2hhbm5lbCAhPSB3ay0+Y2hhbikgfHwKLQkJCQkgICAgKGxvY2FsLT50bXBfY2hhbm5lbF90eXBlICE9IHdrX2N0KSkKLQkJCQkJdG1wX2NoYW5fY2hhbmdlZCA9IHRydWU7CisJCQlpZWVlODAyMTFfb2ZmY2hhbm5lbF9zdG9wX3ZpZnMobG9jYWwsIHRydWUpOwogCiAJCQlsb2NhbC0+dG1wX2NoYW5uZWwgPSB3ay0+Y2hhbjsKLQkJCWxvY2FsLT50bXBfY2hhbm5lbF90eXBlID0gd2tfY3Q7Ci0JCQkvKgotCQkJICogTGVhdmUgdGhlIHN0YXRpb24gdmlmcyBpbiBhd2FrZSBtb2RlIGlmIHRoZXkKLQkJCSAqIGhhcHBlbiB0byBiZSBvbiB0aGUgc2FtZSBjaGFubmVsIGFzCi0JCQkgKiB0aGUgcmVxdWVzdGVkIGNoYW5uZWwuCi0JCQkgKi8KLQkJCW9uX29wZXJfY2hhbjIgPSBpZWVlODAyMTFfY2ZnX29uX29wZXJfY2hhbm5lbChsb2NhbCk7Ci0JCQlpZiAob25fb3Blcl9jaGFuICE9IG9uX29wZXJfY2hhbjIpIHsKLQkJCQlpZiAob25fb3Blcl9jaGFuMikgewotCQkJCQkvKiBnb2luZyBvZmYgb3BlciBjaGFubmVsLCBQUyB0b28gKi8KLQkJCQkJaWVlZTgwMjExX29mZmNoYW5uZWxfc3RvcF92aWZzKGxvY2FsLAotCQkJCQkJCQkgICAgICAgdHJ1ZSk7Ci0JCQkJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8qIGdvaW5nIG9uIGNoYW5uZWwsIGJ1dCBsZWF2ZSBQUwotCQkJCQkgKiBvZmYtY2hhbm5lbC4gKi8KLQkJCQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7Ci0JCQkJCWllZWU4MDIxMV9vZmZjaGFubmVsX3JldHVybihsb2NhbCwKLQkJCQkJCQkJICAgIHRydWUsCi0JCQkJCQkJCSAgICBmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmICh0bXBfY2hhbl9jaGFuZ2VkKQotCQkJCS8qIFN0aWxsIG9mZi1jaGFubmVsLCBidXQgb24gc29tZSBvdGhlcgotCQkJCSAqIGNoYW5uZWwsIHNvIHVwZGF0ZSBoYXJkd2FyZS4KLQkJCQkgKiBQUyBzaG91bGQgYWxyZWFkeSBiZSBvZmYtY2hhbm5lbC4KLQkJCQkgKi8KLQkJCQlpZWVlODAyMTFfaHdfY29uZmlnKGxvY2FsLCAwKTsKKwkJCWxvY2FsLT50bXBfY2hhbm5lbF90eXBlID0gd2stPmNoYW5fdHlwZTsKKworCQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7CiAKIAkJCXN0YXJ0ZWQgPSB0cnVlOwogCQkJd2stPnRpbWVvdXQgPSBqaWZmaWVzOwpAQCAtMTA4MiwzNCArOTg2LDE3IEBACiAJbGlzdF9mb3JfZWFjaF9lbnRyeSh3aywgJmxvY2FsLT53b3JrX2xpc3QsIGxpc3QpIHsKIAkJaWYgKCF3ay0+c3RhcnRlZCkKIAkJCWNvbnRpbnVlOwotCQlpZiAod2stPmNoYW4gIT0gbG9jYWwtPnRtcF9jaGFubmVsKQotCQkJY29udGludWU7Ci0JCWlmICghaWVlZTgwMjExX3dvcmtfY3RfY29leGlzdHMod2stPmNoYW5fdHlwZSwKLQkJCQkJCWxvY2FsLT50bXBfY2hhbm5lbF90eXBlKSkKKwkJaWYgKHdrLT5jaGFuICE9IGxvY2FsLT50bXBfY2hhbm5lbCB8fAorCQkgICAgd2stPmNoYW5fdHlwZSAhPSBsb2NhbC0+dG1wX2NoYW5uZWxfdHlwZSkKIAkJCWNvbnRpbnVlOwogCQlyZW1haW5fb2ZmX2NoYW5uZWwgPSB0cnVlOwogCX0KIAogCWlmICghcmVtYWluX29mZl9jaGFubmVsICYmIGxvY2FsLT50bXBfY2hhbm5lbCkgewogCQlsb2NhbC0+dG1wX2NoYW5uZWwgPSBOVUxMOwotCQkvKiBJZiB0bXBfY2hhbm5lbCB3YXNuJ3Qgb3BlcmF0aW5nIGNoYW5uZWwsIHRoZW4KLQkJICogd2UgbmVlZCB0byBnbyBiYWNrIG9uLWNoYW5uZWwuCi0JCSAqIE5PVEU6ICBJZiB3ZSBjYW4gZXZlciBiZSBoZXJlIHdoaWxlIHNjYW5ubmluZywKLQkJICogb3IgaWYgdGhlIGh3X2NvbmZpZygpIGNoYW5uZWwgY29uZmlnIGxvZ2ljIGNoYW5nZXMsCi0JCSAqIHRoZW4gd2UgbWF5IG5lZWQgdG8gZG8gYSBtb3JlIHRob3JvdWdoIGNoZWNrIHRvIHNlZSBpZgotCQkgKiB3ZSBzdGlsbCBuZWVkIHRvIGRvIGEgaGFyZHdhcmUgY29uZmlnLiAgQ3VycmVudGx5LAotCQkgKiB3ZSBjYW5ub3QgYmUgaGVyZSB3aGlsZSBzY2FubmluZywgaG93ZXZlci4KLQkJICovCi0JCWlmICghaWVlZTgwMjExX2NmZ19vbl9vcGVyX2NoYW5uZWwobG9jYWwpKQotCQkJaWVlZTgwMjExX2h3X2NvbmZpZyhsb2NhbCwgMCk7CisJCWllZWU4MDIxMV9od19jb25maWcobG9jYWwsIDApOwogCi0JCS8qIEF0IHRoZSBsZWFzdCwgd2UgbmVlZCB0byBkaXNhYmxlIG9mZmNoYW5uZWxfcHMsCi0JCSAqIHNvIGp1c3QgZ28gYWhlYWQgYW5kIHJ1biB0aGUgZW50aXJlIG9mZmNoYW5uZWwKLQkJICogcmV0dXJuIGxvZ2ljIGhlcmUuICBXZSAqY291bGQqIHNraXAgZW5hYmxpbmcKLQkJICogYmVhY29uaW5nIGlmIHdlIHdlcmUgYWxyZWFkeSBvbi1vcGVyLWNoYW5uZWwKLQkJICogYXMgYSBmdXR1cmUgb3B0aW1pemF0aW9uLgotCQkgKi8KLQkJaWVlZTgwMjExX29mZmNoYW5uZWxfcmV0dXJuKGxvY2FsLCB0cnVlLCB0cnVlKTsKKwkJaWVlZTgwMjExX29mZmNoYW5uZWxfcmV0dXJuKGxvY2FsLCB0cnVlKTsKIAogCQkvKiBnaXZlIGNvbm5lY3Rpb24gc29tZSB0aW1lIHRvIGJyZWF0aGUgKi8KIAkJcnVuX2FnYWluKGxvY2FsLCBqaWZmaWVzICsgSFovMik7CmRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvd3BhLmMgYi9uZXQvbWFjODAyMTEvd3BhLmMKaW5kZXggZjYxNGNlNy4uOTNhYWIwNyAxMDA2NDQKLS0tIGEvbmV0L21hYzgwMjExL3dwYS5jCisrKyBiL25ldC9tYWM4MDIxMS93cGEuYwpAQCAtMjIzLDE0ICsyMjMsMTQgQEAKIGllZWU4MDIxMV90eF9yZXN1bHQKIGllZWU4MDIxMV9jcnlwdG9fdGtpcF9lbmNyeXB0KHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4LT5za2I7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAogCWllZWU4MDIxMV90eF9zZXRfcHJvdGVjdGVkKHR4KTsKIAotCWRvIHsKKwlza2JfcXVldWVfd2FsaygmdHgtPnNrYnMsIHNrYikgewogCQlpZiAodGtpcF9lbmNyeXB0X3NrYih0eCwgc2tiKSA8IDApCiAJCQlyZXR1cm4gVFhfRFJPUDsKLQl9IHdoaWxlICgoc2tiID0gc2tiLT5uZXh0KSk7CisJfQogCiAJcmV0dXJuIFRYX0NPTlRJTlVFOwogfQpAQCAtMzkwLDcgKzM5MCw4IEBACiAJdTggc2NyYXRjaFs2ICogQUVTX0JMT0NLX1NJWkVdOwogCiAJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5ICYmCi0JICAgICEoaW5mby0+Y29udHJvbC5od19rZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX0dFTkVSQVRFX0lWKSkgeworCSAgICAhKGluZm8tPmNvbnRyb2wuaHdfa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19HRU5FUkFURV9JVikgJiYKKwkgICAgIShpbmZvLT5jb250cm9sLmh3X2tleS0+ZmxhZ3MgJiBJRUVFODAyMTFfS0VZX0ZMQUdfUFVUX0lWX1NQQUNFKSkgewogCQkvKgogCQkgKiBod2FjY2VsIGhhcyBubyBuZWVkIGZvciBwcmVhbGxvY2F0ZWQgcm9vbSBmb3IgQ0NNUAogCQkgKiBoZWFkZXIgb3IgTUlDIGZpZWxkcwpAQCAtNDEyLDYgKzQxMywxMiBAQAogCiAJcG9zID0gc2tiX3B1c2goc2tiLCBDQ01QX0hEUl9MRU4pOwogCW1lbW1vdmUocG9zLCBwb3MgKyBDQ01QX0hEUl9MRU4sIGhkcmxlbik7CisKKwkvKiB0aGUgSFcgb25seSBuZWVkcyByb29tIGZvciB0aGUgSVYsIGJ1dCBub3QgdGhlIGFjdHVhbCBJViAqLworCWlmIChpbmZvLT5jb250cm9sLmh3X2tleSAmJgorCSAgICAoaW5mby0+Y29udHJvbC5od19rZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BVVF9JVl9TUEFDRSkpCisJCXJldHVybiAwOworCiAJaGRyID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopIHBvczsKIAlwb3MgKz0gaGRybGVuOwogCkBAIC00NDIsMTQgKzQ0OSwxNCBAQAogaWVlZTgwMjExX3R4X3Jlc3VsdAogaWVlZTgwMjExX2NyeXB0b19jY21wX2VuY3J5cHQoc3RydWN0IGllZWU4MDIxMV90eF9kYXRhICp0eCkKIHsKLQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiID0gdHgtPnNrYjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCiAJaWVlZTgwMjExX3R4X3NldF9wcm90ZWN0ZWQodHgpOwogCi0JZG8geworCXNrYl9xdWV1ZV93YWxrKCZ0eC0+c2ticywgc2tiKSB7CiAJCWlmIChjY21wX2VuY3J5cHRfc2tiKHR4LCBza2IpIDwgMCkKIAkJCXJldHVybiBUWF9EUk9QOwotCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKwl9CiAKIAlyZXR1cm4gVFhfQ09OVElOVUU7CiB9CkBAIC01NDcsMTUgKzU1NCwyMiBAQAogaWVlZTgwMjExX3R4X3Jlc3VsdAogaWVlZTgwMjExX2NyeXB0b19hZXNfY21hY19lbmNyeXB0KHN0cnVjdCBpZWVlODAyMTFfdHhfZGF0YSAqdHgpCiB7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYiA9IHR4LT5za2I7Ci0Jc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOwogCXN0cnVjdCBpZWVlODAyMTFfa2V5ICprZXkgPSB0eC0+a2V5OwogCXN0cnVjdCBpZWVlODAyMTFfbW1pZSAqbW1pZTsKIAl1OCBhYWRbMjBdOwogCXU2NCBwbjY0OwogCisJaWYgKFdBUk5fT04oc2tiX3F1ZXVlX2xlbigmdHgtPnNrYnMpICE9IDEpKQorCQlyZXR1cm4gVFhfRFJPUDsKKworCXNrYiA9IHNrYl9wZWVrKCZ0eC0+c2ticyk7CisKKwlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihza2IpOworCiAJaWYgKGluZm8tPmNvbnRyb2wuaHdfa2V5KQotCQlyZXR1cm4gMDsKKwkJcmV0dXJuIFRYX0NPTlRJTlVFOwogCiAJaWYgKFdBUk5fT04oc2tiX3RhaWxyb29tKHNrYikgPCBzaXplb2YoKm1taWUpKSkKIAkJcmV0dXJuIFRYX0RST1A7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL0tjb25maWcgYi9uZXQvbmV0ZmlsdGVyL0tjb25maWcKaW5kZXggODI2MGIxMy4uZjhhYzRlZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9LY29uZmlnCisrKyBiL25ldC9uZXRmaWx0ZXIvS2NvbmZpZwpAQCAtNCw2ICs0LDE0IEBACiBjb25maWcgTkVURklMVEVSX05FVExJTksKIAl0cmlzdGF0ZQogCitjb25maWcgTkVURklMVEVSX05FVExJTktfQUNDVAordHJpc3RhdGUgIk5ldGZpbHRlciBORkFDQ1Qgb3ZlciBORk5FVExJTksgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECisJc2VsZWN0IE5FVEZJTFRFUl9ORVRMSU5LCisJaGVscAorCSAgSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgdGhlIGtlcm5lbCB3aWxsIGluY2x1ZGUgc3VwcG9ydAorCSAgZm9yIGV4dGVuZGVkIGFjY291bnRpbmcgdmlhIE5GTkVUTElOSy4KKwogY29uZmlnIE5FVEZJTFRFUl9ORVRMSU5LX1FVRVVFCiAJdHJpc3RhdGUgIk5ldGZpbHRlciBORlFVRVVFIG92ZXIgTkZORVRMSU5LIGludGVyZmFjZSIKIAlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRApAQCAtNzUsNiArODMsMTYgQEAKIAogCSAgSWYgdW5zdXJlLCBzYXkgYE4nLgogCitjb25maWcgTkZfQ09OTlRSQUNLX1BST0NGUworCWJvb2wgIlN1cHBseSBDVCBsaXN0IGluIHByb2NmcyAoT0JTT0xFVEUpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUFJPQ19GUworCS0tLWhlbHAtLS0KKwlUaGlzIG9wdGlvbiBlbmFibGVzIGZvciB0aGUgbGlzdCBvZiBrbm93biBjb25udHJhY2sgZW50cmllcworCXRvIGJlIHNob3duIGluIHByb2NmcyB1bmRlciBuZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFjay4gVGhpcworCWlzIGNvbnNpZGVyZWQgb2Jzb2xldGUgaW4gZmF2b3Igb2YgdXNpbmcgdGhlIGNvbm50cmFjayg4KQorCXRvb2wgd2hpY2ggdXNlcyBOZXRsaW5rLgorCiBjb25maWcgTkZfQ09OTlRSQUNLX0VWRU5UUwogCWJvb2wgIkNvbm5lY3Rpb24gdHJhY2tpbmcgZXZlbnRzIgogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECkBAIC0yMDEsNyArMjE5LDYgQEAKIAogY29uZmlnIE5GX0NPTk5UUkFDS19ORVRCSU9TX05TCiAJdHJpc3RhdGUgIk5ldEJJT1MgbmFtZSBzZXJ2aWNlIHByb3RvY29sIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQKIAlzZWxlY3QgTkZfQ09OTlRSQUNLX0JST0FEQ0FTVAogCWhlbHAKIAkgIE5ldEJJT1MgbmFtZSBzZXJ2aWNlIHJlcXVlc3RzIGFyZSBzZW50IGFzIGJyb2FkY2FzdCBtZXNzYWdlcyBmcm9tIGFuCkBAIC01NDIsNyArNTU5LDYgQEAKIAl0cmlzdGF0ZSAgJyJOT1RSQUNLIiB0YXJnZXQgc3VwcG9ydCcKIAlkZXBlbmRzIG9uIElQX05GX1JBVyB8fCBJUDZfTkZfUkFXCiAJZGVwZW5kcyBvbiBORl9DT05OVFJBQ0sKLQlkZXBlbmRzIG9uIE5FVEZJTFRFUl9BRFZBTkNFRAogCWhlbHAKIAkgIFRoZSBOT1RSQUNLIHRhcmdldCBhbGxvd3MgYSBzZWxlY3QgcnVsZSB0byBzcGVjaWZ5CiAJICB3aGljaCBwYWNrZXRzICpub3QqIHRvIGVudGVyIHRoZSBjb25udHJhY2svTkFUCkBAIC03NzIsNiArNzg4LDE1IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX0VDTgorCXRyaXN0YXRlICciZWNuIiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECisJLS0taGVscC0tLQorCVRoaXMgb3B0aW9uIGFkZHMgYW4gIkVDTiIgbWF0Y2gsIHdoaWNoIGFsbG93cyB5b3UgdG8gbWF0Y2ggYWdhaW5zdAorCXRoZSBJUHY0IGFuZCBUQ1AgaGVhZGVyIEVDTiBmaWVsZHMuCisKKwlUbyBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlLiBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25maWcgTkVURklMVEVSX1hUX01BVENIX0VTUAogCXRyaXN0YXRlICciZXNwIiBtYXRjaCBzdXBwb3J0JwogCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECkBAIC04ODEsNiArOTA2LDE2IEBACiAKIAkgIFRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmUuICBJZiB1bnN1cmUsIHNheSBOLgogCitjb25maWcgTkVURklMVEVSX1hUX01BVENIX05GQUNDVAorCXRyaXN0YXRlICcibmZhY2N0IiBtYXRjaCBzdXBwb3J0JworCWRlcGVuZHMgb24gTkVURklMVEVSX0FEVkFOQ0VECisJc2VsZWN0IE5FVEZJTFRFUl9ORVRMSU5LX0FDQ1QKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHVzZSB0aGUgZXh0ZW5kZWQgYWNjb3VudGluZyB0aHJvdWdoCisJICBuZm5ldGxpbmtfYWNjdC4KKworCSAgVG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgY2hvb3NlIE0gaGVyZS4gIElmIHVuc3VyZSwgc2F5IE4uCisKIGNvbmZpZyBORVRGSUxURVJfWFRfTUFUQ0hfT1NGCiAJdHJpc3RhdGUgJyJvc2YiIFBhc3NpdmUgT1MgZmluZ2VycHJpbnQgbWF0Y2gnCiAJZGVwZW5kcyBvbiBORVRGSUxURVJfQURWQU5DRUQgJiYgTkVURklMVEVSX05FVExJTksKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUgYi9uZXQvbmV0ZmlsdGVyL01ha2VmaWxlCmluZGV4IDFhMDI4NTMuLjQwZjRjM2QgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvTWFrZWZpbGUKKysrIGIvbmV0L25ldGZpbHRlci9NYWtlZmlsZQpAQCAtNyw2ICs3LDcgQEAKIG9iai0kKENPTkZJR19ORVRGSUxURVIpID0gbmV0ZmlsdGVyLm8KIAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LKSArPSBuZm5ldGxpbmsubworb2JqLSQoQ09ORklHX05FVEZJTFRFUl9ORVRMSU5LX0FDQ1QpICs9IG5mbmV0bGlua19hY2N0Lm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfTkVUTElOS19RVUVVRSkgKz0gbmZuZXRsaW5rX3F1ZXVlLm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfTkVUTElOS19MT0cpICs9IG5mbmV0bGlua19sb2cubwogCkBAIC04MCw2ICs4MSw3IEBACiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0RDQ1ApICs9IHh0X2RjY3Aubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9ERVZHUk9VUCkgKz0geHRfZGV2Z3JvdXAubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9EU0NQKSArPSB4dF9kc2NwLm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfRUNOKSArPSB4dF9lY24ubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9FU1ApICs9IHh0X2VzcC5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX0hBU0hMSU1JVCkgKz0geHRfaGFzaGxpbWl0Lm8KIG9iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfSEVMUEVSKSArPSB4dF9oZWxwZXIubwpAQCAtOTAsNiArOTIsNyBAQAogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9MSU1JVCkgKz0geHRfbGltaXQubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9NQUMpICs9IHh0X21hYy5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX01VTFRJUE9SVCkgKz0geHRfbXVsdGlwb3J0Lm8KK29iai0kKENPTkZJR19ORVRGSUxURVJfWFRfTUFUQ0hfTkZBQ0NUKSArPSB4dF9uZmFjY3Qubwogb2JqLSQoQ09ORklHX05FVEZJTFRFUl9YVF9NQVRDSF9PU0YpICs9IHh0X29zZi5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX09XTkVSKSArPSB4dF9vd25lci5vCiBvYmotJChDT05GSUdfTkVURklMVEVSX1hUX01BVENIX1BIWVNERVYpICs9IHh0X3BoeXNkZXYubwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2NvcmUuYwppbmRleCBhZmNhNmM3Li5iNGU4ZmYwIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL2NvcmUuYwpAQCAtNTQsNiArNTQsMTIgQEAKIAogc3RydWN0IGxpc3RfaGVhZCBuZl9ob29rc1tORlBST1RPX05VTVBST1RPXVtORl9NQVhfSE9PS1NdIF9fcmVhZF9tb3N0bHk7CiBFWFBPUlRfU1lNQk9MKG5mX2hvb2tzKTsKKworI2lmIGRlZmluZWQoQ09ORklHX0pVTVBfTEFCRUwpCitzdHJ1Y3QganVtcF9sYWJlbF9rZXkgbmZfaG9va3NfbmVlZGVkW05GUFJPVE9fTlVNUFJPVE9dW05GX01BWF9IT09LU107CitFWFBPUlRfU1lNQk9MKG5mX2hvb2tzX25lZWRlZCk7CisjZW5kaWYKKwogc3RhdGljIERFRklORV9NVVRFWChuZl9ob29rX211dGV4KTsKIAogaW50IG5mX3JlZ2lzdGVyX2hvb2soc3RydWN0IG5mX2hvb2tfb3BzICpyZWcpCkBAIC03MCw2ICs3Niw5IEBACiAJfQogCWxpc3RfYWRkX3JjdSgmcmVnLT5saXN0LCBlbGVtLT5saXN0LnByZXYpOwogCW11dGV4X3VubG9jaygmbmZfaG9va19tdXRleCk7CisjaWYgZGVmaW5lZChDT05GSUdfSlVNUF9MQUJFTCkKKwlqdW1wX2xhYmVsX2luYygmbmZfaG9va3NfbmVlZGVkW3JlZy0+cGZdW3JlZy0+aG9va251bV0pOworI2VuZGlmCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX3JlZ2lzdGVyX2hvb2spOwpAQCAtNzksNyArODgsOSBAQAogCW11dGV4X2xvY2soJm5mX2hvb2tfbXV0ZXgpOwogCWxpc3RfZGVsX3JjdSgmcmVnLT5saXN0KTsKIAltdXRleF91bmxvY2soJm5mX2hvb2tfbXV0ZXgpOwotCisjaWYgZGVmaW5lZChDT05GSUdfSlVNUF9MQUJFTCkKKwlqdW1wX2xhYmVsX2RlYygmbmZfaG9va3NfbmVlZGVkW3JlZy0+cGZdW3JlZy0+aG9va251bV0pOworI2VuZGlmCiAJc3luY2hyb25pemVfbmV0KCk7CiB9CiBFWFBPUlRfU1lNQk9MKG5mX3VucmVnaXN0ZXJfaG9vayk7CkBAIC0yMTgsNyArMjI5LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0woc2tiX21ha2Vfd3JpdGFibGUpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NPTk5UUkFDSykKIC8qIFRoaXMgZG9lcyBub3QgYmVsb25nIGhlcmUsIGJ1dCBsb2NhbGx5IGdlbmVyYXRlZCBlcnJvcnMgbmVlZCBpdCBpZiBjb25uZWN0aW9uCiAgICB0cmFja2luZyBpbiB1c2U6IHdpdGhvdXQgdGhpcywgY29ubmVjdGlvbiBtYXkgbm90IGJlIGluIGhhc2ggdGFibGUsIGFuZCBoZW5jZQogICAgbWFudWZhY3R1cmVkIElDTVAgb3IgUlNUIHBhY2tldHMgd2lsbCBub3QgYmUgYXNzb2NpYXRlZCB3aXRoIGl0LiAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfZ2V0cG9ydC5jIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfZ2V0cG9ydC5jCmluZGV4IDA1MjU3OWYuLjFmMDM1NTYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2dldHBvcnQuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9nZXRwb3J0LmMKQEAgLTEwOSwxNiArMTA5LDE4IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChpcF9zZXRfZ2V0X2lwNF9wb3J0KTsKIAotI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCiBib29sCiBpcF9zZXRfZ2V0X2lwNl9wb3J0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGJvb2wgc3JjLAogCQkgICAgX19iZTE2ICpwb3J0LCB1OCAqcHJvdG8pCiB7CiAJaW50IHByb3RvZmY7CiAJdTggbmV4dGhkcjsKKwlfX2JlMTYgZnJhZ19vZmY7CiAKIAluZXh0aGRyID0gaXB2Nl9oZHIoc2tiKS0+bmV4dGhkcjsKLQlwcm90b2ZmID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkciksICZuZXh0aGRyKTsKKwlwcm90b2ZmID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkciksICZuZXh0aGRyLAorCQkJCSAgICZmcmFnX29mZik7CiAJaWYgKHByb3RvZmYgPCAwKQogCQlyZXR1cm4gZmFsc2U7CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXAuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXAuYwppbmRleCBmMmQ1NzZlLi40MDE1ZmNhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcC5jCkBAIC0yNDEsNyArMjQxLDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZAogaGFzaF9pcDZfZGF0YV9jb3B5KHN0cnVjdCBoYXNoX2lwNl9lbGVtICpkc3QsIGNvbnN0IHN0cnVjdCBoYXNoX2lwNl9lbGVtICpzcmMpCiB7Ci0JaXB2Nl9hZGRyX2NvcHkoJmRzdC0+aXAuaW42LCAmc3JjLT5pcC5pbjYpOworCWRzdC0+aXAuaW42ID0gc3JjLT5pcC5pbjY7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnQuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0LmMKaW5kZXggNmVlMTBmNS4uMzdkNjY3ZSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnQuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwcG9ydC5jCkBAIC0xNTgsNyArMTU4LDcgQEAKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwogCXN0cnVjdCBoYXNoX2lwcG9ydDRfZWxlbSBkYXRhID0geyB9OwotCXUzMiBpcCwgaXBfdG8sIHAgPSAwLCBwb3J0LCBwb3J0X3RvOworCXUzMiBpcCwgaXBfdG8gPSAwLCBwID0gMCwgcG9ydCwgcG9ydF90bzsKIAl1MzIgdGltZW91dCA9IGgtPnRpbWVvdXQ7CiAJYm9vbCB3aXRoX3BvcnRzID0gZmFsc2U7CiAJaW50IHJldDsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0aXAuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0aXAuYwppbmRleCBmYjkwZTM0Li5lNjllMjcxIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwcG9ydGlwLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnRpcC5jCkBAIC0xNjIsNyArMTYyLDcgQEAKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwogCXN0cnVjdCBoYXNoX2lwcG9ydGlwNF9lbGVtIGRhdGEgPSB7IH07Ci0JdTMyIGlwLCBpcF90bywgcCA9IDAsIHBvcnQsIHBvcnRfdG87CisJdTMyIGlwLCBpcF90byA9IDAsIHAgPSAwLCBwb3J0LCBwb3J0X3RvOwogCXUzMiB0aW1lb3V0ID0gaC0+dGltZW91dDsKIAlib29sIHdpdGhfcG9ydHMgPSBmYWxzZTsKIAlpbnQgcmV0OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnRuZXQuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfaXBwb3J0bmV0LmMKaW5kZXggZGViM2UzZC4uNjQxOTliNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9pcHBvcnRuZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX2lwcG9ydG5ldC5jCkBAIC0xODQsNyArMTg0LDcgQEAKIAljb25zdCBzdHJ1Y3QgaXBfc2V0X2hhc2ggKmggPSBzZXQtPmRhdGE7CiAJaXBzZXRfYWR0Zm4gYWR0Zm4gPSBzZXQtPnZhcmlhbnQtPmFkdFthZHRdOwogCXN0cnVjdCBoYXNoX2lwcG9ydG5ldDRfZWxlbSBkYXRhID0geyAuY2lkciA9IEhPU1RfTUFTSyB9OwotCXUzMiBpcCwgaXBfdG8sIHAgPSAwLCBwb3J0LCBwb3J0X3RvOworCXUzMiBpcCwgaXBfdG8gPSAwLCBwID0gMCwgcG9ydCwgcG9ydF90bzsKIAl1MzIgaXAyX2Zyb20gPSAwLCBpcDJfdG8sIGlwMl9sYXN0LCBpcDI7CiAJdTMyIHRpbWVvdXQgPSBoLT50aW1lb3V0OwogCWJvb2wgd2l0aF9wb3J0cyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXQuYyBiL25ldC9uZXRmaWx0ZXIvaXBzZXQvaXBfc2V0X2hhc2hfbmV0LmMKaW5kZXggNjBkMDE2NS4uMjg5ODgxOSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHNldC9pcF9zZXRfaGFzaF9uZXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwc2V0L2lwX3NldF9oYXNoX25ldC5jCkBAIC0yNjcsNyArMjY3LDcgQEAKIGhhc2hfbmV0Nl9kYXRhX2NvcHkoc3RydWN0IGhhc2hfbmV0Nl9lbGVtICpkc3QsCiAJCSAgICBjb25zdCBzdHJ1Y3QgaGFzaF9uZXQ2X2VsZW0gKnNyYykKIHsKLQlpcHY2X2FkZHJfY29weSgmZHN0LT5pcC5pbjYsICZzcmMtPmlwLmluNik7CisJZHN0LT5pcC5pbjYgPSBzcmMtPmlwLmluNjsKIAlkc3QtPmNpZHIgPSBzcmMtPmNpZHI7CiB9CiAKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9LY29uZmlnIGIvbmV0L25ldGZpbHRlci9pcHZzL0tjb25maWcKaW5kZXggNzBiZDFkMC4uYWY0YzBiOCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL0tjb25maWcKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL0tjb25maWcKQEAgLTIzMiw2ICsyMzIsMjEgQEAKIAkgIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgaW4ga2VybmVsLCBzYXkgWS4gVG8gY29tcGlsZSBpdCBhcyBhCiAJICBtb2R1bGUsIGNob29zZSBNIGhlcmUuIElmIHVuc3VyZSwgc2F5IE4uCiAKK2NvbW1lbnQgJ0lQVlMgU0ggc2NoZWR1bGVyJworCitjb25maWcgSVBfVlNfU0hfVEFCX0JJVFMKKwlpbnQgIklQVlMgc291cmNlIGhhc2hpbmcgdGFibGUgc2l6ZSAodGhlIE50aCBwb3dlciBvZiAyKSIKKwlyYW5nZSA0IDIwCisJZGVmYXVsdCA4CisJLS0taGVscC0tLQorCSAgVGhlIHNvdXJjZSBoYXNoaW5nIHNjaGVkdWxlciBtYXBzIHNvdXJjZSBJUHMgdG8gZGVzdGluYXRpb25zCisJICBzdG9yZWQgaW4gYSBoYXNoIHRhYmxlLiBUaGlzIHRhYmxlIGlzIHRpbGVkIGJ5IGVhY2ggZGVzdGluYXRpb24KKwkgIHVudGlsIGFsbCBzbG90cyBpbiB0aGUgdGFibGUgYXJlIGZpbGxlZC4gV2hlbiB1c2luZyB3ZWlnaHRzIHRvCisJICBhbGxvdyBkZXN0aW5hdGlvbnMgdG8gcmVjZWl2ZSBtb3JlIGNvbm5lY3Rpb25zLCB0aGUgdGFibGUgaXMKKwkgIHRpbGVkIGFuIGFtb3VudCBwcm9wb3J0aW9uYWwgdG8gdGhlIHdlaWdodHMgc3BlY2lmaWVkLiBUaGUgdGFibGUKKwkgIG5lZWRzIHRvIGJlIGxhcmdlIGVub3VnaCB0byBlZmZlY3RpdmVseSBmaXQgYWxsIHRoZSBkZXN0aW5hdGlvbnMKKwkgIG11bHRpcGxpZWQgYnkgdGhlaXIgcmVzcGVjdGl2ZSB3ZWlnaHRzLgorCiBjb21tZW50ICdJUFZTIGFwcGxpY2F0aW9uIGhlbHBlcicKIAogY29uZmlnCUlQX1ZTX0ZUUApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Nvbm4uYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb25uLmMKaW5kZXggMTI1NzFmYi4uMjlmYTViYSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2Nvbm4uYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29ubi5jCkBAIC02MTYsNyArNjE2LDcgQEAKIAlpZiAoKGNwKSAmJiAoIWNwLT5kZXN0KSkgewogCQlkZXN0ID0gaXBfdnNfZmluZF9kZXN0KGlwX3ZzX2Nvbm5fbmV0KGNwKSwgY3AtPmFmLCAmY3AtPmRhZGRyLAogCQkJCSAgICAgICBjcC0+ZHBvcnQsICZjcC0+dmFkZHIsIGNwLT52cG9ydCwKLQkJCQkgICAgICAgY3AtPnByb3RvY29sLCBjcC0+ZndtYXJrKTsKKwkJCQkgICAgICAgY3AtPnByb3RvY29sLCBjcC0+ZndtYXJrLCBjcC0+ZmxhZ3MpOwogCQlpcF92c19iaW5kX2Rlc3QoY3AsIGRlc3QpOwogCQlyZXR1cm4gZGVzdDsKIAl9IGVsc2UKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY29yZS5jCmluZGV4IDA5M2NjMzIuLjYxMWMzMzUgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jb3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2NvcmUuYwpAQCAtOTgzLDcgKzk4Myw3IEBACiAJaWYgKCFjcCkKIAkJcmV0dXJuIE5GX0FDQ0VQVDsKIAotCWlwdjZfYWRkcl9jb3B5KCZzbmV0LmluNiwgJmlwaC0+c2FkZHIpOworCXNuZXQuaW42ID0gaXBoLT5zYWRkcjsKIAlyZXR1cm4gaGFuZGxlX3Jlc3BvbnNlX2ljbXAoQUZfSU5FVDYsIHNrYiwgJnNuZXQsIGNpaC0+bmV4dGhkciwgY3AsCiAJCQkJICAgIHBwLCBvZmZzZXQsIHNpemVvZihzdHJ1Y3QgaXB2NmhkcikpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX2N0bC5jCmluZGV4IDAwOGJmOTcuLmIzYWZlMTggMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19jdGwuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfY3RsLmMKQEAgLTg1LDcgKzg1LDcgQEAKIAl9OwogCiAJcnQgPSAoc3RydWN0IHJ0Nl9pbmZvICopaXA2X3JvdXRlX291dHB1dChuZXQsIE5VTEwsICZmbDYpOwotCWlmIChydCAmJiBydC0+cnQ2aV9kZXYgJiYgKHJ0LT5ydDZpX2Rldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0spKQorCWlmIChydCAmJiBydC0+ZHN0LmRldiAmJiAocnQtPmRzdC5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLKSkKIAkJcmV0dXJuIDE7CiAKIAlyZXR1cm4gMDsKQEAgLTYxOSwxNSArNjE5LDIxIEBACiAJCQkJICAgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICpkYWRkciwKIAkJCQkgICBfX2JlMTYgZHBvcnQsCiAJCQkJICAgY29uc3QgdW5pb24gbmZfaW5ldF9hZGRyICp2YWRkciwKLQkJCQkgICBfX2JlMTYgdnBvcnQsIF9fdTE2IHByb3RvY29sLCBfX3UzMiBmd21hcmspCisJCQkJICAgX19iZTE2IHZwb3J0LCBfX3UxNiBwcm90b2NvbCwgX191MzIgZndtYXJrLAorCQkJCSAgIF9fdTMyIGZsYWdzKQogewogCXN0cnVjdCBpcF92c19kZXN0ICpkZXN0OwogCXN0cnVjdCBpcF92c19zZXJ2aWNlICpzdmM7CisJX19iZTE2IHBvcnQgPSBkcG9ydDsKIAogCXN2YyA9IGlwX3ZzX3NlcnZpY2VfZ2V0KG5ldCwgYWYsIGZ3bWFyaywgcHJvdG9jb2wsIHZhZGRyLCB2cG9ydCk7CiAJaWYgKCFzdmMpCiAJCXJldHVybiBOVUxMOwotCWRlc3QgPSBpcF92c19sb29rdXBfZGVzdChzdmMsIGRhZGRyLCBkcG9ydCk7CisJaWYgKGZ3bWFyayAmJiAoZmxhZ3MgJiBJUF9WU19DT05OX0ZfRldEX01BU0spICE9IElQX1ZTX0NPTk5fRl9NQVNRKQorCQlwb3J0ID0gMDsKKwlkZXN0ID0gaXBfdnNfbG9va3VwX2Rlc3Qoc3ZjLCBkYWRkciwgcG9ydCk7CisJaWYgKCFkZXN0KQorCQlkZXN0ID0gaXBfdnNfbG9va3VwX2Rlc3Qoc3ZjLCBkYWRkciwgcG9ydCBeIGRwb3J0KTsKIAlpZiAoZGVzdCkKIAkJYXRvbWljX2luYygmZGVzdC0+cmVmY250KTsKIAlpcF92c19zZXJ2aWNlX3B1dChzdmMpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3BlX3NpcC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3BlX3NpcC5jCmluZGV4IDEzZDYwN2EuLjFhYTVjYWMgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19wZV9zaXAuYworKysgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfcGVfc2lwLmMKQEAgLTEwOCw3ICsxMDgsNyBAQAogCQkJCSAgc3RydWN0IGlwX3ZzX2Nvbm4gKmN0KQogCiB7Ci0JYm9vbCByZXQgPSAwOworCWJvb2wgcmV0ID0gZmFsc2U7CiAKIAlpZiAoY3QtPmFmID09IHAtPmFmICYmCiAJICAgIGlwX3ZzX2FkZHJfZXF1YWwocC0+YWYsIHAtPmNhZGRyLCAmY3QtPmNhZGRyKSAmJgpAQCAtMTIxLDcgKzEyMSw3IEBACiAJICAgIGN0LT5wcm90b2NvbCA9PSBwLT5wcm90b2NvbCAmJgogCSAgICBjdC0+cGVfZGF0YSAmJiBjdC0+cGVfZGF0YV9sZW4gPT0gcC0+cGVfZGF0YV9sZW4gJiYKIAkgICAgIW1lbWNtcChjdC0+cGVfZGF0YSwgcC0+cGVfZGF0YSwgcC0+cGVfZGF0YV9sZW4pKQotCQlyZXQgPSAxOworCQlyZXQgPSB0cnVlOwogCiAJSVBfVlNfREJHX0JVRig5LCAiU0lQIHRlbXBsYXRlIG1hdGNoICVzICVzLT4lczolZCAlc1xuIiwKIAkJICAgICAgaXBfdnNfcHJvdG9fbmFtZShwLT5wcm90b2NvbCksCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc2guYyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCmluZGV4IDMzODE1ZjQuLjA2OWU4ZDQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zaC5jCkBAIC0zMCw2ICszMCwxMSBAQAogICogc2VydmVyIGlzIGRlYWQgb3Igb3ZlcmxvYWRlZCwgdGhlIGxvYWQgYmFsYW5jZXIgY2FuIGJ5cGFzcyB0aGUgY2FjaGUKICAqIHNlcnZlciBhbmQgc2VuZCByZXF1ZXN0cyB0byB0aGUgb3JpZ2luYWwgc2VydmVyIGRpcmVjdGx5LgogICoKKyAqIFRoZSB3ZWlnaHQgZGVzdGluYXRpb24gYXR0cmlidXRlIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdGhlCisgKiBkaXN0cmlidXRpb24gb2YgY29ubmVjdGlvbnMgdG8gdGhlIGRlc3RpbmF0aW9ucyBpbiBzZXJ2ZXJub2RlLiBUaGUKKyAqIGdyZWF0ZXIgdGhlIHdlaWdodCwgdGhlIG1vcmUgY29ubmVjdGlvbnMgdGhlIGRlc3RpbmF0aW9uCisgKiB3aWxsIHJlY2VpdmUuCisgKgogICovCiAKICNkZWZpbmUgS01TR19DT01QT05FTlQgIklQVlMiCkBAIC05OSw5ICsxMDQsMTEgQEAKIAlzdHJ1Y3QgaXBfdnNfc2hfYnVja2V0ICpiOwogCXN0cnVjdCBsaXN0X2hlYWQgKnA7CiAJc3RydWN0IGlwX3ZzX2Rlc3QgKmRlc3Q7CisJaW50IGRfY291bnQ7CiAKIAliID0gdGJsOwogCXAgPSAmc3ZjLT5kZXN0aW5hdGlvbnM7CisJZF9jb3VudCA9IDA7CiAJZm9yIChpPTA7IGk8SVBfVlNfU0hfVEFCX1NJWkU7IGkrKykgewogCQlpZiAobGlzdF9lbXB0eShwKSkgewogCQkJYi0+ZGVzdCA9IE5VTEw7CkBAIC0xMTMsNyArMTIwLDE2IEBACiAJCQlhdG9taWNfaW5jKCZkZXN0LT5yZWZjbnQpOwogCQkJYi0+ZGVzdCA9IGRlc3Q7CiAKLQkJCXAgPSBwLT5uZXh0OworCQkJSVBfVlNfREJHX0JVRig2LCAiYXNzaWduZWQgaTogJWQgZGVzdDogJXMgd2VpZ2h0OiAlZFxuIiwKKwkJCQkgICAgICBpLCBJUF9WU19EQkdfQUREUihzdmMtPmFmLCAmZGVzdC0+YWRkciksCisJCQkJICAgICAgYXRvbWljX3JlYWQoJmRlc3QtPndlaWdodCkpOworCisJCQkvKiBEb24ndCBtb3ZlIHRvIG5leHQgZGVzdCB1bnRpbCBmaWxsaW5nIHdlaWdodCAqLworCQkJaWYgKCsrZF9jb3VudCA+PSBhdG9taWNfcmVhZCgmZGVzdC0+d2VpZ2h0KSkgeworCQkJCXAgPSBwLT5uZXh0OworCQkJCWRfY291bnQgPSAwOworCQkJfQorCiAJCX0KIAkJYisrOwogCX0KZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zeW5jLmMgYi9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfc3luYy5jCmluZGV4IDNjZGQ0NzkuLjhhMGQ2ZDYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c19zeW5jLmMKKysrIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3N5bmMuYwpAQCAtNjAzLDkgKzYwMyw5IEBACiAjaWZkZWYgQ09ORklHX0lQX1ZTX0lQVjYKIAlpZiAoY3AtPmFmID09IEFGX0lORVQ2KSB7CiAJCXAgKz0gc2l6ZW9mKHN0cnVjdCBpcF92c19zeW5jX3Y2KTsKLQkJaXB2Nl9hZGRyX2NvcHkoJnMtPnY2LmNhZGRyLCAmY3AtPmNhZGRyLmluNik7Ci0JCWlwdjZfYWRkcl9jb3B5KCZzLT52Ni52YWRkciwgJmNwLT52YWRkci5pbjYpOwotCQlpcHY2X2FkZHJfY29weSgmcy0+djYuZGFkZHIsICZjcC0+ZGFkZHIuaW42KTsKKwkJcy0+djYuY2FkZHIgPSBjcC0+Y2FkZHIuaW42OworCQlzLT52Ni52YWRkciA9IGNwLT52YWRkci5pbjY7CisJCXMtPnY2LmRhZGRyID0gY3AtPmRhZGRyLmluNjsKIAl9IGVsc2UKICNlbmRpZgogCXsKQEAgLTc0MCw3ICs3NDAsNyBAQAogCQkgKiBidXQgc3RpbGwgaGFuZGxlZC4KIAkJICovCiAJCWRlc3QgPSBpcF92c19maW5kX2Rlc3QobmV0LCB0eXBlLCBkYWRkciwgZHBvcnQsIHBhcmFtLT52YWRkciwKLQkJCQkgICAgICAgcGFyYW0tPnZwb3J0LCBwcm90b2NvbCwgZndtYXJrKTsKKwkJCQkgICAgICAgcGFyYW0tPnZwb3J0LCBwcm90b2NvbCwgZndtYXJrLCBmbGFncyk7CiAKIAkJLyogIFNldCB0aGUgYXBwcm9wcml0ZSBhdGl2aXR5IGZsYWcgKi8KIAkJaWYgKHByb3RvY29sID09IElQUFJPVE9fVENQKSB7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jIGIvbmV0L25ldGZpbHRlci9pcHZzL2lwX3ZzX3htaXQuYwppbmRleCBhYTJkNzIwLi43ZmQ2NmRlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL2lwdnMvaXBfdnNfeG1pdC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvaXB2cy9pcF92c194bWl0LmMKQEAgLTIwNyw3ICsyMDcsNyBAQAogCiBzdGF0aWMgaW5saW5lIGludCBfX2lwX3ZzX2lzX2xvY2FsX3JvdXRlNihzdHJ1Y3QgcnQ2X2luZm8gKnJ0KQogewotCXJldHVybiBydC0+cnQ2aV9kZXYgJiYgcnQtPnJ0NmlfZGV2LT5mbGFncyAmIElGRl9MT09QQkFDSzsKKwlyZXR1cm4gcnQtPmRzdC5kZXYgJiYgcnQtPmRzdC5kZXYtPmZsYWdzICYgSUZGX0xPT1BCQUNLOwogfQogCiBzdGF0aWMgc3RydWN0IGRzdF9lbnRyeSAqCkBAIC0yMzUsNyArMjM1LDcgQEAKIAkJCWdvdG8gb3V0X2VycjsKIAkJfQogCX0KLQlpcHY2X2FkZHJfY29weShyZXRfc2FkZHIsICZmbDYuc2FkZHIpOworCSpyZXRfc2FkZHIgPSBmbDYuc2FkZHI7CiAJcmV0dXJuIGRzdDsKIAogb3V0X2VycjoKQEAgLTI3OSw3ICsyNzksNyBAQAogCQkJCSAgYXRvbWljX3JlYWQoJnJ0LT5kc3QuX19yZWZjbnQpKTsKIAkJfQogCQlpZiAocmV0X3NhZGRyKQotCQkJaXB2Nl9hZGRyX2NvcHkocmV0X3NhZGRyLCAmZGVzdC0+ZHN0X3NhZGRyLmluNik7CisJCQkqcmV0X3NhZGRyID0gZGVzdC0+ZHN0X3NhZGRyLmluNjsKIAkJc3Bpbl91bmxvY2soJmRlc3QtPmRzdF9sb2NrKTsKIAl9IGVsc2UgewogCQlkc3QgPSBfX2lwX3ZzX3JvdXRlX291dHB1dF92NihuZXQsIGRhZGRyLCByZXRfc2FkZHIsIGRvX3hmcm0pOwpAQCAtNTQxLDcgKzU0MSw3IEBACiAJICogQXZvaWQgZHVwbGljYXRlIHR1cGxlIGluIHJlcGx5IGRpcmVjdGlvbiBmb3IgTkFUIHRyYWZmaWMKIAkgKiB0byBsb2NhbCBhZGRyZXNzIHdoZW4gY29ubmVjdGlvbiBpcyBzeW5jLWVkCiAJICovCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NPTk5UUkFDSykKIAlpZiAoY3AtPmZsYWdzICYgSVBfVlNfQ09OTl9GX1NZTkMgJiYgbG9jYWwpIHsKIAkJZW51bSBpcF9jb25udHJhY2tfaW5mbyBjdGluZm87CiAJCXN0cnVjdCBuZl9jb25uICpjdCA9IGN0ID0gbmZfY3RfZ2V0KHNrYiwgJmN0aW5mbyk7CkBAIC02NTgsNyArNjU4LDcgQEAKIAkgKiBBdm9pZCBkdXBsaWNhdGUgdHVwbGUgaW4gcmVwbHkgZGlyZWN0aW9uIGZvciBOQVQgdHJhZmZpYwogCSAqIHRvIGxvY2FsIGFkZHJlc3Mgd2hlbiBjb25uZWN0aW9uIGlzIHN5bmMtZWQKIAkgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLKQogCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfU1lOQyAmJiBsb2NhbCkgewogCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAkJc3RydWN0IG5mX2Nvbm4gKmN0ID0gY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKQEAgLTcwNSw3ICs3MDUsNyBAQAogCS8qIG1hbmdsZSB0aGUgcGFja2V0ICovCiAJaWYgKHBwLT5kbmF0X2hhbmRsZXIgJiYgIXBwLT5kbmF0X2hhbmRsZXIoc2tiLCBwcCwgY3ApKQogCQlnb3RvIHR4X2Vycm9yOwotCWlwdjZfYWRkcl9jb3B5KCZpcHY2X2hkcihza2IpLT5kYWRkciwgJmNwLT5kYWRkci5pbjYpOworCWlwdjZfaGRyKHNrYiktPmRhZGRyID0gY3AtPmRhZGRyLmluNjsKIAogCWlmICghbG9jYWwgfHwgIXNrYi0+ZGV2KSB7CiAJCS8qIGRyb3AgdGhlIG9sZCByb3V0ZSB3aGVuIHNrYiBpcyBub3Qgc2hhcmVkICovCkBAIC05NjcsOCArOTY3LDggQEAKIAliZTE2X2FkZF9jcHUoJmlwaC0+cGF5bG9hZF9sZW4sIHNpemVvZigqb2xkX2lwaCkpOwogCWlwaC0+cHJpb3JpdHkJCT0Jb2xkX2lwaC0+cHJpb3JpdHk7CiAJbWVtc2V0KCZpcGgtPmZsb3dfbGJsLCAwLCBzaXplb2YoaXBoLT5mbG93X2xibCkpOwotCWlwdjZfYWRkcl9jb3B5KCZpcGgtPmRhZGRyLCAmY3AtPmRhZGRyLmluNik7Ci0JaXB2Nl9hZGRyX2NvcHkoJmlwaC0+c2FkZHIsICZzYWRkcik7CisJaXBoLT5kYWRkciA9IGNwLT5kYWRkci5pbjY7CisJaXBoLT5zYWRkciA9IHNhZGRyOwogCWlwaC0+aG9wX2xpbWl0CQk9CW9sZF9pcGgtPmhvcF9saW1pdDsKIAogCS8qIEFub3RoZXIgaGFjazogYXZvaWQgaWNtcF9zZW5kIGluIGlwX2ZyYWdtZW50ICovCkBAIC0xMTczLDcgKzExNzMsNyBAQAogCSAqIEF2b2lkIGR1cGxpY2F0ZSB0dXBsZSBpbiByZXBseSBkaXJlY3Rpb24gZm9yIE5BVCB0cmFmZmljCiAJICogdG8gbG9jYWwgYWRkcmVzcyB3aGVuIGNvbm5lY3Rpb24gaXMgc3luYy1lZAogCSAqLwotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DT05OVFJBQ0spCiAJaWYgKGNwLT5mbGFncyAmIElQX1ZTX0NPTk5fRl9TWU5DICYmIGxvY2FsKSB7CiAJCWVudW0gaXBfY29ubnRyYWNrX2luZm8gY3RpbmZvOwogCQlzdHJ1Y3QgbmZfY29ubiAqY3QgPSBjdCA9IG5mX2N0X2dldChza2IsICZjdGluZm8pOwpAQCAtMTI5Myw3ICsxMjkzLDcgQEAKIAkgKiBBdm9pZCBkdXBsaWNhdGUgdHVwbGUgaW4gcmVwbHkgZGlyZWN0aW9uIGZvciBOQVQgdHJhZmZpYwogCSAqIHRvIGxvY2FsIGFkZHJlc3Mgd2hlbiBjb25uZWN0aW9uIGlzIHN5bmMtZWQKIAkgKi8KLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0spIHx8IGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLKQogCWlmIChjcC0+ZmxhZ3MgJiBJUF9WU19DT05OX0ZfU1lOQyAmJiBsb2NhbCkgewogCQllbnVtIGlwX2Nvbm50cmFja19pbmZvIGN0aW5mbzsKIAkJc3RydWN0IG5mX2Nvbm4gKmN0ID0gY3QgPSBuZl9jdF9nZXQoc2tiLCAmY3RpbmZvKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2FjY3QuYwppbmRleCAzNjlkZjNmLi5mNGY4Y2RhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19hY2N0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5jCkBAIC0xOCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXh0ZW5kLmg+CiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfYWNjdC5oPgogCi1zdGF0aWMgaW50IG5mX2N0X2FjY3QgX19yZWFkX21vc3RseTsKK3N0YXRpYyBib29sIG5mX2N0X2FjY3QgX19yZWFkX21vc3RseTsKIAogbW9kdWxlX3BhcmFtX25hbWVkKGFjY3QsIG5mX2N0X2FjY3QsIGJvb2wsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhhY2N0LCAiRW5hYmxlIGNvbm5lY3Rpb24gdHJhY2tpbmcgZmxvdyBhY2NvdW50aW5nLiIpOwpAQCAtNDYsOCArNDYsOCBAQAogCQlyZXR1cm4gMDsKIAogCXJldHVybiBzZXFfcHJpbnRmKHMsICJwYWNrZXRzPSVsbHUgYnl0ZXM9JWxsdSAiLAotCQkJICAodW5zaWduZWQgbG9uZyBsb25nKWFjY3RbZGlyXS5wYWNrZXRzLAotCQkJICAodW5zaWduZWQgbG9uZyBsb25nKWFjY3RbZGlyXS5ieXRlcyk7CisJCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpYXRvbWljNjRfcmVhZCgmYWNjdFtkaXJdLnBhY2tldHMpLAorCQkJICAodW5zaWduZWQgbG9uZyBsb25nKWF0b21pYzY0X3JlYWQoJmFjY3RbZGlyXS5ieXRlcykpOwogfTsKIEVYUE9SVF9TWU1CT0xfR1BMKHNlcV9wcmludF9hY2N0KTsKIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfY29yZS5jCmluZGV4IDcyMDJiMDYuLmU4NzVmODkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2NvcmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19jb3JlLmMKQEAgLTY3LDYgKzY3LDcgQEAKIEVYUE9SVF9QRVJfQ1BVX1NZTUJPTChuZl9jb25udHJhY2tfdW50cmFja2VkKTsKIAogdW5zaWduZWQgaW50IG5mX2Nvbm50cmFja19oYXNoX3JuZCBfX3JlYWRfbW9zdGx5OworRVhQT1JUX1NZTUJPTF9HUEwobmZfY29ubnRyYWNrX2hhc2hfcm5kKTsKIAogc3RhdGljIHUzMiBoYXNoX2Nvbm50cmFja19yYXcoY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja190dXBsZSAqdHVwbGUsIHUxNiB6b25lKQogewpAQCAtMTA0NCwxMCArMTA0NSw4IEBACiAKIAkJYWNjdCA9IG5mX2Nvbm5fYWNjdF9maW5kKGN0KTsKIAkJaWYgKGFjY3QpIHsKLQkJCXNwaW5fbG9ja19iaCgmY3QtPmxvY2spOwotCQkJYWNjdFtDVElORk8yRElSKGN0aW5mbyldLnBhY2tldHMrKzsKLQkJCWFjY3RbQ1RJTkZPMkRJUihjdGluZm8pXS5ieXRlcyArPSBza2ItPmxlbjsKLQkJCXNwaW5fdW5sb2NrX2JoKCZjdC0+bG9jayk7CisJCQlhdG9taWM2NF9pbmMoJmFjY3RbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzKTsKKwkJCWF0b21pYzY0X2FkZChza2ItPmxlbiwgJmFjY3RbQ1RJTkZPMkRJUihjdGluZm8pXS5ieXRlcyk7CiAJCX0KIAl9CiB9CkBAIC0xMDYzLDExICsxMDYyLDkgQEAKIAogCQlhY2N0ID0gbmZfY29ubl9hY2N0X2ZpbmQoY3QpOwogCQlpZiAoYWNjdCkgewotCQkJc3Bpbl9sb2NrX2JoKCZjdC0+bG9jayk7Ci0JCQlhY2N0W0NUSU5GTzJESVIoY3RpbmZvKV0ucGFja2V0cysrOwotCQkJYWNjdFtDVElORk8yRElSKGN0aW5mbyldLmJ5dGVzICs9Ci0JCQkJc2tiLT5sZW4gLSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKLQkJCXNwaW5fdW5sb2NrX2JoKCZjdC0+bG9jayk7CisJCQlhdG9taWM2NF9pbmMoJmFjY3RbQ1RJTkZPMkRJUihjdGluZm8pXS5wYWNrZXRzKTsKKwkJCWF0b21pYzY0X2FkZChza2ItPmxlbiAtIHNrYl9uZXR3b3JrX29mZnNldChza2IpLAorCQkJCSAgICAgJmFjY3RbQ1RJTkZPMkRJUihjdGluZm8pXS5ieXRlcyk7CiAJCX0KIAl9CiAKQEAgLTEwODcsNyArMTA4NCw3IEBACiB9OwogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DVF9ORVRMSU5LKQogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmg+CkBAIC0xMzQyLDggKzEzMzksNyBAQAogCQkJCQlnZXRfb3JkZXIoc3opKTsKIAlpZiAoIWhhc2gpIHsKIAkJcHJpbnRrKEtFUk5fV0FSTklORyAibmZfY29ubnRyYWNrOiBmYWxsaW5nIGJhY2sgdG8gdm1hbGxvYy5cbiIpOwotCQloYXNoID0gX192bWFsbG9jKHN6LCBHRlBfS0VSTkVMIHwgX19HRlBfSElHSE1FTSB8IF9fR0ZQX1pFUk8sCi0JCQkJIFBBR0VfS0VSTkVMKTsKKwkJaGFzaCA9IHZ6YWxsb2Moc3opOwogCX0KIAogCWlmIChoYXNoICYmIG51bGxzKQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZWNhY2hlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYwppbmRleCA2YjM2OGJlLi5iNjJjNDE0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19lY2FjaGUuYwpAQCAtMjcsMjIgKzI3LDE3IEBACiAKIHN0YXRpYyBERUZJTkVfTVVURVgobmZfY3RfZWNhY2hlX211dGV4KTsKIAotc3RydWN0IG5mX2N0X2V2ZW50X25vdGlmaWVyIF9fcmN1ICpuZl9jb25udHJhY2tfZXZlbnRfY2IgX19yZWFkX21vc3RseTsKLUVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19ldmVudF9jYik7Ci0KLXN0cnVjdCBuZl9leHBfZXZlbnRfbm90aWZpZXIgX19yY3UgKm5mX2V4cGVjdF9ldmVudF9jYiBfX3JlYWRfbW9zdGx5OwotRVhQT1JUX1NZTUJPTF9HUEwobmZfZXhwZWN0X2V2ZW50X2NiKTsKLQogLyogZGVsaXZlciBjYWNoZWQgZXZlbnRzIGFuZCBjbGVhciBjYWNoZSBlbnRyeSAtIG11c3QgYmUgY2FsbGVkIHdpdGggbG9jYWxseQogICogZGlzYWJsZWQgc29mdGlycXMgKi8KIHZvaWQgbmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKHN0cnVjdCBuZl9jb25uICpjdCkKIHsKKwlzdHJ1Y3QgbmV0ICpuZXQgPSBuZl9jdF9uZXQoY3QpOwogCXVuc2lnbmVkIGxvbmcgZXZlbnRzOwogCXN0cnVjdCBuZl9jdF9ldmVudF9ub3RpZmllciAqbm90aWZ5OwogCXN0cnVjdCBuZl9jb25udHJhY2tfZWNhY2hlICplOwogCiAJcmN1X3JlYWRfbG9jaygpOwotCW5vdGlmeSA9IHJjdV9kZXJlZmVyZW5jZShuZl9jb25udHJhY2tfZXZlbnRfY2IpOworCW5vdGlmeSA9IHJjdV9kZXJlZmVyZW5jZShuZXQtPmN0Lm5mX2Nvbm50cmFja19ldmVudF9jYik7CiAJaWYgKG5vdGlmeSA9PSBOVUxMKQogCQlnb3RvIG91dF91bmxvY2s7CiAKQEAgLTgzLDE5ICs3OCwyMCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZGVsaXZlcl9jYWNoZWRfZXZlbnRzKTsKIAotaW50IG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgbmZfY3RfZXZlbnRfbm90aWZpZXIgKm5ldykKK2ludCBuZl9jb25udHJhY2tfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5ldCAqbmV0LAorCQkJCSAgIHN0cnVjdCBuZl9jdF9ldmVudF9ub3RpZmllciAqbmV3KQogewogCWludCByZXQgPSAwOwogCXN0cnVjdCBuZl9jdF9ldmVudF9ub3RpZmllciAqbm90aWZ5OwogCiAJbXV0ZXhfbG9jaygmbmZfY3RfZWNhY2hlX211dGV4KTsKLQlub3RpZnkgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5mX2Nvbm50cmFja19ldmVudF9jYiwKKwlub3RpZnkgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5ldC0+Y3QubmZfY29ubnRyYWNrX2V2ZW50X2NiLAogCQkJCQkgICBsb2NrZGVwX2lzX2hlbGQoJm5mX2N0X2VjYWNoZV9tdXRleCkpOwogCWlmIChub3RpZnkgIT0gTlVMTCkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9Ci0JUkNVX0lOSVRfUE9JTlRFUihuZl9jb25udHJhY2tfZXZlbnRfY2IsIG5ldyk7CisJUkNVX0lOSVRfUE9JTlRFUihuZXQtPmN0Lm5mX2Nvbm50cmFja19ldmVudF9jYiwgbmV3KTsKIAltdXRleF91bmxvY2soJm5mX2N0X2VjYWNoZV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIApAQCAtMTA1LDMyICsxMDEsMzQgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja19yZWdpc3Rlcl9ub3RpZmllcik7CiAKLXZvaWQgbmZfY29ubnRyYWNrX3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5mX2N0X2V2ZW50X25vdGlmaWVyICpuZXcpCit2b2lkIG5mX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkgICAgICBzdHJ1Y3QgbmZfY3RfZXZlbnRfbm90aWZpZXIgKm5ldykKIHsKIAlzdHJ1Y3QgbmZfY3RfZXZlbnRfbm90aWZpZXIgKm5vdGlmeTsKIAogCW11dGV4X2xvY2soJm5mX2N0X2VjYWNoZV9tdXRleCk7Ci0Jbm90aWZ5ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChuZl9jb25udHJhY2tfZXZlbnRfY2IsCisJbm90aWZ5ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChuZXQtPmN0Lm5mX2Nvbm50cmFja19ldmVudF9jYiwKIAkJCQkJICAgbG9ja2RlcF9pc19oZWxkKCZuZl9jdF9lY2FjaGVfbXV0ZXgpKTsKIAlCVUdfT04obm90aWZ5ICE9IG5ldyk7Ci0JUkNVX0lOSVRfUE9JTlRFUihuZl9jb25udHJhY2tfZXZlbnRfY2IsIE5VTEwpOworCVJDVV9JTklUX1BPSU5URVIobmV0LT5jdC5uZl9jb25udHJhY2tfZXZlbnRfY2IsIE5VTEwpOwogCW11dGV4X3VubG9jaygmbmZfY3RfZWNhY2hlX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKTsKIAotaW50IG5mX2N0X2V4cGVjdF9yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgbmZfZXhwX2V2ZW50X25vdGlmaWVyICpuZXcpCitpbnQgbmZfY3RfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBuZXQgKm5ldCwKKwkJCQkgICBzdHJ1Y3QgbmZfZXhwX2V2ZW50X25vdGlmaWVyICpuZXcpCiB7CiAJaW50IHJldCA9IDA7CiAJc3RydWN0IG5mX2V4cF9ldmVudF9ub3RpZmllciAqbm90aWZ5OwogCiAJbXV0ZXhfbG9jaygmbmZfY3RfZWNhY2hlX211dGV4KTsKLQlub3RpZnkgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5mX2V4cGVjdF9ldmVudF9jYiwKKwlub3RpZnkgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG5ldC0+Y3QubmZfZXhwZWN0X2V2ZW50X2NiLAogCQkJCQkgICBsb2NrZGVwX2lzX2hlbGQoJm5mX2N0X2VjYWNoZV9tdXRleCkpOwogCWlmIChub3RpZnkgIT0gTlVMTCkgewogCQlyZXQgPSAtRUJVU1k7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9Ci0JUkNVX0lOSVRfUE9JTlRFUihuZl9leHBlY3RfZXZlbnRfY2IsIG5ldyk7CisJUkNVX0lOSVRfUE9JTlRFUihuZXQtPmN0Lm5mX2V4cGVjdF9ldmVudF9jYiwgbmV3KTsKIAltdXRleF91bmxvY2soJm5mX2N0X2VjYWNoZV9tdXRleCk7CiAJcmV0dXJuIHJldDsKIApAQCAtMTQwLDE1ICsxMzgsMTYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2V4cGVjdF9yZWdpc3Rlcl9ub3RpZmllcik7CiAKLXZvaWQgbmZfY3RfZXhwZWN0X3VucmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5mX2V4cF9ldmVudF9ub3RpZmllciAqbmV3KQordm9pZCBuZl9jdF9leHBlY3RfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3QgbmV0ICpuZXQsCisJCQkJICAgICAgc3RydWN0IG5mX2V4cF9ldmVudF9ub3RpZmllciAqbmV3KQogewogCXN0cnVjdCBuZl9leHBfZXZlbnRfbm90aWZpZXIgKm5vdGlmeTsKIAogCW11dGV4X2xvY2soJm5mX2N0X2VjYWNoZV9tdXRleCk7Ci0Jbm90aWZ5ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChuZl9leHBlY3RfZXZlbnRfY2IsCisJbm90aWZ5ID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChuZXQtPmN0Lm5mX2V4cGVjdF9ldmVudF9jYiwKIAkJCQkJICAgbG9ja2RlcF9pc19oZWxkKCZuZl9jdF9lY2FjaGVfbXV0ZXgpKTsKIAlCVUdfT04obm90aWZ5ICE9IG5ldyk7Ci0JUkNVX0lOSVRfUE9JTlRFUihuZl9leHBlY3RfZXZlbnRfY2IsIE5VTEwpOworCVJDVV9JTklUX1BPSU5URVIobmV0LT5jdC5uZl9leHBlY3RfZXZlbnRfY2IsIE5VTEwpOwogCW11dGV4X3VubG9jaygmbmZfY3RfZWNhY2hlX211dGV4KTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5mX2N0X2V4cGVjdF91bnJlZ2lzdGVyX25vdGlmaWVyKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4cGVjdC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKaW5kZXggMzQwYzgwZC4uNDE0N2JhMyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZXhwZWN0LmMKQEAgLTM4LDggKzM4LDYgQEAKIAogc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpuZl9jdF9leHBlY3RfY2FjaGVwIF9fcmVhZF9tb3N0bHk7CiAKLXN0YXRpYyBITElTVF9IRUFEKG5mX2N0X3VzZXJzcGFjZV9leHBlY3RfbGlzdCk7Ci0KIC8qIG5mX2Nvbm50cmFja19leHBlY3QgaGVscGVyIGZ1bmN0aW9ucyAqLwogdm9pZCBuZl9jdF91bmxpbmtfZXhwZWN0X3JlcG9ydChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwLAogCQkJCXUzMiBwaWQsIGludCByZXBvcnQpCkBAIC00NywxNCArNDUsMTQgQEAKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICptYXN0ZXJfaGVscCA9IG5mY3RfaGVscChleHAtPm1hc3Rlcik7CiAJc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfZXhwX25ldChleHApOwogCisJTkZfQ1RfQVNTRVJUKG1hc3Rlcl9oZWxwKTsKIAlORl9DVF9BU1NFUlQoIXRpbWVyX3BlbmRpbmcoJmV4cC0+dGltZW91dCkpOwogCiAJaGxpc3RfZGVsX3JjdSgmZXhwLT5obm9kZSk7CiAJbmV0LT5jdC5leHBlY3RfY291bnQtLTsKIAogCWhsaXN0X2RlbCgmZXhwLT5sbm9kZSk7Ci0JaWYgKCEoZXhwLT5mbGFncyAmIE5GX0NUX0VYUEVDVF9VU0VSU1BBQ0UpKQotCQltYXN0ZXJfaGVscC0+ZXhwZWN0aW5nW2V4cC0+Y2xhc3NdLS07CisJbWFzdGVyX2hlbHAtPmV4cGVjdGluZ1tleHAtPmNsYXNzXS0tOwogCiAJbmZfY3RfZXhwZWN0X2V2ZW50X3JlcG9ydChJUEVYUF9ERVNUUk9ZLCBleHAsIHBpZCwgcmVwb3J0KTsKIAluZl9jdF9leHBlY3RfcHV0KGV4cCk7CkBAIC0zMTQsMzcgKzMxMiwzNCBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZXhwZWN0X3B1dCk7CiAKLXN0YXRpYyB2b2lkIG5mX2N0X2V4cGVjdF9pbnNlcnQoc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKK3N0YXRpYyBpbnQgbmZfY3RfZXhwZWN0X2luc2VydChzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdCAqZXhwKQogewogCXN0cnVjdCBuZl9jb25uX2hlbHAgKm1hc3Rlcl9oZWxwID0gbmZjdF9oZWxwKGV4cC0+bWFzdGVyKTsKKwlzdHJ1Y3QgbmZfY29ubnRyYWNrX2hlbHBlciAqaGVscGVyOwogCXN0cnVjdCBuZXQgKm5ldCA9IG5mX2N0X2V4cF9uZXQoZXhwKTsKLQljb25zdCBzdHJ1Y3QgbmZfY29ubnRyYWNrX2V4cGVjdF9wb2xpY3kgKnA7CiAJdW5zaWduZWQgaW50IGggPSBuZl9jdF9leHBlY3RfZHN0X2hhc2goJmV4cC0+dHVwbGUpOwogCiAJLyogdHdvIHJlZmVyZW5jZXMgOiBvbmUgZm9yIGhhc2ggaW5zZXJ0LCBvbmUgZm9yIHRoZSB0aW1lciAqLwogCWF0b21pY19hZGQoMiwgJmV4cC0+dXNlKTsKIAotCWlmIChtYXN0ZXJfaGVscCkgewotCQlobGlzdF9hZGRfaGVhZCgmZXhwLT5sbm9kZSwgJm1hc3Rlcl9oZWxwLT5leHBlY3RhdGlvbnMpOwotCQltYXN0ZXJfaGVscC0+ZXhwZWN0aW5nW2V4cC0+Y2xhc3NdKys7Ci0JfSBlbHNlIGlmIChleHAtPmZsYWdzICYgTkZfQ1RfRVhQRUNUX1VTRVJTUEFDRSkKLQkJaGxpc3RfYWRkX2hlYWQoJmV4cC0+bG5vZGUsICZuZl9jdF91c2Vyc3BhY2VfZXhwZWN0X2xpc3QpOworCWhsaXN0X2FkZF9oZWFkKCZleHAtPmxub2RlLCAmbWFzdGVyX2hlbHAtPmV4cGVjdGF0aW9ucyk7CisJbWFzdGVyX2hlbHAtPmV4cGVjdGluZ1tleHAtPmNsYXNzXSsrOwogCiAJaGxpc3RfYWRkX2hlYWRfcmN1KCZleHAtPmhub2RlLCAmbmV0LT5jdC5leHBlY3RfaGFzaFtoXSk7CiAJbmV0LT5jdC5leHBlY3RfY291bnQrKzsKIAogCXNldHVwX3RpbWVyKCZleHAtPnRpbWVvdXQsIG5mX2N0X2V4cGVjdGF0aW9uX3RpbWVkX291dCwKIAkJICAgICh1bnNpZ25lZCBsb25nKWV4cCk7Ci0JaWYgKG1hc3Rlcl9oZWxwKSB7Ci0JCXAgPSAmcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZCgKLQkJCQltYXN0ZXJfaGVscC0+aGVscGVyLAotCQkJCWxvY2tkZXBfaXNfaGVsZCgmbmZfY29ubnRyYWNrX2xvY2spCi0JCQkJKS0+ZXhwZWN0X3BvbGljeVtleHAtPmNsYXNzXTsKLQkJZXhwLT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsgcC0+dGltZW91dCAqIEhaOworCWhlbHBlciA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQobWFzdGVyX2hlbHAtPmhlbHBlciwKKwkJCQkJICAgbG9ja2RlcF9pc19oZWxkKCZuZl9jb25udHJhY2tfbG9jaykpOworCWlmIChoZWxwZXIpIHsKKwkJZXhwLT50aW1lb3V0LmV4cGlyZXMgPSBqaWZmaWVzICsKKwkJCWhlbHBlci0+ZXhwZWN0X3BvbGljeVtleHAtPmNsYXNzXS50aW1lb3V0ICogSFo7CiAJfQogCWFkZF90aW1lcigmZXhwLT50aW1lb3V0KTsKIAogCU5GX0NUX1NUQVRfSU5DKG5ldCwgZXhwZWN0X2NyZWF0ZSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qIFJhY2Ugd2l0aCBleHBlY3RhdGlvbnMgYmVpbmcgdXNlZCBtZWFucyB3ZSBjb3VsZCBoYXZlIG5vbmUgdG8gZmluZDsgT0suICovCkBAIC0zODksMTQgKzM4NCwxMyBAQAogCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICppOwogCXN0cnVjdCBuZl9jb25uICptYXN0ZXIgPSBleHBlY3QtPm1hc3RlcjsKIAlzdHJ1Y3QgbmZfY29ubl9oZWxwICptYXN0ZXJfaGVscCA9IG5mY3RfaGVscChtYXN0ZXIpOworCXN0cnVjdCBuZl9jb25udHJhY2tfaGVscGVyICpoZWxwZXI7CiAJc3RydWN0IG5ldCAqbmV0ID0gbmZfY3RfZXhwX25ldChleHBlY3QpOwogCXN0cnVjdCBobGlzdF9ub2RlICpuOwogCXVuc2lnbmVkIGludCBoOwogCWludCByZXQgPSAxOwogCi0JLyogRG9uJ3QgYWxsb3cgZXhwZWN0YXRpb25zIGNyZWF0ZWQgZnJvbSBrZXJuZWwtc3BhY2Ugd2l0aCBubyBoZWxwZXIgKi8KLQlpZiAoIShleHBlY3QtPmZsYWdzICYgTkZfQ1RfRVhQRUNUX1VTRVJTUEFDRSkgJiYKLQkgICAgKCFtYXN0ZXJfaGVscCB8fCAobWFzdGVyX2hlbHAgJiYgIW1hc3Rlcl9oZWxwLT5oZWxwZXIpKSkgeworCWlmICghbWFzdGVyX2hlbHApIHsKIAkJcmV0ID0gLUVTSFVURE9XTjsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDE0LDExICs0MDgsMTAgQEAKIAkJfQogCX0KIAkvKiBXaWxsIGJlIG92ZXIgbGltaXQ/ICovCi0JaWYgKG1hc3Rlcl9oZWxwKSB7Ci0JCXAgPSAmcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZCgKLQkJCW1hc3Rlcl9oZWxwLT5oZWxwZXIsCi0JCQlsb2NrZGVwX2lzX2hlbGQoJm5mX2Nvbm50cmFja19sb2NrKQotCQkJKS0+ZXhwZWN0X3BvbGljeVtleHBlY3QtPmNsYXNzXTsKKwloZWxwZXIgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKG1hc3Rlcl9oZWxwLT5oZWxwZXIsCisJCQkJCSAgIGxvY2tkZXBfaXNfaGVsZCgmbmZfY29ubnRyYWNrX2xvY2spKTsKKwlpZiAoaGVscGVyKSB7CisJCXAgPSAmaGVscGVyLT5leHBlY3RfcG9saWN5W2V4cGVjdC0+Y2xhc3NdOwogCQlpZiAocC0+bWF4X2V4cGVjdGVkICYmCiAJCSAgICBtYXN0ZXJfaGVscC0+ZXhwZWN0aW5nW2V4cGVjdC0+Y2xhc3NdID49IHAtPm1heF9leHBlY3RlZCkgewogCQkJZXZpY3Rfb2xkZXN0X2V4cGVjdChtYXN0ZXIsIGV4cGVjdCk7CkBAIC00NTAsOCArNDQzLDkgQEAKIAlpZiAocmV0IDw9IDApCiAJCWdvdG8gb3V0OwogCi0JcmV0ID0gMDsKLQluZl9jdF9leHBlY3RfaW5zZXJ0KGV4cGVjdCk7CisJcmV0ID0gbmZfY3RfZXhwZWN0X2luc2VydChleHBlY3QpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIG91dDsKIAlzcGluX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogCW5mX2N0X2V4cGVjdF9ldmVudF9yZXBvcnQoSVBFWFBfTkVXLCBleHBlY3QsIHBpZCwgcmVwb3J0KTsKIAlyZXR1cm4gcmV0OwpAQCAtNDYxLDIyICs0NTUsNyBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwobmZfY3RfZXhwZWN0X3JlbGF0ZWRfcmVwb3J0KTsKIAotdm9pZCBuZl9jdF9yZW1vdmVfdXNlcnNwYWNlX2V4cGVjdGF0aW9ucyh2b2lkKQotewotCXN0cnVjdCBuZl9jb25udHJhY2tfZXhwZWN0ICpleHA7Ci0Jc3RydWN0IGhsaXN0X25vZGUgKm4sICpuZXh0OwotCi0JaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShleHAsIG4sIG5leHQsCi0JCQkJICAmbmZfY3RfdXNlcnNwYWNlX2V4cGVjdF9saXN0LCBsbm9kZSkgewotCQlpZiAoZGVsX3RpbWVyKCZleHAtPnRpbWVvdXQpKSB7Ci0JCQluZl9jdF91bmxpbmtfZXhwZWN0KGV4cCk7Ci0JCQluZl9jdF9leHBlY3RfcHV0KGV4cCk7Ci0JCX0KLQl9Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTChuZl9jdF9yZW1vdmVfdXNlcnNwYWNlX2V4cGVjdGF0aW9ucyk7Ci0KLSNpZmRlZiBDT05GSUdfUFJPQ19GUworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfUFJPQ0ZTCiBzdHJ1Y3QgY3RfZXhwZWN0X2l0ZXJfc3RhdGUgewogCXN0cnVjdCBzZXFfbmV0X3ByaXZhdGUgcDsKIAl1bnNpZ25lZCBpbnQgYnVja2V0OwpAQCAtNjA0LDI1ICs1ODMsMjUgQEAKIAkubGxzZWVrICA9IHNlcV9sc2VlaywKIAkucmVsZWFzZSA9IHNlcV9yZWxlYXNlX25ldCwKIH07Ci0jZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKyNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NGUyAqLwogCiBzdGF0aWMgaW50IGV4cF9wcm9jX2luaXQoc3RydWN0IG5ldCAqbmV0KQogewotI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DRlMKIAlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnByb2M7CiAKIAlwcm9jID0gcHJvY19uZXRfZm9wc19jcmVhdGUobmV0LCAibmZfY29ubnRyYWNrX2V4cGVjdCIsIDA0NDAsICZleHBfZmlsZV9vcHMpOwogCWlmICghcHJvYykKIAkJcmV0dXJuIC1FTk9NRU07Ci0jZW5kaWYgLyogQ09ORklHX1BST0NfRlMgKi8KKyNlbmRpZiAvKiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NGUyAqLwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBleHBfcHJvY19yZW1vdmUoc3RydWN0IG5ldCAqbmV0KQogewotI2lmZGVmIENPTkZJR19QUk9DX0ZTCisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19QUk9DRlMKIAlwcm9jX25ldF9yZW1vdmUobmV0LCAibmZfY29ubnRyYWNrX2V4cGVjdCIpOwotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DRlMgKi8KIH0KIAogbW9kdWxlX3BhcmFtX25hbWVkKGV4cGVjdF9oYXNoc2l6ZSwgbmZfY3RfZXhwZWN0X2hzaXplLCB1aW50LCAwNDAwKTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2Z0cC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKaW5kZXggNmY1ODAxZS4uOGM1Yzk1YyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfZnRwLmMKQEAgLTQyLDcgKzQyLDcgQEAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgcG9ydHNfYzsKIG1vZHVsZV9wYXJhbV9hcnJheShwb3J0cywgdXNob3J0LCAmcG9ydHNfYywgMDQwMCk7CiAKLXN0YXRpYyBpbnQgbG9vc2U7CitzdGF0aWMgYm9vbCBsb29zZTsKIG1vZHVsZV9wYXJhbShsb29zZSwgYm9vbCwgMDYwMCk7CiAKIHVuc2lnbmVkIGludCAoKm5mX25hdF9mdHBfaG9vaykoc3RydWN0IHNrX2J1ZmYgKnNrYiwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2gzMjNfbWFpbi5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKaW5kZXggZjAzYzJkNC4uNzIyMjkxZiAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaDMyM19tYWluLmMKQEAgLTQyLDcgKzQyLDcgQEAKIG1vZHVsZV9wYXJhbShna3JvdXRlZF9vbmx5LCBpbnQsIDA2MDApOwogTU9EVUxFX1BBUk1fREVTQyhna3JvdXRlZF9vbmx5LCAib25seSBhY2NlcHQgY2FsbHMgZnJvbSBnYXRla2VlcGVyIik7CiAKLXN0YXRpYyBpbnQgY2FsbGZvcndhcmRfZmlsdGVyIF9fcmVhZF9tb3N0bHkgPSAxOworc3RhdGljIGJvb2wgY2FsbGZvcndhcmRfZmlsdGVyIF9fcmVhZF9tb3N0bHkgPSB0cnVlOwogbW9kdWxlX3BhcmFtKGNhbGxmb3J3YXJkX2ZpbHRlciwgYm9vbCwgMDYwMCk7CiBNT0RVTEVfUEFSTV9ERVNDKGNhbGxmb3J3YXJkX2ZpbHRlciwgIm9ubHkgY3JlYXRlIGNhbGwgZm9yd2FyZGluZyBleHBlY3RhdGlvbnMgIgogCQkJCSAgICAgImlmIGJvdGggZW5kcG9pbnRzIGFyZSBvbiBkaWZmZXJlbnQgc2lkZXMgIgpAQCAtNzQzLDE3ICs3NDMsMTYgQEAKIAkJfQogCQlicmVhazsKIAl9Ci0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjYpIHx8IFwKLSAgICBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ09OTlRSQUNLX0lQVjYpCiAJY2FzZSBBRl9JTkVUNjogewogCQlzdHJ1Y3QgZmxvd2k2IGZsMSwgZmwyOwogCQlzdHJ1Y3QgcnQ2X2luZm8gKnJ0MSwgKnJ0MjsKIAogCQltZW1zZXQoJmZsMSwgMCwgc2l6ZW9mKGZsMSkpOwotCQlpcHY2X2FkZHJfY29weSgmZmwxLmRhZGRyLCAmc3JjLT5pbjYpOworCQlmbDEuZGFkZHIgPSBzcmMtPmluNjsKIAogCQltZW1zZXQoJmZsMiwgMCwgc2l6ZW9mKGZsMikpOwotCQlpcHY2X2FkZHJfY29weSgmZmwyLmRhZGRyLCAmZHN0LT5pbjYpOworCQlmbDIuZGFkZHIgPSBkc3QtPmluNjsKIAkJaWYgKCFhZmluZm8tPnJvdXRlKCZpbml0X25ldCwgKHN0cnVjdCBkc3RfZW50cnkgKiopJnJ0MSwKIAkJCQkgICBmbG93aTZfdG9fZmxvd2koJmZsMSksIGZhbHNlKSkgewogCQkJaWYgKCFhZmluZm8tPnJvdXRlKCZpbml0X25ldCwgKHN0cnVjdCBkc3RfZW50cnkgKiopJnJ0MiwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2hlbHBlci5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMKaW5kZXggOTNjNGJkYi4uYzllMGRlMCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfaGVscGVyLmMKQEAgLTEyMSw2ICsxMjEsMTggQEAKIAlpbnQgcmV0ID0gMDsKIAogCWlmICh0bXBsICE9IE5VTEwpIHsKKwkJLyogd2UndmUgZ290IGEgdXNlcnNwYWNlIGhlbHBlci4gKi8KKwkJaWYgKHRtcGwtPnN0YXR1cyAmIElQU19VU0VSU1BBQ0VfSEVMUEVSKSB7CisJCQloZWxwID0gbmZfY3RfaGVscGVyX2V4dF9hZGQoY3QsIGZsYWdzKTsKKwkJCWlmIChoZWxwID09IE5VTEwpIHsKKwkJCQlyZXQgPSAtRU5PTUVNOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJcmN1X2Fzc2lnbl9wb2ludGVyKGhlbHAtPmhlbHBlciwgTlVMTCk7CisJCQlfX3NldF9iaXQoSVBTX1VTRVJTUEFDRV9IRUxQRVJfQklULCAmY3QtPnN0YXR1cyk7CisJCQlyZXQgPSAwOworCQkJZ290byBvdXQ7CisJCX0KIAkJaGVscCA9IG5mY3RfaGVscCh0bXBsKTsKIAkJaWYgKGhlbHAgIT0gTlVMTCkKIAkJCWhlbHBlciA9IGhlbHAtPmhlbHBlcjsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX25ldGxpbmsuYwppbmRleCBlNThhYTliLi5lMDdkYzNhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19uZXRsaW5rLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfbmV0bGluay5jCkBAIC00LDcgKzQsNyBAQAogICogKEMpIDIwMDEgYnkgSmF5IFNjaHVsaXN0IDxqc2NobHN0QHNhbWJhLm9yZz4KICAqIChDKSAyMDAyLTIwMDYgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KICAqIChDKSAyMDAzIGJ5IFBhdHJpY2sgTWNoYXJkeSA8a2FiZXJAdHJhc2gubmV0PgotICogKEMpIDIwMDUtMjAwOCBieSBQYWJsbyBOZWlyYSBBeXVzbyA8cGFibG9AbmV0ZmlsdGVyLm9yZz4KKyAqIChDKSAyMDA1LTIwMTEgYnkgUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQG5ldGZpbHRlci5vcmc+CiAgKgogICogSW5pdGlhbCBjb25uZWN0aW9uIHRyYWNraW5nIHZpYSBuZXRsaW5rIGRldmVsb3BtZW50IGZ1bmRlZCBhbmQKICAqIGdlbmVyYWxseSBtYWRlIHBvc3NpYmxlIGJ5IE5ldHdvcmsgUm9ib3RzLCBJbmMuICh3d3cubmV0d29ya3JvYm90cy5jb20pCkBAIC0xMzUsNyArMTM1LDcgQEAKIHN0YXRpYyBpbmxpbmUgaW50CiBjdG5ldGxpbmtfZHVtcF90aW1lb3V0KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCkKIHsKLQlsb25nIHRpbWVvdXQgPSAoY3QtPnRpbWVvdXQuZXhwaXJlcyAtIGppZmZpZXMpIC8gSFo7CisJbG9uZyB0aW1lb3V0ID0gKChsb25nKWN0LT50aW1lb3V0LmV4cGlyZXMgLSAobG9uZylqaWZmaWVzKSAvIEhaOwogCiAJaWYgKHRpbWVvdXQgPCAwKQogCQl0aW1lb3V0ID0gMDsKQEAgLTIwMywyNSArMjAzLDE4IEBACiB9CiAKIHN0YXRpYyBpbnQKLWN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwKLQkJCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIpCitkdW1wX2NvdW50ZXJzKHN0cnVjdCBza19idWZmICpza2IsIHU2NCBwa3RzLCB1NjQgYnl0ZXMsCisJICAgICAgZW51bSBpcF9jb25udHJhY2tfZGlyIGRpcikKIHsKIAllbnVtIGN0YXR0cl90eXBlIHR5cGUgPSBkaXIgPyBDVEFfQ09VTlRFUlNfUkVQTFk6IENUQV9DT1VOVEVSU19PUklHOwogCXN0cnVjdCBubGF0dHIgKm5lc3RfY291bnQ7Ci0JY29uc3Qgc3RydWN0IG5mX2Nvbm5fY291bnRlciAqYWNjdDsKLQotCWFjY3QgPSBuZl9jb25uX2FjY3RfZmluZChjdCk7Ci0JaWYgKCFhY2N0KQotCQlyZXR1cm4gMDsKIAogCW5lc3RfY291bnQgPSBubGFfbmVzdF9zdGFydChza2IsIHR5cGUgfCBOTEFfRl9ORVNURUQpOwogCWlmICghbmVzdF9jb3VudCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CiAKLQlOTEFfUFVUX0JFNjQoc2tiLCBDVEFfQ09VTlRFUlNfUEFDS0VUUywKLQkJICAgICBjcHVfdG9fYmU2NChhY2N0W2Rpcl0ucGFja2V0cykpOwotCU5MQV9QVVRfQkU2NChza2IsIENUQV9DT1VOVEVSU19CWVRFUywKLQkJICAgICBjcHVfdG9fYmU2NChhY2N0W2Rpcl0uYnl0ZXMpKTsKKwlOTEFfUFVUX0JFNjQoc2tiLCBDVEFfQ09VTlRFUlNfUEFDS0VUUywgY3B1X3RvX2JlNjQocGt0cykpOworCU5MQV9QVVRfQkU2NChza2IsIENUQV9DT1VOVEVSU19CWVRFUywgY3B1X3RvX2JlNjQoYnl0ZXMpKTsKIAogCW5sYV9uZXN0X2VuZChza2IsIG5lc3RfY291bnQpOwogCkBAIC0yMzIsNiArMjI1LDI3IEBACiB9CiAKIHN0YXRpYyBpbnQKK2N0bmV0bGlua19kdW1wX2NvdW50ZXJzKHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBuZl9jb25uICpjdCwKKwkJCWVudW0gaXBfY29ubnRyYWNrX2RpciBkaXIsIGludCB0eXBlKQoreworCXN0cnVjdCBuZl9jb25uX2NvdW50ZXIgKmFjY3Q7CisJdTY0IHBrdHMsIGJ5dGVzOworCisJYWNjdCA9IG5mX2Nvbm5fYWNjdF9maW5kKGN0KTsKKwlpZiAoIWFjY3QpCisJCXJldHVybiAwOworCisJaWYgKHR5cGUgPT0gSVBDVE5MX01TR19DVF9HRVRfQ1RSWkVSTykgeworCQlwa3RzID0gYXRvbWljNjRfeGNoZygmYWNjdFtkaXJdLnBhY2tldHMsIDApOworCQlieXRlcyA9IGF0b21pYzY0X3hjaGcoJmFjY3RbZGlyXS5ieXRlcywgMCk7CisJfSBlbHNlIHsKKwkJcGt0cyA9IGF0b21pYzY0X3JlYWQoJmFjY3RbZGlyXS5wYWNrZXRzKTsKKwkJYnl0ZXMgPSBhdG9taWM2NF9yZWFkKCZhY2N0W2Rpcl0uYnl0ZXMpOworCX0KKwlyZXR1cm4gZHVtcF9jb3VudGVycyhza2IsIHBrdHMsIGJ5dGVzLCBkaXIpOworfQorCitzdGF0aWMgaW50CiBjdG5ldGxpbmtfZHVtcF90aW1lc3RhbXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG5mX2Nvbm4gKmN0KQogewogCXN0cnVjdCBubGF0dHIgKm5lc3RfY291bnQ7CkBAIC0zOTMsMTUgKzQwNywxNSBAQAogfQogCiBzdGF0aWMgaW50Ci1jdG5ldGxpbmtfZmlsbF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsCi0JCSAgICBpbnQgZXZlbnQsIHN0cnVjdCBuZl9jb25uICpjdCkKK2N0bmV0bGlua19maWxsX2luZm8oc3RydWN0IHNrX2J1ZmYgKnNrYiwgdTMyIHBpZCwgdTMyIHNlcSwgdTMyIHR5cGUsCisJCSAgICBzdHJ1Y3QgbmZfY29ubiAqY3QpCiB7CiAJc3RydWN0IG5sbXNnaGRyICpubGg7CiAJc3RydWN0IG5mZ2VubXNnICpuZm1zZzsKIAlzdHJ1Y3QgbmxhdHRyICpuZXN0X3Bhcm1zOwotCXVuc2lnbmVkIGludCBmbGFncyA9IHBpZCA/IE5MTV9GX01VTFRJIDogMDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBwaWQgPyBOTE1fRl9NVUxUSSA6IDAsIGV2ZW50OwogCi0JZXZlbnQgfD0gTkZOTF9TVUJTWVNfQ1RORVRMSU5LIDw8IDg7CisJZXZlbnQgPSAoTkZOTF9TVUJTWVNfQ1RORVRMSU5LIDw8IDggfCBJUENUTkxfTVNHX0NUX05FVyk7CiAJbmxoID0gbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsIGV2ZW50LCBzaXplb2YoKm5mbXNnKSwgZmxhZ3MpOwogCWlmIChubGggPT0gTlVMTCkKIAkJZ290byBubG1zZ19mYWlsdXJlOwpAQCAtNDMwLDggKzQ0NCw4IEBACiAKIAlpZiAoY3RuZXRsaW5rX2R1bXBfc3RhdHVzKHNrYiwgY3QpIDwgMCB8fAogCSAgICBjdG5ldGxpbmtfZHVtcF90aW1lb3V0KHNrYiwgY3QpIDwgMCB8fAotCSAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwpIDwgMCB8fAotCSAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfUkVQTFkpIDwgMCB8fAorCSAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfT1JJR0lOQUwsIHR5cGUpIDwgMCB8fAorCSAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfUkVQTFksIHR5cGUpIDwgMCB8fAogCSAgICBjdG5ldGxpbmtfZHVtcF90aW1lc3RhbXAoc2tiLCBjdCkgPCAwIHx8CiAJICAgIGN0bmV0bGlua19kdW1wX3Byb3RvaW5mbyhza2IsIGN0KSA8IDAgfHwKIAkgICAgY3RuZXRsaW5rX2R1bXBfaGVscGluZm8oc2tiLCBjdCkgPCAwIHx8CkBAIC02MTIsOCArNjI2LDEwIEBACiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCiAJaWYgKGV2ZW50cyAmICgxIDw8IElQQ1RfREVTVFJPWSkpIHsKLQkJaWYgKGN0bmV0bGlua19kdW1wX2NvdW50ZXJzKHNrYiwgY3QsIElQX0NUX0RJUl9PUklHSU5BTCkgPCAwIHx8Ci0JCSAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LCBJUF9DVF9ESVJfUkVQTFkpIDwgMCB8fAorCQlpZiAoY3RuZXRsaW5rX2R1bXBfY291bnRlcnMoc2tiLCBjdCwKKwkJCQkJICAgIElQX0NUX0RJUl9PUklHSU5BTCwgdHlwZSkgPCAwIHx8CisJCSAgICBjdG5ldGxpbmtfZHVtcF9jb3VudGVycyhza2IsIGN0LAorCQkJCQkgICAgSVBfQ1RfRElSX1JFUExZLCB0eXBlKSA8IDAgfHwKIAkJICAgIGN0bmV0bGlua19kdW1wX3RpbWVzdGFtcChza2IsIGN0KSA8IDApCiAJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAl9IGVsc2UgewpAQCAtNzA5LDIwICs3MjUsMTMgQEAKIAkJCX0KIAkJCWlmIChjdG5ldGxpbmtfZmlsbF9pbmZvKHNrYiwgTkVUTElOS19DQihjYi0+c2tiKS5waWQsCiAJCQkJCQljYi0+bmxoLT5ubG1zZ19zZXEsCi0JCQkJCQlJUENUTkxfTVNHX0NUX05FVywgY3QpIDwgMCkgeworCQkJCQkJTkZOTF9NU0dfVFlQRSgKKwkJCQkJCQljYi0+bmxoLT5ubG1zZ190eXBlKSwKKwkJCQkJCWN0KSA8IDApIHsKIAkJCQluZl9jb25udHJhY2tfZ2V0KCZjdC0+Y3RfZ2VuZXJhbCk7CiAJCQkJY2ItPmFyZ3NbMV0gPSAodW5zaWduZWQgbG9uZyljdDsKIAkJCQlnb3RvIG91dDsKIAkJCX0KLQotCQkJaWYgKE5GTkxfTVNHX1RZUEUoY2ItPm5saC0+bmxtc2dfdHlwZSkgPT0KLQkJCQkJCUlQQ1ROTF9NU0dfQ1RfR0VUX0NUUlpFUk8pIHsKLQkJCQlzdHJ1Y3QgbmZfY29ubl9jb3VudGVyICphY2N0OwotCi0JCQkJYWNjdCA9IG5mX2Nvbm5fYWNjdF9maW5kKGN0KTsKLQkJCQlpZiAoYWNjdCkKLQkJCQkJbWVtc2V0KGFjY3QsIDAsIHNpemVvZihzdHJ1Y3QgbmZfY29ubl9jb3VudGVyW0lQX0NUX0RJUl9NQVhdKSk7Ci0JCQl9CiAJCX0KIAkJaWYgKGNiLT5hcmdzWzFdKSB7CiAJCQljYi0+YXJnc1sxXSA9IDA7CkBAIC0xMDAxLDcgKzEwMTAsNyBAQAogCiAJcmN1X3JlYWRfbG9jaygpOwogCWVyciA9IGN0bmV0bGlua19maWxsX2luZm8oc2tiMiwgTkVUTElOS19DQihza2IpLnBpZCwgbmxoLT5ubG1zZ19zZXEsCi0JCQkJICBJUENUTkxfTVNHX0NUX05FVywgY3QpOworCQkJCSAgTkZOTF9NU0dfVFlQRShubGgtPm5sbXNnX3R5cGUpLCBjdCk7CiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAJbmZfY3RfcHV0KGN0KTsKIAlpZiAoZXJyIDw9IDApCkBAIC0xMDg3LDE0ICsxMDk2LDE0IEBACiAKIAlpZiAoY2RhW0NUQV9OQVRfRFNUXSkgewogCQlyZXQgPSBjdG5ldGxpbmtfcGFyc2VfbmF0X3NldHVwKGN0LAotCQkJCQkJSVBfTkFUX01BTklQX0RTVCwKKwkJCQkJCU5GX05BVF9NQU5JUF9EU1QsCiAJCQkJCQljZGFbQ1RBX05BVF9EU1RdKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwogCX0KIAlpZiAoY2RhW0NUQV9OQVRfU1JDXSkgewogCQlyZXQgPSBjdG5ldGxpbmtfcGFyc2VfbmF0X3NldHVwKGN0LAotCQkJCQkJSVBfTkFUX01BTklQX1NSQywKKwkJCQkJCU5GX05BVF9NQU5JUF9TUkMsCiAJCQkJCQljZGFbQ1RBX05BVF9TUkNdKTsKIAkJaWYgKHJldCA8IDApCiAJCQlyZXR1cm4gcmV0OwpAQCAtMTM1OCwxMiArMTM2NywxNSBAQAogCQkJCQkJICAgIG5mX2N0X3Byb3RvbnVtKGN0KSk7CiAJCWlmIChoZWxwZXIgPT0gTlVMTCkgewogCQkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCQlzcGluX3VubG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogI2lmZGVmIENPTkZJR19NT0RVTEVTCiAJCQlpZiAocmVxdWVzdF9tb2R1bGUoIm5mY3QtaGVscGVyLSVzIiwgaGVscG5hbWUpIDwgMCkgeworCQkJCXNwaW5fbG9ja19iaCgmbmZfY29ubnRyYWNrX2xvY2spOwogCQkJCWVyciA9IC1FT1BOT1RTVVBQOwogCQkJCWdvdG8gZXJyMTsKIAkJCX0KIAorCQkJc3Bpbl9sb2NrX2JoKCZuZl9jb25udHJhY2tfbG9jayk7CiAJCQlyY3VfcmVhZF9sb2NrKCk7CiAJCQloZWxwZXIgPSBfX25mX2Nvbm50cmFja19oZWxwZXJfZmluZChoZWxwbmFtZSwKIAkJCQkJCQkgICAgbmZfY3RfbDNudW0oY3QpLApAQCAtMTYzOCw3ICsxNjUwLDcgQEAKIAkJCSAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19leHBlY3QgKmV4cCkKIHsKIAlzdHJ1Y3QgbmZfY29ubiAqbWFzdGVyID0gZXhwLT5tYXN0ZXI7Ci0JbG9uZyB0aW1lb3V0ID0gKGV4cC0+dGltZW91dC5leHBpcmVzIC0gamlmZmllcykgLyBIWjsKKwlsb25nIHRpbWVvdXQgPSAoKGxvbmcpZXhwLT50aW1lb3V0LmV4cGlyZXMgLSAobG9uZylqaWZmaWVzKSAvIEhaOwogCXN0cnVjdCBuZl9jb25uX2hlbHAgKmhlbHA7CiAKIAlpZiAodGltZW91dCA8IDApCkBAIC0xODQ3LDcgKzE4NTksOSBAQAogCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwogCi0JaWYgKGNkYVtDVEFfRVhQRUNUX01BU1RFUl0pCisJaWYgKGNkYVtDVEFfRVhQRUNUX1RVUExFXSkKKwkJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfRVhQRUNUX1RVUExFLCB1Myk7CisJZWxzZSBpZiAoY2RhW0NUQV9FWFBFQ1RfTUFTVEVSXSkKIAkJZXJyID0gY3RuZXRsaW5rX3BhcnNlX3R1cGxlKGNkYSwgJnR1cGxlLCBDVEFfRVhQRUNUX01BU1RFUiwgdTMpOwogCWVsc2UKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODY5LDI1ICsxODgzLDMwIEBACiAKIAllcnIgPSAtRU5PTUVNOwogCXNrYjIgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoc2tiMiA9PSBOVUxMKQorCWlmIChza2IyID09IE5VTEwpIHsKKwkJbmZfY3RfZXhwZWN0X3B1dChleHApOwogCQlnb3RvIG91dDsKKwl9CiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAJZXJyID0gY3RuZXRsaW5rX2V4cF9maWxsX2luZm8oc2tiMiwgTkVUTElOS19DQihza2IpLnBpZCwKIAkJCQkgICAgICBubGgtPm5sbXNnX3NlcSwgSVBDVE5MX01TR19FWFBfTkVXLCBleHApOwogCXJjdV9yZWFkX3VubG9jaygpOworCW5mX2N0X2V4cGVjdF9wdXQoZXhwKTsKIAlpZiAoZXJyIDw9IDApCiAJCWdvdG8gZnJlZTsKIAotCW5mX2N0X2V4cGVjdF9wdXQoZXhwKTsKKwllcnIgPSBuZXRsaW5rX3VuaWNhc3QoY3RubCwgc2tiMiwgTkVUTElOS19DQihza2IpLnBpZCwgTVNHX0RPTlRXQUlUKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBvdXQ7CiAKLQlyZXR1cm4gbmV0bGlua191bmljYXN0KGN0bmwsIHNrYjIsIE5FVExJTktfQ0Ioc2tiKS5waWQsIE1TR19ET05UV0FJVCk7CisJcmV0dXJuIDA7CiAKIGZyZWU6CiAJa2ZyZWVfc2tiKHNrYjIpOwogb3V0OgotCW5mX2N0X2V4cGVjdF9wdXQoZXhwKTsKLQlyZXR1cm4gZXJyOworCS8qIHRoaXMgYXZvaWRzIGEgbG9vcCBpbiBuZm5ldGxpbmsuICovCisJcmV0dXJuIGVyciA9PSAtRUFHQUlOID8gLUVOT0JVRlMgOiBlcnI7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTIwMjMsNiArMjA0MiwxMCBAQAogCX0KIAloZWxwID0gbmZjdF9oZWxwKGN0KTsKIAlpZiAoIWhlbHApIHsKKwkJZXJyID0gLUVPUE5PVFNVUFA7CisJCWdvdG8gb3V0OworCX0KKwlpZiAodGVzdF9iaXQoSVBTX1VTRVJTUEFDRV9IRUxQRVJfQklULCAmY3QtPnN0YXR1cykpIHsKIAkJaWYgKCFjZGFbQ1RBX0VYUEVDVF9USU1FT1VUXSkgewogCQkJZXJyID0gLUVJTlZBTDsKIAkJCWdvdG8gb3V0OwpAQCAtMjE2Myw2ICsyMTg2LDU0IEBACiBNT0RVTEVfQUxJQVNfTkZOTF9TVUJTWVMoTkZOTF9TVUJTWVNfQ1RORVRMSU5LKTsKIE1PRFVMRV9BTElBU19ORk5MX1NVQlNZUyhORk5MX1NVQlNZU19DVE5FVExJTktfRVhQKTsKIAorc3RhdGljIGludCBfX25ldF9pbml0IGN0bmV0bGlua19uZXRfaW5pdChzdHJ1Y3QgbmV0ICpuZXQpCit7CisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMKKwlpbnQgcmV0OworCisJcmV0ID0gbmZfY29ubnRyYWNrX3JlZ2lzdGVyX25vdGlmaWVyKG5ldCwgJmN0bmxfbm90aWZpZXIpOworCWlmIChyZXQgPCAwKSB7CisJCXByX2VycigiY3RuZXRsaW5rX2luaXQ6IGNhbm5vdCByZWdpc3RlciBub3RpZmllci5cbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCisJcmV0ID0gbmZfY3RfZXhwZWN0X3JlZ2lzdGVyX25vdGlmaWVyKG5ldCwgJmN0bmxfbm90aWZpZXJfZXhwKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoImN0bmV0bGlua19pbml0OiBjYW5ub3QgZXhwZWN0IHJlZ2lzdGVyIG5vdGlmaWVyLlxuIik7CisJCWdvdG8gZXJyX3VucmVnX25vdGlmaWVyOworCX0KKyNlbmRpZgorCXJldHVybiAwOworCisjaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMKK2Vycl91bnJlZ19ub3RpZmllcjoKKwluZl9jb25udHJhY2tfdW5yZWdpc3Rlcl9ub3RpZmllcihuZXQsICZjdG5sX25vdGlmaWVyKTsKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBjdG5ldGxpbmtfbmV0X2V4aXQoc3RydWN0IG5ldCAqbmV0KQoreworI2lmZGVmIENPTkZJR19ORl9DT05OVFJBQ0tfRVZFTlRTCisJbmZfY3RfZXhwZWN0X3VucmVnaXN0ZXJfbm90aWZpZXIobmV0LCAmY3RubF9ub3RpZmllcl9leHApOworCW5mX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKG5ldCwgJmN0bmxfbm90aWZpZXIpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIF9fbmV0X2V4aXQgY3RuZXRsaW5rX25ldF9leGl0X2JhdGNoKHN0cnVjdCBsaXN0X2hlYWQgKm5ldF9leGl0X2xpc3QpCit7CisJc3RydWN0IG5ldCAqbmV0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShuZXQsIG5ldF9leGl0X2xpc3QsIGV4aXRfbGlzdCkKKwkJY3RuZXRsaW5rX25ldF9leGl0KG5ldCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVybmV0X29wZXJhdGlvbnMgY3RuZXRsaW5rX25ldF9vcHMgPSB7CisJLmluaXQJCT0gY3RuZXRsaW5rX25ldF9pbml0LAorCS5leGl0X2JhdGNoCT0gY3RuZXRsaW5rX25ldF9leGl0X2JhdGNoLAorfTsKKwogc3RhdGljIGludCBfX2luaXQgY3RuZXRsaW5rX2luaXQodm9pZCkKIHsKIAlpbnQgcmV0OwpAQCAtMjE4MCwyOCArMjI1MSwxNSBAQAogCQlnb3RvIGVycl91bnJlZ19zdWJzeXM7CiAJfQogCi0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMKLQlyZXQgPSBuZl9jb25udHJhY2tfcmVnaXN0ZXJfbm90aWZpZXIoJmN0bmxfbm90aWZpZXIpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX2VycigiY3RuZXRsaW5rX2luaXQ6IGNhbm5vdCByZWdpc3RlciBub3RpZmllci5cbiIpOworCWlmIChyZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZjdG5ldGxpbmtfbmV0X29wcykpIHsKKwkJcHJfZXJyKCJjdG5ldGxpbmtfaW5pdDogY2Fubm90IHJlZ2lzdGVyIHBlcm5ldCBvcGVyYXRpb25zXG4iKTsKIAkJZ290byBlcnJfdW5yZWdfZXhwX3N1YnN5czsKIAl9CiAKLQlyZXQgPSBuZl9jdF9leHBlY3RfcmVnaXN0ZXJfbm90aWZpZXIoJmN0bmxfbm90aWZpZXJfZXhwKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl9lcnIoImN0bmV0bGlua19pbml0OiBjYW5ub3QgZXhwZWN0IHJlZ2lzdGVyIG5vdGlmaWVyLlxuIik7Ci0JCWdvdG8gZXJyX3VucmVnX25vdGlmaWVyOwotCX0KLSNlbmRpZgotCiAJcmV0dXJuIDA7CiAKLSNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX0VWRU5UUwotZXJyX3VucmVnX25vdGlmaWVyOgotCW5mX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKCZjdG5sX25vdGlmaWVyKTsKIGVycl91bnJlZ19leHBfc3Vic3lzOgogCW5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3RlcigmY3RubF9leHBfc3Vic3lzKTsKLSNlbmRpZgogZXJyX3VucmVnX3N1YnN5czoKIAluZm5ldGxpbmtfc3Vic3lzX3VucmVnaXN0ZXIoJmN0bmxfc3Vic3lzKTsKIGVycl9vdXQ6CkBAIC0yMjEyLDEyICsyMjcwLDcgQEAKIHsKIAlwcl9pbmZvKCJjdG5ldGxpbms6IHVucmVnaXN0ZXJpbmcgZnJvbSBuZm5ldGxpbmsuXG4iKTsKIAotCW5mX2N0X3JlbW92ZV91c2Vyc3BhY2VfZXhwZWN0YXRpb25zKCk7Ci0jaWZkZWYgQ09ORklHX05GX0NPTk5UUkFDS19FVkVOVFMKLQluZl9jdF9leHBlY3RfdW5yZWdpc3Rlcl9ub3RpZmllcigmY3RubF9ub3RpZmllcl9leHApOwotCW5mX2Nvbm50cmFja191bnJlZ2lzdGVyX25vdGlmaWVyKCZjdG5sX25vdGlmaWVyKTsKLSNlbmRpZgotCisJdW5yZWdpc3Rlcl9wZXJuZXRfc3Vic3lzKCZjdG5ldGxpbmtfbmV0X29wcyk7CiAJbmZuZXRsaW5rX3N1YnN5c191bnJlZ2lzdGVyKCZjdG5sX2V4cF9zdWJzeXMpOwogCW5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3RlcigmY3RubF9zdWJzeXMpOwogfQpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZGNjcC5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZGNjcC5jCmluZGV4IDJlNjY0YTYuLmQ2ZGRlNmQgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2RjY3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19kY2NwLmMKQEAgLTYyOSw3ICs2MjksNyBAQAogCXJldHVybiBzZXFfcHJpbnRmKHMsICIlcyAiLCBkY2NwX3N0YXRlX25hbWVzW2N0LT5wcm90by5kY2NwLnN0YXRlXSk7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DVF9ORVRMSU5LKQogc3RhdGljIGludCBkY2NwX3RvX25sYXR0cihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmxhdHRyICpubGEsCiAJCQkgIHN0cnVjdCBuZl9jb25uICpjdCkKIHsKQEAgLTc3MCw3ICs3NzAsNyBAQAogCS5lcnJvcgkJCT0gZGNjcF9lcnJvciwKIAkucHJpbnRfdHVwbGUJCT0gZGNjcF9wcmludF90dXBsZSwKIAkucHJpbnRfY29ubnRyYWNrCT0gZGNjcF9wcmludF9jb25udHJhY2ssCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ1RfTkVUTElOSykKIAkudG9fbmxhdHRyCQk9IGRjY3BfdG9fbmxhdHRyLAogCS5ubGF0dHJfc2l6ZQkJPSBkY2NwX25sYXR0cl9zaXplLAogCS5mcm9tX25sYXR0cgkJPSBubGF0dHJfdG9fZGNjcCwKQEAgLTc5Miw3ICs3OTIsNyBAQAogCS5lcnJvcgkJCT0gZGNjcF9lcnJvciwKIAkucHJpbnRfdHVwbGUJCT0gZGNjcF9wcmludF90dXBsZSwKIAkucHJpbnRfY29ubnRyYWNrCT0gZGNjcF9wcmludF9jb25udHJhY2ssCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ1RfTkVUTElOSykKIAkudG9fbmxhdHRyCQk9IGRjY3BfdG9fbmxhdHRyLAogCS5ubGF0dHJfc2l6ZQkJPSBkY2NwX25sYXR0cl9zaXplLAogCS5mcm9tX25sYXR0cgkJPSBubGF0dHJfdG9fZGNjcCwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX2dyZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKaW5kZXggZDY5ZmFjZC4uZjAzMzg3OSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKKysrIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fZ3JlLmMKQEAgLTI5MSw3ICsyOTEsNyBAQAogCS5uZXcJCSA9IGdyZV9uZXcsCiAJLmRlc3Ryb3kJID0gZ3JlX2Rlc3Ryb3ksCiAJLm1lIAkJID0gVEhJU19NT0RVTEUsCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ1RfTkVUTElOSykKIAkudHVwbGVfdG9fbmxhdHRyID0gbmZfY3RfcG9ydF90dXBsZV90b19ubGF0dHIsCiAJLm5sYXR0cl90dXBsZV9zaXplID0gbmZfY3RfcG9ydF9ubGF0dHJfdHVwbGVfc2l6ZSwKIAkubmxhdHRyX3RvX3R1cGxlID0gbmZfY3RfcG9ydF9ubGF0dHJfdG9fdHVwbGUsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b19zY3RwLmMKaW5kZXggNjc3MmIxMS4uYWZhNjkxMyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fc2N0cC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3NjdHAuYwpAQCAtNDYxLDcgKzQ2MSw3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DVF9ORVRMSU5LKQogCiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci9uZm5ldGxpbmtfY29ubnRyYWNrLmg+CkBAIC02NjYsNyArNjY2LDcgQEAKIAkucGFja2V0IAkJPSBzY3RwX3BhY2tldCwKIAkubmV3IAkJCT0gc2N0cF9uZXcsCiAJLm1lIAkJCT0gVEhJU19NT0RVTEUsCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ1RfTkVUTElOSykKIAkudG9fbmxhdHRyCQk9IHNjdHBfdG9fbmxhdHRyLAogCS5ubGF0dHJfc2l6ZQkJPSBzY3RwX25sYXR0cl9zaXplLAogCS5mcm9tX25sYXR0cgkJPSBubGF0dHJfdG9fc2N0cCwKQEAgLTY5Niw3ICs2OTYsNyBAQAogCS5wYWNrZXQgCQk9IHNjdHBfcGFja2V0LAogCS5uZXcgCQkJPSBzY3RwX25ldywKIAkubWUgCQkJPSBUSElTX01PRFVMRSwKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DVF9ORVRMSU5LKQogCS50b19ubGF0dHIJCT0gc2N0cF90b19ubGF0dHIsCiAJLm5sYXR0cl9zaXplCQk9IHNjdHBfbmxhdHRyX3NpemUsCiAJLmZyb21fbmxhdHRyCQk9IG5sYXR0cl90b19zY3RwLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdGNwLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwppbmRleCA4MjM1Yjg2Li45N2I5ZjNlIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b190Y3AuYwpAQCAtMTEyNiw3ICsxMTI2LDcgQEAKIAlyZXR1cm4gdHJ1ZTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTkspIHx8IGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTktfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NUX05FVExJTkspCiAKICNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19jb25udHJhY2suaD4KQEAgLTE0NDcsNyArMTQ0Nyw3IEBACiAJLnBhY2tldCAJCT0gdGNwX3BhY2tldCwKIAkubmV3IAkJCT0gdGNwX25ldywKIAkuZXJyb3IJCQk9IHRjcF9lcnJvciwKLSNpZiBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DVF9ORVRMSU5LX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DVF9ORVRMSU5LKQogCS50b19ubGF0dHIJCT0gdGNwX3RvX25sYXR0ciwKIAkubmxhdHRyX3NpemUJCT0gdGNwX25sYXR0cl9zaXplLAogCS5mcm9tX25sYXR0cgkJPSBubGF0dHJfdG9fdGNwLApAQCAtMTQ3OSw3ICsxNDc5LDcgQEAKIAkucGFja2V0IAkJPSB0Y3BfcGFja2V0LAogCS5uZXcgCQkJPSB0Y3BfbmV3LAogCS5lcnJvcgkJCT0gdGNwX2Vycm9yLAotI2lmIGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTkspIHx8IGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTktfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NUX05FVExJTkspCiAJLnRvX25sYXR0cgkJPSB0Y3BfdG9fbmxhdHRyLAogCS5ubGF0dHJfc2l6ZQkJPSB0Y3BfbmxhdHRyX3NpemUsCiAJLmZyb21fbmxhdHRyCQk9IG5sYXR0cl90b190Y3AsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHAuYyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCmluZGV4IDgyODkwODguLjVmMzU3NTcgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcC5jCkBAIC0xODgsNyArMTg4LDcgQEAKIAkucGFja2V0CQkJPSB1ZHBfcGFja2V0LAogCS5uZXcJCQk9IHVkcF9uZXcsCiAJLmVycm9yCQkJPSB1ZHBfZXJyb3IsCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ1RfTkVUTElOSykKIAkudHVwbGVfdG9fbmxhdHRyCT0gbmZfY3RfcG9ydF90dXBsZV90b19ubGF0dHIsCiAJLm5sYXR0cl90b190dXBsZQk9IG5mX2N0X3BvcnRfbmxhdHRyX3RvX3R1cGxlLAogCS5ubGF0dHJfdHVwbGVfc2l6ZQk9IG5mX2N0X3BvcnRfbmxhdHRyX3R1cGxlX3NpemUsCkBAIC0yMTYsNyArMjE2LDcgQEAKIAkucGFja2V0CQkJPSB1ZHBfcGFja2V0LAogCS5uZXcJCQk9IHVkcF9uZXcsCiAJLmVycm9yCQkJPSB1ZHBfZXJyb3IsCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ1RfTkVUTElOS19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTkZfQ1RfTkVUTElOSykKIAkudHVwbGVfdG9fbmxhdHRyCT0gbmZfY3RfcG9ydF90dXBsZV90b19ubGF0dHIsCiAJLm5sYXR0cl90b190dXBsZQk9IG5mX2N0X3BvcnRfbmxhdHRyX3RvX3R1cGxlLAogCS5ubGF0dHJfdHVwbGVfc2l6ZQk9IG5mX2N0X3BvcnRfbmxhdHRyX3R1cGxlX3NpemUsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHBsaXRlLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19wcm90b191ZHBsaXRlLmMKaW5kZXggMjYzYjVhNy4uZjUyY2ExMSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfcHJvdG9fdWRwbGl0ZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3Byb3RvX3VkcGxpdGUuYwpAQCAtMTc0LDcgKzE3NCw3IEBACiAJLnBhY2tldAkJCT0gdWRwbGl0ZV9wYWNrZXQsCiAJLm5ldwkJCT0gdWRwbGl0ZV9uZXcsCiAJLmVycm9yCQkJPSB1ZHBsaXRlX2Vycm9yLAotI2lmIGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTkspIHx8IGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTktfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NUX05FVExJTkspCiAJLnR1cGxlX3RvX25sYXR0cgk9IG5mX2N0X3BvcnRfdHVwbGVfdG9fbmxhdHRyLAogCS5ubGF0dHJfdHVwbGVfc2l6ZQk9IG5mX2N0X3BvcnRfbmxhdHRyX3R1cGxlX3NpemUsCiAJLm5sYXR0cl90b190dXBsZQk9IG5mX2N0X3BvcnRfbmxhdHRyX3RvX3R1cGxlLApAQCAtMTk4LDcgKzE5OCw3IEBACiAJLnBhY2tldAkJCT0gdWRwbGl0ZV9wYWNrZXQsCiAJLm5ldwkJCT0gdWRwbGl0ZV9uZXcsCiAJLmVycm9yCQkJPSB1ZHBsaXRlX2Vycm9yLAotI2lmIGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTkspIHx8IGRlZmluZWQoQ09ORklHX05GX0NUX05FVExJTktfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NUX05FVExJTkspCiAJLnR1cGxlX3RvX25sYXR0cgk9IG5mX2N0X3BvcnRfdHVwbGVfdG9fbmxhdHRyLAogCS5ubGF0dHJfdHVwbGVfc2l6ZQk9IG5mX2N0X3BvcnRfbmxhdHRyX3R1cGxlX3NpemUsCiAJLm5sYXR0cl90b190dXBsZQk9IG5mX2N0X3BvcnRfbmxhdHRyX3RvX3R1cGxlLApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jIGIvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfc3RhbmRhbG9uZS5jCmluZGV4IDA1ZTlmZWIuLjg4NWY1YWIgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3N0YW5kYWxvbmUuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja19zdGFuZGFsb25lLmMKQEAgLTM0LDcgKzM0LDcgQEAKIAogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCi0jaWZkZWYgQ09ORklHX1BST0NfRlMKKyNpZmRlZiBDT05GSUdfTkZfQ09OTlRSQUNLX1BST0NGUwogaW50CiBwcmludF90dXBsZShzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIGNvbnN0IHN0cnVjdCBuZl9jb25udHJhY2tfdHVwbGUgKnR1cGxlLAogICAgICAgICAgICAgY29uc3Qgc3RydWN0IG5mX2Nvbm50cmFja19sM3Byb3RvICpsM3Byb3RvLApAQCAtMzk2LDcgKzM5Niw3IEBACiBzdGF0aWMgdm9pZCBuZl9jb25udHJhY2tfc3RhbmRhbG9uZV9maW5pX3Byb2Moc3RydWN0IG5ldCAqbmV0KQogewogfQotI2VuZGlmIC8qIENPTkZJR19QUk9DX0ZTICovCisjZW5kaWYgLyogQ09ORklHX05GX0NPTk5UUkFDS19QUk9DRlMgKi8KIAogLyogU3lzY3RsIHN1cHBvcnQgKi8KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZl9jb25udHJhY2tfdGltZXN0YW1wLmMgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190aW1lc3RhbXAuYwppbmRleCBhZjdkZDMxLi5lOGQyN2FmIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190aW1lc3RhbXAuYworKysgYi9uZXQvbmV0ZmlsdGVyL25mX2Nvbm50cmFja190aW1lc3RhbXAuYwpAQCAtMTUsNyArMTUsNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX2V4dGVuZC5oPgogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrX3RpbWVzdGFtcC5oPgogCi1zdGF0aWMgaW50IG5mX2N0X3RzdGFtcCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGJvb2wgbmZfY3RfdHN0YW1wIF9fcmVhZF9tb3N0bHk7CiAKIG1vZHVsZV9wYXJhbV9uYW1lZCh0c3RhbXAsIG5mX2N0X3RzdGFtcCwgYm9vbCwgMDY0NCk7CiBNT0RVTEVfUEFSTV9ERVNDKHRzdGFtcCwgIkVuYWJsZSBjb25uZWN0aW9uIHRyYWNraW5nIGZsb3cgdGltZXN0YW1waW5nLiIpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5jIGIvbmV0L25ldGZpbHRlci9uZm5ldGxpbmtfYWNjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmEwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0LmMKQEAgLTAsMCArMSwzNjEgQEAKKy8qCisgKiAoQykgMjAxMSBQYWJsbyBOZWlyYSBBeXVzbyA8cGFibG9AbmV0ZmlsdGVyLm9yZz4KKyAqIChDKSAyMDExIEludHJhMm5ldCBBRyA8aHR0cDovL3d3dy5pbnRyYTJuZXQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gKG9yIGFueSBsYXRlciBhdCB5b3VyIG9wdGlvbikuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L3NvY2suaD4KKyNpbmNsdWRlIDxhc20vYXRvbWljLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL25mbmV0bGlua19hY2N0Lmg+CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIlBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJuZmFjY3Q6IEV4dGVuZGVkIE5ldGZpbHRlciBhY2NvdW50aW5nIGluZnJhc3RydWN0dXJlIik7CisKK3N0YXRpYyBMSVNUX0hFQUQobmZubF9hY2N0X2xpc3QpOworCitzdHJ1Y3QgbmZfYWNjdCB7CisJYXRvbWljNjRfdAkJcGt0czsKKwlhdG9taWM2NF90CQlieXRlczsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWhlYWQ7CisJYXRvbWljX3QJCXJlZmNudDsKKwljaGFyCQkJbmFtZVtORkFDQ1RfTkFNRV9NQVhdOworCXN0cnVjdCByY3VfaGVhZAkJcmN1X2hlYWQ7Cit9OworCitzdGF0aWMgaW50CituZm5sX2FjY3RfbmV3KHN0cnVjdCBzb2NrICpuZm5sLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCSAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsIGNvbnN0IHN0cnVjdCBubGF0dHIgKiBjb25zdCB0YltdKQoreworCXN0cnVjdCBuZl9hY2N0ICpuZmFjY3QsICptYXRjaGluZyA9IE5VTEw7CisJY2hhciAqYWNjdF9uYW1lOworCisJaWYgKCF0YltORkFDQ1RfTkFNRV0pCisJCXJldHVybiAtRUlOVkFMOworCisJYWNjdF9uYW1lID0gbmxhX2RhdGEodGJbTkZBQ0NUX05BTUVdKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobmZhY2N0LCAmbmZubF9hY2N0X2xpc3QsIGhlYWQpIHsKKwkJaWYgKHN0cm5jbXAobmZhY2N0LT5uYW1lLCBhY2N0X25hbWUsIE5GQUNDVF9OQU1FX01BWCkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9FWENMKQorCQkJcmV0dXJuIC1FRVhJU1Q7CisKKwkJbWF0Y2hpbmcgPSBuZmFjY3Q7CisJCWJyZWFrOworICAgICAgICB9CisKKwlpZiAobWF0Y2hpbmcpIHsKKwkJaWYgKG5saC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9SRVBMQUNFKSB7CisJCQkvKiByZXNldCBjb3VudGVycyBpZiB5b3UgcmVxdWVzdCBhIHJlcGxhY2VtZW50LiAqLworCQkJYXRvbWljNjRfc2V0KCZtYXRjaGluZy0+cGt0cywgMCk7CisJCQlhdG9taWM2NF9zZXQoJm1hdGNoaW5nLT5ieXRlcywgMCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW5mYWNjdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZl9hY2N0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5mYWNjdCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0cm5jcHkobmZhY2N0LT5uYW1lLCBubGFfZGF0YSh0YltORkFDQ1RfTkFNRV0pLCBORkFDQ1RfTkFNRV9NQVgpOworCisJaWYgKHRiW05GQUNDVF9CWVRFU10pIHsKKwkJYXRvbWljNjRfc2V0KCZuZmFjY3QtPmJ5dGVzLAorCQkJICAgICBiZTY0X3RvX2NwdShubGFfZ2V0X3U2NCh0YltORkFDQ1RfQllURVNdKSkpOworCX0KKwlpZiAodGJbTkZBQ0NUX1BLVFNdKSB7CisJCWF0b21pYzY0X3NldCgmbmZhY2N0LT5wa3RzLAorCQkJICAgICBiZTY0X3RvX2NwdShubGFfZ2V0X3U2NCh0YltORkFDQ1RfUEtUU10pKSk7CisJfQorCWF0b21pY19zZXQoJm5mYWNjdC0+cmVmY250LCAxKTsKKwlsaXN0X2FkZF90YWlsX3JjdSgmbmZhY2N0LT5oZWFkLCAmbmZubF9hY2N0X2xpc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CituZm5sX2FjY3RfZmlsbF9pbmZvKHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsIHUzMiBzZXEsIHUzMiB0eXBlLAorCQkgICBpbnQgZXZlbnQsIHN0cnVjdCBuZl9hY2N0ICphY2N0KQoreworCXN0cnVjdCBubG1zZ2hkciAqbmxoOworCXN0cnVjdCBuZmdlbm1zZyAqbmZtc2c7CisJdW5zaWduZWQgaW50IGZsYWdzID0gcGlkID8gTkxNX0ZfTVVMVEkgOiAwOworCXU2NCBwa3RzLCBieXRlczsKKworCWV2ZW50IHw9IE5GTkxfU1VCU1lTX0FDQ1QgPDwgODsKKwlubGggPSBubG1zZ19wdXQoc2tiLCBwaWQsIHNlcSwgZXZlbnQsIHNpemVvZigqbmZtc2cpLCBmbGFncyk7CisJaWYgKG5saCA9PSBOVUxMKQorCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CisKKwluZm1zZyA9IG5sbXNnX2RhdGEobmxoKTsKKwluZm1zZy0+bmZnZW5fZmFtaWx5ID0gQUZfVU5TUEVDOworCW5mbXNnLT52ZXJzaW9uID0gTkZORVRMSU5LX1YwOworCW5mbXNnLT5yZXNfaWQgPSAwOworCisJTkxBX1BVVF9TVFJJTkcoc2tiLCBORkFDQ1RfTkFNRSwgYWNjdC0+bmFtZSk7CisKKwlpZiAodHlwZSA9PSBORk5MX01TR19BQ0NUX0dFVF9DVFJaRVJPKSB7CisJCXBrdHMgPSBhdG9taWM2NF94Y2hnKCZhY2N0LT5wa3RzLCAwKTsKKwkJYnl0ZXMgPSBhdG9taWM2NF94Y2hnKCZhY2N0LT5ieXRlcywgMCk7CisJfSBlbHNlIHsKKwkJcGt0cyA9IGF0b21pYzY0X3JlYWQoJmFjY3QtPnBrdHMpOworCQlieXRlcyA9IGF0b21pYzY0X3JlYWQoJmFjY3QtPmJ5dGVzKTsKKwl9CisJTkxBX1BVVF9CRTY0KHNrYiwgTkZBQ0NUX1BLVFMsIGNwdV90b19iZTY0KHBrdHMpKTsKKwlOTEFfUFVUX0JFNjQoc2tiLCBORkFDQ1RfQllURVMsIGNwdV90b19iZTY0KGJ5dGVzKSk7CisJTkxBX1BVVF9CRTMyKHNrYiwgTkZBQ0NUX1VTRSwgaHRvbmwoYXRvbWljX3JlYWQoJmFjY3QtPnJlZmNudCkpKTsKKworCW5sbXNnX2VuZChza2IsIG5saCk7CisJcmV0dXJuIHNrYi0+bGVuOworCitubG1zZ19mYWlsdXJlOgorbmxhX3B1dF9mYWlsdXJlOgorCW5sbXNnX2NhbmNlbChza2IsIG5saCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50CituZm5sX2FjY3RfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IG5mX2FjY3QgKmN1ciwgKmxhc3Q7CisKKwlpZiAoY2ItPmFyZ3NbMl0pCisJCXJldHVybiAwOworCisJbGFzdCA9IChzdHJ1Y3QgbmZfYWNjdCAqKWNiLT5hcmdzWzFdOworCWlmIChjYi0+YXJnc1sxXSkKKwkJY2ItPmFyZ3NbMV0gPSAwOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGN1ciwgJm5mbmxfYWNjdF9saXN0LCBoZWFkKSB7CisJCWlmIChsYXN0ICYmIGN1ciAhPSBsYXN0KQorCQkJY29udGludWU7CisKKwkJaWYgKG5mbmxfYWNjdF9maWxsX2luZm8oc2tiLCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwKKwkJCQkgICAgICAgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCSAgICAgICBORk5MX01TR19UWVBFKGNiLT5ubGgtPm5sbXNnX3R5cGUpLAorCQkJCSAgICAgICBORk5MX01TR19BQ0NUX05FVywgY3VyKSA8IDApIHsKKwkJCWNiLT5hcmdzWzFdID0gKHVuc2lnbmVkIGxvbmcpY3VyOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKCFjYi0+YXJnc1sxXSkKKwkJY2ItPmFyZ3NbMl0gPSAxOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIGludAorbmZubF9hY2N0X2dldChzdHJ1Y3Qgc29jayAqbmZubCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgIGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbmxoLCBjb25zdCBzdHJ1Y3QgbmxhdHRyICogY29uc3QgdGJbXSkKK3sKKwlpbnQgcmV0ID0gLUVOT0VOVDsKKwlzdHJ1Y3QgbmZfYWNjdCAqY3VyOworCWNoYXIgKmFjY3RfbmFtZTsKKworCWlmIChubGgtPm5sbXNnX2ZsYWdzICYgTkxNX0ZfRFVNUCkgeworCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KG5mbmwsIHNrYiwgbmxoLCBuZm5sX2FjY3RfZHVtcCwKKwkJCQkJICBOVUxMLCAwKTsKKwl9CisKKwlpZiAoIXRiW05GQUNDVF9OQU1FXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJYWNjdF9uYW1lID0gbmxhX2RhdGEodGJbTkZBQ0NUX05BTUVdKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyLCAmbmZubF9hY2N0X2xpc3QsIGhlYWQpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnNrYjI7CisKKwkJaWYgKHN0cm5jbXAoY3VyLT5uYW1lLCBhY2N0X25hbWUsIE5GQUNDVF9OQU1FX01BWCkhPSAwKQorCQkJY29udGludWU7CisKKwkJc2tiMiA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOworCQlpZiAoc2tiMiA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVNOworCQkJYnJlYWs7CisJCX0KKworCQlyZXQgPSBuZm5sX2FjY3RfZmlsbF9pbmZvKHNrYjIsIE5FVExJTktfQ0Ioc2tiKS5waWQsCisJCQkJCSBubGgtPm5sbXNnX3NlcSwKKwkJCQkJIE5GTkxfTVNHX1RZUEUobmxoLT5ubG1zZ190eXBlKSwKKwkJCQkJIE5GTkxfTVNHX0FDQ1RfTkVXLCBjdXIpOworCQlpZiAocmV0IDw9IDApIHsKKwkJCWtmcmVlX3NrYihza2IyKTsKKwkJCWJyZWFrOworCQl9CisJCXJldCA9IG5ldGxpbmtfdW5pY2FzdChuZm5sLCBza2IyLCBORVRMSU5LX0NCKHNrYikucGlkLAorCQkJCQlNU0dfRE9OVFdBSVQpOworCQlpZiAocmV0ID4gMCkKKwkJCXJldCA9IDA7CisKKwkJLyogdGhpcyBhdm9pZHMgYSBsb29wIGluIG5mbmV0bGluay4gKi8KKwkJcmV0dXJuIHJldCA9PSAtRUFHQUlOID8gLUVOT0JVRlMgOiByZXQ7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qIHRyeSB0byBkZWxldGUgb2JqZWN0LCBmYWlsIGlmIGl0IGlzIHN0aWxsIGluIHVzZS4gKi8KK3N0YXRpYyBpbnQgbmZubF9hY2N0X3RyeV9kZWwoc3RydWN0IG5mX2FjY3QgKmN1cikKK3sKKwlpbnQgcmV0ID0gMDsKKworCS8qIHdlIHdhbnQgdG8gYXZvaWQgcmFjZXMgd2l0aCBuZm5sX2FjY3RfZmluZF9nZXQuICovCisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmN1ci0+cmVmY250KSkgeworCQkvKiBXZSBhcmUgcHJvdGVjdGVkIGJ5IG5mbmwgbXV0ZXguICovCisJCWxpc3RfZGVsX3JjdSgmY3VyLT5oZWFkKTsKKwkJa2ZyZWVfcmN1KGN1ciwgcmN1X2hlYWQpOworCX0gZWxzZSB7CisJCS8qIHN0aWxsIGluIHVzZSwgcmVzdG9yZSByZWZlcmVuY2UgY291bnRlci4gKi8KKwkJYXRvbWljX2luYygmY3VyLT5yZWZjbnQpOworCQlyZXQgPSAtRUJVU1k7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK25mbmxfYWNjdF9kZWwoc3RydWN0IHNvY2sgKm5mbmwsIHN0cnVjdCBza19idWZmICpza2IsCisJICAgICBjb25zdCBzdHJ1Y3Qgbmxtc2doZHIgKm5saCwgY29uc3Qgc3RydWN0IG5sYXR0ciAqIGNvbnN0IHRiW10pCit7CisJY2hhciAqYWNjdF9uYW1lOworCXN0cnVjdCBuZl9hY2N0ICpjdXI7CisJaW50IHJldCA9IC1FTk9FTlQ7CisKKwlpZiAoIXRiW05GQUNDVF9OQU1FXSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1ciwgJm5mbmxfYWNjdF9saXN0LCBoZWFkKQorCQkJbmZubF9hY2N0X3RyeV9kZWwoY3VyKTsKKworCQlyZXR1cm4gMDsKKwl9CisJYWNjdF9uYW1lID0gbmxhX2RhdGEodGJbTkZBQ0NUX05BTUVdKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY3VyLCAmbmZubF9hY2N0X2xpc3QsIGhlYWQpIHsKKwkJaWYgKHN0cm5jbXAoY3VyLT5uYW1lLCBhY2N0X25hbWUsIE5GQUNDVF9OQU1FX01BWCkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXJldCA9IG5mbmxfYWNjdF90cnlfZGVsKGN1cik7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKworCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IG5mbmxfYWNjdF9wb2xpY3lbTkZBQ0NUX01BWCsxXSA9IHsKKwlbTkZBQ0NUX05BTUVdID0geyAudHlwZSA9IE5MQV9OVUxfU1RSSU5HLCAubGVuID0gTkZBQ0NUX05BTUVfTUFYLTEgfSwKKwlbTkZBQ0NUX0JZVEVTXSA9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCisJW05GQUNDVF9QS1RTXSA9IHsgLnR5cGUgPSBOTEFfVTY0IH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5mbmxfY2FsbGJhY2sgbmZubF9hY2N0X2NiW05GTkxfTVNHX0FDQ1RfTUFYXSA9IHsKKwlbTkZOTF9NU0dfQUNDVF9ORVddCQk9IHsgLmNhbGwgPSBuZm5sX2FjY3RfbmV3LAorCQkJCQkgICAgLmF0dHJfY291bnQgPSBORkFDQ1RfTUFYLAorCQkJCQkgICAgLnBvbGljeSA9IG5mbmxfYWNjdF9wb2xpY3kgfSwKKwlbTkZOTF9NU0dfQUNDVF9HRVRdIAkJPSB7IC5jYWxsID0gbmZubF9hY2N0X2dldCwKKwkJCQkJICAgIC5hdHRyX2NvdW50ID0gTkZBQ0NUX01BWCwKKwkJCQkJICAgIC5wb2xpY3kgPSBuZm5sX2FjY3RfcG9saWN5IH0sCisJW05GTkxfTVNHX0FDQ1RfR0VUX0NUUlpFUk9dIAk9IHsgLmNhbGwgPSBuZm5sX2FjY3RfZ2V0LAorCQkJCQkgICAgLmF0dHJfY291bnQgPSBORkFDQ1RfTUFYLAorCQkJCQkgICAgLnBvbGljeSA9IG5mbmxfYWNjdF9wb2xpY3kgfSwKKwlbTkZOTF9NU0dfQUNDVF9ERUxdCQk9IHsgLmNhbGwgPSBuZm5sX2FjY3RfZGVsLAorCQkJCQkgICAgLmF0dHJfY291bnQgPSBORkFDQ1RfTUFYLAorCQkJCQkgICAgLnBvbGljeSA9IG5mbmxfYWNjdF9wb2xpY3kgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZuZXRsaW5rX3N1YnN5c3RlbSBuZm5sX2FjY3Rfc3Vic3lzID0geworCS5uYW1lCQkJCT0gImFjY3QiLAorCS5zdWJzeXNfaWQJCQk9IE5GTkxfU1VCU1lTX0FDQ1QsCisJLmNiX2NvdW50CQkJPSBORk5MX01TR19BQ0NUX01BWCwKKwkuY2IJCQkJPSBuZm5sX2FjY3RfY2IsCit9OworCitNT0RVTEVfQUxJQVNfTkZOTF9TVUJTWVMoTkZOTF9TVUJTWVNfQUNDVCk7CisKK3N0cnVjdCBuZl9hY2N0ICpuZm5sX2FjY3RfZmluZF9nZXQoY29uc3QgY2hhciAqYWNjdF9uYW1lKQoreworCXN0cnVjdCBuZl9hY2N0ICpjdXIsICphY2N0ID0gTlVMTDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjdXIsICZuZm5sX2FjY3RfbGlzdCwgaGVhZCkgeworCQlpZiAoc3RybmNtcChjdXItPm5hbWUsIGFjY3RfbmFtZSwgTkZBQ0NUX05BTUVfTUFYKSE9IDApCisJCQljb250aW51ZTsKKworCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKKwkJCWdvdG8gZXJyOworCisJCWlmICghYXRvbWljX2luY19ub3RfemVybygmY3VyLT5yZWZjbnQpKSB7CisJCQltb2R1bGVfcHV0KFRISVNfTU9EVUxFKTsKKwkJCWdvdG8gZXJyOworCQl9CisKKwkJYWNjdCA9IGN1cjsKKwkJYnJlYWs7CisJfQorZXJyOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBhY2N0OworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZubF9hY2N0X2ZpbmRfZ2V0KTsKKwordm9pZCBuZm5sX2FjY3RfcHV0KHN0cnVjdCBuZl9hY2N0ICphY2N0KQoreworCWF0b21pY19kZWMoJmFjY3QtPnJlZmNudCk7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChuZm5sX2FjY3RfcHV0KTsKKwordm9pZCBuZm5sX2FjY3RfdXBkYXRlKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZl9hY2N0ICpuZmFjY3QpCit7CisJYXRvbWljNjRfaW5jKCZuZmFjY3QtPnBrdHMpOworCWF0b21pYzY0X2FkZChza2ItPmxlbiwgJm5mYWNjdC0+Ynl0ZXMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwobmZubF9hY2N0X3VwZGF0ZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IG5mbmxfYWNjdF9pbml0KHZvaWQpCit7CisJaW50IHJldDsKKworCXByX2luZm8oIm5mbmxfYWNjdDogcmVnaXN0ZXJpbmcgd2l0aCBuZm5ldGxpbmsuXG4iKTsKKwlyZXQgPSBuZm5ldGxpbmtfc3Vic3lzX3JlZ2lzdGVyKCZuZm5sX2FjY3Rfc3Vic3lzKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcl9lcnIoIm5mbmxfYWNjdF9pbml0OiBjYW5ub3QgcmVnaXN0ZXIgd2l0aCBuZm5ldGxpbmsuXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKwlyZXR1cm4gMDsKK2Vycl9vdXQ6CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mbmxfYWNjdF9leGl0KHZvaWQpCit7CisJc3RydWN0IG5mX2FjY3QgKmN1ciwgKnRtcDsKKworCXByX2luZm8oIm5mbmxfYWNjdDogdW5yZWdpc3RlcmluZyBmcm9tIG5mbmV0bGluay5cbiIpOworCW5mbmV0bGlua19zdWJzeXNfdW5yZWdpc3RlcigmbmZubF9hY2N0X3N1YnN5cyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3VyLCB0bXAsICZuZm5sX2FjY3RfbGlzdCwgaGVhZCkgeworCQlsaXN0X2RlbF9yY3UoJmN1ci0+aGVhZCk7CisJCS8qIFdlIGFyZSBzdXJlIHRoYXQgb3VyIG9iamVjdHMgaGF2ZSBubyBjbGllbnRzIGF0IHRoaXMgcG9pbnQsCisJCSAqIGl0J3Mgc2FmZSB0byByZWxlYXNlIHRoZW0gYWxsIHdpdGhvdXQgY2hlY2tpbmcgcmVmY250LiAqLworCQlrZnJlZV9yY3UoY3VyLCByY3VfaGVhZCk7CisJfQorfQorCittb2R1bGVfaW5pdChuZm5sX2FjY3RfaW5pdCk7Cittb2R1bGVfZXhpdChuZm5sX2FjY3RfZXhpdCk7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0FVRElULmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0FVRElULmMKaW5kZXggNGJjYTE1YS4uYmE5MjgyNCAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9BVURJVC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQVVESVQuYwpAQCAtOTgsNiArOTgsNyBAQAogCXN0cnVjdCBpcHY2aGRyIF9pcDZoOwogCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppaDsKIAl1OCBuZXh0aGRyOworCV9fYmUxNiBmcmFnX29mZjsKIAlpbnQgb2Zmc2V0OwogCiAJaWggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSwgc2l6ZW9mKF9pcDZoKSwgJl9pcDZoKTsKQEAgLTEwOCw3ICsxMDksNyBAQAogCiAJbmV4dGhkciA9IGloLT5uZXh0aGRyOwogCW9mZnNldCA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSArIHNpemVvZihfaXA2aCksCi0JCQkJICAmbmV4dGhkcik7CisJCQkJICAmbmV4dGhkciwgJmZyYWdfb2ZmKTsKIAogCWF1ZGl0X2xvZ19mb3JtYXQoYWIsICIgc2FkZHI9JXBJNmMgZGFkZHI9JXBJNmMgcHJvdG89JWhodSIsCiAJCQkgJmloLT5zYWRkciwgJmloLT5kYWRkciwgbmV4dGhkcik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X0NULmMgYi9uZXQvbmV0ZmlsdGVyL3h0X0NULmMKaW5kZXggMDIyMWQxMC4uOGU4NzEyMyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9DVC5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfQ1QuYwpAQCAtNjIsOCArNjIsOCBAQAogCWludCByZXQgPSAwOwogCXU4IHByb3RvOwogCi0JaWYgKGluZm8tPmZsYWdzICYgflhUX0NUX05PVFJBQ0spCi0JCXJldHVybiAtRUlOVkFMOworCWlmIChpbmZvLT5mbGFncyAmIH4oWFRfQ1RfTk9UUkFDSyB8IFhUX0NUX1VTRVJTUEFDRV9IRUxQRVIpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAlpZiAoaW5mby0+ZmxhZ3MgJiBYVF9DVF9OT1RSQUNLKSB7CiAJCWN0ID0gbmZfY3RfdW50cmFja2VkX2dldCgpOwpAQCAtOTIsNyArOTIsOSBAQAogCQkJCSAgR0ZQX0tFUk5FTCkpCiAJCWdvdG8gZXJyMzsKIAotCWlmIChpbmZvLT5oZWxwZXJbMF0pIHsKKwlpZiAoaW5mby0+ZmxhZ3MgJiBYVF9DVF9VU0VSU1BBQ0VfSEVMUEVSKSB7CisJCV9fc2V0X2JpdChJUFNfVVNFUlNQQUNFX0hFTFBFUl9CSVQsICZjdC0+c3RhdHVzKTsKKwl9IGVsc2UgaWYgKGluZm8tPmhlbHBlclswXSkgewogCQlyZXQgPSAtRU5PRU5UOwogCQlwcm90byA9IHh0X2N0X2ZpbmRfcHJvdG8ocGFyKTsKIAkJaWYgKCFwcm90bykgewpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9ORlFVRVVFLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X05GUVVFVUUuYwppbmRleCBkNGY0YjVkLi45NTIzN2M4IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X05GUVVFVUUuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X05GUVVFVUUuYwpAQCAtNDksNyArNDksNyBAQAogCXJldHVybiBqaGFzaF8yd29yZHMoKF9fZm9yY2UgdTMyKWlwYWRkciwgaXBoLT5wcm90b2NvbCwgamhhc2hfaW5pdHZhbCk7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX0lQVEFCTEVTKQogc3RhdGljIHUzMiBoYXNoX3Y2KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJY29uc3Qgc3RydWN0IGlwdjZoZHIgKmlwNmggPSBpcHY2X2hkcihza2IpOwpAQCAtNzQsNyArNzQsNyBAQAogCQlpZiAocGFyLT5mYW1pbHkgPT0gTkZQUk9UT19JUFY0KQogCQkJcXVldWUgPSAoKCh1NjQpIGhhc2hfdjQoc2tiKSAqIGluZm8tPnF1ZXVlc190b3RhbCkgPj4KIAkJCQkgMzIpICsgcXVldWU7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykKIAkJZWxzZSBpZiAocGFyLT5mYW1pbHkgPT0gTkZQUk9UT19JUFY2KQogCQkJcXVldWUgPSAoKCh1NjQpIGhhc2hfdjYoc2tiKSAqIGluZm8tPnF1ZXVlc190b3RhbCkgPj4KIAkJCQkgMzIpICsgcXVldWU7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jIGIvbmV0L25ldGZpbHRlci94dF9UQ1BNU1MuYwppbmRleCA5ZTYzYjQzLi4xOTBhZDM3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1RDUE1TUy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVENQTVNTLmMKQEAgLTE2MSw3ICsxNjEsNyBAQAogCQlzdHJ1Y3QgZmxvd2k2ICpmbDYgPSAmZmwudS5pcDY7CiAKIAkJbWVtc2V0KGZsNiwgMCwgc2l6ZW9mKCpmbDYpKTsKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi0+ZGFkZHIsICZpcHY2X2hkcihza2IpLT5zYWRkcik7CisJCWZsNi0+ZGFkZHIgPSBpcHY2X2hkcihza2IpLT5zYWRkcjsKIAl9CiAJcmN1X3JlYWRfbG9jaygpOwogCWFpID0gbmZfZ2V0X2FmaW5mbyhmYW1pbHkpOwpAQCAtMTk4LDE3ICsxOTgsMTggQEAKIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX0lQVEFCTEVTKQogc3RhdGljIHVuc2lnbmVkIGludAogdGNwbXNzX3RnNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIpCiB7CiAJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKIAl1OCBuZXh0aGRyOworCV9fYmUxNiBmcmFnX29mZjsKIAlpbnQgdGNwaG9mZjsKIAlpbnQgcmV0OwogCiAJbmV4dGhkciA9IGlwdjZoLT5uZXh0aGRyOwotCXRjcGhvZmYgPSBpcHY2X3NraXBfZXh0aGRyKHNrYiwgc2l6ZW9mKCppcHY2aCksICZuZXh0aGRyKTsKKwl0Y3Bob2ZmID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZigqaXB2NmgpLCAmbmV4dGhkciwgJmZyYWdfb2ZmKTsKIAlpZiAodGNwaG9mZiA8IDApCiAJCXJldHVybiBORl9EUk9QOwogCXJldCA9IHRjcG1zc19tYW5nbGVfcGFja2V0KHNrYiwgcGFyLT50YXJnaW5mbywKQEAgLTI1OSw3ICsyNjAsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykKIHN0YXRpYyBpbnQgdGNwbXNzX3RnNl9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfdGdjaGtfcGFyYW0gKnBhcikKIHsKIAljb25zdCBzdHJ1Y3QgeHRfdGNwbXNzX2luZm8gKmluZm8gPSBwYXItPnRhcmdpbmZvOwpAQCAtMjkyLDcgKzI5Myw3IEBACiAJCS5wcm90bwkJPSBJUFBST1RPX1RDUCwKIAkJLm1lCQk9IFRISVNfTU9EVUxFLAogCX0sCi0jaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykKIAl7CiAJCS5mYW1pbHkJCT0gTkZQUk9UT19JUFY2LAogCQkubmFtZQkJPSAiVENQTVNTIiwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfVENQT1BUU1RSSVAuYyBiL25ldC9uZXRmaWx0ZXIveHRfVENQT1BUU1RSSVAuYwppbmRleCA5ZGM5ZWNmLi4yNWZkMWM0IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1RDUE9QVFNUUklQLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9UQ1BPUFRTVFJJUC5jCkBAIC04MCwxNiArODAsMTcgQEAKIAkgICAgICAgc2l6ZW9mKHN0cnVjdCBpcGhkcikgKyBzaXplb2Yoc3RydWN0IHRjcGhkcikpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX01BTkdMRSkgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX01BTkdMRV9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX01BTkdMRSkKIHN0YXRpYyB1bnNpZ25lZCBpbnQKIHRjcG9wdHN0cmlwX3RnNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfYWN0aW9uX3BhcmFtICpwYXIpCiB7CiAJc3RydWN0IGlwdjZoZHIgKmlwdjZoID0gaXB2Nl9oZHIoc2tiKTsKIAlpbnQgdGNwaG9mZjsKIAl1X2ludDhfdCBuZXh0aGRyOworCV9fYmUxNiBmcmFnX29mZjsKIAogCW5leHRoZHIgPSBpcHY2aC0+bmV4dGhkcjsKLQl0Y3Bob2ZmID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZigqaXB2NmgpLCAmbmV4dGhkcik7CisJdGNwaG9mZiA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBzaXplb2YoKmlwdjZoKSwgJm5leHRoZHIsICZmcmFnX29mZik7CiAJaWYgKHRjcGhvZmYgPCAwKQogCQlyZXR1cm4gTkZfRFJPUDsKIApAQCAtMTA4LDcgKzEwOSw3IEBACiAJCS50YXJnZXRzaXplID0gc2l6ZW9mKHN0cnVjdCB4dF90Y3BvcHRzdHJpcF90YXJnZXRfaW5mbyksCiAJCS5tZSAgICAgICAgID0gVEhJU19NT0RVTEUsCiAJfSwKLSNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfTUFOR0xFKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfTUFOR0xFX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfTUFOR0xFKQogCXsKIAkJLm5hbWUgICAgICAgPSAiVENQT1BUU1RSSVAiLAogCQkuZmFtaWx5ICAgICA9IE5GUFJPVE9fSVBWNiwKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfVEVFLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X1RFRS5jCmluZGV4IDVmMDU0YTAuLjNhYWU2NmYgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfVEVFLmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9URUUuYwpAQCAtMjUsMTMgKzI1LDEwIEBACiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3hfdGFibGVzLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyL3h0X1RFRS5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX05GX0NPTk5UUkFDSykKICMJZGVmaW5lIFdJVEhfQ09OTlRSQUNLIDEKICMJaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNlbmRpZgotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQotIwlkZWZpbmUgV0lUSF9JUFY2IDEKLSNlbmRpZgogCiBzdHJ1Y3QgeHRfdGVlX3ByaXYgewogCXN0cnVjdCBub3RpZmllcl9ibG9jawlub3RpZmllcjsKQEAgLTEzNiw3ICsxMzMsNyBAQAogCXJldHVybiBYVF9DT05USU5VRTsKIH0KIAotI2lmZGVmIFdJVEhfSVBWNgorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiBzdGF0aWMgYm9vbAogdGVlX3RnX3JvdXRlNihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgeHRfdGVlX3RnaW5mbyAqaW5mbykKIHsKQEAgLTE5Niw3ICsxOTMsNyBAQAogCX0KIAlyZXR1cm4gWFRfQ09OVElOVUU7CiB9Ci0jZW5kaWYgLyogV0lUSF9JUFY2ICovCisjZW5kaWYKIAogc3RhdGljIGludCB0ZWVfbmV0ZGV2X2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwKIAkJCSAgICB2b2lkICpwdHIpCkBAIC0yNzYsNyArMjczLDcgQEAKIAkJLmRlc3Ryb3kgICAgPSB0ZWVfdGdfZGVzdHJveSwKIAkJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKIAl9LAotI2lmZGVmIFdJVEhfSVBWNgorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJewogCQkubmFtZSAgICAgICA9ICJURUUiLAogCQkucmV2aXNpb24gICA9IDEsCmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jIGIvbmV0L25ldGZpbHRlci94dF9UUFJPWFkuYwppbmRleCBkY2ZkNTdlLi4zNWE5NTlhIDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X1RQUk9YWS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfVFBST1hZLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvaXB2NC9uZl9kZWZyYWdfaXB2NC5oPgogCi0jaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykKICNkZWZpbmUgWFRfVFBST1hZX0hBVkVfSVBWNiAxCiAjaW5jbHVkZSA8bmV0L2lmX2luZXQ2Lmg+CiAjaW5jbHVkZSA8bmV0L2FkZHJjb25mLmg+CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2FkZHJ0eXBlLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2FkZHJ0eXBlLmMKaW5kZXggYjc3ZDM4My4uNDljNWZmNyAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9hZGRydHlwZS5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfYWRkcnR5cGUuYwpAQCAtMTYsNyArMTYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX0lQVEFCTEVTKQogI2luY2x1ZGUgPG5ldC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwNl9yb3V0ZS5oPgogI2luY2x1ZGUgPG5ldC9pcDZfZmliLmg+CkBAIC0zMSw3ICszMSw3IEBACiBNT0RVTEVfQUxJQVMoImlwdF9hZGRydHlwZSIpOwogTU9EVUxFX0FMSUFTKCJpcDZ0X2FkZHJ0eXBlIik7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX0lQVEFCTEVTKQogc3RhdGljIHUzMiBtYXRjaF9sb29rdXBfcnQ2KHN0cnVjdCBuZXQgKm5ldCwgY29uc3Qgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgICBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHIpCiB7CkBAIC00Miw3ICs0Miw3IEBACiAJaW50IHJvdXRlX2VycjsKIAogCW1lbXNldCgmZmxvdywgMCwgc2l6ZW9mKGZsb3cpKTsKLQlpcHY2X2FkZHJfY29weSgmZmxvdy5kYWRkciwgYWRkcik7CisJZmxvdy5kYWRkciA9ICphZGRyOwogCWlmIChkZXYpCiAJCWZsb3cuZmxvd2k2X29pZiA9IGRldi0+aWZpbmRleDsKIApAQCAtMTQ5LDcgKzE0OSw3IEBACiAJZWxzZSBpZiAoaW5mby0+ZmxhZ3MgJiBYVF9BRERSVFlQRV9MSU1JVF9JRkFDRV9PVVQpCiAJCWRldiA9IHBhci0+b3V0OwogCi0jaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykKIAlpZiAocGFyLT5mYW1pbHkgPT0gTkZQUk9UT19JUFY2KQogCQlyZXR1cm4gYWRkcnR5cGVfbXQ2KG5ldCwgZGV2LCBza2IsIGluZm8pOwogI2VuZGlmCkBAIC0xOTAsNyArMTkwLDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykKIAlpZiAocGFyLT5mYW1pbHkgPT0gTkZQUk9UT19JUFY2KSB7CiAJCWlmICgoaW5mby0+c291cmNlIHwgaW5mby0+ZGVzdCkgJiBYVF9BRERSVFlQRV9CTEFDS0hPTEUpIHsKIAkJCXByX2VycigiaXB2NiBCTEFDS0hPTEUgbWF0Y2hpbmcgbm90IHN1cHBvcnRlZFxuIik7CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jIGIvbmV0L25ldGZpbHRlci94dF9jb25uYnl0ZXMuYwppbmRleCA1YjEzODUwLi5lNTk1ZTA3IDEwMDY0NAotLS0gYS9uZXQvbmV0ZmlsdGVyL3h0X2Nvbm5ieXRlcy5jCisrKyBiL25ldC9uZXRmaWx0ZXIveHRfY29ubmJ5dGVzLmMKQEAgLTQwLDQ2ICs0MCw0NiBAQAogCWNhc2UgWFRfQ09OTkJZVEVTX1BLVFM6CiAJCXN3aXRjaCAoc2luZm8tPmRpcmVjdGlvbikgewogCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfT1JJR0lOQUw6Ci0JCQl3aGF0ID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzOworCQkJd2hhdCA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0ucGFja2V0cyk7CiAJCQlicmVhazsKIAkJY2FzZSBYVF9DT05OQllURVNfRElSX1JFUExZOgotCQkJd2hhdCA9IGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0czsKKwkJCXdoYXQgPSBhdG9taWM2NF9yZWFkKCZjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLnBhY2tldHMpOwogCQkJYnJlYWs7CiAJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9CT1RIOgotCQkJd2hhdCA9IGNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0ucGFja2V0czsKLQkJCXdoYXQgKz0gY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzOworCQkJd2hhdCA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0ucGFja2V0cyk7CisJCQl3aGF0ICs9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0ucGFja2V0cyk7CiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAljYXNlIFhUX0NPTk5CWVRFU19CWVRFUzoKIAkJc3dpdGNoIChzaW5mby0+ZGlyZWN0aW9uKSB7CiAJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9PUklHSU5BTDoKLQkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLmJ5dGVzOworCQkJd2hhdCA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXMpOwogCQkJYnJlYWs7CiAJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKLQkJCXdoYXQgPSBjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLmJ5dGVzOworCQkJd2hhdCA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXMpOwogCQkJYnJlYWs7CiAJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9CT1RIOgotCQkJd2hhdCA9IGNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXM7Ci0JCQl3aGF0ICs9IGNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXM7CisJCQl3aGF0ID0gYXRvbWljNjRfcmVhZCgmY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlcyk7CisJCQl3aGF0ICs9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXJzW0lQX0NUX0RJUl9SRVBMWV0uYnl0ZXMpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CiAJY2FzZSBYVF9DT05OQllURVNfQVZHUEtUOgogCQlzd2l0Y2ggKHNpbmZvLT5kaXJlY3Rpb24pIHsKIAkJY2FzZSBYVF9DT05OQllURVNfRElSX09SSUdJTkFMOgotCQkJYnl0ZXMgPSBjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLmJ5dGVzOwotCQkJcGt0cyAgPSBjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLnBhY2tldHM7CisJCQlieXRlcyA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXMpOworCQkJcGt0cyAgPSBhdG9taWM2NF9yZWFkKCZjb3VudGVyc1tJUF9DVF9ESVJfT1JJR0lOQUxdLnBhY2tldHMpOwogCQkJYnJlYWs7CiAJCWNhc2UgWFRfQ09OTkJZVEVTX0RJUl9SRVBMWToKLQkJCWJ5dGVzID0gY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5ieXRlczsKLQkJCXBrdHMgID0gY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzOworCQkJYnl0ZXMgPSBhdG9taWM2NF9yZWFkKCZjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLmJ5dGVzKTsKKwkJCXBrdHMgID0gYXRvbWljNjRfcmVhZCgmY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzKTsKIAkJCWJyZWFrOwogCQljYXNlIFhUX0NPTk5CWVRFU19ESVJfQk9USDoKLQkJCWJ5dGVzID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5ieXRlcyArCi0JCQkJY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5ieXRlczsKLQkJCXBrdHMgID0gY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzICsKLQkJCQljb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLnBhY2tldHM7CisJCQlieXRlcyA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXJzW0lQX0NUX0RJUl9PUklHSU5BTF0uYnl0ZXMpICsKKwkJCQlhdG9taWM2NF9yZWFkKCZjb3VudGVyc1tJUF9DVF9ESVJfUkVQTFldLmJ5dGVzKTsKKwkJCXBrdHMgID0gYXRvbWljNjRfcmVhZCgmY291bnRlcnNbSVBfQ1RfRElSX09SSUdJTkFMXS5wYWNrZXRzKSArCisJCQkJYXRvbWljNjRfcmVhZCgmY291bnRlcnNbSVBfQ1RfRElSX1JFUExZXS5wYWNrZXRzKTsKIAkJCWJyZWFrOwogCQl9CiAJCWlmIChwa3RzICE9IDApCkBAIC04NywxMCArODcsMTAgQEAKIAkJYnJlYWs7CiAJfQogCi0JaWYgKHNpbmZvLT5jb3VudC50bykKKwlpZiAoc2luZm8tPmNvdW50LnRvID49IHNpbmZvLT5jb3VudC5mcm9tKQogCQlyZXR1cm4gd2hhdCA8PSBzaW5mby0+Y291bnQudG8gJiYgd2hhdCA+PSBzaW5mby0+Y291bnQuZnJvbTsKLQllbHNlCi0JCXJldHVybiB3aGF0ID49IHNpbmZvLT5jb3VudC5mcm9tOworCWVsc2UgLyogaW52ZXJ0ZWQgKi8KKwkJcmV0dXJuIHdoYXQgPCBzaW5mby0+Y291bnQudG8gfHwgd2hhdCA+IHNpbmZvLT5jb3VudC5mcm9tOwogfQogCiBzdGF0aWMgaW50IGNvbm5ieXRlc19tdF9jaGVjayhjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfZWNuLmMgYi9uZXQvbmV0ZmlsdGVyL3h0X2Vjbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjODMxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2Vjbi5jCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogWHRhYmxlcyBtb2R1bGUgZm9yIG1hdGNoaW5nIHRoZSB2YWx1ZSBvZiB0aGUgSVB2NC9JUHY2IGFuZCBUQ1AgRUNOIGJpdHMKKyAqCisgKiAoQykgMjAwMiBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMTEgUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqLworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKworI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94X3RhYmxlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9lY24uaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC9pcF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2Ni9pcDZfdGFibGVzLmg+CisKK01PRFVMRV9BVVRIT1IoIkhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYdGFibGVzOiBFeHBsaWNpdCBDb25nZXN0aW9uIE5vdGlmaWNhdGlvbiAoRUNOKSBmbGFnIG1hdGNoIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoImlwdF9lY24iKTsKK01PRFVMRV9BTElBUygiaXA2dF9lY24iKTsKKworc3RhdGljIGJvb2wgbWF0Y2hfdGNwKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK3sKKwljb25zdCBzdHJ1Y3QgeHRfZWNuX2luZm8gKmVpbmZvID0gcGFyLT5tYXRjaGluZm87CisJc3RydWN0IHRjcGhkciBfdGNwaDsKKwljb25zdCBzdHJ1Y3QgdGNwaGRyICp0aDsKKworCS8qIEluIHByYWN0aWNlLCBUQ1AgbWF0Y2ggZG9lcyB0aGlzLCBzbyBjYW4ndCBmYWlsLiAgQnV0IGxldCdzCisJICogYmUgZ29vZCBjaXRpemVucy4KKwkgKi8KKwl0aCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIHBhci0+dGhvZmYsIHNpemVvZihfdGNwaCksICZfdGNwaCk7CisJaWYgKHRoID09IE5VTEwpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChlaW5mby0+b3BlcmF0aW9uICYgWFRfRUNOX09QX01BVENIX0VDRSkgeworCQlpZiAoZWluZm8tPmludmVydCAmIFhUX0VDTl9PUF9NQVRDSF9FQ0UpIHsKKwkJCWlmICh0aC0+ZWNlID09IDEpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IGVsc2UgeworCQkJaWYgKHRoLT5lY2UgPT0gMCkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwlpZiAoZWluZm8tPm9wZXJhdGlvbiAmIFhUX0VDTl9PUF9NQVRDSF9DV1IpIHsKKwkJaWYgKGVpbmZvLT5pbnZlcnQgJiBYVF9FQ05fT1BfTUFUQ0hfQ1dSKSB7CisJCQlpZiAodGgtPmN3ciA9PSAxKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfSBlbHNlIHsKKwkJCWlmICh0aC0+Y3dyID09IDApCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBtYXRjaF9pcChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIGNvbnN0IHN0cnVjdCB4dF9lY25faW5mbyAqZWluZm8pCit7CisJcmV0dXJuICgoaXBfaGRyKHNrYiktPnRvcyAmIFhUX0VDTl9JUF9NQVNLKSA9PSBlaW5mby0+aXBfZWN0KSBeCisJICAgICAgICEhKGVpbmZvLT5pbnZlcnQgJiBYVF9FQ05fT1BfTUFUQ0hfSVApOworfQorCitzdGF0aWMgYm9vbCBlY25fbXQ0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCB4dF9hY3Rpb25fcGFyYW0gKnBhcikKK3sKKwljb25zdCBzdHJ1Y3QgeHRfZWNuX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKworCWlmIChpbmZvLT5vcGVyYXRpb24gJiBYVF9FQ05fT1BfTUFUQ0hfSVAgJiYgIW1hdGNoX2lwKHNrYiwgaW5mbykpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChpbmZvLT5vcGVyYXRpb24gJiAoWFRfRUNOX09QX01BVENIX0VDRSB8IFhUX0VDTl9PUF9NQVRDSF9DV1IpICYmCisJICAgICFtYXRjaF90Y3Aoc2tiLCBwYXIpKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGludCBlY25fbXRfY2hlY2s0KGNvbnN0IHN0cnVjdCB4dF9tdGNoa19wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9lY25faW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCWNvbnN0IHN0cnVjdCBpcHRfaXAgKmlwID0gcGFyLT5lbnRyeWluZm87CisKKwlpZiAoaW5mby0+b3BlcmF0aW9uICYgWFRfRUNOX09QX01BVENIX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGluZm8tPmludmVydCAmIFhUX0VDTl9PUF9NQVRDSF9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpbmZvLT5vcGVyYXRpb24gJiAoWFRfRUNOX09QX01BVENIX0VDRSB8IFhUX0VDTl9PUF9NQVRDSF9DV1IpICYmCisJICAgIChpcC0+cHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwgaXAtPmludmZsYWdzICYgSVBUX0lOVl9QUk9UTykpIHsKKwkJcHJfaW5mbygiY2Fubm90IG1hdGNoIFRDUCBiaXRzIGluIHJ1bGUgZm9yIG5vbi10Y3AgcGFja2V0c1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgbWF0Y2hfaXB2Nihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICAgY29uc3Qgc3RydWN0IHh0X2Vjbl9pbmZvICplaW5mbykKK3sKKwlyZXR1cm4gKCgoaXB2Nl9oZHIoc2tiKS0+Zmxvd19sYmxbMF0gPj4gNCkgJiBYVF9FQ05fSVBfTUFTSykgPT0KKwkgICAgICAgIGVpbmZvLT5pcF9lY3QpIF4KKwkgICAgICAgISEoZWluZm8tPmludmVydCAmIFhUX0VDTl9PUF9NQVRDSF9JUCk7Cit9CisKK3N0YXRpYyBib29sIGVjbl9tdDYoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9lY25faW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCisJaWYgKGluZm8tPm9wZXJhdGlvbiAmIFhUX0VDTl9PUF9NQVRDSF9JUCAmJiAhbWF0Y2hfaXB2Nihza2IsIGluZm8pKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoaW5mby0+b3BlcmF0aW9uICYgKFhUX0VDTl9PUF9NQVRDSF9FQ0UgfCBYVF9FQ05fT1BfTUFUQ0hfQ1dSKSAmJgorCSAgICAhbWF0Y2hfdGNwKHNrYiwgcGFyKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBpbnQgZWNuX210X2NoZWNrNihjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKK3sKKwljb25zdCBzdHJ1Y3QgeHRfZWNuX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwljb25zdCBzdHJ1Y3QgaXA2dF9pcDYgKmlwID0gcGFyLT5lbnRyeWluZm87CisKKwlpZiAoaW5mby0+b3BlcmF0aW9uICYgWFRfRUNOX09QX01BVENIX01BU0spCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGluZm8tPmludmVydCAmIFhUX0VDTl9PUF9NQVRDSF9NQVNLKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChpbmZvLT5vcGVyYXRpb24gJiAoWFRfRUNOX09QX01BVENIX0VDRSB8IFhUX0VDTl9PUF9NQVRDSF9DV1IpICYmCisJICAgIChpcC0+cHJvdG8gIT0gSVBQUk9UT19UQ1AgfHwgaXAtPmludmZsYWdzICYgSVA2VF9JTlZfUFJPVE8pKSB7CisJCXByX2luZm8oImNhbm5vdCBtYXRjaCBUQ1AgYml0cyBpbiBydWxlIGZvciBub24tdGNwIHBhY2tldHNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB4dF9tYXRjaCBlY25fbXRfcmVnW10gX19yZWFkX21vc3RseSA9IHsKKwl7CisJCS5uYW1lCQk9ICJlY24iLAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNCwKKwkJLm1hdGNoCQk9IGVjbl9tdDQsCisJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2Vjbl9pbmZvKSwKKwkJLmNoZWNrZW50cnkJPSBlY25fbXRfY2hlY2s0LAorCQkubWUJCT0gVEhJU19NT0RVTEUsCisJfSwKKwl7CisJCS5uYW1lCQk9ICJlY24iLAorCQkuZmFtaWx5CQk9IE5GUFJPVE9fSVBWNiwKKwkJLm1hdGNoCQk9IGVjbl9tdDYsCisJCS5tYXRjaHNpemUJPSBzaXplb2Yoc3RydWN0IHh0X2Vjbl9pbmZvKSwKKwkJLmNoZWNrZW50cnkJPSBlY25fbXRfY2hlY2s2LAorCQkubWUJCT0gVEhJU19NT0RVTEUsCisJfSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGVjbl9tdF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoZXMoZWNuX210X3JlZywgQVJSQVlfU0laRShlY25fbXRfcmVnKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBlY25fbXRfZXhpdCh2b2lkKQoreworCXh0X3VucmVnaXN0ZXJfbWF0Y2hlcyhlY25fbXRfcmVnLCBBUlJBWV9TSVpFKGVjbl9tdF9yZWcpKTsKK30KKworbW9kdWxlX2luaXQoZWNuX210X2luaXQpOworbW9kdWxlX2V4aXQoZWNuX210X2V4aXQpOwpkaWZmIC0tZ2l0IGEvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYyBiL25ldC9uZXRmaWx0ZXIveHRfaGFzaGxpbWl0LmMKaW5kZXggZGZkNTJiYS4uOGU0OTkyMSAxMDA2NDQKLS0tIGEvbmV0L25ldGZpbHRlci94dF9oYXNobGltaXQuYworKysgYi9uZXQvbmV0ZmlsdGVyL3h0X2hhc2hsaW1pdC5jCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9pbi5oPgogI2luY2x1ZGUgPGxpbnV4L2lwLmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykKICNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bmV0L2lwdjYuaD4KICNlbmRpZgpAQCAtNjQsNyArNjQsNyBAQAogCQkJX19iZTMyIHNyYzsKIAkJCV9fYmUzMiBkc3Q7CiAJCX0gaXA7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTKSB8fCBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVNfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykKIAkJc3RydWN0IHsKIAkJCV9fYmUzMiBzcmNbNF07CiAJCQlfX2JlMzIgZHN0WzRdOwpAQCAtNDEzLDcgKzQxMyw3IEBACiAJcmV0dXJuIGwgPyBodG9ubChudG9obChhKSAmIH4wIDw8ICgzMiAtIGwpKSA6IDA7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX0lQVEFCTEVTKQogc3RhdGljIHZvaWQgaGFzaGxpbWl0X2lwdjZfbWFzayhfX2JlMzIgKmksIHVuc2lnbmVkIGludCBwKQogewogCXN3aXRjaCAocCkgewpAQCAtNDQ1LDYgKzQ0NSw3IEBACiB7CiAJX19iZTE2IF9wb3J0c1syXSwgKnBvcnRzOwogCXU4IG5leHRoZHI7CisJX19iZTE2IGZyYWdfb2ZmOwogCWludCBwb2ZmOwogCiAJbWVtc2V0KGRzdCwgMCwgc2l6ZW9mKCpkc3QpKTsKQEAgLTQ2Myw3ICs0NjQsNyBAQAogCQkJcmV0dXJuIDA7CiAJCW5leHRoZHIgPSBpcF9oZHIoc2tiKS0+cHJvdG9jb2w7CiAJCWJyZWFrOwotI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCiAJY2FzZSBORlBST1RPX0lQVjY6CiAJCWlmIChoaW5mby0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9ESVApIHsKIAkJCW1lbWNweSgmZHN0LT5pcDYuZHN0LCAmaXB2Nl9oZHIoc2tiKS0+ZGFkZHIsCkBAIC00ODAsNyArNDgxLDcgQEAKIAkJICAgICAgKFhUX0hBU0hMSU1JVF9IQVNIX0RQVCB8IFhUX0hBU0hMSU1JVF9IQVNIX1NQVCkpKQogCQkJcmV0dXJuIDA7CiAJCW5leHRoZHIgPSBpcHY2X2hkcihza2IpLT5uZXh0aGRyOwotCQlwcm90b2ZmID0gaXB2Nl9za2lwX2V4dGhkcihza2IsIHNpemVvZihzdHJ1Y3QgaXB2NmhkciksICZuZXh0aGRyKTsKKwkJcHJvdG9mZiA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBzaXplb2Yoc3RydWN0IGlwdjZoZHIpLCAmbmV4dGhkciwgJmZyYWdfb2ZmKTsKIAkJaWYgKChpbnQpcHJvdG9mZiA8IDApCiAJCQlyZXR1cm4gLTE7CiAJCWJyZWFrOwpAQCAtNjE1LDcgKzYxNiw3IEBACiAJCS5kZXN0cm95ICAgICAgICA9IGhhc2hsaW1pdF9tdF9kZXN0cm95LAogCQkubWUgICAgICAgICAgICAgPSBUSElTX01PRFVMRSwKIAl9LAotI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCiAJewogCQkubmFtZSAgICAgICAgICAgPSAiaGFzaGxpbWl0IiwKIAkJLnJldmlzaW9uICAgICAgID0gMSwKQEAgLTY5Miw3ICs2OTMsNyBAQAogCQkJCSBlbnQtPnJhdGVpbmZvLmNyZWRpdCwgZW50LT5yYXRlaW5mby5jcmVkaXRfY2FwLAogCQkJCSBlbnQtPnJhdGVpbmZvLmNvc3QpOwogCQlicmVhazsKLSNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX0lQVEFCTEVTKQogCWNhc2UgTkZQUk9UT19JUFY2OgogCQlyZXMgPSBzZXFfcHJpbnRmKHMsICIlbGQgJXBJNjoldS0+JXBJNjoldSAldSAldSAldVxuIiwKIAkJCQkgKGxvbmcpKGVudC0+ZXhwaXJlcyAtIGppZmZpZXMpL0haLApAQCAtNzYwLDcgKzc2MSw3IEBACiAJaGFzaGxpbWl0X25ldC0+aXB0X2hhc2hsaW1pdCA9IHByb2NfbWtkaXIoImlwdF9oYXNobGltaXQiLCBuZXQtPnByb2NfbmV0KTsKIAlpZiAoIWhhc2hsaW1pdF9uZXQtPmlwdF9oYXNobGltaXQpCiAJCXJldHVybiAtRU5PTUVNOwotI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCiAJaGFzaGxpbWl0X25ldC0+aXA2dF9oYXNobGltaXQgPSBwcm9jX21rZGlyKCJpcDZ0X2hhc2hsaW1pdCIsIG5ldC0+cHJvY19uZXQpOwogCWlmICghaGFzaGxpbWl0X25ldC0+aXA2dF9oYXNobGltaXQpIHsKIAkJcHJvY19uZXRfcmVtb3ZlKG5ldCwgImlwdF9oYXNobGltaXQiKTsKQEAgLTc3Myw3ICs3NzQsNyBAQAogc3RhdGljIHZvaWQgX19uZXRfZXhpdCBoYXNobGltaXRfcHJvY19uZXRfZXhpdChzdHJ1Y3QgbmV0ICpuZXQpCiB7CiAJcHJvY19uZXRfcmVtb3ZlKG5ldCwgImlwdF9oYXNobGltaXQiKTsKLSNpZiBkZWZpbmVkKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpIHx8IGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFU19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVA2X05GX0lQVEFCTEVTKQogCXByb2NfbmV0X3JlbW92ZShuZXQsICJpcDZ0X2hhc2hsaW1pdCIpOwogI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9uZXQvbmV0ZmlsdGVyL3h0X25mYWNjdC5jIGIvbmV0L25ldGZpbHRlci94dF9uZmFjY3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2JlMGVmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25ldGZpbHRlci94dF9uZmFjY3QuYwpAQCAtMCwwICsxLDc2IEBACisvKgorICogKEMpIDIwMTEgUGFibG8gTmVpcmEgQXl1c28gPHBhYmxvQG5ldGZpbHRlci5vcmc+CisgKiAoQykgMjAxMSBJbnRyYTJuZXQgQUcgPGh0dHA6Ly93d3cuaW50cmEybmV0LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKG9yIGFueQorICogbGF0ZXIgYXQgeW91ciBvcHRpb24pIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIvbmZuZXRsaW5rX2FjY3QuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveHRfbmZhY2N0Lmg+CisKK01PRFVMRV9BVVRIT1IoIlBhYmxvIE5laXJhIEF5dXNvIDxwYWJsb0BuZXRmaWx0ZXIub3JnPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJYdGFibGVzOiBtYXRjaCBmb3IgdGhlIGV4dGVuZGVkIGFjY291bnRpbmcgaW5mcmFzdHJ1Y3R1cmUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBUygiaXB0X25mYWNjdCIpOworTU9EVUxFX0FMSUFTKCJpcDZ0X25mYWNjdCIpOworCitzdGF0aWMgYm9vbCBuZmFjY3RfbXQoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHh0X2FjdGlvbl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9uZmFjY3RfbWF0Y2hfaW5mbyAqaW5mbyA9IHBhci0+dGFyZ2luZm87CisKKwluZm5sX2FjY3RfdXBkYXRlKHNrYiwgaW5mby0+bmZhY2N0KTsKKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgaW50CituZmFjY3RfbXRfY2hlY2tlbnRyeShjb25zdCBzdHJ1Y3QgeHRfbXRjaGtfcGFyYW0gKnBhcikKK3sKKwlzdHJ1Y3QgeHRfbmZhY2N0X21hdGNoX2luZm8gKmluZm8gPSBwYXItPm1hdGNoaW5mbzsKKwlzdHJ1Y3QgbmZfYWNjdCAqbmZhY2N0OworCisJbmZhY2N0ID0gbmZubF9hY2N0X2ZpbmRfZ2V0KGluZm8tPm5hbWUpOworCWlmIChuZmFjY3QgPT0gTlVMTCkgeworCQlwcl9pbmZvKCJ4dF9uZmFjY3Q6IGFjY291bnRpbmcgb2JqZWN0IHdpdGggbmFtZSBgJXMnICIKKwkJCSJkb2VzIG5vdCBleGlzdHNcbiIsIGluZm8tPm5hbWUpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJaW5mby0+bmZhY2N0ID0gbmZhY2N0OworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbmZhY2N0X210X2Rlc3Ryb3koY29uc3Qgc3RydWN0IHh0X210ZHRvcl9wYXJhbSAqcGFyKQoreworCWNvbnN0IHN0cnVjdCB4dF9uZmFjY3RfbWF0Y2hfaW5mbyAqaW5mbyA9IHBhci0+bWF0Y2hpbmZvOworCisJbmZubF9hY2N0X3B1dChpbmZvLT5uZmFjY3QpOworfQorCitzdGF0aWMgc3RydWN0IHh0X21hdGNoIG5mYWNjdF9tdF9yZWcgX19yZWFkX21vc3RseSA9IHsKKwkubmFtZSAgICAgICA9ICJuZmFjY3QiLAorCS5mYW1pbHkgICAgID0gTkZQUk9UT19VTlNQRUMsCisJLmNoZWNrZW50cnkgPSBuZmFjY3RfbXRfY2hlY2tlbnRyeSwKKwkubWF0Y2ggICAgICA9IG5mYWNjdF9tdCwKKwkuZGVzdHJveSAgICA9IG5mYWNjdF9tdF9kZXN0cm95LAorCS5tYXRjaHNpemUgID0gc2l6ZW9mKHN0cnVjdCB4dF9uZmFjY3RfbWF0Y2hfaW5mbyksCisJLm1lICAgICAgICAgPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG5mYWNjdF9tdF9pbml0KHZvaWQpCit7CisJcmV0dXJuIHh0X3JlZ2lzdGVyX21hdGNoKCZuZmFjY3RfbXRfcmVnKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG5mYWNjdF9tdF9leGl0KHZvaWQpCit7CisJeHRfdW5yZWdpc3Rlcl9tYXRjaCgmbmZhY2N0X210X3JlZyk7Cit9CisKK21vZHVsZV9pbml0KG5mYWNjdF9tdF9pbml0KTsKK21vZHVsZV9leGl0KG5mYWNjdF9tdF9leGl0KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMgYi9uZXQvbmV0ZmlsdGVyL3h0X3NvY2tldC5jCmluZGV4IGZlMzlmN2UuLjcyYmIwN2YgMTAwNjQ0Ci0tLSBhL25ldC9uZXRmaWx0ZXIveHRfc29ja2V0LmMKKysrIGIvbmV0L25ldGZpbHRlci94dF9zb2NrZXQuYwpAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfdHByb3h5X2NvcmUuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjQvbmZfZGVmcmFnX2lwdjQuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQNl9ORl9JUFRBQkxFUykgfHwgZGVmaW5lZChDT05GSUdfSVA2X05GX0lQVEFCTEVTX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUDZfTkZfSVBUQUJMRVMpCiAjZGVmaW5lIFhUX1NPQ0tFVF9IQVZFX0lQVjYgMQogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9pcHY2L2lwNl90YWJsZXMuaD4KICNpbmNsdWRlIDxuZXQvbmV0ZmlsdGVyL2lwdjYvbmZfZGVmcmFnX2lwdjYuaD4KQEAgLTMwLDcgKzMwLDcgQEAKIAogI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9zb2NrZXQuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX05GX0NPTk5UUkFDSykgfHwgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19ORl9DT05OVFJBQ0spCiAjZGVmaW5lIFhUX1NPQ0tFVF9IQVZFX0NPTk5UUkFDSyAxCiAjaW5jbHVkZSA8bmV0L25ldGZpbHRlci9uZl9jb25udHJhY2suaD4KICNlbmRpZgpAQCAtMjE0LDYgKzIxNCw3IEBACiAJc3RydWN0IGljbXA2aGRyICppY21waCwgX2ljbXBoOwogCV9fYmUxNiAqcG9ydHMsIF9wb3J0c1syXTsKIAl1OCBpbnNpZGVfbmV4dGhkcjsKKwlfX2JlMTYgaW5zaWRlX2ZyYWdvZmY7CiAJaW50IGluc2lkZV9oZHJsZW47CiAKIAlpY21waCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG91dHNpZGVfaGRybGVuLApAQCAtMjI5LDcgKzIzMCw4IEBACiAJCXJldHVybiAxOwogCWluc2lkZV9uZXh0aGRyID0gaW5zaWRlX2lwaC0+bmV4dGhkcjsKIAotCWluc2lkZV9oZHJsZW4gPSBpcHY2X3NraXBfZXh0aGRyKHNrYiwgb3V0c2lkZV9oZHJsZW4gKyBzaXplb2YoX2ljbXBoKSArIHNpemVvZihfaW5zaWRlX2lwaCksICZpbnNpZGVfbmV4dGhkcik7CisJaW5zaWRlX2hkcmxlbiA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBvdXRzaWRlX2hkcmxlbiArIHNpemVvZihfaWNtcGgpICsgc2l6ZW9mKF9pbnNpZGVfaXBoKSwKKwkJCQkJICZpbnNpZGVfbmV4dGhkciwgJmluc2lkZV9mcmFnb2ZmKTsKIAlpZiAoaW5zaWRlX2hkcmxlbiA8IDApCiAJCXJldHVybiAxOyAvKiBoam06IFBhY2tldCBoYXMgbm8vaW5jb21wbGV0ZSB0cmFuc3BvcnQgbGF5ZXIgaGVhZGVycy4gKi8KIApkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2FkZHJsaXN0LmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfYWRkcmxpc3QuYwppbmRleCA5NmI3NDlkLi42ZjE3MDEzIDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfYWRkcmxpc3QuYworKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfYWRkcmxpc3QuYwpAQCAtOTYsNyArOTYsNyBAQAogfQogCiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogLyoqCiAgKiBuZXRsYmxfYWY2bGlzdF9zZWFyY2ggLSBTZWFyY2ggZm9yIGEgbWF0Y2hpbmcgSVB2NiBhZGRyZXNzIGVudHJ5CiAgKiBAYWRkcjogSVB2NiBhZGRyZXNzCkBAIC0xODUsNyArMTg1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAvKioKICAqIG5ldGxibF9hZjZsaXN0X2FkZCAtIEFkZCBhIG5ldyBJUHY2IGFkZHJlc3MgZW50cnkgdG8gYSBsaXN0CiAgKiBAZW50cnk6IGFkZHJlc3MgZW50cnkKQEAgLTI2Myw3ICsyNjMsNyBAQAogCXJldHVybiBlbnRyeTsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAvKioKICAqIG5ldGxibF9hZjZsaXN0X3JlbW92ZV9lbnRyeSAtIFJlbW92ZSBhbiBJUHY2IGFkZHJlc3MgZW50cnkKICAqIEBlbnRyeTogYWRkcmVzcyBlbnRyeQpAQCAtMzQyLDcgKzM0Miw3IEBACiAJfQogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIC8qKgogICogbmV0bGJsX2FmNmxpc3RfYXVkaXRfYWRkciAtIEF1ZGl0IGFuIElQdjYgYWRkcmVzcwogICogQGF1ZGl0X2J1ZjogYXVkaXQgYnVmZmVyCmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfYWRkcmxpc3QuaCBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9hZGRybGlzdC5oCmluZGV4IGZkYmMxZDIuLmExMjg3Y2UgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9hZGRybGlzdC5oCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9hZGRybGlzdC5oCkBAIC0xMzMsNyArMTMzLDcgQEAKIH0KICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAogI2RlZmluZSBfX2FmNmxpc3RfZW50cnkocHRyKSBjb250YWluZXJfb2YocHRyLCBzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QsIGxpc3QpCiAKZGlmZiAtLWdpdCBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5jCmluZGV4IDNmOTA1ZTUuLjM4MjA0MTEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmMKKysrIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guYwpAQCAtNzgsNyArNzgsNyBAQAogCXN0cnVjdCBuZXRsYmxfZG9tX21hcCAqcHRyOwogCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqaXRlcjQ7CiAJc3RydWN0IG5ldGxibF9hZjRsaXN0ICp0bXA0OwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJc3RydWN0IG5ldGxibF9hZjZsaXN0ICppdGVyNjsKIAlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKnRtcDY7CiAjZW5kaWYgLyogSVB2NiAqLwpAQCAtOTAsNyArOTAsNyBAQAogCQkJbmV0bGJsX2FmNGxpc3RfcmVtb3ZlX2VudHJ5KGl0ZXI0KTsKIAkJCWtmcmVlKG5ldGxibF9kb21oc2hfYWRkcjRfZW50cnkoaXRlcjQpKTsKIAkJfQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCW5ldGxibF9hZjZsaXN0X2ZvcmVhY2hfc2FmZShpdGVyNiwgdG1wNiwKIAkJCQkJICAgICZwdHItPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q2KSB7CiAJCQluZXRsYmxfYWY2bGlzdF9yZW1vdmVfZW50cnkoaXRlcjYpOwpAQCAtMjE3LDcgKzIxNyw3IEBACiAJCQljaXBzb3Y0ID0gbWFwNC0+dHlwZV9kZWYuY2lwc292NDsKIAkJCW5ldGxibF9hZjRsaXN0X2F1ZGl0X2FkZHIoYXVkaXRfYnVmLCAwLCBOVUxMLAogCQkJCQkJICBhZGRyNC0+YWRkciwgYWRkcjQtPm1hc2spOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCX0gZWxzZSBpZiAoYWRkcjYgIT0gTlVMTCkgewogCQkJc3RydWN0IG5ldGxibF9kb21hZGRyNl9tYXAgKm1hcDY7CiAJCQltYXA2ID0gbmV0bGJsX2RvbWhzaF9hZGRyNl9lbnRyeShhZGRyNik7CkBAIC0zMDYsNyArMzA2LDcgQEAKIAlzdHJ1Y3QgbmV0bGJsX2RvbV9tYXAgKmVudHJ5X29sZDsKIAlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKml0ZXI0OwogCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqdG1wNDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCXN0cnVjdCBuZXRsYmxfYWY2bGlzdCAqaXRlcjY7CiAJc3RydWN0IG5ldGxibF9hZjZsaXN0ICp0bXA2OwogI2VuZGlmIC8qIElQdjYgKi8KQEAgLTMzOCw3ICszMzgsNyBAQAogCQkJCQkgICAgICAgJmVudHJ5LT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NCkKIAkJCQluZXRsYmxfZG9taHNoX2F1ZGl0X2FkZChlbnRyeSwgaXRlcjQsIE5VTEwsCiAJCQkJCQkJcmV0X3ZhbCwgYXVkaXRfaW5mbyk7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJCW5ldGxibF9hZjZsaXN0X2ZvcmVhY2hfcmN1KGl0ZXI2LAogCQkJCQkgICAgICAgJmVudHJ5LT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NikKIAkJCQluZXRsYmxfZG9taHNoX2F1ZGl0X2FkZChlbnRyeSwgTlVMTCwgaXRlcjYsCkBAIC0zNjUsNyArMzY1LDcgQEAKIAkJCQlyZXRfdmFsID0gLUVFWElTVDsKIAkJCQlnb3RvIGFkZF9yZXR1cm47CiAJCQl9Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJbmV0bGJsX2FmNmxpc3RfZm9yZWFjaF9yY3UoaXRlcjYsCiAJCQkJCSAgICZlbnRyeS0+dHlwZV9kZWYuYWRkcnNlbC0+bGlzdDYpCiAJCQlpZiAobmV0bGJsX2FmNmxpc3Rfc2VhcmNoX2V4YWN0KCZpdGVyNi0+YWRkciwKQEAgLTM4Niw3ICszODYsNyBAQAogCQkJaWYgKHJldF92YWwgIT0gMCkKIAkJCQlnb3RvIGFkZF9yZXR1cm47CiAJCX0KLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCQluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3NhZmUoaXRlcjYsIHRtcDYsCiAJCQkJCSAgICAmZW50cnktPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q2KSB7CiAJCQluZXRsYmxfYWY2bGlzdF9yZW1vdmVfZW50cnkoaXRlcjYpOwpAQCAtNTEwLDcgKzUxMCw3IEBACiAJc3RydWN0IG5ldGxibF9kb21fbWFwICplbnRyeV9tYXA7CiAJc3RydWN0IG5ldGxibF9hZjRsaXN0ICplbnRyeV9hZGRyOwogCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqaXRlcjQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKml0ZXI2OwogI2VuZGlmIC8qIElQdjYgKi8KIAlzdHJ1Y3QgbmV0bGJsX2RvbWFkZHI0X21hcCAqZW50cnk7CkBAIC01MzMsNyArNTMzLDcgQEAKIAkJZ290byByZW1vdmVfYWY0X2ZhaWx1cmU7CiAJbmV0bGJsX2FmNGxpc3RfZm9yZWFjaF9yY3UoaXRlcjQsICZlbnRyeV9tYXAtPnR5cGVfZGVmLmFkZHJzZWwtPmxpc3Q0KQogCQlnb3RvIHJlbW92ZV9hZjRfc2luZ2xlX2FkZHI7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3JjdShpdGVyNiwgJmVudHJ5X21hcC0+dHlwZV9kZWYuYWRkcnNlbC0+bGlzdDYpCiAJCWdvdG8gcmVtb3ZlX2FmNF9zaW5nbGVfYWRkcjsKICNlbmRpZiAvKiBJUHY2ICovCkBAIC02NDQsNyArNjQ0LDcgQEAKIAlyZXR1cm4gbmV0bGJsX2RvbWhzaF9hZGRyNF9lbnRyeShhZGRyX2l0ZXIpOwogfQogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIC8qKgogICogbmV0bGJsX2RvbWhzaF9nZXRlbnRyeV9hZjYgLSBHZXQgYW4gZW50cnkgZnJvbSB0aGUgZG9tYWluIGhhc2ggdGFibGUKICAqIEBkb21haW46IHRoZSBkb21haW4gbmFtZSB0byBzZWFyY2ggZm9yCmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5oIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX2RvbWFpbmhhc2guaAppbmRleCBiZmNjMGY3Li45MDg3MmM0IDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfZG9tYWluaGFzaC5oCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9kb21haW5oYXNoLmgKQEAgLTEwNCw3ICsxMDQsNyBAQAogCQkgICAgIGludCAoKmNhbGxiYWNrKSAoc3RydWN0IG5ldGxibF9kb21fbWFwICplbnRyeSwgdm9pZCAqYXJnKSwKIAkJICAgICB2b2lkICpjYl9hcmcpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIHN0cnVjdCBuZXRsYmxfZG9tYWRkcjZfbWFwICpuZXRsYmxfZG9taHNoX2dldGVudHJ5X2FmNihjb25zdCBjaGFyICpkb21haW4sCiAJCQkJCQkgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcik7CiAjZW5kaWYgLyogSVB2NiAqLwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9rYXBpLmMKaW5kZXggOWMyNGRlMS4uMjU2MGU3YiAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX2thcGkuYworKysgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfa2FwaS5jCkBAIC0xMTEsOCArMTExLDYgQEAKIAlzdHJ1Y3QgbmV0bGJsX2RvbWFkZHJfbWFwICphZGRybWFwID0gTlVMTDsKIAlzdHJ1Y3QgbmV0bGJsX2RvbWFkZHI0X21hcCAqbWFwNCA9IE5VTEw7CiAJc3RydWN0IG5ldGxibF9kb21hZGRyNl9tYXAgKm1hcDYgPSBOVUxMOwotCWNvbnN0IHN0cnVjdCBpbl9hZGRyICphZGRyNCwgKm1hc2s0OwotCWNvbnN0IHN0cnVjdCBpbjZfYWRkciAqYWRkcjYsICptYXNrNjsKIAogCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0FUT01JQyk7CiAJaWYgKGVudHJ5ID09IE5VTEwpCkBAIC0xMzMsOSArMTMxLDkgQEAKIAkJSU5JVF9MSVNUX0hFQUQoJmFkZHJtYXAtPmxpc3Q2KTsKIAogCQlzd2l0Y2ggKGZhbWlseSkgewotCQljYXNlIEFGX0lORVQ6Ci0JCQlhZGRyNCA9IGFkZHI7Ci0JCQltYXNrNCA9IG1hc2s7CisJCWNhc2UgQUZfSU5FVDogeworCQkJY29uc3Qgc3RydWN0IGluX2FkZHIgKmFkZHI0ID0gYWRkcjsKKwkJCWNvbnN0IHN0cnVjdCBpbl9hZGRyICptYXNrNCA9IG1hc2s7CiAJCQltYXA0ID0ga3phbGxvYyhzaXplb2YoKm1hcDQpLCBHRlBfQVRPTUlDKTsKIAkJCWlmIChtYXA0ID09IE5VTEwpCiAJCQkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOwpAQCAtMTQ4LDI1ICsxNDYsMjkgQEAKIAkJCWlmIChyZXRfdmFsICE9IDApCiAJCQkJZ290byBjZmdfdW5sYmxfbWFwX2FkZF9mYWlsdXJlOwogCQkJYnJlYWs7Ci0JCWNhc2UgQUZfSU5FVDY6Ci0JCQlhZGRyNiA9IGFkZHI7Ci0JCQltYXNrNiA9IG1hc2s7CisJCQl9CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKKwkJY2FzZSBBRl9JTkVUNjogeworCQkJY29uc3Qgc3RydWN0IGluNl9hZGRyICphZGRyNiA9IGFkZHI7CisJCQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKm1hc2s2ID0gbWFzazsKIAkJCW1hcDYgPSBremFsbG9jKHNpemVvZigqbWFwNiksIEdGUF9BVE9NSUMpOwogCQkJaWYgKG1hcDYgPT0gTlVMTCkKIAkJCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CiAJCQltYXA2LT50eXBlID0gTkVUTEJMX05MVFlQRV9VTkxBQkVMRUQ7Ci0JCQlpcHY2X2FkZHJfY29weSgmbWFwNi0+bGlzdC5hZGRyLCBhZGRyNik7CisJCQltYXA2LT5saXN0LmFkZHIgPSAqYWRkcjY7CiAJCQltYXA2LT5saXN0LmFkZHIuczZfYWRkcjMyWzBdICY9IG1hc2s2LT5zNl9hZGRyMzJbMF07CiAJCQltYXA2LT5saXN0LmFkZHIuczZfYWRkcjMyWzFdICY9IG1hc2s2LT5zNl9hZGRyMzJbMV07CiAJCQltYXA2LT5saXN0LmFkZHIuczZfYWRkcjMyWzJdICY9IG1hc2s2LT5zNl9hZGRyMzJbMl07CiAJCQltYXA2LT5saXN0LmFkZHIuczZfYWRkcjMyWzNdICY9IG1hc2s2LT5zNl9hZGRyMzJbM107Ci0JCQlpcHY2X2FkZHJfY29weSgmbWFwNi0+bGlzdC5tYXNrLCBtYXNrNik7CisJCQltYXA2LT5saXN0Lm1hc2sgPSAqbWFzazY7CiAJCQltYXA2LT5saXN0LnZhbGlkID0gMTsKLQkJCXJldF92YWwgPSBuZXRsYmxfYWY0bGlzdF9hZGQoJm1hcDQtPmxpc3QsCi0JCQkJCQkgICAgICZhZGRybWFwLT5saXN0NCk7CisJCQlyZXRfdmFsID0gbmV0bGJsX2FmNmxpc3RfYWRkKCZtYXA2LT5saXN0LAorCQkJCQkJICAgICAmYWRkcm1hcC0+bGlzdDYpOwogCQkJaWYgKHJldF92YWwgIT0gMCkKIAkJCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CiAJCQlicmVhazsKKwkJCX0KKyNlbmRpZiAvKiBJUHY2ICovCiAJCWRlZmF1bHQ6CiAJCQlnb3RvIGNmZ191bmxibF9tYXBfYWRkX2ZhaWx1cmU7CiAJCQlicmVhazsKQEAgLTIyNSw5ICsyMjcsMTEgQEAKIAljYXNlIEFGX0lORVQ6CiAJCWFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKTsKIAkJYnJlYWs7CisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIEFGX0lORVQ2OgogCQlhZGRyX2xlbiA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOwogCQlicmVhazsKKyNlbmRpZiAvKiBJUHY2ICovCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FUEZOT1NVUFBPUlQ7CiAJfQpAQCAtMjY2LDkgKzI3MCwxMSBAQAogCWNhc2UgQUZfSU5FVDoKIAkJYWRkcl9sZW4gPSBzaXplb2Yoc3RydWN0IGluX2FkZHIpOwogCQlicmVhazsKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgQUZfSU5FVDY6CiAJCWFkZHJfbGVuID0gc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcik7CiAJCWJyZWFrOworI2VuZGlmIC8qIElQdjYgKi8KIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVQRk5PU1VQUE9SVDsKIAl9CkBAIC02NjcsNyArNjczLDcgQEAKIAkJCXJldF92YWwgPSAtRU5PRU5UOwogCQl9CiAJCWJyZWFrOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJY2FzZSBBRl9JTkVUNjoKIAkJLyogc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBhbnkgSVB2NiBsYWJlbGluZyBwcm90b2NvbHMgcmlnaHQKIAkJICogbm93IHdlIGNhbiBvcHRpbWl6ZSBldmVyeXRoaW5nIGF3YXkgdW50aWwgd2UgZG8gKi8KQEAgLTcxOCw3ICs3MjQsNyBAQAogCWNhc2UgQUZfSU5FVDoKIAkJcmV0X3ZhbCA9IGNpcHNvX3Y0X3NvY2tfZ2V0YXR0cihzaywgc2VjYXR0cik7CiAJCWJyZWFrOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJY2FzZSBBRl9JTkVUNjoKIAkJcmV0X3ZhbCA9IC1FTk9NU0c7CiAJCWJyZWFrOwpAQCAtNzc2LDcgKzc4Miw3IEBACiAJCQlyZXRfdmFsID0gLUVOT0VOVDsKIAkJfQogCQlicmVhazsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgQUZfSU5FVDY6CiAJCS8qIHNpbmNlIHdlIGRvbid0IHN1cHBvcnQgYW55IElQdjYgbGFiZWxpbmcgcHJvdG9jb2xzIHJpZ2h0CiAJCSAqIG5vdyB3ZSBjYW4gb3B0aW1pemUgZXZlcnl0aGluZyBhd2F5IHVudGlsIHdlIGRvICovCkBAIC04NDcsNyArODUzLDcgQEAKIAkJCXJldF92YWwgPSAtRU5PRU5UOwogCQl9CiAJCWJyZWFrOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJY2FzZSBBRl9JTkVUNjoKIAkJLyogc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydCBhbnkgSVB2NiBsYWJlbGluZyBwcm90b2NvbHMgcmlnaHQKIAkJICogbm93IHdlIGNhbiBvcHRpbWl6ZSBldmVyeXRoaW5nIGF3YXkgdW50aWwgd2UgZG8gKi8KQEAgLTkyMCw3ICs5MjYsNyBAQAogCQkJcmV0X3ZhbCA9IC1FTk9FTlQ7CiAJCX0KIAkJYnJlYWs7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIEFGX0lORVQ2OgogCQkvKiBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0IGFueSBJUHY2IGxhYmVsaW5nIHByb3RvY29scyByaWdodAogCQkgKiBub3cgd2UgY2FuIG9wdGltaXplIGV2ZXJ5dGhpbmcgYXdheSB1bnRpbCB3ZSBkbyAqLwpAQCAtOTU5LDcgKzk2NSw3IEBACiAJCSAgICBjaXBzb192NF9za2J1ZmZfZ2V0YXR0cihza2IsIHNlY2F0dHIpID09IDApCiAJCQlyZXR1cm4gMDsKIAkJYnJlYWs7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIEFGX0lORVQ2OgogCQlicmVhazsKICNlbmRpZiAvKiBJUHY2ICovCmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfbWdtdC5jIGIvbmV0L25ldGxhYmVsL25ldGxhYmVsX21nbXQuYwppbmRleCBiZmE1NTU4Li40ODA5ZTJlIDEwMDY0NAotLS0gYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfbWdtdC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF9tZ210LmMKQEAgLTE4NCw3ICsxODQsNyBAQAogCiAJCWVudHJ5LT50eXBlID0gTkVUTEJMX05MVFlQRV9BRERSU0VMRUNUOwogCQllbnRyeS0+dHlwZV9kZWYuYWRkcnNlbCA9IGFkZHJtYXA7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAl9IGVsc2UgaWYgKGluZm8tPmF0dHJzW05MQkxfTUdNVF9BX0lQVjZBRERSXSkgewogCQlzdHJ1Y3QgaW42X2FkZHIgKmFkZHI7CiAJCXN0cnVjdCBpbjZfYWRkciAqbWFzazsKQEAgLTIxNiwxMiArMjE2LDEyIEBACiAJCQlyZXRfdmFsID0gLUVOT01FTTsKIAkJCWdvdG8gYWRkX2ZhaWx1cmU7CiAJCX0KLQkJaXB2Nl9hZGRyX2NvcHkoJm1hcC0+bGlzdC5hZGRyLCBhZGRyKTsKKwkJbWFwLT5saXN0LmFkZHIgPSAqYWRkcjsKIAkJbWFwLT5saXN0LmFkZHIuczZfYWRkcjMyWzBdICY9IG1hc2stPnM2X2FkZHIzMlswXTsKIAkJbWFwLT5saXN0LmFkZHIuczZfYWRkcjMyWzFdICY9IG1hc2stPnM2X2FkZHIzMlsxXTsKIAkJbWFwLT5saXN0LmFkZHIuczZfYWRkcjMyWzJdICY9IG1hc2stPnM2X2FkZHIzMlsyXTsKIAkJbWFwLT5saXN0LmFkZHIuczZfYWRkcjMyWzNdICY9IG1hc2stPnM2X2FkZHIzMlszXTsKLQkJaXB2Nl9hZGRyX2NvcHkoJm1hcC0+bGlzdC5tYXNrLCBtYXNrKTsKKwkJbWFwLT5saXN0Lm1hc2sgPSAqbWFzazsKIAkJbWFwLT5saXN0LnZhbGlkID0gMTsKIAkJbWFwLT50eXBlID0gZW50cnktPnR5cGU7CiAKQEAgLTI3MCw3ICsyNzAsNyBAQAogCXN0cnVjdCBubGF0dHIgKm5sYV9hOwogCXN0cnVjdCBubGF0dHIgKm5sYV9iOwogCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqaXRlcjQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKml0ZXI2OwogI2VuZGlmCiAKQEAgLTMyNCw3ICszMjQsNyBAQAogCiAJCQlubGFfbmVzdF9lbmQoc2tiLCBubGFfYik7CiAJCX0KLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCQluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3JjdShpdGVyNiwKIAkJCQkJICAgJmVudHJ5LT50eXBlX2RlZi5hZGRyc2VsLT5saXN0NikgewogCQkJc3RydWN0IG5ldGxibF9kb21hZGRyNl9tYXAgKm1hcDY7CmRpZmYgLS1naXQgYS9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMgYi9uZXQvbmV0bGFiZWwvbmV0bGFiZWxfdW5sYWJlbGVkLmMKaW5kZXggZTI1MWMyYy4uNGI1ZmEwZiAxMDA2NDQKLS0tIGEvbmV0L25ldGxhYmVsL25ldGxhYmVsX3VubGFiZWxlZC5jCisrKyBiL25ldC9uZXRsYWJlbC9uZXRsYWJlbF91bmxhYmVsZWQuYwpAQCAtMTcwLDcgKzE3MCw3IEBACiAJc3RydWN0IG5ldGxibF91bmxoc2hfaWZhY2UgKmlmYWNlOwogCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqaXRlcjQ7CiAJc3RydWN0IG5ldGxibF9hZjRsaXN0ICp0bXA0OwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJc3RydWN0IG5ldGxibF9hZjZsaXN0ICppdGVyNjsKIAlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKnRtcDY7CiAjZW5kaWYgLyogSVB2NiAqLwpAQCAtMTg0LDcgKzE4NCw3IEBACiAJCW5ldGxibF9hZjRsaXN0X3JlbW92ZV9lbnRyeShpdGVyNCk7CiAJCWtmcmVlKG5ldGxibF91bmxoc2hfYWRkcjRfZW50cnkoaXRlcjQpKTsKIAl9Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3NhZmUoaXRlcjYsIHRtcDYsICZpZmFjZS0+YWRkcjZfbGlzdCkgewogCQluZXRsYmxfYWY2bGlzdF9yZW1vdmVfZW50cnkoaXRlcjYpOwogCQlrZnJlZShuZXRsYmxfdW5saHNoX2FkZHI2X2VudHJ5KGl0ZXI2KSk7CkBAIC0yNzQsNyArMjc0LDcgQEAKIAlyZXR1cm4gcmV0X3ZhbDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAvKioKICAqIG5ldGxibF91bmxoc2hfYWRkX2FkZHI2IC0gQWRkIGEgbmV3IElQdjYgYWRkcmVzcyBlbnRyeSB0byB0aGUgaGFzaCB0YWJsZQogICogQGlmYWNlOiB0aGUgYXNzb2NpYXRlZCBpbnRlcmZhY2UgZW50cnkKQEAgLTMwMCwxMiArMzAwLDEyIEBACiAJaWYgKGVudHJ5ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaXB2Nl9hZGRyX2NvcHkoJmVudHJ5LT5saXN0LmFkZHIsIGFkZHIpOworCWVudHJ5LT5saXN0LmFkZHIgPSAqYWRkcjsKIAllbnRyeS0+bGlzdC5hZGRyLnM2X2FkZHIzMlswXSAmPSBtYXNrLT5zNl9hZGRyMzJbMF07CiAJZW50cnktPmxpc3QuYWRkci5zNl9hZGRyMzJbMV0gJj0gbWFzay0+czZfYWRkcjMyWzFdOwogCWVudHJ5LT5saXN0LmFkZHIuczZfYWRkcjMyWzJdICY9IG1hc2stPnM2X2FkZHIzMlsyXTsKIAllbnRyeS0+bGlzdC5hZGRyLnM2X2FkZHIzMlszXSAmPSBtYXNrLT5zNl9hZGRyMzJbM107Ci0JaXB2Nl9hZGRyX2NvcHkoJmVudHJ5LT5saXN0Lm1hc2ssIG1hc2spOworCWVudHJ5LT5saXN0Lm1hc2sgPSAqbWFzazsKIAllbnRyeS0+bGlzdC52YWxpZCA9IDE7CiAJZW50cnktPnNlY2lkID0gc2VjaWQ7CiAKQEAgLTQzNiw3ICs0MzYsNyBAQAogCQkJCQkJICBtYXNrNC0+c19hZGRyKTsKIAkJYnJlYWs7CiAJfQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJY2FzZSBzaXplb2Yoc3RydWN0IGluNl9hZGRyKTogewogCQljb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmFkZHI2ID0gYWRkcjsKIAkJY29uc3Qgc3RydWN0IGluNl9hZGRyICptYXNrNiA9IG1hc2s7CkBAIC01MzEsNyArNTMxLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAvKioKICAqIG5ldGxibF91bmxoc2hfcmVtb3ZlX2FkZHI2IC0gUmVtb3ZlIGFuIElQdjYgYWRkcmVzcyBlbnRyeQogICogQG5ldDogbmV0d29yayBuYW1lc3BhY2UKQEAgLTYwNiwxNCArNjA2LDE0IEBACiBzdGF0aWMgdm9pZCBuZXRsYmxfdW5saHNoX2NvbmRyZW1vdmVfaWZhY2Uoc3RydWN0IG5ldGxibF91bmxoc2hfaWZhY2UgKmlmYWNlKQogewogCXN0cnVjdCBuZXRsYmxfYWY0bGlzdCAqaXRlcjQ7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKml0ZXI2OwogI2VuZGlmIC8qIElQdjYgKi8KIAogCXNwaW5fbG9jaygmbmV0bGJsX3VubGhzaF9sb2NrKTsKIAluZXRsYmxfYWY0bGlzdF9mb3JlYWNoX3JjdShpdGVyNCwgJmlmYWNlLT5hZGRyNF9saXN0KQogCQlnb3RvIHVubGhzaF9jb25kcmVtb3ZlX2ZhaWx1cmU7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3JjdShpdGVyNiwgJmlmYWNlLT5hZGRyNl9saXN0KQogCQlnb3RvIHVubGhzaF9jb25kcmVtb3ZlX2ZhaWx1cmU7CiAjZW5kaWYgLyogSVB2NiAqLwpAQCAtNjgwLDcgKzY4MCw3IEBACiAJCQkJCQkgICAgIGlmYWNlLCBhZGRyLCBtYXNrLAogCQkJCQkJICAgICBhdWRpdF9pbmZvKTsKIAkJYnJlYWs7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpOgogCQlyZXRfdmFsID0gbmV0bGJsX3VubGhzaF9yZW1vdmVfYWRkcjYobmV0LAogCQkJCQkJICAgICBpZmFjZSwgYWRkciwgbWFzaywKQEAgLTExOTYsNyArMTE5Niw3IEBACiAJc3RydWN0IG5ldGxibF91bmxoc2hfaWZhY2UgKmlmYWNlOwogCXN0cnVjdCBsaXN0X2hlYWQgKml0ZXJfbGlzdDsKIAlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKmFkZHI0OwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJc3RydWN0IG5ldGxibF9hZjZsaXN0ICphZGRyNjsKICNlbmRpZgogCkBAIC0xMjI4LDcgKzEyMjgsNyBAQAogCQkJCQlnb3RvIHVubGFiZWxfc3RhdGljbGlzdF9yZXR1cm47CiAJCQkJfQogCQkJfQotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCQluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3JjdShhZGRyNiwKIAkJCQkJCSAgICZpZmFjZS0+YWRkcjZfbGlzdCkgewogCQkJCWlmIChpdGVyX2FkZHI2KysgPCBza2lwX2FkZHI2KQpAQCAtMTI3Nyw3ICsxMjc3LDcgQEAKIAl1MzIgc2tpcF9hZGRyNiA9IGNiLT5hcmdzWzFdOwogCXUzMiBpdGVyX2FkZHI0ID0gMDsKIAlzdHJ1Y3QgbmV0bGJsX2FmNGxpc3QgKmFkZHI0OwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJdTMyIGl0ZXJfYWRkcjYgPSAwOwogCXN0cnVjdCBuZXRsYmxfYWY2bGlzdCAqYWRkcjY7CiAjZW5kaWYKQEAgLTEzMDMsNyArMTMwMyw3IEBACiAJCQlnb3RvIHVubGFiZWxfc3RhdGljbGlzdGRlZl9yZXR1cm47CiAJCX0KIAl9Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAluZXRsYmxfYWY2bGlzdF9mb3JlYWNoX3JjdShhZGRyNiwgJmlmYWNlLT5hZGRyNl9saXN0KSB7CiAJCWlmIChpdGVyX2FkZHI2KysgPCBza2lwX2FkZHI2KQogCQkJY29udGludWU7CkBAIC0xNDk0LDcgKzE0OTQsNyBAQAogCQlzZWNhdHRyLT5hdHRyLnNlY2lkID0gbmV0bGJsX3VubGhzaF9hZGRyNF9lbnRyeShhZGRyNCktPnNlY2lkOwogCQlicmVhazsKIAl9Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIFBGX0lORVQ2OiB7CiAJCXN0cnVjdCBpcHY2aGRyICpoZHI2OwogCQlzdHJ1Y3QgbmV0bGJsX2FmNmxpc3QgKmFkZHI2OwpkaWZmIC0tZ2l0IGEvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jIGIvbmV0L25ldGxpbmsvYWZfbmV0bGluay5jCmluZGV4IDEyMDFiNmQuLjYyOWIwNjEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRsaW5rL2FmX25ldGxpbmsuYworKysgYi9uZXQvbmV0bGluay9hZl9uZXRsaW5rLmMKQEAgLTEzOSwxMiArMTM5LDEyIEBACiAKIHN0YXRpYyBBVE9NSUNfTk9USUZJRVJfSEVBRChuZXRsaW5rX2NoYWluKTsKIAotc3RhdGljIHUzMiBuZXRsaW5rX2dyb3VwX21hc2sodTMyIGdyb3VwKQorc3RhdGljIGlubGluZSB1MzIgbmV0bGlua19ncm91cF9tYXNrKHUzMiBncm91cCkKIHsKIAlyZXR1cm4gZ3JvdXAgPyAxIDw8IChncm91cCAtIDEpIDogMDsKIH0KIAotc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpubF9waWRfaGFzaGZuKHN0cnVjdCBubF9waWRfaGFzaCAqaGFzaCwgdTMyIHBpZCkKK3N0YXRpYyBpbmxpbmUgc3RydWN0IGhsaXN0X2hlYWQgKm5sX3BpZF9oYXNoZm4oc3RydWN0IG5sX3BpZF9oYXNoICpoYXNoLCB1MzIgcGlkKQogewogCXJldHVybiAmaGFzaC0+dGFibGVbamhhc2hfMXdvcmQocGlkLCBoYXNoLT5ybmQpICYgaGFzaC0+bWFza107CiB9CkBAIC0yMjYsOCArMjI2LDcgQEAKIAkJd2FrZV91cCgmbmxfdGFibGVfd2FpdCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNvY2sgKm5ldGxpbmtfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwgaW50IHByb3RvY29sLAotCQkJCQkgIHUzMiBwaWQpCitzdGF0aWMgc3RydWN0IHNvY2sgKm5ldGxpbmtfbG9va3VwKHN0cnVjdCBuZXQgKm5ldCwgaW50IHByb3RvY29sLCB1MzIgcGlkKQogewogCXN0cnVjdCBubF9waWRfaGFzaCAqaGFzaCA9ICZubF90YWJsZVtwcm90b2NvbF0uaGFzaDsKIAlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKQEAgLTI0OCw3ICsyNDcsNyBAQAogCXJldHVybiBzazsKIH0KIAotc3RhdGljIGlubGluZSBzdHJ1Y3QgaGxpc3RfaGVhZCAqbmxfcGlkX2hhc2hfemFsbG9jKHNpemVfdCBzaXplKQorc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpubF9waWRfaGFzaF96YWxsb2Moc2l6ZV90IHNpemUpCiB7CiAJaWYgKHNpemUgPD0gUEFHRV9TSVpFKQogCQlyZXR1cm4ga3phbGxvYyhzaXplLCBHRlBfQVRPTUlDKTsKQEAgLTI1OCw3ICsyNTcsNyBAQAogCQkJCQkgZ2V0X29yZGVyKHNpemUpKTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIG5sX3BpZF9oYXNoX2ZyZWUoc3RydWN0IGhsaXN0X2hlYWQgKnRhYmxlLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyB2b2lkIG5sX3BpZF9oYXNoX2ZyZWUoc3RydWN0IGhsaXN0X2hlYWQgKnRhYmxlLCBzaXplX3Qgc2l6ZSkKIHsKIAlpZiAoc2l6ZSA8PSBQQUdFX1NJWkUpCiAJCWtmcmVlKHRhYmxlKTsKQEAgLTU3OCw3ICs1NzcsNyBAQAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5ldGxpbmtfY2FwYWJsZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgZmxhZykKK3N0YXRpYyBpbmxpbmUgaW50IG5ldGxpbmtfY2FwYWJsZShjb25zdCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLCB1bnNpZ25lZCBpbnQgZmxhZykKIHsKIAlyZXR1cm4gKG5sX3RhYmxlW3NvY2stPnNrLT5za19wcm90b2NvbF0ubmxfbm9ucm9vdCAmIGZsYWcpIHx8CiAJICAgICAgIGNhcGFibGUoQ0FQX05FVF9BRE1JTik7CkBAIC04NDYsOCArODQ1LDcgQEAKIAlzb2NrX3B1dChzayk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IHNrX2J1ZmYgKm5ldGxpbmtfdHJpbShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJCQkgICBnZnBfdCBhbGxvY2F0aW9uKQorc3RhdGljIHN0cnVjdCBza19idWZmICpuZXRsaW5rX3RyaW0oc3RydWN0IHNrX2J1ZmYgKnNrYiwgZ2ZwX3QgYWxsb2NhdGlvbikKIHsKIAlpbnQgZGVsdGE7CiAKQEAgLTg3MSw3ICs4NjksNyBAQAogCXJldHVybiBza2I7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBuZXRsaW5rX3Jjdl93YWtlKHN0cnVjdCBzb2NrICpzaykKK3N0YXRpYyB2b2lkIG5ldGxpbmtfcmN2X3dha2Uoc3RydWN0IHNvY2sgKnNrKQogewogCXN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7CiAKQEAgLTg4MSw3ICs4NzksNyBAQAogCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm5say0+d2FpdCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5ldGxpbmtfdW5pY2FzdF9rZXJuZWwoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIGludCBuZXRsaW5rX3VuaWNhc3Rfa2VybmVsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKIAlpbnQgcmV0OwogCXN0cnVjdCBuZXRsaW5rX3NvY2sgKm5sayA9IG5sa19zayhzayk7CkBAIC05NTIsOCArOTUwLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKG5ldGxpbmtfaGFzX2xpc3RlbmVycyk7CiAKLXN0YXRpYyBpbmxpbmUgaW50IG5ldGxpbmtfYnJvYWRjYXN0X2RlbGl2ZXIoc3RydWN0IHNvY2sgKnNrLAotCQkJCQkgICAgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3N0YXRpYyBpbnQgbmV0bGlua19icm9hZGNhc3RfZGVsaXZlcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpza2IpCiB7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKIApAQCAtOTYyLDcgKzk1OSw3IEBACiAJCXNrYl9zZXRfb3duZXJfcihza2IsIHNrKTsKIAkJc2tiX3F1ZXVlX3RhaWwoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOwogCQlzay0+c2tfZGF0YV9yZWFkeShzaywgc2tiLT5sZW4pOwotCQlyZXR1cm4gYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA+IHNrLT5za19yY3ZidWY7CisJCXJldHVybiBhdG9taWNfcmVhZCgmc2stPnNrX3JtZW1fYWxsb2MpID4gKHNrLT5za19yY3ZidWYgPj4gMSk7CiAJfQogCXJldHVybiAtMTsKIH0KQEAgLTk4Miw3ICs5NzksNyBAQAogCXZvaWQgKnR4X2RhdGE7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBkb19vbmVfYnJvYWRjYXN0KHN0cnVjdCBzb2NrICpzaywKK3N0YXRpYyBpbnQgZG9fb25lX2Jyb2FkY2FzdChzdHJ1Y3Qgc29jayAqc2ssCiAJCQkJICAgc3RydWN0IG5ldGxpbmtfYnJvYWRjYXN0X2RhdGEgKnApCiB7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKQEAgLTExMTAsOCArMTEwNyw3IEBACiAJaW50IGNvZGU7CiB9OwogCi1zdGF0aWMgaW5saW5lIGludCBkb19vbmVfc2V0X2VycihzdHJ1Y3Qgc29jayAqc2ssCi0JCQkJIHN0cnVjdCBuZXRsaW5rX3NldF9lcnJfZGF0YSAqcCkKK3N0YXRpYyBpbnQgZG9fb25lX3NldF9lcnIoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3QgbmV0bGlua19zZXRfZXJyX2RhdGEgKnApCiB7CiAJc3RydWN0IG5ldGxpbmtfc29jayAqbmxrID0gbmxrX3NrKHNrKTsKIAlpbnQgcmV0ID0gMDsKZGlmZiAtLWdpdCBhL25ldC9uZXRsaW5rL2dlbmV0bGluay5jIGIvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKaW5kZXggNDgyZmE1Ny4uYTQwM2I2MSAxMDA2NDQKLS0tIGEvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKKysrIGIvbmV0L25ldGxpbmsvZ2VuZXRsaW5rLmMKQEAgLTMzLDYgKzMzLDE0IEBACiB9CiBFWFBPUlRfU1lNQk9MKGdlbmxfdW5sb2NrKTsKIAorI2lmZGVmIENPTkZJR19QUk9WRV9MT0NLSU5HCitpbnQgbG9ja2RlcF9nZW5sX2lzX2hlbGQodm9pZCkKK3sKKwlyZXR1cm4gbG9ja2RlcF9pc19oZWxkKCZnZW5sX211dGV4KTsKK30KK0VYUE9SVF9TWU1CT0wobG9ja2RlcF9nZW5sX2lzX2hlbGQpOworI2VuZGlmCisKICNkZWZpbmUgR0VOTF9GQU1fVEFCX1NJWkUJMTYKICNkZWZpbmUgR0VOTF9GQU1fVEFCX01BU0sJKEdFTkxfRkFNX1RBQl9TSVpFIC0gMSkKIApAQCAtOTgsNyArMTA2LDcgQEAKIC8qIE9mIGNvdXJzZSB3ZSBhcmUgZ29pbmcgdG8gaGF2ZSBwcm9ibGVtcyBvbmNlIHdlIGhpdAogICogMl4xNiBhbGl2ZSB0eXBlcywgYnV0IHRoYXQgY2FuIG9ubHkgaGFwcGVuIGJ5IHllYXIgMksKICovCi1zdGF0aWMgaW5saW5lIHUxNiBnZW5sX2dlbmVyYXRlX2lkKHZvaWQpCitzdGF0aWMgdTE2IGdlbmxfZ2VuZXJhdGVfaWQodm9pZCkKIHsKIAlzdGF0aWMgdTE2IGlkX2dlbl9pZHggPSBHRU5MX01JTl9JRDsKIAlpbnQgaTsKQEAgLTc4NCw2ICs3OTIsMTUgQEAKIAogCQluYW1lID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbQ1RSTF9BVFRSX0ZBTUlMWV9OQU1FXSk7CiAJCXJlcyA9IGdlbmxfZmFtaWx5X2ZpbmRfYnluYW1lKG5hbWUpOworI2lmZGVmIENPTkZJR19NT0RVTEVTCisJCWlmIChyZXMgPT0gTlVMTCkgeworCQkJZ2VubF91bmxvY2soKTsKKwkJCXJlcXVlc3RfbW9kdWxlKCJuZXQtcGYtJWQtcHJvdG8tJWQtdHlwZS0lcyIsCisJCQkJICAgICAgIFBGX05FVExJTkssIE5FVExJTktfR0VORVJJQywgbmFtZSk7CisJCQlnZW5sX2xvY2soKTsKKwkJCXJlcyA9IGdlbmxfZmFtaWx5X2ZpbmRfYnluYW1lKG5hbWUpOworCQl9CisjZW5kaWYKIAkJZXJyID0gLUVOT0VOVDsKIAl9CiAKQEAgLTk0NiwzICs5NjMsMTYgQEAKIAlyZXR1cm4gZ2VubG1zZ19tY2FzdChza2IsIHBpZCwgZ3JvdXAsIGZsYWdzKTsKIH0KIEVYUE9SVF9TWU1CT0woZ2VubG1zZ19tdWx0aWNhc3RfYWxsbnMpOworCit2b2lkIGdlbmxfbm90aWZ5KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXQgKm5ldCwgdTMyIHBpZCwgdTMyIGdyb3VwLAorCQkgc3RydWN0IG5sbXNnaGRyICpubGgsIGdmcF90IGZsYWdzKQoreworCXN0cnVjdCBzb2NrICpzayA9IG5ldC0+Z2VubF9zb2NrOworCWludCByZXBvcnQgPSAwOworCisJaWYgKG5saCkKKwkJcmVwb3J0ID0gbmxtc2dfcmVwb3J0KG5saCk7CisKKwlubG1zZ19ub3RpZnkoc2ssIHNrYiwgcGlkLCBncm91cCwgcmVwb3J0LCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGdlbmxfbm90aWZ5KTsKZGlmZiAtLWdpdCBhL25ldC9uZXRyb20vYWZfbmV0cm9tLmMgYi9uZXQvbmV0cm9tL2FmX25ldHJvbS5jCmluZGV4IDczMjE1MmYuLjdkYWIyMjkgMTAwNjQ0Ci0tLSBhL25ldC9uZXRyb20vYWZfbmV0cm9tLmMKKysrIGIvbmV0L25ldHJvbS9hZl9uZXRyb20uYwpAQCAtMzA2LDI2ICszMDYsMjYgQEAKIHsKIAlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKIAlzdHJ1Y3QgbnJfc29jayAqbnIgPSBucl9zayhzayk7Ci0JaW50IG9wdDsKKwl1bnNpZ25lZCBsb25nIG9wdDsKIAogCWlmIChsZXZlbCAhPSBTT0xfTkVUUk9NKQogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCi0JaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQorCWlmIChvcHRsZW4gPCBzaXplb2YodW5zaWduZWQgaW50KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoZ2V0X3VzZXIob3B0LCAoaW50IF9fdXNlciAqKW9wdHZhbCkpCisJaWYgKGdldF91c2VyKG9wdCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilvcHR2YWwpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAogCXN3aXRjaCAob3B0bmFtZSkgewogCWNhc2UgTkVUUk9NX1QxOgotCQlpZiAob3B0IDwgMSkKKwkJaWYgKG9wdCA8IDEgfHwgb3B0ID4gVUxPTkdfTUFYIC8gSFopCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbnItPnQxID0gb3B0ICogSFo7CiAJCXJldHVybiAwOwogCiAJY2FzZSBORVRST01fVDI6Ci0JCWlmIChvcHQgPCAxKQorCQlpZiAob3B0IDwgMSB8fCBvcHQgPiBVTE9OR19NQVggLyBIWikKIAkJCXJldHVybiAtRUlOVkFMOwogCQluci0+dDIgPSBvcHQgKiBIWjsKIAkJcmV0dXJuIDA7CkBAIC0zMzcsMTMgKzMzNywxMyBAQAogCQlyZXR1cm4gMDsKIAogCWNhc2UgTkVUUk9NX1Q0OgotCQlpZiAob3B0IDwgMSkKKwkJaWYgKG9wdCA8IDEgfHwgb3B0ID4gVUxPTkdfTUFYIC8gSFopCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbnItPnQ0ID0gb3B0ICogSFo7CiAJCXJldHVybiAwOwogCiAJY2FzZSBORVRST01fSURMRToKLQkJaWYgKG9wdCA8IDApCisJCWlmIChvcHQgPiBVTE9OR19NQVggLyAoNjAgKiBIWikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJbnItPmlkbGUgPSBvcHQgKiA2MCAqIEhaOwogCQlyZXR1cm4gMDsKQEAgLTEyNDQsNyArMTI0NCw4IEBACiAJY2FzZSBTSU9DQUREUlQ6CiAJY2FzZSBTSU9DREVMUlQ6CiAJY2FzZSBTSU9DTlJERUNPQlM6Ci0JCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkgcmV0dXJuIC1FUEVSTTsKKwkJaWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQorCQkJcmV0dXJuIC1FUEVSTTsKIAkJcmV0dXJuIG5yX3J0X2lvY3RsKGNtZCwgYXJncCk7CiAKIAlkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbmV0L25ldHJvbS9ucl9yb3V0ZS5jIGIvbmV0L25ldHJvbS9ucl9yb3V0ZS5jCmluZGV4IDkxNWE4N2IuLjJjZjMzMDEgMTAwNjQ0Ci0tLSBhL25ldC9uZXRyb20vbnJfcm91dGUuYworKysgYi9uZXQvbmV0cm9tL25yX3JvdXRlLmMKQEAgLTY3MCwxNCArNjcwLDE3IEBACiAJY2FzZSBTSU9DQUREUlQ6CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmbnJfcm91dGUsIGFyZywgc2l6ZW9mKHN0cnVjdCBucl9yb3V0ZV9zdHJ1Y3QpKSkKIAkJCXJldHVybiAtRUZBVUxUOworCQlpZiAobnJfcm91dGUubmRpZ2lzID4gQVgyNV9NQVhfRElHSVMpCisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKChkZXYgPSBucl9heDI1X2Rldl9nZXQobnJfcm91dGUuZGV2aWNlKSkgPT0gTlVMTCkKIAkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAobnJfcm91dGUubmRpZ2lzIDwgMCB8fCBucl9yb3V0ZS5uZGlnaXMgPiBBWDI1X01BWF9ESUdJUykgewotCQkJZGV2X3B1dChkZXYpOwotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCX0KIAkJc3dpdGNoIChucl9yb3V0ZS50eXBlKSB7CiAJCWNhc2UgTkVUUk9NX05PREU6CisJCQlpZiAoc3Rybmxlbihucl9yb3V0ZS5tbmVtb25pYywgNykgPT0gNykgeworCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisKIAkJCXJldCA9IG5yX2FkZF9ub2RlKCZucl9yb3V0ZS5jYWxsc2lnbiwKIAkJCQlucl9yb3V0ZS5tbmVtb25pYywKIAkJCQkmbnJfcm91dGUubmVpZ2hib3VyLApkaWZmIC0tZ2l0IGEvbmV0L25mYy9LY29uZmlnIGIvbmV0L25mYy9LY29uZmlnCmluZGV4IDU4Y2RkYWQuLjQ0Yzg2NWIgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvS2NvbmZpZworKysgYi9uZXQvbmZjL0tjb25maWcKQEAgLTE0LDUgKzE0LDYgQEAKIAkgIGJlIGNhbGxlZCBuZmMuCiAKIHNvdXJjZSAibmV0L25mYy9uY2kvS2NvbmZpZyIKK3NvdXJjZSAibmV0L25mYy9sbGNwL0tjb25maWciCiAKIHNvdXJjZSAiZHJpdmVycy9uZmMvS2NvbmZpZyIKZGlmZiAtLWdpdCBhL25ldC9uZmMvTWFrZWZpbGUgYi9uZXQvbmZjL01ha2VmaWxlCmluZGV4IGZiYjU1MGYuLjdiNGE2ZGMgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvTWFrZWZpbGUKKysrIGIvbmV0L25mYy9NYWtlZmlsZQpAQCAtNiwzICs2LDQgQEAKIG9iai0kKENPTkZJR19ORkNfTkNJKSArPSBuY2kvCiAKIG5mYy1vYmpzIDo9IGNvcmUubyBuZXRsaW5rLm8gYWZfbmZjLm8gcmF3c29jay5vCituZmMtJChDT05GSUdfTkZDX0xMQ1ApCSs9IGxsY3AvbGxjcC5vIGxsY3AvY29tbWFuZHMubyBsbGNwL3NvY2subwpkaWZmIC0tZ2l0IGEvbmV0L25mYy9jb3JlLmMgYi9uZXQvbmZjL2NvcmUuYwppbmRleCA0N2UwMmMxLi4zZGRmNmU2IDEwMDY0NAotLS0gYS9uZXQvbmZjL2NvcmUuYworKysgYi9uZXQvbmZjL2NvcmUuYwpAQCAtMjEsMTAgKzIxLDEzIEBACiAgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogJXM6ICIgZm10LCBfX2Z1bmNfXworCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9uZmMuaD4KIAogI2luY2x1ZGUgIm5mYy5oIgogCkBAIC0zMywyNSArMzYsNiBAQAogaW50IG5mY19kZXZsaXN0X2dlbmVyYXRpb247CiBERUZJTkVfTVVURVgobmZjX2Rldmxpc3RfbXV0ZXgpOwogCi1pbnQgbmZjX3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCi17Ci0Jc3RydWN0IHZhX2Zvcm1hdCB2YWY7Ci0JdmFfbGlzdCBhcmdzOwotCWludCByOwotCi0JdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKLQotCXZhZi5mbXQgPSBmb3JtYXQ7Ci0JdmFmLnZhID0gJmFyZ3M7Ci0KLQlyID0gcHJpbnRrKCIlc05GQzogJXBWXG4iLCBsZXZlbCwgJnZhZik7Ci0KLQl2YV9lbmQoYXJncyk7Ci0KLQlyZXR1cm4gcjsKLX0KLUVYUE9SVF9TWU1CT0wobmZjX3ByaW50ayk7Ci0KIC8qKgogICogbmZjX2Rldl91cCAtIHR1cm4gb24gdGhlIE5GQyBkZXZpY2UKICAqCkBAIC02Myw3ICs0Nyw3IEBACiB7CiAJaW50IHJjID0gMDsKIAotCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCWRldmljZV9sb2NrKCZkZXYtPmRldik7CiAKQEAgLTk3LDcgKzgxLDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKwlwcl9kZWJ1ZygiZGV2X25hbWU9JXNcbiIsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJZGV2aWNlX2xvY2soJmRldi0+ZGV2KTsKIApAQCAtMTM5LDcgKzEyMyw4IEBACiB7CiAJaW50IHJjOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMgcHJvdG9jb2xzPTB4JXgiLCBkZXZfbmFtZSgmZGV2LT5kZXYpLCBwcm90b2NvbHMpOworCXByX2RlYnVnKCJkZXZfbmFtZT0lcyBwcm90b2NvbHM9MHgleFxuIiwKKwkJIGRldl9uYW1lKCZkZXYtPmRldiksIHByb3RvY29scyk7CiAKIAlpZiAoIXByb3RvY29scykKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xNzQsNyArMTU5LDcgQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKwlwcl9kZWJ1ZygiZGV2X25hbWU9JXNcbiIsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJZGV2aWNlX2xvY2soJmRldi0+ZGV2KTsKIApAQCAtMTk2LDYgKzE4MSw4NiBAQAogCXJldHVybiByYzsKIH0KIAoraW50IG5mY19kZXBfbGlua191cChzdHJ1Y3QgbmZjX2RldiAqZGV2LCBpbnQgdGFyZ2V0X2luZGV4LAorCQkJCQl1OCBjb21tX21vZGUsIHU4IHJmX21vZGUpCit7CisJaW50IHJjID0gMDsKKworCXByX2RlYnVnKCJkZXZfbmFtZT0lcyBjb21tOiVkIHJmOiVkXG4iLAorCQkJZGV2X25hbWUoJmRldi0+ZGV2KSwgY29tbV9tb2RlLCByZl9tb2RlKTsKKworCWlmICghZGV2LT5vcHMtPmRlcF9saW5rX3VwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOworCisJaWYgKCFkZXZpY2VfaXNfcmVnaXN0ZXJlZCgmZGV2LT5kZXYpKSB7CisJCXJjID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAoZGV2LT5kZXBfbGlua191cCA9PSB0cnVlKSB7CisJCXJjID0gLUVBTFJFQURZOworCQlnb3RvIGVycm9yOworCX0KKworCXJjID0gZGV2LT5vcHMtPmRlcF9saW5rX3VwKGRldiwgdGFyZ2V0X2luZGV4LCBjb21tX21vZGUsIHJmX21vZGUpOworCitlcnJvcjoKKwlkZXZpY2VfdW5sb2NrKCZkZXYtPmRldik7CisJcmV0dXJuIHJjOworfQorCitpbnQgbmZjX2RlcF9saW5rX2Rvd24oc3RydWN0IG5mY19kZXYgKmRldikKK3sKKwlpbnQgcmMgPSAwOworCisJcHJfZGVidWcoImRldl9uYW1lPSVzXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKworCWlmICghZGV2LT5vcHMtPmRlcF9saW5rX2Rvd24pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCWRldmljZV9sb2NrKCZkZXYtPmRldik7CisKKwlpZiAoIWRldmljZV9pc19yZWdpc3RlcmVkKCZkZXYtPmRldikpIHsKKwkJcmMgPSAtRU5PREVWOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChkZXYtPmRlcF9saW5rX3VwID09IGZhbHNlKSB7CisJCXJjID0gLUVBTFJFQURZOworCQlnb3RvIGVycm9yOworCX0KKworCWlmIChkZXYtPmRlcF9yZl9tb2RlID09IE5GQ19SRl9UQVJHRVQpIHsKKwkJcmMgPSAtRU9QTk9UU1VQUDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlyYyA9IGRldi0+b3BzLT5kZXBfbGlua19kb3duKGRldik7CisJaWYgKCFyYykgeworCQlkZXYtPmRlcF9saW5rX3VwID0gZmFsc2U7CisJCW5mY19sbGNwX21hY19pc19kb3duKGRldik7CisJCW5mY19nZW5sX2RlcF9saW5rX2Rvd25fZXZlbnQoZGV2KTsKKwl9CisKK2Vycm9yOgorCWRldmljZV91bmxvY2soJmRldi0+ZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK2ludCBuZmNfZGVwX2xpbmtfaXNfdXAoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsCisJCQkJCXU4IGNvbW1fbW9kZSwgdTggcmZfbW9kZSkKK3sKKwlkZXYtPmRlcF9saW5rX3VwID0gdHJ1ZTsKKwlkZXYtPmRlcF9yZl9tb2RlID0gcmZfbW9kZTsKKworCW5mY19sbGNwX21hY19pc191cChkZXYsIHRhcmdldF9pZHgsIGNvbW1fbW9kZSwgcmZfbW9kZSk7CisKKwlyZXR1cm4gbmZjX2dlbmxfZGVwX2xpbmtfdXBfZXZlbnQoZGV2LCB0YXJnZXRfaWR4LCBjb21tX21vZGUsIHJmX21vZGUpOworfQorRVhQT1JUX1NZTUJPTChuZmNfZGVwX2xpbmtfaXNfdXApOworCiAvKioKICAqIG5mY19hY3RpdmF0ZV90YXJnZXQgLSBwcmVwYXJlIHRoZSB0YXJnZXQgZm9yIGRhdGEgZXhjaGFuZ2UKICAqCkBAIC0yMDcsOCArMjcyLDggQEAKIHsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJkZXZfbmFtZT0lcyB0YXJnZXRfaWR4PSV1IHByb3RvY29sPSV1IiwgZGV2X25hbWUoJmRldi0+ZGV2KSwKLQkJCQkJCQl0YXJnZXRfaWR4LCBwcm90b2NvbCk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzIHRhcmdldF9pZHg9JXUgcHJvdG9jb2w9JXVcbiIsCisJCSBkZXZfbmFtZSgmZGV2LT5kZXYpLCB0YXJnZXRfaWR4LCBwcm90b2NvbCk7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0yMzYsNyArMzAxLDggQEAKIHsKIAlpbnQgcmMgPSAwOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMgdGFyZ2V0X2lkeD0ldSIsIGRldl9uYW1lKCZkZXYtPmRldiksIHRhcmdldF9pZHgpOworCXByX2RlYnVnKCJkZXZfbmFtZT0lcyB0YXJnZXRfaWR4PSV1XG4iLAorCQkgZGV2X25hbWUoJmRldi0+ZGV2KSwgdGFyZ2V0X2lkeCk7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0yNzEsOCArMzM3LDggQEAKIHsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJkZXZfbmFtZT0lcyB0YXJnZXRfaWR4PSV1IHNrYi0+bGVuPSV1IiwgZGV2X25hbWUoJmRldi0+ZGV2KSwKLQkJCQkJCQl0YXJnZXRfaWR4LCBza2ItPmxlbik7CisJcHJfZGVidWcoImRldl9uYW1lPSVzIHRhcmdldF9pZHg9JXUgc2tiLT5sZW49JXVcbiIsCisJCSBkZXZfbmFtZSgmZGV2LT5kZXYpLCB0YXJnZXRfaWR4LCBza2ItPmxlbik7CiAKIAlkZXZpY2VfbG9jaygmZGV2LT5kZXYpOwogCkBAIC0yODksMTMgKzM1NSw1NCBAQAogCXJldHVybiByYzsKIH0KIAoraW50IG5mY19zZXRfcmVtb3RlX2dlbmVyYWxfYnl0ZXMoc3RydWN0IG5mY19kZXYgKmRldiwgdTggKmdiLCB1OCBnYl9sZW4pCit7CisJcHJfZGVidWcoImRldl9uYW1lPSVzIGdiX2xlbj0lZFxuIiwKKwkJCWRldl9uYW1lKCZkZXYtPmRldiksIGdiX2xlbik7CisKKwlpZiAoZ2JfbGVuID4gTkZDX01BWF9HVF9MRU4pCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIG5mY19sbGNwX3NldF9yZW1vdGVfZ2IoZGV2LCBnYiwgZ2JfbGVuKTsKK30KK0VYUE9SVF9TWU1CT0wobmZjX3NldF9yZW1vdGVfZ2VuZXJhbF9ieXRlcyk7CisKK3U4ICpuZmNfZ2V0X2xvY2FsX2dlbmVyYWxfYnl0ZXMoc3RydWN0IG5mY19kZXYgKmRldiwgdTggKmd0X2xlbikKK3sKKwlyZXR1cm4gbmZjX2xsY3BfZ2VuZXJhbF9ieXRlcyhkZXYsIGd0X2xlbik7Cit9CitFWFBPUlRfU1lNQk9MKG5mY19nZXRfbG9jYWxfZ2VuZXJhbF9ieXRlcyk7CisKIC8qKgotICogbmZjX2FsbG9jX3NrYiAtIGFsbG9jYXRlIGEgc2tiIGZvciBkYXRhIGV4Y2hhbmdlIHJlc3BvbnNlcworICogbmZjX2FsbG9jX3NlbmRfc2tiIC0gYWxsb2NhdGUgYSBza2IgZm9yIGRhdGEgZXhjaGFuZ2UgcmVzcG9uc2VzCiAgKgogICogQHNpemU6IHNpemUgdG8gYWxsb2NhdGUKICAqIEBnZnA6IGdmcCBmbGFncwogICovCi1zdHJ1Y3Qgc2tfYnVmZiAqbmZjX2FsbG9jX3NrYih1bnNpZ25lZCBpbnQgc2l6ZSwgZ2ZwX3QgZ2ZwKQorc3RydWN0IHNrX2J1ZmYgKm5mY19hbGxvY19zZW5kX3NrYihzdHJ1Y3QgbmZjX2RldiAqZGV2LCBzdHJ1Y3Qgc29jayAqc2ssCisJCQkJCXVuc2lnbmVkIGludCBmbGFncywgdW5zaWduZWQgaW50IHNpemUsCisJCQkJCXVuc2lnbmVkIGludCAqZXJyKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJdW5zaWduZWQgaW50IHRvdGFsX3NpemU7CisKKwl0b3RhbF9zaXplID0gc2l6ZSArCisJCWRldi0+dHhfaGVhZHJvb20gKyBkZXYtPnR4X3RhaWxyb29tICsgTkZDX0hFQURFUl9TSVpFOworCisJc2tiID0gc29ja19hbGxvY19zZW5kX3NrYihzaywgdG90YWxfc2l6ZSwgZmxhZ3MgJiBNU0dfRE9OVFdBSVQsIGVycik7CisJaWYgKHNrYikKKwkJc2tiX3Jlc2VydmUoc2tiLCBkZXYtPnR4X2hlYWRyb29tICsgTkZDX0hFQURFUl9TSVpFKTsKKworCXJldHVybiBza2I7Cit9CisKKy8qKgorICogbmZjX2FsbG9jX3JlY3Zfc2tiIC0gYWxsb2NhdGUgYSBza2IgZm9yIGRhdGEgZXhjaGFuZ2UgcmVzcG9uc2VzCisgKgorICogQHNpemU6IHNpemUgdG8gYWxsb2NhdGUKKyAqIEBnZnA6IGdmcCBmbGFncworICovCitzdHJ1Y3Qgc2tfYnVmZiAqbmZjX2FsbG9jX3JlY3Zfc2tiKHVuc2lnbmVkIGludCBzaXplLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAl1bnNpZ25lZCBpbnQgdG90YWxfc2l6ZTsKQEAgLTMwOCw3ICs0MTUsNyBAQAogCiAJcmV0dXJuIHNrYjsKIH0KLUVYUE9SVF9TWU1CT0wobmZjX2FsbG9jX3NrYik7CitFWFBPUlRfU1lNQk9MKG5mY19hbGxvY19yZWN2X3NrYik7CiAKIC8qKgogICogbmZjX3RhcmdldHNfZm91bmQgLSBpbmZvcm0gdGhhdCB0YXJnZXRzIHdlcmUgZm91bmQKQEAgLTMyNiw3ICs0MzMsNyBAQAogewogCWludCBpOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMgbl90YXJnZXRzPSVkIiwgZGV2X25hbWUoJmRldi0+ZGV2KSwgbl90YXJnZXRzKTsKKwlwcl9kZWJ1ZygiZGV2X25hbWU9JXMgbl90YXJnZXRzPSVkXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpLCBuX3RhcmdldHMpOwogCiAJZGV2LT5wb2xsaW5nID0gZmFsc2U7CiAKQEAgLTM2MCw3ICs0NjcsNyBAQAogewogCXN0cnVjdCBuZmNfZGV2ICpkZXYgPSB0b19uZmNfZGV2KGQpOwogCi0JbmZjX2RiZygiZGV2X25hbWU9JXMiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKwlwcl9kZWJ1ZygiZGV2X25hbWU9JXNcbiIsIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiAJbmZjX2dlbmxfZGF0YV9leGl0KCZkZXYtPmdlbmxfZGF0YSk7CiAJa2ZyZWUoZGV2LT50YXJnZXRzKTsKQEAgLTQ0Niw3ICs1NTMsNyBAQAogewogCWludCByYzsKIAotCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCW11dGV4X2xvY2soJm5mY19kZXZsaXN0X211dGV4KTsKIAluZmNfZGV2bGlzdF9nZW5lcmF0aW9uKys7CkBAIC00NTYsMTEgKzU2MywxNCBAQAogCWlmIChyYyA8IDApCiAJCXJldHVybiByYzsKIAorCXJjID0gbmZjX2xsY3BfcmVnaXN0ZXJfZGV2aWNlKGRldik7CisJaWYgKHJjKQorCQlwcl9lcnIoIkNvdWxkIG5vdCByZWdpc3RlciBsbGNwIGRldmljZVxuIik7CisKIAlyYyA9IG5mY19nZW5sX2RldmljZV9hZGRlZChkZXYpOwogCWlmIChyYykKLQkJbmZjX2RiZygiVGhlIHVzZXJzcGFjZSB3b24ndCBiZSBub3RpZmllZCB0aGF0IHRoZSBkZXZpY2UgJXMgd2FzIgotCQkJCQkJIiBhZGRlZCIsIGRldl9uYW1lKCZkZXYtPmRldikpOwotCisJCXByX2RlYnVnKCJUaGUgdXNlcnNwYWNlIHdvbid0IGJlIG5vdGlmaWVkIHRoYXQgdGhlIGRldmljZSAlcyB3YXMgYWRkZWRcbiIsCisJCQkgZGV2X25hbWUoJmRldi0+ZGV2KSk7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTQ3NSw3ICs1ODUsNyBAQAogewogCWludCByYzsKIAotCW5mY19kYmcoImRldl9uYW1lPSVzIiwgZGV2X25hbWUoJmRldi0+ZGV2KSk7CisJcHJfZGVidWcoImRldl9uYW1lPSVzXG4iLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKIAogCW11dGV4X2xvY2soJm5mY19kZXZsaXN0X211dGV4KTsKIAluZmNfZGV2bGlzdF9nZW5lcmF0aW9uKys7CkBAIC00ODgsMTAgKzU5OCwxMiBAQAogCiAJbXV0ZXhfdW5sb2NrKCZuZmNfZGV2bGlzdF9tdXRleCk7CiAKKwluZmNfbGxjcF91bnJlZ2lzdGVyX2RldmljZShkZXYpOworCiAJcmMgPSBuZmNfZ2VubF9kZXZpY2VfcmVtb3ZlZChkZXYpOwogCWlmIChyYykKLQkJbmZjX2RiZygiVGhlIHVzZXJzcGFjZSB3b24ndCBiZSBub3RpZmllZCB0aGF0IHRoZSBkZXZpY2UgJXMiCi0JCQkJCSIgd2FzIHJlbW92ZWQiLCBkZXZfbmFtZSgmZGV2LT5kZXYpKTsKKwkJcHJfZGVidWcoIlRoZSB1c2Vyc3BhY2Ugd29uJ3QgYmUgbm90aWZpZWQgdGhhdCB0aGUgZGV2aWNlICVzIHdhcyByZW1vdmVkXG4iLAorCQkJIGRldl9uYW1lKCZkZXYtPmRldikpOwogCiB9CiBFWFBPUlRfU1lNQk9MKG5mY191bnJlZ2lzdGVyX2RldmljZSk7CkBAIC01MDAsNyArNjEyLDcgQEAKIHsKIAlpbnQgcmM7CiAKLQluZmNfaW5mbygiTkZDIENvcmUgdmVyICVzIiwgVkVSU0lPTik7CisJcHJfaW5mbygiTkZDIENvcmUgdmVyICVzXG4iLCBWRVJTSU9OKTsKIAogCXJjID0gY2xhc3NfcmVnaXN0ZXIoJm5mY19jbGFzcyk7CiAJaWYgKHJjKQpAQCAtNTE3LDYgKzYyOSwxMCBAQAogCWlmIChyYykKIAkJZ290byBlcnJfcmF3c29jazsKIAorCXJjID0gbmZjX2xsY3BfaW5pdCgpOworCWlmIChyYykKKwkJZ290byBlcnJfbGxjcF9zb2NrOworCiAJcmMgPSBhZl9uZmNfaW5pdCgpOwogCWlmIChyYykKIAkJZ290byBlcnJfYWZfbmZjOwpAQCAtNTI0LDYgKzY0MCw4IEBACiAJcmV0dXJuIDA7CiAKIGVycl9hZl9uZmM6CisJbmZjX2xsY3BfZXhpdCgpOworZXJyX2xsY3Bfc29jazoKIAlyYXdzb2NrX2V4aXQoKTsKIGVycl9yYXdzb2NrOgogCW5mY19nZW5sX2V4aXQoKTsKQEAgLTUzNSw2ICs2NTMsNyBAQAogc3RhdGljIHZvaWQgX19leGl0IG5mY19leGl0KHZvaWQpCiB7CiAJYWZfbmZjX2V4aXQoKTsKKwluZmNfbGxjcF9leGl0KCk7CiAJcmF3c29ja19leGl0KCk7CiAJbmZjX2dlbmxfZXhpdCgpOwogCWNsYXNzX3VucmVnaXN0ZXIoJm5mY19jbGFzcyk7CmRpZmYgLS1naXQgYS9uZXQvbmZjL2xsY3AvS2NvbmZpZyBiL25ldC9uZmMvbGxjcC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjVlODEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmZjL2xsY3AvS2NvbmZpZwpAQCAtMCwwICsxLDcgQEAKK2NvbmZpZyBORkNfTExDUAorICAgICAgIGRlcGVuZHMgb24gTkZDICYmIEVYUEVSSU1FTlRBTAorICAgICAgIGJvb2wgIk5GQyBMTENQIHN1cHBvcnQgKEVYUEVSSU1FTlRBTCkiCisgICAgICAgZGVmYXVsdCBuCisgICAgICAgaGVscAorCSBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHN1cHBvcnQgZm9yIGEga2VybmVsIE5GQyBMTENQCisJIGltcGxlbWVudGF0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL25ldC9uZmMvbGxjcC9jb21tYW5kcy5jIGIvbmV0L25mYy9sbGNwL2NvbW1hbmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxZjJlZgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9uZmMvbGxjcC9jb21tYW5kcy5jCkBAIC0wLDAgKzEsMzk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExICBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgImxsY3A6ICVzOiAiIGZtdCwgX19mdW5jX18KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZmMuaD4KKworI2luY2x1ZGUgPG5ldC9uZmMvbmZjLmg+CisKKyNpbmNsdWRlICIuLi9uZmMuaCIKKyNpbmNsdWRlICJsbGNwLmgiCisKK3N0YXRpYyB1OCBsbGNwX3Rsdl9sZW5ndGhbTExDUF9UTFZfTUFYXSA9IHsKKwkwLAorCTEsIC8qIFZFUlNJT04gKi8KKwkyLCAvKiBNSVVYICovCisJMiwgLyogV0tTICovCisJMSwgLyogTFRPICovCisJMSwgLyogUlcgKi8KKwkwLCAvKiBTTiAqLworCTEsIC8qIE9QVCAqLworCTAsIC8qIFNEUkVRICovCisJMiwgLyogU0RSRVMgKi8KKworfTsKKworc3RhdGljIHU4IGxsY3BfdGx2OCh1OCAqdGx2LCB1OCB0eXBlKQoreworCWlmICh0bHZbMF0gIT0gdHlwZSB8fCB0bHZbMV0gIT0gbGxjcF90bHZfbGVuZ3RoW3RsdlswXV0pCisJCXJldHVybiAwOworCisJcmV0dXJuIHRsdlsyXTsKK30KKworc3RhdGljIHU4IGxsY3BfdGx2MTYodTggKnRsdiwgdTggdHlwZSkKK3sKKwlpZiAodGx2WzBdICE9IHR5cGUgfHwgdGx2WzFdICE9IGxsY3BfdGx2X2xlbmd0aFt0bHZbMF1dKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBiZTE2X3RvX2NwdSgqKChfX2JlMTYgKikodGx2ICsgMikpKTsKK30KKworCitzdGF0aWMgdTggbGxjcF90bHZfdmVyc2lvbih1OCAqdGx2KQoreworCXJldHVybiBsbGNwX3RsdjgodGx2LCBMTENQX1RMVl9WRVJTSU9OKTsKK30KKworc3RhdGljIHUxNiBsbGNwX3Rsdl9taXV4KHU4ICp0bHYpCit7CisJcmV0dXJuIGxsY3BfdGx2MTYodGx2LCBMTENQX1RMVl9NSVVYKSAmIDB4N2Y7Cit9CisKK3N0YXRpYyB1MTYgbGxjcF90bHZfd2tzKHU4ICp0bHYpCit7CisJcmV0dXJuIGxsY3BfdGx2MTYodGx2LCBMTENQX1RMVl9XS1MpOworfQorCitzdGF0aWMgdTE2IGxsY3BfdGx2X2x0byh1OCAqdGx2KQoreworCXJldHVybiBsbGNwX3RsdjgodGx2LCBMTENQX1RMVl9MVE8pOworfQorCitzdGF0aWMgdTggbGxjcF90bHZfb3B0KHU4ICp0bHYpCit7CisJcmV0dXJuIGxsY3BfdGx2OCh0bHYsIExMQ1BfVExWX09QVCk7Cit9CisKK3N0YXRpYyB1OCBsbGNwX3Rsdl9ydyh1OCAqdGx2KQoreworCXJldHVybiBsbGNwX3RsdjgodGx2LCBMTENQX1RMVl9SVykgJiAweGY7Cit9CisKK3U4ICpuZmNfbGxjcF9idWlsZF90bHYodTggdHlwZSwgdTggKnZhbHVlLCB1OCB2YWx1ZV9sZW5ndGgsIHU4ICp0bHZfbGVuZ3RoKQoreworCXU4ICp0bHYsIGxlbmd0aDsKKworCXByX2RlYnVnKCJ0eXBlICVkXG4iLCB0eXBlKTsKKworCWlmICh0eXBlID49IExMQ1BfVExWX01BWCkKKwkJcmV0dXJuIE5VTEw7CisKKwlsZW5ndGggPSBsbGNwX3Rsdl9sZW5ndGhbdHlwZV07CisJaWYgKGxlbmd0aCA9PSAwICYmIHZhbHVlX2xlbmd0aCA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwllbHNlCisJCWxlbmd0aCA9IHZhbHVlX2xlbmd0aDsKKworCSp0bHZfbGVuZ3RoID0gMiArIGxlbmd0aDsKKwl0bHYgPSBremFsbG9jKDIgKyBsZW5ndGgsIEdGUF9LRVJORUwpOworCWlmICh0bHYgPT0gTlVMTCkKKwkJcmV0dXJuIHRsdjsKKworCXRsdlswXSA9IHR5cGU7CisJdGx2WzFdID0gbGVuZ3RoOworCW1lbWNweSh0bHYgKyAyLCB2YWx1ZSwgbGVuZ3RoKTsKKworCXJldHVybiB0bHY7Cit9CisKK2ludCBuZmNfbGxjcF9wYXJzZV90bHYoc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwKKwkJCXU4ICp0bHZfYXJyYXksIHUxNiB0bHZfYXJyYXlfbGVuKQoreworCXU4ICp0bHYgPSB0bHZfYXJyYXksIHR5cGUsIGxlbmd0aCwgb2Zmc2V0ID0gMDsKKworCXByX2RlYnVnKCJUTFYgYXJyYXkgbGVuZ3RoICVkXG4iLCB0bHZfYXJyYXlfbGVuKTsKKworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXdoaWxlIChvZmZzZXQgPCB0bHZfYXJyYXlfbGVuKSB7CisJCXR5cGUgPSB0bHZbMF07CisJCWxlbmd0aCA9IHRsdlsxXTsKKworCQlwcl9kZWJ1ZygidHlwZSAweCV4IGxlbmd0aCAlZFxuIiwgdHlwZSwgbGVuZ3RoKTsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBMTENQX1RMVl9WRVJTSU9OOgorCQkJbG9jYWwtPnJlbW90ZV92ZXJzaW9uID0gbGxjcF90bHZfdmVyc2lvbih0bHYpOworCQkJYnJlYWs7CisJCWNhc2UgTExDUF9UTFZfTUlVWDoKKwkJCWxvY2FsLT5yZW1vdGVfbWl1ID0gbGxjcF90bHZfbWl1eCh0bHYpICsgMTI4OworCQkJYnJlYWs7CisJCWNhc2UgTExDUF9UTFZfV0tTOgorCQkJbG9jYWwtPnJlbW90ZV93a3MgPSBsbGNwX3Rsdl93a3ModGx2KTsKKwkJCWJyZWFrOworCQljYXNlIExMQ1BfVExWX0xUTzoKKwkJCWxvY2FsLT5yZW1vdGVfbHRvID0gbGxjcF90bHZfbHRvKHRsdikgKiAxMDsKKwkJCWJyZWFrOworCQljYXNlIExMQ1BfVExWX09QVDoKKwkJCWxvY2FsLT5yZW1vdGVfb3B0ID0gbGxjcF90bHZfb3B0KHRsdik7CisJCQlicmVhazsKKwkJY2FzZSBMTENQX1RMVl9SVzoKKwkJCWxvY2FsLT5yZW1vdGVfcncgPSBsbGNwX3Rsdl9ydyh0bHYpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoIkludmFsaWQgZ3QgdGx2IHZhbHVlIDB4JXhcbiIsIHR5cGUpOworCQkJYnJlYWs7CisJCX0KKworCQlvZmZzZXQgKz0gbGVuZ3RoICsgMjsKKwkJdGx2ICs9IGxlbmd0aCArIDI7CisJfQorCisJcHJfZGVidWcoInZlcnNpb24gMHgleCBtaXUgJWQgbHRvICVkIG9wdCAweCV4IHdrcyAweCV4IHJ3ICVkXG4iLAorCQlsb2NhbC0+cmVtb3RlX3ZlcnNpb24sIGxvY2FsLT5yZW1vdGVfbWl1LAorCQlsb2NhbC0+cmVtb3RlX2x0bywgbG9jYWwtPnJlbW90ZV9vcHQsCisJCWxvY2FsLT5yZW1vdGVfd2tzLCBsb2NhbC0+cmVtb3RlX3J3KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmxsY3BfYWRkX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqcGR1LAorCQkJCQl1OCBkc2FwLCB1OCBzc2FwLCB1OCBwdHlwZSkKK3sKKwl1OCBoZWFkZXJbMl07CisKKwlwcl9kZWJ1ZygicHR5cGUgMHgleCBkc2FwIDB4JXggc3NhcCAweCV4XG4iLCBwdHlwZSwgZHNhcCwgc3NhcCk7CisKKwloZWFkZXJbMF0gPSAodTgpKChkc2FwIDw8IDIpIHwgKHB0eXBlID4+IDIpKTsKKwloZWFkZXJbMV0gPSAodTgpKChwdHlwZSA8PCA2KSB8IHNzYXApOworCisJcHJfZGVidWcoImhlYWRlciAweCV4IDB4JXhcbiIsIGhlYWRlclswXSwgaGVhZGVyWzFdKTsKKworCW1lbWNweShza2JfcHV0KHBkdSwgTExDUF9IRUFERVJfU0laRSksIGhlYWRlciwgTExDUF9IRUFERVJfU0laRSk7CisKKwlyZXR1cm4gcGR1OworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmxsY3BfYWRkX3RsdihzdHJ1Y3Qgc2tfYnVmZiAqcGR1LCB1OCAqdGx2LCB1OCB0bHZfbGVuZ3RoKQoreworCS8qIFhYWCBBZGQgYW4gc2tiIGxlbmd0aCBjaGVjayAqLworCisJaWYgKHRsdiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweShza2JfcHV0KHBkdSwgdGx2X2xlbmd0aCksIHRsdiwgdGx2X2xlbmd0aCk7CisKKwlyZXR1cm4gcGR1OworfQorCitzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmxsY3BfYWxsb2NhdGVfcGR1KHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrLAorCQkJCQkJCXU4IGNtZCwgdTE2IHNpemUpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgZXJyOworCisJaWYgKHNvY2stPnNzYXAgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwlza2IgPSBuZmNfYWxsb2Nfc2VuZF9za2Ioc29jay0+ZGV2LCAmc29jay0+c2ssIE1TR19ET05UV0FJVCwKKwkJCQkJc2l6ZSArIExMQ1BfSEVBREVSX1NJWkUsICZlcnIpOworCWlmIChza2IgPT0gTlVMTCkgeworCQlwcl9lcnIoIkNvdWxkIG5vdCBhbGxvY2F0ZSBQRFVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlza2IgPSBsbGNwX2FkZF9oZWFkZXIoc2tiLCBzb2NrLT5kc2FwLCBzb2NrLT5zc2FwLCBjbWQpOworCisJcmV0dXJuIHNrYjsKK30KKworaW50IG5mY19sbGNwX2Rpc2Nvbm5lY3Qoc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmZjX2RldiAqZGV2OworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWw7CisJdTE2IHNpemUgPSAwOworCisJcHJfZGVidWcoIlNlbmRpbmcgRElTQ1xuIik7CisKKwlsb2NhbCA9IHNvY2stPmxvY2FsOworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldiA9IHNvY2stPmRldjsKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJc2l6ZSArPSBMTENQX0hFQURFUl9TSVpFOworCXNpemUgKz0gZGV2LT50eF9oZWFkcm9vbSArIGRldi0+dHhfdGFpbHJvb20gKyBORkNfSEVBREVSX1NJWkU7CisKKwlza2IgPSBhbGxvY19za2Ioc2l6ZSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT50eF9oZWFkcm9vbSArIE5GQ19IRUFERVJfU0laRSk7CisKKwlza2IgPSBsbGNwX2FkZF9oZWFkZXIoc2tiLCBzb2NrLT5zc2FwLCBzb2NrLT5kc2FwLCBMTENQX1BEVV9ESVNDKTsKKworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+dHhfcXVldWUsIHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5mY19sbGNwX3NlbmRfc3ltbShzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbDsKKwl1MTYgc2l6ZSA9IDA7CisKKwlwcl9kZWJ1ZygiU2VuZGluZyBTWU1NXG4iKTsKKworCWxvY2FsID0gbmZjX2xsY3BfZmluZF9sb2NhbChkZXYpOworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNpemUgKz0gTExDUF9IRUFERVJfU0laRTsKKwlzaXplICs9IGRldi0+dHhfaGVhZHJvb20gKyBkZXYtPnR4X3RhaWxyb29tICsgTkZDX0hFQURFUl9TSVpFOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcmVzZXJ2ZShza2IsIGRldi0+dHhfaGVhZHJvb20gKyBORkNfSEVBREVSX1NJWkUpOworCisJc2tiID0gbGxjcF9hZGRfaGVhZGVyKHNrYiwgMCwgMCwgTExDUF9QRFVfU1lNTSk7CisKKwlyZXR1cm4gbmZjX2RhdGFfZXhjaGFuZ2UoZGV2LCBsb2NhbC0+dGFyZ2V0X2lkeCwgc2tiLAorCQkJCQluZmNfbGxjcF9yZWN2LCBsb2NhbCk7Cit9CisKK2ludCBuZmNfbGxjcF9zZW5kX2Nvbm5lY3Qoc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spCit7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCXU4ICpzZXJ2aWNlX25hbWVfdGx2ID0gTlVMTCwgc2VydmljZV9uYW1lX3Rsdl9sZW5ndGg7CisJaW50IGVycjsKKwl1MTYgc2l6ZSA9IDA7CisKKwlwcl9kZWJ1ZygiU2VuZGluZyBDT05ORUNUXG4iKTsKKworCWxvY2FsID0gc29jay0+bG9jYWw7CisJaWYgKGxvY2FsID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKHNvY2stPnNlcnZpY2VfbmFtZSAhPSBOVUxMKSB7CisJCXNlcnZpY2VfbmFtZV90bHYgPSBuZmNfbGxjcF9idWlsZF90bHYoTExDUF9UTFZfU04sCisJCQkJCXNvY2stPnNlcnZpY2VfbmFtZSwKKwkJCQkJc29jay0+c2VydmljZV9uYW1lX2xlbiwKKwkJCQkJJnNlcnZpY2VfbmFtZV90bHZfbGVuZ3RoKTsKKwkJc2l6ZSArPSBzZXJ2aWNlX25hbWVfdGx2X2xlbmd0aDsKKwl9CisKKwlwcl9kZWJ1ZygiU0tCIHNpemUgJWQgU04gbGVuZ3RoICV6dVxuIiwgc2l6ZSwgc29jay0+c2VydmljZV9uYW1lX2xlbik7CisKKwlza2IgPSBsbGNwX2FsbG9jYXRlX3BkdShzb2NrLCBMTENQX1BEVV9DT05ORUNULCBzaXplKTsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJvcl90bHY7CisJfQorCisJaWYgKHNlcnZpY2VfbmFtZV90bHYgIT0gTlVMTCkKKwkJc2tiID0gbGxjcF9hZGRfdGx2KHNrYiwgc2VydmljZV9uYW1lX3RsdiwKKwkJCQkJc2VydmljZV9uYW1lX3Rsdl9sZW5ndGgpOworCisJc2tiX3F1ZXVlX3RhaWwoJmxvY2FsLT50eF9xdWV1ZSwgc2tiKTsKKworCXJldHVybiAwOworCitlcnJvcl90bHY6CisJcHJfZXJyKCJlcnJvciAlZFxuIiwgZXJyKTsKKworCWtmcmVlKHNlcnZpY2VfbmFtZV90bHYpOworCisJcmV0dXJuIGVycjsKK30KKworaW50IG5mY19sbGNwX3NlbmRfY2Moc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spCit7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCisJcHJfZGVidWcoIlNlbmRpbmcgQ0NcbiIpOworCisJbG9jYWwgPSBzb2NrLT5sb2NhbDsKKwlpZiAobG9jYWwgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlza2IgPSBsbGNwX2FsbG9jYXRlX3BkdShzb2NrLCBMTENQX1BEVV9DQywgMCk7CisJaWYgKHNrYiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYl9xdWV1ZV90YWlsKCZsb2NhbC0+dHhfcXVldWUsIHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5mY19sbGNwX3NlbmRfZG0oc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwgdTggc3NhcCwgdTggZHNhcCwgdTggcmVhc29uKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJc3RydWN0IG5mY19kZXYgKmRldjsKKwl1MTYgc2l6ZSA9IDE7IC8qIFJlYXNvbiBjb2RlICovCisKKwlwcl9kZWJ1ZygiU2VuZGluZyBETSByZWFzb24gMHgleFxuIiwgcmVhc29uKTsKKworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldiA9IGxvY2FsLT5kZXY7CisJaWYgKGRldiA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNpemUgKz0gTExDUF9IRUFERVJfU0laRTsKKwlzaXplICs9IGRldi0+dHhfaGVhZHJvb20gKyBkZXYtPnR4X3RhaWxyb29tICsgTkZDX0hFQURFUl9TSVpFOworCisJc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9LRVJORUwpOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcmVzZXJ2ZShza2IsIGRldi0+dHhfaGVhZHJvb20gKyBORkNfSEVBREVSX1NJWkUpOworCisJc2tiID0gbGxjcF9hZGRfaGVhZGVyKHNrYiwgc3NhcCwgZHNhcCwgTExDUF9QRFVfRE0pOworCisJbWVtY3B5KHNrYl9wdXQoc2tiLCAxKSwgJnJlYXNvbiwgMSk7CisKKwlza2JfcXVldWVfaGVhZCgmbG9jYWwtPnR4X3F1ZXVlLCBza2IpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBuZmNfbGxjcF9zZW5kX2Rpc2Nvbm5lY3Qoc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsOworCisJcHJfZGVidWcoIlNlbmQgRElTQ1xuIik7CisKKwlsb2NhbCA9IHNvY2stPmxvY2FsOworCWlmIChsb2NhbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXNrYiA9IGxsY3BfYWxsb2NhdGVfcGR1KHNvY2ssIExMQ1BfUERVX0RJU0MsIDApOworCWlmIChza2IgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlza2JfcXVldWVfaGVhZCgmbG9jYWwtPnR4X3F1ZXVlLCBza2IpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmZjL2xsY3AvbGxjcC5jIGIvbmV0L25mYy9sbGNwL2xsY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDMyNjgwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25mYy9sbGNwL2xsY3AuYwpAQCAtMCwwICsxLDk3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpICJsbGNwOiAlczogIiBmbXQsIF9fZnVuY19fCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L25mYy5oPgorCisjaW5jbHVkZSAiLi4vbmZjLmgiCisjaW5jbHVkZSAibGxjcC5oIgorCitzdGF0aWMgdTggbGxjcF9tYWdpY1szXSA9IHsweDQ2LCAweDY2LCAweDZkfTsKKworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgbGxjcF9kZXZpY2VzOworCitzdGF0aWMgdm9pZCBuZmNfbGxjcF9zb2NrZXRfcmVsZWFzZShzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsKQoreworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpwYXJlbnQsICpzLCAqbjsKKwlzdHJ1Y3Qgc29jayAqc2ssICpwYXJlbnRfc2s7CisJaW50IGk7CisKKworCW11dGV4X2xvY2soJmxvY2FsLT5zb2NrZXRfbG9jayk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTExDUF9NQVhfU0FQOyBpKyspIHsKKwkJcGFyZW50ID0gbG9jYWwtPnNvY2tldHNbaV07CisJCWlmIChwYXJlbnQgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFJlbGVhc2UgYWxsIGNoaWxkIHNvY2tldHMgKi8KKwkJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHMsIG4sICZwYXJlbnQtPmxpc3QsIGxpc3QpIHsKKwkJCWxpc3RfZGVsKCZzLT5saXN0KTsKKwkJCXNrID0gJnMtPnNrOworCisJCQlsb2NrX3NvY2soc2spOworCisJCQlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ09OTkVDVEVEKQorCQkJCW5mY19wdXRfZGV2aWNlKHMtPmRldik7CisKKwkJCXNrLT5za19zdGF0ZSA9IExMQ1BfQ0xPU0VEOworCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKworCQkJcmVsZWFzZV9zb2NrKHNrKTsKKwkJfQorCisJCXBhcmVudF9zayA9ICZwYXJlbnQtPnNrOworCisJCWxvY2tfc29jayhwYXJlbnRfc2spOworCisJCWlmIChwYXJlbnRfc2stPnNrX3N0YXRlID09IExMQ1BfTElTVEVOKSB7CisJCQlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqbHNrLCAqbjsKKwkJCXN0cnVjdCBzb2NrICphY2NlcHRfc2s7CisKKwkJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShsc2ssIG4sICZwYXJlbnQtPmFjY2VwdF9xdWV1ZSwKKwkJCQkJCQkJYWNjZXB0X3F1ZXVlKSB7CisJCQkJYWNjZXB0X3NrID0gJmxzay0+c2s7CisJCQkJbG9ja19zb2NrKGFjY2VwdF9zayk7CisKKwkJCQluZmNfbGxjcF9hY2NlcHRfdW5saW5rKGFjY2VwdF9zayk7CisKKwkJCQlhY2NlcHRfc2stPnNrX3N0YXRlID0gTExDUF9DTE9TRUQ7CisJCQkJc29ja19zZXRfZmxhZyhhY2NlcHRfc2ssIFNPQ0tfREVBRCk7CisKKwkJCQlyZWxlYXNlX3NvY2soYWNjZXB0X3NrKTsKKworCQkJCXNvY2tfb3JwaGFuKGFjY2VwdF9zayk7CisJCQl9CisJCX0KKworCQlpZiAocGFyZW50X3NrLT5za19zdGF0ZSA9PSBMTENQX0NPTk5FQ1RFRCkKKwkJCW5mY19wdXRfZGV2aWNlKHBhcmVudC0+ZGV2KTsKKworCQlwYXJlbnRfc2stPnNrX3N0YXRlID0gTExDUF9DTE9TRUQ7CisJCXNvY2tfc2V0X2ZsYWcocGFyZW50X3NrLCBTT0NLX0RFQUQpOworCisJCXJlbGVhc2Vfc29jayhwYXJlbnRfc2spOworCX0KKworCW11dGV4X3VubG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmZjX2xsY3BfdGltZW91dF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBuZmNfbGxjcF9sb2NhbCwKKwkJCQkJCQl0aW1lb3V0X3dvcmspOworCisJbmZjX2RlcF9saW5rX2Rvd24obG9jYWwtPmRldik7Cit9CisKK3N0YXRpYyB2b2lkIG5mY19sbGNwX3N5bW1fdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwgPSAoc3RydWN0IG5mY19sbGNwX2xvY2FsICopIGRhdGE7CisKKwlwcl9lcnIoIlNZTU0gdGltZW91dFxuIik7CisKKwlxdWV1ZV93b3JrKGxvY2FsLT50aW1lb3V0X3dxLCAmbG9jYWwtPnRpbWVvdXRfd29yayk7Cit9CisKK3N0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbmZjX2xsY3BfZmluZF9sb2NhbChzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwsICpuOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxvY2FsLCBuLCAmbGxjcF9kZXZpY2VzLCBsaXN0KQorCQlpZiAobG9jYWwtPmRldiA9PSBkZXYpCisJCQlyZXR1cm4gbG9jYWw7CisKKwlwcl9kZWJ1ZygiTm8gZGV2aWNlIGZvdW5kXG4iKTsKKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY2hhciAqd2tzW10gPSB7CisJTlVMTCwKKwlOVUxMLCAvKiBTRFAgKi8KKwkidXJuOm5mYzpzbjppcCIsCisJInVybjpuZmM6c246b2JleCIsCisJInVybjpuZmM6c246c25lcCIsCit9OworCitzdGF0aWMgaW50IG5mY19sbGNwX3drc19zYXAoY2hhciAqc2VydmljZV9uYW1lLCBzaXplX3Qgc2VydmljZV9uYW1lX2xlbikKK3sKKwlpbnQgc2FwLCBudW1fd2tzOworCisJcHJfZGVidWcoIiVzXG4iLCBzZXJ2aWNlX25hbWUpOworCisJaWYgKHNlcnZpY2VfbmFtZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW51bV93a3MgPSBBUlJBWV9TSVpFKHdrcyk7CisKKwlmb3IgKHNhcCA9IDAgOyBzYXAgPCBudW1fd2tzOyBzYXArKykgeworCQlpZiAod2tzW3NhcF0gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdHJuY21wKHdrc1tzYXBdLCBzZXJ2aWNlX25hbWUsIHNlcnZpY2VfbmFtZV9sZW4pID09IDApCisJCQlyZXR1cm4gc2FwOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCit1OCBuZmNfbGxjcF9nZXRfc2RwX3NzYXAoc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwKKwkJCQlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqc29jaykKK3sKKwltdXRleF9sb2NrKCZsb2NhbC0+c2RwX2xvY2spOworCisJaWYgKHNvY2stPnNlcnZpY2VfbmFtZSAhPSBOVUxMICYmIHNvY2stPnNlcnZpY2VfbmFtZV9sZW4gPiAwKSB7CisJCWludCBzc2FwID0gbmZjX2xsY3Bfd2tzX3NhcChzb2NrLT5zZXJ2aWNlX25hbWUsCisJCQkJCQlzb2NrLT5zZXJ2aWNlX25hbWVfbGVuKTsKKworCQlpZiAoc3NhcCA+IDApIHsKKwkJCXByX2RlYnVnKCJXS1MgJWRcbiIsIHNzYXApOworCisJCQkvKiBUaGlzIGlzIGEgV0tTLCBsZXQncyBjaGVjayBpZiBpdCdzIGZyZWUgKi8KKwkJCWlmIChsb2NhbC0+bG9jYWxfd2tzICYgQklUKHNzYXApKSB7CisJCQkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c2RwX2xvY2spOworCisJCQkJcmV0dXJuIExMQ1BfU0FQX01BWDsKKwkJCX0KKworCQkJc2V0X2JpdChCSVQoc3NhcCksICZsb2NhbC0+bG9jYWxfd2tzKTsKKwkJCW11dGV4X3VubG9jaygmbG9jYWwtPnNkcF9sb2NrKTsKKworCQkJcmV0dXJuIHNzYXA7CisJCX0KKworCQkvKgorCQkgKiBUaGlzIGlzIG5vdCBhIHdlbGwga25vd24gc2VydmljZSwKKwkJICogd2Ugc2hvdWxkIHRyeSB0byBmaW5kIGEgbG9jYWwgU0RQIGZyZWUgc3BvdAorCQkgKi8KKwkJc3NhcCA9IGZpbmRfZmlyc3RfemVyb19iaXQoJmxvY2FsLT5sb2NhbF9zZHAsIExMQ1BfU0RQX05VTV9TQVApOworCQlpZiAoc3NhcCA9PSBMTENQX1NEUF9OVU1fU0FQKSB7CisJCQltdXRleF91bmxvY2soJmxvY2FsLT5zZHBfbG9jayk7CisKKwkJCXJldHVybiBMTENQX1NBUF9NQVg7CisJCX0KKworCQlwcl9kZWJ1ZygiU0RQIHNzYXAgJWRcbiIsIExMQ1BfV0tTX05VTV9TQVAgKyBzc2FwKTsKKworCQlzZXRfYml0KEJJVChzc2FwKSwgJmxvY2FsLT5sb2NhbF9zZHApOworCQltdXRleF91bmxvY2soJmxvY2FsLT5zZHBfbG9jayk7CisKKwkJcmV0dXJuIExMQ1BfV0tTX05VTV9TQVAgKyBzc2FwOworCisJfSBlbHNlIGlmIChzb2NrLT5zc2FwICE9IDApIHsKKwkJaWYgKHNvY2stPnNzYXAgPCBMTENQX1dLU19OVU1fU0FQKSB7CisJCQlpZiAoIShsb2NhbC0+bG9jYWxfd2tzICYgQklUKHNvY2stPnNzYXApKSkgeworCQkJCXNldF9iaXQoQklUKHNvY2stPnNzYXApLCAmbG9jYWwtPmxvY2FsX3drcyk7CisJCQkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c2RwX2xvY2spOworCisJCQkJcmV0dXJuIHNvY2stPnNzYXA7CisJCQl9CisKKwkJfSBlbHNlIGlmIChzb2NrLT5zc2FwIDwgTExDUF9TRFBfTlVNX1NBUCkgeworCQkJaWYgKCEobG9jYWwtPmxvY2FsX3NkcCAmCisJCQkJQklUKHNvY2stPnNzYXAgLSBMTENQX1dLU19OVU1fU0FQKSkpIHsKKwkJCQlzZXRfYml0KEJJVChzb2NrLT5zc2FwIC0gTExDUF9XS1NfTlVNX1NBUCksCisJCQkJCQkJJmxvY2FsLT5sb2NhbF9zZHApOworCQkJCW11dGV4X3VubG9jaygmbG9jYWwtPnNkcF9sb2NrKTsKKworCQkJCXJldHVybiBzb2NrLT5zc2FwOworCQkJfQorCQl9CisJfQorCisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c2RwX2xvY2spOworCisJcmV0dXJuIExMQ1BfU0FQX01BWDsKK30KKwordTggbmZjX2xsY3BfZ2V0X2xvY2FsX3NzYXAoc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCkKK3sKKwl1OCBsb2NhbF9zc2FwOworCisJbXV0ZXhfbG9jaygmbG9jYWwtPnNkcF9sb2NrKTsKKworCWxvY2FsX3NzYXAgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZsb2NhbC0+bG9jYWxfc2FwLCBMTENQX0xPQ0FMX05VTV9TQVApOworCWlmIChsb2NhbF9zc2FwID09IExMQ1BfTE9DQUxfTlVNX1NBUCkgeworCQltdXRleF91bmxvY2soJmxvY2FsLT5zZHBfbG9jayk7CisJCXJldHVybiBMTENQX1NBUF9NQVg7CisJfQorCisJc2V0X2JpdChCSVQobG9jYWxfc3NhcCksICZsb2NhbC0+bG9jYWxfc2FwKTsKKworCW11dGV4X3VubG9jaygmbG9jYWwtPnNkcF9sb2NrKTsKKworCXJldHVybiBsb2NhbF9zc2FwICsgTExDUF9MT0NBTF9TQVBfT0ZGU0VUOworfQorCit2b2lkIG5mY19sbGNwX3B1dF9zc2FwKHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwsIHU4IHNzYXApCit7CisJdTggbG9jYWxfc3NhcDsKKwl1bnNpZ25lZCBsb25nICpzZHA7CisKKwlpZiAoc3NhcCA8IExMQ1BfV0tTX05VTV9TQVApIHsKKwkJbG9jYWxfc3NhcCA9IHNzYXA7CisJCXNkcCA9ICZsb2NhbC0+bG9jYWxfd2tzOworCX0gZWxzZSBpZiAoc3NhcCA8IExMQ1BfTE9DQUxfTlVNX1NBUCkgeworCQlsb2NhbF9zc2FwID0gc3NhcCAtIExMQ1BfV0tTX05VTV9TQVA7CisJCXNkcCA9ICZsb2NhbC0+bG9jYWxfc2RwOworCX0gZWxzZSBpZiAoc3NhcCA8IExMQ1BfTUFYX1NBUCkgeworCQlsb2NhbF9zc2FwID0gc3NhcCAtIExMQ1BfTE9DQUxfTlVNX1NBUDsKKwkJc2RwID0gJmxvY2FsLT5sb2NhbF9zYXA7CisJfSBlbHNlIHsKKwkJcmV0dXJuOworCX0KKworCW11dGV4X2xvY2soJmxvY2FsLT5zZHBfbG9jayk7CisKKwljbGVhcl9iaXQoMSA8PCBsb2NhbF9zc2FwLCBzZHApOworCisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c2RwX2xvY2spOworfQorCit1OCAqbmZjX2xsY3BfZ2VuZXJhbF9ieXRlcyhzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1OCAqZ2VuZXJhbF9ieXRlc19sZW4pCit7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbDsKKworCWxvY2FsID0gbmZjX2xsY3BfZmluZF9sb2NhbChkZXYpOworCWlmIChsb2NhbCA9PSBOVUxMKSB7CisJCSpnZW5lcmFsX2J5dGVzX2xlbiA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKworCSpnZW5lcmFsX2J5dGVzX2xlbiA9IGxvY2FsLT5nYl9sZW47CisKKwlyZXR1cm4gbG9jYWwtPmdiOworfQorCitzdGF0aWMgaW50IG5mY19sbGNwX2J1aWxkX2diKHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwpCit7CisJdTggKmdiX2N1ciwgKnZlcnNpb25fdGx2LCB2ZXJzaW9uLCB2ZXJzaW9uX2xlbmd0aDsKKwl1OCAqbHRvX3RsdiwgbHRvLCBsdG9fbGVuZ3RoOworCXU4ICp3a3NfdGx2LCB3a3NfbGVuZ3RoOworCXU4IGdiX2xlbiA9IDA7CisKKwl2ZXJzaW9uID0gTExDUF9WRVJTSU9OXzExOworCXZlcnNpb25fdGx2ID0gbmZjX2xsY3BfYnVpbGRfdGx2KExMQ1BfVExWX1ZFUlNJT04sICZ2ZXJzaW9uLAorCQkJCQkJCTEsICZ2ZXJzaW9uX2xlbmd0aCk7CisJZ2JfbGVuICs9IHZlcnNpb25fbGVuZ3RoOworCisJLyogMTUwMCBtcyAqLworCWx0byA9IDE1MDsKKwlsdG9fdGx2ID0gbmZjX2xsY3BfYnVpbGRfdGx2KExMQ1BfVExWX1ZFUlNJT04sICZsdG8sIDEsICZsdG9fbGVuZ3RoKTsKKwlnYl9sZW4gKz0gbHRvX2xlbmd0aDsKKworCXByX2RlYnVnKCJMb2NhbCB3a3MgMHglbHhcbiIsIGxvY2FsLT5sb2NhbF93a3MpOworCXdrc190bHYgPSBuZmNfbGxjcF9idWlsZF90bHYoTExDUF9UTFZfV0tTLCAodTggKikmbG9jYWwtPmxvY2FsX3drcywgMiwKKwkJCQkJCQkJJndrc19sZW5ndGgpOworCWdiX2xlbiArPSB3a3NfbGVuZ3RoOworCisJZ2JfbGVuICs9IEFSUkFZX1NJWkUobGxjcF9tYWdpYyk7CisKKwlpZiAoZ2JfbGVuID4gTkZDX01BWF9HVF9MRU4pIHsKKwkJa2ZyZWUodmVyc2lvbl90bHYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlnYl9jdXIgPSBsb2NhbC0+Z2I7CisKKwltZW1jcHkoZ2JfY3VyLCBsbGNwX21hZ2ljLCBBUlJBWV9TSVpFKGxsY3BfbWFnaWMpKTsKKwlnYl9jdXIgKz0gQVJSQVlfU0laRShsbGNwX21hZ2ljKTsKKworCW1lbWNweShnYl9jdXIsIHZlcnNpb25fdGx2LCB2ZXJzaW9uX2xlbmd0aCk7CisJZ2JfY3VyICs9IHZlcnNpb25fbGVuZ3RoOworCisJbWVtY3B5KGdiX2N1ciwgbHRvX3RsdiwgbHRvX2xlbmd0aCk7CisJZ2JfY3VyICs9IGx0b19sZW5ndGg7CisKKwltZW1jcHkoZ2JfY3VyLCB3a3NfdGx2LCB3a3NfbGVuZ3RoKTsKKwlnYl9jdXIgKz0gd2tzX2xlbmd0aDsKKworCWtmcmVlKHZlcnNpb25fdGx2KTsKKwlrZnJlZShsdG9fdGx2KTsKKworCWxvY2FsLT5nYl9sZW4gPSBnYl9sZW47CisKKwlyZXR1cm4gMDsKK30KKworaW50IG5mY19sbGNwX3NldF9yZW1vdGVfZ2Ioc3RydWN0IG5mY19kZXYgKmRldiwgdTggKmdiLCB1OCBnYl9sZW4pCit7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCA9IG5mY19sbGNwX2ZpbmRfbG9jYWwoZGV2KTsKKworCWlmIChsb2NhbCA9PSBOVUxMKSB7CisJCXByX2VycigiTm8gTExDUCBkZXZpY2VcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwltZW1zZXQobG9jYWwtPnJlbW90ZV9nYiwgMCwgTkZDX01BWF9HVF9MRU4pOworCW1lbWNweShsb2NhbC0+cmVtb3RlX2diLCBnYiwgZ2JfbGVuKTsKKwlsb2NhbC0+cmVtb3RlX2diX2xlbiA9IGdiX2xlbjsKKworCWlmIChsb2NhbC0+cmVtb3RlX2diID09IE5VTEwgfHwKKwkJCWxvY2FsLT5yZW1vdGVfZ2JfbGVuID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKG1lbWNtcChsb2NhbC0+cmVtb3RlX2diLCBsbGNwX21hZ2ljLCAzKSkgeworCQlwcl9lcnIoIk1BQyBkb2VzIG5vdCBzdXBwb3J0IExMQ1BcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gbmZjX2xsY3BfcGFyc2VfdGx2KGxvY2FsLAorCQkJJmxvY2FsLT5yZW1vdGVfZ2JbM10sIGxvY2FsLT5yZW1vdGVfZ2JfbGVuIC0gMyk7Cit9CisKK3N0YXRpYyB2b2lkIG5mY19sbGNwX3R4X3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IG5mY19sbGNwX2xvY2FsLAorCQkJCQkJCXR4X3dvcmspOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBza2JfZGVxdWV1ZSgmbG9jYWwtPnR4X3F1ZXVlKTsKKwlpZiAoc2tiICE9IE5VTEwpIHsKKwkJcHJfZGVidWcoIlNlbmRpbmcgcGVuZGluZyBza2JcbiIpOworCQluZmNfZGF0YV9leGNoYW5nZShsb2NhbC0+ZGV2LCBsb2NhbC0+dGFyZ2V0X2lkeCwKKwkJCQkJc2tiLCBuZmNfbGxjcF9yZWN2LCBsb2NhbCk7CisJfSBlbHNlIHsKKwkJbmZjX2xsY3Bfc2VuZF9zeW1tKGxvY2FsLT5kZXYpOworCX0KKworCW1vZF90aW1lcigmbG9jYWwtPmxpbmtfdGltZXIsCisJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhsb2NhbC0+cmVtb3RlX2x0bykpOworfQorCitzdGF0aWMgdTggbmZjX2xsY3BfZHNhcChzdHJ1Y3Qgc2tfYnVmZiAqcGR1KQoreworCXJldHVybiAocGR1LT5kYXRhWzBdICYgMHhmYykgPj4gMjsKK30KKworc3RhdGljIHU4IG5mY19sbGNwX3B0eXBlKHN0cnVjdCBza19idWZmICpwZHUpCit7CisJcmV0dXJuICgocGR1LT5kYXRhWzBdICYgMHgwMykgPDwgMikgfCAoKHBkdS0+ZGF0YVsxXSAmIDB4YzApID4+IDYpOworfQorCitzdGF0aWMgdTggbmZjX2xsY3Bfc3NhcChzdHJ1Y3Qgc2tfYnVmZiAqcGR1KQoreworCXJldHVybiBwZHUtPmRhdGFbMV0gJiAweDNmOworfQorCitzdGF0aWMgdTggbmZjX2xsY3BfbnMoc3RydWN0IHNrX2J1ZmYgKnBkdSkKK3sKKwlyZXR1cm4gcGR1LT5kYXRhWzJdID4+IDQ7Cit9CisKK3N0YXRpYyB1OCBuZmNfbGxjcF9ucihzdHJ1Y3Qgc2tfYnVmZiAqcGR1KQoreworCXJldHVybiBwZHUtPmRhdGFbMl0gJiAweGY7Cit9CisKK3N0YXRpYyB2b2lkIG5mY19sbGNwX3NldF9ucm5zKHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrLCBzdHJ1Y3Qgc2tfYnVmZiAqcGR1KQoreworCXBkdS0+ZGF0YVsyXSA9IChzb2NrLT5zZW5kX24gPDwgNCkgfCAoKHNvY2stPnJlY3ZfbiAtIDEpICUgMTYpOworCXNvY2stPnNlbmRfbiA9IChzb2NrLT5zZW5kX24gKyAxKSAlIDE2OworCXNvY2stPnJlY3ZfYWNrX24gPSAoc29jay0+cmVjdl9uIC0gMSkgJSAxNjsKK30KKworc3RhdGljIHN0cnVjdCBuZmNfbGxjcF9zb2NrICpuZmNfbGxjcF9zb2NrX2dldChzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsLAorCQkJCQkJdTggc3NhcCwgdTggZHNhcCkKK3sKKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqc29jaywgKmxsY3Bfc29jaywgKm47CisKKwlpZiAoc3NhcCA9PSAwICYmIGRzYXAgPT0gMCkKKwkJcmV0dXJuIE5VTEw7CisKKwltdXRleF9sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCXNvY2sgPSBsb2NhbC0+c29ja2V0c1tzc2FwXTsKKwlpZiAoc29jayA9PSBOVUxMKSB7CisJCW11dGV4X3VubG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJcHJfZGVidWcoInJvb3QgZHNhcCAlZCAoJWQpXG4iLCBzb2NrLT5kc2FwLCBkc2FwKTsKKworCWlmIChzb2NrLT5kc2FwID09IGRzYXApIHsKKwkJc29ja19ob2xkKCZzb2NrLT5zayk7CisJCW11dGV4X3VubG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKKwkJcmV0dXJuIHNvY2s7CisJfQorCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGxsY3Bfc29jaywgbiwgJnNvY2stPmxpc3QsIGxpc3QpIHsKKwkJcHJfZGVidWcoImxsY3Bfc29jayAlcCBzayAlcCBkc2FwICVkXG4iLCBsbGNwX3NvY2ssCisJCQkJJmxsY3Bfc29jay0+c2ssIGxsY3Bfc29jay0+ZHNhcCk7CisJCWlmIChsbGNwX3NvY2stPmRzYXAgPT0gZHNhcCkgeworCQkJc29ja19ob2xkKCZsbGNwX3NvY2stPnNrKTsKKwkJCW11dGV4X3VubG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKKwkJCXJldHVybiBsbGNwX3NvY2s7CisJCX0KKwl9CisKKwlwcl9lcnIoIkNvdWxkIG5vdCBmaW5kIHNvY2tldCBmb3IgJWQgJWRcbiIsIHNzYXAsIGRzYXApOworCisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG5mY19sbGNwX3NvY2tfcHV0KHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrKQoreworCXNvY2tfcHV0KCZzb2NrLT5zayk7Cit9CisKK3N0YXRpYyB1OCAqbmZjX2xsY3BfY29ubmVjdF9zbihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzaXplX3QgKnNuX2xlbikKK3sKKwl1OCAqdGx2ID0gJnNrYi0+ZGF0YVsyXSwgdHlwZSwgbGVuZ3RoOworCXNpemVfdCB0bHZfYXJyYXlfbGVuID0gc2tiLT5sZW4gLSBMTENQX0hFQURFUl9TSVpFLCBvZmZzZXQgPSAwOworCisJd2hpbGUgKG9mZnNldCA8IHRsdl9hcnJheV9sZW4pIHsKKwkJdHlwZSA9IHRsdlswXTsKKwkJbGVuZ3RoID0gdGx2WzFdOworCisJCXByX2RlYnVnKCJ0eXBlIDB4JXggbGVuZ3RoICVkXG4iLCB0eXBlLCBsZW5ndGgpOworCisJCWlmICh0eXBlID09IExMQ1BfVExWX1NOKSB7CisJCQkqc25fbGVuID0gbGVuZ3RoOworCQkJcmV0dXJuICZ0bHZbMl07CisJCX0KKworCQlvZmZzZXQgKz0gbGVuZ3RoICsgMjsKKwkJdGx2ICs9IGxlbmd0aCArIDI7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIG5mY19sbGNwX3JlY3ZfY29ubmVjdChzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHNvY2sgKm5ld19zaywgKnBhcmVudDsKKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqc29jaywgKm5ld19zb2NrOworCXU4IGRzYXAsIHNzYXAsIGJvdW5kX3NhcCwgcmVhc29uOworCisJZHNhcCA9IG5mY19sbGNwX2RzYXAoc2tiKTsKKwlzc2FwID0gbmZjX2xsY3Bfc3NhcChza2IpOworCisJcHJfZGVidWcoIiVkICVkXG4iLCBkc2FwLCBzc2FwKTsKKworCW5mY19sbGNwX3BhcnNlX3Rsdihsb2NhbCwgJnNrYi0+ZGF0YVtMTENQX0hFQURFUl9TSVpFXSwKKwkJCQlza2ItPmxlbiAtIExMQ1BfSEVBREVSX1NJWkUpOworCisJaWYgKGRzYXAgIT0gTExDUF9TQVBfU0RQKSB7CisJCWJvdW5kX3NhcCA9IGRzYXA7CisKKwkJbXV0ZXhfbG9jaygmbG9jYWwtPnNvY2tldF9sb2NrKTsKKwkJc29jayA9IGxvY2FsLT5zb2NrZXRzW2RzYXBdOworCQlpZiAoc29jayA9PSBOVUxMKSB7CisJCQltdXRleF91bmxvY2soJmxvY2FsLT5zb2NrZXRfbG9jayk7CisJCQlyZWFzb24gPSBMTENQX0RNX05PQk9VTkQ7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlzb2NrX2hvbGQoJnNvY2stPnNrKTsKKwkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCisJCWxvY2tfc29jaygmc29jay0+c2spOworCisJCWlmIChzb2NrLT5kc2FwID09IExMQ1BfU0FQX1NEUCAmJgorCQkJCXNvY2stPnNrLnNrX3N0YXRlID09IExMQ1BfTElTVEVOKQorCQkJZ290byBlbnF1ZXVlOworCX0gZWxzZSB7CisJCXU4ICpzbjsKKwkJc2l6ZV90IHNuX2xlbjsKKworCQlzbiA9IG5mY19sbGNwX2Nvbm5lY3Rfc24oc2tiLCAmc25fbGVuKTsKKwkJaWYgKHNuID09IE5VTEwpIHsKKwkJCXJlYXNvbiA9IExMQ1BfRE1fTk9CT1VORDsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCXByX2RlYnVnKCJTZXJ2aWNlIG5hbWUgbGVuZ3RoICV6dVxuIiwgc25fbGVuKTsKKworCQltdXRleF9sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCQlmb3IgKGJvdW5kX3NhcCA9IDA7IGJvdW5kX3NhcCA8IExMQ1BfTE9DQUxfU0FQX09GRlNFVDsKKwkJCQkJCQkJYm91bmRfc2FwKyspIHsKKwkJCXNvY2sgPSBsb2NhbC0+c29ja2V0c1tib3VuZF9zYXBdOworCQkJaWYgKHNvY2sgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHNvY2stPnNlcnZpY2VfbmFtZSA9PSBOVUxMIHx8CisJCQkJc29jay0+c2VydmljZV9uYW1lX2xlbiA9PSAwKQorCQkJCQljb250aW51ZTsKKworCQkJaWYgKHNvY2stPnNlcnZpY2VfbmFtZV9sZW4gIT0gc25fbGVuKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoc29jay0+ZHNhcCA9PSBMTENQX1NBUF9TRFAgJiYKKwkJCQkJc29jay0+c2suc2tfc3RhdGUgPT0gTExDUF9MSVNURU4gJiYKKwkJCQkJIW1lbWNtcChzbiwgc29jay0+c2VydmljZV9uYW1lLCBzbl9sZW4pKSB7CisJCQkJcHJfZGVidWcoIkZvdW5kIHNlcnZpY2UgbmFtZSBhdCBTQVAgJWRcbiIsCisJCQkJCQkJCWJvdW5kX3NhcCk7CisJCQkJc29ja19ob2xkKCZzb2NrLT5zayk7CisJCQkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCisJCQkJbG9ja19zb2NrKCZzb2NrLT5zayk7CisKKwkJCQlnb3RvIGVucXVldWU7CisJCQl9CisJCX0KKwkJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCX0KKworCXJlYXNvbiA9IExMQ1BfRE1fTk9CT1VORDsKKwlnb3RvIGZhaWw7CisKK2VucXVldWU6CisJcGFyZW50ID0gJnNvY2stPnNrOworCisJaWYgKHNrX2FjY2VwdHFfaXNfZnVsbChwYXJlbnQpKSB7CisJCXJlYXNvbiA9IExMQ1BfRE1fUkVKOworCQlyZWxlYXNlX3NvY2soJnNvY2stPnNrKTsKKwkJc29ja19wdXQoJnNvY2stPnNrKTsKKwkJZ290byBmYWlsOworCX0KKworCW5ld19zayA9IG5mY19sbGNwX3NvY2tfYWxsb2MoTlVMTCwgcGFyZW50LT5za190eXBlLAorCQkJCSAgICAgR0ZQX0FUT01JQyk7CisJaWYgKG5ld19zayA9PSBOVUxMKSB7CisJCXJlYXNvbiA9IExMQ1BfRE1fUkVKOworCQlyZWxlYXNlX3NvY2soJnNvY2stPnNrKTsKKwkJc29ja19wdXQoJnNvY2stPnNrKTsKKwkJZ290byBmYWlsOworCX0KKworCW5ld19zb2NrID0gbmZjX2xsY3Bfc29jayhuZXdfc2spOworCW5ld19zb2NrLT5kZXYgPSBsb2NhbC0+ZGV2OworCW5ld19zb2NrLT5sb2NhbCA9IGxvY2FsOworCW5ld19zb2NrLT5uZmNfcHJvdG9jb2wgPSBzb2NrLT5uZmNfcHJvdG9jb2w7CisJbmV3X3NvY2stPnNzYXAgPSBib3VuZF9zYXA7CisJbmV3X3NvY2stPmRzYXAgPSBzc2FwOworCW5ld19zb2NrLT5wYXJlbnQgPSBwYXJlbnQ7CisKKwlwcl9kZWJ1ZygibmV3IHNvY2sgJXAgc2sgJXBcbiIsIG5ld19zb2NrLCAmbmV3X3NvY2stPnNrKTsKKworCWxpc3RfYWRkX3RhaWwoJm5ld19zb2NrLT5saXN0LCAmc29jay0+bGlzdCk7CisKKwluZmNfbGxjcF9hY2NlcHRfZW5xdWV1ZSgmc29jay0+c2ssIG5ld19zayk7CisKKwluZmNfZ2V0X2RldmljZShsb2NhbC0+ZGV2LT5pZHgpOworCisJbmV3X3NrLT5za19zdGF0ZSA9IExMQ1BfQ09OTkVDVEVEOworCisJLyogV2FrZSB0aGUgbGlzdGVuaW5nIHByb2Nlc3NlcyAqLworCXBhcmVudC0+c2tfZGF0YV9yZWFkeShwYXJlbnQsIDApOworCisJLyogU2VuZCBDQyAqLworCW5mY19sbGNwX3NlbmRfY2MobmV3X3NvY2spOworCisJcmVsZWFzZV9zb2NrKCZzb2NrLT5zayk7CisJc29ja19wdXQoJnNvY2stPnNrKTsKKworCXJldHVybjsKKworZmFpbDoKKwkvKiBTZW5kIERNICovCisJbmZjX2xsY3Bfc2VuZF9kbShsb2NhbCwgZHNhcCwgc3NhcCwgcmVhc29uKTsKKworCXJldHVybjsKKworfQorCitzdGF0aWMgdm9pZCBuZmNfbGxjcF9yZWN2X2hkbGMoc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsbGNwX3NvY2s7CisJc3RydWN0IHNvY2sgKnNrOworCXU4IGRzYXAsIHNzYXAsIHB0eXBlLCBucywgbnI7CisKKwlwdHlwZSA9IG5mY19sbGNwX3B0eXBlKHNrYik7CisJZHNhcCA9IG5mY19sbGNwX2RzYXAoc2tiKTsKKwlzc2FwID0gbmZjX2xsY3Bfc3NhcChza2IpOworCW5zID0gbmZjX2xsY3BfbnMoc2tiKTsKKwluciA9IG5mY19sbGNwX25yKHNrYik7CisKKwlwcl9kZWJ1ZygiJWQgJWQgUiAlZCBTICVkXG4iLCBkc2FwLCBzc2FwLCBuciwgbnMpOworCisJbGxjcF9zb2NrID0gbmZjX2xsY3Bfc29ja19nZXQobG9jYWwsIGRzYXAsIHNzYXApOworCWlmIChsbGNwX3NvY2sgPT0gTlVMTCkgeworCQluZmNfbGxjcF9zZW5kX2RtKGxvY2FsLCBkc2FwLCBzc2FwLCBMTENQX0RNX05PQ09OTik7CisJCXJldHVybjsKKwl9CisKKwlzayA9ICZsbGNwX3NvY2stPnNrOworCWxvY2tfc29jayhzayk7CisJaWYgKHNrLT5za19zdGF0ZSA9PSBMTENQX0NMT1NFRCkgeworCQlyZWxlYXNlX3NvY2soc2spOworCQluZmNfbGxjcF9zb2NrX3B1dChsbGNwX3NvY2spOworCX0KKworCWlmIChucyA9PSBsbGNwX3NvY2stPnJlY3ZfbikKKwkJbGxjcF9zb2NrLT5yZWN2X24gPSAobGxjcF9zb2NrLT5yZWN2X24gKyAxKSAlIDE2OworCWVsc2UKKwkJcHJfZXJyKCJSZWNlaXZlZCBvdXQgb2Ygc2VxdWVuY2UgSSBQRFVcbiIpOworCisJLyogUGFzcyB0aGUgcGF5bG9hZCB1cHN0cmVhbSAqLworCWlmIChwdHlwZSA9PSBMTENQX1BEVV9JKSB7CisJCXByX2RlYnVnKCJJIGZyYW1lLCBxdWV1ZWluZyBvbiAlcFxuIiwgJmxsY3Bfc29jay0+c2spOworCisJCXNrYl9wdWxsKHNrYiwgTExDUF9IRUFERVJfU0laRSArIExMQ1BfU0VRVUVOQ0VfU0laRSk7CisJCWlmIChzb2NrX3F1ZXVlX3Jjdl9za2IoJmxsY3Bfc29jay0+c2ssIHNrYikpIHsKKwkJCXByX2VycigicmVjZWl2ZSBxdWV1ZSBpcyBmdWxsXG4iKTsKKwkJCXNrYl9xdWV1ZV9oZWFkKCZsbGNwX3NvY2stPnR4X2JhY2tsb2dfcXVldWUsIHNrYik7CisJCX0KKwl9CisKKwkvKiBSZW1vdmUgc2ticyBmcm9tIHRoZSBwZW5kaW5nIHF1ZXVlICovCisJaWYgKGxsY3Bfc29jay0+c2VuZF9hY2tfbiAhPSBucikgeworCQlzdHJ1Y3Qgc2tfYnVmZiAqcywgKnRtcDsKKworCQlsbGNwX3NvY2stPnNlbmRfYWNrX24gPSBucjsKKworCQlza2JfcXVldWVfd2Fsa19zYWZlKCZsbGNwX3NvY2stPnR4X3BlbmRpbmdfcXVldWUsIHMsIHRtcCkKKwkJCWlmIChuZmNfbGxjcF9ucyhzKSA8PSBucikgeworCQkJCXNrYl91bmxpbmsocywgJmxsY3Bfc29jay0+dHhfcGVuZGluZ19xdWV1ZSk7CisJCQkJa2ZyZWVfc2tiKHMpOworCQkJfQorCX0KKworCS8qIFF1ZXVlIHNvbWUgSSBmcmFtZXMgZm9yIHRyYW5zbWlzc2lvbiAqLworCXdoaWxlIChsbGNwX3NvY2stPnJlbW90ZV9yZWFkeSAmJgorCQlza2JfcXVldWVfbGVuKCZsbGNwX3NvY2stPnR4X3BlbmRpbmdfcXVldWUpIDw9IGxvY2FsLT5yZW1vdGVfcncpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKnBkdSwgKnBlbmRpbmdfcGR1OworCisJCXBkdSA9IHNrYl9kZXF1ZXVlKCZsbGNwX3NvY2stPnR4X3F1ZXVlKTsKKwkJaWYgKHBkdSA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJLyogVXBkYXRlIE4oUykvTihSKSAqLworCQluZmNfbGxjcF9zZXRfbnJucyhsbGNwX3NvY2ssIHBkdSk7CisKKwkJcGVuZGluZ19wZHUgPSBza2JfY2xvbmUocGR1LCBHRlBfS0VSTkVMKTsKKworCQlza2JfcXVldWVfdGFpbCgmbG9jYWwtPnR4X3F1ZXVlLCBwZHUpOworCQlza2JfcXVldWVfdGFpbCgmbGxjcF9zb2NrLT50eF9wZW5kaW5nX3F1ZXVlLCBwZW5kaW5nX3BkdSk7CisJfQorCisJcmVsZWFzZV9zb2NrKHNrKTsKKwluZmNfbGxjcF9zb2NrX3B1dChsbGNwX3NvY2spOworfQorCitzdGF0aWMgdm9pZCBuZmNfbGxjcF9yZWN2X2Rpc2Moc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCwKKwkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsbGNwX3NvY2s7CisJc3RydWN0IHNvY2sgKnNrOworCXU4IGRzYXAsIHNzYXA7CisKKwlkc2FwID0gbmZjX2xsY3BfZHNhcChza2IpOworCXNzYXAgPSBuZmNfbGxjcF9zc2FwKHNrYik7CisKKwlsbGNwX3NvY2sgPSBuZmNfbGxjcF9zb2NrX2dldChsb2NhbCwgZHNhcCwgc3NhcCk7CisJaWYgKGxsY3Bfc29jayA9PSBOVUxMKSB7CisJCW5mY19sbGNwX3NlbmRfZG0obG9jYWwsIGRzYXAsIHNzYXAsIExMQ1BfRE1fTk9DT05OKTsKKwkJcmV0dXJuOworCX0KKworCXNrID0gJmxsY3Bfc29jay0+c2s7CisJbG9ja19zb2NrKHNrKTsKKwlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ0xPU0VEKSB7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCW5mY19sbGNwX3NvY2tfcHV0KGxsY3Bfc29jayk7CisJfQorCisKKwlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ09OTkVDVEVEKSB7CisJCW5mY19wdXRfZGV2aWNlKGxvY2FsLT5kZXYpOworCQlzay0+c2tfc3RhdGUgPSBMTENQX0NMT1NFRDsKKwkJc2stPnNrX3N0YXRlX2NoYW5nZShzayk7CisJfQorCisJbmZjX2xsY3Bfc2VuZF9kbShsb2NhbCwgZHNhcCwgc3NhcCwgTExDUF9ETV9ESVNDKTsKKworCXJlbGVhc2Vfc29jayhzayk7CisJbmZjX2xsY3Bfc29ja19wdXQobGxjcF9zb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmZjX2xsY3BfcmVjdl9jYyhzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsLAorCQkJCXN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxsY3Bfc29jazsKKwl1OCBkc2FwLCBzc2FwOworCisKKwlkc2FwID0gbmZjX2xsY3BfZHNhcChza2IpOworCXNzYXAgPSBuZmNfbGxjcF9zc2FwKHNrYik7CisKKwlsbGNwX3NvY2sgPSBuZmNfbGxjcF9zb2NrX2dldChsb2NhbCwgZHNhcCwgc3NhcCk7CisKKwlpZiAobGxjcF9zb2NrID09IE5VTEwpCisJCWxsY3Bfc29jayA9IG5mY19sbGNwX3NvY2tfZ2V0KGxvY2FsLCBkc2FwLCBMTENQX1NBUF9TRFApOworCisJaWYgKGxsY3Bfc29jayA9PSBOVUxMKSB7CisJCXByX2VycigiSW52YWxpZCBDQ1xuIik7CisJCW5mY19sbGNwX3NlbmRfZG0obG9jYWwsIGRzYXAsIHNzYXAsIExMQ1BfRE1fTk9DT05OKTsKKworCQlyZXR1cm47CisJfQorCisJbGxjcF9zb2NrLT5kc2FwID0gc3NhcDsKKworCW5mY19sbGNwX3BhcnNlX3Rsdihsb2NhbCwgJnNrYi0+ZGF0YVtMTENQX0hFQURFUl9TSVpFXSwKKwkJCQlza2ItPmxlbiAtIExMQ1BfSEVBREVSX1NJWkUpOworCisJbmZjX2xsY3Bfc29ja19wdXQobGxjcF9zb2NrKTsKK30KKworc3RhdGljIHZvaWQgbmZjX2xsY3Bfcnhfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IG5mY19sbGNwX2xvY2FsICpsb2NhbCA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwsCisJCQkJCQkJCXJ4X3dvcmspOworCXU4IGRzYXAsIHNzYXAsIHB0eXBlOworCXN0cnVjdCBza19idWZmICpza2I7CisKKwlza2IgPSBsb2NhbC0+cnhfcGVuZGluZzsKKwlpZiAoc2tiID09IE5VTEwpIHsKKwkJcHJfZGVidWcoIk5vIHBlbmRpbmcgU0tCXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXB0eXBlID0gbmZjX2xsY3BfcHR5cGUoc2tiKTsKKwlkc2FwID0gbmZjX2xsY3BfZHNhcChza2IpOworCXNzYXAgPSBuZmNfbGxjcF9zc2FwKHNrYik7CisKKwlwcl9kZWJ1ZygicHR5cGUgMHgleCBkc2FwIDB4JXggc3NhcCAweCV4XG4iLCBwdHlwZSwgZHNhcCwgc3NhcCk7CisKKwlzd2l0Y2ggKHB0eXBlKSB7CisJY2FzZSBMTENQX1BEVV9TWU1NOgorCQlwcl9kZWJ1ZygiU1lNTVxuIik7CisJCWJyZWFrOworCisJY2FzZSBMTENQX1BEVV9DT05ORUNUOgorCQlwcl9kZWJ1ZygiQ09OTkVDVFxuIik7CisJCW5mY19sbGNwX3JlY3ZfY29ubmVjdChsb2NhbCwgc2tiKTsKKwkJYnJlYWs7CisKKwljYXNlIExMQ1BfUERVX0RJU0M6CisJCXByX2RlYnVnKCJESVNDXG4iKTsKKwkJbmZjX2xsY3BfcmVjdl9kaXNjKGxvY2FsLCBza2IpOworCQlicmVhazsKKworCWNhc2UgTExDUF9QRFVfQ0M6CisJCXByX2RlYnVnKCJDQ1xuIik7CisJCW5mY19sbGNwX3JlY3ZfY2MobG9jYWwsIHNrYik7CisJCWJyZWFrOworCisJY2FzZSBMTENQX1BEVV9JOgorCWNhc2UgTExDUF9QRFVfUlI6CisJCXByX2RlYnVnKCJJIGZyYW1lXG4iKTsKKwkJbmZjX2xsY3BfcmVjdl9oZGxjKGxvY2FsLCBza2IpOworCQlicmVhazsKKworCX0KKworCXF1ZXVlX3dvcmsobG9jYWwtPnR4X3dxLCAmbG9jYWwtPnR4X3dvcmspOworCWtmcmVlX3NrYihsb2NhbC0+cnhfcGVuZGluZyk7CisJbG9jYWwtPnJ4X3BlbmRpbmcgPSBOVUxMOworCisJcmV0dXJuOworfQorCit2b2lkIG5mY19sbGNwX3JlY3Yodm9pZCAqZGF0YSwgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGVycikKK3sKKwlzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsID0gKHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqKSBkYXRhOworCisJcHJfZGVidWcoIlJlY2VpdmVkIGFuIExMQ1AgUERVXG4iKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9lcnIoImVyciAlZCIsIGVycik7CisJCXJldHVybjsKKwl9CisKKwlsb2NhbC0+cnhfcGVuZGluZyA9IHNrYl9nZXQoc2tiKTsKKwlkZWxfdGltZXIoJmxvY2FsLT5saW5rX3RpbWVyKTsKKwlxdWV1ZV93b3JrKGxvY2FsLT5yeF93cSwgJmxvY2FsLT5yeF93b3JrKTsKKworCXJldHVybjsKK30KKwordm9pZCBuZmNfbGxjcF9tYWNfaXNfZG93bihzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWw7CisKKwlsb2NhbCA9IG5mY19sbGNwX2ZpbmRfbG9jYWwoZGV2KTsKKwlpZiAobG9jYWwgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogQ2xvc2UgYW5kIHB1cmdlIGFsbCBleGlzdGluZyBzb2NrZXRzICovCisJbmZjX2xsY3Bfc29ja2V0X3JlbGVhc2UobG9jYWwpOworfQorCit2b2lkIG5mY19sbGNwX21hY19pc191cChzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCwKKwkJCXU4IGNvbW1fbW9kZSwgdTggcmZfbW9kZSkKK3sKKwlzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsOworCisJcHJfZGVidWcoInJmIG1vZGUgJWRcbiIsIHJmX21vZGUpOworCisJbG9jYWwgPSBuZmNfbGxjcF9maW5kX2xvY2FsKGRldik7CisJaWYgKGxvY2FsID09IE5VTEwpCisJCXJldHVybjsKKworCWxvY2FsLT50YXJnZXRfaWR4ID0gdGFyZ2V0X2lkeDsKKwlsb2NhbC0+Y29tbV9tb2RlID0gY29tbV9tb2RlOworCWxvY2FsLT5yZl9tb2RlID0gcmZfbW9kZTsKKworCWlmIChyZl9tb2RlID09IE5GQ19SRl9JTklUSUFUT1IpIHsKKwkJcHJfZGVidWcoIlF1ZXVlaW5nIFR4IHdvcmtcbiIpOworCisJCXF1ZXVlX3dvcmsobG9jYWwtPnR4X3dxLCAmbG9jYWwtPnR4X3dvcmspOworCX0gZWxzZSB7CisJCW1vZF90aW1lcigmbG9jYWwtPmxpbmtfdGltZXIsCisJCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhsb2NhbC0+cmVtb3RlX2x0bykpOworCX0KK30KKworaW50IG5mY19sbGNwX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqbmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmbmRldi0+ZGV2OworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWw7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgZXJyOworCisJbG9jYWwgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwpLCBHRlBfS0VSTkVMKTsKKwlpZiAobG9jYWwgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsb2NhbC0+ZGV2ID0gbmRldjsKKwlJTklUX0xJU1RfSEVBRCgmbG9jYWwtPmxpc3QpOworCW11dGV4X2luaXQoJmxvY2FsLT5zZHBfbG9jayk7CisJbXV0ZXhfaW5pdCgmbG9jYWwtPnNvY2tldF9sb2NrKTsKKwlpbml0X3RpbWVyKCZsb2NhbC0+bGlua190aW1lcik7CisJbG9jYWwtPmxpbmtfdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBsb2NhbDsKKwlsb2NhbC0+bGlua190aW1lci5mdW5jdGlvbiA9IG5mY19sbGNwX3N5bW1fdGltZXI7CisKKwlza2JfcXVldWVfaGVhZF9pbml0KCZsb2NhbC0+dHhfcXVldWUpOworCUlOSVRfV09SSygmbG9jYWwtPnR4X3dvcmssIG5mY19sbGNwX3R4X3dvcmspOworCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzX2xsY3BfdHhfd3EiLCBkZXZfbmFtZShkZXYpKTsKKwlsb2NhbC0+dHhfd3EgPSBhbGxvY193b3JrcXVldWUobmFtZSwKKwkJCVdRX05PTl9SRUVOVFJBTlQgfCBXUV9VTkJPVU5EIHwgV1FfTUVNX1JFQ0xBSU0sIDEpOworCWlmIChsb2NhbC0+dHhfd3EgPT0gTlVMTCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9sb2NhbDsKKwl9CisKKwlsb2NhbC0+cnhfcGVuZGluZyA9IE5VTEw7CisJSU5JVF9XT1JLKCZsb2NhbC0+cnhfd29yaywgbmZjX2xsY3Bfcnhfd29yayk7CisJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXNfbGxjcF9yeF93cSIsIGRldl9uYW1lKGRldikpOworCWxvY2FsLT5yeF93cSA9IGFsbG9jX3dvcmtxdWV1ZShuYW1lLAorCQkJV1FfTk9OX1JFRU5UUkFOVCB8IFdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSk7CisJaWYgKGxvY2FsLT5yeF93cSA9PSBOVUxMKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyX3R4X3dxOworCX0KKworCUlOSVRfV09SSygmbG9jYWwtPnRpbWVvdXRfd29yaywgbmZjX2xsY3BfdGltZW91dF93b3JrKTsKKwlzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICIlc19sbGNwX3RpbWVvdXRfd3EiLCBkZXZfbmFtZShkZXYpKTsKKwlsb2NhbC0+dGltZW91dF93cSA9IGFsbG9jX3dvcmtxdWV1ZShuYW1lLAorCQkJV1FfTk9OX1JFRU5UUkFOVCB8IFdRX1VOQk9VTkQgfCBXUV9NRU1fUkVDTEFJTSwgMSk7CisJaWYgKGxvY2FsLT50aW1lb3V0X3dxID09IE5VTEwpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBlcnJfcnhfd3E7CisJfQorCisJbmZjX2xsY3BfYnVpbGRfZ2IobG9jYWwpOworCisJbG9jYWwtPnJlbW90ZV9taXUgPSBMTENQX0RFRkFVTFRfTUlVOworCWxvY2FsLT5yZW1vdGVfbHRvID0gTExDUF9ERUZBVUxUX0xUTzsKKwlsb2NhbC0+cmVtb3RlX3J3ID0gTExDUF9ERUZBVUxUX1JXOworCisJbGlzdF9hZGQoJmxsY3BfZGV2aWNlcywgJmxvY2FsLT5saXN0KTsKKworCXJldHVybiAwOworCitlcnJfcnhfd3E6CisJZGVzdHJveV93b3JrcXVldWUobG9jYWwtPnJ4X3dxKTsKKworZXJyX3R4X3dxOgorCWRlc3Ryb3lfd29ya3F1ZXVlKGxvY2FsLT50eF93cSk7CisKK2Vycl9sb2NhbDoKKwlrZnJlZShsb2NhbCk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBuZmNfbGxjcF91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwgPSBuZmNfbGxjcF9maW5kX2xvY2FsKGRldik7CisKKwlpZiAobG9jYWwgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiTm8gc3VjaCBkZXZpY2VcbiIpOworCQlyZXR1cm47CisJfQorCisJbGlzdF9kZWwoJmxvY2FsLT5saXN0KTsKKwluZmNfbGxjcF9zb2NrZXRfcmVsZWFzZShsb2NhbCk7CisJZGVsX3RpbWVyX3N5bmMoJmxvY2FsLT5saW5rX3RpbWVyKTsKKwlza2JfcXVldWVfcHVyZ2UoJmxvY2FsLT50eF9xdWV1ZSk7CisJZGVzdHJveV93b3JrcXVldWUobG9jYWwtPnR4X3dxKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShsb2NhbC0+cnhfd3EpOworCWtmcmVlX3NrYihsb2NhbC0+cnhfcGVuZGluZyk7CisJa2ZyZWUobG9jYWwpOworfQorCitpbnQgX19pbml0IG5mY19sbGNwX2luaXQodm9pZCkKK3sKKwlJTklUX0xJU1RfSEVBRCgmbGxjcF9kZXZpY2VzKTsKKworCXJldHVybiBuZmNfbGxjcF9zb2NrX2luaXQoKTsKK30KKwordm9pZCBuZmNfbGxjcF9leGl0KHZvaWQpCit7CisJbmZjX2xsY3Bfc29ja19leGl0KCk7Cit9CmRpZmYgLS1naXQgYS9uZXQvbmZjL2xsY3AvbGxjcC5oIGIvbmV0L25mYy9sbGNwL2xsY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQyZTMzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L25mYy9sbGNwL2xsY3AuaApAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSAgSW50ZWwgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZQorICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCitlbnVtIGxsY3Bfc3RhdGUgeworCUxMQ1BfQ09OTkVDVEVEID0gMSwgLyogd2FpdF9mb3JfcGFja2V0KCkgd2FudHMgdGhhdCAqLworCUxMQ1BfQ0xPU0VELAorCUxMQ1BfQk9VTkQsCisJTExDUF9MSVNURU4sCit9OworCisjZGVmaW5lIExMQ1BfREVGQVVMVF9MVE8gMTAwCisjZGVmaW5lIExMQ1BfREVGQVVMVF9SVyAgMQorI2RlZmluZSBMTENQX0RFRkFVTFRfTUlVIDEyOAorCisjZGVmaW5lIExMQ1BfV0tTX05VTV9TQVAgICAxNgorI2RlZmluZSBMTENQX1NEUF9OVU1fU0FQICAgMTYKKyNkZWZpbmUgTExDUF9MT0NBTF9OVU1fU0FQIDMyCisjZGVmaW5lIExMQ1BfTE9DQUxfU0FQX09GRlNFVCAoTExDUF9XS1NfTlVNX1NBUCArIExMQ1BfU0RQX05VTV9TQVApCisjZGVmaW5lIExMQ1BfTUFYX1NBUCAoTExDUF9XS1NfTlVNX1NBUCArIExMQ1BfU0RQX05VTV9TQVAgKyBMTENQX0xPQ0FMX05VTV9TQVApCisKK3N0cnVjdCBuZmNfbGxjcF9zb2NrOworCitzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgeworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgbmZjX2RldiAqZGV2OworCisJc3RydWN0IG11dGV4IHNkcF9sb2NrOworCXN0cnVjdCBtdXRleCBzb2NrZXRfbG9jazsKKworCXN0cnVjdCB0aW1lcl9saXN0IGxpbmtfdGltZXI7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eF9xdWV1ZTsKKwlzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdAkqdHhfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0CSB0eF93b3JrOworCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0CSpyeF93cTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJIHJ4X3dvcms7CisJc3RydWN0IHNrX2J1ZmYgKnJ4X3BlbmRpbmc7CisJc3RydWN0IHdvcmtxdWV1ZV9zdHJ1Y3QJKnRpbWVvdXRfd3E7CisJc3RydWN0IHdvcmtfc3RydWN0CSB0aW1lb3V0X3dvcms7CisKKwl1MzIgdGFyZ2V0X2lkeDsKKwl1OCByZl9tb2RlOworCXU4IGNvbW1fbW9kZTsKKwl1bnNpZ25lZCBsb25nIGxvY2FsX3drczsgICAgICAvKiBXZWxsIGtub3duIHNlcnZpY2VzICovCisJdW5zaWduZWQgbG9uZyBsb2NhbF9zZHA7ICAgICAgLyogTG9jYWwgc2VydmljZXMgICovCisJdW5zaWduZWQgbG9uZyBsb2NhbF9zYXA7IC8qIExvY2FsIFNBUHMsIG5vdCBhdmFpbGFibGUgZm9yIGRpc2NvdmVyeSAqLworCisJLyogbG9jYWwgKi8KKwl1OCBnYltORkNfTUFYX0dUX0xFTl07CisJdTggZ2JfbGVuOworCisJLyogcmVtb3RlICovCisJdTggcmVtb3RlX2diW05GQ19NQVhfR1RfTEVOXTsKKwl1OCByZW1vdGVfZ2JfbGVuOworCisJdTggIHJlbW90ZV92ZXJzaW9uOworCXUxNiByZW1vdGVfbWl1OworCXUxNiByZW1vdGVfbHRvOworCXU4ICByZW1vdGVfb3B0OworCXUxNiByZW1vdGVfd2tzOworCXU4ICByZW1vdGVfcnc7CisKKwkvKiBzb2NrZXRzIGFycmF5ICovCisJc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2tldHNbTExDUF9NQVhfU0FQXTsKK307CisKK3N0cnVjdCBuZmNfbGxjcF9zb2NrIHsKKwlzdHJ1Y3Qgc29jayBzazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IG5mY19kZXYgKmRldjsKKwlzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsOworCXUzMiB0YXJnZXRfaWR4OworCXUzMiBuZmNfcHJvdG9jb2w7CisKKwl1OCBzc2FwOworCXU4IGRzYXA7CisJY2hhciAqc2VydmljZV9uYW1lOworCXNpemVfdCBzZXJ2aWNlX25hbWVfbGVuOworCisJLyogTGluayB2YXJpYWJsZXMgKi8KKwl1OCBzZW5kX247CisJdTggc2VuZF9hY2tfbjsKKwl1OCByZWN2X247CisJdTggcmVjdl9hY2tfbjsKKworCS8qIElzIHRoZSByZW1vdGUgcGVlciByZWFkeSB0byByZWNlaXZlICovCisJdTggcmVtb3RlX3JlYWR5OworCisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eF9xdWV1ZTsKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4X3BlbmRpbmdfcXVldWU7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCB0eF9iYWNrbG9nX3F1ZXVlOworCisJc3RydWN0IGxpc3RfaGVhZCBhY2NlcHRfcXVldWU7CisJc3RydWN0IHNvY2sgKnBhcmVudDsKK307CisKKyNkZWZpbmUgbmZjX2xsY3Bfc29jayhzaykgKChzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqKSAoc2spKQorI2RlZmluZSBuZmNfbGxjcF9kZXYoc2spICAobmZjX2xsY3Bfc29jaygoc2spKS0+ZGV2KQorCisjZGVmaW5lIExMQ1BfSEVBREVSX1NJWkUgICAyCisjZGVmaW5lIExMQ1BfU0VRVUVOQ0VfU0laRSAxCisKKy8qIExMQ1AgdmVyc2lvbnM6IDEuMSBpcyAxLjAgcGx1cyBTRFAgKi8KKyNkZWZpbmUgTExDUF9WRVJTSU9OXzEwIDB4MTAKKyNkZWZpbmUgTExDUF9WRVJTSU9OXzExIDB4MTEKKworLyogTExDUCBQRFUgdHlwZXMgKi8KKyNkZWZpbmUgTExDUF9QRFVfU1lNTSAgICAgMHgwCisjZGVmaW5lIExMQ1BfUERVX1BBWCAgICAgIDB4MQorI2RlZmluZSBMTENQX1BEVV9BR0YgICAgICAweDIKKyNkZWZpbmUgTExDUF9QRFVfVUkgICAgICAgMHgzCisjZGVmaW5lIExMQ1BfUERVX0NPTk5FQ1QgIDB4NAorI2RlZmluZSBMTENQX1BEVV9ESVNDICAgICAweDUKKyNkZWZpbmUgTExDUF9QRFVfQ0MgICAgICAgMHg2CisjZGVmaW5lIExMQ1BfUERVX0RNICAgICAgIDB4NworI2RlZmluZSBMTENQX1BEVV9GUk1SICAgICAweDgKKyNkZWZpbmUgTExDUF9QRFVfU05MICAgICAgMHg5CisjZGVmaW5lIExMQ1BfUERVX0kgICAgICAgIDB4YworI2RlZmluZSBMTENQX1BEVV9SUiAgICAgICAweGQKKyNkZWZpbmUgTExDUF9QRFVfUk5SICAgICAgMHhlCisKKy8qIFBhcmFtZXRlcnMgVExWIHR5cGVzICovCisjZGVmaW5lIExMQ1BfVExWX1ZFUlNJT04gMHgxCisjZGVmaW5lIExMQ1BfVExWX01JVVggICAgMHgyCisjZGVmaW5lIExMQ1BfVExWX1dLUyAgICAgMHgzCisjZGVmaW5lIExMQ1BfVExWX0xUTyAgICAgMHg0CisjZGVmaW5lIExMQ1BfVExWX1JXICAgICAgMHg1CisjZGVmaW5lIExMQ1BfVExWX1NOICAgICAgMHg2CisjZGVmaW5lIExMQ1BfVExWX09QVCAgICAgMHg3CisjZGVmaW5lIExMQ1BfVExWX1NEUkVRICAgMHg4CisjZGVmaW5lIExMQ1BfVExWX1NEUkVTICAgMHg5CisjZGVmaW5lIExMQ1BfVExWX01BWCAgICAgMHhhCisKKy8qIFdlbGwga25vd24gTExDUCBTQVAgKi8KKyNkZWZpbmUgTExDUF9TQVBfU0RQICAgMHgxCisjZGVmaW5lIExMQ1BfU0FQX0lQICAgIDB4MgorI2RlZmluZSBMTENQX1NBUF9PQkVYICAweDMKKyNkZWZpbmUgTExDUF9TQVBfU05FUCAgMHg0CisjZGVmaW5lIExMQ1BfU0FQX01BWCAgIDB4ZmYKKworLyogRGlzY29ubmVjdGlvbiByZWFzb24gY29kZSAqLworI2RlZmluZSBMTENQX0RNX0RJU0MgICAgMHgwMAorI2RlZmluZSBMTENQX0RNX05PQ09OTiAgMHgwMQorI2RlZmluZSBMTENQX0RNX05PQk9VTkQgMHgwMgorI2RlZmluZSBMTENQX0RNX1JFSiAgICAgMHgwMworCisKK3N0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbmZjX2xsY3BfZmluZF9sb2NhbChzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKK3U4IG5mY19sbGNwX2dldF9zZHBfc3NhcChzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsLAorCQkJCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrKTsKK3U4IG5mY19sbGNwX2dldF9sb2NhbF9zc2FwKHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwpOwordm9pZCBuZmNfbGxjcF9wdXRfc3NhcChzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsLCB1OCBzc2FwKTsKKworLyogU29jayBBUEkgKi8KK3N0cnVjdCBzb2NrICpuZmNfbGxjcF9zb2NrX2FsbG9jKHN0cnVjdCBzb2NrZXQgKnNvY2ssIGludCB0eXBlLCBnZnBfdCBnZnApOwordm9pZCBuZmNfbGxjcF9zb2NrX2ZyZWUoc3RydWN0IG5mY19sbGNwX3NvY2sgKnNvY2spOwordm9pZCBuZmNfbGxjcF9hY2NlcHRfdW5saW5rKHN0cnVjdCBzb2NrICpzayk7Cit2b2lkIG5mY19sbGNwX2FjY2VwdF9lbnF1ZXVlKHN0cnVjdCBzb2NrICpwYXJlbnQsIHN0cnVjdCBzb2NrICpzayk7CitzdHJ1Y3Qgc29jayAqbmZjX2xsY3BfYWNjZXB0X2RlcXVldWUoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrKTsKKworLyogVExWIEFQSSAqLworaW50IG5mY19sbGNwX3BhcnNlX3RsdihzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsLAorCQkJdTggKnRsdl9hcnJheSwgdTE2IHRsdl9hcnJheV9sZW4pOworCisvKiBDb21tYW5kcyBBUEkgKi8KK3ZvaWQgbmZjX2xsY3BfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZXJyKTsKK3U4ICpuZmNfbGxjcF9idWlsZF90bHYodTggdHlwZSwgdTggKnZhbHVlLCB1OCB2YWx1ZV9sZW5ndGgsIHU4ICp0bHZfbGVuZ3RoKTsKK3ZvaWQgbmZjX2xsY3BfcmVjdih2b2lkICpkYXRhLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgZXJyKTsKK2ludCBuZmNfbGxjcF9kaXNjb25uZWN0KHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrKTsKK2ludCBuZmNfbGxjcF9zZW5kX3N5bW0oc3RydWN0IG5mY19kZXYgKmRldik7CitpbnQgbmZjX2xsY3Bfc2VuZF9jb25uZWN0KHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrKTsKK2ludCBuZmNfbGxjcF9zZW5kX2NjKHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrKTsKK2ludCBuZmNfbGxjcF9zZW5kX2RtKHN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWwsIHU4IHNzYXAsIHU4IGRzYXAsIHU4IHJlYXNvbik7CitpbnQgbmZjX2xsY3Bfc2VuZF9kaXNjb25uZWN0KHN0cnVjdCBuZmNfbGxjcF9zb2NrICpzb2NrKTsKKworLyogU29ja2V0IEFQSSAqLworaW50IF9faW5pdCBuZmNfbGxjcF9zb2NrX2luaXQodm9pZCk7Cit2b2lkIG5mY19sbGNwX3NvY2tfZXhpdCh2b2lkKTsKZGlmZiAtLWdpdCBhL25ldC9uZmMvbGxjcC9zb2NrLmMgYi9uZXQvbmZjL2xsY3Avc29jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MzhjY2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvbmZjL2xsY3Avc29jay5jCkBAIC0wLDAgKzEsNjc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExICBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNkZWZpbmUgcHJfZm10KGZtdCkgImxsY3A6ICVzOiAiIGZtdCwgX19mdW5jX18KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9uZmMuaD4KKworI2luY2x1ZGUgIi4uL25mYy5oIgorI2luY2x1ZGUgImxsY3AuaCIKKworc3RhdGljIHN0cnVjdCBwcm90byBsbGNwX3NvY2tfcHJvdG8gPSB7CisJLm5hbWUgICAgID0gIk5GQ19MTENQIiwKKwkub3duZXIgICAgPSBUSElTX01PRFVMRSwKKwkub2JqX3NpemUgPSBzaXplb2Yoc3RydWN0IG5mY19sbGNwX3NvY2spLAorfTsKKworc3RhdGljIGludCBsbGNwX3NvY2tfYmluZChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBhbGVuKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsbGNwX3NvY2sgPSBuZmNfbGxjcF9zb2NrKHNrKTsKKwlzdHJ1Y3QgbmZjX2xsY3BfbG9jYWwgKmxvY2FsOworCXN0cnVjdCBuZmNfZGV2ICpkZXY7CisJc3RydWN0IHNvY2thZGRyX25mY19sbGNwIGxsY3BfYWRkcjsKKwlpbnQgbGVuLCByZXQgPSAwOworCisJcHJfZGVidWcoInNrICVwIGFkZHIgJXAgZmFtaWx5ICVkXG4iLCBzaywgYWRkciwgYWRkci0+c2FfZmFtaWx5KTsKKworCWlmICghYWRkciB8fCBhZGRyLT5zYV9mYW1pbHkgIT0gQUZfTkZDKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1lbXNldCgmbGxjcF9hZGRyLCAwLCBzaXplb2YobGxjcF9hZGRyKSk7CisJbGVuID0gbWluX3QodW5zaWduZWQgaW50LCBzaXplb2YobGxjcF9hZGRyKSwgYWxlbik7CisJbWVtY3B5KCZsbGNwX2FkZHIsIGFkZHIsIGxlbik7CisKKwkvKiBUaGlzIGlzIGdvaW5nIHRvIGJlIGEgbGlzdGVuaW5nIHNvY2tldCwgZHNhcCBtdXN0IGJlIDAgKi8KKwlpZiAobGxjcF9hZGRyLmRzYXAgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKHNrLT5za19zdGF0ZSAhPSBMTENQX0NMT1NFRCkgeworCQlyZXQgPSAtRUJBREZEOworCQlnb3RvIGVycm9yOworCX0KKworCWRldiA9IG5mY19nZXRfZGV2aWNlKGxsY3BfYWRkci5kZXZfaWR4KTsKKwlpZiAoZGV2ID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlsb2NhbCA9IG5mY19sbGNwX2ZpbmRfbG9jYWwoZGV2KTsKKwlpZiAobG9jYWwgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PREVWOworCQlnb3RvIHB1dF9kZXY7CisJfQorCisJbGxjcF9zb2NrLT5kZXYgPSBkZXY7CisJbGxjcF9zb2NrLT5sb2NhbCA9IGxvY2FsOworCWxsY3Bfc29jay0+bmZjX3Byb3RvY29sID0gbGxjcF9hZGRyLm5mY19wcm90b2NvbDsKKwlsbGNwX3NvY2stPnNlcnZpY2VfbmFtZV9sZW4gPSBtaW5fdCh1bnNpZ25lZCBpbnQsCisJCQlsbGNwX2FkZHIuc2VydmljZV9uYW1lX2xlbiwgTkZDX0xMQ1BfTUFYX1NFUlZJQ0VfTkFNRSk7CisJbGxjcF9zb2NrLT5zZXJ2aWNlX25hbWUgPSBrbWVtZHVwKGxsY3BfYWRkci5zZXJ2aWNlX25hbWUsCisJCQkJbGxjcF9zb2NrLT5zZXJ2aWNlX25hbWVfbGVuLCBHRlBfS0VSTkVMKTsKKworCWxsY3Bfc29jay0+c3NhcCA9IG5mY19sbGNwX2dldF9zZHBfc3NhcChsb2NhbCwgbGxjcF9zb2NrKTsKKwlpZiAobGxjcF9zb2NrLT5zc2FwID09IExMQ1BfTUFYX1NBUCkKKwkJZ290byBwdXRfZGV2OworCisJbG9jYWwtPnNvY2tldHNbbGxjcF9zb2NrLT5zc2FwXSA9IGxsY3Bfc29jazsKKworCXByX2RlYnVnKCJTb2NrZXQgYm91bmQgdG8gU0FQICVkXG4iLCBsbGNwX3NvY2stPnNzYXApOworCisJc2stPnNrX3N0YXRlID0gTExDUF9CT1VORDsKKworcHV0X2RldjoKKwluZmNfcHV0X2RldmljZShkZXYpOworCitlcnJvcjoKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgbGxjcF9zb2NrX2xpc3RlbihzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgYmFja2xvZykKK3sKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCJzayAlcCBiYWNrbG9nICVkXG4iLCBzaywgYmFja2xvZyk7CisKKwlsb2NrX3NvY2soc2spOworCisJaWYgKChzb2NrLT50eXBlICE9IFNPQ0tfU0VRUEFDS0VUICYmIHNvY2stPnR5cGUgIT0gU09DS19TVFJFQU0pCisJCQl8fCBzay0+c2tfc3RhdGUgIT0gTExDUF9CT1VORCkgeworCQlyZXQgPSAtRUJBREZEOworCQlnb3RvIGVycm9yOworCX0KKworCXNrLT5za19tYXhfYWNrX2JhY2tsb2cgPSBiYWNrbG9nOworCXNrLT5za19hY2tfYmFja2xvZyA9IDA7CisKKwlwcl9kZWJ1ZygiU29ja2V0IGxpc3RlbmluZ1xuIik7CisJc2stPnNrX3N0YXRlID0gTExDUF9MSVNURU47CisKK2Vycm9yOgorCXJlbGVhc2Vfc29jayhzayk7CisKKwlyZXR1cm4gcmV0OworfQorCit2b2lkIG5mY19sbGNwX2FjY2VwdF91bmxpbmsoc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsbGNwX3NvY2sgPSBuZmNfbGxjcF9zb2NrKHNrKTsKKworCXByX2RlYnVnKCJzdGF0ZSAlZFxuIiwgc2stPnNrX3N0YXRlKTsKKworCWxpc3RfZGVsX2luaXQoJmxsY3Bfc29jay0+YWNjZXB0X3F1ZXVlKTsKKwlza19hY2NlcHRxX3JlbW92ZWQobGxjcF9zb2NrLT5wYXJlbnQpOworCWxsY3Bfc29jay0+cGFyZW50ID0gTlVMTDsKKworCXNvY2tfcHV0KHNrKTsKK30KKwordm9pZCBuZmNfbGxjcF9hY2NlcHRfZW5xdWV1ZShzdHJ1Y3Qgc29jayAqcGFyZW50LCBzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxsY3Bfc29jayA9IG5mY19sbGNwX3NvY2soc2spOworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsbGNwX3NvY2tfcGFyZW50ID0gbmZjX2xsY3Bfc29jayhwYXJlbnQpOworCisJLyogTG9jayB3aWxsIGJlIGZyZWUgZnJvbSB1bmxpbmsgKi8KKwlzb2NrX2hvbGQoc2spOworCisJbGlzdF9hZGRfdGFpbCgmbGxjcF9zb2NrLT5hY2NlcHRfcXVldWUsCisJCQkmbGxjcF9zb2NrX3BhcmVudC0+YWNjZXB0X3F1ZXVlKTsKKwlsbGNwX3NvY2stPnBhcmVudCA9IHBhcmVudDsKKwlza19hY2NlcHRxX2FkZGVkKHBhcmVudCk7Cit9CisKK3N0cnVjdCBzb2NrICpuZmNfbGxjcF9hY2NlcHRfZGVxdWV1ZShzdHJ1Y3Qgc29jayAqcGFyZW50LAorCQkJCQlzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrKQoreworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsc2ssICpuLCAqbGxjcF9wYXJlbnQ7CisJc3RydWN0IHNvY2sgKnNrOworCisJbGxjcF9wYXJlbnQgPSBuZmNfbGxjcF9zb2NrKHBhcmVudCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobHNrLCBuLCAmbGxjcF9wYXJlbnQtPmFjY2VwdF9xdWV1ZSwKKwkJCQkJCQlhY2NlcHRfcXVldWUpIHsKKwkJc2sgPSAmbHNrLT5zazsKKwkJbG9ja19zb2NrKHNrKTsKKworCQlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ0xPU0VEKSB7CisJCQlyZWxlYXNlX3NvY2soc2spOworCQkJbmZjX2xsY3BfYWNjZXB0X3VubGluayhzayk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzay0+c2tfc3RhdGUgPT0gTExDUF9DT05ORUNURUQgfHwgIW5ld3NvY2spIHsKKwkJCW5mY19sbGNwX2FjY2VwdF91bmxpbmsoc2spOworCQkJaWYgKG5ld3NvY2spCisJCQkJc29ja19ncmFmdChzaywgbmV3c29jayk7CisKKwkJCXJlbGVhc2Vfc29jayhzayk7CisKKwkJCXByX2RlYnVnKCJSZXR1cm5pbmcgc2sgc3RhdGUgJWRcbiIsIHNrLT5za19zdGF0ZSk7CisKKwkJCXJldHVybiBzazsKKwkJfQorCisJCXJlbGVhc2Vfc29jayhzayk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbGxjcF9zb2NrX2FjY2VwdChzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2V0ICpuZXdzb2NrLAorCQkJCQkJCQlpbnQgZmxhZ3MpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2ssICpuZXdfc2s7CisJbG9uZyB0aW1lbzsKKwlpbnQgcmV0ID0gMDsKKworCXByX2RlYnVnKCJwYXJlbnQgJXBcbiIsIHNrKTsKKworCWxvY2tfc29ja19uZXN0ZWQoc2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKworCWlmIChzay0+c2tfc3RhdGUgIT0gTExDUF9MSVNURU4pIHsKKwkJcmV0ID0gLUVCQURGRDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl0aW1lbyA9IHNvY2tfcmN2dGltZW8oc2ssIGZsYWdzICYgT19OT05CTE9DSyk7CisKKwkvKiBXYWl0IGZvciBhbiBpbmNvbWluZyBjb25uZWN0aW9uLiAqLworCWFkZF93YWl0X3F1ZXVlX2V4Y2x1c2l2ZShza19zbGVlcChzayksICZ3YWl0KTsKKwl3aGlsZSAoIShuZXdfc2sgPSBuZmNfbGxjcF9hY2NlcHRfZGVxdWV1ZShzaywgbmV3c29jaykpKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJaWYgKCF0aW1lbykgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQlyZXQgPSBzb2NrX2ludHJfZXJybm8odGltZW8pOworCQkJYnJlYWs7CisJCX0KKworCQlyZWxlYXNlX3NvY2soc2spOworCQl0aW1lbyA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW8pOworCQlsb2NrX3NvY2tfbmVzdGVkKHNrLCBTSU5HTEVfREVQVEhfTkVTVElORyk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZShza19zbGVlcChzayksICZ3YWl0KTsKKworCWlmIChyZXQpCisJCWdvdG8gZXJyb3I7CisKKwluZXdzb2NrLT5zdGF0ZSA9IFNTX0NPTk5FQ1RFRDsKKworCXByX2RlYnVnKCJuZXcgc29ja2V0ICVwXG4iLCBuZXdfc2spOworCitlcnJvcjoKKwlyZWxlYXNlX3NvY2soc2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsbGNwX3NvY2tfZ2V0bmFtZShzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsCisJCQkgICAgIGludCAqbGVuLCBpbnQgcGVlcikKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbmZjX2xsY3AgKmxsY3BfYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbmZjX2xsY3AgKikgYWRkcjsKKwlzdHJ1Y3Qgc29jayAqc2sgPSBzb2NrLT5zazsKKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqbGxjcF9zb2NrID0gbmZjX2xsY3Bfc29jayhzayk7CisKKwlwcl9kZWJ1ZygiJXBcbiIsIHNrKTsKKworCWFkZHItPnNhX2ZhbWlseSA9IEFGX05GQzsKKwkqbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9uZmNfbGxjcCk7CisKKwlsbGNwX2FkZHItPmRldl9pZHggPSBsbGNwX3NvY2stPmRldi0+aWR4OworCWxsY3BfYWRkci0+ZHNhcCA9IGxsY3Bfc29jay0+ZHNhcDsKKwlsbGNwX2FkZHItPnNzYXAgPSBsbGNwX3NvY2stPnNzYXA7CisJbGxjcF9hZGRyLT5zZXJ2aWNlX25hbWVfbGVuID0gbGxjcF9zb2NrLT5zZXJ2aWNlX25hbWVfbGVuOworCW1lbWNweShsbGNwX2FkZHItPnNlcnZpY2VfbmFtZSwgbGxjcF9zb2NrLT5zZXJ2aWNlX25hbWUsCisJCQkJCWxsY3BfYWRkci0+c2VydmljZV9uYW1lX2xlbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgbGxjcF9hY2NlcHRfcG9sbChzdHJ1Y3Qgc29jayAqcGFyZW50KQoreworCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpsbGNwX3NvY2ssICpuLCAqcGFyZW50X3NvY2s7CisJc3RydWN0IHNvY2sgKnNrOworCisJcGFyZW50X3NvY2sgPSBuZmNfbGxjcF9zb2NrKHBhcmVudCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobGxjcF9zb2NrLCBuLCAmcGFyZW50X3NvY2stPmFjY2VwdF9xdWV1ZSwKKwkJCQkJCQkJYWNjZXB0X3F1ZXVlKSB7CisJCXNrID0gJmxsY3Bfc29jay0+c2s7CisKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBMTENQX0NPTk5FQ1RFRCkKKwkJCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGxsY3Bfc29ja19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgc29ja2V0ICpzb2NrLAorCQkJCQkJCXBvbGxfdGFibGUgKndhaXQpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJcHJfZGVidWcoIiVwXG4iLCBzayk7CisKKwlzb2NrX3BvbGxfd2FpdChmaWxlLCBza19zbGVlcChzayksIHdhaXQpOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBMTENQX0xJU1RFTikKKwkJcmV0dXJuIGxsY3BfYWNjZXB0X3BvbGwoc2spOworCisJaWYgKHNrLT5za19lcnIgfHwgIXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX2Vycm9yX3F1ZXVlKSkKKwkJbWFzayB8PSBQT0xMRVJSOworCisJaWYgKCFza2JfcXVldWVfZW1wdHkoJnNrLT5za19yZWNlaXZlX3F1ZXVlKSkKKwkJbWFzayB8PSBQT0xMSU47CisKKwlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ0xPU0VEKQorCQltYXNrIHw9IFBPTExIVVA7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBsbGNwX3NvY2tfcmVsZWFzZShzdHJ1Y3Qgc29ja2V0ICpzb2NrKQoreworCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWw7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxsY3Bfc29jayA9IG5mY19sbGNwX3NvY2soc2spOworCisJaWYgKCFzaykKKwkJcmV0dXJuIDA7CisKKwlwcl9kZWJ1ZygiJXBcbiIsIHNrKTsKKworCWxvY2FsID0gbGxjcF9zb2NrLT5sb2NhbDsKKwlpZiAobG9jYWwgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCisJaWYgKGxsY3Bfc29jayA9PSBsb2NhbC0+c29ja2V0c1tsbGNwX3NvY2stPnNzYXBdKSB7CisJCWxvY2FsLT5zb2NrZXRzW2xsY3Bfc29jay0+c3NhcF0gPSBOVUxMOworCX0gZWxzZSB7CisJCXN0cnVjdCBuZmNfbGxjcF9zb2NrICpwYXJlbnQsICpzLCAqbjsKKworCQlwYXJlbnQgPSBsb2NhbC0+c29ja2V0c1tsbGNwX3NvY2stPnNzYXBdOworCisJCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShzLCBuLCAmcGFyZW50LT5saXN0LCBsaXN0KQorCQkJaWYgKGxsY3Bfc29jayA9PSBzKSB7CisJCQkJbGlzdF9kZWwoJnMtPmxpc3QpOworCQkJCWJyZWFrOworCQkJfQorCisJfQorCisJbXV0ZXhfdW5sb2NrKCZsb2NhbC0+c29ja2V0X2xvY2spOworCisJbG9ja19zb2NrKHNrKTsKKworCS8qIFNlbmQgYSBESVNDICovCisJaWYgKHNrLT5za19zdGF0ZSA9PSBMTENQX0NPTk5FQ1RFRCkKKwkJbmZjX2xsY3BfZGlzY29ubmVjdChsbGNwX3NvY2spOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBMTENQX0xJU1RFTikgeworCQlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqbHNrLCAqbjsKKwkJc3RydWN0IHNvY2sgKmFjY2VwdF9zazsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobHNrLCBuLCAmbGxjcF9zb2NrLT5hY2NlcHRfcXVldWUsCisJCQkJCQkJCWFjY2VwdF9xdWV1ZSkgeworCQkJYWNjZXB0X3NrID0gJmxzay0+c2s7CisJCQlsb2NrX3NvY2soYWNjZXB0X3NrKTsKKworCQkJbmZjX2xsY3BfZGlzY29ubmVjdChsc2spOworCQkJbmZjX2xsY3BfYWNjZXB0X3VubGluayhhY2NlcHRfc2spOworCisJCQlyZWxlYXNlX3NvY2soYWNjZXB0X3NrKTsKKworCQkJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKwkJCXNvY2tfb3JwaGFuKGFjY2VwdF9zayk7CisJCQlzb2NrX3B1dChhY2NlcHRfc2spOworCQl9CisJfQorCisJLyogRnJlZWluZyB0aGUgU0FQICovCisJaWYgKChzay0+c2tfc3RhdGUgPT0gTExDUF9DT05ORUNURUQKKwkJCSYmIGxsY3Bfc29jay0+c3NhcCA+IExMQ1BfTE9DQUxfU0FQX09GRlNFVCkgfHwKKwkgICAgc2stPnNrX3N0YXRlID09IExMQ1BfQk9VTkQgfHwKKwkgICAgc2stPnNrX3N0YXRlID09IExMQ1BfTElTVEVOKQorCQluZmNfbGxjcF9wdXRfc3NhcChsbGNwX3NvY2stPmxvY2FsLCBsbGNwX3NvY2stPnNzYXApOworCisJc29ja19zZXRfZmxhZyhzaywgU09DS19ERUFEKTsKKworCXJlbGVhc2Vfc29jayhzayk7CisKKwlzb2NrX29ycGhhbihzayk7CisJc29ja19wdXQoc2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbGxjcF9zb2NrX2Nvbm5lY3Qoc3RydWN0IHNvY2tldCAqc29jaywgc3RydWN0IHNvY2thZGRyICpfYWRkciwKKwkJCQkJCQlpbnQgbGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxsY3Bfc29jayA9IG5mY19sbGNwX3NvY2soc2spOworCXN0cnVjdCBzb2NrYWRkcl9uZmNfbGxjcCAqYWRkciA9IChzdHJ1Y3Qgc29ja2FkZHJfbmZjX2xsY3AgKilfYWRkcjsKKwlzdHJ1Y3QgbmZjX2RldiAqZGV2OworCXN0cnVjdCBuZmNfbGxjcF9sb2NhbCAqbG9jYWw7CisJaW50IHJldCA9IDA7CisKKwlwcl9kZWJ1Zygic29jayAlcCBzayAlcCBmbGFncyAweCV4XG4iLCBzb2NrLCBzaywgZmxhZ3MpOworCisJaWYgKCFhZGRyIHx8IGxlbiA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbmZjKSB8fAorCQkJYWRkci0+c2FfZmFtaWx5ICE9IEFGX05GQykgeworCQlwcl9lcnIoIkludmFsaWQgc29ja2V0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGFkZHItPnNlcnZpY2VfbmFtZV9sZW4gPT0gMCAmJiBhZGRyLT5kc2FwID09IDApIHsKKwkJcHJfZXJyKCJNaXNzaW5nIHNlcnZpY2UgbmFtZSBvciBkc2FwXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcHJfZGVidWcoImFkZHIgZGV2X2lkeD0ldSB0YXJnZXRfaWR4PSV1IHByb3RvY29sPSV1XG4iLCBhZGRyLT5kZXZfaWR4LAorCQkJCQlhZGRyLT50YXJnZXRfaWR4LCBhZGRyLT5uZmNfcHJvdG9jb2wpOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gTExDUF9DT05ORUNURUQpIHsKKwkJcmV0ID0gLUVJU0NPTk47CisJCWdvdG8gZXJyb3I7CisJfQorCisJZGV2ID0gbmZjX2dldF9kZXZpY2UoYWRkci0+ZGV2X2lkeCk7CisJaWYgKGRldiA9PSBOVUxMKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZXJyb3I7CisJfQorCisJbG9jYWwgPSBuZmNfbGxjcF9maW5kX2xvY2FsKGRldik7CisJaWYgKGxvY2FsID09IE5VTEwpIHsKKwkJcmV0ID0gLUVOT0RFVjsKKwkJZ290byBwdXRfZGV2OworCX0KKworCWRldmljZV9sb2NrKCZkZXYtPmRldik7CisJaWYgKGRldi0+ZGVwX2xpbmtfdXAgPT0gZmFsc2UpIHsKKwkJcmV0ID0gLUVOT0xJTks7CisJCWRldmljZV91bmxvY2soJmRldi0+ZGV2KTsKKwkJZ290byBwdXRfZGV2OworCX0KKwlkZXZpY2VfdW5sb2NrKCZkZXYtPmRldik7CisKKwlpZiAobG9jYWwtPnJmX21vZGUgPT0gTkZDX1JGX0lOSVRJQVRPUiAmJgorCQkJYWRkci0+dGFyZ2V0X2lkeCAhPSBsb2NhbC0+dGFyZ2V0X2lkeCkgeworCQlyZXQgPSAtRU5PTElOSzsKKwkJZ290byBwdXRfZGV2OworCX0KKworCWxsY3Bfc29jay0+ZGV2ID0gZGV2OworCWxsY3Bfc29jay0+bG9jYWwgPSBsb2NhbDsKKwlsbGNwX3NvY2stPnNzYXAgPSBuZmNfbGxjcF9nZXRfbG9jYWxfc3NhcChsb2NhbCk7CisJaWYgKGxsY3Bfc29jay0+c3NhcCA9PSBMTENQX1NBUF9NQVgpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBwdXRfZGV2OworCX0KKwlpZiAoYWRkci0+c2VydmljZV9uYW1lX2xlbiA9PSAwKQorCQlsbGNwX3NvY2stPmRzYXAgPSBhZGRyLT5kc2FwOworCWVsc2UKKwkJbGxjcF9zb2NrLT5kc2FwID0gTExDUF9TQVBfU0RQOworCWxsY3Bfc29jay0+bmZjX3Byb3RvY29sID0gYWRkci0+bmZjX3Byb3RvY29sOworCWxsY3Bfc29jay0+c2VydmljZV9uYW1lX2xlbiA9IG1pbl90KHVuc2lnbmVkIGludCwKKwkJCWFkZHItPnNlcnZpY2VfbmFtZV9sZW4sIE5GQ19MTENQX01BWF9TRVJWSUNFX05BTUUpOworCWxsY3Bfc29jay0+c2VydmljZV9uYW1lID0ga21lbWR1cChhZGRyLT5zZXJ2aWNlX25hbWUsCisJCQkJIGxsY3Bfc29jay0+c2VydmljZV9uYW1lX2xlbiwgR0ZQX0tFUk5FTCk7CisKKwlsb2NhbC0+c29ja2V0c1tsbGNwX3NvY2stPnNzYXBdID0gbGxjcF9zb2NrOworCisJcmV0ID0gbmZjX2xsY3Bfc2VuZF9jb25uZWN0KGxsY3Bfc29jayk7CisJaWYgKHJldCkKKwkJZ290byBwdXRfZGV2OworCisJc2stPnNrX3N0YXRlID0gTExDUF9DT05ORUNURUQ7CisKKwlyZWxlYXNlX3NvY2soc2spOworCXJldHVybiAwOworCitwdXRfZGV2OgorCW5mY19wdXRfZGV2aWNlKGRldik7CisKK2Vycm9yOgorCXJlbGVhc2Vfc29jayhzayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBsbGNwX3NvY2tfcmVjdm1zZyhzdHJ1Y3Qga2lvY2IgKmlvY2IsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkgICAgIHN0cnVjdCBtc2doZHIgKm1zZywgc2l6ZV90IGxlbiwgaW50IGZsYWdzKQoreworCWludCBub2Jsb2NrID0gZmxhZ3MgJiBNU0dfRE9OVFdBSVQ7CisJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CisJdW5zaWduZWQgaW50IGNvcGllZCwgcmxlbjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqY3NrYjsKKwlpbnQgZXJyID0gMDsKKworCXByX2RlYnVnKCIlcCAlenVcbiIsIHNrLCBsZW4pOworCisJbG9ja19zb2NrKHNrKTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gTExDUF9DTE9TRUQgJiYKKwkJCXNrYl9xdWV1ZV9lbXB0eSgmc2stPnNrX3JlY2VpdmVfcXVldWUpKSB7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCXJldHVybiAwOworCX0KKworCXJlbGVhc2Vfc29jayhzayk7CisKKwlpZiAoZmxhZ3MgJiAoTVNHX09PQikpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXNrYiA9IHNrYl9yZWN2X2RhdGFncmFtKHNrLCBmbGFncywgbm9ibG9jaywgJmVycik7CisJaWYgKCFza2IpIHsKKwkJcHJfZXJyKCJSZWN2IGRhdGFncmFtIGZhaWxlZCBzdGF0ZSAlZCAlZCAlZCIsCisJCQkJc2stPnNrX3N0YXRlLCBlcnIsIHNvY2tfZXJyb3Ioc2spKTsKKworCQlpZiAoc2stPnNrX3NodXRkb3duICYgUkNWX1NIVVRET1dOKQorCQkJcmV0dXJuIDA7CisKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlybGVuICAgPSBza2ItPmxlbjsJCS8qIHJlYWwgbGVuZ3RoIG9mIHNrYiAqLworCWNvcGllZCA9IG1pbl90KHVuc2lnbmVkIGludCwgcmxlbiwgbGVuKTsKKworCWNza2IgPSBza2I7CisJaWYgKG1lbWNweV90b2lvdmVjKG1zZy0+bXNnX2lvdiwgY3NrYi0+ZGF0YSwgY29waWVkKSkgeworCQlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkKKwkJCXNrYl9xdWV1ZV9oZWFkKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJLyogTWFyayByZWFkIHBhcnQgb2Ygc2tiIGFzIHVzZWQgKi8KKwlpZiAoIShmbGFncyAmIE1TR19QRUVLKSkgeworCisJCS8qIFNPQ0tfU1RSRUFNOiByZS1xdWV1ZSBza2IgaWYgaXQgY29udGFpbnMgdW5yZWNlaXZlZCBkYXRhICovCisJCWlmIChzay0+c2tfdHlwZSA9PSBTT0NLX1NUUkVBTSkgeworCQkJc2tiX3B1bGwoc2tiLCBjb3BpZWQpOworCQkJaWYgKHNrYi0+bGVuKSB7CisJCQkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJfQorCisJCWtmcmVlX3NrYihza2IpOworCX0KKworCS8qIFhYWCBRdWV1ZSBiYWNrbG9nZ2VkIHNrYnMgKi8KKworZG9uZToKKwkvKiBTT0NLX1NFUVBBQ0tFVDogcmV0dXJuIHJlYWwgbGVuZ3RoIGlmIE1TR19UUlVOQyBpcyBzZXQgKi8KKwlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TRVFQQUNLRVQgJiYgKGZsYWdzICYgTVNHX1RSVU5DKSkKKwkJY29waWVkID0gcmxlbjsKKworCXJldHVybiBjb3BpZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHJvdG9fb3BzIGxsY3Bfc29ja19vcHMgPSB7CisJLmZhbWlseSAgICAgICAgID0gUEZfTkZDLAorCS5vd25lciAgICAgICAgICA9IFRISVNfTU9EVUxFLAorCS5iaW5kICAgICAgICAgICA9IGxsY3Bfc29ja19iaW5kLAorCS5jb25uZWN0ICAgICAgICA9IGxsY3Bfc29ja19jb25uZWN0LAorCS5yZWxlYXNlICAgICAgICA9IGxsY3Bfc29ja19yZWxlYXNlLAorCS5zb2NrZXRwYWlyICAgICA9IHNvY2tfbm9fc29ja2V0cGFpciwKKwkuYWNjZXB0ICAgICAgICAgPSBsbGNwX3NvY2tfYWNjZXB0LAorCS5nZXRuYW1lICAgICAgICA9IGxsY3Bfc29ja19nZXRuYW1lLAorCS5wb2xsICAgICAgICAgICA9IGxsY3Bfc29ja19wb2xsLAorCS5pb2N0bCAgICAgICAgICA9IHNvY2tfbm9faW9jdGwsCisJLmxpc3RlbiAgICAgICAgID0gbGxjcF9zb2NrX2xpc3RlbiwKKwkuc2h1dGRvd24gICAgICAgPSBzb2NrX25vX3NodXRkb3duLAorCS5zZXRzb2Nrb3B0ICAgICA9IHNvY2tfbm9fc2V0c29ja29wdCwKKwkuZ2V0c29ja29wdCAgICAgPSBzb2NrX25vX2dldHNvY2tvcHQsCisJLnNlbmRtc2cgICAgICAgID0gc29ja19ub19zZW5kbXNnLAorCS5yZWN2bXNnICAgICAgICA9IGxsY3Bfc29ja19yZWN2bXNnLAorCS5tbWFwICAgICAgICAgICA9IHNvY2tfbm9fbW1hcCwKK307CisKK3N0YXRpYyB2b2lkIGxsY3Bfc29ja19kZXN0cnVjdChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IG5mY19sbGNwX3NvY2sgKmxsY3Bfc29jayA9IG5mY19sbGNwX3NvY2soc2spOworCisJcHJfZGVidWcoIiVwXG4iLCBzayk7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IExMQ1BfQ09OTkVDVEVEKQorCQluZmNfcHV0X2RldmljZShsbGNwX3NvY2stPmRldik7CisKKwlza2JfcXVldWVfcHVyZ2UoJnNrLT5za19yZWNlaXZlX3F1ZXVlKTsKKworCW5mY19sbGNwX3NvY2tfZnJlZShsbGNwX3NvY2spOworCisJaWYgKCFzb2NrX2ZsYWcoc2ssIFNPQ0tfREVBRCkpIHsKKwkJcHJfZXJyKCJGcmVlaW5nIGFsaXZlIE5GQyBMTENQIHNvY2tldCAlcFxuIiwgc2spOworCQlyZXR1cm47CisJfQorfQorCitzdHJ1Y3Qgc29jayAqbmZjX2xsY3Bfc29ja19hbGxvYyhzdHJ1Y3Qgc29ja2V0ICpzb2NrLCBpbnQgdHlwZSwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBzb2NrICpzazsKKwlzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqbGxjcF9zb2NrOworCisJc2sgPSBza19hbGxvYygmaW5pdF9uZXQsIFBGX05GQywgZ2ZwLCAmbGxjcF9zb2NrX3Byb3RvKTsKKwlpZiAoIXNrKQorCQlyZXR1cm4gTlVMTDsKKworCWxsY3Bfc29jayA9IG5mY19sbGNwX3NvY2soc2spOworCisJc29ja19pbml0X2RhdGEoc29jaywgc2spOworCXNrLT5za19zdGF0ZSA9IExMQ1BfQ0xPU0VEOworCXNrLT5za19wcm90b2NvbCA9IE5GQ19TT0NLUFJPVE9fTExDUDsKKwlzay0+c2tfdHlwZSA9IHR5cGU7CisJc2stPnNrX2Rlc3RydWN0ID0gbGxjcF9zb2NrX2Rlc3RydWN0OworCisJbGxjcF9zb2NrLT5zc2FwID0gMDsKKwlsbGNwX3NvY2stPmRzYXAgPSBMTENQX1NBUF9TRFA7CisJbGxjcF9zb2NrLT5zZW5kX24gPSBsbGNwX3NvY2stPnNlbmRfYWNrX24gPSAwOworCWxsY3Bfc29jay0+cmVjdl9uID0gbGxjcF9zb2NrLT5yZWN2X2Fja19uID0gMDsKKwlsbGNwX3NvY2stPnJlbW90ZV9yZWFkeSA9IDE7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbGxjcF9zb2NrLT50eF9xdWV1ZSk7CisJc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbGxjcF9zb2NrLT50eF9wZW5kaW5nX3F1ZXVlKTsKKwlza2JfcXVldWVfaGVhZF9pbml0KCZsbGNwX3NvY2stPnR4X2JhY2tsb2dfcXVldWUpOworCUlOSVRfTElTVF9IRUFEKCZsbGNwX3NvY2stPmxpc3QpOworCUlOSVRfTElTVF9IRUFEKCZsbGNwX3NvY2stPmFjY2VwdF9xdWV1ZSk7CisKKwlpZiAoc29jayAhPSBOVUxMKQorCQlzb2NrLT5zdGF0ZSA9IFNTX1VOQ09OTkVDVEVEOworCisJcmV0dXJuIHNrOworfQorCit2b2lkIG5mY19sbGNwX3NvY2tfZnJlZShzdHJ1Y3QgbmZjX2xsY3Bfc29jayAqc29jaykKK3sKKwlrZnJlZShzb2NrLT5zZXJ2aWNlX25hbWUpOworCisJc2tiX3F1ZXVlX3B1cmdlKCZzb2NrLT50eF9xdWV1ZSk7CisJc2tiX3F1ZXVlX3B1cmdlKCZzb2NrLT50eF9wZW5kaW5nX3F1ZXVlKTsKKwlza2JfcXVldWVfcHVyZ2UoJnNvY2stPnR4X2JhY2tsb2dfcXVldWUpOworCisJbGlzdF9kZWxfaW5pdCgmc29jay0+YWNjZXB0X3F1ZXVlKTsKKworCXNvY2stPnBhcmVudCA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgbGxjcF9zb2NrX2NyZWF0ZShzdHJ1Y3QgbmV0ICpuZXQsIHN0cnVjdCBzb2NrZXQgKnNvY2ssCisJCQkJY29uc3Qgc3RydWN0IG5mY19wcm90b2NvbCAqbmZjX3Byb3RvKQoreworCXN0cnVjdCBzb2NrICpzazsKKworCXByX2RlYnVnKCIlcFxuIiwgc29jayk7CisKKwlpZiAoc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSAmJiBzb2NrLT50eXBlICE9IFNPQ0tfREdSQU0pCisJCXJldHVybiAtRVNPQ0tUTk9TVVBQT1JUOworCisJc29jay0+b3BzID0gJmxsY3Bfc29ja19vcHM7CisKKwlzayA9IG5mY19sbGNwX3NvY2tfYWxsb2Moc29jaywgc29jay0+dHlwZSwgR0ZQX0FUT01JQyk7CisJaWYgKHNrID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbmZjX3Byb3RvY29sIGxsY3BfbmZjX3Byb3RvID0geworCS5pZAkgID0gTkZDX1NPQ0tQUk9UT19MTENQLAorCS5wcm90byAgICA9ICZsbGNwX3NvY2tfcHJvdG8sCisJLm93bmVyICAgID0gVEhJU19NT0RVTEUsCisJLmNyZWF0ZSAgID0gbGxjcF9zb2NrX2NyZWF0ZQorfTsKKworaW50IF9faW5pdCBuZmNfbGxjcF9zb2NrX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gbmZjX3Byb3RvX3JlZ2lzdGVyKCZsbGNwX25mY19wcm90byk7Cit9CisKK3ZvaWQgbmZjX2xsY3Bfc29ja19leGl0KHZvaWQpCit7CisJbmZjX3Byb3RvX3VucmVnaXN0ZXIoJmxsY3BfbmZjX3Byb3RvKTsKK30KZGlmZiAtLWdpdCBhL25ldC9uZmMvbmNpL2NvcmUuYyBiL25ldC9uZmMvbmNpL2NvcmUuYwppbmRleCAzOTI1YzY1Li43NjUwMTM5IDEwMDY0NAotLS0gYS9uZXQvbmZjL25jaS9jb3JlLmMKKysrIGIvbmV0L25mYy9uY2kvY29yZS5jCkBAIC0yNSw2ICsyNSw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogJXM6ICIgZm10LCBfX2Z1bmNfXworCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CkBAIC02OSw3ICs3MSw3IEBACiAJX191MzIgdGltZW91dCkKIHsKIAlpbnQgcmMgPSAwOwotCXVuc2lnbmVkIGxvbmcgY29tcGxldGlvbl9yYzsKKwlsb25nIGNvbXBsZXRpb25fcmM7CiAKIAluZGV2LT5yZXFfc3RhdHVzID0gTkNJX1JFUV9QRU5EOwogCkBAIC03OSw3ICs4MSw3IEBACiAJCQkJCQkJJm5kZXYtPnJlcV9jb21wbGV0aW9uLAogCQkJCQkJCXRpbWVvdXQpOwogCi0JbmZjX2RiZygid2FpdF9mb3JfY29tcGxldGlvbiByZXR1cm4gJWxkIiwgY29tcGxldGlvbl9yYyk7CisJcHJfZGVidWcoIndhaXRfZm9yX2NvbXBsZXRpb24gcmV0dXJuICVsZFxuIiwgY29tcGxldGlvbl9yYyk7CiAKIAlpZiAoY29tcGxldGlvbl9yYyA+IDApIHsKIAkJc3dpdGNoIChuZGV2LT5yZXFfc3RhdHVzKSB7CkBAIC05Niw4ICs5OCw4IEBACiAJCQlicmVhazsKIAkJfQogCX0gZWxzZSB7Ci0JCW5mY19lcnIoIndhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0aWJsZV90aW1lb3V0IGZhaWxlZCAlbGQiLAotCQkJY29tcGxldGlvbl9yYyk7CisJCXByX2Vycigid2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQgZmFpbGVkICVsZFxuIiwKKwkJICAgICAgIGNvbXBsZXRpb25fcmMpOwogCiAJCXJjID0gKChjb21wbGV0aW9uX3JjID09IDApID8gKC1FVElNRURPVVQpIDogKGNvbXBsZXRpb25fcmMpKTsKIAl9CkBAIC0xMjYsNyArMTI4LDEwIEBACiAKIHN0YXRpYyB2b2lkIG5jaV9yZXNldF9yZXEoc3RydWN0IG5jaV9kZXYgKm5kZXYsIHVuc2lnbmVkIGxvbmcgb3B0KQogewotCW5jaV9zZW5kX2NtZChuZGV2LCBOQ0lfT1BfQ09SRV9SRVNFVF9DTUQsIDAsIE5VTEwpOworCXN0cnVjdCBuY2lfY29yZV9yZXNldF9jbWQgY21kOworCisJY21kLnJlc2V0X3R5cGUgPSBOQ0lfUkVTRVRfVFlQRV9SRVNFVF9DT05GSUc7CisJbmNpX3NlbmRfY21kKG5kZXYsIE5DSV9PUF9DT1JFX1JFU0VUX0NNRCwgMSwgJmNtZCk7CiB9CiAKIHN0YXRpYyB2b2lkIG5jaV9pbml0X3JlcShzdHJ1Y3QgbmNpX2RldiAqbmRldiwgdW5zaWduZWQgbG9uZyBvcHQpCkBAIC0xMzYsMTcgKzE0MSwxMSBAQAogCiBzdGF0aWMgdm9pZCBuY2lfaW5pdF9jb21wbGV0ZV9yZXEoc3RydWN0IG5jaV9kZXYgKm5kZXYsIHVuc2lnbmVkIGxvbmcgb3B0KQogewotCXN0cnVjdCBuY2lfY29yZV9jb25uX2NyZWF0ZV9jbWQgY29ubl9jbWQ7CiAJc3RydWN0IG5jaV9yZl9kaXNjX21hcF9jbWQgY21kOwogCXN0cnVjdCBkaXNjX21hcF9jb25maWcgKmNmZyA9IGNtZC5tYXBwaW5nX2NvbmZpZ3M7CiAJX191OCAqbnVtID0gJmNtZC5udW1fbWFwcGluZ19jb25maWdzOwogCWludCBpOwogCi0JLyogY3JlYXRlIHN0YXRpYyByZiBjb25uZWN0aW9uICovCi0JY29ubl9jbWQudGFyZ2V0X2hhbmRsZSA9IDA7Ci0JY29ubl9jbWQubnVtX3RhcmdldF9zcGVjaWZpY19wYXJhbXMgPSAwOwotCW5jaV9zZW5kX2NtZChuZGV2LCBOQ0lfT1BfQ09SRV9DT05OX0NSRUFURV9DTUQsIDIsICZjb25uX2NtZCk7Ci0KIAkvKiBzZXQgcmYgbWFwcGluZyBjb25maWd1cmF0aW9ucyAqLwogCSpudW0gPSAwOwogCkBAIC0xNTUsMTQgKzE1NCwxNiBAQAogCQlpZiAobmRldi0+c3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbaV0gPT0KIAkJCU5DSV9SRl9JTlRFUkZBQ0VfSVNPX0RFUCkgewogCQkJY2ZnWypudW1dLnJmX3Byb3RvY29sID0gTkNJX1JGX1BST1RPQ09MX0lTT19ERVA7Ci0JCQljZmdbKm51bV0ubW9kZSA9IE5DSV9ESVNDX01BUF9NT0RFX0JPVEg7Ci0JCQljZmdbKm51bV0ucmZfaW50ZXJmYWNlX3R5cGUgPSBOQ0lfUkZfSU5URVJGQUNFX0lTT19ERVA7CisJCQljZmdbKm51bV0ubW9kZSA9IE5DSV9ESVNDX01BUF9NT0RFX1BPTEwgfAorCQkJCU5DSV9ESVNDX01BUF9NT0RFX0xJU1RFTjsKKwkJCWNmZ1sqbnVtXS5yZl9pbnRlcmZhY2UgPSBOQ0lfUkZfSU5URVJGQUNFX0lTT19ERVA7CiAJCQkoKm51bSkrKzsKIAkJfSBlbHNlIGlmIChuZGV2LT5zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlc1tpXSA9PQogCQkJTkNJX1JGX0lOVEVSRkFDRV9ORkNfREVQKSB7CiAJCQljZmdbKm51bV0ucmZfcHJvdG9jb2wgPSBOQ0lfUkZfUFJPVE9DT0xfTkZDX0RFUDsKLQkJCWNmZ1sqbnVtXS5tb2RlID0gTkNJX0RJU0NfTUFQX01PREVfQk9USDsKLQkJCWNmZ1sqbnVtXS5yZl9pbnRlcmZhY2VfdHlwZSA9IE5DSV9SRl9JTlRFUkZBQ0VfTkZDX0RFUDsKKwkJCWNmZ1sqbnVtXS5tb2RlID0gTkNJX0RJU0NfTUFQX01PREVfUE9MTCB8CisJCQkJTkNJX0RJU0NfTUFQX01PREVfTElTVEVOOworCQkJY2ZnWypudW1dLnJmX2ludGVyZmFjZSA9IE5DSV9SRl9JTlRFUkZBQ0VfTkZDX0RFUDsKIAkJCSgqbnVtKSsrOwogCQl9CiAKQEAgLTE4NywxNiArMTg4LDE2IEBACiAJCXx8IHByb3RvY29scyAmIE5GQ19QUk9UT19NSUZBUkVfTUFTSwogCQl8fCBwcm90b2NvbHMgJiBORkNfUFJPVE9fSVNPMTQ0NDNfTUFTSwogCQl8fCBwcm90b2NvbHMgJiBORkNfUFJPVE9fTkZDX0RFUF9NQVNLKSkgewotCQljbWQuZGlzY19jb25maWdzW2NtZC5udW1fZGlzY19jb25maWdzXS50eXBlID0KLQkJTkNJX0RJU0NPVkVSWV9UWVBFX1BPTExfQV9QQVNTSVZFOworCQljbWQuZGlzY19jb25maWdzW2NtZC5udW1fZGlzY19jb25maWdzXS5yZl90ZWNoX2FuZF9tb2RlID0KKwkJTkNJX05GQ19BX1BBU1NJVkVfUE9MTF9NT0RFOwogCQljbWQuZGlzY19jb25maWdzW2NtZC5udW1fZGlzY19jb25maWdzXS5mcmVxdWVuY3kgPSAxOwogCQljbWQubnVtX2Rpc2NfY29uZmlncysrOwogCX0KIAogCWlmICgoY21kLm51bV9kaXNjX2NvbmZpZ3MgPCBOQ0lfTUFYX05VTV9SRl9DT05GSUdTKSAmJgogCQkocHJvdG9jb2xzICYgTkZDX1BST1RPX0lTTzE0NDQzX01BU0spKSB7Ci0JCWNtZC5kaXNjX2NvbmZpZ3NbY21kLm51bV9kaXNjX2NvbmZpZ3NdLnR5cGUgPQotCQlOQ0lfRElTQ09WRVJZX1RZUEVfUE9MTF9CX1BBU1NJVkU7CisJCWNtZC5kaXNjX2NvbmZpZ3NbY21kLm51bV9kaXNjX2NvbmZpZ3NdLnJmX3RlY2hfYW5kX21vZGUgPQorCQlOQ0lfTkZDX0JfUEFTU0lWRV9QT0xMX01PREU7CiAJCWNtZC5kaXNjX2NvbmZpZ3NbY21kLm51bV9kaXNjX2NvbmZpZ3NdLmZyZXF1ZW5jeSA9IDE7CiAJCWNtZC5udW1fZGlzY19jb25maWdzKys7CiAJfQpAQCAtMjA0LDggKzIwNSw4IEBACiAJaWYgKChjbWQubnVtX2Rpc2NfY29uZmlncyA8IE5DSV9NQVhfTlVNX1JGX0NPTkZJR1MpICYmCiAJCShwcm90b2NvbHMgJiBORkNfUFJPVE9fRkVMSUNBX01BU0sKIAkJfHwgcHJvdG9jb2xzICYgTkZDX1BST1RPX05GQ19ERVBfTUFTSykpIHsKLQkJY21kLmRpc2NfY29uZmlnc1tjbWQubnVtX2Rpc2NfY29uZmlnc10udHlwZSA9Ci0JCU5DSV9ESVNDT1ZFUllfVFlQRV9QT0xMX0ZfUEFTU0lWRTsKKwkJY21kLmRpc2NfY29uZmlnc1tjbWQubnVtX2Rpc2NfY29uZmlnc10ucmZfdGVjaF9hbmRfbW9kZSA9CisJCU5DSV9ORkNfRl9QQVNTSVZFX1BPTExfTU9ERTsKIAkJY21kLmRpc2NfY29uZmlnc1tjbWQubnVtX2Rpc2NfY29uZmlnc10uZnJlcXVlbmN5ID0gMTsKIAkJY21kLm51bV9kaXNjX2NvbmZpZ3MrKzsKIAl9CkBAIC0zMjYsOCArMzI3LDYgQEAKIHsKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9ICh2b2lkICopIGFyZzsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlhdG9taWNfc2V0KCZuZGV2LT5jbWRfY250LCAxKTsKIAlxdWV1ZV93b3JrKG5kZXYtPmNtZF93cSwgJm5kZXYtPmNtZF93b3JrKTsKIH0KQEAgLTMzNiw4ICszMzUsNiBAQAogewogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gbmZjX2dldF9kcnZkYXRhKG5mY19kZXYpOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCXJldHVybiBuY2lfb3Blbl9kZXZpY2UobmRldik7CiB9CiAKQEAgLTM0NSw4ICszNDIsNiBAQAogewogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gbmZjX2dldF9kcnZkYXRhKG5mY19kZXYpOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCXJldHVybiBuY2lfY2xvc2VfZGV2aWNlKG5kZXYpOwogfQogCkBAIC0zNTUsMjAgKzM1MCwxOCBAQAogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gbmZjX2dldF9kcnZkYXRhKG5mY19kZXYpOwogCWludCByYzsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAodGVzdF9iaXQoTkNJX0RJU0NPVkVSWSwgJm5kZXYtPmZsYWdzKSkgewotCQluZmNfZXJyKCJ1bmFibGUgdG8gc3RhcnQgcG9sbCwgc2luY2UgcG9sbCBpcyBhbHJlYWR5IGFjdGl2ZSIpOworCQlwcl9lcnIoInVuYWJsZSB0byBzdGFydCBwb2xsLCBzaW5jZSBwb2xsIGlzIGFscmVhZHkgYWN0aXZlXG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlpZiAobmRldi0+dGFyZ2V0X2FjdGl2ZV9wcm90KSB7Ci0JCW5mY19lcnIoInRoZXJlIGlzIGFuIGFjdGl2ZSB0YXJnZXQiKTsKKwkJcHJfZXJyKCJ0aGVyZSBpcyBhbiBhY3RpdmUgdGFyZ2V0XG4iKTsKIAkJcmV0dXJuIC1FQlVTWTsKIAl9CiAKIAlpZiAodGVzdF9iaXQoTkNJX1BPTExfQUNUSVZFLCAmbmRldi0+ZmxhZ3MpKSB7Ci0JCW5mY19kYmcoInRhcmdldCBpcyBhY3RpdmUsIGltcGxpY2l0bHkgZGVhY3RpdmF0ZS4uLiIpOworCQlwcl9kZWJ1ZygidGFyZ2V0IGlzIGFjdGl2ZSwgaW1wbGljaXRseSBkZWFjdGl2YXRlLi4uXG4iKTsKIAogCQlyYyA9IG5jaV9yZXF1ZXN0KG5kZXYsIG5jaV9yZl9kZWFjdGl2YXRlX3JlcSwgMCwKIAkJCW1zZWNzX3RvX2ppZmZpZXMoTkNJX1JGX0RFQUNUSVZBVEVfVElNRU9VVCkpOwpAQCAtMzg5LDEwICszODIsOCBAQAogewogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gbmZjX2dldF9kcnZkYXRhKG5mY19kZXYpOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWlmICghdGVzdF9iaXQoTkNJX0RJU0NPVkVSWSwgJm5kZXYtPmZsYWdzKSkgewotCQluZmNfZXJyKCJ1bmFibGUgdG8gc3RvcCBwb2xsLCBzaW5jZSBwb2xsIGlzIG5vdCBhY3RpdmUiKTsKKwkJcHJfZXJyKCJ1bmFibGUgdG8gc3RvcCBwb2xsLCBzaW5jZSBwb2xsIGlzIG5vdCBhY3RpdmVcbiIpOwogCQlyZXR1cm47CiAJfQogCkBAIC00MDUsMjEgKzM5NiwyMSBAQAogewogCXN0cnVjdCBuY2lfZGV2ICpuZGV2ID0gbmZjX2dldF9kcnZkYXRhKG5mY19kZXYpOwogCi0JbmZjX2RiZygiZW50cnksIHRhcmdldF9pZHggJWQsIHByb3RvY29sIDB4JXgiLCB0YXJnZXRfaWR4LCBwcm90b2NvbCk7CisJcHJfZGVidWcoInRhcmdldF9pZHggJWQsIHByb3RvY29sIDB4JXhcbiIsIHRhcmdldF9pZHgsIHByb3RvY29sKTsKIAogCWlmICghdGVzdF9iaXQoTkNJX1BPTExfQUNUSVZFLCAmbmRldi0+ZmxhZ3MpKSB7Ci0JCW5mY19lcnIoInRoZXJlIGlzIG5vIGF2YWlsYWJsZSB0YXJnZXQgdG8gYWN0aXZhdGUiKTsKKwkJcHJfZXJyKCJ0aGVyZSBpcyBubyBhdmFpbGFibGUgdGFyZ2V0IHRvIGFjdGl2YXRlXG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCiAJaWYgKG5kZXYtPnRhcmdldF9hY3RpdmVfcHJvdCkgewotCQluZmNfZXJyKCJ0aGVyZSBpcyBhbHJlYWR5IGFuIGFjdGl2ZSB0YXJnZXQiKTsKKwkJcHJfZXJyKCJ0aGVyZSBpcyBhbHJlYWR5IGFuIGFjdGl2ZSB0YXJnZXRcbiIpOwogCQlyZXR1cm4gLUVCVVNZOwogCX0KIAogCWlmICghKG5kZXYtPnRhcmdldF9hdmFpbGFibGVfcHJvdHMgJiAoMSA8PCBwcm90b2NvbCkpKSB7Ci0JCW5mY19lcnIoInRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgcHJvdG9jb2wgMHgleCIsCi0JCQlwcm90b2NvbCk7CisJCXByX2VycigidGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBwcm90b2NvbCAweCV4XG4iLAorCQkgICAgICAgcHJvdG9jb2wpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CiAKQEAgLTQzMywxMCArNDI0LDEwIEBACiB7CiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSBuZmNfZ2V0X2RydmRhdGEobmZjX2Rldik7CiAKLQluZmNfZGJnKCJlbnRyeSwgdGFyZ2V0X2lkeCAlZCIsIHRhcmdldF9pZHgpOworCXByX2RlYnVnKCJ0YXJnZXRfaWR4ICVkXG4iLCB0YXJnZXRfaWR4KTsKIAogCWlmICghbmRldi0+dGFyZ2V0X2FjdGl2ZV9wcm90KSB7Ci0JCW5mY19lcnIoInVuYWJsZSB0byBkZWFjdGl2YXRlIHRhcmdldCwgbm8gYWN0aXZlIHRhcmdldCIpOworCQlwcl9lcnIoInVuYWJsZSB0byBkZWFjdGl2YXRlIHRhcmdldCwgbm8gYWN0aXZlIHRhcmdldFxuIik7CiAJCXJldHVybjsKIAl9CiAKQEAgLTQ1NiwxMCArNDQ3LDEwIEBACiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSBuZmNfZ2V0X2RydmRhdGEobmZjX2Rldik7CiAJaW50IHJjOwogCi0JbmZjX2RiZygiZW50cnksIHRhcmdldF9pZHggJWQsIGxlbiAlZCIsIHRhcmdldF9pZHgsIHNrYi0+bGVuKTsKKwlwcl9kZWJ1ZygidGFyZ2V0X2lkeCAlZCwgbGVuICVkXG4iLCB0YXJnZXRfaWR4LCBza2ItPmxlbik7CiAKIAlpZiAoIW5kZXYtPnRhcmdldF9hY3RpdmVfcHJvdCkgewotCQluZmNfZXJyKCJ1bmFibGUgdG8gZXhjaGFuZ2UgZGF0YSwgbm8gYWN0aXZlIHRhcmdldCIpOworCQlwcl9lcnIoInVuYWJsZSB0byBleGNoYW5nZSBkYXRhLCBubyBhY3RpdmUgdGFyZ2V0XG4iKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC00NzAsNyArNDYxLDcgQEAKIAluZGV2LT5kYXRhX2V4Y2hhbmdlX2NiID0gY2I7CiAJbmRldi0+ZGF0YV9leGNoYW5nZV9jYl9jb250ZXh0ID0gY2JfY29udGV4dDsKIAotCXJjID0gbmNpX3NlbmRfZGF0YShuZGV2LCBuZGV2LT5jb25uX2lkLCBza2IpOworCXJjID0gbmNpX3NlbmRfZGF0YShuZGV2LCBOQ0lfU1RBVElDX1JGX0NPTk5fSUQsIHNrYik7CiAJaWYgKHJjKQogCQljbGVhcl9iaXQoTkNJX0RBVEFfRVhDSEFOR0UsICZuZGV2LT5mbGFncyk7CiAKQEAgLTUwMiw3ICs0OTMsNyBAQAogewogCXN0cnVjdCBuY2lfZGV2ICpuZGV2OwogCi0JbmZjX2RiZygiZW50cnksIHN1cHBvcnRlZF9wcm90b2NvbHMgMHgleCIsIHN1cHBvcnRlZF9wcm90b2NvbHMpOworCXByX2RlYnVnKCJzdXBwb3J0ZWRfcHJvdG9jb2xzIDB4JXhcbiIsIHN1cHBvcnRlZF9wcm90b2NvbHMpOwogCiAJaWYgKCFvcHMtPm9wZW4gfHwgIW9wcy0+Y2xvc2UgfHwgIW9wcy0+c2VuZCkKIAkJcmV0dXJuIE5VTEw7CkBAIC01NDIsOCArNTMzLDYgQEAKICAqLwogdm9pZCBuY2lfZnJlZV9kZXZpY2Uoc3RydWN0IG5jaV9kZXYgKm5kZXYpCiB7Ci0JbmZjX2RiZygiZW50cnkiKTsKLQogCW5mY19mcmVlX2RldmljZShuZGV2LT5uZmNfZGV2KTsKIAlrZnJlZShuZGV2KTsKIH0KQEAgLTU2MCw4ICs1NDksNiBAQAogCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZuZGV2LT5uZmNfZGV2LT5kZXY7CiAJY2hhciBuYW1lWzMyXTsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlyYyA9IG5mY19yZWdpc3Rlcl9kZXZpY2UobmRldi0+bmZjX2Rldik7CiAJaWYgKHJjKQogCQlnb3RvIGV4aXQ7CkBAIC02MjQsOCArNjExLDYgQEAKICAqLwogdm9pZCBuY2lfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG5jaV9kZXYgKm5kZXYpCiB7Ci0JbmZjX2RiZygiZW50cnkiKTsKLQogCW5jaV9jbG9zZV9kZXZpY2UobmRldik7CiAKIAlkZXN0cm95X3dvcmtxdWV1ZShuZGV2LT5jbWRfd3EpOwpAQCAtNjQ1LDcgKzYzMCw3IEBACiB7CiAJc3RydWN0IG5jaV9kZXYgKm5kZXYgPSAoc3RydWN0IG5jaV9kZXYgKikgc2tiLT5kZXY7CiAKLQluZmNfZGJnKCJlbnRyeSwgbGVuICVkIiwgc2tiLT5sZW4pOworCXByX2RlYnVnKCJsZW4gJWRcbiIsIHNrYi0+bGVuKTsKIAogCWlmICghbmRldiB8fCAoIXRlc3RfYml0KE5DSV9VUCwgJm5kZXYtPmZsYWdzKQogCQkmJiAhdGVzdF9iaXQoTkNJX0lOSVQsICZuZGV2LT5mbGFncykpKSB7CkBAIC02NjUsNyArNjUwLDcgQEAKIHsKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IChzdHJ1Y3QgbmNpX2RldiAqKSBza2ItPmRldjsKIAotCW5mY19kYmcoImVudHJ5LCBsZW4gJWQiLCBza2ItPmxlbik7CisJcHJfZGVidWcoImxlbiAlZFxuIiwgc2tiLT5sZW4pOwogCiAJaWYgKCFuZGV2KSB7CiAJCWtmcmVlX3NrYihza2IpOwpAQCAtNjg0LDExICs2NjksMTEgQEAKIAlzdHJ1Y3QgbmNpX2N0cmxfaGRyICpoZHI7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCW5mY19kYmcoImVudHJ5LCBvcGNvZGUgMHgleCwgcGxlbiAlZCIsIG9wY29kZSwgcGxlbik7CisJcHJfZGVidWcoIm9wY29kZSAweCV4LCBwbGVuICVkXG4iLCBvcGNvZGUsIHBsZW4pOwogCiAJc2tiID0gbmNpX3NrYl9hbGxvYyhuZGV2LCAoTkNJX0NUUkxfSERSX1NJWkUgKyBwbGVuKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFza2IpIHsKLQkJbmZjX2Vycigibm8gbWVtb3J5IGZvciBjb21tYW5kIik7CisJCXByX2Vycigibm8gbWVtb3J5IGZvciBjb21tYW5kXG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC03MTgsNyArNzAzLDcgQEAKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmNpX2RldiwgdHhfd29yayk7CiAJc3RydWN0IHNrX2J1ZmYgKnNrYjsKIAotCW5mY19kYmcoImVudHJ5LCBjcmVkaXRzX2NudCAlZCIsIGF0b21pY19yZWFkKCZuZGV2LT5jcmVkaXRzX2NudCkpOworCXByX2RlYnVnKCJjcmVkaXRzX2NudCAlZFxuIiwgYXRvbWljX3JlYWQoJm5kZXYtPmNyZWRpdHNfY250KSk7CiAKIAkvKiBTZW5kIHF1ZXVlZCB0eCBkYXRhICovCiAJd2hpbGUgKGF0b21pY19yZWFkKCZuZGV2LT5jcmVkaXRzX2NudCkpIHsKQEAgLTcyNiwxMiArNzExLDE1IEBACiAJCWlmICghc2tiKQogCQkJcmV0dXJuOwogCi0JCWF0b21pY19kZWMoJm5kZXYtPmNyZWRpdHNfY250KTsKKwkJLyogQ2hlY2sgaWYgZGF0YSBmbG93IGNvbnRyb2wgaXMgdXNlZCAqLworCQlpZiAoYXRvbWljX3JlYWQoJm5kZXYtPmNyZWRpdHNfY250KSAhPQorCQkJCU5DSV9EQVRBX0ZMT1dfQ09OVFJPTF9OT1RfVVNFRCkKKwkJCWF0b21pY19kZWMoJm5kZXYtPmNyZWRpdHNfY250KTsKIAotCQluZmNfZGJnKCJOQ0kgVFg6IE1UPWRhdGEsIFBCRj0lZCwgY29ubl9pZD0lZCwgcGxlbj0lZCIsCi0JCQkJbmNpX3BiZihza2ItPmRhdGEpLAotCQkJCW5jaV9jb25uX2lkKHNrYi0+ZGF0YSksCi0JCQkJbmNpX3BsZW4oc2tiLT5kYXRhKSk7CisJCXByX2RlYnVnKCJOQ0kgVFg6IE1UPWRhdGEsIFBCRj0lZCwgY29ubl9pZD0lZCwgcGxlbj0lZFxuIiwKKwkJCSBuY2lfcGJmKHNrYi0+ZGF0YSksCisJCQkgbmNpX2Nvbm5faWQoc2tiLT5kYXRhKSwKKwkJCSBuY2lfcGxlbihza2ItPmRhdGEpKTsKIAogCQluY2lfc2VuZF9mcmFtZShza2IpOwogCX0KQEAgLTc2MCw3ICs3NDgsNyBAQAogCQkJYnJlYWs7CiAKIAkJZGVmYXVsdDoKLQkJCW5mY19lcnIoInVua25vd24gTVQgMHgleCIsIG5jaV9tdChza2ItPmRhdGEpKTsKKwkJCXByX2VycigidW5rbm93biBNVCAweCV4XG4iLCBuY2lfbXQoc2tiLT5kYXRhKSk7CiAJCQlrZnJlZV9za2Ioc2tiKTsKIAkJCWJyZWFrOwogCQl9CkBAIC03NzQsNyArNzYyLDcgQEAKIAlzdHJ1Y3QgbmNpX2RldiAqbmRldiA9IGNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbmNpX2RldiwgY21kX3dvcmspOwogCXN0cnVjdCBza19idWZmICpza2I7CiAKLQluZmNfZGJnKCJlbnRyeSwgY21kX2NudCAlZCIsIGF0b21pY19yZWFkKCZuZGV2LT5jbWRfY250KSk7CisJcHJfZGVidWcoImNtZF9jbnQgJWRcbiIsIGF0b21pY19yZWFkKCZuZGV2LT5jbWRfY250KSk7CiAKIAkvKiBTZW5kIHF1ZXVlZCBjb21tYW5kICovCiAJaWYgKGF0b21pY19yZWFkKCZuZGV2LT5jbWRfY250KSkgewpAQCAtNzg0LDExICs3NzIsMTEgQEAKIAogCQlhdG9taWNfZGVjKCZuZGV2LT5jbWRfY250KTsKIAotCQluZmNfZGJnKCJOQ0kgVFg6IE1UPWNtZCwgUEJGPSVkLCBHSUQ9MHgleCwgT0lEPTB4JXgsIHBsZW49JWQiLAotCQkJCW5jaV9wYmYoc2tiLT5kYXRhKSwKLQkJCQluY2lfb3Bjb2RlX2dpZChuY2lfb3Bjb2RlKHNrYi0+ZGF0YSkpLAotCQkJCW5jaV9vcGNvZGVfb2lkKG5jaV9vcGNvZGUoc2tiLT5kYXRhKSksCi0JCQkJbmNpX3BsZW4oc2tiLT5kYXRhKSk7CisJCXByX2RlYnVnKCJOQ0kgVFg6IE1UPWNtZCwgUEJGPSVkLCBHSUQ9MHgleCwgT0lEPTB4JXgsIHBsZW49JWRcbiIsCisJCQkgbmNpX3BiZihza2ItPmRhdGEpLAorCQkJIG5jaV9vcGNvZGVfZ2lkKG5jaV9vcGNvZGUoc2tiLT5kYXRhKSksCisJCQkgbmNpX29wY29kZV9vaWQobmNpX29wY29kZShza2ItPmRhdGEpKSwKKwkJCSBuY2lfcGxlbihza2ItPmRhdGEpKTsKIAogCQluY2lfc2VuZF9mcmFtZShza2IpOwogCmRpZmYgLS1naXQgYS9uZXQvbmZjL25jaS9kYXRhLmMgYi9uZXQvbmZjL25jaS9kYXRhLmMKaW5kZXggZTVlZDkwZi4uZTU3NTZiMyAxMDA2NDQKLS0tIGEvbmV0L25mYy9uY2kvZGF0YS5jCisrKyBiL25ldC9uZmMvbmNpL2RhdGEuYwpAQCAtMjEsNiArMjEsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICVzOiAiIGZtdCwgX19mdW5jX18KKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgpAQCAtNDAsNyArNDIsNyBAQAogCWRhdGFfZXhjaGFuZ2VfY2JfdCBjYiA9IG5kZXYtPmRhdGFfZXhjaGFuZ2VfY2I7CiAJdm9pZCAqY2JfY29udGV4dCA9IG5kZXYtPmRhdGFfZXhjaGFuZ2VfY2JfY29udGV4dDsKIAotCW5mY19kYmcoImVudHJ5LCBsZW4gJWQsIGVyciAlZCIsICgoc2tiKSA/IChza2ItPmxlbikgOiAoMCkpLCBlcnIpOworCXByX2RlYnVnKCJsZW4gJWQsIGVyciAlZFxuIiwgc2tiID8gc2tiLT5sZW4gOiAwLCBlcnIpOwogCiAJaWYgKGNiKSB7CiAJCW5kZXYtPmRhdGFfZXhjaGFuZ2VfY2IgPSBOVUxMOwpAQCAtNDksNyArNTEsNyBAQAogCQkvKiBmb3J3YXJkIHNrYiB0byBuZmMgY29yZSAqLwogCQljYihjYl9jb250ZXh0LCBza2IsIGVycik7CiAJfSBlbHNlIGlmIChza2IpIHsKLQkJbmZjX2Vycigibm8gcnggY2FsbGJhY2ssIGRyb3BwaW5nIHJ4IGRhdGEuLi4iKTsKKwkJcHJfZXJyKCJubyByeCBjYWxsYmFjaywgZHJvcHBpbmcgcnggZGF0YS4uLlxuIik7CiAKIAkJLyogbm8gd2FpdGluZyBjYWxsYmFjaywgZnJlZSBza2IgKi8KIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC05MCwxMiArOTIsMTMgQEAKIAlpbnQgZnJhZ19sZW47CiAJaW50IHJjID0gMDsKIAotCW5mY19kYmcoImVudHJ5LCBjb25uX2lkIDB4JXgsIHRvdGFsX2xlbiAlZCIsIGNvbm5faWQsIHRvdGFsX2xlbik7CisJcHJfZGVidWcoImNvbm5faWQgMHgleCwgdG90YWxfbGVuICVkXG4iLCBjb25uX2lkLCB0b3RhbF9sZW4pOwogCiAJX19za2JfcXVldWVfaGVhZF9pbml0KCZmcmFnc19xKTsKIAogCXdoaWxlICh0b3RhbF9sZW4pIHsKLQkJZnJhZ19sZW4gPSBtaW5fdChpbnQsIHRvdGFsX2xlbiwgbmRldi0+bWF4X3BrdF9wYXlsb2FkX3NpemUpOworCQlmcmFnX2xlbiA9CisJCQltaW5fdChpbnQsIHRvdGFsX2xlbiwgbmRldi0+bWF4X2RhdGFfcGt0X3BheWxvYWRfc2l6ZSk7CiAKIAkJc2tiX2ZyYWcgPSBuY2lfc2tiX2FsbG9jKG5kZXYsCiAJCQkJCShOQ0lfREFUQV9IRFJfU0laRSArIGZyYWdfbGVuKSwKQEAgLTExOCw4ICsxMjEsOCBAQAogCQlkYXRhICs9IGZyYWdfbGVuOwogCQl0b3RhbF9sZW4gLT0gZnJhZ19sZW47CiAKLQkJbmZjX2RiZygiZnJhZ19sZW4gJWQsIHJlbWFpbmluZyB0b3RhbF9sZW4gJWQiLAotCQkJZnJhZ19sZW4sIHRvdGFsX2xlbik7CisJCXByX2RlYnVnKCJmcmFnX2xlbiAlZCwgcmVtYWluaW5nIHRvdGFsX2xlbiAlZFxuIiwKKwkJCSBmcmFnX2xlbiwgdG90YWxfbGVuKTsKIAl9CiAKIAkvKiBxdWV1ZSBhbGwgZnJhZ21lbnRzIGF0b21pY2FsbHkgKi8KQEAgLTE0OCwxMCArMTUxLDEwIEBACiB7CiAJaW50IHJjID0gMDsKIAotCW5mY19kYmcoImVudHJ5LCBjb25uX2lkIDB4JXgsIHBsZW4gJWQiLCBjb25uX2lkLCBza2ItPmxlbik7CisJcHJfZGVidWcoImNvbm5faWQgMHgleCwgcGxlbiAlZFxuIiwgY29ubl9pZCwgc2tiLT5sZW4pOwogCiAJLyogY2hlY2sgaWYgdGhlIHBhY2tldCBuZWVkIHRvIGJlIGZyYWdtZW50ZWQgKi8KLQlpZiAoc2tiLT5sZW4gPD0gbmRldi0+bWF4X3BrdF9wYXlsb2FkX3NpemUpIHsKKwlpZiAoc2tiLT5sZW4gPD0gbmRldi0+bWF4X2RhdGFfcGt0X3BheWxvYWRfc2l6ZSkgewogCQkvKiBubyBuZWVkIHRvIGZyYWdtZW50IHBhY2tldCAqLwogCQluY2lfcHVzaF9kYXRhX2hkcihuZGV2LCBjb25uX2lkLCBza2IsIE5DSV9QQkZfTEFTVCk7CiAKQEAgLTE2MCw3ICsxNjMsNyBAQAogCQkvKiBmcmFnbWVudCBwYWNrZXQgYW5kIHF1ZXVlIHRoZSBmcmFnbWVudHMgKi8KIAkJcmMgPSBuY2lfcXVldWVfdHhfZGF0YV9mcmFncyhuZGV2LCBjb25uX2lkLCBza2IpOwogCQlpZiAocmMpIHsKLQkJCW5mY19lcnIoImZhaWxlZCB0byBmcmFnbWVudCB0eCBkYXRhIHBhY2tldCIpOworCQkJcHJfZXJyKCJmYWlsZWQgdG8gZnJhZ21lbnQgdHggZGF0YSBwYWNrZXRcbiIpOwogCQkJZ290byBmcmVlX2V4aXQ7CiAJCX0KIAl9CkBAIC0xOTAsNyArMTkzLDcgQEAKIAogCQkvKiBmaXJzdCwgbWFrZSBlbm91Z2ggcm9vbSBmb3IgdGhlIGFscmVhZHkgYWNjdW11bGF0ZWQgZGF0YSAqLwogCQlpZiAoc2tiX2Nvd19oZWFkKHNrYiwgcmVhc3NlbWJseV9sZW4pKSB7Ci0JCQluZmNfZXJyKCJlcnJvciBhZGRpbmcgcm9vbSBmb3IgYWNjdW11bGF0ZWQgcnggZGF0YSIpOworCQkJcHJfZXJyKCJlcnJvciBhZGRpbmcgcm9vbSBmb3IgYWNjdW11bGF0ZWQgcnggZGF0YVxuIik7CiAKIAkJCWtmcmVlX3NrYihza2IpOwogCQkJc2tiID0gMDsKQEAgLTIyNywxOSArMjMwLDE5IEBACiB7CiAJX191OCBwYmYgPSBuY2lfcGJmKHNrYi0+ZGF0YSk7CiAKLQluZmNfZGJnKCJlbnRyeSwgbGVuICVkIiwgc2tiLT5sZW4pOworCXByX2RlYnVnKCJsZW4gJWRcbiIsIHNrYi0+bGVuKTsKIAotCW5mY19kYmcoIk5DSSBSWDogTVQ9ZGF0YSwgUEJGPSVkLCBjb25uX2lkPSVkLCBwbGVuPSVkIiwKLQkJCW5jaV9wYmYoc2tiLT5kYXRhKSwKLQkJCW5jaV9jb25uX2lkKHNrYi0+ZGF0YSksCi0JCQluY2lfcGxlbihza2ItPmRhdGEpKTsKKwlwcl9kZWJ1ZygiTkNJIFJYOiBNVD1kYXRhLCBQQkY9JWQsIGNvbm5faWQ9JWQsIHBsZW49JWRcbiIsCisJCSBuY2lfcGJmKHNrYi0+ZGF0YSksCisJCSBuY2lfY29ubl9pZChza2ItPmRhdGEpLAorCQkgbmNpX3BsZW4oc2tiLT5kYXRhKSk7CiAKIAkvKiBzdHJpcCB0aGUgbmNpIGRhdGEgaGVhZGVyICovCiAJc2tiX3B1bGwoc2tiLCBOQ0lfREFUQV9IRFJfU0laRSk7CiAKIAlpZiAobmRldi0+dGFyZ2V0X2FjdGl2ZV9wcm90ID09IE5GQ19QUk9UT19NSUZBUkUpIHsKIAkJLyogZnJhbWUgSS9GID0+IHJlbW92ZSB0aGUgc3RhdHVzIGJ5dGUgKi8KLQkJbmZjX2RiZygiTkZDX1BST1RPX01JRkFSRSA9PiByZW1vdmUgdGhlIHN0YXR1cyBieXRlIik7CisJCXByX2RlYnVnKCJORkNfUFJPVE9fTUlGQVJFID0+IHJlbW92ZSB0aGUgc3RhdHVzIGJ5dGVcbiIpOwogCQlza2JfdHJpbShza2IsIChza2ItPmxlbiAtIDEpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9uZmMvbmNpL2xpYi5jIGIvbmV0L25mYy9uY2kvbGliLmMKaW5kZXggYjE5ZGMyZi4uNmE2M2U1ZSAxMDA2NDQKLS0tIGEvbmV0L25mYy9uY2kvbGliLmMKKysrIGIvbmV0L25mYy9uY2kvbGliLmMKQEAgLTQyLDEyICs0Miw5IEBACiAJY2FzZSBOQ0lfU1RBVFVTX1JFSkVDVEVEOgogCQlyZXR1cm4gLUVCVVNZOwogCi0JY2FzZSBOQ0lfU1RBVFVTX01FU1NBR0VfQ09SUlVQVEVEOgorCWNhc2UgTkNJX1NUQVRVU19SRl9GUkFNRV9DT1JSVVBURUQ6CiAJCXJldHVybiAtRUJBRE1TRzsKIAotCWNhc2UgTkNJX1NUQVRVU19CVUZGRVJfRlVMTDoKLQkJcmV0dXJuIC1FTk9CVUZTOwotCiAJY2FzZSBOQ0lfU1RBVFVTX05PVF9JTklUSUFMSVpFRDoKIAkJcmV0dXJuIC1FSE9TVERPV047CiAKQEAgLTgwLDEyICs3Nyw2IEBACiAJY2FzZSBOQ0lfU1RBVFVTX05GQ0VFX1RJTUVPVVRfRVJST1I6CiAJCXJldHVybiAtRVRJTUVET1VUOwogCi0JY2FzZSBOQ0lfU1RBVFVTX1JGX0xJTktfTE9TU19FUlJPUjoKLQkJcmV0dXJuIC1FTk9MSU5LOwotCi0JY2FzZSBOQ0lfU1RBVFVTX01BWF9BQ1RJVkVfTkZDRUVfSU5URVJGQUNFU19SRUFDSEVEOgotCQlyZXR1cm4gLUVEUVVPVDsKLQogCWNhc2UgTkNJX1NUQVRVU19GQUlMRUQ6CiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9TWVM7CmRpZmYgLS1naXQgYS9uZXQvbmZjL25jaS9udGYuYyBiL25ldC9uZmMvbmNpL250Zi5jCmluZGV4IDk2NjMzZjUuLmIxNmE4ZGMgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvbmNpL250Zi5jCisrKyBiL25ldC9uZmMvbmNpL250Zi5jCkBAIC0yNSw2ICsyNSw4IEBACiAgKgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogJXM6ICIgZm10LCBfX2Z1bmNfXworCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KQEAgLTQzLDE4ICs0NSwyMSBAQAogCXN0cnVjdCBuY2lfY29yZV9jb25uX2NyZWRpdF9udGYgKm50ZiA9ICh2b2lkICopIHNrYi0+ZGF0YTsKIAlpbnQgaTsKIAotCW5mY19kYmcoImVudHJ5LCBudW1fZW50cmllcyAlZCIsIG50Zi0+bnVtX2VudHJpZXMpOworCXByX2RlYnVnKCJudW1fZW50cmllcyAlZFxuIiwgbnRmLT5udW1fZW50cmllcyk7CiAKIAlpZiAobnRmLT5udW1fZW50cmllcyA+IE5DSV9NQVhfTlVNX0NPTk4pCiAJCW50Zi0+bnVtX2VudHJpZXMgPSBOQ0lfTUFYX05VTV9DT05OOwogCiAJLyogdXBkYXRlIHRoZSBjcmVkaXRzICovCiAJZm9yIChpID0gMDsgaSA8IG50Zi0+bnVtX2VudHJpZXM7IGkrKykgewotCQluZmNfZGJnKCJlbnRyeVslZF06IGNvbm5faWQgJWQsIGNyZWRpdHMgJWQiLCBpLAotCQkJbnRmLT5jb25uX2VudHJpZXNbaV0uY29ubl9pZCwKLQkJCW50Zi0+Y29ubl9lbnRyaWVzW2ldLmNyZWRpdHMpOworCQludGYtPmNvbm5fZW50cmllc1tpXS5jb25uX2lkID0KKwkJCW5jaV9jb25uX2lkKCZudGYtPmNvbm5fZW50cmllc1tpXS5jb25uX2lkKTsKIAotCQlpZiAobnRmLT5jb25uX2VudHJpZXNbaV0uY29ubl9pZCA9PSBuZGV2LT5jb25uX2lkKSB7CisJCXByX2RlYnVnKCJlbnRyeVslZF06IGNvbm5faWQgJWQsIGNyZWRpdHMgJWRcbiIsCisJCQkgaSwgbnRmLT5jb25uX2VudHJpZXNbaV0uY29ubl9pZCwKKwkJCSBudGYtPmNvbm5fZW50cmllc1tpXS5jcmVkaXRzKTsKKworCQlpZiAobnRmLT5jb25uX2VudHJpZXNbaV0uY29ubl9pZCA9PSBOQ0lfU1RBVElDX1JGX0NPTk5fSUQpIHsKIAkJCS8qIGZvdW5kIHN0YXRpYyByZiBjb25uZWN0aW9uICovCiAJCQlhdG9taWNfYWRkKG50Zi0+Y29ubl9lbnRyaWVzW2ldLmNyZWRpdHMsCiAJCQkJJm5kZXYtPmNyZWRpdHNfY250KTsKQEAgLTY2LDMxICs3MSwzNCBAQAogCQlxdWV1ZV93b3JrKG5kZXYtPnR4X3dxLCAmbmRldi0+dHhfd29yayk7CiB9CiAKLXN0YXRpYyB2b2lkIG5jaV9yZl9maWVsZF9pbmZvX250Zl9wYWNrZXQoc3RydWN0IG5jaV9kZXYgKm5kZXYsCi0JCQkJCXN0cnVjdCBza19idWZmICpza2IpCitzdGF0aWMgdm9pZCBuY2lfY29yZV9jb25uX2ludGZfZXJyb3JfbnRmX3BhY2tldChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKKwkJCQkJCXN0cnVjdCBza19idWZmICpza2IpCiB7Ci0Jc3RydWN0IG5jaV9yZl9maWVsZF9pbmZvX250ZiAqbnRmID0gKHZvaWQgKikgc2tiLT5kYXRhOworCXN0cnVjdCBuY2lfY29yZV9pbnRmX2Vycm9yX250ZiAqbnRmID0gKHZvaWQgKikgc2tiLT5kYXRhOwogCi0JbmZjX2RiZygiZW50cnksIHJmX2ZpZWxkX3N0YXR1cyAlZCIsIG50Zi0+cmZfZmllbGRfc3RhdHVzKTsKKwludGYtPmNvbm5faWQgPSBuY2lfY29ubl9pZCgmbnRmLT5jb25uX2lkKTsKKworCXByX2RlYnVnKCJzdGF0dXMgMHgleCwgY29ubl9pZCAlZFxuIiwgbnRmLT5zdGF0dXMsIG50Zi0+Y29ubl9pZCk7CisKKwkvKiBjb21wbGV0ZSB0aGUgZGF0YSBleGNoYW5nZSB0cmFuc2FjdGlvbiwgaWYgZXhpc3RzICovCisJaWYgKHRlc3RfYml0KE5DSV9EQVRBX0VYQ0hBTkdFLCAmbmRldi0+ZmxhZ3MpKQorCQluY2lfZGF0YV9leGNoYW5nZV9jb21wbGV0ZShuZGV2LCBOVUxMLCAtRUlPKTsKIH0KIAotc3RhdGljIGludCBuY2lfcmZfYWN0aXZhdGVfbmZjYV9wYXNzaXZlX3BvbGwoc3RydWN0IG5jaV9kZXYgKm5kZXYsCi0JCQlzdHJ1Y3QgbmNpX3JmX2FjdGl2YXRlX250ZiAqbnRmLCBfX3U4ICpkYXRhKQorc3RhdGljIF9fdTggKm5jaV9leHRyYWN0X3JmX3BhcmFtc19uZmNhX3Bhc3NpdmVfcG9sbChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKKwkJCXN0cnVjdCBuY2lfcmZfaW50Zl9hY3RpdmF0ZWRfbnRmICpudGYsIF9fdTggKmRhdGEpCiB7CiAJc3RydWN0IHJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX25mY2FfcG9sbCAqbmZjYV9wb2xsOwotCXN0cnVjdCBhY3RpdmF0aW9uX3BhcmFtc19uZmNhX3BvbGxfaXNvX2RlcCAqbmZjYV9wb2xsX2lzb19kZXA7CiAKIAluZmNhX3BvbGwgPSAmbnRmLT5yZl90ZWNoX3NwZWNpZmljX3BhcmFtcy5uZmNhX3BvbGw7Ci0JbmZjYV9wb2xsX2lzb19kZXAgPSAmbnRmLT5hY3RpdmF0aW9uX3BhcmFtcy5uZmNhX3BvbGxfaXNvX2RlcDsKIAogCW5mY2FfcG9sbC0+c2Vuc19yZXMgPSBfX2xlMTZfdG9fY3B1KCooKF9fdTE2ICopZGF0YSkpOwogCWRhdGEgKz0gMjsKIAogCW5mY2FfcG9sbC0+bmZjaWQxX2xlbiA9ICpkYXRhKys7CiAKLQluZmNfZGJnKCJzZW5zX3JlcyAweCV4LCBuZmNpZDFfbGVuICVkIiwKLQkJbmZjYV9wb2xsLT5zZW5zX3JlcywKLQkJbmZjYV9wb2xsLT5uZmNpZDFfbGVuKTsKKwlwcl9kZWJ1Zygic2Vuc19yZXMgMHgleCwgbmZjaWQxX2xlbiAlZFxuIiwKKwkJIG5mY2FfcG9sbC0+c2Vuc19yZXMsIG5mY2FfcG9sbC0+bmZjaWQxX2xlbik7CiAKIAltZW1jcHkobmZjYV9wb2xsLT5uZmNpZDEsIGRhdGEsIG5mY2FfcG9sbC0+bmZjaWQxX2xlbik7CiAJZGF0YSArPSBuZmNhX3BvbGwtPm5mY2lkMV9sZW47CkBAIC0xMDAsMzIgKzEwOCwzMiBAQAogCWlmIChuZmNhX3BvbGwtPnNlbF9yZXNfbGVuICE9IDApCiAJCW5mY2FfcG9sbC0+c2VsX3JlcyA9ICpkYXRhKys7CiAKLQludGYtPnJmX2ludGVyZmFjZV90eXBlID0gKmRhdGErKzsKLQludGYtPmFjdGl2YXRpb25fcGFyYW1zX2xlbiA9ICpkYXRhKys7CisJcHJfZGVidWcoInNlbF9yZXNfbGVuICVkLCBzZWxfcmVzIDB4JXhcbiIsCisJCSBuZmNhX3BvbGwtPnNlbF9yZXNfbGVuLAorCQkgbmZjYV9wb2xsLT5zZWxfcmVzKTsKIAotCW5mY19kYmcoInNlbF9yZXNfbGVuICVkLCBzZWxfcmVzIDB4JXgsIHJmX2ludGVyZmFjZV90eXBlICVkLCBhY3RpdmF0aW9uX3BhcmFtc19sZW4gJWQiLAotCQluZmNhX3BvbGwtPnNlbF9yZXNfbGVuLAotCQluZmNhX3BvbGwtPnNlbF9yZXMsCi0JCW50Zi0+cmZfaW50ZXJmYWNlX3R5cGUsCi0JCW50Zi0+YWN0aXZhdGlvbl9wYXJhbXNfbGVuKTsKKwlyZXR1cm4gZGF0YTsKK30KIAotCXN3aXRjaCAobnRmLT5yZl9pbnRlcmZhY2VfdHlwZSkgewotCWNhc2UgTkNJX1JGX0lOVEVSRkFDRV9JU09fREVQOgotCQluZmNhX3BvbGxfaXNvX2RlcC0+cmF0c19yZXNfbGVuID0gKmRhdGErKzsKLQkJaWYgKG5mY2FfcG9sbF9pc29fZGVwLT5yYXRzX3Jlc19sZW4gPiAwKSB7Ci0JCQltZW1jcHkobmZjYV9wb2xsX2lzb19kZXAtPnJhdHNfcmVzLAorc3RhdGljIGludCBuY2lfZXh0cmFjdF9hY3RpdmF0aW9uX3BhcmFtc19pc29fZGVwKHN0cnVjdCBuY2lfZGV2ICpuZGV2LAorCQkJc3RydWN0IG5jaV9yZl9pbnRmX2FjdGl2YXRlZF9udGYgKm50ZiwgX191OCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYWN0aXZhdGlvbl9wYXJhbXNfbmZjYV9wb2xsX2lzb19kZXAgKm5mY2FfcG9sbDsKKworCXN3aXRjaCAobnRmLT5hY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUpIHsKKwljYXNlIE5DSV9ORkNfQV9QQVNTSVZFX1BPTExfTU9ERToKKwkJbmZjYV9wb2xsID0gJm50Zi0+YWN0aXZhdGlvbl9wYXJhbXMubmZjYV9wb2xsX2lzb19kZXA7CisJCW5mY2FfcG9sbC0+cmF0c19yZXNfbGVuID0gKmRhdGErKzsKKwkJaWYgKG5mY2FfcG9sbC0+cmF0c19yZXNfbGVuID4gMCkgeworCQkJbWVtY3B5KG5mY2FfcG9sbC0+cmF0c19yZXMsCiAJCQkJZGF0YSwKLQkJCQluZmNhX3BvbGxfaXNvX2RlcC0+cmF0c19yZXNfbGVuKTsKKwkJCQluZmNhX3BvbGwtPnJhdHNfcmVzX2xlbik7CiAJCX0KIAkJYnJlYWs7CiAKLQljYXNlIE5DSV9SRl9JTlRFUkZBQ0VfRlJBTUU6Ci0JCS8qIG5vIGFjdGl2YXRpb24gcGFyYW1zICovCi0JCWJyZWFrOwotCiAJZGVmYXVsdDoKLQkJbmZjX2VycigidW5zdXBwb3J0ZWQgcmZfaW50ZXJmYWNlX3R5cGUgMHgleCIsCi0JCQludGYtPnJmX2ludGVyZmFjZV90eXBlKTsKKwkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBhY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUgMHgleFxuIiwKKwkJICAgICAgIG50Zi0+YWN0aXZhdGlvbl9yZl90ZWNoX2FuZF9tb2RlKTsKIAkJcmV0dXJuIC1FUFJPVE87CiAJfQogCkBAIC0xMzMsNyArMTQxLDcgQEAKIH0KIAogc3RhdGljIHZvaWQgbmNpX3RhcmdldF9mb3VuZChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKLQkJCQlzdHJ1Y3QgbmNpX3JmX2FjdGl2YXRlX250ZiAqbnRmKQorCQkJCXN0cnVjdCBuY2lfcmZfaW50Zl9hY3RpdmF0ZWRfbnRmICpudGYpCiB7CiAJc3RydWN0IG5mY190YXJnZXQgbmZjX3RndDsKIApAQCAtMTQxLDY2ICsxNDksMTIxIEBACiAJCW5mY190Z3Quc3VwcG9ydGVkX3Byb3RvY29scyA9IE5GQ19QUk9UT19NSUZBUkVfTUFTSzsKIAllbHNlIGlmIChudGYtPnJmX3Byb3RvY29sID09IE5DSV9SRl9QUk9UT0NPTF9JU09fREVQKQkvKiA0QSAqLwogCQluZmNfdGd0LnN1cHBvcnRlZF9wcm90b2NvbHMgPSBORkNfUFJPVE9fSVNPMTQ0NDNfTUFTSzsKKwllbHNlCisJCW5mY190Z3Quc3VwcG9ydGVkX3Byb3RvY29scyA9IDA7CiAKIAluZmNfdGd0LnNlbnNfcmVzID0gbnRmLT5yZl90ZWNoX3NwZWNpZmljX3BhcmFtcy5uZmNhX3BvbGwuc2Vuc19yZXM7CiAJbmZjX3RndC5zZWxfcmVzID0gbnRmLT5yZl90ZWNoX3NwZWNpZmljX3BhcmFtcy5uZmNhX3BvbGwuc2VsX3JlczsKKwluZmNfdGd0Lm5mY2lkMV9sZW4gPSBudGYtPnJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zLm5mY2FfcG9sbC5uZmNpZDFfbGVuOworCWlmIChuZmNfdGd0Lm5mY2lkMV9sZW4gPiAwKSB7CisJCW1lbWNweShuZmNfdGd0Lm5mY2lkMSwKKwkJCW50Zi0+cmZfdGVjaF9zcGVjaWZpY19wYXJhbXMubmZjYV9wb2xsLm5mY2lkMSwKKwkJCW5mY190Z3QubmZjaWQxX2xlbik7CisJfQogCiAJaWYgKCEobmZjX3RndC5zdXBwb3J0ZWRfcHJvdG9jb2xzICYgbmRldi0+cG9sbF9wcm90cykpIHsKLQkJbmZjX2RiZygidGhlIHRhcmdldCBmb3VuZCBkb2VzIG5vdCBoYXZlIHRoZSBkZXNpcmVkIHByb3RvY29sIik7CisJCXByX2RlYnVnKCJ0aGUgdGFyZ2V0IGZvdW5kIGRvZXMgbm90IGhhdmUgdGhlIGRlc2lyZWQgcHJvdG9jb2xcbiIpOwogCQlyZXR1cm47CiAJfQogCi0JbmZjX2RiZygibmV3IHRhcmdldCBmb3VuZCwgIHN1cHBvcnRlZF9wcm90b2NvbHMgMHgleCIsCi0JCW5mY190Z3Quc3VwcG9ydGVkX3Byb3RvY29scyk7CisJcHJfZGVidWcoIm5ldyB0YXJnZXQgZm91bmQsICBzdXBwb3J0ZWRfcHJvdG9jb2xzIDB4JXhcbiIsCisJCSBuZmNfdGd0LnN1cHBvcnRlZF9wcm90b2NvbHMpOwogCiAJbmRldi0+dGFyZ2V0X2F2YWlsYWJsZV9wcm90cyA9IG5mY190Z3Quc3VwcG9ydGVkX3Byb3RvY29sczsKKwluZGV2LT5tYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplID0gbnRmLT5tYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplOworCW5kZXYtPmluaXRpYWxfbnVtX2NyZWRpdHMgPSBudGYtPmluaXRpYWxfbnVtX2NyZWRpdHM7CisKKwkvKiBzZXQgdGhlIGF2YWlsYWJsZSBjcmVkaXRzIHRvIGluaXRpYWwgdmFsdWUgKi8KKwlhdG9taWNfc2V0KCZuZGV2LT5jcmVkaXRzX2NudCwgbmRldi0+aW5pdGlhbF9udW1fY3JlZGl0cyk7CiAKIAluZmNfdGFyZ2V0c19mb3VuZChuZGV2LT5uZmNfZGV2LCAmbmZjX3RndCwgMSk7CiB9CiAKLXN0YXRpYyB2b2lkIG5jaV9yZl9hY3RpdmF0ZV9udGZfcGFja2V0KHN0cnVjdCBuY2lfZGV2ICpuZGV2LAotCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHZvaWQgbmNpX3JmX2ludGZfYWN0aXZhdGVkX250Zl9wYWNrZXQoc3RydWN0IG5jaV9kZXYgKm5kZXYsCisJCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewotCXN0cnVjdCBuY2lfcmZfYWN0aXZhdGVfbnRmIG50ZjsKKwlzdHJ1Y3QgbmNpX3JmX2ludGZfYWN0aXZhdGVkX250ZiBudGY7CiAJX191OCAqZGF0YSA9IHNrYi0+ZGF0YTsKLQlpbnQgcmMgPSAtMTsKKwlpbnQgZXJyID0gMDsKIAogCWNsZWFyX2JpdChOQ0lfRElTQ09WRVJZLCAmbmRldi0+ZmxhZ3MpOwogCXNldF9iaXQoTkNJX1BPTExfQUNUSVZFLCAmbmRldi0+ZmxhZ3MpOwogCi0JbnRmLnRhcmdldF9oYW5kbGUgPSAqZGF0YSsrOworCW50Zi5yZl9kaXNjb3ZlcnlfaWQgPSAqZGF0YSsrOworCW50Zi5yZl9pbnRlcmZhY2UgPSAqZGF0YSsrOwogCW50Zi5yZl9wcm90b2NvbCA9ICpkYXRhKys7Ci0JbnRmLnJmX3RlY2hfYW5kX21vZGUgPSAqZGF0YSsrOworCW50Zi5hY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUgPSAqZGF0YSsrOworCW50Zi5tYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplID0gKmRhdGErKzsKKwludGYuaW5pdGlhbF9udW1fY3JlZGl0cyA9ICpkYXRhKys7CiAJbnRmLnJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX2xlbiA9ICpkYXRhKys7CiAKLQluZmNfZGJnKCJ0YXJnZXRfaGFuZGxlICVkLCByZl9wcm90b2NvbCAweCV4LCByZl90ZWNoX2FuZF9tb2RlIDB4JXgsIHJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX2xlbiAlZCIsCi0JCW50Zi50YXJnZXRfaGFuZGxlLAotCQludGYucmZfcHJvdG9jb2wsCi0JCW50Zi5yZl90ZWNoX2FuZF9tb2RlLAotCQludGYucmZfdGVjaF9zcGVjaWZpY19wYXJhbXNfbGVuKTsKKwlwcl9kZWJ1ZygicmZfZGlzY292ZXJ5X2lkICVkXG4iLCBudGYucmZfZGlzY292ZXJ5X2lkKTsKKwlwcl9kZWJ1ZygicmZfaW50ZXJmYWNlIDB4JXhcbiIsIG50Zi5yZl9pbnRlcmZhY2UpOworCXByX2RlYnVnKCJyZl9wcm90b2NvbCAweCV4XG4iLCBudGYucmZfcHJvdG9jb2wpOworCXByX2RlYnVnKCJhY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUgMHgleFxuIiwKKwkJIG50Zi5hY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUpOworCXByX2RlYnVnKCJtYXhfZGF0YV9wa3RfcGF5bG9hZF9zaXplIDB4JXhcbiIsCisJCSBudGYubWF4X2RhdGFfcGt0X3BheWxvYWRfc2l6ZSk7CisJcHJfZGVidWcoImluaXRpYWxfbnVtX2NyZWRpdHMgMHgleFxuIiwgbnRmLmluaXRpYWxfbnVtX2NyZWRpdHMpOworCXByX2RlYnVnKCJyZl90ZWNoX3NwZWNpZmljX3BhcmFtc19sZW4gJWRcbiIsCisJCSBudGYucmZfdGVjaF9zcGVjaWZpY19wYXJhbXNfbGVuKTsKIAotCXN3aXRjaCAobnRmLnJmX3RlY2hfYW5kX21vZGUpIHsKLQljYXNlIE5DSV9ORkNfQV9QQVNTSVZFX1BPTExfTU9ERToKLQkJcmMgPSBuY2lfcmZfYWN0aXZhdGVfbmZjYV9wYXNzaXZlX3BvbGwobmRldiwgJm50ZiwKLQkJCWRhdGEpOwotCQlicmVhazsKKwlpZiAobnRmLnJmX3RlY2hfc3BlY2lmaWNfcGFyYW1zX2xlbiA+IDApIHsKKwkJc3dpdGNoIChudGYuYWN0aXZhdGlvbl9yZl90ZWNoX2FuZF9tb2RlKSB7CisJCWNhc2UgTkNJX05GQ19BX1BBU1NJVkVfUE9MTF9NT0RFOgorCQkJZGF0YSA9IG5jaV9leHRyYWN0X3JmX3BhcmFtc19uZmNhX3Bhc3NpdmVfcG9sbChuZGV2LAorCQkJCSZudGYsIGRhdGEpOworCQkJYnJlYWs7CiAKLQlkZWZhdWx0OgotCQluZmNfZXJyKCJ1bnN1cHBvcnRlZCByZl90ZWNoX2FuZF9tb2RlIDB4JXgiLAotCQkJbnRmLnJmX3RlY2hfYW5kX21vZGUpOwotCQlyZXR1cm47CisJCWRlZmF1bHQ6CisJCQlwcl9lcnIoInVuc3VwcG9ydGVkIGFjdGl2YXRpb25fcmZfdGVjaF9hbmRfbW9kZSAweCV4XG4iLAorCQkJICAgICAgIG50Zi5hY3RpdmF0aW9uX3JmX3RlY2hfYW5kX21vZGUpOworCQkJcmV0dXJuOworCQl9CiAJfQogCi0JaWYgKCFyYykKKwludGYuZGF0YV9leGNoX3JmX3RlY2hfYW5kX21vZGUgPSAqZGF0YSsrOworCW50Zi5kYXRhX2V4Y2hfdHhfYml0X3JhdGUgPSAqZGF0YSsrOworCW50Zi5kYXRhX2V4Y2hfcnhfYml0X3JhdGUgPSAqZGF0YSsrOworCW50Zi5hY3RpdmF0aW9uX3BhcmFtc19sZW4gPSAqZGF0YSsrOworCisJcHJfZGVidWcoImRhdGFfZXhjaF9yZl90ZWNoX2FuZF9tb2RlIDB4JXhcbiIsCisJCSBudGYuZGF0YV9leGNoX3JmX3RlY2hfYW5kX21vZGUpOworCXByX2RlYnVnKCJkYXRhX2V4Y2hfdHhfYml0X3JhdGUgMHgleFxuIiwKKwkJIG50Zi5kYXRhX2V4Y2hfdHhfYml0X3JhdGUpOworCXByX2RlYnVnKCJkYXRhX2V4Y2hfcnhfYml0X3JhdGUgMHgleFxuIiwKKwkJIG50Zi5kYXRhX2V4Y2hfcnhfYml0X3JhdGUpOworCXByX2RlYnVnKCJhY3RpdmF0aW9uX3BhcmFtc19sZW4gJWRcbiIsCisJCSBudGYuYWN0aXZhdGlvbl9wYXJhbXNfbGVuKTsKKworCWlmIChudGYuYWN0aXZhdGlvbl9wYXJhbXNfbGVuID4gMCkgeworCQlzd2l0Y2ggKG50Zi5yZl9pbnRlcmZhY2UpIHsKKwkJY2FzZSBOQ0lfUkZfSU5URVJGQUNFX0lTT19ERVA6CisJCQllcnIgPSBuY2lfZXh0cmFjdF9hY3RpdmF0aW9uX3BhcmFtc19pc29fZGVwKG5kZXYsCisJCQkJJm50ZiwgZGF0YSk7CisJCQlicmVhazsKKworCQljYXNlIE5DSV9SRl9JTlRFUkZBQ0VfRlJBTUU6CisJCQkvKiBubyBhY3RpdmF0aW9uIHBhcmFtcyAqLworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByX2VycigidW5zdXBwb3J0ZWQgcmZfaW50ZXJmYWNlIDB4JXhcbiIsCisJCQkgICAgICAgbnRmLnJmX2ludGVyZmFjZSk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlpZiAoIWVycikKIAkJbmNpX3RhcmdldF9mb3VuZChuZGV2LCAmbnRmKTsKIH0KIAogc3RhdGljIHZvaWQgbmNpX3JmX2RlYWN0aXZhdGVfbnRmX3BhY2tldChzdHJ1Y3QgbmNpX2RldiAqbmRldiwKIAkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKIHsKLQlfX3U4IHR5cGUgPSBza2ItPmRhdGFbMF07CisJc3RydWN0IG5jaV9yZl9kZWFjdGl2YXRlX250ZiAqbnRmID0gKHZvaWQgKikgc2tiLT5kYXRhOwogCi0JbmZjX2RiZygiZW50cnksIHR5cGUgMHgleCIsIHR5cGUpOworCXByX2RlYnVnKCJlbnRyeSwgdHlwZSAweCV4LCByZWFzb24gMHgleFxuIiwgbnRmLT50eXBlLCBudGYtPnJlYXNvbik7CiAKIAljbGVhcl9iaXQoTkNJX1BPTExfQUNUSVZFLCAmbmRldi0+ZmxhZ3MpOwogCW5kZXYtPnRhcmdldF9hY3RpdmVfcHJvdCA9IDA7CkBAIC0yMjMsMTEgKzI4NiwxMSBAQAogewogCV9fdTE2IG50Zl9vcGNvZGUgPSBuY2lfb3Bjb2RlKHNrYi0+ZGF0YSk7CiAKLQluZmNfZGJnKCJOQ0kgUlg6IE1UPW50ZiwgUEJGPSVkLCBHSUQ9MHgleCwgT0lEPTB4JXgsIHBsZW49JWQiLAotCQkJbmNpX3BiZihza2ItPmRhdGEpLAotCQkJbmNpX29wY29kZV9naWQobnRmX29wY29kZSksCi0JCQluY2lfb3Bjb2RlX29pZChudGZfb3Bjb2RlKSwKLQkJCW5jaV9wbGVuKHNrYi0+ZGF0YSkpOworCXByX2RlYnVnKCJOQ0kgUlg6IE1UPW50ZiwgUEJGPSVkLCBHSUQ9MHgleCwgT0lEPTB4JXgsIHBsZW49JWRcbiIsCisJCSBuY2lfcGJmKHNrYi0+ZGF0YSksCisJCSBuY2lfb3Bjb2RlX2dpZChudGZfb3Bjb2RlKSwKKwkJIG5jaV9vcGNvZGVfb2lkKG50Zl9vcGNvZGUpLAorCQkgbmNpX3BsZW4oc2tiLT5kYXRhKSk7CiAKIAkvKiBzdHJpcCB0aGUgbmNpIGNvbnRyb2wgaGVhZGVyICovCiAJc2tiX3B1bGwoc2tiLCBOQ0lfQ1RSTF9IRFJfU0laRSk7CkBAIC0yMzcsMTIgKzMwMCwxMiBAQAogCQluY2lfY29yZV9jb25uX2NyZWRpdHNfbnRmX3BhY2tldChuZGV2LCBza2IpOwogCQlicmVhazsKIAotCWNhc2UgTkNJX09QX1JGX0ZJRUxEX0lORk9fTlRGOgotCQluY2lfcmZfZmllbGRfaW5mb19udGZfcGFja2V0KG5kZXYsIHNrYik7CisJY2FzZSBOQ0lfT1BfQ09SRV9JTlRGX0VSUk9SX05URjoKKwkJbmNpX2NvcmVfY29ubl9pbnRmX2Vycm9yX250Zl9wYWNrZXQobmRldiwgc2tiKTsKIAkJYnJlYWs7CiAKLQljYXNlIE5DSV9PUF9SRl9BQ1RJVkFURV9OVEY6Ci0JCW5jaV9yZl9hY3RpdmF0ZV9udGZfcGFja2V0KG5kZXYsIHNrYik7CisJY2FzZSBOQ0lfT1BfUkZfSU5URl9BQ1RJVkFURURfTlRGOgorCQluY2lfcmZfaW50Zl9hY3RpdmF0ZWRfbnRmX3BhY2tldChuZGV2LCBza2IpOwogCQlicmVhazsKIAogCWNhc2UgTkNJX09QX1JGX0RFQUNUSVZBVEVfTlRGOgpAQCAtMjUwLDcgKzMxMyw3IEBACiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKLQkJbmZjX2VycigidW5rbm93biBudGYgb3Bjb2RlIDB4JXgiLCBudGZfb3Bjb2RlKTsKKwkJcHJfZXJyKCJ1bmtub3duIG50ZiBvcGNvZGUgMHgleFxuIiwgbnRmX29wY29kZSk7CiAJCWJyZWFrOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L25mYy9uY2kvcnNwLmMgYi9uZXQvbmZjL25jaS9yc3AuYwppbmRleCAwNDAzZDRjLi4yODQwYWUyIDEwMDY0NAotLS0gYS9uZXQvbmZjL25jaS9yc3AuYworKysgYi9uZXQvbmZjL25jaS9yc3AuYwpAQCAtMjUsNiArMjUsOCBAQAogICoKICAqLwogCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICVzOiAiIGZtdCwgX19mdW5jX18KKwogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CkBAIC00MCwxMiArNDIsMTMgQEAKIHsKIAlzdHJ1Y3QgbmNpX2NvcmVfcmVzZXRfcnNwICpyc3AgPSAodm9pZCAqKSBza2ItPmRhdGE7CiAKLQluZmNfZGJnKCJlbnRyeSwgc3RhdHVzIDB4JXgiLCByc3AtPnN0YXR1cyk7CisJcHJfZGVidWcoInN0YXR1cyAweCV4XG4iLCByc3AtPnN0YXR1cyk7CiAKLQlpZiAocnNwLT5zdGF0dXMgPT0gTkNJX1NUQVRVU19PSykKKwlpZiAocnNwLT5zdGF0dXMgPT0gTkNJX1NUQVRVU19PSykgewogCQluZGV2LT5uY2lfdmVyID0gcnNwLT5uY2lfdmVyOwotCi0JbmZjX2RiZygibmNpX3ZlciAweCV4IiwgbmRldi0+bmNpX3Zlcik7CisJCXByX2RlYnVnKCJuY2lfdmVyIDB4JXgsIGNvbmZpZ19zdGF0dXMgMHgleFxuIiwKKwkJCSByc3AtPm5jaV92ZXIsIHJzcC0+Y29uZmlnX3N0YXR1cyk7CisJfQogCiAJbmNpX3JlcV9jb21wbGV0ZShuZGV2LCByc3AtPnN0YXR1cyk7CiB9CkBAIC01NSwxNiArNTgsMTYgQEAKIAlzdHJ1Y3QgbmNpX2NvcmVfaW5pdF9yc3BfMSAqcnNwXzEgPSAodm9pZCAqKSBza2ItPmRhdGE7CiAJc3RydWN0IG5jaV9jb3JlX2luaXRfcnNwXzIgKnJzcF8yOwogCi0JbmZjX2RiZygiZW50cnksIHN0YXR1cyAweCV4IiwgcnNwXzEtPnN0YXR1cyk7CisJcHJfZGVidWcoInN0YXR1cyAweCV4XG4iLCByc3BfMS0+c3RhdHVzKTsKIAogCWlmIChyc3BfMS0+c3RhdHVzICE9IE5DSV9TVEFUVVNfT0spCi0JCXJldHVybjsKKwkJZ290byBleGl0OwogCiAJbmRldi0+bmZjY19mZWF0dXJlcyA9IF9fbGUzMl90b19jcHUocnNwXzEtPm5mY2NfZmVhdHVyZXMpOwogCW5kZXYtPm51bV9zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlcyA9IHJzcF8xLT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXM7CiAKIAlpZiAobmRldi0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzID4KLQkJTkNJX01BWF9TVVBQT1JURURfUkZfSU5URVJGQUNFUykgeworCQkJTkNJX01BWF9TVVBQT1JURURfUkZfSU5URVJGQUNFUykgewogCQluZGV2LT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMgPQogCQkJTkNJX01BWF9TVVBQT1JURURfUkZfSU5URVJGQUNFUzsKIAl9CkBAIC03Myw3NiArNzYsNTYgQEAKIAkJcnNwXzEtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzLAogCQluZGV2LT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMpOwogCi0JcnNwXzIgPSAodm9pZCAqKSAoc2tiLT5kYXRhICsgNiArIG5kZXYtPm51bV9zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlcyk7CisJcnNwXzIgPSAodm9pZCAqKSAoc2tiLT5kYXRhICsgNiArIHJzcF8xLT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMpOwogCiAJbmRldi0+bWF4X2xvZ2ljYWxfY29ubmVjdGlvbnMgPQogCQlyc3BfMi0+bWF4X2xvZ2ljYWxfY29ubmVjdGlvbnM7CiAJbmRldi0+bWF4X3JvdXRpbmdfdGFibGVfc2l6ZSA9CiAJCV9fbGUxNl90b19jcHUocnNwXzItPm1heF9yb3V0aW5nX3RhYmxlX3NpemUpOwotCW5kZXYtPm1heF9jb250cm9sX3BhY2tldF9wYXlsb2FkX2xlbmd0aCA9Ci0JCXJzcF8yLT5tYXhfY29udHJvbF9wYWNrZXRfcGF5bG9hZF9sZW5ndGg7Ci0JbmRldi0+cmZfc2VuZGluZ19idWZmZXJfc2l6ZSA9Ci0JCV9fbGUxNl90b19jcHUocnNwXzItPnJmX3NlbmRpbmdfYnVmZmVyX3NpemUpOwotCW5kZXYtPnJmX3JlY2VpdmluZ19idWZmZXJfc2l6ZSA9Ci0JCV9fbGUxNl90b19jcHUocnNwXzItPnJmX3JlY2VpdmluZ19idWZmZXJfc2l6ZSk7Ci0JbmRldi0+bWFudWZhY3R1cmVyX2lkID0KLQkJX19sZTE2X3RvX2NwdShyc3BfMi0+bWFudWZhY3R1cmVyX2lkKTsKKwluZGV2LT5tYXhfY3RybF9wa3RfcGF5bG9hZF9sZW4gPQorCQlyc3BfMi0+bWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuOworCW5kZXYtPm1heF9zaXplX2Zvcl9sYXJnZV9wYXJhbXMgPQorCQlfX2xlMTZfdG9fY3B1KHJzcF8yLT5tYXhfc2l6ZV9mb3JfbGFyZ2VfcGFyYW1zKTsKKwluZGV2LT5tYW51ZmFjdF9pZCA9CisJCXJzcF8yLT5tYW51ZmFjdF9pZDsKKwluZGV2LT5tYW51ZmFjdF9zcGVjaWZpY19pbmZvID0KKwkJX19sZTMyX3RvX2NwdShyc3BfMi0+bWFudWZhY3Rfc3BlY2lmaWNfaW5mbyk7CiAKLQluZmNfZGJnKCJuZmNjX2ZlYXR1cmVzIDB4JXgiLAotCQluZGV2LT5uZmNjX2ZlYXR1cmVzKTsKLQluZmNfZGJnKCJudW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMgJWQiLAotCQluZGV2LT5udW1fc3VwcG9ydGVkX3JmX2ludGVyZmFjZXMpOwotCW5mY19kYmcoInN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzBdIDB4JXgiLAotCQluZGV2LT5zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlc1swXSk7Ci0JbmZjX2RiZygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMV0gMHgleCIsCi0JCW5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzFdKTsKLQluZmNfZGJnKCJzdXBwb3J0ZWRfcmZfaW50ZXJmYWNlc1syXSAweCV4IiwKLQkJbmRldi0+c3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMl0pOwotCW5mY19kYmcoInN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzNdIDB4JXgiLAotCQluZGV2LT5zdXBwb3J0ZWRfcmZfaW50ZXJmYWNlc1szXSk7Ci0JbmZjX2RiZygibWF4X2xvZ2ljYWxfY29ubmVjdGlvbnMgJWQiLAotCQluZGV2LT5tYXhfbG9naWNhbF9jb25uZWN0aW9ucyk7Ci0JbmZjX2RiZygibWF4X3JvdXRpbmdfdGFibGVfc2l6ZSAlZCIsCi0JCW5kZXYtPm1heF9yb3V0aW5nX3RhYmxlX3NpemUpOwotCW5mY19kYmcoIm1heF9jb250cm9sX3BhY2tldF9wYXlsb2FkX2xlbmd0aCAlZCIsCi0JCW5kZXYtPm1heF9jb250cm9sX3BhY2tldF9wYXlsb2FkX2xlbmd0aCk7Ci0JbmZjX2RiZygicmZfc2VuZGluZ19idWZmZXJfc2l6ZSAlZCIsCi0JCW5kZXYtPnJmX3NlbmRpbmdfYnVmZmVyX3NpemUpOwotCW5mY19kYmcoInJmX3JlY2VpdmluZ19idWZmZXJfc2l6ZSAlZCIsCi0JCW5kZXYtPnJmX3JlY2VpdmluZ19idWZmZXJfc2l6ZSk7Ci0JbmZjX2RiZygibWFudWZhY3R1cmVyX2lkIDB4JXgiLAotCQluZGV2LT5tYW51ZmFjdHVyZXJfaWQpOworCXByX2RlYnVnKCJuZmNjX2ZlYXR1cmVzIDB4JXhcbiIsCisJCSBuZGV2LT5uZmNjX2ZlYXR1cmVzKTsKKwlwcl9kZWJ1ZygibnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzICVkXG4iLAorCQkgbmRldi0+bnVtX3N1cHBvcnRlZF9yZl9pbnRlcmZhY2VzKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMF0gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzBdKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMV0gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzFdKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbMl0gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzJdKTsKKwlwcl9kZWJ1Zygic3VwcG9ydGVkX3JmX2ludGVyZmFjZXNbM10gMHgleFxuIiwKKwkJIG5kZXYtPnN1cHBvcnRlZF9yZl9pbnRlcmZhY2VzWzNdKTsKKwlwcl9kZWJ1ZygibWF4X2xvZ2ljYWxfY29ubmVjdGlvbnMgJWRcbiIsCisJCSBuZGV2LT5tYXhfbG9naWNhbF9jb25uZWN0aW9ucyk7CisJcHJfZGVidWcoIm1heF9yb3V0aW5nX3RhYmxlX3NpemUgJWRcbiIsCisJCSBuZGV2LT5tYXhfcm91dGluZ190YWJsZV9zaXplKTsKKwlwcl9kZWJ1ZygibWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuICVkXG4iLAorCQkgbmRldi0+bWF4X2N0cmxfcGt0X3BheWxvYWRfbGVuKTsKKwlwcl9kZWJ1ZygibWF4X3NpemVfZm9yX2xhcmdlX3BhcmFtcyAlZFxuIiwKKwkJIG5kZXYtPm1heF9zaXplX2Zvcl9sYXJnZV9wYXJhbXMpOworCXByX2RlYnVnKCJtYW51ZmFjdF9pZCAweCV4XG4iLAorCQkgbmRldi0+bWFudWZhY3RfaWQpOworCXByX2RlYnVnKCJtYW51ZmFjdF9zcGVjaWZpY19pbmZvIDB4JXhcbiIsCisJCSBuZGV2LT5tYW51ZmFjdF9zcGVjaWZpY19pbmZvKTsKIAorZXhpdDoKIAluY2lfcmVxX2NvbXBsZXRlKG5kZXYsIHJzcF8xLT5zdGF0dXMpOwogfQogCi1zdGF0aWMgdm9pZCBuY2lfY29yZV9jb25uX2NyZWF0ZV9yc3BfcGFja2V0KHN0cnVjdCBuY2lfZGV2ICpuZGV2LAotCQkJCQkJc3RydWN0IHNrX2J1ZmYgKnNrYikKLXsKLQlzdHJ1Y3QgbmNpX2NvcmVfY29ubl9jcmVhdGVfcnNwICpyc3AgPSAodm9pZCAqKSBza2ItPmRhdGE7Ci0KLQluZmNfZGJnKCJlbnRyeSwgc3RhdHVzIDB4JXgiLCByc3AtPnN0YXR1cyk7Ci0KLQlpZiAocnNwLT5zdGF0dXMgIT0gTkNJX1NUQVRVU19PSykKLQkJcmV0dXJuOwotCi0JbmRldi0+bWF4X3BrdF9wYXlsb2FkX3NpemUgPSByc3AtPm1heF9wa3RfcGF5bG9hZF9zaXplOwotCW5kZXYtPmluaXRpYWxfbnVtX2NyZWRpdHMgPSByc3AtPmluaXRpYWxfbnVtX2NyZWRpdHM7Ci0JbmRldi0+Y29ubl9pZCA9IHJzcC0+Y29ubl9pZDsKLQotCWF0b21pY19zZXQoJm5kZXYtPmNyZWRpdHNfY250LCBuZGV2LT5pbml0aWFsX251bV9jcmVkaXRzKTsKLQotCW5mY19kYmcoIm1heF9wa3RfcGF5bG9hZF9zaXplICVkIiwgbmRldi0+bWF4X3BrdF9wYXlsb2FkX3NpemUpOwotCW5mY19kYmcoImluaXRpYWxfbnVtX2NyZWRpdHMgJWQiLCBuZGV2LT5pbml0aWFsX251bV9jcmVkaXRzKTsKLQluZmNfZGJnKCJjb25uX2lkICVkIiwgbmRldi0+Y29ubl9pZCk7Ci19Ci0KIHN0YXRpYyB2b2lkIG5jaV9yZl9kaXNjX21hcF9yc3BfcGFja2V0KHN0cnVjdCBuY2lfZGV2ICpuZGV2LAogCQkJCQlzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCV9fdTggc3RhdHVzID0gc2tiLT5kYXRhWzBdOwogCi0JbmZjX2RiZygiZW50cnksIHN0YXR1cyAweCV4Iiwgc3RhdHVzKTsKKwlwcl9kZWJ1Zygic3RhdHVzIDB4JXhcbiIsIHN0YXR1cyk7CiAKIAluY2lfcmVxX2NvbXBsZXRlKG5kZXYsIHN0YXR1cyk7CiB9CkBAIC0xNTEsNyArMTM0LDcgQEAKIHsKIAlfX3U4IHN0YXR1cyA9IHNrYi0+ZGF0YVswXTsKIAotCW5mY19kYmcoImVudHJ5LCBzdGF0dXMgMHgleCIsIHN0YXR1cyk7CisJcHJfZGVidWcoInN0YXR1cyAweCV4XG4iLCBzdGF0dXMpOwogCiAJaWYgKHN0YXR1cyA9PSBOQ0lfU1RBVFVTX09LKQogCQlzZXRfYml0KE5DSV9ESVNDT1ZFUlksICZuZGV2LT5mbGFncyk7CkBAIC0xNjQsNyArMTQ3LDcgQEAKIHsKIAlfX3U4IHN0YXR1cyA9IHNrYi0+ZGF0YVswXTsKIAotCW5mY19kYmcoImVudHJ5LCBzdGF0dXMgMHgleCIsIHN0YXR1cyk7CisJcHJfZGVidWcoInN0YXR1cyAweCV4XG4iLCBzdGF0dXMpOwogCiAJY2xlYXJfYml0KE5DSV9ESVNDT1ZFUlksICZuZGV2LT5mbGFncyk7CiAKQEAgLTE3OCwxMSArMTYxLDExIEBACiAJLyogd2UgZ290IGEgcnNwLCBzdG9wIHRoZSBjbWQgdGltZXIgKi8KIAlkZWxfdGltZXIoJm5kZXYtPmNtZF90aW1lcik7CiAKLQluZmNfZGJnKCJOQ0kgUlg6IE1UPXJzcCwgUEJGPSVkLCBHSUQ9MHgleCwgT0lEPTB4JXgsIHBsZW49JWQiLAotCQkJbmNpX3BiZihza2ItPmRhdGEpLAotCQkJbmNpX29wY29kZV9naWQocnNwX29wY29kZSksCi0JCQluY2lfb3Bjb2RlX29pZChyc3Bfb3Bjb2RlKSwKLQkJCW5jaV9wbGVuKHNrYi0+ZGF0YSkpOworCXByX2RlYnVnKCJOQ0kgUlg6IE1UPXJzcCwgUEJGPSVkLCBHSUQ9MHgleCwgT0lEPTB4JXgsIHBsZW49JWRcbiIsCisJCSBuY2lfcGJmKHNrYi0+ZGF0YSksCisJCSBuY2lfb3Bjb2RlX2dpZChyc3Bfb3Bjb2RlKSwKKwkJIG5jaV9vcGNvZGVfb2lkKHJzcF9vcGNvZGUpLAorCQkgbmNpX3BsZW4oc2tiLT5kYXRhKSk7CiAKIAkvKiBzdHJpcCB0aGUgbmNpIGNvbnRyb2wgaGVhZGVyICovCiAJc2tiX3B1bGwoc2tiLCBOQ0lfQ1RSTF9IRFJfU0laRSk7CkBAIC0xOTYsMTAgKzE3OSw2IEBACiAJCW5jaV9jb3JlX2luaXRfcnNwX3BhY2tldChuZGV2LCBza2IpOwogCQlicmVhazsKIAotCWNhc2UgTkNJX09QX0NPUkVfQ09OTl9DUkVBVEVfUlNQOgotCQluY2lfY29yZV9jb25uX2NyZWF0ZV9yc3BfcGFja2V0KG5kZXYsIHNrYik7Ci0JCWJyZWFrOwotCiAJY2FzZSBOQ0lfT1BfUkZfRElTQ09WRVJfTUFQX1JTUDoKIAkJbmNpX3JmX2Rpc2NfbWFwX3JzcF9wYWNrZXQobmRldiwgc2tiKTsKIAkJYnJlYWs7CkBAIC0yMTMsNyArMTkyLDcgQEAKIAkJYnJlYWs7CiAKIAlkZWZhdWx0OgotCQluZmNfZXJyKCJ1bmtub3duIHJzcCBvcGNvZGUgMHgleCIsIHJzcF9vcGNvZGUpOworCQlwcl9lcnIoInVua25vd24gcnNwIG9wY29kZSAweCV4XG4iLCByc3Bfb3Bjb2RlKTsKIAkJYnJlYWs7CiAJfQogCmRpZmYgLS1naXQgYS9uZXQvbmZjL25ldGxpbmsuYyBiL25ldC9uZmMvbmV0bGluay5jCmluZGV4IDAzZjg4MTguLjY5ODlkZmEgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvbmV0bGluay5jCisrKyBiL25ldC9uZmMvbmV0bGluay5jCkBAIC0yMSw2ICsyMSw4IEBACiAgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgogICovCiAKKyNkZWZpbmUgcHJfZm10KGZtdCkgS0JVSUxEX01PRE5BTUUgIjogJXM6ICIgZm10LCBfX2Z1bmNfXworCiAjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgogI2luY2x1ZGUgPGxpbnV4L25mYy5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KQEAgLTQ0LDYgKzQ2LDggQEAKIAlbTkZDX0FUVFJfREVWSUNFX05BTUVdID0geyAudHlwZSA9IE5MQV9TVFJJTkcsCiAJCQkJLmxlbiA9IE5GQ19ERVZJQ0VfTkFNRV9NQVhTSVpFIH0sCiAJW05GQ19BVFRSX1BST1RPQ09MU10gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtORkNfQVRUUl9DT01NX01PREVdID0geyAudHlwZSA9IE5MQV9VOCB9LAorCVtORkNfQVRUUl9SRl9NT0RFXSA9IHsgLnR5cGUgPSBOTEFfVTggfSwKIH07CiAKIHN0YXRpYyBpbnQgbmZjX2dlbmxfc2VuZF90YXJnZXQoc3RydWN0IHNrX2J1ZmYgKm1zZywgc3RydWN0IG5mY190YXJnZXQgKnRhcmdldCwKQEAgLTUxLDggKzU1LDYgQEAKIHsKIAl2b2lkICpoZHI7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaGRyID0gZ2VubG1zZ19wdXQobXNnLCBORVRMSU5LX0NCKGNiLT5za2IpLnBpZCwgY2ItPm5saC0+bmxtc2dfc2VxLAogCQkJCSZuZmNfZ2VubF9mYW1pbHksIGZsYWdzLCBORkNfQ01EX0dFVF9UQVJHRVQpOwogCWlmICghaGRyKQpAQCAtNjUsNiArNjcsOSBAQAogCQkJCXRhcmdldC0+c3VwcG9ydGVkX3Byb3RvY29scyk7CiAJTkxBX1BVVF9VMTYobXNnLCBORkNfQVRUUl9UQVJHRVRfU0VOU19SRVMsIHRhcmdldC0+c2Vuc19yZXMpOwogCU5MQV9QVVRfVTgobXNnLCBORkNfQVRUUl9UQVJHRVRfU0VMX1JFUywgdGFyZ2V0LT5zZWxfcmVzKTsKKwlpZiAodGFyZ2V0LT5uZmNpZDFfbGVuID4gMCkKKwkJTkxBX1BVVChtc2csIE5GQ19BVFRSX1RBUkdFVF9ORkNJRDEsIHRhcmdldC0+bmZjaWQxX2xlbiwKKwkJCQl0YXJnZXQtPm5mY2lkMSk7CiAKIAlyZXR1cm4gZ2VubG1zZ19lbmQobXNnLCBoZHIpOwogCkBAIC0xMDUsOCArMTEwLDYgQEAKIAlzdHJ1Y3QgbmZjX2RldiAqZGV2ID0gKHN0cnVjdCBuZmNfZGV2ICopIGNiLT5hcmdzWzFdOwogCWludCByYzsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoIWRldikgewogCQlkZXYgPSBfX2dldF9kZXZpY2VfZnJvbV9jYihjYik7CiAJCWlmIChJU19FUlIoZGV2KSkKQEAgLTEzOSw4ICsxNDIsNiBAQAogewogCXN0cnVjdCBuZmNfZGV2ICpkZXYgPSAoc3RydWN0IG5mY19kZXYgKikgY2ItPmFyZ3NbMV07CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaWYgKGRldikKIAkJbmZjX3B1dF9kZXZpY2UoZGV2KTsKIApAQCAtMTUyLDggKzE1Myw2IEBACiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAl2b2lkICpoZHI7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJZGV2LT5nZW5sX2RhdGEucG9sbF9yZXFfcGlkID0gMDsKIAogCW1zZyA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0FUT01JQyk7CkBAIC0xODMsOCArMTgyLDYgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwogCXZvaWQgKmhkcjsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAltc2cgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9LRVJORUwpOwogCWlmICghbXNnKQogCQlyZXR1cm4gLUVOT01FTTsKQEAgLTIxNiw4ICsyMTMsNiBAQAogCXN0cnVjdCBza19idWZmICptc2c7CiAJdm9pZCAqaGRyOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCW1zZyA9IG5sbXNnX25ldyhOTE1TR19HT09EU0laRSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFtc2cpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtMjQ5LDggKzI0NCw2IEBACiB7CiAJdm9pZCAqaGRyOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgcGlkLCBzZXEsICZuZmNfZ2VubF9mYW1pbHksIGZsYWdzLAogCQkJCQkJCU5GQ19DTURfR0VUX0RFVklDRSk7CiAJaWYgKCFoZHIpCkBAIC0yNzcsOCArMjcwLDYgQEAKIAlzdHJ1Y3QgbmZjX2RldiAqZGV2ID0gKHN0cnVjdCBuZmNfZGV2ICopIGNiLT5hcmdzWzFdOwogCWJvb2wgZmlyc3RfY2FsbCA9IGZhbHNlOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCWlmICghaXRlcikgewogCQlmaXJzdF9jYWxsID0gdHJ1ZTsKIAkJaXRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjbGFzc19kZXZfaXRlciksIEdGUF9LRVJORUwpOwpAQCAtMzE5LDE0ICszMTAsODEgQEAKIHsKIAlzdHJ1Y3QgY2xhc3NfZGV2X2l0ZXIgKml0ZXIgPSAoc3RydWN0IGNsYXNzX2Rldl9pdGVyICopIGNiLT5hcmdzWzBdOwogCi0JbmZjX2RiZygiZW50cnkiKTsKLQogCW5mY19kZXZpY2VfaXRlcl9leGl0KGl0ZXIpOwogCWtmcmVlKGl0ZXIpOwogCiAJcmV0dXJuIDA7CiB9CiAKK2ludCBuZmNfZ2VubF9kZXBfbGlua191cF9ldmVudChzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCwKKwkJCQkJCXU4IGNvbW1fbW9kZSwgdTggcmZfbW9kZSkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXZvaWQgKmhkcjsKKworCXByX2RlYnVnKCJERVAgbGluayBpcyB1cFxuIik7CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9BVE9NSUMpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgMCwgMCwgJm5mY19nZW5sX2ZhbWlseSwgMCwKKwkJCQlORkNfQ01EX0RFUF9MSU5LX1VQKTsKKwlpZiAoIWhkcikKKwkJZ290byBmcmVlX21zZzsKKworCU5MQV9QVVRfVTMyKG1zZywgTkZDX0FUVFJfREVWSUNFX0lOREVYLCBkZXYtPmlkeCk7CisJaWYgKHJmX21vZGUgPT0gTkZDX1JGX0lOSVRJQVRPUikKKwkJTkxBX1BVVF9VMzIobXNnLCBORkNfQVRUUl9UQVJHRVRfSU5ERVgsIHRhcmdldF9pZHgpOworCU5MQV9QVVRfVTgobXNnLCBORkNfQVRUUl9DT01NX01PREUsIGNvbW1fbW9kZSk7CisJTkxBX1BVVF9VOChtc2csIE5GQ19BVFRSX1JGX01PREUsIHJmX21vZGUpOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCisJZGV2LT5kZXBfbGlua191cCA9IHRydWU7CisKKwlnZW5sbXNnX211bHRpY2FzdChtc2csIDAsIG5mY19nZW5sX2V2ZW50X21jZ3JwLmlkLCBHRlBfQVRPTUlDKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworZnJlZV9tc2c6CisJbmxtc2dfZnJlZShtc2cpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK2ludCBuZmNfZ2VubF9kZXBfbGlua19kb3duX2V2ZW50KHN0cnVjdCBuZmNfZGV2ICpkZXYpCit7CisJc3RydWN0IHNrX2J1ZmYgKm1zZzsKKwl2b2lkICpoZHI7CisKKwlwcl9kZWJ1ZygiREVQIGxpbmsgaXMgZG93blxuIik7CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIEdGUF9BVE9NSUMpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhkciA9IGdlbmxtc2dfcHV0KG1zZywgMCwgMCwgJm5mY19nZW5sX2ZhbWlseSwgMCwKKwkJCQlORkNfQ01EX0RFUF9MSU5LX0RPV04pOworCWlmICghaGRyKQorCQlnb3RvIGZyZWVfbXNnOworCisJTkxBX1BVVF9VMzIobXNnLCBORkNfQVRUUl9ERVZJQ0VfSU5ERVgsIGRldi0+aWR4KTsKKworCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKKworCWdlbmxtc2dfbXVsdGljYXN0KG1zZywgMCwgbmZjX2dlbmxfZXZlbnRfbWNncnAuaWQsIEdGUF9BVE9NSUMpOworCisJcmV0dXJuIDA7CisKK25sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CitmcmVlX21zZzoKKwlubG1zZ19mcmVlKG1zZyk7CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKwogc3RhdGljIGludCBuZmNfZ2VubF9nZXRfZGV2aWNlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCiB7CiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKQEAgLTMzNCw4ICszOTIsNiBAQAogCXUzMiBpZHg7CiAJaW50IHJjID0gLUVOT0JVRlM7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaWYgKCFpbmZvLT5hdHRyc1tORkNfQVRUUl9ERVZJQ0VfSU5ERVhdKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMzczLDggKzQyOSw2IEBACiAJaW50IHJjOwogCXUzMiBpZHg7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaWYgKCFpbmZvLT5hdHRyc1tORkNfQVRUUl9ERVZJQ0VfSU5ERVhdKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMzk2LDggKzQ1MCw2IEBACiAJaW50IHJjOwogCXUzMiBpZHg7CiAKLQluZmNfZGJnKCJlbnRyeSIpOwotCiAJaWYgKCFpbmZvLT5hdHRyc1tORkNfQVRUUl9ERVZJQ0VfSU5ERVhdKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtNDIwLDcgKzQ3Miw3IEBACiAJdTMyIGlkeDsKIAl1MzIgcHJvdG9jb2xzOwogCi0JbmZjX2RiZygiZW50cnkiKTsKKwlwcl9kZWJ1ZygiUG9sbCBzdGFydFxuIik7CiAKIAlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0gfHwKIAkJIWluZm8tPmF0dHJzW05GQ19BVFRSX1BST1RPQ09MU10pCkBAIC00NTEsOCArNTAzLDYgQEAKIAlpbnQgcmM7CiAJdTMyIGlkeDsKIAotCW5mY19kYmcoImVudHJ5Iik7Ci0KIAlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pCiAJCXJldHVybiAtRUlOVkFMOwogCkBAIC00NzgsNiArNTI4LDY3IEBACiAJcmV0dXJuIHJjOwogfQogCitzdGF0aWMgaW50IG5mY19nZW5sX2RlcF9saW5rX3VwKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5mY19kZXYgKmRldjsKKwlpbnQgcmMsIHRndF9pZHg7CisJdTMyIGlkeDsKKwl1OCBjb21tLCByZjsKKworCXByX2RlYnVnKCJERVAgbGluayB1cFxuIik7CisKKwlpZiAoIWluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0gfHwKKwkJCSFpbmZvLT5hdHRyc1tORkNfQVRUUl9DT01NX01PREVdIHx8CisJCQkhaW5mby0+YXR0cnNbTkZDX0FUVFJfUkZfTU9ERV0pCisJCXJldHVybiAtRUlOVkFMOworCisJaWR4ID0gbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkZDX0FUVFJfREVWSUNFX0lOREVYXSk7CisJaWYgKCFpbmZvLT5hdHRyc1tORkNfQVRUUl9UQVJHRVRfSU5ERVhdKQorCQl0Z3RfaWR4ID0gTkZDX1RBUkdFVF9JRFhfQU5ZOworCWVsc2UKKwkJdGd0X2lkeCA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05GQ19BVFRSX1RBUkdFVF9JTkRFWF0pOworCisJY29tbSA9IG5sYV9nZXRfdTgoaW5mby0+YXR0cnNbTkZDX0FUVFJfQ09NTV9NT0RFXSk7CisJcmYgPSBubGFfZ2V0X3U4KGluZm8tPmF0dHJzW05GQ19BVFRSX1JGX01PREVdKTsKKworCWlmIChjb21tICE9IE5GQ19DT01NX0FDVElWRSAmJiBjb21tICE9IE5GQ19DT01NX1BBU1NJVkUpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJmICE9IE5GQ19SRl9JTklUSUFUT1IgJiYgY29tbSAhPSBORkNfUkZfVEFSR0VUKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9IG5mY19nZXRfZGV2aWNlKGlkeCk7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRU5PREVWOworCisJcmMgPSBuZmNfZGVwX2xpbmtfdXAoZGV2LCB0Z3RfaWR4LCBjb21tLCByZik7CisKKwluZmNfcHV0X2RldmljZShkZXYpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG5mY19nZW5sX2RlcF9saW5rX2Rvd24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmZjX2RldiAqZGV2OworCWludCByYzsKKwl1MzIgaWR4OworCisJaWYgKCFpbmZvLT5hdHRyc1tORkNfQVRUUl9ERVZJQ0VfSU5ERVhdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlkeCA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05GQ19BVFRSX0RFVklDRV9JTkRFWF0pOworCisJZGV2ID0gbmZjX2dldF9kZXZpY2UoaWR4KTsKKwlpZiAoIWRldikKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyYyA9IG5mY19kZXBfbGlua19kb3duKGRldik7CisKKwluZmNfcHV0X2RldmljZShkZXYpOworCXJldHVybiByYzsKK30KKwogc3RhdGljIHN0cnVjdCBnZW5sX29wcyBuZmNfZ2VubF9vcHNbXSA9IHsKIAl7CiAJCS5jbWQgPSBORkNfQ01EX0dFVF9ERVZJQ0UsCkBAIC01MDcsNiArNjE4LDE2IEBACiAJCS5wb2xpY3kgPSBuZmNfZ2VubF9wb2xpY3ksCiAJfSwKIAl7CisJCS5jbWQgPSBORkNfQ01EX0RFUF9MSU5LX1VQLAorCQkuZG9pdCA9IG5mY19nZW5sX2RlcF9saW5rX3VwLAorCQkucG9saWN5ID0gbmZjX2dlbmxfcG9saWN5LAorCX0sCisJeworCQkuY21kID0gTkZDX0NNRF9ERVBfTElOS19ET1dOLAorCQkuZG9pdCA9IG5mY19nZW5sX2RlcF9saW5rX2Rvd24sCisJCS5wb2xpY3kgPSBuZmNfZ2VubF9wb2xpY3ksCisJfSwKKwl7CiAJCS5jbWQgPSBORkNfQ01EX0dFVF9UQVJHRVQsCiAJCS5kdW1waXQgPSBuZmNfZ2VubF9kdW1wX3RhcmdldHMsCiAJCS5kb25lID0gbmZjX2dlbmxfZHVtcF90YXJnZXRzX2RvbmUsCkBAIC01MjQsMTggKzY0NSwxNiBAQAogCWlmIChldmVudCAhPSBORVRMSU5LX1VSRUxFQVNFIHx8IG4tPnByb3RvY29sICE9IE5FVExJTktfR0VORVJJQykKIAkJZ290byBvdXQ7CiAKLQluZmNfZGJnKCJORVRMSU5LX1VSRUxFQVNFIGV2ZW50IGZyb20gaWQgJWQiLCBuLT5waWQpOworCXByX2RlYnVnKCJORVRMSU5LX1VSRUxFQVNFIGV2ZW50IGZyb20gaWQgJWRcbiIsIG4tPnBpZCk7CiAKIAluZmNfZGV2aWNlX2l0ZXJfaW5pdCgmaXRlcik7CiAJZGV2ID0gbmZjX2RldmljZV9pdGVyX25leHQoJml0ZXIpOwogCiAJd2hpbGUgKGRldikgewotCQltdXRleF9sb2NrKCZkZXYtPmdlbmxfZGF0YS5nZW5sX2RhdGFfbXV0ZXgpOwogCQlpZiAoZGV2LT5nZW5sX2RhdGEucG9sbF9yZXFfcGlkID09IG4tPnBpZCkgewogCQkJbmZjX3N0b3BfcG9sbChkZXYpOwogCQkJZGV2LT5nZW5sX2RhdGEucG9sbF9yZXFfcGlkID0gMDsKIAkJfQotCQltdXRleF91bmxvY2soJmRldi0+Z2VubF9kYXRhLmdlbmxfZGF0YV9tdXRleCk7CiAJCWRldiA9IG5mY19kZXZpY2VfaXRlcl9uZXh0KCZpdGVyKTsKIAl9CiAKZGlmZiAtLWdpdCBhL25ldC9uZmMvbmZjLmggYi9uZXQvbmZjL25mYy5oCmluZGV4IGQ4NjU4M2YuLjZkMjhkNzUgMTAwNjQ0Ci0tLSBhL25ldC9uZmMvbmZjLmgKKysrIGIvbmV0L25mYy9uZmMuaApAQCAtMjcsMTMgKzI3LDYgQEAKICNpbmNsdWRlIDxuZXQvbmZjL25mYy5oPgogI2luY2x1ZGUgPG5ldC9zb2NrLmg+CiAKLV9fcHJpbnRmKDIsIDMpCi1pbnQgbmZjX3ByaW50ayhjb25zdCBjaGFyICpsZXZlbCwgY29uc3QgY2hhciAqZm10LCAuLi4pOwotCi0jZGVmaW5lIG5mY19pbmZvKGZtdCwgYXJnLi4uKSBuZmNfcHJpbnRrKEtFUk5fSU5GTywgZm10LCAjI2FyZykKLSNkZWZpbmUgbmZjX2VycihmbXQsIGFyZy4uLikgbmZjX3ByaW50ayhLRVJOX0VSUiwgZm10LCAjI2FyZykKLSNkZWZpbmUgbmZjX2RiZyhmbXQsIGFyZy4uLikgcHJfZGVidWcoZm10ICJcbiIsICMjYXJnKQotCiBzdHJ1Y3QgbmZjX3Byb3RvY29sIHsKIAlpbnQgaWQ7CiAJc3RydWN0IHByb3RvICpwcm90bzsKQEAgLTUzLDYgKzQ2LDYwIEBACiAjZGVmaW5lIHRvX3Jhd3NvY2tfc2soX3R4X3dvcmspIFwKIAkoKHN0cnVjdCBzb2NrICopIGNvbnRhaW5lcl9vZihfdHhfd29yaywgc3RydWN0IG5mY19yYXdzb2NrLCB0eF93b3JrKSkKIAorI2lmZGVmIENPTkZJR19ORkNfTExDUAorCit2b2lkIG5mY19sbGNwX21hY19pc19kb3duKHN0cnVjdCBuZmNfZGV2ICpkZXYpOwordm9pZCBuZmNfbGxjcF9tYWNfaXNfdXAoc3RydWN0IG5mY19kZXYgKmRldiwgdTMyIHRhcmdldF9pZHgsCisJCQl1OCBjb21tX21vZGUsIHU4IHJmX21vZGUpOworaW50IG5mY19sbGNwX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKK3ZvaWQgbmZjX2xsY3BfdW5yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IG5mY19kZXYgKmRldik7CitpbnQgbmZjX2xsY3Bfc2V0X3JlbW90ZV9nYihzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1OCAqZ2IsIHU4IGdiX2xlbik7Cit1OCAqbmZjX2xsY3BfZ2VuZXJhbF9ieXRlcyhzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1OCAqZ2VuZXJhbF9ieXRlc19sZW4pOworaW50IF9faW5pdCBuZmNfbGxjcF9pbml0KHZvaWQpOwordm9pZCBuZmNfbGxjcF9leGl0KHZvaWQpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgbmZjX2xsY3BfbWFjX2lzX2Rvd24oc3RydWN0IG5mY19kZXYgKmRldikKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5mY19sbGNwX21hY19pc191cChzdHJ1Y3QgbmZjX2RldiAqZGV2LCB1MzIgdGFyZ2V0X2lkeCwKKwkJCXU4IGNvbW1fbW9kZSwgdTggcmZfbW9kZSkKK3sKK30KKworc3RhdGljIGlubGluZSBpbnQgbmZjX2xsY3BfcmVnaXN0ZXJfZGV2aWNlKHN0cnVjdCBuZmNfZGV2ICpkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBuZmNfbGxjcF91bnJlZ2lzdGVyX2RldmljZShzdHJ1Y3QgbmZjX2RldiAqZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCBuZmNfbGxjcF9zZXRfcmVtb3RlX2diKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHU4ICpnYiwgdTggZ2JfbGVuKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHU4ICpuZmNfbGxjcF9nZW5lcmFsX2J5dGVzKHN0cnVjdCBuZmNfZGV2ICpkZXYsIHU4ICpnYl9sZW4pCit7CisJKmdiX2xlbiA9IDA7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5mY19sbGNwX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG5mY19sbGNwX2V4aXQodm9pZCkKK3sKK30KKworI2VuZGlmCisKIGludCBfX2luaXQgcmF3c29ja19pbml0KHZvaWQpOwogdm9pZCByYXdzb2NrX2V4aXQodm9pZCk7CiAKQEAgLTc1LDYgKzEyMiwxMCBAQAogaW50IG5mY19nZW5sX2RldmljZV9hZGRlZChzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKIGludCBuZmNfZ2VubF9kZXZpY2VfcmVtb3ZlZChzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKIAoraW50IG5mY19nZW5sX2RlcF9saW5rX3VwX2V2ZW50KHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiB0YXJnZXRfaWR4LAorCQkJICAgICAgIHU4IGNvbW1fbW9kZSwgdTggcmZfbW9kZSk7CitpbnQgbmZjX2dlbmxfZGVwX2xpbmtfZG93bl9ldmVudChzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKKwogc3RydWN0IG5mY19kZXYgKm5mY19nZXRfZGV2aWNlKHVuc2lnbmVkIGlkeCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBuZmNfcHV0X2RldmljZShzdHJ1Y3QgbmZjX2RldiAqZGV2KQpAQCAtMTA5LDYgKzE2MCwxMSBAQAogCiBpbnQgbmZjX3N0b3BfcG9sbChzdHJ1Y3QgbmZjX2RldiAqZGV2KTsKIAoraW50IG5mY19kZXBfbGlua191cChzdHJ1Y3QgbmZjX2RldiAqZGV2LCBpbnQgdGFyZ2V0X2lkeCwKKwkJCQl1OCBjb21tX21vZGUsIHU4IHJmX21vZGUpOworCitpbnQgbmZjX2RlcF9saW5rX2Rvd24oc3RydWN0IG5mY19kZXYgKmRldik7CisKIGludCBuZmNfYWN0aXZhdGVfdGFyZ2V0KHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiB0YXJnZXRfaWR4LCB1MzIgcHJvdG9jb2wpOwogCiBpbnQgbmZjX2RlYWN0aXZhdGVfdGFyZ2V0KHN0cnVjdCBuZmNfZGV2ICpkZXYsIHUzMiB0YXJnZXRfaWR4KTsKZGlmZiAtLWdpdCBhL25ldC9uZmMvcmF3c29jay5jIGIvbmV0L25mYy9yYXdzb2NrLmMKaW5kZXggZWU3YjJiMy4uMmUyZjhjNiAxMDA2NDQKLS0tIGEvbmV0L25mYy9yYXdzb2NrLmMKKysrIGIvbmV0L25mYy9yYXdzb2NrLmMKQEAgLTIxLDYgKzIxLDggQEAKICAqIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCiAgKi8KIAorI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAlczogIiBmbXQsIF9fZnVuY19fCisKICNpbmNsdWRlIDxuZXQvdGNwX3N0YXRlcy5oPgogI2luY2x1ZGUgPGxpbnV4L25mYy5oPgogI2luY2x1ZGUgPGxpbnV4L2V4cG9ydC5oPgpAQCAtMjksNyArMzEsNyBAQAogCiBzdGF0aWMgdm9pZCByYXdzb2NrX3dyaXRlX3F1ZXVlX3B1cmdlKHN0cnVjdCBzb2NrICpzaykKIHsKLQluZmNfZGJnKCJzaz0lcCIsIHNrKTsKKwlwcl9kZWJ1Zygic2s9JXBcbiIsIHNrKTsKIAogCXNwaW5fbG9ja19iaCgmc2stPnNrX3dyaXRlX3F1ZXVlLmxvY2spOwogCV9fc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfd3JpdGVfcXVldWUpOwpAQCAtMzksNyArNDEsNyBAQAogCiBzdGF0aWMgdm9pZCByYXdzb2NrX3JlcG9ydF9lcnJvcihzdHJ1Y3Qgc29jayAqc2ssIGludCBlcnIpCiB7Ci0JbmZjX2RiZygic2s9JXAgZXJyPSVkIiwgc2ssIGVycik7CisJcHJfZGVidWcoInNrPSVwIGVycj0lZFxuIiwgc2ssIGVycik7CiAKIAlzay0+c2tfc2h1dGRvd24gPSBTSFVURE9XTl9NQVNLOwogCXNrLT5za19lcnIgPSAtZXJyOwpAQCAtNTIsNyArNTQsNyBAQAogewogCXN0cnVjdCBzb2NrICpzayA9IHNvY2stPnNrOwogCi0JbmZjX2RiZygic29jaz0lcCIsIHNvY2spOworCXByX2RlYnVnKCJzb2NrPSVwXG4iLCBzb2NrKTsKIAogCXNvY2tfb3JwaGFuKHNrKTsKIAlzb2NrX3B1dChzayk7CkBAIC02OCwxNCArNzAsMTQgQEAKIAlzdHJ1Y3QgbmZjX2RldiAqZGV2OwogCWludCByYyA9IDA7CiAKLQluZmNfZGJnKCJzb2NrPSVwIHNrPSVwIGZsYWdzPSVkIiwgc29jaywgc2ssIGZsYWdzKTsKKwlwcl9kZWJ1Zygic29jaz0lcCBzaz0lcCBmbGFncz0lZFxuIiwgc29jaywgc2ssIGZsYWdzKTsKIAogCWlmICghYWRkciB8fCBsZW4gPCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX25mYykgfHwKIAkJYWRkci0+c2FfZmFtaWx5ICE9IEFGX05GQykKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQluZmNfZGJnKCJhZGRyIGRldl9pZHg9JXUgdGFyZ2V0X2lkeD0ldSBwcm90b2NvbD0ldSIsIGFkZHItPmRldl9pZHgsCi0JCQkJCWFkZHItPnRhcmdldF9pZHgsIGFkZHItPm5mY19wcm90b2NvbCk7CisJcHJfZGVidWcoImFkZHIgZGV2X2lkeD0ldSB0YXJnZXRfaWR4PSV1IHByb3RvY29sPSV1XG4iLAorCQkgYWRkci0+ZGV2X2lkeCwgYWRkci0+dGFyZ2V0X2lkeCwgYWRkci0+bmZjX3Byb3RvY29sKTsKIAogCWxvY2tfc29jayhzayk7CiAKQEAgLTEzNiw3ICsxMzgsNyBAQAogCiAJQlVHX09OKGluX2lycSgpKTsKIAotCW5mY19kYmcoInNrPSVwIGVycj0lZCIsIHNrLCBlcnIpOworCXByX2RlYnVnKCJzaz0lcCBlcnI9JWRcbiIsIHNrLCBlcnIpOwogCiAJaWYgKGVycikKIAkJZ290byBlcnJvcjsKQEAgLTE3Miw3ICsxNzQsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJaW50IHJjOwogCi0JbmZjX2RiZygic2s9JXAgdGFyZ2V0X2lkeD0ldSIsIHNrLCB0YXJnZXRfaWR4KTsKKwlwcl9kZWJ1Zygic2s9JXAgdGFyZ2V0X2lkeD0ldVxuIiwgc2ssIHRhcmdldF9pZHgpOwogCiAJaWYgKHNrLT5za19zaHV0ZG93biAmIFNFTkRfU0hVVERPV04pIHsKIAkJcmF3c29ja193cml0ZV9xdWV1ZV9wdXJnZShzayk7CkBAIC0xOTgsNyArMjAwLDcgQEAKIAlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwogCWludCByYzsKIAotCW5mY19kYmcoInNvY2s9JXAgc2s9JXAgbGVuPSV6dSIsIHNvY2ssIHNrLCBsZW4pOworCXByX2RlYnVnKCJzb2NrPSVwIHNrPSVwIGxlbj0lenVcbiIsIHNvY2ssIHNrLCBsZW4pOwogCiAJaWYgKG1zZy0+bXNnX25hbWVsZW4pCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTIwNiwxMyArMjA4LDEwIEBACiAJaWYgKHNvY2stPnN0YXRlICE9IFNTX0NPTk5FQ1RFRCkKIAkJcmV0dXJuIC1FTk9UQ09OTjsKIAotCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2Ioc2ssIGxlbiArIGRldi0+dHhfaGVhZHJvb20gKyBkZXYtPnR4X3RhaWxyb29tICsgTkZDX0hFQURFUl9TSVpFLAotCQkJCQltc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJnJjKTsKLQlpZiAoIXNrYikKKwlza2IgPSBuZmNfYWxsb2Nfc2VuZF9za2IoZGV2LCBzaywgbXNnLT5tc2dfZmxhZ3MsIGxlbiwgJnJjKTsKKwlpZiAoc2tiID09IE5VTEwpCiAJCXJldHVybiByYzsKIAotCXNrYl9yZXNlcnZlKHNrYiwgZGV2LT50eF9oZWFkcm9vbSArIE5GQ19IRUFERVJfU0laRSk7Ci0KIAlyYyA9IG1lbWNweV9mcm9taW92ZWMoc2tiX3B1dChza2IsIGxlbiksIG1zZy0+bXNnX2lvdiwgbGVuKTsKIAlpZiAocmMgPCAwKSB7CiAJCWtmcmVlX3NrYihza2IpOwpAQCAtMjM5LDcgKzIzOCw3IEBACiAJaW50IGNvcGllZDsKIAlpbnQgcmM7CiAKLQluZmNfZGJnKCJzb2NrPSVwIHNrPSVwIGxlbj0lenUgZmxhZ3M9JWQiLCBzb2NrLCBzaywgbGVuLCBmbGFncyk7CisJcHJfZGVidWcoInNvY2s9JXAgc2s9JXAgbGVuPSV6dSBmbGFncz0lZFxuIiwgc29jaywgc2ssIGxlbiwgZmxhZ3MpOwogCiAJc2tiID0gc2tiX3JlY3ZfZGF0YWdyYW0oc2ssIGZsYWdzLCBub2Jsb2NrLCAmcmMpOwogCWlmICghc2tiKQpAQCAtMjgzLDcgKzI4Miw3IEBACiAKIHN0YXRpYyB2b2lkIHJhd3NvY2tfZGVzdHJ1Y3Qoc3RydWN0IHNvY2sgKnNrKQogewotCW5mY19kYmcoInNrPSVwIiwgc2spOworCXByX2RlYnVnKCJzaz0lcFxuIiwgc2spOwogCiAJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfRVNUQUJMSVNIRUQpIHsKIAkJbmZjX2RlYWN0aXZhdGVfdGFyZ2V0KG5mY19yYXdzb2NrKHNrKS0+ZGV2LApAQCAtMjk0LDcgKzI5Myw3IEBACiAJc2tiX3F1ZXVlX3B1cmdlKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CiAKIAlpZiAoIXNvY2tfZmxhZyhzaywgU09DS19ERUFEKSkgewotCQluZmNfZXJyKCJGcmVlaW5nIGFsaXZlIE5GQyByYXcgc29ja2V0ICVwIiwgc2spOworCQlwcl9lcnIoIkZyZWVpbmcgYWxpdmUgTkZDIHJhdyBzb2NrZXQgJXBcbiIsIHNrKTsKIAkJcmV0dXJuOwogCX0KIH0KQEAgLTMwNCwxNCArMzAzLDE0IEBACiB7CiAJc3RydWN0IHNvY2sgKnNrOwogCi0JbmZjX2RiZygic29jaz0lcCIsIHNvY2spOworCXByX2RlYnVnKCJzb2NrPSVwXG4iLCBzb2NrKTsKIAogCWlmIChzb2NrLT50eXBlICE9IFNPQ0tfU0VRUEFDS0VUKQogCQlyZXR1cm4gLUVTT0NLVE5PU1VQUE9SVDsKIAogCXNvY2stPm9wcyA9ICZyYXdzb2NrX29wczsKIAotCXNrID0gc2tfYWxsb2MobmV0LCBQRl9ORkMsIEdGUF9LRVJORUwsIG5mY19wcm90by0+cHJvdG8pOworCXNrID0gc2tfYWxsb2MobmV0LCBQRl9ORkMsIEdGUF9BVE9NSUMsIG5mY19wcm90by0+cHJvdG8pOwogCWlmICghc2spCiAJCXJldHVybiAtRU5PTUVNOwogCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvS2NvbmZpZyBiL25ldC9vcGVudnN3aXRjaC9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZWEzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvS2NvbmZpZwpAQCAtMCwwICsxLDI4IEBACisjCisjIE9wZW4gdlN3aXRjaAorIworCitjb25maWcgT1BFTlZTV0lUQ0gKKwl0cmlzdGF0ZSAiT3BlbiB2U3dpdGNoIgorCS0tLWhlbHAtLS0KKwkgIE9wZW4gdlN3aXRjaCBpcyBhIG11bHRpbGF5ZXIgRXRoZXJuZXQgc3dpdGNoIHRhcmdldGVkIGF0IHZpcnR1YWxpemVkCisJICBlbnZpcm9ubWVudHMuICBJbiBhZGRpdGlvbiB0byBzdXBwb3J0aW5nIGEgdmFyaWV0eSBvZiBmZWF0dXJlcworCSAgZXhwZWN0ZWQgaW4gYSB0cmFkaXRpb25hbCBoYXJkd2FyZSBzd2l0Y2gsIGl0IGVuYWJsZXMgZmluZS1ncmFpbmVkCisJICBwcm9ncmFtbWF0aWMgZXh0ZW5zaW9uIGFuZCBmbG93LWJhc2VkIGNvbnRyb2wgb2YgdGhlIG5ldHdvcmsuICBUaGlzCisJICBjb250cm9sIGlzIHVzZWZ1bCBpbiBhIHdpZGUgdmFyaWV0eSBvZiBhcHBsaWNhdGlvbnMgYnV0IGlzCisJICBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGluIG11bHRpLXNlcnZlciB2aXJ0dWFsaXphdGlvbiBkZXBsb3ltZW50cywKKwkgIHdoaWNoIGFyZSBvZnRlbiBjaGFyYWN0ZXJpemVkIGJ5IGhpZ2hseSBkeW5hbWljIGVuZHBvaW50cyBhbmQgdGhlCisJICBuZWVkIHRvIG1haW50YWluIGxvZ2ljYWwgYWJzdHJhY3Rpb25zIGZvciBtdWx0aXBsZSB0ZW5hbnRzLgorCisJICBUaGUgT3BlbiB2U3dpdGNoIGRhdGFwYXRoIHByb3ZpZGVzIGFuIGluLWtlcm5lbCBmYXN0IHBhdGggZm9yIHBhY2tldAorCSAgZm9yd2FyZGluZy4gIEl0IGlzIGNvbXBsZW1lbnRlZCBieSBhIHVzZXJzcGFjZSBkYWVtb24sIG92cy12c3dpdGNoZCwKKwkgIHdoaWNoIGlzIGFibGUgdG8gYWNjZXB0IGNvbmZpZ3VyYXRpb24gZnJvbSBhIHZhcmlldHkgb2Ygc291cmNlcyBhbmQKKwkgIHRyYW5zbGF0ZSBpdCBpbnRvIHBhY2tldCBwcm9jZXNzaW5nIHJ1bGVzLgorCisJICBTZWUgaHR0cDovL29wZW52c3dpdGNoLm9yZyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgdXNlcnNwYWNlCisJICB1dGlsaXRpZXMuCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBjb2RlIGFzIGEgbW9kdWxlLCBjaG9vc2UgTSBoZXJlOiB0aGUgbW9kdWxlIHdpbGwgYmUKKwkgIGNhbGxlZCBvcGVudnN3aXRjaC4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9NYWtlZmlsZSBiL25ldC9vcGVudnN3aXRjaC9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWU3Mzg0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L29wZW52c3dpdGNoL01ha2VmaWxlCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgTWFrZWZpbGUgZm9yIE9wZW4gdlN3aXRjaC4KKyMKKworb2JqLSQoQ09ORklHX09QRU5WU1dJVENIKSArPSBvcGVudnN3aXRjaC5vCisKK29wZW52c3dpdGNoLXkgOj0gXAorCWFjdGlvbnMubyBcCisJZGF0YXBhdGgubyBcCisJZHBfbm90aWZ5Lm8gXAorCWZsb3cubyBcCisJdnBvcnQubyBcCisJdnBvcnQtaW50ZXJuYWxfZGV2Lm8gXAorCXZwb3J0LW5ldGRldi5vIFwKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9hY3Rpb25zLmMgYi9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MjVkMWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvYWN0aW9ucy5jCkBAIC0wLDAgKzEsNDE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTEgTmljaXJhIE5ldHdvcmtzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKi8KKworI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAorCisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvaW4uaD4KKyNpbmNsdWRlIDxsaW51eC9pcC5oPgorI2luY2x1ZGUgPGxpbnV4L29wZW52c3dpdGNoLmg+CisjaW5jbHVkZSA8bGludXgvdGNwLmg+CisjaW5jbHVkZSA8bGludXgvdWRwLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgorI2luY2x1ZGUgPG5ldC9kc2ZpZWxkLmg+CisKKyNpbmNsdWRlICJkYXRhcGF0aC5oIgorI2luY2x1ZGUgInZwb3J0LmgiCisKK3N0YXRpYyBpbnQgZG9fZXhlY3V0ZV9hY3Rpb25zKHN0cnVjdCBkYXRhcGF0aCAqZHAsIHN0cnVjdCBza19idWZmICpza2IsCisJCQljb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyLCBpbnQgbGVuLCBib29sIGtlZXBfc2tiKTsKKworc3RhdGljIGludCBtYWtlX3dyaXRhYmxlKHN0cnVjdCBza19idWZmICpza2IsIGludCB3cml0ZV9sZW4pCit7CisJaWYgKCFza2JfY2xvbmVkKHNrYikgfHwgc2tiX2Nsb25lX3dyaXRhYmxlKHNrYiwgd3JpdGVfbGVuKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcHNrYl9leHBhbmRfaGVhZChza2IsIDAsIDAsIEdGUF9BVE9NSUMpOworfQorCisvKiByZW1vdmUgVkxBTiBoZWFkZXIgZnJvbSBwYWNrZXQgYW5kIHVwZGF0ZSBjc3VtIGFjY3JvZGluZ2x5LiAqLworc3RhdGljIGludCBfX3BvcF92bGFuX3RjaShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBfX2JlMTYgKmN1cnJlbnRfdGNpKQoreworCXN0cnVjdCB2bGFuX2hkciAqdmhkcjsKKwlpbnQgZXJyOworCisJZXJyID0gbWFrZV93cml0YWJsZShza2IsIFZMQU5fRVRIX0hMRU4pOworCWlmICh1bmxpa2VseShlcnIpKQorCQlyZXR1cm4gZXJyOworCisJaWYgKHNrYi0+aXBfc3VtbWVkID09IENIRUNLU1VNX0NPTVBMRVRFKQorCQlza2ItPmNzdW0gPSBjc3VtX3N1Yihza2ItPmNzdW0sIGNzdW1fcGFydGlhbChza2ItPmRhdGEKKwkJCQkJKyBFVEhfSExFTiwgVkxBTl9ITEVOLCAwKSk7CisKKwl2aGRyID0gKHN0cnVjdCB2bGFuX2hkciAqKShza2ItPmRhdGEgKyBFVEhfSExFTik7CisJKmN1cnJlbnRfdGNpID0gdmhkci0+aF92bGFuX1RDSTsKKworCW1lbW1vdmUoc2tiLT5kYXRhICsgVkxBTl9ITEVOLCBza2ItPmRhdGEsIDIgKiBFVEhfQUxFTik7CisJX19za2JfcHVsbChza2IsIFZMQU5fSExFTik7CisKKwl2bGFuX3NldF9lbmNhcF9wcm90byhza2IsIHZoZHIpOworCXNrYi0+bWFjX2hlYWRlciArPSBWTEFOX0hMRU47CisJc2tiX3Jlc2V0X21hY19sZW4oc2tiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvcF92bGFuKHN0cnVjdCBza19idWZmICpza2IpCit7CisJX19iZTE2IHRjaTsKKwlpbnQgZXJyOworCisJaWYgKGxpa2VseSh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpKSB7CisJCXNrYi0+dmxhbl90Y2kgPSAwOworCX0gZWxzZSB7CisJCWlmICh1bmxpa2VseShza2ItPnByb3RvY29sICE9IGh0b25zKEVUSF9QXzgwMjFRKSB8fAorCQkJICAgICBza2ItPmxlbiA8IFZMQU5fRVRIX0hMRU4pKQorCQkJcmV0dXJuIDA7CisKKwkJZXJyID0gX19wb3Bfdmxhbl90Y2koc2tiLCAmdGNpKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJfQorCS8qIG1vdmUgbmV4dCB2bGFuIHRhZyB0byBodyBhY2NlbCB0YWcgKi8KKwlpZiAobGlrZWx5KHNrYi0+cHJvdG9jb2wgIT0gaHRvbnMoRVRIX1BfODAyMVEpIHx8CisJCSAgIHNrYi0+bGVuIDwgVkxBTl9FVEhfSExFTikpCisJCXJldHVybiAwOworCisJZXJyID0gX19wb3Bfdmxhbl90Y2koc2tiLCAmdGNpKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJcmV0dXJuIGVycjsKKworCV9fdmxhbl9od2FjY2VsX3B1dF90YWcoc2tiLCBudG9ocyh0Y2kpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwdXNoX3ZsYW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IG92c19hY3Rpb25fcHVzaF92bGFuICp2bGFuKQoreworCWlmICh1bmxpa2VseSh2bGFuX3R4X3RhZ19wcmVzZW50KHNrYikpKSB7CisJCXUxNiBjdXJyZW50X3RhZzsKKworCQkvKiBwdXNoIGRvd24gY3VycmVudCBWTEFOIHRhZyAqLworCQljdXJyZW50X3RhZyA9IHZsYW5fdHhfdGFnX2dldChza2IpOworCisJCWlmICghX192bGFuX3B1dF90YWcoc2tiLCBjdXJyZW50X3RhZykpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlpZiAoc2tiLT5pcF9zdW1tZWQgPT0gQ0hFQ0tTVU1fQ09NUExFVEUpCisJCQlza2ItPmNzdW0gPSBjc3VtX2FkZChza2ItPmNzdW0sIGNzdW1fcGFydGlhbChza2ItPmRhdGEKKwkJCQkJKyBFVEhfSExFTiwgVkxBTl9ITEVOLCAwKSk7CisKKwl9CisJX192bGFuX2h3YWNjZWxfcHV0X3RhZyhza2IsIG50b2hzKHZsYW4tPnZsYW5fdGNpKSAmIH5WTEFOX1RBR19QUkVTRU5UKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfZXRoX2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCWNvbnN0IHN0cnVjdCBvdnNfa2V5X2V0aGVybmV0ICpldGhfa2V5KQoreworCWludCBlcnI7CisJZXJyID0gbWFrZV93cml0YWJsZShza2IsIEVUSF9ITEVOKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJcmV0dXJuIGVycjsKKworCW1lbWNweShldGhfaGRyKHNrYiktPmhfc291cmNlLCBldGhfa2V5LT5ldGhfc3JjLCBFVEhfQUxFTik7CisJbWVtY3B5KGV0aF9oZHIoc2tiKS0+aF9kZXN0LCBldGhfa2V5LT5ldGhfZHN0LCBFVEhfQUxFTik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2V0X2lwX2FkZHIoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwaGRyICpuaCwKKwkJCQlfX2JlMzIgKmFkZHIsIF9fYmUzMiBuZXdfYWRkcikKK3sKKwlpbnQgdHJhbnNwb3J0X2xlbiA9IHNrYi0+bGVuIC0gc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKTsKKworCWlmIChuaC0+cHJvdG9jb2wgPT0gSVBQUk9UT19UQ1ApIHsKKwkJaWYgKGxpa2VseSh0cmFuc3BvcnRfbGVuID49IHNpemVvZihzdHJ1Y3QgdGNwaGRyKSkpCisJCQlpbmV0X3Byb3RvX2NzdW1fcmVwbGFjZTQoJnRjcF9oZHIoc2tiKS0+Y2hlY2ssIHNrYiwKKwkJCQkJCSAqYWRkciwgbmV3X2FkZHIsIDEpOworCX0gZWxzZSBpZiAobmgtPnByb3RvY29sID09IElQUFJPVE9fVURQKSB7CisJCWlmIChsaWtlbHkodHJhbnNwb3J0X2xlbiA+PSBzaXplb2Yoc3RydWN0IHVkcGhkcikpKQorCQkJaW5ldF9wcm90b19jc3VtX3JlcGxhY2U0KCZ1ZHBfaGRyKHNrYiktPmNoZWNrLCBza2IsCisJCQkJCQkgKmFkZHIsIG5ld19hZGRyLCAxKTsKKwl9CisKKwljc3VtX3JlcGxhY2U0KCZuaC0+Y2hlY2ssICphZGRyLCBuZXdfYWRkcik7CisJc2tiLT5yeGhhc2ggPSAwOworCSphZGRyID0gbmV3X2FkZHI7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9pcF90dGwoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGlwaGRyICpuaCwgdTggbmV3X3R0bCkKK3sKKwljc3VtX3JlcGxhY2UyKCZuaC0+Y2hlY2ssIGh0b25zKG5oLT50dGwgPDwgOCksIGh0b25zKG5ld190dGwgPDwgOCkpOworCW5oLT50dGwgPSBuZXdfdHRsOworfQorCitzdGF0aWMgaW50IHNldF9pcHY0KHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBvdnNfa2V5X2lwdjQgKmlwdjRfa2V5KQoreworCXN0cnVjdCBpcGhkciAqbmg7CisJaW50IGVycjsKKworCWVyciA9IG1ha2Vfd3JpdGFibGUoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSArCisJCQkJIHNpemVvZihzdHJ1Y3QgaXBoZHIpKTsKKwlpZiAodW5saWtlbHkoZXJyKSkKKwkJcmV0dXJuIGVycjsKKworCW5oID0gaXBfaGRyKHNrYik7CisKKwlpZiAoaXB2NF9rZXktPmlwdjRfc3JjICE9IG5oLT5zYWRkcikKKwkJc2V0X2lwX2FkZHIoc2tiLCBuaCwgJm5oLT5zYWRkciwgaXB2NF9rZXktPmlwdjRfc3JjKTsKKworCWlmIChpcHY0X2tleS0+aXB2NF9kc3QgIT0gbmgtPmRhZGRyKQorCQlzZXRfaXBfYWRkcihza2IsIG5oLCAmbmgtPmRhZGRyLCBpcHY0X2tleS0+aXB2NF9kc3QpOworCisJaWYgKGlwdjRfa2V5LT5pcHY0X3RvcyAhPSBuaC0+dG9zKQorCQlpcHY0X2NoYW5nZV9kc2ZpZWxkKG5oLCAwLCBpcHY0X2tleS0+aXB2NF90b3MpOworCisJaWYgKGlwdjRfa2V5LT5pcHY0X3R0bCAhPSBuaC0+dHRsKQorCQlzZXRfaXBfdHRsKHNrYiwgbmgsIGlwdjRfa2V5LT5pcHY0X3R0bCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTXVzdCBmb2xsb3cgbWFrZV93cml0YWJsZSgpIHNpbmNlIHRoYXQgY2FuIG1vdmUgdGhlIHNrYiBkYXRhLiAqLworc3RhdGljIHZvaWQgc2V0X3RwX3BvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgX19iZTE2ICpwb3J0LAorCQkJIF9fYmUxNiBuZXdfcG9ydCwgX19zdW0xNiAqY2hlY2spCit7CisJaW5ldF9wcm90b19jc3VtX3JlcGxhY2UyKGNoZWNrLCBza2IsICpwb3J0LCBuZXdfcG9ydCwgMCk7CisJKnBvcnQgPSBuZXdfcG9ydDsKKwlza2ItPnJ4aGFzaCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3VkcF9wb3J0KHN0cnVjdCBza19idWZmICpza2IsCisJCQljb25zdCBzdHJ1Y3Qgb3ZzX2tleV91ZHAgKnVkcF9wb3J0X2tleSkKK3sKKwlzdHJ1Y3QgdWRwaGRyICp1aDsKKwlpbnQgZXJyOworCisJZXJyID0gbWFrZV93cml0YWJsZShza2IsIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKworCQkJCSBzaXplb2Yoc3RydWN0IHVkcGhkcikpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlyZXR1cm4gZXJyOworCisJdWggPSB1ZHBfaGRyKHNrYik7CisJaWYgKHVkcF9wb3J0X2tleS0+dWRwX3NyYyAhPSB1aC0+c291cmNlKQorCQlzZXRfdHBfcG9ydChza2IsICZ1aC0+c291cmNlLCB1ZHBfcG9ydF9rZXktPnVkcF9zcmMsICZ1aC0+Y2hlY2spOworCisJaWYgKHVkcF9wb3J0X2tleS0+dWRwX2RzdCAhPSB1aC0+ZGVzdCkKKwkJc2V0X3RwX3BvcnQoc2tiLCAmdWgtPmRlc3QsIHVkcF9wb3J0X2tleS0+dWRwX2RzdCwgJnVoLT5jaGVjayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfdGNwX3BvcnQoc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCWNvbnN0IHN0cnVjdCBvdnNfa2V5X3RjcCAqdGNwX3BvcnRfa2V5KQoreworCXN0cnVjdCB0Y3BoZHIgKnRoOworCWludCBlcnI7CisKKwllcnIgPSBtYWtlX3dyaXRhYmxlKHNrYiwgc2tiX3RyYW5zcG9ydF9vZmZzZXQoc2tiKSArCisJCQkJIHNpemVvZihzdHJ1Y3QgdGNwaGRyKSk7CisJaWYgKHVubGlrZWx5KGVycikpCisJCXJldHVybiBlcnI7CisKKwl0aCA9IHRjcF9oZHIoc2tiKTsKKwlpZiAodGNwX3BvcnRfa2V5LT50Y3Bfc3JjICE9IHRoLT5zb3VyY2UpCisJCXNldF90cF9wb3J0KHNrYiwgJnRoLT5zb3VyY2UsIHRjcF9wb3J0X2tleS0+dGNwX3NyYywgJnRoLT5jaGVjayk7CisKKwlpZiAodGNwX3BvcnRfa2V5LT50Y3BfZHN0ICE9IHRoLT5kZXN0KQorCQlzZXRfdHBfcG9ydChza2IsICZ0aC0+ZGVzdCwgdGNwX3BvcnRfa2V5LT50Y3BfZHN0LCAmdGgtPmNoZWNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX291dHB1dChzdHJ1Y3QgZGF0YXBhdGggKmRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgb3V0X3BvcnQpCit7CisJc3RydWN0IHZwb3J0ICp2cG9ydDsKKworCWlmICh1bmxpa2VseSghc2tiKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl2cG9ydCA9IHJjdV9kZXJlZmVyZW5jZShkcC0+cG9ydHNbb3V0X3BvcnRdKTsKKwlpZiAodW5saWtlbHkoIXZwb3J0KSkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJb3ZzX3Zwb3J0X3NlbmQodnBvcnQsIHNrYik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3V0cHV0X3VzZXJzcGFjZShzdHJ1Y3QgZGF0YXBhdGggKmRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIpCit7CisJc3RydWN0IGRwX3VwY2FsbF9pbmZvIHVwY2FsbDsKKwljb25zdCBzdHJ1Y3QgbmxhdHRyICphOworCWludCByZW07CisKKwl1cGNhbGwuY21kID0gT1ZTX1BBQ0tFVF9DTURfQUNUSU9OOworCXVwY2FsbC5rZXkgPSAmT1ZTX0NCKHNrYiktPmZsb3ctPmtleTsKKwl1cGNhbGwudXNlcmRhdGEgPSBOVUxMOworCXVwY2FsbC5waWQgPSAwOworCisJZm9yIChhID0gbmxhX2RhdGEoYXR0ciksIHJlbSA9IG5sYV9sZW4oYXR0cik7IHJlbSA+IDA7CisJCSBhID0gbmxhX25leHQoYSwgJnJlbSkpIHsKKwkJc3dpdGNoIChubGFfdHlwZShhKSkgeworCQljYXNlIE9WU19VU0VSU1BBQ0VfQVRUUl9VU0VSREFUQToKKwkJCXVwY2FsbC51c2VyZGF0YSA9IGE7CisJCQlicmVhazsKKworCQljYXNlIE9WU19VU0VSU1BBQ0VfQVRUUl9QSUQ6CisJCQl1cGNhbGwucGlkID0gbmxhX2dldF91MzIoYSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBvdnNfZHBfdXBjYWxsKGRwLCBza2IsICZ1cGNhbGwpOworfQorCitzdGF0aWMgaW50IHNhbXBsZShzdHJ1Y3QgZGF0YXBhdGggKmRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIpCit7CisJY29uc3Qgc3RydWN0IG5sYXR0ciAqYWN0c19saXN0ID0gTlVMTDsKKwljb25zdCBzdHJ1Y3QgbmxhdHRyICphOworCWludCByZW07CisKKwlmb3IgKGEgPSBubGFfZGF0YShhdHRyKSwgcmVtID0gbmxhX2xlbihhdHRyKTsgcmVtID4gMDsKKwkJIGEgPSBubGFfbmV4dChhLCAmcmVtKSkgeworCQlzd2l0Y2ggKG5sYV90eXBlKGEpKSB7CisJCWNhc2UgT1ZTX1NBTVBMRV9BVFRSX1BST0JBQklMSVRZOgorCQkJaWYgKG5ldF9yYW5kb20oKSA+PSBubGFfZ2V0X3UzMihhKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWJyZWFrOworCisJCWNhc2UgT1ZTX1NBTVBMRV9BVFRSX0FDVElPTlM6CisJCQlhY3RzX2xpc3QgPSBhOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gZG9fZXhlY3V0ZV9hY3Rpb25zKGRwLCBza2IsIG5sYV9kYXRhKGFjdHNfbGlzdCksCisJCQkJCQkgbmxhX2xlbihhY3RzX2xpc3QpLCB0cnVlKTsKK30KKworc3RhdGljIGludCBleGVjdXRlX3NldF9hY3Rpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkJCQkgY29uc3Qgc3RydWN0IG5sYXR0ciAqbmVzdGVkX2F0dHIpCit7CisJaW50IGVyciA9IDA7CisKKwlzd2l0Y2ggKG5sYV90eXBlKG5lc3RlZF9hdHRyKSkgeworCWNhc2UgT1ZTX0tFWV9BVFRSX1BSSU9SSVRZOgorCQlza2ItPnByaW9yaXR5ID0gbmxhX2dldF91MzIobmVzdGVkX2F0dHIpOworCQlicmVhazsKKworCWNhc2UgT1ZTX0tFWV9BVFRSX0VUSEVSTkVUOgorCQllcnIgPSBzZXRfZXRoX2FkZHIoc2tiLCBubGFfZGF0YShuZXN0ZWRfYXR0cikpOworCQlicmVhazsKKworCWNhc2UgT1ZTX0tFWV9BVFRSX0lQVjQ6CisJCWVyciA9IHNldF9pcHY0KHNrYiwgbmxhX2RhdGEobmVzdGVkX2F0dHIpKTsKKwkJYnJlYWs7CisKKwljYXNlIE9WU19LRVlfQVRUUl9UQ1A6CisJCWVyciA9IHNldF90Y3BfcG9ydChza2IsIG5sYV9kYXRhKG5lc3RlZF9hdHRyKSk7CisJCWJyZWFrOworCisJY2FzZSBPVlNfS0VZX0FUVFJfVURQOgorCQllcnIgPSBzZXRfdWRwX3BvcnQoc2tiLCBubGFfZGF0YShuZXN0ZWRfYXR0cikpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCisvKiBFeGVjdXRlIGEgbGlzdCBvZiBhY3Rpb25zIGFnYWluc3QgJ3NrYicuICovCitzdGF0aWMgaW50IGRvX2V4ZWN1dGVfYWN0aW9ucyhzdHJ1Y3QgZGF0YXBhdGggKmRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwgaW50IGxlbiwgYm9vbCBrZWVwX3NrYikKK3sKKwkvKiBFdmVyeSBvdXRwdXQgYWN0aW9uIG5lZWRzIGEgc2VwYXJhdGUgY2xvbmUgb2YgJ3NrYicsIGJ1dCB0aGUgY29tbW9uCisJICogY2FzZSBpcyBqdXN0IGEgc2luZ2xlIG91dHB1dCBhY3Rpb24sIHNvIHRoYXQgZG9pbmcgYSBjbG9uZSBhbmQKKwkgKiB0aGVuIGZyZWVpbmcgdGhlIG9yaWdpbmFsIHNrYnVmZiBpcyB3YXN0ZWZ1bC4gIFNvIHRoZSBmb2xsb3dpbmcgY29kZQorCSAqIGlzIHNsaWdodGx5IG9ic2N1cmUganVzdCB0byBhdm9pZCB0aGF0LiAqLworCWludCBwcmV2X3BvcnQgPSAtMTsKKwljb25zdCBzdHJ1Y3QgbmxhdHRyICphOworCWludCByZW07CisKKwlmb3IgKGEgPSBhdHRyLCByZW0gPSBsZW47IHJlbSA+IDA7CisJICAgICBhID0gbmxhX25leHQoYSwgJnJlbSkpIHsKKwkJaW50IGVyciA9IDA7CisKKwkJaWYgKHByZXZfcG9ydCAhPSAtMSkgeworCQkJZG9fb3V0cHV0KGRwLCBza2JfY2xvbmUoc2tiLCBHRlBfQVRPTUlDKSwgcHJldl9wb3J0KTsKKwkJCXByZXZfcG9ydCA9IC0xOworCQl9CisKKwkJc3dpdGNoIChubGFfdHlwZShhKSkgeworCQljYXNlIE9WU19BQ1RJT05fQVRUUl9PVVRQVVQ6CisJCQlwcmV2X3BvcnQgPSBubGFfZ2V0X3UzMihhKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT1ZTX0FDVElPTl9BVFRSX1VTRVJTUEFDRToKKwkJCW91dHB1dF91c2Vyc3BhY2UoZHAsIHNrYiwgYSk7CisJCQlicmVhazsKKworCQljYXNlIE9WU19BQ1RJT05fQVRUUl9QVVNIX1ZMQU46CisJCQllcnIgPSBwdXNoX3ZsYW4oc2tiLCBubGFfZGF0YShhKSk7CisJCQlpZiAodW5saWtlbHkoZXJyKSkgLyogc2tiIGFscmVhZHkgZnJlZWQuICovCisJCQkJcmV0dXJuIGVycjsKKwkJCWJyZWFrOworCisJCWNhc2UgT1ZTX0FDVElPTl9BVFRSX1BPUF9WTEFOOgorCQkJZXJyID0gcG9wX3ZsYW4oc2tiKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT1ZTX0FDVElPTl9BVFRSX1NFVDoKKwkJCWVyciA9IGV4ZWN1dGVfc2V0X2FjdGlvbihza2IsIG5sYV9kYXRhKGEpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT1ZTX0FDVElPTl9BVFRSX1NBTVBMRToKKwkJCWVyciA9IHNhbXBsZShkcCwgc2tiLCBhKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHVubGlrZWx5KGVycikpIHsKKwkJCWtmcmVlX3NrYihza2IpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKworCWlmIChwcmV2X3BvcnQgIT0gLTEpIHsKKwkJaWYgKGtlZXBfc2tiKQorCQkJc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisKKwkJZG9fb3V0cHV0KGRwLCBza2IsIHByZXZfcG9ydCk7CisJfSBlbHNlIGlmICgha2VlcF9za2IpCisJCWNvbnN1bWVfc2tiKHNrYik7CisKKwlyZXR1cm4gMDsKK30KKworLyogRXhlY3V0ZSBhIGxpc3Qgb2YgYWN0aW9ucyBhZ2FpbnN0ICdza2InLiAqLworaW50IG92c19leGVjdXRlX2FjdGlvbnMoc3RydWN0IGRhdGFwYXRoICpkcCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zICphY3RzID0gcmN1X2RlcmVmZXJlbmNlKE9WU19DQihza2IpLT5mbG93LT5zZl9hY3RzKTsKKworCXJldHVybiBkb19leGVjdXRlX2FjdGlvbnMoZHAsIHNrYiwgYWN0cy0+YWN0aW9ucywKKwkJCQkJIGFjdHMtPmFjdGlvbnNfbGVuLCBmYWxzZSk7Cit9CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYyBiL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjcyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguYwpAQCAtMCwwICsxLDE5MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMSBOaWNpcmEgTmV0d29ya3MuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvaXAuaD4KKyNpbmNsdWRlIDxsaW51eC9qaGFzaC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZ2VuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC90Y3AuaD4KKyNpbmNsdWRlIDxsaW51eC91ZHAuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2RpdjY0Lmg+CisjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlcl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXJfaXB2NC5oPgorI2luY2x1ZGUgPGxpbnV4L2luZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvb3BlbnZzd2l0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvZG1pLmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorCisjaW5jbHVkZSAiZGF0YXBhdGguaCIKKyNpbmNsdWRlICJmbG93LmgiCisjaW5jbHVkZSAidnBvcnQtaW50ZXJuYWxfZGV2LmgiCisKKy8qKgorICogRE9DOiBMb2NraW5nOgorICoKKyAqIFdyaXRlcyB0byBkZXZpY2Ugc3RhdGUgKGFkZC9yZW1vdmUgZGF0YXBhdGgsIHBvcnQsIHNldCBvcGVyYXRpb25zIG9uIHZwb3J0cywKKyAqIGV0Yy4pIGFyZSBwcm90ZWN0ZWQgYnkgUlROTC4KKyAqCisgKiBXcml0ZXMgdG8gb3RoZXIgc3RhdGUgKGZsb3cgdGFibGUgbW9kaWZpY2F0aW9ucywgc2V0IG1pc2NlbGxhbmVvdXMgZGF0YXBhdGgKKyAqIHBhcmFtZXRlcnMsIGV0Yy4pIGFyZSBwcm90ZWN0ZWQgYnkgZ2VubF9tdXRleC4gIFRoZSBSVE5MIGxvY2sgbmVzdHMgaW5zaWRlCisgKiBnZW5sX211dGV4LgorICoKKyAqIFJlYWRzIGFyZSBwcm90ZWN0ZWQgYnkgUkNVLgorICoKKyAqIFRoZXJlIGFyZSBhIGZldyBzcGVjaWFsIGNhc2VzIChtb3N0bHkgc3RhdHMpIHRoYXQgaGF2ZSB0aGVpciBvd24KKyAqIHN5bmNocm9uaXphdGlvbiBidXQgdGhleSBuZXN0IHVuZGVyIGFsbCBvZiBhYm92ZSBhbmQgZG9uJ3QgaW50ZXJhY3Qgd2l0aAorICogZWFjaCBvdGhlci4KKyAqLworCisvKiBHbG9iYWwgbGlzdCBvZiBkYXRhcGF0aHMgdG8gZW5hYmxlIGR1bXBpbmcgdGhlbSBhbGwgb3V0LgorICogUHJvdGVjdGVkIGJ5IGdlbmxfbXV0ZXguCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoZHBzKTsKKworI2RlZmluZSBSRUhBU0hfRkxPV19JTlRFUlZBTCAoMTAgKiA2MCAqIEhaKQorc3RhdGljIHZvaWQgcmVoYXNoX2Zsb3dfdGFibGUoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKK3N0YXRpYyBERUNMQVJFX0RFTEFZRURfV09SSyhyZWhhc2hfZmxvd193cSwgcmVoYXNoX2Zsb3dfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHZwb3J0ICpuZXdfdnBvcnQoY29uc3Qgc3RydWN0IHZwb3J0X3Bhcm1zICopOworc3RhdGljIGludCBxdWV1ZV9nc29fcGFja2V0cyhpbnQgZHBfaWZpbmRleCwgc3RydWN0IHNrX2J1ZmYgKiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGRwX3VwY2FsbF9pbmZvICopOworc3RhdGljIGludCBxdWV1ZV91c2Vyc3BhY2VfcGFja2V0KGludCBkcF9pZmluZGV4LCBzdHJ1Y3Qgc2tfYnVmZiAqLAorCQkJCSAgY29uc3Qgc3RydWN0IGRwX3VwY2FsbF9pbmZvICopOworCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2ssIGdlbmxfbXV0ZXgsIG9yIFJUTkwgbG9jay4gKi8KK3N0YXRpYyBzdHJ1Y3QgZGF0YXBhdGggKmdldF9kcChpbnQgZHBfaWZpbmRleCkKK3sKKwlzdHJ1Y3QgZGF0YXBhdGggKmRwID0gTlVMTDsKKwlzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OworCisJcmN1X3JlYWRfbG9jaygpOworCWRldiA9IGRldl9nZXRfYnlfaW5kZXhfcmN1KCZpbml0X25ldCwgZHBfaWZpbmRleCk7CisJaWYgKGRldikgeworCQlzdHJ1Y3QgdnBvcnQgKnZwb3J0ID0gb3ZzX2ludGVybmFsX2Rldl9nZXRfdnBvcnQoZGV2KTsKKwkJaWYgKHZwb3J0KQorCQkJZHAgPSB2cG9ydC0+ZHA7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGRwOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2sgb3IgUlROTCBsb2NrLiAqLworY29uc3QgY2hhciAqb3ZzX2RwX25hbWUoY29uc3Qgc3RydWN0IGRhdGFwYXRoICpkcCkKK3sKKwlzdHJ1Y3QgdnBvcnQgKnZwb3J0ID0gcmN1X2RlcmVmZXJlbmNlX3J0bmwoZHAtPnBvcnRzW09WU1BfTE9DQUxdKTsKKwlyZXR1cm4gdnBvcnQtPm9wcy0+Z2V0X25hbWUodnBvcnQpOworfQorCitzdGF0aWMgaW50IGdldF9kcGlmaW5kZXgoc3RydWN0IGRhdGFwYXRoICpkcCkKK3sKKwlzdHJ1Y3QgdnBvcnQgKmxvY2FsOworCWludCBpZmluZGV4OworCisJcmN1X3JlYWRfbG9jaygpOworCisJbG9jYWwgPSByY3VfZGVyZWZlcmVuY2UoZHAtPnBvcnRzW09WU1BfTE9DQUxdKTsKKwlpZiAobG9jYWwpCisJCWlmaW5kZXggPSBsb2NhbC0+b3BzLT5nZXRfaWZpbmRleChsb2NhbCk7CisJZWxzZQorCQlpZmluZGV4ID0gMDsKKworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIGlmaW5kZXg7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfZHBfcmN1KHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVjdCBkYXRhcGF0aCAqZHAgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgZGF0YXBhdGgsIHJjdSk7CisKKwlvdnNfZmxvd190YmxfZGVzdHJveSgoX19mb3JjZSBzdHJ1Y3QgZmxvd190YWJsZSAqKWRwLT50YWJsZSk7CisJZnJlZV9wZXJjcHUoZHAtPnN0YXRzX3BlcmNwdSk7CisJa2ZyZWUoZHApOworfQorCisvKiBDYWxsZWQgd2l0aCBSVE5MIGxvY2sgYW5kIGdlbmxfbG9jay4gKi8KK3N0YXRpYyBzdHJ1Y3QgdnBvcnQgKm5ld192cG9ydChjb25zdCBzdHJ1Y3QgdnBvcnRfcGFybXMgKnBhcm1zKQoreworCXN0cnVjdCB2cG9ydCAqdnBvcnQ7CisKKwl2cG9ydCA9IG92c192cG9ydF9hZGQocGFybXMpOworCWlmICghSVNfRVJSKHZwb3J0KSkgeworCQlzdHJ1Y3QgZGF0YXBhdGggKmRwID0gcGFybXMtPmRwOworCisJCXJjdV9hc3NpZ25fcG9pbnRlcihkcC0+cG9ydHNbcGFybXMtPnBvcnRfbm9dLCB2cG9ydCk7CisJCWxpc3RfYWRkKCZ2cG9ydC0+bm9kZSwgJmRwLT5wb3J0X2xpc3QpOworCX0KKworCXJldHVybiB2cG9ydDsKK30KKworLyogQ2FsbGVkIHdpdGggUlROTCBsb2NrLiAqLwordm9pZCBvdnNfZHBfZGV0YWNoX3BvcnQoc3RydWN0IHZwb3J0ICpwKQoreworCUFTU0VSVF9SVE5MKCk7CisKKwkvKiBGaXJzdCBkcm9wIHJlZmVyZW5jZXMgdG8gZGV2aWNlLiAqLworCWxpc3RfZGVsKCZwLT5ub2RlKTsKKwlyY3VfYXNzaWduX3BvaW50ZXIocC0+ZHAtPnBvcnRzW3AtPnBvcnRfbm9dLCBOVUxMKTsKKworCS8qIFRoZW4gZGVzdHJveSBpdC4gKi8KKwlvdnNfdnBvcnRfZGVsKHApOworfQorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2suICovCit2b2lkIG92c19kcF9wcm9jZXNzX3JlY2VpdmVkX3BhY2tldChzdHJ1Y3QgdnBvcnQgKnAsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGRhdGFwYXRoICpkcCA9IHAtPmRwOworCXN0cnVjdCBzd19mbG93ICpmbG93OworCXN0cnVjdCBkcF9zdGF0c19wZXJjcHUgKnN0YXRzOworCXN0cnVjdCBzd19mbG93X2tleSBrZXk7CisJdTY0ICpzdGF0c19jb3VudGVyOworCWludCBlcnJvcjsKKwlpbnQga2V5X2xlbjsKKworCXN0YXRzID0gcGVyX2NwdV9wdHIoZHAtPnN0YXRzX3BlcmNwdSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8qIEV4dHJhY3QgZmxvdyBmcm9tICdza2InIGludG8gJ2tleScuICovCisJZXJyb3IgPSBvdnNfZmxvd19leHRyYWN0KHNrYiwgcC0+cG9ydF9ubywgJmtleSwgJmtleV9sZW4pOworCWlmICh1bmxpa2VseShlcnJvcikpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwkvKiBMb29rIHVwIGZsb3cuICovCisJZmxvdyA9IG92c19mbG93X3RibF9sb29rdXAocmN1X2RlcmVmZXJlbmNlKGRwLT50YWJsZSksICZrZXksIGtleV9sZW4pOworCWlmICh1bmxpa2VseSghZmxvdykpIHsKKwkJc3RydWN0IGRwX3VwY2FsbF9pbmZvIHVwY2FsbDsKKworCQl1cGNhbGwuY21kID0gT1ZTX1BBQ0tFVF9DTURfTUlTUzsKKwkJdXBjYWxsLmtleSA9ICZrZXk7CisJCXVwY2FsbC51c2VyZGF0YSA9IE5VTEw7CisJCXVwY2FsbC5waWQgPSBwLT51cGNhbGxfcGlkOworCQlvdnNfZHBfdXBjYWxsKGRwLCBza2IsICZ1cGNhbGwpOworCQljb25zdW1lX3NrYihza2IpOworCQlzdGF0c19jb3VudGVyID0gJnN0YXRzLT5uX21pc3NlZDsKKwkJZ290byBvdXQ7CisJfQorCisJT1ZTX0NCKHNrYiktPmZsb3cgPSBmbG93OworCisJc3RhdHNfY291bnRlciA9ICZzdGF0cy0+bl9oaXQ7CisJb3ZzX2Zsb3dfdXNlZChPVlNfQ0Ioc2tiKS0+Zmxvdywgc2tiKTsKKwlvdnNfZXhlY3V0ZV9hY3Rpb25zKGRwLCBza2IpOworCitvdXQ6CisJLyogVXBkYXRlIGRhdGFwYXRoIHN0YXRpc3RpY3MuICovCisJdTY0X3N0YXRzX3VwZGF0ZV9iZWdpbigmc3RhdHMtPnN5bmMpOworCSgqc3RhdHNfY291bnRlcikrKzsKKwl1NjRfc3RhdHNfdXBkYXRlX2VuZCgmc3RhdHMtPnN5bmMpOworfQorCitzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGRwX3BhY2tldF9nZW5sX2ZhbWlseSA9IHsKKwkuaWQgPSBHRU5MX0lEX0dFTkVSQVRFLAorCS5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBvdnNfaGVhZGVyKSwKKwkubmFtZSA9IE9WU19QQUNLRVRfRkFNSUxZLAorCS52ZXJzaW9uID0gT1ZTX1BBQ0tFVF9WRVJTSU9OLAorCS5tYXhhdHRyID0gT1ZTX1BBQ0tFVF9BVFRSX01BWAorfTsKKworaW50IG92c19kcF91cGNhbGwoc3RydWN0IGRhdGFwYXRoICpkcCwgc3RydWN0IHNrX2J1ZmYgKnNrYiwKKwkgICAgICBjb25zdCBzdHJ1Y3QgZHBfdXBjYWxsX2luZm8gKnVwY2FsbF9pbmZvKQoreworCXN0cnVjdCBkcF9zdGF0c19wZXJjcHUgKnN0YXRzOworCWludCBkcF9pZmluZGV4OworCWludCBlcnI7CisKKwlpZiAodXBjYWxsX2luZm8tPnBpZCA9PSAwKSB7CisJCWVyciA9IC1FTk9UQ09OTjsKKwkJZ290byBlcnI7CisJfQorCisJZHBfaWZpbmRleCA9IGdldF9kcGlmaW5kZXgoZHApOworCWlmICghZHBfaWZpbmRleCkgeworCQllcnIgPSAtRU5PREVWOworCQlnb3RvIGVycjsKKwl9CisKKwlpZiAoIXNrYl9pc19nc28oc2tiKSkKKwkJZXJyID0gcXVldWVfdXNlcnNwYWNlX3BhY2tldChkcF9pZmluZGV4LCBza2IsIHVwY2FsbF9pbmZvKTsKKwllbHNlCisJCWVyciA9IHF1ZXVlX2dzb19wYWNrZXRzKGRwX2lmaW5kZXgsIHNrYiwgdXBjYWxsX2luZm8pOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlzdGF0cyA9IHBlcl9jcHVfcHRyKGRwLT5zdGF0c19wZXJjcHUsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzdGF0cy0+c3luYyk7CisJc3RhdHMtPm5fbG9zdCsrOworCXU2NF9zdGF0c191cGRhdGVfZW5kKCZzdGF0cy0+c3luYyk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHF1ZXVlX2dzb19wYWNrZXRzKGludCBkcF9pZmluZGV4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJICAgICBjb25zdCBzdHJ1Y3QgZHBfdXBjYWxsX2luZm8gKnVwY2FsbF9pbmZvKQoreworCXN0cnVjdCBkcF91cGNhbGxfaW5mbyBsYXRlcl9pbmZvOworCXN0cnVjdCBzd19mbG93X2tleSBsYXRlcl9rZXk7CisJc3RydWN0IHNrX2J1ZmYgKnNlZ3MsICpuc2tiOworCWludCBlcnI7CisKKwlzZWdzID0gc2tiX2dzb19zZWdtZW50KHNrYiwgTkVUSUZfRl9TRyB8IE5FVElGX0ZfSFdfQ1NVTSk7CisJaWYgKElTX0VSUihza2IpKQorCQlyZXR1cm4gUFRSX0VSUihza2IpOworCisJLyogUXVldWUgYWxsIG9mIHRoZSBzZWdtZW50cy4gKi8KKwlza2IgPSBzZWdzOworCWRvIHsKKwkJZXJyID0gcXVldWVfdXNlcnNwYWNlX3BhY2tldChkcF9pZmluZGV4LCBza2IsIHVwY2FsbF9pbmZvKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCWlmIChza2IgPT0gc2VncyAmJiBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19VRFApIHsKKwkJCS8qIFRoZSBpbml0aWFsIGZsb3cga2V5IGV4dHJhY3RlZCBieSBvdnNfZmxvd19leHRyYWN0KCkKKwkJCSAqIGluIHRoaXMgY2FzZSBpcyBmb3IgYSBmaXJzdCBmcmFnbWVudCwgc28gd2UgbmVlZCB0bworCQkJICogcHJvcGVybHkgbWFyayBsYXRlciBmcmFnbWVudHMuCisJCQkgKi8KKwkJCWxhdGVyX2tleSA9ICp1cGNhbGxfaW5mby0+a2V5OworCQkJbGF0ZXJfa2V5LmlwLmZyYWcgPSBPVlNfRlJBR19UWVBFX0xBVEVSOworCisJCQlsYXRlcl9pbmZvID0gKnVwY2FsbF9pbmZvOworCQkJbGF0ZXJfaW5mby5rZXkgPSAmbGF0ZXJfa2V5OworCQkJdXBjYWxsX2luZm8gPSAmbGF0ZXJfaW5mbzsKKwkJfQorCX0gd2hpbGUgKChza2IgPSBza2ItPm5leHQpKTsKKworCS8qIEZyZWUgYWxsIG9mIHRoZSBzZWdtZW50cy4gKi8KKwlza2IgPSBzZWdzOworCWRvIHsKKwkJbnNrYiA9IHNrYi0+bmV4dDsKKwkJaWYgKGVycikKKwkJCWtmcmVlX3NrYihza2IpOworCQllbHNlCisJCQljb25zdW1lX3NrYihza2IpOworCX0gd2hpbGUgKChza2IgPSBuc2tiKSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBxdWV1ZV91c2Vyc3BhY2VfcGFja2V0KGludCBkcF9pZmluZGV4LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCSAgY29uc3Qgc3RydWN0IGRwX3VwY2FsbF9pbmZvICp1cGNhbGxfaW5mbykKK3sKKwlzdHJ1Y3Qgb3ZzX2hlYWRlciAqdXBjYWxsOworCXN0cnVjdCBza19idWZmICpuc2tiID0gTlVMTDsKKwlzdHJ1Y3Qgc2tfYnVmZiAqdXNlcl9za2I7IC8qIHRvIGJlIHF1ZXVlZCB0byB1c2Vyc3BhY2UgKi8KKwlzdHJ1Y3QgbmxhdHRyICpubGE7CisJdW5zaWduZWQgaW50IGxlbjsKKwlpbnQgZXJyOworCisJaWYgKHZsYW5fdHhfdGFnX3ByZXNlbnQoc2tiKSkgeworCQluc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CisJCWlmICghbnNrYikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW5za2IgPSBfX3ZsYW5fcHV0X3RhZyhuc2tiLCB2bGFuX3R4X3RhZ19nZXQobnNrYikpOworCQlpZiAoIXNrYikKKwkJCXJldHVybiAtRU5PTUVNOworCisJCW5za2ItPnZsYW5fdGNpID0gMDsKKwkJc2tiID0gbnNrYjsKKwl9CisKKwlpZiAobmxhX2F0dHJfc2l6ZShza2ItPmxlbikgPiBVU0hSVF9NQVgpIHsKKwkJZXJyID0gLUVGQklHOworCQlnb3RvIG91dDsKKwl9CisKKwlsZW4gPSBzaXplb2Yoc3RydWN0IG92c19oZWFkZXIpOworCWxlbiArPSBubGFfdG90YWxfc2l6ZShza2ItPmxlbik7CisJbGVuICs9IG5sYV90b3RhbF9zaXplKEZMT1dfQlVGU0laRSk7CisJaWYgKHVwY2FsbF9pbmZvLT5jbWQgPT0gT1ZTX1BBQ0tFVF9DTURfQUNUSU9OKQorCQlsZW4gKz0gbmxhX3RvdGFsX3NpemUoOCk7CisKKwl1c2VyX3NrYiA9IGdlbmxtc2dfbmV3KGxlbiwgR0ZQX0FUT01JQyk7CisJaWYgKCF1c2VyX3NrYikgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CisKKwl1cGNhbGwgPSBnZW5sbXNnX3B1dCh1c2VyX3NrYiwgMCwgMCwgJmRwX3BhY2tldF9nZW5sX2ZhbWlseSwKKwkJCSAgICAgMCwgdXBjYWxsX2luZm8tPmNtZCk7CisJdXBjYWxsLT5kcF9pZmluZGV4ID0gZHBfaWZpbmRleDsKKworCW5sYSA9IG5sYV9uZXN0X3N0YXJ0KHVzZXJfc2tiLCBPVlNfUEFDS0VUX0FUVFJfS0VZKTsKKwlvdnNfZmxvd190b19ubGF0dHJzKHVwY2FsbF9pbmZvLT5rZXksIHVzZXJfc2tiKTsKKwlubGFfbmVzdF9lbmQodXNlcl9za2IsIG5sYSk7CisKKwlpZiAodXBjYWxsX2luZm8tPnVzZXJkYXRhKQorCQlubGFfcHV0X3U2NCh1c2VyX3NrYiwgT1ZTX1BBQ0tFVF9BVFRSX1VTRVJEQVRBLAorCQkJICAgIG5sYV9nZXRfdTY0KHVwY2FsbF9pbmZvLT51c2VyZGF0YSkpOworCisJbmxhID0gX19ubGFfcmVzZXJ2ZSh1c2VyX3NrYiwgT1ZTX1BBQ0tFVF9BVFRSX1BBQ0tFVCwgc2tiLT5sZW4pOworCisJc2tiX2NvcHlfYW5kX2NzdW1fZGV2KHNrYiwgbmxhX2RhdGEobmxhKSk7CisKKwllcnIgPSBnZW5sbXNnX3VuaWNhc3QoJmluaXRfbmV0LCB1c2VyX3NrYiwgdXBjYWxsX2luZm8tPnBpZCk7CisKK291dDoKKwlrZnJlZV9za2IobnNrYik7CisJcmV0dXJuIGVycjsKK30KKworLyogQ2FsbGVkIHdpdGggZ2VubF9tdXRleC4gKi8KK3N0YXRpYyBpbnQgZmx1c2hfZmxvd3MoaW50IGRwX2lmaW5kZXgpCit7CisJc3RydWN0IGZsb3dfdGFibGUgKm9sZF90YWJsZTsKKwlzdHJ1Y3QgZmxvd190YWJsZSAqbmV3X3RhYmxlOworCXN0cnVjdCBkYXRhcGF0aCAqZHA7CisKKwlkcCA9IGdldF9kcChkcF9pZmluZGV4KTsKKwlpZiAoIWRwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW9sZF90YWJsZSA9IGdlbmxfZGVyZWZlcmVuY2UoZHAtPnRhYmxlKTsKKwluZXdfdGFibGUgPSBvdnNfZmxvd190YmxfYWxsb2MoVEJMX01JTl9CVUNLRVRTKTsKKwlpZiAoIW5ld190YWJsZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyY3VfYXNzaWduX3BvaW50ZXIoZHAtPnRhYmxlLCBuZXdfdGFibGUpOworCisJb3ZzX2Zsb3dfdGJsX2RlZmVycmVkX2Rlc3Ryb3kob2xkX3RhYmxlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV9hY3Rpb25zKGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIsCisJCQkJY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksIGludCBkZXB0aCk7CisKK3N0YXRpYyBpbnQgdmFsaWRhdGVfc2FtcGxlKGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIsCisJCQkJY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksIGludCBkZXB0aCkKK3sKKwljb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyc1tPVlNfU0FNUExFX0FUVFJfTUFYICsgMV07CisJY29uc3Qgc3RydWN0IG5sYXR0ciAqcHJvYmFiaWxpdHksICphY3Rpb25zOworCWNvbnN0IHN0cnVjdCBubGF0dHIgKmE7CisJaW50IHJlbTsKKworCW1lbXNldChhdHRycywgMCwgc2l6ZW9mKGF0dHJzKSk7CisJbmxhX2Zvcl9lYWNoX25lc3RlZChhLCBhdHRyLCByZW0pIHsKKwkJaW50IHR5cGUgPSBubGFfdHlwZShhKTsKKwkJaWYgKCF0eXBlIHx8IHR5cGUgPiBPVlNfU0FNUExFX0FUVFJfTUFYIHx8IGF0dHJzW3R5cGVdKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWF0dHJzW3R5cGVdID0gYTsKKwl9CisJaWYgKHJlbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcm9iYWJpbGl0eSA9IGF0dHJzW09WU19TQU1QTEVfQVRUUl9QUk9CQUJJTElUWV07CisJaWYgKCFwcm9iYWJpbGl0eSB8fCBubGFfbGVuKHByb2JhYmlsaXR5KSAhPSBzaXplb2YodTMyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhY3Rpb25zID0gYXR0cnNbT1ZTX1NBTVBMRV9BVFRSX0FDVElPTlNdOworCWlmICghYWN0aW9ucyB8fCAobmxhX2xlbihhY3Rpb25zKSAmJiBubGFfbGVuKGFjdGlvbnMpIDwgTkxBX0hEUkxFTikpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiB2YWxpZGF0ZV9hY3Rpb25zKGFjdGlvbnMsIGtleSwgZGVwdGggKyAxKTsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV9zZXQoY29uc3Qgc3RydWN0IG5sYXR0ciAqYSwKKwkJCWNvbnN0IHN0cnVjdCBzd19mbG93X2tleSAqZmxvd19rZXkpCit7CisJY29uc3Qgc3RydWN0IG5sYXR0ciAqb3ZzX2tleSA9IG5sYV9kYXRhKGEpOworCWludCBrZXlfdHlwZSA9IG5sYV90eXBlKG92c19rZXkpOworCisJLyogVGhlcmUgY2FuIGJlIG9ubHkgb25lIGtleSBpbiBhIGFjdGlvbiAqLworCWlmIChubGFfdG90YWxfc2l6ZShubGFfbGVuKG92c19rZXkpKSAhPSBubGFfbGVuKGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChrZXlfdHlwZSA+IE9WU19LRVlfQVRUUl9NQVggfHwKKwkgICAgbmxhX2xlbihvdnNfa2V5KSAhPSBvdnNfa2V5X2xlbnNba2V5X3R5cGVdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoa2V5X3R5cGUpIHsKKwljb25zdCBzdHJ1Y3Qgb3ZzX2tleV9pcHY0ICppcHY0X2tleTsKKworCWNhc2UgT1ZTX0tFWV9BVFRSX1BSSU9SSVRZOgorCWNhc2UgT1ZTX0tFWV9BVFRSX0VUSEVSTkVUOgorCQlicmVhazsKKworCWNhc2UgT1ZTX0tFWV9BVFRSX0lQVjQ6CisJCWlmIChmbG93X2tleS0+ZXRoLnR5cGUgIT0gaHRvbnMoRVRIX1BfSVApKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKCFmbG93X2tleS0+aXB2NC5hZGRyLnNyYyB8fCAhZmxvd19rZXktPmlwdjQuYWRkci5kc3QpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpcHY0X2tleSA9IG5sYV9kYXRhKG92c19rZXkpOworCQlpZiAoaXB2NF9rZXktPmlwdjRfcHJvdG8gIT0gZmxvd19rZXktPmlwLnByb3RvKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGlwdjRfa2V5LT5pcHY0X2ZyYWcgIT0gZmxvd19rZXktPmlwLmZyYWcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlicmVhazsKKworCWNhc2UgT1ZTX0tFWV9BVFRSX1RDUDoKKwkJaWYgKGZsb3dfa2V5LT5pcC5wcm90byAhPSBJUFBST1RPX1RDUCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICghZmxvd19rZXktPmlwdjQudHAuc3JjIHx8ICFmbG93X2tleS0+aXB2NC50cC5kc3QpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlicmVhazsKKworCWNhc2UgT1ZTX0tFWV9BVFRSX1VEUDoKKwkJaWYgKGZsb3dfa2V5LT5pcC5wcm90byAhPSBJUFBST1RPX1VEUCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICghZmxvd19rZXktPmlwdjQudHAuc3JjIHx8ICFmbG93X2tleS0+aXB2NC50cC5kc3QpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2YWxpZGF0ZV91c2Vyc3BhY2UoY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0cikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgdXNlcnNwYWNlX3BvbGljeVtPVlNfVVNFUlNQQUNFX0FUVFJfTUFYICsgMV0gPQl7CisJCVtPVlNfVVNFUlNQQUNFX0FUVFJfUElEXSA9IHsudHlwZSA9IE5MQV9VMzIgfSwKKwkJW09WU19VU0VSU1BBQ0VfQVRUUl9VU0VSREFUQV0gPSB7LnR5cGUgPSBOTEFfVTY0IH0sCisJfTsKKwlzdHJ1Y3QgbmxhdHRyICphW09WU19VU0VSU1BBQ0VfQVRUUl9NQVggKyAxXTsKKwlpbnQgZXJyb3I7CisKKwllcnJvciA9IG5sYV9wYXJzZV9uZXN0ZWQoYSwgT1ZTX1VTRVJTUEFDRV9BVFRSX01BWCwKKwkJCQkgYXR0ciwgdXNlcnNwYWNlX3BvbGljeSk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gZXJyb3I7CisKKwlpZiAoIWFbT1ZTX1VTRVJTUEFDRV9BVFRSX1BJRF0gfHwKKwkgICAgIW5sYV9nZXRfdTMyKGFbT1ZTX1VTRVJTUEFDRV9BVFRSX1BJRF0pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHZhbGlkYXRlX2FjdGlvbnMoY29uc3Qgc3RydWN0IG5sYXR0ciAqYXR0ciwKKwkJCQljb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwgIGludCBkZXB0aCkKK3sKKwljb25zdCBzdHJ1Y3QgbmxhdHRyICphOworCWludCByZW0sIGVycjsKKworCWlmIChkZXB0aCA+PSBTQU1QTEVfQUNUSU9OX0RFUFRIKQorCQlyZXR1cm4gLUVPVkVSRkxPVzsKKworCW5sYV9mb3JfZWFjaF9uZXN0ZWQoYSwgYXR0ciwgcmVtKSB7CisJCS8qIEV4cGVjdGVkIGFyZ3VtZW50IGxlbmd0aHMsICh1MzIpLTEgZm9yIHZhcmlhYmxlIGxlbmd0aC4gKi8KKwkJc3RhdGljIGNvbnN0IHUzMiBhY3Rpb25fbGVuc1tPVlNfQUNUSU9OX0FUVFJfTUFYICsgMV0gPSB7CisJCQlbT1ZTX0FDVElPTl9BVFRSX09VVFBVVF0gPSBzaXplb2YodTMyKSwKKwkJCVtPVlNfQUNUSU9OX0FUVFJfVVNFUlNQQUNFXSA9ICh1MzIpLTEsCisJCQlbT1ZTX0FDVElPTl9BVFRSX1BVU0hfVkxBTl0gPSBzaXplb2Yoc3RydWN0IG92c19hY3Rpb25fcHVzaF92bGFuKSwKKwkJCVtPVlNfQUNUSU9OX0FUVFJfUE9QX1ZMQU5dID0gMCwKKwkJCVtPVlNfQUNUSU9OX0FUVFJfU0VUXSA9ICh1MzIpLTEsCisJCQlbT1ZTX0FDVElPTl9BVFRSX1NBTVBMRV0gPSAodTMyKS0xCisJCX07CisJCWNvbnN0IHN0cnVjdCBvdnNfYWN0aW9uX3B1c2hfdmxhbiAqdmxhbjsKKwkJaW50IHR5cGUgPSBubGFfdHlwZShhKTsKKworCQlpZiAodHlwZSA+IE9WU19BQ1RJT05fQVRUUl9NQVggfHwKKwkJICAgIChhY3Rpb25fbGVuc1t0eXBlXSAhPSBubGFfbGVuKGEpICYmCisJCSAgICAgYWN0aW9uX2xlbnNbdHlwZV0gIT0gKHUzMiktMSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBPVlNfQUNUSU9OX0FUVFJfVU5TUEVDOgorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJY2FzZSBPVlNfQUNUSU9OX0FUVFJfVVNFUlNQQUNFOgorCQkJZXJyID0gdmFsaWRhdGVfdXNlcnNwYWNlKGEpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQkJYnJlYWs7CisKKwkJY2FzZSBPVlNfQUNUSU9OX0FUVFJfT1VUUFVUOgorCQkJaWYgKG5sYV9nZXRfdTMyKGEpID49IERQX01BWF9QT1JUUykKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWJyZWFrOworCisKKwkJY2FzZSBPVlNfQUNUSU9OX0FUVFJfUE9QX1ZMQU46CisJCQlicmVhazsKKworCQljYXNlIE9WU19BQ1RJT05fQVRUUl9QVVNIX1ZMQU46CisJCQl2bGFuID0gbmxhX2RhdGEoYSk7CisJCQlpZiAodmxhbi0+dmxhbl90cGlkICE9IGh0b25zKEVUSF9QXzgwMjFRKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghKHZsYW4tPnZsYW5fdGNpICYgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCkpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisKKwkJY2FzZSBPVlNfQUNUSU9OX0FUVFJfU0VUOgorCQkJZXJyID0gdmFsaWRhdGVfc2V0KGEsIGtleSk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCQlicmVhazsKKworCQljYXNlIE9WU19BQ1RJT05fQVRUUl9TQU1QTEU6CisJCQllcnIgPSB2YWxpZGF0ZV9zYW1wbGUoYSwga2V5LCBkZXB0aCk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAocmVtID4gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfc3RhdHMoc3RydWN0IHN3X2Zsb3cgKmZsb3cpCit7CisJZmxvdy0+dXNlZCA9IDA7CisJZmxvdy0+dGNwX2ZsYWdzID0gMDsKKwlmbG93LT5wYWNrZXRfY291bnQgPSAwOworCWZsb3ctPmJ5dGVfY291bnQgPSAwOworfQorCitzdGF0aWMgaW50IG92c19wYWNrZXRfY21kX2V4ZWN1dGUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3Qgb3ZzX2hlYWRlciAqb3ZzX2hlYWRlciA9IGluZm8tPnVzZXJoZHI7CisJc3RydWN0IG5sYXR0ciAqKmEgPSBpbmZvLT5hdHRyczsKKwlzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zICphY3RzOworCXN0cnVjdCBza19idWZmICpwYWNrZXQ7CisJc3RydWN0IHN3X2Zsb3cgKmZsb3c7CisJc3RydWN0IGRhdGFwYXRoICpkcDsKKwlzdHJ1Y3QgZXRoaGRyICpldGg7CisJaW50IGxlbjsKKwlpbnQgZXJyOworCWludCBrZXlfbGVuOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIWFbT1ZTX1BBQ0tFVF9BVFRSX1BBQ0tFVF0gfHwgIWFbT1ZTX1BBQ0tFVF9BVFRSX0tFWV0gfHwKKwkgICAgIWFbT1ZTX1BBQ0tFVF9BVFRSX0FDVElPTlNdIHx8CisJICAgIG5sYV9sZW4oYVtPVlNfUEFDS0VUX0FUVFJfUEFDS0VUXSkgPCBFVEhfSExFTikKKwkJZ290byBlcnI7CisKKwlsZW4gPSBubGFfbGVuKGFbT1ZTX1BBQ0tFVF9BVFRSX1BBQ0tFVF0pOworCXBhY2tldCA9IF9fZGV2X2FsbG9jX3NrYihORVRfSVBfQUxJR04gKyBsZW4sIEdGUF9LRVJORUwpOworCWVyciA9IC1FTk9NRU07CisJaWYgKCFwYWNrZXQpCisJCWdvdG8gZXJyOworCXNrYl9yZXNlcnZlKHBhY2tldCwgTkVUX0lQX0FMSUdOKTsKKworCW1lbWNweShfX3NrYl9wdXQocGFja2V0LCBsZW4pLCBubGFfZGF0YShhW09WU19QQUNLRVRfQVRUUl9QQUNLRVRdKSwgbGVuKTsKKworCXNrYl9yZXNldF9tYWNfaGVhZGVyKHBhY2tldCk7CisJZXRoID0gZXRoX2hkcihwYWNrZXQpOworCisJLyogTm9ybWFsbHksIHNldHRpbmcgdGhlIHNrYiAncHJvdG9jb2wnIGZpZWxkIHdvdWxkIGJlIGhhbmRsZWQgYnkgYQorCSAqIGNhbGwgdG8gZXRoX3R5cGVfdHJhbnMoKSwgYnV0IGl0IGFzc3VtZXMgdGhlcmUncyBhIHNlbmRpbmcKKwkgKiBkZXZpY2UsIHdoaWNoIHdlIG1heSBub3QgaGF2ZS4gKi8KKwlpZiAobnRvaHMoZXRoLT5oX3Byb3RvKSA+PSAxNTM2KQorCQlwYWNrZXQtPnByb3RvY29sID0gZXRoLT5oX3Byb3RvOworCWVsc2UKKwkJcGFja2V0LT5wcm90b2NvbCA9IGh0b25zKEVUSF9QXzgwMl8yKTsKKworCS8qIEJ1aWxkIGFuIHN3X2Zsb3cgZm9yIHNlbmRpbmcgdGhpcyBwYWNrZXQuICovCisJZmxvdyA9IG92c19mbG93X2FsbG9jKCk7CisJZXJyID0gUFRSX0VSUihmbG93KTsKKwlpZiAoSVNfRVJSKGZsb3cpKQorCQlnb3RvIGVycl9rZnJlZV9za2I7CisKKwllcnIgPSBvdnNfZmxvd19leHRyYWN0KHBhY2tldCwgLTEsICZmbG93LT5rZXksICZrZXlfbGVuKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mbG93X2ZyZWU7CisKKwllcnIgPSBvdnNfZmxvd19tZXRhZGF0YV9mcm9tX25sYXR0cnMoJmZsb3ctPmtleS5waHkucHJpb3JpdHksCisJCQkJCSAgICAgJmZsb3ctPmtleS5waHkuaW5fcG9ydCwKKwkJCQkJICAgICBhW09WU19QQUNLRVRfQVRUUl9LRVldKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mbG93X2ZyZWU7CisKKwllcnIgPSB2YWxpZGF0ZV9hY3Rpb25zKGFbT1ZTX1BBQ0tFVF9BVFRSX0FDVElPTlNdLCAmZmxvdy0+a2V5LCAwKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9mbG93X2ZyZWU7CisKKwlmbG93LT5oYXNoID0gb3ZzX2Zsb3dfaGFzaCgmZmxvdy0+a2V5LCBrZXlfbGVuKTsKKworCWFjdHMgPSBvdnNfZmxvd19hY3Rpb25zX2FsbG9jKGFbT1ZTX1BBQ0tFVF9BVFRSX0FDVElPTlNdKTsKKwllcnIgPSBQVFJfRVJSKGFjdHMpOworCWlmIChJU19FUlIoYWN0cykpCisJCWdvdG8gZXJyX2Zsb3dfZnJlZTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoZmxvdy0+c2ZfYWN0cywgYWN0cyk7CisKKwlPVlNfQ0IocGFja2V0KS0+ZmxvdyA9IGZsb3c7CisJcGFja2V0LT5wcmlvcml0eSA9IGZsb3ctPmtleS5waHkucHJpb3JpdHk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZHAgPSBnZXRfZHAob3ZzX2hlYWRlci0+ZHBfaWZpbmRleCk7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWRwKQorCQlnb3RvIGVycl91bmxvY2s7CisKKwlsb2NhbF9iaF9kaXNhYmxlKCk7CisJZXJyID0gb3ZzX2V4ZWN1dGVfYWN0aW9ucyhkcCwgcGFja2V0KTsKKwlsb2NhbF9iaF9lbmFibGUoKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCW92c19mbG93X2ZyZWUoZmxvdyk7CisJcmV0dXJuIGVycjsKKworZXJyX3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKK2Vycl9mbG93X2ZyZWU6CisJb3ZzX2Zsb3dfZnJlZShmbG93KTsKK2Vycl9rZnJlZV9za2I6CisJa2ZyZWVfc2tiKHBhY2tldCk7CitlcnI6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IHBhY2tldF9wb2xpY3lbT1ZTX1BBQ0tFVF9BVFRSX01BWCArIDFdID0geworCVtPVlNfUEFDS0VUX0FUVFJfUEFDS0VUXSA9IHsgLnR5cGUgPSBOTEFfVU5TUEVDIH0sCisJW09WU19QQUNLRVRfQVRUUl9LRVldID0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKKwlbT1ZTX1BBQ0tFVF9BVFRSX0FDVElPTlNdID0geyAudHlwZSA9IE5MQV9ORVNURUQgfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9vcHMgZHBfcGFja2V0X2dlbmxfb3BzW10gPSB7CisJeyAuY21kID0gT1ZTX1BBQ0tFVF9DTURfRVhFQ1VURSwKKwkgIC5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwgLyogUmVxdWlyZXMgQ0FQX05FVF9BRE1JTiBwcml2aWxlZ2UuICovCisJICAucG9saWN5ID0gcGFja2V0X3BvbGljeSwKKwkgIC5kb2l0ID0gb3ZzX3BhY2tldF9jbWRfZXhlY3V0ZQorCX0KK307CisKK3N0YXRpYyB2b2lkIGdldF9kcF9zdGF0cyhzdHJ1Y3QgZGF0YXBhdGggKmRwLCBzdHJ1Y3Qgb3ZzX2RwX3N0YXRzICpzdGF0cykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGUgPSBnZW5sX2RlcmVmZXJlbmNlKGRwLT50YWJsZSk7CisKKwlzdGF0cy0+bl9mbG93cyA9IG92c19mbG93X3RibF9jb3VudCh0YWJsZSk7CisKKwlzdGF0cy0+bl9oaXQgPSBzdGF0cy0+bl9taXNzZWQgPSBzdGF0cy0+bl9sb3N0ID0gMDsKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQljb25zdCBzdHJ1Y3QgZHBfc3RhdHNfcGVyY3B1ICpwZXJjcHVfc3RhdHM7CisJCXN0cnVjdCBkcF9zdGF0c19wZXJjcHUgbG9jYWxfc3RhdHM7CisJCXVuc2lnbmVkIGludCBzdGFydDsKKworCQlwZXJjcHVfc3RhdHMgPSBwZXJfY3B1X3B0cihkcC0+c3RhdHNfcGVyY3B1LCBpKTsKKworCQlkbyB7CisJCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9iaCgmcGVyY3B1X3N0YXRzLT5zeW5jKTsKKwkJCWxvY2FsX3N0YXRzID0gKnBlcmNwdV9zdGF0czsKKwkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2JoKCZwZXJjcHVfc3RhdHMtPnN5bmMsIHN0YXJ0KSk7CisKKwkJc3RhdHMtPm5faGl0ICs9IGxvY2FsX3N0YXRzLm5faGl0OworCQlzdGF0cy0+bl9taXNzZWQgKz0gbG9jYWxfc3RhdHMubl9taXNzZWQ7CisJCXN0YXRzLT5uX2xvc3QgKz0gbG9jYWxfc3RhdHMubl9sb3N0OworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBubGFfcG9saWN5IGZsb3dfcG9saWN5W09WU19GTE9XX0FUVFJfTUFYICsgMV0gPSB7CisJW09WU19GTE9XX0FUVFJfS0VZXSA9IHsgLnR5cGUgPSBOTEFfTkVTVEVEIH0sCisJW09WU19GTE9XX0FUVFJfQUNUSU9OU10gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorCVtPVlNfRkxPV19BVFRSX0NMRUFSXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorfTsKKworc3RhdGljIHN0cnVjdCBnZW5sX2ZhbWlseSBkcF9mbG93X2dlbmxfZmFtaWx5ID0geworCS5pZCA9IEdFTkxfSURfR0VORVJBVEUsCisJLmhkcnNpemUgPSBzaXplb2Yoc3RydWN0IG92c19oZWFkZXIpLAorCS5uYW1lID0gT1ZTX0ZMT1dfRkFNSUxZLAorCS52ZXJzaW9uID0gT1ZTX0ZMT1dfVkVSU0lPTiwKKwkubWF4YXR0ciA9IE9WU19GTE9XX0FUVFJfTUFYCit9OworCitzdGF0aWMgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIG92c19kcF9mbG93X211bHRpY2FzdF9ncm91cCA9IHsKKwkubmFtZSA9IE9WU19GTE9XX01DR1JPVVAKK307CisKKy8qIENhbGxlZCB3aXRoIGdlbmxfbG9jay4gKi8KK3N0YXRpYyBpbnQgb3ZzX2Zsb3dfY21kX2ZpbGxfaW5mbyhzdHJ1Y3Qgc3dfZmxvdyAqZmxvdywgc3RydWN0IGRhdGFwYXRoICpkcCwKKwkJCQkgIHN0cnVjdCBza19idWZmICpza2IsIHUzMiBwaWQsCisJCQkJICB1MzIgc2VxLCB1MzIgZmxhZ3MsIHU4IGNtZCkKK3sKKwljb25zdCBpbnQgc2tiX29yaWdfbGVuID0gc2tiLT5sZW47CisJY29uc3Qgc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqc2ZfYWN0czsKKwlzdHJ1Y3Qgb3ZzX2Zsb3dfc3RhdHMgc3RhdHM7CisJc3RydWN0IG92c19oZWFkZXIgKm92c19oZWFkZXI7CisJc3RydWN0IG5sYXR0ciAqbmxhOworCXVuc2lnbmVkIGxvbmcgdXNlZDsKKwl1OCB0Y3BfZmxhZ3M7CisJaW50IGVycjsKKworCXNmX2FjdHMgPSByY3VfZGVyZWZlcmVuY2VfcHJvdGVjdGVkKGZsb3ctPnNmX2FjdHMsCisJCQkJCSAgICBsb2NrZGVwX2dlbmxfaXNfaGVsZCgpKTsKKworCW92c19oZWFkZXIgPSBnZW5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCAmZHBfZmxvd19nZW5sX2ZhbWlseSwgZmxhZ3MsIGNtZCk7CisJaWYgKCFvdnNfaGVhZGVyKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJb3ZzX2hlYWRlci0+ZHBfaWZpbmRleCA9IGdldF9kcGlmaW5kZXgoZHApOworCisJbmxhID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBPVlNfRkxPV19BVFRSX0tFWSk7CisJaWYgKCFubGEpCisJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCWVyciA9IG92c19mbG93X3RvX25sYXR0cnMoJmZsb3ctPmtleSwgc2tiKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yOworCW5sYV9uZXN0X2VuZChza2IsIG5sYSk7CisKKwlzcGluX2xvY2tfYmgoJmZsb3ctPmxvY2spOworCXVzZWQgPSBmbG93LT51c2VkOworCXN0YXRzLm5fcGFja2V0cyA9IGZsb3ctPnBhY2tldF9jb3VudDsKKwlzdGF0cy5uX2J5dGVzID0gZmxvdy0+Ynl0ZV9jb3VudDsKKwl0Y3BfZmxhZ3MgPSBmbG93LT50Y3BfZmxhZ3M7CisJc3Bpbl91bmxvY2tfYmgoJmZsb3ctPmxvY2spOworCisJaWYgKHVzZWQpCisJCU5MQV9QVVRfVTY0KHNrYiwgT1ZTX0ZMT1dfQVRUUl9VU0VELCBvdnNfZmxvd191c2VkX3RpbWUodXNlZCkpOworCisJaWYgKHN0YXRzLm5fcGFja2V0cykKKwkJTkxBX1BVVChza2IsIE9WU19GTE9XX0FUVFJfU1RBVFMsCisJCQlzaXplb2Yoc3RydWN0IG92c19mbG93X3N0YXRzKSwgJnN0YXRzKTsKKworCWlmICh0Y3BfZmxhZ3MpCisJCU5MQV9QVVRfVTgoc2tiLCBPVlNfRkxPV19BVFRSX1RDUF9GTEFHUywgdGNwX2ZsYWdzKTsKKworCS8qIElmIE9WU19GTE9XX0FUVFJfQUNUSU9OUyBkb2Vzbid0IGZpdCwgc2tpcCBkdW1waW5nIHRoZSBhY3Rpb25zIGlmCisJICogdGhpcyBpcyB0aGUgZmlyc3QgZmxvdyB0byBiZSBkdW1wZWQgaW50byAnc2tiJy4gIFRoaXMgaXMgdW51c3VhbCBmb3IKKwkgKiBOZXRsaW5rIGJ1dCBpbmRpdmlkdWFsIGFjdGlvbiBsaXN0cyBjYW4gYmUgbG9uZ2VyIHRoYW4KKwkgKiBOTE1TR19HT09EU0laRSBhbmQgdGh1cyBlbnRpcmVseSB1bmR1bXBhYmxlIGlmIHdlIGRpZG4ndCBkbyB0aGlzLgorCSAqIFRoZSB1c2Vyc3BhY2UgY2FsbGVyIGNhbiBhbHdheXMgZmV0Y2ggdGhlIGFjdGlvbnMgc2VwYXJhdGVseSBpZiBpdAorCSAqIHJlYWxseSB3YW50cyB0aGVtLiAgKE1vc3QgdXNlcnNwYWNlIGNhbGxlcnMgaW4gZmFjdCBkb24ndCBjYXJlLikKKwkgKgorCSAqIFRoaXMgY2FuIG9ubHkgZmFpbCBmb3IgZHVtcCBvcGVyYXRpb25zIGJlY2F1c2UgdGhlIHNrYiBpcyBhbHdheXMKKwkgKiBwcm9wZXJseSBzaXplZCBmb3Igc2luZ2xlIGZsb3dzLgorCSAqLworCWVyciA9IG5sYV9wdXQoc2tiLCBPVlNfRkxPV19BVFRSX0FDVElPTlMsIHNmX2FjdHMtPmFjdGlvbnNfbGVuLAorCQkgICAgICBzZl9hY3RzLT5hY3Rpb25zKTsKKwlpZiAoZXJyIDwgMCAmJiBza2Jfb3JpZ19sZW4pCisJCWdvdG8gZXJyb3I7CisKKwlyZXR1cm4gZ2VubG1zZ19lbmQoc2tiLCBvdnNfaGVhZGVyKTsKKworbmxhX3B1dF9mYWlsdXJlOgorCWVyciA9IC1FTVNHU0laRTsKK2Vycm9yOgorCWdlbmxtc2dfY2FuY2VsKHNrYiwgb3ZzX2hlYWRlcik7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpvdnNfZmxvd19jbWRfYWxsb2NfaW5mbyhzdHJ1Y3Qgc3dfZmxvdyAqZmxvdykKK3sKKwljb25zdCBzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zICpzZl9hY3RzOworCWludCBsZW47CisKKwlzZl9hY3RzID0gcmN1X2RlcmVmZXJlbmNlX3Byb3RlY3RlZChmbG93LT5zZl9hY3RzLAorCQkJCQkgICAgbG9ja2RlcF9nZW5sX2lzX2hlbGQoKSk7CisKKwkvKiBPVlNfRkxPV19BVFRSX0tFWSAqLworCWxlbiA9IG5sYV90b3RhbF9zaXplKEZMT1dfQlVGU0laRSk7CisJLyogT1ZTX0ZMT1dfQVRUUl9BQ1RJT05TICovCisJbGVuICs9IG5sYV90b3RhbF9zaXplKHNmX2FjdHMtPmFjdGlvbnNfbGVuKTsKKwkvKiBPVlNfRkxPV19BVFRSX1NUQVRTICovCisJbGVuICs9IG5sYV90b3RhbF9zaXplKHNpemVvZihzdHJ1Y3Qgb3ZzX2Zsb3dfc3RhdHMpKTsKKwkvKiBPVlNfRkxPV19BVFRSX1RDUF9GTEFHUyAqLworCWxlbiArPSBubGFfdG90YWxfc2l6ZSgxKTsKKwkvKiBPVlNfRkxPV19BVFRSX1VTRUQgKi8KKwlsZW4gKz0gbmxhX3RvdGFsX3NpemUoOCk7CisKKwlsZW4gKz0gTkxNU0dfQUxJR04oc2l6ZW9mKHN0cnVjdCBvdnNfaGVhZGVyKSk7CisKKwlyZXR1cm4gZ2VubG1zZ19uZXcobGVuLCBHRlBfS0VSTkVMKTsKK30KKworc3RhdGljIHN0cnVjdCBza19idWZmICpvdnNfZmxvd19jbWRfYnVpbGRfaW5mbyhzdHJ1Y3Qgc3dfZmxvdyAqZmxvdywKKwkJCQkJICAgICAgIHN0cnVjdCBkYXRhcGF0aCAqZHAsCisJCQkJCSAgICAgICB1MzIgcGlkLCB1MzIgc2VxLCB1OCBjbWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgcmV0dmFsOworCisJc2tiID0gb3ZzX2Zsb3dfY21kX2FsbG9jX2luZm8oZmxvdyk7CisJaWYgKCFza2IpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJcmV0dmFsID0gb3ZzX2Zsb3dfY21kX2ZpbGxfaW5mbyhmbG93LCBkcCwgc2tiLCBwaWQsIHNlcSwgMCwgY21kKTsKKwlCVUdfT04ocmV0dmFsIDwgMCk7CisJcmV0dXJuIHNrYjsKK30KKworc3RhdGljIGludCBvdnNfZmxvd19jbWRfbmV3X29yX3NldChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBubGF0dHIgKiphID0gaW5mby0+YXR0cnM7CisJc3RydWN0IG92c19oZWFkZXIgKm92c19oZWFkZXIgPSBpbmZvLT51c2VyaGRyOworCXN0cnVjdCBzd19mbG93X2tleSBrZXk7CisJc3RydWN0IHN3X2Zsb3cgKmZsb3c7CisJc3RydWN0IHNrX2J1ZmYgKnJlcGx5OworCXN0cnVjdCBkYXRhcGF0aCAqZHA7CisJc3RydWN0IGZsb3dfdGFibGUgKnRhYmxlOworCWludCBlcnJvcjsKKwlpbnQga2V5X2xlbjsKKworCS8qIEV4dHJhY3Qga2V5LiAqLworCWVycm9yID0gLUVJTlZBTDsKKwlpZiAoIWFbT1ZTX0ZMT1dfQVRUUl9LRVldKQorCQlnb3RvIGVycm9yOworCWVycm9yID0gb3ZzX2Zsb3dfZnJvbV9ubGF0dHJzKCZrZXksICZrZXlfbGVuLCBhW09WU19GTE9XX0FUVFJfS0VZXSk7CisJaWYgKGVycm9yKQorCQlnb3RvIGVycm9yOworCisJLyogVmFsaWRhdGUgYWN0aW9ucy4gKi8KKwlpZiAoYVtPVlNfRkxPV19BVFRSX0FDVElPTlNdKSB7CisJCWVycm9yID0gdmFsaWRhdGVfYWN0aW9ucyhhW09WU19GTE9XX0FUVFJfQUNUSU9OU10sICZrZXksICAwKTsKKwkJaWYgKGVycm9yKQorCQkJZ290byBlcnJvcjsKKwl9IGVsc2UgaWYgKGluZm8tPmdlbmxoZHItPmNtZCA9PSBPVlNfRkxPV19DTURfTkVXKSB7CisJCWVycm9yID0gLUVJTlZBTDsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlkcCA9IGdldF9kcChvdnNfaGVhZGVyLT5kcF9pZmluZGV4KTsKKwllcnJvciA9IC1FTk9ERVY7CisJaWYgKCFkcCkKKwkJZ290byBlcnJvcjsKKworCXRhYmxlID0gZ2VubF9kZXJlZmVyZW5jZShkcC0+dGFibGUpOworCWZsb3cgPSBvdnNfZmxvd190YmxfbG9va3VwKHRhYmxlLCAma2V5LCBrZXlfbGVuKTsKKwlpZiAoIWZsb3cpIHsKKwkJc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqYWN0czsKKworCQkvKiBCYWlsIG91dCBpZiB3ZSdyZSBub3QgYWxsb3dlZCB0byBjcmVhdGUgYSBuZXcgZmxvdy4gKi8KKwkJZXJyb3IgPSAtRU5PRU5UOworCQlpZiAoaW5mby0+Z2VubGhkci0+Y21kID09IE9WU19GTE9XX0NNRF9TRVQpCisJCQlnb3RvIGVycm9yOworCisJCS8qIEV4cGFuZCB0YWJsZSwgaWYgbmVjZXNzYXJ5LCB0byBtYWtlIHJvb20uICovCisJCWlmIChvdnNfZmxvd190YmxfbmVlZF90b19leHBhbmQodGFibGUpKSB7CisJCQlzdHJ1Y3QgZmxvd190YWJsZSAqbmV3X3RhYmxlOworCisJCQluZXdfdGFibGUgPSBvdnNfZmxvd190YmxfZXhwYW5kKHRhYmxlKTsKKwkJCWlmICghSVNfRVJSKG5ld190YWJsZSkpIHsKKwkJCQlyY3VfYXNzaWduX3BvaW50ZXIoZHAtPnRhYmxlLCBuZXdfdGFibGUpOworCQkJCW92c19mbG93X3RibF9kZWZlcnJlZF9kZXN0cm95KHRhYmxlKTsKKwkJCQl0YWJsZSA9IGdlbmxfZGVyZWZlcmVuY2UoZHAtPnRhYmxlKTsKKwkJCX0KKwkJfQorCisJCS8qIEFsbG9jYXRlIGZsb3cuICovCisJCWZsb3cgPSBvdnNfZmxvd19hbGxvYygpOworCQlpZiAoSVNfRVJSKGZsb3cpKSB7CisJCQllcnJvciA9IFBUUl9FUlIoZmxvdyk7CisJCQlnb3RvIGVycm9yOworCQl9CisJCWZsb3ctPmtleSA9IGtleTsKKwkJY2xlYXJfc3RhdHMoZmxvdyk7CisKKwkJLyogT2J0YWluIGFjdGlvbnMuICovCisJCWFjdHMgPSBvdnNfZmxvd19hY3Rpb25zX2FsbG9jKGFbT1ZTX0ZMT1dfQVRUUl9BQ1RJT05TXSk7CisJCWVycm9yID0gUFRSX0VSUihhY3RzKTsKKwkJaWYgKElTX0VSUihhY3RzKSkKKwkJCWdvdG8gZXJyb3JfZnJlZV9mbG93OworCQlyY3VfYXNzaWduX3BvaW50ZXIoZmxvdy0+c2ZfYWN0cywgYWN0cyk7CisKKwkJLyogUHV0IGZsb3cgaW4gYnVja2V0LiAqLworCQlmbG93LT5oYXNoID0gb3ZzX2Zsb3dfaGFzaCgma2V5LCBrZXlfbGVuKTsKKwkJb3ZzX2Zsb3dfdGJsX2luc2VydCh0YWJsZSwgZmxvdyk7CisKKwkJcmVwbHkgPSBvdnNfZmxvd19jbWRfYnVpbGRfaW5mbyhmbG93LCBkcCwgaW5mby0+c25kX3BpZCwKKwkJCQkJCWluZm8tPnNuZF9zZXEsCisJCQkJCQlPVlNfRkxPV19DTURfTkVXKTsKKwl9IGVsc2UgeworCQkvKiBXZSBmb3VuZCBhIG1hdGNoaW5nIGZsb3cuICovCisJCXN0cnVjdCBzd19mbG93X2FjdGlvbnMgKm9sZF9hY3RzOworCQlzdHJ1Y3QgbmxhdHRyICphY3RzX2F0dHJzOworCisJCS8qIEJhaWwgb3V0IGlmIHdlJ3JlIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSBhbiBleGlzdGluZyBmbG93LgorCQkgKiBXZSBhY2NlcHQgTkxNX0ZfQ1JFQVRFIGluIHBsYWNlIG9mIHRoZSBpbnRlbmRlZCBOTE1fRl9FWENMCisJCSAqIGJlY2F1c2UgR2VuZXJpYyBOZXRsaW5rIHRyZWF0cyB0aGUgbGF0dGVyIGFzIGEgZHVtcAorCQkgKiByZXF1ZXN0LiAgV2UgYWxzbyBhY2NlcHQgTkxNX0ZfRVhDTCBpbiBjYXNlIHRoYXQgYnVnIGV2ZXIKKwkJICogZ2V0cyBmaXhlZC4KKwkJICovCisJCWVycm9yID0gLUVFWElTVDsKKwkJaWYgKGluZm8tPmdlbmxoZHItPmNtZCA9PSBPVlNfRkxPV19DTURfTkVXICYmCisJCSAgICBpbmZvLT5ubGhkci0+bmxtc2dfZmxhZ3MgJiAoTkxNX0ZfQ1JFQVRFIHwgTkxNX0ZfRVhDTCkpCisJCQlnb3RvIGVycm9yOworCisJCS8qIFVwZGF0ZSBhY3Rpb25zLiAqLworCQlvbGRfYWN0cyA9IHJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoZmxvdy0+c2ZfYWN0cywKKwkJCQkJCSAgICAgbG9ja2RlcF9nZW5sX2lzX2hlbGQoKSk7CisJCWFjdHNfYXR0cnMgPSBhW09WU19GTE9XX0FUVFJfQUNUSU9OU107CisJCWlmIChhY3RzX2F0dHJzICYmCisJCSAgIChvbGRfYWN0cy0+YWN0aW9uc19sZW4gIT0gbmxhX2xlbihhY3RzX2F0dHJzKSB8fAorCQkgICBtZW1jbXAob2xkX2FjdHMtPmFjdGlvbnMsIG5sYV9kYXRhKGFjdHNfYXR0cnMpLAorCQkJICBvbGRfYWN0cy0+YWN0aW9uc19sZW4pKSkgeworCQkJc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqbmV3X2FjdHM7CisKKwkJCW5ld19hY3RzID0gb3ZzX2Zsb3dfYWN0aW9uc19hbGxvYyhhY3RzX2F0dHJzKTsKKwkJCWVycm9yID0gUFRSX0VSUihuZXdfYWN0cyk7CisJCQlpZiAoSVNfRVJSKG5ld19hY3RzKSkKKwkJCQlnb3RvIGVycm9yOworCisJCQlyY3VfYXNzaWduX3BvaW50ZXIoZmxvdy0+c2ZfYWN0cywgbmV3X2FjdHMpOworCQkJb3ZzX2Zsb3dfZGVmZXJyZWRfZnJlZV9hY3RzKG9sZF9hY3RzKTsKKwkJfQorCisJCXJlcGx5ID0gb3ZzX2Zsb3dfY21kX2J1aWxkX2luZm8oZmxvdywgZHAsIGluZm8tPnNuZF9waWQsCisJCQkJCSAgICAgICBpbmZvLT5zbmRfc2VxLCBPVlNfRkxPV19DTURfTkVXKTsKKworCQkvKiBDbGVhciBzdGF0cy4gKi8KKwkJaWYgKGFbT1ZTX0ZMT1dfQVRUUl9DTEVBUl0pIHsKKwkJCXNwaW5fbG9ja19iaCgmZmxvdy0+bG9jayk7CisJCQljbGVhcl9zdGF0cyhmbG93KTsKKwkJCXNwaW5fdW5sb2NrX2JoKCZmbG93LT5sb2NrKTsKKwkJfQorCX0KKworCWlmICghSVNfRVJSKHJlcGx5KSkKKwkJZ2VubF9ub3RpZnkocmVwbHksIGdlbmxfaW5mb19uZXQoaW5mbyksIGluZm8tPnNuZF9waWQsCisJCQkgICBvdnNfZHBfZmxvd19tdWx0aWNhc3RfZ3JvdXAuaWQsIGluZm8tPm5saGRyLAorCQkJICAgR0ZQX0tFUk5FTCk7CisJZWxzZQorCQluZXRsaW5rX3NldF9lcnIoaW5pdF9uZXQuZ2VubF9zb2NrLCAwLAorCQkJCW92c19kcF9mbG93X211bHRpY2FzdF9ncm91cC5pZCwgUFRSX0VSUihyZXBseSkpOworCXJldHVybiAwOworCitlcnJvcl9mcmVlX2Zsb3c6CisJb3ZzX2Zsb3dfZnJlZShmbG93KTsKK2Vycm9yOgorCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBvdnNfZmxvd19jbWRfZ2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5sYXR0ciAqKmEgPSBpbmZvLT5hdHRyczsKKwlzdHJ1Y3Qgb3ZzX2hlYWRlciAqb3ZzX2hlYWRlciA9IGluZm8tPnVzZXJoZHI7CisJc3RydWN0IHN3X2Zsb3dfa2V5IGtleTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CisJc3RydWN0IHN3X2Zsb3cgKmZsb3c7CisJc3RydWN0IGRhdGFwYXRoICpkcDsKKwlzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGU7CisJaW50IGVycjsKKwlpbnQga2V5X2xlbjsKKworCWlmICghYVtPVlNfRkxPV19BVFRSX0tFWV0pCisJCXJldHVybiAtRUlOVkFMOworCWVyciA9IG92c19mbG93X2Zyb21fbmxhdHRycygma2V5LCAma2V5X2xlbiwgYVtPVlNfRkxPV19BVFRSX0tFWV0pOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlkcCA9IGdldF9kcChvdnNfaGVhZGVyLT5kcF9pZmluZGV4KTsKKwlpZiAoIWRwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXRhYmxlID0gZ2VubF9kZXJlZmVyZW5jZShkcC0+dGFibGUpOworCWZsb3cgPSBvdnNfZmxvd190YmxfbG9va3VwKHRhYmxlLCAma2V5LCBrZXlfbGVuKTsKKwlpZiAoIWZsb3cpCisJCXJldHVybiAtRU5PRU5UOworCisJcmVwbHkgPSBvdnNfZmxvd19jbWRfYnVpbGRfaW5mbyhmbG93LCBkcCwgaW5mby0+c25kX3BpZCwKKwkJCQkJaW5mby0+c25kX3NlcSwgT1ZTX0ZMT1dfQ01EX05FVyk7CisJaWYgKElTX0VSUihyZXBseSkpCisJCXJldHVybiBQVFJfRVJSKHJlcGx5KTsKKworCXJldHVybiBnZW5sbXNnX3JlcGx5KHJlcGx5LCBpbmZvKTsKK30KKworc3RhdGljIGludCBvdnNfZmxvd19jbWRfZGVsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5sYXR0ciAqKmEgPSBpbmZvLT5hdHRyczsKKwlzdHJ1Y3Qgb3ZzX2hlYWRlciAqb3ZzX2hlYWRlciA9IGluZm8tPnVzZXJoZHI7CisJc3RydWN0IHN3X2Zsb3dfa2V5IGtleTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CisJc3RydWN0IHN3X2Zsb3cgKmZsb3c7CisJc3RydWN0IGRhdGFwYXRoICpkcDsKKwlzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGU7CisJaW50IGVycjsKKwlpbnQga2V5X2xlbjsKKworCWlmICghYVtPVlNfRkxPV19BVFRSX0tFWV0pCisJCXJldHVybiBmbHVzaF9mbG93cyhvdnNfaGVhZGVyLT5kcF9pZmluZGV4KTsKKwllcnIgPSBvdnNfZmxvd19mcm9tX25sYXR0cnMoJmtleSwgJmtleV9sZW4sIGFbT1ZTX0ZMT1dfQVRUUl9LRVldKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZHAgPSBnZXRfZHAob3ZzX2hlYWRlci0+ZHBfaWZpbmRleCk7CisJaWYgKCFkcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0YWJsZSA9IGdlbmxfZGVyZWZlcmVuY2UoZHAtPnRhYmxlKTsKKwlmbG93ID0gb3ZzX2Zsb3dfdGJsX2xvb2t1cCh0YWJsZSwgJmtleSwga2V5X2xlbik7CisJaWYgKCFmbG93KQorCQlyZXR1cm4gLUVOT0VOVDsKKworCXJlcGx5ID0gb3ZzX2Zsb3dfY21kX2FsbG9jX2luZm8oZmxvdyk7CisJaWYgKCFyZXBseSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlvdnNfZmxvd190YmxfcmVtb3ZlKHRhYmxlLCBmbG93KTsKKworCWVyciA9IG92c19mbG93X2NtZF9maWxsX2luZm8oZmxvdywgZHAsIHJlcGx5LCBpbmZvLT5zbmRfcGlkLAorCQkJCSAgICAgaW5mby0+c25kX3NlcSwgMCwgT1ZTX0ZMT1dfQ01EX0RFTCk7CisJQlVHX09OKGVyciA8IDApOworCisJb3ZzX2Zsb3dfZGVmZXJyZWRfZnJlZShmbG93KTsKKworCWdlbmxfbm90aWZ5KHJlcGx5LCBnZW5sX2luZm9fbmV0KGluZm8pLCBpbmZvLT5zbmRfcGlkLAorCQkgICAgb3ZzX2RwX2Zsb3dfbXVsdGljYXN0X2dyb3VwLmlkLCBpbmZvLT5ubGhkciwgR0ZQX0tFUk5FTCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3ZzX2Zsb3dfY21kX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBvdnNfaGVhZGVyICpvdnNfaGVhZGVyID0gZ2VubG1zZ19kYXRhKG5sbXNnX2RhdGEoY2ItPm5saCkpOworCXN0cnVjdCBkYXRhcGF0aCAqZHA7CisJc3RydWN0IGZsb3dfdGFibGUgKnRhYmxlOworCisJZHAgPSBnZXRfZHAob3ZzX2hlYWRlci0+ZHBfaWZpbmRleCk7CisJaWYgKCFkcCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl0YWJsZSA9IGdlbmxfZGVyZWZlcmVuY2UoZHAtPnRhYmxlKTsKKworCWZvciAoOzspIHsKKwkJc3RydWN0IHN3X2Zsb3cgKmZsb3c7CisJCXUzMiBidWNrZXQsIG9iajsKKworCQlidWNrZXQgPSBjYi0+YXJnc1swXTsKKwkJb2JqID0gY2ItPmFyZ3NbMV07CisJCWZsb3cgPSBvdnNfZmxvd190YmxfbmV4dCh0YWJsZSwgJmJ1Y2tldCwgJm9iaik7CisJCWlmICghZmxvdykKKwkJCWJyZWFrOworCisJCWlmIChvdnNfZmxvd19jbWRfZmlsbF9pbmZvKGZsb3csIGRwLCBza2IsCisJCQkJCSAgIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCQkgICBjYi0+bmxoLT5ubG1zZ19zZXEsIE5MTV9GX01VTFRJLAorCQkJCQkgICBPVlNfRkxPV19DTURfTkVXKSA8IDApCisJCQlicmVhazsKKworCQljYi0+YXJnc1swXSA9IGJ1Y2tldDsKKwkJY2ItPmFyZ3NbMV0gPSBvYmo7CisJfQorCXJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIHN0cnVjdCBnZW5sX29wcyBkcF9mbG93X2dlbmxfb3BzW10gPSB7CisJeyAuY21kID0gT1ZTX0ZMT1dfQ01EX05FVywKKwkgIC5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwgLyogUmVxdWlyZXMgQ0FQX05FVF9BRE1JTiBwcml2aWxlZ2UuICovCisJICAucG9saWN5ID0gZmxvd19wb2xpY3ksCisJICAuZG9pdCA9IG92c19mbG93X2NtZF9uZXdfb3Jfc2V0CisJfSwKKwl7IC5jbWQgPSBPVlNfRkxPV19DTURfREVMLAorCSAgLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLCAvKiBSZXF1aXJlcyBDQVBfTkVUX0FETUlOIHByaXZpbGVnZS4gKi8KKwkgIC5wb2xpY3kgPSBmbG93X3BvbGljeSwKKwkgIC5kb2l0ID0gb3ZzX2Zsb3dfY21kX2RlbAorCX0sCisJeyAuY21kID0gT1ZTX0ZMT1dfQ01EX0dFVCwKKwkgIC5mbGFncyA9IDAsCQkgICAgLyogT0sgZm9yIHVucHJpdmlsZWdlZCB1c2Vycy4gKi8KKwkgIC5wb2xpY3kgPSBmbG93X3BvbGljeSwKKwkgIC5kb2l0ID0gb3ZzX2Zsb3dfY21kX2dldCwKKwkgIC5kdW1waXQgPSBvdnNfZmxvd19jbWRfZHVtcAorCX0sCisJeyAuY21kID0gT1ZTX0ZMT1dfQ01EX1NFVCwKKwkgIC5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwgLyogUmVxdWlyZXMgQ0FQX05FVF9BRE1JTiBwcml2aWxlZ2UuICovCisJICAucG9saWN5ID0gZmxvd19wb2xpY3ksCisJICAuZG9pdCA9IG92c19mbG93X2NtZF9uZXdfb3Jfc2V0LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgZGF0YXBhdGhfcG9saWN5W09WU19EUF9BVFRSX01BWCArIDFdID0geworCVtPVlNfRFBfQVRUUl9OQU1FXSA9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgLmxlbiA9IElGTkFNU0laIC0gMSB9LAorCVtPVlNfRFBfQVRUUl9VUENBTExfUElEXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCit9OworCitzdGF0aWMgc3RydWN0IGdlbmxfZmFtaWx5IGRwX2RhdGFwYXRoX2dlbmxfZmFtaWx5ID0geworCS5pZCA9IEdFTkxfSURfR0VORVJBVEUsCisJLmhkcnNpemUgPSBzaXplb2Yoc3RydWN0IG92c19oZWFkZXIpLAorCS5uYW1lID0gT1ZTX0RBVEFQQVRIX0ZBTUlMWSwKKwkudmVyc2lvbiA9IE9WU19EQVRBUEFUSF9WRVJTSU9OLAorCS5tYXhhdHRyID0gT1ZTX0RQX0FUVFJfTUFYCit9OworCitzdGF0aWMgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIG92c19kcF9kYXRhcGF0aF9tdWx0aWNhc3RfZ3JvdXAgPSB7CisJLm5hbWUgPSBPVlNfREFUQVBBVEhfTUNHUk9VUAorfTsKKworc3RhdGljIGludCBvdnNfZHBfY21kX2ZpbGxfaW5mbyhzdHJ1Y3QgZGF0YXBhdGggKmRwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXUzMiBwaWQsIHUzMiBzZXEsIHUzMiBmbGFncywgdTggY21kKQoreworCXN0cnVjdCBvdnNfaGVhZGVyICpvdnNfaGVhZGVyOworCXN0cnVjdCBvdnNfZHBfc3RhdHMgZHBfc3RhdHM7CisJaW50IGVycjsKKworCW92c19oZWFkZXIgPSBnZW5sbXNnX3B1dChza2IsIHBpZCwgc2VxLCAmZHBfZGF0YXBhdGhfZ2VubF9mYW1pbHksCisJCQkJICAgZmxhZ3MsIGNtZCk7CisJaWYgKCFvdnNfaGVhZGVyKQorCQlnb3RvIGVycm9yOworCisJb3ZzX2hlYWRlci0+ZHBfaWZpbmRleCA9IGdldF9kcGlmaW5kZXgoZHApOworCisJcmN1X3JlYWRfbG9jaygpOworCWVyciA9IG5sYV9wdXRfc3RyaW5nKHNrYiwgT1ZTX0RQX0FUVFJfTkFNRSwgb3ZzX2RwX25hbWUoZHApKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlpZiAoZXJyKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKworCWdldF9kcF9zdGF0cyhkcCwgJmRwX3N0YXRzKTsKKwlOTEFfUFVUKHNrYiwgT1ZTX0RQX0FUVFJfU1RBVFMsIHNpemVvZihzdHJ1Y3Qgb3ZzX2RwX3N0YXRzKSwgJmRwX3N0YXRzKTsKKworCXJldHVybiBnZW5sbXNnX2VuZChza2IsIG92c19oZWFkZXIpOworCitubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwoc2tiLCBvdnNfaGVhZGVyKTsKK2Vycm9yOgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqb3ZzX2RwX2NtZF9idWlsZF9pbmZvKHN0cnVjdCBkYXRhcGF0aCAqZHAsIHUzMiBwaWQsCisJCQkJCSAgICAgdTMyIHNlcSwgdTggY21kKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJaW50IHJldHZhbDsKKworCXNrYiA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghc2tiKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCXJldHZhbCA9IG92c19kcF9jbWRfZmlsbF9pbmZvKGRwLCBza2IsIHBpZCwgc2VxLCAwLCBjbWQpOworCWlmIChyZXR2YWwgPCAwKSB7CisJCWtmcmVlX3NrYihza2IpOworCQlyZXR1cm4gRVJSX1BUUihyZXR2YWwpOworCX0KKwlyZXR1cm4gc2tiOworfQorCisvKiBDYWxsZWQgd2l0aCBnZW5sX211dGV4IGFuZCBvcHRpb25hbGx5IHdpdGggUlROTCBsb2NrIGFsc28uICovCitzdGF0aWMgc3RydWN0IGRhdGFwYXRoICpsb29rdXBfZGF0YXBhdGgoc3RydWN0IG92c19oZWFkZXIgKm92c19oZWFkZXIsCisJCQkJCXN0cnVjdCBubGF0dHIgKmFbT1ZTX0RQX0FUVFJfTUFYICsgMV0pCit7CisJc3RydWN0IGRhdGFwYXRoICpkcDsKKworCWlmICghYVtPVlNfRFBfQVRUUl9OQU1FXSkKKwkJZHAgPSBnZXRfZHAob3ZzX2hlYWRlci0+ZHBfaWZpbmRleCk7CisJZWxzZSB7CisJCXN0cnVjdCB2cG9ydCAqdnBvcnQ7CisKKwkJcmN1X3JlYWRfbG9jaygpOworCQl2cG9ydCA9IG92c192cG9ydF9sb2NhdGUobmxhX2RhdGEoYVtPVlNfRFBfQVRUUl9OQU1FXSkpOworCQlkcCA9IHZwb3J0ICYmIHZwb3J0LT5wb3J0X25vID09IE9WU1BfTE9DQUwgPyB2cG9ydC0+ZHAgOiBOVUxMOworCQlyY3VfcmVhZF91bmxvY2soKTsKKwl9CisJcmV0dXJuIGRwID8gZHAgOiBFUlJfUFRSKC1FTk9ERVYpOworfQorCitzdGF0aWMgaW50IG92c19kcF9jbWRfbmV3KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5sYXR0ciAqKmEgPSBpbmZvLT5hdHRyczsKKwlzdHJ1Y3QgdnBvcnRfcGFybXMgcGFybXM7CisJc3RydWN0IHNrX2J1ZmYgKnJlcGx5OworCXN0cnVjdCBkYXRhcGF0aCAqZHA7CisJc3RydWN0IHZwb3J0ICp2cG9ydDsKKwlpbnQgZXJyOworCisJZXJyID0gLUVJTlZBTDsKKwlpZiAoIWFbT1ZTX0RQX0FUVFJfTkFNRV0gfHwgIWFbT1ZTX0RQX0FUVFJfVVBDQUxMX1BJRF0pCisJCWdvdG8gZXJyOworCisJcnRubF9sb2NrKCk7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KFRISVNfTU9EVUxFKSkKKwkJZ290byBlcnJfdW5sb2NrX3J0bmw7CisKKwllcnIgPSAtRU5PTUVNOworCWRwID0ga3phbGxvYyhzaXplb2YoKmRwKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRwID09IE5VTEwpCisJCWdvdG8gZXJyX3B1dF9tb2R1bGU7CisJSU5JVF9MSVNUX0hFQUQoJmRwLT5wb3J0X2xpc3QpOworCisJLyogQWxsb2NhdGUgdGFibGUuICovCisJZXJyID0gLUVOT01FTTsKKwlyY3VfYXNzaWduX3BvaW50ZXIoZHAtPnRhYmxlLCBvdnNfZmxvd190YmxfYWxsb2MoVEJMX01JTl9CVUNLRVRTKSk7CisJaWYgKCFkcC0+dGFibGUpCisJCWdvdG8gZXJyX2ZyZWVfZHA7CisKKwlkcC0+c3RhdHNfcGVyY3B1ID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBkcF9zdGF0c19wZXJjcHUpOworCWlmICghZHAtPnN0YXRzX3BlcmNwdSkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3RvIGVycl9kZXN0cm95X3RhYmxlOworCX0KKworCS8qIFNldCB1cCBvdXIgZGF0YXBhdGggZGV2aWNlLiAqLworCXBhcm1zLm5hbWUgPSBubGFfZGF0YShhW09WU19EUF9BVFRSX05BTUVdKTsKKwlwYXJtcy50eXBlID0gT1ZTX1ZQT1JUX1RZUEVfSU5URVJOQUw7CisJcGFybXMub3B0aW9ucyA9IE5VTEw7CisJcGFybXMuZHAgPSBkcDsKKwlwYXJtcy5wb3J0X25vID0gT1ZTUF9MT0NBTDsKKwlwYXJtcy51cGNhbGxfcGlkID0gbmxhX2dldF91MzIoYVtPVlNfRFBfQVRUUl9VUENBTExfUElEXSk7CisKKwl2cG9ydCA9IG5ld192cG9ydCgmcGFybXMpOworCWlmIChJU19FUlIodnBvcnQpKSB7CisJCWVyciA9IFBUUl9FUlIodnBvcnQpOworCQlpZiAoZXJyID09IC1FQlVTWSkKKwkJCWVyciA9IC1FRVhJU1Q7CisKKwkJZ290byBlcnJfZGVzdHJveV9wZXJjcHU7CisJfQorCisJcmVwbHkgPSBvdnNfZHBfY21kX2J1aWxkX2luZm8oZHAsIGluZm8tPnNuZF9waWQsCisJCQkJICAgICAgaW5mby0+c25kX3NlcSwgT1ZTX0RQX0NNRF9ORVcpOworCWVyciA9IFBUUl9FUlIocmVwbHkpOworCWlmIChJU19FUlIocmVwbHkpKQorCQlnb3RvIGVycl9kZXN0cm95X2xvY2FsX3BvcnQ7CisKKwlsaXN0X2FkZF90YWlsKCZkcC0+bGlzdF9ub2RlLCAmZHBzKTsKKwlydG5sX3VubG9jaygpOworCisJZ2VubF9ub3RpZnkocmVwbHksIGdlbmxfaW5mb19uZXQoaW5mbyksIGluZm8tPnNuZF9waWQsCisJCSAgICBvdnNfZHBfZGF0YXBhdGhfbXVsdGljYXN0X2dyb3VwLmlkLCBpbmZvLT5ubGhkciwKKwkJICAgIEdGUF9LRVJORUwpOworCXJldHVybiAwOworCitlcnJfZGVzdHJveV9sb2NhbF9wb3J0OgorCW92c19kcF9kZXRhY2hfcG9ydChydG5sX2RlcmVmZXJlbmNlKGRwLT5wb3J0c1tPVlNQX0xPQ0FMXSkpOworZXJyX2Rlc3Ryb3lfcGVyY3B1OgorCWZyZWVfcGVyY3B1KGRwLT5zdGF0c19wZXJjcHUpOworZXJyX2Rlc3Ryb3lfdGFibGU6CisJb3ZzX2Zsb3dfdGJsX2Rlc3Ryb3koZ2VubF9kZXJlZmVyZW5jZShkcC0+dGFibGUpKTsKK2Vycl9mcmVlX2RwOgorCWtmcmVlKGRwKTsKK2Vycl9wdXRfbW9kdWxlOgorCW1vZHVsZV9wdXQoVEhJU19NT0RVTEUpOworZXJyX3VubG9ja19ydG5sOgorCXJ0bmxfdW5sb2NrKCk7CitlcnI6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvdnNfZHBfY21kX2RlbChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCB2cG9ydCAqdnBvcnQsICpuZXh0X3Zwb3J0OworCXN0cnVjdCBza19idWZmICpyZXBseTsKKwlzdHJ1Y3QgZGF0YXBhdGggKmRwOworCWludCBlcnI7CisKKwlydG5sX2xvY2soKTsKKwlkcCA9IGxvb2t1cF9kYXRhcGF0aChpbmZvLT51c2VyaGRyLCBpbmZvLT5hdHRycyk7CisJZXJyID0gUFRSX0VSUihkcCk7CisJaWYgKElTX0VSUihkcCkpCisJCWdvdG8gZXhpdF91bmxvY2s7CisKKwlyZXBseSA9IG92c19kcF9jbWRfYnVpbGRfaW5mbyhkcCwgaW5mby0+c25kX3BpZCwKKwkJCQkgICAgICBpbmZvLT5zbmRfc2VxLCBPVlNfRFBfQ01EX0RFTCk7CisJZXJyID0gUFRSX0VSUihyZXBseSk7CisJaWYgKElTX0VSUihyZXBseSkpCisJCWdvdG8gZXhpdF91bmxvY2s7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodnBvcnQsIG5leHRfdnBvcnQsICZkcC0+cG9ydF9saXN0LCBub2RlKQorCQlpZiAodnBvcnQtPnBvcnRfbm8gIT0gT1ZTUF9MT0NBTCkKKwkJCW92c19kcF9kZXRhY2hfcG9ydCh2cG9ydCk7CisKKwlsaXN0X2RlbCgmZHAtPmxpc3Rfbm9kZSk7CisJb3ZzX2RwX2RldGFjaF9wb3J0KHJ0bmxfZGVyZWZlcmVuY2UoZHAtPnBvcnRzW09WU1BfTE9DQUxdKSk7CisKKwkvKiBydG5sX3VubG9jaygpIHdpbGwgd2FpdCB1bnRpbCBhbGwgdGhlIHJlZmVyZW5jZXMgdG8gZGV2aWNlcyB0aGF0CisJICogYXJlIHBlbmRpbmcgdW5yZWdpc3RyYXRpb24gaGF2ZSBiZWVuIGRyb3BwZWQuICBXZSBkbyBpdCBoZXJlIHRvCisJICogZW5zdXJlIHRoYXQgYW55IGludGVybmFsIGRldmljZXMgKHdoaWNoIGNvbnRhaW4gRFAgcG9pbnRlcnMpIGFyZQorCSAqIGZ1bGx5IGRlc3Ryb3llZCBiZWZvcmUgZnJlZWluZyB0aGUgZGF0YXBhdGguCisJICovCisJcnRubF91bmxvY2soKTsKKworCWNhbGxfcmN1KCZkcC0+cmN1LCBkZXN0cm95X2RwX3JjdSk7CisJbW9kdWxlX3B1dChUSElTX01PRFVMRSk7CisKKwlnZW5sX25vdGlmeShyZXBseSwgZ2VubF9pbmZvX25ldChpbmZvKSwgaW5mby0+c25kX3BpZCwKKwkJICAgIG92c19kcF9kYXRhcGF0aF9tdWx0aWNhc3RfZ3JvdXAuaWQsIGluZm8tPm5saGRyLAorCQkgICAgR0ZQX0tFUk5FTCk7CisKKwlyZXR1cm4gMDsKKworZXhpdF91bmxvY2s6CisJcnRubF91bmxvY2soKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG92c19kcF9jbWRfc2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IHNrX2J1ZmYgKnJlcGx5OworCXN0cnVjdCBkYXRhcGF0aCAqZHA7CisJaW50IGVycjsKKworCWRwID0gbG9va3VwX2RhdGFwYXRoKGluZm8tPnVzZXJoZHIsIGluZm8tPmF0dHJzKTsKKwlpZiAoSVNfRVJSKGRwKSkKKwkJcmV0dXJuIFBUUl9FUlIoZHApOworCisJcmVwbHkgPSBvdnNfZHBfY21kX2J1aWxkX2luZm8oZHAsIGluZm8tPnNuZF9waWQsCisJCQkJICAgICAgaW5mby0+c25kX3NlcSwgT1ZTX0RQX0NNRF9ORVcpOworCWlmIChJU19FUlIocmVwbHkpKSB7CisJCWVyciA9IFBUUl9FUlIocmVwbHkpOworCQluZXRsaW5rX3NldF9lcnIoaW5pdF9uZXQuZ2VubF9zb2NrLCAwLAorCQkJCW92c19kcF9kYXRhcGF0aF9tdWx0aWNhc3RfZ3JvdXAuaWQsIGVycik7CisJCXJldHVybiAwOworCX0KKworCWdlbmxfbm90aWZ5KHJlcGx5LCBnZW5sX2luZm9fbmV0KGluZm8pLCBpbmZvLT5zbmRfcGlkLAorCQkgICAgb3ZzX2RwX2RhdGFwYXRoX211bHRpY2FzdF9ncm91cC5pZCwgaW5mby0+bmxoZHIsCisJCSAgICBHRlBfS0VSTkVMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG92c19kcF9jbWRfZ2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IHNrX2J1ZmYgKnJlcGx5OworCXN0cnVjdCBkYXRhcGF0aCAqZHA7CisKKwlkcCA9IGxvb2t1cF9kYXRhcGF0aChpbmZvLT51c2VyaGRyLCBpbmZvLT5hdHRycyk7CisJaWYgKElTX0VSUihkcCkpCisJCXJldHVybiBQVFJfRVJSKGRwKTsKKworCXJlcGx5ID0gb3ZzX2RwX2NtZF9idWlsZF9pbmZvKGRwLCBpbmZvLT5zbmRfcGlkLAorCQkJCSAgICAgIGluZm8tPnNuZF9zZXEsIE9WU19EUF9DTURfTkVXKTsKKwlpZiAoSVNfRVJSKHJlcGx5KSkKKwkJcmV0dXJuIFBUUl9FUlIocmVwbHkpOworCisJcmV0dXJuIGdlbmxtc2dfcmVwbHkocmVwbHksIGluZm8pOworfQorCitzdGF0aWMgaW50IG92c19kcF9jbWRfZHVtcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgbmV0bGlua19jYWxsYmFjayAqY2IpCit7CisJc3RydWN0IGRhdGFwYXRoICpkcDsKKwlpbnQgc2tpcCA9IGNiLT5hcmdzWzBdOworCWludCBpID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZHAsICZkcHMsIGxpc3Rfbm9kZSkgeworCQlpZiAoaSA8IHNraXApCisJCQljb250aW51ZTsKKwkJaWYgKG92c19kcF9jbWRfZmlsbF9pbmZvKGRwLCBza2IsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCQkgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwKKwkJCQkJIE9WU19EUF9DTURfTkVXKSA8IDApCisJCQlicmVhazsKKwkJaSsrOworCX0KKworCWNiLT5hcmdzWzBdID0gaTsKKworCXJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIHN0cnVjdCBnZW5sX29wcyBkcF9kYXRhcGF0aF9nZW5sX29wc1tdID0geworCXsgLmNtZCA9IE9WU19EUF9DTURfTkVXLAorCSAgLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLCAvKiBSZXF1aXJlcyBDQVBfTkVUX0FETUlOIHByaXZpbGVnZS4gKi8KKwkgIC5wb2xpY3kgPSBkYXRhcGF0aF9wb2xpY3ksCisJICAuZG9pdCA9IG92c19kcF9jbWRfbmV3CisJfSwKKwl7IC5jbWQgPSBPVlNfRFBfQ01EX0RFTCwKKwkgIC5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwgLyogUmVxdWlyZXMgQ0FQX05FVF9BRE1JTiBwcml2aWxlZ2UuICovCisJICAucG9saWN5ID0gZGF0YXBhdGhfcG9saWN5LAorCSAgLmRvaXQgPSBvdnNfZHBfY21kX2RlbAorCX0sCisJeyAuY21kID0gT1ZTX0RQX0NNRF9HRVQsCisJICAuZmxhZ3MgPSAwLAkJICAgIC8qIE9LIGZvciB1bnByaXZpbGVnZWQgdXNlcnMuICovCisJICAucG9saWN5ID0gZGF0YXBhdGhfcG9saWN5LAorCSAgLmRvaXQgPSBvdnNfZHBfY21kX2dldCwKKwkgIC5kdW1waXQgPSBvdnNfZHBfY21kX2R1bXAKKwl9LAorCXsgLmNtZCA9IE9WU19EUF9DTURfU0VULAorCSAgLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLCAvKiBSZXF1aXJlcyBDQVBfTkVUX0FETUlOIHByaXZpbGVnZS4gKi8KKwkgIC5wb2xpY3kgPSBkYXRhcGF0aF9wb2xpY3ksCisJICAuZG9pdCA9IG92c19kcF9jbWRfc2V0LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgdnBvcnRfcG9saWN5W09WU19WUE9SVF9BVFRSX01BWCArIDFdID0geworCVtPVlNfVlBPUlRfQVRUUl9OQU1FXSA9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgLmxlbiA9IElGTkFNU0laIC0gMSB9LAorCVtPVlNfVlBPUlRfQVRUUl9TVEFUU10gPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IG92c192cG9ydF9zdGF0cykgfSwKKwlbT1ZTX1ZQT1JUX0FUVFJfUE9SVF9OT10gPSB7IC50eXBlID0gTkxBX1UzMiB9LAorCVtPVlNfVlBPUlRfQVRUUl9UWVBFXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCisJW09WU19WUE9SVF9BVFRSX1VQQ0FMTF9QSURdID0geyAudHlwZSA9IE5MQV9VMzIgfSwKKwlbT1ZTX1ZQT1JUX0FUVFJfT1BUSU9OU10gPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAorfTsKKworc3RhdGljIHN0cnVjdCBnZW5sX2ZhbWlseSBkcF92cG9ydF9nZW5sX2ZhbWlseSA9IHsKKwkuaWQgPSBHRU5MX0lEX0dFTkVSQVRFLAorCS5oZHJzaXplID0gc2l6ZW9mKHN0cnVjdCBvdnNfaGVhZGVyKSwKKwkubmFtZSA9IE9WU19WUE9SVF9GQU1JTFksCisJLnZlcnNpb24gPSBPVlNfVlBPUlRfVkVSU0lPTiwKKwkubWF4YXR0ciA9IE9WU19WUE9SVF9BVFRSX01BWAorfTsKKworc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIG92c19kcF92cG9ydF9tdWx0aWNhc3RfZ3JvdXAgPSB7CisJLm5hbWUgPSBPVlNfVlBPUlRfTUNHUk9VUAorfTsKKworLyogQ2FsbGVkIHdpdGggUlROTCBsb2NrIG9yIFJDVSByZWFkIGxvY2suICovCitzdGF0aWMgaW50IG92c192cG9ydF9jbWRfZmlsbF9pbmZvKHN0cnVjdCB2cG9ydCAqdnBvcnQsIHN0cnVjdCBza19idWZmICpza2IsCisJCQkJICAgdTMyIHBpZCwgdTMyIHNlcSwgdTMyIGZsYWdzLCB1OCBjbWQpCit7CisJc3RydWN0IG92c19oZWFkZXIgKm92c19oZWFkZXI7CisJc3RydWN0IG92c192cG9ydF9zdGF0cyB2cG9ydF9zdGF0czsKKwlpbnQgZXJyOworCisJb3ZzX2hlYWRlciA9IGdlbmxtc2dfcHV0KHNrYiwgcGlkLCBzZXEsICZkcF92cG9ydF9nZW5sX2ZhbWlseSwKKwkJCQkgZmxhZ3MsIGNtZCk7CisJaWYgKCFvdnNfaGVhZGVyKQorCQlyZXR1cm4gLUVNU0dTSVpFOworCisJb3ZzX2hlYWRlci0+ZHBfaWZpbmRleCA9IGdldF9kcGlmaW5kZXgodnBvcnQtPmRwKTsKKworCU5MQV9QVVRfVTMyKHNrYiwgT1ZTX1ZQT1JUX0FUVFJfUE9SVF9OTywgdnBvcnQtPnBvcnRfbm8pOworCU5MQV9QVVRfVTMyKHNrYiwgT1ZTX1ZQT1JUX0FUVFJfVFlQRSwgdnBvcnQtPm9wcy0+dHlwZSk7CisJTkxBX1BVVF9TVFJJTkcoc2tiLCBPVlNfVlBPUlRfQVRUUl9OQU1FLCB2cG9ydC0+b3BzLT5nZXRfbmFtZSh2cG9ydCkpOworCU5MQV9QVVRfVTMyKHNrYiwgT1ZTX1ZQT1JUX0FUVFJfVVBDQUxMX1BJRCwgdnBvcnQtPnVwY2FsbF9waWQpOworCisJb3ZzX3Zwb3J0X2dldF9zdGF0cyh2cG9ydCwgJnZwb3J0X3N0YXRzKTsKKwlOTEFfUFVUKHNrYiwgT1ZTX1ZQT1JUX0FUVFJfU1RBVFMsIHNpemVvZihzdHJ1Y3Qgb3ZzX3Zwb3J0X3N0YXRzKSwKKwkJJnZwb3J0X3N0YXRzKTsKKworCWVyciA9IG92c192cG9ydF9nZXRfb3B0aW9ucyh2cG9ydCwgc2tiKTsKKwlpZiAoZXJyID09IC1FTVNHU0laRSkKKwkJZ290byBlcnJvcjsKKworCXJldHVybiBnZW5sbXNnX2VuZChza2IsIG92c19oZWFkZXIpOworCitubGFfcHV0X2ZhaWx1cmU6CisJZXJyID0gLUVNU0dTSVpFOworZXJyb3I6CisJZ2VubG1zZ19jYW5jZWwoc2tiLCBvdnNfaGVhZGVyKTsKKwlyZXR1cm4gZXJyOworfQorCisvKiBDYWxsZWQgd2l0aCBSVE5MIGxvY2sgb3IgUkNVIHJlYWQgbG9jay4gKi8KK3N0cnVjdCBza19idWZmICpvdnNfdnBvcnRfY21kX2J1aWxkX2luZm8oc3RydWN0IHZwb3J0ICp2cG9ydCwgdTMyIHBpZCwKKwkJCQkJIHUzMiBzZXEsIHU4IGNtZCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiOworCWludCByZXR2YWw7CisKKwlza2IgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXNrYikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlyZXR2YWwgPSBvdnNfdnBvcnRfY21kX2ZpbGxfaW5mbyh2cG9ydCwgc2tiLCBwaWQsIHNlcSwgMCwgY21kKTsKKwlpZiAocmV0dmFsIDwgMCkgeworCQlrZnJlZV9za2Ioc2tiKTsKKwkJcmV0dXJuIEVSUl9QVFIocmV0dmFsKTsKKwl9CisJcmV0dXJuIHNrYjsKK30KKworLyogQ2FsbGVkIHdpdGggUlROTCBsb2NrIG9yIFJDVSByZWFkIGxvY2suICovCitzdGF0aWMgc3RydWN0IHZwb3J0ICpsb29rdXBfdnBvcnQoc3RydWN0IG92c19oZWFkZXIgKm92c19oZWFkZXIsCisJCQkJICBzdHJ1Y3QgbmxhdHRyICphW09WU19WUE9SVF9BVFRSX01BWCArIDFdKQoreworCXN0cnVjdCBkYXRhcGF0aCAqZHA7CisJc3RydWN0IHZwb3J0ICp2cG9ydDsKKworCWlmIChhW09WU19WUE9SVF9BVFRSX05BTUVdKSB7CisJCXZwb3J0ID0gb3ZzX3Zwb3J0X2xvY2F0ZShubGFfZGF0YShhW09WU19WUE9SVF9BVFRSX05BTUVdKSk7CisJCWlmICghdnBvcnQpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKwkJcmV0dXJuIHZwb3J0OworCX0gZWxzZSBpZiAoYVtPVlNfVlBPUlRfQVRUUl9QT1JUX05PXSkgeworCQl1MzIgcG9ydF9ubyA9IG5sYV9nZXRfdTMyKGFbT1ZTX1ZQT1JUX0FUVFJfUE9SVF9OT10pOworCisJCWlmIChwb3J0X25vID49IERQX01BWF9QT1JUUykKKwkJCXJldHVybiBFUlJfUFRSKC1FRkJJRyk7CisKKwkJZHAgPSBnZXRfZHAob3ZzX2hlYWRlci0+ZHBfaWZpbmRleCk7CisJCWlmICghZHApCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKKworCQl2cG9ydCA9IHJjdV9kZXJlZmVyZW5jZV9ydG5sKGRwLT5wb3J0c1twb3J0X25vXSk7CisJCWlmICghdnBvcnQpCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJcmV0dXJuIHZwb3J0OworCX0gZWxzZQorCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKK30KKworc3RhdGljIGludCBvdnNfdnBvcnRfY21kX25ldyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBubGF0dHIgKiphID0gaW5mby0+YXR0cnM7CisJc3RydWN0IG92c19oZWFkZXIgKm92c19oZWFkZXIgPSBpbmZvLT51c2VyaGRyOworCXN0cnVjdCB2cG9ydF9wYXJtcyBwYXJtczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CisJc3RydWN0IHZwb3J0ICp2cG9ydDsKKwlzdHJ1Y3QgZGF0YXBhdGggKmRwOworCXUzMiBwb3J0X25vOworCWludCBlcnI7CisKKwllcnIgPSAtRUlOVkFMOworCWlmICghYVtPVlNfVlBPUlRfQVRUUl9OQU1FXSB8fCAhYVtPVlNfVlBPUlRfQVRUUl9UWVBFXSB8fAorCSAgICAhYVtPVlNfVlBPUlRfQVRUUl9VUENBTExfUElEXSkKKwkJZ290byBleGl0OworCisJcnRubF9sb2NrKCk7CisJZHAgPSBnZXRfZHAob3ZzX2hlYWRlci0+ZHBfaWZpbmRleCk7CisJZXJyID0gLUVOT0RFVjsKKwlpZiAoIWRwKQorCQlnb3RvIGV4aXRfdW5sb2NrOworCisJaWYgKGFbT1ZTX1ZQT1JUX0FUVFJfUE9SVF9OT10pIHsKKwkJcG9ydF9ubyA9IG5sYV9nZXRfdTMyKGFbT1ZTX1ZQT1JUX0FUVFJfUE9SVF9OT10pOworCisJCWVyciA9IC1FRkJJRzsKKwkJaWYgKHBvcnRfbm8gPj0gRFBfTUFYX1BPUlRTKQorCQkJZ290byBleGl0X3VubG9jazsKKworCQl2cG9ydCA9IHJ0bmxfZGVyZWZlcmVuY2UoZHAtPnBvcnRzW3BvcnRfbm9dKTsKKwkJZXJyID0gLUVCVVNZOworCQlpZiAodnBvcnQpCisJCQlnb3RvIGV4aXRfdW5sb2NrOworCX0gZWxzZSB7CisJCWZvciAocG9ydF9ubyA9IDE7IDsgcG9ydF9ubysrKSB7CisJCQlpZiAocG9ydF9ubyA+PSBEUF9NQVhfUE9SVFMpIHsKKwkJCQllcnIgPSAtRUZCSUc7CisJCQkJZ290byBleGl0X3VubG9jazsKKwkJCX0KKwkJCXZwb3J0ID0gcnRubF9kZXJlZmVyZW5jZShkcC0+cG9ydHNbcG9ydF9ub10pOworCQkJaWYgKCF2cG9ydCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCXBhcm1zLm5hbWUgPSBubGFfZGF0YShhW09WU19WUE9SVF9BVFRSX05BTUVdKTsKKwlwYXJtcy50eXBlID0gbmxhX2dldF91MzIoYVtPVlNfVlBPUlRfQVRUUl9UWVBFXSk7CisJcGFybXMub3B0aW9ucyA9IGFbT1ZTX1ZQT1JUX0FUVFJfT1BUSU9OU107CisJcGFybXMuZHAgPSBkcDsKKwlwYXJtcy5wb3J0X25vID0gcG9ydF9ubzsKKwlwYXJtcy51cGNhbGxfcGlkID0gbmxhX2dldF91MzIoYVtPVlNfVlBPUlRfQVRUUl9VUENBTExfUElEXSk7CisKKwl2cG9ydCA9IG5ld192cG9ydCgmcGFybXMpOworCWVyciA9IFBUUl9FUlIodnBvcnQpOworCWlmIChJU19FUlIodnBvcnQpKQorCQlnb3RvIGV4aXRfdW5sb2NrOworCisJcmVwbHkgPSBvdnNfdnBvcnRfY21kX2J1aWxkX2luZm8odnBvcnQsIGluZm8tPnNuZF9waWQsIGluZm8tPnNuZF9zZXEsCisJCQkJCSBPVlNfVlBPUlRfQ01EX05FVyk7CisJaWYgKElTX0VSUihyZXBseSkpIHsKKwkJZXJyID0gUFRSX0VSUihyZXBseSk7CisJCW92c19kcF9kZXRhY2hfcG9ydCh2cG9ydCk7CisJCWdvdG8gZXhpdF91bmxvY2s7CisJfQorCWdlbmxfbm90aWZ5KHJlcGx5LCBnZW5sX2luZm9fbmV0KGluZm8pLCBpbmZvLT5zbmRfcGlkLAorCQkgICAgb3ZzX2RwX3Zwb3J0X211bHRpY2FzdF9ncm91cC5pZCwgaW5mby0+bmxoZHIsIEdGUF9LRVJORUwpOworCitleGl0X3VubG9jazoKKwlydG5sX3VubG9jaygpOworZXhpdDoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG92c192cG9ydF9jbWRfc2V0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5sYXR0ciAqKmEgPSBpbmZvLT5hdHRyczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CisJc3RydWN0IHZwb3J0ICp2cG9ydDsKKwlpbnQgZXJyOworCisJcnRubF9sb2NrKCk7CisJdnBvcnQgPSBsb29rdXBfdnBvcnQoaW5mby0+dXNlcmhkciwgYSk7CisJZXJyID0gUFRSX0VSUih2cG9ydCk7CisJaWYgKElTX0VSUih2cG9ydCkpCisJCWdvdG8gZXhpdF91bmxvY2s7CisKKwllcnIgPSAwOworCWlmIChhW09WU19WUE9SVF9BVFRSX1RZUEVdICYmCisJICAgIG5sYV9nZXRfdTMyKGFbT1ZTX1ZQT1JUX0FUVFJfVFlQRV0pICE9IHZwb3J0LT5vcHMtPnR5cGUpCisJCWVyciA9IC1FSU5WQUw7CisKKwlpZiAoIWVyciAmJiBhW09WU19WUE9SVF9BVFRSX09QVElPTlNdKQorCQllcnIgPSBvdnNfdnBvcnRfc2V0X29wdGlvbnModnBvcnQsIGFbT1ZTX1ZQT1JUX0FUVFJfT1BUSU9OU10pOworCWlmICghZXJyICYmIGFbT1ZTX1ZQT1JUX0FUVFJfVVBDQUxMX1BJRF0pCisJCXZwb3J0LT51cGNhbGxfcGlkID0gbmxhX2dldF91MzIoYVtPVlNfVlBPUlRfQVRUUl9VUENBTExfUElEXSk7CisKKwlyZXBseSA9IG92c192cG9ydF9jbWRfYnVpbGRfaW5mbyh2cG9ydCwgaW5mby0+c25kX3BpZCwgaW5mby0+c25kX3NlcSwKKwkJCQkJIE9WU19WUE9SVF9DTURfTkVXKTsKKwlpZiAoSVNfRVJSKHJlcGx5KSkgeworCQllcnIgPSBQVFJfRVJSKHJlcGx5KTsKKwkJbmV0bGlua19zZXRfZXJyKGluaXRfbmV0Lmdlbmxfc29jaywgMCwKKwkJCQlvdnNfZHBfdnBvcnRfbXVsdGljYXN0X2dyb3VwLmlkLCBlcnIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlnZW5sX25vdGlmeShyZXBseSwgZ2VubF9pbmZvX25ldChpbmZvKSwgaW5mby0+c25kX3BpZCwKKwkJICAgIG92c19kcF92cG9ydF9tdWx0aWNhc3RfZ3JvdXAuaWQsIGluZm8tPm5saGRyLCBHRlBfS0VSTkVMKTsKKworZXhpdF91bmxvY2s6CisJcnRubF91bmxvY2soKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IG92c192cG9ydF9jbWRfZGVsKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5sYXR0ciAqKmEgPSBpbmZvLT5hdHRyczsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CisJc3RydWN0IHZwb3J0ICp2cG9ydDsKKwlpbnQgZXJyOworCisJcnRubF9sb2NrKCk7CisJdnBvcnQgPSBsb29rdXBfdnBvcnQoaW5mby0+dXNlcmhkciwgYSk7CisJZXJyID0gUFRSX0VSUih2cG9ydCk7CisJaWYgKElTX0VSUih2cG9ydCkpCisJCWdvdG8gZXhpdF91bmxvY2s7CisKKwlpZiAodnBvcnQtPnBvcnRfbm8gPT0gT1ZTUF9MT0NBTCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGV4aXRfdW5sb2NrOworCX0KKworCXJlcGx5ID0gb3ZzX3Zwb3J0X2NtZF9idWlsZF9pbmZvKHZwb3J0LCBpbmZvLT5zbmRfcGlkLCBpbmZvLT5zbmRfc2VxLAorCQkJCQkgT1ZTX1ZQT1JUX0NNRF9ERUwpOworCWVyciA9IFBUUl9FUlIocmVwbHkpOworCWlmIChJU19FUlIocmVwbHkpKQorCQlnb3RvIGV4aXRfdW5sb2NrOworCisJb3ZzX2RwX2RldGFjaF9wb3J0KHZwb3J0KTsKKworCWdlbmxfbm90aWZ5KHJlcGx5LCBnZW5sX2luZm9fbmV0KGluZm8pLCBpbmZvLT5zbmRfcGlkLAorCQkgICAgb3ZzX2RwX3Zwb3J0X211bHRpY2FzdF9ncm91cC5pZCwgaW5mby0+bmxoZHIsIEdGUF9LRVJORUwpOworCitleGl0X3VubG9jazoKKwlydG5sX3VubG9jaygpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgb3ZzX3Zwb3J0X2NtZF9nZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgbmxhdHRyICoqYSA9IGluZm8tPmF0dHJzOworCXN0cnVjdCBvdnNfaGVhZGVyICpvdnNfaGVhZGVyID0gaW5mby0+dXNlcmhkcjsKKwlzdHJ1Y3Qgc2tfYnVmZiAqcmVwbHk7CisJc3RydWN0IHZwb3J0ICp2cG9ydDsKKwlpbnQgZXJyOworCisJcmN1X3JlYWRfbG9jaygpOworCXZwb3J0ID0gbG9va3VwX3Zwb3J0KG92c19oZWFkZXIsIGEpOworCWVyciA9IFBUUl9FUlIodnBvcnQpOworCWlmIChJU19FUlIodnBvcnQpKQorCQlnb3RvIGV4aXRfdW5sb2NrOworCisJcmVwbHkgPSBvdnNfdnBvcnRfY21kX2J1aWxkX2luZm8odnBvcnQsIGluZm8tPnNuZF9waWQsIGluZm8tPnNuZF9zZXEsCisJCQkJCSBPVlNfVlBPUlRfQ01EX05FVyk7CisJZXJyID0gUFRSX0VSUihyZXBseSk7CisJaWYgKElTX0VSUihyZXBseSkpCisJCWdvdG8gZXhpdF91bmxvY2s7CisKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiBnZW5sbXNnX3JlcGx5KHJlcGx5LCBpbmZvKTsKKworZXhpdF91bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBvdnNfdnBvcnRfY21kX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCBvdnNfaGVhZGVyICpvdnNfaGVhZGVyID0gZ2VubG1zZ19kYXRhKG5sbXNnX2RhdGEoY2ItPm5saCkpOworCXN0cnVjdCBkYXRhcGF0aCAqZHA7CisJdTMyIHBvcnRfbm87CisJaW50IHJldHZhbDsKKworCWRwID0gZ2V0X2RwKG92c19oZWFkZXItPmRwX2lmaW5kZXgpOworCWlmICghZHApCisJCXJldHVybiAtRU5PREVWOworCisJcmN1X3JlYWRfbG9jaygpOworCWZvciAocG9ydF9ubyA9IGNiLT5hcmdzWzBdOyBwb3J0X25vIDwgRFBfTUFYX1BPUlRTOyBwb3J0X25vKyspIHsKKwkJc3RydWN0IHZwb3J0ICp2cG9ydDsKKworCQl2cG9ydCA9IHJjdV9kZXJlZmVyZW5jZShkcC0+cG9ydHNbcG9ydF9ub10pOworCQlpZiAoIXZwb3J0KQorCQkJY29udGludWU7CisKKwkJaWYgKG92c192cG9ydF9jbWRfZmlsbF9pbmZvKHZwb3J0LCBza2IsIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCQkgICAgY2ItPm5saC0+bmxtc2dfc2VxLCBOTE1fRl9NVUxUSSwKKwkJCQkJICAgIE9WU19WUE9SVF9DTURfTkVXKSA8IDApCisJCQlicmVhazsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwljYi0+YXJnc1swXSA9IHBvcnRfbm87CisJcmV0dmFsID0gc2tiLT5sZW47CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgdm9pZCByZWhhc2hfZmxvd190YWJsZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRhdGFwYXRoICpkcDsKKworCWdlbmxfbG9jaygpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkcCwgJmRwcywgbGlzdF9ub2RlKSB7CisJCXN0cnVjdCBmbG93X3RhYmxlICpvbGRfdGFibGUgPSBnZW5sX2RlcmVmZXJlbmNlKGRwLT50YWJsZSk7CisJCXN0cnVjdCBmbG93X3RhYmxlICpuZXdfdGFibGU7CisKKwkJbmV3X3RhYmxlID0gb3ZzX2Zsb3dfdGJsX3JlaGFzaChvbGRfdGFibGUpOworCQlpZiAoIUlTX0VSUihuZXdfdGFibGUpKSB7CisJCQlyY3VfYXNzaWduX3BvaW50ZXIoZHAtPnRhYmxlLCBuZXdfdGFibGUpOworCQkJb3ZzX2Zsb3dfdGJsX2RlZmVycmVkX2Rlc3Ryb3kob2xkX3RhYmxlKTsKKwkJfQorCX0KKworCWdlbmxfdW5sb2NrKCk7CisKKwlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJlaGFzaF9mbG93X3dxLCBSRUhBU0hfRkxPV19JTlRFUlZBTCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ2VubF9vcHMgZHBfdnBvcnRfZ2VubF9vcHNbXSA9IHsKKwl7IC5jbWQgPSBPVlNfVlBPUlRfQ01EX05FVywKKwkgIC5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwgLyogUmVxdWlyZXMgQ0FQX05FVF9BRE1JTiBwcml2aWxlZ2UuICovCisJICAucG9saWN5ID0gdnBvcnRfcG9saWN5LAorCSAgLmRvaXQgPSBvdnNfdnBvcnRfY21kX25ldworCX0sCisJeyAuY21kID0gT1ZTX1ZQT1JUX0NNRF9ERUwsCisJICAuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sIC8qIFJlcXVpcmVzIENBUF9ORVRfQURNSU4gcHJpdmlsZWdlLiAqLworCSAgLnBvbGljeSA9IHZwb3J0X3BvbGljeSwKKwkgIC5kb2l0ID0gb3ZzX3Zwb3J0X2NtZF9kZWwKKwl9LAorCXsgLmNtZCA9IE9WU19WUE9SVF9DTURfR0VULAorCSAgLmZsYWdzID0gMCwJCSAgICAvKiBPSyBmb3IgdW5wcml2aWxlZ2VkIHVzZXJzLiAqLworCSAgLnBvbGljeSA9IHZwb3J0X3BvbGljeSwKKwkgIC5kb2l0ID0gb3ZzX3Zwb3J0X2NtZF9nZXQsCisJICAuZHVtcGl0ID0gb3ZzX3Zwb3J0X2NtZF9kdW1wCisJfSwKKwl7IC5jbWQgPSBPVlNfVlBPUlRfQ01EX1NFVCwKKwkgIC5mbGFncyA9IEdFTkxfQURNSU5fUEVSTSwgLyogUmVxdWlyZXMgQ0FQX05FVF9BRE1JTiBwcml2aWxlZ2UuICovCisJICAucG9saWN5ID0gdnBvcnRfcG9saWN5LAorCSAgLmRvaXQgPSBvdnNfdnBvcnRfY21kX3NldCwKKwl9LAorfTsKKworc3RydWN0IGdlbmxfZmFtaWx5X2FuZF9vcHMgeworCXN0cnVjdCBnZW5sX2ZhbWlseSAqZmFtaWx5OworCXN0cnVjdCBnZW5sX29wcyAqb3BzOworCWludCBuX29wczsKKwlzdHJ1Y3QgZ2VubF9tdWx0aWNhc3RfZ3JvdXAgKmdyb3VwOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBnZW5sX2ZhbWlseV9hbmRfb3BzIGRwX2dlbmxfZmFtaWxpZXNbXSA9IHsKKwl7ICZkcF9kYXRhcGF0aF9nZW5sX2ZhbWlseSwKKwkgIGRwX2RhdGFwYXRoX2dlbmxfb3BzLCBBUlJBWV9TSVpFKGRwX2RhdGFwYXRoX2dlbmxfb3BzKSwKKwkgICZvdnNfZHBfZGF0YXBhdGhfbXVsdGljYXN0X2dyb3VwIH0sCisJeyAmZHBfdnBvcnRfZ2VubF9mYW1pbHksCisJICBkcF92cG9ydF9nZW5sX29wcywgQVJSQVlfU0laRShkcF92cG9ydF9nZW5sX29wcyksCisJICAmb3ZzX2RwX3Zwb3J0X211bHRpY2FzdF9ncm91cCB9LAorCXsgJmRwX2Zsb3dfZ2VubF9mYW1pbHksCisJICBkcF9mbG93X2dlbmxfb3BzLCBBUlJBWV9TSVpFKGRwX2Zsb3dfZ2VubF9vcHMpLAorCSAgJm92c19kcF9mbG93X211bHRpY2FzdF9ncm91cCB9LAorCXsgJmRwX3BhY2tldF9nZW5sX2ZhbWlseSwKKwkgIGRwX3BhY2tldF9nZW5sX29wcywgQVJSQVlfU0laRShkcF9wYWNrZXRfZ2VubF9vcHMpLAorCSAgTlVMTCB9LAorfTsKKworc3RhdGljIHZvaWQgZHBfdW5yZWdpc3Rlcl9nZW5sKGludCBuX2ZhbWlsaWVzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5fZmFtaWxpZXM7IGkrKykKKwkJZ2VubF91bnJlZ2lzdGVyX2ZhbWlseShkcF9nZW5sX2ZhbWlsaWVzW2ldLmZhbWlseSk7Cit9CisKK3N0YXRpYyBpbnQgZHBfcmVnaXN0ZXJfZ2VubCh2b2lkKQoreworCWludCBuX3JlZ2lzdGVyZWQ7CisJaW50IGVycjsKKwlpbnQgaTsKKworCW5fcmVnaXN0ZXJlZCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZHBfZ2VubF9mYW1pbGllcyk7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgZ2VubF9mYW1pbHlfYW5kX29wcyAqZiA9ICZkcF9nZW5sX2ZhbWlsaWVzW2ldOworCisJCWVyciA9IGdlbmxfcmVnaXN0ZXJfZmFtaWx5X3dpdGhfb3BzKGYtPmZhbWlseSwgZi0+b3BzLAorCQkJCQkJICAgIGYtPm5fb3BzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gZXJyb3I7CisJCW5fcmVnaXN0ZXJlZCsrOworCisJCWlmIChmLT5ncm91cCkgeworCQkJZXJyID0gZ2VubF9yZWdpc3Rlcl9tY19ncm91cChmLT5mYW1pbHksIGYtPmdyb3VwKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCXJldHVybiAwOworCitlcnJvcjoKKwlkcF91bnJlZ2lzdGVyX2dlbmwobl9yZWdpc3RlcmVkKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkcF9pbml0KHZvaWQpCit7CisJc3RydWN0IHNrX2J1ZmYgKmR1bW15X3NrYjsKKwlpbnQgZXJyOworCisJQlVJTERfQlVHX09OKHNpemVvZihzdHJ1Y3Qgb3ZzX3NrYl9jYikgPiBzaXplb2YoZHVtbXlfc2tiLT5jYikpOworCisJcHJfaW5mbygiT3BlbiB2U3dpdGNoIHN3aXRjaGluZyBkYXRhcGF0aFxuIik7CisKKwllcnIgPSBvdnNfZmxvd19pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBlcnJvcjsKKworCWVyciA9IG92c192cG9ydF9pbml0KCk7CisJaWYgKGVycikKKwkJZ290byBlcnJvcl9mbG93X2V4aXQ7CisKKwllcnIgPSByZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm92c19kcF9kZXZpY2Vfbm90aWZpZXIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyb3JfdnBvcnRfZXhpdDsKKworCWVyciA9IGRwX3JlZ2lzdGVyX2dlbmwoKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBlcnJvcl91bnJlZ19ub3RpZmllcjsKKworCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmVoYXNoX2Zsb3dfd3EsIFJFSEFTSF9GTE9XX0lOVEVSVkFMKTsKKworCXJldHVybiAwOworCitlcnJvcl91bnJlZ19ub3RpZmllcjoKKwl1bnJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigmb3ZzX2RwX2RldmljZV9ub3RpZmllcik7CitlcnJvcl92cG9ydF9leGl0OgorCW92c192cG9ydF9leGl0KCk7CitlcnJvcl9mbG93X2V4aXQ6CisJb3ZzX2Zsb3dfZXhpdCgpOworZXJyb3I6CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgZHBfY2xlYW51cCh2b2lkKQoreworCWNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmcmVoYXNoX2Zsb3dfd3EpOworCXJjdV9iYXJyaWVyKCk7CisJZHBfdW5yZWdpc3Rlcl9nZW5sKEFSUkFZX1NJWkUoZHBfZ2VubF9mYW1pbGllcykpOworCXVucmVnaXN0ZXJfbmV0ZGV2aWNlX25vdGlmaWVyKCZvdnNfZHBfZGV2aWNlX25vdGlmaWVyKTsKKwlvdnNfdnBvcnRfZXhpdCgpOworCW92c19mbG93X2V4aXQoKTsKK30KKworbW9kdWxlX2luaXQoZHBfaW5pdCk7Cittb2R1bGVfZXhpdChkcF9jbGVhbnVwKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPcGVuIHZTd2l0Y2ggc3dpdGNoaW5nIGRhdGFwYXRoIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguaCBiL25ldC9vcGVudnN3aXRjaC9kYXRhcGF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViOWY4ODQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvZGF0YXBhdGguaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDExIE5pY2lyYSBOZXR3b3Jrcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICovCisKKyNpZm5kZWYgREFUQVBBVEhfSAorI2RlZmluZSBEQVRBUEFUSF9IIDEKKworI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC91NjRfc3RhdHNfc3luYy5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgImZsb3cuaCIKKworc3RydWN0IHZwb3J0OworCisjZGVmaW5lIERQX01BWF9QT1JUUyAxMDI0CisjZGVmaW5lIFNBTVBMRV9BQ1RJT05fREVQVEggMworCisvKioKKyAqIHN0cnVjdCBkcF9zdGF0c19wZXJjcHUgLSBwZXItY3B1IHBhY2tldCBwcm9jZXNzaW5nIHN0YXRpc3RpY3MgZm9yIGEgZ2l2ZW4KKyAqIGRhdGFwYXRoLgorICogQG5faGl0OiBOdW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyBmb3Igd2hpY2ggYSBtYXRjaGluZyBmbG93IHdhcyBmb3VuZCBpbgorICogdGhlIGZsb3cgdGFibGUuCisgKiBAbl9taXNzOiBOdW1iZXIgb2YgcmVjZWl2ZWQgcGFja2V0cyB0aGF0IGhhZCBubyBtYXRjaGluZyBmbG93IGluIHRoZSBmbG93CisgKiB0YWJsZS4gIFRoZSBzdW0gb2YgQG5faGl0IGFuZCBAbl9taXNzIGlzIHRoZSBudW1iZXIgb2YgcGFja2V0cyB0aGF0IGhhdmUKKyAqIGJlZW4gcmVjZWl2ZWQgYnkgdGhlIGRhdGFwYXRoLgorICogQG5fbG9zdDogTnVtYmVyIG9mIHJlY2VpdmVkIHBhY2tldHMgdGhhdCBoYWQgbm8gbWF0Y2hpbmcgZmxvdyBpbiB0aGUgZmxvdworICogdGFibGUgdGhhdCBjb3VsZCBub3QgYmUgc2VudCB0byB1c2Vyc3BhY2UgKG5vcm1hbGx5IGR1ZSB0byBhbiBvdmVyZmxvdyBpbgorICogb25lIG9mIHRoZSBkYXRhcGF0aCdzIHF1ZXVlcykuCisgKi8KK3N0cnVjdCBkcF9zdGF0c19wZXJjcHUgeworCXU2NCBuX2hpdDsKKwl1NjQgbl9taXNzZWQ7CisJdTY0IG5fbG9zdDsKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgc3luYzsKK307CisKKy8qKgorICogc3RydWN0IGRhdGFwYXRoIC0gZGF0YXBhdGggZm9yIGZsb3ctYmFzZWQgcGFja2V0IHN3aXRjaGluZworICogQHJjdTogUkNVIGNhbGxiYWNrIGhlYWQgZm9yIGRlZmVycmVkIGRlc3RydWN0aW9uLgorICogQGxpc3Rfbm9kZTogRWxlbWVudCBpbiBnbG9iYWwgJ2RwcycgbGlzdC4KKyAqIEBuX2Zsb3dzOiBOdW1iZXIgb2YgZmxvd3MgY3VycmVudGx5IGluIGZsb3cgdGFibGUuCisgKiBAdGFibGU6IEN1cnJlbnQgZmxvdyB0YWJsZS4gIFByb3RlY3RlZCBieSBnZW5sX2xvY2sgYW5kIFJDVS4KKyAqIEBwb3J0czogTWFwIGZyb20gcG9ydCBudW1iZXIgdG8gJnN0cnVjdCB2cG9ydC4gICVPVlNQX0xPQ0FMIHBvcnQKKyAqIGFsd2F5cyBleGlzdHMsIG90aGVyIHBvcnRzIG1heSBiZSAlTlVMTC4gIFByb3RlY3RlZCBieSBSVE5MIGFuZCBSQ1UuCisgKiBAcG9ydF9saXN0OiBMaXN0IG9mIGFsbCBwb3J0cyBpbiBAcG9ydHMgaW4gYXJiaXRyYXJ5IG9yZGVyLiAgUlROTCByZXF1aXJlZAorICogdG8gaXRlcmF0ZSBvciBtb2RpZnkuCisgKiBAc3RhdHNfcGVyY3B1OiBQZXItQ1BVIGRhdGFwYXRoIHN0YXRpc3RpY3MuCisgKgorICogQ29udGV4dDogU2VlIHRoZSBjb21tZW50IG9uIGxvY2tpbmcgYXQgdGhlIHRvcCBvZiBkYXRhcGF0aC5jIGZvciBhZGRpdGlvbmFsCisgKiBsb2NraW5nIGluZm9ybWF0aW9uLgorICovCitzdHJ1Y3QgZGF0YXBhdGggeworCXN0cnVjdCByY3VfaGVhZCByY3U7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0X25vZGU7CisKKwkvKiBGbG93IHRhYmxlLiAqLworCXN0cnVjdCBmbG93X3RhYmxlIF9fcmN1ICp0YWJsZTsKKworCS8qIFN3aXRjaCBwb3J0cy4gKi8KKwlzdHJ1Y3QgdnBvcnQgX19yY3UgKnBvcnRzW0RQX01BWF9QT1JUU107CisJc3RydWN0IGxpc3RfaGVhZCBwb3J0X2xpc3Q7CisKKwkvKiBTdGF0cy4gKi8KKwlzdHJ1Y3QgZHBfc3RhdHNfcGVyY3B1IF9fcGVyY3B1ICpzdGF0c19wZXJjcHU7Cit9OworCisvKioKKyAqIHN0cnVjdCBvdnNfc2tiX2NiIC0gT1ZTIGRhdGEgaW4gc2tiIENCCisgKiBAZmxvdzogVGhlIGZsb3cgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcGFja2V0LiAgTWF5IGJlICVOVUxMIGlmIG5vIGZsb3cuCisgKi8KK3N0cnVjdCBvdnNfc2tiX2NiIHsKKwlzdHJ1Y3Qgc3dfZmxvdwkJKmZsb3c7Cit9OworI2RlZmluZSBPVlNfQ0Ioc2tiKSAoKHN0cnVjdCBvdnNfc2tiX2NiICopKHNrYiktPmNiKQorCisvKioKKyAqIHN0cnVjdCBkcF91cGNhbGwgLSBtZXRhZGF0YSB0byBpbmNsdWRlIHdpdGggYSBwYWNrZXQgdG8gc2VuZCB0byB1c2Vyc3BhY2UKKyAqIEBjbWQ6IE9uZSBvZiAlT1ZTX1BBQ0tFVF9DTURfKi4KKyAqIEBrZXk6IEJlY29tZXMgJU9WU19QQUNLRVRfQVRUUl9LRVkuICBNdXN0IGJlIG5vbm51bGwuCisgKiBAdXNlcmRhdGE6IElmIG5vbm51bGwsIGl0cyB1NjQgdmFsdWUgaXMgZXh0cmFjdGVkIGFuZCBwYXNzZWQgdG8gdXNlcnNwYWNlIGFzCisgKiAlT1ZTX1BBQ0tFVF9BVFRSX1VTRVJEQVRBLgorICogQHBpZDogTmV0bGluayBQSUQgdG8gd2hpY2ggcGFja2V0IHNob3VsZCBiZSBzZW50LiAgSWYgQHBpZCBpcyAwIHRoZW4gbm8KKyAqIHBhY2tldCBpcyBzZW50IGFuZCB0aGUgcGFja2V0IGlzIGFjY291bnRlZCBpbiB0aGUgZGF0YXBhdGgncyBAbl9sb3N0CisgKiBjb3VudGVyLgorICovCitzdHJ1Y3QgZHBfdXBjYWxsX2luZm8geworCXU4IGNtZDsKKwljb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleTsKKwljb25zdCBzdHJ1Y3QgbmxhdHRyICp1c2VyZGF0YTsKKwl1MzIgcGlkOworfTsKKworZXh0ZXJuIHN0cnVjdCBub3RpZmllcl9ibG9jayBvdnNfZHBfZGV2aWNlX25vdGlmaWVyOworZXh0ZXJuIHN0cnVjdCBnZW5sX211bHRpY2FzdF9ncm91cCBvdnNfZHBfdnBvcnRfbXVsdGljYXN0X2dyb3VwOworCit2b2lkIG92c19kcF9wcm9jZXNzX3JlY2VpdmVkX3BhY2tldChzdHJ1Y3QgdnBvcnQgKiwgc3RydWN0IHNrX2J1ZmYgKik7Cit2b2lkIG92c19kcF9kZXRhY2hfcG9ydChzdHJ1Y3QgdnBvcnQgKik7CitpbnQgb3ZzX2RwX3VwY2FsbChzdHJ1Y3QgZGF0YXBhdGggKiwgc3RydWN0IHNrX2J1ZmYgKiwKKwkJICBjb25zdCBzdHJ1Y3QgZHBfdXBjYWxsX2luZm8gKik7CisKK2NvbnN0IGNoYXIgKm92c19kcF9uYW1lKGNvbnN0IHN0cnVjdCBkYXRhcGF0aCAqZHApOworc3RydWN0IHNrX2J1ZmYgKm92c192cG9ydF9jbWRfYnVpbGRfaW5mbyhzdHJ1Y3QgdnBvcnQgKiwgdTMyIHBpZCwgdTMyIHNlcSwKKwkJCQkJIHU4IGNtZCk7CisKK2ludCBvdnNfZXhlY3V0ZV9hY3Rpb25zKHN0cnVjdCBkYXRhcGF0aCAqZHAsIHN0cnVjdCBza19idWZmICpza2IpOworI2VuZGlmIC8qIGRhdGFwYXRoLmggKi8KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9kcF9ub3RpZnkuYyBiL25ldC9vcGVudnN3aXRjaC9kcF9ub3RpZnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjczNjUxCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L29wZW52c3dpdGNoL2RwX25vdGlmeS5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMSBOaWNpcmEgTmV0d29ya3MuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqLworCisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bmV0L2dlbmV0bGluay5oPgorCisjaW5jbHVkZSAiZGF0YXBhdGguaCIKKyNpbmNsdWRlICJ2cG9ydC1pbnRlcm5hbF9kZXYuaCIKKyNpbmNsdWRlICJ2cG9ydC1uZXRkZXYuaCIKKworc3RhdGljIGludCBkcF9kZXZpY2VfZXZlbnQoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICp1bnVzZWQsIHVuc2lnbmVkIGxvbmcgZXZlbnQsCisJCQkgICB2b2lkICpwdHIpCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IHB0cjsKKwlzdHJ1Y3QgdnBvcnQgKnZwb3J0OworCisJaWYgKG92c19pc19pbnRlcm5hbF9kZXYoZGV2KSkKKwkJdnBvcnQgPSBvdnNfaW50ZXJuYWxfZGV2X2dldF92cG9ydChkZXYpOworCWVsc2UKKwkJdnBvcnQgPSBvdnNfbmV0ZGV2X2dldF92cG9ydChkZXYpOworCisJaWYgKCF2cG9ydCkKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTkVUREVWX1VOUkVHSVNURVI6CisJCWlmICghb3ZzX2lzX2ludGVybmFsX2RldihkZXYpKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZiAqbm90aWZ5OworCisJCQlub3RpZnkgPSBvdnNfdnBvcnRfY21kX2J1aWxkX2luZm8odnBvcnQsIDAsIDAsCisJCQkJCQkJICBPVlNfVlBPUlRfQ01EX0RFTCk7CisJCQlvdnNfZHBfZGV0YWNoX3BvcnQodnBvcnQpOworCQkJaWYgKElTX0VSUihub3RpZnkpKSB7CisJCQkJbmV0bGlua19zZXRfZXJyKGluaXRfbmV0Lmdlbmxfc29jaywgMCwKKwkJCQkJCW92c19kcF92cG9ydF9tdWx0aWNhc3RfZ3JvdXAuaWQsCisJCQkJCQlQVFJfRVJSKG5vdGlmeSkpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlnZW5sbXNnX211bHRpY2FzdChub3RpZnksIDAsIG92c19kcF92cG9ydF9tdWx0aWNhc3RfZ3JvdXAuaWQsCisJCQkJCSAgR0ZQX0tFUk5FTCk7CisJCX0KKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgb3ZzX2RwX2RldmljZV9ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGRwX2RldmljZV9ldmVudAorfTsKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93LmMgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlN2YwMjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5jCkBAIC0wLDAgKzEsMTM0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDExIE5pY2lyYSBOZXR3b3Jrcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICovCisKKyNpbmNsdWRlICJmbG93LmgiCisjaW5jbHVkZSAiZGF0YXBhdGguaCIKKyNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlIDxuZXQvbGxjX3BkdS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2poYXNoLmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xsYy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lwLmg+CisjaW5jbHVkZSA8bGludXgvaXB2Ni5oPgorI2luY2x1ZGUgPGxpbnV4L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L3VkcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ljbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9pY21wdjYuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvbmRpc2MuaD4KKworc3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICpmbG93X2NhY2hlOworCitzdGF0aWMgaW50IGNoZWNrX2hlYWRlcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbGVuKQoreworCWlmICh1bmxpa2VseShza2ItPmxlbiA8IGxlbikpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIGxlbikpKQorCQlyZXR1cm4gLUVOT01FTTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGJvb2wgYXJwaGRyX29rKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHBza2JfbWF5X3B1bGwoc2tiLCBza2JfbmV0d29ya19vZmZzZXQoc2tiKSArCisJCQkJICBzaXplb2Yoc3RydWN0IGFycF9ldGhfaGVhZGVyKSk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfaXBoZHIoc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBpbnQgbmhfb2ZzID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CisJdW5zaWduZWQgaW50IGlwX2xlbjsKKwlpbnQgZXJyOworCisJZXJyID0gY2hlY2tfaGVhZGVyKHNrYiwgbmhfb2ZzICsgc2l6ZW9mKHN0cnVjdCBpcGhkcikpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlyZXR1cm4gZXJyOworCisJaXBfbGVuID0gaXBfaGRybGVuKHNrYik7CisJaWYgKHVubGlrZWx5KGlwX2xlbiA8IHNpemVvZihzdHJ1Y3QgaXBoZHIpIHx8CisJCSAgICAgc2tiLT5sZW4gPCBuaF9vZnMgKyBpcF9sZW4pKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNrYl9zZXRfdHJhbnNwb3J0X2hlYWRlcihza2IsIG5oX29mcyArIGlwX2xlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBib29sIHRjcGhkcl9vayhzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCB0aF9vZnMgPSBza2JfdHJhbnNwb3J0X29mZnNldChza2IpOworCWludCB0Y3BfbGVuOworCisJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgdGhfb2ZzICsgc2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKSkpCisJCXJldHVybiBmYWxzZTsKKworCXRjcF9sZW4gPSB0Y3BfaGRybGVuKHNrYik7CisJaWYgKHVubGlrZWx5KHRjcF9sZW4gPCBzaXplb2Yoc3RydWN0IHRjcGhkcikgfHwKKwkJICAgICBza2ItPmxlbiA8IHRoX29mcyArIHRjcF9sZW4pKQorCQlyZXR1cm4gZmFsc2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgdWRwaGRyX29rKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHBza2JfbWF5X3B1bGwoc2tiLCBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgdWRwaGRyKSk7Cit9CisKK3N0YXRpYyBib29sIGljbXBoZHJfb2soc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gcHNrYl9tYXlfcHVsbChza2IsIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYikgKworCQkJCSAgc2l6ZW9mKHN0cnVjdCBpY21waGRyKSk7Cit9CisKK3U2NCBvdnNfZmxvd191c2VkX3RpbWUodW5zaWduZWQgbG9uZyBmbG93X2ppZmZpZXMpCit7CisJc3RydWN0IHRpbWVzcGVjIGN1cl90czsKKwl1NjQgY3VyX21zLCBpZGxlX21zOworCisJa3RpbWVfZ2V0X3RzKCZjdXJfdHMpOworCWlkbGVfbXMgPSBqaWZmaWVzX3RvX21zZWNzKGppZmZpZXMgLSBmbG93X2ppZmZpZXMpOworCWN1cl9tcyA9ICh1NjQpY3VyX3RzLnR2X3NlYyAqIE1TRUNfUEVSX1NFQyArCisJCSBjdXJfdHMudHZfbnNlYyAvIE5TRUNfUEVSX01TRUM7CisKKwlyZXR1cm4gY3VyX21zIC0gaWRsZV9tczsKK30KKworI2RlZmluZSBTV19GTE9XX0tFWV9PRkZTRVQoZmllbGQpCQlcCisJKG9mZnNldG9mKHN0cnVjdCBzd19mbG93X2tleSwgZmllbGQpICsJXAorCSBGSUVMRF9TSVpFT0Yoc3RydWN0IHN3X2Zsb3dfa2V5LCBmaWVsZCkpCisKK3N0YXRpYyBpbnQgcGFyc2VfaXB2NmhkcihzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwKKwkJCSBpbnQgKmtleV9sZW5wKQoreworCXVuc2lnbmVkIGludCBuaF9vZnMgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiKTsKKwl1bnNpZ25lZCBpbnQgbmhfbGVuOworCWludCBwYXlsb2FkX29mczsKKwlzdHJ1Y3QgaXB2NmhkciAqbmg7CisJdWludDhfdCBuZXh0aGRyOworCV9fYmUxNiBmcmFnX29mZjsKKwlpbnQgZXJyOworCisJKmtleV9sZW5wID0gU1dfRkxPV19LRVlfT0ZGU0VUKGlwdjYubGFiZWwpOworCisJZXJyID0gY2hlY2tfaGVhZGVyKHNrYiwgbmhfb2ZzICsgc2l6ZW9mKCpuaCkpOworCWlmICh1bmxpa2VseShlcnIpKQorCQlyZXR1cm4gZXJyOworCisJbmggPSBpcHY2X2hkcihza2IpOworCW5leHRoZHIgPSBuaC0+bmV4dGhkcjsKKwlwYXlsb2FkX29mcyA9ICh1OCAqKShuaCArIDEpIC0gc2tiLT5kYXRhOworCisJa2V5LT5pcC5wcm90byA9IE5FWFRIRFJfTk9ORTsKKwlrZXktPmlwLnRvcyA9IGlwdjZfZ2V0X2RzZmllbGQobmgpOworCWtleS0+aXAudHRsID0gbmgtPmhvcF9saW1pdDsKKwlrZXktPmlwdjYubGFiZWwgPSAqKF9fYmUzMiAqKW5oICYgaHRvbmwoSVBWNl9GTE9XSU5GT19GTE9XTEFCRUwpOworCWtleS0+aXB2Ni5hZGRyLnNyYyA9IG5oLT5zYWRkcjsKKwlrZXktPmlwdjYuYWRkci5kc3QgPSBuaC0+ZGFkZHI7CisKKwlwYXlsb2FkX29mcyA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBwYXlsb2FkX29mcywgJm5leHRoZHIsICZmcmFnX29mZik7CisJaWYgKHVubGlrZWx5KHBheWxvYWRfb2ZzIDwgMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZyYWdfb2ZmKSB7CisJCWlmIChmcmFnX29mZiAmIGh0b25zKH4weDcpKQorCQkJa2V5LT5pcC5mcmFnID0gT1ZTX0ZSQUdfVFlQRV9MQVRFUjsKKwkJZWxzZQorCQkJa2V5LT5pcC5mcmFnID0gT1ZTX0ZSQUdfVFlQRV9GSVJTVDsKKwl9CisKKwluaF9sZW4gPSBwYXlsb2FkX29mcyAtIG5oX29mczsKKwlza2Jfc2V0X3RyYW5zcG9ydF9oZWFkZXIoc2tiLCBuaF9vZnMgKyBuaF9sZW4pOworCWtleS0+aXAucHJvdG8gPSBuZXh0aGRyOworCXJldHVybiBuaF9sZW47Cit9CisKK3N0YXRpYyBib29sIGljbXA2aGRyX29rKHN0cnVjdCBza19idWZmICpza2IpCit7CisJcmV0dXJuIHBza2JfbWF5X3B1bGwoc2tiLCBza2JfdHJhbnNwb3J0X29mZnNldChza2IpICsKKwkJCQkgIHNpemVvZihzdHJ1Y3QgaWNtcDZoZHIpKTsKK30KKworI2RlZmluZSBUQ1BfRkxBR1NfT0ZGU0VUIDEzCisjZGVmaW5lIFRDUF9GTEFHX01BU0sgMHgzZgorCit2b2lkIG92c19mbG93X3VzZWQoc3RydWN0IHN3X2Zsb3cgKmZsb3csIHN0cnVjdCBza19idWZmICpza2IpCit7CisJdTggdGNwX2ZsYWdzID0gMDsKKworCWlmIChmbG93LT5rZXkuZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVApICYmCisJICAgIGZsb3ctPmtleS5pcC5wcm90byA9PSBJUFBST1RPX1RDUCkgeworCQl1OCAqdGNwID0gKHU4ICopdGNwX2hkcihza2IpOworCQl0Y3BfZmxhZ3MgPSAqKHRjcCArIFRDUF9GTEFHU19PRkZTRVQpICYgVENQX0ZMQUdfTUFTSzsKKwl9CisKKwlzcGluX2xvY2soJmZsb3ctPmxvY2spOworCWZsb3ctPnVzZWQgPSBqaWZmaWVzOworCWZsb3ctPnBhY2tldF9jb3VudCsrOworCWZsb3ctPmJ5dGVfY291bnQgKz0gc2tiLT5sZW47CisJZmxvdy0+dGNwX2ZsYWdzIHw9IHRjcF9mbGFnczsKKwlzcGluX3VubG9jaygmZmxvdy0+bG9jayk7Cit9CisKK3N0cnVjdCBzd19mbG93X2FjdGlvbnMgKm92c19mbG93X2FjdGlvbnNfYWxsb2MoY29uc3Qgc3RydWN0IG5sYXR0ciAqYWN0aW9ucykKK3sKKwlpbnQgYWN0aW9uc19sZW4gPSBubGFfbGVuKGFjdGlvbnMpOworCXN0cnVjdCBzd19mbG93X2FjdGlvbnMgKnNmYTsKKworCS8qIEF0IGxlYXN0IERQX01BWF9QT1JUUyBhY3Rpb25zIGFyZSByZXF1aXJlZCB0byBiZSBhYmxlIHRvIGZsb29kIGEKKwkgKiBwYWNrZXQgdG8gZXZlcnkgcG9ydC4gIEZhY3RvciBvZiAyIGFsbG93cyBmb3Igc2V0dGluZyBWTEFOIHRhZ3MsCisJICogZXRjLiAqLworCWlmIChhY3Rpb25zX2xlbiA+IDIgKiBEUF9NQVhfUE9SVFMgKiBubGFfdG90YWxfc2l6ZSg0KSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisKKwlzZmEgPSBrbWFsbG9jKHNpemVvZigqc2ZhKSArIGFjdGlvbnNfbGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNmYSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzZmEtPmFjdGlvbnNfbGVuID0gYWN0aW9uc19sZW47CisJbWVtY3B5KHNmYS0+YWN0aW9ucywgbmxhX2RhdGEoYWN0aW9ucyksIGFjdGlvbnNfbGVuKTsKKwlyZXR1cm4gc2ZhOworfQorCitzdHJ1Y3Qgc3dfZmxvdyAqb3ZzX2Zsb3dfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3Qgc3dfZmxvdyAqZmxvdzsKKworCWZsb3cgPSBrbWVtX2NhY2hlX2FsbG9jKGZsb3dfY2FjaGUsIEdGUF9LRVJORUwpOworCWlmICghZmxvdykKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlzcGluX2xvY2tfaW5pdCgmZmxvdy0+bG9jayk7CisJZmxvdy0+c2ZfYWN0cyA9IE5VTEw7CisKKwlyZXR1cm4gZmxvdzsKK30KKworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpmaW5kX2J1Y2tldChzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGUsIHUzMiBoYXNoKQoreworCWhhc2ggPSBqaGFzaF8xd29yZChoYXNoLCB0YWJsZS0+aGFzaF9zZWVkKTsKKwlyZXR1cm4gZmxleF9hcnJheV9nZXQodGFibGUtPmJ1Y2tldHMsCisJCQkJKGhhc2ggJiAodGFibGUtPm5fYnVja2V0cyAtIDEpKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmxleF9hcnJheSAqYWxsb2NfYnVja2V0cyh1bnNpZ25lZCBpbnQgbl9idWNrZXRzKQoreworCXN0cnVjdCBmbGV4X2FycmF5ICpidWNrZXRzOworCWludCBpLCBlcnI7CisKKwlidWNrZXRzID0gZmxleF9hcnJheV9hbGxvYyhzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQgKiksCisJCQkJICAgbl9idWNrZXRzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWJ1Y2tldHMpCisJCXJldHVybiBOVUxMOworCisJZXJyID0gZmxleF9hcnJheV9wcmVhbGxvYyhidWNrZXRzLCAwLCBuX2J1Y2tldHMsIEdGUF9LRVJORUwpOworCWlmIChlcnIpIHsKKwkJZmxleF9hcnJheV9mcmVlKGJ1Y2tldHMpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9idWNrZXRzOyBpKyspCisJCUlOSVRfSExJU1RfSEVBRCgoc3RydWN0IGhsaXN0X2hlYWQgKikKKwkJCQkJZmxleF9hcnJheV9nZXQoYnVja2V0cywgaSkpOworCisJcmV0dXJuIGJ1Y2tldHM7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYnVja2V0cyhzdHJ1Y3QgZmxleF9hcnJheSAqYnVja2V0cykKK3sKKwlmbGV4X2FycmF5X2ZyZWUoYnVja2V0cyk7Cit9CisKK3N0cnVjdCBmbG93X3RhYmxlICpvdnNfZmxvd190YmxfYWxsb2MoaW50IG5ld19zaXplKQoreworCXN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSA9IGttYWxsb2Moc2l6ZW9mKCp0YWJsZSksIEdGUF9LRVJORUwpOworCisJaWYgKCF0YWJsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwl0YWJsZS0+YnVja2V0cyA9IGFsbG9jX2J1Y2tldHMobmV3X3NpemUpOworCisJaWYgKCF0YWJsZS0+YnVja2V0cykgeworCQlrZnJlZSh0YWJsZSk7CisJCXJldHVybiBOVUxMOworCX0KKwl0YWJsZS0+bl9idWNrZXRzID0gbmV3X3NpemU7CisJdGFibGUtPmNvdW50ID0gMDsKKwl0YWJsZS0+bm9kZV92ZXIgPSAwOworCXRhYmxlLT5rZWVwX2Zsb3dzID0gZmFsc2U7CisJZ2V0X3JhbmRvbV9ieXRlcygmdGFibGUtPmhhc2hfc2VlZCwgc2l6ZW9mKHUzMikpOworCisJcmV0dXJuIHRhYmxlOworfQorCit2b2lkIG92c19mbG93X3RibF9kZXN0cm95KHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSkKK3sKKwlpbnQgaTsKKworCWlmICghdGFibGUpCisJCXJldHVybjsKKworCWlmICh0YWJsZS0+a2VlcF9mbG93cykKKwkJZ290byBza2lwX2Zsb3dzOworCisJZm9yIChpID0gMDsgaSA8IHRhYmxlLT5uX2J1Y2tldHM7IGkrKykgeworCQlzdHJ1Y3Qgc3dfZmxvdyAqZmxvdzsKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQgPSBmbGV4X2FycmF5X2dldCh0YWJsZS0+YnVja2V0cywgaSk7CisJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlLCAqbjsKKwkJaW50IHZlciA9IHRhYmxlLT5ub2RlX3ZlcjsKKworCQlobGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZsb3csIG5vZGUsIG4sIGhlYWQsIGhhc2hfbm9kZVt2ZXJdKSB7CisJCQlobGlzdF9kZWxfcmN1KCZmbG93LT5oYXNoX25vZGVbdmVyXSk7CisJCQlvdnNfZmxvd19mcmVlKGZsb3cpOworCQl9CisJfQorCitza2lwX2Zsb3dzOgorCWZyZWVfYnVja2V0cyh0YWJsZS0+YnVja2V0cyk7CisJa2ZyZWUodGFibGUpOworfQorCitzdGF0aWMgdm9pZCBmbG93X3RibF9kZXN0cm95X3JjdV9jYihzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGUgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3QgZmxvd190YWJsZSwgcmN1KTsKKworCW92c19mbG93X3RibF9kZXN0cm95KHRhYmxlKTsKK30KKwordm9pZCBvdnNfZmxvd190YmxfZGVmZXJyZWRfZGVzdHJveShzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGUpCit7CisJaWYgKCF0YWJsZSkKKwkJcmV0dXJuOworCisJY2FsbF9yY3UoJnRhYmxlLT5yY3UsIGZsb3dfdGJsX2Rlc3Ryb3lfcmN1X2NiKTsKK30KKworc3RydWN0IHN3X2Zsb3cgKm92c19mbG93X3RibF9uZXh0KHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSwgdTMyICpidWNrZXQsIHUzMiAqbGFzdCkKK3sKKwlzdHJ1Y3Qgc3dfZmxvdyAqZmxvdzsKKwlzdHJ1Y3QgaGxpc3RfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbjsKKwlpbnQgdmVyOworCWludCBpOworCisJdmVyID0gdGFibGUtPm5vZGVfdmVyOworCXdoaWxlICgqYnVja2V0IDwgdGFibGUtPm5fYnVja2V0cykgeworCQlpID0gMDsKKwkJaGVhZCA9IGZsZXhfYXJyYXlfZ2V0KHRhYmxlLT5idWNrZXRzLCAqYnVja2V0KTsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZsb3csIG4sIGhlYWQsIGhhc2hfbm9kZVt2ZXJdKSB7CisJCQlpZiAoaSA8ICpsYXN0KSB7CisJCQkJaSsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJKmxhc3QgPSBpICsgMTsKKwkJCXJldHVybiBmbG93OworCQl9CisJCSgqYnVja2V0KSsrOworCQkqbGFzdCA9IDA7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZsb3dfdGFibGVfY29weV9mbG93cyhzdHJ1Y3QgZmxvd190YWJsZSAqb2xkLCBzdHJ1Y3QgZmxvd190YWJsZSAqbmV3KQoreworCWludCBvbGRfdmVyOworCWludCBpOworCisJb2xkX3ZlciA9IG9sZC0+bm9kZV92ZXI7CisJbmV3LT5ub2RlX3ZlciA9ICFvbGRfdmVyOworCisJLyogSW5zZXJ0IGluIG5ldyB0YWJsZS4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgb2xkLT5uX2J1Y2tldHM7IGkrKykgeworCQlzdHJ1Y3Qgc3dfZmxvdyAqZmxvdzsKKwkJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisJCXN0cnVjdCBobGlzdF9ub2RlICpuOworCisJCWhlYWQgPSBmbGV4X2FycmF5X2dldChvbGQtPmJ1Y2tldHMsIGkpOworCisJCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KGZsb3csIG4sIGhlYWQsIGhhc2hfbm9kZVtvbGRfdmVyXSkKKwkJCW92c19mbG93X3RibF9pbnNlcnQobmV3LCBmbG93KTsKKwl9CisJb2xkLT5rZWVwX2Zsb3dzID0gdHJ1ZTsKK30KKworc3RhdGljIHN0cnVjdCBmbG93X3RhYmxlICpfX2Zsb3dfdGJsX3JlaGFzaChzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGUsIGludCBuX2J1Y2tldHMpCit7CisJc3RydWN0IGZsb3dfdGFibGUgKm5ld190YWJsZTsKKworCW5ld190YWJsZSA9IG92c19mbG93X3RibF9hbGxvYyhuX2J1Y2tldHMpOworCWlmICghbmV3X3RhYmxlKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWZsb3dfdGFibGVfY29weV9mbG93cyh0YWJsZSwgbmV3X3RhYmxlKTsKKworCXJldHVybiBuZXdfdGFibGU7Cit9CisKK3N0cnVjdCBmbG93X3RhYmxlICpvdnNfZmxvd190YmxfcmVoYXNoKHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSkKK3sKKwlyZXR1cm4gX19mbG93X3RibF9yZWhhc2godGFibGUsIHRhYmxlLT5uX2J1Y2tldHMpOworfQorCitzdHJ1Y3QgZmxvd190YWJsZSAqb3ZzX2Zsb3dfdGJsX2V4cGFuZChzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGUpCit7CisJcmV0dXJuIF9fZmxvd190YmxfcmVoYXNoKHRhYmxlLCB0YWJsZS0+bl9idWNrZXRzICogMik7Cit9CisKK3ZvaWQgb3ZzX2Zsb3dfZnJlZShzdHJ1Y3Qgc3dfZmxvdyAqZmxvdykKK3sKKwlpZiAodW5saWtlbHkoIWZsb3cpKQorCQlyZXR1cm47CisKKwlrZnJlZSgoc3RydWN0IHNmX2Zsb3dfYWN0cyBfX2ZvcmNlICopZmxvdy0+c2ZfYWN0cyk7CisJa21lbV9jYWNoZV9mcmVlKGZsb3dfY2FjaGUsIGZsb3cpOworfQorCisvKiBSQ1UgY2FsbGJhY2sgdXNlZCBieSBvdnNfZmxvd19kZWZlcnJlZF9mcmVlLiAqLworc3RhdGljIHZvaWQgcmN1X2ZyZWVfZmxvd19jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3Qgc3dfZmxvdyAqZmxvdyA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBzd19mbG93LCByY3UpOworCisJb3ZzX2Zsb3dfZnJlZShmbG93KTsKK30KKworLyogU2NoZWR1bGVzICdmbG93JyB0byBiZSBmcmVlZCBhZnRlciB0aGUgbmV4dCBSQ1UgZ3JhY2UgcGVyaW9kLgorICogVGhlIGNhbGxlciBtdXN0IGhvbGQgcmN1X3JlYWRfbG9jayBmb3IgdGhpcyB0byBiZSBzZW5zaWJsZS4gKi8KK3ZvaWQgb3ZzX2Zsb3dfZGVmZXJyZWRfZnJlZShzdHJ1Y3Qgc3dfZmxvdyAqZmxvdykKK3sKKwljYWxsX3JjdSgmZmxvdy0+cmN1LCByY3VfZnJlZV9mbG93X2NhbGxiYWNrKTsKK30KKworLyogUkNVIGNhbGxiYWNrIHVzZWQgYnkgb3ZzX2Zsb3dfZGVmZXJyZWRfZnJlZV9hY3RzLiAqLworc3RhdGljIHZvaWQgcmN1X2ZyZWVfYWN0c19jYWxsYmFjayhzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zICpzZl9hY3RzID0gY29udGFpbmVyX29mKHJjdSwKKwkJCXN0cnVjdCBzd19mbG93X2FjdGlvbnMsIHJjdSk7CisJa2ZyZWUoc2ZfYWN0cyk7Cit9CisKKy8qIFNjaGVkdWxlcyAnc2ZfYWN0cycgdG8gYmUgZnJlZWQgYWZ0ZXIgdGhlIG5leHQgUkNVIGdyYWNlIHBlcmlvZC4KKyAqIFRoZSBjYWxsZXIgbXVzdCBob2xkIHJjdV9yZWFkX2xvY2sgZm9yIHRoaXMgdG8gYmUgc2Vuc2libGUuICovCit2b2lkIG92c19mbG93X2RlZmVycmVkX2ZyZWVfYWN0cyhzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zICpzZl9hY3RzKQoreworCWNhbGxfcmN1KCZzZl9hY3RzLT5yY3UsIHJjdV9mcmVlX2FjdHNfY2FsbGJhY2spOworfQorCitzdGF0aWMgaW50IHBhcnNlX3ZsYW4oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXkpCit7CisJc3RydWN0IHF0YWdfcHJlZml4IHsKKwkJX19iZTE2IGV0aF90eXBlOyAvKiBFVEhfUF84MDIxUSAqLworCQlfX2JlMTYgdGNpOworCX07CisJc3RydWN0IHF0YWdfcHJlZml4ICpxcDsKKworCWlmICh1bmxpa2VseShza2ItPmxlbiA8IHNpemVvZihzdHJ1Y3QgcXRhZ19wcmVmaXgpICsgc2l6ZW9mKF9fYmUxNikpKQorCQlyZXR1cm4gMDsKKworCWlmICh1bmxpa2VseSghcHNrYl9tYXlfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcXRhZ19wcmVmaXgpICsKKwkJCQkJIHNpemVvZihfX2JlMTYpKSkpCisJCXJldHVybiAtRU5PTUVNOworCisJcXAgPSAoc3RydWN0IHF0YWdfcHJlZml4ICopIHNrYi0+ZGF0YTsKKwlrZXktPmV0aC50Y2kgPSBxcC0+dGNpIHwgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCk7CisJX19za2JfcHVsbChza2IsIHNpemVvZihzdHJ1Y3QgcXRhZ19wcmVmaXgpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19iZTE2IHBhcnNlX2V0aGVydHlwZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBsbGNfc25hcF9oZHIgeworCQl1OCAgZHNhcDsgIC8qIEFsd2F5cyAweEFBICovCisJCXU4ICBzc2FwOyAgLyogQWx3YXlzIDB4QUEgKi8KKwkJdTggIGN0cmw7CisJCXU4ICBvdWlbM107CisJCV9fYmUxNiBldGhlcnR5cGU7CisJfTsKKwlzdHJ1Y3QgbGxjX3NuYXBfaGRyICpsbGM7CisJX19iZTE2IHByb3RvOworCisJcHJvdG8gPSAqKF9fYmUxNiAqKSBza2ItPmRhdGE7CisJX19za2JfcHVsbChza2IsIHNpemVvZihfX2JlMTYpKTsKKworCWlmIChudG9ocyhwcm90bykgPj0gMTUzNikKKwkJcmV0dXJuIHByb3RvOworCisJaWYgKHNrYi0+bGVuIDwgc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHIpKQorCQlyZXR1cm4gaHRvbnMoRVRIX1BfODAyXzIpOworCisJaWYgKHVubGlrZWx5KCFwc2tiX21heV9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHIpKSkpCisJCXJldHVybiBodG9ucygwKTsKKworCWxsYyA9IChzdHJ1Y3QgbGxjX3NuYXBfaGRyICopIHNrYi0+ZGF0YTsKKwlpZiAobGxjLT5kc2FwICE9IExMQ19TQVBfU05BUCB8fAorCSAgICBsbGMtPnNzYXAgIT0gTExDX1NBUF9TTkFQIHx8CisJICAgIChsbGMtPm91aVswXSB8IGxsYy0+b3VpWzFdIHwgbGxjLT5vdWlbMl0pICE9IDApCisJCXJldHVybiBodG9ucyhFVEhfUF84MDJfMik7CisKKwlfX3NrYl9wdWxsKHNrYiwgc2l6ZW9mKHN0cnVjdCBsbGNfc25hcF9oZHIpKTsKKwlyZXR1cm4gbGxjLT5ldGhlcnR5cGU7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfaWNtcHY2KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBzd19mbG93X2tleSAqa2V5LAorCQkJaW50ICprZXlfbGVucCwgaW50IG5oX2xlbikKK3sKKwlzdHJ1Y3QgaWNtcDZoZHIgKmljbXAgPSBpY21wNl9oZHIoc2tiKTsKKwlpbnQgZXJyb3IgPSAwOworCWludCBrZXlfbGVuOworCisJLyogVGhlIElDTVB2NiB0eXBlIGFuZCBjb2RlIGZpZWxkcyB1c2UgdGhlIDE2LWJpdCB0cmFuc3BvcnQgcG9ydAorCSAqIGZpZWxkcywgc28gd2UgbmVlZCB0byBzdG9yZSB0aGVtIGluIDE2LWJpdCBuZXR3b3JrIGJ5dGUgb3JkZXIuCisJICovCisJa2V5LT5pcHY2LnRwLnNyYyA9IGh0b25zKGljbXAtPmljbXA2X3R5cGUpOworCWtleS0+aXB2Ni50cC5kc3QgPSBodG9ucyhpY21wLT5pY21wNl9jb2RlKTsKKwlrZXlfbGVuID0gU1dfRkxPV19LRVlfT0ZGU0VUKGlwdjYudHApOworCisJaWYgKGljbXAtPmljbXA2X2NvZGUgPT0gMCAmJgorCSAgICAoaWNtcC0+aWNtcDZfdHlwZSA9PSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OIHx8CisJICAgICBpY21wLT5pY21wNl90eXBlID09IE5ESVNDX05FSUdIQk9VUl9BRFZFUlRJU0VNRU5UKSkgeworCQlpbnQgaWNtcF9sZW4gPSBza2ItPmxlbiAtIHNrYl90cmFuc3BvcnRfb2Zmc2V0KHNrYik7CisJCXN0cnVjdCBuZF9tc2cgKm5kOworCQlpbnQgb2Zmc2V0OworCisJCWtleV9sZW4gPSBTV19GTE9XX0tFWV9PRkZTRVQoaXB2Ni5uZCk7CisKKwkJLyogSW4gb3JkZXIgdG8gcHJvY2VzcyBuZWlnaGJvciBkaXNjb3Zlcnkgb3B0aW9ucywgd2UgbmVlZCB0aGUKKwkJICogZW50aXJlIHBhY2tldC4KKwkJICovCisJCWlmICh1bmxpa2VseShpY21wX2xlbiA8IHNpemVvZigqbmQpKSkKKwkJCWdvdG8gb3V0OworCQlpZiAodW5saWtlbHkoc2tiX2xpbmVhcml6ZShza2IpKSkgeworCQkJZXJyb3IgPSAtRU5PTUVNOworCQkJZ290byBvdXQ7CisJCX0KKworCQluZCA9IChzdHJ1Y3QgbmRfbXNnICopc2tiX3RyYW5zcG9ydF9oZWFkZXIoc2tiKTsKKwkJa2V5LT5pcHY2Lm5kLnRhcmdldCA9IG5kLT50YXJnZXQ7CisJCWtleV9sZW4gPSBTV19GTE9XX0tFWV9PRkZTRVQoaXB2Ni5uZCk7CisKKwkJaWNtcF9sZW4gLT0gc2l6ZW9mKCpuZCk7CisJCW9mZnNldCA9IDA7CisJCXdoaWxlIChpY21wX2xlbiA+PSA4KSB7CisJCQlzdHJ1Y3QgbmRfb3B0X2hkciAqbmRfb3B0ID0KKwkJCQkgKHN0cnVjdCBuZF9vcHRfaGRyICopKG5kLT5vcHQgKyBvZmZzZXQpOworCQkJaW50IG9wdF9sZW4gPSBuZF9vcHQtPm5kX29wdF9sZW4gKiA4OworCisJCQlpZiAodW5saWtlbHkoIW9wdF9sZW4gfHwgb3B0X2xlbiA+IGljbXBfbGVuKSkKKwkJCQlnb3RvIGludmFsaWQ7CisKKwkJCS8qIFN0b3JlIHRoZSBsaW5rIGxheWVyIGFkZHJlc3MgaWYgdGhlIGFwcHJvcHJpYXRlCisJCQkgKiBvcHRpb24gaXMgcHJvdmlkZWQuICBJdCBpcyBjb25zaWRlcmVkIGFuIGVycm9yIGlmCisJCQkgKiB0aGUgc2FtZSBsaW5rIGxheWVyIG9wdGlvbiBpcyBzcGVjaWZpZWQgdHdpY2UuCisJCQkgKi8KKwkJCWlmIChuZF9vcHQtPm5kX29wdF90eXBlID09IE5EX09QVF9TT1VSQ0VfTExfQUREUgorCQkJICAgICYmIG9wdF9sZW4gPT0gOCkgeworCQkJCWlmICh1bmxpa2VseSghaXNfemVyb19ldGhlcl9hZGRyKGtleS0+aXB2Ni5uZC5zbGwpKSkKKwkJCQkJZ290byBpbnZhbGlkOworCQkJCW1lbWNweShrZXktPmlwdjYubmQuc2xsLAorCQkJCSAgICAmbmQtPm9wdFtvZmZzZXQrc2l6ZW9mKCpuZF9vcHQpXSwgRVRIX0FMRU4pOworCQkJfSBlbHNlIGlmIChuZF9vcHQtPm5kX29wdF90eXBlID09IE5EX09QVF9UQVJHRVRfTExfQUREUgorCQkJCSAgICYmIG9wdF9sZW4gPT0gOCkgeworCQkJCWlmICh1bmxpa2VseSghaXNfemVyb19ldGhlcl9hZGRyKGtleS0+aXB2Ni5uZC50bGwpKSkKKwkJCQkJZ290byBpbnZhbGlkOworCQkJCW1lbWNweShrZXktPmlwdjYubmQudGxsLAorCQkJCSAgICAmbmQtPm9wdFtvZmZzZXQrc2l6ZW9mKCpuZF9vcHQpXSwgRVRIX0FMRU4pOworCQkJfQorCisJCQlpY21wX2xlbiAtPSBvcHRfbGVuOworCQkJb2Zmc2V0ICs9IG9wdF9sZW47CisJCX0KKwl9CisKKwlnb3RvIG91dDsKKworaW52YWxpZDoKKwltZW1zZXQoJmtleS0+aXB2Ni5uZC50YXJnZXQsIDAsIHNpemVvZihrZXktPmlwdjYubmQudGFyZ2V0KSk7CisJbWVtc2V0KGtleS0+aXB2Ni5uZC5zbGwsIDAsIHNpemVvZihrZXktPmlwdjYubmQuc2xsKSk7CisJbWVtc2V0KGtleS0+aXB2Ni5uZC50bGwsIDAsIHNpemVvZihrZXktPmlwdjYubmQudGxsKSk7CisKK291dDoKKwkqa2V5X2xlbnAgPSBrZXlfbGVuOworCXJldHVybiBlcnJvcjsKK30KKworLyoqCisgKiBvdnNfZmxvd19leHRyYWN0IC0gZXh0cmFjdHMgYSBmbG93IGtleSBmcm9tIGFuIEV0aGVybmV0IGZyYW1lLgorICogQHNrYjogc2tfYnVmZiB0aGF0IGNvbnRhaW5zIHRoZSBmcmFtZSwgd2l0aCBza2ItPmRhdGEgcG9pbnRpbmcgdG8gdGhlCisgKiBFdGhlcm5ldCBoZWFkZXIKKyAqIEBpbl9wb3J0OiBwb3J0IG51bWJlciBvbiB3aGljaCBAc2tiIHdhcyByZWNlaXZlZC4KKyAqIEBrZXk6IG91dHB1dCBmbG93IGtleQorICogQGtleV9sZW5wOiBsZW5ndGggb2Ygb3V0cHV0IGZsb3cga2V5CisgKgorICogVGhlIGNhbGxlciBtdXN0IGVuc3VyZSB0aGF0IHNrYi0+bGVuID49IEVUSF9ITEVOLgorICoKKyAqIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgYSBuZWdhdGl2ZSBlcnJubyB2YWx1ZS4KKyAqCisgKiBJbml0aWFsaXplcyBAc2tiIGhlYWRlciBwb2ludGVycyBhcyBmb2xsb3dzOgorICoKKyAqICAgIC0gc2tiLT5tYWNfaGVhZGVyOiB0aGUgRXRoZXJuZXQgaGVhZGVyLgorICoKKyAqICAgIC0gc2tiLT5uZXR3b3JrX2hlYWRlcjoganVzdCBwYXN0IHRoZSBFdGhlcm5ldCBoZWFkZXIsIG9yIGp1c3QgcGFzdCB0aGUKKyAqICAgICAgVkxBTiBoZWFkZXIsIHRvIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBFdGhlcm5ldCBwYXlsb2FkLgorICoKKyAqICAgIC0gc2tiLT50cmFuc3BvcnRfaGVhZGVyOiBJZiBrZXktPmRsX3R5cGUgaXMgRVRIX1BfSVAgb3IgRVRIX1BfSVBWNgorICogICAgICBvbiBvdXRwdXQsIHRoZW4ganVzdCBwYXN0IHRoZSBJUCBoZWFkZXIsIGlmIG9uZSBpcyBwcmVzZW50IGFuZAorICogICAgICBvZiBhIGNvcnJlY3QgbGVuZ3RoLCBvdGhlcndpc2UgdGhlIHNhbWUgYXMgc2tiLT5uZXR3b3JrX2hlYWRlci4KKyAqICAgICAgRm9yIG90aGVyIGtleS0+ZGxfdHlwZSB2YWx1ZXMgaXQgaXMgbGVmdCB1bnRvdWNoZWQuCisgKi8KK2ludCBvdnNfZmxvd19leHRyYWN0KHN0cnVjdCBza19idWZmICpza2IsIHUxNiBpbl9wb3J0LCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwKKwkJIGludCAqa2V5X2xlbnApCit7CisJaW50IGVycm9yID0gMDsKKwlpbnQga2V5X2xlbiA9IFNXX0ZMT1dfS0VZX09GRlNFVChldGgpOworCXN0cnVjdCBldGhoZHIgKmV0aDsKKworCW1lbXNldChrZXksIDAsIHNpemVvZigqa2V5KSk7CisKKwlrZXktPnBoeS5wcmlvcml0eSA9IHNrYi0+cHJpb3JpdHk7CisJa2V5LT5waHkuaW5fcG9ydCA9IGluX3BvcnQ7CisKKwlza2JfcmVzZXRfbWFjX2hlYWRlcihza2IpOworCisJLyogTGluayBsYXllci4gIFdlIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgYXQgbGVhc3QgdGhlIDE0IGJ5dGUgRXRoZXJuZXQKKwkgKiBoZWFkZXIgaW4gdGhlIGxpbmVhciBkYXRhIGFyZWEuCisJICovCisJZXRoID0gZXRoX2hkcihza2IpOworCW1lbWNweShrZXktPmV0aC5zcmMsIGV0aC0+aF9zb3VyY2UsIEVUSF9BTEVOKTsKKwltZW1jcHkoa2V5LT5ldGguZHN0LCBldGgtPmhfZGVzdCwgRVRIX0FMRU4pOworCisJX19za2JfcHVsbChza2IsIDIgKiBFVEhfQUxFTik7CisKKwlpZiAodmxhbl90eF90YWdfcHJlc2VudChza2IpKQorCQlrZXktPmV0aC50Y2kgPSBodG9ucyhza2ItPnZsYW5fdGNpKTsKKwllbHNlIGlmIChldGgtPmhfcHJvdG8gPT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQlpZiAodW5saWtlbHkocGFyc2Vfdmxhbihza2IsIGtleSkpKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwlrZXktPmV0aC50eXBlID0gcGFyc2VfZXRoZXJ0eXBlKHNrYik7CisJaWYgKHVubGlrZWx5KGtleS0+ZXRoLnR5cGUgPT0gaHRvbnMoMCkpKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihza2IpOworCV9fc2tiX3B1c2goc2tiLCBza2ItPmRhdGEgLSBza2JfbWFjX2hlYWRlcihza2IpKTsKKworCS8qIE5ldHdvcmsgbGF5ZXIuICovCisJaWYgKGtleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCXN0cnVjdCBpcGhkciAqbmg7CisJCV9fYmUxNiBvZmZzZXQ7CisKKwkJa2V5X2xlbiA9IFNXX0ZMT1dfS0VZX09GRlNFVChpcHY0LmFkZHIpOworCisJCWVycm9yID0gY2hlY2tfaXBoZHIoc2tiKTsKKwkJaWYgKHVubGlrZWx5KGVycm9yKSkgeworCQkJaWYgKGVycm9yID09IC1FSU5WQUwpIHsKKwkJCQlza2ItPnRyYW5zcG9ydF9oZWFkZXIgPSBza2ItPm5ldHdvcmtfaGVhZGVyOworCQkJCWVycm9yID0gMDsKKwkJCX0KKwkJCWdvdG8gb3V0OworCQl9CisKKwkJbmggPSBpcF9oZHIoc2tiKTsKKwkJa2V5LT5pcHY0LmFkZHIuc3JjID0gbmgtPnNhZGRyOworCQlrZXktPmlwdjQuYWRkci5kc3QgPSBuaC0+ZGFkZHI7CisKKwkJa2V5LT5pcC5wcm90byA9IG5oLT5wcm90b2NvbDsKKwkJa2V5LT5pcC50b3MgPSBuaC0+dG9zOworCQlrZXktPmlwLnR0bCA9IG5oLT50dGw7CisKKwkJb2Zmc2V0ID0gbmgtPmZyYWdfb2ZmICYgaHRvbnMoSVBfT0ZGU0VUKTsKKwkJaWYgKG9mZnNldCkgeworCQkJa2V5LT5pcC5mcmFnID0gT1ZTX0ZSQUdfVFlQRV9MQVRFUjsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChuaC0+ZnJhZ19vZmYgJiBodG9ucyhJUF9NRikgfHwKKwkJCSBza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19VRFApCisJCQlrZXktPmlwLmZyYWcgPSBPVlNfRlJBR19UWVBFX0ZJUlNUOworCisJCS8qIFRyYW5zcG9ydCBsYXllci4gKi8KKwkJaWYgKGtleS0+aXAucHJvdG8gPT0gSVBQUk9UT19UQ1ApIHsKKwkJCWtleV9sZW4gPSBTV19GTE9XX0tFWV9PRkZTRVQoaXB2NC50cCk7CisJCQlpZiAodGNwaGRyX29rKHNrYikpIHsKKwkJCQlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSB0Y3BfaGRyKHNrYik7CisJCQkJa2V5LT5pcHY0LnRwLnNyYyA9IHRjcC0+c291cmNlOworCQkJCWtleS0+aXB2NC50cC5kc3QgPSB0Y3AtPmRlc3Q7CisJCQl9CisJCX0gZWxzZSBpZiAoa2V5LT5pcC5wcm90byA9PSBJUFBST1RPX1VEUCkgeworCQkJa2V5X2xlbiA9IFNXX0ZMT1dfS0VZX09GRlNFVChpcHY0LnRwKTsKKwkJCWlmICh1ZHBoZHJfb2soc2tiKSkgeworCQkJCXN0cnVjdCB1ZHBoZHIgKnVkcCA9IHVkcF9oZHIoc2tiKTsKKwkJCQlrZXktPmlwdjQudHAuc3JjID0gdWRwLT5zb3VyY2U7CisJCQkJa2V5LT5pcHY0LnRwLmRzdCA9IHVkcC0+ZGVzdDsKKwkJCX0KKwkJfSBlbHNlIGlmIChrZXktPmlwLnByb3RvID09IElQUFJPVE9fSUNNUCkgeworCQkJa2V5X2xlbiA9IFNXX0ZMT1dfS0VZX09GRlNFVChpcHY0LnRwKTsKKwkJCWlmIChpY21waGRyX29rKHNrYikpIHsKKwkJCQlzdHJ1Y3QgaWNtcGhkciAqaWNtcCA9IGljbXBfaGRyKHNrYik7CisJCQkJLyogVGhlIElDTVAgdHlwZSBhbmQgY29kZSBmaWVsZHMgdXNlIHRoZSAxNi1iaXQKKwkJCQkgKiB0cmFuc3BvcnQgcG9ydCBmaWVsZHMsIHNvIHdlIG5lZWQgdG8gc3RvcmUKKwkJCQkgKiB0aGVtIGluIDE2LWJpdCBuZXR3b3JrIGJ5dGUgb3JkZXIuICovCisJCQkJa2V5LT5pcHY0LnRwLnNyYyA9IGh0b25zKGljbXAtPnR5cGUpOworCQkJCWtleS0+aXB2NC50cC5kc3QgPSBodG9ucyhpY21wLT5jb2RlKTsKKwkJCX0KKwkJfQorCisJfSBlbHNlIGlmIChrZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0FSUCkgJiYgYXJwaGRyX29rKHNrYikpIHsKKwkJc3RydWN0IGFycF9ldGhfaGVhZGVyICphcnA7CisKKwkJYXJwID0gKHN0cnVjdCBhcnBfZXRoX2hlYWRlciAqKXNrYl9uZXR3b3JrX2hlYWRlcihza2IpOworCisJCWlmIChhcnAtPmFyX2hyZCA9PSBodG9ucyhBUlBIUkRfRVRIRVIpCisJCQkJJiYgYXJwLT5hcl9wcm8gPT0gaHRvbnMoRVRIX1BfSVApCisJCQkJJiYgYXJwLT5hcl9obG4gPT0gRVRIX0FMRU4KKwkJCQkmJiBhcnAtPmFyX3BsbiA9PSA0KSB7CisKKwkJCS8qIFdlIG9ubHkgbWF0Y2ggb24gdGhlIGxvd2VyIDggYml0cyBvZiB0aGUgb3Bjb2RlLiAqLworCQkJaWYgKG50b2hzKGFycC0+YXJfb3ApIDw9IDB4ZmYpCisJCQkJa2V5LT5pcC5wcm90byA9IG50b2hzKGFycC0+YXJfb3ApOworCisJCQlpZiAoa2V5LT5pcC5wcm90byA9PSBBUlBPUF9SRVFVRVNUCisJCQkJCXx8IGtleS0+aXAucHJvdG8gPT0gQVJQT1BfUkVQTFkpIHsKKwkJCQltZW1jcHkoJmtleS0+aXB2NC5hZGRyLnNyYywgYXJwLT5hcl9zaXAsIHNpemVvZihrZXktPmlwdjQuYWRkci5zcmMpKTsKKwkJCQltZW1jcHkoJmtleS0+aXB2NC5hZGRyLmRzdCwgYXJwLT5hcl90aXAsIHNpemVvZihrZXktPmlwdjQuYWRkci5kc3QpKTsKKwkJCQltZW1jcHkoa2V5LT5pcHY0LmFycC5zaGEsIGFycC0+YXJfc2hhLCBFVEhfQUxFTik7CisJCQkJbWVtY3B5KGtleS0+aXB2NC5hcnAudGhhLCBhcnAtPmFyX3RoYSwgRVRIX0FMRU4pOworCQkJCWtleV9sZW4gPSBTV19GTE9XX0tFWV9PRkZTRVQoaXB2NC5hcnApOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChrZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQVjYpKSB7CisJCWludCBuaF9sZW47ICAgICAgICAgICAgIC8qIElQdjYgSGVhZGVyICsgRXh0ZW5zaW9ucyAqLworCisJCW5oX2xlbiA9IHBhcnNlX2lwdjZoZHIoc2tiLCBrZXksICZrZXlfbGVuKTsKKwkJaWYgKHVubGlrZWx5KG5oX2xlbiA8IDApKSB7CisJCQlpZiAobmhfbGVuID09IC1FSU5WQUwpCisJCQkJc2tiLT50cmFuc3BvcnRfaGVhZGVyID0gc2tiLT5uZXR3b3JrX2hlYWRlcjsKKwkJCWVsc2UKKwkJCQllcnJvciA9IG5oX2xlbjsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKGtleS0+aXAuZnJhZyA9PSBPVlNfRlJBR19UWVBFX0xBVEVSKQorCQkJZ290byBvdXQ7CisJCWlmIChza2Jfc2hpbmZvKHNrYiktPmdzb190eXBlICYgU0tCX0dTT19VRFApCisJCQlrZXktPmlwLmZyYWcgPSBPVlNfRlJBR19UWVBFX0ZJUlNUOworCisJCS8qIFRyYW5zcG9ydCBsYXllci4gKi8KKwkJaWYgKGtleS0+aXAucHJvdG8gPT0gTkVYVEhEUl9UQ1ApIHsKKwkJCWtleV9sZW4gPSBTV19GTE9XX0tFWV9PRkZTRVQoaXB2Ni50cCk7CisJCQlpZiAodGNwaGRyX29rKHNrYikpIHsKKwkJCQlzdHJ1Y3QgdGNwaGRyICp0Y3AgPSB0Y3BfaGRyKHNrYik7CisJCQkJa2V5LT5pcHY2LnRwLnNyYyA9IHRjcC0+c291cmNlOworCQkJCWtleS0+aXB2Ni50cC5kc3QgPSB0Y3AtPmRlc3Q7CisJCQl9CisJCX0gZWxzZSBpZiAoa2V5LT5pcC5wcm90byA9PSBORVhUSERSX1VEUCkgeworCQkJa2V5X2xlbiA9IFNXX0ZMT1dfS0VZX09GRlNFVChpcHY2LnRwKTsKKwkJCWlmICh1ZHBoZHJfb2soc2tiKSkgeworCQkJCXN0cnVjdCB1ZHBoZHIgKnVkcCA9IHVkcF9oZHIoc2tiKTsKKwkJCQlrZXktPmlwdjYudHAuc3JjID0gdWRwLT5zb3VyY2U7CisJCQkJa2V5LT5pcHY2LnRwLmRzdCA9IHVkcC0+ZGVzdDsKKwkJCX0KKwkJfSBlbHNlIGlmIChrZXktPmlwLnByb3RvID09IE5FWFRIRFJfSUNNUCkgeworCQkJa2V5X2xlbiA9IFNXX0ZMT1dfS0VZX09GRlNFVChpcHY2LnRwKTsKKwkJCWlmIChpY21wNmhkcl9vayhza2IpKSB7CisJCQkJZXJyb3IgPSBwYXJzZV9pY21wdjYoc2tiLCBrZXksICZrZXlfbGVuLCBuaF9sZW4pOworCQkJCWlmIChlcnJvciA8IDApCisJCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJfQorCitvdXQ6CisJKmtleV9sZW5wID0ga2V5X2xlbjsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3UzMiBvdnNfZmxvd19oYXNoKGNvbnN0IHN0cnVjdCBzd19mbG93X2tleSAqa2V5LCBpbnQga2V5X2xlbikKK3sKKwlyZXR1cm4gamhhc2gyKCh1MzIgKilrZXksIERJVl9ST1VORF9VUChrZXlfbGVuLCBzaXplb2YodTMyKSksIDApOworfQorCitzdHJ1Y3Qgc3dfZmxvdyAqb3ZzX2Zsb3dfdGJsX2xvb2t1cChzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGUsCisJCQkJc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksIGludCBrZXlfbGVuKQoreworCXN0cnVjdCBzd19mbG93ICpmbG93OworCXN0cnVjdCBobGlzdF9ub2RlICpuOworCXN0cnVjdCBobGlzdF9oZWFkICpoZWFkOworCXUzMiBoYXNoOworCisJaGFzaCA9IG92c19mbG93X2hhc2goa2V5LCBrZXlfbGVuKTsKKworCWhlYWQgPSBmaW5kX2J1Y2tldCh0YWJsZSwgaGFzaCk7CisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGZsb3csIG4sIGhlYWQsIGhhc2hfbm9kZVt0YWJsZS0+bm9kZV92ZXJdKSB7CisKKwkJaWYgKGZsb3ctPmhhc2ggPT0gaGFzaCAmJgorCQkgICAgIW1lbWNtcCgmZmxvdy0+a2V5LCBrZXksIGtleV9sZW4pKSB7CisJCQlyZXR1cm4gZmxvdzsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBvdnNfZmxvd190YmxfaW5zZXJ0KHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSwgc3RydWN0IHN3X2Zsb3cgKmZsb3cpCit7CisJc3RydWN0IGhsaXN0X2hlYWQgKmhlYWQ7CisKKwloZWFkID0gZmluZF9idWNrZXQodGFibGUsIGZsb3ctPmhhc2gpOworCWhsaXN0X2FkZF9oZWFkX3JjdSgmZmxvdy0+aGFzaF9ub2RlW3RhYmxlLT5ub2RlX3Zlcl0sIGhlYWQpOworCXRhYmxlLT5jb3VudCsrOworfQorCit2b2lkIG92c19mbG93X3RibF9yZW1vdmUoc3RydWN0IGZsb3dfdGFibGUgKnRhYmxlLCBzdHJ1Y3Qgc3dfZmxvdyAqZmxvdykKK3sKKwlobGlzdF9kZWxfcmN1KCZmbG93LT5oYXNoX25vZGVbdGFibGUtPm5vZGVfdmVyXSk7CisJdGFibGUtPmNvdW50LS07CisJQlVHX09OKHRhYmxlLT5jb3VudCA8IDApOworfQorCisvKiBUaGUgc2l6ZSBvZiB0aGUgYXJndW1lbnQgZm9yIGVhY2ggJU9WU19LRVlfQVRUUl8qIE5ldGxpbmsgYXR0cmlidXRlLiAgKi8KK2NvbnN0IGludCBvdnNfa2V5X2xlbnNbT1ZTX0tFWV9BVFRSX01BWCArIDFdID0geworCVtPVlNfS0VZX0FUVFJfRU5DQVBdID0gLTEsCisJW09WU19LRVlfQVRUUl9QUklPUklUWV0gPSBzaXplb2YodTMyKSwKKwlbT1ZTX0tFWV9BVFRSX0lOX1BPUlRdID0gc2l6ZW9mKHUzMiksCisJW09WU19LRVlfQVRUUl9FVEhFUk5FVF0gPSBzaXplb2Yoc3RydWN0IG92c19rZXlfZXRoZXJuZXQpLAorCVtPVlNfS0VZX0FUVFJfVkxBTl0gPSBzaXplb2YoX19iZTE2KSwKKwlbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0gPSBzaXplb2YoX19iZTE2KSwKKwlbT1ZTX0tFWV9BVFRSX0lQVjRdID0gc2l6ZW9mKHN0cnVjdCBvdnNfa2V5X2lwdjQpLAorCVtPVlNfS0VZX0FUVFJfSVBWNl0gPSBzaXplb2Yoc3RydWN0IG92c19rZXlfaXB2NiksCisJW09WU19LRVlfQVRUUl9UQ1BdID0gc2l6ZW9mKHN0cnVjdCBvdnNfa2V5X3RjcCksCisJW09WU19LRVlfQVRUUl9VRFBdID0gc2l6ZW9mKHN0cnVjdCBvdnNfa2V5X3VkcCksCisJW09WU19LRVlfQVRUUl9JQ01QXSA9IHNpemVvZihzdHJ1Y3Qgb3ZzX2tleV9pY21wKSwKKwlbT1ZTX0tFWV9BVFRSX0lDTVBWNl0gPSBzaXplb2Yoc3RydWN0IG92c19rZXlfaWNtcHY2KSwKKwlbT1ZTX0tFWV9BVFRSX0FSUF0gPSBzaXplb2Yoc3RydWN0IG92c19rZXlfYXJwKSwKKwlbT1ZTX0tFWV9BVFRSX05EXSA9IHNpemVvZihzdHJ1Y3Qgb3ZzX2tleV9uZCksCit9OworCitzdGF0aWMgaW50IGlwdjRfZmxvd19mcm9tX25sYXR0cnMoc3RydWN0IHN3X2Zsb3dfa2V5ICpzd2tleSwgaW50ICprZXlfbGVuLAorCQkJCSAgY29uc3Qgc3RydWN0IG5sYXR0ciAqYVtdLCB1MzIgKmF0dHJzKQoreworCWNvbnN0IHN0cnVjdCBvdnNfa2V5X2ljbXAgKmljbXBfa2V5OworCWNvbnN0IHN0cnVjdCBvdnNfa2V5X3RjcCAqdGNwX2tleTsKKwljb25zdCBzdHJ1Y3Qgb3ZzX2tleV91ZHAgKnVkcF9rZXk7CisKKwlzd2l0Y2ggKHN3a2V5LT5pcC5wcm90bykgeworCWNhc2UgSVBQUk9UT19UQ1A6CisJCWlmICghKCphdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9UQ1ApKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkqYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9UQ1ApOworCisJCSprZXlfbGVuID0gU1dfRkxPV19LRVlfT0ZGU0VUKGlwdjQudHApOworCQl0Y3Bfa2V5ID0gbmxhX2RhdGEoYVtPVlNfS0VZX0FUVFJfVENQXSk7CisJCXN3a2V5LT5pcHY0LnRwLnNyYyA9IHRjcF9rZXktPnRjcF9zcmM7CisJCXN3a2V5LT5pcHY0LnRwLmRzdCA9IHRjcF9rZXktPnRjcF9kc3Q7CisJCWJyZWFrOworCisJY2FzZSBJUFBST1RPX1VEUDoKKwkJaWYgKCEoKmF0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX1VEUCkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSphdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX1VEUCk7CisKKwkJKmtleV9sZW4gPSBTV19GTE9XX0tFWV9PRkZTRVQoaXB2NC50cCk7CisJCXVkcF9rZXkgPSBubGFfZGF0YShhW09WU19LRVlfQVRUUl9VRFBdKTsKKwkJc3drZXktPmlwdjQudHAuc3JjID0gdWRwX2tleS0+dWRwX3NyYzsKKwkJc3drZXktPmlwdjQudHAuZHN0ID0gdWRwX2tleS0+dWRwX2RzdDsKKwkJYnJlYWs7CisKKwljYXNlIElQUFJPVE9fSUNNUDoKKwkJaWYgKCEoKmF0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0lDTVApKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkqYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9JQ01QKTsKKworCQkqa2V5X2xlbiA9IFNXX0ZMT1dfS0VZX09GRlNFVChpcHY0LnRwKTsKKwkJaWNtcF9rZXkgPSBubGFfZGF0YShhW09WU19LRVlfQVRUUl9JQ01QXSk7CisJCXN3a2V5LT5pcHY0LnRwLnNyYyA9IGh0b25zKGljbXBfa2V5LT5pY21wX3R5cGUpOworCQlzd2tleS0+aXB2NC50cC5kc3QgPSBodG9ucyhpY21wX2tleS0+aWNtcF9jb2RlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXB2Nl9mbG93X2Zyb21fbmxhdHRycyhzdHJ1Y3Qgc3dfZmxvd19rZXkgKnN3a2V5LCBpbnQgKmtleV9sZW4sCisJCQkJICBjb25zdCBzdHJ1Y3QgbmxhdHRyICphW10sIHUzMiAqYXR0cnMpCit7CisJY29uc3Qgc3RydWN0IG92c19rZXlfaWNtcHY2ICppY21wdjZfa2V5OworCWNvbnN0IHN0cnVjdCBvdnNfa2V5X3RjcCAqdGNwX2tleTsKKwljb25zdCBzdHJ1Y3Qgb3ZzX2tleV91ZHAgKnVkcF9rZXk7CisKKwlzd2l0Y2ggKHN3a2V5LT5pcC5wcm90bykgeworCWNhc2UgSVBQUk9UT19UQ1A6CisJCWlmICghKCphdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9UQ1ApKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQkqYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9UQ1ApOworCisJCSprZXlfbGVuID0gU1dfRkxPV19LRVlfT0ZGU0VUKGlwdjYudHApOworCQl0Y3Bfa2V5ID0gbmxhX2RhdGEoYVtPVlNfS0VZX0FUVFJfVENQXSk7CisJCXN3a2V5LT5pcHY2LnRwLnNyYyA9IHRjcF9rZXktPnRjcF9zcmM7CisJCXN3a2V5LT5pcHY2LnRwLmRzdCA9IHRjcF9rZXktPnRjcF9kc3Q7CisJCWJyZWFrOworCisJY2FzZSBJUFBST1RPX1VEUDoKKwkJaWYgKCEoKmF0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX1VEUCkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCSphdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX1VEUCk7CisKKwkJKmtleV9sZW4gPSBTV19GTE9XX0tFWV9PRkZTRVQoaXB2Ni50cCk7CisJCXVkcF9rZXkgPSBubGFfZGF0YShhW09WU19LRVlfQVRUUl9VRFBdKTsKKwkJc3drZXktPmlwdjYudHAuc3JjID0gdWRwX2tleS0+dWRwX3NyYzsKKwkJc3drZXktPmlwdjYudHAuZHN0ID0gdWRwX2tleS0+dWRwX2RzdDsKKwkJYnJlYWs7CisKKwljYXNlIElQUFJPVE9fSUNNUFY2OgorCQlpZiAoISgqYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfSUNNUFY2KSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJKmF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfSUNNUFY2KTsKKworCQkqa2V5X2xlbiA9IFNXX0ZMT1dfS0VZX09GRlNFVChpcHY2LnRwKTsKKwkJaWNtcHY2X2tleSA9IG5sYV9kYXRhKGFbT1ZTX0tFWV9BVFRSX0lDTVBWNl0pOworCQlzd2tleS0+aXB2Ni50cC5zcmMgPSBodG9ucyhpY21wdjZfa2V5LT5pY21wdjZfdHlwZSk7CisJCXN3a2V5LT5pcHY2LnRwLmRzdCA9IGh0b25zKGljbXB2Nl9rZXktPmljbXB2Nl9jb2RlKTsKKworCQlpZiAoc3drZXktPmlwdjYudHAuc3JjID09IGh0b25zKE5ESVNDX05FSUdIQk9VUl9TT0xJQ0lUQVRJT04pIHx8CisJCSAgICBzd2tleS0+aXB2Ni50cC5zcmMgPT0gaHRvbnMoTkRJU0NfTkVJR0hCT1VSX0FEVkVSVElTRU1FTlQpKSB7CisJCQljb25zdCBzdHJ1Y3Qgb3ZzX2tleV9uZCAqbmRfa2V5OworCisJCQlpZiAoISgqYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfTkQpKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCSphdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX05EKTsKKworCQkJKmtleV9sZW4gPSBTV19GTE9XX0tFWV9PRkZTRVQoaXB2Ni5uZCk7CisJCQluZF9rZXkgPSBubGFfZGF0YShhW09WU19LRVlfQVRUUl9ORF0pOworCQkJbWVtY3B5KCZzd2tleS0+aXB2Ni5uZC50YXJnZXQsIG5kX2tleS0+bmRfdGFyZ2V0LAorCQkJICAgICAgIHNpemVvZihzd2tleS0+aXB2Ni5uZC50YXJnZXQpKTsKKwkJCW1lbWNweShzd2tleS0+aXB2Ni5uZC5zbGwsIG5kX2tleS0+bmRfc2xsLCBFVEhfQUxFTik7CisJCQltZW1jcHkoc3drZXktPmlwdjYubmQudGxsLCBuZF9rZXktPm5kX3RsbCwgRVRIX0FMRU4pOworCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhcnNlX2Zsb3dfbmxhdHRycyhjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyLAorCQkJICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqYVtdLCB1MzIgKmF0dHJzcCkKK3sKKwljb25zdCBzdHJ1Y3QgbmxhdHRyICpubGE7CisJdTMyIGF0dHJzOworCWludCByZW07CisKKwlhdHRycyA9IDA7CisJbmxhX2Zvcl9lYWNoX25lc3RlZChubGEsIGF0dHIsIHJlbSkgeworCQl1MTYgdHlwZSA9IG5sYV90eXBlKG5sYSk7CisJCWludCBleHBlY3RlZF9sZW47CisKKwkJaWYgKHR5cGUgPiBPVlNfS0VZX0FUVFJfTUFYIHx8IGF0dHJzICYgKDEgPDwgdHlwZSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlleHBlY3RlZF9sZW4gPSBvdnNfa2V5X2xlbnNbdHlwZV07CisJCWlmIChubGFfbGVuKG5sYSkgIT0gZXhwZWN0ZWRfbGVuICYmIGV4cGVjdGVkX2xlbiAhPSAtMSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWF0dHJzIHw9IDEgPDwgdHlwZTsKKwkJYVt0eXBlXSA9IG5sYTsKKwl9CisJaWYgKHJlbSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkqYXR0cnNwID0gYXR0cnM7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogb3ZzX2Zsb3dfZnJvbV9ubGF0dHJzIC0gcGFyc2VzIE5ldGxpbmsgYXR0cmlidXRlcyBpbnRvIGEgZmxvdyBrZXkuCisgKiBAc3drZXk6IHJlY2VpdmVzIHRoZSBleHRyYWN0ZWQgZmxvdyBrZXkuCisgKiBAa2V5X2xlbnA6IG51bWJlciBvZiBieXRlcyB1c2VkIGluIEBzd2tleS4KKyAqIEBhdHRyOiBOZXRsaW5rIGF0dHJpYnV0ZSBob2xkaW5nIG5lc3RlZCAlT1ZTX0tFWV9BVFRSXyogTmV0bGluayBhdHRyaWJ1dGUKKyAqIHNlcXVlbmNlLgorICovCitpbnQgb3ZzX2Zsb3dfZnJvbV9ubGF0dHJzKHN0cnVjdCBzd19mbG93X2tleSAqc3drZXksIGludCAqa2V5X2xlbnAsCisJCSAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIpCit7CisJY29uc3Qgc3RydWN0IG5sYXR0ciAqYVtPVlNfS0VZX0FUVFJfTUFYICsgMV07CisJY29uc3Qgc3RydWN0IG92c19rZXlfZXRoZXJuZXQgKmV0aF9rZXk7CisJaW50IGtleV9sZW47CisJdTMyIGF0dHJzOworCWludCBlcnI7CisKKwltZW1zZXQoc3drZXksIDAsIHNpemVvZihzdHJ1Y3Qgc3dfZmxvd19rZXkpKTsKKwlrZXlfbGVuID0gU1dfRkxPV19LRVlfT0ZGU0VUKGV0aCk7CisKKwllcnIgPSBwYXJzZV9mbG93X25sYXR0cnMoYXR0ciwgYSwgJmF0dHJzKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJLyogTWV0YWRhdGEgYXR0cmlidXRlcy4gKi8KKwlpZiAoYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfUFJJT1JJVFkpKSB7CisJCXN3a2V5LT5waHkucHJpb3JpdHkgPSBubGFfZ2V0X3UzMihhW09WU19LRVlfQVRUUl9QUklPUklUWV0pOworCQlhdHRycyAmPSB+KDEgPDwgT1ZTX0tFWV9BVFRSX1BSSU9SSVRZKTsKKwl9CisJaWYgKGF0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0lOX1BPUlQpKSB7CisJCXUzMiBpbl9wb3J0ID0gbmxhX2dldF91MzIoYVtPVlNfS0VZX0FUVFJfSU5fUE9SVF0pOworCQlpZiAoaW5fcG9ydCA+PSBEUF9NQVhfUE9SVFMpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3drZXktPnBoeS5pbl9wb3J0ID0gaW5fcG9ydDsKKwkJYXR0cnMgJj0gfigxIDw8IE9WU19LRVlfQVRUUl9JTl9QT1JUKTsKKwl9IGVsc2UgeworCQlzd2tleS0+cGh5LmluX3BvcnQgPSBVU0hSVF9NQVg7CisJfQorCisJLyogRGF0YSBhdHRyaWJ1dGVzLiAqLworCWlmICghKGF0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0VUSEVSTkVUKSkpCisJCXJldHVybiAtRUlOVkFMOworCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfRVRIRVJORVQpOworCisJZXRoX2tleSA9IG5sYV9kYXRhKGFbT1ZTX0tFWV9BVFRSX0VUSEVSTkVUXSk7CisJbWVtY3B5KHN3a2V5LT5ldGguc3JjLCBldGhfa2V5LT5ldGhfc3JjLCBFVEhfQUxFTik7CisJbWVtY3B5KHN3a2V5LT5ldGguZHN0LCBldGhfa2V5LT5ldGhfZHN0LCBFVEhfQUxFTik7CisKKwlpZiAoYXR0cnMgJiAoMXUgPDwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSkgJiYKKwkgICAgbmxhX2dldF9iZTE2KGFbT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRV0pID09IGh0b25zKEVUSF9QXzgwMjFRKSkgeworCQljb25zdCBzdHJ1Y3QgbmxhdHRyICplbmNhcDsKKwkJX19iZTE2IHRjaTsKKworCQlpZiAoYXR0cnMgIT0gKCgxIDw8IE9WU19LRVlfQVRUUl9WTEFOKSB8CisJCQkgICAgICAoMSA8PCBPVlNfS0VZX0FUVFJfRVRIRVJUWVBFKSB8CisJCQkgICAgICAoMSA8PCBPVlNfS0VZX0FUVFJfRU5DQVApKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWVuY2FwID0gYVtPVlNfS0VZX0FUVFJfRU5DQVBdOworCQl0Y2kgPSBubGFfZ2V0X2JlMTYoYVtPVlNfS0VZX0FUVFJfVkxBTl0pOworCQlpZiAodGNpICYgaHRvbnMoVkxBTl9UQUdfUFJFU0VOVCkpIHsKKwkJCXN3a2V5LT5ldGgudGNpID0gdGNpOworCisJCQllcnIgPSBwYXJzZV9mbG93X25sYXR0cnMoZW5jYXAsIGEsICZhdHRycyk7CisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0gZWxzZSBpZiAoIXRjaSkgeworCQkJLyogQ29ybmVyIGNhc2UgZm9yIHRydW5jYXRlZCA4MDIuMVEgaGVhZGVyLiAqLworCQkJaWYgKG5sYV9sZW4oZW5jYXApKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlzd2tleS0+ZXRoLnR5cGUgPSBodG9ucyhFVEhfUF84MDIxUSk7CisJCQkqa2V5X2xlbnAgPSBrZXlfbGVuOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCWlmIChhdHRycyAmICgxIDw8IE9WU19LRVlfQVRUUl9FVEhFUlRZUEUpKSB7CisJCXN3a2V5LT5ldGgudHlwZSA9IG5sYV9nZXRfYmUxNihhW09WU19LRVlfQVRUUl9FVEhFUlRZUEVdKTsKKwkJaWYgKG50b2hzKHN3a2V5LT5ldGgudHlwZSkgPCAxNTM2KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfRVRIRVJUWVBFKTsKKwl9IGVsc2UgeworCQlzd2tleS0+ZXRoLnR5cGUgPSBodG9ucyhFVEhfUF84MDJfMik7CisJfQorCisJaWYgKHN3a2V5LT5ldGgudHlwZSA9PSBodG9ucyhFVEhfUF9JUCkpIHsKKwkJY29uc3Qgc3RydWN0IG92c19rZXlfaXB2NCAqaXB2NF9rZXk7CisKKwkJaWYgKCEoYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfSVBWNCkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfSVBWNCk7CisKKwkJa2V5X2xlbiA9IFNXX0ZMT1dfS0VZX09GRlNFVChpcHY0LmFkZHIpOworCQlpcHY0X2tleSA9IG5sYV9kYXRhKGFbT1ZTX0tFWV9BVFRSX0lQVjRdKTsKKwkJaWYgKGlwdjRfa2V5LT5pcHY0X2ZyYWcgPiBPVlNfRlJBR19UWVBFX01BWCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzd2tleS0+aXAucHJvdG8gPSBpcHY0X2tleS0+aXB2NF9wcm90bzsKKwkJc3drZXktPmlwLnRvcyA9IGlwdjRfa2V5LT5pcHY0X3RvczsKKwkJc3drZXktPmlwLnR0bCA9IGlwdjRfa2V5LT5pcHY0X3R0bDsKKwkJc3drZXktPmlwLmZyYWcgPSBpcHY0X2tleS0+aXB2NF9mcmFnOworCQlzd2tleS0+aXB2NC5hZGRyLnNyYyA9IGlwdjRfa2V5LT5pcHY0X3NyYzsKKwkJc3drZXktPmlwdjQuYWRkci5kc3QgPSBpcHY0X2tleS0+aXB2NF9kc3Q7CisKKwkJaWYgKHN3a2V5LT5pcC5mcmFnICE9IE9WU19GUkFHX1RZUEVfTEFURVIpIHsKKwkJCWVyciA9IGlwdjRfZmxvd19mcm9tX25sYXR0cnMoc3drZXksICZrZXlfbGVuLCBhLCAmYXR0cnMpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisJfSBlbHNlIGlmIChzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKKwkJY29uc3Qgc3RydWN0IG92c19rZXlfaXB2NiAqaXB2Nl9rZXk7CisKKwkJaWYgKCEoYXR0cnMgJiAoMSA8PCBPVlNfS0VZX0FUVFJfSVBWNikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfSVBWNik7CisKKwkJa2V5X2xlbiA9IFNXX0ZMT1dfS0VZX09GRlNFVChpcHY2LmxhYmVsKTsKKwkJaXB2Nl9rZXkgPSBubGFfZGF0YShhW09WU19LRVlfQVRUUl9JUFY2XSk7CisJCWlmIChpcHY2X2tleS0+aXB2Nl9mcmFnID4gT1ZTX0ZSQUdfVFlQRV9NQVgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3drZXktPmlwdjYubGFiZWwgPSBpcHY2X2tleS0+aXB2Nl9sYWJlbDsKKwkJc3drZXktPmlwLnByb3RvID0gaXB2Nl9rZXktPmlwdjZfcHJvdG87CisJCXN3a2V5LT5pcC50b3MgPSBpcHY2X2tleS0+aXB2Nl90Y2xhc3M7CisJCXN3a2V5LT5pcC50dGwgPSBpcHY2X2tleS0+aXB2Nl9obGltaXQ7CisJCXN3a2V5LT5pcC5mcmFnID0gaXB2Nl9rZXktPmlwdjZfZnJhZzsKKwkJbWVtY3B5KCZzd2tleS0+aXB2Ni5hZGRyLnNyYywgaXB2Nl9rZXktPmlwdjZfc3JjLAorCQkgICAgICAgc2l6ZW9mKHN3a2V5LT5pcHY2LmFkZHIuc3JjKSk7CisJCW1lbWNweSgmc3drZXktPmlwdjYuYWRkci5kc3QsIGlwdjZfa2V5LT5pcHY2X2RzdCwKKwkJICAgICAgIHNpemVvZihzd2tleS0+aXB2Ni5hZGRyLmRzdCkpOworCisJCWlmIChzd2tleS0+aXAuZnJhZyAhPSBPVlNfRlJBR19UWVBFX0xBVEVSKSB7CisJCQllcnIgPSBpcHY2X2Zsb3dfZnJvbV9ubGF0dHJzKHN3a2V5LCAma2V5X2xlbiwgYSwgJmF0dHJzKTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKKwkJfQorCX0gZWxzZSBpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0FSUCkpIHsKKwkJY29uc3Qgc3RydWN0IG92c19rZXlfYXJwICphcnBfa2V5OworCisJCWlmICghKGF0dHJzICYgKDEgPDwgT1ZTX0tFWV9BVFRSX0FSUCkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWF0dHJzICY9IH4oMSA8PCBPVlNfS0VZX0FUVFJfQVJQKTsKKworCQlrZXlfbGVuID0gU1dfRkxPV19LRVlfT0ZGU0VUKGlwdjQuYXJwKTsKKwkJYXJwX2tleSA9IG5sYV9kYXRhKGFbT1ZTX0tFWV9BVFRSX0FSUF0pOworCQlzd2tleS0+aXB2NC5hZGRyLnNyYyA9IGFycF9rZXktPmFycF9zaXA7CisJCXN3a2V5LT5pcHY0LmFkZHIuZHN0ID0gYXJwX2tleS0+YXJwX3RpcDsKKwkJaWYgKGFycF9rZXktPmFycF9vcCAmIGh0b25zKDB4ZmYwMCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3drZXktPmlwLnByb3RvID0gbnRvaHMoYXJwX2tleS0+YXJwX29wKTsKKwkJbWVtY3B5KHN3a2V5LT5pcHY0LmFycC5zaGEsIGFycF9rZXktPmFycF9zaGEsIEVUSF9BTEVOKTsKKwkJbWVtY3B5KHN3a2V5LT5pcHY0LmFycC50aGEsIGFycF9rZXktPmFycF90aGEsIEVUSF9BTEVOKTsKKwl9CisKKwlpZiAoYXR0cnMpCisJCXJldHVybiAtRUlOVkFMOworCSprZXlfbGVucCA9IGtleV9sZW47CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBvdnNfZmxvd19tZXRhZGF0YV9mcm9tX25sYXR0cnMgLSBwYXJzZXMgTmV0bGluayBhdHRyaWJ1dGVzIGludG8gYSBmbG93IGtleS4KKyAqIEBpbl9wb3J0OiByZWNlaXZlcyB0aGUgZXh0cmFjdGVkIGlucHV0IHBvcnQuCisgKiBAa2V5OiBOZXRsaW5rIGF0dHJpYnV0ZSBob2xkaW5nIG5lc3RlZCAlT1ZTX0tFWV9BVFRSXyogTmV0bGluayBhdHRyaWJ1dGUKKyAqIHNlcXVlbmNlLgorICoKKyAqIFRoaXMgcGFyc2VzIGEgc2VyaWVzIG9mIE5ldGxpbmsgYXR0cmlidXRlcyB0aGF0IGZvcm0gYSBmbG93IGtleSwgd2hpY2ggbXVzdAorICogdGFrZSB0aGUgc2FtZSBmb3JtIGFjY2VwdGVkIGJ5IGZsb3dfZnJvbV9ubGF0dHJzKCksIGJ1dCBvbmx5IGVub3VnaCBvZiBpdCB0bworICogZ2V0IHRoZSBtZXRhZGF0YSwgdGhhdCBpcywgdGhlIHBhcnRzIG9mIHRoZSBmbG93IGtleSB0aGF0IGNhbm5vdCBiZQorICogZXh0cmFjdGVkIGZyb20gdGhlIHBhY2tldCBpdHNlbGYuCisgKi8KK2ludCBvdnNfZmxvd19tZXRhZGF0YV9mcm9tX25sYXR0cnModTMyICpwcmlvcml0eSwgdTE2ICppbl9wb3J0LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIpCit7CisJY29uc3Qgc3RydWN0IG5sYXR0ciAqbmxhOworCWludCByZW07CisKKwkqaW5fcG9ydCA9IFVTSFJUX01BWDsKKwkqcHJpb3JpdHkgPSAwOworCisJbmxhX2Zvcl9lYWNoX25lc3RlZChubGEsIGF0dHIsIHJlbSkgeworCQlpbnQgdHlwZSA9IG5sYV90eXBlKG5sYSk7CisKKwkJaWYgKHR5cGUgPD0gT1ZTX0tFWV9BVFRSX01BWCAmJiBvdnNfa2V5X2xlbnNbdHlwZV0gPiAwKSB7CisJCQlpZiAobmxhX2xlbihubGEpICE9IG92c19rZXlfbGVuc1t0eXBlXSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIE9WU19LRVlfQVRUUl9QUklPUklUWToKKwkJCQkqcHJpb3JpdHkgPSBubGFfZ2V0X3UzMihubGEpOworCQkJCWJyZWFrOworCisJCQljYXNlIE9WU19LRVlfQVRUUl9JTl9QT1JUOgorCQkJCWlmIChubGFfZ2V0X3UzMihubGEpID49IERQX01BWF9QT1JUUykKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJKmluX3BvcnQgPSBubGFfZ2V0X3UzMihubGEpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChyZW0pCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCitpbnQgb3ZzX2Zsb3dfdG9fbmxhdHRycyhjb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKnN3a2V5LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBvdnNfa2V5X2V0aGVybmV0ICpldGhfa2V5OworCXN0cnVjdCBubGF0dHIgKm5sYSwgKmVuY2FwOworCisJaWYgKHN3a2V5LT5waHkucHJpb3JpdHkpCisJCU5MQV9QVVRfVTMyKHNrYiwgT1ZTX0tFWV9BVFRSX1BSSU9SSVRZLCBzd2tleS0+cGh5LnByaW9yaXR5KTsKKworCWlmIChzd2tleS0+cGh5LmluX3BvcnQgIT0gVVNIUlRfTUFYKQorCQlOTEFfUFVUX1UzMihza2IsIE9WU19LRVlfQVRUUl9JTl9QT1JULCBzd2tleS0+cGh5LmluX3BvcnQpOworCisJbmxhID0gbmxhX3Jlc2VydmUoc2tiLCBPVlNfS0VZX0FUVFJfRVRIRVJORVQsIHNpemVvZigqZXRoX2tleSkpOworCWlmICghbmxhKQorCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwlldGhfa2V5ID0gbmxhX2RhdGEobmxhKTsKKwltZW1jcHkoZXRoX2tleS0+ZXRoX3NyYywgc3drZXktPmV0aC5zcmMsIEVUSF9BTEVOKTsKKwltZW1jcHkoZXRoX2tleS0+ZXRoX2RzdCwgc3drZXktPmV0aC5kc3QsIEVUSF9BTEVOKTsKKworCWlmIChzd2tleS0+ZXRoLnRjaSB8fCBzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfODAyMVEpKSB7CisJCU5MQV9QVVRfQkUxNihza2IsIE9WU19LRVlfQVRUUl9FVEhFUlRZUEUsIGh0b25zKEVUSF9QXzgwMjFRKSk7CisJCU5MQV9QVVRfQkUxNihza2IsIE9WU19LRVlfQVRUUl9WTEFOLCBzd2tleS0+ZXRoLnRjaSk7CisJCWVuY2FwID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBPVlNfS0VZX0FUVFJfRU5DQVApOworCQlpZiAoIXN3a2V5LT5ldGgudGNpKQorCQkJZ290byB1bmVuY2FwOworCX0gZWxzZSB7CisJCWVuY2FwID0gTlVMTDsKKwl9CisKKwlpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QXzgwMl8yKSkKKwkJZ290byB1bmVuY2FwOworCisJTkxBX1BVVF9CRTE2KHNrYiwgT1ZTX0tFWV9BVFRSX0VUSEVSVFlQRSwgc3drZXktPmV0aC50eXBlKTsKKworCWlmIChzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCXN0cnVjdCBvdnNfa2V5X2lwdjQgKmlwdjRfa2V5OworCisJCW5sYSA9IG5sYV9yZXNlcnZlKHNrYiwgT1ZTX0tFWV9BVFRSX0lQVjQsIHNpemVvZigqaXB2NF9rZXkpKTsKKwkJaWYgKCFubGEpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJaXB2NF9rZXkgPSBubGFfZGF0YShubGEpOworCQlpcHY0X2tleS0+aXB2NF9zcmMgPSBzd2tleS0+aXB2NC5hZGRyLnNyYzsKKwkJaXB2NF9rZXktPmlwdjRfZHN0ID0gc3drZXktPmlwdjQuYWRkci5kc3Q7CisJCWlwdjRfa2V5LT5pcHY0X3Byb3RvID0gc3drZXktPmlwLnByb3RvOworCQlpcHY0X2tleS0+aXB2NF90b3MgPSBzd2tleS0+aXAudG9zOworCQlpcHY0X2tleS0+aXB2NF90dGwgPSBzd2tleS0+aXAudHRsOworCQlpcHY0X2tleS0+aXB2NF9mcmFnID0gc3drZXktPmlwLmZyYWc7CisJfSBlbHNlIGlmIChzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKKwkJc3RydWN0IG92c19rZXlfaXB2NiAqaXB2Nl9rZXk7CisKKwkJbmxhID0gbmxhX3Jlc2VydmUoc2tiLCBPVlNfS0VZX0FUVFJfSVBWNiwgc2l6ZW9mKCppcHY2X2tleSkpOworCQlpZiAoIW5sYSkKKwkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCQlpcHY2X2tleSA9IG5sYV9kYXRhKG5sYSk7CisJCW1lbWNweShpcHY2X2tleS0+aXB2Nl9zcmMsICZzd2tleS0+aXB2Ni5hZGRyLnNyYywKKwkJCQlzaXplb2YoaXB2Nl9rZXktPmlwdjZfc3JjKSk7CisJCW1lbWNweShpcHY2X2tleS0+aXB2Nl9kc3QsICZzd2tleS0+aXB2Ni5hZGRyLmRzdCwKKwkJCQlzaXplb2YoaXB2Nl9rZXktPmlwdjZfZHN0KSk7CisJCWlwdjZfa2V5LT5pcHY2X2xhYmVsID0gc3drZXktPmlwdjYubGFiZWw7CisJCWlwdjZfa2V5LT5pcHY2X3Byb3RvID0gc3drZXktPmlwLnByb3RvOworCQlpcHY2X2tleS0+aXB2Nl90Y2xhc3MgPSBzd2tleS0+aXAudG9zOworCQlpcHY2X2tleS0+aXB2Nl9obGltaXQgPSBzd2tleS0+aXAudHRsOworCQlpcHY2X2tleS0+aXB2Nl9mcmFnID0gc3drZXktPmlwLmZyYWc7CisJfSBlbHNlIGlmIChzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfQVJQKSkgeworCQlzdHJ1Y3Qgb3ZzX2tleV9hcnAgKmFycF9rZXk7CisKKwkJbmxhID0gbmxhX3Jlc2VydmUoc2tiLCBPVlNfS0VZX0FUVFJfQVJQLCBzaXplb2YoKmFycF9rZXkpKTsKKwkJaWYgKCFubGEpCisJCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKKwkJYXJwX2tleSA9IG5sYV9kYXRhKG5sYSk7CisJCW1lbXNldChhcnBfa2V5LCAwLCBzaXplb2Yoc3RydWN0IG92c19rZXlfYXJwKSk7CisJCWFycF9rZXktPmFycF9zaXAgPSBzd2tleS0+aXB2NC5hZGRyLnNyYzsKKwkJYXJwX2tleS0+YXJwX3RpcCA9IHN3a2V5LT5pcHY0LmFkZHIuZHN0OworCQlhcnBfa2V5LT5hcnBfb3AgPSBodG9ucyhzd2tleS0+aXAucHJvdG8pOworCQltZW1jcHkoYXJwX2tleS0+YXJwX3NoYSwgc3drZXktPmlwdjQuYXJwLnNoYSwgRVRIX0FMRU4pOworCQltZW1jcHkoYXJwX2tleS0+YXJwX3RoYSwgc3drZXktPmlwdjQuYXJwLnRoYSwgRVRIX0FMRU4pOworCX0KKworCWlmICgoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQKSB8fAorCSAgICAgc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQVjYpKSAmJgorCSAgICAgc3drZXktPmlwLmZyYWcgIT0gT1ZTX0ZSQUdfVFlQRV9MQVRFUikgeworCisJCWlmIChzd2tleS0+aXAucHJvdG8gPT0gSVBQUk9UT19UQ1ApIHsKKwkJCXN0cnVjdCBvdnNfa2V5X3RjcCAqdGNwX2tleTsKKworCQkJbmxhID0gbmxhX3Jlc2VydmUoc2tiLCBPVlNfS0VZX0FUVFJfVENQLCBzaXplb2YoKnRjcF9rZXkpKTsKKwkJCWlmICghbmxhKQorCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCQkJdGNwX2tleSA9IG5sYV9kYXRhKG5sYSk7CisJCQlpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQKSkgeworCQkJCXRjcF9rZXktPnRjcF9zcmMgPSBzd2tleS0+aXB2NC50cC5zcmM7CisJCQkJdGNwX2tleS0+dGNwX2RzdCA9IHN3a2V5LT5pcHY0LnRwLmRzdDsKKwkJCX0gZWxzZSBpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQVjYpKSB7CisJCQkJdGNwX2tleS0+dGNwX3NyYyA9IHN3a2V5LT5pcHY2LnRwLnNyYzsKKwkJCQl0Y3Bfa2V5LT50Y3BfZHN0ID0gc3drZXktPmlwdjYudHAuZHN0OworCQkJfQorCQl9IGVsc2UgaWYgKHN3a2V5LT5pcC5wcm90byA9PSBJUFBST1RPX1VEUCkgeworCQkJc3RydWN0IG92c19rZXlfdWRwICp1ZHBfa2V5OworCisJCQlubGEgPSBubGFfcmVzZXJ2ZShza2IsIE9WU19LRVlfQVRUUl9VRFAsIHNpemVvZigqdWRwX2tleSkpOworCQkJaWYgKCFubGEpCisJCQkJZ290byBubGFfcHV0X2ZhaWx1cmU7CisJCQl1ZHBfa2V5ID0gbmxhX2RhdGEobmxhKTsKKwkJCWlmIChzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVApKSB7CisJCQkJdWRwX2tleS0+dWRwX3NyYyA9IHN3a2V5LT5pcHY0LnRwLnNyYzsKKwkJCQl1ZHBfa2V5LT51ZHBfZHN0ID0gc3drZXktPmlwdjQudHAuZHN0OworCQkJfSBlbHNlIGlmIChzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVBWNikpIHsKKwkJCQl1ZHBfa2V5LT51ZHBfc3JjID0gc3drZXktPmlwdjYudHAuc3JjOworCQkJCXVkcF9rZXktPnVkcF9kc3QgPSBzd2tleS0+aXB2Ni50cC5kc3Q7CisJCQl9CisJCX0gZWxzZSBpZiAoc3drZXktPmV0aC50eXBlID09IGh0b25zKEVUSF9QX0lQKSAmJgorCQkJICAgc3drZXktPmlwLnByb3RvID09IElQUFJPVE9fSUNNUCkgeworCQkJc3RydWN0IG92c19rZXlfaWNtcCAqaWNtcF9rZXk7CisKKwkJCW5sYSA9IG5sYV9yZXNlcnZlKHNrYiwgT1ZTX0tFWV9BVFRSX0lDTVAsIHNpemVvZigqaWNtcF9rZXkpKTsKKwkJCWlmICghbmxhKQorCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCQkJaWNtcF9rZXkgPSBubGFfZGF0YShubGEpOworCQkJaWNtcF9rZXktPmljbXBfdHlwZSA9IG50b2hzKHN3a2V5LT5pcHY0LnRwLnNyYyk7CisJCQlpY21wX2tleS0+aWNtcF9jb2RlID0gbnRvaHMoc3drZXktPmlwdjQudHAuZHN0KTsKKwkJfSBlbHNlIGlmIChzd2tleS0+ZXRoLnR5cGUgPT0gaHRvbnMoRVRIX1BfSVBWNikgJiYKKwkJCSAgIHN3a2V5LT5pcC5wcm90byA9PSBJUFBST1RPX0lDTVBWNikgeworCQkJc3RydWN0IG92c19rZXlfaWNtcHY2ICppY21wdjZfa2V5OworCisJCQlubGEgPSBubGFfcmVzZXJ2ZShza2IsIE9WU19LRVlfQVRUUl9JQ01QVjYsCisJCQkJCQlzaXplb2YoKmljbXB2Nl9rZXkpKTsKKwkJCWlmICghbmxhKQorCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCQkJaWNtcHY2X2tleSA9IG5sYV9kYXRhKG5sYSk7CisJCQlpY21wdjZfa2V5LT5pY21wdjZfdHlwZSA9IG50b2hzKHN3a2V5LT5pcHY2LnRwLnNyYyk7CisJCQlpY21wdjZfa2V5LT5pY21wdjZfY29kZSA9IG50b2hzKHN3a2V5LT5pcHY2LnRwLmRzdCk7CisKKwkJCWlmIChpY21wdjZfa2V5LT5pY21wdjZfdHlwZSA9PSBORElTQ19ORUlHSEJPVVJfU09MSUNJVEFUSU9OIHx8CisJCQkgICAgaWNtcHY2X2tleS0+aWNtcHY2X3R5cGUgPT0gTkRJU0NfTkVJR0hCT1VSX0FEVkVSVElTRU1FTlQpIHsKKwkJCQlzdHJ1Y3Qgb3ZzX2tleV9uZCAqbmRfa2V5OworCisJCQkJbmxhID0gbmxhX3Jlc2VydmUoc2tiLCBPVlNfS0VZX0FUVFJfTkQsIHNpemVvZigqbmRfa2V5KSk7CisJCQkJaWYgKCFubGEpCisJCQkJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOworCQkJCW5kX2tleSA9IG5sYV9kYXRhKG5sYSk7CisJCQkJbWVtY3B5KG5kX2tleS0+bmRfdGFyZ2V0LCAmc3drZXktPmlwdjYubmQudGFyZ2V0LAorCQkJCQkJCXNpemVvZihuZF9rZXktPm5kX3RhcmdldCkpOworCQkJCW1lbWNweShuZF9rZXktPm5kX3NsbCwgc3drZXktPmlwdjYubmQuc2xsLCBFVEhfQUxFTik7CisJCQkJbWVtY3B5KG5kX2tleS0+bmRfdGxsLCBzd2tleS0+aXB2Ni5uZC50bGwsIEVUSF9BTEVOKTsKKwkJCX0KKwkJfQorCX0KKwordW5lbmNhcDoKKwlpZiAoZW5jYXApCisJCW5sYV9uZXN0X2VuZChza2IsIGVuY2FwKTsKKworCXJldHVybiAwOworCitubGFfcHV0X2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworLyogSW5pdGlhbGl6ZXMgdGhlIGZsb3cgbW9kdWxlLgorICogUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAqLworaW50IG92c19mbG93X2luaXQodm9pZCkKK3sKKwlmbG93X2NhY2hlID0ga21lbV9jYWNoZV9jcmVhdGUoInN3X2Zsb3ciLCBzaXplb2Yoc3RydWN0IHN3X2Zsb3cpLCAwLAorCQkJCQkwLCBOVUxMKTsKKwlpZiAoZmxvd19jYWNoZSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCisvKiBVbmluaXRpYWxpemVzIHRoZSBmbG93IG1vZHVsZS4gKi8KK3ZvaWQgb3ZzX2Zsb3dfZXhpdCh2b2lkKQoreworCWttZW1fY2FjaGVfZGVzdHJveShmbG93X2NhY2hlKTsKK30KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC9mbG93LmggYi9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NDdkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvZmxvdy5oCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTEgTmljaXJhIE5ldHdvcmtzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKi8KKworI2lmbmRlZiBGTE9XX0gKKyNkZWZpbmUgRkxPV19IIDEKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9vcGVudnN3aXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bGludXgvaW42Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9mbGV4X2FycmF5Lmg+CisjaW5jbHVkZSA8bmV0L2luZXRfZWNuLmg+CisKK3N0cnVjdCBza19idWZmOworCitzdHJ1Y3Qgc3dfZmxvd19hY3Rpb25zIHsKKwlzdHJ1Y3QgcmN1X2hlYWQgcmN1OworCXUzMiBhY3Rpb25zX2xlbjsKKwlzdHJ1Y3QgbmxhdHRyIGFjdGlvbnNbXTsKK307CisKK3N0cnVjdCBzd19mbG93X2tleSB7CisJc3RydWN0IHsKKwkJdTMyCXByaW9yaXR5OwkvKiBQYWNrZXQgUW9TIHByaW9yaXR5LiAqLworCQl1MTYJaW5fcG9ydDsJLyogSW5wdXQgc3dpdGNoIHBvcnQgKG9yIFVTSFJUX01BWCkuICovCisJfSBwaHk7CisJc3RydWN0IHsKKwkJdTggICAgIHNyY1tFVEhfQUxFTl07CS8qIEV0aGVybmV0IHNvdXJjZSBhZGRyZXNzLiAqLworCQl1OCAgICAgZHN0W0VUSF9BTEVOXTsJLyogRXRoZXJuZXQgZGVzdGluYXRpb24gYWRkcmVzcy4gKi8KKwkJX19iZTE2IHRjaTsJCS8qIDAgaWYgbm8gVkxBTiwgVkxBTl9UQUdfUFJFU0VOVCBzZXQgb3RoZXJ3aXNlLiAqLworCQlfX2JlMTYgdHlwZTsJCS8qIEV0aGVybmV0IGZyYW1lIHR5cGUuICovCisJfSBldGg7CisJc3RydWN0IHsKKwkJdTggICAgIHByb3RvOwkJLyogSVAgcHJvdG9jb2wgb3IgbG93ZXIgOCBiaXRzIG9mIEFSUCBvcGNvZGUuICovCisJCXU4ICAgICB0b3M7CQkvKiBJUCBUb1MuICovCisJCXU4ICAgICB0dGw7CQkvKiBJUCBUVEwvaG9wIGxpbWl0LiAqLworCQl1OCAgICAgZnJhZzsJCS8qIE9uZSBvZiBPVlNfRlJBR19UWVBFXyouICovCisJfSBpcDsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgeworCQkJCV9fYmUzMiBzcmM7CS8qIElQIHNvdXJjZSBhZGRyZXNzLiAqLworCQkJCV9fYmUzMiBkc3Q7CS8qIElQIGRlc3RpbmF0aW9uIGFkZHJlc3MuICovCisJCQl9IGFkZHI7CisJCQl1bmlvbiB7CisJCQkJc3RydWN0IHsKKwkJCQkJX19iZTE2IHNyYzsJCS8qIFRDUC9VRFAgc291cmNlIHBvcnQuICovCisJCQkJCV9fYmUxNiBkc3Q7CQkvKiBUQ1AvVURQIGRlc3RpbmF0aW9uIHBvcnQuICovCisJCQkJfSB0cDsKKwkJCQlzdHJ1Y3QgeworCQkJCQl1OCBzaGFbRVRIX0FMRU5dOwkvKiBBUlAgc291cmNlIGhhcmR3YXJlIGFkZHJlc3MuICovCisJCQkJCXU4IHRoYVtFVEhfQUxFTl07CS8qIEFSUCB0YXJnZXQgaGFyZHdhcmUgYWRkcmVzcy4gKi8KKwkJCQl9IGFycDsKKwkJCX07CisJCX0gaXB2NDsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGluNl9hZGRyIHNyYzsJLyogSVB2NiBzb3VyY2UgYWRkcmVzcy4gKi8KKwkJCQlzdHJ1Y3QgaW42X2FkZHIgZHN0OwkvKiBJUHY2IGRlc3RpbmF0aW9uIGFkZHJlc3MuICovCisJCQl9IGFkZHI7CisJCQlfX2JlMzIgbGFiZWw7CQkJLyogSVB2NiBmbG93IGxhYmVsLiAqLworCQkJc3RydWN0IHsKKwkJCQlfX2JlMTYgc3JjOwkJLyogVENQL1VEUCBzb3VyY2UgcG9ydC4gKi8KKwkJCQlfX2JlMTYgZHN0OwkJLyogVENQL1VEUCBkZXN0aW5hdGlvbiBwb3J0LiAqLworCQkJfSB0cDsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGluNl9hZGRyIHRhcmdldDsJLyogTkQgdGFyZ2V0IGFkZHJlc3MuICovCisJCQkJdTggc2xsW0VUSF9BTEVOXTsJLyogTkQgc291cmNlIGxpbmsgbGF5ZXIgYWRkcmVzcy4gKi8KKwkJCQl1OCB0bGxbRVRIX0FMRU5dOwkvKiBORCB0YXJnZXQgbGluayBsYXllciBhZGRyZXNzLiAqLworCQkJfSBuZDsKKwkJfSBpcHY2OworCX07Cit9OworCitzdHJ1Y3Qgc3dfZmxvdyB7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSBoYXNoX25vZGVbMl07CisJdTMyIGhhc2g7CisKKwlzdHJ1Y3Qgc3dfZmxvd19rZXkga2V5OworCXN0cnVjdCBzd19mbG93X2FjdGlvbnMgX19yY3UgKnNmX2FjdHM7CisKKwlzcGlubG9ja190IGxvY2s7CS8qIExvY2sgZm9yIHZhbHVlcyBiZWxvdy4gKi8KKwl1bnNpZ25lZCBsb25nIHVzZWQ7CS8qIExhc3QgdXNlZCB0aW1lIChpbiBqaWZmaWVzKS4gKi8KKwl1NjQgcGFja2V0X2NvdW50OwkvKiBOdW1iZXIgb2YgcGFja2V0cyBtYXRjaGVkLiAqLworCXU2NCBieXRlX2NvdW50OwkJLyogTnVtYmVyIG9mIGJ5dGVzIG1hdGNoZWQuICovCisJdTggdGNwX2ZsYWdzOwkJLyogVW5pb24gb2Ygc2VlbiBUQ1AgZmxhZ3MuICovCit9OworCitzdHJ1Y3QgYXJwX2V0aF9oZWFkZXIgeworCV9fYmUxNiAgICAgIGFyX2hyZDsJLyogZm9ybWF0IG9mIGhhcmR3YXJlIGFkZHJlc3MgICAqLworCV9fYmUxNiAgICAgIGFyX3BybzsJLyogZm9ybWF0IG9mIHByb3RvY29sIGFkZHJlc3MgICAqLworCXVuc2lnbmVkIGNoYXIgICBhcl9obG47CS8qIGxlbmd0aCBvZiBoYXJkd2FyZSBhZGRyZXNzICAgKi8KKwl1bnNpZ25lZCBjaGFyICAgYXJfcGxuOwkvKiBsZW5ndGggb2YgcHJvdG9jb2wgYWRkcmVzcyAgICovCisJX19iZTE2ICAgICAgYXJfb3A7CS8qIEFSUCBvcGNvZGUgKGNvbW1hbmQpICAgICAqLworCisJLyogRXRoZXJuZXQrSVB2NCBzcGVjaWZpYyBtZW1iZXJzLiAqLworCXVuc2lnbmVkIGNoYXIgICAgICAgYXJfc2hhW0VUSF9BTEVOXTsJLyogc2VuZGVyIGhhcmR3YXJlIGFkZHJlc3MgICovCisJdW5zaWduZWQgY2hhciAgICAgICBhcl9zaXBbNF07CQkvKiBzZW5kZXIgSVAgYWRkcmVzcyAgICAgICAgKi8KKwl1bnNpZ25lZCBjaGFyICAgICAgIGFyX3RoYVtFVEhfQUxFTl07CS8qIHRhcmdldCBoYXJkd2FyZSBhZGRyZXNzICAqLworCXVuc2lnbmVkIGNoYXIgICAgICAgYXJfdGlwWzRdOwkJLyogdGFyZ2V0IElQIGFkZHJlc3MgICAgICAgICovCit9IF9fcGFja2VkOworCitpbnQgb3ZzX2Zsb3dfaW5pdCh2b2lkKTsKK3ZvaWQgb3ZzX2Zsb3dfZXhpdCh2b2lkKTsKKworc3RydWN0IHN3X2Zsb3cgKm92c19mbG93X2FsbG9jKHZvaWQpOwordm9pZCBvdnNfZmxvd19kZWZlcnJlZF9mcmVlKHN0cnVjdCBzd19mbG93ICopOwordm9pZCBvdnNfZmxvd19mcmVlKHN0cnVjdCBzd19mbG93ICpmbG93KTsKKworc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqb3ZzX2Zsb3dfYWN0aW9uc19hbGxvYyhjb25zdCBzdHJ1Y3QgbmxhdHRyICopOwordm9pZCBvdnNfZmxvd19kZWZlcnJlZF9mcmVlX2FjdHMoc3RydWN0IHN3X2Zsb3dfYWN0aW9ucyAqKTsKKworaW50IG92c19mbG93X2V4dHJhY3Qoc3RydWN0IHNrX2J1ZmYgKiwgdTE2IGluX3BvcnQsIHN0cnVjdCBzd19mbG93X2tleSAqLAorCQkgICAgIGludCAqa2V5X2xlbnApOwordm9pZCBvdnNfZmxvd191c2VkKHN0cnVjdCBzd19mbG93ICosIHN0cnVjdCBza19idWZmICopOwordTY0IG92c19mbG93X3VzZWRfdGltZSh1bnNpZ25lZCBsb25nIGZsb3dfamlmZmllcyk7CisKKy8qIFVwcGVyIGJvdW5kIG9uIHRoZSBsZW5ndGggb2YgYSBubGF0dHItZm9ybWF0dGVkIGZsb3cga2V5LiAgVGhlIGxvbmdlc3QKKyAqIG5sYXR0ci1mb3JtYXR0ZWQgZmxvdyBrZXkgd291bGQgYmU6CisgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0ICBwYWQgIG5sIGhkciAgdG90YWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLSAgLS0tICAtLS0tLS0gIC0tLS0tCisgKiAgT1ZTX0tFWV9BVFRSX1BSSU9SSVRZICAgICAgNCAgICAtLSAgICAgNCAgICAgIDgKKyAqICBPVlNfS0VZX0FUVFJfSU5fUE9SVCAgICAgICA0ICAgIC0tICAgICA0ICAgICAgOAorICogIE9WU19LRVlfQVRUUl9FVEhFUk5FVCAgICAgMTIgICAgLS0gICAgIDQgICAgIDE2CisgKiAgT1ZTX0tFWV9BVFRSXzgwMjFRICAgICAgICAgNCAgICAtLSAgICAgNCAgICAgIDgKKyAqICBPVlNfS0VZX0FUVFJfRVRIRVJUWVBFICAgICAyICAgICAyICAgICA0ICAgICAgOAorICogIE9WU19LRVlfQVRUUl9JUFY2ICAgICAgICAgNDAgICAgLS0gICAgIDQgICAgIDQ0CisgKiAgT1ZTX0tFWV9BVFRSX0lDTVBWNiAgICAgICAgMiAgICAgMiAgICAgNCAgICAgIDgKKyAqICBPVlNfS0VZX0FUVFJfTkQgICAgICAgICAgIDI4ICAgIC0tICAgICA0ICAgICAzMgorICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICB0b3RhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMgorICovCisjZGVmaW5lIEZMT1dfQlVGU0laRSAxMzIKKworaW50IG92c19mbG93X3RvX25sYXR0cnMoY29uc3Qgc3RydWN0IHN3X2Zsb3dfa2V5ICosIHN0cnVjdCBza19idWZmICopOworaW50IG92c19mbG93X2Zyb21fbmxhdHRycyhzdHJ1Y3Qgc3dfZmxvd19rZXkgKnN3a2V5LCBpbnQgKmtleV9sZW5wLAorCQkgICAgICBjb25zdCBzdHJ1Y3QgbmxhdHRyICopOworaW50IG92c19mbG93X21ldGFkYXRhX2Zyb21fbmxhdHRycyh1MzIgKnByaW9yaXR5LCB1MTYgKmluX3BvcnQsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5sYXR0ciAqKTsKKworI2RlZmluZSBUQkxfTUlOX0JVQ0tFVFMJCTEwMjQKKworc3RydWN0IGZsb3dfdGFibGUgeworCXN0cnVjdCBmbGV4X2FycmF5ICpidWNrZXRzOworCXVuc2lnbmVkIGludCBjb3VudCwgbl9idWNrZXRzOworCXN0cnVjdCByY3VfaGVhZCByY3U7CisJaW50IG5vZGVfdmVyOworCXUzMiBoYXNoX3NlZWQ7CisJYm9vbCBrZWVwX2Zsb3dzOworfTsKKworc3RhdGljIGlubGluZSBpbnQgb3ZzX2Zsb3dfdGJsX2NvdW50KHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSkKK3sKKwlyZXR1cm4gdGFibGUtPmNvdW50OworfQorCitzdGF0aWMgaW5saW5lIGludCBvdnNfZmxvd190YmxfbmVlZF90b19leHBhbmQoc3RydWN0IGZsb3dfdGFibGUgKnRhYmxlKQoreworCXJldHVybiAodGFibGUtPmNvdW50ID4gdGFibGUtPm5fYnVja2V0cyk7Cit9CisKK3N0cnVjdCBzd19mbG93ICpvdnNfZmxvd190YmxfbG9va3VwKHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSwKKwkJCQkgICAgc3RydWN0IHN3X2Zsb3dfa2V5ICprZXksIGludCBsZW4pOwordm9pZCBvdnNfZmxvd190YmxfZGVzdHJveShzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGUpOwordm9pZCBvdnNfZmxvd190YmxfZGVmZXJyZWRfZGVzdHJveShzdHJ1Y3QgZmxvd190YWJsZSAqdGFibGUpOworc3RydWN0IGZsb3dfdGFibGUgKm92c19mbG93X3RibF9hbGxvYyhpbnQgbmV3X3NpemUpOworc3RydWN0IGZsb3dfdGFibGUgKm92c19mbG93X3RibF9leHBhbmQoc3RydWN0IGZsb3dfdGFibGUgKnRhYmxlKTsKK3N0cnVjdCBmbG93X3RhYmxlICpvdnNfZmxvd190YmxfcmVoYXNoKHN0cnVjdCBmbG93X3RhYmxlICp0YWJsZSk7Cit2b2lkIG92c19mbG93X3RibF9pbnNlcnQoc3RydWN0IGZsb3dfdGFibGUgKnRhYmxlLCBzdHJ1Y3Qgc3dfZmxvdyAqZmxvdyk7Cit2b2lkIG92c19mbG93X3RibF9yZW1vdmUoc3RydWN0IGZsb3dfdGFibGUgKnRhYmxlLCBzdHJ1Y3Qgc3dfZmxvdyAqZmxvdyk7Cit1MzIgb3ZzX2Zsb3dfaGFzaChjb25zdCBzdHJ1Y3Qgc3dfZmxvd19rZXkgKmtleSwgaW50IGtleV9sZW4pOworCitzdHJ1Y3Qgc3dfZmxvdyAqb3ZzX2Zsb3dfdGJsX25leHQoc3RydWN0IGZsb3dfdGFibGUgKnRhYmxlLCB1MzIgKmJ1Y2tldCwgdTMyICppZHgpOworZXh0ZXJuIGNvbnN0IGludCBvdnNfa2V5X2xlbnNbT1ZTX0tFWV9BVFRSX01BWCArIDFdOworCisjZW5kaWYgLyogZmxvdy5oICovCmRpZmYgLS1naXQgYS9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtaW50ZXJuYWxfZGV2LmMgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtaW50ZXJuYWxfZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjMjhiOAotLS0gL2Rldi9udWxsCisrKyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC1pbnRlcm5hbF9kZXYuYwpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDExIE5pY2lyYSBOZXR3b3Jrcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICovCisKKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaWZfdmxhbi5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKworI2luY2x1ZGUgImRhdGFwYXRoLmgiCisjaW5jbHVkZSAidnBvcnQtaW50ZXJuYWxfZGV2LmgiCisjaW5jbHVkZSAidnBvcnQtbmV0ZGV2LmgiCisKK3N0cnVjdCBpbnRlcm5hbF9kZXYgeworCXN0cnVjdCB2cG9ydCAqdnBvcnQ7Cit9OworCitzdGF0aWMgc3RydWN0IGludGVybmFsX2RldiAqaW50ZXJuYWxfZGV2X3ByaXYoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldikKK3sKKwlyZXR1cm4gbmV0ZGV2X3ByaXYobmV0ZGV2KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBieSB0aGUga2VybmVsIG5ldHdvcmsgbGF5ZXIuKi8KK3N0YXRpYyBzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKmludGVybmFsX2Rldl9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkJCQlzdHJ1Y3QgcnRubF9saW5rX3N0YXRzNjQgKnN0YXRzKQoreworCXN0cnVjdCB2cG9ydCAqdnBvcnQgPSBvdnNfaW50ZXJuYWxfZGV2X2dldF92cG9ydChuZXRkZXYpOworCXN0cnVjdCBvdnNfdnBvcnRfc3RhdHMgdnBvcnRfc3RhdHM7CisKKwlvdnNfdnBvcnRfZ2V0X3N0YXRzKHZwb3J0LCAmdnBvcnRfc3RhdHMpOworCisJLyogVGhlIHR4IGFuZCByeCBzdGF0cyBuZWVkIHRvIGJlIHN3YXBwZWQgYmVjYXVzZSB0aGUKKwkgKiBzd2l0Y2ggYW5kIGhvc3QgT1MgaGF2ZSBvcHBvc2l0ZSBwZXJzcGVjdGl2ZXMuICovCisJc3RhdHMtPnJ4X3BhY2tldHMJPSB2cG9ydF9zdGF0cy50eF9wYWNrZXRzOworCXN0YXRzLT50eF9wYWNrZXRzCT0gdnBvcnRfc3RhdHMucnhfcGFja2V0czsKKwlzdGF0cy0+cnhfYnl0ZXMJCT0gdnBvcnRfc3RhdHMudHhfYnl0ZXM7CisJc3RhdHMtPnR4X2J5dGVzCQk9IHZwb3J0X3N0YXRzLnJ4X2J5dGVzOworCXN0YXRzLT5yeF9lcnJvcnMJPSB2cG9ydF9zdGF0cy50eF9lcnJvcnM7CisJc3RhdHMtPnR4X2Vycm9ycwk9IHZwb3J0X3N0YXRzLnJ4X2Vycm9yczsKKwlzdGF0cy0+cnhfZHJvcHBlZAk9IHZwb3J0X3N0YXRzLnR4X2Ryb3BwZWQ7CisJc3RhdHMtPnR4X2Ryb3BwZWQJPSB2cG9ydF9zdGF0cy5yeF9kcm9wcGVkOworCisJcmV0dXJuIHN0YXRzOworfQorCitzdGF0aWMgaW50IGludGVybmFsX2Rldl9tYWNfYWRkcihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB2b2lkICpwKQoreworCXN0cnVjdCBzb2NrYWRkciAqYWRkciA9IHA7CisKKwlpZiAoIWlzX3ZhbGlkX2V0aGVyX2FkZHIoYWRkci0+c2FfZGF0YSkpCisJCXJldHVybiAtRUFERFJOT1RBVkFJTDsKKwltZW1jcHkoZGV2LT5kZXZfYWRkciwgYWRkci0+c2FfZGF0YSwgZGV2LT5hZGRyX2xlbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2tfYmguICovCitzdGF0aWMgaW50IGludGVybmFsX2Rldl94bWl0KHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJcmN1X3JlYWRfbG9jaygpOworCW92c192cG9ydF9yZWNlaXZlKGludGVybmFsX2Rldl9wcml2KG5ldGRldiktPnZwb3J0LCBza2IpOworCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGludGVybmFsX2Rldl9vcGVuKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBpbnRlcm5hbF9kZXZfc3RvcChzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCW5ldGlmX3N0b3BfcXVldWUobmV0ZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW50ZXJuYWxfZGV2X2dldGluZm8oc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwKKwkJCQkgc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyAqaW5mbykKK3sKKwlzdHJjcHkoaW5mby0+ZHJpdmVyLCAib3BlbnZzd2l0Y2giKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBldGh0b29sX29wcyBpbnRlcm5hbF9kZXZfZXRodG9vbF9vcHMgPSB7CisJLmdldF9kcnZpbmZvCT0gaW50ZXJuYWxfZGV2X2dldGluZm8sCisJLmdldF9saW5rCT0gZXRodG9vbF9vcF9nZXRfbGluaywKK307CisKK3N0YXRpYyBpbnQgaW50ZXJuYWxfZGV2X2NoYW5nZV9tdHUoc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldiwgaW50IG5ld19tdHUpCit7CisJaWYgKG5ld19tdHUgPCA2OCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwluZXRkZXYtPm10dSA9IG5ld19tdHU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGludGVybmFsX2Rldl9kZXN0cnVjdG9yKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHZwb3J0ICp2cG9ydCA9IG92c19pbnRlcm5hbF9kZXZfZ2V0X3Zwb3J0KGRldik7CisKKwlvdnNfdnBvcnRfZnJlZSh2cG9ydCk7CisJZnJlZV9uZXRkZXYoZGV2KTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBuZXRfZGV2aWNlX29wcyBpbnRlcm5hbF9kZXZfbmV0ZGV2X29wcyA9IHsKKwkubmRvX29wZW4gPSBpbnRlcm5hbF9kZXZfb3BlbiwKKwkubmRvX3N0b3AgPSBpbnRlcm5hbF9kZXZfc3RvcCwKKwkubmRvX3N0YXJ0X3htaXQgPSBpbnRlcm5hbF9kZXZfeG1pdCwKKwkubmRvX3NldF9tYWNfYWRkcmVzcyA9IGludGVybmFsX2Rldl9tYWNfYWRkciwKKwkubmRvX2NoYW5nZV9tdHUgPSBpbnRlcm5hbF9kZXZfY2hhbmdlX210dSwKKwkubmRvX2dldF9zdGF0czY0ID0gaW50ZXJuYWxfZGV2X2dldF9zdGF0cywKK307CisKK3N0YXRpYyB2b2lkIGRvX3NldHVwKHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJZXRoZXJfc2V0dXAobmV0ZGV2KTsKKworCW5ldGRldi0+bmV0ZGV2X29wcyA9ICZpbnRlcm5hbF9kZXZfbmV0ZGV2X29wczsKKworCW5ldGRldi0+cHJpdl9mbGFncyAmPSB+SUZGX1RYX1NLQl9TSEFSSU5HOworCW5ldGRldi0+ZGVzdHJ1Y3RvciA9IGludGVybmFsX2Rldl9kZXN0cnVjdG9yOworCVNFVF9FVEhUT09MX09QUyhuZXRkZXYsICZpbnRlcm5hbF9kZXZfZXRodG9vbF9vcHMpOworCW5ldGRldi0+dHhfcXVldWVfbGVuID0gMDsKKworCW5ldGRldi0+ZmVhdHVyZXMgPSBORVRJRl9GX0xMVFggfCBORVRJRl9GX1NHIHwgTkVUSUZfRl9GUkFHTElTVCB8CisJCQkJTkVUSUZfRl9ISUdIRE1BIHwgTkVUSUZfRl9IV19DU1VNIHwgTkVUSUZfRl9UU087CisKKwluZXRkZXYtPnZsYW5fZmVhdHVyZXMgPSBuZXRkZXYtPmZlYXR1cmVzOworCW5ldGRldi0+ZmVhdHVyZXMgfD0gTkVUSUZfRl9IV19WTEFOX1RYOworCW5ldGRldi0+aHdfZmVhdHVyZXMgPSBuZXRkZXYtPmZlYXR1cmVzICYgfk5FVElGX0ZfTExUWDsKKwlyYW5kb21fZXRoZXJfYWRkcihuZXRkZXYtPmRldl9hZGRyKTsKK30KKworc3RhdGljIHN0cnVjdCB2cG9ydCAqaW50ZXJuYWxfZGV2X2NyZWF0ZShjb25zdCBzdHJ1Y3QgdnBvcnRfcGFybXMgKnBhcm1zKQoreworCXN0cnVjdCB2cG9ydCAqdnBvcnQ7CisJc3RydWN0IG5ldGRldl92cG9ydCAqbmV0ZGV2X3Zwb3J0OworCXN0cnVjdCBpbnRlcm5hbF9kZXYgKmludGVybmFsX2RldjsKKwlpbnQgZXJyOworCisJdnBvcnQgPSBvdnNfdnBvcnRfYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRkZXZfdnBvcnQpLAorCQkJCSZvdnNfaW50ZXJuYWxfdnBvcnRfb3BzLCBwYXJtcyk7CisJaWYgKElTX0VSUih2cG9ydCkpIHsKKwkJZXJyID0gUFRSX0VSUih2cG9ydCk7CisJCWdvdG8gZXJyb3I7CisJfQorCisJbmV0ZGV2X3Zwb3J0ID0gbmV0ZGV2X3Zwb3J0X3ByaXYodnBvcnQpOworCisJbmV0ZGV2X3Zwb3J0LT5kZXYgPSBhbGxvY19uZXRkZXYoc2l6ZW9mKHN0cnVjdCBpbnRlcm5hbF9kZXYpLAorCQkJCQkgcGFybXMtPm5hbWUsIGRvX3NldHVwKTsKKwlpZiAoIW5ldGRldl92cG9ydC0+ZGV2KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3JfZnJlZV92cG9ydDsKKwl9CisKKwlpbnRlcm5hbF9kZXYgPSBpbnRlcm5hbF9kZXZfcHJpdihuZXRkZXZfdnBvcnQtPmRldik7CisJaW50ZXJuYWxfZGV2LT52cG9ydCA9IHZwb3J0OworCisJZXJyID0gcmVnaXN0ZXJfbmV0ZGV2aWNlKG5ldGRldl92cG9ydC0+ZGV2KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX2ZyZWVfbmV0ZGV2OworCisJZGV2X3NldF9wcm9taXNjdWl0eShuZXRkZXZfdnBvcnQtPmRldiwgMSk7CisJbmV0aWZfc3RhcnRfcXVldWUobmV0ZGV2X3Zwb3J0LT5kZXYpOworCisJcmV0dXJuIHZwb3J0OworCitlcnJvcl9mcmVlX25ldGRldjoKKwlmcmVlX25ldGRldihuZXRkZXZfdnBvcnQtPmRldik7CitlcnJvcl9mcmVlX3Zwb3J0OgorCW92c192cG9ydF9mcmVlKHZwb3J0KTsKK2Vycm9yOgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyB2b2lkIGludGVybmFsX2Rldl9kZXN0cm95KHN0cnVjdCB2cG9ydCAqdnBvcnQpCit7CisJc3RydWN0IG5ldGRldl92cG9ydCAqbmV0ZGV2X3Zwb3J0ID0gbmV0ZGV2X3Zwb3J0X3ByaXYodnBvcnQpOworCisJbmV0aWZfc3RvcF9xdWV1ZShuZXRkZXZfdnBvcnQtPmRldik7CisJZGV2X3NldF9wcm9taXNjdWl0eShuZXRkZXZfdnBvcnQtPmRldiwgLTEpOworCisJLyogdW5yZWdpc3Rlcl9uZXRkZXZpY2UoKSB3YWl0cyBmb3IgYW4gUkNVIGdyYWNlIHBlcmlvZC4gKi8KKwl1bnJlZ2lzdGVyX25ldGRldmljZShuZXRkZXZfdnBvcnQtPmRldik7Cit9CisKK3N0YXRpYyBpbnQgaW50ZXJuYWxfZGV2X3JlY3Yoc3RydWN0IHZwb3J0ICp2cG9ydCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2ID0gbmV0ZGV2X3Zwb3J0X3ByaXYodnBvcnQpLT5kZXY7CisJaW50IGxlbjsKKworCWxlbiA9IHNrYi0+bGVuOworCXNrYi0+ZGV2ID0gbmV0ZGV2OworCXNrYi0+cGt0X3R5cGUgPSBQQUNLRVRfSE9TVDsKKwlza2ItPnByb3RvY29sID0gZXRoX3R5cGVfdHJhbnMoc2tiLCBuZXRkZXYpOworCisJbmV0aWZfcngoc2tiKTsKKworCXJldHVybiBsZW47Cit9CisKK2NvbnN0IHN0cnVjdCB2cG9ydF9vcHMgb3ZzX2ludGVybmFsX3Zwb3J0X29wcyA9IHsKKwkudHlwZQkJPSBPVlNfVlBPUlRfVFlQRV9JTlRFUk5BTCwKKwkuY3JlYXRlCQk9IGludGVybmFsX2Rldl9jcmVhdGUsCisJLmRlc3Ryb3kJPSBpbnRlcm5hbF9kZXZfZGVzdHJveSwKKwkuZ2V0X25hbWUJPSBvdnNfbmV0ZGV2X2dldF9uYW1lLAorCS5nZXRfaWZpbmRleAk9IG92c19uZXRkZXZfZ2V0X2lmaW5kZXgsCisJLnNlbmQJCT0gaW50ZXJuYWxfZGV2X3JlY3YsCit9OworCitpbnQgb3ZzX2lzX2ludGVybmFsX2Rldihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2KQoreworCXJldHVybiBuZXRkZXYtPm5ldGRldl9vcHMgPT0gJmludGVybmFsX2Rldl9uZXRkZXZfb3BzOworfQorCitzdHJ1Y3QgdnBvcnQgKm92c19pbnRlcm5hbF9kZXZfZ2V0X3Zwb3J0KHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYpCit7CisJaWYgKCFvdnNfaXNfaW50ZXJuYWxfZGV2KG5ldGRldikpCisJCXJldHVybiBOVUxMOworCisJcmV0dXJuIGludGVybmFsX2Rldl9wcml2KG5ldGRldiktPnZwb3J0OworfQpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWludGVybmFsX2Rldi5oIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LWludGVybmFsX2Rldi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTQ0NDcKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtaW50ZXJuYWxfZGV2LmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNy0yMDExIE5pY2lyYSBOZXR3b3Jrcy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKKyAqIDAyMTEwLTEzMDEsIFVTQQorICovCisKKyNpZm5kZWYgVlBPUlRfSU5URVJOQUxfREVWX0gKKyNkZWZpbmUgVlBPUlRfSU5URVJOQUxfREVWX0ggMQorCisjaW5jbHVkZSAiZGF0YXBhdGguaCIKKyNpbmNsdWRlICJ2cG9ydC5oIgorCitpbnQgb3ZzX2lzX2ludGVybmFsX2Rldihjb25zdCBzdHJ1Y3QgbmV0X2RldmljZSAqKTsKK3N0cnVjdCB2cG9ydCAqb3ZzX2ludGVybmFsX2Rldl9nZXRfdnBvcnQoc3RydWN0IG5ldF9kZXZpY2UgKik7CisKKyNlbmRpZiAvKiB2cG9ydC1pbnRlcm5hbF9kZXYuaCAqLwpkaWZmIC0tZ2l0IGEvbmV0L29wZW52c3dpdGNoL3Zwb3J0LW5ldGRldi5jIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LW5ldGRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMDY4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXQvb3BlbnZzd2l0Y2gvdnBvcnQtbmV0ZGV2LmMKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMSBOaWNpcmEgTmV0d29ya3MuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqLworCisjZGVmaW5lIHByX2ZtdChmbXQpIEtCVUlMRF9NT0ROQU1FICI6ICIgZm10CisKKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9icmlkZ2UuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGxjLmg+CisjaW5jbHVkZSA8bGludXgvcnRuZXRsaW5rLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisKKyNpbmNsdWRlIDxuZXQvbGxjLmg+CisKKyNpbmNsdWRlICJkYXRhcGF0aC5oIgorI2luY2x1ZGUgInZwb3J0LWludGVybmFsX2Rldi5oIgorI2luY2x1ZGUgInZwb3J0LW5ldGRldi5oIgorCisvKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2suICovCitzdGF0aWMgdm9pZCBuZXRkZXZfcG9ydF9yZWNlaXZlKHN0cnVjdCB2cG9ydCAqdnBvcnQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJaWYgKHVubGlrZWx5KCF2cG9ydCkpIHsKKwkJa2ZyZWVfc2tiKHNrYik7CisJCXJldHVybjsKKwl9CisKKwkvKiBNYWtlIG91ciBvd24gY29weSBvZiB0aGUgcGFja2V0LiAgT3RoZXJ3aXNlIHdlIHdpbGwgbWFuZ2xlIHRoZQorCSAqIHBhY2tldCBmb3IgYW55b25lIHdobyBjYW1lIGJlZm9yZSB1cyAoZS5nLiB0Y3BkdW1wIHZpYSBBRl9QQUNLRVQpLgorCSAqIChObyBvbmUgY29tZXMgYWZ0ZXIgdXMsIHNpbmNlIHdlIHRlbGwgaGFuZGxlX2JyaWRnZSgpIHRoYXQgd2UgdG9vaworCSAqIHRoZSBwYWNrZXQuKSAqLworCXNrYiA9IHNrYl9zaGFyZV9jaGVjayhza2IsIEdGUF9BVE9NSUMpOworCWlmICh1bmxpa2VseSghc2tiKSkKKwkJcmV0dXJuOworCisJc2tiX3B1c2goc2tiLCBFVEhfSExFTik7CisJb3ZzX3Zwb3J0X3JlY2VpdmUodnBvcnQsIHNrYik7Cit9CisKKy8qIENhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2sgYW5kIGJvdHRvbS1oYWx2ZXMgZGlzYWJsZWQuICovCitzdGF0aWMgcnhfaGFuZGxlcl9yZXN1bHRfdCBuZXRkZXZfZnJhbWVfaG9vayhzdHJ1Y3Qgc2tfYnVmZiAqKnBza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYiA9ICpwc2tiOworCXN0cnVjdCB2cG9ydCAqdnBvcnQ7CisKKwlpZiAodW5saWtlbHkoc2tiLT5wa3RfdHlwZSA9PSBQQUNLRVRfTE9PUEJBQ0spKQorCQlyZXR1cm4gUlhfSEFORExFUl9QQVNTOworCisJdnBvcnQgPSBvdnNfbmV0ZGV2X2dldF92cG9ydChza2ItPmRldik7CisKKwluZXRkZXZfcG9ydF9yZWNlaXZlKHZwb3J0LCBza2IpOworCisJcmV0dXJuIFJYX0hBTkRMRVJfQ09OU1VNRUQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdnBvcnQgKm5ldGRldl9jcmVhdGUoY29uc3Qgc3RydWN0IHZwb3J0X3Bhcm1zICpwYXJtcykKK3sKKwlzdHJ1Y3QgdnBvcnQgKnZwb3J0OworCXN0cnVjdCBuZXRkZXZfdnBvcnQgKm5ldGRldl92cG9ydDsKKwlpbnQgZXJyOworCisJdnBvcnQgPSBvdnNfdnBvcnRfYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZXRkZXZfdnBvcnQpLAorCQkJCSZvdnNfbmV0ZGV2X3Zwb3J0X29wcywgcGFybXMpOworCWlmIChJU19FUlIodnBvcnQpKSB7CisJCWVyciA9IFBUUl9FUlIodnBvcnQpOworCQlnb3RvIGVycm9yOworCX0KKworCW5ldGRldl92cG9ydCA9IG5ldGRldl92cG9ydF9wcml2KHZwb3J0KTsKKworCW5ldGRldl92cG9ydC0+ZGV2ID0gZGV2X2dldF9ieV9uYW1lKCZpbml0X25ldCwgcGFybXMtPm5hbWUpOworCWlmICghbmV0ZGV2X3Zwb3J0LT5kZXYpIHsKKwkJZXJyID0gLUVOT0RFVjsKKwkJZ290byBlcnJvcl9mcmVlX3Zwb3J0OworCX0KKworCWlmIChuZXRkZXZfdnBvcnQtPmRldi0+ZmxhZ3MgJiBJRkZfTE9PUEJBQ0sgfHwKKwkgICAgbmV0ZGV2X3Zwb3J0LT5kZXYtPnR5cGUgIT0gQVJQSFJEX0VUSEVSIHx8CisJICAgIG92c19pc19pbnRlcm5hbF9kZXYobmV0ZGV2X3Zwb3J0LT5kZXYpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gZXJyb3JfcHV0OworCX0KKworCWVyciA9IG5ldGRldl9yeF9oYW5kbGVyX3JlZ2lzdGVyKG5ldGRldl92cG9ydC0+ZGV2LCBuZXRkZXZfZnJhbWVfaG9vaywKKwkJCQkJIHZwb3J0KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycm9yX3B1dDsKKworCWRldl9zZXRfcHJvbWlzY3VpdHkobmV0ZGV2X3Zwb3J0LT5kZXYsIDEpOworCW5ldGRldl92cG9ydC0+ZGV2LT5wcml2X2ZsYWdzIHw9IElGRl9PVlNfREFUQVBBVEg7CisKKwlyZXR1cm4gdnBvcnQ7CisKK2Vycm9yX3B1dDoKKwlkZXZfcHV0KG5ldGRldl92cG9ydC0+ZGV2KTsKK2Vycm9yX2ZyZWVfdnBvcnQ6CisJb3ZzX3Zwb3J0X2ZyZWUodnBvcnQpOworZXJyb3I6CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIHZvaWQgbmV0ZGV2X2Rlc3Ryb3koc3RydWN0IHZwb3J0ICp2cG9ydCkKK3sKKwlzdHJ1Y3QgbmV0ZGV2X3Zwb3J0ICpuZXRkZXZfdnBvcnQgPSBuZXRkZXZfdnBvcnRfcHJpdih2cG9ydCk7CisKKwluZXRkZXZfdnBvcnQtPmRldi0+cHJpdl9mbGFncyAmPSB+SUZGX09WU19EQVRBUEFUSDsKKwluZXRkZXZfcnhfaGFuZGxlcl91bnJlZ2lzdGVyKG5ldGRldl92cG9ydC0+ZGV2KTsKKwlkZXZfc2V0X3Byb21pc2N1aXR5KG5ldGRldl92cG9ydC0+ZGV2LCAtMSk7CisKKwlzeW5jaHJvbml6ZV9yY3UoKTsKKworCWRldl9wdXQobmV0ZGV2X3Zwb3J0LT5kZXYpOworCW92c192cG9ydF9mcmVlKHZwb3J0KTsKK30KKworY29uc3QgY2hhciAqb3ZzX25ldGRldl9nZXRfbmFtZShjb25zdCBzdHJ1Y3QgdnBvcnQgKnZwb3J0KQoreworCWNvbnN0IHN0cnVjdCBuZXRkZXZfdnBvcnQgKm5ldGRldl92cG9ydCA9IG5ldGRldl92cG9ydF9wcml2KHZwb3J0KTsKKwlyZXR1cm4gbmV0ZGV2X3Zwb3J0LT5kZXYtPm5hbWU7Cit9CisKK2ludCBvdnNfbmV0ZGV2X2dldF9pZmluZGV4KGNvbnN0IHN0cnVjdCB2cG9ydCAqdnBvcnQpCit7CisJY29uc3Qgc3RydWN0IG5ldGRldl92cG9ydCAqbmV0ZGV2X3Zwb3J0ID0gbmV0ZGV2X3Zwb3J0X3ByaXYodnBvcnQpOworCXJldHVybiBuZXRkZXZfdnBvcnQtPmRldi0+aWZpbmRleDsKK30KKworc3RhdGljIHVuc2lnbmVkIHBhY2tldF9sZW5ndGgoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwl1bnNpZ25lZCBsZW5ndGggPSBza2ItPmxlbiAtIEVUSF9ITEVOOworCisJaWYgKHNrYi0+cHJvdG9jb2wgPT0gaHRvbnMoRVRIX1BfODAyMVEpKQorCQlsZW5ndGggLT0gVkxBTl9ITEVOOworCisJcmV0dXJuIGxlbmd0aDsKK30KKworc3RhdGljIGludCBuZXRkZXZfc2VuZChzdHJ1Y3QgdnBvcnQgKnZwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBuZXRkZXZfdnBvcnQgKm5ldGRldl92cG9ydCA9IG5ldGRldl92cG9ydF9wcml2KHZwb3J0KTsKKwlpbnQgbXR1ID0gbmV0ZGV2X3Zwb3J0LT5kZXYtPm10dTsKKwlpbnQgbGVuOworCisJaWYgKHVubGlrZWx5KHBhY2tldF9sZW5ndGgoc2tiKSA+IG10dSAmJiAhc2tiX2lzX2dzbyhza2IpKSkgeworCQlpZiAobmV0X3JhdGVsaW1pdCgpKQorCQkJcHJfd2FybigiJXM6IGRyb3BwZWQgb3Zlci1tdHUgcGFja2V0OiAlZCA+ICVkXG4iLAorCQkJCW92c19kcF9uYW1lKHZwb3J0LT5kcCksIHBhY2tldF9sZW5ndGgoc2tiKSwgbXR1KTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwlpZiAodW5saWtlbHkoc2tiX3dhcm5faWZfbHJvKHNrYikpKQorCQlnb3RvIGVycm9yOworCisJc2tiLT5kZXYgPSBuZXRkZXZfdnBvcnQtPmRldjsKKwlsZW4gPSBza2ItPmxlbjsKKwlkZXZfcXVldWVfeG1pdChza2IpOworCisJcmV0dXJuIGxlbjsKKworZXJyb3I6CisJa2ZyZWVfc2tiKHNrYik7CisJb3ZzX3Zwb3J0X3JlY29yZF9lcnJvcih2cG9ydCwgVlBPUlRfRV9UWF9EUk9QUEVEKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJucyBudWxsIGlmIHRoaXMgZGV2aWNlIGlzIG5vdCBhdHRhY2hlZCB0byBhIGRhdGFwYXRoLiAqLworc3RydWN0IHZwb3J0ICpvdnNfbmV0ZGV2X2dldF92cG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQoreworCWlmIChsaWtlbHkoZGV2LT5wcml2X2ZsYWdzICYgSUZGX09WU19EQVRBUEFUSCkpCisJCXJldHVybiAoc3RydWN0IHZwb3J0ICopCisJCQlyY3VfZGVyZWZlcmVuY2VfcnRubChkZXYtPnJ4X2hhbmRsZXJfZGF0YSk7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworY29uc3Qgc3RydWN0IHZwb3J0X29wcyBvdnNfbmV0ZGV2X3Zwb3J0X29wcyA9IHsKKwkudHlwZQkJPSBPVlNfVlBPUlRfVFlQRV9ORVRERVYsCisJLmNyZWF0ZQkJPSBuZXRkZXZfY3JlYXRlLAorCS5kZXN0cm95CT0gbmV0ZGV2X2Rlc3Ryb3ksCisJLmdldF9uYW1lCT0gb3ZzX25ldGRldl9nZXRfbmFtZSwKKwkuZ2V0X2lmaW5kZXgJPSBvdnNfbmV0ZGV2X2dldF9pZmluZGV4LAorCS5zZW5kCQk9IG5ldGRldl9zZW5kLAorfTsKZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC92cG9ydC1uZXRkZXYuaCBiL25ldC9vcGVudnN3aXRjaC92cG9ydC1uZXRkZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDliMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LW5ldGRldi5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDctMjAxMSBOaWNpcmEgTmV0d29ya3MuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB2ZXJzaW9uIDIgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BCisgKiAwMjExMC0xMzAxLCBVU0EKKyAqLworCisjaWZuZGVmIFZQT1JUX05FVERFVl9ICisjZGVmaW5lIFZQT1JUX05FVERFVl9IIDEKKworI2luY2x1ZGUgPGxpbnV4L25ldGRldmljZS5oPgorCisjaW5jbHVkZSAidnBvcnQuaCIKKworc3RydWN0IHZwb3J0ICpvdnNfbmV0ZGV2X2dldF92cG9ydChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KTsKKworc3RydWN0IG5ldGRldl92cG9ydCB7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKK307CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IG5ldGRldl92cG9ydCAqCituZXRkZXZfdnBvcnRfcHJpdihjb25zdCBzdHJ1Y3QgdnBvcnQgKnZwb3J0KQoreworCXJldHVybiB2cG9ydF9wcml2KHZwb3J0KTsKK30KKworY29uc3QgY2hhciAqb3ZzX25ldGRldl9nZXRfbmFtZShjb25zdCBzdHJ1Y3QgdnBvcnQgKik7Citjb25zdCBjaGFyICpvdnNfbmV0ZGV2X2dldF9jb25maWcoY29uc3Qgc3RydWN0IHZwb3J0ICopOworaW50IG92c19uZXRkZXZfZ2V0X2lmaW5kZXgoY29uc3Qgc3RydWN0IHZwb3J0ICopOworCisjZW5kaWYgLyogdnBvcnRfbmV0ZGV2LmggKi8KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC92cG9ydC5jIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YwZWYzNwotLS0gL2Rldi9udWxsCisrKyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC5jCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTEgTmljaXJhIE5ldHdvcmtzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L2V0aGVyZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl92bGFuLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpbmNsdWRlICJ2cG9ydC5oIgorI2luY2x1ZGUgInZwb3J0LWludGVybmFsX2Rldi5oIgorCisvKiBMaXN0IG9mIHN0YXRpY2FsbHkgY29tcGlsZWQgdnBvcnQgaW1wbGVtZW50YXRpb25zLiAgRG9uJ3QgZm9yZ2V0IHRvIGFsc28KKyAqIGFkZCB5b3VycyB0byB0aGUgbGlzdCBhdCB0aGUgYm90dG9tIG9mIHZwb3J0LmguICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHZwb3J0X29wcyAqdnBvcnRfb3BzX2xpc3RbXSA9IHsKKwkmb3ZzX25ldGRldl92cG9ydF9vcHMsCisJJm92c19pbnRlcm5hbF92cG9ydF9vcHMsCit9OworCisvKiBQcm90ZWN0ZWQgYnkgUkNVIHJlYWQgbG9jayBmb3IgcmVhZGluZywgUlROTCBsb2NrIGZvciB3cml0aW5nLiAqLworc3RhdGljIHN0cnVjdCBobGlzdF9oZWFkICpkZXZfdGFibGU7CisjZGVmaW5lIFZQT1JUX0hBU0hfQlVDS0VUUyAxMDI0CisKKy8qKgorICoJb3ZzX3Zwb3J0X2luaXQgLSBpbml0aWFsaXplIHZwb3J0IHN1YnN5c3RlbQorICoKKyAqIENhbGxlZCBhdCBtb2R1bGUgbG9hZCB0aW1lIHRvIGluaXRpYWxpemUgdGhlIHZwb3J0IHN1YnN5c3RlbS4KKyAqLworaW50IG92c192cG9ydF9pbml0KHZvaWQpCit7CisJZGV2X3RhYmxlID0ga3phbGxvYyhWUE9SVF9IQVNIX0JVQ0tFVFMgKiBzaXplb2Yoc3RydWN0IGhsaXN0X2hlYWQpLAorCQkJICAgIEdGUF9LRVJORUwpOworCWlmICghZGV2X3RhYmxlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCisvKioKKyAqCW92c192cG9ydF9leGl0IC0gc2h1dGRvd24gdnBvcnQgc3Vic3lzdGVtCisgKgorICogQ2FsbGVkIGF0IG1vZHVsZSBleGl0IHRpbWUgdG8gc2h1dGRvd24gdGhlIHZwb3J0IHN1YnN5c3RlbS4KKyAqLwordm9pZCBvdnNfdnBvcnRfZXhpdCh2b2lkKQoreworCWtmcmVlKGRldl90YWJsZSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCAqaGFzaF9idWNrZXQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaCA9IGZ1bGxfbmFtZV9oYXNoKG5hbWUsIHN0cmxlbihuYW1lKSk7CisJcmV0dXJuICZkZXZfdGFibGVbaGFzaCAmIChWUE9SVF9IQVNIX0JVQ0tFVFMgLSAxKV07Cit9CisKKy8qKgorICoJb3ZzX3Zwb3J0X2xvY2F0ZSAtIGZpbmQgYSBwb3J0IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkCisgKgorICogQG5hbWU6IG5hbWUgb2YgcG9ydCB0byBmaW5kCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBSVE5MIG9yIFJDVSByZWFkIGxvY2suCisgKi8KK3N0cnVjdCB2cG9ydCAqb3ZzX3Zwb3J0X2xvY2F0ZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBobGlzdF9oZWFkICpidWNrZXQgPSBoYXNoX2J1Y2tldChuYW1lKTsKKwlzdHJ1Y3QgdnBvcnQgKnZwb3J0OworCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHZwb3J0LCBub2RlLCBidWNrZXQsIGhhc2hfbm9kZSkKKwkJaWYgKCFzdHJjbXAobmFtZSwgdnBvcnQtPm9wcy0+Z2V0X25hbWUodnBvcnQpKSkKKwkJCXJldHVybiB2cG9ydDsKKworCXJldHVybiBOVUxMOworfQorCisvKioKKyAqCW92c192cG9ydF9hbGxvYyAtIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIG5ldyB2cG9ydAorICoKKyAqIEBwcml2X3NpemU6IFNpemUgb2YgcHJpdmF0ZSBkYXRhIGFyZWEgdG8gYWxsb2NhdGUuCisgKiBAb3BzOiB2cG9ydCBkZXZpY2Ugb3BzCisgKgorICogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBuZXcgdnBvcnQgZGVmaW5lZCBieSBAb3BzLiAgVGhlIHZwb3J0IHdpbGwgY29udGFpbgorICogYSBwcml2YXRlIGRhdGEgYXJlYSBvZiBzaXplIEBwcml2X3NpemUgdGhhdCBjYW4gYmUgYWNjZXNzZWQgdXNpbmcKKyAqIHZwb3J0X3ByaXYoKS4gIHZwb3J0cyB0aGF0IGFyZSBubyBsb25nZXIgbmVlZGVkIHNob3VsZCBiZSByZWxlYXNlZCB3aXRoCisgKiB2cG9ydF9mcmVlKCkuCisgKi8KK3N0cnVjdCB2cG9ydCAqb3ZzX3Zwb3J0X2FsbG9jKGludCBwcml2X3NpemUsIGNvbnN0IHN0cnVjdCB2cG9ydF9vcHMgKm9wcywKKwkJCSAgY29uc3Qgc3RydWN0IHZwb3J0X3Bhcm1zICpwYXJtcykKK3sKKwlzdHJ1Y3QgdnBvcnQgKnZwb3J0OworCXNpemVfdCBhbGxvY19zaXplOworCisJYWxsb2Nfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdnBvcnQpOworCWlmIChwcml2X3NpemUpIHsKKwkJYWxsb2Nfc2l6ZSA9IEFMSUdOKGFsbG9jX3NpemUsIFZQT1JUX0FMSUdOKTsKKwkJYWxsb2Nfc2l6ZSArPSBwcml2X3NpemU7CisJfQorCisJdnBvcnQgPSBremFsbG9jKGFsbG9jX3NpemUsIEdGUF9LRVJORUwpOworCWlmICghdnBvcnQpCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJdnBvcnQtPmRwID0gcGFybXMtPmRwOworCXZwb3J0LT5wb3J0X25vID0gcGFybXMtPnBvcnRfbm87CisJdnBvcnQtPnVwY2FsbF9waWQgPSBwYXJtcy0+dXBjYWxsX3BpZDsKKwl2cG9ydC0+b3BzID0gb3BzOworCisJdnBvcnQtPnBlcmNwdV9zdGF0cyA9IGFsbG9jX3BlcmNwdShzdHJ1Y3QgdnBvcnRfcGVyY3B1X3N0YXRzKTsKKwlpZiAoIXZwb3J0LT5wZXJjcHVfc3RhdHMpIHsKKwkJa2ZyZWUodnBvcnQpOworCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKwl9CisKKwlzcGluX2xvY2tfaW5pdCgmdnBvcnQtPnN0YXRzX2xvY2spOworCisJcmV0dXJuIHZwb3J0OworfQorCisvKioKKyAqCW92c192cG9ydF9mcmVlIC0gdW5pbml0aWFsaXplIGFuZCBmcmVlIHZwb3J0CisgKgorICogQHZwb3J0OiB2cG9ydCB0byBmcmVlCisgKgorICogRnJlZXMgYSB2cG9ydCBhbGxvY2F0ZWQgd2l0aCB2cG9ydF9hbGxvYygpIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgYW4gUkNVIGdyYWNlIHBlcmlvZCBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0CisgKiB0aW1lIEB2cG9ydCB3YXMgaW4gYSBkYXRhcGF0aC4KKyAqLwordm9pZCBvdnNfdnBvcnRfZnJlZShzdHJ1Y3QgdnBvcnQgKnZwb3J0KQoreworCWZyZWVfcGVyY3B1KHZwb3J0LT5wZXJjcHVfc3RhdHMpOworCWtmcmVlKHZwb3J0KTsKK30KKworLyoqCisgKglvdnNfdnBvcnRfYWRkIC0gYWRkIHZwb3J0IGRldmljZSAoZm9yIGtlcm5lbCBjYWxsZXJzKQorICoKKyAqIEBwYXJtczogSW5mb3JtYXRpb24gYWJvdXQgbmV3IHZwb3J0LgorICoKKyAqIENyZWF0ZXMgYSBuZXcgdnBvcnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gKHdoaWNoIGlzIGRlcGVuZGVudCBvbgorICogZGV2aWNlIHR5cGUpLiAgUlROTCBsb2NrIG11c3QgYmUgaGVsZC4KKyAqLworc3RydWN0IHZwb3J0ICpvdnNfdnBvcnRfYWRkKGNvbnN0IHN0cnVjdCB2cG9ydF9wYXJtcyAqcGFybXMpCit7CisJc3RydWN0IHZwb3J0ICp2cG9ydDsKKwlpbnQgZXJyID0gMDsKKwlpbnQgaTsKKworCUFTU0VSVF9SVE5MKCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh2cG9ydF9vcHNfbGlzdCk7IGkrKykgeworCQlpZiAodnBvcnRfb3BzX2xpc3RbaV0tPnR5cGUgPT0gcGFybXMtPnR5cGUpIHsKKwkJCXZwb3J0ID0gdnBvcnRfb3BzX2xpc3RbaV0tPmNyZWF0ZShwYXJtcyk7CisJCQlpZiAoSVNfRVJSKHZwb3J0KSkgeworCQkJCWVyciA9IFBUUl9FUlIodnBvcnQpOworCQkJCWdvdG8gb3V0OworCQkJfQorCisJCQlobGlzdF9hZGRfaGVhZF9yY3UoJnZwb3J0LT5oYXNoX25vZGUsCisJCQkJCSAgIGhhc2hfYnVja2V0KHZwb3J0LT5vcHMtPmdldF9uYW1lKHZwb3J0KSkpOworCQkJcmV0dXJuIHZwb3J0OworCQl9CisJfQorCisJZXJyID0gLUVBRk5PU1VQUE9SVDsKKworb3V0OgorCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKKy8qKgorICoJb3ZzX3Zwb3J0X3NldF9vcHRpb25zIC0gbW9kaWZ5IGV4aXN0aW5nIHZwb3J0IGRldmljZSAoZm9yIGtlcm5lbCBjYWxsZXJzKQorICoKKyAqIEB2cG9ydDogdnBvcnQgdG8gbW9kaWZ5LgorICogQHBvcnQ6IE5ldyBjb25maWd1cmF0aW9uLgorICoKKyAqIE1vZGlmaWVzIGFuIGV4aXN0aW5nIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgY29uZmlndXJhdGlvbiAod2hpY2ggaXMKKyAqIGRlcGVuZGVudCBvbiBkZXZpY2UgdHlwZSkuICBSVE5MIGxvY2sgbXVzdCBiZSBoZWxkLgorICovCitpbnQgb3ZzX3Zwb3J0X3NldF9vcHRpb25zKHN0cnVjdCB2cG9ydCAqdnBvcnQsIHN0cnVjdCBubGF0dHIgKm9wdGlvbnMpCit7CisJQVNTRVJUX1JUTkwoKTsKKworCWlmICghdnBvcnQtPm9wcy0+c2V0X29wdGlvbnMpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlyZXR1cm4gdnBvcnQtPm9wcy0+c2V0X29wdGlvbnModnBvcnQsIG9wdGlvbnMpOworfQorCisvKioKKyAqCW92c192cG9ydF9kZWwgLSBkZWxldGUgZXhpc3RpbmcgdnBvcnQgZGV2aWNlCisgKgorICogQHZwb3J0OiB2cG9ydCB0byBkZWxldGUuCisgKgorICogRGV0YWNoZXMgQHZwb3J0IGZyb20gaXRzIGRhdGFwYXRoIGFuZCBkZXN0cm95cyBpdC4gIEl0IGlzIHBvc3NpYmxlIHRvIGZhaWwKKyAqIGZvciByZWFzb25zIHN1Y2ggYXMgbGFjayBvZiBtZW1vcnkuICBSVE5MIGxvY2sgbXVzdCBiZSBoZWxkLgorICovCit2b2lkIG92c192cG9ydF9kZWwoc3RydWN0IHZwb3J0ICp2cG9ydCkKK3sKKwlBU1NFUlRfUlROTCgpOworCisJaGxpc3RfZGVsX3JjdSgmdnBvcnQtPmhhc2hfbm9kZSk7CisKKwl2cG9ydC0+b3BzLT5kZXN0cm95KHZwb3J0KTsKK30KKworLyoqCisgKglvdnNfdnBvcnRfZ2V0X3N0YXRzIC0gcmV0cmlldmUgZGV2aWNlIHN0YXRzCisgKgorICogQHZwb3J0OiB2cG9ydCBmcm9tIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBzdGF0cworICogQHN0YXRzOiBsb2NhdGlvbiB0byBzdG9yZSBzdGF0cworICoKKyAqIFJldHJpZXZlcyB0cmFuc21pdCwgcmVjZWl2ZSwgYW5kIGVycm9yIHN0YXRzIGZvciB0aGUgZ2l2ZW4gZGV2aWNlLgorICoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggUlROTCBsb2NrIG9yIHJjdV9yZWFkX2xvY2suCisgKi8KK3ZvaWQgb3ZzX3Zwb3J0X2dldF9zdGF0cyhzdHJ1Y3QgdnBvcnQgKnZwb3J0LCBzdHJ1Y3Qgb3ZzX3Zwb3J0X3N0YXRzICpzdGF0cykKK3sKKwlpbnQgaTsKKworCW1lbXNldChzdGF0cywgMCwgc2l6ZW9mKCpzdGF0cykpOworCisJLyogV2UgcG90ZW50aWFsbHkgaGF2ZSAyIHNvdXJjZXMgb2Ygc3RhdHMgdGhhdCBuZWVkIHRvIGJlIGNvbWJpbmVkOgorCSAqIHRob3NlIHdlIGhhdmUgY29sbGVjdGVkIChzcGxpdCBpbnRvIGVycl9zdGF0cyBhbmQgcGVyY3B1X3N0YXRzKSBmcm9tCisJICogc2V0X3N0YXRzKCkgYW5kIGRldmljZSBlcnJvciBzdGF0cyBmcm9tIG5ldGRldi0+Z2V0X3N0YXRzKCkgKGZvcgorCSAqIGVycm9ycyB0aGF0IGhhcHBlbiAgZG93bnN0cmVhbSBhbmQgdGhlcmVmb3JlIGFyZW4ndCByZXBvcnRlZCB0aHJvdWdoCisJICogb3VyIHZwb3J0X3JlY29yZF9lcnJvcigpIGZ1bmN0aW9uKS4KKwkgKiBTdGF0cyBmcm9tIGZpcnN0IHNvdXJjZSBhcmUgcmVwb3J0ZWQgYnkgb3ZzIChPVlNfVlBPUlRfQVRUUl9TVEFUUykuCisJICogbmV0ZGV2LXN0YXRzIGNhbiBiZSBkaXJlY3RseSByZWFkIG92ZXIgbmV0bGluay1pb2N0bC4KKwkgKi8KKworCXNwaW5fbG9ja19iaCgmdnBvcnQtPnN0YXRzX2xvY2spOworCisJc3RhdHMtPnJ4X2Vycm9ycwk9IHZwb3J0LT5lcnJfc3RhdHMucnhfZXJyb3JzOworCXN0YXRzLT50eF9lcnJvcnMJPSB2cG9ydC0+ZXJyX3N0YXRzLnR4X2Vycm9yczsKKwlzdGF0cy0+dHhfZHJvcHBlZAk9IHZwb3J0LT5lcnJfc3RhdHMudHhfZHJvcHBlZDsKKwlzdGF0cy0+cnhfZHJvcHBlZAk9IHZwb3J0LT5lcnJfc3RhdHMucnhfZHJvcHBlZDsKKworCXNwaW5fdW5sb2NrX2JoKCZ2cG9ydC0+c3RhdHNfbG9jayk7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQljb25zdCBzdHJ1Y3QgdnBvcnRfcGVyY3B1X3N0YXRzICpwZXJjcHVfc3RhdHM7CisJCXN0cnVjdCB2cG9ydF9wZXJjcHVfc3RhdHMgbG9jYWxfc3RhdHM7CisJCXVuc2lnbmVkIGludCBzdGFydDsKKworCQlwZXJjcHVfc3RhdHMgPSBwZXJfY3B1X3B0cih2cG9ydC0+cGVyY3B1X3N0YXRzLCBpKTsKKworCQlkbyB7CisJCQlzdGFydCA9IHU2NF9zdGF0c19mZXRjaF9iZWdpbl9iaCgmcGVyY3B1X3N0YXRzLT5zeW5jKTsKKwkJCWxvY2FsX3N0YXRzID0gKnBlcmNwdV9zdGF0czsKKwkJfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5X2JoKCZwZXJjcHVfc3RhdHMtPnN5bmMsIHN0YXJ0KSk7CisKKwkJc3RhdHMtPnJ4X2J5dGVzCQkrPSBsb2NhbF9zdGF0cy5yeF9ieXRlczsKKwkJc3RhdHMtPnJ4X3BhY2tldHMJKz0gbG9jYWxfc3RhdHMucnhfcGFja2V0czsKKwkJc3RhdHMtPnR4X2J5dGVzCQkrPSBsb2NhbF9zdGF0cy50eF9ieXRlczsKKwkJc3RhdHMtPnR4X3BhY2tldHMJKz0gbG9jYWxfc3RhdHMudHhfcGFja2V0czsKKwl9Cit9CisKKy8qKgorICoJb3ZzX3Zwb3J0X2dldF9vcHRpb25zIC0gcmV0cmlldmUgZGV2aWNlIG9wdGlvbnMKKyAqCisgKiBAdnBvcnQ6IHZwb3J0IGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIG9wdGlvbnMuCisgKiBAc2tiOiBza19idWZmIHdoZXJlIG9wdGlvbnMgc2hvdWxkIGJlIGFwcGVuZGVkLgorICoKKyAqIFJldHJpZXZlcyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZ2l2ZW4gZGV2aWNlLCBhcHBlbmRpbmcgYW4KKyAqICVPVlNfVlBPUlRfQVRUUl9PUFRJT05TIGF0dHJpYnV0ZSB0aGF0IGluIHR1cm4gY29udGFpbnMgbmVzdGVkCisgKiB2cG9ydC1zcGVjaWZpYyBhdHRyaWJ1dGVzIHRvIEBza2IuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWwsIC1FTVNHU0laRSBpZiBAc2tiIGhhcyBpbnN1ZmZpY2llbnQgcm9vbSwgb3IgYW5vdGhlcgorICogbmVnYXRpdmUgZXJyb3IgY29kZSBpZiBhIHJlYWwgZXJyb3Igb2NjdXJyZWQuICBJZiBhbiBlcnJvciBvY2N1cnMsIEBza2IgaXMKKyAqIGxlZnQgdW5tb2RpZmllZC4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIFJUTkwgbG9jayBvciByY3VfcmVhZF9sb2NrLgorICovCitpbnQgb3ZzX3Zwb3J0X2dldF9vcHRpb25zKGNvbnN0IHN0cnVjdCB2cG9ydCAqdnBvcnQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IG5sYXR0ciAqbmxhOworCisJbmxhID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBPVlNfVlBPUlRfQVRUUl9PUFRJT05TKTsKKwlpZiAoIW5sYSkKKwkJcmV0dXJuIC1FTVNHU0laRTsKKworCWlmICh2cG9ydC0+b3BzLT5nZXRfb3B0aW9ucykgeworCQlpbnQgZXJyID0gdnBvcnQtPm9wcy0+Z2V0X29wdGlvbnModnBvcnQsIHNrYik7CisJCWlmIChlcnIpIHsKKwkJCW5sYV9uZXN0X2NhbmNlbChza2IsIG5sYSk7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCisJbmxhX25lc3RfZW5kKHNrYiwgbmxhKTsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKglvdnNfdnBvcnRfcmVjZWl2ZSAtIHBhc3MgdXAgcmVjZWl2ZWQgcGFja2V0IHRvIHRoZSBkYXRhcGF0aCBmb3IgcHJvY2Vzc2luZworICoKKyAqIEB2cG9ydDogdnBvcnQgdGhhdCByZWNlaXZlZCB0aGUgcGFja2V0CisgKiBAc2tiOiBza2IgdGhhdCB3YXMgcmVjZWl2ZWQKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIHJjdV9yZWFkX2xvY2suICBUaGUgcGFja2V0IGNhbm5vdCBiZSBzaGFyZWQgYW5kCisgKiBza2ItPmRhdGEgc2hvdWxkIHBvaW50IHRvIHRoZSBFdGhlcm5ldCBoZWFkZXIuICBUaGUgY2FsbGVyIG11c3QgaGF2ZSBhbHJlYWR5CisgKiBjYWxsZWQgY29tcHV0ZV9pcF9zdW1tZWQoKSB0byBpbml0aWFsaXplIHRoZSBjaGVja3N1bW1pbmcgZmllbGRzLgorICovCit2b2lkIG92c192cG9ydF9yZWNlaXZlKHN0cnVjdCB2cG9ydCAqdnBvcnQsIHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IHZwb3J0X3BlcmNwdV9zdGF0cyAqc3RhdHM7CisKKwlzdGF0cyA9IHBlcl9jcHVfcHRyKHZwb3J0LT5wZXJjcHVfc3RhdHMsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwl1NjRfc3RhdHNfdXBkYXRlX2JlZ2luKCZzdGF0cy0+c3luYyk7CisJc3RhdHMtPnJ4X3BhY2tldHMrKzsKKwlzdGF0cy0+cnhfYnl0ZXMgKz0gc2tiLT5sZW47CisJdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnN0YXRzLT5zeW5jKTsKKworCW92c19kcF9wcm9jZXNzX3JlY2VpdmVkX3BhY2tldCh2cG9ydCwgc2tiKTsKK30KKworLyoqCisgKglvdnNfdnBvcnRfc2VuZCAtIHNlbmQgYSBwYWNrZXQgb24gYSBkZXZpY2UKKyAqCisgKiBAdnBvcnQ6IHZwb3J0IG9uIHdoaWNoIHRvIHNlbmQgdGhlIHBhY2tldAorICogQHNrYjogc2tiIHRvIHNlbmQKKyAqCisgKiBTZW5kcyB0aGUgZ2l2ZW4gcGFja2V0IGFuZCByZXR1cm5zIHRoZSBsZW5ndGggb2YgZGF0YSBzZW50LiAgRWl0aGVyIFJUTkwKKyAqIGxvY2sgb3IgcmN1X3JlYWRfbG9jayBtdXN0IGJlIGhlbGQuCisgKi8KK2ludCBvdnNfdnBvcnRfc2VuZChzdHJ1Y3QgdnBvcnQgKnZwb3J0LCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCWludCBzZW50ID0gdnBvcnQtPm9wcy0+c2VuZCh2cG9ydCwgc2tiKTsKKworCWlmIChsaWtlbHkoc2VudCkpIHsKKwkJc3RydWN0IHZwb3J0X3BlcmNwdV9zdGF0cyAqc3RhdHM7CisKKwkJc3RhdHMgPSBwZXJfY3B1X3B0cih2cG9ydC0+cGVyY3B1X3N0YXRzLCBzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJCXU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnN0YXRzLT5zeW5jKTsKKwkJc3RhdHMtPnR4X3BhY2tldHMrKzsKKwkJc3RhdHMtPnR4X2J5dGVzICs9IHNlbnQ7CisJCXU2NF9zdGF0c191cGRhdGVfZW5kKCZzdGF0cy0+c3luYyk7CisJfQorCXJldHVybiBzZW50OworfQorCisvKioKKyAqCW92c192cG9ydF9yZWNvcmRfZXJyb3IgLSBpbmRpY2F0ZSBkZXZpY2UgZXJyb3IgdG8gZ2VuZXJpYyBzdGF0cyBsYXllcgorICoKKyAqIEB2cG9ydDogdnBvcnQgdGhhdCBlbmNvdW50ZXJlZCB0aGUgZXJyb3IKKyAqIEBlcnJfdHlwZTogb25lIG9mIGVudW0gdnBvcnRfZXJyX3R5cGUgdHlwZXMgdG8gaW5kaWNhdGUgdGhlIGVycm9yIHR5cGUKKyAqCisgKiBJZiB1c2luZyB0aGUgdnBvcnQgZ2VuZXJpYyBzdGF0cyBsYXllciBpbmRpY2F0ZSB0aGF0IGFuIGVycm9yIG9mIHRoZSBnaXZlbgorICogdHlwZSBoYXMgb2NjdXJlZC4KKyAqLwordm9pZCBvdnNfdnBvcnRfcmVjb3JkX2Vycm9yKHN0cnVjdCB2cG9ydCAqdnBvcnQsIGVudW0gdnBvcnRfZXJyX3R5cGUgZXJyX3R5cGUpCit7CisJc3Bpbl9sb2NrKCZ2cG9ydC0+c3RhdHNfbG9jayk7CisKKwlzd2l0Y2ggKGVycl90eXBlKSB7CisJY2FzZSBWUE9SVF9FX1JYX0RST1BQRUQ6CisJCXZwb3J0LT5lcnJfc3RhdHMucnhfZHJvcHBlZCsrOworCQlicmVhazsKKworCWNhc2UgVlBPUlRfRV9SWF9FUlJPUjoKKwkJdnBvcnQtPmVycl9zdGF0cy5yeF9lcnJvcnMrKzsKKwkJYnJlYWs7CisKKwljYXNlIFZQT1JUX0VfVFhfRFJPUFBFRDoKKwkJdnBvcnQtPmVycl9zdGF0cy50eF9kcm9wcGVkKys7CisJCWJyZWFrOworCisJY2FzZSBWUE9SVF9FX1RYX0VSUk9SOgorCQl2cG9ydC0+ZXJyX3N0YXRzLnR4X2Vycm9ycysrOworCQlicmVhazsKKwl9OworCisJc3Bpbl91bmxvY2soJnZwb3J0LT5zdGF0c19sb2NrKTsKK30KZGlmZiAtLWdpdCBhL25ldC9vcGVudnN3aXRjaC92cG9ydC5oIGIvbmV0L29wZW52c3dpdGNoL3Zwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2MDk2MgotLS0gL2Rldi9udWxsCisrKyBiL25ldC9vcGVudnN3aXRjaC92cG9ydC5oCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMTEgTmljaXJhIE5ldHdvcmtzLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogMDIxMTAtMTMwMSwgVVNBCisgKi8KKworI2lmbmRlZiBWUE9SVF9ICisjZGVmaW5lIFZQT1JUX0ggMQorCisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L29wZW52c3dpdGNoLmg+CisjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC91NjRfc3RhdHNfc3luYy5oPgorCisjaW5jbHVkZSAiZGF0YXBhdGguaCIKKworc3RydWN0IHZwb3J0Oworc3RydWN0IHZwb3J0X3Bhcm1zOworCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBmb3IgdXNlcnMgb2YgdGhlIHZwb3J0IHN1YnN5dGVtOiAqLworCitpbnQgb3ZzX3Zwb3J0X2luaXQodm9pZCk7Cit2b2lkIG92c192cG9ydF9leGl0KHZvaWQpOworCitzdHJ1Y3QgdnBvcnQgKm92c192cG9ydF9hZGQoY29uc3Qgc3RydWN0IHZwb3J0X3Bhcm1zICopOwordm9pZCBvdnNfdnBvcnRfZGVsKHN0cnVjdCB2cG9ydCAqKTsKKworc3RydWN0IHZwb3J0ICpvdnNfdnBvcnRfbG9jYXRlKGNvbnN0IGNoYXIgKm5hbWUpOworCit2b2lkIG92c192cG9ydF9nZXRfc3RhdHMoc3RydWN0IHZwb3J0ICosIHN0cnVjdCBvdnNfdnBvcnRfc3RhdHMgKik7CisKK2ludCBvdnNfdnBvcnRfc2V0X29wdGlvbnMoc3RydWN0IHZwb3J0ICosIHN0cnVjdCBubGF0dHIgKm9wdGlvbnMpOworaW50IG92c192cG9ydF9nZXRfb3B0aW9ucyhjb25zdCBzdHJ1Y3QgdnBvcnQgKiwgc3RydWN0IHNrX2J1ZmYgKik7CisKK2ludCBvdnNfdnBvcnRfc2VuZChzdHJ1Y3QgdnBvcnQgKiwgc3RydWN0IHNrX2J1ZmYgKik7CisKKy8qIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIGZvciBpbXBsZW1lbnRlcnMgb2YgdnBvcnQgZGV2aWNlczogKi8KKworc3RydWN0IHZwb3J0X3BlcmNwdV9zdGF0cyB7CisJdTY0IHJ4X2J5dGVzOworCXU2NCByeF9wYWNrZXRzOworCXU2NCB0eF9ieXRlczsKKwl1NjQgdHhfcGFja2V0czsKKwlzdHJ1Y3QgdTY0X3N0YXRzX3N5bmMgc3luYzsKK307CisKK3N0cnVjdCB2cG9ydF9lcnJfc3RhdHMgeworCXU2NCByeF9kcm9wcGVkOworCXU2NCByeF9lcnJvcnM7CisJdTY0IHR4X2Ryb3BwZWQ7CisJdTY0IHR4X2Vycm9yczsKK307CisKKy8qKgorICogc3RydWN0IHZwb3J0IC0gb25lIHBvcnQgd2l0aGluIGEgZGF0YXBhdGgKKyAqIEByY3U6IFJDVSBjYWxsYmFjayBoZWFkIGZvciBkZWZlcnJlZCBkZXN0cnVjdGlvbi4KKyAqIEBwb3J0X25vOiBJbmRleCBpbnRvIEBkcCdzIEBwb3J0cyBhcnJheS4KKyAqIEBkcDogRGF0YXBhdGggdG8gd2hpY2ggdGhpcyBwb3J0IGJlbG9uZ3MuCisgKiBAbm9kZTogRWxlbWVudCBpbiBAZHAncyBAcG9ydF9saXN0LgorICogQHVwY2FsbF9waWQ6IFRoZSBOZXRsaW5rIHBvcnQgdG8gdXNlIGZvciBwYWNrZXRzIHJlY2VpdmVkIG9uIHRoaXMgcG9ydCB0aGF0CisgKiBtaXNzIHRoZSBmbG93IHRhYmxlLgorICogQGhhc2hfbm9kZTogRWxlbWVudCBpbiBAZGV2X3RhYmxlIGhhc2ggdGFibGUgaW4gdnBvcnQuYy4KKyAqIEBvcHM6IENsYXNzIHN0cnVjdHVyZS4KKyAqIEBwZXJjcHVfc3RhdHM6IFBvaW50cyB0byBwZXItQ1BVIHN0YXRpc3RpY3MgdXNlZCBhbmQgbWFpbnRhaW5lZCBieSB2cG9ydAorICogQHN0YXRzX2xvY2s6IFByb3RlY3RzIEBlcnJfc3RhdHM7CisgKiBAZXJyX3N0YXRzOiBQb2ludHMgdG8gZXJyb3Igc3RhdGlzdGljcyB1c2VkIGFuZCBtYWludGFpbmVkIGJ5IHZwb3J0CisgKi8KK3N0cnVjdCB2cG9ydCB7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwl1MTYgcG9ydF9ubzsKKwlzdHJ1Y3QgZGF0YXBhdGgJKmRwOworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwl1MzIgdXBjYWxsX3BpZDsKKworCXN0cnVjdCBobGlzdF9ub2RlIGhhc2hfbm9kZTsKKwljb25zdCBzdHJ1Y3QgdnBvcnRfb3BzICpvcHM7CisKKwlzdHJ1Y3QgdnBvcnRfcGVyY3B1X3N0YXRzIF9fcGVyY3B1ICpwZXJjcHVfc3RhdHM7CisKKwlzcGlubG9ja190IHN0YXRzX2xvY2s7CisJc3RydWN0IHZwb3J0X2Vycl9zdGF0cyBlcnJfc3RhdHM7Cit9OworCisvKioKKyAqIHN0cnVjdCB2cG9ydF9wYXJtcyAtIHBhcmFtZXRlcnMgZm9yIGNyZWF0aW5nIGEgbmV3IHZwb3J0CisgKgorICogQG5hbWU6IE5ldyB2cG9ydCdzIG5hbWUuCisgKiBAdHlwZTogTmV3IHZwb3J0J3MgdHlwZS4KKyAqIEBvcHRpb25zOiAlT1ZTX1ZQT1JUX0FUVFJfT1BUSU9OUyBhdHRyaWJ1dGUgZnJvbSBOZXRsaW5rIG1lc3NhZ2UsICVOVUxMIGlmCisgKiBub25lIHdhcyBzdXBwbGllZC4KKyAqIEBkcDogTmV3IHZwb3J0J3MgZGF0YXBhdGguCisgKiBAcG9ydF9ubzogTmV3IHZwb3J0J3MgcG9ydCBudW1iZXIuCisgKi8KK3N0cnVjdCB2cG9ydF9wYXJtcyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwllbnVtIG92c192cG9ydF90eXBlIHR5cGU7CisJc3RydWN0IG5sYXR0ciAqb3B0aW9uczsKKworCS8qIEZvciBvdnNfdnBvcnRfYWxsb2MoKS4gKi8KKwlzdHJ1Y3QgZGF0YXBhdGggKmRwOworCXUxNiBwb3J0X25vOworCXUzMiB1cGNhbGxfcGlkOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdnBvcnRfb3BzIC0gZGVmaW5pdGlvbiBvZiBhIHR5cGUgb2YgdmlydHVhbCBwb3J0CisgKgorICogQHR5cGU6ICVPVlNfVlBPUlRfVFlQRV8qIHZhbHVlIGZvciB0aGlzIHR5cGUgb2YgdmlydHVhbCBwb3J0LgorICogQGNyZWF0ZTogQ3JlYXRlIGEgbmV3IHZwb3J0IGNvbmZpZ3VyZWQgYXMgc3BlY2lmaWVkLiAgT24gc3VjY2VzcyByZXR1cm5zCisgKiBhIG5ldyB2cG9ydCBhbGxvY2F0ZWQgd2l0aCBvdnNfdnBvcnRfYWxsb2MoKSwgb3RoZXJ3aXNlIGFuIEVSUl9QVFIoKSB2YWx1ZS4KKyAqIEBkZXN0cm95OiBEZXN0cm95cyBhIHZwb3J0LiAgTXVzdCBjYWxsIHZwb3J0X2ZyZWUoKSBvbiB0aGUgdnBvcnQgYnV0IG5vdAorICogYmVmb3JlIGFuIFJDVSBncmFjZSBwZXJpb2QgaGFzIGVsYXBzZWQuCisgKiBAc2V0X29wdGlvbnM6IE1vZGlmeSB0aGUgY29uZmlndXJhdGlvbiBvZiBhbiBleGlzdGluZyB2cG9ydC4gIE1heSBiZSAlTlVMTAorICogaWYgbW9kaWZpY2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCisgKiBAZ2V0X29wdGlvbnM6IEFwcGVuZHMgdnBvcnQtc3BlY2lmaWMgYXR0cmlidXRlcyBmb3IgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYW4KKyAqIGV4aXN0aW5nIHZwb3J0IHRvIGEgJnN0cnVjdCBza19idWZmLiAgTWF5IGJlICVOVUxMIGZvciBhIHZwb3J0IHRoYXQgZG9lcyBub3QKKyAqIGhhdmUgYW55IGNvbmZpZ3VyYXRpb24uCisgKiBAZ2V0X25hbWU6IEdldCB0aGUgZGV2aWNlJ3MgbmFtZS4KKyAqIEBnZXRfY29uZmlnOiBHZXQgdGhlIGRldmljZSdzIGNvbmZpZ3VyYXRpb24uCisgKiBAZ2V0X2lmaW5kZXg6IEdldCB0aGUgc3lzdGVtIGludGVyZmFjZSBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS4KKyAqIE1heSBiZSBudWxsIGlmIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSBhbiBpZmluZGV4LgorICogQHNlbmQ6IFNlbmQgYSBwYWNrZXQgb24gdGhlIGRldmljZS4gIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgcGFja2V0IHNlbnQuCisgKi8KK3N0cnVjdCB2cG9ydF9vcHMgeworCWVudW0gb3ZzX3Zwb3J0X3R5cGUgdHlwZTsKKworCS8qIENhbGxlZCB3aXRoIFJUTkwgbG9jay4gKi8KKwlzdHJ1Y3QgdnBvcnQgKigqY3JlYXRlKShjb25zdCBzdHJ1Y3QgdnBvcnRfcGFybXMgKik7CisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCB2cG9ydCAqKTsKKworCWludCAoKnNldF9vcHRpb25zKShzdHJ1Y3QgdnBvcnQgKiwgc3RydWN0IG5sYXR0ciAqKTsKKwlpbnQgKCpnZXRfb3B0aW9ucykoY29uc3Qgc3RydWN0IHZwb3J0ICosIHN0cnVjdCBza19idWZmICopOworCisJLyogQ2FsbGVkIHdpdGggcmN1X3JlYWRfbG9jayBvciBSVE5MIGxvY2suICovCisJY29uc3QgY2hhciAqKCpnZXRfbmFtZSkoY29uc3Qgc3RydWN0IHZwb3J0ICopOworCXZvaWQgKCpnZXRfY29uZmlnKShjb25zdCBzdHJ1Y3QgdnBvcnQgKiwgdm9pZCAqKTsKKwlpbnQgKCpnZXRfaWZpbmRleCkoY29uc3Qgc3RydWN0IHZwb3J0ICopOworCisJaW50ICgqc2VuZCkoc3RydWN0IHZwb3J0ICosIHN0cnVjdCBza19idWZmICopOworfTsKKworZW51bSB2cG9ydF9lcnJfdHlwZSB7CisJVlBPUlRfRV9SWF9EUk9QUEVELAorCVZQT1JUX0VfUlhfRVJST1IsCisJVlBPUlRfRV9UWF9EUk9QUEVELAorCVZQT1JUX0VfVFhfRVJST1IsCit9OworCitzdHJ1Y3QgdnBvcnQgKm92c192cG9ydF9hbGxvYyhpbnQgcHJpdl9zaXplLCBjb25zdCBzdHJ1Y3QgdnBvcnRfb3BzICosCisJCQkgICAgICBjb25zdCBzdHJ1Y3QgdnBvcnRfcGFybXMgKik7Cit2b2lkIG92c192cG9ydF9mcmVlKHN0cnVjdCB2cG9ydCAqKTsKKworI2RlZmluZSBWUE9SVF9BTElHTiA4CisKKy8qKgorICoJdnBvcnRfcHJpdiAtIGFjY2VzcyBwcml2YXRlIGRhdGEgYXJlYSBvZiB2cG9ydAorICoKKyAqIEB2cG9ydDogdnBvcnQgdG8gYWNjZXNzCisgKgorICogSWYgYSBub256ZXJvIHNpemUgd2FzIHBhc3NlZCBpbiBwcml2X3NpemUgb2YgdnBvcnRfYWxsb2MoKSBhIHByaXZhdGUgZGF0YQorICogYXJlYSB3YXMgYWxsb2NhdGVkIG9uIGNyZWF0aW9uLiAgVGhpcyBhbGxvd3MgdGhhdCBhcmVhIHRvIGJlIGFjY2Vzc2VkIGFuZAorICogdXNlZCBmb3IgYW55IHB1cnBvc2UgbmVlZGVkIGJ5IHRoZSB2cG9ydCBpbXBsZW1lbnRlci4KKyAqLworc3RhdGljIGlubGluZSB2b2lkICp2cG9ydF9wcml2KGNvbnN0IHN0cnVjdCB2cG9ydCAqdnBvcnQpCit7CisJcmV0dXJuICh1OCAqKXZwb3J0ICsgQUxJR04oc2l6ZW9mKHN0cnVjdCB2cG9ydCksIFZQT1JUX0FMSUdOKTsKK30KKworLyoqCisgKgl2cG9ydF9mcm9tX3ByaXYgLSBsb29rdXAgdnBvcnQgZnJvbSBwcml2YXRlIGRhdGEgcG9pbnRlcgorICoKKyAqIEBwcml2OiBTdGFydCBvZiBwcml2YXRlIGRhdGEgYXJlYS4KKyAqCisgKiBJdCBpcyBzb21ldGltZXMgdXNlZnVsIHRvIHRyYW5zbGF0ZSBmcm9tIGEgcG9pbnRlciB0byB0aGUgcHJpdmF0ZSBkYXRhCisgKiBhcmVhIHRvIHRoZSB2cG9ydCwgc3VjaCBhcyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcHJpdmF0ZSBkYXRhIHBvaW50ZXIgaXMKKyAqIHRoZSByZXN1bHQgb2YgYSBoYXNoIHRhYmxlIGxvb2t1cC4gIEBwcml2IG11c3QgcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICogcHJpdmF0ZSBkYXRhIGFyZWEuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHZwb3J0ICp2cG9ydF9mcm9tX3ByaXYoY29uc3Qgdm9pZCAqcHJpdikKK3sKKwlyZXR1cm4gKHN0cnVjdCB2cG9ydCAqKShwcml2IC0gQUxJR04oc2l6ZW9mKHN0cnVjdCB2cG9ydCksIFZQT1JUX0FMSUdOKSk7Cit9CisKK3ZvaWQgb3ZzX3Zwb3J0X3JlY2VpdmUoc3RydWN0IHZwb3J0ICosIHN0cnVjdCBza19idWZmICopOwordm9pZCBvdnNfdnBvcnRfcmVjb3JkX2Vycm9yKHN0cnVjdCB2cG9ydCAqLCBlbnVtIHZwb3J0X2Vycl90eXBlIGVycl90eXBlKTsKKworLyogTGlzdCBvZiBzdGF0aWNhbGx5IGNvbXBpbGVkIHZwb3J0IGltcGxlbWVudGF0aW9ucy4gIERvbid0IGZvcmdldCB0byBhbHNvCisgKiBhZGQgeW91cnMgdG8gdGhlIGxpc3QgYXQgdGhlIHRvcCBvZiB2cG9ydC5jLiAqLworZXh0ZXJuIGNvbnN0IHN0cnVjdCB2cG9ydF9vcHMgb3ZzX25ldGRldl92cG9ydF9vcHM7CitleHRlcm4gY29uc3Qgc3RydWN0IHZwb3J0X29wcyBvdnNfaW50ZXJuYWxfdnBvcnRfb3BzOworCisjZW5kaWYgLyogdnBvcnQuaCAqLwpkaWZmIC0tZ2l0IGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYyBiL25ldC9wYWNrZXQvYWZfcGFja2V0LmMKaW5kZXggODJhNmYzNC4uMmRiYjMyYiAxMDA2NDQKLS0tIGEvbmV0L3BhY2tldC9hZl9wYWNrZXQuYworKysgYi9uZXQvcGFja2V0L2FmX3BhY2tldC5jCkBAIC0xNDk5LDEwICsxNDk5LDExIEBACiAKIAlpZiAoIXNrYikgewogCQlzaXplX3QgcmVzZXJ2ZWQgPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOworCQlpbnQgdGxlbiA9IGRldi0+bmVlZGVkX3RhaWxyb29tOwogCQl1bnNpZ25lZCBpbnQgaGhsZW4gPSBkZXYtPmhlYWRlcl9vcHMgPyBkZXYtPmhhcmRfaGVhZGVyX2xlbiA6IDA7CiAKIAkJcmN1X3JlYWRfdW5sb2NrKCk7Ci0JCXNrYiA9IHNvY2tfd21hbGxvYyhzaywgbGVuICsgcmVzZXJ2ZWQsIDAsIEdGUF9LRVJORUwpOworCQlza2IgPSBzb2NrX3dtYWxsb2Moc2ssIGxlbiArIHJlc2VydmVkICsgdGxlbiwgMCwgR0ZQX0tFUk5FTCk7CiAJCWlmIChza2IgPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PQlVGUzsKIAkJLyogRklYTUU6IFNhdmUgc29tZSBzcGFjZSBmb3IgYnJva2VuIGRyaXZlcnMgdGhhdCB3cml0ZSBhIGhhcmQKQEAgLTE2MzAsOCArMTYzMSw3IEBACiAJaWYgKHNuYXBsZW4gPiByZXMpCiAJCXNuYXBsZW4gPSByZXM7CiAKLQlpZiAoYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSArIHNrYi0+dHJ1ZXNpemUgPj0KLQkgICAgKHVuc2lnbmVkKXNrLT5za19yY3ZidWYpCisJaWYgKGF0b21pY19yZWFkKCZzay0+c2tfcm1lbV9hbGxvYykgPj0gc2stPnNrX3JjdmJ1ZikKIAkJZ290byBkcm9wX25fYWNjdDsKIAogCWlmIChza2Jfc2hhcmVkKHNrYikpIHsKQEAgLTE3NjIsOCArMTc2Miw3IEBACiAJaWYgKHBvLT50cF92ZXJzaW9uIDw9IFRQQUNLRVRfVjIpIHsKIAkJaWYgKG1hY29mZiArIHNuYXBsZW4gPiBwby0+cnhfcmluZy5mcmFtZV9zaXplKSB7CiAJCQlpZiAocG8tPmNvcHlfdGhyZXNoICYmCi0JCQkJYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSArIHNrYi0+dHJ1ZXNpemUKLQkJCQk8ICh1bnNpZ25lZClzay0+c2tfcmN2YnVmKSB7CisJCQkgICAgYXRvbWljX3JlYWQoJnNrLT5za19ybWVtX2FsbG9jKSA8IHNrLT5za19yY3ZidWYpIHsKIAkJCQlpZiAoc2tiX3NoYXJlZChza2IpKSB7CiAJCQkJCWNvcHlfc2tiID0gc2tiX2Nsb25lKHNrYiwgR0ZQX0FUT01JQyk7CiAJCQkJfSBlbHNlIHsKQEAgLTE5NDQsNyArMTk0Myw3IEBACiAKIHN0YXRpYyBpbnQgdHBhY2tldF9maWxsX3NrYihzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQl2b2lkICpmcmFtZSwgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgaW50IHNpemVfbWF4LAotCQlfX2JlMTYgcHJvdG8sIHVuc2lnbmVkIGNoYXIgKmFkZHIpCisJCV9fYmUxNiBwcm90bywgdW5zaWduZWQgY2hhciAqYWRkciwgaW50IGhsZW4pCiB7CiAJdW5pb24gewogCQlzdHJ1Y3QgdHBhY2tldF9oZHIgKmgxOwpAQCAtMTk3OCw3ICsxOTc3LDcgQEAKIAkJcmV0dXJuIC1FTVNHU0laRTsKIAl9CiAKLQlza2JfcmVzZXJ2ZShza2IsIExMX1JFU0VSVkVEX1NQQUNFKGRldikpOworCXNrYl9yZXNlcnZlKHNrYiwgaGxlbik7CiAJc2tiX3Jlc2V0X25ldHdvcmtfaGVhZGVyKHNrYik7CiAKIAlkYXRhID0gcGgucmF3ICsgcG8tPnRwX2hkcmxlbiAtIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfbGwpOwpAQCAtMjA1Myw2ICsyMDUyLDcgQEAKIAl1bnNpZ25lZCBjaGFyICphZGRyOwogCWludCBsZW5fc3VtID0gMDsKIAlpbnQgc3RhdHVzID0gMDsKKwlpbnQgaGxlbiwgdGxlbjsKIAogCW11dGV4X2xvY2soJnBvLT5wZ192ZWNfbG9jayk7CiAKQEAgLTIxMDEsMTYgKzIxMDEsMTcgQEAKIAkJfQogCiAJCXN0YXR1cyA9IFRQX1NUQVRVU19TRU5EX1JFUVVFU1Q7CisJCWhsZW4gPSBMTF9SRVNFUlZFRF9TUEFDRShkZXYpOworCQl0bGVuID0gZGV2LT5uZWVkZWRfdGFpbHJvb207CiAJCXNrYiA9IHNvY2tfYWxsb2Nfc2VuZF9za2IoJnBvLT5zaywKLQkJCQlMTF9BTExPQ0FURURfU1BBQ0UoZGV2KQotCQkJCSsgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9sbCksCisJCQkJaGxlbiArIHRsZW4gKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2xsKSwKIAkJCQkwLCAmZXJyKTsKIAogCQlpZiAodW5saWtlbHkoc2tiID09IE5VTEwpKQogCQkJZ290byBvdXRfc3RhdHVzOwogCiAJCXRwX2xlbiA9IHRwYWNrZXRfZmlsbF9za2IocG8sIHNrYiwgcGgsIGRldiwgc2l6ZV9tYXgsIHByb3RvLAotCQkJCWFkZHIpOworCQkJCWFkZHIsIGhsZW4pOwogCiAJCWlmICh1bmxpa2VseSh0cF9sZW4gPCAwKSkgewogCQkJaWYgKHBvLT50cF9sb3NzKSB7CkBAIC0yMjA3LDYgKzIyMDgsNyBAQAogCWludCB2bmV0X2hkcl9sZW47CiAJc3RydWN0IHBhY2tldF9zb2NrICpwbyA9IHBrdF9zayhzayk7CiAJdW5zaWduZWQgc2hvcnQgZ3NvX3R5cGUgPSAwOworCWludCBobGVuLCB0bGVuOwogCiAJLyoKIAkgKglHZXQgYW5kIHZlcmlmeSB0aGUgYWRkcmVzcy4KQEAgLTIyOTEsOCArMjI5Myw5IEBACiAJCWdvdG8gb3V0X3VubG9jazsKIAogCWVyciA9IC1FTk9CVUZTOwotCXNrYiA9IHBhY2tldF9hbGxvY19za2Ioc2ssIExMX0FMTE9DQVRFRF9TUEFDRShkZXYpLAotCQkJICAgICAgIExMX1JFU0VSVkVEX1NQQUNFKGRldiksIGxlbiwgdm5ldF9oZHIuaGRyX2xlbiwKKwlobGVuID0gTExfUkVTRVJWRURfU1BBQ0UoZGV2KTsKKwl0bGVuID0gZGV2LT5uZWVkZWRfdGFpbHJvb207CisJc2tiID0gcGFja2V0X2FsbG9jX3NrYihzaywgaGxlbiArIHRsZW4sIGhsZW4sIGxlbiwgdm5ldF9oZHIuaGRyX2xlbiwKIAkJCSAgICAgICBtc2ctPm1zZ19mbGFncyAmIE1TR19ET05UV0FJVCwgJmVycik7CiAJaWYgKHNrYiA9PSBOVUxMKQogCQlnb3RvIG91dF91bmxvY2s7CkBAIC0yNDUwLDggKzI0NTMsMTIgQEAKIHsKIAlzdHJ1Y3QgcGFja2V0X3NvY2sgKnBvID0gcGt0X3NrKHNrKTsKIAotCWlmIChwby0+ZmFub3V0KQorCWlmIChwby0+ZmFub3V0KSB7CisJCWlmIChkZXYpCisJCQlkZXZfcHV0KGRldik7CisKIAkJcmV0dXJuIC1FSU5WQUw7CisJfQogCiAJbG9ja19zb2NrKHNrKTsKIApkaWZmIC0tZ2l0IGEvbmV0L3Bob25ldC9wZXAuYyBiL25ldC9waG9uZXQvcGVwLmMKaW5kZXggMmJhNmU5Zi4uOWY2MDAwOCAxMDA2NDQKLS0tIGEvbmV0L3Bob25ldC9wZXAuYworKysgYi9uZXQvcGhvbmV0L3BlcC5jCkBAIC01MzQsNiArNTM0LDI5IEBACiAJcmV0dXJuIHBpcGVfaGFuZGxlcl9zZW5kX2NyZWF0ZWRfaW5kKHNrKTsKIH0KIAorc3RhdGljIGludCBwZXBfZW5hYmxlcmVzcF9yY3Yoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQoreworCXN0cnVjdCBwbnBpcGVoZHIgKmhkciA9IHBucF9oZHIoc2tiKTsKKworCWlmIChoZHItPmVycm9yX2NvZGUgIT0gUE5fUElQRV9OT19FUlJPUikKKwkJcmV0dXJuIC1FQ09OTlJFRlVTRUQ7CisKKwlyZXR1cm4gcGVwX2luZGljYXRlKHNrLCBQTlNfUElQRV9FTkFCTEVEX0lORCwgMCAvKiBzdWItYmxvY2tzICovLAorCQlOVUxMLCAwLCBHRlBfQVRPTUlDKTsKKworfQorCitzdGF0aWMgdm9pZCBwaXBlX3N0YXJ0X2Zsb3dfY29udHJvbChzdHJ1Y3Qgc29jayAqc2spCit7CisJc3RydWN0IHBlcF9zb2NrICpwbiA9IHBlcF9zayhzayk7CisKKwlpZiAoIXBuX2Zsb3dfc2FmZShwbi0+dHhfZmMpKSB7CisJCWF0b21pY19zZXQoJnBuLT50eF9jcmVkaXRzLCAxKTsKKwkJc2stPnNrX3dyaXRlX3NwYWNlKHNrKTsKKwl9CisJcGlwZV9ncmFudF9jcmVkaXRzKHNrLCBHRlBfQVRPTUlDKTsKK30KKwogLyogUXVldWUgYW4gc2tiIHRvIGFuIGFjdGl2ZWx5IGNvbm5lY3RlZCBzb2NrLgogICogU29ja2V0IGxvY2sgbXVzdCBiZSBoZWxkLiAqLwogc3RhdGljIGludCBwaXBlX2hhbmRsZXJfZG9fcmN2KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYikKQEAgLTU3OSwxMyArNjAyLDI1IEBACiAJCQlzay0+c2tfc3RhdGUgPSBUQ1BfQ0xPU0VfV0FJVDsKIAkJCWJyZWFrOwogCQl9CisJCWlmIChwbi0+aW5pdF9lbmFibGUgPT0gUE5fUElQRV9ESVNBQkxFKQorCQkJc2stPnNrX3N0YXRlID0gVENQX1NZTl9SRUNWOworCQllbHNlIHsKKwkJCXNrLT5za19zdGF0ZSA9IFRDUF9FU1RBQkxJU0hFRDsKKwkJCXBpcGVfc3RhcnRfZmxvd19jb250cm9sKHNrKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgUE5TX1BFUF9FTkFCTEVfUkVTUDoKKwkJaWYgKHNrLT5za19zdGF0ZSAhPSBUQ1BfU1lOX1NFTlQpCisJCQlicmVhazsKKworCQlpZiAocGVwX2VuYWJsZXJlc3BfcmN2KHNrLCBza2IpKSB7CisJCQlzay0+c2tfc3RhdGUgPSBUQ1BfQ0xPU0VfV0FJVDsKKwkJCWJyZWFrOworCQl9CiAKIAkJc2stPnNrX3N0YXRlID0gVENQX0VTVEFCTElTSEVEOwotCQlpZiAoIXBuX2Zsb3dfc2FmZShwbi0+dHhfZmMpKSB7Ci0JCQlhdG9taWNfc2V0KCZwbi0+dHhfY3JlZGl0cywgMSk7Ci0JCQlzay0+c2tfd3JpdGVfc3BhY2Uoc2spOwotCQl9Ci0JCXBpcGVfZ3JhbnRfY3JlZGl0cyhzaywgR0ZQX0FUT01JQyk7CisJCXBpcGVfc3RhcnRfZmxvd19jb250cm9sKHNrKTsKIAkJYnJlYWs7CiAKIAljYXNlIFBOU19QRVBfRElTQ09OTkVDVF9SRVNQOgpAQCAtODY0LDE0ICs4OTksMzIgQEAKIAlpbnQgZXJyOwogCXU4IGRhdGFbNF0gPSB7IDAgLyogc3ViLWJsb2NrcyAqLywgUEFELCBQQUQsIFBBRCB9OwogCi0JcG4tPnBpcGVfaGFuZGxlID0gMTsgLyogYW55dGhpbmcgYnV0IElOVkFMSURfSEFORExFICovCisJaWYgKHBuLT5waXBlX2hhbmRsZSA9PSBQTl9QSVBFX0lOVkFMSURfSEFORExFKQorCQlwbi0+cGlwZV9oYW5kbGUgPSAxOyAvKiBhbnl0aGluZyBidXQgSU5WQUxJRF9IQU5ETEUgKi8KKwogCWVyciA9IHBpcGVfaGFuZGxlcl9yZXF1ZXN0KHNrLCBQTlNfUEVQX0NPTk5FQ1RfUkVRLAotCQkJCQlQTl9QSVBFX0VOQUJMRSwgZGF0YSwgNCk7CisJCQkJcG4tPmluaXRfZW5hYmxlLCBkYXRhLCA0KTsKIAlpZiAoZXJyKSB7CiAJCXBuLT5waXBlX2hhbmRsZSA9IFBOX1BJUEVfSU5WQUxJRF9IQU5ETEU7CiAJCXJldHVybiBlcnI7CiAJfQorCiAJc2stPnNrX3N0YXRlID0gVENQX1NZTl9TRU5UOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGVwX3NvY2tfZW5hYmxlKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNvY2thZGRyICphZGRyLCBpbnQgbGVuKQoreworCWludCBlcnI7CisKKwllcnIgPSBwaXBlX2hhbmRsZXJfcmVxdWVzdChzaywgUE5TX1BFUF9FTkFCTEVfUkVRLCBQQUQsCisJCQkJTlVMTCwgMCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXNrLT5za19zdGF0ZSA9IFRDUF9TWU5fU0VOVDsKKwogCXJldHVybiAwOwogfQogCkBAIC04NzksMTEgKzkzMiwxNCBAQAogewogCXN0cnVjdCBwZXBfc29jayAqcG4gPSBwZXBfc2soc2spOwogCWludCBhbnN3OworCWludCByZXQgPSAtRU5PSU9DVExDTUQ7CiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ0lOUToKLQkJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKQotCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CiAKIAkJbG9ja19zb2NrKHNrKTsKIAkJaWYgKHNvY2tfZmxhZyhzaywgU09DS19VUkdJTkxJTkUpICYmCkBAIC04OTQsMTAgKzk1MCwyMiBAQAogCQllbHNlCiAJCQlhbnN3ID0gMDsKIAkJcmVsZWFzZV9zb2NrKHNrKTsKLQkJcmV0dXJuIHB1dF91c2VyKGFuc3csIChpbnQgX191c2VyICopYXJnKTsKKwkJcmV0ID0gcHV0X3VzZXIoYW5zdywgKGludCBfX3VzZXIgKilhcmcpOworCQlicmVhazsKKworCWNhc2UgU0lPQ1BORU5BQkxFUElQRToKKwkJbG9ja19zb2NrKHNrKTsKKwkJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfU1lOX1NFTlQpCisJCQlyZXQgPSAgLUVCVVNZOworCQllbHNlIGlmIChzay0+c2tfc3RhdGUgPT0gVENQX0VTVEFCTElTSEVEKQorCQkJcmV0ID0gLUVJU0NPTk47CisJCWVsc2UKKwkJCXJldCA9IHBlcF9zb2NrX2VuYWJsZShzaywgTlVMTCwgMCk7CisJCXJlbGVhc2Vfc29jayhzayk7CisJCWJyZWFrOwogCX0KIAotCXJldHVybiAtRU5PSU9DVExDTUQ7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBwZXBfaW5pdChzdHJ1Y3Qgc29jayAqc2spCkBAIC05NjAsNiArMTAyOCwxOCBAQAogCQl9CiAJCWdvdG8gb3V0X25vcmVsOwogCisJY2FzZSBQTlBJUEVfSEFORExFOgorCQlpZiAoKHNrLT5za19zdGF0ZSA9PSBUQ1BfQ0xPU0UpICYmCisJCQkodmFsID49IDApICYmICh2YWwgPCBQTl9QSVBFX0lOVkFMSURfSEFORExFKSkKKwkJCXBuLT5waXBlX2hhbmRsZSA9IHZhbDsKKwkJZWxzZQorCQkJZXJyID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwljYXNlIFBOUElQRV9JTklUU1RBVEU6CisJCXBuLT5pbml0X2VuYWJsZSA9ICEhdmFsOworCQlicmVhazsKKwogCWRlZmF1bHQ6CiAJCWVyciA9IC1FTk9QUk9UT09QVDsKIAl9CkBAIC05OTUsNiArMTA3NSwxMCBAQAogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCisJY2FzZSBQTlBJUEVfSU5JVFNUQVRFOgorCQl2YWwgPSBwbi0+aW5pdF9lbmFibGU7CisJCWJyZWFrOworCiAJZGVmYXVsdDoKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKIAl9CmRpZmYgLS1naXQgYS9uZXQvcmZraWxsL2NvcmUuYyBiL25ldC9yZmtpbGwvY29yZS5jCmluZGV4IDViZTE5NTcuLjM1NDc2MGUgMTAwNjQ0Ci0tLSBhL25ldC9yZmtpbGwvY29yZS5jCisrKyBiL25ldC9yZmtpbGwvY29yZS5jCkBAIC02NDQsNyArNjQ0LDcgQEAKIAlpZiAoIWNhcGFibGUoQ0FQX05FVF9BRE1JTikpCiAJCXJldHVybiAtRVBFUk07CiAKLQllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDAsICZzdGF0ZSk7CisJZXJyID0ga3N0cnRvdWwoYnVmLCAwLCAmc3RhdGUpOwogCWlmIChlcnIpCiAJCXJldHVybiBlcnI7CiAKQEAgLTY4OCw3ICs2ODgsNyBAQAogCWlmICghY2FwYWJsZShDQVBfTkVUX0FETUlOKSkKIAkJcmV0dXJuIC1FUEVSTTsKIAotCWVyciA9IHN0cmljdF9zdHJ0b3VsKGJ1ZiwgMCwgJnN0YXRlKTsKKwllcnIgPSBrc3RydG91bChidWYsIDAsICZzdGF0ZSk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIApkaWZmIC0tZ2l0IGEvbmV0L3Jma2lsbC9yZmtpbGwtZ3Bpby5jIGIvbmV0L3Jma2lsbC9yZmtpbGwtZ3Bpby5jCmluZGV4IDEyODY3N2QuLjg2NWFkYjYgMTAwNjQ0Ci0tLSBhL25ldC9yZmtpbGwvcmZraWxsLWdwaW8uYworKysgYi9uZXQvcmZraWxsL3Jma2lsbC1ncGlvLmMKQEAgLTEwNSw3ICsxMDUsNyBAQAogCQlyZXQgPSBwZGF0YS0+Z3Bpb19ydW50aW1lX3NldHVwKHBkZXYpOwogCQlpZiAocmV0KSB7CiAJCQlwcl93YXJuKCIlczogY2FuJ3Qgc2V0IHVwIGdwaW9cbiIsIF9fZnVuY19fKTsKLQkJCXJldHVybiByZXQ7CisJCQlnb3RvIGZhaWxfYWxsb2M7CiAJCX0KIAl9CiAKQEAgLTIyMCwxOCArMjIwLDcgQEAKIAl9LAogfTsKIAotc3RhdGljIGludCBfX2luaXQgcmZraWxsX2dwaW9faW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnJma2lsbF9ncGlvX2RyaXZlcik7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCByZmtpbGxfZ3Bpb19leGl0KHZvaWQpCi17Ci0JcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJnJma2lsbF9ncGlvX2RyaXZlcik7Ci19Ci0KLW1vZHVsZV9pbml0KHJma2lsbF9ncGlvX2luaXQpOwotbW9kdWxlX2V4aXQocmZraWxsX2dwaW9fZXhpdCk7Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHJma2lsbF9ncGlvX2RyaXZlcik7CiAKIE1PRFVMRV9ERVNDUklQVElPTigiZ3BpbyByZmtpbGwiKTsKIE1PRFVMRV9BVVRIT1IoIk5WSURJQSIpOwpkaWZmIC0tZ2l0IGEvbmV0L3Jma2lsbC9yZmtpbGwtcmVndWxhdG9yLmMgYi9uZXQvcmZraWxsL3Jma2lsbC1yZWd1bGF0b3IuYwppbmRleCAzY2E3Mjc3Li4xMWRhMzAxIDEwMDY0NAotLS0gYS9uZXQvcmZraWxsL3Jma2lsbC1yZWd1bGF0b3IuYworKysgYi9uZXQvcmZraWxsL3Jma2lsbC1yZWd1bGF0b3IuYwpAQCAtMzYsMTIgKzM2LDEyIEBACiAJaWYgKGJsb2NrZWQpIHsKIAkJaWYgKHJma2lsbF9kYXRhLT5yZWdfZW5hYmxlZCkgewogCQkJcmVndWxhdG9yX2Rpc2FibGUocmZraWxsX2RhdGEtPnZjYyk7Ci0JCQlyZmtpbGxfZGF0YS0+cmVnX2VuYWJsZWQgPSAwOworCQkJcmZraWxsX2RhdGEtPnJlZ19lbmFibGVkID0gZmFsc2U7CiAJCX0KIAl9IGVsc2UgewogCQlpZiAoIXJma2lsbF9kYXRhLT5yZWdfZW5hYmxlZCkgewogCQkJcmVndWxhdG9yX2VuYWJsZShyZmtpbGxfZGF0YS0+dmNjKTsKLQkJCXJma2lsbF9kYXRhLT5yZWdfZW5hYmxlZCA9IDE7CisJCQlyZmtpbGxfZGF0YS0+cmVnX2VuYWJsZWQgPSB0cnVlOwogCQl9CiAJfQogCkBAIC05Niw3ICs5Niw3IEBACiAKIAlpZiAocmVndWxhdG9yX2lzX2VuYWJsZWQodmNjKSkgewogCQlkZXZfZGJnKCZwZGV2LT5kZXYsICJSZWd1bGF0b3IgYWxyZWFkeSBlbmFibGVkXG4iKTsKLQkJcmZraWxsX2RhdGEtPnJlZ19lbmFibGVkID0gMTsKKwkJcmZraWxsX2RhdGEtPnJlZ19lbmFibGVkID0gdHJ1ZTsKIAl9CiAJcmZraWxsX2RhdGEtPnZjYyA9IHZjYzsKIAlyZmtpbGxfZGF0YS0+cmZfa2lsbCA9IHJmX2tpbGw7CkBAIC0xNDQsMTcgKzE0NCw3IEBACiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19pbml0IHJma2lsbF9yZWd1bGF0b3JfaW5pdCh2b2lkKQotewotCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnJma2lsbF9yZWd1bGF0b3JfZHJpdmVyKTsKLX0KLW1vZHVsZV9pbml0KHJma2lsbF9yZWd1bGF0b3JfaW5pdCk7Ci0KLXN0YXRpYyB2b2lkIF9fZXhpdCByZmtpbGxfcmVndWxhdG9yX2V4aXQodm9pZCkKLXsKLQlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcmZraWxsX3JlZ3VsYXRvcl9kcml2ZXIpOwotfQotbW9kdWxlX2V4aXQocmZraWxsX3JlZ3VsYXRvcl9leGl0KTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocmZraWxsX3JlZ3VsYXRvcl9kcml2ZXIpOwogCiBNT0RVTEVfQVVUSE9SKCJHdWltaW5nIFpodW8gPGdtemh1b0BnbWFpbC5jb20+Iik7CiBNT0RVTEVfQVVUSE9SKCJBbnRvbmlvIE9zcGl0ZSA8b3NwaXRlQHN0dWRlbnRpLnVuaW5hLml0PiIpOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLWFjay5jIGIvbmV0L3J4cnBjL2FyLWFjay5jCmluZGV4IGY5OWNmY2UuLmMzMTI2ZTggMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hci1hY2suYworKysgYi9uZXQvcnhycGMvYXItYWNrLmMKQEAgLTE5NSw3ICsxOTUsNyBAQAogCQlzcCA9IHJ4cnBjX3NrYih0eGIpOwogCiAJCWlmIChzcC0+bmVlZF9yZXNlbmQpIHsKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IDA7CisJCQlzcC0+bmVlZF9yZXNlbmQgPSBmYWxzZTsKIAogCQkJLyogZWFjaCBUeCBwYWNrZXQgaGFzIGEgbmV3IHNlcmlhbCBudW1iZXIgKi8KIAkJCXNwLT5oZHIuc2VyaWFsID0KQEAgLTIxNiw3ICsyMTYsNyBAQAogCQl9CiAKIAkJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcyArIDEsIHNwLT5yZXNlbmRfYXQpKSB7Ci0JCQlzcC0+bmVlZF9yZXNlbmQgPSAxOworCQkJc3AtPm5lZWRfcmVzZW5kID0gdHJ1ZTsKIAkJCXJlc2VuZCB8PSAxOwogCQl9IGVsc2UgaWYgKHJlc2VuZCAmIDIpIHsKIAkJCWlmICh0aW1lX2JlZm9yZShzcC0+cmVzZW5kX2F0LCByZXNlbmRfYXQpKQpAQCAtMjY1LDcgKzI2NSw3IEBACiAJCWlmIChzcC0+bmVlZF9yZXNlbmQpIHsKIAkJCTsKIAkJfSBlbHNlIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMgKyAxLCBzcC0+cmVzZW5kX2F0KSkgewotCQkJc3AtPm5lZWRfcmVzZW5kID0gMTsKKwkJCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7CiAJCQlyZXNlbmQgfD0gMTsKIAkJfSBlbHNlIGlmIChyZXNlbmQgJiAyKSB7CiAJCQlpZiAodGltZV9iZWZvcmUoc3AtPnJlc2VuZF9hdCwgcmVzZW5kX2F0KSkKQEAgLTMxNCwxMSArMzE0LDExIEBACiAKIAkJc3dpdGNoIChzYWNrc1tsb29wXSkgewogCQljYXNlIFJYUlBDX0FDS19UWVBFX0FDSzoKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IDA7CisJCQlzcC0+bmVlZF9yZXNlbmQgPSBmYWxzZTsKIAkJCSpwX3R4YiB8PSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgUlhSUENfQUNLX1RZUEVfTkFDSzoKLQkJCXNwLT5uZWVkX3Jlc2VuZCA9IDE7CisJCQlzcC0+bmVlZF9yZXNlbmQgPSB0cnVlOwogCQkJKnBfdHhiICY9IH4xOwogCQkJcmVzZW5kID0gMTsKIAkJCWJyZWFrOwpAQCAtMzQ0LDEzICszNDQsMTMgQEAKIAogCQlpZiAoKnBfdHhiICYgMSkgewogCQkJLyogcGFja2V0IG11c3QgaGF2ZSBiZWVuIGRpc2NhcmRlZCAqLwotCQkJc3AtPm5lZWRfcmVzZW5kID0gMTsKKwkJCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7CiAJCQkqcF90eGIgJj0gfjE7CiAJCQlyZXNlbmQgfD0gMTsKIAkJfSBlbHNlIGlmIChzcC0+bmVlZF9yZXNlbmQpIHsKIAkJCTsKIAkJfSBlbHNlIGlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMgKyAxLCBzcC0+cmVzZW5kX2F0KSkgewotCQkJc3AtPm5lZWRfcmVzZW5kID0gMTsKKwkJCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7CiAJCQlyZXNlbmQgfD0gMTsKIAkJfSBlbHNlIGlmIChyZXNlbmQgJiAyKSB7CiAJCQlpZiAodGltZV9iZWZvcmUoc3AtPnJlc2VuZF9hdCwgcmVzZW5kX2F0KSkKZGlmZiAtLWdpdCBhL25ldC9yeHJwYy9hci1rZXkuYyBiL25ldC9yeHJwYy9hci1rZXkuYwppbmRleCA0M2VhN2RlLi40Y2JhMTNlIDEwMDY0NAotLS0gYS9uZXQvcnhycGMvYXIta2V5LmMKKysrIGIvbmV0L3J4cnBjL2FyLWtleS5jCkBAIC0zMDYsMTAgKzMwNiw5IEBACiAJdGQtPmRhdGFfbGVuID0gbGVuOwogCiAJaWYgKGxlbiA+IDApIHsKLQkJdGQtPmRhdGEgPSBrbWFsbG9jKGxlbiwgR0ZQX0tFUk5FTCk7CisJCXRkLT5kYXRhID0ga21lbWR1cCh4ZHIsIGxlbiwgR0ZQX0tFUk5FTCk7CiAJCWlmICghdGQtPmRhdGEpCiAJCQlyZXR1cm4gLUVOT01FTTsKLQkJbWVtY3B5KHRkLT5kYXRhLCB4ZHIsIGxlbik7CiAJCWxlbiA9IChsZW4gKyAzKSAmIH4zOwogCQl0b2tsZW4gLT0gbGVuOwogCQl4ZHIgKz0gbGVuID4+IDI7CkBAIC00MDEsMTAgKzQwMCw5IEBACiAJX2RlYnVnKCJ0aWNrZXQgbGVuICV1IiwgbGVuKTsKIAogCWlmIChsZW4gPiAwKSB7Ci0JCSpfdGlja2V0ID0ga21hbGxvYyhsZW4sIEdGUF9LRVJORUwpOworCQkqX3RpY2tldCA9IGttZW1kdXAoeGRyLCBsZW4sIEdGUF9LRVJORUwpOwogCQlpZiAoISpfdGlja2V0KQogCQkJcmV0dXJuIC1FTk9NRU07Ci0JCW1lbWNweSgqX3RpY2tldCwgeGRyLCBsZW4pOwogCQlsZW4gPSAobGVuICsgMykgJiB+MzsKIAkJdG9rbGVuIC09IGxlbjsKIAkJeGRyICs9IGxlbiA+PiAyOwpkaWZmIC0tZ2l0IGEvbmV0L3J4cnBjL2FyLW91dHB1dC5jIGIvbmV0L3J4cnBjL2FyLW91dHB1dC5jCmluZGV4IDMzOGQ3OTMuLjE2YWU4ODcgMTAwNjQ0Ci0tLSBhL25ldC9yeHJwYy9hci1vdXRwdXQuYworKysgYi9uZXQvcnhycGMvYXItb3V0cHV0LmMKQEAgLTQ4Niw3ICs0ODYsNyBAQAogCV9wcm90bygiVHggREFUQSAlJSV1IHsgIyV1IH0iLAogCSAgICAgICBudG9obChzcC0+aGRyLnNlcmlhbCksIG50b2hsKHNwLT5oZHIuc2VxKSk7CiAKLQlzcC0+bmVlZF9yZXNlbmQgPSAwOworCXNwLT5uZWVkX3Jlc2VuZCA9IGZhbHNlOwogCXNwLT5yZXNlbmRfYXQgPSBqaWZmaWVzICsgcnhycGNfcmVzZW5kX3RpbWVvdXQgKiBIWjsKIAlpZiAoIXRlc3RfYW5kX3NldF9iaXQoUlhSUENfQ0FMTF9SVU5fUlRJTUVSLCAmY2FsbC0+ZmxhZ3MpKSB7CiAJCV9kZWJ1ZygicnVuIHRpbWVyIik7CkBAIC01MDgsNyArNTA4LDcgQEAKIAogCWlmIChyZXQgPCAwKSB7CiAJCV9kZWJ1ZygibmVlZCBpbnN0YW50IHJlc2VuZCAlZCIsIHJldCk7Ci0JCXNwLT5uZWVkX3Jlc2VuZCA9IDE7CisJCXNwLT5uZWVkX3Jlc2VuZCA9IHRydWU7CiAJCXJ4cnBjX2luc3RhbnRfcmVzZW5kKGNhbGwpOwogCX0KIApkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL2Nsc19mbG93LmMgYi9uZXQvc2NoZWQvY2xzX2Zsb3cuYwppbmRleCA3YjU4MjMwLi4xZDhiZDBkIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvY2xzX2Zsb3cuYworKysgYi9uZXQvc2NoZWQvY2xzX2Zsb3cuYwpAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPG5ldC9wa3RfY2xzLmg+CiAjaW5jbHVkZSA8bmV0L2lwLmg+CiAjaW5jbHVkZSA8bmV0L3JvdXRlLmg+CisjaW5jbHVkZSA8bmV0L2Zsb3dfa2V5cy5oPgorCiAjaWYgZGVmaW5lZChDT05GSUdfTkZfQ09OTlRSQUNLKSB8fCBkZWZpbmVkKENPTkZJR19ORl9DT05OVFJBQ0tfTU9EVUxFKQogI2luY2x1ZGUgPG5ldC9uZXRmaWx0ZXIvbmZfY29ubnRyYWNrLmg+CiAjZW5kaWYKQEAgLTY2LDEzNCArNjgsMzcgQEAKIAlyZXR1cm4gKGEgJiAweEZGRkZGRkZGKSBeIChCSVRTX1BFUl9MT05HID4gMzIgPyBhID4+IDMyIDogMCk7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBuaG9mZikKK3N0YXRpYyB1MzIgZmxvd19nZXRfc3JjKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7Ci0JX19iZTMyICpkYXRhID0gTlVMTCwgaGRhdGE7Ci0KLQlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKLQljYXNlIGh0b25zKEVUSF9QX0lQKToKLQkJZGF0YSA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCi0JCQkJCSAgbmhvZmYgKyBvZmZzZXRvZihzdHJ1Y3QgaXBoZHIsCi0JCQkJCQkJICAgc2FkZHIpLAotCQkJCQkgIDQsICZoZGF0YSk7Ci0JCWJyZWFrOwotCWNhc2UgaHRvbnMoRVRIX1BfSVBWNik6Ci0JCWRhdGEgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLAotCQkJCQkgbmhvZmYgKyBvZmZzZXRvZihzdHJ1Y3QgaXB2NmhkciwKLQkJCQkJCQkgIHNhZGRyLnM2X2FkZHIzMlszXSksCi0JCQkJCSA0LCAmaGRhdGEpOwotCQlicmVhazsKLQl9Ci0KLQlpZiAoZGF0YSkKLQkJcmV0dXJuIG50b2hsKCpkYXRhKTsKKwlpZiAoZmxvdy0+c3JjKQorCQlyZXR1cm4gbnRvaGwoZmxvdy0+c3JjKTsKIAlyZXR1cm4gYWRkcl9mb2xkKHNrYi0+c2spOwogfQogCi1zdGF0aWMgdTMyIGZsb3dfZ2V0X2RzdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmhvZmYpCitzdGF0aWMgdTMyIGZsb3dfZ2V0X2RzdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewotCV9fYmUzMiAqZGF0YSA9IE5VTEwsIGhkYXRhOwotCi0Jc3dpdGNoIChza2ItPnByb3RvY29sKSB7Ci0JY2FzZSBodG9ucyhFVEhfUF9JUCk6Ci0JCWRhdGEgPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLAotCQkJCQkgIG5ob2ZmICsgb2Zmc2V0b2Yoc3RydWN0IGlwaGRyLAotCQkJCQkJCSAgIGRhZGRyKSwKLQkJCQkJICA0LCAmaGRhdGEpOwotCQlicmVhazsKLQljYXNlIGh0b25zKEVUSF9QX0lQVjYpOgotCQlkYXRhID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKLQkJCQkJIG5ob2ZmICsgb2Zmc2V0b2Yoc3RydWN0IGlwdjZoZHIsCi0JCQkJCQkJICBkYWRkci5zNl9hZGRyMzJbM10pLAotCQkJCQkgNCwgJmhkYXRhKTsKLQkJYnJlYWs7Ci0JfQotCi0JaWYgKGRhdGEpCi0JCXJldHVybiBudG9obCgqZGF0YSk7CisJaWYgKGZsb3ctPmRzdCkKKwkJcmV0dXJuIG50b2hsKGZsb3ctPmRzdCk7CiAJcmV0dXJuIGFkZHJfZm9sZChza2JfZHN0KHNrYikpIF4gKF9fZm9yY2UgdTE2KXNrYi0+cHJvdG9jb2w7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfcHJvdG8oY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5ob2ZmKQorc3RhdGljIHUzMiBmbG93X2dldF9wcm90byhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewotCV9fdTggKmRhdGEgPSBOVUxMLCBoZGF0YTsKLQotCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewotCWNhc2UgaHRvbnMoRVRIX1BfSVApOgotCQlkYXRhID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKLQkJCQkJICBuaG9mZiArIG9mZnNldG9mKHN0cnVjdCBpcGhkciwKLQkJCQkJCQkgICBwcm90b2NvbCksCi0JCQkJCSAgMSwgJmhkYXRhKTsKLQkJYnJlYWs7Ci0JY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKLQkJZGF0YSA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCi0JCQkJCSBuaG9mZiArIG9mZnNldG9mKHN0cnVjdCBpcHY2aGRyLAotCQkJCQkJCSAgbmV4dGhkciksCi0JCQkJCSAxLCAmaGRhdGEpOwotCQlicmVhazsKLQl9Ci0JaWYgKGRhdGEpCi0JCXJldHVybiAqZGF0YTsKLQlyZXR1cm4gMDsKKwlyZXR1cm4gZmxvdy0+aXBfcHJvdG87CiB9CiAKLS8qIGhlbHBlciBmdW5jdGlvbiB0byBnZXQgZWl0aGVyIHNyYyBvciBkc3QgcG9ydCAqLwotc3RhdGljIF9fYmUxNiAqZmxvd19nZXRfcHJvdG9fY29tbW9uKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBuaG9mZiwKLQkJCQkgICAgIF9fYmUxNiAqX3BvcnQsIGludCBkc3QpCitzdGF0aWMgdTMyIGZsb3dfZ2V0X3Byb3RvX3NyYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewotCV9fYmUxNiAqcG9ydCA9IE5VTEw7Ci0JaW50IHBvZmY7Ci0KLQlzd2l0Y2ggKHNrYi0+cHJvdG9jb2wpIHsKLQljYXNlIGh0b25zKEVUSF9QX0lQKTogewotCQlzdHJ1Y3QgaXBoZHIgKmlwaCwgX2lwaDsKLQotCQlpcGggPSBza2JfaGVhZGVyX3BvaW50ZXIoc2tiLCBuaG9mZiwgc2l6ZW9mKF9pcGgpLCAmX2lwaCk7Ci0JCWlmICghaXBoKQotCQkJYnJlYWs7Ci0JCWlmIChpcF9pc19mcmFnbWVudChpcGgpKQotCQkJYnJlYWs7Ci0JCXBvZmYgPSBwcm90b19wb3J0c19vZmZzZXQoaXBoLT5wcm90b2NvbCk7Ci0JCWlmIChwb2ZmID49IDApCi0JCQlwb3J0ID0gc2tiX2hlYWRlcl9wb2ludGVyKHNrYiwKLQkJCQkJbmhvZmYgKyBpcGgtPmlobCAqIDQgKyBwb2ZmICsgZHN0LAotCQkJCQlzaXplb2YoKl9wb3J0KSwgX3BvcnQpOwotCQlicmVhazsKLQl9Ci0JY2FzZSBodG9ucyhFVEhfUF9JUFY2KTogewotCQlzdHJ1Y3QgaXB2NmhkciAqaXBoLCBfaXBoOwotCi0JCWlwaCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG5ob2ZmLCBzaXplb2YoX2lwaCksICZfaXBoKTsKLQkJaWYgKCFpcGgpCi0JCQlicmVhazsKLQkJcG9mZiA9IHByb3RvX3BvcnRzX29mZnNldChpcGgtPm5leHRoZHIpOwotCQlpZiAocG9mZiA+PSAwKQotCQkJcG9ydCA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsCi0JCQkJCW5ob2ZmICsgc2l6ZW9mKCppcGgpICsgcG9mZiArIGRzdCwKLQkJCQkJc2l6ZW9mKCpfcG9ydCksIF9wb3J0KTsKLQkJYnJlYWs7Ci0JfQotCX0KLQotCXJldHVybiBwb3J0OwotfQotCi1zdGF0aWMgdTMyIGZsb3dfZ2V0X3Byb3RvX3NyYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmhvZmYpCi17Ci0JX19iZTE2IF9wb3J0LCAqcG9ydCA9IGZsb3dfZ2V0X3Byb3RvX2NvbW1vbihza2IsIG5ob2ZmLCAmX3BvcnQsIDApOwotCi0JaWYgKHBvcnQpCi0JCXJldHVybiBudG9ocygqcG9ydCk7CisJaWYgKGZsb3ctPnBvcnRzKQorCQlyZXR1cm4gbnRvaHMoZmxvdy0+cG9ydDE2WzBdKTsKIAogCXJldHVybiBhZGRyX2ZvbGQoc2tiLT5zayk7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfcHJvdG9fZHN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGludCBuaG9mZikKK3N0YXRpYyB1MzIgZmxvd19nZXRfcHJvdG9fZHN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7Ci0JX19iZTE2IF9wb3J0LCAqcG9ydCA9IGZsb3dfZ2V0X3Byb3RvX2NvbW1vbihza2IsIG5ob2ZmLCAmX3BvcnQsIDIpOwotCi0JaWYgKHBvcnQpCi0JCXJldHVybiBudG9ocygqcG9ydCk7CisJaWYgKGZsb3ctPnBvcnRzKQorCQlyZXR1cm4gbnRvaHMoZmxvdy0+cG9ydDE2WzFdKTsKIAogCXJldHVybiBhZGRyX2ZvbGQoc2tiX2RzdChza2IpKSBeIChfX2ZvcmNlIHUxNilza2ItPnByb3RvY29sOwogfQpAQCAtMjM5LDcgKzE0NCw3IEBACiB9KQogI2VuZGlmCiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5ob2ZmKQorc3RhdGljIHUzMiBmbG93X2dldF9uZmN0X3NyYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgpAQCAtMjQ4LDEwICsxNTMsMTAgQEAKIAkJcmV0dXJuIG50b2hsKENUVFVQTEUoc2tiLCBzcmMudTMuaXA2WzNdKSk7CiAJfQogZmFsbGJhY2s6Ci0JcmV0dXJuIGZsb3dfZ2V0X3NyYyhza2IsIG5ob2ZmKTsKKwlyZXR1cm4gZmxvd19nZXRfc3JjKHNrYiwgZmxvdyk7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9kc3QoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5ob2ZmKQorc3RhdGljIHUzMiBmbG93X2dldF9uZmN0X2RzdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCXN3aXRjaCAoc2tiLT5wcm90b2NvbCkgewogCWNhc2UgaHRvbnMoRVRIX1BfSVApOgpAQCAtMjYwLDIxICsxNjUsMjEgQEAKIAkJcmV0dXJuIG50b2hsKENUVFVQTEUoc2tiLCBkc3QudTMuaXA2WzNdKSk7CiAJfQogZmFsbGJhY2s6Ci0JcmV0dXJuIGZsb3dfZ2V0X2RzdChza2IsIG5ob2ZmKTsKKwlyZXR1cm4gZmxvd19nZXRfZHN0KHNrYiwgZmxvdyk7CiB9CiAKLXN0YXRpYyB1MzIgZmxvd19nZXRfbmZjdF9wcm90b19zcmMoY29uc3Qgc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IG5ob2ZmKQorc3RhdGljIHUzMiBmbG93X2dldF9uZmN0X3Byb3RvX3NyYyhjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBjb25zdCBzdHJ1Y3QgZmxvd19rZXlzICpmbG93KQogewogCXJldHVybiBudG9ocyhDVFRVUExFKHNrYiwgc3JjLnUuYWxsKSk7CiBmYWxsYmFjazoKLQlyZXR1cm4gZmxvd19nZXRfcHJvdG9fc3JjKHNrYiwgbmhvZmYpOworCXJldHVybiBmbG93X2dldF9wcm90b19zcmMoc2tiLCBmbG93KTsKIH0KIAotc3RhdGljIHUzMiBmbG93X2dldF9uZmN0X3Byb3RvX2RzdChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBpbnQgbmhvZmYpCitzdGF0aWMgdTMyIGZsb3dfZ2V0X25mY3RfcHJvdG9fZHN0KGNvbnN0IHN0cnVjdCBza19idWZmICpza2IsIGNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7CiAJcmV0dXJuIG50b2hzKENUVFVQTEUoc2tiLCBkc3QudS5hbGwpKTsKIGZhbGxiYWNrOgotCXJldHVybiBmbG93X2dldF9wcm90b19kc3Qoc2tiLCBuaG9mZik7CisJcmV0dXJuIGZsb3dfZ2V0X3Byb3RvX2RzdChza2IsIGZsb3cpOwogfQogCiBzdGF0aWMgdTMyIGZsb3dfZ2V0X3J0Y2xhc3NpZChjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMzE0LDIxICsyMTksMTkgQEAKIAlyZXR1cm4gc2tiX2dldF9yeGhhc2goc2tiKTsKIH0KIAotc3RhdGljIHUzMiBmbG93X2tleV9nZXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgaW50IGtleSkKK3N0YXRpYyB1MzIgZmxvd19rZXlfZ2V0KHN0cnVjdCBza19idWZmICpza2IsIGludCBrZXksIHN0cnVjdCBmbG93X2tleXMgKmZsb3cpCiB7Ci0JaW50IG5ob2ZmID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7Ci0KIAlzd2l0Y2ggKGtleSkgewogCWNhc2UgRkxPV19LRVlfU1JDOgotCQlyZXR1cm4gZmxvd19nZXRfc3JjKHNrYiwgbmhvZmYpOworCQlyZXR1cm4gZmxvd19nZXRfc3JjKHNrYiwgZmxvdyk7CiAJY2FzZSBGTE9XX0tFWV9EU1Q6Ci0JCXJldHVybiBmbG93X2dldF9kc3Qoc2tiLCBuaG9mZik7CisJCXJldHVybiBmbG93X2dldF9kc3Qoc2tiLCBmbG93KTsKIAljYXNlIEZMT1dfS0VZX1BST1RPOgotCQlyZXR1cm4gZmxvd19nZXRfcHJvdG8oc2tiLCBuaG9mZik7CisJCXJldHVybiBmbG93X2dldF9wcm90byhza2IsIGZsb3cpOwogCWNhc2UgRkxPV19LRVlfUFJPVE9fU1JDOgotCQlyZXR1cm4gZmxvd19nZXRfcHJvdG9fc3JjKHNrYiwgbmhvZmYpOworCQlyZXR1cm4gZmxvd19nZXRfcHJvdG9fc3JjKHNrYiwgZmxvdyk7CiAJY2FzZSBGTE9XX0tFWV9QUk9UT19EU1Q6Ci0JCXJldHVybiBmbG93X2dldF9wcm90b19kc3Qoc2tiLCBuaG9mZik7CisJCXJldHVybiBmbG93X2dldF9wcm90b19kc3Qoc2tiLCBmbG93KTsKIAljYXNlIEZMT1dfS0VZX0lJRjoKIAkJcmV0dXJuIGZsb3dfZ2V0X2lpZihza2IpOwogCWNhc2UgRkxPV19LRVlfUFJJT1JJVFk6CkBAIC0zMzgsMTMgKzI0MSwxMyBAQAogCWNhc2UgRkxPV19LRVlfTkZDVDoKIAkJcmV0dXJuIGZsb3dfZ2V0X25mY3Qoc2tiKTsKIAljYXNlIEZMT1dfS0VZX05GQ1RfU1JDOgotCQlyZXR1cm4gZmxvd19nZXRfbmZjdF9zcmMoc2tiLCBuaG9mZik7CisJCXJldHVybiBmbG93X2dldF9uZmN0X3NyYyhza2IsIGZsb3cpOwogCWNhc2UgRkxPV19LRVlfTkZDVF9EU1Q6Ci0JCXJldHVybiBmbG93X2dldF9uZmN0X2RzdChza2IsIG5ob2ZmKTsKKwkJcmV0dXJuIGZsb3dfZ2V0X25mY3RfZHN0KHNrYiwgZmxvdyk7CiAJY2FzZSBGTE9XX0tFWV9ORkNUX1BST1RPX1NSQzoKLQkJcmV0dXJuIGZsb3dfZ2V0X25mY3RfcHJvdG9fc3JjKHNrYiwgbmhvZmYpOworCQlyZXR1cm4gZmxvd19nZXRfbmZjdF9wcm90b19zcmMoc2tiLCBmbG93KTsKIAljYXNlIEZMT1dfS0VZX05GQ1RfUFJPVE9fRFNUOgotCQlyZXR1cm4gZmxvd19nZXRfbmZjdF9wcm90b19kc3Qoc2tiLCBuaG9mZik7CisJCXJldHVybiBmbG93X2dldF9uZmN0X3Byb3RvX2RzdChza2IsIGZsb3cpOwogCWNhc2UgRkxPV19LRVlfUlRDTEFTU0lEOgogCQlyZXR1cm4gZmxvd19nZXRfcnRjbGFzc2lkKHNrYik7CiAJY2FzZSBGTE9XX0tFWV9TS1VJRDoKQEAgLTM2MSw2ICsyNjQsMTYgQEAKIAl9CiB9CiAKKyNkZWZpbmUgRkxPV19LRVlTX05FRURFRCAoKDEgPDwgRkxPV19LRVlfU1JDKSB8IAkJXAorCQkJICAoMSA8PCBGTE9XX0tFWV9EU1QpIHwJCQlcCisJCQkgICgxIDw8IEZMT1dfS0VZX1BST1RPKSB8CQlcCisJCQkgICgxIDw8IEZMT1dfS0VZX1BST1RPX1NSQykgfAkJXAorCQkJICAoMSA8PCBGTE9XX0tFWV9QUk9UT19EU1QpIHwgCQlcCisJCQkgICgxIDw8IEZMT1dfS0VZX05GQ1RfU1JDKSB8CQlcCisJCQkgICgxIDw8IEZMT1dfS0VZX05GQ1RfRFNUKSB8CQlcCisJCQkgICgxIDw8IEZMT1dfS0VZX05GQ1RfUFJPVE9fU1JDKSB8CVwKKwkJCSAgKDEgPDwgRkxPV19LRVlfTkZDVF9QUk9UT19EU1QpKQorCiBzdGF0aWMgaW50IGZsb3dfY2xhc3NpZnkoc3RydWN0IHNrX2J1ZmYgKnNrYiwgY29uc3Qgc3RydWN0IHRjZl9wcm90byAqdHAsCiAJCQkgc3RydWN0IHRjZl9yZXN1bHQgKnJlcykKIHsKQEAgLTM3MiwxNyArMjg1LDIwIEBACiAJaW50IHI7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KGYsICZoZWFkLT5maWx0ZXJzLCBsaXN0KSB7Ci0JCXUzMiBrZXlzW2YtPm5rZXlzXTsKKwkJdTMyIGtleXNbRkxPV19LRVlfTUFYICsgMV07CisJCXN0cnVjdCBmbG93X2tleXMgZmxvd19rZXlzOwogCiAJCWlmICghdGNmX2VtX3RyZWVfbWF0Y2goc2tiLCAmZi0+ZW1hdGNoZXMsIE5VTEwpKQogCQkJY29udGludWU7CiAKIAkJa2V5bWFzayA9IGYtPmtleW1hc2s7CisJCWlmIChrZXltYXNrICYgRkxPV19LRVlTX05FRURFRCkKKwkJCXNrYl9mbG93X2Rpc3NlY3Qoc2tiLCAmZmxvd19rZXlzKTsKIAogCQlmb3IgKG4gPSAwOyBuIDwgZi0+bmtleXM7IG4rKykgewogCQkJa2V5ID0gZmZzKGtleW1hc2spIC0gMTsKIAkJCWtleW1hc2sgJj0gfigxIDw8IGtleSk7Ci0JCQlrZXlzW25dID0gZmxvd19rZXlfZ2V0KHNrYiwga2V5KTsKKwkJCWtleXNbbl0gPSBmbG93X2tleV9nZXQoc2tiLCBrZXksICZmbG93X2tleXMpOwogCQl9CiAKIAkJaWYgKGYtPm1vZGUgPT0gRkxPV19NT0RFX0hBU0gpCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2FwaS5jIGIvbmV0L3NjaGVkL3NjaF9hcGkuYwppbmRleCBkY2E2YzFhLi4zZDg5ODFmIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2FwaS5jCisrKyBiL25ldC9zY2hlZC9zY2hfYXBpLmMKQEAgLTYxOCwyMCArNjE4LDI0IEBACiB9CiBFWFBPUlRfU1lNQk9MKHFkaXNjX2NsYXNzX2hhc2hfcmVtb3ZlKTsKIAotLyogQWxsb2NhdGUgYW4gdW5pcXVlIGhhbmRsZSBmcm9tIHNwYWNlIG1hbmFnZWQgYnkga2VybmVsICovCi0KKy8qIEFsbG9jYXRlIGFuIHVuaXF1ZSBoYW5kbGUgZnJvbSBzcGFjZSBtYW5hZ2VkIGJ5IGtlcm5lbAorICogUG9zc2libGUgcmFuZ2UgaXMgWzgwMDAtRkZGRl06MDAwMCAoMHg4MDAwIHZhbHVlcykKKyAqLwogc3RhdGljIHUzMiBxZGlzY19hbGxvY19oYW5kbGUoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKIHsKLQlpbnQgaSA9IDB4MTAwMDA7CisJaW50IGkgPSAweDgwMDA7CiAJc3RhdGljIHUzMiBhdXRvaGFuZGxlID0gVENfSF9NQUtFKDB4ODAwMDAwMDBVLCAwKTsKIAogCWRvIHsKIAkJYXV0b2hhbmRsZSArPSBUQ19IX01BS0UoMHgxMDAwMFUsIDApOwogCQlpZiAoYXV0b2hhbmRsZSA9PSBUQ19IX01BS0UoVENfSF9ST09ULCAwKSkKIAkJCWF1dG9oYW5kbGUgPSBUQ19IX01BS0UoMHg4MDAwMDAwMFUsIDApOwotCX0gd2hpbGUJKHFkaXNjX2xvb2t1cChkZXYsIGF1dG9oYW5kbGUpICYmIC0taSA+IDApOworCQlpZiAoIXFkaXNjX2xvb2t1cChkZXYsIGF1dG9oYW5kbGUpKQorCQkJcmV0dXJuIGF1dG9oYW5kbGU7CisJCWNvbmRfcmVzY2hlZCgpOworCX0gd2hpbGUJKC0taSA+IDApOwogCi0JcmV0dXJuIGkgPiAwID8gYXV0b2hhbmRsZSA6IDA7CisJcmV0dXJuIDA7CiB9CiAKIHZvaWQgcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKHN0cnVjdCBRZGlzYyAqc2NoLCB1bnNpZ25lZCBpbnQgbikKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfY2hva2UuYyBiL25ldC9zY2hlZC9zY2hfY2hva2UuYwppbmRleCAzNDIyYjI1Li5lNDY1MDY0IDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2Nob2tlLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9jaG9rZS5jCkBAIC0xOSwxMCArMTksNyBAQAogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KICNpbmNsdWRlIDxuZXQvaW5ldF9lY24uaD4KICNpbmNsdWRlIDxuZXQvcmVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaXAuaD4KLSNpbmNsdWRlIDxuZXQvaXAuaD4KLSNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+Ci0jaW5jbHVkZSA8bmV0L2lwdjYuaD4KKyNpbmNsdWRlIDxuZXQvZmxvd19rZXlzLmg+CiAKIC8qCiAgICBDSE9LZSBzdGF0ZWxlc3MgQVFNIGZvciBmYWlyIGJhbmR3aWR0aCBhbGxvY2F0aW9uCkBAIC02MCw2ICs1Nyw3IEBACiAJc3RydWN0IHJlZF9wYXJtcyBwYXJtczsKIAogLyogVmFyaWFibGVzICovCisJc3RydWN0IHJlZF92YXJzICB2YXJzOwogCXN0cnVjdCB0Y2ZfcHJvdG8gKmZpbHRlcl9saXN0OwogCXN0cnVjdCB7CiAJCXUzMglwcm9iX2Ryb3A7CS8qIEVhcmx5IHByb2JhYmlsaXR5IGRyb3BzICovCkBAIC0xNDIsODUgKzE0MCwxMCBAQAogCS0tc2NoLT5xLnFsZW47CiB9CiAKLS8qCi0gKiBDb21wYXJlIGZsb3cgb2YgdHdvIHBhY2tldHMKLSAqICBSZXR1cm5zIHRydWUgb25seSBpZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3MgYW5kIHBvcnQgbWF0Y2guCi0gKiAgICAgICAgICBmYWxzZSBmb3Igc3BlY2lhbCBjYXNlcwotICovCi1zdGF0aWMgYm9vbCBjaG9rZV9tYXRjaF9mbG93KHN0cnVjdCBza19idWZmICpza2IxLAotCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqc2tiMikKLXsKLQlpbnQgb2ZmMSwgb2ZmMiwgcG9mZjsKLQljb25zdCB1MzIgKnBvcnRzMSwgKnBvcnRzMjsKLQl1OCBpcF9wcm90bzsKLQlfX3UzMiBoYXNoMTsKLQotCWlmIChza2IxLT5wcm90b2NvbCAhPSBza2IyLT5wcm90b2NvbCkKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogVXNlIGhhc2ggdmFsdWUgYXMgcXVpY2sgY2hlY2sKLQkgKiBBc3N1bWVzIHRoYXQgX19za2JfZ2V0X3J4aGFzaCBtYWtlcyBJUCBoZWFkZXIgYW5kIHBvcnRzIGxpbmVhcgotCSAqLwotCWhhc2gxID0gc2tiX2dldF9yeGhhc2goc2tiMSk7Ci0JaWYgKCFoYXNoMSB8fCBoYXNoMSAhPSBza2JfZ2V0X3J4aGFzaChza2IyKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogUHJvYmFibHkgbWF0Y2gsIGJ1dCBiZSBzdXJlIHRvIGF2b2lkIGhhc2ggY29sbGlzaW9ucyAqLwotCW9mZjEgPSBza2JfbmV0d29ya19vZmZzZXQoc2tiMSk7Ci0Jb2ZmMiA9IHNrYl9uZXR3b3JrX29mZnNldChza2IyKTsKLQotCXN3aXRjaCAoc2tiMS0+cHJvdG9jb2wpIHsKLQljYXNlIF9fY29uc3RhbnRfaHRvbnMoRVRIX1BfSVApOiB7Ci0JCWNvbnN0IHN0cnVjdCBpcGhkciAqaXAxLCAqaXAyOwotCi0JCWlwMSA9IChjb25zdCBzdHJ1Y3QgaXBoZHIgKikgKHNrYjEtPmRhdGEgKyBvZmYxKTsKLQkJaXAyID0gKGNvbnN0IHN0cnVjdCBpcGhkciAqKSAoc2tiMi0+ZGF0YSArIG9mZjIpOwotCi0JCWlwX3Byb3RvID0gaXAxLT5wcm90b2NvbDsKLQkJaWYgKGlwX3Byb3RvICE9IGlwMi0+cHJvdG9jb2wgfHwKLQkJICAgIGlwMS0+c2FkZHIgIT0gaXAyLT5zYWRkciB8fCBpcDEtPmRhZGRyICE9IGlwMi0+ZGFkZHIpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKGlwX2lzX2ZyYWdtZW50KGlwMSkgfCBpcF9pc19mcmFnbWVudChpcDIpKQotCQkJaXBfcHJvdG8gPSAwOwotCQlvZmYxICs9IGlwMS0+aWhsICogNDsKLQkJb2ZmMiArPSBpcDItPmlobCAqIDQ7Ci0JCWJyZWFrOwotCX0KLQotCWNhc2UgX19jb25zdGFudF9odG9ucyhFVEhfUF9JUFY2KTogewotCQljb25zdCBzdHJ1Y3QgaXB2NmhkciAqaXAxLCAqaXAyOwotCi0JCWlwMSA9IChjb25zdCBzdHJ1Y3QgaXB2NmhkciAqKSAoc2tiMS0+ZGF0YSArIG9mZjEpOwotCQlpcDIgPSAoY29uc3Qgc3RydWN0IGlwdjZoZHIgKikgKHNrYjItPmRhdGEgKyBvZmYyKTsKLQotCQlpcF9wcm90byA9IGlwMS0+bmV4dGhkcjsKLQkJaWYgKGlwX3Byb3RvICE9IGlwMi0+bmV4dGhkciB8fAotCQkgICAgaXB2Nl9hZGRyX2NtcCgmaXAxLT5zYWRkciwgJmlwMi0+c2FkZHIpIHx8Ci0JCSAgICBpcHY2X2FkZHJfY21wKCZpcDEtPmRhZGRyLCAmaXAyLT5kYWRkcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCW9mZjEgKz0gNDA7Ci0JCW9mZjIgKz0gNDA7Ci0JfQotCi0JZGVmYXVsdDogLyogTWF5YmUgY29tcGFyZSBNQUMgaGVhZGVyIGhlcmU/ICovCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwb2ZmID0gcHJvdG9fcG9ydHNfb2Zmc2V0KGlwX3Byb3RvKTsKLQlpZiAocG9mZiA8IDApCi0JCXJldHVybiB0cnVlOwotCi0Jb2ZmMSArPSBwb2ZmOwotCW9mZjIgKz0gcG9mZjsKLQotCXBvcnRzMSA9IChfX2ZvcmNlIHUzMiAqKShza2IxLT5kYXRhICsgb2ZmMSk7Ci0JcG9ydHMyID0gKF9fZm9yY2UgdTMyICopKHNrYjItPmRhdGEgKyBvZmYyKTsKLQlyZXR1cm4gKnBvcnRzMSA9PSAqcG9ydHMyOwotfQotCiBzdHJ1Y3QgY2hva2Vfc2tiX2NiIHsKLQl1MTYgY2xhc3NpZDsKKwl1MTYJCQljbGFzc2lkOworCXU4CQkJa2V5c192YWxpZDsKKwlzdHJ1Y3QgZmxvd19rZXlzCWtleXM7CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjaG9rZV9za2JfY2IgKmNob2tlX3NrYl9jYihjb25zdCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQpAQCAtMjQxLDYgKzE2NCwzMiBAQAogfQogCiAvKgorICogQ29tcGFyZSBmbG93IG9mIHR3byBwYWNrZXRzCisgKiAgUmV0dXJucyB0cnVlIG9ubHkgaWYgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzIGFuZCBwb3J0IG1hdGNoLgorICogICAgICAgICAgZmFsc2UgZm9yIHNwZWNpYWwgY2FzZXMKKyAqLworc3RhdGljIGJvb2wgY2hva2VfbWF0Y2hfZmxvdyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiMSwKKwkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYjIpCit7CisJaWYgKHNrYjEtPnByb3RvY29sICE9IHNrYjItPnByb3RvY29sKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAoIWNob2tlX3NrYl9jYihza2IxKS0+a2V5c192YWxpZCkgeworCQljaG9rZV9za2JfY2Ioc2tiMSktPmtleXNfdmFsaWQgPSAxOworCQlza2JfZmxvd19kaXNzZWN0KHNrYjEsICZjaG9rZV9za2JfY2Ioc2tiMSktPmtleXMpOworCX0KKworCWlmICghY2hva2Vfc2tiX2NiKHNrYjIpLT5rZXlzX3ZhbGlkKSB7CisJCWNob2tlX3NrYl9jYihza2IyKS0+a2V5c192YWxpZCA9IDE7CisJCXNrYl9mbG93X2Rpc3NlY3Qoc2tiMiwgJmNob2tlX3NrYl9jYihza2IyKS0+a2V5cyk7CisJfQorCisJcmV0dXJuICFtZW1jbXAoJmNob2tlX3NrYl9jYihza2IxKS0+a2V5cywKKwkJICAgICAgICZjaG9rZV9za2JfY2Ioc2tiMiktPmtleXMsCisJCSAgICAgICBzaXplb2Yoc3RydWN0IGZsb3dfa2V5cykpOworfQorCisvKgogICogQ2xhc3NpZnkgZmxvdyB1c2luZyBlaXRoZXI6CiAgKiAgMS4gcHJlLWV4aXN0aW5nIGNsYXNzaWZpY2F0aW9uIHJlc3VsdCBpbiBza2IKICAqICAyLiBmYXN0IGludGVybmFsIGNsYXNzaWZpY2F0aW9uCkBAIC0zMTcsNyArMjY2LDcgQEAKIHN0YXRpYyBpbnQgY2hva2VfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCkKIHsKIAlzdHJ1Y3QgY2hva2Vfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKLQlzdHJ1Y3QgcmVkX3Bhcm1zICpwID0gJnEtPnBhcm1zOworCWNvbnN0IHN0cnVjdCByZWRfcGFybXMgKnAgPSAmcS0+cGFybXM7CiAJaW50IHJldCA9IE5FVF9YTUlUX1NVQ0NFU1MgfCBfX05FVF9YTUlUX0JZUEFTUzsKIAogCWlmIChxLT5maWx0ZXJfbGlzdCkgewpAQCAtMzI2LDE0ICsyNzUsMTUgQEAKIAkJCWdvdG8gb3RoZXJfZHJvcDsJLyogUGFja2V0IHdhcyBlYXRlbiBieSBmaWx0ZXIgKi8KIAl9CiAKKwljaG9rZV9za2JfY2Ioc2tiKS0+a2V5c192YWxpZCA9IDA7CiAJLyogQ29tcHV0ZSBhdmVyYWdlIHF1ZXVlIHVzYWdlIChzZWUgUkVEKSAqLwotCXAtPnFhdmcgPSByZWRfY2FsY19xYXZnKHAsIHNjaC0+cS5xbGVuKTsKLQlpZiAocmVkX2lzX2lkbGluZyhwKSkKLQkJcmVkX2VuZF9vZl9pZGxlX3BlcmlvZChwKTsKKwlxLT52YXJzLnFhdmcgPSByZWRfY2FsY19xYXZnKHAsICZxLT52YXJzLCBzY2gtPnEucWxlbik7CisJaWYgKHJlZF9pc19pZGxpbmcoJnEtPnZhcnMpKQorCQlyZWRfZW5kX29mX2lkbGVfcGVyaW9kKCZxLT52YXJzKTsKIAogCS8qIElzIHF1ZXVlIHNtYWxsPyAqLwotCWlmIChwLT5xYXZnIDw9IHAtPnF0aF9taW4pCi0JCXAtPnFjb3VudCA9IC0xOworCWlmIChxLT52YXJzLnFhdmcgPD0gcC0+cXRoX21pbikKKwkJcS0+dmFycy5xY291bnQgPSAtMTsKIAllbHNlIHsKIAkJdW5zaWduZWQgaW50IGlkeDsKIApAQCAtMzQ1LDggKzI5NSw4IEBACiAJCX0KIAogCQkvKiBRdWV1ZSBpcyBsYXJnZSwgYWx3YXlzIG1hcmsvZHJvcCAqLwotCQlpZiAocC0+cWF2ZyA+IHAtPnF0aF9tYXgpIHsKLQkJCXAtPnFjb3VudCA9IC0xOworCQlpZiAocS0+dmFycy5xYXZnID4gcC0+cXRoX21heCkgeworCQkJcS0+dmFycy5xY291bnQgPSAtMTsKIAogCQkJc2NoLT5xc3RhdHMub3ZlcmxpbWl0cysrOwogCQkJaWYgKHVzZV9oYXJkZHJvcChxKSB8fCAhdXNlX2VjbihxKSB8fApAQCAtMzU2LDEwICszMDYsMTAgQEAKIAkJCX0KIAogCQkJcS0+c3RhdHMuZm9yY2VkX21hcmsrKzsKLQkJfSBlbHNlIGlmICgrK3AtPnFjb3VudCkgewotCQkJaWYgKHJlZF9tYXJrX3Byb2JhYmlsaXR5KHAsIHAtPnFhdmcpKSB7Ci0JCQkJcC0+cWNvdW50ID0gMDsKLQkJCQlwLT5xUiA9IHJlZF9yYW5kb20ocCk7CisJCX0gZWxzZSBpZiAoKytxLT52YXJzLnFjb3VudCkgeworCQkJaWYgKHJlZF9tYXJrX3Byb2JhYmlsaXR5KHAsICZxLT52YXJzLCBxLT52YXJzLnFhdmcpKSB7CisJCQkJcS0+dmFycy5xY291bnQgPSAwOworCQkJCXEtPnZhcnMucVIgPSByZWRfcmFuZG9tKHApOwogCiAJCQkJc2NoLT5xc3RhdHMub3ZlcmxpbWl0cysrOwogCQkJCWlmICghdXNlX2VjbihxKSB8fCAhSU5FVF9FQ05fc2V0X2NlKHNrYikpIHsKQEAgLTM3MCw3ICszMjAsNyBAQAogCQkJCXEtPnN0YXRzLnByb2JfbWFyaysrOwogCQkJfQogCQl9IGVsc2UKLQkJCXAtPnFSID0gcmVkX3JhbmRvbShwKTsKKwkJCXEtPnZhcnMucVIgPSByZWRfcmFuZG9tKHApOwogCX0KIAogCS8qIEFkbWl0IG5ldyBwYWNrZXQgKi8KQEAgLTQwNCw4ICszNTQsOCBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAKIAlpZiAocS0+aGVhZCA9PSBxLT50YWlsKSB7Ci0JCWlmICghcmVkX2lzX2lkbGluZygmcS0+cGFybXMpKQotCQkJcmVkX3N0YXJ0X29mX2lkbGVfcGVyaW9kKCZxLT5wYXJtcyk7CisJCWlmICghcmVkX2lzX2lkbGluZygmcS0+dmFycykpCisJCQlyZWRfc3RhcnRfb2ZfaWRsZV9wZXJpb2QoJnEtPnZhcnMpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKQEAgLTQyOCw4ICszNzgsOCBAQAogCWlmIChsZW4gPiAwKQogCQlxLT5zdGF0cy5vdGhlcisrOwogCWVsc2UgewotCQlpZiAoIXJlZF9pc19pZGxpbmcoJnEtPnBhcm1zKSkKLQkJCXJlZF9zdGFydF9vZl9pZGxlX3BlcmlvZCgmcS0+cGFybXMpOworCQlpZiAoIXJlZF9pc19pZGxpbmcoJnEtPnZhcnMpKQorCQkJcmVkX3N0YXJ0X29mX2lkbGVfcGVyaW9kKCZxLT52YXJzKTsKIAl9CiAKIAlyZXR1cm4gbGVuOwpAQCAtNDM5LDEyICszODksMTMgQEAKIHsKIAlzdHJ1Y3QgY2hva2Vfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAotCXJlZF9yZXN0YXJ0KCZxLT5wYXJtcyk7CisJcmVkX3Jlc3RhcnQoJnEtPnZhcnMpOwogfQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IG5sYV9wb2xpY3kgY2hva2VfcG9saWN5W1RDQV9DSE9LRV9NQVggKyAxXSA9IHsKIAlbVENBX0NIT0tFX1BBUk1TXQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgdGNfcmVkX3FvcHQpIH0sCiAJW1RDQV9DSE9LRV9TVEFCXQk9IHsgLmxlbiA9IFJFRF9TVEFCX1NJWkUgfSwKKwlbVENBX0NIT0tFX01BWF9QXQk9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiB9OwogCiAKQEAgLTQ2Niw2ICs0MTcsNyBAQAogCWludCBlcnI7CiAJc3RydWN0IHNrX2J1ZmYgKipvbGQgPSBOVUxMOwogCXVuc2lnbmVkIGludCBtYXNrOworCXUzMiBtYXhfUDsKIAogCWlmIChvcHQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00NzgsNiArNDMwLDggQEAKIAkgICAgdGJbVENBX0NIT0tFX1NUQUJdID09IE5VTEwpCiAJCXJldHVybiAtRUlOVkFMOwogCisJbWF4X1AgPSB0YltUQ0FfQ0hPS0VfTUFYX1BdID8gbmxhX2dldF91MzIodGJbVENBX0NIT0tFX01BWF9QXSkgOiAwOworCiAJY3RsID0gbmxhX2RhdGEodGJbVENBX0NIT0tFX1BBUk1TXSk7CiAKIAlpZiAoY3RsLT5saW1pdCA+IENIT0tFX01BWF9RVUVVRSkKQEAgLTUyNywxMCArNDgxLDEyIEBACiAKIAlyZWRfc2V0X3Bhcm1zKCZxLT5wYXJtcywgY3RsLT5xdGhfbWluLCBjdGwtPnF0aF9tYXgsIGN0bC0+V2xvZywKIAkJICAgICAgY3RsLT5QbG9nLCBjdGwtPlNjZWxsX2xvZywKLQkJICAgICAgbmxhX2RhdGEodGJbVENBX0NIT0tFX1NUQUJdKSk7CisJCSAgICAgIG5sYV9kYXRhKHRiW1RDQV9DSE9LRV9TVEFCXSksCisJCSAgICAgIG1heF9QKTsKKwlyZWRfc2V0X3ZhcnMoJnEtPnZhcnMpOwogCiAJaWYgKHEtPmhlYWQgPT0gcS0+dGFpbCkKLQkJcmVkX2VuZF9vZl9pZGxlX3BlcmlvZCgmcS0+cGFybXMpOworCQlyZWRfZW5kX29mX2lkbGVfcGVyaW9kKCZxLT52YXJzKTsKIAogCXNjaF90cmVlX3VubG9jayhzY2gpOwogCWNob2tlX2ZyZWUob2xkKTsKQEAgLTU2MSw2ICs1MTcsNyBAQAogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAogCU5MQV9QVVQoc2tiLCBUQ0FfQ0hPS0VfUEFSTVMsIHNpemVvZihvcHQpLCAmb3B0KTsKKwlOTEFfUFVUX1UzMihza2IsIFRDQV9DSE9LRV9NQVhfUCwgcS0+cGFybXMubWF4X1ApOwogCXJldHVybiBubGFfbmVzdF9lbmQoc2tiLCBvcHRzKTsKIAogbmxhX3B1dF9mYWlsdXJlOgpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9nZW5lcmljLmMgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwppbmRleCA2OWZjYTI3Li42N2ZjNTczIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYworKysgYi9uZXQvc2NoZWQvc2NoX2dlbmVyaWMuYwpAQCAtNjAsNyArNjAsNyBAQAogCiAJCS8qIGNoZWNrIHRoZSByZWFzb24gb2YgcmVxdWV1aW5nIHdpdGhvdXQgdHggbG9jayBmaXJzdCAqLwogCQl0eHEgPSBuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYikpOwotCQlpZiAoIW5ldGlmX3R4X3F1ZXVlX2Zyb3plbl9vcl9zdG9wcGVkKHR4cSkpIHsKKwkJaWYgKCFuZXRpZl94bWl0X2Zyb3plbl9vcl9zdG9wcGVkKHR4cSkpIHsKIAkJCXEtPmdzb19za2IgPSBOVUxMOwogCQkJcS0+cS5xbGVuLS07CiAJCX0gZWxzZQpAQCAtMTIxLDcgKzEyMSw3IEBACiAJc3Bpbl91bmxvY2socm9vdF9sb2NrKTsKIAogCUhBUkRfVFhfTE9DSyhkZXYsIHR4cSwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlpZiAoIW5ldGlmX3R4X3F1ZXVlX2Zyb3plbl9vcl9zdG9wcGVkKHR4cSkpCisJaWYgKCFuZXRpZl94bWl0X2Zyb3plbl9vcl9zdG9wcGVkKHR4cSkpCiAJCXJldCA9IGRldl9oYXJkX3N0YXJ0X3htaXQoc2tiLCBkZXYsIHR4cSk7CiAKIAlIQVJEX1RYX1VOTE9DSyhkZXYsIHR4cSk7CkBAIC0xNDMsNyArMTQzLDcgQEAKIAkJcmV0ID0gZGV2X3JlcXVldWVfc2tiKHNrYiwgcSk7CiAJfQogCi0JaWYgKHJldCAmJiBuZXRpZl90eF9xdWV1ZV9mcm96ZW5fb3Jfc3RvcHBlZCh0eHEpKQorCWlmIChyZXQgJiYgbmV0aWZfeG1pdF9mcm96ZW5fb3Jfc3RvcHBlZCh0eHEpKQogCQlyZXQgPSAwOwogCiAJcmV0dXJuIHJldDsKQEAgLTI0MiwxMCArMjQyLDExIEBACiAJCQkJICogb2xkIGRldmljZSBkcml2ZXJzIHNldCBkZXYtPnRyYW5zX3N0YXJ0CiAJCQkJICovCiAJCQkJdHJhbnNfc3RhcnQgPSB0eHEtPnRyYW5zX3N0YXJ0ID8gOiBkZXYtPnRyYW5zX3N0YXJ0OwotCQkJCWlmIChuZXRpZl90eF9xdWV1ZV9zdG9wcGVkKHR4cSkgJiYKKwkJCQlpZiAobmV0aWZfeG1pdF9zdG9wcGVkKHR4cSkgJiYKIAkJCQkgICAgdGltZV9hZnRlcihqaWZmaWVzLCAodHJhbnNfc3RhcnQgKwogCQkJCQkJCSBkZXYtPndhdGNoZG9nX3RpbWVvKSkpIHsKIAkJCQkJc29tZV9xdWV1ZV90aW1lZG91dCA9IDE7CisJCQkJCXR4cS0+dHJhbnNfdGltZW91dCsrOwogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2dyZWQuYyBiL25ldC9zY2hlZC9zY2hfZ3JlZC5jCmluZGV4IGI5NDkzYTAuLjBiMTUyMzYgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfZ3JlZC5jCisrKyBiL25ldC9zY2hlZC9zY2hfZ3JlZC5jCkBAIC0zNCwxMyArMzQsMTQgQEAKIAogc3RydWN0IGdyZWRfc2NoZWRfZGF0YSB7CiAJdTMyCQlsaW1pdDsJCS8qIEhBUkQgbWF4aW1hbCBxdWV1ZSBsZW5ndGgJKi8KLQl1MzIgICAgICAJRFA7CQkvKiB0aGUgZHJvcCBwcmFtYXRlcnMgKi8KKwl1MzIJCURQOwkJLyogdGhlIGRyb3AgcGFyYW1ldGVycyAqLwogCXUzMgkJYnl0ZXNpbjsJLyogYnl0ZXMgc2VlbiBvbiB2aXJ0dWFsUSBzbyBmYXIqLwogCXUzMgkJcGFja2V0c2luOwkvKiBwYWNrZXRzIHNlZW4gb24gdmlydHVhbFEgc28gZmFyKi8KIAl1MzIJCWJhY2tsb2c7CS8qIGJ5dGVzIG9uIHRoZSB2aXJ0dWFsUSAqLwogCXU4CQlwcmlvOwkJLyogdGhlIHByaW8gb2YgdGhpcyB2cSAqLwogCiAJc3RydWN0IHJlZF9wYXJtcyBwYXJtczsKKwlzdHJ1Y3QgcmVkX3ZhcnMgIHZhcnM7CiAJc3RydWN0IHJlZF9zdGF0cyBzdGF0czsKIH07CiAKQEAgLTU1LDcgKzU2LDcgQEAKIAl1MzIJCXJlZF9mbGFnczsKIAl1MzIgCQlEUHM7CiAJdTMyIAkJZGVmOwotCXN0cnVjdCByZWRfcGFybXMgd3JlZF9zZXQ7CisJc3RydWN0IHJlZF92YXJzIHdyZWRfc2V0OwogfTsKIAogc3RhdGljIGlubGluZSBpbnQgZ3JlZF93cmVkX21vZGUoc3RydWN0IGdyZWRfc2NoZWQgKnRhYmxlKQpAQCAtMTI1LDE3ICsxMjYsMTcgQEAKIAlyZXR1cm4gc2tiLT50Y19pbmRleCAmIEdSRURfVlFfTUFTSzsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGdyZWRfbG9hZF93cmVkX3NldChzdHJ1Y3QgZ3JlZF9zY2hlZCAqdGFibGUsCitzdGF0aWMgaW5saW5lIHZvaWQgZ3JlZF9sb2FkX3dyZWRfc2V0KGNvbnN0IHN0cnVjdCBncmVkX3NjaGVkICp0YWJsZSwKIAkJCQkgICAgICBzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhICpxKQogewotCXEtPnBhcm1zLnFhdmcgPSB0YWJsZS0+d3JlZF9zZXQucWF2ZzsKLQlxLT5wYXJtcy5xaWRsZXN0YXJ0ID0gdGFibGUtPndyZWRfc2V0LnFpZGxlc3RhcnQ7CisJcS0+dmFycy5xYXZnID0gdGFibGUtPndyZWRfc2V0LnFhdmc7CisJcS0+dmFycy5xaWRsZXN0YXJ0ID0gdGFibGUtPndyZWRfc2V0LnFpZGxlc3RhcnQ7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBncmVkX3N0b3JlX3dyZWRfc2V0KHN0cnVjdCBncmVkX3NjaGVkICp0YWJsZSwKIAkJCQkgICAgICAgc3RydWN0IGdyZWRfc2NoZWRfZGF0YSAqcSkKIHsKLQl0YWJsZS0+d3JlZF9zZXQucWF2ZyA9IHEtPnBhcm1zLnFhdmc7CisJdGFibGUtPndyZWRfc2V0LnFhdmcgPSBxLT52YXJzLnFhdmc7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdyZWRfdXNlX2VjbihzdHJ1Y3QgZ3JlZF9zY2hlZCAqdCkKQEAgLTE3MCw3ICsxNzEsNyBAQAogCQkJCWdvdG8gZHJvcDsKIAkJfQogCi0JCS8qIGZpeCB0Y19pbmRleD8gLS1jb3VsZCBiZSBjb250cm92ZXNpYWwgYnV0IG5lZWRlZCBmb3IKKwkJLyogZml4IHRjX2luZGV4PyAtLWNvdWxkIGJlIGNvbnRyb3ZlcnNpYWwgYnV0IG5lZWRlZCBmb3IKIAkJICAgcmVxdWV1ZWluZyAqLwogCQlza2ItPnRjX2luZGV4ID0gKHNrYi0+dGNfaW5kZXggJiB+R1JFRF9WUV9NQVNLKSB8IGRwOwogCX0KQEAgLTE4MSw4ICsxODIsOCBAQAogCiAJCWZvciAoaSA9IDA7IGkgPCB0LT5EUHM7IGkrKykgewogCQkJaWYgKHQtPnRhYltpXSAmJiB0LT50YWJbaV0tPnByaW8gPCBxLT5wcmlvICYmCi0JCQkgICAgIXJlZF9pc19pZGxpbmcoJnQtPnRhYltpXS0+cGFybXMpKQotCQkJCXFhdmcgKz0gdC0+dGFiW2ldLT5wYXJtcy5xYXZnOworCQkJICAgICFyZWRfaXNfaWRsaW5nKCZ0LT50YWJbaV0tPnZhcnMpKQorCQkJCXFhdmcgKz0gdC0+dGFiW2ldLT52YXJzLnFhdmc7CiAJCX0KIAogCX0KQEAgLTE5MywxNSArMTk0LDE3IEBACiAJaWYgKGdyZWRfd3JlZF9tb2RlKHQpKQogCQlncmVkX2xvYWRfd3JlZF9zZXQodCwgcSk7CiAKLQlxLT5wYXJtcy5xYXZnID0gcmVkX2NhbGNfcWF2ZygmcS0+cGFybXMsIGdyZWRfYmFja2xvZyh0LCBxLCBzY2gpKTsKKwlxLT52YXJzLnFhdmcgPSByZWRfY2FsY19xYXZnKCZxLT5wYXJtcywKKwkJCQkgICAgICZxLT52YXJzLAorCQkJCSAgICAgZ3JlZF9iYWNrbG9nKHQsIHEsIHNjaCkpOwogCi0JaWYgKHJlZF9pc19pZGxpbmcoJnEtPnBhcm1zKSkKLQkJcmVkX2VuZF9vZl9pZGxlX3BlcmlvZCgmcS0+cGFybXMpOworCWlmIChyZWRfaXNfaWRsaW5nKCZxLT52YXJzKSkKKwkJcmVkX2VuZF9vZl9pZGxlX3BlcmlvZCgmcS0+dmFycyk7CiAKIAlpZiAoZ3JlZF93cmVkX21vZGUodCkpCiAJCWdyZWRfc3RvcmVfd3JlZF9zZXQodCwgcSk7CiAKLQlzd2l0Y2ggKHJlZF9hY3Rpb24oJnEtPnBhcm1zLCBxLT5wYXJtcy5xYXZnICsgcWF2ZykpIHsKKwlzd2l0Y2ggKHJlZF9hY3Rpb24oJnEtPnBhcm1zLCAmcS0+dmFycywgcS0+dmFycy5xYXZnICsgcWF2ZykpIHsKIAljYXNlIFJFRF9ET05UX01BUks6CiAJCWJyZWFrOwogCkBAIC0yNjAsNyArMjYzLDcgQEAKIAkJCXEtPmJhY2tsb2cgLT0gcWRpc2NfcGt0X2xlbihza2IpOwogCiAJCQlpZiAoIXEtPmJhY2tsb2cgJiYgIWdyZWRfd3JlZF9tb2RlKHQpKQotCQkJCXJlZF9zdGFydF9vZl9pZGxlX3BlcmlvZCgmcS0+cGFybXMpOworCQkJCXJlZF9zdGFydF9vZl9pZGxlX3BlcmlvZCgmcS0+dmFycyk7CiAJCX0KIAogCQlyZXR1cm4gc2tiOwpAQCAtMjkzLDcgKzI5Niw3IEBACiAJCQlxLT5zdGF0cy5vdGhlcisrOwogCiAJCQlpZiAoIXEtPmJhY2tsb2cgJiYgIWdyZWRfd3JlZF9tb2RlKHQpKQotCQkJCXJlZF9zdGFydF9vZl9pZGxlX3BlcmlvZCgmcS0+cGFybXMpOworCQkJCXJlZF9zdGFydF9vZl9pZGxlX3BlcmlvZCgmcS0+dmFycyk7CiAJCX0KIAogCQlxZGlzY19kcm9wKHNrYiwgc2NoKTsKQEAgLTMyMCw3ICszMjMsNyBAQAogCQlpZiAoIXEpCiAJCQljb250aW51ZTsKIAotCQlyZWRfcmVzdGFydCgmcS0+cGFybXMpOworCQlyZWRfcmVzdGFydCgmcS0+dmFycyk7CiAJCXEtPmJhY2tsb2cgPSAwOwogCX0KIH0KQEAgLTM3OSwyOSArMzgyLDMxIEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IGdyZWRfY2hhbmdlX3ZxKHN0cnVjdCBRZGlzYyAqc2NoLCBpbnQgZHAsCi0JCQkJIHN0cnVjdCB0Y19ncmVkX3FvcHQgKmN0bCwgaW50IHByaW8sIHU4ICpzdGFiKQorCQkJCSBzdHJ1Y3QgdGNfZ3JlZF9xb3B0ICpjdGwsIGludCBwcmlvLAorCQkJCSB1OCAqc3RhYiwgdTMyIG1heF9QLAorCQkJCSBzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhICoqcHJlYWxsb2MpCiB7CiAJc3RydWN0IGdyZWRfc2NoZWQgKnRhYmxlID0gcWRpc2NfcHJpdihzY2gpOwotCXN0cnVjdCBncmVkX3NjaGVkX2RhdGEgKnE7CisJc3RydWN0IGdyZWRfc2NoZWRfZGF0YSAqcSA9IHRhYmxlLT50YWJbZHBdOwogCi0JaWYgKHRhYmxlLT50YWJbZHBdID09IE5VTEwpIHsKLQkJdGFibGUtPnRhYltkcF0gPSBremFsbG9jKHNpemVvZigqcSksIEdGUF9LRVJORUwpOwotCQlpZiAodGFibGUtPnRhYltkcF0gPT0gTlVMTCkKKwlpZiAoIXEpIHsKKwkJdGFibGUtPnRhYltkcF0gPSBxID0gKnByZWFsbG9jOworCQkqcHJlYWxsb2MgPSBOVUxMOworCQlpZiAoIXEpCiAJCQlyZXR1cm4gLUVOT01FTTsKIAl9CiAKLQlxID0gdGFibGUtPnRhYltkcF07CiAJcS0+RFAgPSBkcDsKIAlxLT5wcmlvID0gcHJpbzsKIAlxLT5saW1pdCA9IGN0bC0+bGltaXQ7CiAKIAlpZiAocS0+YmFja2xvZyA9PSAwKQotCQlyZWRfZW5kX29mX2lkbGVfcGVyaW9kKCZxLT5wYXJtcyk7CisJCXJlZF9lbmRfb2ZfaWRsZV9wZXJpb2QoJnEtPnZhcnMpOwogCiAJcmVkX3NldF9wYXJtcygmcS0+cGFybXMsCiAJCSAgICAgIGN0bC0+cXRoX21pbiwgY3RsLT5xdGhfbWF4LCBjdGwtPldsb2csIGN0bC0+UGxvZywKLQkJICAgICAgY3RsLT5TY2VsbF9sb2csIHN0YWIpOwotCisJCSAgICAgIGN0bC0+U2NlbGxfbG9nLCBzdGFiLCBtYXhfUCk7CisJcmVkX3NldF92YXJzKCZxLT52YXJzKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDA5LDYgKzQxNCw3IEBACiAJW1RDQV9HUkVEX1BBUk1TXQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgdGNfZ3JlZF9xb3B0KSB9LAogCVtUQ0FfR1JFRF9TVEFCXQkJPSB7IC5sZW4gPSAyNTYgfSwKIAlbVENBX0dSRURfRFBTXQkJPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IHRjX2dyZWRfc29wdCkgfSwKKwlbVENBX0dSRURfTUFYX1BdCT0geyAudHlwZSA9IE5MQV9VMzIgfSwKIH07CiAKIHN0YXRpYyBpbnQgZ3JlZF9jaGFuZ2Uoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBubGF0dHIgKm9wdCkKQEAgLTQxOCw2ICs0MjQsOCBAQAogCXN0cnVjdCBubGF0dHIgKnRiW1RDQV9HUkVEX01BWCArIDFdOwogCWludCBlcnIsIHByaW8gPSBHUkVEX0RFRl9QUklPOwogCXU4ICpzdGFiOworCXUzMiBtYXhfUDsKKwlzdHJ1Y3QgZ3JlZF9zY2hlZF9kYXRhICpwcmVhbGxvYzsKIAogCWlmIChvcHQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC00MzMsNiArNDQxLDggQEAKIAkgICAgdGJbVENBX0dSRURfU1RBQl0gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwltYXhfUCA9IHRiW1RDQV9HUkVEX01BWF9QXSA/IG5sYV9nZXRfdTMyKHRiW1RDQV9HUkVEX01BWF9QXSkgOiAwOworCiAJZXJyID0gLUVJTlZBTDsKIAljdGwgPSBubGFfZGF0YSh0YltUQ0FfR1JFRF9QQVJNU10pOwogCXN0YWIgPSBubGFfZGF0YSh0YltUQ0FfR1JFRF9TVEFCXSk7CkBAIC00NTUsOSArNDY1LDEwIEBACiAJCQlwcmlvID0gY3RsLT5wcmlvOwogCX0KIAorCXByZWFsbG9jID0ga3phbGxvYyhzaXplb2YoKnByZWFsbG9jKSwgR0ZQX0tFUk5FTCk7CiAJc2NoX3RyZWVfbG9jayhzY2gpOwogCi0JZXJyID0gZ3JlZF9jaGFuZ2VfdnEoc2NoLCBjdGwtPkRQLCBjdGwsIHByaW8sIHN0YWIpOworCWVyciA9IGdyZWRfY2hhbmdlX3ZxKHNjaCwgY3RsLT5EUCwgY3RsLCBwcmlvLCBzdGFiLCBtYXhfUCwgJnByZWFsbG9jKTsKIAlpZiAoZXJyIDwgMCkKIAkJZ290byBlcnJvdXRfbG9ja2VkOwogCkBAIC00NzEsNiArNDgyLDcgQEAKIAogZXJyb3V0X2xvY2tlZDoKIAlzY2hfdHJlZV91bmxvY2soc2NoKTsKKwlrZnJlZShwcmVhbGxvYyk7CiBlcnJvdXQ6CiAJcmV0dXJuIGVycjsKIH0KQEAgLTQ5OCw2ICs1MTAsNyBAQAogCXN0cnVjdCBncmVkX3NjaGVkICp0YWJsZSA9IHFkaXNjX3ByaXYoc2NoKTsKIAlzdHJ1Y3QgbmxhdHRyICpwYXJtcywgKm9wdHMgPSBOVUxMOwogCWludCBpOworCXUzMiBtYXhfcFtNQVhfRFBzXTsKIAlzdHJ1Y3QgdGNfZ3JlZF9zb3B0IHNvcHQgPSB7CiAJCS5EUHMJPSB0YWJsZS0+RFBzLAogCQkuZGVmX0RQCT0gdGFibGUtPmRlZiwKQEAgLTUwOSw2ICs1MjIsMTQgQEAKIAlpZiAob3B0cyA9PSBOVUxMKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAlOTEFfUFVUKHNrYiwgVENBX0dSRURfRFBTLCBzaXplb2Yoc29wdCksICZzb3B0KTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRFBzOyBpKyspIHsKKwkJc3RydWN0IGdyZWRfc2NoZWRfZGF0YSAqcSA9IHRhYmxlLT50YWJbaV07CisKKwkJbWF4X3BbaV0gPSBxID8gcS0+cGFybXMubWF4X1AgOiAwOworCX0KKwlOTEFfUFVUKHNrYiwgVENBX0dSRURfTUFYX1AsIHNpemVvZihtYXhfcCksIG1heF9wKTsKKwogCXBhcm1zID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBUQ0FfR1JFRF9QQVJNUyk7CiAJaWYgKHBhcm1zID09IE5VTEwpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwpAQCAtNTQ1LDEyICs1NjYsMTIgQEAKIAkJb3B0LmJ5dGVzaW4JPSBxLT5ieXRlc2luOwogCiAJCWlmIChncmVkX3dyZWRfbW9kZSh0YWJsZSkpIHsKLQkJCXEtPnBhcm1zLnFpZGxlc3RhcnQgPQotCQkJCXRhYmxlLT50YWJbdGFibGUtPmRlZl0tPnBhcm1zLnFpZGxlc3RhcnQ7Ci0JCQlxLT5wYXJtcy5xYXZnID0gdGFibGUtPnRhYlt0YWJsZS0+ZGVmXS0+cGFybXMucWF2ZzsKKwkJCXEtPnZhcnMucWlkbGVzdGFydCA9CisJCQkJdGFibGUtPnRhYlt0YWJsZS0+ZGVmXS0+dmFycy5xaWRsZXN0YXJ0OworCQkJcS0+dmFycy5xYXZnID0gdGFibGUtPnRhYlt0YWJsZS0+ZGVmXS0+dmFycy5xYXZnOwogCQl9CiAKLQkJb3B0LnFhdmUgPSByZWRfY2FsY19xYXZnKCZxLT5wYXJtcywgcS0+cGFybXMucWF2Zyk7CisJCW9wdC5xYXZlID0gcmVkX2NhbGNfcWF2ZygmcS0+cGFybXMsICZxLT52YXJzLCBxLT52YXJzLnFhdmcpOwogCiBhcHBlbmRfb3B0OgogCQlpZiAobmxhX2FwcGVuZChza2IsIHNpemVvZihvcHQpLCAmb3B0KSA8IDApCmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX2hmc2MuYyBiL25ldC9zY2hlZC9zY2hfaGZzYy5jCmluZGV4IDY0ODhlNjQuLjliZGNhMmUgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfaGZzYy5jCisrKyBiL25ldC9zY2hlZC9zY2hfaGZzYy5jCkBAIC0xMzY4LDYgKzEzNjgsNyBAQAogCXN0cnVjdCB0Y19oZnNjX3N0YXRzIHhzdGF0czsKIAogCWNsLT5xc3RhdHMucWxlbiA9IGNsLT5xZGlzYy0+cS5xbGVuOworCWNsLT5xc3RhdHMuYmFja2xvZyA9IGNsLT5xZGlzYy0+cXN0YXRzLmJhY2tsb2c7CiAJeHN0YXRzLmxldmVsICAgPSBjbC0+bGV2ZWw7CiAJeHN0YXRzLnBlcmlvZCAgPSBjbC0+Y2xfdnRwZXJpb2Q7CiAJeHN0YXRzLndvcmsgICAgPSBjbC0+Y2xfdG90YWw7CkBAIC0xNTYxLDYgKzE1NjIsMTUgQEAKIAlzdHJ1Y3QgaGZzY19zY2hlZCAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwogCXN0cnVjdCB0Y19oZnNjX3FvcHQgcW9wdDsKKwlzdHJ1Y3QgaGZzY19jbGFzcyAqY2w7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisJdW5zaWduZWQgaW50IGk7CisKKwlzY2gtPnFzdGF0cy5iYWNrbG9nID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgcS0+Y2xoYXNoLmhhc2hzaXplOyBpKyspIHsKKwkJaGxpc3RfZm9yX2VhY2hfZW50cnkoY2wsIG4sICZxLT5jbGhhc2guaGFzaFtpXSwgY2xfY29tbW9uLmhub2RlKQorCQkJc2NoLT5xc3RhdHMuYmFja2xvZyArPSBjbC0+cWRpc2MtPnFzdGF0cy5iYWNrbG9nOworCX0KIAogCXFvcHQuZGVmY2xzID0gcS0+ZGVmY2xzOwogCU5MQV9QVVQoc2tiLCBUQ0FfT1BUSU9OUywgc2l6ZW9mKHFvcHQpLCAmcW9wdCk7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX21xcHJpby5jIGIvbmV0L3NjaGVkL3NjaF9tcXByaW8uYwppbmRleCBmODgyNTZjLi4yOGRlNDMwIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX21xcHJpby5jCisrKyBiL25ldC9zY2hlZC9zY2hfbXFwcmlvLmMKQEAgLTEwNyw3ICsxMDcsNyBAQAogCWlmICghbmV0aWZfaXNfbXVsdGlxdWV1ZShkZXYpKQogCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKLQlpZiAobmxhX2xlbihvcHQpIDwgc2l6ZW9mKCpxb3B0KSkKKwlpZiAoIW9wdCB8fCBubGFfbGVuKG9wdCkgPCBzaXplb2YoKnFvcHQpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAogCXFvcHQgPSBubGFfZGF0YShvcHQpOwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9tdWx0aXEuYyBiL25ldC9zY2hlZC9zY2hfbXVsdGlxLmMKaW5kZXggZWRjMTk1MC4uNDkxMzFkNyAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9tdWx0aXEuYworKysgYi9uZXQvc2NoZWQvc2NoX211bHRpcS5jCkBAIC0xMDcsNyArMTA3LDggQEAKIAkJLyogQ2hlY2sgdGhhdCB0YXJnZXQgc3VicXVldWUgaXMgYXZhaWxhYmxlIGJlZm9yZQogCQkgKiBwdWxsaW5nIGFuIHNrYiB0byBhdm9pZCBoZWFkLW9mLWxpbmUgYmxvY2tpbmcuCiAJCSAqLwotCQlpZiAoIV9fbmV0aWZfc3VicXVldWVfc3RvcHBlZChxZGlzY19kZXYoc2NoKSwgcS0+Y3VyYmFuZCkpIHsKKwkJaWYgKCFuZXRpZl94bWl0X3N0b3BwZWQoCisJCSAgICBuZXRkZXZfZ2V0X3R4X3F1ZXVlKHFkaXNjX2RldihzY2gpLCBxLT5jdXJiYW5kKSkpIHsKIAkJCXFkaXNjID0gcS0+cXVldWVzW3EtPmN1cmJhbmRdOwogCQkJc2tiID0gcWRpc2MtPmRlcXVldWUocWRpc2MpOwogCQkJaWYgKHNrYikgewpAQCAtMTM4LDcgKzEzOSw4IEBACiAJCS8qIENoZWNrIHRoYXQgdGFyZ2V0IHN1YnF1ZXVlIGlzIGF2YWlsYWJsZSBiZWZvcmUKIAkJICogcHVsbGluZyBhbiBza2IgdG8gYXZvaWQgaGVhZC1vZi1saW5lIGJsb2NraW5nLgogCQkgKi8KLQkJaWYgKCFfX25ldGlmX3N1YnF1ZXVlX3N0b3BwZWQocWRpc2NfZGV2KHNjaCksIGN1cmJhbmQpKSB7CisJCWlmICghbmV0aWZfeG1pdF9zdG9wcGVkKAorCQkgICAgbmV0ZGV2X2dldF90eF9xdWV1ZShxZGlzY19kZXYoc2NoKSwgY3VyYmFuZCkpKSB7CiAJCQlxZGlzYyA9IHEtPnF1ZXVlc1tjdXJiYW5kXTsKIAkJCXNrYiA9IHFkaXNjLT5vcHMtPnBlZWsocWRpc2MpOwogCQkJaWYgKHNrYikKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfbmV0ZW0uYyBiL25ldC9zY2hlZC9zY2hfbmV0ZW0uYwppbmRleCBlYjNiOWE4Li5lN2UxZDBiIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX25ldGVtLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9uZXRlbS5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlY2lwcm9jYWxfZGl2Lmg+CiAKICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9wa3Rfc2NoZWQuaD4KQEAgLTY2LDcgKzY3LDExIEBACiAqLwogCiBzdHJ1Y3QgbmV0ZW1fc2NoZWRfZGF0YSB7CisJLyogaW50ZXJuYWwgdChpbWUpZmlmbyBxZGlzYyB1c2VzIHNjaC0+cSBhbmQgc2NoLT5saW1pdCAqLworCisJLyogb3B0aW9uYWwgcWRpc2MgZm9yIGNsYXNzZnVsIGhhbmRsaW5nIChOVUxMIGF0IG5ldGVtIGluaXQpICovCiAJc3RydWN0IFFkaXNjCSpxZGlzYzsKKwogCXN0cnVjdCBxZGlzY193YXRjaGRvZyB3YXRjaGRvZzsKIAogCXBzY2hlZF90ZGlmZl90IGxhdGVuY3k7CkBAIC03OSw2ICs4NCwxMSBAQAogCXUzMiBkdXBsaWNhdGU7CiAJdTMyIHJlb3JkZXI7CiAJdTMyIGNvcnJ1cHQ7CisJdTMyIHJhdGU7CisJczMyIHBhY2tldF9vdmVyaGVhZDsKKwl1MzIgY2VsbF9zaXplOworCXUzMiBjZWxsX3NpemVfcmVjaXByb2NhbDsKKwlzMzIgY2VsbF9vdmVyaGVhZDsKIAogCXN0cnVjdCBjcm5kc3RhdGUgewogCQl1MzIgbGFzdDsKQEAgLTExMSw3ICsxMjEsOSBAQAogCiB9OwogCi0vKiBUaW1lIHN0YW1wIHB1dCBpbnRvIHNvY2tldCBidWZmZXIgY29udHJvbCBibG9jayAqLworLyogVGltZSBzdGFtcCBwdXQgaW50byBzb2NrZXQgYnVmZmVyIGNvbnRyb2wgYmxvY2sKKyAqIE9ubHkgdmFsaWQgd2hlbiBza2JzIGFyZSBpbiBvdXIgaW50ZXJuYWwgdChpbWUpZmlmbyBxdWV1ZS4KKyAqLwogc3RydWN0IG5ldGVtX3NrYl9jYiB7CiAJcHNjaGVkX3RpbWVfdAl0aW1lX3RvX3NlbmQ7CiB9OwpAQCAtMjk4LDYgKzMxMCw1MSBAQAogCXJldHVybiAgeCAvIE5FVEVNX0RJU1RfU0NBTEUgKyAoc2lnbWEgLyBORVRFTV9ESVNUX1NDQUxFKSAqIHQgKyBtdTsKIH0KIAorc3RhdGljIHBzY2hlZF90aW1lX3QgcGFja2V0X2xlbl8yX3NjaGVkX3RpbWUodW5zaWduZWQgaW50IGxlbiwgc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgKnEpCit7CisJdTY0IHRpY2tzOworCisJbGVuICs9IHEtPnBhY2tldF9vdmVyaGVhZDsKKworCWlmIChxLT5jZWxsX3NpemUpIHsKKwkJdTMyIGNlbGxzID0gcmVjaXByb2NhbF9kaXZpZGUobGVuLCBxLT5jZWxsX3NpemVfcmVjaXByb2NhbCk7CisKKwkJaWYgKGxlbiA+IGNlbGxzICogcS0+Y2VsbF9zaXplKQkvKiBleHRyYSBjZWxsIG5lZWRlZCBmb3IgcmVtYWluZGVyICovCisJCQljZWxscysrOworCQlsZW4gPSBjZWxscyAqIChxLT5jZWxsX3NpemUgKyBxLT5jZWxsX292ZXJoZWFkKTsKKwl9CisKKwl0aWNrcyA9ICh1NjQpbGVuICogTlNFQ19QRVJfU0VDOworCisJZG9fZGl2KHRpY2tzLCBxLT5yYXRlKTsKKwlyZXR1cm4gUFNDSEVEX05TMlRJQ0tTKHRpY2tzKTsKK30KKworc3RhdGljIGludCB0Zmlmb19lbnF1ZXVlKHN0cnVjdCBza19idWZmICpuc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gJnNjaC0+cTsKKwlwc2NoZWRfdGltZV90IHRuZXh0ID0gbmV0ZW1fc2tiX2NiKG5za2IpLT50aW1lX3RvX3NlbmQ7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKworCWlmIChsaWtlbHkoc2tiX3F1ZXVlX2xlbihsaXN0KSA8IHNjaC0+bGltaXQpKSB7CisJCXNrYiA9IHNrYl9wZWVrX3RhaWwobGlzdCk7CisJCS8qIE9wdGltaXplIGZvciBhZGQgYXQgdGFpbCAqLworCQlpZiAobGlrZWx5KCFza2IgfHwgdG5leHQgPj0gbmV0ZW1fc2tiX2NiKHNrYiktPnRpbWVfdG9fc2VuZCkpCisJCQlyZXR1cm4gcWRpc2NfZW5xdWV1ZV90YWlsKG5za2IsIHNjaCk7CisKKwkJc2tiX3F1ZXVlX3JldmVyc2Vfd2FsayhsaXN0LCBza2IpIHsKKwkJCWlmICh0bmV4dCA+PSBuZXRlbV9za2JfY2Ioc2tiKS0+dGltZV90b19zZW5kKQorCQkJCWJyZWFrOworCQl9CisKKwkJX19za2JfcXVldWVfYWZ0ZXIobGlzdCwgc2tiLCBuc2tiKTsKKwkJc2NoLT5xc3RhdHMuYmFja2xvZyArPSBxZGlzY19wa3RfbGVuKG5za2IpOworCQlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKKwl9CisKKwlyZXR1cm4gcWRpc2NfcmVzaGFwZV9mYWlsKG5za2IsIHNjaCk7Cit9CisKIC8qCiAgKiBJbnNlcnQgb25lIHNrYiBpbnRvIHFkaXNjLgogICogTm90ZTogcGFyZW50IGRlcGVuZHMgb24gcmV0dXJuIHZhbHVlIHRvIGFjY291bnQgZm9yIHF1ZXVlIGxlbmd0aC4KQEAgLTM3MSw5ICs0MjgsMjcgQEAKIAkJCQkgICZxLT5kZWxheV9jb3IsIHEtPmRlbGF5X2Rpc3QpOwogCiAJCW5vdyA9IHBzY2hlZF9nZXRfdGltZSgpOworCisJCWlmIChxLT5yYXRlKSB7CisJCQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gJnNjaC0+cTsKKworCQkJZGVsYXkgKz0gcGFja2V0X2xlbl8yX3NjaGVkX3RpbWUoc2tiLT5sZW4sIHEpOworCisJCQlpZiAoIXNrYl9xdWV1ZV9lbXB0eShsaXN0KSkgeworCQkJCS8qCisJCQkJICogTGFzdCBwYWNrZXQgaW4gcXVldWUgaXMgcmVmZXJlbmNlIHBvaW50IChub3cpLgorCQkJCSAqIEZpcnN0IHBhY2tldCBpbiBxdWV1ZSBpcyBhbHJlYWR5IGluIGZsaWdodCwKKwkJCQkgKiBjYWxjdWxhdGUgdGhpcyB0aW1lIGJvbnVzIGFuZCBzdWJzdHJhY3QKKwkJCQkgKiBmcm9tIGRlbGF5LgorCQkJCSAqLworCQkJCWRlbGF5IC09IG5vdyAtIG5ldGVtX3NrYl9jYihza2JfcGVlayhsaXN0KSktPnRpbWVfdG9fc2VuZDsKKwkJCQlub3cgPSBuZXRlbV9za2JfY2Ioc2tiX3BlZWtfdGFpbChsaXN0KSktPnRpbWVfdG9fc2VuZDsKKwkJCX0KKwkJfQorCiAJCWNiLT50aW1lX3RvX3NlbmQgPSBub3cgKyBkZWxheTsKIAkJKytxLT5jb3VudGVyOwotCQlyZXQgPSBxZGlzY19lbnF1ZXVlKHNrYiwgcS0+cWRpc2MpOworCQlyZXQgPSB0Zmlmb19lbnF1ZXVlKHNrYiwgc2NoKTsKIAl9IGVsc2UgewogCQkvKgogCQkgKiBEbyByZS1vcmRlcmluZyBieSBwdXR0aW5nIG9uZSBvdXQgb2YgTiBwYWNrZXRzIGF0IHRoZSBmcm9udApAQCAtMzgyLDkgKzQ1Nyw5IEBACiAJCWNiLT50aW1lX3RvX3NlbmQgPSBwc2NoZWRfZ2V0X3RpbWUoKTsKIAkJcS0+Y291bnRlciA9IDA7CiAKLQkJX19za2JfcXVldWVfaGVhZCgmcS0+cWRpc2MtPnEsIHNrYik7Ci0JCXEtPnFkaXNjLT5xc3RhdHMuYmFja2xvZyArPSBxZGlzY19wa3RfbGVuKHNrYik7Ci0JCXEtPnFkaXNjLT5xc3RhdHMucmVxdWV1ZXMrKzsKKwkJX19za2JfcXVldWVfaGVhZCgmc2NoLT5xLCBza2IpOworCQlzY2gtPnFzdGF0cy5iYWNrbG9nICs9IHFkaXNjX3BrdF9sZW4oc2tiKTsKKwkJc2NoLT5xc3RhdHMucmVxdWV1ZXMrKzsKIAkJcmV0ID0gTkVUX1hNSVRfU1VDQ0VTUzsKIAl9CiAKQEAgLTM5NSwxOSArNDcwLDIwIEBACiAJCX0KIAl9CiAKLQlzY2gtPnEucWxlbisrOwogCXJldHVybiBORVRfWE1JVF9TVUNDRVNTOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IG5ldGVtX2Ryb3Aoc3RydWN0IFFkaXNjICpzY2gpCiB7CiAJc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7Ci0JdW5zaWduZWQgaW50IGxlbiA9IDA7CisJdW5zaWduZWQgaW50IGxlbjsKIAotCWlmIChxLT5xZGlzYy0+b3BzLT5kcm9wICYmIChsZW4gPSBxLT5xZGlzYy0+b3BzLT5kcm9wKHEtPnFkaXNjKSkgIT0gMCkgewotCQlzY2gtPnEucWxlbi0tOworCWxlbiA9IHFkaXNjX3F1ZXVlX2Ryb3Aoc2NoKTsKKwlpZiAoIWxlbiAmJiBxLT5xZGlzYyAmJiBxLT5xZGlzYy0+b3BzLT5kcm9wKQorCSAgICBsZW4gPSBxLT5xZGlzYy0+b3BzLT5kcm9wKHEtPnFkaXNjKTsKKwlpZiAobGVuKQogCQlzY2gtPnFzdGF0cy5kcm9wcysrOwotCX0KKwogCXJldHVybiBsZW47CiB9CiAKQEAgLTQxOSwxNiArNDk1LDE2IEBACiAJaWYgKHFkaXNjX2lzX3Rocm90dGxlZChzY2gpKQogCQlyZXR1cm4gTlVMTDsKIAotCXNrYiA9IHEtPnFkaXNjLT5vcHMtPnBlZWsocS0+cWRpc2MpOwordGZpZm9fZGVxdWV1ZToKKwlza2IgPSBxZGlzY19wZWVrX2hlYWQoc2NoKTsKIAlpZiAoc2tiKSB7CiAJCWNvbnN0IHN0cnVjdCBuZXRlbV9za2JfY2IgKmNiID0gbmV0ZW1fc2tiX2NiKHNrYik7Ci0JCXBzY2hlZF90aW1lX3Qgbm93ID0gcHNjaGVkX2dldF90aW1lKCk7CiAKIAkJLyogaWYgbW9yZSB0aW1lIHJlbWFpbmluZz8gKi8KLQkJaWYgKGNiLT50aW1lX3RvX3NlbmQgPD0gbm93KSB7Ci0JCQlza2IgPSBxZGlzY19kZXF1ZXVlX3BlZWtlZChxLT5xZGlzYyk7CisJCWlmIChjYi0+dGltZV90b19zZW5kIDw9IHBzY2hlZF9nZXRfdGltZSgpKSB7CisJCQlza2IgPSBxZGlzY19kZXF1ZXVlX3RhaWwoc2NoKTsKIAkJCWlmICh1bmxpa2VseSghc2tiKSkKLQkJCQlyZXR1cm4gTlVMTDsKKwkJCQlnb3RvIHFkaXNjX2RlcXVldWU7CiAKICNpZmRlZiBDT05GSUdfTkVUX0NMU19BQ1QKIAkJCS8qCkBAIC00MzksMTUgKzUxNSwzNyBAQAogCQkJCXNrYi0+dHN0YW1wLnR2NjQgPSAwOwogI2VuZGlmCiAKLQkJCXNjaC0+cS5xbGVuLS07CisJCQlpZiAocS0+cWRpc2MpIHsKKwkJCQlpbnQgZXJyID0gcWRpc2NfZW5xdWV1ZShza2IsIHEtPnFkaXNjKTsKKworCQkJCWlmICh1bmxpa2VseShlcnIgIT0gTkVUX1hNSVRfU1VDQ0VTUykpIHsKKwkJCQkJaWYgKG5ldF94bWl0X2Ryb3BfY291bnQoZXJyKSkgeworCQkJCQkJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwkJCQkJCXFkaXNjX3RyZWVfZGVjcmVhc2VfcWxlbihzY2gsIDEpOworCQkJCQl9CisJCQkJfQorCQkJCWdvdG8gdGZpZm9fZGVxdWV1ZTsKKwkJCX0KK2RlbGl2ZXI6CiAJCQlxZGlzY191bnRocm90dGxlZChzY2gpOwogCQkJcWRpc2NfYnN0YXRzX3VwZGF0ZShzY2gsIHNrYik7CiAJCQlyZXR1cm4gc2tiOwogCQl9CiAKKwkJaWYgKHEtPnFkaXNjKSB7CisJCQlza2IgPSBxLT5xZGlzYy0+b3BzLT5kZXF1ZXVlKHEtPnFkaXNjKTsKKwkJCWlmIChza2IpCisJCQkJZ290byBkZWxpdmVyOworCQl9CiAJCXFkaXNjX3dhdGNoZG9nX3NjaGVkdWxlKCZxLT53YXRjaGRvZywgY2ItPnRpbWVfdG9fc2VuZCk7CiAJfQogCitxZGlzY19kZXF1ZXVlOgorCWlmIChxLT5xZGlzYykgeworCQlza2IgPSBxLT5xZGlzYy0+b3BzLT5kZXF1ZXVlKHEtPnFkaXNjKTsKKwkJaWYgKHNrYikKKwkJCWdvdG8gZGVsaXZlcjsKKwl9CiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTQ1NSw4ICs1NTMsOSBAQAogewogCXN0cnVjdCBuZXRlbV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwogCi0JcWRpc2NfcmVzZXQocS0+cWRpc2MpOwotCXNjaC0+cS5xbGVuID0gMDsKKwlxZGlzY19yZXNldF9xdWV1ZShzY2gpOworCWlmIChxLT5xZGlzYykKKwkJcWRpc2NfcmVzZXQocS0+cWRpc2MpOwogCXFkaXNjX3dhdGNoZG9nX2NhbmNlbCgmcS0+d2F0Y2hkb2cpOwogfQogCkBAIC00ODgsNyArNTg3LDcgQEAKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzID0gc2l6ZW9mKHN0cnVjdCBkaXN0dGFibGUpICsgbiAqIHNpemVvZihzMTYpOwotCWQgPSBrbWFsbG9jKHMsIEdGUF9LRVJORUwpOworCWQgPSBrbWFsbG9jKHMsIEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4pOwogCWlmICghZCkKIAkJZCA9IHZtYWxsb2Mocyk7CiAJaWYgKCFkKQpAQCAtNTAxLDkgKzYwMCwxMCBAQAogCXJvb3RfbG9jayA9IHFkaXNjX3Jvb3Rfc2xlZXBpbmdfbG9jayhzY2gpOwogCiAJc3Bpbl9sb2NrX2JoKHJvb3RfbG9jayk7Ci0JZGlzdF9mcmVlKHEtPmRlbGF5X2Rpc3QpOwotCXEtPmRlbGF5X2Rpc3QgPSBkOworCXN3YXAocS0+ZGVsYXlfZGlzdCwgZCk7CiAJc3Bpbl91bmxvY2tfYmgocm9vdF9sb2NrKTsKKworCWRpc3RfZnJlZShkKTsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNTM1LDYgKzYzNSwxOSBAQAogCWluaXRfY3JhbmRvbSgmcS0+Y29ycnVwdF9jb3IsIHItPmNvcnJlbGF0aW9uKTsKIH0KIAorc3RhdGljIHZvaWQgZ2V0X3JhdGUoc3RydWN0IFFkaXNjICpzY2gsIGNvbnN0IHN0cnVjdCBubGF0dHIgKmF0dHIpCit7CisJc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJY29uc3Qgc3RydWN0IHRjX25ldGVtX3JhdGUgKnIgPSBubGFfZGF0YShhdHRyKTsKKworCXEtPnJhdGUgPSByLT5yYXRlOworCXEtPnBhY2tldF9vdmVyaGVhZCA9IHItPnBhY2tldF9vdmVyaGVhZDsKKwlxLT5jZWxsX3NpemUgPSByLT5jZWxsX3NpemU7CisJaWYgKHEtPmNlbGxfc2l6ZSkKKwkJcS0+Y2VsbF9zaXplX3JlY2lwcm9jYWwgPSByZWNpcHJvY2FsX3ZhbHVlKHEtPmNlbGxfc2l6ZSk7CisJcS0+Y2VsbF9vdmVyaGVhZCA9IHItPmNlbGxfb3ZlcmhlYWQ7Cit9CisKIHN0YXRpYyBpbnQgZ2V0X2xvc3NfY2xnKHN0cnVjdCBRZGlzYyAqc2NoLCBjb25zdCBzdHJ1Y3QgbmxhdHRyICphdHRyKQogewogCXN0cnVjdCBuZXRlbV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwpAQCAtNTQ4LDcgKzY2MSw3IEBACiAJCWNhc2UgTkVURU1fTE9TU19HSTogewogCQkJY29uc3Qgc3RydWN0IHRjX25ldGVtX2dpbW9kZWwgKmdpID0gbmxhX2RhdGEobGEpOwogCi0JCQlpZiAobmxhX2xlbihsYSkgIT0gc2l6ZW9mKHN0cnVjdCB0Y19uZXRlbV9naW1vZGVsKSkgeworCQkJaWYgKG5sYV9sZW4obGEpIDwgc2l6ZW9mKHN0cnVjdCB0Y19uZXRlbV9naW1vZGVsKSkgewogCQkJCXByX2luZm8oIm5ldGVtOiBpbmNvcnJlY3QgZ2kgbW9kZWwgc2l6ZVxuIik7CiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAJCQl9CkBAIC01NjcsOCArNjgwLDggQEAKIAkJY2FzZSBORVRFTV9MT1NTX0dFOiB7CiAJCQljb25zdCBzdHJ1Y3QgdGNfbmV0ZW1fZ2Vtb2RlbCAqZ2UgPSBubGFfZGF0YShsYSk7CiAKLQkJCWlmIChubGFfbGVuKGxhKSAhPSBzaXplb2Yoc3RydWN0IHRjX25ldGVtX2dlbW9kZWwpKSB7Ci0JCQkJcHJfaW5mbygibmV0ZW06IGluY29ycmVjdCBnaSBtb2RlbCBzaXplXG4iKTsKKwkJCWlmIChubGFfbGVuKGxhKSA8IHNpemVvZihzdHJ1Y3QgdGNfbmV0ZW1fZ2Vtb2RlbCkpIHsKKwkJCQlwcl9pbmZvKCJuZXRlbTogaW5jb3JyZWN0IGdlIG1vZGVsIHNpemVcbiIpOwogCQkJCXJldHVybiAtRUlOVkFMOwogCQkJfQogCkBAIC01OTQsNiArNzA3LDcgQEAKIAlbVENBX05FVEVNX0NPUlJdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCB0Y19uZXRlbV9jb3JyKSB9LAogCVtUQ0FfTkVURU1fUkVPUkRFUl0JPSB7IC5sZW4gPSBzaXplb2Yoc3RydWN0IHRjX25ldGVtX3Jlb3JkZXIpIH0sCiAJW1RDQV9ORVRFTV9DT1JSVVBUXQk9IHsgLmxlbiA9IHNpemVvZihzdHJ1Y3QgdGNfbmV0ZW1fY29ycnVwdCkgfSwKKwlbVENBX05FVEVNX1JBVEVdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCB0Y19uZXRlbV9yYXRlKSB9LAogCVtUQ0FfTkVURU1fTE9TU10JPSB7IC50eXBlID0gTkxBX05FU1RFRCB9LAogfTsKIApAQCAtNjMxLDExICs3NDUsNyBAQAogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwogCi0JcmV0ID0gZmlmb19zZXRfbGltaXQocS0+cWRpc2MsIHFvcHQtPmxpbWl0KTsKLQlpZiAocmV0KSB7Ci0JCXByX2luZm8oIm5ldGVtOiBjYW4ndCBzZXQgZmlmbyBsaW1pdFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQorCXNjaC0+bGltaXQgPSBxb3B0LT5saW1pdDsKIAogCXEtPmxhdGVuY3kgPSBxb3B0LT5sYXRlbmN5OwogCXEtPmppdHRlciA9IHFvcHQtPmppdHRlcjsKQEAgLTY2Niw2ICs3NzYsOSBAQAogCWlmICh0YltUQ0FfTkVURU1fQ09SUlVQVF0pCiAJCWdldF9jb3JydXB0KHNjaCwgdGJbVENBX05FVEVNX0NPUlJVUFRdKTsKIAorCWlmICh0YltUQ0FfTkVURU1fUkFURV0pCisJCWdldF9yYXRlKHNjaCwgdGJbVENBX05FVEVNX1JBVEVdKTsKKwogCXEtPmxvc3NfbW9kZWwgPSBDTEdfUkFORE9NOwogCWlmICh0YltUQ0FfTkVURU1fTE9TU10pCiAJCXJldCA9IGdldF9sb3NzX2NsZyhzY2gsIHRiW1RDQV9ORVRFTV9MT1NTXSk7CkBAIC02NzMsODggKzc4Niw2IEBACiAJcmV0dXJuIHJldDsKIH0KIAotLyoKLSAqIFNwZWNpYWwgY2FzZSB2ZXJzaW9uIG9mIEZJRk8gcXVldWUgZm9yIHVzZSBieSBuZXRlbS4KLSAqIEl0IHF1ZXVlcyBpbiBvcmRlciBiYXNlZCBvbiB0aW1lc3RhbXBzIGluIHNrYidzCi0gKi8KLXN0cnVjdCBmaWZvX3NjaGVkX2RhdGEgewotCXUzMiBsaW1pdDsKLQlwc2NoZWRfdGltZV90IG9sZGVzdDsKLX07Ci0KLXN0YXRpYyBpbnQgdGZpZm9fZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqbnNrYiwgc3RydWN0IFFkaXNjICpzY2gpCi17Ci0Jc3RydWN0IGZpZm9fc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKLQlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICpsaXN0ID0gJnNjaC0+cTsKLQlwc2NoZWRfdGltZV90IHRuZXh0ID0gbmV0ZW1fc2tiX2NiKG5za2IpLT50aW1lX3RvX3NlbmQ7Ci0Jc3RydWN0IHNrX2J1ZmYgKnNrYjsKLQotCWlmIChsaWtlbHkoc2tiX3F1ZXVlX2xlbihsaXN0KSA8IHEtPmxpbWl0KSkgewotCQkvKiBPcHRpbWl6ZSBmb3IgYWRkIGF0IHRhaWwgKi8KLQkJaWYgKGxpa2VseShza2JfcXVldWVfZW1wdHkobGlzdCkgfHwgdG5leHQgPj0gcS0+b2xkZXN0KSkgewotCQkJcS0+b2xkZXN0ID0gdG5leHQ7Ci0JCQlyZXR1cm4gcWRpc2NfZW5xdWV1ZV90YWlsKG5za2IsIHNjaCk7Ci0JCX0KLQotCQlza2JfcXVldWVfcmV2ZXJzZV93YWxrKGxpc3QsIHNrYikgewotCQkJY29uc3Qgc3RydWN0IG5ldGVtX3NrYl9jYiAqY2IgPSBuZXRlbV9za2JfY2Ioc2tiKTsKLQotCQkJaWYgKHRuZXh0ID49IGNiLT50aW1lX3RvX3NlbmQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlfX3NrYl9xdWV1ZV9hZnRlcihsaXN0LCBza2IsIG5za2IpOwotCi0JCXNjaC0+cXN0YXRzLmJhY2tsb2cgKz0gcWRpc2NfcGt0X2xlbihuc2tiKTsKLQotCQlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKLQl9Ci0KLQlyZXR1cm4gcWRpc2NfcmVzaGFwZV9mYWlsKG5za2IsIHNjaCk7Ci19Ci0KLXN0YXRpYyBpbnQgdGZpZm9faW5pdChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IG5sYXR0ciAqb3B0KQotewotCXN0cnVjdCBmaWZvX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7Ci0KLQlpZiAob3B0KSB7Ci0JCXN0cnVjdCB0Y19maWZvX3FvcHQgKmN0bCA9IG5sYV9kYXRhKG9wdCk7Ci0JCWlmIChubGFfbGVuKG9wdCkgPCBzaXplb2YoKmN0bCkpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlxLT5saW1pdCA9IGN0bC0+bGltaXQ7Ci0JfSBlbHNlCi0JCXEtPmxpbWl0ID0gbWF4X3QodTMyLCBxZGlzY19kZXYoc2NoKS0+dHhfcXVldWVfbGVuLCAxKTsKLQotCXEtPm9sZGVzdCA9IFBTQ0hFRF9QQVNUUEVSRkVDVDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCB0Zmlmb19kdW1wKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQotewotCXN0cnVjdCBmaWZvX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7Ci0Jc3RydWN0IHRjX2ZpZm9fcW9wdCBvcHQgPSB7IC5saW1pdCA9IHEtPmxpbWl0IH07Ci0KLQlOTEFfUFVUKHNrYiwgVENBX09QVElPTlMsIHNpemVvZihvcHQpLCAmb3B0KTsKLQlyZXR1cm4gc2tiLT5sZW47Ci0KLW5sYV9wdXRfZmFpbHVyZToKLQlyZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgUWRpc2Nfb3BzIHRmaWZvX3FkaXNjX29wcyBfX3JlYWRfbW9zdGx5ID0gewotCS5pZAkJPQkidGZpZm8iLAotCS5wcml2X3NpemUJPQlzaXplb2Yoc3RydWN0IGZpZm9fc2NoZWRfZGF0YSksCi0JLmVucXVldWUJPQl0Zmlmb19lbnF1ZXVlLAotCS5kZXF1ZXVlCT0JcWRpc2NfZGVxdWV1ZV9oZWFkLAotCS5wZWVrCQk9CXFkaXNjX3BlZWtfaGVhZCwKLQkuZHJvcAkJPQlxZGlzY19xdWV1ZV9kcm9wLAotCS5pbml0CQk9CXRmaWZvX2luaXQsCi0JLnJlc2V0CQk9CXFkaXNjX3Jlc2V0X3F1ZXVlLAotCS5jaGFuZ2UJCT0JdGZpZm9faW5pdCwKLQkuZHVtcAkJPQl0Zmlmb19kdW1wLAotfTsKLQogc3RhdGljIGludCBuZXRlbV9pbml0KHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgbmxhdHRyICpvcHQpCiB7CiAJc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CkBAIC03NjYsMTggKzc5Nyw5IEBACiAJcWRpc2Nfd2F0Y2hkb2dfaW5pdCgmcS0+d2F0Y2hkb2csIHNjaCk7CiAKIAlxLT5sb3NzX21vZGVsID0gQ0xHX1JBTkRPTTsKLQlxLT5xZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2X3F1ZXVlLCAmdGZpZm9fcWRpc2Nfb3BzLAotCQkJCSAgICAgVENfSF9NQUtFKHNjaC0+aGFuZGxlLCAxKSk7Ci0JaWYgKCFxLT5xZGlzYykgewotCQlwcl9ub3RpY2UoIm5ldGVtOiBxZGlzYyBjcmVhdGUgdGZpZm8gcWRpc2MgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJcmV0ID0gbmV0ZW1fY2hhbmdlKHNjaCwgb3B0KTsKLQlpZiAocmV0KSB7CisJaWYgKHJldCkKIAkJcHJfaW5mbygibmV0ZW06IGNoYW5nZSBmYWlsZWRcbiIpOwotCQlxZGlzY19kZXN0cm95KHEtPnFkaXNjKTsKLQl9CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtNzg2LDcgKzgwOCw4IEBACiAJc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAKIAlxZGlzY193YXRjaGRvZ19jYW5jZWwoJnEtPndhdGNoZG9nKTsKLQlxZGlzY19kZXN0cm95KHEtPnFkaXNjKTsKKwlpZiAocS0+cWRpc2MpCisJCXFkaXNjX2Rlc3Ryb3kocS0+cWRpc2MpOwogCWRpc3RfZnJlZShxLT5kZWxheV9kaXN0KTsKIH0KIApAQCAtODQ2LDYgKzg2OSw3IEBACiAJc3RydWN0IHRjX25ldGVtX2NvcnIgY29yOwogCXN0cnVjdCB0Y19uZXRlbV9yZW9yZGVyIHJlb3JkZXI7CiAJc3RydWN0IHRjX25ldGVtX2NvcnJ1cHQgY29ycnVwdDsKKwlzdHJ1Y3QgdGNfbmV0ZW1fcmF0ZSByYXRlOwogCiAJcW9wdC5sYXRlbmN5ID0gcS0+bGF0ZW5jeTsKIAlxb3B0LmppdHRlciA9IHEtPmppdHRlcjsKQEAgLTg2OCw2ICs4OTIsMTIgQEAKIAljb3JydXB0LmNvcnJlbGF0aW9uID0gcS0+Y29ycnVwdF9jb3IucmhvOwogCU5MQV9QVVQoc2tiLCBUQ0FfTkVURU1fQ09SUlVQVCwgc2l6ZW9mKGNvcnJ1cHQpLCAmY29ycnVwdCk7CiAKKwlyYXRlLnJhdGUgPSBxLT5yYXRlOworCXJhdGUucGFja2V0X292ZXJoZWFkID0gcS0+cGFja2V0X292ZXJoZWFkOworCXJhdGUuY2VsbF9zaXplID0gcS0+Y2VsbF9zaXplOworCXJhdGUuY2VsbF9vdmVyaGVhZCA9IHEtPmNlbGxfb3ZlcmhlYWQ7CisJTkxBX1BVVChza2IsIFRDQV9ORVRFTV9SQVRFLCBzaXplb2YocmF0ZSksICZyYXRlKTsKKwogCWlmIChkdW1wX2xvc3NfbW9kZWwocSwgc2tiKSAhPSAwKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIApAQCAtODgzLDcgKzkxMyw3IEBACiB7CiAJc3RydWN0IG5ldGVtX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAKLQlpZiAoY2wgIT0gMSkgCS8qIG9ubHkgb25lIGNsYXNzICovCisJaWYgKGNsICE9IDEgfHwgIXEtPnFkaXNjKSAJLyogb25seSBvbmUgY2xhc3MgKi8KIAkJcmV0dXJuIC1FTk9FTlQ7CiAKIAl0Y20tPnRjbV9oYW5kbGUgfD0gVENfSF9NSU4oMSk7CkBAIC04OTcsMTQgKzkyNywxMyBAQAogewogCXN0cnVjdCBuZXRlbV9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOwogCi0JaWYgKG5ldyA9PSBOVUxMKQotCQluZXcgPSAmbm9vcF9xZGlzYzsKLQogCXNjaF90cmVlX2xvY2soc2NoKTsKIAkqb2xkID0gcS0+cWRpc2M7CiAJcS0+cWRpc2MgPSBuZXc7Ci0JcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKCpvbGQsICgqb2xkKS0+cS5xbGVuKTsKLQlxZGlzY19yZXNldCgqb2xkKTsKKwlpZiAoKm9sZCkgeworCQlxZGlzY190cmVlX2RlY3JlYXNlX3FsZW4oKm9sZCwgKCpvbGQpLT5xLnFsZW4pOworCQlxZGlzY19yZXNldCgqb2xkKTsKKwl9CiAJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfcWZxLmMgYi9uZXQvc2NoZWQvc2NoX3FmcS5jCmluZGV4IDEwMzM0MzQuLmU2OGNiNDQgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfcWZxLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9xZnEuYwpAQCAtMjExLDYgKzIxMSw3IEBACiAJc3RydWN0IG5sYXR0ciAqdGJbVENBX1FGUV9NQVggKyAxXTsKIAl1MzIgd2VpZ2h0LCBsbWF4LCBpbnZfdzsKIAlpbnQgaSwgZXJyOworCWludCBkZWx0YV93OwogCiAJaWYgKHRjYVtUQ0FfT1BUSU9OU10gPT0gTlVMTCkgewogCQlwcl9ub3RpY2UoInFmcTogbm8gb3B0aW9uc1xuIik7CkBAIC0yMzIsOSArMjMzLDEwIEBACiAKIAlpbnZfdyA9IE9ORV9GUCAvIHdlaWdodDsKIAl3ZWlnaHQgPSBPTkVfRlAgLyBpbnZfdzsKLQlpZiAocS0+d3N1bSArIHdlaWdodCA+IFFGUV9NQVhfV1NVTSkgeworCWRlbHRhX3cgPSB3ZWlnaHQgLSAoY2wgPyBPTkVfRlAgLyBjbC0+aW52X3cgOiAwKTsKKwlpZiAocS0+d3N1bSArIGRlbHRhX3cgPiBRRlFfTUFYX1dTVU0pIHsKIAkJcHJfbm90aWNlKCJxZnE6IHRvdGFsIHdlaWdodCBvdXQgb2YgcmFuZ2UgKCV1ICsgJXUpXG4iLAotCQkJICB3ZWlnaHQsIHEtPndzdW0pOworCQkJICBkZWx0YV93LCBxLT53c3VtKTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCkBAIC0yNTYsMTMgKzI1OCwxMiBAQAogCQkJCXJldHVybiBlcnI7CiAJCX0KIAotCQlzY2hfdHJlZV9sb2NrKHNjaCk7Ci0JCWlmICh0YltUQ0FfUUZRX1dFSUdIVF0pIHsKLQkJCXEtPndzdW0gPSB3ZWlnaHQgLSBPTkVfRlAgLyBjbC0+aW52X3c7CisJCWlmIChpbnZfdyAhPSBjbC0+aW52X3cpIHsKKwkJCXNjaF90cmVlX2xvY2soc2NoKTsKKwkJCXEtPndzdW0gKz0gZGVsdGFfdzsKIAkJCWNsLT5pbnZfdyA9IGludl93OworCQkJc2NoX3RyZWVfdW5sb2NrKHNjaCk7CiAJCX0KLQkJc2NoX3RyZWVfdW5sb2NrKHNjaCk7Ci0KIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yNzcsNyArMjc4LDYgQEAKIAlpID0gcWZxX2NhbGNfaW5kZXgoY2wtPmludl93LCBjbC0+bG1heCk7CiAKIAljbC0+Z3JwID0gJnEtPmdyb3Vwc1tpXTsKLQlxLT53c3VtICs9IHdlaWdodDsKIAogCWNsLT5xZGlzYyA9IHFkaXNjX2NyZWF0ZV9kZmx0KHNjaC0+ZGV2X3F1ZXVlLAogCQkJCSAgICAgICZwZmlmb19xZGlzY19vcHMsIGNsYXNzaWQpOwpAQCAtMjk0LDYgKzI5NCw3IEBACiAJCQlyZXR1cm4gZXJyOwogCQl9CiAJfQorCXEtPndzdW0gKz0gd2VpZ2h0OwogCiAJc2NoX3RyZWVfbG9jayhzY2gpOwogCXFkaXNjX2NsYXNzX2hhc2hfaW5zZXJ0KCZxLT5jbGhhc2gsICZjbC0+Y29tbW9uKTsKQEAgLTgxNywxMSArODE4LDExIEBACiBzdGF0aWMgdm9pZCBxZnFfdXBkYXRlX3N0YXJ0KHN0cnVjdCBxZnFfc2NoZWQgKnEsIHN0cnVjdCBxZnFfY2xhc3MgKmNsKQogewogCXVuc2lnbmVkIGxvbmcgbWFzazsKLQl1aW50MzJfdCBsaW1pdCwgcm91bmRlZEY7CisJdTY0IGxpbWl0LCByb3VuZGVkRjsKIAlpbnQgc2xvdF9zaGlmdCA9IGNsLT5ncnAtPnNsb3Rfc2hpZnQ7CiAKIAlyb3VuZGVkRiA9IHFmcV9yb3VuZF9kb3duKGNsLT5GLCBzbG90X3NoaWZ0KTsKLQlsaW1pdCA9IHFmcV9yb3VuZF9kb3duKHEtPlYsIHNsb3Rfc2hpZnQpICsgKDFVTCA8PCBzbG90X3NoaWZ0KTsKKwlsaW1pdCA9IHFmcV9yb3VuZF9kb3duKHEtPlYsIHNsb3Rfc2hpZnQpICsgKDFVTEwgPDwgc2xvdF9zaGlmdCk7CiAKIAlpZiAoIXFmcV9ndChjbC0+RiwgcS0+VikgfHwgcWZxX2d0KHJvdW5kZWRGLCBsaW1pdCkpIHsKIAkJLyogdGltZXN0YW1wIHdhcyBzdGFsZSAqLwpkaWZmIC0tZ2l0IGEvbmV0L3NjaGVkL3NjaF9yZWQuYyBiL25ldC9zY2hlZC9zY2hfcmVkLmMKaW5kZXggNjY0OTQ2My4uYTVjYzMwMSAxMDA2NDQKLS0tIGEvbmV0L3NjaGVkL3NjaF9yZWQuYworKysgYi9uZXQvc2NoZWQvc2NoX3JlZC5jCkBAIC0zOSw3ICszOSw5IEBACiBzdHJ1Y3QgcmVkX3NjaGVkX2RhdGEgewogCXUzMgkJCWxpbWl0OwkJLyogSEFSRCBtYXhpbWFsIHF1ZXVlIGxlbmd0aCAqLwogCXVuc2lnbmVkIGNoYXIJCWZsYWdzOworCXN0cnVjdCB0aW1lcl9saXN0CWFkYXB0X3RpbWVyOwogCXN0cnVjdCByZWRfcGFybXMJcGFybXM7CisJc3RydWN0IHJlZF92YXJzCQl2YXJzOwogCXN0cnVjdCByZWRfc3RhdHMJc3RhdHM7CiAJc3RydWN0IFFkaXNjCQkqcWRpc2M7CiB9OwpAQCAtNjAsMTIgKzYyLDE0IEBACiAJc3RydWN0IFFkaXNjICpjaGlsZCA9IHEtPnFkaXNjOwogCWludCByZXQ7CiAKLQlxLT5wYXJtcy5xYXZnID0gcmVkX2NhbGNfcWF2ZygmcS0+cGFybXMsIGNoaWxkLT5xc3RhdHMuYmFja2xvZyk7CisJcS0+dmFycy5xYXZnID0gcmVkX2NhbGNfcWF2ZygmcS0+cGFybXMsCisJCQkJICAgICAmcS0+dmFycywKKwkJCQkgICAgIGNoaWxkLT5xc3RhdHMuYmFja2xvZyk7CiAKLQlpZiAocmVkX2lzX2lkbGluZygmcS0+cGFybXMpKQotCQlyZWRfZW5kX29mX2lkbGVfcGVyaW9kKCZxLT5wYXJtcyk7CisJaWYgKHJlZF9pc19pZGxpbmcoJnEtPnZhcnMpKQorCQlyZWRfZW5kX29mX2lkbGVfcGVyaW9kKCZxLT52YXJzKTsKIAotCXN3aXRjaCAocmVkX2FjdGlvbigmcS0+cGFybXMsIHEtPnBhcm1zLnFhdmcpKSB7CisJc3dpdGNoIChyZWRfYWN0aW9uKCZxLT5wYXJtcywgJnEtPnZhcnMsIHEtPnZhcnMucWF2ZykpIHsKIAljYXNlIFJFRF9ET05UX01BUks6CiAJCWJyZWFrOwogCkBAIC0xMTYsOCArMTIwLDggQEAKIAkJcWRpc2NfYnN0YXRzX3VwZGF0ZShzY2gsIHNrYik7CiAJCXNjaC0+cS5xbGVuLS07CiAJfSBlbHNlIHsKLQkJaWYgKCFyZWRfaXNfaWRsaW5nKCZxLT5wYXJtcykpCi0JCQlyZWRfc3RhcnRfb2ZfaWRsZV9wZXJpb2QoJnEtPnBhcm1zKTsKKwkJaWYgKCFyZWRfaXNfaWRsaW5nKCZxLT52YXJzKSkKKwkJCXJlZF9zdGFydF9vZl9pZGxlX3BlcmlvZCgmcS0+dmFycyk7CiAJfQogCXJldHVybiBza2I7CiB9CkBAIC0xNDMsOCArMTQ3LDggQEAKIAkJcmV0dXJuIGxlbjsKIAl9CiAKLQlpZiAoIXJlZF9pc19pZGxpbmcoJnEtPnBhcm1zKSkKLQkJcmVkX3N0YXJ0X29mX2lkbGVfcGVyaW9kKCZxLT5wYXJtcyk7CisJaWYgKCFyZWRfaXNfaWRsaW5nKCZxLT52YXJzKSkKKwkJcmVkX3N0YXJ0X29mX2lkbGVfcGVyaW9kKCZxLT52YXJzKTsKIAogCXJldHVybiAwOwogfQpAQCAtMTU1LDE4ICsxNTksMjEgQEAKIAogCXFkaXNjX3Jlc2V0KHEtPnFkaXNjKTsKIAlzY2gtPnEucWxlbiA9IDA7Ci0JcmVkX3Jlc3RhcnQoJnEtPnBhcm1zKTsKKwlyZWRfcmVzdGFydCgmcS0+dmFycyk7CiB9CiAKIHN0YXRpYyB2b2lkIHJlZF9kZXN0cm95KHN0cnVjdCBRZGlzYyAqc2NoKQogewogCXN0cnVjdCByZWRfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKworCWRlbF90aW1lcl9zeW5jKCZxLT5hZGFwdF90aW1lcik7CiAJcWRpc2NfZGVzdHJveShxLT5xZGlzYyk7CiB9CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgbmxhX3BvbGljeSByZWRfcG9saWN5W1RDQV9SRURfTUFYICsgMV0gPSB7CiAJW1RDQV9SRURfUEFSTVNdCT0geyAubGVuID0gc2l6ZW9mKHN0cnVjdCB0Y19yZWRfcW9wdCkgfSwKIAlbVENBX1JFRF9TVEFCXQk9IHsgLmxlbiA9IFJFRF9TVEFCX1NJWkUgfSwKKwlbVENBX1JFRF9NQVhfUF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAogfTsKIAogc3RhdGljIGludCByZWRfY2hhbmdlKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3QgbmxhdHRyICpvcHQpCkBAIC0xNzYsNiArMTgzLDcgQEAKIAlzdHJ1Y3QgdGNfcmVkX3FvcHQgKmN0bDsKIAlzdHJ1Y3QgUWRpc2MgKmNoaWxkID0gTlVMTDsKIAlpbnQgZXJyOworCXUzMiBtYXhfUDsKIAogCWlmIChvcHQgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CkBAIC0xODgsNiArMTk2LDggQEAKIAkgICAgdGJbVENBX1JFRF9TVEFCXSA9PSBOVUxMKQogCQlyZXR1cm4gLUVJTlZBTDsKIAorCW1heF9QID0gdGJbVENBX1JFRF9NQVhfUF0gPyBubGFfZ2V0X3UzMih0YltUQ0FfUkVEX01BWF9QXSkgOiAwOworCiAJY3RsID0gbmxhX2RhdGEodGJbVENBX1JFRF9QQVJNU10pOwogCiAJaWYgKGN0bC0+bGltaXQgPiAwKSB7CkBAIC0yMDUsMjIgKzIxNSw0MiBAQAogCQlxLT5xZGlzYyA9IGNoaWxkOwogCX0KIAotCXJlZF9zZXRfcGFybXMoJnEtPnBhcm1zLCBjdGwtPnF0aF9taW4sIGN0bC0+cXRoX21heCwgY3RsLT5XbG9nLAotCQkJCSBjdGwtPlBsb2csIGN0bC0+U2NlbGxfbG9nLAotCQkJCSBubGFfZGF0YSh0YltUQ0FfUkVEX1NUQUJdKSk7CisJcmVkX3NldF9wYXJtcygmcS0+cGFybXMsCisJCSAgICAgIGN0bC0+cXRoX21pbiwgY3RsLT5xdGhfbWF4LCBjdGwtPldsb2csCisJCSAgICAgIGN0bC0+UGxvZywgY3RsLT5TY2VsbF9sb2csCisJCSAgICAgIG5sYV9kYXRhKHRiW1RDQV9SRURfU1RBQl0pLAorCQkgICAgICBtYXhfUCk7CisJcmVkX3NldF92YXJzKCZxLT52YXJzKTsKIAotCWlmIChza2JfcXVldWVfZW1wdHkoJnNjaC0+cSkpCi0JCXJlZF9lbmRfb2ZfaWRsZV9wZXJpb2QoJnEtPnBhcm1zKTsKKwlkZWxfdGltZXIoJnEtPmFkYXB0X3RpbWVyKTsKKwlpZiAoY3RsLT5mbGFncyAmIFRDX1JFRF9BREFQVEFUSVZFKQorCQltb2RfdGltZXIoJnEtPmFkYXB0X3RpbWVyLCBqaWZmaWVzICsgSFovMik7CisKKwlpZiAoIXEtPnFkaXNjLT5xLnFsZW4pCisJCXJlZF9zdGFydF9vZl9pZGxlX3BlcmlvZCgmcS0+dmFycyk7CiAKIAlzY2hfdHJlZV91bmxvY2soc2NoKTsKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHJlZF9hZGFwdGF0aXZlX3RpbWVyKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBRZGlzYyAqc2NoID0gKHN0cnVjdCBRZGlzYyAqKWFyZzsKKwlzdHJ1Y3QgcmVkX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3BpbmxvY2tfdCAqcm9vdF9sb2NrID0gcWRpc2NfbG9jayhxZGlzY19yb290X3NsZWVwaW5nKHNjaCkpOworCisJc3Bpbl9sb2NrKHJvb3RfbG9jayk7CisJcmVkX2FkYXB0YXRpdmVfYWxnbygmcS0+cGFybXMsICZxLT52YXJzKTsKKwltb2RfdGltZXIoJnEtPmFkYXB0X3RpbWVyLCBqaWZmaWVzICsgSFovMik7CisJc3Bpbl91bmxvY2socm9vdF9sb2NrKTsKK30KKwogc3RhdGljIGludCByZWRfaW5pdChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IG5sYXR0ciAqb3B0KQogewogCXN0cnVjdCByZWRfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAogCXEtPnFkaXNjID0gJm5vb3BfcWRpc2M7CisJc2V0dXBfdGltZXIoJnEtPmFkYXB0X3RpbWVyLCByZWRfYWRhcHRhdGl2ZV90aW1lciwgKHVuc2lnbmVkIGxvbmcpc2NoKTsKIAlyZXR1cm4gcmVkX2NoYW5nZShzY2gsIG9wdCk7CiB9CiAKQEAgLTI0Myw2ICsyNzMsNyBAQAogCWlmIChvcHRzID09IE5VTEwpCiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCU5MQV9QVVQoc2tiLCBUQ0FfUkVEX1BBUk1TLCBzaXplb2Yob3B0KSwgJm9wdCk7CisJTkxBX1BVVF9VMzIoc2tiLCBUQ0FfUkVEX01BWF9QLCBxLT5wYXJtcy5tYXhfUCk7CiAJcmV0dXJuIG5sYV9uZXN0X2VuZChza2IsIG9wdHMpOwogCiBubGFfcHV0X2ZhaWx1cmU6CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3NmYi5jIGIvbmV0L3NjaGVkL3NjaF9zZmIuYwppbmRleCBlODNjMjcyLi45NmU0MmNhIDEwMDY0NAotLS0gYS9uZXQvc2NoZWQvc2NoX3NmYi5jCisrKyBiL25ldC9zY2hlZC9zY2hfc2ZiLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxuZXQvaXAuaD4KICNpbmNsdWRlIDxuZXQvcGt0X3NjaGVkLmg+CiAjaW5jbHVkZSA8bmV0L2luZXRfZWNuLmg+CisjaW5jbHVkZSA8bmV0L2Zsb3dfa2V5cy5oPgogCiAvKgogICogU0ZCIHVzZXMgdHdvIEJbbF1bbl0gOiBMIHggTiBhcnJheXMgb2YgYmlucyAoTCBsZXZlbHMsIE4gYmlucyBwZXIgbGV2ZWwpCkBAIC0yODYsNiArMjg3LDcgQEAKIAl1MzIgbWlucWxlbiA9IH4wOwogCXUzMiByLCBzbG90LCBzYWx0LCBzZmJoYXNoOwogCWludCByZXQgPSBORVRfWE1JVF9TVUNDRVNTIHwgX19ORVRfWE1JVF9CWVBBU1M7CisJc3RydWN0IGZsb3dfa2V5cyBrZXlzOwogCiAJaWYgKHVubGlrZWx5KHNjaC0+cS5xbGVuID49IHEtPmxpbWl0KSkgewogCQlzY2gtPnFzdGF0cy5vdmVybGltaXRzKys7CkBAIC0zMDksMTMgKzMxMSwxOSBAQAogCQkvKiBJZiB1c2luZyBleHRlcm5hbCBjbGFzc2lmaWVycywgZ2V0IHJlc3VsdCBhbmQgcmVjb3JkIGl0LiAqLwogCQlpZiAoIXNmYl9jbGFzc2lmeShza2IsIHEsICZyZXQsICZzYWx0KSkKIAkJCWdvdG8gb3RoZXJfZHJvcDsKKwkJa2V5cy5zcmMgPSBzYWx0OworCQlrZXlzLmRzdCA9IDA7CisJCWtleXMucG9ydHMgPSAwOwogCX0gZWxzZSB7Ci0JCXNhbHQgPSBza2JfZ2V0X3J4aGFzaChza2IpOworCQlza2JfZmxvd19kaXNzZWN0KHNrYiwgJmtleXMpOwogCX0KIAogCXNsb3QgPSBxLT5zbG90OwogCi0Jc2ZiaGFzaCA9IGpoYXNoXzF3b3JkKHNhbHQsIHEtPmJpbnNbc2xvdF0ucGVydHVyYmF0aW9uKTsKKwlzZmJoYXNoID0gamhhc2hfM3dvcmRzKChfX2ZvcmNlIHUzMilrZXlzLmRzdCwKKwkJCSAgICAgICAoX19mb3JjZSB1MzIpa2V5cy5zcmMsCisJCQkgICAgICAgKF9fZm9yY2UgdTMyKWtleXMucG9ydHMsCisJCQkgICAgICAgcS0+Ymluc1tzbG90XS5wZXJ0dXJiYXRpb24pOwogCWlmICghc2ZiaGFzaCkKIAkJc2ZiaGFzaCA9IDE7CiAJc2ZiX3NrYl9jYihza2IpLT5oYXNoZXNbc2xvdF0gPSBzZmJoYXNoOwpAQCAtMzQ3LDcgKzM1NSwxMCBAQAogCWlmICh1bmxpa2VseShwX21pbiA+PSBTRkJfTUFYX1BST0IpKSB7CiAJCS8qIEluZWxhc3RpYyBmbG93ICovCiAJCWlmIChxLT5kb3VibGVfYnVmZmVyaW5nKSB7Ci0JCQlzZmJoYXNoID0gamhhc2hfMXdvcmQoc2FsdCwgcS0+Ymluc1tzbG90XS5wZXJ0dXJiYXRpb24pOworCQkJc2ZiaGFzaCA9IGpoYXNoXzN3b3JkcygoX19mb3JjZSB1MzIpa2V5cy5kc3QsCisJCQkJCSAgICAgICAoX19mb3JjZSB1MzIpa2V5cy5zcmMsCisJCQkJCSAgICAgICAoX19mb3JjZSB1MzIpa2V5cy5wb3J0cywKKwkJCQkJICAgICAgIHEtPmJpbnNbc2xvdF0ucGVydHVyYmF0aW9uKTsKIAkJCWlmICghc2ZiaGFzaCkKIAkJCQlzZmJoYXNoID0gMTsKIAkJCXNmYl9za2JfY2Ioc2tiKS0+aGFzaGVzW3Nsb3RdID0gc2ZiaGFzaDsKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfc2ZxLmMgYi9uZXQvc2NoZWQvc2NoX3NmcS5jCmluZGV4IDRmNTUxMGUuLjBhNzk2NDAgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfc2ZxLmMKKysrIGIvbmV0L3NjaGVkL3NjaF9zZnEuYwpAQCAtMTcsMTQgKzE3LDEzIEBACiAjaW5jbHVkZSA8bGludXgvaW4uaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9pcHY2Lmg+CiAjaW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiAjaW5jbHVkZSA8bGludXgvamhhc2guaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPG5ldC9pcC5oPgogI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bmV0L3BrdF9zY2hlZC5oPgorI2luY2x1ZGUgPG5ldC9mbG93X2tleXMuaD4KIAogCiAvKglTdG9jaGFzdGljIEZhaXJuZXNzIFF1ZXVpbmcgYWxnb3JpdGhtLgpAQCAtNjcsMTYgKzY2LDE4IEBACiAJU0ZRIGlzIHN1cGVyaW9yIGZvciB0aGlzIHB1cnBvc2UuCiAKIAlJTVBMRU1FTlRBVElPTjoKLQlUaGlzIGltcGxlbWVudGF0aW9uIGxpbWl0cyBtYXhpbWFsIHF1ZXVlIGxlbmd0aCB0byAxMjg7Ci0JbWF4IG10dSB0byAyXjE4LTE7IG1heCAxMjggZmxvd3MsIG51bWJlciBvZiBoYXNoIGJ1Y2tldHMgdG8gMTAyNC4KLQlUaGUgb25seSBnb2FsIG9mIHRoaXMgcmVzdHJpY3Rpb25zIHdhcyB0aGF0IGFsbCBkYXRhCi0JZml0IGludG8gb25lIDRLIHBhZ2Ugb24gMzJiaXQgYXJjaGVzLgorCVRoaXMgaW1wbGVtZW50YXRpb24gbGltaXRzIDoKKwktIG1heGltYWwgcXVldWUgbGVuZ3RoIHBlciBmbG93IHRvIDEyNyBwYWNrZXRzLgorCS0gbWF4IG10dSB0byAyXjE4LTE7CisJLSBtYXggNjU0MDggZmxvd3MsCisJLSBudW1iZXIgb2YgaGFzaCBidWNrZXRzIHRvIDY1NTM2LgogCiAJSXQgaXMgZWFzeSB0byBpbmNyZWFzZSB0aGVzZSB2YWx1ZXMsIGJ1dCBub3QgaW4gZmxpZ2h0LiAgKi8KIAotI2RlZmluZSBTRlFfREVQVEgJCTEyOCAvKiBtYXggbnVtYmVyIG9mIHBhY2tldHMgcGVyIGZsb3cgKi8KLSNkZWZpbmUgU0ZRX1NMT1RTCQkxMjggLyogbWF4IG51bWJlciBvZiBmbG93cyAqLwotI2RlZmluZSBTRlFfRU1QVFlfU0xPVAkJMjU1CisjZGVmaW5lIFNGUV9NQVhfREVQVEgJCTEyNyAvKiBtYXggbnVtYmVyIG9mIHBhY2tldHMgcGVyIGZsb3cgKi8KKyNkZWZpbmUgU0ZRX0RFRkFVTFRfRkxPV1MJMTI4CisjZGVmaW5lIFNGUV9NQVhfRkxPV1MJCSgweDEwMDAwIC0gU0ZRX01BWF9ERVBUSCAtIDEpIC8qIG1heCBudW1iZXIgb2YgZmxvd3MgKi8KKyNkZWZpbmUgU0ZRX0VNUFRZX1NMT1QJCTB4ZmZmZgogI2RlZmluZSBTRlFfREVGQVVMVF9IQVNIX0RJVklTT1IgMTAyNAogCiAvKiBXZSB1c2UgMTYgYml0cyB0byBzdG9yZSBhbGxvdCwgYW5kIHdhbnQgdG8gaGFuZGxlIHBhY2tldHMgdXAgdG8gNjRLCkBAIC04NSwxMyArODYsMTMgQEAKICNkZWZpbmUgU0ZRX0FMTE9UX1NISUZUCQkzCiAjZGVmaW5lIFNGUV9BTExPVF9TSVpFKFgpCURJVl9ST1VORF9VUChYLCAxIDw8IFNGUV9BTExPVF9TSElGVCkKIAotLyogVGhpcyB0eXBlIHNob3VsZCBjb250YWluIGF0IGxlYXN0IFNGUV9ERVBUSCArIFNGUV9TTE9UUyB2YWx1ZXMgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBzZnFfaW5kZXg7CisvKiBUaGlzIHR5cGUgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3QgU0ZRX01BWF9ERVBUSCArIDEgKyBTRlFfTUFYX0ZMT1dTIHZhbHVlcyAqLwordHlwZWRlZiB1MTYgc2ZxX2luZGV4OwogCiAvKgogICogV2UgZG9udCB1c2UgcG9pbnRlcnMgdG8gc2F2ZSBzcGFjZS4KLSAqIFNtYWxsIGluZGV4ZXMgWzAgLi4uIFNGUV9TTE9UUyAtIDFdIGFyZSAncG9pbnRlcnMnIHRvIHNsb3RzW10gYXJyYXkKLSAqIHdoaWxlIGZvbGxvd2luZyB2YWx1ZXMgW1NGUV9TTE9UUyAuLi4gU0ZRX1NMT1RTICsgU0ZRX0RFUFRIIC0gMV0KKyAqIFNtYWxsIGluZGV4ZXMgWzAgLi4uIFNGUV9NQVhfRkxPV1MgLSAxXSBhcmUgJ3BvaW50ZXJzJyB0byBzbG90c1tdIGFycmF5CisgKiB3aGlsZSBmb2xsb3dpbmcgdmFsdWVzIFtTRlFfTUFYX0ZMT1dTIC4uLiBTRlFfTUFYX0ZMT1dTICsgU0ZRX01BWF9ERVBUSF0KICAqIGFyZSAncG9pbnRlcnMnIHRvIGRlcFtdIGFycmF5CiAgKi8KIHN0cnVjdCBzZnFfaGVhZCB7CkBAIC0xMDMsMjggKzEwNCwzOCBAQAogCXN0cnVjdCBza19idWZmCSpza2JsaXN0X25leHQ7CiAJc3RydWN0IHNrX2J1ZmYJKnNrYmxpc3RfcHJldjsKIAlzZnFfaW5kZXgJcWxlbjsgLyogbnVtYmVyIG9mIHNrYnMgaW4gc2tibGlzdCAqLwotCXNmcV9pbmRleAluZXh0OyAvKiBuZXh0IHNsb3QgaW4gc2ZxIGNoYWluICovCisJc2ZxX2luZGV4CW5leHQ7IC8qIG5leHQgc2xvdCBpbiBzZnEgUlIgY2hhaW4gKi8KIAlzdHJ1Y3Qgc2ZxX2hlYWQgZGVwOyAvKiBhbmNob3IgaW4gZGVwW10gY2hhaW5zICovCiAJdW5zaWduZWQgc2hvcnQJaGFzaDsgLyogaGFzaCB2YWx1ZSAoaW5kZXggaW4gaHRbXSkgKi8KIAlzaG9ydAkJYWxsb3Q7IC8qIGNyZWRpdCBmb3IgdGhpcyBzbG90ICovCiB9OwogCiBzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgewotLyogUGFyYW1ldGVycyAqLwotCWludAkJcGVydHVyYl9wZXJpb2Q7Ci0JdW5zaWduZWQgaW50CXF1YW50dW07CS8qIEFsbG90bWVudCBwZXIgcm91bmQ6IE1VU1QgQkUgPj0gTVRVICovCi0JaW50CQlsaW1pdDsKKy8qIGZyZXF1ZW50bHkgdXNlZCBmaWVsZHMgKi8KKwlpbnQJCWxpbWl0OwkJLyogbGltaXQgb2YgdG90YWwgbnVtYmVyIG9mIHBhY2tldHMgaW4gdGhpcyBxZGlzYyAqLwogCXVuc2lnbmVkIGludAlkaXZpc29yOwkvKiBudW1iZXIgb2Ygc2xvdHMgaW4gaGFzaCB0YWJsZSAqLwotLyogVmFyaWFibGVzICovCi0Jc3RydWN0IHRjZl9wcm90byAqZmlsdGVyX2xpc3Q7Ci0Jc3RydWN0IHRpbWVyX2xpc3QgcGVydHVyYl90aW1lcjsKKwl1bnNpZ25lZCBpbnQJbWF4Zmxvd3M7CS8qIG51bWJlciBvZiBmbG93cyBpbiBmbG93cyBhcnJheSAqLworCWludAkJaGVhZGRyb3A7CisJaW50CQltYXhkZXB0aDsJLyogbGltaXQgb2YgcGFja2V0cyBwZXIgZmxvdyAqLworCiAJdTMyCQlwZXJ0dXJiYXRpb247CisJc3RydWN0IHRjZl9wcm90byAqZmlsdGVyX2xpc3Q7CiAJc2ZxX2luZGV4CWN1cl9kZXB0aDsJLyogZGVwdGggb2YgbG9uZ2VzdCBzbG90ICovCiAJdW5zaWduZWQgc2hvcnQgIHNjYWxlZF9xdWFudHVtOyAvKiBTRlFfQUxMT1RfU0laRShxdWFudHVtKSAqLwogCXN0cnVjdCBzZnFfc2xvdCAqdGFpbDsJCS8qIGN1cnJlbnQgc2xvdCBpbiByb3VuZCAqLwotCXNmcV9pbmRleAkqaHQ7CQkvKiBIYXNoIHRhYmxlIChkaXZpc29yIHNsb3RzKSAqLwotCXN0cnVjdCBzZnFfc2xvdAlzbG90c1tTRlFfU0xPVFNdOwotCXN0cnVjdCBzZnFfaGVhZAlkZXBbU0ZRX0RFUFRIXTsJLyogTGlua2VkIGxpc3Qgb2Ygc2xvdHMsIGluZGV4ZWQgYnkgZGVwdGggKi8KKwlzZnFfaW5kZXgJKmh0OwkJLyogSGFzaCB0YWJsZSAoJ2Rpdmlzb3InIHNsb3RzKSAqLworCXN0cnVjdCBzZnFfc2xvdAkqc2xvdHM7CQkvKiBGbG93cyB0YWJsZSAoJ21heGZsb3dzJyBlbnRyaWVzKSAqLworCisJc3RydWN0IHNmcV9oZWFkCWRlcFtTRlFfTUFYX0RFUFRIICsgMV07CisJCQkJCS8qIExpbmtlZCBsaXN0cyBvZiBzbG90cywgaW5kZXhlZCBieSBkZXB0aAorCQkJCQkgKiBkZXBbMF0gOiBsaXN0IG9mIHVudXNlZCBmbG93cworCQkJCQkgKiBkZXBbMV0gOiBsaXN0IG9mIGZsb3dzIHdpdGggMSBwYWNrZXQKKwkJCQkJICogZGVwW1hdIDogbGlzdCBvZiBmbG93cyB3aXRoIFggcGFja2V0cworCQkJCQkgKi8KKworCWludAkJcGVydHVyYl9wZXJpb2Q7CisJdW5zaWduZWQgaW50CXF1YW50dW07CS8qIEFsbG90bWVudCBwZXIgcm91bmQ6IE1VU1QgQkUgPj0gTVRVICovCisJc3RydWN0IHRpbWVyX2xpc3QgcGVydHVyYl90aW1lcjsKIH07CiAKIC8qCkBAIC0xMzIsNjYgKzE0MywzNiBAQAogICovCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBzZnFfaGVhZCAqc2ZxX2RlcF9oZWFkKHN0cnVjdCBzZnFfc2NoZWRfZGF0YSAqcSwgc2ZxX2luZGV4IHZhbCkKIHsKLQlpZiAodmFsIDwgU0ZRX1NMT1RTKQorCWlmICh2YWwgPCBTRlFfTUFYX0ZMT1dTKQogCQlyZXR1cm4gJnEtPnNsb3RzW3ZhbF0uZGVwOwotCXJldHVybiAmcS0+ZGVwW3ZhbCAtIFNGUV9TTE9UU107CisJcmV0dXJuICZxLT5kZXBbdmFsIC0gU0ZRX01BWF9GTE9XU107CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2ZxX2ZvbGRfaGFzaChzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEsIHUzMiBoLCB1MzIgaDEpCisvKgorICogSW4gb3JkZXIgdG8gYmUgYWJsZSB0byBxdWlja2x5IHJlaGFzaCBvdXIgcXVldWUgd2hlbiB0aW1lciBjaGFuZ2VzCisgKiBxLT5wZXJ0dXJiYXRpb24sIHdlIHN0b3JlIGZsb3dfa2V5cyBpbiBza2ItPmNiW10KKyAqLworc3RydWN0IHNmcV9za2JfY2IgeworICAgICAgIHN0cnVjdCBmbG93X2tleXMgICAgICAgIGtleXM7Cit9OworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzZnFfc2tiX2NiICpzZnFfc2tiX2NiKGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JcmV0dXJuIGpoYXNoXzJ3b3JkcyhoLCBoMSwgcS0+cGVydHVyYmF0aW9uKSAmIChxLT5kaXZpc29yIC0gMSk7CisgICAgICAgQlVJTERfQlVHX09OKHNpemVvZihza2ItPmNiKSA8CisgICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHFkaXNjX3NrYl9jYikgKyBzaXplb2Yoc3RydWN0IHNmcV9za2JfY2IpKTsKKyAgICAgICByZXR1cm4gKHN0cnVjdCBzZnFfc2tiX2NiICopcWRpc2Nfc2tiX2NiKHNrYiktPmRhdGE7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgc2ZxX2hhc2goc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQorc3RhdGljIHVuc2lnbmVkIGludCBzZnFfaGFzaChjb25zdCBzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEsCisJCQkgICAgIGNvbnN0IHN0cnVjdCBza19idWZmICpza2IpCiB7Ci0JdTMyIGgsIGgyOworCWNvbnN0IHN0cnVjdCBmbG93X2tleXMgKmtleXMgPSAmc2ZxX3NrYl9jYihza2IpLT5rZXlzOworCXVuc2lnbmVkIGludCBoYXNoOwogCi0Jc3dpdGNoIChza2ItPnByb3RvY29sKSB7Ci0JY2FzZSBodG9ucyhFVEhfUF9JUCk6Ci0JewotCQljb25zdCBzdHJ1Y3QgaXBoZHIgKmlwaDsKLQkJaW50IHBvZmY7Ci0KLQkJaWYgKCFwc2tiX25ldHdvcmtfbWF5X3B1bGwoc2tiLCBzaXplb2YoKmlwaCkpKQotCQkJZ290byBlcnI7Ci0JCWlwaCA9IGlwX2hkcihza2IpOwotCQloID0gKF9fZm9yY2UgdTMyKWlwaC0+ZGFkZHI7Ci0JCWgyID0gKF9fZm9yY2UgdTMyKWlwaC0+c2FkZHIgXiBpcGgtPnByb3RvY29sOwotCQlpZiAoaXBfaXNfZnJhZ21lbnQoaXBoKSkKLQkJCWJyZWFrOwotCQlwb2ZmID0gcHJvdG9fcG9ydHNfb2Zmc2V0KGlwaC0+cHJvdG9jb2wpOwotCQlpZiAocG9mZiA+PSAwICYmCi0JCSAgICBwc2tiX25ldHdvcmtfbWF5X3B1bGwoc2tiLCBpcGgtPmlobCAqIDQgKyA0ICsgcG9mZikpIHsKLQkJCWlwaCA9IGlwX2hkcihza2IpOwotCQkJaDIgXj0gKih1MzIgKikoKHZvaWQgKilpcGggKyBpcGgtPmlobCAqIDQgKyBwb2ZmKTsKLQkJfQotCQlicmVhazsKLQl9Ci0JY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKLQl7Ci0JCWNvbnN0IHN0cnVjdCBpcHY2aGRyICppcGg7Ci0JCWludCBwb2ZmOwotCi0JCWlmICghcHNrYl9uZXR3b3JrX21heV9wdWxsKHNrYiwgc2l6ZW9mKCppcGgpKSkKLQkJCWdvdG8gZXJyOwotCQlpcGggPSBpcHY2X2hkcihza2IpOwotCQloID0gKF9fZm9yY2UgdTMyKWlwaC0+ZGFkZHIuczZfYWRkcjMyWzNdOwotCQloMiA9IChfX2ZvcmNlIHUzMilpcGgtPnNhZGRyLnM2X2FkZHIzMlszXSBeIGlwaC0+bmV4dGhkcjsKLQkJcG9mZiA9IHByb3RvX3BvcnRzX29mZnNldChpcGgtPm5leHRoZHIpOwotCQlpZiAocG9mZiA+PSAwICYmCi0JCSAgICBwc2tiX25ldHdvcmtfbWF5X3B1bGwoc2tiLCBzaXplb2YoKmlwaCkgKyA0ICsgcG9mZikpIHsKLQkJCWlwaCA9IGlwdjZfaGRyKHNrYik7Ci0JCQloMiBePSAqKHUzMiAqKSgodm9pZCAqKWlwaCArIHNpemVvZigqaXBoKSArIHBvZmYpOwotCQl9Ci0JCWJyZWFrOwotCX0KLQlkZWZhdWx0OgotZXJyOgotCQloID0gKHVuc2lnbmVkIGxvbmcpc2tiX2RzdChza2IpIF4gKF9fZm9yY2UgdTMyKXNrYi0+cHJvdG9jb2w7Ci0JCWgyID0gKHVuc2lnbmVkIGxvbmcpc2tiLT5zazsKLQl9Ci0KLQlyZXR1cm4gc2ZxX2ZvbGRfaGFzaChxLCBoLCBoMik7CisJaGFzaCA9IGpoYXNoXzN3b3JkcygoX19mb3JjZSB1MzIpa2V5cy0+ZHN0LAorCQkJICAgIChfX2ZvcmNlIHUzMilrZXlzLT5zcmMgXiBrZXlzLT5pcF9wcm90bywKKwkJCSAgICAoX19mb3JjZSB1MzIpa2V5cy0+cG9ydHMsIHEtPnBlcnR1cmJhdGlvbik7CisJcmV0dXJuIGhhc2ggJiAocS0+ZGl2aXNvciAtIDEpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgaW50IHNmcV9jbGFzc2lmeShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRpc2MgKnNjaCwKQEAgLTIwNiw4ICsxODcsMTAgQEAKIAkgICAgVENfSF9NSU4oc2tiLT5wcmlvcml0eSkgPD0gcS0+ZGl2aXNvcikKIAkJcmV0dXJuIFRDX0hfTUlOKHNrYi0+cHJpb3JpdHkpOwogCi0JaWYgKCFxLT5maWx0ZXJfbGlzdCkKKwlpZiAoIXEtPmZpbHRlcl9saXN0KSB7CisJCXNrYl9mbG93X2Rpc3NlY3Qoc2tiLCAmc2ZxX3NrYl9jYihza2IpLT5rZXlzKTsKIAkJcmV0dXJuIHNmcV9oYXNoKHEsIHNrYikgKyAxOworCX0KIAogCSpxZXJyID0gTkVUX1hNSVRfU1VDQ0VTUyB8IF9fTkVUX1hNSVRfQllQQVNTOwogCXJlc3VsdCA9IHRjX2NsYXNzaWZ5KHNrYiwgcS0+ZmlsdGVyX2xpc3QsICZyZXMpOwpAQCAtMjI4LDE4ICsyMTEsMTkgQEAKIH0KIAogLyoKLSAqIHggOiBzbG90IG51bWJlciBbMCAuLiBTRlFfU0xPVFMgLSAxXQorICogeCA6IHNsb3QgbnVtYmVyIFswIC4uIFNGUV9NQVhfRkxPV1MgLSAxXQogICovCiBzdGF0aWMgaW5saW5lIHZvaWQgc2ZxX2xpbmsoc3RydWN0IHNmcV9zY2hlZF9kYXRhICpxLCBzZnFfaW5kZXggeCkKIHsKIAlzZnFfaW5kZXggcCwgbjsKLQlpbnQgcWxlbiA9IHEtPnNsb3RzW3hdLnFsZW47CisJc3RydWN0IHNmcV9zbG90ICpzbG90ID0gJnEtPnNsb3RzW3hdOworCWludCBxbGVuID0gc2xvdC0+cWxlbjsKIAotCXAgPSBxbGVuICsgU0ZRX1NMT1RTOworCXAgPSBxbGVuICsgU0ZRX01BWF9GTE9XUzsKIAluID0gcS0+ZGVwW3FsZW5dLm5leHQ7CiAKLQlxLT5zbG90c1t4XS5kZXAubmV4dCA9IG47Ci0JcS0+c2xvdHNbeF0uZGVwLnByZXYgPSBwOworCXNsb3QtPmRlcC5uZXh0ID0gbjsKKwlzbG90LT5kZXAucHJldiA9IHA7CiAKIAlxLT5kZXBbcWxlbl0ubmV4dCA9IHg7CQkvKiBzZnFfZGVwX2hlYWQocSwgcCktPm5leHQgPSB4ICovCiAJc2ZxX2RlcF9oZWFkKHEsIG4pLT5wcmV2ID0geDsKQEAgLTMwNCw2ICsyODgsNyBAQAogCiBzdGF0aWMgaW5saW5lIHZvaWQgc2xvdF9xdWV1ZV9pbml0KHN0cnVjdCBzZnFfc2xvdCAqc2xvdCkKIHsKKwltZW1zZXQoc2xvdCwgMCwgc2l6ZW9mKCpzbG90KSk7CiAJc2xvdC0+c2tibGlzdF9wcmV2ID0gc2xvdC0+c2tibGlzdF9uZXh0ID0gKHN0cnVjdCBza19idWZmICopc2xvdDsKIH0KIApAQCAtMzM0LDcgKzMxOSw3IEBACiAJCXggPSBxLT5kZXBbZF0ubmV4dDsKIAkJc2xvdCA9ICZxLT5zbG90c1t4XTsKIGRyb3A6Ci0JCXNrYiA9IHNsb3RfZGVxdWV1ZV90YWlsKHNsb3QpOworCQlza2IgPSBxLT5oZWFkZHJvcCA/IHNsb3RfZGVxdWV1ZV9oZWFkKHNsb3QpIDogc2xvdF9kZXF1ZXVlX3RhaWwoc2xvdCk7CiAJCWxlbiA9IHFkaXNjX3BrdF9sZW4oc2tiKTsKIAkJc2ZxX2RlYyhxLCB4KTsKIAkJa2ZyZWVfc2tiKHNrYik7CkBAIC0zNzgsMTYgKzM2MywyNyBAQAogCXNsb3QgPSAmcS0+c2xvdHNbeF07CiAJaWYgKHggPT0gU0ZRX0VNUFRZX1NMT1QpIHsKIAkJeCA9IHEtPmRlcFswXS5uZXh0OyAvKiBnZXQgYSBmcmVlIHNsb3QgKi8KKwkJaWYgKHggPj0gU0ZRX01BWF9GTE9XUykKKwkJCXJldHVybiBxZGlzY19kcm9wKHNrYiwgc2NoKTsKIAkJcS0+aHRbaGFzaF0gPSB4OwogCQlzbG90ID0gJnEtPnNsb3RzW3hdOwogCQlzbG90LT5oYXNoID0gaGFzaDsKIAl9CiAKLQkvKiBJZiBzZWxlY3RlZCBxdWV1ZSBoYXMgbGVuZ3RoIHEtPmxpbWl0LCBkbyBzaW1wbGUgdGFpbCBkcm9wLAotCSAqIGkuZS4gZHJvcCBfdGhpc18gcGFja2V0LgotCSAqLwotCWlmIChzbG90LT5xbGVuID49IHEtPmxpbWl0KQotCQlyZXR1cm4gcWRpc2NfZHJvcChza2IsIHNjaCk7CisJaWYgKHNsb3QtPnFsZW4gPj0gcS0+bWF4ZGVwdGgpIHsKKwkJc3RydWN0IHNrX2J1ZmYgKmhlYWQ7CisKKwkJaWYgKCFxLT5oZWFkZHJvcCkKKwkJCXJldHVybiBxZGlzY19kcm9wKHNrYiwgc2NoKTsKKworCQloZWFkID0gc2xvdF9kZXF1ZXVlX2hlYWQoc2xvdCk7CisJCXNjaC0+cXN0YXRzLmJhY2tsb2cgLT0gcWRpc2NfcGt0X2xlbihoZWFkKTsKKwkJcWRpc2NfZHJvcChoZWFkLCBzY2gpOworCisJCXNjaC0+cXN0YXRzLmJhY2tsb2cgKz0gcWRpc2NfcGt0X2xlbihza2IpOworCQlzbG90X3F1ZXVlX2FkZChzbG90LCBza2IpOworCQlyZXR1cm4gTkVUX1hNSVRfQ047CisJfQogCiAJc2NoLT5xc3RhdHMuYmFja2xvZyArPSBxZGlzY19wa3RfbGVuKHNrYik7CiAJc2xvdF9xdWV1ZV9hZGQoc2xvdCwgc2tiKTsKQEAgLTM5NSwxMSArMzkxLDExIEBACiAJaWYgKHNsb3QtPnFsZW4gPT0gMSkgewkJLyogVGhlIGZsb3cgaXMgbmV3ICovCiAJCWlmIChxLT50YWlsID09IE5VTEwpIHsJLyogSXQgaXMgdGhlIGZpcnN0IGZsb3cgKi8KIAkJCXNsb3QtPm5leHQgPSB4OworCQkJcS0+dGFpbCA9IHNsb3Q7CiAJCX0gZWxzZSB7CiAJCQlzbG90LT5uZXh0ID0gcS0+dGFpbC0+bmV4dDsKIAkJCXEtPnRhaWwtPm5leHQgPSB4OwogCQl9Ci0JCXEtPnRhaWwgPSBzbG90OwogCQlzbG90LT5hbGxvdCA9IHEtPnNjYWxlZF9xdWFudHVtOwogCX0KIAlpZiAoKytzY2gtPnEucWxlbiA8PSBxLT5saW1pdCkKQEAgLTQ2OCwxMiArNDY0LDgzIEBACiAJCWtmcmVlX3NrYihza2IpOwogfQogCisvKgorICogV2hlbiBxLT5wZXJ0dXJiYXRpb24gaXMgY2hhbmdlZCwgd2UgcmVoYXNoIGFsbCBxdWV1ZWQgc2ticworICogdG8gYXZvaWQgT09PIChPdXQgT2YgT3JkZXIpIGVmZmVjdHMuCisgKiBXZSBkb250IHVzZSBzZnFfZGVxdWV1ZSgpL3NmcV9lbnF1ZXVlKCkgYmVjYXVzZSB3ZSBkb250IHdhbnQgdG8gY2hhbmdlCisgKiBjb3VudGVycy4KKyAqLworc3RhdGljIHZvaWQgc2ZxX3JlaGFzaChzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2ZxX3Nsb3QgKnNsb3Q7CisJc3RydWN0IHNrX2J1ZmZfaGVhZCBsaXN0OworCWludCBkcm9wcGVkID0gMDsKKworCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgmbGlzdCk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcS0+bWF4Zmxvd3M7IGkrKykgeworCQlzbG90ID0gJnEtPnNsb3RzW2ldOworCQlpZiAoIXNsb3QtPnFsZW4pCisJCQljb250aW51ZTsKKwkJd2hpbGUgKHNsb3QtPnFsZW4pIHsKKwkJCXNrYiA9IHNsb3RfZGVxdWV1ZV9oZWFkKHNsb3QpOworCQkJc2ZxX2RlYyhxLCBpKTsKKwkJCV9fc2tiX3F1ZXVlX3RhaWwoJmxpc3QsIHNrYik7CisJCX0KKwkJcS0+aHRbc2xvdC0+aGFzaF0gPSBTRlFfRU1QVFlfU0xPVDsKKwl9CisJcS0+dGFpbCA9IE5VTEw7CisKKwl3aGlsZSAoKHNrYiA9IF9fc2tiX2RlcXVldWUoJmxpc3QpKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGludCBoYXNoID0gc2ZxX2hhc2gocSwgc2tiKTsKKwkJc2ZxX2luZGV4IHggPSBxLT5odFtoYXNoXTsKKworCQlzbG90ID0gJnEtPnNsb3RzW3hdOworCQlpZiAoeCA9PSBTRlFfRU1QVFlfU0xPVCkgeworCQkJeCA9IHEtPmRlcFswXS5uZXh0OyAvKiBnZXQgYSBmcmVlIHNsb3QgKi8KKwkJCWlmICh4ID49IFNGUV9NQVhfRkxPV1MpIHsKK2Ryb3A6CQkJCXNjaC0+cXN0YXRzLmJhY2tsb2cgLT0gcWRpc2NfcGt0X2xlbihza2IpOworCQkJCWtmcmVlX3NrYihza2IpOworCQkJCWRyb3BwZWQrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXEtPmh0W2hhc2hdID0geDsKKwkJCXNsb3QgPSAmcS0+c2xvdHNbeF07CisJCQlzbG90LT5oYXNoID0gaGFzaDsKKwkJfQorCQlpZiAoc2xvdC0+cWxlbiA+PSBxLT5tYXhkZXB0aCkKKwkJCWdvdG8gZHJvcDsKKwkJc2xvdF9xdWV1ZV9hZGQoc2xvdCwgc2tiKTsKKwkJc2ZxX2luYyhxLCB4KTsKKwkJaWYgKHNsb3QtPnFsZW4gPT0gMSkgewkJLyogVGhlIGZsb3cgaXMgbmV3ICovCisJCQlpZiAocS0+dGFpbCA9PSBOVUxMKSB7CS8qIEl0IGlzIHRoZSBmaXJzdCBmbG93ICovCisJCQkJc2xvdC0+bmV4dCA9IHg7CisJCQl9IGVsc2UgeworCQkJCXNsb3QtPm5leHQgPSBxLT50YWlsLT5uZXh0OworCQkJCXEtPnRhaWwtPm5leHQgPSB4OworCQkJfQorCQkJcS0+dGFpbCA9IHNsb3Q7CisJCQlzbG90LT5hbGxvdCA9IHEtPnNjYWxlZF9xdWFudHVtOworCQl9CisJfQorCXNjaC0+cS5xbGVuIC09IGRyb3BwZWQ7CisJcWRpc2NfdHJlZV9kZWNyZWFzZV9xbGVuKHNjaCwgZHJvcHBlZCk7Cit9CisKIHN0YXRpYyB2b2lkIHNmcV9wZXJ0dXJiYXRpb24odW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IFFkaXNjICpzY2ggPSAoc3RydWN0IFFkaXNjICopYXJnOwogCXN0cnVjdCBzZnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKKwlzcGlubG9ja190ICpyb290X2xvY2sgPSBxZGlzY19sb2NrKHFkaXNjX3Jvb3Rfc2xlZXBpbmcoc2NoKSk7CiAKKwlzcGluX2xvY2socm9vdF9sb2NrKTsKIAlxLT5wZXJ0dXJiYXRpb24gPSBuZXRfcmFuZG9tKCk7CisJaWYgKCFxLT5maWx0ZXJfbGlzdCAmJiBxLT50YWlsKQorCQlzZnFfcmVoYXNoKHNjaCk7CisJc3Bpbl91bmxvY2socm9vdF9sb2NrKTsKIAogCWlmIChxLT5wZXJ0dXJiX3BlcmlvZCkKIAkJbW9kX3RpbWVyKCZxLT5wZXJ0dXJiX3RpbWVyLCBqaWZmaWVzICsgcS0+cGVydHVyYl9wZXJpb2QpOwpAQCAtNDgzLDIzICs1NTAsMzkgQEAKIHsKIAlzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CiAJc3RydWN0IHRjX3NmcV9xb3B0ICpjdGwgPSBubGFfZGF0YShvcHQpOworCXN0cnVjdCB0Y19zZnFfcW9wdF92MSAqY3RsX3YxID0gTlVMTDsKIAl1bnNpZ25lZCBpbnQgcWxlbjsKIAogCWlmIChvcHQtPm5sYV9sZW4gPCBubGFfYXR0cl9zaXplKHNpemVvZigqY3RsKSkpCiAJCXJldHVybiAtRUlOVkFMOwotCisJaWYgKG9wdC0+bmxhX2xlbiA+PSBubGFfYXR0cl9zaXplKHNpemVvZigqY3RsX3YxKSkpCisJCWN0bF92MSA9IG5sYV9kYXRhKG9wdCk7CiAJaWYgKGN0bC0+ZGl2aXNvciAmJgogCSAgICAoIWlzX3Bvd2VyX29mXzIoY3RsLT5kaXZpc29yKSB8fCBjdGwtPmRpdmlzb3IgPiA2NTUzNikpCiAJCXJldHVybiAtRUlOVkFMOwogCiAJc2NoX3RyZWVfbG9jayhzY2gpOwotCXEtPnF1YW50dW0gPSBjdGwtPnF1YW50dW0gPyA6IHBzY2hlZF9tdHUocWRpc2NfZGV2KHNjaCkpOwotCXEtPnNjYWxlZF9xdWFudHVtID0gU0ZRX0FMTE9UX1NJWkUocS0+cXVhbnR1bSk7CisJaWYgKGN0bC0+cXVhbnR1bSkgeworCQlxLT5xdWFudHVtID0gY3RsLT5xdWFudHVtOworCQlxLT5zY2FsZWRfcXVhbnR1bSA9IFNGUV9BTExPVF9TSVpFKHEtPnF1YW50dW0pOworCX0KIAlxLT5wZXJ0dXJiX3BlcmlvZCA9IGN0bC0+cGVydHVyYl9wZXJpb2QgKiBIWjsKLQlpZiAoY3RsLT5saW1pdCkKLQkJcS0+bGltaXQgPSBtaW5fdCh1MzIsIGN0bC0+bGltaXQsIFNGUV9ERVBUSCAtIDEpOwotCWlmIChjdGwtPmRpdmlzb3IpCisJaWYgKGN0bC0+Zmxvd3MpCisJCXEtPm1heGZsb3dzID0gbWluX3QodTMyLCBjdGwtPmZsb3dzLCBTRlFfTUFYX0ZMT1dTKTsKKwlpZiAoY3RsLT5kaXZpc29yKSB7CiAJCXEtPmRpdmlzb3IgPSBjdGwtPmRpdmlzb3I7CisJCXEtPm1heGZsb3dzID0gbWluX3QodTMyLCBxLT5tYXhmbG93cywgcS0+ZGl2aXNvcik7CisJfQorCWlmIChjdGxfdjEpIHsKKwkJaWYgKGN0bF92MS0+ZGVwdGgpCisJCQlxLT5tYXhkZXB0aCA9IG1pbl90KHUzMiwgY3RsX3YxLT5kZXB0aCwgU0ZRX01BWF9ERVBUSCk7CisJCXEtPmhlYWRkcm9wID0gY3RsX3YxLT5oZWFkZHJvcDsKKwl9CisJaWYgKGN0bC0+bGltaXQpIHsKKwkJcS0+bGltaXQgPSBtaW5fdCh1MzIsIGN0bC0+bGltaXQsIHEtPm1heGRlcHRoICogcS0+bWF4Zmxvd3MpOworCQlxLT5tYXhmbG93cyA9IG1pbl90KHUzMiwgcS0+bWF4Zmxvd3MsIHEtPmxpbWl0KTsKKwl9CisKIAlxbGVuID0gc2NoLT5xLnFsZW47CiAJd2hpbGUgKHNjaC0+cS5xbGVuID4gcS0+bGltaXQpCiAJCXNmcV9kcm9wKHNjaCk7CkBAIC01MTQsNDYgKzU5Nyw3NyBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgdm9pZCAqc2ZxX2FsbG9jKHNpemVfdCBzeikKK3sKKwl2b2lkICpwdHIgPSBrbWFsbG9jKHN6LCBHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOKTsKKworCWlmICghcHRyKQorCQlwdHIgPSB2bWFsbG9jKHN6KTsKKwlyZXR1cm4gcHRyOworfQorCitzdGF0aWMgdm9pZCBzZnFfZnJlZSh2b2lkICphZGRyKQoreworCWlmIChhZGRyKSB7CisJCWlmIChpc192bWFsbG9jX2FkZHIoYWRkcikpCisJCQl2ZnJlZShhZGRyKTsKKwkJZWxzZQorCQkJa2ZyZWUoYWRkcik7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZnFfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3Qgc2ZxX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KHNjaCk7CisKKwl0Y2ZfZGVzdHJveV9jaGFpbigmcS0+ZmlsdGVyX2xpc3QpOworCXEtPnBlcnR1cmJfcGVyaW9kID0gMDsKKwlkZWxfdGltZXJfc3luYygmcS0+cGVydHVyYl90aW1lcik7CisJc2ZxX2ZyZWUocS0+aHQpOworCXNmcV9mcmVlKHEtPnNsb3RzKTsKK30KKwogc3RhdGljIGludCBzZnFfaW5pdChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3RydWN0IG5sYXR0ciAqb3B0KQogewogCXN0cnVjdCBzZnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKLQlzaXplX3Qgc3o7CiAJaW50IGk7CiAKIAlxLT5wZXJ0dXJiX3RpbWVyLmZ1bmN0aW9uID0gc2ZxX3BlcnR1cmJhdGlvbjsKIAlxLT5wZXJ0dXJiX3RpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZylzY2g7CiAJaW5pdF90aW1lcl9kZWZlcnJhYmxlKCZxLT5wZXJ0dXJiX3RpbWVyKTsKIAotCWZvciAoaSA9IDA7IGkgPCBTRlFfREVQVEg7IGkrKykgewotCQlxLT5kZXBbaV0ubmV4dCA9IGkgKyBTRlFfU0xPVFM7Ci0JCXEtPmRlcFtpXS5wcmV2ID0gaSArIFNGUV9TTE9UUzsKKwlmb3IgKGkgPSAwOyBpIDwgU0ZRX01BWF9ERVBUSCArIDE7IGkrKykgeworCQlxLT5kZXBbaV0ubmV4dCA9IGkgKyBTRlFfTUFYX0ZMT1dTOworCQlxLT5kZXBbaV0ucHJldiA9IGkgKyBTRlFfTUFYX0ZMT1dTOwogCX0KIAotCXEtPmxpbWl0ID0gU0ZRX0RFUFRIIC0gMTsKKwlxLT5saW1pdCA9IFNGUV9NQVhfREVQVEg7CisJcS0+bWF4ZGVwdGggPSBTRlFfTUFYX0RFUFRIOwogCXEtPmN1cl9kZXB0aCA9IDA7CiAJcS0+dGFpbCA9IE5VTEw7CiAJcS0+ZGl2aXNvciA9IFNGUV9ERUZBVUxUX0hBU0hfRElWSVNPUjsKLQlpZiAob3B0ID09IE5VTEwpIHsKLQkJcS0+cXVhbnR1bSA9IHBzY2hlZF9tdHUocWRpc2NfZGV2KHNjaCkpOwotCQlxLT5zY2FsZWRfcXVhbnR1bSA9IFNGUV9BTExPVF9TSVpFKHEtPnF1YW50dW0pOwotCQlxLT5wZXJ0dXJiX3BlcmlvZCA9IDA7Ci0JCXEtPnBlcnR1cmJhdGlvbiA9IG5ldF9yYW5kb20oKTsKLQl9IGVsc2UgeworCXEtPm1heGZsb3dzID0gU0ZRX0RFRkFVTFRfRkxPV1M7CisJcS0+cXVhbnR1bSA9IHBzY2hlZF9tdHUocWRpc2NfZGV2KHNjaCkpOworCXEtPnNjYWxlZF9xdWFudHVtID0gU0ZRX0FMTE9UX1NJWkUocS0+cXVhbnR1bSk7CisJcS0+cGVydHVyYl9wZXJpb2QgPSAwOworCXEtPnBlcnR1cmJhdGlvbiA9IG5ldF9yYW5kb20oKTsKKworCWlmIChvcHQpIHsKIAkJaW50IGVyciA9IHNmcV9jaGFuZ2Uoc2NoLCBvcHQpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlzeiA9IHNpemVvZihxLT5odFswXSkgKiBxLT5kaXZpc29yOwotCXEtPmh0ID0ga21hbGxvYyhzeiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFxLT5odCAmJiBzeiA+IFBBR0VfU0laRSkKLQkJcS0+aHQgPSB2bWFsbG9jKHN6KTsKLQlpZiAoIXEtPmh0KQorCXEtPmh0ID0gc2ZxX2FsbG9jKHNpemVvZihxLT5odFswXSkgKiBxLT5kaXZpc29yKTsKKwlxLT5zbG90cyA9IHNmcV9hbGxvYyhzaXplb2YocS0+c2xvdHNbMF0pICogcS0+bWF4Zmxvd3MpOworCWlmICghcS0+aHQgfHwgIXEtPnNsb3RzKSB7CisJCXNmcV9kZXN0cm95KHNjaCk7CiAJCXJldHVybiAtRU5PTUVNOworCX0KIAlmb3IgKGkgPSAwOyBpIDwgcS0+ZGl2aXNvcjsgaSsrKQogCQlxLT5odFtpXSA9IFNGUV9FTVBUWV9TTE9UOwogCi0JZm9yIChpID0gMDsgaSA8IFNGUV9TTE9UUzsgaSsrKSB7CisJZm9yIChpID0gMDsgaSA8IHEtPm1heGZsb3dzOyBpKyspIHsKIAkJc2xvdF9xdWV1ZV9pbml0KCZxLT5zbG90c1tpXSk7CiAJCXNmcV9saW5rKHEsIGkpOwogCX0KQEAgLTU2NCwzMSArNjc4LDIwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHNmcV9kZXN0cm95KHN0cnVjdCBRZGlzYyAqc2NoKQotewotCXN0cnVjdCBzZnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKLQotCXRjZl9kZXN0cm95X2NoYWluKCZxLT5maWx0ZXJfbGlzdCk7Ci0JcS0+cGVydHVyYl9wZXJpb2QgPSAwOwotCWRlbF90aW1lcl9zeW5jKCZxLT5wZXJ0dXJiX3RpbWVyKTsKLQlpZiAoaXNfdm1hbGxvY19hZGRyKHEtPmh0KSkKLQkJdmZyZWUocS0+aHQpOwotCWVsc2UKLQkJa2ZyZWUocS0+aHQpOwotfQotCiBzdGF0aWMgaW50IHNmcV9kdW1wKHN0cnVjdCBRZGlzYyAqc2NoLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKQogewogCXN0cnVjdCBzZnFfc2NoZWRfZGF0YSAqcSA9IHFkaXNjX3ByaXYoc2NoKTsKIAl1bnNpZ25lZCBjaGFyICpiID0gc2tiX3RhaWxfcG9pbnRlcihza2IpOwotCXN0cnVjdCB0Y19zZnFfcW9wdCBvcHQ7CisJc3RydWN0IHRjX3NmcV9xb3B0X3YxIG9wdDsKIAotCW9wdC5xdWFudHVtID0gcS0+cXVhbnR1bTsKLQlvcHQucGVydHVyYl9wZXJpb2QgPSBxLT5wZXJ0dXJiX3BlcmlvZCAvIEhaOwotCi0Jb3B0LmxpbWl0ID0gcS0+bGltaXQ7Ci0Jb3B0LmRpdmlzb3IgPSBxLT5kaXZpc29yOwotCW9wdC5mbG93cyA9IHEtPmxpbWl0OworCW1lbXNldCgmb3B0LCAwLCBzaXplb2Yob3B0KSk7CisJb3B0LnYwLnF1YW50dW0JPSBxLT5xdWFudHVtOworCW9wdC52MC5wZXJ0dXJiX3BlcmlvZCA9IHEtPnBlcnR1cmJfcGVyaW9kIC8gSFo7CisJb3B0LnYwLmxpbWl0CT0gcS0+bGltaXQ7CisJb3B0LnYwLmRpdmlzb3IJPSBxLT5kaXZpc29yOworCW9wdC52MC5mbG93cwk9IHEtPm1heGZsb3dzOworCW9wdC5kZXB0aAk9IHEtPm1heGRlcHRoOworCW9wdC5oZWFkZHJvcAk9IHEtPmhlYWRkcm9wOwogCiAJTkxBX1BVVChza2IsIFRDQV9PUFRJT05TLCBzaXplb2Yob3B0KSwgJm9wdCk7CiAKZGlmZiAtLWdpdCBhL25ldC9zY2hlZC9zY2hfdGJmLmMgYi9uZXQvc2NoZWQvc2NoX3RiZi5jCmluZGV4IDFkY2ZiNTIuLmI4ZTE1NjMgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfdGJmLmMKKysrIGIvbmV0L3NjaGVkL3NjaF90YmYuYwpAQCAtMzQ2LDYgKzM0Niw3IEBACiAJc3RydWN0IG5sYXR0ciAqbmVzdDsKIAlzdHJ1Y3QgdGNfdGJmX3FvcHQgb3B0OwogCisJc2NoLT5xc3RhdHMuYmFja2xvZyA9IHEtPnFkaXNjLT5xc3RhdHMuYmFja2xvZzsKIAluZXN0ID0gbmxhX25lc3Rfc3RhcnQoc2tiLCBUQ0FfT1BUSU9OUyk7CiAJaWYgKG5lc3QgPT0gTlVMTCkKIAkJZ290byBubGFfcHV0X2ZhaWx1cmU7CmRpZmYgLS1naXQgYS9uZXQvc2NoZWQvc2NoX3RlcWwuYyBiL25ldC9zY2hlZC9zY2hfdGVxbC5jCmluZGV4IGEzYjcxMjAuLjQ1MzI2NTkgMTAwNjQ0Ci0tLSBhL25ldC9zY2hlZC9zY2hfdGVxbC5jCisrKyBiL25ldC9zY2hlZC9zY2hfdGVxbC5jCkBAIC0yMjUsMTEgKzIyNSwxMSBAQAogCiAKIHN0YXRpYyBpbnQKLV9fdGVxbF9yZXNvbHZlKHN0cnVjdCBza19idWZmICpza2IsIHN0cnVjdCBza19idWZmICpza2JfcmVzLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorX190ZXFsX3Jlc29sdmUoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHNrX2J1ZmYgKnNrYl9yZXMsCisJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSwKKwkgICAgICAgc3RydWN0IG5laWdoYm91ciAqbW4pCiB7Ci0Jc3RydWN0IG5ldGRldl9xdWV1ZSAqZGV2X3F1ZXVlID0gbmV0ZGV2X2dldF90eF9xdWV1ZShkZXYsIDApOwotCXN0cnVjdCB0ZXFsX3NjaGVkX2RhdGEgKnEgPSBxZGlzY19wcml2KGRldl9xdWV1ZS0+cWRpc2MpOwotCXN0cnVjdCBuZWlnaGJvdXIgKm1uID0gZHN0X2dldF9uZWlnaGJvdXIoc2tiX2RzdChza2IpKTsKKwlzdHJ1Y3QgdGVxbF9zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdih0eHEtPnFkaXNjKTsKIAlzdHJ1Y3QgbmVpZ2hib3VyICpuID0gcS0+bmNhY2hlOwogCiAJaWYgKG1uLT50YmwgPT0gTlVMTCkKQEAgLTI2MiwxNyArMjYyLDI2IEBACiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHRlcWxfcmVzb2x2ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAotCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2JfcmVzLCBzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQorCQkJICAgICAgIHN0cnVjdCBza19idWZmICpza2JfcmVzLAorCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICAgc3RydWN0IG5ldGRldl9xdWV1ZSAqdHhxKQogewotCXN0cnVjdCBuZXRkZXZfcXVldWUgKnR4cSA9IG5ldGRldl9nZXRfdHhfcXVldWUoZGV2LCAwKTsKKwlzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QgPSBza2JfZHN0KHNrYik7CisJc3RydWN0IG5laWdoYm91ciAqbW47CisJaW50IHJlczsKKwogCWlmICh0eHEtPnFkaXNjID09ICZub29wX3FkaXNjKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmIChkZXYtPmhlYWRlcl9vcHMgPT0gTlVMTCB8fAotCSAgICBza2JfZHN0KHNrYikgPT0gTlVMTCB8fAotCSAgICBkc3RfZ2V0X25laWdoYm91cihza2JfZHN0KHNrYikpID09IE5VTEwpCisJaWYgKCFkZXYtPmhlYWRlcl9vcHMgfHwgIWRzdCkKIAkJcmV0dXJuIDA7Ci0JcmV0dXJuIF9fdGVxbF9yZXNvbHZlKHNrYiwgc2tiX3JlcywgZGV2KTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwltbiA9IGRzdF9nZXRfbmVpZ2hib3VyX25vcmVmKGRzdCk7CisJcmVzID0gbW4gPyBfX3RlcWxfcmVzb2x2ZShza2IsIHNrYl9yZXMsIGRldiwgdHhxLCBtbikgOiAwOworCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHJlczsKIH0KIAogc3RhdGljIG5ldGRldl90eF90IHRlcWxfbWFzdGVyX3htaXQoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKQEAgLTMwMSwxOCArMzEwLDE4IEBACiAKIAkJaWYgKHNsYXZlX3R4cS0+cWRpc2Nfc2xlZXBpbmcgIT0gcSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoX19uZXRpZl9zdWJxdWV1ZV9zdG9wcGVkKHNsYXZlLCBzdWJxKSB8fAorCQlpZiAobmV0aWZfeG1pdF9zdG9wcGVkKG5ldGRldl9nZXRfdHhfcXVldWUoc2xhdmUsIHN1YnEpKSB8fAogCQkgICAgIW5ldGlmX3J1bm5pbmcoc2xhdmUpKSB7CiAJCQlidXN5ID0gMTsKIAkJCWNvbnRpbnVlOwogCQl9CiAKLQkJc3dpdGNoICh0ZXFsX3Jlc29sdmUoc2tiLCBza2JfcmVzLCBzbGF2ZSkpIHsKKwkJc3dpdGNoICh0ZXFsX3Jlc29sdmUoc2tiLCBza2JfcmVzLCBzbGF2ZSwgc2xhdmVfdHhxKSkgewogCQljYXNlIDA6CiAJCQlpZiAoX19uZXRpZl90eF90cnlsb2NrKHNsYXZlX3R4cSkpIHsKIAkJCQl1bnNpZ25lZCBpbnQgbGVuZ3RoID0gcWRpc2NfcGt0X2xlbihza2IpOwogCi0JCQkJaWYgKCFuZXRpZl90eF9xdWV1ZV9mcm96ZW5fb3Jfc3RvcHBlZChzbGF2ZV90eHEpICYmCisJCQkJaWYgKCFuZXRpZl94bWl0X2Zyb3plbl9vcl9zdG9wcGVkKHNsYXZlX3R4cSkgJiYKIAkJCQkgICAgc2xhdmVfb3BzLT5uZG9fc3RhcnRfeG1pdChza2IsIHNsYXZlKSA9PSBORVRERVZfVFhfT0spIHsKIAkJCQkJdHhxX3RyYW5zX3VwZGF0ZShzbGF2ZV90eHEpOwogCQkJCQlfX25ldGlmX3R4X3VubG9jayhzbGF2ZV90eHEpOwpAQCAtMzI0LDcgKzMzMyw3IEBACiAJCQkJfQogCQkJCV9fbmV0aWZfdHhfdW5sb2NrKHNsYXZlX3R4cSk7CiAJCQl9Ci0JCQlpZiAobmV0aWZfcXVldWVfc3RvcHBlZChkZXYpKQorCQkJaWYgKG5ldGlmX3htaXRfc3RvcHBlZChuZXRkZXZfZ2V0X3R4X3F1ZXVlKGRldiwgMCkpKQogCQkJCWJ1c3kgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgMToKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2Fzc29jaW9sYS5jIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKaW5kZXggMTUyYjViMy4uYWNkMmVkYiAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvYXNzb2Npb2xhLmMKKysrIGIvbmV0L3NjdHAvYXNzb2Npb2xhLmMKQEAgLTE3Myw3ICsxNzMsNyBAQAogCWFzb2MtPnRpbWVvdXRzW1NDVFBfRVZFTlRfVElNRU9VVF9IRUFSVEJFQVRdID0gMDsKIAlhc29jLT50aW1lb3V0c1tTQ1RQX0VWRU5UX1RJTUVPVVRfU0FDS10gPSBhc29jLT5zYWNrZGVsYXk7CiAJYXNvYy0+dGltZW91dHNbU0NUUF9FVkVOVF9USU1FT1VUX0FVVE9DTE9TRV0gPQotCQkodW5zaWduZWQgbG9uZylzcC0+YXV0b2Nsb3NlICogSFo7CisJCW1pbl90KHVuc2lnbmVkIGxvbmcsIHNwLT5hdXRvY2xvc2UsIHNjdHBfbWF4X2F1dG9jbG9zZSkgKiBIWjsKIAogCS8qIEluaXRpYWxpemVzIHRoZSB0aW1lcnMgKi8KIAlmb3IgKGkgPSBTQ1RQX0VWRU5UX1RJTUVPVVRfTk9ORTsgaSA8IFNDVFBfTlVNX1RJTUVPVVRfVFlQRVM7ICsraSkKZGlmZiAtLWdpdCBhL25ldC9zY3RwL2F1dGguYyBiL25ldC9zY3RwL2F1dGguYwppbmRleCA4NjVlNjhmLi5iZjgxMjA0IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9hdXRoLmMKKysrIGIvbmV0L3NjdHAvYXV0aC5jCkBAIC04Miw3ICs4Miw3IEBACiAJc3RydWN0IHNjdHBfYXV0aF9ieXRlcyAqa2V5OwogCiAJLyogVmVyaWZ5IHRoYXQgd2UgYXJlIG5vdCBnb2luZyB0byBvdmVyZmxvdyBJTlRfTUFYICovCi0JaWYgKChJTlRfTUFYIC0ga2V5X2xlbikgPCBzaXplb2Yoc3RydWN0IHNjdHBfYXV0aF9ieXRlcykpCisJaWYgKGtleV9sZW4gPiAoSU5UX01BWCAtIHNpemVvZihzdHJ1Y3Qgc2N0cF9hdXRoX2J5dGVzKSkpCiAJCXJldHVybiBOVUxMOwogCiAJLyogQWxsb2NhdGUgdGhlIHNoYXJlZCBrZXkgKi8KZGlmZiAtLWdpdCBhL25ldC9zY3RwL2lucHV0LmMgYi9uZXQvc2N0cC9pbnB1dC5jCmluZGV4IGI3NjkyYWEuLjgwZjcxYWYgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL2lucHV0LmMKKysrIGIvbmV0L3NjdHAvaW5wdXQuYwpAQCAtMTA1LDcgKzEwNSw3IEBACiBzdHJ1Y3Qgc2N0cF9pbnB1dF9jYiB7CiAJdW5pb24gewogCQlzdHJ1Y3QgaW5ldF9za2JfcGFybQloNDsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJc3RydWN0IGluZXQ2X3NrYl9wYXJtCWg2OwogI2VuZGlmCiAJfSBoZWFkZXI7CmRpZmYgLS1naXQgYS9uZXQvc2N0cC9pcHY2LmMgYi9uZXQvc2N0cC9pcHY2LmMKaW5kZXggODEwNDI3OC4uOTFmNDc5MSAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvaXB2Ni5jCisrKyBiL25ldC9zY3RwL2lwdjYuYwpAQCAtMTA3LDcgKzEwNyw3IEBACiAJCWlmIChhZGRyKSB7CiAJCQlhZGRyLT5hLnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAJCQlhZGRyLT5hLnY2LnNpbjZfcG9ydCA9IDA7Ci0JCQlpcHY2X2FkZHJfY29weSgmYWRkci0+YS52Ni5zaW42X2FkZHIsICZpZmEtPmFkZHIpOworCQkJYWRkci0+YS52Ni5zaW42X2FkZHIgPSBpZmEtPmFkZHI7CiAJCQlhZGRyLT5hLnY2LnNpbjZfc2NvcGVfaWQgPSBpZmEtPmlkZXYtPmRldi0+aWZpbmRleDsKIAkJCWFkZHItPnZhbGlkID0gMTsKIAkJCXNwaW5fbG9ja19iaCgmc2N0cF9sb2NhbF9hZGRyX2xvY2spOwpAQCAtMjE5LDggKzIxOSw4IEBACiAJLyogRmlsbCBpbiB0aGUgZGVzdCBhZGRyZXNzIGZyb20gdGhlIHJvdXRlIGVudHJ5IHBhc3NlZCB3aXRoIHRoZSBza2IKIAkgKiBhbmQgdGhlIHNvdXJjZSBhZGRyZXNzIGZyb20gdGhlIHRyYW5zcG9ydC4KIAkgKi8KLQlpcHY2X2FkZHJfY29weSgmZmw2LmRhZGRyLCAmdHJhbnNwb3J0LT5pcGFkZHIudjYuc2luNl9hZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmZmw2LnNhZGRyLCAmdHJhbnNwb3J0LT5zYWRkci52Ni5zaW42X2FkZHIpOworCWZsNi5kYWRkciA9IHRyYW5zcG9ydC0+aXBhZGRyLnY2LnNpbjZfYWRkcjsKKwlmbDYuc2FkZHIgPSB0cmFuc3BvcnQtPnNhZGRyLnY2LnNpbjZfYWRkcjsKIAogCWZsNi5mbG93bGFiZWwgPSBucC0+Zmxvd19sYWJlbDsKIAlJUDZfRUNOX2Zsb3dfeG1pdChzaywgZmw2LmZsb3dsYWJlbCk7CkBAIC0yMzEsNyArMjMxLDcgQEAKIAogCWlmIChucC0+b3B0ICYmIG5wLT5vcHQtPnNyY3J0KSB7CiAJCXN0cnVjdCBydDBfaGRyICpydDAgPSAoc3RydWN0IHJ0MF9oZHIgKikgbnAtPm9wdC0+c3JjcnQ7Ci0JCWlwdjZfYWRkcl9jb3B5KCZmbDYuZGFkZHIsIHJ0MC0+YWRkcik7CisJCWZsNi5kYWRkciA9ICpydDAtPmFkZHI7CiAJfQogCiAJU0NUUF9ERUJVR19QUklOVEsoIiVzOiBza2I6JXAsIGxlbjolZCwgc3JjOiVwSTYgZHN0OiVwSTZcbiIsCkBAIC0yNjUsNyArMjY1LDcgQEAKIAlzY3RwX3Njb3BlX3Qgc2NvcGU7CiAKIAltZW1zZXQoZmw2LCAwLCBzaXplb2Yoc3RydWN0IGZsb3dpNikpOwotCWlwdjZfYWRkcl9jb3B5KCZmbDYtPmRhZGRyLCAmZGFkZHItPnY2LnNpbjZfYWRkcik7CisJZmw2LT5kYWRkciA9IGRhZGRyLT52Ni5zaW42X2FkZHI7CiAJZmw2LT5mbDZfZHBvcnQgPSBkYWRkci0+djYuc2luNl9wb3J0OwogCWZsNi0+Zmxvd2k2X3Byb3RvID0gSVBQUk9UT19TQ1RQOwogCWlmIChpcHY2X2FkZHJfdHlwZSgmZGFkZHItPnY2LnNpbjZfYWRkcikgJiBJUFY2X0FERFJfTElOS0xPQ0FMKQpAQCAtMjc3LDcgKzI3Nyw3IEBACiAJCWZsNi0+Zmw2X3Nwb3J0ID0gaHRvbnMoYXNvYy0+YmFzZS5iaW5kX2FkZHIucG9ydCk7CiAKIAlpZiAoc2FkZHIpIHsKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi0+c2FkZHIsICZzYWRkci0+djYuc2luNl9hZGRyKTsKKwkJZmw2LT5zYWRkciA9IHNhZGRyLT52Ni5zaW42X2FkZHI7CiAJCWZsNi0+Zmw2X3Nwb3J0ID0gc2FkZHItPnY2LnNpbjZfcG9ydDsKIAkJU0NUUF9ERUJVR19QUklOVEsoIlNSQz0lcEk2IC0gIiwgJmZsNi0+c2FkZHIpOwogCX0KQEAgLTMzNCw3ICszMzQsNyBAQAogCX0KIAlyY3VfcmVhZF91bmxvY2soKTsKIAlpZiAoYmFkZHIpIHsKLQkJaXB2Nl9hZGRyX2NvcHkoJmZsNi0+c2FkZHIsICZiYWRkci0+djYuc2luNl9hZGRyKTsKKwkJZmw2LT5zYWRkciA9IGJhZGRyLT52Ni5zaW42X2FkZHI7CiAJCWZsNi0+Zmw2X3Nwb3J0ID0gYmFkZHItPnY2LnNpbjZfcG9ydDsKIAkJZHN0ID0gaXA2X2RzdF9sb29rdXBfZmxvdyhzaywgZmw2LCBOVUxMLCBmYWxzZSk7CiAJfQpAQCAtMzc1LDcgKzM3NSw3IEBACiAKIAlpZiAodC0+ZHN0KSB7CiAJCXNhZGRyLT52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwotCQlpcHY2X2FkZHJfY29weSgmc2FkZHItPnY2LnNpbjZfYWRkciwgJmZsNi0+c2FkZHIpOworCQlzYWRkci0+djYuc2luNl9hZGRyID0gZmw2LT5zYWRkcjsKIAl9CiB9CiAKQEAgLTQwMCw3ICs0MDAsNyBAQAogCQlpZiAoYWRkcikgewogCQkJYWRkci0+YS52Ni5zaW42X2ZhbWlseSA9IEFGX0lORVQ2OwogCQkJYWRkci0+YS52Ni5zaW42X3BvcnQgPSAwOwotCQkJaXB2Nl9hZGRyX2NvcHkoJmFkZHItPmEudjYuc2luNl9hZGRyLCAmaWZwLT5hZGRyKTsKKwkJCWFkZHItPmEudjYuc2luNl9hZGRyID0gaWZwLT5hZGRyOwogCQkJYWRkci0+YS52Ni5zaW42X3Njb3BlX2lkID0gZGV2LT5pZmluZGV4OwogCQkJYWRkci0+dmFsaWQgPSAxOwogCQkJSU5JVF9MSVNUX0hFQUQoJmFkZHItPmxpc3QpOwpAQCAtNDE2LDcgKzQxNiw2IEBACiBzdGF0aWMgdm9pZCBzY3RwX3Y2X2Zyb21fc2tiKHVuaW9uIHNjdHBfYWRkciAqYWRkcixzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAogCQkJICAgICBpbnQgaXNfc2FkZHIpCiB7Ci0Jdm9pZCAqZnJvbTsKIAlfX2JlMTYgKnBvcnQ7CiAJc3RydWN0IHNjdHBoZHIgKnNoOwogCkBAIC00MjgsMTIgKzQyNywxMSBAQAogCXNoID0gc2N0cF9oZHIoc2tiKTsKIAlpZiAoaXNfc2FkZHIpIHsKIAkJKnBvcnQgID0gc2gtPnNvdXJjZTsKLQkJZnJvbSA9ICZpcHY2X2hkcihza2IpLT5zYWRkcjsKKwkJYWRkci0+djYuc2luNl9hZGRyID0gaXB2Nl9oZHIoc2tiKS0+c2FkZHI7CiAJfSBlbHNlIHsKIAkJKnBvcnQgPSBzaC0+ZGVzdDsKLQkJZnJvbSA9ICZpcHY2X2hkcihza2IpLT5kYWRkcjsKKwkJYWRkci0+djYuc2luNl9hZGRyID0gaXB2Nl9oZHIoc2tiKS0+ZGFkZHI7CiAJfQotCWlwdjZfYWRkcl9jb3B5KCZhZGRyLT52Ni5zaW42X2FkZHIsIGZyb20pOwogfQogCiAvKiBJbml0aWFsaXplIGFuIHNjdHBfYWRkciBmcm9tIGEgc29ja2V0LiAqLwpAQCAtNDQxLDcgKzQzOSw3IEBACiB7CiAJYWRkci0+djYuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKIAlhZGRyLT52Ni5zaW42X3BvcnQgPSAwOwotCWlwdjZfYWRkcl9jb3B5KCZhZGRyLT52Ni5zaW42X2FkZHIsICZpbmV0Nl9zayhzayktPnJjdl9zYWRkcik7CisJYWRkci0+djYuc2luNl9hZGRyID0gaW5ldDZfc2soc2spLT5yY3Zfc2FkZHI7CiB9CiAKIC8qIEluaXRpYWxpemUgc2stPnNrX3Jjdl9zYWRkciBmcm9tIHNjdHBfYWRkci4gKi8KQEAgLTQ1NCw3ICs0NTIsNyBAQAogCQlpbmV0Nl9zayhzayktPnJjdl9zYWRkci5zNl9hZGRyMzJbM10gPQogCQkJYWRkci0+djQuc2luX2FkZHIuc19hZGRyOwogCX0gZWxzZSB7Ci0JCWlwdjZfYWRkcl9jb3B5KCZpbmV0Nl9zayhzayktPnJjdl9zYWRkciwgJmFkZHItPnY2LnNpbjZfYWRkcik7CisJCWluZXQ2X3NrKHNrKS0+cmN2X3NhZGRyID0gYWRkci0+djYuc2luNl9hZGRyOwogCX0KIH0KIApAQCAtNDY3LDcgKzQ2NSw3IEBACiAJCWluZXQ2X3NrKHNrKS0+ZGFkZHIuczZfYWRkcjMyWzJdID0gaHRvbmwoMHgwMDAwZmZmZik7CiAJCWluZXQ2X3NrKHNrKS0+ZGFkZHIuczZfYWRkcjMyWzNdID0gYWRkci0+djQuc2luX2FkZHIuc19hZGRyOwogCX0gZWxzZSB7Ci0JCWlwdjZfYWRkcl9jb3B5KCZpbmV0Nl9zayhzayktPmRhZGRyLCAmYWRkci0+djYuc2luNl9hZGRyKTsKKwkJaW5ldDZfc2soc2spLT5kYWRkciA9IGFkZHItPnY2LnNpbjZfYWRkcjsKIAl9CiB9CiAKQEAgLTQ3OSw3ICs0NzcsNyBAQAogCWFkZHItPnY2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CiAJYWRkci0+djYuc2luNl9wb3J0ID0gcG9ydDsKIAlhZGRyLT52Ni5zaW42X2Zsb3dpbmZvID0gMDsgLyogQlVHICovCi0JaXB2Nl9hZGRyX2NvcHkoJmFkZHItPnY2LnNpbjZfYWRkciwgJnBhcmFtLT52Ni5hZGRyKTsKKwlhZGRyLT52Ni5zaW42X2FkZHIgPSBwYXJhbS0+djYuYWRkcjsKIAlhZGRyLT52Ni5zaW42X3Njb3BlX2lkID0gaWlmOwogfQogCkBAIC00OTMsNyArNDkxLDcgQEAKIAogCXBhcmFtLT52Ni5wYXJhbV9oZHIudHlwZSA9IFNDVFBfUEFSQU1fSVBWNl9BRERSRVNTOwogCXBhcmFtLT52Ni5wYXJhbV9oZHIubGVuZ3RoID0gaHRvbnMobGVuZ3RoKTsKLQlpcHY2X2FkZHJfY29weSgmcGFyYW0tPnY2LmFkZHIsICZhZGRyLT52Ni5zaW42X2FkZHIpOworCXBhcmFtLT52Ni5hZGRyID0gYWRkci0+djYuc2luNl9hZGRyOwogCiAJcmV0dXJuIGxlbmd0aDsKIH0KQEAgLTUwNCw3ICs1MDIsNyBAQAogewogCWFkZHItPnNhLnNhX2ZhbWlseSA9IEFGX0lORVQ2OwogCWFkZHItPnY2LnNpbjZfcG9ydCA9IHBvcnQ7Ci0JaXB2Nl9hZGRyX2NvcHkoJmFkZHItPnY2LnNpbjZfYWRkciwgc2FkZHIpOworCWFkZHItPnY2LnNpbjZfYWRkciA9ICpzYWRkcjsKIH0KIAogLyogQ29tcGFyZSBhZGRyZXNzZXMgZXhhY3RseS4KQEAgLTc1OSw3ICs3NTcsNyBAQAogCQl9CiAKIAkJc2luNmZyb20gPSAmYXNvYy0+cGVlci5wcmltYXJ5X2FkZHIudjY7Ci0JCWlwdjZfYWRkcl9jb3B5KCZzaW42LT5zaW42X2FkZHIsICZzaW42ZnJvbS0+c2luNl9hZGRyKTsKKwkJc2luNi0+c2luNl9hZGRyID0gc2luNmZyb20tPnNpbjZfYWRkcjsKIAkJaWYgKGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkKIAkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBzaW42ZnJvbS0+c2luNl9zY29wZV9pZDsKIAl9CkBAIC03ODcsNyArNzg1LDcgQEAKIAkJfQogCiAJCS8qIE90aGVyd2lzZSwganVzdCBjb3B5IHRoZSB2NiBhZGRyZXNzLiAqLwotCQlpcHY2X2FkZHJfY29weSgmc2luNi0+c2luNl9hZGRyLCAmaXB2Nl9oZHIoc2tiKS0+c2FkZHIpOworCQlzaW42LT5zaW42X2FkZHIgPSBpcHY2X2hkcihza2IpLT5zYWRkcjsKIAkJaWYgKGlwdjZfYWRkcl90eXBlKCZzaW42LT5zaW42X2FkZHIpICYgSVBWNl9BRERSX0xJTktMT0NBTCkgewogCQkJc3RydWN0IHNjdHBfdWxwZXZlbnQgKmV2ID0gc2N0cF9za2IyZXZlbnQoc2tiKTsKIAkJCXNpbjYtPnNpbjZfc2NvcGVfaWQgPSBldi0+aWlmOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvb3V0cHV0LmMgYi9uZXQvc2N0cC9vdXRwdXQuYwppbmRleCAwOGIzY2VhLi44MTcxNzRlIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9vdXRwdXQuYworKysgYi9uZXQvc2N0cC9vdXRwdXQuYwpAQCAtNjk3LDEzICs2OTcsNyBAQAogCS8qIEtlZXAgdHJhY2sgb2YgaG93IG1hbnkgYnl0ZXMgYXJlIGluIGZsaWdodCB0byB0aGUgcmVjZWl2ZXIuICovCiAJYXNvYy0+b3V0cXVldWUub3V0c3RhbmRpbmdfYnl0ZXMgKz0gZGF0YXNpemU7CiAKLQkvKiBVcGRhdGUgb3VyIHZpZXcgb2YgdGhlIHJlY2VpdmVyJ3MgcnduZC4gSW5jbHVkZSBza19idWZmIG92ZXJoZWFkCi0JICogd2hpbGUgdXBkYXRpbmcgcGVlci5yd25kIHNvIHRoYXQgaXQgcmVkdWNlcyB0aGUgY2hhbmNlcyBvZiBhCi0JICogcmVjZWl2ZXIgcnVubmluZyBvdXQgb2YgcmVjZWl2ZSBidWZmZXIgc3BhY2UgZXZlbiB3aGVuIHJlY2VpdmUKLQkgKiB3aW5kb3cgaXMgc3RpbGwgb3Blbi4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBzZW5kZXIgaXMgc2VuZGluZwotCSAqIHNlbmRpbmcgc21hbGwgbWVzc2FnZXMuCi0JICovCi0JZGF0YXNpemUgKz0gc2l6ZW9mKHN0cnVjdCBza19idWZmKTsKKwkvKiBVcGRhdGUgb3VyIHZpZXcgb2YgdGhlIHJlY2VpdmVyJ3MgcnduZC4gKi8KIAlpZiAoZGF0YXNpemUgPCByd25kKQogCQlyd25kIC09IGRhdGFzaXplOwogCWVsc2UKZGlmZiAtLWdpdCBhL25ldC9zY3RwL291dHF1ZXVlLmMgYi9uZXQvc2N0cC9vdXRxdWV1ZS5jCmluZGV4IDE0YzJiMDYuLmNmZWIxZDQgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL291dHF1ZXVlLmMKKysrIGIvbmV0L3NjdHAvb3V0cXVldWUuYwpAQCAtNDExLDggKzQxMSw3IEBACiAJCQkJCWNodW5rLT50cmFuc3BvcnQtPmZsaWdodF9zaXplIC09CiAJCQkJCQkJc2N0cF9kYXRhX3NpemUoY2h1bmspOwogCQkJCXEtPm91dHN0YW5kaW5nX2J5dGVzIC09IHNjdHBfZGF0YV9zaXplKGNodW5rKTsKLQkJCQlxLT5hc29jLT5wZWVyLnJ3bmQgKz0gKHNjdHBfZGF0YV9zaXplKGNodW5rKSArCi0JCQkJCQkJc2l6ZW9mKHN0cnVjdCBza19idWZmKSk7CisJCQkJcS0+YXNvYy0+cGVlci5yd25kICs9IHNjdHBfZGF0YV9zaXplKGNodW5rKTsKIAkJCX0KIAkJCWNvbnRpbnVlOwogCQl9CkBAIC00MzIsOCArNDMxLDcgQEAKIAkJCSAqIChTZWN0aW9uIDcuMi40KSksIGFkZCB0aGUgZGF0YSBzaXplIG9mIHRob3NlCiAJCQkgKiBjaHVua3MgdG8gdGhlIHJ3bmQuCiAJCQkgKi8KLQkJCXEtPmFzb2MtPnBlZXIucnduZCArPSAoc2N0cF9kYXRhX3NpemUoY2h1bmspICsKLQkJCQkJCXNpemVvZihzdHJ1Y3Qgc2tfYnVmZikpOworCQkJcS0+YXNvYy0+cGVlci5yd25kICs9IHNjdHBfZGF0YV9zaXplKGNodW5rKTsKIAkJCXEtPm91dHN0YW5kaW5nX2J5dGVzIC09IHNjdHBfZGF0YV9zaXplKGNodW5rKTsKIAkJCWlmIChjaHVuay0+dHJhbnNwb3J0KQogCQkJCXRyYW5zcG9ydC0+ZmxpZ2h0X3NpemUgLT0gc2N0cF9kYXRhX3NpemUoY2h1bmspOwpkaWZmIC0tZ2l0IGEvbmV0L3NjdHAvcHJvdG9jb2wuYyBiL25ldC9zY3RwL3Byb3RvY29sLmMKaW5kZXggNjFiOWZjYS4uNTk0MmQyNyAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvcHJvdG9jb2wuYworKysgYi9uZXQvc2N0cC9wcm90b2NvbC5jCkBAIC02MzcsNyArNjM3LDcgQEAKIAkJICAgICIgZm9yIGNtZCAlZCBhdCBlbnRyeSAlcFxuIiwgJnNjdHBfYWRkcl93YWl0cSwgJmFkZHJ3LT5hLCBhZGRydy0+c3RhdGUsCiAJCSAgICBhZGRydyk7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkIChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJLyogTm93IHdlIHNlbmQgYW4gQVNDT05GIGZvciBlYWNoIGFzc29jaWF0aW9uICovCiAJCS8qIE5vdGUuIHdlIGN1cnJlbnRseSBkb24ndCBoYW5kbGUgbGluayBsb2NhbCBJUHY2IGFkZHJlc3NlZXMgKi8KIAkJaWYgKGFkZHJ3LT5hLnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgewpAQCAtMTI4NSw2ICsxMjg1LDkgQEAKIAlzY3RwX21heF9pbnN0cmVhbXMgICAgCQk9IFNDVFBfREVGQVVMVF9JTlNUUkVBTVM7CiAJc2N0cF9tYXhfb3V0c3RyZWFtcyAgIAkJPSBTQ1RQX0RFRkFVTFRfT1VUU1RSRUFNUzsKIAorCS8qIEluaXRpYWxpemUgbWF4aW11bSBhdXRvY2xvc2UgdGltZW91dC4gKi8KKwlzY3RwX21heF9hdXRvY2xvc2UJCT0gSU5UX01BWCAvIEhaOworCiAJLyogSW5pdGlhbGl6ZSBoYW5kbGUgdXNlZCBmb3IgYXNzb2NpYXRpb24gaWRzLiAqLwogCWlkcl9pbml0KCZzY3RwX2Fzc29jc19pZCk7CiAKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYyBiL25ldC9zY3RwL3NtX21ha2VfY2h1bmsuYwppbmRleCAwMTIxZTBhLi5hODVlZWViIDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9tYWtlX2NodW5rLmMKKysrIGIvbmV0L3NjdHAvc21fbWFrZV9jaHVuay5jCkBAIC0zNDAwLDggKzM0MDAsMTAgQEAKIAkJYXNjb25mX2xlbiAtPSBsZW5ndGg7CiAJfQogCi0JaWYgKG5vX2VyciAmJiBhc29jLT5zcmNfb3V0X29mX2Fzb2Nfb2spCisJaWYgKG5vX2VyciAmJiBhc29jLT5zcmNfb3V0X29mX2Fzb2Nfb2spIHsKIAkJYXNvYy0+c3JjX291dF9vZl9hc29jX29rID0gMDsKKwkJc2N0cF90cmFuc3BvcnRfaW1tZWRpYXRlX3J0eChhc29jLT5wZWVyLnByaW1hcnlfcGF0aCk7CisJfQogCiAJLyogRnJlZSB0aGUgY2FjaGVkIGxhc3Qgc2VudCBhc2NvbmYgY2h1bmsuICovCiAJbGlzdF9kZWxfaW5pdCgmYXNjb25mLT50cmFuc21pdHRlZF9saXN0KTsKZGlmZiAtLWdpdCBhL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYyBiL25ldC9zY3RwL3NtX3NpZGVlZmZlY3QuYwppbmRleCA3NjM4OGIwLi4xZmY1MWM5IDEwMDY0NAotLS0gYS9uZXQvc2N0cC9zbV9zaWRlZWZmZWN0LmMKKysrIGIvbmV0L3NjdHAvc21fc2lkZWVmZmVjdC5jCkBAIC02NjYsNiArNjY2LDcgQEAKIAkJCQkgIHN0cnVjdCBzY3RwX2NodW5rICpjaHVuaykKIHsKIAlzY3RwX3NlbmRlcl9oYl9pbmZvX3QgKmhiaW5mbzsKKwlpbnQgd2FzX3VuY29uZmlybWVkID0gMDsKIAogCS8qIDguMyBVcG9uIHRoZSByZWNlaXB0IG9mIHRoZSBIRUFSVEJFQVQgQUNLLCB0aGUgc2VuZGVyIG9mIHRoZQogCSAqIEhFQVJUQkVBVCBzaG91bGQgY2xlYXIgdGhlIGVycm9yIGNvdW50ZXIgb2YgdGhlIGRlc3RpbmF0aW9uCkBAIC02OTIsOSArNjkzLDExIEBACiAJLyogTWFyayB0aGUgZGVzdGluYXRpb24gdHJhbnNwb3J0IGFkZHJlc3MgYXMgYWN0aXZlIGlmIGl0IGlzIG5vdCBzbwogCSAqIG1hcmtlZC4KIAkgKi8KLQlpZiAoKHQtPnN0YXRlID09IFNDVFBfSU5BQ1RJVkUpIHx8ICh0LT5zdGF0ZSA9PSBTQ1RQX1VOQ09ORklSTUVEKSkKKwlpZiAoKHQtPnN0YXRlID09IFNDVFBfSU5BQ1RJVkUpIHx8ICh0LT5zdGF0ZSA9PSBTQ1RQX1VOQ09ORklSTUVEKSkgeworCQl3YXNfdW5jb25maXJtZWQgPSAxOwogCQlzY3RwX2Fzc29jX2NvbnRyb2xfdHJhbnNwb3J0KGFzb2MsIHQsIFNDVFBfVFJBTlNQT1JUX1VQLAogCQkJCQkgICAgIFNDVFBfSEVBUlRCRUFUX1NVQ0NFU1MpOworCX0KIAogCS8qIFRoZSByZWNlaXZlciBvZiB0aGUgSEVBUlRCRUFUIEFDSyBzaG91bGQgYWxzbyBwZXJmb3JtIGFuCiAJICogUlRUIG1lYXN1cmVtZW50IGZvciB0aGF0IGRlc3RpbmF0aW9uIHRyYW5zcG9ydCBhZGRyZXNzCkBAIC03MTIsNiArNzE1LDkgQEAKIAkvKiBVcGRhdGUgdGhlIGhlYXJ0YmVhdCB0aW1lci4gICovCiAJaWYgKCFtb2RfdGltZXIoJnQtPmhiX3RpbWVyLCBzY3RwX3RyYW5zcG9ydF90aW1lb3V0KHQpKSkKIAkJc2N0cF90cmFuc3BvcnRfaG9sZCh0KTsKKworCWlmICh3YXNfdW5jb25maXJtZWQgJiYgYXNvYy0+cGVlci50cmFuc3BvcnRfY291bnQgPT0gMSkKKwkJc2N0cF90cmFuc3BvcnRfaW1tZWRpYXRlX3J0eCh0KTsKIH0KIAogCmRpZmYgLS1naXQgYS9uZXQvc2N0cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jCmluZGV4IDEzYmY1ZmMuLjQwOGViZDAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3NvY2tldC5jCisrKyBiL25ldC9zY3RwL3NvY2tldC5jCkBAIC04MDQsNyArODA0LDcgQEAKIAkJCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42OwogCiAJCQkJc2luNiA9IChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopYWRkcnM7Ci0JCQkJaXB2Nl9hZGRyX2NvcHkoJmFzb2MtPmFzY29uZl9hZGRyX2RlbF9wZW5kaW5nLT52Ni5zaW42X2FkZHIsICZzaW42LT5zaW42X2FkZHIpOworCQkJCWFzb2MtPmFzY29uZl9hZGRyX2RlbF9wZW5kaW5nLT52Ni5zaW42X2FkZHIgPSBzaW42LT5zaW42X2FkZHI7CiAJCQl9CiAJCQlTQ1RQX0RFQlVHX1BSSU5US19JUEFERFIoInNlbmRfYXNjb25mX2RlbF9pcDoga2VlcCB0aGUgbGFzdCBhZGRyZXNzIGFzb2M6ICVwICIsCiAJCQkgICAgIiBhdCAlcFxuIiwgYXNvYywgYXNvYy0+YXNjb25mX2FkZHJfZGVsX3BlbmRpbmcsCkBAIC0yMjAwLDggKzIyMDAsNiBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAlpZiAoY29weV9mcm9tX3VzZXIoJnNwLT5hdXRvY2xvc2UsIG9wdHZhbCwgb3B0bGVuKSkKIAkJcmV0dXJuIC1FRkFVTFQ7Ci0JLyogbWFrZSBzdXJlIGl0IHdvbid0IGV4Y2VlZCBNQVhfU0NIRURVTEVfVElNRU9VVCAqLwotCXNwLT5hdXRvY2xvc2UgPSBtaW5fdChsb25nLCBzcC0+YXV0b2Nsb3NlLCBNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaKTsKIAogCXJldHVybiAwOwogfQpAQCAtNjg0MSw3ICs2ODM5LDcgQEAKIAkuc29ja2V0c19hbGxvY2F0ZWQgPSAmc2N0cF9zb2NrZXRzX2FsbG9jYXRlZCwKIH07CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCiBzdHJ1Y3QgcHJvdG8gc2N0cHY2X3Byb3QgPSB7CiAJLm5hbWUJCT0gIlNDVFB2NiIsCkBAIC02ODcyLDQgKzY4NzAsNCBAQAogCS5tZW1vcnlfYWxsb2NhdGVkID0gJnNjdHBfbWVtb3J5X2FsbG9jYXRlZCwKIAkuc29ja2V0c19hbGxvY2F0ZWQgPSAmc2N0cF9zb2NrZXRzX2FsbG9jYXRlZCwKIH07Ci0jZW5kaWYgLyogZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpICovCisjZW5kaWYgLyogSVNfRU5BQkxFRChDT05GSUdfSVBWNikgKi8KZGlmZiAtLWdpdCBhL25ldC9zY3RwL3N5c2N0bC5jIGIvbmV0L3NjdHAvc3lzY3RsLmMKaW5kZXggNmIzOTUyOS4uNjBmZmJkMCAxMDA2NDQKLS0tIGEvbmV0L3NjdHAvc3lzY3RsLmMKKysrIGIvbmV0L3NjdHAvc3lzY3RsLmMKQEAgLTUzLDYgKzUzLDEwIEBACiBzdGF0aWMgaW50IHNhY2tfdGltZXJfbWF4ID0gNTAwOwogc3RhdGljIGludCBhZGRyX3Njb3BlX21heCA9IDM7IC8qIGNoZWNrIHNjdHBfc2NvcGVfcG9saWN5X3QgaW4gaW5jbHVkZS9uZXQvc2N0cC9jb25zdGFudHMuaCBmb3IgbWF4IGVudHJpZXMgKi8KIHN0YXRpYyBpbnQgcnduZF9zY2FsZV9tYXggPSAxNjsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1heF9hdXRvY2xvc2VfbWluID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1heF9hdXRvY2xvc2VfbWF4ID0KKwkoTUFYX1NDSEVEVUxFX1RJTUVPVVQgLyBIWiA+IFVJTlRfTUFYKQorCT8gVUlOVF9NQVggOiBNQVhfU0NIRURVTEVfVElNRU9VVCAvIEhaOwogCiBleHRlcm4gbG9uZyBzeXNjdGxfc2N0cF9tZW1bM107CiBleHRlcm4gaW50IHN5c2N0bF9zY3RwX3JtZW1bM107CkBAIC0yNTgsNiArMjYyLDE1IEBACiAJCS5leHRyYTEJCT0gJm9uZSwKIAkJLmV4dHJhMgkJPSAmcnduZF9zY2FsZV9tYXgsCiAJfSwKKwl7CisJCS5wcm9jbmFtZQk9ICJtYXhfYXV0b2Nsb3NlIiwKKwkJLmRhdGEJCT0gJnNjdHBfbWF4X2F1dG9jbG9zZSwKKwkJLm1heGxlbgkJPSBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb3Vsb25ndmVjX21pbm1heCwKKwkJLmV4dHJhMQkJPSAmbWF4X2F1dG9jbG9zZV9taW4sCisJCS5leHRyYTIJCT0gJm1heF9hdXRvY2xvc2VfbWF4LAorCX0sCiAKIAl7IC8qIHNlbnRpbmVsICovIH0KIH07CmRpZmYgLS1naXQgYS9uZXQvc2N0cC90cmFuc3BvcnQuYyBiL25ldC9zY3RwL3RyYW5zcG9ydC5jCmluZGV4IDM5NGM1N2MuLjM4ODkzMzAgMTAwNjQ0Ci0tLSBhL25ldC9zY3RwL3RyYW5zcG9ydC5jCisrKyBiL25ldC9zY3RwL3RyYW5zcG9ydC5jCkBAIC02NDEsMyArNjQxLDE5IEBACiAJdC0+Y2FjYy5uZXh0X3Rzbl9hdF9jaGFuZ2UgPSAwOwogCXQtPmNhY2MuY2FjY19zYXdfbmV3YWNrID0gMDsKIH0KKworLyogU2NoZWR1bGUgcmV0cmFuc21pc3Npb24gb24gdGhlIGdpdmVuIHRyYW5zcG9ydCAqLwordm9pZCBzY3RwX3RyYW5zcG9ydF9pbW1lZGlhdGVfcnR4KHN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdCkKK3sKKwkvKiBTdG9wIHBlbmRpbmcgVDNfcnR4X3RpbWVyICovCisJaWYgKHRpbWVyX3BlbmRpbmcoJnQtPlQzX3J0eF90aW1lcikpIHsKKwkJKHZvaWQpZGVsX3RpbWVyKCZ0LT5UM19ydHhfdGltZXIpOworCQlzY3RwX3RyYW5zcG9ydF9wdXQodCk7CisJfQorCXNjdHBfcmV0cmFuc21pdCgmdC0+YXNvYy0+b3V0cXVldWUsIHQsIFNDVFBfUlRYUl9UM19SVFgpOworCWlmICghdGltZXJfcGVuZGluZygmdC0+VDNfcnR4X3RpbWVyKSkgeworCQlpZiAoIW1vZF90aW1lcigmdC0+VDNfcnR4X3RpbWVyLCBqaWZmaWVzICsgdC0+cnRvKSkKKwkJCXNjdHBfdHJhbnNwb3J0X2hvbGQodCk7CisJfQorCXJldHVybjsKK30KZGlmZiAtLWdpdCBhL25ldC9zb2NrZXQuYyBiL25ldC9zb2NrZXQuYwppbmRleCAyODc3NjQ3Li5lNTYxNjJjIDEwMDY0NAotLS0gYS9uZXQvc29ja2V0LmMKKysrIGIvbmV0L3NvY2tldC5jCkBAIC01MzgsNiArNTM4LDggQEAKIAkJKnR4X2ZsYWdzIHw9IFNLQlRYX0hXX1RTVEFNUDsKIAlpZiAoc29ja19mbGFnKHNrLCBTT0NLX1RJTUVTVEFNUElOR19UWF9TT0ZUV0FSRSkpCiAJCSp0eF9mbGFncyB8PSBTS0JUWF9TV19UU1RBTVA7CisJaWYgKHNvY2tfZmxhZyhzaywgU09DS19XSUZJX1NUQVRVUykpCisJCSp0eF9mbGFncyB8PSBTS0JUWF9XSUZJX1NUQVRVUzsKIAlyZXR1cm4gMDsKIH0KIEVYUE9SVF9TWU1CT0woc29ja190eF90aW1lc3RhbXApOwpAQCAtNTQ5LDYgKzU1MSw4IEBACiAKIAlzb2NrX3VwZGF0ZV9jbGFzc2lkKHNvY2stPnNrKTsKIAorCXNvY2tfdXBkYXRlX25ldHByaW9pZHgoc29jay0+c2spOworCiAJc2ktPnNvY2sgPSBzb2NrOwogCXNpLT5zY20gPSBOVUxMOwogCXNpLT5tc2cgPSBtc2c7CkBAIC02NzQsNiArNjc4LDIyIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX3NvY2tfcmVjdl90aW1lc3RhbXApOwogCit2b2lkIF9fc29ja19yZWN2X3dpZmlfc3RhdHVzKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKnNrLAorCXN0cnVjdCBza19idWZmICpza2IpCit7CisJaW50IGFjazsKKworCWlmICghc29ja19mbGFnKHNrLCBTT0NLX1dJRklfU1RBVFVTKSkKKwkJcmV0dXJuOworCWlmICghc2tiLT53aWZpX2Fja2VkX3ZhbGlkKQorCQlyZXR1cm47CisKKwlhY2sgPSBza2ItPndpZmlfYWNrZWQ7CisKKwlwdXRfY21zZyhtc2csIFNPTF9TT0NLRVQsIFNDTV9XSUZJX1NUQVRVUywgc2l6ZW9mKGFjayksICZhY2spOworfQorRVhQT1JUX1NZTUJPTF9HUEwoX19zb2NrX3JlY3Zfd2lmaV9zdGF0dXMpOworCiBzdGF0aWMgaW5saW5lIHZvaWQgc29ja19yZWN2X2Ryb3BzKHN0cnVjdCBtc2doZHIgKm1zZywgc3RydWN0IHNvY2sgKnNrLAogCQkJCSAgIHN0cnVjdCBza19idWZmICpza2IpCiB7CkBAIC0yNzM4LDEwICsyNzU4LDEwIEBACiAJY2FzZSBFVEhUT09MX0dSWFJJTkdTOgogCWNhc2UgRVRIVE9PTF9HUlhDTFNSTENOVDoKIAljYXNlIEVUSFRPT0xfR1JYQ0xTUlVMRToKKwljYXNlIEVUSFRPT0xfU1JYQ0xTUkxJTlM6CiAJCWNvbnZlcnRfb3V0ID0gdHJ1ZTsKIAkJLyogZmFsbCB0aHJvdWdoICovCiAJY2FzZSBFVEhUT09MX1NSWENMU1JMREVMOgotCWNhc2UgRVRIVE9PTF9TUlhDTFNSTElOUzoKIAkJYnVmX3NpemUgKz0gc2l6ZW9mKHN0cnVjdCBldGh0b29sX3J4bmZjKTsKIAkJY29udmVydF9pbiA9IHRydWU7CiAJCWJyZWFrOwpAQCAtMjg4Myw3ICsyOTAzLDcgQEAKIAogCQlyZXR1cm4gZGV2X2lvY3RsKG5ldCwgY21kLCB1aWZyKTsKIAlkZWZhdWx0OgotCQlyZXR1cm4gLUVJTlZBTDsKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKIAl9CiB9CiAKQEAgLTMyMTAsMjAgKzMyMzAsNiBAQAogCQlyZXR1cm4gc29ja19kb19pb2N0bChuZXQsIHNvY2ssIGNtZCwgYXJnKTsKIAl9CiAKLQkvKiBQcmV2ZW50IHdhcm5pbmcgZnJvbSBjb21wYXRfc3lzX2lvY3RsLCB0aGVzZSBhbHdheXMKLQkgKiByZXN1bHQgaW4gLUVJTlZBTCBpbiB0aGUgbmF0aXZlIGNhc2UgYW55d2F5LiAqLwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBTSU9DUlRNU0c6Ci0JY2FzZSBTSU9DR0lGQ09VTlQ6Ci0JY2FzZSBTSU9DU1JBUlA6Ci0JY2FzZSBTSU9DR1JBUlA6Ci0JY2FzZSBTSU9DRFJBUlA6Ci0JY2FzZSBTSU9DU0lGTElOSzoKLQljYXNlIFNJT0NHSUZTTEFWRToKLQljYXNlIFNJT0NTSUZTTEFWRToKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJcmV0dXJuIC1FTk9JT0NUTENNRDsKIH0KIApkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9hZGRyLmMgYi9uZXQvc3VucnBjL2FkZHIuYwppbmRleCA2N2E2NTVlLi5lZTc3NzQyIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL2FkZHIuYworKysgYi9uZXQvc3VucnBjL2FkZHIuYwpAQCAtMjEsNyArMjEsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KIAotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAKIHN0YXRpYyBzaXplX3QgcnBjX250b3A2X25vc2NvcGVpZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKIAkJCQkgIGNoYXIgKmJ1ZiwgY29uc3QgaW50IGJ1ZmxlbikKQEAgLTkxLDcgKzkxLDcgQEAKIAlyZXR1cm4gbGVuOwogfQogCi0jZWxzZQkvKiAhKGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKSkgKi8KKyNlbHNlCS8qICFJU19FTkFCTEVEKENPTkZJR19JUFY2KSAqLwogCiBzdGF0aWMgc2l6ZV90IHJwY19udG9wNl9ub3Njb3BlaWQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYXAsCiAJCQkJICBjaGFyICpidWYsIGNvbnN0IGludCBidWZsZW4pCkBAIC0xMDUsNyArMTA1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2VuZGlmCS8qICEoZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpKSAqLworI2VuZGlmCS8qICFJU19FTkFCTEVEKENPTkZJR19JUFY2KSAqLwogCiBzdGF0aWMgaW50IHJwY19udG9wNChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwKIAkJICAgICBjaGFyICpidWYsIGNvbnN0IHNpemVfdCBidWZsZW4pCkBAIC0xNTUsNyArMTU1LDcgQEAKIAlyZXR1cm4gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogc3RhdGljIGludCBycGNfcGFyc2Vfc2NvcGVfaWQoY29uc3QgY2hhciAqYnVmLCBjb25zdCBzaXplX3QgYnVmbGVuLAogCQkJICAgICAgY29uc3QgY2hhciAqZGVsaW0sIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYpCiB7CmRpZmYgLS1naXQgYS9uZXQvc3VucnBjL3NjaGVkLmMgYi9uZXQvc3VucnBjL3NjaGVkLmMKaW5kZXggZDEyZmZhNS4uMDBhMWEyYSAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zY2hlZC5jCisrKyBiL25ldC9zdW5ycGMvc2NoZWQuYwpAQCAtNTkwLDYgKzU5MCwyNyBAQAogCXRhc2stPnRrX29wcy0+cnBjX2NhbGxfcHJlcGFyZSh0YXNrLCB0YXNrLT50a19jYWxsZGF0YSk7CiB9CiAKK3N0YXRpYyB2b2lkCitycGNfaW5pdF90YXNrX3N0YXRpc3RpY3Moc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCS8qIEluaXRpYWxpemUgcmV0cnkgY291bnRlcnMgKi8KKwl0YXNrLT50a19nYXJiX3JldHJ5ID0gMjsKKwl0YXNrLT50a19jcmVkX3JldHJ5ID0gMjsKKwl0YXNrLT50a19yZWJpbmRfcmV0cnkgPSAyOworCisJLyogc3RhcnRpbmcgdGltZXN0YW1wICovCisJdGFzay0+dGtfc3RhcnQgPSBrdGltZV9nZXQoKTsKK30KKworc3RhdGljIHZvaWQKK3JwY19yZXNldF90YXNrX3N0YXRpc3RpY3Moc3RydWN0IHJwY190YXNrICp0YXNrKQoreworCXRhc2stPnRrX3RpbWVvdXRzID0gMDsKKwl0YXNrLT50a19mbGFncyAmPSB+KFJQQ19DQUxMX01BSk9SU0VFTnxSUENfVEFTS19LSUxMRUR8UlBDX1RBU0tfU0VOVCk7CisKKwlycGNfaW5pdF90YXNrX3N0YXRpc3RpY3ModGFzayk7Cit9CisKIC8qCiAgKiBIZWxwZXIgdGhhdCBjYWxscyB0YXNrLT50a19vcHMtPnJwY19jYWxsX2RvbmUgaWYgaXQgZXhpc3RzCiAgKi8KQEAgLTYwMiw2ICs2MjMsNyBAQAogCQkJV0FSTl9PTihSUENfQVNTQVNTSU5BVEVEKHRhc2spKTsKIAkJCS8qIEFsd2F5cyByZWxlYXNlIHRoZSBSUEMgc2xvdCBhbmQgYnVmZmVyIG1lbW9yeSAqLwogCQkJeHBydF9yZWxlYXNlKHRhc2spOworCQkJcnBjX3Jlc2V0X3Rhc2tfc3RhdGlzdGljcyh0YXNrKTsKIAkJfQogCX0KIH0KQEAgLTgwNCwxMSArODI2LDYgQEAKIAl0YXNrLT50a19jYWxsZGF0YSA9IHRhc2tfc2V0dXBfZGF0YS0+Y2FsbGJhY2tfZGF0YTsKIAlJTklUX0xJU1RfSEVBRCgmdGFzay0+dGtfdGFzayk7CiAKLQkvKiBJbml0aWFsaXplIHJldHJ5IGNvdW50ZXJzICovCi0JdGFzay0+dGtfZ2FyYl9yZXRyeSA9IDI7Ci0JdGFzay0+dGtfY3JlZF9yZXRyeSA9IDI7Ci0JdGFzay0+dGtfcmViaW5kX3JldHJ5ID0gMjsKLQogCXRhc2stPnRrX3ByaW9yaXR5ID0gdGFza19zZXR1cF9kYXRhLT5wcmlvcml0eSAtIFJQQ19QUklPUklUWV9MT1c7CiAJdGFzay0+dGtfb3duZXIgPSBjdXJyZW50LT50Z2lkOwogCkBAIC04MTgsOCArODM1LDcgQEAKIAlpZiAodGFzay0+dGtfb3BzLT5ycGNfY2FsbF9wcmVwYXJlICE9IE5VTEwpCiAJCXRhc2stPnRrX2FjdGlvbiA9IHJwY19wcmVwYXJlX3Rhc2s7CiAKLQkvKiBzdGFydGluZyB0aW1lc3RhbXAgKi8KLQl0YXNrLT50a19zdGFydCA9IGt0aW1lX2dldCgpOworCXJwY19pbml0X3Rhc2tfc3RhdGlzdGljcyh0YXNrKTsKIAogCWRwcmludGsoIlJQQzogICAgICAgbmV3IHRhc2sgaW5pdGlhbGl6ZWQsIHByb2NwaWQgJXVcbiIsCiAJCQkJdGFza19waWRfbnIoY3VycmVudCkpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmMuYyBiL25ldC9zdW5ycGMvc3ZjLmMKaW5kZXggNmUwMzg4OC4uOWQwMWQ0NiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy9zdmMuYworKysgYi9uZXQvc3VucnBjL3N2Yy5jCkBAIC04MjYsNyArODI2LDcgQEAKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogLyoKICAqIFJlZ2lzdGVyIGFuICJpbmV0NiIgcHJvdG9jb2wgZmFtaWx5IG5ldGlkIHdpdGggdGhlIGxvY2FsCiAgKiBycGNiaW5kIGRhZW1vbiB2aWEgYW4gcnBjYmluZCB2NCBTRVQgcmVxdWVzdC4KQEAgLTg3Miw3ICs4NzIsNyBAQAogCiAJcmV0dXJuIGVycm9yOwogfQotI2VuZGlmCS8qIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKSAqLworI2VuZGlmCS8qIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpICovCiAKIC8qCiAgKiBSZWdpc3RlciBhIGtlcm5lbCBSUEMgc2VydmljZSB2aWEgcnBjYmluZCB2ZXJzaW9uIDQuCkBAIC04OTMsMTEgKzg5MywxMSBAQAogCQllcnJvciA9IF9fc3ZjX3JwY2JfcmVnaXN0ZXI0KHByb2dyYW0sIHZlcnNpb24sCiAJCQkJCQlwcm90b2NvbCwgcG9ydCk7CiAJCWJyZWFrOwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJY2FzZSBQRl9JTkVUNjoKIAkJZXJyb3IgPSBfX3N2Y19ycGNiX3JlZ2lzdGVyNihwcm9ncmFtLCB2ZXJzaW9uLAogCQkJCQkJcHJvdG9jb2wsIHBvcnQpOwotI2VuZGlmCS8qIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKSAqLworI2VuZGlmCiAJfQogCiAJaWYgKGVycm9yIDwgMCkKZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjX3hwcnQuYyBiL25ldC9zdW5ycGMvc3ZjX3hwcnQuYwppbmRleCA0NDdjZDBlLi4zODY0OWNmIDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y194cHJ0LmMKKysrIGIvbmV0L3N1bnJwYy9zdmNfeHBydC5jCkBAIC0xNzksMTMgKzE3OSwxMyBAQAogCQkuc2luX2FkZHIuc19hZGRyCT0gaHRvbmwoSU5BRERSX0FOWSksCiAJCS5zaW5fcG9ydAkJPSBodG9ucyhwb3J0KSwKIAl9OwotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJc3RydWN0IHNvY2thZGRyX2luNiBzaW42ID0gewogCQkuc2luNl9mYW1pbHkJCT0gQUZfSU5FVDYsCiAJCS5zaW42X2FkZHIJCT0gSU42QUREUl9BTllfSU5JVCwKIAkJLnNpbjZfcG9ydAkJPSBodG9ucyhwb3J0KSwKIAl9OwotI2VuZGlmCS8qIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKSAqLworI2VuZGlmCiAJc3RydWN0IHNvY2thZGRyICpzYXA7CiAJc2l6ZV90IGxlbjsKIApAQCAtMTk0LDEyICsxOTQsMTIgQEAKIAkJc2FwID0gKHN0cnVjdCBzb2NrYWRkciAqKSZzaW47CiAJCWxlbiA9IHNpemVvZihzaW4pOwogCQlicmVhazsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgUEZfSU5FVDY6CiAJCXNhcCA9IChzdHJ1Y3Qgc29ja2FkZHIgKikmc2luNjsKIAkJbGVuID0gc2l6ZW9mKHNpbjYpOwogCQlicmVhazsKLSNlbmRpZgkvKiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkgKi8KKyNlbmRpZgogCWRlZmF1bHQ6CiAJCXJldHVybiBFUlJfUFRSKC1FQUZOT1NVUFBPUlQpOwogCX0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMgYi9uZXQvc3VucnBjL3N2Y2F1dGhfdW5peC5jCmluZGV4IGNlMTM2MzIuLjAxMTUzZWEgMTAwNjQ0Ci0tLSBhL25ldC9zdW5ycGMvc3ZjYXV0aF91bml4LmMKKysrIGIvbmV0L3N1bnJwYy9zdmNhdXRoX3VuaXguYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAJc3RydWN0IGlwX21hcCAqaXRlbSA9IGNvbnRhaW5lcl9vZihjaXRlbSwgc3RydWN0IGlwX21hcCwgaCk7CiAKIAlzdHJjcHkobmV3LT5tX2NsYXNzLCBpdGVtLT5tX2NsYXNzKTsKLQlpcHY2X2FkZHJfY29weSgmbmV3LT5tX2FkZHIsICZpdGVtLT5tX2FkZHIpOworCW5ldy0+bV9hZGRyID0gaXRlbS0+bV9hZGRyOwogfQogc3RhdGljIHZvaWQgdXBkYXRlKHN0cnVjdCBjYWNoZV9oZWFkICpjbmV3LCBzdHJ1Y3QgY2FjaGVfaGVhZCAqY2l0ZW0pCiB7CkBAIC0yMjAsNyArMjIwLDcgQEAKIAkJaXB2Nl9hZGRyX3NldF92NG1hcHBlZChhZGRyZXNzLnM0LnNpbl9hZGRyLnNfYWRkciwKIAkJCQkmc2luNi5zaW42X2FkZHIpOwogCQlicmVhazsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCWNhc2UgQUZfSU5FVDY6CiAJCW1lbWNweSgmc2luNiwgJmFkZHJlc3MuczYsIHNpemVvZihzaW42KSk7CiAJCWJyZWFrOwpAQCAtMjc0LDcgKzI3NCw3IEBACiAJfQogCWltID0gY29udGFpbmVyX29mKGgsIHN0cnVjdCBpcF9tYXAsIGgpOwogCS8qIGNsYXNzIGFkZHIgZG9tYWluICovCi0JaXB2Nl9hZGRyX2NvcHkoJmFkZHIsICZpbS0+bV9hZGRyKTsKKwlhZGRyID0gaW0tPm1fYWRkcjsKIAogCWlmICh0ZXN0X2JpdChDQUNIRV9WQUxJRCwgJmgtPmZsYWdzKSAmJgogCSAgICAhdGVzdF9iaXQoQ0FDSEVfTkVHQVRJVkUsICZoLT5mbGFncykpCkBAIC0yOTcsNyArMjk3LDcgQEAKIAlzdHJ1Y3QgY2FjaGVfaGVhZCAqY2g7CiAKIAlzdHJjcHkoaXAubV9jbGFzcywgY2xhc3MpOwotCWlwdjZfYWRkcl9jb3B5KCZpcC5tX2FkZHIsIGFkZHIpOworCWlwLm1fYWRkciA9ICphZGRyOwogCWNoID0gc3VucnBjX2NhY2hlX2xvb2t1cChjZCwgJmlwLmgsCiAJCQkJIGhhc2hfc3RyKGNsYXNzLCBJUF9IQVNIQklUUykgXgogCQkJCSBoYXNoX2lwNigqYWRkcikpOwpkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy9zdmNzb2NrLmMgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwppbmRleCA3MWJlZDFjLi40NjUzMjg2IDEwMDY0NAotLS0gYS9uZXQvc3VucnBjL3N2Y3NvY2suYworKysgYi9uZXQvc3VucnBjL3N2Y3NvY2suYwpAQCAtMTU3LDcgKzE1Nyw3IEBACiAJCQljbWgtPmNtc2dfbGV2ZWwgPSBTT0xfSVBWNjsKIAkJCWNtaC0+Y21zZ190eXBlID0gSVBWNl9QS1RJTkZPOwogCQkJcGtpLT5pcGk2X2lmaW5kZXggPSBkYWRkci0+c2luNl9zY29wZV9pZDsKLQkJCWlwdjZfYWRkcl9jb3B5KCZwa2ktPmlwaTZfYWRkciwJJmRhZGRyLT5zaW42X2FkZHIpOworCQkJcGtpLT5pcGk2X2FkZHIgPSBkYWRkci0+c2luNl9hZGRyOwogCQkJY21oLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZigqcGtpKSk7CiAJCX0KIAkJYnJlYWs7CkBAIC01MjMsNyArNTIzLDcgQEAKIAkJcmV0dXJuIDA7CiAKIAlkYWRkci0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKLQlpcHY2X2FkZHJfY29weSgmZGFkZHItPnNpbjZfYWRkciwgJnBraS0+aXBpNl9hZGRyKTsKKwlkYWRkci0+c2luNl9hZGRyID0gcGtpLT5pcGk2X2FkZHI7CiAJZGFkZHItPnNpbjZfc2NvcGVfaWQgPSBwa2ktPmlwaTZfaWZpbmRleDsKIAlyZXR1cm4gMTsKIH0KZGlmZiAtLWdpdCBhL25ldC9zdW5ycGMveHBydC5jIGIvbmV0L3N1bnJwYy94cHJ0LmMKaW5kZXggZjQzODVlNC4uYzY0YzBlZiAxMDA2NDQKLS0tIGEvbmV0L3N1bnJwYy94cHJ0LmMKKysrIGIvbmV0L3N1bnJwYy94cHJ0LmMKQEAgLTk5NSwxMyArOTk1LDExIEBACiAKIHN0YXRpYyB2b2lkIHhwcnRfZnJlZV9zbG90KHN0cnVjdCBycGNfeHBydCAqeHBydCwgc3RydWN0IHJwY19ycXN0ICpyZXEpCiB7Ci0JaWYgKHhwcnRfZHluYW1pY19mcmVlX3Nsb3QoeHBydCwgcmVxKSkKLQkJcmV0dXJuOwotCi0JbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsJLyogbWFyayB1bnVzZWQgKi8KLQogCXNwaW5fbG9jaygmeHBydC0+cmVzZXJ2ZV9sb2NrKTsKLQlsaXN0X2FkZCgmcmVxLT5ycV9saXN0LCAmeHBydC0+ZnJlZSk7CisJaWYgKCF4cHJ0X2R5bmFtaWNfZnJlZV9zbG90KHhwcnQsIHJlcSkpIHsKKwkJbWVtc2V0KHJlcSwgMCwgc2l6ZW9mKCpyZXEpKTsJLyogbWFyayB1bnVzZWQgKi8KKwkJbGlzdF9hZGQoJnJlcS0+cnFfbGlzdCwgJnhwcnQtPmZyZWUpOworCX0KIAlycGNfd2FrZV91cF9uZXh0KCZ4cHJ0LT5iYWNrbG9nKTsKIAlzcGluX3VubG9jaygmeHBydC0+cmVzZXJ2ZV9sb2NrKTsKIH0KZGlmZiAtLWdpdCBhL25ldC90aXBjL2JjYXN0LmMgYi9uZXQvdGlwYy9iY2FzdC5jCmluZGV4IDI4OTA4ZjUuLjhlYjg3YjEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JjYXN0LmMKKysrIGIvbmV0L3RpcGMvYmNhc3QuYwpAQCAtNDYsNyArNDYsNyBAQAogI2RlZmluZSBCQ0xJTktfV0lOX0RFRkFVTFQgMjAJCS8qIGJjYXN0IGxpbmsgd2luZG93IHNpemUgKGRlZmF1bHQpICovCiAKIC8qKgotICogc3RydWN0IGJjYmVhcmVyX3BhaXIgLSBhIHBhaXIgb2YgYmVhcmVycyB1c2VkIGJ5IGJyb2FkY2FzdCBsaW5rCisgKiBzdHJ1Y3QgdGlwY19iY2JlYXJlcl9wYWlyIC0gYSBwYWlyIG9mIGJlYXJlcnMgdXNlZCBieSBicm9hZGNhc3QgbGluawogICogQHByaW1hcnk6IHBvaW50ZXIgdG8gcHJpbWFyeSBiZWFyZXIKICAqIEBzZWNvbmRhcnk6IHBvaW50ZXIgdG8gc2Vjb25kYXJ5IGJlYXJlcgogICoKQEAgLTU0LDEzICs1NCwxMyBAQAogICogdG8gYmUgcGFpcmVkLgogICovCiAKLXN0cnVjdCBiY2JlYXJlcl9wYWlyIHsKK3N0cnVjdCB0aXBjX2JjYmVhcmVyX3BhaXIgewogCXN0cnVjdCB0aXBjX2JlYXJlciAqcHJpbWFyeTsKIAlzdHJ1Y3QgdGlwY19iZWFyZXIgKnNlY29uZGFyeTsKIH07CiAKIC8qKgotICogc3RydWN0IGJjYmVhcmVyIC0gYmVhcmVyIHVzZWQgYnkgYnJvYWRjYXN0IGxpbmsKKyAqIHN0cnVjdCB0aXBjX2JjYmVhcmVyIC0gYmVhcmVyIHVzZWQgYnkgYnJvYWRjYXN0IGxpbmsKICAqIEBiZWFyZXI6IChub24tc3RhbmRhcmQpIGJyb2FkY2FzdCBiZWFyZXIgc3RydWN0dXJlCiAgKiBAbWVkaWE6IChub24tc3RhbmRhcmQpIGJyb2FkY2FzdCBtZWRpYSBzdHJ1Y3R1cmUKICAqIEBicGFpcnM6IGFycmF5IG9mIGJlYXJlciBwYWlycwpAQCAtNzQsNTAgKzc0LDQ3IEBACiAgKiBwcmV2ZW50ZWQgdGhyb3VnaCB1c2Ugb2YgdGhlIHNwaW5sb2NrICJiY19sb2NrIi4KICAqLwogCi1zdHJ1Y3QgYmNiZWFyZXIgeworc3RydWN0IHRpcGNfYmNiZWFyZXIgewogCXN0cnVjdCB0aXBjX2JlYXJlciBiZWFyZXI7Ci0Jc3RydWN0IG1lZGlhIG1lZGlhOwotCXN0cnVjdCBiY2JlYXJlcl9wYWlyIGJwYWlyc1tNQVhfQkVBUkVSU107Ci0Jc3RydWN0IGJjYmVhcmVyX3BhaXIgYnBhaXJzX3RlbXBbVElQQ19NQVhfTElOS19QUkkgKyAxXTsKKwlzdHJ1Y3QgdGlwY19tZWRpYSBtZWRpYTsKKwlzdHJ1Y3QgdGlwY19iY2JlYXJlcl9wYWlyIGJwYWlyc1tNQVhfQkVBUkVSU107CisJc3RydWN0IHRpcGNfYmNiZWFyZXJfcGFpciBicGFpcnNfdGVtcFtUSVBDX01BWF9MSU5LX1BSSSArIDFdOwogCXN0cnVjdCB0aXBjX25vZGVfbWFwIHJlbWFpbnM7CiAJc3RydWN0IHRpcGNfbm9kZV9tYXAgcmVtYWluc19uZXc7CiB9OwogCiAvKioKLSAqIHN0cnVjdCBiY2xpbmsgLSBsaW5rIHVzZWQgZm9yIGJyb2FkY2FzdCBtZXNzYWdlcworICogc3RydWN0IHRpcGNfYmNsaW5rIC0gbGluayB1c2VkIGZvciBicm9hZGNhc3QgbWVzc2FnZXMKICAqIEBsaW5rOiAobm9uLXN0YW5kYXJkKSBicm9hZGNhc3QgbGluayBzdHJ1Y3R1cmUKICAqIEBub2RlOiAobm9uLXN0YW5kYXJkKSBub2RlIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgYidjYXN0IGxpbmsncyBwZWVyIG5vZGUKKyAqIEBiY2FzdF9ub2RlczogbWFwIG9mIGJyb2FkY2FzdC1jYXBhYmxlIG5vZGVzCiAgKiBAcmV0cmFuc21pdF90bzogbm9kZSB0aGF0IG1vc3QgcmVjZW50bHkgcmVxdWVzdGVkIGEgcmV0cmFuc21pdAogICoKICAqIEhhbmRsZXMgc2VxdWVuY2UgbnVtYmVyaW5nLCBmcmFnbWVudGF0aW9uLCBidW5kbGluZywgZXRjLgogICovCiAKLXN0cnVjdCBiY2xpbmsgewotCXN0cnVjdCBsaW5rIGxpbms7CitzdHJ1Y3QgdGlwY19iY2xpbmsgeworCXN0cnVjdCB0aXBjX2xpbmsgbGluazsKIAlzdHJ1Y3QgdGlwY19ub2RlIG5vZGU7CisJc3RydWN0IHRpcGNfbm9kZV9tYXAgYmNhc3Rfbm9kZXM7CiAJc3RydWN0IHRpcGNfbm9kZSAqcmV0cmFuc21pdF90bzsKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdGlwY19iY2JlYXJlciBiY2FzdF9iZWFyZXI7CitzdGF0aWMgc3RydWN0IHRpcGNfYmNsaW5rIGJjYXN0X2xpbms7CiAKLXN0YXRpYyBzdHJ1Y3QgYmNiZWFyZXIgKmJjYmVhcmVyOwotc3RhdGljIHN0cnVjdCBiY2xpbmsgKmJjbGluazsKLXN0YXRpYyBzdHJ1Y3QgbGluayAqYmNsOworc3RhdGljIHN0cnVjdCB0aXBjX2JjYmVhcmVyICpiY2JlYXJlciA9ICZiY2FzdF9iZWFyZXI7CitzdGF0aWMgc3RydWN0IHRpcGNfYmNsaW5rICpiY2xpbmsgPSAmYmNhc3RfbGluazsKK3N0YXRpYyBzdHJ1Y3QgdGlwY19saW5rICpiY2wgPSAmYmNhc3RfbGluay5saW5rOworCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJjX2xvY2spOwogCi0vKiBicm9hZGNhc3QtY2FwYWJsZSBub2RlIG1hcCAqLwotc3RydWN0IHRpcGNfbm9kZV9tYXAgdGlwY19iY2FzdF9ubWFwOwotCiBjb25zdCBjaGFyIHRpcGNfYmNsaW5rX25hbWVbXSA9ICJicm9hZGNhc3QtbGluayI7CiAKIHN0YXRpYyB2b2lkIHRpcGNfbm1hcF9kaWZmKHN0cnVjdCB0aXBjX25vZGVfbWFwICpubV9hLAogCQkJICAgc3RydWN0IHRpcGNfbm9kZV9tYXAgKm5tX2IsCiAJCQkgICBzdHJ1Y3QgdGlwY19ub2RlX21hcCAqbm1fZGlmZik7CiAKLXN0YXRpYyB1MzIgYnVmX3NlcW5vKHN0cnVjdCBza19idWZmICpidWYpCi17Ci0JcmV0dXJuIG1zZ19zZXFubyhidWZfbXNnKGJ1ZikpOwotfQotCiBzdGF0aWMgdTMyIGJjYnVmX2Fja3Moc3RydWN0IHNrX2J1ZmYgKmJ1ZikKIHsKIAlyZXR1cm4gKHUzMikodW5zaWduZWQgbG9uZylUSVBDX1NLQl9DQihidWYpLT5oYW5kbGU7CkBAIC0xMzMsNiArMTMwLDE5IEBACiAJYmNidWZfc2V0X2Fja3MoYnVmLCBiY2J1Zl9hY2tzKGJ1ZikgLSAxKTsKIH0KIAordm9pZCB0aXBjX2JjbGlua19hZGRfbm9kZSh1MzIgYWRkcikKK3sKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCXRpcGNfbm1hcF9hZGQoJmJjbGluay0+YmNhc3Rfbm9kZXMsIGFkZHIpOworCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKK30KKwordm9pZCB0aXBjX2JjbGlua19yZW1vdmVfbm9kZSh1MzIgYWRkcikKK3sKKwlzcGluX2xvY2tfYmgoJmJjX2xvY2spOworCXRpcGNfbm1hcF9yZW1vdmUoJmJjbGluay0+YmNhc3Rfbm9kZXMsIGFkZHIpOworCXNwaW5fdW5sb2NrX2JoKCZiY19sb2NrKTsKK30KIAogc3RhdGljIHZvaWQgYmNsaW5rX3NldF9sYXN0X3NlbnQodm9pZCkKIHsKQEAgLTIyMiwxNCArMjMyLDM2IEBACiAJc3RydWN0IHNrX2J1ZmYgKm5leHQ7CiAJdW5zaWduZWQgaW50IHJlbGVhc2VkID0gMDsKIAotCWlmIChsZXNzX2VxKGFja2VkLCBuX3B0ci0+YmNsaW5rLmFja2VkKSkKLQkJcmV0dXJuOwotCiAJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKIAotCS8qIFNraXAgb3ZlciBwYWNrZXRzIHRoYXQgbm9kZSBoYXMgcHJldmlvdXNseSBhY2tub3dsZWRnZWQgKi8KLQorCS8qIEJhaWwgb3V0IGlmIHR4IHF1ZXVlIGlzIGVtcHR5IChubyBjbGVhbiB1cCBpcyByZXF1aXJlZCkgKi8KIAljcnMgPSBiY2wtPmZpcnN0X291dDsKKwlpZiAoIWNycykKKwkJZ290byBleGl0OworCisJLyogRGV0ZXJtaW5lIHdoaWNoIG1lc3NhZ2VzIG5lZWQgdG8gYmUgYWNrbm93bGVkZ2VkICovCisJaWYgKGFja2VkID09IElOVkFMSURfTElOS19TRVEpIHsKKwkJLyoKKwkJICogQ29udGFjdCB3aXRoIHNwZWNpZmllZCBub2RlIGhhcyBiZWVuIGxvc3QsIHNvIG5lZWQgdG8KKwkJICogYWNrbm93bGVkZ2Ugc2VudCBtZXNzYWdlcyBvbmx5IChpZiBvdGhlciBub2RlcyBzdGlsbCBleGlzdCkKKwkJICogb3IgYm90aCBzZW50IGFuZCB1bnNlbnQgbWVzc2FnZXMgKG90aGVyd2lzZSkKKwkJICovCisJCWlmIChiY2xpbmstPmJjYXN0X25vZGVzLmNvdW50KQorCQkJYWNrZWQgPSBiY2wtPmZzbV9tc2dfY250OworCQllbHNlCisJCQlhY2tlZCA9IGJjbC0+bmV4dF9vdXRfbm87CisJfSBlbHNlIHsKKwkJLyoKKwkJICogQmFpbCBvdXQgaWYgc3BlY2lmaWVkIHNlcXVlbmNlIG51bWJlciBkb2VzIG5vdCBjb3JyZXNwb25kCisJCSAqIHRvIGEgbWVzc2FnZSB0aGF0IGhhcyBiZWVuIHNlbnQgYW5kIG5vdCB5ZXQgYWNrbm93bGVkZ2VkCisJCSAqLworCQlpZiAobGVzcyhhY2tlZCwgYnVmX3NlcW5vKGNycykpIHx8CisJCSAgICBsZXNzKGJjbC0+ZnNtX21zZ19jbnQsIGFja2VkKSB8fAorCQkgICAgbGVzc19lcShhY2tlZCwgbl9wdHItPmJjbGluay5hY2tlZCkpCisJCQlnb3RvIGV4aXQ7CisJfQorCisJLyogU2tpcCBvdmVyIHBhY2tldHMgdGhhdCBub2RlIGhhcyBwcmV2aW91c2x5IGFja25vd2xlZGdlZCAqLwogCXdoaWxlIChjcnMgJiYgbGVzc19lcShidWZfc2Vxbm8oY3JzKSwgbl9wdHItPmJjbGluay5hY2tlZCkpCiAJCWNycyA9IGNycy0+bmV4dDsKIApAQCAtMjM3LDcgKzI2OSwxNSBAQAogCiAJd2hpbGUgKGNycyAmJiBsZXNzX2VxKGJ1Zl9zZXFubyhjcnMpLCBhY2tlZCkpIHsKIAkJbmV4dCA9IGNycy0+bmV4dDsKLQkJYmNidWZfZGVjcl9hY2tzKGNycyk7CisKKwkJaWYgKGNycyAhPSBiY2wtPm5leHRfb3V0KQorCQkJYmNidWZfZGVjcl9hY2tzKGNycyk7CisJCWVsc2UgeworCQkJYmNidWZfc2V0X2Fja3MoY3JzLCAwKTsKKwkJCWJjbC0+bmV4dF9vdXQgPSBuZXh0OworCQkJYmNsaW5rX3NldF9sYXN0X3NlbnQoKTsKKwkJfQorCiAJCWlmIChiY2J1Zl9hY2tzKGNycykgPT0gMCkgewogCQkJYmNsLT5maXJzdF9vdXQgPSBuZXh0OwogCQkJYmNsLT5vdXRfcXVldWVfc2l6ZS0tOwpAQCAtMjU2LDYgKzI5Niw3IEBACiAJfQogCWlmICh1bmxpa2VseShyZWxlYXNlZCAmJiAhbGlzdF9lbXB0eSgmYmNsLT53YWl0aW5nX3BvcnRzKSkpCiAJCXRpcGNfbGlua193YWtldXBfcG9ydHMoYmNsLCAwKTsKK2V4aXQ6CiAJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOwogfQogCkBAIC0yNjcsNyArMzA4LDcgQEAKIAogc3RhdGljIHZvaWQgYmNsaW5rX3NlbmRfYWNrKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyKQogewotCXN0cnVjdCBsaW5rICpsX3B0ciA9IG5fcHRyLT5hY3RpdmVfbGlua3Nbbl9wdHItPmFkZHIgJiAxXTsKKwlzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciA9IG5fcHRyLT5hY3RpdmVfbGlua3Nbbl9wdHItPmFkZHIgJiAxXTsKIAogCWlmIChsX3B0ciAhPSBOVUxMKQogCQl0aXBjX2xpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsIFNUQVRFX01TRywgMCwgMCwgMCwgMCwgMCk7CkBAIC00MDIsMTMgKzQ0MywxOSBAQAogCiAJc3Bpbl9sb2NrX2JoKCZiY19sb2NrKTsKIAorCWlmICghYmNsaW5rLT5iY2FzdF9ub2Rlcy5jb3VudCkgeworCQlyZXMgPSBtc2dfZGF0YV9zeihidWZfbXNnKGJ1ZikpOworCQlidWZfZGlzY2FyZChidWYpOworCQlnb3RvIGV4aXQ7CisJfQorCiAJcmVzID0gdGlwY19saW5rX3NlbmRfYnVmKGJjbCwgYnVmKTsKLQlpZiAobGlrZWx5KHJlcyA+IDApKQorCWlmIChsaWtlbHkocmVzID49IDApKSB7CiAJCWJjbGlua19zZXRfbGFzdF9zZW50KCk7Ci0KLQliY2wtPnN0YXRzLnF1ZXVlX3N6X2NvdW50cysrOwotCWJjbC0+c3RhdHMuYWNjdV9xdWV1ZV9zeiArPSBiY2wtPm91dF9xdWV1ZV9zaXplOwotCisJCWJjbC0+c3RhdHMucXVldWVfc3pfY291bnRzKys7CisJCWJjbC0+c3RhdHMuYWNjdV9xdWV1ZV9zeiArPSBiY2wtPm91dF9xdWV1ZV9zaXplOworCX0KK2V4aXQ6CiAJc3Bpbl91bmxvY2tfYmgoJmJjX2xvY2spOwogCXJldHVybiByZXM7CiB9CkBAIC01NzIsMTMgKzYxOSwxMyBAQAogCWlmIChsaWtlbHkoIW1zZ19ub25fc2VxKGJ1Zl9tc2coYnVmKSkpKSB7CiAJCXN0cnVjdCB0aXBjX21zZyAqbXNnOwogCi0JCWJjYnVmX3NldF9hY2tzKGJ1ZiwgdGlwY19iY2FzdF9ubWFwLmNvdW50KTsKKwkJYmNidWZfc2V0X2Fja3MoYnVmLCBiY2xpbmstPmJjYXN0X25vZGVzLmNvdW50KTsKIAkJbXNnID0gYnVmX21zZyhidWYpOwogCQltc2dfc2V0X25vbl9zZXEobXNnLCAxKTsKIAkJbXNnX3NldF9tY19uZXRpZChtc2csIHRpcGNfbmV0X2lkKTsKIAkJYmNsLT5zdGF0cy5zZW50X2luZm8rKzsKIAotCQlpZiAoV0FSTl9PTighdGlwY19iY2FzdF9ubWFwLmNvdW50KSkgeworCQlpZiAoV0FSTl9PTighYmNsaW5rLT5iY2FzdF9ub2Rlcy5jb3VudCkpIHsKIAkJCWR1bXBfc3RhY2soKTsKIAkJCXJldHVybiAwOwogCQl9CkBAIC01ODYsNyArNjMzLDcgQEAKIAogCS8qIFNlbmQgYnVmZmVyIG92ZXIgYmVhcmVycyB1bnRpbCBhbGwgdGFyZ2V0cyByZWFjaGVkICovCiAKLQliY2JlYXJlci0+cmVtYWlucyA9IHRpcGNfYmNhc3Rfbm1hcDsKKwliY2JlYXJlci0+cmVtYWlucyA9IGJjbGluay0+YmNhc3Rfbm9kZXM7CiAKIAlmb3IgKGJwX2luZGV4ID0gMDsgYnBfaW5kZXggPCBNQVhfQkVBUkVSUzsgYnBfaW5kZXgrKykgewogCQlzdHJ1Y3QgdGlwY19iZWFyZXIgKnAgPSBiY2JlYXJlci0+YnBhaXJzW2JwX2luZGV4XS5wcmltYXJ5OwpAQCAtNjMwLDggKzY3Nyw4IEBACiAKIHZvaWQgdGlwY19iY2JlYXJlcl9zb3J0KHZvaWQpCiB7Ci0Jc3RydWN0IGJjYmVhcmVyX3BhaXIgKmJwX3RlbXAgPSBiY2JlYXJlci0+YnBhaXJzX3RlbXA7Ci0Jc3RydWN0IGJjYmVhcmVyX3BhaXIgKmJwX2N1cnI7CisJc3RydWN0IHRpcGNfYmNiZWFyZXJfcGFpciAqYnBfdGVtcCA9IGJjYmVhcmVyLT5icGFpcnNfdGVtcDsKKwlzdHJ1Y3QgdGlwY19iY2JlYXJlcl9wYWlyICpicF9jdXJyOwogCWludCBiX2luZGV4OwogCWludCBwcmk7CiAKQEAgLTc1MiwyNSArNzk5LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCB0aXBjX2JjbGlua19pbml0KHZvaWQpCit2b2lkIHRpcGNfYmNsaW5rX2luaXQodm9pZCkKIHsKLQliY2JlYXJlciA9IGt6YWxsb2Moc2l6ZW9mKCpiY2JlYXJlciksIEdGUF9BVE9NSUMpOwotCWJjbGluayA9IGt6YWxsb2Moc2l6ZW9mKCpiY2xpbmspLCBHRlBfQVRPTUlDKTsKLQlpZiAoIWJjYmVhcmVyIHx8ICFiY2xpbmspIHsKLQkJd2FybigiQnJvYWRjYXN0IGxpbmsgY3JlYXRpb24gZmFpbGVkLCBubyBtZW1vcnlcbiIpOwotCQlrZnJlZShiY2JlYXJlcik7Ci0JCWJjYmVhcmVyID0gTlVMTDsKLQkJa2ZyZWUoYmNsaW5rKTsKLQkJYmNsaW5rID0gTlVMTDsKLQkJcmV0dXJuIC1FTk9NRU07Ci0JfQotCiAJSU5JVF9MSVNUX0hFQUQoJmJjYmVhcmVyLT5iZWFyZXIuY29uZ19saW5rcyk7CiAJYmNiZWFyZXItPmJlYXJlci5tZWRpYSA9ICZiY2JlYXJlci0+bWVkaWE7CiAJYmNiZWFyZXItPm1lZGlhLnNlbmRfbXNnID0gdGlwY19iY2JlYXJlcl9zZW5kOwogCXNwcmludGYoYmNiZWFyZXItPm1lZGlhLm5hbWUsICJ0aXBjLWJyb2FkY2FzdCIpOwogCi0JYmNsID0gJmJjbGluay0+bGluazsKIAlJTklUX0xJU1RfSEVBRCgmYmNsLT53YWl0aW5nX3BvcnRzKTsKIAliY2wtPm5leHRfb3V0X25vID0gMTsKIAlzcGluX2xvY2tfaW5pdCgmYmNsaW5rLT5ub2RlLmxvY2spOwpAQCAtNzgwLDIyICs4MTUsMTYgQEAKIAliY2wtPmJfcHRyID0gJmJjYmVhcmVyLT5iZWFyZXI7CiAJYmNsLT5zdGF0ZSA9IFdPUktJTkdfV09SS0lORzsKIAlzdHJsY3B5KGJjbC0+bmFtZSwgdGlwY19iY2xpbmtfbmFtZSwgVElQQ19NQVhfTElOS19OQU1FKTsKLQotCXJldHVybiAwOwogfQogCiB2b2lkIHRpcGNfYmNsaW5rX3N0b3Aodm9pZCkKIHsKIAlzcGluX2xvY2tfYmgoJmJjX2xvY2spOwotCWlmIChiY2JlYXJlcikgewotCQl0aXBjX2xpbmtfc3RvcChiY2wpOwotCQliY2wgPSBOVUxMOwotCQlrZnJlZShiY2xpbmspOwotCQliY2xpbmsgPSBOVUxMOwotCQlrZnJlZShiY2JlYXJlcik7Ci0JCWJjYmVhcmVyID0gTlVMTDsKLQl9CisJdGlwY19saW5rX3N0b3AoYmNsKTsKIAlzcGluX3VubG9ja19iaCgmYmNfbG9jayk7CisKKwltZW1zZXQoYmNsaW5rLCAwLCBzaXplb2YoKmJjbGluaykpOworCW1lbXNldChiY2JlYXJlciwgMCwgc2l6ZW9mKCpiY2JlYXJlcikpOwogfQogCiAKQEAgLTg2NCw5ICs4OTMsOSBAQAogICogdGlwY19wb3J0X2xpc3RfYWRkIC0gYWRkIGEgcG9ydCB0byBhIHBvcnQgbGlzdCwgZW5zdXJpbmcgbm8gZHVwbGljYXRlcwogICovCiAKLXZvaWQgdGlwY19wb3J0X2xpc3RfYWRkKHN0cnVjdCBwb3J0X2xpc3QgKnBsX3B0ciwgdTMyIHBvcnQpCit2b2lkIHRpcGNfcG9ydF9saXN0X2FkZChzdHJ1Y3QgdGlwY19wb3J0X2xpc3QgKnBsX3B0ciwgdTMyIHBvcnQpCiB7Ci0Jc3RydWN0IHBvcnRfbGlzdCAqaXRlbSA9IHBsX3B0cjsKKwlzdHJ1Y3QgdGlwY19wb3J0X2xpc3QgKml0ZW0gPSBwbF9wdHI7CiAJaW50IGk7CiAJaW50IGl0ZW1fc3ogPSBQTFNJWkU7CiAJaW50IGNudCA9IHBsX3B0ci0+Y291bnQ7CkBAIC04OTgsMTAgKzkyNywxMCBAQAogICoKICAqLwogCi12b2lkIHRpcGNfcG9ydF9saXN0X2ZyZWUoc3RydWN0IHBvcnRfbGlzdCAqcGxfcHRyKQordm9pZCB0aXBjX3BvcnRfbGlzdF9mcmVlKHN0cnVjdCB0aXBjX3BvcnRfbGlzdCAqcGxfcHRyKQogewotCXN0cnVjdCBwb3J0X2xpc3QgKml0ZW07Ci0Jc3RydWN0IHBvcnRfbGlzdCAqbmV4dDsKKwlzdHJ1Y3QgdGlwY19wb3J0X2xpc3QgKml0ZW07CisJc3RydWN0IHRpcGNfcG9ydF9saXN0ICpuZXh0OwogCiAJZm9yIChpdGVtID0gcGxfcHRyLT5uZXh0OyBpdGVtOyBpdGVtID0gbmV4dCkgewogCQluZXh0ID0gaXRlbS0+bmV4dDsKZGlmZiAtLWdpdCBhL25ldC90aXBjL2JjYXN0LmggYi9uZXQvdGlwYy9iY2FzdC5oCmluZGV4IDA2NzQwZGEuLmIwMDk2NjYgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JjYXN0LmgKKysrIGIvbmV0L3RpcGMvYmNhc3QuaApAQCAtNTEsMjAgKzUxLDE4IEBACiAJdTMyIG1hcFtNQVhfTk9ERVMgLyBXU0laRV07CiB9OwogCi1leHRlcm4gc3RydWN0IHRpcGNfbm9kZV9tYXAgdGlwY19iY2FzdF9ubWFwOwotCiAjZGVmaW5lIFBMU0laRSAzMgogCiAvKioKLSAqIHN0cnVjdCBwb3J0X2xpc3QgLSBzZXQgb2Ygbm9kZSBsb2NhbCBkZXN0aW5hdGlvbiBwb3J0cworICogc3RydWN0IHRpcGNfcG9ydF9saXN0IC0gc2V0IG9mIG5vZGUgbG9jYWwgZGVzdGluYXRpb24gcG9ydHMKICAqIEBjb3VudDogIyBvZiBwb3J0cyBpbiBzZXQgKG9ubHkgdmFsaWQgZm9yIGZpcnN0IGVudHJ5IGluIGxpc3QpCiAgKiBAbmV4dDogcG9pbnRlciB0byBuZXh0IGVudHJ5IGluIGxpc3QKICAqIEBwb3J0czogYXJyYXkgb2YgcG9ydCByZWZlcmVuY2VzCiAgKi8KIAotc3RydWN0IHBvcnRfbGlzdCB7CitzdHJ1Y3QgdGlwY19wb3J0X2xpc3QgewogCWludCBjb3VudDsKLQlzdHJ1Y3QgcG9ydF9saXN0ICpuZXh0OworCXN0cnVjdCB0aXBjX3BvcnRfbGlzdCAqbmV4dDsKIAl1MzIgcG9ydHNbUExTSVpFXTsKIH07CiAKQEAgLTg1LDExICs4MywxMyBAQAogCXJldHVybiAhbWVtY21wKG5tX2EsIG5tX2IsIHNpemVvZigqbm1fYSkpOwogfQogCi12b2lkIHRpcGNfcG9ydF9saXN0X2FkZChzdHJ1Y3QgcG9ydF9saXN0ICpwbF9wdHIsIHUzMiBwb3J0KTsKLXZvaWQgdGlwY19wb3J0X2xpc3RfZnJlZShzdHJ1Y3QgcG9ydF9saXN0ICpwbF9wdHIpOwordm9pZCB0aXBjX3BvcnRfbGlzdF9hZGQoc3RydWN0IHRpcGNfcG9ydF9saXN0ICpwbF9wdHIsIHUzMiBwb3J0KTsKK3ZvaWQgdGlwY19wb3J0X2xpc3RfZnJlZShzdHJ1Y3QgdGlwY19wb3J0X2xpc3QgKnBsX3B0cik7CiAKLWludCAgdGlwY19iY2xpbmtfaW5pdCh2b2lkKTsKK3ZvaWQgdGlwY19iY2xpbmtfaW5pdCh2b2lkKTsKIHZvaWQgdGlwY19iY2xpbmtfc3RvcCh2b2lkKTsKK3ZvaWQgdGlwY19iY2xpbmtfYWRkX25vZGUodTMyIGFkZHIpOwordm9pZCB0aXBjX2JjbGlua19yZW1vdmVfbm9kZSh1MzIgYWRkcik7CiBzdHJ1Y3QgdGlwY19ub2RlICp0aXBjX2JjbGlua19yZXRyYW5zbWl0X3RvKHZvaWQpOwogdm9pZCB0aXBjX2JjbGlua19hY2tub3dsZWRnZShzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwgdTMyIGFja2VkKTsKIGludCAgdGlwY19iY2xpbmtfc2VuZF9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9iZWFyZXIuYyBiL25ldC90aXBjL2JlYXJlci5jCmluZGV4IGUyMjAyZGUuLjMyOWZiNjUgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2JlYXJlci5jCisrKyBiL25ldC90aXBjL2JlYXJlci5jCkBAIC00MSw3ICs0MSw3IEBACiAKICNkZWZpbmUgTUFYX0FERFJfU1RSIDMyCiAKLXN0YXRpYyBzdHJ1Y3QgbWVkaWEgbWVkaWFfbGlzdFtNQVhfTUVESUFdOworc3RhdGljIHN0cnVjdCB0aXBjX21lZGlhICptZWRpYV9saXN0W01BWF9NRURJQV07CiBzdGF0aWMgdTMyIG1lZGlhX2NvdW50OwogCiBzdHJ1Y3QgdGlwY19iZWFyZXIgdGlwY19iZWFyZXJzW01BWF9CRUFSRVJTXTsKQEAgLTY1LDE3ICs2NSwzMSBAQAogfQogCiAvKioKLSAqIG1lZGlhX2ZpbmQgLSBsb2NhdGVzIHNwZWNpZmllZCBtZWRpYSBvYmplY3QgYnkgbmFtZQorICogdGlwY19tZWRpYV9maW5kIC0gbG9jYXRlcyBzcGVjaWZpZWQgbWVkaWEgb2JqZWN0IGJ5IG5hbWUKICAqLwogCi1zdGF0aWMgc3RydWN0IG1lZGlhICptZWRpYV9maW5kKGNvbnN0IGNoYXIgKm5hbWUpCitzdHJ1Y3QgdGlwY19tZWRpYSAqdGlwY19tZWRpYV9maW5kKGNvbnN0IGNoYXIgKm5hbWUpCiB7Ci0Jc3RydWN0IG1lZGlhICptX3B0cjsKIAl1MzIgaTsKIAotCWZvciAoaSA9IDAsIG1fcHRyID0gbWVkaWFfbGlzdDsgaSA8IG1lZGlhX2NvdW50OyBpKyssIG1fcHRyKyspIHsKLQkJaWYgKCFzdHJjbXAobV9wdHItPm5hbWUsIG5hbWUpKQotCQkJcmV0dXJuIG1fcHRyOworCWZvciAoaSA9IDA7IGkgPCBtZWRpYV9jb3VudDsgaSsrKSB7CisJCWlmICghc3RyY21wKG1lZGlhX2xpc3RbaV0tPm5hbWUsIG5hbWUpKQorCQkJcmV0dXJuIG1lZGlhX2xpc3RbaV07CisJfQorCXJldHVybiBOVUxMOworfQorCisvKioKKyAqIG1lZGlhX2ZpbmRfaWQgLSBsb2NhdGVzIHNwZWNpZmllZCBtZWRpYSBvYmplY3QgYnkgdHlwZSBpZGVudGlmaWVyCisgKi8KKworc3RhdGljIHN0cnVjdCB0aXBjX21lZGlhICptZWRpYV9maW5kX2lkKHU4IHR5cGUpCit7CisJdTMyIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWVkaWFfY291bnQ7IGkrKykgeworCQlpZiAobWVkaWFfbGlzdFtpXS0+dHlwZV9pZCA9PSB0eXBlKQorCQkJcmV0dXJuIG1lZGlhX2xpc3RbaV07CiAJfQogCXJldHVybiBOVUxMOwogfQpAQCAtODYsODcgKzEwMCwzNCBAQAogICogQmVhcmVycyBmb3IgdGhpcyBtZWRpYSB0eXBlIG11c3QgYmUgYWN0aXZhdGVkIHNlcGFyYXRlbHkgYXQgYSBsYXRlciBzdGFnZS4KICAqLwogCi1pbnQgIHRpcGNfcmVnaXN0ZXJfbWVkaWEodTMyIG1lZGlhX3R5cGUsCi0JCQkgY2hhciAqbmFtZSwKLQkJCSBpbnQgKCplbmFibGUpKHN0cnVjdCB0aXBjX2JlYXJlciAqKSwKLQkJCSB2b2lkICgqZGlzYWJsZSkoc3RydWN0IHRpcGNfYmVhcmVyICopLAotCQkJIGludCAoKnNlbmRfbXNnKShzdHJ1Y3Qgc2tfYnVmZiAqLAotCQkJCQkgc3RydWN0IHRpcGNfYmVhcmVyICosCi0JCQkJCSBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICopLAotCQkJIGNoYXIgKigqYWRkcjJzdHIpKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsCi0JCQkJCSAgIGNoYXIgKnN0cl9idWYsIGludCBzdHJfc2l6ZSksCi0JCQkgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYmNhc3RfYWRkciwKLQkJCSBjb25zdCB1MzIgYmVhcmVyX3ByaW9yaXR5LAotCQkJIGNvbnN0IHUzMiBsaW5rX3RvbGVyYW5jZSwgIC8qIFttc10gKi8KLQkJCSBjb25zdCB1MzIgc2VuZF93aW5kb3dfbGltaXQpCitpbnQgdGlwY19yZWdpc3Rlcl9tZWRpYShzdHJ1Y3QgdGlwY19tZWRpYSAqbV9wdHIpCiB7Ci0Jc3RydWN0IG1lZGlhICptX3B0cjsKLQl1MzIgbWVkaWFfaWQ7Ci0JdTMyIGk7CiAJaW50IHJlcyA9IC1FSU5WQUw7CiAKIAl3cml0ZV9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAotCWlmICh0aXBjX21vZGUgIT0gVElQQ19ORVRfTU9ERSkgewotCQl3YXJuKCJNZWRpYSA8JXM+IHJlamVjdGVkLCBub3QgaW4gbmV0d29ya2VkIG1vZGUgeWV0XG4iLCBuYW1lKTsKKwlpZiAoIW1lZGlhX25hbWVfdmFsaWQobV9wdHItPm5hbWUpKQogCQlnb3RvIGV4aXQ7Ci0JfQotCWlmICghbWVkaWFfbmFtZV92YWxpZChuYW1lKSkgewotCQl3YXJuKCJNZWRpYSA8JXM+IHJlamVjdGVkLCBpbGxlZ2FsIG5hbWVcbiIsIG5hbWUpOworCWlmICgobV9wdHItPmJjYXN0X2FkZHIubWVkaWFfaWQgIT0gbV9wdHItPnR5cGVfaWQpIHx8CisJICAgICFtX3B0ci0+YmNhc3RfYWRkci5icm9hZGNhc3QpCiAJCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKCFiY2FzdF9hZGRyKSB7Ci0JCXdhcm4oIk1lZGlhIDwlcz4gcmVqZWN0ZWQsIG5vIGJyb2FkY2FzdCBhZGRyZXNzXG4iLCBuYW1lKTsKKwlpZiAobV9wdHItPnByaW9yaXR5ID4gVElQQ19NQVhfTElOS19QUkkpCiAJCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKChiZWFyZXJfcHJpb3JpdHkgPCBUSVBDX01JTl9MSU5LX1BSSSkgfHwKLQkgICAgKGJlYXJlcl9wcmlvcml0eSA+IFRJUENfTUFYX0xJTktfUFJJKSkgewotCQl3YXJuKCJNZWRpYSA8JXM+IHJlamVjdGVkLCBpbGxlZ2FsIHByaW9yaXR5ICgldSlcbiIsIG5hbWUsCi0JCSAgICAgYmVhcmVyX3ByaW9yaXR5KTsKKwlpZiAoKG1fcHRyLT50b2xlcmFuY2UgPCBUSVBDX01JTl9MSU5LX1RPTCkgfHwKKwkgICAgKG1fcHRyLT50b2xlcmFuY2UgPiBUSVBDX01BWF9MSU5LX1RPTCkpCiAJCWdvdG8gZXhpdDsKLQl9Ci0JaWYgKChsaW5rX3RvbGVyYW5jZSA8IFRJUENfTUlOX0xJTktfVE9MKSB8fAotCSAgICAobGlua190b2xlcmFuY2UgPiBUSVBDX01BWF9MSU5LX1RPTCkpIHsKLQkJd2FybigiTWVkaWEgPCVzPiByZWplY3RlZCwgaWxsZWdhbCB0b2xlcmFuY2UgKCV1KVxuIiwgbmFtZSwKLQkJICAgICBsaW5rX3RvbGVyYW5jZSk7CisJaWYgKG1lZGlhX2NvdW50ID49IE1BWF9NRURJQSkKIAkJZ290byBleGl0OwotCX0KKwlpZiAodGlwY19tZWRpYV9maW5kKG1fcHRyLT5uYW1lKSB8fCBtZWRpYV9maW5kX2lkKG1fcHRyLT50eXBlX2lkKSkKKwkJZ290byBleGl0OwogCi0JbWVkaWFfaWQgPSBtZWRpYV9jb3VudCsrOwotCWlmIChtZWRpYV9pZCA+PSBNQVhfTUVESUEpIHsKLQkJd2FybigiTWVkaWEgPCVzPiByZWplY3RlZCwgbWVkaWEgbGltaXQgcmVhY2hlZCAoJXUpXG4iLCBuYW1lLAotCQkgICAgIE1BWF9NRURJQSk7Ci0JCW1lZGlhX2NvdW50LS07Ci0JCWdvdG8gZXhpdDsKLQl9Ci0JZm9yIChpID0gMDsgaSA8IG1lZGlhX2lkOyBpKyspIHsKLQkJaWYgKG1lZGlhX2xpc3RbaV0udHlwZV9pZCA9PSBtZWRpYV90eXBlKSB7Ci0JCQl3YXJuKCJNZWRpYSA8JXM+IHJlamVjdGVkLCBkdXBsaWNhdGUgdHlwZSAoJXUpXG4iLCBuYW1lLAotCQkJICAgICBtZWRpYV90eXBlKTsKLQkJCW1lZGlhX2NvdW50LS07Ci0JCQlnb3RvIGV4aXQ7Ci0JCX0KLQkJaWYgKCFzdHJjbXAobmFtZSwgbWVkaWFfbGlzdFtpXS5uYW1lKSkgewotCQkJd2FybigiTWVkaWEgPCVzPiByZWplY3RlZCwgZHVwbGljYXRlIG5hbWVcbiIsIG5hbWUpOwotCQkJbWVkaWFfY291bnQtLTsKLQkJCWdvdG8gZXhpdDsKLQkJfQotCX0KLQotCW1fcHRyID0gJm1lZGlhX2xpc3RbbWVkaWFfaWRdOwotCW1fcHRyLT50eXBlX2lkID0gbWVkaWFfdHlwZTsKLQltX3B0ci0+c2VuZF9tc2cgPSBzZW5kX21zZzsKLQltX3B0ci0+ZW5hYmxlX2JlYXJlciA9IGVuYWJsZTsKLQltX3B0ci0+ZGlzYWJsZV9iZWFyZXIgPSBkaXNhYmxlOwotCW1fcHRyLT5hZGRyMnN0ciA9IGFkZHIyc3RyOwotCW1lbWNweSgmbV9wdHItPmJjYXN0X2FkZHIsIGJjYXN0X2FkZHIsIHNpemVvZigqYmNhc3RfYWRkcikpOwotCXN0cmNweShtX3B0ci0+bmFtZSwgbmFtZSk7Ci0JbV9wdHItPnByaW9yaXR5ID0gYmVhcmVyX3ByaW9yaXR5OwotCW1fcHRyLT50b2xlcmFuY2UgPSBsaW5rX3RvbGVyYW5jZTsKLQltX3B0ci0+d2luZG93ID0gc2VuZF93aW5kb3dfbGltaXQ7CisJbWVkaWFfbGlzdFttZWRpYV9jb3VudF0gPSBtX3B0cjsKKwltZWRpYV9jb3VudCsrOwogCXJlcyA9IDA7CiBleGl0OgogCXdyaXRlX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CisJaWYgKHJlcykKKwkJd2FybigiTWVkaWEgPCVzPiByZWdpc3RyYXRpb24gZXJyb3JcbiIsIG1fcHRyLT5uYW1lKTsKIAlyZXR1cm4gcmVzOwogfQogCkBAIC0xNzYsMjcgKzEzNywxOSBAQAogCiB2b2lkIHRpcGNfbWVkaWFfYWRkcl9wcmludGYoc3RydWN0IHByaW50X2J1ZiAqcGIsIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEpCiB7Ci0Jc3RydWN0IG1lZGlhICptX3B0cjsKLQl1MzIgbWVkaWFfdHlwZTsKLQl1MzIgaTsKKwljaGFyIGFkZHJfc3RyW01BWF9BRERSX1NUUl07CisJc3RydWN0IHRpcGNfbWVkaWEgKm1fcHRyOwogCi0JbWVkaWFfdHlwZSA9IG50b2hsKGEtPnR5cGUpOwotCWZvciAoaSA9IDAsIG1fcHRyID0gbWVkaWFfbGlzdDsgaSA8IG1lZGlhX2NvdW50OyBpKyssIG1fcHRyKyspIHsKLQkJaWYgKG1fcHRyLT50eXBlX2lkID09IG1lZGlhX3R5cGUpCi0JCQlicmVhazsKLQl9CisJbV9wdHIgPSBtZWRpYV9maW5kX2lkKGEtPm1lZGlhX2lkKTsKIAotCWlmICgoaSA8IG1lZGlhX2NvdW50KSAmJiAobV9wdHItPmFkZHIyc3RyICE9IE5VTEwpKSB7Ci0JCWNoYXIgYWRkcl9zdHJbTUFYX0FERFJfU1RSXTsKKwlpZiAobV9wdHIgJiYgIW1fcHRyLT5hZGRyMnN0cihhLCBhZGRyX3N0ciwgc2l6ZW9mKGFkZHJfc3RyKSkpCisJCXRpcGNfcHJpbnRmKHBiLCAiJXMoJXMpIiwgbV9wdHItPm5hbWUsIGFkZHJfc3RyKTsKKwllbHNlIHsKKwkJdTMyIGk7CiAKLQkJdGlwY19wcmludGYocGIsICIlcyglcykiLCBtX3B0ci0+bmFtZSwKLQkJCSAgICBtX3B0ci0+YWRkcjJzdHIoYSwgYWRkcl9zdHIsIHNpemVvZihhZGRyX3N0cikpKTsKLQl9IGVsc2UgewotCQl1bmNoYXIgKmFkZHIgPSAodW5jaGFyICopJmEtPmRldl9hZGRyOwotCi0JCXRpcGNfcHJpbnRmKHBiLCAiVU5LTk9XTigldSkiLCBtZWRpYV90eXBlKTsKLQkJZm9yIChpID0gMDsgaSA8IChzaXplb2YoKmEpIC0gc2l6ZW9mKGEtPnR5cGUpKTsgaSsrKQotCQkJdGlwY19wcmludGYocGIsICItJTAyeCIsIGFkZHJbaV0pOworCQl0aXBjX3ByaW50ZihwYiwgIlVOS05PV04oJXUpIiwgYS0+bWVkaWFfaWQpOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGEtPnZhbHVlKTsgaSsrKQorCQkJdGlwY19wcmludGYocGIsICItJTAyeCIsIGEtPnZhbHVlW2ldKTsKIAl9CiB9CiAKQEAgLTIwNyw3ICsxNjAsNiBAQAogc3RydWN0IHNrX2J1ZmYgKnRpcGNfbWVkaWFfZ2V0X25hbWVzKHZvaWQpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKLQlzdHJ1Y3QgbWVkaWEgKm1fcHRyOwogCWludCBpOwogCiAJYnVmID0gdGlwY19jZmdfcmVwbHlfYWxsb2MoTUFYX01FRElBICogVExWX1NQQUNFKFRJUENfTUFYX01FRElBX05BTUUpKTsKQEAgLTIxNSw5ICsxNjcsMTAgQEAKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZWFkX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwotCWZvciAoaSA9IDAsIG1fcHRyID0gbWVkaWFfbGlzdDsgaSA8IG1lZGlhX2NvdW50OyBpKyssIG1fcHRyKyspIHsKLQkJdGlwY19jZmdfYXBwZW5kX3RsdihidWYsIFRJUENfVExWX01FRElBX05BTUUsIG1fcHRyLT5uYW1lLAotCQkJCSAgICBzdHJsZW4obV9wdHItPm5hbWUpICsgMSk7CisJZm9yIChpID0gMDsgaSA8IG1lZGlhX2NvdW50OyBpKyspIHsKKwkJdGlwY19jZmdfYXBwZW5kX3RsdihidWYsIFRJUENfVExWX01FRElBX05BTUUsCisJCQkJICAgIG1lZGlhX2xpc3RbaV0tPm5hbWUsCisJCQkJICAgIHN0cmxlbihtZWRpYV9saXN0W2ldLT5uYW1lKSArIDEpOwogCX0KIAlyZWFkX3VubG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJcmV0dXJuIGJ1ZjsKQEAgLTIzMiw3ICsxODUsNyBAQAogICovCiAKIHN0YXRpYyBpbnQgYmVhcmVyX25hbWVfdmFsaWRhdGUoY29uc3QgY2hhciAqbmFtZSwKLQkJCQlzdHJ1Y3QgYmVhcmVyX25hbWUgKm5hbWVfcGFydHMpCisJCQkJc3RydWN0IHRpcGNfYmVhcmVyX25hbWVzICpuYW1lX3BhcnRzKQogewogCWNoYXIgbmFtZV9jb3B5W1RJUENfTUFYX0JFQVJFUl9OQU1FXTsKIAljaGFyICptZWRpYV9uYW1lOwpAQCAtMjc2LDEwICsyMjksMTAgQEAKIH0KIAogLyoqCi0gKiBiZWFyZXJfZmluZCAtIGxvY2F0ZXMgYmVhcmVyIG9iamVjdCB3aXRoIG1hdGNoaW5nIGJlYXJlciBuYW1lCisgKiB0aXBjX2JlYXJlcl9maW5kIC0gbG9jYXRlcyBiZWFyZXIgb2JqZWN0IHdpdGggbWF0Y2hpbmcgYmVhcmVyIG5hbWUKICAqLwogCi1zdGF0aWMgc3RydWN0IHRpcGNfYmVhcmVyICpiZWFyZXJfZmluZChjb25zdCBjaGFyICpuYW1lKQorc3RydWN0IHRpcGNfYmVhcmVyICp0aXBjX2JlYXJlcl9maW5kKGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cjsKIAl1MzIgaTsKQEAgLTMxOCw3ICsyNzEsNiBAQAogc3RydWN0IHNrX2J1ZmYgKnRpcGNfYmVhcmVyX2dldF9uYW1lcyh2b2lkKQogewogCXN0cnVjdCBza19idWZmICpidWY7Ci0Jc3RydWN0IG1lZGlhICptX3B0cjsKIAlzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyOwogCWludCBpLCBqOwogCkBAIC0zMjcsMTAgKzI3OSwxMCBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7Ci0JZm9yIChpID0gMCwgbV9wdHIgPSBtZWRpYV9saXN0OyBpIDwgbWVkaWFfY291bnQ7IGkrKywgbV9wdHIrKykgeworCWZvciAoaSA9IDA7IGkgPCBtZWRpYV9jb3VudDsgaSsrKSB7CiAJCWZvciAoaiA9IDA7IGogPCBNQVhfQkVBUkVSUzsgaisrKSB7CiAJCQliX3B0ciA9ICZ0aXBjX2JlYXJlcnNbal07Ci0JCQlpZiAoYl9wdHItPmFjdGl2ZSAmJiAoYl9wdHItPm1lZGlhID09IG1fcHRyKSkgeworCQkJaWYgKGJfcHRyLT5hY3RpdmUgJiYgKGJfcHRyLT5tZWRpYSA9PSBtZWRpYV9saXN0W2ldKSkgewogCQkJCXRpcGNfY2ZnX2FwcGVuZF90bHYoYnVmLCBUSVBDX1RMVl9CRUFSRVJfTkFNRSwKIAkJCQkJCSAgICBiX3B0ci0+bmFtZSwKIAkJCQkJCSAgICBzdHJsZW4oYl9wdHItPm5hbWUpICsgMSk7CkBAIC0zNjYsNyArMzE4LDcgQEAKIHN0YXRpYyBpbnQgYmVhcmVyX3B1c2goc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cikKIHsKIAl1MzIgcmVzID0gMDsKLQlzdHJ1Y3QgbGluayAqbG4sICp0bG47CisJc3RydWN0IHRpcGNfbGluayAqbG4sICp0bG47CiAKIAlpZiAoYl9wdHItPmJsb2NrZWQpCiAJCXJldHVybiAwOwpAQCAtNDEyLDcgKzM2NCw4IEBACiAgKiBiZWFyZXIubG9jayBpcyBidXN5CiAgKi8KIAotc3RhdGljIHZvaWQgdGlwY19iZWFyZXJfc2NoZWR1bGVfdW5sb2NrZWQoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQorc3RhdGljIHZvaWQgdGlwY19iZWFyZXJfc2NoZWR1bGVfdW5sb2NrZWQoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0ciwKKwkJCQkJCXN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCWxpc3RfbW92ZV90YWlsKCZsX3B0ci0+bGlua19saXN0LCAmYl9wdHItPmNvbmdfbGlua3MpOwogfQpAQCAtNDI1LDcgKzM3OCw3IEBACiAgKiBiZWFyZXIubG9jayBpcyBmcmVlCiAgKi8KIAotdm9pZCB0aXBjX2JlYXJlcl9zY2hlZHVsZShzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCit2b2lkIHRpcGNfYmVhcmVyX3NjaGVkdWxlKHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsIHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCXNwaW5fbG9ja19iaCgmYl9wdHItPmxvY2spOwogCXRpcGNfYmVhcmVyX3NjaGVkdWxlX3VubG9ja2VkKGJfcHRyLCBsX3B0cik7CkBAIC00MzgsNyArMzkxLDggQEAKICAqIGFuZCBpZiB0aGVyZSBpcywgdHJ5IHRvIHJlc29sdmUgaXQgYmVmb3JlIHJldHVybmluZy4KICAqICd0aXBjX25ldF9sb2NrJyBpcyByZWFkX2xvY2tlZCB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCiAgKi8KLWludCB0aXBjX2JlYXJlcl9yZXNvbHZlX2Nvbmdlc3Rpb24oc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQoraW50IHRpcGNfYmVhcmVyX3Jlc29sdmVfY29uZ2VzdGlvbihzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLAorCQkJCQlzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKIAlpbnQgcmVzID0gMTsKIApAQCAtNDU3LDcgKzQxMSw3IEBACiAgKiB0aXBjX2JlYXJlcl9jb25nZXN0ZWQgLSBkZXRlcm1pbmVzIGlmIGJlYXJlciBpcyBjdXJyZW50bHkgY29uZ2VzdGVkCiAgKi8KIAotaW50IHRpcGNfYmVhcmVyX2Nvbmdlc3RlZChzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCitpbnQgdGlwY19iZWFyZXJfY29uZ2VzdGVkKHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsIHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCWlmICh1bmxpa2VseShiX3B0ci0+YmxvY2tlZCkpCiAJCXJldHVybiAxOwpAQCAtNDczLDggKzQyNyw4IEBACiBpbnQgdGlwY19lbmFibGVfYmVhcmVyKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBkaXNjX2RvbWFpbiwgdTMyIHByaW9yaXR5KQogewogCXN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHI7Ci0Jc3RydWN0IG1lZGlhICptX3B0cjsKLQlzdHJ1Y3QgYmVhcmVyX25hbWUgYl9uYW1lOworCXN0cnVjdCB0aXBjX21lZGlhICptX3B0cjsKKwlzdHJ1Y3QgdGlwY19iZWFyZXJfbmFtZXMgYl9uYW1lczsKIAljaGFyIGFkZHJfc3RyaW5nWzE2XTsKIAl1MzIgYmVhcmVyX2lkOwogCXUzMiB3aXRoX3RoaXNfcHJpbzsKQEAgLTQ4Niw3ICs0NDAsNyBAQAogCQkgICAgIG5hbWUpOwogCQlyZXR1cm4gLUVOT1BST1RPT1BUOwogCX0KLQlpZiAoIWJlYXJlcl9uYW1lX3ZhbGlkYXRlKG5hbWUsICZiX25hbWUpKSB7CisJaWYgKCFiZWFyZXJfbmFtZV92YWxpZGF0ZShuYW1lLCAmYl9uYW1lcykpIHsKIAkJd2FybigiQmVhcmVyIDwlcz4gcmVqZWN0ZWQsIGlsbGVnYWwgbmFtZVxuIiwgbmFtZSk7CiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTUxMSwxMCArNDY1LDEwIEBACiAKIAl3cml0ZV9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAotCW1fcHRyID0gbWVkaWFfZmluZChiX25hbWUubWVkaWFfbmFtZSk7CisJbV9wdHIgPSB0aXBjX21lZGlhX2ZpbmQoYl9uYW1lcy5tZWRpYV9uYW1lKTsKIAlpZiAoIW1fcHRyKSB7CiAJCXdhcm4oIkJlYXJlciA8JXM+IHJlamVjdGVkLCBtZWRpYSA8JXM+IG5vdCByZWdpc3RlcmVkXG4iLCBuYW1lLAotCQkgICAgIGJfbmFtZS5tZWRpYV9uYW1lKTsKKwkJICAgICBiX25hbWVzLm1lZGlhX25hbWUpOwogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC01NjEsNiArNTE1LDggQEAKIAogCWJfcHRyLT5pZGVudGl0eSA9IGJlYXJlcl9pZDsKIAliX3B0ci0+bWVkaWEgPSBtX3B0cjsKKwliX3B0ci0+dG9sZXJhbmNlID0gbV9wdHItPnRvbGVyYW5jZTsKKwliX3B0ci0+d2luZG93ID0gbV9wdHItPndpbmRvdzsKIAliX3B0ci0+bmV0X3BsYW5lID0gYmVhcmVyX2lkICsgJ0EnOwogCWJfcHRyLT5hY3RpdmUgPSAxOwogCWJfcHRyLT5wcmlvcml0eSA9IHByaW9yaXR5OwpAQCAtNTkwLDExICs1NDYsMTEgQEAKIGludCB0aXBjX2Jsb2NrX2JlYXJlcihjb25zdCBjaGFyICpuYW1lKQogewogCXN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIgPSBOVUxMOwotCXN0cnVjdCBsaW5rICpsX3B0cjsKLQlzdHJ1Y3QgbGluayAqdGVtcF9sX3B0cjsKKwlzdHJ1Y3QgdGlwY19saW5rICpsX3B0cjsKKwlzdHJ1Y3QgdGlwY19saW5rICp0ZW1wX2xfcHRyOwogCiAJcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKLQliX3B0ciA9IGJlYXJlcl9maW5kKG5hbWUpOworCWJfcHRyID0gdGlwY19iZWFyZXJfZmluZChuYW1lKTsKIAlpZiAoIWJfcHRyKSB7CiAJCXdhcm4oIkF0dGVtcHQgdG8gYmxvY2sgdW5rbm93biBiZWFyZXIgPCVzPlxuIiwgbmFtZSk7CiAJCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKQEAgLTYyNSw4ICs1ODEsOCBAQAogCiBzdGF0aWMgdm9pZCBiZWFyZXJfZGlzYWJsZShzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyKQogewotCXN0cnVjdCBsaW5rICpsX3B0cjsKLQlzdHJ1Y3QgbGluayAqdGVtcF9sX3B0cjsKKwlzdHJ1Y3QgdGlwY19saW5rICpsX3B0cjsKKwlzdHJ1Y3QgdGlwY19saW5rICp0ZW1wX2xfcHRyOwogCiAJaW5mbygiRGlzYWJsaW5nIGJlYXJlciA8JXM+XG4iLCBiX3B0ci0+bmFtZSk7CiAJc3Bpbl9sb2NrX2JoKCZiX3B0ci0+bG9jayk7CkBAIC02NDgsNyArNjA0LDcgQEAKIAlpbnQgcmVzOwogCiAJd3JpdGVfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7Ci0JYl9wdHIgPSBiZWFyZXJfZmluZChuYW1lKTsKKwliX3B0ciA9IHRpcGNfYmVhcmVyX2ZpbmQobmFtZSk7CiAJaWYgKGJfcHRyID09IE5VTEwpIHsKIAkJd2FybigiQXR0ZW1wdCB0byBkaXNhYmxlIHVua25vd24gYmVhcmVyIDwlcz5cbiIsIG5hbWUpOwogCQlyZXMgPSAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvYmVhcmVyLmggYi9uZXQvdGlwYy9iZWFyZXIuaAppbmRleCBkNjk2ZjllLi5kM2VhYzU2IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9iZWFyZXIuaAorKysgYi9uZXQvdGlwYy9iZWFyZXIuaApAQCAtNDMsMzIgKzQzLDQ1IEBACiAjZGVmaW5lIE1BWF9NRURJQQkyCiAKIC8qCisgKiBJZGVudGlmaWVycyBhc3NvY2lhdGVkIHdpdGggVElQQyBtZXNzYWdlIGhlYWRlciBtZWRpYSBhZGRyZXNzIGluZm8KKyAqCisgKiAtIGFkZHJlc3MgaW5mbyBmaWVsZCBpcyAyMCBieXRlcyBsb25nCisgKiAtIG1lZGlhIHR5cGUgaWRlbnRpZmllciBsb2NhdGVkIGF0IG9mZnNldCAzCisgKiAtIHJlbWFpbmluZyBieXRlcyB2YXJ5IGFjY29yZGluZyB0byBtZWRpYSB0eXBlCisgKi8KKworI2RlZmluZSBUSVBDX01FRElBX0FERFJfU0laRQkyMAorI2RlZmluZSBUSVBDX01FRElBX1RZUEVfT0ZGU0VUCTMKKworLyoKICAqIElkZW50aWZpZXJzIG9mIHN1cHBvcnRlZCBUSVBDIG1lZGlhIHR5cGVzCiAgKi8KICNkZWZpbmUgVElQQ19NRURJQV9UWVBFX0VUSAkxCiAKIC8qCi0gKiBEZXN0aW5hdGlvbiBhZGRyZXNzIHN0cnVjdHVyZSB1c2VkIGJ5IFRJUEMgYmVhcmVycyB3aGVuIHNlbmRpbmcgbWVzc2FnZXMKLSAqCi0gKiBJTVBPUlRBTlQ6IFRoZSBmaWVsZHMgb2YgdGhpcyBzdHJ1Y3R1cmUgTVVTVCBiZSBzdG9yZWQgdXNpbmcgdGhlIHNwZWNpZmllZAotICogYnl0ZSBvcmRlciBpbmRpY2F0ZWQgYmVsb3csIGFzIHRoZSBzdHJ1Y3R1cmUgaXMgZXhjaGFuZ2VkIGJldHdlZW4gbm9kZXMKLSAqIGFzIHBhcnQgb2YgYSBsaW5rIHNldHVwIHByb2Nlc3MuCisgKiBzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIC0gZGVzdGluYXRpb24gYWRkcmVzcyB1c2VkIGJ5IFRJUEMgYmVhcmVycworICogQHZhbHVlOiBhZGRyZXNzIGluZm8gKGZvcm1hdCBkZWZpbmVkIGJ5IG1lZGlhKQorICogQG1lZGlhX2lkOiBUSVBDIG1lZGlhIHR5cGUgaWRlbnRpZmllcgorICogQGJyb2FkY2FzdDogbm9uLXplcm8gaWYgYWRkcmVzcyBpcyBhIGJyb2FkY2FzdCBhZGRyZXNzCiAgKi8KKwogc3RydWN0IHRpcGNfbWVkaWFfYWRkciB7Ci0JX19iZTMyICB0eXBlOwkJCS8qIGJlYXJlciB0eXBlIChuZXR3b3JrIGJ5dGUgb3JkZXIpICovCi0JdW5pb24gewotCQlfX3U4ICAgZXRoX2FkZHJbNl07CS8qIDQ4IGJpdCBFdGhlcm5ldCBhZGRyIChieXRlIGFycmF5KSAqLwotCX0gZGV2X2FkZHI7CisJdTggdmFsdWVbVElQQ19NRURJQV9BRERSX1NJWkVdOworCXU4IG1lZGlhX2lkOworCXU4IGJyb2FkY2FzdDsKIH07CiAKIHN0cnVjdCB0aXBjX2JlYXJlcjsKIAogLyoqCi0gKiBzdHJ1Y3QgbWVkaWEgLSBUSVBDIG1lZGlhIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBpbnRlcm5hbCB1c2VycworICogc3RydWN0IHRpcGNfbWVkaWEgLSBUSVBDIG1lZGlhIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBpbnRlcm5hbCB1c2VycwogICogQHNlbmRfbXNnOiByb3V0aW5lIHdoaWNoIGhhbmRsZXMgYnVmZmVyIHRyYW5zbWlzc2lvbgogICogQGVuYWJsZV9iZWFyZXI6IHJvdXRpbmUgd2hpY2ggZW5hYmxlcyBhIGJlYXJlcgogICogQGRpc2FibGVfYmVhcmVyOiByb3V0aW5lIHdoaWNoIGRpc2FibGVzIGEgYmVhcmVyCi0gKiBAYWRkcjJzdHI6IHJvdXRpbmUgd2hpY2ggY29udmVydHMgYmVhcmVyJ3MgYWRkcmVzcyB0byBzdHJpbmcgZm9ybQorICogQGFkZHIyc3RyOiByb3V0aW5lIHdoaWNoIGNvbnZlcnRzIG1lZGlhIGFkZHJlc3MgdG8gc3RyaW5nCisgKiBAc3RyMmFkZHI6IHJvdXRpbmUgd2hpY2ggY29udmVydHMgbWVkaWEgYWRkcmVzcyBmcm9tIHN0cmluZworICogQGFkZHIybXNnOiByb3V0aW5lIHdoaWNoIGNvbnZlcnRzIG1lZGlhIGFkZHJlc3MgdG8gcHJvdG9jb2wgbWVzc2FnZSBhcmVhCisgKiBAbXNnMmFkZHI6IHJvdXRpbmUgd2hpY2ggY29udmVydHMgbWVkaWEgYWRkcmVzcyBmcm9tIHByb3RvY29sIG1lc3NhZ2UgYXJlYQogICogQGJjYXN0X2FkZHI6IG1lZGlhIGFkZHJlc3MgdXNlZCBpbiBicm9hZGNhc3RpbmcKICAqIEBwcmlvcml0eTogZGVmYXVsdCBsaW5rIChhbmQgYmVhcmVyKSBwcmlvcml0eQogICogQHRvbGVyYW5jZTogZGVmYXVsdCB0aW1lIChpbiBtcykgYmVmb3JlIGRlY2xhcmluZyBsaW5rIGZhaWx1cmUKQEAgLTc3LDE0ICs5MCwxNiBAQAogICogQG5hbWU6IG1lZGlhIG5hbWUKICAqLwogCi1zdHJ1Y3QgbWVkaWEgeworc3RydWN0IHRpcGNfbWVkaWEgewogCWludCAoKnNlbmRfbXNnKShzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAogCQkJc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0ciwKIAkJCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRlc3QpOwogCWludCAoKmVuYWJsZV9iZWFyZXIpKHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpOwogCXZvaWQgKCpkaXNhYmxlX2JlYXJlcikoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cik7Ci0JY2hhciAqKCphZGRyMnN0cikoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwKLQkJCSAgY2hhciAqc3RyX2J1ZiwgaW50IHN0cl9zaXplKTsKKwlpbnQgKCphZGRyMnN0cikoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwgY2hhciAqc3RyX2J1ZiwgaW50IHN0cl9zaXplKTsKKwlpbnQgKCpzdHIyYWRkcikoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwgY2hhciAqc3RyX2J1Zik7CisJaW50ICgqYWRkcjJtc2cpKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIGNoYXIgKm1zZ19hcmVhKTsKKwlpbnQgKCptc2cyYWRkcikoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwgY2hhciAqbXNnX2FyZWEpOwogCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgYmNhc3RfYWRkcjsKIAl1MzIgcHJpb3JpdHk7CiAJdTMyIHRvbGVyYW5jZTsKQEAgLTEwMyw2ICsxMTgsOCBAQAogICogQG5hbWU6IGJlYXJlciBuYW1lIChmb3JtYXQgPSBtZWRpYTppbnRlcmZhY2UpCiAgKiBAbWVkaWE6IHB0ciB0byBtZWRpYSBzdHJ1Y3R1cmUgYXNzb2NpYXRlZCB3aXRoIGJlYXJlcgogICogQHByaW9yaXR5OiBkZWZhdWx0IGxpbmsgcHJpb3JpdHkgZm9yIGJlYXJlcgorICogQHdpbmRvdzogZGVmYXVsdCB3aW5kb3cgc2l6ZSBmb3IgYmVhcmVyCisgKiBAdG9sZXJhbmNlOiBkZWZhdWx0IGxpbmsgdG9sZXJhbmNlIGZvciBiZWFyZXIKICAqIEBpZGVudGl0eTogYXJyYXkgaW5kZXggb2YgdGhpcyBiZWFyZXIgd2l0aGluIFRJUEMgYmVhcmVyIGFycmF5CiAgKiBAbGlua19yZXE6IHB0ciB0byAob3B0aW9uYWwpIHN0cnVjdHVyZSBtYWtpbmcgcGVyaW9kaWMgbGluayBzZXR1cCByZXF1ZXN0cwogICogQGxpbmtzOiBsaXN0IG9mIG5vbi1jb25nZXN0ZWQgbGlua3MgYXNzb2NpYXRlZCB3aXRoIGJlYXJlcgpAQCAtMTIyLDEwICsxMzksMTIgQEAKIAlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIGFkZHI7CQkvKiBpbml0YWxpemVkIGJ5IG1lZGlhICovCiAJY2hhciBuYW1lW1RJUENfTUFYX0JFQVJFUl9OQU1FXTsKIAlzcGlubG9ja190IGxvY2s7Ci0Jc3RydWN0IG1lZGlhICptZWRpYTsKKwlzdHJ1Y3QgdGlwY19tZWRpYSAqbWVkaWE7CiAJdTMyIHByaW9yaXR5OworCXUzMiB3aW5kb3c7CisJdTMyIHRvbGVyYW5jZTsKIAl1MzIgaWRlbnRpdHk7Ci0Jc3RydWN0IGxpbmtfcmVxICpsaW5rX3JlcTsKKwlzdHJ1Y3QgdGlwY19saW5rX3JlcSAqbGlua19yZXE7CiAJc3RydWN0IGxpc3RfaGVhZCBsaW5rczsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGNvbmdfbGlua3M7CiAJaW50IGFjdGl2ZTsKQEAgLTEzMywyOCArMTUyLDE5IEBACiAJc3RydWN0IHRpcGNfbm9kZV9tYXAgbm9kZXM7CiB9OwogCi1zdHJ1Y3QgYmVhcmVyX25hbWUgeworc3RydWN0IHRpcGNfYmVhcmVyX25hbWVzIHsKIAljaGFyIG1lZGlhX25hbWVbVElQQ19NQVhfTUVESUFfTkFNRV07CiAJY2hhciBpZl9uYW1lW1RJUENfTUFYX0lGX05BTUVdOwogfTsKIAotc3RydWN0IGxpbms7CitzdHJ1Y3QgdGlwY19saW5rOwogCiBleHRlcm4gc3RydWN0IHRpcGNfYmVhcmVyIHRpcGNfYmVhcmVyc1tdOwogCiAvKgogICogVElQQyByb3V0aW5lcyBhdmFpbGFibGUgdG8gc3VwcG9ydGVkIG1lZGlhIHR5cGVzCiAgKi8KLWludCB0aXBjX3JlZ2lzdGVyX21lZGlhKHUzMiBtZWRpYV90eXBlLAotCQkgY2hhciAqbWVkaWFfbmFtZSwgaW50ICgqZW5hYmxlKShzdHJ1Y3QgdGlwY19iZWFyZXIgKiksCi0JCSB2b2lkICgqZGlzYWJsZSkoc3RydWN0IHRpcGNfYmVhcmVyICopLAotCQkgaW50ICgqc2VuZF9tc2cpKHN0cnVjdCBza19idWZmICosCi0JCQlzdHJ1Y3QgdGlwY19iZWFyZXIgKiwgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqKSwKLQkJIGNoYXIgKigqYWRkcjJzdHIpKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsCi0JCQljaGFyICpzdHJfYnVmLCBpbnQgc3RyX3NpemUpLAotCQkgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYmNhc3RfYWRkciwgY29uc3QgdTMyIGJlYXJlcl9wcmlvcml0eSwKLQkJIGNvbnN0IHUzMiBsaW5rX3RvbGVyYW5jZSwgIC8qIFttc10gKi8KLQkJIGNvbnN0IHUzMiBzZW5kX3dpbmRvd19saW1pdCk7CitpbnQgdGlwY19yZWdpc3Rlcl9tZWRpYShzdHJ1Y3QgdGlwY19tZWRpYSAqbV9wdHIpOwogCiB2b2lkIHRpcGNfcmVjdl9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHRpcGNfYmVhcmVyICp0Yl9wdHIpOwogCkBAIC0xNzAsMTYgKzE4MCwyMSBAQAogaW50ICB0aXBjX2V0aF9tZWRpYV9zdGFydCh2b2lkKTsKIHZvaWQgdGlwY19ldGhfbWVkaWFfc3RvcCh2b2lkKTsKIAoraW50IHRpcGNfbWVkaWFfc2V0X3ByaW9yaXR5KGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBuZXdfdmFsdWUpOworaW50IHRpcGNfbWVkaWFfc2V0X3dpbmRvdyhjb25zdCBjaGFyICpuYW1lLCB1MzIgbmV3X3ZhbHVlKTsKIHZvaWQgdGlwY19tZWRpYV9hZGRyX3ByaW50ZihzdHJ1Y3QgcHJpbnRfYnVmICpwYiwgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSk7CiBzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19tZWRpYV9nZXRfbmFtZXModm9pZCk7CiAKIHN0cnVjdCBza19idWZmICp0aXBjX2JlYXJlcl9nZXRfbmFtZXModm9pZCk7CiB2b2lkIHRpcGNfYmVhcmVyX2FkZF9kZXN0KHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsIHUzMiBkZXN0KTsKIHZvaWQgdGlwY19iZWFyZXJfcmVtb3ZlX2Rlc3Qoc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0ciwgdTMyIGRlc3QpOwotdm9pZCB0aXBjX2JlYXJlcl9zY2hlZHVsZShzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCB0aXBjX2JlYXJlcl9zY2hlZHVsZShzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgdGlwY19saW5rICpsX3B0cik7CitzdHJ1Y3QgdGlwY19iZWFyZXIgKnRpcGNfYmVhcmVyX2ZpbmQoY29uc3QgY2hhciAqbmFtZSk7CiBzdHJ1Y3QgdGlwY19iZWFyZXIgKnRpcGNfYmVhcmVyX2ZpbmRfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmlmX25hbWUpOwotaW50IHRpcGNfYmVhcmVyX3Jlc29sdmVfY29uZ2VzdGlvbihzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOwotaW50IHRpcGNfYmVhcmVyX2Nvbmdlc3RlZChzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOworc3RydWN0IHRpcGNfbWVkaWEgKnRpcGNfbWVkaWFfZmluZChjb25zdCBjaGFyICpuYW1lKTsKK2ludCB0aXBjX2JlYXJlcl9yZXNvbHZlX2Nvbmdlc3Rpb24oc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0ciwKKwkJCQkgICBzdHJ1Y3QgdGlwY19saW5rICpsX3B0cik7CitpbnQgdGlwY19iZWFyZXJfY29uZ2VzdGVkKHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsIHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKTsKIHZvaWQgdGlwY19iZWFyZXJfc3RvcCh2b2lkKTsKIHZvaWQgdGlwY19iZWFyZXJfbG9ja19wdXNoKHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIpOwogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb25maWcuYyBiL25ldC90aXBjL2NvbmZpZy5jCmluZGV4IGIyNWEzOTYuLjQ3ODViZjIgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2NvbmZpZy5jCisrKyBiL25ldC90aXBjL2NvbmZpZy5jCkBAIC0xODQsMTMgKzE4NCwxMiBAQAogCQkJCQkJICAgIiAoY2Fubm90IGNoYW5nZSBub2RlIGFkZHJlc3Mgb25jZSBhc3NpZ25lZCkiKTsKIAogCS8qCi0JICogTXVzdCByZWxlYXNlIGFsbCBzcGlubG9ja3MgYmVmb3JlIGNhbGxpbmcgc3RhcnRfbmV0KCkgYmVjYXVzZQotCSAqIExpbnV4IHZlcnNpb24gb2YgVElQQyBjYWxscyBldGhfbWVkaWFfc3RhcnQoKSB3aGljaCBjYWxscwotCSAqIHJlZ2lzdGVyX25ldGRldmljZV9ub3RpZmllcigpIHdoaWNoIG1heSBibG9jayEKLQkgKgotCSAqIFRlbXBvcmFyaWx5IHJlbGVhc2luZyB0aGUgbG9jayBzaG91bGQgYmUgaGFybWxlc3MgZm9yIG5vbi1MaW51eCBUSVBDLAotCSAqIGJ1dCBMaW51eCB2ZXJzaW9uIG9mIGV0aF9tZWRpYV9zdGFydCgpIHNob3VsZCByZWFsbHkgYmUgcmV3b3JrZWQKLQkgKiBzbyB0aGF0IGl0IGNhbiBiZSBjYWxsZWQgd2l0aCBzcGlubG9ja3MgaGVsZC4KKwkgKiBNdXN0IHRlbXBvcmFyaWx5IHJlbGVhc2UgY29uZmlndXJhdGlvbiBzcGlubG9jayB3aGlsZSBzd2l0Y2hpbmcgaW50bworCSAqIG5ldHdvcmtpbmcgbW9kZSBhcyBpdCBjYWxscyB0aXBjX2V0aF9tZWRpYV9zdGFydCgpLCB3aGljaCBtYXkgc2xlZXAuCisJICogUmVsZWFzaW5nIHRoZSBsb2NrIGlzIGhhcm1sZXNzIGFzIG90aGVyIGxvY2FsbHktaXNzdWVkIGNvbmZpZ3VyYXRpb24KKwkgKiBjb21tYW5kcyB3b24ndCBvY2N1ciB1bnRpbCB0aGlzIG9uZSBjb21wbGV0ZXMsIGFuZCByZW1vdGVseS1pc3N1ZWQKKwkgKiBjb25maWd1cmF0aW9uIGNvbW1hbmRzIGNhbid0IGJlIHJlY2VpdmVkIHVudGlsIGEgbG9jYWwgY29uZmlndXJhdGlvbgorCSAqIGNvbW1hbmQgdG8gZW5hYmxlIHRoZSBmaXJzdCBiZWFyZXIgaXMgcmVjZWl2ZWQgYW5kIHByb2Nlc3NlZC4KIAkgKi8KIAogCXNwaW5fdW5sb2NrX2JoKCZjb25maWdfbG9jayk7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9jb3JlLmMgYi9uZXQvdGlwYy9jb3JlLmMKaW5kZXggYzIxMzMxZC4uMjY5MWNkNSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvY29yZS5jCisrKyBiL25ldC90aXBjL2NvcmUuYwpAQCAtOTksOCArOTksOCBAQAogCiBzdGF0aWMgdm9pZCB0aXBjX2NvcmVfc3RvcF9uZXQodm9pZCkKIHsKLQl0aXBjX2V0aF9tZWRpYV9zdG9wKCk7CiAJdGlwY19uZXRfc3RvcCgpOworCXRpcGNfZXRoX21lZGlhX3N0b3AoKTsKIH0KIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5jIGIvbmV0L3RpcGMvZGlzY292ZXIuYwppbmRleCBmMmZiOTZlLi5hMDBlNWY4IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9kaXNjb3Zlci5jCisrKyBiL25ldC90aXBjL2Rpc2NvdmVyLmMKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogCiAvKioKLSAqIHN0cnVjdCBsaW5rX3JlcSAtIGluZm9ybWF0aW9uIGFib3V0IGFuIG9uZ29pbmcgbGluayBzZXR1cCByZXF1ZXN0CisgKiBzdHJ1Y3QgdGlwY19saW5rX3JlcSAtIGluZm9ybWF0aW9uIGFib3V0IGFuIG9uZ29pbmcgbGluayBzZXR1cCByZXF1ZXN0CiAgKiBAYmVhcmVyOiBiZWFyZXIgaXNzdWluZyByZXF1ZXN0cwogICogQGRlc3Q6IGRlc3RpbmF0aW9uIGFkZHJlc3MgZm9yIHJlcXVlc3QgbWVzc2FnZXMKICAqIEBkb21haW46IG5ldHdvcmsgZG9tYWluIHRvIHdoaWNoIGxpbmtzIGNhbiBiZSBlc3RhYmxpc2hlZApAQCAtNTQsNyArNTQsNyBAQAogICogQHRpbWVyOiB0aW1lciBnb3Zlcm5pbmcgcGVyaW9kIGJldHdlZW4gcmVxdWVzdHMKICAqIEB0aW1lcl9pbnR2OiBjdXJyZW50IGludGVydmFsIGJldHdlZW4gcmVxdWVzdHMgKGluIG1zKQogICovCi1zdHJ1Y3QgbGlua19yZXEgeworc3RydWN0IHRpcGNfbGlua19yZXEgewogCXN0cnVjdCB0aXBjX2JlYXJlciAqYmVhcmVyOwogCXN0cnVjdCB0aXBjX21lZGlhX2FkZHIgZGVzdDsKIAl1MzIgZG9tYWluOwpAQCAtODQsNyArODQsNyBAQAogCQltc2dfc2V0X25vbl9zZXEobXNnLCAxKTsKIAkJbXNnX3NldF9kZXN0X2RvbWFpbihtc2csIGRlc3RfZG9tYWluKTsKIAkJbXNnX3NldF9iY19uZXRpZChtc2csIHRpcGNfbmV0X2lkKTsKLQkJbXNnX3NldF9tZWRpYV9hZGRyKG1zZywgJmJfcHRyLT5hZGRyKTsKKwkJYl9wdHItPm1lZGlhLT5hZGRyMm1zZygmYl9wdHItPmFkZHIsIG1zZ19tZWRpYV9hZGRyKG1zZykpOwogCX0KIAlyZXR1cm4gYnVmOwogfQpAQCAtMTIwLDcgKzEyMCw3IEBACiB2b2lkIHRpcGNfZGlzY19yZWN2X21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCBzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyKQogewogCXN0cnVjdCB0aXBjX25vZGUgKm5fcHRyOwotCXN0cnVjdCBsaW5rICpsaW5rOworCXN0cnVjdCB0aXBjX2xpbmsgKmxpbms7CiAJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBtZWRpYV9hZGRyLCAqYWRkcjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcmJ1ZjsKIAlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKQEAgLTEzMCwxMiArMTMwLDE1IEBACiAJdTMyIHR5cGUgPSBtc2dfdHlwZShtc2cpOwogCWludCBsaW5rX2Z1bGx5X3VwOwogCi0JbXNnX2dldF9tZWRpYV9hZGRyKG1zZywgJm1lZGlhX2FkZHIpOworCW1lZGlhX2FkZHIuYnJvYWRjYXN0ID0gMTsKKwliX3B0ci0+bWVkaWEtPm1zZzJhZGRyKCZtZWRpYV9hZGRyLCBtc2dfbWVkaWFfYWRkcihtc2cpKTsKIAlidWZfZGlzY2FyZChidWYpOwogCiAJLyogVmFsaWRhdGUgZGlzY292ZXJ5IG1lc3NhZ2UgZnJvbSByZXF1ZXN0aW5nIG5vZGUgKi8KIAlpZiAobmV0X2lkICE9IHRpcGNfbmV0X2lkKQogCQlyZXR1cm47CisJaWYgKG1lZGlhX2FkZHIuYnJvYWRjYXN0KQorCQlyZXR1cm47CiAJaWYgKCF0aXBjX2FkZHJfZG9tYWluX3ZhbGlkKGRlc3QpKQogCQlyZXR1cm47CiAJaWYgKCF0aXBjX2FkZHJfbm9kZV92YWxpZChvcmlnKSkKQEAgLTIxNSw3ICsyMTgsNyBAQAogICogYW5kIGlzIGVpdGhlciBub3QgY3VycmVudGx5IHNlYXJjaGluZyBvciBpcyBzZWFyY2hpbmcgYXQgYSBzbG93IHJhdGUKICAqLwogCi1zdGF0aWMgdm9pZCBkaXNjX3VwZGF0ZShzdHJ1Y3QgbGlua19yZXEgKnJlcSkKK3N0YXRpYyB2b2lkIGRpc2NfdXBkYXRlKHN0cnVjdCB0aXBjX2xpbmtfcmVxICpyZXEpCiB7CiAJaWYgKCFyZXEtPm51bV9ub2RlcykgewogCQlpZiAoKHJlcS0+dGltZXJfaW50diA9PSBUSVBDX0xJTktfUkVRX0lOQUNUSVZFKSB8fApAQCAtMjMxLDcgKzIzNCw3IEBACiAgKiBAcmVxOiBwdHIgdG8gbGluayByZXF1ZXN0IHN0cnVjdHVyZQogICovCiAKLXZvaWQgdGlwY19kaXNjX2FkZF9kZXN0KHN0cnVjdCBsaW5rX3JlcSAqcmVxKQordm9pZCB0aXBjX2Rpc2NfYWRkX2Rlc3Qoc3RydWN0IHRpcGNfbGlua19yZXEgKnJlcSkKIHsKIAlyZXEtPm51bV9ub2RlcysrOwogfQpAQCAtMjQxLDcgKzI0NCw3IEBACiAgKiBAcmVxOiBwdHIgdG8gbGluayByZXF1ZXN0IHN0cnVjdHVyZQogICovCiAKLXZvaWQgdGlwY19kaXNjX3JlbW92ZV9kZXN0KHN0cnVjdCBsaW5rX3JlcSAqcmVxKQordm9pZCB0aXBjX2Rpc2NfcmVtb3ZlX2Rlc3Qoc3RydWN0IHRpcGNfbGlua19yZXEgKnJlcSkKIHsKIAlyZXEtPm51bV9ub2Rlcy0tOwogCWRpc2NfdXBkYXRlKHJlcSk7CkBAIC0yNTIsNyArMjU1LDcgQEAKICAqIEByZXE6IHB0ciB0byBsaW5rIHJlcXVlc3Qgc3RydWN0dXJlCiAgKi8KIAotc3RhdGljIHZvaWQgZGlzY19zZW5kX21zZyhzdHJ1Y3QgbGlua19yZXEgKnJlcSkKK3N0YXRpYyB2b2lkIGRpc2Nfc2VuZF9tc2coc3RydWN0IHRpcGNfbGlua19yZXEgKnJlcSkKIHsKIAlpZiAoIXJlcS0+YmVhcmVyLT5ibG9ja2VkKQogCQl0aXBjX2JlYXJlcl9zZW5kKHJlcS0+YmVhcmVyLCByZXEtPmJ1ZiwgJnJlcS0+ZGVzdCk7CkBAIC0yNjUsNyArMjY4LDcgQEAKICAqIENhbGxlZCB3aGVuZXZlciBhIGxpbmsgc2V0dXAgcmVxdWVzdCB0aW1lciBhc3NvY2lhdGVkIHdpdGggYSBiZWFyZXIgZXhwaXJlcy4KICAqLwogCi1zdGF0aWMgdm9pZCBkaXNjX3RpbWVvdXQoc3RydWN0IGxpbmtfcmVxICpyZXEpCitzdGF0aWMgdm9pZCBkaXNjX3RpbWVvdXQoc3RydWN0IHRpcGNfbGlua19yZXEgKnJlcSkKIHsKIAlpbnQgbWF4X2RlbGF5OwogCkBAIC0zMTMsNyArMzE2LDcgQEAKIGludCB0aXBjX2Rpc2NfY3JlYXRlKHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsCiAJCSAgICAgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqZGVzdCwgdTMyIGRlc3RfZG9tYWluKQogewotCXN0cnVjdCBsaW5rX3JlcSAqcmVxOworCXN0cnVjdCB0aXBjX2xpbmtfcmVxICpyZXE7CiAKIAlyZXEgPSBrbWFsbG9jKHNpemVvZigqcmVxKSwgR0ZQX0FUT01JQyk7CiAJaWYgKCFyZXEpCkBAIC0zNDIsNyArMzQ1LDcgQEAKICAqIEByZXE6IHB0ciB0byBsaW5rIHJlcXVlc3Qgc3RydWN0dXJlCiAgKi8KIAotdm9pZCB0aXBjX2Rpc2NfZGVsZXRlKHN0cnVjdCBsaW5rX3JlcSAqcmVxKQordm9pZCB0aXBjX2Rpc2NfZGVsZXRlKHN0cnVjdCB0aXBjX2xpbmtfcmVxICpyZXEpCiB7CiAJa19jYW5jZWxfdGltZXIoJnJlcS0+dGltZXIpOwogCWtfdGVybV90aW1lcigmcmVxLT50aW1lcik7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9kaXNjb3Zlci5oIGIvbmV0L3RpcGMvZGlzY292ZXIuaAppbmRleCBhM2FmNTk1Li43NWI2N2M0IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9kaXNjb3Zlci5oCisrKyBiL25ldC90aXBjL2Rpc2NvdmVyLmgKQEAgLTM3LDEzICszNywxMyBAQAogI2lmbmRlZiBfVElQQ19ESVNDT1ZFUl9ICiAjZGVmaW5lIF9USVBDX0RJU0NPVkVSX0gKIAotc3RydWN0IGxpbmtfcmVxOworc3RydWN0IHRpcGNfbGlua19yZXE7CiAKIGludCB0aXBjX2Rpc2NfY3JlYXRlKHN0cnVjdCB0aXBjX2JlYXJlciAqYl9wdHIsIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmRlc3QsCiAJCSAgICAgdTMyIGRlc3RfZG9tYWluKTsKLXZvaWQgdGlwY19kaXNjX2RlbGV0ZShzdHJ1Y3QgbGlua19yZXEgKnJlcSk7Ci12b2lkIHRpcGNfZGlzY19hZGRfZGVzdChzdHJ1Y3QgbGlua19yZXEgKnJlcSk7Ci12b2lkIHRpcGNfZGlzY19yZW1vdmVfZGVzdChzdHJ1Y3QgbGlua19yZXEgKnJlcSk7Cit2b2lkIHRpcGNfZGlzY19kZWxldGUoc3RydWN0IHRpcGNfbGlua19yZXEgKnJlcSk7Cit2b2lkIHRpcGNfZGlzY19hZGRfZGVzdChzdHJ1Y3QgdGlwY19saW5rX3JlcSAqcmVxKTsKK3ZvaWQgdGlwY19kaXNjX3JlbW92ZV9kZXN0KHN0cnVjdCB0aXBjX2xpbmtfcmVxICpyZXEpOwogdm9pZCB0aXBjX2Rpc2NfcmVjdl9tc2coc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cik7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvZXRoX21lZGlhLmMgYi9uZXQvdGlwYy9ldGhfbWVkaWEuYwppbmRleCBlNzI4ZDRjLi41MjdlM2YwIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ldGhfbWVkaWEuYworKysgYi9uZXQvdGlwYy9ldGhfbWVkaWEuYwpAQCAtMzgsMjggKzM4LDQ1IEBACiAjaW5jbHVkZSAiYmVhcmVyLmgiCiAKICNkZWZpbmUgTUFYX0VUSF9CRUFSRVJTCQlNQVhfQkVBUkVSUwotI2RlZmluZSBFVEhfTElOS19QUklPUklUWQlUSVBDX0RFRl9MSU5LX1BSSQotI2RlZmluZSBFVEhfTElOS19UT0xFUkFOQ0UJVElQQ19ERUZfTElOS19UT0wKLSNkZWZpbmUgRVRIX0xJTktfV0lORE9XCQlUSVBDX0RFRl9MSU5LX1dJTgorCisjZGVmaW5lIEVUSF9BRERSX09GRlNFVAk0CS8qIG1lc3NhZ2UgaGVhZGVyIG9mZnNldCBvZiBNQUMgYWRkcmVzcyAqLwogCiAvKioKICAqIHN0cnVjdCBldGhfYmVhcmVyIC0gRXRoZXJuZXQgYmVhcmVyIGRhdGEgc3RydWN0dXJlCiAgKiBAYmVhcmVyOiBwdHIgdG8gYXNzb2NpYXRlZCAiZ2VuZXJpYyIgYmVhcmVyIHN0cnVjdHVyZQogICogQGRldjogcHRyIHRvIGFzc29jaWF0ZWQgRXRoZXJuZXQgbmV0d29yayBkZXZpY2UKICAqIEB0aXBjX3BhY2tldF90eXBlOiB1c2VkIGluIGJpbmRpbmcgVElQQyB0byBFdGhlcm5ldCBkcml2ZXIKKyAqIEBjbGVhbnVwOiB3b3JrIGl0ZW0gdXNlZCB3aGVuIGRpc2FibGluZyBiZWFyZXIKICAqLwogCiBzdHJ1Y3QgZXRoX2JlYXJlciB7CiAJc3RydWN0IHRpcGNfYmVhcmVyICpiZWFyZXI7CiAJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKIAlzdHJ1Y3QgcGFja2V0X3R5cGUgdGlwY19wYWNrZXRfdHlwZTsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgY2xlYW51cDsKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgdGlwY19tZWRpYSBldGhfbWVkaWFfaW5mbzsKIHN0YXRpYyBzdHJ1Y3QgZXRoX2JlYXJlciBldGhfYmVhcmVyc1tNQVhfRVRIX0JFQVJFUlNdOwogc3RhdGljIGludCBldGhfc3RhcnRlZDsKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbm90aWZpZXI7CiAKIC8qKgorICogZXRoX21lZGlhX2FkZHJfc2V0IC0gaW5pdGlhbGl6ZSBFdGhlcm5ldCBtZWRpYSBhZGRyZXNzIHN0cnVjdHVyZQorICoKKyAqIE1lZGlhLWRlcGVuZGVudCAidmFsdWUiIGZpZWxkIHN0b3JlcyBNQUMgYWRkcmVzcyBpbiBmaXJzdCA2IGJ5dGVzCisgKiBhbmQgemVyb2VzIG91dCB0aGUgcmVtYWluaW5nIGJ5dGVzLgorICovCisKK3N0YXRpYyB2b2lkIGV0aF9tZWRpYV9hZGRyX3NldChzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLCBjaGFyICptYWMpCit7CisJbWVtY3B5KGEtPnZhbHVlLCBtYWMsIEVUSF9BTEVOKTsKKwltZW1zZXQoYS0+dmFsdWUgKyBFVEhfQUxFTiwgMCwgc2l6ZW9mKGEtPnZhbHVlKSAtIEVUSF9BTEVOKTsKKwlhLT5tZWRpYV9pZCA9IFRJUENfTUVESUFfVFlQRV9FVEg7CisJYS0+YnJvYWRjYXN0ID0gIW1lbWNtcChtYWMsIGV0aF9tZWRpYV9pbmZvLmJjYXN0X2FkZHIudmFsdWUsIEVUSF9BTEVOKTsKK30KKworLyoqCiAgKiBzZW5kX21zZyAtIHNlbmQgYSBUSVBDIG1lc3NhZ2Ugb3V0IG92ZXIgYW4gRXRoZXJuZXQgaW50ZXJmYWNlCiAgKi8KIApAQCAtODUsNyArMTAyLDcgQEAKIAogCXNrYl9yZXNldF9uZXR3b3JrX2hlYWRlcihjbG9uZSk7CiAJY2xvbmUtPmRldiA9IGRldjsKLQlkZXZfaGFyZF9oZWFkZXIoY2xvbmUsIGRldiwgRVRIX1BfVElQQywgJmRlc3QtPmRldl9hZGRyLmV0aF9hZGRyLAorCWRldl9oYXJkX2hlYWRlcihjbG9uZSwgZGV2LCBFVEhfUF9USVBDLCBkZXN0LT52YWx1ZSwKIAkJCWRldi0+ZGV2X2FkZHIsIGNsb25lLT5sZW4pOwogCWRldl9xdWV1ZV94bWl0KGNsb25lKTsKIAlyZXR1cm4gMDsKQEAgLTE3MiwyMiArMTg5LDQxIEBACiAJdGJfcHRyLT51c3JfaGFuZGxlID0gKHZvaWQgKillYl9wdHI7CiAJdGJfcHRyLT5tdHUgPSBkZXYtPm10dTsKIAl0Yl9wdHItPmJsb2NrZWQgPSAwOwotCXRiX3B0ci0+YWRkci50eXBlID0gaHRvbmwoVElQQ19NRURJQV9UWVBFX0VUSCk7Ci0JbWVtY3B5KCZ0Yl9wdHItPmFkZHIuZGV2X2FkZHIsIGRldi0+ZGV2X2FkZHIsIEVUSF9BTEVOKTsKKwlldGhfbWVkaWFfYWRkcl9zZXQoJnRiX3B0ci0+YWRkciwgKGNoYXIgKilkZXYtPmRldl9hZGRyKTsKIAlyZXR1cm4gMDsKIH0KIAogLyoqCisgKiBjbGVhbnVwX2JlYXJlciAtIGJyZWFrIGFzc29jaWF0aW9uIGJldHdlZW4gRXRoZXJuZXQgYmVhcmVyIGFuZCBpbnRlcmZhY2UKKyAqCisgKiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBpbnZva2VkIGZyb20gYSB3b3JrIHF1ZXVlIGJlY2F1c2UgaXQgY2FuIHNsZWVwLgorICovCisKK3N0YXRpYyB2b2lkIGNsZWFudXBfYmVhcmVyKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgZXRoX2JlYXJlciAqZWJfcHRyID0KKwkJY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBldGhfYmVhcmVyLCBjbGVhbnVwKTsKKworCWRldl9yZW1vdmVfcGFjaygmZWJfcHRyLT50aXBjX3BhY2tldF90eXBlKTsKKwlkZXZfcHV0KGViX3B0ci0+ZGV2KTsKKwllYl9wdHItPmRldiA9IE5VTEw7Cit9CisKKy8qKgogICogZGlzYWJsZV9iZWFyZXIgLSBkZXRhY2ggVElQQyBiZWFyZXIgZnJvbSBhbiBFdGhlcm5ldCBpbnRlcmZhY2UKICAqCi0gKiBXZSByZWFsbHkgc2hvdWxkIGRvIGRldl9yZW1vdmVfcGFjaygpIGhlcmUsIGJ1dCB0aGlzIGZ1bmN0aW9uIGNhbiBub3QgYmUKLSAqIGNhbGxlZCBhdCB0YXNrbGV0IGxldmVsLiA9PiBVc2UgZXRoX2JlYXJlci0+YmVhcmVyIGFzIGEgZmxhZyB0byB0aHJvdyBhd2F5Ci0gKiBpbmNvbWluZyBidWZmZXJzLCAmIHBvc3Rwb25lIGRldl9yZW1vdmVfcGFjaygpIHRvIGV0aF9tZWRpYV9zdG9wKCkgb24gZXhpdC4KKyAqIE1hcmsgRXRoZXJuZXQgYmVhcmVyIGFzIGluYWN0aXZlIHNvIHRoYXQgaW5jb21pbmcgYnVmZmVycyBhcmUgdGhyb3duIGF3YXksCisgKiB0aGVuIGdldCB3b3JrZXIgdGhyZWFkIHRvIGNvbXBsZXRlIGJlYXJlciBjbGVhbnVwLiAgKENhbid0IGRvIGNsZWFudXAKKyAqIGhlcmUgYmVjYXVzZSBjbGVhbnVwIGNvZGUgbmVlZHMgdG8gc2xlZXAgYW5kIGNhbGxlciBob2xkcyBzcGlubG9ja3MuKQogICovCiAKIHN0YXRpYyB2b2lkIGRpc2FibGVfYmVhcmVyKHN0cnVjdCB0aXBjX2JlYXJlciAqdGJfcHRyKQogewotCSgoc3RydWN0IGV0aF9iZWFyZXIgKil0Yl9wdHItPnVzcl9oYW5kbGUpLT5iZWFyZXIgPSBOVUxMOworCXN0cnVjdCBldGhfYmVhcmVyICplYl9wdHIgPSAoc3RydWN0IGV0aF9iZWFyZXIgKil0Yl9wdHItPnVzcl9oYW5kbGU7CisKKwllYl9wdHItPmJlYXJlciA9IE5VTEw7CisJSU5JVF9XT1JLKCZlYl9wdHItPmNsZWFudXAsIGNsZWFudXBfYmVhcmVyKTsKKwlzY2hlZHVsZV93b3JrKCZlYl9wdHItPmNsZWFudXApOwogfQogCiAvKioKQEAgLTI0NiwxOCArMjgyLDgyIEBACiAgKiBldGhfYWRkcjJzdHIgLSBjb252ZXJ0IEV0aGVybmV0IGFkZHJlc3MgdG8gc3RyaW5nCiAgKi8KIAotc3RhdGljIGNoYXIgKmV0aF9hZGRyMnN0cihzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLCBjaGFyICpzdHJfYnVmLCBpbnQgc3RyX3NpemUpCitzdGF0aWMgaW50IGV0aF9hZGRyMnN0cihzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLCBjaGFyICpzdHJfYnVmLCBpbnQgc3RyX3NpemUpCiB7Ci0JdW5jaGFyICphZGRyID0gKHVuY2hhciAqKSZhLT5kZXZfYWRkcjsKKwlpZiAoc3RyX3NpemUgPCAxOCkJLyogMTggPSBzdHJsZW4oImFhOmJiOmNjOmRkOmVlOmZmXDAiKSAqLworCQlyZXR1cm4gMTsKIAotCWlmIChzdHJfc2l6ZSA8IDE4KQotCQkqc3RyX2J1ZiA9ICdcMCc7Ci0JZWxzZQotCQlzcHJpbnRmKHN0cl9idWYsICIlcE0iLCBhZGRyKTsKLQlyZXR1cm4gc3RyX2J1ZjsKKwlzcHJpbnRmKHN0cl9idWYsICIlcE0iLCBhLT52YWx1ZSk7CisJcmV0dXJuIDA7CiB9CiAKIC8qKgorICogZXRoX3N0cjJhZGRyIC0gY29udmVydCBzdHJpbmcgdG8gRXRoZXJuZXQgYWRkcmVzcworICovCisKK3N0YXRpYyBpbnQgZXRoX3N0cjJhZGRyKHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEsIGNoYXIgKnN0cl9idWYpCit7CisJY2hhciBtYWNbRVRIX0FMRU5dOworCWludCByOworCisJciA9IHNzY2FuZihzdHJfYnVmLCAiJTAyeDolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMngiLAorCQkgICAgICAgKHUzMiAqKSZtYWNbMF0sICh1MzIgKikmbWFjWzFdLCAodTMyICopJm1hY1syXSwKKwkJICAgICAgICh1MzIgKikmbWFjWzNdLCAodTMyICopJm1hY1s0XSwgKHUzMiAqKSZtYWNbNV0pOworCisJaWYgKHIgIT0gRVRIX0FMRU4pCisJCXJldHVybiAxOworCisJZXRoX21lZGlhX2FkZHJfc2V0KGEsIG1hYyk7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogZXRoX3N0cjJhZGRyIC0gY29udmVydCBFdGhlcm5ldCBhZGRyZXNzIGZvcm1hdCB0byBtZXNzYWdlIGhlYWRlciBmb3JtYXQKKyAqLworCitzdGF0aWMgaW50IGV0aF9hZGRyMm1zZyhzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICphLCBjaGFyICptc2dfYXJlYSkKK3sKKwltZW1zZXQobXNnX2FyZWEsIDAsIFRJUENfTUVESUFfQUREUl9TSVpFKTsKKwltc2dfYXJlYVtUSVBDX01FRElBX1RZUEVfT0ZGU0VUXSA9IFRJUENfTUVESUFfVFlQRV9FVEg7CisJbWVtY3B5KG1zZ19hcmVhICsgRVRIX0FERFJfT0ZGU0VULCBhLT52YWx1ZSwgRVRIX0FMRU4pOworCXJldHVybiAwOworfQorCisvKioKKyAqIGV0aF9zdHIyYWRkciAtIGNvbnZlcnQgbWVzc2FnZSBoZWFkZXIgYWRkcmVzcyBmb3JtYXQgdG8gRXRoZXJuZXQgZm9ybWF0CisgKi8KKworc3RhdGljIGludCBldGhfbXNnMmFkZHIoc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqYSwgY2hhciAqbXNnX2FyZWEpCit7CisJaWYgKG1zZ19hcmVhW1RJUENfTUVESUFfVFlQRV9PRkZTRVRdICE9IFRJUENfTUVESUFfVFlQRV9FVEgpCisJCXJldHVybiAxOworCisJZXRoX21lZGlhX2FkZHJfc2V0KGEsIG1zZ19hcmVhICsgRVRIX0FERFJfT0ZGU0VUKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEV0aGVybmV0IG1lZGlhIHJlZ2lzdHJhdGlvbiBpbmZvCisgKi8KKworc3RhdGljIHN0cnVjdCB0aXBjX21lZGlhIGV0aF9tZWRpYV9pbmZvID0geworCS5zZW5kX21zZwk9IHNlbmRfbXNnLAorCS5lbmFibGVfYmVhcmVyCT0gZW5hYmxlX2JlYXJlciwKKwkuZGlzYWJsZV9iZWFyZXIJPSBkaXNhYmxlX2JlYXJlciwKKwkuYWRkcjJzdHIJPSBldGhfYWRkcjJzdHIsCisJLnN0cjJhZGRyCT0gZXRoX3N0cjJhZGRyLAorCS5hZGRyMm1zZwk9IGV0aF9hZGRyMm1zZywKKwkubXNnMmFkZHIJPSBldGhfbXNnMmFkZHIsCisJLmJjYXN0X2FkZHIJPSB7IHsgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiB9LAorCQkJICAgIFRJUENfTUVESUFfVFlQRV9FVEgsIDEgfSwKKwkucHJpb3JpdHkJPSBUSVBDX0RFRl9MSU5LX1BSSSwKKwkudG9sZXJhbmNlCT0gVElQQ19ERUZfTElOS19UT0wsCisJLndpbmRvdwkJPSBUSVBDX0RFRl9MSU5LX1dJTiwKKwkudHlwZV9pZAk9IFRJUENfTUVESUFfVFlQRV9FVEgsCisJLm5hbWUJCT0gImV0aCIKK307CisKKy8qKgogICogdGlwY19ldGhfbWVkaWFfc3RhcnQgLSBhY3RpdmF0ZSBFdGhlcm5ldCBiZWFyZXIgc3VwcG9ydAogICoKICAqIFJlZ2lzdGVyIEV0aGVybmV0IG1lZGlhIHR5cGUgd2l0aCBUSVBDIGJlYXJlciBjb2RlLiAgQWxzbyByZWdpc3RlcgpAQCAtMjY2LDIxICszNjYsMTIgQEAKIAogaW50IHRpcGNfZXRoX21lZGlhX3N0YXJ0KHZvaWQpCiB7Ci0Jc3RydWN0IHRpcGNfbWVkaWFfYWRkciBiY2FzdF9hZGRyOwogCWludCByZXM7CiAKIAlpZiAoZXRoX3N0YXJ0ZWQpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JYmNhc3RfYWRkci50eXBlID0gaHRvbmwoVElQQ19NRURJQV9UWVBFX0VUSCk7Ci0JbWVtc2V0KCZiY2FzdF9hZGRyLmRldl9hZGRyLCAweGZmLCBFVEhfQUxFTik7Ci0KLQltZW1zZXQoZXRoX2JlYXJlcnMsIDAsIHNpemVvZihldGhfYmVhcmVycykpOwotCi0JcmVzID0gdGlwY19yZWdpc3Rlcl9tZWRpYShUSVBDX01FRElBX1RZUEVfRVRILCAiZXRoIiwKLQkJCQkgIGVuYWJsZV9iZWFyZXIsIGRpc2FibGVfYmVhcmVyLCBzZW5kX21zZywKLQkJCQkgIGV0aF9hZGRyMnN0ciwgJmJjYXN0X2FkZHIsIEVUSF9MSU5LX1BSSU9SSVRZLAotCQkJCSAgRVRIX0xJTktfVE9MRVJBTkNFLCBFVEhfTElOS19XSU5ET1cpOworCXJlcyA9IHRpcGNfcmVnaXN0ZXJfbWVkaWEoJmV0aF9tZWRpYV9pbmZvKTsKIAlpZiAocmVzKQogCQlyZXR1cm4gcmVzOwogCkBAIC0yOTgsMjIgKzM4OSwxMCBAQAogCiB2b2lkIHRpcGNfZXRoX21lZGlhX3N0b3Aodm9pZCkKIHsKLQlpbnQgaTsKLQogCWlmICghZXRoX3N0YXJ0ZWQpCiAJCXJldHVybjsKIAorCWZsdXNoX3NjaGVkdWxlZF93b3JrKCk7CiAJdW5yZWdpc3Rlcl9uZXRkZXZpY2Vfbm90aWZpZXIoJm5vdGlmaWVyKTsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0VUSF9CRUFSRVJTIDsgaSsrKSB7Ci0JCWlmIChldGhfYmVhcmVyc1tpXS5iZWFyZXIpIHsKLQkJCWV0aF9iZWFyZXJzW2ldLmJlYXJlci0+YmxvY2tlZCA9IDE7Ci0JCQlldGhfYmVhcmVyc1tpXS5iZWFyZXIgPSBOVUxMOwotCQl9Ci0JCWlmIChldGhfYmVhcmVyc1tpXS5kZXYpIHsKLQkJCWRldl9yZW1vdmVfcGFjaygmZXRoX2JlYXJlcnNbaV0udGlwY19wYWNrZXRfdHlwZSk7Ci0JCQlkZXZfcHV0KGV0aF9iZWFyZXJzW2ldLmRldik7Ci0JCX0KLQl9Ci0JbWVtc2V0KCZldGhfYmVhcmVycywgMCwgc2l6ZW9mKGV0aF9iZWFyZXJzKSk7CiAJZXRoX3N0YXJ0ZWQgPSAwOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbGluay5jIGIvbmV0L3RpcGMvbGluay5jCmluZGV4IGFlOThhNzIuLmFjMTgzMmEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2xpbmsuYworKysgYi9uZXQvdGlwYy9saW5rLmMKQEAgLTcxLDM1ICs3MSwzNiBAQAogI2RlZmluZSBTVEFSVF9DSEFOR0VPVkVSIDEwMDAwMHUKIAogLyoqCi0gKiBzdHJ1Y3QgbGlua19uYW1lIC0gZGVjb25zdHJ1Y3RlZCBsaW5rIG5hbWUKKyAqIHN0cnVjdCB0aXBjX2xpbmtfbmFtZSAtIGRlY29uc3RydWN0ZWQgbGluayBuYW1lCiAgKiBAYWRkcl9sb2NhbDogbmV0d29yayBhZGRyZXNzIG9mIG5vZGUgYXQgdGhpcyBlbmQKICAqIEBpZl9sb2NhbDogbmFtZSBvZiBpbnRlcmZhY2UgYXQgdGhpcyBlbmQKICAqIEBhZGRyX3BlZXI6IG5ldHdvcmsgYWRkcmVzcyBvZiBub2RlIGF0IGZhciBlbmQKICAqIEBpZl9wZWVyOiBuYW1lIG9mIGludGVyZmFjZSBhdCBmYXIgZW5kCiAgKi8KIAotc3RydWN0IGxpbmtfbmFtZSB7CitzdHJ1Y3QgdGlwY19saW5rX25hbWUgewogCXUzMiBhZGRyX2xvY2FsOwogCWNoYXIgaWZfbG9jYWxbVElQQ19NQVhfSUZfTkFNRV07CiAJdTMyIGFkZHJfcGVlcjsKIAljaGFyIGlmX3BlZXJbVElQQ19NQVhfSUZfTkFNRV07CiB9OwogCi1zdGF0aWMgdm9pZCBsaW5rX2hhbmRsZV9vdXRfb2Zfc2VxX21zZyhzdHJ1Y3QgbGluayAqbF9wdHIsCitzdGF0aWMgdm9pZCBsaW5rX2hhbmRsZV9vdXRfb2Zfc2VxX21zZyhzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwKIAkJCQkgICAgICAgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Ci1zdGF0aWMgdm9pZCBsaW5rX3JlY3ZfcHJvdG9fbXNnKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Ci1zdGF0aWMgaW50ICBsaW5rX3JlY3ZfY2hhbmdlb3Zlcl9tc2coc3RydWN0IGxpbmsgKipsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKipidWYpOwotc3RhdGljIHZvaWQgbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgdG9sZXJhbmNlKTsKK3N0YXRpYyB2b2lkIGxpbmtfcmVjdl9wcm90b19tc2coc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYpOworc3RhdGljIGludCAgbGlua19yZWN2X2NoYW5nZW92ZXJfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKipsX3B0ciwKKwkJCQkgICAgIHN0cnVjdCBza19idWZmICoqYnVmKTsKK3N0YXRpYyB2b2lkIGxpbmtfc2V0X3N1cGVydmlzaW9uX3Byb3BzKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCB1MzIgdG9sZXJhbmNlKTsKIHN0YXRpYyBpbnQgIGxpbmtfc2VuZF9zZWN0aW9uc19sb25nKHN0cnVjdCB0aXBjX3BvcnQgKnNlbmRlciwKIAkJCQkgICAgc3RydWN0IGlvdmVjIGNvbnN0ICptc2dfc2VjdCwKIAkJCQkgICAgdTMyIG51bV9zZWN0LCB1bnNpZ25lZCBpbnQgdG90YWxfbGVuLAogCQkJCSAgICB1MzIgZGVzdG5vZGUpOwotc3RhdGljIHZvaWQgbGlua19jaGVja19kZWZyYWdtX2J1ZnMoc3RydWN0IGxpbmsgKmxfcHRyKTsKLXN0YXRpYyB2b2lkIGxpbmtfc3RhdGVfZXZlbnQoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgZXZlbnQpOwotc3RhdGljIHZvaWQgbGlua19yZXNldF9zdGF0aXN0aWNzKHN0cnVjdCBsaW5rICpsX3B0cik7Ci1zdGF0aWMgdm9pZCBsaW5rX3ByaW50KHN0cnVjdCBsaW5rICpsX3B0ciwgY29uc3QgY2hhciAqc3RyKTsKLXN0YXRpYyB2b2lkIGxpbmtfc3RhcnQoc3RydWN0IGxpbmsgKmxfcHRyKTsKLXN0YXRpYyBpbnQgbGlua19zZW5kX2xvbmdfYnVmKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CitzdGF0aWMgdm9pZCBsaW5rX2NoZWNrX2RlZnJhZ21fYnVmcyhzdHJ1Y3QgdGlwY19saW5rICpsX3B0cik7CitzdGF0aWMgdm9pZCBsaW5rX3N0YXRlX2V2ZW50KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCB1MzIgZXZlbnQpOworc3RhdGljIHZvaWQgbGlua19yZXNldF9zdGF0aXN0aWNzKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKTsKK3N0YXRpYyB2b2lkIGxpbmtfcHJpbnQoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIGNvbnN0IGNoYXIgKnN0cik7CitzdGF0aWMgdm9pZCBsaW5rX3N0YXJ0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKTsKK3N0YXRpYyBpbnQgbGlua19zZW5kX2xvbmdfYnVmKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKIAogLyoKICAqICBTaW1wbGUgbGluayByb3V0aW5lcwpAQCAtMTEwLDcgKzExMSw3IEBACiAJcmV0dXJuIChpICsgMykgJiB+M3U7CiB9CiAKLXN0YXRpYyB2b2lkIGxpbmtfaW5pdF9tYXhfcGt0KHN0cnVjdCBsaW5rICpsX3B0cikKK3N0YXRpYyB2b2lkIGxpbmtfaW5pdF9tYXhfcGt0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCXUzMiBtYXhfcGt0OwogCkBAIC0xMjcsMTQgKzEyOCwxNCBAQAogCWxfcHRyLT5tYXhfcGt0X3Byb2JlcyA9IDA7CiB9CiAKLXN0YXRpYyB1MzIgbGlua19uZXh0X3NlbnQoc3RydWN0IGxpbmsgKmxfcHRyKQorc3RhdGljIHUzMiBsaW5rX25leHRfc2VudChzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKIAlpZiAobF9wdHItPm5leHRfb3V0KQotCQlyZXR1cm4gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPm5leHRfb3V0KSk7CisJCXJldHVybiBidWZfc2Vxbm8obF9wdHItPm5leHRfb3V0KTsKIAlyZXR1cm4gbW9kKGxfcHRyLT5uZXh0X291dF9ubyk7CiB9CiAKLXN0YXRpYyB1MzIgbGlua19sYXN0X3NlbnQoc3RydWN0IGxpbmsgKmxfcHRyKQorc3RhdGljIHUzMiBsaW5rX2xhc3Rfc2VudChzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKIAlyZXR1cm4gbW9kKGxpbmtfbmV4dF9zZW50KGxfcHRyKSAtIDEpOwogfQpAQCAtMTQzLDI4ICsxNDQsMjkgQEAKICAqICBTaW1wbGUgbm9uLXN0YXRpYyBsaW5rIHJvdXRpbmVzIChpLmUuIHJlZmVyZW5jZWQgb3V0c2lkZSB0aGlzIGZpbGUpCiAgKi8KIAotaW50IHRpcGNfbGlua19pc191cChzdHJ1Y3QgbGluayAqbF9wdHIpCitpbnQgdGlwY19saW5rX2lzX3VwKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCWlmICghbF9wdHIpCiAJCXJldHVybiAwOwogCXJldHVybiBsaW5rX3dvcmtpbmdfd29ya2luZyhsX3B0cikgfHwgbGlua193b3JraW5nX3Vua25vd24obF9wdHIpOwogfQogCi1pbnQgdGlwY19saW5rX2lzX2FjdGl2ZShzdHJ1Y3QgbGluayAqbF9wdHIpCitpbnQgdGlwY19saW5rX2lzX2FjdGl2ZShzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKIAlyZXR1cm4JKGxfcHRyLT5vd25lci0+YWN0aXZlX2xpbmtzWzBdID09IGxfcHRyKSB8fAogCQkobF9wdHItPm93bmVyLT5hY3RpdmVfbGlua3NbMV0gPT0gbF9wdHIpOwogfQogCiAvKioKLSAqIGxpbmtfbmFtZV92YWxpZGF0ZSAtIHZhbGlkYXRlICYgKG9wdGlvbmFsbHkpIGRlY29uc3RydWN0IGxpbmsgbmFtZQorICogbGlua19uYW1lX3ZhbGlkYXRlIC0gdmFsaWRhdGUgJiAob3B0aW9uYWxseSkgZGVjb25zdHJ1Y3QgdGlwY19saW5rIG5hbWUKICAqIEBuYW1lIC0gcHRyIHRvIGxpbmsgbmFtZSBzdHJpbmcKICAqIEBuYW1lX3BhcnRzIC0gcHRyIHRvIGFyZWEgZm9yIGxpbmsgbmFtZSBjb21wb25lbnRzIChvciBOVUxMIGlmIG5vdCBuZWVkZWQpCiAgKgogICogUmV0dXJucyAxIGlmIGxpbmsgbmFtZSBpcyB2YWxpZCwgb3RoZXJ3aXNlIDAuCiAgKi8KIAotc3RhdGljIGludCBsaW5rX25hbWVfdmFsaWRhdGUoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGxpbmtfbmFtZSAqbmFtZV9wYXJ0cykKK3N0YXRpYyBpbnQgbGlua19uYW1lX3ZhbGlkYXRlKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJc3RydWN0IHRpcGNfbGlua19uYW1lICpuYW1lX3BhcnRzKQogewogCWNoYXIgbmFtZV9jb3B5W1RJUENfTUFYX0xJTktfTkFNRV07CiAJY2hhciAqYWRkcl9sb2NhbDsKQEAgLTIzOCw3ICsyNDAsNyBAQAogICogdGlwY19ub2RlX2RlbGV0ZSgpIGlzIGNhbGxlZC4pCiAgKi8KIAotc3RhdGljIHZvaWQgbGlua190aW1lb3V0KHN0cnVjdCBsaW5rICpsX3B0cikKK3N0YXRpYyB2b2lkIGxpbmtfdGltZW91dChzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKIAl0aXBjX25vZGVfbG9jayhsX3B0ci0+b3duZXIpOwogCkBAIC0yODcsNyArMjg5LDcgQEAKIAl0aXBjX25vZGVfdW5sb2NrKGxfcHRyLT5vd25lcik7CiB9CiAKLXN0YXRpYyB2b2lkIGxpbmtfc2V0X3RpbWVyKHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIHRpbWUpCitzdGF0aWMgdm9pZCBsaW5rX3NldF90aW1lcihzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgdTMyIHRpbWUpCiB7CiAJa19zdGFydF90aW1lcigmbF9wdHItPnRpbWVyLCB0aW1lKTsKIH0KQEAgLTMwMSwxMSArMzAzLDExIEBACiAgKiBSZXR1cm5zIHBvaW50ZXIgdG8gbGluay4KICAqLwogCi1zdHJ1Y3QgbGluayAqdGlwY19saW5rX2NyZWF0ZShzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwKK3N0cnVjdCB0aXBjX2xpbmsgKnRpcGNfbGlua19jcmVhdGUoc3RydWN0IHRpcGNfbm9kZSAqbl9wdHIsCiAJCQkgICAgICBzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLAogCQkJICAgICAgY29uc3Qgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqbWVkaWFfYWRkcikKIHsKLQlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IHRpcGNfbGluayAqbF9wdHI7CiAJc3RydWN0IHRpcGNfbXNnICptc2c7CiAJY2hhciAqaWZfbmFtZTsKIAljaGFyIGFkZHJfc3RyaW5nWzE2XTsKQEAgLTM0Myw3ICszNDUsNyBAQAogCWxfcHRyLT5jaGVja3BvaW50ID0gMTsKIAlsX3B0ci0+cGVlcl9zZXNzaW9uID0gSU5WQUxJRF9TRVNTSU9OOwogCWxfcHRyLT5iX3B0ciA9IGJfcHRyOwotCWxpbmtfc2V0X3N1cGVydmlzaW9uX3Byb3BzKGxfcHRyLCBiX3B0ci0+bWVkaWEtPnRvbGVyYW5jZSk7CisJbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMobF9wdHIsIGJfcHRyLT50b2xlcmFuY2UpOwogCWxfcHRyLT5zdGF0ZSA9IFJFU0VUX1VOS05PV047CiAKIAlsX3B0ci0+cG1zZyA9IChzdHJ1Y3QgdGlwY19tc2cgKikmbF9wdHItPnByb3RvX21zZzsKQEAgLTM1NSw3ICszNTcsNyBAQAogCXN0cmNweSgoY2hhciAqKW1zZ19kYXRhKG1zZyksIGlmX25hbWUpOwogCiAJbF9wdHItPnByaW9yaXR5ID0gYl9wdHItPnByaW9yaXR5OwotCXRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKGxfcHRyLCBiX3B0ci0+bWVkaWEtPndpbmRvdyk7CisJdGlwY19saW5rX3NldF9xdWV1ZV9saW1pdHMobF9wdHIsIGJfcHRyLT53aW5kb3cpOwogCiAJbGlua19pbml0X21heF9wa3QobF9wdHIpOwogCkBAIC0zODIsNyArMzg0LDcgQEAKICAqIHRvIGF2b2lkIGEgcG90ZW50aWFsIGRlYWRsb2NrIHNpdHVhdGlvbi4KICAqLwogCi12b2lkIHRpcGNfbGlua19kZWxldGUoc3RydWN0IGxpbmsgKmxfcHRyKQordm9pZCB0aXBjX2xpbmtfZGVsZXRlKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCWlmICghbF9wdHIpIHsKIAkJZXJyKCJBdHRlbXB0IHRvIGRlbGV0ZSBub24tZXhpc3RlbnQgbGlua1xuIik7CkBAIC00MDEsNyArNDAzLDcgQEAKIAlrZnJlZShsX3B0cik7CiB9CiAKLXN0YXRpYyB2b2lkIGxpbmtfc3RhcnQoc3RydWN0IGxpbmsgKmxfcHRyKQorc3RhdGljIHZvaWQgbGlua19zdGFydChzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKIAl0aXBjX25vZGVfbG9jayhsX3B0ci0+b3duZXIpOwogCWxpbmtfc3RhdGVfZXZlbnQobF9wdHIsIFNUQVJUSU5HX0VWVCk7CkBAIC00MTgsNyArNDIwLDcgQEAKICAqIGhhcyBhYmF0ZWQuCiAgKi8KIAotc3RhdGljIGludCBsaW5rX3NjaGVkdWxlX3BvcnQoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgb3JpZ3BvcnQsIHUzMiBzeikKK3N0YXRpYyBpbnQgbGlua19zY2hlZHVsZV9wb3J0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCB1MzIgb3JpZ3BvcnQsIHUzMiBzeikKIHsKIAlzdHJ1Y3QgdGlwY19wb3J0ICpwX3B0cjsKIApAQCAtNDQwLDcgKzQ0Miw3IEBACiAJcmV0dXJuIC1FTElOS0NPTkc7CiB9CiAKLXZvaWQgdGlwY19saW5rX3dha2V1cF9wb3J0cyhzdHJ1Y3QgbGluayAqbF9wdHIsIGludCBhbGwpCit2b2lkIHRpcGNfbGlua193YWtldXBfcG9ydHMoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIGludCBhbGwpCiB7CiAJc3RydWN0IHRpcGNfcG9ydCAqcF9wdHI7CiAJc3RydWN0IHRpcGNfcG9ydCAqdGVtcF9wX3B0cjsKQEAgLTQ3NSw3ICs0NzcsNyBAQAogICogQGxfcHRyOiBwb2ludGVyIHRvIGxpbmsKICAqLwogCi1zdGF0aWMgdm9pZCBsaW5rX3JlbGVhc2Vfb3V0cXVldWUoc3RydWN0IGxpbmsgKmxfcHRyKQorc3RhdGljIHZvaWQgbGlua19yZWxlYXNlX291dHF1ZXVlKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCXN0cnVjdCBza19idWZmICpidWYgPSBsX3B0ci0+Zmlyc3Rfb3V0OwogCXN0cnVjdCBza19idWZmICpuZXh0OwpAQCAtNDk0LDcgKzQ5Niw3IEBACiAgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluawogICovCiAKLXZvaWQgdGlwY19saW5rX3Jlc2V0X2ZyYWdtZW50cyhzdHJ1Y3QgbGluayAqbF9wdHIpCit2b2lkIHRpcGNfbGlua19yZXNldF9mcmFnbWVudHMoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IGxfcHRyLT5kZWZyYWdtX2J1ZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dDsKQEAgLTUxMiw3ICs1MTQsNyBAQAogICogQGxfcHRyOiBwb2ludGVyIHRvIGxpbmsKICAqLwogCi12b2lkIHRpcGNfbGlua19zdG9wKHN0cnVjdCBsaW5rICpsX3B0cikKK3ZvaWQgdGlwY19saW5rX3N0b3Aoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCiB7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dDsKQEAgLTUzNyw3ICs1MzksNyBAQAogCWxfcHRyLT5wcm90b19tc2dfcXVldWUgPSBOVUxMOwogfQogCi12b2lkIHRpcGNfbGlua19yZXNldChzdHJ1Y3QgbGluayAqbF9wdHIpCit2b2lkIHRpcGNfbGlua19yZXNldChzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOwogCXUzMiBwcmV2X3N0YXRlID0gbF9wdHItPnN0YXRlOwpAQCAtNTk3LDcgKzU5OSw3IEBACiB9CiAKIAotc3RhdGljIHZvaWQgbGlua19hY3RpdmF0ZShzdHJ1Y3QgbGluayAqbF9wdHIpCitzdGF0aWMgdm9pZCBsaW5rX2FjdGl2YXRlKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCWxfcHRyLT5uZXh0X2luX25vID0gbF9wdHItPnN0YXRzLnJlY3ZfaW5mbyA9IDE7CiAJdGlwY19ub2RlX2xpbmtfdXAobF9wdHItPm93bmVyLCBsX3B0cik7CkBAIC02MTAsOSArNjEyLDkgQEAKICAqIEBldmVudDogc3RhdGUgbWFjaGluZSBldmVudCB0byBwcm9jZXNzCiAgKi8KIAotc3RhdGljIHZvaWQgbGlua19zdGF0ZV9ldmVudChzdHJ1Y3QgbGluayAqbF9wdHIsIHVuc2lnbmVkIGV2ZW50KQorc3RhdGljIHZvaWQgbGlua19zdGF0ZV9ldmVudChzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgdW5zaWduZWQgZXZlbnQpCiB7Ci0Jc3RydWN0IGxpbmsgKm90aGVyOworCXN0cnVjdCB0aXBjX2xpbmsgKm90aGVyOwogCXUzMiBjb250X2ludHYgPSBsX3B0ci0+Y29udGludWl0eV9pbnRlcnZhbDsKIAogCWlmICghbF9wdHItPnN0YXJ0ZWQgJiYgKGV2ZW50ICE9IFNUQVJUSU5HX0VWVCkpCkBAIC03ODQsNyArNzg2LDcgQEAKICAqIHRoZSB0YWlsIG9mIGFuIGV4aXN0aW5nIG9uZS4KICAqLwogCi1zdGF0aWMgaW50IGxpbmtfYnVuZGxlX2J1ZihzdHJ1Y3QgbGluayAqbF9wdHIsCitzdGF0aWMgaW50IGxpbmtfYnVuZGxlX2J1ZihzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwKIAkJCSAgIHN0cnVjdCBza19idWZmICpidW5kbGVyLAogCQkJICAgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKIHsKQEAgLTgxMyw3ICs4MTUsNyBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBsaW5rX2FkZF90b19vdXRxdWV1ZShzdHJ1Y3QgbGluayAqbF9wdHIsCitzdGF0aWMgdm9pZCBsaW5rX2FkZF90b19vdXRxdWV1ZShzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwKIAkJCQkgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKIAkJCQkgc3RydWN0IHRpcGNfbXNnICptc2cpCiB7CkBAIC04MzQsNyArODM2LDcgQEAKIAkJbF9wdHItPnN0YXRzLm1heF9xdWV1ZV9zeiA9IGxfcHRyLT5vdXRfcXVldWVfc2l6ZTsKIH0KIAotc3RhdGljIHZvaWQgbGlua19hZGRfY2hhaW5fdG9fb3V0cXVldWUoc3RydWN0IGxpbmsgKmxfcHRyLAorc3RhdGljIHZvaWQgbGlua19hZGRfY2hhaW5fdG9fb3V0cXVldWUoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsCiAJCQkJICAgICAgIHN0cnVjdCBza19idWZmICpidWZfY2hhaW4sCiAJCQkJICAgICAgIHUzMiBsb25nX21zZ25vKQogewpAQCAtODU5LDcgKzg2MSw3IEBACiAgKiBoYXMgZmFpbGVkLCBhbmQgZnJvbSBsaW5rX3NlbmQoKQogICovCiAKLWludCB0aXBjX2xpbmtfc2VuZF9idWYoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQoraW50IHRpcGNfbGlua19zZW5kX2J1ZihzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKIHsKIAlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKIAl1MzIgc2l6ZSA9IG1zZ19zaXplKG1zZyk7CkBAIC05NTQsNyArOTU2LDcgQEAKIAogaW50IHRpcGNfbGlua19zZW5kKHN0cnVjdCBza19idWZmICpidWYsIHUzMiBkZXN0LCB1MzIgc2VsZWN0b3IpCiB7Ci0Jc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyOwogCXN0cnVjdCB0aXBjX25vZGUgKm5fcHRyOwogCWludCByZXMgPSAtRUxJTktDT05HOwogCkBAIC05ODgsNyArOTkwLDcgQEAKIHZvaWQgdGlwY19saW5rX3NlbmRfbmFtZXMoc3RydWN0IGxpc3RfaGVhZCAqbWVzc2FnZV9saXN0LCB1MzIgZGVzdCkKIHsKIAlzdHJ1Y3QgdGlwY19ub2RlICpuX3B0cjsKLQlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IHRpcGNfbGluayAqbF9wdHI7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqdGVtcF9idWY7CiAKQEAgLTEwMjcsNyArMTAyOSw3IEBACiAgKiBMaW5rIGlzIGxvY2tlZC4gUmV0dXJucyB1c2VyIGRhdGEgbGVuZ3RoLgogICovCiAKLXN0YXRpYyBpbnQgbGlua19zZW5kX2J1Zl9mYXN0KHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKK3N0YXRpYyBpbnQgbGlua19zZW5kX2J1Zl9mYXN0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAogCQkJICAgICAgdTMyICp1c2VkX21heF9wa3QpCiB7CiAJc3RydWN0IHRpcGNfbXNnICptc2cgPSBidWZfbXNnKGJ1Zik7CkBAIC0xMDYxLDcgKzEwNjMsNyBAQAogICovCiBpbnQgdGlwY19zZW5kX2J1Zl9mYXN0KHN0cnVjdCBza19idWZmICpidWYsIHUzMiBkZXN0bm9kZSkKIHsKLQlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IHRpcGNfbGluayAqbF9wdHI7CiAJc3RydWN0IHRpcGNfbm9kZSAqbl9wdHI7CiAJaW50IHJlczsKIAl1MzIgc2VsZWN0b3IgPSBtc2dfb3JpZ3BvcnQoYnVmX21zZyhidWYpKSAmIDE7CkBAIC0xMTAwLDcgKzExMDIsNyBAQAogCQkJCSB1MzIgZGVzdGFkZHIpCiB7CiAJc3RydWN0IHRpcGNfbXNnICpoZHIgPSAmc2VuZGVyLT5waGRyOwotCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3QgdGlwY19saW5rICpsX3B0cjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOwogCXN0cnVjdCB0aXBjX25vZGUgKm5vZGU7CiAJaW50IHJlczsKQEAgLTExOTUsNyArMTE5Nyw3IEBACiAJCQkJICAgdW5zaWduZWQgaW50IHRvdGFsX2xlbiwKIAkJCQkgICB1MzIgZGVzdGFkZHIpCiB7Ci0Jc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyOwogCXN0cnVjdCB0aXBjX25vZGUgKm5vZGU7CiAJc3RydWN0IHRpcGNfbXNnICpoZHIgPSAmc2VuZGVyLT5waGRyOwogCXUzMiBkc3ogPSB0b3RhbF9sZW47CkBAIC0xMzQyLDcgKzEzNDQsNyBAQAogLyoKICAqIHRpcGNfbGlua19wdXNoX3BhY2tldDogUHVzaCBvbmUgdW5zZW50IHBhY2tldCB0byB0aGUgbWVkaWEKICAqLwotdTMyIHRpcGNfbGlua19wdXNoX3BhY2tldChzdHJ1Y3QgbGluayAqbF9wdHIpCit1MzIgdGlwY19saW5rX3B1c2hfcGFja2V0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCXN0cnVjdCBza19idWZmICpidWYgPSBsX3B0ci0+Zmlyc3Rfb3V0OwogCXUzMiByX3Ffc2l6ZSA9IGxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9zaXplOwpAQCAtMTM1NCw3ICsxMzU2LDcgQEAKIAlpZiAocl9xX3NpemUgJiYgYnVmKSB7CiAJCXUzMiBsYXN0ID0gbGVzc2VyKG1vZChyX3FfaGVhZCArIHJfcV9zaXplKSwKIAkJCQkgIGxpbmtfbGFzdF9zZW50KGxfcHRyKSk7Ci0JCXUzMiBmaXJzdCA9IG1zZ19zZXFubyhidWZfbXNnKGJ1ZikpOworCQl1MzIgZmlyc3QgPSBidWZfc2Vxbm8oYnVmKTsKIAogCQl3aGlsZSAoYnVmICYmIGxlc3MoZmlyc3QsIHJfcV9oZWFkKSkgewogCQkJZmlyc3QgPSBtb2QoZmlyc3QgKyAxKTsKQEAgLTE0MDMsNyArMTQwNSw3IEBACiAJaWYgKGJ1ZikgewogCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKIAkJdTMyIG5leHQgPSBtc2dfc2Vxbm8obXNnKTsKLQkJdTMyIGZpcnN0ID0gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPmZpcnN0X291dCkpOworCQl1MzIgZmlyc3QgPSBidWZfc2Vxbm8obF9wdHItPmZpcnN0X291dCk7CiAKIAkJaWYgKG1vZChuZXh0IC0gZmlyc3QpIDwgbF9wdHItPnF1ZXVlX2xpbWl0WzBdKSB7CiAJCQltc2dfc2V0X2Fjayhtc2csIG1vZChsX3B0ci0+bmV4dF9pbl9ubyAtIDEpKTsKQEAgLTE0MjYsNyArMTQyOCw3IEBACiAgKiBwdXNoX3F1ZXVlKCk6IHB1c2ggb3V0IHRoZSB1bnNlbnQgbWVzc2FnZXMgb2YgYSBsaW5rIHdoZXJlCiAgKiAgICAgICAgICAgICAgIGNvbmdlc3Rpb24gaGFzIGFiYXRlZC4gTm9kZSBpcyBsb2NrZWQKICAqLwotdm9pZCB0aXBjX2xpbmtfcHVzaF9xdWV1ZShzdHJ1Y3QgbGluayAqbF9wdHIpCit2b2lkIHRpcGNfbGlua19wdXNoX3F1ZXVlKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCXUzMiByZXM7CiAKQEAgLTE0NzAsNyArMTQ3Miw4IEBACiAJcmVhZF91bmxvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBsaW5rX3JldHJhbnNtaXRfZmFpbHVyZShzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYpCitzdGF0aWMgdm9pZCBsaW5rX3JldHJhbnNtaXRfZmFpbHVyZShzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwKKwkJCQkJc3RydWN0IHNrX2J1ZmYgKmJ1ZikKIHsKIAlzdHJ1Y3QgdGlwY19tc2cgKm1zZyA9IGJ1Zl9tc2coYnVmKTsKIApAQCAtMTUxNCw3ICsxNTE3LDcgQEAKIAl9CiB9CiAKLXZvaWQgdGlwY19saW5rX3JldHJhbnNtaXQoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmLAordm9pZCB0aXBjX2xpbmtfcmV0cmFuc21pdChzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZiwKIAkJCSAgdTMyIHJldHJhbnNtaXRzKQogewogCXN0cnVjdCB0aXBjX21zZyAqbXNnOwpAQCAtMTU1OCw3ICsxNTYxLDcgQEAKIAkJfSBlbHNlIHsKIAkJCXRpcGNfYmVhcmVyX3NjaGVkdWxlKGxfcHRyLT5iX3B0ciwgbF9wdHIpOwogCQkJbF9wdHItPnN0YXRzLmJlYXJlcl9jb25ncysrOwotCQkJbF9wdHItPnJldHJhbnNtX3F1ZXVlX2hlYWQgPSBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKKwkJCWxfcHRyLT5yZXRyYW5zbV9xdWV1ZV9oZWFkID0gYnVmX3NlcW5vKGJ1Zik7CiAJCQlsX3B0ci0+cmV0cmFuc21fcXVldWVfc2l6ZSA9IHJldHJhbnNtaXRzOwogCQkJcmV0dXJuOwogCQl9CkBAIC0xNTcxLDcgKzE1NzQsNyBAQAogICogbGlua19pbnNlcnRfZGVmZXJyZWRfcXVldWUgLSBpbnNlcnQgZGVmZXJyZWQgbWVzc2FnZXMgYmFjayBpbnRvIHJlY2VpdmUgY2hhaW4KICAqLwogCi1zdGF0aWMgc3RydWN0IHNrX2J1ZmYgKmxpbmtfaW5zZXJ0X2RlZmVycmVkX3F1ZXVlKHN0cnVjdCBsaW5rICpsX3B0ciwKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqbGlua19pbnNlcnRfZGVmZXJyZWRfcXVldWUoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsCiAJCQkJCQkgIHN0cnVjdCBza19idWZmICpidWYpCiB7CiAJdTMyIHNlcV9ubzsKQEAgLTE1NzksNyArMTU4Miw3IEBACiAJaWYgKGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4gPT0gTlVMTCkKIAkJcmV0dXJuIGJ1ZjsKIAotCXNlcV9ubyA9IG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4pKTsKKwlzZXFfbm8gPSBidWZfc2Vxbm8obF9wdHItPm9sZGVzdF9kZWZlcnJlZF9pbik7CiAJaWYgKHNlcV9ubyA9PSBtb2QobF9wdHItPm5leHRfaW5fbm8pKSB7CiAJCWxfcHRyLT5uZXdlc3RfZGVmZXJyZWRfaW4tPm5leHQgPSBidWY7CiAJCWJ1ZiA9IGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW47CkBAIC0xNjUzLDcgKzE2NTYsNyBAQAogCXJlYWRfbG9ja19iaCgmdGlwY19uZXRfbG9jayk7CiAJd2hpbGUgKGhlYWQpIHsKIAkJc3RydWN0IHRpcGNfbm9kZSAqbl9wdHI7Ci0JCXN0cnVjdCBsaW5rICpsX3B0cjsKKwkJc3RydWN0IHRpcGNfbGluayAqbF9wdHI7CiAJCXN0cnVjdCBza19idWZmICpjcnM7CiAJCXN0cnVjdCBza19idWZmICpidWYgPSBoZWFkOwogCQlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKQEAgLTE3MzMsMTQgKzE3MzYsMTIgQEAKIAogCQkvKiBSZWxlYXNlIGFja2VkIG1lc3NhZ2VzICovCiAKLQkJaWYgKGxlc3Mobl9wdHItPmJjbGluay5hY2tlZCwgbXNnX2JjYXN0X2Fjayhtc2cpKSkgewotCQkJaWYgKHRpcGNfbm9kZV9pc191cChuX3B0cikgJiYgbl9wdHItPmJjbGluay5zdXBwb3J0ZWQpCi0JCQkJdGlwY19iY2xpbmtfYWNrbm93bGVkZ2Uobl9wdHIsIG1zZ19iY2FzdF9hY2sobXNnKSk7Ci0JCX0KKwkJaWYgKHRpcGNfbm9kZV9pc191cChuX3B0cikgJiYgbl9wdHItPmJjbGluay5zdXBwb3J0ZWQpCisJCQl0aXBjX2JjbGlua19hY2tub3dsZWRnZShuX3B0ciwgbXNnX2JjYXN0X2Fjayhtc2cpKTsKIAogCQljcnMgPSBsX3B0ci0+Zmlyc3Rfb3V0OwogCQl3aGlsZSAoKGNycyAhPSBsX3B0ci0+bmV4dF9vdXQpICYmCi0JCSAgICAgICBsZXNzX2VxKG1zZ19zZXFubyhidWZfbXNnKGNycykpLCBhY2tkKSkgeworCQkgICAgICAgbGVzc19lcShidWZfc2Vxbm8oY3JzKSwgYWNrZCkpIHsKIAkJCXN0cnVjdCBza19idWZmICpuZXh0ID0gY3JzLT5uZXh0OwogCiAJCQlidWZfZGlzY2FyZChjcnMpOwpAQCAtMTg2Myw3ICsxODY0LDcgQEAKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqcHJldiA9IE5VTEw7CiAJc3RydWN0IHNrX2J1ZmYgKmNycyA9ICpoZWFkOwotCXUzMiBzZXFfbm8gPSBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKKwl1MzIgc2VxX25vID0gYnVmX3NlcW5vKGJ1Zik7CiAKIAlidWYtPm5leHQgPSBOVUxMOwogCkBAIC0xODc0LDcgKzE4NzUsNyBAQAogCX0KIAogCS8qIExhc3QgPyAqLwotCWlmIChsZXNzKG1zZ19zZXFubyhidWZfbXNnKCp0YWlsKSksIHNlcV9ubykpIHsKKwlpZiAobGVzcyhidWZfc2Vxbm8oKnRhaWwpLCBzZXFfbm8pKSB7CiAJCSgqdGFpbCktPm5leHQgPSBidWY7CiAJCSp0YWlsID0gYnVmOwogCQlyZXR1cm4gMTsKQEAgLTE5MDgsMTAgKzE5MDksMTAgQEAKICAqIGxpbmtfaGFuZGxlX291dF9vZl9zZXFfbXNnIC0gaGFuZGxlIGFycml2YWwgb2Ygb3V0LW9mLXNlcXVlbmNlIHBhY2tldAogICovCiAKLXN0YXRpYyB2b2lkIGxpbmtfaGFuZGxlX291dF9vZl9zZXFfbXNnKHN0cnVjdCBsaW5rICpsX3B0ciwKK3N0YXRpYyB2b2lkIGxpbmtfaGFuZGxlX291dF9vZl9zZXFfbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLAogCQkJCSAgICAgICBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQogewotCXUzMiBzZXFfbm8gPSBtc2dfc2Vxbm8oYnVmX21zZyhidWYpKTsKKwl1MzIgc2VxX25vID0gYnVmX3NlcW5vKGJ1Zik7CiAKIAlpZiAobGlrZWx5KG1zZ191c2VyKGJ1Zl9tc2coYnVmKSkgPT0gTElOS19QUk9UT0NPTCkpIHsKIAkJbGlua19yZWN2X3Byb3RvX21zZyhsX3B0ciwgYnVmKTsKQEAgLTE5NDYsOCArMTk0Nyw5IEBACiAvKgogICogU2VuZCBwcm90b2NvbCBtZXNzYWdlIHRvIHRoZSBvdGhlciBlbmRwb2ludC4KICAqLwotdm9pZCB0aXBjX2xpbmtfc2VuZF9wcm90b19tc2coc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgbXNnX3R5cCwgaW50IHByb2JlX21zZywKLQkJCSAgICAgIHUzMiBnYXAsIHUzMiB0b2xlcmFuY2UsIHUzMiBwcmlvcml0eSwgdTMyIGFja19tdHUpCit2b2lkIHRpcGNfbGlua19zZW5kX3Byb3RvX21zZyhzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgdTMyIG1zZ190eXAsCisJCQkJaW50IHByb2JlX21zZywgdTMyIGdhcCwgdTMyIHRvbGVyYW5jZSwKKwkJCQl1MzIgcHJpb3JpdHksIHUzMiBhY2tfbXR1KQogewogCXN0cnVjdCBza19idWZmICpidWYgPSBOVUxMOwogCXN0cnVjdCB0aXBjX21zZyAqbXNnID0gbF9wdHItPnBtc2c7CkBAIC0xOTczLDEwICsxOTc1LDEwIEBACiAJCWlmICghdGlwY19saW5rX2lzX3VwKGxfcHRyKSkKIAkJCXJldHVybjsKIAkJaWYgKGxfcHRyLT5uZXh0X291dCkKLQkJCW5leHRfc2VudCA9IG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5uZXh0X291dCkpOworCQkJbmV4dF9zZW50ID0gYnVmX3NlcW5vKGxfcHRyLT5uZXh0X291dCk7CiAJCW1zZ19zZXRfbmV4dF9zZW50KG1zZywgbmV4dF9zZW50KTsKIAkJaWYgKGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4pIHsKLQkJCXUzMiByZWMgPSBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSk7CisJCQl1MzIgcmVjID0gYnVmX3NlcW5vKGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4pOwogCQkJZ2FwID0gbW9kKHJlYyAtIG1vZChsX3B0ci0+bmV4dF9pbl9ubykpOwogCQl9CiAJCW1zZ19zZXRfc2VxX2dhcChtc2csIGdhcCk7CkBAIC0yMDY0LDcgKzIwNjYsNyBAQAogICogY2hhbmdlIGF0IGFueSB0aW1lLiBUaGUgbm9kZSB3aXRoIGxvd2VzdCBhZGRyZXNzIHJ1bGVzCiAgKi8KIAotc3RhdGljIHZvaWQgbGlua19yZWN2X3Byb3RvX21zZyhzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYpCitzdGF0aWMgdm9pZCBsaW5rX3JlY3ZfcHJvdG9fbXNnKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqYnVmKQogewogCXUzMiByZWNfZ2FwID0gMDsKIAl1MzIgbWF4X3BrdF9pbmZvOwpAQCAtMjE5NywxMiArMjE5OSwxMiBAQAogICogdGlwY19saW5rX3R1bm5lbCgpOiBTZW5kIG9uZSBtZXNzYWdlIHZpYSBhIGxpbmsgYmVsb25naW5nIHRvCiAgKiBhbm90aGVyIGJlYXJlci4gT3duZXIgbm9kZSBpcyBsb2NrZWQuCiAgKi8KLXN0YXRpYyB2b2lkIHRpcGNfbGlua190dW5uZWwoc3RydWN0IGxpbmsgKmxfcHRyLAorc3RhdGljIHZvaWQgdGlwY19saW5rX3R1bm5lbChzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwKIAkJCSAgICAgc3RydWN0IHRpcGNfbXNnICp0dW5uZWxfaGRyLAogCQkJICAgICBzdHJ1Y3QgdGlwY19tc2cgICptc2csCiAJCQkgICAgIHUzMiBzZWxlY3RvcikKIHsKLQlzdHJ1Y3QgbGluayAqdHVubmVsOworCXN0cnVjdCB0aXBjX2xpbmsgKnR1bm5lbDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmOwogCXUzMiBsZW5ndGggPSBtc2dfc2l6ZShtc2cpOwogCkBAIC0yMjMxLDExICsyMjMzLDExIEBACiAgKiAgICAgICAgICAgICAgIE93bmVyIG5vZGUgaXMgbG9ja2VkLgogICovCiAKLXZvaWQgdGlwY19saW5rX2NoYW5nZW92ZXIoc3RydWN0IGxpbmsgKmxfcHRyKQordm9pZCB0aXBjX2xpbmtfY2hhbmdlb3ZlcihzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKIAl1MzIgbXNnY291bnQgPSBsX3B0ci0+b3V0X3F1ZXVlX3NpemU7CiAJc3RydWN0IHNrX2J1ZmYgKmNycyA9IGxfcHRyLT5maXJzdF9vdXQ7Ci0Jc3RydWN0IGxpbmsgKnR1bm5lbCA9IGxfcHRyLT5vd25lci0+YWN0aXZlX2xpbmtzWzBdOworCXN0cnVjdCB0aXBjX2xpbmsgKnR1bm5lbCA9IGxfcHRyLT5vd25lci0+YWN0aXZlX2xpbmtzWzBdOwogCXN0cnVjdCB0aXBjX21zZyB0dW5uZWxfaGRyOwogCWludCBzcGxpdF9idW5kbGVzOwogCkBAIC0yMjk0LDcgKzIyOTYsNyBAQAogCX0KIH0KIAotdm9pZCB0aXBjX2xpbmtfc2VuZF9kdXBsaWNhdGUoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3QgbGluayAqdHVubmVsKQordm9pZCB0aXBjX2xpbmtfc2VuZF9kdXBsaWNhdGUoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIHN0cnVjdCB0aXBjX2xpbmsgKnR1bm5lbCkKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqaXRlcjsKIAlzdHJ1Y3QgdGlwY19tc2cgdHVubmVsX2hkcjsKQEAgLTIzNTgsMTEgKzIzNjAsMTEgQEAKICAqICB2aWEgb3RoZXIgbGluay4gTm9kZSBpcyBsb2NrZWQuIFJldHVybiBleHRyYWN0ZWQgYnVmZmVyLgogICovCiAKLXN0YXRpYyBpbnQgbGlua19yZWN2X2NoYW5nZW92ZXJfbXNnKHN0cnVjdCBsaW5rICoqbF9wdHIsCitzdGF0aWMgaW50IGxpbmtfcmVjdl9jaGFuZ2VvdmVyX21zZyhzdHJ1Y3QgdGlwY19saW5rICoqbF9wdHIsCiAJCQkJICAgIHN0cnVjdCBza19idWZmICoqYnVmKQogewogCXN0cnVjdCBza19idWZmICp0dW5uZWxfYnVmID0gKmJ1ZjsKLQlzdHJ1Y3QgbGluayAqZGVzdF9saW5rOworCXN0cnVjdCB0aXBjX2xpbmsgKmRlc3RfbGluazsKIAlzdHJ1Y3QgdGlwY19tc2cgKm1zZzsKIAlzdHJ1Y3QgdGlwY19tc2cgKnR1bm5lbF9tc2cgPSBidWZfbXNnKHR1bm5lbF9idWYpOwogCXUzMiBtc2dfdHlwID0gbXNnX3R5cGUodHVubmVsX21zZyk7CkBAIC0yNDYyLDcgKzI0NjQsNyBAQAogICogVGhlIGJ1ZmZlciBpcyBjb21wbGV0ZSwgaW5jbHVzaXZlIHRvdGFsIG1lc3NhZ2UgbGVuZ3RoLgogICogUmV0dXJucyB1c2VyIGRhdGEgbGVuZ3RoLgogICovCi1zdGF0aWMgaW50IGxpbmtfc2VuZF9sb25nX2J1ZihzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYpCitzdGF0aWMgaW50IGxpbmtfc2VuZF9sb25nX2J1ZihzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1ZikKIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmX2NoYWluID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqYnVmX2NoYWluX3RhaWwgPSAoc3RydWN0IHNrX2J1ZmYgKikmYnVmX2NoYWluOwpAQCAtMjU5MSw3ICsyNTkzLDcgQEAKIAogCS8qIElzIHRoZXJlIGFuIGluY29tcGxldGUgbWVzc2FnZSB3YWl0aW5nIGZvciB0aGlzIGZyYWdtZW50PyAqLwogCi0Jd2hpbGUgKHBidWYgJiYgKChtc2dfc2Vxbm8oYnVmX21zZyhwYnVmKSkgIT0gbG9uZ19tc2dfc2VxX25vKSB8fAorCXdoaWxlIChwYnVmICYmICgoYnVmX3NlcW5vKHBidWYpICE9IGxvbmdfbXNnX3NlcV9ubykgfHwKIAkJCShtc2dfb3JpZ25vZGUoZnJhZ20pICE9IG1zZ19vcmlnbm9kZShidWZfbXNnKHBidWYpKSkpKSB7CiAJCXByZXYgPSBwYnVmOwogCQlwYnVmID0gcGJ1Zi0+bmV4dDsKQEAgLTI2NTgsNyArMjY2MCw3IEBACiAgKiBAbF9wdHI6IHBvaW50ZXIgdG8gbGluawogICovCiAKLXN0YXRpYyB2b2lkIGxpbmtfY2hlY2tfZGVmcmFnbV9idWZzKHN0cnVjdCBsaW5rICpsX3B0cikKK3N0YXRpYyB2b2lkIGxpbmtfY2hlY2tfZGVmcmFnbV9idWZzKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCXN0cnVjdCBza19idWZmICpwcmV2ID0gTlVMTDsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbmV4dCA9IE5VTEw7CkBAIC0yNjg4LDcgKzI2OTAsNyBAQAogCiAKIAotc3RhdGljIHZvaWQgbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgdG9sZXJhbmNlKQorc3RhdGljIHZvaWQgbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIHUzMiB0b2xlcmFuY2UpCiB7CiAJaWYgKCh0b2xlcmFuY2UgPCBUSVBDX01JTl9MSU5LX1RPTCkgfHwgKHRvbGVyYW5jZSA+IFRJUENfTUFYX0xJTktfVE9MKSkKIAkJcmV0dXJuOwpAQCAtMjcwMCw3ICsyNzAyLDcgQEAKIH0KIAogCi12b2lkIHRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKHN0cnVjdCBsaW5rICpsX3B0ciwgdTMyIHdpbmRvdykKK3ZvaWQgdGlwY19saW5rX3NldF9xdWV1ZV9saW1pdHMoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIHUzMiB3aW5kb3cpCiB7CiAJLyogRGF0YSBtZXNzYWdlcyBmcm9tIHRoaXMgbm9kZSwgaW5jbHVzaXZlIEZJUlNUX0ZSQUdNICovCiAJbF9wdHItPnF1ZXVlX2xpbWl0W1RJUENfTE9XX0lNUE9SVEFOQ0VdID0gd2luZG93OwpAQCAtMjczMCwxMSArMjczMiwxMiBAQAogICogUmV0dXJucyBwb2ludGVyIHRvIGxpbmsgKG9yIDAgaWYgaW52YWxpZCBsaW5rIG5hbWUpLgogICovCiAKLXN0YXRpYyBzdHJ1Y3QgbGluayAqbGlua19maW5kX2xpbmsoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHRpcGNfbm9kZSAqKm5vZGUpCitzdGF0aWMgc3RydWN0IHRpcGNfbGluayAqbGlua19maW5kX2xpbmsoY29uc3QgY2hhciAqbmFtZSwKKwkJCQkJc3RydWN0IHRpcGNfbm9kZSAqKm5vZGUpCiB7Ci0Jc3RydWN0IGxpbmtfbmFtZSBsaW5rX25hbWVfcGFydHM7CisJc3RydWN0IHRpcGNfbGlua19uYW1lIGxpbmtfbmFtZV9wYXJ0czsKIAlzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyOwotCXN0cnVjdCBsaW5rICpsX3B0cjsKKwlzdHJ1Y3QgdGlwY19saW5rICpsX3B0cjsKIAogCWlmICghbGlua19uYW1lX3ZhbGlkYXRlKG5hbWUsICZsaW5rX25hbWVfcGFydHMpKQogCQlyZXR1cm4gTlVMTDsKQEAgLTI3NTQsMTMgKzI3NTcsMTEzIEBACiAJcmV0dXJuIGxfcHRyOwogfQogCisvKioKKyAqIGxpbmtfdmFsdWVfaXNfdmFsaWQgLS0gdmFsaWRhdGUgcHJvcG9zZWQgbGluayB0b2xlcmFuY2UvcHJpb3JpdHkvd2luZG93CisgKgorICogQGNtZCAtIHZhbHVlIHR5cGUgKFRJUENfQ01EX1NFVF9MSU5LXyopCisgKiBAbmV3X3ZhbHVlIC0gdGhlIG5ldyB2YWx1ZQorICoKKyAqIFJldHVybnMgMSBpZiB2YWx1ZSBpcyB3aXRoaW4gcmFuZ2UsIDAgaWYgbm90LgorICovCisKK3N0YXRpYyBpbnQgbGlua192YWx1ZV9pc192YWxpZCh1MTYgY21kLCB1MzIgbmV3X3ZhbHVlKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19UT0w6CisJCXJldHVybiAobmV3X3ZhbHVlID49IFRJUENfTUlOX0xJTktfVE9MKSAmJgorCQkJKG5ld192YWx1ZSA8PSBUSVBDX01BWF9MSU5LX1RPTCk7CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19QUkk6CisJCXJldHVybiAobmV3X3ZhbHVlIDw9IFRJUENfTUFYX0xJTktfUFJJKTsKKwljYXNlIFRJUENfQ01EX1NFVF9MSU5LX1dJTkRPVzoKKwkJcmV0dXJuIChuZXdfdmFsdWUgPj0gVElQQ19NSU5fTElOS19XSU4pICYmCisJCQkobmV3X3ZhbHVlIDw9IFRJUENfTUFYX0xJTktfV0lOKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBsaW5rX2NtZF9zZXRfdmFsdWUgLSBjaGFuZ2UgcHJpb3JpdHkvdG9sZXJhbmNlL3dpbmRvdyBmb3IgbGluay9iZWFyZXIvbWVkaWEKKyAqIEBuYW1lIC0gcHRyIHRvIGxpbmssIGJlYXJlciwgb3IgbWVkaWEgbmFtZQorICogQG5ld192YWx1ZSAtIG5ldyB2YWx1ZSBvZiBsaW5rLCBiZWFyZXIsIG9yIG1lZGlhIHNldHRpbmcKKyAqIEBjbWQgLSB3aGljaCBsaW5rLCBiZWFyZXIsIG9yIG1lZGlhIGF0dHJpYnV0ZSB0byBzZXQgKFRJUENfQ01EX1NFVF9MSU5LXyopCisgKgorICogQ2FsbGVyIG11c3QgaG9sZCAndGlwY19uZXRfbG9jaycgdG8gZW5zdXJlIGxpbmsvYmVhcmVyL21lZGlhIGlzIG5vdCBkZWxldGVkLgorICoKKyAqIFJldHVybnMgMCBpZiB2YWx1ZSB1cGRhdGVkIGFuZCBuZWdhdGl2ZSB2YWx1ZSBvbiBlcnJvci4KKyAqLworCitzdGF0aWMgaW50IGxpbmtfY21kX3NldF92YWx1ZShjb25zdCBjaGFyICpuYW1lLCB1MzIgbmV3X3ZhbHVlLCB1MTYgY21kKQoreworCXN0cnVjdCB0aXBjX25vZGUgKm5vZGU7CisJc3RydWN0IHRpcGNfbGluayAqbF9wdHI7CisJc3RydWN0IHRpcGNfYmVhcmVyICpiX3B0cjsKKwlzdHJ1Y3QgdGlwY19tZWRpYSAqbV9wdHI7CisKKwlsX3B0ciA9IGxpbmtfZmluZF9saW5rKG5hbWUsICZub2RlKTsKKwlpZiAobF9wdHIpIHsKKwkJLyoKKwkJICogYWNxdWlyZSBub2RlIGxvY2sgZm9yIHRpcGNfbGlua19zZW5kX3Byb3RvX21zZygpLgorCQkgKiBzZWUgIlRJUEMgbG9ja2luZyBwb2xpY3kiIGluIG5ldC5jLgorCQkgKi8KKwkJdGlwY19ub2RlX2xvY2sobm9kZSk7CisJCXN3aXRjaCAoY21kKSB7CisJCWNhc2UgVElQQ19DTURfU0VUX0xJTktfVE9MOgorCQkJbGlua19zZXRfc3VwZXJ2aXNpb25fcHJvcHMobF9wdHIsIG5ld192YWx1ZSk7CisJCQl0aXBjX2xpbmtfc2VuZF9wcm90b19tc2cobF9wdHIsCisJCQkJU1RBVEVfTVNHLCAwLCAwLCBuZXdfdmFsdWUsIDAsIDApOworCQkJYnJlYWs7CisJCWNhc2UgVElQQ19DTURfU0VUX0xJTktfUFJJOgorCQkJbF9wdHItPnByaW9yaXR5ID0gbmV3X3ZhbHVlOworCQkJdGlwY19saW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLAorCQkJCVNUQVRFX01TRywgMCwgMCwgMCwgbmV3X3ZhbHVlLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIFRJUENfQ01EX1NFVF9MSU5LX1dJTkRPVzoKKwkJCXRpcGNfbGlua19zZXRfcXVldWVfbGltaXRzKGxfcHRyLCBuZXdfdmFsdWUpOworCQkJYnJlYWs7CisJCX0KKwkJdGlwY19ub2RlX3VubG9jayhub2RlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYl9wdHIgPSB0aXBjX2JlYXJlcl9maW5kKG5hbWUpOworCWlmIChiX3B0cikgeworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFRJUENfQ01EX1NFVF9MSU5LX1RPTDoKKwkJCWJfcHRyLT50b2xlcmFuY2UgPSBuZXdfdmFsdWU7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19QUkk6CisJCQliX3B0ci0+cHJpb3JpdHkgPSBuZXdfdmFsdWU7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19XSU5ET1c6CisJCQliX3B0ci0+d2luZG93ID0gbmV3X3ZhbHVlOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbV9wdHIgPSB0aXBjX21lZGlhX2ZpbmQobmFtZSk7CisJaWYgKCFtX3B0cikKKwkJcmV0dXJuIC1FTk9ERVY7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRJUENfQ01EX1NFVF9MSU5LX1RPTDoKKwkJbV9wdHItPnRvbGVyYW5jZSA9IG5ld192YWx1ZTsKKwkJcmV0dXJuIDA7CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19QUkk6CisJCW1fcHRyLT5wcmlvcml0eSA9IG5ld192YWx1ZTsKKwkJcmV0dXJuIDA7CisJY2FzZSBUSVBDX0NNRF9TRVRfTElOS19XSU5ET1c6CisJCW1fcHRyLT53aW5kb3cgPSBuZXdfdmFsdWU7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKwogc3RydWN0IHNrX2J1ZmYgKnRpcGNfbGlua19jbWRfY29uZmlnKGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UsCiAJCQkJICAgICB1MTYgY21kKQogewogCXN0cnVjdCB0aXBjX2xpbmtfY29uZmlnICphcmdzOwogCXUzMiBuZXdfdmFsdWU7Ci0Jc3RydWN0IGxpbmsgKmxfcHRyOwotCXN0cnVjdCB0aXBjX25vZGUgKm5vZGU7CiAJaW50IHJlczsKIAogCWlmICghVExWX0NIRUNLKHJlcV90bHZfYXJlYSwgcmVxX3Rsdl9zcGFjZSwgVElQQ19UTFZfTElOS19DT05GSUcpKQpAQCAtMjc2OSw2ICsyODcyLDEwIEBACiAJYXJncyA9IChzdHJ1Y3QgdGlwY19saW5rX2NvbmZpZyAqKVRMVl9EQVRBKHJlcV90bHZfYXJlYSk7CiAJbmV3X3ZhbHVlID0gbnRvaGwoYXJncy0+dmFsdWUpOwogCisJaWYgKCFsaW5rX3ZhbHVlX2lzX3ZhbGlkKGNtZCwgbmV3X3ZhbHVlKSkKKwkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZygKKwkJCSJjYW5ub3QgY2hhbmdlLCB2YWx1ZSBpbnZhbGlkIik7CisKIAlpZiAoIXN0cmNtcChhcmdzLT5uYW1lLCB0aXBjX2JjbGlua19uYW1lKSkgewogCQlpZiAoKGNtZCA9PSBUSVBDX0NNRF9TRVRfTElOS19XSU5ET1cpICYmCiAJCSAgICAodGlwY19iY2xpbmtfc2V0X3F1ZXVlX2xpbWl0cyhuZXdfdmFsdWUpID09IDApKQpAQCAtMjc3OCw0MyArMjg4NSw3IEBACiAJfQogCiAJcmVhZF9sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKLQlsX3B0ciA9IGxpbmtfZmluZF9saW5rKGFyZ3MtPm5hbWUsICZub2RlKTsKLQlpZiAoIWxfcHRyKSB7Ci0JCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKLQkJcmV0dXJuIHRpcGNfY2ZnX3JlcGx5X2Vycm9yX3N0cmluZygibGluayBub3QgZm91bmQiKTsKLQl9Ci0KLQl0aXBjX25vZGVfbG9jayhub2RlKTsKLQlyZXMgPSAtRUlOVkFMOwotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSBUSVBDX0NNRF9TRVRfTElOS19UT0w6Ci0JCWlmICgobmV3X3ZhbHVlID49IFRJUENfTUlOX0xJTktfVE9MKSAmJgotCQkgICAgKG5ld192YWx1ZSA8PSBUSVBDX01BWF9MSU5LX1RPTCkpIHsKLQkJCWxpbmtfc2V0X3N1cGVydmlzaW9uX3Byb3BzKGxfcHRyLCBuZXdfdmFsdWUpOwotCQkJdGlwY19saW5rX3NlbmRfcHJvdG9fbXNnKGxfcHRyLCBTVEFURV9NU0csCi0JCQkJCQkgMCwgMCwgbmV3X3ZhbHVlLCAwLCAwKTsKLQkJCXJlcyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JY2FzZSBUSVBDX0NNRF9TRVRfTElOS19QUkk6Ci0JCWlmICgobmV3X3ZhbHVlID49IFRJUENfTUlOX0xJTktfUFJJKSAmJgotCQkgICAgKG5ld192YWx1ZSA8PSBUSVBDX01BWF9MSU5LX1BSSSkpIHsKLQkJCWxfcHRyLT5wcmlvcml0eSA9IG5ld192YWx1ZTsKLQkJCXRpcGNfbGlua19zZW5kX3Byb3RvX21zZyhsX3B0ciwgU1RBVEVfTVNHLAotCQkJCQkJIDAsIDAsIDAsIG5ld192YWx1ZSwgMCk7Ci0JCQlyZXMgPSAwOwotCQl9Ci0JCWJyZWFrOwotCWNhc2UgVElQQ19DTURfU0VUX0xJTktfV0lORE9XOgotCQlpZiAoKG5ld192YWx1ZSA+PSBUSVBDX01JTl9MSU5LX1dJTikgJiYKLQkJICAgIChuZXdfdmFsdWUgPD0gVElQQ19NQVhfTElOS19XSU4pKSB7Ci0JCQl0aXBjX2xpbmtfc2V0X3F1ZXVlX2xpbWl0cyhsX3B0ciwgbmV3X3ZhbHVlKTsKLQkJCXJlcyA9IDA7Ci0JCX0KLQkJYnJlYWs7Ci0JfQotCXRpcGNfbm9kZV91bmxvY2sobm9kZSk7Ci0KKwlyZXMgPSBsaW5rX2NtZF9zZXRfdmFsdWUoYXJncy0+bmFtZSwgbmV3X3ZhbHVlLCBjbWQpOwogCXJlYWRfdW5sb2NrX2JoKCZ0aXBjX25ldF9sb2NrKTsKIAlpZiAocmVzKQogCQlyZXR1cm4gdGlwY19jZmdfcmVwbHlfZXJyb3Jfc3RyaW5nKCJjYW5ub3QgY2hhbmdlIGxpbmsgc2V0dGluZyIpOwpAQCAtMjgyNyw3ICsyODk4LDcgQEAKICAqIEBsX3B0cjogcG9pbnRlciB0byBsaW5rCiAgKi8KIAotc3RhdGljIHZvaWQgbGlua19yZXNldF9zdGF0aXN0aWNzKHN0cnVjdCBsaW5rICpsX3B0cikKK3N0YXRpYyB2b2lkIGxpbmtfcmVzZXRfc3RhdGlzdGljcyhzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKIAltZW1zZXQoJmxfcHRyLT5zdGF0cywgMCwgc2l6ZW9mKGxfcHRyLT5zdGF0cykpOwogCWxfcHRyLT5zdGF0cy5zZW50X2luZm8gPSBsX3B0ci0+bmV4dF9vdXRfbm87CkBAIC0yODM3LDcgKzI5MDgsNyBAQAogc3RydWN0IHNrX2J1ZmYgKnRpcGNfbGlua19jbWRfcmVzZXRfc3RhdHMoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSkKIHsKIAljaGFyICpsaW5rX25hbWU7Ci0Jc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyOwogCXN0cnVjdCB0aXBjX25vZGUgKm5vZGU7CiAKIAlpZiAoIVRMVl9DSEVDSyhyZXFfdGx2X2FyZWEsIHJlcV90bHZfc3BhY2UsIFRJUENfVExWX0xJTktfTkFNRSkpCkBAIC0yODg1LDcgKzI5NTYsNyBAQAogc3RhdGljIGludCB0aXBjX2xpbmtfc3RhdHMoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmLCBjb25zdCB1MzIgYnVmX3NpemUpCiB7CiAJc3RydWN0IHByaW50X2J1ZiBwYjsKLQlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IHRpcGNfbGluayAqbF9wdHI7CiAJc3RydWN0IHRpcGNfbm9kZSAqbm9kZTsKIAljaGFyICpzdGF0dXM7CiAJdTMyIHByb2ZpbGVfdG90YWwgPSAwOwpAQCAtMzAwNyw3ICszMDc4LDcgQEAKIHUzMiB0aXBjX2xpbmtfZ2V0X21heF9wa3QodTMyIGRlc3QsIHUzMiBzZWxlY3RvcikKIHsKIAlzdHJ1Y3QgdGlwY19ub2RlICpuX3B0cjsKLQlzdHJ1Y3QgbGluayAqbF9wdHI7CisJc3RydWN0IHRpcGNfbGluayAqbF9wdHI7CiAJdTMyIHJlcyA9IE1BWF9QS1RfREVGQVVMVDsKIAogCWlmIChkZXN0ID09IHRpcGNfb3duX2FkZHIpCkBAIC0zMDI2LDcgKzMwOTcsNyBAQAogCXJldHVybiByZXM7CiB9CiAKLXN0YXRpYyB2b2lkIGxpbmtfcHJpbnQoc3RydWN0IGxpbmsgKmxfcHRyLCBjb25zdCBjaGFyICpzdHIpCitzdGF0aWMgdm9pZCBsaW5rX3ByaW50KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLCBjb25zdCBjaGFyICpzdHIpCiB7CiAJY2hhciBwcmludF9hcmVhWzI1Nl07CiAJc3RydWN0IHByaW50X2J1ZiBwYjsKQEAgLTMwNDYsMTMgKzMxMTcsMTIgQEAKIAl0aXBjX3ByaW50ZihidWYsICJOWEkoJXUpOiIsIG1vZChsX3B0ci0+bmV4dF9pbl9ubykpOwogCXRpcGNfcHJpbnRmKGJ1ZiwgIlNRVUUiKTsKIAlpZiAobF9wdHItPmZpcnN0X291dCkgewotCQl0aXBjX3ByaW50ZihidWYsICJbJXUuLiIsIG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5maXJzdF9vdXQpKSk7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIlsldS4uIiwgYnVmX3NlcW5vKGxfcHRyLT5maXJzdF9vdXQpKTsKIAkJaWYgKGxfcHRyLT5uZXh0X291dCkKLQkJCXRpcGNfcHJpbnRmKGJ1ZiwgIiV1Li4iLAotCQkJCSAgICBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+bmV4dF9vdXQpKSk7Ci0JCXRpcGNfcHJpbnRmKGJ1ZiwgIiV1XSIsIG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5sYXN0X291dCkpKTsKLQkJaWYgKChtb2QobXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPmxhc3Rfb3V0KSkgLQotCQkJIG1zZ19zZXFubyhidWZfbXNnKGxfcHRyLT5maXJzdF9vdXQpKSkKKwkJCXRpcGNfcHJpbnRmKGJ1ZiwgIiV1Li4iLCBidWZfc2Vxbm8obF9wdHItPm5leHRfb3V0KSk7CisJCXRpcGNfcHJpbnRmKGJ1ZiwgIiV1XSIsIGJ1Zl9zZXFubyhsX3B0ci0+bGFzdF9vdXQpKTsKKwkJaWYgKChtb2QoYnVmX3NlcW5vKGxfcHRyLT5sYXN0X291dCkgLQorCQkJIGJ1Zl9zZXFubyhsX3B0ci0+Zmlyc3Rfb3V0KSkKIAkJICAgICAhPSAobF9wdHItPm91dF9xdWV1ZV9zaXplIC0gMSkpIHx8CiAJCSAgICAobF9wdHItPmxhc3Rfb3V0LT5uZXh0ICE9IE5VTEwpKSB7CiAJCQl0aXBjX3ByaW50ZihidWYsICJcblNlbmQgcXVldWUgaW5jb25zaXN0ZW5jeVxuIik7CkBAIC0zMDY0LDggKzMxMzQsOCBAQAogCQl0aXBjX3ByaW50ZihidWYsICJbXSIpOwogCXRpcGNfcHJpbnRmKGJ1ZiwgIlNRU0laKCV1KSIsIGxfcHRyLT5vdXRfcXVldWVfc2l6ZSk7CiAJaWYgKGxfcHRyLT5vbGRlc3RfZGVmZXJyZWRfaW4pIHsKLQkJdTMyIG8gPSBtc2dfc2Vxbm8oYnVmX21zZyhsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKSk7Ci0JCXUzMiBuID0gbXNnX3NlcW5vKGJ1Zl9tc2cobF9wdHItPm5ld2VzdF9kZWZlcnJlZF9pbikpOworCQl1MzIgbyA9IGJ1Zl9zZXFubyhsX3B0ci0+b2xkZXN0X2RlZmVycmVkX2luKTsKKwkJdTMyIG4gPSBidWZfc2Vxbm8obF9wdHItPm5ld2VzdF9kZWZlcnJlZF9pbik7CiAJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpSUVVFWyV1Li4ldV0iLCBvLCBuKTsKIAkJaWYgKGxfcHRyLT5kZWZlcnJlZF9pbnF1ZXVlX3N6ICE9IG1vZCgobiArIDEpIC0gbykpIHsKIAkJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpSUVNJWigldSkiLApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbGluay5oIGIvbmV0L3RpcGMvbGluay5oCmluZGV4IGU1NmNiNTMuLjczYzE4YzEgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL2xpbmsuaAorKysgYi9uZXQvdGlwYy9saW5rLmgKQEAgLTQ1LDYgKzQ1LDEyIEBACiAjZGVmaW5lIFBVU0hfRklOSVNIRUQgMgogCiAvKgorICogT3V0LW9mLXJhbmdlIHZhbHVlIGZvciBsaW5rIHNlcXVlbmNlIG51bWJlcnMKKyAqLworCisjZGVmaW5lIElOVkFMSURfTElOS19TRVEgMHgxMDAwMAorCisvKgogICogTGluayBzdGF0ZXMKICAqLwogCkBAIC02MSw3ICs2Nyw3IEBACiAjZGVmaW5lIE1BWF9QS1RfREVGQVVMVCAxNTAwCiAKIC8qKgotICogc3RydWN0IGxpbmsgLSBUSVBDIGxpbmsgZGF0YSBzdHJ1Y3R1cmUKKyAqIHN0cnVjdCB0aXBjX2xpbmsgLSBUSVBDIGxpbmsgZGF0YSBzdHJ1Y3R1cmUKICAqIEBhZGRyOiBuZXR3b3JrIGFkZHJlc3Mgb2YgbGluaydzIHBlZXIgbm9kZQogICogQG5hbWU6IGxpbmsgbmFtZSBjaGFyYWN0ZXIgc3RyaW5nCiAgKiBAbWVkaWFfYWRkcjogbWVkaWEgYWRkcmVzcyB0byB1c2Ugd2hlbiBzZW5kaW5nIG1lc3NhZ2VzIG92ZXIgbGluawpAQCAtMTA5LDcgKzExNSw3IEBACiAgKiBAc3RhdHM6IGNvbGxlY3RzIHN0YXRpc3RpY3MgcmVnYXJkaW5nIGxpbmsgYWN0aXZpdHkKICAqLwogCi1zdHJ1Y3QgbGluayB7CitzdHJ1Y3QgdGlwY19saW5rIHsKIAl1MzIgYWRkcjsKIAljaGFyIG5hbWVbVElQQ19NQVhfTElOS19OQU1FXTsKIAlzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyIG1lZGlhX2FkZHI7CkBAIC0yMDcsMjQgKzIxMywyNCBAQAogCiBzdHJ1Y3QgdGlwY19wb3J0OwogCi1zdHJ1Y3QgbGluayAqdGlwY19saW5rX2NyZWF0ZShzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwKK3N0cnVjdCB0aXBjX2xpbmsgKnRpcGNfbGlua19jcmVhdGUoc3RydWN0IHRpcGNfbm9kZSAqbl9wdHIsCiAJCQkgICAgICBzdHJ1Y3QgdGlwY19iZWFyZXIgKmJfcHRyLAogCQkJICAgICAgY29uc3Qgc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqbWVkaWFfYWRkcik7Ci12b2lkIHRpcGNfbGlua19kZWxldGUoc3RydWN0IGxpbmsgKmxfcHRyKTsKLXZvaWQgdGlwY19saW5rX2NoYW5nZW92ZXIoc3RydWN0IGxpbmsgKmxfcHRyKTsKLXZvaWQgdGlwY19saW5rX3NlbmRfZHVwbGljYXRlKHN0cnVjdCBsaW5rICpsX3B0ciwgc3RydWN0IGxpbmsgKmRlc3QpOwotdm9pZCB0aXBjX2xpbmtfcmVzZXRfZnJhZ21lbnRzKHN0cnVjdCBsaW5rICpsX3B0cik7Ci1pbnQgdGlwY19saW5rX2lzX3VwKHN0cnVjdCBsaW5rICpsX3B0cik7Ci1pbnQgdGlwY19saW5rX2lzX2FjdGl2ZShzdHJ1Y3QgbGluayAqbF9wdHIpOwotdTMyIHRpcGNfbGlua19wdXNoX3BhY2tldChzdHJ1Y3QgbGluayAqbF9wdHIpOwotdm9pZCB0aXBjX2xpbmtfc3RvcChzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCB0aXBjX2xpbmtfZGVsZXRlKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKTsKK3ZvaWQgdGlwY19saW5rX2NoYW5nZW92ZXIoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpOwordm9pZCB0aXBjX2xpbmtfc2VuZF9kdXBsaWNhdGUoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIHN0cnVjdCB0aXBjX2xpbmsgKmRlc3QpOwordm9pZCB0aXBjX2xpbmtfcmVzZXRfZnJhZ21lbnRzKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKTsKK2ludCB0aXBjX2xpbmtfaXNfdXAoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpOworaW50IHRpcGNfbGlua19pc19hY3RpdmUoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpOwordTMyIHRpcGNfbGlua19wdXNoX3BhY2tldChzdHJ1Y3QgdGlwY19saW5rICpsX3B0cik7Cit2b2lkIHRpcGNfbGlua19zdG9wKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKTsKIHN0cnVjdCBza19idWZmICp0aXBjX2xpbmtfY21kX2NvbmZpZyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlLCB1MTYgY21kKTsKIHN0cnVjdCBza19idWZmICp0aXBjX2xpbmtfY21kX3Nob3dfc3RhdHMoY29uc3Qgdm9pZCAqcmVxX3Rsdl9hcmVhLCBpbnQgcmVxX3Rsdl9zcGFjZSk7CiBzdHJ1Y3Qgc2tfYnVmZiAqdGlwY19saW5rX2NtZF9yZXNldF9zdGF0cyhjb25zdCB2b2lkICpyZXFfdGx2X2FyZWEsIGludCByZXFfdGx2X3NwYWNlKTsKLXZvaWQgdGlwY19saW5rX3Jlc2V0KHN0cnVjdCBsaW5rICpsX3B0cik7Cit2b2lkIHRpcGNfbGlua19yZXNldChzdHJ1Y3QgdGlwY19saW5rICpsX3B0cik7CiBpbnQgdGlwY19saW5rX3NlbmQoc3RydWN0IHNrX2J1ZmYgKmJ1ZiwgdTMyIGRlc3QsIHUzMiBzZWxlY3Rvcik7CiB2b2lkIHRpcGNfbGlua19zZW5kX25hbWVzKHN0cnVjdCBsaXN0X2hlYWQgKm1lc3NhZ2VfbGlzdCwgdTMyIGRlc3QpOwotaW50IHRpcGNfbGlua19zZW5kX2J1ZihzdHJ1Y3QgbGluayAqbF9wdHIsIHN0cnVjdCBza19idWZmICpidWYpOworaW50IHRpcGNfbGlua19zZW5kX2J1ZihzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7CiB1MzIgdGlwY19saW5rX2dldF9tYXhfcGt0KHUzMiBkZXN0LCB1MzIgc2VsZWN0b3IpOwogaW50IHRpcGNfbGlua19zZW5kX3NlY3Rpb25zX2Zhc3Qoc3RydWN0IHRpcGNfcG9ydCAqc2VuZGVyLAogCQkJCSBzdHJ1Y3QgaW92ZWMgY29uc3QgKm1zZ19zZWN0LApAQCAtMjM1LDE5ICsyNDEsMjYgQEAKIGludCAgdGlwY19saW5rX3JlY3ZfZnJhZ21lbnQoc3RydWN0IHNrX2J1ZmYgKipwZW5kaW5nLAogCQkJICAgICBzdHJ1Y3Qgc2tfYnVmZiAqKmZiLAogCQkJICAgICBzdHJ1Y3QgdGlwY19tc2cgKiptc2cpOwotdm9pZCB0aXBjX2xpbmtfc2VuZF9wcm90b19tc2coc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgbXNnX3R5cCwgaW50IHByb2IsIHUzMiBnYXAsCi0JCQkgICAgICB1MzIgdG9sZXJhbmNlLCB1MzIgcHJpb3JpdHksIHUzMiBhY2tlZF9tdHUpOwotdm9pZCB0aXBjX2xpbmtfcHVzaF9xdWV1ZShzdHJ1Y3QgbGluayAqbF9wdHIpOwordm9pZCB0aXBjX2xpbmtfc2VuZF9wcm90b19tc2coc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIHUzMiBtc2dfdHlwLCBpbnQgcHJvYiwKKwkJCSAgICAgIHUzMiBnYXAsIHUzMiB0b2xlcmFuY2UsIHUzMiBwcmlvcml0eSwKKwkJCSAgICAgIHUzMiBhY2tlZF9tdHUpOwordm9pZCB0aXBjX2xpbmtfcHVzaF9xdWV1ZShzdHJ1Y3QgdGlwY19saW5rICpsX3B0cik7CiB1MzIgdGlwY19saW5rX2RlZmVyX3BrdChzdHJ1Y3Qgc2tfYnVmZiAqKmhlYWQsIHN0cnVjdCBza19idWZmICoqdGFpbCwKIAkJICAgc3RydWN0IHNrX2J1ZmYgKmJ1Zik7Ci12b2lkIHRpcGNfbGlua193YWtldXBfcG9ydHMoc3RydWN0IGxpbmsgKmxfcHRyLCBpbnQgYWxsKTsKLXZvaWQgdGlwY19saW5rX3NldF9xdWV1ZV9saW1pdHMoc3RydWN0IGxpbmsgKmxfcHRyLCB1MzIgd2luZG93KTsKLXZvaWQgdGlwY19saW5rX3JldHJhbnNtaXQoc3RydWN0IGxpbmsgKmxfcHRyLCBzdHJ1Y3Qgc2tfYnVmZiAqc3RhcnQsIHUzMiByZXRyYW5zbWl0cyk7Cit2b2lkIHRpcGNfbGlua193YWtldXBfcG9ydHMoc3RydWN0IHRpcGNfbGluayAqbF9wdHIsIGludCBhbGwpOwordm9pZCB0aXBjX2xpbmtfc2V0X3F1ZXVlX2xpbWl0cyhzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciwgdTMyIHdpbmRvdyk7Cit2b2lkIHRpcGNfbGlua19yZXRyYW5zbWl0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyLAorCQkJICBzdHJ1Y3Qgc2tfYnVmZiAqc3RhcnQsIHUzMiByZXRyYW5zbWl0cyk7CiAKIC8qCiAgKiBMaW5rIHNlcXVlbmNlIG51bWJlciBtYW5pcHVsYXRpb24gcm91dGluZXMgKHVzZXMgbW9kdWxvIDIqKjE2IGFyaXRobWV0aWMpCiAgKi8KIAorc3RhdGljIGlubGluZSB1MzIgYnVmX3NlcW5vKHN0cnVjdCBza19idWZmICpidWYpCit7CisJcmV0dXJuIG1zZ19zZXFubyhidWZfbXNnKGJ1ZikpOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiBtb2QodTMyIHgpCiB7CiAJcmV0dXJuIHggJiAweGZmZmZ1OwpAQCAtMjgyLDMyICsyOTUsMzIgQEAKICAqIExpbmsgc3RhdHVzIGNoZWNraW5nIHJvdXRpbmVzCiAgKi8KIAotc3RhdGljIGlubGluZSBpbnQgbGlua193b3JraW5nX3dvcmtpbmcoc3RydWN0IGxpbmsgKmxfcHRyKQorc3RhdGljIGlubGluZSBpbnQgbGlua193b3JraW5nX3dvcmtpbmcoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCiB7CiAJcmV0dXJuIGxfcHRyLT5zdGF0ZSA9PSBXT1JLSU5HX1dPUktJTkc7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGxpbmtfd29ya2luZ191bmtub3duKHN0cnVjdCBsaW5rICpsX3B0cikKK3N0YXRpYyBpbmxpbmUgaW50IGxpbmtfd29ya2luZ191bmtub3duKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCXJldHVybiBsX3B0ci0+c3RhdGUgPT0gV09SS0lOR19VTktOT1dOOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsaW5rX3Jlc2V0X3Vua25vd24oc3RydWN0IGxpbmsgKmxfcHRyKQorc3RhdGljIGlubGluZSBpbnQgbGlua19yZXNldF91bmtub3duKHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCXJldHVybiBsX3B0ci0+c3RhdGUgPT0gUkVTRVRfVU5LTk9XTjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgbGlua19yZXNldF9yZXNldChzdHJ1Y3QgbGluayAqbF9wdHIpCitzdGF0aWMgaW5saW5lIGludCBsaW5rX3Jlc2V0X3Jlc2V0KHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCXJldHVybiBsX3B0ci0+c3RhdGUgPT0gUkVTRVRfUkVTRVQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGxpbmtfYmxvY2tlZChzdHJ1Y3QgbGluayAqbF9wdHIpCitzdGF0aWMgaW5saW5lIGludCBsaW5rX2Jsb2NrZWQoc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCiB7CiAJcmV0dXJuIGxfcHRyLT5leHBfbXNnX2NvdW50IHx8IGxfcHRyLT5ibG9ja2VkOwogfQogCi1zdGF0aWMgaW5saW5lIGludCBsaW5rX2Nvbmdlc3RlZChzdHJ1Y3QgbGluayAqbF9wdHIpCitzdGF0aWMgaW5saW5lIGludCBsaW5rX2Nvbmdlc3RlZChzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKIAlyZXR1cm4gbF9wdHItPm91dF9xdWV1ZV9zaXplID49IGxfcHRyLT5xdWV1ZV9saW1pdFswXTsKIH0KZGlmZiAtLWdpdCBhL25ldC90aXBjL21zZy5jIGIvbmV0L3RpcGMvbXNnLmMKaW5kZXggODNkNTA5Ni4uM2U0ZDNlMiAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbXNnLmMKKysrIGIvbmV0L3RpcGMvbXNnLmMKQEAgLTMzMywxMSArMzMzLDE0IEBACiAJfQogCiAJaWYgKG1zZ191c2VyKG1zZykgPT0gIExJTktfQ09ORklHKSB7Ci0JCXUzMiAqcmF3ID0gKHUzMiAqKW1zZzsKLQkJc3RydWN0IHRpcGNfbWVkaWFfYWRkciAqb3JpZyA9IChzdHJ1Y3QgdGlwY19tZWRpYV9hZGRyICopJnJhd1s1XTsKKwkJc3RydWN0IHRpcGNfbWVkaWFfYWRkciBvcmlnOworCiAJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpERE9NKCV4KToiLCBtc2dfZGVzdF9kb21haW4obXNnKSk7CiAJCXRpcGNfcHJpbnRmKGJ1ZiwgIjpORVRJRCgldSk6IiwgbXNnX2JjX25ldGlkKG1zZykpOwotCQl0aXBjX21lZGlhX2FkZHJfcHJpbnRmKGJ1Ziwgb3JpZyk7CisJCW1lbWNweShvcmlnLnZhbHVlLCBtc2dfbWVkaWFfYWRkcihtc2cpLCBzaXplb2Yob3JpZy52YWx1ZSkpOworCQlvcmlnLm1lZGlhX2lkID0gMDsKKwkJb3JpZy5icm9hZGNhc3QgPSAwOworCQl0aXBjX21lZGlhX2FkZHJfcHJpbnRmKGJ1ZiwgJm9yaWcpOwogCX0KIAlpZiAobXNnX3VzZXIobXNnKSA9PSBCQ0FTVF9QUk9UT0NPTCkgewogCQl0aXBjX3ByaW50ZihidWYsICJCQ05BQ0s6QUZURVIoJXUpOiIsIG1zZ19iY2dhcF9hZnRlcihtc2cpKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL21zZy5oIGIvbmV0L3RpcGMvbXNnLmgKaW5kZXggZDkzMTc4Zi4uN2IwY2RhMSAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbXNnLmgKKysrIGIvbmV0L3RpcGMvbXNnLmgKQEAgLTc4LDYgKzc4LDggQEAKIAogI2RlZmluZSBNQVhfTVNHX1NJWkUgKE1BWF9IX1NJWkUgKyBUSVBDX01BWF9VU0VSX01TR19TSVpFKQogCisjZGVmaW5lIFRJUENfTUVESUFfQUREUl9PRkZTRVQJNQorCiAKIHN0cnVjdCB0aXBjX21zZyB7CiAJX19iZTMyIGhkclsxNV07CkBAIC02ODIsNiArNjg0LDEwIEBACiAJbXNnX3NldF9iaXRzKG0sIDUsIDEyLCAweDEsIHIpOwogfQogCitzdGF0aWMgaW5saW5lIGNoYXIgKm1zZ19tZWRpYV9hZGRyKHN0cnVjdCB0aXBjX21zZyAqbSkKK3sKKwlyZXR1cm4gKGNoYXIgKikmbS0+aGRyW1RJUENfTUVESUFfQUREUl9PRkZTRVRdOworfQogCiAvKgogICogV29yZCA5CkBAIC03MzQsMTQgKzc0MCw0IEBACiAJCSAgIHUzMiBudW1fc2VjdCwgdW5zaWduZWQgaW50IHRvdGFsX2xlbiwKIAkJCSAgICBpbnQgbWF4X3NpemUsIGludCB1c3JtZW0sIHN0cnVjdCBza19idWZmICoqYnVmKTsKIAotc3RhdGljIGlubGluZSB2b2lkIG1zZ19zZXRfbWVkaWFfYWRkcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEpCi17Ci0JbWVtY3B5KCYoKGludCAqKW0pWzVdLCBhLCBzaXplb2YoKmEpKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIG1zZ19nZXRfbWVkaWFfYWRkcihzdHJ1Y3QgdGlwY19tc2cgKm0sIHN0cnVjdCB0aXBjX21lZGlhX2FkZHIgKmEpCi17Ci0JbWVtY3B5KGEsICYoKGludCAqKW0pWzVdLCBzaXplb2YoKmEpKTsKLX0KLQogI2VuZGlmCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMgYi9uZXQvdGlwYy9uYW1lX2Rpc3RyLmMKaW5kZXggYjdjYTFiZC4uOThlYmIzNyAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvbmFtZV9kaXN0ci5jCisrKyBiL25ldC90aXBjL25hbWVfZGlzdHIuYwpAQCAtMTc2LDcgKzE3Niw3IEBACiB2b2lkIHRpcGNfbmFtZWRfbm9kZV91cCh1bnNpZ25lZCBsb25nIG5vZGVhcmcpCiB7CiAJc3RydWN0IHRpcGNfbm9kZSAqbl9wdHI7Ci0Jc3RydWN0IGxpbmsgKmxfcHRyOworCXN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyOwogCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKIAlzdHJ1Y3QgZGlzdHJfaXRlbSAqaXRlbSA9IE5VTEw7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZiA9IE5VTEw7CkBAIC0zMjIsMTAgKzMyMiw5IEBACiAvKioKICAqIHRpcGNfbmFtZWRfcmVpbml0IC0gcmUtaW5pdGlhbGl6ZSBsb2NhbCBwdWJsaWNhdGlvbiBsaXN0CiAgKgotICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCB3aGVuZXZlciBUSVBDIG5ldHdvcmtpbmcgaXMgKHJlKWVuYWJsZWQuCisgKiBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIHdoZW5ldmVyIFRJUEMgbmV0d29ya2luZyBpcyBlbmFibGVkLgogICogQWxsIGV4aXN0aW5nIHB1YmxpY2F0aW9ucyBieSB0aGlzIG5vZGUgdGhhdCBoYXZlICJjbHVzdGVyIiBvciAiem9uZSIgc2NvcGUKLSAqIGFyZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIG5vZGUncyBjdXJyZW50IG5ldHdvcmsgYWRkcmVzcy4KLSAqIChJZiB0aGUgbm9kZSdzIGFkZHJlc3MgaXMgdW5jaGFuZ2VkLCB0aGUgdXBkYXRlIGxvb3AgdGVybWluYXRlcyBpbW1lZGlhdGVseS4pCisgKiBhcmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBub2RlJ3MgbmV3IG5ldHdvcmsgYWRkcmVzcy4KICAqLwogCiB2b2lkIHRpcGNfbmFtZWRfcmVpbml0KHZvaWQpCkBAIC0zMzMsMTAgKzMzMiw5IEBACiAJc3RydWN0IHB1YmxpY2F0aW9uICpwdWJsOwogCiAJd3JpdGVfbG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOwotCWxpc3RfZm9yX2VhY2hfZW50cnkocHVibCwgJnB1Ymxfcm9vdCwgbG9jYWxfbGlzdCkgewotCQlpZiAocHVibC0+bm9kZSA9PSB0aXBjX293bl9hZGRyKQotCQkJYnJlYWs7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHB1YmwsICZwdWJsX3Jvb3QsIGxvY2FsX2xpc3QpCiAJCXB1YmwtPm5vZGUgPSB0aXBjX293bl9hZGRyOwotCX0KKwogCXdyaXRlX3VubG9ja19iaCgmdGlwY19uYW1ldGJsX2xvY2spOwogfQpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbmFtZV90YWJsZS5jIGIvbmV0L3RpcGMvbmFtZV90YWJsZS5jCmluZGV4IDQ2ZTZiNmMuLjg5ZWI1NjIgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25hbWVfdGFibGUuYworKysgYi9uZXQvdGlwYy9uYW1lX3RhYmxlLmMKQEAgLTI1MSw4ICsyNTEsOCBAQAogCQkJCQkJICAgIHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwKIAkJCQkJCSAgICB1MzIgc2NvcGUsIHUzMiBub2RlLCB1MzIgcG9ydCwgdTMyIGtleSkKIHsKLQlzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzOwotCXN0cnVjdCBzdWJzY3JpcHRpb24gKnN0OworCXN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqczsKKwlzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gKnN0OwogCXN0cnVjdCBwdWJsaWNhdGlvbiAqcHVibDsKIAlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcTsKIAlzdHJ1Y3QgbmFtZV9pbmZvICppbmZvOwpAQCAtMzgxLDcgKzM4MSw3IEBACiAJc3RydWN0IHN1Yl9zZXEgKnNzZXEgPSBuYW1lc2VxX2ZpbmRfc3Vic2VxKG5zZXEsIGluc3QpOwogCXN0cnVjdCBuYW1lX2luZm8gKmluZm87CiAJc3RydWN0IHN1Yl9zZXEgKmZyZWU7Ci0Jc3RydWN0IHN1YnNjcmlwdGlvbiAqcywgKnN0OworCXN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqcywgKnN0OwogCWludCByZW1vdmVkX3N1YnNlcSA9IDA7CiAKIAlpZiAoIXNzZXEpCkBAIC00NDgsNyArNDQ4LDggQEAKICAqIHNlcXVlbmNlIG92ZXJsYXBwaW5nIHdpdGggdGhlIHJlcXVlc3RlZCBzZXF1ZW5jZQogICovCiAKLXN0YXRpYyB2b2lkIHRpcGNfbmFtZXNlcV9zdWJzY3JpYmUoc3RydWN0IG5hbWVfc2VxICpuc2VxLCBzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzKQorc3RhdGljIHZvaWQgdGlwY19uYW1lc2VxX3N1YnNjcmliZShzdHJ1Y3QgbmFtZV9zZXEgKm5zZXEsCisJCQkJCXN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqcykKIHsKIAlzdHJ1Y3Qgc3ViX3NlcSAqc3NlcSA9IG5zZXEtPnNzZXFzOwogCkBAIC02MjUsNyArNjI2LDcgQEAKICAqLwogCiBpbnQgdGlwY19uYW1ldGJsX21jX3RyYW5zbGF0ZSh1MzIgdHlwZSwgdTMyIGxvd2VyLCB1MzIgdXBwZXIsIHUzMiBsaW1pdCwKLQkJCSAgICAgIHN0cnVjdCBwb3J0X2xpc3QgKmRwb3J0cykKKwkJCSAgICAgIHN0cnVjdCB0aXBjX3BvcnRfbGlzdCAqZHBvcnRzKQogewogCXN0cnVjdCBuYW1lX3NlcSAqc2VxOwogCXN0cnVjdCBzdWJfc2VxICpzc2VxOwpAQCAtNzM5LDcgKzc0MCw3IEBACiAgKiB0aXBjX25hbWV0Ymxfc3Vic2NyaWJlIC0gYWRkIGEgc3Vic2NyaXB0aW9uIG9iamVjdCB0byB0aGUgbmFtZSB0YWJsZQogICovCiAKLXZvaWQgdGlwY19uYW1ldGJsX3N1YnNjcmliZShzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzKQordm9pZCB0aXBjX25hbWV0Ymxfc3Vic2NyaWJlKHN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqcykKIHsKIAl1MzIgdHlwZSA9IHMtPnNlcS50eXBlOwogCXN0cnVjdCBuYW1lX3NlcSAqc2VxOwpAQCAtNzYzLDcgKzc2NCw3IEBACiAgKiB0aXBjX25hbWV0YmxfdW5zdWJzY3JpYmUgLSByZW1vdmUgYSBzdWJzY3JpcHRpb24gb2JqZWN0IGZyb20gbmFtZSB0YWJsZQogICovCiAKLXZvaWQgdGlwY19uYW1ldGJsX3Vuc3Vic2NyaWJlKHN0cnVjdCBzdWJzY3JpcHRpb24gKnMpCit2b2lkIHRpcGNfbmFtZXRibF91bnN1YnNjcmliZShzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gKnMpCiB7CiAJc3RydWN0IG5hbWVfc2VxICpzZXE7CiAKZGlmZiAtLWdpdCBhL25ldC90aXBjL25hbWVfdGFibGUuaCBiL25ldC90aXBjL25hbWVfdGFibGUuaAppbmRleCA2MmQ3N2U1Li44MDg2YjQyIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9uYW1lX3RhYmxlLmgKKysrIGIvbmV0L3RpcGMvbmFtZV90YWJsZS5oCkBAIC0zOSw4ICszOSw4IEBACiAKICNpbmNsdWRlICJub2RlX3N1YnNjci5oIgogCi1zdHJ1Y3Qgc3Vic2NyaXB0aW9uOwotc3RydWN0IHBvcnRfbGlzdDsKK3N0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbjsKK3N0cnVjdCB0aXBjX3BvcnRfbGlzdDsKIAogLyoKICAqIFRJUEMgbmFtZSB0eXBlcyByZXNlcnZlZCBmb3IgaW50ZXJuYWwgVElQQyB1c2UgKGJvdGggY3VycmVudCBhbmQgcGxhbm5lZCkKQEAgLTkwLDcgKzkwLDcgQEAKIHN0cnVjdCBza19idWZmICp0aXBjX25hbWV0YmxfZ2V0KGNvbnN0IHZvaWQgKnJlcV90bHZfYXJlYSwgaW50IHJlcV90bHZfc3BhY2UpOwogdTMyIHRpcGNfbmFtZXRibF90cmFuc2xhdGUodTMyIHR5cGUsIHUzMiBpbnN0YW5jZSwgdTMyICpub2RlKTsKIGludCB0aXBjX25hbWV0YmxfbWNfdHJhbnNsYXRlKHUzMiB0eXBlLCB1MzIgbG93ZXIsIHUzMiB1cHBlciwgdTMyIGxpbWl0LAotCQkJIHN0cnVjdCBwb3J0X2xpc3QgKmRwb3J0cyk7CisJCQkgc3RydWN0IHRpcGNfcG9ydF9saXN0ICpkcG9ydHMpOwogaW50IHRpcGNfbmFtZXRibF9wdWJsaXNoX3Jzdih1MzIgcmVmLCB1bnNpZ25lZCBpbnQgc2NvcGUsCiAJCQlzdHJ1Y3QgdGlwY19uYW1lX3NlcSBjb25zdCAqc2VxKTsKIHN0cnVjdCBwdWJsaWNhdGlvbiAqdGlwY19uYW1ldGJsX3B1Ymxpc2godTMyIHR5cGUsIHUzMiBsb3dlciwgdTMyIHVwcGVyLApAQCAtMTAwLDggKzEwMCw4IEBACiAJCQkJCXUzMiBzY29wZSwgdTMyIG5vZGUsIHUzMiByZWYsIHUzMiBrZXkpOwogc3RydWN0IHB1YmxpY2F0aW9uICp0aXBjX25hbWV0YmxfcmVtb3ZlX3B1YmwodTMyIHR5cGUsIHUzMiBsb3dlciwKIAkJCQkJdTMyIG5vZGUsIHUzMiByZWYsIHUzMiBrZXkpOwotdm9pZCB0aXBjX25hbWV0Ymxfc3Vic2NyaWJlKHN0cnVjdCBzdWJzY3JpcHRpb24gKnMpOwotdm9pZCB0aXBjX25hbWV0YmxfdW5zdWJzY3JpYmUoc3RydWN0IHN1YnNjcmlwdGlvbiAqcyk7Cit2b2lkIHRpcGNfbmFtZXRibF9zdWJzY3JpYmUoc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzKTsKK3ZvaWQgdGlwY19uYW1ldGJsX3Vuc3Vic2NyaWJlKHN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqcyk7CiBpbnQgdGlwY19uYW1ldGJsX2luaXQodm9pZCk7CiB2b2lkIHRpcGNfbmFtZXRibF9zdG9wKHZvaWQpOwogCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9uZXQuYyBiL25ldC90aXBjL25ldC5jCmluZGV4IGZhZmVmNmMuLjYxYWZlZTcgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25ldC5jCisrKyBiL25ldC90aXBjL25ldC5jCkBAIC0xNzQsNyArMTc0LDYgQEAKIGludCB0aXBjX25ldF9zdGFydCh1MzIgYWRkcikKIHsKIAljaGFyIGFkZHJfc3RyaW5nWzE2XTsKLQlpbnQgcmVzOwogCiAJaWYgKHRpcGNfbW9kZSAhPSBUSVBDX05PREVfTU9ERSkKIAkJcmV0dXJuIC1FTk9QUk9UT09QVDsKQEAgLTE4Nyw5ICsxODYsNyBAQAogCXRpcGNfbmFtZWRfcmVpbml0KCk7CiAJdGlwY19wb3J0X3JlaW5pdCgpOwogCi0JcmVzID0gdGlwY19iY2xpbmtfaW5pdCgpOwotCWlmIChyZXMpCi0JCXJldHVybiByZXM7CisJdGlwY19iY2xpbmtfaW5pdCgpOwogCiAJdGlwY19rX3NpZ25hbCgoSGFuZGxlcil0aXBjX3N1YnNjcl9zdGFydCwgMCk7CiAJdGlwY19rX3NpZ25hbCgoSGFuZGxlcil0aXBjX2NmZ19pbml0LCAwKTsKQEAgLTIwNyw4ICsyMDQsOCBAQAogCWlmICh0aXBjX21vZGUgIT0gVElQQ19ORVRfTU9ERSkKIAkJcmV0dXJuOwogCXdyaXRlX2xvY2tfYmgoJnRpcGNfbmV0X2xvY2spOwotCXRpcGNfYmVhcmVyX3N0b3AoKTsKIAl0aXBjX21vZGUgPSBUSVBDX05PREVfTU9ERTsKKwl0aXBjX2JlYXJlcl9zdG9wKCk7CiAJdGlwY19iY2xpbmtfc3RvcCgpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShub2RlLCB0X25vZGUsICZ0aXBjX25vZGVfbGlzdCwgbGlzdCkKIAkJdGlwY19ub2RlX2RlbGV0ZShub2RlKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL25vZGUuYyBiL25ldC90aXBjL25vZGUuYwppbmRleCAyN2I0YmIwLi42YjIyNmZhIDEwMDY0NAotLS0gYS9uZXQvdGlwYy9ub2RlLmMKKysrIGIvbmV0L3RpcGMvbm9kZS5jCkBAIC0xMzYsOSArMTM2LDkgQEAKICAqIExpbmsgYmVjb21lcyBhY3RpdmUgKGFsb25lIG9yIHNoYXJlZCkgb3Igc3RhbmRieSwgZGVwZW5kaW5nIG9uIGl0cyBwcmlvcml0eS4KICAqLwogCi12b2lkIHRpcGNfbm9kZV9saW5rX3VwKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCit2b2lkIHRpcGNfbm9kZV9saW5rX3VwKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyLCBzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKLQlzdHJ1Y3QgbGluayAqKmFjdGl2ZSA9ICZuX3B0ci0+YWN0aXZlX2xpbmtzWzBdOworCXN0cnVjdCB0aXBjX2xpbmsgKiphY3RpdmUgPSAmbl9wdHItPmFjdGl2ZV9saW5rc1swXTsKIAogCW5fcHRyLT53b3JraW5nX2xpbmtzKys7CiAKQEAgLTE3MSwxNCArMTcxLDE0IEBACiAKIHN0YXRpYyB2b2lkIG5vZGVfc2VsZWN0X2FjdGl2ZV9saW5rcyhzdHJ1Y3QgdGlwY19ub2RlICpuX3B0cikKIHsKLQlzdHJ1Y3QgbGluayAqKmFjdGl2ZSA9ICZuX3B0ci0+YWN0aXZlX2xpbmtzWzBdOworCXN0cnVjdCB0aXBjX2xpbmsgKiphY3RpdmUgPSAmbl9wdHItPmFjdGl2ZV9saW5rc1swXTsKIAl1MzIgaTsKIAl1MzIgaGlnaGVzdF9wcmlvID0gMDsKIAogCWFjdGl2ZVswXSA9IGFjdGl2ZVsxXSA9IE5VTEw7CiAKIAlmb3IgKGkgPSAwOyBpIDwgTUFYX0JFQVJFUlM7IGkrKykgewotCQlzdHJ1Y3QgbGluayAqbF9wdHIgPSBuX3B0ci0+bGlua3NbaV07CisJCXN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyID0gbl9wdHItPmxpbmtzW2ldOwogCiAJCWlmICghbF9wdHIgfHwgIXRpcGNfbGlua19pc191cChsX3B0cikgfHwKIAkJICAgIChsX3B0ci0+cHJpb3JpdHkgPCBoaWdoZXN0X3ByaW8pKQpAQCAtMTk3LDkgKzE5Nyw5IEBACiAgKiB0aXBjX25vZGVfbGlua19kb3duIC0gaGFuZGxlIGxvc3Mgb2YgbGluawogICovCiAKLXZvaWQgdGlwY19ub2RlX2xpbmtfZG93bihzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQordm9pZCB0aXBjX25vZGVfbGlua19kb3duKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyLCBzdHJ1Y3QgdGlwY19saW5rICpsX3B0cikKIHsKLQlzdHJ1Y3QgbGluayAqKmFjdGl2ZTsKKwlzdHJ1Y3QgdGlwY19saW5rICoqYWN0aXZlOwogCiAJbl9wdHItPndvcmtpbmdfbGlua3MtLTsKIApAQCAtMjM5LDE0ICsyMzksMTQgQEAKIAlyZXR1cm4gdGlwY19ub2RlX2FjdGl2ZV9saW5rcyhuX3B0cik7CiB9CiAKLXZvaWQgdGlwY19ub2RlX2F0dGFjaF9saW5rKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpCit2b2lkIHRpcGNfbm9kZV9hdHRhY2hfbGluayhzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwgc3RydWN0IHRpcGNfbGluayAqbF9wdHIpCiB7CiAJbl9wdHItPmxpbmtzW2xfcHRyLT5iX3B0ci0+aWRlbnRpdHldID0gbF9wdHI7CiAJYXRvbWljX2luYygmdGlwY19udW1fbGlua3MpOwogCW5fcHRyLT5saW5rX2NudCsrOwogfQogCi12b2lkIHRpcGNfbm9kZV9kZXRhY2hfbGluayhzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKQordm9pZCB0aXBjX25vZGVfZGV0YWNoX2xpbmsoc3RydWN0IHRpcGNfbm9kZSAqbl9wdHIsIHN0cnVjdCB0aXBjX2xpbmsgKmxfcHRyKQogewogCW5fcHRyLT5saW5rc1tsX3B0ci0+Yl9wdHItPmlkZW50aXR5XSA9IE5VTEw7CiAJYXRvbWljX2RlYygmdGlwY19udW1fbGlua3MpOwpAQCAtMzA3LDcgKzMwNyw3IEBACiAJbl9wdHItPmJjbGluay5hY2tlZCA9IHRpcGNfYmNsaW5rX2dldF9sYXN0X3NlbnQoKTsKIAogCWlmIChuX3B0ci0+YmNsaW5rLnN1cHBvcnRlZCkgewotCQl0aXBjX25tYXBfYWRkKCZ0aXBjX2JjYXN0X25tYXAsIG5fcHRyLT5hZGRyKTsKKwkJdGlwY19iY2xpbmtfYWRkX25vZGUobl9wdHItPmFkZHIpOwogCQlpZiAobl9wdHItPmFkZHIgPCB0aXBjX293bl9hZGRyKQogCQkJdGlwY19vd25fdGFnKys7CiAJfQpAQCAtMzUwLDkgKzM1MCw4IEBACiAJCQluX3B0ci0+YmNsaW5rLmRlZnJhZ20gPSBOVUxMOwogCQl9CiAKLQkJdGlwY19ubWFwX3JlbW92ZSgmdGlwY19iY2FzdF9ubWFwLCBuX3B0ci0+YWRkcik7Ci0JCXRpcGNfYmNsaW5rX2Fja25vd2xlZGdlKG5fcHRyLAotCQkJCQltb2Qobl9wdHItPmJjbGluay5hY2tlZCArIDEwMDAwKSk7CisJCXRpcGNfYmNsaW5rX3JlbW92ZV9ub2RlKG5fcHRyLT5hZGRyKTsKKwkJdGlwY19iY2xpbmtfYWNrbm93bGVkZ2Uobl9wdHIsIElOVkFMSURfTElOS19TRVEpOwogCQlpZiAobl9wdHItPmFkZHIgPCB0aXBjX293bl9hZGRyKQogCQkJdGlwY19vd25fdGFnLS07CiAKQEAgLTM2MSw3ICszNjAsNyBAQAogCiAJLyogQWJvcnQgbGluayBjaGFuZ2VvdmVyICovCiAJZm9yIChpID0gMDsgaSA8IE1BWF9CRUFSRVJTOyBpKyspIHsKLQkJc3RydWN0IGxpbmsgKmxfcHRyID0gbl9wdHItPmxpbmtzW2ldOworCQlzdHJ1Y3QgdGlwY19saW5rICpsX3B0ciA9IG5fcHRyLT5saW5rc1tpXTsKIAkJaWYgKCFsX3B0cikKIAkJCWNvbnRpbnVlOwogCQlsX3B0ci0+cmVzZXRfY2hlY2twb2ludCA9IGxfcHRyLT5uZXh0X2luX25vOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvbm9kZS5oIGIvbmV0L3RpcGMvbm9kZS5oCmluZGV4IDRmMTVjYjQuLjBiMWM1ZjggMTAwNjQ0Ci0tLSBhL25ldC90aXBjL25vZGUuaAorKysgYi9uZXQvdGlwYy9ub2RlLmgKQEAgLTc5LDggKzc5LDggQEAKIAlzdHJ1Y3QgaGxpc3Rfbm9kZSBoYXNoOwogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIG5zdWI7Ci0Jc3RydWN0IGxpbmsgKmFjdGl2ZV9saW5rc1syXTsKLQlzdHJ1Y3QgbGluayAqbGlua3NbTUFYX0JFQVJFUlNdOworCXN0cnVjdCB0aXBjX2xpbmsgKmFjdGl2ZV9saW5rc1syXTsKKwlzdHJ1Y3QgdGlwY19saW5rICpsaW5rc1tNQVhfQkVBUkVSU107CiAJaW50IGxpbmtfY250OwogCWludCB3b3JraW5nX2xpbmtzOwogCWludCBibG9ja19zZXR1cDsKQEAgLTExNywxMCArMTE3LDEwIEBACiBzdHJ1Y3QgdGlwY19ub2RlICp0aXBjX25vZGVfZmluZCh1MzIgYWRkcik7CiBzdHJ1Y3QgdGlwY19ub2RlICp0aXBjX25vZGVfY3JlYXRlKHUzMiBhZGRyKTsKIHZvaWQgdGlwY19ub2RlX2RlbGV0ZShzdHJ1Y3QgdGlwY19ub2RlICpuX3B0cik7Ci12b2lkIHRpcGNfbm9kZV9hdHRhY2hfbGluayhzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKTsKLXZvaWQgdGlwY19ub2RlX2RldGFjaF9saW5rKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOwotdm9pZCB0aXBjX25vZGVfbGlua19kb3duKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyLCBzdHJ1Y3QgbGluayAqbF9wdHIpOwotdm9pZCB0aXBjX25vZGVfbGlua191cChzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwgc3RydWN0IGxpbmsgKmxfcHRyKTsKK3ZvaWQgdGlwY19ub2RlX2F0dGFjaF9saW5rKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyLCBzdHJ1Y3QgdGlwY19saW5rICpsX3B0cik7Cit2b2lkIHRpcGNfbm9kZV9kZXRhY2hfbGluayhzdHJ1Y3QgdGlwY19ub2RlICpuX3B0ciwgc3RydWN0IHRpcGNfbGluayAqbF9wdHIpOwordm9pZCB0aXBjX25vZGVfbGlua19kb3duKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyLCBzdHJ1Y3QgdGlwY19saW5rICpsX3B0cik7Cit2b2lkIHRpcGNfbm9kZV9saW5rX3VwKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyLCBzdHJ1Y3QgdGlwY19saW5rICpsX3B0cik7CiBpbnQgdGlwY19ub2RlX2FjdGl2ZV9saW5rcyhzdHJ1Y3QgdGlwY19ub2RlICpuX3B0cik7CiBpbnQgdGlwY19ub2RlX3JlZHVuZGFudF9saW5rcyhzdHJ1Y3QgdGlwY19ub2RlICpuX3B0cik7CiBpbnQgdGlwY19ub2RlX2lzX3VwKHN0cnVjdCB0aXBjX25vZGUgKm5fcHRyKTsKZGlmZiAtLWdpdCBhL25ldC90aXBjL3BvcnQuYyBiL25ldC90aXBjL3BvcnQuYwppbmRleCA1NGQ4MTJhLi5kOTFlZmM2IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9wb3J0LmMKKysrIGIvbmV0L3RpcGMvcG9ydC5jCkBAIC04MCw3ICs4MCw3IEBACiAJc3RydWN0IHRpcGNfbXNnICpoZHI7CiAJc3RydWN0IHNrX2J1ZmYgKmJ1ZjsKIAlzdHJ1Y3Qgc2tfYnVmZiAqaWJ1ZiA9IE5VTEw7Ci0Jc3RydWN0IHBvcnRfbGlzdCBkcG9ydHMgPSB7MCwgTlVMTCwgfTsKKwlzdHJ1Y3QgdGlwY19wb3J0X2xpc3QgZHBvcnRzID0gezAsIE5VTEwsIH07CiAJc3RydWN0IHRpcGNfcG9ydCAqb3BvcnQgPSB0aXBjX3BvcnRfZGVyZWYocmVmKTsKIAlpbnQgZXh0X3RhcmdldHM7CiAJaW50IHJlczsKQEAgLTE0MiwxMSArMTQyLDExIEBACiAgKiBJZiB0aGVyZSBpcyBubyBwb3J0IGxpc3QsIHBlcmZvcm0gYSBsb29rdXAgdG8gY3JlYXRlIG9uZQogICovCiAKLXZvaWQgdGlwY19wb3J0X3JlY3ZfbWNhc3Qoc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHBvcnRfbGlzdCAqZHApCit2b2lkIHRpcGNfcG9ydF9yZWN2X21jYXN0KHN0cnVjdCBza19idWZmICpidWYsIHN0cnVjdCB0aXBjX3BvcnRfbGlzdCAqZHApCiB7CiAJc3RydWN0IHRpcGNfbXNnICptc2c7Ci0Jc3RydWN0IHBvcnRfbGlzdCBkcG9ydHMgPSB7MCwgTlVMTCwgfTsKLQlzdHJ1Y3QgcG9ydF9saXN0ICppdGVtID0gZHA7CisJc3RydWN0IHRpcGNfcG9ydF9saXN0IGRwb3J0cyA9IHswLCBOVUxMLCB9OworCXN0cnVjdCB0aXBjX3BvcnRfbGlzdCAqaXRlbSA9IGRwOwogCWludCBjbnQgPSAwOwogCiAJbXNnID0gYnVmX21zZyhidWYpOwpkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvcG9ydC5oIGIvbmV0L3RpcGMvcG9ydC5oCmluZGV4IGI5YWEzNDEuLmY3NTE4MDcgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3BvcnQuaAorKysgYi9uZXQvdGlwYy9wb3J0LmgKQEAgLTE1MSw3ICsxNTEsNyBAQAogfTsKIAogZXh0ZXJuIHNwaW5sb2NrX3QgdGlwY19wb3J0X2xpc3RfbG9jazsKLXN0cnVjdCBwb3J0X2xpc3Q7CitzdHJ1Y3QgdGlwY19wb3J0X2xpc3Q7CiAKIC8qCiAgKiBUSVBDIHBvcnQgbWFuaXB1bGF0aW9uIHJvdXRpbmVzCkBAIC0yMjgsNyArMjI4LDcgQEAKIAkJCSAgICAgIHVuc2lnbmVkIGludCB0b3RhbF9sZW4sIGludCBlcnIpOwogc3RydWN0IHNrX2J1ZmYgKnRpcGNfcG9ydF9nZXRfcG9ydHModm9pZCk7CiB2b2lkIHRpcGNfcG9ydF9yZWN2X3Byb3RvX21zZyhzdHJ1Y3Qgc2tfYnVmZiAqYnVmKTsKLXZvaWQgdGlwY19wb3J0X3JlY3ZfbWNhc3Qoc3RydWN0IHNrX2J1ZmYgKmJ1Ziwgc3RydWN0IHBvcnRfbGlzdCAqZHApOwordm9pZCB0aXBjX3BvcnRfcmVjdl9tY2FzdChzdHJ1Y3Qgc2tfYnVmZiAqYnVmLCBzdHJ1Y3QgdGlwY19wb3J0X2xpc3QgKmRwKTsKIHZvaWQgdGlwY19wb3J0X3JlaW5pdCh2b2lkKTsKIAogLyoqCmRpZmYgLS1naXQgYS9uZXQvdGlwYy9yZWYuYyBiL25ldC90aXBjL3JlZi5jCmluZGV4IDgzMTE2ODkuLjllMzdiNzggMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3JlZi5jCisrKyBiL25ldC90aXBjL3JlZi5jCkBAIC0xMTAsOCArMTEwLDcgQEAKIAogCS8qIGFsbG9jYXRlIHRhYmxlICYgbWFyayBhbGwgZW50cmllcyBhcyB1bmluaXRpYWxpemVkICovCiAKLQl0YWJsZSA9IF9fdm1hbGxvYyhhY3R1YWxfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgcmVmZXJlbmNlKSwKLQkJCSAgR0ZQX0tFUk5FTCB8IF9fR0ZQX0hJR0hNRU0gfCBfX0dGUF9aRVJPLCBQQUdFX0tFUk5FTCk7CisJdGFibGUgPSB2emFsbG9jKGFjdHVhbF9zaXplICogc2l6ZW9mKHN0cnVjdCByZWZlcmVuY2UpKTsKIAlpZiAodGFibGUgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKZGlmZiAtLWdpdCBhL25ldC90aXBjL3NvY2tldC5jIGIvbmV0L3RpcGMvc29ja2V0LmMKaW5kZXggNDJiODMyNC4uZTJmN2M1ZCAxMDA2NDQKLS0tIGEvbmV0L3RpcGMvc29ja2V0LmMKKysrIGIvbmV0L3RpcGMvc29ja2V0LmMKQEAgLTE4NSw5ICsxODUsNiBAQAogCiAJLyogVmFsaWRhdGUgYXJndW1lbnRzICovCiAKLQlpZiAoIW5ldF9lcShuZXQsICZpbml0X25ldCkpCi0JCXJldHVybiAtRUFGTk9TVVBQT1JUOwotCiAJaWYgKHVubGlrZWx5KHByb3RvY29sICE9IDApKQogCQlyZXR1cm4gLUVQUk9UT05PU1VQUE9SVDsKIApkaWZmIC0tZ2l0IGEvbmV0L3RpcGMvc3Vic2NyLmMgYi9uZXQvdGlwYy9zdWJzY3IuYwppbmRleCAxOTgzNzE3Li44YzQ5NTY2IDEwMDY0NAotLS0gYS9uZXQvdGlwYy9zdWJzY3IuYworKysgYi9uZXQvdGlwYy9zdWJzY3IuYwpAQCAtNDAsMTQgKzQwLDE0IEBACiAjaW5jbHVkZSAic3Vic2NyLmgiCiAKIC8qKgotICogc3RydWN0IHN1YnNjcmliZXIgLSBUSVBDIG5ldHdvcmsgdG9wb2xvZ3kgc3Vic2NyaWJlcgorICogc3RydWN0IHRpcGNfc3Vic2NyaWJlciAtIFRJUEMgbmV0d29yayB0b3BvbG9neSBzdWJzY3JpYmVyCiAgKiBAcG9ydF9yZWY6IG9iamVjdCByZWZlcmVuY2UgdG8gc2VydmVyIHBvcnQgY29ubmVjdGluZyB0byBzdWJzY3JpYmVyCiAgKiBAbG9jazogcG9pbnRlciB0byBzcGlubG9jayBjb250cm9sbGluZyBhY2Nlc3MgdG8gc3Vic2NyaWJlcidzIHNlcnZlciBwb3J0CiAgKiBAc3Vic2NyaWJlcl9saXN0OiBhZGphY2VudCBzdWJzY3JpYmVycyBpbiB0b3AuIHNlcnZlcidzIGxpc3Qgb2Ygc3Vic2NyaWJlcnMKICAqIEBzdWJzY3JpcHRpb25fbGlzdDogbGlzdCBvZiBzdWJzY3JpcHRpb24gb2JqZWN0cyBmb3IgdGhpcyBzdWJzY3JpYmVyCiAgKi8KIAotc3RydWN0IHN1YnNjcmliZXIgeworc3RydWN0IHRpcGNfc3Vic2NyaWJlciB7CiAJdTMyIHBvcnRfcmVmOwogCXNwaW5sb2NrX3QgKmxvY2s7CiAJc3RydWN0IGxpc3RfaGVhZCBzdWJzY3JpYmVyX2xpc3Q7CkBAIC05Miw3ICs5Miw3IEBACiAgKiAgICAgICB0cnkgdG8gdGFrZSB0aGUgbG9jayBpZiB0aGUgbWVzc2FnZSBpcyByZWplY3RlZCBhbmQgcmV0dXJuZWQhCiAgKi8KIAotc3RhdGljIHZvaWQgc3Vic2NyX3NlbmRfZXZlbnQoc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViLAorc3RhdGljIHZvaWQgc3Vic2NyX3NlbmRfZXZlbnQoc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWIsCiAJCQkgICAgICB1MzIgZm91bmRfbG93ZXIsCiAJCQkgICAgICB1MzIgZm91bmRfdXBwZXIsCiAJCQkgICAgICB1MzIgZXZlbnQsCkBAIC0xMTgsNyArMTE4LDcgQEAKICAqIFJldHVybnMgMSBpZiB0aGVyZSBpcyBvdmVybGFwLCBvdGhlcndpc2UgMC4KICAqLwogCi1pbnQgdGlwY19zdWJzY3Jfb3ZlcmxhcChzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWIsCitpbnQgdGlwY19zdWJzY3Jfb3ZlcmxhcChzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gKnN1YiwKIAkJCXUzMiBmb3VuZF9sb3dlciwKIAkJCXUzMiBmb3VuZF91cHBlcikKIApAQCAtMTM4LDcgKzEzOCw3IEBACiAgKiBQcm90ZWN0ZWQgYnkgbmFtZXNlcS5sb2NrIGluIG5hbWVfdGFibGUuYwogICovCiAKLXZvaWQgdGlwY19zdWJzY3JfcmVwb3J0X292ZXJsYXAoc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViLAordm9pZCB0aXBjX3N1YnNjcl9yZXBvcnRfb3ZlcmxhcChzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gKnN1YiwKIAkJCQl1MzIgZm91bmRfbG93ZXIsCiAJCQkJdTMyIGZvdW5kX3VwcGVyLAogCQkJCXUzMiBldmVudCwKQEAgLTE1OCw3ICsxNTgsNyBAQAogICogc3Vic2NyX3RpbWVvdXQgLSBzdWJzY3JpcHRpb24gdGltZW91dCBoYXMgb2NjdXJyZWQKICAqLwogCi1zdGF0aWMgdm9pZCBzdWJzY3JfdGltZW91dChzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWIpCitzdGF0aWMgdm9pZCBzdWJzY3JfdGltZW91dChzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gKnN1YikKIHsKIAlzdHJ1Y3QgdGlwY19wb3J0ICpzZXJ2ZXJfcG9ydDsKIApAQCAtMjA1LDcgKzIwNSw3IEBACiAgKiBDYWxsZWQgd2l0aCBzdWJzY3JpYmVyIHBvcnQgbG9ja2VkLgogICovCiAKLXN0YXRpYyB2b2lkIHN1YnNjcl9kZWwoc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViKQorc3RhdGljIHZvaWQgc3Vic2NyX2RlbChzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gKnN1YikKIHsKIAl0aXBjX25hbWV0YmxfdW5zdWJzY3JpYmUoc3ViKTsKIAlsaXN0X2RlbCgmc3ViLT5zdWJzY3JpcHRpb25fbGlzdCk7CkBAIC0yMjQsMTEgKzIyNCwxMSBAQAogICogc2ltcGx5IHdhaXQgZm9yIGl0IHRvIGJlIHJlbGVhc2VkLCB0aGVuIGNsYWltIGl0LikKICAqLwogCi1zdGF0aWMgdm9pZCBzdWJzY3JfdGVybWluYXRlKHN0cnVjdCBzdWJzY3JpYmVyICpzdWJzY3JpYmVyKQorc3RhdGljIHZvaWQgc3Vic2NyX3Rlcm1pbmF0ZShzdHJ1Y3QgdGlwY19zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQogewogCXUzMiBwb3J0X3JlZjsKLQlzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWI7Ci0Jc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViX3RlbXA7CisJc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWI7CisJc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWJfdGVtcDsKIAogCS8qIEludmFsaWRhdGUgc3Vic2NyaWJlciByZWZlcmVuY2UgKi8KIApAQCAtMjc4LDEwICsyNzgsMTAgQEAKICAqLwogCiBzdGF0aWMgdm9pZCBzdWJzY3JfY2FuY2VsKHN0cnVjdCB0aXBjX3N1YnNjciAqcywKLQkJCSAgc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXIpCisJCQkgIHN0cnVjdCB0aXBjX3N1YnNjcmliZXIgKnN1YnNjcmliZXIpCiB7Ci0Jc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViOwotCXN0cnVjdCBzdWJzY3JpcHRpb24gKnN1Yl90ZW1wOworCXN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqc3ViOworCXN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqc3ViX3RlbXA7CiAJaW50IGZvdW5kID0gMDsKIAogCS8qIEZpbmQgZmlyc3QgbWF0Y2hpbmcgc3Vic2NyaXB0aW9uLCBleGl0IGlmIG5vdCBmb3VuZCAqLwpAQCAtMzE0LDEwICszMTQsMTAgQEAKICAqIENhbGxlZCB3aXRoIHN1YnNjcmliZXIgcG9ydCBsb2NrZWQuCiAgKi8KIAotc3RhdGljIHN0cnVjdCBzdWJzY3JpcHRpb24gKnN1YnNjcl9zdWJzY3JpYmUoc3RydWN0IHRpcGNfc3Vic2NyICpzLAotCQkJCQkgICAgIHN0cnVjdCBzdWJzY3JpYmVyICpzdWJzY3JpYmVyKQorc3RhdGljIHN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAqc3Vic2NyX3N1YnNjcmliZShzdHJ1Y3QgdGlwY19zdWJzY3IgKnMsCisJCQkJCSAgICAgc3RydWN0IHRpcGNfc3Vic2NyaWJlciAqc3Vic2NyaWJlcikKIHsKLQlzdHJ1Y3Qgc3Vic2NyaXB0aW9uICpzdWI7CisJc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWI7CiAJaW50IHN3YXA7CiAKIAkvKiBEZXRlcm1pbmUgc3Vic2NyaWJlcidzIGVuZGlhbm5lc3MgKi8KQEAgLTM5Myw3ICszOTMsNyBAQAogCQkJCSAgICAgICB1bnNpZ25lZCBpbnQgc2l6ZSwKIAkJCQkgICAgICAgaW50IHJlYXNvbikKIHsKLQlzdHJ1Y3Qgc3Vic2NyaWJlciAqc3Vic2NyaWJlciA9IHVzcl9oYW5kbGU7CisJc3RydWN0IHRpcGNfc3Vic2NyaWJlciAqc3Vic2NyaWJlciA9IHVzcl9oYW5kbGU7CiAJc3BpbmxvY2tfdCAqc3Vic2NyaWJlcl9sb2NrOwogCiAJaWYgKHRpcGNfcG9ydF9sb2NrKHBvcnRfcmVmKSA9PSBOVUxMKQpAQCAtNDE2LDkgKzQxNiw5IEBACiAJCQkJICBjb25zdCB1bmNoYXIgKmRhdGEsCiAJCQkJICB1MzIgc2l6ZSkKIHsKLQlzdHJ1Y3Qgc3Vic2NyaWJlciAqc3Vic2NyaWJlciA9IHVzcl9oYW5kbGU7CisJc3RydWN0IHRpcGNfc3Vic2NyaWJlciAqc3Vic2NyaWJlciA9IHVzcl9oYW5kbGU7CiAJc3BpbmxvY2tfdCAqc3Vic2NyaWJlcl9sb2NrOwotCXN0cnVjdCBzdWJzY3JpcHRpb24gKnN1YjsKKwlzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gKnN1YjsKIAogCS8qCiAJICogTG9jayBzdWJzY3JpYmVyJ3Mgc2VydmVyIHBvcnQgKCYgbWFrZSBhIGxvY2FsIGNvcHkgb2YgbG9jayBwb2ludGVyLApAQCAtNDcxLDEyICs0NzEsMTIgQEAKIAkJCQkgICBzdHJ1Y3QgdGlwY19wb3J0aWQgY29uc3QgKm9yaWcsCiAJCQkJICAgc3RydWN0IHRpcGNfbmFtZV9zZXEgY29uc3QgKmRlc3QpCiB7Ci0Jc3RydWN0IHN1YnNjcmliZXIgKnN1YnNjcmliZXI7CisJc3RydWN0IHRpcGNfc3Vic2NyaWJlciAqc3Vic2NyaWJlcjsKIAl1MzIgc2VydmVyX3BvcnRfcmVmOwogCiAJLyogQ3JlYXRlIHN1YnNjcmliZXIgb2JqZWN0ICovCiAKLQlzdWJzY3JpYmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHN1YnNjcmliZXIpLCBHRlBfQVRPTUlDKTsKKwlzdWJzY3JpYmVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IHRpcGNfc3Vic2NyaWJlciksIEdGUF9BVE9NSUMpOwogCWlmIChzdWJzY3JpYmVyID09IE5VTEwpIHsKIAkJd2FybigiU3Vic2NyaWJlciByZWplY3RlZCwgbm8gbWVtb3J5XG4iKTsKIAkJcmV0dXJuOwpAQCAtNTY4LDggKzU2OCw4IEBACiAKIHZvaWQgdGlwY19zdWJzY3Jfc3RvcCh2b2lkKQogewotCXN0cnVjdCBzdWJzY3JpYmVyICpzdWJzY3JpYmVyOwotCXN0cnVjdCBzdWJzY3JpYmVyICpzdWJzY3JpYmVyX3RlbXA7CisJc3RydWN0IHRpcGNfc3Vic2NyaWJlciAqc3Vic2NyaWJlcjsKKwlzdHJ1Y3QgdGlwY19zdWJzY3JpYmVyICpzdWJzY3JpYmVyX3RlbXA7CiAJc3BpbmxvY2tfdCAqc3Vic2NyaWJlcl9sb2NrOwogCiAJaWYgKHRvcHNydi5zZXR1cF9wb3J0KSB7CmRpZmYgLS1naXQgYS9uZXQvdGlwYy9zdWJzY3IuaCBiL25ldC90aXBjL3N1YnNjci5oCmluZGV4IDRiMDZlZjYuLmVmNjUyOWMgMTAwNjQ0Ci0tLSBhL25ldC90aXBjL3N1YnNjci5oCisrKyBiL25ldC90aXBjL3N1YnNjci5oCkBAIC0zNywxMCArMzcsMTAgQEAKICNpZm5kZWYgX1RJUENfU1VCU0NSX0gKICNkZWZpbmUgX1RJUENfU1VCU0NSX0gKIAotc3RydWN0IHN1YnNjcmlwdGlvbjsKK3N0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbjsKIAogLyoqCi0gKiBzdHJ1Y3Qgc3Vic2NyaXB0aW9uIC0gVElQQyBuZXR3b3JrIHRvcG9sb2d5IHN1YnNjcmlwdGlvbiBvYmplY3QKKyAqIHN0cnVjdCB0aXBjX3N1YnNjcmlwdGlvbiAtIFRJUEMgbmV0d29yayB0b3BvbG9neSBzdWJzY3JpcHRpb24gb2JqZWN0CiAgKiBAc2VxOiBuYW1lIHNlcXVlbmNlIGFzc29jaWF0ZWQgd2l0aCBzdWJzY3JpcHRpb24KICAqIEB0aW1lb3V0OiBkdXJhdGlvbiBvZiBzdWJzY3JpcHRpb24gKGluIG1zKQogICogQGZpbHRlcjogZXZlbnQgZmlsdGVyaW5nIHRvIGJlIGRvbmUgZm9yIHN1YnNjcmlwdGlvbgpAQCAtNTIsNyArNTIsNyBAQAogICogQGV2dDogdGVtcGxhdGUgZm9yIGV2ZW50cyBnZW5lcmF0ZWQgYnkgc3Vic2NyaXB0aW9uCiAgKi8KIAotc3RydWN0IHN1YnNjcmlwdGlvbiB7CitzdHJ1Y3QgdGlwY19zdWJzY3JpcHRpb24gewogCXN0cnVjdCB0aXBjX25hbWVfc2VxIHNlcTsKIAl1MzIgdGltZW91dDsKIAl1MzIgZmlsdGVyOwpAQCAtNjQsMTEgKzY0LDExIEBACiAJc3RydWN0IHRpcGNfZXZlbnQgZXZ0OwogfTsKIAotaW50IHRpcGNfc3Vic2NyX292ZXJsYXAoc3RydWN0IHN1YnNjcmlwdGlvbiAqc3ViLAoraW50IHRpcGNfc3Vic2NyX292ZXJsYXAoc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWIsCiAJCQl1MzIgZm91bmRfbG93ZXIsCiAJCQl1MzIgZm91bmRfdXBwZXIpOwogCi12b2lkIHRpcGNfc3Vic2NyX3JlcG9ydF9vdmVybGFwKHN0cnVjdCBzdWJzY3JpcHRpb24gKnN1YiwKK3ZvaWQgdGlwY19zdWJzY3JfcmVwb3J0X292ZXJsYXAoc3RydWN0IHRpcGNfc3Vic2NyaXB0aW9uICpzdWIsCiAJCQkJdTMyIGZvdW5kX2xvd2VyLAogCQkJCXUzMiBmb3VuZF91cHBlciwKIAkJCQl1MzIgZXZlbnQsCmRpZmYgLS1naXQgYS9uZXQvdW5peC9LY29uZmlnIGIvbmV0L3VuaXgvS2NvbmZpZwppbmRleCA1YTY5NzMzLi5jMjEyOGIxIDEwMDY0NAotLS0gYS9uZXQvdW5peC9LY29uZmlnCisrKyBiL25ldC91bml4L0tjb25maWcKQEAgLTE5LDMgKzE5LDEwIEBACiAKIAkgIFNheSBZIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAKK2NvbmZpZyBVTklYX0RJQUcKKwl0cmlzdGF0ZSAiVU5JWDogc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlIgorCWRlcGVuZHMgb24gVU5JWAorCWRlZmF1bHQgVU5JWAorCS0tLWhlbHAtLS0KKwkgIFN1cHBvcnQgZm9yIFVOSVggc29ja2V0IG1vbml0b3JpbmcgaW50ZXJmYWNlIHVzZWQgYnkgdGhlIHNzIHRvb2wuCisJICBJZiB1bnN1cmUsIHNheSBZLgpkaWZmIC0tZ2l0IGEvbmV0L3VuaXgvTWFrZWZpbGUgYi9uZXQvdW5peC9NYWtlZmlsZQppbmRleCBiODUyYTJiLi5iNjYzYzYwIDEwMDY0NAotLS0gYS9uZXQvdW5peC9NYWtlZmlsZQorKysgYi9uZXQvdW5peC9NYWtlZmlsZQpAQCAtNiwzICs2LDYgQEAKIAogdW5peC15CQkJOj0gYWZfdW5peC5vIGdhcmJhZ2UubwogdW5peC0kKENPTkZJR19TWVNDVEwpCSs9IHN5c2N0bF9uZXRfdW5peC5vCisKK29iai0kKENPTkZJR19VTklYX0RJQUcpCSs9IHVuaXhfZGlhZy5vCit1bml4X2RpYWcteQkJOj0gZGlhZy5vCmRpZmYgLS1naXQgYS9uZXQvdW5peC9hZl91bml4LmMgYi9uZXQvdW5peC9hZl91bml4LmMKaW5kZXggNDY2ZmJjYy4uN2NjM2Q3YiAxMDA2NDQKLS0tIGEvbmV0L3VuaXgvYWZfdW5peC5jCisrKyBiL25ldC91bml4L2FmX3VuaXguYwpAQCAtMTE1LDggKzExNSwxMCBAQAogI2luY2x1ZGUgPG5ldC9jaGVja3N1bS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CiAKLXN0YXRpYyBzdHJ1Y3QgaGxpc3RfaGVhZCB1bml4X3NvY2tldF90YWJsZVtVTklYX0hBU0hfU0laRSArIDFdOwotc3RhdGljIERFRklORV9TUElOTE9DSyh1bml4X3RhYmxlX2xvY2spOworc3RydWN0IGhsaXN0X2hlYWQgdW5peF9zb2NrZXRfdGFibGVbVU5JWF9IQVNIX1NJWkUgKyAxXTsKK0VYUE9SVF9TWU1CT0xfR1BMKHVuaXhfc29ja2V0X3RhYmxlKTsKK0RFRklORV9TUElOTE9DSyh1bml4X3RhYmxlX2xvY2spOworRVhQT1JUX1NZTUJPTF9HUEwodW5peF90YWJsZV9sb2NrKTsKIHN0YXRpYyBhdG9taWNfbG9uZ190IHVuaXhfbnJfc29ja3M7CiAKICNkZWZpbmUgdW5peF9zb2NrZXRzX3VuYm91bmQJKCZ1bml4X3NvY2tldF90YWJsZVtVTklYX0hBU0hfU0laRV0pCkBAIC0xNzIsNyArMTc0LDcgQEAKIAlyZXR1cm4gc2tiX3F1ZXVlX2xlbigmc2stPnNrX3JlY2VpdmVfcXVldWUpID4gc2stPnNrX21heF9hY2tfYmFja2xvZzsKIH0KIAotc3RhdGljIHN0cnVjdCBzb2NrICp1bml4X3BlZXJfZ2V0KHN0cnVjdCBzb2NrICpzKQorc3RydWN0IHNvY2sgKnVuaXhfcGVlcl9nZXQoc3RydWN0IHNvY2sgKnMpCiB7CiAJc3RydWN0IHNvY2sgKnBlZXI7CiAKQEAgLTE4Myw2ICsxODUsNyBAQAogCXVuaXhfc3RhdGVfdW5sb2NrKHMpOwogCXJldHVybiBwZWVyOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodW5peF9wZWVyX2dldCk7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCB1bml4X3JlbGVhc2VfYWRkcihzdHJ1Y3QgdW5peF9hZGRyZXNzICphZGRyKQogewpAQCAtMTk1Nyw2ICsxOTYwLDcgQEAKIAkJCWlmICgoVU5JWENCKHNrYikucGlkICAhPSBzaW9jYi0+c2NtLT5waWQpIHx8CiAJCQkgICAgKFVOSVhDQihza2IpLmNyZWQgIT0gc2lvY2ItPnNjbS0+Y3JlZCkpIHsKIAkJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYi0+bGVuKTsKIAkJCQlicmVhazsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTE5NzQsNiArMTk3OCw3IEBACiAJCWNodW5rID0gbWluX3QodW5zaWduZWQgaW50LCBza2ItPmxlbiwgc2l6ZSk7CiAJCWlmIChtZW1jcHlfdG9pb3ZlYyhtc2ctPm1zZ19pb3YsIHNrYi0+ZGF0YSwgY2h1bmspKSB7CiAJCQlza2JfcXVldWVfaGVhZCgmc2stPnNrX3JlY2VpdmVfcXVldWUsIHNrYik7CisJCQlzay0+c2tfZGF0YV9yZWFkeShzaywgc2tiLT5sZW4pOwogCQkJaWYgKGNvcGllZCA9PSAwKQogCQkJCWNvcGllZCA9IC1FRkFVTFQ7CiAJCQlicmVhazsKQEAgLTE5OTEsNiArMTk5Niw3IEBACiAJCQkvKiBwdXQgdGhlIHNrYiBiYWNrIGlmIHdlIGRpZG4ndCB1c2UgaXQgdXAuLiAqLwogCQkJaWYgKHNrYi0+bGVuKSB7CiAJCQkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCQkJCXNrLT5za19kYXRhX3JlYWR5KHNrLCBza2ItPmxlbik7CiAJCQkJYnJlYWs7CiAJCQl9CiAKQEAgLTIwMDYsNiArMjAxMiw3IEBACiAKIAkJCS8qIHB1dCBtZXNzYWdlIGJhY2sgYW5kIHJldHVybiAqLwogCQkJc2tiX3F1ZXVlX2hlYWQoJnNrLT5za19yZWNlaXZlX3F1ZXVlLCBza2IpOworCQkJc2stPnNrX2RhdGFfcmVhZHkoc2ssIHNrYi0+bGVuKTsKIAkJCWJyZWFrOwogCQl9CiAJfSB3aGlsZSAoc2l6ZSk7CkBAIC0yMDU4LDYgKzIwNjUsMzYgQEAKIAlyZXR1cm4gMDsKIH0KIAorbG9uZyB1bml4X2lucV9sZW4oc3RydWN0IHNvY2sgKnNrKQoreworCXN0cnVjdCBza19idWZmICpza2I7CisJbG9uZyBhbW91bnQgPSAwOworCisJaWYgKHNrLT5za19zdGF0ZSA9PSBUQ1BfTElTVEVOKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9jaygmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJaWYgKHNrLT5za190eXBlID09IFNPQ0tfU1RSRUFNIHx8CisJICAgIHNrLT5za190eXBlID09IFNPQ0tfU0VRUEFDS0VUKSB7CisJCXNrYl9xdWV1ZV93YWxrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKQorCQkJYW1vdW50ICs9IHNrYi0+bGVuOworCX0gZWxzZSB7CisJCXNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7CisJCWlmIChza2IpCisJCQlhbW91bnQgPSBza2ItPmxlbjsKKwl9CisJc3Bpbl91bmxvY2soJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCisJcmV0dXJuIGFtb3VudDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVuaXhfaW5xX2xlbik7CisKK2xvbmcgdW5peF9vdXRxX2xlbihzdHJ1Y3Qgc29jayAqc2spCit7CisJcmV0dXJuIHNrX3dtZW1fYWxsb2NfZ2V0KHNrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHVuaXhfb3V0cV9sZW4pOworCiBzdGF0aWMgaW50IHVuaXhfaW9jdGwoc3RydWN0IHNvY2tldCAqc29jaywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCiB7CiAJc3RydWN0IHNvY2sgKnNrID0gc29jay0+c2s7CkBAIC0yMDY2LDMzICsyMTAzLDE2IEBACiAKIAlzd2l0Y2ggKGNtZCkgewogCWNhc2UgU0lPQ09VVFE6Ci0JCWFtb3VudCA9IHNrX3dtZW1fYWxsb2NfZ2V0KHNrKTsKKwkJYW1vdW50ID0gdW5peF9vdXRxX2xlbihzayk7CiAJCWVyciA9IHB1dF91c2VyKGFtb3VudCwgKGludCBfX3VzZXIgKilhcmcpOwogCQlicmVhazsKIAljYXNlIFNJT0NJTlE6Ci0JCXsKLQkJCXN0cnVjdCBza19idWZmICpza2I7Ci0KLQkJCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgewotCQkJCWVyciA9IC1FSU5WQUw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJCXNwaW5fbG9jaygmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7Ci0JCQlpZiAoc2stPnNrX3R5cGUgPT0gU09DS19TVFJFQU0gfHwKLQkJCSAgICBzay0+c2tfdHlwZSA9PSBTT0NLX1NFUVBBQ0tFVCkgewotCQkJCXNrYl9xdWV1ZV93YWxrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKQotCQkJCQlhbW91bnQgKz0gc2tiLT5sZW47Ci0JCQl9IGVsc2UgewotCQkJCXNrYiA9IHNrYl9wZWVrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSk7Ci0JCQkJaWYgKHNrYikKLQkJCQkJYW1vdW50ID0gc2tiLT5sZW47Ci0JCQl9Ci0JCQlzcGluX3VubG9jaygmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJCWFtb3VudCA9IHVuaXhfaW5xX2xlbihzayk7CisJCWlmIChhbW91bnQgPCAwKQorCQkJZXJyID0gYW1vdW50OworCQllbHNlCiAJCQllcnIgPSBwdXRfdXNlcihhbW91bnQsIChpbnQgX191c2VyICopYXJnKTsKLQkJCWJyZWFrOwotCQl9Ci0KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJZXJyID0gLUVOT0lPQ1RMQ01EOwogCQlicmVhazsKZGlmZiAtLWdpdCBhL25ldC91bml4L2RpYWcuYyBiL25ldC91bml4L2RpYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yjc2OTdmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0L3VuaXgvZGlhZy5jCkBAIC0wLDAgKzEsMzI5IEBACisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tfZGlhZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VuaXhfZGlhZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NrYnVmZi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPG5ldC9uZXRsaW5rLmg+CisjaW5jbHVkZSA8bmV0L2FmX3VuaXguaD4KKyNpbmNsdWRlIDxuZXQvdGNwX3N0YXRlcy5oPgorCisjZGVmaW5lIFVOSVhfRElBR19QVVQoc2tiLCBhdHRydHlwZSwgYXR0cmxlbikgXAorCVJUQV9EQVRBKF9fUlRBX1BVVChza2IsIGF0dHJ0eXBlLCBhdHRybGVuKSkKKworc3RhdGljIGludCBza19kaWFnX2R1bXBfbmFtZShzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpubHNrYikKK3sKKwlzdHJ1Y3QgdW5peF9hZGRyZXNzICphZGRyID0gdW5peF9zayhzayktPmFkZHI7CisJY2hhciAqczsKKworCWlmIChhZGRyKSB7CisJCXMgPSBVTklYX0RJQUdfUFVUKG5sc2tiLCBVTklYX0RJQUdfTkFNRSwgYWRkci0+bGVuIC0gc2l6ZW9mKHNob3J0KSk7CisJCW1lbWNweShzLCBhZGRyLT5uYW1lLT5zdW5fcGF0aCwgYWRkci0+bGVuIC0gc2l6ZW9mKHNob3J0KSk7CisJfQorCisJcmV0dXJuIDA7CisKK3J0YXR0cl9mYWlsdXJlOgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgc2tfZGlhZ19kdW1wX3ZmcyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpubHNrYikKK3sKKwlzdHJ1Y3QgZGVudHJ5ICpkZW50cnkgPSB1bml4X3NrKHNrKS0+ZGVudHJ5OworCXN0cnVjdCB1bml4X2RpYWdfdmZzICp1djsKKworCWlmIChkZW50cnkpIHsKKwkJdXYgPSBVTklYX0RJQUdfUFVUKG5sc2tiLCBVTklYX0RJQUdfVkZTLCBzaXplb2YoKnV2KSk7CisJCXV2LT51ZGlhZ192ZnNfaW5vID0gZGVudHJ5LT5kX2lub2RlLT5pX2lubzsKKwkJdXYtPnVkaWFnX3Zmc19kZXYgPSBkZW50cnktPmRfc2ItPnNfZGV2OworCX0KKworCXJldHVybiAwOworCitydGF0dHJfZmFpbHVyZToKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IHNrX2RpYWdfZHVtcF9wZWVyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKm5sc2tiKQoreworCXN0cnVjdCBzb2NrICpwZWVyOworCWludCBpbm87CisKKwlwZWVyID0gdW5peF9wZWVyX2dldChzayk7CisJaWYgKHBlZXIpIHsKKwkJdW5peF9zdGF0ZV9sb2NrKHBlZXIpOworCQlpbm8gPSBzb2NrX2lfaW5vKHBlZXIpOworCQl1bml4X3N0YXRlX3VubG9jayhwZWVyKTsKKwkJc29ja19wdXQocGVlcik7CisKKwkJUlRBX1BVVF9VMzIobmxza2IsIFVOSVhfRElBR19QRUVSLCBpbm8pOworCX0KKworCXJldHVybiAwOworcnRhdHRyX2ZhaWx1cmU6CisJcmV0dXJuIC1FTVNHU0laRTsKK30KKworc3RhdGljIGludCBza19kaWFnX2R1bXBfaWNvbnMoc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2tfYnVmZiAqbmxza2IpCit7CisJc3RydWN0IHNrX2J1ZmYgKnNrYjsKKwl1MzIgKmJ1ZjsKKwlpbnQgaTsKKworCWlmIChzay0+c2tfc3RhdGUgPT0gVENQX0xJU1RFTikgeworCQlzcGluX2xvY2soJnNrLT5za19yZWNlaXZlX3F1ZXVlLmxvY2spOworCQlidWYgPSBVTklYX0RJQUdfUFVUKG5sc2tiLCBVTklYX0RJQUdfSUNPTlMsCisJCQkJc2stPnNrX3JlY2VpdmVfcXVldWUucWxlbiAqIHNpemVvZih1MzIpKTsKKwkJaSA9IDA7CisJCXNrYl9xdWV1ZV93YWxrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZSwgc2tiKSB7CisJCQlzdHJ1Y3Qgc29jayAqcmVxLCAqcGVlcjsKKworCQkJcmVxID0gc2tiLT5zazsKKwkJCS8qCisJCQkgKiBUaGUgc3RhdGUgbG9jayBpcyBvdXRlciBmb3IgdGhlIHNhbWUgc2sncworCQkJICogcXVldWUgbG9jay4gV2l0aCB0aGUgb3RoZXIncyBxdWV1ZSBsb2NrZWQgaXQncworCQkJICogT0sgdG8gbG9jayB0aGUgc3RhdGUuCisJCQkgKi8KKwkJCXVuaXhfc3RhdGVfbG9ja19uZXN0ZWQocmVxKTsKKwkJCXBlZXIgPSB1bml4X3NrKHJlcSktPnBlZXI7CisJCQlidWZbaSsrXSA9IChwZWVyID8gc29ja19pX2lubyhwZWVyKSA6IDApOworCQkJdW5peF9zdGF0ZV91bmxvY2socmVxKTsKKwkJfQorCQlzcGluX3VubG9jaygmc2stPnNrX3JlY2VpdmVfcXVldWUubG9jayk7CisJfQorCisJcmV0dXJuIDA7CisKK3J0YXR0cl9mYWlsdXJlOgorCXNwaW5fdW5sb2NrKCZzay0+c2tfcmVjZWl2ZV9xdWV1ZS5sb2NrKTsKKwlyZXR1cm4gLUVNU0dTSVpFOworfQorCitzdGF0aWMgaW50IHNrX2RpYWdfc2hvd19ycWxlbihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBza19idWZmICpubHNrYikKK3sKKwlzdHJ1Y3QgdW5peF9kaWFnX3JxbGVuICpycWw7CisKKwlycWwgPSBVTklYX0RJQUdfUFVUKG5sc2tiLCBVTklYX0RJQUdfUlFMRU4sIHNpemVvZigqcnFsKSk7CisKKwlpZiAoc2stPnNrX3N0YXRlID09IFRDUF9MSVNURU4pIHsKKwkJcnFsLT51ZGlhZ19ycXVldWUgPSBzay0+c2tfcmVjZWl2ZV9xdWV1ZS5xbGVuOworCQlycWwtPnVkaWFnX3dxdWV1ZSA9IHNrLT5za19tYXhfYWNrX2JhY2tsb2c7CisJfSBlbHNlIHsKKwkJcnFsLT51ZGlhZ19ycXVldWUgPSAoX191MzIpdW5peF9pbnFfbGVuKHNrKTsKKwkJcnFsLT51ZGlhZ193cXVldWUgPSAoX191MzIpdW5peF9vdXRxX2xlbihzayk7CisJfQorCisJcmV0dXJuIDA7CisKK3J0YXR0cl9mYWlsdXJlOgorCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgc2tfZGlhZ19maWxsKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVuaXhfZGlhZ19yZXEgKnJlcSwKKwkJdTMyIHBpZCwgdTMyIHNlcSwgdTMyIGZsYWdzLCBpbnQgc2tfaW5vKQoreworCXVuc2lnbmVkIGNoYXIgKmIgPSBza2JfdGFpbF9wb2ludGVyKHNrYik7CisJc3RydWN0IG5sbXNnaGRyICpubGg7CisJc3RydWN0IHVuaXhfZGlhZ19tc2cgKnJlcDsKKworCW5saCA9IE5MTVNHX1BVVChza2IsIHBpZCwgc2VxLCBTT0NLX0RJQUdfQllfRkFNSUxZLCBzaXplb2YoKnJlcCkpOworCW5saC0+bmxtc2dfZmxhZ3MgPSBmbGFnczsKKworCXJlcCA9IE5MTVNHX0RBVEEobmxoKTsKKworCXJlcC0+dWRpYWdfZmFtaWx5ID0gQUZfVU5JWDsKKwlyZXAtPnVkaWFnX3R5cGUgPSBzay0+c2tfdHlwZTsKKwlyZXAtPnVkaWFnX3N0YXRlID0gc2stPnNrX3N0YXRlOworCXJlcC0+dWRpYWdfaW5vID0gc2tfaW5vOworCXNvY2tfZGlhZ19zYXZlX2Nvb2tpZShzaywgcmVwLT51ZGlhZ19jb29raWUpOworCisJaWYgKChyZXEtPnVkaWFnX3Nob3cgJiBVRElBR19TSE9XX05BTUUpICYmCisJICAgIHNrX2RpYWdfZHVtcF9uYW1lKHNrLCBza2IpKQorCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CisKKwlpZiAoKHJlcS0+dWRpYWdfc2hvdyAmIFVESUFHX1NIT1dfVkZTKSAmJgorCSAgICBza19kaWFnX2R1bXBfdmZzKHNrLCBza2IpKQorCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CisKKwlpZiAoKHJlcS0+dWRpYWdfc2hvdyAmIFVESUFHX1NIT1dfUEVFUikgJiYKKwkgICAgc2tfZGlhZ19kdW1wX3BlZXIoc2ssIHNrYikpCisJCWdvdG8gbmxtc2dfZmFpbHVyZTsKKworCWlmICgocmVxLT51ZGlhZ19zaG93ICYgVURJQUdfU0hPV19JQ09OUykgJiYKKwkgICAgc2tfZGlhZ19kdW1wX2ljb25zKHNrLCBza2IpKQorCQlnb3RvIG5sbXNnX2ZhaWx1cmU7CisKKwlpZiAoKHJlcS0+dWRpYWdfc2hvdyAmIFVESUFHX1NIT1dfUlFMRU4pICYmCisJICAgIHNrX2RpYWdfc2hvd19ycWxlbihzaywgc2tiKSkKKwkJZ290byBubG1zZ19mYWlsdXJlOworCisJaWYgKChyZXEtPnVkaWFnX3Nob3cgJiBVRElBR19TSE9XX01FTUlORk8pICYmCisJICAgIHNvY2tfZGlhZ19wdXRfbWVtaW5mbyhzaywgc2tiLCBVTklYX0RJQUdfTUVNSU5GTykpCisJCWdvdG8gbmxtc2dfZmFpbHVyZTsKKworCW5saC0+bmxtc2dfbGVuID0gc2tiX3RhaWxfcG9pbnRlcihza2IpIC0gYjsKKwlyZXR1cm4gc2tiLT5sZW47CisKK25sbXNnX2ZhaWx1cmU6CisJbmxtc2dfdHJpbShza2IsIGIpOworCXJldHVybiAtRU1TR1NJWkU7Cit9CisKK3N0YXRpYyBpbnQgc2tfZGlhZ19kdW1wKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IHVuaXhfZGlhZ19yZXEgKnJlcSwKKwkJdTMyIHBpZCwgdTMyIHNlcSwgdTMyIGZsYWdzKQoreworCWludCBza19pbm87CisKKwl1bml4X3N0YXRlX2xvY2soc2spOworCXNrX2lubyA9IHNvY2tfaV9pbm8oc2spOworCXVuaXhfc3RhdGVfdW5sb2NrKHNrKTsKKworCWlmICghc2tfaW5vKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBza19kaWFnX2ZpbGwoc2ssIHNrYiwgcmVxLCBwaWQsIHNlcSwgZmxhZ3MsIHNrX2lubyk7Cit9CisKK3N0YXRpYyBpbnQgdW5peF9kaWFnX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQoreworCXN0cnVjdCB1bml4X2RpYWdfcmVxICpyZXE7CisJaW50IG51bSwgc19udW0sIHNsb3QsIHNfc2xvdDsKKworCXJlcSA9IE5MTVNHX0RBVEEoY2ItPm5saCk7CisKKwlzX3Nsb3QgPSBjYi0+YXJnc1swXTsKKwludW0gPSBzX251bSA9IGNiLT5hcmdzWzFdOworCisJc3Bpbl9sb2NrKCZ1bml4X3RhYmxlX2xvY2spOworCWZvciAoc2xvdCA9IHNfc2xvdDsgc2xvdCA8PSBVTklYX0hBU0hfU0laRTsgc19udW0gPSAwLCBzbG90KyspIHsKKwkJc3RydWN0IHNvY2sgKnNrOworCQlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCQludW0gPSAwOworCQlza19mb3JfZWFjaChzaywgbm9kZSwgJnVuaXhfc29ja2V0X3RhYmxlW3Nsb3RdKSB7CisJCQlpZiAobnVtIDwgc19udW0pCisJCQkJZ290byBuZXh0OworCQkJaWYgKCEocmVxLT51ZGlhZ19zdGF0ZXMgJiAoMSA8PCBzay0+c2tfc3RhdGUpKSkKKwkJCQlnb3RvIG5leHQ7CisJCQlpZiAoc2tfZGlhZ19kdW1wKHNrLCBza2IsIHJlcSwKKwkJCQkJIE5FVExJTktfQ0IoY2ItPnNrYikucGlkLAorCQkJCQkgY2ItPm5saC0+bmxtc2dfc2VxLAorCQkJCQkgTkxNX0ZfTVVMVEkpIDwgMCkKKwkJCQlnb3RvIGRvbmU7CituZXh0OgorCQkJbnVtKys7CisJCX0KKwl9Citkb25lOgorCXNwaW5fdW5sb2NrKCZ1bml4X3RhYmxlX2xvY2spOworCWNiLT5hcmdzWzBdID0gc2xvdDsKKwljYi0+YXJnc1sxXSA9IG51bTsKKworCXJldHVybiBza2ItPmxlbjsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrICp1bml4X2xvb2t1cF9ieV9pbm8oaW50IGlubykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3Qgc29jayAqc2s7CisKKwlzcGluX2xvY2soJnVuaXhfdGFibGVfbG9jayk7CisJZm9yIChpID0gMDsgaSA8PSBVTklYX0hBU0hfU0laRTsgaSsrKSB7CisJCXN0cnVjdCBobGlzdF9ub2RlICpub2RlOworCisJCXNrX2Zvcl9lYWNoKHNrLCBub2RlLCAmdW5peF9zb2NrZXRfdGFibGVbaV0pCisJCQlpZiAoaW5vID09IHNvY2tfaV9pbm8oc2spKSB7CisJCQkJc29ja19ob2xkKHNrKTsKKwkJCQlzcGluX3VubG9jaygmdW5peF90YWJsZV9sb2NrKTsKKworCQkJCXJldHVybiBzazsKKwkJCX0KKwl9CisKKwlzcGluX3VubG9jaygmdW5peF90YWJsZV9sb2NrKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCB1bml4X2RpYWdfZ2V0X2V4YWN0KHN0cnVjdCBza19idWZmICppbl9za2IsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IG5sbXNnaGRyICpubGgsCisJCQkgICAgICAgc3RydWN0IHVuaXhfZGlhZ19yZXEgKnJlcSkKK3sKKwlpbnQgZXJyID0gLUVJTlZBTDsKKwlzdHJ1Y3Qgc29jayAqc2s7CisJc3RydWN0IHNrX2J1ZmYgKnJlcDsKKwl1bnNpZ25lZCBpbnQgZXh0cmFfbGVuOworCisJaWYgKHJlcS0+dWRpYWdfaW5vID09IDApCisJCWdvdG8gb3V0X25vc2s7CisKKwlzayA9IHVuaXhfbG9va3VwX2J5X2lubyhyZXEtPnVkaWFnX2lubyk7CisJZXJyID0gLUVOT0VOVDsKKwlpZiAoc2sgPT0gTlVMTCkKKwkJZ290byBvdXRfbm9zazsKKworCWVyciA9IHNvY2tfZGlhZ19jaGVja19jb29raWUoc2ssIHJlcS0+dWRpYWdfY29va2llKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dDsKKworCWV4dHJhX2xlbiA9IDI1NjsKK2FnYWluOgorCWVyciA9IC1FTk9NRU07CisJcmVwID0gYWxsb2Nfc2tiKE5MTVNHX1NQQUNFKChzaXplb2Yoc3RydWN0IHVuaXhfZGlhZ19tc2cpICsgZXh0cmFfbGVuKSksCisJCQlHRlBfS0VSTkVMKTsKKwlpZiAoIXJlcCkKKwkJZ290byBvdXQ7CisKKwllcnIgPSBza19kaWFnX2ZpbGwoc2ssIHJlcCwgcmVxLCBORVRMSU5LX0NCKGluX3NrYikucGlkLAorCQkJICAgbmxoLT5ubG1zZ19zZXEsIDAsIHJlcS0+dWRpYWdfaW5vKTsKKwlpZiAoZXJyIDwgMCkgeworCQlrZnJlZV9za2IocmVwKTsKKwkJZXh0cmFfbGVuICs9IDI1NjsKKwkJaWYgKGV4dHJhX2xlbiA+PSBQQUdFX1NJWkUpCisJCQlnb3RvIG91dDsKKworCQlnb3RvIGFnYWluOworCX0KKwllcnIgPSBuZXRsaW5rX3VuaWNhc3Qoc29ja19kaWFnX25sc2ssIHJlcCwgTkVUTElOS19DQihpbl9za2IpLnBpZCwKKwkJCSAgICAgIE1TR19ET05UV0FJVCk7CisJaWYgKGVyciA+IDApCisJCWVyciA9IDA7CitvdXQ6CisJaWYgKHNrKQorCQlzb2NrX3B1dChzayk7CitvdXRfbm9zazoKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IHVuaXhfZGlhZ19oYW5kbGVyX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IG5sbXNnaGRyICpoKQoreworCWludCBoZHJsZW4gPSBzaXplb2Yoc3RydWN0IHVuaXhfZGlhZ19yZXEpOworCisJaWYgKG5sbXNnX2xlbihoKSA8IGhkcmxlbikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaC0+bmxtc2dfZmxhZ3MgJiBOTE1fRl9EVU1QKQorCQlyZXR1cm4gbmV0bGlua19kdW1wX3N0YXJ0KHNvY2tfZGlhZ19ubHNrLCBza2IsIGgsCisJCQkJCSAgdW5peF9kaWFnX2R1bXAsIE5VTEwsIDApOworCWVsc2UKKwkJcmV0dXJuIHVuaXhfZGlhZ19nZXRfZXhhY3Qoc2tiLCBoLCAoc3RydWN0IHVuaXhfZGlhZ19yZXEgKilOTE1TR19EQVRBKGgpKTsKK30KKworc3RhdGljIHN0cnVjdCBzb2NrX2RpYWdfaGFuZGxlciB1bml4X2RpYWdfaGFuZGxlciA9IHsKKwkuZmFtaWx5ID0gQUZfVU5JWCwKKwkuZHVtcCA9IHVuaXhfZGlhZ19oYW5kbGVyX2R1bXAsCit9OworCitzdGF0aWMgaW50IF9faW5pdCB1bml4X2RpYWdfaW5pdCh2b2lkKQoreworCXJldHVybiBzb2NrX2RpYWdfcmVnaXN0ZXIoJnVuaXhfZGlhZ19oYW5kbGVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVuaXhfZGlhZ19leGl0KHZvaWQpCit7CisJc29ja19kaWFnX3VucmVnaXN0ZXIoJnVuaXhfZGlhZ19oYW5kbGVyKTsKK30KKworbW9kdWxlX2luaXQodW5peF9kaWFnX2luaXQpOworbW9kdWxlX2V4aXQodW5peF9kaWFnX2V4aXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTX05FVF9QRl9QUk9UT19UWVBFKFBGX05FVExJTkssIE5FVExJTktfU09DS19ESUFHLCAxIC8qIEFGX0xPQ0FMICovKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9LY29uZmlnIGIvbmV0L3dpcmVsZXNzL0tjb25maWcKaW5kZXggMWYxZWY3MC4uMmU0NDQ0ZiAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL0tjb25maWcKKysrIGIvbmV0L3dpcmVsZXNzL0tjb25maWcKQEAgLTEyMSwxNSArMTIxLDE2IEBACiAKIGNvbmZpZyBXSVJFTEVTU19FWFRfU1lTRlMKIAlib29sICJXaXJlbGVzcyBleHRlbnNpb25zIHN5c2ZzIGZpbGVzIgotCWRlZmF1bHQgeQogCWRlcGVuZHMgb24gV0VYVF9DT1JFICYmIFNZU0ZTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gZW5hYmxlcyB0aGUgZGVwcmVjYXRlZCB3aXJlbGVzcyBzdGF0aXN0aWNzCiAJICBmaWxlcyBpbiAvc3lzL2NsYXNzL25ldC8qL3dpcmVsZXNzLy4gVGhlIHNhbWUgaW5mb3JtYXRpb24KIAkgIGlzIGF2YWlsYWJsZSB2aWEgdGhlIGlvY3RscyBhcyB3ZWxsLgogCi0JICBTYXkgWSBpZiB5b3UgaGF2ZSBwcm9ncmFtcyB1c2luZyBpdCwgbGlrZSBvbGQgdmVyc2lvbnMgb2YKLQkgIGhhbC4KKwkgIFNheSBOLiBJZiB5b3Uga25vdyB5b3UgaGF2ZSBhbmNpZW50IHRvb2xzIHJlcXVpcmluZyBpdCwKKwkgIGxpa2UgdmVyeSBvbGQgdmVyc2lvbnMgb2YgaGFsIChwcmlvciB0byAwLjUuMTIgcmVsZWFzZSksCisJICBzYXkgWSBhbmQgdXBkYXRlIHRoZSB0b29scyBhcyBzb29uIGFzIHBvc3NpYmxlIGFzIHRoaXMKKwkgIG9wdGlvbiB3aWxsIGJlIHJlbW92ZWQgc29vbi4KIAogY29uZmlnIExJQjgwMjExCiAJdHJpc3RhdGUgIkNvbW1vbiByb3V0aW5lcyBmb3IgSUVFRTgwMi4xMSBkcml2ZXJzIgpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NoYW4uYyBiL25ldC93aXJlbGVzcy9jaGFuLmMKaW5kZXggMTdjZDBjMC4uMmZjZmUwOSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NoYW4uYworKysgYi9uZXQvd2lyZWxlc3MvY2hhbi5jCkBAIC02LDYgKzYsNyBAQAogICogQ29weXJpZ2h0IDIwMDkJSm9oYW5uZXMgQmVyZyA8am9oYW5uZXNAc2lwc29sdXRpb25zLm5ldD4KICAqLwogCisjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+CiAjaW5jbHVkZSA8bmV0L2NmZzgwMjExLmg+CiAjaW5jbHVkZSAiY29yZS5oIgogCkBAIC00NCw5ICs0NSw5IEBACiAJcmV0dXJuIGNoYW47CiB9CiAKLXN0YXRpYyBib29sIGNhbl9iZWFjb25fc2VjX2NoYW4oc3RydWN0IHdpcGh5ICp3aXBoeSwKLQkJCQlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW4sCi0JCQkJZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUpCitpbnQgY2ZnODAyMTFfY2FuX2JlYWNvbl9zZWNfY2hhbihzdHJ1Y3Qgd2lwaHkgKndpcGh5LAorCQkJCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAorCQkJCSAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUpCiB7CiAJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpzZWNfY2hhbjsKIAlpbnQgZGlmZjsKQEAgLTc1LDYgKzc2LDcgQEAKIAogCXJldHVybiB0cnVlOwogfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9jYW5fYmVhY29uX3NlY19jaGFuKTsKIAogaW50IGNmZzgwMjExX3NldF9mcmVxKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJICAgICAgc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwgaW50IGZyZXEsCkBAIC0xMDksOCArMTExLDggQEAKIAkJc3dpdGNoIChjaGFubmVsX3R5cGUpIHsKIAkJY2FzZSBOTDgwMjExX0NIQU5fSFQ0MFBMVVM6CiAJCWNhc2UgTkw4MDIxMV9DSEFOX0hUNDBNSU5VUzoKLQkJCWlmICghY2FuX2JlYWNvbl9zZWNfY2hhbigmcmRldi0+d2lwaHksIGNoYW4sCi0JCQkJCQkgY2hhbm5lbF90eXBlKSkgeworCQkJaWYgKCFjZmc4MDIxMV9jYW5fYmVhY29uX3NlY19jaGFuKCZyZGV2LT53aXBoeSwgY2hhbiwKKwkJCQkJCQkgIGNoYW5uZWxfdHlwZSkpIHsKIAkJCQlwcmludGsoS0VSTl9ERUJVRwogCQkJCSAgICAgICAiY2ZnODAyMTE6IFNlY29uZGFyeSBjaGFubmVsIG5vdCAiCiAJCQkJICAgICAgICJhbGxvd2VkIHRvIGluaXRpYXRlIGNvbW11bmljYXRpb25cbiIpOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuYyBiL25ldC93aXJlbGVzcy9jb3JlLmMKaW5kZXggMjIwZjNiZC4uY2NkZmVkOCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NvcmUuYworKysgYi9uZXQvd2lyZWxlc3MvY29yZS5jCkBAIC00OTIsNiArNDkyLDEwIEBACiAJCSAgICAhKHdpcGh5LT53b3dsYW4uZmxhZ3MgJiBXSVBIWV9XT1dMQU5fU1VQUE9SVFNfR1RLX1JFS0VZKSkpCiAJCXJldHVybiAtRUlOVkFMOwogCisJaWYgKFdBUk5fT04od2lwaHktPmFwX3NtZV9jYXBhICYmCisJCSAgICAhKHdpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfSEFWRV9BUF9TTUUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAlpZiAoV0FSTl9PTih3aXBoeS0+YWRkcmVzc2VzICYmICF3aXBoeS0+bl9hZGRyZXNzZXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL2NvcmUuaCBiL25ldC93aXJlbGVzcy9jb3JlLmgKaW5kZXggYjllYzMwNi4uNDNhZDljOCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL2NvcmUuaAorKysgYi9uZXQvd2lyZWxlc3MvY29yZS5oCkBAIC01NCw2ICs1NCw4IEBACiAJaW50IG9wZW5jb3VudDsgLyogYWxzbyBwcm90ZWN0ZWQgYnkgZGV2bGlzdF9tdHggKi8KIAl3YWl0X3F1ZXVlX2hlYWRfdCBkZXZfd2FpdDsKIAorCXUzMiBhcF9iZWFjb25zX25scGlkOworCiAJLyogQlNTZXMvc2Nhbm5pbmcgKi8KIAlzcGlubG9ja190IGJzc19sb2NrOwogCXN0cnVjdCBsaXN0X2hlYWQgYnNzX2xpc3Q7CkBAIC0yNDcsMTIgKzI0OSwxMSBAQAogCQkJdTE2IHN0YXR1czsKIAkJfSBjcjsKIAkJc3RydWN0IHsKLQkJCXN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbDsKLQkJCXU4IGJzc2lkW0VUSF9BTEVOXTsKIAkJCWNvbnN0IHU4ICpyZXFfaWU7CiAJCQljb25zdCB1OCAqcmVzcF9pZTsKIAkJCXNpemVfdCByZXFfaWVfbGVuOwogCQkJc2l6ZV90IHJlc3BfaWVfbGVuOworCQkJc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwogCQl9IHJtOwogCQlzdHJ1Y3QgewogCQkJY29uc3QgdTggKmllOwpAQCAtMzM5LDEzICszNDAsMTcgQEAKIAkJCSAgY29uc3QgdTggKmJzc2lkLCBjb25zdCB1OCAqcHJldl9ic3NpZCwKIAkJCSAgY29uc3QgdTggKnNzaWQsIGludCBzc2lkX2xlbiwKIAkJCSAgY29uc3QgdTggKmllLCBpbnQgaWVfbGVuLCBib29sIHVzZV9tZnAsCi0JCQkgIHN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgKmNyeXB0KTsKKwkJCSAgc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQsCisJCQkgIHUzMiBhc3NvY19mbGFncywgc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGEsCisJCQkgIHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhX21hc2spOwogaW50IGNmZzgwMjExX21sbWVfYXNzb2Moc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAogCQkJY29uc3QgdTggKmJzc2lkLCBjb25zdCB1OCAqcHJldl9ic3NpZCwKIAkJCWNvbnN0IHU4ICpzc2lkLCBpbnQgc3NpZF9sZW4sCiAJCQljb25zdCB1OCAqaWUsIGludCBpZV9sZW4sIGJvb2wgdXNlX21mcCwKLQkJCXN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgKmNyeXB0KTsKKwkJCXN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgKmNyeXB0LAorCQkJdTMyIGFzc29jX2ZsYWdzLCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYSwKKwkJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhX21hc2spOwogaW50IF9fY2ZnODAyMTFfbWxtZV9kZWF1dGgoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKmJzc2lkLAogCQkJICAgY29uc3QgdTggKmllLCBpbnQgaWVfbGVuLCB1MTYgcmVhc29uLApAQCAtMzc2LDcgKzM4MSw5IEBACiAJCQkgIGVudW0gbmw4MDIxMV9jaGFubmVsX3R5cGUgY2hhbm5lbF90eXBlLAogCQkJICBib29sIGNoYW5uZWxfdHlwZV92YWxpZCwgdW5zaWduZWQgaW50IHdhaXQsCiAJCQkgIGNvbnN0IHU4ICpidWYsIHNpemVfdCBsZW4sIGJvb2wgbm9fY2NrLAotCQkJICB1NjQgKmNvb2tpZSk7CisJCQkgIGJvb2wgZG9udF93YWl0X2Zvcl9hY2ssIHU2NCAqY29va2llKTsKK3ZvaWQgY2ZnODAyMTFfb3Blcl9hbmRfaHRfY2FwYShzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYSwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYV9tYXNrKTsKIAogLyogU01FICovCiBpbnQgX19jZmc4MDIxMV9jb25uZWN0KHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKQEAgLTM5NSw4ICs0MDIsNyBAQAogCQkJc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTE2IHJlYXNvbiwKIAkJCWJvb2wgd2V4dGV2KTsKIHZvaWQgX19jZmc4MDIxMV9yb2FtZWQoc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiwKLQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKLQkJICAgICAgIGNvbnN0IHU4ICpic3NpZCwKKwkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9ic3MgKmJzcywKIAkJICAgICAgIGNvbnN0IHU4ICpyZXFfaWUsIHNpemVfdCByZXFfaWVfbGVuLAogCQkgICAgICAgY29uc3QgdTggKnJlc3BfaWUsIHNpemVfdCByZXNwX2llX2xlbik7CiBpbnQgY2ZnODAyMTFfbWdkX3dleHRfY29ubmVjdChzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYsCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvZ2VucmVnZGIuYXdrIGIvbmV0L3dpcmVsZXNzL2dlbnJlZ2RiLmF3awppbmRleCA1M2MxNDNmLi45MzkyZjhjIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvZ2VucmVnZGIuYXdrCisrKyBiL25ldC93aXJlbGVzcy9nZW5yZWdkYi5hd2sKQEAgLTcsMTAgKzcsMTcgQEAKICMKICMgQ29weXJpZ2h0IDIwMDkgSm9obiBXLiBMaW52aWxsZSA8bGludmlsbGVAdHV4ZHJpdmVyLmNvbT4KICMKLSMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKLSMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisjIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorIyBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisjIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAjCisjIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworIyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisjIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisjIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisjIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisjIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAKIEJFR0lOIHsKIAlhY3RpdmUgPSAwCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvbWVzaC5jIGIvbmV0L3dpcmVsZXNzL21lc2guYwppbmRleCBiN2I3ODY4Li44YzU1MGRmIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvbWVzaC5jCisrKyBiL25ldC93aXJlbGVzcy9tZXNoLmMKQEAgLTIwLDYgKzIwLDcgQEAKICAqIGludGVyZmFjZQogICovCiAjZGVmaW5lIE1FU0hfUFJFUV9NSU5fSU5UCTEwCisjZGVmaW5lIE1FU0hfUEVSUl9NSU5fSU5UCTEwMAogI2RlZmluZSBNRVNIX0RJQU1fVFJBVkVSU0FMX1RJTUUgNTAKIAogLyoKQEAgLTQ3LDYgKzQ4LDcgQEAKIAkuZG90MTFNZXNoTWF4UGVlckxpbmtzID0gTUVTSF9NQVhfRVNUQUJfUExJTktTLAogCS5kb3QxMU1lc2hIV01QYWN0aXZlUGF0aFRpbWVvdXQgPSBNRVNIX1BBVEhfVElNRU9VVCwKIAkuZG90MTFNZXNoSFdNUHByZXFNaW5JbnRlcnZhbCA9IE1FU0hfUFJFUV9NSU5fSU5ULAorCS5kb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsID0gTUVTSF9QRVJSX01JTl9JTlQsCiAJLmRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUgPSBNRVNIX0RJQU1fVFJBVkVSU0FMX1RJTUUsCiAJLmRvdDExTWVzaEhXTVBtYXhQUkVRcmV0cmllcyA9IE1FU0hfTUFYX1BSRVFfUkVUUklFUywKIAkucGF0aF9yZWZyZXNoX3RpbWUgPSBNRVNIX1BBVEhfUkVGUkVTSF9USU1FLApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL21sbWUuYyBiL25ldC93aXJlbGVzcy9tbG1lLmMKaW5kZXggMjFmYzk3MC4uNDM4ZGZjMSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL21sbWUuYworKysgYi9uZXQvd2lyZWxlc3MvbWxtZS5jCkBAIC01MDEsMTMgKzUwMSwzMiBAQAogCXJldHVybiBlcnI7CiB9CiAKKy8qICBEbyBhIGxvZ2ljYWwgaHRfY2FwYSAmPSBodF9jYXBhX21hc2suICAqLwordm9pZCBjZmc4MDIxMV9vcGVyX2FuZF9odF9jYXBhKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhLAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhX21hc2spCit7CisJaW50IGk7CisJdTggKnAxLCAqcDI7CisJaWYgKCFodF9jYXBhX21hc2spIHsKKwkJbWVtc2V0KGh0X2NhcGEsIDAsIHNpemVvZigqaHRfY2FwYSkpOworCQlyZXR1cm47CisJfQorCisJcDEgPSAodTgqKShodF9jYXBhKTsKKwlwMiA9ICh1OCopKGh0X2NhcGFfbWFzayk7CisJZm9yIChpID0gMDsgaTxzaXplb2YoKmh0X2NhcGEpOyBpKyspCisJCXAxW2ldICY9IHAyW2ldOworfQorCiBpbnQgX19jZmc4MDIxMV9tbG1lX2Fzc29jKHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiwKIAkJCSAgc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKIAkJCSAgc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuLAogCQkJICBjb25zdCB1OCAqYnNzaWQsIGNvbnN0IHU4ICpwcmV2X2Jzc2lkLAogCQkJICBjb25zdCB1OCAqc3NpZCwgaW50IHNzaWRfbGVuLAogCQkJICBjb25zdCB1OCAqaWUsIGludCBpZV9sZW4sIGJvb2wgdXNlX21mcCwKLQkJCSAgc3RydWN0IGNmZzgwMjExX2NyeXB0b19zZXR0aW5ncyAqY3J5cHQpCisJCQkgIHN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgKmNyeXB0LAorCQkJICB1MzIgYXNzb2NfZmxhZ3MsIHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhLAorCQkJICBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYV9tYXNrKQogewogCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CiAJc3RydWN0IGNmZzgwMjExX2Fzc29jX3JlcXVlc3QgcmVxOwpAQCAtNTM3LDYgKzU1NiwxNSBAQAogCW1lbWNweSgmcmVxLmNyeXB0bywgY3J5cHQsIHNpemVvZihyZXEuY3J5cHRvKSk7CiAJcmVxLnVzZV9tZnAgPSB1c2VfbWZwOwogCXJlcS5wcmV2X2Jzc2lkID0gcHJldl9ic3NpZDsKKwlyZXEuZmxhZ3MgPSBhc3NvY19mbGFnczsKKwlpZiAoaHRfY2FwYSkKKwkJbWVtY3B5KCZyZXEuaHRfY2FwYSwgaHRfY2FwYSwgc2l6ZW9mKHJlcS5odF9jYXBhKSk7CisJaWYgKGh0X2NhcGFfbWFzaykKKwkJbWVtY3B5KCZyZXEuaHRfY2FwYV9tYXNrLCBodF9jYXBhX21hc2ssCisJCSAgICAgICBzaXplb2YocmVxLmh0X2NhcGFfbWFzaykpOworCWNmZzgwMjExX29wZXJfYW5kX2h0X2NhcGEoJnJlcS5odF9jYXBhX21hc2ssCisJCQkJICByZGV2LT53aXBoeS5odF9jYXBhX21vZF9tYXNrKTsKKwogCXJlcS5ic3MgPSBjZmc4MDIxMV9nZXRfYnNzKCZyZGV2LT53aXBoeSwgY2hhbiwgYnNzaWQsIHNzaWQsIHNzaWRfbGVuLAogCQkJCSAgIFdMQU5fQ0FQQUJJTElUWV9FU1MsIFdMQU5fQ0FQQUJJTElUWV9FU1MpOwogCWlmICghcmVxLmJzcykgewpAQCAtNTc0LDE0ICs2MDIsMTcgQEAKIAkJCWNvbnN0IHU4ICpic3NpZCwgY29uc3QgdTggKnByZXZfYnNzaWQsCiAJCQljb25zdCB1OCAqc3NpZCwgaW50IHNzaWRfbGVuLAogCQkJY29uc3QgdTggKmllLCBpbnQgaWVfbGVuLCBib29sIHVzZV9tZnAsCi0JCQlzdHJ1Y3QgY2ZnODAyMTFfY3J5cHRvX3NldHRpbmdzICpjcnlwdCkKKwkJCXN0cnVjdCBjZmc4MDIxMV9jcnlwdG9fc2V0dGluZ3MgKmNyeXB0LAorCQkJdTMyIGFzc29jX2ZsYWdzLCBzdHJ1Y3QgaWVlZTgwMjExX2h0X2NhcCAqaHRfY2FwYSwKKwkJCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhX21hc2spCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKIAlpbnQgZXJyOwogCiAJd2Rldl9sb2NrKHdkZXYpOwogCWVyciA9IF9fY2ZnODAyMTFfbWxtZV9hc3NvYyhyZGV2LCBkZXYsIGNoYW4sIGJzc2lkLCBwcmV2X2Jzc2lkLAotCQkJCSAgICBzc2lkLCBzc2lkX2xlbiwgaWUsIGllX2xlbiwgdXNlX21mcCwgY3J5cHQpOworCQkJCSAgICBzc2lkLCBzc2lkX2xlbiwgaWUsIGllX2xlbiwgdXNlX21mcCwgY3J5cHQsCisJCQkJICAgIGFzc29jX2ZsYWdzLCBodF9jYXBhLCBodF9jYXBhX21hc2spOwogCXdkZXZfdW5sb2NrKHdkZXYpOwogCiAJcmV0dXJuIGVycjsKQEAgLTg3OSw2ICs5MTAsOSBAQAogCX0KIAogCXNwaW5fdW5sb2NrX2JoKCZ3ZGV2LT5tZ210X3JlZ2lzdHJhdGlvbnNfbG9jayk7CisKKwlpZiAobmxwaWQgPT0gd2Rldi0+YXBfdW5leHBlY3RlZF9ubHBpZCkKKwkJd2Rldi0+YXBfdW5leHBlY3RlZF9ubHBpZCA9IDA7CiB9CiAKIHZvaWQgY2ZnODAyMTFfbWxtZV9wdXJnZV9yZWdpc3RyYXRpb25zKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYpCkBAIC05MDEsNyArOTM1LDcgQEAKIAkJCSAgZW51bSBubDgwMjExX2NoYW5uZWxfdHlwZSBjaGFubmVsX3R5cGUsCiAJCQkgIGJvb2wgY2hhbm5lbF90eXBlX3ZhbGlkLCB1bnNpZ25lZCBpbnQgd2FpdCwKIAkJCSAgY29uc3QgdTggKmJ1Ziwgc2l6ZV90IGxlbiwgYm9vbCBub19jY2ssCi0JCQkgIHU2NCAqY29va2llKQorCQkJICBib29sIGRvbnRfd2FpdF9mb3JfYWNrLCB1NjQgKmNvb2tpZSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOwogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfbWdtdCAqbWdtdDsKQEAgLTk5Miw3ICsxMDI2LDggQEAKIAkvKiBUcmFuc21pdCB0aGUgQWN0aW9uIGZyYW1lIGFzIHJlcXVlc3RlZCBieSB1c2VyIHNwYWNlICovCiAJcmV0dXJuIHJkZXYtPm9wcy0+bWdtdF90eCgmcmRldi0+d2lwaHksIGRldiwgY2hhbiwgb2ZmY2hhbiwKIAkJCQkgIGNoYW5uZWxfdHlwZSwgY2hhbm5lbF90eXBlX3ZhbGlkLAotCQkJCSAgd2FpdCwgYnVmLCBsZW4sIG5vX2NjaywgY29va2llKTsKKwkJCQkgIHdhaXQsIGJ1ZiwgbGVuLCBub19jY2ssIGRvbnRfd2FpdF9mb3JfYWNrLAorCQkJCSAgY29va2llKTsKIH0KIAogYm9vbCBjZmc4MDIxMV9yeF9tZ210KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGludCBmcmVxLCBjb25zdCB1OCAqYnVmLApAQCAtMTEwNywzICsxMTQyLDMwIEBACiAJbmw4MDIxMV9wbWtzYV9jYW5kaWRhdGVfbm90aWZ5KHJkZXYsIGRldiwgaW5kZXgsIGJzc2lkLCBwcmVhdXRoLCBnZnApOwogfQogRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9wbWtzYV9jYW5kaWRhdGVfbm90aWZ5KTsKKworYm9vbCBjZmc4MDIxMV9yeF9zcHVyaW91c19mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCWNvbnN0IHU4ICphZGRyLCBnZnBfdCBnZnApCit7CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKKworCWlmIChXQVJOX09OKHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJgorCQkgICAgd2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9HTykpCisJCXJldHVybiBmYWxzZTsKKworCXJldHVybiBubDgwMjExX3VuZXhwZWN0ZWRfZnJhbWUoZGV2LCBhZGRyLCBnZnApOworfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9yeF9zcHVyaW91c19mcmFtZSk7CisKK2Jvb2wgY2ZnODAyMTFfcnhfdW5leHBlY3RlZF80YWRkcl9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCQljb25zdCB1OCAqYWRkciwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisKKwlpZiAoV0FSTl9PTih3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKKwkJICAgIHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfR08gJiYKKwkJICAgIHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOKSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0dXJuIG5sODAyMTFfdW5leHBlY3RlZF80YWRkcl9mcmFtZShkZXYsIGFkZHIsIGdmcCk7Cit9CitFWFBPUlRfU1lNQk9MKGNmZzgwMjExX3J4X3VuZXhwZWN0ZWRfNGFkZHJfZnJhbWUpOwpkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYyBiL25ldC93aXJlbGVzcy9ubDgwMjExLmMKaW5kZXggYjNhNDc2Zi4uYjNkM2NmOCAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL25sODAyMTEuYworKysgYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5jCkBAIC00NywyMiArNDcsMjEgQEAKIH07CiAKIC8qIGludGVybmFsIGhlbHBlcjogZ2V0IHJkZXYgYW5kIGRldiAqLwotc3RhdGljIGludCBnZXRfcmRldl9kZXZfYnlfaW5mb19pZmluZGV4KHN0cnVjdCBnZW5sX2luZm8gKmluZm8sCi0JCQkJICAgICAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqKnJkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBuZXRfZGV2aWNlICoqZGV2KQorc3RhdGljIGludCBnZXRfcmRldl9kZXZfYnlfaWZpbmRleChzdHJ1Y3QgbmV0ICpuZXRucywgc3RydWN0IG5sYXR0ciAqKmF0dHJzLAorCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqKnJkZXYsCisJCQkJICAgc3RydWN0IG5ldF9kZXZpY2UgKipkZXYpCiB7Ci0Jc3RydWN0IG5sYXR0ciAqKmF0dHJzID0gaW5mby0+YXR0cnM7CiAJaW50IGlmaW5kZXg7CiAKIAlpZiAoIWF0dHJzW05MODAyMTFfQVRUUl9JRklOREVYXSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKIAlpZmluZGV4ID0gbmxhX2dldF91MzIoYXR0cnNbTkw4MDIxMV9BVFRSX0lGSU5ERVhdKTsKLQkqZGV2ID0gZGV2X2dldF9ieV9pbmRleChnZW5sX2luZm9fbmV0KGluZm8pLCBpZmluZGV4KTsKKwkqZGV2ID0gZGV2X2dldF9ieV9pbmRleChuZXRucywgaWZpbmRleCk7CiAJaWYgKCEqZGV2KQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCSpyZGV2ID0gY2ZnODAyMTFfZ2V0X2Rldl9mcm9tX2lmaW5kZXgoZ2VubF9pbmZvX25ldChpbmZvKSwgaWZpbmRleCk7CisJKnJkZXYgPSBjZmc4MDIxMV9nZXRfZGV2X2Zyb21faWZpbmRleChuZXRucywgaWZpbmRleCk7CiAJaWYgKElTX0VSUigqcmRldikpIHsKIAkJZGV2X3B1dCgqZGV2KTsKIAkJcmV0dXJuIFBUUl9FUlIoKnJkZXYpOwpAQCAtODksOCArODgsOCBAQAogCVtOTDgwMjExX0FUVFJfSUZJTkRFWF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAogCVtOTDgwMjExX0FUVFJfSUZOQU1FXSA9IHsgLnR5cGUgPSBOTEFfTlVMX1NUUklORywgLmxlbiA9IElGTkFNU0laLTEgfSwKIAotCVtOTDgwMjExX0FUVFJfTUFDXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCAubGVuID0gRVRIX0FMRU4gfSwKLQlbTkw4MDIxMV9BVFRSX1BSRVZfQlNTSURdID0geyAudHlwZSA9IE5MQV9CSU5BUlksIC5sZW4gPSBFVEhfQUxFTiB9LAorCVtOTDgwMjExX0FUVFJfTUFDXSA9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCisJW05MODAyMTFfQVRUUl9QUkVWX0JTU0lEXSA9IHsgLmxlbiA9IEVUSF9BTEVOIH0sCiAKIAlbTkw4MDIxMV9BVFRSX0tFWV0gPSB7IC50eXBlID0gTkxBX05FU1RFRCwgfSwKIAlbTkw4MDIxMV9BVFRSX0tFWV9EQVRBXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLApAQCAtOTgsNyArOTcsNyBAQAogCVtOTDgwMjExX0FUVFJfS0VZX0lEWF0gPSB7IC50eXBlID0gTkxBX1U4IH0sCiAJW05MODAyMTFfQVRUUl9LRVlfQ0lQSEVSXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW05MODAyMTFfQVRUUl9LRVlfREVGQVVMVF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKLQlbTkw4MDIxMV9BVFRSX0tFWV9TRVFdID0geyAudHlwZSA9IE5MQV9CSU5BUlksIC5sZW4gPSA4IH0sCisJW05MODAyMTFfQVRUUl9LRVlfU0VRXSA9IHsgLnR5cGUgPSBOTEFfQklOQVJZLCAubGVuID0gMTYgfSwKIAlbTkw4MDIxMV9BVFRSX0tFWV9UWVBFXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAKIAlbTkw4MDIxMV9BVFRSX0JFQUNPTl9JTlRFUlZBTF0gPSB7IC50eXBlID0gTkxBX1UzMiB9LApAQCAtMTk2LDYgKzE5NSwxNSBAQAogCVtOTDgwMjExX0FUVFJfVERMU19PUEVSQVRJT05dID0geyAudHlwZSA9IE5MQV9VOCB9LAogCVtOTDgwMjExX0FUVFJfVERMU19TVVBQT1JUXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogCVtOTDgwMjExX0FUVFJfVERMU19FWFRFUk5BTF9TRVRVUF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKKwlbTkw4MDIxMV9BVFRSX0RPTlRfV0FJVF9GT1JfQUNLXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwKKwkJCQkgICAgICAubGVuID0gSUVFRTgwMjExX01BWF9EQVRBX0xFTiB9LAorCVtOTDgwMjExX0FUVFJfREZTX1JFR0lPTl0gPSB7IC50eXBlID0gTkxBX1U4IH0sCisJW05MODAyMTFfQVRUUl9ESVNBQkxFX0hUXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV9NQVNLXSA9IHsKKwkJLmxlbiA9IE5MODAyMTFfSFRfQ0FQQUJJTElUWV9MRU4KKwl9LAorCVtOTDgwMjExX0FUVFJfTk9BQ0tfTUFQXSA9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiB9OwogCiAvKiBwb2xpY3kgZm9yIHRoZSBrZXkgYXR0cmlidXRlcyAqLwpAQCAtMjAzLDcgKzIxMSw3IEBACiAJW05MODAyMTFfS0VZX0RBVEFdID0geyAudHlwZSA9IE5MQV9CSU5BUlksIC5sZW4gPSBXTEFOX01BWF9LRVlfTEVOIH0sCiAJW05MODAyMTFfS0VZX0lEWF0gPSB7IC50eXBlID0gTkxBX1U4IH0sCiAJW05MODAyMTFfS0VZX0NJUEhFUl0gPSB7IC50eXBlID0gTkxBX1UzMiB9LAotCVtOTDgwMjExX0tFWV9TRVFdID0geyAudHlwZSA9IE5MQV9CSU5BUlksIC5sZW4gPSA4IH0sCisJW05MODAyMTFfS0VZX1NFUV0gPSB7IC50eXBlID0gTkxBX0JJTkFSWSwgLmxlbiA9IDE2IH0sCiAJW05MODAyMTFfS0VZX0RFRkFVTFRdID0geyAudHlwZSA9IE5MQV9GTEFHIH0sCiAJW05MODAyMTFfS0VZX0RFRkFVTFRfTUdNVF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIAlbTkw4MDIxMV9LRVlfVFlQRV0gPSB7IC50eXBlID0gTkxBX1UzMiB9LApAQCAtNzU4LDYgKzc2NiwxMCBAQAogCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX1dJUEhZX0FOVEVOTkFfQVZBSUxfUlgsCiAJCSAgICBkZXYtPndpcGh5LmF2YWlsYWJsZV9hbnRlbm5hc19yeCk7CiAKKwlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfQVBfUFJPQkVfUkVTUF9PRkZMT0FEKQorCQlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9QUk9CRV9SRVNQX09GRkxPQUQsCisJCQkgICAgZGV2LT53aXBoeS5wcm9iZV9yZXNwX29mZmxvYWQpOworCiAJaWYgKChkZXYtPndpcGh5LmF2YWlsYWJsZV9hbnRlbm5hc190eCB8fAogCSAgICAgZGV2LT53aXBoeS5hdmFpbGFibGVfYW50ZW5uYXNfcngpICYmIGRldi0+b3BzLT5nZXRfYW50ZW5uYSkgewogCQl1MzIgdHhfYW50ID0gMCwgcnhfYW50ID0gMDsKQEAgLTg3NCw3ICs4ODYsOCBAQAogCUNNRChzZXRfcG1rc2EsIFNFVF9QTUtTQSk7CiAJQ01EKGRlbF9wbWtzYSwgREVMX1BNS1NBKTsKIAlDTUQoZmx1c2hfcG1rc2EsIEZMVVNIX1BNS1NBKTsKLQlDTUQocmVtYWluX29uX2NoYW5uZWwsIFJFTUFJTl9PTl9DSEFOTkVMKTsKKwlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfSEFTX1JFTUFJTl9PTl9DSEFOTkVMKQorCQlDTUQocmVtYWluX29uX2NoYW5uZWwsIFJFTUFJTl9PTl9DSEFOTkVMKTsKIAlDTUQoc2V0X2JpdHJhdGVfbWFzaywgU0VUX1RYX0JJVFJBVEVfTUFTSyk7CiAJQ01EKG1nbXRfdHgsIEZSQU1FKTsKIAlDTUQobWdtdF90eF9jYW5jZWxfd2FpdCwgRlJBTUVfV0FJVF9DQU5DRUwpOwpAQCAtODkwLDYgKzkwMywxNiBAQAogCX0KIAlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfU1VQUE9SVFNfU0NIRURfU0NBTikKIAkJQ01EKHNjaGVkX3NjYW5fc3RhcnQsIFNUQVJUX1NDSEVEX1NDQU4pOworCUNNRChwcm9iZV9jbGllbnQsIFBST0JFX0NMSUVOVCk7CisJQ01EKHNldF9ub2Fja19tYXAsIFNFVF9OT0FDS19NQVApOworCWlmIChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19SRVBPUlRTX09CU1MpIHsKKwkJaSsrOworCQlOTEFfUFVUX1UzMihtc2csIGksIE5MODAyMTFfQ01EX1JFR0lTVEVSX0JFQUNPTlMpOworCX0KKworI2lmZGVmIENPTkZJR19OTDgwMjExX1RFU1RNT0RFCisJQ01EKHRlc3Rtb2RlX2NtZCwgVEVTVE1PREUpOworI2VuZGlmCiAKICN1bmRlZiBDTUQKIApAQCAtOTA1LDExICs5MjgsMTIgQEAKIAogCW5sYV9uZXN0X2VuZChtc2csIG5sX2NtZHMpOwogCi0JaWYgKGRldi0+b3BzLT5yZW1haW5fb25fY2hhbm5lbCkKKwlpZiAoZGV2LT5vcHMtPnJlbWFpbl9vbl9jaGFubmVsICYmCisJICAgIGRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0hBU19SRU1BSU5fT05fQ0hBTk5FTCkKIAkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfTUFYX1JFTUFJTl9PTl9DSEFOTkVMX0RVUkFUSU9OLAogCQkJICAgIGRldi0+d2lwaHkubWF4X3JlbWFpbl9vbl9jaGFubmVsX2R1cmF0aW9uKTsKIAotCWlmIChkZXYtPm9wcy0+bWdtdF90eF9jYW5jZWxfd2FpdCkKKwlpZiAoZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfT0ZGQ0hBTl9UWCkKIAkJTkxBX1BVVF9GTEFHKG1zZywgTkw4MDIxMV9BVFRSX09GRkNIQU5ORUxfVFhfT0spOwogCiAJaWYgKG1nbXRfc3R5cGVzKSB7CkBAIC0xMDA3LDYgKzEwMzEsMTcgQEAKIAlpZiAobmw4MDIxMV9wdXRfaWZhY2VfY29tYmluYXRpb25zKCZkZXYtPndpcGh5LCBtc2cpKQogCQlnb3RvIG5sYV9wdXRfZmFpbHVyZTsKIAorCWlmIChkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19IQVZFX0FQX1NNRSkKKwkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfREVWSUNFX0FQX1NNRSwKKwkJCSAgICBkZXYtPndpcGh5LmFwX3NtZV9jYXBhKTsKKworCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0ZFQVRVUkVfRkxBR1MsIGRldi0+d2lwaHkuZmVhdHVyZXMpOworCisJaWYgKGRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzaykKKwkJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0ssCisJCQlzaXplb2YoKmRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzayksCisJCQlkZXYtPndpcGh5Lmh0X2NhcGFfbW9kX21hc2spOworCiAJcmV0dXJuIGdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogIG5sYV9wdXRfZmFpbHVyZToKQEAgLTE3MjUsNiArMTc2MCwyMyBAQAogCXJldHVybiByZGV2LT5vcHMtPmRlbF92aXJ0dWFsX2ludGYoJnJkZXYtPndpcGh5LCBkZXYpOwogfQogCitzdGF0aWMgaW50IG5sODAyMTFfc2V0X25vYWNrX21hcChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgZ2VubF9pbmZvICppbmZvKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IGluZm8tPnVzZXJfcHRyWzBdOworCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYgPSBpbmZvLT51c2VyX3B0clsxXTsKKwl1MTYgbm9hY2tfbWFwOworCisJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTk9BQ0tfTUFQXSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXJkZXYtPm9wcy0+c2V0X25vYWNrX21hcCkKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJbm9hY2tfbWFwID0gbmxhX2dldF91MTYoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX05PQUNLX01BUF0pOworCisJcmV0dXJuIHJkZXYtPm9wcy0+c2V0X25vYWNrX21hcCgmcmRldi0+d2lwaHksIGRldiwgbm9hY2tfbWFwKTsKK30KKwogc3RydWN0IGdldF9rZXlfY29va2llIHsKIAlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOwogCWludCBlcnJvcjsKQEAgLTIxNTUsNiArMjIwNywxMyBAQAogCQkJbmxhX2xlbihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSUVfQVNTT0NfUkVTUF0pOwogCX0KIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUFJPQkVfUkVTUF0pIHsKKwkJcGFyYW1zLnByb2JlX3Jlc3AgPQorCQkJbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BST0JFX1JFU1BdKTsKKwkJcGFyYW1zLnByb2JlX3Jlc3BfbGVuID0KKwkJCW5sYV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BST0JFX1JFU1BdKTsKKwl9CisKIAllcnIgPSBjYWxsKCZyZGV2LT53aXBoeSwgZGV2LCAmcGFyYW1zKTsKIAlpZiAoIWVyciAmJiBwYXJhbXMuaW50ZXJ2YWwpCiAJCXdkZXYtPmJlYWNvbl9pbnRlcnZhbCA9IHBhcmFtcy5pbnRlcnZhbDsKQEAgLTIxODcsNiArMjI0Niw3IEBACiAJW05MODAyMTFfU1RBX0ZMQUdfV01FXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAogCVtOTDgwMjExX1NUQV9GTEFHX01GUF0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIAlbTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEXSA9IHsgLnR5cGUgPSBOTEFfRkxBRyB9LAorCVtOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUl0gPSB7IC50eXBlID0gTkxBX0ZMQUcgfSwKIH07CiAKIHN0YXRpYyBpbnQgcGFyc2Vfc3RhdGlvbl9mbGFncyhzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLApAQCAtMjMzMCw2ICsyMzkwLDkgQEAKIAlpZiAoc2luZm8tPmZpbGxlZCAmIFNUQVRJT05fSU5GT19UWF9GQUlMRUQpCiAJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9TVEFfSU5GT19UWF9GQUlMRUQsCiAJCQkgICAgc2luZm8tPnR4X2ZhaWxlZCk7CisJaWYgKHNpbmZvLT5maWxsZWQgJiBTVEFUSU9OX0lORk9fQkVBQ09OX0xPU1NfQ09VTlQpCisJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9TVEFfSU5GT19CRUFDT05fTE9TUywKKwkJCSAgICBzaW5mby0+YmVhY29uX2xvc3NfY291bnQpOwogCWlmIChzaW5mby0+ZmlsbGVkICYgU1RBVElPTl9JTkZPX0JTU19QQVJBTSkgewogCQlic3NfcGFyYW0gPSBubGFfbmVzdF9zdGFydChtc2csIE5MODAyMTFfU1RBX0lORk9fQlNTX1BBUkFNKTsKIAkJaWYgKCFic3NfcGFyYW0pCkBAIC0yNDUzLDI2ICsyNTE2LDM0IEBACiAvKgogICogR2V0IHZsYW4gaW50ZXJmYWNlIG1ha2luZyBzdXJlIGl0IGlzIHJ1bm5pbmcgYW5kIG9uIHRoZSByaWdodCB3aXBoeS4KICAqLwotc3RhdGljIGludCBnZXRfdmxhbihzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAotCQkgICAgc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAotCQkgICAgc3RydWN0IG5ldF9kZXZpY2UgKip2bGFuKQorc3RhdGljIHN0cnVjdCBuZXRfZGV2aWNlICpnZXRfdmxhbihzdHJ1Y3QgZ2VubF9pbmZvICppbmZvLAorCQkJCSAgIHN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldikKIHsKIAlzdHJ1Y3QgbmxhdHRyICp2bGFuYXR0ciA9IGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TVEFfVkxBTl07Ci0JKnZsYW4gPSBOVUxMOworCXN0cnVjdCBuZXRfZGV2aWNlICp2OworCWludCByZXQ7CiAKLQlpZiAodmxhbmF0dHIpIHsKLQkJKnZsYW4gPSBkZXZfZ2V0X2J5X2luZGV4KGdlbmxfaW5mb19uZXQoaW5mbyksCi0JCQkJCSBubGFfZ2V0X3UzMih2bGFuYXR0cikpOwotCQlpZiAoISp2bGFuKQotCQkJcmV0dXJuIC1FTk9ERVY7Ci0JCWlmICghKCp2bGFuKS0+aWVlZTgwMjExX3B0cikKLQkJCXJldHVybiAtRUlOVkFMOwotCQlpZiAoKCp2bGFuKS0+aWVlZTgwMjExX3B0ci0+d2lwaHkgIT0gJnJkZXYtPndpcGh5KQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCWlmICghbmV0aWZfcnVubmluZygqdmxhbikpCi0JCQlyZXR1cm4gLUVORVRET1dOOworCWlmICghdmxhbmF0dHIpCisJCXJldHVybiBOVUxMOworCisJdiA9IGRldl9nZXRfYnlfaW5kZXgoZ2VubF9pbmZvX25ldChpbmZvKSwgbmxhX2dldF91MzIodmxhbmF0dHIpKTsKKwlpZiAoIXYpCisJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJaWYgKCF2LT5pZWVlODAyMTFfcHRyIHx8IHYtPmllZWU4MDIxMV9wdHItPndpcGh5ICE9ICZyZGV2LT53aXBoeSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGVycm9yOwogCX0KLQlyZXR1cm4gMDsKKworCWlmICghbmV0aWZfcnVubmluZyh2KSkgeworCQlyZXQgPSAtRU5FVERPV047CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmV0dXJuIHY7CisgZXJyb3I6CisJZGV2X3B1dCh2KTsKKwlyZXR1cm4gRVJSX1BUUihyZXQpOwogfQogCiBzdGF0aWMgaW50IG5sODAyMTFfc2V0X3N0YXRpb24oc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKQEAgLTI1MTEsNiArMjU4Miw5IEBACiAJCXBhcmFtcy5odF9jYXBhID0KIAkJCW5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZXSk7CiAKKwlpZiAoIXJkZXYtPm9wcy0+Y2hhbmdlX3N0YXRpb24pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwogCWlmIChwYXJzZV9zdGF0aW9uX2ZsYWdzKGluZm8sICZwYXJhbXMpKQogCQlyZXR1cm4gLUVJTlZBTDsKIApAQCAtMjUyMiw3MyArMjU5Niw4NCBAQAogCQlwYXJhbXMucGxpbmtfc3RhdGUgPQogCQkgICAgbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU1RBX1BMSU5LX1NUQVRFXSk7CiAKLQllcnIgPSBnZXRfdmxhbihpbmZvLCByZGV2LCAmcGFyYW1zLnZsYW4pOwotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCi0JLyogdmFsaWRhdGUgc2V0dGluZ3MgKi8KLQllcnIgPSAwOwotCiAJc3dpdGNoIChkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZSkgewogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9BUF9WTEFOOgogCWNhc2UgTkw4MDIxMV9JRlRZUEVfUDJQX0dPOgogCQkvKiBkaXNhbGxvdyBtZXNoLXNwZWNpZmljIHRoaW5ncyAqLwogCQlpZiAocGFyYW1zLnBsaW5rX2FjdGlvbikKLQkJCWVyciA9IC1FSU5WQUw7CisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkvKiBURExTIGNhbid0IGJlIHNldCwgLi4uICovCisJCWlmIChwYXJhbXMuc3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyoKKwkJICogLi4uIGJ1dCBkb24ndCBib3RoZXIgdGhlIGRyaXZlciB3aXRoIGl0LiBUaGlzIHdvcmtzIGFyb3VuZAorCQkgKiBhIGhvc3RhcGQvd3BhX3N1cHBsaWNhbnQgaXNzdWUgLS0gaXQgYWx3YXlzIGluY2x1ZGVzIHRoZQorCQkgKiBUTERTX1BFRVIgZmxhZyBpbiB0aGUgbWFzayBldmVuIGZvciBBUCBtb2RlLgorCQkgKi8KKwkJcGFyYW1zLnN0YV9mbGFnc19tYXNrICY9IH5CSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpOworCisJCS8qIGFjY2VwdCBvbmx5IHRoZSBsaXN0ZWQgYml0cyAqLworCQlpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrICYKKwkJCQl+KEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhPUklaRUQpIHwKKwkJCQkgIEJJVChOTDgwMjExX1NUQV9GTEFHX1NIT1JUX1BSRUFNQkxFKSB8CisJCQkJICBCSVQoTkw4MDIxMV9TVEFfRkxBR19XTUUpIHwKKwkJCQkgIEJJVChOTDgwMjExX1NUQV9GTEFHX01GUCkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJLyogbXVzdCBiZSBsYXN0IGluIGhlcmUgZm9yIGVycm9yIGhhbmRsaW5nICovCisJCXBhcmFtcy52bGFuID0gZ2V0X3ZsYW4oaW5mbywgcmRldik7CisJCWlmIChJU19FUlIocGFyYW1zLnZsYW4pKQorCQkJcmV0dXJuIFBUUl9FUlIocGFyYW1zLnZsYW4pOwogCQlicmVhazsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9DTElFTlQ6CiAJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOgogCQkvKiBkaXNhbGxvdyB0aGluZ3Mgc3RhIGRvZXNuJ3Qgc3VwcG9ydCAqLwogCQlpZiAocGFyYW1zLnBsaW5rX2FjdGlvbikKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCWlmIChwYXJhbXMudmxhbikKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCWlmIChwYXJhbXMuc3VwcG9ydGVkX3JhdGVzICYmCi0JCSAgICAhKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkpCi0JCQllcnIgPSAtRUlOVkFMOworCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWlmIChwYXJhbXMuaHRfY2FwYSkKLQkJCWVyciA9IC1FSU5WQUw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKHBhcmFtcy5saXN0ZW5faW50ZXJ2YWwgPj0gMCkKLQkJCWVyciA9IC1FSU5WQUw7Ci0JCWlmIChwYXJhbXMuc3RhX2ZsYWdzX21hc2sgJgotCQkJCX4oQklUKE5MODAyMTFfU1RBX0ZMQUdfQVVUSE9SSVpFRCkgfAotCQkJCSAgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkpCi0JCQllcnIgPSAtRUlOVkFMOwotCQkvKiBjYW4ndCBjaGFuZ2UgdGhlIFRETFMgYml0ICovCi0JCWlmICghKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgJiYKLQkJICAgIChwYXJhbXMuc3RhX2ZsYWdzX21hc2sgJiBCSVQoTkw4MDIxMV9TVEFfRkxBR19URExTX1BFRVIpKSkKLQkJCWVyciA9IC1FSU5WQUw7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJLyoKKwkJICogRG9uJ3QgYWxsb3cgdXNlcnNwYWNlIHRvIGNoYW5nZSB0aGUgVERMU19QRUVSIGZsYWcsCisJCSAqIGJ1dCBzaWxlbnRseSBpZ25vcmUgYXR0ZW1wdHMgdG8gY2hhbmdlIGl0IHNpbmNlIHdlCisJCSAqIGRvbid0IGhhdmUgc3RhdGUgaGVyZSB0byB2ZXJpZnkgdGhhdCBpdCBkb2Vzbid0IHRyeQorCQkgKiB0byBjaGFuZ2UgdGhlIGZsYWcuCisJCSAqLworCQlwYXJhbXMuc3RhX2ZsYWdzX21hc2sgJj0gfkJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUik7CisKKwkJLyogcmVqZWN0IGFueSBjaGFuZ2VzIG90aGVyIHRoYW4gQVVUSE9SSVpFRCAqLworCQlpZiAocGFyYW1zLnN0YV9mbGFnc19tYXNrICYgfkJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhPUklaRUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CiAJCWJyZWFrOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoKIAkJLyogZGlzYWxsb3cgdGhpbmdzIG1lc2ggZG9lc24ndCBzdXBwb3J0ICovCiAJCWlmIChwYXJhbXMudmxhbikKLQkJCWVyciA9IC1FSU5WQUw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJaWYgKHBhcmFtcy5odF9jYXBhKQotCQkJZXJyID0gLUVJTlZBTDsKKwkJCXJldHVybiAtRUlOVkFMOwogCQlpZiAocGFyYW1zLmxpc3Rlbl9pbnRlcnZhbCA+PSAwKQotCQkJZXJyID0gLUVJTlZBTDsKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKgorCQkgKiBObyBzcGVjaWFsIGhhbmRsaW5nIGZvciBURExTIGhlcmUgLS0gdGhlIHVzZXJzcGFjZQorCQkgKiBtZXNoIGNvZGUgZG9lc24ndCBoYXZlIHRoaXMgYnVnLgorCQkgKi8KIAkJaWYgKHBhcmFtcy5zdGFfZmxhZ3NfbWFzayAmCiAJCQkJfihCSVQoTkw4MDIxMV9TVEFfRkxBR19BVVRIRU5USUNBVEVEKSB8CiAJCQkJICBCSVQoTkw4MDIxMV9TVEFfRkxBR19NRlApIHwKIAkJCQkgIEJJVChOTDgwMjExX1NUQV9GTEFHX0FVVEhPUklaRUQpKSkKLQkJCWVyciA9IC1FSU5WQUw7CisJCQlyZXR1cm4gLUVJTlZBTDsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKLQkJZXJyID0gLUVJTlZBTDsKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCX0KIAotCWlmIChlcnIpCi0JCWdvdG8gb3V0OwotCi0JaWYgKCFyZGV2LT5vcHMtPmNoYW5nZV9zdGF0aW9uKSB7Ci0JCWVyciA9IC1FT1BOT1RTVVBQOwotCQlnb3RvIG91dDsKLQl9CisJLyogYmUgYXdhcmUgb2YgcGFyYW1zLnZsYW4gd2hlbiBjaGFuZ2luZyBjb2RlIGhlcmUgKi8KIAogCWVyciA9IHJkZXYtPm9wcy0+Y2hhbmdlX3N0YXRpb24oJnJkZXYtPndpcGh5LCBkZXYsIG1hY19hZGRyLCAmcGFyYW1zKTsKIAotIG91dDoKIAlpZiAocGFyYW1zLnZsYW4pCiAJCWRldl9wdXQocGFyYW1zLnZsYW4pOwogCkBAIC0yNjQzLDcwICsyNzI4LDgxIEBACiAJCXBhcmFtcy5wbGlua19hY3Rpb24gPQogCQkgICAgbmxhX2dldF91OChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU1RBX1BMSU5LX0FDVElPTl0pOwogCisJaWYgKCFyZGV2LT5vcHMtPmFkZF9zdGF0aW9uKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKIAlpZiAocGFyc2Vfc3RhdGlvbl9mbGFncyhpbmZvLCAmcGFyYW1zKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBwYXJzZSBXTUUgYXR0cmlidXRlcyBpZiBzdGEgaXMgV01FIGNhcGFibGUgKi8KLQlpZiAoKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19BUF9VQVBTRCkgJiYKLQkgICAgKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSkgJiYKLQkgICAgaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1NUQV9XTUVdKSB7Ci0JCXN0cnVjdCBubGF0dHIgKnRiW05MODAyMTFfU1RBX1dNRV9NQVggKyAxXTsKLQkJc3RydWN0IG5sYXR0ciAqbmxhOworCXN3aXRjaCAoZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUpIHsKKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOgorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVBfVkxBTjoKKwljYXNlIE5MODAyMTFfSUZUWVBFX1AyUF9HTzoKKwkJLyogcGFyc2UgV01FIGF0dHJpYnV0ZXMgaWYgc3RhIGlzIFdNRSBjYXBhYmxlICovCisJCWlmICgocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0FQX1VBUFNEKSAmJgorCQkgICAgKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfV01FKSkgJiYKKwkJICAgIGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TVEFfV01FXSkgeworCQkJc3RydWN0IG5sYXR0ciAqdGJbTkw4MDIxMV9TVEFfV01FX01BWCArIDFdOworCQkJc3RydWN0IG5sYXR0ciAqbmxhOwogCi0JCW5sYSA9IGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9TVEFfV01FXTsKLQkJZXJyID0gbmxhX3BhcnNlX25lc3RlZCh0YiwgTkw4MDIxMV9TVEFfV01FX01BWCwgbmxhLAotCQkJCSAgICAgICBubDgwMjExX3N0YV93bWVfcG9saWN5KTsKLQkJaWYgKGVycikKLQkJCXJldHVybiBlcnI7CisJCQlubGEgPSBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfU1RBX1dNRV07CisJCQllcnIgPSBubGFfcGFyc2VfbmVzdGVkKHRiLCBOTDgwMjExX1NUQV9XTUVfTUFYLCBubGEsCisJCQkJCSAgICAgICBubDgwMjExX3N0YV93bWVfcG9saWN5KTsKKwkJCWlmIChlcnIpCisJCQkJcmV0dXJuIGVycjsKIAotCQlpZiAodGJbTkw4MDIxMV9TVEFfV01FX1VBUFNEX1FVRVVFU10pCi0JCQlwYXJhbXMudWFwc2RfcXVldWVzID0KLQkJCSAgICAgbmxhX2dldF91OCh0YltOTDgwMjExX1NUQV9XTUVfVUFQU0RfUVVFVUVTXSk7Ci0JCWlmIChwYXJhbXMudWFwc2RfcXVldWVzICYgfklFRUU4MDIxMV9XTU1fSUVfU1RBX1FPU0lORk9fQUNfTUFTSykKKwkJCWlmICh0YltOTDgwMjExX1NUQV9XTUVfVUFQU0RfUVVFVUVTXSkKKwkJCQlwYXJhbXMudWFwc2RfcXVldWVzID0KKwkJCQkgICAgIG5sYV9nZXRfdTgodGJbTkw4MDIxMV9TVEFfV01FX1VBUFNEX1FVRVVFU10pOworCQkJaWYgKHBhcmFtcy51YXBzZF9xdWV1ZXMgJgorCQkJCQl+SUVFRTgwMjExX1dNTV9JRV9TVEFfUU9TSU5GT19BQ19NQVNLKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlpZiAodGJbTkw4MDIxMV9TVEFfV01FX01BWF9TUF0pCisJCQkJcGFyYW1zLm1heF9zcCA9CisJCQkJICAgICBubGFfZ2V0X3U4KHRiW05MODAyMTFfU1RBX1dNRV9NQVhfU1BdKTsKKworCQkJaWYgKHBhcmFtcy5tYXhfc3AgJgorCQkJCQl+SUVFRTgwMjExX1dNTV9JRV9TVEFfUU9TSU5GT19TUF9NQVNLKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlwYXJhbXMuc3RhX21vZGlmeV9tYXNrIHw9IFNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0Q7CisJCX0KKwkJLyogVERMUyBwZWVycyBjYW5ub3QgYmUgYWRkZWQgKi8KKwkJaWYgKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkKIAkJCXJldHVybiAtRUlOVkFMOworCQkvKiBidXQgZG9uJ3QgYm90aGVyIHRoZSBkcml2ZXIgd2l0aCBpdCAqLworCQlwYXJhbXMuc3RhX2ZsYWdzX21hc2sgJj0gfkJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUik7CiAKLQkJaWYgKHRiW05MODAyMTFfU1RBX1dNRV9NQVhfU1BdKQotCQkJcGFyYW1zLm1heF9zcCA9Ci0JCQkgICAgIG5sYV9nZXRfdTgodGJbTkw4MDIxMV9TVEFfV01FX01BWF9TUF0pOwotCi0JCWlmIChwYXJhbXMubWF4X3NwICYgfklFRUU4MDIxMV9XTU1fSUVfU1RBX1FPU0lORk9fU1BfTUFTSykKKwkJLyogbXVzdCBiZSBsYXN0IGluIGhlcmUgZm9yIGVycm9yIGhhbmRsaW5nICovCisJCXBhcmFtcy52bGFuID0gZ2V0X3ZsYW4oaW5mbywgcmRldik7CisJCWlmIChJU19FUlIocGFyYW1zLnZsYW4pKQorCQkJcmV0dXJuIFBUUl9FUlIocGFyYW1zLnZsYW4pOworCQlicmVhazsKKwljYXNlIE5MODAyMTFfSUZUWVBFX01FU0hfUE9JTlQ6CisJCS8qIFRETFMgcGVlcnMgY2Fubm90IGJlIGFkZGVkICovCisJCWlmIChwYXJhbXMuc3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpCiAJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQlwYXJhbXMuc3RhX21vZGlmeV9tYXNrIHw9IFNUQVRJT05fUEFSQU1fQVBQTFlfVUFQU0Q7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoKKwkJLyogT25seSBURExTIHBlZXJzIGNhbiBiZSBhZGRlZCAqLworCQlpZiAoIShwYXJhbXMuc3RhX2ZsYWdzX3NldCAmIEJJVChOTDgwMjExX1NUQV9GTEFHX1RETFNfUEVFUikpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIENhbiBvbmx5IGFkZCBpZiBURExTIC4uLiAqLworCQlpZiAoIShyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfU1VQUE9SVFNfVERMUykpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCS8qIC4uLiB3aXRoIGV4dGVybmFsIHNldHVwIGlzIHN1cHBvcnRlZCAqLworCQlpZiAoIShyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfVERMU19FWFRFUk5BTF9TRVRVUCkpCisJCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAl9CiAKLQlpZiAoZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVAgJiYKLQkgICAgZGV2LT5pZWVlODAyMTFfcHRyLT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfQVBfVkxBTiAmJgotCSAgICBkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UICYmCi0JICAgIGRldi0+aWVlZTgwMjExX3B0ci0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1AyUF9HTyAmJgotCSAgICBkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCS8qCi0JICogT25seSBtYW5hZ2VkIHN0YXRpb25zIGNhbiBhZGQgVERMUyBwZWVycywgYW5kIG9ubHkgd2hlbiB0aGUKLQkgKiB3aXBoeSBzdXBwb3J0cyBleHRlcm5hbCBURExTIHNldHVwLgotCSAqLwotCWlmIChkZXYtPmllZWU4MDIxMV9wdHItPmlmdHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OICYmCi0JICAgICEoKHBhcmFtcy5zdGFfZmxhZ3Nfc2V0ICYgQklUKE5MODAyMTFfU1RBX0ZMQUdfVERMU19QRUVSKSkgJiYKLQkgICAgICAocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX1NVUFBPUlRTX1RETFMpICYmCi0JICAgICAgKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19URExTX0VYVEVSTkFMX1NFVFVQKSkpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZXJyID0gZ2V0X3ZsYW4oaW5mbywgcmRldiwgJnBhcmFtcy52bGFuKTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dDsKLQotCS8qIHZhbGlkYXRlIHNldHRpbmdzICovCi0JZXJyID0gMDsKLQotCWlmICghcmRldi0+b3BzLT5hZGRfc3RhdGlvbikgewotCQllcnIgPSAtRU9QTk9UU1VQUDsKLQkJZ290byBvdXQ7Ci0JfQorCS8qIGJlIGF3YXJlIG9mIHBhcmFtcy52bGFuIHdoZW4gY2hhbmdpbmcgY29kZSBoZXJlICovCiAKIAllcnIgPSByZGV2LT5vcHMtPmFkZF9zdGF0aW9uKCZyZGV2LT53aXBoeSwgZGV2LCBtYWNfYWRkciwgJnBhcmFtcyk7CiAKLSBvdXQ6CiAJaWYgKHBhcmFtcy52bGFuKQogCQlkZXZfcHV0KHBhcmFtcy52bGFuKTsKIAlyZXR1cm4gZXJyOwpAQCAtMzEyNyw2ICszMjIzLDggQEAKIAkJCWN1cl9wYXJhbXMuZG90MTFNZXNoSFdNUGFjdGl2ZVBhdGhUaW1lb3V0KTsKIAlOTEFfUFVUX1UxNihtc2csIE5MODAyMTFfTUVTSENPTkZfSFdNUF9QUkVRX01JTl9JTlRFUlZBTCwKIAkJCWN1cl9wYXJhbXMuZG90MTFNZXNoSFdNUHByZXFNaW5JbnRlcnZhbCk7CisJTkxBX1BVVF9VMTYobXNnLCBOTDgwMjExX01FU0hDT05GX0hXTVBfUEVSUl9NSU5fSU5URVJWQUwsCisJCQljdXJfcGFyYW1zLmRvdDExTWVzaEhXTVBwZXJyTWluSW50ZXJ2YWwpOwogCU5MQV9QVVRfVTE2KG1zZywgTkw4MDIxMV9NRVNIQ09ORl9IV01QX05FVF9ESUFNX1RSVlNfVElNRSwKIAkJCWN1cl9wYXJhbXMuZG90MTFNZXNoSFdNUG5ldERpYW1ldGVyVHJhdmVyc2FsVGltZSk7CiAJTkxBX1BVVF9VOChtc2csIE5MODAyMTFfTUVTSENPTkZfSFdNUF9ST09UTU9ERSwKQEAgLTMxNjEsNiArMzI1OSw3IEBACiAJW05MODAyMTFfTUVTSENPTkZfTUlOX0RJU0NPVkVSWV9USU1FT1VUXSA9IHsgLnR5cGUgPSBOTEFfVTE2IH0sCiAJW05MODAyMTFfTUVTSENPTkZfSFdNUF9BQ1RJVkVfUEFUSF9USU1FT1VUXSA9IHsgLnR5cGUgPSBOTEFfVTMyIH0sCiAJW05MODAyMTFfTUVTSENPTkZfSFdNUF9QUkVRX01JTl9JTlRFUlZBTF0gPSB7IC50eXBlID0gTkxBX1UxNiB9LAorCVtOTDgwMjExX01FU0hDT05GX0hXTVBfUEVSUl9NSU5fSU5URVJWQUxdID0geyAudHlwZSA9IE5MQV9VMTYgfSwKIAlbTkw4MDIxMV9NRVNIQ09ORl9IV01QX05FVF9ESUFNX1RSVlNfVElNRV0gPSB7IC50eXBlID0gTkxBX1UxNiB9LAogCVtOTDgwMjExX01FU0hDT05GX0hXTVBfUk9PVE1PREVdID0geyAudHlwZSA9IE5MQV9VOCB9LAogCVtOTDgwMjExX01FU0hDT05GX0hXTVBfUkFOTl9JTlRFUlZBTF0gPSB7IC50eXBlID0gTkxBX1UxNiB9LApAQCAtMzIzNSw2ICszMzM0LDkgQEAKIAlGSUxMX0lOX01FU0hfUEFSQU1fSUZfU0VUKHRiLCBjZmcsIGRvdDExTWVzaEhXTVBwcmVxTWluSW50ZXJ2YWwsCiAJCQltYXNrLCBOTDgwMjExX01FU0hDT05GX0hXTVBfUFJFUV9NSU5fSU5URVJWQUwsCiAJCQlubGFfZ2V0X3UxNik7CisJRklMTF9JTl9NRVNIX1BBUkFNX0lGX1NFVCh0YiwgY2ZnLCBkb3QxMU1lc2hIV01QcGVyck1pbkludGVydmFsLAorCQkJbWFzaywgTkw4MDIxMV9NRVNIQ09ORl9IV01QX1BFUlJfTUlOX0lOVEVSVkFMLAorCQkJbmxhX2dldF91MTYpOwogCUZJTExfSU5fTUVTSF9QQVJBTV9JRl9TRVQodGIsIGNmZywKIAkJCWRvdDExTWVzaEhXTVBuZXREaWFtZXRlclRyYXZlcnNhbFRpbWUsCiAJCQltYXNrLCBOTDgwMjExX01FU0hDT05GX0hXTVBfTkVUX0RJQU1fVFJWU19USU1FLApAQCAtMzM1Nyw2ICszNDU5LDkgQEAKIAogCU5MQV9QVVRfU1RSSU5HKG1zZywgTkw4MDIxMV9BVFRSX1JFR19BTFBIQTIsCiAJCWNmZzgwMjExX3JlZ2RvbWFpbi0+YWxwaGEyKTsKKwlpZiAoY2ZnODAyMTFfcmVnZG9tYWluLT5kZnNfcmVnaW9uKQorCQlOTEFfUFVUX1U4KG1zZywgTkw4MDIxMV9BVFRSX0RGU19SRUdJT04sCisJCQkgICBjZmc4MDIxMV9yZWdkb21haW4tPmRmc19yZWdpb24pOwogCiAJbmxfcmVnX3J1bGVzID0gbmxhX25lc3Rfc3RhcnQobXNnLCBOTDgwMjExX0FUVFJfUkVHX1JVTEVTKTsKIAlpZiAoIW5sX3JlZ19ydWxlcykKQEAgLTM0MTUsNiArMzUyMCw3IEBACiAJY2hhciAqYWxwaGEyID0gTlVMTDsKIAlpbnQgcmVtX3JlZ19ydWxlcyA9IDAsIHIgPSAwOwogCXUzMiBudW1fcnVsZXMgPSAwLCBydWxlX2lkeCA9IDAsIHNpemVfb2ZfcmVnZDsKKwl1OCBkZnNfcmVnaW9uID0gMDsKIAlzdHJ1Y3QgaWVlZTgwMjExX3JlZ2RvbWFpbiAqcmQgPSBOVUxMOwogCiAJaWYgKCFpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUkVHX0FMUEhBMl0pCkBAIC0zNDI1LDYgKzM1MzEsOSBAQAogCiAJYWxwaGEyID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19BTFBIQTJdKTsKIAorCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfREZTX1JFR0lPTl0pCisJCWRmc19yZWdpb24gPSBubGFfZ2V0X3U4KGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9ERlNfUkVHSU9OXSk7CisKIAlubGFfZm9yX2VhY2hfbmVzdGVkKG5sX3JlZ19ydWxlLCBpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfUkVHX1JVTEVTXSwKIAkJCXJlbV9yZWdfcnVsZXMpIHsKIAkJbnVtX3J1bGVzKys7CkBAIC0zNDUyLDYgKzM1NjEsMTMgQEAKIAlyZC0+YWxwaGEyWzBdID0gYWxwaGEyWzBdOwogCXJkLT5hbHBoYTJbMV0gPSBhbHBoYTJbMV07CiAKKwkvKgorCSAqIERpc2FibGUgREZTIG1hc3RlciBtb2RlIGlmIHRoZSBERlMgcmVnaW9uIHdhcworCSAqIG5vdCBzdXBwb3J0ZWQgb3Iga25vd24gb24gdGhpcyBrZXJuZWwuCisJICovCisJaWYgKHJlZ19zdXBwb3J0ZWRfZGZzX3JlZ2lvbihkZnNfcmVnaW9uKSkKKwkJcmQtPmRmc19yZWdpb24gPSBkZnNfcmVnaW9uOworCiAJbmxhX2Zvcl9lYWNoX25lc3RlZChubF9yZWdfcnVsZSwgaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1JFR19SVUxFU10sCiAJCQlyZW1fcmVnX3J1bGVzKSB7CiAJCW5sYV9wYXJzZSh0YiwgTkw4MDIxMV9SRUdfUlVMRV9BVFRSX01BWCwKQEAgLTQzNTksNiArNDQ3NSw5IEBACiAJY29uc3QgdTggKmJzc2lkLCAqc3NpZCwgKmllID0gTlVMTCwgKnByZXZfYnNzaWQgPSBOVUxMOwogCWludCBlcnIsIHNzaWRfbGVuLCBpZV9sZW4gPSAwOwogCWJvb2wgdXNlX21mcCA9IGZhbHNlOworCXUzMiBmbGFncyA9IDA7CisJc3RydWN0IGllZWU4MDIxMV9odF9jYXAgKmh0X2NhcGEgPSBOVUxMOworCXN0cnVjdCBpZWVlODAyMTFfaHRfY2FwICpodF9jYXBhX21hc2sgPSBOVUxMOwogCiAJaWYgKCFpc192YWxpZF9pZV9hdHRyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9JRV0pKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ0MDIsMTEgKzQ1MjEsMjUgQEAKIAlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BSRVZfQlNTSURdKQogCQlwcmV2X2Jzc2lkID0gbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BSRVZfQlNTSURdKTsKIAorCWlmIChubGFfZ2V0X2ZsYWcoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0RJU0FCTEVfSFRdKSkKKwkJZmxhZ3MgfD0gQVNTT0NfUkVRX0RJU0FCTEVfSFQ7CisKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFlfTUFTS10pCisJCWh0X2NhcGFfbWFzayA9CisJCQlubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV9NQVNLXSk7CisKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFldKSB7CisJCWlmICghaHRfY2FwYV9tYXNrKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWh0X2NhcGEgPSBubGFfZGF0YShpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV0pOworCX0KKwogCWVyciA9IG5sODAyMTFfY3J5cHRvX3NldHRpbmdzKHJkZXYsIGluZm8sICZjcnlwdG8sIDEpOwogCWlmICghZXJyKQogCQllcnIgPSBjZmc4MDIxMV9tbG1lX2Fzc29jKHJkZXYsIGRldiwgY2hhbiwgYnNzaWQsIHByZXZfYnNzaWQsCiAJCQkJCSAgc3NpZCwgc3NpZF9sZW4sIGllLCBpZV9sZW4sIHVzZV9tZnAsCi0JCQkJCSAgJmNyeXB0byk7CisJCQkJCSAgJmNyeXB0bywgZmxhZ3MsIGh0X2NhcGEsCisJCQkJCSAgaHRfY2FwYV9tYXNrKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00NTc3LDEzICs0NzEwLDQxIEBACiAJCWlic3MuaWVfbGVuID0gbmxhX2xlbihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSUVdKTsKIAl9CiAKLQlpYnNzLmNoYW5uZWwgPSBpZWVlODAyMTFfZ2V0X2NoYW5uZWwod2lwaHksCi0JCW5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9XSVBIWV9GUkVRXSkpOworCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFXSkgeworCQllbnVtIG5sODAyMTFfY2hhbm5lbF90eXBlIGNoYW5uZWxfdHlwZTsKKworCQljaGFubmVsX3R5cGUgPSBubGFfZ2V0X3UzMigKKwkJCQlpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFXSk7CisJCWlmIChjaGFubmVsX3R5cGUgIT0gTkw4MDIxMV9DSEFOX05PX0hUICYmCisJCSAgICBjaGFubmVsX3R5cGUgIT0gTkw4MDIxMV9DSEFOX0hUMjAgJiYKKwkJICAgIGNoYW5uZWxfdHlwZSAhPSBOTDgwMjExX0NIQU5fSFQ0ME1JTlVTICYmCisJCSAgICBjaGFubmVsX3R5cGUgIT0gTkw4MDIxMV9DSEFOX0hUNDBQTFVTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKGNoYW5uZWxfdHlwZSAhPSBOTDgwMjExX0NIQU5fTk9fSFQgJiYKKwkJICAgICEod2lwaHktPmZlYXR1cmVzICYgTkw4MDIxMV9GRUFUVVJFX0hUX0lCU1MpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWJzcy5jaGFubmVsX3R5cGUgPSBjaGFubmVsX3R5cGU7CisJfSBlbHNlIHsKKwkJaWJzcy5jaGFubmVsX3R5cGUgPSBOTDgwMjExX0NIQU5fTk9fSFQ7CisJfQorCisJaWJzcy5jaGFubmVsID0gcmRldl9mcmVxX3RvX2NoYW4ocmRldiwKKwkJbmxhX2dldF91MzIoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1dJUEhZX0ZSRVFdKSwKKwkJaWJzcy5jaGFubmVsX3R5cGUpOwogCWlmICghaWJzcy5jaGFubmVsIHx8CiAJICAgIGlic3MuY2hhbm5lbC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9OT19JQlNTIHx8CiAJICAgIGlic3MuY2hhbm5lbC0+ZmxhZ3MgJiBJRUVFODAyMTFfQ0hBTl9ESVNBQkxFRCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKiBCb3RoIGNoYW5uZWxzIHNob3VsZCBiZSBhYmxlIHRvIGluaXRpYXRlIGNvbW11bmljYXRpb24gKi8KKwlpZiAoKGlic3MuY2hhbm5lbF90eXBlID09IE5MODAyMTFfQ0hBTl9IVDQwUExVUyB8fAorCSAgICAgaWJzcy5jaGFubmVsX3R5cGUgPT0gTkw4MDIxMV9DSEFOX0hUNDBNSU5VUykgJiYKKwkgICAgIWNmZzgwMjExX2Nhbl9iZWFjb25fc2VjX2NoYW4oJnJkZXYtPndpcGh5LCBpYnNzLmNoYW5uZWwsCisJCQkJCSAgaWJzcy5jaGFubmVsX3R5cGUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCWlic3MuY2hhbm5lbF9maXhlZCA9ICEhaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0ZSRVFfRklYRURdOwogCWlic3MucHJpdmFjeSA9ICEhaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX1BSSVZBQ1ldOwogCkBAIC00NjYyLDcgKzQ4MjMsNyBAQAogc3RhdGljIGludCBubDgwMjExX3Rlc3Rtb2RlX2R1bXAoc3RydWN0IHNrX2J1ZmYgKnNrYiwKIAkJCQkgc3RydWN0IG5ldGxpbmtfY2FsbGJhY2sgKmNiKQogewotCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqZGV2OworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldjsKIAlpbnQgZXJyOwogCWxvbmcgcGh5X2lkeDsKIAl2b2lkICpkYXRhID0gTlVMTDsKQEAgLTQ2ODAsOSArNDg0MSwyMSBAQAogCQkJCSAgbmw4MDIxMV9wb2xpY3kpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKLQkJaWYgKCFubDgwMjExX2ZhbS5hdHRyYnVmW05MODAyMTFfQVRUUl9XSVBIWV0pCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJcGh5X2lkeCA9IG5sYV9nZXRfdTMyKG5sODAyMTFfZmFtLmF0dHJidWZbTkw4MDIxMV9BVFRSX1dJUEhZXSk7CisJCWlmIChubDgwMjExX2ZhbS5hdHRyYnVmW05MODAyMTFfQVRUUl9XSVBIWV0pIHsKKwkJCXBoeV9pZHggPSBubGFfZ2V0X3UzMigKKwkJCQlubDgwMjExX2ZhbS5hdHRyYnVmW05MODAyMTFfQVRUUl9XSVBIWV0pOworCQl9IGVsc2UgeworCQkJc3RydWN0IG5ldF9kZXZpY2UgKm5ldGRldjsKKworCQkJZXJyID0gZ2V0X3JkZXZfZGV2X2J5X2lmaW5kZXgoc29ja19uZXQoc2tiLT5zayksCisJCQkJCQkgICAgICBubDgwMjExX2ZhbS5hdHRyYnVmLAorCQkJCQkJICAgICAgJnJkZXYsICZuZXRkZXYpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQkJZGV2X3B1dChuZXRkZXYpOworCQkJcGh5X2lkeCA9IHJkZXYtPndpcGh5X2lkeDsKKwkJCWNmZzgwMjExX3VubG9ja19yZGV2KHJkZXYpOworCQl9CiAJCWlmIChubDgwMjExX2ZhbS5hdHRyYnVmW05MODAyMTFfQVRUUl9URVNUREFUQV0pCiAJCQljYi0+YXJnc1sxXSA9CiAJCQkJKGxvbmcpbmw4MDIxMV9mYW0uYXR0cmJ1ZltOTDgwMjExX0FUVFJfVEVTVERBVEFdOwpAQCAtNDY5NCwxNSArNDg2NywxNSBAQAogCX0KIAogCW11dGV4X2xvY2soJmNmZzgwMjExX211dGV4KTsKLQlkZXYgPSBjZmc4MDIxMV9yZGV2X2J5X3dpcGh5X2lkeChwaHlfaWR4KTsKLQlpZiAoIWRldikgeworCXJkZXYgPSBjZmc4MDIxMV9yZGV2X2J5X3dpcGh5X2lkeChwaHlfaWR4KTsKKwlpZiAoIXJkZXYpIHsKIAkJbXV0ZXhfdW5sb2NrKCZjZmc4MDIxMV9tdXRleCk7CiAJCXJldHVybiAtRU5PRU5UOwogCX0KLQljZmc4MDIxMV9sb2NrX3JkZXYoZGV2KTsKKwljZmc4MDIxMV9sb2NrX3JkZXYocmRldik7CiAJbXV0ZXhfdW5sb2NrKCZjZmc4MDIxMV9tdXRleCk7CiAKLQlpZiAoIWRldi0+b3BzLT50ZXN0bW9kZV9kdW1wKSB7CisJaWYgKCFyZGV2LT5vcHMtPnRlc3Rtb2RlX2R1bXApIHsKIAkJZXJyID0gLUVPUE5PVFNVUFA7CiAJCWdvdG8gb3V0X2VycjsKIAl9CkBAIC00NzEzLDcgKzQ4ODYsNyBAQAogCQkJCQkgICBOTDgwMjExX0NNRF9URVNUTU9ERSk7CiAJCXN0cnVjdCBubGF0dHIgKnRtZGF0YTsKIAotCQlpZiAobmxhX3B1dF91MzIoc2tiLCBOTDgwMjExX0FUVFJfV0lQSFksIGRldi0+d2lwaHlfaWR4KSA8IDApIHsKKwkJaWYgKG5sYV9wdXRfdTMyKHNrYiwgTkw4MDIxMV9BVFRSX1dJUEhZLCBwaHlfaWR4KSA8IDApIHsKIAkJCWdlbmxtc2dfY2FuY2VsKHNrYiwgaGRyKTsKIAkJCWJyZWFrOwogCQl9CkBAIC00NzIzLDggKzQ4OTYsOCBAQAogCQkJZ2VubG1zZ19jYW5jZWwoc2tiLCBoZHIpOwogCQkJYnJlYWs7CiAJCX0KLQkJZXJyID0gZGV2LT5vcHMtPnRlc3Rtb2RlX2R1bXAoJmRldi0+d2lwaHksIHNrYiwgY2IsCi0JCQkJCSAgICAgIGRhdGEsIGRhdGFfbGVuKTsKKwkJZXJyID0gcmRldi0+b3BzLT50ZXN0bW9kZV9kdW1wKCZyZGV2LT53aXBoeSwgc2tiLCBjYiwKKwkJCQkJICAgICAgIGRhdGEsIGRhdGFfbGVuKTsKIAkJbmxhX25lc3RfZW5kKHNrYiwgdG1kYXRhKTsKIAogCQlpZiAoZXJyID09IC1FTk9CVUZTIHx8IGVyciA9PSAtRU5PRU5UKSB7CkBAIC00NzQyLDcgKzQ5MTUsNyBAQAogCS8qIHNlZSBhYm92ZSAqLwogCWNiLT5hcmdzWzBdID0gcGh5X2lkeCArIDE7CiAgb3V0X2VycjoKLQljZmc4MDIxMV91bmxvY2tfcmRldihkZXYpOworCWNmZzgwMjExX3VubG9ja19yZGV2KHJkZXYpOwogCXJldHVybiBlcnI7CiB9CiAKQEAgLTQ4OTYsNiArNTA2OSwyMiBAQAogCQkJcmV0dXJuIFBUUl9FUlIoY29ubmtleXMpOwogCX0KIAorCWlmIChubGFfZ2V0X2ZsYWcoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0RJU0FCTEVfSFRdKSkKKwkJY29ubmVjdC5mbGFncyB8PSBBU1NPQ19SRVFfRElTQUJMRV9IVDsKKworCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfSFRfQ0FQQUJJTElUWV9NQVNLXSkKKwkJbWVtY3B5KCZjb25uZWN0Lmh0X2NhcGFfbWFzaywKKwkJICAgICAgIG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0tdKSwKKwkJICAgICAgIHNpemVvZihjb25uZWN0Lmh0X2NhcGFfbWFzaykpOworCisJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZXSkgeworCQlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9IVF9DQVBBQklMSVRZX01BU0tdKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbWNweSgmY29ubmVjdC5odF9jYXBhLAorCQkgICAgICAgbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0hUX0NBUEFCSUxJVFldKSwKKwkJICAgICAgIHNpemVvZihjb25uZWN0Lmh0X2NhcGEpKTsKKwl9CisKIAllcnIgPSBjZmc4MDIxMV9jb25uZWN0KHJkZXYsIGRldiwgJmNvbm5lY3QsIGNvbm5rZXlzKTsKIAlpZiAoZXJyKQogCQlrZnJlZShjb25ua2V5cyk7CkBAIC01MDgzLDcgKzUyNzIsOCBAQAogCSAgICBkdXJhdGlvbiA+IHJkZXYtPndpcGh5Lm1heF9yZW1haW5fb25fY2hhbm5lbF9kdXJhdGlvbikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlpZiAoIXJkZXYtPm9wcy0+cmVtYWluX29uX2NoYW5uZWwpCisJaWYgKCFyZGV2LT5vcHMtPnJlbWFpbl9vbl9jaGFubmVsIHx8CisJICAgICEocmRldi0+d2lwaHkuZmxhZ3MgJiBXSVBIWV9GTEFHX0hBU19SRU1BSU5fT05fQ0hBTk5FTCkpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfV0lQSFlfQ0hBTk5FTF9UWVBFXSkgewpAQCAtNTI3MSwxMiArNTQ2MSwxMyBAQAogCWJvb2wgY2hhbm5lbF90eXBlX3ZhbGlkID0gZmFsc2U7CiAJdTMyIGZyZXE7CiAJaW50IGVycjsKLQl2b2lkICpoZHI7CisJdm9pZCAqaGRyID0gTlVMTDsKIAl1NjQgY29va2llOwotCXN0cnVjdCBza19idWZmICptc2c7CisJc3RydWN0IHNrX2J1ZmYgKm1zZyA9IE5VTEw7CiAJdW5zaWduZWQgaW50IHdhaXQgPSAwOwotCWJvb2wgb2ZmY2hhbjsKLQlib29sIG5vX2NjazsKKwlib29sIG9mZmNoYW4sIG5vX2NjaywgZG9udF93YWl0X2Zvcl9hY2s7CisKKwlkb250X3dhaXRfZm9yX2FjayA9IGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9ET05UX1dBSVRfRk9SX0FDS107CiAKIAlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9GUkFNRV0gfHwKIAkgICAgIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9XSVBIWV9GUkVRXSkKQEAgLTUyOTUsNyArNTQ4Niw3IEBACiAJCXJldHVybiAtRU9QTk9UU1VQUDsKIAogCWlmIChpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfRFVSQVRJT05dKSB7Ci0JCWlmICghcmRldi0+b3BzLT5tZ210X3R4X2NhbmNlbF93YWl0KQorCQlpZiAoIShyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfT0ZGQ0hBTl9UWCkpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJd2FpdCA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9EVVJBVElPTl0pOwogCX0KQEAgLTUzMTMsNiArNTUwNCw5IEBACiAKIAlvZmZjaGFuID0gaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX09GRkNIQU5ORUxfVFhfT0tdOwogCisJaWYgKG9mZmNoYW4gJiYgIShyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfT0ZGQ0hBTl9UWCkpCisJCXJldHVybiAtRUlOVkFMOworCiAJbm9fY2NrID0gbmxhX2dldF9mbGFnKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9UWF9OT19DQ0tfUkFURV0pOwogCiAJZnJlcSA9IG5sYV9nZXRfdTMyKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9XSVBIWV9GUkVRXSk7CkBAIC01MzIwLDI5ICs1NTE0LDM2IEBACiAJaWYgKGNoYW4gPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKLQlpZiAoIW1zZykKLQkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCFkb250X3dhaXRfZm9yX2FjaykgeworCQltc2cgPSBubG1zZ19uZXcoTkxNU0dfREVGQVVMVF9TSVpFLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFtc2cpCisJCQlyZXR1cm4gLUVOT01FTTsKIAotCWhkciA9IG5sODAyMTFoZHJfcHV0KG1zZywgaW5mby0+c25kX3BpZCwgaW5mby0+c25kX3NlcSwgMCwKLQkJCSAgICAgTkw4MDIxMV9DTURfRlJBTUUpOworCQloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIGluZm8tPnNuZF9waWQsIGluZm8tPnNuZF9zZXEsIDAsCisJCQkJICAgICBOTDgwMjExX0NNRF9GUkFNRSk7CiAKLQlpZiAoSVNfRVJSKGhkcikpIHsKLQkJZXJyID0gUFRSX0VSUihoZHIpOwotCQlnb3RvIGZyZWVfbXNnOworCQlpZiAoSVNfRVJSKGhkcikpIHsKKwkJCWVyciA9IFBUUl9FUlIoaGRyKTsKKwkJCWdvdG8gZnJlZV9tc2c7CisJCX0KIAl9CisKIAllcnIgPSBjZmc4MDIxMV9tbG1lX21nbXRfdHgocmRldiwgZGV2LCBjaGFuLCBvZmZjaGFuLCBjaGFubmVsX3R5cGUsCiAJCQkJICAgIGNoYW5uZWxfdHlwZV92YWxpZCwgd2FpdCwKIAkJCQkgICAgbmxhX2RhdGEoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0ZSQU1FXSksCiAJCQkJICAgIG5sYV9sZW4oaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX0ZSQU1FXSksCi0JCQkJICAgIG5vX2NjaywgJmNvb2tpZSk7CisJCQkJICAgIG5vX2NjaywgZG9udF93YWl0X2Zvcl9hY2ssICZjb29raWUpOwogCWlmIChlcnIpCiAJCWdvdG8gZnJlZV9tc2c7CiAKLQlOTEFfUFVUX1U2NChtc2csIE5MODAyMTFfQVRUUl9DT09LSUUsIGNvb2tpZSk7CisJaWYgKG1zZykgeworCQlOTEFfUFVUX1U2NChtc2csIE5MODAyMTFfQVRUUl9DT09LSUUsIGNvb2tpZSk7CiAKLQlnZW5sbXNnX2VuZChtc2csIGhkcik7Ci0JcmV0dXJuIGdlbmxtc2dfcmVwbHkobXNnLCBpbmZvKTsKKwkJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCQlyZXR1cm4gZ2VubG1zZ19yZXBseShtc2csIGluZm8pOworCX0KKworCXJldHVybiAwOwogCiAgbmxhX3B1dF9mYWlsdXJlOgogCWVyciA9IC1FTk9CVUZTOwpAQCAtNTU0MCw2ICs1NzQxLDExIEBACiAJc2V0dXAubWVzaF9pZCA9IG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NRVNIX0lEXSk7CiAJc2V0dXAubWVzaF9pZF9sZW4gPSBubGFfbGVuKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NRVNIX0lEXSk7CiAKKwlpZiAoaW5mby0+YXR0cnNbTkw4MDIxMV9BVFRSX01DQVNUX1JBVEVdICYmCisJICAgICFubDgwMjExX3BhcnNlX21jYXN0X3JhdGUocmRldiwgc2V0dXAubWNhc3RfcmF0ZSwKKwkJCSAgICBubGFfZ2V0X3UzMihpbmZvLT5hdHRyc1tOTDgwMjExX0FUVFJfTUNBU1RfUkFURV0pKSkKKwkJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NRVNIX1NFVFVQXSkgewogCQkvKiBwYXJzZSBhZGRpdGlvbmFsIHNldHVwIHBhcmFtZXRlcnMgaWYgZ2l2ZW4gKi8KIAkJZXJyID0gbmw4MDIxMV9wYXJzZV9tZXNoX3NldHVwKGluZm8sICZzZXR1cCk7CkBAIC01ODMyLDYgKzYwMzgsOTEgQEAKIAlyZXR1cm4gZXJyOwogfQogCitzdGF0aWMgaW50IG5sODAyMTFfcmVnaXN0ZXJfdW5leHBlY3RlZF9mcmFtZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCQkgICAgIHN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPnVzZXJfcHRyWzFdOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisKKwlpZiAod2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX0FQICYmCisJICAgIHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfR08pCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdkZXYtPmFwX3VuZXhwZWN0ZWRfbmxwaWQpCisJCXJldHVybiAtRUJVU1k7CisKKwl3ZGV2LT5hcF91bmV4cGVjdGVkX25scGlkID0gaW5mby0+c25kX3BpZDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBubDgwMjExX3Byb2JlX2NsaWVudChzdHJ1Y3Qgc2tfYnVmZiAqc2tiLAorCQkJCXN0cnVjdCBnZW5sX2luZm8gKmluZm8pCit7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gaW5mby0+dXNlcl9wdHJbMF07CisJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IGluZm8tPnVzZXJfcHRyWzFdOworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisJc3RydWN0IHNrX2J1ZmYgKm1zZzsKKwl2b2lkICpoZHI7CisJY29uc3QgdTggKmFkZHI7CisJdTY0IGNvb2tpZTsKKwlpbnQgZXJyOworCisJaWYgKHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9BUCAmJgorCSAgICB3ZGV2LT5pZnR5cGUgIT0gTkw4MDIxMV9JRlRZUEVfUDJQX0dPKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAoIWluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NQUNdKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghcmRldi0+b3BzLT5wcm9iZV9jbGllbnQpCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIEdGUF9LRVJORUwpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWhkciA9IG5sODAyMTFoZHJfcHV0KG1zZywgaW5mby0+c25kX3BpZCwgaW5mby0+c25kX3NlcSwgMCwKKwkJCSAgICAgTkw4MDIxMV9DTURfUFJPQkVfQ0xJRU5UKTsKKworCWlmIChJU19FUlIoaGRyKSkgeworCQllcnIgPSBQVFJfRVJSKGhkcik7CisJCWdvdG8gZnJlZV9tc2c7CisJfQorCisJYWRkciA9IG5sYV9kYXRhKGluZm8tPmF0dHJzW05MODAyMTFfQVRUUl9NQUNdKTsKKworCWVyciA9IHJkZXYtPm9wcy0+cHJvYmVfY2xpZW50KCZyZGV2LT53aXBoeSwgZGV2LCBhZGRyLCAmY29va2llKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZyZWVfbXNnOworCisJTkxBX1BVVF9VNjQobXNnLCBOTDgwMjExX0FUVFJfQ09PS0lFLCBjb29raWUpOworCisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOworCisJcmV0dXJuIGdlbmxtc2dfcmVwbHkobXNnLCBpbmZvKTsKKworIG5sYV9wdXRfZmFpbHVyZToKKwllcnIgPSAtRU5PQlVGUzsKKyBmcmVlX21zZzoKKwlubG1zZ19mcmVlKG1zZyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBubDgwMjExX3JlZ2lzdGVyX2JlYWNvbnMoc3RydWN0IHNrX2J1ZmYgKnNrYiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykKK3sKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSBpbmZvLT51c2VyX3B0clswXTsKKworCWlmICghKHJkZXYtPndpcGh5LmZsYWdzICYgV0lQSFlfRkxBR19SRVBPUlRTX09CU1MpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlpZiAocmRldi0+YXBfYmVhY29uc19ubHBpZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXJkZXYtPmFwX2JlYWNvbnNfbmxwaWQgPSBpbmZvLT5zbmRfcGlkOworCisJcmV0dXJuIDA7Cit9CisKICNkZWZpbmUgTkw4MDIxMV9GTEFHX05FRURfV0lQSFkJCTB4MDEKICNkZWZpbmUgTkw4MDIxMV9GTEFHX05FRURfTkVUREVWCTB4MDIKICNkZWZpbmUgTkw4MDIxMV9GTEFHX05FRURfUlROTAkJMHgwNApAQCAtNTg1OSw3ICs2MTUwLDggQEAKIAkJfQogCQlpbmZvLT51c2VyX3B0clswXSA9IHJkZXY7CiAJfSBlbHNlIGlmIChvcHMtPmludGVybmFsX2ZsYWdzICYgTkw4MDIxMV9GTEFHX05FRURfTkVUREVWKSB7Ci0JCWVyciA9IGdldF9yZGV2X2Rldl9ieV9pbmZvX2lmaW5kZXgoaW5mbywgJnJkZXYsICZkZXYpOworCQllcnIgPSBnZXRfcmRldl9kZXZfYnlfaWZpbmRleChnZW5sX2luZm9fbmV0KGluZm8pLCBpbmZvLT5hdHRycywKKwkJCQkJICAgICAgJnJkZXYsICZkZXYpOwogCQlpZiAoZXJyKSB7CiAJCQlpZiAocnRubCkKIAkJCQlydG5sX3VubG9jaygpOwpAQCAtNjM4Nyw2ICs2Njc5LDM5IEBACiAJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX05FVERFVl9VUCB8CiAJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAogCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfVU5FWFBFQ1RFRF9GUkFNRSwKKwkJLmRvaXQgPSBubDgwMjExX3JlZ2lzdGVyX3VuZXhwZWN0ZWRfZnJhbWUsCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9ORVRERVYgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAorCXsKKwkJLmNtZCA9IE5MODAyMTFfQ01EX1BST0JFX0NMSUVOVCwKKwkJLmRvaXQgPSBubDgwMjExX3Byb2JlX2NsaWVudCwKKwkJLnBvbGljeSA9IG5sODAyMTFfcG9saWN5LAorCQkuZmxhZ3MgPSBHRU5MX0FETUlOX1BFUk0sCisJCS5pbnRlcm5hbF9mbGFncyA9IE5MODAyMTFfRkxBR19ORUVEX05FVERFViB8CisJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAorCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfUkVHSVNURVJfQkVBQ09OUywKKwkJLmRvaXQgPSBubDgwMjExX3JlZ2lzdGVyX2JlYWNvbnMsCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9XSVBIWSB8CisJCQkJICBOTDgwMjExX0ZMQUdfTkVFRF9SVE5MLAorCX0sCisJeworCQkuY21kID0gTkw4MDIxMV9DTURfU0VUX05PQUNLX01BUCwKKwkJLmRvaXQgPSBubDgwMjExX3NldF9ub2Fja19tYXAsCisJCS5wb2xpY3kgPSBubDgwMjExX3BvbGljeSwKKwkJLmZsYWdzID0gR0VOTF9BRE1JTl9QRVJNLAorCQkuaW50ZXJuYWxfZmxhZ3MgPSBOTDgwMjExX0ZMQUdfTkVFRF9ORVRERVYgfAorCQkJCSAgTkw4MDIxMV9GTEFHX05FRURfUlROTCwKKwl9LAorCiB9OwogCiBzdGF0aWMgc3RydWN0IGdlbmxfbXVsdGljYXN0X2dyb3VwIG5sODAyMTFfbWxtZV9tY2dycCA9IHsKQEAgLTY2MzksMTAgKzY5NjQsNyBAQAogCWlmICh3aXBoeV9pZHhfdmFsaWQocmVxdWVzdC0+d2lwaHlfaWR4KSkKIAkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFksIHJlcXVlc3QtPndpcGh5X2lkeCk7CiAKLQlpZiAoZ2VubG1zZ19lbmQobXNnLCBoZHIpIDwgMCkgewotCQlubG1zZ19mcmVlKG1zZyk7Ci0JCXJldHVybjsKLQl9CisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOwogCiAJcmN1X3JlYWRfbG9jaygpOwogCWdlbmxtc2dfbXVsdGljYXN0X2FsbG5zKG1zZywgMCwgbmw4MDIxMV9yZWd1bGF0b3J5X21jZ3JwLmlkLApAQCAtNjY3OCwxMCArNzAwMCw3IEBACiAJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfSUZJTkRFWCwgbmV0ZGV2LT5pZmluZGV4KTsKIAlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX0ZSQU1FLCBsZW4sIGJ1Zik7CiAKLQlpZiAoZ2VubG1zZ19lbmQobXNnLCBoZHIpIDwgMCkgewotCQlubG1zZ19mcmVlKG1zZyk7Ci0JCXJldHVybjsKLQl9CisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOwogCiAJZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgMCwKIAkJCQlubDgwMjExX21sbWVfbWNncnAuaWQsIGdmcCk7CkBAIC02NzYyLDEwICs3MDgxLDcgQEAKIAlOTEFfUFVUX0ZMQUcobXNnLCBOTDgwMjExX0FUVFJfVElNRURfT1VUKTsKIAlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX01BQywgRVRIX0FMRU4sIGFkZHIpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNjgyMSwxMCArNzEzNyw3IEBACiAJaWYgKHJlc3BfaWUpCiAJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfUkVTUF9JRSwgcmVzcF9pZV9sZW4sIHJlc3BfaWUpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNjg2MiwxMCArNzE3NSw3IEBACiAJaWYgKHJlc3BfaWUpCiAJCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfUkVTUF9JRSwgcmVzcF9pZV9sZW4sIHJlc3BfaWUpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNjkwMywxMCArNzIxMyw3IEBACiAJaWYgKGllKQogCQlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX0lFLCBpZV9sZW4sIGllKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgR0ZQX0tFUk5FTCk7CkBAIC02OTM5LDEwICs3MjQ2LDcgQEAKIAlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBuZXRkZXYtPmlmaW5kZXgpOwogCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfTUFDLCBFVEhfQUxFTiwgYnNzaWQpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNjk3NywxMCArNzI4MSw3IEBACiAJaWYgKGllX2xlbiAmJiBpZSkKIAkJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9JRSwgaWVfbGVuICwgaWUpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNzAxOSwxMCArNzMyMCw3IEBACiAJaWYgKHRzYykKIAkJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9LRVlfU0VRLCA2LCB0c2MpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNzA3MywxMCArNzM3MSw3IEBACiAJCWdvdG8gbmxhX3B1dF9mYWlsdXJlOwogCW5sYV9uZXN0X2VuZChtc2csIG5sX2ZyZXEpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlnZW5sbXNnX211bHRpY2FzdF9hbGxucyhtc2csIDAsIG5sODAyMTFfcmVndWxhdG9yeV9tY2dycC5pZCwKQEAgLTcxMTksMTAgKzc0MTQsNyBAQAogCWlmIChjbWQgPT0gTkw4MDIxMV9DTURfUkVNQUlOX09OX0NIQU5ORUwpCiAJCU5MQV9QVVRfVTMyKG1zZywgTkw4MDIxMV9BVFRSX0RVUkFUSU9OLCBkdXJhdGlvbik7CiAKLQlpZiAoZ2VubG1zZ19lbmQobXNnLCBoZHIpIDwgMCkgewotCQlubG1zZ19mcmVlKG1zZyk7Ci0JCXJldHVybjsKLQl9CisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOwogCiAJZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgMCwKIAkJCQlubDgwMjExX21sbWVfbWNncnAuaWQsIGdmcCk7CkBAIC03MTkzLDEwICs3NDg1LDcgQEAKIAlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBkZXYtPmlmaW5kZXgpOwogCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfTUFDLCBFVEhfQUxFTiwgbWFjX2FkZHIpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNzIwNywxMyArNzQ5Niw2OCBAQAogCW5sbXNnX2ZyZWUobXNnKTsKIH0KIAorc3RhdGljIGJvb2wgX19ubDgwMjExX3VuZXhwZWN0ZWRfZnJhbWUoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTggY21kLAorCQkJCSAgICAgICBjb25zdCB1OCAqYWRkciwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CisJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKKwlzdHJ1Y3Qgc2tfYnVmZiAqbXNnOworCXZvaWQgKmhkcjsKKwlpbnQgZXJyOworCXUzMiBubHBpZCA9IEFDQ0VTU19PTkNFKHdkZXYtPmFwX3VuZXhwZWN0ZWRfbmxwaWQpOworCisJaWYgKCFubHBpZCkKKwkJcmV0dXJuIGZhbHNlOworCisJbXNnID0gbmxtc2dfbmV3KDEwMCwgZ2ZwKTsKKwlpZiAoIW1zZykKKwkJcmV0dXJuIHRydWU7CisKKwloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIDAsIDAsIDAsIGNtZCk7CisJaWYgKCFoZHIpIHsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWSwgcmRldi0+d2lwaHlfaWR4KTsKKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBkZXYtPmlmaW5kZXgpOworCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfTUFDLCBFVEhfQUxFTiwgYWRkcik7CisKKwllcnIgPSBnZW5sbXNnX2VuZChtc2csIGhkcik7CisJaWYgKGVyciA8IDApIHsKKwkJbmxtc2dfZnJlZShtc2cpOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlnZW5sbXNnX3VuaWNhc3Qod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgbmxwaWQpOworCXJldHVybiB0cnVlOworCisgbmxhX3B1dF9mYWlsdXJlOgorCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKKwlubG1zZ19mcmVlKG1zZyk7CisJcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgbmw4MDIxMV91bmV4cGVjdGVkX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICphZGRyLCBnZnBfdCBnZnApCit7CisJcmV0dXJuIF9fbmw4MDIxMV91bmV4cGVjdGVkX2ZyYW1lKGRldiwgTkw4MDIxMV9DTURfVU5FWFBFQ1RFRF9GUkFNRSwKKwkJCQkJICBhZGRyLCBnZnApOworfQorCitib29sIG5sODAyMTFfdW5leHBlY3RlZF80YWRkcl9mcmFtZShzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAorCQkJCSAgICBjb25zdCB1OCAqYWRkciwgZ2ZwX3QgZ2ZwKQoreworCXJldHVybiBfX25sODAyMTFfdW5leHBlY3RlZF9mcmFtZShkZXYsCisJCQkJCSAgTkw4MDIxMV9DTURfVU5FWFBFQ1RFRF80QUREUl9GUkFNRSwKKwkJCQkJICBhZGRyLCBnZnApOworfQorCiBpbnQgbmw4MDIxMV9zZW5kX21nbXQoc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2LAogCQkgICAgICBzdHJ1Y3QgbmV0X2RldmljZSAqbmV0ZGV2LCB1MzIgbmxwaWQsCiAJCSAgICAgIGludCBmcmVxLCBjb25zdCB1OCAqYnVmLCBzaXplX3QgbGVuLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHNrX2J1ZmYgKm1zZzsKIAl2b2lkICpoZHI7Ci0JaW50IGVycjsKIAogCW1zZyA9IG5sbXNnX25ldyhOTE1TR19ERUZBVUxUX1NJWkUsIGdmcCk7CiAJaWYgKCFtc2cpCkBAIC03MjMwLDE2ICs3NTc0LDkgQEAKIAlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWV9GUkVRLCBmcmVxKTsKIAlOTEFfUFVUKG1zZywgTkw4MDIxMV9BVFRSX0ZSQU1FLCBsZW4sIGJ1Zik7CiAKLQllcnIgPSBnZW5sbXNnX2VuZChtc2csIGhkcik7Ci0JaWYgKGVyciA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm4gZXJyOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKLQllcnIgPSBnZW5sbXNnX3VuaWNhc3Qod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgbmxwaWQpOwotCWlmIChlcnIgPCAwKQotCQlyZXR1cm4gZXJyOwotCXJldHVybiAwOworCXJldHVybiBnZW5sbXNnX3VuaWNhc3Qod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgbmxwaWQpOwogCiAgbmxhX3B1dF9mYWlsdXJlOgogCWdlbmxtc2dfY2FuY2VsKG1zZywgaGRyKTsKQEAgLTcyNzIsMTAgKzc2MDksNyBAQAogCWlmIChhY2spCiAJCU5MQV9QVVRfRkxBRyhtc2csIE5MODAyMTFfQVRUUl9BQ0spOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0KG1zZywgMCwgbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwogCXJldHVybjsKQEAgLTczMTcsMTAgKzc2NTEsNyBAQAogCiAJbmxhX25lc3RfZW5kKG1zZywgcGluZm9hdHRyKTsKIAotCWlmIChnZW5sbXNnX2VuZChtc2csIGhkcikgPCAwKSB7Ci0JCW5sbXNnX2ZyZWUobXNnKTsKLQkJcmV0dXJuOwotCX0KKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CiAKIAlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAogCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKQEAgLTczNjIsMTAgKzc2OTMsNyBAQAogCiAJbmxhX25lc3RfZW5kKG1zZywgcmVrZXlfYXR0cik7CiAKLQlpZiAoZ2VubG1zZ19lbmQobXNnLCBoZHIpIDwgMCkgewotCQlubG1zZ19mcmVlKG1zZyk7Ci0JCXJldHVybjsKLQl9CisJZ2VubG1zZ19lbmQobXNnLCBoZHIpOwogCiAJZ2VubG1zZ19tdWx0aWNhc3RfbmV0bnMod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgMCwKIAkJCQlubDgwMjExX21sbWVfbWNncnAuaWQsIGdmcCk7CkBAIC03NDA4LDEwICs3NzM2LDcgQEAKIAogCW5sYV9uZXN0X2VuZChtc2csIGF0dHIpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKLQkJbmxtc2dfZnJlZShtc2cpOwotCQlyZXR1cm47Ci0JfQorCWdlbmxtc2dfZW5kKG1zZywgaGRyKTsKIAogCWdlbmxtc2dfbXVsdGljYXN0X25ldG5zKHdpcGh5X25ldCgmcmRldi0+d2lwaHkpLCBtc2csIDAsCiAJCQkJbmw4MDIxMV9tbG1lX21jZ3JwLmlkLCBnZnApOwpAQCAtNzQ1Myw3ICs3Nzc4LDQ1IEBACiAKIAlubGFfbmVzdF9lbmQobXNnLCBwaW5mb2F0dHIpOwogCi0JaWYgKGdlbmxtc2dfZW5kKG1zZywgaGRyKSA8IDApIHsKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisKKwlnZW5sbXNnX211bHRpY2FzdF9uZXRucyh3aXBoeV9uZXQoJnJkZXYtPndpcGh5KSwgbXNnLCAwLAorCQkJCW5sODAyMTFfbWxtZV9tY2dycC5pZCwgZ2ZwKTsKKwlyZXR1cm47CisKKyBubGFfcHV0X2ZhaWx1cmU6CisJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOworCW5sbXNnX2ZyZWUobXNnKTsKK30KKwordm9pZCBjZmc4MDIxMV9wcm9iZV9zdGF0dXMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgY29uc3QgdTggKmFkZHIsCisJCQkgICB1NjQgY29va2llLCBib29sIGFja2VkLCBnZnBfdCBnZnApCit7CisJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKKwlzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKnJkZXYgPSB3aXBoeV90b19kZXYod2Rldi0+d2lwaHkpOworCXN0cnVjdCBza19idWZmICptc2c7CisJdm9pZCAqaGRyOworCWludCBlcnI7CisKKwltc2cgPSBubG1zZ19uZXcoTkxNU0dfR09PRFNJWkUsIGdmcCk7CisJaWYgKCFtc2cpCisJCXJldHVybjsKKworCWhkciA9IG5sODAyMTFoZHJfcHV0KG1zZywgMCwgMCwgMCwgTkw4MDIxMV9DTURfUFJPQkVfQ0xJRU5UKTsKKwlpZiAoIWhkcikgeworCQlubG1zZ19mcmVlKG1zZyk7CisJCXJldHVybjsKKwl9CisKKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWSwgcmRldi0+d2lwaHlfaWR4KTsKKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9JRklOREVYLCBkZXYtPmlmaW5kZXgpOworCU5MQV9QVVQobXNnLCBOTDgwMjExX0FUVFJfTUFDLCBFVEhfQUxFTiwgYWRkcik7CisJTkxBX1BVVF9VNjQobXNnLCBOTDgwMjExX0FUVFJfQ09PS0lFLCBjb29raWUpOworCWlmIChhY2tlZCkKKwkJTkxBX1BVVF9GTEFHKG1zZywgTkw4MDIxMV9BVFRSX0FDSyk7CisKKwllcnIgPSBnZW5sbXNnX2VuZChtc2csIGhkcik7CisJaWYgKGVyciA8IDApIHsKIAkJbmxtc2dfZnJlZShtc2cpOwogCQlyZXR1cm47CiAJfQpAQCAtNzQ2Niw2ICs3ODI5LDQ1IEBACiAJZ2VubG1zZ19jYW5jZWwobXNnLCBoZHIpOwogCW5sbXNnX2ZyZWUobXNnKTsKIH0KK0VYUE9SVF9TWU1CT0woY2ZnODAyMTFfcHJvYmVfc3RhdHVzKTsKKwordm9pZCBjZmc4MDIxMV9yZXBvcnRfb2Jzc19iZWFjb24oc3RydWN0IHdpcGh5ICp3aXBoeSwKKwkJCQkgY29uc3QgdTggKmZyYW1lLCBzaXplX3QgbGVuLAorCQkJCSBpbnQgZnJlcSwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3aXBoeSk7CisJc3RydWN0IHNrX2J1ZmYgKm1zZzsKKwl2b2lkICpoZHI7CisJdTMyIG5scGlkID0gQUNDRVNTX09OQ0UocmRldi0+YXBfYmVhY29uc19ubHBpZCk7CisKKwlpZiAoIW5scGlkKQorCQlyZXR1cm47CisKKwltc2cgPSBubG1zZ19uZXcobGVuICsgMTAwLCBnZnApOworCWlmICghbXNnKQorCQlyZXR1cm47CisKKwloZHIgPSBubDgwMjExaGRyX3B1dChtc2csIDAsIDAsIDAsIE5MODAyMTFfQ01EX0ZSQU1FKTsKKwlpZiAoIWhkcikgeworCQlubG1zZ19mcmVlKG1zZyk7CisJCXJldHVybjsKKwl9CisKKwlOTEFfUFVUX1UzMihtc2csIE5MODAyMTFfQVRUUl9XSVBIWSwgcmRldi0+d2lwaHlfaWR4KTsKKwlpZiAoZnJlcSkKKwkJTkxBX1BVVF9VMzIobXNnLCBOTDgwMjExX0FUVFJfV0lQSFlfRlJFUSwgZnJlcSk7CisJTkxBX1BVVChtc2csIE5MODAyMTFfQVRUUl9GUkFNRSwgbGVuLCBmcmFtZSk7CisKKwlnZW5sbXNnX2VuZChtc2csIGhkcik7CisKKwlnZW5sbXNnX3VuaWNhc3Qod2lwaHlfbmV0KCZyZGV2LT53aXBoeSksIG1zZywgbmxwaWQpOworCXJldHVybjsKKworIG5sYV9wdXRfZmFpbHVyZToKKwlnZW5sbXNnX2NhbmNlbChtc2csIGhkcik7CisJbmxtc2dfZnJlZShtc2cpOworfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9yZXBvcnRfb2Jzc19iZWFjb24pOwogCiBzdGF0aWMgaW50IG5sODAyMTFfbmV0bGlua19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICogbmIsCiAJCQkJICB1bnNpZ25lZCBsb25nIHN0YXRlLApAQCAtNzQ4MCw5ICs3ODgyLDEyIEBACiAKIAlyY3VfcmVhZF9sb2NrKCk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShyZGV2LCAmY2ZnODAyMTFfcmRldl9saXN0LCBsaXN0KQorCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHJkZXYsICZjZmc4MDIxMV9yZGV2X2xpc3QsIGxpc3QpIHsKIAkJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3Uod2RldiwgJnJkZXYtPm5ldGRldl9saXN0LCBsaXN0KQogCQkJY2ZnODAyMTFfbWxtZV91bnJlZ2lzdGVyX3NvY2tldCh3ZGV2LCBub3RpZnktPnBpZCk7CisJCWlmIChyZGV2LT5hcF9iZWFjb25zX25scGlkID09IG5vdGlmeS0+cGlkKQorCQkJcmRldi0+YXBfYmVhY29uc19ubHBpZCA9IDA7CisJfQogCiAJcmN1X3JlYWRfdW5sb2NrKCk7CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9ubDgwMjExLmggYi9uZXQvd2lyZWxlc3Mvbmw4MDIxMS5oCmluZGV4IGYyNGExZmIuLjEyYmY0ZDEgMTAwNjQ0Ci0tLSBhL25ldC93aXJlbGVzcy9ubDgwMjExLmgKKysrIGIvbmV0L3dpcmVsZXNzL25sODAyMTEuaApAQCAtMTE3LDQgKzExNyw5IEBACiAJCQkJICAgIHN0cnVjdCBuZXRfZGV2aWNlICpuZXRkZXYsIGludCBpbmRleCwKIAkJCQkgICAgY29uc3QgdTggKmJzc2lkLCBib29sIHByZWF1dGgsIGdmcF90IGdmcCk7CiAKK2Jvb2wgbmw4MDIxMV91bmV4cGVjdGVkX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkgICAgICBjb25zdCB1OCAqYWRkciwgZ2ZwX3QgZ2ZwKTsKK2Jvb2wgbmw4MDIxMV91bmV4cGVjdGVkXzRhZGRyX2ZyYW1lKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCisJCQkJICAgIGNvbnN0IHU4ICphZGRyLCBnZnBfdCBnZnApOworCiAjZW5kaWYgLyogX19ORVRfV0lSRUxFU1NfTkw4MDIxMV9IICovCmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvcmVnLmMgYi9uZXQvd2lyZWxlc3MvcmVnLmMKaW5kZXggZTcxZjVhNi4uZjY1ZmVhYSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3JlZy5jCisrKyBiL25ldC93aXJlbGVzcy9yZWcuYwpAQCAtMiwxMyArMiwyMiBAQAogICogQ29weXJpZ2h0IDIwMDItMjAwNSwgSW5zdGFudDgwMiBOZXR3b3JrcywgSW5jLgogICogQ29weXJpZ2h0IDIwMDUtMjAwNiwgRGV2aWNlc2NhcGUgU29mdHdhcmUsIEluYy4KICAqIENvcHlyaWdodCAyMDA3CUpvaGFubmVzIEJlcmcgPGpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXQ+Ci0gKiBDb3B5cmlnaHQgMjAwOAlMdWlzIFIuIFJvZHJpZ3VleiA8bHJvZHJpZ3V6QGF0aGVyb3MuY29tPgorICogQ29weXJpZ2h0IDIwMDgtMjAxMQlMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHFjYS5xdWFsY29tbS5jb20+CiAgKgotICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCi0gKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQorICogcHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcy4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMKKyAqIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCisgKiBBTlkgU1BFQ0lBTCwgRElSRUNULCBJTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTCisgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCisgKiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogICovCiAKKwogLyoqCiAgKiBET0M6IFdpcmVsZXNzIHJlZ3VsYXRvcnkgaW5mcmFzdHJ1Y3R1cmUKICAqCkBAIC01Nyw4ICs2NiwxNyBAQAogI2RlZmluZSBSRUdfREJHX1BSSU5UKGFyZ3MuLi4pCiAjZW5kaWYKIAorc3RhdGljIHN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgY29yZV9yZXF1ZXN0X3dvcmxkID0geworCS5pbml0aWF0b3IgPSBOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09SRSwKKwkuYWxwaGEyWzBdID0gJzAnLAorCS5hbHBoYTJbMV0gPSAnMCcsCisJLmludGVyc2VjdCA9IGZhbHNlLAorCS5wcm9jZXNzZWQgPSB0cnVlLAorCS5jb3VudHJ5X2llX2VudiA9IEVOVklST05fQU5ZLAorfTsKKwogLyogUmVjZWlwdCBvZiBpbmZvcm1hdGlvbiBmcm9tIGxhc3QgcmVndWxhdG9yeSByZXF1ZXN0ICovCi1zdGF0aWMgc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqbGFzdF9yZXF1ZXN0Oworc3RhdGljIHN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QgKmxhc3RfcmVxdWVzdCA9ICZjb3JlX3JlcXVlc3Rfd29ybGQ7CiAKIC8qIFRvIHRyaWdnZXIgdXNlcnNwYWNlIGV2ZW50cyAqLwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnJlZ19wZGV2OwpAQCAtMTUwLDcgKzE2OCw3IEBACiBtb2R1bGVfcGFyYW0oaWVlZTgwMjExX3JlZ2RvbSwgY2hhcnAsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpZWVlODAyMTFfcmVnZG9tLCAiSUVFRSA4MDIuMTEgcmVndWxhdG9yeSBkb21haW4gY29kZSIpOwogCi1zdGF0aWMgdm9pZCByZXNldF9yZWdkb21haW5zKHZvaWQpCitzdGF0aWMgdm9pZCByZXNldF9yZWdkb21haW5zKGJvb2wgZnVsbF9yZXNldCkKIHsKIAkvKiBhdm9pZCBmcmVlaW5nIHN0YXRpYyBpbmZvcm1hdGlvbiBvciBmcmVlaW5nIHNvbWV0aGluZyB0d2ljZSAqLwogCWlmIChjZmc4MDIxMV9yZWdkb21haW4gPT0gY2ZnODAyMTFfd29ybGRfcmVnZG9tKQpAQCAtMTY1LDYgKzE4MywxMyBAQAogCiAJY2ZnODAyMTFfd29ybGRfcmVnZG9tID0gJndvcmxkX3JlZ2RvbTsKIAljZmc4MDIxMV9yZWdkb21haW4gPSBOVUxMOworCisJaWYgKCFmdWxsX3Jlc2V0KQorCQlyZXR1cm47CisKKwlpZiAobGFzdF9yZXF1ZXN0ICE9ICZjb3JlX3JlcXVlc3Rfd29ybGQpCisJCWtmcmVlKGxhc3RfcmVxdWVzdCk7CisJbGFzdF9yZXF1ZXN0ID0gJmNvcmVfcmVxdWVzdF93b3JsZDsKIH0KIAogLyoKQEAgLTE3NSw3ICsyMDAsNyBAQAogewogCUJVR19PTighbGFzdF9yZXF1ZXN0KTsKIAotCXJlc2V0X3JlZ2RvbWFpbnMoKTsKKwlyZXNldF9yZWdkb21haW5zKGZhbHNlKTsKIAogCWNmZzgwMjExX3dvcmxkX3JlZ2RvbSA9IHJkOwogCWNmZzgwMjExX3JlZ2RvbWFpbiA9IHJkOwpAQCAtODU3LDEwICs4ODIsMjIgQEAKIAljaGFuLT5mbGFncyA9IGZsYWdzIHwgYndfZmxhZ3MgfCBtYXBfcmVnZG9tX2ZsYWdzKHJlZ19ydWxlLT5mbGFncyk7CiAJY2hhbi0+bWF4X2FudGVubmFfZ2FpbiA9IG1pbihjaGFuLT5vcmlnX21hZywKIAkJKGludCkgTUJJX1RPX0RCSShwb3dlcl9ydWxlLT5tYXhfYW50ZW5uYV9nYWluKSk7Ci0JaWYgKGNoYW4tPm9yaWdfbXB3cikKLQkJY2hhbi0+bWF4X3Bvd2VyID0gbWluKGNoYW4tPm9yaWdfbXB3ciwKLQkJCShpbnQpIE1CTV9UT19EQk0ocG93ZXJfcnVsZS0+bWF4X2VpcnApKTsKLQllbHNlCisJaWYgKGNoYW4tPm9yaWdfbXB3cikgeworCQkvKgorCQkgKiBEZXZpY2VzIHRoYXQgaGF2ZSB0aGVpciBvd24gY3VzdG9tIHJlZ3VsYXRvcnkgZG9tYWluCisJCSAqIGJ1dCBhbHNvIHVzZSBXSVBIWV9GTEFHX1NUUklDVF9SRUdVTEFUT1JZIHdpbGwgZm9sbG93IHRoZQorCQkgKiBwYXNzZWQgY291bnRyeSBJRSBwb3dlciBzZXR0aW5ncy4KKwkJICovCisJCWlmIChpbml0aWF0b3IgPT0gTkw4MDIxMV9SRUdET01fU0VUX0JZX0NPVU5UUllfSUUgJiYKKwkJICAgIHdpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkgJiYKKwkJICAgIHdpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfU1RSSUNUX1JFR1VMQVRPUlkpIHsKKwkJCWNoYW4tPm1heF9wb3dlciA9CisJCQkJTUJNX1RPX0RCTShwb3dlcl9ydWxlLT5tYXhfZWlycCk7CisJCX0gZWxzZSB7CisJCQljaGFuLT5tYXhfcG93ZXIgPSBtaW4oY2hhbi0+b3JpZ19tcHdyLAorCQkJCShpbnQpIE1CTV9UT19EQk0ocG93ZXJfcnVsZS0+bWF4X2VpcnApKTsKKwkJfQorCX0gZWxzZQogCQljaGFuLT5tYXhfcG93ZXIgPSAoaW50KSBNQk1fVE9fREJNKHBvd2VyX3J1bGUtPm1heF9laXJwKTsKIH0KIApAQCAtMTEyMyw2ICsxMTYwLDggQEAKIAlpZiAoaWdub3JlX3JlZ191cGRhdGUod2lwaHksIGluaXRpYXRvcikpCiAJCXJldHVybjsKIAorCWxhc3RfcmVxdWVzdC0+ZGZzX3JlZ2lvbiA9IGNmZzgwMjExX3JlZ2RvbWFpbi0+ZGZzX3JlZ2lvbjsKKwogCWZvciAoYmFuZCA9IDA7IGJhbmQgPCBJRUVFODAyMTFfTlVNX0JBTkRTOyBiYW5kKyspIHsKIAkJaWYgKHdpcGh5LT5iYW5kc1tiYW5kXSkKIAkJCWhhbmRsZV9iYW5kKHdpcGh5LCBiYW5kLCBpbml0aWF0b3IpOwpAQCAtMTE0NSw5ICsxMTg0LDIxIEBACiBzdGF0aWMgdm9pZCB1cGRhdGVfYWxsX3dpcGh5X3JlZ3VsYXRvcnkoZW51bSBubDgwMjExX3JlZ19pbml0aWF0b3IgaW5pdGlhdG9yKQogewogCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldjsKKwlzdHJ1Y3Qgd2lwaHkgKndpcGh5OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmY2ZnODAyMTFfcmRldl9saXN0LCBsaXN0KQotCQl3aXBoeV91cGRhdGVfcmVndWxhdG9yeSgmcmRldi0+d2lwaHksIGluaXRpYXRvcik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmY2ZnODAyMTFfcmRldl9saXN0LCBsaXN0KSB7CisJCXdpcGh5ID0gJnJkZXYtPndpcGh5OworCQl3aXBoeV91cGRhdGVfcmVndWxhdG9yeSh3aXBoeSwgaW5pdGlhdG9yKTsKKwkJLyoKKwkJICogUmVndWxhdG9yeSB1cGRhdGVzIHNldCBieSBDT1JFIGFyZSBpZ25vcmVkIGZvciBjdXN0b20KKwkJICogcmVndWxhdG9yeSBjYXJkcy4gTGV0IHVzIG5vdGlmeSB0aGUgY2hhbmdlcyB0byB0aGUgZHJpdmVyLAorCQkgKiBhcyBzb21lIGRyaXZlcnMgdXNlZCB0aGlzIHRvIHJlc3RvcmUgaXRzIG9yaWdfKiByZWcgZG9tYWluLgorCQkgKi8KKwkJaWYgKGluaXRpYXRvciA9PSBOTDgwMjExX1JFR0RPTV9TRVRfQllfQ09SRSAmJgorCQkgICAgd2lwaHktPmZsYWdzICYgV0lQSFlfRkxBR19DVVNUT01fUkVHVUxBVE9SWSAmJgorCQkgICAgd2lwaHktPnJlZ19ub3RpZmllcikKKwkJCXdpcGh5LT5yZWdfbm90aWZpZXIod2lwaHksIGxhc3RfcmVxdWVzdCk7CisJfQogfQogCiBzdGF0aWMgdm9pZCBoYW5kbGVfY2hhbm5lbF9jdXN0b20oc3RydWN0IHdpcGh5ICp3aXBoeSwKQEAgLTE0MDcsNyArMTQ1OCw4IEBACiAJfQogCiBuZXdfcmVxdWVzdDoKLQlrZnJlZShsYXN0X3JlcXVlc3QpOworCWlmIChsYXN0X3JlcXVlc3QgIT0gJmNvcmVfcmVxdWVzdF93b3JsZCkKKwkJa2ZyZWUobGFzdF9yZXF1ZXN0KTsKIAogCWxhc3RfcmVxdWVzdCA9IHBlbmRpbmdfcmVxdWVzdDsKIAlsYXN0X3JlcXVlc3QtPmludGVyc2VjdCA9IGludGVyc2VjdDsKQEAgLTE0MzcsMTggKzE0ODksMTggQEAKIH0KIAogLyogVGhpcyBwcm9jZXNzZXMgKmFsbCogcmVndWxhdG9yeSBoaW50cyAqLwotc3RhdGljIHZvaWQgcmVnX3Byb2Nlc3NfaGludChzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZWdfcmVxdWVzdCkKK3N0YXRpYyB2b2lkIHJlZ19wcm9jZXNzX2hpbnQoc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVnX3JlcXVlc3QsCisJCQkgICAgIGVudW0gbmw4MDIxMV9yZWdfaW5pdGlhdG9yIHJlZ19pbml0aWF0b3IpCiB7CiAJaW50IHIgPSAwOwogCXN0cnVjdCB3aXBoeSAqd2lwaHkgPSBOVUxMOwotCWVudW0gbmw4MDIxMV9yZWdfaW5pdGlhdG9yIGluaXRpYXRvciA9IHJlZ19yZXF1ZXN0LT5pbml0aWF0b3I7CiAKIAlCVUdfT04oIXJlZ19yZXF1ZXN0LT5hbHBoYTIpOwogCiAJaWYgKHdpcGh5X2lkeF92YWxpZChyZWdfcmVxdWVzdC0+d2lwaHlfaWR4KSkKIAkJd2lwaHkgPSB3aXBoeV9pZHhfdG9fd2lwaHkocmVnX3JlcXVlc3QtPndpcGh5X2lkeCk7CiAKLQlpZiAocmVnX3JlcXVlc3QtPmluaXRpYXRvciA9PSBOTDgwMjExX1JFR0RPTV9TRVRfQllfRFJJVkVSICYmCisJaWYgKHJlZ19pbml0aWF0b3IgPT0gTkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUiAmJgogCSAgICAhd2lwaHkpIHsKIAkJa2ZyZWUocmVnX3JlcXVlc3QpOwogCQlyZXR1cm47CkBAIC0xNDU4LDcgKzE1MTAsNyBAQAogCS8qIFRoaXMgaXMgcmVxdWlyZWQgc28gdGhhdCB0aGUgb3JpZ18qIHBhcmFtZXRlcnMgYXJlIHNhdmVkICovCiAJaWYgKHIgPT0gLUVBTFJFQURZICYmIHdpcGh5ICYmCiAJICAgIHdpcGh5LT5mbGFncyAmIFdJUEhZX0ZMQUdfU1RSSUNUX1JFR1VMQVRPUlkpIHsKLQkJd2lwaHlfdXBkYXRlX3JlZ3VsYXRvcnkod2lwaHksIGluaXRpYXRvcik7CisJCXdpcGh5X3VwZGF0ZV9yZWd1bGF0b3J5KHdpcGh5LCByZWdfaW5pdGlhdG9yKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTQ2Nyw3ICsxNTE5LDcgQEAKIAkgKiBzb3VyY2Ugb2YgYm9ndXMgcmVxdWVzdHMuCiAJICovCiAJaWYgKHIgIT0gLUVBTFJFQURZICYmCi0JICAgIHJlZ19yZXF1ZXN0LT5pbml0aWF0b3IgPT0gTkw4MDIxMV9SRUdET01fU0VUX0JZX1VTRVIpCisJICAgIHJlZ19pbml0aWF0b3IgPT0gTkw4MDIxMV9SRUdET01fU0VUX0JZX1VTRVIpCiAJCXNjaGVkdWxlX2RlbGF5ZWRfd29yaygmcmVnX3RpbWVvdXQsIG1zZWNzX3RvX2ppZmZpZXMoMzE0MikpOwogfQogCkBAIC0xNTA0LDcgKzE1NTYsNyBAQAogCiAJc3Bpbl91bmxvY2soJnJlZ19yZXF1ZXN0c19sb2NrKTsKIAotCXJlZ19wcm9jZXNzX2hpbnQocmVnX3JlcXVlc3QpOworCXJlZ19wcm9jZXNzX2hpbnQocmVnX3JlcXVlc3QsIHJlZ19yZXF1ZXN0LT5pbml0aWF0b3IpOwogCiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZyZWdfbXV0ZXgpOwpAQCAtMTU3Nyw5ICsxNjI5LDYgQEAKIHsKIAlzdHJ1Y3QgcmVndWxhdG9yeV9yZXF1ZXN0ICpyZXF1ZXN0OwogCi0Ja2ZyZWUobGFzdF9yZXF1ZXN0KTsKLQlsYXN0X3JlcXVlc3QgPSBOVUxMOwotCiAJcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCByZWd1bGF0b3J5X3JlcXVlc3QpLAogCQkJICBHRlBfS0VSTkVMKTsKIAlpZiAoIXJlcXVlc3QpCkBAIC0xNzUyLDYgKzE4MDEsMjYgQEAKIAkJUkVHX0RCR19QUklOVCgiUmVzdG9yaW5nIHJlZ3VsYXRvcnkgc2V0dGluZ3NcbiIpOwogfQogCitzdGF0aWMgdm9pZCByZXN0b3JlX2N1c3RvbV9yZWdfc2V0dGluZ3Moc3RydWN0IHdpcGh5ICp3aXBoeSkKK3sKKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBvcnRlZF9iYW5kICpzYmFuZDsKKwllbnVtIGllZWU4MDIxMV9iYW5kIGJhbmQ7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOworCWludCBpOworCisJZm9yIChiYW5kID0gMDsgYmFuZCA8IElFRUU4MDIxMV9OVU1fQkFORFM7IGJhbmQrKykgeworCQlzYmFuZCA9IHdpcGh5LT5iYW5kc1tiYW5kXTsKKwkJaWYgKCFzYmFuZCkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGkgPSAwOyBpIDwgc2JhbmQtPm5fY2hhbm5lbHM7IGkrKykgeworCQkJY2hhbiA9ICZzYmFuZC0+Y2hhbm5lbHNbaV07CisJCQljaGFuLT5mbGFncyA9IGNoYW4tPm9yaWdfZmxhZ3M7CisJCQljaGFuLT5tYXhfYW50ZW5uYV9nYWluID0gY2hhbi0+b3JpZ19tYWc7CisJCQljaGFuLT5tYXhfcG93ZXIgPSBjaGFuLT5vcmlnX21wd3I7CisJCX0KKwl9Cit9CisKIC8qCiAgKiBSZXN0b3JpbmcgcmVndWxhdG9yeSBzZXR0aW5ncyBpbnZvbHZlcyBpbmdvcmluZyBhbnkKICAqIHBvc3NpYmx5IHN0YWxlIGNvdW50cnkgSUUgaW5mb3JtYXRpb24gYW5kIHVzZXIgcmVndWxhdG9yeQpAQCAtMTc3MCwxNCArMTgzOSwxNiBAQAogc3RhdGljIHZvaWQgcmVzdG9yZV9yZWd1bGF0b3J5X3NldHRpbmdzKGJvb2wgcmVzZXRfdXNlcikKIHsKIAljaGFyIGFscGhhMlsyXTsKKwljaGFyIHdvcmxkX2FscGhhMlsyXTsKIAlzdHJ1Y3QgcmVnX2JlYWNvbiAqcmVnX2JlYWNvbiwgKmJ0bXA7CiAJc3RydWN0IHJlZ3VsYXRvcnlfcmVxdWVzdCAqcmVnX3JlcXVlc3QsICp0bXA7CiAJTElTVF9IRUFEKHRtcF9yZWdfcmVxX2xpc3QpOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldjsKIAogCW11dGV4X2xvY2soJmNmZzgwMjExX211dGV4KTsKIAltdXRleF9sb2NrKCZyZWdfbXV0ZXgpOwogCi0JcmVzZXRfcmVnZG9tYWlucygpOworCXJlc2V0X3JlZ2RvbWFpbnModHJ1ZSk7CiAJcmVzdG9yZV9hbHBoYTIoYWxwaGEyLCByZXNldF91c2VyKTsKIAogCS8qCkBAIC0xODIwLDExICsxODkxLDE4IEBACiAKIAkvKiBGaXJzdCByZXN0b3JlIHRvIHRoZSBiYXNpYyByZWd1bGF0b3J5IHNldHRpbmdzICovCiAJY2ZnODAyMTFfcmVnZG9tYWluID0gY2ZnODAyMTFfd29ybGRfcmVnZG9tOworCXdvcmxkX2FscGhhMlswXSA9IGNmZzgwMjExX3JlZ2RvbWFpbi0+YWxwaGEyWzBdOworCXdvcmxkX2FscGhhMlsxXSA9IGNmZzgwMjExX3JlZ2RvbWFpbi0+YWxwaGEyWzFdOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZGV2LCAmY2ZnODAyMTFfcmRldl9saXN0LCBsaXN0KSB7CisJCWlmIChyZGV2LT53aXBoeS5mbGFncyAmIFdJUEhZX0ZMQUdfQ1VTVE9NX1JFR1VMQVRPUlkpCisJCQlyZXN0b3JlX2N1c3RvbV9yZWdfc2V0dGluZ3MoJnJkZXYtPndpcGh5KTsKKwl9CiAKIAltdXRleF91bmxvY2soJnJlZ19tdXRleCk7CiAJbXV0ZXhfdW5sb2NrKCZjZmc4MDIxMV9tdXRleCk7CiAKLQlyZWd1bGF0b3J5X2hpbnRfY29yZShjZmc4MDIxMV9yZWdkb21haW4tPmFscGhhMik7CisJcmVndWxhdG9yeV9oaW50X2NvcmUod29ybGRfYWxwaGEyKTsKIAogCS8qCiAJICogVGhpcyByZXN0b3JlcyB0aGUgaWVlZTgwMjExX3JlZ2RvbSBtb2R1bGUgcGFyYW1ldGVyCkBAIC0xOTIxLDcgKzE5OTksNyBAQAogCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfZnJlcV9yYW5nZSAqZnJlcV9yYW5nZSA9IE5VTEw7CiAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9wb3dlcl9ydWxlICpwb3dlcl9ydWxlID0gTlVMTDsKIAotCXByX2luZm8oIiAgICAoc3RhcnRfZnJlcSAtIGVuZF9mcmVxIEAgYmFuZHdpZHRoKSwgKG1heF9hbnRlbm5hX2dhaW4sIG1heF9laXJwKVxuIik7CisJcHJfaW5mbygiICAoc3RhcnRfZnJlcSAtIGVuZF9mcmVxIEAgYmFuZHdpZHRoKSwgKG1heF9hbnRlbm5hX2dhaW4sIG1heF9laXJwKVxuIik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgcmQtPm5fcmVnX3J1bGVzOyBpKyspIHsKIAkJcmVnX3J1bGUgPSAmcmQtPnJlZ19ydWxlc1tpXTsKQEAgLTE5MzMsMTQgKzIwMTEsMTQgQEAKIAkJICogaW4gY2VydGFpbiByZWdpb25zCiAJCSAqLwogCQlpZiAocG93ZXJfcnVsZS0+bWF4X2FudGVubmFfZ2FpbikKLQkJCXByX2luZm8oIiAgICAoJWQgS0h6IC0gJWQgS0h6IEAgJWQgS0h6KSwgKCVkIG1CaSwgJWQgbUJtKVxuIiwKKwkJCXByX2luZm8oIiAgKCVkIEtIeiAtICVkIEtIeiBAICVkIEtIeiksICglZCBtQmksICVkIG1CbSlcbiIsCiAJCQkJZnJlcV9yYW5nZS0+c3RhcnRfZnJlcV9raHosCiAJCQkJZnJlcV9yYW5nZS0+ZW5kX2ZyZXFfa2h6LAogCQkJCWZyZXFfcmFuZ2UtPm1heF9iYW5kd2lkdGhfa2h6LAogCQkJCXBvd2VyX3J1bGUtPm1heF9hbnRlbm5hX2dhaW4sCiAJCQkJcG93ZXJfcnVsZS0+bWF4X2VpcnApOwogCQllbHNlCi0JCQlwcl9pbmZvKCIgICAgKCVkIEtIeiAtICVkIEtIeiBAICVkIEtIeiksIChOL0EsICVkIG1CbSlcbiIsCisJCQlwcl9pbmZvKCIgICglZCBLSHogLSAlZCBLSHogQCAlZCBLSHopLCAoTi9BLCAlZCBtQm0pXG4iLAogCQkJCWZyZXFfcmFuZ2UtPnN0YXJ0X2ZyZXFfa2h6LAogCQkJCWZyZXFfcmFuZ2UtPmVuZF9mcmVxX2toeiwKIAkJCQlmcmVxX3JhbmdlLT5tYXhfYmFuZHdpZHRoX2toeiwKQEAgLTE5NDgsNiArMjAyNiw0MiBAQAogCX0KIH0KIAorYm9vbCByZWdfc3VwcG9ydGVkX2Rmc19yZWdpb24odTggZGZzX3JlZ2lvbikKK3sKKwlzd2l0Y2ggKGRmc19yZWdpb24pIHsKKwljYXNlIE5MODAyMTFfREZTX1VOU0VUOgorCWNhc2UgTkw4MDIxMV9ERlNfRkNDOgorCWNhc2UgTkw4MDIxMV9ERlNfRVRTSToKKwljYXNlIE5MODAyMTFfREZTX0pQOgorCQlyZXR1cm4gdHJ1ZTsKKwlkZWZhdWx0OgorCQlSRUdfREJHX1BSSU5UKCJJZ25vcmluZyB1a25vd24gREZTIG1hc3RlciByZWdpb246ICVkXG4iLAorCQkJICAgICAgZGZzX3JlZ2lvbik7CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2Rmc19yZWdpb24odTggZGZzX3JlZ2lvbikKK3sKKwlpZiAoIWRmc19yZWdpb24pCisJCXJldHVybjsKKworCXN3aXRjaCAoZGZzX3JlZ2lvbikgeworCWNhc2UgTkw4MDIxMV9ERlNfRkNDOgorCQlwcl9pbmZvKCIgREZTIE1hc3RlciByZWdpb24gRkNDIik7CisJCWJyZWFrOworCWNhc2UgTkw4MDIxMV9ERlNfRVRTSToKKwkJcHJfaW5mbygiIERGUyBNYXN0ZXIgcmVnaW9uIEVUU0kiKTsKKwkJYnJlYWs7CisJY2FzZSBOTDgwMjExX0RGU19KUDoKKwkJcHJfaW5mbygiIERGUyBNYXN0ZXIgcmVnaW9uIEpQIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByX2luZm8oIiBERlMgTWFzdGVyIHJlZ2lvbiBVa25vd24iKTsKKwkJYnJlYWs7CisJfQorfQorCiBzdGF0aWMgdm9pZCBwcmludF9yZWdkb21haW4oY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJkKQogewogCkBAIC0xOTc1LDYgKzIwODksNyBAQAogCQkJcHJfaW5mbygiUmVndWxhdG9yeSBkb21haW4gY2hhbmdlZCB0byBjb3VudHJ5OiAlYyVjXG4iLAogCQkJCXJkLT5hbHBoYTJbMF0sIHJkLT5hbHBoYTJbMV0pOwogCX0KKwlwcmludF9kZnNfcmVnaW9uKHJkLT5kZnNfcmVnaW9uKTsKIAlwcmludF9yZF9ydWxlcyhyZCk7CiB9CiAKQEAgLTIwMzcsMTIgKzIxNTIsMTggQEAKIAl9CiAKIAlyZXF1ZXN0X3dpcGh5ID0gd2lwaHlfaWR4X3RvX3dpcGh5KGxhc3RfcmVxdWVzdC0+d2lwaHlfaWR4KTsKKwlpZiAoIXJlcXVlc3Rfd2lwaHkgJiYKKwkgICAgKGxhc3RfcmVxdWVzdC0+aW5pdGlhdG9yID09IE5MODAyMTFfUkVHRE9NX1NFVF9CWV9EUklWRVIgfHwKKwkgICAgIGxhc3RfcmVxdWVzdC0+aW5pdGlhdG9yID09IE5MODAyMTFfUkVHRE9NX1NFVF9CWV9DT1VOVFJZX0lFKSkgeworCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnJlZ190aW1lb3V0LCAwKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQogCiAJaWYgKCFsYXN0X3JlcXVlc3QtPmludGVyc2VjdCkgewogCQlpbnQgcjsKIAogCQlpZiAobGFzdF9yZXF1ZXN0LT5pbml0aWF0b3IgIT0gTkw4MDIxMV9SRUdET01fU0VUX0JZX0RSSVZFUikgewotCQkJcmVzZXRfcmVnZG9tYWlucygpOworCQkJcmVzZXRfcmVnZG9tYWlucyhmYWxzZSk7CiAJCQljZmc4MDIxMV9yZWdkb21haW4gPSByZDsKIAkJCXJldHVybiAwOwogCQl9CkBAIC0yMDYzLDcgKzIxODQsNyBAQAogCQlpZiAocikKIAkJCXJldHVybiByOwogCi0JCXJlc2V0X3JlZ2RvbWFpbnMoKTsKKwkJcmVzZXRfcmVnZG9tYWlucyhmYWxzZSk7CiAJCWNmZzgwMjExX3JlZ2RvbWFpbiA9IHJkOwogCQlyZXR1cm4gMDsKIAl9CkBAIC0yMDg4LDcgKzIyMDksNyBAQAogCiAJCXJkID0gTlVMTDsKIAotCQlyZXNldF9yZWdkb21haW5zKCk7CisJCXJlc2V0X3JlZ2RvbWFpbnMoZmFsc2UpOwogCQljZmc4MDIxMV9yZWdkb21haW4gPSBpbnRlcnNlY3RlZF9yZDsKIAogCQlyZXR1cm4gMDsKQEAgLTIxMDgsNyArMjIyOSw3IEBACiAJa2ZyZWUocmQpOwogCXJkID0gTlVMTDsKIAotCXJlc2V0X3JlZ2RvbWFpbnMoKTsKKwlyZXNldF9yZWdkb21haW5zKGZhbHNlKTsKIAljZmc4MDIxMV9yZWdkb21haW4gPSBpbnRlcnNlY3RlZF9yZDsKIAogCXJldHVybiAwOwpAQCAtMjI2MSwxMSArMjM4Miw4IEBACiAJbXV0ZXhfbG9jaygmY2ZnODAyMTFfbXV0ZXgpOwogCW11dGV4X2xvY2soJnJlZ19tdXRleCk7CiAKLQlyZXNldF9yZWdkb21haW5zKCk7CisJcmVzZXRfcmVnZG9tYWlucyh0cnVlKTsKIAotCWtmcmVlKGxhc3RfcmVxdWVzdCk7Ci0KLQlsYXN0X3JlcXVlc3QgPSBOVUxMOwogCWRldl9zZXRfdWV2ZW50X3N1cHByZXNzKCZyZWdfcGRldi0+ZGV2LCB0cnVlKTsKIAogCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHJlZ19wZGV2KTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9yZWcuaCBiL25ldC93aXJlbGVzcy9yZWcuaAppbmRleCA0YTU2Nzk5Li5lMmFhYWY1IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvcmVnLmgKKysrIGIvbmV0L3dpcmVsZXNzL3JlZy5oCkBAIC0xLDEwICsxLDI2IEBACiAjaWZuZGVmIF9fTkVUX1dJUkVMRVNTX1JFR19ICiAjZGVmaW5lIF9fTkVUX1dJUkVMRVNTX1JFR19ICisvKgorICogQ29weXJpZ2h0IDIwMDgtMjAxMQlMdWlzIFIuIFJvZHJpZ3VleiA8bWNncm9mQHFjYS5xdWFsY29tbS5jb20+CisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CisgKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUworICogV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IKKyAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKKyAqIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTgorICogQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YKKyAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCisgKi8KIAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmVnZG9tYWluICpjZmc4MDIxMV9yZWdkb21haW47CiAKIGJvb2wgaXNfd29ybGRfcmVnZG9tKGNvbnN0IGNoYXIgKmFscGhhMik7CiBib29sIHJlZ19pc192YWxpZF9yZXF1ZXN0KGNvbnN0IGNoYXIgKmFscGhhMik7Citib29sIHJlZ19zdXBwb3J0ZWRfZGZzX3JlZ2lvbih1OCBkZnNfcmVnaW9uKTsKIAogaW50IHJlZ3VsYXRvcnlfaGludF91c2VyKGNvbnN0IGNoYXIgKmFscGhhMik7CiAKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9yZWdkYi5oIGIvbmV0L3dpcmVsZXNzL3JlZ2RiLmgKaW5kZXggODE4MjIyYy4uMzI3OWNmYyAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3JlZ2RiLmgKKysrIGIvbmV0L3dpcmVsZXNzL3JlZ2RiLmgKQEAgLTEsNiArMSwyMiBAQAogI2lmbmRlZiBfX1JFR0RCX0hfXwogI2RlZmluZSBfX1JFR0RCX0hfXwogCisvKgorICogQ29weXJpZ2h0IDIwMDkgSm9obiBXLiBMaW52aWxsZSA8bGludmlsbGVAdHV4ZHJpdmVyLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCisgKiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRgorICogT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworCiBleHRlcm4gY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yZWdkb21haW4gKnJlZ19yZWdkYltdOwogZXh0ZXJuIGludCByZWdfcmVnZGJfc2l6ZTsKIApkaWZmIC0tZ2l0IGEvbmV0L3dpcmVsZXNzL3NjYW4uYyBiL25ldC93aXJlbGVzcy9zY2FuLmMKaW5kZXggZGMyM2IzMS4uMzExMTllMyAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3NjYW4uYworKysgYi9uZXQvd2lyZWxlc3Mvc2Nhbi5jCkBAIC0zNTUsOCArMzU1LDggQEAKIAkgICAgc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWVzaGNvbmZfaWUpIC0gMikgPT0gMDsKIH0KIAotc3RhdGljIGludCBjbXBfYnNzKHN0cnVjdCBjZmc4MDIxMV9ic3MgKmEsCi0JCSAgIHN0cnVjdCBjZmc4MDIxMV9ic3MgKmIpCitzdGF0aWMgaW50IGNtcF9ic3NfY29yZShzdHJ1Y3QgY2ZnODAyMTFfYnNzICphLAorCQkJc3RydWN0IGNmZzgwMjExX2JzcyAqYikKIHsKIAlpbnQgcjsKIApAQCAtMzc4LDcgKzM3OCwxNSBAQAogCQkJICAgICAgIGItPmxlbl9pbmZvcm1hdGlvbl9lbGVtZW50cyk7CiAJfQogCi0JciA9IG1lbWNtcChhLT5ic3NpZCwgYi0+YnNzaWQsIEVUSF9BTEVOKTsKKwlyZXR1cm4gbWVtY21wKGEtPmJzc2lkLCBiLT5ic3NpZCwgRVRIX0FMRU4pOworfQorCitzdGF0aWMgaW50IGNtcF9ic3Moc3RydWN0IGNmZzgwMjExX2JzcyAqYSwKKwkJICAgc3RydWN0IGNmZzgwMjExX2JzcyAqYikKK3sKKwlpbnQgcjsKKworCXIgPSBjbXBfYnNzX2NvcmUoYSwgYik7CiAJaWYgKHIpCiAJCXJldHVybiByOwogCkBAIC0zODksNiArMzk3LDUyIEBACiAJCSAgICAgICBiLT5sZW5faW5mb3JtYXRpb25fZWxlbWVudHMpOwogfQogCitzdGF0aWMgaW50IGNtcF9oaWRkZW5fYnNzKHN0cnVjdCBjZmc4MDIxMV9ic3MgKmEsCisJCSAgIHN0cnVjdCBjZmc4MDIxMV9ic3MgKmIpCit7CisJY29uc3QgdTggKmllMTsKKwljb25zdCB1OCAqaWUyOworCWludCBpOworCWludCByOworCisJciA9IGNtcF9ic3NfY29yZShhLCBiKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisKKwlpZTEgPSBjZmc4MDIxMV9maW5kX2llKFdMQU5fRUlEX1NTSUQsCisJCQlhLT5pbmZvcm1hdGlvbl9lbGVtZW50cywKKwkJCWEtPmxlbl9pbmZvcm1hdGlvbl9lbGVtZW50cyk7CisJaWUyID0gY2ZnODAyMTFfZmluZF9pZShXTEFOX0VJRF9TU0lELAorCQkJYi0+aW5mb3JtYXRpb25fZWxlbWVudHMsCisJCQliLT5sZW5faW5mb3JtYXRpb25fZWxlbWVudHMpOworCisJLyogS2V5IGNvbXBhcmF0b3IgbXVzdCB1c2Ugc2FtZSBhbGdvcml0aG0gaW4gYW55IHJiLXRyZWUKKwkgKiBzZWFyY2ggZnVuY3Rpb24gKG9yZGVyIGlzIGltcG9ydGFudCksIG90aGVyd2lzZSBvcmRlcmluZworCSAqIG9mIGl0ZW1zIGluIHRoZSB0cmVlIGlzIGJyb2tlbiBhbmQgc2VhcmNoIGdpdmVzIGluY29ycmVjdAorCSAqIHJlc3VsdHMuIFRoaXMgY29kZSB1c2VzIHNhbWUgb3JkZXIgYXMgY21wX2llcygpIGRvZXMuICovCisKKwkvKiBzb3J0IG1pc3NpbmcgSUUgYmVmb3JlIChsZWZ0IG9mKSBwcmVzZW50IElFICovCisJaWYgKCFpZTEpCisJCXJldHVybiAtMTsKKwlpZiAoIWllMikKKwkJcmV0dXJuIDE7CisKKwkvKiB6ZXJvLXNpemUgU1NJRCBpcyB1c2VkIGFzIGFuIGluZGljYXRpb24gb2YgdGhlIGhpZGRlbiBic3MgKi8KKwlpZiAoIWllMlsxXSkKKwkJcmV0dXJuIDA7CisKKwkvKiBzb3J0IGJ5IGxlbmd0aCBmaXJzdCwgdGhlbiBieSBjb250ZW50cyAqLworCWlmIChpZTFbMV0gIT0gaWUyWzFdKQorCQlyZXR1cm4gaWUyWzFdIC0gaWUxWzFdOworCisJLyogemVyb2VkIFNTSUQgaWUgaXMgYW5vdGhlciBpbmRpY2F0aW9uIG9mIGEgaGlkZGVuIGJzcyAqLworCWZvciAoaSA9IDA7IGkgPCBpZTJbMV07IGkrKykKKwkJaWYgKGllMltpICsgMl0pCisJCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKwogc3RydWN0IGNmZzgwMjExX2JzcyAqY2ZnODAyMTFfZ2V0X2JzcyhzdHJ1Y3Qgd2lwaHkgKndpcGh5LAogCQkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCAqY2hhbm5lbCwKIAkJCQkgICAgICBjb25zdCB1OCAqYnNzaWQsCkBAIC01MDUsNiArNTU5LDQ4IEBACiB9CiAKIHN0YXRpYyBzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICoKK3JiX2ZpbmRfaGlkZGVuX2JzcyhzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldiwKKwkgICAgc3RydWN0IGNmZzgwMjExX2ludGVybmFsX2JzcyAqcmVzKQoreworCXN0cnVjdCByYl9ub2RlICpuID0gZGV2LT5ic3NfdHJlZS5yYl9ub2RlOworCXN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKmJzczsKKwlpbnQgcjsKKworCXdoaWxlIChuKSB7CisJCWJzcyA9IHJiX2VudHJ5KG4sIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MsIHJibik7CisJCXIgPSBjbXBfaGlkZGVuX2JzcygmcmVzLT5wdWIsICZic3MtPnB1Yik7CisKKwkJaWYgKHIgPT0gMCkKKwkJCXJldHVybiBic3M7CisJCWVsc2UgaWYgKHIgPCAwKQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2NvcHlfaGlkZGVuX2llcyhzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpyZXMsCisJCSBzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpoaWRkZW4pCit7CisJaWYgKHVubGlrZWx5KHJlcy0+cHViLmJlYWNvbl9pZXMpKQorCQlyZXR1cm47CisJaWYgKFdBUk5fT04oIWhpZGRlbi0+cHViLmJlYWNvbl9pZXMpKQorCQlyZXR1cm47CisKKwlyZXMtPnB1Yi5iZWFjb25faWVzID0ga21hbGxvYyhoaWRkZW4tPnB1Yi5sZW5fYmVhY29uX2llcywgR0ZQX0FUT01JQyk7CisJaWYgKHVubGlrZWx5KCFyZXMtPnB1Yi5iZWFjb25faWVzKSkKKwkJcmV0dXJuOworCisJcmVzLT5iZWFjb25faWVzX2FsbG9jYXRlZCA9IHRydWU7CisJcmVzLT5wdWIubGVuX2JlYWNvbl9pZXMgPSBoaWRkZW4tPnB1Yi5sZW5fYmVhY29uX2llczsKKwltZW1jcHkocmVzLT5wdWIuYmVhY29uX2llcywgaGlkZGVuLT5wdWIuYmVhY29uX2llcywKKwkJCXJlcy0+cHViLmxlbl9iZWFjb25faWVzKTsKK30KKworc3RhdGljIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKgogY2ZnODAyMTFfYnNzX3VwZGF0ZShzdHJ1Y3QgY2ZnODAyMTFfcmVnaXN0ZXJlZF9kZXZpY2UgKmRldiwKIAkJICAgIHN0cnVjdCBjZmc4MDIxMV9pbnRlcm5hbF9ic3MgKnJlcykKIHsKQEAgLTYwNyw2ICs3MDMsMjEgQEAKIAogCQlrcmVmX3B1dCgmcmVzLT5yZWYsIGJzc19yZWxlYXNlKTsKIAl9IGVsc2UgeworCQlzdHJ1Y3QgY2ZnODAyMTFfaW50ZXJuYWxfYnNzICpoaWRkZW47CisKKwkJLyogRmlyc3QgY2hlY2sgaWYgdGhlIGJlYWNvbiBpcyBhIHByb2JlIHJlc3BvbnNlIGZyb20KKwkJICogYSBoaWRkZW4gYnNzLiBJZiBzbywgY29weSBiZWFjb24gaWVzICh3aXRoIG51bGxpZmllZAorCQkgKiBzc2lkKSBpbnRvIHRoZSBwcm9iZSByZXNwb25zZSBic3MgZW50cnkgKHdpdGggcmVhbCBzc2lkKS4KKwkJICogSXQgaXMgcmVxdWlyZWQgYmFzaWNhbGx5IGZvciBQU00gaW1wbGVtZW50YXRpb24KKwkJICogKHByb2JlIHJlc3BvbnNlcyBkbyBub3QgY29udGFpbiB0aW0gaWUpICovCisKKwkJLyogVE9ETzogVGhlIGNvZGUgaXMgbm90IHRyeWluZyB0byB1cGRhdGUgZXhpc3RpbmcgcHJvYmUKKwkJICogcmVzcG9uc2UgYnNzIGVudHJpZXMgd2hlbiBiZWFjb24gaWVzIGFyZQorCQkgKiBnZXR0aW5nIGNoYW5nZWQuICovCisJCWhpZGRlbiA9IHJiX2ZpbmRfaGlkZGVuX2JzcyhkZXYsIHJlcyk7CisJCWlmIChoaWRkZW4pCisJCQljb3B5X2hpZGRlbl9pZXMocmVzLCBoaWRkZW4pOworCiAJCS8qIHRoaXMgImNvbnN1bWVzIiB0aGUgcmVmZXJlbmNlICovCiAJCWxpc3RfYWRkX3RhaWwoJnJlcy0+bGlzdCwgJmRldi0+YnNzX2xpc3QpOwogCQlyYl9pbnNlcnRfYnNzKGRldiwgcmVzKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy9zbWUuYyBiL25ldC93aXJlbGVzcy9zbWUuYwppbmRleCAwYWNmZGM5Li43YjllY2FlIDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3Mvc21lLmMKKysrIGIvbmV0L3dpcmVsZXNzL3NtZS5jCkBAIC0xOTAsNyArMTkwLDkgQEAKIAkJCQkJICAgIHByZXZfYnNzaWQsCiAJCQkJCSAgICBwYXJhbXMtPnNzaWQsIHBhcmFtcy0+c3NpZF9sZW4sCiAJCQkJCSAgICBwYXJhbXMtPmllLCBwYXJhbXMtPmllX2xlbiwKLQkJCQkJICAgIGZhbHNlLCAmcGFyYW1zLT5jcnlwdG8pOworCQkJCQkgICAgZmFsc2UsICZwYXJhbXMtPmNyeXB0bywKKwkJCQkJICAgIHBhcmFtcy0+ZmxhZ3MsICZwYXJhbXMtPmh0X2NhcGEsCisJCQkJCSAgICAmcGFyYW1zLT5odF9jYXBhX21hc2spOwogCQlpZiAoZXJyKQogCQkJX19jZmc4MDIxMV9tbG1lX2RlYXV0aChyZGV2LCB3ZGV2LT5uZXRkZXYsIHBhcmFtcy0+YnNzaWQsCiAJCQkJCSAgICAgICBOVUxMLCAwLApAQCAtNTUxLDQ1ICs1NTMsMzUgQEAKIEVYUE9SVF9TWU1CT0woY2ZnODAyMTFfY29ubmVjdF9yZXN1bHQpOwogCiB2b2lkIF9fY2ZnODAyMTFfcm9hbWVkKHN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYsCi0JCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwsCi0JCSAgICAgICBjb25zdCB1OCAqYnNzaWQsCisJCSAgICAgICBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MsCiAJCSAgICAgICBjb25zdCB1OCAqcmVxX2llLCBzaXplX3QgcmVxX2llX2xlbiwKIAkJICAgICAgIGNvbnN0IHU4ICpyZXNwX2llLCBzaXplX3QgcmVzcF9pZV9sZW4pCiB7Ci0Jc3RydWN0IGNmZzgwMjExX2JzcyAqYnNzOwogI2lmZGVmIENPTkZJR19DRkc4MDIxMV9XRVhUCiAJdW5pb24gaXdyZXFfZGF0YSB3cnF1OwogI2VuZGlmCi0KIAlBU1NFUlRfV0RFVl9MT0NLKHdkZXYpOwogCiAJaWYgKFdBUk5fT04od2Rldi0+aWZ0eXBlICE9IE5MODAyMTFfSUZUWVBFX1NUQVRJT04gJiYKIAkJICAgIHdkZXYtPmlmdHlwZSAhPSBOTDgwMjExX0lGVFlQRV9QMlBfQ0xJRU5UKSkKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAogCWlmICh3ZGV2LT5zbWVfc3RhdGUgIT0gQ0ZHODAyMTFfU01FX0NPTk5FQ1RFRCkKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAogCS8qIGludGVybmFsIGVycm9yIC0tIGhvdyBkaWQgd2UgZ2V0IHRvIENPTk5FQ1RFRCB3L28gQlNTPyAqLwogCWlmIChXQVJOX09OKCF3ZGV2LT5jdXJyZW50X2JzcykpIHsKLQkJcmV0dXJuOworCQlnb3RvIG91dDsKIAl9CiAKIAljZmc4MDIxMV91bmhvbGRfYnNzKHdkZXYtPmN1cnJlbnRfYnNzKTsKIAljZmc4MDIxMV9wdXRfYnNzKCZ3ZGV2LT5jdXJyZW50X2Jzcy0+cHViKTsKIAl3ZGV2LT5jdXJyZW50X2JzcyA9IE5VTEw7CiAKLQlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHdkZXYtPndpcGh5LCBjaGFubmVsLCBic3NpZCwKLQkJCSAgICAgICB3ZGV2LT5zc2lkLCB3ZGV2LT5zc2lkX2xlbiwKLQkJCSAgICAgICBXTEFOX0NBUEFCSUxJVFlfRVNTLCBXTEFOX0NBUEFCSUxJVFlfRVNTKTsKLQotCWlmIChXQVJOX09OKCFic3MpKQotCQlyZXR1cm47Ci0KIAljZmc4MDIxMV9ob2xkX2Jzcyhic3NfZnJvbV9wdWIoYnNzKSk7CiAJd2Rldi0+Y3VycmVudF9ic3MgPSBic3NfZnJvbV9wdWIoYnNzKTsKIAotCW5sODAyMTFfc2VuZF9yb2FtZWQod2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KSwgd2Rldi0+bmV0ZGV2LCBic3NpZCwKKwlubDgwMjExX3NlbmRfcm9hbWVkKHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSksIHdkZXYtPm5ldGRldiwgYnNzLT5ic3NpZCwKIAkJCSAgICByZXFfaWUsIHJlcV9pZV9sZW4sIHJlc3BfaWUsIHJlc3BfaWVfbGVuLAogCQkJICAgIEdGUF9LRVJORUwpOwogCkBAIC02MTAsMTEgKzYwMiwxNSBAQAogCiAJbWVtc2V0KCZ3cnF1LCAwLCBzaXplb2Yod3JxdSkpOwogCXdycXUuYXBfYWRkci5zYV9mYW1pbHkgPSBBUlBIUkRfRVRIRVI7Ci0JbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBic3NpZCwgRVRIX0FMRU4pOwotCW1lbWNweSh3ZGV2LT53ZXh0LnByZXZfYnNzaWQsIGJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KHdycXUuYXBfYWRkci5zYV9kYXRhLCBic3MtPmJzc2lkLCBFVEhfQUxFTik7CisJbWVtY3B5KHdkZXYtPndleHQucHJldl9ic3NpZCwgYnNzLT5ic3NpZCwgRVRIX0FMRU4pOwogCXdkZXYtPndleHQucHJldl9ic3NpZF92YWxpZCA9IHRydWU7CiAJd2lyZWxlc3Nfc2VuZF9ldmVudCh3ZGV2LT5uZXRkZXYsIFNJT0NHSVdBUCwgJndycXUsIE5VTEwpOwogI2VuZGlmCisKKwlyZXR1cm47CitvdXQ6CisJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOwogfQogCiB2b2lkIGNmZzgwMjExX3JvYW1lZChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LApAQCAtNjI0LDMyICs2MjAsNTcgQEAKIAkJICAgICBjb25zdCB1OCAqcmVzcF9pZSwgc2l6ZV90IHJlc3BfaWVfbGVuLCBnZnBfdCBnZnApCiB7CiAJc3RydWN0IHdpcmVsZXNzX2RldiAqd2RldiA9IGRldi0+aWVlZTgwMjExX3B0cjsKKwlzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3M7CisKKwlDRkc4MDIxMV9ERVZfV0FSTl9PTih3ZGV2LT5zbWVfc3RhdGUgIT0gQ0ZHODAyMTFfU01FX0NPTk5FQ1RFRCk7CisKKwlic3MgPSBjZmc4MDIxMV9nZXRfYnNzKHdkZXYtPndpcGh5LCBjaGFubmVsLCBic3NpZCwgd2Rldi0+c3NpZCwKKwkJCSAgICAgICB3ZGV2LT5zc2lkX2xlbiwgV0xBTl9DQVBBQklMSVRZX0VTUywKKwkJCSAgICAgICBXTEFOX0NBUEFCSUxJVFlfRVNTKTsKKwlpZiAoV0FSTl9PTighYnNzKSkKKwkJcmV0dXJuOworCisJY2ZnODAyMTFfcm9hbWVkX2JzcyhkZXYsIGJzcywgcmVxX2llLCByZXFfaWVfbGVuLCByZXNwX2llLAorCQkJICAgIHJlc3BfaWVfbGVuLCBnZnApOworfQorRVhQT1JUX1NZTUJPTChjZmc4MDIxMV9yb2FtZWQpOworCit2b2lkIGNmZzgwMjExX3JvYW1lZF9ic3Moc3RydWN0IG5ldF9kZXZpY2UgKmRldiwKKwkJCSBzdHJ1Y3QgY2ZnODAyMTFfYnNzICpic3MsIGNvbnN0IHU4ICpyZXFfaWUsCisJCQkgc2l6ZV90IHJlcV9pZV9sZW4sIGNvbnN0IHU4ICpyZXNwX2llLAorCQkJIHNpemVfdCByZXNwX2llX2xlbiwgZ2ZwX3QgZ2ZwKQoreworCXN0cnVjdCB3aXJlbGVzc19kZXYgKndkZXYgPSBkZXYtPmllZWU4MDIxMV9wdHI7CiAJc3RydWN0IGNmZzgwMjExX3JlZ2lzdGVyZWRfZGV2aWNlICpyZGV2ID0gd2lwaHlfdG9fZGV2KHdkZXYtPndpcGh5KTsKIAlzdHJ1Y3QgY2ZnODAyMTFfZXZlbnQgKmV2OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlDRkc4MDIxMV9ERVZfV0FSTl9PTih3ZGV2LT5zbWVfc3RhdGUgIT0gQ0ZHODAyMTFfU01FX0NPTk5FQ1RFRCk7CiAKLQlldiA9IGt6YWxsb2Moc2l6ZW9mKCpldikgKyByZXFfaWVfbGVuICsgcmVzcF9pZV9sZW4sIGdmcCk7Ci0JaWYgKCFldikKKwlpZiAoV0FSTl9PTighYnNzKSkKIAkJcmV0dXJuOwogCisJZXYgPSBremFsbG9jKHNpemVvZigqZXYpICsgcmVxX2llX2xlbiArIHJlc3BfaWVfbGVuLCBnZnApOworCWlmICghZXYpIHsKKwkJY2ZnODAyMTFfcHV0X2Jzcyhic3MpOworCQlyZXR1cm47CisJfQorCiAJZXYtPnR5cGUgPSBFVkVOVF9ST0FNRUQ7Ci0JZXYtPnJtLmNoYW5uZWwgPSBjaGFubmVsOwotCW1lbWNweShldi0+cm0uYnNzaWQsIGJzc2lkLCBFVEhfQUxFTik7CiAJZXYtPnJtLnJlcV9pZSA9ICgodTggKilldikgKyBzaXplb2YoKmV2KTsKIAlldi0+cm0ucmVxX2llX2xlbiA9IHJlcV9pZV9sZW47CiAJbWVtY3B5KCh2b2lkICopZXYtPnJtLnJlcV9pZSwgcmVxX2llLCByZXFfaWVfbGVuKTsKIAlldi0+cm0ucmVzcF9pZSA9ICgodTggKilldikgKyBzaXplb2YoKmV2KSArIHJlcV9pZV9sZW47CiAJZXYtPnJtLnJlc3BfaWVfbGVuID0gcmVzcF9pZV9sZW47CiAJbWVtY3B5KCh2b2lkICopZXYtPnJtLnJlc3BfaWUsIHJlc3BfaWUsIHJlc3BfaWVfbGVuKTsKKwlldi0+cm0uYnNzID0gYnNzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAlsaXN0X2FkZF90YWlsKCZldi0+bGlzdCwgJndkZXYtPmV2ZW50X2xpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKIAlxdWV1ZV93b3JrKGNmZzgwMjExX3dxLCAmcmRldi0+ZXZlbnRfd29yayk7CiB9Ci1FWFBPUlRfU1lNQk9MKGNmZzgwMjExX3JvYW1lZCk7CitFWFBPUlRfU1lNQk9MKGNmZzgwMjExX3JvYW1lZF9ic3MpOwogCiB2b2lkIF9fY2ZnODAyMTFfZGlzY29ubmVjdGVkKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIGNvbnN0IHU4ICppZSwKIAkJCSAgICAgc2l6ZV90IGllX2xlbiwgdTE2IHJlYXNvbiwgYm9vbCBmcm9tX2FwKQpAQCAtNzc0LDYgKzc5NSw5IEBACiAJCXdkZXYtPmNvbm5lY3Rfa2V5cyA9IE5VTEw7CiAJfQogCisJY2ZnODAyMTFfb3Blcl9hbmRfaHRfY2FwYSgmY29ubmVjdC0+aHRfY2FwYV9tYXNrLAorCQkJCSAgcmRldi0+d2lwaHkuaHRfY2FwYV9tb2RfbWFzayk7CisKIAlpZiAoY29ubmtleXMgJiYgY29ubmtleXMtPmRlZiA+PSAwKSB7CiAJCWludCBpZHg7CiAJCXUzMiBjaXBoZXI7CmRpZmYgLS1naXQgYS9uZXQvd2lyZWxlc3MvdXRpbC5jIGIvbmV0L3dpcmVsZXNzL3V0aWwuYwppbmRleCA0ZGRlNDI5Li45YWE5ZGI2IDEwMDY0NAotLS0gYS9uZXQvd2lyZWxlc3MvdXRpbC5jCisrKyBiL25ldC93aXJlbGVzcy91dGlsLmMKQEAgLTcsOSArNyw5IEBACiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8bGludXgvZXRoZXJkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvY3JjMzIuaD4KICNpbmNsdWRlIDxuZXQvY2ZnODAyMTEuaD4KICNpbmNsdWRlIDxuZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvZHNmaWVsZC5oPgogI2luY2x1ZGUgImNvcmUuaCIKIAogc3RydWN0IGllZWU4MDIxMV9yYXRlICoKQEAgLTI0MCwxNyArMjQwLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogU2VlIElFRUUgODAyLjFIIGZvciBMTEMvU05BUCBlbmNhcHN1bGF0aW9uL2RlY2Fwc3VsYXRpb24gKi8KLS8qIEV0aGVybmV0LUlJIHNuYXAgaGVhZGVyIChSRkMxMDQyIGZvciBtb3N0IEV0aGVyVHlwZXMpICovCi1jb25zdCB1bnNpZ25lZCBjaGFyIHJmYzEwNDJfaGVhZGVyW10gX19hbGlnbmVkKDIpID0KLQl7IDB4YWEsIDB4YWEsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAgfTsKLUVYUE9SVF9TWU1CT0wocmZjMTA0Ml9oZWFkZXIpOwotCi0vKiBCcmlkZ2UtVHVubmVsIGhlYWRlciAoZm9yIEV0aGVyVHlwZXMgRVRIX1BfQUFSUCBhbmQgRVRIX1BfSVBYKSAqLwotY29uc3QgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdIF9fYWxpZ25lZCgyKSA9Ci0JeyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4IH07Ci1FWFBPUlRfU1lNQk9MKGJyaWRnZV90dW5uZWxfaGVhZGVyKTsKLQogdW5zaWduZWQgaW50IF9fYXR0cmlidXRlX2NvbnN0X18gaWVlZTgwMjExX2hkcmxlbihfX2xlMTYgZmMpCiB7CiAJdW5zaWduZWQgaW50IGhkcmxlbiA9IDI0OwpAQCAtNjYyLDcgKzY1MSwxMCBAQAogCiAJc3dpdGNoIChza2ItPnByb3RvY29sKSB7CiAJY2FzZSBodG9ucyhFVEhfUF9JUCk6Ci0JCWRzY3AgPSBpcF9oZHIoc2tiKS0+dG9zICYgMHhmYzsKKwkJZHNjcCA9IGlwdjRfZ2V0X2RzZmllbGQoaXBfaGRyKHNrYikpICYgMHhmYzsKKwkJYnJlYWs7CisJY2FzZSBodG9ucyhFVEhfUF9JUFY2KToKKwkJZHNjcCA9IGlwdjZfZ2V0X2RzZmllbGQoaXB2Nl9oZHIoc2tiKSkgJiAweGZjOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gMDsKQEAgLTc1Miw5ICs3NDQsOSBAQAogCQkJCU5VTEwpOwogCQkJYnJlYWs7CiAJCWNhc2UgRVZFTlRfUk9BTUVEOgotCQkJX19jZmc4MDIxMV9yb2FtZWQod2RldiwgZXYtPnJtLmNoYW5uZWwsIGV2LT5ybS5ic3NpZCwKLQkJCQkJICBldi0+cm0ucmVxX2llLCBldi0+cm0ucmVxX2llX2xlbiwKLQkJCQkJICBldi0+cm0ucmVzcF9pZSwgZXYtPnJtLnJlc3BfaWVfbGVuKTsKKwkJCV9fY2ZnODAyMTFfcm9hbWVkKHdkZXYsIGV2LT5ybS5ic3MsIGV2LT5ybS5yZXFfaWUsCisJCQkJCSAgZXYtPnJtLnJlcV9pZV9sZW4sIGV2LT5ybS5yZXNwX2llLAorCQkJCQkgIGV2LT5ybS5yZXNwX2llX2xlbik7CiAJCQlicmVhazsKIAkJY2FzZSBFVkVOVF9ESVNDT05ORUNURUQ6CiAJCQlfX2NmZzgwMjExX2Rpc2Nvbm5lY3RlZCh3ZGV2LT5uZXRkZXYsCkBAIC0xMDUxLDE2OSArMTA0MywxMyBAQAogCXJldHVybiAwOwogfQogCi11MzIgaWVlZTgwMl8xMV9wYXJzZV9lbGVtc19jcmModTggKnN0YXJ0LCBzaXplX3QgbGVuLAotCQkJICAgICAgIHN0cnVjdCBpZWVlODAyXzExX2VsZW1zICplbGVtcywKLQkJCSAgICAgICB1NjQgZmlsdGVyLCB1MzIgY3JjKQotewotCXNpemVfdCBsZWZ0ID0gbGVuOwotCXU4ICpwb3MgPSBzdGFydDsKLQlib29sIGNhbGNfY3JjID0gZmlsdGVyICE9IDA7CisvKiBTZWUgSUVFRSA4MDIuMUggZm9yIExMQy9TTkFQIGVuY2Fwc3VsYXRpb24vZGVjYXBzdWxhdGlvbiAqLworLyogRXRoZXJuZXQtSUkgc25hcCBoZWFkZXIgKFJGQzEwNDIgZm9yIG1vc3QgRXRoZXJUeXBlcykgKi8KK2NvbnN0IHVuc2lnbmVkIGNoYXIgcmZjMTA0Ml9oZWFkZXJbXSBfX2FsaWduZWQoMikgPQorCXsgMHhhYSwgMHhhYSwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCB9OworRVhQT1JUX1NZTUJPTChyZmMxMDQyX2hlYWRlcik7CiAKLQltZW1zZXQoZWxlbXMsIDAsIHNpemVvZigqZWxlbXMpKTsKLQllbGVtcy0+aWVfc3RhcnQgPSBzdGFydDsKLQllbGVtcy0+dG90YWxfbGVuID0gbGVuOwotCi0Jd2hpbGUgKGxlZnQgPj0gMikgewotCQl1OCBpZCwgZWxlbjsKLQotCQlpZCA9ICpwb3MrKzsKLQkJZWxlbiA9ICpwb3MrKzsKLQkJbGVmdCAtPSAyOwotCi0JCWlmIChlbGVuID4gbGVmdCkKLQkJCWJyZWFrOwotCi0JCWlmIChjYWxjX2NyYyAmJiBpZCA8IDY0ICYmIChmaWx0ZXIgJiAoMVVMTCA8PCBpZCkpKQotCQkJY3JjID0gY3JjMzJfYmUoY3JjLCBwb3MgLSAyLCBlbGVuICsgMik7Ci0KLQkJc3dpdGNoIChpZCkgewotCQljYXNlIFdMQU5fRUlEX1NTSUQ6Ci0JCQllbGVtcy0+c3NpZCA9IHBvczsKLQkJCWVsZW1zLT5zc2lkX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9TVVBQX1JBVEVTOgotCQkJZWxlbXMtPnN1cHBfcmF0ZXMgPSBwb3M7Ci0JCQllbGVtcy0+c3VwcF9yYXRlc19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfRkhfUEFSQU1TOgotCQkJZWxlbXMtPmZoX3BhcmFtcyA9IHBvczsKLQkJCWVsZW1zLT5maF9wYXJhbXNfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0RTX1BBUkFNUzoKLQkJCWVsZW1zLT5kc19wYXJhbXMgPSBwb3M7Ci0JCQllbGVtcy0+ZHNfcGFyYW1zX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9DRl9QQVJBTVM6Ci0JCQllbGVtcy0+Y2ZfcGFyYW1zID0gcG9zOwotCQkJZWxlbXMtPmNmX3BhcmFtc19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfVElNOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfdGltX2llKSkgewotCQkJCWVsZW1zLT50aW0gPSAodm9pZCAqKXBvczsKLQkJCQllbGVtcy0+dGltX2xlbiA9IGVsZW47Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9JQlNTX1BBUkFNUzoKLQkJCWVsZW1zLT5pYnNzX3BhcmFtcyA9IHBvczsKLQkJCWVsZW1zLT5pYnNzX3BhcmFtc19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfQ0hBTExFTkdFOgotCQkJZWxlbXMtPmNoYWxsZW5nZSA9IHBvczsKLQkJCWVsZW1zLT5jaGFsbGVuZ2VfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoKLQkJCWlmIChlbGVuID49IDQgJiYgcG9zWzBdID09IDB4MDAgJiYgcG9zWzFdID09IDB4NTAgJiYKLQkJCSAgICBwb3NbMl0gPT0gMHhmMikgewotCQkJCS8qIE1pY3Jvc29mdCBPVUkgKDAwOjUwOkYyKSAqLwotCi0JCQkJaWYgKGNhbGNfY3JjKQotCQkJCQljcmMgPSBjcmMzMl9iZShjcmMsIHBvcyAtIDIsIGVsZW4gKyAyKTsKLQotCQkJCWlmIChwb3NbM10gPT0gMSkgewotCQkJCQkvKiBPVUkgVHlwZSAxIC0gV1BBIElFICovCi0JCQkJCWVsZW1zLT53cGEgPSBwb3M7Ci0JCQkJCWVsZW1zLT53cGFfbGVuID0gZWxlbjsKLQkJCQl9IGVsc2UgaWYgKGVsZW4gPj0gNSAmJiBwb3NbM10gPT0gMikgewotCQkJCQkvKiBPVUkgVHlwZSAyIC0gV01NIElFICovCi0JCQkJCWlmIChwb3NbNF0gPT0gMCkgewotCQkJCQkJZWxlbXMtPndtbV9pbmZvID0gcG9zOwotCQkJCQkJZWxlbXMtPndtbV9pbmZvX2xlbiA9IGVsZW47Ci0JCQkJCX0gZWxzZSBpZiAocG9zWzRdID09IDEpIHsKLQkJCQkJCWVsZW1zLT53bW1fcGFyYW0gPSBwb3M7Ci0JCQkJCQllbGVtcy0+d21tX3BhcmFtX2xlbiA9IGVsZW47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9SU046Ci0JCQllbGVtcy0+cnNuID0gcG9zOwotCQkJZWxlbXMtPnJzbl9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfRVJQX0lORk86Ci0JCQllbGVtcy0+ZXJwX2luZm8gPSBwb3M7Ci0JCQllbGVtcy0+ZXJwX2luZm9fbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVTOgotCQkJZWxlbXMtPmV4dF9zdXBwX3JhdGVzID0gcG9zOwotCQkJZWxlbXMtPmV4dF9zdXBwX3JhdGVzX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9IVF9DQVBBQklMSVRZOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfY2FwKSkKLQkJCQllbGVtcy0+aHRfY2FwX2VsZW0gPSAodm9pZCAqKXBvczsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX0hUX0lORk9STUFUSU9OOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfaHRfaW5mbykpCi0JCQkJZWxlbXMtPmh0X2luZm9fZWxlbSA9ICh2b2lkICopcG9zOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfTUVTSF9JRDoKLQkJCWVsZW1zLT5tZXNoX2lkID0gcG9zOwotCQkJZWxlbXMtPm1lc2hfaWRfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX01FU0hfQ09ORklHOgotCQkJaWYgKGVsZW4gPj0gc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfbWVzaGNvbmZfaWUpKQotCQkJCWVsZW1zLT5tZXNoX2NvbmZpZyA9ICh2b2lkICopcG9zOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUEVFUl9NR01UOgotCQkJZWxlbXMtPnBlZXJpbmcgPSBwb3M7Ci0JCQllbGVtcy0+cGVlcmluZ19sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUFJFUToKLQkJCWVsZW1zLT5wcmVxID0gcG9zOwotCQkJZWxlbXMtPnByZXFfbGVuID0gZWxlbjsKLQkJCWJyZWFrOwotCQljYXNlIFdMQU5fRUlEX1BSRVA6Ci0JCQllbGVtcy0+cHJlcCA9IHBvczsKLQkJCWVsZW1zLT5wcmVwX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9QRVJSOgotCQkJZWxlbXMtPnBlcnIgPSBwb3M7Ci0JCQllbGVtcy0+cGVycl9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUkFOTjoKLQkJCWlmIChlbGVuID49IHNpemVvZihzdHJ1Y3QgaWVlZTgwMjExX3Jhbm5faWUpKQotCQkJCWVsZW1zLT5yYW5uID0gKHZvaWQgKilwb3M7Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9DSEFOTkVMX1NXSVRDSDoKLQkJCWVsZW1zLT5jaF9zd2l0Y2hfZWxlbSA9IHBvczsKLQkJCWVsZW1zLT5jaF9zd2l0Y2hfZWxlbV9sZW4gPSBlbGVuOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfUVVJRVQ6Ci0JCQlpZiAoIWVsZW1zLT5xdWlldF9lbGVtKSB7Ci0JCQkJZWxlbXMtPnF1aWV0X2VsZW0gPSBwb3M7Ci0JCQkJZWxlbXMtPnF1aWV0X2VsZW1fbGVuID0gZWxlbjsKLQkJCX0KLQkJCWVsZW1zLT5udW1fb2ZfcXVpZXRfZWxlbSsrOwotCQkJYnJlYWs7Ci0JCWNhc2UgV0xBTl9FSURfQ09VTlRSWToKLQkJCWVsZW1zLT5jb3VudHJ5X2VsZW0gPSBwb3M7Ci0JCQllbGVtcy0+Y291bnRyeV9lbGVtX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9QV1JfQ09OU1RSQUlOVDoKLQkJCWVsZW1zLT5wd3JfY29uc3RyX2VsZW0gPSBwb3M7Ci0JCQllbGVtcy0+cHdyX2NvbnN0cl9lbGVtX2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJY2FzZSBXTEFOX0VJRF9USU1FT1VUX0lOVEVSVkFMOgotCQkJZWxlbXMtPnRpbWVvdXRfaW50ID0gcG9zOwotCQkJZWxlbXMtPnRpbWVvdXRfaW50X2xlbiA9IGVsZW47Ci0JCQlicmVhazsKLQkJZGVmYXVsdDoKLQkJCWJyZWFrOwotCQl9Ci0KLQkJbGVmdCAtPSBlbGVuOwotCQlwb3MgKz0gZWxlbjsKLQl9Ci0KLQlyZXR1cm4gY3JjOwotfQotRVhQT1JUX1NZTUJPTChpZWVlODAyXzExX3BhcnNlX2VsZW1zX2NyYyk7CisvKiBCcmlkZ2UtVHVubmVsIGhlYWRlciAoZm9yIEV0aGVyVHlwZXMgRVRIX1BfQUFSUCBhbmQgRVRIX1BfSVBYKSAqLworY29uc3QgdW5zaWduZWQgY2hhciBicmlkZ2VfdHVubmVsX2hlYWRlcltdIF9fYWxpZ25lZCgyKSA9CisJeyAweGFhLCAweGFhLCAweDAzLCAweDAwLCAweDAwLCAweGY4IH07CitFWFBPUlRfU1lNQk9MKGJyaWRnZV90dW5uZWxfaGVhZGVyKTsKZGlmZiAtLWdpdCBhL25ldC93aXJlbGVzcy93ZXh0LWNvbXBhdC5jIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKaW5kZXggNjg5NzQzNi4uM2MyNGViOSAxMDA2NDQKLS0tIGEvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKKysrIGIvbmV0L3dpcmVsZXNzL3dleHQtY29tcGF0LmMKQEAgLTgxOSwxMiArODE5LDI0IEBACiAJCQkJIHN0cnVjdCBpd19mcmVxICpmcmVxLCBjaGFyICpleHRyYSkKIHsKIAlzdHJ1Y3Qgd2lyZWxlc3NfZGV2ICp3ZGV2ID0gZGV2LT5pZWVlODAyMTFfcHRyOworCXN0cnVjdCBjZmc4MDIxMV9yZWdpc3RlcmVkX2RldmljZSAqcmRldiA9IHdpcGh5X3RvX2Rldih3ZGV2LT53aXBoeSk7CisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFuOwogCiAJc3dpdGNoICh3ZGV2LT5pZnR5cGUpIHsKIAljYXNlIE5MODAyMTFfSUZUWVBFX1NUQVRJT046CiAJCXJldHVybiBjZmc4MDIxMV9tZ2Rfd2V4dF9naXdmcmVxKGRldiwgaW5mbywgZnJlcSwgZXh0cmEpOwogCWNhc2UgTkw4MDIxMV9JRlRZUEVfQURIT0M6CiAJCXJldHVybiBjZmc4MDIxMV9pYnNzX3dleHRfZ2l3ZnJlcShkZXYsIGluZm8sIGZyZXEsIGV4dHJhKTsKKwljYXNlIE5MODAyMTFfSUZUWVBFX01PTklUT1I6CisJCWlmICghcmRldi0+b3BzLT5nZXRfY2hhbm5lbCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNoYW4gPSByZGV2LT5vcHMtPmdldF9jaGFubmVsKHdkZXYtPndpcGh5KTsKKwkJaWYgKCFjaGFuKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWZyZXEtPm0gPSBjaGFuLT5jZW50ZXJfZnJlcTsKKwkJZnJlcS0+ZSA9IDY7CisJCXJldHVybiAwOwogCWRlZmF1bHQ6CiAJCWlmICghd2Rldi0+Y2hhbm5lbCkKIAkJCXJldHVybiAtRUlOVkFMOwpkaWZmIC0tZ2l0IGEvbmV0L3gyNS9hZl94MjUuYyBiL25ldC94MjUvYWZfeDI1LmMKaW5kZXggM2UxNmM2YS4uYTMwNmJjNiAxMDA2NDQKLS0tIGEvbmV0L3gyNS9hZl94MjUuYworKysgYi9uZXQveDI1L2FmX3gyNS5jCkBAIC0yMzIsNyArMjMyLDcgQEAKIAkJcmV0dXJuIE5PVElGWV9ET05FOwogCiAJaWYgKGRldi0+dHlwZSA9PSBBUlBIUkRfWDI1Ci0jaWYgZGVmaW5lZChDT05GSUdfTExDKSB8fCBkZWZpbmVkKENPTkZJR19MTENfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0xMQykKIAkgfHwgZGV2LT50eXBlID09IEFSUEhSRF9FVEhFUgogI2VuZGlmCiAJICkgewpkaWZmIC0tZ2l0IGEvbmV0L3gyNS94MjVfZGV2LmMgYi9uZXQveDI1L3gyNV9kZXYuYwppbmRleCBmYTJiNDE4Li5mMGNlODYyIDEwMDY0NAotLS0gYS9uZXQveDI1L3gyNV9kZXYuYworKysgYi9uZXQveDI1L3gyNV9kZXYuYwpAQCAtMTYxLDcgKzE2MSw3IEBACiAJCSpwdHIgPSBYMjVfSUZBQ0VfQ09OTkVDVDsKIAkJYnJlYWs7CiAKLSNpZiBkZWZpbmVkKENPTkZJR19MTEMpIHx8IGRlZmluZWQoQ09ORklHX0xMQ19NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfTExDKQogCWNhc2UgQVJQSFJEX0VUSEVSOgogCQlyZXR1cm47CiAjZW5kaWYKQEAgLTE4MCw3ICsxODAsNyBAQAogCXN0cnVjdCBza19idWZmICpza2I7CiAJdW5zaWduZWQgY2hhciAqcHRyOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTExDKSB8fCBkZWZpbmVkKENPTkZJR19MTENfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0xMQykKIAlpZiAobmItPmRldi0+dHlwZSA9PSBBUlBIUkRfRVRIRVIpCiAJCXJldHVybjsKICNlbmRpZgpAQCAtMjEzLDcgKzIxMyw3IEBACiAJCSpkcHRyID0gWDI1X0lGQUNFX0RBVEE7CiAJCWJyZWFrOwogCi0jaWYgZGVmaW5lZChDT05GSUdfTExDKSB8fCBkZWZpbmVkKENPTkZJR19MTENfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0xMQykKIAljYXNlIEFSUEhSRF9FVEhFUjoKIAkJa2ZyZWVfc2tiKHNrYik7CiAJCXJldHVybjsKZGlmZiAtLWdpdCBhL25ldC94MjUveDI1X3JvdXRlLmMgYi9uZXQveDI1L3gyNV9yb3V0ZS5jCmluZGV4IDk3ZDc3YzUuLmNmNjM2NjIgMTAwNjQ0Ci0tLSBhL25ldC94MjUveDI1X3JvdXRlLmMKKysrIGIvbmV0L3gyNS94MjVfcm91dGUuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiAKIAlpZiAoZGV2ICYmCiAJICAgICghKGRldi0+ZmxhZ3MgJiBJRkZfVVApIHx8IChkZXYtPnR5cGUgIT0gQVJQSFJEX1gyNQotI2lmIGRlZmluZWQoQ09ORklHX0xMQykgfHwgZGVmaW5lZChDT05GSUdfTExDX01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19MTEMpCiAJCQkJCSYmIGRldi0+dHlwZSAhPSBBUlBIUkRfRVRIRVIKICNlbmRpZgogCQkJCQkpKSl7CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3BvbGljeS5jIGIvbmV0L3hmcm0veGZybV9wb2xpY3kuYwppbmRleCA1NTJkZjI3Li43NjYxNTc2IDEwMDY0NAotLS0gYS9uZXQveGZybS94ZnJtX3BvbGljeS5jCisrKyBiL25ldC94ZnJtL3hmcm1fcG9saWN5LmMKQEAgLTYxLDggKzYxLDggQEAKIHsKIAljb25zdCBzdHJ1Y3QgZmxvd2k0ICpmbDQgPSAmZmwtPnUuaXA0OwogCi0JcmV0dXJuICBhZGRyX21hdGNoKCZmbDQtPmRhZGRyLCAmc2VsLT5kYWRkciwgc2VsLT5wcmVmaXhsZW5fZCkgJiYKLQkJYWRkcl9tYXRjaCgmZmw0LT5zYWRkciwgJnNlbC0+c2FkZHIsIHNlbC0+cHJlZml4bGVuX3MpICYmCisJcmV0dXJuICBhZGRyNF9tYXRjaChmbDQtPmRhZGRyLCBzZWwtPmRhZGRyLmE0LCBzZWwtPnByZWZpeGxlbl9kKSAmJgorCQlhZGRyNF9tYXRjaChmbDQtPnNhZGRyLCBzZWwtPnNhZGRyLmE0LCBzZWwtPnByZWZpeGxlbl9zKSAmJgogCQkhKCh4ZnJtX2Zsb3dpX2Rwb3J0KGZsLCAmZmw0LT51bGkpIF4gc2VsLT5kcG9ydCkgJiBzZWwtPmRwb3J0X21hc2spICYmCiAJCSEoKHhmcm1fZmxvd2lfc3BvcnQoZmwsICZmbDQtPnVsaSkgXiBzZWwtPnNwb3J0KSAmIHNlbC0+c3BvcnRfbWFzaykgJiYKIAkJKGZsNC0+Zmxvd2k0X3Byb3RvID09IHNlbC0+cHJvdG8gfHwgIXNlbC0+cHJvdG8pICYmCkBAIC0xMzQwLDcgKzEzNDAsNyBAQAogCWNhc2UgQUZfSU5FVDoKIAkJZHN0X29wcyA9ICZuZXQtPnhmcm0ueGZybTRfZHN0X29wczsKIAkJYnJlYWs7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIEFGX0lORVQ2OgogCQlkc3Rfb3BzID0gJm5ldC0+eGZybS54ZnJtNl9kc3Rfb3BzOwogCQlicmVhazsKQEAgLTE0OTksNyArMTQ5OSw3IEBACiAJCWdvdG8gZnJlZV9kc3Q7CiAKIAkvKiBDb3B5IG5laWdoYm91ciBmb3IgcmVhY2hhYmlsaXR5IGNvbmZpcm1hdGlvbiAqLwotCWRzdF9zZXRfbmVpZ2hib3VyKGRzdDAsIG5laWdoX2Nsb25lKGRzdF9nZXRfbmVpZ2hib3VyKGRzdCkpKTsKKwlkc3Rfc2V0X25laWdoYm91cihkc3QwLCBuZWlnaF9jbG9uZShkc3RfZ2V0X25laWdoYm91cl9ub3JlZihkc3QpKSk7CiAKIAl4ZnJtX2luaXRfcGF0aCgoc3RydWN0IHhmcm1fZHN0ICopZHN0MCwgZHN0LCBuZmhlYWRlcl9sZW4pOwogCXhmcm1faW5pdF9wbXR1KGRzdF9wcmV2KTsKQEAgLTIyNzYsOCArMjI3Niw2IEBACiB7CiAJc3RydWN0IGRzdF9lbnRyeSAqaGVhZCwgKm5leHQ7CiAKLQlmbG93X2NhY2hlX2ZsdXNoKCk7Ci0KIAlzcGluX2xvY2tfYmgoJnhmcm1fcG9saWN5X3NrX2J1bmRsZV9sb2NrKTsKIAloZWFkID0geGZybV9wb2xpY3lfc2tfYnVuZGxlczsKIAl4ZnJtX3BvbGljeV9za19idW5kbGVzID0gTlVMTDsKQEAgLTIyOTAsNiArMjI4OCwxOCBAQAogCX0KIH0KIAorc3RhdGljIHZvaWQgeGZybV9nYXJiYWdlX2NvbGxlY3Qoc3RydWN0IG5ldCAqbmV0KQoreworCWZsb3dfY2FjaGVfZmx1c2goKTsKKwlfX3hmcm1fZ2FyYmFnZV9jb2xsZWN0KG5ldCk7Cit9CisKK3N0YXRpYyB2b2lkIHhmcm1fZ2FyYmFnZV9jb2xsZWN0X2RlZmVycmVkKHN0cnVjdCBuZXQgKm5ldCkKK3sKKwlmbG93X2NhY2hlX2ZsdXNoX2RlZmVycmVkKCk7CisJX194ZnJtX2dhcmJhZ2VfY29sbGVjdChuZXQpOworfQorCiBzdGF0aWMgdm9pZCB4ZnJtX2luaXRfcG10dShzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCiB7CiAJZG8gewpAQCAtMjM4Miw5ICsyMzkyLDExIEBACiAJcmV0dXJuIGRzdF9tZXRyaWNfYWR2bXNzKGRzdC0+cGF0aCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgeGZybV9kZWZhdWx0X210dShjb25zdCBzdHJ1Y3QgZHN0X2VudHJ5ICpkc3QpCitzdGF0aWMgdW5zaWduZWQgaW50IHhmcm1fbXR1KGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCkKIHsKLQlyZXR1cm4gZHN0X210dShkc3QtPnBhdGgpOworCXVuc2lnbmVkIGludCBtdHUgPSBkc3RfbWV0cmljX3Jhdyhkc3QsIFJUQVhfTVRVKTsKKworCXJldHVybiBtdHUgPyA6IGRzdF9tdHUoZHN0LT5wYXRoKTsKIH0KIAogc3RhdGljIHN0cnVjdCBuZWlnaGJvdXIgKnhmcm1fbmVpZ2hfbG9va3VwKGNvbnN0IHN0cnVjdCBkc3RfZW50cnkgKmRzdCwgY29uc3Qgdm9pZCAqZGFkZHIpCkBAIC0yNDExLDggKzI0MjMsOCBAQAogCQkJZHN0X29wcy0+Y2hlY2sgPSB4ZnJtX2RzdF9jaGVjazsKIAkJaWYgKGxpa2VseShkc3Rfb3BzLT5kZWZhdWx0X2Fkdm1zcyA9PSBOVUxMKSkKIAkJCWRzdF9vcHMtPmRlZmF1bHRfYWR2bXNzID0geGZybV9kZWZhdWx0X2Fkdm1zczsKLQkJaWYgKGxpa2VseShkc3Rfb3BzLT5kZWZhdWx0X210dSA9PSBOVUxMKSkKLQkJCWRzdF9vcHMtPmRlZmF1bHRfbXR1ID0geGZybV9kZWZhdWx0X210dTsKKwkJaWYgKGxpa2VseShkc3Rfb3BzLT5tdHUgPT0gTlVMTCkpCisJCQlkc3Rfb3BzLT5tdHUgPSB4ZnJtX210dTsKIAkJaWYgKGxpa2VseShkc3Rfb3BzLT5uZWdhdGl2ZV9hZHZpY2UgPT0gTlVMTCkpCiAJCQlkc3Rfb3BzLT5uZWdhdGl2ZV9hZHZpY2UgPSB4ZnJtX25lZ2F0aXZlX2FkdmljZTsKIAkJaWYgKGxpa2VseShkc3Rfb3BzLT5saW5rX2ZhaWx1cmUgPT0gTlVMTCkpCkBAIC0yNDIwLDcgKzI0MzIsNyBAQAogCQlpZiAobGlrZWx5KGRzdF9vcHMtPm5laWdoX2xvb2t1cCA9PSBOVUxMKSkKIAkJCWRzdF9vcHMtPm5laWdoX2xvb2t1cCA9IHhmcm1fbmVpZ2hfbG9va3VwOwogCQlpZiAobGlrZWx5KGFmaW5mby0+Z2FyYmFnZV9jb2xsZWN0ID09IE5VTEwpKQotCQkJYWZpbmZvLT5nYXJiYWdlX2NvbGxlY3QgPSBfX3hmcm1fZ2FyYmFnZV9jb2xsZWN0OworCQkJYWZpbmZvLT5nYXJiYWdlX2NvbGxlY3QgPSB4ZnJtX2dhcmJhZ2VfY29sbGVjdF9kZWZlcnJlZDsKIAkJeGZybV9wb2xpY3lfYWZpbmZvW2FmaW5mby0+ZmFtaWx5XSA9IGFmaW5mbzsKIAl9CiAJd3JpdGVfdW5sb2NrX2JoKCZ4ZnJtX3BvbGljeV9hZmluZm9fbG9jayk7CkBAIC0yNDMzLDcgKzI0NDUsNyBAQAogCQljYXNlIEFGX0lORVQ6CiAJCQl4ZnJtX2RzdF9vcHMgPSAmbmV0LT54ZnJtLnhmcm00X2RzdF9vcHM7CiAJCQlicmVhazsKLSNpZiBkZWZpbmVkKENPTkZJR19JUFY2KSB8fCBkZWZpbmVkKENPTkZJR19JUFY2X01PRFVMRSkKKyNpZiBJU19FTkFCTEVEKENPTkZJR19JUFY2KQogCQljYXNlIEFGX0lORVQ2OgogCQkJeGZybV9kc3Rfb3BzID0gJm5ldC0+eGZybS54ZnJtNl9kc3Rfb3BzOwogCQkJYnJlYWs7CkBAIC0yNDgzLDcgKzI0OTUsNyBAQAogCWFmaW5mbyA9IHhmcm1fcG9saWN5X2FmaW5mb1tBRl9JTkVUXTsKIAlpZiAoYWZpbmZvKQogCQluZXQtPnhmcm0ueGZybTRfZHN0X29wcyA9ICphZmluZm8tPmRzdF9vcHM7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAlhZmluZm8gPSB4ZnJtX3BvbGljeV9hZmluZm9bQUZfSU5FVDZdOwogCWlmIChhZmluZm8pCiAJCW5ldC0+eGZybS54ZnJtNl9kc3Rfb3BzID0gKmFmaW5mby0+ZHN0X29wczsKQEAgLTI1MTQsNyArMjUyNiw3IEBACiAKIAlzd2l0Y2ggKGV2ZW50KSB7CiAJY2FzZSBORVRERVZfRE9XTjoKLQkJX194ZnJtX2dhcmJhZ2VfY29sbGVjdChkZXZfbmV0KGRldikpOworCQl4ZnJtX2dhcmJhZ2VfY29sbGVjdChkZXZfbmV0KGRldikpOwogCX0KIAlyZXR1cm4gTk9USUZZX0RPTkU7CiB9CmRpZmYgLS1naXQgYS9uZXQveGZybS94ZnJtX3N0YXRlLmMgYi9uZXQveGZybS94ZnJtX3N0YXRlLmMKaW5kZXggOTQxNGI5Yy4uNWIyMjhmOSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV9zdGF0ZS5jCisrKyBiL25ldC94ZnJtL3hmcm1fc3RhdGUuYwpAQCAtMTAzNSwxNiArMTAzNSwxMiBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBBRl9JTkVUNjoKLQkJCWlwdjZfYWRkcl9jb3B5KChzdHJ1Y3QgaW42X2FkZHIgKil4LT5zZWwuZGFkZHIuYTYsCi0JCQkJICAgICAgIChjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKilkYWRkcik7Ci0JCQlpcHY2X2FkZHJfY29weSgoc3RydWN0IGluNl9hZGRyICopeC0+c2VsLnNhZGRyLmE2LAotCQkJCSAgICAgICAoY29uc3Qgc3RydWN0IGluNl9hZGRyICopc2FkZHIpOworCQkJKihzdHJ1Y3QgaW42X2FkZHIgKil4LT5zZWwuZGFkZHIuYTYgPSAqKHN0cnVjdCBpbjZfYWRkciAqKWRhZGRyOworCQkJKihzdHJ1Y3QgaW42X2FkZHIgKil4LT5zZWwuc2FkZHIuYTYgPSAqKHN0cnVjdCBpbjZfYWRkciAqKXNhZGRyOwogCQkJeC0+c2VsLnByZWZpeGxlbl9kID0gMTI4OwogCQkJeC0+c2VsLnByZWZpeGxlbl9zID0gMTI4OwotCQkJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKXgtPnByb3BzLnNhZGRyLmE2LAotCQkJCSAgICAgICAoY29uc3Qgc3RydWN0IGluNl9hZGRyICopc2FkZHIpOwotCQkJaXB2Nl9hZGRyX2NvcHkoKHN0cnVjdCBpbjZfYWRkciAqKXgtPmlkLmRhZGRyLmE2LAotCQkJCSAgICAgICAoY29uc3Qgc3RydWN0IGluNl9hZGRyICopZGFkZHIpOworCQkJKihzdHJ1Y3QgaW42X2FkZHIgKil4LT5wcm9wcy5zYWRkci5hNiA9ICooc3RydWN0IGluNl9hZGRyICopc2FkZHI7CisJCQkqKHN0cnVjdCBpbjZfYWRkciAqKXgtPmlkLmRhZGRyLmE2ID0gKihzdHJ1Y3QgaW42X2FkZHIgKilkYWRkcjsKIAkJCWJyZWFrOwogCQl9CiAKZGlmZiAtLWdpdCBhL25ldC94ZnJtL3hmcm1fdXNlci5jIGIvbmV0L3hmcm0veGZybV91c2VyLmMKaW5kZXggZDBhNDJkZi4uZTBkNzQ3YSAxMDA2NDQKLS0tIGEvbmV0L3hmcm0veGZybV91c2VyLmMKKysrIGIvbmV0L3hmcm0veGZybV91c2VyLmMKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxuZXQvbmV0bGluay5oPgogI2luY2x1ZGUgPG5ldC9haC5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKICNpbmNsdWRlIDxsaW51eC9pbjYuaD4KICNlbmRpZgogCkBAIC0xNTAsNyArMTUwLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFGX0lORVQ2OgotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCWJyZWFrOwogI2Vsc2UKIAkJZXJyID0gLUVBRk5PU1VQUE9SVDsKQEAgLTIwMSw3ICsyMDEsNyBAQAogCQkJZ290byBvdXQ7CiAJCWJyZWFrOwogCi0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIElQUFJPVE9fRFNUT1BUUzoKIAljYXNlIElQUFJPVE9fUk9VVElORzoKIAkJaWYgKGF0dHJzW1hGUk1BX0FMR19DT01QXQl8fApAQCAtMTE2MCw3ICsxMTYwLDcgQEAKIAkJYnJlYWs7CiAKIAljYXNlIEFGX0lORVQ2OgotI2lmIGRlZmluZWQoQ09ORklHX0lQVjYpIHx8IGRlZmluZWQoQ09ORklHX0lQVjZfTU9EVUxFKQorI2lmIElTX0VOQUJMRUQoQ09ORklHX0lQVjYpCiAJCWJyZWFrOwogI2Vsc2UKIAkJcmV0dXJuICAtRUFGTk9TVVBQT1JUOwpAQCAtMTIzMSw3ICsxMjMxLDcgQEAKIAkJc3dpdGNoICh1dFtpXS5mYW1pbHkpIHsKIAkJY2FzZSBBRl9JTkVUOgogCQkJYnJlYWs7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAkJY2FzZSBBRl9JTkVUNjoKIAkJCWJyZWFrOwogI2VuZGlmCkBAIC0yNjA0LDcgKzI2MDQsNyBAQAogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJYnJlYWs7Ci0jaWYgZGVmaW5lZChDT05GSUdfSVBWNikgfHwgZGVmaW5lZChDT05GSUdfSVBWNl9NT0RVTEUpCisjaWYgSVNfRU5BQkxFRChDT05GSUdfSVBWNikKIAljYXNlIEFGX0lORVQ2OgogCQlpZiAob3B0ICE9IElQVjZfWEZSTV9QT0xJQ1kpIHsKIAkJCSpkaXIgPSAtRU9QTk9UU1VQUDsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZSBiL3NjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQppbmRleCBiYTU3M2ZlLi45MTQ4MzNkIDEwMDY0NAotLS0gYS9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKKysrIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCkBAIC02MCw4ICs2MCw4IEBACiAJICAgIC0tZGlyZWN0b3J5PSQoc3JjdHJlZSkgLS1kaXJlY3Rvcnk9JChvYmp0cmVlKSAgICAgICAgICAgXAogCSAgICAtLW91dHB1dCAkKG9iaikvY29uZmlnLnBvdAogCSQoUSlzZWQgLWkgcy9DSEFSU0VUL1VURi04LyAkKG9iaikvY29uZmlnLnBvdAotCSQoUSlsbiAtZnMgS2NvbmZpZy54ODYgYXJjaC91bS9LY29uZmlnCi0JJChRKShmb3IgaSBpbiBgbHMgJChzcmN0cmVlKS9hcmNoLyovS2NvbmZpZ2A7ICAgIFwKKwkkKFEpKGZvciBpIGluIGBscyAkKHNyY3RyZWUpL2FyY2gvKi9LY29uZmlnICAgICAgXAorCSAgICAkKHNyY3RyZWUpL2FyY2gvKi91bS9LY29uZmlnYDsgICAgICAgICAgICAgICBcCiAJICAgIGRvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIAkJZWNobyAiICBHRU4gJCRpIjsgICAgICAgICAgICAgICAgICAgICAgICBcCiAJCSQob2JqKS9reGdldHRleHQgJCRpICAgICAgICAgICAgICAgICAgICAgXApAQCAtNjksNyArNjksNiBAQAogCSAgICBkb25lICkKIAkkKFEpbXNndW5pcSAtLXNvcnQtYnktZmlsZSAtLXRvLWNvZGU9VVRGLTggJChvYmopL2NvbmZpZy5wb3QgXAogCSAgICAtLW91dHB1dCAkKG9iaikvbGludXgucG90Ci0JJChRKXJtIC1mICQoc3JjdHJlZSkvYXJjaC91bS9LY29uZmlnCiAJJChRKXJtIC1mICQob2JqKS9jb25maWcucG90CiAKIFBIT05ZICs9IGFsbG5vY29uZmlnIGFsbHllc2NvbmZpZyBhbGxtb2Rjb25maWcgYWxsZGVmY29uZmlnIHJhbmRjb25maWcKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2FwcGFybW9yL3BhdGguYyBiL3NlY3VyaXR5L2FwcGFybW9yL3BhdGguYwppbmRleCAzNmNjMGNjLi5iNTY2ZWJhIDEwMDY0NAotLS0gYS9zZWN1cml0eS9hcHBhcm1vci9wYXRoLmMKKysrIGIvc2VjdXJpdHkvYXBwYXJtb3IvcGF0aC5jCkBAIC01NywyMyArNTcsNDQgQEAKIHN0YXRpYyBpbnQgZF9uYW1lc3BhY2VfcGF0aChzdHJ1Y3QgcGF0aCAqcGF0aCwgY2hhciAqYnVmLCBpbnQgYnVmbGVuLAogCQkJICAgIGNoYXIgKipuYW1lLCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHBhdGggcm9vdCwgdG1wOwogCWNoYXIgKnJlczsKLQlpbnQgY29ubmVjdGVkLCBlcnJvciA9IDA7CisJaW50IGVycm9yID0gMDsKKwlpbnQgY29ubmVjdGVkID0gMTsKIAotCS8qIEdldCB0aGUgcm9vdCB3ZSB3YW50IHRvIHJlc29sdmUgdG9vLCByZWxlYXNlZCBiZWxvdyAqLwotCWlmIChmbGFncyAmIFBBVEhfQ0hST09UX1JFTCkgewotCQkvKiByZXNvbHZlIHBhdGhzIHJlbGF0aXZlIHRvIGNocm9vdCAqLwotCQlnZXRfZnNfcm9vdChjdXJyZW50LT5mcywgJnJvb3QpOwotCX0gZWxzZSB7Ci0JCS8qIHJlc29sdmUgcGF0aHMgcmVsYXRpdmUgdG8gbmFtZXNwYWNlICovCi0JCXJvb3QubW50ID0gY3VycmVudC0+bnNwcm94eS0+bW50X25zLT5yb290OwotCQlyb290LmRlbnRyeSA9IHJvb3QubW50LT5tbnRfcm9vdDsKLQkJcGF0aF9nZXQoJnJvb3QpOworCWlmIChwYXRoLT5tbnQtPm1udF9mbGFncyAmIE1OVF9JTlRFUk5BTCkgeworCQkvKiBpdCdzIG5vdCBtb3VudGVkIGFueXdoZXJlICovCisJCXJlcyA9IGRlbnRyeV9wYXRoKHBhdGgtPmRlbnRyeSwgYnVmLCBidWZsZW4pOworCQkqbmFtZSA9IHJlczsKKwkJaWYgKElTX0VSUihyZXMpKSB7CisJCQkqbmFtZSA9IGJ1ZjsKKwkJCXJldHVybiBQVFJfRVJSKHJlcyk7CisJCX0KKwkJaWYgKHBhdGgtPmRlbnRyeS0+ZF9zYi0+c19tYWdpYyA9PSBQUk9DX1NVUEVSX01BR0lDICYmCisJCSAgICBzdHJuY21wKCpuYW1lLCAiL3N5cy8iLCA1KSA9PSAwKSB7CisJCQkvKiBUT0RPOiBjb252ZXJ0IG92ZXIgdG8gdXNpbmcgYSBwZXIgbmFtZXNwYWNlCisJCQkgKiBjb250cm9sIGluc3RlYWQgb2YgaGFyZCBjb2RlZCAvcHJvYworCQkJICovCisJCQlyZXR1cm4gcHJlcGVuZChuYW1lLCAqbmFtZSAtIGJ1ZiwgIi9wcm9jIiwgNSk7CisJCX0KKwkJcmV0dXJuIDA7CiAJfQogCi0JdG1wID0gcm9vdDsKLQlyZXMgPSBfX2RfcGF0aChwYXRoLCAmdG1wLCBidWYsIGJ1Zmxlbik7CisJLyogcmVzb2x2ZSBwYXRocyByZWxhdGl2ZSB0byBjaHJvb3Q/Ki8KKwlpZiAoZmxhZ3MgJiBQQVRIX0NIUk9PVF9SRUwpIHsKKwkJc3RydWN0IHBhdGggcm9vdDsKKwkJZ2V0X2ZzX3Jvb3QoY3VycmVudC0+ZnMsICZyb290KTsKKwkJcmVzID0gX19kX3BhdGgocGF0aCwgJnJvb3QsIGJ1ZiwgYnVmbGVuKTsKKwkJaWYgKHJlcyAmJiAhSVNfRVJSKHJlcykpIHsKKwkJCS8qIGV2ZXJ5dGhpbmcncyBmaW5lICovCisJCQkqbmFtZSA9IHJlczsKKwkJCXBhdGhfcHV0KCZyb290KTsKKwkJCWdvdG8gb2s7CisJCX0KKwkJcGF0aF9wdXQoJnJvb3QpOworCQljb25uZWN0ZWQgPSAwOworCX0KKworCXJlcyA9IGRfYWJzb2x1dGVfcGF0aChwYXRoLCBidWYsIGJ1Zmxlbik7CiAKIAkqbmFtZSA9IHJlczsKIAkvKiBoYW5kbGUgZXJyb3IgY29uZGl0aW9ucyAtIGFuZCBzdGlsbCBhbGxvdyBhIHBhcnRpYWwgcGF0aCB0bwpAQCAtODQsNyArMTA1LDEwIEBACiAJCSpuYW1lID0gYnVmOwogCQlnb3RvIG91dDsKIAl9CisJaWYgKCFvdXJfbW50KHBhdGgtPm1udCkpCisJCWNvbm5lY3RlZCA9IDA7CiAKK29rOgogCS8qIEhhbmRsZSB0d28gY2FzZXM6CiAJICogMS4gQSBkZWxldGVkIGRlbnRyeSAmJiBwcm9maWxlIGlzIG5vdCBhbGxvd2luZyBtZWRpYXRpb24gb2YgZGVsZXRlZAogCSAqIDIuIE9uIHNvbWUgZmlsZXN5c3RlbXMsIG5ld2x5IGFsbG9jYXRlZCBkZW50cmllcyBhcHBlYXIgdG8gdGhlCkBAIC05NywxMCArMTIxLDcgQEAKIAkJCWdvdG8gb3V0OwogCX0KIAotCS8qIERldGVybWluZSBpZiB0aGUgcGF0aCBpcyBjb25uZWN0ZWQgdG8gdGhlIGV4cGVjdGVkIHJvb3QgKi8KLQljb25uZWN0ZWQgPSB0bXAuZGVudHJ5ID09IHJvb3QuZGVudHJ5ICYmIHRtcC5tbnQgPT0gcm9vdC5tbnQ7Ci0KLQkvKiBJZiB0aGUgcGF0aCBpcyBub3QgY29ubmVjdGVkLAorCS8qIElmIHRoZSBwYXRoIGlzIG5vdCBjb25uZWN0ZWQgdG8gdGhlIGV4cGVjdGVkIHJvb3QsCiAJICogY2hlY2sgaWYgaXQgaXMgYSBzeXNjdGwgYW5kIGhhbmRsZSBzcGVjaWFsbHkgZWxzZSByZW1vdmUgYW55CiAJICogbGVhZGluZyAvIHRoYXQgX19kX3BhdGggbWF5IGhhdmUgcmV0dXJuZWQuCiAJICogVW5sZXNzCkBAIC0xMTIsMTcgKzEzMyw5IEBACiAJICogICAgIG5hbWVzcGFjZSByb290LgogCSAqLwogCWlmICghY29ubmVjdGVkKSB7Ci0JCS8qIGlzIHRoZSBkaXNjb25uZWN0IHBhdGggYSBzeXNjdGw/ICovCi0JCWlmICh0bXAuZGVudHJ5LT5kX3NiLT5zX21hZ2ljID09IFBST0NfU1VQRVJfTUFHSUMgJiYKLQkJICAgIHN0cm5jbXAoKm5hbWUsICIvc3lzLyIsIDUpID09IDApIHsKLQkJCS8qIFRPRE86IGNvbnZlcnQgb3ZlciB0byB1c2luZyBhIHBlciBuYW1lc3BhY2UKLQkJCSAqIGNvbnRyb2wgaW5zdGVhZCBvZiBoYXJkIGNvZGVkIC9wcm9jCi0JCQkgKi8KLQkJCWVycm9yID0gcHJlcGVuZChuYW1lLCAqbmFtZSAtIGJ1ZiwgIi9wcm9jIiwgNSk7Ci0JCX0gZWxzZSBpZiAoIShmbGFncyAmIFBBVEhfQ09OTkVDVF9QQVRIKSAmJgorCQlpZiAoIShmbGFncyAmIFBBVEhfQ09OTkVDVF9QQVRIKSAmJgogCQkJICAgISgoKGZsYWdzICYgQ0hST09UX05TQ09OTkVDVCkgPT0gQ0hST09UX05TQ09OTkVDVCkgJiYKLQkJCSAgICAgKHRtcC5tbnQgPT0gY3VycmVudC0+bnNwcm94eS0+bW50X25zLT5yb290ICYmCi0JCQkgICAgICB0bXAuZGVudHJ5ID09IHRtcC5tbnQtPm1udF9yb290KSkpIHsKKwkJCSAgICAgb3VyX21udChwYXRoLT5tbnQpKSkgewogCQkJLyogZGlzY29ubmVjdGVkIHBhdGgsIGRvbid0IHJldHVybiBwYXRobmFtZSBzdGFydGluZwogCQkJICogd2l0aCAnLycKIAkJCSAqLwpAQCAtMTMzLDggKzE0Niw2IEBACiAJfQogCiBvdXQ6Ci0JcGF0aF9wdXQoJnJvb3QpOwotCiAJcmV0dXJuIGVycm9yOwogfQogCmRpZmYgLS1naXQgYS9zZWN1cml0eS9pbnRlZ3JpdHkvZXZtL2V2bV9jcnlwdG8uYyBiL3NlY3VyaXR5L2ludGVncml0eS9ldm0vZXZtX2NyeXB0by5jCmluZGV4IDVkZDViMTQwLi44NzM4ZGVmIDEwMDY0NAotLS0gYS9zZWN1cml0eS9pbnRlZ3JpdHkvZXZtL2V2bV9jcnlwdG8uYworKysgYi9zZWN1cml0eS9pbnRlZ3JpdHkvZXZtL2V2bV9jcnlwdG8uYwpAQCAtMjcsMjAgKzI3LDM1IEBACiAKIHN0cnVjdCBjcnlwdG9fc2hhc2ggKmhtYWNfdGZtOwogCitzdGF0aWMgREVGSU5FX01VVEVYKG11dGV4KTsKKwogc3RhdGljIHN0cnVjdCBzaGFzaF9kZXNjICppbml0X2Rlc2Modm9pZCkKIHsKIAlpbnQgcmM7CiAJc3RydWN0IHNoYXNoX2Rlc2MgKmRlc2M7CiAKIAlpZiAoaG1hY190Zm0gPT0gTlVMTCkgeworCQltdXRleF9sb2NrKCZtdXRleCk7CisJCWlmIChobWFjX3RmbSkKKwkJCWdvdG8gb3V0OwogCQlobWFjX3RmbSA9IGNyeXB0b19hbGxvY19zaGFzaChldm1faG1hYywgMCwgQ1JZUFRPX0FMR19BU1lOQyk7CiAJCWlmIChJU19FUlIoaG1hY190Zm0pKSB7CiAJCQlwcl9lcnIoIkNhbiBub3QgYWxsb2NhdGUgJXMgKHJlYXNvbjogJWxkKVxuIiwKIAkJCSAgICAgICBldm1faG1hYywgUFRSX0VSUihobWFjX3RmbSkpOwogCQkJcmMgPSBQVFJfRVJSKGhtYWNfdGZtKTsKIAkJCWhtYWNfdGZtID0gTlVMTDsKKwkJCW11dGV4X3VubG9jaygmbXV0ZXgpOwogCQkJcmV0dXJuIEVSUl9QVFIocmMpOwogCQl9CisJCXJjID0gY3J5cHRvX3NoYXNoX3NldGtleShobWFjX3RmbSwgZXZta2V5LCBldm1rZXlfbGVuKTsKKwkJaWYgKHJjKSB7CisJCQljcnlwdG9fZnJlZV9zaGFzaChobWFjX3RmbSk7CisJCQlobWFjX3RmbSA9IE5VTEw7CisJCQltdXRleF91bmxvY2soJm11dGV4KTsKKwkJCXJldHVybiBFUlJfUFRSKHJjKTsKKwkJfQorb3V0OgorCQltdXRleF91bmxvY2soJm11dGV4KTsKIAl9CiAKIAlkZXNjID0ga21hbGxvYyhzaXplb2YoKmRlc2MpICsgY3J5cHRvX3NoYXNoX2Rlc2NzaXplKGhtYWNfdGZtKSwKQEAgLTUxLDExICs2Niw3IEBACiAJZGVzYy0+dGZtID0gaG1hY190Zm07CiAJZGVzYy0+ZmxhZ3MgPSBDUllQVE9fVEZNX1JFUV9NQVlfU0xFRVA7CiAKLQlyYyA9IGNyeXB0b19zaGFzaF9zZXRrZXkoaG1hY190Zm0sIGV2bWtleSwgZXZta2V5X2xlbik7Ci0JaWYgKHJjKQotCQlnb3RvIG91dDsKIAlyYyA9IGNyeXB0b19zaGFzaF9pbml0KGRlc2MpOwotb3V0OgogCWlmIChyYykgewogCQlrZnJlZShkZXNjKTsKIAkJcmV0dXJuIEVSUl9QVFIocmMpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvbHNtX2F1ZGl0LmMgYi9zZWN1cml0eS9sc21fYXVkaXQuYwppbmRleCA4OTNhZjhhLi43YmQ2ZjEzIDEwMDY0NAotLS0gYS9zZWN1cml0eS9sc21fYXVkaXQuYworKysgYi9zZWN1cml0eS9sc21fYXVkaXQuYwpAQCAtMTE0LDE5ICsxMTQsMjAgQEAKIAlpbnQgb2Zmc2V0LCByZXQgPSAwOwogCXN0cnVjdCBpcHY2aGRyICppcDY7CiAJdTggbmV4dGhkcjsKKwlfX2JlMTYgZnJhZ19vZmY7CiAKIAlpcDYgPSBpcHY2X2hkcihza2IpOwogCWlmIChpcDYgPT0gTlVMTCkKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaXB2Nl9hZGRyX2NvcHkoJmFkLT51Lm5ldC52NmluZm8uc2FkZHIsICZpcDYtPnNhZGRyKTsKLQlpcHY2X2FkZHJfY29weSgmYWQtPnUubmV0LnY2aW5mby5kYWRkciwgJmlwNi0+ZGFkZHIpOworCWFkLT51Lm5ldC52NmluZm8uc2FkZHIgPSBpcDYtPnNhZGRyOworCWFkLT51Lm5ldC52NmluZm8uZGFkZHIgPSBpcDYtPmRhZGRyOwogCXJldCA9IDA7CiAJLyogSVB2NiBjYW4gaGF2ZSBzZXZlcmFsIGV4dGVuc2lvbiBoZWFkZXIgYmVmb3JlIHRoZSBUcmFuc3BvcnQgaGVhZGVyCiAJICogc2tpcCB0aGVtICovCiAJb2Zmc2V0ID0gc2tiX25ldHdvcmtfb2Zmc2V0KHNrYik7CiAJb2Zmc2V0ICs9IHNpemVvZigqaXA2KTsKIAluZXh0aGRyID0gaXA2LT5uZXh0aGRyOwotCW9mZnNldCA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBvZmZzZXQsICZuZXh0aGRyKTsKKwlvZmZzZXQgPSBpcHY2X3NraXBfZXh0aGRyKHNrYiwgb2Zmc2V0LCAmbmV4dGhkciwgJmZyYWdfb2ZmKTsKIAlpZiAob2Zmc2V0IDwgMCkKIAkJcmV0dXJuIDA7CiAJaWYgKHByb3RvKQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc2VjdXJpdHkuYyBiL3NlY3VyaXR5L3NlY3VyaXR5LmMKaW5kZXggMGM2Y2M2OS4uZTJmNjg0YSAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VjdXJpdHkuYworKysgYi9zZWN1cml0eS9zZWN1cml0eS5jCkBAIC0zODEsNyArMzgxLDcgQEAKIAkJCQkgICAgIHZvaWQgKip2YWx1ZSwgc2l6ZV90ICpsZW4pCiB7CiAJaWYgKHVubGlrZWx5KElTX1BSSVZBVEUoaW5vZGUpKSkKLQkJcmV0dXJuIDA7CisJCXJldHVybiAtRU9QTk9UU1VQUDsKIAlyZXR1cm4gc2VjdXJpdHlfb3BzLT5pbm9kZV9pbml0X3NlY3VyaXR5KGlub2RlLCBkaXIsIHFzdHIsIG5hbWUsIHZhbHVlLAogCQkJCQkJIGxlbik7CiB9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMgYi9zZWN1cml0eS9zZWxpbnV4L2hvb2tzLmMKaW5kZXggMTEyNmMxMC4uODYzMDVjMiAxMDA2NDQKLS0tIGEvc2VjdXJpdHkvc2VsaW51eC9ob29rcy5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvaG9va3MuYwpAQCAtMTA5MCw3ICsxMDkwLDcgQEAKIAkJCXJldHVybiBTRUNDTEFTU19ORVRMSU5LX1JPVVRFX1NPQ0tFVDsKIAkJY2FzZSBORVRMSU5LX0ZJUkVXQUxMOgogCQkJcmV0dXJuIFNFQ0NMQVNTX05FVExJTktfRklSRVdBTExfU09DS0VUOwotCQljYXNlIE5FVExJTktfSU5FVF9ESUFHOgorCQljYXNlIE5FVExJTktfU09DS19ESUFHOgogCQkJcmV0dXJuIFNFQ0NMQVNTX05FVExJTktfVENQRElBR19TT0NLRVQ7CiAJCWNhc2UgTkVUTElOS19ORkxPRzoKIAkJCXJldHVybiBTRUNDTEFTU19ORVRMSU5LX05GTE9HX1NPQ0tFVDsKQEAgLTM1NjEsMTkgKzM1NjEsMjAgQEAKIAl1OCBuZXh0aGRyOwogCWludCByZXQgPSAtRUlOVkFMLCBvZmZzZXQ7CiAJc3RydWN0IGlwdjZoZHIgX2lwdjZoLCAqaXA2OworCV9fYmUxNiBmcmFnX29mZjsKIAogCW9mZnNldCA9IHNrYl9uZXR3b3JrX29mZnNldChza2IpOwogCWlwNiA9IHNrYl9oZWFkZXJfcG9pbnRlcihza2IsIG9mZnNldCwgc2l6ZW9mKF9pcHY2aCksICZfaXB2NmgpOwogCWlmIChpcDYgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQlpcHY2X2FkZHJfY29weSgmYWQtPnUubmV0LnY2aW5mby5zYWRkciwgJmlwNi0+c2FkZHIpOwotCWlwdjZfYWRkcl9jb3B5KCZhZC0+dS5uZXQudjZpbmZvLmRhZGRyLCAmaXA2LT5kYWRkcik7CisJYWQtPnUubmV0LnY2aW5mby5zYWRkciA9IGlwNi0+c2FkZHI7CisJYWQtPnUubmV0LnY2aW5mby5kYWRkciA9IGlwNi0+ZGFkZHI7CiAJcmV0ID0gMDsKIAogCW5leHRoZHIgPSBpcDYtPm5leHRoZHI7CiAJb2Zmc2V0ICs9IHNpemVvZihfaXB2NmgpOwotCW9mZnNldCA9IGlwdjZfc2tpcF9leHRoZHIoc2tiLCBvZmZzZXQsICZuZXh0aGRyKTsKKwlvZmZzZXQgPSBpcHY2X3NraXBfZXh0aGRyKHNrYiwgb2Zmc2V0LCAmbmV4dGhkciwgJmZyYWdfb2ZmKTsKIAlpZiAob2Zmc2V0IDwgMCkKIAkJZ290byBvdXQ7CiAKQEAgLTM4NzEsNyArMzg3Miw3IEBACiAJCWlmIChmYW1pbHkgPT0gUEZfSU5FVCkKIAkJCWFkLnUubmV0LnY0aW5mby5zYWRkciA9IGFkZHI0LT5zaW5fYWRkci5zX2FkZHI7CiAJCWVsc2UKLQkJCWlwdjZfYWRkcl9jb3B5KCZhZC51Lm5ldC52NmluZm8uc2FkZHIsICZhZGRyNi0+c2luNl9hZGRyKTsKKwkJCWFkLnUubmV0LnY2aW5mby5zYWRkciA9IGFkZHI2LT5zaW42X2FkZHI7CiAKIAkJZXJyID0gYXZjX2hhc19wZXJtKHNrc2VjLT5zaWQsIHNpZCwKIAkJCQkgICBza3NlYy0+c2NsYXNzLCBub2RlX3Blcm0sICZhZCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25ldG5vZGUuYyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bm9kZS5jCmluZGV4IDNiZjQ2YWIuLjg2MzY1ODUgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmV0bm9kZS5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvbmV0bm9kZS5jCkBAIC0yMjAsNyArMjIwLDcgQEAKIAljYXNlIFBGX0lORVQ2OgogCQlyZXQgPSBzZWN1cml0eV9ub2RlX3NpZChQRl9JTkVUNiwKIAkJCQkJYWRkciwgc2l6ZW9mKHN0cnVjdCBpbjZfYWRkciksIHNpZCk7Ci0JCWlwdjZfYWRkcl9jb3B5KCZuZXctPm5zZWMuYWRkci5pcHY2LCBhZGRyKTsKKwkJbmV3LT5uc2VjLmFkZHIuaXB2NiA9ICooc3RydWN0IGluNl9hZGRyICopYWRkcjsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJQlVHKCk7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9zZWxpbnV4L25ldHBvcnQuYyBiL3NlY3VyaXR5L3NlbGludXgvbmV0cG9ydC5jCmluZGV4IDBiNjJiZDEuLjdiOWViMWYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NlbGludXgvbmV0cG9ydC5jCisrKyBiL3NlY3VyaXR5L3NlbGludXgvbmV0cG9ydC5jCkBAIC0xMjMsNyArMTIzLDkgQEAKIAlpZiAoc2VsX25ldHBvcnRfaGFzaFtpZHhdLnNpemUgPT0gU0VMX05FVFBPUlRfSEFTSF9CS1RfTElNSVQpIHsKIAkJc3RydWN0IHNlbF9uZXRwb3J0ICp0YWlsOwogCQl0YWlsID0gbGlzdF9lbnRyeSgKLQkJCXJjdV9kZXJlZmVyZW5jZShzZWxfbmV0cG9ydF9oYXNoW2lkeF0ubGlzdC5wcmV2KSwKKwkJCXJjdV9kZXJlZmVyZW5jZV9wcm90ZWN0ZWQoCisJCQkJc2VsX25ldHBvcnRfaGFzaFtpZHhdLmxpc3QucHJldiwKKwkJCQlsb2NrZGVwX2lzX2hlbGQoJnNlbF9uZXRwb3J0X2xvY2spKSwKIAkJCXN0cnVjdCBzZWxfbmV0cG9ydCwgbGlzdCk7CiAJCWxpc3RfZGVsX3JjdSgmdGFpbC0+bGlzdCk7CiAJCWtmcmVlX3JjdSh0YWlsLCByY3UpOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvdG9tb3lvL3JlYWxwYXRoLmMgYi9zZWN1cml0eS90b21veW8vcmVhbHBhdGguYwppbmRleCA3MzhiYmRmLi5kOWYzY2VkIDEwMDY0NAotLS0gYS9zZWN1cml0eS90b21veW8vcmVhbHBhdGguYworKysgYi9zZWN1cml0eS90b21veW8vcmVhbHBhdGguYwpAQCAtMTAxLDkgKzEwMSw4IEBACiB7CiAJY2hhciAqcG9zID0gRVJSX1BUUigtRU5PTUVNKTsKIAlpZiAoYnVmbGVuID49IDI1NikgewotCQlzdHJ1Y3QgcGF0aCBuc19yb290ID0geyB9OwogCQkvKiBnbyB0byB3aGF0ZXZlciBuYW1lc3BhY2Ugcm9vdCB3ZSBhcmUgdW5kZXIgKi8KLQkJcG9zID0gX19kX3BhdGgocGF0aCwgJm5zX3Jvb3QsIGJ1ZmZlciwgYnVmbGVuIC0gMSk7CisJCXBvcyA9IGRfYWJzb2x1dGVfcGF0aChwYXRoLCBidWZmZXIsIGJ1ZmxlbiAtIDEpOwogCQlpZiAoIUlTX0VSUihwb3MpICYmICpwb3MgPT0gJy8nICYmIHBvc1sxXSkgewogCQkJc3RydWN0IGlub2RlICppbm9kZSA9IHBhdGgtPmRlbnRyeS0+ZF9pbm9kZTsKIAkJCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKSB7CkBAIC0yOTQsOCArMjkzLDE2IEBACiAJCQlwb3MgPSB0b21veW9fZ2V0X2xvY2FsX3BhdGgocGF0aC0+ZGVudHJ5LCBidWYsCiAJCQkJCQkgICAgYnVmX2xlbiAtIDEpOwogCQkvKiBHZXQgYWJzb2x1dGUgbmFtZSBmb3IgdGhlIHJlc3QuICovCi0JCWVsc2UKKwkJZWxzZSB7CiAJCQlwb3MgPSB0b21veW9fZ2V0X2Fic29sdXRlX3BhdGgocGF0aCwgYnVmLCBidWZfbGVuIC0gMSk7CisJCQkvKgorCQkJICogRmFsbCBiYWNrIHRvIGxvY2FsIG5hbWUgaWYgYWJzb2x1dGUgbmFtZSBpcyBub3QKKwkJCSAqIGF2YWlsYWJsZS4KKwkJCSAqLworCQkJaWYgKHBvcyA9PSBFUlJfUFRSKC1FSU5WQUwpKQorCQkJCXBvcyA9IHRvbW95b19nZXRfbG9jYWxfcGF0aChwYXRoLT5kZW50cnksIGJ1ZiwKKwkJCQkJCQkgICAgYnVmX2xlbiAtIDEpOworCQl9CiBlbmNvZGU6CiAJCWlmIChJU19FUlIocG9zKSkKIAkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvc291bmQvYXRtZWwvYWM5N2MuYyBiL3NvdW5kL2F0bWVsL2FjOTdjLmMKaW5kZXggNmU1YWRkZS4uNzM1MTZmNiAxMDA2NDQKLS0tIGEvc291bmQvYXRtZWwvYWM5N2MuYworKysgYi9zb3VuZC9hdG1lbC9hYzk3Yy5jCkBAIC04OTksNiArODk5LDEwIEBACiAJCS8qIEFDOTcgdjIuMiBzcGVjaWZpY2F0aW9ucyBzYXlzIG1pbmltdW0gMSB1cy4gKi8KIAkJdWRlbGF5KDIpOwogCQlncGlvX3NldF92YWx1ZShjaGlwLT5yZXNldF9waW4sIDEpOworCX0gZWxzZSB7CisJCWFjOTdjX3dyaXRlbChjaGlwLCBNUiwgQUM5N0NfTVJfV1JTVCB8IEFDOTdDX01SX0VOQSk7CisJCXVkZWxheSgyKTsKKwkJYWM5N2Nfd3JpdGVsKGNoaXAsIE1SLCBBQzk3Q19NUl9FTkEpOwogCX0KIH0KIApkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYyBiL3NvdW5kL3BjaS9oZGEvaGRhX2ludGVsLmMKaW5kZXggMDk2NTA3ZC4uYzJmNzllNiAxMDA2NDQKLS0tIGEvc291bmQvcGNpL2hkYS9oZGFfaW50ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL2hkYV9pbnRlbC5jCkBAIC0yNTA3LDggKzI1MDcsOCBAQAogCVNORF9QQ0lfUVVJUksoMHgxMDQzLCAweDgxM2QsICJBU1VTIFA1QUQyIiwgUE9TX0ZJWF9MUElCKSwKIAlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4MWIzLCAiQVNVUyIsIFBPU19GSVhfTFBJQiksCiAJU05EX1BDSV9RVUlSSygweDEwNDMsIDB4ODFlNywgIkFTVVMgTTJWIiwgUE9TX0ZJWF9MUElCKSwKKwlTTkRfUENJX1FVSVJLKDB4MTA0MywgMHg4M2NlLCAiQVNVUyAxMTAxSEEiLCBQT1NfRklYX0xQSUIpLAogCVNORF9QQ0lfUVVJUksoMHgxMDRkLCAweDkwNjksICJTb255IFZQQ1MxMVY5RSIsIFBPU19GSVhfTFBJQiksCi0JU05EX1BDSV9RVUlSSygweDExMDYsIDB4MzI4OCwgIkFTVVMgTTJWLU1YIFNFIiwgUE9TX0ZJWF9MUElCKSwKIAlTTkRfUENJX1FVSVJLKDB4MTI5NywgMHgzMTY2LCAiU2h1dHRsZSIsIFBPU19GSVhfTFBJQiksCiAJU05EX1BDSV9RVUlSSygweDE0NTgsIDB4YTAyMiwgImdhLW1hNzcwLXVkMyIsIFBPU19GSVhfTFBJQiksCiAJU05EX1BDSV9RVUlSSygweDE0NjIsIDB4MTAwMiwgIk1TSSBXaW5kIFUxMTUiLCBQT1NfRklYX0xQSUIpLApAQCAtMjk3MSw3ICsyOTcxLDggQEAKIAkvKiBTQ0ggKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDgxMWIpLAogCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9TQ0ggfCBBWlhfRENBUFNfU0NIX1NOT09QIHwKLQkgIEFaWF9EQ0FQU19CVUZTSVpFfSwKKwkgIEFaWF9EQ0FQU19CVUZTSVpFIHwgQVpYX0RDQVBTX1BPU0ZJWF9MUElCIH0sIC8qIFBvdWxzYm8gKi8KKwkvKiBJQ0ggKi8KIAl7IFBDSV9ERVZJQ0UoMHg4MDg2LCAweDI2NjgpLAogCSAgLmRyaXZlcl9kYXRhID0gQVpYX0RSSVZFUl9JQ0ggfCBBWlhfRENBUFNfT0xEX1NTWU5DIHwKIAkgIEFaWF9EQ0FQU19CVUZTSVpFIH0sICAvKiBJQ0g2ICovCmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvaGRhL3BhdGNoX3JlYWx0ZWsuYyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCmluZGV4IGNiZGUwMTkuLjFkMDdlOGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCisrKyBiL3NvdW5kL3BjaS9oZGEvcGF0Y2hfcmVhbHRlay5jCkBAIC0yOTcsNiArMjk3LDggQEAKIAlpbXV4ID0gJnNwZWMtPmlucHV0X211eFttdXhfaWR4XTsKIAlpZiAoIWltdXgtPm51bV9pdGVtcyAmJiBtdXhfaWR4ID4gMCkKIAkJaW11eCA9ICZzcGVjLT5pbnB1dF9tdXhbMF07CisJaWYgKCFpbXV4LT5udW1faXRlbXMpCisJCXJldHVybiAwOwogCiAJaWYgKGlkeCA+PSBpbXV4LT5udW1faXRlbXMpCiAJCWlkeCA9IGltdXgtPm51bV9pdGVtcyAtIDE7CkBAIC0yNjI5LDYgKzI2MzEsOCBAQAogCWNhc2UgQVVUT19QSU5fU1BFQUtFUl9PVVQ6CiAJCWlmIChjZmctPmxpbmVfb3V0cyA9PSAxKQogCQkJcmV0dXJuICJTcGVha2VyIjsKKwkJaWYgKGNmZy0+bGluZV9vdXRzID09IDIpCisJCQlyZXR1cm4gY2ggPyAiQmFzcyBTcGVha2VyIiA6ICJTcGVha2VyIjsKIAkJYnJlYWs7CiAJY2FzZSBBVVRPX1BJTl9IUF9PVVQ6CiAJCS8qIGZvciBtdWx0aS1pbyBjYXNlLCBvbmx5IHRoZSBwcmltYXJ5IG91dCAqLwpAQCAtMjkwMiw3ICsyOTA2LDcgQEAKIAkJaWYgKCFuaWQpCiAJCQljb250aW51ZTsKIAkJaWYgKGZvdW5kX2luX25pZF9saXN0KG5pZCwgc3BlYy0+bXVsdGlvdXQuZGFjX25pZHMsCi0JCQkJICAgICAgc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MpKQorCQkJCSAgICAgIEFSUkFZX1NJWkUoc3BlYy0+cHJpdmF0ZV9kYWNfbmlkcykpKQogCQkJY29udGludWU7CiAJCWlmIChmb3VuZF9pbl9uaWRfbGlzdChuaWQsIHNwZWMtPm11bHRpb3V0LmhwX291dF9uaWQsCiAJCQkJICAgICAgQVJSQVlfU0laRShzcGVjLT5tdWx0aW91dC5ocF9vdXRfbmlkKSkpCkBAIC0yOTIzLDYgKzI5MjcsNyBAQAogCXJldHVybiAwOwogfQogCisvKiByZXR1cm4gMCBpZiBubyBwb3NzaWJsZSBEQUMgaXMgZm91bmQsIDEgaWYgb25lIG9yIG1vcmUgZm91bmQgKi8KIHN0YXRpYyBpbnQgYWxjX2F1dG9fZmlsbF9leHRyYV9kYWNzKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLCBpbnQgbnVtX291dHMsCiAJCQkJICAgIGNvbnN0IGhkYV9uaWRfdCAqcGlucywgaGRhX25pZF90ICpkYWNzKQogewpAQCAtMjk0MCw3ICsyOTQ1LDcgQEAKIAkJaWYgKCFkYWNzW2ldKQogCQkJZGFjc1tpXSA9IGFsY19hdXRvX2xvb2tfZm9yX2RhYyhjb2RlYywgcGluc1tpXSk7CiAJfQotCXJldHVybiAwOworCXJldHVybiAxOwogfQogCiBzdGF0aWMgaW50IGFsY19hdXRvX2ZpbGxfbXVsdGlfaW9zKHN0cnVjdCBoZGFfY29kZWMgKmNvZGVjLApAQCAtMjk1MCw3ICsyOTU1LDcgQEAKIHN0YXRpYyBpbnQgYWxjX2F1dG9fZmlsbF9kYWNfbmlkcyhzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgYWxjX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKLQljb25zdCBzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKKwlzdHJ1Y3QgYXV0b19waW5fY2ZnICpjZmcgPSAmc3BlYy0+YXV0b2NmZzsKIAlib29sIHJlZG9uZSA9IGZhbHNlOwogCWludCBpOwogCkBAIC0yOTYxLDYgKzI5NjYsNyBAQAogCXNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWRbMF0gPSAwOwogCW1lbXNldChzcGVjLT5wcml2YXRlX2RhY19uaWRzLCAwLCBzaXplb2Yoc3BlYy0+cHJpdmF0ZV9kYWNfbmlkcykpOwogCXNwZWMtPm11bHRpb3V0LmRhY19uaWRzID0gc3BlYy0+cHJpdmF0ZV9kYWNfbmlkczsKKwlzcGVjLT5tdWx0aV9pb3MgPSAwOwogCiAJLyogZmlsbCBoYXJkLXdpcmVkIERBQ3MgZmlyc3QgKi8KIAlpZiAoIXJlZG9uZSkgewpAQCAtMjk5NCwxMCArMzAwMCwxMiBAQAogCWZvciAoaSA9IDA7IGkgPCBjZmctPmxpbmVfb3V0czsgaSsrKSB7CiAJCWlmIChzcGVjLT5wcml2YXRlX2RhY19uaWRzW2ldKQogCQkJc3BlYy0+bXVsdGlvdXQubnVtX2RhY3MrKzsKLQkJZWxzZQorCQllbHNlIHsKIAkJCW1lbW1vdmUoc3BlYy0+cHJpdmF0ZV9kYWNfbmlkcyArIGksCiAJCQkJc3BlYy0+cHJpdmF0ZV9kYWNfbmlkcyArIGkgKyAxLAogCQkJCXNpemVvZihoZGFfbmlkX3QpICogKGNmZy0+bGluZV9vdXRzIC0gaSAtIDEpKTsKKwkJCXNwZWMtPnByaXZhdGVfZGFjX25pZHNbY2ZnLT5saW5lX291dHMgLSAxXSA9IDA7CisJCX0KIAl9CiAKIAlpZiAoY2ZnLT5saW5lX291dHMgPT0gMSAmJiBjZmctPmxpbmVfb3V0X3R5cGUgIT0gQVVUT19QSU5fU1BFQUtFUl9PVVQpIHsKQEAgLTMwMTksOSArMzAyNywyOCBAQAogCWlmIChjZmctPmxpbmVfb3V0X3R5cGUgIT0gQVVUT19QSU5fSFBfT1VUKQogCQlhbGNfYXV0b19maWxsX2V4dHJhX2RhY3MoY29kZWMsIGNmZy0+aHBfb3V0cywgY2ZnLT5ocF9waW5zLAogCQkJCSBzcGVjLT5tdWx0aW91dC5ocF9vdXRfbmlkKTsKLQlpZiAoY2ZnLT5saW5lX291dF90eXBlICE9IEFVVE9fUElOX1NQRUFLRVJfT1VUKQotCQlhbGNfYXV0b19maWxsX2V4dHJhX2RhY3MoY29kZWMsIGNmZy0+c3BlYWtlcl9vdXRzLCBjZmctPnNwZWFrZXJfcGlucywKLQkJCQkgc3BlYy0+bXVsdGlvdXQuZXh0cmFfb3V0X25pZCk7CisJaWYgKGNmZy0+bGluZV9vdXRfdHlwZSAhPSBBVVRPX1BJTl9TUEVBS0VSX09VVCkgeworCQlpbnQgZXJyID0gYWxjX2F1dG9fZmlsbF9leHRyYV9kYWNzKGNvZGVjLCBjZmctPnNwZWFrZXJfb3V0cywKKwkJCQkJY2ZnLT5zcGVha2VyX3BpbnMsCisJCQkJCXNwZWMtPm11bHRpb3V0LmV4dHJhX291dF9uaWQpOworCQkvKiBpZiBubyBzcGVha2VyIHZvbHVtZSBpcyBhc3NpZ25lZCwgdHJ5IGFnYWluIGFzIHRoZSBwcmltYXJ5CisJCSAqIG91dHB1dAorCQkgKi8KKwkJaWYgKCFlcnIgJiYgY2ZnLT5zcGVha2VyX291dHMgPiAwICYmCisJCSAgICBjZmctPmxpbmVfb3V0X3R5cGUgPT0gQVVUT19QSU5fSFBfT1VUKSB7CisJCQljZmctPmhwX291dHMgPSBjZmctPmxpbmVfb3V0czsKKwkJCW1lbWNweShjZmctPmhwX3BpbnMsIGNmZy0+bGluZV9vdXRfcGlucywKKwkJCSAgICAgICBzaXplb2YoY2ZnLT5ocF9waW5zKSk7CisJCQljZmctPmxpbmVfb3V0cyA9IGNmZy0+c3BlYWtlcl9vdXRzOworCQkJbWVtY3B5KGNmZy0+bGluZV9vdXRfcGlucywgY2ZnLT5zcGVha2VyX3BpbnMsCisJCQkgICAgICAgc2l6ZW9mKGNmZy0+c3BlYWtlcl9waW5zKSk7CisJCQljZmctPnNwZWFrZXJfb3V0cyA9IDA7CisJCQltZW1zZXQoY2ZnLT5zcGVha2VyX3BpbnMsIDAsIHNpemVvZihjZmctPnNwZWFrZXJfcGlucykpOworCQkJY2ZnLT5saW5lX291dF90eXBlID0gQVVUT19QSU5fU1BFQUtFUl9PVVQ7CisJCQlyZWRvbmUgPSBmYWxzZTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMxNzEsNyArMzE5OCw4IEBACiB9CiAKIHN0YXRpYyBpbnQgYWxjX2F1dG9fY3JlYXRlX2V4dHJhX291dChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYywgaGRhX25pZF90IHBpbiwKLQkJCQkgICAgIGhkYV9uaWRfdCBkYWMsIGNvbnN0IGNoYXIgKnBmeCkKKwkJCQkgICAgIGhkYV9uaWRfdCBkYWMsIGNvbnN0IGNoYXIgKnBmeCwKKwkJCQkgICAgIGludCBjaWR4KQogewogCXN0cnVjdCBhbGNfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwogCWhkYV9uaWRfdCBzdywgdm9sOwpAQCAtMzE4NywxNSArMzIxNSwxNSBAQAogCQlpZiAoaXNfY3RsX3VzZWQoc3BlYy0+c3dfY3RscywgdmFsKSkKIAkJCXJldHVybiAwOyAvKiBhbHJlYWR5IGNyZWF0ZWQgKi8KIAkJbWFya19jdGxfdXNhZ2Uoc3BlYy0+c3dfY3RscywgdmFsKTsKLQkJcmV0dXJuIGFkZF9wYl9zd19jdHJsKHNwZWMsIEFMQ19DVExfV0lER0VUX01VVEUsIHBmeCwgdmFsKTsKKwkJcmV0dXJuIF9fYWRkX3BiX3N3X2N0cmwoc3BlYywgQUxDX0NUTF9XSURHRVRfTVVURSwgcGZ4LCBjaWR4LCB2YWwpOwogCX0KIAogCXN3ID0gYWxjX2xvb2tfZm9yX291dF9tdXRlX25pZChjb2RlYywgcGluLCBkYWMpOwogCXZvbCA9IGFsY19sb29rX2Zvcl9vdXRfdm9sX25pZChjb2RlYywgcGluLCBkYWMpOwotCWVyciA9IGFsY19hdXRvX2FkZF9zdGVyZW9fdm9sKGNvZGVjLCBwZngsIDAsIHZvbCk7CisJZXJyID0gYWxjX2F1dG9fYWRkX3N0ZXJlb192b2woY29kZWMsIHBmeCwgY2lkeCwgdm9sKTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQllcnIgPSBhbGNfYXV0b19hZGRfc3RlcmVvX3N3KGNvZGVjLCBwZngsIDAsIHN3KTsKKwllcnIgPSBhbGNfYXV0b19hZGRfc3RlcmVvX3N3KGNvZGVjLCBwZngsIGNpZHgsIHN3KTsKIAlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKIAlyZXR1cm4gMDsKQEAgLTMyMzYsMTYgKzMyNjQsMjEgQEAKIAkJaGRhX25pZF90IGRhYyA9ICpkYWNzOwogCQlpZiAoIWRhYykKIAkJCWRhYyA9IHNwZWMtPm11bHRpb3V0LmRhY19uaWRzWzBdOwotCQlyZXR1cm4gYWxjX2F1dG9fY3JlYXRlX2V4dHJhX291dChjb2RlYywgKnBpbnMsIGRhYywgcGZ4KTsKKwkJcmV0dXJuIGFsY19hdXRvX2NyZWF0ZV9leHRyYV9vdXQoY29kZWMsICpwaW5zLCBkYWMsIHBmeCwgMCk7CiAJfQogCiAJaWYgKGRhY3NbbnVtX3BpbnMgLSAxXSkgewogCQkvKiBPSywgd2UgaGF2ZSBhIG11bHRpLW91dHB1dCBzeXN0ZW0gd2l0aCBpbmRpdmlkdWFsIHZvbHVtZXMgKi8KIAkJZm9yIChpID0gMDsgaSA8IG51bV9waW5zOyBpKyspIHsKLQkJCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgIiVzICVzIiwKLQkJCQkgcGZ4LCBjaGFubmVsX25hbWVbaV0pOwotCQkJZXJyID0gYWxjX2F1dG9fY3JlYXRlX2V4dHJhX291dChjb2RlYywgcGluc1tpXSwgZGFjc1tpXSwKLQkJCQkJCQluYW1lKTsKKwkJCWlmIChudW1fcGlucyA+PSAzKSB7CisJCQkJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiJXMgJXMiLAorCQkJCQkgcGZ4LCBjaGFubmVsX25hbWVbaV0pOworCQkJCWVyciA9IGFsY19hdXRvX2NyZWF0ZV9leHRyYV9vdXQoY29kZWMsIHBpbnNbaV0sIGRhY3NbaV0sCisJCQkJCQkJCW5hbWUsIDApOworCQkJfSBlbHNlIHsKKwkJCQllcnIgPSBhbGNfYXV0b19jcmVhdGVfZXh0cmFfb3V0KGNvZGVjLCBwaW5zW2ldLCBkYWNzW2ldLAorCQkJCQkJCQlwZngsIGkpOworCQkJfQogCQkJaWYgKGVyciA8IDApCiAJCQkJcmV0dXJuIGVycjsKIAkJfQpkaWZmIC0tZ2l0IGEvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jIGIvc291bmQvcGNpL2hkYS9wYXRjaF9zaWdtYXRlbC5jCmluZGV4IGYzNjU4NjUuLjYxNjY3OGYgMTAwNjQ0Ci0tLSBhL3NvdW5kL3BjaS9oZGEvcGF0Y2hfc2lnbWF0ZWwuYworKysgYi9zb3VuZC9wY2kvaGRhL3BhdGNoX3NpZ21hdGVsLmMKQEAgLTIxNSw2ICsyMTUsNyBAQAogCXVuc2lnbmVkIGludCBncGlvX211dGU7CiAJdW5zaWduZWQgaW50IGdwaW9fbGVkOwogCXVuc2lnbmVkIGludCBncGlvX2xlZF9wb2xhcml0eTsKKwl1bnNpZ25lZCBpbnQgdnJlZl9tdXRlX2xlZF9uaWQ7IC8qIHBpbiBOSUQgZm9yIG11dGUtTEVEIHZyZWYgY29udHJvbCAqLwogCXVuc2lnbmVkIGludCB2cmVmX2xlZDsKIAogCS8qIHN0cmVhbSAqLwpAQCAtNDMxOCwxMiArNDMxOSwxMCBAQAogCQlzcGVjLT5lYXBkX3N3aXRjaCA9IHZhbDsKIAlnZXRfaW50X2hpbnQoY29kZWMsICJncGlvX2xlZF9wb2xhcml0eSIsICZzcGVjLT5ncGlvX2xlZF9wb2xhcml0eSk7CiAJaWYgKGdldF9pbnRfaGludChjb2RlYywgImdwaW9fbGVkIiwgJnNwZWMtPmdwaW9fbGVkKSkgewotCQlpZiAoc3BlYy0+Z3Bpb19sZWQgPD0gOCkgewotCQkJc3BlYy0+Z3Bpb19tYXNrIHw9IHNwZWMtPmdwaW9fbGVkOwotCQkJc3BlYy0+Z3Bpb19kaXIgfD0gc3BlYy0+Z3Bpb19sZWQ7Ci0JCQlpZiAoc3BlYy0+Z3Bpb19sZWRfcG9sYXJpdHkpCi0JCQkJc3BlYy0+Z3Bpb19kYXRhIHw9IHNwZWMtPmdwaW9fbGVkOwotCQl9CisJCXNwZWMtPmdwaW9fbWFzayB8PSBzcGVjLT5ncGlvX2xlZDsKKwkJc3BlYy0+Z3Bpb19kaXIgfD0gc3BlYy0+Z3Bpb19sZWQ7CisJCWlmIChzcGVjLT5ncGlvX2xlZF9wb2xhcml0eSkKKwkJCXNwZWMtPmdwaW9fZGF0YSB8PSBzcGVjLT5ncGlvX2xlZDsKIAl9CiB9CiAKQEAgLTQ0NDEsNyArNDQ0MCw5IEBACiAJCWludCBwaW5jdGwsIGRlZl9jb25mOwogCiAJCS8qIHBvd2VyIG9uIHdoZW4gbm8gamFjayBkZXRlY3Rpb24gaXMgYXZhaWxhYmxlICovCi0JCWlmICghc3BlYy0+aHBfZGV0ZWN0KSB7CisJCS8qIG9yIHdoZW4gdGhlIFZSRUYgaXMgdXNlZCBmb3IgY29udHJvbGxpbmcgTEVEICovCisJCWlmICghc3BlYy0+aHBfZGV0ZWN0IHx8CisJCSAgICBzcGVjLT52cmVmX211dGVfbGVkX25pZCA9PSBuaWQpIHsKIAkJCXN0YWNfdG9nZ2xlX3Bvd2VyX21hcChjb2RlYywgbmlkLCAxKTsKIAkJCWNvbnRpbnVlOwogCQl9CkBAIC00OTEzLDggKzQ5MTQsMTQgQEAKIAkJCWlmIChzc2NhbmYoZGV2LT5uYW1lLCAiSFBfTXV0ZV9MRURfJWRfJXgiLAogCQkJCSAgJnNwZWMtPmdwaW9fbGVkX3BvbGFyaXR5LAogCQkJCSAgJnNwZWMtPmdwaW9fbGVkKSA9PSAyKSB7Ci0JCQkJaWYgKHNwZWMtPmdwaW9fbGVkIDwgNCkKKwkJCQl1bnNpZ25lZCBpbnQgbWF4X2dwaW87CisJCQkJbWF4X2dwaW8gPSBzbmRfaGRhX3BhcmFtX3JlYWQoY29kZWMsIGNvZGVjLT5hZmcsCisJCQkJCQkJICAgICAgQUNfUEFSX0dQSU9fQ0FQKTsKKwkJCQltYXhfZ3BpbyAmPSBBQ19HUElPX0lPX0NPVU5UOworCQkJCWlmIChzcGVjLT5ncGlvX2xlZCA8IG1heF9ncGlvKQogCQkJCQlzcGVjLT5ncGlvX2xlZCA9IDEgPDwgc3BlYy0+Z3Bpb19sZWQ7CisJCQkJZWxzZQorCQkJCQlzcGVjLT52cmVmX211dGVfbGVkX25pZCA9IHNwZWMtPmdwaW9fbGVkOwogCQkJCXJldHVybiAxOwogCQkJfQogCQkJaWYgKHNzY2FuZihkZXYtPm5hbWUsICJIUF9NdXRlX0xFRF8lZCIsCkBAIC00OTIyLDYgKzQ5MjksMTIgQEAKIAkJCQlzZXRfaHBfbGVkX2dwaW8oY29kZWMpOwogCQkJCXJldHVybiAxOwogCQkJfQorCQkJLyogQklPUyBidWc6IHVuZmlsbGVkIE9FTSBzdHJpbmcgKi8KKwkJCWlmIChzdHJzdHIoZGV2LT5uYW1lLCAiSFBfTXV0ZV9MRURfUF9HIikpIHsKKwkJCQlzZXRfaHBfbGVkX2dwaW8oY29kZWMpOworCQkJCXNwZWMtPmdwaW9fbGVkX3BvbGFyaXR5ID0gMTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KIAkJfQogCiAJCS8qCkBAIC01MDQzLDI5ICs1MDU2LDEyIEBACiAJc3RydWN0IHNpZ21hdGVsX3NwZWMgKnNwZWMgPSBjb2RlYy0+c3BlYzsKIAogCS8qIHN5bmMgbXV0ZSBMRUQgKi8KLQlpZiAoc3BlYy0+Z3Bpb19sZWQpIHsKLQkJaWYgKHNwZWMtPmdwaW9fbGVkIDw9IDgpIHsKLQkJCXN0YWNfZ3Bpb19zZXQoY29kZWMsIHNwZWMtPmdwaW9fbWFzaywKLQkJCQkJc3BlYy0+Z3Bpb19kaXIsIHNwZWMtPmdwaW9fZGF0YSk7Ci0JCX0gZWxzZSB7Ci0JCQlzdGFjX3ZyZWZvdXRfc2V0KGNvZGVjLAotCQkJCQlzcGVjLT5ncGlvX2xlZCwgc3BlYy0+dnJlZl9sZWQpOwotCQl9Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHN0YWM5Mnh4X3Bvc3Rfc3VzcGVuZChzdHJ1Y3QgaGRhX2NvZGVjICpjb2RlYykKLXsKLQlzdHJ1Y3Qgc2lnbWF0ZWxfc3BlYyAqc3BlYyA9IGNvZGVjLT5zcGVjOwotCWlmIChzcGVjLT5ncGlvX2xlZCA+IDgpIHsKLQkJLyogd2l0aCB2cmVmLW91dCBwaW4gdXNlZCBmb3IgbXV0ZSBsZWQgY29udHJvbAotCQkgKiBjb2RlYyBBRkcgaXMgcHJldmVudGVkIGZyb20gRDMgc3RhdGUsIGJ1dCBvbgotCQkgKiBzeXN0ZW0gc3VzcGVuZCBpdCBjYW4gKGFuZCBzaG91bGQpIGJlIHVzZWQKLQkJICovCi0JCXNuZF9oZGFfY29kZWNfcmVhZChjb2RlYywgY29kZWMtPmFmZywgMCwKLQkJCQlBQ19WRVJCX1NFVF9QT1dFUl9TVEFURSwgQUNfUFdSU1RfRDMpOwotCX0KKwlpZiAoc3BlYy0+dnJlZl9tdXRlX2xlZF9uaWQpCisJCXN0YWNfdnJlZm91dF9zZXQoY29kZWMsIHNwZWMtPnZyZWZfbXV0ZV9sZWRfbmlkLAorCQkJCSBzcGVjLT52cmVmX2xlZCk7CisJZWxzZSBpZiAoc3BlYy0+Z3Bpb19sZWQpCisJCXN0YWNfZ3Bpb19zZXQoY29kZWMsIHNwZWMtPmdwaW9fbWFzaywKKwkJCSAgICAgIHNwZWMtPmdwaW9fZGlyLCBzcGVjLT5ncGlvX2RhdGEpOwogCXJldHVybiAwOwogfQogCkBAIC01MDc2LDcgKzUwNzIsNyBAQAogCXN0cnVjdCBzaWdtYXRlbF9zcGVjICpzcGVjID0gY29kZWMtPnNwZWM7CiAKIAlpZiAocG93ZXJfc3RhdGUgPT0gQUNfUFdSU1RfRDMpIHsKLQkJaWYgKHNwZWMtPmdwaW9fbGVkID4gOCkgeworCQlpZiAoc3BlYy0+dnJlZl9tdXRlX2xlZF9uaWQpIHsKIAkJCS8qIHdpdGggdnJlZi1vdXQgcGluIHVzZWQgZm9yIG11dGUgbGVkIGNvbnRyb2wKIAkJCSAqIGNvZGVjIEFGRyBpcyBwcmV2ZW50ZWQgZnJvbSBEMyBzdGF0ZQogCQkJICovCkBAIC01MTI5LDcgKzUxMjUsNyBAQAogCQl9CiAJfQogCS8qcG9sYXJpdHkgZGVmaW5lcyAqbm90KiBtdXRlZCBzdGF0ZSBsZXZlbCovCi0JaWYgKHNwZWMtPmdwaW9fbGVkIDw9IDgpIHsKKwlpZiAoIXNwZWMtPnZyZWZfbXV0ZV9sZWRfbmlkKSB7CiAJCWlmIChtdXRlZCkKIAkJCXNwZWMtPmdwaW9fZGF0YSAmPSB+c3BlYy0+Z3Bpb19sZWQ7IC8qIG9yYW5nZSAqLwogCQllbHNlCkBAIC01MTQ3LDcgKzUxNDMsOCBAQAogCQltdXRlZF9sdmwgPSBzcGVjLT5ncGlvX2xlZF9wb2xhcml0eSA/CiAJCQkJQUNfUElOQ1RMX1ZSRUZfR1JEIDogQUNfUElOQ1RMX1ZSRUZfSElaOwogCQlzcGVjLT52cmVmX2xlZCA9IG11dGVkID8gbXV0ZWRfbHZsIDogbm90bXRkX2x2bDsKLQkJc3RhY192cmVmb3V0X3NldChjb2RlYywJc3BlYy0+Z3Bpb19sZWQsIHNwZWMtPnZyZWZfbGVkKTsKKwkJc3RhY192cmVmb3V0X3NldChjb2RlYywJc3BlYy0+dnJlZl9tdXRlX2xlZF9uaWQsCisJCQkJIHNwZWMtPnZyZWZfbGVkKTsKIAl9CiAJcmV0dXJuIDA7CiB9CkBAIC01NjYxLDE1ICs1NjU4LDEzIEBACiAKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCiAJaWYgKHNwZWMtPmdwaW9fbGVkKSB7Ci0JCWlmIChzcGVjLT5ncGlvX2xlZCA8PSA4KSB7CisJCWlmICghc3BlYy0+dnJlZl9tdXRlX2xlZF9uaWQpIHsKIAkJCXNwZWMtPmdwaW9fbWFzayB8PSBzcGVjLT5ncGlvX2xlZDsKIAkJCXNwZWMtPmdwaW9fZGlyIHw9IHNwZWMtPmdwaW9fbGVkOwogCQkJc3BlYy0+Z3Bpb19kYXRhIHw9IHNwZWMtPmdwaW9fbGVkOwogCQl9IGVsc2UgewogCQkJY29kZWMtPnBhdGNoX29wcy5zZXRfcG93ZXJfc3RhdGUgPQogCQkJCQlzdGFjOTJ4eF9zZXRfcG93ZXJfc3RhdGU7Ci0JCQljb2RlYy0+cGF0Y2hfb3BzLnBvc3Rfc3VzcGVuZCA9Ci0JCQkJCXN0YWM5Mnh4X3Bvc3Rfc3VzcGVuZDsKIAkJfQogCQljb2RlYy0+cGF0Y2hfb3BzLnByZV9yZXN1bWUgPSBzdGFjOTJ4eF9wcmVfcmVzdW1lOwogCQljb2RlYy0+cGF0Y2hfb3BzLmNoZWNrX3Bvd2VyX3N0YXR1cyA9CkBAIC01OTc2LDE1ICs1OTcxLDEzIEBACiAKICNpZmRlZiBDT05GSUdfU05EX0hEQV9QT1dFUl9TQVZFCiAJaWYgKHNwZWMtPmdwaW9fbGVkKSB7Ci0JCWlmIChzcGVjLT5ncGlvX2xlZCA8PSA4KSB7CisJCWlmICghc3BlYy0+dnJlZl9tdXRlX2xlZF9uaWQpIHsKIAkJCXNwZWMtPmdwaW9fbWFzayB8PSBzcGVjLT5ncGlvX2xlZDsKIAkJCXNwZWMtPmdwaW9fZGlyIHw9IHNwZWMtPmdwaW9fbGVkOwogCQkJc3BlYy0+Z3Bpb19kYXRhIHw9IHNwZWMtPmdwaW9fbGVkOwogCQl9IGVsc2UgewogCQkJY29kZWMtPnBhdGNoX29wcy5zZXRfcG93ZXJfc3RhdGUgPQogCQkJCQlzdGFjOTJ4eF9zZXRfcG93ZXJfc3RhdGU7Ci0JCQljb2RlYy0+cGF0Y2hfb3BzLnBvc3Rfc3VzcGVuZCA9Ci0JCQkJCXN0YWM5Mnh4X3Bvc3Rfc3VzcGVuZDsKIAkJfQogCQljb2RlYy0+cGF0Y2hfb3BzLnByZV9yZXN1bWUgPSBzdGFjOTJ4eF9wcmVfcmVzdW1lOwogCQljb2RlYy0+cGF0Y2hfb3BzLmNoZWNrX3Bvd2VyX3N0YXR1cyA9CmRpZmYgLS1naXQgYS9zb3VuZC9wY2kvc2lzNzAxOS5jIGIvc291bmQvcGNpL3NpczcwMTkuYwppbmRleCBhMzkxZTYyLi4yOGRmYWZiIDEwMDY0NAotLS0gYS9zb3VuZC9wY2kvc2lzNzAxOS5jCisrKyBiL3NvdW5kL3BjaS9zaXM3MDE5LmMKQEAgLTQxLDYgKzQxLDcgQEAKIHN0YXRpYyBpbnQgaW5kZXggPSBTTkRSVl9ERUZBVUxUX0lEWDE7CS8qIEluZGV4IDAtTUFYICovCiBzdGF0aWMgY2hhciAqaWQgPSBTTkRSVl9ERUZBVUxUX1NUUjE7CS8qIElEIGZvciB0aGlzIGNhcmQgKi8KIHN0YXRpYyBpbnQgZW5hYmxlID0gMTsKK3N0YXRpYyBpbnQgY29kZWNzID0gMTsKIAogbW9kdWxlX3BhcmFtKGluZGV4LCBpbnQsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhpbmRleCwgIkluZGV4IHZhbHVlIGZvciBTaVM3MDE5IEF1ZGlvIEFjY2VsZXJhdG9yLiIpOwpAQCAtNDgsNiArNDksOCBAQAogTU9EVUxFX1BBUk1fREVTQyhpZCwgIklEIHN0cmluZyBmb3IgU2lTNzAxOSBBdWRpbyBBY2NlbGVyYXRvci4iKTsKIG1vZHVsZV9wYXJhbShlbmFibGUsIGJvb2wsIDA0NDQpOwogTU9EVUxFX1BBUk1fREVTQyhlbmFibGUsICJFbmFibGUgU2lTNzAxOSBBdWRpbyBBY2NlbGVyYXRvci4iKTsKK21vZHVsZV9wYXJhbShjb2RlY3MsIGludCwgMDQ0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGNvZGVjcywgIlNldCBiaXQgdG8gaW5kaWNhdGUgdGhhdCBjb2RlYyBudW1iZXIgaXMgZXhwZWN0ZWQgdG8gYmUgcHJlc2VudCAoZGVmYXVsdCAxKSIpOwogCiBzdGF0aWMgREVGSU5FX1BDSV9ERVZJQ0VfVEFCTEUoc25kX3NpczcwMTlfaWRzKSA9IHsKIAl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9TSSwgMHg3MDE5KSB9LApAQCAtMTQwLDYgKzE0Myw5IEBACiAJZG1hX2FkZHJfdCBzaWxlbmNlX2RtYV9hZGRyOwogfTsKIAorLyogVGhlc2UgdmFsdWVzIGFyZSBhbHNvIHVzZWQgYnkgdGhlIG1vZHVsZSBwYXJhbSAnY29kZWNzJyB0byBpbmRpY2F0ZQorICogd2hpY2ggY29kZWNzIHNob3VsZCBiZSBwcmVzZW50LgorICovCiAjZGVmaW5lIFNJU19QUklNQVJZX0NPREVDX1BSRVNFTlQJMHgwMDAxCiAjZGVmaW5lIFNJU19TRUNPTkRBUllfQ09ERUNfUFJFU0VOVAkweDAwMDIKICNkZWZpbmUgU0lTX1RFUlRJQVJZX0NPREVDX1BSRVNFTlQJMHgwMDA0CkBAIC0xMDc4LDYgKzEwODQsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgaW8gPSBzaXMtPmlvcG9ydDsKIAl2b2lkIF9faW9tZW0gKmlvYWRkciA9IHNpcy0+aW9hZGRyOworCXVuc2lnbmVkIGxvbmcgdGltZW91dDsKIAl1MTYgc3RhdHVzOwogCWludCBjb3VudDsKIAlpbnQgaTsKQEAgLTExMDQsMjIgKzExMTEsNDYgQEAKIAl3aGlsZSAoKGludyhpbyArIFNJU19BQzk3X1NUQVRVUykgJiBTSVNfQUM5N19TVEFUVVNfQlVTWSkgJiYgLS1jb3VudCkKIAkJdWRlbGF5KDEpOwogCi0JLyogTm93IHRoYXQgd2UndmUgZmluaXNoZWQgdGhlIHJlc2V0LCBmaW5kIG91dCB3aGF0J3MgYXR0YWNoZWQuCi0JICovCi0Jc3RhdHVzID0gaW5sKGlvICsgU0lTX0FDOTdfU1RBVFVTKTsKLQlpZiAoc3RhdHVzICYgU0lTX0FDOTdfU1RBVFVTX0NPREVDX1JFQURZKQotCQlzaXMtPmNvZGVjc19wcmVzZW50IHw9IFNJU19QUklNQVJZX0NPREVDX1BSRVNFTlQ7Ci0JaWYgKHN0YXR1cyAmIFNJU19BQzk3X1NUQVRVU19DT0RFQzJfUkVBRFkpCi0JCXNpcy0+Y29kZWNzX3ByZXNlbnQgfD0gU0lTX1NFQ09OREFSWV9DT0RFQ19QUkVTRU5UOwotCWlmIChzdGF0dXMgJiBTSVNfQUM5N19TVEFUVVNfQ09ERUMzX1JFQURZKQotCQlzaXMtPmNvZGVjc19wcmVzZW50IHw9IFNJU19URVJUSUFSWV9DT0RFQ19QUkVTRU5UOwotCi0JLyogQWxsIGRvbmUsIGxldCBnbyBvZiB0aGUgc2VtYXBob3JlLCBhbmQgY2hlY2sgZm9yIGVycm9ycworCS8qIENvbW1hbmQgY29tcGxldGUsIHdlIGNhbiBsZXQgZ28gb2YgdGhlIHNlbWFwaG9yZSBub3cuCiAJICovCiAJb3V0bChTSVNfQUM5N19TRU1BX1JFTEVBU0UsIGlvICsgU0lTX0FDOTdfU0VNQSk7Ci0JaWYgKCFzaXMtPmNvZGVjc19wcmVzZW50IHx8ICFjb3VudCkKKwlpZiAoIWNvdW50KQogCQlyZXR1cm4gLUVJTzsKIAorCS8qIE5vdyB0aGF0IHdlJ3ZlIGZpbmlzaGVkIHRoZSByZXNldCwgZmluZCBvdXQgd2hhdCdzIGF0dGFjaGVkLgorCSAqIFRoZXJlIGFyZSBzb21lIGNvZGVjL2JvYXJkIGNvbWJpbmF0aW9ucyB0aGF0IHRha2UgYW4gZXh0cmVtZWx5CisJICogbG9uZyB0aW1lIHRvIGNvbWUgdXAuIDM1MCsgbXMgaGFzIGJlZW4gb2JzZXJ2ZWQgaW4gdGhlIGZpZWxkLAorCSAqIHNvIHdlJ2xsIGdpdmUgdGhlbSB1cCB0byA1MDBtcy4KKwkgKi8KKwlzaXMtPmNvZGVjc19wcmVzZW50ID0gMDsKKwl0aW1lb3V0ID0gbXNlY3NfdG9famlmZmllcyg1MDApICsgamlmZmllczsKKwl3aGlsZSAodGltZV9iZWZvcmVfZXEoamlmZmllcywgdGltZW91dCkpIHsKKwkJc3RhdHVzID0gaW5sKGlvICsgU0lTX0FDOTdfU1RBVFVTKTsKKwkJaWYgKHN0YXR1cyAmIFNJU19BQzk3X1NUQVRVU19DT0RFQ19SRUFEWSkKKwkJCXNpcy0+Y29kZWNzX3ByZXNlbnQgfD0gU0lTX1BSSU1BUllfQ09ERUNfUFJFU0VOVDsKKwkJaWYgKHN0YXR1cyAmIFNJU19BQzk3X1NUQVRVU19DT0RFQzJfUkVBRFkpCisJCQlzaXMtPmNvZGVjc19wcmVzZW50IHw9IFNJU19TRUNPTkRBUllfQ09ERUNfUFJFU0VOVDsKKwkJaWYgKHN0YXR1cyAmIFNJU19BQzk3X1NUQVRVU19DT0RFQzNfUkVBRFkpCisJCQlzaXMtPmNvZGVjc19wcmVzZW50IHw9IFNJU19URVJUSUFSWV9DT0RFQ19QUkVTRU5UOworCisJCWlmIChzaXMtPmNvZGVjc19wcmVzZW50ID09IGNvZGVjcykKKwkJCWJyZWFrOworCisJCW1zbGVlcCgxKTsKKwl9CisKKwkvKiBBbGwgZG9uZSwgY2hlY2sgZm9yIGVycm9ycy4KKwkgKi8KKwlpZiAoIXNpcy0+Y29kZWNzX3ByZXNlbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzaXM3MDE5OiBjb3VsZCBub3QgZmluZCBhbnkgY29kZWNzXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKHNpcy0+Y29kZWNzX3ByZXNlbnQgIT0gY29kZWNzKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNpczcwMTk6IG1pc3NpbmcgY29kZWNzLCBmb3VuZCAlMHgsIGV4cGVjdGVkICUweFxuIiwKKwkJICAgICAgIHNpcy0+Y29kZWNzX3ByZXNlbnQsIGNvZGVjcyk7CisJfQorCiAJLyogTGV0IHRoZSBoYXJkd2FyZSBrbm93IHRoYXQgdGhlIGF1ZGlvIGRyaXZlciBpcyBhbGl2ZSwKIAkgKiBhbmQgZW5hYmxlIFBDTSBzbG90cyBvbiB0aGUgQUMtbGluayBmb3IgTC9SIHBsYXliYWNrICgzICYgNCkgYW5kCiAJICogcmVjb3JkIGNoYW5uZWxzLiBXZSdyZSBnb2luZyB0byB3YW50IHRvIHVzZSBWYXJpYWJsZSBSYXRlIEF1ZGlvCkBAIC0xMzkwLDYgKzE0MjEsMTcgQEAKIAlpZiAoIWVuYWJsZSkKIAkJZ290byBlcnJvcl9vdXQ7CiAKKwkvKiBUaGUgdXNlciBjYW4gc3BlY2lmeSB3aGljaCBjb2RlY3Mgc2hvdWxkIGJlIHByZXNlbnQgc28gdGhhdCB3ZQorCSAqIGNhbiB3YWl0IGZvciB0aGVtIHRvIHNob3cgdXAgaWYgdGhleSBhcmUgc2xvdyB0byByZWNvdmVyIGZyb20KKwkgKiB0aGUgQUM5NyBjb2xkIHJlc2V0LiBXZSBkZWZhdWx0IHRvIGEgc2luZ2xlIGNvZGVjLCB0aGUgcHJpbWFyeS4KKwkgKgorCSAqIFdlIGFzc3VtZSB0aGF0IFNJU19QUklNQVJZXypfUFJFU0VOVCBtYXRjaGVzIGJpdHMgMC0yLgorCSAqLworCWNvZGVjcyAmPSBTSVNfUFJJTUFSWV9DT0RFQ19QUkVTRU5UIHwgU0lTX1NFQ09OREFSWV9DT0RFQ19QUkVTRU5UIHwKKwkJICBTSVNfVEVSVElBUllfQ09ERUNfUFJFU0VOVDsKKwlpZiAoIWNvZGVjcykKKwkJY29kZWNzID0gU0lTX1BSSU1BUllfQ09ERUNfUFJFU0VOVDsKKwogCXJjID0gc25kX2NhcmRfY3JlYXRlKGluZGV4LCBpZCwgVEhJU19NT0RVTEUsIHNpemVvZigqc2lzKSwgJmNhcmQpOwogCWlmIChyYyA8IDApCiAJCWdvdG8gZXJyb3Jfb3V0OwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL0tjb25maWcgYi9zb3VuZC9zb2MvYXRtZWwvS2NvbmZpZwppbmRleCBiZWUzYzk0Li5kMWZjYzgxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvYXRtZWwvS2NvbmZpZwpAQCAtMSw2ICsxLDYgQEAKIGNvbmZpZyBTTkRfQVRNRUxfU09DCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBmb3IgdGhlIEF0bWVsIFN5c3RlbS1vbi1DaGlwIgotCWRlcGVuZHMgb24gQVJDSF9BVDkxIHx8IEFWUjMyCisJZGVwZW5kcyBvbiBBUkNIX0FUOTEKIAloZWxwCiAJICBTYXkgWSBvciBNIGlmIHlvdSB3YW50IHRvIGFkZCBzdXBwb3J0IGZvciBjb2RlY3MgYXR0YWNoZWQgdG8KIAkgIHRoZSBBVE1FTCBTU0MgaW50ZXJmYWNlLiBZb3Ugd2lsbCBhbHNvIG5lZWQKQEAgLTI0LDI1ICsyNCw2IEBACiAJICBTYXkgWSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvIG9uIFdNODczMS1iYXNlZAogCSAgQVQ5MXNhbTlnMjAgZXZhbHVhdGlvbiBib2FyZC4KIAotY29uZmlnIFNORF9BVDMyX1NPQ19QTEFZUEFRCi0gICAgICAgIHRyaXN0YXRlICJTb0MgQXVkaW8gc3VwcG9ydCBmb3IgUGxheVBhcSB3aXRoIFdNODUxMCIKLSAgICAgICAgZGVwZW5kcyBvbiBTTkRfQVRNRUxfU09DICYmIEJPQVJEX1BMQVlQQVEgJiYgQVQ5MV9QUk9HUkFNTUFCTEVfQ0xPQ0tTCi0gICAgICAgIHNlbGVjdCBTTkRfQVRNRUxfU09DX1NTQwotICAgICAgICBzZWxlY3QgU05EX1NPQ19XTTg1MTAKLSAgICAgICAgaGVscAotICAgICAgICAgIFNheSBZIG9yIE0gaGVyZSBpZiB5b3Ugd2FudCB0byBhZGQgc3VwcG9ydCBmb3IgU29DIGF1ZGlvCi0gICAgICAgICAgb24gdGhlIExSUyBQbGF5UGFxLgotCi1jb25maWcgU05EX0FUMzJfU09DX1BMQVlQQVFfU0xBVkUKLSAgICAgICAgYm9vbCAiUnVuIENPREVDIG9uIFBsYXlQYXEgaW4gc2xhdmUgbW9kZSIKLSAgICAgICAgZGVwZW5kcyBvbiBTTkRfQVQzMl9TT0NfUExBWVBBUQotICAgICAgICBkZWZhdWx0IG4KLSAgICAgICAgaGVscAotICAgICAgICAgIFNheSBZIGlmIHlvdSB3YW50IHRvIHJ1biB3aXRoIHRoZSBBVDMyIFNTQyBnZW5lcmF0aW5nIHRoZSBCQ0xLCi0gICAgICAgICAgYW5kIEZSQU1FIHNpZ25hbHMgb24gdGhlIFBsYXlQYXEuICBVbmxlc3MgeW91IHdhbnQgdG8gcGxheQotICAgICAgICAgIHdpdGggdGhlIEFUMzIgYXMgdGhlIFNTQyBtYXN0ZXIsIHlvdSBwcm9iYWJseSB3YW50IHRvIHNheSBOIGhlcmUsCi0gICAgICAgICAgYXMgdGhpcyB3aWxsIGdpdmUgeW91IGJldHRlciBzb3VuZCBxdWFsaXR5LgotCiBjb25maWcgU05EX0FUOTFfU09DX0FGRUI5MjYwCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBBRkVCOTI2MCBib2FyZCIKIAlkZXBlbmRzIG9uIEFSQ0hfQVQ5MSAmJiBNQUNIX0FGRUI5MjYwICYmIFNORF9BVE1FTF9TT0MKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9hdG1lbC9NYWtlZmlsZSBiL3NvdW5kL3NvYy9hdG1lbC9NYWtlZmlsZQppbmRleCBlN2VhNTZiLi5hNWMwYmYxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvTWFrZWZpbGUKKysrIGIvc291bmQvc29jL2F0bWVsL01ha2VmaWxlCkBAIC04LDkgKzgsNSBAQAogIyBBVDkxIE1hY2hpbmUgU3VwcG9ydAogc25kLXNvYy1zYW05ZzIwLXdtODczMS1vYmpzIDo9IHNhbTlnMjBfd204NzMxLm8KIAotIyBBVDMyIE1hY2hpbmUgU3VwcG9ydAotc25kLXNvYy1wbGF5cGFxLW9ianMgOj0gcGxheXBhcV93bTg1MTAubwotCiBvYmotJChDT05GSUdfU05EX0FUOTFfU09DX1NBTTlHMjBfV004NzMxKSArPSBzbmQtc29jLXNhbTlnMjAtd204NzMxLm8KLW9iai0kKENPTkZJR19TTkRfQVQzMl9TT0NfUExBWVBBUSkgKz0gc25kLXNvYy1wbGF5cGFxLm8KIG9iai0kKENPTkZJR19TTkRfQVQ5MV9TT0NfQUZFQjkyNjApICs9IHNuZC1zb2MtYWZlYjkyNjAubwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2F0bWVsL3BsYXlwYXFfd204NTEwLmMgYi9zb3VuZC9zb2MvYXRtZWwvcGxheXBhcV93bTg1MTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNhZTk5YS4uMDAwMDAwMAotLS0gYS9zb3VuZC9zb2MvYXRtZWwvcGxheXBhcV93bTg1MTAuYworKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi0vKiBzb3VuZC9zb2MvYXQzMi9wbGF5cGFxX3dtODUxMC5jCi0gKiBBU29DIG1hY2hpbmUgZHJpdmVyIGZvciBQbGF5UGFxIHVzaW5nIFdNODUxMCBjb2RlYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBMb25nIFJhbmdlIFN5c3RlbXMKLSAqICAgIEdlb2ZmcmV5IFdvc3N1bSA8Z3dvc3N1bUBhY20ub3JnPgotICoKLSAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Ci0gKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcwotICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVGhpcyBjb2RlIGlzIGxhcmdlbHkgaW5zcGlyZWQgYnkgc291bmQvc29jL2F0OTEvZXRpX2IxX3dtODczMS5jCi0gKgotICogTk9URTogSWYgeW91IGRvbid0IGhhdmUgdGhlIEFUMzIgZW5oYW5jZWQgcG9ydG11eCBjb25maWd1cmVkICh3aGljaAotICogaXNuJ3QgY3VycmVudGx5IGluIHRoZSBtYWlubGluZSBvciBBdG1lbCBwYXRjaGVkIGtlcm5lbCksIHlvdSB3aWxsCi0gKiBuZWVkIHRvIHNldCB0aGUgTUNMSyBwaW4gKFBBMzApIHRvIHBlcmlwaGVyYWwgQSBpbiB5b3VyIGJvYXJkIGluaXRpYWxpemF0aW9uCi0gKiBjb2RlLiAgU29tZXRoaW5nIGxpa2U6Ci0gKglhdDMyX3NlbGVjdF9wZXJpcGgoR1BJT19QSU5fUEEoMzApLCBHUElPX1BFUklQSF9BLCAwKTsKLSAqCi0gKi8KLQotLyogI2RlZmluZSBERUJVRyAqLwotCi0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgotI2luY2x1ZGUgPGxpbnV4L3RpbWVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0KLSNpbmNsdWRlIDxzb3VuZC9jb3JlLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtLmg+Ci0jaW5jbHVkZSA8c291bmQvcGNtX3BhcmFtcy5oPgotI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgotCi0jaW5jbHVkZSA8bWFjaC9hdDMyYXA3MDB4Lmg+Ci0jaW5jbHVkZSA8bWFjaC9wb3J0bXV4Lmg+Ci0KLSNpbmNsdWRlICIuLi9jb2RlY3Mvd204NTEwLmgiCi0jaW5jbHVkZSAiYXRtZWwtcGNtLmgiCi0jaW5jbHVkZSAiYXRtZWxfc3NjX2RhaS5oIgotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCi0gKiBjb25zdGFudHMKLVwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jZGVmaW5lIE1DTEtfUElOCQlHUElPX1BJTl9QQSgzMCkKLSNkZWZpbmUgTUNMS19QRVJJUEgJCUdQSU9fUEVSSVBIX0EKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAotICogZGF0YSB0eXBlcwotXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIFNTQyBjbG9ja2luZyBkYXRhICovCi1zdHJ1Y3Qgc3NjX2Nsb2NrX2RhdGEgewotCS8qIENNUiBkaXYgKi8KLQl1bnNpZ25lZCBpbnQgY21yX2RpdjsKLQotCS8qIEZyYW1lIHBlcmlvZCAoYXMgbmVlZGVkIGJ5IHhDTVIuUEVSSU9EKSAqLwotCXVuc2lnbmVkIGludCBwZXJpb2Q7Ci0KLQkvKiBUaGUgU1NDIGNsb2NrIHJhdGUgdGhlc2Ugc2V0dGluZ3Mgd2hlcmUgY2FsY3VsYXRlZCBmb3IgKi8KLQl1bnNpZ25lZCBsb25nIHNzY19yYXRlOwotfTsKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qXAotICogbW9kdWxlIGRhdGEKLVwqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1zdGF0aWMgc3RydWN0IGNsayAqX2djbGswOwotc3RhdGljIHN0cnVjdCBjbGsgKl9wbGwwOwotCi0jZGVmaW5lIENPREVDX0NMSyAoX2djbGswKQotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSpcCi0gKiBTb3VuZCBTT0Mgb3BlcmF0aW9ucwotXCotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZiBkZWZpbmVkIENPTkZJR19TTkRfQVQzMl9TT0NfUExBWVBBUV9TTEFWRQotc3RhdGljIHN0cnVjdCBzc2NfY2xvY2tfZGF0YSBwbGF5cGFxX3dtODUxMF9jYWxjX3NzY19jbG9jaygKLQlzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcywKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkpCi17Ci0Jc3RydWN0IGF0MzJfc3NjX2luZm8gKnNzY19wID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7Ci0Jc3RydWN0IHNzY19kZXZpY2UgKnNzYyA9IHNzY19wLT5zc2M7Ci0Jc3RydWN0IHNzY19jbG9ja19kYXRhIGNkOwotCXVuc2lnbmVkIGludCByYXRlLCB3aWR0aF9iaXRzLCBjaGFubmVsczsKLQl1bnNpZ25lZCBpbnQgYml0cmF0ZSwgc3NjX2RpdjsKLQl1bnNpZ25lZCBhY3R1YWxfcmF0ZTsKLQotCi0JLyoKLQkgKiBGaWd1cmUgb3V0IHJlcXVpcmVkIGJpdHJhdGUKLQkgKi8KLQlyYXRlID0gcGFyYW1zX3JhdGUocGFyYW1zKTsKLQljaGFubmVscyA9IHBhcmFtc19jaGFubmVscyhwYXJhbXMpOwotCXdpZHRoX2JpdHMgPSBzbmRfcGNtX2Zvcm1hdF9waHlzaWNhbF93aWR0aChwYXJhbXNfZm9ybWF0KHBhcmFtcykpOwotCWJpdHJhdGUgPSByYXRlICogd2lkdGhfYml0cyAqIGNoYW5uZWxzOwotCi0KLQkvKgotCSAqIEZpZ3VyZSBvdXQgcmVxdWlyZWQgU1NDIGRpdmlkZXIgYW5kIHBlcmlvZCBmb3IgcmVxdWlyZWQgYml0cmF0ZQotCSAqLwotCWNkLnNzY19yYXRlID0gY2xrX2dldF9yYXRlKHNzYy0+Y2xrKTsKLQlzc2NfZGl2ID0gY2Quc3NjX3JhdGUgLyBiaXRyYXRlOwotCWNkLmNtcl9kaXYgPSBzc2NfZGl2IC8gMjsKLQlpZiAoc3NjX2RpdiAmIDEpIHsKLQkJLyogcm91bmQgY21yX2RpdiB1cCAqLwotCQljZC5jbXJfZGl2Kys7Ci0JfQotCWNkLnBlcmlvZCA9IHdpZHRoX2JpdHMgLSAxOwotCi0KLQkvKgotCSAqIEZpbmQgYWN0dWFsIHJhdGUsIGNvbXBhcmUgdG8gcmVxdWVzdGVkIHJhdGUKLQkgKi8KLQlhY3R1YWxfcmF0ZSA9IChjZC5zc2NfcmF0ZSAvIChjZC5jbXJfZGl2ICogMikpIC8gKDIgKiAoY2QucGVyaW9kICsgMSkpOwotCXByX2RlYnVnKCJwbGF5cGFxX3dtODUxMDogUmVxdWVzdCByYXRlID0gJXUsIGFjdHVhbCByYXRlID0gJXVcbiIsCi0JCSByYXRlLCBhY3R1YWxfcmF0ZSk7Ci0KLQotCXJldHVybiBjZDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfU05EX0FUMzJfU09DX1BMQVlQQVFfU0xBVkUgKi8KLQotCi0KLXN0YXRpYyBpbnQgcGxheXBhcV93bTg1MTBfaHdfcGFyYW1zKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtLAotCQkJCSAgICBzdHJ1Y3Qgc25kX3BjbV9od19wYXJhbXMgKnBhcmFtcykKLXsKLQlzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkID0gc3Vic3RyZWFtLT5wcml2YXRlX2RhdGE7Ci0Jc3RydWN0IHNuZF9zb2NfZGFpICpjb2RlY19kYWkgPSBydGQtPmNvZGVjX2RhaTsKLQlzdHJ1Y3Qgc25kX3NvY19kYWkgKmNwdV9kYWkgPSBydGQtPmNwdV9kYWk7Ci0Jc3RydWN0IGF0MzJfc3NjX2luZm8gKnNzY19wID0gc25kX3NvY19kYWlfZ2V0X2RydmRhdGEoY3B1X2RhaSk7Ci0Jc3RydWN0IHNzY19kZXZpY2UgKnNzYyA9IHNzY19wLT5zc2M7Ci0JdW5zaWduZWQgaW50IHBsbF9vdXQgPSAwLCBiY2xrID0gMCwgbWNsa19kaXYgPSAwOwotCWludCByZXQ7Ci0KLQotCS8qIER1ZSB0byBkaWZmaWN1bHRpZXMgd2l0aCBnZXR0aW5nIHRoZSBjb3JyZWN0IGNsb2NrcyBmcm9tIHRoZSBBVDMyJ3MKLQkgKiBQTEwwLCB3ZSdyZSBnb2luZyB0byBsZXQgdGhlIENPREVDIGJlIGluIGNoYXJnZSBvZiBhbGwgdGhlIGNsb2NrcwotCSAqLwotI2lmICFkZWZpbmVkIENPTkZJR19TTkRfQVQzMl9TT0NfUExBWVBBUV9TTEFWRQotCWNvbnN0IHVuc2lnbmVkIGludCBmbXQgPSAoU05EX1NPQ19EQUlGTVRfSTJTIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX05CX05GIHwKLQkJCQkgIFNORF9TT0NfREFJRk1UX0NCTV9DRk0pOwotI2Vsc2UKLQlzdHJ1Y3Qgc3NjX2Nsb2NrX2RhdGEgY2Q7Ci0JY29uc3QgdW5zaWduZWQgaW50IGZtdCA9IChTTkRfU09DX0RBSUZNVF9JMlMgfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfTkJfTkYgfAotCQkJCSAgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUyk7Ci0jZW5kaWYKLQotCWlmIChzc2MgPT0gTlVMTCkgewotCQlwcl93YXJuaW5nKCJwbGF5cGFxX3dtODUxMF9od19wYXJhbXM6IHNzYyBpcyBOVUxMIVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCi0JLyoKLQkgKiBGaWd1cmUgb3V0IFBMTCBhbmQgQkNMSyBkaXZpZGVycyBmb3IgV004NTEwCi0JICovCi0Jc3dpdGNoIChwYXJhbXNfcmF0ZShwYXJhbXMpKSB7Ci0JY2FzZSA0ODAwMDoKLQkJcGxsX291dCA9IDI0NTc2MDAwOwotCQltY2xrX2RpdiA9IFdNODUxMF9NQ0xLRElWXzI7Ci0JCWJjbGsgPSBXTTg1MTBfQkNMS0RJVl84OwotCQlicmVhazsKLQotCWNhc2UgNDQxMDA6Ci0JCXBsbF9vdXQgPSAyMjU3OTIwMDsKLQkJbWNsa19kaXYgPSBXTTg1MTBfTUNMS0RJVl8yOwotCQliY2xrID0gV004NTEwX0JDTEtESVZfODsKLQkJYnJlYWs7Ci0KLQljYXNlIDIyMDUwOgotCQlwbGxfb3V0ID0gMjI1NzkyMDA7Ci0JCW1jbGtfZGl2ID0gV004NTEwX01DTEtESVZfNDsKLQkJYmNsayA9IFdNODUxMF9CQ0xLRElWXzg7Ci0JCWJyZWFrOwotCi0JY2FzZSAxNjAwMDoKLQkJcGxsX291dCA9IDI0NTc2MDAwOwotCQltY2xrX2RpdiA9IFdNODUxMF9NQ0xLRElWXzY7Ci0JCWJjbGsgPSBXTTg1MTBfQkNMS0RJVl84OwotCQlicmVhazsKLQotCWNhc2UgMTEwMjU6Ci0JCXBsbF9vdXQgPSAyMjU3OTIwMDsKLQkJbWNsa19kaXYgPSBXTTg1MTBfTUNMS0RJVl84OwotCQliY2xrID0gV004NTEwX0JDTEtESVZfODsKLQkJYnJlYWs7Ci0KLQljYXNlIDgwMDA6Ci0JCXBsbF9vdXQgPSAyNDU3NjAwMDsKLQkJbWNsa19kaXYgPSBXTTg1MTBfTUNMS0RJVl8xMjsKLQkJYmNsayA9IFdNODUxMF9CQ0xLRElWXzg7Ci0JCWJyZWFrOwotCi0JZGVmYXVsdDoKLQkJcHJfd2FybmluZygicGxheXBhcV93bTg1MTA6IFVuc3VwcG9ydGVkIHNhbXBsZSByYXRlICVkXG4iLAotCQkJICAgcGFyYW1zX3JhdGUocGFyYW1zKSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCi0JLyoKLQkgKiBzZXQgQ1BVIGFuZCBDT0RFQyBEQUkgY29uZmlndXJhdGlvbgotCSAqLwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9mbXQoY29kZWNfZGFpLCBmbXQpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX3dhcm5pbmcoInBsYXlwYXFfd204NTEwOiAiCi0JCQkgICAiRmFpbGVkIHRvIHNldCBDT0RFQyBEQUkgZm9ybWF0ICglZClcbiIsCi0JCQkgICByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfZm10KGNwdV9kYWksIGZtdCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfd2FybmluZygicGxheXBhcV93bTg1MTA6ICIKLQkJCSAgICJGYWlsZWQgdG8gc2V0IENQVSBEQUkgZm9ybWF0ICglZClcbiIsCi0JCQkgICByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCi0JLyoKLQkgKiBTZXQgQ1BVIGNsb2NrIGNvbmZpZ3VyYXRpb24KLQkgKi8KLSNpZiBkZWZpbmVkIENPTkZJR19TTkRfQVQzMl9TT0NfUExBWVBBUV9TTEFWRQotCWNkID0gcGxheXBhcV93bTg1MTBfY2FsY19zc2NfY2xvY2socGFyYW1zLCBjcHVfZGFpKTsKLQlwcl9kZWJ1ZygicGxheXBhcV93bTg1MTA6IGNtcl9kaXYgPSAlZCwgcGVyaW9kID0gJWRcbiIsCi0JCSBjZC5jbXJfZGl2LCBjZC5wZXJpb2QpOwotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jbGtkaXYoY3B1X2RhaSwgQVQzMl9TU0NfQ01SX0RJViwgY2QuY21yX2Rpdik7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfd2FybmluZygicGxheXBhcV93bTg1MTA6IEZhaWxlZCB0byBzZXQgQ1BVIENNUl9ESVYgKCVkKVxuIiwKLQkJCSAgIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jbGtkaXYoY3B1X2RhaSwgQVQzMl9TU0NfVENNUl9QRVJJT0QsCi0JCQkJCSAgY2QucGVyaW9kKTsKLQlpZiAocmV0IDwgMCkgewotCQlwcl93YXJuaW5nKCJwbGF5cGFxX3dtODUxMDogIgotCQkJICAgIkZhaWxlZCB0byBzZXQgQ1BVIHRyYW5zbWl0IHBlcmlvZCAoJWQpXG4iLAotCQkJICAgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0jZW5kaWYgLyogQ09ORklHX1NORF9BVDMyX1NPQ19QTEFZUEFRX1NMQVZFICovCi0KLQotCS8qCi0JICogU2V0IENPREVDIGNsb2NrIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcl9kZWJ1ZygicGxheXBhcV93bTg1MTA6ICIKLQkJICJwbGxfaW4gPSAlbGQsIHBsbF9vdXQgPSAldSwgYmNsayA9ICV4LCBtY2xrID0gJXhcbiIsCi0JCSBjbGtfZ2V0X3JhdGUoQ09ERUNfQ0xLKSwgcGxsX291dCwgYmNsaywgbWNsa19kaXYpOwotCi0KLSNpZiAhZGVmaW5lZCBDT05GSUdfU05EX0FUMzJfU09DX1BMQVlQQVFfU0xBVkUKLQlyZXQgPSBzbmRfc29jX2RhaV9zZXRfY2xrZGl2KGNvZGVjX2RhaSwgV004NTEwX0JDTEtESVYsIGJjbGspOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX3dhcm5pbmcKLQkJICAgICgicGxheXBhcV93bTg1MTA6IEZhaWxlZCB0byBzZXQgQ09ERUMgREFJIEJDTEtESVYgKCVkKVxuIiwKLQkJICAgICByZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLSNlbmRpZiAvKiBDT05GSUdfU05EX0FUMzJfU09DX1BMQVlQQVFfU0xBVkUgKi8KLQotCi0JcmV0ID0gc25kX3NvY19kYWlfc2V0X3BsbChjb2RlY19kYWksIDAsIDAsCi0JCQkJCSBjbGtfZ2V0X3JhdGUoQ09ERUNfQ0xLKSwgcGxsX291dCk7Ci0JaWYgKHJldCA8IDApIHsKLQkJcHJfd2FybmluZygicGxheXBhcV93bTg1MTA6IEZhaWxlZCB0byBzZXQgQ09ERUMgREFJIFBMTCAoJWQpXG4iLAotCQkJICAgcmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQotCXJldCA9IHNuZF9zb2NfZGFpX3NldF9jbGtkaXYoY29kZWNfZGFpLCBXTTg1MTBfTUNMS0RJViwgbWNsa19kaXYpOwotCWlmIChyZXQgPCAwKSB7Ci0JCXByX3dhcm5pbmcoInBsYXlwYXFfd204NTEwOiBGYWlsZWQgdG8gc2V0IENPREVDIE1DTEtESVYgKCVkKVxuIiwKLQkJCSAgIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0KLQlyZXR1cm4gMDsKLX0KLQotCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19vcHMgcGxheXBhcV93bTg1MTBfb3BzID0gewotCS5od19wYXJhbXMgPSBwbGF5cGFxX3dtODUxMF9od19wYXJhbXMsCi19OwotCi0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfc29jX2RhcG1fd2lkZ2V0IHBsYXlwYXFfZGFwbV93aWRnZXRzW10gPSB7Ci0JU05EX1NPQ19EQVBNX01JQygiSW50IE1pYyIsIE5VTEwpLAotCVNORF9TT0NfREFQTV9TUEsoIkV4dCBTcGsiLCBOVUxMKSwKLX07Ci0KLQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV9yb3V0ZSBpbnRlcmNvbltdID0gewotCS8qIHNwZWFrZXIgY29ubmVjdGVkIHRvIFNQS09VVCAqLwotCXsiRXh0IFNwayIsIE5VTEwsICJTUEtPVVRQIn0sCi0JeyJFeHQgU3BrIiwgTlVMTCwgIlNQS09VVE4ifSwKLQotCXsiTWljIEJpYXMiLCBOVUxMLCAiSW50IE1pYyJ9LAotCXsiTUlDTiIsIE5VTEwsICJNaWMgQmlhcyJ9LAotCXsiTUlDUCIsIE5VTEwsICJNaWMgQmlhcyJ9LAotfTsKLQotCi0KLXN0YXRpYyBpbnQgcGxheXBhcV93bTg1MTBfaW5pdChzdHJ1Y3Qgc25kX3NvY19wY21fcnVudGltZSAqcnRkKQotewotCXN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYyA9IHJ0ZC0+Y29kZWM7Ci0Jc3RydWN0IHNuZF9zb2NfZGFwbV9jb250ZXh0ICpkYXBtID0gJmNvZGVjLT5kYXBtOwotCWludCBpOwotCi0JLyoKLQkgKiBBZGQgREFQTSB3aWRnZXRzCi0JICovCi0JZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGxheXBhcV9kYXBtX3dpZGdldHMpOyBpKyspCi0JCXNuZF9zb2NfZGFwbV9uZXdfY29udHJvbChkYXBtLCAmcGxheXBhcV9kYXBtX3dpZGdldHNbaV0pOwotCi0KLQotCS8qCi0JICogU2V0dXAgYXVkaW8gcGF0aCBpbnRlcmNvbm5lY3RzCi0JICovCi0Jc25kX3NvY19kYXBtX2FkZF9yb3V0ZXMoZGFwbSwgaW50ZXJjb24sIEFSUkFZX1NJWkUoaW50ZXJjb24pKTsKLQotCi0KLQkvKiBhbHdheXMgY29ubmVjdGVkIHBpbnMgKi8KLQlzbmRfc29jX2RhcG1fZW5hYmxlX3BpbihkYXBtLCAiSW50IE1pYyIpOwotCXNuZF9zb2NfZGFwbV9lbmFibGVfcGluKGRhcG0sICJFeHQgU3BrIik7Ci0KLQotCi0JLyogTWFrZSBDU0Igc2hvdyBQTEwgcmF0ZSAqLwotCXNuZF9zb2NfZGFpX3NldF9jbGtkaXYocnRkLT5jb2RlY19kYWksIFdNODUxMF9PUENMS0RJViwKLQkJCQkgICAgICAgV004NTEwX09QQ0xLRElWXzEgfCA0KTsKLQotCXJldHVybiAwOwotfQotCi0KLQotc3RhdGljIHN0cnVjdCBzbmRfc29jX2RhaV9saW5rIHBsYXlwYXFfd204NTEwX2RhaSA9IHsKLQkubmFtZSA9ICJXTTg1MTAiLAotCS5zdHJlYW1fbmFtZSA9ICJXTTg1MTAgUENNIiwKLQkuY3B1X2RhaV9uYW1lPSAiYXRtZWwtc3NjLWRhaS4wIiwKLQkucGxhdGZvcm1fbmFtZSA9ICJhdG1lbC1wY20tYXVkaW8iLAotCS5jb2RlY19uYW1lID0gIndtODUxMC1jb2RlYy4wLTB4MWEiLAotCS5jb2RlY19kYWlfbmFtZSA9ICJ3bTg1MTAtaGlmaSIsCi0JLmluaXQgPSBwbGF5cGFxX3dtODUxMF9pbml0LAotCS5vcHMgPSAmcGxheXBhcV93bTg1MTBfb3BzLAotfTsKLQotCi0KLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19jYXJkIHNuZF9zb2NfcGxheXBhcSA9IHsKLQkubmFtZSA9ICJMUlNfUGxheVBhcV9XTTg1MTAiLAotCS5kYWlfbGluayA9ICZwbGF5cGFxX3dtODUxMF9kYWksCi0JLm51bV9saW5rcyA9IDEsCi19OwotCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGxheXBhcV9zbmRfZGV2aWNlOwotCi0KLXN0YXRpYyBpbnQgX19pbml0IHBsYXlwYXFfYXNvY19pbml0KHZvaWQpCi17Ci0JaW50IHJldCA9IDA7Ci0KLQkvKgotCSAqIENvbmZpZ3VyZSBNQ0xLIGZvciBXTTg1MTAKLQkgKi8KLQlfZ2NsazAgPSBjbGtfZ2V0KE5VTEwsICJnY2xrMCIpOwotCWlmIChJU19FUlIoX2djbGswKSkgewotCQlfZ2NsazAgPSBOVUxMOwotCQlyZXQgPSBQVFJfRVJSKF9nY2xrMCk7Ci0JCWdvdG8gZXJyX2djbGswOwotCX0KLQlfcGxsMCA9IGNsa19nZXQoTlVMTCwgInBsbDAiKTsKLQlpZiAoSVNfRVJSKF9wbGwwKSkgewotCQlfcGxsMCA9IE5VTEw7Ci0JCXJldCA9IFBUUl9FUlIoX3BsbDApOwotCQlnb3RvIGVycl9wbGwwOwotCX0KLQlyZXQgPSBjbGtfc2V0X3BhcmVudChfZ2NsazAsIF9wbGwwKTsKLQlpZiAocmV0KSB7Ci0JCXByX3dhcm5pbmcoInNuZC1zb2MtcGxheXBhcTogIgotCQkJICAgIkZhaWxlZCB0byBzZXQgUExMMCBhcyBwYXJlbnQgZm9yIERBQyBjbG9ja1xuIik7Ci0JCWdvdG8gZXJyX3NldF9jbGs7Ci0JfQotCWNsa19zZXRfcmF0ZShDT0RFQ19DTEssIDEyMDAwMDAwKTsKLQljbGtfZW5hYmxlKENPREVDX0NMSyk7Ci0KLSNpZiBkZWZpbmVkIENPTkZJR19BVDMyX0VOSEFOQ0VEX1BPUlRNVVgKLQlhdDMyX3NlbGVjdF9wZXJpcGgoTUNMS19QSU4sIE1DTEtfUEVSSVBILCAwKTsKLSNlbmRpZgotCi0KLQkvKgotCSAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgcGxhdGZvcm0gZGV2aWNlCi0JICovCi0JcGxheXBhcV9zbmRfZGV2aWNlID0gcGxhdGZvcm1fZGV2aWNlX2FsbG9jKCJzb2MtYXVkaW8iLCAwKTsKLQlpZiAocGxheXBhcV9zbmRfZGV2aWNlID09IE5VTEwpIHsKLQkJcmV0ID0gLUVOT01FTTsKLQkJZ290byBlcnJfZGV2aWNlX2FsbG9jOwotCX0KLQotCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBsYXlwYXFfc25kX2RldmljZSwgJnNuZF9zb2NfcGxheXBhcSk7Ci0KLQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBsYXlwYXFfc25kX2RldmljZSk7Ci0JaWYgKHJldCkgewotCQlwcl93YXJuaW5nKCJwbGF5cGFxX3dtODUxMDogcGxhdGZvcm1fZGV2aWNlX2FkZCBmYWlsZWQgKCVkKVxuIiwKLQkJCSAgIHJldCk7Ci0JCWdvdG8gZXJyX2RldmljZV9hZGQ7Ci0JfQotCi0JcmV0dXJuIDA7Ci0KLQotZXJyX2RldmljZV9hZGQ6Ci0JaWYgKHBsYXlwYXFfc25kX2RldmljZSAhPSBOVUxMKSB7Ci0JCXBsYXRmb3JtX2RldmljZV9wdXQocGxheXBhcV9zbmRfZGV2aWNlKTsKLQkJcGxheXBhcV9zbmRfZGV2aWNlID0gTlVMTDsKLQl9Ci1lcnJfZGV2aWNlX2FsbG9jOgotZXJyX3NldF9jbGs6Ci0JaWYgKF9wbGwwICE9IE5VTEwpIHsKLQkJY2xrX3B1dChfcGxsMCk7Ci0JCV9wbGwwID0gTlVMTDsKLQl9Ci1lcnJfcGxsMDoKLQlpZiAoX2djbGswICE9IE5VTEwpIHsKLQkJY2xrX3B1dChfZ2NsazApOwotCQlfZ2NsazAgPSBOVUxMOwotCX0KLQlyZXR1cm4gcmV0OwotfQotCi0KLXN0YXRpYyB2b2lkIF9fZXhpdCBwbGF5cGFxX2Fzb2NfZXhpdCh2b2lkKQotewotCWlmIChfZ2NsazAgIT0gTlVMTCkgewotCQljbGtfcHV0KF9nY2xrMCk7Ci0JCV9nY2xrMCA9IE5VTEw7Ci0JfQotCWlmIChfcGxsMCAhPSBOVUxMKSB7Ci0JCWNsa19wdXQoX3BsbDApOwotCQlfcGxsMCA9IE5VTEw7Ci0JfQotCi0jaWYgZGVmaW5lZCBDT05GSUdfQVQzMl9FTkhBTkNFRF9QT1JUTVVYCi0JYXQzMl9mcmVlX3BpbihNQ0xLX1BJTik7Ci0jZW5kaWYKLQotCXBsYXRmb3JtX2RldmljZV91bnJlZ2lzdGVyKHBsYXlwYXFfc25kX2RldmljZSk7Ci0JcGxheXBhcV9zbmRfZGV2aWNlID0gTlVMTDsKLX0KLQotbW9kdWxlX2luaXQocGxheXBhcV9hc29jX2luaXQpOwotbW9kdWxlX2V4aXQocGxheXBhcV9hc29jX2V4aXQpOwotCi1NT0RVTEVfQVVUSE9SKCJHZW9mZnJleSBXb3NzdW0gPGd3b3NzdW1AYWNtLm9yZz4iKTsKLU1PRFVMRV9ERVNDUklQVElPTigiQVNvQyBtYWNoaW5lIGRyaXZlciBmb3IgTFJTIFBsYXlQYXEiKTsKLU1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZyBiL3NvdW5kL3NvYy9jb2RlY3MvS2NvbmZpZwppbmRleCA0NTg0NTE0Li5mYTc4N2Q0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL0tjb25maWcKKysrIGIvc291bmQvc29jL2NvZGVjcy9LY29uZmlnCkBAIC0zMyw3ICszMyw3IEBACiAJc2VsZWN0IFNORF9TT0NfQ1gyMDQ0MgogCXNlbGVjdCBTTkRfU09DX0RBNzIxMCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19ERkJNQ1MzMjAKLQlzZWxlY3QgU05EX1NPQ19KWjQ3NDBfQ09ERUMgaWYgU09DX0paNDc0MAorCXNlbGVjdCBTTkRfU09DX0paNDc0MF9DT0RFQwogCXNlbGVjdCBTTkRfU09DX0xNNDg1NyBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19NQVg5ODA4OCBpZiBJMkMKIAlzZWxlY3QgU05EX1NPQ19NQVg5ODA5NSBpZiBJMkMKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmggYi9zb3VuZC9zb2MvY29kZWNzL2FkMTgzNi5oCmluZGV4IDQ0NDc0N2YuLmRkN2JlMGQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvYWQxODM2LmgKKysrIGIvc291bmQvc29jL2NvZGVjcy9hZDE4MzYuaApAQCAtMzQsNyArMzQsNyBAQAogCiAjZGVmaW5lIEFEMTgzNl9BRENfQ1RSTDIgICAgICAgICAgICAgICAxMwogI2RlZmluZSBBRDE4MzZfQURDX1dPUkRfTEVOX01BU0sgICAgICAgMHgzMAotI2RlZmluZSBBRDE4MzZfQURDX1dPUkRfT0ZGU0VUICAgICAgICAgNQorI2RlZmluZSBBRDE4MzZfQURDX1dPUkRfT0ZGU0VUICAgICAgICAgNAogI2RlZmluZSBBRDE4MzZfQURDX1NFUkZNVF9NQVNLICAgICAgICAgKDcgPDwgNikKICNkZWZpbmUgQUQxODM2X0FEQ19TRVJGTVRfUENLMjU2ICAgICAgICgweDQgPDwgNikKICNkZWZpbmUgQUQxODM2X0FEQ19TRVJGTVRfUENLMTI4ICAgICAgICgweDUgPDwgNikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMgYi9zb3VuZC9zb2MvY29kZWNzL2NzNDI3MC5jCmluZGV4IGYxZjIzN2UuLjczZjQ2ZWIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0MjcwLmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9jczQyNzAuYwpAQCAtNjAxLDcgKzYwMSw2IEBACiBzdGF0aWMgaW50IGNzNDI3MF9zb2NfcmVzdW1lKHN0cnVjdCBzbmRfc29jX2NvZGVjICpjb2RlYykKIHsKIAlzdHJ1Y3QgY3M0MjcwX3ByaXZhdGUgKmNzNDI3MCA9IHNuZF9zb2NfY29kZWNfZ2V0X2RydmRhdGEoY29kZWMpOwotCXN0cnVjdCBpMmNfY2xpZW50ICppMmNfY2xpZW50ID0gdG9faTJjX2NsaWVudChjb2RlYy0+ZGV2KTsKIAlpbnQgcmVnOwogCiAJcmVndWxhdG9yX2J1bGtfZW5hYmxlKEFSUkFZX1NJWkUoY3M0MjcwLT5zdXBwbGllcyksCkBAIC02MTIsMTQgKzYxMSw3IEBACiAJbmRlbGF5KDUwMCk7CiAKIAkvKiBmaXJzdCByZXN0b3JlIHRoZSBlbnRpcmUgcmVnaXN0ZXIgY2FjaGUgLi4uICovCi0JZm9yIChyZWcgPSBDUzQyNzBfRklSU1RSRUc7IHJlZyA8PSBDUzQyNzBfTEFTVFJFRzsgcmVnKyspIHsKLQkJdTggdmFsID0gc25kX3NvY19yZWFkKGNvZGVjLCByZWcpOwotCi0JCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGkyY19jbGllbnQsIHJlZywgdmFsKSkgewotCQkJZGV2X2Vycihjb2RlYy0+ZGV2LCAiaTJjIHdyaXRlIGZhaWxlZFxuIik7Ci0JCQlyZXR1cm4gLUVJTzsKLQkJfQotCX0KKwlzbmRfc29jX2NhY2hlX3N5bmMoY29kZWMpOwogCiAJLyogLi4uIHRoZW4gZGlzYWJsZSB0aGUgcG93ZXItZG93biBiaXRzICovCiAJcmVnID0gc25kX3NvY19yZWFkKGNvZGVjLCBDUzQyNzBfUFdSQ1RMKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jIGIvc291bmQvc29jL2NvZGVjcy9jczQybDUxLmMKaW5kZXggOGMzYzgyMC4uMWVlNjYzNjEgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3MvY3M0Mmw1MS5jCkBAIC01NTUsNyArNTU1LDcgQEAKIAogc3RhdGljIHN0cnVjdCBzbmRfc29jX2NvZGVjX2RyaXZlciBzb2NfY29kZWNfZGV2aWNlX2NzNDJsNTEgPSB7CiAJLnByb2JlID0JY3M0Mmw1MV9wcm9iZSwKLQkucmVnX2NhY2hlX3NpemUgPSBDUzQyTDUxX05VTVJFR1MsCisJLnJlZ19jYWNoZV9zaXplID0gQ1M0Mkw1MV9OVU1SRUdTICsgMSwKIAkucmVnX3dvcmRfc2l6ZSA9IHNpemVvZih1OCksCiB9OwogCmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL2p6NDc0MC5jIGIvc291bmQvc29jL2NvZGVjcy9qejQ3NDAuYwppbmRleCBlMzczZjhmLi4zZTFmNGUxIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL2p6NDc0MC5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvano0NzQwLmMKQEAgLTE1LDYgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3MvbWF4OTg3Ny5jIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODc3LmMKaW5kZXggOWU3ZTk2NC4uZGNmNmYyYSAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy9tYXg5ODc3LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy9tYXg5ODc3LmMKQEAgLTEwNiwxMyArMTA2LDEzIEBACiAJdW5zaWduZWQgaW50IG1hc2sgPSBtYy0+bWF4OwogCXVuc2lnbmVkIGludCB2YWwgPSAodWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF0gJiBtYXNrKTsKIAl1bnNpZ25lZCBpbnQgdmFsMiA9ICh1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVsxXSAmIG1hc2spOwotCXVuc2lnbmVkIGludCBjaGFuZ2UgPSAxOworCXVuc2lnbmVkIGludCBjaGFuZ2UgPSAwOwogCi0JaWYgKCgobWF4OTg3N19yZWdzW3JlZ10gPj4gc2hpZnQpICYgbWFzaykgPT0gdmFsKQotCQljaGFuZ2UgPSAwOworCWlmICgoKG1heDk4NzdfcmVnc1tyZWddID4+IHNoaWZ0KSAmIG1hc2spICE9IHZhbCkKKwkJY2hhbmdlID0gMTsKIAotCWlmICgoKG1heDk4NzdfcmVnc1tyZWcyXSA+PiBzaGlmdCkgJiBtYXNrKSA9PSB2YWwyKQotCQljaGFuZ2UgPSAwOworCWlmICgoKG1heDk4NzdfcmVnc1tyZWcyXSA+PiBzaGlmdCkgJiBtYXNrKSAhPSB2YWwyKQorCQljaGFuZ2UgPSAxOwogCiAJaWYgKGNoYW5nZSkgewogCQltYXg5ODc3X3JlZ3NbcmVnXSAmPSB+KG1hc2sgPDwgc2hpZnQpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy91ZGExMzgwLmMgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYwppbmRleCBjNWNhOGNmLi4wNDQxODkzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3VkYTEzODAuYwpAQCAtODYzLDEzICs4NjMsMTMgQEAKIAogc3RhdGljIGludCBfX2luaXQgdWRhMTM4MF9tb2Rpbml0KHZvaWQpCiB7Ci0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKICNpZiBkZWZpbmVkKENPTkZJR19JMkMpIHx8IGRlZmluZWQoQ09ORklHX0kyQ19NT0RVTEUpCiAJcmV0ID0gaTJjX2FkZF9kcml2ZXIoJnVkYTEzODBfaTJjX2RyaXZlcik7CiAJaWYgKHJldCAhPSAwKQogCQlwcl9lcnIoIkZhaWxlZCB0byByZWdpc3RlciBVREExMzgwIEkyQyBkcml2ZXI6ICVkXG4iLCByZXQpOwogI2VuZGlmCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIG1vZHVsZV9pbml0KHVkYTEzODBfbW9kaW5pdCk7CiAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMgYi9zb3VuZC9zb2MvY29kZWNzL3dtODc3Ni5jCmluZGV4IGJmZGM1MjMuLmQzYjBhMjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204Nzc2LmMKKysrIGIvc291bmQvc29jL2NvZGVjcy93bTg3NzYuYwpAQCAtMjM1LDYgKzIzNSw3IEBACiAJc3dpdGNoIChzbmRfcGNtX2Zvcm1hdF93aWR0aChwYXJhbXNfZm9ybWF0KHBhcmFtcykpKSB7CiAJY2FzZSAxNjoKIAkJaWZhY2UgPSAwOworCQlicmVhazsKIAljYXNlIDIwOgogCQlpZmFjZSA9IDB4MTA7CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5NTgtZHNwMi5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5NTgtZHNwMi5jCmluZGV4IDAyOTM3NjMuLjVhMTRkNWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9jb2RlY3Mvd204OTU4LWRzcDIuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk1OC1kc3AyLmMKQEAgLTYwLDYgKzYwLDggQEAKIAl9CiAKIAlpZiAobWVtY21wKGZ3LT5kYXRhLCAiV01GVyIsIDQpICE9IDApIHsKKwkJbWVtY3B5KCZkYXRhMzIsIGZ3LT5kYXRhLCBzaXplb2YoZGF0YTMyKSk7CisJCWRhdGEzMiA9IGJlMzJfdG9fY3B1KGRhdGEzMik7CiAJCWRldl9lcnIoY29kZWMtPmRldiwgIiVzOiBmaXJtd2FyZSBoYXMgYmFkIGZpbGUgbWFnaWMgJTA4eFxuIiwKIAkJCW5hbWUsIGRhdGEzMik7CiAJCWdvdG8gZXJyOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk0LmMKaW5kZXggOWM5ODJlNC4uZDBjNTQ1YiAxMDA2NDQKLS0tIGEvc291bmQvc29jL2NvZGVjcy93bTg5OTQuYworKysgYi9zb3VuZC9zb2MvY29kZWNzL3dtODk5NC5jCkBAIC0xMzI1LDE1ICsxMzI1LDE1IEBACiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204OTk0X2FkY19yZXZkX3dpZGdldHNbXSA9IHsKLVNORF9TT0NfREFQTV9NVVhfRSgiQURDTCBNdXgiLCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF80LCAxLCAwLCAmYWRjbF9tdXgsCi0JCSAgIGFkY19tdXhfZXYsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKLVNORF9TT0NfREFQTV9NVVhfRSgiQURDUiBNdXgiLCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF80LCAwLCAwLCAmYWRjcl9tdXgsCi0JCSAgIGFkY19tdXhfZXYsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKK1NORF9TT0NfREFQTV9WSVJUX01VWF9FKCJBRENMIE11eCIsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzQsIDEsIDAsICZhZGNsX211eCwKKwkJCWFkY19tdXhfZXYsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKK1NORF9TT0NfREFQTV9WSVJUX01VWF9FKCJBRENSIE11eCIsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzQsIDAsIDAsICZhZGNyX211eCwKKwkJCWFkY19tdXhfZXYsIFNORF9TT0NfREFQTV9QUkVfUE1VKSwKIH07CiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc25kX3NvY19kYXBtX3dpZGdldCB3bTg5OTRfYWRjX3dpZGdldHNbXSA9IHsKLVNORF9TT0NfREFQTV9NVVgoIkFEQ0wgTXV4IiwgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfNCwgMSwgMCwgJmFkY2xfbXV4KSwKLVNORF9TT0NfREFQTV9NVVgoIkFEQ1IgTXV4IiwgV004OTk0X1BPV0VSX01BTkFHRU1FTlRfNCwgMCwgMCwgJmFkY3JfbXV4KSwKK1NORF9TT0NfREFQTV9WSVJUX01VWCgiQURDTCBNdXgiLCBXTTg5OTRfUE9XRVJfTUFOQUdFTUVOVF80LCAxLCAwLCAmYWRjbF9tdXgpLAorU05EX1NPQ19EQVBNX1ZJUlRfTVVYKCJBRENSIE11eCIsIFdNODk5NF9QT1dFUl9NQU5BR0VNRU5UXzQsIDAsIDAsICZhZGNyX211eCksCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9zb2NfZGFwbV93aWRnZXQgd204OTk0X2RhcG1fd2lkZ2V0c1tdID0gewpAQCAtMjM1Nyw2ICsyMzU3LDExIEBACiAJYmNsayB8PSBiZXN0IDw8IFdNODk5NF9BSUYxX0JDTEtfRElWX1NISUZUOwogCiAJbHJjbGsgPSBiY2xrX3JhdGUgLyBwYXJhbXNfcmF0ZShwYXJhbXMpOworCWlmICghbHJjbGspIHsKKwkJZGV2X2VycihkYWktPmRldiwgIlVuYWJsZSB0byBnZW5lcmF0ZSBMUkNMSyBmcm9tICVkSHogQkNMS1xuIiwKKwkJCWJjbGtfcmF0ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KIAlkZXZfZGJnKGRhaS0+ZGV2LCAiVXNpbmcgTFJDTEsgcmF0ZSAlZCBmb3IgYWN0dWFsIExSQ0xLICVkSHpcbiIsCiAJCWxyY2xrLCBiY2xrX3JhdGUgLyBscmNsayk7CiAKQEAgLTMxNzgsNiArMzE4Myw4IEBACiAJCXN3aXRjaCAod204OTk0LT5yZXZpc2lvbikgewogCQljYXNlIDA6CiAJCWNhc2UgMToKKwkJY2FzZSAyOgorCQljYXNlIDM6CiAJCQl3bTg5OTQtPmh1YnMuZGNzX2NvZGVzX2wgPSAtOTsKIAkJCXdtODk5NC0+aHVicy5kY3NfY29kZXNfciA9IC01OwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jIGIvc291bmQvc29jL2NvZGVjcy93bTg5OTYuYwppbmRleCA2NDVjOTgwLi5hMzNiMDRkIDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvY29kZWNzL3dtODk5Ni5jCisrKyBiL3NvdW5kL3NvYy9jb2RlY3Mvd204OTk2LmMKQEAgLTE5NjgsNiArMTk2OCw3IEBACiAJCWJyZWFrOwogCWNhc2UgMjQ1NzYwMDA6CiAJCXJhdGVkaXYgPSBXTTg5OTZfU1lTQ0xLX0RJVjsKKwkJd204OTk2LT5zeXNjbGsgLz0gMjsKIAljYXNlIDEyMjg4MDAwOgogCQlzbmRfc29jX3VwZGF0ZV9iaXRzKGNvZGVjLCBXTTg5OTZfQUlGX1JBVEUsCiAJCQkJICAgIFdNODk5Nl9TWVNDTEtfUkFURSwgV004OTk2X1NZU0NMS19SQVRFKTsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9mc2wvbXBjODYxMF9ocGNkLmMgYi9zb3VuZC9zb2MvZnNsL21wYzg2MTBfaHBjZC5jCmluZGV4IDMxYWY0MDUuLmFlNDlmMWMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9mc2wvbXBjODYxMF9ocGNkLmMKKysrIGIvc291bmQvc29jL2ZzbC9tcGM4NjEwX2hwY2QuYwpAQCAtMzkyLDcgKzM5Miw4IEBACiAJfQogCiAJaWYgKHN0cmNhc2VjbXAoc3Byb3AsICJpMnMtc2xhdmUiKSA9PSAwKSB7Ci0JCW1hY2hpbmVfZGF0YS0+ZGFpX2Zvcm1hdCA9IFNORF9TT0NfREFJRk1UX0kyUzsKKwkJbWFjaGluZV9kYXRhLT5kYWlfZm9ybWF0ID0KKwkJCVNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk07CiAJCW1hY2hpbmVfZGF0YS0+Y29kZWNfY2xrX2RpcmVjdGlvbiA9IFNORF9TT0NfQ0xPQ0tfT1VUOwogCQltYWNoaW5lX2RhdGEtPmNwdV9jbGtfZGlyZWN0aW9uID0gU05EX1NPQ19DTE9DS19JTjsKIApAQCAtNDA5LDMxICs0MTAsMzggQEAKIAkJfQogCQltYWNoaW5lX2RhdGEtPmNsa19mcmVxdWVuY3kgPSBiZTMyX3RvX2NwdXAoaXByb3ApOwogCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChzcHJvcCwgImkycy1tYXN0ZXIiKSA9PSAwKSB7Ci0JCW1hY2hpbmVfZGF0YS0+ZGFpX2Zvcm1hdCA9IFNORF9TT0NfREFJRk1UX0kyUzsKKwkJbWFjaGluZV9kYXRhLT5kYWlfZm9ybWF0ID0KKwkJCVNORF9TT0NfREFJRk1UX0kyUyB8IFNORF9TT0NfREFJRk1UX0NCU19DRlM7CiAJCW1hY2hpbmVfZGF0YS0+Y29kZWNfY2xrX2RpcmVjdGlvbiA9IFNORF9TT0NfQ0xPQ0tfSU47CiAJCW1hY2hpbmVfZGF0YS0+Y3B1X2Nsa19kaXJlY3Rpb24gPSBTTkRfU09DX0NMT0NLX09VVDsKIAl9IGVsc2UgaWYgKHN0cmNhc2VjbXAoc3Byb3AsICJsai1zbGF2ZSIpID09IDApIHsKLQkJbWFjaGluZV9kYXRhLT5kYWlfZm9ybWF0ID0gU05EX1NPQ19EQUlGTVRfTEVGVF9KOworCQltYWNoaW5lX2RhdGEtPmRhaV9mb3JtYXQgPQorCQkJU05EX1NPQ19EQUlGTVRfTEVGVF9KIHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTTsKIAkJbWFjaGluZV9kYXRhLT5jb2RlY19jbGtfZGlyZWN0aW9uID0gU05EX1NPQ19DTE9DS19PVVQ7CiAJCW1hY2hpbmVfZGF0YS0+Y3B1X2Nsa19kaXJlY3Rpb24gPSBTTkRfU09DX0NMT0NLX0lOOwogCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChzcHJvcCwgImxqLW1hc3RlciIpID09IDApIHsKLQkJbWFjaGluZV9kYXRhLT5kYWlfZm9ybWF0ID0gU05EX1NPQ19EQUlGTVRfTEVGVF9KOworCQltYWNoaW5lX2RhdGEtPmRhaV9mb3JtYXQgPQorCQkJU05EX1NPQ19EQUlGTVRfTEVGVF9KIHwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzsKIAkJbWFjaGluZV9kYXRhLT5jb2RlY19jbGtfZGlyZWN0aW9uID0gU05EX1NPQ19DTE9DS19JTjsKIAkJbWFjaGluZV9kYXRhLT5jcHVfY2xrX2RpcmVjdGlvbiA9IFNORF9TT0NfQ0xPQ0tfT1VUOwogCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChzcHJvcCwgInJqLXNsYXZlIikgPT0gMCkgewotCQltYWNoaW5lX2RhdGEtPmRhaV9mb3JtYXQgPSBTTkRfU09DX0RBSUZNVF9SSUdIVF9KOworCQltYWNoaW5lX2RhdGEtPmRhaV9mb3JtYXQgPQorCQkJU05EX1NPQ19EQUlGTVRfUklHSFRfSiB8IFNORF9TT0NfREFJRk1UX0NCTV9DRk07CiAJCW1hY2hpbmVfZGF0YS0+Y29kZWNfY2xrX2RpcmVjdGlvbiA9IFNORF9TT0NfQ0xPQ0tfT1VUOwogCQltYWNoaW5lX2RhdGEtPmNwdV9jbGtfZGlyZWN0aW9uID0gU05EX1NPQ19DTE9DS19JTjsKIAl9IGVsc2UgaWYgKHN0cmNhc2VjbXAoc3Byb3AsICJyai1tYXN0ZXIiKSA9PSAwKSB7Ci0JCW1hY2hpbmVfZGF0YS0+ZGFpX2Zvcm1hdCA9IFNORF9TT0NfREFJRk1UX1JJR0hUX0o7CisJCW1hY2hpbmVfZGF0YS0+ZGFpX2Zvcm1hdCA9CisJCQlTTkRfU09DX0RBSUZNVF9SSUdIVF9KIHwgU05EX1NPQ19EQUlGTVRfQ0JTX0NGUzsKIAkJbWFjaGluZV9kYXRhLT5jb2RlY19jbGtfZGlyZWN0aW9uID0gU05EX1NPQ19DTE9DS19JTjsKIAkJbWFjaGluZV9kYXRhLT5jcHVfY2xrX2RpcmVjdGlvbiA9IFNORF9TT0NfQ0xPQ0tfT1VUOwogCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChzcHJvcCwgImFjOTctc2xhdmUiKSA9PSAwKSB7Ci0JCW1hY2hpbmVfZGF0YS0+ZGFpX2Zvcm1hdCA9IFNORF9TT0NfREFJRk1UX0FDOTc7CisJCW1hY2hpbmVfZGF0YS0+ZGFpX2Zvcm1hdCA9CisJCQlTTkRfU09DX0RBSUZNVF9BQzk3IHwgU05EX1NPQ19EQUlGTVRfQ0JNX0NGTTsKIAkJbWFjaGluZV9kYXRhLT5jb2RlY19jbGtfZGlyZWN0aW9uID0gU05EX1NPQ19DTE9DS19PVVQ7CiAJCW1hY2hpbmVfZGF0YS0+Y3B1X2Nsa19kaXJlY3Rpb24gPSBTTkRfU09DX0NMT0NLX0lOOwogCX0gZWxzZSBpZiAoc3RyY2FzZWNtcChzcHJvcCwgImFjOTctbWFzdGVyIikgPT0gMCkgewotCQltYWNoaW5lX2RhdGEtPmRhaV9mb3JtYXQgPSBTTkRfU09DX0RBSUZNVF9BQzk3OworCQltYWNoaW5lX2RhdGEtPmRhaV9mb3JtYXQgPQorCQkJU05EX1NPQ19EQUlGTVRfQUM5NyB8IFNORF9TT0NfREFJRk1UX0NCU19DRlM7CiAJCW1hY2hpbmVfZGF0YS0+Y29kZWNfY2xrX2RpcmVjdGlvbiA9IFNORF9TT0NfQ0xPQ0tfSU47CiAJCW1hY2hpbmVfZGF0YS0+Y3B1X2Nsa19kaXJlY3Rpb24gPSBTTkRfU09DX0NMT0NLX09VVDsKIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvc291bmQvc29jL2lteC9LY29uZmlnIGIvc291bmQvc29jL2lteC9LY29uZmlnCmluZGV4IGIxMzNiZmMuLjczODM5MTcgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9pbXgvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvaW14L0tjb25maWcKQEAgLTI4LDcgKzI4LDcgQEAKIAogY29uZmlnIFNORF9TT0NfTVgyN1ZJU19BSUMzMlg0CiAJdHJpc3RhdGUgIlNvQyBhdWRpbyBzdXBwb3J0IGZvciBWaXNzdHJpbSBNMTAgYm9hcmRzIgotCWRlcGVuZHMgb24gTUFDSF9JTVgyN19WSVNTVFJJTV9NMTAKKwlkZXBlbmRzIG9uIE1BQ0hfSU1YMjdfVklTU1RSSU1fTTEwICYmIEkyQwogCXNlbGVjdCBTTkRfU09DX1RMVjMyMEFJQzMyWDQKIAlzZWxlY3QgU05EX01YQ19TT0NfTVgyCiAJaGVscApkaWZmIC0tZ2l0IGEvc291bmQvc29jL2tpcmt3b29kL0tjb25maWcgYi9zb3VuZC9zb2Mva2lya3dvb2QvS2NvbmZpZwppbmRleCA4ZjQ5ZTE2Li5jNjJkNzE1IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mva2lya3dvb2QvS2NvbmZpZworKysgYi9zb3VuZC9zb2Mva2lya3dvb2QvS2NvbmZpZwpAQCAtMTIsNiArMTIsNyBAQAogY29uZmlnIFNORF9LSVJLV09PRF9TT0NfT1BFTlJECiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBLaXJrd29vZCBPcGVucmQgQ2xpZW50IgogCWRlcGVuZHMgb24gU05EX0tJUktXT09EX1NPQyAmJiAoTUFDSF9PUEVOUkRfQ0xJRU5UIHx8IE1BQ0hfT1BFTlJEX1VMVElNQVRFKQorCWRlcGVuZHMgb24gSTJDCiAJc2VsZWN0IFNORF9LSVJLV09PRF9TT0NfSTJTCiAJc2VsZWN0IFNORF9TT0NfQ1M0Mkw1MQogCWhlbHAKQEAgLTIwLDcgKzIxLDcgQEAKIAogY29uZmlnIFNORF9LSVJLV09PRF9TT0NfVDUzMjUKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgZm9yIEhQIHQ1MzI1IgotCWRlcGVuZHMgb24gU05EX0tJUktXT09EX1NPQyAmJiBNQUNIX1Q1MzI1CisJZGVwZW5kcyBvbiBTTkRfS0lSS1dPT0RfU09DICYmIE1BQ0hfVDUzMjUgJiYgSTJDCiAJc2VsZWN0IFNORF9LSVJLV09PRF9TT0NfSTJTCiAJc2VsZWN0IFNORF9TT0NfQUxDNTYyMwogCWhlbHAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9teHMvbXhzLXBjbS5jIGIvc291bmQvc29jL214cy9teHMtcGNtLmMKaW5kZXggZGVhNWFhNC4uZjM5ZDdkZCAxMDA2NDQKLS0tIGEvc291bmQvc29jL214cy9teHMtcGNtLmMKKysrIGIvc291bmQvc29jL214cy9teHMtcGNtLmMKQEAgLTM1NywzICszNTcsNiBAQAogCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZteHNfcGNtX2RyaXZlcik7CiB9CiBtb2R1bGVfZXhpdChzbmRfbXhzX3BjbV9leGl0KTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0FMSUFTKCJwbGF0Zm9ybTpteHMtcGNtLWF1ZGlvIik7CmRpZmYgLS1naXQgYS9zb3VuZC9zb2MvbXhzL214cy1zZ3RsNTAwMC5jIGIvc291bmQvc29jL214cy9teHMtc2d0bDUwMDAuYwppbmRleCA3ZmJlYWVjLi4xYzU3ZjY2IDEwMDY0NAotLS0gYS9zb3VuZC9zb2MvbXhzL214cy1zZ3RsNTAwMC5jCisrKyBiL3NvdW5kL3NvYy9teHMvbXhzLXNndGw1MDAwLmMKQEAgLTE3MSwzICsxNzEsNCBAQAogTU9EVUxFX0FVVEhPUigiRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYy4iKTsKIE1PRFVMRV9ERVNDUklQVElPTigiTVhTIEFMU0EgU29DIE1hY2hpbmUgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOm14cy1zZ3RsNTAwMCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvc29jL3B4YS9LY29uZmlnIGIvc291bmQvc29jL3B4YS9LY29uZmlnCmluZGV4IGZmZDIyNDIuLmEwZjdkM2MgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvS2NvbmZpZworKysgYi9zb3VuZC9zb2MvcHhhL0tjb25maWcKQEAgLTE1MSw2ICsxNTEsNyBAQAogY29uZmlnIFNORF9TT0NfUkFVTUZFTEQKIAl0cmlzdGF0ZSAiU29DIEF1ZGlvIHN1cHBvcnQgUmF1bWZlbGQgYXVkaW8gYWRhcHRlciIKIAlkZXBlbmRzIG9uIFNORF9QWEEyWFhfU09DICYmIChNQUNIX1JBVU1GRUxEX1NQRUFLRVIgfHwgTUFDSF9SQVVNRkVMRF9DT05ORUNUT1IpCisJZGVwZW5kcyBvbiBJMkMgJiYgU1BJX01BU1RFUgogCXNlbGVjdCBTTkRfUFhBX1NPQ19TU1AKIAlzZWxlY3QgU05EX1NPQ19DUzQyNzAKIAlzZWxlY3QgU05EX1NPQ19BSzQxMDQKQEAgLTE1OSw3ICsxNjAsNyBAQAogCiBjb25maWcgU05EX1BYQTJYWF9TT0NfSFg0NzAwCiAJdHJpc3RhdGUgIlNvQyBBdWRpbyBzdXBwb3J0IGZvciBIUCBpUEFRIGh4NDcwMCIKLQlkZXBlbmRzIG9uIFNORF9QWEEyWFhfU09DICYmIE1BQ0hfSDQ3MDAKKwlkZXBlbmRzIG9uIFNORF9QWEEyWFhfU09DICYmIE1BQ0hfSDQ3MDAgJiYgSTJDCiAJc2VsZWN0IFNORF9QWEEyWFhfU09DX0kyUwogCXNlbGVjdCBTTkRfU09DX0FLNDY0MQogCWhlbHAKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9weGEvaHg0NzAwLmMgYi9zb3VuZC9zb2MvcHhhL2h4NDcwMC5jCmluZGV4IDY1YzEyNDguLmM2NjRlMzMgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9weGEvaHg0NzAwLmMKKysrIGIvc291bmQvc29jL3B4YS9oeDQ3MDAuYwpAQCAtMjA5LDkgKzIwOSwxMCBAQAogCXNuZF9zb2NfY2FyZF9oeDQ3MDAuZGV2ID0gJnBkZXYtPmRldjsKIAlyZXQgPSBzbmRfc29jX3JlZ2lzdGVyX2NhcmQoJnNuZF9zb2NfY2FyZF9oeDQ3MDApOwogCWlmIChyZXQpCi0JCXJldHVybiByZXQ7CisJCWdwaW9fZnJlZV9hcnJheShoeDQ3MDBfYXVkaW9fZ3Bpb3MsCisJCQkJQVJSQVlfU0laRShoeDQ3MDBfYXVkaW9fZ3Bpb3MpKTsKIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgX19kZXZleGl0IGh4NDcwMF9hdWRpb19yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL2ppdmVfd204NzUwLmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9qaXZlX3dtODc1MC5jCmluZGV4IDE4MjZhY2YuLjhlNTIzZmQgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL2ppdmVfd204NzUwLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvaml2ZV93bTg3NTAuYwpAQCAtMTAxLDcgKzEwMSw2IEBACiB7CiAJc3RydWN0IHNuZF9zb2NfY29kZWMgKmNvZGVjID0gcnRkLT5jb2RlYzsKIAlzdHJ1Y3Qgc25kX3NvY19kYXBtX2NvbnRleHQgKmRhcG0gPSAmY29kZWMtPmRhcG07Ci0JaW50IGVycjsKIAogCS8qIFRoZXNlIGVuZHBvaW50cyBhcmUgbm90IGJlaW5nIHVzZWQuICovCiAJc25kX3NvY19kYXBtX25jX3BpbihkYXBtLCAiTElOUFVUMiIpOwpAQCAtMTMxLDcgKzEzMCw3IEBACiAJLmRhaV9saW5rCT0gJmppdmVfZGFpLAogCS5udW1fbGlua3MJPSAxLAogCi0JLmRhcG1fd2lkZ3RldHMJPSB3bTg3NTBfZGFwbV93aWRnZXRzLAorCS5kYXBtX3dpZGdldHMJPSB3bTg3NTBfZGFwbV93aWRnZXRzLAogCS5udW1fZGFwbV93aWRnZXRzID0gQVJSQVlfU0laRSh3bTg3NTBfZGFwbV93aWRnZXRzKSwKIAkuZGFwbV9yb3V0ZXMJPSBhdWRpb19tYXAsCiAJLm51bV9kYXBtX3JvdXRlcyA9IEFSUkFZX1NJWkUoYXVkaW9fbWFwKSwKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGsyNDQzX3dtOTcxMC5jIGIvc291bmQvc29jL3NhbXN1bmcvc21kazI0NDNfd205NzEwLmMKaW5kZXggM2EwZGJmYy4uOGJkMWRjNSAxMDA2NDQKLS0tIGEvc291bmQvc29jL3NhbXN1bmcvc21kazI0NDNfd205NzEwLmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc21kazI0NDNfd205NzEwLmMKQEAgLTEyLDYgKzEyLDcgQEAKICAqCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPHNvdW5kL3NvYy5oPgogCiBzdGF0aWMgc3RydWN0IHNuZF9zb2NfY2FyZCBzbWRrMjQ0MzsKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMgYi9zb3VuZC9zb2Mvc2Ftc3VuZy9zbWRrX3dtODk5NC5jCmluZGV4IGY3NWU0MzkuLmFkOWFjNDIgMTAwNjQ0Ci0tLSBhL3NvdW5kL3NvYy9zYW1zdW5nL3NtZGtfd204OTk0LmMKKysrIGIvc291bmQvc29jL3NhbXN1bmcvc21ka193bTg5OTQuYwpAQCAtOSw2ICs5LDcgQEAKIAogI2luY2x1ZGUgIi4uL2NvZGVjcy93bTg5OTQuaCIKICNpbmNsdWRlIDxzb3VuZC9wY21fcGFyYW1zLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAKICAvKgogICAqIERlZmF1bHQgQ0ZHIHN3aXRjaCBzZXR0aW5ncyB0byB1c2UgdGhpcyBkcml2ZXI6CmRpZmYgLS1naXQgYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGV5c2lkZS5jIGIvc291bmQvc29jL3NhbXN1bmcvc3BleXNpZGUuYwppbmRleCA4NWJmNTQxLi40YjhlMzU0IDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc2Ftc3VuZy9zcGV5c2lkZS5jCisrKyBiL3NvdW5kL3NvYy9zYW1zdW5nL3NwZXlzaWRlLmMKQEAgLTE5MSw3ICsxOTEsNyBAQAogCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIkhlYWRzZXQgTWljIik7CiAJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiTWFpbiBBTUlDIik7CiAJc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiTWFpbiBETUlDIik7Ci0Jc25kX3NvY19kYXBtX2lnbm9yZV9zdXNwZW5kKCZjYXJkLT5kYXBtLCAiU3BlYWtlciIpOworCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIk1haW4gU3BlYWtlciIpOwogCXNuZF9zb2NfZGFwbV9pZ25vcmVfc3VzcGVuZCgmY2FyZC0+ZGFwbSwgIldNMTI1MCBPdXRwdXQiKTsKIAlzbmRfc29jX2RhcG1faWdub3JlX3N1c3BlbmQoJmNhcmQtPmRhcG0sICJXTTEyNTAgSW5wdXQiKTsKIApkaWZmIC0tZ2l0IGEvc291bmQvc29jL3NvYy1jb3JlLmMgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwppbmRleCBhNWQzNjg1Li5hMjVmYTYzIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLWNvcmUuYworKysgYi9zb3VuZC9zb2Mvc29jLWNvcmUuYwpAQCAtNzA5LDYgKzcwOSwxMiBAQAogCXN0cnVjdCBzbmRfc29jX2NhcmQgKmNhcmQgPSBkZXZfZ2V0X2RydmRhdGEoZGV2KTsKIAlpbnQgaSwgYWM5N19jb250cm9sID0gMDsKIAorCS8qIElmIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGlzIHNvYyBkZXZpY2UgZmFpbGVkLCB0aGVyZSBpcyBubyBjb2RlYworCSAqIGFzc29jaWF0ZWQgd2l0aCBpdC4gSnVzdCBiYWlsIG91dCBpbiB0aGlzIGNhc2UuCisJICovCisJaWYgKGxpc3RfZW1wdHkoJmNhcmQtPmNvZGVjX2Rldl9saXN0KSkKKwkJcmV0dXJuIDA7CisKIAkvKiBBQzk3IGRldmljZXMgbWlnaHQgaGF2ZSBvdGhlciBkcml2ZXJzIGhhbmdpbmcgb2ZmIHRoZW0gc28KIAkgKiBuZWVkIHRvIHJlc3VtZSBpbW1lZGlhdGVseS4gIE90aGVyIGRyaXZlcnMgZG9uJ3QgaGF2ZSB0aGF0CiAJICogcHJvYmxlbSBhbmQgbWF5IHRha2UgYSBzdWJzdGFudGlhbCBhbW91bnQgb2YgdGltZSB0byByZXN1bWUKZGlmZiAtLWdpdCBhL3NvdW5kL3NvYy9zb2MtdXRpbHMuYyBiL3NvdW5kL3NvYy9zb2MtdXRpbHMuYwppbmRleCAwYzEyYjk4Li40MjIwYmIwIDEwMDY0NAotLS0gYS9zb3VuZC9zb2Mvc29jLXV0aWxzLmMKKysrIGIvc291bmQvc29jL3NvYy11dGlscy5jCkBAIC01OCw3ICs1OCwzNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwoc25kX3NvY19wYXJhbXNfdG9fYmNsayk7CiAKLXN0YXRpYyBzdHJ1Y3Qgc25kX3NvY19wbGF0Zm9ybV9kcml2ZXIgZHVtbXlfcGxhdGZvcm07CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9wY21faGFyZHdhcmUgZHVtbXlfZG1hX2hhcmR3YXJlID0geworCS5mb3JtYXRzCQk9IDB4ZmZmZmZmZmYsCisJLmNoYW5uZWxzX21pbgkJPSAxLAorCS5jaGFubmVsc19tYXgJCT0gVUlOVF9NQVgsCisKKwkvKiBSYW5kb20gdmFsdWVzIHRvIGtlZXAgdXNlcnNwYWNlIGhhcHB5IHdoZW4gY2hlY2tpbmcgY29uc3RyYWludHMgKi8KKwkuaW5mbwkJCT0gU05EUlZfUENNX0lORk9fSU5URVJMRUFWRUQgfAorCQkJCSAgU05EUlZfUENNX0lORk9fQkxPQ0tfVFJBTlNGRVIsCisJLmJ1ZmZlcl9ieXRlc19tYXgJPSAxMjgqMTAyNCwKKwkucGVyaW9kX2J5dGVzX21pbgk9IFBBR0VfU0laRSwKKwkucGVyaW9kX2J5dGVzX21heAk9IFBBR0VfU0laRSoyLAorCS5wZXJpb2RzX21pbgkJPSAyLAorCS5wZXJpb2RzX21heAkJPSAxMjgsCit9OworCitzdGF0aWMgaW50IGR1bW15X2RtYV9vcGVuKHN0cnVjdCBzbmRfcGNtX3N1YnN0cmVhbSAqc3Vic3RyZWFtKQoreworCXNuZF9zb2Nfc2V0X3J1bnRpbWVfaHdwYXJhbXMoc3Vic3RyZWFtLCAmZHVtbXlfZG1hX2hhcmR3YXJlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHNuZF9wY21fb3BzIGR1bW15X2RtYV9vcHMgPSB7CisJLm9wZW4JCT0gZHVtbXlfZG1hX29wZW4sCisJLmlvY3RsCQk9IHNuZF9wY21fbGliX2lvY3RsLAorfTsKKworc3RhdGljIHN0cnVjdCBzbmRfc29jX3BsYXRmb3JtX2RyaXZlciBkdW1teV9wbGF0Zm9ybSA9IHsKKwkub3BzID0gJmR1bW15X2RtYV9vcHMsCit9OwogCiBzdGF0aWMgX19kZXZpbml0IGludCBzbmRfc29jX2R1bW15X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCiB7CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvcXVpcmtzLXRhYmxlLmggYi9zb3VuZC91c2IvcXVpcmtzLXRhYmxlLmgKaW5kZXggYjYxOTQ1Zi4uMzJkMmEyMSAxMDA2NDQKLS0tIGEvc291bmQvdXNiL3F1aXJrcy10YWJsZS5oCisrKyBiL3NvdW5kL3VzYi9xdWlya3MtdGFibGUuaApAQCAtMTYzMyw2ICsxNjMzLDM3IEBACiAJfQogfSwKIHsKKwkvKiBSb2xhbmQgR0FJQSBTSC0wMSAqLworCVVTQl9ERVZJQ0UoMHgwNTgyLCAweDAxMTEpLAorCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmKGNvbnN0IHN0cnVjdCBzbmRfdXNiX2F1ZGlvX3F1aXJrKSB7CisJCS52ZW5kb3JfbmFtZSA9ICJSb2xhbmQiLAorCQkucHJvZHVjdF9uYW1lID0gIkdBSUEiLAorCQkuaWZudW0gPSBRVUlSS19BTllfSU5URVJGQUNFLAorCQkudHlwZSA9IFFVSVJLX0NPTVBPU0lURSwKKwkJLmRhdGEgPSAoY29uc3Qgc3RydWN0IHNuZF91c2JfYXVkaW9fcXVpcmtbXSkgeworCQkJeworCQkJCS5pZm51bSA9IDAsCisJCQkJLnR5cGUgPSBRVUlSS19BVURJT19TVEFOREFSRF9JTlRFUkZBQ0UKKwkJCX0sCisJCQl7CisJCQkJLmlmbnVtID0gMSwKKwkJCQkudHlwZSA9IFFVSVJLX0FVRElPX1NUQU5EQVJEX0lOVEVSRkFDRQorCQkJfSwKKwkJCXsKKwkJCQkuaWZudW0gPSAyLAorCQkJCS50eXBlID0gUVVJUktfTUlESV9GSVhFRF9FTkRQT0lOVCwKKwkJCQkuZGF0YSA9ICYoY29uc3Qgc3RydWN0IHNuZF91c2JfbWlkaV9lbmRwb2ludF9pbmZvKSB7CisJCQkJLm91dF9jYWJsZXMgPSAweDAwMDMsCisJCQkJLmluX2NhYmxlcyAgPSAweDAwMDMKKwkJCQl9CisJCQl9LAorCQkJeworCQkJCS5pZm51bSA9IC0xCisJCQl9CisJCX0KKwl9Cit9LAorewogCVVTQl9ERVZJQ0UoMHgwNTgyLCAweDAxMTMpLAogCS5kcml2ZXJfaW5mbyA9ICh1bnNpZ25lZCBsb25nKSAmIChjb25zdCBzdHJ1Y3Qgc25kX3VzYl9hdWRpb19xdWlyaykgewogCQkvKiAudmVuZG9yX25hbWUgPSAiQk9TUyIsICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1hbm5vdGF0ZS50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1hbm5vdGF0ZS50eHQKaW5kZXggZmU2NzYyZS4uYzg5ZjllMSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYW5ub3RhdGUudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWFubm90YXRlLnR4dApAQCAtMjIsNyArMjIsNyBAQAogLS0tLS0tLQogLWk6OgogLS1pbnB1dD06OgotICAgICAgICBJbnB1dCBmaWxlIG5hbWUuIChkZWZhdWx0OiBwZXJmLmRhdGEpCisgICAgICAgIElucHV0IGZpbGUgbmFtZS4gKGRlZmF1bHQ6IHBlcmYuZGF0YSB1bmxlc3Mgc3RkaW4gaXMgYSBmaWZvKQogCiAtZDo6CiAtLWRzb3M9PGRzb1ssZHNvLi4uXT46OgpAQCAtNjYsNyArNjYsNyBAQAogCXVzZWQuIFRoaXMgaW50ZXJmYWNlcyBzdGFydHMgYnkgY2VudGVyaW5nIG9uIHRoZSBsaW5lIHdpdGggbW9yZQogCXNhbXBsZXMsIFRBQi9VTlRBQiBjeWNsZXMgdGhyb3VnaCB0aGUgbGluZXMgd2l0aCBtb3JlIHNhbXBsZXMuCiAKLS1jOjoKKy1DOjoKIC0tY3B1OjogT25seSByZXBvcnQgc2FtcGxlcyBmb3IgdGhlIGxpc3Qgb2YgQ1BVcyBwcm92aWRlZC4gTXVsdGlwbGUgQ1BVcyBjYW4KIAliZSBwcm92aWRlZCBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IHdpdGggbm8gc3BhY2U6IDAsMS4gUmFuZ2VzIG9mCiAJQ1BVcyBhcmUgc3BlY2lmaWVkIHdpdGggLTogMC0yLiBEZWZhdWx0IGlzIHRvIHJlcG9ydCBzYW1wbGVzIG9uIGFsbApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYnVpbGRpZC1saXN0LnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWJ1aWxkaWQtbGlzdC50eHQKaW5kZXggY2MyMjMyNS4uMjVjNTJlZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYnVpbGRpZC1saXN0LnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1idWlsZGlkLWxpc3QudHh0CkBAIC0yNiw3ICsyNiw3IEBACiAgICAgICAgIFNob3cgb25seSBEU09zIHdpdGggaGl0cy4KIC1pOjoKIC0taW5wdXQ9OjoKLSAgICAgICAgSW5wdXQgZmlsZSBuYW1lLiAoZGVmYXVsdDogcGVyZi5kYXRhKQorICAgICAgICBJbnB1dCBmaWxlIG5hbWUuIChkZWZhdWx0OiBwZXJmLmRhdGEgdW5sZXNzIHN0ZGluIGlzIGEgZmlmbykKIC1mOjoKIC0tZm9yY2U6OgogCURvbid0IGRvIG93bmVyc2hpcCB2YWxpZGF0aW9uLgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtZXZsaXN0LnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWV2bGlzdC50eHQKaW5kZXggMGNhZGE5ZS4uMDUwN2VjNyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtZXZsaXN0LnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1ldmxpc3QudHh0CkBAIC0xOCw3ICsxOCw3IEBACiAtLS0tLS0tCiAtaTo6CiAtLWlucHV0PTo6Ci0gICAgICAgIElucHV0IGZpbGUgbmFtZS4gKGRlZmF1bHQ6IHBlcmYuZGF0YSkKKyAgICAgICAgSW5wdXQgZmlsZSBuYW1lLiAoZGVmYXVsdDogcGVyZi5kYXRhIHVubGVzcyBzdGRpbiBpcyBhIGZpZm8pCiAKIFNFRSBBTFNPCiAtLS0tLS0tLQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYta21lbS50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1rbWVtLnR4dAppbmRleCBhNTJmY2RlLi43YzhmYmJmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1rbWVtLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1rbWVtLnR4dApAQCAtMjMsNyArMjMsNyBAQAogLS0tLS0tLQogLWkgPGZpbGU+OjoKIC0taW5wdXQ9PGZpbGU+OjoKLQlTZWxlY3QgdGhlIGlucHV0IGZpbGUgKGRlZmF1bHQ6IHBlcmYuZGF0YSkKKwlTZWxlY3QgdGhlIGlucHV0IGZpbGUgKGRlZmF1bHQ6IHBlcmYuZGF0YSB1bmxlc3Mgc3RkaW4gaXMgYSBmaWZvKQogCiAtLWNhbGxlcjo6CiAJU2hvdyBwZXItY2FsbHNpdGUgc3RhdGlzdGljcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtbG9jay50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1sb2NrLnR4dAppbmRleCA0YTI2YTJmLi5kNmIyYTRmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1sb2NrLnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1sb2NrLnR4dApAQCAtMjksNyArMjksNyBAQAogCiAtaTo6CiAtLWlucHV0PTxmaWxlPjo6Ci0gICAgICAgIElucHV0IGZpbGUgbmFtZS4KKyAgICAgICAgSW5wdXQgZmlsZSBuYW1lLiAoZGVmYXVsdDogcGVyZi5kYXRhIHVubGVzcyBzdGRpbiBpcyBhIGZpZm8pCiAKIC12OjoKIC0tdmVyYm9zZTo6CmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVjb3JkLnR4dAppbmRleCA1YTUyMGY4Li4yOTM3ZjdlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlY29yZC50eHQKQEAgLTg5LDcgKzg5LDcgQEAKIAogLW06OgogLS1tbWFwLXBhZ2VzPTo6Ci0JTnVtYmVyIG9mIG1tYXAgZGF0YSBwYWdlcy4KKwlOdW1iZXIgb2YgbW1hcCBkYXRhIHBhZ2VzLiBNdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgogCiAtZzo6CiAtLWNhbGwtZ3JhcGg6OgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVwb3J0LnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlcG9ydC50eHQKaW5kZXggMjEyZjI0ZC4uOWI0MzBlOSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVwb3J0LnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZXBvcnQudHh0CkBAIC0xOSw3ICsxOSw3IEBACiAtLS0tLS0tCiAtaTo6CiAtLWlucHV0PTo6Ci0gICAgICAgIElucHV0IGZpbGUgbmFtZS4gKGRlZmF1bHQ6IHBlcmYuZGF0YSkKKyAgICAgICAgSW5wdXQgZmlsZSBuYW1lLiAoZGVmYXVsdDogcGVyZi5kYXRhIHVubGVzcyBzdGRpbiBpcyBhIGZpZm8pCiAKIC12OjoKIC0tdmVyYm9zZTo6CkBAIC0zOSw3ICszOSw3IEBACiAtVDo6CiAtLXRocmVhZHM6OgogCVNob3cgcGVyLXRocmVhZCBldmVudCBjb3VudGVycwotLUM6OgorLWM6OgogLS1jb21tcz06OgogCU9ubHkgY29uc2lkZXIgc3ltYm9scyBpbiB0aGVzZSBjb21tcy4gQ1NWIHRoYXQgdW5kZXJzdGFuZHMKIAlmaWxlOi8vZmlsZW5hbWUgZW50cmllcy4KQEAgLTgwLDkgKzgwLDEwIEBACiAtLWR1bXAtcmF3LXRyYWNlOjoKICAgICAgICAgRHVtcCByYXcgdHJhY2UgaW4gQVNDSUkuCiAKLS1nIFt0eXBlLG1pbixvcmRlcl06OgorLWcgW3R5cGUsbWluWyxsaW1pdF0sb3JkZXJdOjoKIC0tY2FsbC1ncmFwaDo6Ci0gICAgICAgIERpc3BsYXkgY2FsbCBjaGFpbnMgdXNpbmcgdHlwZSwgbWluIHBlcmNlbnQgdGhyZXNob2xkIGFuZCBvcmRlci4KKyAgICAgICAgRGlzcGxheSBjYWxsIGNoYWlucyB1c2luZyB0eXBlLCBtaW4gcGVyY2VudCB0aHJlc2hvbGQsIG9wdGlvbmFsIHByaW50CisJbGltaXQgYW5kIG9yZGVyLgogCXR5cGUgY2FuIGJlIGVpdGhlcjoKIAktIGZsYXQ6IHNpbmdsZSBjb2x1bW4sIGxpbmVhciBleHBvc3VyZSBvZiBjYWxsIGNoYWlucy4KIAktIGdyYXBoOiB1c2UgYSBncmFwaCB0cmVlLCBkaXNwbGF5aW5nIGFic29sdXRlIG92ZXJoZWFkIHJhdGVzLgpAQCAtMTI4LDcgKzEyOSw3IEBACiAtLXN5bWZzPTxkaXJlY3Rvcnk+OjoKICAgICAgICAgTG9vayBmb3IgZmlsZXMgd2l0aCBzeW1ib2xzIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5LgogCi0tYzo6CistQzo6CiAtLWNwdTo6IE9ubHkgcmVwb3J0IHNhbXBsZXMgZm9yIHRoZSBsaXN0IG9mIENQVXMgcHJvdmlkZWQuIE11bHRpcGxlIENQVXMgY2FuCiAJYmUgcHJvdmlkZWQgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCB3aXRoIG5vIHNwYWNlOiAwLDEuIFJhbmdlcyBvZgogCUNQVXMgYXJlIHNwZWNpZmllZCB3aXRoIC06IDAtMi4gRGVmYXVsdCBpcyB0byByZXBvcnQgc2FtcGxlcyBvbiBhbGwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXNjaGVkLnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXNjaGVkLnR4dAppbmRleCA1YjIxMmI1Li44ZmY0ZGY5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zY2hlZC50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc2NoZWQudHh0CkBAIC00MCw3ICs0MCw3IEBACiAtLS0tLS0tCiAtaTo6CiAtLWlucHV0PTxmaWxlPjo6Ci0gICAgICAgIElucHV0IGZpbGUgbmFtZS4gKGRlZmF1bHQ6IHBlcmYuZGF0YSkKKyAgICAgICAgSW5wdXQgZmlsZSBuYW1lLiAoZGVmYXVsdDogcGVyZi5kYXRhIHVubGVzcyBzdGRpbiBpcyBhIGZpZm8pCiAKIC12OjoKIC0tdmVyYm9zZTo6CmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zY3JpcHQudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc2NyaXB0LnR4dAppbmRleCBkZWM4N2VjLi4yZjZjZWY0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zY3JpcHQudHh0CisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXNjcmlwdC50eHQKQEAgLTEwNiw3ICsxMDYsNyBAQAogCiAtaTo6CiAtLWlucHV0PTo6Ci0gICAgICAgIElucHV0IGZpbGUgbmFtZS4KKyAgICAgICAgSW5wdXQgZmlsZSBuYW1lLiAoZGVmYXVsdDogcGVyZi5kYXRhIHVubGVzcyBzdGRpbiBpcyBhIGZpZm8pCiAKIC1kOjoKIC0tZGVidWctbW9kZTo6CkBAIC0xODIsMTIgKzE4MiwxNyBAQAogLS1oaWRlLWNhbGwtZ3JhcGg6OgogICAgICAgICBXaGVuIHByaW50aW5nIHN5bWJvbHMgZG8gbm90IGRpc3BsYXkgY2FsbCBjaGFpbi4KIAotLWM6OgorLUM6OgogLS1jcHU6OiBPbmx5IHJlcG9ydCBzYW1wbGVzIGZvciB0aGUgbGlzdCBvZiBDUFVzIHByb3ZpZGVkLiBNdWx0aXBsZSBDUFVzIGNhbgogCWJlIHByb3ZpZGVkIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgd2l0aCBubyBzcGFjZTogMCwxLiBSYW5nZXMgb2YKIAlDUFVzIGFyZSBzcGVjaWZpZWQgd2l0aCAtOiAwLTIuIERlZmF1bHQgaXMgdG8gcmVwb3J0IHNhbXBsZXMgb24gYWxsCiAJQ1BVcy4KIAorLWM6OgorLS1jb21tcz06OgorCU9ubHkgZGlzcGxheSBldmVudHMgZm9yIHRoZXNlIGNvbW1zLiBDU1YgdGhhdCB1bmRlcnN0YW5kcworCWZpbGU6Ly9maWxlbmFtZSBlbnRyaWVzLgorCiAtSTo6CiAtLXNob3ctaW5mbzo6CiAJRGlzcGxheSBleHRlbmRlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGVyZi5kYXRhIGZpbGUuIFRoaXMgYWRkcwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtdGVzdC50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi10ZXN0LnR4dAppbmRleCAyYzNiNDYyLi5iMjRhYzQwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi10ZXN0LnR4dAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi10ZXN0LnR4dApAQCAtOCwxMyArOCwxOSBAQAogU1lOT1BTSVMKIC0tLS0tLS0tCiBbdmVyc2VdCi0ncGVyZiB0ZXN0IDxvcHRpb25zPicKKydwZXJmIHRlc3QgWzxvcHRpb25zPl0gW3tsaXN0IDx0ZXN0LW5hbWUtZnJhZ21lbnQ+fFs8dGVzdC1uYW1lLWZyYWdtZW50cz58PHRlc3QtbnVtYmVycz5dfV0nCiAKIERFU0NSSVBUSU9OCiAtLS0tLS0tLS0tLQogVGhpcyBjb21tYW5kIGRvZXMgYXNzb3J0ZWQgc2FuaXR5IHRlc3RzLCBpbml0aWFsbHkgdGhyb3VnaCBsaW5rZWQgcm91dGluZXMgYnV0CiBhbHNvIHdpbGwgbG9vayBmb3IgYSBkaXJlY3Rvcnkgd2l0aCBtb3JlIHRlc3RzIGluIHRoZSBmb3JtIG9mIHNjcmlwdHMuCiAKK1RvIGdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIHRlc3RzIHVzZSAncGVyZiB0ZXN0IGxpc3QnLCBzcGVjaWZ5aW5nIGEgdGVzdCBuYW1lCitmcmFnbWVudCB3aWxsIHNob3cgYWxsIHRlc3RzIHRoYXQgaGF2ZSBpdC4KKworVG8gcnVuIGp1c3Qgc3BlY2lmaWMgdGVzdHMsIGluZm9ybSB0ZXN0IG5hbWUgZnJhZ21lbnRzIG9yIHRoZSBudW1iZXJzIG9idGFpbmVkCitmcm9tICdwZXJmIHRlc3QgbGlzdCcuCisKIE9QVElPTlMKIC0tLS0tLS0KIC12OjoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXRpbWVjaGFydC50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi10aW1lY2hhcnQudHh0CmluZGV4IGQ3Yjc5ZTIuLjE2MzJiMGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXRpbWVjaGFydC50eHQKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtdGltZWNoYXJ0LnR4dApAQCAtMjcsNyArMjcsNyBAQAogICAgICAgICBTZWxlY3QgdGhlIG91dHB1dCBmaWxlIChkZWZhdWx0OiBvdXRwdXQuc3ZnKQogLWk6OgogLS1pbnB1dD06OgotICAgICAgICBTZWxlY3QgdGhlIGlucHV0IGZpbGUgKGRlZmF1bHQ6IHBlcmYuZGF0YSkKKyAgICAgICAgU2VsZWN0IHRoZSBpbnB1dCBmaWxlIChkZWZhdWx0OiBwZXJmLmRhdGEgdW5sZXNzIHN0ZGluIGlzIGEgZmlmbykKIC13OjoKIC0td2lkdGg9OjoKICAgICAgICAgU2VsZWN0IHRoZSB3aWR0aCBvZiB0aGUgU1ZHIGZpbGUgKGRlZmF1bHQ6IDEwMDApCmRpZmYgLS1naXQgYS90b29scy9wZXJmL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQppbmRleCBiOThlMzA3Li5hYzg2ZDY3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL01ha2VmaWxlCisrKyBiL3Rvb2xzL3BlcmYvTWFrZWZpbGUKQEAgLTI3OCw2ICsyNzgsNyBAQAogTElCX0ggKz0gdXRpbC9zdHJsaXN0LmgKIExJQl9IICs9IHV0aWwvc3RyZmlsdGVyLmgKIExJQl9IICs9IHV0aWwvc3ZnaGVscGVyLmgKK0xJQl9IICs9IHV0aWwvdG9vbC5oCiBMSUJfSCArPSB1dGlsL3J1bi1jb21tYW5kLmgKIExJQl9IICs9IHV0aWwvc2lnY2hhaW4uaAogTElCX0ggKz0gdXRpbC9zeW1ib2wuaApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9hcmNoL3Bvd2VycGMvdXRpbC9kd2FyZi1yZWdzLmMgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy91dGlsL2R3YXJmLXJlZ3MuYwppbmRleCA0OGFlMGM1Li43Y2RkNjFkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2FyY2gvcG93ZXJwYy91dGlsL2R3YXJmLXJlZ3MuYworKysgYi90b29scy9wZXJmL2FyY2gvcG93ZXJwYy91dGlsL2R3YXJmLXJlZ3MuYwpAQCAtOSw3ICs5LDEwIEBACiAgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogICovCiAKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpZm5kZWYgX19VQ0xJQkNfXwogI2luY2x1ZGUgPGxpYmlvLmg+CisjZW5kaWYKICNpbmNsdWRlIDxkd2FyZi1yZWdzLmg+CiAKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWFubm90YXRlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwppbmRleCA0NmI0YzI0Li4yMTRiYTdmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwpAQCAtMjcsMzIgKzI3LDMyIEBACiAjaW5jbHVkZSAidXRpbC9zb3J0LmgiCiAjaW5jbHVkZSAidXRpbC9oaXN0LmgiCiAjaW5jbHVkZSAidXRpbC9zZXNzaW9uLmgiCisjaW5jbHVkZSAidXRpbC90b29sLmgiCiAKICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KIAotc3RhdGljIGNoYXIJCWNvbnN0ICppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CitzdHJ1Y3QgcGVyZl9hbm5vdGF0ZSB7CisJc3RydWN0IHBlcmZfdG9vbCB0b29sOworCWNoYXIgY29uc3QgKmlucHV0X25hbWU7CisJYm9vbAkgICBmb3JjZSwgdXNlX3R1aSwgdXNlX3N0ZGlvOworCWJvb2wJICAgZnVsbF9wYXRoczsKKwlib29sCSAgIHByaW50X2xpbmU7CisJY29uc3QgY2hhciAqc3ltX2hpc3RfZmlsdGVyOworCWNvbnN0IGNoYXIgKmNwdV9saXN0OworCURFQ0xBUkVfQklUTUFQKGNwdV9iaXRtYXAsIE1BWF9OUl9DUFVTKTsKK307CiAKLXN0YXRpYyBib29sCQlmb3JjZSwgdXNlX3R1aSwgdXNlX3N0ZGlvOwotCi1zdGF0aWMgYm9vbAkJZnVsbF9wYXRoczsKLQotc3RhdGljIGJvb2wJCXByaW50X2xpbmU7Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpzeW1faGlzdF9maWx0ZXI7Ci0KLXN0YXRpYyBjb25zdCBjaGFyCSpjcHVfbGlzdDsKLXN0YXRpYyBERUNMQVJFX0JJVE1BUChjcHVfYml0bWFwLCBNQVhfTlJfQ1BVUyk7Ci0KLXN0YXRpYyBpbnQgcGVyZl9ldmxpc3RfX2FkZF9zYW1wbGUoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCi0JCQkJICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJCSAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKK3N0YXRpYyBpbnQgcGVyZl9ldnNlbF9fYWRkX3NhbXBsZShzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCisJCQkJICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCQkgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKKwkJCQkgIHN0cnVjdCBwZXJmX2Fubm90YXRlICphbm4pCiB7CiAJc3RydWN0IGhpc3RfZW50cnkgKmhlOwogCWludCByZXQ7CiAKLQlpZiAoc3ltX2hpc3RfZmlsdGVyICE9IE5VTEwgJiYKLQkgICAgKGFsLT5zeW0gPT0gTlVMTCB8fCBzdHJjbXAoc3ltX2hpc3RfZmlsdGVyLCBhbC0+c3ltLT5uYW1lKSAhPSAwKSkgeworCWlmIChhbm4tPnN5bV9oaXN0X2ZpbHRlciAhPSBOVUxMICYmCisJICAgIChhbC0+c3ltID09IE5VTEwgfHwKKwkgICAgIHN0cmNtcChhbm4tPnN5bV9oaXN0X2ZpbHRlciwgYWwtPnN5bS0+bmFtZSkgIT0gMCkpIHsKIAkJLyogV2UncmUgb25seSBpbnRlcmVzdGVkIGluIGEgc3ltYm9sIG5hbWVkIHN5bV9oaXN0X2ZpbHRlciAqLwogCQlpZiAoYWwtPnN5bSAhPSBOVUxMKSB7CiAJCQlyYl9lcmFzZSgmYWwtPnN5bS0+cmJfbm9kZSwKQEAgLTY5LDggKzY5LDcgQEAKIAlyZXQgPSAwOwogCWlmIChoZS0+bXMuc3ltICE9IE5VTEwpIHsKIAkJc3RydWN0IGFubm90YXRpb24gKm5vdGVzID0gc3ltYm9sX19hbm5vdGF0aW9uKGhlLT5tcy5zeW0pOwotCQlpZiAobm90ZXMtPnNyYyA9PSBOVUxMICYmCi0JCSAgICBzeW1ib2xfX2FsbG9jX2hpc3QoaGUtPm1zLnN5bSwgZXZsaXN0LT5ucl9lbnRyaWVzKSA8IDApCisJCWlmIChub3Rlcy0+c3JjID09IE5VTEwgJiYgc3ltYm9sX19hbGxvY19oaXN0KGhlLT5tcy5zeW0pIDwgMCkKIAkJCXJldHVybiAtRU5PTUVNOwogCiAJCXJldCA9IGhpc3RfZW50cnlfX2luY19hZGRyX3NhbXBsZXMoaGUsIGV2c2VsLT5pZHgsIGFsLT5hZGRyKTsKQEAgLTgxLDI1ICs4MCwyNiBAQAogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19zYW1wbGVfZXZlbnQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCitzdGF0aWMgaW50IHByb2Nlc3Nfc2FtcGxlX2V2ZW50KHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CisJc3RydWN0IHBlcmZfYW5ub3RhdGUgKmFubiA9IGNvbnRhaW5lcl9vZih0b29sLCBzdHJ1Y3QgcGVyZl9hbm5vdGF0ZSwgdG9vbCk7CiAJc3RydWN0IGFkZHJfbG9jYXRpb24gYWw7CiAKLQlpZiAocGVyZl9ldmVudF9fcHJlcHJvY2Vzc19zYW1wbGUoZXZlbnQsIHNlc3Npb24sICZhbCwgc2FtcGxlLAorCWlmIChwZXJmX2V2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShldmVudCwgbWFjaGluZSwgJmFsLCBzYW1wbGUsCiAJCQkJCSAgc3ltYm9sX19hbm5vdGF0ZV9pbml0KSA8IDApIHsKIAkJcHJfd2FybmluZygicHJvYmxlbSBwcm9jZXNzaW5nICVkIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCiAJCQkgICBldmVudC0+aGVhZGVyLnR5cGUpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKGNwdV9saXN0ICYmICF0ZXN0X2JpdChzYW1wbGUtPmNwdSwgY3B1X2JpdG1hcCkpCisJaWYgKGFubi0+Y3B1X2xpc3QgJiYgIXRlc3RfYml0KHNhbXBsZS0+Y3B1LCBhbm4tPmNwdV9iaXRtYXApKQogCQlyZXR1cm4gMDsKIAotCWlmICghYWwuZmlsdGVyZWQgJiYKLQkgICAgcGVyZl9ldmxpc3RfX2FkZF9zYW1wbGUoc2Vzc2lvbi0+ZXZsaXN0LCBzYW1wbGUsIGV2c2VsLCAmYWwpKSB7CisJaWYgKCFhbC5maWx0ZXJlZCAmJiBwZXJmX2V2c2VsX19hZGRfc2FtcGxlKGV2c2VsLCBzYW1wbGUsICZhbCwgYW5uKSkgewogCQlwcl93YXJuaW5nKCJwcm9ibGVtIGluY3JlbWVudGluZyBzeW1ib2wgY291bnQsICIKIAkJCSAgICJza2lwcGluZyBldmVudFxuIik7CiAJCXJldHVybiAtMTsKQEAgLTEwOCwxNCArMTA4LDE1IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaGlzdF9lbnRyeV9fdHR5X2Fubm90YXRlKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgaW50IGV2aWR4KQorc3RhdGljIGludCBoaXN0X2VudHJ5X190dHlfYW5ub3RhdGUoc3RydWN0IGhpc3RfZW50cnkgKmhlLCBpbnQgZXZpZHgsCisJCQkJICAgIHN0cnVjdCBwZXJmX2Fubm90YXRlICphbm4pCiB7CiAJcmV0dXJuIHN5bWJvbF9fdHR5X2Fubm90YXRlKGhlLT5tcy5zeW0sIGhlLT5tcy5tYXAsIGV2aWR4LAotCQkJCSAgICBwcmludF9saW5lLCBmdWxsX3BhdGhzLCAwLCAwKTsKKwkJCQkgICAgYW5uLT5wcmludF9saW5lLCBhbm4tPmZ1bGxfcGF0aHMsIDAsIDApOwogfQogCiBzdGF0aWMgdm9pZCBoaXN0c19fZmluZF9hbm5vdGF0aW9ucyhzdHJ1Y3QgaGlzdHMgKnNlbGYsIGludCBldmlkeCwKLQkJCQkgICAgaW50IG5yX2V2ZW50cykKKwkJCQkgICAgc3RydWN0IHBlcmZfYW5ub3RhdGUgKmFubikKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQgPSByYl9maXJzdCgmc2VsZi0+ZW50cmllcyksICpuZXh0OwogCWludCBrZXkgPSBLX1JJR0hUOwpAQCAtMTM4LDggKzEzOSw3IEBACiAJCX0KIAogCQlpZiAodXNlX2Jyb3dzZXIgPiAwKSB7Ci0JCQlrZXkgPSBoaXN0X2VudHJ5X190dWlfYW5ub3RhdGUoaGUsIGV2aWR4LCBucl9ldmVudHMsCi0JCQkJCQkgICAgICAgTlVMTCwgTlVMTCwgMCk7CisJCQlrZXkgPSBoaXN0X2VudHJ5X190dWlfYW5ub3RhdGUoaGUsIGV2aWR4LCBOVUxMLCBOVUxMLCAwKTsKIAkJCXN3aXRjaCAoa2V5KSB7CiAJCQljYXNlIEtfUklHSFQ6CiAJCQkJbmV4dCA9IHJiX25leHQobmQpOwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJCQlpZiAobmV4dCAhPSBOVUxMKQogCQkJCW5kID0gbmV4dDsKIAkJfSBlbHNlIHsKLQkJCWhpc3RfZW50cnlfX3R0eV9hbm5vdGF0ZShoZSwgZXZpZHgpOworCQkJaGlzdF9lbnRyeV9fdHR5X2Fubm90YXRlKGhlLCBldmlkeCwgYW5uKTsKIAkJCW5kID0gcmJfbmV4dChuZCk7CiAJCQkvKgogCQkJICogU2luY2Ugd2UgaGF2ZSBhIGhpc3RfZW50cnkgcGVyIElQIGZvciB0aGUgc2FtZQpAQCAtMTY3LDMzICsxNjcsMjYgQEAKIAl9CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGVyZl9ldmVudF9vcHMgZXZlbnRfb3BzID0gewotCS5zYW1wbGUJPSBwcm9jZXNzX3NhbXBsZV9ldmVudCwKLQkubW1hcAk9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbW1hcCwKLQkuY29tbQk9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfY29tbSwKLQkuZm9yawk9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfdGFzaywKLQkub3JkZXJlZF9zYW1wbGVzID0gdHJ1ZSwKLQkub3JkZXJpbmdfcmVxdWlyZXNfdGltZXN0YW1wcyA9IHRydWUsCi19OwotCi1zdGF0aWMgaW50IF9fY21kX2Fubm90YXRlKHZvaWQpCitzdGF0aWMgaW50IF9fY21kX2Fubm90YXRlKHN0cnVjdCBwZXJmX2Fubm90YXRlICphbm4pCiB7CiAJaW50IHJldDsKIAlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uOwogCXN0cnVjdCBwZXJmX2V2c2VsICpwb3M7CiAJdTY0IHRvdGFsX25yX3NhbXBsZXM7CiAKLQlzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcoaW5wdXRfbmFtZSwgT19SRE9OTFksIGZvcmNlLCBmYWxzZSwgJmV2ZW50X29wcyk7CisJc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGFubi0+aW5wdXRfbmFtZSwgT19SRE9OTFksCisJCQkJICAgIGFubi0+Zm9yY2UsIGZhbHNlLCAmYW5uLT50b29sKTsKIAlpZiAoc2Vzc2lvbiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlmIChjcHVfbGlzdCkgewotCQlyZXQgPSBwZXJmX3Nlc3Npb25fX2NwdV9iaXRtYXAoc2Vzc2lvbiwgY3B1X2xpc3QsIGNwdV9iaXRtYXApOworCWlmIChhbm4tPmNwdV9saXN0KSB7CisJCXJldCA9IHBlcmZfc2Vzc2lvbl9fY3B1X2JpdG1hcChzZXNzaW9uLCBhbm4tPmNwdV9saXN0LAorCQkJCQkgICAgICAgYW5uLT5jcHVfYml0bWFwKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0X2RlbGV0ZTsKIAl9CiAKLQlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZldmVudF9vcHMpOworCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJmFubi0+dG9vbCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZGVsZXRlOwogCkBAIC0yMTcsMTMgKzIxMCwxMiBAQAogCQkJdG90YWxfbnJfc2FtcGxlcyArPSBucl9zYW1wbGVzOwogCQkJaGlzdHNfX2NvbGxhcHNlX3Jlc29ydChoaXN0cyk7CiAJCQloaXN0c19fb3V0cHV0X3Jlc29ydChoaXN0cyk7Ci0JCQloaXN0c19fZmluZF9hbm5vdGF0aW9ucyhoaXN0cywgcG9zLT5pZHgsCi0JCQkJCQlzZXNzaW9uLT5ldmxpc3QtPm5yX2VudHJpZXMpOworCQkJaGlzdHNfX2ZpbmRfYW5ub3RhdGlvbnMoaGlzdHMsIHBvcy0+aWR4LCBhbm4pOwogCQl9CiAJfQogCiAJaWYgKHRvdGFsX25yX3NhbXBsZXMgPT0gMCkgewotCQl1aV9fd2FybmluZygiVGhlICVzIGZpbGUgaGFzIG5vIHNhbXBsZXMhXG4iLCBpbnB1dF9uYW1lKTsKKwkJdWlfX3dhcm5pbmcoIlRoZSAlcyBmaWxlIGhhcyBubyBzYW1wbGVzIVxuIiwgc2Vzc2lvbi0+ZmlsZW5hbWUpOwogCQlnb3RvIG91dF9kZWxldGU7CiAJfQogb3V0X2RlbGV0ZToKQEAgLTI0NywyOSArMjM5LDQxIEBACiAJTlVMTAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0gewotCU9QVF9TVFJJTkcoJ2knLCAiaW5wdXQiLCAmaW5wdXRfbmFtZSwgImZpbGUiLAoraW50IGNtZF9hbm5vdGF0ZShpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCBfX3VzZWQpCit7CisJc3RydWN0IHBlcmZfYW5ub3RhdGUgYW5ub3RhdGUgPSB7CisJCS50b29sID0geworCQkJLnNhbXBsZQk9IHByb2Nlc3Nfc2FtcGxlX2V2ZW50LAorCQkJLm1tYXAJPSBwZXJmX2V2ZW50X19wcm9jZXNzX21tYXAsCisJCQkuY29tbQk9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfY29tbSwKKwkJCS5mb3JrCT0gcGVyZl9ldmVudF9fcHJvY2Vzc190YXNrLAorCQkJLm9yZGVyZWRfc2FtcGxlcyA9IHRydWUsCisJCQkub3JkZXJpbmdfcmVxdWlyZXNfdGltZXN0YW1wcyA9IHRydWUsCisJCX0sCisJfTsKKwljb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwlPUFRfU1RSSU5HKCdpJywgImlucHV0IiwgJmFubm90YXRlLmlucHV0X25hbWUsICJmaWxlIiwKIAkJICAgICJpbnB1dCBmaWxlIG5hbWUiKSwKIAlPUFRfU1RSSU5HKCdkJywgImRzb3MiLCAmc3ltYm9sX2NvbmYuZHNvX2xpc3Rfc3RyLCAiZHNvWyxkc28uLi5dIiwKIAkJICAgIm9ubHkgY29uc2lkZXIgc3ltYm9scyBpbiB0aGVzZSBkc29zIiksCi0JT1BUX1NUUklORygncycsICJzeW1ib2wiLCAmc3ltX2hpc3RfZmlsdGVyLCAic3ltYm9sIiwKKwlPUFRfU1RSSU5HKCdzJywgInN5bWJvbCIsICZhbm5vdGF0ZS5zeW1faGlzdF9maWx0ZXIsICJzeW1ib2wiLAogCQkgICAgInN5bWJvbCB0byBhbm5vdGF0ZSIpLAotCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJmZvcmNlLCAiZG9uJ3QgY29tcGxhaW4sIGRvIGl0IiksCisJT1BUX0JPT0xFQU4oJ2YnLCAiZm9yY2UiLCAmYW5ub3RhdGUuZm9yY2UsICJkb24ndCBjb21wbGFpbiwgZG8gaXQiKSwKIAlPUFRfSU5DUigndicsICJ2ZXJib3NlIiwgJnZlcmJvc2UsCiAJCSAgICAiYmUgbW9yZSB2ZXJib3NlIChzaG93IHN5bWJvbCBhZGRyZXNzLCBldGMpIiksCiAJT1BUX0JPT0xFQU4oJ0QnLCAiZHVtcC1yYXctdHJhY2UiLCAmZHVtcF90cmFjZSwKIAkJICAgICJkdW1wIHJhdyB0cmFjZSBpbiBBU0NJSSIpLAotCU9QVF9CT09MRUFOKDAsICJ0dWkiLCAmdXNlX3R1aSwgIlVzZSB0aGUgVFVJIGludGVyZmFjZSIpLAotCU9QVF9CT09MRUFOKDAsICJzdGRpbyIsICZ1c2Vfc3RkaW8sICJVc2UgdGhlIHN0ZGlvIGludGVyZmFjZSIpLAorCU9QVF9CT09MRUFOKDAsICJ0dWkiLCAmYW5ub3RhdGUudXNlX3R1aSwgIlVzZSB0aGUgVFVJIGludGVyZmFjZSIpLAorCU9QVF9CT09MRUFOKDAsICJzdGRpbyIsICZhbm5vdGF0ZS51c2Vfc3RkaW8sICJVc2UgdGhlIHN0ZGlvIGludGVyZmFjZSIpLAogCU9QVF9TVFJJTkcoJ2snLCAidm1saW51eCIsICZzeW1ib2xfY29uZi52bWxpbnV4X25hbWUsCiAJCSAgICJmaWxlIiwgInZtbGludXggcGF0aG5hbWUiKSwKIAlPUFRfQk9PTEVBTignbScsICJtb2R1bGVzIiwgJnN5bWJvbF9jb25mLnVzZV9tb2R1bGVzLAogCQkgICAgImxvYWQgbW9kdWxlIHN5bWJvbHMgLSBXQVJOSU5HOiB1c2Ugb25seSB3aXRoIC1rIGFuZCBMSVZFIGtlcm5lbCIpLAotCU9QVF9CT09MRUFOKCdsJywgInByaW50LWxpbmUiLCAmcHJpbnRfbGluZSwKKwlPUFRfQk9PTEVBTignbCcsICJwcmludC1saW5lIiwgJmFubm90YXRlLnByaW50X2xpbmUsCiAJCSAgICAicHJpbnQgbWF0Y2hpbmcgc291cmNlIGxpbmVzIChtYXkgYmUgc2xvdykiKSwKLQlPUFRfQk9PTEVBTignUCcsICJmdWxsLXBhdGhzIiwgJmZ1bGxfcGF0aHMsCisJT1BUX0JPT0xFQU4oJ1AnLCAiZnVsbC1wYXRocyIsICZhbm5vdGF0ZS5mdWxsX3BhdGhzLAogCQkgICAgIkRvbid0IHNob3J0ZW4gdGhlIGRpc3BsYXllZCBwYXRobmFtZXMiKSwKLQlPUFRfU1RSSU5HKCdjJywgImNwdSIsICZjcHVfbGlzdCwgImNwdSIsICJsaXN0IG9mIGNwdXMgdG8gcHJvZmlsZSIpLAorCU9QVF9TVFJJTkcoJ0MnLCAiY3B1IiwgJmFubm90YXRlLmNwdV9saXN0LCAiY3B1IiwgImxpc3Qgb2YgY3B1cyB0byBwcm9maWxlIiksCiAJT1BUX1NUUklORygwLCAic3ltZnMiLCAmc3ltYm9sX2NvbmYuc3ltZnMsICJkaXJlY3RvcnkiLAogCQkgICAiTG9vayBmb3IgZmlsZXMgd2l0aCBzeW1ib2xzIHJlbGF0aXZlIHRvIHRoaXMgZGlyZWN0b3J5IiksCiAJT1BUX0JPT0xFQU4oMCwgInNvdXJjZSIsICZzeW1ib2xfY29uZi5hbm5vdGF0ZV9zcmMsCkBAIC0yNzksMTUgKzI4MywxMyBAQAogCU9QVF9TVFJJTkcoJ00nLCAiZGlzYXNzZW1ibGVyLXN0eWxlIiwgJmRpc2Fzc2VtYmxlcl9zdHlsZSwgImRpc2Fzc2VtYmxlciBzdHlsZSIsCiAJCSAgICJTcGVjaWZ5IGRpc2Fzc2VtYmxlciBzdHlsZSAoZS5nLiAtTSBpbnRlbCBmb3IgaW50ZWwgc3ludGF4KSIpLAogCU9QVF9FTkQoKQotfTsKKwl9OwogCi1pbnQgY21kX2Fubm90YXRlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fdXNlZCkKLXsKIAlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCBhbm5vdGF0ZV91c2FnZSwgMCk7CiAKLQlpZiAodXNlX3N0ZGlvKQorCWlmIChhbm5vdGF0ZS51c2Vfc3RkaW8pCiAJCXVzZV9icm93c2VyID0gMDsKLQllbHNlIGlmICh1c2VfdHVpKQorCWVsc2UgaWYgKGFubm90YXRlLnVzZV90dWkpCiAJCXVzZV9icm93c2VyID0gMTsKIAogCXNldHVwX2Jyb3dzZXIodHJ1ZSk7CkBAIC0zMDgsNyArMzEwLDcgQEAKIAkJaWYgKGFyZ2MgPiAxKQogCQkJdXNhZ2Vfd2l0aF9vcHRpb25zKGFubm90YXRlX3VzYWdlLCBvcHRpb25zKTsKIAotCQlzeW1faGlzdF9maWx0ZXIgPSBhcmd2WzBdOworCQlhbm5vdGF0ZS5zeW1faGlzdF9maWx0ZXIgPSBhcmd2WzBdOwogCX0KIAogCWlmIChmaWVsZF9zZXAgJiYgKmZpZWxkX3NlcCA9PSAnLicpIHsKQEAgLTMxNiw1ICszMTgsNSBAQAogCQlyZXR1cm4gLTE7CiAJfQogCi0JcmV0dXJuIF9fY21kX2Fubm90YXRlKCk7CisJcmV0dXJuIF9fY21kX2Fubm90YXRlKCZhbm5vdGF0ZSk7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1saXN0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tYnVpbGRpZC1saXN0LmMKaW5kZXggY2I2OTBhNi4uNTI0ODA0NiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWJ1aWxkaWQtbGlzdC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1idWlsZGlkLWxpc3QuYwpAQCAtMTgsNyArMTgsNyBAQAogCiAjaW5jbHVkZSA8bGliZWxmLmg+CiAKLXN0YXRpYyBjaGFyIGNvbnN0ICppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CitzdGF0aWMgY29uc3QgY2hhciAqaW5wdXRfbmFtZTsKIHN0YXRpYyBib29sIGZvcmNlOwogc3RhdGljIGJvb2wgc2hvd19rZXJuZWw7CiBzdGF0aWMgYm9vbCB3aXRoX2hpdHM7CkBAIC0zOSwyNCArMzksNiBAQAogCU9QVF9FTkQoKQogfTsKIAotc3RhdGljIGludCBwZXJmX3Nlc3Npb25fX2xpc3RfYnVpbGRfaWRzKHZvaWQpCi17Ci0Jc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbjsKLQotCXNlc3Npb24gPSBwZXJmX3Nlc3Npb25fX25ldyhpbnB1dF9uYW1lLCBPX1JET05MWSwgZm9yY2UsIGZhbHNlLAotCQkJCSAgICAmYnVpbGRfaWRfX21hcmtfZHNvX2hpdF9vcHMpOwotCWlmIChzZXNzaW9uID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQotCWlmICh3aXRoX2hpdHMpCi0JCXBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJmJ1aWxkX2lkX19tYXJrX2Rzb19oaXRfb3BzKTsKLQotCXBlcmZfc2Vzc2lvbl9fZnByaW50Zl9kc29zX2J1aWxkaWQoc2Vzc2lvbiwgc3Rkb3V0LCB3aXRoX2hpdHMpOwotCi0JcGVyZl9zZXNzaW9uX19kZWxldGUoc2Vzc2lvbik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgc3lzZnNfX2ZwcmludGZfYnVpbGRfaWQoRklMRSAqZnApCiB7CiAJdTgga2FsbHN5bXNfYnVpbGRfaWRbQlVJTERfSURfU0laRV07CkBAIC04NSwxOCArNjcsMzcgQEAKIAlyZXR1cm4gZnByaW50ZihmcCwgIiVzXG4iLCBzYnVpbGRfaWQpOwogfQogCitzdGF0aWMgaW50IHBlcmZfc2Vzc2lvbl9fbGlzdF9idWlsZF9pZHModm9pZCkKK3sKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uOworCisJZWxmX3ZlcnNpb24oRVZfQ1VSUkVOVCk7CisKKwlzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcoaW5wdXRfbmFtZSwgT19SRE9OTFksIGZvcmNlLCBmYWxzZSwKKwkJCQkgICAgJmJ1aWxkX2lkX19tYXJrX2Rzb19oaXRfb3BzKTsKKwlpZiAoc2Vzc2lvbiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIFNlZSBpZiB0aGlzIGlzIGFuIEVMRiBmaWxlIGZpcnN0OgorCSAqLworCWlmIChmaWxlbmFtZV9fZnByaW50Zl9idWlsZF9pZChzZXNzaW9uLT5maWxlbmFtZSwgc3Rkb3V0KSkKKwkJZ290byBvdXQ7CisKKwlpZiAod2l0aF9oaXRzKQorCQlwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZidWlsZF9pZF9fbWFya19kc29faGl0X29wcyk7CisKKwlwZXJmX3Nlc3Npb25fX2ZwcmludGZfZHNvc19idWlsZGlkKHNlc3Npb24sIHN0ZG91dCwgd2l0aF9oaXRzKTsKK291dDoKKwlwZXJmX3Nlc3Npb25fX2RlbGV0ZShzZXNzaW9uKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGludCBfX2NtZF9idWlsZGlkX2xpc3Qodm9pZCkKIHsKIAlpZiAoc2hvd19rZXJuZWwpCiAJCXJldHVybiBzeXNmc19fZnByaW50Zl9idWlsZF9pZChzdGRvdXQpOwogCi0JZWxmX3ZlcnNpb24oRVZfQ1VSUkVOVCk7Ci0JLyoKLSAJICogU2VlIGlmIHRoaXMgaXMgYW4gRUxGIGZpbGUgZmlyc3Q6Ci0gCSAqLwotCWlmIChmaWxlbmFtZV9fZnByaW50Zl9idWlsZF9pZChpbnB1dF9uYW1lLCBzdGRvdXQpKQotCQlyZXR1cm4gMDsKLQogCXJldHVybiBwZXJmX3Nlc3Npb25fX2xpc3RfYnVpbGRfaWRzKCk7CiB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMgYi90b29scy9wZXJmL2J1aWx0aW4tZGlmZi5jCmluZGV4IGIzOWYzYTEuLjRmMTk1MTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1kaWZmLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWRpZmYuYwpAQCAtOSw3ICs5LDkgQEAKICNpbmNsdWRlICJ1dGlsL2RlYnVnLmgiCiAjaW5jbHVkZSAidXRpbC9ldmVudC5oIgogI2luY2x1ZGUgInV0aWwvaGlzdC5oIgorI2luY2x1ZGUgInV0aWwvZXZzZWwuaCIKICNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKKyNpbmNsdWRlICJ1dGlsL3Rvb2wuaCIKICNpbmNsdWRlICJ1dGlsL3NvcnQuaCIKICNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgogI2luY2x1ZGUgInV0aWwvdXRpbC5oIgpAQCAtMzAsMTQgKzMyLDE1IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKLXN0YXRpYyBpbnQgZGlmZl9fcHJvY2Vzc19zYW1wbGVfZXZlbnQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCitzdGF0aWMgaW50IGRpZmZfX3Byb2Nlc3Nfc2FtcGxlX2V2ZW50KHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX191c2VkLAorCQkJCSAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCBfX3VzZWQsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKKwkJCQkgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKIAotCWlmIChwZXJmX2V2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShldmVudCwgc2Vzc2lvbiwgJmFsLCBzYW1wbGUsIE5VTEwpIDwgMCkgeworCWlmIChwZXJmX2V2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShldmVudCwgbWFjaGluZSwgJmFsLCBzYW1wbGUsIE5VTEwpIDwgMCkgewogCQlwcl93YXJuaW5nKCJwcm9ibGVtIHByb2Nlc3NpbmcgJWQgZXZlbnQsIHNraXBwaW5nIGl0LlxuIiwKIAkJCSAgIGV2ZW50LT5oZWFkZXIudHlwZSk7CiAJCXJldHVybiAtMTsKQEAgLTQ2LDE2ICs0OSwxNiBAQAogCWlmIChhbC5maWx0ZXJlZCB8fCBhbC5zeW0gPT0gTlVMTCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoaGlzdHNfX2FkZF9lbnRyeSgmc2Vzc2lvbi0+aGlzdHMsICZhbCwgc2FtcGxlLT5wZXJpb2QpKSB7CisJaWYgKGhpc3RzX19hZGRfZW50cnkoJmV2c2VsLT5oaXN0cywgJmFsLCBzYW1wbGUtPnBlcmlvZCkpIHsKIAkJcHJfd2FybmluZygicHJvYmxlbSBpbmNyZW1lbnRpbmcgc3ltYm9sIHBlcmlvZCwgc2tpcHBpbmcgZXZlbnRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0Jc2Vzc2lvbi0+aGlzdHMuc3RhdHMudG90YWxfcGVyaW9kICs9IHNhbXBsZS0+cGVyaW9kOworCWV2c2VsLT5oaXN0cy5zdGF0cy50b3RhbF9wZXJpb2QgKz0gc2FtcGxlLT5wZXJpb2Q7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGVyZl9ldmVudF9vcHMgZXZlbnRfb3BzID0geworc3RhdGljIHN0cnVjdCBwZXJmX3Rvb2wgcGVyZl9kaWZmID0gewogCS5zYW1wbGUJPSBkaWZmX19wcm9jZXNzX3NhbXBsZV9ldmVudCwKIAkubW1hcAk9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbW1hcCwKIAkuY29tbQk9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfY29tbSwKQEAgLTE0NSwxMyArMTQ4LDEzIEBACiAJaW50IHJldCwgaTsKIAlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uWzJdOwogCi0Jc2Vzc2lvblswXSA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X29sZCwgT19SRE9OTFksIGZvcmNlLCBmYWxzZSwgJmV2ZW50X29wcyk7Ci0Jc2Vzc2lvblsxXSA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25ldywgT19SRE9OTFksIGZvcmNlLCBmYWxzZSwgJmV2ZW50X29wcyk7CisJc2Vzc2lvblswXSA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X29sZCwgT19SRE9OTFksIGZvcmNlLCBmYWxzZSwgJnBlcmZfZGlmZik7CisJc2Vzc2lvblsxXSA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25ldywgT19SRE9OTFksIGZvcmNlLCBmYWxzZSwgJnBlcmZfZGlmZik7CiAJaWYgKHNlc3Npb25bMF0gPT0gTlVMTCB8fCBzZXNzaW9uWzFdID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCiAJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgewotCQlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb25baV0sICZldmVudF9vcHMpOworCQlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb25baV0sICZwZXJmX2RpZmYpOwogCQlpZiAocmV0KQogCQkJZ290byBvdXRfZGVsZXRlOwogCX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1ldmxpc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1ldmxpc3QuYwppbmRleCA0YzVlOWUwLi4yNjc2MDMyIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tZXZsaXN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWV2bGlzdC5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSAidXRpbC9wYXJzZS1vcHRpb25zLmgiCiAjaW5jbHVkZSAidXRpbC9zZXNzaW9uLmgiCiAKLXN0YXRpYyBjaGFyIGNvbnN0ICppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CitzdGF0aWMgY29uc3QgY2hhciAqaW5wdXRfbmFtZTsKIAogc3RhdGljIGludCBfX2NtZF9ldmxpc3Qodm9pZCkKIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1pbmplY3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1pbmplY3QuYwppbmRleCA4ZGZjMTJiLi4wOWMxMDYxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4taW5qZWN0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLWluamVjdC5jCkBAIC05LDYgKzksNyBAQAogCiAjaW5jbHVkZSAicGVyZi5oIgogI2luY2x1ZGUgInV0aWwvc2Vzc2lvbi5oIgorI2luY2x1ZGUgInV0aWwvdG9vbC5oIgogI2luY2x1ZGUgInV0aWwvZGVidWcuaCIKIAogI2luY2x1ZGUgInV0aWwvcGFyc2Utb3B0aW9ucy5oIgpAQCAtMTYsOCArMTcsOSBAQAogc3RhdGljIGNoYXIJCWNvbnN0ICppbnB1dF9uYW1lID0gIi0iOwogc3RhdGljIGJvb2wJCWluamVjdF9idWlsZF9pZHM7CiAKLXN0YXRpYyBpbnQgcGVyZl9ldmVudF9fcmVwaXBlX3N5bnRoKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJCSAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uIF9fdXNlZCkKK3N0YXRpYyBpbnQgcGVyZl9ldmVudF9fcmVwaXBlX3N5bnRoKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX191c2VkLAorCQkJCSAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191c2VkKQogewogCXVpbnQzMl90IHNpemU7CiAJdm9pZCAqYnVmID0gZXZlbnQ7CkBAIC0zNiw0MSArMzgsNzAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwZXJmX2V2ZW50X19yZXBpcGUodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSBfX3VzZWQsCi0JCQkgICAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQorc3RhdGljIGludCBwZXJmX2V2ZW50X19yZXBpcGVfb3AyX3N5bnRoKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJCXVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCQlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uIF9fdXNlZCkKIHsKLQlyZXR1cm4gcGVyZl9ldmVudF9fcmVwaXBlX3N5bnRoKGV2ZW50LCBzZXNzaW9uKTsKKwlyZXR1cm4gcGVyZl9ldmVudF9fcmVwaXBlX3N5bnRoKHRvb2wsIGV2ZW50LCBOVUxMKTsKIH0KIAotc3RhdGljIGludCBwZXJmX2V2ZW50X19yZXBpcGVfc2FtcGxlKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorc3RhdGljIGludCBwZXJmX2V2ZW50X19yZXBpcGVfZXZlbnRfdHlwZV9zeW50aChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCQkgICAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQpCit7CisJcmV0dXJuIHBlcmZfZXZlbnRfX3JlcGlwZV9zeW50aCh0b29sLCBldmVudCwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9ldmVudF9fcmVwaXBlX3RyYWNpbmdfZGF0YV9zeW50aCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkJCSBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uIF9fdXNlZCkKK3sKKwlyZXR1cm4gcGVyZl9ldmVudF9fcmVwaXBlX3N5bnRoKE5VTEwsIGV2ZW50LCBOVUxMKTsKK30KKworc3RhdGljIGludCBwZXJmX2V2ZW50X19yZXBpcGVfYXR0cih1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgICBzdHJ1Y3QgcGVyZl9ldmxpc3QgKipwZXZsaXN0IF9fdXNlZCkKK3sKKwlyZXR1cm4gcGVyZl9ldmVudF9fcmVwaXBlX3N5bnRoKE5VTEwsIGV2ZW50LCBOVUxMKTsKK30KKworc3RhdGljIGludCBwZXJmX2V2ZW50X19yZXBpcGUoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCSAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX191c2VkLAorCQkJICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJcmV0dXJuIHBlcmZfZXZlbnRfX3JlcGlwZV9zeW50aCh0b29sLCBldmVudCwgbWFjaGluZSk7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9ldmVudF9fcmVwaXBlX3NhbXBsZShzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSBfX3VzZWQsCiAJCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX191c2VkLAotCQkJICAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKKwkJCSAgICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogewotCXJldHVybiBwZXJmX2V2ZW50X19yZXBpcGVfc3ludGgoZXZlbnQsIHNlc3Npb24pOworCXJldHVybiBwZXJmX2V2ZW50X19yZXBpcGVfc3ludGgodG9vbCwgZXZlbnQsIG1hY2hpbmUpOwogfQogCi1zdGF0aWMgaW50IHBlcmZfZXZlbnRfX3JlcGlwZV9tbWFwKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorc3RhdGljIGludCBwZXJmX2V2ZW50X19yZXBpcGVfbW1hcChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAotCQkJCSAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJaW50IGVycjsKIAotCWVyciA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbW1hcChldmVudCwgc2FtcGxlLCBzZXNzaW9uKTsKLQlwZXJmX2V2ZW50X19yZXBpcGUoZXZlbnQsIHNhbXBsZSwgc2Vzc2lvbik7CisJZXJyID0gcGVyZl9ldmVudF9fcHJvY2Vzc19tbWFwKHRvb2wsIGV2ZW50LCBzYW1wbGUsIG1hY2hpbmUpOworCXBlcmZfZXZlbnRfX3JlcGlwZSh0b29sLCBldmVudCwgc2FtcGxlLCBtYWNoaW5lKTsKIAogCXJldHVybiBlcnI7CiB9CiAKLXN0YXRpYyBpbnQgcGVyZl9ldmVudF9fcmVwaXBlX3Rhc2sodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCitzdGF0aWMgaW50IHBlcmZfZXZlbnRfX3JlcGlwZV90YXNrKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKKwkJCQkgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAlpbnQgZXJyOwogCi0JZXJyID0gcGVyZl9ldmVudF9fcHJvY2Vzc190YXNrKGV2ZW50LCBzYW1wbGUsIHNlc3Npb24pOwotCXBlcmZfZXZlbnRfX3JlcGlwZShldmVudCwgc2FtcGxlLCBzZXNzaW9uKTsKKwllcnIgPSBwZXJmX2V2ZW50X19wcm9jZXNzX3Rhc2sodG9vbCwgZXZlbnQsIHNhbXBsZSwgbWFjaGluZSk7CisJcGVyZl9ldmVudF9fcmVwaXBlKHRvb2wsIGV2ZW50LCBzYW1wbGUsIG1hY2hpbmUpOwogCiAJcmV0dXJuIGVycjsKIH0KQEAgLTgwLDcgKzExMSw3IEBACiB7CiAJaW50IGVycjsKIAotCXBlcmZfZXZlbnRfX3JlcGlwZV9zeW50aChldmVudCwgc2Vzc2lvbik7CisJcGVyZl9ldmVudF9fcmVwaXBlX3N5bnRoKE5VTEwsIGV2ZW50LCBOVUxMKTsKIAllcnIgPSBwZXJmX2V2ZW50X19wcm9jZXNzX3RyYWNpbmdfZGF0YShldmVudCwgc2Vzc2lvbik7CiAKIAlyZXR1cm4gZXJyOwpAQCAtMTAwLDEwICsxMzEsMTAgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgZHNvX19pbmplY3RfYnVpbGRfaWQoc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKK3N0YXRpYyBpbnQgZHNvX19pbmplY3RfYnVpbGRfaWQoc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAl1MTYgbWlzYyA9IFBFUkZfUkVDT1JEX01JU0NfVVNFUjsKLQlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZTsKIAlpbnQgZXJyOwogCiAJaWYgKGRzb19fcmVhZF9idWlsZF9pZChzZWxmKSA8IDApIHsKQEAgLTExMSwxNyArMTQyLDExIEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQltYWNoaW5lID0gcGVyZl9zZXNzaW9uX19maW5kX2hvc3RfbWFjaGluZShzZXNzaW9uKTsKLQlpZiAobWFjaGluZSA9PSBOVUxMKSB7Ci0JCXByX2VycigiQ2FuJ3QgZmluZCBtYWNoaW5lIGZvciBzZXNzaW9uXG4iKTsKLQkJcmV0dXJuIC0xOwotCX0KLQogCWlmIChzZWxmLT5rZXJuZWwpCiAJCW1pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTDsKIAotCWVyciA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfYnVpbGRfaWQoc2VsZiwgbWlzYywgcGVyZl9ldmVudF9fcmVwaXBlLAotCQkJCQkgICAgICBtYWNoaW5lLCBzZXNzaW9uKTsKKwllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2J1aWxkX2lkKHRvb2wsIHNlbGYsIG1pc2MsIHBlcmZfZXZlbnRfX3JlcGlwZSwKKwkJCQkJICAgICAgbWFjaGluZSk7CiAJaWYgKGVycikgewogCQlwcl9lcnIoIkNhbid0IHN5bnRoZXNpemUgYnVpbGRfaWQgZXZlbnQgZm9yICVzXG4iLCBzZWxmLT5sb25nX25hbWUpOwogCQlyZXR1cm4gLTE7CkBAIC0xMzAsMTAgKzE1NSwxMSBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHBlcmZfZXZlbnRfX2luamVjdF9idWlsZGlkKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorc3RhdGljIGludCBwZXJmX2V2ZW50X19pbmplY3RfYnVpbGRpZChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCBfX3VzZWQsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKKwkJCQkgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKIAlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQ7CkBAIC0xNDEsMjEgKzE2NywyMSBAQAogCiAJY3B1bW9kZSA9IGV2ZW50LT5oZWFkZXIubWlzYyAmIFBFUkZfUkVDT1JEX01JU0NfQ1BVTU9ERV9NQVNLOwogCi0JdGhyZWFkID0gcGVyZl9zZXNzaW9uX19maW5kbmV3KHNlc3Npb24sIGV2ZW50LT5pcC5waWQpOworCXRocmVhZCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIGV2ZW50LT5pcC5waWQpOwogCWlmICh0aHJlYWQgPT0gTlVMTCkgewogCQlwcl9lcnIoInByb2JsZW0gcHJvY2Vzc2luZyAlZCBldmVudCwgc2tpcHBpbmcgaXQuXG4iLAogCQkgICAgICAgZXZlbnQtPmhlYWRlci50eXBlKTsKIAkJZ290byByZXBpcGU7CiAJfQogCi0JdGhyZWFkX19maW5kX2FkZHJfbWFwKHRocmVhZCwgc2Vzc2lvbiwgY3B1bW9kZSwgTUFQX19GVU5DVElPTiwKLQkJCSAgICAgIGV2ZW50LT5pcC5waWQsIGV2ZW50LT5pcC5pcCwgJmFsKTsKKwl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodGhyZWFkLCBtYWNoaW5lLCBjcHVtb2RlLCBNQVBfX0ZVTkNUSU9OLAorCQkJICAgICAgZXZlbnQtPmlwLmlwLCAmYWwpOwogCiAJaWYgKGFsLm1hcCAhPSBOVUxMKSB7CiAJCWlmICghYWwubWFwLT5kc28tPmhpdCkgewogCQkJYWwubWFwLT5kc28tPmhpdCA9IDE7CiAJCQlpZiAobWFwX19sb2FkKGFsLm1hcCwgTlVMTCkgPj0gMCkgewotCQkJCWRzb19faW5qZWN0X2J1aWxkX2lkKGFsLm1hcC0+ZHNvLCBzZXNzaW9uKTsKKwkJCQlkc29fX2luamVjdF9idWlsZF9pZChhbC5tYXAtPmRzbywgdG9vbCwgbWFjaGluZSk7CiAJCQkJLyoKIAkJCQkgKiBJZiB0aGlzIGZhaWxzLCB0b28gYmFkLCBsZXQgdGhlIG90aGVyIHNpZGUKIAkJCQkgKiBhY2NvdW50IHRoaXMgYXMgdW5yZXNvbHZlZC4KQEAgLTE2OCwyNCArMTk0LDI0IEBACiAJfQogCiByZXBpcGU6Ci0JcGVyZl9ldmVudF9fcmVwaXBlKGV2ZW50LCBzYW1wbGUsIHNlc3Npb24pOworCXBlcmZfZXZlbnRfX3JlcGlwZSh0b29sLCBldmVudCwgc2FtcGxlLCBtYWNoaW5lKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RydWN0IHBlcmZfZXZlbnRfb3BzIGluamVjdF9vcHMgPSB7CitzdHJ1Y3QgcGVyZl90b29sIHBlcmZfaW5qZWN0ID0gewogCS5zYW1wbGUJCT0gcGVyZl9ldmVudF9fcmVwaXBlX3NhbXBsZSwKIAkubW1hcAkJPSBwZXJmX2V2ZW50X19yZXBpcGUsCiAJLmNvbW0JCT0gcGVyZl9ldmVudF9fcmVwaXBlLAogCS5mb3JrCQk9IHBlcmZfZXZlbnRfX3JlcGlwZSwKIAkuZXhpdAkJPSBwZXJmX2V2ZW50X19yZXBpcGUsCiAJLmxvc3QJCT0gcGVyZl9ldmVudF9fcmVwaXBlLAotCS5yZWFkCQk9IHBlcmZfZXZlbnRfX3JlcGlwZSwKKwkucmVhZAkJPSBwZXJmX2V2ZW50X19yZXBpcGVfc2FtcGxlLAogCS50aHJvdHRsZQk9IHBlcmZfZXZlbnRfX3JlcGlwZSwKIAkudW50aHJvdHRsZQk9IHBlcmZfZXZlbnRfX3JlcGlwZSwKLQkuYXR0cgkJPSBwZXJmX2V2ZW50X19yZXBpcGVfc3ludGgsCi0JLmV2ZW50X3R5cGUgCT0gcGVyZl9ldmVudF9fcmVwaXBlX3N5bnRoLAotCS50cmFjaW5nX2RhdGEgCT0gcGVyZl9ldmVudF9fcmVwaXBlX3N5bnRoLAotCS5idWlsZF9pZCAJPSBwZXJmX2V2ZW50X19yZXBpcGVfc3ludGgsCisJLmF0dHIJCT0gcGVyZl9ldmVudF9fcmVwaXBlX2F0dHIsCisJLmV2ZW50X3R5cGUJPSBwZXJmX2V2ZW50X19yZXBpcGVfZXZlbnRfdHlwZV9zeW50aCwKKwkudHJhY2luZ19kYXRhCT0gcGVyZl9ldmVudF9fcmVwaXBlX3RyYWNpbmdfZGF0YV9zeW50aCwKKwkuYnVpbGRfaWQJPSBwZXJmX2V2ZW50X19yZXBpcGVfb3AyX3N5bnRoLAogfTsKIAogZXh0ZXJuIHZvbGF0aWxlIGludCBzZXNzaW9uX2RvbmU7CkBAIC0yMDMsMTcgKzIyOSwxNyBAQAogCXNpZ25hbChTSUdJTlQsIHNpZ19oYW5kbGVyKTsKIAogCWlmIChpbmplY3RfYnVpbGRfaWRzKSB7Ci0JCWluamVjdF9vcHMuc2FtcGxlCT0gcGVyZl9ldmVudF9faW5qZWN0X2J1aWxkaWQ7Ci0JCWluamVjdF9vcHMubW1hcAkJPSBwZXJmX2V2ZW50X19yZXBpcGVfbW1hcDsKLQkJaW5qZWN0X29wcy5mb3JrCQk9IHBlcmZfZXZlbnRfX3JlcGlwZV90YXNrOwotCQlpbmplY3Rfb3BzLnRyYWNpbmdfZGF0YQk9IHBlcmZfZXZlbnRfX3JlcGlwZV90cmFjaW5nX2RhdGE7CisJCXBlcmZfaW5qZWN0LnNhbXBsZQkgPSBwZXJmX2V2ZW50X19pbmplY3RfYnVpbGRpZDsKKwkJcGVyZl9pbmplY3QubW1hcAkgPSBwZXJmX2V2ZW50X19yZXBpcGVfbW1hcDsKKwkJcGVyZl9pbmplY3QuZm9yawkgPSBwZXJmX2V2ZW50X19yZXBpcGVfdGFzazsKKwkJcGVyZl9pbmplY3QudHJhY2luZ19kYXRhID0gcGVyZl9ldmVudF9fcmVwaXBlX3RyYWNpbmdfZGF0YTsKIAl9CiAKLQlzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcoaW5wdXRfbmFtZSwgT19SRE9OTFksIGZhbHNlLCB0cnVlLCAmaW5qZWN0X29wcyk7CisJc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25hbWUsIE9fUkRPTkxZLCBmYWxzZSwgdHJ1ZSwgJnBlcmZfaW5qZWN0KTsKIAlpZiAoc2Vzc2lvbiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJmluamVjdF9vcHMpOworCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJnBlcmZfaW5qZWN0KTsKIAogCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4ta21lbS5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWttZW0uYwppbmRleCAyMjVlOTYzLi5mZTFhZDhmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4ta21lbS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1rbWVtLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAidXRpbC90aHJlYWQuaCIKICNpbmNsdWRlICJ1dGlsL2hlYWRlci5oIgogI2luY2x1ZGUgInV0aWwvc2Vzc2lvbi5oIgorI2luY2x1ZGUgInV0aWwvdG9vbC5oIgogCiAjaW5jbHVkZSAidXRpbC9wYXJzZS1vcHRpb25zLmgiCiAjaW5jbHVkZSAidXRpbC90cmFjZS1ldmVudC5oIgpAQCAtMTgsNyArMTksNyBAQAogc3RydWN0IGFsbG9jX3N0YXQ7CiB0eXBlZGVmIGludCAoKnNvcnRfZm5fdCkoc3RydWN0IGFsbG9jX3N0YXQgKiwgc3RydWN0IGFsbG9jX3N0YXQgKik7CiAKLXN0YXRpYyBjaGFyIGNvbnN0CQkqaW5wdXRfbmFtZSA9ICJwZXJmLmRhdGEiOworc3RhdGljIGNvbnN0IGNoYXIJCSppbnB1dF9uYW1lOwogCiBzdGF0aWMgaW50CQkJYWxsb2NfZmxhZzsKIHN0YXRpYyBpbnQJCQljYWxsZXJfZmxhZzsKQEAgLTMwMywxMiArMzA0LDEzIEBACiAJfQogfQogCi1zdGF0aWMgaW50IHByb2Nlc3Nfc2FtcGxlX2V2ZW50KHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorc3RhdGljIGludCBwcm9jZXNzX3NhbXBsZV9ldmVudChzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKKwkJCQl1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKIAkJCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX191c2VkLAotCQkJCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkID0gcGVyZl9zZXNzaW9uX19maW5kbmV3KHNlc3Npb24sIGV2ZW50LT5pcC5waWQpOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIGV2ZW50LT5pcC5waWQpOwogCiAJaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAJCXByX2RlYnVnKCJwcm9ibGVtIHByb2Nlc3NpbmcgJWQgZXZlbnQsIHNraXBwaW5nIGl0LlxuIiwKQEAgLTMyNCw3ICszMjYsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBlcmZfZXZlbnRfb3BzIGV2ZW50X29wcyA9IHsKK3N0YXRpYyBzdHJ1Y3QgcGVyZl90b29sIHBlcmZfa21lbSA9IHsKIAkuc2FtcGxlCQkJPSBwcm9jZXNzX3NhbXBsZV9ldmVudCwKIAkuY29tbQkJCT0gcGVyZl9ldmVudF9fcHJvY2Vzc19jb21tLAogCS5vcmRlcmVkX3NhbXBsZXMJPSB0cnVlLApAQCAtNDgzLDcgKzQ4NSw3IEBACiB7CiAJaW50IGVyciA9IC1FSU5WQUw7CiAJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25hbWUsIE9fUkRPTkxZLAotCQkJCQkJCSAwLCBmYWxzZSwgJmV2ZW50X29wcyk7CisJCQkJCQkJIDAsIGZhbHNlLCAmcGVyZl9rbWVtKTsKIAlpZiAoc2Vzc2lvbiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtNDk0LDcgKzQ5Niw3IEBACiAJCWdvdG8gb3V0X2RlbGV0ZTsKIAogCXNldHVwX3BhZ2VyKCk7Ci0JZXJyID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAmZXZlbnRfb3BzKTsKKwllcnIgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZwZXJmX2ttZW0pOwogCWlmIChlcnIgIT0gMCkKIAkJZ290byBvdXRfZGVsZXRlOwogCXNvcnRfcmVzdWx0KCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4ta3ZtLmMgYi90b29scy9wZXJmL2J1aWx0aW4ta3ZtLmMKaW5kZXggMzRkMWU4NS4uMDMyMzI0YSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLWt2bS5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1rdm0uYwpAQCAtMzgsNyArMzgsNyBAQAogCU9QVF9CT09MRUFOKDAsICJndWVzdCIsICZwZXJmX2d1ZXN0LAogCQkgICAgIkNvbGxlY3QgZ3Vlc3Qgb3MgZGF0YSIpLAogCU9QVF9CT09MRUFOKDAsICJob3N0IiwgJnBlcmZfaG9zdCwKLQkJICAgICJDb2xsZWN0IGd1ZXN0IG9zIGRhdGEiKSwKKwkJICAgICJDb2xsZWN0IGhvc3Qgb3MgZGF0YSIpLAogCU9QVF9TVFJJTkcoMCwgImd1ZXN0bW91bnQiLCAmc3ltYm9sX2NvbmYuZ3Vlc3Rtb3VudCwgImRpcmVjdG9yeSIsCiAJCSAgICJndWVzdCBtb3VudCBkaXJlY3RvcnkgdW5kZXIgd2hpY2ggZXZlcnkgZ3Vlc3Qgb3MiCiAJCSAgICIgaW5zdGFuY2UgaGFzIGEgc3ViZGlyIiksCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tbG9jay5jIGIvdG9vbHMvcGVyZi9idWlsdGluLWxvY2suYwppbmRleCA4OTkwODBhLi4yMjk2YzM5IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tbG9jay5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1sb2NrLmMKQEAgLTEyLDYgKzEyLDcgQEAKIAogI2luY2x1ZGUgInV0aWwvZGVidWcuaCIKICNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKKyNpbmNsdWRlICJ1dGlsL3Rvb2wuaCIKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgpAQCAtMzI1LDcgKzMyNiw3IEBACiAJZGllKCJtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWRcbiIpOwogfQogCi1zdGF0aWMgY2hhcgkJCWNvbnN0ICppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CitzdGF0aWMgY29uc3QgY2hhciAqaW5wdXRfbmFtZTsKIAogc3RydWN0IHJhd19ldmVudF9zYW1wbGUgewogCXUzMgkJCXNpemU7CkBAIC04NDUsMTIgKzg0NiwxMyBAQAogCQlkaWUoIlVua25vd24gdHlwZSBvZiBpbmZvcm1hdGlvblxuIik7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19zYW1wbGVfZXZlbnQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCitzdGF0aWMgaW50IHByb2Nlc3Nfc2FtcGxlX2V2ZW50KHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX191c2VkLAorCQkJCXVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCXN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCBfX3VzZWQsCi0JCQkJc3RydWN0IHBlcmZfc2Vzc2lvbiAqcykKKwkJCQlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKLQlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSBwZXJmX3Nlc3Npb25fX2ZpbmRuZXcocywgc2FtcGxlLT50aWQpOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIHNhbXBsZS0+dGlkKTsKIAogCWlmICh0aHJlYWQgPT0gTlVMTCkgewogCQlwcl9kZWJ1ZygicHJvYmxlbSBwcm9jZXNzaW5nICVkIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCkBAIC04NjMsNyArODY1LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwZXJmX2V2ZW50X29wcyBlb3BzID0geworc3RhdGljIHN0cnVjdCBwZXJmX3Rvb2wgZW9wcyA9IHsKIAkuc2FtcGxlCQkJPSBwcm9jZXNzX3NhbXBsZV9ldmVudCwKIAkuY29tbQkJCT0gcGVyZl9ldmVudF9fcHJvY2Vzc19jb21tLAogCS5vcmRlcmVkX3NhbXBsZXMJPSB0cnVlLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXByb2JlLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwppbmRleCA3MTBhZTNkLi41OWQ0M2FiIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tcHJvYmUuYwpAQCAtNDYsNyArNDYsNiBAQAogCiAjZGVmaW5lIERFRkFVTFRfVkFSX0ZJTFRFUiAiIV9faz8/P3RhYl8qICYgIV9fY3JjXyoiCiAjZGVmaW5lIERFRkFVTFRfRlVOQ19GSUxURVIgIiFfKiIKLSNkZWZpbmUgTUFYX1BBVEhfTEVOIDI1NgogCiAvKiBTZXNzaW9uIG1hbmFnZW1lbnQgc3RydWN0dXJlICovCiBzdGF0aWMgc3RydWN0IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwppbmRleCA2YWI1OGNjLi4wYWJmYjE4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlY29yZC5jCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAidXRpbC9ldnNlbC5oIgogI2luY2x1ZGUgInV0aWwvZGVidWcuaCIKICNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKKyNpbmNsdWRlICJ1dGlsL3Rvb2wuaCIKICNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgogI2luY2x1ZGUgInV0aWwvY3B1bWFwLmgiCiAjaW5jbHVkZSAidXRpbC90aHJlYWRfbWFwLmgiCkBAIC0zNSw1NSArMzYsMzYgQEAKIAlXUklURV9BUFBFTkQKIH07CiAKLXN0YXRpYyB1NjQJCQl1c2VyX2ludGVydmFsCQkJPSBVTExPTkdfTUFYOwotc3RhdGljIHU2NAkJCWRlZmF1bHRfaW50ZXJ2YWwJCT0gICAgICAwOworc3RydWN0IHBlcmZfcmVjb3JkIHsKKwlzdHJ1Y3QgcGVyZl90b29sCXRvb2w7CisJc3RydWN0IHBlcmZfcmVjb3JkX29wdHMJb3B0czsKKwl1NjQJCQlieXRlc193cml0dGVuOworCWNvbnN0IGNoYXIJCSpvdXRwdXRfbmFtZTsKKwlzdHJ1Y3QgcGVyZl9ldmxpc3QJKmV2bGlzdDsKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uCSpzZXNzaW9uOworCWNvbnN0IGNoYXIJCSpwcm9nbmFtZTsKKwlpbnQJCQlvdXRwdXQ7CisJdW5zaWduZWQgaW50CQlwYWdlX3NpemU7CisJaW50CQkJcmVhbHRpbWVfcHJpbzsKKwllbnVtIHdyaXRlX21vZGVfdAl3cml0ZV9tb2RlOworCWJvb2wJCQlub19idWlsZGlkOworCWJvb2wJCQlub19idWlsZGlkX2NhY2hlOworCWJvb2wJCQlmb3JjZTsKKwlib29sCQkJZmlsZV9uZXc7CisJYm9vbAkJCWFwcGVuZF9maWxlOworCWxvbmcJCQlzYW1wbGVzOworCW9mZl90CQkJcG9zdF9wcm9jZXNzaW5nX29mZnNldDsKK307CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQJCXBhZ2Vfc2l6ZTsKLXN0YXRpYyB1bnNpZ25lZCBpbnQJCW1tYXBfcGFnZXMJCQk9IFVJTlRfTUFYOwotc3RhdGljIHVuc2lnbmVkIGludAkJdXNlcl9mcmVxIAkJCT0gVUlOVF9NQVg7Ci1zdGF0aWMgaW50CQkJZnJlcQkJCQk9ICAgMTAwMDsKLXN0YXRpYyBpbnQJCQlvdXRwdXQ7Ci1zdGF0aWMgaW50CQkJcGlwZV9vdXRwdXQJCQk9ICAgICAgMDsKLXN0YXRpYyBjb25zdCBjaGFyCQkqb3V0cHV0X25hbWUJCQk9IE5VTEw7Ci1zdGF0aWMgYm9vbAkJCWdyb3VwCQkJCT0gIGZhbHNlOwotc3RhdGljIGludAkJCXJlYWx0aW1lX3ByaW8JCQk9ICAgICAgMDsKLXN0YXRpYyBib29sCQkJbm9kZWxheQkJCQk9ICBmYWxzZTsKLXN0YXRpYyBib29sCQkJcmF3X3NhbXBsZXMJCQk9ICBmYWxzZTsKLXN0YXRpYyBib29sCQkJc2FtcGxlX2lkX2FsbF9hdmFpbAkJPSAgIHRydWU7Ci1zdGF0aWMgYm9vbAkJCXN5c3RlbV93aWRlCQkJPSAgZmFsc2U7Ci1zdGF0aWMgcGlkX3QJCQl0YXJnZXRfcGlkCQkJPSAgICAgLTE7Ci1zdGF0aWMgcGlkX3QJCQl0YXJnZXRfdGlkCQkJPSAgICAgLTE7Ci1zdGF0aWMgcGlkX3QJCQljaGlsZF9waWQJCQk9ICAgICAtMTsKLXN0YXRpYyBib29sCQkJbm9faW5oZXJpdAkJCT0gIGZhbHNlOwotc3RhdGljIGVudW0gd3JpdGVfbW9kZV90CXdyaXRlX21vZGUJCQk9IFdSSVRFX0ZPUkNFOwotc3RhdGljIGJvb2wJCQljYWxsX2dyYXBoCQkJPSAgZmFsc2U7Ci1zdGF0aWMgYm9vbAkJCWluaGVyaXRfc3RhdAkJCT0gIGZhbHNlOwotc3RhdGljIGJvb2wJCQlub19zYW1wbGVzCQkJPSAgZmFsc2U7Ci1zdGF0aWMgYm9vbAkJCXNhbXBsZV9hZGRyZXNzCQkJPSAgZmFsc2U7Ci1zdGF0aWMgYm9vbAkJCXNhbXBsZV90aW1lCQkJPSAgZmFsc2U7Ci1zdGF0aWMgYm9vbAkJCW5vX2J1aWxkaWQJCQk9ICBmYWxzZTsKLXN0YXRpYyBib29sCQkJbm9fYnVpbGRpZF9jYWNoZQkJPSAgZmFsc2U7Ci1zdGF0aWMgc3RydWN0IHBlcmZfZXZsaXN0CSpldnNlbF9saXN0OwotCi1zdGF0aWMgbG9uZwkJCXNhbXBsZXMJCQkJPSAgICAgIDA7Ci1zdGF0aWMgdTY0CQkJYnl0ZXNfd3JpdHRlbgkJCT0gICAgICAwOwotCi1zdGF0aWMgaW50CQkJZmlsZV9uZXcJCQk9ICAgICAgMTsKLXN0YXRpYyBvZmZfdAkJCXBvc3RfcHJvY2Vzc2luZ19vZmZzZXQ7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGVyZl9zZXNzaW9uCSpzZXNzaW9uOwotc3RhdGljIGNvbnN0IGNoYXIJCSpjcHVfbGlzdDsKLXN0YXRpYyBjb25zdCBjaGFyICAgICAgICAgICAgICAgKnByb2duYW1lOwotCi1zdGF0aWMgdm9pZCBhZHZhbmNlX291dHB1dChzaXplX3Qgc2l6ZSkKK3N0YXRpYyB2b2lkIGFkdmFuY2Vfb3V0cHV0KHN0cnVjdCBwZXJmX3JlY29yZCAqcmVjLCBzaXplX3Qgc2l6ZSkKIHsKLQlieXRlc193cml0dGVuICs9IHNpemU7CisJcmVjLT5ieXRlc193cml0dGVuICs9IHNpemU7CiB9CiAKLXN0YXRpYyB2b2lkIHdyaXRlX291dHB1dCh2b2lkICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIHZvaWQgd3JpdGVfb3V0cHV0KHN0cnVjdCBwZXJmX3JlY29yZCAqcmVjLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQogewogCXdoaWxlIChzaXplKSB7Ci0JCWludCByZXQgPSB3cml0ZShvdXRwdXQsIGJ1Ziwgc2l6ZSk7CisJCWludCByZXQgPSB3cml0ZShyZWMtPm91dHB1dCwgYnVmLCBzaXplKTsKIAogCQlpZiAocmV0IDwgMCkKIAkJCWRpZSgiZmFpbGVkIHRvIHdyaXRlIik7CkBAIC05MSwzMCArNzMsMzMgQEAKIAkJc2l6ZSAtPSByZXQ7CiAJCWJ1ZiArPSByZXQ7CiAKLQkJYnl0ZXNfd3JpdHRlbiArPSByZXQ7CisJCXJlYy0+Ynl0ZXNfd3JpdHRlbiArPSByZXQ7CiAJfQogfQogCi1zdGF0aWMgaW50IHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCitzdGF0aWMgaW50IHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQkgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX191c2VkLAotCQkJCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiBfX3VzZWQpCisJCQkJICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSBfX3VzZWQpCiB7Ci0Jd3JpdGVfb3V0cHV0KGV2ZW50LCBldmVudC0+aGVhZGVyLnNpemUpOworCXN0cnVjdCBwZXJmX3JlY29yZCAqcmVjID0gY29udGFpbmVyX29mKHRvb2wsIHN0cnVjdCBwZXJmX3JlY29yZCwgdG9vbCk7CisJd3JpdGVfb3V0cHV0KHJlYywgZXZlbnQsIGV2ZW50LT5oZWFkZXIuc2l6ZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIG1tYXBfcmVhZChzdHJ1Y3QgcGVyZl9tbWFwICptZCkKK3N0YXRpYyB2b2lkIHBlcmZfcmVjb3JkX19tbWFwX3JlYWQoc3RydWN0IHBlcmZfcmVjb3JkICpyZWMsCisJCQkJICAgc3RydWN0IHBlcmZfbW1hcCAqbWQpCiB7CiAJdW5zaWduZWQgaW50IGhlYWQgPSBwZXJmX21tYXBfX3JlYWRfaGVhZChtZCk7CiAJdW5zaWduZWQgaW50IG9sZCA9IG1kLT5wcmV2OwotCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBtZC0+YmFzZSArIHBhZ2Vfc2l6ZTsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gbWQtPmJhc2UgKyByZWMtPnBhZ2Vfc2l6ZTsKIAl1bnNpZ25lZCBsb25nIHNpemU7CiAJdm9pZCAqYnVmOwogCiAJaWYgKG9sZCA9PSBoZWFkKQogCQlyZXR1cm47CiAKLQlzYW1wbGVzKys7CisJcmVjLT5zYW1wbGVzKys7CiAKIAlzaXplID0gaGVhZCAtIG9sZDsKIApAQCAtMTIzLDE0ICsxMDgsMTQgQEAKIAkJc2l6ZSA9IG1kLT5tYXNrICsgMSAtIChvbGQgJiBtZC0+bWFzayk7CiAJCW9sZCArPSBzaXplOwogCi0JCXdyaXRlX291dHB1dChidWYsIHNpemUpOworCQl3cml0ZV9vdXRwdXQocmVjLCBidWYsIHNpemUpOwogCX0KIAogCWJ1ZiA9ICZkYXRhW29sZCAmIG1kLT5tYXNrXTsKIAlzaXplID0gaGVhZCAtIG9sZDsKIAlvbGQgKz0gc2l6ZTsKIAotCXdyaXRlX291dHB1dChidWYsIHNpemUpOworCXdyaXRlX291dHB1dChyZWMsIGJ1Ziwgc2l6ZSk7CiAKIAltZC0+cHJldiA9IG9sZDsKIAlwZXJmX21tYXBfX3dyaXRlX3RhaWwobWQsIG9sZCk7CkBAIC0xNDksMTcgKzEzNCwxOCBAQAogCXNpZ25yID0gc2lnOwogfQogCi1zdGF0aWMgdm9pZCBzaWdfYXRleGl0KHZvaWQpCitzdGF0aWMgdm9pZCBwZXJmX3JlY29yZF9fc2lnX2V4aXQoaW50IGV4aXRfc3RhdHVzIF9fdXNlZCwgdm9pZCAqYXJnKQogeworCXN0cnVjdCBwZXJmX3JlY29yZCAqcmVjID0gYXJnOwogCWludCBzdGF0dXM7CiAKLQlpZiAoY2hpbGRfcGlkID4gMCkgeworCWlmIChyZWMtPmV2bGlzdC0+d29ya2xvYWQucGlkID4gMCkgewogCQlpZiAoIWNoaWxkX2ZpbmlzaGVkKQotCQkJa2lsbChjaGlsZF9waWQsIFNJR1RFUk0pOworCQkJa2lsbChyZWMtPmV2bGlzdC0+d29ya2xvYWQucGlkLCBTSUdURVJNKTsKIAogCQl3YWl0KCZzdGF0dXMpOwogCQlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKLQkJCXBzaWduYWwoV1RFUk1TSUcoc3RhdHVzKSwgcHJvZ25hbWUpOworCQkJcHNpZ25hbChXVEVSTVNJRyhzdGF0dXMpLCByZWMtPnByb2duYW1lKTsKIAl9CiAKIAlpZiAoc2lnbnIgPT0gLTEgfHwgc2lnbnIgPT0gU0lHVVNSMSkKQEAgLTE2OSw3OCArMTU1LDYgQEAKIAlraWxsKGdldHBpZCgpLCBzaWducik7CiB9CiAKLXN0YXRpYyB2b2lkIGNvbmZpZ19hdHRyKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCi17Ci0Jc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZldnNlbC0+YXR0cjsKLQlpbnQgdHJhY2sgPSAhZXZzZWwtPmlkeDsgLyogb25seSB0aGUgZmlyc3QgY291bnRlciBuZWVkcyB0aGVzZSAqLwotCi0JYXR0ci0+ZGlzYWJsZWQJCT0gMTsKLQlhdHRyLT5pbmhlcml0CQk9ICFub19pbmhlcml0OwotCWF0dHItPnJlYWRfZm9ybWF0CT0gUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVEIHwKLQkJCQkgIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfUlVOTklORyB8Ci0JCQkJICBQRVJGX0ZPUk1BVF9JRDsKLQotCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX0lQIHwgUEVSRl9TQU1QTEVfVElEOwotCi0JaWYgKGV2bGlzdC0+bnJfZW50cmllcyA+IDEpCi0JCWF0dHItPnNhbXBsZV90eXBlIHw9IFBFUkZfU0FNUExFX0lEOwotCi0JLyoKLQkgKiBXZSBkZWZhdWx0IHNvbWUgZXZlbnRzIHRvIGEgMSBkZWZhdWx0IGludGVydmFsLiBCdXQga2VlcAotCSAqIGl0IGEgd2VhayBhc3N1bXB0aW9uIG92ZXJyaWRhYmxlIGJ5IHRoZSB1c2VyLgotCSAqLwotCWlmICghYXR0ci0+c2FtcGxlX3BlcmlvZCB8fCAodXNlcl9mcmVxICE9IFVJTlRfTUFYICYmCi0JCQkJICAgICB1c2VyX2ludGVydmFsICE9IFVMTE9OR19NQVgpKSB7Ci0JCWlmIChmcmVxKSB7Ci0JCQlhdHRyLT5zYW1wbGVfdHlwZQl8PSBQRVJGX1NBTVBMRV9QRVJJT0Q7Ci0JCQlhdHRyLT5mcmVxCQk9IDE7Ci0JCQlhdHRyLT5zYW1wbGVfZnJlcQk9IGZyZXE7Ci0JCX0gZWxzZSB7Ci0JCQlhdHRyLT5zYW1wbGVfcGVyaW9kID0gZGVmYXVsdF9pbnRlcnZhbDsKLQkJfQotCX0KLQotCWlmIChub19zYW1wbGVzKQotCQlhdHRyLT5zYW1wbGVfZnJlcSA9IDA7Ci0KLQlpZiAoaW5oZXJpdF9zdGF0KQotCQlhdHRyLT5pbmhlcml0X3N0YXQgPSAxOwotCi0JaWYgKHNhbXBsZV9hZGRyZXNzKSB7Ci0JCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX0FERFI7Ci0JCWF0dHItPm1tYXBfZGF0YSA9IHRyYWNrOwotCX0KLQotCWlmIChjYWxsX2dyYXBoKQotCQlhdHRyLT5zYW1wbGVfdHlwZQl8PSBQRVJGX1NBTVBMRV9DQUxMQ0hBSU47Ci0KLQlpZiAoc3lzdGVtX3dpZGUpCi0JCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX0NQVTsKLQotCWlmIChzYW1wbGVfaWRfYWxsX2F2YWlsICYmCi0JICAgIChzYW1wbGVfdGltZSB8fCBzeXN0ZW1fd2lkZSB8fCAhbm9faW5oZXJpdCB8fCBjcHVfbGlzdCkpCi0JCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX1RJTUU7Ci0KLQlpZiAocmF3X3NhbXBsZXMpIHsKLQkJYXR0ci0+c2FtcGxlX3R5cGUJfD0gUEVSRl9TQU1QTEVfVElNRTsKLQkJYXR0ci0+c2FtcGxlX3R5cGUJfD0gUEVSRl9TQU1QTEVfUkFXOwotCQlhdHRyLT5zYW1wbGVfdHlwZQl8PSBQRVJGX1NBTVBMRV9DUFU7Ci0JfQotCi0JaWYgKG5vZGVsYXkpIHsKLQkJYXR0ci0+d2F0ZXJtYXJrID0gMDsKLQkJYXR0ci0+d2FrZXVwX2V2ZW50cyA9IDE7Ci0JfQotCi0JYXR0ci0+bW1hcAkJPSB0cmFjazsKLQlhdHRyLT5jb21tCQk9IHRyYWNrOwotCi0JaWYgKHRhcmdldF9waWQgPT0gLTEgJiYgdGFyZ2V0X3RpZCA9PSAtMSAmJiAhc3lzdGVtX3dpZGUpIHsKLQkJYXR0ci0+ZGlzYWJsZWQgPSAxOwotCQlhdHRyLT5lbmFibGVfb25fZXhlYyA9IDE7Ci0JfQotfQotCiBzdGF0aWMgYm9vbCBwZXJmX2V2bGlzdF9fZXF1YWwoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCiAJCQkgICAgICAgc3RydWN0IHBlcmZfZXZsaXN0ICpvdGhlcikKIHsKQEAgLTI2MCwxNSArMTc0LDE3IEBACiAJcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIG9wZW5fY291bnRlcnMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCitzdGF0aWMgdm9pZCBwZXJmX3JlY29yZF9fb3BlbihzdHJ1Y3QgcGVyZl9yZWNvcmQgKnJlYykKIHsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zLCAqZmlyc3Q7Ci0KLQlpZiAoZXZsaXN0LT5jcHVzLT5tYXBbMF0gPCAwKQotCQlub19pbmhlcml0ID0gdHJ1ZTsKKwlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCA9IHJlYy0+ZXZsaXN0OworCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gPSByZWMtPnNlc3Npb247CisJc3RydWN0IHBlcmZfcmVjb3JkX29wdHMgKm9wdHMgPSAmcmVjLT5vcHRzOwogCiAJZmlyc3QgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CiAKKwlwZXJmX2V2bGlzdF9fY29uZmlnX2F0dHJzKGV2bGlzdCwgb3B0cyk7CisKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmV2bGlzdC0+ZW50cmllcywgbm9kZSkgewogCQlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyID0gJnBvcy0+YXR0cjsKIAkJc3RydWN0IHh5YXJyYXkgKmdyb3VwX2ZkID0gTlVMTDsKQEAgLTI4NiwyOSArMjAyLDI3IEBACiAJCSAqLwogCQlib29sIHRpbWVfbmVlZGVkID0gYXR0ci0+c2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9USU1FOwogCi0JCWlmIChncm91cCAmJiBwb3MgIT0gZmlyc3QpCisJCWlmIChvcHRzLT5ncm91cCAmJiBwb3MgIT0gZmlyc3QpCiAJCQlncm91cF9mZCA9IGZpcnN0LT5mZDsKLQotCQljb25maWdfYXR0cihwb3MsIGV2bGlzdCk7CiByZXRyeV9zYW1wbGVfaWQ6Ci0JCWF0dHItPnNhbXBsZV9pZF9hbGwgPSBzYW1wbGVfaWRfYWxsX2F2YWlsID8gMSA6IDA7CisJCWF0dHItPnNhbXBsZV9pZF9hbGwgPSBvcHRzLT5zYW1wbGVfaWRfYWxsX2F2YWlsID8gMSA6IDA7CiB0cnlfYWdhaW46Ci0JCWlmIChwZXJmX2V2c2VsX19vcGVuKHBvcywgZXZsaXN0LT5jcHVzLCBldmxpc3QtPnRocmVhZHMsIGdyb3VwLAotCQkJCSAgICAgZ3JvdXBfZmQpIDwgMCkgeworCQlpZiAocGVyZl9ldnNlbF9fb3Blbihwb3MsIGV2bGlzdC0+Y3B1cywgZXZsaXN0LT50aHJlYWRzLAorCQkJCSAgICAgb3B0cy0+Z3JvdXAsIGdyb3VwX2ZkKSA8IDApIHsKIAkJCWludCBlcnIgPSBlcnJubzsKIAogCQkJaWYgKGVyciA9PSBFUEVSTSB8fCBlcnIgPT0gRUFDQ0VTKSB7CiAJCQkJdWlfX2Vycm9yX3BhcmFub2lkKCk7CiAJCQkJZXhpdChFWElUX0ZBSUxVUkUpOwotCQkJfSBlbHNlIGlmIChlcnIgPT0gIEVOT0RFViAmJiBjcHVfbGlzdCkgeworCQkJfSBlbHNlIGlmIChlcnIgPT0gIEVOT0RFViAmJiBvcHRzLT5jcHVfbGlzdCkgewogCQkJCWRpZSgiTm8gc3VjaCBkZXZpY2UgLSBkaWQgeW91IHNwZWNpZnkiCiAJCQkJCSIgYW4gb3V0LW9mLXJhbmdlIHByb2ZpbGUgQ1BVP1xuIik7Ci0JCQl9IGVsc2UgaWYgKGVyciA9PSBFSU5WQUwgJiYgc2FtcGxlX2lkX2FsbF9hdmFpbCkgeworCQkJfSBlbHNlIGlmIChlcnIgPT0gRUlOVkFMICYmIG9wdHMtPnNhbXBsZV9pZF9hbGxfYXZhaWwpIHsKIAkJCQkvKgogCQkJCSAqIE9sZCBrZXJuZWwsIG5vIGF0dHItPnNhbXBsZV9pZF90eXBlX2FsbCBmaWVsZAogCQkJCSAqLwotCQkJCXNhbXBsZV9pZF9hbGxfYXZhaWwgPSBmYWxzZTsKLQkJCQlpZiAoIXNhbXBsZV90aW1lICYmICFyYXdfc2FtcGxlcyAmJiAhdGltZV9uZWVkZWQpCisJCQkJb3B0cy0+c2FtcGxlX2lkX2FsbF9hdmFpbCA9IGZhbHNlOworCQkJCWlmICghb3B0cy0+c2FtcGxlX3RpbWUgJiYgIW9wdHMtPnJhd19zYW1wbGVzICYmICF0aW1lX25lZWRlZCkKIAkJCQkJYXR0ci0+c2FtcGxlX3R5cGUgJj0gflBFUkZfU0FNUExFX1RJTUU7CiAKIAkJCQlnb3RvIHJldHJ5X3NhbXBsZV9pZDsKQEAgLTM1OCwxMCArMjcyLDIwIEBACiAJCWV4aXQoLTEpOwogCX0KIAotCWlmIChwZXJmX2V2bGlzdF9fbW1hcChldmxpc3QsIG1tYXBfcGFnZXMsIGZhbHNlKSA8IDApCi0JCWRpZSgiZmFpbGVkIHRvIG1tYXAgd2l0aCAlZCAoJXMpXG4iLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKTsKKwlpZiAocGVyZl9ldmxpc3RfX21tYXAoZXZsaXN0LCBvcHRzLT5tbWFwX3BhZ2VzLCBmYWxzZSkgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFUEVSTSkKKwkJCWRpZSgiUGVybWlzc2lvbiBlcnJvciBtYXBwaW5nIHBhZ2VzLlxuIgorCQkJICAgICJDb25zaWRlciBpbmNyZWFzaW5nICIKKwkJCSAgICAiL3Byb2Mvc3lzL2tlcm5lbC9wZXJmX2V2ZW50X21sb2NrX2tiLFxuIgorCQkJICAgICJvciB0cnkgYWdhaW4gd2l0aCBhIHNtYWxsZXIgdmFsdWUgb2YgLW0vLS1tbWFwX3BhZ2VzLlxuIgorCQkJICAgICIoY3VycmVudCB2YWx1ZTogJWQpXG4iLCBvcHRzLT5tbWFwX3BhZ2VzKTsKKwkJZWxzZSBpZiAoIWlzX3Bvd2VyX29mXzIob3B0cy0+bW1hcF9wYWdlcykpCisJCQlkaWUoIi0tbW1hcF9wYWdlcy8tbSB2YWx1ZSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLiIpOwogCi0JaWYgKGZpbGVfbmV3KQorCQlkaWUoImZhaWxlZCB0byBtbWFwIHdpdGggJWQgKCVzKVxuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJfQorCisJaWYgKHJlYy0+ZmlsZV9uZXcpCiAJCXNlc3Npb24tPmV2bGlzdCA9IGV2bGlzdDsKIAllbHNlIHsKIAkJaWYgKCFwZXJmX2V2bGlzdF9fZXF1YWwoc2Vzc2lvbi0+ZXZsaXN0LCBldmxpc3QpKSB7CkBAIC0zNzMsMjkgKzI5NywzMiBAQAogCXBlcmZfc2Vzc2lvbl9fdXBkYXRlX3NhbXBsZV90eXBlKHNlc3Npb24pOwogfQogCi1zdGF0aWMgaW50IHByb2Nlc3NfYnVpbGRpZHModm9pZCkKK3N0YXRpYyBpbnQgcHJvY2Vzc19idWlsZGlkcyhzdHJ1Y3QgcGVyZl9yZWNvcmQgKnJlYykKIHsKLQl1NjQgc2l6ZSA9IGxzZWVrKG91dHB1dCwgMCwgU0VFS19DVVIpOworCXU2NCBzaXplID0gbHNlZWsocmVjLT5vdXRwdXQsIDAsIFNFRUtfQ1VSKTsKIAogCWlmIChzaXplID09IDApCiAJCXJldHVybiAwOwogCi0Jc2Vzc2lvbi0+ZmQgPSBvdXRwdXQ7Ci0JcmV0dXJuIF9fcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCBwb3N0X3Byb2Nlc3Npbmdfb2Zmc2V0LAotCQkJCQkgICAgICBzaXplIC0gcG9zdF9wcm9jZXNzaW5nX29mZnNldCwKKwlyZWMtPnNlc3Npb24tPmZkID0gcmVjLT5vdXRwdXQ7CisJcmV0dXJuIF9fcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhyZWMtPnNlc3Npb24sIHJlYy0+cG9zdF9wcm9jZXNzaW5nX29mZnNldCwKKwkJCQkJICAgICAgc2l6ZSAtIHJlYy0+cG9zdF9wcm9jZXNzaW5nX29mZnNldCwKIAkJCQkJICAgICAgc2l6ZSwgJmJ1aWxkX2lkX19tYXJrX2Rzb19oaXRfb3BzKTsKIH0KIAotc3RhdGljIHZvaWQgYXRleGl0X2hlYWRlcih2b2lkKQorc3RhdGljIHZvaWQgcGVyZl9yZWNvcmRfX2V4aXQoaW50IHN0YXR1cyBfX3VzZWQsIHZvaWQgKmFyZykKIHsKLQlpZiAoIXBpcGVfb3V0cHV0KSB7Ci0JCXNlc3Npb24tPmhlYWRlci5kYXRhX3NpemUgKz0gYnl0ZXNfd3JpdHRlbjsKKwlzdHJ1Y3QgcGVyZl9yZWNvcmQgKnJlYyA9IGFyZzsKIAotCQlpZiAoIW5vX2J1aWxkaWQpCi0JCQlwcm9jZXNzX2J1aWxkaWRzKCk7Ci0JCXBlcmZfc2Vzc2lvbl9fd3JpdGVfaGVhZGVyKHNlc3Npb24sIGV2c2VsX2xpc3QsIG91dHB1dCwgdHJ1ZSk7Ci0JCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHNlc3Npb24pOwotCQlwZXJmX2V2bGlzdF9fZGVsZXRlKGV2c2VsX2xpc3QpOworCWlmICghcmVjLT5vcHRzLnBpcGVfb3V0cHV0KSB7CisJCXJlYy0+c2Vzc2lvbi0+aGVhZGVyLmRhdGFfc2l6ZSArPSByZWMtPmJ5dGVzX3dyaXR0ZW47CisKKwkJaWYgKCFyZWMtPm5vX2J1aWxkaWQpCisJCQlwcm9jZXNzX2J1aWxkaWRzKHJlYyk7CisJCXBlcmZfc2Vzc2lvbl9fd3JpdGVfaGVhZGVyKHJlYy0+c2Vzc2lvbiwgcmVjLT5ldmxpc3QsCisJCQkJCSAgIHJlYy0+b3V0cHV0LCB0cnVlKTsKKwkJcGVyZl9zZXNzaW9uX19kZWxldGUocmVjLT5zZXNzaW9uKTsKKwkJcGVyZl9ldmxpc3RfX2RlbGV0ZShyZWMtPmV2bGlzdCk7CiAJCXN5bWJvbF9fZXhpdCgpOwogCX0KIH0KQEAgLTQwMyw3ICszMzAsNyBAQAogc3RhdGljIHZvaWQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9ndWVzdF9vcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgdm9pZCAqZGF0YSkKIHsKIAlpbnQgZXJyOwotCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnBzZXNzaW9uID0gZGF0YTsKKwlzdHJ1Y3QgcGVyZl90b29sICp0b29sID0gZGF0YTsKIAogCWlmIChtYWNoaW5lX19pc19ob3N0KG1hY2hpbmUpKQogCQlyZXR1cm47CkBAIC00MTYsOCArMzQzLDggQEAKIAkgKm1ldGhvZCBpcyB1c2VkIHRvIGF2b2lkIHN5bWJvbCBtaXNzaW5nIHdoZW4gdGhlIGZpcnN0IGFkZHIgaXMKIAkgKmluIG1vZHVsZSBpbnN0ZWFkIG9mIGluIGd1ZXN0IGtlcm5lbC4KIAkgKi8KLQllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX21vZHVsZXMocHJvY2Vzc19zeW50aGVzaXplZF9ldmVudCwKLQkJCQkJICAgICBwc2Vzc2lvbiwgbWFjaGluZSk7CisJZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tb2R1bGVzKHRvb2wsIHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQsCisJCQkJCSAgICAgbWFjaGluZSk7CiAJaWYgKGVyciA8IDApCiAJCXByX2VycigiQ291bGRuJ3QgcmVjb3JkIGd1ZXN0IGtlcm5lbCBbJWRdJ3MgcmVmZXJlbmNlIgogCQkgICAgICAgIiByZWxvY2F0aW9uIHN5bWJvbC5cbiIsIG1hY2hpbmUtPnBpZCk7CkBAIC00MjYsMTIgKzM1MywxMSBAQAogCSAqIFdlIHVzZSBfc3RleHQgZm9yIGd1ZXN0IGtlcm5lbCBiZWNhdXNlIGd1ZXN0IGtlcm5lbCdzIC9wcm9jL2thbGxzeW1zCiAJICogaGF2ZSBubyBfdGV4dCBzb21ldGltZXMuCiAJICovCi0JZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9rZXJuZWxfbW1hcChwcm9jZXNzX3N5bnRoZXNpemVkX2V2ZW50LAotCQkJCQkJIHBzZXNzaW9uLCBtYWNoaW5lLCAiX3RleHQiKTsKKwllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2tlcm5lbF9tbWFwKHRvb2wsIHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQsCisJCQkJCQkgbWFjaGluZSwgIl90ZXh0Iik7CiAJaWYgKGVyciA8IDApCi0JCWVyciA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfa2VybmVsX21tYXAocHJvY2Vzc19zeW50aGVzaXplZF9ldmVudCwKLQkJCQkJCQkgcHNlc3Npb24sIG1hY2hpbmUsCi0JCQkJCQkJICJfc3RleHQiKTsKKwkJZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9rZXJuZWxfbW1hcCh0b29sLCBwcm9jZXNzX3N5bnRoZXNpemVkX2V2ZW50LAorCQkJCQkJCSBtYWNoaW5lLCAiX3N0ZXh0Iik7CiAJaWYgKGVyciA8IDApCiAJCXByX2VycigiQ291bGRuJ3QgcmVjb3JkIGd1ZXN0IGtlcm5lbCBbJWRdJ3MgcmVmZXJlbmNlIgogCQkgICAgICAgIiByZWxvY2F0aW9uIHN5bWJvbC5cbiIsIG1hY2hpbmUtPnBpZCk7CkBAIC00NDIsNzMgKzM2OCw3MSBAQAogCS50eXBlID0gUEVSRl9SRUNPUkRfRklOSVNIRURfUk9VTkQsCiB9OwogCi1zdGF0aWMgdm9pZCBtbWFwX3JlYWRfYWxsKHZvaWQpCitzdGF0aWMgdm9pZCBwZXJmX3JlY29yZF9fbW1hcF9yZWFkX2FsbChzdHJ1Y3QgcGVyZl9yZWNvcmQgKnJlYykKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBldnNlbF9saXN0LT5ucl9tbWFwczsgaSsrKSB7Ci0JCWlmIChldnNlbF9saXN0LT5tbWFwW2ldLmJhc2UpCi0JCQltbWFwX3JlYWQoJmV2c2VsX2xpc3QtPm1tYXBbaV0pOworCWZvciAoaSA9IDA7IGkgPCByZWMtPmV2bGlzdC0+bnJfbW1hcHM7IGkrKykgeworCQlpZiAocmVjLT5ldmxpc3QtPm1tYXBbaV0uYmFzZSkKKwkJCXBlcmZfcmVjb3JkX19tbWFwX3JlYWQocmVjLCAmcmVjLT5ldmxpc3QtPm1tYXBbaV0pOwogCX0KIAotCWlmIChwZXJmX2hlYWRlcl9faGFzX2ZlYXQoJnNlc3Npb24tPmhlYWRlciwgSEVBREVSX1RSQUNFX0lORk8pKQotCQl3cml0ZV9vdXRwdXQoJmZpbmlzaGVkX3JvdW5kX2V2ZW50LCBzaXplb2YoZmluaXNoZWRfcm91bmRfZXZlbnQpKTsKKwlpZiAocGVyZl9oZWFkZXJfX2hhc19mZWF0KCZyZWMtPnNlc3Npb24tPmhlYWRlciwgSEVBREVSX1RSQUNFX0lORk8pKQorCQl3cml0ZV9vdXRwdXQocmVjLCAmZmluaXNoZWRfcm91bmRfZXZlbnQsIHNpemVvZihmaW5pc2hlZF9yb3VuZF9ldmVudCkpOwogfQogCi1zdGF0aWMgaW50IF9fY21kX3JlY29yZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCitzdGF0aWMgaW50IF9fY21kX3JlY29yZChzdHJ1Y3QgcGVyZl9yZWNvcmQgKnJlYywgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQogewogCXN0cnVjdCBzdGF0IHN0OwogCWludCBmbGFnczsKLQlpbnQgZXJyOworCWludCBlcnIsIG91dHB1dDsKIAl1bnNpZ25lZCBsb25nIHdha2luZyA9IDA7Ci0JaW50IGNoaWxkX3JlYWR5X3BpcGVbMl0sIGdvX3BpcGVbMl07CiAJY29uc3QgYm9vbCBmb3JrcyA9IGFyZ2MgPiAwOwotCWNoYXIgYnVmOwogCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lOworCXN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgPSAmcmVjLT50b29sOworCXN0cnVjdCBwZXJmX3JlY29yZF9vcHRzICpvcHRzID0gJnJlYy0+b3B0czsKKwlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2c2VsX2xpc3QgPSByZWMtPmV2bGlzdDsKKwljb25zdCBjaGFyICpvdXRwdXRfbmFtZSA9IHJlYy0+b3V0cHV0X25hbWU7CisJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbjsKIAotCXByb2duYW1lID0gYXJndlswXTsKKwlyZWMtPnByb2duYW1lID0gYXJndlswXTsKIAotCXBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CisJcmVjLT5wYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFX1NJWkUpOwogCi0JYXRleGl0KHNpZ19hdGV4aXQpOworCW9uX2V4aXQocGVyZl9yZWNvcmRfX3NpZ19leGl0LCByZWMpOwogCXNpZ25hbChTSUdDSExELCBzaWdfaGFuZGxlcik7CiAJc2lnbmFsKFNJR0lOVCwgc2lnX2hhbmRsZXIpOwogCXNpZ25hbChTSUdVU1IxLCBzaWdfaGFuZGxlcik7CiAKLQlpZiAoZm9ya3MgJiYgKHBpcGUoY2hpbGRfcmVhZHlfcGlwZSkgPCAwIHx8IHBpcGUoZ29fcGlwZSkgPCAwKSkgewotCQlwZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgcGlwZXMiKTsKLQkJZXhpdCgtMSk7Ci0JfQotCiAJaWYgKCFvdXRwdXRfbmFtZSkgewogCQlpZiAoIWZzdGF0KFNURE9VVF9GSUxFTk8sICZzdCkgJiYgU19JU0ZJRk8oc3Quc3RfbW9kZSkpCi0JCQlwaXBlX291dHB1dCA9IDE7CisJCQlvcHRzLT5waXBlX291dHB1dCA9IHRydWU7CiAJCWVsc2UKLQkJCW91dHB1dF9uYW1lID0gInBlcmYuZGF0YSI7CisJCQlyZWMtPm91dHB1dF9uYW1lID0gb3V0cHV0X25hbWUgPSAicGVyZi5kYXRhIjsKIAl9CiAJaWYgKG91dHB1dF9uYW1lKSB7CiAJCWlmICghc3RyY21wKG91dHB1dF9uYW1lLCAiLSIpKQotCQkJcGlwZV9vdXRwdXQgPSAxOworCQkJb3B0cy0+cGlwZV9vdXRwdXQgPSB0cnVlOwogCQllbHNlIGlmICghc3RhdChvdXRwdXRfbmFtZSwgJnN0KSAmJiBzdC5zdF9zaXplKSB7Ci0JCQlpZiAod3JpdGVfbW9kZSA9PSBXUklURV9GT1JDRSkgeworCQkJaWYgKHJlYy0+d3JpdGVfbW9kZSA9PSBXUklURV9GT1JDRSkgewogCQkJCWNoYXIgb2xkbmFtZVtQQVRIX01BWF07CiAJCQkJc25wcmludGYob2xkbmFtZSwgc2l6ZW9mKG9sZG5hbWUpLCAiJXMub2xkIiwKIAkJCQkJIG91dHB1dF9uYW1lKTsKIAkJCQl1bmxpbmsob2xkbmFtZSk7CiAJCQkJcmVuYW1lKG91dHB1dF9uYW1lLCBvbGRuYW1lKTsKIAkJCX0KLQkJfSBlbHNlIGlmICh3cml0ZV9tb2RlID09IFdSSVRFX0FQUEVORCkgewotCQkJd3JpdGVfbW9kZSA9IFdSSVRFX0ZPUkNFOworCQl9IGVsc2UgaWYgKHJlYy0+d3JpdGVfbW9kZSA9PSBXUklURV9BUFBFTkQpIHsKKwkJCXJlYy0+d3JpdGVfbW9kZSA9IFdSSVRFX0ZPUkNFOwogCQl9CiAJfQogCiAJZmxhZ3MgPSBPX0NSRUFUfE9fUkRXUjsKLQlpZiAod3JpdGVfbW9kZSA9PSBXUklURV9BUFBFTkQpCi0JCWZpbGVfbmV3ID0gMDsKKwlpZiAocmVjLT53cml0ZV9tb2RlID09IFdSSVRFX0FQUEVORCkKKwkJcmVjLT5maWxlX25ldyA9IDA7CiAJZWxzZQogCQlmbGFncyB8PSBPX1RSVU5DOwogCi0JaWYgKHBpcGVfb3V0cHV0KQorCWlmIChvcHRzLT5waXBlX291dHB1dCkKIAkJb3V0cHV0ID0gU1RET1VUX0ZJTEVOTzsKIAllbHNlCiAJCW91dHB1dCA9IG9wZW4ob3V0cHV0X25hbWUsIGZsYWdzLCBTX0lSVVNSIHwgU19JV1VTUik7CkBAIC01MTcsMTcgKzQ0MSwyMSBAQAogCQlleGl0KC0xKTsKIAl9CiAKKwlyZWMtPm91dHB1dCA9IG91dHB1dDsKKwogCXNlc3Npb24gPSBwZXJmX3Nlc3Npb25fX25ldyhvdXRwdXRfbmFtZSwgT19XUk9OTFksCi0JCQkJICAgIHdyaXRlX21vZGUgPT0gV1JJVEVfRk9SQ0UsIGZhbHNlLCBOVUxMKTsKKwkJCQkgICAgcmVjLT53cml0ZV9tb2RlID09IFdSSVRFX0ZPUkNFLCBmYWxzZSwgTlVMTCk7CiAJaWYgKHNlc3Npb24gPT0gTlVMTCkgewogCQlwcl9lcnIoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciByZWFkaW5nIHBlcmYgZmlsZSBoZWFkZXJcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JaWYgKCFub19idWlsZGlkKQorCXJlYy0+c2Vzc2lvbiA9IHNlc3Npb247CisKKwlpZiAoIXJlYy0+bm9fYnVpbGRpZCkKIAkJcGVyZl9oZWFkZXJfX3NldF9mZWF0KCZzZXNzaW9uLT5oZWFkZXIsIEhFQURFUl9CVUlMRF9JRCk7CiAKLQlpZiAoIWZpbGVfbmV3KSB7CisJaWYgKCFyZWMtPmZpbGVfbmV3KSB7CiAJCWVyciA9IHBlcmZfc2Vzc2lvbl9fcmVhZF9oZWFkZXIoc2Vzc2lvbiwgb3V0cHV0KTsKIAkJaWYgKGVyciA8IDApCiAJCQlnb3RvIG91dF9kZWxldGVfc2Vzc2lvbjsKQEAgLTU0OSw5NCArNDc3LDU3IEBACiAJcGVyZl9oZWFkZXJfX3NldF9mZWF0KCZzZXNzaW9uLT5oZWFkZXIsIEhFQURFUl9OVU1BX1RPUE9MT0dZKTsKIAlwZXJmX2hlYWRlcl9fc2V0X2ZlYXQoJnNlc3Npb24tPmhlYWRlciwgSEVBREVSX0NQVUlEKTsKIAotCS8qIDUxMiBraUI6IGRlZmF1bHQgYW1vdW50IG9mIHVucHJpdmlsZWdlZCBtbG9ja2VkIG1lbW9yeSAqLwotCWlmIChtbWFwX3BhZ2VzID09IFVJTlRfTUFYKQotCQltbWFwX3BhZ2VzID0gKDUxMiAqIDEwMjQpIC8gcGFnZV9zaXplOwotCiAJaWYgKGZvcmtzKSB7Ci0JCWNoaWxkX3BpZCA9IGZvcmsoKTsKLQkJaWYgKGNoaWxkX3BpZCA8IDApIHsKLQkJCXBlcnJvcigiZmFpbGVkIHRvIGZvcmsiKTsKLQkJCWV4aXQoLTEpOworCQllcnIgPSBwZXJmX2V2bGlzdF9fcHJlcGFyZV93b3JrbG9hZChldnNlbF9saXN0LCBvcHRzLCBhcmd2KTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCXByX2VycigiQ291bGRuJ3QgcnVuIHRoZSB3b3JrbG9hZCFcbiIpOworCQkJZ290byBvdXRfZGVsZXRlX3Nlc3Npb247CiAJCX0KLQotCQlpZiAoIWNoaWxkX3BpZCkgewotCQkJaWYgKHBpcGVfb3V0cHV0KQotCQkJCWR1cDIoMiwgMSk7Ci0JCQljbG9zZShjaGlsZF9yZWFkeV9waXBlWzBdKTsKLQkJCWNsb3NlKGdvX3BpcGVbMV0pOwotCQkJZmNudGwoZ29fcGlwZVswXSwgRl9TRVRGRCwgRkRfQ0xPRVhFQyk7Ci0KLQkJCS8qCi0JCQkgKiBEbyBhIGR1bW15IGV4ZWN2cCB0byBnZXQgdGhlIFBMVCBlbnRyeSByZXNvbHZlZCwKLQkJCSAqIHNvIHdlIGF2b2lkIHRoZSByZXNvbHZlciBvdmVyaGVhZCBvbiB0aGUgcmVhbAotCQkJICogZXhlY3ZwIGNhbGwuCi0JCQkgKi8KLQkJCWV4ZWN2cCgiIiwgKGNoYXIgKiopYXJndik7Ci0KLQkJCS8qCi0JCQkgKiBUZWxsIHRoZSBwYXJlbnQgd2UncmUgcmVhZHkgdG8gZ28KLQkJCSAqLwotCQkJY2xvc2UoY2hpbGRfcmVhZHlfcGlwZVsxXSk7Ci0KLQkJCS8qCi0JCQkgKiBXYWl0IHVudGlsIHRoZSBwYXJlbnQgdGVsbHMgdXMgdG8gZ28uCi0JCQkgKi8KLQkJCWlmIChyZWFkKGdvX3BpcGVbMF0sICZidWYsIDEpID09IC0xKQotCQkJCXBlcnJvcigidW5hYmxlIHRvIHJlYWQgcGlwZSIpOwotCi0JCQlleGVjdnAoYXJndlswXSwgKGNoYXIgKiopYXJndik7Ci0KLQkJCXBlcnJvcihhcmd2WzBdKTsKLQkJCWtpbGwoZ2V0cHBpZCgpLCBTSUdVU1IxKTsKLQkJCWV4aXQoLTEpOwotCQl9Ci0KLQkJaWYgKCFzeXN0ZW1fd2lkZSAmJiB0YXJnZXRfdGlkID09IC0xICYmIHRhcmdldF9waWQgPT0gLTEpCi0JCQlldnNlbF9saXN0LT50aHJlYWRzLT5tYXBbMF0gPSBjaGlsZF9waWQ7Ci0KLQkJY2xvc2UoY2hpbGRfcmVhZHlfcGlwZVsxXSk7Ci0JCWNsb3NlKGdvX3BpcGVbMF0pOwotCQkvKgotCQkgKiB3YWl0IGZvciBjaGlsZCB0byBzZXR0bGUKLQkJICovCi0JCWlmIChyZWFkKGNoaWxkX3JlYWR5X3BpcGVbMF0sICZidWYsIDEpID09IC0xKSB7Ci0JCQlwZXJyb3IoInVuYWJsZSB0byByZWFkIHBpcGUiKTsKLQkJCWV4aXQoLTEpOwotCQl9Ci0JCWNsb3NlKGNoaWxkX3JlYWR5X3BpcGVbMF0pOwogCX0KIAotCW9wZW5fY291bnRlcnMoZXZzZWxfbGlzdCk7CisJcGVyZl9yZWNvcmRfX29wZW4ocmVjKTsKIAogCS8qCi0JICogcGVyZl9zZXNzaW9uX19kZWxldGUoc2Vzc2lvbikgd2lsbCBiZSBjYWxsZWQgYXQgYXRleGl0X2hlYWRlcigpCisJICogcGVyZl9zZXNzaW9uX19kZWxldGUoc2Vzc2lvbikgd2lsbCBiZSBjYWxsZWQgYXQgcGVyZl9yZWNvcmRfX2V4aXQoKQogCSAqLwotCWF0ZXhpdChhdGV4aXRfaGVhZGVyKTsKKwlvbl9leGl0KHBlcmZfcmVjb3JkX19leGl0LCByZWMpOwogCi0JaWYgKHBpcGVfb3V0cHV0KSB7CisJaWYgKG9wdHMtPnBpcGVfb3V0cHV0KSB7CiAJCWVyciA9IHBlcmZfaGVhZGVyX193cml0ZV9waXBlKG91dHB1dCk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKLQl9IGVsc2UgaWYgKGZpbGVfbmV3KSB7CisJfSBlbHNlIGlmIChyZWMtPmZpbGVfbmV3KSB7CiAJCWVyciA9IHBlcmZfc2Vzc2lvbl9fd3JpdGVfaGVhZGVyKHNlc3Npb24sIGV2c2VsX2xpc3QsCiAJCQkJCQkgb3V0cHV0LCBmYWxzZSk7CiAJCWlmIChlcnIgPCAwKQogCQkJcmV0dXJuIGVycjsKIAl9CiAKLQlwb3N0X3Byb2Nlc3Npbmdfb2Zmc2V0ID0gbHNlZWsob3V0cHV0LCAwLCBTRUVLX0NVUik7CisJaWYgKCEhcmVjLT5ub19idWlsZGlkCisJICAgICYmICFwZXJmX2hlYWRlcl9faGFzX2ZlYXQoJnNlc3Npb24tPmhlYWRlciwgSEVBREVSX0JVSUxEX0lEKSkgeworCQlwcl9lcnIoIkNvdWxkbid0IGdlbmVyYXRpbmcgYnVpbGRpZHMuICIKKwkJICAgICAgICJVc2UgLS1uby1idWlsZGlkIHRvIHByb2ZpbGUgYW55d2F5LlxuIik7CisJCXJldHVybiAtMTsKKwl9CiAKLQlpZiAocGlwZV9vdXRwdXQpIHsKLQkJZXJyID0gcGVyZl9zZXNzaW9uX19zeW50aGVzaXplX2F0dHJzKHNlc3Npb24sCi0JCQkJCQkgICAgIHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQpOworCXJlYy0+cG9zdF9wcm9jZXNzaW5nX29mZnNldCA9IGxzZWVrKG91dHB1dCwgMCwgU0VFS19DVVIpOworCisJbWFjaGluZSA9IHBlcmZfc2Vzc2lvbl9fZmluZF9ob3N0X21hY2hpbmUoc2Vzc2lvbik7CisJaWYgKCFtYWNoaW5lKSB7CisJCXByX2VycigiQ291bGRuJ3QgZmluZCBuYXRpdmUga2VybmVsIGluZm9ybWF0aW9uLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAob3B0cy0+cGlwZV9vdXRwdXQpIHsKKwkJZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9hdHRycyh0b29sLCBzZXNzaW9uLAorCQkJCQkJICAgcHJvY2Vzc19zeW50aGVzaXplZF9ldmVudCk7CiAJCWlmIChlcnIgPCAwKSB7CiAJCQlwcl9lcnIoIkNvdWxkbid0IHN5bnRoZXNpemUgYXR0cnMuXG4iKTsKIAkJCXJldHVybiBlcnI7CiAJCX0KIAotCQllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2V2ZW50X3R5cGVzKHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQsCi0JCQkJCQkJIHNlc3Npb24pOworCQllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2V2ZW50X3R5cGVzKHRvb2wsIHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQsCisJCQkJCQkJIG1hY2hpbmUpOwogCQlpZiAoZXJyIDwgMCkgewogCQkJcHJfZXJyKCJDb3VsZG4ndCBzeW50aGVzaXplIGV2ZW50X3R5cGVzLlxuIik7CiAJCQlyZXR1cm4gZXJyOwpAQCAtNjUxLDU2ICs1NDIsNDkgQEAKIAkJCSAqIHJldHVybiB0aGlzIG1vcmUgcHJvcGVybHkgYW5kIGFsc28KIAkJCSAqIHByb3BhZ2F0ZSBlcnJvcnMgdGhhdCBub3cgYXJlIGNhbGxpbmcgZGllKCkKIAkJCSAqLwotCQkJZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90cmFjaW5nX2RhdGEob3V0cHV0LCBldnNlbF9saXN0LAotCQkJCQkJCQkgIHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQsCi0JCQkJCQkJCSAgc2Vzc2lvbik7CisJCQllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX3RyYWNpbmdfZGF0YSh0b29sLCBvdXRwdXQsIGV2c2VsX2xpc3QsCisJCQkJCQkJCSAgcHJvY2Vzc19zeW50aGVzaXplZF9ldmVudCk7CiAJCQlpZiAoZXJyIDw9IDApIHsKIAkJCQlwcl9lcnIoIkNvdWxkbid0IHJlY29yZCB0cmFjaW5nIGRhdGEuXG4iKTsKIAkJCQlyZXR1cm4gZXJyOwogCQkJfQotCQkJYWR2YW5jZV9vdXRwdXQoZXJyKTsKKwkJCWFkdmFuY2Vfb3V0cHV0KHJlYywgZXJyKTsKIAkJfQogCX0KIAotCW1hY2hpbmUgPSBwZXJmX3Nlc3Npb25fX2ZpbmRfaG9zdF9tYWNoaW5lKHNlc3Npb24pOwotCWlmICghbWFjaGluZSkgewotCQlwcl9lcnIoIkNvdWxkbid0IGZpbmQgbmF0aXZlIGtlcm5lbCBpbmZvcm1hdGlvbi5cbiIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9rZXJuZWxfbW1hcChwcm9jZXNzX3N5bnRoZXNpemVkX2V2ZW50LAotCQkJCQkJIHNlc3Npb24sIG1hY2hpbmUsICJfdGV4dCIpOworCWVyciA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfa2VybmVsX21tYXAodG9vbCwgcHJvY2Vzc19zeW50aGVzaXplZF9ldmVudCwKKwkJCQkJCSBtYWNoaW5lLCAiX3RleHQiKTsKIAlpZiAoZXJyIDwgMCkKLQkJZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9rZXJuZWxfbW1hcChwcm9jZXNzX3N5bnRoZXNpemVkX2V2ZW50LAotCQkJCQkJCSBzZXNzaW9uLCBtYWNoaW5lLCAiX3N0ZXh0Iik7CisJCWVyciA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfa2VybmVsX21tYXAodG9vbCwgcHJvY2Vzc19zeW50aGVzaXplZF9ldmVudCwKKwkJCQkJCQkgbWFjaGluZSwgIl9zdGV4dCIpOwogCWlmIChlcnIgPCAwKQogCQlwcl9lcnIoIkNvdWxkbid0IHJlY29yZCBrZXJuZWwgcmVmZXJlbmNlIHJlbG9jYXRpb24gc3ltYm9sXG4iCiAJCSAgICAgICAiU3ltYm9sIHJlc29sdXRpb24gbWF5IGJlIHNrZXdlZCBpZiByZWxvY2F0aW9uIHdhcyB1c2VkIChlLmcuIGtleGVjKS5cbiIKIAkJICAgICAgICJDaGVjayAvcHJvYy9rYWxsc3ltcyBwZXJtaXNzaW9uIG9yIHJ1biBhcyByb290LlxuIik7CiAKLQllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX21vZHVsZXMocHJvY2Vzc19zeW50aGVzaXplZF9ldmVudCwKLQkJCQkJICAgICBzZXNzaW9uLCBtYWNoaW5lKTsKKwllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX21vZHVsZXModG9vbCwgcHJvY2Vzc19zeW50aGVzaXplZF9ldmVudCwKKwkJCQkJICAgICBtYWNoaW5lKTsKIAlpZiAoZXJyIDwgMCkKIAkJcHJfZXJyKCJDb3VsZG4ndCByZWNvcmQga2VybmVsIG1vZHVsZSBpbmZvcm1hdGlvbi5cbiIKIAkJICAgICAgICJTeW1ib2wgcmVzb2x1dGlvbiBtYXkgYmUgc2tld2VkIGlmIHJlbG9jYXRpb24gd2FzIHVzZWQgKGUuZy4ga2V4ZWMpLlxuIgogCQkgICAgICAgIkNoZWNrIC9wcm9jL21vZHVsZXMgcGVybWlzc2lvbiBvciBydW4gYXMgcm9vdC5cbiIpOwogCiAJaWYgKHBlcmZfZ3Vlc3QpCi0JCXBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19tYWNoaW5lcyhzZXNzaW9uLAorCQlwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfbWFjaGluZXMoc2Vzc2lvbiwgdG9vbCwKIAkJCQkJICAgICAgIHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfZ3Vlc3Rfb3MpOwogCi0JaWYgKCFzeXN0ZW1fd2lkZSkKLQkJcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRfbWFwKGV2c2VsX2xpc3QtPnRocmVhZHMsCisJaWYgKCFvcHRzLT5zeXN0ZW1fd2lkZSkKKwkJcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRfbWFwKHRvb2wsIGV2c2VsX2xpc3QtPnRocmVhZHMsCiAJCQkJCQkgIHByb2Nlc3Nfc3ludGhlc2l6ZWRfZXZlbnQsCi0JCQkJCQkgIHNlc3Npb24pOworCQkJCQkJICBtYWNoaW5lKTsKIAllbHNlCi0JCXBlcmZfZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkcyhwcm9jZXNzX3N5bnRoZXNpemVkX2V2ZW50LAotCQkJCQkgICAgICAgc2Vzc2lvbik7CisJCXBlcmZfZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkcyh0b29sLCBwcm9jZXNzX3N5bnRoZXNpemVkX2V2ZW50LAorCQkJCQkgICAgICAgbWFjaGluZSk7CiAKLQlpZiAocmVhbHRpbWVfcHJpbykgeworCWlmIChyZWMtPnJlYWx0aW1lX3ByaW8pIHsKIAkJc3RydWN0IHNjaGVkX3BhcmFtIHBhcmFtOwogCi0JCXBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gcmVhbHRpbWVfcHJpbzsKKwkJcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSByZWMtPnJlYWx0aW1lX3ByaW87CiAJCWlmIChzY2hlZF9zZXRzY2hlZHVsZXIoMCwgU0NIRURfRklGTywgJnBhcmFtKSkgewogCQkJcHJfZXJyKCJDb3VsZCBub3Qgc2V0IHJlYWx0aW1lIHByaW9yaXR5LlxuIik7CiAJCQlleGl0KC0xKTsKQEAgLTcxMywxNCArNTk3LDE0IEBACiAJICogTGV0IHRoZSBjaGlsZCByaXAKIAkgKi8KIAlpZiAoZm9ya3MpCi0JCWNsb3NlKGdvX3BpcGVbMV0pOworCQlwZXJmX2V2bGlzdF9fc3RhcnRfd29ya2xvYWQoZXZzZWxfbGlzdCk7CiAKIAlmb3IgKDs7KSB7Ci0JCWludCBoaXRzID0gc2FtcGxlczsKKwkJaW50IGhpdHMgPSByZWMtPnNhbXBsZXM7CiAKLQkJbW1hcF9yZWFkX2FsbCgpOworCQlwZXJmX3JlY29yZF9fbW1hcF9yZWFkX2FsbChyZWMpOwogCi0JCWlmIChoaXRzID09IHNhbXBsZXMpIHsKKwkJaWYgKGhpdHMgPT0gcmVjLT5zYW1wbGVzKSB7CiAJCQlpZiAoZG9uZSkKIAkJCQlicmVhazsKIAkJCWVyciA9IHBvbGwoZXZzZWxfbGlzdC0+cG9sbGZkLCBldnNlbF9saXN0LT5ucl9mZHMsIC0xKTsKQEAgLTc0MSw5ICs2MjUsOSBAQAogCSAqLwogCWZwcmludGYoc3RkZXJyLAogCQkiWyBwZXJmIHJlY29yZDogQ2FwdHVyZWQgYW5kIHdyb3RlICUuM2YgTUIgJXMgKH4lIiBQUkl1NjQgIiBzYW1wbGVzKSBdXG4iLAotCQkoZG91YmxlKWJ5dGVzX3dyaXR0ZW4gLyAxMDI0LjAgLyAxMDI0LjAsCisJCShkb3VibGUpcmVjLT5ieXRlc193cml0dGVuIC8gMTAyNC4wIC8gMTAyNC4wLAogCQlvdXRwdXRfbmFtZSwKLQkJYnl0ZXNfd3JpdHRlbiAvIDI0KTsKKwkJcmVjLT5ieXRlc193cml0dGVuIC8gMjQpOwogCiAJcmV0dXJuIDA7CiAKQEAgLTc1OCw1OCArNjQyLDg5IEBACiAJTlVMTAogfTsKIAotc3RhdGljIGJvb2wgZm9yY2UsIGFwcGVuZF9maWxlOworLyoKKyAqIFhYWCBJZGVhbGx5IHdvdWxkIGJlIGxvY2FsIHRvIGNtZF9yZWNvcmQoKSBhbmQgcGFzc2VkIHRvIGEgcGVyZl9yZWNvcmRfX25ldworICogYmVjYXVzZSB3ZSBuZWVkIHRvIGhhdmUgYWNjZXNzIHRvIGl0IGluIHBlcmZfcmVjb3JkX19leGl0LCB0aGF0IGlzIGNhbGxlZAorICogYWZ0ZXIgY21kX3JlY29yZCgpIGV4aXRzLCBidXQgc2luY2UgcmVjb3JkX29wdGlvbnMgbmVlZCB0byBiZSBhY2Nlc3NpYmxlIHRvCisgKiBidWlsdGluLXNjcmlwdCwgbGVhdmUgaXQgaGVyZS4KKyAqCisgKiBBdCBsZWFzdCB3ZSBkb24ndCBvdWNoIGl0IGluIGFsbCB0aGUgb3RoZXIgZnVuY3Rpb25zIGhlcmUgZGlyZWN0bHkuCisgKgorICogSnVzdCBzYXkgbm8gdG8gdG9ucyBvZiBnbG9iYWwgdmFyaWFibGVzLCBzaWdoLgorICovCitzdGF0aWMgc3RydWN0IHBlcmZfcmVjb3JkIHJlY29yZCA9IHsKKwkub3B0cyA9IHsKKwkJLnRhcmdldF9waWQJICAgICA9IC0xLAorCQkudGFyZ2V0X3RpZAkgICAgID0gLTEsCisJCS5tbWFwX3BhZ2VzCSAgICAgPSBVSU5UX01BWCwKKwkJLnVzZXJfZnJlcQkgICAgID0gVUlOVF9NQVgsCisJCS51c2VyX2ludGVydmFsCSAgICAgPSBVTExPTkdfTUFYLAorCQkuZnJlcQkJICAgICA9IDEwMDAsCisJCS5zYW1wbGVfaWRfYWxsX2F2YWlsID0gdHJ1ZSwKKwl9LAorCS53cml0ZV9tb2RlID0gV1JJVEVfRk9SQ0UsCisJLmZpbGVfbmV3ICAgPSB0cnVlLAorfTsKIAorLyoKKyAqIFhYWCBXaWxsIHN0YXkgYSBnbG9iYWwgdmFyaWFibGUgdGlsbCB3ZSBmaXggYnVpbHRpbi1zY3JpcHQuYyB0byBzdG9wIG1lc3NpbmcKKyAqIHdpdGggaXQgYW5kIHN3aXRjaCB0byB1c2UgdGhlIGxpYnJhcnkgZnVuY3Rpb25zIGluIHBlcmZfZXZsaXN0IHRoYXQgY2FtZQorICogZnJvbSBidWlsdGluLXJlY29yZC5jLCBpLmUuIHVzZSBwZXJmX3JlY29yZF9vcHRzLAorICogcGVyZl9ldmxpc3RfX3ByZXBhcmVfd29ya2xvYWQsIGV0YyBpbnN0ZWFkIG9mIGZvcmsrZXhlYydpbiAncGVyZiByZWNvcmQnLAorICogdXNpbmcgcGlwZXMsIGV0Yy4KKyAqLwogY29uc3Qgc3RydWN0IG9wdGlvbiByZWNvcmRfb3B0aW9uc1tdID0gewotCU9QVF9DQUxMQkFDSygnZScsICJldmVudCIsICZldnNlbF9saXN0LCAiZXZlbnQiLAorCU9QVF9DQUxMQkFDSygnZScsICJldmVudCIsICZyZWNvcmQuZXZsaXN0LCAiZXZlbnQiLAogCQkgICAgICJldmVudCBzZWxlY3Rvci4gdXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYXZhaWxhYmxlIGV2ZW50cyIsCiAJCSAgICAgcGFyc2VfZXZlbnRzX29wdGlvbiksCi0JT1BUX0NBTExCQUNLKDAsICJmaWx0ZXIiLCAmZXZzZWxfbGlzdCwgImZpbHRlciIsCisJT1BUX0NBTExCQUNLKDAsICJmaWx0ZXIiLCAmcmVjb3JkLmV2bGlzdCwgImZpbHRlciIsCiAJCSAgICAgImV2ZW50IGZpbHRlciIsIHBhcnNlX2ZpbHRlciksCi0JT1BUX0lOVEVHRVIoJ3AnLCAicGlkIiwgJnRhcmdldF9waWQsCisJT1BUX0lOVEVHRVIoJ3AnLCAicGlkIiwgJnJlY29yZC5vcHRzLnRhcmdldF9waWQsCiAJCSAgICAicmVjb3JkIGV2ZW50cyBvbiBleGlzdGluZyBwcm9jZXNzIGlkIiksCi0JT1BUX0lOVEVHRVIoJ3QnLCAidGlkIiwgJnRhcmdldF90aWQsCisJT1BUX0lOVEVHRVIoJ3QnLCAidGlkIiwgJnJlY29yZC5vcHRzLnRhcmdldF90aWQsCiAJCSAgICAicmVjb3JkIGV2ZW50cyBvbiBleGlzdGluZyB0aHJlYWQgaWQiKSwKLQlPUFRfSU5URUdFUigncicsICJyZWFsdGltZSIsICZyZWFsdGltZV9wcmlvLAorCU9QVF9JTlRFR0VSKCdyJywgInJlYWx0aW1lIiwgJnJlY29yZC5yZWFsdGltZV9wcmlvLAogCQkgICAgImNvbGxlY3QgZGF0YSB3aXRoIHRoaXMgUlQgU0NIRURfRklGTyBwcmlvcml0eSIpLAotCU9QVF9CT09MRUFOKCdEJywgIm5vLWRlbGF5IiwgJm5vZGVsYXksCisJT1BUX0JPT0xFQU4oJ0QnLCAibm8tZGVsYXkiLCAmcmVjb3JkLm9wdHMubm9fZGVsYXksCiAJCSAgICAiY29sbGVjdCBkYXRhIHdpdGhvdXQgYnVmZmVyaW5nIiksCi0JT1BUX0JPT0xFQU4oJ1InLCAicmF3LXNhbXBsZXMiLCAmcmF3X3NhbXBsZXMsCisJT1BUX0JPT0xFQU4oJ1InLCAicmF3LXNhbXBsZXMiLCAmcmVjb3JkLm9wdHMucmF3X3NhbXBsZXMsCiAJCSAgICAiY29sbGVjdCByYXcgc2FtcGxlIHJlY29yZHMgZnJvbSBhbGwgb3BlbmVkIGNvdW50ZXJzIiksCi0JT1BUX0JPT0xFQU4oJ2EnLCAiYWxsLWNwdXMiLCAmc3lzdGVtX3dpZGUsCisJT1BUX0JPT0xFQU4oJ2EnLCAiYWxsLWNwdXMiLCAmcmVjb3JkLm9wdHMuc3lzdGVtX3dpZGUsCiAJCQkgICAgInN5c3RlbS13aWRlIGNvbGxlY3Rpb24gZnJvbSBhbGwgQ1BVcyIpLAotCU9QVF9CT09MRUFOKCdBJywgImFwcGVuZCIsICZhcHBlbmRfZmlsZSwKKwlPUFRfQk9PTEVBTignQScsICJhcHBlbmQiLCAmcmVjb3JkLmFwcGVuZF9maWxlLAogCQkJICAgICJhcHBlbmQgdG8gdGhlIG91dHB1dCBmaWxlIHRvIGRvIGluY3JlbWVudGFsIHByb2ZpbGluZyIpLAotCU9QVF9TVFJJTkcoJ0MnLCAiY3B1IiwgJmNwdV9saXN0LCAiY3B1IiwKKwlPUFRfU1RSSU5HKCdDJywgImNwdSIsICZyZWNvcmQub3B0cy5jcHVfbGlzdCwgImNwdSIsCiAJCSAgICAibGlzdCBvZiBjcHVzIHRvIG1vbml0b3IiKSwKLQlPUFRfQk9PTEVBTignZicsICJmb3JjZSIsICZmb3JjZSwKKwlPUFRfQk9PTEVBTignZicsICJmb3JjZSIsICZyZWNvcmQuZm9yY2UsCiAJCQkib3ZlcndyaXRlIGV4aXN0aW5nIGRhdGEgZmlsZSAoZGVwcmVjYXRlZCkiKSwKLQlPUFRfVTY0KCdjJywgImNvdW50IiwgJnVzZXJfaW50ZXJ2YWwsICJldmVudCBwZXJpb2QgdG8gc2FtcGxlIiksCi0JT1BUX1NUUklORygnbycsICJvdXRwdXQiLCAmb3V0cHV0X25hbWUsICJmaWxlIiwKKwlPUFRfVTY0KCdjJywgImNvdW50IiwgJnJlY29yZC5vcHRzLnVzZXJfaW50ZXJ2YWwsICJldmVudCBwZXJpb2QgdG8gc2FtcGxlIiksCisJT1BUX1NUUklORygnbycsICJvdXRwdXQiLCAmcmVjb3JkLm91dHB1dF9uYW1lLCAiZmlsZSIsCiAJCSAgICAib3V0cHV0IGZpbGUgbmFtZSIpLAotCU9QVF9CT09MRUFOKCdpJywgIm5vLWluaGVyaXQiLCAmbm9faW5oZXJpdCwKKwlPUFRfQk9PTEVBTignaScsICJuby1pbmhlcml0IiwgJnJlY29yZC5vcHRzLm5vX2luaGVyaXQsCiAJCSAgICAiY2hpbGQgdGFza3MgZG8gbm90IGluaGVyaXQgY291bnRlcnMiKSwKLQlPUFRfVUlOVEVHRVIoJ0YnLCAiZnJlcSIsICZ1c2VyX2ZyZXEsICJwcm9maWxlIGF0IHRoaXMgZnJlcXVlbmN5IiksCi0JT1BUX1VJTlRFR0VSKCdtJywgIm1tYXAtcGFnZXMiLCAmbW1hcF9wYWdlcywgIm51bWJlciBvZiBtbWFwIGRhdGEgcGFnZXMiKSwKLQlPUFRfQk9PTEVBTigwLCAiZ3JvdXAiLCAmZ3JvdXAsCisJT1BUX1VJTlRFR0VSKCdGJywgImZyZXEiLCAmcmVjb3JkLm9wdHMudXNlcl9mcmVxLCAicHJvZmlsZSBhdCB0aGlzIGZyZXF1ZW5jeSIpLAorCU9QVF9VSU5URUdFUignbScsICJtbWFwLXBhZ2VzIiwgJnJlY29yZC5vcHRzLm1tYXBfcGFnZXMsCisJCSAgICAgIm51bWJlciBvZiBtbWFwIGRhdGEgcGFnZXMiKSwKKwlPUFRfQk9PTEVBTigwLCAiZ3JvdXAiLCAmcmVjb3JkLm9wdHMuZ3JvdXAsCiAJCSAgICAicHV0IHRoZSBjb3VudGVycyBpbnRvIGEgY291bnRlciBncm91cCIpLAotCU9QVF9CT09MRUFOKCdnJywgImNhbGwtZ3JhcGgiLCAmY2FsbF9ncmFwaCwKKwlPUFRfQk9PTEVBTignZycsICJjYWxsLWdyYXBoIiwgJnJlY29yZC5vcHRzLmNhbGxfZ3JhcGgsCiAJCSAgICAiZG8gY2FsbC1ncmFwaCAoc3RhY2sgY2hhaW4vYmFja3RyYWNlKSByZWNvcmRpbmciKSwKIAlPUFRfSU5DUigndicsICJ2ZXJib3NlIiwgJnZlcmJvc2UsCiAJCSAgICAiYmUgbW9yZSB2ZXJib3NlIChzaG93IGNvdW50ZXIgb3BlbiBlcnJvcnMsIGV0YykiKSwKIAlPUFRfQk9PTEVBTigncScsICJxdWlldCIsICZxdWlldCwgImRvbid0IHByaW50IGFueSBtZXNzYWdlIiksCi0JT1BUX0JPT0xFQU4oJ3MnLCAic3RhdCIsICZpbmhlcml0X3N0YXQsCisJT1BUX0JPT0xFQU4oJ3MnLCAic3RhdCIsICZyZWNvcmQub3B0cy5pbmhlcml0X3N0YXQsCiAJCSAgICAicGVyIHRocmVhZCBjb3VudHMiKSwKLQlPUFRfQk9PTEVBTignZCcsICJkYXRhIiwgJnNhbXBsZV9hZGRyZXNzLAorCU9QVF9CT09MRUFOKCdkJywgImRhdGEiLCAmcmVjb3JkLm9wdHMuc2FtcGxlX2FkZHJlc3MsCiAJCSAgICAiU2FtcGxlIGFkZHJlc3NlcyIpLAotCU9QVF9CT09MRUFOKCdUJywgInRpbWVzdGFtcCIsICZzYW1wbGVfdGltZSwgIlNhbXBsZSB0aW1lc3RhbXBzIiksCi0JT1BUX0JPT0xFQU4oJ24nLCAibm8tc2FtcGxlcyIsICZub19zYW1wbGVzLAorCU9QVF9CT09MRUFOKCdUJywgInRpbWVzdGFtcCIsICZyZWNvcmQub3B0cy5zYW1wbGVfdGltZSwgIlNhbXBsZSB0aW1lc3RhbXBzIiksCisJT1BUX0JPT0xFQU4oJ1AnLCAicGVyaW9kIiwgJnJlY29yZC5vcHRzLnBlcmlvZCwgIlNhbXBsZSBwZXJpb2QiKSwKKwlPUFRfQk9PTEVBTignbicsICJuby1zYW1wbGVzIiwgJnJlY29yZC5vcHRzLm5vX3NhbXBsZXMsCiAJCSAgICAiZG9uJ3Qgc2FtcGxlIiksCi0JT1BUX0JPT0xFQU4oJ04nLCAibm8tYnVpbGRpZC1jYWNoZSIsICZub19idWlsZGlkX2NhY2hlLAorCU9QVF9CT09MRUFOKCdOJywgIm5vLWJ1aWxkaWQtY2FjaGUiLCAmcmVjb3JkLm5vX2J1aWxkaWRfY2FjaGUsCiAJCSAgICAiZG8gbm90IHVwZGF0ZSB0aGUgYnVpbGRpZCBjYWNoZSIpLAotCU9QVF9CT09MRUFOKCdCJywgIm5vLWJ1aWxkaWQiLCAmbm9fYnVpbGRpZCwKKwlPUFRfQk9PTEVBTignQicsICJuby1idWlsZGlkIiwgJnJlY29yZC5ub19idWlsZGlkLAogCQkgICAgImRvIG5vdCBjb2xsZWN0IGJ1aWxkaWRzIGluIHBlcmYuZGF0YSIpLAotCU9QVF9DQUxMQkFDSygnRycsICJjZ3JvdXAiLCAmZXZzZWxfbGlzdCwgIm5hbWUiLAorCU9QVF9DQUxMQkFDSygnRycsICJjZ3JvdXAiLCAmcmVjb3JkLmV2bGlzdCwgIm5hbWUiLAogCQkgICAgICJtb25pdG9yIGV2ZW50IGluIGNncm91cCBuYW1lIG9ubHkiLAogCQkgICAgIHBhcnNlX2Nncm91cHMpLAogCU9QVF9FTkQoKQpAQCAtODE5LDYgKzczNCw4IEBACiB7CiAJaW50IGVyciA9IC1FTk9NRU07CiAJc3RydWN0IHBlcmZfZXZzZWwgKnBvczsKKwlzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2c2VsX2xpc3Q7CisJc3RydWN0IHBlcmZfcmVjb3JkICpyZWMgPSAmcmVjb3JkOwogCiAJcGVyZl9oZWFkZXJfX3NldF9jbWRsaW5lKGFyZ2MsIGFyZ3YpOwogCkBAIC04MjYsMjMgKzc0MywyNSBAQAogCWlmIChldnNlbF9saXN0ID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCisJcmVjLT5ldmxpc3QgPSBldnNlbF9saXN0OworCiAJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgcmVjb3JkX29wdGlvbnMsIHJlY29yZF91c2FnZSwKIAkJCSAgICBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKTsKLQlpZiAoIWFyZ2MgJiYgdGFyZ2V0X3BpZCA9PSAtMSAmJiB0YXJnZXRfdGlkID09IC0xICYmCi0JCSFzeXN0ZW1fd2lkZSAmJiAhY3B1X2xpc3QpCisJaWYgKCFhcmdjICYmIHJlYy0+b3B0cy50YXJnZXRfcGlkID09IC0xICYmIHJlYy0+b3B0cy50YXJnZXRfdGlkID09IC0xICYmCisJCSFyZWMtPm9wdHMuc3lzdGVtX3dpZGUgJiYgIXJlYy0+b3B0cy5jcHVfbGlzdCkKIAkJdXNhZ2Vfd2l0aF9vcHRpb25zKHJlY29yZF91c2FnZSwgcmVjb3JkX29wdGlvbnMpOwogCi0JaWYgKGZvcmNlICYmIGFwcGVuZF9maWxlKSB7CisJaWYgKHJlYy0+Zm9yY2UgJiYgcmVjLT5hcHBlbmRfZmlsZSkgewogCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG92ZXJ3cml0ZSBhbmQgYXBwZW5kIGF0IHRoZSBzYW1lIHRpbWUuIgogCQkJCSIgWW91IG5lZWQgdG8gY2hvb3NlIGJldHdlZW4gLWYgYW5kIC1BIik7CiAJCXVzYWdlX3dpdGhfb3B0aW9ucyhyZWNvcmRfdXNhZ2UsIHJlY29yZF9vcHRpb25zKTsKLQl9IGVsc2UgaWYgKGFwcGVuZF9maWxlKSB7Ci0JCXdyaXRlX21vZGUgPSBXUklURV9BUFBFTkQ7CisJfSBlbHNlIGlmIChyZWMtPmFwcGVuZF9maWxlKSB7CisJCXJlYy0+d3JpdGVfbW9kZSA9IFdSSVRFX0FQUEVORDsKIAl9IGVsc2UgewotCQl3cml0ZV9tb2RlID0gV1JJVEVfRk9SQ0U7CisJCXJlYy0+d3JpdGVfbW9kZSA9IFdSSVRFX0ZPUkNFOwogCX0KIAotCWlmIChucl9jZ3JvdXBzICYmICFzeXN0ZW1fd2lkZSkgeworCWlmIChucl9jZ3JvdXBzICYmICFyZWMtPm9wdHMuc3lzdGVtX3dpZGUpIHsKIAkJZnByaW50ZihzdGRlcnIsICJjZ3JvdXAgbW9uaXRvcmluZyBvbmx5IGF2YWlsYWJsZSBpbiIKIAkJCSIgc3lzdGVtLXdpZGUgbW9kZVxuIik7CiAJCXVzYWdlX3dpdGhfb3B0aW9ucyhyZWNvcmRfdXNhZ2UsIHJlY29yZF9vcHRpb25zKTsKQEAgLTg2MCw3ICs3NzksNyBAQAogIklmIHNvbWUgcmVsb2NhdGlvbiB3YXMgYXBwbGllZCAoZS5nLiBrZXhlYykgc3ltYm9scyBtYXkgYmUgbWlzcmVzb2x2ZWRcbiIKICJldmVuIHdpdGggYSBzdWl0YWJsZSB2bWxpbnV4IG9yIGthbGxzeW1zIGZpbGUuXG5cbiIpOwogCi0JaWYgKG5vX2J1aWxkaWRfY2FjaGUgfHwgbm9fYnVpbGRpZCkKKwlpZiAocmVjLT5ub19idWlsZGlkX2NhY2hlIHx8IHJlYy0+bm9fYnVpbGRpZCkKIAkJZGlzYWJsZV9idWlsZGlkX2NhY2hlKCk7CiAKIAlpZiAoZXZzZWxfbGlzdC0+bnJfZW50cmllcyA9PSAwICYmCkBAIC04NjksNDMgKzc4OCwzNyBAQAogCQlnb3RvIG91dF9zeW1ib2xfZXhpdDsKIAl9CiAKLQlpZiAodGFyZ2V0X3BpZCAhPSAtMSkKLQkJdGFyZ2V0X3RpZCA9IHRhcmdldF9waWQ7CisJaWYgKHJlYy0+b3B0cy50YXJnZXRfcGlkICE9IC0xKQorCQlyZWMtPm9wdHMudGFyZ2V0X3RpZCA9IHJlYy0+b3B0cy50YXJnZXRfcGlkOwogCi0JaWYgKHBlcmZfZXZsaXN0X19jcmVhdGVfbWFwcyhldnNlbF9saXN0LCB0YXJnZXRfcGlkLAotCQkJCSAgICAgdGFyZ2V0X3RpZCwgY3B1X2xpc3QpIDwgMCkKKwlpZiAocGVyZl9ldmxpc3RfX2NyZWF0ZV9tYXBzKGV2c2VsX2xpc3QsIHJlYy0+b3B0cy50YXJnZXRfcGlkLAorCQkJCSAgICAgcmVjLT5vcHRzLnRhcmdldF90aWQsIHJlYy0+b3B0cy5jcHVfbGlzdCkgPCAwKQogCQl1c2FnZV93aXRoX29wdGlvbnMocmVjb3JkX3VzYWdlLCByZWNvcmRfb3B0aW9ucyk7CiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmV2c2VsX2xpc3QtPmVudHJpZXMsIG5vZGUpIHsKLQkJaWYgKHBlcmZfZXZzZWxfX2FsbG9jX2ZkKHBvcywgZXZzZWxfbGlzdC0+Y3B1cy0+bnIsCi0JCQkJCSBldnNlbF9saXN0LT50aHJlYWRzLT5ucikgPCAwKQotCQkJZ290byBvdXRfZnJlZV9mZDsKIAkJaWYgKHBlcmZfaGVhZGVyX19wdXNoX2V2ZW50KHBvcy0+YXR0ci5jb25maWcsIGV2ZW50X25hbWUocG9zKSkpCiAJCQlnb3RvIG91dF9mcmVlX2ZkOwogCX0KIAotCWlmIChwZXJmX2V2bGlzdF9fYWxsb2NfcG9sbGZkKGV2c2VsX2xpc3QpIDwgMCkKLQkJZ290byBvdXRfZnJlZV9mZDsKLQotCWlmICh1c2VyX2ludGVydmFsICE9IFVMTE9OR19NQVgpCi0JCWRlZmF1bHRfaW50ZXJ2YWwgPSB1c2VyX2ludGVydmFsOwotCWlmICh1c2VyX2ZyZXEgIT0gVUlOVF9NQVgpCi0JCWZyZXEgPSB1c2VyX2ZyZXE7CisJaWYgKHJlYy0+b3B0cy51c2VyX2ludGVydmFsICE9IFVMTE9OR19NQVgpCisJCXJlYy0+b3B0cy5kZWZhdWx0X2ludGVydmFsID0gcmVjLT5vcHRzLnVzZXJfaW50ZXJ2YWw7CisJaWYgKHJlYy0+b3B0cy51c2VyX2ZyZXEgIT0gVUlOVF9NQVgpCisJCXJlYy0+b3B0cy5mcmVxID0gcmVjLT5vcHRzLnVzZXJfZnJlcTsKIAogCS8qCiAJICogVXNlciBzcGVjaWZpZWQgY291bnQgb3ZlcnJpZGVzIGRlZmF1bHQgZnJlcXVlbmN5LgogCSAqLwotCWlmIChkZWZhdWx0X2ludGVydmFsKQotCQlmcmVxID0gMDsKLQllbHNlIGlmIChmcmVxKSB7Ci0JCWRlZmF1bHRfaW50ZXJ2YWwgPSBmcmVxOworCWlmIChyZWMtPm9wdHMuZGVmYXVsdF9pbnRlcnZhbCkKKwkJcmVjLT5vcHRzLmZyZXEgPSAwOworCWVsc2UgaWYgKHJlYy0+b3B0cy5mcmVxKSB7CisJCXJlYy0+b3B0cy5kZWZhdWx0X2ludGVydmFsID0gcmVjLT5vcHRzLmZyZXE7CiAJfSBlbHNlIHsKIAkJZnByaW50ZihzdGRlcnIsICJmcmVxdWVuY3kgYW5kIGNvdW50IGFyZSB6ZXJvLCBhYm9ydGluZ1xuIik7CiAJCWVyciA9IC1FSU5WQUw7CiAJCWdvdG8gb3V0X2ZyZWVfZmQ7CiAJfQogCi0JZXJyID0gX19jbWRfcmVjb3JkKGFyZ2MsIGFyZ3YpOworCWVyciA9IF9fY21kX3JlY29yZCgmcmVjb3JkLCBhcmdjLCBhcmd2KTsKIG91dF9mcmVlX2ZkOgogCXBlcmZfZXZsaXN0X19kZWxldGVfbWFwcyhldnNlbF9saXN0KTsKIG91dF9zeW1ib2xfZXhpdDoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYwppbmRleCA0ZDdjODM0Li4yNWQzNGQ0IDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXJlcG9ydC5jCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSAidXRpbC9ldnNlbC5oIgogI2luY2x1ZGUgInV0aWwvaGVhZGVyLmgiCiAjaW5jbHVkZSAidXRpbC9zZXNzaW9uLmgiCisjaW5jbHVkZSAidXRpbC90b29sLmgiCiAKICNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKICNpbmNsdWRlICJ1dGlsL3BhcnNlLWV2ZW50cy5oIgpAQCAtMzUsMzggKzM2LDM1IEBACiAKICNpbmNsdWRlIDxsaW51eC9iaXRtYXAuaD4KIAotc3RhdGljIGNoYXIJCWNvbnN0ICppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CitzdHJ1Y3QgcGVyZl9yZXBvcnQgeworCXN0cnVjdCBwZXJmX3Rvb2wJdG9vbDsKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uCSpzZXNzaW9uOworCWNoYXIgY29uc3QJCSppbnB1dF9uYW1lOworCWJvb2wJCQlmb3JjZSwgdXNlX3R1aSwgdXNlX3N0ZGlvOworCWJvb2wJCQloaWRlX3VucmVzb2x2ZWQ7CisJYm9vbAkJCWRvbnRfdXNlX2NhbGxjaGFpbnM7CisJYm9vbAkJCXNob3dfZnVsbF9pbmZvOworCWJvb2wJCQlzaG93X3RocmVhZHM7CisJYm9vbAkJCWludmVydGVkX2NhbGxjaGFpbjsKKwlzdHJ1Y3QgcGVyZl9yZWFkX3ZhbHVlcwlzaG93X3RocmVhZHNfdmFsdWVzOworCWNvbnN0IGNoYXIJCSpwcmV0dHlfcHJpbnRpbmdfc3R5bGU7CisJc3ltYm9sX2ZpbHRlcl90CQlhbm5vdGF0ZV9pbml0OworCWNvbnN0IGNoYXIJCSpjcHVfbGlzdDsKKwlERUNMQVJFX0JJVE1BUChjcHVfYml0bWFwLCBNQVhfTlJfQ1BVUyk7Cit9OwogCi1zdGF0aWMgYm9vbAkJZm9yY2UsIHVzZV90dWksIHVzZV9zdGRpbzsKLXN0YXRpYyBib29sCQloaWRlX3VucmVzb2x2ZWQ7Ci1zdGF0aWMgYm9vbAkJZG9udF91c2VfY2FsbGNoYWluczsKLXN0YXRpYyBib29sCQlzaG93X2Z1bGxfaW5mbzsKLQotc3RhdGljIGJvb2wJCXNob3dfdGhyZWFkczsKLXN0YXRpYyBzdHJ1Y3QgcGVyZl9yZWFkX3ZhbHVlcwlzaG93X3RocmVhZHNfdmFsdWVzOwotCi1zdGF0aWMgY29uc3QgY2hhcglkZWZhdWx0X3ByZXR0eV9wcmludGluZ19zdHlsZVtdID0gIm5vcm1hbCI7Ci1zdGF0aWMgY29uc3QgY2hhcgkqcHJldHR5X3ByaW50aW5nX3N0eWxlID0gZGVmYXVsdF9wcmV0dHlfcHJpbnRpbmdfc3R5bGU7Ci0KLXN0YXRpYyBjaGFyCQljYWxsY2hhaW5fZGVmYXVsdF9vcHRbXSA9ICJmcmFjdGFsLDAuNSxjYWxsZWUiOwotc3RhdGljIGJvb2wJCWludmVydGVkX2NhbGxjaGFpbjsKLXN0YXRpYyBzeW1ib2xfZmlsdGVyX3QJYW5ub3RhdGVfaW5pdDsKLQotc3RhdGljIGNvbnN0IGNoYXIJKmNwdV9saXN0Owotc3RhdGljIERFQ0xBUkVfQklUTUFQKGNwdV9iaXRtYXAsIE1BWF9OUl9DUFVTKTsKLQotc3RhdGljIGludCBwZXJmX3Nlc3Npb25fX2FkZF9oaXN0X2VudHJ5KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCi0JCQkJCXN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKLQkJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCkKK3N0YXRpYyBpbnQgcGVyZl9ldnNlbF9fYWRkX2hpc3RfZW50cnkoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJCSAgICAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKKwkJCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCQkgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAlzdHJ1Y3Qgc3ltYm9sICpwYXJlbnQgPSBOVUxMOwogCWludCBlcnIgPSAwOwogCXN0cnVjdCBoaXN0X2VudHJ5ICpoZTsKIAogCWlmICgoc29ydF9faGFzX3BhcmVudCB8fCBzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluKSAmJiBzYW1wbGUtPmNhbGxjaGFpbikgewotCQllcnIgPSBwZXJmX3Nlc3Npb25fX3Jlc29sdmVfY2FsbGNoYWluKHNlc3Npb24sIGFsLT50aHJlYWQsCi0JCQkJCQkgICAgICBzYW1wbGUtPmNhbGxjaGFpbiwgJnBhcmVudCk7CisJCWVyciA9IG1hY2hpbmVfX3Jlc29sdmVfY2FsbGNoYWluKG1hY2hpbmUsIGV2c2VsLCBhbC0+dGhyZWFkLAorCQkJCQkJIHNhbXBsZS0+Y2FsbGNoYWluLCAmcGFyZW50KTsKIAkJaWYgKGVycikKIAkJCXJldHVybiBlcnI7CiAJfQpAQCAtNzYsNyArNzQsOCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCWlmIChzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluKSB7Ci0JCWVyciA9IGNhbGxjaGFpbl9hcHBlbmQoaGUtPmNhbGxjaGFpbiwgJnNlc3Npb24tPmNhbGxjaGFpbl9jdXJzb3IsCisJCWVyciA9IGNhbGxjaGFpbl9hcHBlbmQoaGUtPmNhbGxjaGFpbiwKKwkJCQkgICAgICAgJmV2c2VsLT5oaXN0cy5jYWxsY2hhaW5fY3Vyc29yLAogCQkJCSAgICAgICBzYW1wbGUtPnBlcmlvZCk7CiAJCWlmIChlcnIpCiAJCQlyZXR1cm4gZXJyOwpAQCAtOTIsOCArOTEsNyBAQAogCQlhc3NlcnQoZXZzZWwgIT0gTlVMTCk7CiAKIAkJZXJyID0gLUVOT01FTTsKLQkJaWYgKG5vdGVzLT5zcmMgPT0gTlVMTCAmJgotCQkgICAgc3ltYm9sX19hbGxvY19oaXN0KGhlLT5tcy5zeW0sIHNlc3Npb24tPmV2bGlzdC0+bnJfZW50cmllcykgPCAwKQorCQlpZiAobm90ZXMtPnNyYyA9PSBOVUxMICYmIHN5bWJvbF9fYWxsb2NfaGlzdChoZS0+bXMuc3ltKSA8IDApCiAJCQlnb3RvIG91dDsKIAogCQllcnIgPSBoaXN0X2VudHJ5X19pbmNfYWRkcl9zYW1wbGVzKGhlLCBldnNlbC0+aWR4LCBhbC0+YWRkcik7CkBAIC0xMDYsMzAgKzEwNCwzMiBAQAogfQogCiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19zYW1wbGVfZXZlbnQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCitzdGF0aWMgaW50IHByb2Nlc3Nfc2FtcGxlX2V2ZW50KHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CisJc3RydWN0IHBlcmZfcmVwb3J0ICpyZXAgPSBjb250YWluZXJfb2YodG9vbCwgc3RydWN0IHBlcmZfcmVwb3J0LCB0b29sKTsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKIAotCWlmIChwZXJmX2V2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShldmVudCwgc2Vzc2lvbiwgJmFsLCBzYW1wbGUsCi0JCQkJCSAgYW5ub3RhdGVfaW5pdCkgPCAwKSB7CisJaWYgKHBlcmZfZXZlbnRfX3ByZXByb2Nlc3Nfc2FtcGxlKGV2ZW50LCBtYWNoaW5lLCAmYWwsIHNhbXBsZSwKKwkJCQkJICByZXAtPmFubm90YXRlX2luaXQpIDwgMCkgewogCQlmcHJpbnRmKHN0ZGVyciwgInByb2JsZW0gcHJvY2Vzc2luZyAlZCBldmVudCwgc2tpcHBpbmcgaXQuXG4iLAogCQkJZXZlbnQtPmhlYWRlci50eXBlKTsKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChhbC5maWx0ZXJlZCB8fCAoaGlkZV91bnJlc29sdmVkICYmIGFsLnN5bSA9PSBOVUxMKSkKKwlpZiAoYWwuZmlsdGVyZWQgfHwgKHJlcC0+aGlkZV91bnJlc29sdmVkICYmIGFsLnN5bSA9PSBOVUxMKSkKIAkJcmV0dXJuIDA7CiAKLQlpZiAoY3B1X2xpc3QgJiYgIXRlc3RfYml0KHNhbXBsZS0+Y3B1LCBjcHVfYml0bWFwKSkKKwlpZiAocmVwLT5jcHVfbGlzdCAmJiAhdGVzdF9iaXQoc2FtcGxlLT5jcHUsIHJlcC0+Y3B1X2JpdG1hcCkpCiAJCXJldHVybiAwOwogCiAJaWYgKGFsLm1hcCAhPSBOVUxMKQogCQlhbC5tYXAtPmRzby0+aGl0ID0gMTsKIAotCWlmIChwZXJmX3Nlc3Npb25fX2FkZF9oaXN0X2VudHJ5KHNlc3Npb24sICZhbCwgc2FtcGxlLCBldnNlbCkpIHsKKwlpZiAocGVyZl9ldnNlbF9fYWRkX2hpc3RfZW50cnkoZXZzZWwsICZhbCwgc2FtcGxlLCBtYWNoaW5lKSkgewogCQlwcl9kZWJ1ZygicHJvYmxlbSBpbmNyZW1lbnRpbmcgc3ltYm9sIHBlcmlvZCwgc2tpcHBpbmcgZXZlbnRcbiIpOwogCQlyZXR1cm4gLTE7CiAJfQpAQCAtMTM3LDE1ICsxMzcsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwcm9jZXNzX3JlYWRfZXZlbnQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCitzdGF0aWMgaW50IHByb2Nlc3NfcmVhZF9ldmVudChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJICAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSBfX3VzZWQsCi0JCQkgICAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQorCQkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191c2VkKQogewotCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IHBlcmZfZXZsaXN0X19pZDJldnNlbChzZXNzaW9uLT5ldmxpc3QsCi0JCQkJCQkJIGV2ZW50LT5yZWFkLmlkKTsKLQlpZiAoc2hvd190aHJlYWRzKSB7CisJc3RydWN0IHBlcmZfcmVwb3J0ICpyZXAgPSBjb250YWluZXJfb2YodG9vbCwgc3RydWN0IHBlcmZfcmVwb3J0LCB0b29sKTsKKworCWlmIChyZXAtPnNob3dfdGhyZWFkcykgewogCQljb25zdCBjaGFyICpuYW1lID0gZXZzZWwgPyBldmVudF9uYW1lKGV2c2VsKSA6ICJ1bmtub3duIjsKLQkJcGVyZl9yZWFkX3ZhbHVlc19hZGRfdmFsdWUoJnNob3dfdGhyZWFkc192YWx1ZXMsCisJCXBlcmZfcmVhZF92YWx1ZXNfYWRkX3ZhbHVlKCZyZXAtPnNob3dfdGhyZWFkc192YWx1ZXMsCiAJCQkJCSAgIGV2ZW50LT5yZWFkLnBpZCwgZXZlbnQtPnJlYWQudGlkLAogCQkJCQkgICBldmVudC0+cmVhZC5pZCwKIAkJCQkJICAgbmFtZSwKQEAgLTE1OSw4ICsxNjEsMTAgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBwZXJmX3Nlc3Npb25fX3NldHVwX3NhbXBsZV90eXBlKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYpCitzdGF0aWMgaW50IHBlcmZfcmVwb3J0X19zZXR1cF9zYW1wbGVfdHlwZShzdHJ1Y3QgcGVyZl9yZXBvcnQgKnJlcCkKIHsKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmID0gcmVwLT5zZXNzaW9uOworCiAJaWYgKCEoc2VsZi0+c2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9DQUxMQ0hBSU4pKSB7CiAJCWlmIChzb3J0X19oYXNfcGFyZW50KSB7CiAJCQl1aV9fd2FybmluZygiU2VsZWN0ZWQgLS1zb3J0IHBhcmVudCwgYnV0IG5vICIKQEAgLTE3Myw3ICsxNzcsOCBAQAogCQkJCSAgICAieW91IGNhbGwgJ3BlcmYgcmVjb3JkJyB3aXRob3V0IC1nP1xuIik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQl9IGVsc2UgaWYgKCFkb250X3VzZV9jYWxsY2hhaW5zICYmIGNhbGxjaGFpbl9wYXJhbS5tb2RlICE9IENIQUlOX05PTkUgJiYKKwl9IGVsc2UgaWYgKCFyZXAtPmRvbnRfdXNlX2NhbGxjaGFpbnMgJiYKKwkJICAgY2FsbGNoYWluX3BhcmFtLm1vZGUgIT0gQ0hBSU5fTk9ORSAmJgogCQkgICAhc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikgewogCQkJc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbiA9IHRydWU7CiAJCQlpZiAoY2FsbGNoYWluX3JlZ2lzdGVyX3BhcmFtKCZjYWxsY2hhaW5fcGFyYW0pIDwgMCkgewpAQCAtMTg2LDIyICsxOTEsNiBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBlcmZfZXZlbnRfb3BzIGV2ZW50X29wcyA9IHsKLQkuc2FtcGxlCQkgPSBwcm9jZXNzX3NhbXBsZV9ldmVudCwKLQkubW1hcAkJID0gcGVyZl9ldmVudF9fcHJvY2Vzc19tbWFwLAotCS5jb21tCQkgPSBwZXJmX2V2ZW50X19wcm9jZXNzX2NvbW0sCi0JLmV4aXQJCSA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfdGFzaywKLQkuZm9yawkJID0gcGVyZl9ldmVudF9fcHJvY2Vzc190YXNrLAotCS5sb3N0CQkgPSBwZXJmX2V2ZW50X19wcm9jZXNzX2xvc3QsCi0JLnJlYWQJCSA9IHByb2Nlc3NfcmVhZF9ldmVudCwKLQkuYXR0cgkJID0gcGVyZl9ldmVudF9fcHJvY2Vzc19hdHRyLAotCS5ldmVudF90eXBlCSA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfZXZlbnRfdHlwZSwKLQkudHJhY2luZ19kYXRhCSA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfdHJhY2luZ19kYXRhLAotCS5idWlsZF9pZAkgPSBwZXJmX2V2ZW50X19wcm9jZXNzX2J1aWxkX2lkLAotCS5vcmRlcmVkX3NhbXBsZXMgPSB0cnVlLAotCS5vcmRlcmluZ19yZXF1aXJlc190aW1lc3RhbXBzID0gdHJ1ZSwKLX07Ci0KIGV4dGVybiB2b2xhdGlsZSBpbnQgc2Vzc2lvbl9kb25lOwogCiBzdGF0aWMgdm9pZCBzaWdfaGFuZGxlcihpbnQgc2lnIF9fdXNlZCkKQEAgLTIyNCw2ICsyMTMsNyBAQAogfQogCiBzdGF0aWMgaW50IHBlcmZfZXZsaXN0X190dHlfYnJvd3NlX2hpc3RzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAorCQkJCQkgc3RydWN0IHBlcmZfcmVwb3J0ICpyZXAsCiAJCQkJCSBjb25zdCBjaGFyICpoZWxwKQogewogCXN0cnVjdCBwZXJmX2V2c2VsICpwb3M7CkBAIC0yNDEsMTggKzIzMSwxOCBAQAogCSAgICBwYXJlbnRfcGF0dGVybiA9PSBkZWZhdWx0X3BhcmVudF9wYXR0ZXJuKSB7CiAJCWZwcmludGYoc3Rkb3V0LCAiI1xuIyAoJXMpXG4jXG4iLCBoZWxwKTsKIAotCQlpZiAoc2hvd190aHJlYWRzKSB7Ci0JCQlib29sIHN0eWxlID0gIXN0cmNtcChwcmV0dHlfcHJpbnRpbmdfc3R5bGUsICJyYXciKTsKLQkJCXBlcmZfcmVhZF92YWx1ZXNfZGlzcGxheShzdGRvdXQsICZzaG93X3RocmVhZHNfdmFsdWVzLAorCQlpZiAocmVwLT5zaG93X3RocmVhZHMpIHsKKwkJCWJvb2wgc3R5bGUgPSAhc3RyY21wKHJlcC0+cHJldHR5X3ByaW50aW5nX3N0eWxlLCAicmF3Iik7CisJCQlwZXJmX3JlYWRfdmFsdWVzX2Rpc3BsYXkoc3Rkb3V0LCAmcmVwLT5zaG93X3RocmVhZHNfdmFsdWVzLAogCQkJCQkJIHN0eWxlKTsKLQkJCXBlcmZfcmVhZF92YWx1ZXNfZGVzdHJveSgmc2hvd190aHJlYWRzX3ZhbHVlcyk7CisJCQlwZXJmX3JlYWRfdmFsdWVzX2Rlc3Ryb3koJnJlcC0+c2hvd190aHJlYWRzX3ZhbHVlcyk7CiAJCX0KIAl9CiAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2NtZF9yZXBvcnQodm9pZCkKK3N0YXRpYyBpbnQgX19jbWRfcmVwb3J0KHN0cnVjdCBwZXJmX3JlcG9ydCAqcmVwKQogewogCWludCByZXQgPSAtRUlOVkFMOwogCXU2NCBucl9zYW1wbGVzOwpAQCAtMjY0LDI3ICsyNTQsMzEgQEAKIAogCXNpZ25hbChTSUdJTlQsIHNpZ19oYW5kbGVyKTsKIAotCXNlc3Npb24gPSBwZXJmX3Nlc3Npb25fX25ldyhpbnB1dF9uYW1lLCBPX1JET05MWSwgZm9yY2UsIGZhbHNlLCAmZXZlbnRfb3BzKTsKKwlzZXNzaW9uID0gcGVyZl9zZXNzaW9uX19uZXcocmVwLT5pbnB1dF9uYW1lLCBPX1JET05MWSwKKwkJCQkgICAgcmVwLT5mb3JjZSwgZmFsc2UsICZyZXAtPnRvb2wpOwogCWlmIChzZXNzaW9uID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JaWYgKGNwdV9saXN0KSB7Ci0JCXJldCA9IHBlcmZfc2Vzc2lvbl9fY3B1X2JpdG1hcChzZXNzaW9uLCBjcHVfbGlzdCwgY3B1X2JpdG1hcCk7CisJcmVwLT5zZXNzaW9uID0gc2Vzc2lvbjsKKworCWlmIChyZXAtPmNwdV9saXN0KSB7CisJCXJldCA9IHBlcmZfc2Vzc2lvbl9fY3B1X2JpdG1hcChzZXNzaW9uLCByZXAtPmNwdV9saXN0LAorCQkJCQkgICAgICAgcmVwLT5jcHVfYml0bWFwKTsKIAkJaWYgKHJldCkKIAkJCWdvdG8gb3V0X2RlbGV0ZTsKIAl9CiAKIAlpZiAodXNlX2Jyb3dzZXIgPD0gMCkKLQkJcGVyZl9zZXNzaW9uX19mcHJpbnRmX2luZm8oc2Vzc2lvbiwgc3Rkb3V0LCBzaG93X2Z1bGxfaW5mbyk7CisJCXBlcmZfc2Vzc2lvbl9fZnByaW50Zl9pbmZvKHNlc3Npb24sIHN0ZG91dCwgcmVwLT5zaG93X2Z1bGxfaW5mbyk7CiAKLQlpZiAoc2hvd190aHJlYWRzKQotCQlwZXJmX3JlYWRfdmFsdWVzX2luaXQoJnNob3dfdGhyZWFkc192YWx1ZXMpOworCWlmIChyZXAtPnNob3dfdGhyZWFkcykKKwkJcGVyZl9yZWFkX3ZhbHVlc19pbml0KCZyZXAtPnNob3dfdGhyZWFkc192YWx1ZXMpOwogCi0JcmV0ID0gcGVyZl9zZXNzaW9uX19zZXR1cF9zYW1wbGVfdHlwZShzZXNzaW9uKTsKKwlyZXQgPSBwZXJmX3JlcG9ydF9fc2V0dXBfc2FtcGxlX3R5cGUocmVwKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9kZWxldGU7CiAKLQlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZldmVudF9vcHMpOworCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJnJlcC0+dG9vbCk7CiAJaWYgKHJldCkKIAkJZ290byBvdXRfZGVsZXRlOwogCkBAIC0zMjcsNyArMzIxLDcgQEAKIAl9CiAKIAlpZiAobnJfc2FtcGxlcyA9PSAwKSB7Ci0JCXVpX193YXJuaW5nKCJUaGUgJXMgZmlsZSBoYXMgbm8gc2FtcGxlcyFcbiIsIGlucHV0X25hbWUpOworCQl1aV9fd2FybmluZygiVGhlICVzIGZpbGUgaGFzIG5vIHNhbXBsZXMhXG4iLCBzZXNzaW9uLT5maWxlbmFtZSk7CiAJCWdvdG8gb3V0X2RlbGV0ZTsKIAl9CiAKQEAgLTMzNSw3ICszMjksNyBAQAogCQlwZXJmX2V2bGlzdF9fdHVpX2Jyb3dzZV9oaXN0cyhzZXNzaW9uLT5ldmxpc3QsIGhlbHAsCiAJCQkJCSAgICAgIE5VTEwsIE5VTEwsIDApOwogCX0gZWxzZQotCQlwZXJmX2V2bGlzdF9fdHR5X2Jyb3dzZV9oaXN0cyhzZXNzaW9uLT5ldmxpc3QsIGhlbHApOworCQlwZXJmX2V2bGlzdF9fdHR5X2Jyb3dzZV9oaXN0cyhzZXNzaW9uLT5ldmxpc3QsIHJlcCwgaGVscCk7CiAKIG91dF9kZWxldGU6CiAJLyoKQEAgLTM1NCw5ICszNDgsOSBAQAogfQogCiBzdGF0aWMgaW50Ci1wYXJzZV9jYWxsY2hhaW5fb3B0KGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCBfX3VzZWQsIGNvbnN0IGNoYXIgKmFyZywKLQkJICAgIGludCB1bnNldCkKK3BhcnNlX2NhbGxjaGFpbl9vcHQoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LCBjb25zdCBjaGFyICphcmcsIGludCB1bnNldCkKIHsKKwlzdHJ1Y3QgcGVyZl9yZXBvcnQgKnJlcCA9IChzdHJ1Y3QgcGVyZl9yZXBvcnQgKilvcHQtPnZhbHVlOwogCWNoYXIgKnRvaywgKnRvazI7CiAJY2hhciAqZW5kcHRyOwogCkBAIC0zNjQsNyArMzU4LDcgQEAKIAkgKiAtLW5vLWNhbGwtZ3JhcGgKIAkgKi8KIAlpZiAodW5zZXQpIHsKLQkJZG9udF91c2VfY2FsbGNoYWlucyA9IHRydWU7CisJCXJlcC0+ZG9udF91c2VfY2FsbGNoYWlucyA9IHRydWU7CiAJCXJldHVybiAwOwogCX0KIApAQCAtNDEyLDcgKzQwNiw3IEBACiAJCWdvdG8gc2V0dXA7CiAKIAlpZiAodG9rMlswXSAhPSAnYycpIHsKLQkJY2FsbGNoYWluX3BhcmFtLnByaW50X2xpbWl0ID0gc3RydG9kKHRvazIsICZlbmRwdHIpOworCQljYWxsY2hhaW5fcGFyYW0ucHJpbnRfbGltaXQgPSBzdHJ0b3VsKHRvazIsICZlbmRwdHIsIDApOwogCQl0b2syID0gc3RydG9rKE5VTEwsICIsIik7CiAJCWlmICghdG9rMikKIAkJCWdvdG8gc2V0dXA7CkBAIC00MzMsMTMgKzQyNywzNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJlcG9ydF91c2FnZVtdID0gewotCSJwZXJmIHJlcG9ydCBbPG9wdGlvbnM+XSA8Y29tbWFuZD4iLAotCU5VTEwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKLQlPUFRfU1RSSU5HKCdpJywgImlucHV0IiwgJmlucHV0X25hbWUsICJmaWxlIiwKK2ludCBjbWRfcmVwb3J0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fdXNlZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljaGFyIGNhbGxjaGFpbl9kZWZhdWx0X29wdFtdID0gImZyYWN0YWwsMC41LGNhbGxlZSI7CisJY29uc3QgY2hhciAqIGNvbnN0IHJlcG9ydF91c2FnZVtdID0geworCQkicGVyZiByZXBvcnQgWzxvcHRpb25zPl0iLAorCQlOVUxMCisJfTsKKwlzdHJ1Y3QgcGVyZl9yZXBvcnQgcmVwb3J0ID0geworCQkudG9vbCA9IHsKKwkJCS5zYW1wbGUJCSA9IHByb2Nlc3Nfc2FtcGxlX2V2ZW50LAorCQkJLm1tYXAJCSA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbW1hcCwKKwkJCS5jb21tCQkgPSBwZXJmX2V2ZW50X19wcm9jZXNzX2NvbW0sCisJCQkuZXhpdAkJID0gcGVyZl9ldmVudF9fcHJvY2Vzc190YXNrLAorCQkJLmZvcmsJCSA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfdGFzaywKKwkJCS5sb3N0CQkgPSBwZXJmX2V2ZW50X19wcm9jZXNzX2xvc3QsCisJCQkucmVhZAkJID0gcHJvY2Vzc19yZWFkX2V2ZW50LAorCQkJLmF0dHIJCSA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfYXR0ciwKKwkJCS5ldmVudF90eXBlCSA9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfZXZlbnRfdHlwZSwKKwkJCS50cmFjaW5nX2RhdGEJID0gcGVyZl9ldmVudF9fcHJvY2Vzc190cmFjaW5nX2RhdGEsCisJCQkuYnVpbGRfaWQJID0gcGVyZl9ldmVudF9fcHJvY2Vzc19idWlsZF9pZCwKKwkJCS5vcmRlcmVkX3NhbXBsZXMgPSB0cnVlLAorCQkJLm9yZGVyaW5nX3JlcXVpcmVzX3RpbWVzdGFtcHMgPSB0cnVlLAorCQl9LAorCQkucHJldHR5X3ByaW50aW5nX3N0eWxlCSA9ICJub3JtYWwiLAorCX07CisJY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJT1BUX1NUUklORygnaScsICJpbnB1dCIsICZyZXBvcnQuaW5wdXRfbmFtZSwgImZpbGUiLAogCQkgICAgImlucHV0IGZpbGUgbmFtZSIpLAogCU9QVF9JTkNSKCd2JywgInZlcmJvc2UiLCAmdmVyYm9zZSwKIAkJICAgICJiZSBtb3JlIHZlcmJvc2UgKHNob3cgc3ltYm9sIGFkZHJlc3MsIGV0YykiKSwKQEAgLTQ0OSwxNyArNDY0LDE4IEBACiAJCSAgICJmaWxlIiwgInZtbGludXggcGF0aG5hbWUiKSwKIAlPUFRfU1RSSU5HKDAsICJrYWxsc3ltcyIsICZzeW1ib2xfY29uZi5rYWxsc3ltc19uYW1lLAogCQkgICAiZmlsZSIsICJrYWxsc3ltcyBwYXRobmFtZSIpLAotCU9QVF9CT09MRUFOKCdmJywgImZvcmNlIiwgJmZvcmNlLCAiZG9uJ3QgY29tcGxhaW4sIGRvIGl0IiksCisJT1BUX0JPT0xFQU4oJ2YnLCAiZm9yY2UiLCAmcmVwb3J0LmZvcmNlLCAiZG9uJ3QgY29tcGxhaW4sIGRvIGl0IiksCiAJT1BUX0JPT0xFQU4oJ20nLCAibW9kdWxlcyIsICZzeW1ib2xfY29uZi51c2VfbW9kdWxlcywKIAkJICAgICJsb2FkIG1vZHVsZSBzeW1ib2xzIC0gV0FSTklORzogdXNlIG9ubHkgd2l0aCAtayBhbmQgTElWRSBrZXJuZWwiKSwKIAlPUFRfQk9PTEVBTignbicsICJzaG93LW5yLXNhbXBsZXMiLCAmc3ltYm9sX2NvbmYuc2hvd19ucl9zYW1wbGVzLAogCQkgICAgIlNob3cgYSBjb2x1bW4gd2l0aCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMiKSwKLQlPUFRfQk9PTEVBTignVCcsICJ0aHJlYWRzIiwgJnNob3dfdGhyZWFkcywKKwlPUFRfQk9PTEVBTignVCcsICJ0aHJlYWRzIiwgJnJlcG9ydC5zaG93X3RocmVhZHMsCiAJCSAgICAiU2hvdyBwZXItdGhyZWFkIGV2ZW50IGNvdW50ZXJzIiksCi0JT1BUX1NUUklORygwLCAicHJldHR5IiwgJnByZXR0eV9wcmludGluZ19zdHlsZSwgImtleSIsCisJT1BUX1NUUklORygwLCAicHJldHR5IiwgJnJlcG9ydC5wcmV0dHlfcHJpbnRpbmdfc3R5bGUsICJrZXkiLAogCQkgICAicHJldHR5IHByaW50aW5nIHN0eWxlIGtleTogbm9ybWFsIHJhdyIpLAotCU9QVF9CT09MRUFOKDAsICJ0dWkiLCAmdXNlX3R1aSwgIlVzZSB0aGUgVFVJIGludGVyZmFjZSIpLAotCU9QVF9CT09MRUFOKDAsICJzdGRpbyIsICZ1c2Vfc3RkaW8sICJVc2UgdGhlIHN0ZGlvIGludGVyZmFjZSIpLAorCU9QVF9CT09MRUFOKDAsICJ0dWkiLCAmcmVwb3J0LnVzZV90dWksICJVc2UgdGhlIFRVSSBpbnRlcmZhY2UiKSwKKwlPUFRfQk9PTEVBTigwLCAic3RkaW8iLCAmcmVwb3J0LnVzZV9zdGRpbywKKwkJICAgICJVc2UgdGhlIHN0ZGlvIGludGVyZmFjZSIpLAogCU9QVF9TVFJJTkcoJ3MnLCAic29ydCIsICZzb3J0X29yZGVyLCAia2V5WyxrZXkyLi4uXSIsCiAJCSAgICJzb3J0IGJ5IGtleShzKTogcGlkLCBjb21tLCBkc28sIHN5bWJvbCwgcGFyZW50IiksCiAJT1BUX0JPT0xFQU4oMCwgInNob3djcHV1dGlsaXphdGlvbiIsICZzeW1ib2xfY29uZi5zaG93X2NwdV91dGlsaXphdGlvbiwKQEAgLTQ2OCwxMyArNDg0LDE0IEBACiAJCSAgICJyZWdleCBmaWx0ZXIgdG8gaWRlbnRpZnkgcGFyZW50LCBzZWU6ICctLXNvcnQgcGFyZW50JyIpLAogCU9QVF9CT09MRUFOKCd4JywgImV4Y2x1ZGUtb3RoZXIiLCAmc3ltYm9sX2NvbmYuZXhjbHVkZV9vdGhlciwKIAkJICAgICJPbmx5IGRpc3BsYXkgZW50cmllcyB3aXRoIHBhcmVudC1tYXRjaCIpLAotCU9QVF9DQUxMQkFDS19ERUZBVUxUKCdnJywgImNhbGwtZ3JhcGgiLCBOVUxMLCAib3V0cHV0X3R5cGUsbWluX3BlcmNlbnQsIGNhbGxfb3JkZXIiLAotCQkgICAgICJEaXNwbGF5IGNhbGxjaGFpbnMgdXNpbmcgb3V0cHV0X3R5cGUgKGdyYXBoLCBmbGF0LCBmcmFjdGFsLCBvciBub25lKSAsIG1pbiBwZXJjZW50IHRocmVzaG9sZCBhbmQgY2FsbGNoYWluIG9yZGVyLiAiCisJT1BUX0NBTExCQUNLX0RFRkFVTFQoJ2cnLCAiY2FsbC1ncmFwaCIsICZyZXBvcnQsICJvdXRwdXRfdHlwZSxtaW5fcGVyY2VudFsscHJpbnRfbGltaXRdLGNhbGxfb3JkZXIiLAorCQkgICAgICJEaXNwbGF5IGNhbGxjaGFpbnMgdXNpbmcgb3V0cHV0X3R5cGUgKGdyYXBoLCBmbGF0LCBmcmFjdGFsLCBvciBub25lKSAsIG1pbiBwZXJjZW50IHRocmVzaG9sZCwgb3B0aW9uYWwgcHJpbnQgbGltaXQgYW5kIGNhbGxjaGFpbiBvcmRlci4gIgogCQkgICAgICJEZWZhdWx0OiBmcmFjdGFsLDAuNSxjYWxsZWUiLCAmcGFyc2VfY2FsbGNoYWluX29wdCwgY2FsbGNoYWluX2RlZmF1bHRfb3B0KSwKLQlPUFRfQk9PTEVBTignRycsICJpbnZlcnRlZCIsICZpbnZlcnRlZF9jYWxsY2hhaW4sICJhbGlhcyBmb3IgaW52ZXJ0ZWQgY2FsbCBncmFwaCIpLAorCU9QVF9CT09MRUFOKCdHJywgImludmVydGVkIiwgJnJlcG9ydC5pbnZlcnRlZF9jYWxsY2hhaW4sCisJCSAgICAiYWxpYXMgZm9yIGludmVydGVkIGNhbGwgZ3JhcGgiKSwKIAlPUFRfU1RSSU5HKCdkJywgImRzb3MiLCAmc3ltYm9sX2NvbmYuZHNvX2xpc3Rfc3RyLCAiZHNvWyxkc28uLi5dIiwKIAkJICAgIm9ubHkgY29uc2lkZXIgc3ltYm9scyBpbiB0aGVzZSBkc29zIiksCi0JT1BUX1NUUklORygnQycsICJjb21tcyIsICZzeW1ib2xfY29uZi5jb21tX2xpc3Rfc3RyLCAiY29tbVssY29tbS4uLl0iLAorCU9QVF9TVFJJTkcoJ2MnLCAiY29tbXMiLCAmc3ltYm9sX2NvbmYuY29tbV9saXN0X3N0ciwgImNvbW1bLGNvbW0uLi5dIiwKIAkJICAgIm9ubHkgY29uc2lkZXIgc3ltYm9scyBpbiB0aGVzZSBjb21tcyIpLAogCU9QVF9TVFJJTkcoJ1MnLCAic3ltYm9scyIsICZzeW1ib2xfY29uZi5zeW1fbGlzdF9zdHIsICJzeW1ib2xbLHN5bWJvbC4uLl0iLAogCQkgICAib25seSBjb25zaWRlciB0aGVzZSBzeW1ib2xzIiksCkBAIC00ODQsMTIgKzUwMSwxMyBAQAogCU9QVF9TVFJJTkcoJ3QnLCAiZmllbGQtc2VwYXJhdG9yIiwgJnN5bWJvbF9jb25mLmZpZWxkX3NlcCwgInNlcGFyYXRvciIsCiAJCSAgICJzZXBhcmF0b3IgZm9yIGNvbHVtbnMsIG5vIHNwYWNlcyB3aWxsIGJlIGFkZGVkIGJldHdlZW4gIgogCQkgICAiY29sdW1ucyAnLicgaXMgcmVzZXJ2ZWQuIiksCi0JT1BUX0JPT0xFQU4oJ1UnLCAiaGlkZS11bnJlc29sdmVkIiwgJmhpZGVfdW5yZXNvbHZlZCwKKwlPUFRfQk9PTEVBTignVScsICJoaWRlLXVucmVzb2x2ZWQiLCAmcmVwb3J0LmhpZGVfdW5yZXNvbHZlZCwKIAkJICAgICJPbmx5IGRpc3BsYXkgZW50cmllcyByZXNvbHZlZCB0byBhIHN5bWJvbCIpLAogCU9QVF9TVFJJTkcoMCwgInN5bWZzIiwgJnN5bWJvbF9jb25mLnN5bWZzLCAiZGlyZWN0b3J5IiwKIAkJICAgICJMb29rIGZvciBmaWxlcyB3aXRoIHN5bWJvbHMgcmVsYXRpdmUgdG8gdGhpcyBkaXJlY3RvcnkiKSwKLQlPUFRfU1RSSU5HKCdjJywgImNwdSIsICZjcHVfbGlzdCwgImNwdSIsICJsaXN0IG9mIGNwdXMgdG8gcHJvZmlsZSIpLAotCU9QVF9CT09MRUFOKCdJJywgInNob3ctaW5mbyIsICZzaG93X2Z1bGxfaW5mbywKKwlPUFRfU1RSSU5HKCdDJywgImNwdSIsICZyZXBvcnQuY3B1X2xpc3QsICJjcHUiLAorCQkgICAibGlzdCBvZiBjcHVzIHRvIHByb2ZpbGUiKSwKKwlPUFRfQk9PTEVBTignSScsICJzaG93LWluZm8iLCAmcmVwb3J0LnNob3dfZnVsbF9pbmZvLAogCQkgICAgIkRpc3BsYXkgZXh0ZW5kZWQgaW5mb3JtYXRpb24gYWJvdXQgcGVyZi5kYXRhIGZpbGUiKSwKIAlPUFRfQk9PTEVBTigwLCAic291cmNlIiwgJnN5bWJvbF9jb25mLmFubm90YXRlX3NyYywKIAkJICAgICJJbnRlcmxlYXZlIHNvdXJjZSBjb2RlIHdpdGggYXNzZW1ibHkgY29kZSAoZGVmYXVsdCkiKSwKQEAgLTUwMCwyNCArNTE4LDMwIEBACiAJT1BUX0JPT0xFQU4oMCwgInNob3ctdG90YWwtcGVyaW9kIiwgJnN5bWJvbF9jb25mLnNob3dfdG90YWxfcGVyaW9kLAogCQkgICAgIlNob3cgYSBjb2x1bW4gd2l0aCB0aGUgc3VtIG9mIHBlcmlvZHMiKSwKIAlPUFRfRU5EKCkKLX07CisJfTsKIAotaW50IGNtZF9yZXBvcnQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXggX191c2VkKQotewogCWFyZ2MgPSBwYXJzZV9vcHRpb25zKGFyZ2MsIGFyZ3YsIG9wdGlvbnMsIHJlcG9ydF91c2FnZSwgMCk7CiAKLQlpZiAodXNlX3N0ZGlvKQorCWlmIChyZXBvcnQudXNlX3N0ZGlvKQogCQl1c2VfYnJvd3NlciA9IDA7Ci0JZWxzZSBpZiAodXNlX3R1aSkKKwllbHNlIGlmIChyZXBvcnQudXNlX3R1aSkKIAkJdXNlX2Jyb3dzZXIgPSAxOwogCi0JaWYgKGludmVydGVkX2NhbGxjaGFpbikKKwlpZiAocmVwb3J0LmludmVydGVkX2NhbGxjaGFpbikKIAkJY2FsbGNoYWluX3BhcmFtLm9yZGVyID0gT1JERVJfQ0FMTEVSOwogCi0JaWYgKHN0cmNtcChpbnB1dF9uYW1lLCAiLSIpICE9IDApCisJaWYgKCFyZXBvcnQuaW5wdXRfbmFtZSB8fCAhc3RybGVuKHJlcG9ydC5pbnB1dF9uYW1lKSkgeworCQlpZiAoIWZzdGF0KFNURElOX0ZJTEVOTywgJnN0KSAmJiBTX0lTRklGTyhzdC5zdF9tb2RlKSkKKwkJCXJlcG9ydC5pbnB1dF9uYW1lID0gIi0iOworCQllbHNlCisJCQlyZXBvcnQuaW5wdXRfbmFtZSA9ICJwZXJmLmRhdGEiOworCX0KKworCWlmIChzdHJjbXAocmVwb3J0LmlucHV0X25hbWUsICItIikgIT0gMCkKIAkJc2V0dXBfYnJvd3Nlcih0cnVlKTsKIAllbHNlCiAJCXVzZV9icm93c2VyID0gMDsKKwogCS8qCiAJICogT25seSBpbiB0aGUgbmV3dCBicm93c2VyIHdlIGFyZSBkb2luZyBpbnRlZ3JhdGVkIGFubm90YXRpb24sCiAJICogc28gZG9uJ3QgYWxsb2NhdGUgZXh0cmEgc3BhY2UgdGhhdCB3b24ndCBiZSB1c2VkIGluIHRoZSBzdGRpbwpAQCAtNTI1LDcgKzU0OSw3IEBACiAJICovCiAJaWYgKHVzZV9icm93c2VyID4gMCkgewogCQlzeW1ib2xfY29uZi5wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IGFubm90YXRpb24pOwotCQlhbm5vdGF0ZV9pbml0CSAgICAgID0gc3ltYm9sX19hbm5vdGF0ZV9pbml0OworCQlyZXBvcnQuYW5ub3RhdGVfaW5pdCAgPSBzeW1ib2xfX2Fubm90YXRlX2luaXQ7CiAJCS8qCiAgCQkgKiBGb3Igc2VhcmNoaW5nIGJ5IG5hbWUgb24gdGhlICJCcm93c2UgbWFwIGRldGFpbHMiLgogIAkJICogcHJvdmlkaW5nIGl0IG9ubHkgaW4gdmVyYm9zZSBtb2RlIG5vdCB0byBibG9hdCB0b28KQEAgLTU3Miw1ICs1OTYsNSBAQAogCXNvcnRfZW50cnlfX3NldHVwX2VsaWRlKCZzb3J0X2NvbW0sIHN5bWJvbF9jb25mLmNvbW1fbGlzdCwgImNvbW0iLCBzdGRvdXQpOwogCXNvcnRfZW50cnlfX3NldHVwX2VsaWRlKCZzb3J0X3N5bSwgc3ltYm9sX2NvbmYuc3ltX2xpc3QsICJzeW1ib2wiLCBzdGRvdXQpOwogCi0JcmV0dXJuIF9fY21kX3JlcG9ydCgpOworCXJldHVybiBfX2NtZF9yZXBvcnQoJnJlcG9ydCk7CiB9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc2NoZWQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCmluZGV4IDUxNzc5NjQuLmZiOGI1ZjggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY2hlZC5jCkBAIC0yLDExICsyLDE0IEBACiAjaW5jbHVkZSAicGVyZi5oIgogCiAjaW5jbHVkZSAidXRpbC91dGlsLmgiCisjaW5jbHVkZSAidXRpbC9ldmxpc3QuaCIKICNpbmNsdWRlICJ1dGlsL2NhY2hlLmgiCisjaW5jbHVkZSAidXRpbC9ldnNlbC5oIgogI2luY2x1ZGUgInV0aWwvc3ltYm9sLmgiCiAjaW5jbHVkZSAidXRpbC90aHJlYWQuaCIKICNpbmNsdWRlICJ1dGlsL2hlYWRlci5oIgogI2luY2x1ZGUgInV0aWwvc2Vzc2lvbi5oIgorI2luY2x1ZGUgInV0aWwvdG9vbC5oIgogCiAjaW5jbHVkZSAidXRpbC9wYXJzZS1vcHRpb25zLmgiCiAjaW5jbHVkZSAidXRpbC90cmFjZS1ldmVudC5oIgpAQCAtMTksNyArMjIsNyBAQAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKLXN0YXRpYyBjaGFyCQkJY29uc3QgKmlucHV0X25hbWUgPSAicGVyZi5kYXRhIjsKK3N0YXRpYyBjb25zdCBjaGFyCQkqaW5wdXRfbmFtZTsKIAogc3RhdGljIGNoYXIJCQlkZWZhdWx0X3NvcnRfb3JkZXJbXSA9ICJhdmcsIG1heCwgc3dpdGNoLCBydW50aW1lIjsKIHN0YXRpYyBjb25zdCBjaGFyCQkqc29ydF9vcmRlciA9IGRlZmF1bHRfc29ydF9vcmRlcjsKQEAgLTcyMywyMSArNzI2LDIxIEBACiAKIHN0cnVjdCB0cmFjZV9zY2hlZF9oYW5kbGVyIHsKIAl2b2lkICgqc3dpdGNoX2V2ZW50KShzdHJ1Y3QgdHJhY2Vfc3dpdGNoX2V2ZW50ICosCi0JCQkgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKiwKKwkJCSAgICAgc3RydWN0IG1hY2hpbmUgKiwKIAkJCSAgICAgc3RydWN0IGV2ZW50ICosCiAJCQkgICAgIGludCBjcHUsCiAJCQkgICAgIHU2NCB0aW1lc3RhbXAsCiAJCQkgICAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCk7CiAKIAl2b2lkICgqcnVudGltZV9ldmVudCkoc3RydWN0IHRyYWNlX3J1bnRpbWVfZXZlbnQgKiwKLQkJCSAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKiwKKwkJCSAgICAgIHN0cnVjdCBtYWNoaW5lICosCiAJCQkgICAgICBzdHJ1Y3QgZXZlbnQgKiwKIAkJCSAgICAgIGludCBjcHUsCiAJCQkgICAgICB1NjQgdGltZXN0YW1wLAogCQkJICAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKIAogCXZvaWQgKCp3YWtldXBfZXZlbnQpKHN0cnVjdCB0cmFjZV93YWtldXBfZXZlbnQgKiwKLQkJCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqLAorCQkJICAgICBzdHJ1Y3QgbWFjaGluZSAqLAogCQkJICAgICBzdHJ1Y3QgZXZlbnQgKiwKIAkJCSAgICAgaW50IGNwdSwKIAkJCSAgICAgdTY0IHRpbWVzdGFtcCwKQEAgLTc1MCw3ICs3NTMsNyBAQAogCQkJICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKIAogCXZvaWQgKCptaWdyYXRlX3Rhc2tfZXZlbnQpKHN0cnVjdCB0cmFjZV9taWdyYXRlX3Rhc2tfZXZlbnQgKiwKLQkJCSAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCisJCQkgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCSAgIHN0cnVjdCBldmVudCAqLAogCQkJICAgaW50IGNwdSwKIAkJCSAgIHU2NCB0aW1lc3RhbXAsCkBAIC03NjAsNyArNzYzLDcgQEAKIAogc3RhdGljIHZvaWQKIHJlcGxheV93YWtldXBfZXZlbnQoc3RydWN0IHRyYWNlX3dha2V1cF9ldmVudCAqd2FrZXVwX2V2ZW50LAotCQkgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiBfX3VzZWQsCisJCSAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSBfX3VzZWQsCiAJCSAgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50LAogCQkgICAgaW50IGNwdSBfX3VzZWQsCiAJCSAgICB1NjQgdGltZXN0YW1wIF9fdXNlZCwKQEAgLTc4Nyw3ICs3OTAsNyBAQAogCiBzdGF0aWMgdm9pZAogcmVwbGF5X3N3aXRjaF9ldmVudChzdHJ1Y3QgdHJhY2Vfc3dpdGNoX2V2ZW50ICpzd2l0Y2hfZXZlbnQsCi0JCSAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uIF9fdXNlZCwKKwkJICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lIF9fdXNlZCwKIAkJICAgIHN0cnVjdCBldmVudCAqZXZlbnQsCiAJCSAgICBpbnQgY3B1LAogCQkgICAgdTY0IHRpbWVzdGFtcCwKQEAgLTEwMjEsNyArMTAyNCw3IEBACiAKIHN0YXRpYyB2b2lkCiBsYXRlbmN5X3N3aXRjaF9ldmVudChzdHJ1Y3QgdHJhY2Vfc3dpdGNoX2V2ZW50ICpzd2l0Y2hfZXZlbnQsCi0JCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJICAgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50IF9fdXNlZCwKIAkJICAgICBpbnQgY3B1LAogCQkgICAgIHU2NCB0aW1lc3RhbXAsCkBAIC0xMDQ1LDggKzEwNDgsOCBAQAogCQlkaWUoImhtLCBkZWx0YTogJSIgUFJJdTY0ICIgPCAwID9cbiIsIGRlbHRhKTsKIAogCi0Jc2NoZWRfb3V0ID0gcGVyZl9zZXNzaW9uX19maW5kbmV3KHNlc3Npb24sIHN3aXRjaF9ldmVudC0+cHJldl9waWQpOwotCXNjaGVkX2luID0gcGVyZl9zZXNzaW9uX19maW5kbmV3KHNlc3Npb24sIHN3aXRjaF9ldmVudC0+bmV4dF9waWQpOworCXNjaGVkX291dCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIHN3aXRjaF9ldmVudC0+cHJldl9waWQpOworCXNjaGVkX2luID0gbWFjaGluZV9fZmluZG5ld190aHJlYWQobWFjaGluZSwgc3dpdGNoX2V2ZW50LT5uZXh0X3BpZCk7CiAKIAlvdXRfZXZlbnRzID0gdGhyZWFkX2F0b21zX3NlYXJjaCgmYXRvbV9yb290LCBzY2hlZF9vdXQsICZjbXBfcGlkKTsKIAlpZiAoIW91dF9ldmVudHMpIHsKQEAgLTEwNzQsMTMgKzEwNzcsMTMgQEAKIAogc3RhdGljIHZvaWQKIGxhdGVuY3lfcnVudGltZV9ldmVudChzdHJ1Y3QgdHJhY2VfcnVudGltZV9ldmVudCAqcnVudGltZV9ldmVudCwKLQkJICAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAorCQkgICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAogCQkgICAgIHN0cnVjdCBldmVudCAqZXZlbnQgX191c2VkLAogCQkgICAgIGludCBjcHUsCiAJCSAgICAgdTY0IHRpbWVzdGFtcCwKIAkJICAgICBzdHJ1Y3QgdGhyZWFkICp0aGlzX3RocmVhZCBfX3VzZWQpCiB7Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkID0gcGVyZl9zZXNzaW9uX19maW5kbmV3KHNlc3Npb24sIHJ1bnRpbWVfZXZlbnQtPnBpZCk7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkID0gbWFjaGluZV9fZmluZG5ld190aHJlYWQobWFjaGluZSwgcnVudGltZV9ldmVudC0+cGlkKTsKIAlzdHJ1Y3Qgd29ya19hdG9tcyAqYXRvbXMgPSB0aHJlYWRfYXRvbXNfc2VhcmNoKCZhdG9tX3Jvb3QsIHRocmVhZCwgJmNtcF9waWQpOwogCiAJQlVHX09OKGNwdSA+PSBNQVhfQ1BVUyB8fCBjcHUgPCAwKTsKQEAgLTEwOTcsNyArMTEwMCw3IEBACiAKIHN0YXRpYyB2b2lkCiBsYXRlbmN5X3dha2V1cF9ldmVudChzdHJ1Y3QgdHJhY2Vfd2FrZXVwX2V2ZW50ICp3YWtldXBfZXZlbnQsCi0JCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJICAgICBzdHJ1Y3QgZXZlbnQgKl9fZXZlbnQgX191c2VkLAogCQkgICAgIGludCBjcHUgX191c2VkLAogCQkgICAgIHU2NCB0aW1lc3RhbXAsCkBAIC0xMTExLDcgKzExMTQsNyBAQAogCWlmICghd2FrZXVwX2V2ZW50LT5zdWNjZXNzKQogCQlyZXR1cm47CiAKLQl3YWtlZSA9IHBlcmZfc2Vzc2lvbl9fZmluZG5ldyhzZXNzaW9uLCB3YWtldXBfZXZlbnQtPnBpZCk7CisJd2FrZWUgPSBtYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLCB3YWtldXBfZXZlbnQtPnBpZCk7CiAJYXRvbXMgPSB0aHJlYWRfYXRvbXNfc2VhcmNoKCZhdG9tX3Jvb3QsIHdha2VlLCAmY21wX3BpZCk7CiAJaWYgKCFhdG9tcykgewogCQl0aHJlYWRfYXRvbXNfaW5zZXJ0KHdha2VlKTsKQEAgLTExNDUsNyArMTE0OCw3IEBACiAKIHN0YXRpYyB2b2lkCiBsYXRlbmN5X21pZ3JhdGVfdGFza19ldmVudChzdHJ1Y3QgdHJhY2VfbWlncmF0ZV90YXNrX2V2ZW50ICptaWdyYXRlX3Rhc2tfZXZlbnQsCi0JCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJICAgICBzdHJ1Y3QgZXZlbnQgKl9fZXZlbnQgX191c2VkLAogCQkgICAgIGludCBjcHUgX191c2VkLAogCQkgICAgIHU2NCB0aW1lc3RhbXAsCkBAIC0xMTYxLDcgKzExNjQsNyBAQAogCWlmIChwcm9maWxlX2NwdSA9PSAtMSkKIAkJcmV0dXJuOwogCi0JbWlncmFudCA9IHBlcmZfc2Vzc2lvbl9fZmluZG5ldyhzZXNzaW9uLCBtaWdyYXRlX3Rhc2tfZXZlbnQtPnBpZCk7CisJbWlncmFudCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIG1pZ3JhdGVfdGFza19ldmVudC0+cGlkKTsKIAlhdG9tcyA9IHRocmVhZF9hdG9tc19zZWFyY2goJmF0b21fcm9vdCwgbWlncmFudCwgJmNtcF9waWQpOwogCWlmICghYXRvbXMpIHsKIAkJdGhyZWFkX2F0b21zX2luc2VydChtaWdyYW50KTsKQEAgLTEzNTYsMTIgKzEzNTksMTMgQEAKIHN0YXRpYyBzdHJ1Y3QgdHJhY2Vfc2NoZWRfaGFuZGxlciAqdHJhY2VfaGFuZGxlcjsKIAogc3RhdGljIHZvaWQKLXByb2Nlc3Nfc2NoZWRfd2FrZXVwX2V2ZW50KHZvaWQgKmRhdGEsIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCitwcm9jZXNzX3NjaGVkX3dha2V1cF9ldmVudChzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKIAkJCSAgIHN0cnVjdCBldmVudCAqZXZlbnQsCi0JCQkgICBpbnQgY3B1IF9fdXNlZCwKLQkJCSAgIHU2NCB0aW1lc3RhbXAgX191c2VkLAotCQkJICAgc3RydWN0IHRocmVhZCAqdGhyZWFkIF9fdXNlZCkKKwkJCSAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCisJCQkgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpCiB7CisJdm9pZCAqZGF0YSA9IHNhbXBsZS0+cmF3X2RhdGE7CiAJc3RydWN0IHRyYWNlX3dha2V1cF9ldmVudCB3YWtldXBfZXZlbnQ7CiAKIAlGSUxMX0NPTU1PTl9GSUVMRFMod2FrZXVwX2V2ZW50LCBldmVudCwgZGF0YSk7CkBAIC0xMzczLDggKzEzNzcsOCBAQAogCUZJTExfRklFTEQod2FrZXVwX2V2ZW50LCBjcHUsIGV2ZW50LCBkYXRhKTsKIAogCWlmICh0cmFjZV9oYW5kbGVyLT53YWtldXBfZXZlbnQpCi0JCXRyYWNlX2hhbmRsZXItPndha2V1cF9ldmVudCgmd2FrZXVwX2V2ZW50LCBzZXNzaW9uLCBldmVudCwKLQkJCQkJICAgIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOworCQl0cmFjZV9oYW5kbGVyLT53YWtldXBfZXZlbnQoJndha2V1cF9ldmVudCwgbWFjaGluZSwgZXZlbnQsCisJCQkJCSAgICBzYW1wbGUtPmNwdSwgc2FtcGxlLT50aW1lLCB0aHJlYWQpOwogfQogCiAvKgpAQCAtMTM5Miw3ICsxMzk2LDcgQEAKIAogc3RhdGljIHZvaWQKIG1hcF9zd2l0Y2hfZXZlbnQoc3RydWN0IHRyYWNlX3N3aXRjaF9ldmVudCAqc3dpdGNoX2V2ZW50LAotCQkgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAogCQkgc3RydWN0IGV2ZW50ICpldmVudCBfX3VzZWQsCiAJCSBpbnQgdGhpc19jcHUsCiAJCSB1NjQgdGltZXN0YW1wLApAQCAtMTQyMCw4ICsxNDI0LDggQEAKIAkJZGllKCJobSwgZGVsdGE6ICUiIFBSSXU2NCAiIDwgMCA/XG4iLCBkZWx0YSk7CiAKIAotCXNjaGVkX291dCA9IHBlcmZfc2Vzc2lvbl9fZmluZG5ldyhzZXNzaW9uLCBzd2l0Y2hfZXZlbnQtPnByZXZfcGlkKTsKLQlzY2hlZF9pbiA9IHBlcmZfc2Vzc2lvbl9fZmluZG5ldyhzZXNzaW9uLCBzd2l0Y2hfZXZlbnQtPm5leHRfcGlkKTsKKwlzY2hlZF9vdXQgPSBtYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLCBzd2l0Y2hfZXZlbnQtPnByZXZfcGlkKTsKKwlzY2hlZF9pbiA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIHN3aXRjaF9ldmVudC0+bmV4dF9waWQpOwogCiAJY3Vycl90aHJlYWRbdGhpc19jcHVdID0gc2NoZWRfaW47CiAKQEAgLTE0NjksMTQgKzE0NzMsMTUgQEAKIAl9CiB9CiAKLQogc3RhdGljIHZvaWQKLXByb2Nlc3Nfc2NoZWRfc3dpdGNoX2V2ZW50KHZvaWQgKmRhdGEsIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCitwcm9jZXNzX3NjaGVkX3N3aXRjaF9ldmVudChzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKIAkJCSAgIHN0cnVjdCBldmVudCAqZXZlbnQsCi0JCQkgICBpbnQgdGhpc19jcHUsCi0JCQkgICB1NjQgdGltZXN0YW1wIF9fdXNlZCwKLQkJCSAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCBfX3VzZWQpCisJCQkgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCSAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAorCQkJICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKQogeworCWludCB0aGlzX2NwdSA9IHNhbXBsZS0+Y3B1OworCXZvaWQgKmRhdGEgPSBzYW1wbGUtPnJhd19kYXRhOwogCXN0cnVjdCB0cmFjZV9zd2l0Y2hfZXZlbnQgc3dpdGNoX2V2ZW50OwogCiAJRklMTF9DT01NT05fRklFTERTKHN3aXRjaF9ldmVudCwgZXZlbnQsIGRhdGEpOwpAQCAtMTQ5OCwxOSArMTUwMywyMCBAQAogCQkJbnJfY29udGV4dF9zd2l0Y2hfYnVncysrOwogCX0KIAlpZiAodHJhY2VfaGFuZGxlci0+c3dpdGNoX2V2ZW50KQotCQl0cmFjZV9oYW5kbGVyLT5zd2l0Y2hfZXZlbnQoJnN3aXRjaF9ldmVudCwgc2Vzc2lvbiwgZXZlbnQsCi0JCQkJCSAgICB0aGlzX2NwdSwgdGltZXN0YW1wLCB0aHJlYWQpOworCQl0cmFjZV9oYW5kbGVyLT5zd2l0Y2hfZXZlbnQoJnN3aXRjaF9ldmVudCwgbWFjaGluZSwgZXZlbnQsCisJCQkJCSAgICB0aGlzX2NwdSwgc2FtcGxlLT50aW1lLCB0aHJlYWQpOwogCiAJY3Vycl9waWRbdGhpc19jcHVdID0gc3dpdGNoX2V2ZW50Lm5leHRfcGlkOwogfQogCiBzdGF0aWMgdm9pZAotcHJvY2Vzc19zY2hlZF9ydW50aW1lX2V2ZW50KHZvaWQgKmRhdGEsIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCi0JCQkgICBzdHJ1Y3QgZXZlbnQgKmV2ZW50LAotCQkJICAgaW50IGNwdSBfX3VzZWQsCi0JCQkgICB1NjQgdGltZXN0YW1wIF9fdXNlZCwKLQkJCSAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCBfX3VzZWQpCitwcm9jZXNzX3NjaGVkX3J1bnRpbWVfZXZlbnQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX3VzZWQsCisJCQkgICAgc3RydWN0IGV2ZW50ICpldmVudCwKKwkJCSAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCSAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKKwkJCSAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpCiB7CisJdm9pZCAqZGF0YSA9IHNhbXBsZS0+cmF3X2RhdGE7CiAJc3RydWN0IHRyYWNlX3J1bnRpbWVfZXZlbnQgcnVudGltZV9ldmVudDsKIAogCUZJTExfQVJSQVkocnVudGltZV9ldmVudCwgY29tbSwgZXZlbnQsIGRhdGEpOwpAQCAtMTUxOSwxNiArMTUyNSwxOCBAQAogCUZJTExfRklFTEQocnVudGltZV9ldmVudCwgdnJ1bnRpbWUsIGV2ZW50LCBkYXRhKTsKIAogCWlmICh0cmFjZV9oYW5kbGVyLT5ydW50aW1lX2V2ZW50KQotCQl0cmFjZV9oYW5kbGVyLT5ydW50aW1lX2V2ZW50KCZydW50aW1lX2V2ZW50LCBzZXNzaW9uLCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7CisJCXRyYWNlX2hhbmRsZXItPnJ1bnRpbWVfZXZlbnQoJnJ1bnRpbWVfZXZlbnQsIG1hY2hpbmUsIGV2ZW50LAorCQkJCQkgICAgIHNhbXBsZS0+Y3B1LCBzYW1wbGUtPnRpbWUsIHRocmVhZCk7CiB9CiAKIHN0YXRpYyB2b2lkCi1wcm9jZXNzX3NjaGVkX2ZvcmtfZXZlbnQodm9pZCAqZGF0YSwKK3Byb2Nlc3Nfc2NoZWRfZm9ya19ldmVudChzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKIAkJCSBzdHJ1Y3QgZXZlbnQgKmV2ZW50LAotCQkJIGludCBjcHUgX191c2VkLAotCQkJIHU2NCB0aW1lc3RhbXAgX191c2VkLAotCQkJIHN0cnVjdCB0aHJlYWQgKnRocmVhZCBfX3VzZWQpCisJCQkgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191c2VkLAorCQkJIHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKKwl2b2lkICpkYXRhID0gc2FtcGxlLT5yYXdfZGF0YTsKIAlzdHJ1Y3QgdHJhY2VfZm9ya19ldmVudCBmb3JrX2V2ZW50OwogCiAJRklMTF9DT01NT05fRklFTERTKGZvcmtfZXZlbnQsIGV2ZW50LCBkYXRhKTsKQEAgLTE1NDAsMTMgKzE1NDgsMTQgQEAKIAogCWlmICh0cmFjZV9oYW5kbGVyLT5mb3JrX2V2ZW50KQogCQl0cmFjZV9oYW5kbGVyLT5mb3JrX2V2ZW50KCZmb3JrX2V2ZW50LCBldmVudCwKLQkJCQkJICBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwkJCQkJICBzYW1wbGUtPmNwdSwgc2FtcGxlLT50aW1lLCB0aHJlYWQpOwogfQogCiBzdGF0aWMgdm9pZAotcHJvY2Vzc19zY2hlZF9leGl0X2V2ZW50KHN0cnVjdCBldmVudCAqZXZlbnQsCi0JCQkgaW50IGNwdSBfX3VzZWQsCi0JCQkgdTY0IHRpbWVzdGFtcCBfX3VzZWQsCitwcm9jZXNzX3NjaGVkX2V4aXRfZXZlbnQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX3VzZWQsCisJCQkgc3RydWN0IGV2ZW50ICpldmVudCwKKwkJCSBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSBfX3VzZWQsCisJCQkgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191c2VkLAogCQkJIHN0cnVjdCB0aHJlYWQgKnRocmVhZCBfX3VzZWQpCiB7CiAJaWYgKHZlcmJvc2UpCkBAIC0xNTU0LDEyICsxNTYzLDEzIEBACiB9CiAKIHN0YXRpYyB2b2lkCi1wcm9jZXNzX3NjaGVkX21pZ3JhdGVfdGFza19ldmVudCh2b2lkICpkYXRhLCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJICAgc3RydWN0IGV2ZW50ICpldmVudCwKLQkJCSAgIGludCBjcHUgX191c2VkLAotCQkJICAgdTY0IHRpbWVzdGFtcCBfX3VzZWQsCi0JCQkgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgX191c2VkKQorcHJvY2Vzc19zY2hlZF9taWdyYXRlX3Rhc2tfZXZlbnQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX3VzZWQsCisJCQkJIHN0cnVjdCBldmVudCAqZXZlbnQsCisJCQkJIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJCSBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKKwkJCQkgc3RydWN0IHRocmVhZCAqdGhyZWFkKQogeworCXZvaWQgKmRhdGEgPSBzYW1wbGUtPnJhd19kYXRhOwogCXN0cnVjdCB0cmFjZV9taWdyYXRlX3Rhc2tfZXZlbnQgbWlncmF0ZV90YXNrX2V2ZW50OwogCiAJRklMTF9DT01NT05fRklFTERTKG1pZ3JhdGVfdGFza19ldmVudCwgZXZlbnQsIGRhdGEpOwpAQCAtMTU3MCw2NyArMTU4MCw0NyBAQAogCUZJTExfRklFTEQobWlncmF0ZV90YXNrX2V2ZW50LCBjcHUsIGV2ZW50LCBkYXRhKTsKIAogCWlmICh0cmFjZV9oYW5kbGVyLT5taWdyYXRlX3Rhc2tfZXZlbnQpCi0JCXRyYWNlX2hhbmRsZXItPm1pZ3JhdGVfdGFza19ldmVudCgmbWlncmF0ZV90YXNrX2V2ZW50LCBzZXNzaW9uLAotCQkJCQkJIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKKwkJdHJhY2VfaGFuZGxlci0+bWlncmF0ZV90YXNrX2V2ZW50KCZtaWdyYXRlX3Rhc2tfZXZlbnQsIG1hY2hpbmUsCisJCQkJCQkgIGV2ZW50LCBzYW1wbGUtPmNwdSwKKwkJCQkJCSAgc2FtcGxlLT50aW1lLCB0aHJlYWQpOwogfQogCi1zdGF0aWMgdm9pZCBwcm9jZXNzX3Jhd19ldmVudCh1bmlvbiBwZXJmX2V2ZW50ICpyYXdfZXZlbnQgX191c2VkLAotCQkJICAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgdm9pZCAqZGF0YSwgaW50IGNwdSwKLQkJCSAgICAgIHU2NCB0aW1lc3RhbXAsIHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKK3R5cGVkZWYgdm9pZCAoKnRyYWNlcG9pbnRfaGFuZGxlcikoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwgc3RydWN0IGV2ZW50ICpldmVudCwKKwkJCQkgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCQkgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKKwkJCQkgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpOworCitzdGF0aWMgaW50IHBlcmZfc2NoZWRfX3Byb2Nlc3NfdHJhY2Vwb2ludF9zYW1wbGUoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQkJCSB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCBfX3VzZWQsCisJCQkJCQkgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkJCQkgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJCQkJIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogewotCXN0cnVjdCBldmVudCAqZXZlbnQ7Ci0JaW50IHR5cGU7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkID0gbWFjaGluZV9fZmluZG5ld190aHJlYWQobWFjaGluZSwgc2FtcGxlLT5waWQpOwogCi0KLQl0eXBlID0gdHJhY2VfcGFyc2VfY29tbW9uX3R5cGUoZGF0YSk7Ci0JZXZlbnQgPSB0cmFjZV9maW5kX2V2ZW50KHR5cGUpOwotCi0JaWYgKCFzdHJjbXAoZXZlbnQtPm5hbWUsICJzY2hlZF9zd2l0Y2giKSkKLQkJcHJvY2Vzc19zY2hlZF9zd2l0Y2hfZXZlbnQoZGF0YSwgc2Vzc2lvbiwgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOwotCWlmICghc3RyY21wKGV2ZW50LT5uYW1lLCAic2NoZWRfc3RhdF9ydW50aW1lIikpCi0JCXByb2Nlc3Nfc2NoZWRfcnVudGltZV9ldmVudChkYXRhLCBzZXNzaW9uLCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7Ci0JaWYgKCFzdHJjbXAoZXZlbnQtPm5hbWUsICJzY2hlZF93YWtldXAiKSkKLQkJcHJvY2Vzc19zY2hlZF93YWtldXBfZXZlbnQoZGF0YSwgc2Vzc2lvbiwgZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOwotCWlmICghc3RyY21wKGV2ZW50LT5uYW1lLCAic2NoZWRfd2FrZXVwX25ldyIpKQotCQlwcm9jZXNzX3NjaGVkX3dha2V1cF9ldmVudChkYXRhLCBzZXNzaW9uLCBldmVudCwgY3B1LCB0aW1lc3RhbXAsIHRocmVhZCk7Ci0JaWYgKCFzdHJjbXAoZXZlbnQtPm5hbWUsICJzY2hlZF9wcm9jZXNzX2ZvcmsiKSkKLQkJcHJvY2Vzc19zY2hlZF9mb3JrX2V2ZW50KGRhdGEsIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKLQlpZiAoIXN0cmNtcChldmVudC0+bmFtZSwgInNjaGVkX3Byb2Nlc3NfZXhpdCIpKQotCQlwcm9jZXNzX3NjaGVkX2V4aXRfZXZlbnQoZXZlbnQsIGNwdSwgdGltZXN0YW1wLCB0aHJlYWQpOwotCWlmICghc3RyY21wKGV2ZW50LT5uYW1lLCAic2NoZWRfbWlncmF0ZV90YXNrIikpCi0JCXByb2Nlc3Nfc2NoZWRfbWlncmF0ZV90YXNrX2V2ZW50KGRhdGEsIHNlc3Npb24sIGV2ZW50LCBjcHUsIHRpbWVzdGFtcCwgdGhyZWFkKTsKLX0KLQotc3RhdGljIGludCBwcm9jZXNzX3NhbXBsZV9ldmVudCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKLQkJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKLQkJCQlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX191c2VkLAotCQkJCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCi17Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkOwotCi0JaWYgKCEoc2Vzc2lvbi0+c2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9SQVcpKQotCQlyZXR1cm4gMDsKLQotCXRocmVhZCA9IHBlcmZfc2Vzc2lvbl9fZmluZG5ldyhzZXNzaW9uLCBzYW1wbGUtPnBpZCk7CiAJaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0JCXByX2RlYnVnKCJwcm9ibGVtIHByb2Nlc3NpbmcgJWQgZXZlbnQsIHNraXBwaW5nIGl0LlxuIiwKLQkJCSBldmVudC0+aGVhZGVyLnR5cGUpOworCQlwcl9kZWJ1ZygicHJvYmxlbSBwcm9jZXNzaW5nICVzIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCisJCQkgZXZzZWwtPm5hbWUpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JZHVtcF9wcmludGYoIiAuLi4gdGhyZWFkOiAlczolZFxuIiwgdGhyZWFkLT5jb21tLCB0aHJlYWQtPnBpZCk7CisJZXZzZWwtPmhpc3RzLnN0YXRzLnRvdGFsX3BlcmlvZCArPSBzYW1wbGUtPnBlcmlvZDsKKwloaXN0c19faW5jX25yX2V2ZW50cygmZXZzZWwtPmhpc3RzLCBQRVJGX1JFQ09SRF9TQU1QTEUpOwogCi0JaWYgKHByb2ZpbGVfY3B1ICE9IC0xICYmIHByb2ZpbGVfY3B1ICE9IChpbnQpc2FtcGxlLT5jcHUpCi0JCXJldHVybiAwOworCWlmIChldnNlbC0+aGFuZGxlci5mdW5jICE9IE5VTEwpIHsKKwkJdHJhY2Vwb2ludF9oYW5kbGVyIGYgPSBldnNlbC0+aGFuZGxlci5mdW5jOwogCi0JcHJvY2Vzc19yYXdfZXZlbnQoZXZlbnQsIHNlc3Npb24sIHNhbXBsZS0+cmF3X2RhdGEsIHNhbXBsZS0+Y3B1LAotCQkJICBzYW1wbGUtPnRpbWUsIHRocmVhZCk7CisJCWlmIChldnNlbC0+aGFuZGxlci5kYXRhID09IE5VTEwpCisJCQlldnNlbC0+aGFuZGxlci5kYXRhID0gdHJhY2VfZmluZF9ldmVudChldnNlbC0+YXR0ci5jb25maWcpOworCisJCWYodG9vbCwgZXZzZWwtPmhhbmRsZXIuZGF0YSwgc2FtcGxlLCBtYWNoaW5lLCB0aHJlYWQpOworCX0KIAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgc3RydWN0IHBlcmZfZXZlbnRfb3BzIGV2ZW50X29wcyA9IHsKLQkuc2FtcGxlCQkJPSBwcm9jZXNzX3NhbXBsZV9ldmVudCwKK3N0YXRpYyBzdHJ1Y3QgcGVyZl90b29sIHBlcmZfc2NoZWQgPSB7CisJLnNhbXBsZQkJCT0gcGVyZl9zY2hlZF9fcHJvY2Vzc190cmFjZXBvaW50X3NhbXBsZSwKIAkuY29tbQkJCT0gcGVyZl9ldmVudF9fcHJvY2Vzc19jb21tLAogCS5sb3N0CQkJPSBwZXJmX2V2ZW50X19wcm9jZXNzX2xvc3QsCiAJLmZvcmsJCQk9IHBlcmZfZXZlbnRfX3Byb2Nlc3NfdGFzaywKQEAgLTE2NDAsMTMgKzE2MzAsMjUgQEAKIHN0YXRpYyB2b2lkIHJlYWRfZXZlbnRzKGJvb2wgZGVzdHJveSwgc3RydWN0IHBlcmZfc2Vzc2lvbiAqKnBzZXNzaW9uKQogewogCWludCBlcnIgPSAtRUlOVkFMOworCWNvbnN0IHN0cnVjdCBwZXJmX2V2c2VsX3N0cl9oYW5kbGVyIGhhbmRsZXJzW10gPSB7CisJCXsgInNjaGVkOnNjaGVkX3N3aXRjaCIsCSAgICAgIHByb2Nlc3Nfc2NoZWRfc3dpdGNoX2V2ZW50LCB9LAorCQl7ICJzY2hlZDpzY2hlZF9zdGF0X3J1bnRpbWUiLCBwcm9jZXNzX3NjaGVkX3J1bnRpbWVfZXZlbnQsIH0sCisJCXsgInNjaGVkOnNjaGVkX3dha2V1cCIsCSAgICAgIHByb2Nlc3Nfc2NoZWRfd2FrZXVwX2V2ZW50LCB9LAorCQl7ICJzY2hlZDpzY2hlZF93YWtldXBfbmV3IiwgICBwcm9jZXNzX3NjaGVkX3dha2V1cF9ldmVudCwgfSwKKwkJeyAic2NoZWQ6c2NoZWRfcHJvY2Vzc19mb3JrIiwgcHJvY2Vzc19zY2hlZF9mb3JrX2V2ZW50LCB9LAorCQl7ICJzY2hlZDpzY2hlZF9wcm9jZXNzX2V4aXQiLCBwcm9jZXNzX3NjaGVkX2V4aXRfZXZlbnQsIH0sCisJCXsgInNjaGVkOnNjaGVkX21pZ3JhdGVfdGFzayIsIHByb2Nlc3Nfc2NoZWRfbWlncmF0ZV90YXNrX2V2ZW50LCB9LAorCX07CiAJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25hbWUsIE9fUkRPTkxZLAotCQkJCQkJCSAwLCBmYWxzZSwgJmV2ZW50X29wcyk7CisJCQkJCQkJIDAsIGZhbHNlLCAmcGVyZl9zY2hlZCk7CiAJaWYgKHNlc3Npb24gPT0gTlVMTCkKIAkJZGllKCJObyBNZW1vcnkiKTsKIAorCWVyciA9IHBlcmZfZXZsaXN0X19zZXRfdHJhY2Vwb2ludHNfaGFuZGxlcnNfYXJyYXkoc2Vzc2lvbi0+ZXZsaXN0LCBoYW5kbGVycyk7CisJYXNzZXJ0KGVyciA9PSAwKTsKKwogCWlmIChwZXJmX3Nlc3Npb25fX2hhc190cmFjZXMoc2Vzc2lvbiwgInJlY29yZCAtUiIpKSB7Ci0JCWVyciA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJmV2ZW50X29wcyk7CisJCWVyciA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJnBlcmZfc2NoZWQpOwogCQlpZiAoZXJyKQogCQkJZGllKCJGYWlsZWQgdG8gcHJvY2VzcyBldmVudHMsIGVycm9yICVkIiwgZXJyKTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXNjcmlwdC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXNjcmlwdC5jCmluZGV4IDJmNjJhMjkuLmZkMTkwOWEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zY3JpcHQuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tc2NyaXB0LmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSAidXRpbC9oZWFkZXIuaCIKICNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKICNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKKyNpbmNsdWRlICJ1dGlsL3Rvb2wuaCIKICNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgogI2luY2x1ZGUgInV0aWwvdGhyZWFkLmgiCiAjaW5jbHVkZSAidXRpbC90cmFjZS1ldmVudC5oIgpAQCAtMjMsNiArMjQsNyBAQAogZXh0ZXJuIGNvbnN0IHN0cnVjdCBvcHRpb24JcmVjb3JkX29wdGlvbnNbXTsKIHN0YXRpYyBib29sCQkJbm9fY2FsbGNoYWluOwogc3RhdGljIGJvb2wJCQlzaG93X2Z1bGxfaW5mbzsKK3N0YXRpYyBib29sCQkJc3lzdGVtX3dpZGU7CiBzdGF0aWMgY29uc3QgY2hhcgkJKmNwdV9saXN0Owogc3RhdGljIERFQ0xBUkVfQklUTUFQKGNwdV9iaXRtYXAsIE1BWF9OUl9DUFVTKTsKIApAQCAtMzE1LDcgKzMxNyw3IEBACiAKIHN0YXRpYyB2b2lkIHByaW50X3NhbXBsZV9hZGRyKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKLQkJCSAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCSAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCiAJCQkgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKIAkJCSAgc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0cikKIHsKQEAgLTMyOCwxMSArMzMwLDExIEBACiAJaWYgKCFzYW1wbGVfYWRkcl9jb3JyZWxhdGVzX3N5bShhdHRyKSkKIAkJcmV0dXJuOwogCi0JdGhyZWFkX19maW5kX2FkZHJfbWFwKHRocmVhZCwgc2Vzc2lvbiwgY3B1bW9kZSwgTUFQX19GVU5DVElPTiwKLQkJCSAgICAgIGV2ZW50LT5pcC5waWQsIHNhbXBsZS0+YWRkciwgJmFsKTsKKwl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodGhyZWFkLCBtYWNoaW5lLCBjcHVtb2RlLCBNQVBfX0ZVTkNUSU9OLAorCQkJICAgICAgc2FtcGxlLT5hZGRyLCAmYWwpOwogCWlmICghYWwubWFwKQotCQl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodGhyZWFkLCBzZXNzaW9uLCBjcHVtb2RlLCBNQVBfX1ZBUklBQkxFLAotCQkJCSAgICAgIGV2ZW50LT5pcC5waWQsIHNhbXBsZS0+YWRkciwgJmFsKTsKKwkJdGhyZWFkX19maW5kX2FkZHJfbWFwKHRocmVhZCwgbWFjaGluZSwgY3B1bW9kZSwgTUFQX19WQVJJQUJMRSwKKwkJCQkgICAgICBzYW1wbGUtPmFkZHIsICZhbCk7CiAKIAlhbC5jcHUgPSBzYW1wbGUtPmNwdTsKIAlhbC5zeW0gPSBOVUxMOwpAQCAtMzYyLDcgKzM2NCw3IEBACiBzdGF0aWMgdm9pZCBwcm9jZXNzX2V2ZW50KHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50IF9fdW51c2VkLAogCQkJICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKIAkJCSAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAorCQkJICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCSAgc3RydWN0IHRocmVhZCAqdGhyZWFkKQogewogCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIgPSAmZXZzZWwtPmF0dHI7CkBAIC0zNzcsMTUgKzM3OSwxNSBAQAogCQkJCSAgc2FtcGxlLT5yYXdfc2l6ZSk7CiAKIAlpZiAoUFJJTlRfRklFTEQoQUREUikpCi0JCXByaW50X3NhbXBsZV9hZGRyKGV2ZW50LCBzYW1wbGUsIHNlc3Npb24sIHRocmVhZCwgYXR0cik7CisJCXByaW50X3NhbXBsZV9hZGRyKGV2ZW50LCBzYW1wbGUsIG1hY2hpbmUsIHRocmVhZCwgYXR0cik7CiAKIAlpZiAoUFJJTlRfRklFTEQoSVApKSB7CiAJCWlmICghc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikKIAkJCXByaW50ZigiICIpOwogCQllbHNlCiAJCQlwcmludGYoIlxuIik7Ci0JCXBlcmZfc2Vzc2lvbl9fcHJpbnRfaXAoZXZlbnQsIHNhbXBsZSwgc2Vzc2lvbiwKLQkJCQkJICAgICAgUFJJTlRfRklFTEQoU1lNKSwgUFJJTlRfRklFTEQoRFNPKSk7CisJCXBlcmZfZXZlbnRfX3ByaW50X2lwKGV2ZW50LCBzYW1wbGUsIG1hY2hpbmUsIGV2c2VsLAorCQkJCSAgICAgUFJJTlRfRklFTEQoU1lNKSwgUFJJTlRfRklFTEQoRFNPKSk7CiAJfQogCiAJcHJpbnRmKCJcbiIpOwpAQCAtNDMyLDE0ICs0MzQsMTYgQEAKIAlyZXR1cm4gc2NyaXB0aW5nX29wcy0+c3RvcF9zY3JpcHQoKTsKIH0KIAotc3RhdGljIGNoYXIgY29uc3QJCSppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CitzdGF0aWMgY29uc3QgY2hhciAqaW5wdXRfbmFtZTsKIAotc3RhdGljIGludCBwcm9jZXNzX3NhbXBsZV9ldmVudCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKK3N0YXRpYyBpbnQgcHJvY2Vzc19zYW1wbGVfZXZlbnQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX3VzZWQsCisJCQkJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkID0gcGVyZl9zZXNzaW9uX19maW5kbmV3KHNlc3Npb24sIGV2ZW50LT5pcC5waWQpOworCXN0cnVjdCBhZGRyX2xvY2F0aW9uIGFsOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIGV2ZW50LT5pcC50aWQpOwogCiAJaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAJCXByX2RlYnVnKCJwcm9ibGVtIHByb2Nlc3NpbmcgJWQgZXZlbnQsIHNraXBwaW5nIGl0LlxuIiwKQEAgLTQ1OCwxNiArNDYyLDI1IEBACiAJCXJldHVybiAwOwogCX0KIAorCWlmIChwZXJmX2V2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShldmVudCwgbWFjaGluZSwgJmFsLCBzYW1wbGUsIDApIDwgMCkgeworCQlwcl9lcnIoInByb2JsZW0gcHJvY2Vzc2luZyAlZCBldmVudCwgc2tpcHBpbmcgaXQuXG4iLAorCQkgICAgICAgZXZlbnQtPmhlYWRlci50eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChhbC5maWx0ZXJlZCkKKwkJcmV0dXJuIDA7CisKIAlpZiAoY3B1X2xpc3QgJiYgIXRlc3RfYml0KHNhbXBsZS0+Y3B1LCBjcHVfYml0bWFwKSkKIAkJcmV0dXJuIDA7CiAKLQlzY3JpcHRpbmdfb3BzLT5wcm9jZXNzX2V2ZW50KGV2ZW50LCBzYW1wbGUsIGV2c2VsLCBzZXNzaW9uLCB0aHJlYWQpOworCXNjcmlwdGluZ19vcHMtPnByb2Nlc3NfZXZlbnQoZXZlbnQsIHNhbXBsZSwgZXZzZWwsIG1hY2hpbmUsIHRocmVhZCk7CiAKLQlzZXNzaW9uLT5oaXN0cy5zdGF0cy50b3RhbF9wZXJpb2QgKz0gc2FtcGxlLT5wZXJpb2Q7CisJZXZzZWwtPmhpc3RzLnN0YXRzLnRvdGFsX3BlcmlvZCArPSBzYW1wbGUtPnBlcmlvZDsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHN0cnVjdCBwZXJmX2V2ZW50X29wcyBldmVudF9vcHMgPSB7CitzdGF0aWMgc3RydWN0IHBlcmZfdG9vbCBwZXJmX3NjcmlwdCA9IHsKIAkuc2FtcGxlCQkgPSBwcm9jZXNzX3NhbXBsZV9ldmVudCwKIAkubW1hcAkJID0gcGVyZl9ldmVudF9fcHJvY2Vzc19tbWFwLAogCS5jb21tCQkgPSBwZXJmX2V2ZW50X19wcm9jZXNzX2NvbW0sCkBAIC00OTQsNyArNTA3LDcgQEAKIAogCXNpZ25hbChTSUdJTlQsIHNpZ19oYW5kbGVyKTsKIAotCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJmV2ZW50X29wcyk7CisJcmV0ID0gcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzZXNzaW9uLCAmcGVyZl9zY3JpcHQpOwogCiAJaWYgKGRlYnVnX21vZGUpCiAJCXByX2VycigiTWlzb3JkZXJlZCB0aW1lc3RhbXBzOiAlIiBQUkl1NjQgIlxuIiwgbnJfdW5vcmRlcmVkKTsKQEAgLTUyMywxMiArNTM2LDYgQEAKIAlyZXR1cm4gczsKIH0KIAotc3RhdGljIHZvaWQgc2NyaXB0X3NwZWNfX2RlbGV0ZShzdHJ1Y3Qgc2NyaXB0X3NwZWMgKnMpCi17Ci0JZnJlZShzLT5zcGVjKTsKLQlmcmVlKHMpOwotfQotCiBzdGF0aWMgdm9pZCBzY3JpcHRfc3BlY19fYWRkKHN0cnVjdCBzY3JpcHRfc3BlYyAqcykKIHsKIAlsaXN0X2FkZF90YWlsKCZzLT5ub2RlLCAmc2NyaXB0X3NwZWNzKTsKQEAgLTU1NCwxNiArNTYxLDExIEBACiAKIAlzID0gc2NyaXB0X3NwZWNfX25ldyhzcGVjLCBvcHMpOwogCWlmICghcykKLQkJZ290byBvdXRfZGVsZXRlX3NwZWM7CisJCXJldHVybiBOVUxMOwogCiAJc2NyaXB0X3NwZWNfX2FkZChzKTsKIAogCXJldHVybiBzOwotCi1vdXRfZGVsZXRlX3NwZWM6Ci0Jc2NyaXB0X3NwZWNfX2RlbGV0ZShzKTsKLQotCXJldHVybiBOVUxMOwogfQogCiBpbnQgc2NyaXB0X3NwZWNfcmVnaXN0ZXIoY29uc3QgY2hhciAqc3BlYywgc3RydWN0IHNjcmlwdGluZ19vcHMgKm9wcykKQEAgLTY4MSw3ICs2ODMsOCBAQAogCQkJdHlwZSA9IFBFUkZfVFlQRV9SQVc7CiAJCWVsc2UgewogCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGV2ZW50IHR5cGUgaW4gZmllbGQgc3RyaW5nLlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWdvdG8gb3V0OwogCQl9CiAKIAkJaWYgKG91dHB1dFt0eXBlXS51c2VyX3NldCkKQEAgLTkyMyw2ICs5MjYsMjQgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIGNoYXIgKmdldF9zY3JpcHRfcm9vdChzdHJ1Y3QgZGlyZW50ICpzY3JpcHRfZGlyZW50LCBjb25zdCBjaGFyICpzdWZmaXgpCit7CisJY2hhciAqc2NyaXB0X3Jvb3QsICpzdHI7CisKKwlzY3JpcHRfcm9vdCA9IHN0cmR1cChzY3JpcHRfZGlyZW50LT5kX25hbWUpOworCWlmICghc2NyaXB0X3Jvb3QpCisJCXJldHVybiBOVUxMOworCisJc3RyID0gKGNoYXIgKillbmRzX3dpdGgoc2NyaXB0X3Jvb3QsIHN1ZmZpeCk7CisJaWYgKCFzdHIpIHsKKwkJZnJlZShzY3JpcHRfcm9vdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCSpzdHIgPSAnXDAnOworCXJldHVybiBzY3JpcHRfcm9vdDsKK30KKwogc3RhdGljIGludCBsaXN0X2F2YWlsYWJsZV9zY3JpcHRzKGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCBfX3VzZWQsCiAJCQkJICBjb25zdCBjaGFyICpzIF9fdXNlZCwgaW50IHVuc2V0IF9fdXNlZCkKIHsKQEAgLTkzNCw3ICs5NTUsNiBAQAogCXN0cnVjdCBzY3JpcHRfZGVzYyAqZGVzYzsKIAljaGFyIGZpcnN0X2hhbGZbQlVGU0laXTsKIAljaGFyICpzY3JpcHRfcm9vdDsKLQljaGFyICpzdHI7CiAKIAlzbnByaW50ZihzY3JpcHRzX3BhdGgsIE1BWFBBVEhMRU4sICIlcy9zY3JpcHRzIiwgcGVyZl9leGVjX3BhdGgoKSk7CiAKQEAgLTk1MCwxNiArOTcwLDE0IEBACiAJCQljb250aW51ZTsKIAogCQlmb3JfZWFjaF9zY3JpcHQobGFuZ19wYXRoLCBsYW5nX2Rpciwgc2NyaXB0X2RpcmVudCwgc2NyaXB0X25leHQpIHsKLQkJCXNjcmlwdF9yb290ID0gc3RyZHVwKHNjcmlwdF9kaXJlbnQuZF9uYW1lKTsKLQkJCXN0ciA9IChjaGFyICopZW5kc193aXRoKHNjcmlwdF9yb290LCBSRVBPUlRfU1VGRklYKTsKLQkJCWlmIChzdHIpIHsKLQkJCQkqc3RyID0gJ1wwJzsKKwkJCXNjcmlwdF9yb290ID0gZ2V0X3NjcmlwdF9yb290KCZzY3JpcHRfZGlyZW50LCBSRVBPUlRfU1VGRklYKTsKKwkJCWlmIChzY3JpcHRfcm9vdCkgewogCQkJCWRlc2MgPSBzY3JpcHRfZGVzY19fZmluZG5ldyhzY3JpcHRfcm9vdCk7CiAJCQkJc25wcmludGYoc2NyaXB0X3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcyIsCiAJCQkJCSBsYW5nX3BhdGgsIHNjcmlwdF9kaXJlbnQuZF9uYW1lKTsKIAkJCQlyZWFkX3NjcmlwdF9pbmZvKGRlc2MsIHNjcmlwdF9wYXRoKTsKKwkJCQlmcmVlKHNjcmlwdF9yb290KTsKIAkJCX0KLQkJCWZyZWUoc2NyaXB0X3Jvb3QpOwogCQl9CiAJfQogCkBAIC05ODEsOCArOTk5LDcgQEAKIAljaGFyIHNjcmlwdF9wYXRoW01BWFBBVEhMRU5dOwogCURJUiAqc2NyaXB0c19kaXIsICpsYW5nX2RpcjsKIAljaGFyIGxhbmdfcGF0aFtNQVhQQVRITEVOXTsKLQljaGFyICpzdHIsICpfX3NjcmlwdF9yb290OwotCWNoYXIgKnBhdGggPSBOVUxMOworCWNoYXIgKl9fc2NyaXB0X3Jvb3Q7CiAKIAlzbnByaW50ZihzY3JpcHRzX3BhdGgsIE1BWFBBVEhMRU4sICIlcy9zY3JpcHRzIiwgcGVyZl9leGVjX3BhdGgoKSk7CiAKQEAgLTk5OCwyMyArMTAxNSwxOCBAQAogCQkJY29udGludWU7CiAKIAkJZm9yX2VhY2hfc2NyaXB0KGxhbmdfcGF0aCwgbGFuZ19kaXIsIHNjcmlwdF9kaXJlbnQsIHNjcmlwdF9uZXh0KSB7Ci0JCQlfX3NjcmlwdF9yb290ID0gc3RyZHVwKHNjcmlwdF9kaXJlbnQuZF9uYW1lKTsKLQkJCXN0ciA9IChjaGFyICopZW5kc193aXRoKF9fc2NyaXB0X3Jvb3QsIHN1ZmZpeCk7Ci0JCQlpZiAoc3RyKSB7Ci0JCQkJKnN0ciA9ICdcMCc7Ci0JCQkJaWYgKHN0cmNtcChfX3NjcmlwdF9yb290LCBzY3JpcHRfcm9vdCkpCi0JCQkJCWNvbnRpbnVlOworCQkJX19zY3JpcHRfcm9vdCA9IGdldF9zY3JpcHRfcm9vdCgmc2NyaXB0X2RpcmVudCwgc3VmZml4KTsKKwkJCWlmIChfX3NjcmlwdF9yb290ICYmICFzdHJjbXAoc2NyaXB0X3Jvb3QsIF9fc2NyaXB0X3Jvb3QpKSB7CisJCQkJZnJlZShfX3NjcmlwdF9yb290KTsKIAkJCQlzbnByaW50ZihzY3JpcHRfcGF0aCwgTUFYUEFUSExFTiwgIiVzLyVzIiwKIAkJCQkJIGxhbmdfcGF0aCwgc2NyaXB0X2RpcmVudC5kX25hbWUpOwotCQkJCXBhdGggPSBzdHJkdXAoc2NyaXB0X3BhdGgpOwotCQkJCWZyZWUoX19zY3JpcHRfcm9vdCk7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIHN0cmR1cChzY3JpcHRfcGF0aCk7CiAJCQl9CiAJCQlmcmVlKF9fc2NyaXB0X3Jvb3QpOwogCQl9CiAJfQogCi0JcmV0dXJuIHBhdGg7CisJcmV0dXJuIE5VTEw7CiB9CiAKIHN0YXRpYyBib29sIGlzX3RvcF9zY3JpcHQoY29uc3QgY2hhciAqc2NyaXB0X3BhdGgpCkBAIC0xMDgzLDcgKzEwOTUsMTEgQEAKIAlPUFRfQ0FMTEJBQ0soJ2YnLCAiZmllbGRzIiwgTlVMTCwgInN0ciIsCiAJCSAgICAgImNvbW1hIHNlcGFyYXRlZCBvdXRwdXQgZmllbGRzIHByZXBlbmQgd2l0aCAndHlwZTonLiBWYWxpZCB0eXBlczogaHcsc3csdHJhY2UscmF3LiBGaWVsZHM6IGNvbW0sdGlkLHBpZCx0aW1lLGNwdSxldmVudCx0cmFjZSxpcCxzeW0sZHNvLGFkZHIiLAogCQkgICAgIHBhcnNlX291dHB1dF9maWVsZHMpLAotCU9QVF9TVFJJTkcoJ2MnLCAiY3B1IiwgJmNwdV9saXN0LCAiY3B1IiwgImxpc3Qgb2YgY3B1cyB0byBwcm9maWxlIiksCisJT1BUX0JPT0xFQU4oJ2EnLCAiYWxsLWNwdXMiLCAmc3lzdGVtX3dpZGUsCisJCSAgICAgInN5c3RlbS13aWRlIGNvbGxlY3Rpb24gZnJvbSBhbGwgQ1BVcyIpLAorCU9QVF9TVFJJTkcoJ0MnLCAiY3B1IiwgJmNwdV9saXN0LCAiY3B1IiwgImxpc3Qgb2YgY3B1cyB0byBwcm9maWxlIiksCisJT1BUX1NUUklORygnYycsICJjb21tcyIsICZzeW1ib2xfY29uZi5jb21tX2xpc3Rfc3RyLCAiY29tbVssY29tbS4uLl0iLAorCQkgICAib25seSBkaXNwbGF5IGV2ZW50cyBmb3IgdGhlc2UgY29tbXMiKSwKIAlPUFRfQk9PTEVBTignSScsICJzaG93LWluZm8iLCAmc2hvd19mdWxsX2luZm8sCiAJCSAgICAiZGlzcGxheSBleHRlbmRlZCBpbmZvcm1hdGlvbiBmcm9tIHBlcmYuZGF0YSBmaWxlIiksCiAJT1BUX0VORCgpCkBAIC0xMTEwLDcgKzExMjYsNiBAQAogCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb247CiAJY2hhciAqc2NyaXB0X3BhdGggPSBOVUxMOwogCWNvbnN0IGNoYXIgKipfX2FyZ3Y7Ci0JYm9vbCBzeXN0ZW1fd2lkZTsKIAlpbnQgaSwgaiwgZXJyOwogCiAJc2V0dXBfc2NyaXB0aW5nKCk7CkBAIC0xMTc4LDE1ICsxMTkzLDE3IEBACiAJCX0KIAogCQlpZiAoIXBpZCkgewotCQkJc3lzdGVtX3dpZGUgPSB0cnVlOwogCQkJaiA9IDA7CiAKIAkJCWR1cDIobGl2ZV9waXBlWzFdLCAxKTsKIAkJCWNsb3NlKGxpdmVfcGlwZVswXSk7CiAKLQkJCWlmICghaXNfdG9wX3NjcmlwdChhcmd2WzBdKSkKKwkJCWlmIChpc190b3Bfc2NyaXB0KGFyZ3ZbMF0pKSB7CisJCQkJc3lzdGVtX3dpZGUgPSB0cnVlOworCQkJfSBlbHNlIGlmICghc3lzdGVtX3dpZGUpIHsKIAkJCQlzeXN0ZW1fd2lkZSA9ICFoYXZlX2NtZChhcmdjIC0gcmVwX2FyZ3MsCiAJCQkJCQkJJmFyZ3ZbcmVwX2FyZ3NdKTsKKwkJCX0KIAogCQkJX19hcmd2ID0gbWFsbG9jKChhcmdjICsgNikgKiBzaXplb2YoY29uc3QgY2hhciAqKSk7CiAJCQlpZiAoIV9fYXJndikKQEAgLTEyMzQsMTAgKzEyNTEsMTEgQEAKIAkJc2NyaXB0X3BhdGggPSByZXBfc2NyaXB0X3BhdGg7CiAKIAlpZiAoc2NyaXB0X3BhdGgpIHsKLQkJc3lzdGVtX3dpZGUgPSBmYWxzZTsKIAkJaiA9IDA7CiAKLQkJaWYgKHJlY19zY3JpcHRfcGF0aCkKKwkJaWYgKCFyZWNfc2NyaXB0X3BhdGgpCisJCQlzeXN0ZW1fd2lkZSA9IGZhbHNlOworCQllbHNlIGlmICghc3lzdGVtX3dpZGUpCiAJCQlzeXN0ZW1fd2lkZSA9ICFoYXZlX2NtZChhcmdjIC0gMSwgJmFyZ3ZbMV0pOwogCiAJCV9fYXJndiA9IG1hbGxvYygoYXJnYyArIDIpICogc2l6ZW9mKGNvbnN0IGNoYXIgKikpOwpAQCAtMTI2MSw3ICsxMjc5LDcgQEAKIAlpZiAoIXNjcmlwdF9uYW1lKQogCQlzZXR1cF9wYWdlcigpOwogCi0Jc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25hbWUsIE9fUkRPTkxZLCAwLCBmYWxzZSwgJmV2ZW50X29wcyk7CisJc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25hbWUsIE9fUkRPTkxZLCAwLCBmYWxzZSwgJnBlcmZfc2NyaXB0KTsKIAlpZiAoc2Vzc2lvbiA9PSBOVUxMKQogCQlyZXR1cm4gLUVOT01FTTsKIApAQCAtMTI4Nyw3ICsxMzA1LDcgQEAKIAkJCXJldHVybiAtMTsKIAkJfQogCi0JCWlucHV0ID0gb3BlbihpbnB1dF9uYW1lLCBPX1JET05MWSk7CisJCWlucHV0ID0gb3BlbihzZXNzaW9uLT5maWxlbmFtZSwgT19SRE9OTFkpOwkvKiBpbnB1dF9uYW1lICovCiAJCWlmIChpbnB1dCA8IDApIHsKIAkJCXBlcnJvcigiZmFpbGVkIHRvIG9wZW4gZmlsZSIpOwogCQkJZXhpdCgtMSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jIGIvdG9vbHMvcGVyZi9idWlsdGluLXN0YXQuYwppbmRleCA3ZDk4Njc2Li5mNWQyYTYzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMKQEAgLTQ2Myw3ICs0NjMsOCBAQAogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmZXZzZWxfbGlzdC0+ZW50cmllcywgbm9kZSkgewogCQlpZiAoY3JlYXRlX3BlcmZfc3RhdF9jb3VudGVyKGNvdW50ZXIsIGZpcnN0KSA8IDApIHsKLQkJCWlmIChlcnJubyA9PSBFSU5WQUwgfHwgZXJybm8gPT0gRU5PU1lTIHx8IGVycm5vID09IEVOT0VOVCkgeworCQkJaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFTk9TWVMgfHwKKwkJCSAgICBlcnJubyA9PSBFTk9FTlQgfHwgZXJybm8gPT0gRU9QTk9UU1VQUCkgewogCQkJCWlmICh2ZXJib3NlKQogCQkJCQl1aV9fd2FybmluZygiJXMgZXZlbnQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUga2VybmVsLlxuIiwKIAkJCQkJCSAgICBldmVudF9uYW1lKGNvdW50ZXIpKTsKQEAgLTU3Nyw2ICs1NzgsMzMgQEAKIAkJCWF2ZyAvIGF2Z19zdGF0cygmd2FsbHRpbWVfbnNlY3Nfc3RhdHMpKTsKIH0KIAorLyogdXNlZCBmb3IgZ2V0X3JhdGlvX2NvbG9yKCkgKi8KK2VudW0gZ3JjX3R5cGUgeworCUdSQ19TVEFMTEVEX0NZQ0xFU19GRSwKKwlHUkNfU1RBTExFRF9DWUNMRVNfQkUsCisJR1JDX0NBQ0hFX01JU1NFUywKKwlHUkNfTUFYX05SCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3JhdGlvX2NvbG9yKGVudW0gZ3JjX3R5cGUgdHlwZSwgZG91YmxlIHJhdGlvKQoreworCXN0YXRpYyBjb25zdCBkb3VibGUgZ3JjX3RhYmxlW0dSQ19NQVhfTlJdWzNdID0geworCQlbR1JDX1NUQUxMRURfQ1lDTEVTX0ZFXSA9IHsgNTAuMCwgMzAuMCwgMTAuMCB9LAorCQlbR1JDX1NUQUxMRURfQ1lDTEVTX0JFXSA9IHsgNzUuMCwgNTAuMCwgMjAuMCB9LAorCQlbR1JDX0NBQ0hFX01JU1NFU10gCT0geyAyMC4wLCAxMC4wLCA1LjAgfSwKKwl9OworCWNvbnN0IGNoYXIgKmNvbG9yID0gUEVSRl9DT0xPUl9OT1JNQUw7CisKKwlpZiAocmF0aW8gPiBncmNfdGFibGVbdHlwZV1bMF0pCisJCWNvbG9yID0gUEVSRl9DT0xPUl9SRUQ7CisJZWxzZSBpZiAocmF0aW8gPiBncmNfdGFibGVbdHlwZV1bMV0pCisJCWNvbG9yID0gUEVSRl9DT0xPUl9NQUdFTlRBOworCWVsc2UgaWYgKHJhdGlvID4gZ3JjX3RhYmxlW3R5cGVdWzJdKQorCQljb2xvciA9IFBFUkZfQ09MT1JfWUVMTE9XOworCisJcmV0dXJuIGNvbG9yOworfQorCiBzdGF0aWMgdm9pZCBwcmludF9zdGFsbGVkX2N5Y2xlc19mcm9udGVuZChpbnQgY3B1LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgX191c2VkLCBkb3VibGUgYXZnKQogewogCWRvdWJsZSB0b3RhbCwgcmF0aW8gPSAwLjA7CkBAIC01ODcsMTMgKzYxNSw3IEBACiAJaWYgKHRvdGFsKQogCQlyYXRpbyA9IGF2ZyAvIHRvdGFsICogMTAwLjA7CiAKLQljb2xvciA9IFBFUkZfQ09MT1JfTk9STUFMOwotCWlmIChyYXRpbyA+IDUwLjApCi0JCWNvbG9yID0gUEVSRl9DT0xPUl9SRUQ7Ci0JZWxzZSBpZiAocmF0aW8gPiAzMC4wKQotCQljb2xvciA9IFBFUkZfQ09MT1JfTUFHRU5UQTsKLQllbHNlIGlmIChyYXRpbyA+IDEwLjApCi0JCWNvbG9yID0gUEVSRl9DT0xPUl9ZRUxMT1c7CisJY29sb3IgPSBnZXRfcmF0aW9fY29sb3IoR1JDX1NUQUxMRURfQ1lDTEVTX0ZFLCByYXRpbyk7CiAKIAlmcHJpbnRmKG91dHB1dCwgIiAjICAiKTsKIAljb2xvcl9mcHJpbnRmKG91dHB1dCwgY29sb3IsICIlNi4yZiUlIiwgcmF0aW8pOwpAQCAtNjEwLDEzICs2MzIsNyBAQAogCWlmICh0b3RhbCkKIAkJcmF0aW8gPSBhdmcgLyB0b3RhbCAqIDEwMC4wOwogCi0JY29sb3IgPSBQRVJGX0NPTE9SX05PUk1BTDsKLQlpZiAocmF0aW8gPiA3NS4wKQotCQljb2xvciA9IFBFUkZfQ09MT1JfUkVEOwotCWVsc2UgaWYgKHJhdGlvID4gNTAuMCkKLQkJY29sb3IgPSBQRVJGX0NPTE9SX01BR0VOVEE7Ci0JZWxzZSBpZiAocmF0aW8gPiAyMC4wKQotCQljb2xvciA9IFBFUkZfQ09MT1JfWUVMTE9XOworCWNvbG9yID0gZ2V0X3JhdGlvX2NvbG9yKEdSQ19TVEFMTEVEX0NZQ0xFU19CRSwgcmF0aW8pOwogCiAJZnByaW50ZihvdXRwdXQsICIgIyAgIik7CiAJY29sb3JfZnByaW50ZihvdXRwdXQsIGNvbG9yLCAiJTYuMmYlJSIsIHJhdGlvKTsKQEAgLTYzMywxMyArNjQ5LDcgQEAKIAlpZiAodG90YWwpCiAJCXJhdGlvID0gYXZnIC8gdG90YWwgKiAxMDAuMDsKIAotCWNvbG9yID0gUEVSRl9DT0xPUl9OT1JNQUw7Ci0JaWYgKHJhdGlvID4gMjAuMCkKLQkJY29sb3IgPSBQRVJGX0NPTE9SX1JFRDsKLQllbHNlIGlmIChyYXRpbyA+IDEwLjApCi0JCWNvbG9yID0gUEVSRl9DT0xPUl9NQUdFTlRBOwotCWVsc2UgaWYgKHJhdGlvID4gNS4wKQotCQljb2xvciA9IFBFUkZfQ09MT1JfWUVMTE9XOworCWNvbG9yID0gZ2V0X3JhdGlvX2NvbG9yKEdSQ19DQUNIRV9NSVNTRVMsIHJhdGlvKTsKIAogCWZwcmludGYob3V0cHV0LCAiICMgICIpOwogCWNvbG9yX2ZwcmludGYob3V0cHV0LCBjb2xvciwgIiU2LjJmJSUiLCByYXRpbyk7CkBAIC02NTYsMTMgKzY2Niw3IEBACiAJaWYgKHRvdGFsKQogCQlyYXRpbyA9IGF2ZyAvIHRvdGFsICogMTAwLjA7CiAKLQljb2xvciA9IFBFUkZfQ09MT1JfTk9STUFMOwotCWlmIChyYXRpbyA+IDIwLjApCi0JCWNvbG9yID0gUEVSRl9DT0xPUl9SRUQ7Ci0JZWxzZSBpZiAocmF0aW8gPiAxMC4wKQotCQljb2xvciA9IFBFUkZfQ09MT1JfTUFHRU5UQTsKLQllbHNlIGlmIChyYXRpbyA+IDUuMCkKLQkJY29sb3IgPSBQRVJGX0NPTE9SX1lFTExPVzsKKwljb2xvciA9IGdldF9yYXRpb19jb2xvcihHUkNfQ0FDSEVfTUlTU0VTLCByYXRpbyk7CiAKIAlmcHJpbnRmKG91dHB1dCwgIiAjICAiKTsKIAljb2xvcl9mcHJpbnRmKG91dHB1dCwgY29sb3IsICIlNi4yZiUlIiwgcmF0aW8pOwpAQCAtNjc5LDEzICs2ODMsNyBAQAogCWlmICh0b3RhbCkKIAkJcmF0aW8gPSBhdmcgLyB0b3RhbCAqIDEwMC4wOwogCi0JY29sb3IgPSBQRVJGX0NPTE9SX05PUk1BTDsKLQlpZiAocmF0aW8gPiAyMC4wKQotCQljb2xvciA9IFBFUkZfQ09MT1JfUkVEOwotCWVsc2UgaWYgKHJhdGlvID4gMTAuMCkKLQkJY29sb3IgPSBQRVJGX0NPTE9SX01BR0VOVEE7Ci0JZWxzZSBpZiAocmF0aW8gPiA1LjApCi0JCWNvbG9yID0gUEVSRl9DT0xPUl9ZRUxMT1c7CisJY29sb3IgPSBnZXRfcmF0aW9fY29sb3IoR1JDX0NBQ0hFX01JU1NFUywgcmF0aW8pOwogCiAJZnByaW50ZihvdXRwdXQsICIgIyAgIik7CiAJY29sb3JfZnByaW50ZihvdXRwdXQsIGNvbG9yLCAiJTYuMmYlJSIsIHJhdGlvKTsKQEAgLTcwMiwxMyArNzAwLDcgQEAKIAlpZiAodG90YWwpCiAJCXJhdGlvID0gYXZnIC8gdG90YWwgKiAxMDAuMDsKIAotCWNvbG9yID0gUEVSRl9DT0xPUl9OT1JNQUw7Ci0JaWYgKHJhdGlvID4gMjAuMCkKLQkJY29sb3IgPSBQRVJGX0NPTE9SX1JFRDsKLQllbHNlIGlmIChyYXRpbyA+IDEwLjApCi0JCWNvbG9yID0gUEVSRl9DT0xPUl9NQUdFTlRBOwotCWVsc2UgaWYgKHJhdGlvID4gNS4wKQotCQljb2xvciA9IFBFUkZfQ09MT1JfWUVMTE9XOworCWNvbG9yID0gZ2V0X3JhdGlvX2NvbG9yKEdSQ19DQUNIRV9NSVNTRVMsIHJhdGlvKTsKIAogCWZwcmludGYob3V0cHV0LCAiICMgICIpOwogCWNvbG9yX2ZwcmludGYob3V0cHV0LCBjb2xvciwgIiU2LjJmJSUiLCByYXRpbyk7CkBAIC03MjUsMTMgKzcxNyw3IEBACiAJaWYgKHRvdGFsKQogCQlyYXRpbyA9IGF2ZyAvIHRvdGFsICogMTAwLjA7CiAKLQljb2xvciA9IFBFUkZfQ09MT1JfTk9STUFMOwotCWlmIChyYXRpbyA+IDIwLjApCi0JCWNvbG9yID0gUEVSRl9DT0xPUl9SRUQ7Ci0JZWxzZSBpZiAocmF0aW8gPiAxMC4wKQotCQljb2xvciA9IFBFUkZfQ09MT1JfTUFHRU5UQTsKLQllbHNlIGlmIChyYXRpbyA+IDUuMCkKLQkJY29sb3IgPSBQRVJGX0NPTE9SX1lFTExPVzsKKwljb2xvciA9IGdldF9yYXRpb19jb2xvcihHUkNfQ0FDSEVfTUlTU0VTLCByYXRpbyk7CiAKIAlmcHJpbnRmKG91dHB1dCwgIiAjICAiKTsKIAljb2xvcl9mcHJpbnRmKG91dHB1dCwgY29sb3IsICIlNi4yZiUlIiwgcmF0aW8pOwpAQCAtNzQ4LDEzICs3MzQsNyBAQAogCWlmICh0b3RhbCkKIAkJcmF0aW8gPSBhdmcgLyB0b3RhbCAqIDEwMC4wOwogCi0JY29sb3IgPSBQRVJGX0NPTE9SX05PUk1BTDsKLQlpZiAocmF0aW8gPiAyMC4wKQotCQljb2xvciA9IFBFUkZfQ09MT1JfUkVEOwotCWVsc2UgaWYgKHJhdGlvID4gMTAuMCkKLQkJY29sb3IgPSBQRVJGX0NPTE9SX01BR0VOVEE7Ci0JZWxzZSBpZiAocmF0aW8gPiA1LjApCi0JCWNvbG9yID0gUEVSRl9DT0xPUl9ZRUxMT1c7CisJY29sb3IgPSBnZXRfcmF0aW9fY29sb3IoR1JDX0NBQ0hFX01JU1NFUywgcmF0aW8pOwogCiAJZnByaW50ZihvdXRwdXQsICIgIyAgIik7CiAJY29sb3JfZnByaW50ZihvdXRwdXQsIGNvbG9yLCAiJTYuMmYlJSIsIHJhdGlvKTsKQEAgLTExMDcsMjIgKzEwODcsMTMgQEAKICAqLwogc3RhdGljIGludCBhZGRfZGVmYXVsdF9hdHRyaWJ1dGVzKHZvaWQpCiB7Ci0Jc3RydWN0IHBlcmZfZXZzZWwgKnBvczsKLQlzaXplX3QgYXR0cl9uciA9IDA7Ci0Jc2l6ZV90IGM7Ci0KIAkvKiBTZXQgYXR0cnMgaWYgbm8gZXZlbnQgaXMgc2VsZWN0ZWQgYW5kICFudWxsX3J1bjogKi8KIAlpZiAobnVsbF9ydW4pCiAJCXJldHVybiAwOwogCiAJaWYgKCFldnNlbF9saXN0LT5ucl9lbnRyaWVzKSB7Ci0JCWZvciAoYyA9IDA7IGMgPCBBUlJBWV9TSVpFKGRlZmF1bHRfYXR0cnMpOyBjKyspIHsKLQkJCXBvcyA9IHBlcmZfZXZzZWxfX25ldyhkZWZhdWx0X2F0dHJzICsgYywgYyArIGF0dHJfbnIpOwotCQkJaWYgKHBvcyA9PSBOVUxMKQotCQkJCXJldHVybiAtMTsKLQkJCXBlcmZfZXZsaXN0X19hZGQoZXZzZWxfbGlzdCwgcG9zKTsKLQkJfQotCQlhdHRyX25yICs9IGM7CisJCWlmIChwZXJmX2V2bGlzdF9fYWRkX2F0dHJzX2FycmF5KGV2c2VsX2xpc3QsIGRlZmF1bHRfYXR0cnMpIDwgMCkKKwkJCXJldHVybiAtMTsKIAl9CiAKIAkvKiBEZXRhaWxlZCBldmVudHMgZ2V0IGFwcGVuZGVkIHRvIHRoZSBldmVudCBsaXN0OiAqLwpAQCAtMTEzMSwzOCArMTEwMiwyMSBAQAogCQlyZXR1cm4gMDsKIAogCS8qIEFwcGVuZCBkZXRhaWxlZCBydW4gZXh0cmEgYXR0cmlidXRlczogKi8KLQlmb3IgKGMgPSAwOyBjIDwgQVJSQVlfU0laRShkZXRhaWxlZF9hdHRycyk7IGMrKykgewotCQlwb3MgPSBwZXJmX2V2c2VsX19uZXcoZGV0YWlsZWRfYXR0cnMgKyBjLCBjICsgYXR0cl9ucik7Ci0JCWlmIChwb3MgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcGVyZl9ldmxpc3RfX2FkZChldnNlbF9saXN0LCBwb3MpOwotCX0KLQlhdHRyX25yICs9IGM7CisJaWYgKHBlcmZfZXZsaXN0X19hZGRfYXR0cnNfYXJyYXkoZXZzZWxfbGlzdCwgZGV0YWlsZWRfYXR0cnMpIDwgMCkKKwkJcmV0dXJuIC0xOwogCiAJaWYgKGRldGFpbGVkX3J1biA8IDIpCiAJCXJldHVybiAwOwogCiAJLyogQXBwZW5kIHZlcnkgZGV0YWlsZWQgcnVuIGV4dHJhIGF0dHJpYnV0ZXM6ICovCi0JZm9yIChjID0gMDsgYyA8IEFSUkFZX1NJWkUodmVyeV9kZXRhaWxlZF9hdHRycyk7IGMrKykgewotCQlwb3MgPSBwZXJmX2V2c2VsX19uZXcodmVyeV9kZXRhaWxlZF9hdHRycyArIGMsIGMgKyBhdHRyX25yKTsKLQkJaWYgKHBvcyA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOwotCQlwZXJmX2V2bGlzdF9fYWRkKGV2c2VsX2xpc3QsIHBvcyk7Ci0JfQorCWlmIChwZXJmX2V2bGlzdF9fYWRkX2F0dHJzX2FycmF5KGV2c2VsX2xpc3QsIHZlcnlfZGV0YWlsZWRfYXR0cnMpIDwgMCkKKwkJcmV0dXJuIC0xOwogCiAJaWYgKGRldGFpbGVkX3J1biA8IDMpCiAJCXJldHVybiAwOwogCiAJLyogQXBwZW5kIHZlcnksIHZlcnkgZGV0YWlsZWQgcnVuIGV4dHJhIGF0dHJpYnV0ZXM6ICovCi0JZm9yIChjID0gMDsgYyA8IEFSUkFZX1NJWkUodmVyeV92ZXJ5X2RldGFpbGVkX2F0dHJzKTsgYysrKSB7Ci0JCXBvcyA9IHBlcmZfZXZzZWxfX25ldyh2ZXJ5X3ZlcnlfZGV0YWlsZWRfYXR0cnMgKyBjLCBjICsgYXR0cl9ucik7Ci0JCWlmIChwb3MgPT0gTlVMTCkKLQkJCXJldHVybiAtMTsKLQkJcGVyZl9ldmxpc3RfX2FkZChldnNlbF9saXN0LCBwb3MpOwotCX0KLQotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHBlcmZfZXZsaXN0X19hZGRfYXR0cnNfYXJyYXkoZXZzZWxfbGlzdCwgdmVyeV92ZXJ5X2RldGFpbGVkX2F0dHJzKTsKIH0KIAogaW50IGNtZF9zdGF0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fdXNlZCkKQEAgLTEyNjYsOCArMTIyMCw3IEBACiAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmV2c2VsX2xpc3QtPmVudHJpZXMsIG5vZGUpIHsKIAkJaWYgKHBlcmZfZXZzZWxfX2FsbG9jX3N0YXRfcHJpdihwb3MpIDwgMCB8fAotCQkgICAgcGVyZl9ldnNlbF9fYWxsb2NfY291bnRzKHBvcywgZXZzZWxfbGlzdC0+Y3B1cy0+bnIpIDwgMCB8fAotCQkgICAgcGVyZl9ldnNlbF9fYWxsb2NfZmQocG9zLCBldnNlbF9saXN0LT5jcHVzLT5uciwgZXZzZWxfbGlzdC0+dGhyZWFkcy0+bnIpIDwgMCkKKwkJICAgIHBlcmZfZXZzZWxfX2FsbG9jX2NvdW50cyhwb3MsIGV2c2VsX2xpc3QtPmNwdXMtPm5yKSA8IDApCiAJCQlnb3RvIG91dF9mcmVlX2ZkOwogCX0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10ZXN0LmMKaW5kZXggODMxZDFiYS4uMmI5YTdmNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi9idWlsdGluLXRlc3QuYworKysgYi90b29scy9wZXJmL2J1aWx0aW4tdGVzdC5jCkBAIC03LDYgKzcsNyBAQAogCiAjaW5jbHVkZSAidXRpbC9jYWNoZS5oIgogI2luY2x1ZGUgInV0aWwvZGVidWcuaCIKKyNpbmNsdWRlICJ1dGlsL2RlYnVnZnMuaCIKICNpbmNsdWRlICJ1dGlsL2V2bGlzdC5oIgogI2luY2x1ZGUgInV0aWwvcGFyc2Utb3B0aW9ucy5oIgogI2luY2x1ZGUgInV0aWwvcGFyc2UtZXZlbnRzLmgiCkBAIC0xNCw4ICsxNSw2IEBACiAjaW5jbHVkZSAidXRpbC90aHJlYWRfbWFwLmgiCiAjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9od19icmVha3BvaW50LmgiCiAKLXN0YXRpYyBsb25nIHBhZ2Vfc2l6ZTsKLQogc3RhdGljIGludCB2bWxpbnV4X21hdGNoZXNfa2FsbHN5bXNfZmlsdGVyKHN0cnVjdCBtYXAgKm1hcCBfX3VzZWQsIHN0cnVjdCBzeW1ib2wgKnN5bSkKIHsKIAlib29sICp2aXNpdGVkID0gc3ltYm9sX19wcml2KHN5bSk7CkBAIC0zMSw2ICszMCw3IEBACiAJc3RydWN0IG1hcCAqa2FsbHN5bXNfbWFwLCAqdm1saW51eF9tYXA7CiAJc3RydWN0IG1hY2hpbmUga2FsbHN5bXMsIHZtbGludXg7CiAJZW51bSBtYXBfdHlwZSB0eXBlID0gTUFQX19GVU5DVElPTjsKKwlsb25nIHBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CiAJc3RydWN0IHJlZl9yZWxvY19zeW0gcmVmX3JlbG9jX3N5bSA9IHsgLm5hbWUgPSAiX3N0ZXh0IiwgfTsKIAogCS8qCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAogCWlmIChhc3ByaW50ZigmZmlsZW5hbWUsCiAJCSAgICAgIiVzL3N5c2NhbGxzLyVzL2lkIiwKLQkJICAgICBkZWJ1Z2ZzX3BhdGgsIGV2bmFtZSkgPCAwKQorCQkgICAgIHRyYWNpbmdfZXZlbnRzX3BhdGgsIGV2bmFtZSkgPCAwKQogCQlyZXR1cm4gLTE7CiAKIAlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKQEAgLTYwMyw3ICs2MDMsNyBAQAogCiAjZGVmaW5lIFRFU1RfQVNTRVJUX1ZBTCh0ZXh0LCBjb25kKSBcCiBkbyB7IFwKLQlpZiAoIWNvbmQpIHsgXAorCWlmICghKGNvbmQpKSB7IFwKIAkJcHJfZGVidWcoIkZBSUxFRCAlczolZCAlc1xuIiwgX19GSUxFX18sIF9fTElORV9fLCB0ZXh0KTsgXAogCQlyZXR1cm4gLTE7IFwKIAl9IFwKQEAgLTc1OSw2ICs3NTksMTAzIEBACiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgdGVzdF9fY2hlY2tldmVudF90cmFjZXBvaW50X21vZGlmaWVyKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsCisJCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgZXhjbHVkZV91c2VyIiwgZXZzZWwtPmF0dHIuZXhjbHVkZV91c2VyKTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4Y2x1ZGVfa2VybmVsIiwgIWV2c2VsLT5hdHRyLmV4Y2x1ZGVfa2VybmVsKTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4Y2x1ZGVfaHYiLCBldnNlbC0+YXR0ci5leGNsdWRlX2h2KTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIHByZWNpc2VfaXAiLCAhZXZzZWwtPmF0dHIucHJlY2lzZV9pcCk7CisKKwlyZXR1cm4gdGVzdF9fY2hlY2tldmVudF90cmFjZXBvaW50KGV2bGlzdCk7Cit9CisKK3N0YXRpYyBpbnQKK3Rlc3RfX2NoZWNrZXZlbnRfdHJhY2Vwb2ludF9tdWx0aV9tb2RpZmllcihzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIG51bWJlciBvZiBlbnRyaWVzIiwgZXZsaXN0LT5ucl9lbnRyaWVzID4gMSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGV2c2VsLCAmZXZsaXN0LT5lbnRyaWVzLCBub2RlKSB7CisJCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgZXhjbHVkZV91c2VyIiwKKwkJCQkhZXZzZWwtPmF0dHIuZXhjbHVkZV91c2VyKTsKKwkJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX2tlcm5lbCIsCisJCQkJZXZzZWwtPmF0dHIuZXhjbHVkZV9rZXJuZWwpOworCQlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4Y2x1ZGVfaHYiLCBldnNlbC0+YXR0ci5leGNsdWRlX2h2KTsKKwkJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBwcmVjaXNlX2lwIiwgIWV2c2VsLT5hdHRyLnByZWNpc2VfaXApOworCX0KKworCXJldHVybiB0ZXN0X19jaGVja2V2ZW50X3RyYWNlcG9pbnRfbXVsdGkoZXZsaXN0KTsKK30KKworc3RhdGljIGludCB0ZXN0X19jaGVja2V2ZW50X3Jhd19tb2RpZmllcihzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LAorCQkJCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CisKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4Y2x1ZGVfdXNlciIsIGV2c2VsLT5hdHRyLmV4Y2x1ZGVfdXNlcik7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX2tlcm5lbCIsICFldnNlbC0+YXR0ci5leGNsdWRlX2tlcm5lbCk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX2h2IiwgZXZzZWwtPmF0dHIuZXhjbHVkZV9odik7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBwcmVjaXNlX2lwIiwgZXZzZWwtPmF0dHIucHJlY2lzZV9pcCk7CisKKwlyZXR1cm4gdGVzdF9fY2hlY2tldmVudF9yYXcoZXZsaXN0KTsKK30KKworc3RhdGljIGludCB0ZXN0X19jaGVja2V2ZW50X251bWVyaWNfbW9kaWZpZXIoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsID0gbGlzdF9lbnRyeShldmxpc3QtPmVudHJpZXMubmV4dCwKKwkJCQkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX3VzZXIiLCBldnNlbC0+YXR0ci5leGNsdWRlX3VzZXIpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgZXhjbHVkZV9rZXJuZWwiLCBldnNlbC0+YXR0ci5leGNsdWRlX2tlcm5lbCk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX2h2IiwgIWV2c2VsLT5hdHRyLmV4Y2x1ZGVfaHYpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgcHJlY2lzZV9pcCIsIGV2c2VsLT5hdHRyLnByZWNpc2VfaXApOworCisJcmV0dXJuIHRlc3RfX2NoZWNrZXZlbnRfbnVtZXJpYyhldmxpc3QpOworfQorCitzdGF0aWMgaW50IHRlc3RfX2NoZWNrZXZlbnRfc3ltYm9saWNfbmFtZV9tb2RpZmllcihzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LAorCQkJCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CisKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4Y2x1ZGVfdXNlciIsIGV2c2VsLT5hdHRyLmV4Y2x1ZGVfdXNlcik7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX2tlcm5lbCIsIGV2c2VsLT5hdHRyLmV4Y2x1ZGVfa2VybmVsKTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4Y2x1ZGVfaHYiLCAhZXZzZWwtPmF0dHIuZXhjbHVkZV9odik7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBwcmVjaXNlX2lwIiwgIWV2c2VsLT5hdHRyLnByZWNpc2VfaXApOworCisJcmV0dXJuIHRlc3RfX2NoZWNrZXZlbnRfc3ltYm9saWNfbmFtZShldmxpc3QpOworfQorCitzdGF0aWMgaW50IHRlc3RfX2NoZWNrZXZlbnRfc3ltYm9saWNfYWxpYXNfbW9kaWZpZXIoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsID0gbGlzdF9lbnRyeShldmxpc3QtPmVudHJpZXMubmV4dCwKKwkJCQkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX3VzZXIiLCAhZXZzZWwtPmF0dHIuZXhjbHVkZV91c2VyKTsKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4Y2x1ZGVfa2VybmVsIiwgZXZzZWwtPmF0dHIuZXhjbHVkZV9rZXJuZWwpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgZXhjbHVkZV9odiIsIGV2c2VsLT5hdHRyLmV4Y2x1ZGVfaHYpOworCVRFU1RfQVNTRVJUX1ZBTCgid3JvbmcgcHJlY2lzZV9pcCIsICFldnNlbC0+YXR0ci5wcmVjaXNlX2lwKTsKKworCXJldHVybiB0ZXN0X19jaGVja2V2ZW50X3N5bWJvbGljX2FsaWFzKGV2bGlzdCk7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9fY2hlY2tldmVudF9nZW5od19tb2RpZmllcihzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwgPSBsaXN0X2VudHJ5KGV2bGlzdC0+ZW50cmllcy5uZXh0LAorCQkJCQkgICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CisKKwlURVNUX0FTU0VSVF9WQUwoIndyb25nIGV4Y2x1ZGVfdXNlciIsIGV2c2VsLT5hdHRyLmV4Y2x1ZGVfdXNlcik7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX2tlcm5lbCIsICFldnNlbC0+YXR0ci5leGNsdWRlX2tlcm5lbCk7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBleGNsdWRlX2h2IiwgZXZzZWwtPmF0dHIuZXhjbHVkZV9odik7CisJVEVTVF9BU1NFUlRfVkFMKCJ3cm9uZyBwcmVjaXNlX2lwIiwgZXZzZWwtPmF0dHIucHJlY2lzZV9pcCk7CisKKwlyZXR1cm4gdGVzdF9fY2hlY2tldmVudF9nZW5odyhldmxpc3QpOworfQorCiBzdGF0aWMgc3RydWN0IHRlc3RfX2V2ZW50X3N0IHsKIAljb25zdCBjaGFyICpuYW1lOwogCV9fdTMyIHR5cGU7CkBAIC04MDgsNiArOTA1LDM0IEBACiAJCS5uYW1lICA9ICJtZW06MDp3IiwKIAkJLmNoZWNrID0gdGVzdF9fY2hlY2tldmVudF9icmVha3BvaW50X3csCiAJfSwKKwl7CisJCS5uYW1lICA9ICJzeXNjYWxsczpzeXNfZW50ZXJfb3BlbjprIiwKKwkJLmNoZWNrID0gdGVzdF9fY2hlY2tldmVudF90cmFjZXBvaW50X21vZGlmaWVyLAorCX0sCisJeworCQkubmFtZSAgPSAic3lzY2FsbHM6Kjp1IiwKKwkJLmNoZWNrID0gdGVzdF9fY2hlY2tldmVudF90cmFjZXBvaW50X211bHRpX21vZGlmaWVyLAorCX0sCisJeworCQkubmFtZSAgPSAicjE6a3AiLAorCQkuY2hlY2sgPSB0ZXN0X19jaGVja2V2ZW50X3Jhd19tb2RpZmllciwKKwl9LAorCXsKKwkJLm5hbWUgID0gIjE6MTpocCIsCisJCS5jaGVjayA9IHRlc3RfX2NoZWNrZXZlbnRfbnVtZXJpY19tb2RpZmllciwKKwl9LAorCXsKKwkJLm5hbWUgID0gImluc3RydWN0aW9uczpoIiwKKwkJLmNoZWNrID0gdGVzdF9fY2hlY2tldmVudF9zeW1ib2xpY19uYW1lX21vZGlmaWVyLAorCX0sCisJeworCQkubmFtZSAgPSAiZmF1bHRzOnUiLAorCQkuY2hlY2sgPSB0ZXN0X19jaGVja2V2ZW50X3N5bWJvbGljX2FsaWFzX21vZGlmaWVyLAorCX0sCisJeworCQkubmFtZSAgPSAiTDEtZGNhY2hlLWxvYWQtbWlzczprcCIsCisJCS5jaGVjayA9IHRlc3RfX2NoZWNrZXZlbnRfZ2VuaHdfbW9kaWZpZXIsCisJfSwKIH07CiAKICNkZWZpbmUgVEVTVF9fRVZFTlRTX0NOVCAoc2l6ZW9mKHRlc3RfX2V2ZW50cykgLyBzaXplb2Yoc3RydWN0IHRlc3RfX2V2ZW50X3N0KSkKQEAgLTg0MSw2ICs5NjYsMzM2IEBACiAKIAlyZXR1cm4gcmV0OwogfQorCitzdGF0aWMgaW50IHNjaGVkX19nZXRfZmlyc3RfcG9zc2libGVfY3B1KHBpZF90IHBpZCwgY3B1X3NldF90ICoqbWFza3AsCisJCQkJCSBzaXplX3QgKnNpemVwKQoreworCWNwdV9zZXRfdCAqbWFzazsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgaSwgY3B1ID0gLTEsIG5yY3B1cyA9IDEwMjQ7CityZWFsbG9jOgorCW1hc2sgPSBDUFVfQUxMT0MobnJjcHVzKTsKKwlzaXplID0gQ1BVX0FMTE9DX1NJWkUobnJjcHVzKTsKKwlDUFVfWkVST19TKHNpemUsIG1hc2spOworCisJaWYgKHNjaGVkX2dldGFmZmluaXR5KHBpZCwgc2l6ZSwgbWFzaykgPT0gLTEpIHsKKwkJQ1BVX0ZSRUUobWFzayk7CisJCWlmIChlcnJubyA9PSBFSU5WQUwgJiYgbnJjcHVzIDwgKDEwMjQgPDwgOCkpIHsKKwkJCW5yY3B1cyA9IG5yY3B1cyA8PCAyOworCQkJZ290byByZWFsbG9jOworCQl9CisJCXBlcnJvcigic2NoZWRfZ2V0YWZmaW5pdHkiKTsKKwkJCXJldHVybiAtMTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJjcHVzOyBpKyspIHsKKwkJaWYgKENQVV9JU1NFVF9TKGksIHNpemUsIG1hc2spKSB7CisJCQlpZiAoY3B1ID09IC0xKSB7CisJCQkJY3B1ID0gaTsKKwkJCQkqbWFza3AgPSBtYXNrOworCQkJCSpzaXplcCA9IHNpemU7CisJCQl9IGVsc2UKKwkJCQlDUFVfQ0xSX1MoaSwgc2l6ZSwgbWFzayk7CisJCX0KKwl9CisKKwlpZiAoY3B1ID09IC0xKQorCQlDUFVfRlJFRShtYXNrKTsKKworCXJldHVybiBjcHU7Cit9CisKK3N0YXRpYyBpbnQgdGVzdF9fUEVSRl9SRUNPUkQodm9pZCkKK3sKKwlzdHJ1Y3QgcGVyZl9yZWNvcmRfb3B0cyBvcHRzID0geworCQkudGFyZ2V0X3BpZCA9IC0xLAorCQkudGFyZ2V0X3RpZCA9IC0xLAorCQkubm9fZGVsYXkgICA9IHRydWUsCisJCS5mcmVxCSAgICA9IDEwLAorCQkubW1hcF9wYWdlcyA9IDI1NiwKKwkJLnNhbXBsZV9pZF9hbGxfYXZhaWwgPSB0cnVlLAorCX07CisJY3B1X3NldF90ICpjcHVfbWFzayA9IE5VTEw7CisJc2l6ZV90IGNwdV9tYXNrX3NpemUgPSAwOworCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0ID0gcGVyZl9ldmxpc3RfX25ldyhOVUxMLCBOVUxMKTsKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisJc3RydWN0IHBlcmZfc2FtcGxlIHNhbXBsZTsKKwljb25zdCBjaGFyICpjbWQgPSAic2xlZXAiOworCWNvbnN0IGNoYXIgKmFyZ3ZbXSA9IHsgY21kLCAiMSIsIE5VTEwsIH07CisJY2hhciAqYm5hbWU7CisJdTY0IHNhbXBsZV90eXBlLCBwcmV2X3RpbWUgPSAwOworCWJvb2wgZm91bmRfY21kX21tYXAgPSBmYWxzZSwKKwkgICAgIGZvdW5kX2xpYmNfbW1hcCA9IGZhbHNlLAorCSAgICAgZm91bmRfdmRzb19tbWFwID0gZmFsc2UsCisJICAgICBmb3VuZF9sZF9tbWFwID0gZmFsc2U7CisJaW50IGVyciA9IC0xLCBlcnJzID0gMCwgaSwgd2FrZXVwcyA9IDAsIHNhbXBsZV9zaXplOworCXUzMiBjcHU7CisJaW50IHRvdGFsX2V2ZW50cyA9IDAsIG5yX2V2ZW50c1tQRVJGX1JFQ09SRF9NQVhdID0geyAwLCB9OworCisJaWYgKGV2bGlzdCA9PSBOVUxMIHx8IGFyZ3YgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiTm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIGV2bGlzdFxuIik7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogV2UgbmVlZCBhdCBsZWFzdCBvbmUgZXZzZWwgaW4gdGhlIGV2bGlzdCwgdXNlIHRoZSBkZWZhdWx0CisJICogb25lOiAiY3ljbGVzIi4KKwkgKi8KKwllcnIgPSBwZXJmX2V2bGlzdF9fYWRkX2RlZmF1bHQoZXZsaXN0KTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9kZWJ1ZygiTm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIGV2c2VsXG4iKTsKKwkJZ290byBvdXRfZGVsZXRlX2V2bGlzdDsKKwl9CisKKwkvKgorCSAqIENyZWF0ZSBtYXBzIG9mIHRocmVhZHMgYW5kIGNwdXMgdG8gbW9uaXRvci4gSW4gdGhpcyBjYXNlCisJICogd2Ugc3RhcnQgd2l0aCBhbGwgdGhyZWFkcyBhbmQgY3B1cyAoLTEsIC0xKSBidXQgdGhlbiBpbgorCSAqIHBlcmZfZXZsaXN0X19wcmVwYXJlX3dvcmtsb2FkIHdlJ2xsIGZpbGwgaW4gdGhlIG9ubHkgdGhyZWFkCisJICogd2UncmUgbW9uaXRvcmluZywgdGhlIG9uZSBmb3JrZWQgdGhlcmUuCisJICovCisJZXJyID0gcGVyZl9ldmxpc3RfX2NyZWF0ZV9tYXBzKGV2bGlzdCwgb3B0cy50YXJnZXRfcGlkLAorCQkJCSAgICAgICBvcHRzLnRhcmdldF90aWQsIG9wdHMuY3B1X2xpc3QpOworCWlmIChlcnIgPCAwKSB7CisJCXByX2RlYnVnKCJOb3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhyZWFkL2NwdSBtYXBzXG4iKTsKKwkJZ290byBvdXRfZGVsZXRlX2V2bGlzdDsKKwl9CisKKwkvKgorCSAqIFByZXBhcmUgdGhlIHdvcmtsb2FkIGluIGFyZ3ZbXSB0byBydW4sIGl0J2xsIGZvcmsgaXQsIGFuZCB0aGVuIHdhaXQKKwkgKiBmb3IgcGVyZl9ldmxpc3RfX3N0YXJ0X3dvcmtsb2FkKCkgdG8gZXhlYyBpdC4gVGhpcyBpcyBkb25lIHRoaXMgd2F5CisJICogc28gdGhhdCB3ZSBoYXZlIHRpbWUgdG8gb3BlbiB0aGUgZXZsaXN0IChjYWxsaW5nIHN5c19wZXJmX2V2ZW50X29wZW4KKwkgKiBvbiBhbGwgdGhlIGZkcykgYW5kIHRoZW4gbW1hcCB0aGVtLgorCSAqLworCWVyciA9IHBlcmZfZXZsaXN0X19wcmVwYXJlX3dvcmtsb2FkKGV2bGlzdCwgJm9wdHMsIGFyZ3YpOworCWlmIChlcnIgPCAwKSB7CisJCXByX2RlYnVnKCJDb3VsZG4ndCBydW4gdGhlIHdvcmtsb2FkIVxuIik7CisJCWdvdG8gb3V0X2RlbGV0ZV9ldmxpc3Q7CisJfQorCisJLyoKKwkgKiBDb25maWcgdGhlIGV2c2Vscywgc2V0dGluZyBhdHRyLT5jb21tIG9uIHRoZSBmaXJzdCBvbmUsIGV0Yy4KKwkgKi8KKwlldnNlbCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKwlldnNlbC0+YXR0ci5zYW1wbGVfdHlwZSB8PSBQRVJGX1NBTVBMRV9DUFU7CisJZXZzZWwtPmF0dHIuc2FtcGxlX3R5cGUgfD0gUEVSRl9TQU1QTEVfVElEOworCWV2c2VsLT5hdHRyLnNhbXBsZV90eXBlIHw9IFBFUkZfU0FNUExFX1RJTUU7CisJcGVyZl9ldmxpc3RfX2NvbmZpZ19hdHRycyhldmxpc3QsICZvcHRzKTsKKworCWVyciA9IHNjaGVkX19nZXRfZmlyc3RfcG9zc2libGVfY3B1KGV2bGlzdC0+d29ya2xvYWQucGlkLCAmY3B1X21hc2ssCisJCQkJCSAgICAmY3B1X21hc2tfc2l6ZSk7CisJaWYgKGVyciA8IDApIHsKKwkJcHJfZGVidWcoInNjaGVkX19nZXRfZmlyc3RfcG9zc2libGVfY3B1OiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBvdXRfZGVsZXRlX2V2bGlzdDsKKwl9CisKKwljcHUgPSBlcnI7CisKKwkvKgorCSAqIFNvIHRoYXQgd2UgY2FuIGNoZWNrIHBlcmZfc2FtcGxlLmNwdSBvbiBhbGwgdGhlIHNhbXBsZXMuCisJICovCisJaWYgKHNjaGVkX3NldGFmZmluaXR5KGV2bGlzdC0+d29ya2xvYWQucGlkLCBjcHVfbWFza19zaXplLCBjcHVfbWFzaykgPCAwKSB7CisJCXByX2RlYnVnKCJzY2hlZF9zZXRhZmZpbml0eTogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gb3V0X2ZyZWVfY3B1X21hc2s7CisJfQorCisJLyoKKwkgKiBDYWxsIHN5c19wZXJmX2V2ZW50X29wZW4gb24gYWxsIHRoZSBmZHMgb24gYWxsIHRoZSBldnNlbHMsCisJICogZ3JvdXBpbmcgdGhlbSBpZiBhc2tlZCB0by4KKwkgKi8KKwllcnIgPSBwZXJmX2V2bGlzdF9fb3Blbihldmxpc3QsIG9wdHMuZ3JvdXApOworCWlmIChlcnIgPCAwKSB7CisJCXByX2RlYnVnKCJwZXJmX2V2bGlzdF9fb3BlbjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCWdvdG8gb3V0X2RlbGV0ZV9ldmxpc3Q7CisJfQorCisJLyoKKwkgKiBtbWFwIHRoZSBmaXJzdCBmZCBvbiBhIGdpdmVuIENQVSBhbmQgYXNrIGZvciBldmVudHMgZm9yIHRoZSBvdGhlcgorCSAqIGZkcyBpbiB0aGUgc2FtZSBDUFUgdG8gYmUgaW5qZWN0ZWQgaW4gdGhlIHNhbWUgbW1hcCByaW5nIGJ1ZmZlcgorCSAqICh1c2luZyBpb2N0bChQRVJGX0VWRU5UX0lPQ19TRVRfT1VUUFVUKSkuCisJICovCisJZXJyID0gcGVyZl9ldmxpc3RfX21tYXAoZXZsaXN0LCBvcHRzLm1tYXBfcGFnZXMsIGZhbHNlKTsKKwlpZiAoZXJyIDwgMCkgeworCQlwcl9kZWJ1ZygicGVyZl9ldmxpc3RfX21tYXA6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIG91dF9kZWxldGVfZXZsaXN0OworCX0KKworCS8qCisJICogV2UnbGwgbmVlZCB0aGVzZSB0d28gdG8gcGFyc2UgdGhlIFBFUkZfU0FNUExFXyogZmllbGRzIGluIGVhY2gKKwkgKiBldmVudC4KKwkgKi8KKwlzYW1wbGVfdHlwZSA9IHBlcmZfZXZsaXN0X19zYW1wbGVfdHlwZShldmxpc3QpOworCXNhbXBsZV9zaXplID0gX19wZXJmX2V2c2VsX19zYW1wbGVfc2l6ZShzYW1wbGVfdHlwZSk7CisKKwkvKgorCSAqIE5vdyB0aGF0IGFsbCBpcyBwcm9wZXJseSBzZXQgdXAsIGVuYWJsZSB0aGUgZXZlbnRzLCB0aGV5IHdpbGwKKwkgKiBjb3VudCBqdXN0IG9uIHdvcmtsb2FkLnBpZCwgd2hpY2ggd2lsbCBzdGFydC4uLgorCSAqLworCXBlcmZfZXZsaXN0X19lbmFibGUoZXZsaXN0KTsKKworCS8qCisJICogTm93IQorCSAqLworCXBlcmZfZXZsaXN0X19zdGFydF93b3JrbG9hZChldmxpc3QpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IGJlZm9yZSA9IHRvdGFsX2V2ZW50czsKKworCQlmb3IgKGkgPSAwOyBpIDwgZXZsaXN0LT5ucl9tbWFwczsgaSsrKSB7CisJCQl1bmlvbiBwZXJmX2V2ZW50ICpldmVudDsKKworCQkJd2hpbGUgKChldmVudCA9IHBlcmZfZXZsaXN0X19tbWFwX3JlYWQoZXZsaXN0LCBpKSkgIT0gTlVMTCkgeworCQkJCWNvbnN0IHUzMiB0eXBlID0gZXZlbnQtPmhlYWRlci50eXBlOworCQkJCWNvbnN0IGNoYXIgKm5hbWUgPSBwZXJmX2V2ZW50X19uYW1lKHR5cGUpOworCisJCQkJKyt0b3RhbF9ldmVudHM7CisJCQkJaWYgKHR5cGUgPCBQRVJGX1JFQ09SRF9NQVgpCisJCQkJCW5yX2V2ZW50c1t0eXBlXSsrOworCisJCQkJZXJyID0gcGVyZl9ldmVudF9fcGFyc2Vfc2FtcGxlKGV2ZW50LCBzYW1wbGVfdHlwZSwKKwkJCQkJCQkgICAgICAgc2FtcGxlX3NpemUsIHRydWUsCisJCQkJCQkJICAgICAgICZzYW1wbGUsIGZhbHNlKTsKKwkJCQlpZiAoZXJyIDwgMCkgeworCQkJCQlpZiAodmVyYm9zZSkKKwkJCQkJCXBlcmZfZXZlbnRfX2ZwcmludGYoZXZlbnQsIHN0ZGVycik7CisJCQkJCXByX2RlYnVnKCJDb3VsZG4ndCBwYXJzZSBzYW1wbGVcbiIpOworCQkJCQlnb3RvIG91dF9lcnI7CisJCQkJfQorCisJCQkJaWYgKHZlcmJvc2UpIHsKKwkJCQkJcHJfaW5mbygiJSIgUFJJdTY0IiAlZCAiLCBzYW1wbGUudGltZSwgc2FtcGxlLmNwdSk7CisJCQkJCXBlcmZfZXZlbnRfX2ZwcmludGYoZXZlbnQsIHN0ZGVycik7CisJCQkJfQorCisJCQkJaWYgKHByZXZfdGltZSA+IHNhbXBsZS50aW1lKSB7CisJCQkJCXByX2RlYnVnKCIlcyBnb2luZyBiYWNrd2FyZHMgaW4gdGltZSwgcHJldj0lIiBQUkl1NjQgIiwgY3Vycj0lIiBQUkl1NjQgIlxuIiwKKwkJCQkJCSBuYW1lLCBwcmV2X3RpbWUsIHNhbXBsZS50aW1lKTsKKwkJCQkJKytlcnJzOworCQkJCX0KKworCQkJCXByZXZfdGltZSA9IHNhbXBsZS50aW1lOworCisJCQkJaWYgKHNhbXBsZS5jcHUgIT0gY3B1KSB7CisJCQkJCXByX2RlYnVnKCIlcyB3aXRoIHVuZXhwZWN0ZWQgY3B1LCBleHBlY3RlZCAlZCwgZ290ICVkXG4iLAorCQkJCQkJIG5hbWUsIGNwdSwgc2FtcGxlLmNwdSk7CisJCQkJCSsrZXJyczsKKwkJCQl9CisKKwkJCQlpZiAoKHBpZF90KXNhbXBsZS5waWQgIT0gZXZsaXN0LT53b3JrbG9hZC5waWQpIHsKKwkJCQkJcHJfZGVidWcoIiVzIHdpdGggdW5leHBlY3RlZCBwaWQsIGV4cGVjdGVkICVkLCBnb3QgJWRcbiIsCisJCQkJCQkgbmFtZSwgZXZsaXN0LT53b3JrbG9hZC5waWQsIHNhbXBsZS5waWQpOworCQkJCQkrK2VycnM7CisJCQkJfQorCisJCQkJaWYgKChwaWRfdClzYW1wbGUudGlkICE9IGV2bGlzdC0+d29ya2xvYWQucGlkKSB7CisJCQkJCXByX2RlYnVnKCIlcyB3aXRoIHVuZXhwZWN0ZWQgdGlkLCBleHBlY3RlZCAlZCwgZ290ICVkXG4iLAorCQkJCQkJIG5hbWUsIGV2bGlzdC0+d29ya2xvYWQucGlkLCBzYW1wbGUudGlkKTsKKwkJCQkJKytlcnJzOworCQkJCX0KKworCQkJCWlmICgodHlwZSA9PSBQRVJGX1JFQ09SRF9DT01NIHx8CisJCQkJICAgICB0eXBlID09IFBFUkZfUkVDT1JEX01NQVAgfHwKKwkJCQkgICAgIHR5cGUgPT0gUEVSRl9SRUNPUkRfRk9SSyB8fAorCQkJCSAgICAgdHlwZSA9PSBQRVJGX1JFQ09SRF9FWElUKSAmJgorCQkJCSAgICAgKHBpZF90KWV2ZW50LT5jb21tLnBpZCAhPSBldmxpc3QtPndvcmtsb2FkLnBpZCkgeworCQkJCQlwcl9kZWJ1ZygiJXMgd2l0aCB1bmV4cGVjdGVkIHBpZC90aWRcbiIsIG5hbWUpOworCQkJCQkrK2VycnM7CisJCQkJfQorCisJCQkJaWYgKCh0eXBlID09IFBFUkZfUkVDT1JEX0NPTU0gfHwKKwkJCQkgICAgIHR5cGUgPT0gUEVSRl9SRUNPUkRfTU1BUCkgJiYKKwkJCQkgICAgIGV2ZW50LT5jb21tLnBpZCAhPSBldmVudC0+Y29tbS50aWQpIHsKKwkJCQkJcHJfZGVidWcoIiVzIHdpdGggZGlmZmVyZW50IHBpZC90aWQhXG4iLCBuYW1lKTsKKwkJCQkJKytlcnJzOworCQkJCX0KKworCQkJCXN3aXRjaCAodHlwZSkgeworCQkJCWNhc2UgUEVSRl9SRUNPUkRfQ09NTToKKwkJCQkJaWYgKHN0cmNtcChldmVudC0+Y29tbS5jb21tLCBjbWQpKSB7CisJCQkJCQlwcl9kZWJ1ZygiJXMgd2l0aCB1bmV4cGVjdGVkIGNvbW0hXG4iLCBuYW1lKTsKKwkJCQkJCSsrZXJyczsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIFBFUkZfUkVDT1JEX0VYSVQ6CisJCQkJCWdvdG8gZm91bmRfZXhpdDsKKwkJCQljYXNlIFBFUkZfUkVDT1JEX01NQVA6CisJCQkJCWJuYW1lID0gc3RycmNocihldmVudC0+bW1hcC5maWxlbmFtZSwgJy8nKTsKKwkJCQkJaWYgKGJuYW1lICE9IE5VTEwpIHsKKwkJCQkJCWlmICghZm91bmRfY21kX21tYXApCisJCQkJCQkJZm91bmRfY21kX21tYXAgPSAhc3RyY21wKGJuYW1lICsgMSwgY21kKTsKKwkJCQkJCWlmICghZm91bmRfbGliY19tbWFwKQorCQkJCQkJCWZvdW5kX2xpYmNfbW1hcCA9ICFzdHJuY21wKGJuYW1lICsgMSwgImxpYmMiLCA0KTsKKwkJCQkJCWlmICghZm91bmRfbGRfbW1hcCkKKwkJCQkJCQlmb3VuZF9sZF9tbWFwID0gIXN0cm5jbXAoYm5hbWUgKyAxLCAibGQiLCAyKTsKKwkJCQkJfSBlbHNlIGlmICghZm91bmRfdmRzb19tbWFwKQorCQkJCQkJZm91bmRfdmRzb19tbWFwID0gIXN0cmNtcChldmVudC0+bW1hcC5maWxlbmFtZSwgIlt2ZHNvXSIpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgUEVSRl9SRUNPUkRfU0FNUExFOgorCQkJCQkvKiBKdXN0IGlnbm9yZSBzYW1wbGVzIGZvciBub3cgKi8KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcHJfZGVidWcoIlVuZXhwZWN0ZWQgcGVyZl9ldmVudC0+aGVhZGVyLnR5cGUgJWQhXG4iLAorCQkJCQkJIHR5cGUpOworCQkJCQkrK2VycnM7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyoKKwkJICogV2UgZG9uJ3QgdXNlIHBvbGwgaGVyZSBiZWNhdXNlIGF0IGxlYXN0IGF0IDMuMSB0aW1lcyB0aGUKKwkJICogUEVSRl9SRUNPUkRfeyFTQU1QTEV9IGV2ZW50cyBkb24ndCBob25vdXIKKwkJICogcGVyZl9ldmVudF9hdHRyLndha2V1cF9ldmVudHMsIGp1c3QgUEVSRl9FVkVOVF9TQU1QTEUgZG9lcy4KKwkJICovCisJCWlmICh0b3RhbF9ldmVudHMgPT0gYmVmb3JlICYmIGZhbHNlKQorCQkJcG9sbChldmxpc3QtPnBvbGxmZCwgZXZsaXN0LT5ucl9mZHMsIC0xKTsKKworCQlzbGVlcCgxKTsKKwkJaWYgKCsrd2FrZXVwcyA+IDUpIHsKKwkJCXByX2RlYnVnKCJObyBQRVJGX1JFQ09SRF9FWElUIGV2ZW50IVxuIik7CisJCQlicmVhazsKKwkJfQorCX0KKworZm91bmRfZXhpdDoKKwlpZiAobnJfZXZlbnRzW1BFUkZfUkVDT1JEX0NPTU1dID4gMSkgeworCQlwcl9kZWJ1ZygiRXhjZXNzaXZlIG51bWJlciBvZiBQRVJGX1JFQ09SRF9DT01NIGV2ZW50cyFcbiIpOworCQkrK2VycnM7CisJfQorCisJaWYgKG5yX2V2ZW50c1tQRVJGX1JFQ09SRF9DT01NXSA9PSAwKSB7CisJCXByX2RlYnVnKCJNaXNzaW5nIFBFUkZfUkVDT1JEX0NPTU0gZm9yICVzIVxuIiwgY21kKTsKKwkJKytlcnJzOworCX0KKworCWlmICghZm91bmRfY21kX21tYXApIHsKKwkJcHJfZGVidWcoIlBFUkZfUkVDT1JEX01NQVAgZm9yICVzIG1pc3NpbmchXG4iLCBjbWQpOworCQkrK2VycnM7CisJfQorCisJaWYgKCFmb3VuZF9saWJjX21tYXApIHsKKwkJcHJfZGVidWcoIlBFUkZfUkVDT1JEX01NQVAgZm9yICVzIG1pc3NpbmchXG4iLCAibGliYyIpOworCQkrK2VycnM7CisJfQorCisJaWYgKCFmb3VuZF9sZF9tbWFwKSB7CisJCXByX2RlYnVnKCJQRVJGX1JFQ09SRF9NTUFQIGZvciAlcyBtaXNzaW5nIVxuIiwgImxkIik7CisJCSsrZXJyczsKKwl9CisKKwlpZiAoIWZvdW5kX3Zkc29fbW1hcCkgeworCQlwcl9kZWJ1ZygiUEVSRl9SRUNPUkRfTU1BUCBmb3IgJXMgbWlzc2luZyFcbiIsICJbdmRzb10iKTsKKwkJKytlcnJzOworCX0KK291dF9lcnI6CisJcGVyZl9ldmxpc3RfX211bm1hcChldmxpc3QpOworb3V0X2ZyZWVfY3B1X21hc2s6CisJQ1BVX0ZSRUUoY3B1X21hc2spOworb3V0X2RlbGV0ZV9ldmxpc3Q6CisJcGVyZl9ldmxpc3RfX2RlbGV0ZShldmxpc3QpOworb3V0OgorCXJldHVybiAoZXJyIDwgMCB8fCBlcnJzID4gMCkgPyAtMSA6IDA7Cit9CisKIHN0YXRpYyBzdHJ1Y3QgdGVzdCB7CiAJY29uc3QgY2hhciAqZGVzYzsKIAlpbnQgKCpmdW5jKSh2b2lkKTsKQEAgLTg2Niw0NSArMTMyMSw4OSBAQAogCQkuZnVuYyA9IHRlc3RfX3BhcnNlX2V2ZW50cywKIAl9LAogCXsKKwkJLmRlc2MgPSAiVmFsaWRhdGUgUEVSRl9SRUNPUkRfKiBldmVudHMgJiBwZXJmX3NhbXBsZSBmaWVsZHMiLAorCQkuZnVuYyA9IHRlc3RfX1BFUkZfUkVDT1JELAorCX0sCisJewogCQkuZnVuYyA9IE5VTEwsCiAJfSwKIH07CiAKLXN0YXRpYyBpbnQgX19jbWRfdGVzdCh2b2lkKQorc3RhdGljIGJvb2wgcGVyZl90ZXN0X19tYXRjaGVzKGludCBjdXJyLCBpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQoreworCWludCBpOworCisJaWYgKGFyZ2MgPT0gMCkKKwkJcmV0dXJuIHRydWU7CisKKwlmb3IgKGkgPSAwOyBpIDwgYXJnYzsgKytpKSB7CisJCWNoYXIgKmVuZDsKKwkJbG9uZyBuciA9IHN0cnRvdWwoYXJndltpXSwgJmVuZCwgMTApOworCisJCWlmICgqZW5kID09ICdcMCcpIHsKKwkJCWlmIChuciA9PSBjdXJyICsgMSkKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cnN0cih0ZXN0c1tjdXJyXS5kZXNjLCBhcmd2W2ldKSkKKwkJCXJldHVybiB0cnVlOworCX0KKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBfX2NtZF90ZXN0KGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pCiB7CiAJaW50IGkgPSAwOwogCi0JcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRV9TSVpFKTsKLQogCXdoaWxlICh0ZXN0c1tpXS5mdW5jKSB7Ci0JCWludCBlcnI7Ci0JCXByX2luZm8oIiUyZDogJXM6IiwgaSArIDEsIHRlc3RzW2ldLmRlc2MpOworCQlpbnQgY3VyciA9IGkrKywgZXJyOworCisJCWlmICghcGVyZl90ZXN0X19tYXRjaGVzKGN1cnIsIGFyZ2MsIGFyZ3YpKQorCQkJY29udGludWU7CisKKwkJcHJfaW5mbygiJTJkOiAlczoiLCBpLCB0ZXN0c1tjdXJyXS5kZXNjKTsKIAkJcHJfZGVidWcoIlxuLS0tIHN0YXJ0IC0tLVxuIik7Ci0JCWVyciA9IHRlc3RzW2ldLmZ1bmMoKTsKLQkJcHJfZGVidWcoIi0tLS0gZW5kIC0tLS1cbiVzOiIsIHRlc3RzW2ldLmRlc2MpOworCQllcnIgPSB0ZXN0c1tjdXJyXS5mdW5jKCk7CisJCXByX2RlYnVnKCItLS0tIGVuZCAtLS0tXG4lczoiLCB0ZXN0c1tjdXJyXS5kZXNjKTsKIAkJcHJfaW5mbygiICVzXG4iLCBlcnIgPyAiRkFJTEVEIVxuIiA6ICJPayIpOwotCQkrK2k7CiAJfQogCiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGVzdF91c2FnZVtdID0gewotCSJwZXJmIHRlc3QgWzxvcHRpb25zPl0iLAotCU5VTEwsCi19Oworc3RhdGljIGludCBwZXJmX3Rlc3RfX2xpc3QoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBpID0gMDsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gdGVzdF9vcHRpb25zW10gPSB7Ci0JT1BUX0lOVEVHRVIoJ3YnLCAidmVyYm9zZSIsICZ2ZXJib3NlLAotCQkgICAgImJlIG1vcmUgdmVyYm9zZSAoc2hvdyBzeW1ib2wgYWRkcmVzcywgZXRjKSIpLAotCU9QVF9FTkQoKQotfTsKKwl3aGlsZSAodGVzdHNbaV0uZnVuYykgeworCQlpbnQgY3VyciA9IGkrKzsKKworCQlpZiAoYXJnYyA+IDEgJiYgIXN0cnN0cih0ZXN0c1tjdXJyXS5kZXNjLCBhcmd2WzFdKSkKKwkJCWNvbnRpbnVlOworCisJCXByX2luZm8oIiUyZDogJXNcbiIsIGksIHRlc3RzW2N1cnJdLmRlc2MpOworCX0KKworCXJldHVybiAwOworfQogCiBpbnQgY21kX3Rlc3QoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXggX191c2VkKQogeworCWNvbnN0IGNoYXIgKiBjb25zdCB0ZXN0X3VzYWdlW10gPSB7CisJInBlcmYgdGVzdCBbPG9wdGlvbnM+XSBbe2xpc3QgPHRlc3QtbmFtZS1mcmFnbWVudD58Wzx0ZXN0LW5hbWUtZnJhZ21lbnRzPnw8dGVzdC1udW1iZXJzPl19XSIsCisJTlVMTCwKKwl9OworCWNvbnN0IHN0cnVjdCBvcHRpb24gdGVzdF9vcHRpb25zW10gPSB7CisJT1BUX0lOVEVHRVIoJ3YnLCAidmVyYm9zZSIsICZ2ZXJib3NlLAorCQkgICAgImJlIG1vcmUgdmVyYm9zZSAoc2hvdyBzeW1ib2wgYWRkcmVzcywgZXRjKSIpLAorCU9QVF9FTkQoKQorCX07CisKIAlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCB0ZXN0X29wdGlvbnMsIHRlc3RfdXNhZ2UsIDApOwotCWlmIChhcmdjKQotCQl1c2FnZV93aXRoX29wdGlvbnModGVzdF91c2FnZSwgdGVzdF9vcHRpb25zKTsKKwlpZiAoYXJnYyA+PSAxICYmICFzdHJjbXAoYXJndlswXSwgImxpc3QiKSkKKwkJcmV0dXJuIHBlcmZfdGVzdF9fbGlzdChhcmdjLCBhcmd2KTsKIAogCXN5bWJvbF9jb25mLnByaXZfc2l6ZSA9IHNpemVvZihpbnQpOwogCXN5bWJvbF9jb25mLnNvcnRfYnlfbmFtZSA9IHRydWU7CkBAIC05MTUsNSArMTQxNCw1IEBACiAKIAlzZXR1cF9wYWdlcigpOwogCi0JcmV0dXJuIF9fY21kX3Rlc3QoKTsKKwlyZXR1cm4gX19jbWRfdGVzdChhcmdjLCBhcmd2KTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10aW1lY2hhcnQuYwppbmRleCBhYTI2ZjRkLi4zYjc1YjJlIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdGltZWNoYXJ0LmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRpbWVjaGFydC5jCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSAidXRpbC9jb2xvci5oIgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlICJ1dGlsL2NhY2hlLmgiCisjaW5jbHVkZSAidXRpbC9ldnNlbC5oIgogI2luY2x1ZGUgPGxpbnV4L3JidHJlZS5oPgogI2luY2x1ZGUgInV0aWwvc3ltYm9sLmgiCiAjaW5jbHVkZSAidXRpbC9jYWxsY2hhaW4uaCIKQEAgLTMxLDEzICszMiwxNCBAQAogI2luY2x1ZGUgInV0aWwvZXZlbnQuaCIKICNpbmNsdWRlICJ1dGlsL3Nlc3Npb24uaCIKICNpbmNsdWRlICJ1dGlsL3N2Z2hlbHBlci5oIgorI2luY2x1ZGUgInV0aWwvdG9vbC5oIgogCiAjZGVmaW5lIFNVUFBPUlRfT0xEX1BPV0VSX0VWRU5UUyAxCiAjZGVmaW5lIFBXUl9FVkVOVF9FWElUIC0xCiAKIAotc3RhdGljIGNoYXIJCWNvbnN0ICppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7Ci1zdGF0aWMgY2hhcgkJY29uc3QgKm91dHB1dF9uYW1lID0gIm91dHB1dC5zdmciOworc3RhdGljIGNvbnN0IGNoYXIJKmlucHV0X25hbWU7CitzdGF0aWMgY29uc3QgY2hhcgkqb3V0cHV0X25hbWUgPSAib3V0cHV0LnN2ZyI7CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQJbnVtY3B1czsKIHN0YXRpYyB1NjQJCW1pbl9mcmVxOwkvKiBMb3dlc3QgQ1BVIGZyZXF1ZW5jeSBzZWVuICovCkBAIC0yNzMsMjUgKzI3NSwyOCBAQAogc3RhdGljIHU2NCBjcHVzX3BzdGF0ZV9zdGFydF90aW1lc1tNQVhfQ1BVU107CiBzdGF0aWMgdTY0IGNwdXNfcHN0YXRlX3N0YXRlW01BWF9DUFVTXTsKIAotc3RhdGljIGludCBwcm9jZXNzX2NvbW1fZXZlbnQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCitzdGF0aWMgaW50IHByb2Nlc3NfY29tbV9ldmVudChzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKKwkJCSAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX191c2VkLAotCQkJICAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiBfX3VzZWQpCisJCQkgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSBfX3VzZWQpCiB7CiAJcGlkX3NldF9jb21tKGV2ZW50LT5jb21tLnRpZCwgZXZlbnQtPmNvbW0uY29tbSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19mb3JrX2V2ZW50KHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorc3RhdGljIGludCBwcm9jZXNzX2ZvcmtfZXZlbnQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX3VzZWQsCisJCQkgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlIF9fdXNlZCwKLQkJCSAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gX191c2VkKQorCQkJICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191c2VkKQogewogCXBpZF9mb3JrKGV2ZW50LT5mb3JrLnBpZCwgZXZlbnQtPmZvcmsucHBpZCwgZXZlbnQtPmZvcmsudGltZSk7CiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19leGl0X2V2ZW50KHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorc3RhdGljIGludCBwcm9jZXNzX2V4aXRfZXZlbnQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX3VzZWQsCisJCQkgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlIF9fdXNlZCwKLQkJCSAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gX191c2VkKQorCQkJICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191c2VkKQogewogCXBpZF9leGl0KGV2ZW50LT5mb3JrLnBpZCwgZXZlbnQtPmZvcmsudGltZSk7CiAJcmV0dXJuIDA7CkBAIC00ODYsMTQgKzQ5MSwxNSBAQAogfQogCiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19zYW1wbGVfZXZlbnQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQgX191c2VkLAorc3RhdGljIGludCBwcm9jZXNzX3NhbXBsZV9ldmVudChzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKKwkJCQl1bmlvbiBwZXJmX2V2ZW50ICpldmVudCBfX3VzZWQsCiAJCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fdXNlZCwKLQkJCQlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQorCQkJCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCQlzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSBfX3VzZWQpCiB7CiAJc3RydWN0IHRyYWNlX2VudHJ5ICp0ZTsKIAotCWlmIChzZXNzaW9uLT5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1RJTUUpIHsKKwlpZiAoZXZzZWwtPmF0dHIuc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9USU1FKSB7CiAJCWlmICghZmlyc3RfdGltZSB8fCBmaXJzdF90aW1lID4gc2FtcGxlLT50aW1lKQogCQkJZmlyc3RfdGltZSA9IHNhbXBsZS0+dGltZTsKIAkJaWYgKGxhc3RfdGltZSA8IHNhbXBsZS0+dGltZSkKQEAgLTUwMSw3ICs1MDcsNyBAQAogCX0KIAogCXRlID0gKHZvaWQgKilzYW1wbGUtPnJhd19kYXRhOwotCWlmIChzZXNzaW9uLT5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1JBVyAmJiBzYW1wbGUtPnJhd19zaXplID4gMCkgeworCWlmICgoZXZzZWwtPmF0dHIuc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9SQVcpICYmIHNhbXBsZS0+cmF3X3NpemUgPiAwKSB7CiAJCWNoYXIgKmV2ZW50X3N0cjsKICNpZmRlZiBTVVBQT1JUX09MRF9QT1dFUl9FVkVOVFMKIAkJc3RydWN0IHBvd2VyX2VudHJ5X29sZCAqcGVvOwpAQCAtOTc0LDcgKzk4MCw3IEBACiAJc3ZnX2Nsb3NlKCk7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgcGVyZl9ldmVudF9vcHMgZXZlbnRfb3BzID0geworc3RhdGljIHN0cnVjdCBwZXJmX3Rvb2wgcGVyZl90aW1lY2hhcnQgPSB7CiAJLmNvbW0JCQk9IHByb2Nlc3NfY29tbV9ldmVudCwKIAkuZm9yawkJCT0gcHJvY2Vzc19mb3JrX2V2ZW50LAogCS5leGl0CQkJPSBwcm9jZXNzX2V4aXRfZXZlbnQsCkBAIC05ODUsNyArOTkxLDcgQEAKIHN0YXRpYyBpbnQgX19jbWRfdGltZWNoYXJ0KHZvaWQpCiB7CiAJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiA9IHBlcmZfc2Vzc2lvbl9fbmV3KGlucHV0X25hbWUsIE9fUkRPTkxZLAotCQkJCQkJCSAwLCBmYWxzZSwgJmV2ZW50X29wcyk7CisJCQkJCQkJIDAsIGZhbHNlLCAmcGVyZl90aW1lY2hhcnQpOwogCWludCByZXQgPSAtRUlOVkFMOwogCiAJaWYgKHNlc3Npb24gPT0gTlVMTCkKQEAgLTk5NCw3ICsxMDAwLDcgQEAKIAlpZiAoIXBlcmZfc2Vzc2lvbl9faGFzX3RyYWNlcyhzZXNzaW9uLCAidGltZWNoYXJ0IHJlY29yZCIpKQogCQlnb3RvIG91dF9kZWxldGU7CiAKLQlyZXQgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlc3Npb24sICZldmVudF9vcHMpOworCXJldCA9IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc2Vzc2lvbiwgJnBlcmZfdGltZWNoYXJ0KTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9kZWxldGU7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi10b3AuYwppbmRleCBjOWNkZWRiLi40ZjgxZWViIDEwMDY0NAotLS0gYS90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKKysrIGIvdG9vbHMvcGVyZi9idWlsdGluLXRvcC5jCkBAIC02NCw0NCArNjQsNiBAQAogI2luY2x1ZGUgPGxpbnV4L3VuaXN0ZC5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAKLXN0YXRpYyBzdHJ1Y3QgcGVyZl90b3AgdG9wID0gewotCS5jb3VudF9maWx0ZXIJCT0gNSwKLQkuZGVsYXlfc2VjcwkJPSAyLAotCS50YXJnZXRfcGlkCQk9IC0xLAotCS50YXJnZXRfdGlkCQk9IC0xLAotCS5mcmVxCQkJPSAxMDAwLCAvKiAxIEtIeiAqLwotfTsKLQotc3RhdGljIGJvb2wJCQlzeXN0ZW1fd2lkZQkJCT0gIGZhbHNlOwotCi1zdGF0aWMgYm9vbAkJCXVzZV90dWksIHVzZV9zdGRpbzsKLQotc3RhdGljIGJvb2wJCQlzb3J0X2hhc19zeW1ib2xzOwotCi1zdGF0aWMgYm9vbAkJCWRvbnRfdXNlX2NhbGxjaGFpbnM7Ci1zdGF0aWMgY2hhcgkJCWNhbGxjaGFpbl9kZWZhdWx0X29wdFtdCQk9ICJmcmFjdGFsLDAuNSxjYWxsZWUiOwotCi0KLXN0YXRpYyBpbnQJCQlkZWZhdWx0X2ludGVydmFsCQk9ICAgICAgMDsKLQotc3RhdGljIGJvb2wJCQlrcHRyX3Jlc3RyaWN0X3dhcm5lZDsKLXN0YXRpYyBib29sCQkJdm1saW51eF93YXJuZWQ7Ci1zdGF0aWMgYm9vbAkJCWluaGVyaXQJCQkJPSAgZmFsc2U7Ci1zdGF0aWMgaW50CQkJcmVhbHRpbWVfcHJpbwkJCT0gICAgICAwOwotc3RhdGljIGJvb2wJCQlncm91cAkJCQk9ICBmYWxzZTsKLXN0YXRpYyBib29sCQkJc2FtcGxlX2lkX2FsbF9hdmFpbAkJPSAgIHRydWU7Ci1zdGF0aWMgdW5zaWduZWQgaW50CQltbWFwX3BhZ2VzCQkJPSAgICAxMjg7Ci0KLXN0YXRpYyBib29sCQkJZHVtcF9zeW10YWIgICAgICAgICAgICAgICAgICAgICA9ICBmYWxzZTsKLQotc3RhdGljIHN0cnVjdCB3aW5zaXplCQl3aW5zaXplOwotCi1zdGF0aWMgY29uc3QgY2hhcgkJKnN5bV9maWx0ZXIJCQk9ICAgTlVMTDsKLXN0YXRpYyBpbnQJCQlzeW1fcGNudF9maWx0ZXIJCQk9ICAgICAgNTsKLQotLyoKLSAqIFNvdXJjZSBmdW5jdGlvbnMKLSAqLwogCiB2b2lkIGdldF90ZXJtX2RpbWVuc2lvbnMoc3RydWN0IHdpbnNpemUgKndzKQogewpAQCAtMTI1LDIxICs4NywyMyBAQAogCXdzLT53c19jb2wgPSA4MDsKIH0KIAotc3RhdGljIHZvaWQgdXBkYXRlX3ByaW50X2VudHJpZXMoc3RydWN0IHdpbnNpemUgKndzKQorc3RhdGljIHZvaWQgcGVyZl90b3BfX3VwZGF0ZV9wcmludF9lbnRyaWVzKHN0cnVjdCBwZXJmX3RvcCAqdG9wKQogewotCXRvcC5wcmludF9lbnRyaWVzID0gd3MtPndzX3JvdzsKKwl0b3AtPnByaW50X2VudHJpZXMgPSB0b3AtPndpbnNpemUud3Nfcm93OwogCi0JaWYgKHRvcC5wcmludF9lbnRyaWVzID4gOSkKLQkJdG9wLnByaW50X2VudHJpZXMgLT0gOTsKKwlpZiAodG9wLT5wcmludF9lbnRyaWVzID4gOSkKKwkJdG9wLT5wcmludF9lbnRyaWVzIC09IDk7CiB9CiAKLXN0YXRpYyB2b2lkIHNpZ193aW5jaF9oYW5kbGVyKGludCBzaWcgX191c2VkKQorc3RhdGljIHZvaWQgcGVyZl90b3BfX3NpZ193aW5jaChpbnQgc2lnIF9fdXNlZCwgc2lnaW5mb190ICppbmZvIF9fdXNlZCwgdm9pZCAqYXJnKQogewotCWdldF90ZXJtX2RpbWVuc2lvbnMoJndpbnNpemUpOwotCXVwZGF0ZV9wcmludF9lbnRyaWVzKCZ3aW5zaXplKTsKKwlzdHJ1Y3QgcGVyZl90b3AgKnRvcCA9IGFyZzsKKworCWdldF90ZXJtX2RpbWVuc2lvbnMoJnRvcC0+d2luc2l6ZSk7CisJcGVyZl90b3BfX3VwZGF0ZV9wcmludF9lbnRyaWVzKHRvcCk7CiB9CiAKLXN0YXRpYyBpbnQgcGFyc2Vfc291cmNlKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkKK3N0YXRpYyBpbnQgcGVyZl90b3BfX3BhcnNlX3NvdXJjZShzdHJ1Y3QgcGVyZl90b3AgKnRvcCwgc3RydWN0IGhpc3RfZW50cnkgKmhlKQogewogCXN0cnVjdCBzeW1ib2wgKnN5bTsKIAlzdHJ1Y3QgYW5ub3RhdGlvbiAqbm90ZXM7CkBAIC0xNzAsNyArMTM0LDcgQEAKIAogCXB0aHJlYWRfbXV0ZXhfbG9jaygmbm90ZXMtPmxvY2spOwogCi0JaWYgKHN5bWJvbF9fYWxsb2NfaGlzdChzeW0sIHRvcC5ldmxpc3QtPm5yX2VudHJpZXMpIDwgMCkgeworCWlmIChzeW1ib2xfX2FsbG9jX2hpc3Qoc3ltKSA8IDApIHsKIAkJcHRocmVhZF9tdXRleF91bmxvY2soJm5vdGVzLT5sb2NrKTsKIAkJcHJfZXJyKCJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgYW5ub3RhdGluZyAnJXMnIHN5bWJvbCFcbiIsCiAJCSAgICAgICBzeW0tPm5hbWUpOwpAQCAtMTgxLDcgKzE0NSw3IEBACiAJZXJyID0gc3ltYm9sX19hbm5vdGF0ZShzeW0sIG1hcCwgMCk7CiAJaWYgKGVyciA9PSAwKSB7CiBvdXRfYXNzaWduOgotCQl0b3Auc3ltX2ZpbHRlcl9lbnRyeSA9IGhlOworCQl0b3AtPnN5bV9maWx0ZXJfZW50cnkgPSBoZTsKIAl9CiAKIAlwdGhyZWFkX211dGV4X3VubG9jaygmbm90ZXMtPmxvY2spOwpAQCAtMTk0LDE0ICsxNTgsMTYgQEAKIAlzeW1ib2xfX2Fubm90YXRlX3plcm9faGlzdG9ncmFtcyhzeW0pOwogfQogCi1zdGF0aWMgdm9pZCByZWNvcmRfcHJlY2lzZV9pcChzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsIGludCBjb3VudGVyLCB1NjQgaXApCitzdGF0aWMgdm9pZCBwZXJmX3RvcF9fcmVjb3JkX3ByZWNpc2VfaXAoc3RydWN0IHBlcmZfdG9wICp0b3AsCisJCQkJCXN0cnVjdCBoaXN0X2VudHJ5ICpoZSwKKwkJCQkJaW50IGNvdW50ZXIsIHU2NCBpcCkKIHsKIAlzdHJ1Y3QgYW5ub3RhdGlvbiAqbm90ZXM7CiAJc3RydWN0IHN5bWJvbCAqc3ltOwogCiAJaWYgKGhlID09IE5VTEwgfHwgaGUtPm1zLnN5bSA9PSBOVUxMIHx8Ci0JICAgICgodG9wLnN5bV9maWx0ZXJfZW50cnkgPT0gTlVMTCB8fAotCSAgICAgIHRvcC5zeW1fZmlsdGVyX2VudHJ5LT5tcy5zeW0gIT0gaGUtPm1zLnN5bSkgJiYgdXNlX2Jyb3dzZXIgIT0gMSkpCisJICAgICgodG9wLT5zeW1fZmlsdGVyX2VudHJ5ID09IE5VTEwgfHwKKwkgICAgICB0b3AtPnN5bV9maWx0ZXJfZW50cnktPm1zLnN5bSAhPSBoZS0+bXMuc3ltKSAmJiB1c2VfYnJvd3NlciAhPSAxKSkKIAkJcmV0dXJuOwogCiAJc3ltID0gaGUtPm1zLnN5bTsKQEAgLTIxMCw4ICsxNzYsNyBAQAogCWlmIChwdGhyZWFkX211dGV4X3RyeWxvY2soJm5vdGVzLT5sb2NrKSkKIAkJcmV0dXJuOwogCi0JaWYgKG5vdGVzLT5zcmMgPT0gTlVMTCAmJgotCSAgICBzeW1ib2xfX2FsbG9jX2hpc3Qoc3ltLCB0b3AuZXZsaXN0LT5ucl9lbnRyaWVzKSA8IDApIHsKKwlpZiAobm90ZXMtPnNyYyA9PSBOVUxMICYmIHN5bWJvbF9fYWxsb2NfaGlzdChzeW0pIDwgMCkgewogCQlwdGhyZWFkX211dGV4X3VubG9jaygmbm90ZXMtPmxvY2spOwogCQlwcl9lcnIoIk5vdCBlbm91Z2ggbWVtb3J5IGZvciBhbm5vdGF0aW5nICclcycgc3ltYm9sIVxuIiwKIAkJICAgICAgIHN5bS0+bmFtZSk7CkBAIC0yMjUsOCArMTkwLDkgQEAKIAlwdGhyZWFkX211dGV4X3VubG9jaygmbm90ZXMtPmxvY2spOwogfQogCi1zdGF0aWMgdm9pZCBzaG93X2RldGFpbHMoc3RydWN0IGhpc3RfZW50cnkgKmhlKQorc3RhdGljIHZvaWQgcGVyZl90b3BfX3Nob3dfZGV0YWlscyhzdHJ1Y3QgcGVyZl90b3AgKnRvcCkKIHsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUgPSB0b3AtPnN5bV9maWx0ZXJfZW50cnk7CiAJc3RydWN0IGFubm90YXRpb24gKm5vdGVzOwogCXN0cnVjdCBzeW1ib2wgKnN5bWJvbDsKIAlpbnQgbW9yZTsKQEAgLTI0MiwxNSArMjA4LDE1IEBACiAJaWYgKG5vdGVzLT5zcmMgPT0gTlVMTCkKIAkJZ290byBvdXRfdW5sb2NrOwogCi0JcHJpbnRmKCJTaG93aW5nICVzIGZvciAlc1xuIiwgZXZlbnRfbmFtZSh0b3Auc3ltX2V2c2VsKSwgc3ltYm9sLT5uYW1lKTsKLQlwcmludGYoIiAgRXZlbnRzICBQY250ICg+PSVkJSUpXG4iLCBzeW1fcGNudF9maWx0ZXIpOworCXByaW50ZigiU2hvd2luZyAlcyBmb3IgJXNcbiIsIGV2ZW50X25hbWUodG9wLT5zeW1fZXZzZWwpLCBzeW1ib2wtPm5hbWUpOworCXByaW50ZigiICBFdmVudHMgIFBjbnQgKD49JWQlJSlcbiIsIHRvcC0+c3ltX3BjbnRfZmlsdGVyKTsKIAotCW1vcmUgPSBzeW1ib2xfX2Fubm90YXRlX3ByaW50ZihzeW1ib2wsIGhlLT5tcy5tYXAsIHRvcC5zeW1fZXZzZWwtPmlkeCwKLQkJCQkgICAgICAgMCwgc3ltX3BjbnRfZmlsdGVyLCB0b3AucHJpbnRfZW50cmllcywgNCk7Ci0JaWYgKHRvcC56ZXJvKQotCQlzeW1ib2xfX2Fubm90YXRlX3plcm9faGlzdG9ncmFtKHN5bWJvbCwgdG9wLnN5bV9ldnNlbC0+aWR4KTsKKwltb3JlID0gc3ltYm9sX19hbm5vdGF0ZV9wcmludGYoc3ltYm9sLCBoZS0+bXMubWFwLCB0b3AtPnN5bV9ldnNlbC0+aWR4LAorCQkJCSAgICAgICAwLCB0b3AtPnN5bV9wY250X2ZpbHRlciwgdG9wLT5wcmludF9lbnRyaWVzLCA0KTsKKwlpZiAodG9wLT56ZXJvKQorCQlzeW1ib2xfX2Fubm90YXRlX3plcm9faGlzdG9ncmFtKHN5bWJvbCwgdG9wLT5zeW1fZXZzZWwtPmlkeCk7CiAJZWxzZQotCQlzeW1ib2xfX2Fubm90YXRlX2RlY2F5X2hpc3RvZ3JhbShzeW1ib2wsIHRvcC5zeW1fZXZzZWwtPmlkeCk7CisJCXN5bWJvbF9fYW5ub3RhdGVfZGVjYXlfaGlzdG9ncmFtKHN5bWJvbCwgdG9wLT5zeW1fZXZzZWwtPmlkeCk7CiAJaWYgKG1vcmUgIT0gMCkKIAkJcHJpbnRmKCIlZCBsaW5lcyBub3QgZGlzcGxheWVkLCBtYXliZSBpbmNyZWFzZSBkaXNwbGF5IGVudHJpZXMgW2VdXG4iLCBtb3JlKTsKIG91dF91bmxvY2s6CkBAIC0yNTksMTEgKzIyNSw5IEBACiAKIHN0YXRpYyBjb25zdCBjaGFyCQlDT05TT0xFX0NMRUFSW10gPSAiG1tIG1sySiI7CiAKLXN0YXRpYyBzdHJ1Y3QgaGlzdF9lbnRyeSAqCi0JcGVyZl9zZXNzaW9uX19hZGRfaGlzdF9lbnRyeShzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJCSAgICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLAotCQkJCSAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJICAgICBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwpCitzdGF0aWMgc3RydWN0IGhpc3RfZW50cnkgKnBlcmZfZXZzZWxfX2FkZF9oaXN0X2VudHJ5KHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCQkJCSAgICAgc3RydWN0IGFkZHJfbG9jYXRpb24gKmFsLAorCQkJCQkJICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKIHsKIAlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CiAKQEAgLTI3MSw1MCArMjM1LDUxIEBACiAJaWYgKGhlID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCi0Jc2Vzc2lvbi0+aGlzdHMuc3RhdHMudG90YWxfcGVyaW9kICs9IHNhbXBsZS0+cGVyaW9kOworCWV2c2VsLT5oaXN0cy5zdGF0cy50b3RhbF9wZXJpb2QgKz0gc2FtcGxlLT5wZXJpb2Q7CiAJaGlzdHNfX2luY19ucl9ldmVudHMoJmV2c2VsLT5oaXN0cywgUEVSRl9SRUNPUkRfU0FNUExFKTsKIAlyZXR1cm4gaGU7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X3N5bV90YWJsZSh2b2lkKQorc3RhdGljIHZvaWQgcGVyZl90b3BfX3ByaW50X3N5bV90YWJsZShzdHJ1Y3QgcGVyZl90b3AgKnRvcCkKIHsKIAljaGFyIGJmWzE2MF07CiAJaW50IHByaW50ZWQgPSAwOwotCWNvbnN0IGludCB3aW5fd2lkdGggPSB3aW5zaXplLndzX2NvbCAtIDE7CisJY29uc3QgaW50IHdpbl93aWR0aCA9IHRvcC0+d2luc2l6ZS53c19jb2wgLSAxOwogCiAJcHV0cyhDT05TT0xFX0NMRUFSKTsKIAotCXBlcmZfdG9wX19oZWFkZXJfc25wcmludGYoJnRvcCwgYmYsIHNpemVvZihiZikpOworCXBlcmZfdG9wX19oZWFkZXJfc25wcmludGYodG9wLCBiZiwgc2l6ZW9mKGJmKSk7CiAJcHJpbnRmKCIlc1xuIiwgYmYpOwogCi0JcGVyZl90b3BfX3Jlc2V0X3NhbXBsZV9jb3VudGVycygmdG9wKTsKKwlwZXJmX3RvcF9fcmVzZXRfc2FtcGxlX2NvdW50ZXJzKHRvcCk7CiAKIAlwcmludGYoIiUtKi4qc1xuIiwgd2luX3dpZHRoLCB3aW5fd2lkdGgsIGdyYXBoX2RvdHRlZF9saW5lKTsKIAotCWlmICh0b3Auc3ltX2V2c2VsLT5oaXN0cy5zdGF0cy5ucl9sb3N0X3dhcm5lZCAhPQotCSAgICB0b3Auc3ltX2V2c2VsLT5oaXN0cy5zdGF0cy5ucl9ldmVudHNbUEVSRl9SRUNPUkRfTE9TVF0pIHsKLQkJdG9wLnN5bV9ldnNlbC0+aGlzdHMuc3RhdHMubnJfbG9zdF93YXJuZWQgPQotCQkJdG9wLnN5bV9ldnNlbC0+aGlzdHMuc3RhdHMubnJfZXZlbnRzW1BFUkZfUkVDT1JEX0xPU1RdOworCWlmICh0b3AtPnN5bV9ldnNlbC0+aGlzdHMuc3RhdHMubnJfbG9zdF93YXJuZWQgIT0KKwkgICAgdG9wLT5zeW1fZXZzZWwtPmhpc3RzLnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9MT1NUXSkgeworCQl0b3AtPnN5bV9ldnNlbC0+aGlzdHMuc3RhdHMubnJfbG9zdF93YXJuZWQgPQorCQkJdG9wLT5zeW1fZXZzZWwtPmhpc3RzLnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9MT1NUXTsKIAkJY29sb3JfZnByaW50ZihzdGRvdXQsIFBFUkZfQ09MT1JfUkVELAogCQkJICAgICAgIldBUk5JTkc6IExPU1QgJWQgY2h1bmtzLCBDaGVjayBJTy9DUFUgb3ZlcmxvYWQiLAotCQkJICAgICAgdG9wLnN5bV9ldnNlbC0+aGlzdHMuc3RhdHMubnJfbG9zdF93YXJuZWQpOworCQkJICAgICAgdG9wLT5zeW1fZXZzZWwtPmhpc3RzLnN0YXRzLm5yX2xvc3Rfd2FybmVkKTsKIAkJKytwcmludGVkOwogCX0KIAotCWlmICh0b3Auc3ltX2ZpbHRlcl9lbnRyeSkgewotCQlzaG93X2RldGFpbHModG9wLnN5bV9maWx0ZXJfZW50cnkpOworCWlmICh0b3AtPnN5bV9maWx0ZXJfZW50cnkpIHsKKwkJcGVyZl90b3BfX3Nob3dfZGV0YWlscyh0b3ApOwogCQlyZXR1cm47CiAJfQogCi0JaGlzdHNfX2NvbGxhcHNlX3Jlc29ydF90aHJlYWRlZCgmdG9wLnN5bV9ldnNlbC0+aGlzdHMpOwotCWhpc3RzX19vdXRwdXRfcmVzb3J0X3RocmVhZGVkKCZ0b3Auc3ltX2V2c2VsLT5oaXN0cyk7Ci0JaGlzdHNfX2RlY2F5X2VudHJpZXNfdGhyZWFkZWQoJnRvcC5zeW1fZXZzZWwtPmhpc3RzLAotCQkJCSAgICAgIHRvcC5oaWRlX3VzZXJfc3ltYm9scywKLQkJCQkgICAgICB0b3AuaGlkZV9rZXJuZWxfc3ltYm9scyk7Ci0JaGlzdHNfX291dHB1dF9yZWNhbGNfY29sX2xlbigmdG9wLnN5bV9ldnNlbC0+aGlzdHMsIHdpbnNpemUud3Nfcm93IC0gMyk7CisJaGlzdHNfX2NvbGxhcHNlX3Jlc29ydF90aHJlYWRlZCgmdG9wLT5zeW1fZXZzZWwtPmhpc3RzKTsKKwloaXN0c19fb3V0cHV0X3Jlc29ydF90aHJlYWRlZCgmdG9wLT5zeW1fZXZzZWwtPmhpc3RzKTsKKwloaXN0c19fZGVjYXlfZW50cmllc190aHJlYWRlZCgmdG9wLT5zeW1fZXZzZWwtPmhpc3RzLAorCQkJCSAgICAgIHRvcC0+aGlkZV91c2VyX3N5bWJvbHMsCisJCQkJICAgICAgdG9wLT5oaWRlX2tlcm5lbF9zeW1ib2xzKTsKKwloaXN0c19fb3V0cHV0X3JlY2FsY19jb2xfbGVuKCZ0b3AtPnN5bV9ldnNlbC0+aGlzdHMsCisJCQkJICAgICB0b3AtPndpbnNpemUud3Nfcm93IC0gMyk7CiAJcHV0Y2hhcignXG4nKTsKLQloaXN0c19fZnByaW50ZigmdG9wLnN5bV9ldnNlbC0+aGlzdHMsIE5VTEwsIGZhbHNlLCBmYWxzZSwKLQkJICAgICAgIHdpbnNpemUud3Nfcm93IC0gNCAtIHByaW50ZWQsIHdpbl93aWR0aCwgc3Rkb3V0KTsKKwloaXN0c19fZnByaW50ZigmdG9wLT5zeW1fZXZzZWwtPmhpc3RzLCBOVUxMLCBmYWxzZSwgZmFsc2UsCisJCSAgICAgICB0b3AtPndpbnNpemUud3Nfcm93IC0gNCAtIHByaW50ZWQsIHdpbl93aWR0aCwgc3Rkb3V0KTsKIH0KIAogc3RhdGljIHZvaWQgcHJvbXB0X2ludGVnZXIoaW50ICp0YXJnZXQsIGNvbnN0IGNoYXIgKm1zZykKQEAgLTM1MiwxNyArMzE3LDE3IEBACiAJCSp0YXJnZXQgPSB0bXA7CiB9CiAKLXN0YXRpYyB2b2lkIHByb21wdF9zeW1ib2woc3RydWN0IGhpc3RfZW50cnkgKip0YXJnZXQsIGNvbnN0IGNoYXIgKm1zZykKK3N0YXRpYyB2b2lkIHBlcmZfdG9wX19wcm9tcHRfc3ltYm9sKHN0cnVjdCBwZXJmX3RvcCAqdG9wLCBjb25zdCBjaGFyICptc2cpCiB7CiAJY2hhciAqYnVmID0gbWFsbG9jKDApLCAqcDsKLQlzdHJ1Y3QgaGlzdF9lbnRyeSAqc3ltZSA9ICp0YXJnZXQsICpuLCAqZm91bmQgPSBOVUxMOworCXN0cnVjdCBoaXN0X2VudHJ5ICpzeW1lID0gdG9wLT5zeW1fZmlsdGVyX2VudHJ5LCAqbiwgKmZvdW5kID0gTlVMTDsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmV4dDsKIAlzaXplX3QgZHVtbXkgPSAwOwogCiAJLyogemVybyBjb3VudGVycyBvZiBhY3RpdmUgc3ltYm9sICovCiAJaWYgKHN5bWUpIHsKIAkJX196ZXJvX3NvdXJjZV9jb3VudGVycyhzeW1lKTsKLQkJKnRhcmdldCA9IE5VTEw7CisJCXRvcC0+c3ltX2ZpbHRlcl9lbnRyeSA9IE5VTEw7CiAJfQogCiAJZnByaW50ZihzdGRvdXQsICJcbiVzOiAiLCBtc2cpOwpAQCAtMzczLDcgKzMzOCw3IEBACiAJaWYgKHApCiAJCSpwID0gMDsKIAotCW5leHQgPSByYl9maXJzdCgmdG9wLnN5bV9ldnNlbC0+aGlzdHMuZW50cmllcyk7CisJbmV4dCA9IHJiX2ZpcnN0KCZ0b3AtPnN5bV9ldnNlbC0+aGlzdHMuZW50cmllcyk7CiAJd2hpbGUgKG5leHQpIHsKIAkJbiA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKIAkJaWYgKG4tPm1zLnN5bSAmJiAhc3RyY21wKGJ1Ziwgbi0+bXMuc3ltLT5uYW1lKSkgewpAQCAtMzg2LDQ3ICszNTEsNDYgQEAKIAlpZiAoIWZvdW5kKSB7CiAJCWZwcmludGYoc3RkZXJyLCAiU29ycnksICVzIGlzIG5vdCBhY3RpdmUuXG4iLCBidWYpOwogCQlzbGVlcCgxKTsKLQkJcmV0dXJuOwogCX0gZWxzZQotCQlwYXJzZV9zb3VyY2UoZm91bmQpOworCQlwZXJmX3RvcF9fcGFyc2Vfc291cmNlKHRvcCwgZm91bmQpOwogCiBvdXRfZnJlZToKIAlmcmVlKGJ1Zik7CiB9CiAKLXN0YXRpYyB2b2lkIHByaW50X21hcHBlZF9rZXlzKHZvaWQpCitzdGF0aWMgdm9pZCBwZXJmX3RvcF9fcHJpbnRfbWFwcGVkX2tleXMoc3RydWN0IHBlcmZfdG9wICp0b3ApCiB7CiAJY2hhciAqbmFtZSA9IE5VTEw7CiAKLQlpZiAodG9wLnN5bV9maWx0ZXJfZW50cnkpIHsKLQkJc3RydWN0IHN5bWJvbCAqc3ltID0gdG9wLnN5bV9maWx0ZXJfZW50cnktPm1zLnN5bTsKKwlpZiAodG9wLT5zeW1fZmlsdGVyX2VudHJ5KSB7CisJCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHRvcC0+c3ltX2ZpbHRlcl9lbnRyeS0+bXMuc3ltOwogCQluYW1lID0gc3ltLT5uYW1lOwogCX0KIAogCWZwcmludGYoc3Rkb3V0LCAiXG5NYXBwZWQga2V5czpcbiIpOwotCWZwcmludGYoc3Rkb3V0LCAiXHRbZF0gICAgIGRpc3BsYXkgcmVmcmVzaCBkZWxheS4gICAgICAgICAgICAgXHQoJWQpXG4iLCB0b3AuZGVsYXlfc2Vjcyk7Ci0JZnByaW50ZihzdGRvdXQsICJcdFtlXSAgICAgZGlzcGxheSBlbnRyaWVzIChsaW5lcykuICAgICAgICAgICBcdCglZClcbiIsIHRvcC5wcmludF9lbnRyaWVzKTsKKwlmcHJpbnRmKHN0ZG91dCwgIlx0W2RdICAgICBkaXNwbGF5IHJlZnJlc2ggZGVsYXkuICAgICAgICAgICAgIFx0KCVkKVxuIiwgdG9wLT5kZWxheV9zZWNzKTsKKwlmcHJpbnRmKHN0ZG91dCwgIlx0W2VdICAgICBkaXNwbGF5IGVudHJpZXMgKGxpbmVzKS4gICAgICAgICAgIFx0KCVkKVxuIiwgdG9wLT5wcmludF9lbnRyaWVzKTsKIAotCWlmICh0b3AuZXZsaXN0LT5ucl9lbnRyaWVzID4gMSkKLQkJZnByaW50ZihzdGRvdXQsICJcdFtFXSAgICAgYWN0aXZlIGV2ZW50IGNvdW50ZXIuICAgICAgICAgICAgICBcdCglcylcbiIsIGV2ZW50X25hbWUodG9wLnN5bV9ldnNlbCkpOworCWlmICh0b3AtPmV2bGlzdC0+bnJfZW50cmllcyA+IDEpCisJCWZwcmludGYoc3Rkb3V0LCAiXHRbRV0gICAgIGFjdGl2ZSBldmVudCBjb3VudGVyLiAgICAgICAgICAgICAgXHQoJXMpXG4iLCBldmVudF9uYW1lKHRvcC0+c3ltX2V2c2VsKSk7CiAKLQlmcHJpbnRmKHN0ZG91dCwgIlx0W2ZdICAgICBwcm9maWxlIGRpc3BsYXkgZmlsdGVyIChjb3VudCkuICAgIFx0KCVkKVxuIiwgdG9wLmNvdW50X2ZpbHRlcik7CisJZnByaW50ZihzdGRvdXQsICJcdFtmXSAgICAgcHJvZmlsZSBkaXNwbGF5IGZpbHRlciAoY291bnQpLiAgICBcdCglZClcbiIsIHRvcC0+Y291bnRfZmlsdGVyKTsKIAotCWZwcmludGYoc3Rkb3V0LCAiXHRbRl0gICAgIGFubm90YXRlIGRpc3BsYXkgZmlsdGVyIChwZXJjZW50KS4gXHQoJWQlJSlcbiIsIHN5bV9wY250X2ZpbHRlcik7CisJZnByaW50ZihzdGRvdXQsICJcdFtGXSAgICAgYW5ub3RhdGUgZGlzcGxheSBmaWx0ZXIgKHBlcmNlbnQpLiBcdCglZCUlKVxuIiwgdG9wLT5zeW1fcGNudF9maWx0ZXIpOwogCWZwcmludGYoc3Rkb3V0LCAiXHRbc10gICAgIGFubm90YXRlIHN5bWJvbC4gICAgICAgICAgICAgICAgICAgXHQoJXMpXG4iLCBuYW1lPzogIk5VTEwiKTsKIAlmcHJpbnRmKHN0ZG91dCwgIlx0W1NdICAgICBzdG9wIGFubm90YXRpb24uXG4iKTsKIAogCWZwcmludGYoc3Rkb3V0LAogCQkiXHRbS10gICAgIGhpZGUga2VybmVsX3N5bWJvbHMgc3ltYm9scy4gICAgIFx0KCVzKVxuIiwKLQkJdG9wLmhpZGVfa2VybmVsX3N5bWJvbHMgPyAieWVzIiA6ICJubyIpOworCQl0b3AtPmhpZGVfa2VybmVsX3N5bWJvbHMgPyAieWVzIiA6ICJubyIpOwogCWZwcmludGYoc3Rkb3V0LAogCQkiXHRbVV0gICAgIGhpZGUgdXNlciBzeW1ib2xzLiAgICAgICAgICAgICAgIFx0KCVzKVxuIiwKLQkJdG9wLmhpZGVfdXNlcl9zeW1ib2xzID8gInllcyIgOiAibm8iKTsKLQlmcHJpbnRmKHN0ZG91dCwgIlx0W3pdICAgICB0b2dnbGUgc2FtcGxlIHplcm9pbmcuICAgICAgICAgICAgIFx0KCVkKVxuIiwgdG9wLnplcm8gPyAxIDogMCk7CisJCXRvcC0+aGlkZV91c2VyX3N5bWJvbHMgPyAieWVzIiA6ICJubyIpOworCWZwcmludGYoc3Rkb3V0LCAiXHRbel0gICAgIHRvZ2dsZSBzYW1wbGUgemVyb2luZy4gICAgICAgICAgICAgXHQoJWQpXG4iLCB0b3AtPnplcm8gPyAxIDogMCk7CiAJZnByaW50ZihzdGRvdXQsICJcdFtxUV0gICAgcXVpdC5cbiIpOwogfQogCi1zdGF0aWMgaW50IGtleV9tYXBwZWQoaW50IGMpCitzdGF0aWMgaW50IHBlcmZfdG9wX19rZXlfbWFwcGVkKHN0cnVjdCBwZXJmX3RvcCAqdG9wLCBpbnQgYykKIHsKIAlzd2l0Y2ggKGMpIHsKIAkJY2FzZSAnZCc6CkBAIC00NDIsNyArNDA2LDcgQEAKIAkJY2FzZSAnUyc6CiAJCQlyZXR1cm4gMTsKIAkJY2FzZSAnRSc6Ci0JCQlyZXR1cm4gdG9wLmV2bGlzdC0+bnJfZW50cmllcyA+IDEgPyAxIDogMDsKKwkJCXJldHVybiB0b3AtPmV2bGlzdC0+bnJfZW50cmllcyA+IDEgPyAxIDogMDsKIAkJZGVmYXVsdDoKIAkJCWJyZWFrOwogCX0KQEAgLTQ1MCwxMyArNDE0LDEzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGhhbmRsZV9rZXlwcmVzcyhpbnQgYykKK3N0YXRpYyB2b2lkIHBlcmZfdG9wX19oYW5kbGVfa2V5cHJlc3Moc3RydWN0IHBlcmZfdG9wICp0b3AsIGludCBjKQogewotCWlmICgha2V5X21hcHBlZChjKSkgeworCWlmICghcGVyZl90b3BfX2tleV9tYXBwZWQodG9wLCBjKSkgewogCQlzdHJ1Y3QgcG9sbGZkIHN0ZGluX3BvbGwgPSB7IC5mZCA9IDAsIC5ldmVudHMgPSBQT0xMSU4gfTsKIAkJc3RydWN0IHRlcm1pb3MgdGMsIHNhdmU7CiAKLQkJcHJpbnRfbWFwcGVkX2tleXMoKTsKKwkJcGVyZl90b3BfX3ByaW50X21hcHBlZF9rZXlzKHRvcCk7CiAJCWZwcmludGYoc3Rkb3V0LCAiXG5FbnRlciBzZWxlY3Rpb24sIG9yIHVubWFwcGVkIGtleSB0byBjb250aW51ZTogIik7CiAJCWZmbHVzaChzdGRvdXQpOwogCkBAIC00NzEsODEgKzQzNSw4NiBAQAogCQljID0gZ2V0YyhzdGRpbik7CiAKIAkJdGNzZXRhdHRyKDAsIFRDU0FGTFVTSCwgJnNhdmUpOwotCQlpZiAoIWtleV9tYXBwZWQoYykpCisJCWlmICghcGVyZl90b3BfX2tleV9tYXBwZWQodG9wLCBjKSkKIAkJCXJldHVybjsKIAl9CiAKIAlzd2l0Y2ggKGMpIHsKIAkJY2FzZSAnZCc6Ci0JCQlwcm9tcHRfaW50ZWdlcigmdG9wLmRlbGF5X3NlY3MsICJFbnRlciBkaXNwbGF5IGRlbGF5Iik7Ci0JCQlpZiAodG9wLmRlbGF5X3NlY3MgPCAxKQotCQkJCXRvcC5kZWxheV9zZWNzID0gMTsKKwkJCXByb21wdF9pbnRlZ2VyKCZ0b3AtPmRlbGF5X3NlY3MsICJFbnRlciBkaXNwbGF5IGRlbGF5Iik7CisJCQlpZiAodG9wLT5kZWxheV9zZWNzIDwgMSkKKwkJCQl0b3AtPmRlbGF5X3NlY3MgPSAxOwogCQkJYnJlYWs7CiAJCWNhc2UgJ2UnOgotCQkJcHJvbXB0X2ludGVnZXIoJnRvcC5wcmludF9lbnRyaWVzLCAiRW50ZXIgZGlzcGxheSBlbnRyaWVzIChsaW5lcykiKTsKLQkJCWlmICh0b3AucHJpbnRfZW50cmllcyA9PSAwKSB7Ci0JCQkJc2lnX3dpbmNoX2hhbmRsZXIoU0lHV0lOQ0gpOwotCQkJCXNpZ25hbChTSUdXSU5DSCwgc2lnX3dpbmNoX2hhbmRsZXIpOworCQkJcHJvbXB0X2ludGVnZXIoJnRvcC0+cHJpbnRfZW50cmllcywgIkVudGVyIGRpc3BsYXkgZW50cmllcyAobGluZXMpIik7CisJCQlpZiAodG9wLT5wcmludF9lbnRyaWVzID09IDApIHsKKwkJCQlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdCA9IHsKKwkJCQkJLnNhX3NpZ2FjdGlvbiA9IHBlcmZfdG9wX19zaWdfd2luY2gsCisJCQkJCS5zYV9mbGFncyAgICAgPSBTQV9TSUdJTkZPLAorCQkJCX07CisJCQkJcGVyZl90b3BfX3NpZ193aW5jaChTSUdXSU5DSCwgTlVMTCwgdG9wKTsKKwkJCQlzaWdhY3Rpb24oU0lHV0lOQ0gsICZhY3QsIE5VTEwpOwogCQkJfSBlbHNlCiAJCQkJc2lnbmFsKFNJR1dJTkNILCBTSUdfREZMKTsKIAkJCWJyZWFrOwogCQljYXNlICdFJzoKLQkJCWlmICh0b3AuZXZsaXN0LT5ucl9lbnRyaWVzID4gMSkgeworCQkJaWYgKHRvcC0+ZXZsaXN0LT5ucl9lbnRyaWVzID4gMSkgewogCQkJCS8qIFNlbGVjdCAwIGFzIHRoZSBkZWZhdWx0IGV2ZW50OiAqLwogCQkJCWludCBjb3VudGVyID0gMDsKIAogCQkJCWZwcmludGYoc3RkZXJyLCAiXG5BdmFpbGFibGUgZXZlbnRzOiIpOwogCi0JCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0b3Auc3ltX2V2c2VsLCAmdG9wLmV2bGlzdC0+ZW50cmllcywgbm9kZSkKLQkJCQkJZnByaW50ZihzdGRlcnIsICJcblx0JWQgJXMiLCB0b3Auc3ltX2V2c2VsLT5pZHgsIGV2ZW50X25hbWUodG9wLnN5bV9ldnNlbCkpOworCQkJCWxpc3RfZm9yX2VhY2hfZW50cnkodG9wLT5zeW1fZXZzZWwsICZ0b3AtPmV2bGlzdC0+ZW50cmllcywgbm9kZSkKKwkJCQkJZnByaW50ZihzdGRlcnIsICJcblx0JWQgJXMiLCB0b3AtPnN5bV9ldnNlbC0+aWR4LCBldmVudF9uYW1lKHRvcC0+c3ltX2V2c2VsKSk7CiAKIAkJCQlwcm9tcHRfaW50ZWdlcigmY291bnRlciwgIkVudGVyIGRldGFpbHMgZXZlbnQgY291bnRlciIpOwogCi0JCQkJaWYgKGNvdW50ZXIgPj0gdG9wLmV2bGlzdC0+bnJfZW50cmllcykgewotCQkJCQl0b3Auc3ltX2V2c2VsID0gbGlzdF9lbnRyeSh0b3AuZXZsaXN0LT5lbnRyaWVzLm5leHQsIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKLQkJCQkJZnByaW50ZihzdGRlcnIsICJTb3JyeSwgbm8gc3VjaCBldmVudCwgdXNpbmcgJXMuXG4iLCBldmVudF9uYW1lKHRvcC5zeW1fZXZzZWwpKTsKKwkJCQlpZiAoY291bnRlciA+PSB0b3AtPmV2bGlzdC0+bnJfZW50cmllcykgeworCQkJCQl0b3AtPnN5bV9ldnNlbCA9IGxpc3RfZW50cnkodG9wLT5ldmxpc3QtPmVudHJpZXMubmV4dCwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlNvcnJ5LCBubyBzdWNoIGV2ZW50LCB1c2luZyAlcy5cbiIsIGV2ZW50X25hbWUodG9wLT5zeW1fZXZzZWwpKTsKIAkJCQkJc2xlZXAoMSk7CiAJCQkJCWJyZWFrOwogCQkJCX0KLQkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRvcC5zeW1fZXZzZWwsICZ0b3AuZXZsaXN0LT5lbnRyaWVzLCBub2RlKQotCQkJCQlpZiAodG9wLnN5bV9ldnNlbC0+aWR4ID09IGNvdW50ZXIpCisJCQkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0b3AtPnN5bV9ldnNlbCwgJnRvcC0+ZXZsaXN0LT5lbnRyaWVzLCBub2RlKQorCQkJCQlpZiAodG9wLT5zeW1fZXZzZWwtPmlkeCA9PSBjb3VudGVyKQogCQkJCQkJYnJlYWs7CiAJCQl9IGVsc2UKLQkJCQl0b3Auc3ltX2V2c2VsID0gbGlzdF9lbnRyeSh0b3AuZXZsaXN0LT5lbnRyaWVzLm5leHQsIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKwkJCQl0b3AtPnN5bV9ldnNlbCA9IGxpc3RfZW50cnkodG9wLT5ldmxpc3QtPmVudHJpZXMubmV4dCwgc3RydWN0IHBlcmZfZXZzZWwsIG5vZGUpOwogCQkJYnJlYWs7CiAJCWNhc2UgJ2YnOgotCQkJcHJvbXB0X2ludGVnZXIoJnRvcC5jb3VudF9maWx0ZXIsICJFbnRlciBkaXNwbGF5IGV2ZW50IGNvdW50IGZpbHRlciIpOworCQkJcHJvbXB0X2ludGVnZXIoJnRvcC0+Y291bnRfZmlsdGVyLCAiRW50ZXIgZGlzcGxheSBldmVudCBjb3VudCBmaWx0ZXIiKTsKIAkJCWJyZWFrOwogCQljYXNlICdGJzoKLQkJCXByb21wdF9wZXJjZW50KCZzeW1fcGNudF9maWx0ZXIsICJFbnRlciBkZXRhaWxzIGRpc3BsYXkgZXZlbnQgZmlsdGVyIChwZXJjZW50KSIpOworCQkJcHJvbXB0X3BlcmNlbnQoJnRvcC0+c3ltX3BjbnRfZmlsdGVyLAorCQkJCSAgICAgICAiRW50ZXIgZGV0YWlscyBkaXNwbGF5IGV2ZW50IGZpbHRlciAocGVyY2VudCkiKTsKIAkJCWJyZWFrOwogCQljYXNlICdLJzoKLQkJCXRvcC5oaWRlX2tlcm5lbF9zeW1ib2xzID0gIXRvcC5oaWRlX2tlcm5lbF9zeW1ib2xzOworCQkJdG9wLT5oaWRlX2tlcm5lbF9zeW1ib2xzID0gIXRvcC0+aGlkZV9rZXJuZWxfc3ltYm9sczsKIAkJCWJyZWFrOwogCQljYXNlICdxJzoKIAkJY2FzZSAnUSc6CiAJCQlwcmludGYoImV4aXRpbmcuXG4iKTsKLQkJCWlmIChkdW1wX3N5bXRhYikKLQkJCQlwZXJmX3Nlc3Npb25fX2ZwcmludGZfZHNvcyh0b3Auc2Vzc2lvbiwgc3RkZXJyKTsKKwkJCWlmICh0b3AtPmR1bXBfc3ltdGFiKQorCQkJCXBlcmZfc2Vzc2lvbl9fZnByaW50Zl9kc29zKHRvcC0+c2Vzc2lvbiwgc3RkZXJyKTsKIAkJCWV4aXQoMCk7CiAJCWNhc2UgJ3MnOgotCQkJcHJvbXB0X3N5bWJvbCgmdG9wLnN5bV9maWx0ZXJfZW50cnksICJFbnRlciBkZXRhaWxzIHN5bWJvbCIpOworCQkJcGVyZl90b3BfX3Byb21wdF9zeW1ib2wodG9wLCAiRW50ZXIgZGV0YWlscyBzeW1ib2wiKTsKIAkJCWJyZWFrOwogCQljYXNlICdTJzoKLQkJCWlmICghdG9wLnN5bV9maWx0ZXJfZW50cnkpCisJCQlpZiAoIXRvcC0+c3ltX2ZpbHRlcl9lbnRyeSkKIAkJCQlicmVhazsKIAkJCWVsc2UgewotCQkJCXN0cnVjdCBoaXN0X2VudHJ5ICpzeW1lID0gdG9wLnN5bV9maWx0ZXJfZW50cnk7CisJCQkJc3RydWN0IGhpc3RfZW50cnkgKnN5bWUgPSB0b3AtPnN5bV9maWx0ZXJfZW50cnk7CiAKLQkJCQl0b3Auc3ltX2ZpbHRlcl9lbnRyeSA9IE5VTEw7CisJCQkJdG9wLT5zeW1fZmlsdGVyX2VudHJ5ID0gTlVMTDsKIAkJCQlfX3plcm9fc291cmNlX2NvdW50ZXJzKHN5bWUpOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2UgJ1UnOgotCQkJdG9wLmhpZGVfdXNlcl9zeW1ib2xzID0gIXRvcC5oaWRlX3VzZXJfc3ltYm9sczsKKwkJCXRvcC0+aGlkZV91c2VyX3N5bWJvbHMgPSAhdG9wLT5oaWRlX3VzZXJfc3ltYm9sczsKIAkJCWJyZWFrOwogCQljYXNlICd6JzoKLQkJCXRvcC56ZXJvID0gIXRvcC56ZXJvOworCQkJdG9wLT56ZXJvID0gIXRvcC0+emVybzsKIAkJCWJyZWFrOwogCQlkZWZhdWx0OgogCQkJYnJlYWs7CkBAIC01NjMsMjggKzUzMiwzMCBAQAogCWhpc3RzX19jb2xsYXBzZV9yZXNvcnRfdGhyZWFkZWQoJnQtPnN5bV9ldnNlbC0+aGlzdHMpOwogCWhpc3RzX19vdXRwdXRfcmVzb3J0X3RocmVhZGVkKCZ0LT5zeW1fZXZzZWwtPmhpc3RzKTsKIAloaXN0c19fZGVjYXlfZW50cmllc190aHJlYWRlZCgmdC0+c3ltX2V2c2VsLT5oaXN0cywKLQkJCQkgICAgICB0b3AuaGlkZV91c2VyX3N5bWJvbHMsCi0JCQkJICAgICAgdG9wLmhpZGVfa2VybmVsX3N5bWJvbHMpOworCQkJCSAgICAgIHQtPmhpZGVfdXNlcl9zeW1ib2xzLAorCQkJCSAgICAgIHQtPmhpZGVfa2VybmVsX3N5bWJvbHMpOwogfQogCi1zdGF0aWMgdm9pZCAqZGlzcGxheV90aHJlYWRfdHVpKHZvaWQgKmFyZyBfX3VzZWQpCitzdGF0aWMgdm9pZCAqZGlzcGxheV90aHJlYWRfdHVpKHZvaWQgKmFyZykKIHsKKwlzdHJ1Y3QgcGVyZl90b3AgKnRvcCA9IGFyZzsKIAljb25zdCBjaGFyICpoZWxwID0gIkZvciBhIGhpZ2hlciBsZXZlbCBvdmVydmlldywgdHJ5OiBwZXJmIHRvcCAtLXNvcnQgY29tbSxkc28iOwogCi0JcGVyZl90b3BfX3NvcnRfbmV3X3NhbXBsZXMoJnRvcCk7Ci0JcGVyZl9ldmxpc3RfX3R1aV9icm93c2VfaGlzdHModG9wLmV2bGlzdCwgaGVscCwKKwlwZXJmX3RvcF9fc29ydF9uZXdfc2FtcGxlcyh0b3ApOworCXBlcmZfZXZsaXN0X190dWlfYnJvd3NlX2hpc3RzKHRvcC0+ZXZsaXN0LCBoZWxwLAogCQkJCSAgICAgIHBlcmZfdG9wX19zb3J0X25ld19zYW1wbGVzLAotCQkJCSAgICAgICZ0b3AsIHRvcC5kZWxheV9zZWNzKTsKKwkJCQkgICAgICB0b3AsIHRvcC0+ZGVsYXlfc2Vjcyk7CiAKIAlleGl0X2Jyb3dzZXIoMCk7CiAJZXhpdCgwKTsKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgKmRpc3BsYXlfdGhyZWFkKHZvaWQgKmFyZyBfX3VzZWQpCitzdGF0aWMgdm9pZCAqZGlzcGxheV90aHJlYWQodm9pZCAqYXJnKQogewogCXN0cnVjdCBwb2xsZmQgc3RkaW5fcG9sbCA9IHsgLmZkID0gMCwgLmV2ZW50cyA9IFBPTExJTiB9OwogCXN0cnVjdCB0ZXJtaW9zIHRjLCBzYXZlOworCXN0cnVjdCBwZXJmX3RvcCAqdG9wID0gYXJnOwogCWludCBkZWxheV9tc2VjcywgYzsKIAogCXRjZ2V0YXR0cigwLCAmc2F2ZSk7CkBAIC01OTUsMTMgKzU2NiwxMyBAQAogCiAJcHRocmVhZF9fdW5ibG9ja19zaWd3aW5jaCgpOwogcmVwZWF0OgotCWRlbGF5X21zZWNzID0gdG9wLmRlbGF5X3NlY3MgKiAxMDAwOworCWRlbGF5X21zZWNzID0gdG9wLT5kZWxheV9zZWNzICogMTAwMDsKIAl0Y3NldGF0dHIoMCwgVENTQU5PVywgJnRjKTsKIAkvKiB0cmFzaCByZXR1cm4qLwogCWdldGMoc3RkaW4pOwogCiAJd2hpbGUgKDEpIHsKLQkJcHJpbnRfc3ltX3RhYmxlKCk7CisJCXBlcmZfdG9wX19wcmludF9zeW1fdGFibGUodG9wKTsKIAkJLyoKIAkJICogRWl0aGVyIHRpbWVvdXQgZXhwaXJlZCBvciB3ZSBnb3QgYW4gRUlOVFIgZHVlIHRvIFNJR1dJTkNILAogCQkgKiByZWZyZXNoIHNjcmVlbiBpbiBib3RoIGNhc2VzLgpAQCAtNjIxLDcgKzU5Miw3IEBACiAJYyA9IGdldGMoc3RkaW4pOwogCXRjc2V0YXR0cigwLCBUQ1NBRkxVU0gsICZzYXZlKTsKIAotCWhhbmRsZV9rZXlwcmVzcyhjKTsKKwlwZXJmX3RvcF9faGFuZGxlX2tleXByZXNzKHRvcCwgYyk7CiAJZ290byByZXBlYXQ7CiAKIAlyZXR1cm4gTlVMTDsKQEAgLTY3Myw0NyArNjQ0LDE3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZfZXZlbnRfX3Byb2Nlc3Nfc2FtcGxlKGNvbnN0IHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorc3RhdGljIHZvaWQgcGVyZl9ldmVudF9fcHJvY2Vzc19zYW1wbGUoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQkgICAgICAgY29uc3QgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKIAkJCQkgICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJICAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJICAgICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogeworCXN0cnVjdCBwZXJmX3RvcCAqdG9wID0gY29udGFpbmVyX29mKHRvb2wsIHN0cnVjdCBwZXJmX3RvcCwgdG9vbCk7CiAJc3RydWN0IHN5bWJvbCAqcGFyZW50ID0gTlVMTDsKIAl1NjQgaXAgPSBldmVudC0+aXAuaXA7CiAJc3RydWN0IGFkZHJfbG9jYXRpb24gYWw7Ci0Jc3RydWN0IG1hY2hpbmUgKm1hY2hpbmU7CiAJaW50IGVycjsKLQl1OCBvcmlnaW4gPSBldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX1JFQ09SRF9NSVNDX0NQVU1PREVfTUFTSzsKLQotCSsrdG9wLnNhbXBsZXM7Ci0KLQlzd2l0Y2ggKG9yaWdpbikgewotCWNhc2UgUEVSRl9SRUNPUkRfTUlTQ19VU0VSOgotCQkrK3RvcC51c19zYW1wbGVzOwotCQlpZiAodG9wLmhpZGVfdXNlcl9zeW1ib2xzKQotCQkJcmV0dXJuOwotCQltYWNoaW5lID0gcGVyZl9zZXNzaW9uX19maW5kX2hvc3RfbWFjaGluZShzZXNzaW9uKTsKLQkJYnJlYWs7Ci0JY2FzZSBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTDoKLQkJKyt0b3Aua2VybmVsX3NhbXBsZXM7Ci0JCWlmICh0b3AuaGlkZV9rZXJuZWxfc3ltYm9scykKLQkJCXJldHVybjsKLQkJbWFjaGluZSA9IHBlcmZfc2Vzc2lvbl9fZmluZF9ob3N0X21hY2hpbmUoc2Vzc2lvbik7Ci0JCWJyZWFrOwotCWNhc2UgUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9LRVJORUw6Ci0JCSsrdG9wLmd1ZXN0X2tlcm5lbF9zYW1wbGVzOwotCQltYWNoaW5lID0gcGVyZl9zZXNzaW9uX19maW5kX21hY2hpbmUoc2Vzc2lvbiwgZXZlbnQtPmlwLnBpZCk7Ci0JCWJyZWFrOwotCWNhc2UgUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9VU0VSOgotCQkrK3RvcC5ndWVzdF91c19zYW1wbGVzOwotCQkvKgotCQkgKiBUT0RPOiB3ZSBkb24ndCBwcm9jZXNzIGd1ZXN0IHVzZXIgZnJvbSBob3N0IHNpZGUKLQkJICogZXhjZXB0IHNpbXBsZSBjb3VudGluZy4KLQkJICovCi0JCXJldHVybjsKLQlkZWZhdWx0OgotCQlyZXR1cm47Ci0JfQogCiAJaWYgKCFtYWNoaW5lICYmIHBlcmZfZ3Vlc3QpIHsKIAkJcHJfZXJyKCJDYW4ndCBmaW5kIGd1ZXN0IFslZF0ncyBrZXJuZWwgaW5mb3JtYXRpb25cbiIsCkBAIC03MjIsMTQgKzY2MywxNCBAQAogCX0KIAogCWlmIChldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX1JFQ09SRF9NSVNDX0VYQUNUX0lQKQotCQl0b3AuZXhhY3Rfc2FtcGxlcysrOworCQl0b3AtPmV4YWN0X3NhbXBsZXMrKzsKIAotCWlmIChwZXJmX2V2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShldmVudCwgc2Vzc2lvbiwgJmFsLCBzYW1wbGUsCisJaWYgKHBlcmZfZXZlbnRfX3ByZXByb2Nlc3Nfc2FtcGxlKGV2ZW50LCBtYWNoaW5lLCAmYWwsIHNhbXBsZSwKIAkJCQkJICBzeW1ib2xfZmlsdGVyKSA8IDAgfHwKIAkgICAgYWwuZmlsdGVyZWQpCiAJCXJldHVybjsKIAotCWlmICgha3B0cl9yZXN0cmljdF93YXJuZWQgJiYKKwlpZiAoIXRvcC0+a3B0cl9yZXN0cmljdF93YXJuZWQgJiYKIAkgICAgc3ltYm9sX2NvbmYua3B0cl9yZXN0cmljdCAmJgogCSAgICBhbC5jcHVtb2RlID09IFBFUkZfUkVDT1JEX01JU0NfS0VSTkVMKSB7CiAJCXVpX193YXJuaW5nKApAQCAtNzQwLDcgKzY4MSw3IEBACiAJCQkgICIgbW9kdWxlcyIgOiAiIik7CiAJCWlmICh1c2VfYnJvd3NlciA8PSAwKQogCQkJc2xlZXAoNSk7Ci0JCWtwdHJfcmVzdHJpY3Rfd2FybmVkID0gdHJ1ZTsKKwkJdG9wLT5rcHRyX3Jlc3RyaWN0X3dhcm5lZCA9IHRydWU7CiAJfQogCiAJaWYgKGFsLnN5bSA9PSBOVUxMKSB7CkBAIC03NTYsNyArNjk3LDcgQEAKIAkJICogLS1oaWRlLWtlcm5lbC1zeW1ib2xzLCBldmVuIGlmIHRoZSB1c2VyIHNwZWNpZmllcyBhbgogCQkgKiBpbnZhbGlkIC0tdm1saW51eCA7LSkKIAkJICovCi0JCWlmICgha3B0cl9yZXN0cmljdF93YXJuZWQgJiYgIXZtbGludXhfd2FybmVkICYmCisJCWlmICghdG9wLT5rcHRyX3Jlc3RyaWN0X3dhcm5lZCAmJiAhdG9wLT52bWxpbnV4X3dhcm5lZCAmJgogCQkgICAgYWwubWFwID09IG1hY2hpbmUtPnZtbGludXhfbWFwc1tNQVBfX0ZVTkNUSU9OXSAmJgogCQkgICAgUkJfRU1QVFlfUk9PVCgmYWwubWFwLT5kc28tPnN5bWJvbHNbTUFQX19GVU5DVElPTl0pKSB7CiAJCQlpZiAoc3ltYm9sX2NvbmYudm1saW51eF9uYW1lKSB7CkBAIC03NjksNyArNzEwLDcgQEAKIAogCQkJaWYgKHVzZV9icm93c2VyIDw9IDApCiAJCQkJc2xlZXAoNSk7Ci0JCQl2bWxpbnV4X3dhcm5lZCA9IHRydWU7CisJCQl0b3AtPnZtbGludXhfd2FybmVkID0gdHJ1ZTsKIAkJfQogCX0KIApAQCAtNzc4LDcwICs3MTksMTA5IEBACiAKIAkJaWYgKChzb3J0X19oYXNfcGFyZW50IHx8IHN5bWJvbF9jb25mLnVzZV9jYWxsY2hhaW4pICYmCiAJCSAgICBzYW1wbGUtPmNhbGxjaGFpbikgewotCQkJZXJyID0gcGVyZl9zZXNzaW9uX19yZXNvbHZlX2NhbGxjaGFpbihzZXNzaW9uLCBhbC50aHJlYWQsCi0JCQkJCQkJICAgICAgc2FtcGxlLT5jYWxsY2hhaW4sICZwYXJlbnQpOworCQkJZXJyID0gbWFjaGluZV9fcmVzb2x2ZV9jYWxsY2hhaW4obWFjaGluZSwgZXZzZWwsIGFsLnRocmVhZCwKKwkJCQkJCQkgc2FtcGxlLT5jYWxsY2hhaW4sICZwYXJlbnQpOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm47CiAJCX0KIAotCQloZSA9IHBlcmZfc2Vzc2lvbl9fYWRkX2hpc3RfZW50cnkoc2Vzc2lvbiwgJmFsLCBzYW1wbGUsIGV2c2VsKTsKKwkJaGUgPSBwZXJmX2V2c2VsX19hZGRfaGlzdF9lbnRyeShldnNlbCwgJmFsLCBzYW1wbGUpOwogCQlpZiAoaGUgPT0gTlVMTCkgewogCQkJcHJfZXJyKCJQcm9ibGVtIGluY3JlbWVudGluZyBzeW1ib2wgcGVyaW9kLCBza2lwcGluZyBldmVudFxuIik7CiAJCQlyZXR1cm47CiAJCX0KIAogCQlpZiAoc3ltYm9sX2NvbmYudXNlX2NhbGxjaGFpbikgewotCQkJZXJyID0gY2FsbGNoYWluX2FwcGVuZChoZS0+Y2FsbGNoYWluLCAmc2Vzc2lvbi0+Y2FsbGNoYWluX2N1cnNvciwKKwkJCWVyciA9IGNhbGxjaGFpbl9hcHBlbmQoaGUtPmNhbGxjaGFpbiwgJmV2c2VsLT5oaXN0cy5jYWxsY2hhaW5fY3Vyc29yLAogCQkJCQkgICAgICAgc2FtcGxlLT5wZXJpb2QpOwogCQkJaWYgKGVycikKIAkJCQlyZXR1cm47CiAJCX0KIAotCQlpZiAoc29ydF9oYXNfc3ltYm9scykKLQkJCXJlY29yZF9wcmVjaXNlX2lwKGhlLCBldnNlbC0+aWR4LCBpcCk7CisJCWlmICh0b3AtPnNvcnRfaGFzX3N5bWJvbHMpCisJCQlwZXJmX3RvcF9fcmVjb3JkX3ByZWNpc2VfaXAodG9wLCBoZSwgZXZzZWwtPmlkeCwgaXApOwogCX0KIAogCXJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgcGVyZl9zZXNzaW9uX19tbWFwX3JlYWRfaWR4KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYsIGludCBpZHgpCitzdGF0aWMgdm9pZCBwZXJmX3RvcF9fbW1hcF9yZWFkX2lkeChzdHJ1Y3QgcGVyZl90b3AgKnRvcCwgaW50IGlkeCkKIHsKIAlzdHJ1Y3QgcGVyZl9zYW1wbGUgc2FtcGxlOwogCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uID0gdG9wLT5zZXNzaW9uOwogCXVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50OworCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lOworCXU4IG9yaWdpbjsKIAlpbnQgcmV0OwogCi0Jd2hpbGUgKChldmVudCA9IHBlcmZfZXZsaXN0X19tbWFwX3JlYWQodG9wLmV2bGlzdCwgaWR4KSkgIT0gTlVMTCkgewotCQlyZXQgPSBwZXJmX3Nlc3Npb25fX3BhcnNlX3NhbXBsZShzZWxmLCBldmVudCwgJnNhbXBsZSk7CisJd2hpbGUgKChldmVudCA9IHBlcmZfZXZsaXN0X19tbWFwX3JlYWQodG9wLT5ldmxpc3QsIGlkeCkpICE9IE5VTEwpIHsKKwkJcmV0ID0gcGVyZl9zZXNzaW9uX19wYXJzZV9zYW1wbGUoc2Vzc2lvbiwgZXZlbnQsICZzYW1wbGUpOwogCQlpZiAocmV0KSB7CiAJCQlwcl9lcnIoIkNhbid0IHBhcnNlIHNhbXBsZSwgZXJyID0gJWRcbiIsIHJldCk7CiAJCQljb250aW51ZTsKIAkJfQogCi0JCWV2c2VsID0gcGVyZl9ldmxpc3RfX2lkMmV2c2VsKHNlbGYtPmV2bGlzdCwgc2FtcGxlLmlkKTsKKwkJZXZzZWwgPSBwZXJmX2V2bGlzdF9faWQyZXZzZWwoc2Vzc2lvbi0+ZXZsaXN0LCBzYW1wbGUuaWQpOwogCQlhc3NlcnQoZXZzZWwgIT0gTlVMTCk7CiAKKwkJb3JpZ2luID0gZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9SRUNPUkRfTUlTQ19DUFVNT0RFX01BU0s7CisKIAkJaWYgKGV2ZW50LT5oZWFkZXIudHlwZSA9PSBQRVJGX1JFQ09SRF9TQU1QTEUpCi0JCQlwZXJmX2V2ZW50X19wcm9jZXNzX3NhbXBsZShldmVudCwgZXZzZWwsICZzYW1wbGUsIHNlbGYpOwotCQllbHNlIGlmIChldmVudC0+aGVhZGVyLnR5cGUgPCBQRVJGX1JFQ09SRF9NQVgpIHsKKwkJCSsrdG9wLT5zYW1wbGVzOworCisJCXN3aXRjaCAob3JpZ2luKSB7CisJCWNhc2UgUEVSRl9SRUNPUkRfTUlTQ19VU0VSOgorCQkJKyt0b3AtPnVzX3NhbXBsZXM7CisJCQlpZiAodG9wLT5oaWRlX3VzZXJfc3ltYm9scykKKwkJCQljb250aW51ZTsKKwkJCW1hY2hpbmUgPSBwZXJmX3Nlc3Npb25fX2ZpbmRfaG9zdF9tYWNoaW5lKHNlc3Npb24pOworCQkJYnJlYWs7CisJCWNhc2UgUEVSRl9SRUNPUkRfTUlTQ19LRVJORUw6CisJCQkrK3RvcC0+a2VybmVsX3NhbXBsZXM7CisJCQlpZiAodG9wLT5oaWRlX2tlcm5lbF9zeW1ib2xzKQorCQkJCWNvbnRpbnVlOworCQkJbWFjaGluZSA9IHBlcmZfc2Vzc2lvbl9fZmluZF9ob3N0X21hY2hpbmUoc2Vzc2lvbik7CisJCQlicmVhazsKKwkJY2FzZSBQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX0tFUk5FTDoKKwkJCSsrdG9wLT5ndWVzdF9rZXJuZWxfc2FtcGxlczsKKwkJCW1hY2hpbmUgPSBwZXJmX3Nlc3Npb25fX2ZpbmRfbWFjaGluZShzZXNzaW9uLCBldmVudC0+aXAucGlkKTsKKwkJCWJyZWFrOworCQljYXNlIFBFUkZfUkVDT1JEX01JU0NfR1VFU1RfVVNFUjoKKwkJCSsrdG9wLT5ndWVzdF91c19zYW1wbGVzOworCQkJLyoKKwkJCSAqIFRPRE86IHdlIGRvbid0IHByb2Nlc3MgZ3Vlc3QgdXNlciBmcm9tIGhvc3Qgc2lkZQorCQkJICogZXhjZXB0IHNpbXBsZSBjb3VudGluZy4KKwkJCSAqLworCQkJLyogRmFsbCB0aHJ1ICovCisJCWRlZmF1bHQ6CisJCQljb250aW51ZTsKKwkJfQorCisKKwkJaWYgKGV2ZW50LT5oZWFkZXIudHlwZSA9PSBQRVJGX1JFQ09SRF9TQU1QTEUpIHsKKwkJCXBlcmZfZXZlbnRfX3Byb2Nlc3Nfc2FtcGxlKCZ0b3AtPnRvb2wsIGV2ZW50LCBldnNlbCwKKwkJCQkJCSAgICZzYW1wbGUsIG1hY2hpbmUpOworCQl9IGVsc2UgaWYgKGV2ZW50LT5oZWFkZXIudHlwZSA8IFBFUkZfUkVDT1JEX01BWCkgewogCQkJaGlzdHNfX2luY19ucl9ldmVudHMoJmV2c2VsLT5oaXN0cywgZXZlbnQtPmhlYWRlci50eXBlKTsKLQkJCXBlcmZfZXZlbnRfX3Byb2Nlc3MoZXZlbnQsICZzYW1wbGUsIHNlbGYpOworCQkJcGVyZl9ldmVudF9fcHJvY2VzcygmdG9wLT50b29sLCBldmVudCwgJnNhbXBsZSwgbWFjaGluZSk7CiAJCX0gZWxzZQotCQkJKytzZWxmLT5oaXN0cy5zdGF0cy5ucl91bmtub3duX2V2ZW50czsKKwkJCSsrc2Vzc2lvbi0+aGlzdHMuc3RhdHMubnJfdW5rbm93bl9ldmVudHM7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBwZXJmX3Nlc3Npb25fX21tYXBfcmVhZChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmKQorc3RhdGljIHZvaWQgcGVyZl90b3BfX21tYXBfcmVhZChzdHJ1Y3QgcGVyZl90b3AgKnRvcCkKIHsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCB0b3AuZXZsaXN0LT5ucl9tbWFwczsgaSsrKQotCQlwZXJmX3Nlc3Npb25fX21tYXBfcmVhZF9pZHgoc2VsZiwgaSk7CisJZm9yIChpID0gMDsgaSA8IHRvcC0+ZXZsaXN0LT5ucl9tbWFwczsgaSsrKQorCQlwZXJmX3RvcF9fbW1hcF9yZWFkX2lkeCh0b3AsIGkpOwogfQogCi1zdGF0aWMgdm9pZCBzdGFydF9jb3VudGVycyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK3N0YXRpYyB2b2lkIHBlcmZfdG9wX19zdGFydF9jb3VudGVycyhzdHJ1Y3QgcGVyZl90b3AgKnRvcCkKIHsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqY291bnRlciwgKmZpcnN0OworCXN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0ID0gdG9wLT5ldmxpc3Q7CiAKIAlmaXJzdCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKIApAQCAtODQ5LDE1ICs4MjksMTUgQEAKIAkJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciA9ICZjb3VudGVyLT5hdHRyOwogCQlzdHJ1Y3QgeHlhcnJheSAqZ3JvdXBfZmQgPSBOVUxMOwogCi0JCWlmIChncm91cCAmJiBjb3VudGVyICE9IGZpcnN0KQorCQlpZiAodG9wLT5ncm91cCAmJiBjb3VudGVyICE9IGZpcnN0KQogCQkJZ3JvdXBfZmQgPSBmaXJzdC0+ZmQ7CiAKIAkJYXR0ci0+c2FtcGxlX3R5cGUgPSBQRVJGX1NBTVBMRV9JUCB8IFBFUkZfU0FNUExFX1RJRDsKIAotCQlpZiAodG9wLmZyZXEpIHsKKwkJaWYgKHRvcC0+ZnJlcSkgewogCQkJYXR0ci0+c2FtcGxlX3R5cGUgfD0gUEVSRl9TQU1QTEVfUEVSSU9EOwogCQkJYXR0ci0+ZnJlcQkgID0gMTsKLQkJCWF0dHItPnNhbXBsZV9mcmVxID0gdG9wLmZyZXE7CisJCQlhdHRyLT5zYW1wbGVfZnJlcSA9IHRvcC0+ZnJlcTsKIAkJfQogCiAJCWlmIChldmxpc3QtPm5yX2VudHJpZXMgPiAxKSB7CkBAIC04NzAsMjMgKzg1MCwyMyBAQAogCiAJCWF0dHItPm1tYXAgPSAxOwogCQlhdHRyLT5jb21tID0gMTsKLQkJYXR0ci0+aW5oZXJpdCA9IGluaGVyaXQ7CisJCWF0dHItPmluaGVyaXQgPSB0b3AtPmluaGVyaXQ7CiByZXRyeV9zYW1wbGVfaWQ6Ci0JCWF0dHItPnNhbXBsZV9pZF9hbGwgPSBzYW1wbGVfaWRfYWxsX2F2YWlsID8gMSA6IDA7CisJCWF0dHItPnNhbXBsZV9pZF9hbGwgPSB0b3AtPnNhbXBsZV9pZF9hbGxfYXZhaWwgPyAxIDogMDsKIHRyeV9hZ2FpbjoKLQkJaWYgKHBlcmZfZXZzZWxfX29wZW4oY291bnRlciwgdG9wLmV2bGlzdC0+Y3B1cywKLQkJCQkgICAgIHRvcC5ldmxpc3QtPnRocmVhZHMsIGdyb3VwLAorCQlpZiAocGVyZl9ldnNlbF9fb3Blbihjb3VudGVyLCB0b3AtPmV2bGlzdC0+Y3B1cywKKwkJCQkgICAgIHRvcC0+ZXZsaXN0LT50aHJlYWRzLCB0b3AtPmdyb3VwLAogCQkJCSAgICAgZ3JvdXBfZmQpIDwgMCkgewogCQkJaW50IGVyciA9IGVycm5vOwogCiAJCQlpZiAoZXJyID09IEVQRVJNIHx8IGVyciA9PSBFQUNDRVMpIHsKIAkJCQl1aV9fZXJyb3JfcGFyYW5vaWQoKTsKIAkJCQlnb3RvIG91dF9lcnI7Ci0JCQl9IGVsc2UgaWYgKGVyciA9PSBFSU5WQUwgJiYgc2FtcGxlX2lkX2FsbF9hdmFpbCkgeworCQkJfSBlbHNlIGlmIChlcnIgPT0gRUlOVkFMICYmIHRvcC0+c2FtcGxlX2lkX2FsbF9hdmFpbCkgewogCQkJCS8qCiAJCQkJICogT2xkIGtlcm5lbCwgbm8gYXR0ci0+c2FtcGxlX2lkX3R5cGVfYWxsIGZpZWxkCiAJCQkJICovCi0JCQkJc2FtcGxlX2lkX2FsbF9hdmFpbCA9IGZhbHNlOworCQkJCXRvcC0+c2FtcGxlX2lkX2FsbF9hdmFpbCA9IGZhbHNlOwogCQkJCWdvdG8gcmV0cnlfc2FtcGxlX2lkOwogCQkJfQogCQkJLyoKQEAgLTkyMCw3ICs5MDAsNyBAQAogCQl9CiAJfQogCi0JaWYgKHBlcmZfZXZsaXN0X19tbWFwKGV2bGlzdCwgbW1hcF9wYWdlcywgZmFsc2UpIDwgMCkgeworCWlmIChwZXJmX2V2bGlzdF9fbW1hcChldmxpc3QsIHRvcC0+bW1hcF9wYWdlcywgZmFsc2UpIDwgMCkgewogCQl1aV9fd2FybmluZygiRmFpbGVkIHRvIG1tYXAgd2l0aCAlZCAoJXMpXG4iLAogCQkJICAgIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwogCQlnb3RvIG91dF9lcnI7CkBAIC05MzMsMTQgKzkxMywxNCBAQAogCWV4aXQoMCk7CiB9CiAKLXN0YXRpYyBpbnQgc2V0dXBfc2FtcGxlX3R5cGUodm9pZCkKK3N0YXRpYyBpbnQgcGVyZl90b3BfX3NldHVwX3NhbXBsZV90eXBlKHN0cnVjdCBwZXJmX3RvcCAqdG9wKQogewotCWlmICghc29ydF9oYXNfc3ltYm9scykgeworCWlmICghdG9wLT5zb3J0X2hhc19zeW1ib2xzKSB7CiAJCWlmIChzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluKSB7CiAJCQl1aV9fd2FybmluZygiU2VsZWN0ZWQgLWcgYnV0IFwic3ltXCIgbm90IHByZXNlbnQgaW4gLS1zb3J0Ly1zLiIpOwogCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KLQl9IGVsc2UgaWYgKCFkb250X3VzZV9jYWxsY2hhaW5zICYmIGNhbGxjaGFpbl9wYXJhbS5tb2RlICE9IENIQUlOX05PTkUpIHsKKwl9IGVsc2UgaWYgKCF0b3AtPmRvbnRfdXNlX2NhbGxjaGFpbnMgJiYgY2FsbGNoYWluX3BhcmFtLm1vZGUgIT0gQ0hBSU5fTk9ORSkgewogCQlpZiAoY2FsbGNoYWluX3JlZ2lzdGVyX3BhcmFtKCZjYWxsY2hhaW5fcGFyYW0pIDwgMCkgewogCQkJdWlfX3dhcm5pbmcoIkNhbid0IHJlZ2lzdGVyIGNhbGxjaGFpbiBwYXJhbXMuXG4iKTsKIAkJCXJldHVybiAtRUlOVkFMOwpAQCAtOTUwLDcgKzkzMCw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgX19jbWRfdG9wKHZvaWQpCitzdGF0aWMgaW50IF9fY21kX3RvcChzdHJ1Y3QgcGVyZl90b3AgKnRvcCkKIHsKIAlwdGhyZWFkX3QgdGhyZWFkOwogCWludCByZXQ7CkBAIC05NTgsMzkgKzkzOCw0MCBAQAogCSAqIEZJWE1FOiBwZXJmX3Nlc3Npb25fX25ldyBzaG91bGQgYWxsb3cgcGFzc2luZyBhIE9fTU1BUCwgc28gdGhhdCBhbGwgdGhpcwogCSAqIG1tYXAgcmVhZGluZywgZXRjIGlzIGVuY2Fwc3VsYXRlZCBpbiBpdC4gVXNlIE9fV1JPTkxZIGZvciBub3cuCiAJICovCi0JdG9wLnNlc3Npb24gPSBwZXJmX3Nlc3Npb25fX25ldyhOVUxMLCBPX1dST05MWSwgZmFsc2UsIGZhbHNlLCBOVUxMKTsKLQlpZiAodG9wLnNlc3Npb24gPT0gTlVMTCkKKwl0b3AtPnNlc3Npb24gPSBwZXJmX3Nlc3Npb25fX25ldyhOVUxMLCBPX1dST05MWSwgZmFsc2UsIGZhbHNlLCBOVUxMKTsKKwlpZiAodG9wLT5zZXNzaW9uID09IE5VTEwpCiAJCXJldHVybiAtRU5PTUVNOwogCi0JcmV0ID0gc2V0dXBfc2FtcGxlX3R5cGUoKTsKKwlyZXQgPSBwZXJmX3RvcF9fc2V0dXBfc2FtcGxlX3R5cGUodG9wKTsKIAlpZiAocmV0KQogCQlnb3RvIG91dF9kZWxldGU7CiAKLQlpZiAodG9wLnRhcmdldF90aWQgIT0gLTEpCi0JCXBlcmZfZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkX21hcCh0b3AuZXZsaXN0LT50aHJlYWRzLAotCQkJCQkJICBwZXJmX2V2ZW50X19wcm9jZXNzLCB0b3Auc2Vzc2lvbik7CisJaWYgKHRvcC0+dGFyZ2V0X3RpZCAhPSAtMSkKKwkJcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRfbWFwKCZ0b3AtPnRvb2wsIHRvcC0+ZXZsaXN0LT50aHJlYWRzLAorCQkJCQkJICBwZXJmX2V2ZW50X19wcm9jZXNzLAorCQkJCQkJICAmdG9wLT5zZXNzaW9uLT5ob3N0X21hY2hpbmUpOwogCWVsc2UKLQkJcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRzKHBlcmZfZXZlbnRfX3Byb2Nlc3MsIHRvcC5zZXNzaW9uKTsKLQotCXN0YXJ0X2NvdW50ZXJzKHRvcC5ldmxpc3QpOwotCXRvcC5zZXNzaW9uLT5ldmxpc3QgPSB0b3AuZXZsaXN0OwotCXBlcmZfc2Vzc2lvbl9fdXBkYXRlX3NhbXBsZV90eXBlKHRvcC5zZXNzaW9uKTsKKwkJcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRzKCZ0b3AtPnRvb2wsIHBlcmZfZXZlbnRfX3Byb2Nlc3MsCisJCQkJCSAgICAgICAmdG9wLT5zZXNzaW9uLT5ob3N0X21hY2hpbmUpOworCXBlcmZfdG9wX19zdGFydF9jb3VudGVycyh0b3ApOworCXRvcC0+c2Vzc2lvbi0+ZXZsaXN0ID0gdG9wLT5ldmxpc3Q7CisJcGVyZl9zZXNzaW9uX191cGRhdGVfc2FtcGxlX3R5cGUodG9wLT5zZXNzaW9uKTsKIAogCS8qIFdhaXQgZm9yIGEgbWluaW1hbCBzZXQgb2YgZXZlbnRzIGJlZm9yZSBzdGFydGluZyB0aGUgc25hcHNob3QgKi8KLQlwb2xsKHRvcC5ldmxpc3QtPnBvbGxmZCwgdG9wLmV2bGlzdC0+bnJfZmRzLCAxMDApOworCXBvbGwodG9wLT5ldmxpc3QtPnBvbGxmZCwgdG9wLT5ldmxpc3QtPm5yX2ZkcywgMTAwKTsKIAotCXBlcmZfc2Vzc2lvbl9fbW1hcF9yZWFkKHRvcC5zZXNzaW9uKTsKKwlwZXJmX3RvcF9fbW1hcF9yZWFkKHRvcCk7CiAKIAlpZiAocHRocmVhZF9jcmVhdGUoJnRocmVhZCwgTlVMTCwgKHVzZV9icm93c2VyID4gMCA/IGRpc3BsYXlfdGhyZWFkX3R1aSA6Ci0JCQkJCQkJICAgICBkaXNwbGF5X3RocmVhZCksIE5VTEwpKSB7CisJCQkJCQkJICAgIGRpc3BsYXlfdGhyZWFkKSwgdG9wKSkgewogCQlwcmludGYoIkNvdWxkIG5vdCBjcmVhdGUgZGlzcGxheSB0aHJlYWQuXG4iKTsKIAkJZXhpdCgtMSk7CiAJfQogCi0JaWYgKHJlYWx0aW1lX3ByaW8pIHsKKwlpZiAodG9wLT5yZWFsdGltZV9wcmlvKSB7CiAJCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKIAotCQlwYXJhbS5zY2hlZF9wcmlvcml0eSA9IHJlYWx0aW1lX3ByaW87CisJCXBhcmFtLnNjaGVkX3ByaW9yaXR5ID0gdG9wLT5yZWFsdGltZV9wcmlvOwogCQlpZiAoc2NoZWRfc2V0c2NoZWR1bGVyKDAsIFNDSEVEX0ZJRk8sICZwYXJhbSkpIHsKIAkJCXByaW50ZigiQ291bGQgbm90IHNldCByZWFsdGltZSBwcmlvcml0eS5cbiIpOwogCQkJZXhpdCgtMSk7CkBAIC05OTgsMjUgKzk3OSwyNSBAQAogCX0KIAogCXdoaWxlICgxKSB7Ci0JCXU2NCBoaXRzID0gdG9wLnNhbXBsZXM7CisJCXU2NCBoaXRzID0gdG9wLT5zYW1wbGVzOwogCi0JCXBlcmZfc2Vzc2lvbl9fbW1hcF9yZWFkKHRvcC5zZXNzaW9uKTsKKwkJcGVyZl90b3BfX21tYXBfcmVhZCh0b3ApOwogCi0JCWlmIChoaXRzID09IHRvcC5zYW1wbGVzKQotCQkJcmV0ID0gcG9sbCh0b3AuZXZsaXN0LT5wb2xsZmQsIHRvcC5ldmxpc3QtPm5yX2ZkcywgMTAwKTsKKwkJaWYgKGhpdHMgPT0gdG9wLT5zYW1wbGVzKQorCQkJcmV0ID0gcG9sbCh0b3AtPmV2bGlzdC0+cG9sbGZkLCB0b3AtPmV2bGlzdC0+bnJfZmRzLCAxMDApOwogCX0KIAogb3V0X2RlbGV0ZToKLQlwZXJmX3Nlc3Npb25fX2RlbGV0ZSh0b3Auc2Vzc2lvbik7Ci0JdG9wLnNlc3Npb24gPSBOVUxMOworCXBlcmZfc2Vzc2lvbl9fZGVsZXRlKHRvcC0+c2Vzc2lvbik7CisJdG9wLT5zZXNzaW9uID0gTlVMTDsKIAogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50Ci1wYXJzZV9jYWxsY2hhaW5fb3B0KGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdCBfX3VzZWQsIGNvbnN0IGNoYXIgKmFyZywKLQkJICAgIGludCB1bnNldCkKK3BhcnNlX2NhbGxjaGFpbl9vcHQoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LCBjb25zdCBjaGFyICphcmcsIGludCB1bnNldCkKIHsKKwlzdHJ1Y3QgcGVyZl90b3AgKnRvcCA9IChzdHJ1Y3QgcGVyZl90b3AgKilvcHQtPnZhbHVlOwogCWNoYXIgKnRvaywgKnRvazI7CiAJY2hhciAqZW5kcHRyOwogCkBAIC0xMDI0LDcgKzEwMDUsNyBAQAogCSAqIC0tbm8tY2FsbC1ncmFwaAogCSAqLwogCWlmICh1bnNldCkgewotCQlkb250X3VzZV9jYWxsY2hhaW5zID0gdHJ1ZTsKKwkJdG9wLT5kb250X3VzZV9jYWxsY2hhaW5zID0gdHJ1ZTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0xMDUyLDkgKzEwMzMsNyBAQAogCQlzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluID0gZmFsc2U7CiAKIAkJcmV0dXJuIDA7Ci0JfQotCi0JZWxzZQorCX0gZWxzZQogCQlyZXR1cm4gLTE7CiAKIAkvKiBnZXQgdGhlIG1pbiBwZXJjZW50YWdlICovCkBAIC0xMDk4LDE3ICsxMDc3LDMyIEBACiAJTlVMTAogfTsKIAotc3RhdGljIGNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0geworaW50IGNtZF90b3AoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXggX191c2VkKQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpwb3M7CisJaW50IHN0YXR1cyA9IC1FTk9NRU07CisJc3RydWN0IHBlcmZfdG9wIHRvcCA9IHsKKwkJLmNvdW50X2ZpbHRlcgkgICAgID0gNSwKKwkJLmRlbGF5X3NlY3MJICAgICA9IDIsCisJCS50YXJnZXRfcGlkCSAgICAgPSAtMSwKKwkJLnRhcmdldF90aWQJICAgICA9IC0xLAorCQkuZnJlcQkJICAgICA9IDEwMDAsIC8qIDEgS0h6ICovCisJCS5zYW1wbGVfaWRfYWxsX2F2YWlsID0gdHJ1ZSwKKwkJLm1tYXBfcGFnZXMJICAgICA9IDEyOCwKKwkJLnN5bV9wY250X2ZpbHRlciAgICAgPSA1LAorCX07CisJY2hhciBjYWxsY2hhaW5fZGVmYXVsdF9vcHRbXSA9ICJmcmFjdGFsLDAuNSxjYWxsZWUiOworCWNvbnN0IHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0gewogCU9QVF9DQUxMQkFDSygnZScsICJldmVudCIsICZ0b3AuZXZsaXN0LCAiZXZlbnQiLAogCQkgICAgICJldmVudCBzZWxlY3Rvci4gdXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYXZhaWxhYmxlIGV2ZW50cyIsCiAJCSAgICAgcGFyc2VfZXZlbnRzX29wdGlvbiksCi0JT1BUX0lOVEVHRVIoJ2MnLCAiY291bnQiLCAmZGVmYXVsdF9pbnRlcnZhbCwKKwlPUFRfSU5URUdFUignYycsICJjb3VudCIsICZ0b3AuZGVmYXVsdF9pbnRlcnZhbCwKIAkJICAgICJldmVudCBwZXJpb2QgdG8gc2FtcGxlIiksCiAJT1BUX0lOVEVHRVIoJ3AnLCAicGlkIiwgJnRvcC50YXJnZXRfcGlkLAogCQkgICAgInByb2ZpbGUgZXZlbnRzIG9uIGV4aXN0aW5nIHByb2Nlc3MgaWQiKSwKIAlPUFRfSU5URUdFUigndCcsICJ0aWQiLCAmdG9wLnRhcmdldF90aWQsCiAJCSAgICAicHJvZmlsZSBldmVudHMgb24gZXhpc3RpbmcgdGhyZWFkIGlkIiksCi0JT1BUX0JPT0xFQU4oJ2EnLCAiYWxsLWNwdXMiLCAmc3lzdGVtX3dpZGUsCisJT1BUX0JPT0xFQU4oJ2EnLCAiYWxsLWNwdXMiLCAmdG9wLnN5c3RlbV93aWRlLAogCQkJICAgICJzeXN0ZW0td2lkZSBjb2xsZWN0aW9uIGZyb20gYWxsIENQVXMiKSwKIAlPUFRfU1RSSU5HKCdDJywgImNwdSIsICZ0b3AuY3B1X2xpc3QsICJjcHUiLAogCQkgICAgImxpc3Qgb2YgY3B1cyB0byBtb25pdG9yIiksCkBAIC0xMTE2LDIwICsxMTEwLDIwIEBACiAJCSAgICJmaWxlIiwgInZtbGludXggcGF0aG5hbWUiKSwKIAlPUFRfQk9PTEVBTignSycsICJoaWRlX2tlcm5lbF9zeW1ib2xzIiwgJnRvcC5oaWRlX2tlcm5lbF9zeW1ib2xzLAogCQkgICAgImhpZGUga2VybmVsIHN5bWJvbHMiKSwKLQlPUFRfVUlOVEVHRVIoJ20nLCAibW1hcC1wYWdlcyIsICZtbWFwX3BhZ2VzLCAibnVtYmVyIG9mIG1tYXAgZGF0YSBwYWdlcyIpLAotCU9QVF9JTlRFR0VSKCdyJywgInJlYWx0aW1lIiwgJnJlYWx0aW1lX3ByaW8sCisJT1BUX1VJTlRFR0VSKCdtJywgIm1tYXAtcGFnZXMiLCAmdG9wLm1tYXBfcGFnZXMsICJudW1iZXIgb2YgbW1hcCBkYXRhIHBhZ2VzIiksCisJT1BUX0lOVEVHRVIoJ3InLCAicmVhbHRpbWUiLCAmdG9wLnJlYWx0aW1lX3ByaW8sCiAJCSAgICAiY29sbGVjdCBkYXRhIHdpdGggdGhpcyBSVCBTQ0hFRF9GSUZPIHByaW9yaXR5IiksCiAJT1BUX0lOVEVHRVIoJ2QnLCAiZGVsYXkiLCAmdG9wLmRlbGF5X3NlY3MsCiAJCSAgICAibnVtYmVyIG9mIHNlY29uZHMgdG8gZGVsYXkgYmV0d2VlbiByZWZyZXNoZXMiKSwKLQlPUFRfQk9PTEVBTignRCcsICJkdW1wLXN5bXRhYiIsICZkdW1wX3N5bXRhYiwKKwlPUFRfQk9PTEVBTignRCcsICJkdW1wLXN5bXRhYiIsICZ0b3AuZHVtcF9zeW10YWIsCiAJCQkgICAgImR1bXAgdGhlIHN5bWJvbCB0YWJsZSB1c2VkIGZvciBwcm9maWxpbmciKSwKIAlPUFRfSU5URUdFUignZicsICJjb3VudC1maWx0ZXIiLCAmdG9wLmNvdW50X2ZpbHRlciwKIAkJICAgICJvbmx5IGRpc3BsYXkgZnVuY3Rpb25zIHdpdGggbW9yZSBldmVudHMgdGhhbiB0aGlzIiksCi0JT1BUX0JPT0xFQU4oJ2cnLCAiZ3JvdXAiLCAmZ3JvdXAsCisJT1BUX0JPT0xFQU4oJ2cnLCAiZ3JvdXAiLCAmdG9wLmdyb3VwLAogCQkJICAgICJwdXQgdGhlIGNvdW50ZXJzIGludG8gYSBjb3VudGVyIGdyb3VwIiksCi0JT1BUX0JPT0xFQU4oJ2knLCAiaW5oZXJpdCIsICZpbmhlcml0LAorCU9QVF9CT09MRUFOKCdpJywgImluaGVyaXQiLCAmdG9wLmluaGVyaXQsCiAJCSAgICAiY2hpbGQgdGFza3MgaW5oZXJpdCBjb3VudGVycyIpLAotCU9QVF9TVFJJTkcoMCwgInN5bS1hbm5vdGF0ZSIsICZzeW1fZmlsdGVyLCAic3ltYm9sIG5hbWUiLAorCU9QVF9TVFJJTkcoMCwgInN5bS1hbm5vdGF0ZSIsICZ0b3Auc3ltX2ZpbHRlciwgInN5bWJvbCBuYW1lIiwKIAkJICAgICJzeW1ib2wgdG8gYW5ub3RhdGUiKSwKIAlPUFRfQk9PTEVBTigneicsICJ6ZXJvIiwgJnRvcC56ZXJvLAogCQkgICAgInplcm8gaGlzdG9yeSBhY3Jvc3MgdXBkYXRlcyIpLApAQCAtMTEzOSwxNSArMTEzMywxNSBAQAogCQkgICAgImRpc3BsYXkgdGhpcyBtYW55IGZ1bmN0aW9ucyIpLAogCU9QVF9CT09MRUFOKCdVJywgImhpZGVfdXNlcl9zeW1ib2xzIiwgJnRvcC5oaWRlX3VzZXJfc3ltYm9scywKIAkJICAgICJoaWRlIHVzZXIgc3ltYm9scyIpLAotCU9QVF9CT09MRUFOKDAsICJ0dWkiLCAmdXNlX3R1aSwgIlVzZSB0aGUgVFVJIGludGVyZmFjZSIpLAotCU9QVF9CT09MRUFOKDAsICJzdGRpbyIsICZ1c2Vfc3RkaW8sICJVc2UgdGhlIHN0ZGlvIGludGVyZmFjZSIpLAorCU9QVF9CT09MRUFOKDAsICJ0dWkiLCAmdG9wLnVzZV90dWksICJVc2UgdGhlIFRVSSBpbnRlcmZhY2UiKSwKKwlPUFRfQk9PTEVBTigwLCAic3RkaW8iLCAmdG9wLnVzZV9zdGRpbywgIlVzZSB0aGUgc3RkaW8gaW50ZXJmYWNlIiksCiAJT1BUX0lOQ1IoJ3YnLCAidmVyYm9zZSIsICZ2ZXJib3NlLAogCQkgICAgImJlIG1vcmUgdmVyYm9zZSAoc2hvdyBjb3VudGVyIG9wZW4gZXJyb3JzLCBldGMpIiksCiAJT1BUX1NUUklORygncycsICJzb3J0IiwgJnNvcnRfb3JkZXIsICJrZXlbLGtleTIuLi5dIiwKIAkJICAgInNvcnQgYnkga2V5KHMpOiBwaWQsIGNvbW0sIGRzbywgc3ltYm9sLCBwYXJlbnQiKSwKIAlPUFRfQk9PTEVBTignbicsICJzaG93LW5yLXNhbXBsZXMiLCAmc3ltYm9sX2NvbmYuc2hvd19ucl9zYW1wbGVzLAogCQkgICAgIlNob3cgYSBjb2x1bW4gd2l0aCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMiKSwKLQlPUFRfQ0FMTEJBQ0tfREVGQVVMVCgnRycsICJjYWxsLWdyYXBoIiwgTlVMTCwgIm91dHB1dF90eXBlLG1pbl9wZXJjZW50LCBjYWxsX29yZGVyIiwKKwlPUFRfQ0FMTEJBQ0tfREVGQVVMVCgnRycsICJjYWxsLWdyYXBoIiwgJnRvcCwgIm91dHB1dF90eXBlLG1pbl9wZXJjZW50LCBjYWxsX29yZGVyIiwKIAkJICAgICAiRGlzcGxheSBjYWxsY2hhaW5zIHVzaW5nIG91dHB1dF90eXBlIChncmFwaCwgZmxhdCwgZnJhY3RhbCwgb3Igbm9uZSksIG1pbiBwZXJjZW50IHRocmVzaG9sZCBhbmQgY2FsbGNoYWluIG9yZGVyLiAiCiAJCSAgICAgIkRlZmF1bHQ6IGZyYWN0YWwsMC41LGNhbGxlZSIsICZwYXJzZV9jYWxsY2hhaW5fb3B0LAogCQkgICAgIGNhbGxjaGFpbl9kZWZhdWx0X29wdCksCkBAIC0xMTY2LDEyICsxMTYwLDcgQEAKIAlPUFRfU1RSSU5HKCdNJywgImRpc2Fzc2VtYmxlci1zdHlsZSIsICZkaXNhc3NlbWJsZXJfc3R5bGUsICJkaXNhc3NlbWJsZXIgc3R5bGUiLAogCQkgICAiU3BlY2lmeSBkaXNhc3NlbWJsZXIgc3R5bGUgKGUuZy4gLU0gaW50ZWwgZm9yIGludGVsIHN5bnRheCkiKSwKIAlPUFRfRU5EKCkKLX07Ci0KLWludCBjbWRfdG9wKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4IF9fdXNlZCkKLXsKLQlzdHJ1Y3QgcGVyZl9ldnNlbCAqcG9zOwotCWludCBzdGF0dXMgPSAtRU5PTUVNOworCX07CiAKIAl0b3AuZXZsaXN0ID0gcGVyZl9ldmxpc3RfX25ldyhOVUxMLCBOVUxMKTsKIAlpZiAodG9wLmV2bGlzdCA9PSBOVUxMKQpAQCAtMTE4OCw5ICsxMTc3LDkgQEAKIAogCXNldHVwX3NvcnRpbmcodG9wX3VzYWdlLCBvcHRpb25zKTsKIAotCWlmICh1c2Vfc3RkaW8pCisJaWYgKHRvcC51c2Vfc3RkaW8pCiAJCXVzZV9icm93c2VyID0gMDsKLQllbHNlIGlmICh1c2VfdHVpKQorCWVsc2UgaWYgKHRvcC51c2VfdHVpKQogCQl1c2VfYnJvd3NlciA9IDE7CiAKIAlzZXR1cF9icm93c2VyKGZhbHNlKTsKQEAgLTEyMTUsMzggKzEyMDQsMzEgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCisJc3ltYm9sX2NvbmYubnJfZXZlbnRzID0gdG9wLmV2bGlzdC0+bnJfZW50cmllczsKKwogCWlmICh0b3AuZGVsYXlfc2VjcyA8IDEpCiAJCXRvcC5kZWxheV9zZWNzID0gMTsKIAogCS8qCiAJICogVXNlciBzcGVjaWZpZWQgY291bnQgb3ZlcnJpZGVzIGRlZmF1bHQgZnJlcXVlbmN5LgogCSAqLwotCWlmIChkZWZhdWx0X2ludGVydmFsKQorCWlmICh0b3AuZGVmYXVsdF9pbnRlcnZhbCkKIAkJdG9wLmZyZXEgPSAwOwogCWVsc2UgaWYgKHRvcC5mcmVxKSB7Ci0JCWRlZmF1bHRfaW50ZXJ2YWwgPSB0b3AuZnJlcTsKKwkJdG9wLmRlZmF1bHRfaW50ZXJ2YWwgPSB0b3AuZnJlcTsKIAl9IGVsc2UgewogCQlmcHJpbnRmKHN0ZGVyciwgImZyZXF1ZW5jeSBhbmQgY291bnQgYXJlIHplcm8sIGFib3J0aW5nXG4iKTsKIAkJZXhpdChFWElUX0ZBSUxVUkUpOwogCX0KIAogCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmdG9wLmV2bGlzdC0+ZW50cmllcywgbm9kZSkgewotCQlpZiAocGVyZl9ldnNlbF9fYWxsb2NfZmQocG9zLCB0b3AuZXZsaXN0LT5jcHVzLT5uciwKLQkJCQkJIHRvcC5ldmxpc3QtPnRocmVhZHMtPm5yKSA8IDApCi0JCQlnb3RvIG91dF9mcmVlX2ZkOwogCQkvKgogCQkgKiBGaWxsIGluIHRoZSBvbmVzIG5vdCBzcGVjaWZpY2FsbHkgaW5pdGlhbGl6ZWQgdmlhIC1jOgogCQkgKi8KLQkJaWYgKHBvcy0+YXR0ci5zYW1wbGVfcGVyaW9kKQotCQkJY29udGludWU7Ci0KLQkJcG9zLT5hdHRyLnNhbXBsZV9wZXJpb2QgPSBkZWZhdWx0X2ludGVydmFsOworCQlpZiAoIXBvcy0+YXR0ci5zYW1wbGVfcGVyaW9kKQorCQkJcG9zLT5hdHRyLnNhbXBsZV9wZXJpb2QgPSB0b3AuZGVmYXVsdF9pbnRlcnZhbDsKIAl9CiAKLQlpZiAocGVyZl9ldmxpc3RfX2FsbG9jX3BvbGxmZCh0b3AuZXZsaXN0KSA8IDAgfHwKLQkgICAgcGVyZl9ldmxpc3RfX2FsbG9jX21tYXAodG9wLmV2bGlzdCkgPCAwKQotCQlnb3RvIG91dF9mcmVlX2ZkOwotCiAJdG9wLnN5bV9ldnNlbCA9IGxpc3RfZW50cnkodG9wLmV2bGlzdC0+ZW50cmllcy5uZXh0LCBzdHJ1Y3QgcGVyZl9ldnNlbCwgbm9kZSk7CiAKIAlzeW1ib2xfY29uZi5wcml2X3NpemUgPSBzaXplb2Yoc3RydWN0IGFubm90YXRpb24pOwpAQCAtMTI2MywxNiArMTI0NSwyMCBAQAogCSAqIEF2b2lkIGFubm90YXRpb24gZGF0YSBzdHJ1Y3R1cmVzIG92ZXJoZWFkIHdoZW4gc3ltYm9scyBhcmVuJ3Qgb24gdGhlCiAJICogc29ydCBsaXN0LgogCSAqLwotCXNvcnRfaGFzX3N5bWJvbHMgPSBzb3J0X3N5bS5saXN0Lm5leHQgIT0gTlVMTDsKKwl0b3Auc29ydF9oYXNfc3ltYm9scyA9IHNvcnRfc3ltLmxpc3QubmV4dCAhPSBOVUxMOwogCi0JZ2V0X3Rlcm1fZGltZW5zaW9ucygmd2luc2l6ZSk7CisJZ2V0X3Rlcm1fZGltZW5zaW9ucygmdG9wLndpbnNpemUpOwogCWlmICh0b3AucHJpbnRfZW50cmllcyA9PSAwKSB7Ci0JCXVwZGF0ZV9wcmludF9lbnRyaWVzKCZ3aW5zaXplKTsKLQkJc2lnbmFsKFNJR1dJTkNILCBzaWdfd2luY2hfaGFuZGxlcik7CisJCXN0cnVjdCBzaWdhY3Rpb24gYWN0ID0geworCQkJLnNhX3NpZ2FjdGlvbiA9IHBlcmZfdG9wX19zaWdfd2luY2gsCisJCQkuc2FfZmxhZ3MgICAgID0gU0FfU0lHSU5GTywKKwkJfTsKKwkJcGVyZl90b3BfX3VwZGF0ZV9wcmludF9lbnRyaWVzKCZ0b3ApOworCQlzaWdhY3Rpb24oU0lHV0lOQ0gsICZhY3QsIE5VTEwpOwogCX0KIAotCXN0YXR1cyA9IF9fY21kX3RvcCgpOwotb3V0X2ZyZWVfZmQ6CisJc3RhdHVzID0gX19jbWRfdG9wKCZ0b3ApOworCiAJcGVyZl9ldmxpc3RfX2RlbGV0ZSh0b3AuZXZsaXN0KTsKIAogCXJldHVybiBzdGF0dXM7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYuYyBiL3Rvb2xzL3BlcmYvcGVyZi5jCmluZGV4IDczZDBjYWMuLjJiMmUyMjUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvcGVyZi5jCisrKyBiL3Rvb2xzL3BlcmYvcGVyZi5jCkBAIC0yOSw4ICsyOSw2IEBACiAJaW50IHZhbDsKIH07CiAKLXN0YXRpYyBjaGFyIGRlYnVnZnNfbW50cHRbTUFYUEFUSExFTl07Ci0KIHN0YXRpYyBpbnQgcGFnZXJfY29tbWFuZF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqZGF0YSkKIHsKIAlzdHJ1Y3QgcGFnZXJfY29uZmlnICpjID0gZGF0YTsKQEAgLTgxLDE1ICs3OSw2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzZXRfZGVidWdmc19wYXRoKHZvaWQpCi17Ci0JY2hhciAqcGF0aDsKLQotCXBhdGggPSBnZXRlbnYoUEVSRl9ERUJVR0ZTX0VOVklST05NRU5UKTsKLQlzbnByaW50ZihkZWJ1Z2ZzX3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcyIsIHBhdGggPzogZGVidWdmc19tbnRwdCwKLQkJICJ0cmFjaW5nL2V2ZW50cyIpOwotfQotCiBzdGF0aWMgaW50IGhhbmRsZV9vcHRpb25zKGNvbnN0IGNoYXIgKioqYXJndiwgaW50ICphcmdjLCBpbnQgKmVudmNoYW5nZWQpCiB7CiAJaW50IGhhbmRsZWQgPSAwOwpAQCAtMTYxLDE1ICsxNTAsMTQgQEAKIAkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGRpcmVjdG9yeSBnaXZlbiBmb3IgLS1kZWJ1Z2ZzLWRpci5cbiIpOwogCQkJCXVzYWdlKHBlcmZfdXNhZ2Vfc3RyaW5nKTsKIAkJCX0KLQkJCXN0cm5jcHkoZGVidWdmc19tbnRwdCwgKCphcmd2KVsxXSwgTUFYUEFUSExFTik7Ci0JCQlkZWJ1Z2ZzX21udHB0W01BWFBBVEhMRU4gLSAxXSA9ICdcMCc7CisJCQlkZWJ1Z2ZzX3NldF9wYXRoKCgqYXJndilbMV0pOwogCQkJaWYgKGVudmNoYW5nZWQpCiAJCQkJKmVudmNoYW5nZWQgPSAxOwogCQkJKCphcmd2KSsrOwogCQkJKCphcmdjKS0tOwogCQl9IGVsc2UgaWYgKCFwcmVmaXhjbXAoY21kLCBDTURfREVCVUdGU19ESVIpKSB7Ci0JCQlzdHJuY3B5KGRlYnVnZnNfbW50cHQsIGNtZCArIHN0cmxlbihDTURfREVCVUdGU19ESVIpLCBNQVhQQVRITEVOKTsKLQkJCWRlYnVnZnNfbW50cHRbTUFYUEFUSExFTiAtIDFdID0gJ1wwJzsKKwkJCWRlYnVnZnNfc2V0X3BhdGgoY21kICsgc3RybGVuKENNRF9ERUJVR0ZTX0RJUikpOworCQkJZnByaW50ZihzdGRlcnIsICJkaXI6ICVzXG4iLCBkZWJ1Z2ZzX21vdW50cG9pbnQpOwogCQkJaWYgKGVudmNoYW5nZWQpCiAJCQkJKmVudmNoYW5nZWQgPSAxOwogCQl9IGVsc2UgewpAQCAtMjgxLDcgKzI2OSw2IEBACiAJaWYgKHVzZV9wYWdlciA9PSAtMSAmJiBwLT5vcHRpb24gJiBVU0VfUEFHRVIpCiAJCXVzZV9wYWdlciA9IDE7CiAJY29tbWl0X3BhZ2VyX2Nob2ljZSgpOwotCXNldF9kZWJ1Z2ZzX3BhdGgoKTsKIAogCXN0YXR1cyA9IHAtPmZuKGFyZ2MsIGFyZ3YsIHByZWZpeCk7CiAJZXhpdF9icm93c2VyKHN0YXR1cyk7CkBAIC00MTYsMTcgKzQwMyw2IEBACiAJcmV0dXJuIGRvbmVfYWxpYXM7CiB9CiAKLS8qIG1pbmkgL3Byb2MvbW91bnRzIHBhcnNlcjogc2VhcmNoaW5nIGZvciAiXmJsYWggL21vdW50L3BvaW50IGRlYnVnZnMiICovCi1zdGF0aWMgdm9pZCBnZXRfZGVidWdmc19tbnRwdCh2b2lkKQotewotCWNvbnN0IGNoYXIgKnBhdGggPSBkZWJ1Z2ZzX21vdW50KE5VTEwpOwotCi0JaWYgKHBhdGgpCi0JCXN0cm5jcHkoZGVidWdmc19tbnRwdCwgcGF0aCwgc2l6ZW9mKGRlYnVnZnNfbW50cHQpKTsKLQllbHNlCi0JCWRlYnVnZnNfbW50cHRbMF0gPSAnXDAnOwotfQotCiBzdGF0aWMgdm9pZCBwdGhyZWFkX19ibG9ja19zaWd3aW5jaCh2b2lkKQogewogCXNpZ3NldF90IHNldDsKQEAgLTQ1Myw3ICs0MjksNyBAQAogCWlmICghY21kKQogCQljbWQgPSAicGVyZi1oZWxwIjsKIAkvKiBnZXQgZGVidWdmcyBtb3VudCBwb2ludCBmcm9tIC9wcm9jL21vdW50cyAqLwotCWdldF9kZWJ1Z2ZzX21udHB0KCk7CisJZGVidWdmc19tb3VudChOVUxMKTsKIAkvKgogCSAqICJwZXJmLXh4eHgiIGlzIHRoZSBzYW1lIGFzICJwZXJmIHh4eHgiLCBidXQgd2Ugb2J2aW91c2x5OgogCSAqCkBAIC00NzYsNyArNDUyLDYgQEAKIAlhcmdjLS07CiAJaGFuZGxlX29wdGlvbnMoJmFyZ3YsICZhcmdjLCBOVUxMKTsKIAljb21taXRfcGFnZXJfY2hvaWNlKCk7Ci0Jc2V0X2RlYnVnZnNfcGF0aCgpOwogCXNldF9idWlsZGlkX2RpcigpOwogCiAJaWYgKGFyZ2MgPiAwKSB7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYuaCBiL3Rvb2xzL3BlcmYvcGVyZi5oCmluZGV4IDkxNGM4OTUuLjY0ZjhiZWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvcGVyZi5oCisrKyBiL3Rvb2xzL3BlcmYvcGVyZi5oCkBAIC0xODUsNCArMTg1LDI4IEBACiAKIHZvaWQgcHRocmVhZF9fdW5ibG9ja19zaWd3aW5jaCh2b2lkKTsKIAorc3RydWN0IHBlcmZfcmVjb3JkX29wdHMgeworCXBpZF90CSAgICAgdGFyZ2V0X3BpZDsKKwlwaWRfdAkgICAgIHRhcmdldF90aWQ7CisJYm9vbAkgICAgIGNhbGxfZ3JhcGg7CisJYm9vbAkgICAgIGdyb3VwOworCWJvb2wJICAgICBpbmhlcml0X3N0YXQ7CisJYm9vbAkgICAgIG5vX2RlbGF5OworCWJvb2wJICAgICBub19pbmhlcml0OworCWJvb2wJICAgICBub19zYW1wbGVzOworCWJvb2wJICAgICBwaXBlX291dHB1dDsKKwlib29sCSAgICAgcmF3X3NhbXBsZXM7CisJYm9vbAkgICAgIHNhbXBsZV9hZGRyZXNzOworCWJvb2wJICAgICBzYW1wbGVfdGltZTsKKwlib29sCSAgICAgc2FtcGxlX2lkX2FsbF9hdmFpbDsKKwlib29sCSAgICAgc3lzdGVtX3dpZGU7CisJYm9vbAkgICAgIHBlcmlvZDsKKwl1bnNpZ25lZCBpbnQgZnJlcTsKKwl1bnNpZ25lZCBpbnQgbW1hcF9wYWdlczsKKwl1bnNpZ25lZCBpbnQgdXNlcl9mcmVxOworCXU2NAkgICAgIGRlZmF1bHRfaW50ZXJ2YWw7CisJdTY0CSAgICAgdXNlcl9pbnRlcnZhbDsKKwljb25zdCBjaGFyICAgKmNwdV9saXN0OworfTsKKwogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuYyBiL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5jCmluZGV4IDExOWU5OTYuLjAxMWVkMjYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5jCkBAIC0yNSwxNyArMjUsMTcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHN5bWJvbF9fYWxsb2NfaGlzdChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGludCBuZXZlbnRzKQoraW50IHN5bWJvbF9fYWxsb2NfaGlzdChzdHJ1Y3Qgc3ltYm9sICpzeW0pCiB7CiAJc3RydWN0IGFubm90YXRpb24gKm5vdGVzID0gc3ltYm9sX19hbm5vdGF0aW9uKHN5bSk7CiAJc2l6ZV90IHNpemVvZl9zeW1faGlzdCA9IChzaXplb2Yoc3RydWN0IHN5bV9oaXN0KSArCiAJCQkJICAoc3ltLT5lbmQgLSBzeW0tPnN0YXJ0KSAqIHNpemVvZih1NjQpKTsKIAotCW5vdGVzLT5zcmMgPSB6YWxsb2Moc2l6ZW9mKCpub3Rlcy0+c3JjKSArIG5ldmVudHMgKiBzaXplb2Zfc3ltX2hpc3QpOworCW5vdGVzLT5zcmMgPSB6YWxsb2Moc2l6ZW9mKCpub3Rlcy0+c3JjKSArIHN5bWJvbF9jb25mLm5yX2V2ZW50cyAqIHNpemVvZl9zeW1faGlzdCk7CiAJaWYgKG5vdGVzLT5zcmMgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCW5vdGVzLT5zcmMtPnNpemVvZl9zeW1faGlzdCA9IHNpemVvZl9zeW1faGlzdDsKLQlub3Rlcy0+c3JjLT5ucl9oaXN0b2dyYW1zICAgPSBuZXZlbnRzOworCW5vdGVzLT5zcmMtPm5yX2hpc3RvZ3JhbXMgICA9IHN5bWJvbF9jb25mLm5yX2V2ZW50czsKIAlJTklUX0xJU1RfSEVBRCgmbm90ZXMtPnNyYy0+c291cmNlKTsKIAlyZXR1cm4gMDsKIH0KQEAgLTMzNCw3ICszMzQsNyBAQAogCQkgZGlzYXNzZW1ibGVyX3N0eWxlID8gIi1NICIgOiAiIiwKIAkJIGRpc2Fzc2VtYmxlcl9zdHlsZSA/IGRpc2Fzc2VtYmxlcl9zdHlsZSA6ICIiLAogCQkgbWFwX19yaXBfMm9iamR1bXAobWFwLCBzeW0tPnN0YXJ0KSwKLQkJIG1hcF9fcmlwXzJvYmpkdW1wKG1hcCwgc3ltLT5lbmQpLAorCQkgbWFwX19yaXBfMm9iamR1bXAobWFwLCBzeW0tPmVuZCsxKSwKIAkJIHN5bWJvbF9jb25mLmFubm90YXRlX2FzbV9yYXcgPyAiIiA6ICItLW5vLXNob3ctcmF3IiwKIAkJIHN5bWJvbF9jb25mLmFubm90YXRlX3NyYyA/ICItUyIgOiAiIiwKIAkJIHN5bWZzX2ZpbGVuYW1lLCBmaWxlbmFtZSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYW5ub3RhdGUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5oCmluZGV4IGQ5MDcyNTIuLmVmYTVkYzggMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9hbm5vdGF0ZS5oCkBAIC03Miw3ICs3Miw3IEBACiAKIGludCBzeW1ib2xfX2luY19hZGRyX3NhbXBsZXMoc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3QgbWFwICptYXAsCiAJCQkgICAgIGludCBldmlkeCwgdTY0IGFkZHIpOwotaW50IHN5bWJvbF9fYWxsb2NfaGlzdChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGludCBuZXZlbnRzKTsKK2ludCBzeW1ib2xfX2FsbG9jX2hpc3Qoc3RydWN0IHN5bWJvbCAqc3ltKTsKIHZvaWQgc3ltYm9sX19hbm5vdGF0ZV96ZXJvX2hpc3RvZ3JhbXMoc3RydWN0IHN5bWJvbCAqc3ltKTsKIAogaW50IHN5bWJvbF9fYW5ub3RhdGUoc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3QgbWFwICptYXAsIHNpemVfdCBwcml2c2l6ZSk7CkBAIC05OSw4ICs5OSw3IEBACiB9CiAjZWxzZQogaW50IHN5bWJvbF9fdHVpX2Fubm90YXRlKHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IG1hcCAqbWFwLCBpbnQgZXZpZHgsCi0JCQkgaW50IG5yX2V2ZW50cywgdm9pZCgqdGltZXIpKHZvaWQgKmFyZyksIHZvaWQgKmFyZywKLQkJCSBpbnQgZGVsYXlfc2Vjcyk7CisJCQkgdm9pZCgqdGltZXIpKHZvaWQgKmFyZyksIHZvaWQgKmFyZywgaW50IGRlbGF5X3NlY3MpOwogI2VuZGlmCiAKIGV4dGVybiBjb25zdCBjaGFyCSpkaXNhc3NlbWJsZXJfc3R5bGU7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuYyBiL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCmluZGV4IGE5MWNkOTkuLmRmZjljN2EgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9idWlsZC1pZC5jCkBAIC0xMywxNSArMTMsMTggQEAKICNpbmNsdWRlICJzeW1ib2wuaCIKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlICJkZWJ1Zy5oIgorI2luY2x1ZGUgInNlc3Npb24uaCIKKyNpbmNsdWRlICJ0b29sLmgiCiAKLXN0YXRpYyBpbnQgYnVpbGRfaWRfX21hcmtfZHNvX2hpdCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKK3N0YXRpYyBpbnQgYnVpbGRfaWRfX21hcmtfZHNvX2hpdChzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKKwkJCQkgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX191c2VkLAogCQkJCSAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fdXNlZCwKLQkJCQkgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKIHsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKIAl1OCBjcHVtb2RlID0gZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9SRUNPUkRfTUlTQ19DUFVNT0RFX01BU0s7Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkID0gcGVyZl9zZXNzaW9uX19maW5kbmV3KHNlc3Npb24sIGV2ZW50LT5pcC5waWQpOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIGV2ZW50LT5pcC5waWQpOwogCiAJaWYgKHRocmVhZCA9PSBOVUxMKSB7CiAJCXByX2VycigicHJvYmxlbSBwcm9jZXNzaW5nICVkIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCkBAIC0yOSw4ICszMiw4IEBACiAJCXJldHVybiAtMTsKIAl9CiAKLQl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAodGhyZWFkLCBzZXNzaW9uLCBjcHVtb2RlLCBNQVBfX0ZVTkNUSU9OLAotCQkJICAgICAgZXZlbnQtPmlwLnBpZCwgZXZlbnQtPmlwLmlwLCAmYWwpOworCXRocmVhZF9fZmluZF9hZGRyX21hcCh0aHJlYWQsIG1hY2hpbmUsIGNwdW1vZGUsIE1BUF9fRlVOQ1RJT04sCisJCQkgICAgICBldmVudC0+aXAuaXAsICZhbCk7CiAKIAlpZiAoYWwubWFwICE9IE5VTEwpCiAJCWFsLm1hcC0+ZHNvLT5oaXQgPSAxOwpAQCAtMzgsMjUgKzQxLDI2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcGVyZl9ldmVudF9fZXhpdF9kZWxfdGhyZWFkKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorc3RhdGljIGludCBwZXJmX2V2ZW50X19leGl0X2RlbF90aHJlYWQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX3VzZWQsCisJCQkJICAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSBfX3VzZWQsCi0JCQkJICAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJICAgICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogewotCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHBlcmZfc2Vzc2lvbl9fZmluZG5ldyhzZXNzaW9uLCBldmVudC0+Zm9yay50aWQpOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIGV2ZW50LT5mb3JrLnRpZCk7CiAKIAlkdW1wX3ByaW50ZigiKCVkOiVkKTooJWQ6JWQpXG4iLCBldmVudC0+Zm9yay5waWQsIGV2ZW50LT5mb3JrLnRpZCwKIAkJICAgIGV2ZW50LT5mb3JrLnBwaWQsIGV2ZW50LT5mb3JrLnB0aWQpOwogCiAJaWYgKHRocmVhZCkgewotCQlyYl9lcmFzZSgmdGhyZWFkLT5yYl9ub2RlLCAmc2Vzc2lvbi0+dGhyZWFkcyk7Ci0JCXNlc3Npb24tPmxhc3RfbWF0Y2ggPSBOVUxMOworCQlyYl9lcmFzZSgmdGhyZWFkLT5yYl9ub2RlLCAmbWFjaGluZS0+dGhyZWFkcyk7CisJCW1hY2hpbmUtPmxhc3RfbWF0Y2ggPSBOVUxMOwogCQl0aHJlYWRfX2RlbGV0ZSh0aHJlYWQpOwogCX0KIAogCXJldHVybiAwOwogfQogCi1zdHJ1Y3QgcGVyZl9ldmVudF9vcHMgYnVpbGRfaWRfX21hcmtfZHNvX2hpdF9vcHMgPSB7CitzdHJ1Y3QgcGVyZl90b29sIGJ1aWxkX2lkX19tYXJrX2Rzb19oaXRfb3BzID0gewogCS5zYW1wbGUJPSBidWlsZF9pZF9fbWFya19kc29faGl0LAogCS5tbWFwCT0gcGVyZl9ldmVudF9fcHJvY2Vzc19tbWFwLAogCS5mb3JrCT0gcGVyZl9ldmVudF9fcHJvY2Vzc190YXNrLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2J1aWxkLWlkLmggYi90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuaAppbmRleCA1ZGFmYjAwLi5hOTkzYmE4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuaAorKysgYi90b29scy9wZXJmL3V0aWwvYnVpbGQtaWQuaApAQCAtMyw3ICszLDcgQEAKIAogI2luY2x1ZGUgInNlc3Npb24uaCIKIAotZXh0ZXJuIHN0cnVjdCBwZXJmX2V2ZW50X29wcyBidWlsZF9pZF9fbWFya19kc29faGl0X29wczsKK2V4dGVybiBzdHJ1Y3QgcGVyZl90b29sIGJ1aWxkX2lkX19tYXJrX2Rzb19oaXRfb3BzOwogCiBjaGFyICpkc29fX2J1aWxkX2lkX2ZpbGVuYW1lKHN0cnVjdCBkc28gKnNlbGYsIGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSk7CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uaCBiL3Rvb2xzL3BlcmYvdXRpbC9jYWxsY2hhaW4uaAppbmRleCA5YjRmZjE2Li43ZjljMGYxIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvY2FsbGNoYWluLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NhbGxjaGFpbi5oCkBAIC0xMDEsNiArMTAxLDkgQEAKIGludCBjYWxsY2hhaW5fbWVyZ2Uoc3RydWN0IGNhbGxjaGFpbl9jdXJzb3IgKmN1cnNvciwKIAkJICAgIHN0cnVjdCBjYWxsY2hhaW5fcm9vdCAqZHN0LCBzdHJ1Y3QgY2FsbGNoYWluX3Jvb3QgKnNyYyk7CiAKK3N0cnVjdCBpcF9jYWxsY2hhaW47Cit1bmlvbiBwZXJmX2V2ZW50OworCiBib29sIGlwX2NhbGxjaGFpbl9fdmFsaWQoc3RydWN0IGlwX2NhbGxjaGFpbiAqY2hhaW4sCiAJCQkgY29uc3QgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQpOwogLyoKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jZ3JvdXAuYyBiL3Rvb2xzL3BlcmYvdXRpbC9jZ3JvdXAuYwppbmRleCA5NmJlZTVjLi5kYmUyZjE2IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvY2dyb3VwLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Nncm91cC5jCkBAIC0zLDcgKzMsNiBAQAogI2luY2x1ZGUgInBhcnNlLW9wdGlvbnMuaCIKICNpbmNsdWRlICJldnNlbC5oIgogI2luY2x1ZGUgImNncm91cC5oIgotI2luY2x1ZGUgImRlYnVnZnMuaCIgLyogTUFYX1BBVEgsIFNUUigpICovCiAjaW5jbHVkZSAiZXZsaXN0LmgiCiAKIGludCBucl9jZ3JvdXBzOwpAQCAtMTIsNyArMTEsNyBAQAogY2dyb3VwZnNfZmluZF9tb3VudHBvaW50KGNoYXIgKmJ1Ziwgc2l6ZV90IG1heGxlbikKIHsKIAlGSUxFICpmcDsKLQljaGFyIG1vdW50cG9pbnRbTUFYX1BBVEgrMV0sIHRva2Vuc1tNQVhfUEFUSCsxXSwgdHlwZVtNQVhfUEFUSCsxXTsKKwljaGFyIG1vdW50cG9pbnRbUEFUSF9NQVggKyAxXSwgdG9rZW5zW1BBVEhfTUFYICsgMV0sIHR5cGVbUEFUSF9NQVggKyAxXTsKIAljaGFyICp0b2tlbiwgKnNhdmVkX3B0ciA9IE5VTEw7CiAJaW50IGZvdW5kID0gMDsKIApAQCAtMjUsOCArMjQsOCBAQAogCSAqIGFuZCBpbnNwZWN0IGV2ZXJ5IGNncm91cGZzIG1vdW50IHBvaW50IHRvIGZpbmQgb25lIHRoYXQgaGFzCiAJICogcGVyZl9ldmVudCBzdWJzeXN0ZW0KIAkgKi8KLQl3aGlsZSAoZnNjYW5mKGZwLCAiJSpzICUiU1RSKE1BWF9QQVRIKSJzICUiU1RSKE1BWF9QQVRIKSJzICUiCi0JCQkJU1RSKE1BWF9QQVRIKSJzICUqZCAlKmRcbiIsCisJd2hpbGUgKGZzY2FuZihmcCwgIiUqcyAlIlNUUihQQVRIX01BWCkicyAlIlNUUihQQVRIX01BWCkicyAlIgorCQkJCVNUUihQQVRIX01BWCkicyAlKmQgJSpkXG4iLAogCQkJCW1vdW50cG9pbnQsIHR5cGUsIHRva2VucykgPT0gMykgewogCiAJCWlmICghc3RyY21wKHR5cGUsICJjZ3JvdXAiKSkgewpAQCAtNTcsMTUgKzU2LDE1IEBACiAKIHN0YXRpYyBpbnQgb3Blbl9jZ3JvdXAoY2hhciAqbmFtZSkKIHsKLQljaGFyIHBhdGhbTUFYX1BBVEgrMV07Ci0JY2hhciBtbnRbTUFYX1BBVEgrMV07CisJY2hhciBwYXRoW1BBVEhfTUFYICsgMV07CisJY2hhciBtbnRbUEFUSF9NQVggKyAxXTsKIAlpbnQgZmQ7CiAKIAotCWlmIChjZ3JvdXBmc19maW5kX21vdW50cG9pbnQobW50LCBNQVhfUEFUSCsxKSkKKwlpZiAoY2dyb3VwZnNfZmluZF9tb3VudHBvaW50KG1udCwgUEFUSF9NQVggKyAxKSkKIAkJcmV0dXJuIC0xOwogCi0Jc25wcmludGYocGF0aCwgTUFYX1BBVEgsICIlcy8lcyIsIG1udCwgbmFtZSk7CisJc25wcmludGYocGF0aCwgUEFUSF9NQVgsICIlcy8lcyIsIG1udCwgbmFtZSk7CiAKIAlmZCA9IG9wZW4ocGF0aCwgT19SRE9OTFkpOwogCWlmIChmZCA9PSAtMSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jb25maWcuYyBiL3Rvb2xzL3BlcmYvdXRpbC9jb25maWcuYwppbmRleCA4MGQ5NTk4Li4wZGVhYzZhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvY29uZmlnLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NvbmZpZy5jCkBAIC0xLDUgKzEsOCBAQAogLyoKLSAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICogY29uZmlnLmMKKyAqCisgKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBwYXJzaW5nIGNvbmZpZyBpdGVtcy4KKyAqIE9yaWdpbmFsbHkgY29waWVkIGZyb20gR0lUIHNvdXJjZS4KICAqCiAgKiBDb3B5cmlnaHQgKEMpIExpbnVzIFRvcnZhbGRzLCAyMDA1CiAgKiBDb3B5cmlnaHQgKEMpIEpvaGFubmVzIFNjaGluZGVsaW4sIDIwMDUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Z2ZzLmMgYi90b29scy9wZXJmL3V0aWwvZGVidWdmcy5jCmluZGV4IGE4OGZlZmMuLmZmYzM1ZTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Z2ZzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2RlYnVnZnMuYwpAQCAtMiw4ICsyLDEyIEBACiAjaW5jbHVkZSAiZGVidWdmcy5oIgogI2luY2x1ZGUgImNhY2hlLmgiCiAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKwogc3RhdGljIGludCBkZWJ1Z2ZzX3ByZW1vdW50ZWQ7Ci1zdGF0aWMgY2hhciBkZWJ1Z2ZzX21vdW50cG9pbnRbTUFYX1BBVEgrMV07CitjaGFyIGRlYnVnZnNfbW91bnRwb2ludFtQQVRIX01BWCArIDFdID0gIi9zeXMva2VybmVsL2RlYnVnIjsKK2NoYXIgdHJhY2luZ19ldmVudHNfcGF0aFtQQVRIX01BWCArIDFdID0gIi9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvZXZlbnRzIjsKIAogc3RhdGljIGNvbnN0IGNoYXIgKmRlYnVnZnNfa25vd25fbW91bnRwb2ludHNbXSA9IHsKIAkiL3N5cy9rZXJuZWwvZGVidWcvIiwKQEAgLTYyLDExICs2Niw5IEBACiAJLyogZ2l2ZSB1cCBhbmQgcGFyc2UgL3Byb2MvbW91bnRzICovCiAJZnAgPSBmb3BlbigiL3Byb2MvbW91bnRzIiwgInIiKTsKIAlpZiAoZnAgPT0gTlVMTCkKLQkJZGllKCJDYW4ndCBvcGVuIC9wcm9jL21vdW50cyBmb3IgcmVhZCIpOworCQlyZXR1cm4gTlVMTDsKIAotCXdoaWxlIChmc2NhbmYoZnAsICIlKnMgJSIKLQkJICAgICAgU1RSKE1BWF9QQVRIKQotCQkgICAgICAicyAlOTlzICUqcyAlKmQgJSpkXG4iLAorCXdoaWxlIChmc2NhbmYoZnAsICIlKnMgJSIgU1RSKFBBVEhfTUFYKSAicyAlOTlzICUqcyAlKmQgJSpkXG4iLAogCQkgICAgICBkZWJ1Z2ZzX21vdW50cG9pbnQsIHR5cGUpID09IDIpIHsKIAkJaWYgKHN0cmNtcCh0eXBlLCAiZGVidWdmcyIpID09IDApCiAJCQlicmVhazsKQEAgLTEwNiw2ICsxMDgsMTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgZGVidWdmc19zZXRfdHJhY2luZ19ldmVudHNfcGF0aChjb25zdCBjaGFyICptb3VudHBvaW50KQoreworCXNucHJpbnRmKHRyYWNpbmdfZXZlbnRzX3BhdGgsIHNpemVvZih0cmFjaW5nX2V2ZW50c19wYXRoKSwgIiVzLyVzIiwKKwkJIG1vdW50cG9pbnQsICJ0cmFjaW5nL2V2ZW50cyIpOworfQorCiAvKiBtb3VudCB0aGUgZGVidWdmcyBzb21ld2hlcmUgaWYgaXQncyBub3QgbW91bnRlZCAqLwogCiBjaGFyICpkZWJ1Z2ZzX21vdW50KGNvbnN0IGNoYXIgKm1vdW50cG9pbnQpCkBAIC0xMTMsNyArMTIxLDcgQEAKIAkvKiBzZWUgaWYgaXQncyBhbHJlYWR5IG1vdW50ZWQgKi8KIAlpZiAoZGVidWdmc19maW5kX21vdW50cG9pbnQoKSkgewogCQlkZWJ1Z2ZzX3ByZW1vdW50ZWQgPSAxOwotCQlyZXR1cm4gZGVidWdmc19tb3VudHBvaW50OworCQlnb3RvIG91dDsKIAl9CiAKIAkvKiBpZiBub3QgbW91bnRlZCBhbmQgbm8gYXJndW1lbnQgKi8KQEAgLTEyOSwxMiArMTM3LDE5IEBACiAJCXJldHVybiBOVUxMOwogCiAJLyogc2F2ZSB0aGUgbW91bnRwb2ludCAqLwotCXN0cm5jcHkoZGVidWdmc19tb3VudHBvaW50LCBtb3VudHBvaW50LCBzaXplb2YoZGVidWdmc19tb3VudHBvaW50KSk7CiAJZGVidWdmc19mb3VuZCA9IDE7Ci0KKwlzdHJuY3B5KGRlYnVnZnNfbW91bnRwb2ludCwgbW91bnRwb2ludCwgc2l6ZW9mKGRlYnVnZnNfbW91bnRwb2ludCkpOworb3V0OgorCWRlYnVnZnNfc2V0X3RyYWNpbmdfZXZlbnRzX3BhdGgoZGVidWdmc19tb3VudHBvaW50KTsKIAlyZXR1cm4gZGVidWdmc19tb3VudHBvaW50OwogfQogCit2b2lkIGRlYnVnZnNfc2V0X3BhdGgoY29uc3QgY2hhciAqbW91bnRwb2ludCkKK3sKKwlzbnByaW50ZihkZWJ1Z2ZzX21vdW50cG9pbnQsIHNpemVvZihkZWJ1Z2ZzX21vdW50cG9pbnQpLCAiJXMiLCBtb3VudHBvaW50KTsKKwlkZWJ1Z2ZzX3NldF90cmFjaW5nX2V2ZW50c19wYXRoKG1vdW50cG9pbnQpOworfQorCiAvKiB1bW91bnQgdGhlIGRlYnVnZnMgKi8KIAogaW50IGRlYnVnZnNfdW1vdW50KHZvaWQpCkBAIC0xNTgsNyArMTczLDcgQEAKIAogaW50IGRlYnVnZnNfd3JpdGUoY29uc3QgY2hhciAqZW50cnksIGNvbnN0IGNoYXIgKnZhbHVlKQogewotCWNoYXIgcGF0aFtNQVhfUEFUSCsxXTsKKwljaGFyIHBhdGhbUEFUSF9NQVggKyAxXTsKIAlpbnQgcmV0LCBjb3VudDsKIAlpbnQgZmQ7CiAKQEAgLTIwMyw3ICsyMTgsNyBAQAogICovCiBpbnQgZGVidWdmc19yZWFkKGNvbnN0IGNoYXIgKmVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQogewotCWNoYXIgcGF0aFtNQVhfUEFUSCsxXTsKKwljaGFyIHBhdGhbUEFUSF9NQVggKyAxXTsKIAlpbnQgcmV0OwogCWludCBmZDsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2RlYnVnZnMuaCBiL3Rvb2xzL3BlcmYvdXRpbC9kZWJ1Z2ZzLmgKaW5kZXggODNhMDI4Ny4uNGE4NzhmNyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2RlYnVnZnMuaAorKysgYi90b29scy9wZXJmL3V0aWwvZGVidWdmcy5oCkBAIC0xLDI1ICsxLDE4IEBACiAjaWZuZGVmIF9fREVCVUdGU19IX18KICNkZWZpbmUgX19ERUJVR0ZTX0hfXwogCi0jaW5jbHVkZSA8c3lzL21vdW50Lmg+Citjb25zdCBjaGFyICpkZWJ1Z2ZzX2ZpbmRfbW91bnRwb2ludCh2b2lkKTsKK2ludCBkZWJ1Z2ZzX3ZhbGlkX21vdW50cG9pbnQoY29uc3QgY2hhciAqZGVidWdmcyk7CitpbnQgZGVidWdmc192YWxpZF9lbnRyeShjb25zdCBjaGFyICpwYXRoKTsKK2NoYXIgKmRlYnVnZnNfbW91bnQoY29uc3QgY2hhciAqbW91bnRwb2ludCk7CitpbnQgZGVidWdmc191bW91bnQodm9pZCk7Cit2b2lkIGRlYnVnZnNfc2V0X3BhdGgoY29uc3QgY2hhciAqbW91bnRwb2ludCk7CitpbnQgZGVidWdmc193cml0ZShjb25zdCBjaGFyICplbnRyeSwgY29uc3QgY2hhciAqdmFsdWUpOworaW50IGRlYnVnZnNfcmVhZChjb25zdCBjaGFyICplbnRyeSwgY2hhciAqYnVmZmVyLCBzaXplX3Qgc2l6ZSk7Cit2b2lkIGRlYnVnZnNfZm9yY2VfY2xlYW51cCh2b2lkKTsKK2ludCBkZWJ1Z2ZzX21ha2VfcGF0aChjb25zdCBjaGFyICplbGVtZW50LCBjaGFyICpidWZmZXIsIGludCBzaXplKTsKIAotI2lmbmRlZiBNQVhfUEFUSAotIyBkZWZpbmUgTUFYX1BBVEggMjU2Ci0jZW5kaWYKLQotI2lmbmRlZiBTVFIKLSMgZGVmaW5lIF9TVFIoeCkgI3gKLSMgZGVmaW5lIFNUUih4KSBfU1RSKHgpCi0jZW5kaWYKLQotZXh0ZXJuIGNvbnN0IGNoYXIgKmRlYnVnZnNfZmluZF9tb3VudHBvaW50KHZvaWQpOwotZXh0ZXJuIGludCBkZWJ1Z2ZzX3ZhbGlkX21vdW50cG9pbnQoY29uc3QgY2hhciAqZGVidWdmcyk7Ci1leHRlcm4gaW50IGRlYnVnZnNfdmFsaWRfZW50cnkoY29uc3QgY2hhciAqcGF0aCk7Ci1leHRlcm4gY2hhciAqZGVidWdmc19tb3VudChjb25zdCBjaGFyICptb3VudHBvaW50KTsKLWV4dGVybiBpbnQgZGVidWdmc191bW91bnQodm9pZCk7Ci1leHRlcm4gaW50IGRlYnVnZnNfd3JpdGUoY29uc3QgY2hhciAqZW50cnksIGNvbnN0IGNoYXIgKnZhbHVlKTsKLWV4dGVybiBpbnQgZGVidWdmc19yZWFkKGNvbnN0IGNoYXIgKmVudHJ5LCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKTsKLWV4dGVybiB2b2lkIGRlYnVnZnNfZm9yY2VfY2xlYW51cCh2b2lkKTsKLWV4dGVybiBpbnQgZGVidWdmc19tYWtlX3BhdGgoY29uc3QgY2hhciAqZWxlbWVudCwgY2hhciAqYnVmZmVyLCBpbnQgc2l6ZSk7CitleHRlcm4gY2hhciBkZWJ1Z2ZzX21vdW50cG9pbnRbXTsKK2V4dGVybiBjaGFyIHRyYWNpbmdfZXZlbnRzX3BhdGhbXTsKIAogI2VuZGlmIC8qIF9fREVCVUdGU19IX18gKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKaW5kZXggNDM3ZjhjYS4uNzNkZGFmMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2ZW50LmMKQEAgLTEsNyArMSw2IEBACiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlICJldmVudC5oIgogI2luY2x1ZGUgImRlYnVnLmgiCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgogI2luY2x1ZGUgInNvcnQuaCIKICNpbmNsdWRlICJzdHJpbmcuaCIKICNpbmNsdWRlICJzdHJsaXN0LmgiCkBAIC00NCwzNiArNDMsMjcgQEAKIAkucGVyaW9kCSAgID0gMSwKIH07CiAKLXN0YXRpYyBwaWRfdCBwZXJmX2V2ZW50X19zeW50aGVzaXplX2NvbW0odW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIHBpZF90IHBpZCwKLQkJCQkJIGludCBmdWxsLCBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKLQkJCQkJIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCitzdGF0aWMgcGlkX3QgcGVyZl9ldmVudF9fZ2V0X2NvbW1fdGdpZChwaWRfdCBwaWQsIGNoYXIgKmNvbW0sIHNpemVfdCBsZW4pCiB7CiAJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CiAJY2hhciBiZltCVUZTSVpdOwogCUZJTEUgKmZwOwogCXNpemVfdCBzaXplID0gMDsKLQlESVIgKnRhc2tzOwotCXN0cnVjdCBkaXJlbnQgZGlyZW50LCAqbmV4dDsKLQlwaWRfdCB0Z2lkID0gMDsKKwlwaWRfdCB0Z2lkID0gLTE7CiAKIAlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIi9wcm9jLyVkL3N0YXR1cyIsIHBpZCk7CiAKIAlmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOwogCWlmIChmcCA9PSBOVUxMKSB7Ci1vdXRfcmFjZToKLQkJLyoKLQkJICogV2UgcmFjZWQgd2l0aCBhIHRhc2sgZXhpdGluZyAtIGp1c3QgcmV0dXJuOgotCQkgKi8KIAkJcHJfZGVidWcoImNvdWxkbid0IG9wZW4gJXNcbiIsIGZpbGVuYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQogCi0JbWVtc2V0KCZldmVudC0+Y29tbSwgMCwgc2l6ZW9mKGV2ZW50LT5jb21tKSk7Ci0KLQl3aGlsZSAoIWV2ZW50LT5jb21tLmNvbW1bMF0gfHwgIWV2ZW50LT5jb21tLnBpZCkgeworCXdoaWxlICghY29tbVswXSB8fCAodGdpZCA8IDApKSB7CiAJCWlmIChmZ2V0cyhiZiwgc2l6ZW9mKGJmKSwgZnApID09IE5VTEwpIHsKLQkJCXByX3dhcm5pbmcoImNvdWxkbid0IGdldCBDT01NIGFuZCBwZ2lkLCBtYWxmb3JtZWQgJXNcbiIsIGZpbGVuYW1lKTsKLQkJCWdvdG8gb3V0OworCQkJcHJfd2FybmluZygiY291bGRuJ3QgZ2V0IENPTU0gYW5kIHBnaWQsIG1hbGZvcm1lZCAlc1xuIiwKKwkJCQkgICBmaWxlbmFtZSk7CisJCQlicmVhazsKIAkJfQogCiAJCWlmIChtZW1jbXAoYmYsICJOYW1lOiIsIDUpID09IDApIHsKQEAgLTgxLDMzICs3MSw2NSBAQAogCQkJd2hpbGUgKCpuYW1lICYmIGlzc3BhY2UoKm5hbWUpKQogCQkJCSsrbmFtZTsKIAkJCXNpemUgPSBzdHJsZW4obmFtZSkgLSAxOwotCQkJbWVtY3B5KGV2ZW50LT5jb21tLmNvbW0sIG5hbWUsIHNpemUrKyk7CisJCQlpZiAoc2l6ZSA+PSBsZW4pCisJCQkJc2l6ZSA9IGxlbiAtIDE7CisJCQltZW1jcHkoY29tbSwgbmFtZSwgc2l6ZSk7CisKIAkJfSBlbHNlIGlmIChtZW1jbXAoYmYsICJUZ2lkOiIsIDUpID09IDApIHsKIAkJCWNoYXIgKnRnaWRzID0gYmYgKyA1OwogCQkJd2hpbGUgKCp0Z2lkcyAmJiBpc3NwYWNlKCp0Z2lkcykpCiAJCQkJKyt0Z2lkczsKLQkJCXRnaWQgPSBldmVudC0+Y29tbS5waWQgPSBhdG9pKHRnaWRzKTsKKwkJCXRnaWQgPSBhdG9pKHRnaWRzKTsKIAkJfQogCX0KIAorCWZjbG9zZShmcCk7CisKKwlyZXR1cm4gdGdpZDsKK30KKworc3RhdGljIHBpZF90IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfY29tbShzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCQkgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIHBpZF90IHBpZCwKKwkJCQkJIGludCBmdWxsLAorCQkJCQkgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCisJCQkJCSBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3sKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwlzaXplX3Qgc2l6ZTsKKwlESVIgKnRhc2tzOworCXN0cnVjdCBkaXJlbnQgZGlyZW50LCAqbmV4dDsKKwlwaWRfdCB0Z2lkOworCisJbWVtc2V0KCZldmVudC0+Y29tbSwgMCwgc2l6ZW9mKGV2ZW50LT5jb21tKSk7CisKKwl0Z2lkID0gcGVyZl9ldmVudF9fZ2V0X2NvbW1fdGdpZChwaWQsIGV2ZW50LT5jb21tLmNvbW0sCisJCQkJCSBzaXplb2YoZXZlbnQtPmNvbW0uY29tbSkpOworCWlmICh0Z2lkIDwgMCkKKwkJZ290byBvdXQ7CisKKwlldmVudC0+Y29tbS5waWQgPSB0Z2lkOwogCWV2ZW50LT5jb21tLmhlYWRlci50eXBlID0gUEVSRl9SRUNPUkRfQ09NTTsKKworCXNpemUgPSBzdHJsZW4oZXZlbnQtPmNvbW0uY29tbSkgKyAxOwogCXNpemUgPSBBTElHTihzaXplLCBzaXplb2YodTY0KSk7Ci0JbWVtc2V0KGV2ZW50LT5jb21tLmNvbW0gKyBzaXplLCAwLCBzZXNzaW9uLT5pZF9oZHJfc2l6ZSk7CisJbWVtc2V0KGV2ZW50LT5jb21tLmNvbW0gKyBzaXplLCAwLCBtYWNoaW5lLT5pZF9oZHJfc2l6ZSk7CiAJZXZlbnQtPmNvbW0uaGVhZGVyLnNpemUgPSAoc2l6ZW9mKGV2ZW50LT5jb21tKSAtCiAJCQkJKHNpemVvZihldmVudC0+Y29tbS5jb21tKSAtIHNpemUpICsKLQkJCQlzZXNzaW9uLT5pZF9oZHJfc2l6ZSk7CisJCQkJbWFjaGluZS0+aWRfaGRyX3NpemUpOwogCWlmICghZnVsbCkgewogCQlldmVudC0+Y29tbS50aWQgPSBwaWQ7CiAKLQkJcHJvY2VzcyhldmVudCwgJnN5bnRoX3NhbXBsZSwgc2Vzc2lvbik7CisJCXByb2Nlc3ModG9vbCwgZXZlbnQsICZzeW50aF9zYW1wbGUsIG1hY2hpbmUpOwogCQlnb3RvIG91dDsKIAl9CiAKIAlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIi9wcm9jLyVkL3Rhc2siLCBwaWQpOwogCiAJdGFza3MgPSBvcGVuZGlyKGZpbGVuYW1lKTsKLQlpZiAodGFza3MgPT0gTlVMTCkKLQkJZ290byBvdXRfcmFjZTsKKwlpZiAodGFza3MgPT0gTlVMTCkgeworCQlwcl9kZWJ1ZygiY291bGRuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CiAKIAl3aGlsZSAoIXJlYWRkaXJfcih0YXNrcywgJmRpcmVudCwgJm5leHQpICYmIG5leHQpIHsKIAkJY2hhciAqZW5kOwpAQCAtMTE1LDIyICsxMzcsMzIgQEAKIAkJaWYgKCplbmQpCiAJCQljb250aW51ZTsKIAorCQkvKiBhbHJlYWR5IGhhdmUgdGdpZDsganV0IHdhbnQgdG8gdXBkYXRlIHRoZSBjb21tICovCisJCSh2b2lkKSBwZXJmX2V2ZW50X19nZXRfY29tbV90Z2lkKHBpZCwgZXZlbnQtPmNvbW0uY29tbSwKKwkJCQkJIHNpemVvZihldmVudC0+Y29tbS5jb21tKSk7CisKKwkJc2l6ZSA9IHN0cmxlbihldmVudC0+Y29tbS5jb21tKSArIDE7CisJCXNpemUgPSBBTElHTihzaXplLCBzaXplb2YodTY0KSk7CisJCW1lbXNldChldmVudC0+Y29tbS5jb21tICsgc2l6ZSwgMCwgbWFjaGluZS0+aWRfaGRyX3NpemUpOworCQlldmVudC0+Y29tbS5oZWFkZXIuc2l6ZSA9IChzaXplb2YoZXZlbnQtPmNvbW0pIC0KKwkJCQkJICAoc2l6ZW9mKGV2ZW50LT5jb21tLmNvbW0pIC0gc2l6ZSkgKworCQkJCQkgIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKKwogCQlldmVudC0+Y29tbS50aWQgPSBwaWQ7CiAKLQkJcHJvY2VzcyhldmVudCwgJnN5bnRoX3NhbXBsZSwgc2Vzc2lvbik7CisJCXByb2Nlc3ModG9vbCwgZXZlbnQsICZzeW50aF9zYW1wbGUsIG1hY2hpbmUpOwogCX0KIAogCWNsb3NlZGlyKHRhc2tzKTsKIG91dDoKLQlmY2xvc2UoZnApOwotCiAJcmV0dXJuIHRnaWQ7CiB9CiAKLXN0YXRpYyBpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tbWFwX2V2ZW50cyh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKK3N0YXRpYyBpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tbWFwX2V2ZW50cyhzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCQkgICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQkJICAgICAgcGlkX3QgcGlkLCBwaWRfdCB0Z2lkLAogCQkJCQkgICAgICBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKLQkJCQkJICAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKKwkJCQkJICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJY2hhciBmaWxlbmFtZVtQQVRIX01BWF07CiAJRklMRSAqZnA7CkBAIC0xOTMsMTIgKzIyNSwxMiBAQAogCQkJZXZlbnQtPm1tYXAubGVuIC09IGV2ZW50LT5tbWFwLnN0YXJ0OwogCQkJZXZlbnQtPm1tYXAuaGVhZGVyLnNpemUgPSAoc2l6ZW9mKGV2ZW50LT5tbWFwKSAtCiAJCQkJCSAgICAgICAgKHNpemVvZihldmVudC0+bW1hcC5maWxlbmFtZSkgLSBzaXplKSk7Ci0JCQltZW1zZXQoZXZlbnQtPm1tYXAuZmlsZW5hbWUgKyBzaXplLCAwLCBzZXNzaW9uLT5pZF9oZHJfc2l6ZSk7Ci0JCQlldmVudC0+bW1hcC5oZWFkZXIuc2l6ZSArPSBzZXNzaW9uLT5pZF9oZHJfc2l6ZTsKKwkJCW1lbXNldChldmVudC0+bW1hcC5maWxlbmFtZSArIHNpemUsIDAsIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKKwkJCWV2ZW50LT5tbWFwLmhlYWRlci5zaXplICs9IG1hY2hpbmUtPmlkX2hkcl9zaXplOwogCQkJZXZlbnQtPm1tYXAucGlkID0gdGdpZDsKIAkJCWV2ZW50LT5tbWFwLnRpZCA9IHBpZDsKIAotCQkJcHJvY2VzcyhldmVudCwgJnN5bnRoX3NhbXBsZSwgc2Vzc2lvbik7CisJCQlwcm9jZXNzKHRvb2wsIGV2ZW50LCAmc3ludGhfc2FtcGxlLCBtYWNoaW5lKTsKIAkJfQogCX0KIApAQCAtMjA2LDE0ICsyMzgsMTQgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfbW9kdWxlcyhwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKLQkJCQkgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAoraW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfbW9kdWxlcyhzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgIHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAogCQkJCSAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogewogCXN0cnVjdCByYl9ub2RlICpuZDsKIAlzdHJ1Y3QgbWFwX2dyb3VwcyAqa21hcHMgPSAmbWFjaGluZS0+a21hcHM7CiAJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQgPSB6YWxsb2MoKHNpemVvZihldmVudC0+bW1hcCkgKwotCQkJCQkgIHNlc3Npb24tPmlkX2hkcl9zaXplKSk7CisJCQkJCSAgbWFjaGluZS0+aWRfaGRyX3NpemUpKTsKIAlpZiAoZXZlbnQgPT0gTlVMTCkgewogCQlwcl9kZWJ1ZygiTm90IGVub3VnaCBtZW1vcnkgc3ludGhlc2l6aW5nIG1tYXAgZXZlbnQgIgogCQkJICJmb3Iga2VybmVsIG1vZHVsZXNcbiIpOwpAQCAtMjQzLDE1ICsyNzUsMTUgQEAKIAkJZXZlbnQtPm1tYXAuaGVhZGVyLnR5cGUgPSBQRVJGX1JFQ09SRF9NTUFQOwogCQlldmVudC0+bW1hcC5oZWFkZXIuc2l6ZSA9IChzaXplb2YoZXZlbnQtPm1tYXApIC0KIAkJCQkgICAgICAgIChzaXplb2YoZXZlbnQtPm1tYXAuZmlsZW5hbWUpIC0gc2l6ZSkpOwotCQltZW1zZXQoZXZlbnQtPm1tYXAuZmlsZW5hbWUgKyBzaXplLCAwLCBzZXNzaW9uLT5pZF9oZHJfc2l6ZSk7Ci0JCWV2ZW50LT5tbWFwLmhlYWRlci5zaXplICs9IHNlc3Npb24tPmlkX2hkcl9zaXplOworCQltZW1zZXQoZXZlbnQtPm1tYXAuZmlsZW5hbWUgKyBzaXplLCAwLCBtYWNoaW5lLT5pZF9oZHJfc2l6ZSk7CisJCWV2ZW50LT5tbWFwLmhlYWRlci5zaXplICs9IG1hY2hpbmUtPmlkX2hkcl9zaXplOwogCQlldmVudC0+bW1hcC5zdGFydCA9IHBvcy0+c3RhcnQ7CiAJCWV2ZW50LT5tbWFwLmxlbiAgID0gcG9zLT5lbmQgLSBwb3MtPnN0YXJ0OwogCQlldmVudC0+bW1hcC5waWQgICA9IG1hY2hpbmUtPnBpZDsKIAogCQltZW1jcHkoZXZlbnQtPm1tYXAuZmlsZW5hbWUsIHBvcy0+ZHNvLT5sb25nX25hbWUsCiAJCSAgICAgICBwb3MtPmRzby0+bG9uZ19uYW1lX2xlbiArIDEpOwotCQlwcm9jZXNzKGV2ZW50LCAmc3ludGhfc2FtcGxlLCBzZXNzaW9uKTsKKwkJcHJvY2Vzcyh0b29sLCBldmVudCwgJnN5bnRoX3NhbXBsZSwgbWFjaGluZSk7CiAJfQogCiAJZnJlZShldmVudCk7CkBAIC0yNjAsNDAgKzI5Miw2OSBAQAogCiBzdGF0aWMgaW50IF9fZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkKHVuaW9uIHBlcmZfZXZlbnQgKmNvbW1fZXZlbnQsCiAJCQkJICAgICAgdW5pb24gcGVyZl9ldmVudCAqbW1hcF9ldmVudCwKLQkJCQkgICAgICBwaWRfdCBwaWQsIHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAotCQkJCSAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJICAgICAgcGlkX3QgcGlkLCBpbnQgZnVsbCwKKwkJCQkJICBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKKwkJCQkgICAgICBzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogewotCXBpZF90IHRnaWQgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2NvbW0oY29tbV9ldmVudCwgcGlkLCAxLCBwcm9jZXNzLAotCQkJCQkgICAgc2Vzc2lvbik7CisJcGlkX3QgdGdpZCA9IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfY29tbSh0b29sLCBjb21tX2V2ZW50LCBwaWQsIGZ1bGwsCisJCQkJCQkgcHJvY2VzcywgbWFjaGluZSk7CiAJaWYgKHRnaWQgPT0gLTEpCiAJCXJldHVybiAtMTsKLQlyZXR1cm4gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tbWFwX2V2ZW50cyhtbWFwX2V2ZW50LCBwaWQsIHRnaWQsCi0JCQkJCSAgICAgcHJvY2Vzcywgc2Vzc2lvbik7CisJcmV0dXJuIHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfbW1hcF9ldmVudHModG9vbCwgbW1hcF9ldmVudCwgcGlkLCB0Z2lkLAorCQkJCQkJICBwcm9jZXNzLCBtYWNoaW5lKTsKIH0KIAotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkX21hcChzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkcywKK2ludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX3RocmVhZF9tYXAoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQkgICAgICBzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkcywKIAkJCQkgICAgICBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKLQkJCQkgICAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQorCQkJCSAgICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogewogCXVuaW9uIHBlcmZfZXZlbnQgKmNvbW1fZXZlbnQsICptbWFwX2V2ZW50OwotCWludCBlcnIgPSAtMSwgdGhyZWFkOworCWludCBlcnIgPSAtMSwgdGhyZWFkLCBqOwogCi0JY29tbV9ldmVudCA9IG1hbGxvYyhzaXplb2YoY29tbV9ldmVudC0+Y29tbSkgKyBzZXNzaW9uLT5pZF9oZHJfc2l6ZSk7CisJY29tbV9ldmVudCA9IG1hbGxvYyhzaXplb2YoY29tbV9ldmVudC0+Y29tbSkgKyBtYWNoaW5lLT5pZF9oZHJfc2l6ZSk7CiAJaWYgKGNvbW1fZXZlbnQgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKLQltbWFwX2V2ZW50ID0gbWFsbG9jKHNpemVvZihtbWFwX2V2ZW50LT5tbWFwKSArIHNlc3Npb24tPmlkX2hkcl9zaXplKTsKKwltbWFwX2V2ZW50ID0gbWFsbG9jKHNpemVvZihtbWFwX2V2ZW50LT5tbWFwKSArIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKIAlpZiAobW1hcF9ldmVudCA9PSBOVUxMKQogCQlnb3RvIG91dF9mcmVlX2NvbW07CiAKIAllcnIgPSAwOwogCWZvciAodGhyZWFkID0gMDsgdGhyZWFkIDwgdGhyZWFkcy0+bnI7ICsrdGhyZWFkKSB7CiAJCWlmIChfX2V2ZW50X19zeW50aGVzaXplX3RocmVhZChjb21tX2V2ZW50LCBtbWFwX2V2ZW50LAotCQkJCQkgICAgICAgdGhyZWFkcy0+bWFwW3RocmVhZF0sCi0JCQkJCSAgICAgICBwcm9jZXNzLCBzZXNzaW9uKSkgeworCQkJCQkgICAgICAgdGhyZWFkcy0+bWFwW3RocmVhZF0sIDAsCisJCQkJCSAgICAgICBwcm9jZXNzLCB0b29sLCBtYWNoaW5lKSkgewogCQkJZXJyID0gLTE7CiAJCQlicmVhazsKIAkJfQorCisJCS8qCisJCSAqIGNvbW0ucGlkIGlzIHNldCB0byB0aHJlYWQgZ3JvdXAgaWQgYnkKKwkJICogcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9jb21tCisJCSAqLworCQlpZiAoKGludCkgY29tbV9ldmVudC0+Y29tbS5waWQgIT0gdGhyZWFkcy0+bWFwW3RocmVhZF0pIHsKKwkJCWJvb2wgbmVlZF9sZWFkZXIgPSB0cnVlOworCisJCQkvKiBpcyB0aHJlYWQgZ3JvdXAgbGVhZGVyIGluIHRocmVhZF9tYXA/ICovCisJCQlmb3IgKGogPSAwOyBqIDwgdGhyZWFkcy0+bnI7ICsraikgeworCQkJCWlmICgoaW50KSBjb21tX2V2ZW50LT5jb21tLnBpZCA9PSB0aHJlYWRzLT5tYXBbal0pIHsKKwkJCQkJbmVlZF9sZWFkZXIgPSBmYWxzZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQkvKiBpZiBub3QsIGdlbmVyYXRlIGV2ZW50cyBmb3IgaXQgKi8KKwkJCWlmIChuZWVkX2xlYWRlciAmJgorCQkJICAgIF9fZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkKGNvbW1fZXZlbnQsCisJCQkJCQkgICAgICBtbWFwX2V2ZW50LAorCQkJCQkJICAgICAgY29tbV9ldmVudC0+Y29tbS5waWQsIDAsCisJCQkJCQkgICAgICBwcm9jZXNzLCB0b29sLCBtYWNoaW5lKSkgeworCQkJCWVyciA9IC0xOworCQkJCWJyZWFrOworCQkJfQorCQl9CiAJfQogCWZyZWUobW1hcF9ldmVudCk7CiBvdXRfZnJlZV9jb21tOgpAQCAtMzAyLDE5ICszNjMsMjAgQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRzKHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAotCQkJCSAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCitpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRzKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJICAgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCisJCQkJICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJRElSICpwcm9jOwogCXN0cnVjdCBkaXJlbnQgZGlyZW50LCAqbmV4dDsKIAl1bmlvbiBwZXJmX2V2ZW50ICpjb21tX2V2ZW50LCAqbW1hcF9ldmVudDsKIAlpbnQgZXJyID0gLTE7CiAKLQljb21tX2V2ZW50ID0gbWFsbG9jKHNpemVvZihjb21tX2V2ZW50LT5jb21tKSArIHNlc3Npb24tPmlkX2hkcl9zaXplKTsKKwljb21tX2V2ZW50ID0gbWFsbG9jKHNpemVvZihjb21tX2V2ZW50LT5jb21tKSArIG1hY2hpbmUtPmlkX2hkcl9zaXplKTsKIAlpZiAoY29tbV9ldmVudCA9PSBOVUxMKQogCQlnb3RvIG91dDsKIAotCW1tYXBfZXZlbnQgPSBtYWxsb2Moc2l6ZW9mKG1tYXBfZXZlbnQtPm1tYXApICsgc2Vzc2lvbi0+aWRfaGRyX3NpemUpOworCW1tYXBfZXZlbnQgPSBtYWxsb2Moc2l6ZW9mKG1tYXBfZXZlbnQtPm1tYXApICsgbWFjaGluZS0+aWRfaGRyX3NpemUpOwogCWlmIChtbWFwX2V2ZW50ID09IE5VTEwpCiAJCWdvdG8gb3V0X2ZyZWVfY29tbTsKIApAQCAtMzI5LDggKzM5MSw4IEBACiAJCWlmICgqZW5kKSAvKiBvbmx5IGludGVyZXN0ZWQgaW4gcHJvcGVyIG51bWVyaWNhbCBkaXJlbnRzICovCiAJCQljb250aW51ZTsKIAotCQlfX2V2ZW50X19zeW50aGVzaXplX3RocmVhZChjb21tX2V2ZW50LCBtbWFwX2V2ZW50LCBwaWQsCi0JCQkJCSAgIHByb2Nlc3MsIHNlc3Npb24pOworCQlfX2V2ZW50X19zeW50aGVzaXplX3RocmVhZChjb21tX2V2ZW50LCBtbWFwX2V2ZW50LCBwaWQsIDEsCisJCQkJCSAgIHByb2Nlc3MsIHRvb2wsIG1hY2hpbmUpOwogCX0KIAogCWNsb3NlZGlyKHByb2MpOwpAQCAtMzY1LDggKzQyNyw4IEBACiAJcmV0dXJuIDE7CiB9CiAKLWludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX2tlcm5lbF9tbWFwKHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAotCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAoraW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfa2VybmVsX21tYXAoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQkgICAgICAgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCiAJCQkJICAgICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLAogCQkJCSAgICAgICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZSkKIHsKQEAgLTM4Myw3ICs0NDUsNyBAQAogCSAqLwogCXN0cnVjdCBwcm9jZXNzX3N5bWJvbF9hcmdzIGFyZ3MgPSB7IC5uYW1lID0gc3ltYm9sX25hbWUsIH07CiAJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQgPSB6YWxsb2MoKHNpemVvZihldmVudC0+bW1hcCkgKwotCQkJCQkgIHNlc3Npb24tPmlkX2hkcl9zaXplKSk7CisJCQkJCSAgbWFjaGluZS0+aWRfaGRyX3NpemUpKTsKIAlpZiAoZXZlbnQgPT0gTlVMTCkgewogCQlwcl9kZWJ1ZygiTm90IGVub3VnaCBtZW1vcnkgc3ludGhlc2l6aW5nIG1tYXAgZXZlbnQgIgogCQkJICJmb3Iga2VybmVsIG1vZHVsZXNcbiIpOwpAQCAtNDE3LDI1ICs0NzksMzIgQEAKIAlzaXplID0gQUxJR04oc2l6ZSwgc2l6ZW9mKHU2NCkpOwogCWV2ZW50LT5tbWFwLmhlYWRlci50eXBlID0gUEVSRl9SRUNPUkRfTU1BUDsKIAlldmVudC0+bW1hcC5oZWFkZXIuc2l6ZSA9IChzaXplb2YoZXZlbnQtPm1tYXApIC0KLQkJCShzaXplb2YoZXZlbnQtPm1tYXAuZmlsZW5hbWUpIC0gc2l6ZSkgKyBzZXNzaW9uLT5pZF9oZHJfc2l6ZSk7CisJCQkoc2l6ZW9mKGV2ZW50LT5tbWFwLmZpbGVuYW1lKSAtIHNpemUpICsgbWFjaGluZS0+aWRfaGRyX3NpemUpOwogCWV2ZW50LT5tbWFwLnBnb2ZmID0gYXJncy5zdGFydDsKIAlldmVudC0+bW1hcC5zdGFydCA9IG1hcC0+c3RhcnQ7CiAJZXZlbnQtPm1tYXAubGVuICAgPSBtYXAtPmVuZCAtIGV2ZW50LT5tbWFwLnN0YXJ0OwogCWV2ZW50LT5tbWFwLnBpZCAgID0gbWFjaGluZS0+cGlkOwogCi0JZXJyID0gcHJvY2VzcyhldmVudCwgJnN5bnRoX3NhbXBsZSwgc2Vzc2lvbik7CisJZXJyID0gcHJvY2Vzcyh0b29sLCBldmVudCwgJnN5bnRoX3NhbXBsZSwgbWFjaGluZSk7CiAJZnJlZShldmVudCk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19jb21tKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSBfX3VzZWQsCi0JCQkgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCitzaXplX3QgcGVyZl9ldmVudF9fZnByaW50Zl9jb21tKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCBGSUxFICpmcCkKIHsKLQlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSBwZXJmX3Nlc3Npb25fX2ZpbmRuZXcoc2Vzc2lvbiwgZXZlbnQtPmNvbW0udGlkKTsKKwlyZXR1cm4gZnByaW50ZihmcCwgIjogJXM6JWRcbiIsIGV2ZW50LT5jb21tLmNvbW0sIGV2ZW50LT5jb21tLnRpZCk7Cit9CiAKLQlkdW1wX3ByaW50ZigiOiAlczolZFxuIiwgZXZlbnQtPmNvbW0uY29tbSwgZXZlbnQtPmNvbW0udGlkKTsKK2ludCBwZXJmX2V2ZW50X19wcm9jZXNzX2NvbW0oc3RydWN0IHBlcmZfdG9vbCAqdG9vbCBfX3VzZWQsCisJCQkgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSBfX3VzZWQsCisJCQkgICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQoreworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIGV2ZW50LT5jb21tLnRpZCk7CisKKwlpZiAoZHVtcF90cmFjZSkKKwkJcGVyZl9ldmVudF9fZnByaW50Zl9jb21tKGV2ZW50LCBzdGRvdXQpOwogCiAJaWYgKHRocmVhZCA9PSBOVUxMIHx8IHRocmVhZF9fc2V0X2NvbW0odGhyZWFkLCBldmVudC0+Y29tbS5jb21tKSkgewogCQlkdW1wX3ByaW50ZigicHJvYmxlbSBwcm9jZXNzaW5nIFBFUkZfUkVDT1JEX0NPTU0sIHNraXBwaW5nIGV2ZW50LlxuIik7CkBAIC00NDUsMTMgKzUxNCwxMyBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19sb3N0KHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAoraW50IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbG9zdChzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKKwkJCSAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlIF9fdXNlZCwKLQkJCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKKwkJCSAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191c2VkKQogewogCWR1bXBfcHJpbnRmKCI6IGlkOiUiIFBSSXU2NCAiOiBsb3N0OiUiIFBSSXU2NCAiXG4iLAogCQkgICAgZXZlbnQtPmxvc3QuaWQsIGV2ZW50LT5sb3N0Lmxvc3QpOwotCXNlc3Npb24tPmhpc3RzLnN0YXRzLnRvdGFsX2xvc3QgKz0gZXZlbnQtPmxvc3QubG9zdDsKIAlyZXR1cm4gMDsKIH0KIApAQCAtNDY4LDIxICs1MzcsMTUgQEAKIAkJbWFwc1tNQVBfX0ZVTkNUSU9OXS0+ZW5kID0gfjBVTEw7CiB9CiAKLXN0YXRpYyBpbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19rZXJuZWxfbW1hcCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKLQkJCQkJICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKK3N0YXRpYyBpbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19rZXJuZWxfbW1hcChzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKKwkJCQkJICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQkJCSAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKQogewogCXN0cnVjdCBtYXAgKm1hcDsKIAljaGFyIGttbWFwX3ByZWZpeFtQQVRIX01BWF07Ci0Jc3RydWN0IG1hY2hpbmUgKm1hY2hpbmU7CiAJZW51bSBkc29fa2VybmVsX3R5cGUga2VybmVsX3R5cGU7CiAJYm9vbCBpc19rZXJuZWxfbW1hcDsKIAotCW1hY2hpbmUgPSBwZXJmX3Nlc3Npb25fX2ZpbmRuZXdfbWFjaGluZShzZXNzaW9uLCBldmVudC0+bW1hcC5waWQpOwotCWlmICghbWFjaGluZSkgewotCQlwcl9lcnIoIkNhbid0IGZpbmQgaWQgJWQncyBtYWNoaW5lXG4iLCBldmVudC0+bW1hcC5waWQpOwotCQlnb3RvIG91dF9wcm9ibGVtOwotCX0KLQogCW1hY2hpbmVfX21tYXBfbmFtZShtYWNoaW5lLCBrbW1hcF9wcmVmaXgsIHNpemVvZihrbW1hcF9wcmVmaXgpKTsKIAlpZiAobWFjaGluZV9faXNfaG9zdChtYWNoaW5lKSkKIAkJa2VybmVsX3R5cGUgPSBEU09fVFlQRV9LRVJORUw7CkBAIC01NDksOSArNjEyLDkgQEAKIAkJICogdGltZSAvcHJvYy9zeXMva2VybmVsL2twdHJfcmVzdHJpY3Qgd2FzIG5vbiB6ZXJvLgogCQkgKi8KIAkJaWYgKGV2ZW50LT5tbWFwLnBnb2ZmICE9IDApIHsKLQkJCXBlcmZfc2Vzc2lvbl9fc2V0X2thbGxzeW1zX3JlZl9yZWxvY19zeW0obWFjaGluZS0+dm1saW51eF9tYXBzLAotCQkJCQkJCQkgc3ltYm9sX25hbWUsCi0JCQkJCQkJCSBldmVudC0+bW1hcC5wZ29mZik7CisJCQltYXBzX19zZXRfa2FsbHN5bXNfcmVmX3JlbG9jX3N5bShtYWNoaW5lLT52bWxpbnV4X21hcHMsCisJCQkJCQkJIHN5bWJvbF9uYW1lLAorCQkJCQkJCSBldmVudC0+bW1hcC5wZ29mZik7CiAJCX0KIAogCQlpZiAobWFjaGluZV9faXNfZGVmYXVsdF9ndWVzdChtYWNoaW5lKSkgewpAQCAtNTY3LDMyICs2MzAsMzUgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLWludCBwZXJmX2V2ZW50X19wcm9jZXNzX21tYXAodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlIF9fdXNlZCwKLQkJCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKK3NpemVfdCBwZXJmX2V2ZW50X19mcHJpbnRmX21tYXAodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIEZJTEUgKmZwKQogewotCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lOworCXJldHVybiBmcHJpbnRmKGZwLCAiICVkLyVkOiBbJSMiIFBSSXg2NCAiKCUjIiBQUkl4NjQgIikgQCAlIyIgUFJJeDY0ICJdOiAlc1xuIiwKKwkJICAgICAgIGV2ZW50LT5tbWFwLnBpZCwgZXZlbnQtPm1tYXAudGlkLCBldmVudC0+bW1hcC5zdGFydCwKKwkJICAgICAgIGV2ZW50LT5tbWFwLmxlbiwgZXZlbnQtPm1tYXAucGdvZmYsIGV2ZW50LT5tbWFwLmZpbGVuYW1lKTsKK30KKworaW50IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbW1hcChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX191c2VkLAorCQkJICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSkKK3sKIAlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQ7CiAJc3RydWN0IG1hcCAqbWFwOwogCXU4IGNwdW1vZGUgPSBldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX1JFQ09SRF9NSVNDX0NQVU1PREVfTUFTSzsKIAlpbnQgcmV0ID0gMDsKIAotCWR1bXBfcHJpbnRmKCIgJWQvJWQ6IFslIyIgUFJJeDY0ICIoJSMiIFBSSXg2NCAiKSBAICUjIiBQUkl4NjQgIl06ICVzXG4iLAotCQkJZXZlbnQtPm1tYXAucGlkLCBldmVudC0+bW1hcC50aWQsIGV2ZW50LT5tbWFwLnN0YXJ0LAotCQkJZXZlbnQtPm1tYXAubGVuLCBldmVudC0+bW1hcC5wZ29mZiwgZXZlbnQtPm1tYXAuZmlsZW5hbWUpOworCWlmIChkdW1wX3RyYWNlKQorCQlwZXJmX2V2ZW50X19mcHJpbnRmX21tYXAoZXZlbnQsIHN0ZG91dCk7CiAKIAlpZiAoY3B1bW9kZSA9PSBQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX0tFUk5FTCB8fAogCSAgICBjcHVtb2RlID09IFBFUkZfUkVDT1JEX01JU0NfS0VSTkVMKSB7Ci0JCXJldCA9IHBlcmZfZXZlbnRfX3Byb2Nlc3Nfa2VybmVsX21tYXAoZXZlbnQsIHNlc3Npb24pOworCQlyZXQgPSBwZXJmX2V2ZW50X19wcm9jZXNzX2tlcm5lbF9tbWFwKHRvb2wsIGV2ZW50LCBtYWNoaW5lKTsKIAkJaWYgKHJldCA8IDApCiAJCQlnb3RvIG91dF9wcm9ibGVtOwogCQlyZXR1cm4gMDsKIAl9CiAKLQltYWNoaW5lID0gcGVyZl9zZXNzaW9uX19maW5kX2hvc3RfbWFjaGluZShzZXNzaW9uKTsKLQlpZiAobWFjaGluZSA9PSBOVUxMKQotCQlnb3RvIG91dF9wcm9ibGVtOwotCXRocmVhZCA9IHBlcmZfc2Vzc2lvbl9fZmluZG5ldyhzZXNzaW9uLCBldmVudC0+bW1hcC5waWQpOworCXRocmVhZCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIGV2ZW50LT5tbWFwLnBpZCk7CiAJaWYgKHRocmVhZCA9PSBOVUxMKQogCQlnb3RvIG91dF9wcm9ibGVtOwogCW1hcCA9IG1hcF9fbmV3KCZtYWNoaW5lLT51c2VyX2Rzb3MsIGV2ZW50LT5tbWFwLnN0YXJ0LApAQCAtNjEwLDE4ICs2NzYsMjYgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHBlcmZfZXZlbnRfX3Byb2Nlc3NfdGFzayh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKLQkJCSAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX191c2VkLAotCQkJICAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQorc2l6ZV90IHBlcmZfZXZlbnRfX2ZwcmludGZfdGFzayh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgRklMRSAqZnApCiB7Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkID0gcGVyZl9zZXNzaW9uX19maW5kbmV3KHNlc3Npb24sIGV2ZW50LT5mb3JrLnRpZCk7Ci0Jc3RydWN0IHRocmVhZCAqcGFyZW50ID0gcGVyZl9zZXNzaW9uX19maW5kbmV3KHNlc3Npb24sIGV2ZW50LT5mb3JrLnB0aWQpOworCXJldHVybiBmcHJpbnRmKGZwLCAiKCVkOiVkKTooJWQ6JWQpXG4iLAorCQkgICAgICAgZXZlbnQtPmZvcmsucGlkLCBldmVudC0+Zm9yay50aWQsCisJCSAgICAgICBldmVudC0+Zm9yay5wcGlkLCBldmVudC0+Zm9yay5wdGlkKTsKK30KIAotCWR1bXBfcHJpbnRmKCIoJWQ6JWQpOiglZDolZClcbiIsIGV2ZW50LT5mb3JrLnBpZCwgZXZlbnQtPmZvcmsudGlkLAotCQkgICAgZXZlbnQtPmZvcmsucHBpZCwgZXZlbnQtPmZvcmsucHRpZCk7CitpbnQgcGVyZl9ldmVudF9fcHJvY2Vzc190YXNrKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX191c2VkLAorCQkJICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX191c2VkLAorCQkJICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkID0gbWFjaGluZV9fZmluZG5ld190aHJlYWQobWFjaGluZSwgZXZlbnQtPmZvcmsudGlkKTsKKwlzdHJ1Y3QgdGhyZWFkICpwYXJlbnQgPSBtYWNoaW5lX19maW5kbmV3X3RocmVhZChtYWNoaW5lLCBldmVudC0+Zm9yay5wdGlkKTsKKworCWlmIChkdW1wX3RyYWNlKQorCQlwZXJmX2V2ZW50X19mcHJpbnRmX3Rhc2soZXZlbnQsIHN0ZG91dCk7CiAKIAlpZiAoZXZlbnQtPmhlYWRlci50eXBlID09IFBFUkZfUkVDT1JEX0VYSVQpIHsKLQkJcGVyZl9zZXNzaW9uX19yZW1vdmVfdGhyZWFkKHNlc3Npb24sIHRocmVhZCk7CisJCW1hY2hpbmVfX3JlbW92ZV90aHJlYWQobWFjaGluZSwgdGhyZWFkKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC02MzQsMjIgKzcwOCw0NSBAQAogCXJldHVybiAwOwogfQogCi1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzcyh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKQorc2l6ZV90IHBlcmZfZXZlbnRfX2ZwcmludGYodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIEZJTEUgKmZwKQogeworCXNpemVfdCByZXQgPSBmcHJpbnRmKGZwLCAiUEVSRl9SRUNPUkRfJXMiLAorCQkJICAgICBwZXJmX2V2ZW50X19uYW1lKGV2ZW50LT5oZWFkZXIudHlwZSkpOworCiAJc3dpdGNoIChldmVudC0+aGVhZGVyLnR5cGUpIHsKIAljYXNlIFBFUkZfUkVDT1JEX0NPTU06Ci0JCXBlcmZfZXZlbnRfX3Byb2Nlc3NfY29tbShldmVudCwgc2FtcGxlLCBzZXNzaW9uKTsKLQkJYnJlYWs7Ci0JY2FzZSBQRVJGX1JFQ09SRF9NTUFQOgotCQlwZXJmX2V2ZW50X19wcm9jZXNzX21tYXAoZXZlbnQsIHNhbXBsZSwgc2Vzc2lvbik7CisJCXJldCArPSBwZXJmX2V2ZW50X19mcHJpbnRmX2NvbW0oZXZlbnQsIGZwKTsKIAkJYnJlYWs7CiAJY2FzZSBQRVJGX1JFQ09SRF9GT1JLOgogCWNhc2UgUEVSRl9SRUNPUkRfRVhJVDoKLQkJcGVyZl9ldmVudF9fcHJvY2Vzc190YXNrKGV2ZW50LCBzYW1wbGUsIHNlc3Npb24pOworCQlyZXQgKz0gcGVyZl9ldmVudF9fZnByaW50Zl90YXNrKGV2ZW50LCBmcCk7CisJCWJyZWFrOworCWNhc2UgUEVSRl9SRUNPUkRfTU1BUDoKKwkJcmV0ICs9IHBlcmZfZXZlbnRfX2ZwcmludGZfbW1hcChldmVudCwgZnApOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgKz0gZnByaW50ZihmcCwgIlxuIik7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IHBlcmZfZXZlbnRfX3Byb2Nlc3Moc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCit7CisJc3dpdGNoIChldmVudC0+aGVhZGVyLnR5cGUpIHsKKwljYXNlIFBFUkZfUkVDT1JEX0NPTU06CisJCXBlcmZfZXZlbnRfX3Byb2Nlc3NfY29tbSh0b29sLCBldmVudCwgc2FtcGxlLCBtYWNoaW5lKTsKKwkJYnJlYWs7CisJY2FzZSBQRVJGX1JFQ09SRF9NTUFQOgorCQlwZXJmX2V2ZW50X19wcm9jZXNzX21tYXAodG9vbCwgZXZlbnQsIHNhbXBsZSwgbWFjaGluZSk7CisJCWJyZWFrOworCWNhc2UgUEVSRl9SRUNPUkRfRk9SSzoKKwljYXNlIFBFUkZfUkVDT1JEX0VYSVQ6CisJCXBlcmZfZXZlbnRfX3Byb2Nlc3NfdGFzayh0b29sLCBldmVudCwgc2FtcGxlLCBtYWNoaW5lKTsKIAkJYnJlYWs7CiAJY2FzZSBQRVJGX1JFQ09SRF9MT1NUOgotCQlwZXJmX2V2ZW50X19wcm9jZXNzX2xvc3QoZXZlbnQsIHNhbXBsZSwgc2Vzc2lvbik7CisJCXBlcmZfZXZlbnRfX3Byb2Nlc3NfbG9zdCh0b29sLCBldmVudCwgc2FtcGxlLCBtYWNoaW5lKTsKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CkBAIC02NTgsMzYgKzc1NSwyOSBAQAogfQogCiB2b2lkIHRocmVhZF9fZmluZF9hZGRyX21hcChzdHJ1Y3QgdGhyZWFkICpzZWxmLAotCQkJICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgdTggY3B1bW9kZSwKLQkJCSAgIGVudW0gbWFwX3R5cGUgdHlwZSwgcGlkX3QgcGlkLCB1NjQgYWRkciwKKwkJCSAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCB1OCBjcHVtb2RlLAorCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCB1NjQgYWRkciwKIAkJCSAgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCkKIHsKIAlzdHJ1Y3QgbWFwX2dyb3VwcyAqbWcgPSAmc2VsZi0+bWc7Ci0Jc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgPSBOVUxMOwogCiAJYWwtPnRocmVhZCA9IHNlbGY7CiAJYWwtPmFkZHIgPSBhZGRyOwogCWFsLT5jcHVtb2RlID0gY3B1bW9kZTsKIAlhbC0+ZmlsdGVyZWQgPSBmYWxzZTsKIAorCWlmIChtYWNoaW5lID09IE5VTEwpIHsKKwkJYWwtPm1hcCA9IE5VTEw7CisJCXJldHVybjsKKwl9CisKIAlpZiAoY3B1bW9kZSA9PSBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTCAmJiBwZXJmX2hvc3QpIHsKIAkJYWwtPmxldmVsID0gJ2snOwotCQltYWNoaW5lID0gcGVyZl9zZXNzaW9uX19maW5kX2hvc3RfbWFjaGluZShzZXNzaW9uKTsKLQkJaWYgKG1hY2hpbmUgPT0gTlVMTCkgewotCQkJYWwtPm1hcCA9IE5VTEw7Ci0JCQlyZXR1cm47Ci0JCX0KIAkJbWcgPSAmbWFjaGluZS0+a21hcHM7CiAJfSBlbHNlIGlmIChjcHVtb2RlID09IFBFUkZfUkVDT1JEX01JU0NfVVNFUiAmJiBwZXJmX2hvc3QpIHsKIAkJYWwtPmxldmVsID0gJy4nOwotCQltYWNoaW5lID0gcGVyZl9zZXNzaW9uX19maW5kX2hvc3RfbWFjaGluZShzZXNzaW9uKTsKIAl9IGVsc2UgaWYgKGNwdW1vZGUgPT0gUEVSRl9SRUNPUkRfTUlTQ19HVUVTVF9LRVJORUwgJiYgcGVyZl9ndWVzdCkgewogCQlhbC0+bGV2ZWwgPSAnZyc7Ci0JCW1hY2hpbmUgPSBwZXJmX3Nlc3Npb25fX2ZpbmRfbWFjaGluZShzZXNzaW9uLCBwaWQpOwotCQlpZiAobWFjaGluZSA9PSBOVUxMKSB7Ci0JCQlhbC0+bWFwID0gTlVMTDsKLQkJCXJldHVybjsKLQkJfQogCQltZyA9ICZtYWNoaW5lLT5rbWFwczsKIAl9IGVsc2UgewogCQkvKgpAQCAtNzMzLDEzICs4MjMsMTIgQEAKIAkJYWwtPmFkZHIgPSBhbC0+bWFwLT5tYXBfaXAoYWwtPm1hcCwgYWwtPmFkZHIpOwogfQogCi12b2lkIHRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHN0cnVjdCB0aHJlYWQgKnNlbGYsCi0JCQkJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgdTggY3B1bW9kZSwKLQkJCQllbnVtIG1hcF90eXBlIHR5cGUsIHBpZF90IHBpZCwgdTY0IGFkZHIsCit2b2lkIHRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCisJCQkJdTggY3B1bW9kZSwgZW51bSBtYXBfdHlwZSB0eXBlLCB1NjQgYWRkciwKIAkJCQlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCiAJCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKLQl0aHJlYWRfX2ZpbmRfYWRkcl9tYXAoc2VsZiwgc2Vzc2lvbiwgY3B1bW9kZSwgdHlwZSwgcGlkLCBhZGRyLCBhbCk7CisJdGhyZWFkX19maW5kX2FkZHJfbWFwKHRocmVhZCwgbWFjaGluZSwgY3B1bW9kZSwgdHlwZSwgYWRkciwgYWwpOwogCWlmIChhbC0+bWFwICE9IE5VTEwpCiAJCWFsLT5zeW0gPSBtYXBfX2ZpbmRfc3ltYm9sKGFsLT5tYXAsIGFsLT5hZGRyLCBmaWx0ZXIpOwogCWVsc2UKQEAgLTc0NywxMyArODM2LDEzIEBACiB9CiAKIGludCBwZXJmX2V2ZW50X19wcmVwcm9jZXNzX3NhbXBsZShjb25zdCB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKLQkJCQkgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCQkgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKIAkJCQkgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCSAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcikKIHsKIAl1OCBjcHVtb2RlID0gZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9SRUNPUkRfTUlTQ19DUFVNT0RFX01BU0s7Ci0Jc3RydWN0IHRocmVhZCAqdGhyZWFkID0gcGVyZl9zZXNzaW9uX19maW5kbmV3KHNlc3Npb24sIGV2ZW50LT5pcC5waWQpOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IG1hY2hpbmVfX2ZpbmRuZXdfdGhyZWFkKG1hY2hpbmUsIGV2ZW50LT5pcC5waWQpOwogCiAJaWYgKHRocmVhZCA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CkBAIC03NjQsMTggKzg1MywxOCBAQAogCiAJZHVtcF9wcmludGYoIiAuLi4gdGhyZWFkOiAlczolZFxuIiwgdGhyZWFkLT5jb21tLCB0aHJlYWQtPnBpZCk7CiAJLyoKLQkgKiBIYXZlIHdlIGFscmVhZHkgY3JlYXRlZCB0aGUga2VybmVsIG1hcHMgZm9yIHRoZSBob3N0IG1hY2hpbmU/CisJICogSGF2ZSB3ZSBhbHJlYWR5IGNyZWF0ZWQgdGhlIGtlcm5lbCBtYXBzIGZvciB0aGlzIG1hY2hpbmU/CiAJICoKIAkgKiBUaGlzIHNob3VsZCBoYXZlIGhhcHBlbmVkIGVhcmxpZXIsIHdoZW4gd2UgcHJvY2Vzc2VkIHRoZSBrZXJuZWwgTU1BUAogCSAqIGV2ZW50cywgYnV0IGZvciBvbGRlciBwZXJmLmRhdGEgZmlsZXMgdGhlcmUgd2FzIG5vIHN1Y2ggdGhpbmcsIHNvIGRvCiAJICogaXQgbm93LgogCSAqLwogCWlmIChjcHVtb2RlID09IFBFUkZfUkVDT1JEX01JU0NfS0VSTkVMICYmCi0JICAgIHNlc3Npb24tPmhvc3RfbWFjaGluZS52bWxpbnV4X21hcHNbTUFQX19GVU5DVElPTl0gPT0gTlVMTCkKLQkJbWFjaGluZV9fY3JlYXRlX2tlcm5lbF9tYXBzKCZzZXNzaW9uLT5ob3N0X21hY2hpbmUpOworCSAgICBtYWNoaW5lLT52bWxpbnV4X21hcHNbTUFQX19GVU5DVElPTl0gPT0gTlVMTCkKKwkJbWFjaGluZV9fY3JlYXRlX2tlcm5lbF9tYXBzKG1hY2hpbmUpOwogCi0JdGhyZWFkX19maW5kX2FkZHJfbWFwKHRocmVhZCwgc2Vzc2lvbiwgY3B1bW9kZSwgTUFQX19GVU5DVElPTiwKLQkJCSAgICAgIGV2ZW50LT5pcC5waWQsIGV2ZW50LT5pcC5pcCwgYWwpOworCXRocmVhZF9fZmluZF9hZGRyX21hcCh0aHJlYWQsIG1hY2hpbmUsIGNwdW1vZGUsIE1BUF9fRlVOQ1RJT04sCisJCQkgICAgICBldmVudC0+aXAuaXAsIGFsKTsKIAlkdW1wX3ByaW50ZigiIC4uLi4uLiBkc286ICVzXG4iLAogCQkgICAgYWwtPm1hcCA/IGFsLT5tYXAtPmRzby0+bG9uZ19uYW1lIDoKIAkJCWFsLT5sZXZlbCA9PSAnSCcgPyAiW2h5cGVydmlzb3JdIiA6ICI8bm90IGZvdW5kPiIpOwpAQCAtNzgzLDEzICs4NzIsMTQgQEAKIAlhbC0+Y3B1ID0gc2FtcGxlLT5jcHU7CiAKIAlpZiAoYWwtPm1hcCkgeworCQlzdHJ1Y3QgZHNvICpkc28gPSBhbC0+bWFwLT5kc287CisKIAkJaWYgKHN5bWJvbF9jb25mLmRzb19saXN0ICYmCi0JCSAgICAoIWFsLT5tYXAgfHwgIWFsLT5tYXAtPmRzbyB8fAotCQkgICAgICEoc3RybGlzdF9faGFzX2VudHJ5KHN5bWJvbF9jb25mLmRzb19saXN0LAotCQkJCQkgIGFsLT5tYXAtPmRzby0+c2hvcnRfbmFtZSkgfHwKLQkJICAgICAgIChhbC0+bWFwLT5kc28tPnNob3J0X25hbWUgIT0gYWwtPm1hcC0+ZHNvLT5sb25nX25hbWUgJiYKLQkJCXN0cmxpc3RfX2hhc19lbnRyeShzeW1ib2xfY29uZi5kc29fbGlzdCwKLQkJCQkJICAgYWwtPm1hcC0+ZHNvLT5sb25nX25hbWUpKSkpKQorCQkgICAgKCFkc28gfHwgIShzdHJsaXN0X19oYXNfZW50cnkoc3ltYm9sX2NvbmYuZHNvX2xpc3QsCisJCQkJCQkgIGRzby0+c2hvcnRfbmFtZSkgfHwKKwkJCSAgICAgICAoZHNvLT5zaG9ydF9uYW1lICE9IGRzby0+bG9uZ19uYW1lICYmCisJCQkJc3RybGlzdF9faGFzX2VudHJ5KHN5bWJvbF9jb25mLmRzb19saXN0LAorCQkJCQkJICAgZHNvLT5sb25nX25hbWUpKSkpKQogCQkJZ290byBvdXRfZmlsdGVyZWQ7CiAKIAkJYWwtPnN5bSA9IG1hcF9fZmluZF9zeW1ib2woYWwtPm1hcCwgYWwtPmFkZHIsIGZpbHRlcik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZlbnQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oCmluZGV4IDM1N2E4NWIuLmNiZGVhYWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmVudC5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfX1BFUkZfUkVDT1JEX0gKIAogI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAKICNpbmNsdWRlICIuLi9wZXJmLmgiCiAjaW5jbHVkZSAibWFwLmgiCkBAIC0xNDEsNDMgKzE0Miw1NCBAQAogCiB2b2lkIHBlcmZfZXZlbnRfX3ByaW50X3RvdGFscyh2b2lkKTsKIAotc3RydWN0IHBlcmZfc2Vzc2lvbjsKK3N0cnVjdCBwZXJmX3Rvb2w7CiBzdHJ1Y3QgdGhyZWFkX21hcDsKIAotdHlwZWRlZiBpbnQgKCpwZXJmX2V2ZW50X19oYW5kbGVyX3N5bnRoX3QpKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCAKLQkJCQkJICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci10eXBlZGVmIGludCAoKnBlcmZfZXZlbnRfX2hhbmRsZXJfdCkodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCit0eXBlZGVmIGludCAoKnBlcmZfZXZlbnRfX2hhbmRsZXJfdCkoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQkgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7CisJCQkJICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7CiAKLWludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX3RocmVhZF9tYXAoc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsCitpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRfbWFwKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJICAgICAgc3RydWN0IHRocmVhZF9tYXAgKnRocmVhZHMsCiAJCQkJICAgICAgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci1pbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV90aHJlYWRzKHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAotCQkJCSAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pOwotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfa2VybmVsX21tYXAocGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCi0JCQkJICAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOworaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfdGhyZWFkcyhzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgIHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAorCQkJCSAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKTsKK2ludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX2tlcm5lbF9tbWFwKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJICAgICAgIHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAogCQkJCSAgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCQkgICAgICAgY29uc3QgY2hhciAqc3ltYm9sX25hbWUpOwogCi1pbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tb2R1bGVzKHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAotCQkJCSAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCitpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9tb2R1bGVzKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJICAgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCiAJCQkJICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOwogCi1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19jb21tKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKLQkJCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19sb3N0KHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKLQkJCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19tbWFwKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKLQkJCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzc190YXNrKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKLQkJCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzcyh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKTsKK2ludCBwZXJmX2V2ZW50X19wcm9jZXNzX2NvbW0oc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCSAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7CitpbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19sb3N0KHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCSAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOworaW50IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbW1hcChzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJICAgICB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkgICAgIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKTsKK2ludCBwZXJmX2V2ZW50X19wcm9jZXNzX3Rhc2soc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCSAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7CitpbnQgcGVyZl9ldmVudF9fcHJvY2VzcyhzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQlzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lKTsKIAogc3RydWN0IGFkZHJfbG9jYXRpb247CiBpbnQgcGVyZl9ldmVudF9fcHJlcHJvY2Vzc19zYW1wbGUoY29uc3QgdW5pb24gcGVyZl9ldmVudCAqc2VsZiwKLQkJCQkgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKIAkJCQkgIHN0cnVjdCBhZGRyX2xvY2F0aW9uICphbCwKIAkJCQkgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAogCQkJCSAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CkBAIC0xODcsNSArMTk5LDEzIEBACiBpbnQgcGVyZl9ldmVudF9fcGFyc2Vfc2FtcGxlKGNvbnN0IHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCB1NjQgdHlwZSwKIAkJCSAgICAgaW50IHNhbXBsZV9zaXplLCBib29sIHNhbXBsZV9pZF9hbGwsCiAJCQkgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLCBib29sIHN3YXBwZWQpOworaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfc2FtcGxlKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCB1NjQgdHlwZSwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJCSAgYm9vbCBzd2FwcGVkKTsKKworc2l6ZV90IHBlcmZfZXZlbnRfX2ZwcmludGZfY29tbSh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgRklMRSAqZnApOworc2l6ZV90IHBlcmZfZXZlbnRfX2ZwcmludGZfbW1hcCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgRklMRSAqZnApOworc2l6ZV90IHBlcmZfZXZlbnRfX2ZwcmludGZfdGFzayh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgRklMRSAqZnApOworc2l6ZV90IHBlcmZfZXZlbnRfX2ZwcmludGYodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIEZJTEUgKmZwKTsKIAogI2VuZGlmIC8qIF9fUEVSRl9SRUNPUkRfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5jCmluZGV4IGZiYjRiNGEuLmZhMTgzNzAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuYworKysgYi90b29scy9wZXJmL3V0aWwvZXZsaXN0LmMKQEAgLTYsMTIgKzYsMTYgQEAKICAqCiAgKiBSZWxlYXNlZCB1bmRlciB0aGUgR1BMIHYyLiAoYW5kIG9ubHkgdjIsIG5vdCBhbnkgbGF0ZXIgdmVyc2lvbikKICAqLworI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlICJkZWJ1Z2ZzLmgiCiAjaW5jbHVkZSA8cG9sbC5oPgogI2luY2x1ZGUgImNwdW1hcC5oIgogI2luY2x1ZGUgInRocmVhZF9tYXAuaCIKICNpbmNsdWRlICJldmxpc3QuaCIKICNpbmNsdWRlICJldnNlbC5oIgotI2luY2x1ZGUgInV0aWwuaCIKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgInBhcnNlLWV2ZW50cy5oIgogCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KIApAQCAtMzAsNiArMzQsNyBAQAogCQlJTklUX0hMSVNUX0hFQUQoJmV2bGlzdC0+aGVhZHNbaV0pOwogCUlOSVRfTElTVF9IRUFEKCZldmxpc3QtPmVudHJpZXMpOwogCXBlcmZfZXZsaXN0X19zZXRfbWFwcyhldmxpc3QsIGNwdXMsIHRocmVhZHMpOworCWV2bGlzdC0+d29ya2xvYWQucGlkID0gLTE7CiB9CiAKIHN0cnVjdCBwZXJmX2V2bGlzdCAqcGVyZl9ldmxpc3RfX25ldyhzdHJ1Y3QgY3B1X21hcCAqY3B1cywKQEAgLTQzLDYgKzQ4LDIyIEBACiAJcmV0dXJuIGV2bGlzdDsKIH0KIAordm9pZCBwZXJmX2V2bGlzdF9fY29uZmlnX2F0dHJzKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAorCQkJICAgICAgIHN0cnVjdCBwZXJmX3JlY29yZF9vcHRzICpvcHRzKQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKworCWlmIChldmxpc3QtPmNwdXMtPm1hcFswXSA8IDApCisJCW9wdHMtPm5vX2luaGVyaXQgPSB0cnVlOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShldnNlbCwgJmV2bGlzdC0+ZW50cmllcywgbm9kZSkgeworCQlwZXJmX2V2c2VsX19jb25maWcoZXZzZWwsIG9wdHMpOworCisJCWlmIChldmxpc3QtPm5yX2VudHJpZXMgPiAxKQorCQkJZXZzZWwtPmF0dHIuc2FtcGxlX3R5cGUgfD0gUEVSRl9TQU1QTEVfSUQ7CisJfQorfQorCiBzdGF0aWMgdm9pZCBwZXJmX2V2bGlzdF9fcHVyZ2Uoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCiB7CiAJc3RydWN0IHBlcmZfZXZzZWwgKnBvcywgKm47CkBAIC03Niw2ICs5NywxNCBAQAogCSsrZXZsaXN0LT5ucl9lbnRyaWVzOwogfQogCitzdGF0aWMgdm9pZCBwZXJmX2V2bGlzdF9fc3BsaWNlX2xpc3RfdGFpbChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCQkgIGludCBucl9lbnRyaWVzKQoreworCWxpc3Rfc3BsaWNlX3RhaWwobGlzdCwgJmV2bGlzdC0+ZW50cmllcyk7CisJZXZsaXN0LT5ucl9lbnRyaWVzICs9IG5yX2VudHJpZXM7Cit9CisKIGludCBwZXJmX2V2bGlzdF9fYWRkX2RlZmF1bHQoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCiB7CiAJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciBhdHRyID0gewpAQCAtMTAwLDYgKzEyOSwxMjYgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAoraW50IHBlcmZfZXZsaXN0X19hZGRfYXR0cnMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkgICBzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRycywgc2l6ZV90IG5yX2F0dHJzKQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgKm47CisJTElTVF9IRUFEKGhlYWQpOworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2F0dHJzOyBpKyspIHsKKwkJZXZzZWwgPSBwZXJmX2V2c2VsX19uZXcoYXR0cnMgKyBpLCBldmxpc3QtPm5yX2VudHJpZXMgKyBpKTsKKwkJaWYgKGV2c2VsID09IE5VTEwpCisJCQlnb3RvIG91dF9kZWxldGVfcGFydGlhbF9saXN0OworCQlsaXN0X2FkZF90YWlsKCZldnNlbC0+bm9kZSwgJmhlYWQpOworCX0KKworCXBlcmZfZXZsaXN0X19zcGxpY2VfbGlzdF90YWlsKGV2bGlzdCwgJmhlYWQsIG5yX2F0dHJzKTsKKworCXJldHVybiAwOworCitvdXRfZGVsZXRlX3BhcnRpYWxfbGlzdDoKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZXZzZWwsIG4sICZoZWFkLCBub2RlKQorCQlwZXJmX2V2c2VsX19kZWxldGUoZXZzZWwpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCB0cmFjZV9ldmVudF9faWQoY29uc3QgY2hhciAqZXZuYW1lKQoreworCWNoYXIgKmZpbGVuYW1lLCAqY29sb247CisJaW50IGVyciA9IC0xLCBmZDsKKworCWlmIChhc3ByaW50ZigmZmlsZW5hbWUsICIlcy8lcy9pZCIsIHRyYWNpbmdfZXZlbnRzX3BhdGgsIGV2bmFtZSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwljb2xvbiA9IHN0cnJjaHIoZmlsZW5hbWUsICc6Jyk7CisJaWYgKGNvbG9uICE9IE5VTEwpCisJCSpjb2xvbiA9ICcvJzsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA+PSAwKSB7CisJCWNoYXIgaWRbMTZdOworCQlpZiAocmVhZChmZCwgaWQsIHNpemVvZihpZCkpID4gMCkKKwkJCWVyciA9IGF0b2koaWQpOworCQljbG9zZShmZCk7CisJfQorCisJZnJlZShmaWxlbmFtZSk7CisJcmV0dXJuIGVycjsKK30KKworaW50IHBlcmZfZXZsaXN0X19hZGRfdHJhY2Vwb2ludHMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkJIGNvbnN0IGNoYXIgKnRyYWNlcG9pbnRzW10sCisJCQkJIHNpemVfdCBucl90cmFjZXBvaW50cykKK3sKKwlpbnQgZXJyOworCXNpemVfdCBpOworCXN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHJzID0gemFsbG9jKG5yX3RyYWNlcG9pbnRzICogc2l6ZW9mKCphdHRycykpOworCisJaWYgKGF0dHJzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBucl90cmFjZXBvaW50czsgaSsrKSB7CisJCWVyciA9IHRyYWNlX2V2ZW50X19pZCh0cmFjZXBvaW50c1tpXSk7CisKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF9mcmVlX2F0dHJzOworCisJCWF0dHJzW2ldLnR5cGUJICAgICAgID0gUEVSRl9UWVBFX1RSQUNFUE9JTlQ7CisJCWF0dHJzW2ldLmNvbmZpZwkgICAgICAgPSBlcnI7CisJICAgICAgICBhdHRyc1tpXS5zYW1wbGVfdHlwZSAgID0gKFBFUkZfU0FNUExFX1JBVyB8IFBFUkZfU0FNUExFX1RJTUUgfAorCQkJCQkgIFBFUkZfU0FNUExFX0NQVSk7CisJCWF0dHJzW2ldLnNhbXBsZV9wZXJpb2QgPSAxOworCX0KKworCWVyciA9IHBlcmZfZXZsaXN0X19hZGRfYXR0cnMoZXZsaXN0LCBhdHRycywgbnJfdHJhY2Vwb2ludHMpOworb3V0X2ZyZWVfYXR0cnM6CisJZnJlZShhdHRycyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBwZXJmX2V2c2VsICoKKwlwZXJmX2V2bGlzdF9fZmluZF90cmFjZXBvaW50X2J5X2lkKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBpbnQgaWQpCit7CisJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShldnNlbCwgJmV2bGlzdC0+ZW50cmllcywgbm9kZSkgeworCQlpZiAoZXZzZWwtPmF0dHIudHlwZSAgID09IFBFUkZfVFlQRV9UUkFDRVBPSU5UICYmCisJCSAgICAoaW50KWV2c2VsLT5hdHRyLmNvbmZpZyA9PSBpZCkKKwkJCXJldHVybiBldnNlbDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IHBlcmZfZXZsaXN0X19zZXRfdHJhY2Vwb2ludHNfaGFuZGxlcnMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkJCSAgY29uc3Qgc3RydWN0IHBlcmZfZXZzZWxfc3RyX2hhbmRsZXIgKmFzc29jcywKKwkJCQkJICBzaXplX3QgbnJfYXNzb2NzKQoreworCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKKwlpbnQgZXJyOworCXNpemVfdCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2Fzc29jczsgaSsrKSB7CisJCWVyciA9IHRyYWNlX2V2ZW50X19pZChhc3NvY3NbaV0ubmFtZSk7CisJCWlmIChlcnIgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJZXZzZWwgPSBwZXJmX2V2bGlzdF9fZmluZF90cmFjZXBvaW50X2J5X2lkKGV2bGlzdCwgZXJyKTsKKwkJaWYgKGV2c2VsID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQllcnIgPSAtRUVYSVNUOworCQlpZiAoZXZzZWwtPmhhbmRsZXIuZnVuYyAhPSBOVUxMKQorCQkJZ290byBvdXQ7CisJCWV2c2VsLT5oYW5kbGVyLmZ1bmMgPSBhc3NvY3NbaV0uaGFuZGxlcjsKKwl9CisKKwllcnIgPSAwOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKIHZvaWQgcGVyZl9ldmxpc3RfX2Rpc2FibGUoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCiB7CiAJaW50IGNwdSwgdGhyZWFkOwpAQCAtMTI2LDcgKzI3NSw3IEBACiAJfQogfQogCi1pbnQgcGVyZl9ldmxpc3RfX2FsbG9jX3BvbGxmZChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK3N0YXRpYyBpbnQgcGVyZl9ldmxpc3RfX2FsbG9jX3BvbGxmZChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKIHsKIAlpbnQgbmZkcyA9IGV2bGlzdC0+Y3B1cy0+bnIgKiBldmxpc3QtPnRocmVhZHMtPm5yICogZXZsaXN0LT5ucl9lbnRyaWVzOwogCWV2bGlzdC0+cG9sbGZkID0gbWFsbG9jKHNpemVvZihzdHJ1Y3QgcG9sbGZkKSAqIG5mZHMpOwpAQCAtMjgyLDcgKzQzMSw3IEBACiAJZXZsaXN0LT5tbWFwID0gTlVMTDsKIH0KIAotaW50IHBlcmZfZXZsaXN0X19hbGxvY19tbWFwKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQorc3RhdGljIGludCBwZXJmX2V2bGlzdF9fYWxsb2NfbW1hcChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKIHsKIAlldmxpc3QtPm5yX21tYXBzID0gZXZsaXN0LT5jcHVzLT5ucjsKIAlpZiAoZXZsaXN0LT5jcHVzLT5tYXBbMF0gPT0gLTEpCkBAIC0yOTgsOCArNDQ3LDEwIEBACiAJZXZsaXN0LT5tbWFwW2lkeF0ubWFzayA9IG1hc2s7CiAJZXZsaXN0LT5tbWFwW2lkeF0uYmFzZSA9IG1tYXAoTlVMTCwgZXZsaXN0LT5tbWFwX2xlbiwgcHJvdCwKIAkJCQkgICAgICBNQVBfU0hBUkVELCBmZCwgMCk7Ci0JaWYgKGV2bGlzdC0+bW1hcFtpZHhdLmJhc2UgPT0gTUFQX0ZBSUxFRCkKKwlpZiAoZXZsaXN0LT5tbWFwW2lkeF0uYmFzZSA9PSBNQVBfRkFJTEVEKSB7CisJCWV2bGlzdC0+bW1hcFtpZHhdLmJhc2UgPSBOVUxMOwogCQlyZXR1cm4gLTE7CisJfQogCiAJcGVyZl9ldmxpc3RfX2FkZF9wb2xsZmQoZXZsaXN0LCBmZCk7CiAJcmV0dXJuIDA7CkBAIC00MDAsMTQgKzU1MSwyMiBAQAogICoKICAqIFVzaW5nIHBlcmZfZXZsaXN0X19yZWFkX29uX2NwdSBkb2VzIHRoaXMgYXV0b21hdGljYWxseS4KICAqLwotaW50IHBlcmZfZXZsaXN0X19tbWFwKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBpbnQgcGFnZXMsIGJvb2wgb3ZlcndyaXRlKQoraW50IHBlcmZfZXZsaXN0X19tbWFwKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCB1bnNpZ25lZCBpbnQgcGFnZXMsCisJCSAgICAgIGJvb2wgb3ZlcndyaXRlKQogewogCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBzeXNjb25mKF9TQ19QQUdFX1NJWkUpOwotCWludCBtYXNrID0gcGFnZXMgKiBwYWdlX3NpemUgLSAxOwogCXN0cnVjdCBwZXJmX2V2c2VsICpldnNlbDsKIAljb25zdCBzdHJ1Y3QgY3B1X21hcCAqY3B1cyA9IGV2bGlzdC0+Y3B1czsKIAljb25zdCBzdHJ1Y3QgdGhyZWFkX21hcCAqdGhyZWFkcyA9IGV2bGlzdC0+dGhyZWFkczsKLQlpbnQgcHJvdCA9IFBST1RfUkVBRCB8IChvdmVyd3JpdGUgPyAwIDogUFJPVF9XUklURSk7CisJaW50IHByb3QgPSBQUk9UX1JFQUQgfCAob3ZlcndyaXRlID8gMCA6IFBST1RfV1JJVEUpLCBtYXNrOworCisgICAgICAgIC8qIDUxMiBraUI6IGRlZmF1bHQgYW1vdW50IG9mIHVucHJpdmlsZWdlZCBtbG9ja2VkIG1lbW9yeSAqLworICAgICAgICBpZiAocGFnZXMgPT0gVUlOVF9NQVgpCisgICAgICAgICAgICAgICAgcGFnZXMgPSAoNTEyICogMTAyNCkgLyBwYWdlX3NpemU7CisJZWxzZSBpZiAoIWlzX3Bvd2VyX29mXzIocGFnZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1hc2sgPSBwYWdlcyAqIHBhZ2Vfc2l6ZSAtIDE7CiAKIAlpZiAoZXZsaXN0LT5tbWFwID09IE5VTEwgJiYgcGVyZl9ldmxpc3RfX2FsbG9jX21tYXAoZXZsaXN0KSA8IDApCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNTEyLDYgKzY3MSwzOCBAQAogCXJldHVybiBmaXJzdC0+YXR0ci5zYW1wbGVfdHlwZTsKIH0KIAordTE2IHBlcmZfZXZsaXN0X19pZF9oZHJfc2l6ZShjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCkKK3sKKwlzdHJ1Y3QgcGVyZl9ldnNlbCAqZmlyc3Q7CisJc3RydWN0IHBlcmZfc2FtcGxlICpkYXRhOworCXU2NCBzYW1wbGVfdHlwZTsKKwl1MTYgc2l6ZSA9IDA7CisKKwlmaXJzdCA9IGxpc3RfZW50cnkoZXZsaXN0LT5lbnRyaWVzLm5leHQsIHN0cnVjdCBwZXJmX2V2c2VsLCBub2RlKTsKKworCWlmICghZmlyc3QtPmF0dHIuc2FtcGxlX2lkX2FsbCkKKwkJZ290byBvdXQ7CisKKwlzYW1wbGVfdHlwZSA9IGZpcnN0LT5hdHRyLnNhbXBsZV90eXBlOworCisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElEKQorCQlzaXplICs9IHNpemVvZihkYXRhLT50aWQpICogMjsKKworICAgICAgIGlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1RJTUUpCisJCXNpemUgKz0gc2l6ZW9mKGRhdGEtPnRpbWUpOworCisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfSUQpCisJCXNpemUgKz0gc2l6ZW9mKGRhdGEtPmlkKTsKKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1NUUkVBTV9JRCkKKwkJc2l6ZSArPSBzaXplb2YoZGF0YS0+c3RyZWFtX2lkKTsKKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NQVSkKKwkJc2l6ZSArPSBzaXplb2YoZGF0YS0+Y3B1KSAqIDI7CitvdXQ6CisJcmV0dXJuIHNpemU7Cit9CisKIGJvb2wgcGVyZl9ldmxpc3RfX3ZhbGlkX3NhbXBsZV9pZF9hbGwoY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCiB7CiAJc3RydWN0IHBlcmZfZXZzZWwgKnBvcywgKmZpcnN0OwpAQCAtNTY5LDMgKzc2MCw5NyBAQAogCiAJcmV0dXJuIGVycjsKIH0KKworaW50IHBlcmZfZXZsaXN0X19wcmVwYXJlX3dvcmtsb2FkKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAorCQkJCSAgc3RydWN0IHBlcmZfcmVjb3JkX29wdHMgKm9wdHMsCisJCQkJICBjb25zdCBjaGFyICphcmd2W10pCit7CisJaW50IGNoaWxkX3JlYWR5X3BpcGVbMl0sIGdvX3BpcGVbMl07CisJY2hhciBiZjsKKworCWlmIChwaXBlKGNoaWxkX3JlYWR5X3BpcGUpIDwgMCkgeworCQlwZXJyb3IoImZhaWxlZCB0byBjcmVhdGUgJ3JlYWR5JyBwaXBlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocGlwZShnb19waXBlKSA8IDApIHsKKwkJcGVycm9yKCJmYWlsZWQgdG8gY3JlYXRlICdnbycgcGlwZSIpOworCQlnb3RvIG91dF9jbG9zZV9yZWFkeV9waXBlOworCX0KKworCWV2bGlzdC0+d29ya2xvYWQucGlkID0gZm9yaygpOworCWlmIChldmxpc3QtPndvcmtsb2FkLnBpZCA8IDApIHsKKwkJcGVycm9yKCJmYWlsZWQgdG8gZm9yayIpOworCQlnb3RvIG91dF9jbG9zZV9waXBlczsKKwl9CisKKwlpZiAoIWV2bGlzdC0+d29ya2xvYWQucGlkKSB7CisJCWlmIChvcHRzLT5waXBlX291dHB1dCkKKwkJCWR1cDIoMiwgMSk7CisKKwkJY2xvc2UoY2hpbGRfcmVhZHlfcGlwZVswXSk7CisJCWNsb3NlKGdvX3BpcGVbMV0pOworCQlmY250bChnb19waXBlWzBdLCBGX1NFVEZELCBGRF9DTE9FWEVDKTsKKworCQkvKgorCQkgKiBEbyBhIGR1bW15IGV4ZWN2cCB0byBnZXQgdGhlIFBMVCBlbnRyeSByZXNvbHZlZCwKKwkJICogc28gd2UgYXZvaWQgdGhlIHJlc29sdmVyIG92ZXJoZWFkIG9uIHRoZSByZWFsCisJCSAqIGV4ZWN2cCBjYWxsLgorCQkgKi8KKwkJZXhlY3ZwKCIiLCAoY2hhciAqKilhcmd2KTsKKworCQkvKgorCQkgKiBUZWxsIHRoZSBwYXJlbnQgd2UncmUgcmVhZHkgdG8gZ28KKwkJICovCisJCWNsb3NlKGNoaWxkX3JlYWR5X3BpcGVbMV0pOworCisJCS8qCisJCSAqIFdhaXQgdW50aWwgdGhlIHBhcmVudCB0ZWxscyB1cyB0byBnby4KKwkJICovCisJCWlmIChyZWFkKGdvX3BpcGVbMF0sICZiZiwgMSkgPT0gLTEpCisJCQlwZXJyb3IoInVuYWJsZSB0byByZWFkIHBpcGUiKTsKKworCQlleGVjdnAoYXJndlswXSwgKGNoYXIgKiopYXJndik7CisKKwkJcGVycm9yKGFyZ3ZbMF0pOworCQlraWxsKGdldHBwaWQoKSwgU0lHVVNSMSk7CisJCWV4aXQoLTEpOworCX0KKworCWlmICghb3B0cy0+c3lzdGVtX3dpZGUgJiYgb3B0cy0+dGFyZ2V0X3RpZCA9PSAtMSAmJiBvcHRzLT50YXJnZXRfcGlkID09IC0xKQorCQlldmxpc3QtPnRocmVhZHMtPm1hcFswXSA9IGV2bGlzdC0+d29ya2xvYWQucGlkOworCisJY2xvc2UoY2hpbGRfcmVhZHlfcGlwZVsxXSk7CisJY2xvc2UoZ29fcGlwZVswXSk7CisJLyoKKwkgKiB3YWl0IGZvciBjaGlsZCB0byBzZXR0bGUKKwkgKi8KKwlpZiAocmVhZChjaGlsZF9yZWFkeV9waXBlWzBdLCAmYmYsIDEpID09IC0xKSB7CisJCXBlcnJvcigidW5hYmxlIHRvIHJlYWQgcGlwZSIpOworCQlnb3RvIG91dF9jbG9zZV9waXBlczsKKwl9CisKKwlldmxpc3QtPndvcmtsb2FkLmNvcmtfZmQgPSBnb19waXBlWzFdOworCWNsb3NlKGNoaWxkX3JlYWR5X3BpcGVbMF0pOworCXJldHVybiAwOworCitvdXRfY2xvc2VfcGlwZXM6CisJY2xvc2UoZ29fcGlwZVswXSk7CisJY2xvc2UoZ29fcGlwZVsxXSk7CitvdXRfY2xvc2VfcmVhZHlfcGlwZToKKwljbG9zZShjaGlsZF9yZWFkeV9waXBlWzBdKTsKKwljbG9zZShjaGlsZF9yZWFkeV9waXBlWzFdKTsKKwlyZXR1cm4gLTE7Cit9CisKK2ludCBwZXJmX2V2bGlzdF9fc3RhcnRfd29ya2xvYWQoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCit7CisJaWYgKGV2bGlzdC0+d29ya2xvYWQuY29ya19mZCA+IDApIHsKKwkJLyoKKwkJICogUmVtb3ZlIHRoZSBjb3JrLCBsZXQgaXQgcmlwIQorCQkgKi8KKwkJcmV0dXJuIGNsb3NlKGV2bGlzdC0+d29ya2xvYWQuY29ya19mZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZXZsaXN0LmggYi90b29scy9wZXJmL3V0aWwvZXZsaXN0LmgKaW5kZXggMTc3OWZmZS4uODkyMmFlZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2bGlzdC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ldmxpc3QuaApAQCAtMiwxMiArMiwxNiBAQAogI2RlZmluZSBfX1BFUkZfRVZMSVNUX0ggMQogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAiLi4vcGVyZi5oIgogI2luY2x1ZGUgImV2ZW50LmgiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiBzdHJ1Y3QgcG9sbGZkOwogc3RydWN0IHRocmVhZF9tYXA7CiBzdHJ1Y3QgY3B1X21hcDsKK3N0cnVjdCBwZXJmX3JlY29yZF9vcHRzOwogCiAjZGVmaW5lIFBFUkZfRVZMSVNUX19ITElTVF9CSVRTIDgKICNkZWZpbmUgUEVSRl9FVkxJU1RfX0hMSVNUX1NJWkUgKDEgPDwgUEVSRl9FVkxJU1RfX0hMSVNUX0JJVFMpCkBAIC0xOSw2ICsyMywxMCBAQAogCWludAkJIG5yX2ZkczsKIAlpbnQJCSBucl9tbWFwczsKIAlpbnQJCSBtbWFwX2xlbjsKKwlzdHJ1Y3QgeworCQlpbnQJY29ya19mZDsKKwkJcGlkX3QJcGlkOworCX0gd29ya2xvYWQ7CiAJYm9vbAkJIG92ZXJ3cml0ZTsKIAl1bmlvbiBwZXJmX2V2ZW50IGV2ZW50X2NvcHk7CiAJc3RydWN0IHBlcmZfbW1hcCAqbW1hcDsKQEAgLTI4LDYgKzM2LDExIEBACiAJc3RydWN0IHBlcmZfZXZzZWwgKnNlbGVjdGVkOwogfTsKIAorc3RydWN0IHBlcmZfZXZzZWxfc3RyX2hhbmRsZXIgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdm9pZAkgICAqaGFuZGxlcjsKK307CisKIHN0cnVjdCBwZXJmX2V2c2VsOwogCiBzdHJ1Y3QgcGVyZl9ldmxpc3QgKnBlcmZfZXZsaXN0X19uZXcoc3RydWN0IGNwdV9tYXAgKmNwdXMsCkBAIC0zOSwxMSArNTIsMjYgQEAKIAogdm9pZCBwZXJmX2V2bGlzdF9fYWRkKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZW50cnkpOwogaW50IHBlcmZfZXZsaXN0X19hZGRfZGVmYXVsdChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CitpbnQgcGVyZl9ldmxpc3RfX2FkZF9hdHRycyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCSAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHJzLCBzaXplX3QgbnJfYXR0cnMpOworaW50IHBlcmZfZXZsaXN0X19hZGRfdHJhY2Vwb2ludHMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkJIGNvbnN0IGNoYXIgKnRyYWNlcG9pbnRzW10sIHNpemVfdCBucl90cmFjZXBvaW50cyk7CitpbnQgcGVyZl9ldmxpc3RfX3NldF90cmFjZXBvaW50c19oYW5kbGVycyhzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwKKwkJCQkJICBjb25zdCBzdHJ1Y3QgcGVyZl9ldnNlbF9zdHJfaGFuZGxlciAqYXNzb2NzLAorCQkJCQkgIHNpemVfdCBucl9hc3NvY3MpOworCisjZGVmaW5lIHBlcmZfZXZsaXN0X19hZGRfYXR0cnNfYXJyYXkoZXZsaXN0LCBhcnJheSkgXAorCXBlcmZfZXZsaXN0X19hZGRfYXR0cnMoZXZsaXN0LCBhcnJheSwgQVJSQVlfU0laRShhcnJheSkpCisKKyNkZWZpbmUgcGVyZl9ldmxpc3RfX2FkZF90cmFjZXBvaW50c19hcnJheShldmxpc3QsIGFycmF5KSBcCisJcGVyZl9ldmxpc3RfX2FkZF90cmFjZXBvaW50cyhldmxpc3QsIGFycmF5LCBBUlJBWV9TSVpFKGFycmF5KSkKKworI2RlZmluZSBwZXJmX2V2bGlzdF9fc2V0X3RyYWNlcG9pbnRzX2hhbmRsZXJzX2FycmF5KGV2bGlzdCwgYXJyYXkpIFwKKwlwZXJmX2V2bGlzdF9fc2V0X3RyYWNlcG9pbnRzX2hhbmRsZXJzKGV2bGlzdCwgYXJyYXksIEFSUkFZX1NJWkUoYXJyYXkpKQogCiB2b2lkIHBlcmZfZXZsaXN0X19pZF9hZGQoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKIAkJCSBpbnQgY3B1LCBpbnQgdGhyZWFkLCB1NjQgaWQpOwogCi1pbnQgcGVyZl9ldmxpc3RfX2FsbG9jX3BvbGxmZChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CiB2b2lkIHBlcmZfZXZsaXN0X19hZGRfcG9sbGZkKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBpbnQgZmQpOwogCiBzdHJ1Y3QgcGVyZl9ldnNlbCAqcGVyZl9ldmxpc3RfX2lkMmV2c2VsKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCB1NjQgaWQpOwpAQCAtNTIsOCArODAsMTYgQEAKIAogaW50IHBlcmZfZXZsaXN0X19vcGVuKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCBib29sIGdyb3VwKTsKIAotaW50IHBlcmZfZXZsaXN0X19hbGxvY19tbWFwKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKLWludCBwZXJmX2V2bGlzdF9fbW1hcChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgaW50IHBhZ2VzLCBib29sIG92ZXJ3cml0ZSk7Cit2b2lkIHBlcmZfZXZsaXN0X19jb25maWdfYXR0cnMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkgICAgICAgc3RydWN0IHBlcmZfcmVjb3JkX29wdHMgKm9wdHMpOworCitpbnQgcGVyZl9ldmxpc3RfX3ByZXBhcmVfd29ya2xvYWQoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkJICBzdHJ1Y3QgcGVyZl9yZWNvcmRfb3B0cyAqb3B0cywKKwkJCQkgIGNvbnN0IGNoYXIgKmFyZ3ZbXSk7CitpbnQgcGVyZl9ldmxpc3RfX3N0YXJ0X3dvcmtsb2FkKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKKworaW50IHBlcmZfZXZsaXN0X19tbWFwKHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LCB1bnNpZ25lZCBpbnQgcGFnZXMsCisJCSAgICAgIGJvb2wgb3ZlcndyaXRlKTsKIHZvaWQgcGVyZl9ldmxpc3RfX211bm1hcChzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CiAKIHZvaWQgcGVyZl9ldmxpc3RfX2Rpc2FibGUoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOwpAQCAtNzcsNiArMTEzLDcgQEAKIAogdTY0IHBlcmZfZXZsaXN0X19zYW1wbGVfdHlwZShjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CiBib29sIHBlcmZfZXZsaXN0X19zYW1wbGVfaWRfYWxsKGNvbnN0IGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKK3UxNiBwZXJmX2V2bGlzdF9faWRfaGRyX3NpemUoY29uc3Qgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpOwogCiBib29sIHBlcmZfZXZsaXN0X192YWxpZF9zYW1wbGVfdHlwZShjb25zdCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCk7CiBib29sIHBlcmZfZXZsaXN0X192YWxpZF9zYW1wbGVfaWRfYWxsKGNvbnN0IHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5jIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMKaW5kZXggZTQyNjI2NC4uNjY3ZjNiNyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmMKQEAgLTM0LDYgKzM0LDE2IEBACiAJcmV0dXJuIHNpemU7CiB9CiAKK3N0YXRpYyB2b2lkIGhpc3RzX19pbml0KHN0cnVjdCBoaXN0cyAqaGlzdHMpCit7CisJbWVtc2V0KGhpc3RzLCAwLCBzaXplb2YoKmhpc3RzKSk7CisJaGlzdHMtPmVudHJpZXNfaW5fYXJyYXlbMF0gPSBoaXN0cy0+ZW50cmllc19pbl9hcnJheVsxXSA9IFJCX1JPT1Q7CisJaGlzdHMtPmVudHJpZXNfaW4gPSAmaGlzdHMtPmVudHJpZXNfaW5fYXJyYXlbMF07CisJaGlzdHMtPmVudHJpZXNfY29sbGFwc2VkID0gUkJfUk9PVDsKKwloaXN0cy0+ZW50cmllcyA9IFJCX1JPT1Q7CisJcHRocmVhZF9tdXRleF9pbml0KCZoaXN0cy0+bG9jaywgTlVMTCk7Cit9CisKIHZvaWQgcGVyZl9ldnNlbF9faW5pdChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCiAJCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIGludCBpZHgpCiB7CkBAIC01Myw2ICs2Myw3OSBAQAogCXJldHVybiBldnNlbDsKIH0KIAordm9pZCBwZXJmX2V2c2VsX19jb25maWcoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBzdHJ1Y3QgcGVyZl9yZWNvcmRfb3B0cyAqb3B0cykKK3sKKwlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyID0gJmV2c2VsLT5hdHRyOworCWludCB0cmFjayA9ICFldnNlbC0+aWR4OyAvKiBvbmx5IHRoZSBmaXJzdCBjb3VudGVyIG5lZWRzIHRoZXNlICovCisKKwlhdHRyLT5zYW1wbGVfaWRfYWxsID0gb3B0cy0+c2FtcGxlX2lkX2FsbF9hdmFpbCA/IDEgOiAwOworCWF0dHItPmluaGVyaXQJICAgID0gIW9wdHMtPm5vX2luaGVyaXQ7CisJYXR0ci0+cmVhZF9mb3JtYXQgICA9IFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRCB8CisJCQkgICAgICBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX1JVTk5JTkcgfAorCQkJICAgICAgUEVSRl9GT1JNQVRfSUQ7CisKKwlhdHRyLT5zYW1wbGVfdHlwZSAgfD0gUEVSRl9TQU1QTEVfSVAgfCBQRVJGX1NBTVBMRV9USUQ7CisKKwkvKgorCSAqIFdlIGRlZmF1bHQgc29tZSBldmVudHMgdG8gYSAxIGRlZmF1bHQgaW50ZXJ2YWwuIEJ1dCBrZWVwCisJICogaXQgYSB3ZWFrIGFzc3VtcHRpb24gb3ZlcnJpZGFibGUgYnkgdGhlIHVzZXIuCisJICovCisJaWYgKCFhdHRyLT5zYW1wbGVfcGVyaW9kIHx8IChvcHRzLT51c2VyX2ZyZXEgIT0gVUlOVF9NQVggJiYKKwkJCQkgICAgIG9wdHMtPnVzZXJfaW50ZXJ2YWwgIT0gVUxMT05HX01BWCkpIHsKKwkJaWYgKG9wdHMtPmZyZXEpIHsKKwkJCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX1BFUklPRDsKKwkJCWF0dHItPmZyZXEJCT0gMTsKKwkJCWF0dHItPnNhbXBsZV9mcmVxCT0gb3B0cy0+ZnJlcTsKKwkJfSBlbHNlIHsKKwkJCWF0dHItPnNhbXBsZV9wZXJpb2QgPSBvcHRzLT5kZWZhdWx0X2ludGVydmFsOworCQl9CisJfQorCisJaWYgKG9wdHMtPm5vX3NhbXBsZXMpCisJCWF0dHItPnNhbXBsZV9mcmVxID0gMDsKKworCWlmIChvcHRzLT5pbmhlcml0X3N0YXQpCisJCWF0dHItPmluaGVyaXRfc3RhdCA9IDE7CisKKwlpZiAob3B0cy0+c2FtcGxlX2FkZHJlc3MpIHsKKwkJYXR0ci0+c2FtcGxlX3R5cGUJfD0gUEVSRl9TQU1QTEVfQUREUjsKKwkJYXR0ci0+bW1hcF9kYXRhID0gdHJhY2s7CisJfQorCisJaWYgKG9wdHMtPmNhbGxfZ3JhcGgpCisJCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX0NBTExDSEFJTjsKKworCWlmIChvcHRzLT5zeXN0ZW1fd2lkZSkKKwkJYXR0ci0+c2FtcGxlX3R5cGUJfD0gUEVSRl9TQU1QTEVfQ1BVOworCisJaWYgKG9wdHMtPnBlcmlvZCkKKwkJYXR0ci0+c2FtcGxlX3R5cGUJfD0gUEVSRl9TQU1QTEVfUEVSSU9EOworCisJaWYgKG9wdHMtPnNhbXBsZV9pZF9hbGxfYXZhaWwgJiYKKwkgICAgKG9wdHMtPnNhbXBsZV90aW1lIHx8IG9wdHMtPnN5c3RlbV93aWRlIHx8CisJICAgICAhb3B0cy0+bm9faW5oZXJpdCB8fCBvcHRzLT5jcHVfbGlzdCkpCisJCWF0dHItPnNhbXBsZV90eXBlCXw9IFBFUkZfU0FNUExFX1RJTUU7CisKKwlpZiAob3B0cy0+cmF3X3NhbXBsZXMpIHsKKwkJYXR0ci0+c2FtcGxlX3R5cGUJfD0gUEVSRl9TQU1QTEVfVElNRTsKKwkJYXR0ci0+c2FtcGxlX3R5cGUJfD0gUEVSRl9TQU1QTEVfUkFXOworCQlhdHRyLT5zYW1wbGVfdHlwZQl8PSBQRVJGX1NBTVBMRV9DUFU7CisJfQorCisJaWYgKG9wdHMtPm5vX2RlbGF5KSB7CisJCWF0dHItPndhdGVybWFyayA9IDA7CisJCWF0dHItPndha2V1cF9ldmVudHMgPSAxOworCX0KKworCWF0dHItPm1tYXAgPSB0cmFjazsKKwlhdHRyLT5jb21tID0gdHJhY2s7CisKKwlpZiAob3B0cy0+dGFyZ2V0X3BpZCA9PSAtMSAmJiBvcHRzLT50YXJnZXRfdGlkID09IC0xICYmICFvcHRzLT5zeXN0ZW1fd2lkZSkgeworCQlhdHRyLT5kaXNhYmxlZCA9IDE7CisJCWF0dHItPmVuYWJsZV9vbl9leGVjID0gMTsKKwl9Cit9CisKIGludCBwZXJmX2V2c2VsX19hbGxvY19mZChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGludCBuY3B1cywgaW50IG50aHJlYWRzKQogewogCWludCBjcHUsIHRocmVhZDsKQEAgLTM3Nyw3ICs0NjAsNyBAQAogCQl1MzIgdmFsMzJbMl07CiAJfSB1OwogCi0KKwltZW1zZXQoZGF0YSwgMCwgc2l6ZW9mKCpkYXRhKSk7CiAJZGF0YS0+Y3B1ID0gZGF0YS0+cGlkID0gZGF0YS0+dGlkID0gLTE7CiAJZGF0YS0+c3RyZWFtX2lkID0gZGF0YS0+aWQgPSBkYXRhLT50aW1lID0gLTFVTEw7CiAKQEAgLTQ5NCwzICs1NzcsODIgQEAKIAogCXJldHVybiAwOwogfQorCitpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9zYW1wbGUodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIHU2NCB0eXBlLAorCQkJCSAgY29uc3Qgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkJICBib29sIHN3YXBwZWQpCit7CisJdTY0ICphcnJheTsKKworCS8qCisJICogdXNlZCBmb3IgY3Jvc3MtZW5kaWFuIGFuYWx5c2lzLiBTZWUgZ2l0IGNvbW1pdCA2NTAxNGFiMworCSAqIGZvciB3aHkgdGhpcyBnb29maW5lc3MgaXMgbmVlZGVkLgorCSAqLworCXVuaW9uIHsKKwkJdTY0IHZhbDY0OworCQl1MzIgdmFsMzJbMl07CisJfSB1OworCisJYXJyYXkgPSBldmVudC0+c2FtcGxlLmFycmF5OworCisJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9JUCkgeworCQlldmVudC0+aXAuaXAgPSBzYW1wbGUtPmlwOworCQlhcnJheSsrOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfVElEKSB7CisJCXUudmFsMzJbMF0gPSBzYW1wbGUtPnBpZDsKKwkJdS52YWwzMlsxXSA9IHNhbXBsZS0+dGlkOworCQlpZiAoc3dhcHBlZCkgeworCQkJLyoKKwkJCSAqIEludmVyc2Ugb2Ygd2hhdCBpcyBkb25lIGluIHBlcmZfZXZlbnRfX3BhcnNlX3NhbXBsZQorCQkJICovCisJCQl1LnZhbDMyWzBdID0gYnN3YXBfMzIodS52YWwzMlswXSk7CisJCQl1LnZhbDMyWzFdID0gYnN3YXBfMzIodS52YWwzMlsxXSk7CisJCQl1LnZhbDY0ID0gYnN3YXBfNjQodS52YWw2NCk7CisJCX0KKworCQkqYXJyYXkgPSB1LnZhbDY0OworCQlhcnJheSsrOworCX0KKworCWlmICh0eXBlICYgUEVSRl9TQU1QTEVfVElNRSkgeworCQkqYXJyYXkgPSBzYW1wbGUtPnRpbWU7CisJCWFycmF5Kys7CisJfQorCisJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9BRERSKSB7CisJCSphcnJheSA9IHNhbXBsZS0+YWRkcjsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX0lEKSB7CisJCSphcnJheSA9IHNhbXBsZS0+aWQ7CisJCWFycmF5Kys7CisJfQorCisJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9TVFJFQU1fSUQpIHsKKwkJKmFycmF5ID0gc2FtcGxlLT5zdHJlYW1faWQ7CisJCWFycmF5Kys7CisJfQorCisJaWYgKHR5cGUgJiBQRVJGX1NBTVBMRV9DUFUpIHsKKwkJdS52YWwzMlswXSA9IHNhbXBsZS0+Y3B1OworCQlpZiAoc3dhcHBlZCkgeworCQkJLyoKKwkJCSAqIEludmVyc2Ugb2Ygd2hhdCBpcyBkb25lIGluIHBlcmZfZXZlbnRfX3BhcnNlX3NhbXBsZQorCQkJICovCisJCQl1LnZhbDMyWzBdID0gYnN3YXBfMzIodS52YWwzMlswXSk7CisJCQl1LnZhbDY0ID0gYnN3YXBfNjQodS52YWw2NCk7CisJCX0KKwkJKmFycmF5ID0gdS52YWw2NDsKKwkJYXJyYXkrKzsKKwl9CisKKwlpZiAodHlwZSAmIFBFUkZfU0FNUExFX1BFUklPRCkgeworCQkqYXJyYXkgPSBzYW1wbGUtPnBlcmlvZDsKKwkJYXJyYXkrKzsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ldnNlbC5oIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKaW5kZXggYjFkMTVlNi4uMzI2YjhlNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V2c2VsLmgKQEAgLTYxLDEyICs2MSwxNyBAQAogCQlvZmZfdAkJaWRfb2Zmc2V0OwogCX07CiAJc3RydWN0IGNncm91cF9zZWwJKmNncnA7CisJc3RydWN0IHsKKwkJdm9pZAkJKmZ1bmM7CisJCXZvaWQJCSpkYXRhOworCX0gaGFuZGxlcjsKIAlib29sIAkJCXN1cHBvcnRlZDsKIH07CiAKIHN0cnVjdCBjcHVfbWFwOwogc3RydWN0IHRocmVhZF9tYXA7CiBzdHJ1Y3QgcGVyZl9ldmxpc3Q7CitzdHJ1Y3QgcGVyZl9yZWNvcmRfb3B0czsKIAogc3RydWN0IHBlcmZfZXZzZWwgKnBlcmZfZXZzZWxfX25ldyhzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCBpbnQgaWR4KTsKIHZvaWQgcGVyZl9ldnNlbF9faW5pdChzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCkBAIC03NCw2ICs3OSw5IEBACiB2b2lkIHBlcmZfZXZzZWxfX2V4aXQoc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsKTsKIHZvaWQgcGVyZl9ldnNlbF9fZGVsZXRlKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCk7CiAKK3ZvaWQgcGVyZl9ldnNlbF9fY29uZmlnKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCXN0cnVjdCBwZXJmX3JlY29yZF9vcHRzICpvcHRzKTsKKwogaW50IHBlcmZfZXZzZWxfX2FsbG9jX2ZkKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgaW50IG5jcHVzLCBpbnQgbnRocmVhZHMpOwogaW50IHBlcmZfZXZzZWxfX2FsbG9jX2lkKHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwgaW50IG5jcHVzLCBpbnQgbnRocmVhZHMpOwogaW50IHBlcmZfZXZzZWxfX2FsbG9jX2NvdW50cyhzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsIGludCBuY3B1cyk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMgYi90b29scy9wZXJmL3V0aWwvaGVhZGVyLmMKaW5kZXggYmNkMDVkMC4uM2U3ZTBiMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuYwpAQCAtOCw2ICs4LDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CiAjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KIAogI2luY2x1ZGUgImV2bGlzdC5oIgpAQCAtMjgsOSArMjksNiBAQAogc3RhdGljIHUzMiBoZWFkZXJfYXJnYzsKIHN0YXRpYyBjb25zdCBjaGFyICoqaGVhZGVyX2FyZ3Y7CiAKLXN0YXRpYyBpbnQgZHNvc19fd3JpdGVfYnVpbGRpZF90YWJsZShzdHJ1Y3QgcGVyZl9oZWFkZXIgKmhlYWRlciwgaW50IGZkKTsKLXN0YXRpYyBpbnQgcGVyZl9zZXNzaW9uX19jYWNoZV9idWlsZF9pZHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci0KIGludCBwZXJmX2hlYWRlcl9fcHVzaF9ldmVudCh1NjQgaWQsIGNvbnN0IGNoYXIgKm5hbWUpCiB7CiAJaWYgKHN0cmxlbihuYW1lKSA+IE1BWF9FVkVOVF9OQU1FKQpAQCAtMTg3LDYgKzE4NSwyNTIgQEAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBkc29zX19mb3JfZWFjaF93aXRoX2J1aWxkX2lkKHBvcywgaGVhZCkJXAorCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBub2RlKQlcCisJCWlmICghcG9zLT5oYXNfYnVpbGRfaWQpCQlcCisJCQljb250aW51ZTsJCVwKKwkJZWxzZQorCitzdGF0aWMgaW50IF9fZHNvc19fd3JpdGVfYnVpbGRpZF90YWJsZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBwaWRfdCBwaWQsCisJCQkJdTE2IG1pc2MsIGludCBmZCkKK3sKKwlzdHJ1Y3QgZHNvICpwb3M7CisKKwlkc29zX19mb3JfZWFjaF93aXRoX2J1aWxkX2lkKHBvcywgaGVhZCkgeworCQlpbnQgZXJyOworCQlzdHJ1Y3QgYnVpbGRfaWRfZXZlbnQgYjsKKwkJc2l6ZV90IGxlbjsKKworCQlpZiAoIXBvcy0+aGl0KQorCQkJY29udGludWU7CisJCWxlbiA9IHBvcy0+bG9uZ19uYW1lX2xlbiArIDE7CisJCWxlbiA9IEFMSUdOKGxlbiwgTkFNRV9BTElHTik7CisJCW1lbXNldCgmYiwgMCwgc2l6ZW9mKGIpKTsKKwkJbWVtY3B5KCZiLmJ1aWxkX2lkLCBwb3MtPmJ1aWxkX2lkLCBzaXplb2YocG9zLT5idWlsZF9pZCkpOworCQliLnBpZCA9IHBpZDsKKwkJYi5oZWFkZXIubWlzYyA9IG1pc2M7CisJCWIuaGVhZGVyLnNpemUgPSBzaXplb2YoYikgKyBsZW47CisJCWVyciA9IGRvX3dyaXRlKGZkLCAmYiwgc2l6ZW9mKGIpKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCQllcnIgPSB3cml0ZV9wYWRkZWQoZmQsIHBvcy0+bG9uZ19uYW1lLAorCQkJCSAgIHBvcy0+bG9uZ19uYW1lX2xlbiArIDEsIGxlbik7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYWNoaW5lX193cml0ZV9idWlsZGlkX3RhYmxlKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBpbnQgZmQpCit7CisJaW50IGVycjsKKwl1MTYga21pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTCwKKwkgICAgdW1pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX1VTRVI7CisKKwlpZiAoIW1hY2hpbmVfX2lzX2hvc3QobWFjaGluZSkpIHsKKwkJa21pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX0tFUk5FTDsKKwkJdW1pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX1VTRVI7CisJfQorCisJZXJyID0gX19kc29zX193cml0ZV9idWlsZGlkX3RhYmxlKCZtYWNoaW5lLT5rZXJuZWxfZHNvcywgbWFjaGluZS0+cGlkLAorCQkJCQkgIGttaXNjLCBmZCk7CisJaWYgKGVyciA9PSAwKQorCQllcnIgPSBfX2Rzb3NfX3dyaXRlX2J1aWxkaWRfdGFibGUoJm1hY2hpbmUtPnVzZXJfZHNvcywKKwkJCQkJCSAgbWFjaGluZS0+cGlkLCB1bWlzYywgZmQpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZHNvc19fd3JpdGVfYnVpbGRpZF90YWJsZShzdHJ1Y3QgcGVyZl9oZWFkZXIgKmhlYWRlciwgaW50IGZkKQoreworCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gPSBjb250YWluZXJfb2YoaGVhZGVyLAorCQkJc3RydWN0IHBlcmZfc2Vzc2lvbiwgaGVhZGVyKTsKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CisJaW50IGVyciA9IG1hY2hpbmVfX3dyaXRlX2J1aWxkaWRfdGFibGUoJnNlc3Npb24tPmhvc3RfbWFjaGluZSwgZmQpOworCisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAobmQgPSByYl9maXJzdCgmc2Vzc2lvbi0+bWFjaGluZXMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQlzdHJ1Y3QgbWFjaGluZSAqcG9zID0gcmJfZW50cnkobmQsIHN0cnVjdCBtYWNoaW5lLCByYl9ub2RlKTsKKwkJZXJyID0gbWFjaGluZV9fd3JpdGVfYnVpbGRpZF90YWJsZShwb3MsIGZkKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZXJyOworfQorCitpbnQgYnVpbGRfaWRfY2FjaGVfX2FkZF9zKGNvbnN0IGNoYXIgKnNidWlsZF9pZCwgY29uc3QgY2hhciAqZGVidWdkaXIsCisJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgaXNfa2FsbHN5bXMpCit7CisJY29uc3Qgc2l6ZV90IHNpemUgPSBQQVRIX01BWDsKKwljaGFyICpyZWFsbmFtZSwgKmZpbGVuYW1lID0gemFsbG9jKHNpemUpLAorCSAgICAgKmxpbmtuYW1lID0gemFsbG9jKHNpemUpLCAqdGFyZ2V0bmFtZTsKKwlpbnQgbGVuLCBlcnIgPSAtMTsKKworCWlmIChpc19rYWxsc3ltcykgeworCQlpZiAoc3ltYm9sX2NvbmYua3B0cl9yZXN0cmljdCkgeworCQkJcHJfZGVidWcoIk5vdCBjYWNoaW5nIGEga3B0cl9yZXN0cmljdCdlZCAvcHJvYy9rYWxsc3ltc1xuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZWFsbmFtZSA9IChjaGFyICopbmFtZTsKKwl9IGVsc2UKKwkJcmVhbG5hbWUgPSByZWFscGF0aChuYW1lLCBOVUxMKTsKKworCWlmIChyZWFsbmFtZSA9PSBOVUxMIHx8IGZpbGVuYW1lID09IE5VTEwgfHwgbGlua25hbWUgPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZTsKKworCWxlbiA9IHNucHJpbnRmKGZpbGVuYW1lLCBzaXplLCAiJXMlcyVzIiwKKwkJICAgICAgIGRlYnVnZGlyLCBpc19rYWxsc3ltcyA/ICIvIiA6ICIiLCByZWFsbmFtZSk7CisJaWYgKG1rZGlyX3AoZmlsZW5hbWUsIDA3NTUpKQorCQlnb3RvIG91dF9mcmVlOworCisJc25wcmludGYoZmlsZW5hbWUgKyBsZW4sIHNpemVvZihmaWxlbmFtZSkgLSBsZW4sICIvJXMiLCBzYnVpbGRfaWQpOworCisJaWYgKGFjY2VzcyhmaWxlbmFtZSwgRl9PSykpIHsKKwkJaWYgKGlzX2thbGxzeW1zKSB7CisJCQkgaWYgKGNvcHlmaWxlKCIvcHJvYy9rYWxsc3ltcyIsIGZpbGVuYW1lKSkKKwkJCQlnb3RvIG91dF9mcmVlOworCQl9IGVsc2UgaWYgKGxpbmsocmVhbG5hbWUsIGZpbGVuYW1lKSAmJiBjb3B5ZmlsZShuYW1lLCBmaWxlbmFtZSkpCisJCQlnb3RvIG91dF9mcmVlOworCX0KKworCWxlbiA9IHNucHJpbnRmKGxpbmtuYW1lLCBzaXplLCAiJXMvLmJ1aWxkLWlkLyUuMnMiLAorCQkgICAgICAgZGVidWdkaXIsIHNidWlsZF9pZCk7CisKKwlpZiAoYWNjZXNzKGxpbmtuYW1lLCBYX09LKSAmJiBta2Rpcl9wKGxpbmtuYW1lLCAwNzU1KSkKKwkJZ290byBvdXRfZnJlZTsKKworCXNucHJpbnRmKGxpbmtuYW1lICsgbGVuLCBzaXplIC0gbGVuLCAiLyVzIiwgc2J1aWxkX2lkICsgMik7CisJdGFyZ2V0bmFtZSA9IGZpbGVuYW1lICsgc3RybGVuKGRlYnVnZGlyKSAtIDU7CisJbWVtY3B5KHRhcmdldG5hbWUsICIuLi8uLiIsIDUpOworCisJaWYgKHN5bWxpbmsodGFyZ2V0bmFtZSwgbGlua25hbWUpID09IDApCisJCWVyciA9IDA7CitvdXRfZnJlZToKKwlpZiAoIWlzX2thbGxzeW1zKQorCQlmcmVlKHJlYWxuYW1lKTsKKwlmcmVlKGZpbGVuYW1lKTsKKwlmcmVlKGxpbmtuYW1lKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGJ1aWxkX2lkX2NhY2hlX19hZGRfYihjb25zdCB1OCAqYnVpbGRfaWQsIHNpemVfdCBidWlsZF9pZF9zaXplLAorCQkJCSBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZWJ1Z2RpciwKKwkJCQkgYm9vbCBpc19rYWxsc3ltcykKK3sKKwljaGFyIHNidWlsZF9pZFtCVUlMRF9JRF9TSVpFICogMiArIDFdOworCisJYnVpbGRfaWRfX3NwcmludGYoYnVpbGRfaWQsIGJ1aWxkX2lkX3NpemUsIHNidWlsZF9pZCk7CisKKwlyZXR1cm4gYnVpbGRfaWRfY2FjaGVfX2FkZF9zKHNidWlsZF9pZCwgZGVidWdkaXIsIG5hbWUsIGlzX2thbGxzeW1zKTsKK30KKworaW50IGJ1aWxkX2lkX2NhY2hlX19yZW1vdmVfcyhjb25zdCBjaGFyICpzYnVpbGRfaWQsIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQoreworCWNvbnN0IHNpemVfdCBzaXplID0gUEFUSF9NQVg7CisJY2hhciAqZmlsZW5hbWUgPSB6YWxsb2Moc2l6ZSksCisJICAgICAqbGlua25hbWUgPSB6YWxsb2Moc2l6ZSk7CisJaW50IGVyciA9IC0xOworCisJaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgbGlua25hbWUgPT0gTlVMTCkKKwkJZ290byBvdXRfZnJlZTsKKworCXNucHJpbnRmKGxpbmtuYW1lLCBzaXplLCAiJXMvLmJ1aWxkLWlkLyUuMnMvJXMiLAorCQkgZGVidWdkaXIsIHNidWlsZF9pZCwgc2J1aWxkX2lkICsgMik7CisKKwlpZiAoYWNjZXNzKGxpbmtuYW1lLCBGX09LKSkKKwkJZ290byBvdXRfZnJlZTsKKworCWlmIChyZWFkbGluayhsaW5rbmFtZSwgZmlsZW5hbWUsIHNpemUgLSAxKSA8IDApCisJCWdvdG8gb3V0X2ZyZWU7CisKKwlpZiAodW5saW5rKGxpbmtuYW1lKSkKKwkJZ290byBvdXRfZnJlZTsKKworCS8qCisJICogU2luY2UgdGhlIGxpbmsgaXMgcmVsYXRpdmUsIHdlIG11c3QgbWFrZSBpdCBhYnNvbHV0ZToKKwkgKi8KKwlzbnByaW50ZihsaW5rbmFtZSwgc2l6ZSwgIiVzLy5idWlsZC1pZC8lLjJzLyVzIiwKKwkJIGRlYnVnZGlyLCBzYnVpbGRfaWQsIGZpbGVuYW1lKTsKKworCWlmICh1bmxpbmsobGlua25hbWUpKQorCQlnb3RvIG91dF9mcmVlOworCisJZXJyID0gMDsKK291dF9mcmVlOgorCWZyZWUoZmlsZW5hbWUpOworCWZyZWUobGlua25hbWUpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZHNvX19jYWNoZV9idWlsZF9pZChzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQoreworCWJvb2wgaXNfa2FsbHN5bXMgPSBkc28tPmtlcm5lbCAmJiBkc28tPmxvbmdfbmFtZVswXSAhPSAnLyc7CisKKwlyZXR1cm4gYnVpbGRfaWRfY2FjaGVfX2FkZF9iKGRzby0+YnVpbGRfaWQsIHNpemVvZihkc28tPmJ1aWxkX2lkKSwKKwkJCQkgICAgIGRzby0+bG9uZ19uYW1lLCBkZWJ1Z2RpciwgaXNfa2FsbHN5bXMpOworfQorCitzdGF0aWMgaW50IF9fZHNvc19fY2FjaGVfYnVpbGRfaWRzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQoreworCXN0cnVjdCBkc28gKnBvczsKKwlpbnQgZXJyID0gMDsKKworCWRzb3NfX2Zvcl9lYWNoX3dpdGhfYnVpbGRfaWQocG9zLCBoZWFkKQorCQlpZiAoZHNvX19jYWNoZV9idWlsZF9pZChwb3MsIGRlYnVnZGlyKSkKKwkJCWVyciA9IC0xOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBtYWNoaW5lX19jYWNoZV9idWlsZF9pZHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQoreworCWludCByZXQgPSBfX2Rzb3NfX2NhY2hlX2J1aWxkX2lkcygmbWFjaGluZS0+a2VybmVsX2Rzb3MsIGRlYnVnZGlyKTsKKwlyZXQgfD0gX19kc29zX19jYWNoZV9idWlsZF9pZHMoJm1hY2hpbmUtPnVzZXJfZHNvcywgZGVidWdkaXIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9zZXNzaW9uX19jYWNoZV9idWlsZF9pZHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQ7CisJaW50IHJldDsKKwljaGFyIGRlYnVnZGlyW1BBVEhfTUFYXTsKKworCXNucHJpbnRmKGRlYnVnZGlyLCBzaXplb2YoZGVidWdkaXIpLCAiJXMiLCBidWlsZGlkX2Rpcik7CisKKwlpZiAobWtkaXIoZGVidWdkaXIsIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKQorCQlyZXR1cm4gLTE7CisKKwlyZXQgPSBtYWNoaW5lX19jYWNoZV9idWlsZF9pZHMoJnNlc3Npb24tPmhvc3RfbWFjaGluZSwgZGVidWdkaXIpOworCisJZm9yIChuZCA9IHJiX2ZpcnN0KCZzZXNzaW9uLT5tYWNoaW5lcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJCXN0cnVjdCBtYWNoaW5lICpwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IG1hY2hpbmUsIHJiX25vZGUpOworCQlyZXQgfD0gbWFjaGluZV9fY2FjaGVfYnVpbGRfaWRzKHBvcywgZGVidWdkaXIpOworCX0KKwlyZXR1cm4gcmV0ID8gLTEgOiAwOworfQorCitzdGF0aWMgYm9vbCBtYWNoaW5lX19yZWFkX2J1aWxkX2lkcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgYm9vbCB3aXRoX2hpdHMpCit7CisJYm9vbCByZXQgPSBfX2Rzb3NfX3JlYWRfYnVpbGRfaWRzKCZtYWNoaW5lLT5rZXJuZWxfZHNvcywgd2l0aF9oaXRzKTsKKwlyZXQgfD0gX19kc29zX19yZWFkX2J1aWxkX2lkcygmbWFjaGluZS0+dXNlcl9kc29zLCB3aXRoX2hpdHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBib29sIHBlcmZfc2Vzc2lvbl9fcmVhZF9idWlsZF9pZHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgYm9vbCB3aXRoX2hpdHMpCit7CisJc3RydWN0IHJiX25vZGUgKm5kOworCWJvb2wgcmV0ID0gbWFjaGluZV9fcmVhZF9idWlsZF9pZHMoJnNlc3Npb24tPmhvc3RfbWFjaGluZSwgd2l0aF9oaXRzKTsKKworCWZvciAobmQgPSByYl9maXJzdCgmc2Vzc2lvbi0+bWFjaGluZXMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQlzdHJ1Y3QgbWFjaGluZSAqcG9zID0gcmJfZW50cnkobmQsIHN0cnVjdCBtYWNoaW5lLCByYl9ub2RlKTsKKwkJcmV0IHw9IG1hY2hpbmVfX3JlYWRfYnVpbGRfaWRzKHBvcywgd2l0aF9oaXRzKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiBzdGF0aWMgaW50IHdyaXRlX3RyYWNlX2luZm8oaW50IGZkLCBzdHJ1Y3QgcGVyZl9oZWFkZXIgKmggX191c2VkLAogCQkJICAgIHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0KQogewpAQCAtMjAyLDYgKzQ0Niw5IEBACiAKIAlzZXNzaW9uID0gY29udGFpbmVyX29mKGgsIHN0cnVjdCBwZXJmX3Nlc3Npb24sIGhlYWRlcik7CiAKKwlpZiAoIXBlcmZfc2Vzc2lvbl9fcmVhZF9idWlsZF9pZHMoc2Vzc2lvbiwgdHJ1ZSkpCisJCXJldHVybiAtMTsKKwogCWVyciA9IGRzb3NfX3dyaXRlX2J1aWxkaWRfdGFibGUoaCwgZmQpOwogCWlmIChlcnIgPCAwKSB7CiAJCXByX2RlYnVnKCJmYWlsZWQgdG8gd3JpdGUgYnVpbGRpZCB0YWJsZVxuIik7CkBAIC0zODgsNyArNjM1LDcgQEAKIAkJLyoKIAkJICogd3JpdGUgZXZlbnQgc3RyaW5nIGFzIHBhc3NlZCBvbiBjbWRsaW5lCiAJCSAqLwotCQlyZXQgPSBkb193cml0ZV9zdHJpbmcoZmQsIGF0dHItPm5hbWUpOworCQlyZXQgPSBkb193cml0ZV9zdHJpbmcoZmQsIGV2ZW50X25hbWUoYXR0cikpOwogCQlpZiAocmV0IDwgMCkKIAkJCXJldHVybiByZXQ7CiAJCS8qCkBAIC0xMDY1LDI2ICsxMzEyLDMwIEBACiAJYm9vbCBmdWxsX29ubHk7CiB9OwogCi0jZGVmaW5lIEZFQVRfT1BBKG4sIHcsIHApIFwKLQlbbl0gPSB7IC5uYW1lID0gI24sIC53cml0ZSA9IHcsIC5wcmludCA9IHAgfQotI2RlZmluZSBGRUFUX09QRihuLCB3LCBwKSBcCi0JW25dID0geyAubmFtZSA9ICNuLCAud3JpdGUgPSB3LCAucHJpbnQgPSBwLCAuZnVsbF9vbmx5ID0gdHJ1ZSB9CisjZGVmaW5lIEZFQVRfT1BBKG4sIGZ1bmMpIFwKKwlbbl0gPSB7IC5uYW1lID0gI24sIC53cml0ZSA9IHdyaXRlXyMjZnVuYywgLnByaW50ID0gcHJpbnRfIyNmdW5jIH0KKyNkZWZpbmUgRkVBVF9PUEYobiwgZnVuYykgXAorCVtuXSA9IHsgLm5hbWUgPSAjbiwgLndyaXRlID0gd3JpdGVfIyNmdW5jLCAucHJpbnQgPSBwcmludF8jI2Z1bmMsIC5mdWxsX29ubHkgPSB0cnVlIH0KKworLyogZmVhdHVyZV9vcHMgbm90IGltcGxlbWVudGVkOiAqLworI2RlZmluZSBwcmludF90cmFjZV9pbmZvCQlOVUxMCisjZGVmaW5lIHByaW50X2J1aWxkX2lkCQkJTlVMTAogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGZlYXR1cmVfb3BzIGZlYXRfb3BzW0hFQURFUl9MQVNUX0ZFQVRVUkVdID0gewotCUZFQVRfT1BBKEhFQURFUl9UUkFDRV9JTkZPLCB3cml0ZV90cmFjZV9pbmZvLCBOVUxMKSwKLQlGRUFUX09QQShIRUFERVJfQlVJTERfSUQsIHdyaXRlX2J1aWxkX2lkLCBOVUxMKSwKLQlGRUFUX09QQShIRUFERVJfSE9TVE5BTUUsIHdyaXRlX2hvc3RuYW1lLCBwcmludF9ob3N0bmFtZSksCi0JRkVBVF9PUEEoSEVBREVSX09TUkVMRUFTRSwgd3JpdGVfb3NyZWxlYXNlLCBwcmludF9vc3JlbGVhc2UpLAotCUZFQVRfT1BBKEhFQURFUl9WRVJTSU9OLCB3cml0ZV92ZXJzaW9uLCBwcmludF92ZXJzaW9uKSwKLQlGRUFUX09QQShIRUFERVJfQVJDSCwgd3JpdGVfYXJjaCwgcHJpbnRfYXJjaCksCi0JRkVBVF9PUEEoSEVBREVSX05SQ1BVUywgd3JpdGVfbnJjcHVzLCBwcmludF9ucmNwdXMpLAotCUZFQVRfT1BBKEhFQURFUl9DUFVERVNDLCB3cml0ZV9jcHVkZXNjLCBwcmludF9jcHVkZXNjKSwKLQlGRUFUX09QQShIRUFERVJfQ1BVSUQsIHdyaXRlX2NwdWlkLCBwcmludF9jcHVpZCksCi0JRkVBVF9PUEEoSEVBREVSX1RPVEFMX01FTSwgd3JpdGVfdG90YWxfbWVtLCBwcmludF90b3RhbF9tZW0pLAotCUZFQVRfT1BBKEhFQURFUl9FVkVOVF9ERVNDLCB3cml0ZV9ldmVudF9kZXNjLCBwcmludF9ldmVudF9kZXNjKSwKLQlGRUFUX09QQShIRUFERVJfQ01ETElORSwgd3JpdGVfY21kbGluZSwgcHJpbnRfY21kbGluZSksCi0JRkVBVF9PUEYoSEVBREVSX0NQVV9UT1BPTE9HWSwgd3JpdGVfY3B1X3RvcG9sb2d5LCBwcmludF9jcHVfdG9wb2xvZ3kpLAotCUZFQVRfT1BGKEhFQURFUl9OVU1BX1RPUE9MT0dZLCB3cml0ZV9udW1hX3RvcG9sb2d5LCBwcmludF9udW1hX3RvcG9sb2d5KSwKKwlGRUFUX09QQShIRUFERVJfVFJBQ0VfSU5GTywJdHJhY2VfaW5mbyksCisJRkVBVF9PUEEoSEVBREVSX0JVSUxEX0lELAlidWlsZF9pZCksCisJRkVBVF9PUEEoSEVBREVSX0hPU1ROQU1FLAlob3N0bmFtZSksCisJRkVBVF9PUEEoSEVBREVSX09TUkVMRUFTRSwJb3NyZWxlYXNlKSwKKwlGRUFUX09QQShIRUFERVJfVkVSU0lPTiwJdmVyc2lvbiksCisJRkVBVF9PUEEoSEVBREVSX0FSQ0gsCQlhcmNoKSwKKwlGRUFUX09QQShIRUFERVJfTlJDUFVTLAkJbnJjcHVzKSwKKwlGRUFUX09QQShIRUFERVJfQ1BVREVTQywJY3B1ZGVzYyksCisJRkVBVF9PUEEoSEVBREVSX0NQVUlELAkJY3B1aWQpLAorCUZFQVRfT1BBKEhFQURFUl9UT1RBTF9NRU0sCXRvdGFsX21lbSksCisJRkVBVF9PUEEoSEVBREVSX0VWRU5UX0RFU0MsCWV2ZW50X2Rlc2MpLAorCUZFQVRfT1BBKEhFQURFUl9DTURMSU5FLAljbWRsaW5lKSwKKwlGRUFUX09QRihIRUFERVJfQ1BVX1RPUE9MT0dZLAljcHVfdG9wb2xvZ3kpLAorCUZFQVRfT1BGKEhFQURFUl9OVU1BX1RPUE9MT0dZLAludW1hX3RvcG9sb2d5KSwKIH07CiAKIHN0cnVjdCBoZWFkZXJfcHJpbnRfZGF0YSB7CkBAIC0xMTAzLDkgKzEzNTQsOSBAQAogCQkJCSIlZCwgY29udGludWluZy4uLlxuIiwgc2VjdGlvbi0+b2Zmc2V0LCBmZWF0KTsKIAkJcmV0dXJuIDA7CiAJfQotCWlmIChmZWF0IDwgSEVBREVSX1RSQUNFX0lORk8gfHwgZmVhdCA+PSBIRUFERVJfTEFTVF9GRUFUVVJFKSB7CisJaWYgKGZlYXQgPj0gSEVBREVSX0xBU1RfRkVBVFVSRSkgewogCQlwcl93YXJuaW5nKCJ1bmtub3duIGZlYXR1cmUgJWRcbiIsIGZlYXQpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybiAwOwogCX0KIAlpZiAoIWZlYXRfb3BzW2ZlYXRdLnByaW50KQogCQlyZXR1cm4gMDsKQEAgLTExMzIsMjUyICsxMzgzLDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2RlZmluZSBkc29zX19mb3JfZWFjaF93aXRoX2J1aWxkX2lkKHBvcywgaGVhZCkJXAotCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBub2RlKQlcCi0JCWlmICghcG9zLT5oYXNfYnVpbGRfaWQpCQlcCi0JCQljb250aW51ZTsJCVwKLQkJZWxzZQotCi1zdGF0aWMgaW50IF9fZHNvc19fd3JpdGVfYnVpbGRpZF90YWJsZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLCBwaWRfdCBwaWQsCi0JCQkJdTE2IG1pc2MsIGludCBmZCkKLXsKLQlzdHJ1Y3QgZHNvICpwb3M7Ci0KLQlkc29zX19mb3JfZWFjaF93aXRoX2J1aWxkX2lkKHBvcywgaGVhZCkgewotCQlpbnQgZXJyOwotCQlzdHJ1Y3QgYnVpbGRfaWRfZXZlbnQgYjsKLQkJc2l6ZV90IGxlbjsKLQotCQlpZiAoIXBvcy0+aGl0KQotCQkJY29udGludWU7Ci0JCWxlbiA9IHBvcy0+bG9uZ19uYW1lX2xlbiArIDE7Ci0JCWxlbiA9IEFMSUdOKGxlbiwgTkFNRV9BTElHTik7Ci0JCW1lbXNldCgmYiwgMCwgc2l6ZW9mKGIpKTsKLQkJbWVtY3B5KCZiLmJ1aWxkX2lkLCBwb3MtPmJ1aWxkX2lkLCBzaXplb2YocG9zLT5idWlsZF9pZCkpOwotCQliLnBpZCA9IHBpZDsKLQkJYi5oZWFkZXIubWlzYyA9IG1pc2M7Ci0JCWIuaGVhZGVyLnNpemUgPSBzaXplb2YoYikgKyBsZW47Ci0JCWVyciA9IGRvX3dyaXRlKGZkLCAmYiwgc2l6ZW9mKGIpKTsKLQkJaWYgKGVyciA8IDApCi0JCQlyZXR1cm4gZXJyOwotCQllcnIgPSB3cml0ZV9wYWRkZWQoZmQsIHBvcy0+bG9uZ19uYW1lLAotCQkJCSAgIHBvcy0+bG9uZ19uYW1lX2xlbiArIDEsIGxlbik7Ci0JCWlmIChlcnIgPCAwKQotCQkJcmV0dXJuIGVycjsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBtYWNoaW5lX193cml0ZV9idWlsZGlkX3RhYmxlKHN0cnVjdCBtYWNoaW5lICptYWNoaW5lLCBpbnQgZmQpCi17Ci0JaW50IGVycjsKLQl1MTYga21pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX0tFUk5FTCwKLQkgICAgdW1pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX1VTRVI7Ci0KLQlpZiAoIW1hY2hpbmVfX2lzX2hvc3QobWFjaGluZSkpIHsKLQkJa21pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX0tFUk5FTDsKLQkJdW1pc2MgPSBQRVJGX1JFQ09SRF9NSVNDX0dVRVNUX1VTRVI7Ci0JfQotCi0JZXJyID0gX19kc29zX193cml0ZV9idWlsZGlkX3RhYmxlKCZtYWNoaW5lLT5rZXJuZWxfZHNvcywgbWFjaGluZS0+cGlkLAotCQkJCQkgIGttaXNjLCBmZCk7Ci0JaWYgKGVyciA9PSAwKQotCQllcnIgPSBfX2Rzb3NfX3dyaXRlX2J1aWxkaWRfdGFibGUoJm1hY2hpbmUtPnVzZXJfZHNvcywKLQkJCQkJCSAgbWFjaGluZS0+cGlkLCB1bWlzYywgZmQpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgZHNvc19fd3JpdGVfYnVpbGRpZF90YWJsZShzdHJ1Y3QgcGVyZl9oZWFkZXIgKmhlYWRlciwgaW50IGZkKQotewotCXN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gPSBjb250YWluZXJfb2YoaGVhZGVyLAotCQkJc3RydWN0IHBlcmZfc2Vzc2lvbiwgaGVhZGVyKTsKLQlzdHJ1Y3QgcmJfbm9kZSAqbmQ7Ci0JaW50IGVyciA9IG1hY2hpbmVfX3dyaXRlX2J1aWxkaWRfdGFibGUoJnNlc3Npb24tPmhvc3RfbWFjaGluZSwgZmQpOwotCi0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCWZvciAobmQgPSByYl9maXJzdCgmc2Vzc2lvbi0+bWFjaGluZXMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgewotCQlzdHJ1Y3QgbWFjaGluZSAqcG9zID0gcmJfZW50cnkobmQsIHN0cnVjdCBtYWNoaW5lLCByYl9ub2RlKTsKLQkJZXJyID0gbWFjaGluZV9fd3JpdGVfYnVpbGRpZF90YWJsZShwb3MsIGZkKTsKLQkJaWYgKGVycikKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gZXJyOwotfQotCi1pbnQgYnVpbGRfaWRfY2FjaGVfX2FkZF9zKGNvbnN0IGNoYXIgKnNidWlsZF9pZCwgY29uc3QgY2hhciAqZGVidWdkaXIsCi0JCQkgIGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgaXNfa2FsbHN5bXMpCi17Ci0JY29uc3Qgc2l6ZV90IHNpemUgPSBQQVRIX01BWDsKLQljaGFyICpyZWFsbmFtZSwgKmZpbGVuYW1lID0gemFsbG9jKHNpemUpLAotCSAgICAgKmxpbmtuYW1lID0gemFsbG9jKHNpemUpLCAqdGFyZ2V0bmFtZTsKLQlpbnQgbGVuLCBlcnIgPSAtMTsKLQotCWlmIChpc19rYWxsc3ltcykgewotCQlpZiAoc3ltYm9sX2NvbmYua3B0cl9yZXN0cmljdCkgewotCQkJcHJfZGVidWcoIk5vdCBjYWNoaW5nIGEga3B0cl9yZXN0cmljdCdlZCAvcHJvYy9rYWxsc3ltc1xuIik7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZWFsbmFtZSA9IChjaGFyICopbmFtZTsKLQl9IGVsc2UKLQkJcmVhbG5hbWUgPSByZWFscGF0aChuYW1lLCBOVUxMKTsKLQotCWlmIChyZWFsbmFtZSA9PSBOVUxMIHx8IGZpbGVuYW1lID09IE5VTEwgfHwgbGlua25hbWUgPT0gTlVMTCkKLQkJZ290byBvdXRfZnJlZTsKLQotCWxlbiA9IHNucHJpbnRmKGZpbGVuYW1lLCBzaXplLCAiJXMlcyVzIiwKLQkJICAgICAgIGRlYnVnZGlyLCBpc19rYWxsc3ltcyA/ICIvIiA6ICIiLCByZWFsbmFtZSk7Ci0JaWYgKG1rZGlyX3AoZmlsZW5hbWUsIDA3NTUpKQotCQlnb3RvIG91dF9mcmVlOwotCi0Jc25wcmludGYoZmlsZW5hbWUgKyBsZW4sIHNpemVvZihmaWxlbmFtZSkgLSBsZW4sICIvJXMiLCBzYnVpbGRfaWQpOwotCi0JaWYgKGFjY2VzcyhmaWxlbmFtZSwgRl9PSykpIHsKLQkJaWYgKGlzX2thbGxzeW1zKSB7Ci0JCQkgaWYgKGNvcHlmaWxlKCIvcHJvYy9rYWxsc3ltcyIsIGZpbGVuYW1lKSkKLQkJCQlnb3RvIG91dF9mcmVlOwotCQl9IGVsc2UgaWYgKGxpbmsocmVhbG5hbWUsIGZpbGVuYW1lKSAmJiBjb3B5ZmlsZShuYW1lLCBmaWxlbmFtZSkpCi0JCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCWxlbiA9IHNucHJpbnRmKGxpbmtuYW1lLCBzaXplLCAiJXMvLmJ1aWxkLWlkLyUuMnMiLAotCQkgICAgICAgZGVidWdkaXIsIHNidWlsZF9pZCk7Ci0KLQlpZiAoYWNjZXNzKGxpbmtuYW1lLCBYX09LKSAmJiBta2Rpcl9wKGxpbmtuYW1lLCAwNzU1KSkKLQkJZ290byBvdXRfZnJlZTsKLQotCXNucHJpbnRmKGxpbmtuYW1lICsgbGVuLCBzaXplIC0gbGVuLCAiLyVzIiwgc2J1aWxkX2lkICsgMik7Ci0JdGFyZ2V0bmFtZSA9IGZpbGVuYW1lICsgc3RybGVuKGRlYnVnZGlyKSAtIDU7Ci0JbWVtY3B5KHRhcmdldG5hbWUsICIuLi8uLiIsIDUpOwotCi0JaWYgKHN5bWxpbmsodGFyZ2V0bmFtZSwgbGlua25hbWUpID09IDApCi0JCWVyciA9IDA7Ci1vdXRfZnJlZToKLQlpZiAoIWlzX2thbGxzeW1zKQotCQlmcmVlKHJlYWxuYW1lKTsKLQlmcmVlKGZpbGVuYW1lKTsKLQlmcmVlKGxpbmtuYW1lKTsKLQlyZXR1cm4gZXJyOwotfQotCi1zdGF0aWMgaW50IGJ1aWxkX2lkX2NhY2hlX19hZGRfYihjb25zdCB1OCAqYnVpbGRfaWQsIHNpemVfdCBidWlsZF9pZF9zaXplLAotCQkJCSBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkZWJ1Z2RpciwKLQkJCQkgYm9vbCBpc19rYWxsc3ltcykKLXsKLQljaGFyIHNidWlsZF9pZFtCVUlMRF9JRF9TSVpFICogMiArIDFdOwotCi0JYnVpbGRfaWRfX3NwcmludGYoYnVpbGRfaWQsIGJ1aWxkX2lkX3NpemUsIHNidWlsZF9pZCk7Ci0KLQlyZXR1cm4gYnVpbGRfaWRfY2FjaGVfX2FkZF9zKHNidWlsZF9pZCwgZGVidWdkaXIsIG5hbWUsIGlzX2thbGxzeW1zKTsKLX0KLQotaW50IGJ1aWxkX2lkX2NhY2hlX19yZW1vdmVfcyhjb25zdCBjaGFyICpzYnVpbGRfaWQsIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQotewotCWNvbnN0IHNpemVfdCBzaXplID0gUEFUSF9NQVg7Ci0JY2hhciAqZmlsZW5hbWUgPSB6YWxsb2Moc2l6ZSksCi0JICAgICAqbGlua25hbWUgPSB6YWxsb2Moc2l6ZSk7Ci0JaW50IGVyciA9IC0xOwotCi0JaWYgKGZpbGVuYW1lID09IE5VTEwgfHwgbGlua25hbWUgPT0gTlVMTCkKLQkJZ290byBvdXRfZnJlZTsKLQotCXNucHJpbnRmKGxpbmtuYW1lLCBzaXplLCAiJXMvLmJ1aWxkLWlkLyUuMnMvJXMiLAotCQkgZGVidWdkaXIsIHNidWlsZF9pZCwgc2J1aWxkX2lkICsgMik7Ci0KLQlpZiAoYWNjZXNzKGxpbmtuYW1lLCBGX09LKSkKLQkJZ290byBvdXRfZnJlZTsKLQotCWlmIChyZWFkbGluayhsaW5rbmFtZSwgZmlsZW5hbWUsIHNpemUgLSAxKSA8IDApCi0JCWdvdG8gb3V0X2ZyZWU7Ci0KLQlpZiAodW5saW5rKGxpbmtuYW1lKSkKLQkJZ290byBvdXRfZnJlZTsKLQotCS8qCi0JICogU2luY2UgdGhlIGxpbmsgaXMgcmVsYXRpdmUsIHdlIG11c3QgbWFrZSBpdCBhYnNvbHV0ZToKLQkgKi8KLQlzbnByaW50ZihsaW5rbmFtZSwgc2l6ZSwgIiVzLy5idWlsZC1pZC8lLjJzLyVzIiwKLQkJIGRlYnVnZGlyLCBzYnVpbGRfaWQsIGZpbGVuYW1lKTsKLQotCWlmICh1bmxpbmsobGlua25hbWUpKQotCQlnb3RvIG91dF9mcmVlOwotCi0JZXJyID0gMDsKLW91dF9mcmVlOgotCWZyZWUoZmlsZW5hbWUpOwotCWZyZWUobGlua25hbWUpOwotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBpbnQgZHNvX19jYWNoZV9idWlsZF9pZChzdHJ1Y3QgZHNvICpkc28sIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQotewotCWJvb2wgaXNfa2FsbHN5bXMgPSBkc28tPmtlcm5lbCAmJiBkc28tPmxvbmdfbmFtZVswXSAhPSAnLyc7Ci0KLQlyZXR1cm4gYnVpbGRfaWRfY2FjaGVfX2FkZF9iKGRzby0+YnVpbGRfaWQsIHNpemVvZihkc28tPmJ1aWxkX2lkKSwKLQkJCQkgICAgIGRzby0+bG9uZ19uYW1lLCBkZWJ1Z2RpciwgaXNfa2FsbHN5bXMpOwotfQotCi1zdGF0aWMgaW50IF9fZHNvc19fY2FjaGVfYnVpbGRfaWRzKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQotewotCXN0cnVjdCBkc28gKnBvczsKLQlpbnQgZXJyID0gMDsKLQotCWRzb3NfX2Zvcl9lYWNoX3dpdGhfYnVpbGRfaWQocG9zLCBoZWFkKQotCQlpZiAoZHNvX19jYWNoZV9idWlsZF9pZChwb3MsIGRlYnVnZGlyKSkKLQkJCWVyciA9IC0xOwotCi0JcmV0dXJuIGVycjsKLX0KLQotc3RhdGljIGludCBtYWNoaW5lX19jYWNoZV9idWlsZF9pZHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIGNvbnN0IGNoYXIgKmRlYnVnZGlyKQotewotCWludCByZXQgPSBfX2Rzb3NfX2NhY2hlX2J1aWxkX2lkcygmbWFjaGluZS0+a2VybmVsX2Rzb3MsIGRlYnVnZGlyKTsKLQlyZXQgfD0gX19kc29zX19jYWNoZV9idWlsZF9pZHMoJm1hY2hpbmUtPnVzZXJfZHNvcywgZGVidWdkaXIpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgcGVyZl9zZXNzaW9uX19jYWNoZV9idWlsZF9pZHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqbmQ7Ci0JaW50IHJldDsKLQljaGFyIGRlYnVnZGlyW1BBVEhfTUFYXTsKLQotCXNucHJpbnRmKGRlYnVnZGlyLCBzaXplb2YoZGVidWdkaXIpLCAiJXMiLCBidWlsZGlkX2Rpcik7Ci0KLQlpZiAobWtkaXIoZGVidWdkaXIsIDA3NTUpICE9IDAgJiYgZXJybm8gIT0gRUVYSVNUKQotCQlyZXR1cm4gLTE7Ci0KLQlyZXQgPSBtYWNoaW5lX19jYWNoZV9idWlsZF9pZHMoJnNlc3Npb24tPmhvc3RfbWFjaGluZSwgZGVidWdkaXIpOwotCi0JZm9yIChuZCA9IHJiX2ZpcnN0KCZzZXNzaW9uLT5tYWNoaW5lcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7Ci0JCXN0cnVjdCBtYWNoaW5lICpwb3MgPSByYl9lbnRyeShuZCwgc3RydWN0IG1hY2hpbmUsIHJiX25vZGUpOwotCQlyZXQgfD0gbWFjaGluZV9fY2FjaGVfYnVpbGRfaWRzKHBvcywgZGVidWdkaXIpOwotCX0KLQlyZXR1cm4gcmV0ID8gLTEgOiAwOwotfQotCi1zdGF0aWMgYm9vbCBtYWNoaW5lX19yZWFkX2J1aWxkX2lkcyhzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgYm9vbCB3aXRoX2hpdHMpCi17Ci0JYm9vbCByZXQgPSBfX2Rzb3NfX3JlYWRfYnVpbGRfaWRzKCZtYWNoaW5lLT5rZXJuZWxfZHNvcywgd2l0aF9oaXRzKTsKLQlyZXQgfD0gX19kc29zX19yZWFkX2J1aWxkX2lkcygmbWFjaGluZS0+dXNlcl9kc29zLCB3aXRoX2hpdHMpOwotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBib29sIHBlcmZfc2Vzc2lvbl9fcmVhZF9idWlsZF9pZHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgYm9vbCB3aXRoX2hpdHMpCi17Ci0Jc3RydWN0IHJiX25vZGUgKm5kOwotCWJvb2wgcmV0ID0gbWFjaGluZV9fcmVhZF9idWlsZF9pZHMoJnNlc3Npb24tPmhvc3RfbWFjaGluZSwgd2l0aF9oaXRzKTsKLQotCWZvciAobmQgPSByYl9maXJzdCgmc2Vzc2lvbi0+bWFjaGluZXMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgewotCQlzdHJ1Y3QgbWFjaGluZSAqcG9zID0gcmJfZW50cnkobmQsIHN0cnVjdCBtYWNoaW5lLCByYl9ub2RlKTsKLQkJcmV0IHw9IG1hY2hpbmVfX3JlYWRfYnVpbGRfaWRzKHBvcywgd2l0aF9oaXRzKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCiBzdGF0aWMgaW50IGRvX3dyaXRlX2ZlYXQoaW50IGZkLCBzdHJ1Y3QgcGVyZl9oZWFkZXIgKmgsIGludCB0eXBlLAogCQkJIHN0cnVjdCBwZXJmX2ZpbGVfc2VjdGlvbiAqKnAsCiAJCQkgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QpCkBAIC0xMzg2LDYgKzEzOTEsOCBAQAogCWludCByZXQgPSAwOwogCiAJaWYgKHBlcmZfaGVhZGVyX19oYXNfZmVhdChoLCB0eXBlKSkgeworCQlpZiAoIWZlYXRfb3BzW3R5cGVdLndyaXRlKQorCQkJcmV0dXJuIC0xOwogCiAJCSgqcCktPm9mZnNldCA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUik7CiAKQEAgLTE0MDgsMTggKzE0MTUsMTIgQEAKIAkJCQkgICBzdHJ1Y3QgcGVyZl9ldmxpc3QgKmV2bGlzdCwgaW50IGZkKQogewogCWludCBucl9zZWN0aW9uczsKLQlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uOwogCXN0cnVjdCBwZXJmX2ZpbGVfc2VjdGlvbiAqZmVhdF9zZWMsICpwOwogCWludCBzZWNfc2l6ZTsKIAl1NjQgc2VjX3N0YXJ0OworCWludCBmZWF0OwogCWludCBlcnI7CiAKLQlzZXNzaW9uID0gY29udGFpbmVyX29mKGhlYWRlciwgc3RydWN0IHBlcmZfc2Vzc2lvbiwgaGVhZGVyKTsKLQotCWlmIChwZXJmX2hlYWRlcl9faGFzX2ZlYXQoaGVhZGVyLCBIRUFERVJfQlVJTERfSUQgJiYKLQkgICAgIXBlcmZfc2Vzc2lvbl9fcmVhZF9idWlsZF9pZHMoc2Vzc2lvbiwgdHJ1ZSkpKQotCQlwZXJmX2hlYWRlcl9fY2xlYXJfZmVhdChoZWFkZXIsIEhFQURFUl9CVUlMRF9JRCk7Ci0KIAlucl9zZWN0aW9ucyA9IGJpdG1hcF93ZWlnaHQoaGVhZGVyLT5hZGRzX2ZlYXR1cmVzLCBIRUFERVJfRkVBVF9CSVRTKTsKIAlpZiAoIW5yX3NlY3Rpb25zKQogCQlyZXR1cm4gMDsKQEAgLTE0MzMsNjQgKzE0MzQsMTEgQEAKIAlzZWNfc3RhcnQgPSBoZWFkZXItPmRhdGFfb2Zmc2V0ICsgaGVhZGVyLT5kYXRhX3NpemU7CiAJbHNlZWsoZmQsIHNlY19zdGFydCArIHNlY19zaXplLCBTRUVLX1NFVCk7CiAKLQllcnIgPSBkb193cml0ZV9mZWF0KGZkLCBoZWFkZXIsIEhFQURFUl9UUkFDRV9JTkZPLCAmcCwgZXZsaXN0KTsKLQlpZiAoZXJyKQotCQlnb3RvIG91dF9mcmVlOwotCi0JZXJyID0gZG9fd3JpdGVfZmVhdChmZCwgaGVhZGVyLCBIRUFERVJfQlVJTERfSUQsICZwLCBldmxpc3QpOwotCWlmIChlcnIpIHsKLQkJcGVyZl9oZWFkZXJfX2NsZWFyX2ZlYXQoaGVhZGVyLCBIRUFERVJfQlVJTERfSUQpOwotCQlnb3RvIG91dF9mcmVlOworCWZvcl9lYWNoX3NldF9iaXQoZmVhdCwgaGVhZGVyLT5hZGRzX2ZlYXR1cmVzLCBIRUFERVJfRkVBVF9CSVRTKSB7CisJCWlmIChkb193cml0ZV9mZWF0KGZkLCBoZWFkZXIsIGZlYXQsICZwLCBldmxpc3QpKQorCQkJcGVyZl9oZWFkZXJfX2NsZWFyX2ZlYXQoaGVhZGVyLCBmZWF0KTsKIAl9CiAKLQllcnIgPSBkb193cml0ZV9mZWF0KGZkLCBoZWFkZXIsIEhFQURFUl9IT1NUTkFNRSwgJnAsIGV2bGlzdCk7Ci0JaWYgKGVycikKLQkJcGVyZl9oZWFkZXJfX2NsZWFyX2ZlYXQoaGVhZGVyLCBIRUFERVJfSE9TVE5BTUUpOwotCi0JZXJyID0gZG9fd3JpdGVfZmVhdChmZCwgaGVhZGVyLCBIRUFERVJfT1NSRUxFQVNFLCAmcCwgZXZsaXN0KTsKLQlpZiAoZXJyKQotCQlwZXJmX2hlYWRlcl9fY2xlYXJfZmVhdChoZWFkZXIsIEhFQURFUl9PU1JFTEVBU0UpOwotCi0JZXJyID0gZG9fd3JpdGVfZmVhdChmZCwgaGVhZGVyLCBIRUFERVJfVkVSU0lPTiwgJnAsIGV2bGlzdCk7Ci0JaWYgKGVycikKLQkJcGVyZl9oZWFkZXJfX2NsZWFyX2ZlYXQoaGVhZGVyLCBIRUFERVJfVkVSU0lPTik7Ci0KLQllcnIgPSBkb193cml0ZV9mZWF0KGZkLCBoZWFkZXIsIEhFQURFUl9BUkNILCAmcCwgZXZsaXN0KTsKLQlpZiAoZXJyKQotCQlwZXJmX2hlYWRlcl9fY2xlYXJfZmVhdChoZWFkZXIsIEhFQURFUl9BUkNIKTsKLQotCWVyciA9IGRvX3dyaXRlX2ZlYXQoZmQsIGhlYWRlciwgSEVBREVSX05SQ1BVUywgJnAsIGV2bGlzdCk7Ci0JaWYgKGVycikKLQkJcGVyZl9oZWFkZXJfX2NsZWFyX2ZlYXQoaGVhZGVyLCBIRUFERVJfTlJDUFVTKTsKLQotCWVyciA9IGRvX3dyaXRlX2ZlYXQoZmQsIGhlYWRlciwgSEVBREVSX0NQVURFU0MsICZwLCBldmxpc3QpOwotCWlmIChlcnIpCi0JCXBlcmZfaGVhZGVyX19jbGVhcl9mZWF0KGhlYWRlciwgSEVBREVSX0NQVURFU0MpOwotCi0JZXJyID0gZG9fd3JpdGVfZmVhdChmZCwgaGVhZGVyLCBIRUFERVJfQ1BVSUQsICZwLCBldmxpc3QpOwotCWlmIChlcnIpCi0JCXBlcmZfaGVhZGVyX19jbGVhcl9mZWF0KGhlYWRlciwgSEVBREVSX0NQVUlEKTsKLQotCWVyciA9IGRvX3dyaXRlX2ZlYXQoZmQsIGhlYWRlciwgSEVBREVSX1RPVEFMX01FTSwgJnAsIGV2bGlzdCk7Ci0JaWYgKGVycikKLQkJcGVyZl9oZWFkZXJfX2NsZWFyX2ZlYXQoaGVhZGVyLCBIRUFERVJfVE9UQUxfTUVNKTsKLQotCWVyciA9IGRvX3dyaXRlX2ZlYXQoZmQsIGhlYWRlciwgSEVBREVSX0NNRExJTkUsICZwLCBldmxpc3QpOwotCWlmIChlcnIpCi0JCXBlcmZfaGVhZGVyX19jbGVhcl9mZWF0KGhlYWRlciwgSEVBREVSX0NNRExJTkUpOwotCi0JZXJyID0gZG9fd3JpdGVfZmVhdChmZCwgaGVhZGVyLCBIRUFERVJfRVZFTlRfREVTQywgJnAsIGV2bGlzdCk7Ci0JaWYgKGVycikKLQkJcGVyZl9oZWFkZXJfX2NsZWFyX2ZlYXQoaGVhZGVyLCBIRUFERVJfRVZFTlRfREVTQyk7Ci0KLQllcnIgPSBkb193cml0ZV9mZWF0KGZkLCBoZWFkZXIsIEhFQURFUl9DUFVfVE9QT0xPR1ksICZwLCBldmxpc3QpOwotCWlmIChlcnIpCi0JCXBlcmZfaGVhZGVyX19jbGVhcl9mZWF0KGhlYWRlciwgSEVBREVSX0NQVV9UT1BPTE9HWSk7Ci0KLQllcnIgPSBkb193cml0ZV9mZWF0KGZkLCBoZWFkZXIsIEhFQURFUl9OVU1BX1RPUE9MT0dZLCAmcCwgZXZsaXN0KTsKLQlpZiAoZXJyKQotCQlwZXJmX2hlYWRlcl9fY2xlYXJfZmVhdChoZWFkZXIsIEhFQURFUl9OVU1BX1RPUE9MT0dZKTsKLQogCWxzZWVrKGZkLCBzZWNfc3RhcnQsIFNFRUtfU0VUKTsKIAkvKgogCSAqIG1heSB3cml0ZSBtb3JlIHRoYW4gbmVlZGVkIGR1ZSB0byBkcm9wcGVkIGZlYXR1cmUsIGJ1dApAQCAtMTQ5OSw3ICsxNDQ3LDYgQEAKIAllcnIgPSBkb193cml0ZShmZCwgZmVhdF9zZWMsIHNlY19zaXplKTsKIAlpZiAoZXJyIDwgMCkKIAkJcHJfZGVidWcoImZhaWxlZCB0byB3cml0ZSBmZWF0dXJlIHNlY3Rpb25cbiIpOwotb3V0X2ZyZWU6CiAJZnJlZShmZWF0X3NlYyk7CiAJcmV0dXJuIGVycjsKIH0KQEAgLTE2MzcsMjAgKzE1ODQsMjAgQEAKIGludCBwZXJmX2hlYWRlcl9fcHJvY2Vzc19zZWN0aW9ucyhzdHJ1Y3QgcGVyZl9oZWFkZXIgKmhlYWRlciwgaW50IGZkLAogCQkJCSAgdm9pZCAqZGF0YSwKIAkJCQkgIGludCAoKnByb2Nlc3MpKHN0cnVjdCBwZXJmX2ZpbGVfc2VjdGlvbiAqc2VjdGlvbiwKLQkJCQkgIHN0cnVjdCBwZXJmX2hlYWRlciAqcGgsCi0JCQkJICBpbnQgZmVhdCwgaW50IGZkLCB2b2lkICpkYXRhKSkKKwkJCQkJCSBzdHJ1Y3QgcGVyZl9oZWFkZXIgKnBoLAorCQkJCQkJIGludCBmZWF0LCBpbnQgZmQsIHZvaWQgKmRhdGEpKQogewotCXN0cnVjdCBwZXJmX2ZpbGVfc2VjdGlvbiAqZmVhdF9zZWM7CisJc3RydWN0IHBlcmZfZmlsZV9zZWN0aW9uICpmZWF0X3NlYywgKnNlYzsKIAlpbnQgbnJfc2VjdGlvbnM7CiAJaW50IHNlY19zaXplOwotCWludCBpZHggPSAwOwotCWludCBlcnIgPSAtMSwgZmVhdCA9IDE7CisJaW50IGZlYXQ7CisJaW50IGVycjsKIAogCW5yX3NlY3Rpb25zID0gYml0bWFwX3dlaWdodChoZWFkZXItPmFkZHNfZmVhdHVyZXMsIEhFQURFUl9GRUFUX0JJVFMpOwogCWlmICghbnJfc2VjdGlvbnMpCiAJCXJldHVybiAwOwogCi0JZmVhdF9zZWMgPSBjYWxsb2Moc2l6ZW9mKCpmZWF0X3NlYyksIG5yX3NlY3Rpb25zKTsKKwlmZWF0X3NlYyA9IHNlYyA9IGNhbGxvYyhzaXplb2YoKmZlYXRfc2VjKSwgbnJfc2VjdGlvbnMpOwogCWlmICghZmVhdF9zZWMpCiAJCXJldHVybiAtMTsKIApAQCAtMTY1OCwyMCArMTYwNSwxNiBAQAogCiAJbHNlZWsoZmQsIGhlYWRlci0+ZGF0YV9vZmZzZXQgKyBoZWFkZXItPmRhdGFfc2l6ZSwgU0VFS19TRVQpOwogCi0JaWYgKHBlcmZfaGVhZGVyX19nZXRidWZmZXI2NChoZWFkZXIsIGZkLCBmZWF0X3NlYywgc2VjX3NpemUpKQorCWVyciA9IHBlcmZfaGVhZGVyX19nZXRidWZmZXI2NChoZWFkZXIsIGZkLCBmZWF0X3NlYywgc2VjX3NpemUpOworCWlmIChlcnIgPCAwKQogCQlnb3RvIG91dF9mcmVlOwogCi0JZXJyID0gMDsKLQl3aGlsZSAoaWR4IDwgbnJfc2VjdGlvbnMgJiYgZmVhdCA8IEhFQURFUl9MQVNUX0ZFQVRVUkUpIHsKLQkJaWYgKHBlcmZfaGVhZGVyX19oYXNfZmVhdChoZWFkZXIsIGZlYXQpKSB7Ci0JCQlzdHJ1Y3QgcGVyZl9maWxlX3NlY3Rpb24gKnNlYyA9ICZmZWF0X3NlY1tpZHgrK107Ci0KLQkJCWVyciA9IHByb2Nlc3Moc2VjLCBoZWFkZXIsIGZlYXQsIGZkLCBkYXRhKTsKLQkJCWlmIChlcnIgPCAwKQotCQkJCWJyZWFrOwotCQl9Ci0JCSsrZmVhdDsKKwlmb3JfZWFjaF9zZXRfYml0KGZlYXQsIGhlYWRlci0+YWRkc19mZWF0dXJlcywgSEVBREVSX0xBU1RfRkVBVFVSRSkgeworCQllcnIgPSBwcm9jZXNzKHNlYysrLCBoZWFkZXIsIGZlYXQsIGZkLCBkYXRhKTsKKwkJaWYgKGVyciA8IDApCisJCQlnb3RvIG91dF9mcmVlOwogCX0KKwllcnIgPSAwOwogb3V0X2ZyZWU6CiAJZnJlZShmZWF0X3NlYyk7CiAJcmV0dXJuIGVycjsKQEAgLTE5MDYsMzIgKzE4NDksMjEgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKGZlYXQgPj0gSEVBREVSX0xBU1RfRkVBVFVSRSkgeworCQlwcl9kZWJ1ZygidW5rbm93biBmZWF0dXJlICVkLCBjb250aW51aW5nLi4uXG4iLCBmZWF0KTsKKwkJcmV0dXJuIDA7CisJfQorCiAJc3dpdGNoIChmZWF0KSB7CiAJY2FzZSBIRUFERVJfVFJBQ0VfSU5GTzoKIAkJdHJhY2VfcmVwb3J0KGZkLCBmYWxzZSk7CiAJCWJyZWFrOwotCiAJY2FzZSBIRUFERVJfQlVJTERfSUQ6CiAJCWlmIChwZXJmX2hlYWRlcl9fcmVhZF9idWlsZF9pZHMocGgsIGZkLCBzZWN0aW9uLT5vZmZzZXQsIHNlY3Rpb24tPnNpemUpKQogCQkJcHJfZGVidWcoIkZhaWxlZCB0byByZWFkIGJ1aWxkaWRzLCBjb250aW51aW5nLi4uXG4iKTsKIAkJYnJlYWs7Ci0KLQljYXNlIEhFQURFUl9IT1NUTkFNRToKLQljYXNlIEhFQURFUl9PU1JFTEVBU0U6Ci0JY2FzZSBIRUFERVJfVkVSU0lPTjoKLQljYXNlIEhFQURFUl9BUkNIOgotCWNhc2UgSEVBREVSX05SQ1BVUzoKLQljYXNlIEhFQURFUl9DUFVERVNDOgotCWNhc2UgSEVBREVSX0NQVUlEOgotCWNhc2UgSEVBREVSX1RPVEFMX01FTToKLQljYXNlIEhFQURFUl9DTURMSU5FOgotCWNhc2UgSEVBREVSX0VWRU5UX0RFU0M6Ci0JY2FzZSBIRUFERVJfQ1BVX1RPUE9MT0dZOgotCWNhc2UgSEVBREVSX05VTUFfVE9QT0xPR1k6Ci0JCWJyZWFrOwotCiAJZGVmYXVsdDoKLQkJcHJfZGVidWcoInVua25vd24gZmVhdHVyZSAlZCwgY29udGludWluZy4uLlxuIiwgZmVhdCk7CisJCWJyZWFrOwogCX0KIAogCXJldHVybiAwOwpAQCAtMjA0MSw2ICsxOTczLDggQEAKIAkJbHNlZWsoZmQsIHRtcCwgU0VFS19TRVQpOwogCX0KIAorCXN5bWJvbF9jb25mLm5yX2V2ZW50cyA9IG5yX2F0dHJzOworCiAJaWYgKGZfaGVhZGVyLmV2ZW50X3R5cGVzLnNpemUpIHsKIAkJbHNlZWsoZmQsIGZfaGVhZGVyLmV2ZW50X3R5cGVzLm9mZnNldCwgU0VFS19TRVQpOwogCQlldmVudHMgPSBtYWxsb2MoZl9oZWFkZXIuZXZlbnRfdHlwZXMuc2l6ZSk7CkBAIC0yMDY4LDkgKzIwMDIsOSBAQAogCXJldHVybiAtRU5PTUVNOwogfQogCi1pbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9hdHRyKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIHUxNiBpZHMsIHU2NCAqaWQsCi0JCQkJcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCi0JCQkJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKK2ludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX2F0dHIoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQlzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyLCB1MTYgaWRzLCB1NjQgKmlkLAorCQkJCXBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzKQogewogCXVuaW9uIHBlcmZfZXZlbnQgKmV2OwogCXNpemVfdCBzaXplOwpAQCAtMjA5MiwyMiArMjAyNiwyMyBAQAogCWV2LT5hdHRyLmhlYWRlci50eXBlID0gUEVSRl9SRUNPUkRfSEVBREVSX0FUVFI7CiAJZXYtPmF0dHIuaGVhZGVyLnNpemUgPSBzaXplOwogCi0JZXJyID0gcHJvY2VzcyhldiwgTlVMTCwgc2Vzc2lvbik7CisJZXJyID0gcHJvY2Vzcyh0b29sLCBldiwgTlVMTCwgTlVMTCk7CiAKIAlmcmVlKGV2KTsKIAogCXJldHVybiBlcnI7CiB9CiAKLWludCBwZXJmX3Nlc3Npb25fX3N5bnRoZXNpemVfYXR0cnMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKK2ludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX2F0dHJzKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKIAkJCQkgICBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcykKIHsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqYXR0cjsKIAlpbnQgZXJyID0gMDsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnkoYXR0ciwgJnNlc3Npb24tPmV2bGlzdC0+ZW50cmllcywgbm9kZSkgewotCQllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2F0dHIoJmF0dHItPmF0dHIsIGF0dHItPmlkcywKLQkJCQkJCSAgYXR0ci0+aWQsIHByb2Nlc3MsIHNlc3Npb24pOworCQllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2F0dHIodG9vbCwgJmF0dHItPmF0dHIsIGF0dHItPmlkcywKKwkJCQkJCSAgYXR0ci0+aWQsIHByb2Nlc3MpOwogCQlpZiAoZXJyKSB7CiAJCQlwcl9kZWJ1ZygiZmFpbGVkIHRvIGNyZWF0ZSBwZXJmIGhlYWRlciBhdHRyaWJ1dGVcbiIpOwogCQkJcmV0dXJuIGVycjsKQEAgLTIxMTgsMjMgKzIwNTMsMjMgQEAKIH0KIAogaW50IHBlcmZfZXZlbnRfX3Byb2Nlc3NfYXR0cih1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKLQkJCSAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKKwkJCSAgICAgc3RydWN0IHBlcmZfZXZsaXN0ICoqcGV2bGlzdCkKIHsKIAl1bnNpZ25lZCBpbnQgaSwgaWRzLCBuX2lkczsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWw7CisJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QgPSAqcGV2bGlzdDsKIAotCWlmIChzZXNzaW9uLT5ldmxpc3QgPT0gTlVMTCkgewotCQlzZXNzaW9uLT5ldmxpc3QgPSBwZXJmX2V2bGlzdF9fbmV3KE5VTEwsIE5VTEwpOwotCQlpZiAoc2Vzc2lvbi0+ZXZsaXN0ID09IE5VTEwpCisJaWYgKGV2bGlzdCA9PSBOVUxMKSB7CisJCSpwZXZsaXN0ID0gZXZsaXN0ID0gcGVyZl9ldmxpc3RfX25ldyhOVUxMLCBOVUxMKTsKKwkJaWYgKGV2bGlzdCA9PSBOVUxMKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQogCi0JZXZzZWwgPSBwZXJmX2V2c2VsX19uZXcoJmV2ZW50LT5hdHRyLmF0dHIsCi0JCQkJc2Vzc2lvbi0+ZXZsaXN0LT5ucl9lbnRyaWVzKTsKKwlldnNlbCA9IHBlcmZfZXZzZWxfX25ldygmZXZlbnQtPmF0dHIuYXR0ciwgZXZsaXN0LT5ucl9lbnRyaWVzKTsKIAlpZiAoZXZzZWwgPT0gTlVMTCkKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQlwZXJmX2V2bGlzdF9fYWRkKHNlc3Npb24tPmV2bGlzdCwgZXZzZWwpOworCXBlcmZfZXZsaXN0X19hZGQoZXZsaXN0LCBldnNlbCk7CiAKIAlpZHMgPSBldmVudC0+aGVhZGVyLnNpemU7CiAJaWRzIC09ICh2b2lkICopJmV2ZW50LT5hdHRyLmlkIC0gKHZvaWQgKilldmVudDsKQEAgLTIxNDgsMTggKzIwODMsMTYgQEAKIAkJcmV0dXJuIC1FTk9NRU07CiAKIAlmb3IgKGkgPSAwOyBpIDwgbl9pZHM7IGkrKykgewotCQlwZXJmX2V2bGlzdF9faWRfYWRkKHNlc3Npb24tPmV2bGlzdCwgZXZzZWwsIDAsIGksCi0JCQkJICAgIGV2ZW50LT5hdHRyLmlkW2ldKTsKKwkJcGVyZl9ldmxpc3RfX2lkX2FkZChldmxpc3QsIGV2c2VsLCAwLCBpLCBldmVudC0+YXR0ci5pZFtpXSk7CiAJfQogCi0JcGVyZl9zZXNzaW9uX191cGRhdGVfc2FtcGxlX3R5cGUoc2Vzc2lvbik7Ci0KIAlyZXR1cm4gMDsKIH0KIAotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfZXZlbnRfdHlwZSh1NjQgZXZlbnRfaWQsIGNoYXIgKm5hbWUsCitpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9ldmVudF90eXBlKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJICAgICAgdTY0IGV2ZW50X2lkLCBjaGFyICpuYW1lLAogCQkJCSAgICAgIHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAotCQkJCSAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCisJCQkJICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJdW5pb24gcGVyZl9ldmVudCBldjsKIAlzaXplX3Qgc2l6ZSA9IDA7CkBAIC0yMTc3LDEzICsyMTEwLDE0IEBACiAJZXYuZXZlbnRfdHlwZS5oZWFkZXIuc2l6ZSA9IHNpemVvZihldi5ldmVudF90eXBlKSAtCiAJCShzaXplb2YoZXYuZXZlbnRfdHlwZS5ldmVudF90eXBlLm5hbWUpIC0gc2l6ZSk7CiAKLQllcnIgPSBwcm9jZXNzKCZldiwgTlVMTCwgc2Vzc2lvbik7CisJZXJyID0gcHJvY2Vzcyh0b29sLCAmZXYsIE5VTEwsIG1hY2hpbmUpOwogCiAJcmV0dXJuIGVycjsKIH0KIAotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfZXZlbnRfdHlwZXMocGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCi0JCQkJICAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCitpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9ldmVudF90eXBlcyhzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgICAgICBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKKwkJCQkgICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJc3RydWN0IHBlcmZfdHJhY2VfZXZlbnRfdHlwZSAqdHlwZTsKIAlpbnQgaSwgZXJyID0gMDsKQEAgLTIxOTEsOSArMjEyNSw5IEBACiAJZm9yIChpID0gMDsgaSA8IGV2ZW50X2NvdW50OyBpKyspIHsKIAkJdHlwZSA9ICZldmVudHNbaV07CiAKLQkJZXJyID0gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9ldmVudF90eXBlKHR5cGUtPmV2ZW50X2lkLAorCQllcnIgPSBwZXJmX2V2ZW50X19zeW50aGVzaXplX2V2ZW50X3R5cGUodG9vbCwgdHlwZS0+ZXZlbnRfaWQsCiAJCQkJCQkJdHlwZS0+bmFtZSwgcHJvY2VzcywKLQkJCQkJCQlzZXNzaW9uKTsKKwkJCQkJCQltYWNoaW5lKTsKIAkJaWYgKGVycikgewogCQkJcHJfZGVidWcoImZhaWxlZCB0byBjcmVhdGUgcGVyZiBoZWFkZXIgZXZlbnQgdHlwZVxuIik7CiAJCQlyZXR1cm4gZXJyOwpAQCAtMjIwMyw4ICsyMTM3LDggQEAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19ldmVudF90eXBlKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAotCQkJCSAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gX191bnVzZWQpCitpbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19ldmVudF90eXBlKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX191bnVzZWQsCisJCQkJICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQpCiB7CiAJaWYgKHBlcmZfaGVhZGVyX19wdXNoX2V2ZW50KGV2ZW50LT5ldmVudF90eXBlLmV2ZW50X3R5cGUuZXZlbnRfaWQsCiAJCQkJICAgIGV2ZW50LT5ldmVudF90eXBlLmV2ZW50X3R5cGUubmFtZSkgPCAwKQpAQCAtMjIxMyw5ICsyMTQ3LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfdHJhY2luZ19kYXRhKGludCBmZCwgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCi0JCQkJCSBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKLQkJCQkgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uIF9fdW51c2VkKQoraW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfdHJhY2luZ19kYXRhKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsIGludCBmZCwKKwkJCQkJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCisJCQkJCXBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzKQogewogCXVuaW9uIHBlcmZfZXZlbnQgZXY7CiAJc3RydWN0IHRyYWNpbmdfZGF0YSAqdGRhdGE7CkBAIC0yMjQ2LDcgKzIxODAsNyBAQAogCWV2LnRyYWNpbmdfZGF0YS5oZWFkZXIuc2l6ZSA9IHNpemVvZihldi50cmFjaW5nX2RhdGEpOwogCWV2LnRyYWNpbmdfZGF0YS5zaXplID0gYWxpZ25lZF9zaXplOwogCi0JcHJvY2VzcygmZXYsIE5VTEwsIHNlc3Npb24pOworCXByb2Nlc3ModG9vbCwgJmV2LCBOVUxMLCBOVUxMKTsKIAogCS8qCiAJICogVGhlIHB1dCBmdW5jdGlvbiB3aWxsIGNvcHkgYWxsIHRoZSB0cmFjaW5nIGRhdGEKQEAgLTIyODgsMTAgKzIyMjIsMTAgQEAKIAlyZXR1cm4gc2l6ZV9yZWFkICsgcGFkZGluZzsKIH0KIAotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfYnVpbGRfaWQoc3RydWN0IGRzbyAqcG9zLCB1MTYgbWlzYywKK2ludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX2J1aWxkX2lkKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJICAgIHN0cnVjdCBkc28gKnBvcywgdTE2IG1pc2MsCiAJCQkJICAgIHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAotCQkJCSAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKLQkJCQkgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKKwkJCQkgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJdW5pb24gcGVyZl9ldmVudCBldjsKIAlzaXplX3QgbGVuOwpAQCAtMjMxMSwxMiArMjI0NSwxMyBAQAogCWV2LmJ1aWxkX2lkLmhlYWRlci5zaXplID0gc2l6ZW9mKGV2LmJ1aWxkX2lkKSArIGxlbjsKIAltZW1jcHkoJmV2LmJ1aWxkX2lkLmZpbGVuYW1lLCBwb3MtPmxvbmdfbmFtZSwgcG9zLT5sb25nX25hbWVfbGVuKTsKIAotCWVyciA9IHByb2Nlc3MoJmV2LCBOVUxMLCBzZXNzaW9uKTsKKwllcnIgPSBwcm9jZXNzKHRvb2wsICZldiwgTlVMTCwgbWFjaGluZSk7CiAKIAlyZXR1cm4gZXJyOwogfQogCi1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19idWlsZF9pZCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKK2ludCBwZXJmX2V2ZW50X19wcm9jZXNzX2J1aWxkX2lkKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX191c2VkLAorCQkJCSB1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKIAkJCQkgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKIHsKIAlfX2V2ZW50X3Byb2Nlc3NfYnVpbGRfaWQoJmV2ZW50LT5idWlsZF9pZCwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuaCBiL3Rvb2xzL3BlcmYvdXRpbC9oZWFkZXIuaAppbmRleCAzZDVhNzQyLi5hYzRlYzk1IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvaGVhZGVyLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hlYWRlci5oCkBAIC0xMCw3ICsxMCw4IEBACiAjaW5jbHVkZSA8bGludXgvYml0bWFwLmg+CiAKIGVudW0gewotCUhFQURFUl9UUkFDRV9JTkZPID0gMSwKKwlIRUFERVJfUkVTRVJWRUQJCT0gMCwJLyogYWx3YXlzIGNsZWFyZWQgKi8KKwlIRUFERVJfVFJBQ0VfSU5GTwk9IDEsCiAJSEVBREVSX0JVSUxEX0lELAogCiAJSEVBREVSX0hPU1ROQU1FLApAQCAtMjcsMTAgKzI4LDkgQEAKIAlIRUFERVJfTlVNQV9UT1BPTE9HWSwKIAogCUhFQURFUl9MQVNUX0ZFQVRVUkUsCisJSEVBREVSX0ZFQVRfQklUUwk9IDI1NiwKIH07CiAKLSNkZWZpbmUgSEVBREVSX0ZFQVRfQklUUwkJCTI1NgotCiBzdHJ1Y3QgcGVyZl9maWxlX3NlY3Rpb24gewogCXU2NCBvZmZzZXQ7CiAJdTY0IHNpemU7CkBAIC02OCw2ICs2OCw3IEBACiB9OwogCiBzdHJ1Y3QgcGVyZl9ldmxpc3Q7CitzdHJ1Y3QgcGVyZl9zZXNzaW9uOwogCiBpbnQgcGVyZl9zZXNzaW9uX19yZWFkX2hlYWRlcihzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLCBpbnQgZmQpOwogaW50IHBlcmZfc2Vzc2lvbl9fd3JpdGVfaGVhZGVyKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCkBAIC05NiwzMiArOTcsMzYgQEAKIAkJCSAgY29uc3QgY2hhciAqbmFtZSwgYm9vbCBpc19rYWxsc3ltcyk7CiBpbnQgYnVpbGRfaWRfY2FjaGVfX3JlbW92ZV9zKGNvbnN0IGNoYXIgKnNidWlsZF9pZCwgY29uc3QgY2hhciAqZGVidWdkaXIpOwogCi1pbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9hdHRyKHN0cnVjdCBwZXJmX2V2ZW50X2F0dHIgKmF0dHIsIHUxNiBpZHMsIHU2NCAqaWQsCi0JCQkJcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCi0JCQkJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci1pbnQgcGVyZl9zZXNzaW9uX19zeW50aGVzaXplX2F0dHJzKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCi0JCQkJICAgcGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MpOwotaW50IHBlcmZfZXZlbnRfX3Byb2Nlc3NfYXR0cih1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7CitpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9hdHRyKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJc3RydWN0IHBlcmZfZXZlbnRfYXR0ciAqYXR0ciwgdTE2IGlkcywgdTY0ICppZCwKKwkJCQlwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2Vzcyk7CitpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9hdHRycyhzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAorCQkJCSBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2Vzcyk7CitpbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19hdHRyKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9ldmxpc3QgKipwZXZsaXN0KTsKIAotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfZXZlbnRfdHlwZSh1NjQgZXZlbnRfaWQsIGNoYXIgKm5hbWUsCitpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9ldmVudF90eXBlKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJICAgICAgdTY0IGV2ZW50X2lkLCBjaGFyICpuYW1lLAogCQkJCSAgICAgIHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAotCQkJCSAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pOwotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfZXZlbnRfdHlwZXMocGVyZl9ldmVudF9faGFuZGxlcl90IHByb2Nlc3MsCi0JCQkJICAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pOwotaW50IHBlcmZfZXZlbnRfX3Byb2Nlc3NfZXZlbnRfdHlwZSh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKLQkJCQkgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKTsKKwkJCQkgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7CitpbnQgcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9ldmVudF90eXBlcyhzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgICAgICBwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2VzcywKKwkJCQkgICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOworaW50IHBlcmZfZXZlbnRfX3Byb2Nlc3NfZXZlbnRfdHlwZShzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCSAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50KTsKIAotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfdHJhY2luZ19kYXRhKGludCBmZCwgc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsCi0JCQkJCXBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAotCQkJCQlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKTsKK2ludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX3RyYWNpbmdfZGF0YShzdHJ1Y3QgcGVyZl90b29sICp0b29sLAorCQkJCQlpbnQgZmQsIHN0cnVjdCBwZXJmX2V2bGlzdCAqZXZsaXN0LAorCQkJCQlwZXJmX2V2ZW50X19oYW5kbGVyX3QgcHJvY2Vzcyk7CiBpbnQgcGVyZl9ldmVudF9fcHJvY2Vzc190cmFjaW5nX2RhdGEodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJICAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKTsKIAotaW50IHBlcmZfZXZlbnRfX3N5bnRoZXNpemVfYnVpbGRfaWQoc3RydWN0IGRzbyAqcG9zLCB1MTYgbWlzYywKK2ludCBwZXJmX2V2ZW50X19zeW50aGVzaXplX2J1aWxkX2lkKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCisJCQkJICAgIHN0cnVjdCBkc28gKnBvcywgdTE2IG1pc2MsCiAJCQkJICAgIHBlcmZfZXZlbnRfX2hhbmRsZXJfdCBwcm9jZXNzLAotCQkJCSAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKLQkJCQkgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci1pbnQgcGVyZl9ldmVudF9fcHJvY2Vzc19idWlsZF9pZCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCQkgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpOworaW50IHBlcmZfZXZlbnRfX3Byb2Nlc3NfYnVpbGRfaWQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQkgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pOwogCiAvKgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYyBiL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmMKaW5kZXggYTM2YTNmYS4uYWJlZjI3MCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL2hpc3QuYworKysgYi90b29scy9wZXJmL3V0aWwvaGlzdC5jCkBAIC0xMjExLDEzICsxMjExLDMgQEAKIAogCXJldHVybiByZXQ7CiB9Ci0KLXZvaWQgaGlzdHNfX2luaXQoc3RydWN0IGhpc3RzICpoaXN0cykKLXsKLQltZW1zZXQoaGlzdHMsIDAsIHNpemVvZigqaGlzdHMpKTsKLQloaXN0cy0+ZW50cmllc19pbl9hcnJheVswXSA9IGhpc3RzLT5lbnRyaWVzX2luX2FycmF5WzFdID0gUkJfUk9PVDsKLQloaXN0cy0+ZW50cmllc19pbiA9ICZoaXN0cy0+ZW50cmllc19pbl9hcnJheVswXTsKLQloaXN0cy0+ZW50cmllc19jb2xsYXBzZWQgPSBSQl9ST09UOwotCWhpc3RzLT5lbnRyaWVzID0gUkJfUk9PVDsKLQlwdGhyZWFkX211dGV4X2luaXQoJmhpc3RzLT5sb2NrLCBOVUxMKTsKLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmggYi90b29scy9wZXJmL3V0aWwvaGlzdC5oCmluZGV4IGM4NmMxZDIuLmZmNmY5ZDUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9oaXN0LmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hpc3QuaApAQCAtNjMsOCArNjMsNiBAQAogCXN0cnVjdCBjYWxsY2hhaW5fY3Vyc29yCWNhbGxjaGFpbl9jdXJzb3I7CiB9OwogCi12b2lkIGhpc3RzX19pbml0KHN0cnVjdCBoaXN0cyAqaGlzdHMpOwotCiBzdHJ1Y3QgaGlzdF9lbnRyeSAqX19oaXN0c19fYWRkX2VudHJ5KHN0cnVjdCBoaXN0cyAqc2VsZiwKIAkJCQkgICAgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCiAJCQkJICAgICAgc3RydWN0IHN5bWJvbCAqcGFyZW50LCB1NjQgcGVyaW9kKTsKQEAgLTExOSw3ICsxMTcsNiBAQAogCiBzdGF0aWMgaW5saW5lIGludCBoaXN0X2VudHJ5X190dWlfYW5ub3RhdGUoc3RydWN0IGhpc3RfZW50cnkgKnNlbGYgX191c2VkLAogCQkJCQkgICBpbnQgZXZpZHggX191c2VkLAotCQkJCQkgICBpbnQgbnJfZXZlbnRzIF9fdXNlZCwKIAkJCQkJICAgdm9pZCgqdGltZXIpKHZvaWQgKmFyZykgX191c2VkLAogCQkJCQkgICB2b2lkICphcmcgX191c2VkLAogCQkJCQkgICBpbnQgZGVsYXlfc2VjcyBfX3VzZWQpCkBAIC0xMzAsNyArMTI3LDcgQEAKICNkZWZpbmUgS19SSUdIVCAtMgogI2Vsc2UKICNpbmNsdWRlICJ1aS9rZXlzeW1zLmgiCi1pbnQgaGlzdF9lbnRyeV9fdHVpX2Fubm90YXRlKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgaW50IGV2aWR4LCBpbnQgbnJfZXZlbnRzLAoraW50IGhpc3RfZW50cnlfX3R1aV9hbm5vdGF0ZShzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUsIGludCBldmlkeCwKIAkJCSAgICAgdm9pZCgqdGltZXIpKHZvaWQgKmFyZyksIHZvaWQgKmFyZywgaW50IGRlbGF5X3NlY3MpOwogCiBpbnQgcGVyZl9ldmxpc3RfX3R1aV9icm93c2VfaGlzdHMoc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3QsIGNvbnN0IGNoYXIgKmhlbHAsCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaW5jbHVkZS9saW51eC9iaXRvcHMuaCBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oCmluZGV4IDMwNWM4NDguLjYyY2RlZTcgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9pbmNsdWRlL2xpbnV4L2JpdG9wcy5oCkBAIC05LDYgKzksMTcgQEAKICNkZWZpbmUgQklUU19QRVJfQllURSAgICAgICAgICAgOAogI2RlZmluZSBCSVRTX1RPX0xPTkdTKG5yKSAgICAgICBESVZfUk9VTkRfVVAobnIsIEJJVFNfUEVSX0JZVEUgKiBzaXplb2YobG9uZykpCiAKKyNkZWZpbmUgZm9yX2VhY2hfc2V0X2JpdChiaXQsIGFkZHIsIHNpemUpIFwKKwlmb3IgKChiaXQpID0gZmluZF9maXJzdF9iaXQoKGFkZHIpLCAoc2l6ZSkpOwkJXAorCSAgICAgKGJpdCkgPCAoc2l6ZSk7CQkJCQlcCisJICAgICAoYml0KSA9IGZpbmRfbmV4dF9iaXQoKGFkZHIpLCAoc2l6ZSksIChiaXQpICsgMSkpCisKKy8qIHNhbWUgYXMgZm9yX2VhY2hfc2V0X2JpdCgpIGJ1dCB1c2UgYml0IGFzIHZhbHVlIHRvIHN0YXJ0IHdpdGggKi8KKyNkZWZpbmUgZm9yX2VhY2hfc2V0X2JpdF9jb250KGJpdCwgYWRkciwgc2l6ZSkgXAorCWZvciAoKGJpdCkgPSBmaW5kX25leHRfYml0KChhZGRyKSwgKHNpemUpLCAoYml0KSk7CVwKKwkgICAgIChiaXQpIDwgKHNpemUpOwkJCQkJXAorCSAgICAgKGJpdCkgPSBmaW5kX25leHRfYml0KChhZGRyKSwgKHNpemUpLCAoYml0KSArIDEpKQorCiBzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2JpdChpbnQgbnIsIHVuc2lnbmVkIGxvbmcgKmFkZHIpCiB7CiAJYWRkcltuciAvIEJJVFNfUEVSX0xPTkddIHw9IDFVTCA8PCAobnIgJSBCSVRTX1BFUl9MT05HKTsKQEAgLTMwLDQgKzQxLDExMSBAQAogCXJldHVybiBzaXplb2YodykgPT0gNCA/IGh3ZWlnaHQzMih3KSA6IGh3ZWlnaHQ2NCh3KTsKIH0KIAorI2RlZmluZSBCSVRPUF9XT1JEKG5yKQkJKChucikgLyBCSVRTX1BFUl9MT05HKQorCisvKioKKyAqIF9fZmZzIC0gZmluZCBmaXJzdCBiaXQgaW4gd29yZC4KKyAqIEB3b3JkOiBUaGUgd29yZCB0byBzZWFyY2gKKyAqCisgKiBVbmRlZmluZWQgaWYgbm8gYml0IGV4aXN0cywgc28gY29kZSBzaG91bGQgY2hlY2sgYWdhaW5zdCAwIGZpcnN0LgorICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHVuc2lnbmVkIGxvbmcgX19mZnModW5zaWduZWQgbG9uZyB3b3JkKQoreworCWludCBudW0gPSAwOworCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorCWlmICgod29yZCAmIDB4ZmZmZmZmZmYpID09IDApIHsKKwkJbnVtICs9IDMyOworCQl3b3JkID4+PSAzMjsKKwl9CisjZW5kaWYKKwlpZiAoKHdvcmQgJiAweGZmZmYpID09IDApIHsKKwkJbnVtICs9IDE2OworCQl3b3JkID4+PSAxNjsKKwl9CisJaWYgKCh3b3JkICYgMHhmZikgPT0gMCkgeworCQludW0gKz0gODsKKwkJd29yZCA+Pj0gODsKKwl9CisJaWYgKCh3b3JkICYgMHhmKSA9PSAwKSB7CisJCW51bSArPSA0OworCQl3b3JkID4+PSA0OworCX0KKwlpZiAoKHdvcmQgJiAweDMpID09IDApIHsKKwkJbnVtICs9IDI7CisJCXdvcmQgPj49IDI7CisJfQorCWlmICgod29yZCAmIDB4MSkgPT0gMCkKKwkJbnVtICs9IDE7CisJcmV0dXJuIG51bTsKK30KKworLyoKKyAqIEZpbmQgdGhlIGZpcnN0IHNldCBiaXQgaW4gYSBtZW1vcnkgcmVnaW9uLgorICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2ZpbmRfZmlyc3RfYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nICpwID0gYWRkcjsKKwl1bnNpZ25lZCBsb25nIHJlc3VsdCA9IDA7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwl3aGlsZSAoc2l6ZSAmIH4oQklUU19QRVJfTE9ORy0xKSkgeworCQlpZiAoKHRtcCA9ICoocCsrKSkpCisJCQlnb3RvIGZvdW5kOworCQlyZXN1bHQgKz0gQklUU19QRVJfTE9ORzsKKwkJc2l6ZSAtPSBCSVRTX1BFUl9MT05HOworCX0KKwlpZiAoIXNpemUpCisJCXJldHVybiByZXN1bHQ7CisKKwl0bXAgPSAoKnApICYgKH4wVUwgPj4gKEJJVFNfUEVSX0xPTkcgLSBzaXplKSk7CisJaWYgKHRtcCA9PSAwVUwpCQkvKiBBcmUgYW55IGJpdHMgc2V0PyAqLworCQlyZXR1cm4gcmVzdWx0ICsgc2l6ZTsJLyogTm9wZS4gKi8KK2ZvdW5kOgorCXJldHVybiByZXN1bHQgKyBfX2Zmcyh0bXApOworfQorCisvKgorICogRmluZCB0aGUgbmV4dCBzZXQgYml0IGluIGEgbWVtb3J5IHJlZ2lvbi4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitmaW5kX25leHRfYml0KGNvbnN0IHVuc2lnbmVkIGxvbmcgKmFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJY29uc3QgdW5zaWduZWQgbG9uZyAqcCA9IGFkZHIgKyBCSVRPUF9XT1JEKG9mZnNldCk7CisJdW5zaWduZWQgbG9uZyByZXN1bHQgPSBvZmZzZXQgJiB+KEJJVFNfUEVSX0xPTkctMSk7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlpZiAob2Zmc2V0ID49IHNpemUpCisJCXJldHVybiBzaXplOworCXNpemUgLT0gcmVzdWx0OworCW9mZnNldCAlPSBCSVRTX1BFUl9MT05HOworCWlmIChvZmZzZXQpIHsKKwkJdG1wID0gKihwKyspOworCQl0bXAgJj0gKH4wVUwgPDwgb2Zmc2V0KTsKKwkJaWYgKHNpemUgPCBCSVRTX1BFUl9MT05HKQorCQkJZ290byBmb3VuZF9maXJzdDsKKwkJaWYgKHRtcCkKKwkJCWdvdG8gZm91bmRfbWlkZGxlOworCQlzaXplIC09IEJJVFNfUEVSX0xPTkc7CisJCXJlc3VsdCArPSBCSVRTX1BFUl9MT05HOworCX0KKwl3aGlsZSAoc2l6ZSAmIH4oQklUU19QRVJfTE9ORy0xKSkgeworCQlpZiAoKHRtcCA9ICoocCsrKSkpCisJCQlnb3RvIGZvdW5kX21pZGRsZTsKKwkJcmVzdWx0ICs9IEJJVFNfUEVSX0xPTkc7CisJCXNpemUgLT0gQklUU19QRVJfTE9ORzsKKwl9CisJaWYgKCFzaXplKQorCQlyZXR1cm4gcmVzdWx0OworCXRtcCA9ICpwOworCitmb3VuZF9maXJzdDoKKwl0bXAgJj0gKH4wVUwgPj4gKEJJVFNfUEVSX0xPTkcgLSBzaXplKSk7CisJaWYgKHRtcCA9PSAwVUwpCQkvKiBBcmUgYW55IGJpdHMgc2V0PyAqLworCQlyZXR1cm4gcmVzdWx0ICsgc2l6ZTsJLyogTm9wZS4gKi8KK2ZvdW5kX21pZGRsZToKKwlyZXR1cm4gcmVzdWx0ICsgX19mZnModG1wKTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFwLmMgYi90b29scy9wZXJmL3V0aWwvbWFwLmMKaW5kZXggNzgyODRiMS4uMzE2YWEwYSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hcC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuYwpAQCAtNTYyLDYgKzU2MiwxMCBAQAogCUlOSVRfTElTVF9IRUFEKCZzZWxmLT51c2VyX2Rzb3MpOwogCUlOSVRfTElTVF9IRUFEKCZzZWxmLT5rZXJuZWxfZHNvcyk7CiAKKwlzZWxmLT50aHJlYWRzID0gUkJfUk9PVDsKKwlJTklUX0xJU1RfSEVBRCgmc2VsZi0+ZGVhZF90aHJlYWRzKTsKKwlzZWxmLT5sYXN0X21hdGNoID0gTlVMTDsKKwogCXNlbGYtPmttYXBzLm1hY2hpbmUgPSBzZWxmOwogCXNlbGYtPnBpZAkgICAgPSBwaWQ7CiAJc2VsZi0+cm9vdF9kaXIgICAgICA9IHN0cmR1cChyb290X2Rpcik7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbWFwLmggYi90b29scy9wZXJmL3V0aWwvbWFwLmgKaW5kZXggODkwZDg1NS4uMmI4MDE3ZiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL21hcC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9tYXAuaApAQCAtMTgsOSArMTgsMTEgQEAKIGV4dGVybiBjb25zdCBjaGFyICptYXBfdHlwZV9fbmFtZVtNQVBfX05SX1RZUEVTXTsKIAogc3RydWN0IGRzbzsKK3N0cnVjdCBpcF9jYWxsY2hhaW47CiBzdHJ1Y3QgcmVmX3JlbG9jX3N5bTsKIHN0cnVjdCBtYXBfZ3JvdXBzOwogc3RydWN0IG1hY2hpbmU7CitzdHJ1Y3QgcGVyZl9ldnNlbDsKIAogc3RydWN0IG1hcCB7CiAJdW5pb24gewpAQCAtNjEsNyArNjMsMTEgQEAKIHN0cnVjdCBtYWNoaW5lIHsKIAlzdHJ1Y3QgcmJfbm9kZQkgIHJiX25vZGU7CiAJcGlkX3QJCSAgcGlkOworCXUxNgkJICBpZF9oZHJfc2l6ZTsKIAljaGFyCQkgICpyb290X2RpcjsKKwlzdHJ1Y3QgcmJfcm9vdAkgIHRocmVhZHM7CisJc3RydWN0IGxpc3RfaGVhZCAgZGVhZF90aHJlYWRzOworCXN0cnVjdCB0aHJlYWQJICAqbGFzdF9tYXRjaDsKIAlzdHJ1Y3QgbGlzdF9oZWFkICB1c2VyX2Rzb3M7CiAJc3RydWN0IGxpc3RfaGVhZCAga2VybmVsX2Rzb3M7CiAJc3RydWN0IG1hcF9ncm91cHMga21hcHM7CkBAIC0xNDgsNiArMTU0LDEzIEBACiB2b2lkIG1hY2hpbmVfX2V4aXQoc3RydWN0IG1hY2hpbmUgKnNlbGYpOwogdm9pZCBtYWNoaW5lX19kZWxldGUoc3RydWN0IG1hY2hpbmUgKnNlbGYpOwogCitpbnQgbWFjaGluZV9fcmVzb2x2ZV9jYWxsY2hhaW4oc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCisJCQkgICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCisJCQkgICAgICAgc3RydWN0IGlwX2NhbGxjaGFpbiAqY2hhaW4sCisJCQkgICAgICAgc3RydWN0IHN5bWJvbCAqKnBhcmVudCk7CitpbnQgbWFwc19fc2V0X2thbGxzeW1zX3JlZl9yZWxvY19zeW0oc3RydWN0IG1hcCAqKm1hcHMsIGNvbnN0IGNoYXIgKnN5bWJvbF9uYW1lLAorCQkJCSAgICAgdTY0IGFkZHIpOworCiAvKgogICogRGVmYXVsdCBndWVzdCBrZXJuZWwgaXMgZGVmaW5lZCBieSBwYXJhbWV0ZXIgLS1ndWVzdGthbGxzeW1zCiAgKiBhbmQgLS1ndWVzdG1vZHVsZXMKQEAgLTE5MCw2ICsyMDMsMTIgQEAKIAkJCQkJICAgICAgIHN0cnVjdCBtYXAgKiptYXBwLAogCQkJCQkgICAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CiAKKworc3RydWN0IHRocmVhZCAqbWFjaGluZV9fZmluZG5ld190aHJlYWQoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHBpZF90IHBpZCk7Cit2b2lkIG1hY2hpbmVfX3JlbW92ZV90aHJlYWQoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCB0aHJlYWQgKnRoKTsKKworc2l6ZV90IG1hY2hpbmVfX2ZwcmludGYoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIEZJTEUgKmZwKTsKKwogc3RhdGljIGlubGluZQogc3RydWN0IHN5bWJvbCAqbWFjaGluZV9fZmluZF9rZXJuZWxfc3ltYm9sKHN0cnVjdCBtYWNoaW5lICpzZWxmLAogCQkJCQkgICBlbnVtIG1hcF90eXBlIHR5cGUsIHU2NCBhZGRyLApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCmluZGV4IDkyODkxOGIuLjUzMWMyODMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYworKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmMKQEAgLTI1LDggKzI1LDYgQEAKIAlFVlRfSEFORExFRF9BTEwKIH07CiAKLWNoYXIgZGVidWdmc19wYXRoW01BWFBBVEhMRU5dOwotCiAjZGVmaW5lIENIVyh4KSAudHlwZSA9IFBFUkZfVFlQRV9IQVJEV0FSRSwgLmNvbmZpZyA9IFBFUkZfQ09VTlRfSFdfIyN4CiAjZGVmaW5lIENTVyh4KSAudHlwZSA9IFBFUkZfVFlQRV9TT0ZUV0FSRSwgLmNvbmZpZyA9IFBFUkZfQ09VTlRfU1dfIyN4CiAKQEAgLTQwLDYgKzM4LDcgQEAKICAgeyBDSFcoQlJBTkNIX0lOU1RSVUNUSU9OUyksCQkiYnJhbmNoLWluc3RydWN0aW9ucyIsCQkiYnJhbmNoZXMiCQl9LAogICB7IENIVyhCUkFOQ0hfTUlTU0VTKSwJCQkiYnJhbmNoLW1pc3NlcyIsCQkiIgkJCX0sCiAgIHsgQ0hXKEJVU19DWUNMRVMpLAkJCSJidXMtY3ljbGVzIiwJCQkiIgkJCX0sCisgIHsgQ0hXKFJFRl9DUFVfQ1lDTEVTKSwJCSJyZWYtY3ljbGVzIiwJCQkiIgkJCX0sCiAKICAgeyBDU1coQ1BVX0NMT0NLKSwJCQkiY3B1LWNsb2NrIiwJCQkiIgkJCX0sCiAgIHsgQ1NXKFRBU0tfQ0xPQ0spLAkJCSJ0YXNrLWNsb2NrIiwJCQkiIgkJCX0sCkBAIC03MCw2ICs2OSw3IEBACiAJImJ1cy1jeWNsZXMiLAogCSJzdGFsbGVkLWN5Y2xlcy1mcm9udGVuZCIsCiAJInN0YWxsZWQtY3ljbGVzLWJhY2tlbmQiLAorCSJyZWYtY3ljbGVzIiwKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpzd19ldmVudF9uYW1lc1tQRVJGX0NPVU5UX1NXX01BWF0gPSB7CkBAIC0xNDAsNyArMTQwLDcgQEAKIAljaGFyIGV2dF9wYXRoW01BWFBBVEhMRU5dOwogCWludCBmZDsKIAotCXNucHJpbnRmKGV2dF9wYXRoLCBNQVhQQVRITEVOLCAiJXMvJXMvJXMvaWQiLCBkZWJ1Z2ZzX3BhdGgsCisJc25wcmludGYoZXZ0X3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcy8lcy9pZCIsIHRyYWNpbmdfZXZlbnRzX3BhdGgsCiAJCQlzeXNfZGlyLT5kX25hbWUsIGV2dF9kaXItPmRfbmFtZSk7CiAJZmQgPSBvcGVuKGV2dF9wYXRoLCBPX1JET05MWSk7CiAJaWYgKGZkIDwgMCkKQEAgLTE3MSwxNiArMTcxLDE2IEBACiAJY2hhciBldnRfcGF0aFtNQVhQQVRITEVOXTsKIAljaGFyIGRpcl9wYXRoW01BWFBBVEhMRU5dOwogCi0JaWYgKGRlYnVnZnNfdmFsaWRfbW91bnRwb2ludChkZWJ1Z2ZzX3BhdGgpKQorCWlmIChkZWJ1Z2ZzX3ZhbGlkX21vdW50cG9pbnQodHJhY2luZ19ldmVudHNfcGF0aCkpCiAJCXJldHVybiBOVUxMOwogCi0Jc3lzX2RpciA9IG9wZW5kaXIoZGVidWdmc19wYXRoKTsKKwlzeXNfZGlyID0gb3BlbmRpcih0cmFjaW5nX2V2ZW50c19wYXRoKTsKIAlpZiAoIXN5c19kaXIpCiAJCXJldHVybiBOVUxMOwogCiAJZm9yX2VhY2hfc3Vic3lzdGVtKHN5c19kaXIsIHN5c19kaXJlbnQsIHN5c19uZXh0KSB7CiAKLQkJc25wcmludGYoZGlyX3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcyIsIGRlYnVnZnNfcGF0aCwKKwkJc25wcmludGYoZGlyX3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcyIsIHRyYWNpbmdfZXZlbnRzX3BhdGgsCiAJCQkgc3lzX2RpcmVudC5kX25hbWUpOwogCQlldnRfZGlyID0gb3BlbmRpcihkaXJfcGF0aCk7CiAJCWlmICghZXZ0X2RpcikKQEAgLTQ0Nyw3ICs0NDcsNyBAQAogCXU2NCBpZDsKIAlpbnQgZmQ7CiAKLQlzbnByaW50ZihldnRfcGF0aCwgTUFYUEFUSExFTiwgIiVzLyVzLyVzL2lkIiwgZGVidWdmc19wYXRoLAorCXNucHJpbnRmKGV2dF9wYXRoLCBNQVhQQVRITEVOLCAiJXMvJXMvJXMvaWQiLCB0cmFjaW5nX2V2ZW50c19wYXRoLAogCQkgc3lzX25hbWUsIGV2dF9uYW1lKTsKIAogCWZkID0gb3BlbihldnRfcGF0aCwgT19SRE9OTFkpOwpAQCAtNDg1LDcgKzQ4NSw3IEBACiAJc3RydWN0IGRpcmVudCAqZXZ0X2VudDsKIAlESVIgKmV2dF9kaXI7CiAKLQlzbnByaW50ZihldnRfcGF0aCwgTUFYUEFUSExFTiwgIiVzLyVzIiwgZGVidWdmc19wYXRoLCBzeXNfbmFtZSk7CisJc25wcmludGYoZXZ0X3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcyIsIHRyYWNpbmdfZXZlbnRzX3BhdGgsIHN5c19uYW1lKTsKIAlldnRfZGlyID0gb3BlbmRpcihldnRfcGF0aCk7CiAKIAlpZiAoIWV2dF9kaXIpIHsKQEAgLTUyOCw3ICs1MjgsNyBAQAogCWNoYXIgc3lzX25hbWVbTUFYX0VWRU5UX0xFTkdUSF07CiAJdW5zaWduZWQgaW50IHN5c19sZW5ndGgsIGV2dF9sZW5ndGg7CiAKLQlpZiAoZGVidWdmc192YWxpZF9tb3VudHBvaW50KGRlYnVnZnNfcGF0aCkpCisJaWYgKGRlYnVnZnNfdmFsaWRfbW91bnRwb2ludCh0cmFjaW5nX2V2ZW50c19wYXRoKSkKIAkJcmV0dXJuIDA7CiAKIAlldnRfbmFtZSA9IHN0cmNocigqc3RycCwgJzonKTsKQEAgLTkyMCwxMCArOTIwLDEwIEBACiAJY2hhciBldnRfcGF0aFtNQVhQQVRITEVOXTsKIAljaGFyIGRpcl9wYXRoW01BWFBBVEhMRU5dOwogCi0JaWYgKGRlYnVnZnNfdmFsaWRfbW91bnRwb2ludChkZWJ1Z2ZzX3BhdGgpKQorCWlmIChkZWJ1Z2ZzX3ZhbGlkX21vdW50cG9pbnQodHJhY2luZ19ldmVudHNfcGF0aCkpCiAJCXJldHVybjsKIAotCXN5c19kaXIgPSBvcGVuZGlyKGRlYnVnZnNfcGF0aCk7CisJc3lzX2RpciA9IG9wZW5kaXIodHJhY2luZ19ldmVudHNfcGF0aCk7CiAJaWYgKCFzeXNfZGlyKQogCQlyZXR1cm47CiAKQEAgLTkzMiw3ICs5MzIsNyBAQAogCQkgICAgIXN0cmdsb2JtYXRjaChzeXNfZGlyZW50LmRfbmFtZSwgc3Vic3lzX2dsb2IpKQogCQkJY29udGludWU7CiAKLQkJc25wcmludGYoZGlyX3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcyIsIGRlYnVnZnNfcGF0aCwKKwkJc25wcmludGYoZGlyX3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcyIsIHRyYWNpbmdfZXZlbnRzX3BhdGgsCiAJCQkgc3lzX2RpcmVudC5kX25hbWUpOwogCQlldnRfZGlyID0gb3BlbmRpcihkaXJfcGF0aCk7CiAJCWlmICghZXZ0X2RpcikKQEAgLTk2NCwxNiArOTY0LDE2IEBACiAJY2hhciBldnRfcGF0aFtNQVhQQVRITEVOXTsKIAljaGFyIGRpcl9wYXRoW01BWFBBVEhMRU5dOwogCi0JaWYgKGRlYnVnZnNfdmFsaWRfbW91bnRwb2ludChkZWJ1Z2ZzX3BhdGgpKQorCWlmIChkZWJ1Z2ZzX3ZhbGlkX21vdW50cG9pbnQodHJhY2luZ19ldmVudHNfcGF0aCkpCiAJCXJldHVybiAwOwogCi0Jc3lzX2RpciA9IG9wZW5kaXIoZGVidWdmc19wYXRoKTsKKwlzeXNfZGlyID0gb3BlbmRpcih0cmFjaW5nX2V2ZW50c19wYXRoKTsKIAlpZiAoIXN5c19kaXIpCiAJCXJldHVybiAwOwogCiAJZm9yX2VhY2hfc3Vic3lzdGVtKHN5c19kaXIsIHN5c19kaXJlbnQsIHN5c19uZXh0KSB7CiAKLQkJc25wcmludGYoZGlyX3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcyIsIGRlYnVnZnNfcGF0aCwKKwkJc25wcmludGYoZGlyX3BhdGgsIE1BWFBBVEhMRU4sICIlcy8lcyIsIHRyYWNpbmdfZXZlbnRzX3BhdGgsCiAJCQkgc3lzX2RpcmVudC5kX25hbWUpOwogCQlldnRfZGlyID0gb3BlbmRpcihkaXJfcGF0aCk7CiAJCWlmICghZXZ0X2RpcikKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaAppbmRleCAyZjhlMzc1Li43ZTBjYmU3IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcGFyc2UtZXZlbnRzLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5oCkBAIC0zOSw3ICszOSw2IEBACiBpbnQgcHJpbnRfaHdjYWNoZV9ldmVudHMoY29uc3QgY2hhciAqZXZlbnRfZ2xvYik7CiBleHRlcm4gaW50IGlzX3ZhbGlkX3RyYWNlcG9pbnQoY29uc3QgY2hhciAqZXZlbnRfc3RyaW5nKTsKIAotZXh0ZXJuIGNoYXIgZGVidWdmc19wYXRoW107CiBleHRlcm4gaW50IHZhbGlkX2RlYnVnZnNfbW91bnQoY29uc3QgY2hhciAqZGVidWdmcyk7CiAKICNlbmRpZiAvKiBfX1BFUkZfUEFSU0VfRVZFTlRTX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wcm9iZS1maW5kZXIuaAppbmRleCAxMTMyYzhmLi4xN2U5NGQwIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvcHJvYmUtZmluZGVyLmgKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Byb2JlLWZpbmRlci5oCkBAIC01LDcgKzUsNiBAQAogI2luY2x1ZGUgInV0aWwuaCIKICNpbmNsdWRlICJwcm9iZS1ldmVudC5oIgogCi0jZGVmaW5lIE1BWF9QQVRIX0xFTgkJIDI1NgogI2RlZmluZSBNQVhfUFJPQkVfQlVGRkVSCTEwMjQKICNkZWZpbmUgTUFYX1BST0JFUwkJIDEyOAogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcGVybC5jIGIvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXBlcmwuYwppbmRleCA3NDM1MGZmLi5lMzA3NDllIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcGVybC5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1wZXJsLmMKQEAgLTI3LDcgKzI3LDEwIEBACiAKICNpbmNsdWRlICIuLi8uLi9wZXJmLmgiCiAjaW5jbHVkZSAiLi4vdXRpbC5oIgorI2luY2x1ZGUgIi4uL3RocmVhZC5oIgorI2luY2x1ZGUgIi4uL2V2ZW50LmgiCiAjaW5jbHVkZSAiLi4vdHJhY2UtZXZlbnQuaCIKKyNpbmNsdWRlICIuLi9ldnNlbC5oIgogCiAjaW5jbHVkZSA8RVhURVJOLmg+CiAjaW5jbHVkZSA8cGVybC5oPgpAQCAtMjQ1LDExICsyNDgsMTEgQEAKIAlyZXR1cm4gZXZlbnQ7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmxfcHJvY2Vzc19ldmVudCh1bmlvbiBwZXJmX2V2ZW50ICpwZXZlbnQgX191bnVzZWQsCi0JCQkgICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkgICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJICAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gX191bnVzZWQsCi0JCQkgICAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKQorc3RhdGljIHZvaWQgcGVybF9wcm9jZXNzX3RyYWNlcG9pbnQodW5pb24gcGVyZl9ldmVudCAqcGV2ZW50IF9fdW51c2VkLAorCQkJCSAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCQkgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJCSAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSBfX3VudXNlZCwKKwkJCQkgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKQogewogCXN0cnVjdCBmb3JtYXRfZmllbGQgKmZpZWxkOwogCXN0YXRpYyBjaGFyIGhhbmRsZXJbMjU2XTsKQEAgLTI2NSw2ICsyNjgsOSBAQAogCiAJZFNQOwogCisJaWYgKGV2c2VsLT5hdHRyLnR5cGUgIT0gUEVSRl9UWVBFX1RSQUNFUE9JTlQpCisJCXJldHVybjsKKwogCXR5cGUgPSB0cmFjZV9wYXJzZV9jb21tb25fdHlwZShkYXRhKTsKIAogCWV2ZW50ID0gZmluZF9jYWNoZV9ldmVudCh0eXBlKTsKQEAgLTMzMiw2ICszMzgsNDIgQEAKIAlMRUFWRTsKIH0KIAorc3RhdGljIHZvaWQgcGVybF9wcm9jZXNzX2V2ZW50X2dlbmVyaWModW5pb24gcGVyZl9ldmVudCAqcGV2ZW50IF9fdW51c2VkLAorCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCQkgICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fdW51c2VkLAorCQkJCSAgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSBfX3VudXNlZCwKKwkJCQkgICAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkIF9fdW51c2VkKQoreworCWRTUDsKKworCWlmICghZ2V0X2N2KCJwcm9jZXNzX2V2ZW50IiwgMCkpCisJCXJldHVybjsKKworCUVOVEVSOworCVNBVkVUTVBTOworCVBVU0hNQVJLKFNQKTsKKwlYUFVTSHMoc3ZfMm1vcnRhbChuZXdTVnB2bigoY29uc3QgY2hhciAqKXBldmVudCwgcGV2ZW50LT5oZWFkZXIuc2l6ZSkpKTsKKwlYUFVTSHMoc3ZfMm1vcnRhbChuZXdTVnB2bigoY29uc3QgY2hhciAqKSZldnNlbC0+YXR0ciwgc2l6ZW9mKGV2c2VsLT5hdHRyKSkpKTsKKwlYUFVTSHMoc3ZfMm1vcnRhbChuZXdTVnB2bigoY29uc3QgY2hhciAqKXNhbXBsZSwgc2l6ZW9mKCpzYW1wbGUpKSkpOworCVhQVVNIcyhzdl8ybW9ydGFsKG5ld1NWcHZuKChjb25zdCBjaGFyICopc2FtcGxlLT5yYXdfZGF0YSwgc2FtcGxlLT5yYXdfc2l6ZSkpKTsKKwlQVVRCQUNLOworCWNhbGxfcHYoInByb2Nlc3NfZXZlbnQiLCBHX1NDQUxBUik7CisJU1BBR0FJTjsKKwlQVVRCQUNLOworCUZSRUVUTVBTOworCUxFQVZFOworfQorCitzdGF0aWMgdm9pZCBwZXJsX3Byb2Nlc3NfZXZlbnQodW5pb24gcGVyZl9ldmVudCAqcGV2ZW50LAorCQkJICAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCSAgICAgICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKKwkJCSAgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQpCit7CisJcGVybF9wcm9jZXNzX3RyYWNlcG9pbnQocGV2ZW50LCBzYW1wbGUsIGV2c2VsLCBtYWNoaW5lLCB0aHJlYWQpOworCXBlcmxfcHJvY2Vzc19ldmVudF9nZW5lcmljKHBldmVudCwgc2FtcGxlLCBldnNlbCwgbWFjaGluZSwgdGhyZWFkKTsKK30KKwogc3RhdGljIHZvaWQgcnVuX3N0YXJ0X3N1Yih2b2lkKQogewogCWRTUDsgLyogYWNjZXNzIHRvIFBlcmwgc3RhY2sgKi8KQEAgLTU1Myw3ICs1OTUsMjggQEAKIAlmcHJpbnRmKG9mcCwgInN1YiBwcmludF9oZWFkZXJcbntcbiIKIAkJIlx0bXkgKCRldmVudF9uYW1lLCAkY3B1LCAkc2VjcywgJG5zZWNzLCAkcGlkLCAkY29tbSkgPSBAXztcblxuIgogCQkiXHRwcmludGYoXCIlJS0yMHMgJSU1dSAlJTA1dS4lJTA5dSAlJTh1ICUlLTIwcyBcIixcblx0ICAgICAgICIKLQkJIiRldmVudF9uYW1lLCAkY3B1LCAkc2VjcywgJG5zZWNzLCAkcGlkLCAkY29tbSk7XG59Iik7CisJCSIkZXZlbnRfbmFtZSwgJGNwdSwgJHNlY3MsICRuc2VjcywgJHBpZCwgJGNvbW0pO1xufVxuIik7CisKKwlmcHJpbnRmKG9mcCwKKwkJIlxuIyBQYWNrZWQgYnl0ZSBzdHJpbmcgYXJncyBvZiBwcm9jZXNzX2V2ZW50KCk6XG4iCisJCSIjXG4iCisJCSIjICRldmVudDpcdHVuaW9uIHBlcmZfZXZlbnRcdHV0aWwvZXZlbnQuaFxuIgorCQkiIyAkYXR0cjpcdHN0cnVjdCBwZXJmX2V2ZW50X2F0dHJcdGxpbnV4L3BlcmZfZXZlbnQuaFxuIgorCQkiIyAkc2FtcGxlOlx0c3RydWN0IHBlcmZfc2FtcGxlXHR1dGlsL2V2ZW50LmhcbiIKKwkJIiMgJHJhd19kYXRhOlx0cGVyZl9zYW1wbGUtPnJhd19kYXRhXHR1dGlsL2V2ZW50LmhcbiIKKwkJIlxuIgorCQkic3ViIHByb2Nlc3NfZXZlbnRcbiIKKwkJIntcbiIKKwkJIlx0bXkgKCRldmVudCwgJGF0dHIsICRzYW1wbGUsICRyYXdfZGF0YSkgPSBAXztcbiIKKwkJIlxuIgorCQkiXHRteSBAZXZlbnRcdD0gdW5wYWNrKFwiTFNTXCIsICRldmVudCk7XG4iCisJCSJcdG15IEBhdHRyXHQ9IHVucGFjayhcIkxMUVFRUVFMTFFRXCIsICRhdHRyKTtcbiIKKwkJIlx0bXkgQHNhbXBsZVx0PSB1bnBhY2soXCJRTExRUVFRUUxMXCIsICRzYW1wbGUpO1xuIgorCQkiXHRteSBAcmF3X2RhdGFcdD0gdW5wYWNrKFwiQypcIiwgJHJhd19kYXRhKTtcbiIKKwkJIlxuIgorCQkiXHR1c2UgRGF0YTo6RHVtcGVyO1xuIgorCQkiXHRwcmludCBEdW1wZXIgXFxAZXZlbnQsIFxcQGF0dHIsIFxcQHNhbXBsZSwgXFxAcmF3X2RhdGE7XG4iCisJCSJ9XG4iKTsKIAogCWZjbG9zZShvZnApOwogCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcHl0aG9uLmMgYi90b29scy9wZXJmL3V0aWwvc2NyaXB0aW5nLWVuZ2luZXMvdHJhY2UtZXZlbnQtcHl0aG9uLmMKaW5kZXggNmNjZjcwZS4uMGIyYTQ4NyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3NjcmlwdGluZy1lbmdpbmVzL3RyYWNlLWV2ZW50LXB5dGhvbi5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zY3JpcHRpbmctZW5naW5lcy90cmFjZS1ldmVudC1weXRob24uYwpAQCAtMjksNiArMjksOCBAQAogCiAjaW5jbHVkZSAiLi4vLi4vcGVyZi5oIgogI2luY2x1ZGUgIi4uL3V0aWwuaCIKKyNpbmNsdWRlICIuLi9ldmVudC5oIgorI2luY2x1ZGUgIi4uL3RocmVhZC5oIgogI2luY2x1ZGUgIi4uL3RyYWNlLWV2ZW50LmgiCiAKIFB5TU9ESU5JVF9GVU5DIGluaXRwZXJmX3RyYWNlX2NvbnRleHQodm9pZCk7CkBAIC0yMDcsNyArMjA5LDcgQEAKIHN0YXRpYyB2b2lkIHB5dGhvbl9wcm9jZXNzX2V2ZW50KHVuaW9uIHBlcmZfZXZlbnQgKnBldmVudCBfX3VudXNlZCwKIAkJCQkgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkJIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCBfX3VudXNlZCwKLQkJCQkgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiBfX3VudXNlZCwKKwkJCQkgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191bnVzZWQsCiAJCQkJIHN0cnVjdCB0aHJlYWQgKnRocmVhZCkKIHsKIAlQeU9iamVjdCAqaGFuZGxlciwgKnJldHZhbCwgKmNvbnRleHQsICp0LCAqb2JqLCAqZGljdCA9IE5VTEw7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYwppbmRleCA4NWMxZTZiNy4uYjVjYTI1NSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uYworKysgYi90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSAiZXZsaXN0LmgiCiAjaW5jbHVkZSAiZXZzZWwuaCIKICNpbmNsdWRlICJzZXNzaW9uLmgiCisjaW5jbHVkZSAidG9vbC5oIgogI2luY2x1ZGUgInNvcnQuaCIKICNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSAiY3B1bWFwLmgiCkBAIC03OCwzOSArNzksMTMgQEAKIAlyZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyB2b2lkIHBlcmZfc2Vzc2lvbl9faWRfaGVhZGVyX3NpemUoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKLXsKLSAgICAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKmRhdGE7Ci0gICAgICAgdTY0IHNhbXBsZV90eXBlID0gc2Vzc2lvbi0+c2FtcGxlX3R5cGU7Ci0gICAgICAgdTE2IHNpemUgPSAwOwotCi0JaWYgKCFzZXNzaW9uLT5zYW1wbGVfaWRfYWxsKQotCQlnb3RvIG91dDsKLQotICAgICAgIGlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1RJRCkKLSAgICAgICAgICAgICAgIHNpemUgKz0gc2l6ZW9mKGRhdGEtPnRpZCkgKiAyOwotCi0gICAgICAgaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElNRSkKLSAgICAgICAgICAgICAgIHNpemUgKz0gc2l6ZW9mKGRhdGEtPnRpbWUpOwotCi0gICAgICAgaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfSUQpCi0gICAgICAgICAgICAgICBzaXplICs9IHNpemVvZihkYXRhLT5pZCk7Ci0KLSAgICAgICBpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9TVFJFQU1fSUQpCi0gICAgICAgICAgICAgICBzaXplICs9IHNpemVvZihkYXRhLT5zdHJlYW1faWQpOwotCi0gICAgICAgaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ1BVKQotICAgICAgICAgICAgICAgc2l6ZSArPSBzaXplb2YoZGF0YS0+Y3B1KSAqIDI7Ci1vdXQ6Ci0gICAgICAgc2Vzc2lvbi0+aWRfaGRyX3NpemUgPSBzaXplOwotfQotCiB2b2lkIHBlcmZfc2Vzc2lvbl9fdXBkYXRlX3NhbXBsZV90eXBlKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYpCiB7CiAJc2VsZi0+c2FtcGxlX3R5cGUgPSBwZXJmX2V2bGlzdF9fc2FtcGxlX3R5cGUoc2VsZi0+ZXZsaXN0KTsKIAlzZWxmLT5zYW1wbGVfc2l6ZSA9IF9fcGVyZl9ldnNlbF9fc2FtcGxlX3NpemUoc2VsZi0+c2FtcGxlX3R5cGUpOwogCXNlbGYtPnNhbXBsZV9pZF9hbGwgPSBwZXJmX2V2bGlzdF9fc2FtcGxlX2lkX2FsbChzZWxmLT5ldmxpc3QpOwotCXBlcmZfc2Vzc2lvbl9faWRfaGVhZGVyX3NpemUoc2VsZik7CisJc2VsZi0+aWRfaGRyX3NpemUgPSBwZXJmX2V2bGlzdF9faWRfaGRyX3NpemUoc2VsZi0+ZXZsaXN0KTsKKwlzZWxmLT5ob3N0X21hY2hpbmUuaWRfaGRyX3NpemUgPSBzZWxmLT5pZF9oZHJfc2l6ZTsKIH0KIAogaW50IHBlcmZfc2Vzc2lvbl9fY3JlYXRlX2tlcm5lbF9tYXBzKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYpCkBAIC0xMzAsMTggKzEwNSwyNiBAQAogCiBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpwZXJmX3Nlc3Npb25fX25ldyhjb25zdCBjaGFyICpmaWxlbmFtZSwgaW50IG1vZGUsCiAJCQkJICAgICAgIGJvb2wgZm9yY2UsIGJvb2wgcmVwaXBlLAotCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9vcHMgKm9wcykKKwkJCQkgICAgICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCkKIHsKLQlzaXplX3QgbGVuID0gZmlsZW5hbWUgPyBzdHJsZW4oZmlsZW5hbWUpICsgMSA6IDA7Ci0Jc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiA9IHphbGxvYyhzaXplb2YoKnNlbGYpICsgbGVuKTsKKwlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmOworCXN0cnVjdCBzdGF0IHN0OworCXNpemVfdCBsZW47CisKKwlpZiAoIWZpbGVuYW1lIHx8ICFzdHJsZW4oZmlsZW5hbWUpKSB7CisJCWlmICghZnN0YXQoU1RESU5fRklMRU5PLCAmc3QpICYmIFNfSVNGSUZPKHN0LnN0X21vZGUpKQorCQkJZmlsZW5hbWUgPSAiLSI7CisJCWVsc2UKKwkJCWZpbGVuYW1lID0gInBlcmYuZGF0YSI7CisJfQorCisJbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwlzZWxmID0gemFsbG9jKHNpemVvZigqc2VsZikgKyBsZW4pOwogCiAJaWYgKHNlbGYgPT0gTlVMTCkKIAkJZ290byBvdXQ7CiAKIAltZW1jcHkoc2VsZi0+ZmlsZW5hbWUsIGZpbGVuYW1lLCBsZW4pOwotCXNlbGYtPnRocmVhZHMgPSBSQl9ST09UOwotCUlOSVRfTElTVF9IRUFEKCZzZWxmLT5kZWFkX3RocmVhZHMpOwotCXNlbGYtPmxhc3RfbWF0Y2ggPSBOVUxMOwogCS8qCiAJICogT24gNjRiaXQgd2UgY2FuIG1tYXAgdGhlIGRhdGEgZmlsZSBpbiBvbmUgZ28uIE5vIG5lZWQgZm9yIHRpbnkgbW1hcAogCSAqIHNsaWNlcy4gT24gMzJiaXQgd2UgdXNlIDMyTUIuCkBAIC0xNzEsMTAgKzE1NCwxMCBAQAogCQkJZ290byBvdXRfZGVsZXRlOwogCX0KIAotCWlmIChvcHMgJiYgb3BzLT5vcmRlcmluZ19yZXF1aXJlc190aW1lc3RhbXBzICYmCi0JICAgIG9wcy0+b3JkZXJlZF9zYW1wbGVzICYmICFzZWxmLT5zYW1wbGVfaWRfYWxsKSB7CisJaWYgKHRvb2wgJiYgdG9vbC0+b3JkZXJpbmdfcmVxdWlyZXNfdGltZXN0YW1wcyAmJgorCSAgICB0b29sLT5vcmRlcmVkX3NhbXBsZXMgJiYgIXNlbGYtPnNhbXBsZV9pZF9hbGwpIHsKIAkJZHVtcF9wcmludGYoIldBUk5JTkc6IE5vIHNhbXBsZV9pZF9hbGwgc3VwcG9ydCwgZmFsbGluZyBiYWNrIHRvIHVub3JkZXJlZCBwcm9jZXNzaW5nXG4iKTsKLQkJb3BzLT5vcmRlcmVkX3NhbXBsZXMgPSBmYWxzZTsKKwkJdG9vbC0+b3JkZXJlZF9zYW1wbGVzID0gZmFsc2U7CiAJfQogCiBvdXQ6CkBAIC0xODQsMTcgKzE2NywyMiBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgdm9pZCBwZXJmX3Nlc3Npb25fX2RlbGV0ZV9kZWFkX3RocmVhZHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZikKK3N0YXRpYyB2b2lkIG1hY2hpbmVfX2RlbGV0ZV9kZWFkX3RocmVhZHMoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUpCiB7CiAJc3RydWN0IHRocmVhZCAqbiwgKnQ7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodCwgbiwgJnNlbGYtPmRlYWRfdGhyZWFkcywgbm9kZSkgeworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0LCBuLCAmbWFjaGluZS0+ZGVhZF90aHJlYWRzLCBub2RlKSB7CiAJCWxpc3RfZGVsKCZ0LT5ub2RlKTsKIAkJdGhyZWFkX19kZWxldGUodCk7CiAJfQogfQogCi1zdGF0aWMgdm9pZCBwZXJmX3Nlc3Npb25fX2RlbGV0ZV90aHJlYWRzKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYpCitzdGF0aWMgdm9pZCBwZXJmX3Nlc3Npb25fX2RlbGV0ZV9kZWFkX3RocmVhZHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwltYWNoaW5lX19kZWxldGVfZGVhZF90aHJlYWRzKCZzZXNzaW9uLT5ob3N0X21hY2hpbmUpOworfQorCitzdGF0aWMgdm9pZCBtYWNoaW5lX19kZWxldGVfdGhyZWFkcyhzdHJ1Y3QgbWFjaGluZSAqc2VsZikKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqbmQgPSByYl9maXJzdCgmc2VsZi0+dGhyZWFkcyk7CiAKQEAgLTIwNyw2ICsxOTUsMTEgQEAKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIHBlcmZfc2Vzc2lvbl9fZGVsZXRlX3RocmVhZHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbikKK3sKKwltYWNoaW5lX19kZWxldGVfdGhyZWFkcygmc2Vzc2lvbi0+aG9zdF9tYWNoaW5lKTsKK30KKwogdm9pZCBwZXJmX3Nlc3Npb25fX2RlbGV0ZShzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmKQogewogCXBlcmZfc2Vzc2lvbl9fZGVzdHJveV9rZXJuZWxfbWFwcyhzZWxmKTsKQEAgLTIxNyw3ICsyMTAsNyBAQAogCWZyZWUoc2VsZik7CiB9CiAKLXZvaWQgcGVyZl9zZXNzaW9uX19yZW1vdmVfdGhyZWFkKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYsIHN0cnVjdCB0aHJlYWQgKnRoKQordm9pZCBtYWNoaW5lX19yZW1vdmVfdGhyZWFkKHN0cnVjdCBtYWNoaW5lICpzZWxmLCBzdHJ1Y3QgdGhyZWFkICp0aCkKIHsKIAlzZWxmLT5sYXN0X21hdGNoID0gTlVMTDsKIAlyYl9lcmFzZSgmdGgtPnJiX25vZGUsICZzZWxmLT50aHJlYWRzKTsKQEAgLTIzNiwxNiArMjI5LDE2IEBACiAJcmV0dXJuIDA7CiB9CiAKLWludCBwZXJmX3Nlc3Npb25fX3Jlc29sdmVfY2FsbGNoYWluKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYsCi0JCQkJICAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKLQkJCQkgICAgc3RydWN0IGlwX2NhbGxjaGFpbiAqY2hhaW4sCi0JCQkJICAgIHN0cnVjdCBzeW1ib2wgKipwYXJlbnQpCitpbnQgbWFjaGluZV9fcmVzb2x2ZV9jYWxsY2hhaW4oc3RydWN0IG1hY2hpbmUgKnNlbGYsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCSAgICAgICBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQsCisJCQkgICAgICAgc3RydWN0IGlwX2NhbGxjaGFpbiAqY2hhaW4sCisJCQkgICAgICAgc3RydWN0IHN5bWJvbCAqKnBhcmVudCkKIHsKIAl1OCBjcHVtb2RlID0gUEVSRl9SRUNPUkRfTUlTQ19VU0VSOwogCXVuc2lnbmVkIGludCBpOwogCWludCBlcnI7CiAKLQljYWxsY2hhaW5fY3Vyc29yX3Jlc2V0KCZzZWxmLT5jYWxsY2hhaW5fY3Vyc29yKTsKKwljYWxsY2hhaW5fY3Vyc29yX3Jlc2V0KCZldnNlbC0+aGlzdHMuY2FsbGNoYWluX2N1cnNvcik7CiAKIAlmb3IgKGkgPSAwOyBpIDwgY2hhaW4tPm5yOyBpKyspIHsKIAkJdTY0IGlwOwpAQCAtMjcyLDcgKzI2NSw3IEBACiAKIAkJYWwuZmlsdGVyZWQgPSBmYWxzZTsKIAkJdGhyZWFkX19maW5kX2FkZHJfbG9jYXRpb24odGhyZWFkLCBzZWxmLCBjcHVtb2RlLAotCQkJCU1BUF9fRlVOQ1RJT04sIHRocmVhZC0+cGlkLCBpcCwgJmFsLCBOVUxMKTsKKwkJCQkJICAgTUFQX19GVU5DVElPTiwgaXAsICZhbCwgTlVMTCk7CiAJCWlmIChhbC5zeW0gIT0gTlVMTCkgewogCQkJaWYgKHNvcnRfX2hhc19wYXJlbnQgJiYgISpwYXJlbnQgJiYKIAkJCSAgICBzeW1ib2xfX21hdGNoX3BhcmVudF9yZWdleChhbC5zeW0pKQpAQCAtMjgxLDcgKzI3NCw3IEBACiAJCQkJYnJlYWs7CiAJCX0KIAotCQllcnIgPSBjYWxsY2hhaW5fY3Vyc29yX2FwcGVuZCgmc2VsZi0+Y2FsbGNoYWluX2N1cnNvciwKKwkJZXJyID0gY2FsbGNoYWluX2N1cnNvcl9hcHBlbmQoJmV2c2VsLT5oaXN0cy5jYWxsY2hhaW5fY3Vyc29yLAogCQkJCQkgICAgICBpcCwgYWwubWFwLCBhbC5zeW0pOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKQEAgLTI5MCw3NSArMjgzLDkxIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgcHJvY2Vzc19ldmVudF9zeW50aF9zdHViKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50IF9fdXNlZCwKLQkJCQkgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiBfX3VzZWQpCitzdGF0aWMgaW50IHByb2Nlc3NfZXZlbnRfc3ludGhfdHJhY2luZ19kYXRhX3N0dWIodW5pb24gcGVyZl9ldmVudCAqZXZlbnQgX191c2VkLAorCQkJCQkJIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gX191c2VkKQogewogCWR1bXBfcHJpbnRmKCI6IHVuaGFuZGxlZCFcbiIpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2Nlc3NfZXZlbnRfc2FtcGxlX3N0dWIodW5pb24gcGVyZl9ldmVudCAqZXZlbnQgX191c2VkLAorc3RhdGljIGludCBwcm9jZXNzX2V2ZW50X3N5bnRoX2F0dHJfc3R1Yih1bmlvbiBwZXJmX2V2ZW50ICpldmVudCBfX3VzZWQsCisJCQkJCSBzdHJ1Y3QgcGVyZl9ldmxpc3QgKipwZXZsaXN0IF9fdXNlZCkKK3sKKwlkdW1wX3ByaW50ZigiOiB1bmhhbmRsZWQhXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX2V2ZW50X3NhbXBsZV9zdHViKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX191c2VkLAorCQkJCSAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQgX191c2VkLAogCQkJCSAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX191c2VkLAogCQkJCSAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fdXNlZCwKLQkJCQkgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gX191c2VkKQorCQkJCSAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191c2VkKQogewogCWR1bXBfcHJpbnRmKCI6IHVuaGFuZGxlZCFcbiIpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2Nlc3NfZXZlbnRfc3R1Yih1bmlvbiBwZXJmX2V2ZW50ICpldmVudCBfX3VzZWQsCitzdGF0aWMgaW50IHByb2Nlc3NfZXZlbnRfc3R1YihzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKKwkJCSAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50IF9fdXNlZCwKIAkJCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlIF9fdXNlZCwKLQkJCSAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gX191c2VkKQorCQkJICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191c2VkKQogewogCWR1bXBfcHJpbnRmKCI6IHVuaGFuZGxlZCFcbiIpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2Nlc3NfZmluaXNoZWRfcm91bmRfc3R1Yih1bmlvbiBwZXJmX2V2ZW50ICpldmVudCBfX3VzZWQsCi0JCQkJICAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gX191c2VkLAotCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9vcHMgKm9wcyBfX3VzZWQpCitzdGF0aWMgaW50IHByb2Nlc3NfZmluaXNoZWRfcm91bmRfc3R1YihzdHJ1Y3QgcGVyZl90b29sICp0b29sIF9fdXNlZCwKKwkJCQkgICAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQgX191c2VkLAorCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpwZXJmX3Nlc3Npb24gX191c2VkKQogewogCWR1bXBfcHJpbnRmKCI6IHVuaGFuZGxlZCFcbiIpOwogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHByb2Nlc3NfZmluaXNoZWRfcm91bmQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkJICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJCSAgc3RydWN0IHBlcmZfZXZlbnRfb3BzICpvcHMpOwotCi1zdGF0aWMgdm9pZCBwZXJmX2V2ZW50X29wc19fZmlsbF9kZWZhdWx0cyhzdHJ1Y3QgcGVyZl9ldmVudF9vcHMgKmhhbmRsZXIpCitzdGF0aWMgaW50IHByb2Nlc3NfZXZlbnRfdHlwZV9zdHViKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wgX191c2VkLAorCQkJCSAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50IF9fdXNlZCkKIHsKLQlpZiAoaGFuZGxlci0+c2FtcGxlID09IE5VTEwpCi0JCWhhbmRsZXItPnNhbXBsZSA9IHByb2Nlc3NfZXZlbnRfc2FtcGxlX3N0dWI7Ci0JaWYgKGhhbmRsZXItPm1tYXAgPT0gTlVMTCkKLQkJaGFuZGxlci0+bW1hcCA9IHByb2Nlc3NfZXZlbnRfc3R1YjsKLQlpZiAoaGFuZGxlci0+Y29tbSA9PSBOVUxMKQotCQloYW5kbGVyLT5jb21tID0gcHJvY2Vzc19ldmVudF9zdHViOwotCWlmIChoYW5kbGVyLT5mb3JrID09IE5VTEwpCi0JCWhhbmRsZXItPmZvcmsgPSBwcm9jZXNzX2V2ZW50X3N0dWI7Ci0JaWYgKGhhbmRsZXItPmV4aXQgPT0gTlVMTCkKLQkJaGFuZGxlci0+ZXhpdCA9IHByb2Nlc3NfZXZlbnRfc3R1YjsKLQlpZiAoaGFuZGxlci0+bG9zdCA9PSBOVUxMKQotCQloYW5kbGVyLT5sb3N0ID0gcGVyZl9ldmVudF9fcHJvY2Vzc19sb3N0OwotCWlmIChoYW5kbGVyLT5yZWFkID09IE5VTEwpCi0JCWhhbmRsZXItPnJlYWQgPSBwcm9jZXNzX2V2ZW50X3N0dWI7Ci0JaWYgKGhhbmRsZXItPnRocm90dGxlID09IE5VTEwpCi0JCWhhbmRsZXItPnRocm90dGxlID0gcHJvY2Vzc19ldmVudF9zdHViOwotCWlmIChoYW5kbGVyLT51bnRocm90dGxlID09IE5VTEwpCi0JCWhhbmRsZXItPnVudGhyb3R0bGUgPSBwcm9jZXNzX2V2ZW50X3N0dWI7Ci0JaWYgKGhhbmRsZXItPmF0dHIgPT0gTlVMTCkKLQkJaGFuZGxlci0+YXR0ciA9IHByb2Nlc3NfZXZlbnRfc3ludGhfc3R1YjsKLQlpZiAoaGFuZGxlci0+ZXZlbnRfdHlwZSA9PSBOVUxMKQotCQloYW5kbGVyLT5ldmVudF90eXBlID0gcHJvY2Vzc19ldmVudF9zeW50aF9zdHViOwotCWlmIChoYW5kbGVyLT50cmFjaW5nX2RhdGEgPT0gTlVMTCkKLQkJaGFuZGxlci0+dHJhY2luZ19kYXRhID0gcHJvY2Vzc19ldmVudF9zeW50aF9zdHViOwotCWlmIChoYW5kbGVyLT5idWlsZF9pZCA9PSBOVUxMKQotCQloYW5kbGVyLT5idWlsZF9pZCA9IHByb2Nlc3NfZXZlbnRfc3ludGhfc3R1YjsKLQlpZiAoaGFuZGxlci0+ZmluaXNoZWRfcm91bmQgPT0gTlVMTCkgewotCQlpZiAoaGFuZGxlci0+b3JkZXJlZF9zYW1wbGVzKQotCQkJaGFuZGxlci0+ZmluaXNoZWRfcm91bmQgPSBwcm9jZXNzX2ZpbmlzaGVkX3JvdW5kOworCWR1bXBfcHJpbnRmKCI6IHVuaGFuZGxlZCFcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByb2Nlc3NfZmluaXNoZWRfcm91bmQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQkgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCSAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7CisKK3N0YXRpYyB2b2lkIHBlcmZfdG9vbF9fZmlsbF9kZWZhdWx0cyhzdHJ1Y3QgcGVyZl90b29sICp0b29sKQoreworCWlmICh0b29sLT5zYW1wbGUgPT0gTlVMTCkKKwkJdG9vbC0+c2FtcGxlID0gcHJvY2Vzc19ldmVudF9zYW1wbGVfc3R1YjsKKwlpZiAodG9vbC0+bW1hcCA9PSBOVUxMKQorCQl0b29sLT5tbWFwID0gcHJvY2Vzc19ldmVudF9zdHViOworCWlmICh0b29sLT5jb21tID09IE5VTEwpCisJCXRvb2wtPmNvbW0gPSBwcm9jZXNzX2V2ZW50X3N0dWI7CisJaWYgKHRvb2wtPmZvcmsgPT0gTlVMTCkKKwkJdG9vbC0+Zm9yayA9IHByb2Nlc3NfZXZlbnRfc3R1YjsKKwlpZiAodG9vbC0+ZXhpdCA9PSBOVUxMKQorCQl0b29sLT5leGl0ID0gcHJvY2Vzc19ldmVudF9zdHViOworCWlmICh0b29sLT5sb3N0ID09IE5VTEwpCisJCXRvb2wtPmxvc3QgPSBwZXJmX2V2ZW50X19wcm9jZXNzX2xvc3Q7CisJaWYgKHRvb2wtPnJlYWQgPT0gTlVMTCkKKwkJdG9vbC0+cmVhZCA9IHByb2Nlc3NfZXZlbnRfc2FtcGxlX3N0dWI7CisJaWYgKHRvb2wtPnRocm90dGxlID09IE5VTEwpCisJCXRvb2wtPnRocm90dGxlID0gcHJvY2Vzc19ldmVudF9zdHViOworCWlmICh0b29sLT51bnRocm90dGxlID09IE5VTEwpCisJCXRvb2wtPnVudGhyb3R0bGUgPSBwcm9jZXNzX2V2ZW50X3N0dWI7CisJaWYgKHRvb2wtPmF0dHIgPT0gTlVMTCkKKwkJdG9vbC0+YXR0ciA9IHByb2Nlc3NfZXZlbnRfc3ludGhfYXR0cl9zdHViOworCWlmICh0b29sLT5ldmVudF90eXBlID09IE5VTEwpCisJCXRvb2wtPmV2ZW50X3R5cGUgPSBwcm9jZXNzX2V2ZW50X3R5cGVfc3R1YjsKKwlpZiAodG9vbC0+dHJhY2luZ19kYXRhID09IE5VTEwpCisJCXRvb2wtPnRyYWNpbmdfZGF0YSA9IHByb2Nlc3NfZXZlbnRfc3ludGhfdHJhY2luZ19kYXRhX3N0dWI7CisJaWYgKHRvb2wtPmJ1aWxkX2lkID09IE5VTEwpCisJCXRvb2wtPmJ1aWxkX2lkID0gcHJvY2Vzc19maW5pc2hlZF9yb3VuZF9zdHViOworCWlmICh0b29sLT5maW5pc2hlZF9yb3VuZCA9PSBOVUxMKSB7CisJCWlmICh0b29sLT5vcmRlcmVkX3NhbXBsZXMpCisJCQl0b29sLT5maW5pc2hlZF9yb3VuZCA9IHByb2Nlc3NfZmluaXNoZWRfcm91bmQ7CiAJCWVsc2UKLQkJCWhhbmRsZXItPmZpbmlzaGVkX3JvdW5kID0gcHJvY2Vzc19maW5pc2hlZF9yb3VuZF9zdHViOworCQkJdG9vbC0+ZmluaXNoZWRfcm91bmQgPSBwcm9jZXNzX2ZpbmlzaGVkX3JvdW5kX3N0dWI7CiAJfQogfQogCkBAIC00OTAsMTEgKzQ5OSwxMSBAQAogc3RhdGljIGludCBwZXJmX3Nlc3Npb25fZGVsaXZlcl9ldmVudChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAogCQkJCSAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAogCQkJCSAgICAgIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAotCQkJCSAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X29wcyAqb3BzLAorCQkJCSAgICAgIHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsCiAJCQkJICAgICAgdTY0IGZpbGVfb2Zmc2V0KTsKIAogc3RhdGljIHZvaWQgZmx1c2hfc2FtcGxlX3F1ZXVlKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnMsCi0JCQkgICAgICAgc3RydWN0IHBlcmZfZXZlbnRfb3BzICpvcHMpCisJCQkgICAgICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCkKIHsKIAlzdHJ1Y3Qgb3JkZXJlZF9zYW1wbGVzICpvcyA9ICZzLT5vcmRlcmVkX3NhbXBsZXM7CiAJc3RydWN0IGxpc3RfaGVhZCAqaGVhZCA9ICZvcy0+c2FtcGxlczsKQEAgLTUwNSw3ICs1MTQsNyBAQAogCXVuc2lnbmVkIGlkeCA9IDAsIHByb2dyZXNzX25leHQgPSBvcy0+bnJfc2FtcGxlcyAvIDE2OwogCWludCByZXQ7CiAKLQlpZiAoIW9wcy0+b3JkZXJlZF9zYW1wbGVzIHx8ICFsaW1pdCkKKwlpZiAoIXRvb2wtPm9yZGVyZWRfc2FtcGxlcyB8fCAhbGltaXQpCiAJCXJldHVybjsKIAogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVyLCB0bXAsIGhlYWQsIGxpc3QpIHsKQEAgLTUxNiw3ICs1MjUsNyBAQAogCQlpZiAocmV0KQogCQkJcHJfZXJyKCJDYW4ndCBwYXJzZSBzYW1wbGUsIGVyciA9ICVkXG4iLCByZXQpOwogCQllbHNlCi0JCQlwZXJmX3Nlc3Npb25fZGVsaXZlcl9ldmVudChzLCBpdGVyLT5ldmVudCwgJnNhbXBsZSwgb3BzLAorCQkJcGVyZl9zZXNzaW9uX2RlbGl2ZXJfZXZlbnQocywgaXRlci0+ZXZlbnQsICZzYW1wbGUsIHRvb2wsCiAJCQkJCQkgICBpdGVyLT5maWxlX29mZnNldCk7CiAKIAkJb3MtPmxhc3RfZmx1c2ggPSBpdGVyLT50aW1lc3RhbXA7CkBAIC01NzgsMTEgKzU4NywxMSBAQAogICogICAgICBGbHVzaCBldmVyeSBldmVudHMgYmVsb3cgdGltZXN0YW1wIDcKICAqICAgICAgZXRjLi4uCiAgKi8KLXN0YXRpYyBpbnQgcHJvY2Vzc19maW5pc2hlZF9yb3VuZCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCBfX3VzZWQsCi0JCQkJICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJCSAgc3RydWN0IHBlcmZfZXZlbnRfb3BzICpvcHMpCitzdGF0aWMgaW50IHByb2Nlc3NfZmluaXNoZWRfcm91bmQoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKKwkJCQkgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50IF9fdXNlZCwKKwkJCQkgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pCiB7Ci0JZmx1c2hfc2FtcGxlX3F1ZXVlKHNlc3Npb24sIG9wcyk7CisJZmx1c2hfc2FtcGxlX3F1ZXVlKHNlc3Npb24sIHRvb2wpOwogCXNlc3Npb24tPm9yZGVyZWRfc2FtcGxlcy5uZXh0X2ZsdXNoID0gc2Vzc2lvbi0+b3JkZXJlZF9zYW1wbGVzLm1heF90aW1lc3RhbXA7CiAKIAlyZXR1cm4gMDsKQEAgLTczNywxMyArNzQ2LDI2IEBACiAJCWNhbGxjaGFpbl9fcHJpbnRmKHNhbXBsZSk7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgbWFjaGluZSAqCisJcGVyZl9zZXNzaW9uX19maW5kX21hY2hpbmVfZm9yX2NwdW1vZGUoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKKwkJCQkJICAgICAgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50KQoreworCWNvbnN0IHU4IGNwdW1vZGUgPSBldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX1JFQ09SRF9NSVNDX0NQVU1PREVfTUFTSzsKKworCWlmIChjcHVtb2RlID09IFBFUkZfUkVDT1JEX01JU0NfR1VFU1RfS0VSTkVMICYmIHBlcmZfZ3Vlc3QpCisJCXJldHVybiBwZXJmX3Nlc3Npb25fX2ZpbmRfbWFjaGluZShzZXNzaW9uLCBldmVudC0+aXAucGlkKTsKKworCXJldHVybiBwZXJmX3Nlc3Npb25fX2ZpbmRfaG9zdF9tYWNoaW5lKHNlc3Npb24pOworfQorCiBzdGF0aWMgaW50IHBlcmZfc2Vzc2lvbl9kZWxpdmVyX2V2ZW50KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCiAJCQkJICAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkJICAgICAgc3RydWN0IHBlcmZfZXZlbnRfb3BzICpvcHMsCisJCQkJICAgICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKIAkJCQkgICAgICB1NjQgZmlsZV9vZmZzZXQpCiB7CiAJc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsOworCXN0cnVjdCBtYWNoaW5lICptYWNoaW5lOwogCiAJZHVtcF9ldmVudChzZXNzaW9uLCBldmVudCwgZmlsZV9vZmZzZXQsIHNhbXBsZSk7CiAKQEAgLTc2NSw2ICs3ODcsOCBAQAogCQloaXN0c19faW5jX25yX2V2ZW50cygmZXZzZWwtPmhpc3RzLCBldmVudC0+aGVhZGVyLnR5cGUpOwogCX0KIAorCW1hY2hpbmUgPSBwZXJmX3Nlc3Npb25fX2ZpbmRfbWFjaGluZV9mb3JfY3B1bW9kZShzZXNzaW9uLCBldmVudCk7CisKIAlzd2l0Y2ggKGV2ZW50LT5oZWFkZXIudHlwZSkgewogCWNhc2UgUEVSRl9SRUNPUkRfU0FNUExFOgogCQlkdW1wX3NhbXBsZShzZXNzaW9uLCBldmVudCwgc2FtcGxlKTsKQEAgLTc3MiwyMyArNzk2LDI1IEBACiAJCQkrK3Nlc3Npb24tPmhpc3RzLnN0YXRzLm5yX3Vua25vd25faWQ7CiAJCQlyZXR1cm4gLTE7CiAJCX0KLQkJcmV0dXJuIG9wcy0+c2FtcGxlKGV2ZW50LCBzYW1wbGUsIGV2c2VsLCBzZXNzaW9uKTsKKwkJcmV0dXJuIHRvb2wtPnNhbXBsZSh0b29sLCBldmVudCwgc2FtcGxlLCBldnNlbCwgbWFjaGluZSk7CiAJY2FzZSBQRVJGX1JFQ09SRF9NTUFQOgotCQlyZXR1cm4gb3BzLT5tbWFwKGV2ZW50LCBzYW1wbGUsIHNlc3Npb24pOworCQlyZXR1cm4gdG9vbC0+bW1hcCh0b29sLCBldmVudCwgc2FtcGxlLCBtYWNoaW5lKTsKIAljYXNlIFBFUkZfUkVDT1JEX0NPTU06Ci0JCXJldHVybiBvcHMtPmNvbW0oZXZlbnQsIHNhbXBsZSwgc2Vzc2lvbik7CisJCXJldHVybiB0b29sLT5jb21tKHRvb2wsIGV2ZW50LCBzYW1wbGUsIG1hY2hpbmUpOwogCWNhc2UgUEVSRl9SRUNPUkRfRk9SSzoKLQkJcmV0dXJuIG9wcy0+Zm9yayhldmVudCwgc2FtcGxlLCBzZXNzaW9uKTsKKwkJcmV0dXJuIHRvb2wtPmZvcmsodG9vbCwgZXZlbnQsIHNhbXBsZSwgbWFjaGluZSk7CiAJY2FzZSBQRVJGX1JFQ09SRF9FWElUOgotCQlyZXR1cm4gb3BzLT5leGl0KGV2ZW50LCBzYW1wbGUsIHNlc3Npb24pOworCQlyZXR1cm4gdG9vbC0+ZXhpdCh0b29sLCBldmVudCwgc2FtcGxlLCBtYWNoaW5lKTsKIAljYXNlIFBFUkZfUkVDT1JEX0xPU1Q6Ci0JCXJldHVybiBvcHMtPmxvc3QoZXZlbnQsIHNhbXBsZSwgc2Vzc2lvbik7CisJCWlmICh0b29sLT5sb3N0ID09IHBlcmZfZXZlbnRfX3Byb2Nlc3NfbG9zdCkKKwkJCXNlc3Npb24tPmhpc3RzLnN0YXRzLnRvdGFsX2xvc3QgKz0gZXZlbnQtPmxvc3QubG9zdDsKKwkJcmV0dXJuIHRvb2wtPmxvc3QodG9vbCwgZXZlbnQsIHNhbXBsZSwgbWFjaGluZSk7CiAJY2FzZSBQRVJGX1JFQ09SRF9SRUFEOgotCQlyZXR1cm4gb3BzLT5yZWFkKGV2ZW50LCBzYW1wbGUsIHNlc3Npb24pOworCQlyZXR1cm4gdG9vbC0+cmVhZCh0b29sLCBldmVudCwgc2FtcGxlLCBldnNlbCwgbWFjaGluZSk7CiAJY2FzZSBQRVJGX1JFQ09SRF9USFJPVFRMRToKLQkJcmV0dXJuIG9wcy0+dGhyb3R0bGUoZXZlbnQsIHNhbXBsZSwgc2Vzc2lvbik7CisJCXJldHVybiB0b29sLT50aHJvdHRsZSh0b29sLCBldmVudCwgc2FtcGxlLCBtYWNoaW5lKTsKIAljYXNlIFBFUkZfUkVDT1JEX1VOVEhST1RUTEU6Ci0JCXJldHVybiBvcHMtPnVudGhyb3R0bGUoZXZlbnQsIHNhbXBsZSwgc2Vzc2lvbik7CisJCXJldHVybiB0b29sLT51bnRocm90dGxlKHRvb2wsIGV2ZW50LCBzYW1wbGUsIG1hY2hpbmUpOwogCWRlZmF1bHQ6CiAJCSsrc2Vzc2lvbi0+aGlzdHMuc3RhdHMubnJfdW5rbm93bl9ldmVudHM7CiAJCXJldHVybiAtMTsKQEAgLTgxMiwyNCArODM4LDI5IEBACiB9CiAKIHN0YXRpYyBpbnQgcGVyZl9zZXNzaW9uX19wcm9jZXNzX3VzZXJfZXZlbnQoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkJCSAgICBzdHJ1Y3QgcGVyZl9ldmVudF9vcHMgKm9wcywgdTY0IGZpbGVfb2Zmc2V0KQorCQkJCQkgICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwgdTY0IGZpbGVfb2Zmc2V0KQogeworCWludCBlcnI7CisKIAlkdW1wX2V2ZW50KHNlc3Npb24sIGV2ZW50LCBmaWxlX29mZnNldCwgTlVMTCk7CiAKIAkvKiBUaGVzZSBldmVudHMgYXJlIHByb2Nlc3NlZCByaWdodCBhd2F5ICovCiAJc3dpdGNoIChldmVudC0+aGVhZGVyLnR5cGUpIHsKIAljYXNlIFBFUkZfUkVDT1JEX0hFQURFUl9BVFRSOgotCQlyZXR1cm4gb3BzLT5hdHRyKGV2ZW50LCBzZXNzaW9uKTsKKwkJZXJyID0gdG9vbC0+YXR0cihldmVudCwgJnNlc3Npb24tPmV2bGlzdCk7CisJCWlmIChlcnIgPT0gMCkKKwkJCXBlcmZfc2Vzc2lvbl9fdXBkYXRlX3NhbXBsZV90eXBlKHNlc3Npb24pOworCQlyZXR1cm4gZXJyOwogCWNhc2UgUEVSRl9SRUNPUkRfSEVBREVSX0VWRU5UX1RZUEU6Ci0JCXJldHVybiBvcHMtPmV2ZW50X3R5cGUoZXZlbnQsIHNlc3Npb24pOworCQlyZXR1cm4gdG9vbC0+ZXZlbnRfdHlwZSh0b29sLCBldmVudCk7CiAJY2FzZSBQRVJGX1JFQ09SRF9IRUFERVJfVFJBQ0lOR19EQVRBOgogCQkvKiBzZXR1cCBmb3IgcmVhZGluZyBhbWlkc3QgbW1hcCAqLwogCQlsc2VlayhzZXNzaW9uLT5mZCwgZmlsZV9vZmZzZXQsIFNFRUtfU0VUKTsKLQkJcmV0dXJuIG9wcy0+dHJhY2luZ19kYXRhKGV2ZW50LCBzZXNzaW9uKTsKKwkJcmV0dXJuIHRvb2wtPnRyYWNpbmdfZGF0YShldmVudCwgc2Vzc2lvbik7CiAJY2FzZSBQRVJGX1JFQ09SRF9IRUFERVJfQlVJTERfSUQ6Ci0JCXJldHVybiBvcHMtPmJ1aWxkX2lkKGV2ZW50LCBzZXNzaW9uKTsKKwkJcmV0dXJuIHRvb2wtPmJ1aWxkX2lkKHRvb2wsIGV2ZW50LCBzZXNzaW9uKTsKIAljYXNlIFBFUkZfUkVDT1JEX0ZJTklTSEVEX1JPVU5EOgotCQlyZXR1cm4gb3BzLT5maW5pc2hlZF9yb3VuZChldmVudCwgc2Vzc2lvbiwgb3BzKTsKKwkJcmV0dXJuIHRvb2wtPmZpbmlzaGVkX3JvdW5kKHRvb2wsIGV2ZW50LCBzZXNzaW9uKTsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC04MzcsNyArODY4LDcgQEAKIAogc3RhdGljIGludCBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnQoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKIAkJCQkgICAgICAgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X29wcyAqb3BzLAorCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl90b29sICp0b29sLAogCQkJCSAgICAgICB1NjQgZmlsZV9vZmZzZXQpCiB7CiAJc3RydWN0IHBlcmZfc2FtcGxlIHNhbXBsZTsKQEAgLTg1Myw3ICs4ODQsNyBAQAogCWhpc3RzX19pbmNfbnJfZXZlbnRzKCZzZXNzaW9uLT5oaXN0cywgZXZlbnQtPmhlYWRlci50eXBlKTsKIAogCWlmIChldmVudC0+aGVhZGVyLnR5cGUgPj0gUEVSRl9SRUNPUkRfVVNFUl9UWVBFX1NUQVJUKQotCQlyZXR1cm4gcGVyZl9zZXNzaW9uX19wcm9jZXNzX3VzZXJfZXZlbnQoc2Vzc2lvbiwgZXZlbnQsIG9wcywgZmlsZV9vZmZzZXQpOworCQlyZXR1cm4gcGVyZl9zZXNzaW9uX19wcm9jZXNzX3VzZXJfZXZlbnQoc2Vzc2lvbiwgZXZlbnQsIHRvb2wsIGZpbGVfb2Zmc2V0KTsKIAogCS8qCiAJICogRm9yIGFsbCBrZXJuZWwgZXZlbnRzIHdlIGdldCB0aGUgc2FtcGxlIGRhdGEKQEAgLTg2NiwxNCArODk3LDE0IEBACiAJaWYgKHBlcmZfc2Vzc2lvbl9fcHJlcHJvY2Vzc19zYW1wbGUoc2Vzc2lvbiwgZXZlbnQsICZzYW1wbGUpKQogCQlyZXR1cm4gMDsKIAotCWlmIChvcHMtPm9yZGVyZWRfc2FtcGxlcykgeworCWlmICh0b29sLT5vcmRlcmVkX3NhbXBsZXMpIHsKIAkJcmV0ID0gcGVyZl9zZXNzaW9uX3F1ZXVlX2V2ZW50KHNlc3Npb24sIGV2ZW50LCAmc2FtcGxlLAogCQkJCQkgICAgICAgZmlsZV9vZmZzZXQpOwogCQlpZiAocmV0ICE9IC1FVElNRSkKIAkJCXJldHVybiByZXQ7CiAJfQogCi0JcmV0dXJuIHBlcmZfc2Vzc2lvbl9kZWxpdmVyX2V2ZW50KHNlc3Npb24sIGV2ZW50LCAmc2FtcGxlLCBvcHMsCisJcmV0dXJuIHBlcmZfc2Vzc2lvbl9kZWxpdmVyX2V2ZW50KHNlc3Npb24sIGV2ZW50LCAmc2FtcGxlLCB0b29sLAogCQkJCQkgIGZpbGVfb2Zmc2V0KTsKIH0KIApAQCAtODg0LDYgKzkxNSwxMSBAQAogCXNlbGYtPnNpemUgPSBic3dhcF8xNihzZWxmLT5zaXplKTsKIH0KIAorc3RydWN0IHRocmVhZCAqcGVyZl9zZXNzaW9uX19maW5kbmV3KHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sIHBpZF90IHBpZCkKK3sKKwlyZXR1cm4gbWFjaGluZV9fZmluZG5ld190aHJlYWQoJnNlc3Npb24tPmhvc3RfbWFjaGluZSwgcGlkKTsKK30KKwogc3RhdGljIHN0cnVjdCB0aHJlYWQgKnBlcmZfc2Vzc2lvbl9fcmVnaXN0ZXJfaWRsZV90aHJlYWQoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZikKIHsKIAlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSBwZXJmX3Nlc3Npb25fX2ZpbmRuZXcoc2VsZiwgMCk7CkBAIC04OTcsOSArOTMzLDkgQEAKIH0KIAogc3RhdGljIHZvaWQgcGVyZl9zZXNzaW9uX193YXJuX2Fib3V0X2Vycm9ycyhjb25zdCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJCQkgICAgY29uc3Qgc3RydWN0IHBlcmZfZXZlbnRfb3BzICpvcHMpCisJCQkJCSAgICBjb25zdCBzdHJ1Y3QgcGVyZl90b29sICp0b29sKQogewotCWlmIChvcHMtPmxvc3QgPT0gcGVyZl9ldmVudF9fcHJvY2Vzc19sb3N0ICYmCisJaWYgKHRvb2wtPmxvc3QgPT0gcGVyZl9ldmVudF9fcHJvY2Vzc19sb3N0ICYmCiAJICAgIHNlc3Npb24tPmhpc3RzLnN0YXRzLm5yX2V2ZW50c1tQRVJGX1JFQ09SRF9MT1NUXSAhPSAwKSB7CiAJCXVpX193YXJuaW5nKCJQcm9jZXNzZWQgJWQgZXZlbnRzIGFuZCBsb3N0ICVkIGNodW5rcyFcblxuIgogCQkJICAgICJDaGVjayBJTy9DUFUgb3ZlcmxvYWQhXG5cbiIsCkBAIC05MzQsNyArOTcwLDcgQEAKIHZvbGF0aWxlIGludCBzZXNzaW9uX2RvbmU7CiAKIHN0YXRpYyBpbnQgX19wZXJmX3Nlc3Npb25fX3Byb2Nlc3NfcGlwZV9ldmVudHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiwKLQkJCQkJICAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X29wcyAqb3BzKQorCQkJCQkgICAgICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCkKIHsKIAl1bmlvbiBwZXJmX2V2ZW50IGV2ZW50OwogCXVpbnQzMl90IHNpemU7CkBAIC05NDMsNyArOTc5LDcgQEAKIAlpbnQgZXJyOwogCXZvaWQgKnA7CiAKLQlwZXJmX2V2ZW50X29wc19fZmlsbF9kZWZhdWx0cyhvcHMpOworCXBlcmZfdG9vbF9fZmlsbF9kZWZhdWx0cyh0b29sKTsKIAogCWhlYWQgPSAwOwogbW9yZToKQEAgLTk3OSw4ICsxMDE1LDcgQEAKIAkJfQogCX0KIAotCWlmIChzaXplID09IDAgfHwKLQkgICAgKHNraXAgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnQoc2VsZiwgJmV2ZW50LCBvcHMsIGhlYWQpKSA8IDApIHsKKwlpZiAoKHNraXAgPSBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnQoc2VsZiwgJmV2ZW50LCB0b29sLCBoZWFkKSkgPCAwKSB7CiAJCWR1bXBfcHJpbnRmKCIlIyIgUFJJeDY0ICIgWyUjeF06IHNraXBwaW5nIHVua25vd24gaGVhZGVyIHR5cGU6ICVkXG4iLAogCQkJICAgIGhlYWQsIGV2ZW50LmhlYWRlci5zaXplLCBldmVudC5oZWFkZXIudHlwZSk7CiAJCS8qCkBAIC0xMDAzLDcgKzEwMzgsNyBAQAogZG9uZToKIAllcnIgPSAwOwogb3V0X2VycjoKLQlwZXJmX3Nlc3Npb25fX3dhcm5fYWJvdXRfZXJyb3JzKHNlbGYsIG9wcyk7CisJcGVyZl9zZXNzaW9uX193YXJuX2Fib3V0X2Vycm9ycyhzZWxmLCB0b29sKTsKIAlwZXJmX3Nlc3Npb25fZnJlZV9zYW1wbGVfYnVmZmVycyhzZWxmKTsKIAlyZXR1cm4gZXJyOwogfQpAQCAtMTAzNCw3ICsxMDY5LDcgQEAKIAogaW50IF9fcGVyZl9zZXNzaW9uX19wcm9jZXNzX2V2ZW50cyhzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAogCQkJCSAgIHU2NCBkYXRhX29mZnNldCwgdTY0IGRhdGFfc2l6ZSwKLQkJCQkgICB1NjQgZmlsZV9zaXplLCBzdHJ1Y3QgcGVyZl9ldmVudF9vcHMgKm9wcykKKwkJCQkgICB1NjQgZmlsZV9zaXplLCBzdHJ1Y3QgcGVyZl90b29sICp0b29sKQogewogCXU2NCBoZWFkLCBwYWdlX29mZnNldCwgZmlsZV9vZmZzZXQsIGZpbGVfcG9zLCBwcm9ncmVzc19uZXh0OwogCWludCBlcnIsIG1tYXBfcHJvdCwgbW1hcF9mbGFncywgbWFwX2lkeCA9IDA7CkBAIC0xMDQzLDcgKzEwNzgsNyBAQAogCXVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50OwogCXVpbnQzMl90IHNpemU7CiAKLQlwZXJmX2V2ZW50X29wc19fZmlsbF9kZWZhdWx0cyhvcHMpOworCXBlcmZfdG9vbF9fZmlsbF9kZWZhdWx0cyh0b29sKTsKIAogCXBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKIApAQCAtMTA5OCw3ICsxMTMzLDcgQEAKIAlzaXplID0gZXZlbnQtPmhlYWRlci5zaXplOwogCiAJaWYgKHNpemUgPT0gMCB8fAotCSAgICBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnQoc2Vzc2lvbiwgZXZlbnQsIG9wcywgZmlsZV9wb3MpIDwgMCkgeworCSAgICBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnQoc2Vzc2lvbiwgZXZlbnQsIHRvb2wsIGZpbGVfcG9zKSA8IDApIHsKIAkJZHVtcF9wcmludGYoIiUjIiBQUkl4NjQgIiBbJSN4XTogc2tpcHBpbmcgdW5rbm93biBoZWFkZXIgdHlwZTogJWRcbiIsCiAJCQkgICAgZmlsZV9vZmZzZXQgKyBoZWFkLCBldmVudC0+aGVhZGVyLnNpemUsCiAJCQkgICAgZXZlbnQtPmhlYWRlci50eXBlKTsKQEAgLTExMjcsMTUgKzExNjIsMTUgQEAKIAllcnIgPSAwOwogCS8qIGRvIHRoZSBmaW5hbCBmbHVzaCBmb3Igb3JkZXJlZCBzYW1wbGVzICovCiAJc2Vzc2lvbi0+b3JkZXJlZF9zYW1wbGVzLm5leHRfZmx1c2ggPSBVTExPTkdfTUFYOwotCWZsdXNoX3NhbXBsZV9xdWV1ZShzZXNzaW9uLCBvcHMpOworCWZsdXNoX3NhbXBsZV9xdWV1ZShzZXNzaW9uLCB0b29sKTsKIG91dF9lcnI6Ci0JcGVyZl9zZXNzaW9uX193YXJuX2Fib3V0X2Vycm9ycyhzZXNzaW9uLCBvcHMpOworCXBlcmZfc2Vzc2lvbl9fd2Fybl9hYm91dF9lcnJvcnMoc2Vzc2lvbiwgdG9vbCk7CiAJcGVyZl9zZXNzaW9uX2ZyZWVfc2FtcGxlX2J1ZmZlcnMoc2Vzc2lvbik7CiAJcmV0dXJuIGVycjsKIH0KIAogaW50IHBlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiwKLQkJCQkgc3RydWN0IHBlcmZfZXZlbnRfb3BzICpvcHMpCisJCQkJIHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wpCiB7CiAJaW50IGVycjsKIApAQCAtMTE0Niw5ICsxMTgxLDkgQEAKIAkJZXJyID0gX19wZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHNlbGYsCiAJCQkJCQkgICAgIHNlbGYtPmhlYWRlci5kYXRhX29mZnNldCwKIAkJCQkJCSAgICAgc2VsZi0+aGVhZGVyLmRhdGFfc2l6ZSwKLQkJCQkJCSAgICAgc2VsZi0+c2l6ZSwgb3BzKTsKKwkJCQkJCSAgICAgc2VsZi0+c2l6ZSwgdG9vbCk7CiAJZWxzZQotCQllcnIgPSBfX3BlcmZfc2Vzc2lvbl9fcHJvY2Vzc19waXBlX2V2ZW50cyhzZWxmLCBvcHMpOworCQllcnIgPSBfX3BlcmZfc2Vzc2lvbl9fcHJvY2Vzc19waXBlX2V2ZW50cyhzZWxmLCB0b29sKTsKIAogCXJldHVybiBlcnI7CiB9CkBAIC0xMTYzLDkgKzExOTgsOCBAQAogCXJldHVybiB0cnVlOwogfQogCi1pbnQgcGVyZl9zZXNzaW9uX19zZXRfa2FsbHN5bXNfcmVmX3JlbG9jX3N5bShzdHJ1Y3QgbWFwICoqbWFwcywKLQkJCQkJICAgICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZSwKLQkJCQkJICAgICB1NjQgYWRkcikKK2ludCBtYXBzX19zZXRfa2FsbHN5bXNfcmVmX3JlbG9jX3N5bShzdHJ1Y3QgbWFwICoqbWFwcywKKwkJCQkgICAgIGNvbnN0IGNoYXIgKnN5bWJvbF9uYW1lLCB1NjQgYWRkcikKIHsKIAljaGFyICpicmFja2V0OwogCWVudW0gbWFwX3R5cGUgaTsKQEAgLTEyMjQsNiArMTI1OCwyNyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3NpemVfdCBwZXJmX3Nlc3Npb25fX2ZwcmludGYoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgRklMRSAqZnApCit7CisJLyoKKwkgKiBGSVhNRTogSGVyZSB3ZSBoYXZlIHRvIGFjdHVhbGx5IHByaW50IGFsbCB0aGUgbWFjaGluZXMgaW4gdGhpcworCSAqIHNlc3Npb24sIG5vdCBqdXN0IHRoZSBob3N0Li4uCisJICovCisJcmV0dXJuIG1hY2hpbmVfX2ZwcmludGYoJnNlc3Npb24tPmhvc3RfbWFjaGluZSwgZnApOworfQorCit2b2lkIHBlcmZfc2Vzc2lvbl9fcmVtb3ZlX3RocmVhZChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAorCQkJCSBzdHJ1Y3QgdGhyZWFkICp0aCkKK3sKKwkvKgorCSAqIEZJWE1FOiBUaGlzIG9uZSBtYWtlcyBubyBzZW5zZSwgd2UgbmVlZCB0byByZW1vdmUgdGhlIHRocmVhZCBmcm9tCisJICogdGhlIG1hY2hpbmUgaXQgYmVsb25ncyB0bywgcGVyZl9zZXNzaW9uIGNhbiBoYXZlIG1hbnkgbWFjaGluZXMsIHNvCisJICogZG9pbmcgaXQgYWx3YXlzIG9uIC0+aG9zdF9tYWNoaW5lIGlzIHdyb25nLiAgRml4IHdoZW4gYXVkaXRpbmcgYWxsCisJICogdGhlICdwZXJmIGt2bScgY29kZS4KKwkgKi8KKwltYWNoaW5lX19yZW1vdmVfdGhyZWFkKCZzZXNzaW9uLT5ob3N0X21hY2hpbmUsIHRoKTsKK30KKwogc3RydWN0IHBlcmZfZXZzZWwgKnBlcmZfc2Vzc2lvbl9fZmluZF9maXJzdF9ldnR5cGUoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKIAkJCQkJICAgICAgdW5zaWduZWQgaW50IHR5cGUpCiB7CkBAIC0xMjM2LDE3ICsxMjkxLDE2IEBACiAJcmV0dXJuIE5VTEw7CiB9CiAKLXZvaWQgcGVyZl9zZXNzaW9uX19wcmludF9pcCh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKLQkJCSAgICBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKLQkJCSAgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJICAgIGludCBwcmludF9zeW0sIGludCBwcmludF9kc28pCit2b2lkIHBlcmZfZXZlbnRfX3ByaW50X2lwKHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSwKKwkJCSAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIHN0cnVjdCBwZXJmX2V2c2VsICpldnNlbCwKKwkJCSAgaW50IHByaW50X3N5bSwgaW50IHByaW50X2RzbykKIHsKIAlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiBhbDsKIAljb25zdCBjaGFyICpzeW1uYW1lLCAqZHNvbmFtZTsKLQlzdHJ1Y3QgY2FsbGNoYWluX2N1cnNvciAqY3Vyc29yID0gJnNlc3Npb24tPmNhbGxjaGFpbl9jdXJzb3I7CisJc3RydWN0IGNhbGxjaGFpbl9jdXJzb3IgKmN1cnNvciA9ICZldnNlbC0+aGlzdHMuY2FsbGNoYWluX2N1cnNvcjsKIAlzdHJ1Y3QgY2FsbGNoYWluX2N1cnNvcl9ub2RlICpub2RlOwogCi0JaWYgKHBlcmZfZXZlbnRfX3ByZXByb2Nlc3Nfc2FtcGxlKGV2ZW50LCBzZXNzaW9uLCAmYWwsIHNhbXBsZSwKKwlpZiAocGVyZl9ldmVudF9fcHJlcHJvY2Vzc19zYW1wbGUoZXZlbnQsIG1hY2hpbmUsICZhbCwgc2FtcGxlLAogCQkJCQkgIE5VTEwpIDwgMCkgewogCQllcnJvcigicHJvYmxlbSBwcm9jZXNzaW5nICVkIGV2ZW50LCBza2lwcGluZyBpdC5cbiIsCiAJCQlldmVudC0+aGVhZGVyLnR5cGUpOwpAQCAtMTI1NSw3ICsxMzA5LDcgQEAKIAogCWlmIChzeW1ib2xfY29uZi51c2VfY2FsbGNoYWluICYmIHNhbXBsZS0+Y2FsbGNoYWluKSB7CiAKLQkJaWYgKHBlcmZfc2Vzc2lvbl9fcmVzb2x2ZV9jYWxsY2hhaW4oc2Vzc2lvbiwgYWwudGhyZWFkLAorCQlpZiAobWFjaGluZV9fcmVzb2x2ZV9jYWxsY2hhaW4obWFjaGluZSwgZXZzZWwsIGFsLnRocmVhZCwKIAkJCQkJCXNhbXBsZS0+Y2FsbGNoYWluLCBOVUxMKSAhPSAwKSB7CiAJCQlpZiAodmVyYm9zZSkKIAkJCQllcnJvcigiRmFpbGVkIHRvIHJlc29sdmUgY2FsbGNoYWluLiBTa2lwcGluZ1xuIik7CkBAIC0xMzMzLDYgKzEzODcsMTAgQEAKIAl9CiAKIAltYXAgPSBjcHVfbWFwX19uZXcoY3B1X2xpc3QpOworCWlmIChtYXAgPT0gTlVMTCkgeworCQlwcl9lcnIoIkludmFsaWQgY3B1X2xpc3RcbiIpOworCQlyZXR1cm4gLTE7CisJfQogCiAJZm9yIChpID0gMDsgaSA8IG1hcC0+bnI7IGkrKykgewogCQlpbnQgY3B1ID0gbWFwLT5tYXBbaV07CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5oIGIvdG9vbHMvcGVyZi91dGlsL3Nlc3Npb24uaAppbmRleCA2ZTM5M2M5Li4zN2JjMzgzIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc2Vzc2lvbi5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXNzaW9uLmgKQEAgLTMwLDkgKzMwLDYgQEAKIAlzdHJ1Y3QgcGVyZl9oZWFkZXIJaGVhZGVyOwogCXVuc2lnbmVkIGxvbmcJCXNpemU7CiAJdW5zaWduZWQgbG9uZwkJbW1hcF93aW5kb3c7Ci0Jc3RydWN0IHJiX3Jvb3QJCXRocmVhZHM7Ci0Jc3RydWN0IGxpc3RfaGVhZAlkZWFkX3RocmVhZHM7Ci0Jc3RydWN0IHRocmVhZAkJKmxhc3RfbWF0Y2g7CiAJc3RydWN0IG1hY2hpbmUJCWhvc3RfbWFjaGluZTsKIAlzdHJ1Y3QgcmJfcm9vdAkJbWFjaGluZXM7CiAJc3RydWN0IHBlcmZfZXZsaXN0CSpldmxpc3Q7CkBAIC01Myw2NSArNTAsMzEgQEAKIAlpbnQJCQljd2RsZW47CiAJY2hhcgkJCSpjd2Q7CiAJc3RydWN0IG9yZGVyZWRfc2FtcGxlcwlvcmRlcmVkX3NhbXBsZXM7Ci0Jc3RydWN0IGNhbGxjaGFpbl9jdXJzb3IJY2FsbGNoYWluX2N1cnNvcjsKLQljaGFyCQkJZmlsZW5hbWVbMF07CisJY2hhcgkJCWZpbGVuYW1lWzFdOwogfTsKIAotc3RydWN0IHBlcmZfZXZzZWw7Ci1zdHJ1Y3QgcGVyZl9ldmVudF9vcHM7Ci0KLXR5cGVkZWYgaW50ICgqZXZlbnRfc2FtcGxlKSh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCi0JCQkgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uKTsKLXR5cGVkZWYgaW50ICgqZXZlbnRfb3ApKHVuaW9uIHBlcmZfZXZlbnQgKnNlbGYsIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAotCQkJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci10eXBlZGVmIGludCAoKmV2ZW50X3N5bnRoX29wKSh1bmlvbiBwZXJmX2V2ZW50ICpzZWxmLAotCQkJICAgICAgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7Ci10eXBlZGVmIGludCAoKmV2ZW50X29wMikodW5pb24gcGVyZl9ldmVudCAqc2VsZiwgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwKLQkJCSBzdHJ1Y3QgcGVyZl9ldmVudF9vcHMgKm9wcyk7Ci0KLXN0cnVjdCBwZXJmX2V2ZW50X29wcyB7Ci0JZXZlbnRfc2FtcGxlCXNhbXBsZTsKLQlldmVudF9vcAltbWFwLAotCQkJY29tbSwKLQkJCWZvcmssCi0JCQlleGl0LAotCQkJbG9zdCwKLQkJCXJlYWQsCi0JCQl0aHJvdHRsZSwKLQkJCXVudGhyb3R0bGU7Ci0JZXZlbnRfc3ludGhfb3AJYXR0ciwKLQkJCWV2ZW50X3R5cGUsCi0JCQl0cmFjaW5nX2RhdGEsCi0JCQlidWlsZF9pZDsKLQlldmVudF9vcDIJZmluaXNoZWRfcm91bmQ7Ci0JYm9vbAkJb3JkZXJlZF9zYW1wbGVzOwotCWJvb2wJCW9yZGVyaW5nX3JlcXVpcmVzX3RpbWVzdGFtcHM7Ci19Oworc3RydWN0IHBlcmZfdG9vbDsKIAogc3RydWN0IHBlcmZfc2Vzc2lvbiAqcGVyZl9zZXNzaW9uX19uZXcoY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBtb2RlLAogCQkJCSAgICAgICBib29sIGZvcmNlLCBib29sIHJlcGlwZSwKLQkJCQkgICAgICAgc3RydWN0IHBlcmZfZXZlbnRfb3BzICpvcHMpOworCQkJCSAgICAgICBzdHJ1Y3QgcGVyZl90b29sICp0b29sKTsKIHZvaWQgcGVyZl9zZXNzaW9uX19kZWxldGUoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZik7CiAKIHZvaWQgcGVyZl9ldmVudF9oZWFkZXJfX2Jzd2FwKHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAqc2VsZik7CiAKIGludCBfX3BlcmZfc2Vzc2lvbl9fcHJvY2Vzc19ldmVudHMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiwKIAkJCQkgICB1NjQgZGF0YV9vZmZzZXQsIHU2NCBkYXRhX3NpemUsIHU2NCBzaXplLAotCQkJCSAgIHN0cnVjdCBwZXJmX2V2ZW50X29wcyAqb3BzKTsKKwkJCQkgICBzdHJ1Y3QgcGVyZl90b29sICp0b29sKTsKIGludCBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfZXZlbnRzKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYsCi0JCQkJIHN0cnVjdCBwZXJmX2V2ZW50X29wcyAqZXZlbnRfb3BzKTsKKwkJCQkgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCk7CiAKLWludCBwZXJmX3Nlc3Npb25fX3Jlc29sdmVfY2FsbGNoYWluKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYsCitpbnQgcGVyZl9zZXNzaW9uX19yZXNvbHZlX2NhbGxjaGFpbihzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmLCBzdHJ1Y3QgcGVyZl9ldnNlbCAqZXZzZWwsCiAJCQkJICAgIHN0cnVjdCB0aHJlYWQgKnRocmVhZCwKIAkJCQkgICAgc3RydWN0IGlwX2NhbGxjaGFpbiAqY2hhaW4sCiAJCQkJICAgIHN0cnVjdCBzeW1ib2wgKipwYXJlbnQpOwogCiBib29sIHBlcmZfc2Vzc2lvbl9faGFzX3RyYWNlcyhzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmLCBjb25zdCBjaGFyICptc2cpOwogCi1pbnQgcGVyZl9zZXNzaW9uX19zZXRfa2FsbHN5bXNfcmVmX3JlbG9jX3N5bShzdHJ1Y3QgbWFwICoqbWFwcywKLQkJCQkJICAgICBjb25zdCBjaGFyICpzeW1ib2xfbmFtZSwKLQkJCQkJICAgICB1NjQgYWRkcik7Ci0KIHZvaWQgbWVtX2Jzd2FwXzY0KHZvaWQgKnNyYywgaW50IGJ5dGVfc2l6ZSk7CiB2b2lkIHBlcmZfZXZlbnRfX2F0dHJfc3dhcChzdHJ1Y3QgcGVyZl9ldmVudF9hdHRyICphdHRyKTsKIApAQCAtMTQ0LDEyICsxMDcsMTYgQEAKIAogc3RhdGljIGlubGluZQogdm9pZCBwZXJmX3Nlc3Npb25fX3Byb2Nlc3NfbWFjaGluZXMoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiwKKwkJCQkgICAgc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwKIAkJCQkgICAgbWFjaGluZV9fcHJvY2Vzc190IHByb2Nlc3MpCiB7Ci0JcHJvY2Vzcygmc2VsZi0+aG9zdF9tYWNoaW5lLCBzZWxmKTsKLQlyZXR1cm4gbWFjaGluZXNfX3Byb2Nlc3MoJnNlbGYtPm1hY2hpbmVzLCBwcm9jZXNzLCBzZWxmKTsKKwlwcm9jZXNzKCZzZWxmLT5ob3N0X21hY2hpbmUsIHRvb2wpOworCXJldHVybiBtYWNoaW5lc19fcHJvY2Vzcygmc2VsZi0+bWFjaGluZXMsIHByb2Nlc3MsIHRvb2wpOwogfQogCitzdHJ1Y3QgdGhyZWFkICpwZXJmX3Nlc3Npb25fX2ZpbmRuZXcoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiwgcGlkX3QgcGlkKTsKK3NpemVfdCBwZXJmX3Nlc3Npb25fX2ZwcmludGYoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiwgRklMRSAqZnApOworCiBzaXplX3QgcGVyZl9zZXNzaW9uX19mcHJpbnRmX2Rzb3Moc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiwgRklMRSAqZnApOwogCiBzaXplX3QgcGVyZl9zZXNzaW9uX19mcHJpbnRmX2Rzb3NfYnVpbGRpZChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmLApAQCAtMTY3LDEzICsxMzQsMjAgQEAKIAkJCQkJc2Vzc2lvbi0+aGVhZGVyLm5lZWRzX3N3YXApOwogfQogCitzdGF0aWMgaW5saW5lIGludCBwZXJmX3Nlc3Npb25fX3N5bnRoZXNpemVfc2FtcGxlKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCisJCQkJCQkgIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJCQkJICBjb25zdCBzdHJ1Y3QgcGVyZl9zYW1wbGUgKnNhbXBsZSkKK3sKKwlyZXR1cm4gcGVyZl9ldmVudF9fc3ludGhlc2l6ZV9zYW1wbGUoZXZlbnQsIHNlc3Npb24tPnNhbXBsZV90eXBlLAorCQkJCQkgICAgIHNhbXBsZSwgc2Vzc2lvbi0+aGVhZGVyLm5lZWRzX3N3YXApOworfQorCiBzdHJ1Y3QgcGVyZl9ldnNlbCAqcGVyZl9zZXNzaW9uX19maW5kX2ZpcnN0X2V2dHlwZShzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAogCQkJCQkgICAgdW5zaWduZWQgaW50IHR5cGUpOwogCi12b2lkIHBlcmZfc2Vzc2lvbl9fcHJpbnRfaXAodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCi0JCQkJIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAotCQkJCSBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAotCQkJCSBpbnQgcHJpbnRfc3ltLCBpbnQgcHJpbnRfZHNvKTsKK3ZvaWQgcGVyZl9ldmVudF9fcHJpbnRfaXAodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsIHN0cnVjdCBwZXJmX3NhbXBsZSAqc2FtcGxlLAorCQkJICBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAorCQkJICBpbnQgcHJpbnRfc3ltLCBpbnQgcHJpbnRfZHNvKTsKIAogaW50IHBlcmZfc2Vzc2lvbl9fY3B1X2JpdG1hcChzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLAogCQkJICAgICBjb25zdCBjaGFyICpjcHVfbGlzdCwgdW5zaWduZWQgbG9uZyAqY3B1X2JpdG1hcCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2V0dXAucHkgYi90b29scy9wZXJmL3V0aWwvc2V0dXAucHkKaW5kZXggOTVkMzcwMC4uMzZkNGM1NiAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3NldHVwLnB5CisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zZXR1cC5weQpAQCAtMjcsNyArMjcsOCBAQAogcGVyZiA9IEV4dGVuc2lvbigncGVyZicsCiAJCSAgc291cmNlcyA9IFsndXRpbC9weXRob24uYycsICd1dGlsL2N0eXBlLmMnLCAndXRpbC9ldmxpc3QuYycsCiAJCQkgICAgICd1dGlsL2V2c2VsLmMnLCAndXRpbC9jcHVtYXAuYycsICd1dGlsL3RocmVhZF9tYXAuYycsCi0JCQkgICAgICd1dGlsL3V0aWwuYycsICd1dGlsL3h5YXJyYXkuYycsICd1dGlsL2Nncm91cC5jJ10sCisJCQkgICAgICd1dGlsL3V0aWwuYycsICd1dGlsL3h5YXJyYXkuYycsICd1dGlsL2Nncm91cC5jJywKKwkJCSAgICAgJ3V0aWwvZGVidWdmcy5jJ10sCiAJCSAgaW5jbHVkZV9kaXJzID0gWyd1dGlsL2luY2x1ZGUnXSwKIAkJICBleHRyYV9jb21waWxlX2FyZ3MgPSBjZmxhZ3MsCiAgICAgICAgICAgICAgICAgICkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYwppbmRleCA2MzJiNTBjLi4yMTVkNTBmIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCkBAIC0xNzU3LDcgKzE3NTcsNyBAQAogCQlzdHJ1Y3Qgc3RhdCBzdDsKIAogCQkvKnNzaGZzIG1pZ2h0IHJldHVybiBiYWQgZGVudC0+ZF90eXBlLCBzbyB3ZSBoYXZlIHRvIHN0YXQqLwotCQlzcHJpbnRmKHBhdGgsICIlcy8lcyIsIGRpcl9uYW1lLCBkZW50LT5kX25hbWUpOworCQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy8lcyIsIGRpcl9uYW1lLCBkZW50LT5kX25hbWUpOwogCQlpZiAoc3RhdChwYXRoLCAmc3QpKQogCQkJY29udGludWU7CiAKQEAgLTE3NjYsOCArMTc2Niw2IEBACiAJCQkgICAgIXN0cmNtcChkZW50LT5kX25hbWUsICIuLiIpKQogCQkJCWNvbnRpbnVlOwogCi0JCQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy8lcyIsCi0JCQkJIGRpcl9uYW1lLCBkZW50LT5kX25hbWUpOwogCQkJcmV0ID0gbWFwX2dyb3Vwc19fc2V0X21vZHVsZXNfcGF0aF9kaXIobWcsIHBhdGgpOwogCQkJaWYgKHJldCA8IDApCiAJCQkJZ290byBvdXQ7CkBAIC0xNzg4LDkgKzE3ODYsNiBAQAogCQkJaWYgKG1hcCA9PSBOVUxMKQogCQkJCWNvbnRpbnVlOwogCi0JCQlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICIlcy8lcyIsCi0JCQkJIGRpcl9uYW1lLCBkZW50LT5kX25hbWUpOwotCiAJCQlsb25nX25hbWUgPSBzdHJkdXAocGF0aCk7CiAJCQlpZiAobG9uZ19uYW1lID09IE5VTEwpIHsKIAkJCQlyZXQgPSAtMTsKQEAgLTI2MDksMTAgKzI2MDQsMTAgQEAKIAlzeW1ib2xfY29uZi5pbml0aWFsaXplZCA9IHRydWU7CiAJcmV0dXJuIDA7CiAKLW91dF9mcmVlX2Rzb19saXN0OgotCXN0cmxpc3RfX2RlbGV0ZShzeW1ib2xfY29uZi5kc29fbGlzdCk7CiBvdXRfZnJlZV9jb21tX2xpc3Q6CiAJc3RybGlzdF9fZGVsZXRlKHN5bWJvbF9jb25mLmNvbW1fbGlzdCk7CitvdXRfZnJlZV9kc29fbGlzdDoKKwlzdHJsaXN0X19kZWxldGUoc3ltYm9sX2NvbmYuZHNvX2xpc3QpOwogCXJldHVybiAtMTsKIH0KIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5oCmluZGV4IDI5ZjhkNzQuLjEyM2MyZTEgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaAorKysgYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKQEAgLTY4LDYgKzY4LDcgQEAKIAogc3RydWN0IHN5bWJvbF9jb25mIHsKIAl1bnNpZ25lZCBzaG9ydAlwcml2X3NpemU7CisJdW5zaWduZWQgc2hvcnQJbnJfZXZlbnRzOwogCWJvb2wJCXRyeV92bWxpbnV4X3BhdGgsCiAJCQl1c2VfbW9kdWxlcywKIAkJCXNvcnRfYnlfbmFtZSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuYyBiL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuYwppbmRleCBkNWQzYjIyLi5mYjRiN2VhIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdGhyZWFkLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5jCkBAIC02MSw3ICs2MSw3IEBACiAJICAgICAgIG1hcF9ncm91cHNfX2ZwcmludGYoJnNlbGYtPm1nLCB2ZXJib3NlLCBmcCk7CiB9CiAKLXN0cnVjdCB0aHJlYWQgKnBlcmZfc2Vzc2lvbl9fZmluZG5ldyhzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZWxmLCBwaWRfdCBwaWQpCitzdHJ1Y3QgdGhyZWFkICptYWNoaW5lX19maW5kbmV3X3RocmVhZChzdHJ1Y3QgbWFjaGluZSAqc2VsZiwgcGlkX3QgcGlkKQogewogCXN0cnVjdCByYl9ub2RlICoqcCA9ICZzZWxmLT50aHJlYWRzLnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CkBAIC0xMjUsMTIgKzEyNSwxMiBAQAogCXJldHVybiAwOwogfQogCi1zaXplX3QgcGVyZl9zZXNzaW9uX19mcHJpbnRmKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYsIEZJTEUgKmZwKQorc2l6ZV90IG1hY2hpbmVfX2ZwcmludGYoc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsIEZJTEUgKmZwKQogewogCXNpemVfdCByZXQgPSAwOwogCXN0cnVjdCByYl9ub2RlICpuZDsKIAotCWZvciAobmQgPSByYl9maXJzdCgmc2VsZi0+dGhyZWFkcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJZm9yIChuZCA9IHJiX2ZpcnN0KCZtYWNoaW5lLT50aHJlYWRzKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKIAkJc3RydWN0IHRocmVhZCAqcG9zID0gcmJfZW50cnkobmQsIHN0cnVjdCB0aHJlYWQsIHJiX25vZGUpOwogCiAJCXJldCArPSB0aHJlYWRfX2ZwcmludGYocG9zLCBmcCk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdGhyZWFkLmggYi90b29scy9wZXJmL3V0aWwvdGhyZWFkLmgKaW5kZXggZTVmMjQwMS4uNzBjMmMxMyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RocmVhZC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90aHJlYWQuaApAQCAtMTgsMTYgKzE4LDE0IEBACiAJaW50CQkJY29tbV9sZW47CiB9OwogCi1zdHJ1Y3QgcGVyZl9zZXNzaW9uOworc3RydWN0IG1hY2hpbmU7CiAKIHZvaWQgdGhyZWFkX19kZWxldGUoc3RydWN0IHRocmVhZCAqc2VsZik7CiAKIGludCB0aHJlYWRfX3NldF9jb21tKHN0cnVjdCB0aHJlYWQgKnNlbGYsIGNvbnN0IGNoYXIgKmNvbW0pOwogaW50IHRocmVhZF9fY29tbV9sZW4oc3RydWN0IHRocmVhZCAqc2VsZik7Ci1zdHJ1Y3QgdGhyZWFkICpwZXJmX3Nlc3Npb25fX2ZpbmRuZXcoc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2VsZiwgcGlkX3QgcGlkKTsKIHZvaWQgdGhyZWFkX19pbnNlcnRfbWFwKHN0cnVjdCB0aHJlYWQgKnNlbGYsIHN0cnVjdCBtYXAgKm1hcCk7CiBpbnQgdGhyZWFkX19mb3JrKHN0cnVjdCB0aHJlYWQgKnNlbGYsIHN0cnVjdCB0aHJlYWQgKnBhcmVudCk7Ci1zaXplX3QgcGVyZl9zZXNzaW9uX19mcHJpbnRmKHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlbGYsIEZJTEUgKmZwKTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgbWFwICp0aHJlYWRfX2ZpbmRfbWFwKHN0cnVjdCB0aHJlYWQgKnNlbGYsCiAJCQkJCSAgIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIpCkBAIC0zNSwxNCArMzMsMTIgQEAKIAlyZXR1cm4gc2VsZiA/IG1hcF9ncm91cHNfX2ZpbmQoJnNlbGYtPm1nLCB0eXBlLCBhZGRyKSA6IE5VTEw7CiB9CiAKLXZvaWQgdGhyZWFkX19maW5kX2FkZHJfbWFwKHN0cnVjdCB0aHJlYWQgKnNlbGYsCi0JCQkgICBzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uLCB1OCBjcHVtb2RlLAotCQkJICAgZW51bSBtYXBfdHlwZSB0eXBlLCBwaWRfdCBwaWQsIHU2NCBhZGRyLAordm9pZCB0aHJlYWRfX2ZpbmRfYWRkcl9tYXAoc3RydWN0IHRocmVhZCAqdGhyZWFkLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSwKKwkJCSAgIHU4IGNwdW1vZGUsIGVudW0gbWFwX3R5cGUgdHlwZSwgdTY0IGFkZHIsCiAJCQkgICBzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwpOwogCi12b2lkIHRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHN0cnVjdCB0aHJlYWQgKnNlbGYsCi0JCQkJc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbiwgdTggY3B1bW9kZSwKLQkJCQllbnVtIG1hcF90eXBlIHR5cGUsIHBpZF90IHBpZCwgdTY0IGFkZHIsCit2b2lkIHRocmVhZF9fZmluZF9hZGRyX2xvY2F0aW9uKHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCisJCQkJdTggY3B1bW9kZSwgZW51bSBtYXBfdHlwZSB0eXBlLCB1NjQgYWRkciwKIAkJCQlzdHJ1Y3QgYWRkcl9sb2NhdGlvbiAqYWwsCiAJCQkJc3ltYm9sX2ZpbHRlcl90IGZpbHRlcik7CiAjZW5kaWYJLyogX19QRVJGX1RIUkVBRF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdG9vbC5oIGIvdG9vbHMvcGVyZi91dGlsL3Rvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGUxYWFkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3Rvb2wuaApAQCAtMCwwICsxLDUwIEBACisjaWZuZGVmIF9fUEVSRl9UT09MX0gKKyNkZWZpbmUgX19QRVJGX1RPT0xfSAorCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCitzdHJ1Y3QgcGVyZl9zZXNzaW9uOwordW5pb24gcGVyZl9ldmVudDsKK3N0cnVjdCBwZXJmX2V2bGlzdDsKK3N0cnVjdCBwZXJmX2V2c2VsOworc3RydWN0IHBlcmZfc2FtcGxlOworc3RydWN0IHBlcmZfdG9vbDsKK3N0cnVjdCBtYWNoaW5lOworCit0eXBlZGVmIGludCAoKmV2ZW50X3NhbXBsZSkoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCisJCQkgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLCBzdHJ1Y3QgbWFjaGluZSAqbWFjaGluZSk7CisKK3R5cGVkZWYgaW50ICgqZXZlbnRfb3ApKHN0cnVjdCBwZXJmX3Rvb2wgKnRvb2wsIHVuaW9uIHBlcmZfZXZlbnQgKmV2ZW50LAorCQkJc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsIHN0cnVjdCBtYWNoaW5lICptYWNoaW5lKTsKKwordHlwZWRlZiBpbnQgKCpldmVudF9hdHRyX29wKSh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSAgICAgc3RydWN0IHBlcmZfZXZsaXN0ICoqcGV2bGlzdCk7Cit0eXBlZGVmIGludCAoKmV2ZW50X3NpbXBsZV9vcCkoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQpOworCit0eXBlZGVmIGludCAoKmV2ZW50X3N5bnRoX29wKSh1bmlvbiBwZXJmX2V2ZW50ICpldmVudCwKKwkJCSAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24pOworCit0eXBlZGVmIGludCAoKmV2ZW50X29wMikoc3RydWN0IHBlcmZfdG9vbCAqdG9vbCwgdW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCisJCQkgc3RydWN0IHBlcmZfc2Vzc2lvbiAqc2Vzc2lvbik7CisKK3N0cnVjdCBwZXJmX3Rvb2wgeworCWV2ZW50X3NhbXBsZQlzYW1wbGUsCisJCQlyZWFkOworCWV2ZW50X29wCW1tYXAsCisJCQljb21tLAorCQkJZm9yaywKKwkJCWV4aXQsCisJCQlsb3N0LAorCQkJdGhyb3R0bGUsCisJCQl1bnRocm90dGxlOworCWV2ZW50X2F0dHJfb3AJYXR0cjsKKwlldmVudF9zeW50aF9vcAl0cmFjaW5nX2RhdGE7CisJZXZlbnRfc2ltcGxlX29wCWV2ZW50X3R5cGU7CisJZXZlbnRfb3AyCWZpbmlzaGVkX3JvdW5kLAorCQkJYnVpbGRfaWQ7CisJYm9vbAkJb3JkZXJlZF9zYW1wbGVzOworCWJvb2wJCW9yZGVyaW5nX3JlcXVpcmVzX3RpbWVzdGFtcHM7Cit9OworCisjZW5kaWYgLyogX19QRVJGX1RPT0xfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RvcC5oIGIvdG9vbHMvcGVyZi91dGlsL3RvcC5oCmluZGV4IDM5OTY1MDkuLmEyNDhmM2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90b3AuaAorKysgYi90b29scy9wZXJmL3V0aWwvdG9wLmgKQEAgLTEsMTUgKzEsMTcgQEAKICNpZm5kZWYgX19QRVJGX1RPUF9ICiAjZGVmaW5lIF9fUEVSRl9UT1BfSCAxCiAKKyNpbmNsdWRlICJ0b29sLmgiCiAjaW5jbHVkZSAidHlwZXMuaCIKLSNpbmNsdWRlICIuLi9wZXJmLmgiCiAjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgogCiBzdHJ1Y3QgcGVyZl9ldmxpc3Q7CiBzdHJ1Y3QgcGVyZl9ldnNlbDsKIHN0cnVjdCBwZXJmX3Nlc3Npb247CiAKIHN0cnVjdCBwZXJmX3RvcCB7CisJc3RydWN0IHBlcmZfdG9vbCAgIHRvb2w7CiAJc3RydWN0IHBlcmZfZXZsaXN0ICpldmxpc3Q7CiAJLyoKIAkgKiBTeW1ib2xzIHdpbGwgYmUgYWRkZWQgaGVyZSBpbiBwZXJmX2V2ZW50X19wcm9jZXNzX3NhbXBsZSBhbmQgd2lsbApAQCAtMjMsMTAgKzI1LDI2IEBACiAJaW50CQkgICBmcmVxOwogCXBpZF90CQkgICB0YXJnZXRfcGlkLCB0YXJnZXRfdGlkOwogCWJvb2wJCSAgIGhpZGVfa2VybmVsX3N5bWJvbHMsIGhpZGVfdXNlcl9zeW1ib2xzLCB6ZXJvOworCWJvb2wJCSAgIHN5c3RlbV93aWRlOworCWJvb2wJCSAgIHVzZV90dWksIHVzZV9zdGRpbzsKKwlib29sCQkgICBzb3J0X2hhc19zeW1ib2xzOworCWJvb2wJCSAgIGRvbnRfdXNlX2NhbGxjaGFpbnM7CisJYm9vbAkJICAga3B0cl9yZXN0cmljdF93YXJuZWQ7CisJYm9vbAkJICAgdm1saW51eF93YXJuZWQ7CisJYm9vbAkJICAgaW5oZXJpdDsKKwlib29sCQkgICBncm91cDsKKwlib29sCQkgICBzYW1wbGVfaWRfYWxsX2F2YWlsOworCWJvb2wJCSAgIGR1bXBfc3ltdGFiOwogCWNvbnN0IGNoYXIJICAgKmNwdV9saXN0OwogCXN0cnVjdCBoaXN0X2VudHJ5ICAqc3ltX2ZpbHRlcl9lbnRyeTsKIAlzdHJ1Y3QgcGVyZl9ldnNlbCAgKnN5bV9ldnNlbDsKIAlzdHJ1Y3QgcGVyZl9zZXNzaW9uICpzZXNzaW9uOworCXN0cnVjdCB3aW5zaXplCSAgIHdpbnNpemU7CisJdW5zaWduZWQgaW50CSAgIG1tYXBfcGFnZXM7CisJaW50CQkgICBkZWZhdWx0X2ludGVydmFsOworCWludAkJICAgcmVhbHRpbWVfcHJpbzsKKwlpbnQJCSAgIHN5bV9wY250X2ZpbHRlcjsKKwljb25zdCBjaGFyCSAgICpzeW1fZmlsdGVyOwogfTsKIAogc2l6ZV90IHBlcmZfdG9wX19oZWFkZXJfc25wcmludGYoc3RydWN0IHBlcmZfdG9wICp0b3AsIGNoYXIgKmJmLCBzaXplX3Qgc2l6ZSk7CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtaW5mby5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LWluZm8uYwppbmRleCBkMjY1NWYwLi5hYzY4MzBkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtaW5mby5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1pbmZvLmMKQEAgLTE4LDcgKzE4LDggQEAKICAqCiAgKiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgogICovCi0jZGVmaW5lIF9HTlVfU09VUkNFCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlICJ1dGlsLmgiCiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8bW50ZW50Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTMxLDcgKzMyLDYgQEAKICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KQEAgLTQ0LDEwICs0NCw2IEBACiAKICNkZWZpbmUgVkVSU0lPTiAiMC41IgogCi0jZGVmaW5lIF9TVFIoeCkgI3gKLSNkZWZpbmUgU1RSKHgpIF9TVFIoeCkKLSNkZWZpbmUgTUFYX1BBVEggMjU2Ci0KICNkZWZpbmUgVFJBQ0VfQ1RSTAkidHJhY2luZ19vbiIKICNkZWZpbmUgVFJBQ0UJCSJ0cmFjZSIKICNkZWZpbmUgQVZBSUxBQkxFCSJhdmFpbGFibGVfdHJhY2VycyIKQEAgLTczLDI2ICs2OSw2IEBACiB9OwogCiAKLQotc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotCXZhX2xpc3QgYXA7Ci0JaW50IHJldCA9IGVycm5vOwotCi0JaWYgKGVycm5vKQotCQlwZXJyb3IoInBlcmYiKTsKLQllbHNlCi0JCXJldCA9IC0xOwotCi0JdmFfc3RhcnQoYXAsIGZtdCk7Ci0JZnByaW50ZihzdGRlcnIsICIgICIpOwotCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7Ci0JdmFfZW5kKGFwKTsKLQotCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKLQlleGl0KHJldCk7Ci19Ci0KIHZvaWQgKm1hbGxvY19vcl9kaWUodW5zaWduZWQgaW50IHNpemUpCiB7CiAJdm9pZCAqZGF0YTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1wYXJzZS5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKaW5kZXggMGE3ZWQ1Yi4uNmMxNjRkYyAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXBhcnNlLmMKQEAgLTE1MzcsNiArMTUzNyw4IEBACiAJZmllbGQgPSBtYWxsb2Nfb3JfZGllKHNpemVvZigqZmllbGQpKTsKIAogCXR5cGUgPSBwcm9jZXNzX2FyZyhldmVudCwgZmllbGQsICZ0b2tlbik7CisJd2hpbGUgKHR5cGUgPT0gRVZFTlRfT1ApCisJCXR5cGUgPSBwcm9jZXNzX29wKGV2ZW50LCBmaWVsZCwgJnRva2VuKTsKIAlpZiAodGVzdF90eXBlX3Rva2VuKHR5cGUsIHRva2VuLCBFVkVOVF9ERUxJTSwgIiwiKSkKIAkJZ290byBvdXRfZnJlZTsKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXNjcmlwdGluZy5jIGIvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LXNjcmlwdGluZy5jCmluZGV4IGM5ZGNiZWMuLmEzZmRmNTUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC90cmFjZS1ldmVudC1zY3JpcHRpbmcuYworKysgYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQtc2NyaXB0aW5nLmMKQEAgLTM5LDcgKzM5LDcgQEAKIHN0YXRpYyB2b2lkIHByb2Nlc3NfZXZlbnRfdW5zdXBwb3J0ZWQodW5pb24gcGVyZl9ldmVudCAqZXZlbnQgX191bnVzZWQsCiAJCQkJICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUgX191bnVzZWQsCiAJCQkJICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsIF9fdW51c2VkLAotCQkJCSAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24gX191bnVzZWQsCisJCQkJICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUgX191bnVzZWQsCiAJCQkJICAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkIF9fdW51c2VkKQogewogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3RyYWNlLWV2ZW50LmggYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQuaAppbmRleCBhODQxMDA4Li41OGFlMTRjIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQuaAorKysgYi90b29scy9wZXJmL3V0aWwvdHJhY2UtZXZlbnQuaApAQCAtMyw3ICszLDExIEBACiAKICNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSAicGFyc2UtZXZlbnRzLmgiCi0jaW5jbHVkZSAic2Vzc2lvbi5oIgorCitzdHJ1Y3QgbWFjaGluZTsKK3N0cnVjdCBwZXJmX3NhbXBsZTsKK3VuaW9uIHBlcmZfZXZlbnQ7CitzdHJ1Y3QgdGhyZWFkOwogCiAjZGVmaW5lIF9fdW51c2VkIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCiAKQEAgLTI5Miw3ICsyOTYsNyBAQAogCXZvaWQgKCpwcm9jZXNzX2V2ZW50KSAodW5pb24gcGVyZl9ldmVudCAqZXZlbnQsCiAJCQkgICAgICAgc3RydWN0IHBlcmZfc2FtcGxlICpzYW1wbGUsCiAJCQkgICAgICAgc3RydWN0IHBlcmZfZXZzZWwgKmV2c2VsLAotCQkJICAgICAgIHN0cnVjdCBwZXJmX3Nlc3Npb24gKnNlc3Npb24sCisJCQkgICAgICAgc3RydWN0IG1hY2hpbmUgKm1hY2hpbmUsCiAJCQkgICAgICAgc3RydWN0IHRocmVhZCAqdGhyZWFkKTsKIAlpbnQgKCpnZW5lcmF0ZV9zY3JpcHQpIChjb25zdCBjaGFyICpvdXRmaWxlKTsKIH07CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvYW5ub3RhdGUuYyBiL3Rvb2xzL3BlcmYvdXRpbC91aS9icm93c2Vycy9hbm5vdGF0ZS5jCmluZGV4IDA1NzU5MDUuLjI5NWE5YzkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3BlcmYvdXRpbC91aS9icm93c2Vycy9hbm5vdGF0ZS5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91aS9icm93c2Vycy9hbm5vdGF0ZS5jCkBAIC0yMjQsNyArMjI0LDcgQEAKIH0KIAogc3RhdGljIGludCBhbm5vdGF0ZV9icm93c2VyX19ydW4oc3RydWN0IGFubm90YXRlX2Jyb3dzZXIgKnNlbGYsIGludCBldmlkeCwKLQkJCQkgaW50IG5yX2V2ZW50cywgdm9pZCgqdGltZXIpKHZvaWQgKmFyZyksCisJCQkJIHZvaWQoKnRpbWVyKSh2b2lkICphcmcpLAogCQkJCSB2b2lkICphcmcsIGludCBkZWxheV9zZWNzKQogewogCXN0cnVjdCByYl9ub2RlICpuZCA9IE5VTEw7CkBAIC0zMjgsOCArMzI4LDcgQEAKIAkJCQlub3RlcyA9IHN5bWJvbF9fYW5ub3RhdGlvbih0YXJnZXQpOwogCQkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmbm90ZXMtPmxvY2spOwogCi0JCQkJaWYgKG5vdGVzLT5zcmMgPT0gTlVMTCAmJgotCQkJCSAgICBzeW1ib2xfX2FsbG9jX2hpc3QodGFyZ2V0LCBucl9ldmVudHMpIDwgMCkgeworCQkJCWlmIChub3Rlcy0+c3JjID09IE5VTEwgJiYgc3ltYm9sX19hbGxvY19oaXN0KHRhcmdldCkgPCAwKSB7CiAJCQkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZub3Rlcy0+bG9jayk7CiAJCQkJCXVpX193YXJuaW5nKCJOb3QgZW5vdWdoIG1lbW9yeSBmb3IgYW5ub3RhdGluZyAnJXMnIHN5bWJvbCFcbiIsCiAJCQkJCQkgICAgdGFyZ2V0LT5uYW1lKTsKQEAgLTMzNyw3ICszMzYsNyBAQAogCQkJCX0KIAogCQkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZub3Rlcy0+bG9jayk7Ci0JCQkJc3ltYm9sX190dWlfYW5ub3RhdGUodGFyZ2V0LCBtcy0+bWFwLCBldmlkeCwgbnJfZXZlbnRzLAorCQkJCXN5bWJvbF9fdHVpX2Fubm90YXRlKHRhcmdldCwgbXMtPm1hcCwgZXZpZHgsCiAJCQkJCQkgICAgIHRpbWVyLCBhcmcsIGRlbGF5X3NlY3MpOwogCQkJfQogCQkJY29udGludWU7CkBAIC0zNTgsMTUgKzM1NywxNSBAQAogCXJldHVybiBrZXk7CiB9CiAKLWludCBoaXN0X2VudHJ5X190dWlfYW5ub3RhdGUoc3RydWN0IGhpc3RfZW50cnkgKmhlLCBpbnQgZXZpZHgsIGludCBucl9ldmVudHMsCitpbnQgaGlzdF9lbnRyeV9fdHVpX2Fubm90YXRlKHN0cnVjdCBoaXN0X2VudHJ5ICpoZSwgaW50IGV2aWR4LAogCQkJICAgICB2b2lkKCp0aW1lcikodm9pZCAqYXJnKSwgdm9pZCAqYXJnLCBpbnQgZGVsYXlfc2VjcykKIHsKLQlyZXR1cm4gc3ltYm9sX190dWlfYW5ub3RhdGUoaGUtPm1zLnN5bSwgaGUtPm1zLm1hcCwgZXZpZHgsIG5yX2V2ZW50cywKKwlyZXR1cm4gc3ltYm9sX190dWlfYW5ub3RhdGUoaGUtPm1zLnN5bSwgaGUtPm1zLm1hcCwgZXZpZHgsCiAJCQkJICAgIHRpbWVyLCBhcmcsIGRlbGF5X3NlY3MpOwogfQogCiBpbnQgc3ltYm9sX190dWlfYW5ub3RhdGUoc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3QgbWFwICptYXAsIGludCBldmlkeCwKLQkJCSBpbnQgbnJfZXZlbnRzLCB2b2lkKCp0aW1lcikodm9pZCAqYXJnKSwgdm9pZCAqYXJnLAorCQkJIHZvaWQoKnRpbWVyKSh2b2lkICphcmcpLCB2b2lkICphcmcsCiAJCQkgaW50IGRlbGF5X3NlY3MpCiB7CiAJc3RydWN0IG9iamR1bXBfbGluZSAqcG9zLCAqbjsKQEAgLTQxOSw4ICs0MTgsNyBAQAogCWJyb3dzZXIuYi5ucl9lbnRyaWVzID0gYnJvd3Nlci5ucl9lbnRyaWVzOwogCWJyb3dzZXIuYi5lbnRyaWVzID0gJm5vdGVzLT5zcmMtPnNvdXJjZSwKIAlicm93c2VyLmIud2lkdGggKz0gMTg7IC8qIFBlcmNlbnRhZ2UgKi8KLQlyZXQgPSBhbm5vdGF0ZV9icm93c2VyX19ydW4oJmJyb3dzZXIsIGV2aWR4LCBucl9ldmVudHMsCi0JCQkJICAgIHRpbWVyLCBhcmcsIGRlbGF5X3NlY3MpOworCXJldCA9IGFubm90YXRlX2Jyb3dzZXJfX3J1bigmYnJvd3NlciwgZXZpZHgsIHRpbWVyLCBhcmcsIGRlbGF5X3NlY3MpOwogCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sICZub3Rlcy0+c3JjLT5zb3VyY2UsIG5vZGUpIHsKIAkJbGlzdF9kZWwoJnBvcy0+bm9kZSk7CiAJCW9iamR1bXBfbGluZV9fZnJlZShwb3MpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3VpL2Jyb3dzZXJzL2hpc3RzLmMgYi90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvaGlzdHMuYwppbmRleCBkMGM5NGI0Li4xMjEyYTM4IDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvaGlzdHMuYworKysgYi90b29scy9wZXJmL3V0aWwvdWkvYnJvd3NlcnMvaGlzdHMuYwpAQCAtMTAyMCw3ICsxMDIwLDcgQEAKIAkJCSAqIERvbid0IGxldCB0aGlzIGJlIGZyZWVkLCBzYXksIGJ5IGhpc3RzX19kZWNheV9lbnRyeS4KIAkJCSAqLwogCQkJaGUtPnVzZWQgPSB0cnVlOwotCQkJZXJyID0gaGlzdF9lbnRyeV9fdHVpX2Fubm90YXRlKGhlLCBldnNlbC0+aWR4LCBucl9ldmVudHMsCisJCQllcnIgPSBoaXN0X2VudHJ5X190dWlfYW5ub3RhdGUoaGUsIGV2c2VsLT5pZHgsCiAJCQkJCQkgICAgICAgdGltZXIsIGFyZywgZGVsYXlfc2Vjcyk7CiAJCQloZS0+dXNlZCA9IGZhbHNlOwogCQkJdWlfYnJvd3Nlcl9fdXBkYXRlX25yX2VudHJpZXMoJmJyb3dzZXItPmIsIGJyb3dzZXItPmhpc3RzLT5ucl9lbnRyaWVzKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91aS9wcm9ncmVzcy5jIGIvdG9vbHMvcGVyZi91dGlsL3VpL3Byb2dyZXNzLmMKaW5kZXggMjk1ZTM2Ni4uMTNhYTY0ZSAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VpL3Byb2dyZXNzLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3VpL3Byb2dyZXNzLmMKQEAgLTE0LDYgKzE0LDkgQEAKIAlpZiAodXNlX2Jyb3dzZXIgPD0gMCkKIAkJcmV0dXJuOwogCisJaWYgKHRvdGFsID09IDApCisJCXJldHVybjsKKwogCXVpX19yZWZyZXNoX2RpbWVuc2lvbnModHJ1ZSk7CiAJcHRocmVhZF9tdXRleF9sb2NrKCZ1aV9fbG9jayk7CiAJeSA9IFNMdHRfU2NyZWVuX1Jvd3MgLyAyIC0gMjsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC91c2FnZS5jIGIvdG9vbHMvcGVyZi91dGlsL3VzYWdlLmMKaW5kZXggZTE2YmY5YS4uZDc2ZDFjMCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3VzYWdlLmMKKysrIGIvdG9vbHMvcGVyZi91dGlsL3VzYWdlLmMKQEAgLTEsNSArMSw4IEBACiAvKgotICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKiB1c2FnZS5jCisgKgorICogVmFyaW91cyByZXBvcnRpbmcgcm91dGluZXMuCisgKiBPcmlnaW5hbGx5IGNvcGllZCBmcm9tIEdJVCBzb3VyY2UuCiAgKgogICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQogICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdXRpbC5oIGIvdG9vbHMvcGVyZi91dGlsL3V0aWwuaAppbmRleCAwMTI4OTA2Li4zN2JlMzRkIDEwMDY0NAotLS0gYS90b29scy9wZXJmL3V0aWwvdXRpbC5oCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKQEAgLTI0NSw0ICsyNDUsMTUgQEAKICNkZWZpbmUgX1NUUih4KSAjeAogI2RlZmluZSBTVFIoeCkgX1NUUih4KQogCisvKgorICogIERldGVybWluZSB3aGV0aGVyIHNvbWUgdmFsdWUgaXMgYSBwb3dlciBvZiB0d28sIHdoZXJlIHplcm8gaXMKKyAqICpub3QqIGNvbnNpZGVyZWQgYSBwb3dlciBvZiB0d28uCisgKi8KKworc3RhdGljIGlubGluZSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCitib29sIGlzX3Bvd2VyX29mXzIodW5zaWduZWQgbG9uZyBuKQoreworCXJldHVybiAobiAhPSAwICYmICgobiAmIChuIC0gMSkpID09IDApKTsKK30KKwogI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdmFsdWVzLmMgYi90b29scy9wZXJmL3V0aWwvdmFsdWVzLmMKaW5kZXggYmRkMzM0Ny4uNjk3YzhiNCAxMDA2NDQKLS0tIGEvdG9vbHMvcGVyZi91dGlsL3ZhbHVlcy5jCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC92YWx1ZXMuYwpAQCAtMzIsNiArMzIsNyBAQAogCiAJZm9yIChpID0gMDsgaSA8IHZhbHVlcy0+dGhyZWFkczsgaSsrKQogCQlmcmVlKHZhbHVlcy0+dmFsdWVbaV0pOworCWZyZWUodmFsdWVzLT52YWx1ZSk7CiAJZnJlZSh2YWx1ZXMtPnBpZCk7CiAJZnJlZSh2YWx1ZXMtPnRpZCk7CiAJZnJlZSh2YWx1ZXMtPmNvdW50ZXJyYXdpZCk7CmRpZmYgLS1naXQgYS92aXJ0L2t2bS9hc3NpZ25lZC1kZXYuYyBiL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jCmluZGV4IDNhZDA5MjUuLjc1OGUzYjMgMTAwNjQ0Ci0tLSBhL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jCisrKyBiL3ZpcnQva3ZtL2Fzc2lnbmVkLWRldi5jCkBAIC0xNyw2ICsxNyw4IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L25hbWVpLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlICJpcnEuaCIKIAogc3RhdGljIHN0cnVjdCBrdm1fYXNzaWduZWRfZGV2X2tlcm5lbCAqa3ZtX2ZpbmRfYXNzaWduZWRfZGV2KHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCkBAIC00ODAsMTIgKzQ4Miw3NiBAQAogCXJldHVybiByOwogfQogCisvKgorICogV2Ugd2FudCB0byB0ZXN0IHdoZXRoZXIgdGhlIGNhbGxlciBoYXMgYmVlbiBncmFudGVkIHBlcm1pc3Npb25zIHRvCisgKiB1c2UgdGhpcyBkZXZpY2UuICBUbyBiZSBhYmxlIHRvIGNvbmZpZ3VyZSBhbmQgY29udHJvbCB0aGUgZGV2aWNlLAorICogdGhlIHVzZXIgbmVlZHMgYWNjZXNzIHRvIFBDSSBjb25maWd1cmF0aW9uIHNwYWNlIGFuZCBCQVIgcmVzb3VyY2VzLgorICogVGhlc2UgYXJlIGFjY2Vzc2VkIHRocm91Z2ggUENJIHN5c2ZzLiAgUENJIGNvbmZpZyBzcGFjZSBpcyBvZnRlbgorICogcGFzc2VkIHRvIHRoZSBwcm9jZXNzIGNhbGxpbmcgdGhpcyBpb2N0bCB2aWEgZmlsZSBkZXNjcmlwdG9yLCBzbyB3ZQorICogY2FuJ3QgcmVseSBvbiBhY2Nlc3MgdG8gdGhhdCBmaWxlLiAgV2UgY2FuIGNoZWNrIGZvciBwZXJtaXNzaW9ucworICogb24gZWFjaCBvZiB0aGUgQkFSIHJlc291cmNlIGZpbGVzLCB3aGljaCBpcyBhIHByZXR0eSBjbGVhcgorICogaW5kaWNhdG9yIHRoYXQgdGhlIHVzZXIgaGFzIGJlZW4gZ3JhbnRlZCBhY2Nlc3MgdG8gdGhlIGRldmljZS4KKyAqLworc3RhdGljIGludCBwcm9iZV9zeXNmc19wZXJtaXNzaW9ucyhzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworI2lmZGVmIENPTkZJR19TWVNGUworCWludCBpOworCWJvb2wgYmFyX2ZvdW5kID0gZmFsc2U7CisKKwlmb3IgKGkgPSBQQ0lfU1REX1JFU09VUkNFUzsgaSA8PSBQQ0lfU1REX1JFU09VUkNFX0VORDsgaSsrKSB7CisJCWNoYXIgKmtwYXRoLCAqc3lzcGF0aDsKKwkJc3RydWN0IHBhdGggcGF0aDsKKwkJc3RydWN0IGlub2RlICppbm9kZTsKKwkJaW50IHI7CisKKwkJaWYgKCFwY2lfcmVzb3VyY2VfbGVuKGRldiwgaSkpCisJCQljb250aW51ZTsKKworCQlrcGF0aCA9IGtvYmplY3RfZ2V0X3BhdGgoJmRldi0+ZGV2LmtvYmosIEdGUF9LRVJORUwpOworCQlpZiAoIWtwYXRoKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogUGVyIHN5c2ZzLXJ1bGVzLCBzeXNmcyBpcyBhbHdheXMgYXQgL3N5cyAqLworCQlzeXNwYXRoID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICIvc3lzJXMvcmVzb3VyY2UlZCIsIGtwYXRoLCBpKTsKKwkJa2ZyZWUoa3BhdGgpOworCQlpZiAoIXN5c3BhdGgpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlyID0ga2Vybl9wYXRoKHN5c3BhdGgsIExPT0tVUF9GT0xMT1csICZwYXRoKTsKKwkJa2ZyZWUoc3lzcGF0aCk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisKKwkJaW5vZGUgPSBwYXRoLmRlbnRyeS0+ZF9pbm9kZTsKKworCQlyID0gaW5vZGVfcGVybWlzc2lvbihpbm9kZSwgTUFZX1JFQUQgfCBNQVlfV1JJVEUgfCBNQVlfQUNDRVNTKTsKKwkJcGF0aF9wdXQoJnBhdGgpOworCQlpZiAocikKKwkJCXJldHVybiByOworCisJCWJhcl9mb3VuZCA9IHRydWU7CisJfQorCisJLyogSWYgbm8gcmVzb3VyY2VzLCBwcm9iYWJseSBzb21ldGhpbmcgc3BlY2lhbCAqLworCWlmICghYmFyX2ZvdW5kKQorCQlyZXR1cm4gLUVQRVJNOworCisJcmV0dXJuIDA7CisjZWxzZQorCXJldHVybiAtRUlOVkFMOyAvKiBObyB3YXkgdG8gY29udHJvbCB0aGUgZGV2aWNlIHdpdGhvdXQgc3lzZnMgKi8KKyNlbmRpZgorfQorCiBzdGF0aWMgaW50IGt2bV92bV9pb2N0bF9hc3NpZ25fZGV2aWNlKHN0cnVjdCBrdm0gKmt2bSwKIAkJCQkgICAgICBzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX3BjaV9kZXYgKmFzc2lnbmVkX2RldikKIHsKIAlpbnQgciA9IDAsIGlkeDsKIAlzdHJ1Y3Qga3ZtX2Fzc2lnbmVkX2Rldl9rZXJuZWwgKm1hdGNoOwogCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJdTggaGVhZGVyX3R5cGU7CisKKwlpZiAoIShhc3NpZ25lZF9kZXYtPmZsYWdzICYgS1ZNX0RFVl9BU1NJR05fRU5BQkxFX0lPTU1VKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAltdXRleF9sb2NrKCZrdm0tPmxvY2spOwogCWlkeCA9IHNyY3VfcmVhZF9sb2NrKCZrdm0tPnNyY3UpOwpAQCAtNTEzLDYgKzU3OSwxOCBAQAogCQlyID0gLUVJTlZBTDsKIAkJZ290byBvdXRfZnJlZTsKIAl9CisKKwkvKiBEb24ndCBhbGxvdyBicmlkZ2VzIHRvIGJlIGFzc2lnbmVkICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSEVBREVSX1RZUEUsICZoZWFkZXJfdHlwZSk7CisJaWYgKChoZWFkZXJfdHlwZSAmIFBDSV9IRUFERVJfVFlQRSkgIT0gUENJX0hFQURFUl9UWVBFX05PUk1BTCkgeworCQlyID0gLUVQRVJNOworCQlnb3RvIG91dF9wdXQ7CisJfQorCisJciA9IHByb2JlX3N5c2ZzX3Blcm1pc3Npb25zKGRldik7CisJaWYgKHIpCisJCWdvdG8gb3V0X3B1dDsKKwogCWlmIChwY2lfZW5hYmxlX2RldmljZShkZXYpKSB7CiAJCXByaW50ayhLRVJOX0lORk8gIiVzOiBDb3VsZCBub3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIsIF9fZnVuY19fKTsKIAkJciA9IC1FQlVTWTsKQEAgLTU0NCwxNiArNjIyLDE0IEBACiAKIAlsaXN0X2FkZCgmbWF0Y2gtPmxpc3QsICZrdm0tPmFyY2guYXNzaWduZWRfZGV2X2hlYWQpOwogCi0JaWYgKGFzc2lnbmVkX2Rldi0+ZmxhZ3MgJiBLVk1fREVWX0FTU0lHTl9FTkFCTEVfSU9NTVUpIHsKLQkJaWYgKCFrdm0tPmFyY2guaW9tbXVfZG9tYWluKSB7Ci0JCQlyID0ga3ZtX2lvbW11X21hcF9ndWVzdChrdm0pOwotCQkJaWYgKHIpCi0JCQkJZ290byBvdXRfbGlzdF9kZWw7Ci0JCX0KLQkJciA9IGt2bV9hc3NpZ25fZGV2aWNlKGt2bSwgbWF0Y2gpOworCWlmICgha3ZtLT5hcmNoLmlvbW11X2RvbWFpbikgeworCQlyID0ga3ZtX2lvbW11X21hcF9ndWVzdChrdm0pOwogCQlpZiAocikKIAkJCWdvdG8gb3V0X2xpc3RfZGVsOwogCX0KKwlyID0ga3ZtX2Fzc2lnbl9kZXZpY2Uoa3ZtLCBtYXRjaCk7CisJaWYgKHIpCisJCWdvdG8gb3V0X2xpc3RfZGVsOwogCiBvdXQ6CiAJc3JjdV9yZWFkX3VubG9jaygma3ZtLT5zcmN1LCBpZHgpOwpAQCAtNTkzLDggKzY2OSw3IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCWlmIChtYXRjaC0+ZmxhZ3MgJiBLVk1fREVWX0FTU0lHTl9FTkFCTEVfSU9NTVUpCi0JCWt2bV9kZWFzc2lnbl9kZXZpY2Uoa3ZtLCBtYXRjaCk7CisJa3ZtX2RlYXNzaWduX2RldmljZShrdm0sIG1hdGNoKTsKIAogCWt2bV9mcmVlX2Fzc2lnbmVkX2RldmljZShrdm0sIG1hdGNoKTsKIAo=